diff --git a/LeanPool.lean b/LeanPool.lean index a2da06359d..489dd1ac3c 100644 --- a/LeanPool.lean +++ b/LeanPool.lean @@ -1621,6 +1621,1646 @@ public import LeanPool.Clawristotle.TorusIntegration public import LeanPool.Clawristotle.VMLInputDerive public import LeanPool.Clawristotle.VMLStructures public import LeanPool.Clawristotle.VelocityDecayInstance +public import LeanPool.CoarseGraining +public import LeanPool.CoarseGraining.Homogenization +public import LeanPool.CoarseGraining.Homogenization.Ambient +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Ambient.MatrixOrderBridge +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Besov +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Elementary +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapCaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapFull +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Averages +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Integrability +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Projections +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.WrapperComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDomination +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationFinite +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationQOne +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationTop +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactDual +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactFiniteBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Descendants +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.FullCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalMultiscale +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Structures +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclidean +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLp +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLpCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapScalarP +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization +public import LeanPool.CoarseGraining.Homogenization.Book +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.FieldSpaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.BesovPairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CircDomination +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.ClassicalInputsExact +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeNeumannCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.FiniteLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.ProjectionTests +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.FractionalSobolevVsBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.GradientToFunction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeConverse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeProjectionL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MeanSquareDeviation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NegativeBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NormScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.Poincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovSeminormLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.RadiusIteration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.CoeffRestriction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Interfaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Matrices +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.ParentTruncatedHomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Response +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Setup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrixDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixFieldDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimatesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DeterministicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Dilation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMuDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponseDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniquenessDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.AEEq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.InfinityOne +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Translation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationErrorDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtractionProofs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.ChangeExponentDiscount +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.OneCubeBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Series +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.SmallTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Infinity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Localization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Representatives +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.QuadraticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScalingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumannDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FinitePToLegacyQTwo +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonLocalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGraining +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAssemblyAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDescendantWsp +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingForcing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingNegativeAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingOneCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingPDE +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponseOrder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli.Interface +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliDilationTransport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Bridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.EnergySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.FinalBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Prefactors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSMonotonicity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSScalar +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Setup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.ZeroTraceValue +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScalarEnvelopes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZero +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBudgetEnvelopes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS.Monotonicity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliStandardScalar +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Infinity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Duality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.DualityPositivePairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.BoundaryGradient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Corrector +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.DirichletSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainderSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Neumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.FluxResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.GeneralCoarseGrainingL2TwoExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Inhomogeneous +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.Energy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Casts +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Transport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutionConstructors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.SobolevPublic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.AveragedTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Budgets +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Constructed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedObjects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.CoeffFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMinimizerFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Integrals +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.LipschitzBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.MuObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.PartitionAverageMomentHelpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.ScalarizationWitnesses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.MuLocalityGate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Observable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Source +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCanonicalMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageLowMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponsePartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceStationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Tails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAEBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAnnealedMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockResponseConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.AverageIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ConcentrationAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAveragesAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.IndependenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.LocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Apex +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Helpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuationsAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.CenteredAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Integrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.OnCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.RestrictionIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.EntryScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ExponentAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ShiftedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.SmallWidetildeEntry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.CenteredResponses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.Constants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.RootCoeff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.FluctuationBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.SmallTailTerm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.TwoExponentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.MomentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PointwiseSplits +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.LowerVariants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.PowIntegrable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessUpper +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Weights +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.Common +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.AdditivityDefects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CoarseAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CutoffOscillationUniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FinalRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.HighScaleAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LinearProductAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleExpectation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleTails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedWeakNormSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessDefectSquare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessResponseDefect +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ResponseMomentIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ScalarLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.SpecialVectors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormSquareIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.YoungRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.AnalyticInequalities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.CrossTerm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.Densities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.ParentRestriction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Averages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CanonicalFields +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CutoffOscillation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.DeterministicAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.EnergyDensities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.AEBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ExpectedRHSComparison +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptPointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.NormalizedCutoff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.PointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.RHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.YoungRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.FiveTermSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.LinearTerms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Identity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.WeightedChildren +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.EnergyDefect +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.LowScales +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.RawIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Splitting +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.SpecialVectorAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.BetaBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CenteredResponses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFluctuationInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.GoodScaleInputs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RHSCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RealAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ResponseMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ScaleErrors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.TauSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.RealAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.BudgetAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FinalAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.GeometricSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.MatrixVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.NormalizedBlocks +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.PartitionAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeMomentCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.QuadraticProbeBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedProbeMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedScalarVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarReduction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedImprovement +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.DilatedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedOneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.TwoStep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Uniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Final +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Iteration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Recurrence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.ScalarRecursion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FinalAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FluctuationSumEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageGeometric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceBudgetAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.WeightedGeometricSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Estimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ArbitraryIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ErrorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.MatrixTools +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.NormalizedStatements +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.TraceBudget +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Triangle +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedJLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairSelection +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsHigh +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentRows +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleEntrySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGap +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailJoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRawCrude +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailSelected +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadTailUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EllipticityFromMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentCompetition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteSupTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimateCompressed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyOptimized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorClosed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorLowerEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.KernelUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LimitNormalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedFiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMaxTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticityMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.MinimalScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.NormalizedResponseEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedGammaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedLocalizedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionThreshold +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomBand +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointSynchronized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitEllipticityMinimalExpLogSq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitJTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.WeightedExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.MatrixIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Properties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Structures +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.Helpers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.LowerImageNamespace +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.MainEqualities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.BasicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.IntegrabilityFamily +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairHalfAdmissible +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairStates +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.BlockEnergyFirstVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.Integrand +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.PairHalfScalar +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.ResponseJMuAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.VolumeAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.LawObservable +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.BlockSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseAveraged +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseCanonical +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.OriginCube +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaCoarsePosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaLeBCoarse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarInvAveraged +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarLeSigma +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarPosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.Identities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CanonicalCubeSet +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CoeffOperatorData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.RecoveryPackages +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuWellPosedness +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.DeterministicCoarseData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.MuGeVecDot +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Translate +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.CauchySchwarz +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.Integral +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.BasicVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.ConvexAverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Algebra +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Maximizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Homogeneity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Bracketing +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CoarseMatrices +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CompletedSquare +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OpenBoundedConvex +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OriginCube +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Response +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.VariationalProblems +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Deterministic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.ExplicitHeight +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.StandardSplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.ExplicitHeight +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Localized +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProductFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.LocalPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.OneCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Bounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Centered +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Vector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.VectorFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Averages +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.ExactRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Gradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.ExactRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.Flux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Cutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.SingleCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Split +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimateFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.NormalizedAndGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Height +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.FinalWrappers +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Specializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CorePositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Endpoints +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.Besov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.BufferedAlpha +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.LocalAlpha +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFronts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.Constructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.ConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.Factors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.BoundarySplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.BoundarySplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.CoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.PositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.BoundaryCanonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.InteriorCanonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.LocalPatchWeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Canonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.Canonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ConstantCoeff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Profiles +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.WeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliCutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliEnergyBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalGradientBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliSingleCubeToRaw +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.EnergyForm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.PrivateLemmas +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexComponent +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBV +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBVForce +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEstimates +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletHomogeneous +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletTail +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletWeakFluxScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantEnvelope +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSCorrections +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSScalarAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QOne +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.Conversions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.EnergyControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.HarmonicAndData +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AbsorbedErrors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.ComponentBoundsBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.DescendantsAverage +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.LocalizedEnergyForce +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Compatibility +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Constants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Correctors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.DepthWeightAlgebra +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Energy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.NoteStepAndConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalBaseBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalCorrector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Bounded +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Intrinsic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Stepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.DiscountNext +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.HarmonicStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalizedIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.NoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHSLocalRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradientExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidualExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingScale +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeHsRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeScaleTransport +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ConcreteAveraging +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKFullRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DirichletBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DiscreteConvolution +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ExactOverlapEuclideanRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KAveraging +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KFunctional +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapFluctuation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapGeometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapPoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionDerivatives +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionGeometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionWeights +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PublicTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardOverlapComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryGap +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighbor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighborCount +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionIncrementEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionResidual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSharpKernel +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionVector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSCoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2WeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityExponentLoss +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.Contracts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.CoordinateStandard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.SharpLoss +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.HarmonicApproximation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ChangeOfQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Series +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometric +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.GeometricOne +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Theta +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponentBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponents +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedGlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedRecurrences +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AveragedStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyPoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FluxStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FullStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalAbsorbed +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Bounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.HodgeZero +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo +public import LeanPool.CoarseGraining.Homogenization.Examples +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.DiracBridge +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.MField +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicConcreteComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicGeneralComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicSmoothComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.AKLLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.CarrierLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Geometry +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.HighContrast +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CarrierObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.ClampedObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CorePatchEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CutoffData +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinAE +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.MeasurableObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.PerCoreEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Recombination +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Resample +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Variance +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.VarianceFinal +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Averaging +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.GridCoverage +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Measurability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.IterationLemma +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Bounds +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Cutoff +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Identity +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Integrability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Pointwise +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.TestPair +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Median +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Representation +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Admissibility +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.DeGiorgiCore +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Iteration +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelRecursion +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.BadMaximal +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.BadMaximal.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Basic +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P2 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P3 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P4 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P2 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.AveragingUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.BlockVarianceBound +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.FixedPhaseUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Polarize +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ProbeMoment +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Projection +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.RpowOpt +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Scalar +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Internal +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Common +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.MaximizerAlgebra +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ResponseSpace +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ScalarMaximizers +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Theory +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Common +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Dirichlet +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Neumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Theory +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.ZeroDim +public import LeanPool.CoarseGraining.Homogenization.Meta +public import LeanPool.CoarseGraining.Homogenization.Meta.AxiomsAudit +public import LeanPool.CoarseGraining.Homogenization.Multiscale +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.FiniteAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionConvergence +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionLp +public import LeanPool.CoarseGraining.Homogenization.PDE +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicHilbert +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Probability +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Fin +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.ProdDecomp +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Transfer +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.TwoPoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Operations +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.LargeRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.SmallRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.FiniteSums +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.OneVariable +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.IndependentCopy +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.MomentCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Concentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.TailKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Calculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Parameters +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.TailAndLogControl +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettFunction +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.CenteredTruncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Corollaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ProductDifference +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ScalarBennett +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetrization +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices.SymmetricL2 +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Differentiation +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSet +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSupport +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Endomorphisms +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Probability.SeparableHilbertMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.Source +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.RegQuotientAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RegIntegralAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RescaledLaws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Scaling +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Semantics +public import LeanPool.CoarseGraining.Homogenization.Sobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Extension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionLines +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionMain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Fold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldExtensionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNormFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolevFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.LimitFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.OneDimIBP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.PeelFubini +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AffineAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CenteredCubeCalderonZygmundQTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Aggregation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Embedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12LocalPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12NormalizedPartition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicCovariance +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicGain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeNormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ClosedBallNormalizedL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.CubeTranslationFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletNeumannEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpArbitrary +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDataDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLpData +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionSequence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionStability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpW10pLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalStoppingFamily +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaIntegration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaLargeScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaParameters +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaStopping +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaTailControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliAssembly +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliSum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H10Adjoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H1CutoffIntegrationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientFirstGain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientGainIteration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientIterationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientOneDim +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientTwoDim +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorHessianRowTailTransfer +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalHarmonicReplacement +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalScaledDatumEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeakRestriction +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTailRestrict +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.EnergyDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.NeumannEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallScaleFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallTailAlgebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedHessianRowOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentHessianRowIdentification +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowCellH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionScalarWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarDivergenceGradientW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonGradientBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.SourceParentFiniteLpExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingEnergyTransfer +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingRadius +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.W10pWeakTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianRowL2Energy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakPoissonDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeightedLayerCake +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EnergyBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EuclideanNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OddReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionDivergenceRhs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionHessianRowFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionScalarFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.SolverEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.EuclideanNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.FoldedAndWeakScalar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockGlobalAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.ReflectedEqCellSlab +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Apex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffBoundaryError +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.DiffQuotientLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyHalf +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyIntegrand +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.FaceVanishCollar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.GradientAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianRestrictionSum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.IntegralIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Localizations +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.NeumannInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OpenInnerFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuotientHessianRiesz +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentEnergyFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentExactEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentOrthogonality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentPotential +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestWeakIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCoerciveDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothTestBoundEstimate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SqCutoffH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SummationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.WeakDerivativeTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.BesovEstimate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.DualTestNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.EndpointDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincareL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.ProjectedVectorPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.CubePairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockDecomposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockIntegrals +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Ball +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.OpenSet +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.CoerciveHilbert +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.RieszPowerMean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.SegmentChangeOfVariables +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.TimeCollapse +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.ConvexApproxTendsto +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCubeVectorNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.SmoothCase +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeDivergenceRescaling +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZFullNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalGradientMemLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ClassicalDualComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.AllDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKSeriesBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuumSampleClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.DiscreteKOverlapEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanHsMeasurability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.FullNormEquivalence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.KInfimum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.MeasurableRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapGagliardoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.PositiveDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.RootScaleControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.SeminormComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicSeries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ZeroDimensionalClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoLpBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanGagliardoCoordinateBridgeP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspDilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspExactOverlapFullControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLegacyCircComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLpMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspNegativeLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspPowerTwoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualBesovBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualFieldPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualNegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanFullComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpDisjointBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePDepthTriangle +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePFullCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePGlobalBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePHomogeneity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePOneDepthCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPDESplitting +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPoincareDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarPComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.JensenStep +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapCount +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.PairCapture +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.TailSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.LocalizedZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.ScaledPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NegativeSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalExact +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.SmoothCompactSupport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Approx +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.ChainRule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.H10Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.LevelSets +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.WeakGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Continuity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Convergence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.PointwiseBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivComp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvolutionLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.CubeVector +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.FiniteMeasureDowngrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalAffineLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalMollifierLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H10GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H1GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationWeakGradient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.WeakGradientClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroExtensionGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroTraceClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives public import LeanPool.CommonNeighbourConjecture public import LeanPool.CommonNeighbourConjecture.Examples.EveryBase.AbstractSeed public import LeanPool.CommonNeighbourConjecture.Examples.EveryBase.DeletedModule diff --git a/LeanPool/CoarseGraining.lean b/LeanPool/CoarseGraining.lean new file mode 100644 index 0000000000..b9ef5a7b4d --- /dev/null +++ b/LeanPool/CoarseGraining.lean @@ -0,0 +1,1615 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Ambient.MatrixOrderBridge +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Elementary +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapCaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapFull +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Averages +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Integrability +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Projections +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.WrapperComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDomination +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationFinite +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationQOne +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationTop +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactDual +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactFiniteBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Descendants +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.FullCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalMultiscale +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Structures +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclidean +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLp +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLpCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapScalarP +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization +public import LeanPool.CoarseGraining.Homogenization.Book +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.FieldSpaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.BesovPairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CircDomination +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.ClassicalInputsExact +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeNeumannCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.FiniteLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.ProjectionTests +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.FractionalSobolevVsBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.GradientToFunction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeConverse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeProjectionL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MeanSquareDeviation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NegativeBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NormScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.Poincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovSeminormLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.RadiusIteration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.CoeffRestriction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Interfaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Matrices +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.ParentTruncatedHomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Response +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Setup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrixDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixFieldDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimatesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DeterministicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Dilation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMuDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponseDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniquenessDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.AEEq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.InfinityOne +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Translation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationErrorDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtractionProofs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.ChangeExponentDiscount +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.OneCubeBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Series +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.SmallTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Infinity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Localization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Representatives +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.QuadraticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScalingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumannDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FinitePToLegacyQTwo +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonLocalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGraining +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAssemblyAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDescendantWsp +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingForcing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingNegativeAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingOneCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingPDE +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponseOrder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli.Interface +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliDilationTransport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Bridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.EnergySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.FinalBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Prefactors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSMonotonicity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSScalar +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Setup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.ZeroTraceValue +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScalarEnvelopes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZero +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBudgetEnvelopes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS.Monotonicity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliStandardScalar +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Infinity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Duality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.DualityPositivePairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.BoundaryGradient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Corrector +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.DirichletSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainderSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Neumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.FluxResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.GeneralCoarseGrainingL2TwoExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Inhomogeneous +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.Energy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Casts +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Transport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutionConstructors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.SobolevPublic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.AveragedTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Budgets +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Constructed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedObjects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.CoeffFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMinimizerFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Integrals +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.LipschitzBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.MuObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.PartitionAverageMomentHelpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.ScalarizationWitnesses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.MuLocalityGate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Observable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Source +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCanonicalMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageLowMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponsePartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceStationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Tails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAEBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAnnealedMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockResponseConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.AverageIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ConcentrationAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAveragesAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.IndependenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.LocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Apex +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Helpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuationsAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.CenteredAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Integrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.OnCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.RestrictionIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.EntryScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ExponentAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ShiftedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.SmallWidetildeEntry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.CenteredResponses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.Constants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.RootCoeff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.FluctuationBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.SmallTailTerm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.TwoExponentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.MomentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PointwiseSplits +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.LowerVariants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.PowIntegrable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessUpper +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Weights +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.Common +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.AdditivityDefects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CoarseAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CutoffOscillationUniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FinalRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.HighScaleAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LinearProductAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleExpectation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleTails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedWeakNormSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessDefectSquare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessResponseDefect +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ResponseMomentIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ScalarLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.SpecialVectors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormSquareIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.YoungRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.AnalyticInequalities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.CrossTerm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.Densities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.ParentRestriction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Averages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CanonicalFields +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CutoffOscillation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.DeterministicAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.EnergyDensities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.AEBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ExpectedRHSComparison +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptPointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.NormalizedCutoff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.PointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.RHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.YoungRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.FiveTermSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.LinearTerms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Identity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.WeightedChildren +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.EnergyDefect +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.LowScales +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.RawIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Splitting +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.SpecialVectorAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.BetaBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CenteredResponses +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFluctuationInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.GoodScaleInputs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RHSCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RealAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ResponseMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ScaleErrors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.TauSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.RealAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.BudgetAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FinalAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.GeometricSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.MatrixVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.NormalizedBlocks +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.PartitionAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeMomentCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.QuadraticProbeBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedProbeMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedScalarVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarReduction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedImprovement +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.DilatedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedOneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.TwoStep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Uniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Final +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Iteration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Recurrence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.ScalarRecursion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FinalAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FluctuationSumEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageGeometric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceBudgetAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.WeightedGeometricSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Estimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ArbitraryIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ErrorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.MatrixTools +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.NormalizedStatements +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.TraceBudget +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Triangle +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedJLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairSelection +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsHigh +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentRows +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleEntrySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGap +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailJoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRawCrude +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailSelected +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadTailUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EllipticityFromMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentCompetition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteSupTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimateCompressed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyOptimized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorClosed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorLowerEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.KernelUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LimitNormalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedFiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMaxTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticityMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.MinimalScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.NormalizedResponseEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedGammaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedLocalizedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionThreshold +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomBand +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointSynchronized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitEllipticityMinimalExpLogSq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitJTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.WeightedExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.MatrixIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Properties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Structures +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.Helpers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.LowerImageNamespace +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.MainEqualities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.BasicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.IntegrabilityFamily +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairHalfAdmissible +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairStates +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.BlockEnergyFirstVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.Integrand +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.PairHalfScalar +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.ResponseJMuAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.VolumeAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.LawObservable +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.BlockSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseAveraged +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseCanonical +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.OriginCube +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaCoarsePosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaLeBCoarse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarInvAveraged +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarLeSigma +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarPosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.Identities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CanonicalCubeSet +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CoeffOperatorData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.RecoveryPackages +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuWellPosedness +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.DeterministicCoarseData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.MuGeVecDot +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Translate +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.CauchySchwarz +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.Integral +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.BasicVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.ConvexAverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Algebra +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Maximizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Homogeneity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Bracketing +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CoarseMatrices +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CompletedSquare +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OpenBoundedConvex +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OriginCube +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Response +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.VariationalProblems +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.ExplicitHeight +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.StandardSplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.ExplicitHeight +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Localized +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProductFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.LocalPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.OneCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Bounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Centered +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Vector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.VectorFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Averages +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.ExactRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Gradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.ExactRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.Flux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Cutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.SingleCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Split +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimateFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.NormalizedAndGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Height +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.FinalWrappers +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Specializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CorePositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Endpoints +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.Besov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.BufferedAlpha +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.LocalAlpha +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFronts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.Constructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.ConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.Factors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.BoundarySplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.BoundarySplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.CoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.PositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.BoundaryCanonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.InteriorCanonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.LocalPatchWeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Canonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.Canonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ConstantCoeff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Profiles +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.WeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliCutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliEnergyBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalGradientBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliSingleCubeToRaw +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.EnergyForm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.PrivateLemmas +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexComponent +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBV +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBVForce +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEstimates +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletHomogeneous +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletTail +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletWeakFluxScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantEnvelope +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSCorrections +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSScalarAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QOne +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.Conversions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.EnergyControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.HarmonicAndData +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AbsorbedErrors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.ComponentBoundsBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.DescendantsAverage +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.LocalizedEnergyForce +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Compatibility +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Constants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Correctors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.DepthWeightAlgebra +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Energy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.NoteStepAndConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalBaseBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalCorrector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Bounded +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Intrinsic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Stepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.DiscountNext +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.HarmonicStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalizedIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.NoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHSLocalRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradientExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidualExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingScale +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeHsRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeScaleTransport +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ConcreteAveraging +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKFullRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DirichletBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DiscreteConvolution +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ExactOverlapEuclideanRegularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KAveraging +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KFunctional +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapFluctuation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapGeometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapPoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionDerivatives +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionGeometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionWeights +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PublicTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardOverlapComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryGap +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighbor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighborCount +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionIncrementEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionResidual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSharpKernel +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionVector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSCoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2WeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityExponentLoss +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.Contracts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.CoordinateStandard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.SharpLoss +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.HarmonicApproximation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ChangeOfQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Series +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometric +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.GeometricOne +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Theta +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponentBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponents +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedGlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedRecurrences +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AveragedStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyPoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FluxStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FullStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalAbsorbed +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Bounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.HodgeZero +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.DiracBridge +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.MField +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicConcreteComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicGeneralComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicSmoothComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.AKLLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.CarrierLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CarrierObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.ClampedObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CorePatchEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CutoffData +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinAE +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.MeasurableObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.PerCoreEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Recombination +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Resample +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Variance +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.VarianceFinal +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Averaging +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.GridCoverage +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Measurability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.IterationLemma +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Bounds +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Cutoff +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Identity +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Integrability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Pointwise +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.TestPair +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Median +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Representation +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Admissibility +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.DeGiorgiCore +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Iteration +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelRecursion +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.BadMaximal.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Basic +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P2 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P3 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P4 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P2 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.AveragingUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.BlockVarianceBound +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.FixedPhaseUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Polarize +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ProbeMoment +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Projection +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.RpowOpt +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Scalar +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Internal +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Common +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.MaximizerAlgebra +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ResponseSpace +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ScalarMaximizers +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Theory +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Common +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Dirichlet +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Neumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Theory +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.ZeroDim +public import LeanPool.CoarseGraining.Homogenization.Meta.AxiomsAudit +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.FiniteAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionConvergence +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionLp +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicHilbert +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Fin +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.ProdDecomp +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Transfer +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.TwoPoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Operations +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.LargeRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.SmallRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.FiniteSums +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.OneVariable +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.IndependentCopy +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.MomentCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Concentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.TailKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Calculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Parameters +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.TailAndLogControl +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettFunction +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.CenteredTruncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Corollaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ProductDifference +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ScalarBennett +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetrization +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices.SymmetricL2 +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Differentiation +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSet +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSupport +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Endomorphisms +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Probability.SeparableHilbertMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.RegQuotientAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RegIntegralAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RescaledLaws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Scaling +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Semantics +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Extension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionLines +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionMain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Fold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldExtensionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNormFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolevFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.LimitFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.OneDimIBP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.PeelFubini +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AffineAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CenteredCubeCalderonZygmundQTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Aggregation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Embedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12LocalPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12NormalizedPartition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicCovariance +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicGain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeNormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ClosedBallNormalizedL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.CubeTranslationFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletNeumannEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpArbitrary +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDataDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLpData +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionSequence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionStability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpW10pLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalStoppingFamily +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaIntegration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaLargeScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaParameters +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaStopping +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaTailControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliAssembly +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliSum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H10Adjoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H1CutoffIntegrationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientFirstGain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientGainIteration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientIterationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientOneDim +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientTwoDim +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorHessianRowTailTransfer +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalHarmonicReplacement +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalScaledDatumEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeakRestriction +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTailRestrict +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.EnergyDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.NeumannEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallScaleFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallTailAlgebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedHessianRowOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentHessianRowIdentification +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowCellH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionScalarWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarDivergenceGradientW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonGradientBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.SourceParentFiniteLpExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingEnergyTransfer +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingRadius +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.W10pWeakTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianRowL2Energy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakPoissonDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeightedLayerCake +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EnergyBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EuclideanNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OddReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionDivergenceRhs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionHessianRowFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionScalarFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.SolverEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.EuclideanNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.FoldedAndWeakScalar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockGlobalAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.ReflectedEqCellSlab +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Apex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffBoundaryError +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.DiffQuotientLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyHalf +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyIntegrand +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.FaceVanishCollar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.GradientAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianRestrictionSum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.IntegralIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Localizations +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.NeumannInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OpenInnerFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuotientHessianRiesz +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentEnergyFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentExactEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentOrthogonality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentPotential +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestWeakIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCoerciveDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothTestBoundEstimate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SqCutoffH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SummationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.WeakDerivativeTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.BesovEstimate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.DualTestNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.EndpointDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincareL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.ProjectedVectorPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.CubePairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockDecomposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockIntegrals +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Ball +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.OpenSet +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.CoerciveHilbert +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.RieszPowerMean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.SegmentChangeOfVariables +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.TimeCollapse +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.ConvexApproxTendsto +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCubeVectorNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.SmoothCase +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeDivergenceRescaling +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZFullNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalGradientMemLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ClassicalDualComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.AllDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKSeriesBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuumSampleClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.DiscreteKOverlapEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanHsMeasurability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.FullNormEquivalence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.KInfimum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.MeasurableRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapGagliardoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.PositiveDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.RootScaleControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.SeminormComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicSeries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ZeroDimensionalClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoLpBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanGagliardoCoordinateBridgeP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspDilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspExactOverlapFullControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLegacyCircComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLpMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspNegativeLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspPowerTwoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualBesovBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualFieldPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualNegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanFullComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpDisjointBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePDepthTriangle +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePFullCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePGlobalBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePHomogeneity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePOneDepthCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPDESplitting +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPoincareDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarPComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.JensenStep +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapCount +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.PairCapture +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.TailSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.LocalizedZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.ScaledPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NegativeSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalExact +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.SmoothCompactSupport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Approx +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.ChainRule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.H10Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.LevelSets +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.WeakGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Continuity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Convergence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.PointwiseBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivComp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvolutionLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.CubeVector +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.FiniteMeasureDowngrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalAffineLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalMollifierLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H10GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H1GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationWeakGradient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.WeakGradientClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroExtensionGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroTraceClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives + +/-! +# Coarse-graining theory for elliptic equations + +Source: url:https://github.com/scottnarmstrong/coarsegraining +Authors: Scott Armstrong, Tuomo Kuusi +Status: verified +Main declarations: `Homogenization.Book.MainResults.homogenizationComparison_uniformEllipticity`, `Homogenization.Book.MainResults.annealedConvergence_uniformEllipticity` +Tags: elliptic-pde, stochastic-homogenization, probability, functional-analysis +MSC: 35B27, 60H25 +-/ + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization.lean b/LeanPool/CoarseGraining/Homogenization.lean new file mode 100644 index 0000000000..fcea7b0908 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.FiniteAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionLp +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AffineAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.OpenSet +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicHilbert +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuWellPosedness +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.ConvexAverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.HodgeZero +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSet +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Endomorphisms +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Differentiation +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSupport +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Semantics +public import LeanPool.CoarseGraining.Homogenization.Probability.SeparableHilbertMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.IndependentCopy +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Probability.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Transfer + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MeanSquareDeviation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05 + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare +public import LeanPool.CoarseGraining.Homogenization.Book +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.FractionalSobolevVsBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Interfaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.SobolevPublic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedObjects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityBridge +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliEnergyBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliSingleCubeToRaw +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Compatibility +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Energy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHSLocalRecurrence +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.DiracBridge +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.MField +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicConcreteComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicGeneralComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicSmoothComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.CarrierLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.AKLLaw +public import LeanPool.CoarseGraining.Homogenization.Internal +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ClassicalDualComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.JensenStep +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapCount +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.PairCapture +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.TailSummation + +/-! # Homogenization -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient.lean b/LeanPool/CoarseGraining/Homogenization/Ambient.lean new file mode 100644 index 0000000000..22ccf039ab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Ambient.MatrixOrderBridge +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/Basic.lean new file mode 100644 index 0000000000..5735d1c78a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/Basic.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Ring.Finset +public import Mathlib.Data.Matrix.Basic +public import Mathlib.Data.Real.Basic +public import Mathlib.Tactic.Linarith +public import Mathlib.Tactic.Ring + +/-! # Basic -/ + +@[expose] public section + +open scoped BigOperators + +namespace Homogenization + +abbrev Vec (d : ℕ) := Fin d → ℝ + +abbrev Mat (d : ℕ) := Matrix (Fin d) (Fin d) ℝ + +abbrev BlockVec (d : ℕ) := Vec d × Vec d + +structure BlockMat (d : ℕ) where + upperLeft : Mat d + upperRight : Mat d + lowerLeft : Mat d + lowerRight : Mat d +deriving Inhabited + +def vecDot {d : ℕ} (x y : Vec d) : ℝ := + ∑ i, x i * y i + +def vecNormSq {d : ℕ} (x : Vec d) : ℝ := + vecDot x x + +theorem sq_vecDot_le_vecNormSq_mul_vecNormSq {d : ℕ} (x y : Vec d) : + vecDot x y ^ 2 ≤ vecNormSq x * vecNormSq y := by + simpa [vecDot, vecNormSq, pow_two] using + (Finset.sum_mul_sq_le_sq_mul_sq (s := Finset.univ) (f := x) (g := y)) + +theorem vecNormSq_nonneg {d : ℕ} (x : Vec d) : 0 ≤ vecNormSq x := by + unfold vecNormSq vecDot + refine Finset.sum_nonneg ?_ + intro i hi + nlinarith [sq_nonneg (x i)] + +theorem sq_apply_le_vecNormSq {d : ℕ} (x : Vec d) (i : Fin d) : + x i ^ (2 : ℕ) ≤ vecNormSq x := by + let f : Fin d → ℝ := fun j => x j * x j + have hsingle : + f i ≤ ∑ j, f j := by + exact Finset.single_le_sum + (fun j _ => by + dsimp [f] + nlinarith [sq_nonneg (x j)]) + (Finset.mem_univ i) + simpa [f, vecNormSq, vecDot, pow_two] using hsingle + +/-- A real Young inequality packaged for Cauchy-Schwarz consequences. -/ +theorem abs_le_add_halves_of_sq_le_mul {u A B : ℝ} + (hu_sq : u ^ 2 ≤ A * B) (hA : 0 ≤ A) (hB : 0 ≤ B) : + |u| ≤ A / 2 + B / 2 := by + have habsSq : |u| ^ 2 ≤ A * B := by + simpa [sq_abs] using hu_sq + have hsumSq : (2 * |u|) ^ 2 ≤ (A + B) ^ 2 := by + have h0 : 0 ≤ (A - B) ^ 2 := sq_nonneg _ + nlinarith [habsSq, h0] + have hsum_nonneg : 0 ≤ A + B := add_nonneg hA hB + have habs2u : 2 * |u| ≤ A + B := le_of_sq_le_sq hsumSq hsum_nonneg + linarith + +/-- Young's inequality for the Euclidean dot product on project vectors. -/ +theorem abs_vecDot_le_add_halves_vecNormSq {d : ℕ} (x y : Vec d) : + |vecDot x y| ≤ vecNormSq x / 2 + vecNormSq y / 2 := + abs_le_add_halves_of_sq_le_mul + (sq_vecDot_le_vecNormSq_mul_vecNormSq x y) + (vecNormSq_nonneg x) (vecNormSq_nonneg y) + +/-- Young's inequality for scalar-weighted Euclidean dot products. -/ +theorem abs_mul_mul_vecDot_le_add_halves_mul_sq_vecNormSq + {d : ℕ} (a b : ℝ) (x y : Vec d) : + |a * b * vecDot x y| ≤ + a ^ 2 * vecNormSq x / 2 + b ^ 2 * vecNormSq y / 2 := by + have hcs := sq_vecDot_le_vecNormSq_mul_vecNormSq x y + have hfactor_nonneg : 0 ≤ a ^ 2 * b ^ 2 := + mul_nonneg (sq_nonneg a) (sq_nonneg b) + have hmul : + a ^ 2 * b ^ 2 * vecDot x y ^ 2 ≤ + a ^ 2 * b ^ 2 * (vecNormSq x * vecNormSq y) := + mul_le_mul_of_nonneg_left hcs hfactor_nonneg + have hsq : + (a * b * vecDot x y) ^ 2 ≤ + (a ^ 2 * vecNormSq x) * (b ^ 2 * vecNormSq y) := by + nlinarith + exact abs_le_add_halves_of_sq_le_mul hsq + (mul_nonneg (sq_nonneg a) (vecNormSq_nonneg x)) + (mul_nonneg (sq_nonneg b) (vecNormSq_nonneg y)) + +theorem vecNormSq_eq_zero {d : ℕ} {x : Vec d} (h : vecNormSq x = 0) : x = 0 := by + funext i + let f : Fin d → ℝ := fun j => x j * x j + have hi_le : x i * x i ≤ vecNormSq x := by + unfold vecNormSq vecDot + have hsingle : f i ≤ ∑ j, f j := by + exact Finset.single_le_sum + (fun j _ => by nlinarith [sq_nonneg (x j)]) + (Finset.mem_univ i) + simpa [f] using hsingle + have hi_zero : x i * x i = 0 := by + nlinarith [hi_le, h] + have hsq : x i ^ 2 = 0 := by + simpa [pow_two] using hi_zero + exact sq_eq_zero_iff.mp hsq + +theorem vecNormSq_eq_zero_iff {d : ℕ} {x : Vec d} : vecNormSq x = 0 ↔ x = 0 := by + constructor + · exact vecNormSq_eq_zero + · intro hx + rw [hx] + simp [vecNormSq, vecDot] + +theorem vecNormSq_smul {d : ℕ} (c : ℝ) (x : Vec d) : + vecNormSq (c • x) = c ^ 2 * vecNormSq x := by + unfold vecNormSq vecDot + calc + ∑ i, (c • x) i * (c • x) i = ∑ i, c ^ 2 * (x i * x i) := by + congr with i + simp [pow_two] + ring + _ = c ^ 2 * ∑ i, x i * x i := by + symm + simpa using (Finset.mul_sum Finset.univ (fun i => x i * x i) (c ^ 2)) + _ = c ^ 2 * vecNormSq x := by + rfl + +theorem vecNormSq_add_le {d : ℕ} (x y : Vec d) : + vecNormSq (x + y) ≤ 2 * (vecNormSq x + vecNormSq y) := by + calc + vecNormSq (x + y) = ∑ i, (x i + y i) ^ 2 := by + simp [vecNormSq, vecDot, pow_two] + _ ≤ ∑ i, 2 * (x i ^ 2 + y i ^ 2) := by + refine Finset.sum_le_sum ?_ + intro i hi + nlinarith [sq_nonneg (x i - y i)] + _ = 2 * ∑ i, (x i ^ 2 + y i ^ 2) := by + symm + exact Finset.mul_sum Finset.univ (fun i => x i ^ 2 + y i ^ 2) 2 + _ = 2 * (∑ i, x i ^ 2 + ∑ i, y i ^ 2) := by + rw [Finset.sum_add_distrib] + _ = 2 * (vecNormSq x + vecNormSq y) := by + have hx : ∑ i, x i ^ 2 = ∑ i, x i * x i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [pow_two] + have hy : ∑ i, y i ^ 2 = ∑ i, y i * y i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [pow_two] + rw [hx, hy] + rfl + +/-- Four-term Cauchy estimate for the squared Euclidean norm. -/ +theorem vecNormSq_four_add_le {d : ℕ} (w x y z : Vec d) : + vecNormSq (w + x + y + z) ≤ + 4 * (vecNormSq w + vecNormSq x + vecNormSq y + vecNormSq z) := by + have hrewrite : w + x + y + z = (w + x) + (y + z) := by + ext i + simp + ring + calc + vecNormSq (w + x + y + z) + = vecNormSq ((w + x) + (y + z)) := by rw [hrewrite] + _ ≤ 2 * (vecNormSq (w + x) + vecNormSq (y + z)) := + vecNormSq_add_le (w + x) (y + z) + _ ≤ 4 * (vecNormSq w + vecNormSq x + vecNormSq y + vecNormSq z) := by + nlinarith [vecNormSq_add_le w x, vecNormSq_add_le y z] + +theorem vecNormSq_sub_le {d : ℕ} (x y : Vec d) : + vecNormSq (x - y) ≤ 2 * (vecNormSq x + vecNormSq y) := by + calc + vecNormSq (x - y) = ∑ i, (x i - y i) ^ 2 := by + simp [vecNormSq, vecDot, pow_two] + _ ≤ ∑ i, 2 * (x i ^ 2 + y i ^ 2) := by + refine Finset.sum_le_sum ?_ + intro i hi + nlinarith [sq_nonneg (x i + y i)] + _ = 2 * ∑ i, (x i ^ 2 + y i ^ 2) := by + symm + exact Finset.mul_sum Finset.univ (fun i => x i ^ 2 + y i ^ 2) 2 + _ = 2 * (∑ i, x i ^ 2 + ∑ i, y i ^ 2) := by + rw [Finset.sum_add_distrib] + _ = 2 * (vecNormSq x + vecNormSq y) := by + have hx : ∑ i, x i ^ 2 = ∑ i, x i * x i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [pow_two] + have hy : ∑ i, y i ^ 2 = ∑ i, y i * y i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [pow_two] + rw [hx, hy] + rfl + +def matVecMul {d : ℕ} (A : Mat d) (x : Vec d) : Vec d := + fun i => ∑ j, A i j * x j + +def matTranspose {d : ℕ} (A : Mat d) : Mat d := + Matrix.transpose A + +def blockVecDot {d : ℕ} (X Y : BlockVec d) : ℝ := + vecDot X.1 Y.1 + vecDot X.2 Y.2 + +def blockMatVecMul {d : ℕ} (A : BlockMat d) (X : BlockVec d) : BlockVec d := + ( matVecMul A.upperLeft X.1 + matVecMul A.upperRight X.2 + , matVecMul A.lowerLeft X.1 + matVecMul A.lowerRight X.2 ) + +@[simp] theorem blockMatVecMul_fst {d : ℕ} (A : BlockMat d) (p q : Vec d) : + (blockMatVecMul A (p, q)).1 = matVecMul A.upperLeft p + matVecMul A.upperRight q := + rfl + +@[simp] theorem blockMatVecMul_snd {d : ℕ} (A : BlockMat d) (p q : Vec d) : + (blockMatVecMul A (p, q)).2 = matVecMul A.lowerLeft p + matVecMul A.lowerRight q := + rfl + +noncomputable def symmPart {d : ℕ} (A : Mat d) : Mat d := + fun i j => (A i j + A j i) / 2 + +noncomputable def skewPart {d : ℕ} (A : Mat d) : Mat d := + fun i j => (A i j - A j i) / 2 + +theorem symmPart_eq_smul_add_transpose {d : ℕ} (A : Mat d) : + symmPart A = (1 / 2 : ℝ) • (A + matTranspose A) := by + ext i j + simp [symmPart, matTranspose] + ring + +theorem skewPart_eq_smul_sub_transpose {d : ℕ} (A : Mat d) : + skewPart A = (1 / 2 : ℝ) • (A - matTranspose A) := by + ext i j + simp [skewPart, matTranspose] + ring + +@[simp] theorem matTranspose_symmPart {d : ℕ} (A : Mat d) : + matTranspose (symmPart A) = symmPart A := by + ext i j + simp [symmPart, matTranspose, add_comm] + +@[simp] theorem matTranspose_skewPart {d : ℕ} (A : Mat d) : + matTranspose (skewPart A) = -skewPart A := by + ext i j + simp [skewPart, matTranspose] + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/BlockMatrix.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/BlockMatrix.lean new file mode 100644 index 0000000000..fe93aa575b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/BlockMatrix.lean @@ -0,0 +1,589 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Data.Matrix.Mul +public import Mathlib.LinearAlgebra.Matrix.NonsingularInverse +public import Mathlib.LinearAlgebra.Matrix.SesquilinearForm +public import Mathlib.LinearAlgebra.Matrix.Symmetric +public import Mathlib.Topology.Algebra.Module.FiniteDimension + +/-! # Block Matrix -/ + +@[expose] public section + +namespace Homogenization + +abbrev BlockCoord (d : ℕ) := Sum (Fin d) (Fin d) + +/-- File-level typeclass cache for `Nonempty (BlockCoord d)`. -/ +private instance instNonemptyBlockCoord (d : ℕ) [NeZero d] : + Nonempty (BlockCoord d) := inferInstance + +abbrev FullBlockVec (d : ℕ) := BlockCoord d → ℝ + +abbrev FullBlockMat (d : ℕ) := Matrix (BlockCoord d) (BlockCoord d) ℝ + +def toFullBlockVec {d : ℕ} (X : BlockVec d) : FullBlockVec d + | Sum.inl i => X.1 i + | Sum.inr i => X.2 i + +def ofFullBlockVec {d : ℕ} (x : FullBlockVec d) : BlockVec d := + (fun i => x (Sum.inl i), fun i => x (Sum.inr i)) + +def toFullBlockMat {d : ℕ} (A : BlockMat d) : FullBlockMat d + | Sum.inl i, Sum.inl j => A.upperLeft i j + | Sum.inl i, Sum.inr j => A.upperRight i j + | Sum.inr i, Sum.inl j => A.lowerLeft i j + | Sum.inr i, Sum.inr j => A.lowerRight i j + +def ofFullBlockMat {d : ℕ} (M : FullBlockMat d) : BlockMat d := + { upperLeft := fun i j => M (Sum.inl i) (Sum.inl j) + upperRight := fun i j => M (Sum.inl i) (Sum.inr j) + lowerLeft := fun i j => M (Sum.inr i) (Sum.inl j) + lowerRight := fun i j => M (Sum.inr i) (Sum.inr j) } + +def blockMatEntry {d : ℕ} (A : BlockMat d) : BlockCoord d → BlockCoord d → ℝ + | Sum.inl i, Sum.inl j => A.upperLeft i j + | Sum.inl i, Sum.inr j => A.upperRight i j + | Sum.inr i, Sum.inl j => A.lowerLeft i j + | Sum.inr i, Sum.inr j => A.lowerRight i j + +def blockBasis {d : ℕ} : BlockCoord d → BlockVec d + | Sum.inl i => (Pi.single i 1, 0) + | Sum.inr i => (0, Pi.single i 1) + +def IsSymmetricBlockMat {d : ℕ} (A : BlockMat d) : Prop := + ∀ α β : BlockCoord d, blockMatEntry A α β = blockMatEntry A β α + +@[simp] theorem toFullBlockVec_ofFullBlockVec {d : ℕ} (x : FullBlockVec d) : + toFullBlockVec (ofFullBlockVec x) = x := by + funext α + cases α <;> rfl + +@[simp] theorem ofFullBlockVec_toFullBlockVec {d : ℕ} (X : BlockVec d) : + ofFullBlockVec (toFullBlockVec X) = X := by + cases X + rfl + +@[simp] theorem ofFullBlockVec_add {d : ℕ} (x y : FullBlockVec d) : + ofFullBlockVec (x + y) = ofFullBlockVec x + ofFullBlockVec y := by + rfl + +@[simp] theorem ofFullBlockVec_smul {d : ℕ} (c : ℝ) (x : FullBlockVec d) : + ofFullBlockVec (c • x) = c • ofFullBlockVec x := by + rfl + +@[simp] theorem toFullBlockMat_ofFullBlockMat {d : ℕ} (M : FullBlockMat d) : + toFullBlockMat (ofFullBlockMat M) = M := by + ext α β + cases α <;> cases β <;> rfl + +@[simp] theorem ofFullBlockMat_toFullBlockMat {d : ℕ} (A : BlockMat d) : + ofFullBlockMat (toFullBlockMat A) = A := by + cases A + rfl + +@[simp] theorem blockMatEntry_ofFullBlockMat {d : ℕ} (M : FullBlockMat d) + (α β : BlockCoord d) : + blockMatEntry (ofFullBlockMat M) α β = M α β := by + cases α <;> cases β <;> rfl + +theorem dotProduct_toFullBlockVec {d : ℕ} (X Y : BlockVec d) : + dotProduct (toFullBlockVec X) (toFullBlockVec Y) = blockVecDot X Y := by + rw [dotProduct, Fintype.sum_sum_type] + simp [toFullBlockVec, blockVecDot, vecDot] + +theorem toFullBlockVec_blockMatVecMul {d : ℕ} (A : BlockMat d) (X : BlockVec d) : + toFullBlockVec (blockMatVecMul A X) = Matrix.mulVec (toFullBlockMat A) (toFullBlockVec X) := by + funext α + cases α with + | inl i => + rw [Matrix.mulVec, dotProduct, Fintype.sum_sum_type] + simp [toFullBlockVec, blockMatVecMul, toFullBlockMat, matVecMul] + | inr i => + rw [Matrix.mulVec, dotProduct, Fintype.sum_sum_type] + simp [toFullBlockVec, blockMatVecMul, toFullBlockMat, matVecMul] + +theorem blockVecDot_blockMatVecMul_eq_toLinearMap₂' {d : ℕ} + (A : BlockMat d) (X Y : BlockVec d) : + blockVecDot X (blockMatVecMul A Y) = + Matrix.toLinearMap₂' ℝ (toFullBlockMat A) (toFullBlockVec X) (toFullBlockVec Y) := by + rw [Matrix.toLinearMap₂'_apply'] + rw [← dotProduct_toFullBlockVec X (blockMatVecMul A Y)] + rw [toFullBlockVec_blockMatVecMul] + +theorem isSymmetricBlockMat_of_isSymm {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) : + IsSymmetricBlockMat (ofFullBlockMat M) := by + intro α β + simpa using (hM.apply α β).symm + +theorem isSymmetricBlockMat_ofFullBlockMat_sub {d : ℕ} {A B : BlockMat d} + (hA : IsSymmetricBlockMat A) (hB : IsSymmetricBlockMat B) : + IsSymmetricBlockMat (ofFullBlockMat (toFullBlockMat A - toFullBlockMat B)) := by + intro α β + have hA' := hA α β + have hB' := hB α β + cases α <;> cases β <;> + simp [blockMatEntry, ofFullBlockMat, toFullBlockMat] at hA' hB' ⊢ <;> + linarith + +theorem vecDot_single_left {d : ℕ} (i : Fin d) (y : Vec d) : + vecDot (Pi.single i 1) y = y i := by + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + +theorem vecDot_single_right {d : ℕ} (x : Vec d) (i : Fin d) : + vecDot x (Pi.single i 1) = x i := by + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + +theorem matVecMul_single {d : ℕ} (A : Mat d) (j : Fin d) : + matVecMul A (Pi.single j 1) = fun i => A i j := by + funext i + rw [matVecMul, Finset.sum_eq_single j] + · simp + · intro k _ hk + simp [Pi.single_eq_of_ne hk] + · simp + +theorem matVecMul_zero {d : ℕ} (A : Mat d) : + matVecMul A 0 = 0 := by + funext i + simp [matVecMul] + +theorem add_matVecMul {d : ℕ} (A B : Mat d) (x : Vec d) : + matVecMul (A + B) x = matVecMul A x + matVecMul B x := by + funext i + simp [matVecMul, Finset.sum_add_distrib, add_mul] + +theorem smul_matVecMul {d : ℕ} (c : ℝ) (A : Mat d) (x : Vec d) : + matVecMul (c • A) x = c • matVecMul A x := by + funext i + calc + matVecMul (c • A) x i = ∑ j, c * (A i j * x j) := by + simp [matVecMul, mul_assoc] + _ = c * ∑ j, A i j * x j := by + symm + simpa using (Finset.mul_sum Finset.univ (fun j => A i j * x j) c) + _ = (c • matVecMul A x) i := by + simp [matVecMul] + +theorem neg_matVecMul {d : ℕ} (A : Mat d) (x : Vec d) : + matVecMul (-A) x = -matVecMul A x := by + simpa using smul_matVecMul (-1) A x + +theorem sub_matVecMul {d : ℕ} (A B : Mat d) (x : Vec d) : + matVecMul (A - B) x = matVecMul A x - matVecMul B x := by + rw [sub_eq_add_neg, add_matVecMul, neg_matVecMul, sub_eq_add_neg] + +theorem vecDot_zero_left {d : ℕ} (y : Vec d) : + vecDot 0 y = 0 := by + simp [vecDot] + +theorem vecDot_zero_right {d : ℕ} (x : Vec d) : + vecDot x 0 = 0 := by + simp [vecDot] + +theorem vecDot_comm {d : ℕ} (x y : Vec d) : + vecDot x y = vecDot y x := by + simp [vecDot, mul_comm] + +theorem matVecMul_add {d : ℕ} (A : Mat d) (x y : Vec d) : + matVecMul A (x + y) = matVecMul A x + matVecMul A y := by + funext i + simp [matVecMul, Finset.sum_add_distrib, mul_add] + +theorem matVecMul_smul {d : ℕ} (A : Mat d) (c : ℝ) (x : Vec d) : + matVecMul A (c • x) = c • matVecMul A x := by + funext i + simp [matVecMul, Finset.mul_sum, mul_left_comm] + +theorem matVecMul_neg {d : ℕ} (A : Mat d) (x : Vec d) : + matVecMul A (-x) = -matVecMul A x := by + simpa using matVecMul_smul A (-1) x + +theorem matVecMul_mul {d : ℕ} (A B : Mat d) (x : Vec d) : + matVecMul A (matVecMul B x) = matVecMul (A * B) x := by + change A.mulVec (B.mulVec x) = (A * B).mulVec x + exact Matrix.mulVec_mulVec x A B + +theorem vecDot_add_left {d : ℕ} (x y z : Vec d) : + vecDot (x + y) z = vecDot x z + vecDot y z := by + simp [vecDot, Finset.sum_add_distrib, add_mul] + +theorem vecDot_add_right {d : ℕ} (x y z : Vec d) : + vecDot x (y + z) = vecDot x y + vecDot x z := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + +theorem vecDot_smul_left {d : ℕ} (c : ℝ) (x y : Vec d) : + vecDot (c • x) y = c * vecDot x y := by + calc + vecDot (c • x) y = ∑ i, c * (x i * y i) := by + simp [vecDot, mul_assoc] + _ = c * ∑ i, x i * y i := by + symm + simpa using (Finset.mul_sum Finset.univ (fun i => x i * y i) c) + _ = c * vecDot x y := by + rfl + +theorem vecDot_smul_right {d : ℕ} (x y : Vec d) (c : ℝ) : + vecDot x (c • y) = c * vecDot x y := by + calc + vecDot x (c • y) = ∑ i, c * (x i * y i) := by + simp [vecDot, mul_left_comm] + _ = c * ∑ i, x i * y i := by + symm + simpa using (Finset.mul_sum Finset.univ (fun i => x i * y i) c) + _ = c * vecDot x y := by + rfl + +theorem vecDot_neg_left {d : ℕ} (x y : Vec d) : + vecDot (-x) y = -vecDot x y := by + simpa using vecDot_smul_left (-1) x y + +theorem vecDot_neg_right {d : ℕ} (x y : Vec d) : + vecDot x (-y) = -vecDot x y := by + simpa using vecDot_smul_right x y (-1) + +theorem vecDot_matVecMul_transpose {d : ℕ} (x y : Vec d) (A : Mat d) : + vecDot x (matVecMul (matTranspose A) y) = vecDot (matVecMul A x) y := by + calc + vecDot x (matVecMul (matTranspose A) y) + = ∑ i, ∑ j, x i * (A j i * y j) := by + unfold vecDot matVecMul matTranspose + congr with i + rw [Finset.mul_sum] + simp [Matrix.transpose_apply] + _ = ∑ j, ∑ i, (A j i * x i) * y j := by + rw [Finset.sum_comm] + congr with j + congr with i + ring + _ = ∑ j, (∑ i, A j i * x i) * y j := by + congr with j + exact (Finset.sum_mul Finset.univ (fun i => A j i * x i) (y j)).symm + _ = vecDot (matVecMul A x) y := by + rfl + +theorem transpose_mul_symm_mul_isSymm {d : ℕ} (K S : Mat d) + (hS : S.IsSymm) : + (((matTranspose K) * S * K)).IsSymm := by + unfold Matrix.IsSymm + simpa [matTranspose, Matrix.transpose_mul, Matrix.mul_assoc] using + congrArg (fun M => (matTranspose K) * M * K) hS + +theorem isUnit_det_smul {d : ℕ} {A : Mat d} (hdet : IsUnit A.det) + {c : ℝ} (hc : c ≠ 0) : + IsUnit (c • A).det := by + rw [Matrix.det_smul] + exact isUnit_iff_ne_zero.mpr <| + mul_ne_zero (pow_ne_zero _ hc) (isUnit_iff_ne_zero.mp hdet) + +theorem nonsing_inv_smul {d : ℕ} {A : Mat d} (c : ℝ) (hc : c ≠ 0) + (hdet : IsUnit A.det) : + (c • A)⁻¹ = c⁻¹ • A⁻¹ := by + let : Invertible c := invertibleOfNonzero hc + simpa using (Matrix.inv_smul (A := A) c hdet) + +theorem basis_sum_pairing {d : ℕ} (M : Mat d) (i j : Fin d) : + vecDot (Pi.single i 1 + Pi.single j 1) + (matVecMul M (Pi.single i 1 + Pi.single j 1)) = + M i i + M i j + M j i + M j j := by + calc + vecDot (Pi.single i 1 + Pi.single j 1) (matVecMul M (Pi.single i 1 + Pi.single j 1)) + = vecDot (Pi.single i 1 + Pi.single j 1) + (matVecMul M (Pi.single i 1) + matVecMul M (Pi.single j 1)) := by + rw [matVecMul_add] + _ = vecDot (Pi.single i 1 + Pi.single j 1) (matVecMul M (Pi.single i 1)) + + vecDot (Pi.single i 1 + Pi.single j 1) (matVecMul M (Pi.single j 1)) := by + rw [vecDot_add_right] + _ = (vecDot (Pi.single i 1) (matVecMul M (Pi.single i 1)) + + vecDot (Pi.single j 1) (matVecMul M (Pi.single i 1))) + + (vecDot (Pi.single i 1) (matVecMul M (Pi.single j 1)) + + vecDot (Pi.single j 1) (matVecMul M (Pi.single j 1))) := by + rw [vecDot_add_left, vecDot_add_left] + _ = M i i + M i j + M j i + M j j := by + simp [vecDot_single_left, matVecMul_single] + ac_rfl + +theorem blockMatVecMul_add {d : ℕ} (A : BlockMat d) (X Y : BlockVec d) : + blockMatVecMul A (X + Y) = blockMatVecMul A X + blockMatVecMul A Y := by + ext <;> simp [blockMatVecMul, matVecMul_add, add_left_comm, add_comm] + +theorem blockMatVecMul_ofFullBlockMat_sub {d : ℕ} + (A B : BlockMat d) (X : BlockVec d) : + blockMatVecMul (ofFullBlockMat (toFullBlockMat A - toFullBlockMat B)) X = + blockMatVecMul A X - blockMatVecMul B X := by + rcases X with ⟨x, y⟩ + ext i + · change + (matVecMul (A.upperLeft - B.upperLeft) x + + matVecMul (A.upperRight - B.upperRight) y) i = + (matVecMul A.upperLeft x + matVecMul A.upperRight y - + (matVecMul B.upperLeft x + matVecMul B.upperRight y)) i + rw [sub_matVecMul, sub_matVecMul] + simp only [Pi.add_apply, Pi.sub_apply] + ring + · change + (matVecMul (A.lowerLeft - B.lowerLeft) x + + matVecMul (A.lowerRight - B.lowerRight) y) i = + (matVecMul A.lowerLeft x + matVecMul A.lowerRight y - + (matVecMul B.lowerLeft x + matVecMul B.lowerRight y)) i + rw [sub_matVecMul, sub_matVecMul] + simp only [Pi.add_apply, Pi.sub_apply] + ring + +theorem blockVecDot_add_left {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot (X + Y) Z = blockVecDot X Z + blockVecDot Y Z := by + rcases X with ⟨x₁, x₂⟩ + rcases Y with ⟨y₁, y₂⟩ + rcases Z with ⟨z₁, z₂⟩ + change vecDot (x₁ + y₁) z₁ + vecDot (x₂ + y₂) z₂ = + (vecDot x₁ z₁ + vecDot x₂ z₂) + (vecDot y₁ z₁ + vecDot y₂ z₂) + rw [vecDot_add_left, vecDot_add_left] + ring + +theorem blockVecDot_add_right {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot X (Y + Z) = blockVecDot X Y + blockVecDot X Z := by + rcases X with ⟨x₁, x₂⟩ + rcases Y with ⟨y₁, y₂⟩ + rcases Z with ⟨z₁, z₂⟩ + change vecDot x₁ (y₁ + z₁) + vecDot x₂ (y₂ + z₂) = + (vecDot x₁ y₁ + vecDot x₂ y₂) + (vecDot x₁ z₁ + vecDot x₂ z₂) + rw [vecDot_add_right, vecDot_add_right] + ring + +theorem blockVecDot_sub_right {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot X (Y - Z) = blockVecDot X Y - blockVecDot X Z := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨u, v⟩ + rcases Z with ⟨w, z⟩ + simp [blockVecDot, vecDot, mul_sub] + abel + +theorem blockVecDot_comm {d : ℕ} (X Y : BlockVec d) : + blockVecDot X Y = blockVecDot Y X := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨u, v⟩ + simp [blockVecDot, vecDot_comm] + +@[simp] theorem blockVecDot_swap_right {d : ℕ} (X Y : BlockVec d) : + blockVecDot X Y.swap = blockVecDot (X.2, X.1) Y := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨u, v⟩ + simp [blockVecDot, add_comm] + +theorem blockMatVecMul_smul {d : ℕ} (A : BlockMat d) (c : ℝ) (X : BlockVec d) : + blockMatVecMul A (c • X) = c • blockMatVecMul A X := by + ext <;> simp [blockMatVecMul, matVecMul_smul, smul_add] + +theorem blockVecDot_smul_left {d : ℕ} (c : ℝ) (X Y : BlockVec d) : + blockVecDot (c • X) Y = c * blockVecDot X Y := by + simp [blockVecDot, vecDot_smul_left, mul_add] + +theorem blockVecDot_smul_right {d : ℕ} (X Y : BlockVec d) (c : ℝ) : + blockVecDot X (c • Y) = c * blockVecDot X Y := by + simp [blockVecDot, vecDot_smul_right, mul_add] + +theorem blockVecDot_blockMatVecMul_ofFullBlockMat_sub {d : ℕ} + (A B : BlockMat d) (X : BlockVec d) : + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat A - toFullBlockMat B)) X) = + blockVecDot X (blockMatVecMul A X) - + blockVecDot X (blockMatVecMul B X) := by + rw [blockMatVecMul_ofFullBlockMat_sub, blockVecDot_sub_right] + +theorem blockVecDot_blockMatVecMul_sub_eq_ofFullBlockMat_sub {d : ℕ} + (A B : BlockMat d) (X : BlockVec d) : + blockVecDot X (blockMatVecMul A X) - + blockVecDot X (blockMatVecMul B X) = + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat A - toFullBlockMat B)) X) := + (blockVecDot_blockMatVecMul_ofFullBlockMat_sub A B X).symm + +theorem blockVecDot_nonneg {d : ℕ} (X : BlockVec d) : + 0 ≤ blockVecDot X X := by + rcases X with ⟨p, q⟩ + have hp : 0 ≤ vecDot p p := vecNormSq_nonneg p + have hq : 0 ≤ vecDot q q := vecNormSq_nonneg q + simpa [blockVecDot, vecNormSq] using add_nonneg hp hq + +theorem sq_blockVecDot_le_blockVecDot_mul_blockVecDot {d : ℕ} (X Y : BlockVec d) : + blockVecDot X Y ^ 2 ≤ blockVecDot X X * blockVecDot Y Y := by + rw [← dotProduct_toFullBlockVec X Y, ← dotProduct_toFullBlockVec X X, + ← dotProduct_toFullBlockVec Y Y] + simpa [dotProduct, pow_two] using + (Finset.sum_mul_sq_le_sq_mul_sq + (s := Finset.univ) (f := toFullBlockVec X) (g := toFullBlockVec Y)) + +theorem blockVecDot_sub_self_le {d : ℕ} (X Y : BlockVec d) : + blockVecDot (X - Y) (X - Y) ≤ 2 * (blockVecDot X X + blockVecDot Y Y) := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨u, v⟩ + change vecNormSq (p - u) + vecNormSq (q - v) ≤ + 2 * ((vecNormSq p + vecNormSq q) + (vecNormSq u + vecNormSq v)) + have hp := vecNormSq_sub_le p u + have hq := vecNormSq_sub_le q v + nlinarith + +/-- A block matrix acts linearly on doubled vectors. -/ +def blockMatLinearMap {d : ℕ} (A : BlockMat d) : BlockVec d →ₗ[ℝ] BlockVec d where + toFun := blockMatVecMul A + map_add' := blockMatVecMul_add A + map_smul' := blockMatVecMul_smul A + +@[simp] theorem blockMatLinearMap_apply {d : ℕ} (A : BlockMat d) (X : BlockVec d) : + blockMatLinearMap A X = blockMatVecMul A X := + rfl + +/-- A block matrix acts continuously on doubled vectors. Continuity is automatic +because the carrier is finite-dimensional. -/ +noncomputable def blockMatContinuousLinearMap {d : ℕ} (A : BlockMat d) : + BlockVec d →L[ℝ] BlockVec d := + ⟨blockMatLinearMap A, (blockMatLinearMap A).continuous_of_finiteDimensional⟩ + +@[simp] theorem blockMatContinuousLinearMap_apply {d : ℕ} (A : BlockMat d) (X : BlockVec d) : + blockMatContinuousLinearMap A X = blockMatVecMul A X := + rfl + +theorem blockBasis_pairing {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α) (blockMatVecMul A (blockBasis β)) = blockMatEntry A α β := by + cases α <;> cases β <;> simp [blockBasis, blockMatEntry, blockVecDot, blockMatVecMul, + vecDot_single_left, matVecMul_single, matVecMul_zero, vecDot_zero_left] + +theorem blockBasis_sum_pairing {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α + blockBasis β) (blockMatVecMul A (blockBasis α + blockBasis β)) = + blockMatEntry A α α + blockMatEntry A α β + blockMatEntry A β α + blockMatEntry A β β := by + calc + blockVecDot (blockBasis α + blockBasis β) (blockMatVecMul A (blockBasis α + blockBasis β)) + = blockVecDot (blockBasis α + blockBasis β) + (blockMatVecMul A (blockBasis α) + blockMatVecMul A (blockBasis β)) := by + rw [blockMatVecMul_add] + _ = blockVecDot (blockBasis α + blockBasis β) (blockMatVecMul A (blockBasis α)) + + blockVecDot (blockBasis α + blockBasis β) (blockMatVecMul A (blockBasis β)) := by + rw [blockVecDot_add_right] + _ = (blockVecDot (blockBasis α) (blockMatVecMul A (blockBasis α)) + + blockVecDot (blockBasis β) (blockMatVecMul A (blockBasis α))) + + (blockVecDot (blockBasis α) (blockMatVecMul A (blockBasis β)) + + blockVecDot (blockBasis β) (blockMatVecMul A (blockBasis β))) := by + rw [blockVecDot_add_left, blockVecDot_add_left] + _ = blockMatEntry A α α + blockMatEntry A α β + blockMatEntry A β α + blockMatEntry A β β := by + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, blockBasis_pairing] + ac_rfl + +def blockReflect {d : ℕ} (A : BlockMat d) : BlockMat d := + { upperLeft := A.lowerRight + upperRight := A.lowerLeft + lowerLeft := A.upperRight + lowerRight := A.upperLeft } + +theorem isSymmetricBlockMat_blockReflect {d : ℕ} {A : BlockMat d} + (hA : IsSymmetricBlockMat A) : + IsSymmetricBlockMat (blockReflect A) := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [blockReflect, blockMatEntry] using hA (Sum.inr i) (Sum.inr j) + | inr j => + simpa [blockReflect, blockMatEntry] using hA (Sum.inr i) (Sum.inl j) + | inr i => + cases β with + | inl j => + simpa [blockReflect, blockMatEntry] using hA (Sum.inl i) (Sum.inr j) + | inr j => + simpa [blockReflect, blockMatEntry] using hA (Sum.inl i) (Sum.inl j) + +@[simp] theorem blockReflect_upperLeft {d : ℕ} (A : BlockMat d) : + (blockReflect A).upperLeft = A.lowerRight := rfl + +@[simp] theorem blockReflect_upperRight {d : ℕ} (A : BlockMat d) : + (blockReflect A).upperRight = A.lowerLeft := rfl + +@[simp] theorem blockReflect_lowerLeft {d : ℕ} (A : BlockMat d) : + (blockReflect A).lowerLeft = A.upperRight := rfl + +@[simp] theorem blockReflect_lowerRight {d : ℕ} (A : BlockMat d) : + (blockReflect A).lowerRight = A.upperLeft := rfl + +@[simp] theorem blockReflect_blockReflect {d : ℕ} (A : BlockMat d) : + blockReflect (blockReflect A) = A := by + rfl + +/-- +Löwner order on finite-dimensional real matrices, expressed through the quadratic +form `\frac12 x \cdot A x`. +-/ +def MatLoewnerLE {d : ℕ} (A B : Mat d) : Prop := + ∀ x : Vec d, + (1 / 2 : ℝ) * vecDot x (matVecMul A x) ≤ + (1 / 2 : ℝ) * vecDot x (matVecMul B x) + +/-- +Löwner order on doubled block matrices, expressed through the quadratic form +`\frac12 X \cdot \mathbf A X`. +-/ +def BlockMatLoewnerLE {d : ℕ} (A B : BlockMat d) : Prop := + ∀ X : BlockVec d, + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul A X) ≤ + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul B X) + +theorem MatLoewnerLE.refl {d : ℕ} (A : Mat d) : MatLoewnerLE A A := by + intro x + exact le_rfl + +theorem MatLoewnerLE.trans {d : ℕ} {A B C : Mat d} + (hAB : MatLoewnerLE A B) (hBC : MatLoewnerLE B C) : + MatLoewnerLE A C := by + intro x + exact le_trans (hAB x) (hBC x) + +theorem BlockMatLoewnerLE.refl {d : ℕ} (A : BlockMat d) : BlockMatLoewnerLE A A := by + intro X + exact le_rfl + +theorem BlockMatLoewnerLE.trans {d : ℕ} {A B C : BlockMat d} + (hAB : BlockMatLoewnerLE A B) (hBC : BlockMatLoewnerLE B C) : + BlockMatLoewnerLE A C := by + intro X + exact le_trans (hAB X) (hBC X) + +@[simp] theorem blockMatVecMul_blockReflect {d : ℕ} (A : BlockMat d) (X : BlockVec d) : + blockMatVecMul (blockReflect A) X = + (blockMatVecMul A (X.2, X.1)).swap := by + rcases A with ⟨ul, ur, ll, lr⟩ + rcases X with ⟨p, q⟩ + ext <;> simp [blockReflect, blockMatVecMul, add_comm] + +@[simp] theorem blockVecDot_blockMatVecMul_blockReflect {d : ℕ} (A : BlockMat d) + (X : BlockVec d) : + blockVecDot X (blockMatVecMul (blockReflect A) X) = + blockVecDot (X.2, X.1) (blockMatVecMul A (X.2, X.1)) := by + rcases X with ⟨p, q⟩ + simp [blockReflect, blockMatVecMul, blockVecDot, add_comm] + +theorem blockMat_ext {d : ℕ} {A B : BlockMat d} + (hUL : A.upperLeft = B.upperLeft) + (hUR : A.upperRight = B.upperRight) + (hLL : A.lowerLeft = B.lowerLeft) + (hLR : A.lowerRight = B.lowerRight) : + A = B := by + cases A + cases B + simp at hUL hUR hLL hLR + simp [hUL, hUR, hLL, hLR] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientField.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientField.lean new file mode 100644 index 0000000000..e45ecc260b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientField.lean @@ -0,0 +1,908 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import Mathlib.LinearAlgebra.Matrix.NonsingularInverse +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.SpecificCodomains.Pi + +/-! # Coefficient Field -/ + +@[expose] public section + +namespace Homogenization + +abbrev CoeffField (d : ℕ) := Vec d → Mat d + +def IsEllipticMatrix {d : ℕ} (lam Lam : ℝ) (A : Mat d) : Prop := + 0 < lam ∧ + lam ≤ Lam ∧ + (∀ ξ : Vec d, lam * vecNormSq ξ ≤ vecDot ξ (matVecMul A ξ)) ∧ + (∀ ξ : Vec d, Lam⁻¹ * vecNormSq ξ ≤ vecDot ξ (matVecMul A⁻¹ ξ)) + +namespace IsEllipticMatrix + +theorem mono {d : ℕ} {lam Lam lam' Lam' : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (hlam'_pos : 0 < lam') (hlam'_le : lam' ≤ lam) + (hLam_le : Lam ≤ Lam') : + IsEllipticMatrix lam' Lam' A := by + rcases hA with ⟨hlam_pos, hlam_le_Lam, hlower, hinv⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlam_le_Lam + have hLam'_pos : 0 < Lam' := lt_of_lt_of_le hLam_pos hLam_le + refine ⟨hlam'_pos, hlam'_le.trans (hlam_le_Lam.trans hLam_le), ?_, ?_⟩ + · intro ξ + calc + lam' * vecNormSq ξ ≤ lam * vecNormSq ξ := + mul_le_mul_of_nonneg_right hlam'_le (vecNormSq_nonneg ξ) + _ ≤ vecDot ξ (matVecMul A ξ) := hlower ξ + · intro ξ + have hInv_le : Lam'⁻¹ ≤ Lam⁻¹ := (inv_le_inv₀ hLam'_pos hLam_pos).2 hLam_le + calc + Lam'⁻¹ * vecNormSq ξ ≤ Lam⁻¹ * vecNormSq ξ := + mul_le_mul_of_nonneg_right hInv_le (vecNormSq_nonneg ξ) + _ ≤ vecDot ξ (matVecMul A⁻¹ ξ) := hinv ξ + +end IsEllipticMatrix + +theorem isUnit_det_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : IsUnit A.det := by + classical + by_cases hdet : IsUnit A.det + · exact hdet + · rcases hA with ⟨hlam_pos, hlamLam, -, hInv⟩ + have hInvZero : A⁻¹ = 0 := Matrix.nonsing_inv_apply_not_isUnit A hdet + by_cases hd : d = 0 + · subst hd + simp + · let i : Fin d := ⟨0, Nat.pos_of_ne_zero hd⟩ + have hbasis := hInv (Pi.single i 1) + have hnorm : vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + have hzero : + vecDot (Pi.single i 1 : Vec d) (matVecMul A⁻¹ (Pi.single i 1)) = 0 := by + rw [hInvZero] + simp [matVecMul, vecDot] + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hLamInv_nonpos : Lam⁻¹ ≤ 0 := by + rw [hnorm, hzero] at hbasis + simpa using hbasis + have hLamInv_pos : 0 < Lam⁻¹ := by positivity + linarith + +theorem vecNormSq_matVecMul_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecNormSq (matVecMul A ξ) ≤ Lam ^ 2 * vecNormSq ξ := by + have hdet : IsUnit A.det := isUnit_det_of_isEllipticMatrix hA + rcases hA with ⟨hlam_pos, hlamLam, -, hInv⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hInvMul : matVecMul A⁻¹ (matVecMul A ξ) = ξ := by + rw [matVecMul_mul, Matrix.nonsing_inv_mul A hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hInvA : + Lam⁻¹ * vecNormSq (matVecMul A ξ) ≤ vecDot (matVecMul A ξ) ξ := by + simpa [hInvMul] using hInv (matVecMul A ξ) + have hCS : + vecDot (matVecMul A ξ) ξ ^ 2 ≤ + vecNormSq (matVecMul A ξ) * vecNormSq ξ := + sq_vecDot_le_vecNormSq_mul_vecNormSq (matVecMul A ξ) ξ + have hnonneg : 0 ≤ vecNormSq (matVecMul A ξ) := + vecNormSq_nonneg (matVecMul A ξ) + have hdot_nonneg : 0 ≤ vecDot (matVecMul A ξ) ξ := by + have hLamInv_nonneg : 0 ≤ Lam⁻¹ := by positivity + exact (mul_nonneg hLamInv_nonneg hnonneg).trans hInvA + have hInvA' : + vecNormSq (matVecMul A ξ) ≤ Lam * vecDot (matVecMul A ξ) ξ := by + have hmul := mul_le_mul_of_nonneg_left hInvA (le_of_lt hLam_pos) + have hLamInv : Lam * Lam⁻¹ = 1 := by + field_simp [hLam_pos.ne'] + calc + vecNormSq (matVecMul A ξ) = (Lam * Lam⁻¹) * vecNormSq (matVecMul A ξ) := by + rw [hLamInv, one_mul] + _ = Lam * (Lam⁻¹ * vecNormSq (matVecMul A ξ)) := by ring + _ ≤ Lam * vecDot (matVecMul A ξ) ξ := hmul + have hsq : + vecNormSq (matVecMul A ξ) ^ 2 ≤ + Lam ^ 2 * vecDot (matVecMul A ξ) ξ ^ 2 := by + calc + vecNormSq (matVecMul A ξ) ^ 2 ≤ + (Lam * vecDot (matVecMul A ξ) ξ) ^ (2 : ℕ) := + pow_le_pow_left₀ hnonneg hInvA' 2 + _ = Lam ^ (2 : ℕ) * vecDot (matVecMul A ξ) ξ ^ (2 : ℕ) := by ring + have hmain : + vecNormSq (matVecMul A ξ) ^ 2 ≤ + Lam ^ 2 * (vecNormSq (matVecMul A ξ) * vecNormSq ξ) := by + exact hsq.trans (mul_le_mul_of_nonneg_left hCS (sq_nonneg Lam)) + by_cases hzero : vecNormSq (matVecMul A ξ) = 0 + · rw [hzero] + exact mul_nonneg (sq_nonneg Lam) (vecNormSq_nonneg ξ) + · have hpos : 0 < vecNormSq (matVecMul A ξ) := by + exact lt_of_le_of_ne hnonneg (by simpa [eq_comm] using hzero) + have hmain' : + vecNormSq (matVecMul A ξ) * vecNormSq (matVecMul A ξ) ≤ + vecNormSq (matVecMul A ξ) * (Lam ^ (2 : ℕ) * vecNormSq ξ) := by + simpa [pow_two, mul_assoc, mul_left_comm, mul_comm] using hmain + nlinarith + +theorem abs_apply_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (i j : Fin d) : + |A i j| ≤ Lam := by + let e : Vec d := Pi.single j 1 + have he_norm : vecNormSq e = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single j] + · simp [e] + · intro k _ hkj + simp [e, Pi.single_eq_of_ne hkj] + · simp [e] + have hentry : matVecMul A e i = A i j := by + rw [matVecMul, Finset.sum_eq_single j] + · simp [e] + · intro k _ hkj + simp [e, Pi.single_eq_of_ne hkj] + · simp [e] + have hcoord_sq : (A i j) ^ 2 ≤ vecNormSq (matVecMul A e) := by + calc + (A i j) ^ 2 = (matVecMul A e i) ^ 2 := by rw [hentry] + _ ≤ ∑ k, (matVecMul A e k) ^ 2 := by + exact Finset.single_le_sum + (fun k _ => sq_nonneg (matVecMul A e k)) + (Finset.mem_univ i) + _ = vecNormSq (matVecMul A e) := by + simp [vecNormSq, vecDot, pow_two] + have hupper : vecNormSq (matVecMul A e) ≤ Lam ^ 2 := by + simpa [he_norm] using vecNormSq_matVecMul_le_of_isEllipticMatrix hA e + have hLam_nonneg : 0 ≤ Lam := le_trans (le_of_lt hA.1) hA.2.1 + have hsq : (A i j) ^ 2 ≤ Lam ^ 2 := le_trans hcoord_sq hupper + have habs_sq : |A i j| ^ 2 ≤ Lam ^ 2 := by + simpa [sq_abs] using hsq + nlinarith [sq_nonneg (Lam - |A i j|), habs_sq] + +theorem isEllipticMatrix_transpose {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : + IsEllipticMatrix lam Lam (matTranspose A) := by + rcases hA with ⟨hlam_pos, hlamLam, hlower, hInv⟩ + refine ⟨hlam_pos, hlamLam, ?_, ?_⟩ + · intro ξ + calc + lam * vecNormSq ξ ≤ vecDot ξ (matVecMul A ξ) := hlower ξ + _ = vecDot ξ (matVecMul (matTranspose A) ξ) := by + rw [vecDot_matVecMul_transpose, vecDot_comm] + · intro ξ + have htransinv : matTranspose A⁻¹ = (matTranspose A)⁻¹ := by + simpa [matTranspose] using (Matrix.transpose_nonsing_inv (A := A)) + calc + Lam⁻¹ * vecNormSq ξ ≤ vecDot ξ (matVecMul A⁻¹ ξ) := hInv ξ + _ = vecDot ξ (matVecMul ((matTranspose A)⁻¹) ξ) := by + rw [vecDot_comm, ← vecDot_matVecMul_transpose ξ ξ A⁻¹, htransinv] + +theorem vecNormSq_matVecMul_symmPart_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecNormSq (matVecMul (symmPart A) ξ) ≤ Lam ^ 2 * vecNormSq ξ := by + have hAT : IsEllipticMatrix lam Lam (matTranspose A) := isEllipticMatrix_transpose hA + have hAupper := vecNormSq_matVecMul_le_of_isEllipticMatrix hA ξ + have hATupper := vecNormSq_matVecMul_le_of_isEllipticMatrix hAT ξ + calc + vecNormSq (matVecMul (symmPart A) ξ) + = (1 / 2 : ℝ) ^ 2 * + vecNormSq (matVecMul A ξ + matVecMul (matTranspose A) ξ) := by + rw [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, vecNormSq_smul] + _ ≤ (1 / 2 : ℝ) ^ 2 * + (2 * (vecNormSq (matVecMul A ξ) + vecNormSq (matVecMul (matTranspose A) ξ))) := by + gcongr + exact vecNormSq_add_le (matVecMul A ξ) (matVecMul (matTranspose A) ξ) + _ ≤ Lam ^ 2 * vecNormSq ξ := by + nlinarith + +theorem vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecNormSq (matVecMul (skewPart A) ξ) ≤ Lam ^ 2 * vecNormSq ξ := by + have hAT : IsEllipticMatrix lam Lam (matTranspose A) := isEllipticMatrix_transpose hA + have hAupper := vecNormSq_matVecMul_le_of_isEllipticMatrix hA ξ + have hATupper := vecNormSq_matVecMul_le_of_isEllipticMatrix hAT ξ + calc + vecNormSq (matVecMul (skewPart A) ξ) + = (1 / 2 : ℝ) ^ 2 * + vecNormSq (matVecMul A ξ - matVecMul (matTranspose A) ξ) := by + rw [skewPart_eq_smul_sub_transpose, smul_matVecMul, vecNormSq_smul] + congr 1 + rw [sub_eq_add_neg, add_matVecMul, neg_matVecMul] + simp [sub_eq_add_neg] + _ ≤ (1 / 2 : ℝ) ^ 2 * + (2 * (vecNormSq (matVecMul A ξ) + vecNormSq (matVecMul (matTranspose A) ξ))) := by + gcongr + exact vecNormSq_sub_le (matVecMul A ξ) (matVecMul (matTranspose A) ξ) + _ ≤ Lam ^ 2 * vecNormSq ξ := by + nlinarith + +theorem vecDot_matVecMul_comm_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + vecDot ξ (matVecMul A η) = vecDot η (matVecMul A ξ) := by + calc + vecDot ξ (matVecMul A η) = vecDot ξ (matVecMul (matTranspose A) η) := by + rw [show matTranspose A = A by simpa [matTranspose] using hA.eq] + _ = vecDot (matVecMul A ξ) η := by + rw [vecDot_matVecMul_transpose] + _ = vecDot η (matVecMul A ξ) := by + rw [vecDot_comm] + +theorem isSymm_nonsingInv {d : ℕ} {A : Mat d} (hA : A.IsSymm) : + A⁻¹.IsSymm := by + rw [Matrix.IsSymm] at hA ⊢ + rw [Matrix.transpose_nonsing_inv, hA] + +theorem vecDot_matVecMul_symmPart {d : ℕ} (A : Mat d) (ξ : Vec d) : + vecDot ξ (matVecMul (symmPart A) ξ) = vecDot ξ (matVecMul A ξ) := by + rw [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, vecDot_smul_right, + vecDot_add_right, vecDot_matVecMul_transpose, vecDot_comm] + ring + +theorem sq_le_mul_of_quadratic_nonneg {a b c : ℝ} (hc : 0 ≤ c) + (hquad : ∀ t : ℝ, 0 ≤ a - 2 * t * b + t ^ 2 * c) : + b ^ 2 ≤ a * c := by + by_cases hc0 : c = 0 + · by_cases hb0 : b = 0 + · simp [hb0, hc0] + · have htest := hquad ((a + 1) / (2 * b)) + rw [hc0] at htest + have hEq : a - 2 * (((a + 1) / (2 * b)) * b) = -1 := by + field_simp [hb0] + ring + nlinarith [htest, hEq] + · have hc_pos : 0 < c := lt_of_le_of_ne hc (Ne.symm hc0) + have htest := hquad (b / c) + field_simp [hc_pos.ne'] at htest + nlinarith + +theorem sq_vecDot_matVecMul_le_of_isSymm_of_nonneg {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (hA_nonneg : ∀ ξ : Vec d, 0 ≤ vecDot ξ (matVecMul A ξ)) (ξ η : Vec d) : + vecDot ξ (matVecMul A η) ^ 2 ≤ + vecDot ξ (matVecMul A ξ) * vecDot η (matVecMul A η) := by + have hcomm := vecDot_matVecMul_comm_of_isSymm hA ξ η + have hc : 0 ≤ vecDot η (matVecMul A η) := hA_nonneg η + refine sq_le_mul_of_quadratic_nonneg hc ?_ + intro t + have hnonneg := hA_nonneg (ξ - t • η) + have hquad : + vecDot (ξ - t • η) (matVecMul A (ξ - t • η)) = + vecDot ξ (matVecMul A ξ) - 2 * t * vecDot ξ (matVecMul A η) + + t ^ 2 * vecDot η (matVecMul A η) := by + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg, matVecMul_smul] + simp [vecDot_add_left, vecDot_add_right, vecDot_neg_left, vecDot_neg_right, + vecDot_smul_left, vecDot_smul_right, hcomm] + ring + rw [hquad] at hnonneg + exact hnonneg + +theorem sq_vecDot_matVecMul_symmPart_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ η : Vec d) : + vecDot ξ (matVecMul (symmPart A) η) ^ 2 ≤ + vecDot ξ (matVecMul (symmPart A) ξ) * vecDot η (matVecMul (symmPart A) η) := by + refine sq_vecDot_matVecMul_le_of_isSymm_of_nonneg ?_ ?_ ξ η + · rw [Matrix.IsSymm.ext_iff] + intro i j + simp [symmPart] + ring + · intro z + rcases hA with ⟨hlam_pos, -, hlower, -⟩ + have hlower' : + lam * vecNormSq z ≤ vecDot z (matVecMul (symmPart A) z) := by + rw [vecDot_matVecMul_symmPart] + exact hlower z + have hnorm_nonneg : 0 ≤ vecNormSq z := vecNormSq_nonneg z + nlinarith + +theorem lowerBound_symmPart_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + lam * vecNormSq ξ ≤ vecDot ξ (matVecMul (symmPart A) ξ) := by + rcases hA with ⟨_, _, hlower, _⟩ + rw [vecDot_matVecMul_symmPart] + exact hlower ξ + +theorem upperBound_symmPart_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecDot ξ (matVecMul (symmPart A) ξ) ≤ Lam * vecNormSq ξ := by + rw [vecDot_matVecMul_symmPart] + have hAupper : vecNormSq (matVecMul A ξ) ≤ Lam ^ 2 * vecNormSq ξ := + vecNormSq_matVecMul_le_of_isEllipticMatrix hA ξ + rcases hA with ⟨hlam_pos, hlamLam, hlower, _⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hCS : + vecDot ξ (matVecMul A ξ) ^ 2 ≤ vecNormSq ξ * vecNormSq (matVecMul A ξ) := + sq_vecDot_le_vecNormSq_mul_vecNormSq ξ (matVecMul A ξ) + have hq_nonneg : 0 ≤ vecDot ξ (matVecMul A ξ) := by + have hnorm_nonneg : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + nlinarith [hlower ξ] + have hmain' : + vecDot ξ (matVecMul A ξ) ^ 2 ≤ vecNormSq ξ * (Lam ^ 2 * vecNormSq ξ) := by + have hmul : + vecNormSq ξ * vecNormSq (matVecMul A ξ) ≤ + vecNormSq ξ * (Lam ^ 2 * vecNormSq ξ) := by + exact mul_le_mul_of_nonneg_left hAupper (vecNormSq_nonneg ξ) + exact le_trans hCS hmul + have hmain : vecDot ξ (matVecMul A ξ) ^ 2 ≤ (Lam * vecNormSq ξ) ^ 2 := by + nlinarith [hmain'] + by_cases hzero : vecNormSq ξ = 0 + · rw [hzero] + have hAnorm_zero : vecNormSq (matVecMul A ξ) = 0 := by + have hAnorm_nonneg : 0 ≤ vecNormSq (matVecMul A ξ) := vecNormSq_nonneg (matVecMul A ξ) + nlinarith [hAupper] + have hq_zero : vecDot ξ (matVecMul A ξ) = 0 := by + nlinarith [hCS, hAnorm_zero] + nlinarith [hq_zero] + · have hpos : 0 < vecNormSq ξ := by + exact lt_of_le_of_ne (vecNormSq_nonneg ξ) (by simpa [eq_comm] using hzero) + have hLamNorm_nonneg : 0 ≤ Lam * vecNormSq ξ := by positivity + have habs : |vecDot ξ (matVecMul A ξ)| ≤ |Lam * vecNormSq ξ| := by + exact sq_le_sq.mp hmain + have hq_abs : |vecDot ξ (matVecMul A ξ)| = vecDot ξ (matVecMul A ξ) := abs_of_nonneg hq_nonneg + have hLamNorm_abs : |Lam * vecNormSq ξ| = Lam * vecNormSq ξ := + abs_of_nonneg hLamNorm_nonneg + nlinarith [habs, hq_abs, hLamNorm_abs] + +theorem isUnit_det_symmPart_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : IsUnit (symmPart A).det := by + have hinj : Function.Injective (matVecMul (symmPart A)) := by + intro ξ η hξη + have hzero : matVecMul (symmPart A) (ξ - η) = 0 := by + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg] + simp [hξη] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA (ξ - η) + rw [hzero, vecDot_zero_right] at hlower + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hnorm_zero : vecNormSq (ξ - η) = 0 := by + nlinarith [vecNormSq_nonneg (ξ - η)] + exact sub_eq_zero.mp (vecNormSq_eq_zero hnorm_zero) + have hinj' : Function.Injective ((symmPart A).mulVec) := by + simpa [matVecMul] using! hinj + exact ((symmPart A).isUnit_iff_isUnit_det).mp + ((Matrix.mulVec_injective_iff_isUnit (A := symmPart A)).mp hinj') + +private theorem isUnit_symmPart_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : IsUnit (symmPart A) := by + exact ((symmPart A).isUnit_iff_isUnit_det).mpr + (isUnit_det_symmPart_of_isEllipticMatrix hA) + +private theorem symmPart_inv_nonneg_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + 0 ≤ vecDot ξ (matVecMul ((symmPart A)⁻¹) ξ) := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hηnonneg : 0 ≤ vecNormSq η := vecNormSq_nonneg η + have hξη_nonneg : 0 ≤ vecDot ξ η := by + nlinarith + simpa [η] using hξη_nonneg + +private theorem vecNormSq_matVecMul_symmPartInv_le_of_isEllipticMatrix_aux + {d : ℕ} {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecNormSq (matVecMul ((symmPart A)⁻¹) ξ) ≤ + (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + have hCS : + vecDot ξ η ^ 2 ≤ vecNormSq ξ * vecNormSq η := + sq_vecDot_le_vecNormSq_mul_vecNormSq ξ η + have hξη_nonneg : 0 ≤ vecDot ξ η := symmPart_inv_nonneg_of_isEllipticMatrix hA ξ + rcases hA with ⟨hlam_pos, -, -, -⟩ + by_cases hη0 : vecNormSq η = 0 + · rw [hη0] + have hlam_inv_sq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := by + positivity + nlinarith [hlam_inv_sq_nonneg, vecNormSq_nonneg ξ] + · have hηpos : 0 < vecNormSq η := by + exact lt_of_le_of_ne (vecNormSq_nonneg η) (by simpa [eq_comm] using hη0) + have hsq : (lam * vecNormSq η) ^ 2 ≤ vecNormSq ξ * vecNormSq η := by + have hsq' : (lam * vecNormSq η) ^ 2 ≤ vecDot ξ η ^ 2 := by + have hlam_nonneg : 0 ≤ lam := le_of_lt hlam_pos + have hlamη_nonneg : 0 ≤ lam * vecNormSq η := mul_nonneg hlam_nonneg (vecNormSq_nonneg η) + nlinarith [hmain, hξη_nonneg, hlamη_nonneg] + exact le_trans hsq' hCS + have hlam_sq_bound : lam ^ 2 * vecNormSq η ≤ vecNormSq ξ := by + nlinarith [hsq, hηpos, le_of_lt hlam_pos] + have hlam_inv_sq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := by + positivity + have hmul : + (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) ≤ + (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + exact mul_le_mul_of_nonneg_left hlam_sq_bound hlam_inv_sq_nonneg + have hcancel : (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) = vecNormSq η := by + field_simp [hlam_pos.ne'] + calc + vecNormSq (matVecMul ((symmPart A)⁻¹) ξ) = vecNormSq η := by + rfl + _ = (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) := by + exact hcancel.symm + _ ≤ (lam⁻¹ * lam⁻¹) * vecNormSq ξ := hmul + +theorem abs_apply_symmPartInv_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (i j : Fin d) : + |((symmPart A)⁻¹ : Mat d) i j| ≤ lam⁻¹ := by + let e : Vec d := Pi.single j 1 + have he_norm : vecNormSq e = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single j] + · simp [e] + · intro k _ hkj + simp [e, Pi.single_eq_of_ne hkj] + · simp [e] + have hentry : matVecMul ((symmPart A)⁻¹) e i = ((symmPart A)⁻¹ : Mat d) i j := by + rw [matVecMul, Finset.sum_eq_single j] + · simp [e] + · intro k _ hkj + simp [e, Pi.single_eq_of_ne hkj] + · simp [e] + have hcoord_sq : (((symmPart A)⁻¹ : Mat d) i j) ^ 2 ≤ vecNormSq (matVecMul ((symmPart A)⁻¹) e) := by + calc + (((symmPart A)⁻¹ : Mat d) i j) ^ 2 = (matVecMul ((symmPart A)⁻¹) e i) ^ 2 := by + rw [hentry] + _ ≤ ∑ k, (matVecMul ((symmPart A)⁻¹) e k) ^ 2 := by + exact Finset.single_le_sum + (fun k _ => sq_nonneg (matVecMul ((symmPart A)⁻¹) e k)) + (Finset.mem_univ i) + _ = vecNormSq (matVecMul ((symmPart A)⁻¹) e) := by + simp [vecNormSq, vecDot, pow_two] + have hupper : vecNormSq (matVecMul ((symmPart A)⁻¹) e) ≤ (lam⁻¹ * lam⁻¹) := by + simpa [he_norm] using vecNormSq_matVecMul_symmPartInv_le_of_isEllipticMatrix_aux hA e + have hlam_inv_nonneg : 0 ≤ lam⁻¹ := by + rcases hA with ⟨hlam_pos, -, -, -⟩ + positivity + have hsq : (((symmPart A)⁻¹ : Mat d) i j) ^ 2 ≤ (lam⁻¹) ^ 2 := by + simpa [pow_two] using le_trans hcoord_sq hupper + have habs_sq : |((symmPart A)⁻¹ : Mat d) i j| ^ 2 ≤ (lam⁻¹) ^ 2 := by + simpa [sq_abs] using hsq + nlinarith [sq_nonneg (lam⁻¹ - |((symmPart A)⁻¹ : Mat d) i j|), habs_sq] + +def IsEllipticFieldOn {d : ℕ} (lam Lam : ℝ) (U : Set (Vec d)) (a : CoeffField d) : Prop := + by + classical + exact + Measurable (fun x i j => if x ∈ U then a x i j else 0) ∧ + ∀ x ∈ U, IsEllipticMatrix lam Lam (a x) + +theorem abs_apply_le_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {x : Vec d} (hx : x ∈ U) (i j : Fin d) : + |a x i j| ≤ Lam := + abs_apply_le_of_isEllipticMatrix (hEll.2 x hx) i j + +theorem measurableSet_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) : + MeasurableSet U := by + classical + rcases hEll with ⟨hmeas, hell⟩ + by_cases hd : d = 0 + · subst hd + simpa using (Subsingleton.measurableSet : MeasurableSet U) + · let i : Fin d := ⟨0, Nat.pos_of_ne_zero hd⟩ + have hrow : Measurable (fun x => fun j => if x ∈ U then a x i j else 0) := + (measurable_pi_iff.mp hmeas) i + have hdiag : Measurable (fun x => if x ∈ U then a x i i else 0) := + (measurable_pi_iff.mp hrow) i + have hU : + U = {x | 0 < if x ∈ U then a x i i else 0} := by + ext x + constructor + · intro hx + rcases hell x hx with ⟨hlam_pos, -, hlower, -⟩ + have hnorm : vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + have hpair : + vecDot (Pi.single i 1 : Vec d) (matVecMul (a x) (Pi.single i 1)) = a x i i := by + rw [vecDot, Finset.sum_eq_single i] + · rw [matVecMul, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + have hdiag_lower : lam ≤ a x i i := by + have hsingle := hlower (Pi.single i 1) + rw [hnorm, hpair] at hsingle + simpa using hsingle + have hdiag_pos : 0 < a x i i := lt_of_lt_of_le hlam_pos hdiag_lower + simp [hx, hdiag_pos] + · intro hx + by_contra hxU + simp [hxU] at hx + rw [hU] + exact measurableSet_Ioi.preimage hdiag + +namespace IsEllipticFieldOn + +theorem mono {d : ℕ} {lam Lam : ℝ} {U V : Set (Vec d)} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) (hV : MeasurableSet V) (hVU : V ⊆ U) : + IsEllipticFieldOn lam Lam V a := by + classical + refine ⟨?_, ?_⟩ + · refine (measurable_pi_iff).2 ?_ + intro i + refine (measurable_pi_iff).2 ?_ + intro j + have hmeasUij : Measurable (fun x : Vec d => if x ∈ U then a x i j else 0) := by + simpa using (measurable_pi_iff.mp (measurable_pi_iff.mp hEll.1 i) j) + have hmeasVij : + Measurable (V.piecewise (fun x : Vec d => if x ∈ U then a x i j else 0) (fun _ => 0)) := + hmeasUij.piecewise hV measurable_const + have hEq : + V.piecewise (fun x : Vec d => if x ∈ U then a x i j else 0) (fun _ => 0) = + (fun x : Vec d => if x ∈ V then a x i j else 0) := by + funext x + by_cases hxV : x ∈ V + · simp [Set.piecewise, hxV, hVU hxV] + · simp [Set.piecewise, hxV] + rw [hEq] at hmeasVij + simpa using hmeasVij + · intro x hx + exact hEll.2 x (hVU hx) + +theorem mono_constants {d : ℕ} {lam Lam lam' Lam' : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) (hlam'_pos : 0 < lam') + (hlam'_le : lam' ≤ lam) (hLam_le : Lam ≤ Lam') : + IsEllipticFieldOn lam' Lam' U a := by + exact ⟨hEll.1, fun x hx => (hEll.2 x hx).mono hlam'_pos hlam'_le hLam_le⟩ + +end IsEllipticFieldOn + +theorem abs_apply_symmPartInv_le_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {x : Vec d} (hx : x ∈ U) (i j : Fin d) : + |(((symmPart (a x))⁻¹ : Mat d) i j)| ≤ lam⁻¹ := + abs_apply_symmPartInv_le_of_isEllipticMatrix (hEll.2 x hx) i j + +private theorem measurable_symmPart_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable (fun x => symmPart (A x) i j) := by + have hij : Measurable (fun x => A x i j) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA i) j + have hji : Measurable (fun x => A x j i) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA j) i + simpa [symmPart, div_eq_mul_inv] using (hij.add hji).mul_const ((2 : ℝ)⁻¹) + +private theorem measurable_matrix_inv_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable (fun x => (((A x : Mat d)⁻¹ : Mat d) i j)) := by + have hdetMap : Measurable (fun M : Fin d → Fin d → ℝ => Matrix.det M) := by + let f : (Fin d → Fin d → ℝ) → ℝ := fun M => Matrix.det M + have hf : Continuous f := by + simpa [f] using! (continuous_id.matrix_det : Continuous f) + exact hf.measurable + have hdet : Measurable (fun x => Matrix.det (A x)) := hdetMap.comp hA + have hadjMap : Measurable (fun M : Fin d → Fin d → ℝ => Matrix.adjugate M i j) := by + let g : (Fin d → Fin d → ℝ) → ℝ := fun M => Matrix.adjugate M i j + have hg : Continuous g := by + simpa [g] using! (((continuous_id.matrix_adjugate).matrix_elem i j) : Continuous g) + exact hg.measurable + have hadj : Measurable (fun x => Matrix.adjugate (A x) i j) := hadjMap.comp hA + change Measurable (fun x => Ring.inverse (Matrix.det (A x)) * Matrix.adjugate (A x) i j) + simpa [Matrix.inv_def] using! hdet.inv.mul hadj + +theorem memVectorL2_matVecMul_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul (a x) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => a x i j * f x j) ?_ + intro j hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + let coeff : Vec d → ℝ := fun x => if x ∈ U then a x i j else 0 + have hcoeff_meas : Measurable coeff := by + simpa [coeff] using (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : AEMeasurable (fun x => a x i j) (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeff_meas).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, hx] + have hterm_meas : + MeasureTheory.AEStronglyMeasurable (fun x => a x i j * f x j) (volumeMeasureOn U) := + hcoeff_ae.aestronglyMeasurable.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖a x i j * f x j‖ ≤ Lam * ‖f x j‖ := by + filter_upwards [hmem] with x hx + have hcoeff_le : |a x i j| ≤ Lam := abs_apply_le_of_isEllipticFieldOn hEll hx i j + calc + ‖a x i j * f x j‖ = |a x i j| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ Lam * ‖f x j‖ := mul_le_mul_of_nonneg_right hcoeff_le (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +theorem memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => symmPart (a x) i j * f x j) ?_ + intro j hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + let coeff : Vec d → ℝ := fun x => if x ∈ U then symmPart (a x) i j else 0 + have hij : Measurable (fun x : Vec d => if x ∈ U then a x i j else 0) := by + simpa using (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have hji : Measurable (fun x : Vec d => if x ∈ U then a x j i else 0) := by + simpa using (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 j) i) + have hcoeff_meas : Measurable coeff := by + let s : Vec d → ℝ := + fun x => (if x ∈ U then a x i j else 0) + (if x ∈ U then a x j i else 0) + have hs : Measurable s := hij.add hji + have hscaled : Measurable (fun x : Vec d => (1 / 2 : ℝ) * s x) := measurable_const.mul hs + convert hscaled using 1 + funext x + by_cases hx : x ∈ U + · simp [coeff, s, symmPart, hx, div_eq_mul_inv] + ring + · simp [coeff, s, symmPart, hx, div_eq_mul_inv] + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : AEMeasurable (fun x => symmPart (a x) i j) (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeff_meas).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, hx] + have hterm_meas : + MeasureTheory.AEStronglyMeasurable (fun x => symmPart (a x) i j * f x j) + (volumeMeasureOn U) := + hcoeff_ae.aestronglyMeasurable.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖symmPart (a x) i j * f x j‖ ≤ Lam * ‖f x j‖ := by + filter_upwards [hmem] with x hx + have hcoeff_ij : |a x i j| ≤ Lam := abs_apply_le_of_isEllipticFieldOn hEll hx i j + have hcoeff_ji : |a x j i| ≤ Lam := abs_apply_le_of_isEllipticFieldOn hEll hx j i + have hsymm : |symmPart (a x) i j| ≤ Lam := by + calc + |symmPart (a x) i j| + = |a x i j + a x j i| * (1 / 2 : ℝ) := by + simp [symmPart, div_eq_mul_inv, abs_mul] + _ = (1 / 2 : ℝ) * |a x i j + a x j i| := by ring + _ ≤ (1 / 2 : ℝ) * (|a x i j| + |a x j i|) := by + gcongr + exact abs_add_le _ _ + _ ≤ Lam := by + nlinarith + calc + ‖symmPart (a x) i j * f x j‖ = |symmPart (a x) i j| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ Lam * ‖f x j‖ := mul_le_mul_of_nonneg_right hsymm (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +theorem memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul ((symmPart (a x))⁻¹) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => (((symmPart (a x))⁻¹ : Mat d) i j) * f x j) ?_ + intro j hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + let aExt : Vec d → Fin d → Fin d → ℝ := fun x => if x ∈ U then a x else 0 + have haExt : Measurable aExt := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + convert (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) using 1 + funext x + by_cases hx : x ∈ U <;> simp [aExt, hx] + let sExt : Vec d → Fin d → Fin d → ℝ := fun x => symmPart (aExt x) + let coeff : Vec d → ℝ := fun x => (((sExt x : Mat d)⁻¹ : Mat d) i j) + have hsymmExt : Measurable sExt := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [sExt] using measurable_symmPart_entry haExt i j + have hcoeff_meas : Measurable coeff := by + simpa [coeff] using measurable_matrix_inv_entry hsymmExt i j + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : + AEMeasurable (fun x => (((symmPart (a x))⁻¹ : Mat d) i j)) (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeff_meas).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, sExt, aExt, hx] + have hterm_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => (((symmPart (a x))⁻¹ : Mat d) i j) * f x j) (volumeMeasureOn U) := + hcoeff_ae.aestronglyMeasurable.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖(((symmPart (a x))⁻¹ : Mat d) i j) * f x j‖ ≤ lam⁻¹ * ‖f x j‖ := by + filter_upwards [hmem] with x hx + have hcoeff_le : + |(((symmPart (a x))⁻¹ : Mat d) i j)| ≤ lam⁻¹ := + abs_apply_symmPartInv_le_of_isEllipticFieldOn hEll hx i j + calc + ‖(((symmPart (a x))⁻¹ : Mat d) i j) * f x j‖ + = |(((symmPart (a x))⁻¹ : Mat d) i j)| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ lam⁻¹ * ‖f x j‖ := mul_le_mul_of_nonneg_right hcoeff_le (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +theorem memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul (skewPart (a x)) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => skewPart (a x) i j * f x j) ?_ + intro j hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + let coeff : Vec d → ℝ := fun x => if x ∈ U then skewPart (a x) i j else 0 + have hij : Measurable (fun x : Vec d => if x ∈ U then a x i j else 0) := by + simpa using (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have hji : Measurable (fun x : Vec d => if x ∈ U then a x j i else 0) := by + simpa using (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 j) i) + have hcoeff_meas : Measurable coeff := by + let s : Vec d → ℝ := + fun x => (if x ∈ U then a x i j else 0) - (if x ∈ U then a x j i else 0) + have hs : Measurable s := hij.sub hji + have hscaled : Measurable (fun x : Vec d => (1 / 2 : ℝ) * s x) := measurable_const.mul hs + convert hscaled using 1 + funext x + by_cases hx : x ∈ U + · simp [coeff, s, skewPart, hx, sub_eq_add_neg, div_eq_mul_inv] + ring + · simp [coeff, s, skewPart, hx, sub_eq_add_neg, div_eq_mul_inv] + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : AEMeasurable (fun x => skewPart (a x) i j) (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeff_meas).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, hx] + have hterm_meas : + MeasureTheory.AEStronglyMeasurable (fun x => skewPart (a x) i j * f x j) + (volumeMeasureOn U) := + hcoeff_ae.aestronglyMeasurable.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖skewPart (a x) i j * f x j‖ ≤ Lam * ‖f x j‖ := by + filter_upwards [hmem] with x hx + have hcoeff_ij : |a x i j| ≤ Lam := abs_apply_le_of_isEllipticFieldOn hEll hx i j + have hcoeff_ji : |a x j i| ≤ Lam := abs_apply_le_of_isEllipticFieldOn hEll hx j i + have hskew : |skewPart (a x) i j| ≤ Lam := by + have hsub : + |a x i j - a x j i| ≤ |a x i j| + |a x j i| := by + simpa [sub_eq_add_neg, abs_neg] using abs_add_le (a x i j) (-a x j i) + calc + |skewPart (a x) i j| + = |a x i j - a x j i| * (1 / 2 : ℝ) := by + simp [skewPart, div_eq_mul_inv, abs_mul] + _ = (1 / 2 : ℝ) * |a x i j - a x j i| := by ring + _ ≤ (1 / 2 : ℝ) * (|a x i j| + |a x j i|) := by + gcongr + _ ≤ Lam := by + nlinarith + calc + ‖skewPart (a x) i j * f x j‖ = |skewPart (a x) i j| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ Lam * ‖f x j‖ := mul_le_mul_of_nonneg_right hskew (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +noncomputable def restrictCoeffField {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : CoeffField d := by + classical + exact fun x => if x ∈ U then a x else 0 + +@[simp] theorem restrictCoeffField_apply_of_mem {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {x : Vec d} (hx : x ∈ U) : + restrictCoeffField U a x = a x := by + simp [restrictCoeffField, hx] + +@[simp] theorem restrictCoeffField_apply_of_not_mem {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {x : Vec d} (hx : x ∉ U) : + restrictCoeffField U a x = 0 := by + simp [restrictCoeffField, hx] + +@[simp] theorem restrictCoeffField_univ {d : ℕ} (a : CoeffField d) : + restrictCoeffField Set.univ a = a := by + funext x + simp [restrictCoeffField] + +@[simp] theorem restrictCoeffField_empty {d : ℕ} (a : CoeffField d) : + restrictCoeffField (∅ : Set (Vec d)) a = 0 := by + funext x + simp [restrictCoeffField] + +/-- Extension companion to `restrictCoeffField`: outside `U` we insert the +identity matrix, matching the Chapter-2 note convention. -/ +noncomputable def extendByIdCoeffField {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : + CoeffField d := by + classical + exact fun x => if x ∈ U then a x else 1 + +@[simp] theorem extendByIdCoeffField_apply_of_mem {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {x : Vec d} (hx : x ∈ U) : + extendByIdCoeffField U a x = a x := by + simp [extendByIdCoeffField, hx] + +@[simp] theorem extendByIdCoeffField_apply_of_not_mem {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {x : Vec d} (hx : x ∉ U) : + extendByIdCoeffField U a x = 1 := by + simp [extendByIdCoeffField, hx] + +@[simp] theorem extendByIdCoeffField_univ {d : ℕ} (a : CoeffField d) : + extendByIdCoeffField Set.univ a = a := by + funext x + simp [extendByIdCoeffField] + +@[simp] theorem extendByIdCoeffField_empty {d : ℕ} (a : CoeffField d) : + extendByIdCoeffField (∅ : Set (Vec d)) a = 1 := by + funext x + simp [extendByIdCoeffField] + +@[simp] theorem restrictCoeffField_extendByIdCoeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : + restrictCoeffField U (extendByIdCoeffField U a) = restrictCoeffField U a := by + funext x + by_cases hx : x ∈ U <;> simp [restrictCoeffField, extendByIdCoeffField, hx] + +def translateCoeffField {d : ℕ} (z : Vec d) (a : CoeffField d) : CoeffField d := + fun x => a (fun i => x i + z i) + +noncomputable def symmCoeffField {d : ℕ} (a : CoeffField d) : CoeffField d := + fun x => symmPart (a x) + +noncomputable def skewCoeffField {d : ℕ} (a : CoeffField d) : CoeffField d := + fun x => skewPart (a x) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientFieldHilbert.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientFieldHilbert.lean new file mode 100644 index 0000000000..76bffdbb88 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/CoefficientFieldHilbert.lean @@ -0,0 +1,498 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.Topology.Instances.Matrix + +/-! # Coefficient Field Hilbert -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +local instance matMeasurableSpace {d : ℕ} : MeasurableSpace (Mat d) := + inferInstanceAs (MeasurableSpace (Fin d → Fin d → ℝ)) + +local instance matBorelSpace {d : ℕ} : BorelSpace (Mat d) := + inferInstanceAs (BorelSpace (Fin d → Fin d → ℝ)) + +local instance hilbertVecOperatorMeasurableSpace {d : ℕ} : + MeasurableSpace (HilbertVec d →L[ℝ] HilbertVec d) := + borel (HilbertVec d →L[ℝ] HilbertVec d) + +local instance hilbertVecOperatorBorelSpace {d : ℕ} : + BorelSpace (HilbertVec d →L[ℝ] HilbertVec d) := + ⟨rfl⟩ + +/-- A matrix acts continuously on the project's algebraic vector carrier. -/ +noncomputable def matContinuousLinearMap {d : ℕ} (A : Mat d) : + Vec d →L[ℝ] Vec d := + ⟨Matrix.toLin' A, (Matrix.toLin' A).continuous_of_finiteDimensional⟩ + +@[simp] theorem matContinuousLinearMap_apply {d : ℕ} (A : Mat d) (x : Vec d) : + matContinuousLinearMap A x = matVecMul A x := + rfl + +namespace HilbertVec + +/-- A matrix acts continuously on the Euclidean Hilbert realization of `\R^d` +by conjugating the algebraic action through `HilbertVec d ≃L[ℝ] Vec d`. -/ +noncomputable def applyMat {d : ℕ} (A : Mat d) : + HilbertVec d →L[ℝ] HilbertVec d := + ((continuousLinearEquivVec d).symm.toContinuousLinearMap).comp + ((matContinuousLinearMap A).comp + (continuousLinearEquivVec d).toContinuousLinearMap) + +@[simp] theorem applyMat_apply {d : ℕ} (A : Mat d) (x : HilbertVec d) : + applyMat A x = ofVec (matVecMul A x.toVec) := by + simp [applyMat] + +@[simp] theorem applyMat_zero {d : ℕ} : + applyMat (0 : Mat d) = 0 := by + ext x i + simp [applyMat_apply, matVecMul] + +@[simp] theorem norm_sq_ofVec {d : ℕ} (x : Vec d) : + ‖ofVec x‖ ^ 2 = vecDot x x := by + rw [norm_sq_eq_sum_sq] + simp [vecDot, pow_two] + +@[simp] theorem norm_sq_eq_vecDot {d : ℕ} (x : HilbertVec d) : + ‖x‖ ^ 2 = vecDot x.toVec x.toVec := by + simpa [ofVec_toVec x] using norm_sq_ofVec x.toVec + +@[simp] theorem inner_ofVec_applyMat {d : ℕ} (A : Mat d) (x y : Vec d) : + inner ℝ (ofVec x) (applyMat A (ofVec y)) = + vecDot x (matVecMul A y) := by + simp [applyMat_apply, inner_def] + +@[simp] theorem norm_sq_applyMat {d : ℕ} (A : Mat d) (x : HilbertVec d) : + ‖applyMat A x‖ ^ 2 = + vecDot (matVecMul A x.toVec) (matVecMul A x.toVec) := by + rw [applyMat_apply, norm_sq_ofVec] + +theorem opNorm_applyMat_le_of_vec_bound {d : ℕ} {A : Mat d} {C : ℝ} + (hC : 0 ≤ C) + (hA : ∀ ξ : Vec d, + vecDot (matVecMul A ξ) (matVecMul A ξ) ≤ C ^ 2 * vecDot ξ ξ) : + ‖applyMat A‖ ≤ C := by + refine ContinuousLinearMap.opNorm_le_bound _ hC ?_ + intro x + have hsq : + ‖applyMat A x‖ ^ 2 ≤ (C * ‖x‖) ^ 2 := by + calc + ‖applyMat A x‖ ^ 2 + = vecDot (matVecMul A x.toVec) (matVecMul A x.toVec) := by + rw [norm_sq_applyMat] + _ ≤ C ^ 2 * vecDot x.toVec x.toVec := hA x.toVec + _ = C ^ 2 * ‖x‖ ^ 2 := by + rw [norm_sq_eq_vecDot] + _ = (C * ‖x‖) ^ 2 := by + ring + have hCnorm_nonneg : 0 ≤ C * ‖x‖ := mul_nonneg hC (norm_nonneg x) + have habs : |‖applyMat A x‖| ≤ |C * ‖x‖| := sq_le_sq.mp hsq + simpa [abs_of_nonneg (norm_nonneg _), abs_of_nonneg hCnorm_nonneg] using habs + +theorem opNorm_applyMat_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) : + ‖applyMat A‖ ≤ Lam := by + refine opNorm_applyMat_le_of_vec_bound (A := A) ?_ ?_ + · exact le_trans (le_of_lt hA.1) hA.2.1 + · intro ξ + simpa [vecNormSq] using vecNormSq_matVecMul_le_of_isEllipticMatrix hA ξ + +end HilbertVec + +/-- +Measurable uniformly bounded pointwise operator fields on the Hilbert-vector +carrier over `U`. + +This is the vector-side analogue of the doubled `MuOperator` infrastructure. +-/ +structure PointwiseHilbertVecOperatorField {d : ℕ} (U : Set (Vec d)) where + /-- The pointwise operator field. -/ + field : Vec d → HilbertVec d →L[ℝ] HilbertVec d + /-- Measurability of the operator field. -/ + measurable_field : Measurable field + /-- A uniform operator-norm bound. -/ + opNormBound : ℝ + /-- Nonnegativity of the bound. -/ + opNormBound_nonneg : 0 ≤ opNormBound + /-- The pointwise operators are bounded by `opNormBound`. -/ + le_opNormBound : ∀ x : Vec d, ‖field x‖ ≤ opNormBound + +namespace PointwiseHilbertVecOperatorField + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Pointwise action of the operator field on a typed `L²` vector field. -/ +def applyFn (M : PointwiseHilbertVecOperatorField U) (F : HilbertVectorL2 U) : + Vec d → HilbertVec d := + fun x => M.field x (F x) + +theorem aestronglyMeasurable_applyFn (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + MeasureTheory.AEStronglyMeasurable (M.applyFn F) (volumeMeasureOn U) := by + let evalCLM : + (HilbertVec d →L[ℝ] HilbertVec d) →L[ℝ] + HilbertVec d →L[ℝ] HilbertVec d := + ContinuousLinearMap.flip (ContinuousLinearMap.apply ℝ (HilbertVec d)) + have hfield : + MeasureTheory.AEStronglyMeasurable M.field (volumeMeasureOn U) := + M.measurable_field.aestronglyMeasurable (μ := volumeMeasureOn U) + have hF := MeasureTheory.Lp.aestronglyMeasurable (μ := volumeMeasureOn U) F + simpa [applyFn, evalCLM] using! + ContinuousLinearMap.aestronglyMeasurable_comp₂ (L := evalCLM) hfield hF + +theorem memHilbertVectorL2_applyFn (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + MemHilbertVectorL2 U (M.applyFn F) := by + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖M.applyFn F x‖ ≤ M.opNormBound * ‖F x‖ := by + refine Filter.Eventually.of_forall ?_ + intro x + calc + ‖M.applyFn F x‖ = ‖M.field x (F x)‖ := rfl + _ ≤ ‖M.field x‖ * ‖F x‖ := (M.field x).le_opNorm (F x) + _ ≤ M.opNormBound * ‖F x‖ := by + exact mul_le_mul_of_nonneg_right (M.le_opNormBound x) (norm_nonneg _) + exact + MeasureTheory.MemLp.of_le_mul + (MeasureTheory.Lp.memLp F) + (M.aestronglyMeasurable_applyFn F) + hbound + +/-- The typed `L²` field obtained by applying the operator field pointwise. -/ +noncomputable def apply (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : HilbertVectorL2 U := + toHilbertVectorL2 (M.memHilbertVectorL2_applyFn F) + +theorem coeFn_apply (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + M.apply F =ᵐ[volumeMeasureOn U] M.applyFn F := + coeFn_toHilbertVectorL2 (M.memHilbertVectorL2_applyFn F) + +theorem apply_add (M : PointwiseHilbertVecOperatorField U) + (F G : HilbertVectorL2 U) : + M.apply (F + G) = M.apply F + M.apply G := by + apply MeasureTheory.Lp.ext + filter_upwards + [M.coeFn_apply (F + G), M.coeFn_apply F, M.coeFn_apply G, + MeasureTheory.Lp.coeFn_add F G, MeasureTheory.Lp.coeFn_add (M.apply F) (M.apply G)] + with x hFG hF hG hdom hcod + have hdom' : (F + G) x = F x + G x := by + simpa using hdom + have hcod' : (M.apply F + M.apply G) x = M.apply F x + M.apply G x := by + simpa using hcod + rw [hFG] + calc + M.applyFn (F + G) x = M.field x ((F + G) x) := rfl + _ = M.field x (F x + G x) := by rw [hdom'] + _ = M.field x (F x) + M.field x (G x) := map_add (M.field x) (F x) (G x) + _ = M.applyFn F x + M.applyFn G x := rfl + _ = M.apply F x + M.apply G x := by rw [← hF, ← hG] + _ = (M.apply F + M.apply G) x := by rw [hcod'] + +theorem apply_smul (M : PointwiseHilbertVecOperatorField U) + (c : ℝ) (F : HilbertVectorL2 U) : + M.apply (c • F) = c • M.apply F := by + apply MeasureTheory.Lp.ext + filter_upwards + [M.coeFn_apply (c • F), M.coeFn_apply F, + MeasureTheory.Lp.coeFn_smul c F, MeasureTheory.Lp.coeFn_smul c (M.apply F)] + with x hCF hF hdom hcod + have hdom' : (c • F) x = c • F x := by + simpa using hdom + have hcod' : (c • M.apply F) x = c • M.apply F x := by + simpa using hcod + rw [hCF] + calc + M.applyFn (c • F) x = M.field x ((c • F) x) := rfl + _ = M.field x (c • F x) := by rw [hdom'] + _ = c • M.field x (F x) := map_smul (M.field x) c (F x) + _ = c • M.applyFn F x := by rfl + _ = c • M.apply F x := by rw [← hF] + _ = (c • M.apply F) x := by rw [hcod'] + +theorem norm_apply_le (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + ‖M.apply F‖ ≤ M.opNormBound * ‖F‖ := by + apply MeasureTheory.Lp.norm_le_mul_norm_of_ae_le_mul + filter_upwards [M.coeFn_apply F] with x hF + calc + ‖M.apply F x‖ = ‖M.field x (F x)‖ := by + rw [hF] + simp [applyFn] + _ ≤ ‖M.field x‖ * ‖F x‖ := (M.field x).le_opNorm (F x) + _ ≤ M.opNormBound * ‖F x‖ := by + exact mul_le_mul_of_nonneg_right (M.le_opNormBound x) (norm_nonneg _) + +/-- The bounded operator on `L²(U; \R^d)` induced by the pointwise operator +field. -/ +noncomputable def toContinuousLinearMap (M : PointwiseHilbertVecOperatorField U) : + HilbertVectorL2 U →L[ℝ] HilbertVectorL2 U := by + let L : HilbertVectorL2 U →ₗ[ℝ] HilbertVectorL2 U := + { toFun := M.apply + map_add' := M.apply_add + map_smul' := M.apply_smul } + exact L.mkContinuous M.opNormBound (M.norm_apply_le) + +@[simp] theorem toContinuousLinearMap_apply (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + M.toContinuousLinearMap F = M.apply F := by + simp [toContinuousLinearMap] + +theorem coeFn_toContinuousLinearMap (M : PointwiseHilbertVecOperatorField U) + (F : HilbertVectorL2 U) : + M.toContinuousLinearMap F =ᵐ[volumeMeasureOn U] M.applyFn F := + (M.toContinuousLinearMap_apply F).symm ▸ M.coeFn_apply F + +end PointwiseHilbertVecOperatorField + +/-- The linear map sending a matrix to its operator on the finite Hilbert space. -/ +noncomputable def matToHilbertOperatorLinear (d : ℕ) : + Mat d →ₗ[ℝ] (HilbertVec d →L[ℝ] HilbertVec d) where + toFun := HilbertVec.applyMat + map_add' := by + intro A B + apply ContinuousLinearMap.ext + intro x + apply HilbertVec.ext + intro i + simp [HilbertVec.applyMat_apply, matVecMul, Finset.sum_add_distrib, add_mul] + map_smul' := by + intro c A + apply ContinuousLinearMap.ext + intro x + apply HilbertVec.ext + intro i + simp [HilbertVec.applyMat_apply, matVecMul, Finset.mul_sum, mul_assoc] + +/-- The continuous linear map sending a matrix to its Hilbert-space operator. -/ +noncomputable def matToHilbertOperator (d : ℕ) : + Mat d →L[ℝ] (HilbertVec d →L[ℝ] HilbertVec d) := + ⟨matToHilbertOperatorLinear d, + (matToHilbertOperatorLinear d).continuous_of_finiteDimensional⟩ + +private theorem measurable_matToHilbertOperator {d : ℕ} {α : Type*} + [MeasurableSpace α] {A : α → Mat d} (hA : Measurable A) : + Measurable (fun x => matToHilbertOperator d (A x)) := by + exact (matToHilbertOperator d).continuous.measurable.comp hA + +@[simp] private theorem matToHilbertOperator_apply {d : ℕ} (A : Mat d) : + matToHilbertOperator d A = HilbertVec.applyMat A := by + rfl + +/-- The pointwise Hilbert-vector operator field induced by an elliptic +coefficient field on `U`. Outside `U` we insert the zero matrix to keep the +field globally measurable. -/ +noncomputable def hilbertCoeffOperatorField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) : + PointwiseHilbertVecOperatorField U := by + classical + have hmeasA : + Measurable (fun x : Vec d => fun i j => if x ∈ U then a x i j else 0) := + hEll.1 + refine + { field := fun x => matToHilbertOperator d (fun i j => if x ∈ U then a x i j else 0) + measurable_field := + by + exact + (measurable_matToHilbertOperator + (A := fun x : Vec d => (fun i j => if x ∈ U then a x i j else 0 : Mat d)) + hmeasA) + opNormBound := max Lam 0 + opNormBound_nonneg := le_max_right _ _ + le_opNormBound := ?_ } + intro x + by_cases hx : x ∈ U + · have hAx : (fun i j => if x ∈ U then a x i j else 0 : Mat d) = a x := by + funext i j + simp [hx] + calc + ‖matToHilbertOperator d (fun i j => if x ∈ U then a x i j else 0)‖ + = ‖HilbertVec.applyMat (a x)‖ := by + rw [hAx, matToHilbertOperator_apply] + _ ≤ Lam := HilbertVec.opNorm_applyMat_le_of_isEllipticMatrix (hEll.2 x hx) + _ ≤ max Lam 0 := le_max_left _ _ + · have hAx : (fun i j => if x ∈ U then a x i j else 0 : Mat d) = 0 := by + funext i j + simp [hx] + calc + ‖matToHilbertOperator d (fun i j => if x ∈ U then a x i j else 0)‖ + = ‖HilbertVec.applyMat (0 : Mat d)‖ := by + rw [hAx]; exact congrArg norm (matToHilbertOperator_apply 0) + _ = 0 := by simp + _ ≤ max Lam 0 := le_max_right _ _ + +/-- The bounded operator on `L²(U; \R^d)` induced by an elliptic coefficient +field. -/ +noncomputable def hilbertCoeffOperator {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) : + HilbertVectorL2 U →L[ℝ] HilbertVectorL2 U := + (hilbertCoeffOperatorField (U := U) hEll).toContinuousLinearMap + +theorem ae_hilbertCoeffOperator_apply {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + (F : HilbertVectorL2 U) : + hilbertCoeffOperator hEll F =ᵐ[volumeMeasureOn U] + fun x => HilbertVec.applyMat (a x) (F x) := by + classical + have happly := (hilbertCoeffOperatorField (U := U) hEll).coeFn_toContinuousLinearMap F + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [happly, hmem] with x hx hUx + have hAx : (fun i j => if x ∈ U then a x i j else 0 : Mat d) = a x := by + funext i j + simp [hUx] + change ((hilbertCoeffOperatorField (U := U) hEll).toContinuousLinearMap F) x = + HilbertVec.applyMat (a x) (F x) + rw [hx] + change (hilbertCoeffOperatorField (U := U) hEll).field x (F x) = + HilbertVec.applyMat (a x) (F x) + simp [hilbertCoeffOperatorField, hAx] + +theorem hilbertCoeffOperator_toHilbertVectorL2OfVecField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + hilbertCoeffOperator hEll (toHilbertVectorL2OfVecField hf) = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll hf) := by + apply MeasureTheory.Lp.ext + filter_upwards + [ae_hilbertCoeffOperator_apply hEll (toHilbertVectorL2OfVecField hf), + coeFn_toHilbertVectorL2OfVecField (U := U) (f := f) hf, + coeFn_toHilbertVectorL2OfVecField + (U := U) + (f := fun x => matVecMul (a x) (f x)) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll hf)] + with x hx hF hAxF + rw [hx, hF, hAxF] + simp [HilbertVec.applyMat_apply, hilbertifyVecField] + +/-- The pointwise Hilbert-vector operator field induced by the symmetric part +of an elliptic coefficient field. Outside `U` we insert the zero matrix to keep +the field globally measurable. -/ +noncomputable def hilbertSymmCoeffOperatorField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) : + PointwiseHilbertVecOperatorField U := by + classical + let aExt : Vec d → Mat d := fun x => if x ∈ U then a x else 0 + have haExt : Measurable aExt := by + have hdef : + aExt = fun x : Vec d => (fun i j => if x ∈ U then a x i j else 0 : Mat d) := by + funext x i j + by_cases hx : x ∈ U <;> simp [aExt, hx] + rw [hdef] + exact hEll.1 + have hmeasSymm : Measurable (fun x : Vec d => symmPart (aExt x)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + have hij : Measurable (fun x : Vec d => aExt x i j) := + measurable_pi_iff.1 (measurable_pi_iff.1 haExt i) j + have hji : Measurable (fun x : Vec d => aExt x j i) := + measurable_pi_iff.1 (measurable_pi_iff.1 haExt j) i + simpa [symmPart, div_eq_mul_inv] using (hij.add hji).mul_const ((2 : ℝ)⁻¹) + refine + { field := fun x => matToHilbertOperator d (symmPart (aExt x)) + measurable_field := + by + exact + (measurable_matToHilbertOperator + (A := fun x : Vec d => symmPart (aExt x)) + hmeasSymm) + opNormBound := max Lam 0 + opNormBound_nonneg := le_max_right _ _ + le_opNormBound := ?_ } + intro x + by_cases hx : x ∈ U + · have hAx : aExt x = a x := by + simp [aExt, hx] + have hLam_nonneg : 0 ≤ Lam := le_trans (le_of_lt (hEll.2 x hx).1) (hEll.2 x hx).2.1 + calc + ‖matToHilbertOperator d (symmPart (aExt x))‖ + = ‖HilbertVec.applyMat (symmPart (a x))‖ := by + rw [hAx, matToHilbertOperator_apply] + _ ≤ Lam := by + refine HilbertVec.opNorm_applyMat_le_of_vec_bound hLam_nonneg ?_ + intro ξ + simpa [vecNormSq] using + vecNormSq_matVecMul_symmPart_le_of_isEllipticMatrix (hEll.2 x hx) ξ + _ ≤ max Lam 0 := le_max_left _ _ + · have hAx : aExt x = 0 := by + simp [aExt, hx] + have hSymmZero : symmPart (0 : Mat d) = 0 := by + funext i j + simp [symmPart] + calc + ‖matToHilbertOperator d (symmPart (aExt x))‖ + = ‖HilbertVec.applyMat (0 : Mat d)‖ := by + rw [hAx] + rw [hSymmZero, matToHilbertOperator_apply] + _ = 0 := by simp + _ ≤ max Lam 0 := le_max_right _ _ + +/-- The bounded operator on `L²(U; \R^d)` induced by the symmetric part of an +elliptic coefficient field. -/ +noncomputable def hilbertSymmCoeffOperator {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) : + HilbertVectorL2 U →L[ℝ] HilbertVectorL2 U := + (hilbertSymmCoeffOperatorField (U := U) hEll).toContinuousLinearMap + +theorem ae_hilbertSymmCoeffOperator_apply {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + (F : HilbertVectorL2 U) : + hilbertSymmCoeffOperator hEll F =ᵐ[volumeMeasureOn U] + fun x => HilbertVec.applyMat (symmPart (a x)) (F x) := by + classical + let aExt : Vec d → Mat d := fun x => if x ∈ U then a x else 0 + have happly := (hilbertSymmCoeffOperatorField (U := U) hEll).coeFn_toContinuousLinearMap F + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [happly, hmem] with x hx hUx + have hAx : aExt x = a x := by + simp [aExt, hUx] + change ((hilbertSymmCoeffOperatorField (U := U) hEll).toContinuousLinearMap F) x = + HilbertVec.applyMat (symmPart (a x)) (F x) + rw [hx] + change (hilbertSymmCoeffOperatorField (U := U) hEll).field x (F x) = + HilbertVec.applyMat (symmPart (a x)) (F x) + simp [hilbertSymmCoeffOperatorField, aExt, hAx] + +theorem hilbertSymmCoeffOperator_toHilbertVectorL2OfVecField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (hEll : IsEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + hilbertSymmCoeffOperator hEll (toHilbertVectorL2OfVecField hf) = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hf) := by + apply MeasureTheory.Lp.ext + filter_upwards + [ae_hilbertSymmCoeffOperator_apply hEll (toHilbertVectorL2OfVecField hf), + coeFn_toHilbertVectorL2OfVecField (U := U) (f := f) hf, + coeFn_toHilbertVectorL2OfVecField + (U := U) + (f := fun x => matVecMul (symmPart (a x)) (f x)) + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hf)] + with x hx hF hAxF + rw [hx, hF, hAxF] + simp [HilbertVec.applyMat_apply, hilbertifyVecField] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/Euclidean.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/Euclidean.lean new file mode 100644 index 0000000000..a7ce009ee0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/Euclidean.lean @@ -0,0 +1,134 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite + +/-! # Euclidean -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Explicit Euclidean magnitude on `Vec d` + +The project's algebraic carrier `Vec d = Fin d → ℝ` deliberately retains its +default product/sup norm. This file supplies the Euclidean magnitude and +distance as explicit real-valued functions on that same carrier, without +introducing a competing norm or metric instance. +-/ + +/-- The Euclidean magnitude of a project vector. -/ +noncomputable def euclideanNorm {d : ℕ} (x : Vec d) : ℝ := + Real.sqrt (vecNormSq x) + +/-- The Euclidean distance between two project vectors. -/ +noncomputable def euclideanDist {d : ℕ} (x y : Vec d) : ℝ := + euclideanNorm (x - y) + +theorem euclideanNorm_nonneg {d : ℕ} (x : Vec d) : + 0 ≤ euclideanNorm x := + Real.sqrt_nonneg _ + +@[simp] theorem euclideanNorm_sq {d : ℕ} (x : Vec d) : + euclideanNorm x ^ 2 = vecNormSq x := by + rw [euclideanNorm, Real.sq_sqrt (vecNormSq_nonneg x)] + +@[simp] theorem euclideanNorm_eq_zero_iff {d : ℕ} {x : Vec d} : + euclideanNorm x = 0 ↔ x = 0 := by + rw [euclideanNorm, Real.sqrt_eq_zero (vecNormSq_nonneg x), vecNormSq_eq_zero_iff] + +@[simp] theorem euclideanNorm_zero {d : ℕ} : + euclideanNorm (0 : Vec d) = 0 := by + simp [euclideanNorm, vecNormSq, vecDot] + +@[simp] theorem euclideanNorm_neg {d : ℕ} (x : Vec d) : + euclideanNorm (-x) = euclideanNorm x := by + unfold euclideanNorm + congr 1 + unfold vecNormSq vecDot + refine Finset.sum_congr rfl ?_ + intro i _hi + simp + +@[simp] theorem euclideanNorm_smul {d : ℕ} (c : ℝ) (x : Vec d) : + euclideanNorm (c • x) = |c| * euclideanNorm x := by + rw [← sq_eq_sq₀ (euclideanNorm_nonneg _) (mul_nonneg (abs_nonneg _) (euclideanNorm_nonneg _)), + euclideanNorm_sq, vecNormSq_smul, mul_pow, sq_abs, euclideanNorm_sq] + +/-- The explicit Euclidean magnitude agrees with the norm on the separate +Euclidean Hilbert realization of the same vector. -/ +theorem euclideanNorm_eq_norm_ofVec {d : ℕ} (x : Vec d) : + euclideanNorm x = ‖HilbertVec.ofVec x‖ := by + rw [← sq_eq_sq₀ (euclideanNorm_nonneg _) (norm_nonneg _), euclideanNorm_sq, + HilbertVec.norm_sq_eq_sum_sq] + simp [vecNormSq, vecDot, pow_two] + +theorem euclideanDist_nonneg {d : ℕ} (x y : Vec d) : + 0 ≤ euclideanDist x y := + euclideanNorm_nonneg _ + +@[simp] theorem euclideanDist_self {d : ℕ} (x : Vec d) : + euclideanDist x x = 0 := by + simp [euclideanDist] + +@[simp] theorem euclideanDist_eq_zero_iff {d : ℕ} {x y : Vec d} : + euclideanDist x y = 0 ↔ x = y := by + rw [euclideanDist, euclideanNorm_eq_zero_iff, sub_eq_zero] + +theorem euclideanDist_comm {d : ℕ} (x y : Vec d) : + euclideanDist x y = euclideanDist y x := by + unfold euclideanDist + have hsub : y - x = -(x - y) := by + ext i + simp + rw [hsub, euclideanNorm_neg] + +/-- Squaring the explicit Euclidean distance recovers the coordinate square +sum of the displacement. -/ +@[simp] theorem euclideanDist_sq {d : ℕ} (x y : Vec d) : + euclideanDist x y ^ 2 = vecNormSq (x - y) := + euclideanNorm_sq (x - y) + +/-- Scalar dilations scale explicit Euclidean distance by the scalar's +absolute value. -/ +theorem euclideanDist_smul {d : ℕ} (c : ℝ) (x y : Vec d) : + euclideanDist (c • x) (c • y) = |c| * euclideanDist x y := by + have hsub : c • x - c • y = c • (x - y) := by + ext i + simp only [Pi.smul_apply, Pi.sub_apply, smul_eq_mul] + ring + rw [euclideanDist, hsub, euclideanNorm_smul] + rfl + +/-- Translating both arguments by the same vector leaves explicit Euclidean +distance unchanged. -/ +theorem euclideanDist_add_right {d : ℕ} (x y z : Vec d) : + euclideanDist (x + z) (y + z) = euclideanDist x y := by + have hsub : x + z - (y + z) = x - y := by + ext i + simp + rw [euclideanDist, hsub] + rfl + +/-- The explicit Euclidean distance agrees with the Hilbert distance on the +separate Euclidean realization of project vectors. -/ +theorem euclideanDist_eq_norm_sub_ofVec {d : ℕ} (x y : Vec d) : + euclideanDist x y = ‖HilbertVec.ofVec x - HilbertVec.ofVec y‖ := by + rw [euclideanDist, euclideanNorm_eq_norm_ofVec] + congr 1 + +@[simp] theorem euclideanDist_zero_left {d : ℕ} (x : Vec d) : + euclideanDist 0 x = euclideanNorm x := by + simp [euclideanDist] + +@[simp] theorem euclideanDist_zero_right {d : ℕ} (x : Vec d) : + euclideanDist x 0 = euclideanNorm x := by + simp [euclideanDist] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/HilbertFinite.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/HilbertFinite.lean new file mode 100644 index 0000000000..36ffe027cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/HilbertFinite.lean @@ -0,0 +1,419 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import Mathlib.Analysis.InnerProductSpace.PiL2 + +/-! # Hilbert Finite -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file provides finite-dimensional Hilbert realizations of `\R^d` and +`\R^{2d}` that stay compatible with the project's anti-`EuclideanSpace` +architecture. + +The ambient algebraic carriers remain + +- `Vec d = Fin d → ℝ`, +- `BlockVec d = Vec d × Vec d`. + +Those are excellent lightweight types for most of the development, but their +default normed-space instances are not the Euclidean `L²` ones needed for the +Hilbert-space part of the coarse-graining theory. For that role we introduce +separate wrappers built from `PiLp 2`. +-/ + +/-- The Euclidean Hilbert realization of `\R^d`, presented without exposing +`EuclideanSpace` in the public API. -/ +abbrev HilbertVec (d : ℕ) := PiLp 2 (fun _ : Fin d => ℝ) + +namespace HilbertVec + +/-- Promote the project's algebraic vector carrier into the Euclidean Hilbert +carrier. -/ +abbrev ofVec {d : ℕ} (x : Vec d) : HilbertVec d := + WithLp.toLp 2 x + +/-- Forget the Hilbert structure and return to the project's algebraic vector +carrier. -/ +abbrev toVec {d : ℕ} (x : HilbertVec d) : Vec d := + fun i => x i + +@[simp] theorem toVec_ofVec {d : ℕ} (x : Vec d) : (ofVec x).toVec = x := by + funext i + exact PiLp.toLp_apply 2 (fun _ : Fin d => ℝ) x i + +@[simp] theorem ofVec_toVec {d : ℕ} (x : HilbertVec d) : ofVec x.toVec = x := by + apply PiLp.ext + intro i + simp [toVec] + +@[ext] theorem ext {d : ℕ} {x y : HilbertVec d} (h : ∀ i, x i = y i) : x = y := + PiLp.ext h + +/-- Algebraic identification between the Euclidean Hilbert carrier and the +project's lightweight vector carrier. -/ +def linearEquivVec (d : ℕ) : HilbertVec d ≃ₗ[ℝ] Vec d where + toFun := toVec + invFun := ofVec + left_inv := ofVec_toVec + right_inv := toVec_ofVec + map_add' _ _ := rfl + map_smul' _ _ := rfl + +/-- Continuous linear identification between the Euclidean Hilbert carrier and +the project's lightweight vector carrier. -/ +noncomputable def continuousLinearEquivVec (d : ℕ) : HilbertVec d ≃L[ℝ] Vec d := + (linearEquivVec d).toContinuousLinearEquiv + +@[simp] theorem continuousLinearEquivVec_apply {d : ℕ} (x : HilbertVec d) : + continuousLinearEquivVec d x = x.toVec := + rfl + +@[simp] theorem continuousLinearEquivVec_symm_apply {d : ℕ} (x : Vec d) : + (continuousLinearEquivVec d).symm x = ofVec x := + rfl + +@[simp] theorem inner_def {d : ℕ} (x y : HilbertVec d) : + inner ℝ x y = vecDot x.toVec y.toVec := by + rw [PiLp.inner_apply, vecDot] + simp_rw [RCLike.inner_apply] + congr with i + simp [toVec, mul_comm] + +@[simp] theorem norm_sq_eq_sum_sq {d : ℕ} (x : HilbertVec d) : + ‖x‖ ^ 2 = ∑ i, x i ^ 2 := by + simpa [sq_abs] using (PiLp.norm_sq_eq_of_L2 (β := fun _ : Fin d => ℝ) x) + +theorem abs_apply_le_norm {d : ℕ} (x : HilbertVec d) (i : Fin d) : + |x i| ≤ ‖x‖ := by + have hcoord : + |x i| ^ 2 ≤ ∑ j : Fin d, x j ^ 2 := by + calc + |x i| ^ 2 = x i ^ 2 := by rw [sq_abs] + _ ≤ ∑ j : Fin d, x j ^ 2 := by + simpa using + (Finset.single_le_sum (fun j _ => sq_nonneg (x j)) (by simp : i ∈ Finset.univ)) + have hsq : |x i| ^ 2 ≤ ‖x‖ ^ 2 := by + calc + |x i| ^ 2 ≤ ∑ j : Fin d, x j ^ 2 := hcoord + _ = ‖x‖ ^ 2 := by rw [← norm_sq_eq_sum_sq] + exact le_of_sq_le_sq hsq (norm_nonneg _) + +theorem norm_toVec_le_norm {d : ℕ} (x : HilbertVec d) : + ‖x.toVec‖ ≤ ‖x‖ := by + refine (pi_norm_le_iff_of_nonneg (norm_nonneg x)).2 ?_ + intro i + simpa [toVec, Real.norm_eq_abs] using abs_apply_le_norm x i + +theorem norm_le_norm_ofVec {d : ℕ} (x : Vec d) : + ‖x‖ ≤ ‖ofVec x‖ := by + simpa using norm_toVec_le_norm (ofVec x) + +theorem norm_ofVec_le_mul_norm {d : ℕ} (x : Vec d) : + ‖ofVec x‖ ≤ (d : ℝ) * ‖x‖ := by + have hcoord : ∀ i : Fin d, x i ^ 2 ≤ ‖x‖ ^ 2 := by + intro i + exact sq_le_sq.mpr <| by + simpa [Real.norm_eq_abs, abs_of_nonneg (norm_nonneg x)] using norm_le_pi_norm x i + have hsum : + ∑ i : Fin d, x i ^ 2 ≤ (d : ℝ) * ‖x‖ ^ 2 := by + calc + ∑ i : Fin d, x i ^ 2 ≤ ∑ _i : Fin d, ‖x‖ ^ 2 := by + exact Finset.sum_le_sum fun i _ => hcoord i + _ = (d : ℝ) * ‖x‖ ^ 2 := by + simp [nsmul_eq_mul] + have hd_nonneg : 0 ≤ (d : ℝ) := by positivity + have hd_le_sq : (d : ℝ) ≤ (d : ℝ) ^ 2 := by + cases Nat.eq_zero_or_pos d with + | inl hd0 => + simp [hd0] + | inr hdpos => + exact_mod_cast (show d ≤ d ^ 2 by + simpa [pow_two] using Nat.le_mul_of_pos_left d hdpos) + have hsq : + ‖ofVec x‖ ^ 2 ≤ ((d : ℝ) * ‖x‖) ^ 2 := by + calc + ‖ofVec x‖ ^ 2 = ∑ i : Fin d, x i ^ 2 := by + exact norm_sq_eq_sum_sq (ofVec x) + _ ≤ (d : ℝ) * ‖x‖ ^ 2 := hsum + _ ≤ (d : ℝ) ^ 2 * ‖x‖ ^ 2 := by + gcongr + _ = ((d : ℝ) * ‖x‖) ^ 2 := by + ring + have hright_nonneg : 0 ≤ (d : ℝ) * ‖x‖ := mul_nonneg hd_nonneg (norm_nonneg _) + exact le_of_sq_le_sq hsq hright_nonneg + +/-- Continuous linear promotion from the project's algebraic vector carrier to +the Euclidean Hilbert carrier. -/ +noncomputable abbrev ofVecL (d : ℕ) : Vec d →L[ℝ] HilbertVec d := + ((continuousLinearEquivVec d).symm).toContinuousLinearMap + +@[simp] theorem ofVecL_apply {d : ℕ} (x : Vec d) : + ofVecL d x = ofVec x := + rfl + +theorem norm_ofVecL_le (d : ℕ) : ‖ofVecL d‖ ≤ (d : ℝ) := by + refine ContinuousLinearMap.opNorm_le_bound _ (by positivity) ?_ + intro x + simpa [ofVecL_apply] using norm_ofVec_le_mul_norm x + +theorem norm_continuousLinearEquivVec_le (d : ℕ) : + ‖(continuousLinearEquivVec d).toContinuousLinearMap‖ ≤ 1 := by + refine ContinuousLinearMap.opNorm_le_bound _ zero_le_one ?_ + intro x + simpa using norm_toVec_le_norm x + +end HilbertVec + +/-- The Euclidean Hilbert realization of `d × d` real matrices. The algebraic +carrier `Mat d` keeps its lightweight pointwise role; this wrapper is for +Hilbert-space measurability and `L²` arguments. -/ +abbrev HilbertMat (d : ℕ) := PiLp 2 (fun _ : Fin d => HilbertVec d) + +namespace HilbertMat + +/-- Promote the project's algebraic matrix carrier into the Euclidean Hilbert +matrix carrier. -/ +abbrev ofMat {d : ℕ} (A : Mat d) : HilbertMat d := + WithLp.toLp 2 (fun i : Fin d => HilbertVec.ofVec (fun j : Fin d => A i j)) + +/-- Forget the Hilbert structure and return to the project's algebraic matrix +carrier. -/ +abbrev toMat {d : ℕ} (A : HilbertMat d) : Mat d := + fun i j => A i j + +@[simp] theorem toMat_ofMat {d : ℕ} (A : Mat d) : (ofMat A).toMat = A := by + ext i j + simp [toMat] + +@[simp] theorem ofMat_toMat {d : ℕ} (A : HilbertMat d) : ofMat A.toMat = A := by + apply PiLp.ext + intro i + apply HilbertVec.ext + intro j + simp [toMat] + +@[ext] theorem ext {d : ℕ} {A B : HilbertMat d} (h : ∀ i j, A i j = B i j) : + A = B := by + apply PiLp.ext + intro i + apply HilbertVec.ext + intro j + exact h i j + +/-- Algebraic identification between the Euclidean Hilbert matrix carrier and +the project's lightweight matrix carrier. -/ +def linearEquivMat (d : ℕ) : HilbertMat d ≃ₗ[ℝ] Mat d where + toFun := toMat + invFun := ofMat + left_inv := ofMat_toMat + right_inv := toMat_ofMat + map_add' _ _ := by + ext i j + simp [toMat] + map_smul' _ _ := by + ext i j + simp [toMat] + +/-- Continuous linear identification between the Euclidean Hilbert matrix +carrier and the project's lightweight matrix carrier. -/ +noncomputable def continuousLinearEquivMat (d : ℕ) : HilbertMat d ≃L[ℝ] Mat d := + (linearEquivMat d).toContinuousLinearEquiv + +@[simp] theorem continuousLinearEquivMat_apply {d : ℕ} (A : HilbertMat d) : + continuousLinearEquivMat d A = A.toMat := + rfl + +@[simp] theorem continuousLinearEquivMat_symm_apply {d : ℕ} (A : Mat d) : + (continuousLinearEquivMat d).symm A = ofMat A := + rfl + +/-- The `(i,j)` matrix coordinate as a continuous linear functional on the +Hilbert matrix carrier. -/ +noncomputable def entryL {d : ℕ} (i j : Fin d) : HilbertMat d →L[ℝ] ℝ := + (PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) j).comp + (PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => HilbertVec d) i) + +@[simp] theorem entryL_apply {d : ℕ} (i j : Fin d) (A : HilbertMat d) : + entryL i j A = A i j := + rfl + +@[simp] theorem entryL_ofMat {d : ℕ} (i j : Fin d) (A : Mat d) : + entryL i j (ofMat A) = A i j := by + simp [entryL, ofMat] + +theorem abs_apply_sub_apply_le_norm {d : ℕ} (A B : HilbertMat d) (i j : Fin d) : + |A i j - B i j| ≤ ‖A - B‖ := by + calc + |A i j - B i j| = |(A - B) i j| := by simp + _ ≤ ‖(A - B) i‖ := HilbertVec.abs_apply_le_norm ((A - B) i) j + _ ≤ ‖A - B‖ := PiLp.norm_apply_le (A - B) i + +theorem lipschitzWith_entry {d : ℕ} (i j : Fin d) : + LipschitzWith 1 (fun A : HilbertMat d => A i j) := by + refine LipschitzWith.of_dist_le_mul ?_ + intro A B + simpa [Real.dist_eq, dist_eq_norm] using abs_apply_sub_apply_le_norm A B i j + +@[simp] theorem inner_def {d : ℕ} (A B : HilbertMat d) : + inner ℝ A B = ∑ i, ∑ j, A i j * B i j := by + rw [PiLp.inner_apply] + simp [HilbertVec.inner_def, vecDot] + +end HilbertMat + +/-- The Euclidean Hilbert realization of `\R^{2d}`, viewed as a doubled +potential/flux carrier. -/ +abbrev HilbertBlockVec (d : ℕ) := PiLp 2 (fun _ : Fin 2 => HilbertVec d) + +namespace HilbertBlockVec + +/-- The potential component of a doubled Hilbert vector. -/ +abbrev potential {d : ℕ} (X : HilbertBlockVec d) : HilbertVec d := + X 0 + +/-- The flux component of a doubled Hilbert vector. -/ +abbrev flux {d : ℕ} (X : HilbertBlockVec d) : HilbertVec d := + X 1 + +/-- Promote the project's algebraic doubled vector carrier into the Euclidean +Hilbert carrier. -/ +abbrev ofBlockVec {d : ℕ} (X : BlockVec d) : HilbertBlockVec d := + WithLp.toLp 2 ![HilbertVec.ofVec X.1, HilbertVec.ofVec X.2] + +/-- Forget the Hilbert structure and return to the project's algebraic doubled +vector carrier. -/ +abbrev toBlockVec {d : ℕ} (X : HilbertBlockVec d) : BlockVec d := + (X.potential.toVec, X.flux.toVec) + +@[simp] theorem potential_ofBlockVec {d : ℕ} (X : BlockVec d) : + (ofBlockVec X).potential = HilbertVec.ofVec X.1 := by + simp [potential] + +@[simp] theorem flux_ofBlockVec {d : ℕ} (X : BlockVec d) : + (ofBlockVec X).flux = HilbertVec.ofVec X.2 := by + simp [flux] + +@[simp] theorem toBlockVec_ofBlockVec {d : ℕ} (X : BlockVec d) : + (ofBlockVec X).toBlockVec = X := by + rcases X with ⟨p, q⟩ + simp [toBlockVec] + +@[simp] theorem ofBlockVec_toBlockVec {d : ℕ} (X : HilbertBlockVec d) : + ofBlockVec X.toBlockVec = X := by + apply PiLp.ext + intro i + fin_cases i <;> simp [potential, flux] + +@[ext] theorem ext {d : ℕ} {X Y : HilbertBlockVec d} + (hpot : X.potential = Y.potential) (hflux : X.flux = Y.flux) : X = Y := by + apply PiLp.ext + intro i + fin_cases i + · simpa [potential] using hpot + · simpa [flux] using hflux + +/-- Algebraic identification between the Euclidean doubled Hilbert carrier and +the project's lightweight block carrier. -/ +def linearEquivBlockVec (d : ℕ) : HilbertBlockVec d ≃ₗ[ℝ] BlockVec d where + toFun := toBlockVec + invFun := ofBlockVec + left_inv := ofBlockVec_toBlockVec + right_inv := toBlockVec_ofBlockVec + map_add' X Y := by + ext i <;> simp [toBlockVec, potential, flux] + map_smul' c X := by + ext i <;> simp [toBlockVec, potential, flux] + +/-- Continuous linear identification between the Euclidean doubled Hilbert +carrier and the project's lightweight block carrier. -/ +noncomputable def continuousLinearEquivBlockVec (d : ℕ) : HilbertBlockVec d ≃L[ℝ] BlockVec d := + (linearEquivBlockVec d).toContinuousLinearEquiv + +@[simp] theorem continuousLinearEquivBlockVec_apply {d : ℕ} (X : HilbertBlockVec d) : + continuousLinearEquivBlockVec d X = X.toBlockVec := + rfl + +@[simp] theorem continuousLinearEquivBlockVec_symm_apply {d : ℕ} (X : BlockVec d) : + (continuousLinearEquivBlockVec d).symm X = ofBlockVec X := + rfl + +/-- A block matrix acts continuously on the Euclidean Hilbert realization of +`\R^{2d}` by conjugating the algebraic action through the canonical +identification `HilbertBlockVec d ≃L[ℝ] BlockVec d`. -/ +noncomputable def applyBlockMat {d : ℕ} (A : BlockMat d) : + HilbertBlockVec d →L[ℝ] HilbertBlockVec d := + ((continuousLinearEquivBlockVec d).symm.toContinuousLinearMap).comp + ((blockMatContinuousLinearMap A).comp + (continuousLinearEquivBlockVec d).toContinuousLinearMap) + +@[simp] theorem applyBlockMat_apply {d : ℕ} (A : BlockMat d) (X : HilbertBlockVec d) : + applyBlockMat A X = ofBlockVec (blockMatVecMul A X.toBlockVec) := by + simp [applyBlockMat] + +@[simp] theorem inner_def {d : ℕ} (X Y : HilbertBlockVec d) : + inner ℝ X Y = blockVecDot X.toBlockVec Y.toBlockVec := by + rw [PiLp.inner_apply, Fin.sum_univ_two] + simp [blockVecDot, HilbertVec.inner_def] + +@[simp] theorem inner_ofBlockVec_applyBlockMat {d : ℕ} (A : BlockMat d) + (X Y : BlockVec d) : + inner ℝ (ofBlockVec X) (applyBlockMat A (ofBlockVec Y)) = + blockVecDot X (blockMatVecMul A Y) := by + simp [applyBlockMat_apply, inner_def] + +@[simp] theorem norm_sq_ofBlockVec {d : ℕ} (X : BlockVec d) : + ‖ofBlockVec X‖ ^ 2 = blockVecDot X X := by + rw [← real_inner_self_eq_norm_sq, inner_def, toBlockVec_ofBlockVec] + +@[simp] theorem norm_sq_eq_blockVecDot {d : ℕ} (X : HilbertBlockVec d) : + ‖X‖ ^ 2 = blockVecDot X.toBlockVec X.toBlockVec := by + simpa [ofBlockVec_toBlockVec X] using norm_sq_ofBlockVec X.toBlockVec + +@[simp] theorem norm_sq_applyBlockMat {d : ℕ} (A : BlockMat d) (X : HilbertBlockVec d) : + ‖applyBlockMat A X‖ ^ 2 = + blockVecDot (blockMatVecMul A X.toBlockVec) (blockMatVecMul A X.toBlockVec) := by + rw [applyBlockMat_apply, norm_sq_ofBlockVec] + +theorem opNorm_applyBlockMat_le_of_block_bound {d : ℕ} {A : BlockMat d} {C : ℝ} + (hC : 0 ≤ C) + (hA : ∀ X : BlockVec d, + blockVecDot (blockMatVecMul A X) (blockMatVecMul A X) ≤ C ^ 2 * blockVecDot X X) : + ‖applyBlockMat A‖ ≤ C := by + refine ContinuousLinearMap.opNorm_le_bound _ hC ?_ + intro X + have hsq : + ‖applyBlockMat A X‖ ^ 2 ≤ (C * ‖X‖) ^ 2 := by + calc + ‖applyBlockMat A X‖ ^ 2 + = blockVecDot (blockMatVecMul A X.toBlockVec) (blockMatVecMul A X.toBlockVec) := by + rw [norm_sq_applyBlockMat] + _ ≤ C ^ 2 * blockVecDot X.toBlockVec X.toBlockVec := hA X.toBlockVec + _ = C ^ 2 * ‖X‖ ^ 2 := by + rw [norm_sq_eq_blockVecDot] + _ = (C * ‖X‖) ^ 2 := by + ring + have hCnorm_nonneg : 0 ≤ C * ‖X‖ := mul_nonneg hC (norm_nonneg X) + have habs : |‖applyBlockMat A X‖| ≤ |C * ‖X‖| := sq_le_sq.mp hsq + simpa [abs_of_nonneg (norm_nonneg _), abs_of_nonneg hCnorm_nonneg] using habs + +@[simp] theorem norm_sq_eq_components {d : ℕ} (X : HilbertBlockVec d) : + ‖X‖ ^ 2 = ‖X.potential‖ ^ 2 + ‖X.flux‖ ^ 2 := by + rw [PiLp.norm_sq_eq_of_L2, Fin.sum_univ_two] + +@[simp] theorem norm_sq_eq_sum_sq {d : ℕ} (X : HilbertBlockVec d) : + ‖X‖ ^ 2 = ∑ i, X.potential i ^ 2 + ∑ i, X.flux i ^ 2 := by + rw [norm_sq_eq_components, HilbertVec.norm_sq_eq_sum_sq, HilbertVec.norm_sq_eq_sum_sq] + +end HilbertBlockVec + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/MatrixOrderBridge.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/MatrixOrderBridge.lean new file mode 100644 index 0000000000..a3c5c5f9ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/MatrixOrderBridge.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import Mathlib.Analysis.Matrix.Order + +/-! # Matrix Order Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped MatrixOrder + +/-! +# Ambient matrix-order bridges + +Conversion lemmas between the local quadratic-form order `MatLoewnerLE` used in +the homogenization development and mathlib's matrix order, together with the +basic inverse-antitonicity consequence for positive-definite real matrices. +-/ + +theorem matLoewnerLE_matrixOrder_of_posSemidef + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + A ≤ B := by + rw [Matrix.le_iff] + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg + (hB.isHermitian.sub hA.isHermitian) ?_ + intro x + change 0 ≤ dotProduct x (Matrix.mulVec (B - A) x) + rw [Matrix.sub_mulVec, dotProduct_sub] + have hAB' : + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec A x) ≤ + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec B x) := by + simpa [vecDot, matVecMul, dotProduct, Matrix.mulVec_apply] using hAB x + nlinarith + +theorem matLoewnerLE_of_matrixOrder_of_posSemidef + {d : ℕ} {A B : Mat d} (_hA : A.PosSemidef) (_hB : B.PosSemidef) + (hAB : A ≤ B) : + MatLoewnerLE A B := by + have hBA : Matrix.PosSemidef (B - A) := (Matrix.le_iff).mp hAB + intro x + change (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec A x) ≤ + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec B x) + have hnonneg : + 0 ≤ dotProduct x (Matrix.mulVec (B - A) x) := hBA.dotProduct_mulVec_nonneg x + rw [Matrix.sub_mulVec, dotProduct_sub] at hnonneg + nlinarith + +theorem matLoewnerLE_inv_of_posDef + {d : ℕ} {A B : Mat d} (hA : A.PosDef) (hB : B.PosDef) + (hAB : MatLoewnerLE A B) : + MatLoewnerLE B⁻¹ A⁻¹ := by + have hAB_order : A ≤ B := + matLoewnerLE_matrixOrder_of_posSemidef hA.posSemidef hB.posSemidef hAB + have hBA_psd : (B - A).PosSemidef := (Matrix.le_iff).mp hAB_order + let _ := hA.isUnit.invertible + let _ := hB.isUnit.invertible + have hBlock : + (Matrix.fromBlocks B (1 : Mat d) (Matrix.conjTranspose (1 : Mat d)) A⁻¹).PosSemidef := by + exact + (Matrix.PosDef.fromBlocks₂₂ (A := B) (B := (1 : Mat d)) (D := A⁻¹) hA.inv).2 <| + by simpa using hBA_psd + have hInv_psd : (A⁻¹ - B⁻¹).PosSemidef := by + simpa using + (Matrix.PosDef.fromBlocks₁₁ (A := B) (B := (1 : Mat d)) (D := A⁻¹) hB).1 hBlock + have hInv_order : B⁻¹ ≤ A⁻¹ := (Matrix.le_iff).2 hInv_psd + exact matLoewnerLE_of_matrixOrder_of_posSemidef hB.inv.posSemidef hA.inv.posSemidef hInv_order + +end diff --git a/LeanPool/CoarseGraining/Homogenization/Ambient/ScalarMatrix.lean b/LeanPool/CoarseGraining/Homogenization/Ambient/ScalarMatrix.lean new file mode 100644 index 0000000000..cd3bae4d47 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Ambient/ScalarMatrix.lean @@ -0,0 +1,71 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField + +/-! # Scalar Matrix -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Positive scalar matrices + +Small helpers for scalar multiples of the identity, used when a deterministic +black-box statement is meant only for scalar constant backgrounds. +-/ + +/-- The scalar matrix `sigma • I`. -/ +abbrev scalarMatrix {d : ℕ} (sigma : ℝ) : Mat d := + sigma • (1 : Mat d) + +/-- A matrix is a positive scalar matrix if it is `sigma • I` with `sigma > 0`. -/ +def IsPositiveScalarMatrix {d : ℕ} (A : Mat d) : Prop := + ∃ sigma : ℝ, 0 < sigma ∧ A = scalarMatrix (d := d) sigma + +theorem matVecMul_scalarMatrix {d : ℕ} (sigma : ℝ) (x : Vec d) : + matVecMul (scalarMatrix (d := d) sigma) x = sigma • x := by + funext i + rw [scalarMatrix, matVecMul, Finset.sum_eq_single i] + · simp + · intro j _ hji + have hij : i ≠ j := Ne.symm hji + simp [hij] + · simp + +theorem scalarMatrix_isSymm {d : ℕ} (sigma : ℝ) : + (scalarMatrix (d := d) sigma).IsSymm := by + exact (Matrix.isSymm_one (n := Fin d) (α := ℝ)).smul sigma + +theorem isEllipticMatrix_scalarMatrix {d : ℕ} {sigma : ℝ} + (hsigma : 0 < sigma) : + IsEllipticMatrix sigma sigma (scalarMatrix (d := d) sigma) := by + refine ⟨hsigma, le_rfl, ?_, ?_⟩ + · intro ξ + rw [matVecMul_scalarMatrix, vecDot_smul_right, vecNormSq] + · intro ξ + have hInv : + ((scalarMatrix (d := d) sigma)⁻¹ : Mat d) = sigma⁻¹ • (1 : Mat d) := by + rw [scalarMatrix, nonsing_inv_smul sigma (ne_of_gt hsigma) (by simp)] + simp + rw [hInv, matVecMul_scalarMatrix, vecDot_smul_right, vecNormSq] + +theorem IsPositiveScalarMatrix.isSymm {d : ℕ} {A : Mat d} + (hA : IsPositiveScalarMatrix A) : + A.IsSymm := by + rcases hA with ⟨sigma, _hsigma, rfl⟩ + exact scalarMatrix_isSymm sigma + +theorem IsPositiveScalarMatrix.isEllipticMatrix {d : ℕ} {A : Mat d} + (hA : IsPositiveScalarMatrix A) : + ∃ sigma : ℝ, 0 < sigma ∧ IsEllipticMatrix sigma sigma A := by + rcases hA with ⟨sigma, hsigma, rfl⟩ + exact ⟨sigma, hsigma, isEllipticMatrix_scalarMatrix hsigma⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov.lean b/LeanPool/CoarseGraining/Homogenization/Besov.lean new file mode 100644 index 0000000000..f3c622171e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Basic.lean new file mode 100644 index 0000000000..aeaf0e1d4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Basic.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionLp +public import Mathlib.Analysis.MeanInequalities +public import Mathlib.Analysis.SpecialFunctions.Pow.Real + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-! +Local building blocks for the cube Besov layer. + +This file stays intentionally lightweight: it packages the cube-wise oscillation +and scale weights that later positive and negative Besov definitions will +assemble across descendants and scales. +-/ + +noncomputable def cubeBesovOscillation {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) : ℝ := + cubeLpNorm Q p (cubeFluctuation Q u) + +/-- Explicit disjoint-cube spelling of the legacy scalar cube oscillation. -/ +noncomputable abbrev cubeBesovDisjointOscillation {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + cubeBesovOscillation Q p u + +noncomputable def cubeBesovScaleWeight {d : ℕ} (s : ℝ) (Q : TriadicCube d) : ℝ := + (cubeScaleFactor Q) ^ (-s) + +noncomputable def descendantsAverage {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℝ) : ℝ := by + let D := descendantsAtDepth Q j + exact ((D.card : ℝ)⁻¹) * D.sum F + +theorem descendantsAverage_nonneg {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℝ) + (hF : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ F R) : + 0 ≤ descendantsAverage Q j F := by + classical + dsimp [descendantsAverage] + refine mul_nonneg ?_ ?_ + · exact inv_nonneg.mpr (show 0 ≤ ((descendantsAtDepth Q j).card : ℝ) by positivity) + · exact Finset.sum_nonneg fun R hR => hF R hR + +theorem descendantsAverage_mul_left {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) + (F : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => c * F R) = c * descendantsAverage Q j F := by + calc + descendantsAverage Q j (fun R => c * F R) + = ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, c * F R := by + rfl + _ = ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (c * ∑ R ∈ descendantsAtDepth Q j, F R) := by + rw [← Finset.mul_sum] + _ = c * descendantsAverage Q j F := by + unfold descendantsAverage + ring + +theorem descendantsAverage_le_descendantsAverage {d : ℕ} (Q : TriadicCube d) (j : ℕ) + {F G : TriadicCube d → ℝ} + (hFG : ∀ R ∈ descendantsAtDepth Q j, F R ≤ G R) : + descendantsAverage Q j F ≤ descendantsAverage Q j G := by + classical + unfold descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact Finset.sum_le_sum hFG + · exact inv_nonneg.mpr (by positivity) + +theorem descendantsAverage_sum {d : ℕ} {ι : Type*} [DecidableEq ι] + (Q : TriadicCube d) (j : ℕ) (s : Finset ι) (F : TriadicCube d → ι → ℝ) : + descendantsAverage Q j (fun R => ∑ i ∈ s, F R i) = + ∑ i ∈ s, descendantsAverage Q j (fun R => F R i) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + calc + descendantsAverage Q j (fun R => ∑ i ∈ s, F R i) + = ((D.card : ℝ)⁻¹) * ∑ R ∈ D, ∑ i ∈ s, F R i := by + rfl + _ = ((D.card : ℝ)⁻¹) * ∑ i ∈ s, ∑ R ∈ D, F R i := by + rw [Finset.sum_comm] + _ = ∑ i ∈ s, ((D.card : ℝ)⁻¹) * ∑ R ∈ D, F R i := by + rw [Finset.mul_sum] + _ = ∑ i ∈ s, descendantsAverage Q j (fun R => F R i) := by + simp [descendantsAverage, D] + +theorem sq_rpow_half_eq_of_nonneg {x : ℝ} (hx : 0 ≤ x) : + (x ^ 2) ^ (1 / 2 : ℝ) = x := by + rw [← Real.rpow_natCast x 2, ← Real.rpow_mul hx] + norm_num + +theorem descendantsAverage_succ_eq_descendantsAverage_descendantsAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) : + descendantsAverage Q (j + 1) F = + descendantsAverage Q j (fun R => descendantsAverage R 1 F) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + ∑ S ∈ descendantsAtDepth Q (j + 1), F S = + ∑ R ∈ D, ∑ S ∈ childCubes R, F S := by + rw [descendantsAtDepth_succ, Finset.sum_biUnion] + intro R hR S hS hRS + exact disjoint_childCubes_of_ne hRS + have hcard_ne : (((descendantsAtDepth Q j).card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q j) + have hpow_ne : (((3 ^ d : ℕ) : ℕ) : ℝ) ≠ 0 := by positivity + have hcast : + (((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ) = + ((descendantsAtDepth Q j).card : ℝ) * (((3 ^ d : ℕ) : ℝ)) := by + norm_num + have hcoeff : + ((((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ)⁻¹) = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * (((3 ^ d : ℕ) : ℝ)⁻¹) := by + rw [hcast] + field_simp [hcard_ne, hpow_ne] + calc + descendantsAverage Q (j + 1) F + = ((((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ)⁻¹) * + ∑ S ∈ descendantsAtDepth Q (j + 1), F S := by + rw [descendantsAverage, descendantsAtDepth_card_succ] + _ = ((((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ)⁻¹) * + ∑ R ∈ D, ∑ S ∈ childCubes R, F S := by + rw [hsum] + _ = (((descendantsAtDepth Q j).card : ℝ)⁻¹ * (((3 ^ d : ℕ) : ℝ)⁻¹)) * + ∑ R ∈ D, ∑ S ∈ childCubes R, F S := by + rw [hcoeff] + _ = ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ((((3 ^ d : ℕ) : ℝ)⁻¹) * ∑ R ∈ D, ∑ S ∈ childCubes R, F S) := by + ring + _ = ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ D, ((((3 ^ d : ℕ) : ℝ)⁻¹) * ∑ S ∈ childCubes R, F S) := by + rw [Finset.mul_sum] + _ = descendantsAverage Q j (fun R => descendantsAverage R 1 F) := by + simp [descendantsAverage, D, childCubes_card] + +theorem descendantsAverage_mul_le_Lp_mul_Lq_of_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (A B : TriadicCube d → ℝ) {p q : ℝ} + (hpq : Real.HolderConjugate p q) + (hA : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R) + (hB : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ B R) : + descendantsAverage Q j (fun R => A R * B R) ≤ + (descendantsAverage Q j (fun R => (A R) ^ p)) ^ (1 / p) * + (descendantsAverage Q j (fun R => (B R) ^ q)) ^ (1 / q) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_pos : 0 < ((D.card : ℕ) : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD + have hcard_nonneg : 0 ≤ ((D.card : ℕ) : ℝ) := le_of_lt hcard_pos + have hscaleA_nonneg : 0 ≤ (D.card : ℝ) ^ (-1 / p) := + Real.rpow_nonneg hcard_nonneg _ + have hscaleB_nonneg : 0 ≤ (D.card : ℝ) ^ (-1 / q) := + Real.rpow_nonneg hcard_nonneg _ + have hscaleA_pow : ((D.card : ℝ) ^ (-1 / p)) ^ p = (D.card : ℝ)⁻¹ := by + calc + ((D.card : ℝ) ^ (-1 / p)) ^ p = (D.card : ℝ) ^ ((-1 / p) * p) := by + rw [← Real.rpow_mul hcard_nonneg] + _ = (D.card : ℝ) ^ (-1 : ℝ) := by + congr 1 + field_simp [hpq.ne_zero] + _ = (D.card : ℝ)⁻¹ := by + rw [Real.rpow_neg_one] + have hscaleB_pow : ((D.card : ℝ) ^ (-1 / q)) ^ q = (D.card : ℝ)⁻¹ := by + calc + ((D.card : ℝ) ^ (-1 / q)) ^ q = (D.card : ℝ) ^ ((-1 / q) * q) := by + rw [← Real.rpow_mul hcard_nonneg] + _ = (D.card : ℝ) ^ (-1 : ℝ) := by + congr 1 + field_simp [hpq.symm.ne_zero] + _ = (D.card : ℝ)⁻¹ := by + rw [Real.rpow_neg_one] + have hscale : (D.card : ℝ) ^ (-1 / p) * (D.card : ℝ) ^ (-1 / q) = (D.card : ℝ)⁻¹ := by + have hsum : (-1 / p) + (-1 / q) = (-1 : ℝ) := by + calc + (-1 / p) + (-1 / q) = -((1 / p) + (1 / q)) := by ring + _ = -1 := by + rw [hpq.one_div_add_one_div] + norm_num + calc + (D.card : ℝ) ^ (-1 / p) * (D.card : ℝ) ^ (-1 / q) + = (D.card : ℝ) ^ ((-1 / p) + (-1 / q)) := by + symm + exact Real.rpow_add hcard_pos _ _ + _ = (D.card : ℝ) ^ (-1 : ℝ) := by + simpa using congrArg (fun t : ℝ => (D.card : ℝ) ^ t) hsum + _ = (D.card : ℝ)⁻¹ := by + rw [Real.rpow_neg_one] + have hholder : + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) * ((D.card : ℝ) ^ (-1 / q) * B R) ≤ + (∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) ^ p) ^ (1 / p) * + (∑ R ∈ D, ((D.card : ℝ) ^ (-1 / q) * B R) ^ q) ^ (1 / q) := by + exact Real.inner_le_Lp_mul_Lq_of_nonneg + (s := D) + (f := fun R => (D.card : ℝ) ^ (-1 / p) * A R) + (g := fun R => (D.card : ℝ) ^ (-1 / q) * B R) + hpq + (by + intro R hR + exact mul_nonneg hscaleA_nonneg (hA R (by simpa [D] using hR))) + (by + intro R hR + exact mul_nonneg hscaleB_nonneg (hB R (by simpa [D] using hR))) + have hleft : + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) * ((D.card : ℝ) ^ (-1 / q) * B R) = + (D.card : ℝ)⁻¹ * ∑ R ∈ D, A R * B R := by + calc + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) * ((D.card : ℝ) ^ (-1 / q) * B R) + = ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * (D.card : ℝ) ^ (-1 / q)) * (A R * B R) := by + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = ∑ R ∈ D, (D.card : ℝ)⁻¹ * (A R * B R) := by + simp [hscale] + _ = (D.card : ℝ)⁻¹ * ∑ R ∈ D, A R * B R := by + rw [Finset.mul_sum] + have hrightA : + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) ^ p = + (D.card : ℝ)⁻¹ * ∑ R ∈ D, (A R) ^ p := by + calc + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) ^ p + = ∑ R ∈ D, (((D.card : ℝ) ^ (-1 / p)) ^ p * (A R) ^ p) := by + refine Finset.sum_congr rfl ?_ + intro R hR + rw [Real.mul_rpow hscaleA_nonneg (hA R (by simpa [D] using hR))] + _ = ∑ R ∈ D, (D.card : ℝ)⁻¹ * (A R) ^ p := by + simp [hscaleA_pow] + _ = (D.card : ℝ)⁻¹ * ∑ R ∈ D, (A R) ^ p := by + rw [Finset.mul_sum] + have hrightB : + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / q) * B R) ^ q = + (D.card : ℝ)⁻¹ * ∑ R ∈ D, (B R) ^ q := by + calc + ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / q) * B R) ^ q + = ∑ R ∈ D, (((D.card : ℝ) ^ (-1 / q)) ^ q * (B R) ^ q) := by + refine Finset.sum_congr rfl ?_ + intro R hR + rw [Real.mul_rpow hscaleB_nonneg (hB R (by simpa [D] using hR))] + _ = ∑ R ∈ D, (D.card : ℝ)⁻¹ * (B R) ^ q := by + simp [hscaleB_pow] + _ = (D.card : ℝ)⁻¹ * ∑ R ∈ D, (B R) ^ q := by + rw [Finset.mul_sum] + calc + descendantsAverage Q j (fun R => A R * B R) + = (D.card : ℝ)⁻¹ * ∑ R ∈ D, A R * B R := by + simp [descendantsAverage, D] + _ = ∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) * ((D.card : ℝ) ^ (-1 / q) * B R) := by + rw [hleft] + _ ≤ (∑ R ∈ D, ((D.card : ℝ) ^ (-1 / p) * A R) ^ p) ^ (1 / p) * + (∑ R ∈ D, ((D.card : ℝ) ^ (-1 / q) * B R) ^ q) ^ (1 / q) := + hholder + _ = (descendantsAverage Q j (fun R => (A R) ^ p)) ^ (1 / p) * + (descendantsAverage Q j (fun R => (B R) ^ q)) ^ (1 / q) := by + simp [descendantsAverage, D, hrightA, hrightB] + +theorem cubeBesovOscillation_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + 0 ≤ cubeBesovOscillation Q p u := + cubeLpNorm_nonneg Q p (cubeFluctuation Q u) + +theorem cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two {d : ℕ} + (R Q : TriadicCube d) {u : Vec d → ℝ} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovOscillation R (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation R (2 : ℝ≥0∞) u := by + unfold cubeBesovOscillation + rw [cubeFluctuation_cubeFluctuation_of_memLp_two R Q hu] + +@[simp] theorem cubeBesovOscillation_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (c : ℝ) : + cubeBesovOscillation Q p (fun _ => c) = 0 := by + unfold cubeBesovOscillation + rw [cubeFluctuation_const] + change cubeLpNorm Q p (fun _ => (0 : ℝ)) = 0 + simp + +@[simp] theorem cubeBesovOscillation_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) : + cubeBesovOscillation Q p (fun _ => (0 : ℝ)) = 0 := by + unfold cubeBesovOscillation + rw [cubeFluctuation_zero] + change cubeLpNorm Q p (fun _ => (0 : ℝ)) = 0 + simp + +theorem cubeBesovScaleWeight_nonneg {d : ℕ} (s : ℝ) (Q : TriadicCube d) : + 0 ≤ cubeBesovScaleWeight s Q := by + unfold cubeBesovScaleWeight + exact Real.rpow_nonneg (le_of_lt (by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale))) _ + +theorem cubeBesovScaleWeight_mul_eq_scaleWeight_add {d : ℕ} + (r q : ℝ) (Q : TriadicCube d) : + cubeBesovScaleWeight r Q * cubeBesovScaleWeight q Q = + cubeBesovScaleWeight (r + q) Q := by + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + unfold cubeBesovScaleWeight + rw [← Real.rpow_add hpos] + ring_nf + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality.lean new file mode 100644 index 0000000000..10ef447090 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapFull +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.WrapperComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Elementary +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapCaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization + +/-! # Duality -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliBridge.lean new file mode 100644 index 0000000000..bb9bf9313e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliBridge.lean @@ -0,0 +1,686 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison + +/-! # Caccioppoli Bridge -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeAverage_const_mul {d : ℕ} (Q : TriadicCube d) (c : ℝ) (f : Vec d → ℝ) : + cubeAverage Q (fun x => c * f x) = c * cubeAverage Q f := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, MeasureTheory.integral_const_mul, + cubeAverage_eq_integral_normalizedCubeMeasure] + +theorem cubeFluctuation_const_mul {d : ℕ} (Q : TriadicCube d) (c : ℝ) (f : Vec d → ℝ) : + cubeFluctuation Q (fun x => c * f x) = fun x => c * cubeFluctuation Q f x := by + funext x + simp [cubeFluctuation, cubeAverage_const_mul, mul_sub] + +theorem cubeLpNorm_const_mul {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (c : ℝ) + (f : Vec d → ℝ) : + cubeLpNorm Q p (fun x => c * f x) = ‖c‖ * cubeLpNorm Q p f := by + unfold cubeLpNorm + have hfun : (fun x => c * f x) = c • f := by + funext x + simp [Pi.smul_apply, smul_eq_mul] + rw [hfun, Gagliardo.integralLpSeminorm_const_smul] + simp [ENNReal.toReal_mul] + +theorem descendantsAverage_mul_left_local {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (c : ℝ) (F : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => c * F R) = c * descendantsAverage Q j F := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + change ((D.card : ℝ)⁻¹ * ∑ R ∈ D, c * F R) = c * (((D.card : ℝ)⁻¹) * ∑ R ∈ D, F R) + rw [← Finset.mul_sum] + ring + +theorem cubeBesovOscillation_two_const_mul {d : ℕ} (Q : TriadicCube d) (c : ℝ) + (u : Vec d → ℝ) : + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => c * u x) = + ‖c‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) u := by + unfold cubeBesovOscillation + rw [cubeFluctuation_const_mul, cubeLpNorm_const_mul] + +theorem cubeBesovDepthAverage_two_const_mul {d : ℕ} (Q : TriadicCube d) (c : ℝ) + (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => c * u x) j = + ‖c‖ ^ (2 : ℝ) * cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j := by + have htwo : ENNReal.toReal (2 : ℝ≥0∞) = 2 := by norm_num + unfold cubeBesovDepthAverage + calc + descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => c * u x)) ^ + ENNReal.toReal (2 : ℝ≥0∞)) + = + descendantsAverage Q j (fun R => ‖c‖ ^ (2 : ℝ) * + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ ENNReal.toReal (2 : ℝ≥0∞)) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + rw [cubeBesovOscillation_two_const_mul, htwo] + simpa using + (Real.mul_rpow (norm_nonneg c) + (cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u) : + (‖c‖ * cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℝ) = + ‖c‖ ^ (2 : ℝ) * + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℝ)) + _ = ‖c‖ ^ (2 : ℝ) * descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ ENNReal.toReal (2 : ℝ≥0∞)) := by + exact descendantsAverage_mul_left_local Q j (‖c‖ ^ (2 : ℝ)) + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ + ENNReal.toReal (2 : ℝ≥0∞)) + +theorem cubeBesovDepthSeminorm_two_const_mul {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (c : ℝ) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => c * u x) j = + ‖c‖ * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j := by + unfold cubeBesovDepthSeminorm + rw [cubeBesovDepthAverage_two_const_mul] + have hnorm_sq_nonneg : 0 ≤ ‖c‖ ^ (2 : ℝ) := by + exact Real.rpow_nonneg (norm_nonneg c) _ + have havg_nonneg : 0 ≤ cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j := + cubeBesovDepthAverage_nonneg Q (2 : ℝ≥0∞) u j + have hmul : + (‖c‖ ^ (2 : ℝ) * cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ^ (1 / (2 : ℝ)) = + (‖c‖ ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) * + (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ^ (1 / (2 : ℝ)) := by + exact Real.mul_rpow hnorm_sq_nonneg havg_nonneg + rw [show (1 / ((2 : ℝ≥0∞).toReal)) = (1 / (2 : ℝ)) by norm_num, hmul] + have hnorm : + (‖c‖ ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = ‖c‖ := by + calc + (‖c‖ ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = ‖c‖ ^ ((2 : ℝ) * (1 / (2 : ℝ))) := by + symm + exact Real.rpow_mul (norm_nonneg c) (2 : ℝ) (1 / (2 : ℝ)) + _ = ‖c‖ := by norm_num + rw [hnorm] + ring + +theorem cubeBesovPartialSeminormTop_two_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (u : Vec d → ℝ) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N (fun x => c * u x) ≤ + ‖c‖ * cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N u := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => c * u x) j) ?_ + intro j hj + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => c * u x) j + = ‖c‖ * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j := by + simpa using cubeBesovDepthSeminorm_two_const_mul Q s c u j + _ ≤ ‖c‖ * (Finset.range (N + 1)).sup' ⟨0, by simp⟩ + (fun n => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u n) := by + exact mul_le_mul_of_nonneg_left + (Finset.le_sup' (f := fun n => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u n) hj) + (norm_nonneg c) + +theorem cubeBesovPartialNormTop_two_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (u : Vec d → ℝ) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) N (fun x => c * u x) ≤ + ‖c‖ * cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) N u := by + have havg : + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => c * u x)‖ = + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + rw [cubeAverage_const_mul, norm_mul] + simp [Real.norm_eq_abs, mul_assoc, mul_comm] + unfold cubeBesovPartialNormTop + calc + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N (fun x => c * u x) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => c * u x)‖ + = + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N (fun x => c * u x) + + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + rw [havg] + _ ≤ ‖c‖ * cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N u + + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + gcongr + exact cubeBesovPartialSeminormTop_two_const_mul_le Q s N c u + _ = ‖c‖ * cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) N u := by + unfold cubeBesovPartialNormTop + ring + +theorem cubeBesovPartialSeminorm_two_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (u : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * u x) ≤ + ‖c‖ * cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u := by + have hsum : + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => c * u x) j) ^ + (2 : ℝ)) + = + ‖c‖ ^ (2 : ℝ) * + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ (2 : ℝ)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovDepthSeminorm_two_const_mul] + exact Real.mul_rpow (norm_nonneg c) + (cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) u j) + have hsum_nonneg : + 0 ≤ Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ (2 : ℝ)) := by + refine Finset.sum_nonneg ?_ + intro j hj + exact Real.rpow_nonneg + (cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) u j) _ + have hEq : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * u x) = + ‖c‖ * cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u := by + have htoReal : ENNReal.toReal (2 : ℝ≥0∞) = 2 := by norm_num + unfold cubeBesovPartialSeminorm + calc + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => c * u x) j) ^ + ENNReal.toReal (2 : ℝ≥0∞))) ^ (1 / ENNReal.toReal (2 : ℝ≥0∞)) + = + (‖c‖ ^ (2 : ℝ) * + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ (2 : ℝ))) ^ + (1 / (2 : ℝ)) := by + rw [htoReal] + rw [hsum] + _ = (‖c‖ ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) * + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ (2 : ℝ))) ^ + (1 / (2 : ℝ)) := by + exact Real.mul_rpow (Real.rpow_nonneg (norm_nonneg c) _) hsum_nonneg + _ = ‖c‖ * + ((Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ (2 : ℝ))) ^ + (1 / (2 : ℝ))) := by + congr 1 + calc + (‖c‖ ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = ‖c‖ ^ ((2 : ℝ) * (1 / (2 : ℝ))) := by + symm + exact Real.rpow_mul (norm_nonneg c) (2 : ℝ) (1 / (2 : ℝ)) + _ = ‖c‖ := by norm_num + _ = ‖c‖ * + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ + ENNReal.toReal (2 : ℝ≥0∞))) ^ (1 / ENNReal.toReal (2 : ℝ≥0∞)) := by + rw [htoReal] + exact le_of_eq hEq + +theorem cubeBesovPartialNorm_two_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (u : Vec d → ℝ) : + cubeBesovPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * u x) ≤ + ‖c‖ * cubeBesovPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u := by + have havg : + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => c * u x)‖ = + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + rw [cubeAverage_const_mul, norm_mul] + simp [Real.norm_eq_abs, mul_assoc, mul_comm] + unfold cubeBesovPartialNorm + calc + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * u x) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => c * u x)‖ + = + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * u x) + + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + rw [havg] + _ ≤ ‖c‖ * cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u + + ‖c‖ * (cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) := by + gcongr + exact cubeBesovPartialSeminorm_two_const_mul_le Q s N c u + _ = ‖c‖ * cubeBesovPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u := by + unfold cubeBesovPartialNorm + ring + +theorem cubeBesovDualTestNorm_two_one_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (g : Vec d → ℝ) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => c * g x) ≤ + ‖c‖ * cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hq : cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + N (fun x => c * g x) hq] + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g hq] + simpa [hpConj] using cubeBesovPartialNormTop_two_const_mul_le Q s N c g + +theorem cubeBesovDualTestNorm_two_two_const_mul_le {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (N : ℕ) (c : ℝ) (g : Vec d → ℝ) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => c * g x) ≤ + ‖c‖ * cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hq : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + N (fun x => c * g x) hq] + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g hq] + simpa [hpConj] using cubeBesovPartialNorm_two_const_mul_le Q s N c g + +theorem cubeBesovDualLocalMemLpGlobal_two_const_mul {d : ℕ} {Q : TriadicCube d} + {g : Vec d → ℝ} (c : ℝ) + (hg : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => c * g x) := by + intro j R hR + simpa [Pi.smul_apply, smul_eq_mul, cubeFluctuation_const_mul] using! + (hg j R hR).const_smul c + +theorem cubeBesovPairing_const_mul_right {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) (c : ℝ) : + cubeBesovPairing Q f (fun x => c * g x) = c * cubeBesovPairing Q f g := by + have hfun : (fun x => f x * (c * g x)) = fun x => c * (f x * g x) := by + funext x + ring + unfold cubeBesovPairing + simpa [hfun] using cubeAverage_const_mul Q c (fun x => f x * g x) + +theorem cubeBesovDualFullNormValueSet_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + BddAbove (cubeBesovDualFullNormValueSet Q s p q u) := by + refine ⟨max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u, ?_⟩ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_full_test + Q s p q u g hBddCirc hu hp hpTop hpConjTop hq hg + +theorem abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u g : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) + (hg : CubeBesovDualFullTest Q s p q g) : + |cubeBesovPairing Q u g| ≤ cubeBesovDualFullNorm Q s p q u := by + have hBddCirc := cubeBesovCircNormValueSet_bddAbove_of_memLp Q s p q u hs hu hp hpTop hq + exact abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test + Q s p q u g + (cubeBesovDualFullNormValueSet_bddAbove Q s p q u hBddCirc hu hp hpTop hpConjTop hq) + hg + +theorem cubeBesovDualFullTest_two_one_of_uniform_bound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (g : Vec d → ℝ) {B : ℝ} + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => B⁻¹ * g x) := by + refine ⟨?_, ?_⟩ + · intro N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => B⁻¹ * g x) + ≤ ‖B⁻¹‖ * cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g := by + exact cubeBesovDualTestNorm_two_one_const_mul_le Q s N B⁻¹ g + _ ≤ ‖B⁻¹‖ * B := by + gcongr + exact hnorm N + _ = 1 := by + rw [Real.norm_of_nonneg (inv_nonneg.mpr hB.le), inv_mul_cancel₀ hB.ne'] + · exact cubeBesovDualLocalMemLpGlobal_two_const_mul B⁻¹ hmem + +theorem cubeBesovDualFullTest_two_two_of_uniform_bound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (g : Vec d → ℝ) {B : ℝ} + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => B⁻¹ * g x) := by + refine ⟨?_, ?_⟩ + · intro N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => B⁻¹ * g x) + ≤ ‖B⁻¹‖ * cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + exact cubeBesovDualTestNorm_two_two_const_mul_le Q s N B⁻¹ g + _ ≤ ‖B⁻¹‖ * B := by + gcongr + exact hnorm N + _ = 1 := by + rw [Real.norm_of_nonneg (inv_nonneg.mpr hB.le), inv_mul_cancel₀ hB.ne'] + · exact cubeBesovDualLocalMemLpGlobal_two_const_mul B⁻¹ hmem + +theorem abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_one {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u * B := by + let g' : Vec d → ℝ := fun x => B⁻¹ * g x + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hg' : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) g' := + cubeBesovDualFullTest_two_one_of_uniform_bound Q s g hB hnorm hmem + have hpair : + |cubeBesovPairing Q u g'| ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u := by + exact abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test_of_memLp + Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u g' hs hu (by norm_num) (by norm_num) + (by + intro htop + simp [hpConj] at htop) + (by norm_num) hg' + have hg_eq : g = fun x => B * g' x := by + funext x + dsimp [g'] + field_simp [hB.ne'] + calc + |cubeBesovPairing Q u g| + = |cubeBesovPairing Q u (fun x => B * g' x)| := by rw [hg_eq] + _ = |B * cubeBesovPairing Q u g'| := by + rw [cubeBesovPairing_const_mul_right] + _ = B * |cubeBesovPairing Q u g'| := by + rw [abs_mul, abs_of_nonneg hB.le] + _ ≤ B * cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u := by + gcongr + _ = cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u * B := by ring + +theorem abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * B := by + let g' : Vec d → ℝ := fun x => B⁻¹ * g x + have hpConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [show cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)))] + norm_num + have hg' : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g' := + cubeBesovDualFullTest_two_two_of_uniform_bound Q s g hB hnorm hmem + have hpair : + |cubeBesovPairing Q u g'| ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u := by + exact abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test_of_memLp + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u g' hs hu (by norm_num) (by norm_num) + hpConjTop (by norm_num) hg' + have hg_eq : g = fun x => B * g' x := by + funext x + dsimp [g'] + field_simp [hB.ne'] + calc + |cubeBesovPairing Q u g| + = |cubeBesovPairing Q u (fun x => B * g' x)| := by rw [hg_eq] + _ = |B * cubeBesovPairing Q u g'| := by + rw [cubeBesovPairing_const_mul_right] + _ = B * |cubeBesovPairing Q u g'| := by + rw [abs_mul, abs_of_nonneg hB.le] + _ ≤ B * cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u := by + gcongr + _ = cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * B := by ring + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hpair := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_one + Q s u g hs hu hB hnorm hmem + have hfull := + cubeBesovDualFullNorm_le_note_rhs + Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u hs hu (by norm_num) (by norm_num) + (by + intro htop + simp [hpConj] at htop) + (by norm_num) + have hB_nonneg : 0 ≤ B := hB.le + calc + |cubeBesovPairing Q u g| + ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u * B := hpair + _ ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + gcongr + +/-- Sharp version of `abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one`. +The depth-zero circ term already contains the average contribution, so this +matches the LaTeX negative-Besov estimate without the extra positive average +tail. -/ +theorem abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * B := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hpair := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_one + Q s u g hs hu hB hnorm hmem + have hfull := + cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm + Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u hs hu (by norm_num) (by norm_num) + (by + intro htop + simp [hpConj] at htop) + (by norm_num) + calc + |cubeBesovPairing Q u g| + ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u * B := hpair + _ ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * B := by + exact mul_le_mul_of_nonneg_right hfull hB.le + +theorem abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * B := by + let A : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + have hCircBdd : + BddAbove (cubeBesovCircNormValueSet Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) := + cubeBesovCircNormValueSet_bddAbove_of_memLp Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + hs hu (by norm_num) (by norm_num) (by norm_num) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovCircNorm_nonneg Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u hCircBdd) + change |cubeBesovPairing Q u g| ≤ A * B + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + have hBδ_pos : 0 < B + δ := add_pos_of_nonneg_of_pos hB hδ_pos + have hnormδ : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B + δ := by + intro N + exact (hnorm N).trans (le_add_of_nonneg_right hδ_pos.le) + have hstrict := + abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one + Q s u g hs hu hBδ_pos hnormδ hmem + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + |cubeBesovPairing Q u g| ≤ A * (B + δ) := by + simpa [A] using hstrict + _ = A * B + A * δ := by ring + _ ≤ A * B + ε := by linarith + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + let A : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + have hCircBdd : + BddAbove (cubeBesovCircNormValueSet Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) := + cubeBesovCircNormValueSet_bddAbove_of_memLp Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + hs hu (by norm_num) (by norm_num) (by norm_num) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovCircNorm_nonneg Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u hCircBdd)) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (abs_nonneg _)) + dsimp [A] + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + have hBδ_pos : 0 < B + δ := add_pos_of_nonneg_of_pos hB hδ_pos + have hnormδ : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B + δ := by + intro N + exact (hnorm N).trans (le_add_of_nonneg_right hδ_pos.le) + have hstrict := + abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one + Q s u g hs hu hBδ_pos hnormδ hmem + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + |cubeBesovPairing Q u g| ≤ A * (B + δ) := by + simpa [A] using hstrict + _ = A * B + A * δ := by ring + _ ≤ A * B + ε := by linarith + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + have hpConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [show cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)))] + norm_num + have hpair := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two + Q s u g hs hu hB hnorm hmem + have hfull := + cubeBesovDualFullNorm_le_note_rhs + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u hs hu (by norm_num) (by norm_num) hpConjTop + (by norm_num) + calc + |cubeBesovPairing Q u g| + ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * B := hpair + _ ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + gcongr + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * B := by + let A : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + have hCircBdd : + BddAbove (cubeBesovCircNormValueSet Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u) := + cubeBesovCircNormValueSet_bddAbove_of_memLp Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + hs hu (by norm_num) (by norm_num) (by norm_num) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovCircNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u hCircBdd)) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (abs_nonneg _)) + dsimp [A] + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + have hBδ_pos : 0 < B + δ := add_pos_of_nonneg_of_pos hB hδ_pos + have hnormδ : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B + δ := by + intro N + exact (hnorm N).trans (le_add_of_nonneg_right hδ_pos.le) + have hstrict := + abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two + Q s u g hs hu hBδ_pos hnormδ hmem + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + |cubeBesovPairing Q u g| ≤ A * (B + δ) := by + simpa [A] using hstrict + _ = A * B + A * δ := by ring + _ ≤ A * B + ε := by linarith + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliVectorization.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliVectorization.lean new file mode 100644 index 0000000000..6895040e81 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/CaccioppoliVectorization.lean @@ -0,0 +1,471 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge + +/-! # Caccioppoli Vectorization -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeAverage_vecDot_eq_sum_cubeBesovPairing {d : ℕ} (Q : TriadicCube d) + (u g : Vec d → Vec d) + (hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q)) : + cubeAverage Q (fun x => vecDot (u x) (g x)) = + ∑ i, cubeBesovPairing Q (fun x => u x i) (fun x => g x i) := by + calc + cubeAverage Q (fun x => vecDot (u x) (g x)) + = ∫ x, vecDot (u x) (g x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, ∑ i, u x i * g x i ∂ normalizedCubeMeasure Q := by + simp [vecDot] + _ = ∑ i, ∫ x, u x i * g x i ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_finsetSum] + intro i hi + exact hInt i + _ = ∑ i, cubeBesovPairing Q (fun x => u x i) (fun x => g x i) := by + simp [cubeBesovPairing, cubeAverage_eq_integral_normalizedCubeMeasure] + +theorem abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing {d : ℕ} (Q : TriadicCube d) + (u g : Vec d → Vec d) + (hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + rw [cubeAverage_vecDot_eq_sum_cubeBesovPairing Q u g hInt] + simpa using + (Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun i : Fin d => cubeBesovPairing Q (fun x => u x i) (fun x => g x i))) + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_one + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => (B i)⁻¹ * g x i) := + cubeBesovDualFullTest_two_one_of_uniform_bound Q s (fun x => g x i) (hB i) (hnorm i) (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : MeasureTheory.MemLp (fun x => (B i)⁻¹ * g x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : MeasureTheory.MemLp (fun x => B i * ((B i)⁻¹ * g x i)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i) + convert hconst using 1 + funext x + field_simp [hB i |>.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hBi_pos : 0 < B i + 1 := add_pos_of_nonneg_of_pos (hB i) zero_lt_one + have hnormBi : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => g x i) ≤ + B i + 1 := by + intro N + exact (hnorm i N).trans (le_add_of_nonneg_right zero_le_one) + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => (B i + 1)⁻¹ * g x i) := + cubeBesovDualFullTest_two_one_of_uniform_bound Q s (fun x => g x i) + hBi_pos hnormBi (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : + MeasureTheory.MemLp (fun x => (B i + 1)⁻¹ * g x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : + MeasureTheory.MemLp (fun x => (B i + 1) * ((B i + 1)⁻¹ * g x i)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i + 1) + convert hconst using 1 + funext x + field_simp [hBi_pos.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +/-- Sharp vectorized two-one pairing bound without the redundant average tail +in the flux dual norm. -/ +theorem abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hBi_pos : 0 < B i + 1 := add_pos_of_nonneg_of_pos (hB i) zero_lt_one + have hnormBi : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => g x i) ≤ + B i + 1 := by + intro N + exact (hnorm i N).trans (le_add_of_nonneg_right zero_le_one) + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => (B i + 1)⁻¹ * g x i) := + cubeBesovDualFullTest_two_one_of_uniform_bound Q s (fun x => g x i) + hBi_pos hnormBi (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : + MeasureTheory.MemLp (fun x => (B i + 1)⁻¹ * g x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : + MeasureTheory.MemLp (fun x => (B i + 1) * ((B i + 1)⁻¹ * g x i)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i + 1) + convert hconst using 1 + funext x + field_simp [hBi_pos.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +theorem sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_of_uniform_component_bounds_two_one + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| ≤ + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_one + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +theorem abs_cubeAverage_vecDot_le_sum_dualFullNorm_mul_of_uniform_component_bounds_two_one + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => (B i)⁻¹ * g x i) := + cubeBesovDualFullTest_two_one_of_uniform_bound Q s (fun x => g x i) (hB i) + (hnorm i) (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : MeasureTheory.MemLp (fun x => (B i)⁻¹ * g x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : MeasureTheory.MemLp (fun x => B i * ((B i)⁻¹ * g x i)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i) + convert hconst using 1 + funext x + field_simp [hB i |>.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i) * B i := by + exact + sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_of_uniform_component_bounds_two_one + Q s u g B hs hu hB hnorm hmem + +theorem sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_sum_bounds_two_one + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) + (hdualNonneg : + ∀ i : Fin d, + 0 ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) : + ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| ≤ + (∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + (∑ i, B i) := by + have hcomponent : + ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| ≤ + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i := + sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_of_uniform_component_bounds_two_one + Q s u g B hs hu hB hnorm hmem + calc + ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| + ≤ ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i) * B i := hcomponent + _ ≤ ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i) * (∑ j, B j) := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact mul_le_mul_of_nonneg_left + (Finset.single_le_sum (fun j _hj => (hB j).le) (Finset.mem_univ i)) + (hdualNonneg i) + _ = (∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i)) * (∑ i, B i) := by + rw [Finset.sum_mul] + +theorem abs_cubeAverage_vecDot_le_sum_dualFullNorm_mul_sum_bounds_two_one + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) + (hdualNonneg : + ∀ i : Fin d, + 0 ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + (∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + (∑ i, B i) := by + have hcomponent : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i := + abs_cubeAverage_vecDot_le_sum_dualFullNorm_mul_of_uniform_component_bounds_two_one + Q s u g B hs hu hB hnorm hmem + have hgroup : + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i ≤ + (∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + (∑ i, B i) := by + calc + ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) * + B i + ≤ ∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i) * (∑ j, B j) := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact mul_le_mul_of_nonneg_left + (Finset.single_le_sum (fun j _hj => (hB j).le) (Finset.mem_univ i)) + (hdualNonneg i) + _ = (∑ i, cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i)) * (∑ i, B i) := by + rw [Finset.sum_mul] + exact hcomponent.trans hgroup + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 < B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => (B i)⁻¹ * g x i) := + cubeBesovDualFullTest_two_two_of_uniform_bound Q s (fun x => g x i) (hB i) (hnorm i) (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : MeasureTheory.MemLp (fun x => (B i)⁻¹ * g x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : MeasureTheory.MemLp (fun x => B i * ((B i)⁻¹ * g x i)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i) + convert hconst using 1 + funext x + field_simp [hB i |>.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hBi_pos : 0 < B i + 1 := add_pos_of_nonneg_of_pos (hB i) zero_lt_one + have hnormBi : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ + B i + 1 := by + intro N + exact (hnorm i N).trans (le_add_of_nonneg_right zero_le_one) + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => (B i + 1)⁻¹ * g x i) := + cubeBesovDualFullTest_two_two_of_uniform_bound Q s (fun x => g x i) + hBi_pos hnormBi (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : + MeasureTheory.MemLp (fun x => (B i + 1)⁻¹ * g x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : + MeasureTheory.MemLp (fun x => (B i + 1) * ((B i + 1)⁻¹ * g x i)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i + 1) + convert hconst using 1 + funext x + field_simp [hBi_pos.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Definitions.lean new file mode 100644 index 0000000000..68e39796bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Definitions.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import Mathlib.Data.Real.ConjExponents + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +Finite disjoint duality scaffolding for cube Besov norms. + +This checkpoint freezes the normalized cube pairing together with the +test-function conventions that define the two dual negative-order Besov +seminorms used later: + +- the full dual seminorm, tested against positive Besov norms; +- the mean-zero-tested dual seminorm, matching the hat-seminorm in the notes. + +At this stage we package the disjoint finite-depth definitions and the cheap +zero-function API. Overlap finite dual tests live in +`Homogenization.Besov.Duality.OverlapDefinitions`. +-/ + +noncomputable def cubeBesovPairing {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) : ℝ := + cubeAverage Q (fun x => f x * g x) + +noncomputable def cubeBesovConjExponent (p : ℝ≥0∞) : ℝ≥0∞ := + ENNReal.conjExponent p + +theorem cubeBesovConjExponent_ne_zero (p : ℝ≥0∞) : + cubeBesovConjExponent p ≠ 0 := by + simp [cubeBesovConjExponent, ENNReal.conjExponent] + +noncomputable def cubeBesovDualTestNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : ℝ := + if cubeBesovConjExponent q = ∞ then + cubeBesovPartialNormTop Q s (cubeBesovConjExponent p) N g + else + cubeBesovPartialNorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) N g + +noncomputable def cubeBesovDualTestSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : ℝ := + if cubeBesovConjExponent q = ∞ then + cubeBesovPartialSeminormTop Q s (cubeBesovConjExponent p) N g + else + cubeBesovPartialSeminorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) N g + +@[simp] theorem cubeBesovDualTestNorm_of_conjExponent_eq_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q = ∞) : + cubeBesovDualTestNorm Q s p q N g = + cubeBesovPartialNormTop Q s (cubeBesovConjExponent p) N g := by + simp [cubeBesovDualTestNorm, hq] + +@[simp] theorem cubeBesovDualTestNorm_of_conjExponent_ne_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q ≠ ∞) : + cubeBesovDualTestNorm Q s p q N g = + cubeBesovPartialNorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) N g := by + simp [cubeBesovDualTestNorm, hq] + +@[simp] theorem cubeBesovDualTestSeminorm_of_conjExponent_eq_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q = ∞) : + cubeBesovDualTestSeminorm Q s p q N g = + cubeBesovPartialSeminormTop Q s (cubeBesovConjExponent p) N g := by + simp [cubeBesovDualTestSeminorm, hq] + +@[simp] theorem cubeBesovDualTestSeminorm_of_conjExponent_ne_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q ≠ ∞) : + cubeBesovDualTestSeminorm Q s p q N g = + cubeBesovPartialSeminorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) N g := by + simp [cubeBesovDualTestSeminorm, hq] + +theorem cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (havg : cubeAverage Q g = 0) : + cubeBesovDualTestNorm Q s p q N g = cubeBesovDualTestSeminorm Q s p q N g := by + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s p q N g hq, + cubeBesovDualTestSeminorm_of_conjExponent_eq_top Q s p q N g hq] + unfold cubeBesovPartialNormTop + rw [havg] + simp + · rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hq, + cubeBesovDualTestSeminorm_of_conjExponent_ne_top Q s p q N g hq] + unfold cubeBesovPartialNorm + rw [havg] + simp + +def CubeBesovDualLocalMemLp {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R) + +def CubeBesovDualTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + cubeBesovDualTestNorm Q s p q N g ≤ 1 ∧ + CubeBesovDualLocalMemLp Q p N g + +def CubeBesovDualMeanZeroTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + cubeBesovDualTestSeminorm Q s p q N g ≤ 1 ∧ + cubeAverage Q g = 0 ∧ + CubeBesovDualLocalMemLp Q p N g + +theorem CubeBesovDualTest.norm_le_one {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualTest Q s p q N g) : + cubeBesovDualTestNorm Q s p q N g ≤ 1 := + hg.1 + +theorem CubeBesovDualTest.local_memLp {d : ℕ} {Q : TriadicCube d} + {p : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualLocalMemLp Q p N g) : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R) := + hg + +theorem CubeBesovDualTest.memLp_admissible {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualTest Q s p q N g) : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R) := + hg.2 + +theorem CubeBesovDualMeanZeroTest.seminorm_le_one {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualMeanZeroTest Q s p q N g) : + cubeBesovDualTestSeminorm Q s p q N g ≤ 1 := + hg.1 + +theorem CubeBesovDualMeanZeroTest.cubeAverage_eq_zero {d : ℕ} {Q : TriadicCube d} + {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualMeanZeroTest Q s p q N g) : + cubeAverage Q g = 0 := + hg.2.1 + +theorem CubeBesovDualMeanZeroTest.memLp_admissible {d : ℕ} {Q : TriadicCube d} + {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualMeanZeroTest Q s p q N g) : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R) := + hg.2.2 + +theorem cubeBesovDualLocalMemLp_const {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (N : ℕ) (c : ℝ) : + CubeBesovDualLocalMemLp Q p N (fun _ => c) := by + intro j hj R hR + rw [cubeFluctuation_const] + exact + (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + +def cubeBesovDualPartialNormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) : Set ℝ := + {r | ∃ g : Vec d → ℝ, CubeBesovDualTest Q s p q N g ∧ r = |cubeBesovPairing Q f g|} + +def cubeBesovDualPartialSeminormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) : Set ℝ := + {r | ∃ g : Vec d → ℝ, CubeBesovDualMeanZeroTest Q s p q N g ∧ + r = |cubeBesovPairing Q f g|} + +noncomputable def cubeBesovDualPartialNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) : ℝ := + sSup (cubeBesovDualPartialNormValueSet Q s p q N f) + +noncomputable def cubeBesovDualPartialSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) : ℝ := + sSup (cubeBesovDualPartialSeminormValueSet Q s p q N f) + +theorem cubeBesovScaleWeight_mul_norm_cubeAverage_le_cubeBesovDualTestNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : + cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖ ≤ cubeBesovDualTestNorm Q s p q N g := by + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s p q N g hq] + unfold cubeBesovPartialNormTop + exact le_add_of_nonneg_left + (cubeBesovPartialSeminormTop_nonneg Q s (cubeBesovConjExponent p) N g) + · rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hq] + unfold cubeBesovPartialNorm + exact le_add_of_nonneg_left + (cubeBesovPartialSeminorm_nonneg Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) N g) + +theorem CubeBesovDualMeanZeroTest.to_dual_test {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualMeanZeroTest Q s p q N g) : + CubeBesovDualTest Q s p q N g := by + rcases hg with ⟨hseminorm, havg, hmem⟩ + unfold CubeBesovDualTest + rw [cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero + Q s p q N g havg] + exact ⟨hseminorm, hmem⟩ + +theorem CubeBesovDualTest.scaleWeight_mul_norm_cubeAverage_le_one {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovDualTest Q s p q N g) : + cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖ ≤ 1 := by + exact le_trans + (cubeBesovScaleWeight_mul_norm_cubeAverage_le_cubeBesovDualTestNorm Q s p q N g) + hg.norm_le_one + +theorem cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight {d : ℕ} + (Q : TriadicCube d) (s : ℝ) : + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q = 1 := by + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + unfold cubeBesovScaleWeight + rw [show -(-s) = s by ring, ← Real.rpow_add hpos] + rw [show s + -s = 0 by ring, Real.rpow_zero] + +theorem cubeBesovDualPartialSeminormValueSet_subset_cubeBesovDualPartialNormValueSet + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) : + cubeBesovDualPartialSeminormValueSet Q s p q N f ⊆ + cubeBesovDualPartialNormValueSet Q s p q N f := by + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact ⟨g, hg.to_dual_test, rfl⟩ + +theorem cubeBesovDualPartialSeminorm_le_cubeBesovDualPartialNorm_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) + (hBdd : BddAbove (cubeBesovDualPartialNormValueSet Q s p q N f)) : + cubeBesovDualPartialSeminorm Q s p q N f ≤ cubeBesovDualPartialNorm Q s p q N f := by + unfold cubeBesovDualPartialSeminorm cubeBesovDualPartialNorm + have hNonempty : (cubeBesovDualPartialSeminormValueSet Q s p q N f).Nonempty := by + refine ⟨0, ?_⟩ + refine ⟨fun _ => (0 : ℝ), ?_, ?_⟩ + refine ⟨?_, by simpa using cubeAverage_const Q (0 : ℝ), ?_⟩ + · unfold cubeBesovDualTestSeminorm + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [if_pos hq] + rw [cubeBesovPartialSeminormTop_zero (Q := Q) (s := s) (p := cubeBesovConjExponent p) + (N := N) hp0 hpTop] + norm_num + · have hq0 : cubeBesovConjExponent q ≠ 0 := cubeBesovConjExponent_ne_zero q + rw [if_neg hq] + rw [cubeBesovPartialSeminorm_zero (Q := Q) (s := s) (p := cubeBesovConjExponent p) + (q := cubeBesovConjExponent q) (N := N) hp0 hpTop hq0 hq] + norm_num + · intro j hj R hR + rw [cubeFluctuation_zero] + exact + (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + · unfold cubeBesovPairing + rw [show (fun x => f x * (0 : ℝ)) = fun _ => (0 : ℝ) by + funext x + simp] + rw [cubeAverage_const] + simp + exact csSup_le_csSup hBdd + hNonempty + (cubeBesovDualPartialSeminormValueSet_subset_cubeBesovDualPartialNormValueSet + (Q := Q) (s := s) (p := p) (q := q) (N := N) (f := f)) + +theorem abs_cubeBesovPairing_le_cubeBesovDualPartialNorm_of_dual_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (f g : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDualPartialNormValueSet Q s p q N f)) + (hg : CubeBesovDualTest Q s p q N g) : + |cubeBesovPairing Q f g| ≤ cubeBesovDualPartialNorm Q s p q N f := by + unfold cubeBesovDualPartialNorm + exact le_csSup hBdd ⟨g, hg, rfl⟩ + +theorem abs_cubeBesovPairing_le_cubeBesovDualPartialSeminorm_of_dual_mean_zero_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (f g : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDualPartialSeminormValueSet Q s p q N f)) + (hg : CubeBesovDualMeanZeroTest Q s p q N g) : + |cubeBesovPairing Q f g| ≤ cubeBesovDualPartialSeminorm Q s p q N f := by + unfold cubeBesovDualPartialSeminorm + exact le_csSup hBdd ⟨g, hg, rfl⟩ + +theorem abs_cubeBesovPairing_le_mul_cubeLpNorm_of_holderConjugate {d : ℕ} + (Q : TriadicCube d) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + [ENNReal.HolderConjugate p q] + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g q (normalizedCubeMeasure Q)) : + |cubeBesovPairing Q f g| ≤ cubeLpNorm Q p f * cubeLpNorm Q q g := by + simpa [cubeBesovPairing] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_of_holderConjugate Q p q f g hf hg + +theorem abs_cubeBesovPairing_le_mul_cubeLpNorm_conjExponent {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + |cubeBesovPairing Q f g| ≤ + cubeLpNorm Q p f * cubeLpNorm Q (cubeBesovConjExponent p) g := by + simpa [cubeBesovPairing, cubeBesovConjExponent] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent Q p f g hf hg hp + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Elementary.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Elementary.lean new file mode 100644 index 0000000000..f92cd13cc9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Elementary.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions + +/-! # Elementary -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +@[simp] theorem cubeBesovPairing_comm {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) : + cubeBesovPairing Q f g = cubeBesovPairing Q g f := by + simp [cubeBesovPairing, mul_comm] + +@[simp] theorem cubeBesovPairing_const_left {d : ℕ} (Q : TriadicCube d) + (c : ℝ) (g : Vec d → ℝ) : + cubeBesovPairing Q (fun _ => c) g = c * cubeAverage Q g := by + unfold cubeBesovPairing cubeAverage + rw [MeasureTheory.integral_const_mul] + ring + +@[simp] theorem cubeBesovPairing_const_right {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) (c : ℝ) : + cubeBesovPairing Q f (fun _ => c) = c * cubeAverage Q f := by + rw [cubeBesovPairing_comm, cubeBesovPairing_const_left] + +theorem abs_cubeBesovPairing_const_left_le_of_dual_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (c : ℝ) (g : Vec d → ℝ) (hg : CubeBesovDualTest Q s p q N g) : + |cubeBesovPairing Q (fun _ => c) g| ≤ cubeBesovScaleWeight (-s) Q * ‖c‖ := by + calc + |cubeBesovPairing Q (fun _ => c) g| + = |c * cubeAverage Q g| := by rw [cubeBesovPairing_const_left] + _ = ‖c‖ * ‖cubeAverage Q g‖ := by + simp [abs_mul] + _ = (cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + (‖c‖ * ‖cubeAverage Q g‖) := by + rw [cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight, one_mul] + _ = (cubeBesovScaleWeight (-s) Q * ‖c‖) * + (cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖) := by ring + _ ≤ (cubeBesovScaleWeight (-s) Q * ‖c‖) * 1 := by + refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact hg.scaleWeight_mul_norm_cubeAverage_le_one + · exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) (norm_nonneg _) + _ = cubeBesovScaleWeight (-s) Q * ‖c‖ := by ring + +@[simp] theorem cubeBesovPairing_zero_left {d : ℕ} (Q : TriadicCube d) + (g : Vec d → ℝ) : + cubeBesovPairing Q (fun _ => (0 : ℝ)) g = 0 := by + unfold cubeBesovPairing + simpa using cubeAverage_const Q (0 : ℝ) + +@[simp] theorem cubeBesovPairing_zero_right {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) : + cubeBesovPairing Q f (fun _ => (0 : ℝ)) = 0 := by + unfold cubeBesovPairing + simpa using cubeAverage_const Q (0 : ℝ) + +@[simp] theorem cubeBesovPairing_neg_left {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) : + cubeBesovPairing Q (fun x => -f x) g = -cubeBesovPairing Q f g := by + unfold cubeBesovPairing cubeAverage + simp_rw [neg_mul] + rw [MeasureTheory.integral_neg, mul_neg] + +@[simp] theorem cubeBesovPairing_neg_right {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) : + cubeBesovPairing Q f (fun x => -g x) = -cubeBesovPairing Q f g := by + unfold cubeBesovPairing cubeAverage + simp_rw [mul_neg] + rw [MeasureTheory.integral_neg, mul_neg] + +theorem cubeBesovDualPartialNormValueSet_nonneg {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {f : Vec d → ℝ} {r : ℝ} + (hr : r ∈ cubeBesovDualPartialNormValueSet Q s p q N f) : + 0 ≤ r := by + rcases hr with ⟨g, hg, rfl⟩ + exact abs_nonneg _ + +theorem cubeBesovDualPartialSeminormValueSet_nonneg {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {f : Vec d → ℝ} {r : ℝ} + (hr : r ∈ cubeBesovDualPartialSeminormValueSet Q s p q N f) : + 0 ≤ r := by + rcases hr with ⟨g, hg, rfl⟩ + exact abs_nonneg _ + +@[simp] theorem cubeBesovDualTestNorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualTestNorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + unfold cubeBesovDualTestNorm + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [if_pos hq] + simpa using cubeBesovPartialNormTop_zero + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (N := N) hp0 hpTop + · rw [if_neg hq] + have hq0 : cubeBesovConjExponent q ≠ 0 := cubeBesovConjExponent_ne_zero q + simpa using cubeBesovPartialNorm_zero + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (q := cubeBesovConjExponent q) + (N := N) hp0 hpTop hq0 hq + +@[simp] theorem cubeBesovDualTestSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualTestSeminorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + unfold cubeBesovDualTestSeminorm + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [if_pos hq] + simpa using cubeBesovPartialSeminormTop_zero + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (N := N) hp0 hpTop + · rw [if_neg hq] + have hq0 : cubeBesovConjExponent q ≠ 0 := cubeBesovConjExponent_ne_zero q + simpa using cubeBesovPartialSeminorm_zero + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (q := cubeBesovConjExponent q) + (N := N) hp0 hpTop hq0 hq + +theorem cubeBesovDualTest_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + CubeBesovDualTest Q s p q N (fun _ => (0 : ℝ)) := by + unfold CubeBesovDualTest + rw [cubeBesovDualTestNorm_zero Q s p q N hp0 hpTop] + refine ⟨by norm_num, ?_⟩ + simpa using cubeBesovDualLocalMemLp_const Q p N (0 : ℝ) + +theorem cubeBesovDualMeanZeroTest_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + CubeBesovDualMeanZeroTest Q s p q N (fun _ => (0 : ℝ)) := by + refine ⟨?_, by simpa using cubeAverage_const Q (0 : ℝ), ?_⟩ + · rw [cubeBesovDualTestSeminorm_zero Q s p q N hp0 hpTop] + norm_num + · simpa using cubeBesovDualLocalMemLp_const Q p N (0 : ℝ) + +theorem zero_mem_cubeBesovDualPartialNormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ∈ cubeBesovDualPartialNormValueSet Q s p q N f := by + refine ⟨fun _ => (0 : ℝ), cubeBesovDualTest_zero Q s p q N hp0 hpTop, ?_⟩ + simp + +theorem zero_mem_cubeBesovDualPartialSeminormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ∈ cubeBesovDualPartialSeminormValueSet Q s p q N f := by + refine ⟨fun _ => (0 : ℝ), + cubeBesovDualMeanZeroTest_zero Q s p q N hp0 hpTop, ?_⟩ + simp + +theorem cubeBesovDualPartialNormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + (cubeBesovDualPartialNormValueSet Q s p q N f).Nonempty := + ⟨0, zero_mem_cubeBesovDualPartialNormValueSet Q s p q N f hp0 hpTop⟩ + +theorem cubeBesovDualPartialSeminormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + (cubeBesovDualPartialSeminormValueSet Q s p q N f).Nonempty := + ⟨0, zero_mem_cubeBesovDualPartialSeminormValueSet Q s p q N f hp0 hpTop⟩ + +theorem cubeBesovDualPartialNorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) + (hBdd : BddAbove (cubeBesovDualPartialNormValueSet Q s p q N f)) : + 0 ≤ cubeBesovDualPartialNorm Q s p q N f := by + unfold cubeBesovDualPartialNorm + exact le_csSup hBdd + (zero_mem_cubeBesovDualPartialNormValueSet Q s p q N f hp0 hpTop) + +theorem cubeBesovDualPartialSeminorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) + (hBdd : BddAbove (cubeBesovDualPartialSeminormValueSet Q s p q N f)) : + 0 ≤ cubeBesovDualPartialSeminorm Q s p q N f := by + unfold cubeBesovDualPartialSeminorm + exact le_csSup hBdd + (zero_mem_cubeBesovDualPartialSeminormValueSet Q s p q N f hp0 hpTop) + +theorem cubeBesovDualPartialNormValueSet_const_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (c : ℝ) : + BddAbove (cubeBesovDualPartialNormValueSet Q s p q N (fun _ => c)) := by + refine ⟨cubeBesovScaleWeight (-s) Q * ‖c‖, ?_⟩ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_const_left_le_of_dual_test Q s p q N c g hg + +theorem cubeBesovDualPartialNorm_const_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialNorm Q s p q N (fun _ => c) ≤ cubeBesovScaleWeight (-s) Q * ‖c‖ := by + unfold cubeBesovDualPartialNorm + refine csSup_le ?_ ?_ + · exact cubeBesovDualPartialNormValueSet_nonempty Q s p q N (fun _ => c) hp0 hpTop + · intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_const_left_le_of_dual_test Q s p q N c g hg + +theorem cubeBesovDualTest_const_scaleWeight_neg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + CubeBesovDualTest Q s p q N (fun _ => cubeBesovScaleWeight (-s) Q) := by + unfold CubeBesovDualTest + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s p q N + (fun _ => cubeBesovScaleWeight (-s) Q) hq] + rw [cubeBesovPartialNormTop_const (Q := Q) (s := s) + (p := cubeBesovConjExponent p) (N := N) (u := cubeBesovScaleWeight (-s) Q) hp0 hpTop] + rw [Real.norm_of_nonneg (cubeBesovScaleWeight_nonneg (-s) Q)] + have hmul : cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + refine ⟨by simp [hmul], ?_⟩ + exact cubeBesovDualLocalMemLp_const Q p N (cubeBesovScaleWeight (-s) Q) + · have hq0 : cubeBesovConjExponent q ≠ 0 := cubeBesovConjExponent_ne_zero q + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N + (fun _ => cubeBesovScaleWeight (-s) Q) hq] + rw [cubeBesovPartialNorm_const (Q := Q) (s := s) + (p := cubeBesovConjExponent p) (q := cubeBesovConjExponent q) (N := N) + (u := cubeBesovScaleWeight (-s) Q) hp0 hpTop hq0 hq] + rw [Real.norm_of_nonneg (cubeBesovScaleWeight_nonneg (-s) Q)] + have hmul : cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + refine ⟨by simp [hmul], ?_⟩ + exact cubeBesovDualLocalMemLp_const Q p N (cubeBesovScaleWeight (-s) Q) + +@[simp] theorem cubeBesovDualPartialNorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialNorm Q s p q N (fun _ => c) = + cubeBesovScaleWeight (-s) Q * ‖c‖ := by + apply le_antisymm + · exact cubeBesovDualPartialNorm_const_le Q s p q N c hp0 hpTop + · refine le_csSup + (cubeBesovDualPartialNormValueSet_const_bddAbove Q s p q N c) ?_ + refine ⟨fun _ => cubeBesovScaleWeight (-s) Q, + cubeBesovDualTest_const_scaleWeight_neg Q s p q N hp0 hpTop, ?_⟩ + rw [cubeBesovPairing_const_left, cubeAverage_const] + simp [abs_mul, abs_of_nonneg (cubeBesovScaleWeight_nonneg (-s) Q), mul_comm] + +@[simp] theorem cubeBesovDualPartialSeminormValueSet_const {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialSeminormValueSet Q s p q N (fun _ => c) = {0} := by + ext r + constructor + · intro hr + rcases hr with ⟨g, hg, rfl⟩ + rcases hg with ⟨-, havg, -⟩ + rw [cubeBesovPairing_const_left, havg] + simp + · intro hr + rw [Set.mem_singleton_iff] at hr + subst hr + exact zero_mem_cubeBesovDualPartialSeminormValueSet Q s p q N (fun _ => c) hp0 hpTop + +@[simp] theorem cubeBesovDualPartialSeminorm_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialSeminorm Q s p q N (fun _ => c) = 0 := by + rw [cubeBesovDualPartialSeminorm, + cubeBesovDualPartialSeminormValueSet_const Q s p q N c hp0 hpTop] + simp + +@[simp] theorem cubeBesovDualPartialNormValueSet_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialNormValueSet Q s p q N (fun _ => (0 : ℝ)) = {0} := by + ext r + constructor + · intro hr + rcases hr with ⟨g, hg, rfl⟩ + simp + · intro hr + rw [Set.mem_singleton_iff] at hr + subst hr + exact zero_mem_cubeBesovDualPartialNormValueSet Q s p q N (fun _ => (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovDualPartialSeminormValueSet_zero {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialSeminormValueSet Q s p q N (fun _ => (0 : ℝ)) = {0} := by + ext r + constructor + · intro hr + rcases hr with ⟨g, hg, rfl⟩ + simp + · intro hr + rw [Set.mem_singleton_iff] at hr + subst hr + exact zero_mem_cubeBesovDualPartialSeminormValueSet Q s p q N (fun _ => (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovDualPartialNorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialNorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovDualPartialNorm, cubeBesovDualPartialNormValueSet_zero Q s p q N hp0 hpTop] + simp + +@[simp] theorem cubeBesovDualPartialSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualPartialSeminorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovDualPartialSeminorm, cubeBesovDualPartialSeminormValueSet_zero Q s p q N hp0 hpTop] + simp + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Full.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Full.lean new file mode 100644 index 0000000000..a5c72d0fd2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/Full.lean @@ -0,0 +1,289 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Elementary + +/-! # Full -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +Global wrapper layer for the cube Besov duality package. + +This file keeps the new global objects deliberately minimal: + +* a depth-uniform local `MemLp` predicate for dual tests; +* global dual test predicates, using the finite-depth comparison norms as the + test data; +* global value sets and `sSup` wrappers for the dual pairing bounds; +* a global circ wrapper built from the finite circ branch. + +The comparison theorems themselves are still deferred to the later +projection-limit layer. +-/ + +noncomputable def CubeBesovDualLocalMemLpGlobal {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) (cubeBesovConjExponent p) + (normalizedCubeMeasure R) + +noncomputable def cubeBesovDualFullTestNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : ℝ := + sSup (Set.range (fun N : ℕ => cubeBesovDualTestNorm Q s p q N g)) + +noncomputable def cubeBesovDualMeanZeroTestSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : ℝ := + sSup (Set.range (fun N : ℕ => cubeBesovDualTestSeminorm Q s p q N g)) + +def CubeBesovDualFullTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + (∀ N : ℕ, cubeBesovDualTestNorm Q s p q N g ≤ 1) ∧ + CubeBesovDualLocalMemLpGlobal Q p g + +def CubeBesovDualMeanZeroTestGlobal {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + (∀ N : ℕ, cubeBesovDualTestSeminorm Q s p q N g ≤ 1) ∧ + cubeAverage Q g = 0 ∧ CubeBesovDualLocalMemLpGlobal Q p g + +theorem CubeBesovDualFullTest.to_dual_test {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {g : Vec d → ℝ} (hg : CubeBesovDualFullTest Q s p q g) : + ∀ N : ℕ, CubeBesovDualTest Q s p q N g := by + intro N + exact ⟨hg.1 N, fun j hj R hR => hg.2 j R hR⟩ + +theorem CubeBesovDualMeanZeroTestGlobal.to_dual_test {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {g : Vec d → ℝ} (hg : CubeBesovDualMeanZeroTestGlobal Q s p q g) : + ∀ N : ℕ, CubeBesovDualTest Q s p q N g := by + intro N + have hnorm : cubeBesovDualTestNorm Q s p q N g ≤ 1 := by + rw [cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero + Q s p q N g hg.2.1] + exact hg.1 N + exact ⟨hnorm, fun j hj R hR => hg.2.2 j R hR⟩ + +noncomputable def cubeBesovDualFullNormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) : Set ℝ := + {r | ∃ g : Vec d → ℝ, CubeBesovDualFullTest Q s p q g ∧ r = |cubeBesovPairing Q f g|} + +noncomputable def cubeBesovDualMeanZeroSeminormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) : Set ℝ := + {r | ∃ g : Vec d → ℝ, CubeBesovDualMeanZeroTestGlobal Q s p q g ∧ + r = |cubeBesovPairing Q f g|} + +noncomputable def cubeBesovDualFullNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) : ℝ := + sSup (cubeBesovDualFullNormValueSet Q s p q f) + +noncomputable def cubeBesovDualMeanZeroSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) : ℝ := + sSup (cubeBesovDualMeanZeroSeminormValueSet Q s p q f) + +noncomputable def cubeBesovCircNormEntry {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + if q = ∞ then + cubeBesovCircPartialNormTop Q s p (N + 1) u + else + cubeBesovCircPartialNorm Q s p q (N + 1) u + +noncomputable def cubeBesovCircNormValueSet {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range (fun N : ℕ => cubeBesovCircNormEntry Q s p q N u) + +noncomputable def cubeBesovCircNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovCircNormValueSet Q s p q u) + +theorem CubeBesovDualFullTest_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + CubeBesovDualFullTest Q s p q (fun _ => (0 : ℝ)) := by + refine ⟨?_, ?_⟩ + · intro N + rw [cubeBesovDualTestNorm_zero Q s p q N hp0 hpTop] + norm_num + · intro j R hR + rw [cubeFluctuation_const] + exact (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + +theorem CubeBesovDualMeanZeroTestGlobal_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + CubeBesovDualMeanZeroTestGlobal Q s p q (fun _ => (0 : ℝ)) := by + refine ⟨?_, ?_, ?_⟩ + · intro N + rw [cubeBesovDualTestSeminorm_zero Q s p q N hp0 hpTop] + norm_num + · rw [cubeAverage_const] + · intro j R hR + rw [cubeFluctuation_const] + exact (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + +theorem cubeBesovDualFullNormValueSet_nonempty {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + (cubeBesovDualFullNormValueSet Q s p q f).Nonempty := by + refine ⟨0, ?_⟩ + refine ⟨fun _ => (0 : ℝ), CubeBesovDualFullTest_zero Q s p q hp0 hpTop, ?_⟩ + simpa [cubeBesovPairing] using (congrArg abs (cubeAverage_const Q (0 : ℝ))).symm + +theorem zero_mem_cubeBesovDualFullNormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ∈ cubeBesovDualFullNormValueSet Q s p q f := by + refine ⟨fun _ => (0 : ℝ), CubeBesovDualFullTest_zero Q s p q hp0 hpTop, ?_⟩ + simp + +theorem cubeBesovDualMeanZeroSeminormValueSet_nonempty {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + (cubeBesovDualMeanZeroSeminormValueSet Q s p q f).Nonempty := by + refine ⟨0, ?_⟩ + refine ⟨fun _ => (0 : ℝ), CubeBesovDualMeanZeroTestGlobal_zero Q s p q hp0 hpTop, ?_⟩ + simpa [cubeBesovPairing] using (congrArg abs (cubeAverage_const Q (0 : ℝ))).symm + +theorem zero_mem_cubeBesovDualMeanZeroSeminormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ∈ cubeBesovDualMeanZeroSeminormValueSet Q s p q f := by + refine ⟨fun _ => (0 : ℝ), CubeBesovDualMeanZeroTestGlobal_zero Q s p q hp0 hpTop, ?_⟩ + simp + +theorem cubeBesovDualMeanZeroSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ≤ cubeBesovDualMeanZeroSeminorm Q s p q f := by + unfold cubeBesovDualMeanZeroSeminorm + exact Real.sSup_nonneg' + ⟨0, zero_mem_cubeBesovDualMeanZeroSeminormValueSet Q s p q f hp0 hpTop, le_rfl⟩ + +theorem cubeBesovDualFullNorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 ≤ cubeBesovDualFullNorm Q s p q f := by + unfold cubeBesovDualFullNorm + exact Real.sSup_nonneg' + ⟨0, zero_mem_cubeBesovDualFullNormValueSet Q s p q f hp0 hpTop, le_rfl⟩ + +/-- Bound a full dual negative Besov norm by bounding its pairing against all +unit full-dual tests. This is the formal supremum step used in duality +arguments. -/ +theorem cubeBesovDualFullNorm_le_of_forall_fullTest_pairing_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) {B : ℝ} + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) + (hB : + ∀ g : Vec d → ℝ, + CubeBesovDualFullTest Q s p q g → + |cubeBesovPairing Q f g| ≤ B) : + cubeBesovDualFullNorm Q s p q f ≤ B := by + unfold cubeBesovDualFullNorm + refine csSup_le + (cubeBesovDualFullNormValueSet_nonempty Q s p q f hp0 hpTop) ?_ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact hB g hg + +@[simp] theorem cubeBesovDualMeanZeroSeminormValueSet_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualMeanZeroSeminormValueSet Q s p q (fun _ => c) = {0} := by + ext r + constructor + · intro hr + rcases hr with ⟨g, hg, rfl⟩ + rw [cubeBesovPairing_const_left, hg.2.1] + simp + · intro hr + rw [Set.mem_singleton_iff] at hr + subst hr + exact zero_mem_cubeBesovDualMeanZeroSeminormValueSet + Q s p q (fun _ => c) hp0 hpTop + +@[simp] theorem cubeBesovDualMeanZeroSeminorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (c : ℝ) + (hp0 : cubeBesovConjExponent p ≠ 0) (hpTop : cubeBesovConjExponent p ≠ ∞) : + cubeBesovDualMeanZeroSeminorm Q s p q (fun _ => c) = 0 := by + rw [cubeBesovDualMeanZeroSeminorm, + cubeBesovDualMeanZeroSeminormValueSet_const Q s p q c hp0 hpTop] + simp + +theorem cubeBesovCircNormValueSet_nonempty {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovCircNormValueSet Q s p q u).Nonempty := by + exact ⟨cubeBesovCircNormEntry Q s p q 0 u, ⟨0, rfl⟩⟩ + +theorem abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDualFullNormValueSet Q s p q f)) + (hg : CubeBesovDualFullTest Q s p q g) : + |cubeBesovPairing Q f g| ≤ cubeBesovDualFullNorm Q s p q f := by + unfold cubeBesovDualFullNorm + exact le_csSup hBdd ⟨g, hg, rfl⟩ + +theorem abs_cubeBesovPairing_le_cubeBesovDualMeanZeroSeminorm_of_mean_zero_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDualMeanZeroSeminormValueSet Q s p q f)) + (hg : CubeBesovDualMeanZeroTestGlobal Q s p q g) : + |cubeBesovPairing Q f g| ≤ cubeBesovDualMeanZeroSeminorm Q s p q f := by + unfold cubeBesovDualMeanZeroSeminorm + exact le_csSup hBdd ⟨g, hg, rfl⟩ + +theorem cubeBesovCircNormEntry_le_cubeBesovCircNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovCircNormValueSet Q s p q u)) (N : ℕ) : + cubeBesovCircNormEntry Q s p q N u ≤ cubeBesovCircNorm Q s p q u := by + unfold cubeBesovCircNorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovCircPartialNorm_le_cubeBesovCircNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : q ≠ ∞) + (hBdd : BddAbove (cubeBesovCircNormValueSet Q s p q u)) (N : ℕ) : + cubeBesovCircPartialNorm Q s p q (N + 1) u ≤ cubeBesovCircNorm Q s p q u := by + simpa [cubeBesovCircNormEntry, hq] using + cubeBesovCircNormEntry_le_cubeBesovCircNorm Q s p q u hBdd N + +theorem cubeBesovCircPartialNormTop_le_cubeBesovCircNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : q = ∞) + (hBdd : BddAbove (cubeBesovCircNormValueSet Q s p q u)) (N : ℕ) : + cubeBesovCircPartialNormTop Q s p (N + 1) u ≤ cubeBesovCircNorm Q s p q u := by + simpa [cubeBesovCircNormEntry, hq] using + cubeBesovCircNormEntry_le_cubeBesovCircNorm Q s p q u hBdd N + +/-- Bound the full circ norm by a uniform bound on all entries in its defining +value set. -/ +theorem cubeBesovCircNorm_le_of_forall_entry_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovCircNormEntry Q s p q N u ≤ B) : + cubeBesovCircNorm Q s p q u ≤ B := by + unfold cubeBesovCircNorm + exact csSup_le (cubeBesovCircNormValueSet_nonempty Q s p q u) (by + intro y hy + rcases hy with ⟨N, rfl⟩ + exact hB N) + +/-- For finite `q`, the full circ norm is bounded by any uniform bound on all +finite partial circ norms. -/ +theorem cubeBesovCircNorm_le_of_forall_partialNorm_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) {B : ℝ} + (hq : q ≠ ∞) + (hB : ∀ N : ℕ, cubeBesovCircPartialNorm Q s p q N u ≤ B) : + cubeBesovCircNorm Q s p q u ≤ B := by + exact + cubeBesovCircNorm_le_of_forall_entry_le Q s p q u (by + intro N + simpa [cubeBesovCircNormEntry, hq] using hB (N + 1)) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/GlobalComparison.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/GlobalComparison.lean new file mode 100644 index 0000000000..f45007e296 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/GlobalComparison.lean @@ -0,0 +1,541 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.Order.Field.GeomSum +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit + +/-! # Global Comparison -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +theorem finset_Lq_norm_le_sum_of_nonneg {ι : Type*} (s : Finset ι) {q : ℝ} (hq : 1 ≤ q) + {f : ι → ℝ} (hf : ∀ i ∈ s, 0 ≤ f i) : + (Finset.sum s fun i => f i ^ q) ^ (1 / q) ≤ Finset.sum s fun i => f i := by + classical + have hq0 : q ≠ 0 := by linarith + induction s using Finset.induction_on with + | empty => + simp [hq0] + | @insert a s ha ih => + have hfa : 0 ≤ f a := hf a (by simp) + have hfs : ∀ i ∈ s, 0 ≤ f i := by + intro i hi + exact hf i (by simp [hi]) + have hsum_nonneg : 0 ≤ Finset.sum s (fun i => f i ^ q) := by + refine Finset.sum_nonneg ?_ + intro i hi + exact Real.rpow_nonneg (hfs i hi) q + calc + (Finset.sum (insert a s) fun i => f i ^ q) ^ (1 / q) + = (f a ^ q + Finset.sum s (fun i => f i ^ q)) ^ (1 / q) := by + rw [Finset.sum_insert ha] + _ = (f a ^ q + ((Finset.sum s fun i => f i ^ q) ^ (1 / q)) ^ q) ^ (1 / q) := by + congr 1 + symm + simpa [one_div] using Real.rpow_inv_rpow hsum_nonneg hq0 + _ ≤ f a + (Finset.sum s fun i => f i ^ q) ^ (1 / q) := by + exact Real.rpow_add_rpow_le_add hfa (Real.rpow_nonneg hsum_nonneg (1 / q)) hq + _ ≤ f a + Finset.sum s (fun i => f i) := by + gcongr + exact ih hfs + _ = Finset.sum (insert a s) (fun i => f i) := by rw [Finset.sum_insert ha] + +theorem cubeBesovCircDepthWeight_succ {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovCircDepthWeight Q s (j + 1) = + (3 : ℝ) ^ (-s) * cubeBesovCircDepthWeight Q s j := by + have hQ_nonneg : 0 ≤ cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (le_of_lt (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + have hA_nonneg : 0 ≤ cubeScaleFactor Q / (3 : ℝ) ^ j := by + exact div_nonneg hQ_nonneg (by positivity) + have hdiv : + cubeScaleFactor Q / (3 : ℝ) ^ (j + 1) = + (cubeScaleFactor Q / (3 : ℝ) ^ j) / 3 := by + rw [pow_succ', div_eq_mul_inv, div_eq_mul_inv] + ring + unfold cubeBesovCircDepthWeight + rw [hdiv, Real.div_rpow hA_nonneg (by positivity)] + rw [div_eq_mul_inv, mul_comm] + congr 1 + rw [← Real.rpow_neg (by positivity)] + +theorem cubeBesovCircDepthWeight_eq_scaleWeight_neg_mul_geom {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovCircDepthWeight Q s j = + cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j := by + induction j with + | zero => + simp [cubeBesovCircDepthWeight_depth_zero] + | succ j ih => + rw [cubeBesovCircDepthWeight_succ, ih, pow_succ'] + ring + +theorem cubeBesovCircDepthSeminorm_le_scaleWeight_neg_mul_geom_mul_cubeLpNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) : + cubeBesovCircDepthSeminorm Q s p u j ≤ + cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j * cubeLpNorm Q p u := by + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hp_pos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hdepth : + cubeBesovCircDepthSeminorm Q s p u j ≤ + cubeBesovCircDepthWeight Q s j * cubeLpNorm Q p u := by + unfold cubeBesovCircDepthSeminorm + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovCircDepthWeight_nonneg Q s j) + calc + (cubeBesovCircDepthAverage Q p u j) ^ (1 / p.toReal) + ≤ ((cubeLpNorm Q p u) ^ p.toReal) ^ (1 / p.toReal) := by + exact Real.rpow_le_rpow + (cubeBesovCircDepthAverage_nonneg Q p u j) + (cubeBesovCircDepthAverage_le_cubeLpNorm_rpow Q p u j hp hpTop hu) + (show 0 ≤ 1 / p.toReal by positivity) + _ = cubeLpNorm Q p u := by + rw [← Real.rpow_mul (cubeLpNorm_nonneg Q p u)] + field_simp [hp_pos.ne'] + rw [Real.rpow_one] + calc + cubeBesovCircDepthSeminorm Q s p u j + ≤ cubeBesovCircDepthWeight Q s j * cubeLpNorm Q p u := hdepth + _ = cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j * cubeLpNorm Q p u := by + rw [cubeBesovCircDepthWeight_eq_scaleWeight_neg_mul_geom] + +theorem cubeBesovCircPartialNorm_le_geometric_constant_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hq : 1 ≤ q) (hqTop : q ≠ ∞) : + cubeBesovCircPartialNorm Q s p q N u ≤ + (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + let r : ℝ := (3 : ℝ) ^ (-s) + let A : ℝ := cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) (cubeLpNorm_nonneg Q p u) + have hqReal : 1 ≤ q.toReal := by + rwa [← ENNReal.toReal_one, ENNReal.toReal_le_toReal ENNReal.one_ne_top hqTop] + have hpartial_le_sum : + cubeBesovCircPartialNorm Q s p q N u ≤ + Finset.sum (Finset.range (N + 1)) (fun j => cubeBesovCircDepthSeminorm Q s p u j) := by + simpa [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm] using + finset_Lq_norm_le_sum_of_nonneg + (s := Finset.range (N + 1)) (q := q.toReal) hqReal + (f := fun j => cubeBesovCircDepthSeminorm Q s p u j) + (by + intro j hj + exact cubeBesovCircDepthSeminorm_nonneg Q s p u j) + have hsum_le : + Finset.sum (Finset.range (N + 1)) (fun j => cubeBesovCircDepthSeminorm Q s p u j) ≤ + Finset.sum (Finset.range (N + 1)) (fun j => A * r ^ j) := by + refine Finset.sum_le_sum ?_ + intro j hj + calc + cubeBesovCircDepthSeminorm Q s p u j + ≤ cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j * cubeLpNorm Q p u := by + exact cubeBesovCircDepthSeminorm_le_scaleWeight_neg_mul_geom_mul_cubeLpNorm + Q s p u j hp hpTop hu + _ = A * r ^ j := by + dsimp [A, r] + ring + have hgeom : + Finset.sum (Finset.range (N + 1)) (fun j => r ^ j) ≤ (1 - r)⁻¹ := by + simpa only [Finset.range_eq_Ico, pow_zero, div_eq_mul_inv, one_mul] using + (geom_sum_Ico_le_of_lt_one (x := r) (m := 0) (n := N + 1) hr_nonneg hr_lt_one) + calc + cubeBesovCircPartialNorm Q s p q N u + ≤ Finset.sum (Finset.range (N + 1)) (fun j => cubeBesovCircDepthSeminorm Q s p u j) := + hpartial_le_sum + _ ≤ Finset.sum (Finset.range (N + 1)) (fun j => A * r ^ j) := hsum_le + _ = A * Finset.sum (Finset.range (N + 1)) (fun j => r ^ j) := by + rw [Finset.mul_sum] + _ ≤ A * (1 - r)⁻¹ := by + exact mul_le_mul_of_nonneg_left hgeom hA_nonneg + _ = (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + rfl + +theorem cubeBesovCircPartialNormTop_le_geometric_constant_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) : + cubeBesovCircPartialNormTop Q s p N u ≤ + (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + let r : ℝ := (3 : ℝ) ^ (-s) + let A : ℝ := cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr_le_one : r ≤ 1 := le_of_lt hr_lt_one + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) (cubeLpNorm_nonneg Q p u) + have hInv_ge_one : 1 ≤ (1 - r)⁻¹ := by + have hsub_pos : 0 < 1 - r := sub_pos.mpr hr_lt_one + have hsub_le_one : 1 - r ≤ 1 := by linarith + simpa [one_div] using (one_le_inv₀ hsub_pos).2 hsub_le_one + unfold cubeBesovCircPartialNormTop + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovCircDepthSeminorm Q s p u j) ?_ + intro j hj + calc + cubeBesovCircDepthSeminorm Q s p u j + ≤ A * r ^ j := by + calc + cubeBesovCircDepthSeminorm Q s p u j + ≤ cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j * cubeLpNorm Q p u := by + exact cubeBesovCircDepthSeminorm_le_scaleWeight_neg_mul_geom_mul_cubeLpNorm + Q s p u j hp hpTop hu + _ = A * r ^ j := by + dsimp [A, r] + ring + _ ≤ A * 1 := by + gcongr + exact pow_le_one₀ hr_nonneg hr_le_one + _ ≤ A * (1 - r)⁻¹ := by + exact mul_le_mul_of_nonneg_left hInv_ge_one hA_nonneg + _ = (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + rfl + +theorem cubeBesovCircNormEntry_le_geometric_constant_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hq : 1 ≤ q) : + cubeBesovCircNormEntry Q s p q N u ≤ + (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + by_cases hqTop : q = ∞ + · simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNormTop_le_geometric_constant_of_memLp + (Q := Q) (s := s) (p := p) (N := N + 1) (u := u) hs hu hp hpTop + · simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNorm_le_geometric_constant_of_memLp + (Q := Q) (s := s) (p := p) (q := q) (N := N + 1) (u := u) + hs hu hp hpTop hq hqTop + +theorem cubeBesovCircNormValueSet_bddAbove_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hq : 1 ≤ q) : + BddAbove (cubeBesovCircNormValueSet Q s p q u) := by + refine ⟨(cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * (1 - (3 : ℝ) ^ (-s))⁻¹, ?_⟩ + intro r hr + rcases hr with ⟨N, rfl⟩ + exact cubeBesovCircNormEntry_le_geometric_constant_of_memLp + Q s p q N u hs hu hp hpTop hq + +/-- The full positive circ norm is controlled by the geometric `Lᵖ` bound used +for each finite entry. This is a direct `sSup` wrapper around +`cubeBesovCircNormEntry_le_geometric_constant_of_memLp`. -/ +theorem cubeBesovCircNorm_le_geometric_constant_of_memLp {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hq : 1 ≤ q) : + cubeBesovCircNorm Q s p q u ≤ + (cubeBesovScaleWeight (-s) Q * cubeLpNorm Q p u) * + (1 - (3 : ℝ) ^ (-s))⁻¹ := by + unfold cubeBesovCircNorm + refine csSup_le (cubeBesovCircNormValueSet_nonempty Q s p q u) ?_ + intro r hr + rcases hr with ⟨N, rfl⟩ + exact cubeBesovCircNormEntry_le_geometric_constant_of_memLp + Q s p q N u hs hu hp hpTop hq + +theorem CubeBesovDualMeanZeroTestGlobal.memLp {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovDualMeanZeroTestGlobal Q s p q g) : + MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := by + have hfluct : + MeasureTheory.MemLp (cubeFluctuation Q g) + (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := + hg.2.2 0 Q (by simp) + convert hfluct using 1 + ext x + simp [cubeFluctuation, hg.2.1] + +theorem CubeBesovDualLocalMemLpGlobal.memLp {d : ℕ} {Q : TriadicCube d} + {p : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovDualLocalMemLpGlobal Q p g) : + MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := by + have hfluct : + MeasureTheory.MemLp (cubeFluctuation Q g) + (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := + hg 0 Q (by simp) + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage Q g) + (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverage Q g) + convert hfluct.add hconst using 1 + ext x + simp [cubeFluctuation, sub_eq_add_neg, add_left_comm, add_comm] + +theorem CubeBesovDualLocalMemLpGlobal.of_memLp_parent {d : ℕ} {Q : TriadicCube d} + {p : ℝ≥0∞} {g : Vec d → ℝ} + (hg : MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q)) : + CubeBesovDualLocalMemLpGlobal Q p g := by + intro j R hR + have hgR : + MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hg + simpa [cubeFluctuation] using! + hgR.sub (MeasureTheory.memLp_const (cubeAverage R g)) + +theorem CubeBesovDualFullTest.memLp {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {g : Vec d → ℝ} (hg : CubeBesovDualFullTest Q s p q g) : + MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q) := by + exact hg.2.memLp + +theorem abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_mean_zero_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u g : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) + (hg : CubeBesovDualMeanZeroTestGlobal Q s p q g) : + |cubeBesovPairing Q u g| ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + let B : ℝ := max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u + have hconv := + tendsto_cubeBesovPairing_projection_left_of_memLp + Q p u g hu hg.memLp hp hpTop hpConjTop + have hconv_abs : + Filter.Tendsto + (fun n => |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g|) + Filter.atTop (𝓝 |cubeBesovPairing Q u g|) := by + simpa [Real.norm_eq_abs] using hconv.norm + have hbound : + ∀ n, |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| ≤ B := by + intro n + have hpartial : + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q n u := by + exact abs_cubeBesovPairing_projection_le_max_mul_cubeBesovCircNormEntry_of_dual_test + (Q := Q) (s := s) (p := p) (q := q) (N := n) (u := u) (g := g) + (integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hu.integrable hp)) hp hpTop + hpConjTop hq (hg.to_dual_test n) + calc + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| + ≤ max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q n u := hpartial + _ ≤ B := by + exact mul_le_mul_of_nonneg_left + (cubeBesovCircNormEntry_le_cubeBesovCircNorm + (Q := Q) (s := s) (p := p) (q := q) (u := u) hBddCirc n) + (le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s))) + have hlimit : |cubeBesovPairing Q u g| ≤ B := by + exact le_of_tendsto hconv_abs (Filter.Eventually.of_forall hbound) + simpa [B] using hlimit + +theorem cubeBesovDualMeanZeroSeminormValueSet_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + BddAbove (cubeBesovDualMeanZeroSeminormValueSet Q s p q u) := by + refine ⟨max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u, ?_⟩ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_mean_zero_test + Q s p q u g hBddCirc hu hp hpTop hpConjTop hq hg + +theorem cubeBesovDualMeanZeroSeminorm_le_max_mul_cubeBesovCircNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualMeanZeroSeminorm Q s p q u ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + have hpConj0 : cubeBesovConjExponent p ≠ 0 := cubeBesovConjExponent_ne_zero p + unfold cubeBesovDualMeanZeroSeminorm + refine csSup_le + (cubeBesovDualMeanZeroSeminormValueSet_nonempty + Q s p q u hpConj0 hpConjTop) ?_ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_mean_zero_test + Q s p q u g hBddCirc hu hp hpTop hpConjTop hq hg + +theorem abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_full_test {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u g : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) + (hg : CubeBesovDualFullTest Q s p q g) : + |cubeBesovPairing Q u g| ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + let B : ℝ := max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u + have hconv := + tendsto_cubeBesovPairing_projection_left_of_memLp + Q p u g hu hg.memLp hp hpTop hpConjTop + have hconv_abs : + Filter.Tendsto + (fun n => |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g|) + Filter.atTop (𝓝 |cubeBesovPairing Q u g|) := by + simpa [Real.norm_eq_abs] using hconv.norm + have hbound : + ∀ n, |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| ≤ B := by + intro n + have hpartial : + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q n u := by + exact abs_cubeBesovPairing_projection_le_max_mul_cubeBesovCircNormEntry_of_dual_test + (Q := Q) (s := s) (p := p) (q := q) (N := n) (u := u) (g := g) + (integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hu.integrable hp)) hp hpTop + hpConjTop hq (hg.to_dual_test n) + calc + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g| + ≤ max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q n u := hpartial + _ ≤ B := by + exact mul_le_mul_of_nonneg_left + (cubeBesovCircNormEntry_le_cubeBesovCircNorm + (Q := Q) (s := s) (p := p) (q := q) (u := u) hBddCirc n) + (le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s))) + have hlimit : |cubeBesovPairing Q u g| ≤ B := by + exact le_of_tendsto hconv_abs (Filter.Eventually.of_forall hbound) + simpa [B] using hlimit + +theorem cubeBesovDualFullNorm_le_max_mul_cubeBesovCircNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualFullNorm Q s p q u ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + have hpConj0 : cubeBesovConjExponent p ≠ 0 := cubeBesovConjExponent_ne_zero p + unfold cubeBesovDualFullNorm + refine csSup_le + (cubeBesovDualFullNormValueSet_nonempty + Q s p q u hpConj0 hpConjTop) ?_ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_full_test + Q s p q u g hBddCirc hu hp hpTop hpConjTop hq hg + +theorem max_one_three_rpow_le_three_rpow_nat_add (d : ℕ) (s : ℝ) (hs : 0 ≤ s) : + max 1 ((3 : ℝ) ^ s) ≤ (3 : ℝ) ^ ((d : ℝ) + s) := by + have hs_one : 1 ≤ (3 : ℝ) ^ s := Real.one_le_rpow (by norm_num) hs + rw [max_eq_right hs_one] + calc + (3 : ℝ) ^ s ≤ (3 : ℝ) ^ (d : ℝ) * (3 : ℝ) ^ s := by + exact le_mul_of_one_le_left + (Real.rpow_nonneg (by positivity) s) + (Real.one_le_rpow (by norm_num) (by positivity : 0 ≤ (d : ℝ))) + _ = (3 : ℝ) ^ ((d : ℝ) + s) := by + symm + rw [Real.rpow_add (by norm_num : 0 < (3 : ℝ))] + +theorem cubeBesovCircNorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBddCirc : BddAbove (cubeBesovCircNormValueSet Q s p q u)) : + 0 ≤ cubeBesovCircNorm Q s p q u := by + have hentry_nonneg : 0 ≤ cubeBesovCircNormEntry Q s p q 0 u := by + by_cases hqTop : q = ∞ + · simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNormTop_nonneg Q s p 1 u + · simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNorm_nonneg Q s p q 1 u + exact le_trans hentry_nonneg + (cubeBesovCircNormEntry_le_cubeBesovCircNorm + (Q := Q) (s := s) (p := p) (q := q) (u := u) hBddCirc 0) + +theorem cubeBesovDualMeanZeroSeminorm_le_note_constant_mul_cubeBesovCircNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualMeanZeroSeminorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + have hs0 : 0 ≤ s := le_of_lt hs + have hBddCirc := cubeBesovCircNormValueSet_bddAbove_of_memLp + Q s p q u hs hu hp hpTop hq + have hCircNonneg := cubeBesovCircNorm_nonneg Q s p q u hBddCirc + calc + cubeBesovDualMeanZeroSeminorm Q s p q u + ≤ max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + exact cubeBesovDualMeanZeroSeminorm_le_max_mul_cubeBesovCircNorm + Q s p q u hBddCirc hu hp hpTop hpConjTop hq + _ ≤ (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + exact mul_le_mul_of_nonneg_right + (max_one_three_rpow_le_three_rpow_nat_add d s hs0) hCircNonneg + +/-- The full negative Besov dual norm is controlled by the negative circ norm +alone. This is the sharp average bookkeeping needed in the Caccioppoli +single-cube estimate: the depth-zero circ term already carries the +`cubeBesovScaleWeight (-s)` average contribution, so no extra positive Besov +average tail is needed. -/ +theorem cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualFullNorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + have hs0 : 0 ≤ s := le_of_lt hs + have hBddCirc := cubeBesovCircNormValueSet_bddAbove_of_memLp + Q s p q u hs hu hp hpTop hq + have hCircNonneg := cubeBesovCircNorm_nonneg Q s p q u hBddCirc + calc + cubeBesovDualFullNorm Q s p q u + ≤ max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + exact cubeBesovDualFullNorm_le_max_mul_cubeBesovCircNorm + Q s p q u hBddCirc hu hp hpTop hpConjTop hq + _ ≤ (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + exact mul_le_mul_of_nonneg_right + (max_one_three_rpow_le_three_rpow_nat_add d s hs0) hCircNonneg + +theorem cubeBesovDualFullNorm_le_note_rhs {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualFullNorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ := by + have hs0 : 0 ≤ s := le_of_lt hs + have hBddCirc := cubeBesovCircNormValueSet_bddAbove_of_memLp + Q s p q u hs hu hp hpTop hq + have hbase : + cubeBesovDualFullNorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + have hCircNonneg := cubeBesovCircNorm_nonneg Q s p q u hBddCirc + calc + cubeBesovDualFullNorm Q s p q u + ≤ max 1 ((3 : ℝ) ^ s) * cubeBesovCircNorm Q s p q u := by + exact cubeBesovDualFullNorm_le_max_mul_cubeBesovCircNorm + Q s p q u hBddCirc hu hp hpTop hpConjTop hq + _ ≤ (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovCircNorm Q s p q u := by + exact mul_le_mul_of_nonneg_right + (max_one_three_rpow_le_three_rpow_nat_add d s hs0) hCircNonneg + exact hbase.trans (le_add_of_nonneg_right + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _))) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapBridge.lean new file mode 100644 index 0000000000..886d485e0a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapBridge.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge + +/-! # Overlap Bridge -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-! +# Overlap dual-test norm bridges + +This file is the first downstream use of the overlap dual-test definitions. It +keeps the result at the norm/seminorm level: the local `MemLp` admissibility +predicates for disjoint and overlap tests are intentionally not converted here. +-/ + +theorem cubeBesovConjExponent_toReal_pos_of_ne_top + (p : ℝ≥0∞) (hpTop : cubeBesovConjExponent p ≠ ∞) : + 0 < (cubeBesovConjExponent p).toReal := + ENNReal.toReal_pos (cubeBesovConjExponent_ne_zero p) hpTop + +theorem one_le_cubeBesovConjExponent_toReal_of_one_le + (q : ℝ≥0∞) (hq : 1 ≤ q) (hqConjTop : cubeBesovConjExponent q ≠ ∞) : + 1 ≤ (cubeBesovConjExponent q).toReal := by + let : ENNReal.HolderConjugate q (cubeBesovConjExponent q) := by + simpa [cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hq + let : ENNReal.HolderConjugate (cubeBesovConjExponent q) q := + ENNReal.HolderConjugate.symm (p := q) (q := cubeBesovConjExponent q) + have hqConj : 1 ≤ cubeBesovConjExponent q := + ENNReal.HolderConjugate.one_le (p := cubeBesovConjExponent q) (q := q) + simpa [ENNReal.toReal_one] using + ((ENNReal.toReal_le_toReal ENNReal.one_ne_top hqConjTop).2 hqConj) + +theorem cubeBesovDualTestNorm_le_three_rpow_mul_overlapDualTestNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (g : Vec d → ℝ) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualTestNorm Q s p q N g + ≤ (3 : ℝ) ^ ((d : ℝ) / (cubeBesovConjExponent p).toReal) * + cubeBesovOverlapDualTestNorm Q s p q N g := by + have hpConjPos : 0 < (cubeBesovConjExponent p).toReal := + cubeBesovConjExponent_toReal_pos_of_ne_top p hpConjTop + by_cases hqConjTop : cubeBesovConjExponent q = ∞ + · rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s p q N g hqConjTop, + cubeBesovOverlapDualTestNorm_of_conjExponent_eq_top Q s p q N g hqConjTop] + exact cubeBesovPartialNormTop_le_three_rpow_mul_overlapPartialNormTop + Q s hpConjPos N g + · have hqConjReal : 1 ≤ (cubeBesovConjExponent q).toReal := + one_le_cubeBesovConjExponent_toReal_of_one_le q hq hqConjTop + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop, + cubeBesovOverlapDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop] + exact cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm + Q s hpConjPos hqConjReal N g + +theorem cubeBesovDualTestSeminorm_le_three_rpow_mul_overlapDualTestSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (g : Vec d → ℝ) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + cubeBesovDualTestSeminorm Q s p q N g + ≤ (3 : ℝ) ^ ((d : ℝ) / (cubeBesovConjExponent p).toReal) * + cubeBesovOverlapDualTestSeminorm Q s p q N g := by + have hpConjPos : 0 < (cubeBesovConjExponent p).toReal := + cubeBesovConjExponent_toReal_pos_of_ne_top p hpConjTop + by_cases hqConjTop : cubeBesovConjExponent q = ∞ + · rw [cubeBesovDualTestSeminorm_of_conjExponent_eq_top Q s p q N g hqConjTop, + cubeBesovOverlapDualTestSeminorm_of_conjExponent_eq_top Q s p q N g hqConjTop] + exact cubeBesovPartialSeminormTop_le_three_rpow_mul_overlapPartialSeminormTop + Q s hpConjPos N g + · have hqConjReal : 1 ≤ (cubeBesovConjExponent q).toReal := + one_le_cubeBesovConjExponent_toReal_of_one_le q hq hqConjTop + rw [cubeBesovDualTestSeminorm_of_conjExponent_ne_top Q s p q N g hqConjTop, + cubeBesovOverlapDualTestSeminorm_of_conjExponent_ne_top Q s p q N g hqConjTop] + exact cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + Q s hpConjPos hqConjReal N g + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapCaccioppoliBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapCaccioppoliBridge.lean new file mode 100644 index 0000000000..c8f0c11631 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapCaccioppoliBridge.lean @@ -0,0 +1,272 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapBridge + +/-! # Overlap Caccioppoli Bridge -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-! +# Overlap dual tests in the Caccioppoli pairing bridge + +These wrappers route uniform overlap dual-test norm bounds through the +finite-depth norm switch and then reuse the existing circ-domination estimates. +The test-function local `MemLp` input is kept as the existing global disjoint +admissibility predicate; it is not inferred from the overlap local predicate. +-/ + +private theorem cubeBesovConjExponent_two_eq_overlapBridge : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +private theorem cubeBesovConjExponent_two_ne_top_overlapBridge : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [cubeBesovConjExponent_two_eq_overlapBridge] + norm_num + +theorem abs_cubeBesovPairing_le_note_constant_mul_of_overlap_uniform_bound_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B) := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / 2) + have hC_nonneg : 0 ≤ C := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hnorm_disjoint : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ C * B := by + intro N + have hbridge := + cubeBesovDualTestNorm_le_three_rpow_mul_overlapDualTestNorm + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) + (N := N) (g := g) cubeBesovConjExponent_two_ne_top_overlapBridge + (by norm_num) + have hbridgeC : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g + ≤ C * cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g := by + simpa [C, cubeBesovConjExponent_two_eq_overlapBridge] using hbridge + exact hbridgeC.trans (mul_le_mul_of_nonneg_left (hnorm N) hC_nonneg) + have hCB_nonneg : 0 ≤ C * B := mul_nonneg hC_nonneg hB + simpa [C] using + abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + Q s u g hs hu hCB_nonneg hnorm_disjoint hmem + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_overlap_uniform_bound_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B) := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / 2) + have hC_nonneg : 0 ≤ C := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hnorm_disjoint : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ C * B := by + intro N + have hbridge := + cubeBesovDualTestNorm_le_three_rpow_mul_overlapDualTestNorm + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) + (N := N) (g := g) cubeBesovConjExponent_two_ne_top_overlapBridge + (by norm_num) + have hbridgeC : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g + ≤ C * cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + simpa [C, cubeBesovConjExponent_two_eq_overlapBridge] using hbridge + exact hbridgeC.trans (mul_le_mul_of_nonneg_left (hnorm N) hC_nonneg) + have hCB_nonneg : 0 ≤ C * B := mul_nonneg hC_nonneg hB + simpa [C] using + abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two_of_nonneg + Q s u g hs hu hCB_nonneg hnorm_disjoint hmem + +theorem abs_cubeBesovPairing_le_note_constant_mul_of_overlap_uniform_bound_two_one_of_memLp_parent + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B) := by + have hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g := + CubeBesovDualLocalMemLpGlobal.of_memLp_parent + (by simpa [cubeBesovConjExponent_two_eq_overlapBridge] using hg) + exact + abs_cubeBesovPairing_le_note_constant_mul_of_overlap_uniform_bound_two_one_of_nonneg + Q s u g hs hu hB hnorm hmem + +theorem abs_cubeBesovPairing_le_note_rhs_mul_of_overlap_uniform_bound_two_two_of_memLp_parent + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B) := by + have hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g := + CubeBesovDualLocalMemLpGlobal.of_memLp_parent + (by simpa [cubeBesovConjExponent_two_eq_overlapBridge] using hg) + exact + abs_cubeBesovPairing_le_note_rhs_mul_of_overlap_uniform_bound_two_two_of_nonneg + Q s u g hs hu hB hnorm hmem + +theorem abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_overlap_uniform_component_bounds_two_one_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [cubeBesovConjExponent_two_eq_overlapBridge] using + (hmem i).memLp + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact + abs_cubeBesovPairing_le_note_constant_mul_of_overlap_uniform_bound_two_one_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) + (hnorm i) (hmem i) + +theorem abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_overlap_uniform_component_bounds_two_one_of_memLp_parent + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : ∀ i, MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => g x i) ≤ B i) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + have hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i) := by + intro i + exact CubeBesovDualLocalMemLpGlobal.of_memLp_parent + (by simpa [cubeBesovConjExponent_two_eq_overlapBridge] using hg i) + exact + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_overlap_uniform_component_bounds_two_one_of_nonneg + Q s u g B hs hu hB hnorm hmem + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_overlap_uniform_component_bounds_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [cubeBesovConjExponent_two_eq_overlapBridge] using + (hmem i).memLp + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact + abs_cubeBesovPairing_le_note_rhs_mul_of_overlap_uniform_bound_two_two_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) + (hnorm i) (hmem i) + +theorem abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_overlap_uniform_component_bounds_two_two_of_memLp_parent + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : ∀ i, MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovOverlapDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ B i) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + ((3 : ℝ) ^ ((d : ℝ) / 2) * B i)) := by + have hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i) := by + intro i + exact CubeBesovDualLocalMemLpGlobal.of_memLp_parent + (by simpa [cubeBesovConjExponent_two_eq_overlapBridge] using hg i) + exact + abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_overlap_uniform_component_bounds_two_two_of_nonneg + Q s u g B hs hu hB hnorm hmem + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapDefinitions.lean new file mode 100644 index 0000000000..b01f909582 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapDefinitions.lean @@ -0,0 +1,252 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap + +/-! # Overlap Definitions -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +Finite overlap dual-test definitions for cube Besov duality. + +This module is the overlap counterpart of `Duality.Definitions`: it keeps +overlap-local measure and `MemLp` facts together with the finite-depth overlap +dual test norms, leaving global `sSup` wrappers to `Duality.OverlapFull`. +-/ + +namespace ScalarOverlap + +theorem normalizedCubeMeasure_eq_smul_restrict_of_mem_centersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (hS : S ∈ centersAtDepth Q j) : + normalizedCubeMeasure S = + ENNReal.ofReal (Homogenization.cubeVolume Q / cubeVolume S) • + (Homogenization.normalizedCubeMeasure Q).restrict (cubeSet S) := by + ext t ht + have hQ : Homogenization.cubeVolume Q ≠ 0 := (Homogenization.cubeVolume_pos Q).ne' + have hSvol : cubeVolume S ≠ 0 := (cubeVolume_pos S).ne' + have hsubset : cubeSet S ⊆ Homogenization.cubeSet Q := + cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + have hinter : + (t ∩ cubeSet S) ∩ Homogenization.cubeSet Q = t ∩ cubeSet S := by + ext x + constructor + · intro hx + exact hx.1 + · intro hx + exact ⟨hx, hsubset hx.2⟩ + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply] + rw [cubeMeasure, MeasureTheory.Measure.restrict_apply ht] + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.restrict_apply ht] + rw [Homogenization.normalizedCubeMeasure, MeasureTheory.Measure.smul_apply] + change ENNReal.ofReal ((cubeVolume S)⁻¹) * MeasureTheory.volume (t ∩ cubeSet S) = + ENNReal.ofReal (Homogenization.cubeVolume Q / cubeVolume S) * + (ENNReal.ofReal ((Homogenization.cubeVolume Q)⁻¹) * + Homogenization.cubeMeasure Q (t ∩ cubeSet S)) + rw [Homogenization.cubeMeasure, + MeasureTheory.Measure.restrict_apply (ht.inter (measurableSet_cubeSet S)), hinter] + have hfactor : + ENNReal.ofReal ((cubeVolume S)⁻¹) = + ENNReal.ofReal (Homogenization.cubeVolume Q / cubeVolume S) * + ENNReal.ofReal ((Homogenization.cubeVolume Q)⁻¹) := by + have hdiv_nonneg : 0 ≤ Homogenization.cubeVolume Q / cubeVolume S := + div_nonneg (Homogenization.cubeVolume_nonneg Q) (cubeVolume_nonneg S) + rw [← ENNReal.ofReal_mul hdiv_nonneg] + congr 1 + field_simp [hQ, hSvol] + rw [hfactor, ← mul_assoc] + +theorem memLp_of_mem_centersAtDepth_of_memLp {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {p : ℝ≥0∞} {f : Vec d → ℝ} + (hS : S ∈ centersAtDepth Q j) + (hf : MeasureTheory.MemLp f p (Homogenization.normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedCubeMeasure S) := by + have hrestrict : + MeasureTheory.MemLp f p + ((Homogenization.normalizedCubeMeasure Q).restrict (cubeSet S)) := + hf.restrict (cubeSet S) + have hle : + normalizedCubeMeasure S ≤ + ENNReal.ofReal (Homogenization.cubeVolume Q / cubeVolume S) • + ((Homogenization.normalizedCubeMeasure Q).restrict (cubeSet S)) := by + simp [normalizedCubeMeasure_eq_smul_restrict_of_mem_centersAtDepth hS] + exact hrestrict.of_measure_le_smul ENNReal.ofReal_ne_top hle + +theorem memLp_sub_cubeAverage_of_mem_centersAtDepth_of_memLp {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {p : ℝ≥0∞} {f : Vec d → ℝ} + (hS : S ∈ centersAtDepth Q j) + (hf : MeasureTheory.MemLp f p (Homogenization.normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (fun x => f x - cubeAverage S f) p + (normalizedCubeMeasure S) := by + exact + (memLp_of_mem_centersAtDepth_of_memLp hS hf).sub + (MeasureTheory.memLp_const (cubeAverage S f)) + +end ScalarOverlap + +noncomputable def cubeBesovOverlapDualTestNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : ℝ := + if cubeBesovConjExponent q = ∞ then + cubeBesovOverlapPartialNormTop Q s (cubeBesovConjExponent p) N g + else + cubeBesovOverlapPartialNorm Q s (cubeBesovConjExponent p) + (cubeBesovConjExponent q) N g + +noncomputable def cubeBesovOverlapDualTestSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : ℝ := + if cubeBesovConjExponent q = ∞ then + cubeBesovOverlapPartialSeminormTop Q s (cubeBesovConjExponent p) N g + else + cubeBesovOverlapPartialSeminorm Q s (cubeBesovConjExponent p) + (cubeBesovConjExponent q) N g + +@[simp] theorem cubeBesovOverlapDualTestNorm_of_conjExponent_eq_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q = ∞) : + cubeBesovOverlapDualTestNorm Q s p q N g = + cubeBesovOverlapPartialNormTop Q s (cubeBesovConjExponent p) N g := by + simp [cubeBesovOverlapDualTestNorm, hq] + +@[simp] theorem cubeBesovOverlapDualTestNorm_of_conjExponent_ne_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q ≠ ∞) : + cubeBesovOverlapDualTestNorm Q s p q N g = + cubeBesovOverlapPartialNorm Q s (cubeBesovConjExponent p) + (cubeBesovConjExponent q) N g := by + simp [cubeBesovOverlapDualTestNorm, hq] + +@[simp] theorem cubeBesovOverlapDualTestSeminorm_of_conjExponent_eq_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q = ∞) : + cubeBesovOverlapDualTestSeminorm Q s p q N g = + cubeBesovOverlapPartialSeminormTop Q s (cubeBesovConjExponent p) N g := by + simp [cubeBesovOverlapDualTestSeminorm, hq] + +@[simp] theorem cubeBesovOverlapDualTestSeminorm_of_conjExponent_ne_top {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) + (hq : cubeBesovConjExponent q ≠ ∞) : + cubeBesovOverlapDualTestSeminorm Q s p q N g = + cubeBesovOverlapPartialSeminorm Q s (cubeBesovConjExponent p) + (cubeBesovConjExponent q) N g := by + simp [cubeBesovOverlapDualTestSeminorm, hq] + +theorem cubeBesovOverlapDualTestNorm_eq_cubeBesovOverlapDualTestSeminorm_of_cubeAverage_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (g : Vec d → ℝ) (havg : cubeAverage Q g = 0) : + cubeBesovOverlapDualTestNorm Q s p q N g = + cubeBesovOverlapDualTestSeminorm Q s p q N g := by + by_cases hq : cubeBesovConjExponent q = ∞ + · rw [cubeBesovOverlapDualTestNorm_of_conjExponent_eq_top Q s p q N g hq, + cubeBesovOverlapDualTestSeminorm_of_conjExponent_eq_top Q s p q N g hq] + unfold cubeBesovOverlapPartialNormTop + rw [havg] + simp + · rw [cubeBesovOverlapDualTestNorm_of_conjExponent_ne_top Q s p q N g hq, + cubeBesovOverlapDualTestSeminorm_of_conjExponent_ne_top Q s p q N g hq] + unfold cubeBesovOverlapPartialNorm + rw [havg] + simp + +def CubeBesovOverlapDualLocalMemLp {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + ∀ j < N + 1, ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + MeasureTheory.MemLp (fun x => g x - ScalarOverlap.cubeAverage S g) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S) + +theorem CubeBesovOverlapDualLocalMemLp.of_memLp_parent {d : ℕ} {Q : TriadicCube d} + {p : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q)) : + CubeBesovOverlapDualLocalMemLp Q p N g := by + intro j hj S hS + exact ScalarOverlap.memLp_sub_cubeAverage_of_mem_centersAtDepth_of_memLp hS hg + +def CubeBesovOverlapDualTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + cubeBesovOverlapDualTestNorm Q s p q N g ≤ 1 ∧ + CubeBesovOverlapDualLocalMemLp Q p N g + +def CubeBesovOverlapDualMeanZeroTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (g : Vec d → ℝ) : Prop := + cubeBesovOverlapDualTestSeminorm Q s p q N g ≤ 1 ∧ + cubeAverage Q g = 0 ∧ + CubeBesovOverlapDualLocalMemLp Q p N g + +theorem CubeBesovOverlapDualTest.norm_le_one {d : ℕ} {Q : TriadicCube d} {s : ℝ} + {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualTest Q s p q N g) : + cubeBesovOverlapDualTestNorm Q s p q N g ≤ 1 := + hg.1 + +theorem CubeBesovOverlapDualTest.local_memLp {d : ℕ} {Q : TriadicCube d} + {p : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualLocalMemLp Q p N g) : + ∀ j < N + 1, ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + MeasureTheory.MemLp (fun x => g x - ScalarOverlap.cubeAverage S g) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S) := + hg + +theorem CubeBesovOverlapDualTest.memLp_admissible {d : ℕ} {Q : TriadicCube d} + {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualTest Q s p q N g) : + ∀ j < N + 1, ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + MeasureTheory.MemLp (fun x => g x - ScalarOverlap.cubeAverage S g) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S) := + hg.2 + +theorem CubeBesovOverlapDualMeanZeroTest.seminorm_le_one {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTest Q s p q N g) : + cubeBesovOverlapDualTestSeminorm Q s p q N g ≤ 1 := + hg.1 + +theorem CubeBesovOverlapDualMeanZeroTest.cubeAverage_eq_zero {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTest Q s p q N g) : + cubeAverage Q g = 0 := + hg.2.1 + +theorem CubeBesovOverlapDualMeanZeroTest.memLp_admissible {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTest Q s p q N g) : + ∀ j < N + 1, ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + MeasureTheory.MemLp (fun x => g x - ScalarOverlap.cubeAverage S g) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S) := + hg.2.2 + +theorem cubeBesovOverlapDualLocalMemLp_const {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (N : ℕ) (c : ℝ) : + CubeBesovOverlapDualLocalMemLp Q p N (fun _ => c) := by + intro j hj S hS + have hzero : + (fun x : Vec d => c - ScalarOverlap.cubeAverage S (fun _ => c)) = + fun _ => (0 : ℝ) := by + funext x + simp + rw [hzero] + exact + (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S)) + +theorem CubeBesovOverlapDualMeanZeroTest.to_dual_test {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTest Q s p q N g) : + CubeBesovOverlapDualTest Q s p q N g := by + rcases hg with ⟨hseminorm, havg, hmem⟩ + unfold CubeBesovOverlapDualTest + rw [cubeBesovOverlapDualTestNorm_eq_cubeBesovOverlapDualTestSeminorm_of_cubeAverage_eq_zero + Q s p q N g havg] + exact ⟨hseminorm, hmem⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapFull.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapFull.lean new file mode 100644 index 0000000000..5f7111a96d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/OverlapFull.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions + +/-! # Overlap Full -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +Global overlap wrapper layer for the cube Besov duality package. + +This module contains the overlap analogues of the global dual-test norm, +mean-zero seminorm, depth-uniform local `MemLp` predicate, and finite-test +accessors. The disjoint full/circ API remains in `Duality.Full`. +-/ + +noncomputable def cubeBesovOverlapDualFullTestNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : ℝ := + sSup (Set.range (fun N : ℕ => cubeBesovOverlapDualTestNorm Q s p q N g)) + +noncomputable def cubeBesovOverlapDualMeanZeroTestSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (g : Vec d → ℝ) : ℝ := + sSup (Set.range (fun N : ℕ => cubeBesovOverlapDualTestSeminorm Q s p q N g)) + +def CubeBesovOverlapDualLocalMemLpGlobal {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + MeasureTheory.MemLp (fun x => g x - ScalarOverlap.cubeAverage S g) + (cubeBesovConjExponent p) (ScalarOverlap.normalizedCubeMeasure S) + +def CubeBesovOverlapDualFullTest {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + (∀ N : ℕ, cubeBesovOverlapDualTestNorm Q s p q N g ≤ 1) ∧ + CubeBesovOverlapDualLocalMemLpGlobal Q p g + +def CubeBesovOverlapDualMeanZeroTestGlobal {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (g : Vec d → ℝ) : Prop := + (∀ N : ℕ, cubeBesovOverlapDualTestSeminorm Q s p q N g ≤ 1) ∧ + cubeAverage Q g = 0 ∧ CubeBesovOverlapDualLocalMemLpGlobal Q p g + +theorem cubeBesovOverlapDualTestNorm_le_fullTestNorm_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (g : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlapDualTestNorm Q s p q N g)) + (N : ℕ) : + cubeBesovOverlapDualTestNorm Q s p q N g ≤ + cubeBesovOverlapDualFullTestNorm Q s p q g := by + unfold cubeBesovOverlapDualFullTestNorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovOverlapDualTestSeminorm_le_meanZeroTestSeminorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (g : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlapDualTestSeminorm Q s p q N g)) + (N : ℕ) : + cubeBesovOverlapDualTestSeminorm Q s p q N g ≤ + cubeBesovOverlapDualMeanZeroTestSeminorm Q s p q g := by + unfold cubeBesovOverlapDualMeanZeroTestSeminorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem CubeBesovOverlapDualFullTest.fullTestNorm_le_one {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualFullTest Q s p q g) : + cubeBesovOverlapDualFullTestNorm Q s p q g ≤ 1 := by + unfold cubeBesovOverlapDualFullTestNorm + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovOverlapDualTestNorm Q s p q 0 g, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hg.1 N + +theorem CubeBesovOverlapDualMeanZeroTestGlobal.meanZeroTestSeminorm_le_one + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} + {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTestGlobal Q s p q g) : + cubeBesovOverlapDualMeanZeroTestSeminorm Q s p q g ≤ 1 := by + unfold cubeBesovOverlapDualMeanZeroTestSeminorm + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovOverlapDualTestSeminorm Q s p q 0 g, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hg.1 N + +theorem CubeBesovOverlapDualFullTest.of_fullTestNorm_le_one_of_bddAbove + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} + {g : Vec d → ℝ} + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlapDualTestNorm Q s p q N g)) + (hfull : cubeBesovOverlapDualFullTestNorm Q s p q g ≤ 1) + (hmem : CubeBesovOverlapDualLocalMemLpGlobal Q p g) : + CubeBesovOverlapDualFullTest Q s p q g := by + refine ⟨?_, hmem⟩ + intro N + exact + (cubeBesovOverlapDualTestNorm_le_fullTestNorm_of_bddAbove + Q s p q g hBdd N).trans hfull + +theorem CubeBesovOverlapDualMeanZeroTestGlobal.of_meanZeroTestSeminorm_le_one_of_bddAbove + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} + {g : Vec d → ℝ} + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlapDualTestSeminorm Q s p q N g)) + (hfull : cubeBesovOverlapDualMeanZeroTestSeminorm Q s p q g ≤ 1) + (havg : cubeAverage Q g = 0) + (hmem : CubeBesovOverlapDualLocalMemLpGlobal Q p g) : + CubeBesovOverlapDualMeanZeroTestGlobal Q s p q g := by + refine ⟨?_, havg, hmem⟩ + intro N + exact + (cubeBesovOverlapDualTestSeminorm_le_meanZeroTestSeminorm_of_bddAbove + Q s p q g hBdd N).trans hfull + +theorem CubeBesovOverlapDualFullTest.to_dual_test {d : ℕ} {Q : TriadicCube d} + {s : ℝ} {p q : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualFullTest Q s p q g) : + ∀ N : ℕ, CubeBesovOverlapDualTest Q s p q N g := by + intro N + exact ⟨hg.1 N, fun j hj S hS => hg.2 j S hS⟩ + +theorem CubeBesovOverlapDualMeanZeroTestGlobal.to_dual_test {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovOverlapDualMeanZeroTestGlobal Q s p q g) : + ∀ N : ℕ, CubeBesovOverlapDualTest Q s p q N g := by + intro N + have hnorm : cubeBesovOverlapDualTestNorm Q s p q N g ≤ 1 := by + rw [cubeBesovOverlapDualTestNorm_eq_cubeBesovOverlapDualTestSeminorm_of_cubeAverage_eq_zero + Q s p q N g hg.2.1] + exact hg.1 N + exact ⟨hnorm, fun j hj S hS => hg.2.2 j S hS⟩ + +theorem CubeBesovOverlapDualLocalMemLpGlobal.of_memLp_parent {d : ℕ} + {Q : TriadicCube d} {p : ℝ≥0∞} {g : Vec d → ℝ} + (hg : MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q)) : + CubeBesovOverlapDualLocalMemLpGlobal Q p g := by + intro j S hS + exact ScalarOverlap.memLp_sub_cubeAverage_of_mem_centersAtDepth_of_memLp hS hg + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing.lean new file mode 100644 index 0000000000..c44d56ed1e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Projections +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Integrability +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Averages +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds + +/-! # Projected Pairing -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Averages.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Averages.lean new file mode 100644 index 0000000000..1f8b0f7f81 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Averages.lean @@ -0,0 +1,659 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Integrability + +/-! # Averages -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal +theorem cubeAverage_cubeProjectionResidual_eq_zero_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeAverage R (cubeProjectionResidual Q j f) = 0 := by + have hres0 : MeasureTheory.MemLp (cubeProjectionResidual R 0 f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := R) (R := R) (j := 0) (p := p) (u := f) (by simp) hf + have hzero0 : + cubeAverage R (cubeProjectionResidual R 0 f) = 0 := + cubeAverage_cubeProjectionResidual_depth_zero_eq_zero_of_memLp + (Q := R) (p := p) (f := f) hres0 hp + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + calc + ∫ x, cubeProjectionResidual Q j f x ∂ normalizedCubeMeasure R + = ∫ x, cubeProjectionResidual R 0 f x ∂ normalizedCubeMeasure R := by + refine MeasureTheory.integral_congr_ae ?_ + exact cubeProjectionResidual_ae_eq_cubeProjectionResidual_depth_zero_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) f hR + _ = 0 := by + simpa [cubeAverage_eq_integral_normalizedCubeMeasure] using hzero0 + +theorem cubeAverage_mul_cubeProjection_cubeProjectionResidual_eq_zero_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeAverage R (fun x => cubeProjection Q j g x * cubeProjectionResidual Q j f x) = 0 := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + calc + ∫ x, cubeProjection Q j g x * cubeProjectionResidual Q j f x ∂ normalizedCubeMeasure R + = ∫ x, cubeAverage R g * cubeProjectionResidual Q j f x ∂ normalizedCubeMeasure R := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR] with x hx + simp [hx] + _ = cubeAverage R g * + ∫ x, cubeProjectionResidual Q j f x ∂ normalizedCubeMeasure R := by + rw [MeasureTheory.integral_const_mul] + _ = cubeAverage R g * 0 := by + have hzero : + ∫ x, cubeProjectionResidual Q j f x ∂ normalizedCubeMeasure R = 0 := by + simpa [cubeAverage_eq_integral_normalizedCubeMeasure] using + cubeAverage_cubeProjectionResidual_eq_zero_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR hf hp + rw [hzero] + _ = 0 := by ring + +theorem cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeAverage R (cubeProjection Q j g) = cubeAverage R g := by + have hcongr : + cubeAverage R (cubeProjection Q j g) = + cubeAverage R (fun _ => cubeAverage R g) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR hx] + rw [hcongr, cubeAverage_const] + +theorem integrableOn_cubeProjection_succ_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.IntegrableOn (cubeProjection Q (j + 1) g) (cubeSet R) + MeasureTheory.volume := by + have hproj_local : + ∀ S ∈ descendantsAtDepth R 1, + MeasureTheory.IntegrableOn (cubeProjection Q (j + 1) g) (cubeSet S) + MeasureTheory.volume := by + intro S hS + have hSQ : S ∈ descendantsAtDepth Q (j + 1) := by + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨R, hR, by simpa [descendantsAtDepth_one] using hS⟩ + have hvol_ne_top : MeasureTheory.volume (cubeSet S) ≠ ∞ := by + intro htop + have hreal : (MeasureTheory.volume (cubeSet S)).toReal = cubeVolume S := + volume_cubeSet_toReal S + rw [htop] at hreal + simp at hreal + exact (cubeVolume_pos S).ne' hreal.symm + have hconst_int : + MeasureTheory.IntegrableOn (fun _ : Vec d => cubeAverage S g) (cubeSet S) + MeasureTheory.volume := by + exact MeasureTheory.integrableOn_const + (μ := MeasureTheory.volume) (s := cubeSet S) (C := cubeAverage S g) hvol_ne_top + refine hconst_int.congr_fun ?_ (measurableSet_cubeSet S) + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := S) (j := j + 1) g hSQ hx] + rw [cubeSet_eq_iUnion_descendantsAtDepth R 1] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := cubeProjection Q (j + 1) g) (μ := MeasureTheory.volume) + (s := descendantsAtDepth R 1) (t := cubeSet)).2 hproj_local + +theorem cubeAverage_cubeProjection_succ_eq_cubeAverage_of_mem_descendantsAtDepth_of_integrableOn + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hg : MeasureTheory.IntegrableOn g (cubeSet R) MeasureTheory.volume) : + cubeAverage R (cubeProjection Q (j + 1) g) = cubeAverage R g := by + have hproj_int : + MeasureTheory.IntegrableOn (cubeProjection Q (j + 1) g) (cubeSet R) + MeasureTheory.volume := + integrableOn_cubeProjection_succ_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (g := g) hR + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := R) (j := 1) (f := cubeProjection Q (j + 1) g) hproj_int] + have hchild : + ∀ S ∈ descendantsAtDepth R 1, + cubeAverage S (cubeProjection Q (j + 1) g) = cubeAverage S g := by + intro S hS + have hSQ : S ∈ descendantsAtDepth Q (j + 1) := by + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨R, hR, by simpa [descendantsAtDepth_one] using hS⟩ + exact cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := S) (j := j + 1) (g := g) hSQ + calc + descendantsAverage R 1 (fun S => cubeAverage S (cubeProjection Q (j + 1) g)) + = descendantsAverage R 1 (fun S => cubeAverage S g) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth R 1).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro S hS + rw [hchild S hS] + _ = cubeAverage R g := by + simpa using + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := R) (j := 1) (f := g) hg).symm + +theorem cubeAverage_mul_projection_projection_succ_eq_mul_projection_projection_of_mem_descendantsAtDepth_of_integrableOn + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hg : MeasureTheory.IntegrableOn g (cubeSet R) MeasureTheory.volume) : + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q (j + 1) g x) = + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) := by + have hleft : + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q (j + 1) g x) = + cubeAverage R (fun x => cubeAverage R f * cubeProjection Q (j + 1) g x) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) f hR hx] + have hright : + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) = + cubeAverage R (fun x => cubeAverage R f * cubeProjection Q j g x) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) f hR hx] + have hconst_succ : + cubeAverage R (fun x => cubeAverage R f * cubeProjection Q (j + 1) g x) = + cubeAverage R f * cubeAverage R (cubeProjection Q (j + 1) g) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, MeasureTheory.integral_const_mul, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + have hconst : + cubeAverage R (fun x => cubeAverage R f * cubeProjection Q j g x) = + cubeAverage R f * cubeAverage R (cubeProjection Q j g) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, MeasureTheory.integral_const_mul, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + rw [hleft, hright] + calc + cubeAverage R (fun x => cubeAverage R f * cubeProjection Q (j + 1) g x) + = cubeAverage R f * cubeAverage R (cubeProjection Q (j + 1) g) := hconst_succ + _ = cubeAverage R f * cubeAverage R (cubeProjection Q j g) := by + rw [cubeAverage_cubeProjection_succ_eq_cubeAverage_of_mem_descendantsAtDepth_of_integrableOn + (Q := Q) (R := R) (j := j) (g := g) hR hg, + cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (g := g) hR] + _ = cubeAverage R (fun x => cubeAverage R f * cubeProjection Q j g x) := hconst.symm + +theorem cubeAverage_mul_projection_eq_mul_projection_projection_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeAverage R (fun x => f x * cubeProjection Q j g x) = + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR hf + have hprojf : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR + have hprojg : + MeasureTheory.MemLp (cubeProjection Q j g) q (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := q) (f := g) hR + have hfirst_int : + MeasureTheory.Integrable + (fun x => cubeProjection Q j f x * cubeProjection Q j g x) + (normalizedCubeMeasure R) := by + simpa [mul_comm] using! hprojg.integrable_mul hprojf + have hsecond_int_raw : + MeasureTheory.Integrable + (fun x => cubeProjection Q j g x * cubeProjectionResidual Q j f x) + (normalizedCubeMeasure R) := by + simpa using! hprojg.integrable_mul hres + have hsecond_int : + MeasureTheory.Integrable + (fun x => cubeProjectionResidual Q j f x * cubeProjection Q j g x) + (normalizedCubeMeasure R) := by + refine hsecond_int_raw.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + simp [mul_comm] + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + calc + ∫ x, f x * cubeProjection Q j g x ∂ normalizedCubeMeasure R + = + ∫ x, + cubeProjection Q j f x * cubeProjection Q j g x + + cubeProjectionResidual Q j f x * cubeProjection Q j g x + ∂ normalizedCubeMeasure R := by + refine MeasureTheory.integral_congr_ae ?_ + refine Filter.Eventually.of_forall ?_ + intro x + calc + f x * cubeProjection Q j g x + = (cubeProjection Q j f x + cubeProjectionResidual Q j f x) * + cubeProjection Q j g x := by + simp [cubeProjectionResidual] + _ = cubeProjection Q j f x * cubeProjection Q j g x + + cubeProjectionResidual Q j f x * cubeProjection Q j g x := by + rw [add_mul] + _ = + ∫ x, cubeProjection Q j f x * cubeProjection Q j g x ∂ normalizedCubeMeasure R + + ∫ x, cubeProjectionResidual Q j f x * cubeProjection Q j g x + ∂ normalizedCubeMeasure R := by + rw [MeasureTheory.integral_add hfirst_int hsecond_int] + _ = + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) + + cubeAverage R (fun x => cubeProjectionResidual Q j f x * cubeProjection Q j g x) := by + congr 2 <;> rw [← cubeAverage_eq_integral_normalizedCubeMeasure] + _ = cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) + 0 := by + rw [show + cubeAverage R (fun x => cubeProjectionResidual Q j f x * cubeProjection Q j g x) = + cubeAverage R (fun x => cubeProjection Q j g x * cubeProjectionResidual Q j f x) by + congr 1 + funext x + rw [mul_comm], + cubeAverage_mul_cubeProjection_cubeProjectionResidual_eq_zero_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) hR hf hp] + _ = cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q j g x) := by ring + +theorem cubeAverage_mul_projection_succ_eq_add_cubeAverage_mul_projection_add_projectionResidual_of_mem_descendantsAtDepth_of_integrableOn + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet R) MeasureTheory.volume) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeAverage R (fun x => f x * cubeProjection Q (j + 1) g x) = + cubeAverage R (fun x => f x * cubeProjection Q j g x) + + cubeAverage R (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hg' : MeasureTheory.MemLp (cubeProjection Q (j + 1) g) q (normalizedCubeMeasure R) := by + simpa [q] using hg + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR hf + have hprojf : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR + have hfirst_int : + MeasureTheory.Integrable + (fun x => cubeProjection Q j f x * cubeProjection Q (j + 1) g x) + (normalizedCubeMeasure R) := by + simpa [q, mul_comm] using! hg'.integrable_mul hprojf + have hsecond_int_raw : + MeasureTheory.Integrable + (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + (normalizedCubeMeasure R) := by + simpa [q] using! hg'.integrable_mul hres + have hsecond_int : + MeasureTheory.Integrable + (fun x => cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x) + (normalizedCubeMeasure R) := by + refine hsecond_int_raw.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + simp [mul_comm] + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + calc + ∫ x, f x * cubeProjection Q (j + 1) g x ∂ normalizedCubeMeasure R + = + ∫ x, + cubeProjection Q j f x * cubeProjection Q (j + 1) g x + + cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x + ∂ normalizedCubeMeasure R := by + refine MeasureTheory.integral_congr_ae ?_ + refine Filter.Eventually.of_forall ?_ + intro x + calc + f x * cubeProjection Q (j + 1) g x + = (cubeProjection Q j f x + cubeProjectionResidual Q j f x) * + cubeProjection Q (j + 1) g x := by + simp [cubeProjectionResidual] + _ = cubeProjection Q j f x * cubeProjection Q (j + 1) g x + + cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x := by + rw [add_mul] + _ = + ∫ x, cubeProjection Q j f x * cubeProjection Q (j + 1) g x + ∂ normalizedCubeMeasure R + + ∫ x, cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x + ∂ normalizedCubeMeasure R := by + rw [MeasureTheory.integral_add hfirst_int hsecond_int] + _ = + cubeAverage R (fun x => cubeProjection Q j f x * cubeProjection Q (j + 1) g x) + + cubeAverage R (fun x => cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x) := by + congr 2 <;> rw [← cubeAverage_eq_integral_normalizedCubeMeasure] + _ = + cubeAverage R (fun x => f x * cubeProjection Q j g x) + + cubeAverage R (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) := by + rw [cubeAverage_mul_projection_projection_succ_eq_mul_projection_projection_of_mem_descendantsAtDepth_of_integrableOn + (Q := Q) (R := R) (j := j) (f := f) (g := g) hR hgInt, + ← cubeAverage_mul_projection_eq_mul_projection_projection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) hR hf hp, + show + cubeAverage R (fun x => cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x) = + cubeAverage R (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) by + congr 1 + funext x + rw [mul_comm]] + +theorem cubeBesovPairing_projection_zero_eq_cubeAverage_mul_cubeAverage {d : ℕ} + (Q : TriadicCube d) (f g : Vec d → ℝ) : + cubeBesovPairing Q f (cubeProjection Q 0 g) = cubeAverage Q f * cubeAverage Q g := by + unfold cubeBesovPairing + have hcongr : + cubeAverage Q (fun x => f x * cubeProjection Q 0 g x) = + cubeAverage Q (fun x => f x * cubeAverage Q g) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) g (by simp) hx] + rw [hcongr, cubeAverage_eq_integral_normalizedCubeMeasure, MeasureTheory.integral_mul_const, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + +theorem cubeBesovPairing_projection_succ_eq_add_cubeBesovPairing_projection_add_projectionResidual + {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) (j : ℕ) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hf : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeBesovPairing Q f (cubeProjection Q (j + 1) g) = + cubeBesovPairing Q f (cubeProjection Q j g) + + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) := by + let hsucc : Vec d → ℝ := fun x => f x * cubeProjection Q (j + 1) g x + let hcur : Vec d → ℝ := fun x => f x * cubeProjection Q j g x + let hres : Vec d → ℝ := fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x + have hsucc_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn hsucc (cubeSet R) MeasureTheory.volume := by + intro R hR + simpa [hsucc] using + integrableOn_mul_projection_succ_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) + hR (hf R hR) (hg R hR) hp + have hcur_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn hcur (cubeSet R) MeasureTheory.volume := by + intro R hR + simpa [hcur] using + integrableOn_mul_projection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) + hR (hf R hR) hp + have hres_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn hres (cubeSet R) MeasureTheory.volume := by + intro R hR + simpa [hres] using + integrableOn_mul_projectionResidual_projection_succ_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) + hR (hf R hR) (hg R hR) hp + have hsucc_int : + MeasureTheory.IntegrableOn hsucc (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := hsucc) (μ := MeasureTheory.volume) (s := descendantsAtDepth Q j) (t := cubeSet)).2 + hsucc_local + have hcur_int : + MeasureTheory.IntegrableOn hcur (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := hcur) (μ := MeasureTheory.volume) (s := descendantsAtDepth Q j) (t := cubeSet)).2 + hcur_local + have hres_int : + MeasureTheory.IntegrableOn hres (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := hres) (μ := MeasureTheory.volume) (s := descendantsAtDepth Q j) (t := cubeSet)).2 + hres_local + have hlocal : + ∀ R ∈ descendantsAtDepth Q j, + cubeAverage R hsucc = cubeAverage R hcur + cubeAverage R hres := by + intro R hR + have hgIntR : MeasureTheory.IntegrableOn g (cubeSet R) MeasureTheory.volume := + hgInt.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + simpa [hsucc, hcur, hres] using + cubeAverage_mul_projection_succ_eq_add_cubeAverage_mul_projection_add_projectionResidual_of_mem_descendantsAtDepth_of_integrableOn + (Q := Q) (R := R) (j := j) (p := p) (f := f) (g := g) + hR hgIntR (hf R hR) (hg R hR) hp + unfold cubeBesovPairing + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := hsucc) hsucc_int, + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := hcur) hcur_int, + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := hres) hres_int] + calc + descendantsAverage Q j (fun R => cubeAverage R hsucc) + = descendantsAverage Q j (fun R => cubeAverage R hcur + cubeAverage R hres) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + exact hlocal R hR + _ = descendantsAverage Q j (fun R => cubeAverage R hcur) + + descendantsAverage Q j (fun R => cubeAverage R hres) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + change ((D.card : ℝ)⁻¹ * ∑ R ∈ D, (cubeAverage R hcur + cubeAverage R hres)) = + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, cubeAverage R hcur) + + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, cubeAverage R hres) + rw [Finset.sum_add_distrib] + ring + +theorem cubeBesovPairing_projection_eq_cubeAverage_mul_cubeAverage_add_sum + {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) (N : ℕ) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hf : ∀ j < N, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ j < N, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + cubeBesovPairing Q f (cubeProjection Q N g) = + cubeAverage Q f * cubeAverage Q g + + Finset.sum (Finset.range N) (fun j => + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)) := by + let T : ℕ → ℝ := fun j => + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + induction N with + | zero => + simp [cubeBesovPairing_projection_zero_eq_cubeAverage_mul_cubeAverage] + | succ N ih => + have hf' : + ∀ j < N, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R) := by + intro j hj R hR + exact hf j (Nat.lt_trans hj (Nat.lt_succ_self N)) R hR + have hg' : + ∀ j < N, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R) := by + intro j hj R hR + exact hg j (Nat.lt_trans hj (Nat.lt_succ_self N)) R hR + calc + cubeBesovPairing Q f (cubeProjection Q (N + 1) g) + = cubeBesovPairing Q f (cubeProjection Q N g) + T N := by + simpa [T] using + cubeBesovPairing_projection_succ_eq_add_cubeBesovPairing_projection_add_projectionResidual + (Q := Q) (p := p) (f := f) (g := g) (j := N) + hgInt + (fun R hR => hf N (Nat.lt_succ_self N) R hR) + (fun R hR => hg N (Nat.lt_succ_self N) R hR) + hp + _ = (cubeAverage Q f * cubeAverage Q g + Finset.sum (Finset.range N) T) + T N := by + rw [ih hf' hg'] + _ = cubeAverage Q f * cubeAverage Q g + Finset.sum (Finset.range (N + 1)) T := by + rw [Finset.sum_range_succ] + ring + +theorem cubeBesovDepthWeight_mul_cubeBesovCircDepthWeight_succ {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q s (j + 1) = (3 : ℝ) ^ (-s) := by + have hQ : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow_pos : 0 < (3 : ℝ) ^ j := by positivity + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ j := le_of_lt hpow_pos + have hA_pos : 0 < cubeScaleFactor Q / (3 : ℝ) ^ j := div_pos hQ hpow_pos + have hA_nonneg : 0 ≤ cubeScaleFactor Q / (3 : ℝ) ^ j := le_of_lt hA_pos + have hdiv : + cubeScaleFactor Q / (3 : ℝ) ^ (j + 1) = + (cubeScaleFactor Q / (3 : ℝ) ^ j) / 3 := by + rw [pow_succ', div_eq_mul_inv, div_eq_mul_inv] + ring + unfold cubeBesovDepthWeight cubeBesovCircDepthWeight + rw [hdiv, Real.div_rpow hA_nonneg (by positivity)] + calc + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) * + ((cubeScaleFactor Q / (3 : ℝ) ^ j) ^ s / (3 : ℝ) ^ s) + = ((cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) * + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ s) / (3 : ℝ) ^ s := by + ring + _ = (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ ((-s) + s) / (3 : ℝ) ^ s := by + rw [← Real.rpow_add hA_pos] + _ = 1 / (3 : ℝ) ^ s := by + rw [show -s + s = 0 by ring, Real.rpow_zero] + _ = (3 : ℝ) ^ (-s) := by + rw [one_div, Real.rpow_neg (by positivity)] + +theorem cubeBesovCircDepthSeminorm_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircDepthSeminorm Q s p u 0 = + cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q u‖ := by + have hp_pos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hnorm_nonneg : 0 ≤ ‖cubeAverage Q u‖ := norm_nonneg _ + unfold cubeBesovCircDepthSeminorm + rw [cubeBesovCircDepthWeight_depth_zero, cubeBesovCircDepthAverage_depth_zero] + congr 1 + calc + (‖cubeAverage Q u‖ ^ p.toReal) ^ (1 / p.toReal) + = ‖cubeAverage Q u‖ ^ (p.toReal * (1 / p.toReal)) := by + rw [← Real.rpow_mul hnorm_nonneg] + _ = ‖cubeAverage Q u‖ ^ (1 : ℝ) := by + field_simp [hp_pos.ne'] + _ = ‖cubeAverage Q u‖ := by + rw [Real.rpow_one] + +theorem cubeBesovCircDepthSeminorm_zero_le_cubeBesovCircPartialNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovCircDepthSeminorm Q s p u 0 ≤ cubeBesovCircPartialNorm Q s p q N u := by + have hq_pos : 0 < q.toReal := ENNReal.toReal_pos hq0 hqTop + have hsingle : + (cubeBesovCircDepthSeminorm Q s p u 0) ^ q.toReal ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal) := by + simpa using Finset.single_le_sum + (fun j _ => Real.rpow_nonneg (cubeBesovCircDepthSeminorm_nonneg Q s p u j) _) + (by simp) + calc + cubeBesovCircDepthSeminorm Q s p u 0 + = ((cubeBesovCircDepthSeminorm Q s p u 0) ^ q.toReal) ^ (1 / q.toReal) := by + symm + rw [← Real.rpow_mul (cubeBesovCircDepthSeminorm_nonneg Q s p u 0)] + field_simp [hq_pos.ne'] + rw [Real.rpow_one] + _ ≤ (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal)) ^ (1 / q.toReal) := by + exact Real.rpow_le_rpow + (Real.rpow_nonneg (cubeBesovCircDepthSeminorm_nonneg Q s p u 0) _) + hsingle + (show 0 ≤ 1 / q.toReal by positivity) + _ = cubeBesovCircPartialNorm Q s p q N u := by + rfl + +theorem shifted_cubeBesovCircPartialSeminorm_le_cubeBesovCircPartialNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (_hq0 : q ≠ 0) (_hqTop : q ≠ ∞) : + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u (j + 1)) ^ q.toReal)) ^ (1 / q.toReal) ≤ + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + have hshift : + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u (j + 1)) ^ q.toReal) ≤ + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal) := by + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u (j + 1)) ^ q.toReal) + ≤ (cubeBesovCircDepthSeminorm Q s p u 0) ^ q.toReal + + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u (j + 1)) ^ q.toReal) := by + exact le_add_of_nonneg_left + (Real.rpow_nonneg (cubeBesovCircDepthSeminorm_nonneg Q s p u 0) _) + _ = Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal) := by + symm + simpa [add_comm, add_left_comm, add_assoc] using + (Finset.sum_range_succ' + (f := fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal) + (n := N + 1)) + exact (Real.rpow_le_rpow + (Finset.sum_nonneg fun j _ => Real.rpow_nonneg (cubeBesovCircDepthSeminorm_nonneg Q s p u (j + 1)) _) + hshift + (show 0 ≤ 1 / q.toReal by positivity)).trans_eq (by rfl) + +theorem abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (f g : Vec d → ℝ) (j : ℕ) + (hp : 1 ≤ p) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) + (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hf : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) : + |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| ≤ + (3 : ℝ) ^ s * + cubeBesovDepthSeminorm Q s p f j * + cubeBesovCircDepthSeminorm Q s (cubeBesovConjExponent p) g (j + 1) := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + have hraw := + abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovCircDepthAverage + (Q := Q) (p := p) (f := f) (g := g) (j := j) + hp hp0 hpTop hpConjTop hf hg + have hweight : + (3 : ℝ) ^ s * cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q s (j + 1) = 1 := by + have hthree_pos : 0 < (3 : ℝ) := by norm_num + calc + (3 : ℝ) ^ s * cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q s (j + 1) + = (3 : ℝ) ^ s * + (cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q s (j + 1)) := by + ring + _ = (3 : ℝ) ^ s * (3 : ℝ) ^ (-s) := by + rw [cubeBesovDepthWeight_mul_cubeBesovCircDepthWeight_succ] + _ = (3 : ℝ) ^ (s + -s) := by + rw [← Real.rpow_add hthree_pos] + _ = 1 := by + rw [show s + -s = 0 by ring, Real.rpow_zero] + calc + |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| + ≤ (cubeBesovCircDepthAverage Q q g (j + 1)) ^ (1 / q.toReal) * + (cubeBesovDepthAverage Q p f j) ^ (1 / p.toReal) := hraw + _ = ((3 : ℝ) ^ s * cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q s (j + 1)) * + ((cubeBesovCircDepthAverage Q q g (j + 1)) ^ (1 / q.toReal) * + (cubeBesovDepthAverage Q p f j) ^ (1 / p.toReal)) := by + rw [hweight, one_mul] + _ = (3 : ℝ) ^ s * + cubeBesovDepthSeminorm Q s p f j * + cubeBesovCircDepthSeminorm Q s q g (j + 1) := by + unfold cubeBesovDepthSeminorm cubeBesovCircDepthSeminorm + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Integrability.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Integrability.lean new file mode 100644 index 0000000000..01141f908d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Integrability.lean @@ -0,0 +1,215 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Projections + +/-! # Integrability -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal +theorem integrableOn_of_integrable_normalizedCubeMeasure {d : ℕ} (Q : TriadicCube d) + {f : Vec d → ℝ} + (hf : MeasureTheory.Integrable f (normalizedCubeMeasure Q)) : + MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := by + have hscale_ne_zero : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := by + have hscale_pos : 0 < ENNReal.ofReal ((cubeVolume Q)⁻¹) := by + exact ENNReal.ofReal_pos.mpr (inv_pos.mpr (cubeVolume_pos Q)) + exact hscale_pos.ne' + change MeasureTheory.Integrable f (MeasureTheory.volume.restrict (cubeSet Q)) at ⊢ + rw [normalizedCubeMeasure, cubeMeasure] at hf + exact (MeasureTheory.integrable_smul_measure + (μ := MeasureTheory.volume.restrict (cubeSet Q)) hscale_ne_zero ENNReal.ofReal_ne_top).1 + hf + +theorem integrableOn_mul_projectionResidual_projection_succ_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + MeasureTheory.IntegrableOn + (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + (cubeSet R) MeasureTheory.volume := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR hf + have hint : + MeasureTheory.Integrable + (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + (normalizedCubeMeasure R) := by + simpa [q] using! hg.integrable_mul hres + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := R) hint + +theorem integrableOn_mul_projection_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + MeasureTheory.IntegrableOn + (fun x => f x * cubeProjection Q j g x) + (cubeSet R) MeasureTheory.volume := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR hf + have hprojf : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR + have hprojg : + MeasureTheory.MemLp (cubeProjection Q j g) q (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := q) (f := g) hR + have hfirst_int : + MeasureTheory.Integrable + (fun x => cubeProjection Q j f x * cubeProjection Q j g x) + (normalizedCubeMeasure R) := by + simpa [q, mul_comm] using! hprojg.integrable_mul hprojf + have hsecond_int_raw : + MeasureTheory.Integrable + (fun x => cubeProjection Q j g x * cubeProjectionResidual Q j f x) + (normalizedCubeMeasure R) := by + simpa [q] using! hprojg.integrable_mul hres + have hsecond_int : + MeasureTheory.Integrable + (fun x => cubeProjectionResidual Q j f x * cubeProjection Q j g x) + (normalizedCubeMeasure R) := by + refine hsecond_int_raw.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + simp [mul_comm] + have hsum_int : + MeasureTheory.Integrable + (fun x => + cubeProjection Q j f x * cubeProjection Q j g x + + cubeProjectionResidual Q j f x * cubeProjection Q j g x) + (normalizedCubeMeasure R) := + hfirst_int.add hsecond_int + refine integrableOn_of_integrable_normalizedCubeMeasure (Q := R) ?_ + refine hsum_int.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + symm + calc + f x * cubeProjection Q j g x + = (cubeProjection Q j f x + cubeProjectionResidual Q j f x) * + cubeProjection Q j g x := by + simp [cubeProjectionResidual] + _ = cubeProjection Q j f x * cubeProjection Q j g x + + cubeProjectionResidual Q j f x * cubeProjection Q j g x := by + rw [add_mul] + +theorem integrableOn_mul_projection_succ_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + MeasureTheory.IntegrableOn + (fun x => f x * cubeProjection Q (j + 1) g x) + (cubeSet R) MeasureTheory.volume := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR hf + have hprojf : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR + have hfirst_int : + MeasureTheory.Integrable + (fun x => cubeProjection Q j f x * cubeProjection Q (j + 1) g x) + (normalizedCubeMeasure R) := by + simpa [q, mul_comm] using! hg.integrable_mul hprojf + have hsecond_int_raw : + MeasureTheory.Integrable + (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + (normalizedCubeMeasure R) := by + simpa [q] using! hg.integrable_mul hres + have hsecond_int : + MeasureTheory.Integrable + (fun x => cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x) + (normalizedCubeMeasure R) := by + refine hsecond_int_raw.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + simp [mul_comm] + have hsum_int : + MeasureTheory.Integrable + (fun x => + cubeProjection Q j f x * cubeProjection Q (j + 1) g x + + cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x) + (normalizedCubeMeasure R) := + hfirst_int.add hsecond_int + refine integrableOn_of_integrable_normalizedCubeMeasure (Q := R) ?_ + refine hsum_int.congr ?_ + refine Filter.Eventually.of_forall ?_ + intro x + symm + calc + f x * cubeProjection Q (j + 1) g x + = (cubeProjection Q j f x + cubeProjectionResidual Q j f x) * + cubeProjection Q (j + 1) g x := by + simp [cubeProjectionResidual] + _ = cubeProjection Q j f x * cubeProjection Q (j + 1) g x + + cubeProjectionResidual Q j f x * cubeProjection Q (j + 1) g x := by + rw [add_mul] + +theorem cubeAverage_cubeProjectionResidual_depth_zero_eq_zero_of_memLp {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp (cubeProjectionResidual Q 0 f) p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + cubeAverage Q (cubeProjectionResidual Q 0 f) = 0 := by + have hres_int : + MeasureTheory.Integrable (cubeProjectionResidual Q 0 f) (normalizedCubeMeasure Q) := + hf.integrable hp + have hproj_int : + MeasureTheory.Integrable (cubeProjection Q 0 f) (normalizedCubeMeasure Q) := by + exact + (cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) (p := (1 : ℝ≥0∞)) (f := f) (by simp)).integrable + (by norm_num) + have hf_int : MeasureTheory.Integrable f (normalizedCubeMeasure Q) := by + refine (hres_int.add hproj_int).congr ?_ + filter_upwards with x + simp [cubeProjectionResidual] + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + change ∫ x, (f x - cubeProjection Q 0 f x) ∂ normalizedCubeMeasure Q = 0 + rw [MeasureTheory.integral_sub hf_int hproj_int] + have hproj_avg : + ∫ x, cubeProjection Q 0 f x ∂ normalizedCubeMeasure Q = cubeAverage Q f := by + calc + ∫ x, cubeProjection Q 0 f x ∂ normalizedCubeMeasure Q + = ∫ x, cubeAverage Q f ∂ normalizedCubeMeasure Q := by + refine MeasureTheory.integral_congr_ae ?_ + simpa using + cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) f (by simp) + _ = cubeAverage Q f := by + rw [MeasureTheory.integral_const] + simp [MeasureTheory.measureReal_def] + rw [hproj_avg, cubeAverage_eq_integral_normalizedCubeMeasure] + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/MainBounds.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/MainBounds.lean new file mode 100644 index 0000000000..6a570c2b70 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/MainBounds.lean @@ -0,0 +1,578 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.Averages + +/-! # Main Bounds -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal +theorem abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (f g : Vec d → ℝ) (N : ℕ) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) (hqTop : q ≠ ∞) (hqConjTop : cubeBesovConjExponent q ≠ ∞) + (hf : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s p q N f * + cubeBesovCircPartialNorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) (N + 1) g := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let qConj : ℝ≥0∞ := cubeBesovConjExponent q + let T : ℕ → ℝ := fun j => + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + let A : ℕ → ℝ := fun j => cubeBesovDepthSeminorm Q s p f j + let B : ℕ → ℝ := fun j => cubeBesovCircDepthSeminorm Q s pConj g (j + 1) + let K : ℝ := max 1 ((3 : ℝ) ^ s) + let M : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖ + let S : ℝ := cubeBesovPartialSeminorm Q s p q N f + let C : ℝ := cubeBesovCircPartialNorm Q s pConj qConj (N + 1) g + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hq0 : q ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hq) + have hpConj0 : pConj ≠ 0 := by + simpa [pConj] using cubeBesovConjExponent_ne_zero p + have hqConj0 : qConj ≠ 0 := by + simpa [qConj] using cubeBesovConjExponent_ne_zero q + have hpConj_eq : + cubeBesovCircDepthSeminorm Q s pConj g 0 = + cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖ := by + simpa [pConj] using + cubeBesovCircDepthSeminorm_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (u := g) hpConj0 hpConjTop + have hC_nonneg : 0 ≤ C := by + simpa [C, pConj, qConj] using + cubeBesovCircPartialNorm_nonneg Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) (N + 1) g + have hM_nonneg : 0 ≤ M := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _) + have hS_nonneg : 0 ≤ S := by + simpa [S] using cubeBesovPartialSeminorm_nonneg Q s p q N f + have hK_nonneg : 0 ≤ K := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + have hK_ge_one : 1 ≤ K := le_max_left 1 ((3 : ℝ) ^ s) + have hmean_le : + |cubeAverage Q f * cubeAverage Q g| ≤ M * C := by + have hdepth0_le : + cubeBesovCircDepthSeminorm Q s pConj g 0 ≤ C := by + simpa [C, pConj, qConj] using + cubeBesovCircDepthSeminorm_zero_le_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := qConj) (N := N + 1) (u := g) hqConj0 hqConjTop + calc + |cubeAverage Q f * cubeAverage Q g| + = ‖cubeAverage Q f‖ * ‖cubeAverage Q g‖ := by + simp [abs_mul] + _ = (cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * + (‖cubeAverage Q f‖ * ‖cubeAverage Q g‖) := by + have hscale : + cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + rw [hscale, one_mul] + _ = (cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖) * + (cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖) := by + ring + _ = M * cubeBesovCircDepthSeminorm Q s pConj g 0 := by + rw [hpConj_eq] + _ ≤ M * C := by + exact mul_le_mul_of_nonneg_left hdepth0_le hM_nonneg + have hterm : + ∀ j < N + 1, |T j| ≤ K * (A j * B j) := by + intro j hj + have hAB_nonneg : 0 ≤ A j * B j := by + exact mul_nonneg + (by simpa [A] using cubeBesovDepthSeminorm_nonneg Q s p f j) + (by simpa [B, pConj] using cubeBesovCircDepthSeminorm_nonneg Q s pConj g (j + 1)) + calc + |T j| + = |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| := by + simp [T] + _ ≤ (3 : ℝ) ^ s * A j * B j := by + simpa [A, B, pConj] using + abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovDepthSeminorm + (Q := Q) (s := s) (p := p) (f := f) (g := g) (j := j) + hp hp0 hpTop hpConjTop + (fun R hR => hf j hj R hR) + (fun R hR => hg j hj R hR) + _ = (3 : ℝ) ^ s * (A j * B j) := by + ring + _ ≤ K * (A j * B j) := by + exact mul_le_mul_of_nonneg_right (le_max_right 1 ((3 : ℝ) ^ s)) hAB_nonneg + have hsum_terms : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ + K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => K * (A j * B j)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact hterm j (Finset.mem_range.mp hj) + _ = K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + rw [← Finset.mul_sum] + let : ENNReal.HolderConjugate q qConj := + by simpa [qConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hq + let : ENNReal.HolderConjugate qConj q := inferInstance + have hq_toReal_ge : 1 ≤ q.toReal := by + simpa using ENNReal.toReal_mono hqTop hq + have hq_ne_one : q ≠ 1 := by + exact (ENNReal.HolderConjugate.ne_top_iff_ne_one (p := qConj) (q := q)).1 + (by simpa [qConj] using hqConjTop) + have hq_toReal_ne_one : q.toReal ≠ 1 := by + intro h + exact hq_ne_one ((ENNReal.toReal_eq_one_iff q).mp h) + have hq_toReal_gt : 1 < q.toReal := lt_of_le_of_ne hq_toReal_ge (Ne.symm hq_toReal_ne_one) + have hdisc : Real.HolderConjugate q.toReal qConj.toReal := + ENNReal.HolderConjugate.toReal (p := q) (q := qConj) hq_toReal_gt + have hholder : + Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) ≤ + (Finset.sum (Finset.range (N + 1)) (fun j => (A j) ^ q.toReal)) ^ (1 / q.toReal) * + (Finset.sum (Finset.range (N + 1)) (fun j => (B j) ^ qConj.toReal)) ^ + (1 / qConj.toReal) := by + exact Real.inner_le_Lp_mul_Lq_of_nonneg + (s := Finset.range (N + 1)) (f := A) (g := B) hdisc + (fun j _ => by simpa [A] using cubeBesovDepthSeminorm_nonneg Q s p f j) + (fun j _ => by simpa [B, pConj] using cubeBesovCircDepthSeminorm_nonneg Q s pConj g (j + 1)) + have hshift_circ : + (Finset.sum (Finset.range (N + 1)) (fun j => (B j) ^ qConj.toReal)) ^ (1 / qConj.toReal) ≤ C := by + simpa [B, C, pConj, qConj] using + shifted_cubeBesovCircPartialSeminorm_le_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := qConj) (N := N) (u := g) hqConj0 hqConjTop + have hsum_le : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ K * S * C := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := hsum_terms + _ ≤ K * + ((Finset.sum (Finset.range (N + 1)) (fun j => (A j) ^ q.toReal)) ^ (1 / q.toReal) * + (Finset.sum (Finset.range (N + 1)) (fun j => (B j) ^ qConj.toReal)) ^ + (1 / qConj.toReal)) := by + exact mul_le_mul_of_nonneg_left hholder hK_nonneg + _ = K * (S * + (Finset.sum (Finset.range (N + 1)) (fun j => (B j) ^ qConj.toReal)) ^ + (1 / qConj.toReal)) := by + rfl + _ ≤ K * (S * C) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hshift_circ hS_nonneg) hK_nonneg + _ = K * S * C := by + ring + have hdecomp : + cubeBesovPairing Q f (cubeProjection Q (N + 1) g) = + cubeAverage Q f * cubeAverage Q g + + Finset.sum (Finset.range (N + 1)) T := by + simpa [T] using + cubeBesovPairing_projection_eq_cubeAverage_mul_cubeAverage_add_sum + (Q := Q) (p := p) (f := f) (g := g) (N := N + 1) hgInt hf hg hp + have habs : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + rw [hdecomp] + calc + |cubeAverage Q f * cubeAverage Q g + Finset.sum (Finset.range (N + 1)) T| + ≤ |cubeAverage Q f * cubeAverage Q g| + + |Finset.sum (Finset.range (N + 1)) T| := by + exact abs_add_le _ _ + _ ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + simpa using add_le_add_left + (Finset.abs_sum_le_sum_abs T (Finset.range (N + 1))) + (|cubeAverage Q f * cubeAverage Q g|) + calc + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| + ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := habs + _ ≤ M * C + K * S * C := add_le_add hmean_le hsum_le + _ = (M + K * S) * C := by ring + _ ≤ (K * (M + S)) * C := by + refine mul_le_mul_of_nonneg_right ?_ hC_nonneg + calc + M + K * S ≤ K * M + K * S := by + exact add_le_add + (by + simpa [one_mul] using + (mul_le_mul_of_nonneg_right hK_ge_one hM_nonneg)) + le_rfl + _ = K * (M + S) := by ring + _ = K * cubeBesovPartialNorm Q s p q N f * C := by + unfold M S cubeBesovPartialNorm + ring + _ = max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s p q N f * + cubeBesovCircPartialNorm Q s (cubeBesovConjExponent p) (cubeBesovConjExponent q) (N + 1) g := by + rfl + +theorem abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormTop_cubeBesovCircPartialNormOne + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (f g : Vec d → ℝ) (N : ℕ) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hf : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNormTop Q s p N f * + cubeBesovCircPartialNorm Q s (cubeBesovConjExponent p) 1 (N + 1) g := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let T : ℕ → ℝ := fun j => + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + let A : ℕ → ℝ := fun j => cubeBesovDepthSeminorm Q s p f j + let B : ℕ → ℝ := fun j => cubeBesovCircDepthSeminorm Q s pConj g (j + 1) + let K : ℝ := max 1 ((3 : ℝ) ^ s) + let M : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖ + let S : ℝ := cubeBesovPartialSeminormTop Q s p N f + let C : ℝ := cubeBesovCircPartialNorm Q s pConj 1 (N + 1) g + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hpConj0 : pConj ≠ 0 := by + simpa [pConj] using cubeBesovConjExponent_ne_zero p + have hpConj_eq : + cubeBesovCircDepthSeminorm Q s pConj g 0 = + cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖ := by + simpa [pConj] using + cubeBesovCircDepthSeminorm_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (u := g) hpConj0 hpConjTop + have hC_nonneg : 0 ≤ C := by + simpa [C, pConj] using + cubeBesovCircPartialNorm_nonneg Q s (cubeBesovConjExponent p) 1 (N + 1) g + have hM_nonneg : 0 ≤ M := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _) + have hS_nonneg : 0 ≤ S := by + simpa [S] using cubeBesovPartialSeminormTop_nonneg Q s p N f + have hK_nonneg : 0 ≤ K := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + have hK_ge_one : 1 ≤ K := le_max_left 1 ((3 : ℝ) ^ s) + have hmean_le : + |cubeAverage Q f * cubeAverage Q g| ≤ M * C := by + have hdepth0_le : + cubeBesovCircDepthSeminorm Q s pConj g 0 ≤ C := by + simpa [C, pConj] using + cubeBesovCircDepthSeminorm_zero_le_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := (1 : ℝ≥0∞)) (N := N + 1) (u := g) + (by norm_num) (by simp) + calc + |cubeAverage Q f * cubeAverage Q g| + = ‖cubeAverage Q f‖ * ‖cubeAverage Q g‖ := by + simp [abs_mul] + _ = (cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * + (‖cubeAverage Q f‖ * ‖cubeAverage Q g‖) := by + have hscale : + cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + rw [hscale, one_mul] + _ = (cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖) * + (cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖) := by + ring + _ = M * cubeBesovCircDepthSeminorm Q s pConj g 0 := by + rw [hpConj_eq] + _ ≤ M * C := by + exact mul_le_mul_of_nonneg_left hdepth0_le hM_nonneg + have hterm : + ∀ j < N + 1, |T j| ≤ K * (A j * B j) := by + intro j hj + have hAB_nonneg : 0 ≤ A j * B j := by + exact mul_nonneg + (by simpa [A] using cubeBesovDepthSeminorm_nonneg Q s p f j) + (by simpa [B, pConj] using cubeBesovCircDepthSeminorm_nonneg Q s pConj g (j + 1)) + calc + |T j| + = |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| := by + simp [T] + _ ≤ (3 : ℝ) ^ s * A j * B j := by + simpa [A, B, pConj] using + abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovDepthSeminorm + (Q := Q) (s := s) (p := p) (f := f) (g := g) (j := j) + hp hp0 hpTop hpConjTop + (fun R hR => hf j hj R hR) + (fun R hR => hg j hj R hR) + _ = (3 : ℝ) ^ s * (A j * B j) := by + ring + _ ≤ K * (A j * B j) := by + exact mul_le_mul_of_nonneg_right (le_max_right 1 ((3 : ℝ) ^ s)) hAB_nonneg + have hsum_terms : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ + K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => K * (A j * B j)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact hterm j (Finset.mem_range.mp hj) + _ = K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + rw [← Finset.mul_sum] + have hsup : + ∀ j < N + 1, A j ≤ S := by + intro j hj + exact Finset.le_sup' (s := Finset.range (N + 1)) (f := A) (Finset.mem_range.mpr hj) + have hshift_circ : + Finset.sum (Finset.range (N + 1)) B ≤ C := by + simpa [B, C, pConj] using + shifted_cubeBesovCircPartialSeminorm_le_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := (1 : ℝ≥0∞)) (N := N) (u := g) + (by norm_num) (by simp) + have hsum_le : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ K * S * C := by + have hsumAB : + Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) ≤ + S * Finset.sum (Finset.range (N + 1)) B := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => S * B j) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_right + (hsup j (Finset.mem_range.mp hj)) + (by simpa [B, pConj] using cubeBesovCircDepthSeminorm_nonneg Q s pConj g (j + 1)) + _ = S * Finset.sum (Finset.range (N + 1)) B := by + rw [Finset.mul_sum] + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := hsum_terms + _ ≤ K * (S * Finset.sum (Finset.range (N + 1)) B) := by + exact mul_le_mul_of_nonneg_left hsumAB hK_nonneg + _ ≤ K * (S * C) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hshift_circ hS_nonneg) hK_nonneg + _ = K * S * C := by + ring + have hdecomp : + cubeBesovPairing Q f (cubeProjection Q (N + 1) g) = + cubeAverage Q f * cubeAverage Q g + + Finset.sum (Finset.range (N + 1)) T := by + simpa [T] using + cubeBesovPairing_projection_eq_cubeAverage_mul_cubeAverage_add_sum + (Q := Q) (p := p) (f := f) (g := g) (N := N + 1) hgInt hf hg hp + have habs : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + rw [hdecomp] + calc + |cubeAverage Q f * cubeAverage Q g + Finset.sum (Finset.range (N + 1)) T| + ≤ |cubeAverage Q f * cubeAverage Q g| + + |Finset.sum (Finset.range (N + 1)) T| := by + exact abs_add_le _ _ + _ ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + simpa using add_le_add_left + (Finset.abs_sum_le_sum_abs T (Finset.range (N + 1))) + (|cubeAverage Q f * cubeAverage Q g|) + calc + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| + ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := habs + _ ≤ M * C + K * S * C := add_le_add hmean_le hsum_le + _ = (M + K * S) * C := by ring + _ ≤ (K * (M + S)) * C := by + refine mul_le_mul_of_nonneg_right ?_ hC_nonneg + calc + M + K * S ≤ K * M + K * S := by + exact add_le_add + (by + simpa [one_mul] using + (mul_le_mul_of_nonneg_right hK_ge_one hM_nonneg)) + le_rfl + _ = K * (M + S) := by ring + _ = K * cubeBesovPartialNormTop Q s p N f * C := by + unfold M S cubeBesovPartialNormTop + ring + _ = max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNormTop Q s p N f * + cubeBesovCircPartialNorm Q s (cubeBesovConjExponent p) 1 (N + 1) g := by + rfl + +theorem abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormOne_cubeBesovCircPartialNormTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (f g : Vec d → ℝ) (N : ℕ) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hf : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s p 1 N f * + cubeBesovCircPartialNormTop Q s (cubeBesovConjExponent p) (N + 1) g := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let T : ℕ → ℝ := fun j => + cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x) + let A : ℕ → ℝ := fun j => cubeBesovDepthSeminorm Q s p f j + let B : ℕ → ℝ := fun j => cubeBesovCircDepthSeminorm Q s pConj g (j + 1) + let K : ℝ := max 1 ((3 : ℝ) ^ s) + let M : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖ + let S : ℝ := cubeBesovPartialSeminorm Q s p 1 N f + let C : ℝ := cubeBesovCircPartialNormTop Q s pConj (N + 1) g + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hpConj0 : pConj ≠ 0 := by + simpa [pConj] using cubeBesovConjExponent_ne_zero p + have hpConj_eq : + cubeBesovCircDepthSeminorm Q s pConj g 0 = + cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖ := by + simpa [pConj] using + cubeBesovCircDepthSeminorm_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage + (Q := Q) (s := s) (p := cubeBesovConjExponent p) (u := g) hpConj0 hpConjTop + have hC_nonneg : 0 ≤ C := by + simpa [C, pConj] using + cubeBesovCircPartialNormTop_nonneg Q s (cubeBesovConjExponent p) (N + 1) g + have hM_nonneg : 0 ≤ M := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _) + have hS_nonneg : 0 ≤ S := by + simpa [S] using cubeBesovPartialSeminorm_nonneg Q s p 1 N f + have hK_nonneg : 0 ≤ K := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + have hK_ge_one : 1 ≤ K := le_max_left 1 ((3 : ℝ) ^ s) + have hmean_le : + |cubeAverage Q f * cubeAverage Q g| ≤ M * C := by + have hdepth0_le : + cubeBesovCircDepthSeminorm Q s pConj g 0 ≤ C := by + unfold C cubeBesovCircPartialNormTop cubeBesovCircPartialSeminormTop + exact Finset.le_sup' (s := Finset.range (N + 2)) + (f := fun j => cubeBesovCircDepthSeminorm Q s pConj g j) (by simp) + calc + |cubeAverage Q f * cubeAverage Q g| + = ‖cubeAverage Q f‖ * ‖cubeAverage Q g‖ := by + simp [abs_mul] + _ = (cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * + (‖cubeAverage Q f‖ * ‖cubeAverage Q g‖) := by + have hscale : + cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + rw [hscale, one_mul] + _ = (cubeBesovScaleWeight s Q * ‖cubeAverage Q f‖) * + (cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q g‖) := by + ring + _ = M * cubeBesovCircDepthSeminorm Q s pConj g 0 := by + rw [hpConj_eq] + _ ≤ M * C := by + exact mul_le_mul_of_nonneg_left hdepth0_le hM_nonneg + have hterm : + ∀ j < N + 1, |T j| ≤ K * (A j * B j) := by + intro j hj + have hAB_nonneg : 0 ≤ A j * B j := by + exact mul_nonneg + (by simpa [A] using cubeBesovDepthSeminorm_nonneg Q s p f j) + (by simpa [B, pConj] using cubeBesovCircDepthSeminorm_nonneg Q s pConj g (j + 1)) + calc + |T j| + = |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| := by + simp [T] + _ ≤ (3 : ℝ) ^ s * A j * B j := by + simpa [A, B, pConj] using + abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovDepthSeminorm + (Q := Q) (s := s) (p := p) (f := f) (g := g) (j := j) + hp hp0 hpTop hpConjTop + (fun R hR => hf j hj R hR) + (fun R hR => hg j hj R hR) + _ = (3 : ℝ) ^ s * (A j * B j) := by + ring + _ ≤ K * (A j * B j) := by + exact mul_le_mul_of_nonneg_right (le_max_right 1 ((3 : ℝ) ^ s)) hAB_nonneg + have hsum_terms : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ + K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => K * (A j * B j)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact hterm j (Finset.mem_range.mp hj) + _ = K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := by + rw [← Finset.mul_sum] + have hshift_circ : + ∀ j < N + 1, B j ≤ C := by + intro j hj + unfold C cubeBesovCircPartialNormTop cubeBesovCircPartialSeminormTop + exact Finset.le_sup' (s := Finset.range (N + 2)) + (f := fun k => cubeBesovCircDepthSeminorm Q s pConj g k) + (Finset.mem_range.mpr (Nat.succ_lt_succ hj)) + have hsum_one : + Finset.sum (Finset.range (N + 1)) A = S := by + unfold S cubeBesovPartialSeminorm + simp [A] + have hsum_le : + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) ≤ K * S * C := by + have hsumAB : + Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) ≤ + Finset.sum (Finset.range (N + 1)) A * C := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => A j * C) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (hshift_circ j (Finset.mem_range.mp hj)) + (by simpa [A] using cubeBesovDepthSeminorm_nonneg Q s p f j) + _ = Finset.sum (Finset.range (N + 1)) A * C := by + rw [Finset.sum_mul] + calc + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) + ≤ K * Finset.sum (Finset.range (N + 1)) (fun j => A j * B j) := hsum_terms + _ ≤ K * (Finset.sum (Finset.range (N + 1)) A * C) := by + exact mul_le_mul_of_nonneg_left hsumAB hK_nonneg + _ = K * S * C := by + rw [hsum_one] + ring + have hdecomp : + cubeBesovPairing Q f (cubeProjection Q (N + 1) g) = + cubeAverage Q f * cubeAverage Q g + + Finset.sum (Finset.range (N + 1)) T := by + simpa [T] using + cubeBesovPairing_projection_eq_cubeAverage_mul_cubeAverage_add_sum + (Q := Q) (p := p) (f := f) (g := g) (N := N + 1) hgInt hf hg hp + have habs : + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| ≤ + |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + rw [hdecomp] + calc + |cubeAverage Q f * cubeAverage Q g + Finset.sum (Finset.range (N + 1)) T| + ≤ |cubeAverage Q f * cubeAverage Q g| + + |Finset.sum (Finset.range (N + 1)) T| := by + exact abs_add_le _ _ + _ ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := by + simpa using add_le_add_left + (Finset.abs_sum_le_sum_abs T (Finset.range (N + 1))) + (|cubeAverage Q f * cubeAverage Q g|) + calc + |cubeBesovPairing Q f (cubeProjection Q (N + 1) g)| + ≤ |cubeAverage Q f * cubeAverage Q g| + + Finset.sum (Finset.range (N + 1)) (fun j => |T j|) := habs + _ ≤ M * C + K * S * C := add_le_add hmean_le hsum_le + _ = (M + K * S) * C := by ring + _ ≤ (K * (M + S)) * C := by + refine mul_le_mul_of_nonneg_right ?_ hC_nonneg + calc + M + K * S ≤ K * M + K * S := by + exact add_le_add + (by + simpa [one_mul] using + (mul_le_mul_of_nonneg_right hK_ge_one hM_nonneg)) + le_rfl + _ = K * (M + S) := by ring + _ = K * cubeBesovPartialNorm Q s p 1 N f * C := by + unfold M S cubeBesovPartialNorm + ring + _ = max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s p 1 N f * + cubeBesovCircPartialNormTop Q s (cubeBesovConjExponent p) (N + 1) g := by + rfl + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Projections.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Projections.lean new file mode 100644 index 0000000000..4728798562 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectedPairing/Projections.lean @@ -0,0 +1,268 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Definitions + +/-! # Projections -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeProjection_one_memLp {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (g : Vec d → ℝ) : + MeasureTheory.MemLp (cubeProjection Q 1 g) p (normalizedCubeMeasure Q) := by + classical + unfold cubeProjection + rw [descendantsAtDepth_one] + refine MeasureTheory.memLp_finsetSum + (s := childCubes Q) + (f := fun R : TriadicCube d => fun x : Vec d => + if x ∈ cubeSet R then cubeAverage R g else 0) ?_ + intro R hR + have hR_ne_top : normalizedCubeMeasure Q (cubeSet R) ≠ ∞ := by + have hR_le : normalizedCubeMeasure Q (cubeSet R) ≤ normalizedCubeMeasure Q Set.univ := + MeasureTheory.measure_mono (Set.subset_univ (cubeSet R)) + have hUniv_lt : normalizedCubeMeasure Q Set.univ < ∞ := by simp + exact ne_of_lt (lt_of_le_of_lt hR_le hUniv_lt) + simpa [Set.indicator] using! + (MeasureTheory.memLp_indicator_const (μ := normalizedCubeMeasure Q) + (p := p) (s := cubeSet R) (hs := measurableSet_cubeSet R) + (c := cubeAverage R g) (Or.inr hR_ne_top)) + +theorem cubeProjection_succ_ae_eq_cubeProjection_one_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeProjection Q (j + 1) g =ᵐ[normalizedCubeMeasure R] cubeProjection R 1 g := by + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet R)).2 <| + Filter.Eventually.of_forall fun x hx => by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := R) (n := 1) hx with + ⟨S, hS, hxS⟩ + have hSQ : S ∈ descendantsAtDepth Q (j + 1) := by + exact (mem_descendantsAtDepth_succ_iff).2 + ⟨R, hR, by simpa [descendantsAtDepth_one] using hS⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := S) (j := j + 1) g hSQ hxS, + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := R) (R := S) (j := 1) g hS hxS]) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + +theorem cubeProjection_succ_memLp_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (g : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) p (normalizedCubeMeasure R) := by + have hone : MeasureTheory.MemLp (cubeProjection R 1 g) p (normalizedCubeMeasure R) := + cubeProjection_one_memLp R p g + have hEq : + cubeProjection Q (j + 1) g =ᵐ[normalizedCubeMeasure R] cubeProjection R 1 g := + cubeProjection_succ_ae_eq_cubeProjection_one_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR + have hproj_meas : + MeasureTheory.AEStronglyMeasurable (cubeProjection Q (j + 1) g) + (normalizedCubeMeasure R) := + hone.aestronglyMeasurable.congr hEq.symm + refine hone.congr_norm hproj_meas ?_ + filter_upwards [hEq] with x hx + simpa using congrArg abs hx.symm + +theorem descendantsAverage_cubeLpNorm_projection_succ_eq_cubeBesovCircDepthAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (g : Vec d → ℝ) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) + (hg : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) p (normalizedCubeMeasure R)) : + descendantsAverage Q j (fun R => + (cubeLpNorm R p (cubeProjection Q (j + 1) g)) ^ p.toReal) = + cubeBesovCircDepthAverage Q p g (j + 1) := by + classical + have hlocal : + ∀ R ∈ descendantsAtDepth Q j, + (cubeLpNorm R p (cubeProjection Q (j + 1) g)) ^ p.toReal = + descendantsAverage R 1 (fun S => ‖cubeAverage S g‖ ^ p.toReal) := by + intro R hR + have hnorm_int_norm : + MeasureTheory.Integrable (fun x => ‖cubeProjection Q (j + 1) g x‖ ^ p.toReal) + (normalizedCubeMeasure R) := + (hg R hR).integrable_norm_rpow hp0 hpTop + have hscale_ne_zero : ENNReal.ofReal ((cubeVolume R)⁻¹) ≠ 0 := by + have hscale_pos : 0 < ENNReal.ofReal ((cubeVolume R)⁻¹) := by + exact ENNReal.ofReal_pos.mpr (inv_pos.mpr (cubeVolume_pos R)) + exact hscale_pos.ne' + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖cubeProjection Q (j + 1) g x‖ ^ p.toReal) + (cubeSet R) MeasureTheory.volume := by + unfold MeasureTheory.IntegrableOn at hnorm_int_norm ⊢ + rw [normalizedCubeMeasure, cubeMeasure] at hnorm_int_norm + exact (MeasureTheory.integrable_smul_measure + (μ := MeasureTheory.volume.restrict (cubeSet R)) hscale_ne_zero ENNReal.ofReal_ne_top).1 + hnorm_int_norm + rw [cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := R) (p := p) + (f := cubeProjection Q (j + 1) g) hp0 hpTop (hg R hR)] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := R) (j := 1) (f := fun x => ‖cubeProjection Q (j + 1) g x‖ ^ p.toReal) hnorm_int] + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth R 1).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro S hS + have hcongr : + cubeAverage S (fun x => ‖cubeProjection Q (j + 1) g x‖ ^ p.toReal) = + cubeAverage S (fun _ => ‖cubeAverage S g‖ ^ p.toReal) := by + apply (cubeAverage_congr_on_cubeSet (Q := S)) + intro x hxS + have hSQ : S ∈ descendantsAtDepth Q (j + 1) := by + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨R, hR, by simpa [descendantsAtDepth_one] using hS⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := S) (j := j + 1) g hSQ hxS] + rw [hcongr, cubeAverage_const] + calc + descendantsAverage Q j (fun R => + (cubeLpNorm R p (cubeProjection Q (j + 1) g)) ^ p.toReal) + = descendantsAverage Q j (fun R => + descendantsAverage R 1 (fun S => ‖cubeAverage S g‖ ^ p.toReal)) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [hlocal R hR] + rfl + _ = descendantsAverage Q (j + 1) (fun S => ‖cubeAverage S g‖ ^ p.toReal) := by + rw [descendantsAverage_succ_eq_descendantsAverage_descendantsAverage] + _ = cubeBesovCircDepthAverage Q p g (j + 1) := by + rfl + +theorem abs_cubeAverage_mul_projection_succ_projectionResidual_le_mul_cubeBesovCircDepthAverage + {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) (j : ℕ) + (hp : 1 ≤ p) (_hp0 : p ≠ 0) (hpTop : p ≠ ∞) + (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hf : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R f) p (normalizedCubeMeasure R)) + (hg : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) g) + (cubeBesovConjExponent p) (normalizedCubeMeasure R)) : + |cubeAverage Q (fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x)| ≤ + (cubeBesovCircDepthAverage Q (cubeBesovConjExponent p) g (j + 1)) ^ + (1 / (cubeBesovConjExponent p).toReal) * + (cubeBesovDepthAverage Q p f j) ^ (1 / p.toReal) := by + classical + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := + by simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + let : ENNReal.HolderConjugate q p := inferInstance + have hq : 1 ≤ q := ENNReal.HolderConjugate.one_le (p := q) (q := p) + have hqTop : q ≠ ∞ := by + simpa [q] using hpConjTop + have hp_ne_one : p ≠ 1 := by + exact (ENNReal.HolderConjugate.ne_top_iff_ne_one (p := q) (q := p)).1 hqTop + have hp_toReal_ge : 1 ≤ p.toReal := by + simpa using ENNReal.toReal_mono hpTop hp + have hp_toReal_ne_one : p.toReal ≠ 1 := by + intro h + exact hp_ne_one ((ENNReal.toReal_eq_one_iff p).mp h) + have hp_toReal_gt : 1 < p.toReal := lt_of_le_of_ne hp_toReal_ge (Ne.symm hp_toReal_ne_one) + have hdisc : Real.HolderConjugate q.toReal p.toReal := + (ENNReal.HolderConjugate.toReal (p := p) (q := q) hp_toReal_gt).symm + have hconj_q : ENNReal.conjExponent q = p := by + simpa using (ENNReal.HolderConjugate.conjExponent_eq (p := q) (q := p)) + let h : Vec d → ℝ := + fun x => cubeProjection Q (j + 1) g x * cubeProjectionResidual Q j f x + have hint_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn h (cubeSet R) MeasureTheory.volume := by + intro R hR + have hres : + MeasureTheory.MemLp (cubeProjectionResidual Q j f) p (normalizedCubeMeasure R) := + cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (u := f) hR (hf R hR) + have hprod_norm : + MeasureTheory.Integrable h (normalizedCubeMeasure R) := by + simpa [h, q] using! (hg R hR).integrable_mul hres + have hscale_ne_zero : ENNReal.ofReal ((cubeVolume R)⁻¹) ≠ 0 := by + have hscale_pos : 0 < ENNReal.ofReal ((cubeVolume R)⁻¹) := by + exact ENNReal.ofReal_pos.mpr (inv_pos.mpr (cubeVolume_pos R)) + exact hscale_pos.ne' + unfold MeasureTheory.IntegrableOn + rw [normalizedCubeMeasure, cubeMeasure] at hprod_norm + exact (MeasureTheory.integrable_smul_measure + (μ := MeasureTheory.volume.restrict (cubeSet R)) hscale_ne_zero ENNReal.ofReal_ne_top).1 + hprod_norm + have hint : + MeasureTheory.IntegrableOn h (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := h) (μ := MeasureTheory.volume) (s := descendantsAtDepth Q j) (t := cubeSet)).2 + hint_local + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn (Q := Q) (j := j) (f := h) hint] + have habs : + |descendantsAverage Q j (fun R => cubeAverage R h)| ≤ + descendantsAverage Q j (fun R => |cubeAverage R h|) := by + unfold descendantsAverage + have hcard_nonneg : 0 ≤ (((descendantsAtDepth Q j).card : ℝ)⁻¹) := by positivity + calc + |((↑(descendantsAtDepth Q j).card)⁻¹ * ∑ R ∈ descendantsAtDepth Q j, cubeAverage R h)| + = ((↑(descendantsAtDepth Q j).card)⁻¹) * + |∑ R ∈ descendantsAtDepth Q j, cubeAverage R h| := by + rw [abs_mul, abs_of_nonneg hcard_nonneg] + _ ≤ ((↑(descendantsAtDepth Q j).card)⁻¹) * + ∑ R ∈ descendantsAtDepth Q j, |cubeAverage R h| := by + exact mul_le_mul_of_nonneg_left (Finset.abs_sum_le_sum_abs _ _) hcard_nonneg + _ = descendantsAverage Q j (fun R => |cubeAverage R h|) := by + rfl + refine le_trans habs ?_ + have hlocal : + ∀ R ∈ descendantsAtDepth Q j, + |cubeAverage R h| ≤ + cubeLpNorm R q (cubeProjection Q (j + 1) g) * cubeBesovOscillation R p f := by + intro R hR + have hf' : MeasureTheory.MemLp (cubeFluctuation R f) (ENNReal.conjExponent q) + (normalizedCubeMeasure R) := by + simpa [hconj_q] using hf R hR + have hlocal' : + |cubeAverage R h| ≤ + cubeLpNorm R q (cubeProjection Q (j + 1) g) * + cubeBesovOscillation R (ENNReal.conjExponent q) f := by + simpa [h, q] using + (abs_cubeAverage_mul_cubeProjectionResidual_le_mul_cubeLpNorm_cubeBesovOscillation_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := q) (f := cubeProjection Q (j + 1) g) (u := f) + hR (hg R hR) hf' hq) + simpa [hconj_q] using hlocal' + have hpointwise : + descendantsAverage Q j (fun R => |cubeAverage R h|) ≤ + descendantsAverage Q j (fun R => + cubeLpNorm R q (cubeProjection Q (j + 1) g) * cubeBesovOscillation R p f) := by + unfold descendantsAverage + have hcard_nonneg : 0 ≤ (((descendantsAtDepth Q j).card : ℝ)⁻¹) := by positivity + exact mul_le_mul_of_nonneg_left + (Finset.sum_le_sum fun R hR => hlocal R hR) hcard_nonneg + refine le_trans hpointwise ?_ + have hholder := + descendantsAverage_mul_le_Lp_mul_Lq_of_nonneg + (Q := Q) (j := j) + (A := fun R => cubeLpNorm R q (cubeProjection Q (j + 1) g)) + (B := fun R => cubeBesovOscillation R p f) + hdisc + (fun R hR => cubeLpNorm_nonneg R q (cubeProjection Q (j + 1) g)) + (fun R hR => cubeBesovOscillation_nonneg R p f) + refine le_trans hholder ?_ + have hcirc : + descendantsAverage Q j (fun R => + (cubeLpNorm R q (cubeProjection Q (j + 1) g)) ^ q.toReal) = + cubeBesovCircDepthAverage Q q g (j + 1) := by + refine descendantsAverage_cubeLpNorm_projection_succ_eq_cubeBesovCircDepthAverage + (Q := Q) (p := q) (g := g) (j := j) (hp0 := cubeBesovConjExponent_ne_zero p) + (hpTop := hqTop) ?_ + intro R hR + simpa [q] using hg R hR + rw [hcirc, cubeBesovDepthAverage] + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectionLimit.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectionLimit.lean new file mode 100644 index 0000000000..2018df1363 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/ProjectionLimit.lean @@ -0,0 +1,582 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.WrapperComparison +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionConvergence +public import Mathlib.MeasureTheory.Function.ContinuousMapDense +public import Mathlib.MeasureTheory.Integral.DominatedConvergence +public import Mathlib.MeasureTheory.Measure.MeasureSpace +public import Mathlib.Order.Filter.AtTopBot.Basic + +/-! # Projection Limit -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +theorem integrableOn_cubeProjection_of_integrableOn {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (g : Vec d → ℝ) : + MeasureTheory.IntegrableOn (cubeProjection Q j g) (cubeSet Q) MeasureTheory.volume := by + have hlocal : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn (cubeProjection Q j g) (cubeSet R) MeasureTheory.volume := by + intro R hR + have hvol_ne_top : MeasureTheory.volume (cubeSet R) ≠ ∞ := by + intro htop + have hreal : (MeasureTheory.volume (cubeSet R)).toReal = cubeVolume R := + volume_cubeSet_toReal R + rw [htop] at hreal + simp at hreal + exact (cubeVolume_pos R).ne' hreal.symm + have hconst : + MeasureTheory.IntegrableOn (fun _ : Vec d => cubeAverage R g) (cubeSet R) + MeasureTheory.volume := by + exact MeasureTheory.integrableOn_const + (μ := MeasureTheory.volume) (s := cubeSet R) (C := cubeAverage R g) hvol_ne_top + refine hconst.congr_fun ?_ (measurableSet_cubeSet R) + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR hx] + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := cubeProjection Q j g) (μ := MeasureTheory.volume) + (s := descendantsAtDepth Q j) (t := cubeSet)).2 hlocal + +theorem cubeProjection_abs_le_of_abs_le_on_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (g : Vec d → ℝ) (C : ℝ) + (hbound : ∀ x ∈ cubeSet Q, |g x| ≤ C) : + ∀ x ∈ cubeSet Q, |cubeProjection Q j g x| ≤ C := by + intro x hx + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := Q) (n := j) hx with ⟨R, hR, hxR⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth (Q := Q) (R := R) (j := j) g hR hxR] + let μR : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (cubeSet R) + let : MeasureTheory.IsFiniteMeasure μR := by + refine ⟨by + simpa [μR] using lt_top_iff_ne_top.mpr (by + intro htop + have hreal : (MeasureTheory.volume (cubeSet R)).toReal = cubeVolume R := + volume_cubeSet_toReal R + rw [htop] at hreal + simp at hreal + exact (cubeVolume_pos R).ne' hreal.symm)⟩ + have hboundR : + ∀ᵐ y ∂μR, ‖g y‖ ≤ C := by + refine (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet R)).2 ?_ + exact Filter.Eventually.of_forall fun y hy => + hbound y (cubeSet_subset_of_mem_descendantsAtDepth hR hy) + have havg : + ‖∫ y, g y ∂ μR‖ ≤ C * μR.real Set.univ := + MeasureTheory.norm_integral_le_of_norm_le_const hboundR + have havg' : |∫ y, g y ∂ μR| ≤ C * cubeVolume R := by + simpa [μR, MeasureTheory.measureReal_def] using havg + rw [cubeAverage] + have hvol_inv_nonneg : 0 ≤ (cubeVolume R)⁻¹ := by + exact inv_nonneg.mpr (cubeVolume_nonneg R) + calc + |(cubeVolume R)⁻¹ * ∫ y, g y ∂ μR| + = (cubeVolume R)⁻¹ * |∫ y, g y ∂ μR| := by + rw [abs_mul, abs_of_nonneg hvol_inv_nonneg] + _ ≤ (cubeVolume R)⁻¹ * (C * cubeVolume R) := by + exact mul_le_mul_of_nonneg_left havg' hvol_inv_nonneg + _ = C := by + field_simp [(cubeVolume_pos R).ne'] + +theorem cubeBesovPairing_projection_comm {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u g : Vec d → ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) : + cubeBesovPairing Q (cubeProjection Q j u) g = + cubeBesovPairing Q u (cubeProjection Q j g) := by + let hleft : Vec d → ℝ := fun x => cubeProjection Q j u x * g x + let hright : Vec d → ℝ := fun x => u x * cubeProjection Q j g x + have hleft_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn hleft (cubeSet R) MeasureTheory.volume := by + intro R hR + have hgIntR : + MeasureTheory.IntegrableOn g (cubeSet R) MeasureTheory.volume := + hgInt.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hconst : + MeasureTheory.IntegrableOn (fun x => cubeAverage R u * g x) (cubeSet R) + MeasureTheory.volume := by + simpa [mul_comm] using! hgIntR.const_mul (cubeAverage R u) + refine hconst.congr_fun ?_ (measurableSet_cubeSet R) + intro x hx + simp [hleft, cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR hx] + have hright_local : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn hright (cubeSet R) MeasureTheory.volume := by + intro R hR + have huIntR : + MeasureTheory.IntegrableOn u (cubeSet R) MeasureTheory.volume := + huInt.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hconst : + MeasureTheory.IntegrableOn (fun x => u x * cubeAverage R g) (cubeSet R) + MeasureTheory.volume := by + exact huIntR.mul_const (cubeAverage R g) + refine hconst.congr_fun ?_ (measurableSet_cubeSet R) + intro x hx + simp [hright, cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR hx] + have hleft_int : + MeasureTheory.IntegrableOn hleft (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := hleft) (μ := MeasureTheory.volume) + (s := descendantsAtDepth Q j) (t := cubeSet)).2 hleft_local + have hright_int : + MeasureTheory.IntegrableOn hright (cubeSet Q) MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact (MeasureTheory.integrableOn_finset_iUnion + (f := hright) (μ := MeasureTheory.volume) + (s := descendantsAtDepth Q j) (t := cubeSet)).2 hright_local + unfold cubeBesovPairing + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => cubeProjection Q j u x * g x) hleft_int] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => u x * cubeProjection Q j g x) hright_int] + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hleft_avg : + cubeAverage R (fun x => cubeProjection Q j u x * g x) = + cubeAverage R u * cubeAverage R g := by + have hcongr : + cubeAverage R (fun x => cubeProjection Q j u x * g x) = + cubeAverage R (fun x => cubeAverage R u * g x) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + simp [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR hx] + rw [hcongr, cubeAverage_eq_integral_normalizedCubeMeasure, + MeasureTheory.integral_const_mul, ← cubeAverage_eq_integral_normalizedCubeMeasure] + have hright_avg : + cubeAverage R (fun x => u x * cubeProjection Q j g x) = + cubeAverage R u * cubeAverage R g := by + have hcongr : + cubeAverage R (fun x => u x * cubeProjection Q j g x) = + cubeAverage R (fun x => u x * cubeAverage R g) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + simp [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) g hR hx] + rw [hcongr, cubeAverage_eq_integral_normalizedCubeMeasure, + MeasureTheory.integral_mul_const, ← cubeAverage_eq_integral_normalizedCubeMeasure] + rw [hleft_avg, hright_avg] + +theorem tendsto_cubeBesovPairing_projection_right_of_integrableOn_of_bounded {d : ℕ} + (Q : TriadicCube d) (u g : Vec d → ℝ) (C : ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hC : 0 ≤ C) + (hbound : ∀ x ∈ cubeSet Q, |g x| ≤ C) : + Filter.Tendsto (fun n => cubeBesovPairing Q u (cubeProjection Q (n + 1) g)) + Filter.atTop (𝓝 (cubeBesovPairing Q u g)) := by + let μQ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (cubeSet Q) + let F : ℕ → Vec d → ℝ := fun n x => u x * cubeProjection Q (n + 1) g x + let bound : Vec d → ℝ := fun x => |u x| * C + have hC_nonneg : 0 ≤ C := hC + have hprojInt : + ∀ n, MeasureTheory.IntegrableOn (cubeProjection Q (n + 1) g) (cubeSet Q) + MeasureTheory.volume := by + intro n + exact integrableOn_cubeProjection_of_integrableOn Q (n + 1) g + have hF_meas : ∀ n, MeasureTheory.AEStronglyMeasurable (F n) μQ := by + intro n + exact (huInt.aestronglyMeasurable.mul (hprojInt n).aestronglyMeasurable) + have hbound_int : MeasureTheory.Integrable bound μQ := by + simpa [bound, Real.norm_eq_abs, mul_comm, mul_left_comm, mul_assoc] + using huInt.norm.const_mul C + have hF_bound : ∀ n, ∀ᵐ x ∂μQ, ‖F n x‖ ≤ bound x := by + intro n + refine (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro x hx + have hproj : + |cubeProjection Q (n + 1) g x| ≤ C := + cubeProjection_abs_le_of_abs_le_on_cubeSet Q (n + 1) g C hbound x hx + simpa [F, bound, abs_mul, Real.norm_eq_abs, abs_of_nonneg hC_nonneg, mul_comm, mul_left_comm, + mul_assoc] using mul_le_mul_of_nonneg_left hproj (abs_nonneg (u x)) + have hF_lim : + ∀ᵐ x ∂μQ, Filter.Tendsto (fun n => F n x) Filter.atTop (𝓝 (u x * g x)) := by + filter_upwards [ae_tendsto_cubeProjection_of_integrableOn (Q := Q) (f := g) hgInt] with x hx + have hx' : + Filter.Tendsto (fun n => cubeProjection Q (n + 1) g x) Filter.atTop (𝓝 (g x)) := + hx.comp (Filter.tendsto_add_atTop_nat 1) + exact tendsto_const_nhds.mul hx' + have hInt : + Filter.Tendsto (fun n => ∫ x, F n x ∂ μQ) Filter.atTop + (𝓝 (∫ x, u x * g x ∂ μQ)) := + MeasureTheory.tendsto_integral_of_dominated_convergence bound hF_meas hbound_int hF_bound hF_lim + simpa [cubeBesovPairing, cubeAverage, μQ, F] using + hInt.const_mul ((cubeVolume Q)⁻¹) + +theorem tendsto_cubeBesovPairing_projection_left_of_integrableOn_of_bounded {d : ℕ} + (Q : TriadicCube d) (u g : Vec d → ℝ) (C : ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hgInt : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hC : 0 ≤ C) + (hbound : ∀ x ∈ cubeSet Q, |g x| ≤ C) : + Filter.Tendsto (fun n => cubeBesovPairing Q (cubeProjection Q (n + 1) u) g) + Filter.atTop (𝓝 (cubeBesovPairing Q u g)) := by + have hcomm : + ∀ n, cubeBesovPairing Q (cubeProjection Q (n + 1) u) g = + cubeBesovPairing Q u (cubeProjection Q (n + 1) g) := by + intro n + exact cubeBesovPairing_projection_comm Q (n + 1) u g huInt hgInt + have hright := + tendsto_cubeBesovPairing_projection_right_of_integrableOn_of_bounded + Q u g C huInt hgInt hC hbound + convert hright using 1 + ext n + exact hcomm n + +theorem normalizedCubeMeasure_descendant_eq_smul_restrict {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + normalizedCubeMeasure R = + ENNReal.ofReal (cubeVolume Q / cubeVolume R) • + (normalizedCubeMeasure Q).restrict (cubeSet R) := by + ext s hs + have hQ : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + have hRvol : cubeVolume R ≠ 0 := (cubeVolume_pos R).ne' + have hsubset : cubeSet R ⊆ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hR + have hinter : + (s ∩ cubeSet R) ∩ cubeSet Q = s ∩ cubeSet R := by + ext x + constructor + · intro hx + exact hx.1 + · intro hx + exact ⟨hx, hsubset hx.2⟩ + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply] + rw [cubeMeasure, MeasureTheory.Measure.restrict_apply hs] + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.restrict_apply hs] + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply] + change ENNReal.ofReal ((cubeVolume R)⁻¹) * MeasureTheory.volume (s ∩ cubeSet R) = + ENNReal.ofReal (cubeVolume Q / cubeVolume R) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * cubeMeasure Q (s ∩ cubeSet R)) + rw [cubeMeasure, MeasureTheory.Measure.restrict_apply (hs.inter (measurableSet_cubeSet R)), hinter] + have hfactor : + ENNReal.ofReal ((cubeVolume R)⁻¹) = + ENNReal.ofReal (cubeVolume Q / cubeVolume R) * + ENNReal.ofReal ((cubeVolume Q)⁻¹) := by + have hdiv_nonneg : 0 ≤ cubeVolume Q / cubeVolume R := by + exact div_nonneg (cubeVolume_nonneg Q) (cubeVolume_nonneg R) + rw [← ENNReal.ofReal_mul hdiv_nonneg] + congr 1 + field_simp [hQ, hRvol] + rw [hfactor, ← mul_assoc] + +theorem memLp_on_descendant_of_memLp {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {p : ℝ≥0∞} {f : Vec d → ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedCubeMeasure R) := by + have hrestrict : + MeasureTheory.MemLp f p ((normalizedCubeMeasure Q).restrict (cubeSet R)) := + hf.restrict (cubeSet R) + have hle : + normalizedCubeMeasure R ≤ + ENNReal.ofReal (cubeVolume Q / cubeVolume R) • + ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + simp [normalizedCubeMeasure_descendant_eq_smul_restrict hR] + exact hrestrict.of_measure_le_smul ENNReal.ofReal_ne_top hle + +theorem cubeBesovCircDepthAverage_le_cubeLpNorm_rpow {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) : + cubeBesovCircDepthAverage Q p u j ≤ (cubeLpNorm Q p u) ^ p.toReal := by + classical + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := by + simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hq0 : q ≠ 0 := by + simpa [q] using cubeBesovConjExponent_ne_zero p + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖u x‖ ^ p.toReal) (cubeSet Q) + MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hu.integrable_norm_rpow hp0 hpTop) + calc + cubeBesovCircDepthAverage Q p u j + ≤ descendantsAverage Q j (fun R => (cubeLpNorm R p u) ^ p.toReal) := by + unfold cubeBesovCircDepthAverage descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · refine Finset.sum_le_sum ?_ + intro R hR + have huR : MeasureTheory.MemLp u p (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hu + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) q (normalizedCubeMeasure R) := + MeasureTheory.memLp_const (1 : ℝ) + have havg : + ‖cubeAverage R u‖ ≤ cubeLpNorm R p u * cubeLpNorm R q (fun _ => (1 : ℝ)) := by + simpa [q] using! + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + (Q := R) (p := p) (f := u) (g := fun _ => (1 : ℝ)) huR hconst hp + have hnorm_one : cubeLpNorm R q (fun _ => (1 : ℝ)) = 1 := by + simpa using cubeLpNorm_const (Q := R) (p := q) (c := (1 : ℝ)) hq0 + have havg' : ‖cubeAverage R u‖ ≤ cubeLpNorm R p u := by + simpa [hnorm_one] using havg + exact Real.rpow_le_rpow (norm_nonneg _) havg' ENNReal.toReal_nonneg + · positivity + _ = descendantsAverage Q j (fun R => cubeAverage R (fun x => ‖u x‖ ^ p.toReal)) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [← cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := R) (p := p) (f := u) hp0 hpTop] + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hu + _ = cubeAverage Q (fun x => ‖u x‖ ^ p.toReal) := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => ‖u x‖ ^ p.toReal) hnorm_int] + _ = (cubeLpNorm Q p u) ^ p.toReal := by + symm + rw [cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := Q) (p := p) (f := u) hp0 hpTop hu] + +theorem cubeProjection_memLp {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + MeasureTheory.MemLp (cubeProjection Q j u) p (normalizedCubeMeasure Q) := by + classical + unfold cubeProjection + refine MeasureTheory.memLp_finsetSum + (s := descendantsAtDepth Q j) + (f := fun R : TriadicCube d => fun x : Vec d => + if x ∈ cubeSet R then cubeAverage R u else 0) ?_ + intro R hR + have hR_ne_top : normalizedCubeMeasure Q (cubeSet R) ≠ ∞ := by + have hR_le : normalizedCubeMeasure Q (cubeSet R) ≤ normalizedCubeMeasure Q Set.univ := + MeasureTheory.measure_mono (Set.subset_univ (cubeSet R)) + have hUniv_lt : normalizedCubeMeasure Q Set.univ < ∞ := by simp + exact ne_of_lt (lt_of_le_of_lt hR_le hUniv_lt) + simpa [Set.indicator] using! + (MeasureTheory.memLp_indicator_const (μ := normalizedCubeMeasure Q) + (p := p) (s := cubeSet R) (hs := measurableSet_cubeSet R) + (c := cubeAverage R u) (Or.inr hR_ne_top)) + +theorem cubeLpNorm_rpow_cubeProjection_eq_cubeBesovCircDepthAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + (cubeLpNorm Q p (cubeProjection Q j u)) ^ p.toReal = + cubeBesovCircDepthAverage Q p u j := by + have hprojMem : + MeasureTheory.MemLp (cubeProjection Q j u) p (normalizedCubeMeasure Q) := + cubeProjection_memLp Q j p u + have hprojInt : + MeasureTheory.IntegrableOn (fun x => ‖cubeProjection Q j u x‖ ^ p.toReal) + (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hprojMem.integrable_norm_rpow hp0 hpTop) + rw [cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := p) (f := cubeProjection Q j u) hp0 hpTop hprojMem] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => ‖cubeProjection Q j u x‖ ^ p.toReal) hprojInt] + rw [cubeBesovCircDepthAverage_eq_descendantsAverage_projection + (Q := Q) (p := p) (u := u) (j := j) hp0] + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [← cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := R) (p := p) (f := cubeProjection Q j u) hp0 hpTop] + exact cubeProjection_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) p u hR + +theorem cubeLpNorm_cubeProjection_le {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) : + cubeLpNorm Q p (cubeProjection Q j u) ≤ cubeLpNorm Q p u := by + have hp0 : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hpReal_pos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hpow : + (cubeLpNorm Q p (cubeProjection Q j u)) ^ p.toReal ≤ + (cubeLpNorm Q p u) ^ p.toReal := by + rw [cubeLpNorm_rpow_cubeProjection_eq_cubeBesovCircDepthAverage + (Q := Q) (p := p) (u := u) (j := j) hp0 hpTop] + exact cubeBesovCircDepthAverage_le_cubeLpNorm_rpow Q p u j hp hpTop hu + calc + cubeLpNorm Q p (cubeProjection Q j u) + = ((cubeLpNorm Q p (cubeProjection Q j u)) ^ p.toReal) ^ (1 / p.toReal) := by + symm + rw [← Real.rpow_mul (cubeLpNorm_nonneg Q p (cubeProjection Q j u))] + field_simp [hpReal_pos.ne'] + rw [Real.rpow_one] + _ ≤ ((cubeLpNorm Q p u) ^ p.toReal) ^ (1 / p.toReal) := by + exact Real.rpow_le_rpow + (Real.rpow_nonneg (cubeLpNorm_nonneg Q p (cubeProjection Q j u)) _) + hpow + (show 0 ≤ 1 / p.toReal by positivity) + _ = cubeLpNorm Q p u := by + rw [← Real.rpow_mul (cubeLpNorm_nonneg Q p u)] + field_simp [hpReal_pos.ne'] + rw [Real.rpow_one] + +theorem cubeBesovPairing_sub_right_of_integrableOn {d : ℕ} + (Q : TriadicCube d) (f g h : Vec d → ℝ) + (hfg : MeasureTheory.IntegrableOn (fun x => f x * g x) (cubeSet Q) MeasureTheory.volume) + (hfh : MeasureTheory.IntegrableOn (fun x => f x * h x) (cubeSet Q) MeasureTheory.volume) : + cubeBesovPairing Q f (fun x => g x - h x) = + cubeBesovPairing Q f g - cubeBesovPairing Q f h := by + unfold cubeBesovPairing cubeAverage + rw [show (fun x => f x * (g x - h x)) = fun x => f x * g x - f x * h x by + funext x + ring] + rw [MeasureTheory.integral_sub hfg hfh] + ring + +theorem tendsto_cubeBesovPairing_projection_left_of_memLp {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u g : Vec d → ℝ) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (cubeBesovConjExponent p) (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) : + Filter.Tendsto (fun n => cubeBesovPairing Q (cubeProjection Q (n + 1) u) g) + Filter.atTop (𝓝 (cubeBesovPairing Q u g)) := by + let q : ℝ≥0∞ := cubeBesovConjExponent p + let : ENNReal.HolderConjugate p q := by + simpa [q, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + have hq : 1 ≤ q := by + simpa [q] using (ENNReal.HolderConjugate.one_le (p := q) (q := p)) + have huInt : + MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hu.integrable hp) + rw [Metric.tendsto_atTop] + intro ε hε + let M : ℝ := cubeLpNorm Q p u + 1 + let δ : ℝ := ε / (4 * M) + have hM_pos : 0 < M := by + unfold M + linarith [cubeLpNorm_nonneg Q p u] + have hδ_pos : 0 < δ := by + unfold δ + positivity + have hδ_nonneg : 0 ≤ δ := le_of_lt hδ_pos + have hM_ge : cubeLpNorm Q p u ≤ M := by + unfold M + linarith [cubeLpNorm_nonneg Q p u] + have hMδ : M * δ = ε / 4 := by + unfold δ + field_simp [hM_pos.ne'] + obtain ⟨h, happrox, hmem⟩ := + MeasureTheory.MemLp.exists_boundedContinuous_eLpNorm_sub_le + (μ := normalizedCubeMeasure Q) (p := q) (f := g) hpConjTop hg + (ε := ENNReal.ofReal δ) (ENNReal.ofReal_ne_zero_iff.mpr hδ_pos) + have hdiffMem : + MeasureTheory.MemLp (fun x => g x - h x) q (normalizedCubeMeasure Q) := + hg.sub hmem + have hdiffNorm : cubeLpNorm Q q (fun x => g x - h x) ≤ δ := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q q _ hdiffMem.aestronglyMeasurable] + change (MeasureTheory.eLpNorm (g - ⇑h) q (normalizedCubeMeasure Q)).toReal ≤ δ + calc + (MeasureTheory.eLpNorm (g - ⇑h) q (normalizedCubeMeasure Q)).toReal + ≤ (ENNReal.ofReal δ).toReal := + ENNReal.toReal_mono ENNReal.ofReal_ne_top happrox + _ = δ := by + simp [le_of_lt hδ_pos] + have hhInt : + MeasureTheory.IntegrableOn (h : Vec d → ℝ) (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hmem.integrable hq) + have hbound : ∀ x ∈ cubeSet Q, |h x| ≤ ‖h‖ := by + intro x _hx + simpa [Real.norm_eq_abs] using h.norm_coe_le_norm x + have hconv := + tendsto_cubeBesovPairing_projection_left_of_integrableOn_of_bounded + Q u h ‖h‖ huInt hhInt (norm_nonneg _) hbound + rw [Metric.tendsto_atTop] at hconv + obtain ⟨N, hN⟩ := hconv (ε / 2) (by positivity) + refine ⟨N, ?_⟩ + intro n hn + have hprojMem : + MeasureTheory.MemLp (cubeProjection Q (n + 1) u) p (normalizedCubeMeasure Q) := + cubeProjection_memLp Q (n + 1) p u + have hprojNorm : + cubeLpNorm Q p (cubeProjection Q (n + 1) u) ≤ cubeLpNorm Q p u := by + exact cubeLpNorm_cubeProjection_le Q p u (n + 1) hp hpTop hu + have hproj_nonneg : 0 ≤ cubeLpNorm Q p (cubeProjection Q (n + 1) u) := + cubeLpNorm_nonneg Q p (cubeProjection Q (n + 1) u) + have hdiff_nonneg : 0 ≤ cubeLpNorm Q q (fun x => g x - h x) := + cubeLpNorm_nonneg Q q (fun x => g x - h x) + have hprojSub : + cubeBesovPairing Q (cubeProjection Q (n + 1) u) (fun x => g x - h x) = + cubeBesovPairing Q (cubeProjection Q (n + 1) u) g - + cubeBesovPairing Q (cubeProjection Q (n + 1) u) h := by + apply cubeBesovPairing_sub_right_of_integrableOn + · exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hprojMem.integrable_mul hg) + · exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hprojMem.integrable_mul hmem) + have huSub : + cubeBesovPairing Q u (fun x => g x - h x) = + cubeBesovPairing Q u g - cubeBesovPairing Q u h := by + apply cubeBesovPairing_sub_right_of_integrableOn + · exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hu.integrable_mul hg) + · exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hu.integrable_mul hmem) + have hprojErr : + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) g - + cubeBesovPairing Q (cubeProjection Q (n + 1) u) h| ≤ ε / 4 := by + rw [← hprojSub] + calc + |cubeBesovPairing Q (cubeProjection Q (n + 1) u) (fun x => g x - h x)| + ≤ cubeLpNorm Q p (cubeProjection Q (n + 1) u) * + cubeLpNorm Q q (fun x => g x - h x) := by + simpa [q] using + abs_cubeBesovPairing_le_mul_cubeLpNorm_conjExponent + Q p (cubeProjection Q (n + 1) u) (fun x => g x - h x) + hprojMem hdiffMem hp + _ ≤ cubeLpNorm Q p u * δ := by + exact mul_le_mul hprojNorm hdiffNorm hdiff_nonneg (cubeLpNorm_nonneg Q p u) + _ ≤ M * δ := by + exact mul_le_mul_of_nonneg_right hM_ge hδ_nonneg + _ = ε / 4 := by + exact hMδ + have huErr : + |cubeBesovPairing Q u g - cubeBesovPairing Q u h| ≤ ε / 4 := by + rw [← huSub] + calc + |cubeBesovPairing Q u (fun x => g x - h x)| + ≤ cubeLpNorm Q p u * cubeLpNorm Q q (fun x => g x - h x) := by + simpa [q] using + abs_cubeBesovPairing_le_mul_cubeLpNorm_conjExponent + Q p u (fun x => g x - h x) hu hdiffMem hp + _ ≤ cubeLpNorm Q p u * δ := by + exact mul_le_mul_of_nonneg_left hdiffNorm (cubeLpNorm_nonneg Q p u) + _ ≤ M * δ := by + exact mul_le_mul_of_nonneg_right hM_ge hδ_nonneg + _ = ε / 4 := by + exact hMδ + let A : ℝ := cubeBesovPairing Q (cubeProjection Q (n + 1) u) g + let B : ℝ := cubeBesovPairing Q (cubeProjection Q (n + 1) u) h + let C : ℝ := cubeBesovPairing Q u h + let D : ℝ := cubeBesovPairing Q u g + have hAD : |A - D| ≤ |A - B| + |B - D| := by + simpa [A, B, D, sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (abs_add_le (A - B) (B - D)) + have hBD : |B - D| ≤ |B - C| + |C - D| := by + simpa [B, C, D, sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (abs_add_le (B - C) (C - D)) + have hmid : |B - C| < ε / 2 := by + simpa [B, C] using! hN n hn + have huErr' : |C - D| ≤ ε / 4 := by + simpa [C, D, abs_sub_comm] using huErr + have hprojErr' : |A - B| ≤ ε / 4 := by + simpa [A, B] using hprojErr + have : |A - D| < ε := by + nlinarith [hAD, hBD, hmid, hprojErr', huErr'] + simpa [A, D] using! this + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Duality/WrapperComparison.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/WrapperComparison.lean new file mode 100644 index 0000000000..6ee1e667c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Duality/WrapperComparison.lean @@ -0,0 +1,367 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing + +/-! # Wrapper Comparison -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeBesovDualPartialNorm_projection_le_max_mul_cubeBesovCircPartialNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) (hqTop : q ≠ ∞) (hqConjTop : cubeBesovConjExponent q ≠ ∞) : + cubeBesovDualPartialNorm Q s p q N (cubeProjection Q (N + 1) u) ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let qConj : ℝ≥0∞ := cubeBesovConjExponent q + have hpHolder : ENNReal.HolderConjugate p pConj := by + simpa [pConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + let : ENNReal.HolderConjugate p pConj := hpHolder + let : ENNReal.HolderConjugate pConj p := inferInstance + have hqHolder : ENNReal.HolderConjugate q qConj := by + simpa [qConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hq + let : ENNReal.HolderConjugate q qConj := hqHolder + let : ENNReal.HolderConjugate qConj q := inferInstance + have hpConj : 1 ≤ pConj := by + simpa [pConj] using (ENNReal.HolderConjugate.one_le (p := pConj) (q := p)) + have hqConj : 1 ≤ qConj := by + simpa [qConj] using (ENNReal.HolderConjugate.one_le (p := qConj) (q := q)) + have hpConj0 : pConj ≠ 0 := by + simpa [pConj] using cubeBesovConjExponent_ne_zero p + have hqConj0 : qConj ≠ 0 := by + simpa [qConj] using cubeBesovConjExponent_ne_zero q + have hpDouble : cubeBesovConjExponent pConj = p := by + simpa [pConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := pConj) (q := p)) + have hqDouble : cubeBesovConjExponent qConj = q := by + simpa [qConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := qConj) (q := q)) + have hpDoubleTop : cubeBesovConjExponent pConj ≠ ∞ := by + simpa [hpDouble] using hpTop + have hqDoubleTop : cubeBesovConjExponent qConj ≠ ∞ := by + simpa [hqDouble] using hqTop + have hCirc_nonneg : 0 ≤ cubeBesovCircPartialNorm Q s p q (N + 1) u := by + exact cubeBesovCircPartialNorm_nonneg Q s p q (N + 1) u + have hK_nonneg : 0 ≤ max 1 ((3 : ℝ) ^ s) := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + unfold cubeBesovDualPartialNorm + refine csSup_le ?_ ?_ + · refine ⟨0, ?_⟩ + refine ⟨fun _ => (0 : ℝ), ?_, ?_⟩ + · refine ⟨?_, ?_⟩ + · rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N (fun _ => (0 : ℝ)) hqConjTop] + rw [cubeBesovPartialNorm_zero (Q := Q) (s := s) (p := pConj) (q := qConj) (N := N) + hpConj0 hpConjTop hqConj0 hqConjTop] + norm_num + · simpa using cubeBesovDualLocalMemLp_const Q p N (0 : ℝ) + · simp [cubeBesovPairing, cubeAverage_const] + · intro r hr + rcases hr with ⟨g, hg, rfl⟩ + have hgNorm : cubeBesovDualTestNorm Q s p q N g ≤ 1 := hg.norm_le_one + have hgMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) pConj (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [pConj] using hg.memLp_admissible j hj R hR + have huMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) u) + (cubeBesovConjExponent pConj) (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [hpDouble] using + cubeProjection_succ_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) p u hR + have hgPosNorm : + cubeBesovPartialNorm Q s pConj qConj N g ≤ 1 := by + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop] at hgNorm + simpa [pConj, qConj] using hgNorm + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + simpa [pConj, qConj, hpDouble, hqDouble] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := qConj) (f := g) (g := u) (N := N) + huInt hpConj hpConjTop hpDoubleTop hqConj hqConjTop hqDoubleTop hgMem huMem + calc + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| + = |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| := by + simp [cubeBesovPairing, mul_comm] + _ ≤ max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := hpair + _ ≤ (max 1 ((3 : ℝ) ^ s) * 1) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hgPosNorm hK_nonneg) hCirc_nonneg + _ = max 1 ((3 : ℝ) ^ s) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + ring + +theorem abs_cubeBesovPairing_projection_le_max_mul_cubeBesovCircPartialNorm_of_dual_test + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u g : Vec d → ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) (hqTop : q ≠ ∞) (hqConjTop : cubeBesovConjExponent q ≠ ∞) + (hg : CubeBesovDualTest Q s p q N g) : + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let qConj : ℝ≥0∞ := cubeBesovConjExponent q + have hpHolder : ENNReal.HolderConjugate p pConj := by + simpa [pConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + let : ENNReal.HolderConjugate p pConj := hpHolder + let : ENNReal.HolderConjugate pConj p := inferInstance + have hqHolder : ENNReal.HolderConjugate q qConj := by + simpa [qConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hq + let : ENNReal.HolderConjugate q qConj := hqHolder + let : ENNReal.HolderConjugate qConj q := inferInstance + have hpConj : 1 ≤ pConj := by + simpa [pConj] using (ENNReal.HolderConjugate.one_le (p := pConj) (q := p)) + have hqConj : 1 ≤ qConj := by + simpa [qConj] using (ENNReal.HolderConjugate.one_le (p := qConj) (q := q)) + have hpDouble : cubeBesovConjExponent pConj = p := by + simpa [pConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := pConj) (q := p)) + have hqDouble : cubeBesovConjExponent qConj = q := by + simpa [qConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := qConj) (q := q)) + have hpDoubleTop : cubeBesovConjExponent pConj ≠ ∞ := by + simpa [hpDouble] using hpTop + have hqDoubleTop : cubeBesovConjExponent qConj ≠ ∞ := by + simpa [hqDouble] using hqTop + have hCirc_nonneg : 0 ≤ cubeBesovCircPartialNorm Q s p q (N + 1) u := by + exact cubeBesovCircPartialNorm_nonneg Q s p q (N + 1) u + have hK_nonneg : 0 ≤ max 1 ((3 : ℝ) ^ s) := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + have hgNorm : cubeBesovDualTestNorm Q s p q N g ≤ 1 := hg.norm_le_one + have hgMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) pConj (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [pConj] using hg.memLp_admissible j hj R hR + have huMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) u) + (cubeBesovConjExponent pConj) (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [hpDouble] using + cubeProjection_succ_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) p u hR + have hgPosNorm : + cubeBesovPartialNorm Q s pConj qConj N g ≤ 1 := by + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop] at hgNorm + simpa [pConj, qConj] using hgNorm + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + simpa [pConj, qConj, hpDouble, hqDouble] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := qConj) (f := g) (g := u) (N := N) + huInt hpConj hpConjTop hpDoubleTop hqConj hqConjTop hqDoubleTop hgMem huMem + calc + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| + = |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| := by + simp [cubeBesovPairing, mul_comm] + _ ≤ max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := hpair + _ ≤ (max 1 ((3 : ℝ) ^ s) * 1) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hgPosNorm hK_nonneg) hCirc_nonneg + _ = max 1 ((3 : ℝ) ^ s) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + ring + +theorem abs_cubeBesovPairing_projection_le_max_mul_cubeBesovCircNormEntry_of_dual_test + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u g : Vec d → ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) (hg : CubeBesovDualTest Q s p q N g) : + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| ≤ + max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q N u := by + let pConj : ℝ≥0∞ := cubeBesovConjExponent p + let qConj : ℝ≥0∞ := cubeBesovConjExponent q + have hpHolder : ENNReal.HolderConjugate p pConj := by + simpa [pConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hp + let : ENNReal.HolderConjugate p pConj := hpHolder + let : ENNReal.HolderConjugate pConj p := inferInstance + have hqHolder : ENNReal.HolderConjugate q qConj := by + simpa [qConj, cubeBesovConjExponent] using ENNReal.HolderConjugate.conjExponent hq + let : ENNReal.HolderConjugate q qConj := hqHolder + let : ENNReal.HolderConjugate qConj q := inferInstance + have hpConj : 1 ≤ pConj := by + simpa [pConj] using (ENNReal.HolderConjugate.one_le (p := pConj) (q := p)) + have hpDouble : cubeBesovConjExponent pConj = p := by + simpa [pConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := pConj) (q := p)) + have hpDoubleTop : cubeBesovConjExponent pConj ≠ ∞ := by + simpa [hpDouble] using hpTop + have hK_nonneg : 0 ≤ max 1 ((3 : ℝ) ^ s) := by + exact le_trans (by norm_num) (le_max_left 1 ((3 : ℝ) ^ s)) + have hgNorm : cubeBesovDualTestNorm Q s p q N g ≤ 1 := hg.norm_le_one + have hgMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) pConj (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [pConj] using hg.memLp_admissible j hj R hR + have huMem : + ∀ j < N + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) u) + (cubeBesovConjExponent pConj) (normalizedCubeMeasure R) := by + intro j hj R hR + simpa [hpDouble] using + cubeProjection_succ_memLp_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) p u hR + by_cases hqTop : q = ∞ + · have hqConj_eq : qConj = 1 := by + exact (ENNReal.HolderConjugate.eq_top_iff_eq_one (p := q) (q := qConj)).1 hqTop + have hqConjTop : qConj ≠ ∞ := by + simp [hqConj_eq] + have hgPosNorm : + cubeBesovPartialNorm Q s pConj 1 N g ≤ 1 := by + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop] at hgNorm + simpa [pConj, qConj, hqConj_eq] using hgNorm + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj 1 N g * + cubeBesovCircPartialNormTop Q s p (N + 1) u := by + simpa [pConj, hpDouble] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormOne_cubeBesovCircPartialNormTop + (Q := Q) (s := s) (p := pConj) (f := g) (g := u) (N := N) + huInt hpConj hpConjTop hpDoubleTop hgMem huMem + have hCirc_nonneg : 0 ≤ cubeBesovCircNormEntry Q s p q N u := by + simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNormTop_nonneg Q s p (N + 1) u + calc + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| + = |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| := by + simp [cubeBesovPairing, mul_comm] + _ ≤ max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj 1 N g * + cubeBesovCircPartialNormTop Q s p (N + 1) u := hpair + _ ≤ (max 1 ((3 : ℝ) ^ s) * 1) * cubeBesovCircPartialNormTop Q s p (N + 1) u := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hgPosNorm hK_nonneg) + (cubeBesovCircPartialNormTop_nonneg Q s p (N + 1) u) + _ = max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q N u := by + simp [cubeBesovCircNormEntry, hqTop] + · by_cases hqConjTop : qConj = ∞ + · have hqOne : q = 1 := by + exact (ENNReal.HolderConjugate.eq_top_iff_eq_one (p := qConj) (q := q)).1 hqConjTop + have hgPosNorm : + cubeBesovPartialNormTop Q s pConj N g ≤ 1 := by + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s p q N g hqConjTop] at hgNorm + simpa [pConj] using hgNorm + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNormTop Q s pConj N g * + cubeBesovCircPartialNorm Q s p 1 (N + 1) u := by + simpa [pConj, hpDouble] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormTop_cubeBesovCircPartialNormOne + (Q := Q) (s := s) (p := pConj) (f := g) (g := u) (N := N) + huInt hpConj hpConjTop hpDoubleTop hgMem huMem + have hCirc_nonneg : 0 ≤ cubeBesovCircNormEntry Q s p q N u := by + simpa [cubeBesovCircNormEntry, hqTop, hqOne] using + cubeBesovCircPartialNorm_nonneg Q s p 1 (N + 1) u + calc + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| + = |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| := by + simp [cubeBesovPairing, mul_comm] + _ ≤ max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNormTop Q s pConj N g * + cubeBesovCircPartialNorm Q s p 1 (N + 1) u := hpair + _ ≤ (max 1 ((3 : ℝ) ^ s) * 1) * cubeBesovCircPartialNorm Q s p 1 (N + 1) u := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hgPosNorm hK_nonneg) + (cubeBesovCircPartialNorm_nonneg Q s p 1 (N + 1) u) + _ = max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q N u := by + simp [cubeBesovCircNormEntry, hqOne] + · have hqConj : 1 ≤ qConj := by + simpa [qConj] using (ENNReal.HolderConjugate.one_le (p := qConj) (q := q)) + have hqDouble : cubeBesovConjExponent qConj = q := by + simpa [qConj, cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := qConj) (q := q)) + have hqDoubleTop : cubeBesovConjExponent qConj ≠ ∞ := by + simpa [hqDouble] using hqTop + have hgPosNorm : + cubeBesovPartialNorm Q s pConj qConj N g ≤ 1 := by + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s p q N g hqConjTop] at hgNorm + simpa [pConj, qConj] using hgNorm + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + simpa [pConj, qConj, hpDouble, hqDouble] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + (Q := Q) (s := s) (p := pConj) (q := qConj) (f := g) (g := u) (N := N) + huInt hpConj hpConjTop hpDoubleTop hqConj hqConjTop hqDoubleTop hgMem huMem + have hCirc_nonneg : 0 ≤ cubeBesovCircNormEntry Q s p q N u := by + simpa [cubeBesovCircNormEntry, hqTop] using + cubeBesovCircPartialNorm_nonneg Q s p q (N + 1) u + calc + |cubeBesovPairing Q (cubeProjection Q (N + 1) u) g| + = |cubeBesovPairing Q g (cubeProjection Q (N + 1) u)| := by + simp [cubeBesovPairing, mul_comm] + _ ≤ max 1 ((3 : ℝ) ^ s) * + cubeBesovPartialNorm Q s pConj qConj N g * + cubeBesovCircPartialNorm Q s p q (N + 1) u := hpair + _ ≤ (max 1 ((3 : ℝ) ^ s) * 1) * cubeBesovCircPartialNorm Q s p q (N + 1) u := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hgPosNorm hK_nonneg) + (cubeBesovCircPartialNorm_nonneg Q s p q (N + 1) u) + _ = max 1 ((3 : ℝ) ^ s) * cubeBesovCircNormEntry Q s p q N u := by + simp [cubeBesovCircNormEntry, hqTop] + +theorem cubeBesovDualPartialSeminorm_projection_le_max_mul_cubeBesovCircPartialNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (huInt : MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) (hqTop : q ≠ ∞) (hqConjTop : cubeBesovConjExponent q ≠ ∞) : + cubeBesovDualPartialSeminorm Q s p q N (cubeProjection Q (N + 1) u) ≤ + max 1 ((3 : ℝ) ^ s) * + cubeBesovCircPartialNorm Q s p q (N + 1) u := by + have hpConj0 : cubeBesovConjExponent p ≠ 0 := cubeBesovConjExponent_ne_zero p + have hqConj0 : cubeBesovConjExponent q ≠ 0 := cubeBesovConjExponent_ne_zero q + unfold cubeBesovDualPartialSeminorm + refine csSup_le ?_ ?_ + · refine ⟨0, ?_⟩ + refine ⟨fun _ => (0 : ℝ), ?_, ?_⟩ + · refine ⟨?_, by simpa using cubeAverage_const Q (0 : ℝ), ?_⟩ + · rw [cubeBesovDualTestSeminorm_of_conjExponent_ne_top Q s p q N (fun _ => (0 : ℝ)) hqConjTop] + rw [cubeBesovPartialSeminorm_zero (Q := Q) (s := s) + (p := cubeBesovConjExponent p) (q := cubeBesovConjExponent q) (N := N) + hpConj0 hpConjTop hqConj0 hqConjTop] + norm_num + · simpa using cubeBesovDualLocalMemLp_const Q p N (0 : ℝ) + · simp [cubeBesovPairing, cubeAverage_const] + · intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact abs_cubeBesovPairing_projection_le_max_mul_cubeBesovCircPartialNorm_of_dual_test + (Q := Q) (s := s) (p := p) (q := q) (N := N) (u := u) (g := g) + huInt hp hpTop hpConjTop hq hqTop hqConjTop hg.to_dual_test + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Localization.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Localization.lean new file mode 100644 index 0000000000..74947d2fe1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Localization.lean @@ -0,0 +1,345 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization + +/-! # Localization -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped ENNReal + +/-! +Localization lemmas for the finite-depth cube Besov package. + +This first checkpoint records that the local positive-order quantities attached +to a parent cube `Q` only depend on the function on `cubeSet Q`. These +congruence lemmas are the clean API needed before later descendant-localized +and cutoff-localized estimates are added. +-/ + +theorem cubeAverage_congr_on_cubeSet {d : ℕ} {Q : TriadicCube d} {u v : Vec d → ℝ} + (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeAverage Q u = cubeAverage Q v := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + apply MeasureTheory.integral_congr_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall h + +theorem cubeLpNorm_congr_on_cubeSet {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + {u v : Vec d → ℝ} (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeLpNorm Q p u = cubeLpNorm Q p v := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae] + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall h) + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +theorem cubeProjection_congr_on_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) + {u v : Vec d → ℝ} (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeProjection Q j u = cubeProjection Q j v := by + funext x + by_cases hx : x ∈ cubeSet Q + · rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (n := j) hx with ⟨R, hR, hxR⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth u hR hxR, + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth v hR hxR] + apply cubeAverage_congr_on_cubeSet + intro y hy + exact h y (cubeSet_subset_of_mem_descendantsAtDepth hR hy) + · rw [cubeProjection_eq_zero_of_not_mem_cubeSet Q j u hx, + cubeProjection_eq_zero_of_not_mem_cubeSet Q j v hx] + +theorem cubeProjection_ae_eq_cubeProjection_depth_zero_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeProjection Q j f =ᵐ[normalizedCubeMeasure R] cubeProjection R 0 f := by + calc + cubeProjection Q j f =ᵐ[normalizedCubeMeasure R] fun _ => cubeAverage R f := by + exact cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth f hR + _ =ᵐ[normalizedCubeMeasure R] cubeProjection R 0 f := by + simpa using + (cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := R) (R := R) (j := 0) f (by simp)).symm + +theorem cubeProjection_memLp_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := by + let c : ℝ := cubeAverage R f + have hconst : MeasureTheory.MemLp (fun _ : Vec d => c) p (normalizedCubeMeasure R) := + MeasureTheory.memLp_const c + have hproj_meas : + MeasureTheory.AEStronglyMeasurable (cubeProjection Q j f) (normalizedCubeMeasure R) := + hconst.aestronglyMeasurable.congr + (cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth (Q := Q) (R := R) (j := j) f hR).symm + refine hconst.congr_norm hproj_meas ?_ + filter_upwards + [cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth (Q := Q) (R := R) (j := j) f hR] + with x hx + simpa [c] using (congrArg abs hx).symm + +theorem cubeProjectionResidual_ae_eq_cubeProjectionResidual_depth_zero_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeProjectionResidual Q j u =ᵐ[normalizedCubeMeasure R] cubeProjectionResidual R 0 u := by + filter_upwards + [cubeProjection_ae_eq_cubeProjection_depth_zero_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR] with x hx + simp [cubeProjectionResidual, hx] + +theorem cubeLpNorm_cubeProjectionResidual_eq_cubeProjectionResidual_depth_zero_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeLpNorm R p (cubeProjectionResidual Q j u) = + cubeLpNorm R p (cubeProjectionResidual R 0 u) := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeProjectionResidual_ae_eq_cubeProjectionResidual_depth_zero_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR)] + +theorem cubeProjectionResidual_memLp_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hu : MeasureTheory.MemLp (cubeFluctuation R u) p (normalizedCubeMeasure R)) : + MeasureTheory.MemLp (cubeProjectionResidual Q j u) p (normalizedCubeMeasure R) := by + have hfluct : + cubeFluctuation R u =ᵐ[normalizedCubeMeasure R] cubeProjectionResidual Q j u := + cubeFluctuation_ae_eq_cubeProjectionResidual_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR + have hres_meas : + MeasureTheory.AEStronglyMeasurable (cubeProjectionResidual Q j u) + (normalizedCubeMeasure R) := + hu.aestronglyMeasurable.congr hfluct + refine hu.congr_norm hres_meas ?_ + filter_upwards [hfluct] with x hx + simpa using congrArg abs hx + +theorem abs_cubeAverage_mul_cubeProjectionResidual_le_mul_cubeLpNorm_cubeBesovOscillation_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp (cubeFluctuation R u) (ENNReal.conjExponent p) + (normalizedCubeMeasure R)) + (hp : 1 ≤ p) : + |cubeAverage R (fun x => f x * cubeProjectionResidual Q j u x)| ≤ + cubeLpNorm R p f * cubeBesovOscillation R (ENNReal.conjExponent p) u := by + have hfluct : + cubeFluctuation R u =ᵐ[normalizedCubeMeasure R] cubeProjectionResidual Q j u := + cubeFluctuation_ae_eq_cubeProjectionResidual_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR + have hres_meas : + MeasureTheory.AEStronglyMeasurable (cubeProjectionResidual Q j u) + (normalizedCubeMeasure R) := + hu.aestronglyMeasurable.congr hfluct + have hu_res : + MeasureTheory.MemLp (cubeProjectionResidual Q j u) (ENNReal.conjExponent p) + (normalizedCubeMeasure R) := by + refine hu.congr_norm hres_meas ?_ + filter_upwards [hfluct] with x hx + simpa using congrArg abs hx + calc + |cubeAverage R (fun x => f x * cubeProjectionResidual Q j u x)| ≤ + cubeLpNorm R p f * cubeLpNorm R (ENNReal.conjExponent p) (cubeProjectionResidual Q j u) := by + exact abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + R p f (cubeProjectionResidual Q j u) hf hu_res hp + _ = cubeLpNorm R p f * cubeBesovOscillation R (ENNReal.conjExponent p) u := by + rw [cubeBesovOscillation_eq_cubeLpNorm_cubeProjectionResidual_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := ENNReal.conjExponent p) u hR] + +theorem abs_cubeAverage_mul_cubeProjection_cubeProjectionResidual_le_abs_cubeAverage_mul_cubeBesovOscillation_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (f u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hu : MeasureTheory.MemLp (cubeFluctuation R u) (ENNReal.conjExponent p) + (normalizedCubeMeasure R)) + (hp0 : p ≠ 0) (hp : 1 ≤ p) : + |cubeAverage R (fun x => cubeProjection Q j f x * cubeProjectionResidual Q j u x)| ≤ + ‖cubeAverage R f‖ * cubeBesovOscillation R (ENNReal.conjExponent p) u := by + have hproj : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := + cubeProjection_memLp_of_mem_descendantsAtDepth (Q := Q) (R := R) (j := j) p f hR + calc + |cubeAverage R (fun x => cubeProjection Q j f x * cubeProjectionResidual Q j u x)| ≤ + cubeLpNorm R p (cubeProjection Q j f) * cubeBesovOscillation R (ENNReal.conjExponent p) u := by + exact + abs_cubeAverage_mul_cubeProjectionResidual_le_mul_cubeLpNorm_cubeBesovOscillation_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := cubeProjection Q j f) (u := u) + hR hproj hu hp + _ = ‖cubeAverage R f‖ * cubeBesovOscillation R (ENNReal.conjExponent p) u := by + rw [cubeLpNorm_cubeProjection_eq_abs_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := f) hR hp0] + +theorem cubeVolume_eq_of_mem_descendantsAtDepth {d : ℕ} {Q R S : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (hS : S ∈ descendantsAtDepth Q j) : + cubeVolume R = cubeVolume S := by + rw [cubeVolume_eq_pow_scale, cubeVolume_eq_pow_scale, + scale_eq_sub_of_mem_descendantsAtDepth hR, + scale_eq_sub_of_mem_descendantsAtDepth hS] + +theorem cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + cubeVolume Q = ((descendantsAtDepth Q j).card : ℝ) * cubeVolume R := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hmeas : ∀ S ∈ D, MeasurableSet (cubeSet S) := by + intro S _hS + exact measurableSet_cubeSet S + have hpair : (D : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + simpa [D] using pairwiseDisjoint_descendantsAtDepth Q j + have hvol : + MeasureTheory.volume (cubeSet Q) = + ∑ S ∈ D, MeasureTheory.volume (cubeSet S) := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact MeasureTheory.measure_biUnion_finset (μ := MeasureTheory.volume) hpair hmeas + have hcube_ne_top : ∀ S ∈ D, MeasureTheory.volume (cubeSet S) ≠ ∞ := by + intro S _hS htop + have hreal : (MeasureTheory.volume (cubeSet S)).toReal = cubeVolume S := + volume_cubeSet_toReal S + rw [htop] at hreal + simp at hreal + exact (cubeVolume_pos S).ne' hreal.symm + have hvol_real : cubeVolume Q = ∑ S ∈ D, cubeVolume S := by + have hvol_toReal : + (MeasureTheory.volume (cubeSet Q)).toReal = + (∑ S ∈ D, MeasureTheory.volume (cubeSet S)).toReal := + congrArg ENNReal.toReal hvol + rw [volume_cubeSet_toReal] at hvol_toReal + rw [ENNReal.toReal_sum hcube_ne_top] at hvol_toReal + simpa [volume_cubeSet_toReal] using hvol_toReal + have hsumR : ∑ S ∈ D, cubeVolume S = (D.card : ℝ) * cubeVolume R := by + calc + ∑ S ∈ D, cubeVolume S = ∑ S ∈ D, cubeVolume R := by + refine Finset.sum_congr rfl ?_ + intro S hS + rw [cubeVolume_eq_of_mem_descendantsAtDepth (Q := Q) + (by simpa [D] using hS) hR] + _ = (D.card : ℝ) * cubeVolume R := by + rw [Finset.sum_const, nsmul_eq_mul] + simpa [D] using hvol_real.trans hsumR + +theorem cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ) + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) : + cubeAverage Q f = descendantsAverage Q j (fun R => cubeAverage R f) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hmeas : ∀ R ∈ D, MeasurableSet (cubeSet R) := by + intro R hR + exact measurableSet_cubeSet R + have hpair : (D : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + simpa [D] using pairwiseDisjoint_descendantsAtDepth Q j + have hint : ∀ R ∈ D, MeasureTheory.IntegrableOn f (cubeSet R) MeasureTheory.volume := by + intro R hR + exact hf.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hInt : + ∫ x in cubeSet Q, f x ∂MeasureTheory.volume = + ∑ R ∈ D, ∫ x in cubeSet R, f x ∂MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact MeasureTheory.integral_biUnion_finset D hmeas hpair hint + have hvol : + MeasureTheory.volume (cubeSet Q) = + ∑ R ∈ D, MeasureTheory.volume (cubeSet R) := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + exact MeasureTheory.measure_biUnion_finset (μ := MeasureTheory.volume) hpair hmeas + have hcube_ne_top : ∀ R ∈ D, MeasureTheory.volume (cubeSet R) ≠ ∞ := by + intro R hR htop + have hreal : (MeasureTheory.volume (cubeSet R)).toReal = cubeVolume R := volume_cubeSet_toReal R + rw [htop] at hreal + simp at hreal + exact (cubeVolume_pos R).ne' hreal.symm + have hvol_real : cubeVolume Q = ∑ R ∈ D, cubeVolume R := by + have hvol_toReal : + (MeasureTheory.volume (cubeSet Q)).toReal = + (∑ R ∈ D, MeasureTheory.volume (cubeSet R)).toReal := + congrArg ENNReal.toReal hvol + rw [volume_cubeSet_toReal] at hvol_toReal + rw [ENNReal.toReal_sum hcube_ne_top] at hvol_toReal + simpa [volume_cubeSet_toReal] using hvol_toReal + have hcard_ne : ((D.card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q j) + have hcoeff : ∀ R ∈ D, (cubeVolume Q)⁻¹ * cubeVolume R = ((D.card : ℝ)⁻¹) := by + intro R hR + have hsumR : ∑ S ∈ D, cubeVolume S = (D.card : ℝ) * cubeVolume R := by + calc + ∑ S ∈ D, cubeVolume S = ∑ S ∈ D, cubeVolume R := by + refine Finset.sum_congr rfl ?_ + intro S hS + rw [cubeVolume_eq_of_mem_descendantsAtDepth (Q := Q) hS hR] + _ = (D.card : ℝ) * cubeVolume R := by + rw [Finset.sum_const, nsmul_eq_mul] + have hvolR : cubeVolume Q = (D.card : ℝ) * cubeVolume R := by + rw [hvol_real, hsumR] + have hR_ne : cubeVolume R ≠ 0 := (cubeVolume_pos R).ne' + rw [hvolR] + field_simp [hcard_ne, hR_ne] + calc + cubeAverage Q f + = (cubeVolume Q)⁻¹ * ∑ R ∈ D, ∫ x in cubeSet R, f x ∂MeasureTheory.volume := by + unfold cubeAverage + rw [hInt] + _ = (cubeVolume Q)⁻¹ * ∑ R ∈ D, cubeVolume R * cubeAverage R f := by + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + unfold cubeAverage + have hR_ne : cubeVolume R ≠ 0 := (cubeVolume_pos R).ne' + field_simp [hR_ne] + _ = ∑ R ∈ D, ((cubeVolume Q)⁻¹ * cubeVolume R) * cubeAverage R f := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = ∑ R ∈ D, ((D.card : ℝ)⁻¹) * cubeAverage R f := by + refine Finset.sum_congr rfl ?_ + intro R hR + rw [hcoeff R hR] + _ = ((D.card : ℝ)⁻¹) * ∑ R ∈ D, cubeAverage R f := by + rw [Finset.mul_sum] + _ = descendantsAverage Q j (fun R => cubeAverage R f) := by + simp [descendantsAverage, D] + +theorem cubeBesovPartialSeminorm_congr_on_cubeSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + {u v : Vec d → ℝ} (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeBesovPartialSeminorm Q s p q N u = cubeBesovPartialSeminorm Q s p q N v := by + rw [cubeBesovPartialSeminorm_eq_projection_error, + cubeBesovPartialSeminorm_eq_projection_error] + refine congrArg (fun t : ℝ => t ^ (1 / q.toReal)) ?_ + refine Finset.sum_congr rfl ?_ + intro j hj + refine congrArg (fun t : ℝ => + (cubeBesovDepthWeight Q s j * t ^ (1 / p.toReal)) ^ q.toReal) ?_ + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + congr 1 + apply cubeLpNorm_congr_on_cubeSet (Q := R) (p := p) + intro x hxR + have hxQ : x ∈ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hR hxR + have hproj : + cubeProjection Q j u x = cubeProjection Q j v x := by + simpa using congrArg (fun f : Vec d → ℝ => f x) + (cubeProjection_congr_on_cubeSet (Q := Q) (j := j) h) + simp [h x hxQ, hproj] + +theorem cubeBesovPartialNorm_congr_on_cubeSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + {u v : Vec d → ℝ} (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeBesovPartialNorm Q s p q N u = cubeBesovPartialNorm Q s p q N v := by + unfold cubeBesovPartialNorm + rw [cubeBesovPartialSeminorm_congr_on_cubeSet Q s p q N h, + cubeAverage_congr_on_cubeSet h] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative.lean new file mode 100644 index 0000000000..ec0fdbad7d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization + +/-! # Negative -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-! +Finite-depth concrete negative/circ cube Besov seminorms. + +This file freezes the first block-average-facing negative Besov layer used later +in testing and coarse-graining arguments. As on the positive side, the scale +parameter is encoded by a depth `j : ℕ` relative to a fixed parent cube `Q`, and +the outer aggregation is truncated at a finite depth. + +At this checkpoint we only record the concrete circ quantities. The genuine +duality-based negative Besov seminorms and their comparison theorems belong in +`Duality.lean`. +-/ + +@[simp] theorem descendantsAverage_const {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + descendantsAverage Q j (fun _ => c) = c := by + classical + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum (fun _ => c) = c + have hD : (descendantsAtDepth Q j).Nonempty := descendantsAtDepth_nonempty Q j + have hcard : (((descendantsAtDepth Q j).card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr hD) + rw [Finset.sum_const, nsmul_eq_mul] + rw [← mul_assoc, inv_mul_cancel₀ hcard, one_mul] + +noncomputable def cubeBesovCircDepthAverage {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => ‖cubeAverage R u‖ ^ p.toReal + +noncomputable def cubeBesovCircDepthWeight {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) : ℝ := + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ s + +noncomputable def cubeBesovCircDepthSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : ℝ := + cubeBesovCircDepthWeight Q s j * (cubeBesovCircDepthAverage Q p u j) ^ (1 / p.toReal) + +noncomputable def cubeBesovCircPartialSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + (Finset.sum (Finset.range (N + 1)) + fun j => (cubeBesovCircDepthSeminorm Q s p u j) ^ q.toReal) ^ (1 / q.toReal) + +noncomputable def cubeBesovCircPartialSeminormTop {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + (Finset.range (N + 1)).sup' ⟨0, by simp⟩ (fun j => cubeBesovCircDepthSeminorm Q s p u j) + +noncomputable def cubeBesovCircPartialNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovCircPartialSeminorm Q s p q N u + +noncomputable def cubeBesovCircPartialNormTop {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovCircPartialSeminormTop Q s p N u + +@[simp] theorem cubeBesovCircDepthAverage_depth_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + cubeBesovCircDepthAverage Q p u 0 = ‖cubeAverage Q u‖ ^ p.toReal := by + unfold cubeBesovCircDepthAverage descendantsAverage + simp + +@[simp] theorem cubeBesovCircDepthWeight_depth_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) : + cubeBesovCircDepthWeight Q s 0 = cubeBesovScaleWeight (-s) Q := by + unfold cubeBesovCircDepthWeight cubeBesovScaleWeight + simp + +theorem cubeBesovCircDepthAverage_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovCircDepthAverage Q p u j := by + unfold cubeBesovCircDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => + Real.rpow_nonneg (norm_nonneg _) _ + +theorem cubeBesovCircDepthWeight_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + 0 ≤ cubeBesovCircDepthWeight Q s j := by + unfold cubeBesovCircDepthWeight + have hQ : 0 ≤ cubeScaleFactor Q := le_of_lt <| by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow : 0 ≤ (3 : ℝ) ^ j := by positivity + exact Real.rpow_nonneg (div_nonneg hQ hpow) _ + +theorem cubeBesovCircDepthSeminorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovCircDepthSeminorm Q s p u j := by + unfold cubeBesovCircDepthSeminorm + exact mul_nonneg (cubeBesovCircDepthWeight_nonneg Q s j) + (Real.rpow_nonneg (cubeBesovCircDepthAverage_nonneg Q p u j) _) + +theorem cubeBesovCircPartialSeminorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovCircPartialSeminorm Q s p q N u := by + unfold cubeBesovCircPartialSeminorm + exact Real.rpow_nonneg + (Finset.sum_nonneg fun j _ => Real.rpow_nonneg (cubeBesovCircDepthSeminorm_nonneg Q s p u j) _) + _ + +theorem cubeBesovCircPartialSeminormTop_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovCircPartialSeminormTop Q s p N u := by + unfold cubeBesovCircPartialSeminormTop + exact le_trans (cubeBesovCircDepthSeminorm_nonneg Q s p u 0) + (Finset.le_sup' (f := fun j => cubeBesovCircDepthSeminorm Q s p u j) (by simp)) + +theorem cubeBesovCircPartialNorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovCircPartialNorm Q s p q N u := + cubeBesovCircPartialSeminorm_nonneg Q s p q N u + +theorem cubeBesovCircPartialNormTop_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovCircPartialNormTop Q s p N u := + cubeBesovCircPartialSeminormTop_nonneg Q s p N u + +theorem cubeBesovCircDepthAverage_eq_descendantsAverage_projection {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) (hp : p ≠ 0) : + cubeBesovCircDepthAverage Q p u j = + descendantsAverage Q j (fun R => + (cubeLpNorm R p (cubeProjection Q j u)) ^ p.toReal) := by + classical + unfold cubeBesovCircDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeLpNorm_cubeProjection_eq_abs_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) (f := u) hR hp] + +@[simp] theorem cubeBesovCircDepthAverage_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (c : ℝ) (j : ℕ) : + cubeBesovCircDepthAverage Q p (fun _ => c) j = ‖c‖ ^ p.toReal := by + unfold cubeBesovCircDepthAverage + simp [descendantsAverage_const, cubeAverage_const] + +@[simp] theorem cubeBesovCircDepthAverage_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircDepthAverage Q p (fun _ => (0 : ℝ)) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + simp [cubeBesovCircDepthAverage_const, hpPos.ne'] + +@[simp] theorem cubeBesovCircDepthSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircDepthSeminorm Q s p (fun _ => (0 : ℝ)) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hpInv : (1 / p.toReal) ≠ 0 := one_div_ne_zero hpPos.ne' + unfold cubeBesovCircDepthSeminorm + rw [cubeBesovCircDepthAverage_zero (Q := Q) (p := p) (j := j) hp0 hpTop] + rw [Real.zero_rpow hpInv, mul_zero] + +@[simp] theorem cubeBesovCircPartialSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovCircPartialSeminorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + have hqPos : 0 < q.toReal := ENNReal.toReal_pos hq0 hqTop + unfold cubeBesovCircPartialSeminorm + simp [cubeBesovCircDepthSeminorm_zero, hp0, hpTop, hqPos.ne'] + +@[simp] theorem cubeBesovCircPartialSeminormTop_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircPartialSeminormTop Q s p N (fun _ => (0 : ℝ)) = 0 := by + refine le_antisymm ?_ (cubeBesovCircPartialSeminormTop_nonneg Q s p N (fun _ => (0 : ℝ))) + unfold cubeBesovCircPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovCircDepthSeminorm Q s p (fun _ => (0 : ℝ)) j) ?_ + intro j hj + simp [cubeBesovCircDepthSeminorm_zero, hp0, hpTop] + +@[simp] theorem cubeBesovCircPartialNorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovCircPartialNorm Q s p q N (fun _ => (0 : ℝ)) = 0 := + cubeBesovCircPartialSeminorm_zero Q s p q N hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovCircPartialNormTop_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircPartialNormTop Q s p N (fun _ => (0 : ℝ)) = 0 := + cubeBesovCircPartialSeminormTop_zero Q s p N hp0 hpTop + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactAggregationBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactAggregationBridge.lean new file mode 100644 index 0000000000..e03e8fd847 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactAggregationBridge.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactFiniteBridge + +/-! +# Finite aggregation transport for exact negative Besov kernels + +Source-neutral `ENNReal` transport lemmas for passing from finite real +aggregations to the extended finite and infinite aggregations used by the +exact Chapter 1 kernels. They retain extended-value behavior without analytic +convergence or real-valued upper-bound hypotheses. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-- The `ENNReal` embedding of a nonnegative finite real `ℓ^q` expression is +the corresponding finite extended expression. -/ +theorem exactAggregation_ofReal_finiteLq (a : ℕ → ℝ) (N : ℕ) (q : ℝ) + (ha : ∀ i ∈ Finset.range (N + 1), 0 ≤ a i) (hq : 0 ≤ q) : + ENNReal.ofReal + ((Finset.sum (Finset.range (N + 1)) fun i => (a i) ^ q) ^ q⁻¹) = + (Finset.sum (Finset.range (N + 1)) fun i => (ENNReal.ofReal (a i)) ^ q) ^ q⁻¹ := by + rw [← ENNReal.ofReal_rpow_of_nonneg] + · rw [ENNReal.ofReal_sum_of_nonneg] + · congr 1 + apply Finset.sum_congr rfl + intro i hi + rw [(ENNReal.ofReal_rpow_of_nonneg (ha i hi) hq).symm] + · intro i hi + exact Real.rpow_nonneg (ha i hi) q + · exact Finset.sum_nonneg fun i hi => Real.rpow_nonneg (ha i hi) q + · exact inv_nonneg.mpr hq + +/-- A finite extended `ℓ^q` aggregation is bounded by its infinite `tsum` +aggregation. This deliberately remains valid when the right side is `∞`. -/ +theorem exactAggregation_finiteLq_le_tsum (a : ℕ → ℝ≥0∞) (N : ℕ) (q : ℝ) + (hq : 0 ≤ q) : + (Finset.sum (Finset.range (N + 1)) fun i => (a i) ^ q) ^ q⁻¹ ≤ + (∑' i : ℕ, (a i) ^ q) ^ q⁻¹ := by + apply ENNReal.rpow_le_rpow + · simpa using ENNReal.sum_le_tsum + (f := fun i : ℕ => (a i) ^ q) (s := Finset.range (N + 1)) + · exact inv_nonneg.mpr hq + +private def exactAggregationOfRealSupHom : SupHom ℝ ℝ≥0∞ := + ⟨ENNReal.ofReal, ENNReal.ofReal_max⟩ + +/-- The `ENNReal` embedding of a finite real maximum is bounded by the +extended `iSup` of the embedded terms. -/ +theorem exactAggregation_ofReal_finiteSup_le_iSup (a : ℕ → ℝ) (N : ℕ) : + ENNReal.ofReal ((Finset.range (N + 1)).sup' ⟨0, by simp⟩ a) ≤ + ⨆ i : ℕ, ENNReal.ofReal (a i) := by + change exactAggregationOfRealSupHom + ((Finset.range (N + 1)).sup' Finset.nonempty_range_add_one a) ≤ _ + rw [map_finset_sup' exactAggregationOfRealSupHom] + apply Finset.sup'_le + intro i hi + simpa [Function.comp_apply] using! le_iSup (fun i : ℕ => ENNReal.ofReal (a i)) i + +/-- A pointwise finite-term bridge transports a legacy finite real `ℓ^q` +aggregation directly into an infinite exact `tsum` aggregation. -/ +theorem exactAggregation_ofReal_finiteLq_le_tsum_of_term_eq + (a : ℕ → ℝ) (b : ℕ → ℝ≥0∞) (N : ℕ) (q : ℝ) + (ha : ∀ i ∈ Finset.range (N + 1), 0 ≤ a i) (hq : 0 ≤ q) + (hterm : ∀ i ∈ Finset.range (N + 1), ENNReal.ofReal (a i) = b i) : + ENNReal.ofReal + ((Finset.sum (Finset.range (N + 1)) fun i => (a i) ^ q) ^ q⁻¹) ≤ + (∑' i : ℕ, (b i) ^ q) ^ q⁻¹ := by + calc + ENNReal.ofReal + ((Finset.sum (Finset.range (N + 1)) fun i => (a i) ^ q) ^ q⁻¹) = + (Finset.sum (Finset.range (N + 1)) fun i => (ENNReal.ofReal (a i)) ^ q) ^ q⁻¹ := + exactAggregation_ofReal_finiteLq a N q ha hq + _ = (Finset.sum (Finset.range (N + 1)) fun i => (b i) ^ q) ^ q⁻¹ := by + congr 1 + apply Finset.sum_congr rfl + intro i hi + rw [hterm i hi] + _ ≤ (∑' i : ℕ, (b i) ^ q) ^ q⁻¹ := + exactAggregation_finiteLq_le_tsum b N q hq + +/-- A pointwise finite-term bridge transports a legacy finite real maximum +directly into an exact extended `iSup`. -/ +theorem exactAggregation_ofReal_finiteSup_le_iSup_of_term_eq + (a : ℕ → ℝ) (b : ℕ → ℝ≥0∞) (N : ℕ) + (hterm : ∀ i ∈ Finset.range (N + 1), ENNReal.ofReal (a i) = b i) : + ENNReal.ofReal ((Finset.range (N + 1)).sup' ⟨0, by simp⟩ a) ≤ + ⨆ i : ℕ, b i := by + change exactAggregationOfRealSupHom + ((Finset.range (N + 1)).sup' Finset.nonempty_range_add_one a) ≤ _ + rw [map_finset_sup' exactAggregationOfRealSupHom] + apply Finset.sup'_le + intro i hi + change ENNReal.ofReal (a i) ≤ _ + rw [hterm i hi] + exact le_iSup b i + +/-- A finite legacy overlap-positive `ℓ^q` truncation is dominated by the +exact extended overlap seminorm, with the parent `MemLp` data supplying the +canonical local-integrability witness. -/ +theorem exactAggregation_overlapPartialSeminorm_le_exactOverlapFiniteSeminorm + {d : ℕ} (P : ExactOverlapFiniteParameters) (Q : TriadicCube d) + (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u) ≤ + exactOverlapFiniteSeminorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := by + have hq0 : 0 ≤ P.q := zero_le_one.trans P.q_one_le + simpa [cubeBesovOverlapPartialSeminorm, ENNReal.toReal_ofReal hq0, one_div, + exactOverlapFiniteSeminorm_eq] using + exactAggregation_ofReal_finiteLq_le_tsum_of_term_eq + (a := fun j => cubeBesovOverlapDepthSeminorm Q P.s (ENNReal.ofReal P.p) u j) + (b := fun j => exactOverlapDepthTerm Q P.s P.p u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) j) + N P.q + (fun j _ => cubeBesovOverlapDepthSeminorm_nonneg Q P.s (ENNReal.ofReal P.p) u j) + hq0 + (fun j _ => + (exactOverlapDepthTerm_eq_ofReal_cubeBesovOverlapDepthSeminorm Q P.s P.p + P.p_one_le u hmem j).symm) + +/-- A finite legacy overlap-positive supremum truncation is dominated by the +exact extended overlap endpoint seminorm. -/ +theorem exactAggregation_overlapPartialSeminormTop_le_exactOverlapTopSeminorm + {d : ℕ} (P : ExactOverlapTopParameters) (Q : TriadicCube d) + (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovOverlapPartialSeminormTop Q P.s (ENNReal.ofReal P.p) N u) ≤ + exactOverlapTopSeminorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := by + simpa [cubeBesovOverlapPartialSeminormTop, exactOverlapTopSeminorm_eq] using + exactAggregation_ofReal_finiteSup_le_iSup_of_term_eq + (a := fun j => cubeBesovOverlapDepthSeminorm Q P.s (ENNReal.ofReal P.p) u j) + (b := fun j => exactOverlapDepthTerm Q P.s P.p u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) j) + N + (fun j _ => + (exactOverlapDepthTerm_eq_ofReal_cubeBesovOverlapDepthSeminorm Q P.s P.p + P.p_one_le u hmem j).symm) + +/-- The finite inhomogeneous overlap-positive truncation is dominated by the +exact extended norm; its root mean transports exactly. -/ +theorem exactAggregation_overlapPartialNorm_le_exactOverlapFiniteNorm + {d : ℕ} (P : ExactOverlapFiniteParameters) (Q : TriadicCube d) + (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u) ≤ + exactOverlapFiniteNorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := by + have hsem := exactAggregation_overlapPartialSeminorm_le_exactOverlapFiniteSeminorm + P Q u hmem N + have hlegacySem : 0 ≤ cubeBesovOverlapPartialSeminorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u := + cubeBesovOverlapPartialSeminorm_nonneg Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u + have hlegacyRoot : 0 ≤ cubeBesovScaleWeight P.s Q * ‖cubeAverage Q u‖ := + mul_nonneg (cubeBesovScaleWeight_nonneg P.s Q) (norm_nonneg _) + calc + ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u) = + ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N u) + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := by + rw [cubeBesovOverlapPartialNorm, ENNReal.ofReal_add hlegacySem hlegacyRoot, + ENNReal.ofReal_mul (cubeBesovScaleWeight_nonneg P.s Q), + ← exactOverlapRootWeight_eq_ofReal_legacy] + simp [Real.norm_eq_abs] + _ ≤ exactOverlapFiniteSeminorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := + add_le_add hsem le_rfl + _ = exactOverlapFiniteNorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := + (exactOverlapFiniteNorm_eq_rootCubeAverage P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem)).symm + +/-- The finite inhomogeneous overlap-positive endpoint truncation is dominated +by the exact extended endpoint norm. -/ +theorem exactAggregation_overlapPartialNormTop_le_exactOverlapTopNorm + {d : ℕ} (P : ExactOverlapTopParameters) (Q : TriadicCube d) + (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal P.p) N u) ≤ + exactOverlapTopNorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := by + have hsem := exactAggregation_overlapPartialSeminormTop_le_exactOverlapTopSeminorm + P Q u hmem N + have hlegacySem : 0 ≤ cubeBesovOverlapPartialSeminormTop Q P.s + (ENNReal.ofReal P.p) N u := + cubeBesovOverlapPartialSeminormTop_nonneg Q P.s (ENNReal.ofReal P.p) N u + have hlegacyRoot : 0 ≤ cubeBesovScaleWeight P.s Q * ‖cubeAverage Q u‖ := + mul_nonneg (cubeBesovScaleWeight_nonneg P.s Q) (norm_nonneg _) + calc + ENNReal.ofReal + (cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal P.p) N u) = + ENNReal.ofReal + (cubeBesovOverlapPartialSeminormTop Q P.s (ENNReal.ofReal P.p) N u) + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := by + rw [cubeBesovOverlapPartialNormTop, ENNReal.ofReal_add hlegacySem hlegacyRoot, + ENNReal.ofReal_mul (cubeBesovScaleWeight_nonneg P.s Q), + ← exactOverlapRootWeight_eq_ofReal_legacy] + simp [Real.norm_eq_abs] + _ ≤ exactOverlapTopSeminorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := + add_le_add hsem le_rfl + _ = exactOverlapTopNorm P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem) := + (exactOverlapTopNorm_eq_rootCubeAverage P Q u + (exactDualOverlapIntegrable Q P.p P.p_one_le hmem)).symm + +/-- A finite legacy circ `ℓ^q` truncation is dominated by the exact extended +circ seminorm, under the canonical block-integrability witness. -/ +theorem exactAggregation_circPartialNorm_le_exactCircFiniteSeminorm + {d : ℕ} (P : ExactCircFiniteParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hmem : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) N f) ≤ + exactCircFiniteSeminorm P Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_le hmem) := by + have hq0 : 0 ≤ P.q := zero_le_one.trans P.q_one_le + simpa [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm, + ENNReal.toReal_ofReal hq0, one_div, exactCircFiniteSeminorm_eq] using + exactAggregation_ofReal_finiteLq_le_tsum_of_term_eq + (a := fun j => cubeBesovCircDepthSeminorm Q P.s (ENNReal.ofReal P.p) f j) + (b := fun j => exactCircDepthTerm Q P.s P.p f + (exactCircIntegrable_of_memLp Q P.p P.p_one_le hmem) j) + N P.q + (fun j _ => cubeBesovCircDepthSeminorm_nonneg Q P.s (ENNReal.ofReal P.p) f j) + hq0 + (fun j _ => + (exactCircDepthTerm_eq_ofReal_cubeBesovCircDepthSeminorm Q P.s P.p + P.p_one_le f hmem j).symm) + +/-- A finite legacy circ supremum truncation is dominated by the exact +extended circ endpoint seminorm. -/ +theorem exactAggregation_circPartialNormTop_le_exactCircTopSeminorm + {d : ℕ} (P : ExactCircTopParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hmem : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal + (cubeBesovCircPartialNormTop Q P.s (ENNReal.ofReal P.p) N f) ≤ + exactCircTopSeminorm P Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_le hmem) := by + simpa [cubeBesovCircPartialNormTop, cubeBesovCircPartialSeminormTop, + exactCircTopSeminorm_eq] using + exactAggregation_ofReal_finiteSup_le_iSup_of_term_eq + (a := fun j => cubeBesovCircDepthSeminorm Q P.s (ENNReal.ofReal P.p) f j) + (b := fun j => exactCircDepthTerm Q P.s P.p f + (exactCircIntegrable_of_memLp Q P.p P.p_one_le hmem) j) + N + (fun j _ => + (exactCircDepthTerm_eq_ofReal_cubeBesovCircDepthSeminorm Q P.s P.p + P.p_one_le f hmem j).symm) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCirc.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCirc.lean new file mode 100644 index 0000000000..26707e6c84 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCirc.lean @@ -0,0 +1,363 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms + +/-! +# Exact concrete circ negative Besov kernel + +This is the extended-valued source-facing circ lane from Chapter 1. Its +natural depth `j` represents the manuscript scale `n = Q.scale - j`, and its +blocks are exactly the disjoint descendants at that depth. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-- Admissible finite-`q` circ parameters. The real exponents are finite by +construction; the final implication is the source restriction at `s = 1`. -/ +def ExactCircFiniteAdmissible (s p q : ℝ) : Prop := + 0 < s ∧ s ≤ 1 ∧ 1 ≤ p ∧ 1 ≤ q ∧ (s = 1 → q = 1) + +/-- Admissible `q = ∞` circ parameters. -/ +def ExactCircTopAdmissible (s p : ℝ) : Prop := + 0 < s ∧ s < 1 ∧ 1 ≤ p + +/-- Finite-`q` parameters for the exact concrete circ seminorm. -/ +structure ExactCircFiniteParameters where + /-- Negative smoothness exponent. -/ + s : ℝ + /-- Data integrability exponent. -/ + p : ℝ + /-- Finite aggregation exponent. -/ + q : ℝ + admissible : ExactCircFiniteAdmissible s p q + +/-- `q = ∞` parameters for the exact concrete circ seminorm. -/ +structure ExactCircTopParameters where + /-- Negative smoothness exponent. -/ + s : ℝ + /-- Data integrability exponent. -/ + p : ℝ + admissible : ExactCircTopAdmissible s p + +namespace ExactCircFiniteParameters + +theorem s_pos (P : ExactCircFiniteParameters) : 0 < P.s := + P.admissible.1 + +theorem s_le_one (P : ExactCircFiniteParameters) : P.s ≤ 1 := + P.admissible.2.1 + +theorem p_one_le (P : ExactCircFiniteParameters) : 1 ≤ P.p := + P.admissible.2.2.1 + +theorem q_one_le (P : ExactCircFiniteParameters) : 1 ≤ P.q := + P.admissible.2.2.2.1 + +theorem q_eq_one_of_s_eq_one (P : ExactCircFiniteParameters) (hs : P.s = 1) : + P.q = 1 := + P.admissible.2.2.2.2 hs + +/-- The finite real `p` exponent as an `ENNReal` exponent. -/ +noncomputable def pExponent (P : ExactCircFiniteParameters) : ℝ≥0∞ := + ENNReal.ofReal P.p + +/-- The finite real `q` exponent as an `ENNReal` exponent. -/ +noncomputable def qExponent (P : ExactCircFiniteParameters) : ℝ≥0∞ := + ENNReal.ofReal P.q + +theorem pExponent_ne_top (P : ExactCircFiniteParameters) : P.pExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +theorem qExponent_ne_top (P : ExactCircFiniteParameters) : P.qExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +end ExactCircFiniteParameters + +namespace ExactCircTopParameters + +theorem s_pos (P : ExactCircTopParameters) : 0 < P.s := + P.admissible.1 + +theorem s_lt_one (P : ExactCircTopParameters) : P.s < 1 := + P.admissible.2.1 + +theorem p_one_le (P : ExactCircTopParameters) : 1 ≤ P.p := + P.admissible.2.2 + +/-- The finite real `p` exponent as an `ENNReal` exponent. -/ +noncomputable def pExponent (P : ExactCircTopParameters) : ℝ≥0∞ := + ENNReal.ofReal P.p + +theorem pExponent_ne_top (P : ExactCircTopParameters) : P.pExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +end ExactCircTopParameters + +/-- Integrability certificates for the normalized averages on every disjoint +block used by the source circ seminorm. -/ +structure ExactCircIntegrable {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) where + block : ∀ (j : ℕ) (R : TriadicCube d), R ∈ descendantsAtDepth Q j → + MeasureTheory.Integrable f (Homogenization.normalizedCubeMeasure R) + +/-- Canonical block-integrability data for the zero function. -/ +theorem exactCircZeroIntegrable {d : ℕ} (Q : TriadicCube d) : + ExactCircIntegrable Q (fun _ : Vec d => (0 : ℝ)) where + block := fun _ _ _ => MeasureTheory.integrable_zero _ _ _ + +/-- The manuscript source index represented by a natural descendant depth. -/ +def exactCircSourceDepth {d : ℕ} (Q : TriadicCube d) (j : ℕ) : ℤ := + Q.scale - (j : ℤ) + +theorem exactCircSourceDepth_eq {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + exactCircSourceDepth Q j = Q.scale - (j : ℤ) := + rfl + +theorem exactCircSourceDepth_le_scale {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + exactCircSourceDepth Q j ≤ Q.scale := by + unfold exactCircSourceDepth + omega + +theorem exists_exactCircDepth_of_le_scale {d : ℕ} (Q : TriadicCube d) {n : ℤ} + (hn : n ≤ Q.scale) : + ∃ j : ℕ, exactCircSourceDepth Q j = n := by + refine ⟨Int.toNat (Q.scale - n), ?_⟩ + unfold exactCircSourceDepth + have hnonneg : 0 ≤ Q.scale - n := sub_nonneg.mpr hn + rw [Int.toNat_of_nonneg hnonneg] + omega + +/-- A depth-`j` descendant has exactly the source scale `n = Q.scale - j`. -/ +theorem exactCirc_descendant_scale {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + R.scale = exactCircSourceDepth Q j := by + simpa only [exactCircSourceDepth] using scale_eq_sub_of_mem_descendantsAtDepth hR + +theorem exactCircDescendants_nonempty {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (descendantsAtDepth Q j).Nonempty := + descendantsAtDepth_nonempty Q j + +/-- The normalized ordinary-cube average on a disjoint circ block. -/ +noncomputable def exactCircBlockMean {d : ℕ} (R : TriadicCube d) (f : Vec d → ℝ) + (_hf : MeasureTheory.Integrable f (Homogenization.normalizedCubeMeasure R)) : ℝ := + ∫ x, f x ∂Homogenization.normalizedCubeMeasure R + +/-- The exact source weight `3^(n s)` at descendant depth `j`. -/ +noncomputable def exactCircDepthWeight {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (j : ℕ) : ℝ≥0∞ := + (3 : ℝ≥0∞) ^ (((exactCircSourceDepth Q j : ℤ) : ℝ) * s) + +/-- The exact normalized finite `ℓ^p` average of the absolute block means. -/ +noncomputable def exactCircDepthAverage {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : ℝ≥0∞ := + let D := descendantsAtDepth Q j + (D.card : ℝ≥0∞)⁻¹ * D.attach.sum fun R => + (ENNReal.ofReal |exactCircBlockMean R.1 f (hf.block j R.1 R.2)|) ^ p + +/-- The weighted source depth term of the concrete circ seminorm. -/ +noncomputable def exactCircDepthTerm {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : ℝ≥0∞ := + exactCircDepthWeight Q s j * (exactCircDepthAverage Q p f hf j) ^ p⁻¹ + +/-- The exact finite-`q` concrete circ negative Besov seminorm. -/ +noncomputable def exactCircFiniteSeminorm {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : ℝ≥0∞ := + (∑' j : ℕ, (exactCircDepthTerm Q P.s P.p f hf j) ^ P.q) ^ P.q⁻¹ + +/-- The exact `q = ∞` concrete circ negative Besov seminorm. -/ +noncomputable def exactCircTopSeminorm {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : ℝ≥0∞ := + ⨆ j : ℕ, exactCircDepthTerm Q P.s P.p f hf j + +/-- Evaluation of the certified normalized disjoint block mean. -/ +theorem exactCircBlockMean_eq {d : ℕ} (R : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f (Homogenization.normalizedCubeMeasure R)) : + exactCircBlockMean R f hf = ∫ x, f x ∂Homogenization.normalizedCubeMeasure R := + rfl + +theorem exactCircBlockMean_zero {d : ℕ} (R : TriadicCube d) + (hf : MeasureTheory.Integrable (fun _ : Vec d => (0 : ℝ)) + (Homogenization.normalizedCubeMeasure R)) : + exactCircBlockMean R (fun _ => (0 : ℝ)) hf = 0 := by + simp only [exactCircBlockMean, MeasureTheory.integral_zero] + +theorem exactCircBlockMean_congr_ae {d : ℕ} (R : TriadicCube d) {f g : Vec d → ℝ} + (hf : MeasureTheory.Integrable f (Homogenization.normalizedCubeMeasure R)) + (hg : MeasureTheory.Integrable g (Homogenization.normalizedCubeMeasure R)) + (hfg : f =ᵐ[Homogenization.normalizedCubeMeasure R] g) : + exactCircBlockMean R f hf = exactCircBlockMean R g hg := + MeasureTheory.integral_congr_ae hfg + +/-- A normalized disjoint-block depth average depends only on the a.e. +representatives on each ordinary descendant block. -/ +theorem exactCircDepthAverage_congr_ae {d : ℕ} (Q : TriadicCube d) (p : ℝ) + {f g : Vec d → ℝ} (hf : ExactCircIntegrable Q f) (hg : ExactCircIntegrable Q g) + (hfg : ∀ (j : ℕ) (R : TriadicCube d), R ∈ descendantsAtDepth Q j → + f =ᵐ[Homogenization.normalizedCubeMeasure R] g) + (j : ℕ) : + exactCircDepthAverage Q p f hf j = exactCircDepthAverage Q p g hg j := by + unfold exactCircDepthAverage + dsimp only + congr 1 + apply Finset.sum_congr rfl + intro R _ + rw [exactCircBlockMean_congr_ae R.1 (hf.block j R.1 R.2) + (hg.block j R.1 R.2) (hfg j R.1 R.2)] + +/-- A weighted circ depth term depends only on the a.e. representatives on +each ordinary descendant block. -/ +theorem exactCircDepthTerm_congr_ae {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + {f g : Vec d → ℝ} (hf : ExactCircIntegrable Q f) (hg : ExactCircIntegrable Q g) + (hfg : ∀ (j : ℕ) (R : TriadicCube d), R ∈ descendantsAtDepth Q j → + f =ᵐ[Homogenization.normalizedCubeMeasure R] g) + (j : ℕ) : + exactCircDepthTerm Q s p f hf j = exactCircDepthTerm Q s p g hg j := by + unfold exactCircDepthTerm + rw [exactCircDepthAverage_congr_ae Q p hf hg hfg j] + +/-- The finite-`q` exact circ seminorm depends only on the a.e. +representatives on every ordinary descendant block. -/ +theorem exactCircFiniteSeminorm_congr_ae {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) {f g : Vec d → ℝ} + (hf : ExactCircIntegrable Q f) (hg : ExactCircIntegrable Q g) + (hfg : ∀ (j : ℕ) (R : TriadicCube d), R ∈ descendantsAtDepth Q j → + f =ᵐ[Homogenization.normalizedCubeMeasure R] g) : + exactCircFiniteSeminorm P Q f hf = exactCircFiniteSeminorm P Q g hg := by + unfold exactCircFiniteSeminorm + congr 1 + apply tsum_congr + intro j + rw [exactCircDepthTerm_congr_ae Q P.s P.p hf hg hfg j] + +/-- The `q = ∞` exact circ seminorm depends only on the a.e. +representatives on every ordinary descendant block. -/ +theorem exactCircTopSeminorm_congr_ae {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) {f g : Vec d → ℝ} + (hf : ExactCircIntegrable Q f) (hg : ExactCircIntegrable Q g) + (hfg : ∀ (j : ℕ) (R : TriadicCube d), R ∈ descendantsAtDepth Q j → + f =ᵐ[Homogenization.normalizedCubeMeasure R] g) : + exactCircTopSeminorm P Q f hf = exactCircTopSeminorm P Q g hg := by + unfold exactCircTopSeminorm + apply iSup_congr + intro j + exact exactCircDepthTerm_congr_ae Q P.s P.p hf hg hfg j + +private theorem exactCircDepthAverage_zero_of_pos {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (hp : 0 < p) (j : ℕ) : + exactCircDepthAverage Q p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := by + simp only [exactCircDepthAverage, exactCircBlockMean_zero, abs_zero, ENNReal.ofReal_zero, + ENNReal.zero_rpow_of_pos hp, Finset.sum_const_zero, mul_zero] + +private theorem exactCircDepthTerm_zero_of_pos {d : ℕ} (Q : TriadicCube d) + (s p : ℝ) (hp : 0 < p) (j : ℕ) : + exactCircDepthTerm Q s p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := by + unfold exactCircDepthTerm + rw [exactCircDepthAverage_zero_of_pos Q p hp j, + ENNReal.zero_rpow_of_pos (inv_pos.mpr hp), mul_zero] + +/-- The depth average vanishes for zero data at every admissible finite-`q` +exponent. -/ +theorem exactCircFiniteDepthAverage_zero {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) (j : ℕ) : + exactCircDepthAverage Q P.p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := + exactCircDepthAverage_zero_of_pos Q P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The depth average vanishes for zero data at every admissible `q = ∞` +exponent. -/ +theorem exactCircTopDepthAverage_zero {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) (j : ℕ) : + exactCircDepthAverage Q P.p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := + exactCircDepthAverage_zero_of_pos Q P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The weighted depth term vanishes for zero data at every admissible +finite-`q` exponent. -/ +theorem exactCircFiniteDepthTerm_zero {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) (j : ℕ) : + exactCircDepthTerm Q P.s P.p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := + exactCircDepthTerm_zero_of_pos Q P.s P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The weighted depth term vanishes for zero data at every admissible +`q = ∞` exponent. -/ +theorem exactCircTopDepthTerm_zero {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) (j : ℕ) : + exactCircDepthTerm Q P.s P.p (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) j = 0 := + exactCircDepthTerm_zero_of_pos Q P.s P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- Evaluation of the finite normalized disjoint block average. -/ +theorem exactCircDepthAverage_eq {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : + exactCircDepthAverage Q p f hf j = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (descendantsAtDepth Q j).attach.sum fun R => + (ENNReal.ofReal |exactCircBlockMean R.1 f (hf.block j R.1 R.2)|) ^ p := + rfl + +/-- Evaluation of the weighted concrete circ depth term. -/ +theorem exactCircDepthTerm_eq {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : + exactCircDepthTerm Q s p f hf j = exactCircDepthWeight Q s j * + (exactCircDepthAverage Q p f hf j) ^ p⁻¹ := + rfl + +/-- Evaluation of the infinite finite-`q` aggregation. -/ +theorem exactCircFiniteSeminorm_eq {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : + exactCircFiniteSeminorm P Q f hf = + (∑' j : ℕ, (exactCircDepthTerm Q P.s P.p f hf j) ^ P.q) ^ P.q⁻¹ := + rfl + +/-- Evaluation of the `q = ∞` aggregation. -/ +theorem exactCircTopSeminorm_eq {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : + exactCircTopSeminorm P Q f hf = + ⨆ j : ℕ, exactCircDepthTerm Q P.s P.p f hf j := + rfl + +/-- The exact finite-`q` circ seminorm vanishes on the zero function. -/ +theorem exactCircFiniteSeminorm_zero {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) : + exactCircFiniteSeminorm P Q (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) = 0 := by + rw [exactCircFiniteSeminorm_eq] + have hq : 0 < P.q := lt_of_lt_of_le zero_lt_one P.q_one_le + simp_rw [exactCircFiniteDepthTerm_zero P Q, ENNReal.zero_rpow_of_pos hq] + rw [tsum_zero, ENNReal.zero_rpow_of_pos] + exact inv_pos.mpr hq + +/-- The exact `q = ∞` circ seminorm vanishes on the zero function. -/ +theorem exactCircTopSeminorm_zero {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) : + exactCircTopSeminorm P Q (fun _ => (0 : ℝ)) (exactCircZeroIntegrable Q) = 0 := by + rw [exactCircTopSeminorm_eq] + simp_rw [exactCircTopDepthTerm_zero P Q] + exact iSup_const + +/-- All extended values in the exact concrete circ kernel are nonnegative. -/ +theorem exactCircDepthAverage_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : + 0 ≤ exactCircDepthAverage Q p f hf j := + bot_le + +theorem exactCircFiniteSeminorm_nonneg {d : ℕ} (P : ExactCircFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : + 0 ≤ exactCircFiniteSeminorm P Q f hf := + bot_le + +theorem exactCircTopSeminorm_nonneg {d : ℕ} (P : ExactCircTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) : + 0 ≤ exactCircTopSeminorm P Q f hf := + bot_le + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDomination.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDomination.lean new file mode 100644 index 0000000000..56f527ae9c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDomination.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationFinite +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationQOne +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDominationTop + +/-! +# Exact circ domination of the dual negative Besov kernels + +This module collects the three source exponent regimes of the Chapter 1 +dual-to-circ comparison. It also records that the depth-zero circ weight in +the full-norm bounds is literally the manuscript factor `3^(s m)`, with +`m = Q.scale`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-- The depth-zero exact circ weight is the manuscript root factor `3^(s m)`, +where `m` is the scale of the parent cube. -/ +theorem exactCircDepthWeight_zero_eq_sourceRootWeight {d : ℕ} + (Q : TriadicCube d) (s : ℝ) : + exactCircDepthWeight Q s 0 = + (3 : ℝ≥0∞) ^ (s * (Q.scale : ℝ)) := by + simp only [exactCircDepthWeight, exactCircSourceDepth, Nat.cast_zero, + sub_zero] + congr 1 + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationFinite.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationFinite.lean new file mode 100644 index 0000000000..2ab284717b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationFinite.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge + +/-! +# Exact finite-interior dual-to-circ comparison + +This module proves the Chapter 1 comparison for `1 < q < ∞` directly on the +exact extended-valued kernels. All local integrability, finite truncation, and +projection-limit inputs are derived from the two parent `MemLp` certificates. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +private theorem exactDualFinitePairing_le_exactCircFiniteSeminorm + {d : ℕ} (P : ExactDualFiniteParameters) (Q : TriadicCube d) + (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q)) + (hgNorm : exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) hg) ≤ 1) : + exactDualPairingFromHolder Q P.p f g P.p_one_lt hf hg ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + let p' : ℝ := exactDualConjExponent P.p + let q' : ℝ := exactDualConjExponent P.q + let C : ℝ≥0∞ := exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + have hp'_one_le : 1 ≤ p' := exactDualConjExponent_one_le P.p P.p_one_lt + have hq'_one_le : 1 ≤ q' := exactDualConjExponent_one_le P.q P.q_one_lt + have hp'_pos : 0 < p' := lt_of_lt_of_le zero_lt_one hp'_one_le + have hq'_pos : 0 < q' := lt_of_lt_of_le zero_lt_one hq'_one_le + have hp'_ofReal_one_le : 1 ≤ ENNReal.ofReal p' := by + rw [← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal hp'_one_le + have hq'_ofReal_one_le : 1 ≤ ENNReal.ofReal q' := by + rw [← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal hq'_one_le + have hp'_toReal_pos : 0 < (ENNReal.ofReal p').toReal := by + rw [ENNReal.toReal_ofReal hp'_pos.le] + exact hp'_pos + have hq'_toReal_one_le : 1 ≤ (ENNReal.ofReal q').toReal := by + rw [ENNReal.toReal_ofReal hq'_pos.le] + exact hq'_one_le + have hfInt : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hf.integrable (ENNReal.one_le_ofReal.mpr P.p_one_lt.le)) + have hgLimit : MeasureTheory.MemLp g + (cubeBesovConjExponent (ENNReal.ofReal P.p)) + (Homogenization.normalizedCubeMeasure Q) := by + simpa [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent P.p P.p_one_lt] + using hg + have hconv := tendsto_cubeBesovPairing_projection_left_of_memLp + Q (ENNReal.ofReal P.p) f g hf hgLimit + (by + rw [← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal P.p_one_lt.le) + ENNReal.ofReal_ne_top + (by + rw [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent P.p P.p_one_lt] + exact ENNReal.ofReal_ne_top) + have hconvAbs : Filter.Tendsto + (fun n => |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds |cubeBesovPairing Q f g|) := by + simpa [Real.norm_eq_abs] using hconv.norm + have hconvENN : Filter.Tendsto + (fun n => ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds (ENNReal.ofReal |cubeBesovPairing Q f g|)) := + ENNReal.tendsto_ofReal hconvAbs + have hbound : ∀ n : ℕ, + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * C := by + intro n + have hgFluct : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) (ENNReal.ofReal p') + (normalizedCubeMeasure R) := by + intro j _hj R hR + exact cubeFluctuation_memLp_of_parent_memLp Q p' hg j R hR + have hfProj : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) f) + (cubeBesovConjExponent (ENNReal.ofReal p')) + (normalizedCubeMeasure R) := by + intro j _hj R hR + rw [cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt] + exact cubeProjection_memLp_of_parent_descendant Q P.p f (j + 1) j R hR + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (n + 1) f)| ≤ + max 1 ((3 : ℝ) ^ P.s) * + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g * + cubeBesovCircPartialNorm Q P.s + (cubeBesovConjExponent (ENNReal.ofReal p')) + (cubeBesovConjExponent (ENNReal.ofReal q')) (n + 1) f := by + exact + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') g f n hfInt + hp'_ofReal_one_le ENNReal.ofReal_ne_top + (by + rw [cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt] + exact ENNReal.ofReal_ne_top) + hq'_ofReal_one_le ENNReal.ofReal_ne_top + (by + rw [cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.q P.q_one_lt] + exact ENNReal.ofReal_ne_top) + hgFluct hfProj + have hpos : + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g ≤ + (3 : ℝ) ^ ((d : ℝ) / p') * + cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') + (ENNReal.ofReal q') n g := by + convert cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm + Q P.s hp'_toReal_pos hq'_toReal_one_le n g using 1 + rw [ENNReal.toReal_ofReal hp'_pos.le] + have hover : ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') + (ENNReal.ofReal q') n g) ≤ 1 := by + calc + ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') + (ENNReal.ofReal q') n g) ≤ + exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q p' hp'_one_le hg) := by + simpa [p', q', ExactDualFiniteParameters.positiveParameters] using + exactAggregation_overlapPartialNorm_le_exactOverlapFiniteNorm + P.positiveParameters Q g hg n + _ ≤ 1 := by simpa [p'] using hgNorm + have hcirc : ENNReal.ofReal + (cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) (n + 1) f) ≤ C := by + simpa [C, ExactDualFiniteParameters.circParameters] using + exactAggregation_circPartialNorm_le_exactCircFiniteSeminorm + P.circParameters Q f hf (n + 1) + have hposNonneg : 0 ≤ + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g := + cubeBesovPartialNorm_nonneg Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g + have hdepthExponentNonneg : 0 ≤ (d : ℝ) / p' := + div_nonneg (Nat.cast_nonneg d) hp'_pos.le + have hposENN : ENNReal.ofReal + (cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g) ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := by + calc + ENNReal.ofReal + (cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g) ≤ + ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) / p') * + cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') + (ENNReal.ofReal q') n g) := ENNReal.ofReal_le_ofReal hpos + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * + ENNReal.ofReal (cubeBesovOverlapPartialNorm Q P.s + (ENNReal.ofReal p') (ENNReal.ofReal q') n g) := by + rw [ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _), + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) + hdepthExponentNonneg] + norm_num + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * 1 := + by gcongr + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := mul_one _ + have hKNonneg : 0 ≤ max 1 ((3 : ℝ) ^ P.s) := + le_trans (by norm_num) (le_max_left _ _) + have hpairENN : + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + max 1 ((3 : ℝ≥0∞) ^ P.s) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * C := by + calc + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| = + ENNReal.ofReal |cubeBesovPairing Q g (cubeProjection Q (n + 1) f)| := by + congr 2 + simp [cubeBesovPairing, mul_comm] + _ ≤ ENNReal.ofReal + (max 1 ((3 : ℝ) ^ P.s) * + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') (ENNReal.ofReal q') n g * + cubeBesovCircPartialNorm Q P.s + (cubeBesovConjExponent (ENNReal.ofReal p')) + (cubeBesovConjExponent (ENNReal.ofReal q')) (n + 1) f) := + ENNReal.ofReal_le_ofReal hpair + _ = ENNReal.ofReal (max 1 ((3 : ℝ) ^ P.s)) * + ENNReal.ofReal + (cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') + (ENNReal.ofReal q') n g) * + ENNReal.ofReal + (cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) + (ENNReal.ofReal P.q) (n + 1) f) := by + rw [cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt, + cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.q P.q_one_lt, + ENNReal.ofReal_mul (mul_nonneg hKNonneg hposNonneg), + ENNReal.ofReal_mul hKNonneg] + _ ≤ ENNReal.ofReal (max 1 ((3 : ℝ) ^ P.s)) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * C := by + gcongr + _ = max 1 ((3 : ℝ≥0∞) ^ P.s) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * C := by + rw [ENNReal.ofReal_max, + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) P.s_pos.le] + norm_num + calc + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + max 1 ((3 : ℝ≥0∞) ^ P.s) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') * C := hpairENN + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * C := + by + gcongr + exact exactCircLossCoefficientENNReal_rpow_le_source + d P.s p' P.s_pos.le hp'_one_le + have hlimit : ENNReal.ofReal |cubeBesovPairing Q f g| ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * C := + le_of_tendsto hconvENN (Filter.Eventually.of_forall hbound) + rw [exactDualPairingFromHolder_eq] + simpa [C, cubeBesovPairing, cubeAverage_eq_integral_normalizedCubeMeasure] using hlimit + +/-- Exact finite-interior hatted dual seminorm is controlled by the exact +concrete circ seminorm with the manuscript coefficient. -/ +theorem exactDualFiniteHattedSeminorm_le_exactCircFiniteSeminorm + {d : ℕ} (P : ExactDualFiniteParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualFiniteHattedSeminorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + rw [exactDualFiniteHattedSeminorm_eq] + refine iSup_le ?_ + intro T + apply exactDualFinitePairing_le_exactCircFiniteSeminorm P Q f T.g hf T.parentMemLp + rw [exactOverlapFiniteNorm_eq, T.root_mean_zero] + simpa using T.seminorm_le_one + +/-- Exact finite-interior full dual norm is controlled by the exact concrete +circ seminorm, with the literal manuscript root term retained on the right. -/ +theorem exactDualFiniteFullNorm_le_exactCircFiniteSeminorm_add_root + {d : ℕ} (P : ExactDualFiniteParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualFiniteFullNorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + exactCircDepthWeight Q P.s 0 * ENNReal.ofReal |cubeAverage Q f| := by + rw [exactDualFiniteFullNorm_eq] + refine iSup_le ?_ + intro T + exact (exactDualFinitePairing_le_exactCircFiniteSeminorm + P Q f T.g hf T.parentMemLp T.norm_le_one).trans (le_add_right le_rfl) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationQOne.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationQOne.lean new file mode 100644 index 0000000000..0bec55364f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationQOne.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge + +/-! +# Exact circ domination at the negative `q = 1` endpoint + +This module proves the source-facing comparison between the exact dual +negative Besov kernel and the exact concrete circ kernel in the `q = 1` +branch. All local integrability and finite-truncation premises are derived +inside the proof from the single parent `MemLp` certificate. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +private theorem exactOverlapTopNorm_eq_seminorm_of_root_mean_eq_zero + {d : ℕ} (P : ExactOverlapTopParameters) (Q : TriadicCube d) + (g : Vec d → ℝ) (hg : ExactOverlapIntegrable Q g) + (hmean : exactOverlapRootMean Q g hg.root = 0) : + exactOverlapTopNorm P Q g hg = exactOverlapTopSeminorm P Q g hg := by + rw [exactOverlapTopNorm_eq, hmean] + simp only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] + +private theorem exactDualQOnePairing_le_exactCircFiniteSeminorm + {d : ℕ} (P : ExactDualQOneParameters) (Q : TriadicCube d) + (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q)) + (hgNorm : exactOverlapTopNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) hg) ≤ 1) : + exactDualPairingFromHolder Q P.p f g P.p_one_lt hf hg ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + let p' : ℝ := exactDualConjExponent P.p + let K : ℝ := max 1 ((3 : ℝ) ^ P.s) + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p') + let X : ℝ≥0∞ := exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + have hp'_one : 1 ≤ p' := by + exact exactDualConjExponent_one_le P.p P.p_one_lt + have hp'_pos : 0 < p' := lt_of_lt_of_le zero_lt_one hp'_one + have hp'_ofReal_one : 1 ≤ ENNReal.ofReal p' := by + exact ENNReal.one_le_ofReal.mpr hp'_one + have hp'_ofReal_top : ENNReal.ofReal p' ≠ ∞ := ENNReal.ofReal_ne_top + have hp'_conj_top : cubeBesovConjExponent (ENNReal.ofReal p') ≠ ∞ := by + rw [show p' = exactDualConjExponent P.p by rfl, + cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt] + exact ENNReal.ofReal_ne_top + have htargetInt : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hf.integrable (ENNReal.one_le_ofReal.mpr P.p_one_lt.le)) + have hconv := tendsto_cubeBesovPairing_projection_left_of_memLp + Q (ENNReal.ofReal P.p) f g hf + (by + simpa [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent + P.p P.p_one_lt] using hg) + (ENNReal.one_le_ofReal.mpr P.p_one_lt.le) ENNReal.ofReal_ne_top + (cubeBesovConjExponent_ofReal_ne_top P.p P.p_one_lt) + have hconvAbs : + Filter.Tendsto + (fun n ↦ |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds |cubeBesovPairing Q f g|) := by + simpa [Real.norm_eq_abs] using hconv.norm + have hconvENNReal : + Filter.Tendsto + (fun n ↦ ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds (ENNReal.ofReal |cubeBesovPairing Q f g|)) := + ENNReal.continuous_ofReal.continuousAt.tendsto.comp hconvAbs + have hK_nonneg : 0 ≤ K := by + exact zero_le_one.trans (le_max_left _ _) + have hC_nonneg : 0 ≤ C := Real.rpow_nonneg (by norm_num) _ + have hCexp_nonneg : 0 ≤ (d : ℝ) / p' := + div_nonneg (Nat.cast_nonneg d) hp'_pos.le + have hp'_toReal_pos : 0 < (ENNReal.ofReal p').toReal := by + rw [ENNReal.toReal_ofReal hp'_pos.le] + exact hp'_pos + have hK_ofReal : ENNReal.ofReal K = max 1 ((3 : ℝ≥0∞) ^ P.s) := by + dsimp only [K] + rw [ENNReal.ofReal_max, + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) P.s_pos.le] + norm_num + have hC_ofReal : ENNReal.ofReal C = (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := by + dsimp only [C] + rw [← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) hCexp_nonneg] + norm_num + have hbound : ∀ n : ℕ, + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * X := by + intro n + have hgFluct : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) (ENNReal.ofReal p') + (Homogenization.normalizedCubeMeasure R) := by + intro j _hj R hR + exact cubeFluctuation_memLp_of_parent_memLp Q p' hg j R hR + have hfProjection : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) f) + (cubeBesovConjExponent (ENNReal.ofReal p')) + (Homogenization.normalizedCubeMeasure R) := by + intro j _hj R hR + rw [show p' = exactDualConjExponent P.p by rfl, + cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt] + exact cubeProjection_memLp_of_parent_descendant Q P.p f (j + 1) j R hR + have hpair : + |cubeBesovPairing Q g (cubeProjection Q (n + 1) f)| ≤ + K * cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g * + cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f := by + simpa [K, p', + cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt] using + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormTop_cubeBesovCircPartialNormOne + (Q := Q) (s := P.s) (p := ENNReal.ofReal p') (f := g) (g := f) (N := n) + htargetInt hp'_ofReal_one hp'_ofReal_top hp'_conj_top hgFluct hfProjection + have hoverlap : + ENNReal.ofReal + (cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal p') n g) ≤ 1 := by + calc + ENNReal.ofReal + (cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal p') n g) ≤ + exactOverlapTopNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q p' hp'_one hg) := by + simpa [p', ExactDualQOneParameters.positiveParameters] using + exactAggregation_overlapPartialNormTop_le_exactOverlapTopNorm + P.positiveParameters Q g hg n + _ ≤ 1 := by + simpa [p'] using hgNorm + have hdisjoint : + ENNReal.ofReal (cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g) ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := by + have hreal := cubeBesovPartialNormTop_le_three_rpow_mul_overlapPartialNormTop + Q P.s hp'_toReal_pos n g + calc + ENNReal.ofReal (cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g) ≤ + ENNReal.ofReal + (C * cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal p') n g) := + ENNReal.ofReal_le_ofReal (by + simpa [C, ENNReal.toReal_ofReal hp'_pos.le] using hreal) + _ = ENNReal.ofReal C * ENNReal.ofReal + (cubeBesovOverlapPartialNormTop Q P.s (ENNReal.ofReal p') n g) := by + rw [ENNReal.ofReal_mul hC_nonneg] + _ ≤ ENNReal.ofReal C * 1 := mul_le_mul_right hoverlap _ + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := by + rw [hC_ofReal, mul_one] + have hcirc : + ENNReal.ofReal + (cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f) ≤ X := by + simpa [X, ExactDualQOneParameters.circParameters] using + exactAggregation_circPartialNorm_le_exactCircFiniteSeminorm + P.circParameters Q f hf (n + 1) + have hpair' : + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + K * cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g * + cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f := by + simpa [cubeBesovPairing_comm] using hpair + have hA_nonneg : + 0 ≤ cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g := + cubeBesovPartialNormTop_nonneg Q P.s (ENNReal.ofReal p') n g + have hB_nonneg : + 0 ≤ cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f := + cubeBesovCircPartialNorm_nonneg Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f + calc + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + ENNReal.ofReal + (K * cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g * + cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f) := + ENNReal.ofReal_le_ofReal hpair' + _ = (ENNReal.ofReal K * + ENNReal.ofReal (cubeBesovPartialNormTop Q P.s (ENNReal.ofReal p') n g)) * + ENNReal.ofReal + (cubeBesovCircPartialNorm Q P.s (ENNReal.ofReal P.p) 1 (n + 1) f) := by + rw [ENNReal.ofReal_mul (mul_nonneg hK_nonneg hA_nonneg), + ENNReal.ofReal_mul hK_nonneg] + _ ≤ (max 1 ((3 : ℝ≥0∞) ^ P.s) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p')) * X := by + rw [hK_ofReal] + exact mul_le_mul (mul_le_mul le_rfl hdisjoint bot_le bot_le) hcirc bot_le bot_le + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * X := by + exact mul_le_mul_left + (exactCircLossCoefficientENNReal_rpow_le_source d P.s p' + P.s_pos.le hp'_one) X + have hlimit : ENNReal.ofReal |cubeBesovPairing Q f g| ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * X := + le_of_tendsto hconvENNReal (Filter.Eventually.of_forall hbound) + simpa [exactDualPairingFromHolder_eq, X, cubeBesovPairing, + cubeAverage_eq_integral_normalizedCubeMeasure] using hlimit + +/-- At the negative `q = 1` endpoint, the exact hatted dual seminorm is +controlled by the exact finite-`q` circ seminorm with the manuscript loss. +The only analytic premise is the canonical parent `MemLp` certificate. -/ +theorem exactDualQOneHattedSeminorm_le_exactCircFiniteSeminorm + {d : ℕ} (P : ExactDualQOneParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualQOneHattedSeminorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + rw [exactDualQOneHattedSeminorm_eq] + refine iSup_le fun T ↦ ?_ + have hNorm : exactOverlapTopNorm P.positiveParameters Q T.g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) T.parentMemLp) ≤ 1 := by + rw [exactOverlapTopNorm_eq_seminorm_of_root_mean_eq_zero + P.positiveParameters Q T.g _ T.root_mean_zero] + exact T.seminorm_le_one + exact exactDualQOnePairing_le_exactCircFiniteSeminorm + P Q f T.g hf T.parentMemLp hNorm + +/-- At the negative `q = 1` endpoint, the exact full dual norm satisfies the +manuscript comparison, including its explicit depth-zero root term. -/ +theorem exactDualQOneFullNorm_le_exactCircFiniteSeminorm_add_root + {d : ℕ} (P : ExactDualQOneParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualQOneFullNorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + exactCircDepthWeight Q P.s 0 * ENNReal.ofReal |cubeAverage Q f| := by + have hstrong : exactDualQOneFullNorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircFiniteSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + rw [exactDualQOneFullNorm_eq] + refine iSup_le fun T ↦ ?_ + exact exactDualQOnePairing_le_exactCircFiniteSeminorm + P Q f T.g hf T.parentMemLp T.norm_le_one + exact hstrong.trans (le_add_right le_rfl) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationTop.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationTop.lean new file mode 100644 index 0000000000..50b73fd3f7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactCircDominationTop.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge + +/-! +# Exact circ domination at the negative `q = ∞` endpoint + +This file proves the source-facing comparison between the exact dual-negative +endpoint and the exact concrete circ endpoint. All finite projected-pairing +premises are derived internally from the parent `MemLp` certificates carried +by the exact definitions. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +private theorem exactDualTopPairing_le_exactCircTopSeminorm + {d : ℕ} (P : ExactDualTopParameters) (Q : TriadicCube d) + (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q)) + (hgNorm : exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) hg) ≤ 1) : + exactDualPairingFromHolder Q P.p f g P.p_one_lt hf hg ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + let p' : ℝ := exactDualConjExponent P.p + let K : ℝ := max 1 ((3 : ℝ) ^ P.s) + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p') + let B : ℝ≥0∞ := + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + have hp'_one_le : 1 ≤ p' := by + exact exactDualConjExponent_one_le P.p P.p_one_lt + have hp'_pos : 0 < p' := lt_of_lt_of_le zero_lt_one hp'_one_le + have hp'_toReal : (ENNReal.ofReal p').toReal = p' := by + exact ENNReal.toReal_ofReal (le_of_lt hp'_pos) + have hfInt : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hf.integrable (ENNReal.one_le_ofReal.mpr P.p_one_lt.le)) + have hpTarget : 1 ≤ ENNReal.ofReal P.p := + ENNReal.one_le_ofReal.mpr P.p_one_lt.le + have hpTargetConjTop : cubeBesovConjExponent (ENNReal.ofReal P.p) ≠ ∞ := + cubeBesovConjExponent_ofReal_ne_top P.p P.p_one_lt + have hpTest : 1 ≤ ENNReal.ofReal p' := + ENNReal.one_le_ofReal.mpr hp'_one_le + have hpTestDouble : cubeBesovConjExponent (ENNReal.ofReal p') = + ENNReal.ofReal P.p := by + simpa only [p'] using + cubeBesovConjExponent_exactDualConjExponent_eq_ofReal P.p P.p_one_lt + have hpTestDoubleTop : cubeBesovConjExponent (ENNReal.ofReal p') ≠ ∞ := by + rw [hpTestDouble] + exact ENNReal.ofReal_ne_top + have hgAsConjugate : MeasureTheory.MemLp g + (cubeBesovConjExponent (ENNReal.ofReal P.p)) + (Homogenization.normalizedCubeMeasure Q) := by + simpa only [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent + P.p P.p_one_lt, p'] using hg + have hconv := + tendsto_cubeBesovPairing_projection_left_of_memLp + Q (ENNReal.ofReal P.p) f g hf hgAsConjugate hpTarget ENNReal.ofReal_ne_top + hpTargetConjTop + have hconvAbs : + Filter.Tendsto + (fun n => |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds |cubeBesovPairing Q f g|) := by + simpa only [Real.norm_eq_abs] using hconv.norm + have hconvENN : + Filter.Tendsto + (fun n => ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g|) + Filter.atTop (nhds (ENNReal.ofReal |cubeBesovPairing Q f g|)) := + ENNReal.tendsto_ofReal hconvAbs + have hbound : ∀ n : ℕ, + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ B := by + intro n + have hlocalG : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R g) (ENNReal.ofReal p') + (normalizedCubeMeasure R) := by + intro j _hj R hR + exact cubeFluctuation_memLp_of_parent_memLp Q p' hg j R hR + have hlocalF : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) f) + (cubeBesovConjExponent (ENNReal.ofReal p')) + (normalizedCubeMeasure R) := by + intro j _hj R hR + rw [hpTestDouble] + exact cubeProjection_memLp_of_parent_descendant Q P.p f (j + 1) j R hR + have hpair := + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNormOne_cubeBesovCircPartialNormTop + (Q := Q) (s := P.s) (p := ENNReal.ofReal p') (f := g) (g := f) (N := n) + hfInt hpTest ENNReal.ofReal_ne_top hpTestDoubleTop hlocalG hlocalF + have hoverlapENN : + ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') 1 n g) ≤ + exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) hg) := by + simpa only [ExactDualTopParameters.positiveParameters, p', ENNReal.ofReal_one] using + exactAggregation_overlapPartialNorm_le_exactOverlapFiniteNorm + P.positiveParameters Q g hg n + have hoverlapLeOne : + cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') 1 n g ≤ 1 := by + rw [← ENNReal.ofReal_le_one] + exact hoverlapENN.trans hgNorm + have hdisjoint : + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') 1 n g ≤ C := by + calc + cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') 1 n g ≤ + C * cubeBesovOverlapPartialNorm Q P.s (ENNReal.ofReal p') 1 n g := by + simpa only [C, hp'_toReal] using + cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm + (p := ENNReal.ofReal p') (q := (1 : ℝ≥0∞)) Q P.s + (by rw [hp'_toReal]; exact hp'_pos) (by norm_num) n g + _ ≤ C * 1 := by + exact mul_le_mul_of_nonneg_left hoverlapLeOne + (Real.rpow_nonneg (by norm_num) _) + _ = C := mul_one C + have hK_nonneg : 0 ≤ K := by + exact le_trans zero_le_one (le_max_left 1 ((3 : ℝ) ^ P.s)) + have hC_nonneg : 0 ≤ C := Real.rpow_nonneg (by norm_num) _ + have hlegacyCircNonneg : + 0 ≤ cubeBesovCircPartialNormTop Q P.s (ENNReal.ofReal P.p) (n + 1) f := + cubeBesovCircPartialNormTop_nonneg Q P.s (ENNReal.ofReal P.p) (n + 1) f + have hpairReal : + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + (K * C) * cubeBesovCircPartialNormTop Q P.s + (ENNReal.ofReal P.p) (n + 1) f := by + calc + |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| = + |cubeBesovPairing Q g (cubeProjection Q (n + 1) f)| := by + simp only [cubeBesovPairing, mul_comm] + _ ≤ K * cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') 1 n g * + cubeBesovCircPartialNormTop Q P.s + (cubeBesovConjExponent (ENNReal.ofReal p')) (n + 1) f := by + simpa only [K] using hpair + _ = K * cubeBesovPartialNorm Q P.s (ENNReal.ofReal p') 1 n g * + cubeBesovCircPartialNormTop Q P.s (ENNReal.ofReal P.p) (n + 1) f := by + rw [hpTestDouble] + _ ≤ (K * C) * cubeBesovCircPartialNormTop Q P.s + (ENNReal.ofReal P.p) (n + 1) f := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hdisjoint hK_nonneg) hlegacyCircNonneg + have hcircENN : + ENNReal.ofReal + (cubeBesovCircPartialNormTop Q P.s (ENNReal.ofReal P.p) (n + 1) f) ≤ + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + simpa only [ExactDualTopParameters.circParameters] using + exactAggregation_circPartialNormTop_le_exactCircTopSeminorm + P.circParameters Q f hf (n + 1) + have hcoeff : ENNReal.ofReal (K * C) ≤ + ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + P.s)) := by + simpa only [K, C, p'] using + exactCircLossCoefficientENNReal_le_source d P.s + (exactDualConjExponent P.p) P.s_pos.le hp'_one_le + have hsource : ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + P.s)) = + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) := by + rw [← ENNReal.ofReal_rpow_of_nonneg] + · norm_num + · norm_num + · exact add_nonneg (Nat.cast_nonneg d) P.s_pos.le + calc + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) f) g| ≤ + ENNReal.ofReal + ((K * C) * cubeBesovCircPartialNormTop Q P.s + (ENNReal.ofReal P.p) (n + 1) f) := + ENNReal.ofReal_le_ofReal hpairReal + _ = ENNReal.ofReal (K * C) * + ENNReal.ofReal + (cubeBesovCircPartialNormTop Q P.s (ENNReal.ofReal P.p) (n + 1) f) := by + rw [ENNReal.ofReal_mul (mul_nonneg hK_nonneg hC_nonneg)] + _ ≤ ENNReal.ofReal (K * C) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := + mul_le_mul_right hcircENN _ + _ ≤ ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + P.s)) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := + mul_le_mul_left hcoeff _ + _ = B := by rw [hsource] + have hlimit : ENNReal.ofReal |cubeBesovPairing Q f g| ≤ B := + le_of_tendsto hconvENN (Filter.Eventually.of_forall hbound) + calc + exactDualPairingFromHolder Q P.p f g P.p_one_lt hf hg = + ENNReal.ofReal |cubeBesovPairing Q f g| := by + change exactDualNormalizedPairing Q f g _ = _ + exact exactDualNormalizedPairing_eq_of_cubeBesovPairing Q f g _ + _ ≤ B := hlimit + +/-- The exact hatted negative `q = ∞` seminorm is bounded by the exact +concrete circ endpoint with the Chapter 1 coefficient. -/ +theorem exactDualTopHattedSeminorm_le_exactCircTopSeminorm + {d : ℕ} (P : ExactDualTopParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualTopHattedSeminorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + rw [exactDualTopHattedSeminorm_eq] + refine iSup_le fun T => ?_ + have hnorm : exactOverlapFiniteNorm P.positiveParameters Q T.g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) T.parentMemLp) ≤ 1 := by + rw [exactOverlapFiniteNorm_eq, T.root_mean_zero] + simpa only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] using T.seminorm_le_one + exact exactDualTopPairing_le_exactCircTopSeminorm + P Q f T.g hf T.parentMemLp hnorm + +/-- The exact full negative `q = ∞` norm obeys the manuscript comparison. +The depth-zero circ term already controls the root contribution; the explicit +nonnegative source root term is retained in the stated right-hand side. -/ +theorem exactDualTopFullNorm_le_exactCircTopSeminorm_add_root + {d : ℕ} (P : ExactDualTopParameters) (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualTopFullNorm P Q f hf ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + exactCircDepthWeight Q P.s 0 * ENNReal.ofReal |cubeAverage Q f| := by + rw [exactDualTopFullNorm_eq] + calc + (⨆ T : ExactDualTopFullTest P Q, T.pairing hf) ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := by + refine iSup_le fun T => ?_ + exact exactDualTopPairing_le_exactCircTopSeminorm + P Q f T.g hf T.parentMemLp T.norm_le_one + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + P.s) * + exactCircTopSeminorm P.circParameters Q f + (exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + exactCircDepthWeight Q P.s 0 * ENNReal.ofReal |cubeAverage Q f| := + le_add_of_nonneg_right bot_le + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactDual.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactDual.lean new file mode 100644 index 0000000000..ad3c2c484e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactDual.lean @@ -0,0 +1,677 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap + +/-! +# Exact dual-negative Besov kernel + +This module records the three Chapter 1 negative Besov endpoint branches as +duals of the exact overlapping positive Besov kernel. The source exponents +remain real; their `ENNReal` images are used only for `MemLp` and the extended +supremum which deliberately retains `∞`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-- The finite real Hölder conjugate used by the exact dual branches. -/ +noncomputable def exactDualConjExponent (p : ℝ) : ℝ := + Real.conjExponent p + +theorem exactDualConjExponent_holder (p : ℝ) (hp : 1 < p) : + p.HolderConjugate (exactDualConjExponent p) := by + exact Real.HolderConjugate.conjExponent hp + +theorem exactDualConjExponent_one_lt (p : ℝ) (hp : 1 < p) : + 1 < exactDualConjExponent p := by + exact (exactDualConjExponent_holder p hp).symm.lt + +theorem exactDualConjExponent_one_le (p : ℝ) (hp : 1 < p) : + 1 ≤ exactDualConjExponent p := + (exactDualConjExponent_one_lt p hp).le +private theorem exactDualHolderConjugateENNReal (p : ℝ) (hp : 1 < p) : + ENNReal.HolderConjugate (ENNReal.ofReal p) + (ENNReal.ofReal (exactDualConjExponent p)) := by + let h := exactDualConjExponent_holder p hp + exact h.ennrealOfReal + +/-- The normalized absolute pairing used in the exact negative definitions. +Its integrability proof is an explicit argument: no totalized integral is +used as a substitute for the Hölder side condition. -/ +noncomputable def exactDualNormalizedPairing {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) + (_hfg : MeasureTheory.Integrable (fun x => f x * g x) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ENNReal.ofReal |∫ x, f x * g x ∂Homogenization.normalizedCubeMeasure Q| + +theorem exactDualNormalizedPairing_eq {d : ℕ} (Q : TriadicCube d) + (f g : Vec d → ℝ) + (hfg : MeasureTheory.Integrable (fun x => f x * g x) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualNormalizedPairing Q f g hfg = + ENNReal.ofReal |∫ x, f x * g x ∂Homogenization.normalizedCubeMeasure Q| := + rfl + +/-- The normalized absolute pairing obtained from the displayed Hölder data. -/ +noncomputable def exactDualPairingFromHolder {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (f g : Vec d → ℝ) + (hp : 1 < p) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.ofReal (exactDualConjExponent p)) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + exactDualNormalizedPairing Q f g (by + let : ENNReal.HolderConjugate (ENNReal.ofReal p) + (ENNReal.ofReal (exactDualConjExponent p)) := + exactDualHolderConjugateENNReal p hp + simpa only [Pi.mul_apply] using! hf.integrable_mul hg) + +theorem exactDualPairingFromHolder_eq {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (f g : Vec d → ℝ) + (hp : 1 < p) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.ofReal (exactDualConjExponent p)) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualPairingFromHolder Q p f g hp hf hg = + ENNReal.ofReal |∫ x, f x * g x ∂Homogenization.normalizedCubeMeasure Q| := + rfl + +theorem exactDualPairingFromHolder_congr_ae {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (f f' g : Vec d → ℝ) (hp : 1 < p) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (hf' : MeasureTheory.MemLp f' (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.ofReal (exactDualConjExponent p)) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualPairingFromHolder Q p f g hp hf hg = + exactDualPairingFromHolder Q p f' g hp hf' hg := by + rw [exactDualPairingFromHolder_eq, exactDualPairingFromHolder_eq] + apply congrArg ENNReal.ofReal + apply congrArg abs + apply MeasureTheory.integral_congr_ae + filter_upwards [hff'] with x hx + rw [hx] + +/-- Negative `q = 1` source parameters. The positive test space has +`q' = ∞`, including the allowed `s = 1` endpoint. -/ +structure ExactDualQOneParameters where + /-- Negative smoothness exponent. -/ + s : ℝ + /-- Data integrability exponent. -/ + p : ℝ + s_pos : 0 < s + s_le_one : s ≤ 1 + p_one_lt : 1 < p + +/-- Negative finite interior source parameters. -/ +structure ExactDualFiniteParameters where + /-- Negative smoothness exponent. -/ + s : ℝ + /-- Data integrability exponent. -/ + p : ℝ + /-- Finite negative aggregation exponent. -/ + q : ℝ + s_pos : 0 < s + s_lt_one : s < 1 + p_one_lt : 1 < p + q_one_lt : 1 < q + +/-- Negative `q = ∞` source parameters. The positive test space has +`q' = 1`. -/ +structure ExactDualTopParameters where + /-- Negative smoothness exponent. -/ + s : ℝ + /-- Data integrability exponent. -/ + p : ℝ + s_pos : 0 < s + s_lt_one : s < 1 + p_one_lt : 1 < p + +/-- The exact positive `q' = infinity` parameters used to test this branch. -/ +noncomputable def ExactDualQOneParameters.positiveParameters + (P : ExactDualQOneParameters) : ExactOverlapTopParameters where + s := P.s + p := exactDualConjExponent P.p + admissible := ⟨P.s_pos, P.s_le_one, exactDualConjExponent_one_le P.p P.p_one_lt⟩ + +/-- The exact finite positive Hölder-conjugate test parameters. -/ +noncomputable def ExactDualFiniteParameters.positiveParameters + (P : ExactDualFiniteParameters) : ExactOverlapFiniteParameters where + s := P.s + p := exactDualConjExponent P.p + q := exactDualConjExponent P.q + admissible := ⟨P.s_pos, P.s_lt_one, + exactDualConjExponent_one_le P.p P.p_one_lt, + exactDualConjExponent_one_le P.q P.q_one_lt⟩ + +/-- The exact positive `q' = 1` test parameters. -/ +noncomputable def ExactDualTopParameters.positiveParameters + (P : ExactDualTopParameters) : ExactOverlapFiniteParameters where + s := P.s + p := exactDualConjExponent P.p + q := 1 + admissible := ⟨P.s_pos, P.s_lt_one, + exactDualConjExponent_one_le P.p P.p_one_lt, le_rfl⟩ + +/-- A positive parent `MemLp` certificate supplies every certified root and +overlap-local integral required by the exact positive kernel. -/ +theorem exactDualOverlapIntegrable {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (hp : 1 ≤ p) {g : Vec d → ℝ} + (hg : MeasureTheory.MemLp g (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) : ExactOverlapIntegrable Q g where + root := hg.integrable (ENNReal.one_le_ofReal.mpr hp) + overlap := fun _ _ hS => + (ScalarOverlap.memLp_of_mem_centersAtDepth_of_memLp hS hg).integrable + (ENNReal.one_le_ofReal.mpr hp) + +/-- Full positive-top test functions for the negative `q = 1` branch. -/ +structure ExactDualQOneFullTest {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + norm_le_one : exactOverlapTopNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + +/-- Mean-zero positive-top test functions for the hatted negative `q = 1` +branch. -/ +structure ExactDualQOneHattedTest {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + seminorm_le_one : exactOverlapTopSeminorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + root_mean_zero : exactOverlapRootMean Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp).root = 0 + +/-- Full finite positive tests for the negative finite interior branch. -/ +structure ExactDualFiniteFullTest {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + norm_le_one : exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + +/-- Mean-zero finite positive tests for the hatted negative finite branch. -/ +structure ExactDualFiniteHattedTest {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + seminorm_le_one : exactOverlapFiniteSeminorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + root_mean_zero : exactOverlapRootMean Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp).root = 0 + +/-- Full finite positive tests with positive `q' = 1` for the negative +`q = ∞` branch. -/ +structure ExactDualTopFullTest {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + norm_le_one : exactOverlapFiniteNorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + +/-- Mean-zero finite positive tests with `q' = 1` for the hatted negative +`q = ∞` branch. -/ +structure ExactDualTopHattedTest {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) where + /-- Test function. -/ + g : Vec d → ℝ + parentMemLp : MeasureTheory.MemLp g + (ENNReal.ofReal (exactDualConjExponent P.p)) + (Homogenization.normalizedCubeMeasure Q) + seminorm_le_one : exactOverlapFiniteSeminorm P.positiveParameters Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp) ≤ 1 + root_mean_zero : exactOverlapRootMean Q g + (exactDualOverlapIntegrable Q (exactDualConjExponent P.p) + (exactDualConjExponent_one_le P.p P.p_one_lt) parentMemLp).root = 0 + +/-- The certified normalized pairing against a full `q = 1` test. -/ +noncomputable def ExactDualQOneFullTest.pairing {d : ℕ} {P : ExactDualQOneParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualQOneFullTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- The certified normalized pairing against a hatted `q = 1` test. -/ +noncomputable def ExactDualQOneHattedTest.pairing {d : ℕ} {P : ExactDualQOneParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualQOneHattedTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- The certified normalized pairing against a full finite test. -/ +noncomputable def ExactDualFiniteFullTest.pairing {d : ℕ} {P : ExactDualFiniteParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualFiniteFullTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- The certified normalized pairing against a hatted finite test. -/ +noncomputable def ExactDualFiniteHattedTest.pairing {d : ℕ} {P : ExactDualFiniteParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualFiniteHattedTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- The certified normalized pairing against a full `q = infinity` test. -/ +noncomputable def ExactDualTopFullTest.pairing {d : ℕ} {P : ExactDualTopParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualTopFullTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- The certified normalized pairing against a hatted `q = infinity` test. -/ +noncomputable def ExactDualTopHattedTest.pairing {d : ℕ} {P : ExactDualTopParameters} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (T : ExactDualTopHattedTest P Q) : ℝ≥0∞ := + exactDualPairingFromHolder Q P.p f T.g P.p_one_lt hf T.parentMemLp + +/-- Exact negative `q = 1` full dual norm. -/ +noncomputable def exactDualQOneFullNorm {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualQOneFullTest P Q, T.pairing hf + +/-- Exact hatted negative `q = 1` seminorm. -/ +noncomputable def exactDualQOneHattedSeminorm {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualQOneHattedTest P Q, T.pairing hf + +/-- Exact negative finite interior full dual norm. -/ +noncomputable def exactDualFiniteFullNorm {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualFiniteFullTest P Q, T.pairing hf + +/-- Exact hatted negative finite interior seminorm. -/ +noncomputable def exactDualFiniteHattedSeminorm {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualFiniteHattedTest P Q, T.pairing hf + +/-- Exact negative `q = ∞` full dual norm. -/ +noncomputable def exactDualTopFullNorm {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualTopFullTest P Q, T.pairing hf + +/-- Exact hatted negative `q = ∞` seminorm. -/ +noncomputable def exactDualTopHattedSeminorm {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + ⨆ T : ExactDualTopHattedTest P Q, T.pairing hf + +theorem exactDualQOneFullNorm_eq {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualQOneFullNorm P Q f hf = ⨆ T : ExactDualQOneFullTest P Q, T.pairing hf := rfl + +theorem exactDualQOneHattedSeminorm_eq {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualQOneHattedSeminorm P Q f hf = + ⨆ T : ExactDualQOneHattedTest P Q, T.pairing hf := rfl + +theorem exactDualFiniteFullNorm_eq {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualFiniteFullNorm P Q f hf = ⨆ T : ExactDualFiniteFullTest P Q, T.pairing hf := rfl + +theorem exactDualFiniteHattedSeminorm_eq {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualFiniteHattedSeminorm P Q f hf = + ⨆ T : ExactDualFiniteHattedTest P Q, T.pairing hf := rfl + +theorem exactDualTopFullNorm_eq {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualTopFullNorm P Q f hf = ⨆ T : ExactDualTopFullTest P Q, T.pairing hf := rfl + +theorem exactDualTopHattedSeminorm_eq {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualTopHattedSeminorm P Q f hf = + ⨆ T : ExactDualTopHattedTest P Q, T.pairing hf := rfl + +theorem exactDualQOneFullNorm_congr_ae {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualQOneFullNorm P Q f hf = exactDualQOneFullNorm P Q f' (hf.ae_eq hff') := by + rw [exactDualQOneFullNorm_eq, exactDualQOneFullNorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +theorem exactDualQOneHattedSeminorm_congr_ae {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualQOneHattedSeminorm P Q f hf = + exactDualQOneHattedSeminorm P Q f' (hf.ae_eq hff') := by + rw [exactDualQOneHattedSeminorm_eq, exactDualQOneHattedSeminorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +theorem exactDualFiniteFullNorm_congr_ae {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualFiniteFullNorm P Q f hf = exactDualFiniteFullNorm P Q f' (hf.ae_eq hff') := by + rw [exactDualFiniteFullNorm_eq, exactDualFiniteFullNorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +theorem exactDualFiniteHattedSeminorm_congr_ae {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualFiniteHattedSeminorm P Q f hf = + exactDualFiniteHattedSeminorm P Q f' (hf.ae_eq hff') := by + rw [exactDualFiniteHattedSeminorm_eq, exactDualFiniteHattedSeminorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +theorem exactDualTopFullNorm_congr_ae {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualTopFullNorm P Q f hf = exactDualTopFullNorm P Q f' (hf.ae_eq hff') := by + rw [exactDualTopFullNorm_eq, exactDualTopFullNorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +theorem exactDualTopHattedSeminorm_congr_ae {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) {f f' : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) + (hff' : f =ᵐ[Homogenization.normalizedCubeMeasure Q] f') : + exactDualTopHattedSeminorm P Q f hf = + exactDualTopHattedSeminorm P Q f' (hf.ae_eq hff') := by + rw [exactDualTopHattedSeminorm_eq, exactDualTopHattedSeminorm_eq] + apply congrArg iSup + funext T + exact exactDualPairingFromHolder_congr_ae Q P.p f f' T.g P.p_one_lt hf + (hf.ae_eq hff') T.parentMemLp hff' + +private theorem exactDualDepthAverage_zero {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (hp : 0 < p) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) + (j : ℕ) : + exactOverlapDepthAverage Q p (fun _ => (0 : ℝ)) hu j = 0 := by + simp only [exactOverlapDepthAverage_eq, exactOverlapLocalOscillation_zero, + ENNReal.zero_rpow_of_pos hp, Finset.sum_const_zero, mul_zero] + +private theorem exactDualDepthTerm_zero {d : ℕ} (Q : TriadicCube d) + (s p : ℝ) (hp : 0 < p) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) + (j : ℕ) : + exactOverlapDepthTerm Q s p (fun _ => (0 : ℝ)) hu j = 0 := by + unfold exactOverlapDepthTerm + rw [exactDualDepthAverage_zero Q p hp hu j, + ENNReal.zero_rpow_of_pos (inv_pos.mpr hp), mul_zero] + +private theorem exactDualFiniteSeminorm_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) : + exactOverlapFiniteSeminorm P Q (fun _ => (0 : ℝ)) hu = 0 := by + rw [exactOverlapFiniteSeminorm_eq] + have hq : 0 < P.q := lt_of_lt_of_le zero_lt_one P.q_one_le + have hp : 0 < P.p := lt_of_lt_of_le zero_lt_one P.p_one_le + simp_rw [exactDualDepthTerm_zero Q P.s P.p hp hu, + ENNReal.zero_rpow_of_pos hq] + rw [tsum_zero, ENNReal.zero_rpow_of_pos] + exact inv_pos.mpr hq + +private theorem exactDualTopSeminorm_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) : + exactOverlapTopSeminorm P Q (fun _ => (0 : ℝ)) hu = 0 := by + rw [exactOverlapTopSeminorm_eq] + have hp : 0 < P.p := lt_of_lt_of_le zero_lt_one P.p_one_le + simp_rw [exactDualDepthTerm_zero Q P.s P.p hp hu] + exact iSup_const + +private theorem exactDualFiniteNorm_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) : + exactOverlapFiniteNorm P Q (fun _ => (0 : ℝ)) hu = 0 := by + rw [exactOverlapFiniteNorm_eq, exactDualFiniteSeminorm_zero P Q hu, + exactOverlapRootMean_zero] + simp only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] + +private theorem exactDualTopNorm_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (hu : ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ))) : + exactOverlapTopNorm P Q (fun _ => (0 : ℝ)) hu = 0 := by + rw [exactOverlapTopNorm_eq, exactDualTopSeminorm_zero P Q hu, + exactOverlapRootMean_zero] + simp only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] + +/-- The zero full test in the exact `q = 1` branch. -/ +noncomputable def exactDualQOneFullZeroTest {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : ExactDualQOneFullTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + norm_le_one := by + rw [exactDualTopNorm_zero] + exact zero_le_one + +/-- The zero hatted test in the exact `q = 1` branch. -/ +noncomputable def exactDualQOneHattedZeroTest {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : ExactDualQOneHattedTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + seminorm_le_one := by + rw [exactDualTopSeminorm_zero] + exact zero_le_one + root_mean_zero := exactOverlapRootMean_zero Q _ + +/-- The zero full test in the finite interior branch. -/ +noncomputable def exactDualFiniteFullZeroTest {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : ExactDualFiniteFullTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + norm_le_one := by + rw [exactDualFiniteNorm_zero] + exact zero_le_one + +/-- The zero hatted test in the finite interior branch. -/ +noncomputable def exactDualFiniteHattedZeroTest {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : ExactDualFiniteHattedTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + seminorm_le_one := by + rw [exactDualFiniteSeminorm_zero] + exact zero_le_one + root_mean_zero := exactOverlapRootMean_zero Q _ + +/-- The zero full test in the `q = infinity` branch. -/ +noncomputable def exactDualTopFullZeroTest {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : ExactDualTopFullTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + norm_le_one := by + rw [exactDualFiniteNorm_zero] + exact zero_le_one + +/-- The zero hatted test in the `q = infinity` branch. -/ +noncomputable def exactDualTopHattedZeroTest {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : ExactDualTopHattedTest P Q where + g := fun _ => 0 + parentMemLp := MeasureTheory.memLp_const (0 : ℝ) + seminorm_le_one := by + rw [exactDualFiniteSeminorm_zero] + exact zero_le_one + root_mean_zero := exactOverlapRootMean_zero Q _ + +theorem exactDualQOneFullTest_nonempty {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : Nonempty (ExactDualQOneFullTest P Q) := + ⟨exactDualQOneFullZeroTest P Q⟩ + +theorem exactDualQOneHattedTest_nonempty {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : Nonempty (ExactDualQOneHattedTest P Q) := + ⟨exactDualQOneHattedZeroTest P Q⟩ + +theorem exactDualFiniteFullTest_nonempty {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : Nonempty (ExactDualFiniteFullTest P Q) := + ⟨exactDualFiniteFullZeroTest P Q⟩ + +theorem exactDualFiniteHattedTest_nonempty {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : Nonempty (ExactDualFiniteHattedTest P Q) := + ⟨exactDualFiniteHattedZeroTest P Q⟩ + +theorem exactDualTopFullTest_nonempty {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : Nonempty (ExactDualTopFullTest P Q) := + ⟨exactDualTopFullZeroTest P Q⟩ + +theorem exactDualTopHattedTest_nonempty {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : Nonempty (ExactDualTopHattedTest P Q) := + ⟨exactDualTopHattedZeroTest P Q⟩ + +/-- The canonical parent-space certificate for zero data in any finite real +exponent used by the exact dual objects. -/ +theorem exactDualZeroMemLp {d : ℕ} (Q : TriadicCube d) (p : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (0 : ℝ) + +theorem exactDualPairingFromHolder_zero_left {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (g : Vec d → ℝ) (hp : 1 < p) + (hzero : MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.ofReal (exactDualConjExponent p)) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualPairingFromHolder Q p (fun _ => (0 : ℝ)) g hp hzero hg = 0 := by + rw [exactDualPairingFromHolder_eq] + simp only [zero_mul, MeasureTheory.integral_zero, abs_zero, + ENNReal.ofReal_zero] + +private theorem exactDual_iSup_zero {ι : Sort*} (a : ι → ℝ≥0∞) + (ha : ∀ i, a i = 0) : (⨆ i, a i) = 0 := by + apply le_antisymm + · refine iSup_le fun i => ?_ + rw [ha i] + · exact bot_le + +theorem exactDualQOneFullNorm_zero {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : + exactDualQOneFullNorm P Q (fun _ => (0 : ℝ)) (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualQOneFullNorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +theorem exactDualQOneHattedSeminorm_zero {d : ℕ} (P : ExactDualQOneParameters) + (Q : TriadicCube d) : + exactDualQOneHattedSeminorm P Q (fun _ => (0 : ℝ)) (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualQOneHattedSeminorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +theorem exactDualFiniteFullNorm_zero {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : + exactDualFiniteFullNorm P Q (fun _ => (0 : ℝ)) (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualFiniteFullNorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +theorem exactDualFiniteHattedSeminorm_zero {d : ℕ} (P : ExactDualFiniteParameters) + (Q : TriadicCube d) : + exactDualFiniteHattedSeminorm P Q (fun _ => (0 : ℝ)) + (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualFiniteHattedSeminorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +theorem exactDualTopFullNorm_zero {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : + exactDualTopFullNorm P Q (fun _ => (0 : ℝ)) (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualTopFullNorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +theorem exactDualTopHattedSeminorm_zero {d : ℕ} (P : ExactDualTopParameters) + (Q : TriadicCube d) : + exactDualTopHattedSeminorm P Q (fun _ => (0 : ℝ)) (exactDualZeroMemLp Q P.p) = 0 := by + rw [exactDualTopHattedSeminorm_eq] + apply exactDual_iSup_zero + intro T + exact exactDualPairingFromHolder_zero_left Q P.p T.g P.p_one_lt + (exactDualZeroMemLp Q P.p) T.parentMemLp + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactExponentBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactExponentBridge.lean new file mode 100644 index 0000000000..abe654e399 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactExponentBridge.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactDual + +/-! +# Exponent and coefficient bridges for exact Besov duality + +This module contains only arithmetic and parameter-carrier bridges. In +particular, it does not compare an extended exact seminorm with a legacy +real-valued wrapper. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-- The legacy extended conjugate of a finite real exponent agrees with the +real Hölder conjugate used by the exact dual kernel. -/ +theorem cubeBesovConjExponent_ofReal_eq_exactDualConjExponent (p : ℝ) (hp : 1 < p) : + cubeBesovConjExponent (ENNReal.ofReal p) = + ENNReal.ofReal (exactDualConjExponent p) := by + let : ENNReal.HolderConjugate (ENNReal.ofReal p) + (ENNReal.ofReal (exactDualConjExponent p)) := + (exactDualConjExponent_holder p hp).ennrealOfReal + simpa only [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := ENNReal.ofReal p) (q := ENNReal.ofReal (exactDualConjExponent p))) + +/-- Conjugating the finite exact-dual exponent recovers its source exponent. -/ +theorem cubeBesovConjExponent_exactDualConjExponent_eq_ofReal (p : ℝ) (hp : 1 < p) : + cubeBesovConjExponent (ENNReal.ofReal (exactDualConjExponent p)) = + ENNReal.ofReal p := by + let : ENNReal.HolderConjugate (ENNReal.ofReal (exactDualConjExponent p)) + (ENNReal.ofReal p) := + (exactDualConjExponent_holder p hp).symm.ennrealOfReal + simpa only [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := ENNReal.ofReal (exactDualConjExponent p)) (q := ENNReal.ofReal p)) + +/-- The finite-real conjugate used by the exact dual kernel is never `∞`. -/ +theorem cubeBesovConjExponent_ofReal_ne_top (p : ℝ) (hp : 1 < p) : + cubeBesovConjExponent (ENNReal.ofReal p) ≠ ∞ := by + rw [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent p hp] + exact ENNReal.ofReal_ne_top + +/-- The finite-real conjugate used by the exact dual kernel is at least one. -/ +theorem cubeBesovConjExponent_ofReal_one_le (p : ℝ) (hp : 1 < p) : + 1 ≤ cubeBesovConjExponent (ENNReal.ofReal p) := by + rw [cubeBesovConjExponent_ofReal_eq_exactDualConjExponent p hp, + ← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal (exactDualConjExponent_one_le p hp) + +/-- The endpoint `q = 1` has conjugate exponent `∞`. -/ +theorem cubeBesovConjExponent_one : cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simp [cubeBesovConjExponent, ENNReal.conjExponent] + +/-- The endpoint `q = ∞` has conjugate exponent one. -/ +theorem cubeBesovConjExponent_top : cubeBesovConjExponent (∞ : ℝ≥0∞) = 1 := by + simp [cubeBesovConjExponent, ENNReal.conjExponent] + +/-- A finite source `q > 1` has the finite real Hölder conjugate expected by +the exact positive test lane. -/ +theorem cubeBesovConjExponent_ofReal_finite (q : ℝ) (hq : 1 < q) : + cubeBesovConjExponent (ENNReal.ofReal q) = + ENNReal.ofReal (exactDualConjExponent q) := + cubeBesovConjExponent_ofReal_eq_exactDualConjExponent q hq + +/-- The legacy conjugate exponent is nonzero on the finite exact-dual range. -/ +theorem cubeBesovConjExponent_ofReal_ne_zero (p : ℝ) (hp : 1 < p) : + cubeBesovConjExponent (ENNReal.ofReal p) ≠ 0 := by + intro hzero + have hone := cubeBesovConjExponent_ofReal_one_le p hp + rw [hzero] at hone + norm_num at hone + +/-- The overlap/projection loss coefficient is bounded by the Chapter 1 +coefficient. All exponents are real and finite in this bridge. -/ +theorem exactCircLossCoefficient_le_source (d : ℕ) (s p' : ℝ) + (hs : 0 ≤ s) (hp' : 1 ≤ p') : + max 1 ((3 : ℝ) ^ s) * (3 : ℝ) ^ ((d : ℝ) / p') ≤ + (3 : ℝ) ^ ((d : ℝ) + s) := by + have hp'_pos : 0 < p' := lt_of_lt_of_le zero_lt_one hp' + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hd_div_le : (d : ℝ) / p' ≤ (d : ℝ) := by + rw [div_le_iff₀ hp'_pos] + exact le_mul_of_one_le_right hd_nonneg hp' + have hmax : max 1 ((3 : ℝ) ^ s) = (3 : ℝ) ^ s := + max_eq_right (Real.one_le_rpow (by norm_num) hs) + rw [hmax] + calc + (3 : ℝ) ^ s * (3 : ℝ) ^ ((d : ℝ) / p') ≤ + (3 : ℝ) ^ s * (3 : ℝ) ^ (d : ℝ) := by + exact mul_le_mul_of_nonneg_left + (Real.rpow_le_rpow_of_exponent_le (by norm_num) hd_div_le) + (Real.rpow_nonneg (by positivity) _) + _ = (3 : ℝ) ^ ((d : ℝ) + s) := by + rw [← Real.rpow_add (by norm_num : 0 < (3 : ℝ))] + ring_nf + +/-- `ENNReal` form of `exactCircLossCoefficient_le_source`, ready to multiply +by an extended circ value. -/ +theorem exactCircLossCoefficientENNReal_le_source (d : ℕ) (s p' : ℝ) + (hs : 0 ≤ s) (hp' : 1 ≤ p') : + ENNReal.ofReal (max 1 ((3 : ℝ) ^ s) * (3 : ℝ) ^ ((d : ℝ) / p')) ≤ + ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + s)) := + ENNReal.ofReal_le_ofReal (exactCircLossCoefficient_le_source d s p' hs hp') + +/-- Rpow-form `ENNReal` version of the loss bound, directly composable with +an extended circ seminorm. -/ +theorem exactCircLossCoefficientENNReal_rpow_le_source (d : ℕ) (s p' : ℝ) + (hs : 0 ≤ s) (hp' : 1 ≤ p') : + max 1 ((3 : ℝ≥0∞) ^ s) * (3 : ℝ≥0∞) ^ ((d : ℝ) / p') ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + s) := by + have hp'_pos : 0 < p' := lt_of_lt_of_le zero_lt_one hp' + have hd_div_nonneg : 0 ≤ (d : ℝ) / p' := + div_nonneg (Nat.cast_nonneg d) hp'_pos.le + have hd_add_nonneg : 0 ≤ (d : ℝ) + s := + add_nonneg (Nat.cast_nonneg d) hs + have hleft_nonneg : 0 ≤ max 1 ((3 : ℝ) ^ s) := + zero_le_one.trans (le_max_left _ _) + have hleft : + ENNReal.ofReal (max 1 ((3 : ℝ) ^ s) * (3 : ℝ) ^ ((d : ℝ) / p')) = + max 1 ((3 : ℝ≥0∞) ^ s) * (3 : ℝ≥0∞) ^ ((d : ℝ) / p') := by + rw [ENNReal.ofReal_mul hleft_nonneg, ENNReal.ofReal_max, + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) hs, + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) hd_div_nonneg] + norm_num + have hright : ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + s)) = + (3 : ℝ≥0∞) ^ ((d : ℝ) + s) := by + rw [← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) hd_add_nonneg] + norm_num + calc + max 1 ((3 : ℝ≥0∞) ^ s) * (3 : ℝ≥0∞) ^ ((d : ℝ) / p') = + ENNReal.ofReal (max 1 ((3 : ℝ) ^ s) * (3 : ℝ) ^ ((d : ℝ) / p')) := hleft.symm + _ ≤ ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) + s)) := + exactCircLossCoefficientENNReal_le_source d s p' hs hp' + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) + s) := hright + +/-- The `q = 1` dual branch supplies an admissible finite-`q` circ parameter +with circ exponent one. -/ +noncomputable def ExactDualQOneParameters.circParameters + (P : ExactDualQOneParameters) : ExactCircFiniteParameters where + s := P.s + p := P.p + q := 1 + admissible := ⟨P.s_pos, P.s_le_one, P.p_one_lt.le, le_rfl, fun _ => rfl⟩ + +/-- An interior finite dual branch supplies the matching finite circ branch. -/ +noncomputable def ExactDualFiniteParameters.circParameters + (P : ExactDualFiniteParameters) : ExactCircFiniteParameters where + s := P.s + p := P.p + q := P.q + admissible := ⟨P.s_pos, P.s_lt_one.le, P.p_one_lt.le, P.q_one_lt.le, by + intro hs + exact False.elim ((ne_of_lt P.s_lt_one) hs)⟩ + +/-- The `q = ∞` dual branch supplies the matching top circ branch. -/ +noncomputable def ExactDualTopParameters.circParameters + (P : ExactDualTopParameters) : ExactCircTopParameters where + s := P.s + p := P.p + admissible := ⟨P.s_pos, P.s_lt_one, P.p_one_lt.le⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactFiniteBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactFiniteBridge.lean new file mode 100644 index 0000000000..3ab4883fa8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Negative/ExactFiniteBridge.lean @@ -0,0 +1,328 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCirc +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactDual + +/-! +# Finite projected-pairing bridges for the exact Chapter 1 kernels + +These lemmas isolate the pieces of the exact kernels that agree literally with +the finite projected-pairing infrastructure: normalized cube averages, +ordinary descendant-block means, and parent-to-block integrability transport. +They deliberately do not identify the extended exact aggregations with the +legacy real-valued partial norms. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +private theorem cubeScaleFactor_div_pow_eq_sourceZPow {d : ℕ} (Q : TriadicCube d) + (j : ℕ) : + cubeScaleFactor Q / (3 : ℝ) ^ j = (3 : ℝ) ^ (Q.scale - (j : ℤ)) := by + unfold cubeScaleFactor + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + +/-- The exact overlap scale weight is the extended embedding of the legacy +overlap weight at the same source depth. -/ +theorem exactOverlapDepthWeight_eq_ofReal_legacy {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (j : ℕ) : + exactOverlapDepthWeight Q s j = + ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j) := by + unfold exactOverlapDepthWeight cubeBesovOverlapDepthWeight cubeBesovDepthWeight + rw [cubeScaleFactor_div_pow_eq_sourceZPow] + rw [← Real.rpow_intCast (3 : ℝ) (Q.scale - (j : ℤ)), + ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + rw [← ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + congr 1 + · norm_num + · change -(((Q.scale - (j : ℤ) : ℤ) : ℝ)) * s = + ((Q.scale - (j : ℤ) : ℤ) : ℝ) * -s + ring + +/-- The exact root weight is the extended embedding of the legacy root-scale +weight. -/ +theorem exactOverlapRootWeight_eq_ofReal_legacy {d : ℕ} (Q : TriadicCube d) + (s : ℝ) : + exactOverlapRootWeight Q s = ENNReal.ofReal (cubeBesovScaleWeight s Q) := by + rw [← exactOverlapDepthWeight_zero Q s, + exactOverlapDepthWeight_eq_ofReal_legacy] + simp [cubeBesovOverlapDepthWeight, cubeBesovDepthWeight_depth_zero] + +/-- The exact circ scale weight is the extended embedding of the legacy circ +weight at the same source depth. -/ +theorem exactCircDepthWeight_eq_ofReal_legacy {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (j : ℕ) : + exactCircDepthWeight Q s j = + ENNReal.ofReal (cubeBesovCircDepthWeight Q s j) := by + unfold exactCircDepthWeight cubeBesovCircDepthWeight + rw [cubeScaleFactor_div_pow_eq_sourceZPow] + rw [← Real.rpow_intCast (3 : ℝ) (Q.scale - (j : ℤ)), + ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + rw [← ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + congr 1 + norm_num + +/-- Parent `MemLp` data at an admissible finite source exponent gives the +certified ordinary descendant-block integrals needed by the exact circ kernel. +-/ +theorem exactCircIntegrable_of_memLp {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (hp : 1 ≤ p) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) : ExactCircIntegrable Q f where + block := fun _ _ hR => + (memLp_on_descendant_of_memLp hR hf).integrable + (ENNReal.one_le_ofReal.mpr hp) + +/-- Parent `MemLp` data supplies the local fluctuation premise used by the +finite projected-pairing bound on every ordinary descendant block. -/ +theorem cubeFluctuation_memLp_of_parent_memLp {d : ℕ} (Q : TriadicCube d) + (p : ℝ) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) + (j : ℕ) (R : TriadicCube d) (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp (cubeFluctuation R f) (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure R) := by + exact (memLp_on_descendant_of_memLp hR hf).sub + (MeasureTheory.memLp_const (cubeAverage R f)) + +/-- Every finite projection has the local `MemLp` premise required by the +projected-pairing bound after restricting it to an ordinary descendant block. -/ +theorem cubeProjection_memLp_of_parent_descendant {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (f : Vec d → ℝ) (k j : ℕ) (R : TriadicCube d) + (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp (cubeProjection Q k f) (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure R) := by + exact memLp_on_descendant_of_memLp hR (cubeProjection_memLp Q k (ENNReal.ofReal p) f) + +/-- The exact proof-carrying pairing is the absolute value of the legacy cube +pairing, embedded in `ENNReal`; its supplied product-integrability proof rules +out any undefined-integral interpretation. -/ +theorem exactDualNormalizedPairing_eq_of_cubeBesovPairing {d : ℕ} + (Q : TriadicCube d) (f g : Vec d → ℝ) + (hfg : MeasureTheory.Integrable (fun x => f x * g x) + (Homogenization.normalizedCubeMeasure Q)) : + exactDualNormalizedPairing Q f g hfg = ENNReal.ofReal |cubeBesovPairing Q f g| := by + rw [exactDualNormalizedPairing_eq] + congr 1 + unfold cubeBesovPairing + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- A certified exact circ block mean is the ordinary normalized cube average +used by the finite projected-pairing development. -/ +theorem exactCircBlockMean_eq_cubeAverage {d : ℕ} (R : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f (Homogenization.normalizedCubeMeasure R)) : + exactCircBlockMean R f hf = cubeAverage R f := by + rw [exactCircBlockMean_eq, cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- The exact positive root mean is the ordinary normalized cube average used +by the finite projected-pairing development. -/ +theorem exactOverlapRootMean_eq_cubeAverage {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (Homogenization.normalizedCubeMeasure Q)) : + exactOverlapRootMean Q u hu = cubeAverage Q u := by + rw [exactOverlapRootMean, cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- A certified exact overlap mean is the normalized scalar-overlap cube +average used by the finite overlap definitions. -/ +theorem exactOverlapLocalMean_eq_scalarOverlapCubeAverage {d : ℕ} (S : TriadicCube d) + (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalMean S u hu = ScalarOverlap.cubeAverage S u := by + rw [exactOverlapLocalMean_eq, ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- At a finite exponent, parent/local `MemLp` makes the exact extended +oscillation precisely the `ENNReal` embedding of its legacy real counterpart. -/ +theorem exactOverlapLocalOscillation_eq_ofReal_cubeBesovOverlapOscillation + {d : ℕ} (S : TriadicCube d) (p : ℝ) (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal p) + (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalOscillation S (ENNReal.ofReal p) u hu = + ENNReal.ofReal (cubeBesovOverlapOscillation S (ENNReal.ofReal p) u) := by + have hsub : MeasureTheory.MemLp + (fun x => u x - exactOverlapLocalMean S u hu) (ENNReal.ofReal p) + (ScalarOverlap.normalizedCubeMeasure S) := + hmem.sub (MeasureTheory.memLp_const (exactOverlapLocalMean S u hu)) + rw [exactOverlapLocalOscillation_eq, ← ENNReal.ofReal_toReal hsub.eLpNorm_ne_top] + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [exactOverlapLocalMean_eq_scalarOverlapCubeAverage] at hsub ⊢ + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hsub.aestronglyMeasurable] + +/-- At a finite source exponent, the certified exact overlap depth average is +the `ENNReal` embedding of the legacy finite overlap average. -/ +theorem exactOverlapDepthAverage_eq_ofReal_cubeBesovOverlapDepthAverage + {d : ℕ} (Q : TriadicCube d) (p : ℝ) (hp : 1 ≤ p) (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) (j : ℕ) : + exactOverlapDepthAverage Q p u (exactDualOverlapIntegrable Q p hp hmem) j = + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q (ENNReal.ofReal p) u j) := by + have hp0 : 0 ≤ p := zero_le_one.trans hp + have hcard : (0 : ℝ) < ((ScalarOverlap.centersAtDepth Q j).card : ℝ) := by + exact_mod_cast ScalarOverlap.centersAtDepth_card_pos Q j + let g : TriadicCube d → ℝ≥0∞ := fun S => + if hS : S ∈ ScalarOverlap.centersAtDepth Q j then + (exactOverlapLocalOscillation S (ENNReal.ofReal p) u + ((exactDualOverlapIntegrable Q p hp hmem).overlap j S hS)) ^ p + else 0 + rw [exactOverlapDepthAverage_eq] + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + rw [ENNReal.ofReal_mul] + · rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast, + ENNReal.ofReal_sum_of_nonneg] + · congr 1 + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal p) u + ((exactDualOverlapIntegrable Q p hp hmem).overlap j S.1 S.2)) ^ p) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => g S.1) := by + apply Finset.sum_congr rfl + intro S hS + simp [g, S.2] + _ = (ScalarOverlap.centersAtDepth Q j).sum g := Finset.sum_attach _ _ + _ = (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S (ENNReal.ofReal p) u ^ + (ENNReal.ofReal p).toReal)) := by + apply Finset.sum_congr rfl + intro S hS + simp only [g, dif_pos hS] + rw [← ENNReal.ofReal_rpow_of_nonneg] + · rw [exactOverlapLocalOscillation_eq_ofReal_cubeBesovOverlapOscillation S p u + ((exactDualOverlapIntegrable Q p hp hmem).overlap j S hS) + (ScalarOverlap.memLp_of_mem_centersAtDepth_of_memLp hS hmem)] + simp [ENNReal.toReal_ofReal hp0] + · exact cubeBesovOverlapOscillation_nonneg S (ENNReal.ofReal p) u + · exact ENNReal.toReal_nonneg + · intro S hS + exact Real.rpow_nonneg + (cubeBesovOverlapOscillation_nonneg S (ENNReal.ofReal p) u) _ + · exact inv_nonneg.mpr (by positivity) + +/-- At a finite source exponent, the certified exact overlap depth term is +the `ENNReal` embedding of the legacy weighted overlap term. -/ +theorem exactOverlapDepthTerm_eq_ofReal_cubeBesovOverlapDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s p : ℝ) (hp : 1 ≤ p) (u : Vec d → ℝ) + (hmem : MeasureTheory.MemLp u (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) (j : ℕ) : + exactOverlapDepthTerm Q s p u (exactDualOverlapIntegrable Q p hp hmem) j = + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s (ENNReal.ofReal p) u j) := by + have hp0 : 0 ≤ p := zero_le_one.trans hp + rw [exactOverlapDepthTerm_eq, exactOverlapDepthWeight_eq_ofReal_legacy, + exactOverlapDepthAverage_eq_ofReal_cubeBesovOverlapDepthAverage Q p hp u hmem j] + unfold cubeBesovOverlapDepthSeminorm + rw [ENNReal.toReal_ofReal hp0] + rw [ENNReal.ofReal_mul] + · rw [← ENNReal.ofReal_rpow_of_nonneg] + · simp only [one_div] + · exact cubeBesovOverlapDepthAverage_nonneg Q (ENNReal.ofReal p) u j + · exact one_div_nonneg.mpr hp0 + · exact cubeBesovOverlapDepthWeight_nonneg Q s j + +/-- The exact circ depth average has the finite descendant-average formula +with legacy normalized cube averages, while retaining its extended value. -/ +theorem exactCircDepthAverage_eq_cubeAverage {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (f : Vec d → ℝ) (hf : ExactCircIntegrable Q f) (j : ℕ) : + exactCircDepthAverage Q p f hf j = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (descendantsAtDepth Q j).attach.sum fun R => + (ENNReal.ofReal |cubeAverage R.1 f|) ^ p := by + rw [exactCircDepthAverage_eq] + congr 1 + apply Finset.sum_congr rfl + intro R _ + rw [exactCircBlockMean_eq_cubeAverage] + +/-- At a finite source exponent, the certified exact circ depth average is +the `ENNReal` embedding of the legacy finite circ average. -/ +theorem exactCircDepthAverage_eq_ofReal_cubeBesovCircDepthAverage + {d : ℕ} (Q : TriadicCube d) (p : ℝ) (hp : 1 ≤ p) (f : Vec d → ℝ) + (hmem : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) (j : ℕ) : + exactCircDepthAverage Q p f (exactCircIntegrable_of_memLp Q p hp hmem) j = + ENNReal.ofReal (cubeBesovCircDepthAverage Q (ENNReal.ofReal p) f j) := by + have hp0 : 0 ≤ p := zero_le_one.trans hp + have hcard : (0 : ℝ) < ((descendantsAtDepth Q j).card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr (descendantsAtDepth_nonempty Q j) + let g : TriadicCube d → ℝ≥0∞ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + (ENNReal.ofReal |cubeAverage R f|) ^ p + else 0 + rw [exactCircDepthAverage_eq_cubeAverage] + unfold cubeBesovCircDepthAverage descendantsAverage + rw [ENNReal.ofReal_mul] + · rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast, + ENNReal.ofReal_sum_of_nonneg] + · congr 1 + calc + (descendantsAtDepth Q j).attach.sum (fun R => + (ENNReal.ofReal |cubeAverage R.1 f|) ^ p) = + (descendantsAtDepth Q j).attach.sum (fun R => g R.1) := by + apply Finset.sum_congr rfl + intro R hR + simp [g, R.2] + _ = (descendantsAtDepth Q j).sum g := Finset.sum_attach _ _ + _ = (descendantsAtDepth Q j).sum (fun R => + ENNReal.ofReal (‖cubeAverage R f‖ ^ (ENNReal.ofReal p).toReal)) := by + apply Finset.sum_congr rfl + intro R hR + simp only [g, dif_pos hR] + rw [← ENNReal.ofReal_rpow_of_nonneg] + · simp [ENNReal.toReal_ofReal hp0] + · exact abs_nonneg _ + · exact ENNReal.toReal_nonneg + · intro R hR + exact Real.rpow_nonneg (norm_nonneg _) _ + · exact inv_nonneg.mpr (by positivity) + +/-- At a finite source exponent, the certified exact circ depth term is the +`ENNReal` embedding of the legacy weighted circ term. -/ +theorem exactCircDepthTerm_eq_ofReal_cubeBesovCircDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s p : ℝ) (hp : 1 ≤ p) (f : Vec d → ℝ) + (hmem : MeasureTheory.MemLp f (ENNReal.ofReal p) + (Homogenization.normalizedCubeMeasure Q)) (j : ℕ) : + exactCircDepthTerm Q s p f (exactCircIntegrable_of_memLp Q p hp hmem) j = + ENNReal.ofReal (cubeBesovCircDepthSeminorm Q s (ENNReal.ofReal p) f j) := by + have hp0 : 0 ≤ p := zero_le_one.trans hp + rw [exactCircDepthTerm_eq, exactCircDepthWeight_eq_ofReal_legacy, + exactCircDepthAverage_eq_ofReal_cubeBesovCircDepthAverage Q p hp f hmem j] + unfold cubeBesovCircDepthSeminorm + rw [ENNReal.toReal_ofReal hp0] + rw [ENNReal.ofReal_mul] + · rw [← ENNReal.ofReal_rpow_of_nonneg] + · simp only [one_div] + · exact cubeBesovCircDepthAverage_nonneg Q (ENNReal.ofReal p) f j + · exact one_div_nonneg.mpr hp0 + · exact cubeBesovCircDepthWeight_nonneg Q s j + +/-- The exact finite positive norm has the same root term as the finite +projected-pairing norm, with the exact extended seminorm left unchanged. -/ +theorem exactOverlapFiniteNorm_eq_rootCubeAverage {d : ℕ} + (P : ExactOverlapFiniteParameters) (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : ExactOverlapIntegrable Q u) : + exactOverlapFiniteNorm P Q u hu = exactOverlapFiniteSeminorm P Q u hu + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := by + rw [exactOverlapFiniteNorm_eq, exactOverlapRootMean_eq_cubeAverage] + +/-- The exact positive top norm has the same root term as the finite +projected-pairing norm, with the exact extended seminorm left unchanged. -/ +theorem exactOverlapTopNorm_eq_rootCubeAverage {d : ℕ} + (P : ExactOverlapTopParameters) (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : ExactOverlapIntegrable Q u) : + exactOverlapTopNorm P Q u hu = exactOverlapTopSeminorm P Q u hu + + exactOverlapRootWeight Q P.s * ENNReal.ofReal |cubeAverage Q u| := by + rw [exactOverlapTopNorm_eq, exactOverlapRootMean_eq_cubeAverage] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare.lean new file mode 100644 index 0000000000..cdafc75638 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Structures +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds + +/-! # Poincare -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Bounds.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Bounds.lean new file mode 100644 index 0000000000..69a367c42c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Bounds.lean @@ -0,0 +1,437 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants + +/-! # Bounds -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +theorem cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j n : ℕ) : + cubeBesovDepthWeight Q s j * cubeBesovCircDepthSeminorm Q 1 p u (j + n) = + ((3 : ℝ) ^ (-s)) ^ n * cubeBesovCircDepthSeminorm Q (1 - s) p u (j + n) := by + have hQ : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hbase_pos : 0 < cubeScaleFactor Q / (3 : ℝ) ^ (j + n) := by + exact div_pos hQ (by positivity) + set A : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ (j + n) + have hA_pos : 0 < A := hbase_pos + have hsplit : + cubeScaleFactor Q / (3 : ℝ) ^ j = A * (3 : ℝ) ^ n := by + dsimp [A] + rw [pow_add] + field_simp + have hgeom : + ((3 : ℝ) ^ n) ^ (-s) = ((3 : ℝ) ^ (-s)) ^ n := by + have hthree_nat : (3 : ℝ) ^ n = (3 : ℝ) ^ (n : ℝ) := by + symm + rw [Real.rpow_natCast] + calc + ((3 : ℝ) ^ n) ^ (-s) + = ((3 : ℝ) ^ (n : ℝ)) ^ (-s) := by rw [hthree_nat] + _ = (3 : ℝ) ^ ((n : ℝ) * (-s)) := by + rw [Real.rpow_mul (by positivity)] + _ = (3 : ℝ) ^ ((-s) * n) := by rw [mul_comm] + _ = ((3 : ℝ) ^ (-s)) ^ (n : ℝ) := by + rw [← Real.rpow_mul (by positivity)] + _ = ((3 : ℝ) ^ (-s)) ^ n := by + rw [Real.rpow_natCast] + unfold cubeBesovCircDepthSeminorm + rw [← mul_assoc, ← mul_assoc] + congr 1 + calc + cubeBesovDepthWeight Q s j * cubeBesovCircDepthWeight Q 1 (j + n) + = (A * (3 : ℝ) ^ n) ^ (-s) * A := by + simp [cubeBesovDepthWeight, cubeBesovCircDepthWeight, hsplit, A] + _ = (A ^ (-s) * ((3 : ℝ) ^ n) ^ (-s)) * A := by + rw [Real.mul_rpow (le_of_lt hA_pos) (by positivity)] + _ = ((3 : ℝ) ^ n) ^ (-s) * (A ^ (-s) * A) := by + ring + _ = ((3 : ℝ) ^ n) ^ (-s) * A ^ (1 - s) := by + congr 1 + calc + A ^ (-s) * A = A ^ (-s) * A ^ (1 : ℝ) := by rw [Real.rpow_one] + _ = A ^ ((-s) + 1) := by + rw [← Real.rpow_add hA_pos] + _ = A ^ (1 - s) := by + congr 1 + ring + _ = ((3 : ℝ) ^ (-s)) ^ n * cubeBesovCircDepthWeight Q (1 - s) (j + n) := by + rw [hgeom] + simp [cubeBesovCircDepthWeight, A] + +theorem cubeBesovDepthSeminorm_two_le_weighted_shifted_of_local_circ_bound {d : ℕ} + (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (j N : ℕ) + (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) g (j + n) := by + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + exact cubeBesovDepthSeminorm_two_le_sum_shifted_of_local_circ_bound + Q s C u g j N hC hlocal + _ = C * ∑ n ∈ Finset.range (N + 1), + cubeBesovDepthWeight Q s j * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + rw [mul_assoc, Finset.mul_sum] + _ = C * ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) g (j + n) := by + refine congrArg (fun t : ℝ => C * t) ?_ + refine Finset.sum_congr rfl ?_ + intro n hn + rw [cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul] + +theorem cubeBesovDepthWeight_mul_sum_shifted_cubeBesovCircDepthSeminorm_one_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (g : Vec d → ℝ) (j N : ℕ) + (hs : 0 ≤ s) : + cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 p g (j + n) ≤ + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q (1 - s) p g (j + n) := by + have hr_nonneg : 0 ≤ (3 : ℝ) ^ (-s) := by + exact Real.rpow_nonneg (by positivity) _ + have hr_le_one : (3 : ℝ) ^ (-s) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) (by linarith) + calc + cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 p g (j + n) + = ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * cubeBesovCircDepthSeminorm Q (1 - s) p g (j + n) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro n hn + rw [cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul] + _ ≤ ∑ n ∈ Finset.range (N + 1), + 1 * cubeBesovCircDepthSeminorm Q (1 - s) p g (j + n) := by + refine Finset.sum_le_sum ?_ + intro n hn + have hpow_le : ((3 : ℝ) ^ (-s)) ^ n ≤ 1 := pow_le_one₀ hr_nonneg hr_le_one + exact mul_le_mul_of_nonneg_right hpow_le + (cubeBesovCircDepthSeminorm_nonneg Q (1 - s) p g (j + n)) + _ = ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q (1 - s) p g (j + n) := by + simp + +theorem cubeBesovDepthSeminorm_two_le_geometric_mul_cubeBesovCircPartialNorm_of_local_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (j N : ℕ) + (hs : 0 < s) (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g := by + let r : ℝ := (3 : ℝ) ^ (-s) + let a : ℕ → ℝ := fun n => cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) g (j + n) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hsum_r : + ∑ n ∈ Finset.range (N + 1), r ^ n ≤ (1 - r)⁻¹ := by + exact geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one + have ha_nonneg : ∀ n ∈ Finset.range (N + 1), 0 ≤ a n := by + intro n hn + exact cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) g (j + n) + have hweighted : + ∑ n ∈ Finset.range (N + 1), r ^ n * a n ≤ + (∑ n ∈ Finset.range (N + 1), r ^ n) * (∑ n ∈ Finset.range (N + 1), a n) := by + exact sum_mul_le_mul_sum_of_nonneg + (s := Finset.range (N + 1)) + (f := fun n => r ^ n) + (g := a) + (fun n hn => pow_nonneg hr_nonneg n) + ha_nonneg + have ha_sum_nonneg : 0 ≤ ∑ n ∈ Finset.range (N + 1), a n := by + exact Finset.sum_nonneg ha_nonneg + have hinv_nonneg : 0 ≤ (1 - r)⁻¹ := by + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hshift : + ∑ n ∈ Finset.range (N + 1), a n ≤ + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g := by + exact shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) j N g + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * ∑ n ∈ Finset.range (N + 1), r ^ n * a n := by + simpa [r, a] using + cubeBesovDepthSeminorm_two_le_weighted_shifted_of_local_circ_bound + Q s C u g j N hC hlocal + _ ≤ C * ((∑ n ∈ Finset.range (N + 1), r ^ n) * (∑ n ∈ Finset.range (N + 1), a n)) := by + exact mul_le_mul_of_nonneg_left hweighted hC + _ ≤ C * ((1 - r)⁻¹ * (∑ n ∈ Finset.range (N + 1), a n)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hsum_r ha_sum_nonneg) hC + _ ≤ C * ((1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hshift hinv_nonneg) hC + _ = C * (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g := by + ring + +theorem cubeBesovDepthSeminorm_two_le_cubeBesovCircPartialNorm_of_local_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (j N : ℕ) + (hs : 0 ≤ s) (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g := by + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + exact cubeBesovDepthSeminorm_two_le_sum_shifted_of_local_circ_bound + Q s C u g j N hC hlocal + _ ≤ C * ∑ n ∈ Finset.range (N + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) g (j + n) := by + simpa [mul_assoc] using + (mul_le_mul_of_nonneg_left + (cubeBesovDepthWeight_mul_sum_shifted_cubeBesovCircDepthSeminorm_one_le + Q s (2 : ℝ≥0∞) g j N hs) hC) + _ ≤ C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (j + N) g := by + exact mul_le_mul_of_nonneg_left + (shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) j N g) hC + +theorem cubeBesovPartialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm_of_local_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (M : ℕ) + (hs : 0 < s) (hC : 0 ≤ C) + (hlocal : ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (M - j + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (M + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ?_ + intro j hj + have hj_le : j ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + have hdepth := + cubeBesovDepthSeminorm_two_le_geometric_mul_cubeBesovCircPartialNorm_of_local_circ_bound + Q s C u g j (M - j) hs hC (hlocal j hj) + simpa [Nat.add_sub_of_le hj_le] using hdepth + +theorem cubeBesovPartialSeminormTop_two_le_cubeBesovCircPartialNorm_of_local_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (M : ℕ) + (hs : 0 ≤ s) (hC : 0 ≤ C) + (hlocal : ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (M - j + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (M + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ?_ + intro j hj + have hj_le : j ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + have hdepth := + cubeBesovDepthSeminorm_two_le_cubeBesovCircPartialNorm_of_local_circ_bound + Q s C u g j (M - j) hs hC (hlocal j hj) + simpa [Nat.add_sub_of_le hj_le] using hdepth + +theorem cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) + (havg : cubeAverage Q u = 0) : + cubeBesovPartialNormTop Q s p N u = cubeBesovPartialSeminormTop Q s p N u := by + unfold cubeBesovPartialNormTop + simp [havg] + +theorem CubeMultiscalePoincareInput.partialSeminormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact cubeBesovPartialSeminormTop_two_le_cubeBesovCircPartialNorm_of_local_circ_bound + Q s C u g M hs hC hinput + +theorem CubeMultiscalePoincareInput.partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact + cubeBesovPartialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm_of_local_circ_bound + Q s C u g M hs hC hinput + +theorem CubeMultiscalePoincareInput.partialNormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) + (havg : cubeAverage Q u = 0) (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (N := M) (u := u) havg] + exact hinput.partialSeminormTop_two_le_cubeBesovCircPartialNorm hs hC + +theorem CubeMultiscalePoincareInput.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) + (havg : cubeAverage Q u = 0) (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (N := M) (u := u) havg] + exact hinput.partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm hs hC + +theorem CubeLocalMultiscalePoincareEstimate.partialSeminormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C u g M) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.to_input.partialSeminormTop_two_le_cubeBesovCircPartialNorm hs hC + +theorem CubeLocalMultiscalePoincareEstimate.partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C u g M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.to_input.partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm hs hC + +theorem CubeLocalMultiscalePoincareEstimate.partialNormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C u g M) + (havg : cubeAverage Q u = 0) (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.to_input.partialNormTop_two_le_cubeBesovCircPartialNorm havg hs hC + +theorem CubeLocalMultiscalePoincareEstimate.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C u g M) + (havg : cubeAverage Q u = 0) (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.to_input.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm havg hs hC + +theorem CubeLocalMultiscalePoincareEstimate.fluctuation_partialNormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C (cubeFluctuation Q u) g M) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + C * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.partialNormTop_two_le_cubeBesovCircPartialNorm + (havg := cubeAverage_cubeFluctuation Q u) hs hC + +theorem CubeLocalMultiscalePoincareEstimate.fluctuation_partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C (cubeFluctuation Q u) g M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hlocal.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + (havg := cubeAverage_cubeFluctuation Q u) hs hC + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.partialSeminormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact (hproj.to_input hg hC).partialSeminormTop_two_le_cubeBesovCircPartialNorm hs (by positivity) + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact (hproj.to_input hg hC).partialSeminormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + hs (by positivity) + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.partialNormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q u = 0) (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact (hproj.to_input hg hC).partialNormTop_two_le_cubeBesovCircPartialNorm + havg hs (by positivity) + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q u = 0) (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact (hproj.to_input hg hC).partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + havg hs (by positivity) + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.fluctuation_partialNormTop_two_le_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hproj.partialNormTop_two_le_cubeBesovCircPartialNorm + hg (havg := cubeAverage_cubeFluctuation Q u) hs hC + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.fluctuation_partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hproj.partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm + hg (havg := cubeAverage_cubeFluctuation Q u) hs hC + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.fluctuation_partialNormTop_two_le_note_constant_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 ≤ s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hproj.fluctuation_partialNormTop_two_le_cubeBesovCircPartialNorm hg hs hC + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.fluctuation_partialNormTop_two_le_note_rhs + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact hproj.fluctuation_partialNormTop_two_le_geometric_mul_cubeBesovCircPartialNorm hg hs hC + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Descendants.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Descendants.lean new file mode 100644 index 0000000000..7ea97ed6dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Descendants.lean @@ -0,0 +1,325 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection + +/-! # Descendants -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-- Descendant-local analytic hypothesis where the local dual mean-zero +Poincare estimate is supplied against the finite projection of `g` on each +descendant cube at the exact depth that matches the multiscale corridor's +`M - j` indexing. -/ +def CubeDescendantProjectedDualMeanZeroPoincareEstimate {d : ℕ} (Q : TriadicCube d) + (C : ℝ) (u g : Vec d → ℝ) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + CubeDualMeanZeroPoincareEstimate R C u (cubeProjection R (M - j) g) + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.to_localEstimate + {d : ℕ} {Q : TriadicCube d} {C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + CubeLocalMultiscalePoincareEstimate Q + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) u g M := by + intro j hj R hR + have hdual : CubeDualMeanZeroPoincareEstimate R C u (cubeProjection R (M - j) g) := + hproj j hj R hR + have hprojMem : + MeasureTheory.MemLp (cubeProjection R (M - j) g) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + cubeProjection_memLp R (M - j) (2 : ℝ≥0∞) g + have htail : + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection R (M - j) g) ≤ + (3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g := + cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_on_descendants_of_memLp + (Q := Q) (u := g) (M := M) hg j hj R hR + have hnote_nonneg : 0 ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) := by + exact mul_nonneg hC (Real.rpow_nonneg (by positivity) _) + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection R (M - j) g) := + hdual.to_circNorm hprojMem hC + _ ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) * + ((3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g) := by + exact mul_le_mul_of_nonneg_left htail hnote_nonneg + _ = ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g := by + ring + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.to_input + {d : ℕ} {Q : TriadicCube d} {C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + CubeMultiscalePoincareInput Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) u g M := by + exact (hproj.to_localEstimate hg hC).to_input + +theorem cubeBesovCircDepthWeight_eq_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} + {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) (s : ℝ) (n : ℕ) : + cubeBesovCircDepthWeight R s n = cubeBesovCircDepthWeight Q s (j + n) := by + have hbase : + cubeScaleFactor R / (3 : ℝ) ^ n = cubeScaleFactor Q / (3 : ℝ) ^ (j + n) := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + rw [pow_add] + field_simp + simp [cubeBesovCircDepthWeight, hbase] + +theorem sq_cubeBesovCircDepthSeminorm_two {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (u : Vec d → ℝ) (j : ℕ) : + (cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 = + (cubeBesovCircDepthWeight Q s j) ^ 2 * cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j := by + have hW : 0 ≤ cubeBesovCircDepthWeight Q s j := cubeBesovCircDepthWeight_nonneg Q s j + have hA : 0 ≤ cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j := + cubeBesovCircDepthAverage_nonneg Q (2 : ℝ≥0∞) u j + calc + (cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 + = (cubeBesovCircDepthWeight Q s j * + (cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j) ^ (1 / ((2 : ℝ≥0∞).toReal))) ^ 2 := by + simp [cubeBesovCircDepthSeminorm] + _ = (cubeBesovCircDepthWeight Q s j) ^ 2 * + ((cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j) ^ + (1 / ((2 : ℝ≥0∞).toReal))) ^ 2 := by + ring + _ = (cubeBesovCircDepthWeight Q s j) ^ 2 * cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j := by + congr 1 + have htwo : ((2 : ℝ≥0∞).toReal : ℝ) = 2 := by norm_num + rw [htwo] + rw [← Real.rpow_natCast, ← Real.rpow_mul hA] + norm_num + +theorem descendantsAverage_sq_cubeBesovCircDepthSeminorm_eq_shifted {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (j n : ℕ) : + descendantsAverage Q j (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) u n) ^ 2) = + (cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) u (j + n)) ^ 2 := by + calc + descendantsAverage Q j (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) u n) ^ 2) + = descendantsAverage Q j + (fun R => + (cubeBesovCircDepthWeight Q 1 (j + n)) ^ 2 * + cubeBesovCircDepthAverage R (2 : ℝ≥0∞) u n) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [sq_cubeBesovCircDepthSeminorm_two] + rw [cubeBesovCircDepthWeight_eq_of_mem_descendantsAtDepth hR] + _ = (cubeBesovCircDepthWeight Q 1 (j + n)) ^ 2 * + descendantsAverage Q j (fun R => cubeBesovCircDepthAverage R (2 : ℝ≥0∞) u n) := by + rw [descendantsAverage_mul_left Q j ((cubeBesovCircDepthWeight Q 1 (j + n)) ^ 2) + (fun R => cubeBesovCircDepthAverage R (2 : ℝ≥0∞) u n)] + _ = (cubeBesovCircDepthWeight Q 1 (j + n)) ^ 2 * + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u (j + n) := by + rw [cubeBesovCircDepthAverage_add_eq_descendantsAverage_cubeBesovCircDepthAverage] + _ = (cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) u (j + n)) ^ 2 := by + symm + exact sq_cubeBesovCircDepthSeminorm_two Q 1 u (j + n) + +theorem descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 {d : ℕ} {ι : Type*} + (Q : TriadicCube d) (j : ℕ) (s : Finset ι) (A : TriadicCube d → ι → ℝ) + (hA : ∀ R ∈ descendantsAtDepth Q j, ∀ i ∈ s, 0 ≤ A R i) : + (descendantsAverage Q j (fun R => (∑ i ∈ s, A R i) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ i ∈ s, (descendantsAverage Q j (fun R => (A R i) ^ 2)) ^ (1 / 2 : ℝ) := by + classical + induction s using Finset.induction_on with + | empty => + simp [descendantsAverage] + | @insert a s ha ih => + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + have hc : 0 ≤ c := by + dsimp [c] + exact inv_nonneg.mpr (by positivity) + have hsum_nonneg : ∀ R ∈ D, 0 ≤ ∑ i ∈ s, A R i := by + intro R hR + exact Finset.sum_nonneg fun i hi => + hA R (by simpa [D] using hR) i (Finset.mem_insert_of_mem hi) + have hsum_sq_nonneg : 0 ≤ ∑ R ∈ D, (∑ i ∈ s, A R i) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hsingle_sq_nonneg : 0 ≤ ∑ R ∈ D, (A R a) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hinsert_sq_nonneg : 0 ≤ ∑ R ∈ D, (∑ i ∈ insert a s, A R i) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hLp : + (∑ R ∈ D, (A R a + ∑ i ∈ s, A R i) ^ 2) ^ (1 / 2 : ℝ) ≤ + (∑ R ∈ D, (A R a) ^ 2) ^ (1 / 2 : ℝ) + + (∑ R ∈ D, (∑ i ∈ s, A R i) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + (Real.Lp_add_le_of_nonneg + (s := D) + (f := fun R => A R a) + (g := fun R => ∑ i ∈ s, A R i) + (p := (2 : ℝ)) + (by norm_num) + (fun R hR => hA R (by simpa [D] using hR) a (by simp [ha])) + hsum_nonneg) + calc + (descendantsAverage Q j (fun R => (∑ i ∈ insert a s, A R i) ^ 2)) ^ (1 / 2 : ℝ) + = c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (A R a + ∑ i ∈ s, A R i) ^ 2) ^ (1 / 2 : ℝ) := by + have hmul : + (c * ∑ R ∈ D, (∑ i ∈ insert a s, A R i) ^ 2) ^ (1 / 2 : ℝ) = + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (∑ i ∈ insert a s, A R i) ^ 2) ^ (1 / 2 : ℝ) := + Real.mul_rpow hc hinsert_sq_nonneg + simpa [descendantsAverage, D, c, Finset.sum_insert, ha] using hmul + _ ≤ c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (A R a) ^ 2) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (∑ i ∈ s, A R i) ^ 2) ^ (1 / 2 : ℝ) := by + have hc_rpow : 0 ≤ c ^ (1 / 2 : ℝ) := Real.rpow_nonneg hc _ + have hmul := mul_le_mul_of_nonneg_left hLp hc_rpow + simpa [mul_add] using hmul + _ = (descendantsAverage Q j (fun R => (A R a) ^ 2)) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (∑ i ∈ s, A R i) ^ 2) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsingle_sq_nonneg] + simp [descendantsAverage, D, c] + _ = (descendantsAverage Q j (fun R => (A R a) ^ 2)) ^ (1 / 2 : ℝ) + + (descendantsAverage Q j (fun R => (∑ i ∈ s, A R i) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsum_sq_nonneg] + simp [descendantsAverage, D, c] + _ ≤ (descendantsAverage Q j (fun R => (A R a) ^ 2)) ^ (1 / 2 : ℝ) + + ∑ i ∈ s, (descendantsAverage Q j (fun R => (A R i) ^ 2)) ^ (1 / 2 : ℝ) := by + exact add_le_add le_rfl + (ih (fun R hR i hi => hA R hR i (Finset.mem_insert_of_mem hi))) + _ = ∑ i ∈ insert a s, (descendantsAverage Q j (fun R => (A R i) ^ 2)) ^ (1 / 2 : ℝ) := by + simp [Finset.sum_insert, ha] + +theorem cubeBesovDepthSeminorm_two_le_sum_shifted_of_local_circ_bound {d : ℕ} + (Q : TriadicCube d) (s C : ℝ) (u g : Vec d → ℝ) (j N : ℕ) + (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + let S : TriadicCube d → ℝ := fun R => + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n + have hS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ S R := by + intro R hR + exact Finset.sum_nonneg fun n hn => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) g n + have hsq_bound : + descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) ≤ + descendantsAverage Q j (fun R => (C * S R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hCS_nonneg : 0 ≤ C * S R := mul_nonneg hC (hS_nonneg R hR) + nlinarith [hlocal R hR, hosc_nonneg, hCS_nonneg] + have hleft_nonneg : + 0 ≤ descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hright_nonneg : + 0 ≤ descendantsAverage Q j (fun R => (C * S R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_bound : + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ (1 / 2 : ℝ) ≤ + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft_nonneg hsq_bound (by positivity) + have hfactor : + descendantsAverage Q j (fun R => (C * S R) ^ 2) = + C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (C * S R) ^ 2) + = descendantsAverage Q j (fun R => C ^ 2 * (S R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (C ^ 2) (fun R => (S R) ^ 2)] + have hSsq_nonneg : 0 ≤ descendantsAverage Q j (fun R => (S R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_factor : + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) = + C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [hfactor, Real.mul_rpow (sq_nonneg C) hSsq_nonneg] + congr 1 + rw [sq_rpow_half_eq_of_nonneg hC] + have hM : + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ n ∈ Finset.range (N + 1), + (descendantsAverage Q j + (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) ^ 2)) ^ (1 / 2 : ℝ) := by + exact descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 Q j (Finset.range (N + 1)) + (fun R n => cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) + (fun R hR n hn => cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) g n) + have hshift : + ∀ n ∈ Finset.range (N + 1), + (descendantsAverage Q j + (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) ^ 2)) ^ (1 / 2 : ℝ) = + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + intro n hn + have hnonneg : 0 ≤ cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := + cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) g (j + n) + rw [descendantsAverage_sq_cubeBesovCircDepthSeminorm_eq_shifted] + exact sq_rpow_half_eq_of_nonneg hnonneg + have hsum_reindex : + ∑ n ∈ Finset.range (N + 1), + (descendantsAverage Q j + (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) ^ 2)) ^ (1 / 2 : ℝ) + = + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + refine Finset.sum_congr rfl ?_ + intro n hn + exact hshift n hn + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := cubeBesovDepthWeight_nonneg Q s j + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ (1 / 2 : ℝ) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage] + _ ≤ cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + gcongr + _ = cubeBesovDepthWeight Q s j * + (C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ)) := by + rw [hroot_factor] + _ = C * cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + ring + _ ≤ C * cubeBesovDepthWeight Q s j * + (∑ n ∈ Finset.range (N + 1), + (descendantsAverage Q j + (fun R => (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n) ^ 2)) ^ (1 / 2 : ℝ)) := by + gcongr + _ = C * cubeBesovDepthWeight Q s j * + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) g (j + n) := by + rw [hsum_reindex] + +theorem shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (j N : ℕ) (u : Vec d → ℝ) : + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q s p u (j + n) ≤ + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (j + N) u := by + have hsubset : Finset.Ico j (j + N + 1) ⊆ Finset.range (j + N + 1) := by + intro n hn + exact Finset.mem_range.mpr (Finset.mem_Ico.mp hn).2 + calc + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q s p u (j + n) + = Finset.sum (Finset.Ico j (j + N + 1)) (fun n => cubeBesovCircDepthSeminorm Q s p u n) := by + simpa [Nat.add_assoc] using + (Finset.sum_Ico_eq_sum_range + (f := fun n => cubeBesovCircDepthSeminorm Q s p u n) + (m := j) (n := j + N + 1)).symm + _ ≤ Finset.sum (Finset.range (j + N + 1)) (fun n => cubeBesovCircDepthSeminorm Q s p u n) := by + refine Finset.sum_le_sum_of_subset_of_nonneg hsubset ?_ + intro n hn _ + exact cubeBesovCircDepthSeminorm_nonneg Q s p u n + _ = cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (j + N) u := by + symm + rw [cubeBesovCircPartialNorm_one_eq_sum] + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient.lean new file mode 100644 index 0000000000..a1a8d1e018 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalEstimate + +/-! # Harmonic Gradient -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Definitions.lean new file mode 100644 index 0000000000..c90f997922 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Definitions.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +variable {d : ℕ} + +/-! +# Vector projected dual mean-zero Poincare estimate + +The note-facing Caccioppoli wrappers need a Poincare estimate that controls +the oscillation of a scalar field by the dual norm of its full gradient on +each descendant. + +The pre-existing scalar/componentwise version +`CubeDescendantProjectedDualMeanZeroPoincareEstimate` is mathematically +**too strong** when applied to a single coordinate of a gradient: an affine +function `u(x) = x_j` (with `j ≠ i`) has zero `i`-th partial derivative but +nonzero oscillation, so the componentwise statement is false in general. + +This file introduces the correct vector replacement: a sum-over-coordinates +form whose right-hand side controls every component of the gradient. It +mirrors the scalar `to_localEstimate` consumer pattern from +`Poincare/Descendants.lean` so the existing multiscale corridor can absorb +it after summing the per-component bounds. + +The underlying inequality `‖u − ⟨u⟩_R‖_{L²(R)} ≲ ∑_i ‖∂_i u‖_{B^{-1}_{2,1}(R)}` +is a pure duality fact about `H¹` (proved by pairing against mean-zero `L²` +test, integration by parts, and constant-coefficient Dirichlet regularity). +**Harmonicity is not required.** + +This file is layered under `Besov/`, so it does **not** import any +`PDE/`, `Sobolev/`, or `Deterministic/` content. The load-bearing +analytic constructor `of_h1Function`, together with the harmonic-function +corollary `of_aHarmonicFunction`, lives downstream in +`Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient.lean` +(where the `H1Function` and `AHarmonicFunction` types are in scope). +-/ + +def CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) + +/-- The single-cube projected vector dual mean-zero Poincare estimate. This is +the local theorem that the descendant estimate applies on each subcube. -/ +def CubeProjectedDualMeanZeroVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (N : ℕ) : Prop := + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => G x i)) + +/-- Infinite-depth vector dual mean-zero Poincare estimate. + +This is the analytically natural target for general `H¹` functions: the +oscillation is controlled by the full negative Besov seminorm of each gradient +component, not by a fixed finite projection depth. -/ +def CubeDualMeanZeroVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) : Prop := + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + +/-- Descendant form of the infinite-depth vector dual mean-zero Poincare +estimate. -/ +def CubeDescendantDualMeanZeroVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + +/-- Constant-mode-safe infinite-depth vector Poincare estimate. + +The right-hand side uses the full dual norm of each gradient component. Unlike +the mean-zero-dual-only target, this norm sees constant gradient modes and is +therefore the corrected surface for arbitrary `H¹` inputs. -/ +def CubeDualFullVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) : Prop := + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + +/-- Descendant form of the constant-mode-safe full-dual vector Poincare +estimate. -/ +def CubeDescendantDualFullVectorPoincareEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovDualFullNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + +/-- Vector analogue of `CubeLocalMultiscalePoincareEstimate`: oscillation of +the scalar `u` is controlled by `C` times the sum over coordinates of the +local `q = 1` partial circ norm at the matching multiscale depth. -/ +def CubeLocalMultiscalePoincareVectorEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i) + +/-- Vector local Poincare estimate with the full local circ norm on each +descendant. This is the honest bridge target produced by a full-dual +Poincare estimate; passing from this to the finite-partial multiscale corridor +requires a separate infinite-to-finite summation argument. -/ +def CubeLocalFullCircPoincareVectorEstimate + (Q : TriadicCube d) (C : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Descendants.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Descendants.lean new file mode 100644 index 0000000000..f53b4e03d5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/Descendants.lean @@ -0,0 +1,262 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions + +/-! # Descendants -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +variable {d : ℕ} + +/-! # Descendant APIs for Vector Poincare Estimates -/ + +/-- Enlarge the constant in the projected vector Poincare estimate. -/ +theorem CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.mono_C + {Q : TriadicCube d} {C₁ C₂ : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {M : ℕ} + (h : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C₁ u G M) + (hC : C₁ ≤ C₂) : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C₂ u G M := by + intro j hj R hR + have hsum_nonneg : + 0 ≤ + ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) := by + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + refine Finset.sum_nonneg ?_ + intro i _ + exact cubeBesovDualMeanZeroSeminorm_nonneg R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) + (by rw [hconj_eq]; norm_num) + (by rw [hconj_eq]; norm_num) + exact le_trans (h j hj R hR) + (mul_le_mul_of_nonneg_right hC hsum_nonneg) + +/-- Assemble descendant projected vector Poincare from one-cube projected +estimates on every descendant. The only rewrite is that subtracting the parent +cube average does not change oscillation on the descendant. -/ +theorem CubeProjectedDualMeanZeroVectorPoincareEstimate.to_descendant + {Q : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} {M : ℕ} + (hu : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hlocal : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + CubeProjectedDualMeanZeroVectorPoincareEstimate R C u G (M - j)) : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C + (cubeFluctuation Q u) G M := by + intro j hj R hR + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two R Q (hu j hj R hR) + rw [hosc] + exact hlocal j hj R hR + +/-- Restrict a descendant projected vector Poincare estimate to one of the +parent cube's descendants. The depth bookkeeping is the same as in the +scalar projected Poincare corridor: a depth-`n` descendant of `R` is a +depth-`j + n` descendant of `Q`. -/ +theorem CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.restrict_to_descendant + {Q R : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {M j : ℕ} + (hproj : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C u G M) + (hR : R ∈ descendantsAtDepth Q j) (hj : j ≤ M) : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C u G (M - j) := by + intro n hn S hS + have hn_le : n ≤ M - j := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hjn_le : j + n ≤ M := by + simpa [Nat.add_sub_of_le hj] using Nat.add_le_add_left hn_le j + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + have hmem : j + n ∈ Finset.range (M + 1) := + Finset.mem_range.mpr (Nat.lt_succ_iff.mpr hjn_le) + have hbase := hproj (j + n) hmem S hSQ + have hsub : M - (j + n) = (M - j) - n := by + omega + simpa [hsub] using hbase + +/-- Localize a parent cube projected vector Poincare family to a descendant +cube while recentering the fluctuation from the parent average to the local +descendant average. -/ +theorem CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.restrict_fluctuation_to_descendant + {Q R : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) + (hu : + ∀ n : ℕ, ∀ S ∈ descendantsAtDepth R n, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure S)) + (hproj : ∀ M : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C + (cubeFluctuation Q u) G M) : + ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C + (cubeFluctuation R u) G N := by + intro N n hn S hS + have hn_le : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + have hmem : j + n ∈ Finset.range (j + N + 1) := by + exact Finset.mem_range.mpr (Nat.lt_succ_iff.mpr (Nat.add_le_add_left hn_le j)) + have hbase := hproj (j + N) (j + n) hmem S hSQ + have huS : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure S) := hu n S hS + have hoscR : + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation R u) = + cubeBesovOscillation S (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two S R huS + have hoscQ : + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation S (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two S Q huS + have hsub : j + N - (j + n) = N - n := by + omega + calc + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation R u) + = cubeBesovOscillation S (2 : ℝ≥0∞) u := hoscR + _ = cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation Q u) := hoscQ.symm + _ ≤ C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm S 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection S (j + N - (j + n)) (fun x => G x i)) := hbase + _ = C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm S 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection S (N - n) (fun x => G x i)) := by + rw [hsub] + +/-- Assemble the descendant infinite-depth vector Poincare estimate from +one-cube infinite-depth estimates on every descendant. -/ +theorem CubeDualMeanZeroVectorPoincareEstimate.to_descendant + {Q : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} {M : ℕ} + (hu : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hlocal : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + CubeDualMeanZeroVectorPoincareEstimate R C u G) : + CubeDescendantDualMeanZeroVectorPoincareEstimate Q C + (cubeFluctuation Q u) G M := by + intro j hj R hR + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two R Q (hu j hj R hR) + rw [hosc] + exact hlocal j hj R hR + +/-- Assemble the descendant full-dual vector Poincare estimate from one-cube +full-dual estimates on every descendant. -/ +theorem CubeDualFullVectorPoincareEstimate.to_descendant + {Q : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} {M : ℕ} + (hu : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hlocal : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + CubeDualFullVectorPoincareEstimate R C u G) : + CubeDescendantDualFullVectorPoincareEstimate Q C + (cubeFluctuation Q u) G M := by + intro j hj R hR + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two R Q (hu j hj R hR) + rw [hosc] + exact hlocal j hj R hR + +/-- Enlarge the constant in the descendant full-dual vector Poincare estimate. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.mono_C + {Q : TriadicCube d} {C₁ C₂ : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {M : ℕ} + (hfull : CubeDescendantDualFullVectorPoincareEstimate Q C₁ u G M) + (hC : C₁ ≤ C₂) : + CubeDescendantDualFullVectorPoincareEstimate Q C₂ u G M := by + intro j hj R hR + have hsum_nonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + refine Finset.sum_nonneg ?_ + intro i _ + exact cubeBesovDualFullNorm_nonneg R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + (by rw [hconj_eq]; norm_num) + (by rw [hconj_eq]; norm_num) + exact le_trans (hfull j hj R hR) + (mul_le_mul_of_nonneg_right hC hsum_nonneg) + +/-- Restrict a descendant full-dual vector Poincare estimate to one of the +parent cube's descendants. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.restrict_to_descendant + {Q R : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {M j : ℕ} + (hfull : CubeDescendantDualFullVectorPoincareEstimate Q C u G M) + (hR : R ∈ descendantsAtDepth Q j) (hj : j ≤ M) : + CubeDescendantDualFullVectorPoincareEstimate R C u G (M - j) := by + intro n hn S hS + have hn_le : n ≤ M - j := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hjn_le : j + n ≤ M := by + simpa [Nat.add_sub_of_le hj] using Nat.add_le_add_left hn_le j + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + have hmem : j + n ∈ Finset.range (M + 1) := + Finset.mem_range.mpr (Nat.lt_succ_iff.mpr hjn_le) + simpa using hfull (j + n) hmem S hSQ + +/-- Localize a parent cube full-dual vector Poincare family to a descendant +cube while recentering the fluctuation from the parent average to the local +descendant average. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.restrict_fluctuation_to_descendant + {Q R : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} + {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) + (hu : + ∀ n : ℕ, ∀ S ∈ descendantsAtDepth R n, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure S)) + (hfull : ∀ M : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C + (cubeFluctuation Q u) G M) : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C + (cubeFluctuation R u) G N := by + intro N n hn S hS + have hn_le : n ≤ N := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + have hmem : j + n ∈ Finset.range (j + N + 1) := by + exact Finset.mem_range.mpr (Nat.lt_succ_iff.mpr (Nat.add_le_add_left hn_le j)) + have hbase := hfull (j + N) (j + n) hmem S hSQ + have huS : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure S) := hu n S hS + have hoscR : + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation R u) = + cubeBesovOscillation S (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two S R huS + have hoscQ : + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation Q u) = + cubeBesovOscillation S (2 : ℝ≥0∞) u := + cubeBesovOscillation_cubeFluctuation_eq_of_memLp_two S Q huS + calc + cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation R u) + = cubeBesovOscillation S (2 : ℝ≥0∞) u := hoscR + _ = cubeBesovOscillation S (2 : ℝ≥0∞) (cubeFluctuation Q u) := hoscQ.symm + _ ≤ C * ∑ i : Fin d, + cubeBesovDualFullNorm S 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := hbase + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/FullCirc.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/FullCirc.lean new file mode 100644 index 0000000000..e60aef6420 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/FullCirc.lean @@ -0,0 +1,554 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Descendants + +/-! # Full Circ -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +variable {d : ℕ} + +/-! # Full-Circ Vector Poincare Estimates -/ + +/-- A descendant full-dual vector Poincare estimate gives a descendant local +full-circ estimate after applying circ domination componentwise. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.to_localFullCircEstimate + {Q : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} {M : ℕ} + (hfull : CubeDescendantDualFullVectorPoincareEstimate Q C u G M) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + CubeLocalFullCircPoincareVectorEstimate Q + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) u G M := by + intro j hj R hR + let K : ℝ := (3 : ℝ) ^ ((d : ℝ) + 1) + have hdual := hfull j hj R hR + have hGR : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := by + intro i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR (hG i) + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hcoord : + ∀ i : Fin d, + cubeBesovDualFullNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + K * cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + intro i + simpa [K] using + cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm + (Q := R) (s := 1) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) + (u := fun x => G x i) + (by norm_num) (hGR i) (by norm_num) (by norm_num) + (by intro htop; simp [hconj_eq] at htop) (by norm_num) + have hsum : + ∑ i : Fin d, + cubeBesovDualFullNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + ∑ i : Fin d, + K * cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + exact Finset.sum_le_sum fun i _ => hcoord i + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * ∑ i : Fin d, + cubeBesovDualFullNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := hdual + _ ≤ C * ∑ i : Fin d, + K * cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + exact mul_le_mul_of_nonneg_left hsum hC + _ = (C * K) * ∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + rw [← Finset.mul_sum] + ring + _ = (C * (3 : ℝ) ^ ((d : ℝ) + 1)) * ∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + simp [K] + +/-- For `q = 1`, finite circ partial norms increase to the full circ norm. -/ +theorem tendsto_cubeBesovCircPartialNorm_one_succ_to_cubeBesovCircNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovCircNormValueSet Q s p (1 : ℝ≥0∞) u)) : + Filter.Tendsto + (fun N : ℕ => cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (N + 1) u) + Filter.atTop + (nhds (cubeBesovCircNorm Q s p (1 : ℝ≥0∞) u)) := by + have hmono : + Monotone + (fun N : ℕ => + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (N + 1) u) := by + intro M N hMN + exact cubeBesovCircPartialNorm_one_mono Q s p u (Nat.succ_le_succ hMN) + have hbdd : + BddAbove + (Set.range + fun N : ℕ => + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (N + 1) u) := by + rcases hBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + intro y hy + rcases hy with ⟨N, rfl⟩ + exact hB ⟨N, by simp [cubeBesovCircNormEntry]⟩ + have ht := tendsto_atTop_ciSup hmono hbdd + have hiSup_eq : + (⨆ N : ℕ, cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) (N + 1) u) = + cubeBesovCircNorm Q s p (1 : ℝ≥0∞) u := by + rw [cubeBesovCircNorm] + unfold iSup + congr 1 + rw [← hiSup_eq] + exact ht + +/-- Finite local circ partial sums, averaged over descendants and shifted to +the parent, are controlled by the full parent circ norm. -/ +theorem cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circPartialNorm_le_sum_circNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (G : Vec d → Vec d) (j N : ℕ) + (hs0 : 0 ≤ s) (hs1 : s < 1) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + classical + let I : Finset (Fin d × ℕ) := + (Finset.univ : Finset (Fin d)).product (Finset.range (N + 1 + 1)) + let S : TriadicCube d → ℝ := fun R => + ∑ p ∈ I, + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2 + have hS_eq : + ∀ R, + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) = S R := by + intro R + simp [S, I, cubeBesovCircPartialNorm_one_eq_sum, Finset.sum_product] + have hM : + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) := by + exact descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 Q j I + (fun R p => + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + (fun R hR p hp => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + have hshift : + ∀ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) = + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + intro p hp + have hnonneg : + 0 ≤ cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => G x p.1) (j + p.2) := + cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + rw [descendantsAverage_sq_cubeBesovCircDepthSeminorm_eq_shifted] + exact sq_rpow_half_eq_of_nonneg hnonneg + have hsum_reindex : + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) + = + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + refine Finset.sum_congr rfl ?_ + intro p hp + exact hshift p hp + have hweighted : + cubeBesovDepthWeight Q s j * + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + = + ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1 + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + rw [Finset.mul_sum] + simp [I, Finset.sum_product, + cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + have hleft : + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ) ≤ + cubeBesovDepthWeight Q s j * + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + rw [show descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2) = + descendantsAverage Q j (fun R => (S R) ^ 2) by + congr 1 + funext R + rw [hS_eq R]] + exact mul_le_mul_of_nonneg_left (hM.trans_eq hsum_reindex) hweight_nonneg + have hr_nonneg : 0 ≤ (3 : ℝ) ^ (-s) := + Real.rpow_nonneg (by positivity) _ + have hr_le_one : (3 : ℝ) ^ (-s) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) (by linarith) + have htail : + ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1 + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hweighted_le : + ∑ n ∈ Finset.range (N + 1 + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + ∑ n ∈ Finset.range (N + 1 + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + refine Finset.sum_le_sum ?_ + intro n hn + have hpow_le : ((3 : ℝ) ^ (-s)) ^ n ≤ 1 := + pow_le_one₀ hr_nonneg hr_le_one + simpa using + mul_le_mul_of_nonneg_right hpow_le + (cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) + have hshifted : + ∑ n ∈ Finset.range (N + 1 + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (j + (N + 1)) (fun x => G x i) := + shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) j (N + 1) (fun x => G x i) + have hBdd : + BddAbove + (cubeBesovCircNormValueSet Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) := + cubeBesovCircNormValueSet_bddAbove_of_memLp + Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by linarith) (hG i) (by norm_num) (by norm_num) (by norm_num) + have hpartial_full : + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (j + (N + 1)) (fun x => G x i) ≤ + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + have hmono := + cubeBesovCircPartialNorm_one_mono Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (Nat.le_succ (j + (N + 1))) + have hle := + cubeBesovCircPartialNorm_le_cubeBesovCircNorm + Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by norm_num) hBdd (j + (N + 1)) + exact hmono.trans hle + exact hweighted_le.trans (hshifted.trans hpartial_full) + calc + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ) + ≤ cubeBesovDepthWeight Q s j * + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) + (j + p.2) := hleft + _ = ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1 + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := hweighted + _ ≤ ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := htail + +/-- The finite local partial-sum averages converge to the corresponding full +local circ averages. -/ +theorem tendsto_cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circPartialNorm_to_circNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (G : Vec d → Vec d) (j : ℕ) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Filter.Tendsto + (fun N : ℕ => + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ)) + Filter.atTop + (nhds + (cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ))) := by + have havg : + Filter.Tendsto + (fun N : ℕ => + descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) + Filter.atTop + (nhds + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) ^ 2))) := by + unfold descendantsAverage + refine Filter.Tendsto.const_mul _ ?_ + refine tendsto_finsetSum (descendantsAtDepth Q j) ?_ + intro R hR + have hsum : + Filter.Tendsto + (fun N : ℕ => + ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) + Filter.atTop + (nhds + (∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i))) := by + refine tendsto_finsetSum Finset.univ ?_ + intro i hi + have hGR : + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR (hG i) + have hBdd : + BddAbove + (cubeBesovCircNormValueSet R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) := + cubeBesovCircNormValueSet_bddAbove_of_memLp + R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by norm_num) hGR (by norm_num) (by norm_num) (by norm_num) + exact + tendsto_cubeBesovCircPartialNorm_one_succ_to_cubeBesovCircNorm + R 1 (2 : ℝ≥0∞) (fun x => G x i) hBdd + simpa using hsum.pow 2 + have hroot : + Filter.Tendsto + (fun N : ℕ => + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ)) + Filter.atTop + (nhds + ((descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ))) := by + exact + (Real.continuous_rpow_const (by norm_num : 0 ≤ (1 / 2 : ℝ))).tendsto _ |>.comp havg + exact hroot.const_mul _ + +/-- The full local circ averages over descendants are controlled by the full +parent circ norm. -/ +theorem cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circNorm_le_sum_circNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (G : Vec d → Vec d) (j : ℕ) + (hs0 : 0 ≤ s) (hs1 : s < 1) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => + (∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + have htend := + tendsto_cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circPartialNorm_to_circNorm + Q s G j hG + exact le_of_tendsto htend + (Filter.Eventually.of_forall fun N => + cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circPartialNorm_le_sum_circNorm + Q s G j N hs0 hs1 hG) + +/-- Depthwise positive Besov control from a vector local full-circ Poincare +bound. -/ +theorem cubeBesovDepthSeminorm_two_le_sum_circNorm_of_vector_local_full_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u : Vec d → ℝ) (G : Vec d → Vec d) + (j : ℕ) (hs0 : 0 ≤ s) (hs1 : s < 1) (hC : 0 ≤ C) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + let S : TriadicCube d → ℝ := fun R => + ∑ i : Fin d, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + have hS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ S R := by + intro R hR + refine Finset.sum_nonneg ?_ + intro i hi + have hGR : + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR (hG i) + have hBdd : + BddAbove + (cubeBesovCircNormValueSet R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) := + cubeBesovCircNormValueSet_bddAbove_of_memLp + R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by norm_num) hGR (by norm_num) (by norm_num) (by norm_num) + exact cubeBesovCircNorm_nonneg R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) hBdd + have hsq_bound : + descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) ≤ + descendantsAverage Q j (fun R => (C * S R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hCS_nonneg : 0 ≤ C * S R := mul_nonneg hC (hS_nonneg R hR) + nlinarith [hlocal R hR, hosc_nonneg, hCS_nonneg] + have hleft_nonneg : + 0 ≤ descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_bound : + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) ≤ + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft_nonneg hsq_bound (by positivity) + have hfactor : + descendantsAverage Q j (fun R => (C * S R) ^ 2) = + C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (C * S R) ^ 2) + = descendantsAverage Q j (fun R => C ^ 2 * (S R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (C ^ 2) (fun R => (S R) ^ 2)] + have hSsq_nonneg : 0 ≤ descendantsAverage Q j (fun R => (S R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_factor : + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) = + C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [hfactor, Real.mul_rpow (sq_nonneg C) hSsq_nonneg] + congr 1 + rw [sq_rpow_half_eq_of_nonneg hC] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + have hfull := + cubeBesovDepthWeight_mul_L2_descendantsAverage_sum_components_circNorm_le_sum_circNorm + Q s G j hs0 hs1 hG + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q s j * + (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage] + _ ≤ cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hroot_bound hweight_nonneg + _ = C * (cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ)) := by + rw [hroot_factor] + ring + _ ≤ C * ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + exact mul_le_mul_of_nonneg_left hfull hC + +/-- Finite-depth `q = ∞` positive Besov control from vector local full-circ +Poincare. -/ +theorem CubeLocalFullCircPoincareVectorEstimate.partialSeminormTop_two_le_sum_circNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalFullCircPoincareVectorEstimate Q C u G M) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs0 : 0 ≤ s) (hs1 : s < 1) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (M + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ?_ + intro j hj + exact + cubeBesovDepthSeminorm_two_le_sum_circNorm_of_vector_local_full_circ_bound + Q s C u G j hs0 hs1 hC hG (by + intro R hR + exact hlocal j hj R hR) + +/-- Fluctuation form of the finite-depth full-circ Poincare-to-Besov bound. -/ +theorem CubeLocalFullCircPoincareVectorEstimate.fluctuation_partialNormTop_two_le_sum_circNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalFullCircPoincareVectorEstimate Q C (cubeFluctuation Q u) G M) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs0 : 0 ≤ s) (hs1 : s < 1) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (N := M) + (u := cubeFluctuation Q u) (cubeAverage_cubeFluctuation Q u)] + exact hlocal.partialSeminormTop_two_le_sum_circNorm hG hs0 hs1 hC + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalEstimate.lean new file mode 100644 index 0000000000..928a951247 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalEstimate.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.LocalMultiscale + +/-! # Local Estimate -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +variable {d : ℕ} + +/-! # Final Local Estimate Adapter for Vector Poincare -/ + +/-- Convert a vector projected dual estimate into the corresponding vector +local-multiscale estimate at the inflated note constant. The proof +splits the right-hand sum coordinatewise and reuses the scalar bridges +`cubeBesovDualMeanZeroSeminorm_le_note_constant_mul_cubeBesovCircNorm` and +`cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp`. -/ +theorem CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.to_localEstimate + {Q : TriadicCube d} {C : ℝ} {u : Vec d → ℝ} {G : Vec d → Vec d} {M : ℕ} + (hproj : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C u G M) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + CubeLocalMultiscalePoincareVectorEstimate Q + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) u G M := by + intro j hj R hR + have hdual := hproj j hj R hR + -- per-component MemLp on the descendant R + have hGR : ∀ i, MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := by + intro i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR (hG i) + -- per-component bound chaining dual ≤ note·circ ≤ note·(3/2)·circPartial + have hcoord : + ∀ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + ((3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i)) := by + intro i + set gi : Vec d → ℝ := fun x => G x i with hgi_def + have hgiR : MeasureTheory.MemLp gi (2 : ℝ≥0∞) (normalizedCubeMeasure R) := hGR i + have hprojiMem : + MeasureTheory.MemLp (cubeProjection R (M - j) gi) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + cubeProjection_memLp R (M - j) (2 : ℝ≥0∞) gi + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hdualLeNote : + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) gi) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) gi) := by + simpa using + cubeBesovDualMeanZeroSeminorm_le_note_constant_mul_cubeBesovCircNorm + (Q := R) (s := 1) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) + (u := cubeProjection R (M - j) gi) + (by norm_num) hprojiMem (by norm_num) (by norm_num) + (by intro htop; simp [hconj_eq] at htop) + (by norm_num) + have hCircLePartial : + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) gi) ≤ + (3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) gi := + cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + (Q := R) (u := gi) (M := M - j) hgiR + have hnote_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_nonneg (by positivity) _ + calc + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) gi) + ≤ (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) gi) := hdualLeNote + _ ≤ (3 : ℝ) ^ ((d : ℝ) + 1) * + ((3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) gi) := + mul_le_mul_of_nonneg_left hCircLePartial hnote_nonneg + -- sum over coordinates + have hSum : + ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) ≤ + ∑ i : Fin d, + (3 : ℝ) ^ ((d : ℝ) + 1) * + ((3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i)) := by + refine Finset.sum_le_sum ?_ + intro i _ + exact hcoord i + have hSum_factored : + ∑ i : Fin d, + (3 : ℝ) ^ ((d : ℝ) + 1) * + ((3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i)) = + (3 : ℝ) ^ ((d : ℝ) + 1) * (3 / 2 : ℝ) * + ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _ + ring + have hC_chain : 0 ≤ C := hC + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) := hdual + _ ≤ C * ((3 : ℝ) ^ ((d : ℝ) + 1) * (3 / 2 : ℝ) * + ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i)) := by + have hsum_bound : ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection R (M - j) (fun x => G x i)) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * (3 / 2 : ℝ) * + ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i) := + le_trans hSum (le_of_eq hSum_factored) + exact mul_le_mul_of_nonneg_left hsum_bound hC_chain + _ = ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) + (fun x => G x i) := by ring + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalMultiscale.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalMultiscale.lean new file mode 100644 index 0000000000..dfd6a010df --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/HarmonicGradient/LocalMultiscale.lean @@ -0,0 +1,339 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.FullCirc + +/-! # Local Multiscale -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +variable {d : ℕ} + +/-! # Local Multiscale Vector Poincare Estimates -/ + +/-- Depthwise vector version of the multiscale Poincare-to-Besov bookkeeping. + +The local input controls oscillation by a sum of componentwise local circ +partial norms; after averaging over descendants, the component and depth sums +shift to the parent cube. -/ +theorem cubeBesovDepthSeminorm_two_le_weighted_shifted_sum_components_of_vector_local_circ_bound_poincare + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u : Vec d → ℝ) (G : Vec d → Vec d) + (j N : ℕ) (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + classical + let I : Finset (Fin d × ℕ) := + (Finset.univ : Finset (Fin d)).product (Finset.range (N + 1)) + let S : TriadicCube d → ℝ := fun R => + ∑ p ∈ I, + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2 + have hlocalS : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ C * S R := by + intro R hR + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) := hlocal R hR + _ = C * S R := by + congr 1 + simp [S, I, cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm, + Finset.sum_product] + have hS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ S R := by + intro R hR + exact Finset.sum_nonneg fun p hp => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2 + have hsq_bound : + descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) ≤ + descendantsAverage Q j (fun R => (C * S R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hCS_nonneg : 0 ≤ C * S R := mul_nonneg hC (hS_nonneg R hR) + nlinarith [hlocalS R hR, hosc_nonneg, hCS_nonneg] + have hleft_nonneg : + 0 ≤ descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_bound : + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) ≤ + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft_nonneg hsq_bound (by positivity) + have hfactor : + descendantsAverage Q j (fun R => (C * S R) ^ 2) = + C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (C * S R) ^ 2) + = descendantsAverage Q j (fun R => C ^ 2 * (S R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (C ^ 2) (fun R => (S R) ^ 2)] + have hSsq_nonneg : 0 ≤ descendantsAverage Q j (fun R => (S R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_factor : + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) = + C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [hfactor, Real.mul_rpow (sq_nonneg C) hSsq_nonneg] + congr 1 + rw [sq_rpow_half_eq_of_nonneg hC] + have hM : + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) := by + exact descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 Q j I + (fun R p => + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + (fun R hR p hp => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + have hshift : + ∀ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) = + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + intro p hp + have hnonneg : + 0 ≤ cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => G x p.1) (j + p.2) := + cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + rw [descendantsAverage_sq_cubeBesovCircDepthSeminorm_eq_shifted] + exact sq_rpow_half_eq_of_nonneg hnonneg + have hsum_reindex : + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) + = + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + refine Finset.sum_congr rfl ?_ + intro p hp + exact hshift p hp + have hweighted : + ∑ p ∈ I, + cubeBesovDepthWeight Q s j * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + = + ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + simp [I, Finset.sum_product, + cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + have hCweight_nonneg : 0 ≤ C * cubeBesovDepthWeight Q s j := + mul_nonneg hC hweight_nonneg + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage] + _ ≤ cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hroot_bound hweight_nonneg + _ = cubeBesovDepthWeight Q s j * + (C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ)) := by + rw [hroot_factor] + _ = C * cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + ring + _ ≤ C * cubeBesovDepthWeight Q s j * + (∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hM hCweight_nonneg + _ = C * cubeBesovDepthWeight Q s j * + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + rw [hsum_reindex] + _ = C * ∑ p ∈ I, + cubeBesovDepthWeight Q s j * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + rw [mul_assoc, Finset.mul_sum] + _ = C * ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + rw [hweighted] + +/-- Finite-depth `q = ∞` vector local-multiscale Poincare-to-Besov bound. -/ +theorem CubeLocalMultiscalePoincareVectorEstimate.partialSeminormTop_two_le_geometric_mul_sum + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareVectorEstimate Q C u G M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + ∑ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (M + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ?_ + intro j hj + have hj_le : j ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + have hdepth : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + exact + cubeBesovDepthSeminorm_two_le_weighted_shifted_sum_components_of_vector_local_circ_bound_poincare + Q s C u G j (M - j) hC (by + intro R hR + exact hlocal j hj R hR) + let r : ℝ := (3 : ℝ) ^ (-s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hsum_r : + ∑ n ∈ Finset.range (M - j + 1), r ^ n ≤ (1 - r)⁻¹ := by + exact geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one + have hcomponent : + ∀ i : Fin d, + ∑ n ∈ Finset.range (M - j + 1), + r ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + intro i + have hsum_shift : + ∑ n ∈ Finset.range (M - j + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + simpa [Nat.add_sub_of_le hj_le] using + shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) j (M - j) (fun x => G x i) + have hweighted : + ∑ n ∈ Finset.range (M - j + 1), + r ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + (∑ n ∈ Finset.range (M - j + 1), r ^ n) * + (∑ n ∈ Finset.range (M - j + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) := by + exact sum_mul_le_mul_sum_of_nonneg + (s := Finset.range (M - j + 1)) + (f := fun n => r ^ n) + (g := fun n => + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) + (fun n hn => pow_nonneg hr_nonneg n) + (fun n hn => + cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) + calc + ∑ n ∈ Finset.range (M - j + 1), + r ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) + ≤ (∑ n ∈ Finset.range (M - j + 1), r ^ n) * + (∑ n ∈ Finset.range (M - j + 1), + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) := hweighted + _ ≤ (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + exact mul_le_mul hsum_r hsum_shift + (Finset.sum_nonneg fun n hn => + cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hsum_components : + ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), + r ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) ≤ + ∑ i : Fin d, + (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact hcomponent i + have hinv_sum : + ∑ i : Fin d, + (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) + = + (1 - r)⁻¹ * + ∑ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + rw [Finset.mul_sum] + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), + r ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + simpa [r] using hdepth + _ ≤ C * ((1 - r)⁻¹ * + ∑ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i)) := by + exact mul_le_mul_of_nonneg_left + (le_trans hsum_components (le_of_eq hinv_sum)) hC + _ = C * (1 - r)⁻¹ * + ∑ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + ring + +/-- Finite-depth fluctuation form of the vector local-multiscale +Poincare-to-Besov bound. -/ +theorem CubeLocalMultiscalePoincareVectorEstimate.fluctuation_partialNormTop_two_le_geometric_mul_sum + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareVectorEstimate Q C (cubeFluctuation Q u) G M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + ∑ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) := by + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) (N := M) + (u := cubeFluctuation Q u) (cubeAverage_cubeFluctuation Q u)] + exact hlocal.partialSeminormTop_two_le_geometric_mul_sum hs hC + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Projection.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Projection.lean new file mode 100644 index 0000000000..756095cda9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Projection.lean @@ -0,0 +1,547 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Structures + +/-! # Projection -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +theorem geom_sum_range_le_of_lt_one {x : ℝ} {n : ℕ} (hx : 0 ≤ x) (hx1 : x < 1) : + Finset.sum (Finset.range n) (fun i => x ^ i) ≤ (1 - x)⁻¹ := by + rw [Finset.range_eq_Ico] + simpa using + (geom_sum_Ico_le_of_lt_one (x := x) (m := 0) (n := n) hx hx1) + +theorem sum_mul_le_mul_sum_of_nonneg {ι : Type*} {s : Finset ι} {f g : ι → ℝ} + (hf : ∀ i ∈ s, 0 ≤ f i) (hg : ∀ i ∈ s, 0 ≤ g i) : + Finset.sum s (fun i => f i * g i) ≤ (Finset.sum s f) * Finset.sum s g := by + have hpoint : ∀ i ∈ s, f i * g i ≤ f i * Finset.sum s g := by + intro i hi + exact mul_le_mul_of_nonneg_left (Finset.single_le_sum hg hi) (hf i hi) + have hsum : Finset.sum s (fun i => f i * g i) ≤ Finset.sum s (fun i => f i * Finset.sum s g) := + Finset.sum_le_sum hpoint + simpa [Finset.sum_mul] using hsum + +theorem descendantsAverage_add_eq_descendantsAverage_descendantsAverage {d : ℕ} + (Q : TriadicCube d) (j n : ℕ) (F : TriadicCube d → ℝ) : + descendantsAverage Q (j + n) F = + descendantsAverage Q j (fun R => descendantsAverage R n F) := by + induction n generalizing Q F with + | zero => + simp [descendantsAverage] + | succ n ih => + calc + descendantsAverage Q (j + (n + 1)) F + = descendantsAverage Q (j + n) (fun R => descendantsAverage R 1 F) := by + simpa [Nat.add_assoc] using + descendantsAverage_succ_eq_descendantsAverage_descendantsAverage + Q (j + n) F + _ = descendantsAverage Q j + (fun R => descendantsAverage R n (fun S => descendantsAverage S 1 F)) := by + simpa using ih Q (fun S => descendantsAverage S 1 F) + _ = descendantsAverage Q j (fun R => descendantsAverage R (n + 1) F) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + symm + exact descendantsAverage_succ_eq_descendantsAverage_descendantsAverage R n F + +theorem mem_descendantsAtDepth_add {d : ℕ} {Q R S : TriadicCube d} {j n : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (hS : S ∈ descendantsAtDepth R n) : + S ∈ descendantsAtDepth Q (j + n) := by + induction n generalizing Q R S j with + | zero => + have hSR : S = R := by simpa using hS + subst hSR + simpa + | succ n ih => + rcases mem_descendantsAtDepth_succ_iff.mp hS with ⟨T, hT, hST⟩ + have hTQ : T ∈ descendantsAtDepth Q (j + n) := ih hR hT + have hSQ : S ∈ descendantsAtDepth Q ((j + n) + 1) := by + exact mem_descendantsAtDepth_succ_iff.mpr ⟨T, hTQ, hST⟩ + simpa [Nat.add_assoc] using hSQ + +theorem cubeProjection_add_eq_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j n : ℕ} (f : Vec d → ℝ) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hx : x ∈ cubeSet R) : + cubeProjection Q (j + n) f x = cubeProjection R n f x := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := R) (n := n) hx with + ⟨S, hS, hxS⟩ + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := S) (j := j + n) f hSQ hxS] + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := R) (R := S) (j := n) f hS hxS] + +theorem cubeAverage_cubeProjection_eq_cubeAverage_of_memLp {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage Q (cubeProjection Q j u) = cubeAverage Q u := by + have hprojInt : + MeasureTheory.IntegrableOn (cubeProjection Q j u) (cubeSet Q) MeasureTheory.volume := + integrableOn_cubeProjection_of_integrableOn Q j u + have huInt : + MeasureTheory.IntegrableOn u (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hu.integrable (by norm_num)) + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := cubeProjection Q j u) hprojInt] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := u) huInt] + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (g := u) hR] + +theorem cubeAverage_cubeProjection_add_eq_cubeAverage_of_mem_descendantsAtDepth_of_memLp + {d : ℕ} {Q R : TriadicCube d} {j n : ℕ} (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage R (cubeProjection Q (j + n) u) = cubeAverage R u := by + have hcongr : + cubeAverage R (cubeProjection Q (j + n) u) = + cubeAverage R (cubeProjection R n u) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + exact cubeProjection_add_eq_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (n := n) (f := u) hR hx + rw [hcongr] + have huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hu + exact cubeAverage_cubeProjection_eq_cubeAverage_of_memLp R n u huR + +theorem cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} + {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := by + rw [cubeScaleFactor, scale_eq_sub_of_mem_descendantsAtDepth hR, zpow_sub₀] + · simp [cubeScaleFactor, div_eq_mul_inv] + · norm_num + +/-- Besov scale weights on a depth-`j` descendant differ from the parent +weight by the triadic factor `3^(s j)`. -/ +theorem cubeBesovScaleWeight_eq_mul_rpow_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (s : ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovScaleWeight s R = + cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + have hQR : cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := + cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR + have hQpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow_pos : 0 < (3 : ℝ) ^ j := by positivity + unfold cubeBesovScaleWeight + rw [hQR] + calc + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) + = (cubeScaleFactor Q) ^ (-s) / (((3 : ℝ) ^ j) ^ (-s)) := by + rw [Real.div_rpow hQpos.le hpow_pos.le] + _ = (cubeScaleFactor Q) ^ (-s) / + Real.rpow (3 : ℝ) ((-s) * (j : ℝ)) := by + have hpow : + (((3 : ℝ) ^ j : ℝ) ^ (-s)) = + Real.rpow (3 : ℝ) ((-s) * (j : ℝ)) := by + simpa [mul_comm] using + (Real.rpow_natCast_mul (by positivity : 0 ≤ (3 : ℝ)) j (-s)).symm + rw [hpow] + _ = (cubeScaleFactor Q) ^ (-s) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + have hneg : (-s) * (j : ℝ) = -(s * (j : ℝ)) := by ring + have hrpow_neg : + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) = + (Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ := by + simpa using + (Real.rpow_neg (x := (3 : ℝ)) + (by norm_num : 0 ≤ (3 : ℝ)) (s * (j : ℝ))) + rw [div_eq_mul_inv, hneg, hrpow_neg, inv_inv] + +/-- Parent-weight form of the descendant Besov-weight identity. For a +depth-`j` descendant, the parent scale weight times the triadic depth factor is +the descendant scale weight. -/ +theorem cubeBesovScaleWeight_neg_parent_mul_rpow_eq_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (r : ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovScaleWeight (-r) Q * Real.rpow (3 : ℝ) (-r * (j : ℝ)) = + cubeBesovScaleWeight (-r) R := by + simpa [mul_comm] using + (cubeBesovScaleWeight_eq_mul_rpow_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (-r) hR).symm + +/-- Cancellation form of the descendant Besov-weight identity used in the +small-cube Caccioppoli summation. -/ +theorem cubeBesovScaleWeight_neg_mul_rpow_eq_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (r : ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovScaleWeight (-r) R * Real.rpow (3 : ℝ) (r * (j : ℝ)) = + cubeBesovScaleWeight (-r) Q := by + have hscale := + cubeBesovScaleWeight_eq_mul_rpow_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (-r) hR + rw [hscale] + have hsum : (-r) * (j : ℝ) + r * (j : ℝ) = 0 := by ring + calc + (cubeBesovScaleWeight (-r) Q * + Real.rpow (3 : ℝ) ((-r) * (j : ℝ))) * + Real.rpow (3 : ℝ) (r * (j : ℝ)) + = + cubeBesovScaleWeight (-r) Q * + (Real.rpow (3 : ℝ) ((-r) * (j : ℝ)) * + Real.rpow (3 : ℝ) (r * (j : ℝ))) := by + ring + _ = + cubeBesovScaleWeight (-r) Q * + Real.rpow (3 : ℝ) (((-r) * (j : ℝ)) + r * (j : ℝ)) := by + have hadd : + Real.rpow (3 : ℝ) (((-r) * (j : ℝ)) + r * (j : ℝ)) = + Real.rpow (3 : ℝ) ((-r) * (j : ℝ)) * + Real.rpow (3 : ℝ) (r * (j : ℝ)) := by + simpa using + (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + ((-r) * (j : ℝ)) (r * (j : ℝ))) + rw [hadd] + _ = cubeBesovScaleWeight (-r) Q := by + rw [hsum] + simp + +theorem cubeBesovCircDepthAverage_add_eq_descendantsAverage_cubeBesovCircDepthAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j n : ℕ) : + cubeBesovCircDepthAverage Q p u (j + n) = + descendantsAverage Q j (fun R => cubeBesovCircDepthAverage R p u n) := by + unfold cubeBesovCircDepthAverage + simpa using descendantsAverage_add_eq_descendantsAverage_descendantsAverage + (Q := Q) (j := j) (n := n) (F := fun R => ‖cubeAverage R u‖ ^ p.toReal) + +theorem cubeBesovCircDepthAverage_projection_eventually_constant {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N r : ℕ) : + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1 + r) = + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1) := by + calc + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1 + r) + = descendantsAverage Q (N + 1) + (fun R => cubeBesovCircDepthAverage R (2 : ℝ≥0∞) + (cubeProjection Q (N + 1) u) r) := by + rw [cubeBesovCircDepthAverage_add_eq_descendantsAverage_cubeBesovCircDepthAverage] + _ = descendantsAverage Q (N + 1) + (fun R => ‖cubeAverage R u‖ ^ ((2 : ℝ≥0∞).toReal)) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q (N + 1)).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have havg : + cubeBesovCircDepthAverage R (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) r = + ‖cubeAverage R u‖ ^ ((2 : ℝ≥0∞).toReal) := by + calc + cubeBesovCircDepthAverage R (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) r + = descendantsAverage R r + (fun _ => ‖cubeAverage R u‖ ^ ((2 : ℝ≥0∞).toReal)) := by + unfold cubeBesovCircDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth R r).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro S hS + have hRS : + cubeAverage S (cubeProjection Q (N + 1) u) = cubeAverage R u := by + have hcongr : + cubeAverage S (cubeProjection Q (N + 1) u) = + cubeAverage S (fun _ => cubeAverage R u) := by + apply cubeAverage_congr_on_cubeSet + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := N + 1) u hR] + exact cubeSet_subset_of_mem_descendantsAtDepth hS hx + rw [hcongr, cubeAverage_const] + simp [hRS] + _ = ‖cubeAverage R u‖ ^ ((2 : ℝ≥0∞).toReal) := by + simp [descendantsAverage_const] + simp [havg] + _ = cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1) := by + unfold cubeBesovCircDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q (N + 1)).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := N + 1) (g := u) hR] + +theorem cubeBesovCircDepthSeminorm_projection_eventually_geometric {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N r : ℕ) : + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1 + r) = + (1 / 3 : ℝ) ^ r * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) (N + 1) := by + unfold cubeBesovCircDepthSeminorm + rw [cubeBesovCircDepthAverage_projection_eventually_constant] + have hweight : + cubeBesovCircDepthWeight Q 1 (N + 1 + r) = + (1 / 3 : ℝ) ^ r * cubeBesovCircDepthWeight Q 1 (N + 1) := by + unfold cubeBesovCircDepthWeight + rw [Real.rpow_one, Real.rpow_one] + calc + cubeScaleFactor Q / (3 : ℝ) ^ (N + 1 + r) + = cubeScaleFactor Q / ((3 : ℝ) ^ (N + 1) * (3 : ℝ) ^ r) := by + rw [pow_add] + _ = (1 / 3 : ℝ) ^ r * (cubeScaleFactor Q / (3 : ℝ) ^ (N + 1)) := by + rw [show (1 / 3 : ℝ) ^ r = ((3 : ℝ) ^ r)⁻¹ by rw [one_div, inv_pow]] + field_simp + rw [hweight] + ring_nf + +theorem cubeBesovCircDepthAverage_projection_eq_of_le {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N j : ℕ) + (hj : j ≤ N + 1) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) j = + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) u j := by + unfold cubeBesovCircDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have havg : + cubeAverage R (cubeProjection Q (N + 1) u) = cubeAverage R u := by + simpa [Nat.add_sub_of_le hj] using + cubeAverage_cubeProjection_add_eq_cubeAverage_of_mem_descendantsAtDepth_of_memLp + (Q := Q) (R := R) (j := j) (n := N + 1 - j) (u := u) hR hu + simp [havg] + +theorem cubeBesovCircDepthSeminorm_projection_eq_of_le {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (s : ℝ) (N j : ℕ) + (hj : j ≤ N + 1) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (cubeProjection Q (N + 1) u) j = + cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) u j := by + unfold cubeBesovCircDepthSeminorm + rw [cubeBesovCircDepthAverage_projection_eq_of_le Q u N j hj hu] + +theorem cubeBesovCircPartialNorm_projection_eq {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) (cubeProjection Q (N + 1) u) = + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) u := by + simp [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm] + refine Finset.sum_congr rfl ?_ + intro j hj + have hj_le : j ≤ N + 1 := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + simpa using cubeBesovCircDepthSeminorm_projection_eq_of_le Q u 1 N j hj_le hu + +@[simp] theorem cubeBesovCircPartialNorm_one_eq_sum {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) N u = + ∑ n ∈ Finset.range (N + 1), cubeBesovCircDepthSeminorm Q s p u n := by + simp [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm] + +theorem cubeBesovCircPartialNorm_one_mono {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) {M N : ℕ} + (hMN : M ≤ N) : + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) M u ≤ + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) N u := by + rw [cubeBesovCircPartialNorm_one_eq_sum, cubeBesovCircPartialNorm_one_eq_sum] + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + exact Finset.mem_range.mpr <| + lt_of_lt_of_le (Finset.mem_range.mp hj) (Nat.succ_le_succ hMN) + · intro j _ _ + exact cubeBesovCircDepthSeminorm_nonneg Q s p u j + +theorem cubeBesovCircPartialNorm_one_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovCircPartialNorm Q s p (1 : ℝ≥0∞) 0 u = + cubeBesovScaleWeight (-s) Q * ‖cubeAverage Q u‖ := by + rw [cubeBesovCircPartialNorm_one_eq_sum] + simp [cubeBesovCircDepthSeminorm_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage, hp0, hpTop] + +theorem cubeLpNorm_projection_depth_zero_eq_norm_cubeAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (hp0 : p ≠ 0) : + cubeLpNorm Q p (cubeProjection Q 0 u) = ‖cubeAverage Q u‖ := by + calc + cubeLpNorm Q p (cubeProjection Q 0 u) + = cubeLpNorm Q p (fun _ => cubeAverage Q u) := by + apply cubeLpNorm_congr_on_cubeSet (Q := Q) (p := p) + intro x hx + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) u (by simp) hx] + _ = ‖cubeAverage Q u‖ := by + simpa using cubeLpNorm_const (Q := Q) (p := p) (c := cubeAverage Q u) hp0 + +theorem cubeBesovCircNorm_projection_zero_le_three_halves_mul_cubeBesovCircPartialNorm_zero_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection Q 0 u) ≤ + (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 u := by + have hprojMem : + MeasureTheory.MemLp (cubeProjection Q 0 u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + cubeProjection_memLp Q 0 (2 : ℝ≥0∞) u + have hgeom_const : (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ = (3 / 2 : ℝ) := by + rw [Real.rpow_neg (by positivity), Real.rpow_one] + norm_num + have hbase_eq : + cubeBesovScaleWeight (-1) Q * cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q 0 u) = + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 u := by + calc + cubeBesovScaleWeight (-1) Q * cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q 0 u) + = cubeBesovScaleWeight (-1) Q * ‖cubeAverage Q u‖ := by + rw [cubeLpNorm_projection_depth_zero_eq_norm_cubeAverage + (Q := Q) (p := (2 : ℝ≥0∞)) (u := u) (by norm_num)] + _ = cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 u := by + symm + exact cubeBesovCircPartialNorm_one_depth_zero_eq_scaleWeight_neg_mul_norm_cubeAverage + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (u := u) (by norm_num) (by norm_num) + unfold cubeBesovCircNorm + refine csSup_le + (cubeBesovCircNormValueSet_nonempty Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection Q 0 u)) ?_ + intro r hr + rcases hr with ⟨M, rfl⟩ + calc + cubeBesovCircNormEntry Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M (cubeProjection Q 0 u) + ≤ (cubeBesovScaleWeight (-1) Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q 0 u)) * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ := by + exact cubeBesovCircNormEntry_le_geometric_constant_of_memLp + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) + (N := M) (u := cubeProjection Q 0 u) + (by norm_num) hprojMem (by norm_num) (by norm_num) (by norm_num) + _ = (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 u := by + rw [hbase_eq, hgeom_const] + ring + +theorem cubeBesovCircNorm_projection_succ_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection Q (N + 1) u) ≤ + (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) u := by + let uN : Vec d → ℝ := cubeProjection Q (N + 1) u + let a : ℕ → ℝ := fun j => cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) uN j + let P : ℝ := cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) uN + have hP_eq : + P = cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) u := by + dsimp [P, uN] + exact cubeBesovCircPartialNorm_projection_eq Q u N hu + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact cubeBesovCircPartialNorm_nonneg Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) uN + unfold cubeBesovCircNorm + refine csSup_le + (cubeBesovCircNormValueSet_nonempty Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) uN) ?_ + intro r hr + rcases hr with ⟨M, rfl⟩ + simp only [cubeBesovCircNormEntry, if_neg ENNReal.one_ne_top] + by_cases hMN : M ≤ N + · calc + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M + 1) uN + ≤ cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) uN := by + exact cubeBesovCircPartialNorm_one_mono + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (u := uN) + (Nat.succ_le_succ hMN) + _ = P := by rfl + _ ≤ (3 / 2 : ℝ) * P := by nlinarith + _ = (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) u := by + rw [hP_eq] + · have hNM : N < M := lt_of_not_ge hMN + have hsplit : + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M + 1) uN = + P + ∑ j ∈ Finset.Ico (N + 2) (M + 2), a j := by + rw [cubeBesovCircPartialNorm_one_eq_sum] + dsimp [P, a] + rw [← Finset.sum_range_add_sum_Ico + (f := fun j => cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) uN j) + (h := Nat.add_le_add_right hNM.le 2)] + rw [cubeBesovCircPartialNorm_one_eq_sum] + have htail_shift : + ∑ j ∈ Finset.Ico (N + 2) (M + 2), a j = + ∑ r ∈ Finset.range (M - N), a (N + 2 + r) := by + rw [Finset.sum_Ico_eq_sum_range, Nat.add_sub_add_right] + have htail_geom : + ∑ r ∈ Finset.range (M - N), a (N + 2 + r) = + ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ (r + 1) * a (N + 1) := by + refine Finset.sum_congr rfl ?_ + intro r hr + simpa [a, uN, Nat.add_assoc, Nat.add_left_comm, Nat.add_comm] using + cubeBesovCircDepthSeminorm_projection_eventually_geometric + (Q := Q) (u := u) (N := N) (r := r + 1) + have hgeom_half : + ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ (r + 1) ≤ (1 / 2 : ℝ) := by + calc + ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ (r + 1) + = ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) * (1 / 3 : ℝ) ^ r := by + refine Finset.sum_congr rfl ?_ + intro r hr + rw [pow_succ, mul_comm] + _ = (1 / 3 : ℝ) * ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ r := by + rw [Finset.mul_sum] + _ ≤ (1 / 3 : ℝ) * (1 - (1 / 3 : ℝ))⁻¹ := by + gcongr + exact geom_sum_range_le_of_lt_one (show 0 ≤ (1 / 3 : ℝ) by norm_num) + (show (1 / 3 : ℝ) < 1 by norm_num) + _ = (1 / 2 : ℝ) := by norm_num + have hdepth_le_P : a (N + 1) ≤ P := by + dsimp [a, P] + rw [cubeBesovCircPartialNorm_one_eq_sum] + exact Finset.single_le_sum + (fun j _ => cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) uN j) + (by simp) + have htail_le : ∑ j ∈ Finset.Ico (N + 2) (M + 2), a j ≤ (1 / 2 : ℝ) * P := by + calc + ∑ j ∈ Finset.Ico (N + 2) (M + 2), a j + = ∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ (r + 1) * a (N + 1) := by + rw [htail_shift, htail_geom] + _ = (∑ r ∈ Finset.range (M - N), (1 / 3 : ℝ) ^ (r + 1)) * a (N + 1) := by + rw [← Finset.sum_mul] + _ ≤ (1 / 2 : ℝ) * a (N + 1) := by + exact mul_le_mul_of_nonneg_right hgeom_half + (cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) uN (N + 1)) + _ ≤ (1 / 2 : ℝ) * P := by + exact mul_le_mul_of_nonneg_left hdepth_le_P (by norm_num) + calc + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M + 1) uN + = P + ∑ j ∈ Finset.Ico (N + 2) (M + 2), a j := hsplit + _ ≤ P + (1 / 2 : ℝ) * P := by gcongr + _ = (3 / 2 : ℝ) * P := by ring + _ = (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) u := by + rw [hP_eq] + +theorem cubeBesovCircNorm_projection_succ_le_three_halves_mul_cubeBesovCircPartialNorm_on_descendants_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (M : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection R (M - j + 1) u) ≤ + (3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j + 1) u := by + intro j hj R hR + have huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hu + exact cubeBesovCircNorm_projection_succ_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + (Q := R) (u := u) (N := M - j) huR + +theorem cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (M : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection Q M u) ≤ + (3 / 2 : ℝ) * cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M u := by + cases M with + | zero => + exact cubeBesovCircNorm_projection_zero_le_three_halves_mul_cubeBesovCircPartialNorm_zero_of_memLp + (Q := Q) (u := u) + | succ N => + simpa using + cubeBesovCircNorm_projection_succ_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + (Q := Q) (u := u) (N := N) hu + +theorem cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_on_descendants_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (M : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (cubeProjection R (M - j) u) ≤ + (3 / 2 : ℝ) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) u := by + intro j hj R hR + have huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hu + exact cubeBesovCircNorm_projection_le_three_halves_mul_cubeBesovCircPartialNorm_of_memLp + (Q := R) (u := u) (M := M - j) huR + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Structures.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Structures.lean new file mode 100644 index 0000000000..f25b0b3f4c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Poincare/Structures.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison +public import Mathlib.Algebra.Order.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.Field.GeomSum +public import Mathlib.Analysis.MeanInequalities + +/-! # Structures -/ + +@[expose] public section + +namespace Homogenization + + +open scoped BigOperators ENNReal + +/-- Descendant-local analytic input for the finite-depth multiscale Poincare corridor. -/ +def CubeMultiscalePoincareInput {d : ℕ} (Q : TriadicCube d) + (C : ℝ) (u g : Vec d → ℝ) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (M - j + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n + +theorem CubeMultiscalePoincareInput.bound {d : ℕ} {Q : TriadicCube d} + {C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) : + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ n ∈ Finset.range (M - j + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n := + hinput + +/-- Concrete descendant-local multiscale Poincare hypothesis phrased with the +`q = 1` concrete circ norm on each descendant cube. -/ +def CubeLocalMultiscalePoincareEstimate {d : ℕ} (Q : TriadicCube d) + (C : ℝ) (u g : Vec d → ℝ) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g + +theorem CubeLocalMultiscalePoincareEstimate.to_input {d : ℕ} {Q : TriadicCube d} + {C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareEstimate Q C u g M) : + CubeMultiscalePoincareInput Q C u g M := by + intro j hj R hR + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g := + hlocal j hj R hR + _ = C * ∑ n ∈ Finset.range (M - j + 1), cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) g n := by + simp [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm] + +/-- Single-cube analytic Poincare estimate phrased with the true dual mean-zero +negative Besov seminorm at the `s = 1`, `p = 2`, `q = 1` endpoint. This is the +black-box form of the note's `l.multiscale.Poincare.function.spaces` before +passing to the concrete circ norm. -/ +def CubeDualMeanZeroPoincareEstimate {d : ℕ} (Q : TriadicCube d) + (C : ℝ) (u g : Vec d → ℝ) : Prop := + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + C * cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g + +theorem CubeDualMeanZeroPoincareEstimate.to_circNorm {d : ℕ} {Q : TriadicCube d} + {C : ℝ} {u g : Vec d → ℝ} + (hdual : CubeDualMeanZeroPoincareEstimate Q C u g) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + C * (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := by + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hdual_le : + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := by + exact cubeBesovDualMeanZeroSeminorm_le_note_constant_mul_cubeBesovCircNorm + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) (u := g) + (by norm_num) hg (by norm_num) (by norm_num) + (by + intro htop + simp [hconj_eq] at htop) + (by norm_num) + calc + cubeBesovOscillation Q (2 : ℝ≥0∞) u + ≤ C * cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := hdual + _ ≤ C * ((3 : ℝ) ^ ((d : ℝ) + 1) * cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g) := by + exact mul_le_mul_of_nonneg_left hdual_le hC + _ = C * (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := by + ring + +theorem CubeDualMeanZeroPoincareEstimate.fluctuation_le_circNorm + {d : ℕ} {Q : TriadicCube d} {C : ℝ} {u g : Vec d → ℝ} + (hdual : CubeDualMeanZeroPoincareEstimate Q C u g) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hC : 0 ≤ C) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + C * (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := by + simpa [cubeBesovOscillation] using hdual.to_circNorm hg hC + +/-- Descendant-local analytic input packaging the single-cube dual mean-zero +Poincare estimate together with the local `L²` admissibility and the +finite-depth comparison from the full circ norm to the concrete `q = 1` +partial circ norm on each descendant. This is the theorem-surface bridge from +the single-cube analytic lemma to `CubeLocalMultiscalePoincareEstimate`. -/ +def CubeDescendantDualMeanZeroPoincareInput {d : ℕ} (Q : TriadicCube d) + (C K : ℝ) (u g : Vec d → ℝ) (M : ℕ) : Prop := + ∀ j ∈ Finset.range (M + 1), ∀ R ∈ descendantsAtDepth Q j, + CubeDualMeanZeroPoincareEstimate R C u g ∧ + MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure R) ∧ + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g ≤ + K * cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g + +theorem CubeDescendantDualMeanZeroPoincareInput.to_localEstimate + {d : ℕ} {Q : TriadicCube d} {C K : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeDescendantDualMeanZeroPoincareInput Q C K u g M) + (hC : 0 ≤ C) : + CubeLocalMultiscalePoincareEstimate Q + (C * (3 : ℝ) ^ ((d : ℝ) + 1) * K) u g M := by + intro j hj R hR + rcases hinput j hj R hR with ⟨hdual, hg, htail⟩ + have hnote_nonneg : 0 ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) := by + exact mul_nonneg hC (Real.rpow_nonneg (by positivity) _) + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) g := + hdual.to_circNorm hg hC + _ ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) * + (K * cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g) := by + exact mul_le_mul_of_nonneg_left htail hnote_nonneg + _ = (C * (3 : ℝ) ^ ((d : ℝ) + 1) * K) * + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (M - j) g := by + ring + +theorem CubeDescendantDualMeanZeroPoincareInput.to_input + {d : ℕ} {Q : TriadicCube d} {C K : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeDescendantDualMeanZeroPoincareInput Q C K u g M) + (hC : 0 ≤ C) : + CubeMultiscalePoincareInput Q + (C * (3 : ℝ) ^ ((d : ℝ) + 1) * K) u g M := by + exact (hinput.to_localEstimate hC).to_input + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive.lean new file mode 100644 index 0000000000..94ed61e92b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic + +/-! # Positive -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-! +Finite disjoint positive-order cube Besov seminorms. + +This file intentionally contains only the descendant-based positive Besov core. +Scalar overlap definitions and full `sSup` wrappers live in narrow downstream +modules so ordinary importers of `Besov.Positive` do not pay for overlap geometry. +-/ + +noncomputable def cubeBesovDepthAverage {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => (cubeBesovOscillation R p u) ^ p.toReal + +noncomputable def cubeBesovDepthWeight {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) : ℝ := + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) + +noncomputable def cubeBesovDepthSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : ℝ := + cubeBesovDepthWeight Q s j * (cubeBesovDepthAverage Q p u j) ^ (1 / p.toReal) + +noncomputable def cubeBesovPartialSeminorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := by + exact + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s p u j) ^ q.toReal)) ^ (1 / q.toReal) + +noncomputable def cubeBesovPartialSeminormTop {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + (Finset.range (N + 1)).sup' ⟨0, by simp⟩ (fun j => cubeBesovDepthSeminorm Q s p u j) + +noncomputable def cubeBesovPartialNorm {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialSeminorm Q s p q N u + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +noncomputable def cubeBesovPartialNormTop {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialSeminormTop Q s p N u + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +/-! +## Explicit disjoint positive Besov names + +These names disambiguate the legacy descendant-based positive Besov pieces from +the overlap-based `cubeBesovOverlap*` family in downstream modules. The unqualified +`cubeBesov*` names remain as compatibility aliases for existing theorem +statements until the public API flip gate. +-/ + +noncomputable abbrev cubeBesovDisjointDepthAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : ℝ := + cubeBesovDepthAverage Q p u j + +noncomputable abbrev cubeBesovDisjointDepthWeight {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : ℝ := + cubeBesovDepthWeight Q s j + +noncomputable abbrev cubeBesovDisjointDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : ℝ := + cubeBesovDepthSeminorm Q s p u j + +noncomputable abbrev cubeBesovDisjointPartialSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialSeminorm Q s p q N u + +noncomputable abbrev cubeBesovDisjointPartialSeminormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialSeminormTop Q s p N u + +noncomputable abbrev cubeBesovDisjointPartialNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialNorm Q s p q N u + +noncomputable abbrev cubeBesovDisjointPartialNormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovPartialNormTop Q s p N u + +@[simp] theorem cubeBesovDepthAverage_depth_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + cubeBesovDepthAverage Q p u 0 = (cubeBesovOscillation Q p u) ^ p.toReal := by + unfold cubeBesovDepthAverage descendantsAverage + simp + +@[simp] theorem cubeBesovDepthWeight_depth_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) : + cubeBesovDepthWeight Q s 0 = cubeBesovScaleWeight s Q := by + unfold cubeBesovDepthWeight cubeBesovScaleWeight + simp + +theorem cubeBesovDepthAverage_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovDepthAverage Q p u j := by + unfold cubeBesovDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => + Real.rpow_nonneg (cubeBesovOscillation_nonneg R p u) _ + +theorem cubeBesovDepthWeight_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + 0 ≤ cubeBesovDepthWeight Q s j := by + unfold cubeBesovDepthWeight + have hQ : 0 ≤ cubeScaleFactor Q := le_of_lt <| by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow : 0 ≤ (3 : ℝ) ^ j := by positivity + exact Real.rpow_nonneg (div_nonneg hQ hpow) _ + +theorem cubeBesovDepthSeminorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovDepthSeminorm Q s p u j := by + unfold cubeBesovDepthSeminorm + exact mul_nonneg (cubeBesovDepthWeight_nonneg Q s j) + (Real.rpow_nonneg (cubeBesovDepthAverage_nonneg Q p u j) _) + +theorem cubeBesovPartialSeminorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovPartialSeminorm Q s p q N u := by + unfold cubeBesovPartialSeminorm + exact Real.rpow_nonneg + (Finset.sum_nonneg fun j _ => Real.rpow_nonneg (cubeBesovDepthSeminorm_nonneg Q s p u j) _) + _ + +theorem cubeBesovPartialSeminormTop_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovPartialSeminormTop Q s p N u := by + unfold cubeBesovPartialSeminormTop + exact le_trans (cubeBesovDepthSeminorm_nonneg Q s p u 0) + (Finset.le_sup' (f := fun j => cubeBesovDepthSeminorm Q s p u j) (by simp)) + +theorem cubeBesovPartialNorm_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovPartialNorm Q s p q N u := by + unfold cubeBesovPartialNorm + exact add_nonneg + (cubeBesovPartialSeminorm_nonneg Q s p q N u) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem cubeBesovPartialNormTop_nonneg {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ cubeBesovPartialNormTop Q s p N u := by + unfold cubeBesovPartialNormTop + exact add_nonneg + (cubeBesovPartialSeminormTop_nonneg Q s p N u) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +private theorem sum_range_succ_mono_of_nonneg {f : ℕ → ℝ} + (h_nonneg : ∀ j : ℕ, 0 ≤ f j) {N M : ℕ} (hNM : N ≤ M) : + (Finset.range (N + 1)).sum f ≤ (Finset.range (M + 1)).sum f := by + classical + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + exact Finset.mem_range.mpr + (lt_of_lt_of_le (Finset.mem_range.mp hj) (Nat.succ_le_succ hNM)) + · intro j _hjM _hjN + exact h_nonneg j + +private theorem sup'_range_succ_mono {f : ℕ → ℝ} {N M : ℕ} (hNM : N ≤ M) : + (Finset.range (N + 1)).sup' ⟨0, by simp⟩ f ≤ + (Finset.range (M + 1)).sup' ⟨0, by simp⟩ f := by + classical + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := f) ?_ + intro j hj + exact Finset.le_sup' (s := Finset.range (M + 1)) (f := f) + (Finset.mem_range.mpr + (lt_of_lt_of_le (Finset.mem_range.mp hj) (Nat.succ_le_succ hNM))) + +theorem cubeBesovPartialSeminorm_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : 0 < q.toReal) : + Monotone fun N : ℕ => cubeBesovPartialSeminorm Q s p q N u := by + intro N M hNM + unfold cubeBesovPartialSeminorm + have hsumN_nonneg : + 0 ≤ (Finset.range (N + 1)).sum + (fun j => (cubeBesovDepthSeminorm Q s p u j) ^ q.toReal) := by + exact Finset.sum_nonneg fun j _ => + Real.rpow_nonneg (cubeBesovDepthSeminorm_nonneg Q s p u j) _ + have hsum_le : + (Finset.range (N + 1)).sum + (fun j => (cubeBesovDepthSeminorm Q s p u j) ^ q.toReal) ≤ + (Finset.range (M + 1)).sum + (fun j => (cubeBesovDepthSeminorm Q s p u j) ^ q.toReal) := by + exact sum_range_succ_mono_of_nonneg + (fun j => Real.rpow_nonneg (cubeBesovDepthSeminorm_nonneg Q s p u j) _) + hNM + exact Real.rpow_le_rpow hsumN_nonneg hsum_le (one_div_pos.mpr hq).le + +theorem cubeBesovPartialSeminormTop_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + Monotone fun N : ℕ => cubeBesovPartialSeminormTop Q s p N u := by + intro N M hNM + unfold cubeBesovPartialSeminormTop + exact sup'_range_succ_mono (f := fun j => cubeBesovDepthSeminorm Q s p u j) hNM + +theorem cubeBesovPartialNorm_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : 0 < q.toReal) : + Monotone fun N : ℕ => cubeBesovPartialNorm Q s p q N u := by + intro N M hNM + unfold cubeBesovPartialNorm + exact add_le_add (cubeBesovPartialSeminorm_mono_N Q s p q u hq hNM) le_rfl + +theorem cubeBesovPartialNormTop_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + Monotone fun N : ℕ => cubeBesovPartialNormTop Q s p N u := by + intro N M hNM + unfold cubeBesovPartialNormTop + exact add_le_add (cubeBesovPartialSeminormTop_mono_N Q s p u hNM) le_rfl + +@[simp] theorem cubeBesovDepthAverage_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : ℝ) (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDepthAverage Q p (fun _ => u) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + unfold cubeBesovDepthAverage descendantsAverage + simp [cubeBesovOscillation_const, hpPos.ne'] + +@[simp] theorem cubeBesovDepthAverage_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDepthAverage Q p (fun _ => (0 : ℝ)) j = 0 := by + simpa using cubeBesovDepthAverage_const (Q := Q) (p := p) (u := (0 : ℝ)) (j := j) hp0 hpTop + +@[simp] theorem cubeBesovDepthSeminorm_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : ℝ) (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDepthSeminorm Q s p (fun _ => u) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hpInv : (1 / p.toReal) ≠ 0 := one_div_ne_zero hpPos.ne' + unfold cubeBesovDepthSeminorm + rw [cubeBesovDepthAverage_const (Q := Q) (p := p) (u := u) (j := j) hp0 hpTop] + rw [Real.zero_rpow hpInv, mul_zero] + +@[simp] theorem cubeBesovDepthSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (j : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDepthSeminorm Q s p (fun _ => (0 : ℝ)) j = 0 := by + simpa using cubeBesovDepthSeminorm_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) (j := j) hp0 hpTop + +@[simp] theorem cubeBesovPartialSeminorm_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovPartialSeminorm Q s p q N (fun _ => u) = 0 := by + have hqPos : 0 < q.toReal := ENNReal.toReal_pos hq0 hqTop + unfold cubeBesovPartialSeminorm + simp [cubeBesovDepthSeminorm_const, hp0, hpTop, hqPos.ne'] + +@[simp] theorem cubeBesovPartialSeminorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovPartialSeminorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovPartialSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (N := N) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovPartialSeminormTop_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : ℝ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovPartialSeminormTop Q s p N (fun _ => u) = 0 := by + refine le_antisymm ?_ (cubeBesovPartialSeminormTop_nonneg Q s p N (fun _ => u)) + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s p (fun _ => u) j) ?_ + intro j hj + simp [cubeBesovDepthSeminorm_const, hp0, hpTop] + +@[simp] theorem cubeBesovPartialSeminormTop_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovPartialSeminormTop Q s p N (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovPartialSeminormTop_const + (Q := Q) (s := s) (p := p) (N := N) (u := (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovPartialNorm_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovPartialNorm Q s p q N (fun _ => u) = cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovPartialNorm + rw [cubeBesovPartialSeminorm_const (Q := Q) (s := s) (p := p) (q := q) (N := N) + (u := u) hp0 hpTop hq0 hqTop] + simp [cubeAverage_const] + +@[simp] theorem cubeBesovPartialNorm_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovPartialNorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovPartialNorm_const (Q := Q) (s := s) (p := p) (q := q) (N := N) + (u := (0 : ℝ)) hp0 hpTop hq0 hqTop] + simp + +@[simp] theorem cubeBesovPartialNormTop_const {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (u : ℝ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovPartialNormTop Q s p N (fun _ => u) = cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovPartialNormTop + rw [cubeBesovPartialSeminormTop_const (Q := Q) (s := s) (p := p) (N := N) (u := u) hp0 hpTop] + simp [cubeAverage_const] + +@[simp] theorem cubeBesovPartialNormTop_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (N : ℕ) (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovPartialNormTop Q s p N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovPartialNormTop_const (Q := Q) (s := s) (p := p) (N := N) + (u := (0 : ℝ)) hp0 hpTop] + simp + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlap.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlap.lean new file mode 100644 index 0000000000..81025a191f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlap.lean @@ -0,0 +1,523 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp + +/-! +# Exact overlapping positive-order Besov kernel + +This module is the extended-norm realization of the Chapter 1 positive Besov +definition. A natural depth `j` represents the manuscript scale +`n = Q.scale - j`; thus all `n ∈ (-∞, Q.scale]` occur exactly once. The +overlapping centers are `ScalarOverlap.centersAtDepth Q j`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-- Admissible finite-`q` positive Besov parameters. The real-valued +exponents are finite by construction, and their `ENNReal` embeddings are used +only where `eLpNorm` requires an extended exponent. -/ +def ExactOverlapFiniteAdmissible (s p q : ℝ) : Prop := + 0 < s ∧ s < 1 ∧ 1 ≤ p ∧ 1 ≤ q + +/-- Admissible `q = ∞` positive Besov parameters. -/ +def ExactOverlapTopAdmissible (s p : ℝ) : Prop := + 0 < s ∧ s ≤ 1 ∧ 1 ≤ p + +/-- Finite-`q` parameters for the exact Chapter 1 overlap Besov kernel. -/ +structure ExactOverlapFiniteParameters where + /-- The positive regularity exponent. -/ + s : ℝ + /-- The finite local-integrability exponent. -/ + p : ℝ + /-- The finite depth-aggregation exponent. -/ + q : ℝ + admissible : ExactOverlapFiniteAdmissible s p q + +/-- `q = ∞` parameters for the exact Chapter 1 overlap Besov kernel. -/ +structure ExactOverlapTopParameters where + /-- The positive regularity exponent. -/ + s : ℝ + /-- The finite local-integrability exponent. -/ + p : ℝ + admissible : ExactOverlapTopAdmissible s p + +namespace ExactOverlapFiniteParameters + +theorem s_pos (P : ExactOverlapFiniteParameters) : 0 < P.s := + P.admissible.1 + +theorem s_lt_one (P : ExactOverlapFiniteParameters) : P.s < 1 := + P.admissible.2.1 + +theorem p_one_le (P : ExactOverlapFiniteParameters) : 1 ≤ P.p := + P.admissible.2.2.1 + +theorem q_one_le (P : ExactOverlapFiniteParameters) : 1 ≤ P.q := + P.admissible.2.2.2 + +/-- The finite real `p` exponent as an `ENNReal` exponent for `eLpNorm`. -/ +noncomputable def pExponent (P : ExactOverlapFiniteParameters) : ℝ≥0∞ := + ENNReal.ofReal P.p + +/-- The finite real `q` exponent as an `ENNReal` exponent. -/ +noncomputable def qExponent (P : ExactOverlapFiniteParameters) : ℝ≥0∞ := + ENNReal.ofReal P.q + +theorem pExponent_ne_top (P : ExactOverlapFiniteParameters) : P.pExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +theorem qExponent_ne_top (P : ExactOverlapFiniteParameters) : P.qExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +theorem one_le_pExponent (P : ExactOverlapFiniteParameters) : 1 ≤ P.pExponent := by + rw [pExponent, ← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal P.p_one_le + +theorem one_le_qExponent (P : ExactOverlapFiniteParameters) : 1 ≤ P.qExponent := by + rw [qExponent, ← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal P.q_one_le + +end ExactOverlapFiniteParameters + +namespace ExactOverlapTopParameters + +theorem s_pos (P : ExactOverlapTopParameters) : 0 < P.s := + P.admissible.1 + +theorem s_le_one (P : ExactOverlapTopParameters) : P.s ≤ 1 := + P.admissible.2.1 + +theorem p_one_le (P : ExactOverlapTopParameters) : 1 ≤ P.p := + P.admissible.2.2 + +/-- The finite real `p` exponent as an `ENNReal` exponent for `eLpNorm`. -/ +noncomputable def pExponent (P : ExactOverlapTopParameters) : ℝ≥0∞ := + ENNReal.ofReal P.p + +theorem pExponent_ne_top (P : ExactOverlapTopParameters) : P.pExponent ≠ ∞ := + ENNReal.ofReal_ne_top + +theorem one_le_pExponent (P : ExactOverlapTopParameters) : 1 ≤ P.pExponent := by + rw [pExponent, ← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal P.p_one_le + +end ExactOverlapTopParameters + +/-- The integrability data needed to form the source-style root mean and every +overlap-local mean. The two measures are kept explicit to prevent the native +small cube of a center from being confused with its enlarged overlap cube. -/ +structure ExactOverlapIntegrable {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) where + root : MeasureTheory.Integrable u (Homogenization.normalizedCubeMeasure Q) + overlap : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S) + +/-- Canonical root and overlap-local integrability data for the zero function. -/ +theorem exactOverlapZeroIntegrable {d : ℕ} (Q : TriadicCube d) : + ExactOverlapIntegrable Q (fun _ : Vec d => (0 : ℝ)) where + root := MeasureTheory.integrable_zero _ _ _ + overlap := fun _ _ _ => MeasureTheory.integrable_zero _ _ _ + +/-- The manuscript depth index represented by a natural overlap depth. -/ +def exactOverlapSourceDepth {d : ℕ} (Q : TriadicCube d) (j : ℕ) : ℤ := + Q.scale - (j : ℤ) + +theorem exactOverlapSourceDepth_le_scale {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + exactOverlapSourceDepth Q j ≤ Q.scale := by + unfold exactOverlapSourceDepth + omega + +theorem exactOverlapCenters_nonempty {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (ScalarOverlap.centersAtDepth Q j).Nonempty := + ScalarOverlap.centersAtDepth_nonempty Q j + +theorem exists_exactOverlapDepth_of_le_scale {d : ℕ} (Q : TriadicCube d) {n : ℤ} + (hn : n ≤ Q.scale) : + ∃ j : ℕ, exactOverlapSourceDepth Q j = n := by + refine ⟨Int.toNat (Q.scale - n), ?_⟩ + unfold exactOverlapSourceDepth + have hnonneg : 0 ≤ Q.scale - n := sub_nonneg.mpr hn + rw [Int.toNat_of_nonneg hnonneg] + omega + +/-- The exact source factor `3^(-n s)` at natural depth `j`, where +`n = Q.scale - j`. -/ +noncomputable def exactOverlapDepthWeight {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (j : ℕ) : ℝ≥0∞ := + (3 : ℝ≥0∞) ^ (-((exactOverlapSourceDepth Q j : ℤ) : ℝ) * s) + +/-- The source root-scale factor `3^(-s m)`, where `m = Q.scale`. -/ +noncomputable def exactOverlapRootWeight {d : ℕ} (Q : TriadicCube d) (s : ℝ) : ℝ≥0∞ := + (3 : ℝ≥0∞) ^ (-((Q.scale : ℤ) : ℝ) * s) + +theorem exactOverlapDepthWeight_zero {d : ℕ} (Q : TriadicCube d) (s : ℝ) : + exactOverlapDepthWeight Q s 0 = exactOverlapRootWeight Q s := by + simp only [exactOverlapDepthWeight, exactOverlapRootWeight, exactOverlapSourceDepth, + Nat.cast_zero, sub_zero] + +/-- The source root mean on the ordinary normalized root cube. -/ +noncomputable def exactOverlapRootMean {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) + (_hu : MeasureTheory.Integrable u (Homogenization.normalizedCubeMeasure Q)) : ℝ := + ∫ x, u x ∂Homogenization.normalizedCubeMeasure Q + +/-- The source local mean on the enlarged scalar-overlap cube associated to a +center. Its integrability certificate prevents any undefined-mean fallback. -/ +noncomputable def exactOverlapLocalMean {d : ℕ} (S : TriadicCube d) (u : Vec d → ℝ) + (_hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : ℝ := + ∫ x, u x ∂ScalarOverlap.normalizedCubeMeasure S + +/-- The extended normalized local `L^p` oscillation around the certified cube +mean. -/ +noncomputable def exactOverlapLocalOscillation {d : ℕ} (S : TriadicCube d) + (p : ℝ≥0∞) (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : ℝ≥0∞ := + MeasureTheory.eLpNorm (fun x => u x - exactOverlapLocalMean S u hu) p + (ScalarOverlap.normalizedCubeMeasure S) + +/-- Exact finite normalized `ℓ^p` average of the local overlap oscillations. -/ +noncomputable def exactOverlapDepthAverage {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (j : ℕ) : ℝ≥0∞ := + let D := ScalarOverlap.centersAtDepth Q j + (D.card : ℝ≥0∞)⁻¹ * D.attach.sum fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal p) u (hu.overlap j S.1 S.2)) ^ p + +/-- The weighted source depth term. The overlap centers at `j` encode the +source scale `n = Q.scale - j`. -/ +noncomputable def exactOverlapDepthTerm {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (j : ℕ) : ℝ≥0∞ := + exactOverlapDepthWeight Q s j * + (exactOverlapDepthAverage Q p u hu j) ^ p⁻¹ + +/-- The exact finite-`q` positive Besov seminorm: the infinite `ℓ^q` +aggregation of the source depth terms, retaining the value `∞`. -/ +noncomputable def exactOverlapFiniteSeminorm {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : ℝ≥0∞ := + (∑' j : ℕ, (exactOverlapDepthTerm Q P.s P.p u hu j) ^ P.q) ^ P.q⁻¹ + +/-- The exact `q = ∞` positive Besov seminorm. -/ +noncomputable def exactOverlapTopSeminorm {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : ℝ≥0∞ := + ⨆ j : ℕ, exactOverlapDepthTerm Q P.s P.p u hu j + +/-- The exact finite-`q` inhomogeneous positive Besov norm, including the +source root mean term `3^(-s m) |(u)_Q|`. -/ +noncomputable def exactOverlapFiniteNorm {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : ℝ≥0∞ := + exactOverlapFiniteSeminorm P Q u hu + exactOverlapRootWeight Q P.s * + ENNReal.ofReal |exactOverlapRootMean Q u hu.root| + +/-- The exact `q = ∞` inhomogeneous positive Besov norm, including the source +root mean term. -/ +noncomputable def exactOverlapTopNorm {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : ℝ≥0∞ := + exactOverlapTopSeminorm P Q u hu + exactOverlapRootWeight Q P.s * + ENNReal.ofReal |exactOverlapRootMean Q u hu.root| + +/-- Evaluation of the certified local overlap mean on the enlarged overlap +cube. -/ +theorem exactOverlapLocalMean_eq {d : ℕ} (S : TriadicCube d) (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalMean S u hu = ∫ x, u x ∂ScalarOverlap.normalizedCubeMeasure S := + rfl + +theorem exactOverlapRootMean_zero {d : ℕ} (Q : TriadicCube d) + (hu : MeasureTheory.Integrable (fun _ : Vec d => (0 : ℝ)) + (Homogenization.normalizedCubeMeasure Q)) : + exactOverlapRootMean Q (fun _ => (0 : ℝ)) hu = 0 := by + simp only [exactOverlapRootMean, MeasureTheory.integral_zero] + +/-- Evaluation of the certified local overlap oscillation. -/ +theorem exactOverlapLocalOscillation_eq {d : ℕ} (S : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalOscillation S p u hu = + MeasureTheory.eLpNorm (fun x => u x - exactOverlapLocalMean S u hu) p + (ScalarOverlap.normalizedCubeMeasure S) := + rfl + +theorem exactOverlapLocalMean_zero {d : ℕ} (S : TriadicCube d) + (hu : MeasureTheory.Integrable (fun _ : Vec d => (0 : ℝ)) + (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalMean S (fun _ => (0 : ℝ)) hu = 0 := by + simp only [exactOverlapLocalMean, MeasureTheory.integral_zero] + +theorem exactOverlapLocalOscillation_zero {d : ℕ} (S : TriadicCube d) (p : ℝ≥0∞) + (hu : MeasureTheory.Integrable (fun _ : Vec d => (0 : ℝ)) + (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalOscillation S p (fun _ => (0 : ℝ)) hu = 0 := by + unfold exactOverlapLocalOscillation + rw [exactOverlapLocalMean_zero] + simpa only [zero_sub, neg_zero] using! + (MeasureTheory.eLpNorm_zero (α := Vec d) (ε := ℝ) (p := p) + (μ := ScalarOverlap.normalizedCubeMeasure S)) + +theorem exactOverlapLocalOscillation_congr_ae {d : ℕ} (S : TriadicCube d) + (p : ℝ≥0∞) {u v : Vec d → ℝ} + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) + (hv : MeasureTheory.Integrable v (ScalarOverlap.normalizedCubeMeasure S)) + (huv : u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) : + exactOverlapLocalOscillation S p u hu = exactOverlapLocalOscillation S p v hv := by + have hmean : exactOverlapLocalMean S u hu = exactOverlapLocalMean S v hv := by + exact MeasureTheory.integral_congr_ae huv + unfold exactOverlapLocalOscillation + rw [hmean] + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [huv] with x hx + exact congrArg (fun t => t - exactOverlapLocalMean S v hv) hx + +/-- The certified normalized root mean depends only on the root-cube a.e. +representative. -/ +theorem exactOverlapRootMean_congr_ae {d : ℕ} (Q : TriadicCube d) + {u v : Vec d → ℝ} + (hu : MeasureTheory.Integrable u (Homogenization.normalizedCubeMeasure Q)) + (hv : MeasureTheory.Integrable v (Homogenization.normalizedCubeMeasure Q)) + (huv : u =ᵐ[Homogenization.normalizedCubeMeasure Q] v) : + exactOverlapRootMean Q u hu = exactOverlapRootMean Q v hv := + MeasureTheory.integral_congr_ae huv + +/-- A normalized overlap depth average depends only on the a.e. representatives +on its enlarged overlap cubes. -/ +theorem exactOverlapDepthAverage_congr_ae {d : ℕ} (Q : TriadicCube d) (p : ℝ) + {u v : Vec d → ℝ} (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (huv : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) + (j : ℕ) : + exactOverlapDepthAverage Q p u hu j = exactOverlapDepthAverage Q p v hv j := by + unfold exactOverlapDepthAverage + dsimp only + congr 1 + apply Finset.sum_congr rfl + intro S _ + rw [exactOverlapLocalOscillation_congr_ae S.1 (ENNReal.ofReal p) + (hu.overlap j S.1 S.2) (hv.overlap j S.1 S.2) (huv j S.1 S.2)] + +/-- A weighted overlap depth term depends only on the a.e. representatives on +its enlarged overlap cubes. -/ +theorem exactOverlapDepthTerm_congr_ae {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + {u v : Vec d → ℝ} (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (huv : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) + (j : ℕ) : + exactOverlapDepthTerm Q s p u hu j = exactOverlapDepthTerm Q s p v hv j := by + unfold exactOverlapDepthTerm + rw [exactOverlapDepthAverage_congr_ae Q p hu hv huv j] + +/-- The finite-`q` exact overlap seminorm depends only on the a.e. +representatives on every enlarged overlap cube. -/ +theorem exactOverlapFiniteSeminorm_congr_ae {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) {u v : Vec d → ℝ} + (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (huv : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) : + exactOverlapFiniteSeminorm P Q u hu = exactOverlapFiniteSeminorm P Q v hv := by + unfold exactOverlapFiniteSeminorm + congr 1 + apply tsum_congr + intro j + rw [exactOverlapDepthTerm_congr_ae Q P.s P.p hu hv huv j] + +/-- The `q = ∞` exact overlap seminorm depends only on the a.e. +representatives on every enlarged overlap cube. -/ +theorem exactOverlapTopSeminorm_congr_ae {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) {u v : Vec d → ℝ} + (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (huv : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) : + exactOverlapTopSeminorm P Q u hu = exactOverlapTopSeminorm P Q v hv := by + unfold exactOverlapTopSeminorm + apply iSup_congr + intro j + exact exactOverlapDepthTerm_congr_ae Q P.s P.p hu hv huv j + +/-- The finite-`q` exact overlap norm depends only on the root and overlap-cube +a.e. representatives. -/ +theorem exactOverlapFiniteNorm_congr_ae {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) {u v : Vec d → ℝ} + (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (hroot : u =ᵐ[Homogenization.normalizedCubeMeasure Q] v) + (hoverlap : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) : + exactOverlapFiniteNorm P Q u hu = exactOverlapFiniteNorm P Q v hv := by + unfold exactOverlapFiniteNorm + rw [exactOverlapFiniteSeminorm_congr_ae P Q hu hv hoverlap, + exactOverlapRootMean_congr_ae Q hu.root hv.root hroot] + +/-- The `q = ∞` exact overlap norm depends only on the root and overlap-cube +a.e. representatives. -/ +theorem exactOverlapTopNorm_congr_ae {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) {u v : Vec d → ℝ} + (hu : ExactOverlapIntegrable Q u) (hv : ExactOverlapIntegrable Q v) + (hroot : u =ᵐ[Homogenization.normalizedCubeMeasure Q] v) + (hoverlap : ∀ (j : ℕ) (S : TriadicCube d), S ∈ ScalarOverlap.centersAtDepth Q j → + u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v) : + exactOverlapTopNorm P Q u hu = exactOverlapTopNorm P Q v hv := by + unfold exactOverlapTopNorm + rw [exactOverlapTopSeminorm_congr_ae P Q hu hv hoverlap, + exactOverlapRootMean_congr_ae Q hu.root hv.root hroot] + +private theorem exactOverlapDepthAverage_zero_of_pos {d : ℕ} (Q : TriadicCube d) + (p : ℝ) (hp : 0 < p) (j : ℕ) : + exactOverlapDepthAverage Q p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := by + simp only [exactOverlapDepthAverage, exactOverlapLocalOscillation_zero, + ENNReal.zero_rpow_of_pos hp, Finset.sum_const_zero, mul_zero] + +private theorem exactOverlapDepthTerm_zero_of_pos {d : ℕ} (Q : TriadicCube d) + (s p : ℝ) (hp : 0 < p) (j : ℕ) : + exactOverlapDepthTerm Q s p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := by + unfold exactOverlapDepthTerm + rw [exactOverlapDepthAverage_zero_of_pos Q p hp j, + ENNReal.zero_rpow_of_pos (inv_pos.mpr hp), mul_zero] + +/-- The local overlap depth average vanishes for zero data at every admissible +finite-`q` exponent. -/ +theorem exactOverlapFiniteDepthAverage_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (j : ℕ) : + exactOverlapDepthAverage Q P.p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := + exactOverlapDepthAverage_zero_of_pos Q P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The local overlap depth average vanishes for zero data at every admissible +`q = ∞` exponent. -/ +theorem exactOverlapTopDepthAverage_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (j : ℕ) : + exactOverlapDepthAverage Q P.p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := + exactOverlapDepthAverage_zero_of_pos Q P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The weighted overlap depth term vanishes for zero data at every admissible +finite-`q` exponent. -/ +theorem exactOverlapFiniteDepthTerm_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (j : ℕ) : + exactOverlapDepthTerm Q P.s P.p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := + exactOverlapDepthTerm_zero_of_pos Q P.s P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- The weighted overlap depth term vanishes for zero data at every admissible +`q = ∞` exponent. -/ +theorem exactOverlapTopDepthTerm_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (j : ℕ) : + exactOverlapDepthTerm Q P.s P.p (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) j = 0 := + exactOverlapDepthTerm_zero_of_pos Q P.s P.p + (lt_of_lt_of_le zero_lt_one P.p_one_le) j + +/-- Evaluation of the finite overlap-center average at one source depth. -/ +theorem exactOverlapDepthAverage_eq {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (j : ℕ) : + exactOverlapDepthAverage Q p u hu j = + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal p) u + (hu.overlap j S.1 S.2)) ^ p := + rfl + +/-- Evaluation of the source-weighted depth term. -/ +theorem exactOverlapDepthTerm_eq {d : ℕ} (Q : TriadicCube d) (s p : ℝ) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (j : ℕ) : + exactOverlapDepthTerm Q s p u hu j = exactOverlapDepthWeight Q s j * + (exactOverlapDepthAverage Q p u hu j) ^ p⁻¹ := + rfl + +/-- Evaluation of the infinite finite-`q` aggregation. -/ +theorem exactOverlapFiniteSeminorm_eq {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapFiniteSeminorm P Q u hu = + (∑' j : ℕ, (exactOverlapDepthTerm Q P.s P.p u hu j) ^ P.q) ^ P.q⁻¹ := + rfl + +/-- Evaluation of the `q = ∞` aggregation. -/ +theorem exactOverlapTopSeminorm_eq {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapTopSeminorm P Q u hu = + ⨆ j : ℕ, exactOverlapDepthTerm Q P.s P.p u hu j := + rfl + +/-- Evaluation of the finite-`q` inhomogeneous norm. -/ +theorem exactOverlapFiniteNorm_eq {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapFiniteNorm P Q u hu = + exactOverlapFiniteSeminorm P Q u hu + exactOverlapRootWeight Q P.s * + ENNReal.ofReal |exactOverlapRootMean Q u hu.root| := + rfl + +/-- Evaluation of the `q = ∞` inhomogeneous norm. -/ +theorem exactOverlapTopNorm_eq {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapTopNorm P Q u hu = + exactOverlapTopSeminorm P Q u hu + exactOverlapRootWeight Q P.s * + ENNReal.ofReal |exactOverlapRootMean Q u hu.root| := + rfl + +/-- The exact finite-`q` overlap seminorm vanishes on the zero function. -/ +theorem exactOverlapFiniteSeminorm_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) : + exactOverlapFiniteSeminorm P Q (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) = 0 := by + rw [exactOverlapFiniteSeminorm_eq] + have hq : 0 < P.q := lt_of_lt_of_le zero_lt_one P.q_one_le + simp_rw [exactOverlapFiniteDepthTerm_zero P Q, ENNReal.zero_rpow_of_pos hq] + rw [tsum_zero, ENNReal.zero_rpow_of_pos] + exact inv_pos.mpr hq + +/-- The exact `q = ∞` overlap seminorm vanishes on the zero function. -/ +theorem exactOverlapTopSeminorm_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) : + exactOverlapTopSeminorm P Q (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) = 0 := by + rw [exactOverlapTopSeminorm_eq] + simp_rw [exactOverlapTopDepthTerm_zero P Q] + exact iSup_const + +/-- The exact finite-`q` inhomogeneous overlap norm vanishes on zero data. -/ +theorem exactOverlapFiniteNorm_zero {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) : + exactOverlapFiniteNorm P Q (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) = 0 := by + rw [exactOverlapFiniteNorm_eq, exactOverlapFiniteSeminorm_zero, + exactOverlapRootMean_zero] + simp only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] + +/-- The exact `q = ∞` inhomogeneous overlap norm vanishes on zero data. -/ +theorem exactOverlapTopNorm_zero {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) : + exactOverlapTopNorm P Q (fun _ => (0 : ℝ)) (exactOverlapZeroIntegrable Q) = 0 := by + rw [exactOverlapTopNorm_eq, exactOverlapTopSeminorm_zero, exactOverlapRootMean_zero] + simp only [abs_zero, ENNReal.ofReal_zero, mul_zero, add_zero] + +/-- Every extended quantity in the exact overlap kernel is nonnegative. -/ +theorem exactOverlapLocalOscillation_nonneg {d : ℕ} (S : TriadicCube d) + (p : ℝ≥0∞) (u : Vec d → ℝ) + (hu : MeasureTheory.Integrable u (ScalarOverlap.normalizedCubeMeasure S)) : + 0 ≤ exactOverlapLocalOscillation S p u hu := + bot_le + +theorem exactOverlapDepthAverage_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (j : ℕ) : + 0 ≤ exactOverlapDepthAverage Q p u hu j := + bot_le + +theorem exactOverlapFiniteSeminorm_nonneg {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + 0 ≤ exactOverlapFiniteSeminorm P Q u hu := + bot_le + +theorem exactOverlapTopSeminorm_nonneg {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + 0 ≤ exactOverlapTopSeminorm P Q u hu := + bot_le + +theorem exactOverlapFiniteNorm_nonneg {d : ℕ} (P : ExactOverlapFiniteParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + 0 ≤ exactOverlapFiniteNorm P Q u hu := + bot_le + +theorem exactOverlapTopNorm_nonneg {d : ℕ} (P : ExactOverlapTopParameters) + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + 0 ≤ exactOverlapTopNorm P Q u hu := + bot_le + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclidean.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclidean.lean new file mode 100644 index 0000000000..4a02b8583a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclidean.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean + +/-! +# Exact Euclidean-valued overlapping positive-order Besov kernel + +This module specializes the exact Chapter 1 overlap kernel to the source-facing +fractional full norm for vector fields at `p = q = 2`. Both the seminorm and +the root mean are aggregated over coordinates with the Euclidean `ℓ²` norm. +All quantities remain `ENNReal`-valued, so no finiteness assumption is hidden +in the definition. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +private theorem coordinate_le_euclideanENorm {d : ℕ} (a : Fin d → ℝ≥0∞) (i : Fin d) : + a i ≤ (∑ j : Fin d, a j ^ 2) ^ ((2 : ℝ)⁻¹) := by + have hsquare : a i ^ (2 : ℕ) ≤ ∑ j : Fin d, a j ^ (2 : ℕ) := by + exact Finset.single_le_sum + (fun j _ => (zero_le : (0 : ℝ≥0∞) ≤ a j ^ (2 : ℕ))) (Finset.mem_univ i) + have hroot := ENNReal.rpow_le_rpow hsquare (show 0 ≤ (2 : ℝ)⁻¹ by norm_num) + calc + a i = (a i ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + _ ≤ (∑ j : Fin d, a j ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := hroot + +private theorem euclideanENorm_lt_top_iff {d : ℕ} (a : Fin d → ℝ≥0∞) : + (∑ i : Fin d, a i ^ 2) ^ ((2 : ℝ)⁻¹) < ∞ ↔ ∀ i, a i < ∞ := by + constructor + · intro h i + by_contra hi + have hi_top : a i = ∞ := top_unique (not_lt.mp hi) + have hsum_top : (∑ k : Fin d, a k ^ (2 : ℕ)) = ∞ := by + rw [ENNReal.sum_eq_top] + refine ⟨i, Finset.mem_univ i, ?_⟩ + exact (ENNReal.pow_eq_top_iff).2 ⟨hi_top, by norm_num⟩ + rw [hsum_top, ENNReal.top_rpow_of_pos (by norm_num)] at h + exact lt_irrefl ∞ h + · intro h + apply ENNReal.rpow_lt_top_of_nonneg (by norm_num) + apply (ENNReal.sum_ne_top).2 + intro i _ + exact ENNReal.pow_ne_top (ne_of_lt (h i)) + +private theorem euclideanENorm_eq_ofReal_euclideanNorm {d : ℕ} (x : Vec d) : + (∑ i : Fin d, (ENNReal.ofReal |x i|) ^ 2) ^ ((2 : ℝ)⁻¹) = + ENNReal.ofReal (euclideanNorm x) := by + unfold euclideanNorm vecNormSq vecDot + have hsquares : (∑ i : Fin d, x i * x i) = ∑ i : Fin d, x i ^ 2 := by + apply Finset.sum_congr rfl + intro i _ + rw [pow_two] + rw [hsquares, Real.sqrt_eq_rpow, one_div] + rw [← ENNReal.ofReal_rpow_of_nonneg (Finset.sum_nonneg fun _ _ => sq_nonneg _) + (by norm_num)] + congr 1 + rw [ENNReal.ofReal_sum_of_nonneg (fun _ _ => sq_nonneg _)] + apply Finset.sum_congr rfl + intro i _ + rw [← ENNReal.ofReal_pow (abs_nonneg (x i)), sq_abs] + +private theorem exactOverlapRootWeight_lt_top_aux {d : ℕ} (Q : TriadicCube d) (s : ℝ) : + exactOverlapRootWeight Q s < ∞ := by + unfold exactOverlapRootWeight + rw [lt_top_iff_ne_top, ne_eq, ENNReal.rpow_eq_top_iff] + norm_num + +/-- The exact finite-overlap parameters with `p = q = 2` and `0 < s < 1`. -/ +noncomputable def exactOverlapTwoParameters (s : Set.Ioo (0 : ℝ) 1) : + ExactOverlapFiniteParameters where + s := s.1 + p := 2 + q := 2 + admissible := ⟨s.2.1, s.2.2, by norm_num, by norm_num⟩ + +/-- Coordinatewise integrability certificates for a Euclidean-valued field. +Each coordinate is certified on the root cube and on every enlarged overlap +cube used by the exact scalar kernel. -/ +structure ExactOverlapEuclideanIntegrable {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) : Prop where + coordinate : ∀ i : Fin d, ExactOverlapIntegrable Q (fun x => F x i) + +/-- Canonical coordinatewise certificates for the zero vector field. -/ +theorem exactOverlapEuclideanZeroIntegrable {d : ℕ} (Q : TriadicCube d) : + ExactOverlapEuclideanIntegrable Q (fun _ : Vec d => (0 : Vec d)) where + coordinate := fun _ => exactOverlapZeroIntegrable Q + +/-- Euclidean magnitude of the certified coordinate root means, retained in +`ENNReal`. -/ +noncomputable def exactOverlapEuclideanRootMeanENorm {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + (∑ i : Fin d, + (ENNReal.ofReal |exactOverlapRootMean Q (fun x => F x i) + (hF.coordinate i).root|) ^ 2) ^ ((2 : ℝ)⁻¹) + +/-- Exact Euclidean-valued overlap Besov seminorm at `p = q = 2`, obtained by +Euclidean aggregation of the exact scalar coordinate seminorms. -/ +noncomputable def exactOverlapEuclideanSeminormTwo {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + (∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i)) ^ 2) ^ ((2 : ℝ)⁻¹) + +/-- The source-facing fractional full norm: the exact Euclidean `p = q = 2` +seminorm plus `3^(-s m)` times the Euclidean magnitude of the coordinate root +means. -/ +noncomputable def exactOverlapEuclideanNormTwo {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + exactOverlapEuclideanSeminormTwo s Q F hF + + exactOverlapRootWeight Q s.1 * exactOverlapEuclideanRootMeanENorm Q F hF + +/-- Evaluation of the Euclidean root-mean magnitude. -/ +theorem exactOverlapEuclideanRootMeanENorm_eq {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanRootMeanENorm Q F hF = + (∑ i : Fin d, + (ENNReal.ofReal |exactOverlapRootMean Q (fun x => F x i) + (hF.coordinate i).root|) ^ 2) ^ ((2 : ℝ)⁻¹) := + rfl + +/-- Evaluation of the exact Euclidean `p = q = 2` seminorm. -/ +theorem exactOverlapEuclideanSeminormTwo_eq {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanSeminormTwo s Q F hF = + (∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i)) ^ 2) ^ ((2 : ℝ)⁻¹) := + rfl + +/-- Evaluation of the source-facing fractional full norm. -/ +theorem exactOverlapEuclideanNormTwo_eq {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanNormTwo s Q F hF = + exactOverlapEuclideanSeminormTwo s Q F hF + + exactOverlapRootWeight Q s.1 * exactOverlapEuclideanRootMeanENorm Q F hF := + rfl + +/-- The coordinate formula for the root means is exactly the `ENNReal` +embedding of their explicit Euclidean magnitude. -/ +theorem exactOverlapEuclideanRootMeanENorm_eq_ofReal_euclideanNorm {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanRootMeanENorm Q F hF = + ENNReal.ofReal (euclideanNorm (fun i => + exactOverlapRootMean Q (fun x => F x i) (hF.coordinate i).root)) := + euclideanENorm_eq_ofReal_euclideanNorm _ + +/-- Each coordinate root mean is bounded by the Euclidean root-mean +magnitude. -/ +theorem exactOverlapEuclideanRootMean_coordinate_le {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) (i : Fin d) : + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F x i) + (hF.coordinate i).root| ≤ exactOverlapEuclideanRootMeanENorm Q F hF := by + rw [exactOverlapEuclideanRootMeanENorm_eq] + exact coordinate_le_euclideanENorm + (fun j => ENNReal.ofReal |exactOverlapRootMean Q (fun x => F x j) + (hF.coordinate j).root|) i + +/-- Each exact scalar coordinate seminorm is bounded by the exact Euclidean +seminorm. -/ +theorem exactOverlapEuclideanSeminormTwo_coordinate_le {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) (i : Fin d) : + exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i) ≤ + exactOverlapEuclideanSeminormTwo s Q F hF := by + rw [exactOverlapEuclideanSeminormTwo_eq] + exact coordinate_le_euclideanENorm + (fun j => exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x j) (hF.coordinate j)) i + +/-- Each exact scalar coordinate full norm is bounded by the source-facing +Euclidean full norm. -/ +theorem exactOverlapEuclideanNormTwo_coordinate_le {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) (i : Fin d) : + exactOverlapFiniteNorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i) ≤ + exactOverlapEuclideanNormTwo s Q F hF := by + rw [exactOverlapFiniteNorm_eq, exactOverlapEuclideanNormTwo_eq] + apply add_le_add (exactOverlapEuclideanSeminormTwo_coordinate_le s Q F hF i) + exact mul_le_mul_right + (exactOverlapEuclideanRootMean_coordinate_le Q F hF i) _ + +/-- The Euclidean root-mean magnitude is finite exactly when all coordinate +magnitudes are finite. -/ +theorem exactOverlapEuclideanRootMeanENorm_lt_top_iff {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanRootMeanENorm Q F hF < ∞ ↔ + ∀ i : Fin d, ENNReal.ofReal |exactOverlapRootMean Q (fun x => F x i) + (hF.coordinate i).root| < ∞ := + euclideanENorm_lt_top_iff _ + +/-- The exact Euclidean seminorm is finite exactly when every exact scalar +coordinate seminorm is finite. -/ +theorem exactOverlapEuclideanSeminormTwo_lt_top_iff {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanSeminormTwo s Q F hF < ∞ ↔ + ∀ i : Fin d, exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i) < ∞ := + euclideanENorm_lt_top_iff _ + +/-- The Euclidean root-mean magnitude is always finite because it is a finite +coordinate sum of embedded real means. -/ +theorem exactOverlapEuclideanRootMeanENorm_lt_top {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanRootMeanENorm Q F hF < ∞ := by + rw [exactOverlapEuclideanRootMeanENorm_lt_top_iff] + intro i + exact ENNReal.ofReal_lt_top + +/-- The source-facing Euclidean full norm is finite exactly when every exact +scalar coordinate seminorm is finite. The root-mean term is automatically +finite. -/ +theorem exactOverlapEuclideanNormTwo_lt_top_iff {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanNormTwo s Q F hF < ∞ ↔ + ∀ i : Fin d, exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i) < ∞ := by + rw [exactOverlapEuclideanNormTwo_eq, ENNReal.add_lt_top, + exactOverlapEuclideanSeminormTwo_lt_top_iff] + have hrootTerm : exactOverlapRootWeight Q s.1 * + exactOverlapEuclideanRootMeanENorm Q F hF < ∞ := + ENNReal.mul_lt_top (exactOverlapRootWeight_lt_top_aux Q s.1) + (exactOverlapEuclideanRootMeanENorm_lt_top Q F hF) + constructor + · exact fun h => h.1 + · exact fun h => ⟨h, hrootTerm⟩ + +/-- Coordinatewise a.e. equality on the root cube preserves the Euclidean +root-mean magnitude. -/ +theorem exactOverlapEuclideanRootMeanENorm_congr_ae {d : ℕ} (Q : TriadicCube d) + {F G : Vec d → Vec d} (hF : ExactOverlapEuclideanIntegrable Q F) + (hG : ExactOverlapEuclideanIntegrable Q G) + (hroot : ∀ i : Fin d, (fun x => F x i) =ᵐ[normalizedCubeMeasure Q] + (fun x => G x i)) : + exactOverlapEuclideanRootMeanENorm Q F hF = + exactOverlapEuclideanRootMeanENorm Q G hG := by + unfold exactOverlapEuclideanRootMeanENorm + congr 1 + apply Finset.sum_congr rfl + intro i _ + rw [exactOverlapRootMean_congr_ae Q (hF.coordinate i).root + (hG.coordinate i).root (hroot i)] + +/-- Coordinatewise a.e. equality on every enlarged overlap cube preserves the +exact Euclidean seminorm. -/ +theorem exactOverlapEuclideanSeminormTwo_congr_ae {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) {F G : Vec d → Vec d} + (hF : ExactOverlapEuclideanIntegrable Q F) + (hG : ExactOverlapEuclideanIntegrable Q G) + (hoverlap : ∀ (i : Fin d) (j : ℕ) (S : TriadicCube d), + S ∈ ScalarOverlap.centersAtDepth Q j → + (fun x => F x i) =ᵐ[ScalarOverlap.normalizedCubeMeasure S] + (fun x => G x i)) : + exactOverlapEuclideanSeminormTwo s Q F hF = + exactOverlapEuclideanSeminormTwo s Q G hG := by + unfold exactOverlapEuclideanSeminormTwo + congr 1 + apply Finset.sum_congr rfl + intro i _ + rw [exactOverlapFiniteSeminorm_congr_ae (exactOverlapTwoParameters s) Q + (hF.coordinate i) (hG.coordinate i) (hoverlap i)] + +/-- Coordinatewise a.e. equality on the root and enlarged overlap cubes +preserves the source-facing fractional full norm. -/ +theorem exactOverlapEuclideanNormTwo_congr_ae {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) {F G : Vec d → Vec d} + (hF : ExactOverlapEuclideanIntegrable Q F) + (hG : ExactOverlapEuclideanIntegrable Q G) + (hroot : ∀ i : Fin d, (fun x => F x i) =ᵐ[normalizedCubeMeasure Q] + (fun x => G x i)) + (hoverlap : ∀ (i : Fin d) (j : ℕ) (S : TriadicCube d), + S ∈ ScalarOverlap.centersAtDepth Q j → + (fun x => F x i) =ᵐ[ScalarOverlap.normalizedCubeMeasure S] + (fun x => G x i)) : + exactOverlapEuclideanNormTwo s Q F hF = + exactOverlapEuclideanNormTwo s Q G hG := by + unfold exactOverlapEuclideanNormTwo + rw [exactOverlapEuclideanSeminormTwo_congr_ae s Q hF hG hoverlap, + exactOverlapEuclideanRootMeanENorm_congr_ae Q hF hG hroot] + +/-- The Euclidean root-mean magnitude vanishes on the zero vector field. -/ +theorem exactOverlapEuclideanRootMeanENorm_zero {d : ℕ} (Q : TriadicCube d) : + exactOverlapEuclideanRootMeanENorm Q (fun _ => (0 : Vec d)) + (exactOverlapEuclideanZeroIntegrable Q) = 0 := by + rw [exactOverlapEuclideanRootMeanENorm_eq] + simp only [Pi.zero_apply, exactOverlapRootMean_zero, abs_zero, ENNReal.ofReal_zero] + norm_num + +/-- The exact Euclidean seminorm vanishes on the zero vector field. -/ +theorem exactOverlapEuclideanSeminormTwo_zero {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) : + exactOverlapEuclideanSeminormTwo s Q (fun _ => (0 : Vec d)) + (exactOverlapEuclideanZeroIntegrable Q) = 0 := by + rw [exactOverlapEuclideanSeminormTwo_eq] + simp only [Pi.zero_apply, exactOverlapFiniteSeminorm_zero] + norm_num + +/-- The source-facing fractional full norm vanishes on the zero vector field. -/ +theorem exactOverlapEuclideanNormTwo_zero {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) : + exactOverlapEuclideanNormTwo s Q (fun _ => (0 : Vec d)) + (exactOverlapEuclideanZeroIntegrable Q) = 0 := by + rw [exactOverlapEuclideanNormTwo_eq, exactOverlapEuclideanSeminormTwo_zero, + exactOverlapEuclideanRootMeanENorm_zero] + simp only [mul_zero, add_zero] + +/-- Every exact Euclidean root-mean magnitude is nonnegative. -/ +theorem exactOverlapEuclideanRootMeanENorm_nonneg {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : + 0 ≤ exactOverlapEuclideanRootMeanENorm Q F hF := + bot_le + +/-- Every exact Euclidean `p = q = 2` seminorm is nonnegative. -/ +theorem exactOverlapEuclideanSeminormTwo_nonneg {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + 0 ≤ exactOverlapEuclideanSeminormTwo s Q F hF := + bot_le + +/-- Every source-facing fractional full norm is nonnegative. -/ +theorem exactOverlapEuclideanNormTwo_nonneg {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + 0 ≤ exactOverlapEuclideanNormTwo s Q F hF := + bot_le + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLp.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLp.lean new file mode 100644 index 0000000000..0e070dd6d3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLp.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp + +/-! +# Exact finite-`p` Euclidean overlap Besov seminorm + +The canonical positive overlap seminorm for vector fields uses Euclidean local +oscillations about `ScalarOverlap.cubeAverageVec`, with a single outer +`1 / p` root after summing all physical scales. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- The canonical positive Euclidean overlap Besov seminorm at finite `p`. +At running depth `j`, the physical scale is `Q.scale - j`; the outer root is +taken only after the complete weighted scale sum. -/ +noncomputable def cubeEuclideanPositiveBesovOverlapESeminorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (g : Vec d → Vec d) : ℝ≥0∞ := by + classical + exact (∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec + (g x - ScalarOverlap.cubeAverageVec S.1 g)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal)) ^ (1 / p.exponent.toReal) + +/-- Formula accessor for the canonical finite-`p` Euclidean overlap seminorm. -/ +theorem cubeEuclideanPositiveBesovOverlapESeminorm_eq {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (g : Vec d → Vec d) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p g = + (∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec + (g x - ScalarOverlap.cubeAverageVec S.1 g)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal)) ^ (1 / p.exponent.toReal) := rfl + +theorem cubeEuclideanPositiveBesovOverlapESeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (g : Vec d → Vec d) : + 0 ≤ cubeEuclideanPositiveBesovOverlapESeminorm Q s p g := + bot_le + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLpCoordinateBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLpCoordinateBridge.lean new file mode 100644 index 0000000000..ad1bb22b6c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapEuclideanLpCoordinateBridge.lean @@ -0,0 +1,85 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLp +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapScalarP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate + +/-! +# Coordinate bridge for the finite-`p` Euclidean overlap oscillation + +The canonical finite-`p` Euclidean overlap seminorm is defined directly from +the Hilbert realization of its vector fluctuation. This file records the +local, exact coordinate identification with the scalar overlap fluctuation and +the one-coordinate `L^p` bound. It deliberately contains no aggregation over +coordinates, centers, or depths. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +namespace ScalarOverlap + +/-- A coordinate of the vector overlap average is exactly the scalar overlap +average of that coordinate. -/ +theorem cubeAverageVec_apply_eq_cubeAverage {d : ℕ} (S : TriadicCube d) + (F : Vec d → Vec d) (i : Fin d) : + cubeAverageVec S F i = cubeAverage S (fun x => F x i) := + rfl + +end ScalarOverlap + +/-- The coordinate of the canonical Euclidean overlap residual is the scalar +overlap residual of the same coordinate. -/ +theorem euclideanOverlapResidual_coordinate_eq_scalar {d : ℕ} (S : TriadicCube d) + (F : Vec d → Vec d) (i : Fin d) : + (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) = + fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i) := by + funext x + rw [Pi.sub_apply, ScalarOverlap.cubeAverageVec_apply_eq_cubeAverage] + +/-- The scalar overlap oscillation written using its scalar average is exactly +the corresponding coordinate of the canonical Euclidean overlap residual. -/ +theorem scalarOverlap_eLpNorm_eq_coordinate_euclideanOverlapResidual {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (i : Fin d) : + eLpNorm (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) = + eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + rw [euclideanOverlapResidual_coordinate_eq_scalar] + +/-- The scalar overlap oscillation of a coordinate is the real value of the +corresponding coordinate of the canonical Euclidean residual. -/ +theorem cubeBesovOverlapOscillation_coordinate_eq_residual_toReal {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (i : Fin d) : + cubeBesovOverlapOscillation S p.exponent (fun x => F x i) = + (eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)).toReal := by + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [scalarOverlap_eLpNorm_eq_coordinate_euclideanOverlapResidual] + +/-- One scalar coordinate of the overlap oscillation is bounded by the direct +Euclidean Hilbert overlap oscillation on the same cube. -/ +theorem scalarOverlap_eLpNorm_le_euclideanOverlap {d : ℕ} (S : TriadicCube d) + (p : FiniteLpExponent) (F : Vec d → Vec d) (i : Fin d) : + eLpNorm (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) ≤ + eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + rw [scalarOverlap_eLpNorm_eq_coordinate_euclideanOverlapResidual] + exact coordinate_eLpNorm_le_euclidean (ScalarOverlap.normalizedCubeMeasure S) p + (fun x => F x - ScalarOverlap.cubeAverageVec S F) i + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapScalarP.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapScalarP.lean new file mode 100644 index 0000000000..7beff25a1a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/ExactOverlapScalarP.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarComparison + +/-! +# Exact scalar overlap aggregation at arbitrary finite `p` + +This additive finite-`p` module identifies the diagonal `q = p` exact overlap +seminorm with the complete source depth-energy series and with the established +finite-depth scalar-overlap truncations. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +namespace FiniteLpExponent + +private theorem one_le (p : FiniteLpExponent) : 1 ≤ p.exponent := + p.one_lt.le + +private theorem ne_zero (p : FiniteLpExponent) : p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem ne_top (p : FiniteLpExponent) : p.exponent ≠ ∞ := + p.lt_top.ne + +private theorem toReal_pos (p : FiniteLpExponent) : 0 < p.exponent.toReal := + ENNReal.toReal_pos p.ne_zero p.ne_top + +private theorem one_le_toReal (p : FiniteLpExponent) : 1 ≤ p.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_le_toReal (by norm_num) p.ne_top).mpr p.one_le + +end FiniteLpExponent + +/-- Exact scalar-overlap parameters in the diagonal finite case `q = p`. -/ +noncomputable def exactOverlapScalarPParameters (s : FractionalOrder) + (p : FiniteLpExponent) : ExactOverlapFiniteParameters where + s := s.1 + p := p.exponent.toReal + q := p.exponent.toReal + admissible := by exact ⟨s.2.1, s.2.2, p.one_le_toReal, p.one_le_toReal⟩ + +private theorem exactOverlapScalarPIntegrableOfMemLp {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) {u : Vec d → ℝ} + (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) : + ExactOverlapIntegrable Q u where + root := hmem.integrable p.one_le + overlap := fun _ _ hS => + (Gagliardo.memLp_overlap_of_memLp hmem hS).integrable p.one_le + +private theorem cubeScaleFactor_div_pow_eq_sourceZPow_scalarP {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeScaleFactor Q / (3 : ℝ) ^ j = (3 : ℝ) ^ (Q.scale - (j : ℤ)) := by + unfold cubeScaleFactor + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + +private theorem exactOverlapDepthWeight_eq_ofReal_scalarP {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + exactOverlapDepthWeight Q s j = + ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j) := by + unfold exactOverlapDepthWeight cubeBesovOverlapDepthWeight cubeBesovDepthWeight + rw [cubeScaleFactor_div_pow_eq_sourceZPow_scalarP] + rw [← Real.rpow_intCast (3 : ℝ) (Q.scale - (j : ℤ)), + ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + rw [← ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + congr 1 + · norm_num + · change -(((Q.scale - (j : ℤ) : ℤ) : ℝ)) * s = + ((Q.scale - (j : ℤ) : ℤ) : ℝ) * -s + ring + +private theorem exactOverlapLocalOscillation_p_eq_ofReal {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) (u : Vec d → ℝ) + (hu : Integrable u (ScalarOverlap.normalizedCubeMeasure S)) + (hmem : MemLp u p.exponent (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalOscillation S p.exponent u hu = + ENNReal.ofReal (cubeBesovOverlapOscillation S p.exponent u) := by + have hmean : exactOverlapLocalMean S u hu = ScalarOverlap.cubeAverage S u := by + rw [exactOverlapLocalMean_eq, + ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + have hsub : MemLp (fun x => u x - exactOverlapLocalMean S u hu) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := + hmem.sub (memLp_const (exactOverlapLocalMean S u hu)) + rw [exactOverlapLocalOscillation_eq, ← ENNReal.ofReal_toReal hsub.eLpNorm_ne_top] + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [hmean] at hsub ⊢ + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hsub.aestronglyMeasurable] + +private theorem exactOverlapDepthAverage_p_eq_ofReal {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (u : Vec d → ℝ) + (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) (j : ℕ) : + exactOverlapDepthAverage Q p.exponent.toReal u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem) j = + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p.exponent u j) := by + have hcard : (0 : ℝ) < ((ScalarOverlap.centersAtDepth Q j).card : ℝ) := by + exact_mod_cast ScalarOverlap.centersAtDepth_card_pos Q j + rw [exactOverlapDepthAverage_eq] + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + rw [ENNReal.ofReal_mul (inv_nonneg.mpr hcard.le)] + rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast] + rw [ENNReal.ofReal_sum_of_nonneg] + · congr 1 + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + exactOverlapLocalOscillation S.1 (ENNReal.ofReal p.exponent.toReal) u + ((exactOverlapScalarPIntegrableOfMemLp Q p hmem).overlap j S.1 S.2) ^ + p.exponent.toReal) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S.1 p.exponent u ^ p.exponent.toReal)) := by + apply Finset.sum_congr rfl + intro S _ + rw [← ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapOscillation_nonneg S.1 p.exponent u) p.toReal_pos.le] + rw [ENNReal.ofReal_toReal p.ne_top, + exactOverlapLocalOscillation_p_eq_ofReal S.1 p u + ((exactOverlapScalarPIntegrableOfMemLp Q p hmem).overlap j S.1 S.2) + (Gagliardo.memLp_overlap_of_memLp hmem S.2)] + _ = (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S p.exponent u ^ p.exponent.toReal)) := by + let D := ScalarOverlap.centersAtDepth Q j + let f : TriadicCube d → ℝ≥0∞ := fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S p.exponent u ^ p.exponent.toReal) + change D.attach.sum (fun S => f S.1) = D.sum f + exact Finset.sum_attach D f + · intro S _ + exact Real.rpow_nonneg (cubeBesovOverlapOscillation_nonneg S p.exponent u) _ + +private theorem exactOverlapDepthTerm_p_eq_ofReal {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (u : Vec d → ℝ) (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) + (j : ℕ) : + exactOverlapDepthTerm Q s.1 p.exponent.toReal u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem) j = + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s.1 p.exponent u j) := by + rw [exactOverlapDepthTerm_eq, exactOverlapDepthWeight_eq_ofReal_scalarP, + exactOverlapDepthAverage_p_eq_ofReal Q p u hmem j] + unfold cubeBesovOverlapDepthSeminorm + rw [ENNReal.ofReal_mul (cubeBesovOverlapDepthWeight_nonneg Q s.1 j)] + simp only [one_div] + rw [ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapDepthAverage_nonneg Q p.exponent u j) + (inv_nonneg.mpr p.toReal_pos.le)] + +/-- The diagonal exact scalar seminorm has no hidden root inside its depth +energies: its `p`-th power is the complete weighted depth-energy series. -/ +theorem exactOverlapScalarPSeminorm_rpow_eq_tsum_depthEnergy {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u hu) ^ + p.exponent.toReal = + ∑' j : ℕ, (exactOverlapDepthWeight Q s.1 j) ^ p.exponent.toReal * + exactOverlapDepthAverage Q p.exponent.toReal u hu j := by + rw [exactOverlapFiniteSeminorm_eq] + change ((∑' j : ℕ, (exactOverlapDepthTerm Q s.1 p.exponent.toReal u hu j) ^ + p.exponent.toReal) ^ (p.exponent.toReal)⁻¹) ^ p.exponent.toReal = _ + rw [ENNReal.rpow_inv_rpow p.toReal_pos.ne'] + apply tsum_congr + intro j + rw [exactOverlapDepthTerm_eq, + ENNReal.mul_rpow_of_nonneg _ _ p.toReal_pos.le, + ENNReal.rpow_inv_rpow p.toReal_pos.ne'] + +private theorem exactOverlapScalarPSeminorm_rpow_eq_iSup_partial_canonical {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (Q : TriadicCube d) + (u : Vec d → ℝ) (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem)) ^ p.exponent.toReal = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + have htsum : + (∑' j : ℕ, (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 p.exponent u j)) ^ + p.exponent.toReal) = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + rw [ENNReal.tsum_eq_iSup_nat' (N := fun i => i + 1) + (Filter.tendsto_add_atTop_nat 1)] + apply iSup_congr + intro N + calc + ∑ j ∈ Finset.range (N + 1), (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 p.exponent u j)) ^ + p.exponent.toReal = + ∑ j ∈ Finset.range (N + 1), ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 p.exponent u j ^ + p.exponent.toReal) := by + apply Finset.sum_congr rfl + intro j _ + rw [ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapDepthSeminorm_nonneg Q s.1 p.exponent u j) + p.toReal_pos.le] + _ = ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u ^ + p.exponent.toReal) := by + simpa only using + (Gagliardo.ofReal_partialSeminorm_rpow_eq Q s.1 p.ne_zero + p.ne_top N u).symm + _ = (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + exact (ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 p.exponent + p.exponent N u) p.toReal_pos.le).symm + calc + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem)) ^ p.exponent.toReal = + ∑' j : ℕ, (exactOverlapDepthTerm Q s.1 p.exponent.toReal u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem) j) ^ + p.exponent.toReal := by + rw [exactOverlapFiniteSeminorm_eq] + change ((∑' j : ℕ, (exactOverlapDepthTerm Q s.1 p.exponent.toReal u + (exactOverlapScalarPIntegrableOfMemLp Q p hmem) j) ^ + p.exponent.toReal) ^ (p.exponent.toReal)⁻¹) ^ + p.exponent.toReal = _ + exact ENNReal.rpow_inv_rpow p.toReal_pos.ne' _ + _ = ∑' j : ℕ, (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 p.exponent u j)) ^ + p.exponent.toReal := by + apply tsum_congr + intro j + rw [exactOverlapDepthTerm_p_eq_ofReal Q s p u hmem j] + _ = _ := htsum + +/-- Under parent-cube `L^p` membership, the exact diagonal scalar-overlap +seminorm is the supremum of all finite-depth partial scalar-overlap +seminorms after taking the exact `p`-th power. -/ +theorem exactOverlapScalarPSeminorm_rpow_eq_iSup_partial {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) + (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u hu) ^ + p.exponent.toReal = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + rw [exactOverlapFiniteSeminorm_congr_ae (exactOverlapScalarPParameters s p) Q hu + (exactOverlapScalarPIntegrableOfMemLp Q p hmem) + (fun _ _ _ => Filter.EventuallyEq.rfl)] + exact exactOverlapScalarPSeminorm_rpow_eq_iSup_partial_canonical s p Q u hmem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Full.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Full.lean new file mode 100644 index 0000000000..617f50b308 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Full.lean @@ -0,0 +1,655 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap + +/-! # Full -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-! +## Full positive Besov wrappers + +The following value sets record all finite-depth truncations. The full seminorm +wrappers use `sSup`; the overlap full norm wrappers are defined as full seminorm +plus the fixed parent mean term. Since the codomain is `ℝ`, boundedness is +recorded separately in regularity packages whenever a theorem needs these full +wrappers to behave as finite norms. +-/ + +noncomputable def cubeBesovDisjointSeminormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovDisjointPartialSeminorm Q s p q N u + +noncomputable def cubeBesovDisjointSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovDisjointSeminormValueSet Q s p q u) + +noncomputable def cubeBesovDisjointSeminormTopValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovDisjointPartialSeminormTop Q s p N u + +noncomputable def cubeBesovDisjointSeminormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovDisjointSeminormTopValueSet Q s p u) + +noncomputable def cubeBesovDisjointNormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovDisjointPartialNorm Q s p q N u + +noncomputable def cubeBesovDisjointNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovDisjointNormValueSet Q s p q u) + +noncomputable def cubeBesovDisjointNormTopValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovDisjointPartialNormTop Q s p N u + +noncomputable def cubeBesovDisjointNormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovDisjointNormTopValueSet Q s p u) + +noncomputable def cubeBesovOverlapSeminormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovOverlapPartialSeminorm Q s p q N u + +noncomputable def cubeBesovOverlapSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovOverlapSeminormValueSet Q s p q u) + +noncomputable def cubeBesovOverlapSeminormTopValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovOverlapPartialSeminormTop Q s p N u + +noncomputable def cubeBesovOverlapSeminormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (cubeBesovOverlapSeminormTopValueSet Q s p u) + +noncomputable def cubeBesovOverlapNormValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovOverlapPartialNorm Q s p q N u + +noncomputable def cubeBesovOverlapNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + cubeBesovOverlapSeminorm Q s p q u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +noncomputable def cubeBesovOverlapNormTopValueSet {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Set ℝ := + Set.range fun N : ℕ => cubeBesovOverlapPartialNormTop Q s p N u + +noncomputable def cubeBesovOverlapNormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + cubeBesovOverlapSeminormTop Q s p u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +structure CubeBesovDisjointRegularity {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Prop where + partialSeminorms_bddAbove : + BddAbove (cubeBesovDisjointSeminormValueSet Q s p q u) + +structure CubeBesovDisjointRegularityTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Prop where + partialSeminorms_bddAbove : + BddAbove (cubeBesovDisjointSeminormTopValueSet Q s p u) + +structure CubeBesovOverlapRegularity {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : Prop where + partialSeminorms_bddAbove : + BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u) + +structure CubeBesovOverlapRegularityTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : Prop where + partialSeminorms_bddAbove : + BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u) + +theorem CubeBesovDisjointRegularity.seminormValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) : + BddAbove (cubeBesovDisjointSeminormValueSet Q s p q u) := + hu.partialSeminorms_bddAbove + +theorem CubeBesovDisjointRegularityTop.seminormValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) : + BddAbove (cubeBesovDisjointSeminormTopValueSet Q s p u) := + hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularity.seminormValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) : + BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u) := + hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularityTop.seminormValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) : + BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u) := + hu.partialSeminorms_bddAbove + +theorem cubeBesovDisjointSeminormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovDisjointSeminormValueSet Q s p q u).Nonempty := + ⟨cubeBesovDisjointPartialSeminorm Q s p q 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovDisjointSeminormTopValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovDisjointSeminormTopValueSet Q s p u).Nonempty := + ⟨cubeBesovDisjointPartialSeminormTop Q s p 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovDisjointNormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovDisjointNormValueSet Q s p q u).Nonempty := + ⟨cubeBesovDisjointPartialNorm Q s p q 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovDisjointNormTopValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovDisjointNormTopValueSet Q s p u).Nonempty := + ⟨cubeBesovDisjointPartialNormTop Q s p 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovOverlapSeminormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovOverlapSeminormValueSet Q s p q u).Nonempty := + ⟨cubeBesovOverlapPartialSeminorm Q s p q 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovOverlapSeminormTopValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovOverlapSeminormTopValueSet Q s p u).Nonempty := + ⟨cubeBesovOverlapPartialSeminormTop Q s p 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovOverlapNormValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovOverlapNormValueSet Q s p q u).Nonempty := + ⟨cubeBesovOverlapPartialNorm Q s p q 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovOverlapNormTopValueSet_nonempty {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + (cubeBesovOverlapNormTopValueSet Q s p u).Nonempty := + ⟨cubeBesovOverlapPartialNormTop Q s p 0 u, ⟨0, rfl⟩⟩ + +theorem cubeBesovDisjointNormValueSet_bddAbove_of_seminormValueSet_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormValueSet Q s p q u)) : + BddAbove (cubeBesovDisjointNormValueSet Q s p q u) := by + rcases hBdd with ⟨B, hB⟩ + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + refine ⟨B + A, ?_⟩ + rintro x ⟨N, rfl⟩ + simpa [cubeBesovDisjointPartialNorm, cubeBesovPartialNorm, + cubeBesovDisjointPartialSeminorm, A] using + add_le_add_right (hB ⟨N, rfl⟩) A + +theorem cubeBesovDisjointNormTopValueSet_bddAbove_of_seminormValueSet_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormTopValueSet Q s p u)) : + BddAbove (cubeBesovDisjointNormTopValueSet Q s p u) := by + rcases hBdd with ⟨B, hB⟩ + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + refine ⟨B + A, ?_⟩ + rintro x ⟨N, rfl⟩ + simpa [cubeBesovDisjointPartialNormTop, cubeBesovPartialNormTop, + cubeBesovDisjointPartialSeminormTop, A] using + add_le_add_right (hB ⟨N, rfl⟩) A + +theorem cubeBesovOverlapNormValueSet_bddAbove_of_seminormValueSet_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) : + BddAbove (cubeBesovOverlapNormValueSet Q s p q u) := by + rcases hBdd with ⟨B, hB⟩ + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + refine ⟨B + A, ?_⟩ + rintro x ⟨N, rfl⟩ + simpa [cubeBesovOverlapPartialNorm, A] using + add_le_add_right (hB ⟨N, rfl⟩) A + +theorem cubeBesovOverlapNormTopValueSet_bddAbove_of_seminormValueSet_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) : + BddAbove (cubeBesovOverlapNormTopValueSet Q s p u) := by + rcases hBdd with ⟨B, hB⟩ + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + refine ⟨B + A, ?_⟩ + rintro x ⟨N, rfl⟩ + simpa [cubeBesovOverlapPartialNormTop, A] using + add_le_add_right (hB ⟨N, rfl⟩) A + +theorem CubeBesovDisjointRegularity.normValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) : + BddAbove (cubeBesovDisjointNormValueSet Q s p q u) := + cubeBesovDisjointNormValueSet_bddAbove_of_seminormValueSet_bddAbove + Q s p q u hu.partialSeminorms_bddAbove + +theorem CubeBesovDisjointRegularityTop.normValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) : + BddAbove (cubeBesovDisjointNormTopValueSet Q s p u) := + cubeBesovDisjointNormTopValueSet_bddAbove_of_seminormValueSet_bddAbove + Q s p u hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularity.normValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) : + BddAbove (cubeBesovOverlapNormValueSet Q s p q u) := + cubeBesovOverlapNormValueSet_bddAbove_of_seminormValueSet_bddAbove + Q s p q u hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularityTop.normValueSet_bddAbove {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) : + BddAbove (cubeBesovOverlapNormTopValueSet Q s p u) := + cubeBesovOverlapNormTopValueSet_bddAbove_of_seminormValueSet_bddAbove + Q s p u hu.partialSeminorms_bddAbove + +theorem cubeBesovDisjointPartialSeminorm_le_cubeBesovDisjointSeminorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormValueSet Q s p q u)) + (N : ℕ) : + cubeBesovDisjointPartialSeminorm Q s p q N u ≤ + cubeBesovDisjointSeminorm Q s p q u := by + unfold cubeBesovDisjointSeminorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovDisjointPartialSeminormTop_le_cubeBesovDisjointSeminormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormTopValueSet Q s p u)) + (N : ℕ) : + cubeBesovDisjointPartialSeminormTop Q s p N u ≤ + cubeBesovDisjointSeminormTop Q s p u := by + unfold cubeBesovDisjointSeminormTop + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovDisjointPartialNorm_le_cubeBesovDisjointNorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointNormValueSet Q s p q u)) + (N : ℕ) : + cubeBesovDisjointPartialNorm Q s p q N u ≤ + cubeBesovDisjointNorm Q s p q u := by + unfold cubeBesovDisjointNorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovDisjointPartialNormTop_le_cubeBesovDisjointNormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointNormTopValueSet Q s p u)) + (N : ℕ) : + cubeBesovDisjointPartialNormTop Q s p N u ≤ + cubeBesovDisjointNormTop Q s p u := by + unfold cubeBesovDisjointNormTop + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) + (N : ℕ) : + cubeBesovOverlapPartialSeminorm Q s p q N u ≤ + cubeBesovOverlapSeminorm Q s p q u := by + unfold cubeBesovOverlapSeminorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovOverlapPartialSeminormTop_le_cubeBesovOverlapSeminormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) + (N : ℕ) : + cubeBesovOverlapPartialSeminormTop Q s p N u ≤ + cubeBesovOverlapSeminormTop Q s p u := by + unfold cubeBesovOverlapSeminormTop + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovOverlapPartialNorm_le_cubeBesovOverlapNorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) + (N : ℕ) : + cubeBesovOverlapPartialNorm Q s p q N u ≤ + cubeBesovOverlapNorm Q s p q u := by + unfold cubeBesovOverlapPartialNorm cubeBesovOverlapNorm + exact add_le_add + (cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + Q s p q u hBdd N) + le_rfl + +theorem cubeBesovOverlapPartialNormTop_le_cubeBesovOverlapNormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) + (N : ℕ) : + cubeBesovOverlapPartialNormTop Q s p N u ≤ + cubeBesovOverlapNormTop Q s p u := by + unfold cubeBesovOverlapPartialNormTop cubeBesovOverlapNormTop + exact add_le_add + (cubeBesovOverlapPartialSeminormTop_le_cubeBesovOverlapSeminormTop_of_bddAbove + Q s p u hBdd N) + le_rfl + +theorem cubeBesovDisjointSeminorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormValueSet Q s p q u)) : + 0 ≤ cubeBesovDisjointSeminorm Q s p q u := by + exact + (cubeBesovPartialSeminorm_nonneg Q s p q 0 u).trans + (cubeBesovDisjointPartialSeminorm_le_cubeBesovDisjointSeminorm_of_bddAbove + Q s p q u hBdd 0) + +theorem cubeBesovDisjointSeminormTop_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointSeminormTopValueSet Q s p u)) : + 0 ≤ cubeBesovDisjointSeminormTop Q s p u := by + exact + (cubeBesovPartialSeminormTop_nonneg Q s p 0 u).trans + (cubeBesovDisjointPartialSeminormTop_le_cubeBesovDisjointSeminormTop_of_bddAbove + Q s p u hBdd 0) + +theorem cubeBesovDisjointNorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointNormValueSet Q s p q u)) : + 0 ≤ cubeBesovDisjointNorm Q s p q u := by + exact + (cubeBesovPartialNorm_nonneg Q s p q 0 u).trans + (cubeBesovDisjointPartialNorm_le_cubeBesovDisjointNorm_of_bddAbove + Q s p q u hBdd 0) + +theorem cubeBesovDisjointNormTop_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovDisjointNormTopValueSet Q s p u)) : + 0 ≤ cubeBesovDisjointNormTop Q s p u := by + exact + (cubeBesovPartialNormTop_nonneg Q s p 0 u).trans + (cubeBesovDisjointPartialNormTop_le_cubeBesovDisjointNormTop_of_bddAbove + Q s p u hBdd 0) + +theorem cubeBesovOverlapSeminorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) : + 0 ≤ cubeBesovOverlapSeminorm Q s p q u := by + exact + (cubeBesovOverlapPartialSeminorm_nonneg Q s p q 0 u).trans + (cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + Q s p q u hBdd 0) + +theorem cubeBesovOverlapSeminormTop_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) : + 0 ≤ cubeBesovOverlapSeminormTop Q s p u := by + exact + (cubeBesovOverlapPartialSeminormTop_nonneg Q s p 0 u).trans + (cubeBesovOverlapPartialSeminormTop_le_cubeBesovOverlapSeminormTop_of_bddAbove + Q s p u hBdd 0) + +theorem cubeBesovOverlapNorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) : + 0 ≤ cubeBesovOverlapNorm Q s p q u := by + unfold cubeBesovOverlapNorm + exact add_nonneg + (cubeBesovOverlapSeminorm_nonneg_of_bddAbove Q s p q u hBdd) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem cubeBesovOverlapNormTop_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) + (hBdd : BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) : + 0 ≤ cubeBesovOverlapNormTop Q s p u := by + unfold cubeBesovOverlapNormTop + exact add_nonneg + (cubeBesovOverlapSeminormTop_nonneg_of_bddAbove Q s p u hBdd) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem CubeBesovDisjointRegularity.partialSeminorm_le_seminorm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) (N : ℕ) : + cubeBesovDisjointPartialSeminorm Q s p q N u ≤ + cubeBesovDisjointSeminorm Q s p q u := + cubeBesovDisjointPartialSeminorm_le_cubeBesovDisjointSeminorm_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove N + +theorem CubeBesovDisjointRegularityTop.partialSeminorm_le_seminorm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) (N : ℕ) : + cubeBesovDisjointPartialSeminormTop Q s p N u ≤ + cubeBesovDisjointSeminormTop Q s p u := + cubeBesovDisjointPartialSeminormTop_le_cubeBesovDisjointSeminormTop_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove N + +theorem CubeBesovOverlapRegularity.partialSeminorm_le_seminorm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) (N : ℕ) : + cubeBesovOverlapPartialSeminorm Q s p q N u ≤ + cubeBesovOverlapSeminorm Q s p q u := + cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove N + +theorem CubeBesovOverlapRegularityTop.partialSeminorm_le_seminorm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) (N : ℕ) : + cubeBesovOverlapPartialSeminormTop Q s p N u ≤ + cubeBesovOverlapSeminormTop Q s p u := + cubeBesovOverlapPartialSeminormTop_le_cubeBesovOverlapSeminormTop_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove N + +theorem CubeBesovDisjointRegularity.partialNorm_le_norm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) (N : ℕ) : + cubeBesovDisjointPartialNorm Q s p q N u ≤ + cubeBesovDisjointNorm Q s p q u := + cubeBesovDisjointPartialNorm_le_cubeBesovDisjointNorm_of_bddAbove + Q s p q u hu.normValueSet_bddAbove N + +theorem CubeBesovDisjointRegularityTop.partialNorm_le_norm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) (N : ℕ) : + cubeBesovDisjointPartialNormTop Q s p N u ≤ + cubeBesovDisjointNormTop Q s p u := + cubeBesovDisjointPartialNormTop_le_cubeBesovDisjointNormTop_of_bddAbove + Q s p u hu.normValueSet_bddAbove N + +theorem CubeBesovOverlapRegularity.partialNorm_le_norm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) (N : ℕ) : + cubeBesovOverlapPartialNorm Q s p q N u ≤ + cubeBesovOverlapNorm Q s p q u := + cubeBesovOverlapPartialNorm_le_cubeBesovOverlapNorm_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove N + +theorem CubeBesovOverlapRegularityTop.partialNorm_le_norm {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) (N : ℕ) : + cubeBesovOverlapPartialNormTop Q s p N u ≤ + cubeBesovOverlapNormTop Q s p u := + cubeBesovOverlapPartialNormTop_le_cubeBesovOverlapNormTop_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove N + +theorem CubeBesovDisjointRegularity.seminorm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) : + 0 ≤ cubeBesovDisjointSeminorm Q s p q u := + cubeBesovDisjointSeminorm_nonneg_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove + +theorem CubeBesovDisjointRegularityTop.seminorm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) : + 0 ≤ cubeBesovDisjointSeminormTop Q s p u := + cubeBesovDisjointSeminormTop_nonneg_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularity.seminorm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) : + 0 ≤ cubeBesovOverlapSeminorm Q s p q u := + cubeBesovOverlapSeminorm_nonneg_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularityTop.seminorm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) : + 0 ≤ cubeBesovOverlapSeminormTop Q s p u := + cubeBesovOverlapSeminormTop_nonneg_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove + +theorem CubeBesovDisjointRegularity.norm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularity Q s p q u) : + 0 ≤ cubeBesovDisjointNorm Q s p q u := + cubeBesovDisjointNorm_nonneg_of_bddAbove + Q s p q u hu.normValueSet_bddAbove + +theorem CubeBesovDisjointRegularityTop.norm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovDisjointRegularityTop Q s p u) : + 0 ≤ cubeBesovDisjointNormTop Q s p u := + cubeBesovDisjointNormTop_nonneg_of_bddAbove + Q s p u hu.normValueSet_bddAbove + +theorem CubeBesovOverlapRegularity.norm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p q : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularity Q s p q u) : + 0 ≤ cubeBesovOverlapNorm Q s p q u := + cubeBesovOverlapNorm_nonneg_of_bddAbove + Q s p q u hu.partialSeminorms_bddAbove + +theorem CubeBesovOverlapRegularityTop.norm_nonneg {d : ℕ} + {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + (hu : CubeBesovOverlapRegularityTop Q s p u) : + 0 ≤ cubeBesovOverlapNormTop Q s p u := + cubeBesovOverlapNormTop_nonneg_of_bddAbove + Q s p u hu.partialSeminorms_bddAbove + +@[simp] theorem cubeBesovDisjointSeminorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovDisjointSeminorm Q s p q (fun _ => u) = 0 := by + unfold cubeBesovDisjointSeminorm cubeBesovDisjointSeminormValueSet + simp [cubeBesovDisjointPartialSeminorm, hp0, hpTop, hq0, hqTop] + +@[simp] theorem cubeBesovDisjointSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovDisjointSeminorm Q s p q (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovDisjointSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovDisjointSeminormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDisjointSeminormTop Q s p (fun _ => u) = 0 := by + unfold cubeBesovDisjointSeminormTop cubeBesovDisjointSeminormTopValueSet + simp [cubeBesovDisjointPartialSeminormTop, hp0, hpTop] + +@[simp] theorem cubeBesovDisjointSeminormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDisjointSeminormTop Q s p (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovDisjointSeminormTop_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovDisjointNorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovDisjointNorm Q s p q (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovDisjointNorm cubeBesovDisjointNormValueSet + simp [cubeBesovDisjointPartialNorm, hp0, hpTop, hq0, hqTop] + +@[simp] theorem cubeBesovDisjointNorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovDisjointNorm Q s p q (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovDisjointNorm_const + (Q := Q) (s := s) (p := p) (q := q) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovDisjointNormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDisjointNormTop Q s p (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovDisjointNormTop cubeBesovDisjointNormTopValueSet + simp [cubeBesovDisjointPartialNormTop, hp0, hpTop] + +@[simp] theorem cubeBesovDisjointNormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovDisjointNormTop Q s p (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovDisjointNormTop_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovOverlapSeminorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapSeminorm Q s p q (fun _ => u) = 0 := by + unfold cubeBesovOverlapSeminorm cubeBesovOverlapSeminormValueSet + simp [hp0, hpTop, hq0, hqTop] + +@[simp] theorem cubeBesovOverlapSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapSeminorm Q s p q (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovOverlapSeminormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapSeminormTop Q s p (fun _ => u) = 0 := by + unfold cubeBesovOverlapSeminormTop cubeBesovOverlapSeminormTopValueSet + simp [hp0, hpTop] + +@[simp] theorem cubeBesovOverlapSeminormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapSeminormTop Q s p (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapSeminormTop_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovOverlapNorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapNorm Q s p q (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovOverlapNorm + rw [cubeBesovOverlapSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (u := u) hp0 hpTop hq0 hqTop] + rw [cubeAverage_const Q u] + simp + +@[simp] theorem cubeBesovOverlapNorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapNorm Q s p q (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapNorm_const + (Q := Q) (s := s) (p := p) (q := q) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovOverlapNormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapNormTop Q s p (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovOverlapNormTop + rw [cubeBesovOverlapSeminormTop_const + (Q := Q) (s := s) (p := p) (u := u) hp0 hpTop] + rw [cubeAverage_const Q u] + simp + +@[simp] theorem cubeBesovOverlapNormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapNormTop Q s p (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapNormTop_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) hp0 hpTop + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Overlap.lean b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Overlap.lean new file mode 100644 index 0000000000..a8bbabeb75 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/Positive/Overlap.lean @@ -0,0 +1,345 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp + +/-! # Overlap -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +/-! +## Explicit overlapping positive Besov seminorms + +These definitions implement the scale-local overlapping positive Besov +oscillation and the finite-depth overlapping truncations. The full +infinite-depth wrappers are the manuscript-facing scalar objects under +boundedness/regularity hypotheses, while the unqualified `cubeBesov*` names +above remain the existing disjoint descendant definitions. +-/ + +noncomputable def cubeBesovOverlapOscillation {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + ScalarOverlap.cubeLpNorm S p + (fun x => u x - ScalarOverlap.cubeAverage S u) + +noncomputable def cubeBesovOverlapDepthAverage {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : ℝ := + ScalarOverlap.centersAverage Q j fun S => + (cubeBesovOverlapOscillation S p u) ^ p.toReal + +noncomputable def cubeBesovOverlapDepthWeight {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : ℝ := + cubeBesovDepthWeight Q s j + +noncomputable def cubeBesovOverlapDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → ℝ) (j : ℕ) : ℝ := + cubeBesovOverlapDepthWeight Q s j * + (cubeBesovOverlapDepthAverage Q p u j) ^ (1 / p.toReal) + +noncomputable def cubeBesovOverlapPartialSeminorm {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := by + exact + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovOverlapDepthSeminorm Q s p u j) ^ q.toReal)) ^ + (1 / q.toReal) + +noncomputable def cubeBesovOverlapPartialSeminormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : ℝ := + (Finset.range (N + 1)).sup' ⟨0, by simp⟩ + (fun j => cubeBesovOverlapDepthSeminorm Q s p u j) + +noncomputable def cubeBesovOverlapPartialNorm {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + cubeBesovOverlapPartialSeminorm Q s p q N u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +noncomputable def cubeBesovOverlapPartialNormTop {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : ℝ := + cubeBesovOverlapPartialSeminormTop Q s p N u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + +@[simp] theorem cubeBesovOverlapOscillation_middleChildCube {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : + cubeBesovOverlapOscillation (ScalarOverlap.middleChildCube Q) p u = + cubeBesovOscillation Q p u := by + unfold cubeBesovOverlapOscillation cubeBesovOscillation cubeFluctuation + simp + +theorem cubeBesovOverlapOscillation_nonneg {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : + 0 ≤ cubeBesovOverlapOscillation S p u := + ScalarOverlap.cubeLpNorm_nonneg S p + (fun x => u x - ScalarOverlap.cubeAverage S u) + +theorem cubeBesovOverlapDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovOverlapDepthAverage Q p u j := by + unfold cubeBesovOverlapDepthAverage + exact ScalarOverlap.centersAverage_nonneg Q j _ fun S _hS => + Real.rpow_nonneg (cubeBesovOverlapOscillation_nonneg S p u) _ + +theorem cubeBesovOverlapDepthWeight_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + 0 ≤ cubeBesovOverlapDepthWeight Q s j := by + unfold cubeBesovOverlapDepthWeight cubeBesovDepthWeight + have hQ : 0 ≤ cubeScaleFactor Q := le_of_lt <| by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow : 0 ≤ (3 : ℝ) ^ j := by positivity + exact Real.rpow_nonneg (div_nonneg hQ hpow) _ + +theorem cubeBesovOverlapDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovOverlapDepthSeminorm Q s p u j := by + unfold cubeBesovOverlapDepthSeminorm + exact mul_nonneg (cubeBesovOverlapDepthWeight_nonneg Q s j) + (Real.rpow_nonneg (cubeBesovOverlapDepthAverage_nonneg Q p u j) _) + +theorem cubeBesovOverlapPartialSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : + 0 ≤ cubeBesovOverlapPartialSeminorm Q s p q N u := by + unfold cubeBesovOverlapPartialSeminorm + exact Real.rpow_nonneg + (Finset.sum_nonneg fun j _ => + Real.rpow_nonneg (cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) _) + _ + +theorem cubeBesovOverlapPartialSeminormTop_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : + 0 ≤ cubeBesovOverlapPartialSeminormTop Q s p N u := by + unfold cubeBesovOverlapPartialSeminormTop + exact le_trans (cubeBesovOverlapDepthSeminorm_nonneg Q s p u 0) + (Finset.le_sup' (f := fun j => cubeBesovOverlapDepthSeminorm Q s p u j) + (by simp)) + +theorem cubeBesovOverlapPartialNorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : + 0 ≤ cubeBesovOverlapPartialNorm Q s p q N u := by + unfold cubeBesovOverlapPartialNorm + exact add_nonneg + (cubeBesovOverlapPartialSeminorm_nonneg Q s p q N u) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem cubeBesovOverlapPartialNormTop_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (u : Vec d → ℝ) : + 0 ≤ cubeBesovOverlapPartialNormTop Q s p N u := by + unfold cubeBesovOverlapPartialNormTop + exact add_nonneg + (cubeBesovOverlapPartialSeminormTop_nonneg Q s p N u) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +@[simp] theorem cubeBesovOverlapOscillation_const {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (c : ℝ) (hp0 : p ≠ 0) : + cubeBesovOverlapOscillation S p (fun _ => c) = 0 := by + unfold cubeBesovOverlapOscillation + have havg : ScalarOverlap.cubeAverage S (fun _ : Vec d => c) = c := by + simp + simpa [havg] using + ScalarOverlap.cubeLpNorm_zero (S := S) (p := p) (E := ℝ) hp0 + +@[simp] theorem cubeBesovOverlapOscillation_zero {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (hp0 : p ≠ 0) : + cubeBesovOverlapOscillation S p (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapOscillation_const + (S := S) (p := p) (c := (0 : ℝ)) hp0 + +@[simp] theorem cubeBesovOverlapDepthAverage_const {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (c : ℝ) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapDepthAverage Q p (fun _ => c) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + calc + cubeBesovOverlapDepthAverage Q p (fun _ => c) j = + ScalarOverlap.centersAverage Q j (fun _ => (0 : ℝ)) := by + unfold cubeBesovOverlapDepthAverage + simp [cubeBesovOverlapOscillation_const, hp0, hpPos.ne'] + _ = 0 := by + simpa using ScalarOverlap.centersAverage_const Q j (0 : ℝ) + +@[simp] theorem cubeBesovOverlapDepthAverage_zero {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapDepthAverage Q p (fun _ => (0 : ℝ)) j = 0 := by + simpa using cubeBesovOverlapDepthAverage_const + (Q := Q) (p := p) (c := (0 : ℝ)) (j := j) hp0 hpTop + +@[simp] theorem cubeBesovOverlapDepthAverage_depth_zero {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : + cubeBesovOverlapDepthAverage Q p u 0 = + (cubeBesovOscillation Q p u) ^ p.toReal := by + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + simp + +private theorem sum_range_succ_mono_of_nonneg {f : ℕ → ℝ} + (h_nonneg : ∀ j : ℕ, 0 ≤ f j) {N M : ℕ} (hNM : N ≤ M) : + (Finset.range (N + 1)).sum f ≤ (Finset.range (M + 1)).sum f := by + classical + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + exact Finset.mem_range.mpr + (lt_of_lt_of_le (Finset.mem_range.mp hj) (Nat.succ_le_succ hNM)) + · intro j _hjM _hjN + exact h_nonneg j + +private theorem sup'_range_succ_mono {f : ℕ → ℝ} {N M : ℕ} (hNM : N ≤ M) : + (Finset.range (N + 1)).sup' ⟨0, by simp⟩ f ≤ + (Finset.range (M + 1)).sup' ⟨0, by simp⟩ f := by + classical + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := f) ?_ + intro j hj + exact Finset.le_sup' (s := Finset.range (M + 1)) (f := f) + (Finset.mem_range.mpr + (lt_of_lt_of_le (Finset.mem_range.mp hj) (Nat.succ_le_succ hNM))) + +theorem cubeBesovOverlapPartialSeminorm_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : 0 < q.toReal) : + Monotone fun N : ℕ => cubeBesovOverlapPartialSeminorm Q s p q N u := by + intro N M hNM + unfold cubeBesovOverlapPartialSeminorm + have hsumN_nonneg : + 0 ≤ (Finset.range (N + 1)).sum + (fun j => (cubeBesovOverlapDepthSeminorm Q s p u j) ^ q.toReal) := by + exact Finset.sum_nonneg fun j _ => + Real.rpow_nonneg (cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) _ + have hsum_le : + (Finset.range (N + 1)).sum + (fun j => (cubeBesovOverlapDepthSeminorm Q s p u j) ^ q.toReal) ≤ + (Finset.range (M + 1)).sum + (fun j => (cubeBesovOverlapDepthSeminorm Q s p u j) ^ q.toReal) := by + exact sum_range_succ_mono_of_nonneg + (fun j => + Real.rpow_nonneg (cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) _) + hNM + exact Real.rpow_le_rpow hsumN_nonneg hsum_le (one_div_pos.mpr hq).le + +theorem cubeBesovOverlapPartialSeminormTop_mono_N {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + Monotone fun N : ℕ => cubeBesovOverlapPartialSeminormTop Q s p N u := by + intro N M hNM + unfold cubeBesovOverlapPartialSeminormTop + exact sup'_range_succ_mono + (f := fun j => cubeBesovOverlapDepthSeminorm Q s p u j) hNM + +theorem cubeBesovOverlapPartialNorm_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) (hq : 0 < q.toReal) : + Monotone fun N : ℕ => cubeBesovOverlapPartialNorm Q s p q N u := by + intro N M hNM + unfold cubeBesovOverlapPartialNorm + exact add_le_add (cubeBesovOverlapPartialSeminorm_mono_N Q s p q u hq hNM) le_rfl + +theorem cubeBesovOverlapPartialNormTop_mono_N {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : + Monotone fun N : ℕ => cubeBesovOverlapPartialNormTop Q s p N u := by + intro N M hNM + unfold cubeBesovOverlapPartialNormTop + exact add_le_add (cubeBesovOverlapPartialSeminormTop_mono_N Q s p u hNM) le_rfl + +@[simp] theorem cubeBesovOverlapDepthSeminorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : ℝ) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapDepthSeminorm Q s p (fun _ => u) j = 0 := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hpInv : (1 / p.toReal) ≠ 0 := one_div_ne_zero hpPos.ne' + unfold cubeBesovOverlapDepthSeminorm + rw [cubeBesovOverlapDepthAverage_const + (Q := Q) (p := p) (c := u) (j := j) hp0 hpTop] + rw [Real.zero_rpow hpInv, mul_zero] + +@[simp] theorem cubeBesovOverlapDepthSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (j : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapDepthSeminorm Q s p (fun _ => (0 : ℝ)) j = 0 := by + simpa using cubeBesovOverlapDepthSeminorm_const + (Q := Q) (s := s) (p := p) (u := (0 : ℝ)) (j := j) hp0 hpTop + +@[simp] theorem cubeBesovOverlapPartialSeminorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapPartialSeminorm Q s p q N (fun _ => u) = 0 := by + have hqPos : 0 < q.toReal := ENNReal.toReal_pos hq0 hqTop + unfold cubeBesovOverlapPartialSeminorm + simp [cubeBesovOverlapDepthSeminorm_const, hp0, hpTop, hqPos.ne'] + +@[simp] theorem cubeBesovOverlapPartialSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapPartialSeminorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapPartialSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (N := N) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop + +@[simp] theorem cubeBesovOverlapPartialSeminormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapPartialSeminormTop Q s p N (fun _ => u) = 0 := by + refine le_antisymm ?_ + (cubeBesovOverlapPartialSeminormTop_nonneg Q s p N (fun _ => u)) + unfold cubeBesovOverlapPartialSeminormTop + refine Finset.sup'_le (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovOverlapDepthSeminorm Q s p (fun _ => u) j) ?_ + intro j hj + simp [cubeBesovOverlapDepthSeminorm_const, hp0, hpTop] + +@[simp] theorem cubeBesovOverlapPartialSeminormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapPartialSeminormTop Q s p N (fun _ => (0 : ℝ)) = 0 := by + simpa using cubeBesovOverlapPartialSeminormTop_const + (Q := Q) (s := s) (p := p) (N := N) (u := (0 : ℝ)) hp0 hpTop + +@[simp] theorem cubeBesovOverlapPartialNorm_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapPartialNorm Q s p q N (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovOverlapPartialNorm + rw [cubeBesovOverlapPartialSeminorm_const + (Q := Q) (s := s) (p := p) (q := q) (N := N) (u := u) + hp0 hpTop hq0 hqTop] + simp [cubeAverage_const] + +@[simp] theorem cubeBesovOverlapPartialNorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) (hq0 : q ≠ 0) (hqTop : q ≠ ∞) : + cubeBesovOverlapPartialNorm Q s p q N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovOverlapPartialNorm_const + (Q := Q) (s := s) (p := p) (q := q) (N := N) (u := (0 : ℝ)) + hp0 hpTop hq0 hqTop] + simp + +@[simp] theorem cubeBesovOverlapPartialNormTop_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : ℝ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapPartialNormTop Q s p N (fun _ => u) = + cubeBesovScaleWeight s Q * ‖u‖ := by + unfold cubeBesovOverlapPartialNormTop + rw [cubeBesovOverlapPartialSeminormTop_const + (Q := Q) (s := s) (p := p) (N := N) (u := u) hp0 hpTop] + simp [cubeAverage_const] + +@[simp] theorem cubeBesovOverlapPartialNormTop_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) : + cubeBesovOverlapPartialNormTop Q s p N (fun _ => (0 : ℝ)) = 0 := by + rw [cubeBesovOverlapPartialNormTop_const + (Q := Q) (s := s) (p := p) (N := N) (u := (0 : ℝ)) hp0 hpTop] + simp + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/PositiveOverlapBridge.lean b/LeanPool/CoarseGraining/Homogenization/Besov/PositiveOverlapBridge.lean new file mode 100644 index 0000000000..4b10bfa3f2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/PositiveOverlapBridge.lean @@ -0,0 +1,503 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Full + +/-! # Positive Overlap Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Disjoint-to-overlap positive Besov bridge + +The basic geometric input is that every ordinary depth-`j` descendant cube is +the scalar-overlap cube of its middle child. This gives the one useful bridge +direction: the disjoint depth average is controlled by the overlapping depth +average, with only the cardinality loss from the extra generation of centers. +-/ + +namespace ScalarOverlap + +theorem centersAtDepth_card_le_three_pow_mul_descendantsAtDepth_card + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (centersAtDepth Q j).card ≤ + 3 ^ d * (descendantsAtDepth Q j).card := by + calc + (centersAtDepth Q j).card + ≤ (descendantsAtDepth Q (j + 1)).card := + centersAtDepth_card_le_descendantsAtDepth_card Q j + _ = (descendantsAtDepth Q j).card * 3 ^ d := + descendantsAtDepth_card_succ Q j + _ = 3 ^ d * (descendantsAtDepth Q j).card := by + rw [Nat.mul_comm] + +end ScalarOverlap + +theorem cubeBesovDepthAverage_le_three_pow_mul_overlapDepthAverage + {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthAverage Q p u j ≤ + (3 ^ d : ℝ) * cubeBesovOverlapDepthAverage Q p u j := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let O : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let G : TriadicCube d → ℝ := + fun S => (cubeBesovOverlapOscillation S p u) ^ p.toReal + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hD_card_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hD_card_ne : (D.card : ℝ) ≠ 0 := ne_of_gt hD_card_pos + have hO_nonempty : O.Nonempty := by + simpa [O] using ScalarOverlap.centersAtDepth_nonempty Q j + have hO_card_pos : 0 < (O.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hO_nonempty + have hO_card_ne : (O.card : ℝ) ≠ 0 := ne_of_gt hO_card_pos + have hG_nonneg : ∀ S ∈ O, 0 ≤ G S := by + intro S _hS + exact Real.rpow_nonneg (cubeBesovOverlapOscillation_nonneg S p u) _ + have himage_subset : D.image ScalarOverlap.middleChildCube ⊆ O := by + intro S hS + rcases Finset.mem_image.mp hS with ⟨R, hR, rfl⟩ + exact ScalarOverlap.middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth + (by simpa [D] using hR) + have hsum_image_le : (D.image ScalarOverlap.middleChildCube).sum G ≤ O.sum G := by + exact Finset.sum_le_sum_of_subset_of_nonneg himage_subset + (fun S hSO _hSnot => hG_nonneg S hSO) + have hsum_desc_eq_image : + D.sum (fun R => (cubeBesovOscillation R p u) ^ p.toReal) = + (D.image ScalarOverlap.middleChildCube).sum G := by + rw [Finset.sum_image] + · simp + · intro R _hR S _hS hRS + exact ScalarOverlap.middleChildCube_injective hRS + have hsum_nonneg : 0 ≤ O.sum G := by + exact Finset.sum_nonneg hG_nonneg + have hcard_nat : + O.card ≤ 3 ^ d * D.card := by + simpa [D, O] using + ScalarOverlap.centersAtDepth_card_le_three_pow_mul_descendantsAtDepth_card Q j + have hcard_real : + (O.card : ℝ) ≤ (3 ^ d : ℝ) * (D.card : ℝ) := by + exact_mod_cast hcard_nat + have hdenom : + (D.card : ℝ)⁻¹ * O.sum G ≤ + (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := by + calc + (D.card : ℝ)⁻¹ * O.sum G + = ((O.card : ℝ) / (D.card : ℝ)) * + ((O.card : ℝ)⁻¹ * O.sum G) := by + field_simp [hD_card_ne, hO_card_ne] + _ ≤ (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := by + have hratio : + (O.card : ℝ) / (D.card : ℝ) ≤ (3 ^ d : ℝ) := by + rw [div_le_iff₀ hD_card_pos] + simpa [mul_comm, mul_left_comm, mul_assoc] using hcard_real + have havg_nonneg : 0 ≤ (O.card : ℝ)⁻¹ * O.sum G := + mul_nonneg (inv_nonneg.mpr (le_of_lt hO_card_pos)) hsum_nonneg + exact mul_le_mul_of_nonneg_right hratio havg_nonneg + calc + cubeBesovDepthAverage Q p u j + = (D.card : ℝ)⁻¹ * + D.sum (fun R => (cubeBesovOscillation R p u) ^ p.toReal) := by + rfl + _ = (D.card : ℝ)⁻¹ * (D.image ScalarOverlap.middleChildCube).sum G := by + rw [hsum_desc_eq_image] + _ ≤ (D.card : ℝ)⁻¹ * O.sum G := by + exact mul_le_mul_of_nonneg_left hsum_image_le + (inv_nonneg.mpr (le_of_lt hD_card_pos)) + _ ≤ (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := hdenom + _ = (3 ^ d : ℝ) * + cubeBesovOverlapDepthAverage Q p u j := by + rfl + +private theorem three_pow_depth_loss_root + {d : ℕ} {p : ℝ≥0∞} : + ((3 ^ d : ℝ) ^ (1 / p.toReal)) = + (3 : ℝ) ^ ((d : ℝ) / p.toReal) := by + rw [← Real.rpow_natCast, ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + congr 1 + ring + +theorem cubeBesovDepthSeminorm_le_three_rpow_mul_overlapDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} (hp : 0 < p.toReal) + (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthSeminorm Q s p u j + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapDepthSeminorm Q s p u j := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + let r : ℝ := 1 / p.toReal + have hr_nonneg : 0 ≤ r := by + exact (one_div_pos.mpr hp).le + have hbase_le : + cubeBesovDepthAverage Q p u j ≤ + (3 ^ d : ℝ) * cubeBesovOverlapDepthAverage Q p u j := + cubeBesovDepthAverage_le_three_pow_mul_overlapDepthAverage Q p u j + have hroot_le : + (cubeBesovDepthAverage Q p u j) ^ r + ≤ C * (cubeBesovOverlapDepthAverage Q p u j) ^ r := by + have hC_eq : ((3 ^ d : ℝ) ^ r) = C := by + simpa [C, r] using three_pow_depth_loss_root (d := d) (p := p) + calc + (cubeBesovDepthAverage Q p u j) ^ r + ≤ ((3 ^ d : ℝ) * + cubeBesovOverlapDepthAverage Q p u j) ^ r := by + exact Real.rpow_le_rpow + (cubeBesovDepthAverage_nonneg Q p u j) hbase_le hr_nonneg + _ = ((3 ^ d : ℝ) ^ r) * + (cubeBesovOverlapDepthAverage Q p u j) ^ r := by + rw [Real.mul_rpow (by positivity) + (cubeBesovOverlapDepthAverage_nonneg Q p u j)] + _ = C * (cubeBesovOverlapDepthAverage Q p u j) ^ r := by + rw [hC_eq] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + calc + cubeBesovDepthSeminorm Q s p u j + = cubeBesovDepthWeight Q s j * + (cubeBesovDepthAverage Q p u j) ^ r := by + rfl + _ ≤ cubeBesovDepthWeight Q s j * + (C * (cubeBesovOverlapDepthAverage Q p u j) ^ r) := by + exact mul_le_mul_of_nonneg_left hroot_le hweight_nonneg + _ = C * (cubeBesovDepthWeight Q s j * + (cubeBesovOverlapDepthAverage Q p u j) ^ r) := by + ring + _ = C * cubeBesovOverlapDepthSeminorm Q s p u j := by + rfl + +private theorem finset_lq_le_mul_of_forall_le_mul + {ι : Type*} (s : Finset ι) {q C : ℝ} (hq : 0 < q) (hC : 0 ≤ C) + {a b : ι → ℝ} (ha : ∀ i ∈ s, 0 ≤ a i) (hb : ∀ i ∈ s, 0 ≤ b i) + (h : ∀ i ∈ s, a i ≤ C * b i) : + (Finset.sum s fun i => (a i) ^ q) ^ (1 / q) + ≤ C * (Finset.sum s fun i => (b i) ^ q) ^ (1 / q) := by + have hq_nonneg : 0 ≤ q := hq.le + have hq_ne : q ≠ 0 := hq.ne' + have hsumA_nonneg : + 0 ≤ Finset.sum s fun i => (a i) ^ q := by + exact Finset.sum_nonneg fun i hi => Real.rpow_nonneg (ha i hi) q + have hsumB_nonneg : + 0 ≤ Finset.sum s fun i => (b i) ^ q := by + exact Finset.sum_nonneg fun i hi => Real.rpow_nonneg (hb i hi) q + have hsum_le : + Finset.sum s (fun i => (a i) ^ q) + ≤ C ^ q * Finset.sum s fun i => (b i) ^ q := by + calc + Finset.sum s (fun i => (a i) ^ q) + ≤ Finset.sum s (fun i => (C * b i) ^ q) := by + exact Finset.sum_le_sum fun i hi => + Real.rpow_le_rpow (ha i hi) (h i hi) hq_nonneg + _ = Finset.sum s (fun i => C ^ q * (b i) ^ q) := by + refine Finset.sum_congr rfl ?_ + intro i hi + exact Real.mul_rpow hC (hb i hi) + _ = C ^ q * Finset.sum s fun i => (b i) ^ q := by + rw [Finset.mul_sum] + calc + (Finset.sum s fun i => (a i) ^ q) ^ (1 / q) + ≤ (C ^ q * Finset.sum s fun i => (b i) ^ q) ^ (1 / q) := by + exact Real.rpow_le_rpow hsumA_nonneg hsum_le + (one_div_pos.mpr hq).le + _ = (C ^ q) ^ (1 / q) * + (Finset.sum s fun i => (b i) ^ q) ^ (1 / q) := by + rw [Real.mul_rpow (Real.rpow_nonneg hC q) hsumB_nonneg] + _ = C * (Finset.sum s fun i => (b i) ^ q) ^ (1 / q) := by + rw [show (1 / q : ℝ) = q⁻¹ by ring] + simp [Real.rpow_rpow_inv hC hq_ne] + +theorem cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s p q N u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapPartialSeminorm Q s p q N u := by + classical + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hq_pos : 0 < q.toReal := + lt_of_lt_of_le zero_lt_one hq + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + simpa [cubeBesovPartialSeminorm, cubeBesovOverlapPartialSeminorm, C] using + finset_lq_le_mul_of_forall_le_mul + (s := Finset.range (N + 1)) (q := q.toReal) (C := C) + hq_pos hC_nonneg + (fun j _hj => cubeBesovDepthSeminorm_nonneg Q s p u j) + (fun j _hj => cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) + (fun j _hj => + cubeBesovDepthSeminorm_le_three_rpow_mul_overlapDepthSeminorm + Q s hp u j) + +theorem cubeBesovPartialSeminormTop_le_three_rpow_mul_overlapPartialSeminormTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} (hp : 0 < p.toReal) + (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialSeminormTop Q s p N u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapPartialSeminormTop Q s p N u := by + classical + let R : Finset ℕ := Finset.range (N + 1) + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hR : R.Nonempty := by + exact ⟨0, by simp [R]⟩ + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + unfold cubeBesovPartialSeminormTop cubeBesovOverlapPartialSeminormTop + change + R.sup' hR (fun j => cubeBesovDepthSeminorm Q s p u j) ≤ + C * R.sup' hR (fun j => cubeBesovOverlapDepthSeminorm Q s p u j) + refine Finset.sup'_le hR _ ?_ + intro j hj + calc + cubeBesovDepthSeminorm Q s p u j + ≤ C * cubeBesovOverlapDepthSeminorm Q s p u j := + cubeBesovDepthSeminorm_le_three_rpow_mul_overlapDepthSeminorm + Q s hp u j + _ ≤ C * R.sup' hR + (fun j => cubeBesovOverlapDepthSeminorm Q s p u j) := by + exact mul_le_mul_of_nonneg_left + (Finset.le_sup' + (f := fun j => cubeBesovOverlapDepthSeminorm Q s p u j) hj) + hC_nonneg + +private theorem three_rpow_depth_loss_ge_one + {d : ℕ} {p : ℝ≥0∞} (hp : 0 < p.toReal) : + 1 ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) := by + have hexp_nonneg : 0 ≤ (d : ℝ) / p.toReal := + div_nonneg (by positivity) hp.le + exact Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) hexp_nonneg + +theorem cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialNorm Q s p q N u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapPartialNorm Q s p q N u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + have hsem : + cubeBesovPartialSeminorm Q s p q N u + ≤ C * cubeBesovOverlapPartialSeminorm Q s p q N u := by + exact cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + Q s hp hq N u + have hA_nonneg : 0 ≤ A := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _) + have hC_ge_one : 1 ≤ C := + three_rpow_depth_loss_ge_one (d := d) (p := p) hp + have hA_le : A ≤ C * A := by + calc + A = 1 * A := by rw [one_mul] + _ ≤ C * A := by + exact mul_le_mul_of_nonneg_right hC_ge_one hA_nonneg + unfold cubeBesovPartialNorm cubeBesovOverlapPartialNorm + change cubeBesovPartialSeminorm Q s p q N u + A ≤ + C * (cubeBesovOverlapPartialSeminorm Q s p q N u + A) + calc + cubeBesovPartialSeminorm Q s p q N u + A + ≤ C * cubeBesovOverlapPartialSeminorm Q s p q N u + C * A := by + exact add_le_add hsem hA_le + _ = C * (cubeBesovOverlapPartialSeminorm Q s p q N u + A) := by + ring + +theorem cubeBesovPartialNormTop_le_three_rpow_mul_overlapPartialNormTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp : 0 < p.toReal) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialNormTop Q s p N u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapPartialNormTop Q s p N u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + let A : ℝ := cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + have hsem : + cubeBesovPartialSeminormTop Q s p N u + ≤ C * cubeBesovOverlapPartialSeminormTop Q s p N u := by + exact cubeBesovPartialSeminormTop_le_three_rpow_mul_overlapPartialSeminormTop + Q s hp N u + have hA_nonneg : 0 ≤ A := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _) + have hC_ge_one : 1 ≤ C := + three_rpow_depth_loss_ge_one (d := d) (p := p) hp + have hA_le : A ≤ C * A := by + calc + A = 1 * A := by rw [one_mul] + _ ≤ C * A := by + exact mul_le_mul_of_nonneg_right hC_ge_one hA_nonneg + unfold cubeBesovPartialNormTop cubeBesovOverlapPartialNormTop + change cubeBesovPartialSeminormTop Q s p N u + A ≤ + C * (cubeBesovOverlapPartialSeminormTop Q s p N u + A) + calc + cubeBesovPartialSeminormTop Q s p N u + A + ≤ C * cubeBesovOverlapPartialSeminormTop Q s p N u + C * A := by + exact add_le_add hsem hA_le + _ = C * (cubeBesovOverlapPartialSeminormTop Q s p N u + A) := by + ring + +theorem cubeBesovDisjointSeminorm_le_three_rpow_mul_overlapSeminorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (u : Vec d → ℝ) + (hBddOverlap : + BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) : + cubeBesovDisjointSeminorm Q s p q u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapSeminorm Q s p q u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + unfold cubeBesovDisjointSeminorm + refine csSup_le + (cubeBesovDisjointSeminormValueSet_nonempty Q s p q u) ?_ + rintro x ⟨N, rfl⟩ + have hpartial : + cubeBesovDisjointPartialSeminorm Q s p q N u ≤ + C * cubeBesovOverlapPartialSeminorm Q s p q N u := by + simpa [cubeBesovDisjointPartialSeminorm, C] using + cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + Q s hp hq N u + calc + cubeBesovDisjointPartialSeminorm Q s p q N u + ≤ C * cubeBesovOverlapPartialSeminorm Q s p q N u := hpartial + _ ≤ C * cubeBesovOverlapSeminorm Q s p q u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + Q s p q u hBddOverlap N) + hC_nonneg + +theorem cubeBesovDisjointSeminormTop_le_three_rpow_mul_overlapSeminormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp : 0 < p.toReal) (u : Vec d → ℝ) + (hBddOverlap : + BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) : + cubeBesovDisjointSeminormTop Q s p u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapSeminormTop Q s p u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + unfold cubeBesovDisjointSeminormTop + refine csSup_le + (cubeBesovDisjointSeminormTopValueSet_nonempty Q s p u) ?_ + rintro x ⟨N, rfl⟩ + have hpartial : + cubeBesovDisjointPartialSeminormTop Q s p N u ≤ + C * cubeBesovOverlapPartialSeminormTop Q s p N u := by + simpa [cubeBesovDisjointPartialSeminormTop, C] using + cubeBesovPartialSeminormTop_le_three_rpow_mul_overlapPartialSeminormTop + Q s hp N u + calc + cubeBesovDisjointPartialSeminormTop Q s p N u + ≤ C * cubeBesovOverlapPartialSeminormTop Q s p N u := hpartial + _ ≤ C * cubeBesovOverlapSeminormTop Q s p u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovOverlapPartialSeminormTop_le_cubeBesovOverlapSeminormTop_of_bddAbove + Q s p u hBddOverlap N) + hC_nonneg + +theorem cubeBesovDisjointNorm_le_three_rpow_mul_overlapNorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (u : Vec d → ℝ) + (hBddOverlap : + BddAbove (cubeBesovOverlapSeminormValueSet Q s p q u)) : + cubeBesovDisjointNorm Q s p q u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapNorm Q s p q u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + unfold cubeBesovDisjointNorm + refine csSup_le (cubeBesovDisjointNormValueSet_nonempty Q s p q u) ?_ + rintro x ⟨N, rfl⟩ + have hpartial : + cubeBesovDisjointPartialNorm Q s p q N u ≤ + C * cubeBesovOverlapPartialNorm Q s p q N u := by + simpa [cubeBesovDisjointPartialNorm, C] using + cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm + Q s hp hq N u + calc + cubeBesovDisjointPartialNorm Q s p q N u + ≤ C * cubeBesovOverlapPartialNorm Q s p q N u := hpartial + _ ≤ C * cubeBesovOverlapNorm Q s p q u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovOverlapPartialNorm_le_cubeBesovOverlapNorm_of_bddAbove + Q s p q u hBddOverlap N) + hC_nonneg + +theorem cubeBesovDisjointNormTop_le_three_rpow_mul_overlapNormTop_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp : 0 < p.toReal) (u : Vec d → ℝ) + (hBddOverlap : + BddAbove (cubeBesovOverlapSeminormTopValueSet Q s p u)) : + cubeBesovDisjointNormTop Q s p u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapNormTop Q s p u := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / p.toReal) + have hC_nonneg : 0 ≤ C := + (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _).le + unfold cubeBesovDisjointNormTop + refine csSup_le (cubeBesovDisjointNormTopValueSet_nonempty Q s p u) ?_ + rintro x ⟨N, rfl⟩ + have hpartial : + cubeBesovDisjointPartialNormTop Q s p N u ≤ + C * cubeBesovOverlapPartialNormTop Q s p N u := by + simpa [cubeBesovDisjointPartialNormTop, C] using + cubeBesovPartialNormTop_le_three_rpow_mul_overlapPartialNormTop + Q s hp N u + calc + cubeBesovDisjointPartialNormTop Q s p N u + ≤ C * cubeBesovOverlapPartialNormTop Q s p N u := hpartial + _ ≤ C * cubeBesovOverlapNormTop Q s p u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovOverlapPartialNormTop_le_cubeBesovOverlapNormTop_of_bddAbove + Q s p u hBddOverlap N) + hC_nonneg + +theorem cubeBesovDisjointSeminorm_le_three_rpow_mul_overlapSeminorm_of_overlapRegularity + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (u : Vec d → ℝ) + (hu : CubeBesovOverlapRegularity Q s p q u) : + cubeBesovDisjointSeminorm Q s p q u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapSeminorm Q s p q u := + cubeBesovDisjointSeminorm_le_three_rpow_mul_overlapSeminorm_of_bddAbove + Q s hp hq u hu.partialSeminorms_bddAbove + +theorem cubeBesovDisjointSeminormTop_le_three_rpow_mul_overlapSeminormTop_of_overlapRegularity + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp : 0 < p.toReal) (u : Vec d → ℝ) + (hu : CubeBesovOverlapRegularityTop Q s p u) : + cubeBesovDisjointSeminormTop Q s p u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapSeminormTop Q s p u := + cubeBesovDisjointSeminormTop_le_three_rpow_mul_overlapSeminormTop_of_bddAbove + Q s hp u hu.partialSeminorms_bddAbove + +theorem cubeBesovDisjointNorm_le_three_rpow_mul_overlapNorm_of_overlapRegularity + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p q : ℝ≥0∞} + (hp : 0 < p.toReal) (hq : 1 ≤ q.toReal) (u : Vec d → ℝ) + (hu : CubeBesovOverlapRegularity Q s p q u) : + cubeBesovDisjointNorm Q s p q u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapNorm Q s p q u := + cubeBesovDisjointNorm_le_three_rpow_mul_overlapNorm_of_bddAbove + Q s hp hq u hu.partialSeminorms_bddAbove + +theorem cubeBesovDisjointNormTop_le_three_rpow_mul_overlapNormTop_of_overlapRegularity + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp : 0 < p.toReal) (u : Vec d → ℝ) + (hu : CubeBesovOverlapRegularityTop Q s p u) : + cubeBesovDisjointNormTop Q s p u + ≤ (3 : ℝ) ^ ((d : ℝ) / p.toReal) * + cubeBesovOverlapNormTop Q s p u := + cubeBesovDisjointNormTop_le_three_rpow_mul_overlapNormTop_of_bddAbove + Q s hp u hu.partialSeminorms_bddAbove + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Besov/ProjectionCharacterization.lean b/LeanPool/CoarseGraining/Homogenization/Besov/ProjectionCharacterization.lean new file mode 100644 index 0000000000..b6755b187a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Besov/ProjectionCharacterization.lean @@ -0,0 +1,247 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive + +/-! # Projection Characterization -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped ENNReal + +/-! +Local projection-characterization lemmas for the positive cube Besov package. + +This first checkpoint stays deliberately depth-local. It identifies the +oscillation on each descendant cube with the local projection error against +`cubeProjection Q j`, then packages the resulting depth-average and +depth-seminorm reformulations. It also records the analogous local +`cubeIncrement` identity on descendants one generation deeper. +-/ + +noncomputable def cubeProjectionResidual {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → ℝ) : Vec d → ℝ := + fun x => u x - cubeProjection Q j u x + +noncomputable def cubeProjectionGap {d : ℕ} (Q : TriadicCube d) (j n : ℕ) + (u : Vec d → ℝ) : Vec d → ℝ := + fun x => cubeProjection Q (j + n) u x - cubeProjection Q j u x + +@[simp] theorem cubeProjectionResidual_apply {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → ℝ) (x : Vec d) : + cubeProjectionResidual Q j u x = u x - cubeProjection Q j u x := rfl + +@[simp] theorem cubeProjectionGap_apply {d : ℕ} (Q : TriadicCube d) (j n : ℕ) + (u : Vec d → ℝ) (x : Vec d) : + cubeProjectionGap Q j n u x = cubeProjection Q (j + n) u x - cubeProjection Q j u x := rfl + +theorem cubeFluctuation_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeFluctuation R u =ᵐ[normalizedCubeMeasure R] fun x => u x - cubeProjection Q j u x := by + filter_upwards [cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR] with x hx + simp [cubeFluctuation, hx] + +theorem cubeFluctuation_ae_eq_cubeProjectionResidual_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeFluctuation R u =ᵐ[normalizedCubeMeasure R] cubeProjectionResidual Q j u := by + simpa [cubeProjectionResidual] using! + cubeFluctuation_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR + +theorem cubeBesovOscillation_eq_cubeLpNorm_sub_cubeProjection_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovOscillation R p u = cubeLpNorm R p (fun x => u x - cubeProjection Q j u x) := by + unfold cubeBesovOscillation cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeFluctuation_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR)] + +theorem cubeBesovOscillation_eq_cubeLpNorm_cubeProjectionResidual_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovOscillation R p u = cubeLpNorm R p (cubeProjectionResidual Q j u) := by + simpa [cubeProjectionResidual] using! + cubeBesovOscillation_eq_cubeLpNorm_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) u hR + +theorem cubeBesovDepthAverage_eq_descendantsAverage_projection_error {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthAverage Q p u j = + descendantsAverage Q j (fun R => + (cubeLpNorm R p (fun x => u x - cubeProjection Q j u x)) ^ p.toReal) := by + classical + unfold cubeBesovDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeBesovOscillation_eq_cubeLpNorm_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (p := p) u hR] + +theorem cubeBesovDepthAverage_eq_descendantsAverage_projectionResidual {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthAverage Q p u j = + descendantsAverage Q j (fun R => + (cubeLpNorm R p (cubeProjectionResidual Q j u)) ^ p.toReal) := by + simpa [cubeProjectionResidual] using! + cubeBesovDepthAverage_eq_descendantsAverage_projection_error + (Q := Q) (p := p) (u := u) (j := j) + +theorem cubeBesovDepthSeminorm_eq_projection_error {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthSeminorm Q s p u j = + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => + (cubeLpNorm R p (fun x => u x - cubeProjection Q j u x)) ^ p.toReal)) ^ + (1 / p.toReal) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage_eq_descendantsAverage_projection_error] + +theorem cubeBesovDepthSeminorm_eq_projectionResidual {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) (j : ℕ) : + cubeBesovDepthSeminorm Q s p u j = + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => + (cubeLpNorm R p (cubeProjectionResidual Q j u)) ^ p.toReal)) ^ + (1 / p.toReal) := by + simpa [cubeProjectionResidual] using! + cubeBesovDepthSeminorm_eq_projection_error (Q := Q) (s := s) (p := p) (u := u) (j := j) + +theorem cubeBesovPartialSeminorm_eq_projection_error {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s p q N u = + (Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => + (cubeLpNorm R p (fun x => u x - cubeProjection Q j u x)) ^ p.toReal)) ^ + (1 / p.toReal)) ^ q.toReal) ^ + (1 / q.toReal) := by + unfold cubeBesovPartialSeminorm + refine congrArg (fun t : ℝ => t ^ (1 / q.toReal)) ?_ + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovDepthSeminorm_eq_projection_error] + +theorem cubeBesovPartialNorm_eq_projection_error {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialNorm Q s p q N u = + (Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => + (cubeLpNorm R p (fun x => u x - cubeProjection Q j u x)) ^ p.toReal)) ^ + (1 / p.toReal)) ^ q.toReal) ^ + (1 / q.toReal) + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ := by + unfold cubeBesovPartialNorm + rw [cubeBesovPartialSeminorm_eq_projection_error] + +theorem sum_cubeIncrement_eq_cubeProjectionGap {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (j n : ℕ) : + (fun x => Finset.sum (Finset.range n) (fun m => cubeIncrement Q (j + m + 1) u x)) = + cubeProjectionGap Q j n u := by + funext x + induction n with + | zero => + simp [cubeProjectionGap] + | succ n ih => + rw [Finset.sum_range_succ, ih] + have hinc : + cubeIncrement Q (j + n + 1) u x = + cubeProjection Q (j + n + 1) u x - cubeProjection Q (j + n) u x := by + simpa [Nat.add_assoc] using + congrArg (fun f : Vec d → ℝ => f x) + (cubeIncrement_succ (Q := Q) (n := j + n) (f := u)) + rw [hinc] + simp [cubeProjectionGap, Nat.add_assoc] + +theorem cubeLpNorm_sum_cubeIncrement_eq_cubeProjectionGap {d : ℕ} + (S Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j n : ℕ) : + cubeLpNorm S p (fun x => Finset.sum (Finset.range n) (fun m => cubeIncrement Q (j + m + 1) u x)) = + cubeLpNorm S p (cubeProjectionGap Q j n u) := by + rw [sum_cubeIncrement_eq_cubeProjectionGap] + +@[simp] theorem cubeBesovDepthAverage_depth_zero_eq_sub_cubeProjection {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : + cubeBesovDepthAverage Q p u 0 = + (cubeLpNorm Q p (fun x => u x - cubeProjection Q 0 u x)) ^ p.toReal := by + rw [cubeBesovDepthAverage_depth_zero] + rw [cubeBesovOscillation_eq_cubeLpNorm_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) (p := p) u] + simp + +@[simp] theorem cubeBesovDepthAverage_depth_zero_eq_sub_cubeIncrement {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → ℝ) : + cubeBesovDepthAverage Q p u 0 = + (cubeLpNorm Q p (fun x => u x - cubeIncrement Q 0 u x)) ^ p.toReal := by + simpa [cubeIncrement] using + cubeBesovDepthAverage_depth_zero_eq_sub_cubeProjection (Q := Q) (p := p) (u := u) + +theorem cubeIncrement_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q (j + 1)) : + cubeIncrement Q (j + 1) u =ᵐ[normalizedCubeMeasure R] + fun x => cubeAverage R u - cubeProjection Q j u x := by + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet R)).2 <| + Filter.Eventually.of_forall fun x hx => + cubeIncrement_eq_sub_cubeProjection_of_mem_descendantsAtDepth u hR hx) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + +theorem cubeLpNorm_cubeIncrement_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (p : ℝ≥0∞) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q (j + 1)) : + cubeLpNorm R p (cubeIncrement Q (j + 1) u) = + cubeLpNorm R p (fun x => cubeAverage R u - cubeProjection Q j u x) := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeIncrement_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR)] + +theorem cubeProjectionGap_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} (u : Vec d → ℝ) {j n : ℕ} + (hR : R ∈ descendantsAtDepth Q (j + n)) : + cubeProjectionGap Q j n u =ᵐ[normalizedCubeMeasure R] + (fun x => cubeAverage R u - cubeProjection Q j u x) := by + filter_upwards [cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j + n) u hR] with x hx + simp [cubeProjectionGap, hx] + +theorem cubeLpNorm_cubeProjectionGap_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} (p : ℝ≥0∞) (u : Vec d → ℝ) {j n : ℕ} + (hR : R ∈ descendantsAtDepth Q (j + n)) : + cubeLpNorm R p (cubeProjectionGap Q j n u) = + cubeLpNorm R p (fun x => cubeAverage R u - cubeProjection Q j u x) := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeProjectionGap_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (n := n) u hR)] + +theorem sum_cubeIncrement_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} (u : Vec d → ℝ) {j n : ℕ} + (hR : R ∈ descendantsAtDepth Q (j + n)) : + (fun x => Finset.sum (Finset.range n) (fun m => cubeIncrement Q (j + m + 1) u x)) =ᵐ[normalizedCubeMeasure R] + (fun x => cubeAverage R u - cubeProjection Q j u x) := by + rw [sum_cubeIncrement_eq_cubeProjectionGap (Q := Q) (u := u) (j := j) (n := n)] + exact cubeProjectionGap_ae_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (n := n) u hR + +theorem cubeLpNorm_sum_cubeIncrement_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} (p : ℝ≥0∞) (u : Vec d → ℝ) {j n : ℕ} + (hR : R ∈ descendantsAtDepth Q (j + n)) : + cubeLpNorm R p (fun x => Finset.sum (Finset.range n) (fun m => cubeIncrement Q (j + m + 1) u x)) = + cubeLpNorm R p (fun x => cubeAverage R u - cubeProjection Q j u x) := by + rw [cubeLpNorm_sum_cubeIncrement_eq_cubeProjectionGap (S := R) (Q := Q)] + rw [cubeLpNorm_cubeProjectionGap_eq_sub_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (p := p) (u := u) (j := j) (n := n) hR] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book.lean b/LeanPool/CoarseGraining/Homogenization/Book.lean new file mode 100644 index 0000000000..efddad2365 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05 +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults + +/-! # Book -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01.lean new file mode 100644 index 0000000000..25634005bb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.ClassicalInputsExact + +/-! # Ch01 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Definitions.lean new file mode 100644 index 0000000000..f04d5643d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Definitions.lean @@ -0,0 +1,604 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactCircDomination +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.FieldSpaces +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NegativeSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped BigOperators ENNReal + +/-! +# Chapter 1 public vocabulary + +This file gives Chapter 1 a note-facing entry point without redefining the +underlying analysis. The unqualified names expose the exact proof-carrying +normalized and Besov kernels. Earlier totalized and disjoint-cube conventions +are retained only in `Book.Ch01.Legacy`. +-/ + +/-- The ambient coordinate space used throughout Chapter 1. -/ +abbrev Vec (d : ℕ) := + Homogenization.Vec d + +/-- The translated triadic cubes used throughout Chapter 1. -/ +abbrev Cube (d : ℕ) := + Homogenization.TriadicCube d + +noncomputable section + +/-! ## Exact normalized cube quantities -/ + +/-- The proof-carrying normalized Bochner average on a triadic cube. -/ +noncomputable abbrev normalizedAverage {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] (Q : Cube d) (f : Vec d → E) + (hf : MeasureTheory.Integrable f + (Homogenization.cubeBoundedMeasurableDomain Q).restrictedVolume) : E := + (Homogenization.cubeBoundedMeasurableDomain Q).average f hf + +/-- The exact set-integral formula for the normalized Bochner cube average. -/ +theorem normalizedAverage_eq_volume_toReal_inv_smul_setIntegral {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] (Q : Cube d) + (f : Vec d → E) + (hf : MeasureTheory.Integrable f + (Homogenization.cubeBoundedMeasurableDomain Q).restrictedVolume) : + normalizedAverage Q f hf = + (MeasureTheory.volume (Homogenization.cubeSet Q)).toReal⁻¹ • + ∫ x in Homogenization.cubeSet Q, f x ∂MeasureTheory.volume := + Homogenization.BoundedMeasurableDomain.average_eq_volume_toReal_inv_smul_setIntegral + (Homogenization.cubeBoundedMeasurableDomain Q) f hf + +/-- For scalar functions, the proof-carrying average is the established cube average. -/ +theorem normalizedAverage_eq_cubeAverage {d : ℕ} (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f + (Homogenization.cubeBoundedMeasurableDomain Q).restrictedVolume) : + normalizedAverage Q f hf = Homogenization.cubeAverage Q f := + Homogenization.cubeBoundedMeasurableDomain_average_eq_cubeAverage Q f hf + +/-- The extended normalized cube `L^p` value. -/ +noncomputable abbrev normalizedLpENorm {d : ℕ} {E : Type*} [ENorm E] + (Q : Cube d) (p : ℝ≥0∞) (f : Vec d → E) : ℝ≥0∞ := + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedLpENorm p f + +/-- The finite normalized cube `L^p` value certified by a `MemLp` witness. -/ +noncomputable abbrev normalizedLpNorm {d : ℕ} {E : Type*} + [TopologicalSpace E] [ContinuousENorm E] (Q : Cube d) (p : ℝ≥0∞) + (f : Vec d → E) + (hf : MeasureTheory.MemLp f p + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedVolume) : ℝ := + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedLpNorm p f hf + +/-- The cube integral seminorm uses normalized cube measure, including for nonmeasurable functions. -/ +theorem normalizedLpENorm_eq_integralLpSeminorm_normalizedCubeMeasure {d : ℕ} + {E : Type*} [ENorm E] (Q : Cube d) (p : ℝ≥0∞) (f : Vec d → E) : + normalizedLpENorm Q p f = + Gagliardo.integralLpSeminorm f p (Homogenization.normalizedCubeMeasure Q) := by + unfold normalizedLpENorm Homogenization.BoundedMeasurableDomain.normalizedLpENorm + Gagliardo.integralLpSeminorm + rw [Homogenization.cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-- For measurable functions the cube extended norm agrees with Mathlib’s norm. -/ +theorem normalizedLpENorm_eq_eLpNorm_normalizedCubeMeasure {d : ℕ} + {E : Type*} [ENorm E] [TopologicalSpace E] + (Q : Cube d) (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (Homogenization.normalizedCubeMeasure Q)) : + normalizedLpENorm Q p f = + MeasureTheory.eLpNorm f p (Homogenization.normalizedCubeMeasure Q) := by + rw [normalizedLpENorm_eq_integralLpSeminorm_normalizedCubeMeasure, + Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hf] + +/-- For finite `p ≥ 1`, the exact normalized cube norm has the manuscript moment formula. -/ +theorem normalizedLpNorm_eq_integral_rpow {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : Cube d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) + (hp_top : p ≠ ∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedVolume) : + normalizedLpNorm Q p f hf = + (∫ x, ‖f x‖ ^ p.toReal ∂Homogenization.normalizedCubeMeasure Q) ^ p.toReal⁻¹ := by + change (Homogenization.cubeBoundedMeasurableDomain Q).normalizedLpNorm p f hf = _ + rw [Homogenization.BoundedMeasurableDomain.normalizedLpNorm_eq_normalizedLpMoment_rpow + (Homogenization.cubeBoundedMeasurableDomain Q) p hp_one hp_top f hf] + simp only [Homogenization.BoundedMeasurableDomain.normalizedLpMoment, + Homogenization.cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-- At `p = ∞`, the exact normalized cube value is the essential supremum. -/ +theorem normalizedLpENorm_top_eq_essSup {d : ℕ} {E : Type*} [ENorm E] + (Q : Cube d) (f : Vec d → E) : + normalizedLpENorm Q ∞ f = + essSup (fun x => ‖f x‖ₑ) (Homogenization.normalizedCubeMeasure Q) := by + change (Homogenization.cubeBoundedMeasurableDomain Q).normalizedLpENorm ∞ f = _ + rw [Homogenization.BoundedMeasurableDomain.normalizedLpENorm_top_eq_essSup + (Homogenization.cubeBoundedMeasurableDomain Q) f, + Homogenization.cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-- The extended normalized Euclidean `L^p` value of a vector field. -/ +noncomputable abbrev normalizedEuclideanLpENorm {d n : ℕ} (Q : Cube d) + (p : ℝ≥0∞) (f : Vec d → Vec n) : ℝ≥0∞ := + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p f + +/-- The finite normalized Euclidean `L^p` value certified by a `MemLp` witness. -/ +noncomputable abbrev normalizedEuclideanLpNorm {d n : ℕ} (Q : Cube d) + (p : ℝ≥0∞) (f : Vec d → Vec n) + (hf : MeasureTheory.MemLp (fun x => Homogenization.euclideanNorm (f x)) p + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedVolume) : ℝ := + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedEuclideanLpNorm p f hf + +/-- For finite `p ≥ 1`, the vector lane uses explicit Euclidean magnitude. -/ +theorem normalizedEuclideanLpNorm_eq_integral_rpow {d n : ℕ} (Q : Cube d) + (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) (f : Vec d → Vec n) + (hf : MeasureTheory.MemLp (fun x => Homogenization.euclideanNorm (f x)) p + (Homogenization.cubeBoundedMeasurableDomain Q).normalizedVolume) : + normalizedEuclideanLpNorm Q p f hf = + (∫ x, Homogenization.euclideanNorm (f x) ^ p.toReal + ∂Homogenization.normalizedCubeMeasure Q) ^ p.toReal⁻¹ := by + change Homogenization.BoundedMeasurableDomain.normalizedEuclideanLpNorm + (Homogenization.cubeBoundedMeasurableDomain Q) p f hf = _ + rw [Homogenization.BoundedMeasurableDomain.normalizedEuclideanLpNorm_eq_integral_rpow + (Homogenization.cubeBoundedMeasurableDomain Q) p hp_one hp_top f hf, + Homogenization.cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-- At `p = ∞`, the vector lane is the essential supremum of Euclidean magnitude. -/ +theorem normalizedEuclideanLpENorm_top_eq_essSup {d n : ℕ} (Q : Cube d) + (f : Vec d → Vec n) : + normalizedEuclideanLpENorm Q ∞ f = + essSup (fun x => ENNReal.ofReal (Homogenization.euclideanNorm (f x))) + (Homogenization.normalizedCubeMeasure Q) := by + change Homogenization.BoundedMeasurableDomain.normalizedEuclideanLpENorm + (Homogenization.cubeBoundedMeasurableDomain Q) ∞ f = _ + rw [Homogenization.BoundedMeasurableDomain.normalizedEuclideanLpENorm_top_eq_essSup + (Homogenization.cubeBoundedMeasurableDomain Q) f, + Homogenization.cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-! ## Normalized Sobolev quantities -/ + +/-- Legacy cube `W^{1,p}` seminorm with an arbitrary gradient representative. +This is a cube-specialized compatibility alias, not the Chapter 1 weak-Sobolev +carrier. -/ +noncomputable abbrev legacyCubeW1pSeminorm {d : ℕ} (Q : Cube d) + (p : ℝ≥0∞) (Du : Vec d → Vec d) : ℝ := + Homogenization.cubeW1pSeminorm Q p Du + +/-- Legacy cube `W^{1,p}` norm with an arbitrary gradient representative. +This is a cube-specialized compatibility alias, not the Chapter 1 weak-Sobolev +carrier. -/ +noncomputable abbrev legacyCubeW1pNorm {d : ℕ} (Q : Cube d) + (p : ℝ≥0∞) (u : Vec d → ℝ) (Du : Vec d → Vec d) : ℝ := + Homogenization.cubeW1pNorm Q p u Du + +/-- The Chapter 1 finite-exponent normalized `W^{1,p}` seminorm on a genuine +weak-Sobolev witness over a nonempty bounded open convex domain. -/ +noncomputable abbrev normalizedW1pSeminorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) (u : W1pFunction U p) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + (hU.toBoundedMeasurableDomain hne) p hp_one hp_top u + +/-- The Chapter 1 finite-exponent normalized `W^{1,p}` norm on a genuine +weak-Sobolev witness over a nonempty bounded open convex domain. -/ +noncomputable abbrev normalizedW1pNorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) (u : W1pFunction U p) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.norm + (hU.toBoundedMeasurableDomain hne) p hp_one hp_top u + +/-- The Chapter 1 normalized `W^{1,∞}` seminorm on a genuine weak-Sobolev +witness over a nonempty bounded open convex domain. -/ +noncomputable abbrev normalizedW1pSeminormTop {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (u : W1pFunction U ∞) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.seminormTop + (hU.toBoundedMeasurableDomain hne) u + +/-- The Chapter 1 normalized `W^{1,∞}` norm on a genuine weak-Sobolev witness, +over a nonempty bounded open convex domain, using the manuscript's additive +endpoint formula. -/ +noncomputable abbrev normalizedW1pNormTop {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (u : W1pFunction U ∞) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.normTop + (hU.toBoundedMeasurableDomain hne) u + +/-! ## Exact negative Sobolev quantities -/ + +/-- The normalized zero-boundary `W^{-1,p'}` seminorm on `U`, with `p` the +positive test exponent. Its test class is literal smooth compact support. -/ +noncomputable abbrev normalizedZeroBoundaryWMinusOneSeminorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) + (hU.toBoundedMeasurableDomain hne).normalizedVolume) : ℝ≥0∞ := + NegativeSobolev.smoothNegativeSobolevSeminorm hU hne p hp_one hp_top f hf + +/-- The normalized mean-zero `W^{-1,p'}` seminorm on `U`, with `p` the +positive test exponent. Its test class consists of genuine mean-zero weak +`W^{1,p}` witnesses. -/ +noncomputable abbrev normalizedMeanZeroWMinusOneSeminorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) + (hU.toBoundedMeasurableDomain hne).normalizedVolume) : ℝ≥0∞ := + NegativeSobolev.meanZeroNegativeSobolevSeminorm hU hne p hp_one hp_top f hf + +/-- The zero-boundary normalized `H^{-1}` seminorm on `U`; this is the +`p = 2` instance with smooth compactly supported tests. -/ +noncomputable abbrev normalizedZeroBoundaryHMinusOneSeminorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent (2 : ENNReal)) + (hU.toBoundedMeasurableDomain hne).normalizedVolume) : ℝ≥0∞ := + NegativeSobolev.smoothNegativeHMinusOneSeminorm hU hne f hf + +/-- The mean-zero normalized `H^{-1}` seminorm on `U`; this is the distinct +`p = 2` convention with genuine mean-zero weak `W^{1,2}` tests. -/ +noncomputable abbrev normalizedMeanZeroHMinusOneSeminorm {d : ℕ} [NeZero d] + (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent (2 : ENNReal)) + (hU.toBoundedMeasurableDomain hne).normalizedVolume) : ℝ≥0∞ := + NegativeSobolev.meanZeroNegativeHMinusOneSeminorm hU hne f hf + +/-! ## Exact positive overlap Besov quantities -/ + +/-- Finite-`q` source parameters for the exact positive overlap Besov lane. -/ +abbrev PositiveBesovFiniteParameters := + Homogenization.ExactOverlapFiniteParameters + +/-- `q = ∞` source parameters for the exact positive overlap Besov lane. -/ +abbrev PositiveBesovTopParameters := + Homogenization.ExactOverlapTopParameters + +/-- Integrability witnesses for all averages in the exact positive Besov lane. -/ +abbrev PositiveBesovIntegrable {d : ℕ} (Q : Cube d) (u : Vec d → ℝ) := + Homogenization.ExactOverlapIntegrable Q u + +/-- The exact finite-`q` positive overlap Besov seminorm. -/ +noncomputable abbrev positiveBesovFiniteSeminorm {d : ℕ} + (P : PositiveBesovFiniteParameters) (Q : Cube d) (u : Vec d → ℝ) + (hu : PositiveBesovIntegrable Q u) : ℝ≥0∞ := + Homogenization.exactOverlapFiniteSeminorm P Q u hu + +/-- The exact finite-`q` positive overlap Besov norm. -/ +noncomputable abbrev positiveBesovFiniteNorm {d : ℕ} + (P : PositiveBesovFiniteParameters) (Q : Cube d) (u : Vec d → ℝ) + (hu : PositiveBesovIntegrable Q u) : ℝ≥0∞ := + Homogenization.exactOverlapFiniteNorm P Q u hu + +/-- The exact `q = ∞` positive overlap Besov seminorm. -/ +noncomputable abbrev positiveBesovTopSeminorm {d : ℕ} + (P : PositiveBesovTopParameters) (Q : Cube d) (u : Vec d → ℝ) + (hu : PositiveBesovIntegrable Q u) : ℝ≥0∞ := + Homogenization.exactOverlapTopSeminorm P Q u hu + +/-- The exact `q = ∞` positive overlap Besov norm. -/ +noncomputable abbrev positiveBesovTopNorm {d : ℕ} + (P : PositiveBesovTopParameters) (Q : Cube d) (u : Vec d → ℝ) + (hu : PositiveBesovIntegrable Q u) : ℝ≥0∞ := + Homogenization.exactOverlapTopNorm P Q u hu + +/-- Formula for the exact finite-`q` positive overlap Besov seminorm. -/ +theorem positiveBesovFiniteSeminorm_eq {d : ℕ} (P : PositiveBesovFiniteParameters) + (Q : Cube d) (u : Vec d → ℝ) (hu : PositiveBesovIntegrable Q u) : + positiveBesovFiniteSeminorm P Q u hu = + (∑' j : ℕ, (Homogenization.exactOverlapDepthTerm Q P.s P.p u hu j) ^ P.q) ^ + P.q⁻¹ := + Homogenization.exactOverlapFiniteSeminorm_eq P Q u hu + +/-- Formula for the exact finite-`q` positive overlap Besov norm. -/ +theorem positiveBesovFiniteNorm_eq {d : ℕ} (P : PositiveBesovFiniteParameters) + (Q : Cube d) (u : Vec d → ℝ) (hu : PositiveBesovIntegrable Q u) : + positiveBesovFiniteNorm P Q u hu = positiveBesovFiniteSeminorm P Q u hu + + Homogenization.exactOverlapRootWeight Q P.s * + ENNReal.ofReal |Homogenization.exactOverlapRootMean Q u hu.root| := + Homogenization.exactOverlapFiniteNorm_eq P Q u hu + +/-- Formula for the exact `q = ∞` positive overlap Besov seminorm. -/ +theorem positiveBesovTopSeminorm_eq {d : ℕ} (P : PositiveBesovTopParameters) + (Q : Cube d) (u : Vec d → ℝ) (hu : PositiveBesovIntegrable Q u) : + positiveBesovTopSeminorm P Q u hu = + ⨆ j : ℕ, Homogenization.exactOverlapDepthTerm Q P.s P.p u hu j := + Homogenization.exactOverlapTopSeminorm_eq P Q u hu + +/-- Formula for the exact `q = ∞` positive overlap Besov norm. -/ +theorem positiveBesovTopNorm_eq {d : ℕ} (P : PositiveBesovTopParameters) + (Q : Cube d) (u : Vec d → ℝ) (hu : PositiveBesovIntegrable Q u) : + positiveBesovTopNorm P Q u hu = positiveBesovTopSeminorm P Q u hu + + Homogenization.exactOverlapRootWeight Q P.s * + ENNReal.ofReal |Homogenization.exactOverlapRootMean Q u hu.root| := + Homogenization.exactOverlapTopNorm_eq P Q u hu + +/-! ## Exact dual negative Besov quantities -/ + +/-- Parameters for the exact negative `q = 1` dual Besov lane. -/ +abbrev DualNegativeBesovQOneParameters := + Homogenization.ExactDualQOneParameters + +/-- Parameters for the exact negative finite-interior dual Besov lane. -/ +abbrev DualNegativeBesovFiniteParameters := + Homogenization.ExactDualFiniteParameters + +/-- Parameters for the exact negative `q = ∞` dual Besov lane. -/ +abbrev DualNegativeBesovTopParameters := + Homogenization.ExactDualTopParameters + +/-- Full test carrier for the exact negative `q = 1` dual Besov norm. -/ +abbrev DualNegativeBesovQOneFullTest {d : ℕ} (P : DualNegativeBesovQOneParameters) + (Q : Cube d) := + Homogenization.ExactDualQOneFullTest P Q + +/-- Hatted test carrier for the exact negative `q = 1` dual Besov seminorm. -/ +abbrev DualNegativeBesovQOneHattedTest {d : ℕ} (P : DualNegativeBesovQOneParameters) + (Q : Cube d) := + Homogenization.ExactDualQOneHattedTest P Q + +/-- Full test carrier for the exact negative finite-interior dual Besov norm. -/ +abbrev DualNegativeBesovFiniteFullTest {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) := + Homogenization.ExactDualFiniteFullTest P Q + +/-- Hatted test carrier for the exact negative finite-interior dual Besov seminorm. -/ +abbrev DualNegativeBesovFiniteHattedTest {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) := + Homogenization.ExactDualFiniteHattedTest P Q + +/-- Full test carrier for the exact negative `q = ∞` dual Besov norm. -/ +abbrev DualNegativeBesovTopFullTest {d : ℕ} (P : DualNegativeBesovTopParameters) + (Q : Cube d) := + Homogenization.ExactDualTopFullTest P Q + +/-- Hatted test carrier for the exact negative `q = ∞` dual Besov seminorm. -/ +abbrev DualNegativeBesovTopHattedTest {d : ℕ} (P : DualNegativeBesovTopParameters) + (Q : Cube d) := + Homogenization.ExactDualTopHattedTest P Q + +/-- The exact negative `q = 1` hatted dual Besov seminorm. -/ +noncomputable abbrev dualNegativeBesovQOneHattedSeminorm {d : ℕ} + (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualQOneHattedSeminorm P Q f hf + +/-- The exact negative `q = 1` full dual Besov norm. -/ +noncomputable abbrev dualNegativeBesovQOneFullNorm {d : ℕ} + (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualQOneFullNorm P Q f hf + +/-- The exact negative finite-interior hatted dual Besov seminorm. -/ +noncomputable abbrev dualNegativeBesovFiniteHattedSeminorm {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualFiniteHattedSeminorm P Q f hf + +/-- The exact negative finite-interior full dual Besov norm. -/ +noncomputable abbrev dualNegativeBesovFiniteFullNorm {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualFiniteFullNorm P Q f hf + +/-- The exact negative `q = ∞` hatted dual Besov seminorm. -/ +noncomputable abbrev dualNegativeBesovTopHattedSeminorm {d : ℕ} + (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualTopHattedSeminorm P Q f hf + +/-- The exact negative `q = ∞` full dual Besov norm. -/ +noncomputable abbrev dualNegativeBesovTopFullNorm {d : ℕ} + (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : ℝ≥0∞ := + Homogenization.exactDualTopFullNorm P Q f hf + +/-- Formula for the exact negative `q = 1` hatted dual Besov seminorm. -/ +theorem dualNegativeBesovQOneHattedSeminorm_eq {d : ℕ} + (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovQOneHattedSeminorm P Q f hf = + ⨆ T : DualNegativeBesovQOneHattedTest P Q, T.pairing hf := + Homogenization.exactDualQOneHattedSeminorm_eq P Q f hf + +/-- Formula for the exact negative `q = 1` full dual Besov norm. -/ +theorem dualNegativeBesovQOneFullNorm_eq {d : ℕ} + (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovQOneFullNorm P Q f hf = + ⨆ T : DualNegativeBesovQOneFullTest P Q, T.pairing hf := + Homogenization.exactDualQOneFullNorm_eq P Q f hf + +/-- Formula for the exact negative finite-interior hatted dual Besov seminorm. -/ +theorem dualNegativeBesovFiniteHattedSeminorm_eq {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovFiniteHattedSeminorm P Q f hf = + ⨆ T : DualNegativeBesovFiniteHattedTest P Q, T.pairing hf := + Homogenization.exactDualFiniteHattedSeminorm_eq P Q f hf + +/-- Formula for the exact negative finite-interior full dual Besov norm. -/ +theorem dualNegativeBesovFiniteFullNorm_eq {d : ℕ} + (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovFiniteFullNorm P Q f hf = + ⨆ T : DualNegativeBesovFiniteFullTest P Q, T.pairing hf := + Homogenization.exactDualFiniteFullNorm_eq P Q f hf + +/-- Formula for the exact negative `q = ∞` hatted dual Besov seminorm. -/ +theorem dualNegativeBesovTopHattedSeminorm_eq {d : ℕ} + (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovTopHattedSeminorm P Q f hf = + ⨆ T : DualNegativeBesovTopHattedTest P Q, T.pairing hf := + Homogenization.exactDualTopHattedSeminorm_eq P Q f hf + +/-- Formula for the exact negative `q = ∞` full dual Besov norm. -/ +theorem dualNegativeBesovTopFullNorm_eq {d : ℕ} + (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (Homogenization.normalizedCubeMeasure Q)) : + dualNegativeBesovTopFullNorm P Q f hf = + ⨆ T : DualNegativeBesovTopFullTest P Q, T.pairing hf := + Homogenization.exactDualTopFullNorm_eq P Q f hf + +/-! ## Exact concrete circ negative Besov quantities -/ + +/-- Parameters for the exact finite-`q` concrete circ Besov seminorm. -/ +abbrev CircNegativeBesovFiniteParameters := + Homogenization.ExactCircFiniteParameters + +/-- Parameters for the exact `q = ∞` concrete circ Besov seminorm. -/ +abbrev CircNegativeBesovTopParameters := + Homogenization.ExactCircTopParameters + +/-- Integrability witnesses for all disjoint block means in the exact circ lane. -/ +abbrev CircNegativeBesovIntegrable {d : ℕ} (Q : Cube d) (f : Vec d → ℝ) := + Homogenization.ExactCircIntegrable Q f + +/-- The exact finite-`q` concrete circ negative Besov seminorm. -/ +noncomputable abbrev circNegativeBesovFiniteSeminorm {d : ℕ} + (P : CircNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : CircNegativeBesovIntegrable Q f) : ℝ≥0∞ := + Homogenization.exactCircFiniteSeminorm P Q f hf + +/-- The exact `q = ∞` concrete circ negative Besov seminorm. -/ +noncomputable abbrev circNegativeBesovTopSeminorm {d : ℕ} + (P : CircNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : CircNegativeBesovIntegrable Q f) : ℝ≥0∞ := + Homogenization.exactCircTopSeminorm P Q f hf + +/-- Formula for the exact finite-`q` concrete circ negative Besov seminorm. -/ +theorem circNegativeBesovFiniteSeminorm_eq {d : ℕ} + (P : CircNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : CircNegativeBesovIntegrable Q f) : + circNegativeBesovFiniteSeminorm P Q f hf = + (∑' j : ℕ, (Homogenization.exactCircDepthTerm Q P.s P.p f hf j) ^ P.q) ^ + P.q⁻¹ := + Homogenization.exactCircFiniteSeminorm_eq P Q f hf + +/-- Formula for the exact `q = ∞` concrete circ negative Besov seminorm. -/ +theorem circNegativeBesovTopSeminorm_eq {d : ℕ} + (P : CircNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : CircNegativeBesovIntegrable Q f) : + circNegativeBesovTopSeminorm P Q f hf = + ⨆ j : ℕ, Homogenization.exactCircDepthTerm Q P.s P.p f hf j := + Homogenization.exactCircTopSeminorm_eq P Q f hf + +/-! ## Legacy totalized and disjoint-cube compatibility vocabulary -/ + +namespace Legacy + +/-- Legacy totalized cube average. This is not the proof-carrying Chapter 1 average. -/ +noncomputable abbrev normalizedAverage {d : ℕ} (Q : Cube d) + (u : Vec d → ℝ) : ℝ := + Homogenization.cubeAverage Q u + +/-- Legacy totalized cube `L^p` norm. This is not the exact Chapter 1 norm. -/ +noncomputable abbrev normalizedLpNorm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : Cube d) (p : ℝ≥0∞) (u : Vec d → E) : ℝ := + Homogenization.cubeLpNorm Q p u + +/-- Legacy finite-depth positive Besov norm using disjoint descendants. -/ +noncomputable abbrev positiveBesovPartialNorm {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDisjointPartialNorm Q s p q N u + +/-- Legacy finite-depth positive `q = ∞` Besov norm using disjoint descendants. -/ +noncomputable abbrev positiveBesovPartialNormTop {d : ℕ} (Q : Cube d) + (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDisjointPartialNormTop Q s p N u + +/-- Legacy finite-depth positive `q = 2` Besov seminorm using disjoint descendants. -/ +noncomputable abbrev positiveBesovPartialSeminormTwo {d : ℕ} (Q : Cube d) + (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDisjointPartialSeminorm Q s + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u + +/-- Legacy totalized infinite-depth positive `q = 2` Besov seminorm. -/ +noncomputable abbrev positiveBesovSeminormTwo {d : ℕ} (Q : Cube d) + (s : ℝ) (u : Vec d → ℝ) : ℝ := + sSup (Set.range fun N : ℕ => + Homogenization.cubeBesovDisjointPartialSeminorm Q s + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) + +/-- Legacy finite-depth positive `q = 2` Besov norm using disjoint descendants. -/ +noncomputable abbrev positiveBesovPartialNormTwo {d : ℕ} (Q : Cube d) + (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDisjointPartialNorm Q s + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u + +/-- Legacy totalized infinite-depth positive `q = 2` Besov norm. -/ +noncomputable abbrev positiveBesovNormTwo {d : ℕ} (Q : Cube d) + (s : ℝ) (u : Vec d → ℝ) : ℝ := + sSup (Set.range fun N : ℕ => + Homogenization.cubeBesovDisjointPartialNorm Q s + (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) u) + +/-- Legacy dimension-shaped localization constant for the disjoint positive lane. -/ +noncomputable abbrev positiveBesovLocalizeConstant (_d : ℕ) : ℝ := 2 + +/-- Legacy dimension-shaped localization constant for the totalized negative lane. -/ +noncomputable abbrev negativeBesovLocalizeConstant (_d : ℕ) : ℝ := 2 + +/-- Legacy totalized infinite-depth positive `q = ∞` Besov norm. -/ +noncomputable abbrev positiveBesovNormTop {d : ℕ} (Q : Cube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + sSup (Set.range fun N : ℕ => + Homogenization.cubeBesovDisjointPartialNormTop Q s p (N + 1) u) + +/-- Legacy componentwise vector-valued positive `q = ∞` Besov norm. +The manuscript does not select this componentwise convention. -/ +noncomputable abbrev positiveBesovVectorNormTop {d : ℕ} (Q : Cube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → Vec d) : ℝ := + ∑ i : Fin d, positiveBesovNormTop Q s p (fun x => u x i) + +/-- Legacy totalized concrete circ negative Besov norm. -/ +noncomputable abbrev circNegativeBesovNorm {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovCircNorm Q s p q u + +/-- Legacy finite-depth totalized concrete circ negative Besov norm. -/ +noncomputable abbrev circNegativeBesovPartialNorm {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (N : ℕ) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovCircPartialNorm Q s p q N u + +/-- Legacy totalized mean-zero dual negative Besov seminorm. -/ +noncomputable abbrev dualNegativeBesovSeminorm {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDualMeanZeroSeminorm Q s p q u + +/-- Legacy totalized full dual negative Besov norm. -/ +noncomputable abbrev dualNegativeBesovNorm {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + Homogenization.cubeBesovDualFullNorm Q s p q u + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/FieldSpaces.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/FieldSpaces.lean new file mode 100644 index 0000000000..77317adb57 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/FieldSpaces.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalExact +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.LocalizedZeroTrace + +/-! # Field Spaces -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +/-! +# Chapter 1 public field-space predicates + +This module exposes the literal Hilbert-space potential/solenoidal quartet on +nonempty bounded open convex domains, together with representative-level +predicates retained for statements formulated for concrete functions. +-/ + +/-- The literal range of `H¹(U)` gradients in `HilbertVectorL2 U`. + +The domain hypotheses are part of the Chapter 1 facade; the underlying exact +submodule construction itself is available on an arbitrary carrier. -/ +noncomputable abbrev PotentialHilbertL2 {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + Submodule ℝ (HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.potential U + +/-- The literal range of `H¹₀(U)` gradients in `HilbertVectorL2 U`. -/ +noncomputable abbrev PotentialZeroTraceHilbertL2 {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + Submodule ℝ (HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.potentialZeroTrace U + +/-- The exact solenoidal submodule, orthogonal to `PotentialZeroTraceHilbertL2`. -/ +noncomputable abbrev SolenoidalHilbertL2 {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + Submodule ℝ (HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.solenoidal U + +/-- The exact zero-normal-trace solenoidal submodule, orthogonal to +`PotentialHilbertL2`. -/ +noncomputable abbrev SolenoidalZeroNormalTraceHilbertL2 {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + Submodule ℝ (HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.solenoidalZeroNormalTrace U + +/-- The exact doubled submodule +`PotentialHilbertL2 U hU hne × SolenoidalHilbertL2 U hU hne`. -/ +noncomputable abbrev PotentialSolenoidalHilbertL2 {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + Submodule ℝ (HilbertVectorL2 U × HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.blockPotentialSolenoidal U + +/-- The exact doubled submodule +`PotentialZeroTraceHilbertL2 U hU hne × SolenoidalZeroNormalTraceHilbertL2 U hU hne`. -/ +noncomputable abbrev PotentialZeroTraceSolenoidalZeroNormalTraceHilbertL2 + {d : ℕ} (U : Set (Vec d)) (hU : IsOpenBoundedConvexDomain U) + (hne : U.Nonempty) : Submodule ℝ (HilbertVectorL2 U × HilbertVectorL2 U) := + let _ := hU + let _ := hne + PotentialSolenoidalExact.blockPotentialZeroTraceSolenoidalZeroNormalTrace U + +theorem mem_potentialHilbertL2_iff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) (g : HilbertVectorL2 U) : + g ∈ PotentialHilbertL2 U hU hne ↔ + ∃ u : H1Function U, u.gradToHilbertVectorL2 = g := + PotentialSolenoidalExact.mem_potential_iff g + +theorem mem_potentialZeroTraceHilbertL2_iff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) (g : HilbertVectorL2 U) : + g ∈ PotentialZeroTraceHilbertL2 U hU hne ↔ + ∃ u : H10Function U, u.toH1Function.gradToHilbertVectorL2 = g := + PotentialSolenoidalExact.mem_potentialZeroTrace_iff g + +theorem mem_solenoidalHilbertL2_iff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) (g : HilbertVectorL2 U) : + g ∈ SolenoidalHilbertL2 U hU hne ↔ + ∀ u : H10Function U, inner ℝ g u.toH1Function.gradToHilbertVectorL2 = 0 := + PotentialSolenoidalExact.mem_solenoidal_iff g + +theorem mem_solenoidalZeroNormalTraceHilbertL2_iff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) (g : HilbertVectorL2 U) : + g ∈ SolenoidalZeroNormalTraceHilbertL2 U hU hne ↔ + ∀ u : H1Function U, inner ℝ g u.gradToHilbertVectorL2 = 0 := + PotentialSolenoidalExact.mem_solenoidalZeroNormalTrace_iff g + +theorem potentialZeroTraceHilbertL2_le_potentialHilbertL2 {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + PotentialZeroTraceHilbertL2 U hU hne ≤ PotentialHilbertL2 U hU hne := + PotentialSolenoidalExact.potentialZeroTrace_le_potential + +theorem solenoidalZeroNormalTraceHilbertL2_le_solenoidalHilbertL2 {d : ℕ} + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + SolenoidalZeroNormalTraceHilbertL2 U hU hne ≤ SolenoidalHilbertL2 U hU hne := + PotentialSolenoidalExact.solenoidalZeroNormalTrace_le_solenoidal + +theorem mem_potentialSolenoidalHilbertL2_iff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (g : HilbertVectorL2 U × HilbertVectorL2 U) : + g ∈ PotentialSolenoidalHilbertL2 U hU hne ↔ + g.1 ∈ PotentialHilbertL2 U hU hne ∧ g.2 ∈ SolenoidalHilbertL2 U hU hne := + PotentialSolenoidalExact.mem_blockPotentialSolenoidal_iff g + +theorem mem_potentialZeroTraceSolenoidalZeroNormalTraceHilbertL2_iff {d : ℕ} + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (g : HilbertVectorL2 U × HilbertVectorL2 U) : + g ∈ PotentialZeroTraceSolenoidalZeroNormalTraceHilbertL2 U hU hne ↔ + g.1 ∈ PotentialZeroTraceHilbertL2 U hU hne ∧ + g.2 ∈ SolenoidalZeroNormalTraceHilbertL2 U hU hne := + PotentialSolenoidalExact.mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_iff g + +/-- A field in the manuscript space `L_sol,0(U)` has zero restricted-volume +integral. -/ +theorem integral_eq_zero_of_mem_solenoidalZeroNormalTraceHilbertL2 {d : ℕ} [NeZero d] + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (g : HilbertVectorL2 U) (hg : g ∈ SolenoidalZeroNormalTraceHilbertL2 U hU hne) : + ∫ x, g x ∂volumeMeasureOn U = 0 := + PotentialSolenoidalExact.integral_eq_zero_of_mem_solenoidalZeroNormalTrace hU g hg + +/-- The normalized-domain average of a field in the manuscript space +`L_sol,0(U)` vanishes. -/ +theorem normalizedAverage_eq_zero_of_mem_solenoidalZeroNormalTraceHilbertL2 + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (hne : U.Nonempty) (g : HilbertVectorL2 U) + (hg : g ∈ SolenoidalZeroNormalTraceHilbertL2 U hU hne) : + (hU.toBoundedMeasurableDomain hne).average g (by + change MeasureTheory.Integrable g (volumeMeasureOn U) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + exact (MeasureTheory.Lp.memLp g).integrable (by norm_num : (1 : ENNReal) ≤ 2)) = 0 := + PotentialSolenoidalExact.average_eq_zero_of_mem_solenoidalZeroNormalTrace hU hne g hg + +/-- Representative-level `L²` potential predicate on `U`, stated up to a.e. +equality. The literal Hilbert-space submodule is `PotentialHilbertL2`. -/ +def PotentialFieldOn {d : ℕ} (U : Set (Vec d)) (f : Vec d → Vec d) : Prop := + MemVectorL2 U f ∧ ∃ u : H1Function U, f =ᵐ[volumeMeasureOn U] u.grad + +/-- Representative-level zero-trace `L²` potential predicate on `U`, stated up +to a.e. equality. The literal Hilbert-space submodule is +`PotentialZeroTraceHilbertL2`. -/ +def PotentialZeroTraceFieldOn {d : ℕ} (U : Set (Vec d)) + (f : Vec d → Vec d) : Prop := + MemVectorL2 U f ∧ + ∃ u : H10Function U, f =ᵐ[volumeMeasureOn U] u.toH1Function.grad + +/-- Public localized scalar zero-trace condition. + +This is the a.e./Sobolev replacement for saying that a scalar function vanishes +on the part of `∂Ω` seen through the localization window `V`: every smooth +compactly supported cutoff localized in `V` turns the function into an +admissible `H¹₀(Ω)` test function. -/ +abbrev LocalizedZeroTraceFunctionOn {d : ℕ} (Ω V : Set (Vec d)) + (u : Vec d → ℝ) : Prop := + Homogenization.LocalizedZeroTraceFunctionOn Ω V u + +/-- Representative-level `L²` solenoidal predicate on `U`. The integral +formulation is a.e.-insensitive once the `L²` representative is fixed; the +literal Hilbert-space submodule is `SolenoidalHilbertL2`. -/ +def SolenoidalFieldOn {d : ℕ} (U : Set (Vec d)) (g : Vec d → Vec d) : Prop := + MemVectorL2 U g ∧ + ∀ φ : H10Function U, + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = 0 + +/-- Representative-level `L²` solenoidal predicate with zero normal trace on +`U`. The literal Hilbert-space submodule is +`SolenoidalZeroNormalTraceHilbertL2`. -/ +def SolenoidalZeroNormalTraceFieldOn {d : ℕ} (U : Set (Vec d)) + (g : Vec d → Vec d) : Prop := + MemVectorL2 U g ∧ + ∀ φ : H1Function U, + ∫ x in U, vecDot (g x) (φ.grad x) ∂MeasureTheory.volume = 0 + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems.lean new file mode 100644 index 0000000000..7703a620ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.BesovPairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CircDomination +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeNeumannCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.ClassicalInputsExact +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.FiniteLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.ProjectionTests +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.GradientToFunction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeConverse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.HodgeProjectionL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovSeminormLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NegativeBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NormScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.Poincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.RadiusIteration + +/-! # Theorems -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/BesovPairing.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/BesovPairing.lean new file mode 100644 index 0000000000..f573bf244f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/BesovPairing.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CircDomination +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge + +/-! +# Legacy Chapter 1 Besov pairing helpers + +This module contains only restricted `p = 2` totalized-real, disjoint-cube +compatibility helpers. They are not exact source pairing theorems and are +available only in `Book.Ch01.Legacy`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped ENNReal + +noncomputable section + +namespace Legacy + +/-- Restricted `p = 2`, `q = 1` totalized-real, disjoint-cube compatibility +pairing helper; it is not an exact source pairing theorem. -/ +theorem cubeBesovPairing_two_one_le_circNorm_mul_testBound {d : ℕ} + (Q : Cube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + circNegativeBesovNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u) * B := + Homogenization.abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + Q s u g hs hu hB hnorm hmem + +/-- Restricted `p = 2`, `q = 1` totalized-real, disjoint-cube full-dual +compatibility helper; it is not an exact source pairing theorem. -/ +theorem cubeBesovPairing_two_one_le_fullDualNoteRhs_mul_testBound {d : ℕ} + (Q : Cube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + circNegativeBesovNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖normalizedAverage Q u‖) * B := + Homogenization.abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_one_of_nonneg + Q s u g hs hu hB hnorm hmem + +/-- Restricted `p = 2`, `q = 2` totalized-real, disjoint-cube full-dual +compatibility helper; it is not an exact source pairing theorem. -/ +theorem cubeBesovPairing_two_two_le_fullDualNoteRhs_mul_testBound {d : ℕ} + (Q : Cube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + circNegativeBesovNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖normalizedAverage Q u‖) * B := + Homogenization.abs_cubeBesovPairing_le_note_rhs_mul_of_uniform_bound_two_two_of_nonneg + Q s u g hs hu hB hnorm hmem + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CircDomination.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CircDomination.lean new file mode 100644 index 0000000000..e3ce5ec03d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CircDomination.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison + +/-! +# Chapter 1 circ domination + +The Chapter 1 public facade consists of the six exact source-regime bounds +below. The former totalized-real, disjoint-cube comparisons remain available +only as compatibility results in `Book.Ch01.Legacy`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped ENNReal + +noncomputable section + +/-- In the exact negative `q = 1` regime, the hatted dual seminorm is bounded +by the exact finite-`q` circ seminorm. All proof obligations are internal. -/ +theorem dualNegativeBesovQOneHattedSeminorm_le_circNegativeBesovFiniteSeminorm + {d : ℕ} (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovQOneHattedSeminorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovFiniteSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := + Homogenization.exactDualQOneHattedSeminorm_le_exactCircFiniteSeminorm P Q f hf + +/-- In the exact negative `q = 1` regime, the full dual norm is bounded by the +exact finite-`q` circ seminorm plus the literal root term. All proof obligations +are internal. -/ +theorem dualNegativeBesovQOneFullNorm_le_circNegativeBesovFiniteSeminorm_add_root + {d : ℕ} (P : DualNegativeBesovQOneParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovQOneFullNorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovFiniteSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + Homogenization.exactCircDepthWeight Q P.s 0 * + ENNReal.ofReal |Homogenization.cubeAverage Q f| := + Homogenization.exactDualQOneFullNorm_le_exactCircFiniteSeminorm_add_root P Q f hf + +/-- In the exact finite-interior negative Besov (`1 < q < ∞`) regime, the +hatted dual seminorm is bounded by the exact finite-`q` circ seminorm. All +proof obligations are internal. -/ +theorem dualNegativeBesovFiniteHattedSeminorm_le_circNegativeBesovFiniteSeminorm + {d : ℕ} (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovFiniteHattedSeminorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovFiniteSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := + Homogenization.exactDualFiniteHattedSeminorm_le_exactCircFiniteSeminorm P Q f hf + +/-- In the exact finite-interior negative Besov (`1 < q < ∞`) regime, the full +dual norm is bounded by the exact finite-`q` circ seminorm plus the literal +root term. All proof obligations are internal. -/ +theorem dualNegativeBesovFiniteFullNorm_le_circNegativeBesovFiniteSeminorm_add_root + {d : ℕ} (P : DualNegativeBesovFiniteParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovFiniteFullNorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovFiniteSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + Homogenization.exactCircDepthWeight Q P.s 0 * + ENNReal.ofReal |Homogenization.cubeAverage Q f| := + Homogenization.exactDualFiniteFullNorm_le_exactCircFiniteSeminorm_add_root P Q f hf + +/-- In the exact negative `q = ∞` regime, the hatted dual seminorm is bounded +by the exact endpoint circ seminorm. All proof obligations are internal. -/ +theorem dualNegativeBesovTopHattedSeminorm_le_circNegativeBesovTopSeminorm + {d : ℕ} (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovTopHattedSeminorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovTopSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) := + Homogenization.exactDualTopHattedSeminorm_le_exactCircTopSeminorm P Q f hf + +/-- In the exact negative `q = ∞` regime, the full dual norm is bounded by the +exact endpoint circ seminorm plus the literal root term. All proof obligations +are internal. -/ +theorem dualNegativeBesovTopFullNorm_le_circNegativeBesovTopSeminorm_add_root + {d : ℕ} (P : DualNegativeBesovTopParameters) (Q : Cube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal P.p) + (normalizedCubeMeasure Q)) : + dualNegativeBesovTopFullNorm P Q f hf ≤ + (3 : ENNReal) ^ ((d : ℝ) + P.s) * + circNegativeBesovTopSeminorm P.circParameters Q f + (Homogenization.exactCircIntegrable_of_memLp Q P.p P.p_one_lt.le hf) + + Homogenization.exactCircDepthWeight Q P.s 0 * + ENNReal.ofReal |Homogenization.cubeAverage Q f| := + Homogenization.exactDualTopFullNorm_le_exactCircTopSeminorm_add_root P Q f hf + +/-! ## Legacy totalized-real and disjoint-cube compatibility -/ + +namespace Legacy + +/-- Compatibility comparison for the totalized-real, disjoint-cube mean-zero +dual Besov seminorm; it is not an exact source-regime theorem. -/ +theorem circDominatesMeanZeroDualBesov {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + dualNegativeBesovSeminorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * circNegativeBesovNorm Q s p q u := + Homogenization.cubeBesovDualMeanZeroSeminorm_le_note_constant_mul_cubeBesovCircNorm + Q s p q u hs hu hp hpTop hpConjTop hq + +/-- Compatibility comparison for the totalized-real, disjoint-cube full dual +Besov norm; it is not an exact source-regime theorem. -/ +theorem circDominatesFullDualBesov {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) : + dualNegativeBesovNorm Q s p q u ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * circNegativeBesovNorm Q s p q u + + cubeBesovScaleWeight s Q * ‖normalizedAverage Q u‖ := + Homogenization.cubeBesovDualFullNorm_le_note_rhs + Q s p q u hs hu hp hpTop hpConjTop hq + +/-- Compatibility pairing estimate for totalized-real, disjoint-cube Besov +quantities and unit full-dual positive tests; it is not an exact source pairing +theorem. -/ +theorem cubeBesovPairing_le_circNorm_of_fullTest {d : ℕ} (Q : Cube d) + (s : ℝ) (p q : ℝ≥0∞) (u g : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) (hpTop : p ≠ ∞) + (hpConjTop : cubeBesovConjExponent p ≠ ∞) + (hq : 1 ≤ q) + (hg : CubeBesovDualFullTest Q s p q g) : + |cubeBesovPairing Q u g| ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * circNegativeBesovNorm Q s p q u := by + have hBdd : + BddAbove (cubeBesovCircNormValueSet Q s p q u) := + Homogenization.cubeBesovCircNormValueSet_bddAbove_of_memLp + Q s p q u hs hu hp hpTop hq + have hpair : + |cubeBesovPairing Q u g| ≤ + max 1 ((3 : ℝ) ^ s) * circNegativeBesovNorm Q s p q u := + Homogenization.abs_cubeBesovPairing_le_max_mul_cubeBesovCircNorm_of_full_test + Q s p q u g hBdd hu hp hpTop hpConjTop hq hg + have hconst : + max 1 ((3 : ℝ) ^ s) ≤ (3 : ℝ) ^ ((d : ℝ) + s) := + Homogenization.max_one_three_rpow_le_three_rpow_nat_add d s hs.le + have hcirc_nonneg : + 0 ≤ circNegativeBesovNorm Q s p q u := + Homogenization.cubeBesovCircNorm_nonneg Q s p q u hBdd + exact hpair.trans (mul_le_mul_of_nonneg_right hconst hcirc_nonneg) + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/ClassicalInputsExact.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/ClassicalInputsExact.lean new file mode 100644 index 0000000000..d9ada7a11c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/ClassicalInputsExact.lean @@ -0,0 +1,365 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ExactOverlapEuclideanRegularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CenteredCubeCalderonZygmundQTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.FullNormEquivalence + +/-! +# Exact Chapter 1 classical inputs + +This additive public surface exposes the repaired centered-cube +Calderón--Zygmund endpoint only at the formalized `q = 2` exponent, together +with the literal continuous `K`-functional kernel and its approved additive +full-norm equivalence with the exact fractional Sobolev carrier. It does not +replace the older discrete/legacy Chapter 1 facade. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped ENNReal + +noncomputable section + +/-- The exact centered-cube classical `q = 2` Calderón--Zygmund statement. +One constant is shared by the normalized-Frobenius Dirichlet branch and the +internally centered Neumann branch. In both branches a weak-Hessian witness +is a supplied `W^{2,2}` hypothesis, and the conclusion estimates that same +witness. -/ +abbrev CenteredCubeCalderonZygmundQTwo (d : ℕ) (C : ℝ) : Prop := + Homogenization.CenteredCubeCalderonZygmundQTwo d C + +/-- The explicit common dimension-only constant for the exact centered-cube +classical `q = 2` branches. -/ +noncomputable abbrev centeredCubeCalderonZygmundQTwoConstant + (d : ℕ) [NeZero d] : ℝ := + Homogenization.centeredCubeCalderonZygmundQTwoConstant d + +theorem centeredCubeCalderonZygmundQTwoConstant_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ centeredCubeCalderonZygmundQTwoConstant d := + Homogenization.centeredCubeCalderonZygmundQTwoConstant_nonneg d + +/-- The exact common centered-cube `q = 2` Calderón--Zygmund theorem. The +common constant precedes every scale, forcing, solution, and weak-Hessian +binder in the underlying predicate. -/ +theorem centeredCubeCalderonZygmundQTwo_exact + (d : ℕ) [NeZero d] : + CenteredCubeCalderonZygmundQTwo d (centeredCubeCalderonZygmundQTwoConstant d) := + Homogenization.centeredCubeCalderonZygmundQTwo_exact d + +/-- Existential form of the exact common centered-cube `q = 2` +Calderón--Zygmund theorem. -/ +theorem exists_centeredCubeCalderonZygmundQTwo + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CenteredCubeCalderonZygmundQTwo d C := + Homogenization.exists_centeredCubeCalderonZygmundQTwo d + +/-- Exact Euclidean `L²` datum carrier for the continuous Chapter 1 +`K`-functional on the unit centered cube. -/ +abbrev UnitCubeEuclideanL2Field (d : ℕ) : Type := + Homogenization.UnitCubeEuclideanL2Field d + +/-- The exact source fractional-order carrier `0 < s < 1`, shared by the +continuous `K` and Euclidean fractional `H^s` kernels. -/ +abbrev FractionalOrder : Type := Homogenization.FractionalOrder + +/-- Exact source scale carrier `0 < t ≤ 1` for the continuous Chapter 1 +`K`-functional. -/ +abbrev ContinuousKScale : Type := Homogenization.ContinuousKScale + +/-- Exact coordinatewise-weak-`H¹` competitor carrier for the continuous +Chapter 1 `K`-functional. -/ +abbrev ContinuousKCompetitor (d : ℕ) : Type := + Homogenization.ContinuousKCompetitor d + +/-- The literal continuous real-interpolation `K(t,F)` functional on the +unit centered cube. This is deliberately distinct from the legacy discrete +cube `K`-functional API. -/ +noncomputable abbrev continuousKFunctional {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : ℝ := + Homogenization.continuousKFunctional t F + +/-- The exact ENNReal-valued continuous interpolation seminorm built from +`t^(-2s) K(t,F)^2 dt / t`. -/ +noncomputable abbrev continuousKSeminorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + Homogenization.continuousKSeminorm s F + +/-- The public continuous `K`-functional keeps its literal infimum-over- +weak-`H¹`-competitors characterization. -/ +theorem continuousKFunctional_eq_sInf {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + continuousKFunctional t F = + sInf (Set.range fun G : ContinuousKCompetitor d => + Homogenization.continuousKFunctionalCompetitorValue t F G) := + Homogenization.continuousKFunctional_eq_sInf t F + +/-- The public continuous `K` seminorm keeps its exact continuum-lintegral +characterization. -/ +theorem continuousKSeminorm_eq_lintegral {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F = + (∫⁻ t in Set.Ioo (0 : ℝ) 1, + Homogenization.continuousKSeminormIntegrand s.1 F t) ^ (1 / 2 : ℝ) := + Homogenization.continuousKSeminorm_eq_lintegral s F + +/-- Membership in the exact Euclidean fractional `H^s` carrier on the unit +centered cube. -/ +abbrev MemEuclideanHs {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : Prop := + Homogenization.MemEuclideanHs s F + +/-- The exact extended Euclidean fractional `H^s` seminorm on the unit +centered cube. It uses the source's normalized-first-variable double +integral. -/ +noncomputable abbrev euclideanHsESeminorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + Homogenization.euclideanHsESeminorm s F + +/-- Literal double-lintegral characterization of the exact Euclidean +fractional `H^s` seminorm. -/ +theorem euclideanHsESeminorm_eq_lintegral {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsESeminorm s F = + (∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Homogenization.euclideanHsProductMeasure d) ^ ((2 : ℝ)⁻¹) := + Homogenization.euclideanHsESeminorm_eq_lintegral s F + +/-- The approved source-facing full norm: normalized Euclidean `L²` plus the +literal continuous interpolation seminorm. -/ +noncomputable abbrev continuousKFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + Homogenization.continuousKFullENorm s F + +/-- The approved source-facing full norm: normalized Euclidean `L²` plus the +exact Euclidean fractional `H^s` seminorm. -/ +noncomputable abbrev euclideanHsFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + Homogenization.euclideanHsFullENorm s F + +/-- Evaluation formula for the approved continuous interpolation full norm. -/ +theorem continuousKFullENorm_eq {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + continuousKFullENorm s F = + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + continuousKSeminorm s F := + Homogenization.continuousKFullENorm_eq s F + +/-- Evaluation formula for the approved exact Euclidean fractional full norm. -/ +theorem euclideanHsFullENorm_eq {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + euclideanHsFullENorm s F = + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + euclideanHsESeminorm s F := + Homogenization.euclideanHsFullENorm_eq s F + +/-- The explicit finite common constant for both approved full-norm +comparisons. -/ +noncomputable abbrev continuousKEuclideanHsFullENormConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + Homogenization.continuousKEuclideanHsFullENormConstant s d + +/-- The explicit common full-norm comparison constant is finite. -/ +theorem continuousKEuclideanHsFullENormConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + continuousKEuclideanHsFullENormConstant s d < ∞ := + Homogenization.continuousKEuclideanHsFullENormConstant_lt_top s d + +/-- The approved continuous interpolation full norm controls the exact +Euclidean fractional full norm with the common finite constant. -/ +theorem euclideanHsFullENorm_le_mul_continuousKFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsFullENorm s F ≤ + continuousKEuclideanHsFullENormConstant s d * continuousKFullENorm s F := + Homogenization.euclideanHsFullENorm_le_mul_continuousKFullENorm s F + +/-- The exact Euclidean fractional full norm controls the approved continuous +interpolation full norm with the same common finite constant. -/ +theorem continuousKFullENorm_le_mul_euclideanHsFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKFullENorm s F ≤ + continuousKEuclideanHsFullENormConstant s d * euclideanHsFullENorm s F := + Homogenization.continuousKFullENorm_le_mul_euclideanHsFullENorm s F + +/-- Exact membership characterization by finiteness of the literal continuous +interpolation seminorm. -/ +theorem memEuclideanHs_iff_continuousKSeminorm_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + MemEuclideanHs s F ↔ continuousKSeminorm s F < ∞ := + Homogenization.memEuclideanHs_iff_continuousKSeminorm_lt_top s F + +/-- Exact Chapter 1 root theorem for the approved additive full-norm +equivalence. -/ +theorem exists_continuousKFullENorm_euclideanHsFullENorm_equivalence + (d : ℕ) (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ F : UnitCubeEuclideanL2Field d, + (MemEuclideanHs s F ↔ continuousKSeminorm s F < ∞) ∧ + euclideanHsFullENorm s F ≤ C * continuousKFullENorm s F ∧ + continuousKFullENorm s F ≤ C * euclideanHsFullENorm s F := + Homogenization.exists_continuousKFullENorm_euclideanHsFullENorm_equivalence d s + +/-! ## Exact centered-cube Dirichlet overlap regularity -/ + +/-- Exact Euclidean `L²` datum carrier on the centered triadic cube at scale +`m`. -/ +abbrev CenteredCubeEuclideanL2Field (d : ℕ) (m : ℤ) : Type := + Homogenization.CenteredCubeEuclideanL2Field d m + +/-- Membership in the literal physical centered-cube Euclidean fractional +`H^s` carrier. -/ +abbrev MemCenteredCubeEuclideanHs {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : Prop := + Homogenization.MemCenteredCubeEuclideanHs s F + +/-- The literal squared Euclidean fractional energy on a centered cube. -/ +noncomputable abbrev centeredCubeEuclideanHsEnergy {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + Homogenization.centeredCubeEuclideanHsEnergy s F + +/-- Literal double-lintegral characterization of the centered-cube Euclidean +fractional energy. -/ +theorem centeredCubeEuclideanHsEnergy_eq_lintegral {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsEnergy s F = + (∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Homogenization.centeredCubeEuclideanHsProductMeasure d m) := + Homogenization.centeredCubeEuclideanHsEnergy_eq_lintegral s F + +/-- Centered-cube Euclidean fractional membership is exactly finiteness of +the literal physical energy. -/ +theorem memCenteredCubeEuclideanHs_iff_energy_lt_top {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + MemCenteredCubeEuclideanHs s F ↔ centeredCubeEuclideanHsEnergy s F < ∞ := + Homogenization.memCenteredCubeEuclideanHs_iff_energy_lt_top s F + +/-- Coordinatewise integrability certificates for the exact Euclidean +overlap norm on a triadic cube. -/ +abbrev ExactOverlapEuclideanIntegrable {d : ℕ} (Q : Cube d) + (F : Vec d → Vec d) : Prop := + Homogenization.ExactOverlapEuclideanIntegrable Q F + +/-- The canonical exact-overlap integrability certificate carried by a +centered-cube Euclidean `L²` field. -/ +theorem centeredCubeEuclideanL2Field_exactOverlapEuclideanIntegrable + {d : ℕ} {m : ℤ} (F : CenteredCubeEuclideanL2Field d m) : + ExactOverlapEuclideanIntegrable (originCube d m) F := + Homogenization.CenteredCubeEuclideanL2Field.exactOverlapEuclideanIntegrable F + +/-- Euclidean magnitude of the exact-overlap coordinate root means. -/ +noncomputable abbrev exactOverlapEuclideanRootMeanENorm {d : ℕ} (Q : Cube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + Homogenization.exactOverlapEuclideanRootMeanENorm Q F hF + +/-- Exact Euclidean `p = q = 2` overlap seminorm on a triadic cube. -/ +noncomputable abbrev exactOverlapEuclideanSeminormTwo {d : ℕ} + (s : FractionalOrder) (Q : Cube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + Homogenization.exactOverlapEuclideanSeminormTwo s Q F hF + +/-- Exact source-facing Euclidean overlap full norm at `p = q = 2`. -/ +noncomputable abbrev exactOverlapEuclideanNormTwo {d : ℕ} + (s : FractionalOrder) (Q : Cube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : ℝ≥0∞ := + Homogenization.exactOverlapEuclideanNormTwo s Q F hF + +/-- Evaluation formula for the Euclidean magnitude of exact-overlap root +means. -/ +theorem exactOverlapEuclideanRootMeanENorm_eq {d : ℕ} (Q : Cube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanRootMeanENorm Q F hF = + (∑ i : Fin d, + (ENNReal.ofReal |Homogenization.exactOverlapRootMean Q (fun x => F x i) + (hF.coordinate i).root|) ^ 2) ^ ((2 : ℝ)⁻¹) := + Homogenization.exactOverlapEuclideanRootMeanENorm_eq Q F hF + +/-- Evaluation formula for the exact Euclidean overlap seminorm. -/ +theorem exactOverlapEuclideanSeminormTwo_eq {d : ℕ} + (s : FractionalOrder) (Q : Cube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanSeminormTwo s Q F hF = + (∑ i : Fin d, + (Homogenization.exactOverlapFiniteSeminorm + (Homogenization.exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i)) ^ 2) ^ ((2 : ℝ)⁻¹) := + Homogenization.exactOverlapEuclideanSeminormTwo_eq s Q F hF + +/-- Evaluation formula for the exact source-facing Euclidean overlap full +norm. -/ +theorem exactOverlapEuclideanNormTwo_eq {d : ℕ} + (s : FractionalOrder) (Q : Cube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + exactOverlapEuclideanNormTwo s Q F hF = + exactOverlapEuclideanSeminormTwo s Q F hF + + Homogenization.exactOverlapRootWeight Q s.1 * + exactOverlapEuclideanRootMeanENorm Q F hF := + Homogenization.exactOverlapEuclideanNormTwo_eq s Q F hF + +/-- The gradient of a centered-cube zero-trace function, packaged as an exact +Euclidean `L²` field. -/ +noncomputable abbrev centeredCubeGradientEuclideanL2Field {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) : + CenteredCubeEuclideanL2Field d m := + Homogenization.centeredCubeGradientEuclideanL2Field w + +/-- Pointwise evaluation of the centered-cube gradient field. -/ +theorem centeredCubeGradientEuclideanL2Field_apply {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + centeredCubeGradientEuclideanL2Field w x = w.toH1Function.grad x := + Homogenization.centeredCubeGradientEuclideanL2Field_apply w x + +/-- Weak zero-trace formulation of the centered-cube Dirichlet divergence +problem. -/ +abbrev CubeDirichletDivergenceProblem {d : ℕ} (Q : Cube d) + (w : H10Function (openCubeSet Q)) (h : Vec d → Vec d) : Prop := + Homogenization.CubeDirichletDivergenceProblem Q w h + +/-- Literal weak-form characterization of the centered-cube Dirichlet +divergence problem. -/ +theorem cubeDirichletDivergenceProblem_iff {d : ℕ} (Q : Cube d) + (w : H10Function (openCubeSet Q)) (h : Vec d → Vec d) : + CubeDirichletDivergenceProblem Q w h ↔ + ∀ φ : H10Function (openCubeSet Q), + ∫ x in openCubeSet Q, + vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (h x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := + Iff.rfl + +/-- Exact centered-cube Dirichlet regularity in the source-facing Euclidean +overlap norm. One finite constant is chosen before the scale, datum, and +solution. -/ +theorem exists_centeredCubeDirichletExactOverlapEuclideanNormTwoRegularity + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (h : CenteredCubeEuclideanL2Field d m) + (w : H10Function (openCubeSet (originCube d m))), + MemCenteredCubeEuclideanHs s h → + CubeDirichletDivergenceProblem (originCube d m) w h → + exactOverlapEuclideanNormTwo s (originCube d m) + (centeredCubeGradientEuclideanL2Field w) + (centeredCubeGradientEuclideanL2Field w).exactOverlapEuclideanIntegrable ≤ + C * exactOverlapEuclideanNormTwo s (originCube d m) h + h.exactOverlapEuclideanIntegrable := + Homogenization.exists_centeredCubeDirichletExactOverlapEuclideanNormTwoRegularity d s + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeDirichletH2.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeDirichletH2.lean new file mode 100644 index 0000000000..c8cb60e1c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeDirichletH2.lean @@ -0,0 +1,1151 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2 + +/-! +# Legacy Chapter 1 Dirichlet compatibility facade + +This module is deliberately quarantined in +`Homogenization.Book.Ch01.Legacy`. It exposes translated, coordinate-`L¹`, +and discrete-`K` compatibility machinery from the earlier Chapter 1 route. +Its former final fractional facade has not passed the continuum `K`/`Hˢ` gate, +so none of these declarations is a source-facing formulation of the +manuscript's classical-input statements. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +namespace Legacy + +open scoped ENNReal Pointwise BigOperators + +/-- Public alias for the scalar weak Dirichlet Poisson problem on a cube. -/ +abbrev CubeDirichletWeakPoissonProblem {d : ℕ} (Q : Cube d) + (u : H10Function (openCubeSet Q)) (f : Vec d → ℝ) : Prop := + Homogenization.CubeDirichletWeakPoissonProblem Q u f + +/-- Public alias for cube Dirichlet `H²` regularity in weak-Hessian form. -/ +abbrev CubeDirichletH2Regularity {d : ℕ} (Q : Cube d) (C : ℝ) : Prop := + Homogenization.CubeDirichletH2Regularity Q C + +/-- Public alias for dimension-uniform cube Dirichlet `H²` regularity. -/ +abbrev CubeDirichletH2RegularityInDimension (d : ℕ) (C : ℝ) : Prop := + Homogenization.CubeDirichletH2RegularityInDimension d C + +/-- Public alias for cube Dirichlet `H²` regularity with the unnormalized +open-cube `L²` forcing norm. -/ +abbrev CubeDirichletH2RegularityVolumeL2 {d : ℕ} (Q : Cube d) (C : ℝ) : Prop := + Homogenization.CubeDirichletH2RegularityVolumeL2 Q C + +/-- Public alias for dimension-uniform cube Dirichlet `H²` regularity with the +unnormalized open-cube `L²` forcing norm. -/ +abbrev CubeDirichletH2RegularityVolumeL2InDimension (d : ℕ) (C : ℝ) : Prop := + Homogenization.CubeDirichletH2RegularityVolumeL2InDimension d C + +/-- Public scale-indexed Dirichlet `H²` constant from the current proof. -/ +noncomputable abbrev cubeDirichletH2RegularityConstantExact + {d : ℕ} [NeZero d] (Q : Cube d) : ℝ := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact Q + +/-- Public dimension-only Dirichlet `H²` constant for the unnormalized +open-cube `L²` forcing norm. -/ +noncomputable abbrev cubeDirichletH2RegularityVolumeL2ConstantExact + (d : ℕ) [NeZero d] : ℝ := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d + +/-- Public alias for the full positive vector `B^s_{2,2}` norm used in +the older disjoint-descendant normalization. -/ +noncomputable abbrev cubeBesovPositiveVectorNormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeBesovPositiveVectorNormTwo Q s F + +/-- Public alias for the overlapping cube attached to a fine-grid center. -/ +abbrev overlapCubeSet {d : ℕ} (S : Cube d) : Set (Vec d) := + Homogenization.overlapCubeSet S + +/-- Public alias for the volume of an overlapping cube. -/ +noncomputable abbrev overlapCubeVolume {d : ℕ} (S : Cube d) : ℝ := + Homogenization.overlapCubeVolume S + +/-- Public alias for normalized measure on an overlapping cube. -/ +noncomputable abbrev normalizedOverlapCubeMeasure {d : ℕ} + (S : Cube d) : MeasureTheory.Measure (Vec d) := + Homogenization.normalizedOverlapCubeMeasure S + +/-- Public alias for the scalar normalized average on an overlapping cube. -/ +noncomputable abbrev overlapCubeAverage {d : ℕ} + (S : Cube d) (f : Vec d → ℝ) : ℝ := + Homogenization.overlapCubeAverage S f + +/-- Public alias for the coordinatewise vector average on an overlapping cube. -/ +noncomputable abbrev overlapCubeAverageVec {d : ℕ} + (S : Cube d) (u : Vec d → Vec d) : Vec d := + Homogenization.overlapCubeAverageVec S u + +/-- Public alias for the normalized `Lᵖ` norm on an overlapping cube. -/ +noncomputable abbrev overlapCubeLpNorm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : Cube d) (p : ℝ≥0∞) + (u : Vec d → E) : ℝ := + Homogenization.overlapCubeLpNorm S p u + +/-- Public alias for vector fluctuation around the overlapping-cube average. -/ +noncomputable abbrev overlapCubeFluctuationVec {d : ℕ} + (S : Cube d) (u : Vec d → Vec d) : Vec d → Vec d := + Homogenization.overlapCubeFluctuationVec S u + +/-- Public alias for the filtered fine-grid centers used by the corrected +overlapping positive norm. -/ +noncomputable abbrev overlapCentersAtDepth {d : ℕ} + (Q : Cube d) (j : ℕ) : Finset (Cube d) := + Homogenization.overlapCentersAtDepth Q j + +/-- Public alias for finite averaging over the overlapping centers. -/ +noncomputable abbrev overlapCentersAverage {d : ℕ} + (Q : Cube d) (j : ℕ) (F : Cube d → ℝ) : ℝ := + Homogenization.overlapCentersAverage Q j F + +/-- Public alias for overlap centers whose overlapping cube contains a fixed +point. -/ +noncomputable abbrev overlapCentersAtDepthContaining {d : ℕ} + (Q : Cube d) (j : ℕ) (x : Vec d) : Finset (Cube d) := + Homogenization.overlapCentersAtDepthContaining Q j x + +/-- Public alias for the depth-`j` overlapping positive square average. -/ +noncomputable abbrev cubeBesovOverlappingPositiveVectorDepthAverage {d : ℕ} + (Q : Cube d) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Homogenization.cubeBesovOverlappingPositiveVectorDepthAverage Q F j + +/-- Public alias for the depth-`j` corrected overlapping positive Besov +contribution. -/ +noncomputable abbrev cubeBesovOverlappingPositiveVectorDepthSeminorm {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Homogenization.cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j + +/-- Public alias for finite-depth corrected overlapping positive Besov +seminorms. -/ +noncomputable abbrev cubeBesovOverlappingPositiveVectorPartialSeminormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F + +/-- Public alias for the corrected overlapping positive vector +`B^s_{2,2}` seminorm. -/ +noncomputable abbrev cubeBesovOverlappingPositiveVectorSeminormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeBesovOverlappingPositiveVectorSeminormTwo Q s F + +/-- Public alias for the corrected overlapping positive vector `B^s_{2,2}` +norm used by the legacy discrete compatibility route, not the source theorem +pending the continuum `K`/`H^s` gate. -/ +noncomputable abbrev cubeBesovOverlappingPositiveVectorNormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeBesovOverlappingPositiveVectorNormTwo Q s F + +/-- Public alias for corrected overlapping positive Besov regularity of a +vector datum. -/ +abbrev CubeVectorOverlappingBesovHRegularity {d : ℕ} + (Q : Cube d) (s : ℝ) (g : Vec d → Vec d) : Prop := + Homogenization.CubeVectorOverlappingBesovHRegularity Q s g + +/-- Public alias for the weak zero-trace equation `-Δw = div h` on a cube. -/ +abbrev CubeDirichletDivergenceProblem {d : ℕ} + (Q : Cube d) (w : H10Function (openCubeSet Q)) + (h : Vec d → Vec d) : Prop := + Homogenization.CubeDirichletDivergenceProblem Q w h + +/-- Legacy-local alias for the discrete compatibility statement, not the source +theorem pending the continuum `K`/`H^s` gate. -/ +abbrev ConstantCoefficientDirichletBesovFunctionSpaces + (d : ℕ) [NeZero d] : Prop := + Homogenization.DiscreteConstantCoefficientDirichletBesovFunctionSpaces d + +/-- Public alias for the K-functional Besov norm model used by the discrete +compatibility route, not the source theorem pending the continuum `K`/`H^s` +gate. -/ +abbrev CubeKBesovNormModel (d : ℕ) : Type := + Homogenization.CubeKBesovNormModel d + +/-- Public alias for coordinatewise `H¹` vector-field competitors in the cube +K-functional. -/ +abbrev CubeVectorH1Function {d : ℕ} (Q : Cube d) : Type := + Homogenization.CubeVectorH1Function Q + +/-- Public alias for the averaged overlap-cube Poincare estimate for +coordinatewise `H¹` vector-field competitors. -/ +abbrev CubeVectorH1OverlapPoincareEstimate (d : ℕ) (C : ℝ) : Prop := + Homogenization.CubeVectorH1OverlapPoincareEstimate d C + +/-- Public alias for the coordinate-summed `H¹` gradient size of a vector +K-functional competitor. -/ +noncomputable abbrev cubeVectorH1GradientCoordL2NormSum {d : ℕ} {Q : Cube d} + (G : CubeVectorH1Function Q) : ℝ := + Homogenization.CubeVectorH1Function.gradientCoordL2NormSum G + +/-- Public alias for the parent-normalized coordinate-summed `H¹` gradient +size used by the scale-correct K-functional. -/ +noncomputable abbrev cubeVectorH1RelativeGradientCoordL2NormSum + {d : ℕ} {Q : Cube d} (G : CubeVectorH1Function Q) : ℝ := + Homogenization.CubeVectorH1Function.relativeGradientCoordL2NormSum G + +/-- Public alias for one competitor value in the discrete cube vector +K-functional. -/ +noncomputable abbrev cubeVectorKFunctionalCompetitorValue {d : ℕ} + (Q : Cube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : ℝ := + Homogenization.cubeVectorKFunctionalCompetitorValue Q t F G + +/-- Public alias for the discrete cube vector K-functional. -/ +noncomputable abbrev cubeVectorKFunctional {d : ℕ} + (Q : Cube d) (t : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeVectorKFunctional Q t F + +/-- Public alias for the depth-`j` K-functional Besov contribution. -/ +noncomputable abbrev cubeKBesovVectorDepthSeminorm {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Homogenization.cubeKBesovVectorDepthSeminorm Q s F j + +/-- Public alias for the finite-depth K-functional Besov seminorm. -/ +noncomputable abbrev cubeKBesovVectorPartialSeminormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeKBesovVectorPartialSeminormTwo Q s N F + +/-- Public alias for the full K-functional Besov seminorm. -/ +noncomputable abbrev cubeKBesovVectorSeminormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeKBesovVectorSeminormTwo Q s F + +/-- Public alias for the full K-functional Besov norm. -/ +noncomputable abbrev cubeKBesovVectorNormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Homogenization.cubeKBesovVectorNormTwo Q s F + +/-- Public alias for the canonical K-functional Besov norm model. -/ +noncomputable abbrev cubeKBesovNormModel (d : ℕ) : CubeKBesovNormModel d := + Homogenization.cubeKBesovNormModel d + +/-- Public alias for the pure K-functional/overlapping Besov norm equivalence +contract. -/ +abbrev CubeKBesovOverlappingEquivalence + {d : ℕ} (K : CubeKBesovNormModel d) : Prop := + Homogenization.CubeKBesovOverlappingEquivalence K + +/-- Public alias for the Dirichlet divergence K-functional regularity +contract. -/ +abbrev CubeKBesovDirichletRegularity + {d : ℕ} (K : CubeKBesovNormModel d) : Prop := + Homogenization.CubeKBesovDirichletRegularity K + +/-- Public alias for the input boundedness bridge used by the K-functional +Dirichlet regularity proof. -/ +abbrev CubeKBesovInputBoundednessOfOverlappingHRegularity + (d : ℕ) : Prop := + Homogenization.CubeKBesovInputBoundednessOfOverlappingHRegularity d + +/-- Public alias for the finite-level pure K/overlapping partial-sum +comparison. -/ +abbrev CubeKBesovPartialBoundByOverlappingPositive + (d : ℕ) : Prop := + Homogenization.CubeKBesovPartialBoundByOverlappingPositive d + +/-- Public alias for the mean-gradient estimate used by the K-functional +Dirichlet regularity proof. -/ +abbrev CubeDirichletGradientAverageRegularity + (d : ℕ) : Prop := + Homogenization.CubeDirichletGradientAverageRegularity d + +/-- Public alias for pointwise-in-scale K-functional regularity of the +zero-Dirichlet divergence solution operator. -/ +abbrev CubeKFunctionalDirichletPointwiseRegularity + (d : ℕ) : Prop := + Homogenization.CubeKFunctionalDirichletPointwiseRegularity d + +/-- Public alias for the endpoint decomposition used to prove pointwise +K-functional regularity. -/ +abbrev CubeDirichletKEndpointDecomposition + (d : ℕ) : Prop := + Homogenization.CubeDirichletKEndpointDecomposition d + +/-- Public alias for the two-constant endpoint construction behind the +one-constant K-functional endpoint decomposition. -/ +abbrev CubeDirichletKEndpointCompetitorConstruction + (d : ℕ) : Prop := + Homogenization.CubeDirichletKEndpointCompetitorConstruction d + +/-- Public alias for residual `L²` stability of two zero-Dirichlet +divergence-RHS solutions. -/ +abbrev CubeDirichletDivergenceResidualL2Stability + (d : ℕ) : Prop := + Homogenization.CubeDirichletDivergenceResidualL2Stability d + +/-- Public alias for the Dirichlet `H²` endpoint viewed as an `H¹` lift of +vector-field competitors. -/ +abbrev CubeDirichletH1CompetitorLiftRegularity + (d : ℕ) : Prop := + Homogenization.CubeDirichletH1CompetitorLiftRegularity d + +/-- Public alias for the sharper Dirichlet `H²` divergence-RHS competitor +regularity contract that implies the H¹ lift wrapper. -/ +abbrev CubeDirichletDivergenceH2CompetitorRegularity + (d : ℕ) : Prop := + Homogenization.CubeDirichletDivergenceH2CompetitorRegularity d + +/-- Public alias for the weak-divergence realization bridge feeding the scalar +Dirichlet `H²` theorem. -/ +abbrev CubeVectorH1DivergencePoissonRealization + (d : ℕ) : Prop := + Homogenization.CubeVectorH1DivergencePoissonRealization d + +/-- Public alias for the focused components implying the K-functional +Dirichlet Besov regularity contract. -/ +abbrev CubeKBesovDirichletRegularityComponents + (d : ℕ) : Prop := + Homogenization.CubeKBesovDirichletRegularityComponents d + +/-- Public alias for the pure canonical K-functional/overlapping Besov theory, +including both norm equivalence and K-partial boundedness. -/ +abbrev CubeKBesovCanonicalOverlappingTheory + (d : ℕ) [NeZero d] : Prop := + Homogenization.CubeKBesovCanonicalOverlappingTheory d + +/-- Public alias for the sharpened pure canonical K-functional/overlapping Besov +theory core. -/ +abbrev CubeKBesovCanonicalOverlappingTheoryCore + (d : ℕ) [NeZero d] : Prop := + Homogenization.CubeKBesovCanonicalOverlappingTheoryCore d + +/-- Legacy-local alias for the discrete compatibility K-functional route, not +the source theorem pending the continuum `K`/`H^s` gate. -/ +abbrev ConstantCoefficientDirichletBesovKFunctionalRoute + (d : ℕ) [NeZero d] : Prop := + Homogenization.DiscreteConstantCoefficientDirichletBesovKFunctionalRoute d + +/-- Public alias for the unit centered-cube zero-trace Poincare constant used +inside the Dirichlet solver-energy estimate. -/ +noncomputable abbrev originCubeUnitZeroTraceH1CoerciveConstant + (d : ℕ) [NeZero d] : ℝ := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeUnitZeroTraceH1CoerciveConstant d + +/-- Public alias for the scale-sharp centered-cube zero-trace Poincare +constant, obtained from the unit centered cube by dilation. -/ +noncomputable abbrev originCubeZeroTraceH1CoerciveConstant + (d : ℕ) [NeZero d] (m : ℤ) : ℝ := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeZeroTraceH1CoerciveConstant d m + +theorem originCubeUnitZeroTraceH1CoerciveConstant_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ originCubeUnitZeroTraceH1CoerciveConstant d := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeUnitZeroTraceH1CoerciveConstant_nonneg d + +theorem originCubeUnitZeroTraceH1CoerciveConstant_bound + {d : ℕ} [NeZero d] + (u : H10Function (openCubeSet (originCube d 0))) : + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeUnitZeroTraceH1CoerciveConstant d * + u.toH1Function.gradientCoordL2NormSum := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeUnitZeroTraceH1CoerciveConstant_bound u + +theorem originCubeZeroTraceH1CoerciveConstant_nonneg + (d : ℕ) [NeZero d] (m : ℤ) : + 0 ≤ originCubeZeroTraceH1CoerciveConstant d m := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeZeroTraceH1CoerciveConstant_nonneg d m + +theorem originCubeZeroTraceH1CoerciveConstant_bound + {d : ℕ} [NeZero d] {m : ℤ} + (u : H10Function (openCubeSet (originCube d m))) : + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeZeroTraceH1CoerciveConstant d m * + u.toH1Function.gradientCoordL2NormSum := + Homogenization.CubeDirichletWeakPoissonProblem.originCubeZeroTraceH1CoerciveConstant_bound u + +theorem cubeDirichletH2RegularityConstantExact_nonneg + {d : ℕ} [NeZero d] (Q : Cube d) : + 0 ≤ cubeDirichletH2RegularityConstantExact Q := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact_nonneg Q + +theorem cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ cubeDirichletH2RegularityVolumeL2ConstantExact d := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d + +theorem cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact + {d : ℕ} [NeZero d] (Q : Cube d) : + cubeDirichletH2RegularityConstantExact Q = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeDirichletH2RegularityVolumeL2ConstantExact d := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact + Q + +theorem CubeDirichletH2Regularity.constant_nonneg + {d : ℕ} {Q : Cube d} {C : ℝ} + (h : CubeDirichletH2Regularity Q C) : + 0 ≤ C := + Homogenization.CubeDirichletH2Regularity.constant_nonneg h + +theorem CubeDirichletH2RegularityInDimension.constant_nonneg + {d : ℕ} {C : ℝ} + (h : CubeDirichletH2RegularityInDimension d C) : + 0 ≤ C := + Homogenization.CubeDirichletH2RegularityInDimension.constant_nonneg h + +theorem CubeDirichletH2RegularityVolumeL2.constant_nonneg + {d : ℕ} {Q : Cube d} {C : ℝ} + (h : CubeDirichletH2RegularityVolumeL2 Q C) : + 0 ≤ C := + Homogenization.CubeDirichletH2RegularityVolumeL2.constant_nonneg h + +theorem CubeDirichletH2RegularityVolumeL2InDimension.constant_nonneg + {d : ℕ} {C : ℝ} + (h : CubeDirichletH2RegularityVolumeL2InDimension d C) : + 0 ≤ C := + Homogenization.CubeDirichletH2RegularityVolumeL2InDimension.constant_nonneg h + +theorem CubeDirichletH2Regularity.mono + {d : ℕ} {Q : Cube d} {C D : ℝ} + (h : CubeDirichletH2Regularity Q C) + (hCD : C ≤ D) : + CubeDirichletH2Regularity Q D := + Homogenization.CubeDirichletH2Regularity.mono h hCD + +theorem CubeDirichletH2RegularityInDimension.mono + {d : ℕ} {C D : ℝ} + (h : CubeDirichletH2RegularityInDimension d C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityInDimension d D := + Homogenization.CubeDirichletH2RegularityInDimension.mono h hCD + +theorem CubeDirichletH2RegularityVolumeL2.mono + {d : ℕ} {Q : Cube d} {C D : ℝ} + (h : CubeDirichletH2RegularityVolumeL2 Q C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityVolumeL2 Q D := + Homogenization.CubeDirichletH2RegularityVolumeL2.mono h hCD + +theorem CubeDirichletH2RegularityVolumeL2InDimension.mono + {d : ℕ} {C D : ℝ} + (h : CubeDirichletH2RegularityVolumeL2InDimension d C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityVolumeL2InDimension d D := + Homogenization.CubeDirichletH2RegularityVolumeL2InDimension.mono h hCD + +/-- Public cube Dirichlet `H²` regularity with the current scale-indexed +constant. -/ +theorem cubeDirichletH2RegularityExact + {d : ℕ} [NeZero d] (Q : Cube d) : + CubeDirichletH2Regularity Q + (cubeDirichletH2RegularityConstantExact Q) := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityExact Q + +/-- Public cube Dirichlet `H²` regularity with a dimension-only constant when +the forcing is measured in the unnormalized open-cube `L²` norm. -/ +theorem cubeDirichletH2RegularityVolumeL2Exact + {d : ℕ} [NeZero d] (Q : Cube d) : + CubeDirichletH2RegularityVolumeL2 Q + (cubeDirichletH2RegularityVolumeL2ConstantExact d) := + Homogenization.CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2Exact Q + +theorem exists_cubeDirichletH2RegularityVolumeL2InDimension + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CubeDirichletH2RegularityVolumeL2InDimension d C := + Homogenization.CubeDirichletWeakPoissonProblem.exists_cubeDirichletH2RegularityVolumeL2InDimension + d + +theorem cubeVectorH1GradientCoordL2NormSum_nonneg + {d : ℕ} {Q : Cube d} (G : CubeVectorH1Function Q) : + 0 ≤ cubeVectorH1GradientCoordL2NormSum G := + Homogenization.CubeVectorH1Function.gradientCoordL2NormSum_nonneg G + +theorem cubeVectorKFunctionalCompetitorValue_nonneg + {d : ℕ} (Q : Cube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : + 0 ≤ cubeVectorKFunctionalCompetitorValue Q t F G := + Homogenization.cubeVectorKFunctionalCompetitorValue_nonneg Q t F G + +theorem cubeVectorKFunctional_nonneg + {d : ℕ} (Q : Cube d) (t : ℝ) (F : Vec d → Vec d) : + 0 ≤ cubeVectorKFunctional Q t F := + Homogenization.cubeVectorKFunctional_nonneg Q t F + +theorem cubeVectorKFunctional_le_competitor + {d : ℕ} (Q : Cube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : + cubeVectorKFunctional Q t F ≤ + cubeVectorKFunctionalCompetitorValue Q t F G := + Homogenization.cubeVectorKFunctional_le_competitor Q t F G + +theorem cubeVectorKFunctionalCompetitorValue_le_of_endpoint_bounds + {d : ℕ} (Q : Cube d) (t C : ℝ) (F H : Vec d → Vec d) + (V G : CubeVectorH1Function Q) (hC : 0 ≤ C) + (hL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => F x - V.toField x) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => H x - G.toField x)) + (hGrad : + V.gradientCoordL2NormSum ≤ C * G.gradientCoordL2NormSum) : + cubeVectorKFunctionalCompetitorValue Q t F V ≤ + C * cubeVectorKFunctionalCompetitorValue Q t H G := + Homogenization.cubeVectorKFunctionalCompetitorValue_le_of_endpoint_bounds + Q t C F H V G hC hL2 hGrad + +theorem cubeVectorKFunctional_le_of_forall_competitorValue_le + {d : ℕ} (Q : Cube d) (t C : ℝ) (F H : Vec d → Vec d) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + ∃ V : CubeVectorH1Function Q, + cubeVectorKFunctionalCompetitorValue Q t F V ≤ + C * cubeVectorKFunctionalCompetitorValue Q t H G) : + cubeVectorKFunctional Q t F ≤ C * cubeVectorKFunctional Q t H := + Homogenization.cubeVectorKFunctional_le_of_forall_competitorValue_le + Q t C F H hC hcomp + +theorem cubeKBesovVectorDepthSeminorm_nonneg + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s F j := + Homogenization.cubeKBesovVectorDepthSeminorm_nonneg Q s F j + +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctional_of_forall_competitorValue + {d : ℕ} (Q : Cube d) (C : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F := + Homogenization.sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctional_of_forall_competitorValue + Q C F j hC hcomp + +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_le_mul_cubeKBesovVectorDepthSeminorm_of_forall_competitorValue + {d : ℕ} (Q : Cube d) (s C : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s F j := + Homogenization.cubeBesovOverlappingPositiveVectorDepthSeminorm_le_mul_cubeKBesovVectorDepthSeminorm_of_forall_competitorValue + Q s C F j hC hcomp + +theorem cubeKBesovVectorDepthSeminorm_le_of_kFunctional_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (F G : Vec d → Vec d) (j : ℕ) + (hK : + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s G j := + Homogenization.cubeKBesovVectorDepthSeminorm_le_of_kFunctional_le + Q s C F G j hK + +theorem cubeKBesovVectorPartialSeminormTwo_nonneg + {d : ℕ} (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : + 0 ≤ cubeKBesovVectorPartialSeminormTwo Q s N F := + Homogenization.cubeKBesovVectorPartialSeminormTwo_nonneg Q s N F + +theorem sq_cubeKBesovVectorPartialSeminormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : + (cubeKBesovVectorPartialSeminormTwo Q s N F) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2 := + Homogenization.sq_cubeKBesovVectorPartialSeminormTwo Q s N F + +theorem cubeKBesovVectorPartialSeminormTwo_le_of_forall_depthSeminorm_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (N : ℕ) + (F G : Vec d → Vec d) (hC : 0 ≤ C) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeKBesovVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s G j) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G := + Homogenization.cubeKBesovVectorPartialSeminormTwo_le_of_forall_depthSeminorm_le + Q s C N F G hC hdepth + +theorem cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (N : ℕ) + (F G : Vec d → Vec d) (hC : 0 ≤ C) + (hK : + ∀ j ∈ Finset.range (N + 1), + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G := + Homogenization.cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + Q s C N F G hC hK + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_depthSeminorm_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (N : ℕ) + (F : Vec d → Vec d) (hC : 0 ≤ C) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s F j) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N F := + Homogenization.cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_depthSeminorm_le + Q s C N F hC hdepth + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_competitorValue + {d : ℕ} (Q : Cube d) (s C : ℝ) (N : ℕ) + (F : Vec d → Vec d) (hC : 0 ≤ C) + (hcomp : + ∀ j ∈ Finset.range (N + 1), + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N F := + Homogenization.cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_competitorValue + Q s C N F hC hcomp + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeKBesovVectorPartialSeminormTwo Q s N F := + Homogenization.cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + hC hPoincare Q s N F hF + +theorem cubeKBesovVectorSeminormTwo_le_of_partialBound + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeKBesovVectorPartialSeminormTwo Q s N F ≤ B) : + cubeKBesovVectorSeminormTwo Q s F ≤ B := + Homogenization.cubeKBesovVectorSeminormTwo_le_of_partialBound Q s F hB + +theorem cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) + (N : ℕ) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + cubeKBesovVectorSeminormTwo Q s F := + Homogenization.cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s F hBdd N + +theorem cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) : + 0 ≤ cubeKBesovVectorSeminormTwo Q s F := + Homogenization.cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove + Q s F hBdd + +theorem cubeKBesovVectorSeminormTwo_le_of_forall_partialSeminormTwo_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (F G : Vec d → Vec d) + (hC : 0 ≤ C) + (hG_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N G)) + (hpartial : + ∀ N : ℕ, + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G) : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G := + Homogenization.cubeKBesovVectorSeminormTwo_le_of_forall_partialSeminormTwo_le + Q s C F G hC hG_bdd hpartial + +theorem cubeKBesovVectorSeminormTwo_le_of_forall_kFunctional_le + {d : ℕ} (Q : Cube d) (s C : ℝ) (F G : Vec d → Vec d) + (hC : 0 ≤ C) + (hG_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N G)) + (hK : + ∀ j : ℕ, + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G := + Homogenization.cubeKBesovVectorSeminormTwo_le_of_forall_kFunctional_le + Q s C F G hC hG_bdd hK + +theorem cubeKBesovVectorNormTwo_le_of_average_and_seminorm + {d : ℕ} (Q : Cube d) (s C : ℝ) (F G : Vec d → Vec d) + (havg : + Real.sqrt (vecNormSq (cubeAverageVec Q F)) ≤ + C * Real.sqrt (vecNormSq (cubeAverageVec Q G))) + (hsemi : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G) : + cubeKBesovVectorNormTwo Q s F ≤ + C * cubeKBesovVectorNormTwo Q s G := + Homogenization.cubeKBesovVectorNormTwo_le_of_average_and_seminorm + Q s C F G havg hsemi + +theorem mem_overlapCentersAtDepth_iff {d : ℕ} + {Q S : Cube d} {j : ℕ} : + S ∈ overlapCentersAtDepth Q j ↔ + S ∈ descendantsAtDepth Q (j + 1) ∧ overlapCubeSet S ⊆ cubeSet Q := + Homogenization.mem_overlapCentersAtDepth_iff + +theorem overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth {d : ℕ} + {Q S : Cube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeSet S ⊆ cubeSet Q := + Homogenization.overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS + +theorem overlapCentersAverage_le_overlapCentersAverage {d : ℕ} + (Q : Cube d) (j : ℕ) {F G : Cube d → ℝ} + (hFG : ∀ S ∈ overlapCentersAtDepth Q j, F S ≤ G S) : + overlapCentersAverage Q j F ≤ overlapCentersAverage Q j G := + Homogenization.overlapCentersAverage_le_overlapCentersAverage Q j hFG + +theorem overlapCentersAtDepth_nonempty {d : ℕ} + (Q : Cube d) (j : ℕ) : + (overlapCentersAtDepth Q j).Nonempty := + Homogenization.overlapCentersAtDepth_nonempty Q j + +theorem overlapCentersAtDepth_card_pos {d : ℕ} + (Q : Cube d) (j : ℕ) : + 0 < (overlapCentersAtDepth Q j).card := + Homogenization.overlapCentersAtDepth_card_pos Q j + +theorem overlapCentersAtDepth_card_ne_zero {d : ℕ} + (Q : Cube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≠ 0 := + Homogenization.overlapCentersAtDepth_card_ne_zero Q j + +theorem overlapCentersAtDepth_card_le_pow {d : ℕ} + (Q : Cube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≤ (3 ^ d) ^ (j + 1) := + Homogenization.overlapCentersAtDepth_card_le_pow Q j + +theorem overlapCentersAverage_const {d : ℕ} + (Q : Cube d) (j : ℕ) (c : ℝ) : + overlapCentersAverage Q j (fun _ => c) = c := + Homogenization.overlapCentersAverage_const Q j c + +theorem exists_mem_overlapCentersAtDepth_of_mem_cubeSet {d : ℕ} + {Q : Cube d} {x : Vec d} (j : ℕ) + (hx : x ∈ cubeSet Q) : + ∃ S ∈ overlapCentersAtDepth Q j, x ∈ overlapCubeSet S := + Homogenization.exists_mem_overlapCentersAtDepth_of_mem_cubeSet j hx + +theorem cubeSet_subset_iUnion_overlapCentersAtDepth {d : ℕ} + (Q : Cube d) (j : ℕ) : + cubeSet Q ⊆ + ⋃ S ∈ (overlapCentersAtDepth Q j : Set (Cube d)), + overlapCubeSet S := + Homogenization.cubeSet_subset_iUnion_overlapCentersAtDepth Q j + +theorem descendantsAtDepth_card_le_overlapCentersAtDepth_card {d : ℕ} + (Q : Cube d) (j : ℕ) : + (descendantsAtDepth Q j).card ≤ (overlapCentersAtDepth Q j).card := + Homogenization.descendantsAtDepth_card_le_overlapCentersAtDepth_card Q j + +theorem pow_le_overlapCentersAtDepth_card {d : ℕ} + (Q : Cube d) (j : ℕ) : + (3 ^ d) ^ j ≤ (overlapCentersAtDepth Q j).card := + Homogenization.pow_le_overlapCentersAtDepth_card Q j + +theorem mem_overlapCentersAtDepthContaining_iff {d : ℕ} + {Q S : Cube d} {j : ℕ} {x : Vec d} : + S ∈ overlapCentersAtDepthContaining Q j x ↔ + S ∈ overlapCentersAtDepth Q j ∧ x ∈ overlapCubeSet S := + Homogenization.mem_overlapCentersAtDepthContaining_iff + +theorem overlapCentersAtDepthContaining_card_le_pow {d : ℕ} + (Q : Cube d) (j : ℕ) (x : Vec d) : + (overlapCentersAtDepthContaining Q j x).card ≤ 3 ^ d := + Homogenization.overlapCentersAtDepthContaining_card_le_pow Q j x + +theorem measurableSet_overlapCubeSet {d : ℕ} (S : Cube d) : + MeasurableSet (overlapCubeSet S) := + Homogenization.measurableSet_overlapCubeSet S + +theorem volume_overlapCubeSet_toReal {d : ℕ} (S : Cube d) : + (MeasureTheory.volume (overlapCubeSet S)).toReal = overlapCubeVolume S := + Homogenization.volume_overlapCubeSet_toReal S + +theorem overlapCubeVolume_eq_cubeVolume_div_pow_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : Cube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeVolume S = cubeVolume Q / (((3 : ℝ) ^ d) ^ j) := + Homogenization.overlapCubeVolume_eq_cubeVolume_div_pow_of_mem_overlapCentersAtDepth hS + +theorem cubeVolume_le_card_mul_overlapCubeVolume_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : Cube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + cubeVolume Q ≤ ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S := + Homogenization.cubeVolume_le_card_mul_overlapCubeVolume_of_mem_overlapCentersAtDepth hS + +theorem overlapCentersAtDepth_sum_setLIntegral_le_mul_setLIntegral_cubeSet + {d : ℕ} (Q : Cube d) (j : ℕ) {f : Vec d → ℝ≥0∞} + (hfQ : AEMeasurable f (MeasureTheory.volume.restrict (cubeSet Q))) + (hfS : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable f (MeasureTheory.volume.restrict (overlapCubeSet S))) : + ∑ S ∈ overlapCentersAtDepth Q j, + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume + ≤ (3 ^ d : ℝ≥0∞) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := + Homogenization.overlapCentersAtDepth_sum_setLIntegral_le_mul_setLIntegral_cubeSet + Q j hfQ hfS + +theorem overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le + {d : ℕ} (Q : Cube d) (j : ℕ) {f : Vec d → ℝ≥0∞} + (hfQ : AEMeasurable f (MeasureTheory.volume.restrict (cubeSet Q))) + (hfS : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable f (MeasureTheory.volume.restrict (overlapCubeSet S))) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (∑ S ∈ overlapCentersAtDepth Q j, + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S)) + ≤ (3 ^ d : ℝ≥0∞) * + ∫⁻ x, f x ∂(normalizedCubeMeasure Q) := + Homogenization.overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le + Q j hfQ hfS + +theorem cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : Cube d) (f : Vec d → E) : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal := + Homogenization.cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal Q f + +theorem overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : Cube d) (f : Vec d → E) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) f) ^ 2 = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S).toReal := + Homogenization.overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal S f + +theorem memLp_cubeMeasure_of_memLp_normalizedCubeMeasure + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : Cube d) {p : ℝ≥0∞} {f : Vec d → E} + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (cubeMeasure Q) := + Homogenization.memLp_cubeMeasure_of_memLp_normalizedCubeMeasure Q hf + +theorem memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + {Q S : Cube d} {j : ℕ} {p : ℝ≥0∞} {f : Vec d → E} + (hS : S ∈ overlapCentersAtDepth Q j) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S) := + Homogenization.memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + hS hf + +theorem overlapCentersAverage_lintegral_rpow_enorm_two_le + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [MeasurableSpace E] [BorelSpace E] + (Q : Cube d) (j : ℕ) (R : Vec d → E) + (hR : MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hRloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCentersAverage Q j + (fun S => (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S).toReal) + ≤ (3 ^ d : ℝ) * + (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal := + Homogenization.overlapCentersAverage_lintegral_rpow_enorm_two_le + Q j R hR hRloc + +theorem overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_two_mul_overlapCubeLpNorm_two + {d : ℕ} (S : Cube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u) ≤ + 2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u := + Homogenization.overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_two_mul_overlapCubeLpNorm_two + S u hu + +theorem overlapCubeAverage_add_of_memLp_two + {d : ℕ} (S : Cube d) {f g : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeAverage S (fun x => f x + g x) = + overlapCubeAverage S f + overlapCubeAverage S g := + Homogenization.overlapCubeAverage_add_of_memLp_two S hf hg + +theorem overlapCubeAverageVec_add_of_memLp_two + {d : ℕ} (S : Cube d) {u v : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeAverageVec S (fun x => u x + v x) = + overlapCubeAverageVec S u + overlapCubeAverageVec S v := + Homogenization.overlapCubeAverageVec_add_of_memLp_two S hu hv + +theorem memLp_overlapCubeFluctuationVec + {d : ℕ} (S : Cube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + MeasureTheory.MemLp (overlapCubeFluctuationVec S u) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + Homogenization.memLp_overlapCubeFluctuationVec S u hu + +theorem overlapCubeFluctuationVec_add_of_memLp_two + {d : ℕ} (S : Cube d) {u v : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeFluctuationVec S (fun x => u x + v x) = + fun x => overlapCubeFluctuationVec S u x + + overlapCubeFluctuationVec S v x := + Homogenization.overlapCubeFluctuationVec_add_of_memLp_two S hu hv + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_add_le + {d : ℕ} (Q : Cube d) (u v : Vec d → Vec d) (j : ℕ) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q (fun x => u x + v x) j ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q u j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q v j := + Homogenization.cubeBesovOverlappingPositiveVectorDepthAverage_add_le + Q u v j hu hv + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_residual_le + {d : ℕ} (Q : Cube d) (R : Vec d → Vec d) (j : ℕ) + (hR : MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hRloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q R j ≤ + 4 * (3 ^ d : ℝ) * (cubeLpNorm Q (2 : ℝ≥0∞) R) ^ 2 := + Homogenization.cubeBesovOverlappingPositiveVectorDepthAverage_residual_le + Q R j hR hRloc + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : Cube d) (j : ℕ) (G : CubeVectorH1Function Q) : + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j ≤ + (C * Real.rpow (3 : ℝ) (-(j : ℝ)) * + cubeVectorH1RelativeGradientCoordL2NormSum G) ^ 2 := + Homogenization.cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_of_overlapPoincare + hC hPoincare Q j G + +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctionalCompetitorValue_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : Cube d) (F : Vec d → Vec d) (j : ℕ) + (G : CubeVectorH1Function Q) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G := + Homogenization.sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctionalCompetitorValue_of_overlapPoincare + hC hPoincare Q F j G hF + +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (Homogenization.cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2 := + Homogenization.sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F + +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_le_of_partialBound + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : + ∀ N : ℕ, cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ B) : + cubeBesovOverlappingPositiveVectorSeminormTwo Q s F ≤ B := + Homogenization.cubeBesovOverlappingPositiveVectorSeminormTwo_le_of_partialBound + Q s F hB + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F)) + (N : ℕ) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + cubeBesovOverlappingPositiveVectorSeminormTwo Q s F := + Homogenization.cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s F hBdd N + +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_nonneg_of_bddAbove + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F)) : + 0 ≤ cubeBesovOverlappingPositiveVectorSeminormTwo Q s F := + Homogenization.cubeBesovOverlappingPositiveVectorSeminormTwo_nonneg_of_bddAbove + Q s F hBdd + +theorem cubeBesovOverlappingPositiveVectorNormTwo_nonneg_of_bddAbove + {d : ℕ} (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F)) : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := + Homogenization.cubeBesovOverlappingPositiveVectorNormTwo_nonneg_of_bddAbove + Q s F hBdd + +theorem CubeVectorOverlappingBesovHRegularity.partialSeminorm_le_seminorm + {d : ℕ} {Q : Cube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) (N : ℕ) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N g ≤ + cubeBesovOverlappingPositiveVectorSeminormTwo Q s g := + Homogenization.CubeVectorOverlappingBesovHRegularity.partialSeminorm_le_seminorm + hg N + +theorem CubeVectorOverlappingBesovHRegularity.seminorm_nonneg + {d : ℕ} {Q : Cube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) : + 0 ≤ cubeBesovOverlappingPositiveVectorSeminormTwo Q s g := + Homogenization.CubeVectorOverlappingBesovHRegularity.seminorm_nonneg hg + +theorem CubeVectorOverlappingBesovHRegularity.norm_nonneg + {d : ℕ} {Q : Cube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s g := + Homogenization.CubeVectorOverlappingBesovHRegularity.norm_nonneg hg + +theorem cubeKBesovDirichletRegularity_of_components + {d : ℕ} + (hcomponents : CubeKBesovDirichletRegularityComponents d) : + CubeKBesovDirichletRegularity (cubeKBesovNormModel d) := + Homogenization.cubeKBesovDirichletRegularity_of_components hcomponents + +theorem cubeKFunctionalDirichletPointwiseRegularity_of_endpointDecomposition + {d : ℕ} + (hendpoint : CubeDirichletKEndpointDecomposition d) : + CubeKFunctionalDirichletPointwiseRegularity d := + Homogenization.cubeKFunctionalDirichletPointwiseRegularity_of_endpointDecomposition + hendpoint + +theorem cubeDirichletKEndpointDecomposition_of_competitorConstruction + {d : ℕ} + (hendpoint : CubeDirichletKEndpointCompetitorConstruction d) : + CubeDirichletKEndpointDecomposition d := + Homogenization.cubeDirichletKEndpointDecomposition_of_competitorConstruction + hendpoint + +theorem cubeDirichletKEndpointCompetitorConstruction_of_residualStability_of_liftRegularity + {d : ℕ} + (hstable : CubeDirichletDivergenceResidualL2Stability d) + (hlift : CubeDirichletH1CompetitorLiftRegularity d) : + CubeDirichletKEndpointCompetitorConstruction d := + Homogenization.cubeDirichletKEndpointCompetitorConstruction_of_residualStability_of_liftRegularity + hstable hlift + +/-- Public Chapter 1 finite-level K-functional partial-sum comparison. -/ +theorem cubeKBesovPartialBoundByOverlappingPositive + (d : ℕ) [NeZero d] : + CubeKBesovPartialBoundByOverlappingPositive d := + Homogenization.cubeKBesovPartialBoundByOverlappingPositive d + +/-- Public Chapter 1 input boundedness bridge for the K-functional +regularity proof. -/ +theorem cubeKBesovInputBoundednessOfOverlappingHRegularity + (d : ℕ) [NeZero d] : + CubeKBesovInputBoundednessOfOverlappingHRegularity d := + Homogenization.cubeKBesovInputBoundednessOfOverlappingHRegularity d + +/-- Public Chapter 1 mean-gradient regularity input for zero-Dirichlet +divergence solutions. -/ +theorem cubeDirichletGradientAverageRegularity + (d : ℕ) [NeZero d] : + CubeDirichletGradientAverageRegularity d := + Homogenization.cubeDirichletGradientAverageRegularity d + +/-- Public Chapter 1 pointwise K-functional regularity input for +zero-Dirichlet divergence solutions. -/ +theorem cubeKFunctionalDirichletPointwiseRegularity + (d : ℕ) [NeZero d] : + CubeKFunctionalDirichletPointwiseRegularity d := + Homogenization.cubeKFunctionalDirichletPointwiseRegularity d + +/-- Public Chapter 1 one-solution `L²` energy estimate input for +zero-Dirichlet divergence solutions. -/ +theorem cubeDirichletDivergenceEnergyEstimate + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceEnergyEstimate d := + Homogenization.cubeDirichletDivergenceEnergyEstimate d + +/-- Public Chapter 1 residual `L²` stability input for the endpoint +construction. -/ +theorem cubeDirichletDivergenceResidualL2Stability + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceResidualL2Stability d := + Homogenization.cubeDirichletDivergenceResidualL2Stability d + +/-- Public Chapter 1 Dirichlet `H²`/`H¹` lift input for the endpoint +construction. -/ +theorem cubeDirichletH1CompetitorLiftRegularity + (d : ℕ) [NeZero d] : + CubeDirichletH1CompetitorLiftRegularity d := + Homogenization.cubeDirichletH1CompetitorLiftRegularity d + +/-- Public Chapter 1 sharpened Dirichlet `H²` divergence-RHS competitor +regularity input behind the formal H¹ lift wrapper. -/ +theorem cubeDirichletDivergenceH2CompetitorRegularity + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceH2CompetitorRegularity d := + Homogenization.cubeDirichletDivergenceH2CompetitorRegularity d + +/-- Public Chapter 1 weak-divergence realization bridge behind the sharpened +Dirichlet `H²` competitor theorem. -/ +theorem cubeVectorH1DivergencePoissonRealization + (d : ℕ) [NeZero d] : + CubeVectorH1DivergencePoissonRealization d := + Homogenization.cubeVectorH1DivergencePoissonRealization d + +/-- Public Chapter 1 two-constant endpoint construction input for pointwise +K-functional regularity. -/ +theorem cubeDirichletKEndpointCompetitorConstruction + (d : ℕ) [NeZero d] : + CubeDirichletKEndpointCompetitorConstruction d := + Homogenization.cubeDirichletKEndpointCompetitorConstruction d + +/-- Public Chapter 1 endpoint decomposition input for pointwise K-functional +regularity. -/ +theorem cubeDirichletKEndpointDecomposition + (d : ℕ) [NeZero d] : + CubeDirichletKEndpointDecomposition d := + Homogenization.cubeDirichletKEndpointDecomposition d + +/-- Public Chapter 1 focused components for the K-functional Dirichlet +regularity theorem. -/ +theorem cubeKBesovDirichletRegularityComponents + (d : ℕ) [NeZero d] : + CubeKBesovDirichletRegularityComponents d := + Homogenization.cubeKBesovDirichletRegularityComponents d + +/-- Public Chapter 1 PDE/K-functional input: boundedness of the zero-Dirichlet +divergence solution operator in the canonical K-functional Besov norm. -/ +theorem cubeKBesovDirichletRegularity + (d : ℕ) [NeZero d] : + CubeKBesovDirichletRegularity (cubeKBesovNormModel d) := + Homogenization.cubeKBesovDirichletRegularity d + +/-- Legacy-local name for the discrete compatibility theorem; it is not the +source theorem pending the continuum `K`/`H^s` gate. -/ +theorem constantCoefficientDirichletBesovFunctionSpaces + (d : ℕ) [NeZero d] : + ConstantCoefficientDirichletBesovFunctionSpaces d := + Homogenization.discreteConstantCoefficientDirichletBesovFunctionSpaces d + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeNeumannCZ.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeNeumannCZ.lean new file mode 100644 index 0000000000..2533294db0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CubeNeumannCZ.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Regularity + +/-! +# Legacy Chapter 1 Neumann compatibility facade + +This module is deliberately quarantined in +`Homogenization.Book.Ch01.Legacy`. Its selected constant and regularity +theorem alias a downstream positive-test estimate; they are not the literal +weak-Hessian Calderon--Zygmund statement from the manuscript. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +namespace Legacy + +open scoped ENNReal + +/-- Legacy selected constant for the downstream Neumann positive-test +compatibility package on cubes. -/ +noncomputable abbrev cubeNeumannW22Constant (d : ℕ) [NeZero d] : ℝ := + Homogenization.Legacy.cubeNeumannW22CalderonZygmundConstant d + +theorem cubeNeumannW22Constant_nonneg (d : ℕ) [NeZero d] : + 0 ≤ cubeNeumannW22Constant d := by + simpa [cubeNeumannW22Constant] using + Homogenization.Legacy.cubeNeumannW22CalderonZygmundConstant_nonneg d + +/-- Legacy cube Neumann positive-test compatibility theorem. This is not the +literal weak-Hessian Calderon--Zygmund theorem. -/ +theorem cubeNeumannW22Regularity {d : ℕ} [NeZero d] (Q : Cube d) : + Homogenization.Legacy.CubeNeumannW22CalderonZygmundRegularity Q + (cubeNeumannW22Constant d) := by + simpa [cubeNeumannW22Constant] using + Homogenization.Legacy.cubeNeumannW22CalderonZygmundRegularity Q + +/-- Dimension-uniform existence form of the legacy cube Neumann positive-test +compatibility package. -/ +theorem exists_cubeNeumannW22RegularityInDimension (d : ℕ) [NeZero d] : + ∃ C : ℝ, + Homogenization.Legacy.CubeNeumannW22CalderonZygmundRegularityInDimension d C := + Homogenization.Legacy.exists_cubeNeumannW22CalderonZygmundRegularityInDimension d + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CutoffProduct.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CutoffProduct.lean new file mode 100644 index 0000000000..5ac5565a70 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/CutoffProduct.lean @@ -0,0 +1,420 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise + +/-! # Cutoff Product -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Cutoff/product estimate + +This file retains the legacy disjoint-positive, totalized-real, +componentwise-circ compatibility surface for the cutoff/product Besov estimate +used later in the coarse Caccioppoli argument. It is not the exact manuscript +overlap/Euclidean statement. It is stated for a general smooth vector cutoff +field `ξ`; in the notes this is applied to `ξ = ∇φ`. +-/ + +namespace Legacy + +/-- Legacy finite-depth cutoff/product compatibility estimate in the +disjoint-positive, totalized-real, componentwise-circ Besov convention; not +an exact manuscript overlap/Euclidean statement. + +This is the pure product estimate. Poincare, full-dual, and circ-budget +inputs belong to downstream corollaries, not to the Chapter 1 product surface. -/ +theorem cutoffProductPositiveBesov_partial {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - normalizedAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + + normalizedLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + simpa [normalizedAverage, normalizedLpNorm] using! + Homogenization.cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N u ξ hB hu hξLp hξ hderiv + +/-- Depth zero of the scalar positive Besov seminorm of a fluctuation is the +top-scale normalized `L²` norm. -/ +private theorem cubeBesovDepthSeminorm_two_depth_zero_fluctuation_eq + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 = + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + have hfluct : cubeFluctuation Q (cubeFluctuation Q u) = cubeFluctuation Q u := + cubeFluctuation_cubeFluctuation_of_memLp_two Q Q hu + have hnonneg : 0 ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := + cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + have hsq : + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) = + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + simpa using sq_rpow_half_eq_of_nonneg hnonneg + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 + = + cubeBesovScaleWeight s Q * + ((cubeLpNorm Q (2 : ℝ≥0∞) + (cubeFluctuation Q (cubeFluctuation Q u))) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage, descendantsAverage, + cubeBesovOscillation] + _ = + cubeBesovScaleWeight s Q * + ((cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + rw [hfluct] + _ = cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + rw [hsq] + +private theorem cubeBesovDepthSeminorm_le_partialNormTop_of_mem_range + {d : ℕ} (Q : Cube d) (s : ℝ) (M j : ℕ) (u : Vec d → ℝ) + (hj : j ∈ Finset.range (M + 1)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u := by + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M u := by + unfold cubeBesovPartialSeminormTop + exact Finset.le_sup' (s := Finset.range (M + 1)) + (f := fun k => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u k) hj + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M u := by + unfold cubeBesovPartialNormTop + exact le_add_of_nonneg_right + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +private theorem cubeBesovScaleWeight_mul_cubeLpNorm_fluctuation_le_partialNormTop + {d : ℕ} (Q : Cube d) (s : ℝ) (M : ℕ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + calc + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + = cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 := by + rw [cubeBesovDepthSeminorm_two_depth_zero_fluctuation_eq Q s u hu] + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + exact cubeBesovDepthSeminorm_le_partialNormTop_of_mem_range Q s M 0 + (cubeFluctuation Q u) (by simp) + +private theorem cubeL2ScalarDepthSeminorm_le_cubeLpNorm_two_of_lt_one + {d : ℕ} (Q : Cube d) (s : ℝ) (j : ℕ) (v : Vec d → ℝ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs1 : s < 1) : + cubeL2ScalarDepthSeminorm Q (s - 1) v j ≤ + cubeLpNorm Q (2 : ℝ≥0∞) v := by + rw [cubeL2ScalarDepthSeminorm_eq_rpow_mul_cubeLpNorm_two Q (s - 1) v j hv] + have hweight : + Real.rpow (3 : ℝ) ((s - 1) * (j : ℝ)) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) (by + have hj : 0 ≤ (j : ℝ) := by exact_mod_cast Nat.zero_le j + nlinarith) + exact mul_le_of_le_one_left (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) v) hweight + +private theorem cubeBesovScaleWeight_mul_cubeL2ScalarDepthSeminorm_fluctuation_le_partialNormTop + {d : ℕ} (Q : Cube d) (s : ℝ) (M j : ℕ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs1 : s < 1) : + cubeBesovScaleWeight s Q * + cubeL2ScalarDepthSeminorm Q (s - 1) (cubeFluctuation Q u) j ≤ + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + have hfluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hL2 : + cubeL2ScalarDepthSeminorm Q (s - 1) (cubeFluctuation Q u) j ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := + cubeL2ScalarDepthSeminorm_le_cubeLpNorm_two_of_lt_one Q s j + (cubeFluctuation Q u) hfluct hs1 + calc + cubeBesovScaleWeight s Q * + cubeL2ScalarDepthSeminorm Q (s - 1) (cubeFluctuation Q u) j + ≤ cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + exact mul_le_mul_of_nonneg_left hL2 (cubeBesovScaleWeight_nonneg s Q) + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := + cubeBesovScaleWeight_mul_cubeLpNorm_fluctuation_le_partialNormTop Q s M u hu + +private theorem cubeBesovScaleWeight_mul_positiveScalarDepthSeminorm_le_partialNormTop + {d : ℕ} (Q : Cube d) (s : ℝ) (M j : ℕ) (v : Vec d → ℝ) + (hj : j ∈ Finset.range (M + 1)) : + cubeBesovScaleWeight s Q * + cubeBesovPositiveScalarDepthSeminorm Q s v j ≤ + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v := by + calc + cubeBesovScaleWeight s Q * cubeBesovPositiveScalarDepthSeminorm Q s v j + = + (cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j := by + rw [cubeBesovPositiveScalarDepthSeminorm_eq_scaleWeight_neg_mul_cubeBesovDepthSeminorm_two] + ring + _ = cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j := by + have hmul : cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + rw [hmul] + ring + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v := + cubeBesovDepthSeminorm_le_partialNormTop_of_mem_range Q s M j v hj + +private theorem cubeAverage_component_scalar_smul_le_linf_mul_l2 + {d : ℕ} (Q : Cube d) (v : Vec d → ℝ) (ξ : Vec d → Vec d) (i : Fin d) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + ‖cubeAverage Q (fun x => (v x • ξ x) i)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) v := by + have hcoord : + ‖cubeAverage Q (fun x => (v x • ξ x) i)‖ ≤ + ‖cubeAverageVec Q (fun x => v x • ξ x)‖ := by + simpa [cubeAverageVec] using + norm_le_pi_norm (cubeAverageVec Q (fun x => v x • ξ x)) i + exact hcoord.trans + (norm_cubeAverageVec_scalar_smul_le_cubeLpNorm_infty_mul_cubeLpNorm_two Q v ξ hv hξLp) + +theorem cutoffProduct_component_partialNormTop_le_gradient_rhs + {d : ℕ} [NeZero d] (Q : Cube d) (s : ℝ) (M : ℕ) + (u : H1Function (openCubeSet Q)) (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (i : Fin d) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M + (fun x => (cubeFluctuation Q (fun y => u y) x • ξ x) i) ≤ + (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ ξ) * + ((fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + let v : Vec d → ℝ := cubeFluctuation Q (fun x => u x) + let F : Vec d → Vec d := fun x => v x • ξ x + let P : ℝ := + (fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + have hu : MeasureTheory.MemLp (fun x => u x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + u.memL2_normalizedCubeMeasure + have hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q (fun x => u x))) + have hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + simpa [F, v] using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hv + have hP : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v ≤ P := by + simpa [P, v] using + h1_fluctuation_partialNormTop_two_le_sum_grad_circNorm Q s M u hs0 hs1 + have hsemi : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M (fun x => F x i) ≤ + 2 * (cubeScaleFactor Q * B * P + cubeLpNorm Q ∞ ξ * P) := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le + (s := Finset.range (M + 1)) + (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j) ?_ + intro j hj + have hcomponent : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s F j := + cubeBesovDepthSeminorm_two_component_le_scaleWeight_mul_positiveVectorDepthSeminorm + Q s F i j hF + have hdepth : + cubeBesovPositiveVectorDepthSeminorm Q s F j ≤ + 2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j) := by + simpa [F, v] using + cubeBesovPositiveVectorDepthSeminorm_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s j v ξ hB hv hξLp hξ hderiv + have hscaled : + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s F j ≤ + cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j)) := by + exact mul_le_mul_of_nonneg_left hdepth (cubeBesovScaleWeight_nonneg s Q) + have hterm1 : + cubeBesovScaleWeight s Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j ≤ P := by + calc + cubeBesovScaleWeight s Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j + ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v := by + simpa [v] using + cubeBesovScaleWeight_mul_cubeL2ScalarDepthSeminorm_fluctuation_le_partialNormTop + Q s M j (fun x => u x) hu hs1 + _ ≤ P := hP + have hterm2 : + cubeBesovScaleWeight s Q * cubeBesovPositiveScalarDepthSeminorm Q s v j ≤ P := by + calc + cubeBesovScaleWeight s Q * cubeBesovPositiveScalarDepthSeminorm Q s v j + ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v := + cubeBesovScaleWeight_mul_positiveScalarDepthSeminorm_le_partialNormTop + Q s M j v hj + _ ≤ P := hP + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s F j := + hcomponent + _ ≤ cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j)) := + hscaled + _ = 2 * (cubeScaleFactor Q * B * + (cubeBesovScaleWeight s Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight s Q * cubeBesovPositiveScalarDepthSeminorm Q s v j)) := by + ring + _ ≤ 2 * (cubeScaleFactor Q * B * P + cubeLpNorm Q ∞ ξ * P) := by + refine mul_le_mul_of_nonneg_left ?_ (by norm_num) + exact add_le_add + (mul_le_mul_of_nonneg_left hterm1 + (mul_nonneg (cubeScaleFactor_nonneg Q) hB)) + (mul_le_mul_of_nonneg_left hterm2 (cubeLpNorm_nonneg Q ∞ ξ)) + have hL2top : + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) v ≤ P := by + calc + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) v + ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M v := by + simpa [v] using + cubeBesovScaleWeight_mul_cubeLpNorm_fluctuation_le_partialNormTop + Q s M (fun x => u x) hu + _ ≤ P := hP + have havg : + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => F x i)‖ ≤ + cubeLpNorm Q ∞ ξ * P := by + have hraw : + ‖cubeAverage Q (fun x => F x i)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) v := by + simpa [F] using cubeAverage_component_scalar_smul_le_linf_mul_l2 Q v ξ i hv hξLp + calc + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => F x i)‖ + ≤ cubeBesovScaleWeight s Q * + (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) v) := by + exact mul_le_mul_of_nonneg_left hraw (cubeBesovScaleWeight_nonneg s Q) + _ = cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) v) := by + ring + _ ≤ cubeLpNorm Q ∞ ξ * P := by + exact mul_le_mul_of_nonneg_left hL2top (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (fun x => F x i) + = + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M (fun x => F x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => F x i)‖ := by + rfl + _ ≤ 2 * (cubeScaleFactor Q * B * P + cubeLpNorm Q ∞ ξ * P) + + cubeLpNorm Q ∞ ξ * P := by + exact add_le_add hsemi havg + _ = (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ ξ) * P := by + ring + +private theorem cutoffProduct_component_positiveBesovNormTop_le_gradient_rhs + {d : ℕ} [NeZero d] (Q : Cube d) (s : ℝ) + (u : H1Function (openCubeSet Q)) (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (i : Fin d) : + positiveBesovNormTop Q s (2 : ℝ≥0∞) + (fun x => ((u x - normalizedAverage Q (fun y => u y)) • ξ x) i) ≤ + (2 * cubeScaleFactor Q * B + 3 * normalizedLpNorm Q ∞ ξ) * + ((fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + unfold positiveBesovNormTop + refine csSup_le ?_ ?_ + · exact + ⟨cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) 1 + (fun x => ((u x - normalizedAverage Q (fun y => u y)) • ξ x) i), ⟨0, by simp⟩⟩ + · intro r hr + rcases hr with ⟨N, rfl⟩ + simpa [normalizedAverage, normalizedLpNorm, cubeFluctuation] using + cutoffProduct_component_partialNormTop_le_gradient_rhs + Q s (N + 1) u ξ hB hξLp hξ hderiv hs0 hs1 i + +/-- Legacy infinite-depth cutoff/product compatibility estimate with the +disjoint-positive, totalized-real, componentwise-circ H1-facing right-hand +side; not an exact manuscript overlap/Euclidean statement. + +The vector Besov norm is the componentwise public convention +`positiveBesovVectorNormTop`. The estimate has no finite-depth parameter and +no local-multiscale or projected-Poincare contract hypotheses; all function-side +control is supplied by the already-proved `H¹` gradient-to-function corridor. -/ +theorem cutoffProductPositiveBesov_infinite_from_h1 {d : ℕ} [NeZero d] + (Q : Cube d) (s : ℝ) (u : H1Function (openCubeSet Q)) + (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) : + positiveBesovVectorNormTop Q s (2 : ℝ≥0∞) + (fun x => (u x - normalizedAverage Q (fun y => u y)) • ξ x) ≤ + (d : ℝ) * + (2 * cubeScaleFactor Q * B + 3 * normalizedLpNorm Q ∞ ξ) * + ((fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + let K : ℝ := + (2 * cubeScaleFactor Q * B + 3 * normalizedLpNorm Q ∞ ξ) * + ((fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) + have hcomponent : + ∀ i : Fin d, + positiveBesovNormTop Q s (2 : ℝ≥0∞) + (fun x => (((u x - normalizedAverage Q (fun y => u y)) • ξ x) i)) ≤ K := by + intro i + simpa [K] using + cutoffProduct_component_positiveBesovNormTop_le_gradient_rhs + Q s u ξ hB hξLp hξ hderiv hs0 hs1 i + calc + positiveBesovVectorNormTop Q s (2 : ℝ≥0∞) + (fun x => (u x - normalizedAverage Q (fun y => u y)) • ξ x) + ≤ ∑ _i : Fin d, K := by + unfold positiveBesovVectorNormTop + exact Finset.sum_le_sum fun i _hi => hcomponent i + _ = (d : ℝ) * K := by + simp [K, Fintype.card_fin, mul_assoc] + _ = + (d : ℝ) * + (2 * cubeScaleFactor Q * B + 3 * normalizedLpNorm Q ∞ ξ) * + ((fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + simp [K, mul_assoc] + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss.lean new file mode 100644 index 0000000000..eb950be60f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.FiniteLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.ProjectionTests + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/FiniteLoss.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/FiniteLoss.lean new file mode 100644 index 0000000000..a227043eb3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/FiniteLoss.lean @@ -0,0 +1,588 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.ProjectionTests + +/-! # Finite Loss -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 +namespace Legacy + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Dual-to-circ finite loss + +Legacy finite-truncation loss estimates for the totalized-real, +disjoint/componentwise compatibility lane. They are not the exact `ENNReal` +overlap/dual/circ kernels. +-/ + +private theorem three_rpow_nonneg (x : ℝ) : 0 ≤ Real.rpow (3 : ℝ) x := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) x + +private theorem cubeBesovNegativeVectorDepthAverage_eq_sum_sq_cubeLpNorm_projection_two {d : ℕ} + (Q : Cube d) (F : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q F j = + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i))) ^ (2 : ℕ) := by + unfold cubeBesovNegativeVectorDepthAverage + calc + descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R F)) + = + descendantsAverage Q j + (fun R => ∑ i : Fin d, (cubeAverage R (fun x => F x i)) ^ (2 : ℕ)) := by + congr 1 + funext R + simp [vecNormSq, vecDot, cubeAverageVec, pow_two] + _ = + ∑ i : Fin d, + descendantsAverage Q j + (fun R => (cubeAverage R (fun x => F x i)) ^ (2 : ℕ)) := by + simpa using + descendantsAverage_sum Q j Finset.univ + (fun R i => (cubeAverage R (fun x => F x i)) ^ (2 : ℕ)) + _ = + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i))) ^ (2 : ℕ) := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hscalar := + cubeBesovCircDepthAverage_eq_sq_cubeLpNorm_projection_two + Q j (fun x => F x i) + simpa [cubeBesovCircDepthAverage, Real.rpow_natCast, Real.norm_eq_abs, + pow_two] using hscalar + +private theorem cubeBesovNegativeVectorDepthSeminorm_le_sum_component_projection_l2 {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q s F j ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i)) := by + have havg := + cubeBesovNegativeVectorDepthAverage_eq_sum_sq_cubeLpNorm_projection_two Q F j + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q F j) ≤ + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i)) := by + rw [havg] + exact sqrt_sum_sq_le_sum Finset.univ + (fun i => cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i))) + (fun i hi => cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (cubeProjection Q j (fun x => F x i))) + unfold cubeBesovNegativeVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left hsqrt + (three_rpow_nonneg _) + +/-- Finite-depth coefficient in the lossy true-dual-to-circ comparison. The +outer `j` sum is the negative Besov scale sum, and the inner `k` sum is the +positive test norm of the depth-`j` projection. -/ +noncomputable def dualToCircFiniteLossCoefficient (s t : ℝ) (N : ℕ) : ℝ := + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + +theorem dualToCircFiniteLossCoefficient_nonneg (s t : ℝ) (N : ℕ) : + 0 ≤ dualToCircFiniteLossCoefficient s t N := by + unfold dualToCircFiniteLossCoefficient + refine Finset.sum_nonneg ?_ + intro j hj + exact mul_nonneg + (three_rpow_nonneg _) + (add_nonneg zero_le_one + (Finset.sum_nonneg fun k hk => + mul_nonneg (by norm_num) (three_rpow_nonneg _))) + +/-- Explicit geometric coefficient bounding the finite loss coefficients when +`0 < t < s`. -/ +noncomputable def dualToCircGeometricLossCoefficient (s t : ℝ) : ℝ := + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (2 * (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + (1 - Real.rpow (3 : ℝ) (-(s - t)))⁻¹ + +private theorem sum_range_pow_sub_le_geom {r : ℝ} + (hr0 : 0 ≤ r) (hr1 : r < 1) (j : ℕ) : + (∑ k ∈ Finset.range j, r ^ (j - k)) ≤ (1 - r)⁻¹ := by + have hreflect : + (∑ k ∈ Finset.range j, r ^ (j - k)) = + ∑ k ∈ Finset.range j, r ^ (k + 1) := by + rw [← Finset.sum_range_reflect (fun m : ℕ => r ^ (m + 1)) j] + refine Finset.sum_congr rfl ?_ + intro k hk + congr 1 + have hklt : k < j := Finset.mem_range.mp hk + omega + calc + (∑ k ∈ Finset.range j, r ^ (j - k)) + = ∑ k ∈ Finset.range j, r ^ (k + 1) := hreflect + _ ≤ ∑ k ∈ Finset.range j, r ^ k := by + refine Finset.sum_le_sum ?_ + intro k hk + exact pow_le_pow_of_le_one hr0 hr1.le (Nat.le_succ k) + _ ≤ (1 - r)⁻¹ := geom_sum_range_le_of_lt_one hr0 hr1 + +private theorem dualToCirc_inner_weighted_sum_le {s t : ℝ} + (ht : 0 < t) (j : ℕ) : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) ≤ + 2 * (1 - Real.rpow (3 : ℝ) (-t))⁻¹ * + Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) := by + let r : ℝ := Real.rpow (3 : ℝ) (-t) + let A : ℝ := Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) + have hr0 : 0 ≤ r := by + dsimp [r] + exact three_rpow_nonneg _ + have hr1 : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hA0 : 0 ≤ A := by + dsimp [A] + exact three_rpow_nonneg _ + have hsum_eq : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) = + (2 * A) * ∑ k ∈ Finset.range j, r ^ (j - k) := by + rw [Finset.mul_sum, Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + have hkj : k ≤ j := Nat.le_of_lt (Finset.mem_range.mp hk) + have hterm : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) = + (2 * Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ))) * + (Real.rpow (3 : ℝ) (-t)) ^ (j - k) := by + have hpow : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (t * (k : ℝ)) = + Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-t * ((j - k : ℕ) : ℝ)) := by + change ((3 : ℝ) ^ (-s * (j : ℝ))) * + ((3 : ℝ) ^ (t * (k : ℝ))) = + ((3 : ℝ) ^ (-(s - t) * (j : ℝ))) * + ((3 : ℝ) ^ (-t * ((j - k : ℕ) : ℝ))) + rw [← Real.rpow_add (by norm_num : 0 < (3 : ℝ)), + ← Real.rpow_add (by norm_num : 0 < (3 : ℝ))] + congr 1 + rw [Nat.cast_sub hkj] + ring + have hsub : + Real.rpow (3 : ℝ) (-t * ((j - k : ℕ) : ℝ)) = + (Real.rpow (3 : ℝ) (-t)) ^ (j - k) := by + simpa using + (Real.rpow_mul_natCast (by norm_num : 0 ≤ (3 : ℝ)) (-t) (j - k)) + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + = 2 * (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (t * (k : ℝ))) := by ring + _ = 2 * (Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-t * ((j - k : ℕ) : ℝ))) := by + rw [hpow] + _ = 2 * (Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) * + (Real.rpow (3 : ℝ) (-t)) ^ (j - k)) := by + rw [hsub] + _ = (2 * Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ))) * + (Real.rpow (3 : ℝ) (-t)) ^ (j - k) := by ring + simpa [A, r] using hterm + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + = (2 * A) * ∑ k ∈ Finset.range j, r ^ (j - k) := hsum_eq + _ ≤ (2 * A) * (1 - r)⁻¹ := by + exact mul_le_mul_of_nonneg_left + (sum_range_pow_sub_le_geom hr0 hr1 j) + (mul_nonneg (by norm_num) hA0) + _ = 2 * (1 - Real.rpow (3 : ℝ) (-t))⁻¹ * + Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) := by + dsimp [A, r] + ring + +theorem dualToCircFiniteLossCoefficient_le_geometric {s t : ℝ} + (_hs : 0 < s) (ht : 0 < t) (hst : t < s) (N : ℕ) : + dualToCircFiniteLossCoefficient s t N ≤ + dualToCircGeometricLossCoefficient s t := by + let rs : ℝ := Real.rpow (3 : ℝ) (-s) + let rt : ℝ := Real.rpow (3 : ℝ) (-t) + let rho : ℝ := Real.rpow (3 : ℝ) (-(s - t)) + let K : ℝ := 2 * (1 - rt)⁻¹ + have hrs0 : 0 ≤ rs := by + dsimp [rs] + exact three_rpow_nonneg _ + have hrho0 : 0 ≤ rho := by + dsimp [rho] + exact three_rpow_nonneg _ + have hrs1 : rs < 1 := by + dsimp [rs] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hrt1 : rt < 1 := by + dsimp [rt] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hrho1 : rho < 1 := by + dsimp [rho] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hK0 : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by norm_num) (inv_nonneg.mpr (sub_nonneg.mpr hrt1.le)) + have hterm : + ∀ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, + 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) ≤ + rs ^ j + K * rho ^ j := by + intro j hj + have hrs_eq : Real.rpow (3 : ℝ) (-s * (j : ℝ)) = rs ^ j := by + dsimp [rs] + simpa using (Real.rpow_mul_natCast (by norm_num : 0 ≤ (3 : ℝ)) (-s) j) + have hrho_eq : + Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) = rho ^ j := by + dsimp [rho] + simpa using + (Real.rpow_mul_natCast (by norm_num : 0 ≤ (3 : ℝ)) (-(s - t)) j) + have hinner := dualToCirc_inner_weighted_sum_le (s := s) (t := t) ht j + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, + 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + = Real.rpow (3 : ℝ) (-s * (j : ℝ)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (∑ k ∈ Finset.range j, + 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + ring + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) + + 2 * (1 - Real.rpow (3 : ℝ) (-t))⁻¹ * + Real.rpow (3 : ℝ) (-(s - t) * (j : ℝ)) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hinner (Real.rpow (3 : ℝ) (-s * (j : ℝ))) + _ = rs ^ j + K * rho ^ j := by + rw [hrs_eq, hrho_eq] + unfold dualToCircFiniteLossCoefficient + calc + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + ≤ ∑ j ∈ Finset.range (N + 1), (rs ^ j + K * rho ^ j) := by + exact Finset.sum_le_sum hterm + _ = (∑ j ∈ Finset.range (N + 1), rs ^ j) + + K * (∑ j ∈ Finset.range (N + 1), rho ^ j) := by + rw [Finset.sum_add_distrib, Finset.mul_sum] + _ ≤ (1 - rs)⁻¹ + K * (1 - rho)⁻¹ := by + exact add_le_add + (geom_sum_range_le_of_lt_one hrs0 hrs1) + (mul_le_mul_of_nonneg_left + (geom_sum_range_le_of_lt_one hrho0 hrho1) hK0) + _ = dualToCircGeometricLossCoefficient s t := by + dsimp [dualToCircGeometricLossCoefficient, rs, rt, rho, K] + +/-- Half-exponent geometric loss with a simple note-style `s^{-2}` bound. -/ +theorem dualToCircGeometricLossCoefficient_half_le_fiftyFive_inv_sq {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + dualToCircGeometricLossCoefficient s (s / 2) ≤ 55 * (s⁻¹) ^ (2 : ℕ) := by + let X : ℝ := s⁻¹ + let A : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let B₁ : ℝ := (1 - Real.rpow (3 : ℝ) (-(s / 2)))⁻¹ + let B₂ : ℝ := (1 - Real.rpow (3 : ℝ) (-(s - s / 2)))⁻¹ + have hX_nonneg : 0 ≤ X := by + dsimp [X] + exact inv_nonneg.mpr hs.le + have hX_ge_one : 1 ≤ X := by + dsimp [X] + exact (one_le_inv₀ hs).2 hs_le + have hA : A ≤ 5 * X := by + dsimp [A, X] + exact Homogenization.inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have hB₁ : B₁ ≤ 5 * X := by + dsimp [B₁, X] + simpa [neg_div] using + Homogenization.inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + have hB₂ : B₂ ≤ 5 * X := by + dsimp [B₂, X] + have hrewrite : -(s - s / 2) = -s / 2 := by ring + simpa [hrewrite] using + Homogenization.inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + have hB₁_nonneg : 0 ≤ B₁ := by + dsimp [B₁] + have hr_lt : + Real.rpow (3 : ℝ) (-(s / 2)) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by nlinarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt.le) + have hB₂_nonneg : 0 ≤ B₂ := by + dsimp [B₂] + have hr_lt : + Real.rpow (3 : ℝ) (-(s - s / 2)) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by nlinarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt.le) + have hA_sq : A ≤ 5 * X ^ (2 : ℕ) := by + nlinarith [hA, hX_nonneg, hX_ge_one] + have hB_sq : (2 * B₁) * B₂ ≤ 50 * X ^ (2 : ℕ) := by + nlinarith [hB₁, hB₂, hB₁_nonneg, hB₂_nonneg, hX_nonneg] + unfold dualToCircGeometricLossCoefficient + change A + (2 * B₁) * B₂ ≤ 55 * X ^ (2 : ℕ) + nlinarith + +/-- Half-exponent finite loss coefficient bounded by the explicit +`55 * s^{-2}` note-style loss. -/ +theorem dualToCircFiniteLossCoefficient_half_le_fiftyFive_inv_sq + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (N : ℕ) : + dualToCircFiniteLossCoefficient s (s / 2) N ≤ 55 * (s⁻¹) ^ (2 : ℕ) := + (dualToCircFiniteLossCoefficient_le_geometric hs (by nlinarith) (by nlinarith) N).trans + (dualToCircGeometricLossCoefficient_half_le_fiftyFive_inv_sq hs hs_le) + +/-- Componentwise vector-valued genuine dual negative Besov norm, normalized by +the parent cube scale, in the legacy totalized-real compatibility lane. This +is distinct from the exact `ENNReal` overlap/dual/circ kernels. -/ +noncomputable def normalizedDualNegativeBesovVectorNormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + cubeBesovScaleWeight s Q * + ∑ i : Fin d, + dualNegativeBesovNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + +theorem normalizedDualNegativeBesovVectorNormTwo_nonneg {d : ℕ} + (Q : Cube d) (s : ℝ) (F : Vec d → Vec d) : + 0 ≤ normalizedDualNegativeBesovVectorNormTwo Q s F := by + unfold normalizedDualNegativeBesovVectorNormTwo + exact mul_nonneg + (cubeBesovScaleWeight_nonneg s Q) + (Finset.sum_nonneg fun i _ => + cubeBesovDualFullNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + cubeBesovConjExponent_two_ne_zero_dualToCirc + cubeBesovConjExponent_two_ne_top_dualToCirc) + +private theorem memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 {d : ℕ} + (Q : Cube d) {F : Vec d → Vec d} + (hF : MemVectorL2 (cubeSet Q) F) : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hfCube : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemVectorL2, volumeMeasureOn] using hF + exact + hfCube.of_measure_le_smul (c := ENNReal.ofReal ((cubeVolume Q)⁻¹)) + ENNReal.ofReal_ne_top (by rw [normalizedCubeMeasure, cubeMeasure]) + +theorem component_memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 {d : ℕ} + (Q : Cube d) {F : Vec d → Vec d} + (hF : MemVectorL2 (cubeSet Q) F) : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [π, Function.comp_def, ContinuousLinearMap.proj_apply] using! + π.comp_memLp' (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 Q hF) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_le_dualToCircFiniteLossCoefficient_mul_normalizedDual + {d : ℕ} (Q : Cube d) (F : Vec d → Vec d) {s t : ℝ} (N : ℕ) + (ht : 0 < t) + (hF : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ + dualToCircFiniteLossCoefficient s t N * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + have hpartial_one : + cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ + cubeBesovNegativeVectorPartialSeminorm Q s N F := + cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm Q s N F + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s F j ≤ + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ)))) * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + intro j hj + have hproj : + ∀ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i)) ≤ + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) * + cubeProjectionPositiveTestCoefficientTwo Q t j := by + intro i + exact cubeLpNorm_projection_le_dualFullNorm_mul_positiveTestCoefficient_two + Q t j (fun x => F x i) ht (hF i) + have hsum_proj : + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i)) ≤ + cubeProjectionPositiveTestCoefficientTwo Q t j * + ∑ i : Fin d, + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) := by + calc + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j (fun x => F x i)) + ≤ + ∑ i : Fin d, + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) * + cubeProjectionPositiveTestCoefficientTwo Q t j := by + exact Finset.sum_le_sum fun i hi => hproj i + _ = + cubeProjectionPositiveTestCoefficientTwo Q t j * + ∑ i : Fin d, + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) := by + rw [← Finset.sum_mul] + ring + have hcoeff_eq : + cubeProjectionPositiveTestCoefficientTwo Q t j = + cubeBesovScaleWeight t Q * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + unfold cubeProjectionPositiveTestCoefficientTwo + have hsum_factor : + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) = + cubeBesovScaleWeight t Q * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + calc + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) + = + ∑ k ∈ Finset.range j, + cubeBesovScaleWeight t Q * + (2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + refine Finset.sum_congr rfl ?_ + intro k hk + ring + _ = + cubeBesovScaleWeight t Q * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + rw [← Finset.mul_sum (s := Finset.range j) + (f := fun k : ℕ => 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + (a := cubeBesovScaleWeight t Q)] + calc + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) + + cubeBesovScaleWeight t Q + = + cubeBesovScaleWeight t Q * + (∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) + + cubeBesovScaleWeight t Q := by + rw [hsum_factor] + _ = + cubeBesovScaleWeight t Q * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ))) := by + ring + have hdepth_l2 := + cubeBesovNegativeVectorDepthSeminorm_le_sum_component_projection_l2 Q s F j + calc + cubeBesovNegativeVectorDepthSeminorm Q s F j + ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) + (cubeProjection Q j (fun x => F x i)) := hdepth_l2 + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (cubeProjectionPositiveTestCoefficientTwo Q t j * + ∑ i : Fin d, + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) := by + exact mul_le_mul_of_nonneg_left hsum_proj + (three_rpow_nonneg _) + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ)))) * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + unfold normalizedDualNegativeBesovVectorNormTwo + rw [hcoeff_eq] + ring + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N F + ≤ cubeBesovNegativeVectorPartialSeminorm Q s N F := hpartial_one + _ = ∑ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s F j := by + rfl + _ ≤ ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (1 + ∑ k ∈ Finset.range j, 2 * Real.rpow (3 : ℝ) (t * (k : ℝ)))) * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + exact Finset.sum_le_sum hdepth + _ = + dualToCircFiniteLossCoefficient s t N * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + unfold dualToCircFiniteLossCoefficient + rw [Finset.sum_mul] + +/-- +Full-seminorm form of the proved scale-by-scale true-dual-to-circ comparison, +parametrized by any uniform bound on the finite loss coefficient. + +The remaining scalar analytic work is to supply such a coefficient bound, for +example with `t = s / 2`, where the notes lose a power of `s⁻¹`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_le_dualToCircCoefficientBound_mul_normalizedDual + {d : ℕ} (Q : Cube d) (F : Vec d → Vec d) {s t C : ℝ} + (ht : 0 < t) + (hF : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcoeff : ∀ N : ℕ, dualToCircFiniteLossCoefficient s t N ≤ C) : + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + C * normalizedDualNegativeBesovVectorNormTwo Q t F := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s F ?_ + intro N + have hpartial : + cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ + dualToCircFiniteLossCoefficient s t N * + normalizedDualNegativeBesovVectorNormTwo Q t F := + cubeBesovNegativeVectorPartialSeminormTwo_le_dualToCircFiniteLossCoefficient_mul_normalizedDual + Q F N ht hF + exact hpartial.trans + (mul_le_mul_of_nonneg_right (hcoeff N) + (normalizedDualNegativeBesovVectorNormTwo_nonneg Q t F)) + +/-- Full finite-energy reverse comparison with the explicit geometric loss +coefficient. -/ +theorem cubeBesovNegativeVectorSeminormTwo_le_dualToCircGeometricLossCoefficient_mul_normalizedDual + {d : ℕ} (Q : Cube d) (F : Vec d → Vec d) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : t < s) + (hF : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + dualToCircGeometricLossCoefficient s t * + normalizedDualNegativeBesovVectorNormTwo Q t F := by + exact + cubeBesovNegativeVectorSeminormTwo_le_dualToCircCoefficientBound_mul_normalizedDual + Q F ht hF + (fun N => dualToCircFiniteLossCoefficient_le_geometric hs ht hst N) + +/-- Full finite-energy half-exponent reverse comparison with the explicit +`55 * s^{-2}` loss. -/ +theorem cubeBesovNegativeVectorSeminormTwo_le_halfDual_fiftyFive_inv_sq + {d : ℕ} (Q : Cube d) (F : Vec d → Vec d) {s : ℝ} + (hs : 0 < s) (hs_lt : s < 1) + (hF : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + (55 * (s⁻¹) ^ (2 : ℕ)) * + normalizedDualNegativeBesovVectorNormTwo Q (s / 2) F := by + exact + cubeBesovNegativeVectorSeminormTwo_le_dualToCircCoefficientBound_mul_normalizedDual + Q F (by nlinarith) hF + (fun N => dualToCircFiniteLossCoefficient_half_le_fiftyFive_inv_sq + hs hs_lt.le N) + +/-- Finite-energy half-exponent reverse comparison for fields supplied as +`L²` vector fields on the cube. -/ +theorem cubeBesovNegativeVectorSeminormTwo_le_halfDual_fiftyFive_inv_sq_of_memVectorL2 + {d : ℕ} (Q : Cube d) (F : Vec d → Vec d) {s : ℝ} + (hs : 0 < s) (hs_lt : s < 1) + (hF : MemVectorL2 (cubeSet Q) F) : + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + (55 * (s⁻¹) ^ (2 : ℕ)) * + normalizedDualNegativeBesovVectorNormTwo Q (s / 2) F := + cubeBesovNegativeVectorSeminormTwo_le_halfDual_fiftyFive_inv_sq + Q F hs hs_lt + (component_memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 Q hF) + +end + +end Legacy +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/ProjectionTests.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/ProjectionTests.lean new file mode 100644 index 0000000000..4f02fb19b6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/DualToCircLoss/ProjectionTests.lean @@ -0,0 +1,626 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CircDomination +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.NoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo + +/-! # Projection Tests -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 +namespace Legacy + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Dual-to-circ projection tests + +Legacy finite-truncation projection-test scaffolding for the totalized-real, +disjoint/componentwise compatibility lane. This is distinct from the exact +`ENNReal` overlap/dual/circ kernels. +-/ + +private theorem cubeBesovConjExponent_two_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +theorem cubeBesovConjExponent_two_ne_zero_dualToCirc : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [cubeBesovConjExponent_two_eq] + norm_num + +theorem cubeBesovConjExponent_two_ne_top_dualToCirc : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [cubeBesovConjExponent_two_eq] + norm_num + +private theorem cubeProjection_idempotent_on_cubeSet {d : ℕ} + (Q : Cube d) (j : ℕ) (f : Vec d → ℝ) : + ∀ x ∈ cubeSet Q, + cubeProjection Q j (cubeProjection Q j f) x = cubeProjection Q j f x := by + intro x hxQ + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := Q) (n := j) hxQ with + ⟨R, hR, hxR⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (f := cubeProjection Q j f) hR hxR] + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (f := f) hR hxR] + rw [cubeAverage_cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (g := f) hR] + +private theorem cubeProjection_add_self_projection_eq_on_cubeSet {d : ℕ} + (Q : Cube d) (j n : ℕ) (f : Vec d → ℝ) : + ∀ x ∈ cubeSet Q, + cubeProjection Q (j + n) (cubeProjection Q j f) x = + cubeProjection Q j f x := by + intro x hxQ + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := Q) (n := j) hxQ with + ⟨R, hR, hxR⟩ + rw [cubeProjection_add_eq_cubeProjection_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (n := n) (f := cubeProjection Q j f) hR hxR] + have hcongr : + cubeProjection R n (cubeProjection Q j f) = + cubeProjection R n (fun _ : Vec d => cubeAverage R f) := by + exact cubeProjection_congr_on_cubeSet (Q := R) (j := n) + (u := cubeProjection Q j f) (v := fun _ : Vec d => cubeAverage R f) + (by + intro y hy + exact cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (f := f) hR hy) + rw [hcongr] + rw [cubeProjection_const_of_mem_cubeSet R n (cubeAverage R f) hxR] + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (f := f) hR hxR] + +private theorem cubeBesovOscillation_cubeProjection_eq_zero_of_le {d : ℕ} + {Q R : Cube d} {j k : ℕ} (f : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q k) (hjk : j ≤ k) : + cubeBesovOscillation R (2 : ℝ≥0∞) (cubeProjection Q j f) = 0 := by + let P : Vec d → ℝ := cubeProjection Q j f + have hk : k = j + (k - j) := (Nat.add_sub_of_le hjk).symm + unfold cubeBesovOscillation + rw [cubeLpNorm_congr_on_cubeSet (Q := R) (p := (2 : ℝ≥0∞)) + (u := cubeFluctuation R P) (v := fun _ : Vec d => (0 : ℝ))] + · simp + intro x hxR + have hxQ : x ∈ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hR hxR + have hproj_to_avg : + cubeProjection Q k P x = cubeAverage R P := by + exact cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := k) (f := P) hR hxR + have hself : + cubeProjection Q k P x = P x := by + change cubeProjection Q k (cubeProjection Q j f) x = cubeProjection Q j f x + rw [hk] + exact cubeProjection_add_self_projection_eq_on_cubeSet Q j (k - j) f x hxQ + simp [cubeFluctuation, P, ← hself, hproj_to_avg] + +private theorem cubeProjection_memLp_on_normalizedCubeMeasure {d : ℕ} + (Q R : Cube d) (j : ℕ) (p : ℝ≥0∞) (f : Vec d → ℝ) : + MeasureTheory.MemLp (cubeProjection Q j f) p (normalizedCubeMeasure R) := by + classical + unfold cubeProjection + refine MeasureTheory.memLp_finsetSum + (s := descendantsAtDepth Q j) + (f := fun S : Cube d => fun x : Vec d => + if x ∈ cubeSet S then cubeAverage S f else 0) ?_ + intro S hS + have hS_ne_top : normalizedCubeMeasure R (cubeSet S) ≠ ∞ := by + have hS_le : normalizedCubeMeasure R (cubeSet S) ≤ normalizedCubeMeasure R Set.univ := + MeasureTheory.measure_mono (Set.subset_univ (cubeSet S)) + have hUniv_lt : normalizedCubeMeasure R Set.univ < ∞ := by simp + exact ne_of_lt (lt_of_le_of_lt hS_le hUniv_lt) + simpa [Set.indicator] using! + (MeasureTheory.memLp_indicator_const (μ := normalizedCubeMeasure R) + (p := p) (s := cubeSet S) (hs := measurableSet_cubeSet S) + (c := cubeAverage S f) (Or.inr hS_ne_top)) + +private theorem cubeProjection_dualLocalMemLpGlobal_two {d : ℕ} + (Q : Cube d) (j : ℕ) (f : Vec d → ℝ) : + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + intro n R hR + have hproj : + MeasureTheory.MemLp (cubeProjection Q j f) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + cubeProjection_memLp_on_normalizedCubeMeasure Q R j (2 : ℝ≥0∞) f + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage R (cubeProjection Q j f)) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + MeasureTheory.memLp_const _ + simpa [cubeBesovConjExponent_two_eq, cubeFluctuation, sub_eq_add_neg] using! + hproj.sub hconst + +private theorem cubeBesovOscillation_two_le_two_mul_cubeLpNorm_two {d : ℕ} + (Q : Cube d) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ + 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by + unfold cubeBesovOscillation cubeFluctuation + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => -cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const _ + have hadd : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => -cubeAverage Q u) := by + have hfun : + (fun x => u x - cubeAverage Q u) = + fun x => u x + (fun _ : Vec d => -cubeAverage Q u) x := by + funext x + simp [sub_eq_add_neg] + rw [hfun] + exact cubeLpNorm_add_le Q (2 : ℝ≥0∞) u (fun _ : Vec d => -cubeAverage Q u) + hu hconst (by norm_num) + calc + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u) + ≤ cubeLpNorm Q (2 : ℝ≥0∞) u + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => -cubeAverage Q u) := hadd + _ = cubeLpNorm Q (2 : ℝ≥0∞) u + ‖cubeAverage Q u‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) + (c := -cubeAverage Q u) (by norm_num)] + simp + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u + cubeLpNorm Q (2 : ℝ≥0∞) u := by + gcongr + exact norm_cubeAverage_le_cubeLpNorm_two Q u hu + _ = 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by ring + +private theorem cubeBesovDepthAverage_two_le_four_mul_cubeL2ScalarDepthAverage {d : ℕ} + (Q : Cube d) (u : Vec d → ℝ) (k : ℕ) + (hu : ∀ R ∈ descendantsAtDepth Q k, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k ≤ + 4 * cubeL2ScalarDepthAverage Q u k := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q k, + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℝ) ≤ + (2 * cubeLpNorm R (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + intro R hR + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + 2 * cubeLpNorm R (2 : ℝ≥0∞) u := + cubeBesovOscillation_two_le_two_mul_cubeLpNorm_two R u (hu R hR) + have hosc_nonneg : + 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hright_nonneg : + 0 ≤ 2 * cubeLpNorm R (2 : ℝ≥0∞) u := + mul_nonneg (by norm_num) (cubeLpNorm_nonneg R (2 : ℝ≥0∞) u) + have hsquare : + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℕ) ≤ + (2 * cubeLpNorm R (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + nlinarith + simpa [Real.rpow_natCast] using hsquare + calc + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k + ≤ descendantsAverage Q k + (fun R => (2 * cubeLpNorm R (2 : ℝ≥0∞) u) ^ (2 : ℕ)) := by + unfold cubeBesovDepthAverage + exact descendantsAverage_le_descendantsAverage Q k hpoint + _ = descendantsAverage Q k + (fun R => 4 * (cubeLpNorm R (2 : ℝ≥0∞) u) ^ (2 : ℕ)) := by + refine congrArg (descendantsAverage Q k) ?_ + funext R + ring + _ = 4 * cubeL2ScalarDepthAverage Q u k := by + rw [descendantsAverage_mul_left] + rfl + +private theorem cubeBesovDepthAverage_two_le_four_mul_sq_cubeLpNorm_two {d : ℕ} + (Q : Cube d) (u : Vec d → ℝ) (k : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k ≤ + 4 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + calc + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k + ≤ 4 * cubeL2ScalarDepthAverage Q u k := by + exact cubeBesovDepthAverage_two_le_four_mul_cubeL2ScalarDepthAverage Q u k + (fun R hR => memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := k) hR hu) + _ = 4 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + rw [cubeL2ScalarDepthAverage_eq_cubeLpNorm_two_sq Q u k hu] + +private theorem cubeBesovDepthSeminorm_two_le_two_mul_depthWeight_mul_cubeLpNorm_two {d : ℕ} + (Q : Cube d) (t : ℝ) (u : Vec d → ℝ) (k : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) u k ≤ + 2 * cubeBesovDepthWeight Q t k * cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hA : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k ≤ + 4 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := + cubeBesovDepthAverage_two_le_four_mul_sq_cubeLpNorm_two Q u k hu + have hsqrt : + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k) ≤ + 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hright_nonneg : + 0 ≤ 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := + mul_nonneg (by norm_num) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + calc + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k) + ≤ Real.sqrt (4 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ)) := + Real.sqrt_le_sqrt hA + _ = 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hsq : + 4 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) = + (2 * cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by ring + rw [hsq, Real.sqrt_sq_eq_abs, abs_of_nonneg hright_nonneg] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q t k := + cubeBesovDepthWeight_nonneg Q t k + have hrpow : + (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k) ^ (1 / 2 : ℝ) ≤ + 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by + simpa [Real.sqrt_eq_rpow] using hsqrt + unfold cubeBesovDepthSeminorm + norm_num + calc + cubeBesovDepthWeight Q t k * + (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u k) ^ (1 / 2 : ℝ) + ≤ cubeBesovDepthWeight Q t k * + (2 * cubeLpNorm Q (2 : ℝ≥0∞) u) := + mul_le_mul_of_nonneg_left hrpow hweight_nonneg + _ = 2 * cubeBesovDepthWeight Q t k * + cubeLpNorm Q (2 : ℝ≥0∞) u := by ring + +private theorem cubeBesovDepthSeminorm_cubeProjection_le {d : ℕ} + (Q : Cube d) (t : ℝ) (j k : ℕ) (f : Vec d → ℝ) : + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k ≤ + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + calc + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k + ≤ 2 * cubeBesovDepthWeight Q t k * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := + cubeBesovDepthSeminorm_two_le_two_mul_depthWeight_mul_cubeLpNorm_two + Q t (cubeProjection Q j f) k (cubeProjection_memLp Q j (2 : ℝ≥0∞) f) + _ = + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + rw [cubeBesovDepthWeight_eq_scaleWeight_mul_rpow] + ring + +private theorem cubeBesovDepthAverage_cubeProjection_eq_zero_of_le {d : ℕ} + {Q : Cube d} {j k : ℕ} (f : Vec d → ℝ) (hjk : j ≤ k) : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) (cubeProjection Q j f) k = 0 := by + unfold cubeBesovDepthAverage descendantsAverage + have hsum : + ∑ R ∈ descendantsAtDepth Q k, + (cubeBesovOscillation R (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ + (2 : ℝ) = 0 := by + refine Finset.sum_eq_zero ?_ + intro R hR + rw [cubeBesovOscillation_cubeProjection_eq_zero_of_le (Q := Q) (R := R) + (j := j) (k := k) f hR hjk] + norm_num + change ((descendantsAtDepth Q k).card : ℝ)⁻¹ * + (∑ R ∈ descendantsAtDepth Q k, + (cubeBesovOscillation R (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ + (2 : ℝ)) = 0 + rw [hsum, mul_zero] + +private theorem cubeBesovDepthSeminorm_cubeProjection_eq_zero_of_le {d : ℕ} + {Q : Cube d} (t : ℝ) {j k : ℕ} (f : Vec d → ℝ) (hjk : j ≤ k) : + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k = 0 := by + unfold cubeBesovDepthSeminorm + rw [cubeBesovDepthAverage_cubeProjection_eq_zero_of_le (Q := Q) (j := j) (k := k) f hjk] + norm_num + +private theorem cubeBesovPartialSeminorm_cubeProjection_le_sum_depth_bounds {d : ℕ} + (Q : Cube d) (t : ℝ) (j N : ℕ) (f : Vec d → ℝ) : + cubeBesovPartialSeminorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (cubeProjection Q j f) ≤ + ∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + let B : ℕ → ℝ := fun k => + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) + have hB_nonneg : ∀ k, 0 ≤ B k := by + intro k + dsimp [B] + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num) (cubeBesovScaleWeight_nonneg t Q)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (cubeProjection Q j f)) + have hpartial_le_sum : + cubeBesovPartialSeminorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (cubeProjection Q j f) ≤ + ∑ k ∈ Finset.range (N + 1), + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k := by + rw [cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq] + exact sqrt_sum_sq_le_sum (Finset.range (N + 1)) + (fun k => cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k) + (fun k hk => cubeBesovDepthSeminorm_nonneg Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k) + have hdepth_sum : + ∑ k ∈ Finset.range (N + 1), + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k ≤ + ∑ k ∈ Finset.range (N + 1), if k < j then B k else 0 := by + refine Finset.sum_le_sum ?_ + intro k hk + by_cases hkj : k < j + · have hle := cubeBesovDepthSeminorm_cubeProjection_le Q t j k f + simpa [B, hkj] using hle + · have hjk : j ≤ k := Nat.le_of_not_gt hkj + rw [cubeBesovDepthSeminorm_cubeProjection_eq_zero_of_le (Q := Q) t (j := j) (k := k) f hjk] + simp [hkj] + have hfilter_subset : + (Finset.range (N + 1)).filter (fun k => k < j) ⊆ Finset.range j := by + intro k hk + exact Finset.mem_range.mpr ((Finset.mem_filter.mp hk).2) + calc + cubeBesovPartialSeminorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (cubeProjection Q j f) + ≤ ∑ k ∈ Finset.range (N + 1), + cubeBesovDepthSeminorm Q t (2 : ℝ≥0∞) (cubeProjection Q j f) k := + hpartial_le_sum + _ ≤ ∑ k ∈ Finset.range (N + 1), if k < j then B k else 0 := hdepth_sum + _ = ∑ k ∈ (Finset.range (N + 1)).filter (fun k => k < j), B k := by + rw [Finset.sum_filter] + _ ≤ ∑ k ∈ Finset.range j, B k := by + exact Finset.sum_le_sum_of_subset_of_nonneg hfilter_subset + (by + intro k hkRange hkFilter + exact hB_nonneg k) + _ = ∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + rfl + +/-- Uniform positive test bound for the depth-`j` cube projection. The bound is +independent of the finite test depth `N`; finer scales contribute zero because +the projection is already piecewise constant there. -/ +noncomputable def cubeProjectionPositiveTestCoefficientTwo {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) : ℝ := + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) + + cubeBesovScaleWeight t Q + +noncomputable def cubeProjectionPositiveTestBoundTwo {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) (f : Vec d → ℝ) : ℝ := + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) + + cubeBesovScaleWeight t Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) + +private theorem cubeBesovScaleWeight_pos {d : ℕ} (s : ℝ) (Q : Cube d) : + 0 < cubeBesovScaleWeight s Q := by + unfold cubeBesovScaleWeight + exact Real.rpow_pos_of_pos + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + _ + +theorem cubeProjectionPositiveTestCoefficientTwo_nonneg {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) : + 0 ≤ cubeProjectionPositiveTestCoefficientTwo Q t j := by + unfold cubeProjectionPositiveTestCoefficientTwo + exact add_nonneg + (Finset.sum_nonneg fun k hk => + mul_nonneg + (mul_nonneg (by norm_num) (cubeBesovScaleWeight_nonneg t Q)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (cubeBesovScaleWeight_nonneg t Q) + +theorem cubeProjectionPositiveTestCoefficientTwo_pos {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) : + 0 < cubeProjectionPositiveTestCoefficientTwo Q t j := by + unfold cubeProjectionPositiveTestCoefficientTwo + have hsum_nonneg : + 0 ≤ ∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) := by + exact Finset.sum_nonneg fun k hk => + mul_nonneg + (mul_nonneg (by norm_num) (cubeBesovScaleWeight_nonneg t Q)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + exact add_pos_of_nonneg_of_pos hsum_nonneg (cubeBesovScaleWeight_pos t Q) + +theorem cubeProjectionPositiveTestBoundTwo_eq_coefficient_mul_cubeLpNorm {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) (f : Vec d → ℝ) : + cubeProjectionPositiveTestBoundTwo Q t j f = + cubeProjectionPositiveTestCoefficientTwo Q t j * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + unfold cubeProjectionPositiveTestBoundTwo cubeProjectionPositiveTestCoefficientTwo + calc + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) + + cubeBesovScaleWeight t Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) + = + (∑ k ∈ Finset.range j, + (2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) + + cubeBesovScaleWeight t Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + rfl + _ = + (∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) + + cubeBesovScaleWeight t Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + rw [Finset.sum_mul] + _ = + ((∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ))) + + cubeBesovScaleWeight t Q) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) := by + ring + +theorem cubeBesovDualTestNorm_cubeProjection_le_positiveTestBound_two {d : ℕ} + (Q : Cube d) (t : ℝ) (j N : ℕ) (f : Vec d → ℝ) : + cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (cubeProjection Q j f) ≤ + cubeProjectionPositiveTestBoundTwo Q t j f := by + let P : Vec d → ℝ := cubeProjection Q j f + have hsem : + cubeBesovPartialSeminorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N P ≤ + ∑ k ∈ Finset.range j, + 2 * cubeBesovScaleWeight t Q * Real.rpow (3 : ℝ) (t * (k : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) P := by + simpa [P] using + cubeBesovPartialSeminorm_cubeProjection_le_sum_depth_bounds Q t j N f + have hPmem : MeasureTheory.MemLp P (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + cubeProjection_memLp Q j (2 : ℝ≥0∞) f + have havg : + cubeBesovScaleWeight t Q * ‖cubeAverage Q P‖ ≤ + cubeBesovScaleWeight t Q * cubeLpNorm Q (2 : ℝ≥0∞) P := + mul_le_mul_of_nonneg_left + (norm_cubeAverage_le_cubeLpNorm_two Q P hPmem) + (cubeBesovScaleWeight_nonneg t Q) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) + N P cubeBesovConjExponent_two_ne_top_dualToCirc] + rw [cubeBesovConjExponent_two_eq] + unfold cubeBesovPartialNorm cubeProjectionPositiveTestBoundTwo + exact add_le_add hsem havg + +/-- Testing a function against its depth-`j` cube projection returns the +normalized `L²` mass of that projection. This is the scale-test identity used +in the lossy true-dual-to-circ comparison. -/ +theorem cubeBesovPairing_self_projection_eq_sq_cubeLpNorm_two {d : ℕ} + (Q : Cube d) (j : ℕ) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovPairing Q f (cubeProjection Q j f) = + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ (2 : ℕ) := by + let P : Vec d → ℝ := cubeProjection Q j f + have hfInt : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hf.integrable (by norm_num)) + have hPMem : MeasureTheory.MemLp P (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + cubeProjection_memLp Q j (2 : ℝ≥0∞) f + have hPInt : MeasureTheory.IntegrableOn P (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) (hPMem.integrable (by norm_num)) + have hidem_pair : + cubeBesovPairing Q f (cubeProjection Q j P) = cubeBesovPairing Q f P := by + unfold cubeBesovPairing + apply cubeAverage_congr_on_cubeSet + intro x hx + exact congrArg (fun y => f x * y) (cubeProjection_idempotent_on_cubeSet Q j f x hx) + have hcomm : cubeBesovPairing Q P P = cubeBesovPairing Q f (cubeProjection Q j P) := by + exact cubeBesovPairing_projection_comm Q j f P hfInt hPInt + have hpair : cubeBesovPairing Q f P = cubeBesovPairing Q P P := by + rw [← hidem_pair, ← hcomm] + rw [hpair] + have hnorm : + (cubeLpNorm Q (2 : ℝ≥0∞) P) ^ (2 : ℕ) = + cubeAverage Q (fun x => ‖P x‖ ^ (2 : ℕ)) := by + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := P) + (by norm_num) (by norm_num) hPMem) + rw [hnorm] + unfold cubeBesovPairing + apply cubeAverage_congr_on_cubeSet + intro x hx + simp [P, pow_two, Real.norm_eq_abs] + +/-- If the depth-`j` projection of `f` has positive dual-test norm bounded by +`B` at every finite depth, then its `L²` mass is controlled by the true dual +negative Besov norm of `f` times `B`. This is the core lower-bound mechanism +behind the lossy true-dual-to-circ comparison; the remaining analytic estimate +is the explicit positive-Besov test bound for `cubeProjection Q j f`. -/ +theorem sq_cubeLpNorm_projection_le_dualFullNorm_mul_testBound_two {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) (f : Vec d → ℝ) {B : ℝ} + (ht : 0 < t) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hbound : ∀ N : ℕ, + cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (cubeProjection Q j f) ≤ B) : + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ (2 : ℕ) ≤ + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * B := by + have hpair := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two + Q t f (cubeProjection Q j f) ht hf hB hbound + (cubeProjection_dualLocalMemLpGlobal_two Q j f) + rw [cubeBesovPairing_self_projection_eq_sq_cubeLpNorm_two Q j f hf] at hpair + simpa [abs_of_nonneg (sq_nonneg (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)))] + using hpair + +/-- Concrete scale test lower bound with the projection test norm already +estimated. -/ +theorem sq_cubeLpNorm_projection_le_dualFullNorm_mul_positiveTestBound_two {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) (f : Vec d → ℝ) + (ht : 0 < t) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hL : 0 < cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) : + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ (2 : ℕ) ≤ + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + cubeProjectionPositiveTestBoundTwo Q t j f := by + have hBpos : + 0 < cubeProjectionPositiveTestBoundTwo Q t j f := by + rw [cubeProjectionPositiveTestBoundTwo_eq_coefficient_mul_cubeLpNorm] + exact mul_pos (cubeProjectionPositiveTestCoefficientTwo_pos Q t j) hL + exact sq_cubeLpNorm_projection_le_dualFullNorm_mul_testBound_two Q t j f ht hf hBpos + (fun N => cubeBesovDualTestNorm_cubeProjection_le_positiveTestBound_two Q t j N f) + +/-- Linear scale estimate obtained by cancelling the nonzero projected `L²` +norm from the quadratic testing lower bound. -/ +theorem cubeLpNorm_projection_le_dualFullNorm_mul_positiveTestCoefficient_two {d : ℕ} + (Q : Cube d) (t : ℝ) (j : ℕ) (f : Vec d → ℝ) + (ht : 0 < t) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) ≤ + cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + cubeProjectionPositiveTestCoefficientTwo Q t j := by + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f) + let D : ℝ := cubeBesovDualFullNorm Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) f + let C : ℝ := cubeProjectionPositiveTestCoefficientTwo Q t j + have hL_nonneg : 0 ≤ L := cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (cubeProjection Q j f) + by_cases hLzero : L = 0 + · have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact cubeBesovDualFullNorm_nonneg Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) f + cubeBesovConjExponent_two_ne_zero_dualToCirc cubeBesovConjExponent_two_ne_top_dualToCirc + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact cubeProjectionPositiveTestCoefficientTwo_nonneg Q t j + dsimp [L, D, C] at hLzero ⊢ + rw [hLzero] + exact mul_nonneg hD_nonneg hC_nonneg + · have hLpos : 0 < L := lt_of_le_of_ne hL_nonneg (Ne.symm hLzero) + have hsq : + L ^ (2 : ℕ) ≤ D * (C * L) := by + dsimp [L, D, C] + simpa [cubeProjectionPositiveTestBoundTwo_eq_coefficient_mul_cubeLpNorm, + mul_assoc] using + sq_cubeLpNorm_projection_le_dualFullNorm_mul_positiveTestBound_two + Q t j f ht hf hLpos + have hmul : L * L ≤ (D * C) * L := by + nlinarith + have hcancel : L ≤ D * C := le_of_mul_le_mul_right hmul hLpos + simpa [L, D, C] using hcancel + +theorem cubeBesovCircDepthAverage_eq_sq_cubeLpNorm_projection_two {d : ℕ} + (Q : Cube d) (j : ℕ) (f : Vec d → ℝ) : + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) f j = + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeProjection Q j f)) ^ (2 : ℕ) := by + rw [cubeBesovCircDepthAverage_eq_descendantsAverage_projection + (Q := Q) (p := (2 : ℝ≥0∞)) (u := f) (j := j) (by norm_num)] + simpa [cubeL2ScalarDepthAverage, Real.rpow_natCast] using + cubeL2ScalarDepthAverage_eq_cubeLpNorm_two_sq Q (cubeProjection Q j f) j + (cubeProjection_memLp Q j (2 : ℝ≥0∞) f) + +end + +end Legacy +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/FractionalSobolevVsBesov.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/FractionalSobolevVsBesov.lean new file mode 100644 index 0000000000..1b25b92038 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/FractionalSobolevVsBesov.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE + +/-! +# Legacy fractional Sobolev versus Besov seminorms (CG Lemma 1.3) + +Legacy, restricted real-valued overlap-comparison lane. On every triadic +cube, its volume-normalized fractional Sobolev (Gagliardo) seminorm and older +overlapping triadic Besov presentation `B^s_{p,p}` are equivalent, with a +constant depending only on the dimension — uniformly in `s ∈ (0,1]`, +`p ∈ [1,∞)`, and the cube scale. + +Constant accounting (each factor uniform in `s, p`): + +* upper bound (`B ≤ C·W`): overlap multiplicity `3^d` and the backwards + geometric pair tail `≤ 2`, total `2·3^d` at power `p`; +* lower bound (`W ≤ C·B`): triangle split `2·2^p ≤ 4^p`, shell-versus-depth + kernel slack `9^{sp+d} ≤ (9^{d+1})^p` (uses `s ≤ 1`), center count + `3^d ≤ (3^d)^p`, shell reindexing `2 ≤ 2^p`; total `(2^3·3^{3d+2})^p`; +* both collapse to the single constant `wspVsBsppConstant d = 2^3·3^{3d+2}` + after the `p`-th root, since `(X^p)^{1/p} = X` and `Y^{1/p} ≤ Y` for `Y ≥ 1`. + +The Lean proof replaces the manuscript's partition-of-unity argument by a +discrete-annulus argument. Within this restricted lane the comparison shape +is unchanged, but its Gagliardo kernel uses the ambient sup-distance, absorbed +into `C(d)`. Its overlap Besov side is the older finite-truncation / +real-`sSup` presentation. This is not the new exact Euclidean / `ENNReal` +manuscript API. + +The packaged hypothesis `MemFractionalSobolev` (`MemLp` + `MemWsp`) is the +legacy analogue of `u ∈ W^{s,p}(□)` for this ambient-sup-distance kernel. No +measurability of the representative is assumed in the packaged theorem (the +statement is a.e.-invariant, and a measurable representative is transported +through `CongruenceAE`). The `BddAbove` side condition of the infinite-scale +Besov seminorm is *derived*, not assumed. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +namespace Legacy + +/-- The legacy/restricted fractional Sobolev seminorm +`[u]_{W̲^{s,p}(□)}`, using the ambient sup-distance Gagliardo kernel. -/ +noncomputable abbrev fractionalSobolevSeminorm {d : ℕ} (Q : Cube d) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + Gagliardo.cubeGagliardoSeminorm Q s p u + +/-- The legacy/restricted overlapping Besov seminorm `[u]_{B̲^s_{p,p}(□)}` +in the finite-truncation / real-`sSup` presentation. -/ +noncomputable abbrev positiveBesovOverlapSeminormDiagonal {d : ℕ} (Q : Cube d) + (s : ℝ) (p : ℝ≥0∞) (u : Vec d → ℝ) : ℝ := + cubeBesovOverlapSeminorm Q s p p u + +/-- Legacy/restricted packaged membership: `L^p` on the cube with finite +ambient-sup-distance Gagliardo seminorm. This is not the exact Euclidean / +`ENNReal` manuscript `u ∈ W^{s,p}(□_m)` API; no measurability of the +representative is assumed (it is recovered a.e. from `MemLp`). -/ +def MemFractionalSobolev {d : ℕ} (Q : Cube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → ℝ) : Prop := + MeasureTheory.MemLp u p (normalizedCubeMeasure Q) ∧ Gagliardo.MemWsp Q s p u + +theorem MemFractionalSobolev.memLp {d : ℕ} {Q : Cube d} {s : ℝ} + {p : ℝ≥0∞} {u : Vec d → ℝ} (h : MemFractionalSobolev Q s p u) : + MeasureTheory.MemLp u p (normalizedCubeMeasure Q) := h.1 + +theorem MemFractionalSobolev.memWsp {d : ℕ} {Q : Cube d} {s : ℝ} + {p : ℝ≥0∞} {u : Vec d → ℝ} (h : MemFractionalSobolev Q s p u) : + Gagliardo.MemWsp Q s p u := h.2 + +/-- The legacy/restricted overlap-comparison constant; it depends on the +dimension only and is fixed before every other quantifier. -/ +noncomputable def wspVsBsppConstant (d : ℕ) : ℝ := + 2 ^ 3 * 3 ^ (3 * d + 2) + +theorem one_le_wspVsBsppConstant (d : ℕ) : 1 ≤ wspVsBsppConstant d := by + have h3 : (1 : ℝ) ≤ 3 ^ (3 * d + 2) := one_le_pow₀ (by norm_num) + have h2 : (1 : ℝ) ≤ 2 ^ 3 := by norm_num + calc (1 : ℝ) = 1 * 1 := by ring + _ ≤ 2 ^ 3 * 3 ^ (3 * d + 2) := mul_le_mul h2 h3 (by norm_num) (by positivity) + +theorem wspVsBsppConstant_pos (d : ℕ) : 0 < wspVsBsppConstant d := + lt_of_lt_of_le one_pos (one_le_wspVsBsppConstant d) + +/-- `toReal` of the L-direction `ℝ≥0∞` constant is the note constant. -/ +theorem gagliardoBesovLowerConstant_toReal (d : ℕ) : + (Gagliardo.gagliardoBesovLowerConstant d).toReal = wspVsBsppConstant d := by + rw [Gagliardo.gagliardoBesovLowerConstant, wspVsBsppConstant] + simp [ENNReal.toReal_mul, ENNReal.toReal_pow] + +section MainTheorem + +variable {d : ℕ} [NeZero d] (Q : Cube d) {s : ℝ} {p : ℝ≥0∞} {u : Vec d → ℝ} + +/-- Legacy upper bound: every finite-depth overlap-Besov partial seminorm is +controlled by the ambient-sup-distance Gagliardo seminorm. -/ +theorem besovOverlapPartial_le_const_mul_gagliardo + (hs : 0 < s) (hp : 1 ≤ p) (hpt : p ≠ ∞) (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) + (hW : Gagliardo.MemWsp Q s p u) (N : ℕ) : + cubeBesovOverlapPartialSeminorm Q s p p N u ≤ + wspVsBsppConstant d * fractionalSobolevSeminorm Q s p u := by + have hp0 : p ≠ 0 := (lt_of_lt_of_le zero_lt_one hp).ne' + have hpr : (0 : ℝ) < p.toReal := ENNReal.toReal_pos hp0 hpt + have hpr1 : (1 : ℝ) ≤ p.toReal := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono hpt hp + have hGE_ne : Gagliardo.cubeGagliardoESeminorm Q s p u ≠ ∞ := + hW.eSeminorm_lt_top.ne + have hGdef : fractionalSobolevSeminorm Q s p u = + (Gagliardo.cubeGagliardoESeminorm Q s p u).toReal := rfl + have hGnonneg : 0 ≤ fractionalSobolevSeminorm Q s p u := + ENNReal.toReal_nonneg + have hU := Gagliardo.ofReal_partialSeminorm_rpow_le_gagliardo Q hs.le hp hpt + humeas hu N + have hc_ne : (2 * 3 ^ d : ℝ≥0∞) ≠ ∞ := + ENNReal.mul_ne_top (by simp) (ENNReal.pow_ne_top (by simp)) + have hR_ne : (2 * 3 ^ d : ℝ≥0∞) * + Gagliardo.cubeGagliardoESeminorm Q s p u ^ p.toReal ≠ ∞ := + ENNReal.mul_ne_top hc_ne (ENNReal.rpow_ne_top_of_nonneg hpr.le hGE_ne) + have hc_toReal : ((2 * 3 ^ d : ℝ≥0∞)).toReal = (2 * 3 ^ d : ℝ) := by + simp [ENNReal.toReal_mul, ENNReal.toReal_pow] + have hreal : cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal ≤ + (2 * 3 ^ d : ℝ) * fractionalSobolevSeminorm Q s p u ^ p.toReal := by + have h1 := (ENNReal.ofReal_le_iff_le_toReal hR_ne).1 hU + have h2 : ((2 * 3 ^ d : ℝ≥0∞) * + Gagliardo.cubeGagliardoESeminorm Q s p u ^ p.toReal).toReal = + (2 * 3 ^ d : ℝ) * fractionalSobolevSeminorm Q s p u ^ p.toReal := by + rw [ENNReal.toReal_mul, hc_toReal, hGdef, ENNReal.toReal_rpow] + rw [← h2] + exact h1 + -- take the `p`-th root + have hpartial_nonneg : 0 ≤ cubeBesovOverlapPartialSeminorm Q s p p N u := + cubeBesovOverlapPartialSeminorm_nonneg Q s p p N u + have hc0 : (1 : ℝ) ≤ 2 * 3 ^ d := by + have h3 : (1 : ℝ) ≤ 3 ^ d := one_le_pow₀ (by norm_num) + linarith + have hroot : cubeBesovOverlapPartialSeminorm Q s p p N u ≤ + (2 * 3 ^ d : ℝ) ^ (1 / p.toReal) * fractionalSobolevSeminorm Q s p u := by + have h2 : cubeBesovOverlapPartialSeminorm Q s p p N u = + (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) ^ + (1 / p.toReal) := by + rw [one_div, Real.rpow_rpow_inv hpartial_nonneg hpr.ne'] + rw [h2] + calc (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) ^ (1 / p.toReal) + ≤ ((2 * 3 ^ d : ℝ) * + fractionalSobolevSeminorm Q s p u ^ p.toReal) ^ (1 / p.toReal) := + Real.rpow_le_rpow (Real.rpow_nonneg hpartial_nonneg _) hreal + (by positivity) + _ = (2 * 3 ^ d : ℝ) ^ (1 / p.toReal) * + fractionalSobolevSeminorm Q s p u := by + rw [Real.mul_rpow (by linarith) (Real.rpow_nonneg hGnonneg _), + one_div, Real.rpow_rpow_inv hGnonneg hpr.ne'] + refine hroot.trans (mul_le_mul ?_ le_rfl hGnonneg + (le_of_lt (wspVsBsppConstant_pos d))) + have hexp : (2 * 3 ^ d : ℝ) ^ (1 / p.toReal) ≤ 2 * 3 ^ d := by + have h1p : 1 / p.toReal ≤ 1 := by + rw [div_le_one hpr] + exact hpr1 + calc (2 * 3 ^ d : ℝ) ^ (1 / p.toReal) ≤ (2 * 3 ^ d : ℝ) ^ (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hc0 h1p + _ = 2 * 3 ^ d := Real.rpow_one _ + refine hexp.trans ?_ + rw [wspVsBsppConstant] + have h3 : (3 : ℝ) ^ d ≤ 3 ^ (3 * d + 2) := + pow_le_pow_right₀ (by norm_num) (by omega) + nlinarith [pow_nonneg (show (0:ℝ) ≤ 3 by norm_num) d] + +/-- Legacy/restricted two-sided overlap comparison: +`C(d)⁻¹·[u]_{W̲^{s,p}} ≤ [u]_{B̲^s_{p,p}} ≤ C(d)·[u]_{W̲^{s,p}}` on every +triadic cube, with `C(d) = wspVsBsppConstant d` fixed before all other +quantifiers, uniformly in `s ∈ (0,1]`, `p ∈ [1,∞)`, and the cube. -/ +theorem fractionalSobolevVsBesovSeminorms + (hs : 0 < s) (hs1 : s ≤ 1) (hp : 1 ≤ p) (hpt : p ≠ ∞) + (humeas : Measurable u) (hu : MemLp u p (normalizedCubeMeasure Q)) + (hW : Gagliardo.MemWsp Q s p u) : + (wspVsBsppConstant d)⁻¹ * fractionalSobolevSeminorm Q s p u ≤ + positiveBesovOverlapSeminormDiagonal Q s p u ∧ + positiveBesovOverlapSeminormDiagonal Q s p u ≤ + wspVsBsppConstant d * fractionalSobolevSeminorm Q s p u := by + have hp0 : p ≠ 0 := (lt_of_lt_of_le zero_lt_one hp).ne' + have hpr : (0 : ℝ) < p.toReal := ENNReal.toReal_pos hp0 hpt + have hGE_ne : Gagliardo.cubeGagliardoESeminorm Q s p u ≠ ∞ := + hW.eSeminorm_lt_top.ne + have hGdef : fractionalSobolevSeminorm Q s p u = + (Gagliardo.cubeGagliardoESeminorm Q s p u).toReal := rfl + have hGnonneg : 0 ≤ fractionalSobolevSeminorm Q s p u := + ENNReal.toReal_nonneg + have hBdd : BddAbove (cubeBesovOverlapSeminormValueSet Q s p p u) := + Gagliardo.besovOverlapSeminormValueSet_bddAbove_of_gagliardo Q hs.le hp hpt + humeas hu hGE_ne + have hpartial_le : ∀ N, cubeBesovOverlapPartialSeminorm Q s p p N u ≤ + positiveBesovOverlapSeminormDiagonal Q s p u := fun N => + cubeBesovOverlapPartialSeminorm_le_cubeBesovOverlapSeminorm_of_bddAbove + Q s p p u hBdd N + have hBnonneg : 0 ≤ positiveBesovOverlapSeminormDiagonal Q s p u := + (cubeBesovOverlapPartialSeminorm_nonneg Q s p p 0 u).trans (hpartial_le 0) + constructor + · -- lower bound: C⁻¹ · W ≤ B + have hL := Gagliardo.gagliardo_rpow_le_iSup_partialSeminorm Q hs.le hs1 hp + hpt humeas hu + have hsup_le : (⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal)) ≤ + ENNReal.ofReal (positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal) := by + refine iSup_le fun N => ENNReal.ofReal_le_ofReal ?_ + exact Real.rpow_le_rpow + (cubeBesovOverlapPartialSeminorm_nonneg Q s p p N u) + (hpartial_le N) hpr.le + have hKE_ne : Gagliardo.gagliardoBesovLowerConstant d ≠ ∞ := by + rw [Gagliardo.gagliardoBesovLowerConstant] + exact ENNReal.mul_ne_top (ENNReal.pow_ne_top (by simp)) + (ENNReal.pow_ne_top (by simp)) + have hKEpr_ne : (Gagliardo.gagliardoBesovLowerConstant d) ^ p.toReal ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg hpr.le hKE_ne + have hRHS_ne : (Gagliardo.gagliardoBesovLowerConstant d) ^ p.toReal * + ENNReal.ofReal (positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal) + ≠ ∞ := + ENNReal.mul_ne_top hKEpr_ne ENNReal.ofReal_ne_top + have hchain : Gagliardo.cubeGagliardoESeminorm Q s p u ^ p.toReal ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ p.toReal * + ENNReal.ofReal + (positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal) := + hL.trans (mul_le_mul_right hsup_le _) + -- to the reals + have hreal : fractionalSobolevSeminorm Q s p u ^ p.toReal ≤ + (wspVsBsppConstant d) ^ p.toReal * + positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal := by + have h1 : fractionalSobolevSeminorm Q s p u ^ p.toReal = + (Gagliardo.cubeGagliardoESeminorm Q s p u ^ p.toReal).toReal := by + rw [hGdef, ENNReal.toReal_rpow] + have h2 : ((Gagliardo.gagliardoBesovLowerConstant d) ^ p.toReal * + ENNReal.ofReal + (positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal)).toReal = + (wspVsBsppConstant d) ^ p.toReal * + positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal := by + rw [ENNReal.toReal_mul, + ENNReal.toReal_ofReal (Real.rpow_nonneg hBnonneg _), + ← ENNReal.toReal_rpow, gagliardoBesovLowerConstant_toReal] + rw [h1, ← h2] + exact ENNReal.toReal_mono hRHS_ne hchain + -- take roots + have hroot : fractionalSobolevSeminorm Q s p u ≤ + wspVsBsppConstant d * positiveBesovOverlapSeminormDiagonal Q s p u := by + have h2 : fractionalSobolevSeminorm Q s p u = + (fractionalSobolevSeminorm Q s p u ^ p.toReal) ^ (1 / p.toReal) := by + rw [one_div, Real.rpow_rpow_inv hGnonneg hpr.ne'] + rw [h2] + calc (fractionalSobolevSeminorm Q s p u ^ p.toReal) ^ (1 / p.toReal) + ≤ ((wspVsBsppConstant d) ^ p.toReal * + positiveBesovOverlapSeminormDiagonal Q s p u ^ p.toReal) ^ + (1 / p.toReal) := + Real.rpow_le_rpow (Real.rpow_nonneg hGnonneg _) hreal + (by positivity) + _ = wspVsBsppConstant d * positiveBesovOverlapSeminormDiagonal Q s p u := by + rw [Real.mul_rpow + (Real.rpow_nonneg (le_of_lt (wspVsBsppConstant_pos d)) _) + (Real.rpow_nonneg hBnonneg _), one_div, + Real.rpow_rpow_inv (le_of_lt (wspVsBsppConstant_pos d)) hpr.ne', + Real.rpow_rpow_inv hBnonneg hpr.ne'] + rw [inv_mul_le_iff₀ (wspVsBsppConstant_pos d)] + exact hroot + · -- upper bound: B ≤ C · W + refine csSup_le (cubeBesovOverlapSeminormValueSet_nonempty Q s p p u) ?_ + rintro x ⟨N, rfl⟩ + exact besovOverlapPartial_le_const_mul_gagliardo Q hs hp hpt humeas hu hW N + +/-- The legacy/restricted two-sided overlap comparison with its packaged +membership hypothesis. No measurability hypothesis: the statement is +invariant under a.e.-modification, and a measurable representative is +extracted from `MemLp` and transported back through the congruence lemmas. -/ +theorem fractionalSobolevVsBesovSeminorms_of_memFractionalSobolev + (hs : 0 < s) (hs1 : s ≤ 1) (hp : 1 ≤ p) (hpt : p ≠ ∞) + (hu : MemFractionalSobolev Q s p u) : + (wspVsBsppConstant d)⁻¹ * fractionalSobolevSeminorm Q s p u ≤ + positiveBesovOverlapSeminormDiagonal Q s p u ∧ + positiveBesovOverlapSeminormDiagonal Q s p u ≤ + wspVsBsppConstant d * fractionalSobolevSeminorm Q s p u := by + obtain ⟨g, hgmeas, haen⟩ := hu.memLp.aestronglyMeasurable.aemeasurable + have hae : u =ᵐ[Homogenization.cubeMeasure Q] g := + Gagliardo.ae_normalizedCubeMeasure_iff.1 haen + have hgLp : MeasureTheory.MemLp g p (normalizedCubeMeasure Q) := + hu.memLp.ae_eq haen + have hgW : Gagliardo.MemWsp Q s p g := + (Gagliardo.memWsp_congr_ae hae).1 hu.memWsp + have main := fractionalSobolevVsBesovSeminorms Q hs hs1 hp hpt hgmeas hgLp hgW + have hWeq : fractionalSobolevSeminorm Q s p u = + fractionalSobolevSeminorm Q s p g := + congrArg ENNReal.toReal (Gagliardo.cubeGagliardoESeminorm_congr_ae hae) + have hBeq : positiveBesovOverlapSeminormDiagonal Q s p u = + positiveBesovOverlapSeminormDiagonal Q s p g := + Gagliardo.cubeBesovOverlapSeminorm_congr_ae hae + rw [hWeq, hBeq] + exact main + +end MainTheorem + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/GradientToFunction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/GradientToFunction.lean new file mode 100644 index 0000000000..12ad9049e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/GradientToFunction.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds + +/-! # Gradient To Function -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped ENNReal + +noncomputable section + +/-! +# From gradient control to function control + +This file retains the legacy disjoint-positive, totalized-real, +componentwise-circ compatibility surface behind the note's `\nabla u` to `u` +Besov-scale estimate. It is not the exact manuscript overlap/Euclidean +statement. +-/ + +namespace Legacy + +/-- Legacy H1-facing infinite-depth `\nabla u`-to-`u` Besov-scale +compatibility estimate, using the disjoint-positive, totalized-real, +componentwise-circ conventions rather than the exact manuscript +overlap/Euclidean statement. + +The full-dual/H1 Poincare theorem supplies the local full-circ bounds +internally, so this statement has no explicit `hlocal` contract. -/ +theorem gradientToFunctionBesovScale_from_h1 {d : ℕ} [NeZero d] + (Q : Cube d) (s : ℝ) (u : H1Function (openCubeSet Q)) + (hs0 : 0 < s) (hs1 : s < 1) : + positiveBesovNormTop Q s (2 : ℝ≥0∞) + (cubeFluctuation Q (fun x => u x)) ≤ + (fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) := by + let C : ℝ := fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1) + have hC : 0 ≤ C := by + exact mul_nonneg (fullVectorPoincareConstant_nonneg Q) + (Real.rpow_nonneg (by positivity) _) + unfold positiveBesovNormTop + refine csSup_le ?_ ?_ + · exact + ⟨cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) 1 + (cubeFluctuation Q (fun x => u x)), ⟨0, by simp⟩⟩ + · intro r hr + rcases hr with ⟨N, rfl⟩ + simpa [C] using + Homogenization.CubeLocalFullCircPoincareVectorEstimate.fluctuation_partialNormTop_two_le_sum_circNorm + (h1_descendantLocalFullCircPoincare Q u (N + 1)) + (Q := Q) (s := s) (C := C) (u := fun x => u x) + (G := fun x => u.grad x) (M := N + 1) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) hs0.le hs1 hC + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeConverse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeConverse.lean new file mode 100644 index 0000000000..2ddab5d2e5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeConverse.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge + +/-! # Hodge Converse -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +/-- Public a.e.-based Hodge converse on bounded open convex domains. + +This avoids exposing the internal representative-equality predicate as the +Chapter 1 public surface. -/ +theorem potentialField_of_orthogonal_to_solenoidalZeroNormalTrace_boundedOpenConvex + {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) + (horth : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + SolenoidalZeroNormalTraceFieldOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) : + PotentialFieldOn U f := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + have hcriterion : Homogenization.HodgeConverseCriterion U := + Homogenization.hodgeConverseCriterion_of_isOpenBoundedConvexDomain hU + have horth_internal : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + Homogenization.IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0 := by + intro g hg hsol + exact horth hg ⟨hg, hsol⟩ + rcases hcriterion hf horth_internal with ⟨u, hgrad⟩ + refine ⟨hf, u, ?_⟩ + exact Filter.EventuallyEq.of_eq hgrad.symm + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeProjectionL2.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeProjectionL2.lean new file mode 100644 index 0000000000..9359c784bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/HodgeProjectionL2.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Hodge Projection L2 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +/-! +# Ch1 Hilbert `L²` Hodge projection input + +This file proves the Hilbert-space core of the unit Dirichlet Hodge projection +estimate. The concrete negative-Besov theorem still needs boundedness of the +same projection in the Besov scale; the orthogonality and energy estimate here +are unconditional. +-/ + +/-- A zero-trace potential field has the `L²` membership supplied by its +`H¹₀` primitive. -/ +theorem IsPotentialZeroTraceOn.memVectorL2 + {d : ℕ} {U : Set (Vec d)} {w : Vec d → Vec d} + (hw : IsPotentialZeroTraceOn U w) : + MemVectorL2 U w := by + rcases hw with ⟨u, hgrad⟩ + simpa [hgrad] using u.toH1Function.grad_memVectorL2 + +/-- Zero-trace potential fields are `L²`-orthogonal to solenoidal fields. -/ +theorem inner_toHilbertVectorL2OfVecField_eq_zero_of_isPotentialZeroTraceOn_of_isSolenoidalOn + {d : ℕ} (Q : TriadicCube d) {w z : Vec d → Vec d} + (hwMem : MemVectorL2 (cubeSet Q) w) + (hzMem : MemVectorL2 (cubeSet Q) z) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hz : IsSolenoidalOn (cubeSet Q) z) : + inner ℝ (toHilbertVectorL2OfVecField hwMem) + (toHilbertVectorL2OfVecField hzMem) = 0 := by + rcases hw with ⟨u, hgrad⟩ + calc + inner ℝ (toHilbertVectorL2OfVecField hwMem) + (toHilbertVectorL2OfVecField hzMem) + = ∫ x in cubeSet Q, vecDot (w x) (z x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := cubeSet Q) hwMem hzMem + _ = ∫ x in cubeSet Q, vecDot (z x) (w x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => vecDot_comm (w x) (z x) + _ = 0 := by + simpa [hgrad] using hz u + +/-- The zero-trace primitive of a Hodge potential component solves the +Dirichlet variational problem with right-hand side `-F`. + +This is the PDE identity behind the unit Hodge projection: if `w` is +zero-trace potential and `w + F` is solenoidal, then the primitive of `w` +tests against every zero-trace gradient as `-F`. -/ +theorem exists_h10Function_gradient_eq_and_firstVariation_eq_neg_of_isPotentialZeroTraceOn_of_isSolenoidalOn + {d : ℕ} {U : Set (Vec d)} {w F : Vec d → Vec d} + (hF : MemVectorL2 U F) + (hw : IsPotentialZeroTraceOn U w) + (hsol : IsSolenoidalOn U (fun x => w x + F x)) : + ∃ u : H10Function U, + u.toH1Function.grad = w ∧ + ∀ φ : H10Function U, + ∫ x in U, vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in U, vecDot (F x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rcases hw with ⟨u, rfl⟩ + refine ⟨u, rfl, ?_⟩ + intro φ + have hu_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 + u.toH1Function.grad_memVectorL2 φ.toH1Function.grad_memVectorL2 + have hF_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hF φ.toH1Function.grad_memVectorL2 + have hsplit : + ∫ x in U, + vecDot (u.toH1Function.grad x + F x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + + ∫ x in U, vecDot (F x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + have hpoint : + (fun x => + vecDot (u.toH1Function.grad x + F x) (φ.toH1Function.grad x)) = + fun x => + vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x) + + vecDot (F x) (φ.toH1Function.grad x) := by + funext x + simp [vecDot_add_left] + rw [hpoint] + exact MeasureTheory.integral_add hu_int.integrable hF_int.integrable + have hzero : + ∫ x in U, vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + + ∫ x in U, vecDot (F x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = 0 := by + simpa [hsplit] using hsol φ + linarith + +/-- +Unit Dirichlet Hodge projection estimate in the Hilbert `L²` norm. + +If `w` is the zero-trace potential component and `w + F` is solenoidal, both +components are controlled by the forcing field `F`. +-/ +theorem unitHodgeProjectionL2Estimate + {d : ℕ} (Q : TriadicCube d) (w F : Vec d → Vec d) + (hF : MemVectorL2 (cubeSet Q) F) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) (fun x => w x + F x)) : + ‖toHilbertVectorL2OfVecField (IsPotentialZeroTraceOn.memVectorL2 hw)‖ + + ‖toHilbertVectorL2OfVecField ((IsPotentialZeroTraceOn.memVectorL2 hw).add hF)‖ ≤ + 2 * ‖toHilbertVectorL2OfVecField hF‖ := by + let hwMem : MemVectorL2 (cubeSet Q) w := IsPotentialZeroTraceOn.memVectorL2 hw + let W : HilbertVectorL2 (cubeSet Q) := toHilbertVectorL2OfVecField hwMem + let Z : HilbertVectorL2 (cubeSet Q) := toHilbertVectorL2OfVecField (hwMem.add hF) + let FF : HilbertVectorL2 (cubeSet Q) := toHilbertVectorL2OfVecField hF + have horth : inner ℝ W Z = 0 := by + dsimp [W, Z, hwMem] + exact + inner_toHilbertVectorL2OfVecField_eq_zero_of_isPotentialZeroTraceOn_of_isSolenoidalOn + Q (IsPotentialZeroTraceOn.memVectorL2 hw) + ((IsPotentialZeroTraceOn.memVectorL2 hw).add hF) hw hsol + have hZ_eq : Z = W + FF := by + dsimp [Z, W, FF, hwMem] + exact toHilbertVectorL2OfVecField_add (IsPotentialZeroTraceOn.memVectorL2 hw) hF + have hF_eq : FF = Z - W := by + rw [hZ_eq] + abel + have horthZW : inner ℝ Z W = 0 := by + simpa [real_inner_comm] using horth + have hnormF_mul : ‖FF‖ * ‖FF‖ = ‖Z‖ * ‖Z‖ + ‖W‖ * ‖W‖ := by + rw [hF_eq] + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + norm_sub_sq_eq_norm_sq_add_norm_sq_real (x := Z) (y := W) horthZW + have hW_sq_le : ‖W‖ ^ 2 ≤ ‖FF‖ ^ 2 := by + have hnormF_sq : ‖FF‖ ^ 2 = ‖Z‖ ^ 2 + ‖W‖ ^ 2 := by + nlinarith [hnormF_mul] + nlinarith [sq_nonneg ‖Z‖] + have hZ_sq_le : ‖Z‖ ^ 2 ≤ ‖FF‖ ^ 2 := by + have hnormF_sq : ‖FF‖ ^ 2 = ‖Z‖ ^ 2 + ‖W‖ ^ 2 := by + nlinarith [hnormF_mul] + nlinarith [sq_nonneg ‖W‖] + have hW_le : ‖W‖ ≤ ‖FF‖ := le_of_sq_le_sq hW_sq_le (norm_nonneg FF) + have hZ_le : ‖Z‖ ≤ ‖FF‖ := le_of_sq_le_sq hZ_sq_le (norm_nonneg FF) + change ‖W‖ + ‖Z‖ ≤ 2 * ‖FF‖ + nlinarith + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MeanSquareDeviation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MeanSquareDeviation.lean new file mode 100644 index 0000000000..59e1347c85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MeanSquareDeviation.lean @@ -0,0 +1,222 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.OpenPos +public import Mathlib.MeasureTheory.Measure.Typeclasses.Finite + +/-! # Mean Square Deviation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +/-! +# Mean-square deviation toolkit + +Scalar and vector mean-square deviation of a field from a constant, together +with the companion mean-square oscillation, are the `L²`-normalized quantities +used to measure how far a field sits from its average on a domain. This file +collects their basic identities: rewriting the vector deviation as a volume +average of the squared coordinate norm of the centered field (for square- +integrable fields), the explicit-Euclidean-ball finiteness facts they rely on, +and the norm-equivalence bound of the deviation from zero by the ambient `L²` +seminorm. +-/ + +open scoped BigOperators ENNReal + +noncomputable section + +/-- Mean square deviation of a scalar function from a constant on a set. -/ +noncomputable def meanSquareDeviationOn {d : ℕ} (V : Set (Vec d)) + (u : Vec d → ℝ) (c : ℝ) : ℝ := + volumeAverage V fun y => (u y - c) ^ 2 + +/-- Real volume of the explicit unit Euclidean ball. -/ +noncomputable def euclideanUnitBallVolume (d : ℕ) : ℝ := + (MeasureTheory.volume (euclideanBall (0 : Vec d) 1)).toReal + +/-- Componentwise mean square deviation of a vector field from a constant. -/ +noncomputable def meanSquareDeviationVecOn {d : ℕ} (V : Set (Vec d)) + (h : Vec d → Vec d) (c : Vec d) : ℝ := + ∑ k : Fin d, meanSquareDeviationOn V (fun y => h y k) (c k) + +/-- Componentwise mean square oscillation of a vector field on a set. -/ +noncomputable def meanSquareOscillationVecOn {d : ℕ} (V : Set (Vec d)) + (h : Vec d → Vec d) : ℝ := + meanSquareDeviationVecOn V h (volumeAverageVec V h) + +/-- +Vector mean-square deviation is the volume average of the squared coordinate +norm of the centered vector field, when the componentwise squares are +integrable. +-/ +theorem meanSquareDeviationVecOn_eq_volumeAverage_vecNormSq_sub + {d : ℕ} {V : Set (Vec d)} {h : Vec d → Vec d} {c : Vec d} + (hint : + ∀ k : Fin d, MeasureTheory.IntegrableOn (fun x => (h x k - c k) ^ 2) V) : + meanSquareDeviationVecOn V h c = + volumeAverage V (fun x => vecNormSq (h x - c)) := by + unfold meanSquareDeviationVecOn meanSquareDeviationOn volumeAverage vecNormSq vecDot + rw [← Finset.mul_sum] + congr 1 + rw [MeasureTheory.integral_finsetSum] + · refine Finset.sum_congr rfl ?_ + intro k _hk + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [pow_two] + · intro k _hk + simpa [pow_two] using (hint k).integrable + +/-- +For an `L²` vector field on a finite-measure set, every coordinate after +subtracting a constant has an integrable square. +-/ +theorem integrableOn_coord_sub_const_sq_of_memVectorL2 + {d : ℕ} {V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {h : Vec d → Vec d} (hh : MemVectorL2 V h) (c : Vec d) (k : Fin d) : + MeasureTheory.IntegrableOn (fun x => (h x k - c k) ^ 2) V := by + have hhcomp : MemScalarL2 V (fun x => h x k) := + memScalarL2_coord_of_memVectorL2 hh k + have hcvec : MemVectorL2 V (fun _ : Vec d => c) := + memVectorL2_const (U := V) c + have hccomp : MemScalarL2 V (fun _ : Vec d => c k) := + memScalarL2_coord_of_memVectorL2 hcvec k + have hdiff : MemScalarL2 V (fun x => h x k - c k) := hhcomp.sub hccomp + simpa [pow_two, MemScalarL2, volumeMeasureOn, MeasureTheory.IntegrableOn] using! + hdiff.integrable_mul hdiff + +/-- +Vector mean-square deviation is the volume average of the squared coordinate +norm of the centered vector field for every `L²` vector field on a +finite-measure set. +-/ +theorem meanSquareDeviationVecOn_eq_volumeAverage_vecNormSq_sub_of_memVectorL2 + {d : ℕ} {V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {h : Vec d → Vec d} (hh : MemVectorL2 V h) (c : Vec d) : + meanSquareDeviationVecOn V h c = + volumeAverage V (fun x => vecNormSq (h x - c)) := by + exact meanSquareDeviationVecOn_eq_volumeAverage_vecNormSq_sub + (fun k => integrableOn_coord_sub_const_sq_of_memVectorL2 hh c k) + +/-- Explicit Euclidean balls have finite volume. -/ +theorem volume_euclideanBall_ne_top {d : ℕ} (x : Vec d) (r : ℝ) : + MeasureTheory.volume (euclideanBall x r) ≠ ⊤ := by + refine ne_top_of_le_ne_top + ((isCompact_euclideanClosedBall x (abs_nonneg r)).measure_ne_top + (μ := MeasureTheory.volume)) ?_ + exact MeasureTheory.measure_mono (euclideanBall_subset_euclideanClosedBall_abs x r) + +/-- Positive-radius explicit Euclidean balls have nonzero real volume. -/ +theorem volume_euclideanBall_toReal_ne_zero {d : ℕ} (x : Vec d) {r : ℝ} (hr : 0 < r) : + (MeasureTheory.volume (euclideanBall x r)).toReal ≠ 0 := by + rw [ENNReal.toReal_ne_zero] + constructor + · exact ne_of_gt + ((isOpen_euclideanBall x r).measure_pos MeasureTheory.volume + (euclideanBall_nonempty x hr)) + · exact volume_euclideanBall_ne_top x r + +/-- The volume measure restricted to an explicit Euclidean ball is finite. -/ +theorem isFiniteMeasure_volumeMeasureOn_euclideanBall {d : ℕ} (x : Vec d) (r : ℝ) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (euclideanBall x r)) := by + simpa [volumeMeasureOn] using + (MeasureTheory.isFiniteMeasure_restrict.mpr + (volume_euclideanBall_ne_top x r)) + +/-- +Mean-square deviation from zero is controlled by the square of the ambient +`L²` seminorm, with the expected finite-dimensional norm-equivalence factor. +-/ +theorem meanSquareDeviationVecOn_zero_le_card_mul_volume_inv_mul_eLpNorm_sq + {d : ℕ} {V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {F : Vec d → Vec d} + (hvol : 0 < (MeasureTheory.volume V).toReal) + (hF : MemVectorL2 V F) : + meanSquareDeviationVecOn V F 0 ≤ + (Fintype.card (Fin d) : ℝ) * ((MeasureTheory.volume V).toReal)⁻¹ * + (MeasureTheory.eLpNorm F (2 : ℝ≥0∞) (volumeMeasureOn V)).toReal ^ 2 := by + let card : ℝ := Fintype.card (Fin d) + have hdev : + meanSquareDeviationVecOn V F 0 = + volumeAverage V (fun x => vecNormSq (F x)) := by + simpa using + meanSquareDeviationVecOn_eq_volumeAverage_vecNormSq_sub_of_memVectorL2 + (V := V) (h := F) hF (0 : Vec d) + have hvec_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (F x)) V MeasureTheory.volume := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hF hF + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖F x‖ ^ (2 : ℕ)) V MeasureTheory.volume := by + have h := + hF.integrable_norm_rpow + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by norm_num : (2 : ℝ≥0∞) ≠ ⊤) + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, Real.rpow_two] using h + have hint_le : + ∫ x in V, vecNormSq (F x) ∂MeasureTheory.volume ≤ + ∫ x in V, card * ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_mono_ae hvec_int (hnorm_int.const_mul card) ?_ + exact Filter.Eventually.of_forall fun x => by + simpa [card] using Homogenization.vecNormSq_le_card_mul_norm_sq (F x) + have hconst_mul : + ∫ x in V, card * ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume = + card * ∫ x in V, ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hlp_sq : + (MeasureTheory.eLpNorm F (2 : ℝ≥0∞) (volumeMeasureOn V)).toReal ^ 2 = + ∫ x in V, ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume := by + have hraw : + (ENNReal.toReal + (MeasureTheory.eLpNorm F (ENNReal.ofReal (2 : ℝ)) (volumeMeasureOn V))) ^ + (2 : ℝ) = + ∫ x, ‖F x‖ ^ (2 : ℝ) ∂(volumeMeasureOn V) := by + simpa using + toReal_eLpNorm_ofReal_rpow_eq_integral_rpow_norm + (μ := volumeMeasureOn V) (f := F) (p := (2 : ℝ)) + (by norm_num : (0 : ℝ) < 2) + (by simpa using hF) + have hraw_nat : + (MeasureTheory.eLpNorm F (2 : ℝ≥0∞) (volumeMeasureOn V)).toReal ^ 2 = + ∫ x, ‖F x‖ ^ (2 : ℕ) ∂(volumeMeasureOn V) := by + simpa [Real.rpow_two] using hraw + simpa [volumeMeasureOn, MeasureTheory.IntegrableOn] using hraw_nat + rw [hdev] + unfold volumeAverage + calc + ((MeasureTheory.volume V).toReal)⁻¹ * + ∫ x in V, vecNormSq (F x) ∂MeasureTheory.volume + ≤ ((MeasureTheory.volume V).toReal)⁻¹ * + ∫ x in V, card * ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume := + mul_le_mul_of_nonneg_left hint_le (inv_nonneg.mpr hvol.le) + _ = card * ((MeasureTheory.volume V).toReal)⁻¹ * + ∫ x in V, ‖F x‖ ^ (2 : ℕ) ∂MeasureTheory.volume := by + rw [hconst_mul] + ring + _ = card * ((MeasureTheory.volume V).toReal)⁻¹ * + (MeasureTheory.eLpNorm F (2 : ℝ≥0∞) (volumeMeasureOn V)).toReal ^ 2 := by + rw [hlp_sq] + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MultiscalePoincare.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MultiscalePoincare.lean new file mode 100644 index 0000000000..ef7c1a48b0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/MultiscalePoincare.lean @@ -0,0 +1,116 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CubeNeumannCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare + +/-! # Multiscale Poincare -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +open scoped ENNReal BigOperators + +noncomputable section + +/-! +# Legacy disjoint-Besov multiscale Poincare compatibility lane + +The declarations in this namespace are retained only for compatibility with +the legacy disjoint-positive, totalized-real, componentwise-circ Besov +conventions. They are not the exact manuscript overlap/Euclidean statements. +-/ + +namespace Legacy + +/-- Legacy selected constant for the disjoint-positive, totalized-real, +componentwise-circ compatibility Poincare lane; not an exact manuscript +overlap/Euclidean constant. -/ +noncomputable abbrev fullVectorPoincareConstant {d : ℕ} [NeZero d] + (Q : Cube d) : ℝ := + Homogenization.fullVectorPoincareCubeConstant Q + +theorem fullVectorPoincareConstant_nonneg {d : ℕ} [NeZero d] + (Q : Cube d) : + 0 ≤ fullVectorPoincareConstant Q := by + simpa [fullVectorPoincareConstant] using + Homogenization.fullVectorPoincareCubeConstant_nonneg Q + +/-- Legacy full-dual multiscale Poincare compatibility estimate for `H¹` +functions on cubes; not an exact manuscript overlap/Euclidean statement. -/ +theorem h1_fullVectorPoincare {d : ℕ} [NeZero d] (Q : Cube d) + (u : H1Function (openCubeSet Q)) : + Homogenization.CubeDualFullVectorPoincareEstimate Q + (fullVectorPoincareConstant Q) + (fun x => u x) + (fun x => u.grad x) := by + simpa [fullVectorPoincareConstant] using + Homogenization.CubeDualFullVectorPoincareEstimate.of_h1Function Q u + +/-- Legacy descendant full-dual Poincare compatibility estimate for `H¹` +functions on cubes; not an exact manuscript overlap/Euclidean statement. -/ +theorem h1_descendantFullVectorPoincare {d : ℕ} [NeZero d] (Q : Cube d) + (u : H1Function (openCubeSet Q)) (N : ℕ) : + Homogenization.CubeDescendantDualFullVectorPoincareEstimate Q + (fullVectorPoincareConstant Q) + (cubeFluctuation Q (fun x => u x)) + (fun x => u.grad x) N := by + simpa [fullVectorPoincareConstant] using + Homogenization.CubeDescendantDualFullVectorPoincareEstimate.of_h1Function Q u N + +/-- Legacy descendant H1 Poincare compatibility estimate after componentwise +circ domination. This is not an exact manuscript overlap/Euclidean statement. + +This is the honest full-circ bridge available from the full-dual theorem. The +remaining gradient-to-function cleanup is the separate summation step from +local full-circ control to the finite-partial multiscale corridor, or an +equivalent direct infinite-depth summation theorem. -/ +theorem h1_descendantLocalFullCircPoincare {d : ℕ} [NeZero d] (Q : Cube d) + (u : H1Function (openCubeSet Q)) (N : ℕ) : + Homogenization.CubeLocalFullCircPoincareVectorEstimate Q + (fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) + (cubeFluctuation Q (fun x => u x)) + (fun x => u.grad x) N := by + exact + (h1_descendantFullVectorPoincare Q u N).to_localFullCircEstimate + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) + (fullVectorPoincareConstant_nonneg Q) + +/-- Legacy finite-depth, disjoint-positive/totalized-real, componentwise-circ +multiscale Poincare compatibility estimate; not an exact manuscript +overlap/Euclidean statement. -/ +theorem h1_fluctuation_partialNormTop_two_le_sum_grad_circNorm + {d : ℕ} [NeZero d] (Q : Cube d) (s : ℝ) (M : ℕ) + (u : H1Function (openCubeSet Q)) (hs0 : 0 < s) (hs1 : s < 1) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M + (cubeFluctuation Q (fun x => u x)) ≤ + (fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + circNegativeBesovNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) := by + let C : ℝ := fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1) + have hC : 0 ≤ C := by + exact mul_nonneg (fullVectorPoincareConstant_nonneg Q) + (Real.rpow_nonneg (by positivity) _) + simpa [C, circNegativeBesovNorm] using + Homogenization.CubeLocalFullCircPoincareVectorEstimate.fluctuation_partialNormTop_two_le_sum_circNorm + (h1_descendantLocalFullCircPoincare Q u M) + (Q := Q) (s := s) (C := C) (u := fun x => u x) + (G := fun x => u.grad x) (M := M) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) hs0.le hs1 hC + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NegativeBesovLocalize.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NegativeBesovLocalize.lean new file mode 100644 index 0000000000..bb2df42e9f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NegativeBesovLocalize.lean @@ -0,0 +1,686 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovLocalize +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge + +/-! # Negative Besov Localize -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Legacy negative Besov localization scaffolding + +This file records the legacy totalized/disjoint-real negative Besov +localization API retained for downstream compatibility. The proof pairs a +parent mean-zero dual test against the descendants, applies the local full-dual +bound on each descendant, and closes with the positive Besov localization +estimate for the test. +-/ + +namespace Legacy + +/-- Bound the mean-zero dual negative Besov seminorm by bounding its pairing +against every global mean-zero unit test. -/ +theorem cubeBesovDualMeanZeroSeminorm_le_of_forall_meanZeroTest_pairing_le {d : ℕ} + (Q : Cube d) (s : ℝ) (p q : ℝ≥0∞) (f : Vec d → ℝ) {B : ℝ} + (hp0 : cubeBesovConjExponent p ≠ 0) + (hpTop : cubeBesovConjExponent p ≠ ∞) + (hB : ∀ g : Vec d → ℝ, + CubeBesovDualMeanZeroTestGlobal Q s p q g → + |cubeBesovPairing Q f g| ≤ B) : + dualNegativeBesovSeminorm Q s p q f ≤ B := by + unfold dualNegativeBesovSeminorm cubeBesovDualMeanZeroSeminorm + refine csSup_le + (cubeBesovDualMeanZeroSeminormValueSet_nonempty Q s p q f hp0 hpTop) ?_ + intro r hr + rcases hr with ⟨g, hg, rfl⟩ + exact hB g hg + +/-- Split a parent cube Besov pairing into the normalized average of descendant +pairings. -/ +theorem cubeBesovPairing_eq_descendantsAverage_pairing_of_integrableOn {d : ℕ} + (Q : Cube d) (j : ℕ) (f g : Vec d → ℝ) + (hfg : MeasureTheory.IntegrableOn (fun x => f x * g x) + (cubeSet Q) MeasureTheory.volume) : + cubeBesovPairing Q f g = + descendantsAverage Q j (fun R => cubeBesovPairing R f g) := by + unfold cubeBesovPairing + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j (fun x => f x * g x) hfg] + +/-- Triangle-inequality form of the descendant pairing split. -/ +theorem abs_cubeBesovPairing_le_descendantsAverage_abs_pairing_of_integrableOn {d : ℕ} + (Q : Cube d) (j : ℕ) (f g : Vec d → ℝ) + (hfg : MeasureTheory.IntegrableOn (fun x => f x * g x) + (cubeSet Q) MeasureTheory.volume) : + |cubeBesovPairing Q f g| ≤ + descendantsAverage Q j (fun R => |cubeBesovPairing R f g|) := by + classical + have hsplit := cubeBesovPairing_eq_descendantsAverage_pairing_of_integrableOn + Q j f g hfg + let D : Finset (Cube d) := descendantsAtDepth Q j + let c : ℝ := (D.card : ℝ)⁻¹ + have hc_nonneg : 0 ≤ c := by + dsimp [c] + exact inv_nonneg.mpr (by positivity) + calc + |cubeBesovPairing Q f g| + = |descendantsAverage Q j (fun R => cubeBesovPairing R f g)| := by + rw [hsplit] + _ = |c * ∑ R ∈ D, cubeBesovPairing R f g| := by + rfl + _ = c * |∑ R ∈ D, cubeBesovPairing R f g| := by + rw [abs_mul, abs_of_nonneg hc_nonneg] + _ ≤ c * ∑ R ∈ D, |cubeBesovPairing R f g| := by + exact mul_le_mul_of_nonneg_left + (Finset.abs_sum_le_sum_abs (fun R => cubeBesovPairing R f g) D) + hc_nonneg + _ = descendantsAverage Q j (fun R => |cubeBesovPairing R f g|) := by + rfl + +/-- A global dual-test local `MemLp` hypothesis restricts to descendants. -/ +theorem cubeBesovDualLocalMemLpGlobal_restrict_to_descendant {d : ℕ} + {Q R : Cube d} {j : ℕ} {p : ℝ≥0∞} {g : Vec d → ℝ} + (hg : CubeBesovDualLocalMemLpGlobal Q p g) + (hR : R ∈ descendantsAtDepth Q j) : + CubeBesovDualLocalMemLpGlobal R p g := by + intro n S hS + exact hg (j + n) S (mem_descendantsAtDepth_add hR hS) + +theorem abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two_of_nonneg + {d : ℕ} (Q : Cube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * B := by + let A : ℝ := cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeBesovDualFullNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + (by rw [hpConj]; norm_num) (by rw [hpConj]; norm_num) + change |cubeBesovPairing Q u g| ≤ A * B + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + have hBδ_pos : 0 < B + δ := add_pos_of_nonneg_of_pos hB hδ_pos + have hnormδ : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ + B + δ := by + intro N + exact (hnorm N).trans (le_add_of_nonneg_right hδ_pos.le) + have hstrict := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two + Q s u g hs hu hBδ_pos hnormδ hmem + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + |cubeBesovPairing Q u g| ≤ A * (B + δ) := by + simpa [A] using hstrict + _ = A * B + A * δ := by ring + _ ≤ A * B + ε := by linarith + +/-- Local full-dual pairing bound with the Chapter 1 positive `q = 2` norm as +the test size. -/ +theorem abs_cubeBesovPairing_le_dualNegativeBesovNorm_mul_positiveBesovNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u g : Vec d → ℝ) + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g)) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + dualNegativeBesovNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * + positiveBesovNormTwo Q s g := by + have hB_nonneg : 0 ≤ positiveBesovNormTwo Q s g := + positiveBesovNormTwo_nonneg_of_bddAbove Q s g hBdd + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + have hnorm : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ + positiveBesovNormTwo Q s g := by + intro N + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g hqConjTop] + have hpartial := positiveBesovPartialNormTwo_le_normTwo_of_bddAbove Q s g hBdd N + simpa [positiveBesovPartialNormTwo, hpConj] using hpartial + simpa [dualNegativeBesovNorm] using + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two_of_nonneg + Q s u g hs hu hB_nonneg hnorm hmem + +private theorem integrableOn_mul_of_memLp_two_normalizedCubeMeasure {d : ℕ} + (Q : Cube d) (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.IntegrableOn (fun x => f x * g x) + (cubeSet Q) MeasureTheory.volume := by + have hint : MeasureTheory.Integrable (f * g) (normalizedCubeMeasure Q) := by + exact hf.integrable_mul hg + exact Homogenization.integrableOn_of_integrable_normalizedCubeMeasure Q + (by simpa using! hint) + +private theorem descendantsAverage_mul_le_sqrt_mul_sqrt {d : ℕ} + (Q : Cube d) (j : ℕ) (A B : Cube d → ℝ) + (hA : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R) + (hB : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ B R) : + descendantsAverage Q j (fun R => A R * B R) ≤ + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) * + Real.sqrt (descendantsAverage Q j (fun R => (B R) ^ 2)) := by + have hpq : Real.HolderConjugate (2 : ℝ) (2 : ℝ) := by + refine ⟨?_, ?_, ?_⟩ <;> norm_num + have h := descendantsAverage_mul_le_Lp_mul_Lq_of_nonneg Q j A B hpq hA hB + simpa [Real.sqrt_eq_rpow, Real.rpow_natCast] using h + +private theorem positiveBesovPartialNormTwo_bddAbove_of_meanZeroTestGlobal {d : ℕ} + (Q : Cube d) (s : ℝ) (g : Vec d → ℝ) + (hg : CubeBesovDualMeanZeroTestGlobal Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + refine ⟨1, ?_⟩ + rintro x ⟨N, rfl⟩ + have hnorm : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g ≤ 1 := by + rw [cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hg.2.1] + exact hg.1 (N + 1) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hqConjTop] at hnorm + simpa [positiveBesovPartialNormTwo, hpConj] using hnorm + +private theorem positiveBesovNormTwo_le_one_of_meanZeroTestGlobal {d : ℕ} + (Q : Cube d) (s : ℝ) (g : Vec d → ℝ) + (hg : CubeBesovDualMeanZeroTestGlobal Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + positiveBesovNormTwo Q s g ≤ 1 := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + unfold positiveBesovNormTwo + refine csSup_le ?_ ?_ + · exact ⟨positiveBesovPartialNormTwo Q s 1 g, ⟨0, by simp [positiveBesovPartialNormTwo]⟩⟩ + · rintro x ⟨N, rfl⟩ + have hnorm : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g ≤ 1 := by + rw [cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hg.2.1] + exact hg.1 (N + 1) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hqConjTop] at hnorm + simpa [positiveBesovPartialNormTwo, hpConj] using hnorm + +private theorem positiveBesovPartialNormTwo_bddAbove_of_fullTest {d : ℕ} + (Q : Cube d) (s : ℝ) (g : Vec d → ℝ) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + refine ⟨1, ?_⟩ + rintro x ⟨N, rfl⟩ + have hnorm : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g ≤ 1 := + hg.1 (N + 1) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hqConjTop] at hnorm + simpa [positiveBesovPartialNormTwo, hpConj] using hnorm + +private theorem positiveBesovNormTwo_le_one_of_fullTest {d : ℕ} + (Q : Cube d) (s : ℝ) (g : Vec d → ℝ) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + positiveBesovNormTwo Q s g ≤ 1 := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + unfold positiveBesovNormTwo + refine csSup_le ?_ ?_ + · exact ⟨positiveBesovPartialNormTwo Q s 1 g, ⟨0, by simp [positiveBesovPartialNormTwo]⟩⟩ + · rintro x ⟨N, rfl⟩ + have hnorm : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g ≤ 1 := + hg.1 (N + 1) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) g hqConjTop] at hnorm + simpa [positiveBesovPartialNormTwo, hpConj] using hnorm + +private theorem positiveBesovPartialNormTwo_bddAbove_of_parent_bddAbove {d : ℕ} + {Q R : Cube d} {j : ℕ} (s : ℝ) (u : Vec d → ℝ) + (hs : 0 ≤ s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hR : R ∈ descendantsAtDepth Q j) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) u) := by + classical + rcases hParentBdd with ⟨B, hB⟩ + have hB_nonneg : 0 ≤ B := by + have hB0 : positiveBesovPartialNormTwo Q s (0 + 1) u ≤ B := hB ⟨0, rfl⟩ + exact (positiveBesovPartialNormTwo_nonneg Q s 1 u).trans hB0 + let D : Finset (Cube d) := descendantsAtDepth Q j + let c : ℝ := Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + have hc_pos : 0 < c := by + dsimp [c] + exact Real.rpow_pos_of_pos (by norm_num) _ + have hc_nonneg : 0 ≤ c := hc_pos.le + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hcard_nonneg : 0 ≤ (D.card : ℝ) := le_of_lt hcard_pos + refine ⟨c⁻¹ * Real.sqrt ((D.card : ℝ) * (2 * B) ^ 2), ?_⟩ + rintro x ⟨N, rfl⟩ + let F : Cube d → ℝ := + fun S => (c * positiveBesovPartialNormTwo S s (N + 1) u) ^ 2 + have hparent_le : positiveBesovPartialNormTwo Q s (j + (N + 1)) u ≤ B := by + have hidx : j + (N + 1) = (j + N) + 1 := by omega + rw [hidx] + exact hB ⟨j + N, rfl⟩ + have hparent_nonneg : 0 ≤ positiveBesovPartialNormTwo Q s (j + (N + 1)) u := + positiveBesovPartialNormTwo_nonneg Q s (j + (N + 1)) u + have hparent_sq_le : + (2 * positiveBesovPartialNormTwo Q s (j + (N + 1)) u) ^ 2 ≤ + (2 * B) ^ 2 := by + nlinarith + have havg_le_parent : + descendantsAverage Q j F ≤ + (2 * positiveBesovPartialNormTwo Q s (j + (N + 1)) u) ^ 2 := by + dsimp [F, c] + exact descendantsAverage_sq_scaled_positiveBesovPartialNormTwo_le Q s u j (N + 1) hs hu + have havg_le_Bsq : descendantsAverage Q j F ≤ (2 * B) ^ 2 := + havg_le_parent.trans hparent_sq_le + have hsum_le : (∑ S ∈ D, F S) ≤ (D.card : ℝ) * (2 * B) ^ 2 := by + have hmul : (D.card : ℝ) * descendantsAverage Q j F ≤ + (D.card : ℝ) * (2 * B) ^ 2 := + mul_le_mul_of_nonneg_left havg_le_Bsq hcard_nonneg + have hdesc : (D.card : ℝ) * descendantsAverage Q j F = ∑ S ∈ D, F S := by + dsimp [descendantsAverage, D] + field_simp [ne_of_gt hcard_pos] + rwa [hdesc] at hmul + have hterm_le_sum : F R ≤ ∑ S ∈ D, F S := by + exact Finset.single_le_sum + (fun S hS => sq_nonneg (c * positiveBesovPartialNormTwo S s (N + 1) u)) + (by simpa [D] using hR) + have hterm_sq_le : + (c * positiveBesovPartialNormTwo R s (N + 1) u) ^ 2 ≤ + (D.card : ℝ) * (2 * B) ^ 2 := + hterm_le_sum.trans hsum_le + have hcx_le : + c * positiveBesovPartialNormTwo R s (N + 1) u ≤ + Real.sqrt ((D.card : ℝ) * (2 * B) ^ 2) := + Real.le_sqrt_of_sq_le hterm_sq_le + have hx_eq : positiveBesovPartialNormTwo R s (N + 1) u = + c⁻¹ * (c * positiveBesovPartialNormTwo R s (N + 1) u) := by + field_simp [hc_pos.ne'] + change positiveBesovPartialNormTwo R s (N + 1) u ≤ + c⁻¹ * Real.sqrt ((D.card : ℝ) * (2 * B) ^ 2) + rw [hx_eq] + exact mul_le_mul_of_nonneg_left hcx_le (inv_nonneg.mpr hc_nonneg) + +private theorem negativeBesovLocalize_pairing_le_of_parent_test_bound {d : ℕ} + (Q : Cube d) (s : ℝ) (f g : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g)) + (hLocalMem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) + (hParentPos_le_one : positiveBesovNormTwo Q s g ≤ 1) : + |cubeBesovPairing Q f g| ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + classical + let a : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + let b : ℝ := Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + let negRms : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [hpConj] + norm_num + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + have ha_pos : 0 < a := by + dsimp [a] + exact Real.rpow_pos_of_pos (by norm_num) _ + have hb_pos : 0 < b := by + dsimp [b] + exact Real.rpow_pos_of_pos (by norm_num) _ + have hab : a * b = 1 := by + dsimp [a, b] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + ring_nf + norm_num + have hfg : + MeasureTheory.IntegrableOn (fun x => f x * g x) + (cubeSet Q) MeasureTheory.volume := + integrableOn_mul_of_memLp_two_normalizedCubeMeasure Q f g hf hgMem + have hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) g) := by + intro R hR + exact positiveBesovPartialNormTwo_bddAbove_of_parent_bddAbove + s g hs.le hgMem hR hParentBdd + have hParentPos_nonneg : 0 ≤ positiveBesovNormTwo Q s g := + positiveBesovNormTwo_nonneg_of_bddAbove Q s g hParentBdd + have hposSq : + descendantsAverage Q j + (fun R => (b * positiveBesovNormTwo R s g) ^ 2) ≤ + (2 * positiveBesovNormTwo Q s g) ^ 2 := by + dsimp [b] + exact descendantsAverage_sq_scaled_positiveBesovNormTwo_le + Q s g j hs.le hgMem hParentBdd hLocalBdd + have hposRms_le_two : + Real.sqrt + (descendantsAverage Q j + (fun R => (b * positiveBesovNormTwo R s g) ^ 2)) ≤ 2 := by + have htwo_parent_nonneg : 0 ≤ 2 * positiveBesovNormTwo Q s g := by + nlinarith + calc + Real.sqrt + (descendantsAverage Q j + (fun R => (b * positiveBesovNormTwo R s g) ^ 2)) + ≤ Real.sqrt ((2 * positiveBesovNormTwo Q s g) ^ 2) := + Real.sqrt_le_sqrt hposSq + _ = |2 * positiveBesovNormTwo Q s g| := by + rw [Real.sqrt_sq_eq_abs] + _ = 2 * positiveBesovNormTwo Q s g := by + rw [abs_of_nonneg htwo_parent_nonneg] + _ ≤ 2 := by + nlinarith + have havg_pair_scaled : + descendantsAverage Q j (fun R => |cubeBesovPairing R f g|) ≤ + descendantsAverage Q j + (fun R => + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) * + (b * positiveBesovNormTwo R s g)) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hfR : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hf + have hPairR : + |cubeBesovPairing R f g| ≤ + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + positiveBesovNormTwo R s g := + abs_cubeBesovPairing_le_dualNegativeBesovNorm_mul_positiveBesovNormTwo + R s f g hs hfR (hLocalBdd R hR) + (cubeBesovDualLocalMemLpGlobal_restrict_to_descendant hLocalMem hR) + calc + |cubeBesovPairing R f g| ≤ + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + positiveBesovNormTwo R s g := hPairR + _ = + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) * + (b * positiveBesovNormTwo R s g) := by + calc + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + positiveBesovNormTwo R s g = + (a * b) * + (dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f * + positiveBesovNormTwo R s g) := by + rw [hab] + ring + _ = + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) * + (b * positiveBesovNormTwo R s g) := by + ring + have hA_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f := by + intro R _hR + exact mul_nonneg ha_pos.le + (by + simpa [dualNegativeBesovNorm] using + cubeBesovDualFullNorm_nonneg R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f hp0 hpTop) + have hB_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ b * positiveBesovNormTwo R s g := by + intro R hR + exact mul_nonneg hb_pos.le + (positiveBesovNormTwo_nonneg_of_bddAbove R s g (hLocalBdd R hR)) + have hcauchy : + descendantsAverage Q j + (fun R => + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) * + (b * positiveBesovNormTwo R s g)) ≤ + negRms * + Real.sqrt + (descendantsAverage Q j + (fun R => (b * positiveBesovNormTwo R s g) ^ 2)) := by + dsimp [negRms] + exact descendantsAverage_mul_le_sqrt_mul_sqrt Q j + (fun R => a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) + (fun R => b * positiveBesovNormTwo R s g) hA_nonneg hB_nonneg + have hsplit := + abs_cubeBesovPairing_le_descendantsAverage_abs_pairing_of_integrableOn + Q j f g hfg + have hnegRms_nonneg : 0 ≤ negRms := by + dsimp [negRms] + exact Real.sqrt_nonneg _ + calc + |cubeBesovPairing Q f g| + ≤ descendantsAverage Q j (fun R => |cubeBesovPairing R f g|) := hsplit + _ ≤ descendantsAverage Q j + (fun R => + (a * dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) * + (b * positiveBesovNormTwo R s g)) := havg_pair_scaled + _ ≤ negRms * + Real.sqrt + (descendantsAverage Q j + (fun R => (b * positiveBesovNormTwo R s g) ^ 2)) := hcauchy + _ ≤ negRms * 2 := by + exact mul_le_mul_of_nonneg_left hposRms_le_two hnegRms_nonneg + _ = negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + dsimp [negRms, a, negativeBesovLocalizeConstant] + ring + +/-- Manuscript negative Besov localization, with the parent `L²` hypothesis +already converted to the normalized cube measure. -/ +theorem negativeBesovLocalize_of_memLp {d : ℕ} + (Q : Cube d) (s : ℝ) (f : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + dualNegativeBesovSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [hpConj] + norm_num + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + refine cubeBesovDualMeanZeroSeminorm_le_of_forall_meanZeroTest_pairing_le + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f hp0 hpTop ?_ + intro g hg + have hgMem : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj] using hg.memLp + have hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g) := + positiveBesovPartialNormTwo_bddAbove_of_meanZeroTestGlobal Q s g hg + have hParentPos_le_one : positiveBesovNormTwo Q s g ≤ 1 := + positiveBesovNormTwo_le_one_of_meanZeroTestGlobal Q s g hg + exact negativeBesovLocalize_pairing_le_of_parent_test_bound + Q s f g j hs hf hgMem hParentBdd hg.2.2 hParentPos_le_one + +/-- Full-dual companion to the negative Besov localization theorem, with the +parent `L²` hypothesis already converted to the normalized cube measure. + +This is not the manuscript mean-zero statement, but it is the componentwise +form used by downstream vector genuine-dual consumers. -/ +theorem negativeBesovFullLocalize_of_memLp {d : ℕ} + (Q : Cube d) (s : ℝ) (f : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + dualNegativeBesovNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [hpConj] + norm_num + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + refine cubeBesovDualFullNorm_le_of_forall_fullTest_pairing_le + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f hp0 hpTop ?_ + intro g hg + have hgMem : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj] using hg.memLp + have hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) g) := + positiveBesovPartialNormTwo_bddAbove_of_fullTest Q s g hg + have hParentPos_le_one : positiveBesovNormTwo Q s g ≤ 1 := + positiveBesovNormTwo_le_one_of_fullTest Q s g hg + exact negativeBesovLocalize_pairing_le_of_parent_test_bound + Q s f g j hs hf hgMem hParentBdd hg.2 hParentPos_le_one + +/-- Full-dual companion to `negativeBesovLocalize`, stated with the public +`MemScalarL2` hypothesis. -/ +theorem negativeBesovFullLocalize {d : ℕ} + (Q : Cube d) (s : ℝ) (f : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hf : MemScalarL2 (cubeSet Q) f) : + dualNegativeBesovNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + exact negativeBesovFullLocalize_of_memLp Q s f j hs + (memLp_normalizedCubeMeasure_of_memScalarL2_cubeSet Q hf) + +/-- Cube-general form of the negative Besov localization lemma. -/ +theorem negativeBesovLocalize_cube {d : ℕ} + (Q : Cube d) (s : ℝ) (f : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hf : MemScalarL2 (cubeSet Q) f) : + dualNegativeBesovSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + exact negativeBesovLocalize_of_memLp Q s f j hs + (memLp_normalizedCubeMeasure_of_memScalarL2_cubeSet Q hf) + +/-- Manuscript Lemma `l.Besov.negative.localize.function.spaces`. +The mean-zero dual negative Besov seminorm of `f` on the origin cube `⌈_m` is +bounded by the geometrically weighted root-mean-square of full local dual +negative Besov norms on each triadic descendant `z + ⌈_n` for `n ≤ m`. -/ +theorem negativeBesovLocalize {d : ℕ} {s : ℝ} {m n : ℤ} + (_hd : 1 ≤ d) (hs_pos : 0 < s) (_hs_lt_one : s < 1) + (hnm : n ≤ m) (f : Vec d → ℝ) + (hf : MemScalarL2 (cubeSet (originCube d m)) f) : + dualNegativeBesovSeminorm (originCube d m) s + (2 : ℝ≥0∞) (2 : ℝ≥0∞) f ≤ + negativeBesovLocalizeConstant d * + Real.sqrt + (descendantsAverage (originCube d m) (Int.toNat (m - n)) fun R => + (Real.rpow (3 : ℝ) ((-s) * ((n - m : ℤ) : ℝ)) * + dualNegativeBesovNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) f) ^ 2) := by + have hdepth_nonneg : 0 ≤ m - n := sub_nonneg.mpr hnm + have hdepth_cast : ((Int.toNat (m - n) : ℕ) : ℝ) = ((m - n : ℤ) : ℝ) := by + exact_mod_cast (Int.toNat_of_nonneg hdepth_nonneg) + have hfactor : + Real.rpow (3 : ℝ) (s * ((Int.toNat (m - n) : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) ((-s) * ((n - m : ℤ) : ℝ)) := by + congr 1 + rw [hdepth_cast] + norm_num + ring + rw [← hfactor] + exact negativeBesovLocalize_cube (Q := originCube d m) (s := s) (f := f) + (j := Int.toNat (m - n)) hs_pos hf + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NormScaling.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NormScaling.lean new file mode 100644 index 0000000000..f9746660f4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/NormScaling.lean @@ -0,0 +1,350 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Algebra +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace + +/-! # Norm Scaling -/ + +@[expose] public section + +open scoped Pointwise ENNReal + +namespace Homogenization +namespace Book +namespace Ch01 + +/-! +# Scaling of normalized averages + +These are the Chapter 1 bookkeeping lemmas for dilation. The main use in +Chapter 3 is the last theorem: a unit-scale estimate for the pulled-back +gradient transfers to the physical cube with the expected `r^{-2}` factor on +the right-hand side. +-/ + +noncomputable section + +/-- Normalized volume averages are invariant under translation of the domain, +with the function pulled back by the inverse translation. -/ +theorem volumeAverage_translateSet_comp_subRight {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (f : Vec d → ℝ) : + volumeAverage (translateSet z U) (fun x => f (x - z)) = + volumeAverage U f := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + exact setIntegral_comp_subRight_translateSet (d := d) (E := ℝ) z U f + +/-- Equivalent forward form of translation invariance for normalized volume +averages. -/ +theorem volumeAverage_translateSet_eq_comp_addRight {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (f : Vec d → ℝ) : + volumeAverage (translateSet z U) f = + volumeAverage U (fun x => f (x + z)) := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + symm + exact setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U f + +/-- Scalar normalized `L²` square is invariant under translation of the domain, +with the scalar field pulled back. -/ +theorem volumeAverage_sq_translateSet_comp_subRight {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (u : Vec d → ℝ) : + volumeAverage (translateSet z U) (fun x => u (x - z) ^ (2 : ℕ)) = + volumeAverage U (fun x => u x ^ (2 : ℕ)) := by + simpa using + volumeAverage_translateSet_comp_subRight (d := d) z U + (fun x => u x ^ (2 : ℕ)) + +/-- Vector normalized `L²` square is invariant under translation of the domain, +with the vector field pulled back. -/ +theorem volumeAverage_vecNormSq_translateSet_comp_subRight {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (G : Vec d → Vec d) : + volumeAverage (translateSet z U) (fun x => vecNormSq (G (x - z))) = + volumeAverage U (fun x => vecNormSq (G x)) := by + simpa using + volumeAverage_translateSet_comp_subRight (d := d) z U + (fun x => vecNormSq (G x)) + +/-- Lebesgue volume of a positive dilation, written in `toReal` form. -/ +theorem volume_smul_toReal_of_pos {d : ℕ} {r : ℝ} (hr : 0 < r) + (U : Set (Vec d)) : + (MeasureTheory.volume (r • U)).toReal = + r ^ d * (MeasureTheory.volume U).toReal := by + have hmeasure : + MeasureTheory.volume (r • U) = + ENNReal.ofReal (r ^ d) * MeasureTheory.volume U := by + simpa [Vec] using + (MeasureTheory.Measure.addHaar_smul_of_nonneg + (μ := MeasureTheory.volume) (E := Vec d) hr.le U) + rw [hmeasure, ENNReal.toReal_mul, + ENNReal.toReal_ofReal (pow_nonneg hr.le d)] + +/-- Normalized volume averages are invariant under positive dilation of the +domain, with the function pulled back by the dilation map. -/ +theorem volumeAverage_smul_set_comp_smul_of_pos {d : ℕ} {r : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (f : Vec d → ℝ) : + volumeAverage (r • U) f = + volumeAverage U (fun x => f (r • x)) := by + have hvol := volume_smul_toReal_of_pos (d := d) hr U + have hscale_pos : 0 < r ^ d := pow_pos hr d + have hsetIntegral : + ∫ x in U, f (r • x) ∂MeasureTheory.volume = + (r ^ d)⁻¹ * ∫ y in r • U, f y ∂MeasureTheory.volume := by + simpa [Vec, smul_eq_mul] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := f) (s := U) hr) + unfold volumeAverage + rw [hsetIntegral, hvol] + by_cases hU_zero : (MeasureTheory.volume U).toReal = 0 + · simp [hU_zero] + · field_simp [hU_zero, hscale_pos.ne'] + +/-- Raw set-integral form of positive dilation change of variables. -/ +theorem setIntegral_comp_smul_of_pos {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {r : ℝ} (hr : 0 < r) (U : Set (Vec d)) (f : Vec d → E) : + ∫ x in U, f (r • x) ∂MeasureTheory.volume = + (r ^ d)⁻¹ • ∫ y in r • U, f y ∂MeasureTheory.volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := f) (s := U) hr) + +/-- Forward raw set-integral form of positive dilation change of variables. -/ +theorem setIntegral_smul_set_eq_comp_smul_of_pos {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {r : ℝ} (hr : 0 < r) (U : Set (Vec d)) (f : Vec d → E) : + ∫ y in r • U, f y ∂MeasureTheory.volume = + r ^ d • ∫ x in U, f (r • x) ∂MeasureTheory.volume := by + have hcomp := setIntegral_comp_smul_of_pos (d := d) (E := E) hr U f + have hpow_ne : r ^ d ≠ 0 := pow_ne_zero d hr.ne' + calc + ∫ y in r • U, f y ∂MeasureTheory.volume = + r ^ d • ((r ^ d)⁻¹ • ∫ y in r • U, f y ∂MeasureTheory.volume) := by + rw [smul_smul, mul_inv_cancel₀ hpow_ne, one_smul] + _ = r ^ d • ∫ x in U, f (r • x) ∂MeasureTheory.volume := by + rw [hcomp] + +/-- +Raw set-integral form of a positive dilation followed by translation. +-/ +theorem setIntegral_translateSet_smul_set_eq_comp_affine_of_pos + {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {r : ℝ} (hr : 0 < r) (z : Vec d) (U : Set (Vec d)) + (f : Vec d → E) : + ∫ y in translateSet z (r • U), f y ∂MeasureTheory.volume = + r ^ d • ∫ x in U, f (r • x + z) ∂MeasureTheory.volume := by + calc + ∫ y in translateSet z (r • U), f y ∂MeasureTheory.volume = + ∫ y in r • U, f (y + z) ∂MeasureTheory.volume := by + exact (setIntegral_comp_addRight_translateSet + (d := d) (E := E) z (r • U) f).symm + _ = r ^ d • ∫ x in U, f (r • x + z) ∂MeasureTheory.volume := + setIntegral_smul_set_eq_comp_smul_of_pos + (d := d) (E := E) hr U (fun y => f (y + z)) + +/-- Raw set integrals over explicit Euclidean balls reduce to unit-ball +integrals by affine pullback. -/ +theorem setIntegral_euclideanBall_eq_unit_affine_of_pos + {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {r : ℝ} (hr : 0 < r) (z : Vec d) (f : Vec d → E) : + ∫ y in euclideanBall z r, f y ∂MeasureTheory.volume = + r ^ d • ∫ x in euclideanBall (0 : Vec d) 1, + f (r • x + z) ∂MeasureTheory.volume := by + rw [euclideanBall_eq_translateSet_smul_unit_of_pos z hr] + exact setIntegral_translateSet_smul_set_eq_comp_affine_of_pos + (d := d) (E := E) hr z (euclideanBall (0 : Vec d) 1) f + +/-- Scalar normalized `L²` square is invariant under positive dilation of the +domain, with the scalar field pulled back. -/ +theorem volumeAverage_sq_comp_smul_of_pos {d : ℕ} {r : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (u : Vec d → ℝ) : + volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) = + volumeAverage U (fun x => u (r • x) ^ (2 : ℕ)) := by + simpa using + volumeAverage_smul_set_comp_smul_of_pos (d := d) hr U + (fun y => u y ^ (2 : ℕ)) + +/-- Vector normalized `L²` square is invariant under positive dilation of the +domain, with the vector field pulled back. -/ +theorem volumeAverage_vecNormSq_comp_smul_of_pos {d : ℕ} {r : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (G : Vec d → Vec d) : + volumeAverage (r • U) (fun y => vecNormSq (G y)) = + volumeAverage U (fun x => vecNormSq (G (r • x))) := by + simpa using + volumeAverage_smul_set_comp_smul_of_pos (d := d) hr U + (fun y => vecNormSq (G y)) + +/-- Normalized volume averages are invariant under a positive dilation followed +by a translation. -/ +theorem volumeAverage_translateSet_smul_set_comp_affine_of_pos {d : ℕ} + {r : ℝ} (hr : 0 < r) (z : Vec d) (U : Set (Vec d)) (f : Vec d → ℝ) : + volumeAverage (translateSet z (r • U)) f = + volumeAverage U (fun x => f (r • x + z)) := by + calc + volumeAverage (translateSet z (r • U)) f = + volumeAverage (r • U) (fun y => f (y + z)) := + volumeAverage_translateSet_eq_comp_addRight z (r • U) f + _ = volumeAverage U (fun x => f (r • x + z)) := + volumeAverage_smul_set_comp_smul_of_pos (d := d) hr U + (fun y => f (y + z)) + +/-- +Normalized averages over explicit Euclidean balls reduce to unit-ball +averages by affine pullback. +-/ +theorem volumeAverage_euclideanBall_eq_unit_affine_of_pos {d : ℕ} + {r : ℝ} (hr : 0 < r) (z : Vec d) (f : Vec d → ℝ) : + volumeAverage (euclideanBall z r) f = + volumeAverage (euclideanBall (0 : Vec d) 1) (fun x => f (r • x + z)) := by + rw [euclideanBall_eq_translateSet_smul_unit_of_pos z hr] + exact volumeAverage_translateSet_smul_set_comp_affine_of_pos + (d := d) hr z (euclideanBall (0 : Vec d) 1) f + +/-- +Normalized averages over explicit closed Euclidean balls reduce to unit-ball +averages by affine pullback. +-/ +theorem volumeAverage_euclideanClosedBall_eq_unit_affine_of_pos {d : ℕ} + {r : ℝ} (hr : 0 < r) (z : Vec d) (f : Vec d → ℝ) : + volumeAverage (euclideanClosedBall z r) f = + volumeAverage (euclideanClosedBall (0 : Vec d) 1) (fun x => f (r • x + z)) := by + rw [euclideanClosedBall_eq_translateSet_smul_unit_of_pos z hr] + exact volumeAverage_translateSet_smul_set_comp_affine_of_pos + (d := d) hr z (euclideanClosedBall (0 : Vec d) 1) f + +/-- Inverse-pullback form of affine invariance for normalized averages. -/ +theorem volumeAverage_translateSet_smul_set_comp_inv_affine_of_pos {d : ℕ} + {r : ℝ} (hr : 0 < r) (z : Vec d) (U : Set (Vec d)) (f : Vec d → ℝ) : + volumeAverage (translateSet z (r • U)) + (fun y => f (r⁻¹ • (y - z))) = + volumeAverage U f := by + rw [volumeAverage_translateSet_smul_set_comp_affine_of_pos (d := d) hr z U] + congr 1 + funext x + have hr_ne : r ≠ 0 := hr.ne' + congr 1 + ext i + simp [Pi.smul_apply, smul_eq_mul, sub_eq_add_neg, hr_ne] + +/-- Scalar normalized `L²` square is invariant under a positive dilation +followed by a translation, with the scalar field pulled back. -/ +theorem volumeAverage_sq_translateSet_smul_set_comp_inv_affine_of_pos {d : ℕ} + {r : ℝ} (hr : 0 < r) (z : Vec d) (U : Set (Vec d)) (u : Vec d → ℝ) : + volumeAverage (translateSet z (r • U)) + (fun y => u (r⁻¹ • (y - z)) ^ (2 : ℕ)) = + volumeAverage U (fun x => u x ^ (2 : ℕ)) := by + simpa using + volumeAverage_translateSet_smul_set_comp_inv_affine_of_pos + (d := d) hr z U (fun x => u x ^ (2 : ℕ)) + +/-- Vector normalized `L²` square is invariant under a positive dilation +followed by a translation, with the vector field pulled back. -/ +theorem volumeAverage_vecNormSq_translateSet_smul_set_comp_inv_affine_of_pos + {d : ℕ} {r : ℝ} (hr : 0 < r) (z : Vec d) (U : Set (Vec d)) + (G : Vec d → Vec d) : + volumeAverage (translateSet z (r • U)) + (fun y => vecNormSq (G (r⁻¹ • (y - z)))) = + volumeAverage U (fun x => vecNormSq (G x)) := by + simpa using + volumeAverage_translateSet_smul_set_comp_inv_affine_of_pos + (d := d) hr z U (fun x => vecNormSq (G x)) + +/-- Scalar normalized `L²` square after an additional amplitude scaling. -/ +theorem volumeAverage_sq_scaled_comp_smul_of_pos {d : ℕ} {r : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (u : Vec d → ℝ) : + volumeAverage U (fun x => (r * u (r • x)) ^ (2 : ℕ)) = + r ^ (2 : ℕ) * volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) := by + calc + volumeAverage U (fun x => (r * u (r • x)) ^ (2 : ℕ)) = + volumeAverage U (fun x => r ^ (2 : ℕ) * (u (r • x) ^ (2 : ℕ))) := by + congr 1 + funext x + ring + _ = r ^ (2 : ℕ) * + volumeAverage U (fun x => u (r • x) ^ (2 : ℕ)) := by + have h : (fun x => r ^ (2 : ℕ) * u (r • x) ^ (2 : ℕ)) = + r ^ (2 : ℕ) • (fun x => u (r • x) ^ (2 : ℕ)) := by + funext x + simp [Pi.smul_apply, smul_eq_mul] + rw [h] + exact volumeAverage_smul U (r ^ (2 : ℕ)) + (fun x => u (r • x) ^ (2 : ℕ)) + _ = r ^ (2 : ℕ) * + volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) := by + rw [← volumeAverage_sq_comp_smul_of_pos (d := d) hr U u] + +/-- Vector normalized `L²` square after the gradient-style amplitude scaling: +`G` pulls back as `r • G (r • x)`. -/ +theorem volumeAverage_vecNormSq_scaled_comp_smul_of_pos {d : ℕ} {r : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (G : Vec d → Vec d) : + volumeAverage U (fun x => vecNormSq (r • G (r • x))) = + r ^ (2 : ℕ) * volumeAverage (r • U) (fun y => vecNormSq (G y)) := by + calc + volumeAverage U (fun x => vecNormSq (r • G (r • x))) = + volumeAverage U (fun x => r ^ (2 : ℕ) * vecNormSq (G (r • x))) := by + congr 1 + funext x + rw [vecNormSq_smul] + _ = r ^ (2 : ℕ) * + volumeAverage U (fun x => vecNormSq (G (r • x))) := by + have h : (fun x => r ^ (2 : ℕ) * vecNormSq (G (r • x))) = + r ^ (2 : ℕ) • (fun x => vecNormSq (G (r • x))) := by + funext x + simp [Pi.smul_apply, smul_eq_mul] + rw [h] + exact volumeAverage_smul U (r ^ (2 : ℕ)) + (fun x => vecNormSq (G (r • x))) + _ = r ^ (2 : ℕ) * + volumeAverage (r • U) (fun y => vecNormSq (G y)) := by + rw [← volumeAverage_vecNormSq_comp_smul_of_pos (d := d) hr U G] + +/-- Transfer a unit-scale Caccioppoli-shaped estimate through a positive +dilation. The gradient pullback contributes exactly the physical `r^{-2}` +factor on the right-hand side. -/ +theorem caccioppoliScale_from_unit_averages {d : ℕ} {r C : ℝ} + (hr : 0 < r) (U : Set (Vec d)) (u : Vec d → ℝ) (G : Vec d → Vec d) + (hunit : + volumeAverage U (fun x => vecNormSq (r • G (r • x))) ≤ + C * volumeAverage U (fun x => u (r • x) ^ (2 : ℕ))) : + volumeAverage (r • U) (fun y => vecNormSq (G y)) ≤ + r⁻¹ ^ (2 : ℕ) * C * + volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) := by + have hgrad := + volumeAverage_vecNormSq_scaled_comp_smul_of_pos (d := d) hr U G + have hu := volumeAverage_sq_comp_smul_of_pos (d := d) hr U u + have hscaled : + r ^ (2 : ℕ) * + volumeAverage (r • U) (fun y => vecNormSq (G y)) ≤ + C * volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) := by + simpa [hgrad, ← hu] using hunit + have hr2_pos : 0 < r ^ (2 : ℕ) := pow_pos hr 2 + calc + volumeAverage (r • U) (fun y => vecNormSq (G y)) = + (r ^ (2 : ℕ))⁻¹ * + (r ^ (2 : ℕ) * + volumeAverage (r • U) (fun y => vecNormSq (G y))) := by + field_simp [hr2_pos.ne'] + _ ≤ (r ^ (2 : ℕ))⁻¹ * + (C * volumeAverage (r • U) (fun y => u y ^ (2 : ℕ))) := by + exact mul_le_mul_of_nonneg_left hscaled (inv_nonneg.mpr hr2_pos.le) + _ = r⁻¹ ^ (2 : ℕ) * C * + volumeAverage (r • U) (fun y => u y ^ (2 : ℕ)) := by + field_simp [hr.ne'] + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/Poincare.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/Poincare.lean new file mode 100644 index 0000000000..3eb7c5b444 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/Poincare.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p + +/-! # Poincare -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +/-- Public bundled mean-zero `L²` Poincare estimate on bounded open convex +domains. -/ +noncomputable def meanZeroL2PoincareEstimate {d : ℕ} + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + H1CoerciveEstimate U := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + exact Homogenization.h1CoerciveEstimate_of_isOpenBoundedConvexDomain hU + +/-- Public existential form of mean-zero `L²` Poincare on bounded open convex +domains. -/ +theorem exists_meanZeroL2PoincareConstant {d : ℕ} + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : H1MeanZeroFunction U, u.valueL2Norm ≤ C * u.gradientL2Norm := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + exact Homogenization.exists_poincare_constant_of_isOpenBoundedConvexDomain hU + +/-- Public bundled finite-`p` mean-zero Poincare estimate on bounded open +convex domains. -/ +noncomputable def meanZeroW1pPoincareEstimate {d : ℕ} + {U : Set (Vec d)} {q : ℝ} + (hU : IsOpenBoundedConvexDomain U) (hq : 1 < q) : + W1pPoincareEstimate U (ENNReal.ofReal q) := + Homogenization.w1pPoincareEstimate_of_isOpenBoundedConvexDomain hU hq + +/-- Public finite-`p` sub-average Poincare estimate on bounded open convex +domains. -/ +theorem exists_subAverageW1pPoincareConstant {d : ℕ} [NeZero d] + {U : Set (Vec d)} {q : ℝ} + (hU : IsOpenBoundedConvexDomain U) (hq : 1 < q) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : W1pFunction U (ENNReal.ofReal q), + u.subAverageLpSeminorm ≤ C * u.gradientCoordLpSeminormSum := + W1pFunction.exists_subAverage_poincare_constant_of_isOpenBoundedConvexDomain hU hq + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovLocalize.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovLocalize.lean new file mode 100644 index 0000000000..55da3e22d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovLocalize.lean @@ -0,0 +1,873 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection + +/-! # Positive Besov Localize -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Legacy finite positive Besov localization + +This file records bounded scalar `q = 2` localization helpers for the legacy +disjoint, finite-truncation/real-`sSup` compatibility lane. They are not +statements about the manuscript's exact overlapping `ENNReal` definitions. +The unscaled full finite norm contains a cube-average term, so its unscaled +localization statement is stated for the finite seminorm part. The scaled form +controls the full finite norm by the parent `positiveBesovPartialNormTwo`. +-/ + +namespace Legacy + +private theorem cubeBesovDepthWeight_eq_of_mem_descendantsAtDepth {d : ℕ} + {Q R : Cube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) (s : ℝ) (n : ℕ) : + cubeBesovDepthWeight R s n = cubeBesovDepthWeight Q s (j + n) := by + have hbase : + cubeScaleFactor R / (3 : ℝ) ^ n = + cubeScaleFactor Q / (3 : ℝ) ^ (j + n) := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + rw [pow_add] + field_simp + simp [cubeBesovDepthWeight, hbase] + +private theorem sq_cubeBesovDepthSeminorm_two {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) : + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 = + (cubeBesovDepthWeight Q s j) ^ 2 * + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j := by + have hA : 0 ≤ cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j := + cubeBesovDepthAverage_nonneg Q (2 : ℝ≥0∞) u j + calc + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 + = + (cubeBesovDepthWeight Q s j * + (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ^ + (1 / ((2 : ℝ≥0∞).toReal))) ^ 2 := by + simp [cubeBesovDepthSeminorm] + _ = + (cubeBesovDepthWeight Q s j) ^ 2 * + ((cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ^ + (1 / ((2 : ℝ≥0∞).toReal))) ^ 2 := by + ring + _ = + (cubeBesovDepthWeight Q s j) ^ 2 * + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j := by + congr 1 + have htwo : ((2 : ℝ≥0∞).toReal : ℝ) = 2 := by norm_num + rw [htwo] + rw [← Real.rpow_natCast, ← Real.rpow_mul hA] + norm_num + +private theorem cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u = + Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) := by + unfold cubeBesovPartialSeminorm + norm_num [Real.sqrt_eq_rpow] + +private theorem sq_cubeBesovPartialSeminorm_two_two {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + (cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) ^ 2 = + ∑ j ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 := by + rw [cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq] + exact Real.sq_sqrt (Finset.sum_nonneg fun j _ => sq_nonneg _) + +theorem positiveBesovPartialSeminormTwo_nonneg {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ positiveBesovPartialSeminormTwo Q s N u := by + unfold positiveBesovPartialSeminormTwo + exact cubeBesovPartialSeminorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u + +private theorem sq_positiveBesovPartialSeminormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + (positiveBesovPartialSeminormTwo Q s N u) ^ 2 = + ∑ j ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 := by + simpa [positiveBesovPartialSeminormTwo] using + sq_cubeBesovPartialSeminorm_two_two Q s N u + +theorem positiveBesovPartialSeminormTwo_le_succ {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (N : ℕ) : + positiveBesovPartialSeminormTwo Q s N u ≤ + positiveBesovPartialSeminormTwo Q s (N + 1) u := by + have hsq : + (positiveBesovPartialSeminormTwo Q s N u) ^ 2 ≤ + (positiveBesovPartialSeminormTwo Q s (N + 1) u) ^ 2 := by + rw [sq_positiveBesovPartialSeminormTwo, sq_positiveBesovPartialSeminormTwo] + have hsplit : + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) = + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) + + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u (N + 1)) ^ 2 := by + simpa [add_comm, add_left_comm, add_assoc] using + (Finset.sum_range_succ + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) (N + 1)) + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) + + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u (N + 1)) ^ 2 := by + exact le_add_of_nonneg_right (sq_nonneg _) + _ = + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) := by + rw [hsplit] + have hN_nonneg : + 0 ≤ positiveBesovPartialSeminormTwo Q s N u := + positiveBesovPartialSeminormTwo_nonneg Q s N u + have hSucc_nonneg : + 0 ≤ positiveBesovPartialSeminormTwo Q s (N + 1) u := + positiveBesovPartialSeminormTwo_nonneg Q s (N + 1) u + have habs : + |positiveBesovPartialSeminormTwo Q s N u| ≤ + |positiveBesovPartialSeminormTwo Q s (N + 1) u| := + sq_le_sq.mp hsq + simpa [abs_of_nonneg hN_nonneg, abs_of_nonneg hSucc_nonneg] using habs + +private theorem cubeBesovDepthAverage_add_eq_descendantsAverage {d : ℕ} + (Q : Cube d) (p : ℝ≥0∞) (u : Vec d → ℝ) (j n : ℕ) : + cubeBesovDepthAverage Q p u (j + n) = + descendantsAverage Q j (fun R => cubeBesovDepthAverage R p u n) := by + unfold cubeBesovDepthAverage + simpa using + (descendantsAverage_add_eq_descendantsAverage_descendantsAverage + (Q := Q) (j := j) (n := n) + (F := fun R => (cubeBesovOscillation R p u) ^ p.toReal)) + +private theorem descendantsAverage_sq_cubeBesovDepthSeminorm_two_eq_shifted {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j n : ℕ) : + descendantsAverage Q j + (fun R => (cubeBesovDepthSeminorm R s (2 : ℝ≥0∞) u n) ^ 2) = + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u (j + n)) ^ 2 := by + calc + descendantsAverage Q j + (fun R => (cubeBesovDepthSeminorm R s (2 : ℝ≥0∞) u n) ^ 2) + = + descendantsAverage Q j + (fun R => + (cubeBesovDepthWeight Q s (j + n)) ^ 2 * + cubeBesovDepthAverage R (2 : ℝ≥0∞) u n) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [sq_cubeBesovDepthSeminorm_two] + rw [cubeBesovDepthWeight_eq_of_mem_descendantsAtDepth hR] + _ = + (cubeBesovDepthWeight Q s (j + n)) ^ 2 * + descendantsAverage Q j + (fun R => cubeBesovDepthAverage R (2 : ℝ≥0∞) u n) := by + rw [descendantsAverage_mul_left Q j + ((cubeBesovDepthWeight Q s (j + n)) ^ 2) + (fun R => cubeBesovDepthAverage R (2 : ℝ≥0∞) u n)] + _ = + (cubeBesovDepthWeight Q s (j + n)) ^ 2 * + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u (j + n) := by + rw [cubeBesovDepthAverage_add_eq_descendantsAverage] + _ = (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u (j + n)) ^ 2 := by + symm + exact sq_cubeBesovDepthSeminorm_two Q s u (j + n) + +/-- Legacy disjoint finite scalar `q = 2` positive Besov seminorms localize over +descendants. -/ +theorem descendantsAverage_sq_cubeBesovPartialSeminormTwo_le {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) : + descendantsAverage Q j + (fun R => (cubeBesovPartialSeminorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) ^ 2) ≤ + (cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u) ^ 2 := by + calc + descendantsAverage Q j + (fun R => (cubeBesovPartialSeminorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) ^ 2) + = + descendantsAverage Q j + (fun R => ∑ n ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm R s (2 : ℝ≥0∞) u n) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + exact sq_cubeBesovPartialSeminorm_two_two R s N u + _ = + ∑ n ∈ Finset.range (N + 1), + descendantsAverage Q j + (fun R => (cubeBesovDepthSeminorm R s (2 : ℝ≥0∞) u n) ^ 2) := by + rw [descendantsAverage_sum Q j (Finset.range (N + 1)) + (fun R n => (cubeBesovDepthSeminorm R s (2 : ℝ≥0∞) u n) ^ 2)] + _ = + ∑ n ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u (j + n)) ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro n hn + exact descendantsAverage_sq_cubeBesovDepthSeminorm_two_eq_shifted Q s u j n + _ = + ∑ n ∈ Finset.Ico j (j + N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u n) ^ 2 := by + simpa [Nat.add_assoc] using + (Finset.sum_Ico_eq_sum_range + (f := fun n => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u n) ^ 2) + (m := j) (n := j + N + 1)).symm + _ ≤ + ∑ n ∈ Finset.range (j + N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u n) ^ 2 := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro n hn + exact Finset.mem_range.mpr (Finset.mem_Ico.mp hn).2 + · intro n hn hnot + exact sq_nonneg _ + _ = (cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u) ^ 2 := by + symm + exact sq_cubeBesovPartialSeminorm_two_two Q s (j + N) u + +theorem descendantsAverage_sq_positiveBesovPartialSeminormTwo_le {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) : + descendantsAverage Q j + (fun R => (positiveBesovPartialSeminormTwo R s N u) ^ 2) ≤ + (positiveBesovPartialSeminormTwo Q s (j + N) u) ^ 2 := by + simpa [positiveBesovPartialSeminormTwo] using + descendantsAverage_sq_cubeBesovPartialSeminormTwo_le Q s u j N + +theorem positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + positiveBesovPartialSeminormTwo Q s N u ≤ + positiveBesovPartialNormTwo Q s N u := by + unfold positiveBesovPartialSeminormTwo positiveBesovPartialNormTwo + cubeBesovDisjointPartialSeminorm cubeBesovDisjointPartialNorm cubeBesovPartialNorm + exact le_add_of_nonneg_right + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem positiveBesovPartialNormTwo_nonneg {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + 0 ≤ positiveBesovPartialNormTwo Q s N u := by + unfold positiveBesovPartialNormTwo + exact cubeBesovPartialNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u + +theorem positiveBesovPartialNormTwo_le_succ {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (N : ℕ) : + positiveBesovPartialNormTwo Q s N u ≤ + positiveBesovPartialNormTwo Q s (N + 1) u := by + unfold positiveBesovPartialNormTwo cubeBesovDisjointPartialNorm cubeBesovPartialNorm + have hsemi : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u ≤ + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) u := by + simpa [positiveBesovPartialSeminormTwo] using + positiveBesovPartialSeminormTwo_le_succ Q s u N + exact add_le_add hsemi le_rfl + +private theorem positiveBesovPartialNormTwo_zero_le {d : ℕ} + (Q : Cube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + positiveBesovPartialNormTwo Q s 0 u ≤ positiveBesovPartialNormTwo Q s N u := by + induction N with + | zero => exact le_rfl + | succ N ih => exact ih.trans (positiveBesovPartialNormTwo_le_succ Q s u N) + +/-- Legacy compatibility form: the localized finite scalar seminorm is bounded +by the parent finite positive Besov norm. The corresponding unscaled statement +with local `positiveBesovPartialNormTwo` on the left is false for this +normalization; see the scaled full-norm localization below. -/ +theorem descendantsAverage_sq_cubeBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) : + descendantsAverage Q j + (fun R => (cubeBesovPartialSeminorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) ^ 2) ≤ + (positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + have hloc := descendantsAverage_sq_cubeBesovPartialSeminormTwo_le Q s u j N + have hsemi : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u ≤ + positiveBesovPartialNormTwo Q s (j + N) u := + positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo Q s (j + N) u + have hsemi_nonneg : + 0 ≤ cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u := + cubeBesovPartialSeminorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u + have hnorm_nonneg : 0 ≤ positiveBesovPartialNormTwo Q s (j + N) u := by + unfold positiveBesovPartialNormTwo + exact cubeBesovPartialNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u + have hsquares : + (cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (j + N) u) ^ 2 ≤ + (positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + nlinarith + exact le_trans hloc hsquares + +theorem descendantsAverage_sq_positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) : + descendantsAverage Q j + (fun R => (positiveBesovPartialSeminormTwo R s N u) ^ 2) ≤ + (positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + simpa [positiveBesovPartialSeminormTwo] using + descendantsAverage_sq_cubeBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + Q s u j N + +private theorem descendantsAverage_add {d : ℕ} (Q : Cube d) (j : ℕ) + (F G : Cube d → ℝ) : + descendantsAverage Q j (fun R => F R + G R) = + descendantsAverage Q j F + descendantsAverage Q j G := by + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, (F R + G R) = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, F R + + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, G R + rw [Finset.sum_add_distrib] + ring + +private theorem cubeLpNorm_add_le {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : Cube d) (p : ℝ≥0∞) (f g : Vec d → E) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + cubeLpNorm Q p (fun x => f x + g x) ≤ + cubeLpNorm Q p f + cubeLpNorm Q p g := by + have hsum : + MeasureTheory.eLpNorm (fun x => f x + g x) p (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm g p (normalizedCubeMeasure Q) := by + simpa using! MeasureTheory.eLpNorm_add_le hf.1 hg.1 hp + have hsum_top : + MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm g p (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.add_ne_top.2 ⟨ne_of_lt hf.2, ne_of_lt hg.2⟩ + have htoReal := ENNReal.toReal_mono hsum_top hsum + rw [ENNReal.toReal_add (ne_of_lt hf.2) (ne_of_lt hg.2)] at htoReal + simpa [cubeLpNorm, ne_of_lt hf.2, ne_of_lt hg.2] using htoReal + +private theorem cubeLpNorm_two_le_cubeBesovOscillation_add_norm_cubeAverage {d : ℕ} + (Q : Cube d) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + cubeBesovOscillation Q (2 : ℝ≥0∞) u + ‖cubeAverage Q u‖ := by + have hfluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hconst_neg : + MeasureTheory.MemLp (fun _ : Vec d => -cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const _ + have hsum := hu.add hconst_neg + have hfun : (fun x => u x + (fun _ : Vec d => -cubeAverage Q u) x) = + cubeFluctuation Q u := by + funext x + simp [cubeFluctuation, sub_eq_add_neg] + simpa [hfun] using! hsum + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const _ + have htri := + cubeLpNorm_add_le Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + (fun _ : Vec d => cubeAverage Q u) hfluct hconst (by norm_num) + have hfun : (fun x => cubeFluctuation Q u x + (fun _ : Vec d => cubeAverage Q u) x) = + u := by + funext x + simp [cubeFluctuation] + have hconst_norm : + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => cubeAverage Q u) = + ‖cubeAverage Q u‖ := by + rw [cubeLpNorm_const Q (2 : ℝ≥0∞) (cubeAverage Q u) (by norm_num)] + simpa [cubeBesovOscillation, hfun, hconst_norm] using htri + +private theorem cubeBesovDepthSeminorm_two_depth_zero_eq {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u 0 = + cubeBesovScaleWeight s Q * cubeBesovOscillation Q (2 : ℝ≥0∞) u := by + unfold cubeBesovDepthSeminorm + rw [cubeBesovDepthWeight_depth_zero, cubeBesovDepthAverage_depth_zero] + have hosc : 0 ≤ cubeBesovOscillation Q (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg Q (2 : ℝ≥0∞) u + have htwo : ((2 : ℝ≥0∞).toReal : ℝ) = 2 := by norm_num + rw [htwo] + congr 1 + simpa [Real.rpow_natCast] using sq_rpow_half_eq_of_nonneg hosc + +private theorem positiveBesovPartialNormTwo_zero_eq {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) : + positiveBesovPartialNormTwo Q s 0 u = + cubeBesovScaleWeight s Q * cubeBesovOscillation Q (2 : ℝ≥0∞) u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ := by + unfold positiveBesovPartialNormTwo cubeBesovDisjointPartialNorm + cubeBesovPartialNorm cubeBesovPartialSeminorm + norm_num + rw [cubeBesovDepthSeminorm_two_depth_zero_eq] + have hnonneg : + 0 ≤ cubeBesovScaleWeight s Q * cubeBesovOscillation Q (2 : ℝ≥0∞) u := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (cubeBesovOscillation_nonneg Q (2 : ℝ≥0∞) u) + rw [sq_rpow_half_eq_of_nonneg hnonneg] + +private theorem cubeBesovScaleWeight_mul_cubeLpNorm_two_le_positiveBesovPartialNormTwo_zero + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + positiveBesovPartialNormTwo Q s 0 u := by + have h := cubeLpNorm_two_le_cubeBesovOscillation_add_norm_cubeAverage Q u hu + have hw : 0 ≤ cubeBesovScaleWeight s Q := cubeBesovScaleWeight_nonneg s Q + have hmul := mul_le_mul_of_nonneg_left h hw + rw [positiveBesovPartialNormTwo_zero_eq] + nlinarith + +private theorem cubeBesovScaleWeight_mul_cubeLpNorm_two_le_positiveBesovPartialNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + positiveBesovPartialNormTwo Q s N u := by + exact (cubeBesovScaleWeight_mul_cubeLpNorm_two_le_positiveBesovPartialNormTwo_zero + Q s u hu).trans (positiveBesovPartialNormTwo_zero_le Q s N u) + +/-- In the legacy lane, the scaled descendant cube-average term is controlled +by the parent weighted `L²` norm. -/ +theorem descendantsAverage_sq_scaled_positiveBesovMeanTerm_le_weighted_l2 {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) ≤ + (cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by + let w : ℝ := cubeBesovScaleWeight s Q + have hpoint : ∀ R ∈ descendantsAtDepth Q j, + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2 = + (w * ‖cubeAverage R u‖) ^ 2 := by + intro R hR + have hscale := + cubeBesovScaleWeight_eq_mul_rpow_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) s hR + have hcancel : + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) = 1 := by + have hprod := + Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-(s * (j : ℝ))) (s * (j : ℝ)) + have hsum : -(s * (j : ℝ)) + s * (j : ℝ) = 0 := by ring + rw [hsum] at hprod + norm_num at hprod + simpa using hprod.symm + have hlinear : + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + ((w * Real.rpow (3 : ℝ) (s * (j : ℝ))) * ‖cubeAverage R u‖) = + w * ‖cubeAverage R u‖ := by + calc + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + ((w * Real.rpow (3 : ℝ) (s * (j : ℝ))) * ‖cubeAverage R u‖) + = (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + Real.rpow (3 : ℝ) (s * (j : ℝ))) * (w * ‖cubeAverage R u‖) := by + ring + _ = 1 * (w * ‖cubeAverage R u‖) := by rw [hcancel] + _ = w * ‖cubeAverage R u‖ := by ring + calc + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2 + = (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + ((w * Real.rpow (3 : ℝ) (s * (j : ℝ))) * ‖cubeAverage R u‖)) ^ 2 := by + simp [w, hscale] + _ = (w * ‖cubeAverage R u‖) ^ 2 := by rw [hlinear] + have havg_eq : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) = + descendantsAverage Q j (fun R => (w * ‖cubeAverage R u‖) ^ 2) := by + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2 = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, (w * ‖cubeAverage R u‖) ^ 2 + congr 1 + exact Finset.sum_congr rfl hpoint + have hcirc : + descendantsAverage Q j (fun R => ‖cubeAverage R u‖ ^ 2) ≤ + (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by + have h := cubeBesovCircDepthAverage_le_cubeLpNorm_rpow + Q (2 : ℝ≥0∞) u j (by norm_num) (by norm_num) hu + have htwo : ((2 : ℝ≥0∞).toReal : ℝ) = 2 := by norm_num + simpa [cubeBesovCircDepthAverage, htwo] using h + have hweighted : + descendantsAverage Q j (fun R => (w * ‖cubeAverage R u‖) ^ 2) ≤ + (w * cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by + have hrewrite : + descendantsAverage Q j (fun R => (w * ‖cubeAverage R u‖) ^ 2) = + w ^ 2 * descendantsAverage Q j (fun R => ‖cubeAverage R u‖ ^ 2) := by + calc + descendantsAverage Q j (fun R => (w * ‖cubeAverage R u‖) ^ 2) + = descendantsAverage Q j (fun R => w ^ 2 * ‖cubeAverage R u‖ ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = w ^ 2 * descendantsAverage Q j (fun R => ‖cubeAverage R u‖ ^ 2) := by + rw [descendantsAverage_mul_left] + calc + descendantsAverage Q j (fun R => (w * ‖cubeAverage R u‖) ^ 2) + = w ^ 2 * descendantsAverage Q j (fun R => ‖cubeAverage R u‖ ^ 2) := + hrewrite + _ ≤ w ^ 2 * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by + exact mul_le_mul_of_nonneg_left hcirc (sq_nonneg w) + _ = (w * cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by ring + exact havg_eq.trans_le hweighted + +theorem descendantsAverage_sq_scaled_positiveBesovMeanTerm_le_positiveBesovPartialNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j M : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) ≤ + (positiveBesovPartialNormTwo Q s M u) ^ 2 := by + have hmean := descendantsAverage_sq_scaled_positiveBesovMeanTerm_le_weighted_l2 Q s u j hu + have hLp := cubeBesovScaleWeight_mul_cubeLpNorm_two_le_positiveBesovPartialNormTwo Q s u M hu + have hleft_nonneg : + 0 ≤ cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) u := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + have hright_nonneg : 0 ≤ positiveBesovPartialNormTwo Q s M u := + positiveBesovPartialNormTwo_nonneg Q s M u + have hsquares : + (cubeBesovScaleWeight s Q * cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 ≤ + (positiveBesovPartialNormTwo Q s M u) ^ 2 := by + nlinarith + exact hmean.trans hsquares + +theorem descendantsAverage_sq_scaled_positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) (hs : 0 ≤ s) : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + positiveBesovPartialSeminormTwo R s N u) ^ 2) ≤ + (positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + let c : ℝ := Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + have hc_nonneg : 0 ≤ c := Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hexp_nonpos : -(s * (j : ℝ)) ≤ 0 := by + have hprod : 0 ≤ s * (j : ℝ) := mul_nonneg hs (Nat.cast_nonneg j) + linarith + have hc_le_one : c ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) hexp_nonpos + have hc_sq_le_one : c ^ 2 ≤ 1 := by nlinarith + have hpoint : ∀ R ∈ descendantsAtDepth Q j, + (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 ≤ + (positiveBesovPartialSeminormTwo R s N u) ^ 2 := by + intro R hR + calc + (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 + = c ^ 2 * (positiveBesovPartialSeminormTwo R s N u) ^ 2 := by ring + _ ≤ 1 * (positiveBesovPartialSeminormTwo R s N u) ^ 2 := by + exact mul_le_mul_of_nonneg_right hc_sq_le_one (sq_nonneg _) + _ = (positiveBesovPartialSeminormTwo R s N u) ^ 2 := by ring + have hscaled : + descendantsAverage Q j + (fun R => (c * positiveBesovPartialSeminormTwo R s N u) ^ 2) ≤ + descendantsAverage Q j + (fun R => (positiveBesovPartialSeminormTwo R s N u) ^ 2) := + descendantsAverage_le_descendantsAverage Q j hpoint + have hsemi := + descendantsAverage_sq_positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + Q s u j N + exact hscaled.trans hsemi + +/-- Legacy scaled finite positive `q = 2` Besov norms localize over descendants. -/ +theorem descendantsAverage_sq_scaled_positiveBesovPartialNormTwo_le {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j N : ℕ) + (hs : 0 ≤ s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + positiveBesovPartialNormTwo R s N u) ^ 2) ≤ + (2 * positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + let c : ℝ := Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + let B : ℝ := positiveBesovPartialNormTwo Q s (j + N) u + have hsemi := + descendantsAverage_sq_scaled_positiveBesovPartialSeminormTwo_le_positiveBesovPartialNormTwo + Q s u j N hs + have hmean := + descendantsAverage_sq_scaled_positiveBesovMeanTerm_le_positiveBesovPartialNormTwo + Q s u j (j + N) hu + have hpoint : ∀ R ∈ descendantsAtDepth Q j, + (c * positiveBesovPartialNormTwo R s N u) ^ 2 ≤ + 2 * (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 + + 2 * (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2 := by + intro R hR + have hnorm : + positiveBesovPartialNormTwo R s N u = + positiveBesovPartialSeminormTwo R s N u + + cubeBesovScaleWeight s R * ‖cubeAverage R u‖ := by + rfl + rw [hnorm] + nlinarith [sq_nonneg (c * positiveBesovPartialSeminormTwo R s N u - + c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖))] + have hsplit : + descendantsAverage Q j (fun R => (c * positiveBesovPartialNormTwo R s N u) ^ 2) ≤ + descendantsAverage Q j + (fun R => + 2 * (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 + + 2 * (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) := + descendantsAverage_le_descendantsAverage Q j hpoint + have hcombine : + descendantsAverage Q j + (fun R => + 2 * (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 + + 2 * (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) = + 2 * descendantsAverage Q j + (fun R => (c * positiveBesovPartialSeminormTwo R s N u) ^ 2) + + 2 * descendantsAverage Q j + (fun R => (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) := by + rw [descendantsAverage_add] + rw [descendantsAverage_mul_left, descendantsAverage_mul_left] + calc + descendantsAverage Q j (fun R => (c * positiveBesovPartialNormTwo R s N u) ^ 2) + ≤ descendantsAverage Q j + (fun R => + 2 * (c * positiveBesovPartialSeminormTwo R s N u) ^ 2 + + 2 * (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) := hsplit + _ = 2 * descendantsAverage Q j + (fun R => (c * positiveBesovPartialSeminormTwo R s N u) ^ 2) + + 2 * descendantsAverage Q j + (fun R => (c * (cubeBesovScaleWeight s R * ‖cubeAverage R u‖)) ^ 2) := hcombine + _ ≤ 2 * B ^ 2 + 2 * B ^ 2 := by + apply add_le_add + · exact mul_le_mul_of_nonneg_left (by simpa [c, B] using hsemi) (by norm_num) + · exact mul_le_mul_of_nonneg_left (by simpa [c, B] using hmean) (by norm_num) + _ = (2 * positiveBesovPartialNormTwo Q s (j + N) u) ^ 2 := by + simp [B] + ring + +theorem positiveBesovPartialNormTwo_le_normTwo_of_bddAbove {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) (N : ℕ) : + positiveBesovPartialNormTwo Q s N u ≤ positiveBesovNormTwo Q s u := by + cases N with + | zero => + have h01 := positiveBesovPartialNormTwo_le_succ Q s u 0 + have h1 : positiveBesovPartialNormTwo Q s 1 u ≤ positiveBesovNormTwo Q s u := by + change positiveBesovPartialNormTwo Q s 1 u ≤ + sSup (Set.range fun N : ℕ => positiveBesovPartialNormTwo Q s (N + 1) u) + exact le_csSup hBdd ⟨0, rfl⟩ + exact h01.trans h1 + | succ N => + change positiveBesovPartialNormTwo Q s (N + 1) u ≤ + sSup (Set.range fun N : ℕ => positiveBesovPartialNormTwo Q s (N + 1) u) + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem positiveBesovNormTwo_nonneg_of_bddAbove {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) : + 0 ≤ positiveBesovNormTwo Q s u := by + exact (positiveBesovPartialNormTwo_nonneg Q s 1 u).trans + (positiveBesovPartialNormTwo_le_normTwo_of_bddAbove Q s u hBdd 1) + +theorem tendsto_positiveBesovPartialNormTwo_succ_atTop {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) : + Filter.Tendsto + (fun N : ℕ => positiveBesovPartialNormTwo Q s (N + 1) u) + Filter.atTop + (nhds (positiveBesovNormTwo Q s u)) := by + change Filter.Tendsto + (fun N : ℕ => positiveBesovPartialNormTwo Q s (N + 1) u) + Filter.atTop + (nhds (sSup (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u))) + exact + tendsto_atTop_ciSup + (monotone_nat_of_le_succ + (fun N => positiveBesovPartialNormTwo_le_succ Q s u (N + 1))) + hBdd + +theorem tendsto_descendantsAverage_sq_scaled_positiveBesovPartialNormTwo_succ_atTop + {d : ℕ} (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) (c : ℝ) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) u)) : + Filter.Tendsto + (fun N : ℕ => + descendantsAverage Q j + (fun R => (c * positiveBesovPartialNormTwo R s (N + 1) u) ^ 2)) + Filter.atTop + (nhds + (descendantsAverage Q j + (fun R => (c * positiveBesovNormTwo R s u) ^ 2))) := by + unfold descendantsAverage + exact + Filter.Tendsto.const_mul ((descendantsAtDepth Q j).card : ℝ)⁻¹ + (tendsto_finsetSum (descendantsAtDepth Q j) + (fun R hR => + ((tendsto_positiveBesovPartialNormTwo_succ_atTop + R s u (hLocalBdd R hR)).const_mul c).pow 2)) + +/-- In the legacy real-`sSup` lane, infinite-depth scaled positive `q = 2` +Besov norms localize over descendants, provided the parent and local `sSup`s +are bounded above. -/ +theorem descendantsAverage_sq_scaled_positiveBesovNormTwo_le {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) + (hs : 0 ≤ s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) u)) : + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + positiveBesovNormTwo R s u) ^ 2) ≤ + (2 * positiveBesovNormTwo Q s u) ^ 2 := by + let c : ℝ := Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + have hparent_nonneg : 0 ≤ positiveBesovNormTwo Q s u := + positiveBesovNormTwo_nonneg_of_bddAbove Q s u hParentBdd + have hbound : + ∀ N : ℕ, + descendantsAverage Q j + (fun R => (c * positiveBesovPartialNormTwo R s (N + 1) u) ^ 2) ≤ + (2 * positiveBesovNormTwo Q s u) ^ 2 := by + intro N + have hfinite := descendantsAverage_sq_scaled_positiveBesovPartialNormTwo_le + Q s u j (N + 1) hs hu + have hfinite' : + descendantsAverage Q j + (fun R => (c * positiveBesovPartialNormTwo R s (N + 1) u) ^ 2) ≤ + (2 * positiveBesovPartialNormTwo Q s (j + (N + 1)) u) ^ 2 := by + simpa [c] using hfinite + have hpartial_le : + positiveBesovPartialNormTwo Q s (j + (N + 1)) u ≤ + positiveBesovNormTwo Q s u := + positiveBesovPartialNormTwo_le_normTwo_of_bddAbove + Q s u hParentBdd (j + (N + 1)) + have hpartial_nonneg : + 0 ≤ positiveBesovPartialNormTwo Q s (j + (N + 1)) u := + positiveBesovPartialNormTwo_nonneg Q s (j + (N + 1)) u + have hsquares : + (2 * positiveBesovPartialNormTwo Q s (j + (N + 1)) u) ^ 2 ≤ + (2 * positiveBesovNormTwo Q s u) ^ 2 := by + nlinarith + exact hfinite'.trans hsquares + have hlim := + tendsto_descendantsAverage_sq_scaled_positiveBesovPartialNormTwo_succ_atTop + Q s u j c hLocalBdd + exact le_of_tendsto' hlim hbound + +/-- A scalar `L²` function on a cube is in `L²` for the normalized cube measure. -/ +theorem memLp_normalizedCubeMeasure_of_memScalarL2_cubeSet {d : ℕ} + (Q : Cube d) {u : Vec d → ℝ} (hu : MemScalarL2 (cubeSet Q) u) : + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have huCube : + MeasureTheory.MemLp u (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemScalarL2, volumeMeasureOn] using hu + exact + huCube.of_measure_le_smul (c := ENNReal.ofReal ((cubeVolume Q)⁻¹)) + ENNReal.ofReal_ne_top (by rw [normalizedCubeMeasure, cubeMeasure]) + +/-- Cube-general form of the legacy positive Besov localization lemma. -/ +theorem positiveBesovLocalize_cube {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (hu : MemScalarL2 (cubeSet Q) u) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo Q s (N + 1) u)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) u)) : + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + positiveBesovNormTwo R s u) ^ 2) ≤ + positiveBesovLocalizeConstant d * positiveBesovNormTwo Q s u := by + have huNorm := memLp_normalizedCubeMeasure_of_memScalarL2_cubeSet Q hu + have hsq := descendantsAverage_sq_scaled_positiveBesovNormTwo_le + Q s u j hs.le huNorm hParentBdd hLocalBdd + have hnorm_nonneg : 0 ≤ positiveBesovNormTwo Q s u := + positiveBesovNormTwo_nonneg_of_bddAbove Q s u hParentBdd + have hrhs_nonneg : 0 ≤ 2 * positiveBesovNormTwo Q s u := by + nlinarith + calc + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (-(s * (j : ℝ))) * + positiveBesovNormTwo R s u) ^ 2) + ≤ Real.sqrt ((2 * positiveBesovNormTwo Q s u) ^ 2) := + Real.sqrt_le_sqrt hsq + _ = |2 * positiveBesovNormTwo Q s u| := by + rw [Real.sqrt_sq_eq_abs] + _ = positiveBesovLocalizeConstant d * positiveBesovNormTwo Q s u := by + rw [abs_of_nonneg hrhs_nonneg] + +/-- Legacy compatibility form associated with manuscript Lemma +`l.Besov.positive.localize.function.spaces`. The normalized legacy positive +Besov norm of `u` on the origin cube `⌈_m` controls the geometrically +weighted root-mean-square of normalized legacy positive Besov norms on each +triadic descendant `z + ⌈_n` for `n ≤ m`. -/ +theorem positiveBesovLocalize {d : ℕ} {s : ℝ} {m n : ℤ} + (_hd : 1 ≤ d) (hs_pos : 0 < s) (_hs_lt_one : s < 1) + (hnm : n ≤ m) (u : Vec d → ℝ) + (hu : MemScalarL2 (cubeSet (originCube d m)) u) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo (originCube d m) s N u)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - n)), + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s N u)) : + Real.sqrt + (descendantsAverage (originCube d m) (Int.toNat (m - n)) fun R => + (Real.rpow (3 : ℝ) (s * ((n - m : ℤ) : ℝ)) * + positiveBesovNormTwo R s u) ^ 2) ≤ + positiveBesovLocalizeConstant d * + positiveBesovNormTwo (originCube d m) s u := by + have hdepth_nonneg : 0 ≤ m - n := sub_nonneg.mpr hnm + have hdepth_cast : ((Int.toNat (m - n) : ℕ) : ℝ) = ((m - n : ℤ) : ℝ) := by + exact_mod_cast (Int.toNat_of_nonneg hdepth_nonneg) + have hfactor : + Real.rpow (3 : ℝ) (-(s * ((Int.toNat (m - n) : ℕ) : ℝ))) = + Real.rpow (3 : ℝ) (s * ((n - m : ℤ) : ℝ)) := by + congr 1 + rw [hdepth_cast] + norm_num + ring + have hParentBdd_succ : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo (originCube d m) s (N + 1) u) := by + rcases hParentBdd with ⟨B, hB⟩ + exact ⟨B, by rintro x ⟨N, rfl⟩; exact hB ⟨N + 1, rfl⟩⟩ + have hLocalBdd_succ : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - n)), + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialNormTwo R s (N + 1) u) := by + intro R hR + rcases hLocalBdd R hR with ⟨B, hB⟩ + exact ⟨B, by rintro x ⟨N, rfl⟩; exact hB ⟨N + 1, rfl⟩⟩ + rw [← hfactor] + exact positiveBesovLocalize_cube (Q := originCube d m) (s := s) (u := u) + (j := Int.toNat (m - n)) hs_pos hu hParentBdd_succ hLocalBdd_succ + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovSeminormLocalize.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovSeminormLocalize.lean new file mode 100644 index 0000000000..25db4586e1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PositiveBesovSeminormLocalize.lean @@ -0,0 +1,214 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PositiveBesovLocalize + +/-! # Positive Besov Seminorm Localize -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Legacy positive Besov seminorm localization + +This file keeps the seminorm-only companions for the legacy disjoint, +finite-truncation/real-`sSup` compatibility lane. These are not statements +about the manuscript's exact overlapping `ENNReal` definitions. +-/ + +namespace Legacy + +theorem positiveBesovPartialSeminormTwo_le_seminormTwo_of_bddAbove {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) (N : ℕ) : + positiveBesovPartialSeminormTwo Q s N u ≤ + positiveBesovSeminormTwo Q s u := by + change positiveBesovPartialSeminormTwo Q s N u ≤ + sSup (Set.range fun N : ℕ => positiveBesovPartialSeminormTwo Q s N u) + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem positiveBesovSeminormTwo_nonneg_of_bddAbove {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) : + 0 ≤ positiveBesovSeminormTwo Q s u := by + exact (positiveBesovPartialSeminormTwo_nonneg Q s 0 u).trans + (positiveBesovPartialSeminormTwo_le_seminormTwo_of_bddAbove Q s u hBdd 0) + +theorem positiveBesovPartialSeminormTwo_bddAbove_of_parent_bddAbove {d : ℕ} + {Q R : Cube d} {j : ℕ} (s : ℝ) (u : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo R s N u) := by + classical + rcases hParentBdd with ⟨B, hB⟩ + have hB_nonneg : 0 ≤ B := by + have hB0 : positiveBesovPartialSeminormTwo Q s 0 u ≤ B := + hB ⟨0, rfl⟩ + exact (positiveBesovPartialSeminormTwo_nonneg Q s 0 u).trans hB0 + let D : Finset (Cube d) := descendantsAtDepth Q j + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hcard_nonneg : 0 ≤ (D.card : ℝ) := le_of_lt hcard_pos + refine ⟨Real.sqrt ((D.card : ℝ) * B ^ 2), ?_⟩ + rintro x ⟨N, rfl⟩ + have hparent_le : + positiveBesovPartialSeminormTwo Q s (j + N) u ≤ B := + hB ⟨j + N, rfl⟩ + have hparent_nonneg : + 0 ≤ positiveBesovPartialSeminormTwo Q s (j + N) u := + positiveBesovPartialSeminormTwo_nonneg Q s (j + N) u + have hparent_sq_le : + (positiveBesovPartialSeminormTwo Q s (j + N) u) ^ 2 ≤ B ^ 2 := by + nlinarith + let F : Cube d → ℝ := fun S => + (positiveBesovPartialSeminormTwo S s N u) ^ 2 + have havg_le_parent : + descendantsAverage Q j F ≤ + (positiveBesovPartialSeminormTwo Q s (j + N) u) ^ 2 := by + dsimp [F] + exact descendantsAverage_sq_positiveBesovPartialSeminormTwo_le Q s u j N + have havg_le_Bsq : descendantsAverage Q j F ≤ B ^ 2 := + havg_le_parent.trans hparent_sq_le + have hsum_le : (∑ S ∈ D, F S) ≤ (D.card : ℝ) * B ^ 2 := by + have hmul : + (D.card : ℝ) * descendantsAverage Q j F ≤ (D.card : ℝ) * B ^ 2 := + mul_le_mul_of_nonneg_left havg_le_Bsq hcard_nonneg + have hdesc : (D.card : ℝ) * descendantsAverage Q j F = ∑ S ∈ D, F S := by + dsimp [descendantsAverage, D] + field_simp [ne_of_gt hcard_pos] + rwa [hdesc] at hmul + have hterm_le_sum : F R ≤ ∑ S ∈ D, F S := by + exact Finset.single_le_sum + (fun S _hS => sq_nonneg (positiveBesovPartialSeminormTwo S s N u)) + (by simpa [D] using hR) + have hterm_sq_le : + (positiveBesovPartialSeminormTwo R s N u) ^ 2 ≤ + (D.card : ℝ) * B ^ 2 := + hterm_le_sum.trans hsum_le + exact Real.le_sqrt_of_sq_le hterm_sq_le + +theorem tendsto_positiveBesovPartialSeminormTwo_atTop {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) : + Filter.Tendsto + (fun N : ℕ => positiveBesovPartialSeminormTwo Q s N u) + Filter.atTop + (nhds (positiveBesovSeminormTwo Q s u)) := by + change Filter.Tendsto + (fun N : ℕ => positiveBesovPartialSeminormTwo Q s N u) + Filter.atTop + (nhds (sSup (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u))) + exact + tendsto_atTop_ciSup + (monotone_nat_of_le_succ + (fun N => positiveBesovPartialSeminormTwo_le_succ Q s u N)) + hBdd + +theorem tendsto_sq_positiveBesovPartialSeminormTwo_atTop {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) + (hBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) : + Filter.Tendsto + (fun N : ℕ => (positiveBesovPartialSeminormTwo Q s N u) ^ 2) + Filter.atTop + (nhds ((positiveBesovSeminormTwo Q s u) ^ 2)) := by + exact (tendsto_positiveBesovPartialSeminormTwo_atTop Q s u hBdd).pow 2 + +theorem tendsto_descendantsAverage_sq_positiveBesovPartialSeminormTwo_atTop {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo R s N u)) : + Filter.Tendsto + (fun N : ℕ => + descendantsAverage Q j + (fun R => (positiveBesovPartialSeminormTwo R s N u) ^ 2)) + Filter.atTop + (nhds + (descendantsAverage Q j + (fun R => (positiveBesovSeminormTwo R s u) ^ 2))) := by + unfold descendantsAverage + exact + Filter.Tendsto.const_mul ((descendantsAtDepth Q j).card : ℝ)⁻¹ + (tendsto_finsetSum (descendantsAtDepth Q j) + (fun R hR => + tendsto_sq_positiveBesovPartialSeminormTwo_atTop + R s u (hLocalBdd R hR))) + +/-- In the legacy real-`sSup` lane, infinite-depth scalar `q = 2` positive +Besov seminorms localize over descendants, provided the parent and local +`sSup`s are bounded above. -/ +theorem descendantsAverage_sq_positiveBesovSeminormTwo_le {d : ℕ} + (Q : Cube d) (s : ℝ) (u : Vec d → ℝ) (j : ℕ) + (hParentBdd : + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo Q s N u)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + positiveBesovPartialSeminormTwo R s N u)) : + descendantsAverage Q j + (fun R => (positiveBesovSeminormTwo R s u) ^ 2) ≤ + (positiveBesovSeminormTwo Q s u) ^ 2 := by + have hparent_nonneg : + 0 ≤ positiveBesovSeminormTwo Q s u := + positiveBesovSeminormTwo_nonneg_of_bddAbove Q s u hParentBdd + have hbound : + ∀ N : ℕ, + descendantsAverage Q j + (fun R => (positiveBesovPartialSeminormTwo R s N u) ^ 2) ≤ + (positiveBesovSeminormTwo Q s u) ^ 2 := by + intro N + have hpartial := + descendantsAverage_sq_positiveBesovPartialSeminormTwo_le Q s u j N + have hpartial_le_full : + positiveBesovPartialSeminormTwo Q s (j + N) u ≤ + positiveBesovSeminormTwo Q s u := + positiveBesovPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s u hParentBdd (j + N) + have hpartial_nonneg : + 0 ≤ positiveBesovPartialSeminormTwo Q s (j + N) u := + positiveBesovPartialSeminormTwo_nonneg Q s (j + N) u + have hpartial_sq : + (positiveBesovPartialSeminormTwo Q s (j + N) u) ^ 2 ≤ + (positiveBesovSeminormTwo Q s u) ^ 2 := by + nlinarith + exact hpartial.trans hpartial_sq + have hlim := + tendsto_descendantsAverage_sq_positiveBesovPartialSeminormTwo_atTop + Q s u j hLocalBdd + exact le_of_tendsto' hlim hbound + +end Legacy + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PotentialSolenoidal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PotentialSolenoidal.lean new file mode 100644 index 0000000000..b55ef7af6a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/PotentialSolenoidal.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions + +/-! # Potential Solenoidal -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +/-- Gradients of `H¹` functions are public a.e.-based potential fields. -/ +theorem potentialFieldOn_of_h1 {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) : + PotentialFieldOn U u.grad := + ⟨u.grad_memVectorL2, u, Filter.EventuallyEq.rfl⟩ + +/-- Gradients of `H¹₀` functions are public a.e.-based zero-trace potential +fields. -/ +theorem potentialZeroTraceFieldOn_of_h10 {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) : + PotentialZeroTraceFieldOn U u.toH1Function.grad := + ⟨u.toH1Function.grad_memVectorL2, u, Filter.EventuallyEq.rfl⟩ + +/-- Zero-trace potential fields are potential fields, at the public a.e. +surface. -/ +theorem PotentialZeroTraceFieldOn.potentialFieldOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : PotentialZeroTraceFieldOn U f) : + PotentialFieldOn U f := by + rcases hf with ⟨hf_mem, u, hfg⟩ + exact ⟨hf_mem, u.toH1Function, hfg⟩ + +/-- Solenoidal fields with zero normal trace are solenoidal fields. -/ +theorem SolenoidalZeroNormalTraceFieldOn.solenoidalFieldOn {d : ℕ} + {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : SolenoidalZeroNormalTraceFieldOn U g) : + SolenoidalFieldOn U g := by + refine ⟨hg.1, ?_⟩ + intro φ + exact hg.2 φ.toH1Function + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/RadiusIteration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/RadiusIteration.lean new file mode 100644 index 0000000000..3dceeca8df --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch01/Theorems/RadiusIteration.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration + +/-! # Radius Iteration -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch01 + +noncomputable section + +/-! +# Standard radius iteration + +This file exposes the proved radius-iteration backbone used by the +coarse-grained Caccioppoli argument. The current proved surface is normalized +to the interval `[1/3, 1]`, which is the interval used later in the book. +-/ + +/-- Public name for the normalized radius-iteration constant. -/ +noncomputable abbrev standardRadiusIterationConstant (β : ℝ) : ℝ := + Homogenization.coarseCaccioppoliRadiusIterationConst β + +/-- The normalized radius-iteration constant is nonnegative. -/ +theorem standardRadiusIterationConstant_nonneg (β : ℝ) : + 0 ≤ standardRadiusIterationConstant β := by + simpa [standardRadiusIterationConstant] using + Homogenization.coarseCaccioppoliRadiusIterationConst_nonneg β + +/-- Public normalized standard radius iteration on `[1/3, 1]`. -/ +theorem standardRadiusIteration + {F : ℝ → ℝ} {A β : ℝ} + (hβ : 0 ≤ β) (hA : 0 ≤ A) + (hbounded : Homogenization.CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : Homogenization.CoarseCaccioppoliRadiusRecurrence F A β) : + F (1 / 3 : ℝ) ≤ A * standardRadiusIterationConstant β := by + simpa [standardRadiusIterationConstant] using + Homogenization.coarseCaccioppoli_radius_iteration hβ hA hbounded hrec + +/-- Public radius iteration for the deterministic radius sequence. -/ +theorem standardRadiusIteration_of_sequenceRecurrence + {F : ℝ → ℝ} {A β : ℝ} + (hβ : 0 ≤ β) (hA : 0 ≤ A) + (hbounded : Homogenization.CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : Homogenization.CoarseCaccioppoliRadiusSequenceRecurrence F A β) : + F (1 / 3 : ℝ) ≤ A * standardRadiusIterationConstant β := by + simpa [standardRadiusIterationConstant] using + Homogenization.coarseCaccioppoli_radius_iteration_of_sequenceRecurrence + hβ hA hbounded hrec + +end + +end Ch01 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02.lean new file mode 100644 index 0000000000..92ad3c4786 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems + +/-! # Ch02 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Block.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Block.lean new file mode 100644 index 0000000000..4bfa8f39c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Block.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Matrices +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix + +/-! # Block -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public transpose operation for doubled block matrices. -/ +def blockMatTranspose {d : ℕ} (A : BlockMat d) : BlockMat d := + { upperLeft := matTranspose A.upperLeft + upperRight := matTranspose A.lowerLeft + lowerLeft := matTranspose A.upperRight + lowerRight := matTranspose A.lowerRight } + +/-- Public multiplication operation for doubled block matrices. -/ +def blockMatMul {d : ℕ} (A B : BlockMat d) : BlockMat d := + { upperLeft := A.upperLeft * B.upperLeft + A.upperRight * B.lowerLeft + upperRight := A.upperLeft * B.upperRight + A.upperRight * B.lowerRight + lowerLeft := A.lowerLeft * B.upperLeft + A.lowerRight * B.lowerLeft + lowerRight := A.lowerLeft * B.upperRight + A.lowerRight * B.lowerRight } + +/-- Public block diagonal matrix. -/ +def blockDiag {d : ℕ} (A B : Mat d) : BlockMat d := + { upperLeft := A + upperRight := 0 + lowerLeft := 0 + lowerRight := B } + +/-- Public identity matrix in doubled block form. -/ +def blockIdentity (d : ℕ) : BlockMat d := + blockDiag 1 1 + +/-- Public inverse operation for doubled block matrices, routed through the +ordinary `2d × 2d` matrix inverse. -/ +noncomputable def blockMatInv {d : ℕ} (A : BlockMat d) : BlockMat d := + ofFullBlockMat ((toFullBlockMat A)⁻¹) + +/-- Public triangular block matrix `G_h`. -/ +def blockG {d : ℕ} (h : Mat d) : BlockMat d := + { upperLeft := 1 + upperRight := 0 + lowerLeft := h + lowerRight := 1 } + +/-- Public reflection block matrix `R`. -/ +def blockR (d : ℕ) : BlockMat d := + { upperLeft := 0 + upperRight := 1 + lowerLeft := 1 + lowerRight := 0 } + +/-- Positive definiteness for public doubled block matrices, expressed through +the doubled quadratic form. -/ +def BlockPosDef {d : ℕ} (A : BlockMat d) : Prop := + ∀ X : BlockVec d, X ≠ 0 → 0 < blockVecDot X (blockMatVecMul A X) + +/-- The pointwise doubled coefficient matrix field `\mathbf A(x)` associated to +the public coefficient representative. Public theorems about this field should +use a.e. hypotheses/conclusions on `U`. -/ +noncomputable def blockMatrixField {d : ℕ} {U : Domain d} (a : CoeffOn U) : + Vec d → BlockMat d := + fun x => + let s := symmPart (a.toCoeffField x) + let k := skewPart (a.toCoeffField x) + let sInv := s⁻¹ + { upperLeft := s + matTranspose k * sInv * k + upperRight := -(matTranspose k * sInv) + lowerLeft := -(sInv * k) + lowerRight := sInv } + +/-- The explicit inverse field appearing in +`e.block.matrix.inverse.basic.definitions`. -/ +noncomputable def blockMatrixInverseField {d : ℕ} {U : Domain d} (a : CoeffOn U) : + Vec d → BlockMat d := + fun x => + let s := symmPart (a.toCoeffField x) + let k := skewPart (a.toCoeffField x) + let sInv := s⁻¹ + { upperLeft := sInv + upperRight := -(sInv * k) + lowerLeft := -(matTranspose k * sInv) + lowerRight := s + matTranspose k * sInv * k } + +/-- Pointwise doubled energy density +`\frac12 X \cdot \mathbf A(x) X`. -/ +noncomputable def blockEnergyDensityAt {d : ℕ} {U : Domain d} (a : CoeffOn U) + (X : BlockVec d) (x : Vec d) : ℝ := + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (blockMatrixField a x) X) + +/-- The note-facing coarse block matrix assembled from the public coarse +matrices `sigma`, `sigmaStarInv`, and `kappa`. -/ +noncomputable def blockMatrixOfCoarseMatrices {d : ℕ} + (M : CoarseMatrices d) : BlockMat d := + { upperLeft := M.b + upperRight := -(matTranspose M.kappa * M.sigmaStarInv) + lowerLeft := -(M.sigmaStarInv * M.kappa) + lowerRight := M.sigmaStarInv } + +private theorem blockMatrixOfCoarseMatrices_cross_transpose {d : ℕ} (K S : Mat d) + (hS : S.IsSymm) : + matTranspose (-(matTranspose K * S)) = -(S * K) := by + ext i j + simp [matTranspose, Matrix.mul_apply] + refine Finset.sum_congr rfl ?_ + intro x _hx + rw [hS.apply] + ring + +/-- The note-facing coarse block matrix assembled from the public coarse +matrices is symmetric as a doubled block matrix. -/ +theorem isSymmetricBlockMat_blockMatrixOfCoarseMatrices {d : ℕ} + (M : CoarseMatrices d) (hSigma : M.sigma.IsSymm) + (hSigmaStarInv : M.sigmaStarInv.IsSymm) : + IsSymmetricBlockMat (blockMatrixOfCoarseMatrices M) := by + have hB : M.b.IsSymm := by + unfold CoarseMatrices.b + exact Matrix.IsSymm.add hSigma + (transpose_mul_symm_mul_isSymm M.kappa M.sigmaStarInv hSigmaStarInv) + have hCross : + matTranspose (-(matTranspose M.kappa * M.sigmaStarInv)) = + -(M.sigmaStarInv * M.kappa) := + blockMatrixOfCoarseMatrices_cross_transpose M.kappa M.sigmaStarInv hSigmaStarInv + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatrixOfCoarseMatrices, blockMatEntry, matTranspose] using + (hB.apply i j).symm + | inr j => + have h := congrArg (fun N : Mat d => N j i) hCross + simpa [blockMatrixOfCoarseMatrices, blockMatEntry, matTranspose] using h + | inr i => + cases β with + | inl j => + have h := congrArg (fun N : Mat d => N i j) hCross + simpa [blockMatrixOfCoarseMatrices, blockMatEntry, matTranspose] using h.symm + | inr j => + simpa [blockMatrixOfCoarseMatrices, blockMatEntry, matTranspose] using + (hSigmaStarInv.apply i j).symm + +/-- The canonical public coarse block matrix `\mathbf A(U; a)`. -/ +noncomputable def coarseBlockMatrix {d : ℕ} (U : Domain d) (a : CoeffOn U) : + BlockMat d := + blockMatrixOfCoarseMatrices (coarseMatrices U a) + +/-- The canonical public coarse block matrix is symmetric as a doubled block +matrix. -/ +theorem isSymmetricBlockMat_coarseBlockMatrix {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + IsSymmetricBlockMat (coarseBlockMatrix U a) := by + unfold coarseBlockMatrix + exact isSymmetricBlockMat_blockMatrixOfCoarseMatrices (coarseMatrices U a) + (sigmaCoarse_isSymm U a) (sigmaStarInvCoarse_isSymm U a) + +theorem coarseBlockMatrix_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + coarseBlockMatrix U a = coarseBlockMatrix U b := by + simp [coarseBlockMatrix, blockMatrixOfCoarseMatrices, coarseMatrices_eq_ofAEEq h] + +/-- The canonical public starred inverse block matrix +`\mathbf A_*^{-1}(U; a)`. -/ +noncomputable def coarseStarredBlockMatrixInv {d : ℕ} (U : Domain d) + (a : CoeffOn U) : BlockMat d := + blockReflect (coarseBlockMatrix U a) + +/-- The canonical public starred block matrix `\mathbf A_*(U; a)`. + +The notes introduce `\mathbf A_*` through the positive definite matrix whose +inverse appears in the doubled response splitting. -/ +noncomputable def coarseStarredBlockMatrix {d : ℕ} (U : Domain d) + (a : CoeffOn U) : BlockMat d := + blockMatInv (coarseStarredBlockMatrixInv U a) + +@[simp] theorem coarseBlockMatrix_upperLeft {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseBlockMatrix U a).upperLeft = bCoarse U a := + rfl + +@[simp] theorem coarseBlockMatrix_upperRight {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseBlockMatrix U a).upperRight = + -(matTranspose (kappaCoarse U a) * sigmaStarInvCoarse U a) := + rfl + +@[simp] theorem coarseBlockMatrix_lowerLeft {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseBlockMatrix U a).lowerLeft = + -(sigmaStarInvCoarse U a * kappaCoarse U a) := + rfl + +@[simp] theorem coarseBlockMatrix_lowerRight {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := + rfl + +@[simp] theorem coarseStarredBlockMatrixInv_eq_blockReflect {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + coarseStarredBlockMatrixInv U a = blockReflect (coarseBlockMatrix U a) := + rfl + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/CoeffRestriction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/CoeffRestriction.lean new file mode 100644 index 0000000000..54c0682dd6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/CoeffRestriction.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity + +/-! # Coeff Restriction -/ + +@[expose] public section + +namespace Homogenization +namespace Book.Ch02 + +noncomputable section + +namespace CoeffOn + +/-- The literal restriction of one coefficient representative to a subcube. + +Unlike a coefficient-family compatibility witness, this keeps the same raw +representative and transports only its a.e. data to the smaller cube. -/ +noncomputable def restrictToSubcube {d : ℕ} {Q R : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) (hRQ : openCubeSet R ⊆ openCubeSet Q) : + CoeffOn (cubeDomain R) where + toCoeffField := a.toCoeffField + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + intro i j + have hmeas := (a.aeStronglyMeasurable i j).mono_measure + (MeasureTheory.Measure.restrict_mono hRQ le_rfl) + apply hmeas.congr + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet R)] with x hx + simp [restrictCoeffField, hx, hRQ hx] + aeElliptic := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset hRQ a.aeElliptic + +@[simp] theorem restrictToSubcube_toCoeffField {d : ℕ} + {Q R : TriadicCube d} (a : CoeffOn (cubeDomain Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + (a.restrictToSubcube hRQ).toCoeffField = a.toCoeffField := rfl + +theorem restrictToSubcube_restrictsTo {d : ℕ} {Q R : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) (hRQ : openCubeSet R ⊆ openCubeSet Q) : + RestrictsTo a (a.restrictToSubcube hRQ) := Filter.EventuallyEq.rfl + +theorem restrictToSubcube_trans_aeeq {d : ℕ} {Q R S : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) + (hSR : openCubeSet S ⊆ openCubeSet R) : + AEEq ((a.restrictToSubcube hRQ).restrictToSubcube hSR) + (a.restrictToSubcube (hSR.trans hRQ)) := Filter.EventuallyEq.rfl + +end CoeffOn + +end + +end Book.Ch02 +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Definitions.lean new file mode 100644 index 0000000000..c221c0b03b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Definitions.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation + +/-! # Definitions -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation.lean new file mode 100644 index 0000000000..6302a5b1cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation.Basic + +/-! # Dilation -/ + +@[expose] public section + +open scoped Pointwise + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Public dilation package after the Chapter 2.5 definitions + +This file freezes the note-facing dilation vocabulary used by later Chapter 3 +arguments. The statements are deliberately phrased with the public `CoeffOn` +and `TriadicCoeffFamily` interfaces: coefficient representatives are compared +only almost everywhere on the dilated cube. + +The geometric convention is that dilation by `3^k` sends a triadic cube +`Q = 3^m (z + [-1/2,1/2]^d)` to the cube with the same integer index and scale +`m + k`. +-/ + +noncomputable section + +/-- One-cube public dilation statements. These are the Chapter 3-facing facts: +solutions dilate to solutions, scalar and doubled response values are +unchanged, and all canonical one-cube coarse matrices are unchanged. -/ +structure CubeDilationTheory (d : ℕ) : Prop where + solution_dilation_exists : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + ∀ hCoeff : CoeffOn.IsCubeDilation k a b, + ∀ u : Solution (cubeDomain Q) a, + Nonempty (Solution.CubeDilation hCoeff u) + responseValue_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b}, + Solution.IsCubeDilation hCoeff u v → + ∀ p q : Vec d, + responseValue (cubeDomain (dilateCube k Q)) b p q v = + responseValue (cubeDomain Q) a p q u + variationEnergyValue_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b}, + Solution.IsCubeDilation hCoeff u v → + variationEnergyValue (cubeDomain (dilateCube k Q)) b v = + variationEnergyValue (cubeDomain Q) a u + averageGradient_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b}, + Solution.IsCubeDilation hCoeff u v → + averageGradient (cubeDomain (dilateCube k Q)) b v = + averageGradient (cubeDomain Q) a u + averageFlux_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b}, + Solution.IsCubeDilation hCoeff u v → + averageFlux (cubeDomain (dilateCube k Q)) b v = + averageFlux (cubeDomain Q) a u + responseJ_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + ∀ p q : Vec d, + responseJ (cubeDomain (dilateCube k Q)) b p q = + responseJ (cubeDomain Q) a p q + doubledMu_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + ∀ P : BlockVec d, + doubledMu (cubeDomain (dilateCube k Q)) b P = + doubledMu (cubeDomain Q) a P + doubledResponseJ_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + ∀ P R : BlockVec d, + doubledResponseJ (cubeDomain (dilateCube k Q)) b P R = + doubledResponseJ (cubeDomain Q) a P R + sigmaCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + sigmaCoarse (cubeDomain (dilateCube k Q)) b = + sigmaCoarse (cubeDomain Q) a + sigmaStarInvCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + sigmaStarInvCoarse (cubeDomain (dilateCube k Q)) b = + sigmaStarInvCoarse (cubeDomain Q) a + sigmaStarCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + sigmaStarCoarse (cubeDomain (dilateCube k Q)) b = + sigmaStarCoarse (cubeDomain Q) a + kappaCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + kappaCoarse (cubeDomain (dilateCube k Q)) b = + kappaCoarse (cubeDomain Q) a + coarseMatrices_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + coarseMatrices (cubeDomain (dilateCube k Q)) b = + coarseMatrices (cubeDomain Q) a + bCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + bCoarse (cubeDomain (dilateCube k Q)) b = + bCoarse (cubeDomain Q) a + aCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + aCoarse (cubeDomain (dilateCube k Q)) b = + aCoarse (cubeDomain Q) a + aStarCoarse_dilate : + ∀ {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))}, + CoeffOn.IsCubeDilation k a b → + aStarCoarse (cubeDomain (dilateCube k Q)) b = + aStarCoarse (cubeDomain Q) a + +/-- Chapter 2.5 multiscale dilation statements. A dilation shifts every scale +index by `k`; the normalized multiscale quantities themselves do not change. -/ +structure MultiscaleDilationTheory (d : ℕ) [NeZero d] : Prop where + coarseBMatrixNorm_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ Q : TriadicCube d, + coarseBMatrixNorm (dilateCube k Q) b = + coarseBMatrixNorm Q a + coarseSigmaStarInvMatrixNorm_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ Q : TriadicCube d, + coarseSigmaStarInvMatrixNorm (dilateCube k Q) b = + coarseSigmaStarInvMatrixNorm Q a + maxDescendantBMatrixNormAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ), + maxDescendantBMatrixNormAtScale (dilateCube k Q) (n + k) b = + maxDescendantBMatrixNormAtScale Q n a + maxDescendantSigmaStarInvMatrixNormAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ), + maxDescendantSigmaStarInvMatrixNormAtScale (dilateCube k Q) (n + k) b = + maxDescendantSigmaStarInvMatrixNormAtScale Q n a + LambdaSq_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent), + LambdaSq (dilateCube k Q) s q b = + LambdaSq Q s q a + lambdaSq_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent), + lambdaSq (dilateCube k Q) s q b = + lambdaSq Q s q a + LambdaS_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s : ℝ), + LambdaS (dilateCube k Q) s b = LambdaS Q s a + lambdaS_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s : ℝ), + lambdaS (dilateCube k Q) s b = lambdaS Q s a + ThetaRatio_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s t : ℝ), + ThetaRatio (dilateCube k Q) s t b = ThetaRatio Q s t a + maxDescendantUpperEllipticityAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ) (s : ℝ) (q : MultiscaleExponent), + maxDescendantUpperEllipticityAtScale (dilateCube k Q) (n + k) s q b = + maxDescendantUpperEllipticityAtScale Q n s q a + maxDescendantLowerEllipticityInvAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ) (s : ℝ) (q : MultiscaleExponent), + maxDescendantLowerEllipticityInvAtScale (dilateCube k Q) (n + k) s q b = + maxDescendantLowerEllipticityInvAtScale Q n s q a + normalizedBlockResponseMax_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (a0 : Mat d), + normalizedBlockResponseMax (dilateCube k Q) b a0 = + normalizedBlockResponseMax Q a a0 + maxDescendantNormalizedBlockResponseAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ) (a0 : Mat d), + maxDescendantNormalizedBlockResponseAtScale (dilateCube k Q) (n + k) b a0 = + maxDescendantNormalizedBlockResponseAtScale Q n a a0 + scaleResponseAtScale_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ) (p : MultiscaleExponent) (a0 : Mat d), + scaleResponseAtScale (dilateCube k Q) (n + k) p b a0 = + scaleResponseAtScale Q n p a a0 + HomogenizationError_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (n : ℤ) (s : ℝ) + (p q : MultiscaleExponent) (a0 : Mat d), + HomogenizationError (dilateCube k Q) (n + k) s p q b a0 = + HomogenizationError Q n s p q a a0 + HomogenizationErrorOnCube_dilate : + ∀ {k : ℤ} {a b : TriadicCoeffFamily d}, + TriadicCoeffFamily.IsDilation k a b → + ∀ (Q : TriadicCube d) (s : ℝ) + (p q : MultiscaleExponent) (a0 : Mat d), + HomogenizationErrorOnCube (dilateCube k Q) s p q b a0 = + HomogenizationErrorOnCube Q s p q a a0 + +/-- Aggregate public dilation theorem package for Chapter 2 / 2.5, intended to +be imported by Chapter 3 scale-normalization arguments. -/ +structure DilationTheory (d : ℕ) [NeZero d] : Prop where + cube : CubeDilationTheory d + multiscale : MultiscaleDilationTheory d + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation/Basic.lean new file mode 100644 index 0000000000..063975c05b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Dilation/Basic.lean @@ -0,0 +1,782 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NormScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation + +/-! # Dilation primitives and identities -/ + +@[expose] public section + +open scoped Pointwise + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Public dilation package after the Chapter 2.5 definitions + +This file freezes the note-facing dilation vocabulary used by later Chapter 3 +arguments. The statements are deliberately phrased with the public `CoeffOn` +and `TriadicCoeffFamily` interfaces: coefficient representatives are compared +only almost everywhere on the dilated cube. + +The geometric convention is that dilation by `3^k` sends a triadic cube +`Q = 3^m (z + [-1/2,1/2]^d)` to the cube with the same integer index and scale +`m + k`. +-/ + +noncomputable section + +/-- The positive dilation factor `3^k`. -/ +def triadicDilationFactor (k : ℤ) : ℝ := + (3 : ℝ) ^ k + +theorem triadicDilationFactor_pos (k : ℤ) : + 0 < triadicDilationFactor k := by + simpa [triadicDilationFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) k) + +theorem triadicDilationFactor_ne_zero (k : ℤ) : + triadicDilationFactor k ≠ 0 := + (triadicDilationFactor_pos k).ne' + +/-- Dilation of a vector by `3^k`. -/ +def dilateVec {d : ℕ} (k : ℤ) (x : Vec d) : Vec d := + triadicDilationFactor k • x + +/-- Pullback map associated with dilation by `3^k`. -/ +def undilateVec {d : ℕ} (k : ℤ) (x : Vec d) : Vec d := + (triadicDilationFactor k)⁻¹ • x + +/-- Representative-level pullback of a coefficient field under dilation by +`3^k`. Public coefficient objects use `CoeffOn.IsCubeDilation` below, which +records this relation only a.e. on the target cube. -/ +def dilateCoeffField {d : ℕ} (k : ℤ) (a : CoeffField d) : CoeffField d := + fun x => a (undilateVec k x) + +@[simp] theorem dilateCoeffField_apply {d : ℕ} (k : ℤ) (a : CoeffField d) + (x : Vec d) : + dilateCoeffField k a x = a (undilateVec k x) := + rfl + +/-- Dilation of a triadic cube by `3^k`: the scale is shifted by `k`, while the +integer index is unchanged. -/ +def dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale + k + index := Q.index } + +@[simp] theorem dilateCube_scale {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + (dilateCube k Q).scale = Q.scale + k := + rfl + +@[simp] theorem dilateCube_index {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + (dilateCube k Q).index = Q.index := + rfl + +theorem cubeScaleFactor_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + cubeScaleFactor (dilateCube k Q) = + triadicDilationFactor k * cubeScaleFactor Q := by + simp only [cubeScaleFactor, dilateCube, triadicDilationFactor] + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring_nf + +theorem openCubeSet_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + openCubeSet (dilateCube k Q) = + triadicDilationFactor k • openCubeSet Q := by + ext x + constructor + · intro hx + rw [Set.mem_smul_set] + refine ⟨undilateVec k x, ?_, ?_⟩ + · intro i + have hxi := hx i + have hs_pos := triadicDilationFactor_pos k + have hscale := cubeScaleFactor_dilateCube k Q + constructor + · have hlo_mul : + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) * + triadicDilationFactor k < x i := by + simpa [hscale, mul_assoc, mul_left_comm, mul_comm] using hxi.1 + have hlo_div : + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) < + x i / triadicDilationFactor k := + (lt_div_iff₀ hs_pos).2 hlo_mul + simpa [undilateVec, Pi.smul_apply, smul_eq_mul, div_eq_mul_inv, + mul_comm] using hlo_div + · have hhi_mul : + x i < (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) * + triadicDilationFactor k := by + simpa [hscale, mul_assoc, mul_left_comm, mul_comm] using hxi.2 + have hhi_div : + x i / triadicDilationFactor k < + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := + (div_lt_iff₀ hs_pos).2 hhi_mul + simpa [undilateVec, Pi.smul_apply, smul_eq_mul, div_eq_mul_inv, + mul_comm] using hhi_div + · ext i + simp [undilateVec, triadicDilationFactor_ne_zero k] + · rintro ⟨y, hy, rfl⟩ + intro i + have hyi := hy i + have hs_pos := triadicDilationFactor_pos k + have hscale := cubeScaleFactor_dilateCube k Q + constructor + · have h := mul_lt_mul_of_pos_left hyi.1 hs_pos + simpa [Pi.smul_apply, smul_eq_mul, hscale, mul_assoc, mul_left_comm, + mul_comm] using h + · have h := mul_lt_mul_of_pos_left hyi.2 hs_pos + simpa [Pi.smul_apply, smul_eq_mul, hscale, mul_assoc, mul_left_comm, + mul_comm] using h + +theorem IsSolenoidalOn.dilateSet {d : ℕ} {U V : Set (Vec d)} {r : ℝ} + (hr : 0 < r) (hV : V = r • U) {g : Vec d → Vec d} + (hg : IsSolenoidalOn U g) : + IsSolenoidalOn V (fun x => g (r⁻¹ • x)) := by + subst V + intro φ + let ψ : H10Function U := φ.unscale hr + have htest := hg ψ + have hscaled : + r * ∫ y in U, + vecDot (g y) (φ.toH1Function.grad (r • y)) ∂MeasureTheory.volume = 0 := by + have hfun : + (fun y : Vec d => + vecDot (g y) (ψ.toH1Function.grad y)) = + fun y => r * vecDot (g y) (φ.toH1Function.grad (r • y)) := by + funext y + simp [ψ, vecDot_smul_right] + simpa [hfun, MeasureTheory.integral_const_mul] using htest + have hbase : + ∫ y in U, vecDot (g y) (φ.toH1Function.grad (r • y)) + ∂MeasureTheory.volume = 0 := by + exact (mul_eq_zero.mp hscaled).resolve_left hr.ne' + have hchange : + ∫ y in U, vecDot (g y) (φ.toH1Function.grad (r • y)) + ∂MeasureTheory.volume = + (r ^ d)⁻¹ * ∫ x in r • U, + vecDot (g (r⁻¹ • x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [smul_smul, hr.ne'] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => + vecDot (g (r⁻¹ • x)) (φ.toH1Function.grad x)) + (s := U) hr) + calc + ∫ x in r • U, vecDot (g (r⁻¹ • x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = (r ^ d) * ∫ y in U, + vecDot (g y) (φ.toH1Function.grad (r • y)) + ∂MeasureTheory.volume := by + have hpos : (r ^ d) ≠ 0 := (pow_pos hr d).ne' + rw [hchange] + field_simp [hpos] + _ = 0 := by + rw [hbase] + simp + +theorem IsSolenoidalOn.congr_ae {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hfg : f =ᵐ[volumeMeasureOn U] g) + (hf : IsSolenoidalOn U f) : + IsSolenoidalOn U g := by + intro φ + calc + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, vecDot (f x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact hfg.symm.mono fun x hx => by + simp [hx] + _ = 0 := hf φ + +theorem IsSolenoidalOn.undilateSet {d : ℕ} {U V : Set (Vec d)} {r : ℝ} + (hr : 0 < r) (hV : V = r • U) {g : Vec d → Vec d} + (hg : IsSolenoidalOn V g) : + IsSolenoidalOn U (fun x => g (r • x)) := by + have hU : U = r⁻¹ • V := by + rw [hV] + ext x + simp [hr.ne'] + have h := IsSolenoidalOn.dilateSet (inv_pos.mpr hr) hU hg + simpa using h + +namespace CoeffOn + +/-- Public a.e. relation saying that `b` is the dilation by `3^k` of a +coefficient field `a` from `Q` to `3^k Q`. + +The lower/upper ellipticity constants are required to be the same named +constants, and the representatives agree a.e. with the pullback +`a(3^{-k} ·)` on the target cube. -/ +def IsCubeDilation {d : ℕ} (k : ℤ) {Q : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) + (b : CoeffOn (cubeDomain (dilateCube k Q))) : Prop := + b.lam = a.lam ∧ + b.Lam = a.Lam ∧ + b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + dilateCoeffField k a.toCoeffField + +namespace IsCubeDilation + +theorem lam_eq {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (h : IsCubeDilation k a b) : + b.lam = a.lam := + h.1 + +theorem Lam_eq {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (h : IsCubeDilation k a b) : + b.Lam = a.Lam := + h.2.1 + +theorem coeff_ae_eq {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (h : IsCubeDilation k a b) : + b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + dilateCoeffField k a.toCoeffField := + h.2.2 + +theorem transpose {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (h : IsCubeDilation k a b) : + IsCubeDilation k a.transpose b.transpose := by + refine ⟨h.lam_eq, h.Lam_eq, ?_⟩ + exact h.coeff_ae_eq.mono fun x hx => by + ext i j + simp [dilateCoeffField, hx, matTranspose] + +end IsCubeDilation +end CoeffOn + +namespace TriadicCoeffFamily + +/-- A triadic coefficient family `b` is the dilation by `3^k` of `a` if, on +every original cube `Q`, the coefficient object on the dilated cube `3^k Q` +is the public a.e. dilation of the coefficient object on `Q`. -/ +def IsDilation {d : ℕ} (k : ℤ) (a b : TriadicCoeffFamily d) : Prop := + ∀ Q : TriadicCube d, + CoeffOn.IsCubeDilation k (a.coeffOn Q) (b.coeffOn (dilateCube k Q)) + +end TriadicCoeffFamily + +namespace Solution + +/-- Data expressing that `v` is the dilation of a Chapter 2 solution `u` from +`Q` to `3^k Q`. + +The function is scaled by `3^k`, so its gradient and flux pull back without an +extra scalar. This is the normalization under which response quantities and +coarse matrices are scale invariant. -/ +structure IsCubeDilation {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + (u : Solution (cubeDomain Q) a) + (v : Solution (cubeDomain (dilateCube k Q)) b) : Prop where + value_ae_eq : + v.toH1.toFun =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => triadicDilationFactor k * u.toH1.toFun (undilateVec k x) + grad_ae_eq : + v.toH1.grad =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => u.toH1.grad (undilateVec k x) + flux_ae_eq : + (fun x => matVecMul (b.toCoeffField x) (v.toH1.grad x)) + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => + matVecMul (a.toCoeffField (undilateVec k x)) + (u.toH1.grad (undilateVec k x)) + +/-- A packaged dilated solution. The `toSolution` field is the public lemma's +conclusion: it is an actual solution of the dilated equation. -/ +structure CubeDilation {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + (u : Solution (cubeDomain Q) a) where + toSolution : Solution (cubeDomain (dilateCube k Q)) b + isDilation : IsCubeDilation hCoeff u toSolution + +/-- Dilation of a public Chapter 2 solution. The function is normalized as +`v(x) = 3^k u(3^{-k}x)`, so its weak gradient and flux are plain pullbacks. -/ +noncomputable def dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + (u : Solution (cubeDomain Q) a) : CubeDilation hCoeff u := by + let s : ℝ := triadicDilationFactor k + have hs : 0 < s := triadicDilationFactor_pos k + have hset : + ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) = + s • ((cubeDomain Q : Domain d) : Set (Vec d)) := by + simpa [s, cubeDomain_coe] using openCubeSet_dilateCube k Q + let vH1 : H1Function ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) := + u.toH1.dilateSet hs hset + let sourceFlux : Vec d → Vec d := + fun y => matVecMul (a.toCoeffField y) (u.toH1.grad y) + let v : Solution (cubeDomain (dilateCube k Q)) b := + { toH1 := vH1 + isHarmonic := by + refine ⟨vH1.isPotentialOn, ?_⟩ + have hsolPull : + IsSolenoidalOn ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) + (fun x => sourceFlux (s⁻¹ • x)) := by + simpa [sourceFlux, s, undilateVec] using + IsSolenoidalOn.dilateSet hs hset u.isHarmonic.2 + refine IsSolenoidalOn.congr_ae ?_ hsolPull + exact hCoeff.coeff_ae_eq.mono fun x hx => by + simp only [sourceFlux, vH1, s, undilateVec, dilateCoeffField, hx] + rfl } + exact + { toSolution := v + isDilation := + { value_ae_eq := Filter.Eventually.of_forall fun x => by + simp only [v, vH1, s, undilateVec] + rfl + grad_ae_eq := Filter.Eventually.of_forall fun x => by + simp only [v, vH1, s, undilateVec] + rfl + flux_ae_eq := hCoeff.coeff_ae_eq.mono fun x hx => by + simp only [v, vH1, s, undilateVec, dilateCoeffField, hx] + rfl } } + +/-- Inverse transport for a dilated public solution. This is used to show +that dilation identifies the whole response value set, not just one chosen +solution. -/ +noncomputable def undilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + (v : Solution (cubeDomain (dilateCube k Q)) b) : + Solution (cubeDomain Q) a := by + let s : ℝ := triadicDilationFactor k + have hs : 0 < s := triadicDilationFactor_pos k + have hset : + ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) = + s • ((cubeDomain Q : Domain d) : Set (Vec d)) := by + simpa [s, cubeDomain_coe] using openCubeSet_dilateCube k Q + let wH1 : H1Function ((cubeDomain Q : Domain d) : Set (Vec d)) := + v.toH1.undilateSet hs hset + exact + { toH1 := wH1 + isHarmonic := by + refine ⟨wH1.isPotentialOn, ?_⟩ + have htarget : + IsSolenoidalOn + ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) + (fun x => + matVecMul (dilateCoeffField k a.toCoeffField x) (v.toH1.grad x)) := by + refine IsSolenoidalOn.congr_ae + (f := fun x => matVecMul (b.toCoeffField x) (v.toH1.grad x)) ?_ ?_ + · exact hCoeff.coeff_ae_eq.mono fun x hx => by + simp [hx] + exact v.isHarmonic.2 + have hpull : + IsSolenoidalOn ((cubeDomain Q : Domain d) : Set (Vec d)) + (fun y => + matVecMul (dilateCoeffField k a.toCoeffField (s • y)) + (v.toH1.grad (s • y))) := + IsSolenoidalOn.undilateSet hs hset htarget + have hfun : + (fun x : Vec d => matVecMul (a.toCoeffField x) (wH1.grad x)) = + fun y => + matVecMul (dilateCoeffField k a.toCoeffField (s • y)) + (v.toH1.grad (s • y)) := by + funext y + have hcoeff : a.toCoeffField y = dilateCoeffField k a.toCoeffField (s • y) := by + simp only [dilateCoeffField, undilateVec, s, smul_smul, + inv_mul_cancel₀ (triadicDilationFactor_ne_zero k), one_smul] + have hgrad : wH1.grad y = v.toH1.grad (s • y) := by + simp only [wH1] + exact H1Function.undilateSet_grad hs hset v.toH1 y + rw [hcoeff, hgrad] + rw [hfun] + exact hpull } + +theorem undilate_isDilation {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + (v : Solution (cubeDomain (dilateCube k Q)) b) : + IsCubeDilation hCoeff (undilate hCoeff v) v := by + let s : ℝ := triadicDilationFactor k + have hs : 0 < s := triadicDilationFactor_pos k + have hset : + ((cubeDomain (dilateCube k Q) : Domain d) : Set (Vec d)) = + s • ((cubeDomain Q : Domain d) : Set (Vec d)) := by + simpa [s, cubeDomain_coe] using openCubeSet_dilateCube k Q + have hToH1 : (undilate hCoeff v).toH1 = v.toH1.undilateSet hs hset := rfl + have hgrad : ∀ x : Vec d, (undilate hCoeff v).toH1.grad x = v.toH1.grad (s • x) := by + intro x + rw [hToH1] + exact H1Function.undilateSet_grad hs hset v.toH1 x + have hval : ∀ x : Vec d, + (undilate hCoeff v).toH1.toFun x = s⁻¹ * v.toH1.toFun (s • x) := by + intro x + rw [hToH1] + exact H1Function.undilateSet_toFun hs hset v.toH1 x + have hcancel_smul : ∀ x : Vec d, s • (s⁻¹ • x) = x := by + intro x + rw [smul_smul, mul_inv_cancel₀ (triadicDilationFactor_ne_zero k), one_smul] + have hcancel_mul : ∀ t : ℝ, s * (s⁻¹ * t) = t := by + intro t + rw [← mul_assoc, mul_inv_cancel₀ (triadicDilationFactor_ne_zero k), one_mul] + refine + { value_ae_eq := Filter.Eventually.of_forall fun x => ?_ + grad_ae_eq := Filter.Eventually.of_forall fun x => ?_ + flux_ae_eq := hCoeff.coeff_ae_eq.mono fun x hx => ?_ } + · show v.toH1.toFun x = s * (undilate hCoeff v).toH1.toFun (s⁻¹ • x) + rw [hval (s⁻¹ • x), hcancel_smul x, hcancel_mul (v.toH1.toFun x)] + · show v.toH1.grad x = (undilate hCoeff v).toH1.grad (s⁻¹ • x) + rw [hgrad (s⁻¹ • x), hcancel_smul x] + · have hx' : b.toCoeffField x = a.toCoeffField (s⁻¹ • x) := hx + show matVecMul (b.toCoeffField x) (v.toH1.grad x) = + matVecMul (a.toCoeffField (s⁻¹ • x)) ((undilate hCoeff v).toH1.grad (s⁻¹ • x)) + rw [hx', hgrad (s⁻¹ • x), hcancel_smul x] + +theorem CubeDilation.is_solution {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + {hCoeff : CoeffOn.IsCubeDilation k a b} + {u : Solution (cubeDomain Q) a} + (v : CubeDilation hCoeff u) : + IsAHarmonicGradient b.toCoeffField + (openCubeSet (dilateCube k Q)) v.toSolution.toH1.grad := + v.toSolution.isHarmonic + +theorem CubeDilation.grad_ae_eq {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + {hCoeff : CoeffOn.IsCubeDilation k a b} + {u : Solution (cubeDomain Q) a} + (v : CubeDilation hCoeff u) : + v.toSolution.toH1.grad + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => u.toH1.grad (undilateVec k x) := + v.isDilation.grad_ae_eq + +theorem CubeDilation.flux_ae_eq {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + {hCoeff : CoeffOn.IsCubeDilation k a b} + {u : Solution (cubeDomain Q) a} + (v : CubeDilation hCoeff u) : + (fun x => matVecMul (b.toCoeffField x) (v.toSolution.toH1.grad x)) + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => + matVecMul (a.toCoeffField (undilateVec k x)) + (u.toH1.grad (undilateVec k x)) := + v.isDilation.flux_ae_eq + +end Solution + +theorem average_eq_of_ae_eq {d : ℕ} {U : Domain d} {f g : Vec d → ℝ} + (hfg : f =ᵐ[volumeMeasureOn ((U : Domain d) : Set (Vec d))] g) : + average U f = average U g := by + unfold average + congr 1 + exact MeasureTheory.integral_congr_ae hfg + +theorem averageVec_eq_of_ae_eq {d : ℕ} {U : Domain d} {f g : Vec d → Vec d} + (hfg : f =ᵐ[volumeMeasureOn ((U : Domain d) : Set (Vec d))] g) : + averageVec U f = averageVec U g := by + ext i + exact average_eq_of_ae_eq (hfg.mono fun x hx => congrArg (fun y : Vec d => y i) hx) + +theorem average_dilate_comp_undilate {d : ℕ} (k : ℤ) (Q : TriadicCube d) + (f : Vec d → ℝ) : + average (cubeDomain (dilateCube k Q)) (fun x => f (undilateVec k x)) = + average (cubeDomain Q) f := by + change + volumeAverage (openCubeSet (dilateCube k Q)) (fun x => f (undilateVec k x)) = + volumeAverage (openCubeSet Q) f + rw [openCubeSet_dilateCube] + have h := + Ch01.volumeAverage_smul_set_comp_smul_of_pos + (d := d) (triadicDilationFactor_pos k) (openCubeSet Q) + (fun x => f (undilateVec k x)) + simpa [undilateVec, smul_smul, triadicDilationFactor_ne_zero k] using h + +theorem averageVec_dilate_comp_undilate {d : ℕ} (k : ℤ) (Q : TriadicCube d) + (F : Vec d → Vec d) : + averageVec (cubeDomain (dilateCube k Q)) (fun x => F (undilateVec k x)) = + averageVec (cubeDomain Q) F := by + ext i + exact average_dilate_comp_undilate k Q (fun x => F x i) + +theorem responseIntegrand_dilate_ae {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + {hCoeff : CoeffOn.IsCubeDilation k a b} + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) (p q : Vec d) : + responseIntegrand (cubeDomain (dilateCube k Q)) b p q v + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => responseIntegrand (cubeDomain Q) a p q u (undilateVec k x) := by + filter_upwards [hDilation.grad_ae_eq, hCoeff.coeff_ae_eq] with x hgrad hcoeff + simp [responseIntegrand, hgrad, hcoeff, dilateCoeffField] + +theorem variationEnergyIntegrand_dilate_ae {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + {hCoeff : CoeffOn.IsCubeDilation k a b} + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) : + variationEnergyIntegrand (cubeDomain (dilateCube k Q)) b v + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => variationEnergyIntegrand (cubeDomain Q) a u (undilateVec k x) := by + filter_upwards [hDilation.grad_ae_eq, hCoeff.coeff_ae_eq] with x hgrad hcoeff + simp [variationEnergyIntegrand, hgrad, hcoeff, dilateCoeffField] + +theorem responseValue_dilate_of_isCubeDilation {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) (p q : Vec d) : + responseValue (cubeDomain (dilateCube k Q)) b p q v = + responseValue (cubeDomain Q) a p q u := by + unfold responseValue + calc + average (cubeDomain (dilateCube k Q)) + (responseIntegrand (cubeDomain (dilateCube k Q)) b p q v) + = + average (cubeDomain (dilateCube k Q)) + (fun x => responseIntegrand (cubeDomain Q) a p q u (undilateVec k x)) := by + exact average_eq_of_ae_eq (responseIntegrand_dilate_ae hDilation p q) + _ = average (cubeDomain Q) (responseIntegrand (cubeDomain Q) a p q u) := + average_dilate_comp_undilate k Q + (responseIntegrand (cubeDomain Q) a p q u) + +theorem variationEnergyValue_dilate_of_isCubeDilation {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) : + variationEnergyValue (cubeDomain (dilateCube k Q)) b v = + variationEnergyValue (cubeDomain Q) a u := by + unfold variationEnergyValue + calc + average (cubeDomain (dilateCube k Q)) + (variationEnergyIntegrand (cubeDomain (dilateCube k Q)) b v) + = + average (cubeDomain (dilateCube k Q)) + (fun x => variationEnergyIntegrand (cubeDomain Q) a u (undilateVec k x)) := by + exact average_eq_of_ae_eq (variationEnergyIntegrand_dilate_ae hDilation) + _ = average (cubeDomain Q) (variationEnergyIntegrand (cubeDomain Q) a u) := + average_dilate_comp_undilate k Q + (variationEnergyIntegrand (cubeDomain Q) a u) + +theorem averageGradient_dilate_of_isCubeDilation {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) : + averageGradient (cubeDomain (dilateCube k Q)) b v = + averageGradient (cubeDomain Q) a u := by + unfold averageGradient + calc + averageVec (cubeDomain (dilateCube k Q)) v.toH1.grad = + averageVec (cubeDomain (dilateCube k Q)) + (fun x => u.toH1.grad (undilateVec k x)) := by + exact averageVec_eq_of_ae_eq hDilation.grad_ae_eq + _ = averageVec (cubeDomain Q) u.toH1.grad := + averageVec_dilate_comp_undilate k Q u.toH1.grad + +theorem averageFlux_dilate_of_isCubeDilation {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) + {u : Solution (cubeDomain Q) a} + {v : Solution (cubeDomain (dilateCube k Q)) b} + (hDilation : Solution.IsCubeDilation hCoeff u v) : + averageFlux (cubeDomain (dilateCube k Q)) b v = + averageFlux (cubeDomain Q) a u := by + unfold averageFlux + calc + averageVec (cubeDomain (dilateCube k Q)) + (fun x => matVecMul (b.toCoeffField x) (v.toH1.grad x)) = + averageVec (cubeDomain (dilateCube k Q)) + (fun x => + matVecMul (a.toCoeffField (undilateVec k x)) + (u.toH1.grad (undilateVec k x))) := by + exact averageVec_eq_of_ae_eq hDilation.flux_ae_eq + _ = averageVec (cubeDomain Q) + (fun x => matVecMul (a.toCoeffField x) (u.toH1.grad x)) := + averageVec_dilate_comp_undilate k Q + (fun x => matVecMul (a.toCoeffField x) (u.toH1.grad x)) + +theorem responseValueSet_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (p q : Vec d) : + responseValueSet (cubeDomain (dilateCube k Q)) b p q = + responseValueSet (cubeDomain Q) a p q := by + ext m + constructor + · rintro ⟨v, rfl⟩ + exact + ⟨Solution.undilate hCoeff v, + responseValue_dilate_of_isCubeDilation hCoeff + (Solution.undilate_isDilation hCoeff v) p q⟩ + · rintro ⟨u, rfl⟩ + let v := Solution.dilate hCoeff u + exact + ⟨v.toSolution, + (responseValue_dilate_of_isCubeDilation hCoeff v.isDilation p q).symm⟩ + +theorem responseJ_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (p q : Vec d) : + responseJ (cubeDomain (dilateCube k Q)) b p q = + responseJ (cubeDomain Q) a p q := by + unfold responseJ + rw [responseValueSet_dilate hCoeff p q] + +theorem sigmaStarInvEntry_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (i j : Fin d) : + sigmaStarInvEntry (cubeDomain (dilateCube k Q)) b i j = + sigmaStarInvEntry (cubeDomain Q) a i j := by + by_cases hij : i = j + · simp [sigmaStarInvEntry, hij, responseJ_dilate hCoeff] + · simp [sigmaStarInvEntry, hij, responseJ_dilate hCoeff] + +theorem sigmaStarInvCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + sigmaStarInvCoarse (cubeDomain (dilateCube k Q)) b = + sigmaStarInvCoarse (cubeDomain Q) a := by + ext i j + exact sigmaStarInvEntry_dilate hCoeff i j + +theorem sigmaStarCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + sigmaStarCoarse (cubeDomain (dilateCube k Q)) b = + sigmaStarCoarse (cubeDomain Q) a := by + simp [sigmaStarCoarse, sigmaStarInvCoarse_dilate hCoeff] + +theorem mixedResponse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (p q : Vec d) : + mixedResponse (cubeDomain (dilateCube k Q)) b p q = + mixedResponse (cubeDomain Q) a p q := by + simp [mixedResponse, responseJ_dilate hCoeff] + +theorem sigmaStarInvKappaCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + sigmaStarInvKappaCoarse (cubeDomain (dilateCube k Q)) b = + sigmaStarInvKappaCoarse (cubeDomain Q) a := by + ext i j + exact mixedResponse_dilate hCoeff (Pi.single j 1) (Pi.single i 1) + +theorem kappaCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + kappaCoarse (cubeDomain (dilateCube k Q)) b = + kappaCoarse (cubeDomain Q) a := by + simp [kappaCoarse, sigmaStarCoarse_dilate hCoeff, + sigmaStarInvKappaCoarse_dilate hCoeff] + +theorem canonicalSigmaCorrectedResponse_dilate {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (p : Vec d) : + canonicalSigmaCorrectedResponse (cubeDomain (dilateCube k Q)) b p = + canonicalSigmaCorrectedResponse (cubeDomain Q) a p := by + simp [canonicalSigmaCorrectedResponse, responseJ_dilate hCoeff, + sigmaStarInvCoarse_dilate hCoeff, kappaCoarse_dilate hCoeff] + +theorem sigmaEntry_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (i j : Fin d) : + sigmaEntry (cubeDomain (dilateCube k Q)) b i j = + sigmaEntry (cubeDomain Q) a i j := by + by_cases hij : i = j + · simp [sigmaEntry, hij, canonicalSigmaCorrectedResponse_dilate hCoeff] + · simp [sigmaEntry, hij, canonicalSigmaCorrectedResponse_dilate hCoeff] + +theorem sigmaCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + sigmaCoarse (cubeDomain (dilateCube k Q)) b = + sigmaCoarse (cubeDomain Q) a := by + ext i j + exact sigmaEntry_dilate hCoeff i j + +theorem coarseMatrices_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + coarseMatrices (cubeDomain (dilateCube k Q)) b = + coarseMatrices (cubeDomain Q) a := by + ext <;> + simp [coarseMatrices, sigmaCoarse_dilate hCoeff, + sigmaStarInvCoarse_dilate hCoeff, kappaCoarse_dilate hCoeff] + +theorem bCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + bCoarse (cubeDomain (dilateCube k Q)) b = + bCoarse (cubeDomain Q) a := by + unfold bCoarse + rw [coarseMatrices_dilate hCoeff] + +theorem aCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + aCoarse (cubeDomain (dilateCube k Q)) b = + aCoarse (cubeDomain Q) a := by + unfold aCoarse + rw [coarseMatrices_dilate hCoeff] + +theorem aStarCoarse_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + aStarCoarse (cubeDomain (dilateCube k Q)) b = + aStarCoarse (cubeDomain Q) a := by + simp [aStarCoarse, sigmaStarCoarse_dilate hCoeff, kappaCoarse_dilate hCoeff] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/DoubledResponse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/DoubledResponse.lean new file mode 100644 index 0000000000..04939671ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/DoubledResponse.lean @@ -0,0 +1,186 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.FieldSpaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block + +/-! # Doubled Response -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public doubled field, represented by potential and flux components. -/ +structure DoubledField (d : ℕ) where + potential : Vec d → Vec d + flux : Vec d → Vec d + +namespace DoubledField + +/-- Evaluate a doubled field as a block vector. -/ +def eval {d : ℕ} (X : DoubledField d) (x : Vec d) : BlockVec d := + (X.potential x, X.flux x) + +/-- A.e. equality of public doubled fields on a Chapter 2 domain. -/ +def SameAE {d : ℕ} {U : Domain d} (X Y : DoubledField d) : Prop := + X.potential =ᵐ[volumeMeasureOn (U : Set (Vec d))] Y.potential ∧ + X.flux =ᵐ[volumeMeasureOn (U : Set (Vec d))] Y.flux + +instance {d : ℕ} : Zero (DoubledField d) where + zero := { potential := 0, flux := 0 } + +instance {d : ℕ} : Add (DoubledField d) where + add X Y := { potential := X.potential + Y.potential, flux := X.flux + Y.flux } + +instance {d : ℕ} : Neg (DoubledField d) where + neg X := { potential := -X.potential, flux := -X.flux } + +instance {d : ℕ} : Sub (DoubledField d) where + sub X Y := { potential := X.potential - Y.potential, flux := X.flux - Y.flux } + +instance {d : ℕ} : SMul ℝ (DoubledField d) where + smul c X := { potential := c • X.potential, flux := c • X.flux } + +@[simp] theorem eval_zero {d : ℕ} (x : Vec d) : + (0 : DoubledField d).eval x = 0 := + rfl + +@[simp] theorem eval_add {d : ℕ} (X Y : DoubledField d) (x : Vec d) : + (X + Y).eval x = X.eval x + Y.eval x := + rfl + +@[simp] theorem eval_neg {d : ℕ} (X : DoubledField d) (x : Vec d) : + (-X).eval x = -X.eval x := + rfl + +@[simp] theorem eval_sub {d : ℕ} (X Y : DoubledField d) (x : Vec d) : + (X - Y).eval x = X.eval x - Y.eval x := + rfl + +@[simp] theorem eval_smul {d : ℕ} (c : ℝ) (X : DoubledField d) (x : Vec d) : + (c • X).eval x = c • X.eval x := + rfl + +end DoubledField + +/-- Public field in `\Lpot(U) × \Lsol(U)`. -/ +def IsDoubledAmbientField {d : ℕ} (U : Domain d) (X : DoubledField d) : Prop := + Book.Ch01.PotentialFieldOn (U : Set (Vec d)) X.potential ∧ + Book.Ch01.SolenoidalFieldOn (U : Set (Vec d)) X.flux + +/-- Public test field in `\Lpoto(U) × \Lsolo(U)`. -/ +def IsDoubledTestField {d : ℕ} (U : Domain d) (X : DoubledField d) : Prop := + Book.Ch01.PotentialZeroTraceFieldOn (U : Set (Vec d)) X.potential ∧ + Book.Ch01.SolenoidalZeroNormalTraceFieldOn (U : Set (Vec d)) X.flux + +/-- Block pairing integrand `Y · A X` for doubled fields. -/ +noncomputable def doubledBlockPairingIntegrand {d : ℕ} (U : Domain d) + (a : CoeffOn U) (Y X : DoubledField d) : Vec d → ℝ := + fun x => blockVecDot (Y.eval x) (blockMatVecMul (blockMatrixField a x) (X.eval x)) + +/-- Public doubled response space `S(U; a)`. -/ +def IsDoubledResponseField {d : ℕ} (U : Domain d) (a : CoeffOn U) + (X : DoubledField d) : Prop := + IsDoubledAmbientField U X ∧ + ∀ Y : DoubledField d, IsDoubledTestField U Y → + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume = 0 + +/-- Public admissibility for the doubled `mu` problem: +`X ∈ P + Lpoto(U) × Lsolo(U)`. -/ +def IsDoubledMuAdmissible {d : ℕ} (U : Domain d) (P : BlockVec d) + (X : DoubledField d) : Prop := + Book.Ch01.PotentialZeroTraceFieldOn (U : Set (Vec d)) + (fun x => X.potential x - P.1) ∧ + Book.Ch01.SolenoidalZeroNormalTraceFieldOn (U : Set (Vec d)) + (fun x => X.flux x - P.2) + +/-- Public doubled `mu` energy value of an admissible field. -/ +noncomputable def doubledMuValue {d : ℕ} (U : Domain d) (a : CoeffOn U) + (X : DoubledField d) : ℝ := + average U fun x => blockEnergyDensityAt a (X.eval x) x + +/-- Public value set whose infimum is `mu(U,P;a)`. -/ +noncomputable def doubledMuValueSet {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P : BlockVec d) : Set ℝ := + {m | ∃ X : DoubledField d, IsDoubledMuAdmissible U P X ∧ + m = doubledMuValue U a X} + +/-- Public doubled variational quantity `mu(U,P;a)`. -/ +noncomputable def doubledMu {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P : BlockVec d) : ℝ := + sInf (doubledMuValueSet U a P) + +/-- A public minimizer for `mu(U,P;a)`. -/ +def IsDoubledMuMinimizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P : BlockVec d) (X : DoubledField d) : Prop := + IsDoubledMuAdmissible U P X ∧ + ∀ Y : DoubledField d, IsDoubledMuAdmissible U P Y → + doubledMuValue U a X ≤ doubledMuValue U a Y + +/-- Public doubled response integrand from `e.def.block.J.basic.definitions`. -/ +noncomputable def doubledResponseIntegrand {d : ℕ} (U : Domain d) + (a : CoeffOn U) (P Q : BlockVec d) (X : DoubledField d) : Vec d → ℝ := + fun x => + -blockEnergyDensityAt a (X.eval x) x + - blockVecDot P (blockMatVecMul (blockMatrixField a x) (X.eval x)) + + blockVecDot Q (X.eval x) + +/-- Public doubled response value of one field. -/ +noncomputable def doubledResponseValue {d : ℕ} (U : Domain d) + (a : CoeffOn U) (P Q : BlockVec d) (X : DoubledField d) : ℝ := + average U (doubledResponseIntegrand U a P Q X) + +/-- Public value set whose supremum is `Jbold(U,P,Q;a)`. -/ +noncomputable def doubledResponseValueSet {d : ℕ} (U : Domain d) + (a : CoeffOn U) (P Q : BlockVec d) : Set ℝ := + {m | ∃ X : DoubledField d, IsDoubledResponseField U a X ∧ + m = doubledResponseValue U a P Q X} + +/-- Public doubled response functional `Jbold(U,P,Q;a)`. -/ +noncomputable def doubledResponseJ {d : ℕ} (U : Domain d) + (a : CoeffOn U) (P Q : BlockVec d) : ℝ := + sSup (doubledResponseValueSet U a P Q) + +/-- A public maximizer for the doubled response functional. -/ +def IsDoubledResponseMaximizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P Q : BlockVec d) (X : DoubledField d) : Prop := + IsDoubledResponseField U a X ∧ + ∀ Y : DoubledField d, IsDoubledResponseField U a Y → + doubledResponseValue U a P Q Y ≤ doubledResponseValue U a P Q X + +/-- Public existence statement for doubled response maximizers. -/ +def DoubledResponseMaximizerExists {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P Q : BlockVec d) : Prop := + ∃ X : DoubledField d, IsDoubledResponseMaximizer U a P Q X + +/-- Public doubled field generated by a primal and adjoint solution. -/ +noncomputable def doubledFieldOfSolutions {d : ℕ} {U : Domain d} + (a : CoeffOn U) (v : Solution U a) (vStar : Solution U a.transpose) : + DoubledField d := + { potential := fun x => v.toH1.grad x + vStar.toH1.grad x + flux := fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x) } + +/-- Public doubled maximizer candidate generated by the scalar maximizers in +`e.block.maximizer.by.v.vstar.basic.definitions`. -/ +noncomputable def doubledFieldOfScalarMaximizers {d : ℕ} {U : Domain d} + (a : CoeffOn U) (v : Solution U a) (vStar : Solution U a.transpose) : + DoubledField d := + (1 / 2 : ℝ) • doubledFieldOfSolutions a v vStar + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/HomogenizationError.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/HomogenizationError.lean new file mode 100644 index 0000000000..5ec6ea9b32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/HomogenizationError.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import Mathlib.Analysis.Matrix.Order + +/-! # Homogenization Error -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Public multiscale homogenization error + +This file records the Chapter 2 note-facing quantity +`\mathcal E_{s,p,q}` using the public `TriadicCoeffFamily` interface. In +particular the heterogeneous coefficient is a.e.-elliptic on every open cube, +not pointwise elliptic. +-/ + +noncomputable section + +/-- Euclidean squared norm on doubled vectors in the full `2d` indexing. -/ +def fullBlockVecNormSq {d : ℕ} (x : FullBlockVec d) : ℝ := + ∑ i, x i ^ 2 + +/-- Average of a real-valued function over a finite set. -/ +noncomputable def finsetAverageReal {α : Type*} (s : Finset α) (f : α → ℝ) : ℝ := + ((s.card : ℝ)⁻¹) * s.sum f + +/-- Constant block matrix associated with a constant coefficient matrix `a0`. -/ +noncomputable def constantBlockMatrix {d : ℕ} (a0 : Mat d) : BlockMat d := + let sigma0 := symmPart a0 + let kappa0 := skewPart a0 + let sigma0Inv := sigma0⁻¹ + { upperLeft := sigma0 + matTranspose kappa0 * sigma0Inv * kappa0 + upperRight := -(matTranspose kappa0 * sigma0Inv) + lowerLeft := -(sigma0Inv * kappa0) + lowerRight := sigma0Inv } + +/-- Constant block matrix in full `2d × 2d` matrix coordinates. -/ +noncomputable def constantFullBlockMatrix {d : ℕ} [NeZero d] (a0 : Mat d) : + FullBlockMat d := + toFullBlockMat (constantBlockMatrix a0) + +/-- Positive square root used in the normalization of `\mathcal E`. -/ +noncomputable def constantFullBlockMatrixSqrt {d : ℕ} [NeZero d] (a0 : Mat d) : + FullBlockMat d := + CFC.sqrt (constantFullBlockMatrix a0) + +/-- Inverse positive square root used in the normalization of `\mathcal E`. -/ +noncomputable def constantFullBlockMatrixInvSqrt {d : ℕ} [NeZero d] (a0 : Mat d) : + FullBlockMat d := + (constantFullBlockMatrixSqrt a0)⁻¹ + +/-- The normalized block-response value set +`max_{|e|=1} J(Q, A0^{-1/2} e, A0^{1/2} e; a)`. -/ +noncomputable def normalizedBlockResponseValueSet {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : Set ℝ := + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + m = + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) } + +/-- The one-cube normalized block-response maximum. -/ +noncomputable def normalizedBlockResponseMax {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + sSup (normalizedBlockResponseValueSet Q a a0) + +/-- Maximum normalized block response over descendants of `Q` at scale `k`. -/ +noncomputable def maxDescendantNormalizedBlockResponseAtScale {d : ℕ} [NeZero d] + (Q : TriadicCube d) (k : ℤ) (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + finsetSupReal (descendantsAtScale Q k) fun R => normalizedBlockResponseMax R a a0 + +/-- The `p`-aggregation over descendants at one scale in the definition of +`\mathcal E_{s,p,q}`. -/ +noncomputable def scaleResponseAtScale {d : ℕ} [NeZero d] + (Q : TriadicCube d) (k : ℤ) (p : MultiscaleExponent) + (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + match p with + | .finite p => + Real.rpow + (finsetAverageReal (descendantsAtScale Q k) + (fun R => Real.rpow (normalizedBlockResponseMax R a a0) (p / 2))) + (1 / p) + | .infinity => + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q k a a0) (1 / 2) + +/-- Finite-`q` multiscale homogenization error. -/ +noncomputable def HomogenizationErrorFinite {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) (q : ℝ) + (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + Real.rpow + (∑' l : ℕ, + geometricWeight s q l * + Real.rpow (scaleResponseAtScale Q (n - (l : ℤ)) p a a0) q) + (1 / q) + +/-- Endpoint-`q` multiscale homogenization error. -/ +noncomputable def HomogenizationErrorInfinity {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) + (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + sSup + { m | ∃ l : ℕ, + m = + Real.rpow (3 : ℝ) (-s * (l : ℝ)) * + scaleResponseAtScale Q (n - (l : ℤ)) p a a0 } + +/-- Multiscale homogenization error for finite `q` and `q = infinity`. -/ +noncomputable def HomogenizationError {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p q : MultiscaleExponent) + (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + match q with + | .finite q => HomogenizationErrorFinite Q n s p q a a0 + | .infinity => HomogenizationErrorInfinity Q n s p a a0 + +/-- The untruncated cube quantity `\mathcal E_{s,p,q}(Q; a, a0)`, where the +truncation scale is the scale of `Q`. -/ +noncomputable def HomogenizationErrorOnCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s : ℝ) (p q : MultiscaleExponent) + (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + HomogenizationError Q Q.scale s p q a a0 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Interfaces.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Interfaces.lean new file mode 100644 index 0000000000..4d2c58ccfe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Interfaces.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems + +/-! # Interfaces -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Matrices.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Matrices.lean new file mode 100644 index 0000000000..eaab5a3599 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Matrices.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Response + +/-! # Matrices -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public normalized matrix average over a Chapter 2 domain. -/ +noncomputable def averageMat {d : ℕ} (U : Domain d) (A : Vec d → Mat d) : Mat d := + fun i j => average U (fun x => A x i j) + +/-- The note-facing harmonic-mean matrix +`\fint_U symmPart(a)^{-1}`. -/ +noncomputable def averagedSymmPartInv {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + averageMat U fun x => (symmPart (a.toCoeffField x))⁻¹ + +/-- The note-facing upper coefficient average +`\fint_U (symmPart(a) + skewPart(a)^t symmPart(a)^{-1} skewPart(a))`. -/ +noncomputable def averagedSymmPartPlusCorrection {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Mat d := + averageMat U fun x => + symmPart (a.toCoeffField x) + + matTranspose (skewPart (a.toCoeffField x)) * + (symmPart (a.toCoeffField x))⁻¹ * skewPart (a.toCoeffField x) + +/-- The harmonic-mean matrix depends only on the coefficient field up to a.e. +equality on the domain. -/ +theorem averagedSymmPartInv_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + averagedSymmPartInv U a = averagedSymmPartInv U b := by + ext i j + unfold averagedSymmPartInv averageMat average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +/-- The upper coefficient average depends only on the coefficient field up to +a.e. equality on the domain. -/ +theorem averagedSymmPartPlusCorrection_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) : + averagedSymmPartPlusCorrection U a = averagedSymmPartPlusCorrection U b := by + ext i j + unfold averagedSymmPartPlusCorrection averageMat average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +/-- The coarse-grained response matrices extracted from the quadratic response +functional. We keep `sigmaStarInv` primitive at this stage; constructing +`sigmaStar` itself belongs to the later positivity/invertibility theorem. -/ +structure CoarseMatrices (d : ℕ) where + sigma : Mat d + sigmaStarInv : Mat d + kappa : Mat d + +namespace CoarseMatrices + +/-- The derived coarse matrix `sigmaStar = sigmaStarInv^{-1}`. -/ +def sigmaStar {d : ℕ} (M : CoarseMatrices d) : Mat d := + M.sigmaStarInv⁻¹ + +/-- The derived coarse matrix `b = sigma + kappa^t sigmaStarInv kappa`. -/ +def b {d : ℕ} (M : CoarseMatrices d) : Mat d := + M.sigma + matTranspose M.kappa * M.sigmaStarInv * M.kappa + +/-- The derived coarse coefficient matrix `a = sigma - kappa^t`. -/ +def coeff {d : ℕ} (M : CoarseMatrices d) : Mat d := + M.sigma - matTranspose M.kappa + +@[ext] theorem ext {d : ℕ} {M N : CoarseMatrices d} + (hsigma : M.sigma = N.sigma) + (hsigmaStarInv : M.sigmaStarInv = N.sigmaStarInv) + (hkappa : M.kappa = N.kappa) : + M = N := by + cases M + cases N + simp_all + +end CoarseMatrices + +/-- The mixed response appearing in the definition of the coarse skew matrix. -/ +noncomputable def mixedResponse {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : ℝ := + responseJ U a p q - responseJ U a p 0 - responseJ U a 0 q + vecDot p q + +/-- Entry formula for the canonical coarse matrix `sigmaStarInv`. + +The diagonal entries are extracted from the pure `q` response, while the +off-diagonal entries use the usual polarization identity. -/ +noncomputable def sigmaStarInvEntry {d : ℕ} (U : Domain d) (a : CoeffOn U) + (i j : Fin d) : ℝ := + if _h : i = j then + 2 * responseJ U a (0 : Vec d) (Pi.single i 1) + else + responseJ U a (0 : Vec d) (Pi.single i 1 + Pi.single j 1) + - responseJ U a (0 : Vec d) (Pi.single i 1) + - responseJ U a (0 : Vec d) (Pi.single j 1) + +/-- The entry formula for `sigmaStarInv` is symmetric by construction. -/ +theorem sigmaStarInvEntry_comm {d : ℕ} (U : Domain d) (a : CoeffOn U) + (i j : Fin d) : + sigmaStarInvEntry U a i j = sigmaStarInvEntry U a j i := by + by_cases hij : i = j + · subst j + rfl + · have hji : j ≠ i := fun h => hij h.symm + have hsum : + (Pi.single j (1 : ℝ) : Vec d) + Pi.single i (1 : ℝ) = + Pi.single i (1 : ℝ) + Pi.single j (1 : ℝ) := by + ext k + simp [add_comm] + simp [sigmaStarInvEntry, hij, hji, hsum] + ring + +/-- The entry formula for `sigmaStarInv` depends only on the coefficient field +up to a.e. equality on the domain. -/ +theorem sigmaStarInvEntry_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (i j : Fin d) : + sigmaStarInvEntry U a i j = sigmaStarInvEntry U b i j := by + by_cases hij : i = j + · simp [sigmaStarInvEntry, hij, responseJ_eq_ofAEEq h] + · simp [sigmaStarInvEntry, hij, responseJ_eq_ofAEEq h] + +/-- The canonical coarse matrix `sigmaStarInv(U; a)` extracted from `J(U,0,q;a)`. -/ +noncomputable def sigmaStarInvCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + fun i j => sigmaStarInvEntry U a i j + +/-- The canonical matrix `sigmaStarInv(U; a)` is symmetric by polarization. -/ +theorem sigmaStarInvCoarse_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (sigmaStarInvCoarse U a).IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + exact sigmaStarInvEntry_comm U a j i + +/-- The canonical matrix `sigmaStarInv(U; a)` is invariant under a.e. changes +of coefficient representative. -/ +theorem sigmaStarInvCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + sigmaStarInvCoarse U a = sigmaStarInvCoarse U b := by + ext i j + exact sigmaStarInvEntry_eq_ofAEEq h i j + +/-- The canonical coarse matrix `sigmaStar(U; a)`, represented as the +nonsingular-inverse expression of `sigmaStarInv(U; a)`. The later positivity +theory proves that this is the genuine inverse in the note-facing cases. -/ +noncomputable def sigmaStarCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + (sigmaStarInvCoarse U a)⁻¹ + +/-- The canonical matrix `sigmaStar(U; a)` is invariant under a.e. changes of +coefficient representative. -/ +theorem sigmaStarCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + sigmaStarCoarse U a = sigmaStarCoarse U b := by + simp [sigmaStarCoarse, sigmaStarInvCoarse_eq_ofAEEq h] + +/-- The canonical matrix `sigmaStar(U; a)` is symmetric. -/ +theorem sigmaStarCoarse_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (sigmaStarCoarse U a).IsSymm := by + unfold sigmaStarCoarse + exact isSymm_nonsingInv (sigmaStarInvCoarse_isSymm U a) + +/-- The mixed response depends only on the coefficient field up to a.e. equality +on the domain. -/ +theorem mixedResponse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) : + mixedResponse U a p q = mixedResponse U b p q := by + simp [mixedResponse, responseJ_eq_ofAEEq h] + +/-- The canonical mixed matrix `sigmaStarInv(U; a) * kappa(U; a)`, extracted +directly from the mixed response. -/ +noncomputable def sigmaStarInvKappaCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + fun i j => mixedResponse U a (Pi.single j 1) (Pi.single i 1) + +/-- The canonical mixed matrix is invariant under a.e. changes of coefficient +representative. -/ +theorem sigmaStarInvKappaCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) : + sigmaStarInvKappaCoarse U a = sigmaStarInvKappaCoarse U b := by + ext i j + exact mixedResponse_eq_ofAEEq h (Pi.single j 1) (Pi.single i 1) + +/-- The canonical coupling matrix `kappa(U; a)`. -/ +noncomputable def kappaCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + sigmaStarCoarse U a * sigmaStarInvKappaCoarse U a + +/-- The canonical coupling matrix is invariant under a.e. changes of +coefficient representative. -/ +theorem kappaCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + kappaCoarse U a = kappaCoarse U b := by + simp [kappaCoarse, sigmaStarCoarse_eq_ofAEEq h, + sigmaStarInvKappaCoarse_eq_ofAEEq h] + +/-- Under nondegeneracy, `sigmaStar(U; a)` is the right inverse of +`sigmaStarInv(U; a)`. -/ +theorem sigmaStarInvCoarse_mul_sigmaStarCoarse {d : ℕ} {U : Domain d} + {a : CoeffOn U} (hdet : IsUnit (sigmaStarInvCoarse U a).det) : + sigmaStarInvCoarse U a * sigmaStarCoarse U a = 1 := by + simpa [sigmaStarCoarse] using Matrix.mul_nonsing_inv (sigmaStarInvCoarse U a) hdet + +/-- Under nondegeneracy, `sigmaStar(U; a)` is the left inverse of +`sigmaStarInv(U; a)`. -/ +theorem sigmaStarCoarse_mul_sigmaStarInvCoarse {d : ℕ} {U : Domain d} + {a : CoeffOn U} (hdet : IsUnit (sigmaStarInvCoarse U a).det) : + sigmaStarCoarse U a * sigmaStarInvCoarse U a = 1 := by + simpa [sigmaStarCoarse] using Matrix.nonsing_inv_mul (sigmaStarInvCoarse U a) hdet + +/-- Under nondegeneracy, the canonical `kappa` definition really solves +`sigmaStarInv * kappa = sigmaStarInvKappa`. -/ +theorem sigmaStarInvCoarse_mul_kappaCoarse_eq_sigmaStarInvKappaCoarse + {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hdet : IsUnit (sigmaStarInvCoarse U a).det) : + sigmaStarInvCoarse U a * kappaCoarse U a = + sigmaStarInvKappaCoarse U a := by + unfold kappaCoarse sigmaStarCoarse + simpa [Matrix.mul_assoc] using + Matrix.mul_nonsing_inv_cancel_left + (A := sigmaStarInvCoarse U a) (sigmaStarInvKappaCoarse U a) hdet + +/-- Vector form of +`sigmaStarInvCoarse_mul_kappaCoarse_eq_sigmaStarInvKappaCoarse`. -/ +theorem matVecMul_sigmaStarInvCoarse_kappaCoarse + {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hdet : IsUnit (sigmaStarInvCoarse U a).det) (p : Vec d) : + matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p) = + matVecMul (sigmaStarInvKappaCoarse U a) p := by + rw [matVecMul_mul, sigmaStarInvCoarse_mul_kappaCoarse_eq_sigmaStarInvKappaCoarse hdet] + +/-- The canonical corrected `p`-response whose quadratic form defines +`sigma(U; a)`. -/ +noncomputable def canonicalSigmaCorrectedResponse {d : ℕ} (U : Domain d) + (a : CoeffOn U) (p : Vec d) : ℝ := + responseJ U a p 0 - + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p))) + +/-- The canonical corrected response is invariant under a.e. changes of +coefficient representative. -/ +theorem canonicalSigmaCorrectedResponse_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (p : Vec d) : + canonicalSigmaCorrectedResponse U a p = + canonicalSigmaCorrectedResponse U b p := by + simp [canonicalSigmaCorrectedResponse, responseJ_eq_ofAEEq h, + sigmaStarInvCoarse_eq_ofAEEq h, kappaCoarse_eq_ofAEEq h] + +/-- Entry formula for the canonical coarse matrix `sigma`. + +As for `sigmaStarInv`, the diagonal entries come from the quadratic values and +the off-diagonal entries from polarization. -/ +noncomputable def sigmaEntry {d : ℕ} (U : Domain d) (a : CoeffOn U) + (i j : Fin d) : ℝ := + if _h : i = j then + 2 * canonicalSigmaCorrectedResponse U a (Pi.single i 1) + else + canonicalSigmaCorrectedResponse U a (Pi.single i 1 + Pi.single j 1) + - canonicalSigmaCorrectedResponse U a (Pi.single i 1) + - canonicalSigmaCorrectedResponse U a (Pi.single j 1) + +/-- The entry formula for `sigma` is symmetric by construction. -/ +theorem sigmaEntry_comm {d : ℕ} (U : Domain d) (a : CoeffOn U) + (i j : Fin d) : + sigmaEntry U a i j = sigmaEntry U a j i := by + by_cases hij : i = j + · subst j + rfl + · have hji : j ≠ i := fun h => hij h.symm + have hsum : + (Pi.single j (1 : ℝ) : Vec d) + Pi.single i (1 : ℝ) = + Pi.single i (1 : ℝ) + Pi.single j (1 : ℝ) := by + ext k + simp [add_comm] + simp [sigmaEntry, hij, hji, hsum] + ring + +/-- The entry formula for `sigma` depends only on the coefficient field up to +a.e. equality on the domain. -/ +theorem sigmaEntry_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (i j : Fin d) : + sigmaEntry U a i j = sigmaEntry U b i j := by + by_cases hij : i = j + · simp [sigmaEntry, hij, canonicalSigmaCorrectedResponse_eq_ofAEEq h] + · simp [sigmaEntry, hij, canonicalSigmaCorrectedResponse_eq_ofAEEq h] + +/-- The canonical coarse matrix `sigma(U; a)`. -/ +noncomputable def sigmaCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Mat d := + fun i j => sigmaEntry U a i j + +/-- The canonical matrix `sigma(U; a)` is symmetric by polarization. -/ +theorem sigmaCoarse_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (sigmaCoarse U a).IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + exact sigmaEntry_comm U a j i + +/-- The canonical matrix `sigma(U; a)` is invariant under a.e. changes of +coefficient representative. -/ +theorem sigmaCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + sigmaCoarse U a = sigmaCoarse U b := by + ext i j + exact sigmaEntry_eq_ofAEEq h i j + +/-- The canonical package of coarse-grained response matrices. -/ +noncomputable def coarseMatrices {d : ℕ} (U : Domain d) (a : CoeffOn U) : + CoarseMatrices d where + sigma := sigmaCoarse U a + sigmaStarInv := sigmaStarInvCoarse U a + kappa := kappaCoarse U a + +/-- The canonical package of coarse-grained response matrices is invariant under +a.e. changes of coefficient representative. -/ +theorem coarseMatrices_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + coarseMatrices U a = coarseMatrices U b := by + ext <;> + simp [coarseMatrices, sigmaCoarse_eq_ofAEEq h, sigmaStarInvCoarse_eq_ofAEEq h, + kappaCoarse_eq_ofAEEq h] + +/-- The `sigma` component of the canonical matrix package is symmetric. -/ +theorem coarseMatrices_sigma_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).sigma.IsSymm := + sigmaCoarse_isSymm U a + +/-- The `sigmaStarInv` component of the canonical matrix package is symmetric. -/ +theorem coarseMatrices_sigmaStarInv_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).sigmaStarInv.IsSymm := + sigmaStarInvCoarse_isSymm U a + +/-- The corrected `p`-response whose quadratic form defines `sigma`. -/ +noncomputable def sigmaCorrectedResponse {d : ℕ} (U : Domain d) (a : CoeffOn U) + (M : CoarseMatrices d) (p : Vec d) : ℝ := + responseJ U a p 0 - + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose M.kappa) + (matVecMul M.sigmaStarInv (matVecMul M.kappa p))) + +/-- The corrected response for a fixed matrix package depends only on the +coefficient field up to a.e. equality on the domain. -/ +theorem sigmaCorrectedResponse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (M : CoarseMatrices d) (p : Vec d) : + sigmaCorrectedResponse U a M p = sigmaCorrectedResponse U b M p := by + simp [sigmaCorrectedResponse, responseJ_eq_ofAEEq h] + +@[simp] theorem coarseMatrices_sigma {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).sigma = sigmaCoarse U a := + rfl + +@[simp] theorem coarseMatrices_sigmaStarInv {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).sigmaStarInv = sigmaStarInvCoarse U a := + rfl + +@[simp] theorem coarseMatrices_sigmaStar {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).sigmaStar = sigmaStarCoarse U a := + rfl + +@[simp] theorem coarseMatrices_kappa {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (coarseMatrices U a).kappa = kappaCoarse U a := + rfl + +theorem sigmaCorrectedResponse_coarseMatrices {d : ℕ} (U : Domain d) + (a : CoeffOn U) (p : Vec d) : + sigmaCorrectedResponse U a (coarseMatrices U a) p = + canonicalSigmaCorrectedResponse U a p := + rfl + +/-- Canonical derived coarse matrix +`b(U; a) = sigma + kappa^t sigmaStarInv kappa`. -/ +noncomputable def bCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : Mat d := + (coarseMatrices U a).b + +/-- Canonical derived coarse coefficient matrix `a(U; a) = sigma - kappa^t`. -/ +noncomputable def aCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : Mat d := + (coarseMatrices U a).coeff + +/-- Canonical derived adjoint coarse coefficient matrix. -/ +noncomputable def aStarCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : Mat d := + sigmaStarCoarse U a - matTranspose (kappaCoarse U a) + +/-- The canonical derived matrix `b(U; a)` is invariant under a.e. changes of +coefficient representative. -/ +theorem bCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + bCoarse U a = bCoarse U b := by + unfold bCoarse + rw [coarseMatrices_eq_ofAEEq h] + +/-- The canonical derived matrix `a(U; a)` is invariant under a.e. changes of +coefficient representative. -/ +theorem aCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + aCoarse U a = aCoarse U b := by + unfold aCoarse + rw [coarseMatrices_eq_ofAEEq h] + +/-- The canonical derived matrix `aStar(U; a)` is invariant under a.e. changes +of coefficient representative. -/ +theorem aStarCoarse_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + aStarCoarse U a = aStarCoarse U b := by + simp [aStarCoarse, sigmaStarCoarse_eq_ofAEEq h, kappaCoarse_eq_ofAEEq h] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/MultiscaleEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/MultiscaleEllipticity.lean new file mode 100644 index 0000000000..089695dc2c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/MultiscaleEllipticity.lean @@ -0,0 +1,297 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import Mathlib.Analysis.CStarAlgebra.Matrix +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Topology.Algebra.InfiniteSum.Real + +/-! # Multiscale Ellipticity -/ + +@[expose] public section + +open scoped BigOperators + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Chapter 2.5 Multiscale Ellipticity Constants + +This file locks the public definitions from Section 2.5 of the notes. The +multiscale quantities are deliberately built from the Chapter 2 `CoeffOn` +interface on open cube domains, and the compatibility of a coefficient field +across nested cubes is recorded almost everywhere. +-/ + +noncomputable section + +/-- The open realization of a triadic cube is a nonempty public Chapter 2 +domain. -/ +theorem openCubeSet_nonempty {d : ℕ} (Q : TriadicCube d) : + (openCubeSet Q).Nonempty := by + refine ⟨cubeCenter Q, ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa using Metric.mem_ball_self (x := cubeCenter Q) (cubeRadius_pos Q) + +/-- The public Chapter 2 domain associated with an open triadic cube. -/ +noncomputable def cubeDomain {d : ℕ} (Q : TriadicCube d) : Domain d where + carrier := openCubeSet Q + isDomain := isOpenBoundedConvexDomain_openCubeSet Q + nonempty := openCubeSet_nonempty Q + +@[simp] theorem cubeDomain_coe {d : ℕ} (Q : TriadicCube d) : + ((cubeDomain Q : Domain d) : Set (Vec d)) = openCubeSet Q := + rfl + +/-- A coefficient field on the triadic cube hierarchy. + +For each open triadic cube it provides a `CoeffOn` object, hence ellipticity and +measurability are a.e. on that cube. The `restrictsTo_of_subset` field says +that the representatives are compatible across nested cubes only modulo null +sets; this is the public replacement for old representative-level cube +restrictions. -/ +structure TriadicCoeffFamily (d : ℕ) where + coeffOn : (Q : TriadicCube d) → CoeffOn (cubeDomain Q) + restrictsTo_of_subset : + ∀ {Q R : TriadicCube d}, openCubeSet R ⊆ openCubeSet Q → + CoeffOn.RestrictsTo (coeffOn Q) (coeffOn R) + +namespace TriadicCoeffFamily + +/-- Two triadic coefficient families are equal when their cube representatives +agree a.e. on every open triadic cube. -/ +def AEEq {d : ℕ} (a b : TriadicCoeffFamily d) : Prop := + ∀ Q : TriadicCube d, CoeffOn.AEEq (a.coeffOn Q) (b.coeffOn Q) + +theorem restrictsTo_self {d : ℕ} (a : TriadicCoeffFamily d) (Q : TriadicCube d) : + CoeffOn.RestrictsTo (a.coeffOn Q) (a.coeffOn Q) := + a.restrictsTo_of_subset Set.Subset.rfl + +/-- Compatibility of a triadic coefficient family with a descendant cube, +expressed a.e. on the descendant open cube. -/ +theorem restrictsTo_descendant {d : ℕ} (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + CoeffOn.RestrictsTo (a.coeffOn Q) (a.coeffOn R) := by + refine a.restrictsTo_of_subset ?_ + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact openCubeSet_subset_of_mem_descendantsAtDepth hR + +namespace AEEq + +theorem refl {d : ℕ} (a : TriadicCoeffFamily d) : AEEq a a := + fun Q => CoeffOn.AEEq.refl (a.coeffOn Q) + +theorem symm {d : ℕ} {a b : TriadicCoeffFamily d} (h : AEEq a b) : + AEEq b a := + fun Q => (h Q).symm + +theorem trans {d : ℕ} {a b c : TriadicCoeffFamily d} + (hab : AEEq a b) (hbc : AEEq b c) : AEEq a c := + fun Q => (hab Q).trans (hbc Q) + +end AEEq + +end TriadicCoeffFamily + +/-- Exponents used in the multiscale ellipticity constants: finite `q` and the +endpoint `q = infinity`. -/ +inductive MultiscaleExponent where + | finite (value : ℝ) + | infinity +deriving DecidableEq + +namespace MultiscaleExponent + +/-- Admissible exponents in the public Sec. 2.5 definitions: finite `q ≥ 1` +or the endpoint `q = infinity`. -/ +def IsAdmissible : MultiscaleExponent → Prop + | .finite q => 1 ≤ q + | .infinity => True + +@[simp] theorem isAdmissible_finite {q : ℝ} : + IsAdmissible (.finite q) ↔ 1 ≤ q := + Iff.rfl + +@[simp] theorem isAdmissible_infinity : + IsAdmissible .infinity := + trivial + +end MultiscaleExponent + +/-- Legacy Frobenius-style squared matrix norm retained for compatibility with +older deterministic infrastructure. -/ +def matrixNormSq {d : ℕ} (A : Mat d) : ℝ := + ∑ i, ∑ j, A i j ^ 2 + +/-- Euclidean/L2 operator norm used for `|b|` and `|sigma_*^{-1}|` in the +public Sec. 2.5 definitions. -/ +noncomputable def matrixNorm {d : ℕ} (A : Mat d) : ℝ := + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A‖ + +/-- Supremum of a real-valued function over a finite set. + +The old deterministic files use the same `sSup` convention, which leaves the +definition total even when the finite set is empty. -/ +noncomputable def finsetSupReal {α : Type*} (s : Finset α) (f : α → ℝ) : ℝ := + sSup (f '' (↑s : Set α)) + +/-- The scale factor `3^{2s(m-k)}` appearing in one-cube descendant bounds. -/ +noncomputable def multiscaleDescendantWeight {d : ℕ} (Q : TriadicCube d) + (k : ℤ) (s : ℝ) : ℝ := + Real.rpow (3 : ℝ) (2 * s * (((Q.scale - k : ℤ) : ℝ))) + +/-- One-cube norm `|b(Q; a)|`, where `b` is the canonical public coarse matrix +on the open cube. -/ +noncomputable def coarseBMatrixNorm {d : ℕ} (Q : TriadicCube d) + (a : TriadicCoeffFamily d) : ℝ := + matrixNorm (bCoarse (cubeDomain Q) (a.coeffOn Q)) + +/-- One-cube norm `|sigma_*^{-1}(Q; a)|`, where `sigma_*^{-1}` is the canonical +public coarse matrix on the open cube. -/ +noncomputable def coarseSigmaStarInvMatrixNorm {d : ℕ} (Q : TriadicCube d) + (a : TriadicCoeffFamily d) : ℝ := + matrixNorm (sigmaStarInvCoarse (cubeDomain Q) (a.coeffOn Q)) + +/-- The maximum of `|b(R; a)|` over descendants of `Q` at scale `k`. -/ +noncomputable def maxDescendantBMatrixNormAtScale {d : ℕ} (Q : TriadicCube d) + (k : ℤ) (a : TriadicCoeffFamily d) : ℝ := + finsetSupReal (descendantsAtScale Q k) fun R => coarseBMatrixNorm R a + +/-- The maximum of `|sigma_*^{-1}(R; a)|` over descendants of `Q` at scale +`k`. -/ +noncomputable def maxDescendantSigmaStarInvMatrixNormAtScale {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (a : TriadicCoeffFamily d) : ℝ := + finsetSupReal (descendantsAtScale Q k) fun R => + coarseSigmaStarInvMatrixNorm R a + +/-- Geometric normalization `c_{s,q} = 1 - 3^{-s q}` for finite exponents. -/ +noncomputable def geometricDiscount (s q : ℝ) : ℝ := + 1 - Real.rpow (3 : ℝ) (-s * q) + +/-- The finite-exponent geometric weight +`c_{s,q} 3^{-s q n}`. -/ +noncomputable def geometricWeight (s q : ℝ) (n : ℕ) : ℝ := + geometricDiscount s q * Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) + +/-- Finite-exponent coarse-grained upper ellipticity +`\Lambda_{s,q}(Q; a)`. -/ +noncomputable def LambdaSqFinite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) + (2 / q) + +/-- Finite-exponent coarse-grained lower ellipticity +`\lambda_{s,q}(Q; a)`. -/ +noncomputable def lambdaSqFinite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) + (-(2 / q)) + +/-- Endpoint coarse-grained upper ellipticity +`\Lambda_{s,\infty}(Q; a)`. -/ +noncomputable def LambdaSqInfinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } + +/-- Endpoint coarse-grained lower ellipticity +`\lambda_{s,\infty}(Q; a)`. -/ +noncomputable def lambdaSqInfinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + (sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a })⁻¹ + +/-- Coarse-grained upper ellipticity for finite `q` and `q = infinity`. -/ +noncomputable def LambdaSq {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) (a : TriadicCoeffFamily d) : ℝ := + match q with + | .finite q => LambdaSqFinite Q s q a + | .infinity => LambdaSqInfinity Q s a + +/-- Coarse-grained lower ellipticity for finite `q` and `q = infinity`. -/ +noncomputable def lambdaSq {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) (a : TriadicCoeffFamily d) : ℝ := + match q with + | .finite q => lambdaSqFinite Q s q a + | .infinity => lambdaSqInfinity Q s a + +@[simp] theorem LambdaSq_finite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : TriadicCoeffFamily d) : + LambdaSq Q s (.finite q) a = LambdaSqFinite Q s q a := + rfl + +@[simp] theorem LambdaSq_infinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : + LambdaSq Q s .infinity a = LambdaSqInfinity Q s a := + rfl + +@[simp] theorem lambdaSq_finite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : TriadicCoeffFamily d) : + lambdaSq Q s (.finite q) a = lambdaSqFinite Q s q a := + rfl + +@[simp] theorem lambdaSq_infinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : + lambdaSq Q s .infinity a = lambdaSqInfinity Q s a := + rfl + +/-- The maximum of `\Lambda_{s,q}(R; a)` over descendants of `Q` at scale +`k`. -/ +noncomputable def maxDescendantUpperEllipticityAtScale {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (s : ℝ) (q : MultiscaleExponent) + (a : TriadicCoeffFamily d) : ℝ := + finsetSupReal (descendantsAtScale Q k) fun R => LambdaSq R s q a + +/-- The maximum of `\lambda_{s,q}(R; a)^{-1}` over descendants of `Q` at scale +`k`. -/ +noncomputable def maxDescendantLowerEllipticityInvAtScale {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (s : ℝ) (q : MultiscaleExponent) + (a : TriadicCoeffFamily d) : ℝ := + finsetSupReal (descendantsAtScale Q k) fun R => (lambdaSq R s q a)⁻¹ + +/-- The default finite-exponent convention `q = 1` for `\Lambda_s`. -/ +noncomputable def LambdaS {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + LambdaSq Q s (.finite 1) a + +/-- The default finite-exponent convention `q = 1` for `\lambda_s`. -/ +noncomputable def lambdaS {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + lambdaSq Q s (.finite 1) a + +/-- Coarse-grained ellipticity ratio +`\Theta_{s,t}(Q; a) = \Lambda_{s,1}(Q; a) / \lambda_{t,1}(Q; a)`. -/ +noncomputable def ThetaRatio {d : ℕ} (Q : TriadicCube d) (s t : ℝ) + (a : TriadicCoeffFamily d) : ℝ := + LambdaS Q s a / lambdaS Q t a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/ParentTruncatedHomogenizationError.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/ParentTruncatedHomogenizationError.lean new file mode 100644 index 0000000000..9c5fa15084 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/ParentTruncatedHomogenizationError.lean @@ -0,0 +1,427 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.CoeffRestriction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 + +/-! # Parent Truncated Homogenization Error -/ + +@[expose] public section + +open scoped BigOperators ENNReal MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book.Ch02 + +noncomputable section + +private noncomputable def normalizedBlockResponseESetOnCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : Set ℝ≥0∞ := + {y | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + y = ENNReal.ofReal + (doubledResponseJ (cubeDomain Q) a + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)))} + +private noncomputable def normalizedBlockResponseEMaxOnCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : ℝ≥0∞ := + sSup (normalizedBlockResponseESetOnCube Q a a0) + +private noncomputable def parentMaxNormalizedBlockResponseAtScale {d : ℕ} + [NeZero d] (Q : TriadicCube d) (k : ℤ) (hk : k ≤ Q.scale) + (a : CoeffOn (cubeDomain Q)) (a0 : Mat d) : ℝ≥0∞ := by + classical + exact (descendantsAtScale Q k).attach.sup fun R => + normalizedBlockResponseEMaxOnCube R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk R.2)) a0 + +private noncomputable def homogenizationErrorGeometricEWeight + (s q : ℝ) (j : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (1 - Real.rpow 3 (-s * q)) * + ENNReal.ofReal (Real.rpow 3 (-s * q * (j : ℝ))) + +private noncomputable def parentTruncatedHomogenizationErrorInfinityFinite + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) + (hn : n ≤ Q.scale) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) (s q : ℝ) : ℝ≥0∞ := + (∑' j : ℕ, + homogenizationErrorGeometricEWeight s q j * + (parentMaxNormalizedBlockResponseAtScale Q + (n - (j : ℤ)) (by omega) a a0) ^ (q / 2)) ^ (1 / q) + +/-- The source-order, scalar-comparator, `q = 1` truncated response error. + +At each physical scale it maximizes over descendants of the one parent +coefficient, and only then performs the weighted scale sum. -/ +noncomputable def parentTruncatedHomogenizationErrorInfinityOneScalar + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) + (hn : n ≤ Q.scale) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (_hsigma0 : 0 < sigma0) + (s : FractionalOrder) : ℝ≥0∞ := + parentTruncatedHomogenizationErrorInfinityFinite Q n hn a + (scalarMatrix (d := d) sigma0) s.1 1 + +/-- The source-order, scalar-comparator, `q = 2` truncated response error. -/ +noncomputable def parentTruncatedHomogenizationErrorInfinityTwoScalar + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) + (hn : n ≤ Q.scale) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (_hsigma0 : 0 < sigma0) + (s : FractionalOrder) : ℝ≥0∞ := + parentTruncatedHomogenizationErrorInfinityFinite Q n hn a + (scalarMatrix (d := d) sigma0) s.1 2 + +/-- The canonical scalar-comparator parent response maximum at physical scale +`k`. This is the finite supremum over the descendants of `Q` at that scale, +using literal restrictions of the one parent coefficient. -/ +noncomputable def parentTruncatedNormalizedBlockResponseScalarEMaxAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (k : ℤ) (hk : k ≤ Q.scale) + (a : CoeffOn (cubeDomain Q)) (sigma0 : ℝ) (_hsigma0 : 0 < sigma0) : ℝ≥0∞ := by + classical + exact (descendantsAtScale Q k).attach.sup fun R => + normalizedBlockResponseEMaxOnCube R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk R.2)) + (scalarMatrix (d := d) sigma0) + +/-- Exact series characterization of the canonical scalar `q = 1` truncated +parent error. This only unfolds its frozen definition. -/ +theorem parentTruncatedHomogenizationErrorInfinityOneScalar_eq_tsum + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : CoeffOn (cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s : FractionalOrder) : + parentTruncatedHomogenizationErrorInfinityOneScalar Q n hn a sigma0 hsigma0 s = + ∑' j : ℕ, + (ENNReal.ofReal (1 - Real.rpow 3 (-s.1)) * + ENNReal.ofReal (Real.rpow 3 (-s.1 * (j : ℝ)))) * + (parentTruncatedNormalizedBlockResponseScalarEMaxAtScale Q + (n - (j : ℤ)) (by omega) a sigma0 hsigma0) ^ (1 / 2 : ℝ) := by + simp [parentTruncatedHomogenizationErrorInfinityOneScalar, + parentTruncatedHomogenizationErrorInfinityFinite, + homogenizationErrorGeometricEWeight, + parentMaxNormalizedBlockResponseAtScale, + parentTruncatedNormalizedBlockResponseScalarEMaxAtScale] + +/-- Exact series characterization of the canonical scalar `q = 2` truncated +parent error. This only unfolds its frozen definition. -/ +theorem parentTruncatedHomogenizationErrorInfinityTwoScalar_eq_tsum + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : CoeffOn (cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s : FractionalOrder) : + parentTruncatedHomogenizationErrorInfinityTwoScalar Q n hn a sigma0 hsigma0 s = + (∑' j : ℕ, + (ENNReal.ofReal (1 - Real.rpow 3 (-s.1 * 2)) * + ENNReal.ofReal (Real.rpow 3 (-s.1 * 2 * (j : ℝ)))) * + parentTruncatedNormalizedBlockResponseScalarEMaxAtScale Q + (n - (j : ℤ)) (by omega) a sigma0 hsigma0) ^ (1 / 2 : ℝ) := by + norm_num [parentTruncatedHomogenizationErrorInfinityTwoScalar, + parentTruncatedHomogenizationErrorInfinityFinite, + homogenizationErrorGeometricEWeight, + parentMaxNormalizedBlockResponseAtScale, + parentTruncatedNormalizedBlockResponseScalarEMaxAtScale] + +private theorem normalizedBlockResponseESetOnCube_nonempty {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : + (normalizedBlockResponseESetOnCube Q a a0).Nonempty := by + classical + have hd : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + let i0 : BlockCoord d := Sum.inl ⟨0, hd⟩ + let e : FullBlockVec d := Pi.single i0 1 + refine ⟨ENNReal.ofReal + (doubledResponseJ (cubeDomain Q) a + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e))), ?_⟩ + refine ⟨e, ?_, rfl⟩ + unfold fullBlockVecNormSq e + rw [Fintype.sum_eq_single i0] + · simp + · intro b hb + simp [hb] + +private theorem normalizedBlockResponseESetOnCube_elements_ne_top {d : ℕ} + [NeZero d] {Q : TriadicCube d} {a : CoeffOn (cubeDomain Q)} + {a0 : Mat d} {y : ℝ≥0∞} + (hy : y ∈ normalizedBlockResponseESetOnCube Q a a0) : + y ≠ ∞ := by + rcases hy with ⟨e, he, rfl⟩ + exact ENNReal.ofReal_ne_top + +private theorem normalizedBlockResponseESetOnCube_elements_nonneg_real {d : ℕ} + [NeZero d] {Q : TriadicCube d} {a : CoeffOn (cubeDomain Q)} + {a0 : Mat d} {e : FullBlockVec d} + (_he : fullBlockVecNormSq e = 1) : + 0 ≤ doubledResponseJ (cubeDomain Q) a + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec + (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) := + doubledResponseJ_nonneg (cubeDomain Q) a _ _ + +private noncomputable def normalizedBlockResponseEUpperBoundOnCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : ℝ≥0∞ := + let c : ℝ := (a.lam / (1 + 2 * a.Lam ^ 2))⁻¹ + ENNReal.ofReal + (c * fullBlockMatRowAbsSqBound (constantFullBlockMatrixSqrt a0) + + c * blockMatrixOfCoeffNormSqBound a.lam a.Lam * + fullBlockMatRowAbsSqBound (constantFullBlockMatrixInvSqrt a0)) + +private theorem normalizedBlockResponseESetOnCube_le_upperBound {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) {y : ℝ≥0∞} + (hy : y ∈ normalizedBlockResponseESetOnCube Q a a0) : + y ≤ normalizedBlockResponseEUpperBoundOnCube Q a a0 := by + rcases hy with ⟨e, he, rfl⟩ + let U := cubeDomain Q + let apw : CoeffOn U := + Internal.Ch02.BookCh02.pointwiseCoeffOn U a + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField U a + let MInv := constantFullBlockMatrixInvSqrt a0 + let MSqrt := constantFullBlockMatrixSqrt a0 + let P := ofFullBlockVec (Matrix.mulVec MInv e) + let Q' := ofFullBlockVec (Matrix.mulVec MSqrt e) + let c : ℝ := (a.lam / (1 + 2 * a.Lam ^ 2))⁻¹ + let B : ℝ := + c * fullBlockMatRowAbsSqBound MSqrt + + c * blockMatrixOfCoeffNormSqBound a.lam a.Lam * + fullBlockMatRowAbsSqBound MInv + have hEll : + IsEllipticFieldOn a.lam a.Lam (openCubeSet Q) A := by + simpa [U, A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn U a + have haeeq : CoeffOn.AEEq a apw := by + exact (Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq U a).symm + have hJ : doubledResponseJ U a P Q' = BlockJ (openCubeSet Q) P Q' A := by + calc + doubledResponseJ U a P Q' = doubledResponseJ U apw P Q' := by + rw [doubledResponseJ_eq_ofAEEq haeeq P Q'] + _ = BlockJ (U : Set (Vec d)) P Q' apw.toCoeffField := by + exact + Internal.Ch02.BookCh02.book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn + U apw (by simpa [apw, U] using! hEll) P Q' + _ = BlockJ (openCubeSet Q) P Q' A := by rfl + have hvol : (MeasureTheory.volume (openCubeSet Q)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hc_nonneg : 0 ≤ c := by + have hden_pos : 0 < 1 + 2 * a.Lam ^ 2 := by positivity + have hfrac_pos : 0 < a.lam / (1 + 2 * a.Lam ^ 2) := + div_pos a.lam_pos hden_pos + dsimp [c] + positivity + have hcoeff_nonneg : + 0 ≤ blockMatrixOfCoeffNormSqBound a.lam a.Lam := by + unfold blockMatrixOfCoeffNormSqBound + have hLamSq : 0 ≤ a.Lam ^ 2 := sq_nonneg _ + have hInvSq : 0 ≤ a.lam⁻¹ * a.lam⁻¹ := mul_self_nonneg _ + have hFactor : 0 ≤ 2 * a.Lam ^ 2 + 1 := by nlinarith + have hTail : + 0 ≤ 2 * (2 * a.Lam ^ 2 + 1) * + (a.lam⁻¹ * a.lam⁻¹) * (a.Lam ^ 2 + 1) := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by norm_num) hFactor) hInvSq) + (by nlinarith) + nlinarith + have hP : blockVecDot P P ≤ fullBlockMatRowAbsSqBound MInv := by + dsimp [P, MInv] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + have hQ : blockVecDot Q' Q' ≤ fullBlockMatRowAbsSqBound MSqrt := by + dsimp [Q', MSqrt] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + have hreal : doubledResponseJ U a P Q' ≤ B := by + rw [hJ] + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + calc + BlockJ (openCubeSet Q) P Q' A ≤ + blockResponsePlainUpperBound a.lam a.Lam P Q' := by + exact blockJ_le_plainUpperBound_of_isEllipticFieldOn + (a := A) (U := openCubeSet Q) (measurableSet_openCubeSet Q) + hEll hvol P Q' + _ ≤ B := by + have htermQ : + c * blockVecDot Q' Q' ≤ + c * fullBlockMatRowAbsSqBound MSqrt := + mul_le_mul_of_nonneg_left hQ hc_nonneg + have htermP : + c * blockMatrixOfCoeffNormSqBound a.lam a.Lam * blockVecDot P P ≤ + c * blockMatrixOfCoeffNormSqBound a.lam a.Lam * + fullBlockMatRowAbsSqBound MInv := + mul_le_mul_of_nonneg_left hP (mul_nonneg hc_nonneg hcoeff_nonneg) + dsimp [B, c] + unfold blockResponsePlainUpperBound + dsimp [c] at htermQ htermP + linarith + simpa [normalizedBlockResponseEUpperBoundOnCube, B, c, P, Q', U] using + ENNReal.ofReal_le_ofReal hreal + +private theorem normalizedBlockResponseESetOnCube_bddAbove {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : + BddAbove (normalizedBlockResponseESetOnCube Q a a0) := + ⟨normalizedBlockResponseEUpperBoundOnCube Q a a0, + fun _ hy => normalizedBlockResponseESetOnCube_le_upperBound Q a a0 hy⟩ + +private theorem normalizedBlockResponseEMaxOnCube_le_upperBound {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : + normalizedBlockResponseEMaxOnCube Q a a0 ≤ + normalizedBlockResponseEUpperBoundOnCube Q a a0 := by + unfold normalizedBlockResponseEMaxOnCube + exact sSup_le fun _ hy => + normalizedBlockResponseESetOnCube_le_upperBound Q a a0 hy + +private theorem normalizedBlockResponseEMaxOnCube_lt_top {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : + normalizedBlockResponseEMaxOnCube Q a a0 < ∞ := + lt_of_le_of_lt + (normalizedBlockResponseEMaxOnCube_le_upperBound Q a a0) + ENNReal.ofReal_lt_top + +private theorem normalizedBlockResponseESetOnCube_le_eMax {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) {y : ℝ≥0∞} + (hy : y ∈ normalizedBlockResponseESetOnCube Q a a0) : + y ≤ normalizedBlockResponseEMaxOnCube Q a a0 := by + unfold normalizedBlockResponseEMaxOnCube + exact le_sSup hy + +private theorem normalizedBlockResponseEMaxOnCube_isLUB {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (a0 : Mat d) : + IsLUB (normalizedBlockResponseESetOnCube Q a a0) + (normalizedBlockResponseEMaxOnCube Q a a0) := by + constructor + · intro y hy + exact normalizedBlockResponseESetOnCube_le_eMax Q a a0 hy + · intro b hb + unfold normalizedBlockResponseEMaxOnCube + exact sSup_le hb + +/-- The `ℝ≥0∞`-valued unit-sphere response values for the positive scalar +comparator `sigma0 I` on one cube. + +This is a scalar-facing wrapper around the private matrix implementation. In +particular, it deliberately exposes a supremum API below, rather than claiming +that a maximizing vector has been constructed. -/ +noncomputable def normalizedBlockResponseScalarEValueSetOnCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (_hsigma0 : 0 < sigma0) : Set ℝ≥0∞ := + normalizedBlockResponseESetOnCube Q a (scalarMatrix (d := d) sigma0) + +/-- The one-cube scalar-comparator response supremum. This definition does +not assert that the supremum is attained. -/ +noncomputable def normalizedBlockResponseScalarEMaxOnCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : ℝ≥0∞ := + sSup (normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0) + +/-- Membership in the scalar response value set is exactly the nonnegative +extended-real encoding of a unit-sphere doubled response. -/ +theorem mem_normalizedBlockResponseScalarEValueSetOnCube_iff {d : ℕ} + [NeZero d] {Q : TriadicCube d} {a : CoeffOn (cubeDomain Q)} + {sigma0 : ℝ} {hsigma0 : 0 < sigma0} {y : ℝ≥0∞} : + y ∈ normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0 ↔ + ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + y = ENNReal.ofReal + (doubledResponseJ (cubeDomain Q) a + (ofFullBlockVec + (Matrix.mulVec + (constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) sigma0)) e)) + (ofFullBlockVec + (Matrix.mulVec + (constantFullBlockMatrixSqrt (scalarMatrix (d := d) sigma0)) e))) := + Iff.rfl + +/-- Every scalar response value is finite, as follows from its +`ENNReal.ofReal` representation. -/ +theorem normalizedBlockResponseScalarEValueSetOnCube_ne_top {d : ℕ} + [NeZero d] {Q : TriadicCube d} {a : CoeffOn (cubeDomain Q)} + {sigma0 : ℝ} {hsigma0 : 0 < sigma0} {y : ℝ≥0∞} + (hy : y ∈ normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0) : + y ≠ ∞ := + normalizedBlockResponseESetOnCube_elements_ne_top hy + +/-- The real response encoded by the scalar value set is nonnegative. -/ +theorem normalizedBlockResponseScalar_nonneg {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (_hsigma0 : 0 < sigma0) (e : FullBlockVec d) + (_he : fullBlockVecNormSq e = 1) : + 0 ≤ doubledResponseJ (cubeDomain Q) a + (ofFullBlockVec + (Matrix.mulVec + (constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) sigma0)) e)) + (ofFullBlockVec + (Matrix.mulVec + (constantFullBlockMatrixSqrt (scalarMatrix (d := d) sigma0)) e)) := + normalizedBlockResponseESetOnCube_elements_nonneg_real + (a0 := scalarMatrix (d := d) sigma0) _he + +/-- The scalar response value set is nonempty. -/ +theorem normalizedBlockResponseScalarEValueSetOnCube_nonempty {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : + (normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0).Nonempty := + normalizedBlockResponseESetOnCube_nonempty Q a + (scalarMatrix (d := d) sigma0) + +/-- The scalar response value set is bounded above in `ℝ≥0∞`. -/ +theorem normalizedBlockResponseScalarEValueSetOnCube_bddAbove {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : + BddAbove (normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0) := + normalizedBlockResponseESetOnCube_bddAbove Q a + (scalarMatrix (d := d) sigma0) + +/-- Every scalar response value is bounded by the one-cube response +supremum. -/ +theorem normalizedBlockResponseScalarEValueSetOnCube_le_eMax {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) {y : ℝ≥0∞} + (hy : y ∈ normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0) : + y ≤ normalizedBlockResponseScalarEMaxOnCube Q a sigma0 hsigma0 := + normalizedBlockResponseESetOnCube_le_eMax Q a + (scalarMatrix (d := d) sigma0) hy + +/-- The scalar response maximum is the least upper bound of the value set. +No attainment assertion is included. -/ +theorem normalizedBlockResponseScalarEMaxOnCube_isLUB {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : + IsLUB (normalizedBlockResponseScalarEValueSetOnCube Q a sigma0 hsigma0) + (normalizedBlockResponseScalarEMaxOnCube Q a sigma0 hsigma0) := + normalizedBlockResponseEMaxOnCube_isLUB Q a + (scalarMatrix (d := d) sigma0) + +/-- The scalar response supremum is finite. -/ +theorem normalizedBlockResponseScalarEMaxOnCube_lt_top {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : + normalizedBlockResponseScalarEMaxOnCube Q a sigma0 hsigma0 < ∞ := + normalizedBlockResponseEMaxOnCube_lt_top Q a + (scalarMatrix (d := d) sigma0) + +end + +end Book.Ch02 +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Response.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Response.lean new file mode 100644 index 0000000000..153f447c5f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Response.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Setup + +/-! # Response -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public normalized average over a Chapter 2 domain. -/ +noncomputable def average {d : ℕ} (U : Domain d) (f : Vec d → ℝ) : ℝ := + (MeasureTheory.volume (U : Set (Vec d))).toReal⁻¹ * + ∫ x in (U : Set (Vec d)), f x ∂MeasureTheory.volume + +/-- Public normalized vector average over a Chapter 2 domain. -/ +noncomputable def averageVec {d : ℕ} (U : Domain d) (F : Vec d → Vec d) : Vec d := + fun i => average U (fun x => F x i) + +/-- The response integrand from the notes, used under the normalized volume average. -/ +noncomputable def responseIntegrand {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) (v : Solution U a) : Vec d → ℝ := + fun x => + -((1 / 2 : ℝ) * + vecDot (v.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (v.toH1.grad x))) + - vecDot p (matVecMul (a.toCoeffField x) (v.toH1.grad x)) + + vecDot q (v.toH1.grad x) + +/-- The response value of one admissible solution. -/ +noncomputable def responseValue {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) (v : Solution U a) : ℝ := + average U (responseIntegrand U a p q v) + +theorem responseIntegrand_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) (v : Solution U a) : + responseIntegrand U b p q (Solution.ofAEEq h v) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + responseIntegrand U a p q v := + h.symm.mono fun x hx => by + simp [responseIntegrand, hx] + +theorem responseValue_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) (v : Solution U a) : + responseValue U b p q (Solution.ofAEEq h v) = responseValue U a p q v := by + unfold responseValue average + congr 1 + exact MeasureTheory.integral_congr_ae (responseIntegrand_ofAEEq h p q v) + +/-- The first-variation integrand appearing in the Euler-Lagrange equation for +the response maximizer. -/ +noncomputable def firstVariationIntegrand {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) (v w : Solution U a) : Vec d → ℝ := + fun x => + vecDot q (w.toH1.grad x) + - vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x)) + - vecDot (w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (v.toH1.grad x)) + +/-- The averaged first variation. A maximizer makes this vanish for every +admissible direction. -/ +noncomputable def firstVariationValue {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) (v w : Solution U a) : ℝ := + average U (firstVariationIntegrand U a p q v w) + +/-- The positive quadratic energy in the second-variation formula. -/ +noncomputable def variationEnergyIntegrand {d : ℕ} (U : Domain d) (a : CoeffOn U) + (w : Solution U a) : Vec d → ℝ := + fun x => + vecDot (w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (w.toH1.grad x)) + +/-- The averaged quadratic energy of an admissible variation. -/ +noncomputable def variationEnergyValue {d : ℕ} (U : Domain d) (a : CoeffOn U) + (w : Solution U a) : ℝ := + average U (variationEnergyIntegrand U a w) + +/-- The right-hand side in the second-variation identity for two admissible +solutions. -/ +noncomputable def secondVariationEnergyValue {d : ℕ} (U : Domain d) (a : CoeffOn U) + (v w : Solution U a) : ℝ := + average U fun x => + (1 / 2 : ℝ) * + vecDot (v.toH1.grad x - w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) + (v.toH1.grad x - w.toH1.grad x)) + +/-- The averaged gradient of a Chapter 2 solution. -/ +noncomputable def averageGradient {d : ℕ} (U : Domain d) (a : CoeffOn U) + (v : Solution U a) : Vec d := + averageVec U v.toH1.grad + +/-- The averaged flux of a Chapter 2 solution. -/ +noncomputable def averageFlux {d : ℕ} (U : Domain d) (a : CoeffOn U) + (v : Solution U a) : Vec d := + averageVec U fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x) + +/-- The averaged gradient is unchanged by a null-set change of coefficient +representative. -/ +theorem averageGradient_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (v : Solution U a) : + averageGradient U b (Solution.ofAEEq h v) = averageGradient U a v := + rfl + +/-- The averaged flux is unchanged by a null-set change of coefficient +representative. -/ +theorem averageFlux_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (v : Solution U a) : + averageFlux U b (Solution.ofAEEq h v) = averageFlux U a v := by + ext i + unfold averageFlux averageVec average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.symm.mono fun x hx => by + simp [hx] + +theorem firstVariationIntegrand_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) (v w : Solution U a) : + firstVariationIntegrand U b p q (Solution.ofAEEq h v) (Solution.ofAEEq h w) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + firstVariationIntegrand U a p q v w := + h.symm.mono fun x hx => by + simp [firstVariationIntegrand, hx] + +theorem firstVariationValue_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) (v w : Solution U a) : + firstVariationValue U b p q (Solution.ofAEEq h v) (Solution.ofAEEq h w) = + firstVariationValue U a p q v w := by + unfold firstVariationValue average + congr 1 + exact MeasureTheory.integral_congr_ae (firstVariationIntegrand_ofAEEq h p q v w) + +theorem variationEnergyIntegrand_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (w : Solution U a) : + variationEnergyIntegrand U b (Solution.ofAEEq h w) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + variationEnergyIntegrand U a w := + h.symm.mono fun x hx => by + simp [variationEnergyIntegrand, hx] + +theorem variationEnergyValue_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (w : Solution U a) : + variationEnergyValue U b (Solution.ofAEEq h w) = + variationEnergyValue U a w := by + unfold variationEnergyValue average + congr 1 + exact MeasureTheory.integral_congr_ae (variationEnergyIntegrand_ofAEEq h w) + +theorem secondVariationEnergyValue_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (v w : Solution U a) : + secondVariationEnergyValue U b (Solution.ofAEEq h v) (Solution.ofAEEq h w) = + secondVariationEnergyValue U a v w := by + unfold secondVariationEnergyValue average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.symm.mono fun x hx => by + simp [hx] + +/-- The set of values whose supremum is `J(U,p,q;a)`. -/ +noncomputable def responseValueSet {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : Set ℝ := + {m | ∃ v : Solution U a, m = responseValue U a p q v} + +theorem responseValueSet_nonempty {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : (responseValueSet U a p q).Nonempty := + ⟨responseValue U a p q (zeroSolution U a), zeroSolution U a, rfl⟩ + +/-- Public Chapter 2 response functional `J(U,p,q;a)`. -/ +noncomputable def responseJ {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : ℝ := + sSup (responseValueSet U a p q) + +theorem responseValueSet_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) : + responseValueSet U a p q = responseValueSet U b p q := by + ext m + constructor + · rintro ⟨v, rfl⟩ + exact ⟨Solution.ofAEEq h v, (responseValue_ofAEEq h p q v).symm⟩ + · rintro ⟨v, rfl⟩ + exact ⟨Solution.ofAEEq h.symm v, (responseValue_ofAEEq h.symm p q v).symm⟩ + +theorem responseJ_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) : + responseJ U a p q = responseJ U b p q := by + unfold responseJ + rw [responseValueSet_eq_ofAEEq h p q] + +/-- A solution is a response maximizer if it realizes the variational supremum. -/ +def IsResponseMaximizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) (v : Solution U a) : Prop := + ∀ w : Solution U a, responseValue U a p q w ≤ responseValue U a p q v + +namespace IsResponseMaximizer + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + IsResponseMaximizer U b p q (Solution.ofAEEq h v) := by + intro w + have hw := hv (Solution.ofAEEq h.symm w) + simpa [responseValue_ofAEEq h.symm p q w, responseValue_ofAEEq h p q v] using hw + +end IsResponseMaximizer + +theorem responseValueSet_isGreatest_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + IsGreatest (responseValueSet U a p q) (responseValue U a p q v) := by + constructor + · exact ⟨v, rfl⟩ + · intro y hy + rcases hy with ⟨w, rfl⟩ + exact hv w + +theorem responseJ_eq_responseValue_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + responseJ U a p q = responseValue U a p q v := by + unfold responseJ + exact (responseValueSet_isGreatest_of_isResponseMaximizer hv).csSup_eq + +/-- The mean-zero response maximizer as a packaged object. -/ +structure CanonicalMaximizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) where + toSolution : Solution U a + meanZero : MeanZeroOn (U : Set (Vec d)) toSolution.toH1.toFun + isMaximizer : IsResponseMaximizer U a p q toSolution + +namespace CanonicalMaximizer + +instance {d : ℕ} {U : Domain d} {a : CoeffOn U} {p q : Vec d} : + CoeOut (CanonicalMaximizer U a p q) (Solution U a) where + coe v := v.toSolution + +/-- Transport the canonical maximizer package across a null-set change of +coefficient representative. -/ +def ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {p q : Vec d} + (v : CanonicalMaximizer U a p q) : CanonicalMaximizer U b p q where + toSolution := Solution.ofAEEq h v.toSolution + meanZero := by + simpa using v.meanZero + isMaximizer := v.isMaximizer.ofAEEq h + +theorem responseJ_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} {p q : Vec d} + (v : CanonicalMaximizer U a p q) : + responseJ U a p q = responseValue U a p q v.toSolution := + responseJ_eq_responseValue_of_isResponseMaximizer v.isMaximizer + +end CanonicalMaximizer + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Setup.lean new file mode 100644 index 0000000000..4e0ca34987 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Setup.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic + +/-! # Setup -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 domains: nonempty bounded open convex subsets of `R^d`. -/ +structure Domain (d : ℕ) where + carrier : Set (Vec d) + isDomain : IsOpenBoundedConvexDomain carrier + nonempty : carrier.Nonempty + +namespace Domain + +instance {d : ℕ} : Coe (Domain d) (Set (Vec d)) where + coe U := U.carrier + +@[simp] theorem coe_mk {d : ℕ} (U : Set (Vec d)) + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + ((Domain.mk U hU hne : Domain d) : Set (Vec d)) = U := + rfl + +theorem isOpen {d : ℕ} (U : Domain d) : IsOpen (U : Set (Vec d)) := + U.isDomain.isOpen + +theorem isBoundedDomain {d : ℕ} (U : Domain d) : + IsBoundedDomain (U : Set (Vec d)) := + U.isDomain.isBoundedDomain + +theorem convex {d : ℕ} (U : Domain d) : Convex ℝ (U : Set (Vec d)) := + U.isDomain.convex + +theorem measurableSet {d : ℕ} (U : Domain d) : MeasurableSet (U : Set (Vec d)) := + U.isOpen.measurableSet + +instance instIsFiniteMeasureVolumeMeasureOn {d : ℕ} (U : Domain d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (U : Set (Vec d))) := by + simpa [volumeMeasureOn] using U.isDomain.isFiniteMeasure_restrict_volume + +end Domain + +/-- Public version of `a in Omega(U)`. + +This is deliberately an almost-everywhere object: the coefficient field is a +representative, and all public regularity/ellipticity data is stated with respect +to `volumeMeasureOn U`. +-/ +structure CoeffOn {d : ℕ} (U : Domain d) where + toCoeffField : CoeffField d + lam : ℝ + Lam : ℝ + lam_pos : 0 < lam + lam_le_Lam : lam ≤ Lam + aeStronglyMeasurable : + ∀ i j : Fin d, + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField (U : Set (Vec d)) toCoeffField x i j) + (volumeMeasureOn (U : Set (Vec d))) + aeElliptic : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + IsEllipticMatrix lam Lam (toCoeffField x) + +namespace CoeffOn + +instance {d : ℕ} {U : Domain d} : CoeFun (CoeffOn U) (fun _ => CoeffField d) where + coe a := a.toCoeffField + +theorem measurableSet {d : ℕ} {U : Domain d} (_a : CoeffOn U) : + MeasurableSet (U : Set (Vec d)) := + U.measurableSet + +/-- Public adjoint coefficient field `a^t`, still as an a.e. coefficient object +on the same Chapter 2 domain. -/ +noncomputable def transpose {d : ℕ} {U : Domain d} (a : CoeffOn U) : CoeffOn U where + toCoeffField := fun x => matTranspose (a.toCoeffField x) + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + intro i j + have h := a.aeStronglyMeasurable j i + have hcoord : + (fun x : Vec d => + restrictCoeffField (U : Set (Vec d)) + (fun y => matTranspose (a.toCoeffField y)) x i j) = + fun x : Vec d => + restrictCoeffField (U : Set (Vec d)) a.toCoeffField x j i := by + funext x + by_cases hx : x ∈ (U : Set (Vec d)) <;> + simp [restrictCoeffField, matTranspose, hx] + simpa [hcoord] using h + aeElliptic := by + exact a.aeElliptic.mono fun x hx => isEllipticMatrix_transpose hx + +@[simp] theorem transpose_apply {d : ℕ} {U : Domain d} (a : CoeffOn U) + (x : Vec d) : + a.transpose.toCoeffField x = matTranspose (a.toCoeffField x) := + rfl + +/-- Equality of public coefficient fields is equality of representatives almost +everywhere on the public domain. -/ +def AEEq {d : ℕ} {U : Domain d} (a b : CoeffOn U) : Prop := + a.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] b.toCoeffField + +/-- Public a.e. symmetry predicate for coefficient representatives. + +The Chapter 2 public layer deliberately does not use pointwise symmetry as a +theorem hypothesis. -/ +def IsSymmetric {d : ℕ} {U : Domain d} (a : CoeffOn U) : Prop := + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), (a.toCoeffField x).IsSymm + +/-- `b` is the a.e. scalar rescaling `c a` on the public domain. -/ +def AEScaled {d : ℕ} {U : Domain d} (c : ℝ) (a b : CoeffOn U) : Prop := + b.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • a.toCoeffField x + +/-- `b` is the restriction of `a` to a smaller public domain, modulo null sets. + +This is deliberately an a.e. relation between coefficient representatives, rather +than a pointwise restriction definition. -/ +def RestrictsTo {d : ℕ} {U V : Domain d} (a : CoeffOn U) (b : CoeffOn V) : Prop := + b.toCoeffField =ᵐ[volumeMeasureOn (V : Set (Vec d))] a.toCoeffField + +namespace AEEq + +theorem refl {d : ℕ} {U : Domain d} (a : CoeffOn U) : AEEq a a := + Filter.EventuallyEq.rfl + +theorem symm {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : AEEq a b) : AEEq b a := + Filter.EventuallyEq.symm h + +theorem trans {d : ℕ} {U : Domain d} {a b c : CoeffOn U} + (hab : AEEq a b) (hbc : AEEq b c) : AEEq a c := + Filter.EventuallyEq.trans hab hbc + +end AEEq + +theorem AEEq.transpose {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : AEEq a b) : AEEq a.transpose b.transpose := + h.mono fun x hx => by + simp [hx] + +theorem transpose_transpose_aeeq {d : ℕ} {U : Domain d} (a : CoeffOn U) : + AEEq a.transpose.transpose a := by + exact Filter.Eventually.of_forall fun x => by + ext i j + simp [matTranspose] + +end CoeffOn + +/-- Public Chapter 2 notation for `A(U; a)`. -/ +abbrev Solution {d : ℕ} (U : Domain d) (a : CoeffOn U) := + AHarmonicFunction a.toCoeffField (U : Set (Vec d)) + +namespace Solution + +/-- Two public solutions have the same gradient on `U`, modulo null sets. -/ +def SameGradientAE {d : ℕ} {U : Domain d} {a : CoeffOn U} + (u v : Solution U a) : Prop := + u.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] v.toH1.grad + +namespace SameGradientAE + +theorem refl {d : ℕ} {U : Domain d} {a : CoeffOn U} (u : Solution U a) : + SameGradientAE u u := + Filter.EventuallyEq.rfl + +theorem symm {d : ℕ} {U : Domain d} {a : CoeffOn U} {u v : Solution U a} + (h : SameGradientAE u v) : SameGradientAE v u := + Filter.EventuallyEq.symm h + +theorem trans {d : ℕ} {U : Domain d} {a : CoeffOn U} {u v w : Solution U a} + (huv : SameGradientAE u v) (hvw : SameGradientAE v w) : SameGradientAE u w := + Filter.EventuallyEq.trans huv hvw + +end SameGradientAE + +/-- Transport a solution across a change of coefficient representative on a null set. -/ +def ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (u : Solution U a) : Solution U b where + toH1 := u.toH1 + isHarmonic := by + rcases u.isHarmonic with ⟨hpot, hsol⟩ + refine ⟨hpot, ?_⟩ + intro φ + calc + ∫ x in (U : Set (Vec d)), + vecDot (matVecMul (b.toCoeffField x) (u.toH1.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in (U : Set (Vec d)), + vecDot (matVecMul (a.toCoeffField x) (u.toH1.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact h.symm.mono fun x hx => by + simp [hx] + _ = 0 := hsol φ + +@[simp] theorem toH1_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (u : Solution U a) : + (ofAEEq h u).toH1 = u.toH1 := + rfl + +@[simp] theorem ofAEEq_refl {d : ℕ} {U : Domain d} {a : CoeffOn U} + (u : Solution U a) : + ofAEEq (CoeffOn.AEEq.refl a) u = u := + rfl + +theorem sameGradientAE_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {u v : Solution U a} + (huv : SameGradientAE u v) : SameGradientAE (ofAEEq h u) (ofAEEq h v) := + huv + +end Solution + +/-- Public Chapter 2 notation for the adjoint solution space `A*(U; a)`. -/ +abbrev AdjointSolution {d : ℕ} (U : Domain d) (a : CoeffOn U) := + AStarHarmonicFunction (U : Set (Vec d)) a.toCoeffField + +/-- The zero solution, used to show that the response supremum is over a +nonempty set. -/ +def zeroSolution {d : ℕ} (U : Domain d) (a : CoeffOn U) : Solution U a where + toH1 := 0 + isHarmonic := isAHarmonicGradient_zero + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Symmetric.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Symmetric.lean new file mode 100644 index 0000000000..69c043f3b7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Symmetric.lean @@ -0,0 +1,219 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.FieldSpaces +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Matrices + +/-! # Symmetric -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public averaged gradient of an arbitrary `H¹` function on a Chapter 2 +domain. -/ +noncomputable def h1AverageGradient {d : ℕ} (U : Domain d) + (u : H1Function (U : Set (Vec d))) : Vec d := + averageVec U u.grad + +/-- Public averaged flux of an arbitrary `H¹` function on a Chapter 2 domain. -/ +noncomputable def h1AverageFlux {d : ℕ} (U : Domain d) (a : CoeffOn U) + (u : H1Function (U : Set (Vec d))) : Vec d := + averageVec U fun x => matVecMul (a.toCoeffField x) (u.grad x) + +/-- Public Dirichlet admissibility for the symmetric subsection: +`u ∈ p · x + H¹₀(U)`, stated by saying that `∇u - p` is a zero-trace +potential field. -/ +def IsSymmetricDirichletAdmissible {d : ℕ} (U : Domain d) (p : Vec d) + (u : H1Function (U : Set (Vec d))) : Prop := + Book.Ch01.PotentialZeroTraceFieldOn (U : Set (Vec d)) (fun x => u.grad x - p) + +/-- Public Dirichlet energy value from +`e.def.nuD.nuN.symmetric.basic.definitions`. -/ +noncomputable def symmetricDirichletEnergyValue {d : ℕ} (U : Domain d) + (a : CoeffOn U) (u : H1Function (U : Set (Vec d))) : ℝ := + average U fun x => + (1 / 2 : ℝ) * vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) + +/-- Public value set whose infimum is `ν_D(U,p;a)`. -/ +noncomputable def symmetricDirichletValueSet {d : ℕ} (U : Domain d) + (a : CoeffOn U) (p : Vec d) : Set ℝ := + {E | ∃ u : H1Function (U : Set (Vec d)), + IsSymmetricDirichletAdmissible U p u ∧ + E = symmetricDirichletEnergyValue U a u} + +/-- Public Dirichlet value `ν_D(U,p;a)`. -/ +noncomputable def symmetricDirichletNu {d : ℕ} (U : Domain d) + (a : CoeffOn U) (p : Vec d) : ℝ := + sInf (symmetricDirichletValueSet U a p) + +/-- A public minimizer for `ν_D(U,p;a)`. -/ +def IsSymmetricDirichletMinimizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p : Vec d) (u : H1Function (U : Set (Vec d))) : Prop := + IsSymmetricDirichletAdmissible U p u ∧ + ∀ w : H1Function (U : Set (Vec d)), + IsSymmetricDirichletAdmissible U p w → + symmetricDirichletEnergyValue U a u ≤ symmetricDirichletEnergyValue U a w + +/-- Public Neumann value of a candidate from +`e.def.nuD.nuN.symmetric.basic.definitions`. -/ +noncomputable def symmetricNeumannEnergyValue {d : ℕ} (U : Domain d) + (a : CoeffOn U) (q : Vec d) (u : H1Function (U : Set (Vec d))) : ℝ := + average U fun x => + vecDot q (u.grad x) - + (1 / 2 : ℝ) * vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) + +/-- Public value set whose supremum is `ν_N(U,q;a)`. -/ +noncomputable def symmetricNeumannValueSet {d : ℕ} (U : Domain d) + (a : CoeffOn U) (q : Vec d) : Set ℝ := + {E | ∃ u : H1Function (U : Set (Vec d)), + E = symmetricNeumannEnergyValue U a q u} + +/-- Public Neumann value `ν_N(U,q;a)`. -/ +noncomputable def symmetricNeumannNu {d : ℕ} (U : Domain d) + (a : CoeffOn U) (q : Vec d) : ℝ := + sSup (symmetricNeumannValueSet U a q) + +/-- A public maximizer for `ν_N(U,q;a)`. The note chooses the mean-zero +representative separately, so mean-zero is a theorem-field condition rather than +part of this maximizer predicate. -/ +def IsSymmetricNeumannMaximizer {d : ℕ} (U : Domain d) (a : CoeffOn U) + (q : Vec d) (u : H1Function (U : Set (Vec d))) : Prop := + ∀ w : H1Function (U : Set (Vec d)), + symmetricNeumannEnergyValue U a q w ≤ symmetricNeumannEnergyValue U a q u + +/-- The public Dirichlet energy depends only on the coefficient field up to +a.e. equality on the domain. -/ +theorem symmetricDirichletEnergyValue_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (u : H1Function (U : Set (Vec d))) : + symmetricDirichletEnergyValue U a u = + symmetricDirichletEnergyValue U b u := by + unfold symmetricDirichletEnergyValue average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +/-- The public Dirichlet value set is invariant under a.e. coefficient changes. -/ +theorem symmetricDirichletValueSet_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (p : Vec d) : + symmetricDirichletValueSet U a p = + symmetricDirichletValueSet U b p := by + ext E + constructor + · rintro ⟨u, hu, rfl⟩ + exact ⟨u, hu, by + simp [symmetricDirichletEnergyValue_eq_ofAEEq h u]⟩ + · rintro ⟨u, hu, rfl⟩ + exact ⟨u, hu, by + simp [symmetricDirichletEnergyValue_eq_ofAEEq h.symm u]⟩ + +/-- The public Dirichlet value is invariant under a.e. coefficient changes. -/ +theorem symmetricDirichletNu_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (p : Vec d) : + symmetricDirichletNu U a p = symmetricDirichletNu U b p := by + unfold symmetricDirichletNu + rw [symmetricDirichletValueSet_eq_ofAEEq h p] + +namespace IsSymmetricDirichletMinimizer + +/-- Transport a public symmetric Dirichlet minimizer across an a.e. coefficient +change. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {p : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsSymmetricDirichletMinimizer U a p u) : + IsSymmetricDirichletMinimizer U b p u := by + refine ⟨hu.1, ?_⟩ + intro w hw + have hmin := hu.2 w hw + simpa [symmetricDirichletEnergyValue_eq_ofAEEq h u, + symmetricDirichletEnergyValue_eq_ofAEEq h w] using hmin + +end IsSymmetricDirichletMinimizer + +/-- The public Neumann candidate value depends only on the coefficient field up +to a.e. equality on the domain. -/ +theorem symmetricNeumannEnergyValue_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (q : Vec d) + (u : H1Function (U : Set (Vec d))) : + symmetricNeumannEnergyValue U a q u = + symmetricNeumannEnergyValue U b q u := by + unfold symmetricNeumannEnergyValue average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +/-- The public Neumann value set is invariant under a.e. coefficient changes. -/ +theorem symmetricNeumannValueSet_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (q : Vec d) : + symmetricNeumannValueSet U a q = + symmetricNeumannValueSet U b q := by + ext E + constructor + · rintro ⟨u, rfl⟩ + exact ⟨u, by + simp [symmetricNeumannEnergyValue_eq_ofAEEq h q u]⟩ + · rintro ⟨u, rfl⟩ + exact ⟨u, by + simp [symmetricNeumannEnergyValue_eq_ofAEEq h.symm q u]⟩ + +/-- The public Neumann value is invariant under a.e. coefficient changes. -/ +theorem symmetricNeumannNu_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (q : Vec d) : + symmetricNeumannNu U a q = symmetricNeumannNu U b q := by + unfold symmetricNeumannNu + rw [symmetricNeumannValueSet_eq_ofAEEq h q] + +namespace IsSymmetricNeumannMaximizer + +/-- Transport a public symmetric Neumann maximizer across an a.e. coefficient +change. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {q : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsSymmetricNeumannMaximizer U a q u) : + IsSymmetricNeumannMaximizer U b q u := by + intro w + have hmax := hu w + simpa [symmetricNeumannEnergyValue_eq_ofAEEq h q u, + symmetricNeumannEnergyValue_eq_ofAEEq h q w] using hmax + +end IsSymmetricNeumannMaximizer + +/-- The public averaged flux of an arbitrary `H¹` function is invariant under +a.e. coefficient changes. -/ +theorem h1AverageFlux_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (u : H1Function (U : Set (Vec d))) : + h1AverageFlux U a u = h1AverageFlux U b u := by + ext i + unfold h1AverageFlux averageVec average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +/-- The raw public coefficient average is invariant under a.e. coefficient +changes. -/ +theorem averageMat_toCoeffField_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) : + averageMat U a.toCoeffField = averageMat U b.toCoeffField := by + ext i j + unfold averageMat average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.mono fun x hx => by + simp [hx] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems.lean new file mode 100644 index 0000000000..aa8ee1cb49 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtractionProofs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DeterministicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Dilation + +/-! +Public Chapter 2 theorem surface. + +The `*Definitions.lean` files in this directory contain proposition-valued +theorem packages and their small accessor APIs. The companion theorem files +import the internal proof bridges and prove those packages for the public + +/-! # Theorems -/ +`Domain`/`CoeffOn` interface. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentities.lean new file mode 100644 index 0000000000..a65ba8ce10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentities.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BasicVariationalIdentities + +/-! # Basic Variational Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 basic variational identities for the canonical +coarse-grained matrices. -/ +theorem responseBasicVariationalIdentitiesTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ResponseBasicVariationalIdentitiesTheory U a (coarseMatrices U a) := + Homogenization.Internal.Ch02.BookCh02.responseBasicVariationalIdentitiesTheory U a + +/-- Public lower bound in the coarse matrix order chain +`e.cg.bounds.basic.definitions`. -/ +theorem harmonicMean_le_sigmaStarCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + MatLoewnerLE (averagedSymmPartInv U a)⁻¹ (sigmaStarCoarse U a) := by + simpa using + (responseBasicVariationalIdentitiesTheory U a).harmonicMean_le_sigmaStar + +/-- Public non-obvious order in the coarse matrix chain +`e.cg.bounds.basic.definitions`. -/ +theorem sigmaStarCoarse_le_sigmaCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + MatLoewnerLE (sigmaStarCoarse U a) (sigmaCoarse U a) := by + simpa using + (responseBasicVariationalIdentitiesTheory U a).sigmaStar_le_sigma + +/-- Public derived-matrix order in `e.cg.bounds.basic.definitions`. -/ +theorem sigmaCoarse_le_bCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + MatLoewnerLE (sigmaCoarse U a) (bCoarse U a) := by + simpa [bCoarse] using + (responseBasicVariationalIdentitiesTheory U a).sigma_le_b + +/-- Public upper bound in the coarse matrix order chain +`e.cg.bounds.basic.definitions`. -/ +theorem bCoarse_le_averagedSymmPartPlusCorrection {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + MatLoewnerLE (bCoarse U a) (averagedSymmPartPlusCorrection U a) := by + simpa [bCoarse] using + (responseBasicVariationalIdentitiesTheory U a).b_le_averagedSymmPartPlusCorrection + +/-- Public second-variation identity `e.quadresp.basic.definitions`. -/ +theorem secondVariation_eq_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} + {v : Solution U a} (hv : IsResponseMaximizer U a p q v) + (w : Solution U a) : + responseJ U a p q - responseValue U a p q w = + secondVariationEnergyValue U a v w := + ResponseBasicVariationalIdentitiesTheory.secondVariation_eq + (responseBasicVariationalIdentitiesTheory U a) hv w + +/-- Public maximizer-energy identity `e.Jenergyv.basic.definitions`. -/ +theorem responseJ_eq_energy_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} + {v : Solution U a} (hv : IsResponseMaximizer U a p q v) : + responseJ U a p q = (1 / 2 : ℝ) * variationEnergyValue U a v := + ResponseBasicVariationalIdentitiesTheory.responseJ_eq_energy + (responseBasicVariationalIdentitiesTheory U a) hv + +/-- Public averaged-gradient formula +`e.v.spatial.averages.basic.definitions`. -/ +theorem averageGradient_eq_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} + {v : Solution U a} (hv : IsResponseMaximizer U a p q v) : + averageGradient U a v = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := + ResponseBasicVariationalIdentitiesTheory.averageGradient_eq + (responseBasicVariationalIdentitiesTheory U a) hv + +/-- Public averaged-flux formula +`e.v.spatial.averages.basic.definitions`. -/ +theorem averageFlux_eq_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} + {v : Solution U a} (hv : IsResponseMaximizer U a p q v) : + averageFlux U a v = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse U a) p := by + simpa [bCoarse] using + ResponseBasicVariationalIdentitiesTheory.averageFlux_eq + (responseBasicVariationalIdentitiesTheory U a) hv + +/-- The whole-domain averaged gradient of the public canonical maximizer is the +canonical coarse-matrix formula. This is a finite-dimensional consequence of +the variational identities; it is not a measurable-selection statement for the +maximizer field. -/ +theorem averageGradient_canonicalMaximizer_eq {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + averageGradient U a (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := + averageGradient_eq_of_isResponseMaximizer + (canonicalMaximizer_isMaximizer (responseExistenceTheory U a) p q) + +/-- The whole-domain averaged flux of the public canonical maximizer is the +canonical coarse-matrix formula. -/ +theorem averageFlux_canonicalMaximizer_eq {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + averageFlux U a (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse U a) p := + averageFlux_eq_of_isResponseMaximizer + (canonicalMaximizer_isMaximizer (responseExistenceTheory U a) p q) + +/-- Block-matrix form of `averageGradient_canonicalMaximizer_eq`. Chapter 4 +uses this finite formula as the measurable representative of the whole-cube +canonical averaged gradient. -/ +theorem averageGradient_canonicalMaximizer_eq_blockMatrix {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + averageGradient U a (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := by + rw [averageGradient_canonicalMaximizer_eq] + simp [sub_eq_add_neg, matVecMul_add, matVecMul_mul, neg_matVecMul, add_assoc, + add_left_comm, add_comm] + +/-- Block-matrix form of `averageFlux_canonicalMaximizer_eq`. Chapter 4 uses +this finite formula as the measurable representative of the whole-cube +canonical averaged flux. -/ +theorem averageFlux_canonicalMaximizer_eq_blockMatrix {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + averageFlux U a (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := by + rw [averageFlux_canonicalMaximizer_eq] + simp [sub_eq_add_neg, matVecMul_mul, neg_matVecMul, add_left_comm, add_comm] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentitiesDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentitiesDefinitions.lean new file mode 100644 index 0000000000..bb85843b7f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BasicVariationalIdentitiesDefinitions.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction + +/-! # Basic Variational Identities Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for Lemma +`l.basic.cg.identities.basic.definitions`. + +This packages exactly the basic variational identities of Section 2.3.1: +the matrix order chain `e.cg.bounds.basic.definitions`, the second-variation +identity `e.quadresp.basic.definitions`, the maximizer energy identity +`e.Jenergyv.basic.definitions`, and the averaged-gradient/flux formulas +`e.v.spatial.averages.basic.definitions`. + +The canonical public theorem proving this package is +`responseBasicVariationalIdentitiesTheory` in +`BasicVariationalIdentities.lean`. +-/ +structure ResponseBasicVariationalIdentitiesTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) (M : CoarseMatrices d) : Prop where + matrix_identities : ResponseMatrixIdentities U a M + sigmaStar_symm : M.sigmaStar.IsSymm + harmonicMean_le_sigmaStar : + MatLoewnerLE (averagedSymmPartInv U a)⁻¹ M.sigmaStar + sigmaStar_le_sigma : + MatLoewnerLE M.sigmaStar M.sigma + sigma_le_b : + MatLoewnerLE M.sigma M.b + b_le_averagedSymmPartPlusCorrection : + MatLoewnerLE M.b (averagedSymmPartPlusCorrection U a) + second_variation : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + ∀ w : Solution U a, + responseJ U a p q - responseValue U a p q w = + secondVariationEnergyValue U a v w + maximizer_energy : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + responseJ U a p q = (1 / 2 : ℝ) * variationEnergyValue U a v + average_gradient : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + averageGradient U a v = + -p + matVecMul M.sigmaStarInv (q + matVecMul M.kappa p) + average_flux : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + averageFlux U a v = + q - matVecMul (matTranspose M.kappa) (matVecMul M.sigmaStarInv q) - + matVecMul M.b p + +namespace ResponseBasicVariationalIdentitiesTheory + +/-- The basic variational identities depend only on the coefficient field up +to a.e. equality on the public domain. The matrix package is fixed; canonical +packages can be rewritten separately by `coarseMatrices_eq_ofAEEq`. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {M : CoarseMatrices d} + (hTheory : ResponseBasicVariationalIdentitiesTheory U a M) : + ResponseBasicVariationalIdentitiesTheory U b M where + matrix_identities := hTheory.matrix_identities.ofAEEq h + sigmaStar_symm := hTheory.sigmaStar_symm + harmonicMean_le_sigmaStar := by + simpa [averagedSymmPartInv_eq_ofAEEq h] using + hTheory.harmonicMean_le_sigmaStar + sigmaStar_le_sigma := hTheory.sigmaStar_le_sigma + sigma_le_b := hTheory.sigma_le_b + b_le_averagedSymmPartPlusCorrection := by + simpa [averagedSymmPartPlusCorrection_eq_ofAEEq h] using + hTheory.b_le_averagedSymmPartPlusCorrection + second_variation := by + intro p q v hv w + let va : Solution U a := Solution.ofAEEq h.symm v + let wa : Solution U a := Solution.ofAEEq h.symm w + have hmax : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hOld := hTheory.second_variation p q va hmax wa + simpa [va, wa, responseJ_eq_ofAEEq h p q, + responseValue_ofAEEq h.symm p q w, + secondVariationEnergyValue_ofAEEq h.symm v w] using hOld + maximizer_energy := by + intro p q v hv + let va : Solution U a := Solution.ofAEEq h.symm v + have hmax : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hOld := hTheory.maximizer_energy p q va hmax + simpa [va, responseJ_eq_ofAEEq h p q, + variationEnergyValue_ofAEEq h.symm v] using hOld + average_gradient := by + intro p q v hv + let va : Solution U a := Solution.ofAEEq h.symm v + have hmax : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hOld := hTheory.average_gradient p q va hmax + simpa [va, averageGradient_ofAEEq h.symm v] using hOld + average_flux := by + intro p q v hv + let va : Solution U a := Solution.ofAEEq h.symm v + have hmax : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hOld := hTheory.average_flux p q va hmax + simpa [va, averageFlux_ofAEEq h.symm v] using hOld + +/-- A.e.-equivalent coefficient representatives satisfy the same basic +variational theorem package for a fixed matrix package. -/ +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {M : CoarseMatrices d} : + ResponseBasicVariationalIdentitiesTheory U a M ↔ + ResponseBasicVariationalIdentitiesTheory U b M := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +/-- The basic variational identities contain the matrix-extraction identities. -/ +theorem toResponseMatrixIdentities {d : ℕ} {U : Domain d} {a : CoeffOn U} + {M : CoarseMatrices d} + (h : ResponseBasicVariationalIdentitiesTheory U a M) : + ResponseMatrixIdentities U a M := + h.matrix_identities + +/-- Accessor for the second-variation identity +`e.quadresp.basic.definitions`. -/ +theorem secondVariation_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} + {M : CoarseMatrices d} + (h : ResponseBasicVariationalIdentitiesTheory U a M) + {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) (w : Solution U a) : + responseJ U a p q - responseValue U a p q w = + secondVariationEnergyValue U a v w := + h.second_variation p q v hv w + +/-- Accessor for the maximizer energy identity +`e.Jenergyv.basic.definitions`. -/ +theorem responseJ_eq_energy {d : ℕ} {U : Domain d} {a : CoeffOn U} + {M : CoarseMatrices d} + (h : ResponseBasicVariationalIdentitiesTheory U a M) + {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + responseJ U a p q = (1 / 2 : ℝ) * variationEnergyValue U a v := + h.maximizer_energy p q v hv + +/-- Accessor for the averaged-gradient formula in +`e.v.spatial.averages.basic.definitions`. -/ +theorem averageGradient_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} + {M : CoarseMatrices d} + (h : ResponseBasicVariationalIdentitiesTheory U a M) + {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + averageGradient U a v = + -p + matVecMul M.sigmaStarInv (q + matVecMul M.kappa p) := + h.average_gradient p q v hv + +/-- Accessor for the averaged-flux formula in +`e.v.spatial.averages.basic.definitions`. -/ +theorem averageFlux_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} + {M : CoarseMatrices d} + (h : ResponseBasicVariationalIdentitiesTheory U a M) + {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + averageFlux U a v = + q - matVecMul (matTranspose M.kappa) (matVecMul M.sigmaStarInv q) - + matVecMul M.b p := + h.average_flux p q v hv + +end ResponseBasicVariationalIdentitiesTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrix.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrix.lean new file mode 100644 index 0000000000..73958c84b5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrix.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockCoarseMatrix + +/-! # Block Coarse Matrix -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 coarse block matrix theorem +`l.block.coarse.matrices.basic.definitions`. -/ +theorem blockCoarseMatrixTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + BlockCoarseMatrixTheory U a := + Homogenization.Internal.Ch02.BookCh02.blockCoarseMatrixTheory U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrixDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrixDefinitions.lean new file mode 100644 index 0000000000..3df874ef9a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockCoarseMatrixDefinitions.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponseDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScalingDefinitions + +/-! # Block Coarse Matrix Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for `l.block.coarse.matrices.basic.definitions`. + +This is the block-matrix surface that connects the doubled formalism back to +the scalar coarse matrices without exposing legacy coarse-data witnesses. The +canonical public theorem proving this package is `blockCoarseMatrixTheory` in +`BlockCoarseMatrix.lean`. -/ +structure BlockCoarseMatrixTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Prop where + doubled_response_splitting : + ∀ P Q : BlockVec d, + doubledResponseJ U a P Q = + (1 / 2 : ℝ) * + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) + + (1 / 2 : ℝ) * + blockVecDot Q (blockMatVecMul (coarseStarredBlockMatrixInv U a) Q) - + blockVecDot P Q + block_matrix_formula : + coarseBlockMatrix U a = blockMatrixOfCoarseMatrices (coarseMatrices U a) + starred_inverse_formula : + coarseStarredBlockMatrixInv U a = blockReflect (coarseBlockMatrix U a) + block_matrix_posDef : + BlockPosDef (coarseBlockMatrix U a) + starred_matrix_posDef : + BlockPosDef (coarseStarredBlockMatrix U a) + starred_inverse_posDef : + BlockPosDef (coarseStarredBlockMatrixInv U a) + starred_left_inverse : + blockMatMul (coarseStarredBlockMatrix U a) (coarseStarredBlockMatrixInv U a) = + blockIdentity d + starred_right_inverse : + blockMatMul (coarseStarredBlockMatrixInv U a) (coarseStarredBlockMatrix U a) = + blockIdentity d + block_matrix_subadditive : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)), + (∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) → + BlockMatLoewnerLE (coarseBlockMatrix U a) + (P.weightedBlockAverage fun i => coarseBlockMatrix (P.cell i) (aCell i)) + starred_inverse_subadditive : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)), + (∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) → + BlockMatLoewnerLE (coarseStarredBlockMatrixInv U a) + (P.weightedBlockAverage fun i => + coarseStarredBlockMatrixInv (P.cell i) (aCell i)) + adjoint_sigma : + sigmaCoarse U a.transpose = sigmaCoarse U a + adjoint_sigmaStar : + sigmaStarCoarse U a.transpose = sigmaStarCoarse U a + adjoint_kappa : + kappaCoarse U a.transpose = -kappaCoarse U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixField.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixField.lean new file mode 100644 index 0000000000..5a521cff3c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixField.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockMatrixField + +/-! # Block Matrix Field -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 block-matrix field algebra theorem +`l.block.matrix.field.basic.definitions`. -/ +theorem blockMatrixFieldAlgebraTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + BlockMatrixFieldAlgebraTheory U a := + Homogenization.Internal.Ch02.BookCh02.blockMatrixFieldAlgebraTheory U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixFieldDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixFieldDefinitions.lean new file mode 100644 index 0000000000..481fd88efe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/BlockMatrixFieldDefinitions.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block + +/-! # Block Matrix Field Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for `l.block.matrix.field.basic.definitions`. + +All coefficient-field conclusions are a.e. on the Chapter 2 domain, preserving +the public a.e.-native coefficient interface. The canonical public theorem +proving this package is `blockMatrixFieldAlgebraTheory` in +`BlockMatrixField.lean`. -/ +structure BlockMatrixFieldAlgebraTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Prop where + field_symmetric : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + IsSymmetricBlockMat (blockMatrixField a x) + field_posDef : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + BlockPosDef (blockMatrixField a x) + factorization : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + blockMatrixField a x = + blockMatMul (blockMatTranspose (blockG (-skewPart (a.toCoeffField x)))) + (blockMatMul + (blockDiag (symmPart (a.toCoeffField x)) + ((symmPart (a.toCoeffField x))⁻¹)) + (blockG (-skewPart (a.toCoeffField x)))) + inverse_formula : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + blockMatrixInverseField a x = blockReflect (blockMatrixField a x) + energy_density : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + ∀ X : BlockVec d, + blockEnergyDensityAt a X x = + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (blockMatrixField a x) X) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimates.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimates.lean new file mode 100644 index 0000000000..5bdf6c0bae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimates.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic + +/-! # Coarse Graining Estimates -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem for `l.cg.response.estimates.basic.definitions`. -/ +theorem responseCoarseGrainingEstimatesTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ResponseCoarseGrainingEstimatesTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseCoarseGrainingEstimatesTheory U a + +/-- The averaged gradient is controlled by the `σ_*^{-1}` operator norm times +the quadratic variation energy. -/ +theorem vecNormSq_averageGradient_le_matrixNorm_sigmaStarInvCoarse_mul_variationEnergyValue + {d : ℕ} (U : Domain d) (a : CoeffOn U) (w : Solution U a) : + vecNormSq (averageGradient U a w) ≤ + matrixNorm (sigmaStarInvCoarse U a) * variationEnergyValue U a w := by + let avgGrad := averageGradient U a w + have henergy : + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) ≤ + variationEnergyValue U a w := by + have hraw := + (responseCoarseGrainingEstimatesTheory U a).average_gradient_energy w + simpa [avgGrad] using (show + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) ≤ + variationEnergyValue U a w from by + nlinarith [hraw]) + have hleft : + ∀ ξ : Vec d, + matVecMul (sigmaStarInvCoarse U a) + (matVecMul (sigmaStarCoarse U a) ξ) = ξ := by + intro ξ + rw [matVecMul_mul, + sigmaStarInvCoarse_mul_sigmaStarCoarse + (isUnit_det_sigmaStarInvCoarse U a)] + funext i + unfold matVecMul + rw [Finset.sum_eq_single i] + · simp + · intro j _hj hji + have hij : i ≠ j := by + intro h + exact hji h.symm + simp [hij] + · simp + have hnorm : + vecNormSq avgGrad ≤ + matrixNorm (sigmaStarInvCoarse U a) * + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) := + vecNormSq_le_matrixNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := sigmaStarCoarse U a) (B := sigmaStarInvCoarse U a) + (sigmaStarInvCoarse_posDef U a).posSemidef hleft avgGrad + exact hnorm.trans + (mul_le_mul_of_nonneg_left henergy (matrixNorm_nonneg _)) + +/-- The averaged flux is controlled by the `b` operator norm times the +quadratic variation energy. -/ +theorem vecNormSq_averageFlux_le_matrixNorm_bCoarse_mul_variationEnergyValue + {d : ℕ} (U : Domain d) (a : CoeffOn U) (w : Solution U a) : + vecNormSq (averageFlux U a w) ≤ + matrixNorm (bCoarse U a) * variationEnergyValue U a w := by + let avgFlux := averageFlux U a w + have henergy : + vecDot avgFlux (matVecMul ((bCoarse U a)⁻¹) avgFlux) ≤ + variationEnergyValue U a w := by + have hraw := + (responseCoarseGrainingEstimatesTheory U a).average_flux_energy w + simpa [avgFlux] using (show + vecDot avgFlux (matVecMul ((bCoarse U a)⁻¹) avgFlux) ≤ + variationEnergyValue U a w from by + nlinarith [hraw]) + have hdet : IsUnit (bCoarse U a).det := + (Matrix.isUnit_iff_isUnit_det (A := bCoarse U a)).mp + (bCoarse_posDef U a).isUnit + have hleft : + ∀ ξ : Vec d, + matVecMul (bCoarse U a) (matVecMul ((bCoarse U a)⁻¹) ξ) = ξ := by + intro ξ + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hdet] + funext i + unfold matVecMul + rw [Finset.sum_eq_single i] + · simp + · intro j _hj hji + have hij : i ≠ j := by + intro h + exact hji h.symm + simp [hij] + · simp + have hnorm : + vecNormSq avgFlux ≤ + matrixNorm (bCoarse U a) * + vecDot avgFlux (matVecMul ((bCoarse U a)⁻¹) avgFlux) := + vecNormSq_le_matrixNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := (bCoarse U a)⁻¹) (B := bCoarse U a) + (bCoarse_posDef U a).posSemidef hleft avgFlux + exact hnorm.trans + (mul_le_mul_of_nonneg_left henergy (matrixNorm_nonneg _)) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimatesDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimatesDefinitions.lean new file mode 100644 index 0000000000..2a1fe52672 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/CoarseGrainingEstimatesDefinitions.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentitiesDefinitions + +/-! # Coarse Graining Estimates Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for `l.cg.response.estimates.basic.definitions`. + +The canonical public theorem proving this package is +`responseCoarseGrainingEstimatesTheory` in `CoarseGrainingEstimates.lean`. -/ +structure ResponseCoarseGrainingEstimatesTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Prop where + linear_response : + ∀ p q : Vec d, ∀ w : Solution U a, + |average U + (fun x => + vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot q (w.toH1.grad x))| ≤ + Real.sqrt (variationEnergyValue U a w) * + Real.sqrt ((2 : ℝ) * responseJ U a p q) + coarse_graining : + ∀ p : Vec d, ∀ w : Solution U a, + |vecDot p + (matVecMul (aStarCoarse U a) (averageGradient U a w) - + averageFlux U a w)| ≤ + Real.sqrt (2 : ℝ) * + Real.sqrt + (vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) * + Real.sqrt (variationEnergyValue U a w) + average_gradient_energy : + ∀ w : Solution U a, + (1 / 2 : ℝ) * + vecDot (averageGradient U a w) + (matVecMul (sigmaStarCoarse U a) (averageGradient U a w)) ≤ + (1 / 2 : ℝ) * variationEnergyValue U a w + average_flux_energy : + ∀ w : Solution U a, + (1 / 2 : ℝ) * + vecDot (averageFlux U a w) + (matVecMul ((bCoarse U a)⁻¹) (averageFlux U a w)) ≤ + (1 / 2 : ℝ) * variationEnergyValue U a w + +namespace ResponseCoarseGrainingEstimatesTheory + +/-- The coarse-graining estimates depend only on the public coefficient +representative up to a.e. equality on the domain. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hTheory : ResponseCoarseGrainingEstimatesTheory U a) : + ResponseCoarseGrainingEstimatesTheory U b where + linear_response := by + intro p q w + let wa : Solution U a := Solution.ofAEEq h.symm w + have hAvg : + average U + (fun x => + vecDot p (matVecMul (b.toCoeffField x) (w.toH1.grad x)) - + vecDot q (w.toH1.grad x)) = + average U + (fun x => + vecDot p (matVecMul (a.toCoeffField x) (wa.toH1.grad x)) - + vecDot q (wa.toH1.grad x)) := by + unfold average + congr 1 + exact MeasureTheory.integral_congr_ae <| h.symm.mono fun x hx => by + simp [wa, hx] + have hOld := hTheory.linear_response p q wa + simpa [wa, hAvg, variationEnergyValue_ofAEEq h.symm w, + responseJ_eq_ofAEEq h p q] using hOld + coarse_graining := by + intro p w + let wa : Solution U a := Solution.ofAEEq h.symm w + have hOld := hTheory.coarse_graining p wa + simpa [wa, aStarCoarse_eq_ofAEEq h, sigmaCoarse_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h, averageGradient_ofAEEq h.symm w, + averageFlux_ofAEEq h.symm w, variationEnergyValue_ofAEEq h.symm w] + using hOld + average_gradient_energy := by + intro w + let wa : Solution U a := Solution.ofAEEq h.symm w + have hOld := hTheory.average_gradient_energy wa + simpa [wa, sigmaStarCoarse_eq_ofAEEq h, + averageGradient_ofAEEq h.symm w, + variationEnergyValue_ofAEEq h.symm w] using hOld + average_flux_energy := by + intro w + let wa : Solution U a := Solution.ofAEEq h.symm w + have hOld := hTheory.average_flux_energy wa + simpa [wa, bCoarse_eq_ofAEEq h, averageFlux_ofAEEq h.symm w, + variationEnergyValue_ofAEEq h.symm w] using hOld + +/-- A.e.-equivalent coefficient representatives satisfy the same +coarse-graining estimate package. -/ +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseCoarseGrainingEstimatesTheory U a ↔ + ResponseCoarseGrainingEstimatesTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseCoarseGrainingEstimatesTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DeterministicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DeterministicIdentities.lean new file mode 100644 index 0000000000..91a50b2974 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DeterministicIdentities.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge + +/-! +# Deterministic identities for Chapter 2 observables + +This file is the public Chapter 2 owner for deterministic identities among the +scalar response, doubled `mu`, and block response observables. Chapter 4 may +turn these identities into law-relative measurability statements; it should not +reprove the deterministic algebra. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- The public doubled-`mu` infimum agrees with the deterministic block `Mu` +on the same Chapter 2 domain. This bridge belongs with the deterministic +old-engine identities rather than the clean doubled-`Mu` theorem surface. -/ +theorem doubledMu_eq_Mu {d : ℕ} (U : Domain d) (a : CoeffOn U) (P : BlockVec d) : + doubledMu U a P = Mu (U : Set (Vec d)) P a.toCoeffField := + Homogenization.Internal.Ch02.BookCh02.book_doubledMu_eq_Mu U a P + +/-- The scalar response is the doubled `mu` value at `(-p, q)`, up to the +deterministic pairing term. -/ +theorem responseJ_eq_doubledMu_neg_left_sub_vecDot {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + responseJ U a p q = doubledMu U a (-p, q) - vecDot p q := by + calc + responseJ U a p q = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := + Homogenization.Internal.Ch02.BookCh02.responseJ_eq_block_quadratic U a p q + _ = doubledMu U a (-p, q) - vecDot p q := by + rw [← (doubledMuTheory U a).doubledMu_eq_coarseBlockMatrix (-p, q)] + +/-- Old-engine scalar response equals old-engine `Mu` at `(-p, q)`, up to the +deterministic pairing term. -/ +theorem ResponseJ_eq_Mu_neg_left_sub_vecDot {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + ResponseJ (U : Set (Vec d)) p q a.toCoeffField = + Mu (U : Set (Vec d)) (-p, q) a.toCoeffField - vecDot p q := by + calc + ResponseJ (U : Set (Vec d)) p q a.toCoeffField = responseJ U a p q := + (Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ U a p q).symm + _ = doubledMu U a (-p, q) - vecDot p q := + responseJ_eq_doubledMu_neg_left_sub_vecDot U a p q + _ = Mu (U : Set (Vec d)) (-p, q) a.toCoeffField - vecDot p q := by + rw [Homogenization.Internal.Ch02.BookCh02.book_doubledMu_eq_Mu U a (-p, q)] + +/-- Cube-set form of `ResponseJ_eq_Mu_neg_left_sub_vecDot`. -/ +theorem ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) (p q : Vec d) : + ResponseJ (cubeSet Q) p q a.toCoeffField = + Mu (cubeSet Q) (-p, q) a.toCoeffField - vecDot p q := by + calc + ResponseJ (cubeSet Q) p q a.toCoeffField = + ResponseJ (openCubeSet Q) p q a.toCoeffField := + responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a.toCoeffField + _ = Mu (openCubeSet Q) (-p, q) a.toCoeffField - vecDot p q := by + simpa [cubeDomain_coe] using ResponseJ_eq_Mu_neg_left_sub_vecDot + (cubeDomain Q) a p q + _ = Mu (cubeSet Q) (-p, q) a.toCoeffField - vecDot p q := by + rw [Mu_cubeSet_eq_openCubeSet_of_triadicCube + (Q := Q) (P := (-p, q)) (a := a.toCoeffField)] + +/-- Public scalar splitting for doubled response. -/ +theorem doubledResponseJ_eq_half_responseJ_adjoint_sum {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p pStar q qStar : Vec d) : + doubledResponseJ U a (p, q) (qStar, pStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + (doubledResponseTheory U a).doubledResponseJ_eq_scalar p pStar q qStar + +/-- Public bridge from doubled response to the old-engine `BlockJ`, under the +pointwise ellipticity hypothesis required by the old block response space. -/ +theorem doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (P Q : BlockVec d) : + doubledResponseJ U a P Q = + BlockJ (U : Set (Vec d)) P Q a.toCoeffField := + Homogenization.Internal.Ch02.BookCh02.book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn + U a hEll P Q + +/-- Old-engine `BlockJ` is the half-sum of the scalar responses for `a` and its +adjoint. -/ +theorem BlockJ_eq_half_ResponseJ_adjoint_sum_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p pStar q qStar : Vec d) : + BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField = + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) + (p - pStar) (qStar - q) a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) + (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField) := by + calc + BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField = + doubledResponseJ U a (p, q) (qStar, pStar) := by + exact (doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn + U a hEll (p, q) (qStar, pStar)).symm + _ = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + doubledResponseJ_eq_half_responseJ_adjoint_sum U a p pStar q qStar + _ = + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) + (p - pStar) (qStar - q) a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) + (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField) := by + rw [Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ U a, + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ U a.transpose] + have hAdj : a.transpose.toCoeffField = adjointCoeffField a.toCoeffField := by + funext x + rfl + rw [hAdj] + +/-- Cube-set form of the deterministic `BlockJ` half-sum identity. -/ +theorem BlockJ_cubeSet_eq_half_ResponseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) + (hEll : IsEllipticFieldOn a.lam a.Lam (openCubeSet Q) a.toCoeffField) + (p pStar q qStar : Vec d) : + BlockJ (cubeSet Q) (p, q) (qStar, pStar) a.toCoeffField = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) + (p - pStar) (qStar - q) a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) + (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField) := by + calc + BlockJ (cubeSet Q) (p, q) (qStar, pStar) a.toCoeffField = + BlockJ (openCubeSet Q) (p, q) (qStar, pStar) a.toCoeffField := + BlockJ_cubeSet_eq_openCubeSet_of_triadicCube Q (p, q) (qStar, pStar) + a.toCoeffField + _ = + (1 / 2 : ℝ) * ResponseJ (openCubeSet Q) + (p - pStar) (qStar - q) a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (openCubeSet Q) + (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField) := by + simpa [cubeDomain_coe] using + BlockJ_eq_half_ResponseJ_adjoint_sum_of_isEllipticFieldOn + (cubeDomain Q) a (by simpa [cubeDomain_coe] using hEll) p pStar q qStar + _ = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) + (p - pStar) (qStar - q) a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) + (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField) := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube + Q (p - pStar) (qStar - q) a.toCoeffField, + ← responseJ_cubeSet_eq_openCubeSet_of_triadicCube + Q (pStar + p) (qStar + q) (adjointCoeffField a.toCoeffField)] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Dilation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Dilation.lean new file mode 100644 index 0000000000..2229c7b7c9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Dilation.lean @@ -0,0 +1,954 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError + +/-! # Dilation -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius Pointwise ENNReal + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- A cube dilated by `3^k` and then by `3^{-k}` returns to itself. -/ +theorem dilateCube_neg_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + dilateCube (-k) (dilateCube k Q) = Q := by + cases Q + simp [dilateCube] + +/-- A cube dilated by `3^{-k}` and then by `3^k` returns to itself. -/ +theorem dilateCube_dilateCube_neg {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + dilateCube k (dilateCube (-k) Q) = Q := by + cases Q + simp [dilateCube] + +/-- Normalizing a cube by dilation through `-Q.scale` gives a scale-zero cube. -/ +@[simp] theorem dilateCube_neg_scale_scale {d : ℕ} (Q : TriadicCube d) : + (dilateCube (-Q.scale) Q).scale = 0 := by + simp [dilateCube] + +/-- Dilation by `3 ^ k` maps points of a triadic cube into points of the +dilated triadic cube. -/ +theorem dilateVec_mem_openCubeSet_dilateCube {d : ℕ} (k : ℤ) + {Q : TriadicCube d} {x : Vec d} (hx : x ∈ openCubeSet Q) : + dilateVec k x ∈ openCubeSet (dilateCube k Q) := by + intro i + let r : ℝ := triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact triadicDilationFactor_pos k + have hxi := hx i + constructor + · have hmul := mul_lt_mul_of_pos_left hxi.1 hr + simpa [dilateVec, cubeScaleFactor_dilateCube, + r, Pi.smul_apply, smul_eq_mul, mul_assoc, mul_comm, mul_left_comm] + using hmul + · have hmul := mul_lt_mul_of_pos_left hxi.2 hr + simpa [dilateVec, cubeScaleFactor_dilateCube, + r, Pi.smul_apply, smul_eq_mul, mul_assoc, mul_comm, mul_left_comm] + using hmul + +/-- Dilation by `3^{-k}` is the inverse of dilation by `3^k`. -/ +theorem dilateVec_neg_dilateVec {d : ℕ} (k : ℤ) (x : Vec d) : + dilateVec (-k) (dilateVec k x) = x := by + ext i + simp [dilateVec, triadicDilationFactor, smul_eq_mul, zpow_neg] + field_simp [zpow_ne_zero k (by norm_num : (3 : ℝ) ≠ 0)] + +/-- Dilation by `3^k` is the inverse of dilation by `3^{-k}`. -/ +theorem dilateVec_dilateVec_neg {d : ℕ} (k : ℤ) (x : Vec d) : + dilateVec k (dilateVec (-k) x) = x := by + ext i + simp [dilateVec, triadicDilationFactor, smul_eq_mul, zpow_neg] + field_simp [zpow_ne_zero k (by norm_num : (3 : ℝ) ≠ 0)] + +/-- Undilating preserves cube containment relations. -/ +theorem openCubeSet_undilate_subset_of_subset {d : ℕ} (k : ℤ) + {Q R : TriadicCube d} (hsub : openCubeSet R ⊆ openCubeSet Q) : + openCubeSet (dilateCube (-k) R) ⊆ openCubeSet (dilateCube (-k) Q) := by + intro x hx + have hxR0 : dilateVec k x ∈ openCubeSet (dilateCube k (dilateCube (-k) R)) := + dilateVec_mem_openCubeSet_dilateCube k hx + have hxR : dilateVec k x ∈ openCubeSet R := by + simpa [dilateCube_dilateCube_neg] using hxR0 + have hxQ : dilateVec k x ∈ openCubeSet Q := hsub hxR + have hxQ0 : + dilateVec (-k) (dilateVec k x) ∈ openCubeSet (dilateCube (-k) Q) := + dilateVec_mem_openCubeSet_dilateCube (-k) hxQ + simpa [dilateVec_neg_dilateVec] using hxQ0 + +/-- Pull an a.e. coefficient-field equality forward to the dilated cube. -/ +theorem eventuallyEq_comp_undilate_of_ae_eq {d : ℕ} (k : ℤ) + {Q : TriadicCube d} {f g : Vec d → Mat d} + (hfg : f =ᵐ[volumeMeasureOn (openCubeSet Q)] g) : + (fun x : Vec d => f (undilateVec k x)) + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => g (undilateVec k x) := by + let r : ℝ := triadicDilationFactor k + have hr : 0 < r := by + simpa [r] using triadicDilationFactor_pos k + have hpre : r⁻¹ • openCubeSet (dilateCube k Q) = openCubeSet Q := by + rw [openCubeSet_dilateCube k Q] + ext x + simp [r, triadicDilationFactor_ne_zero k] + have hmap : + MeasureTheory.Measure.map (fun x : Vec d => undilateVec k x) + (volumeMeasureOn (openCubeSet (dilateCube k Q))) = + ENNReal.ofReal (((r⁻¹) ^ d)⁻¹) • + volumeMeasureOn (openCubeSet Q) := by + have h := + Homogenization.map_smul_volume_restrict (d := d) (a := r⁻¹) + (inv_pos.mpr hr) (openCubeSet (dilateCube k Q)) + simpa [volumeMeasureOn, undilateVec, r, hpre] using h + have hfgMap : + f =ᵐ[MeasureTheory.Measure.map (fun x : Vec d => undilateVec k x) + (volumeMeasureOn (openCubeSet (dilateCube k Q)))] g := by + rw [hmap] + exact + MeasureTheory.Measure.AbsolutelyContinuous.ae_eq + MeasureTheory.Measure.smul_absolutelyContinuous hfg + exact MeasureTheory.ae_of_ae_map (measurable_const_smul _).aemeasurable hfgMap + +namespace CoeffOn + +/-- A concrete public coefficient object on a dilated cube. + +The representative is chosen via the pointwise-good representative of the +source coefficient object, but the public relation below records only the +intended a.e. pullback relation. -/ +noncomputable def dilate {d : ℕ} (k : ℤ) {Q : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) : + CoeffOn (cubeDomain (dilateCube k Q)) where + toCoeffField := + dilateCoeffField k + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a) + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + classical + intro i j + have hcoeff : Measurable fun x : Vec d => + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a (undilateVec k x) i j := by + have hbase : Measurable fun y : Vec d => + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a y i j := by + exact + (measurable_pi_iff.1 + (measurable_pi_iff.1 + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_measurable + (cubeDomain Q) a) i) j) + exact hbase.comp (measurable_const_smul _) + have hentry : Measurable fun x : Vec d => + restrictCoeffField (openCubeSet (dilateCube k Q)) + (dilateCoeffField k + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a)) x i j := by + have hite : + Measurable fun x : Vec d => + if x ∈ openCubeSet (dilateCube k Q) then + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a (undilateVec k x) i j + else 0 := + Measurable.ite (measurableSet_openCubeSet (dilateCube k Q)) + hcoeff measurable_const + convert hite using 1 + funext x + by_cases hx : x ∈ openCubeSet (dilateCube k Q) <;> + simp [restrictCoeffField, dilateCoeffField, hx] + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (dilateCube k Q))] with x hx + have hxopen : x ∈ openCubeSet (dilateCube k Q) := by simpa using hx + have hxpre : undilateVec k x ∈ openCubeSet Q := by + rw [openCubeSet_dilateCube k Q] at hxopen + rcases hxopen with ⟨y, hy, hxy⟩ + subst x + simpa [undilateVec, smul_smul, triadicDilationFactor_ne_zero k] using hy + exact + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) a).2 (undilateVec k x) hxpre + +/-- The concrete dilated coefficient object is a public a.e. cube dilation. -/ +theorem dilate_isCubeDilation {d : ℕ} (k : ℤ) {Q : TriadicCube d} + (a : CoeffOn (cubeDomain Q)) : + IsCubeDilation k a (dilate k a) := by + refine ⟨rfl, rfl, ?_⟩ + let r : ℝ := triadicDilationFactor k + have hr : 0 < r := by + simpa [r] using triadicDilationFactor_pos k + have hpre : r⁻¹ • openCubeSet (dilateCube k Q) = openCubeSet Q := by + rw [openCubeSet_dilateCube k Q] + ext x + simp [r, triadicDilationFactor_ne_zero k] + have hmap : + MeasureTheory.Measure.map (fun x : Vec d => undilateVec k x) + (volumeMeasureOn (openCubeSet (dilateCube k Q))) = + ENNReal.ofReal (((r⁻¹) ^ d)⁻¹) • + volumeMeasureOn (openCubeSet Q) := by + have h := + Homogenization.map_smul_volume_restrict (d := d) (a := r⁻¹) + (inv_pos.mpr hr) (openCubeSet (dilateCube k Q)) + simpa [volumeMeasureOn, undilateVec, r, hpre] using h + have hpoint : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a + =ᵐ[volumeMeasureOn (openCubeSet Q)] a.toCoeffField := by + simpa using + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain Q) a + have hpointMap : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a + =ᵐ[MeasureTheory.Measure.map (fun x : Vec d => undilateVec k x) + (volumeMeasureOn (openCubeSet (dilateCube k Q)))] a.toCoeffField := by + rw [hmap] + exact + MeasureTheory.Measure.AbsolutelyContinuous.ae_eq + MeasureTheory.Measure.smul_absolutelyContinuous hpoint + have hpull : + (fun x : Vec d => + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) a (undilateVec k x)) + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + fun x => a.toCoeffField (undilateVec k x) := + MeasureTheory.ae_of_ae_map (measurable_const_smul _).aemeasurable hpointMap + exact hpull.mono fun x hx => by + simp [dilate, dilateCoeffField, hx] + +/-- Dilation preserves public a.e. restriction of coefficient objects. -/ +theorem dilate_restrictsTo {d : ℕ} (k : ℤ) {Q R : TriadicCube d} + {aQ : CoeffOn (cubeDomain Q)} {aR : CoeffOn (cubeDomain R)} + (hsub : openCubeSet R ⊆ openCubeSet Q) + (h : RestrictsTo aQ aR) : + RestrictsTo (dilate k aQ) (dilate k aR) := by + have hpointR : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain R) aR + =ᵐ[volumeMeasureOn (openCubeSet R)] aR.toCoeffField := by + simpa using + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain R) aR + have hpointQ_on_R : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) aQ + =ᵐ[volumeMeasureOn (openCubeSet R)] aQ.toCoeffField := by + exact + MeasureTheory.ae_restrict_of_ae_restrict_of_subset hsub + (by + simpa using! + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain Q) aQ) + have hsource : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain R) aR + =ᵐ[volumeMeasureOn (openCubeSet R)] + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) aQ := + hpointR.trans (h.trans hpointQ_on_R.symm) + have hpull := eventuallyEq_comp_undilate_of_ae_eq k hsource + exact hpull.mono fun x hx => by + simp [dilate, dilateCoeffField, hx] + +end CoeffOn + +namespace TriadicCoeffFamily + +/-- The coefficient object assigned to a target cube by the dilated coefficient +family. The source cube is the undilated target cube. -/ +noncomputable def dilatedCoeffOnAt {d : ℕ} (k : ℤ) + (a : TriadicCoeffFamily d) (R : TriadicCube d) : + CoeffOn (cubeDomain R) where + toCoeffField := + dilateCoeffField k + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain (dilateCube (-k) R)) + (a.coeffOn (dilateCube (-k) R))) + lam := (a.coeffOn (dilateCube (-k) R)).lam + Lam := (a.coeffOn (dilateCube (-k) R)).Lam + lam_pos := (a.coeffOn (dilateCube (-k) R)).lam_pos + lam_le_Lam := (a.coeffOn (dilateCube (-k) R)).lam_le_Lam + aeStronglyMeasurable := by + classical + intro i j + let Q : TriadicCube d := dilateCube (-k) R + have hcoeff : Measurable fun x : Vec d => + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) (a.coeffOn Q) (undilateVec k x) i j := by + have hbase : Measurable fun y : Vec d => + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) (a.coeffOn Q) y i j := by + exact + (measurable_pi_iff.1 + (measurable_pi_iff.1 + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_measurable + (cubeDomain Q) (a.coeffOn Q)) i) j) + exact hbase.comp (measurable_const_smul _) + have hentry : Measurable fun x : Vec d => + restrictCoeffField (openCubeSet R) + (dilateCoeffField k + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) (a.coeffOn Q))) x i j := by + have hite : + Measurable fun x : Vec d => + if x ∈ openCubeSet R then + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Q) (a.coeffOn Q) (undilateVec k x) i j + else 0 := + Measurable.ite (measurableSet_openCubeSet R) hcoeff measurable_const + convert hite using 1 + funext x + by_cases hx : x ∈ openCubeSet R <;> + simp [restrictCoeffField, dilateCoeffField, Q, hx] + simpa [Q] using hentry.aestronglyMeasurable + aeElliptic := by + let Q : TriadicCube d := dilateCube (-k) R + have hRQ : dilateCube k Q = R := by + simpa [Q] using dilateCube_dilateCube_neg k R + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet R)] with x hx + have hxopenR : x ∈ openCubeSet R := by simpa using hx + have hxopen : x ∈ openCubeSet (dilateCube k Q) := by + simpa [hRQ] using hxopenR + have hxpre : undilateVec k x ∈ openCubeSet Q := by + rw [openCubeSet_dilateCube k Q] at hxopen + rcases hxopen with ⟨y, hy, hxy⟩ + subst x + simpa [undilateVec, smul_smul, triadicDilationFactor_ne_zero k] using hy + exact + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q)).2 (undilateVec k x) hxpre + +/-- The public coefficient-family dilation by `3^k`. -/ +noncomputable def dilate {d : ℕ} (k : ℤ) + (a : TriadicCoeffFamily d) : TriadicCoeffFamily d where + coeffOn := dilatedCoeffOnAt k a + restrictsTo_of_subset := by + intro Q R hsub + let Qs : TriadicCube d := dilateCube (-k) Q + let Rs : TriadicCube d := dilateCube (-k) R + have hsub_source : openCubeSet Rs ⊆ openCubeSet Qs := by + simpa [Qs, Rs] using openCubeSet_undilate_subset_of_subset k hsub + have hrest : CoeffOn.RestrictsTo (a.coeffOn Qs) (a.coeffOn Rs) := + a.restrictsTo_of_subset hsub_source + have hpointR : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Rs) (a.coeffOn Rs) + =ᵐ[volumeMeasureOn (openCubeSet Rs)] (a.coeffOn Rs).toCoeffField := by + simpa using + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain Rs) (a.coeffOn Rs) + have hpointQ_on_R : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Qs) (a.coeffOn Qs) + =ᵐ[volumeMeasureOn (openCubeSet Rs)] (a.coeffOn Qs).toCoeffField := by + exact + MeasureTheory.ae_restrict_of_ae_restrict_of_subset hsub_source + (by + simpa using! + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain Qs) (a.coeffOn Qs)) + have hsource : + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Rs) (a.coeffOn Rs) + =ᵐ[volumeMeasureOn (openCubeSet Rs)] + Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Qs) (a.coeffOn Qs) := + hpointR.trans (hrest.trans hpointQ_on_R.symm) + have hpull := eventuallyEq_comp_undilate_of_ae_eq k hsource + simpa [dilatedCoeffOnAt, Qs, Rs, dilateCube_dilateCube_neg, + dilateCoeffField] using! hpull + +/-- The concrete coefficient-family dilation satisfies the public dilation +relation. -/ +theorem isDilation_dilate {d : ℕ} (k : ℤ) (a : TriadicCoeffFamily d) : + IsDilation k a (dilate k a) := by + intro Q + let Qsrc : TriadicCube d := dilateCube (-k) (dilateCube k Q) + have hsrc : Qsrc = Q := by + simpa [Qsrc] using dilateCube_neg_dilateCube k Q + refine ⟨?_, ?_, ?_⟩ + · change (a.coeffOn Qsrc).lam = (a.coeffOn Q).lam + rw [hsrc] + · change (a.coeffOn Qsrc).Lam = (a.coeffOn Q).Lam + rw [hsrc] + · change + dilateCoeffField k + (Homogenization.Internal.Ch02.BookCh02.pointwiseCoeffField + (cubeDomain Qsrc) (a.coeffOn Qsrc)) + =ᵐ[volumeMeasureOn (openCubeSet (dilateCube k Q))] + dilateCoeffField k (a.coeffOn Q).toCoeffField + rw [hsrc] + exact (CoeffOn.dilate_isCubeDilation k (a.coeffOn Q)).coeff_ae_eq + +end TriadicCoeffFamily + +/-- The coarse doubled block matrix is invariant under public cube dilation. -/ +theorem coarseBlockMatrix_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) : + coarseBlockMatrix (cubeDomain (dilateCube k Q)) b = + coarseBlockMatrix (cubeDomain Q) a := by + simp [coarseBlockMatrix, blockMatrixOfCoarseMatrices, coarseMatrices_dilate hCoeff] + +/-- The doubled Dirichlet energy `mu` is invariant under public cube dilation. -/ +theorem doubledMu_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (P : BlockVec d) : + doubledMu (cubeDomain (dilateCube k Q)) b P = + doubledMu (cubeDomain Q) a P := by + calc + doubledMu (cubeDomain (dilateCube k Q)) b P = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeDomain (dilateCube k Q)) b) P) := by + exact (doubledMuTheory (cubeDomain (dilateCube k Q)) b).doubledMu_eq_coarseBlockMatrix P + _ = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeDomain Q) a) P) := by + rw [coarseBlockMatrix_dilate hCoeff] + _ = doubledMu (cubeDomain Q) a P := by + exact ((doubledMuTheory (cubeDomain Q) a).doubledMu_eq_coarseBlockMatrix P).symm + +/-- The doubled response `Jbold` is invariant under public cube dilation. -/ +theorem doubledResponseJ_dilate {d : ℕ} {k : ℤ} {Q : TriadicCube d} + {a : CoeffOn (cubeDomain Q)} + {b : CoeffOn (cubeDomain (dilateCube k Q))} + (hCoeff : CoeffOn.IsCubeDilation k a b) (P R : BlockVec d) : + doubledResponseJ (cubeDomain (dilateCube k Q)) b P R = + doubledResponseJ (cubeDomain Q) a P R := by + rcases P with ⟨p, q⟩ + rcases R with ⟨qStar, pStar⟩ + calc + doubledResponseJ (cubeDomain (dilateCube k Q)) b (p, q) (qStar, pStar) = + (1 / 2 : ℝ) * responseJ (cubeDomain (dilateCube k Q)) b + (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ (cubeDomain (dilateCube k Q)) b.transpose + (pStar + p) (qStar + q) := by + exact (doubledResponseTheory (cubeDomain (dilateCube k Q)) b).doubledResponseJ_eq_scalar + p pStar q qStar + _ = + (1 / 2 : ℝ) * responseJ (cubeDomain Q) a + (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ (cubeDomain Q) a.transpose + (pStar + p) (qStar + q) := by + rw [responseJ_dilate hCoeff, responseJ_dilate hCoeff.transpose] + _ = doubledResponseJ (cubeDomain Q) a (p, q) (qStar, pStar) := by + exact ((doubledResponseTheory (cubeDomain Q) a).doubledResponseJ_eq_scalar + p pStar q qStar).symm + +/-- Dilation of triadic cubes is injective. -/ +theorem dilateCube_injective {d : ℕ} (k : ℤ) : + Function.Injective (dilateCube k : TriadicCube d → TriadicCube d) := by + intro Q R hQR + cases Q with + | mk Qscale Qindex => + cases R with + | mk Rscale Rindex => + have hscale : Qscale + k = Rscale + k := + congrArg TriadicCube.scale hQR + have hscale' : Qscale = Rscale := add_right_cancel hscale + have hindex : Qindex = Rindex := by + funext i + exact congrArg (fun S : TriadicCube d => S.index i) hQR + cases hscale' + cases hindex + rfl + +/-- Children commute with dilation by `3^k`. -/ +theorem childCubes_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + childCubes (dilateCube k Q) = (childCubes Q).image (dilateCube k) := by + classical + ext R + constructor + · intro hR + rcases mem_childCubes_iff.mp hR with ⟨digits, rfl⟩ + let S : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + refine Finset.mem_image.mpr ⟨S, ?_, ?_⟩ + · exact mem_childCubes_iff.mpr ⟨digits, rfl⟩ + · apply congrArg₂ TriadicCube.mk + · simp [S, dilateCube] + omega + · funext i + simp [S, dilateCube] + · intro hR + rcases Finset.mem_image.mp hR with ⟨S, hS, rfl⟩ + rcases mem_childCubes_iff.mp hS with ⟨digits, rfl⟩ + exact mem_childCubes_iff.mpr ⟨digits, by + apply congrArg₂ TriadicCube.mk + · simp [dilateCube] + omega + · funext i + simp [dilateCube]⟩ + +/-- Descendants at fixed depth commute with dilation by `3^k`. -/ +theorem descendantsAtDepth_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + ∀ n : ℕ, + descendantsAtDepth (dilateCube k Q) n = + (descendantsAtDepth Q n).image (dilateCube k) + | 0 => by + simp [descendantsAtDepth] + | n + 1 => by + rw [descendantsAtDepth_succ, + descendantsAtDepth_dilateCube k Q n, + descendantsAtDepth_succ] + rw [Finset.image_biUnion, Finset.biUnion_image] + apply Finset.biUnion_congr rfl + intro R _hR + rw [childCubes_dilateCube] + +/-- Descendants at scale `n` commute with dilation, with scale shifted by `k`. -/ +theorem descendantsAtScale_dilateCube {d : ℕ} (k n : ℤ) (Q : TriadicCube d) : + descendantsAtScale (dilateCube k Q) (n + k) = + (descendantsAtScale Q n).image (dilateCube k) := by + classical + by_cases hn : n ≤ Q.scale + · have hn' : n + k ≤ (dilateCube k Q).scale := by + simp [dilateCube] + omega + have hdepth : + Int.toNat ((dilateCube k Q).scale - (n + k)) = + Int.toNat (Q.scale - n) := by + simp [dilateCube] + rw [descendantsAtScale_eq_descendantsAtDepth (dilateCube k Q) hn', + descendantsAtScale_eq_descendantsAtDepth Q hn, hdepth, + descendantsAtDepth_dilateCube] + · have hnlt : Q.scale < n := lt_of_not_ge hn + have hnlt' : (dilateCube k Q).scale < n + k := by + simp [dilateCube] + omega + rw [descendantsAtScale_eq_empty (dilateCube k Q) hnlt', + descendantsAtScale_eq_empty Q hnlt] + simp + +/-- One-cube upper coarse-matrix norm is dilation invariant. -/ +theorem coarseBMatrixNorm_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) : + coarseBMatrixNorm (dilateCube k Q) b = coarseBMatrixNorm Q a := by + unfold coarseBMatrixNorm + rw [bCoarse_dilate (h Q)] + +/-- One-cube lower coarse-matrix norm is dilation invariant. -/ +theorem coarseSigmaStarInvMatrixNorm_dilate {d : ℕ} {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) : + coarseSigmaStarInvMatrixNorm (dilateCube k Q) b = + coarseSigmaStarInvMatrixNorm Q a := by + unfold coarseSigmaStarInvMatrixNorm + rw [sigmaStarInvCoarse_dilate (h Q)] + +/-- The descendant maximum of `|b|` is dilation invariant, with scale shift. -/ +theorem maxDescendantBMatrixNormAtScale_dilate {d : ℕ} {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (n : ℤ) : + maxDescendantBMatrixNormAtScale (dilateCube k Q) (n + k) b = + maxDescendantBMatrixNormAtScale Q n a := by + unfold maxDescendantBMatrixNormAtScale + rw [descendantsAtScale_dilateCube k n Q] + exact finsetSupReal_image _ _ _ _ fun R _hR => coarseBMatrixNorm_dilate h R + +/-- The descendant maximum of `|sigma_*^{-1}|` is dilation invariant. -/ +theorem maxDescendantSigmaStarInvMatrixNormAtScale_dilate {d : ℕ} {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (n : ℤ) : + maxDescendantSigmaStarInvMatrixNormAtScale (dilateCube k Q) (n + k) b = + maxDescendantSigmaStarInvMatrixNormAtScale Q n a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale + rw [descendantsAtScale_dilateCube k n Q] + exact finsetSupReal_image _ _ _ _ fun R _hR => + coarseSigmaStarInvMatrixNorm_dilate h R + +theorem LambdaSqFinite_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (s q : ℝ) : + LambdaSqFinite (dilateCube k Q) s q b = LambdaSqFinite Q s q a := by + unfold LambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (2 / q)) + apply tsum_congr + intro n + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := maxDescendantBMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => geometricWeight s q n * Real.rpow x (q / 2)) hmax + +theorem lambdaSqFinite_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (s q : ℝ) : + lambdaSqFinite (dilateCube k Q) s q b = lambdaSqFinite Q s q a := by + unfold lambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (-(2 / q))) + apply tsum_congr + intro n + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => geometricWeight s q n * Real.rpow x (q / 2)) hmax + +theorem LambdaSqInfinity_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (s : ℝ) : + LambdaSqInfinity (dilateCube k Q) s b = LambdaSqInfinity Q s a := by + unfold LambdaSqInfinity + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := maxDescendantBMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := maxDescendantBMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax.symm + +theorem lambdaSqInfinity_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (s : ℝ) : + lambdaSqInfinity (dilateCube k Q) s b = lambdaSqInfinity Q s a := by + unfold lambdaSqInfinity + apply congrArg (fun S : ℝ => S⁻¹) + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hscale : + (dilateCube k Q).scale - (n : ℤ) = (Q.scale - (n : ℤ)) + k := by + simp [dilateCube] + omega + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_dilate h Q (Q.scale - (n : ℤ)) + rw [hscale] + exact congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax.symm + +/-- Coarse upper ellipticity is dilation invariant. -/ +theorem LambdaSq_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (s : ℝ) (q : MultiscaleExponent) : + LambdaSq (dilateCube k Q) s q b = LambdaSq Q s q a := by + cases q with + | finite q => + exact LambdaSqFinite_dilate h Q s q + | infinity => + exact LambdaSqInfinity_dilate h Q s + +/-- Coarse lower ellipticity is dilation invariant. -/ +theorem lambdaSq_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (s : ℝ) (q : MultiscaleExponent) : + lambdaSq (dilateCube k Q) s q b = lambdaSq Q s q a := by + cases q with + | finite q => + exact lambdaSqFinite_dilate h Q s q + | infinity => + exact lambdaSqInfinity_dilate h Q s + +theorem LambdaS_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (s : ℝ) : + LambdaS (dilateCube k Q) s b = LambdaS Q s a := by + exact LambdaSq_dilate h Q s (.finite 1) + +theorem lambdaS_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (s : ℝ) : + lambdaS (dilateCube k Q) s b = lambdaS Q s a := by + exact lambdaSq_dilate h Q s (.finite 1) + +theorem ThetaRatio_dilate {d : ℕ} {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (s t : ℝ) : + ThetaRatio (dilateCube k Q) s t b = ThetaRatio Q s t a := by + unfold ThetaRatio + rw [LambdaS_dilate h Q s, lambdaS_dilate h Q t] + +theorem maxDescendantUpperEllipticityAtScale_dilate {d : ℕ} {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (s : ℝ) (q : MultiscaleExponent) : + maxDescendantUpperEllipticityAtScale (dilateCube k Q) (n + k) s q b = + maxDescendantUpperEllipticityAtScale Q n s q a := by + unfold maxDescendantUpperEllipticityAtScale + rw [descendantsAtScale_dilateCube k n Q] + exact finsetSupReal_image _ _ _ _ fun R _hR => LambdaSq_dilate h R s q + +theorem maxDescendantLowerEllipticityInvAtScale_dilate {d : ℕ} {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (s : ℝ) (q : MultiscaleExponent) : + maxDescendantLowerEllipticityInvAtScale (dilateCube k Q) (n + k) s q b = + maxDescendantLowerEllipticityInvAtScale Q n s q a := by + unfold maxDescendantLowerEllipticityInvAtScale + rw [descendantsAtScale_dilateCube k n Q] + exact finsetSupReal_image _ _ _ _ fun R _hR => by + rw [lambdaSq_dilate h R s q] + +theorem normalizedBlockResponseValueSet_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (a0 : Mat d) : + normalizedBlockResponseValueSet (dilateCube k Q) b a0 = + normalizedBlockResponseValueSet Q a a0 := by + ext m + constructor + · rintro ⟨e, he, rfl⟩ + exact ⟨e, he, by rw [doubledResponseJ_dilate (h Q)]⟩ + · rintro ⟨e, he, rfl⟩ + exact ⟨e, he, by rw [doubledResponseJ_dilate (h Q)]⟩ + +theorem normalizedBlockResponseMax_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) (a0 : Mat d) : + normalizedBlockResponseMax (dilateCube k Q) b a0 = + normalizedBlockResponseMax Q a a0 := by + unfold normalizedBlockResponseMax + rw [normalizedBlockResponseValueSet_dilate h Q a0] + +theorem maxDescendantNormalizedBlockResponseAtScale_dilate {d : ℕ} [NeZero d] + {k : ℤ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale (dilateCube k Q) (n + k) b a0 = + maxDescendantNormalizedBlockResponseAtScale Q n a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + rw [descendantsAtScale_dilateCube k n Q] + exact finsetSupReal_image _ _ _ _ fun R _hR => + normalizedBlockResponseMax_dilate h R a0 + +theorem scaleResponseAtScale_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (p : MultiscaleExponent) (a0 : Mat d) : + scaleResponseAtScale (dilateCube k Q) (n + k) p b a0 = + scaleResponseAtScale Q n p a a0 := by + cases p with + | finite p => + unfold scaleResponseAtScale + rw [descendantsAtScale_dilateCube k n Q] + refine congrArg (fun x : ℝ => Real.rpow x (1 / p)) ?_ + refine finsetAverageReal_image _ _ (dilateCube_injective k).injOn _ _ ?_ + intro R _hR + exact congrArg (fun x : ℝ => Real.rpow x (p / 2)) + (normalizedBlockResponseMax_dilate h R a0) + | infinity => + unfold scaleResponseAtScale + exact congrArg (fun x : ℝ => Real.rpow x (1 / 2)) + (maxDescendantNormalizedBlockResponseAtScale_dilate h Q n a0) + +theorem HomogenizationErrorFinite_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (s : ℝ) (p : MultiscaleExponent) (q : ℝ) (a0 : Mat d) : + HomogenizationErrorFinite (dilateCube k Q) (n + k) s p q b a0 = + HomogenizationErrorFinite Q n s p q a a0 := by + unfold HomogenizationErrorFinite + congr 1 + apply tsum_congr + intro l + have hscale : (n + k) - (l : ℤ) = (n - (l : ℤ)) + k := by + omega + have hresp := scaleResponseAtScale_dilate h Q (n - (l : ℤ)) p a0 + simpa [hscale] using + congrArg (fun x => geometricWeight s q l * Real.rpow x q) hresp + +theorem HomogenizationErrorInfinity_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (s : ℝ) (p : MultiscaleExponent) (a0 : Mat d) : + HomogenizationErrorInfinity (dilateCube k Q) (n + k) s p b a0 = + HomogenizationErrorInfinity Q n s p a a0 := by + unfold HomogenizationErrorInfinity + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + have hscale : (n + k) - (l : ℤ) = (n - (l : ℤ)) + k := by + omega + have hresp := scaleResponseAtScale_dilate h Q (n - (l : ℤ)) p a0 + simpa [hscale] using + congrArg (fun x => Real.rpow (3 : ℝ) (-s * (l : ℝ)) * x) hresp + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + have hscale : (n + k) - (l : ℤ) = (n - (l : ℤ)) + k := by + omega + have hresp := scaleResponseAtScale_dilate h Q (n - (l : ℤ)) p a0 + simpa [hscale] using + congrArg (fun x => Real.rpow (3 : ℝ) (-s * (l : ℝ)) * x) hresp.symm + +theorem HomogenizationError_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (n : ℤ) (s : ℝ) (p q : MultiscaleExponent) (a0 : Mat d) : + HomogenizationError (dilateCube k Q) (n + k) s p q b a0 = + HomogenizationError Q n s p q a a0 := by + cases q with + | finite q => + exact HomogenizationErrorFinite_dilate h Q n s p q a0 + | infinity => + exact HomogenizationErrorInfinity_dilate h Q n s p a0 + +theorem HomogenizationErrorOnCube_dilate {d : ℕ} [NeZero d] {k : ℤ} + {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.IsDilation k a b) (Q : TriadicCube d) + (s : ℝ) (p q : MultiscaleExponent) (a0 : Mat d) : + HomogenizationErrorOnCube (dilateCube k Q) s p q b a0 = + HomogenizationErrorOnCube Q s p q a a0 := by + unfold HomogenizationErrorOnCube + simpa [dilateCube] using HomogenizationError_dilate h Q Q.scale s p q a0 + +/-- Proved one-cube dilation theorem package. -/ +theorem cubeDilationTheory (d : ℕ) : CubeDilationTheory d where + solution_dilation_exists := by + intro k Q a b hCoeff u + exact ⟨Solution.dilate hCoeff u⟩ + responseValue_dilate := by + intro k Q a b hCoeff u v hDilation p q + exact responseValue_dilate_of_isCubeDilation hCoeff hDilation p q + variationEnergyValue_dilate := by + intro k Q a b hCoeff u v hDilation + exact variationEnergyValue_dilate_of_isCubeDilation hCoeff hDilation + averageGradient_dilate := by + intro k Q a b hCoeff u v hDilation + exact averageGradient_dilate_of_isCubeDilation hCoeff hDilation + averageFlux_dilate := by + intro k Q a b hCoeff u v hDilation + exact averageFlux_dilate_of_isCubeDilation hCoeff hDilation + responseJ_dilate := by + intro k Q a b hCoeff p q + exact responseJ_dilate hCoeff p q + doubledMu_dilate := by + intro k Q a b hCoeff P + exact doubledMu_dilate hCoeff P + doubledResponseJ_dilate := by + intro k Q a b hCoeff P R + exact doubledResponseJ_dilate hCoeff P R + sigmaCoarse_dilate := by + intro k Q a b hCoeff + exact sigmaCoarse_dilate hCoeff + sigmaStarInvCoarse_dilate := by + intro k Q a b hCoeff + exact sigmaStarInvCoarse_dilate hCoeff + sigmaStarCoarse_dilate := by + intro k Q a b hCoeff + exact sigmaStarCoarse_dilate hCoeff + kappaCoarse_dilate := by + intro k Q a b hCoeff + exact kappaCoarse_dilate hCoeff + coarseMatrices_dilate := by + intro k Q a b hCoeff + exact coarseMatrices_dilate hCoeff + bCoarse_dilate := by + intro k Q a b hCoeff + exact bCoarse_dilate hCoeff + aCoarse_dilate := by + intro k Q a b hCoeff + exact aCoarse_dilate hCoeff + aStarCoarse_dilate := by + intro k Q a b hCoeff + exact aStarCoarse_dilate hCoeff + +/-- Proved Chapter 2.5 multiscale dilation theorem package. -/ +theorem multiscaleDilationTheory (d : ℕ) [NeZero d] : + MultiscaleDilationTheory d where + coarseBMatrixNorm_dilate := by + intro k a b h Q + exact coarseBMatrixNorm_dilate h Q + coarseSigmaStarInvMatrixNorm_dilate := by + intro k a b h Q + exact coarseSigmaStarInvMatrixNorm_dilate h Q + maxDescendantBMatrixNormAtScale_dilate := by + intro k a b h Q n + exact maxDescendantBMatrixNormAtScale_dilate h Q n + maxDescendantSigmaStarInvMatrixNormAtScale_dilate := by + intro k a b h Q n + exact maxDescendantSigmaStarInvMatrixNormAtScale_dilate h Q n + LambdaSq_dilate := by + intro k a b h Q s q + exact LambdaSq_dilate h Q s q + lambdaSq_dilate := by + intro k a b h Q s q + exact lambdaSq_dilate h Q s q + LambdaS_dilate := by + intro k a b h Q s + exact LambdaS_dilate h Q s + lambdaS_dilate := by + intro k a b h Q s + exact lambdaS_dilate h Q s + ThetaRatio_dilate := by + intro k a b h Q s t + exact ThetaRatio_dilate h Q s t + maxDescendantUpperEllipticityAtScale_dilate := by + intro k a b h Q n s q + exact maxDescendantUpperEllipticityAtScale_dilate h Q n s q + maxDescendantLowerEllipticityInvAtScale_dilate := by + intro k a b h Q n s q + exact maxDescendantLowerEllipticityInvAtScale_dilate h Q n s q + normalizedBlockResponseMax_dilate := by + intro k a b h Q a0 + exact normalizedBlockResponseMax_dilate h Q a0 + maxDescendantNormalizedBlockResponseAtScale_dilate := by + intro k a b h Q n a0 + exact maxDescendantNormalizedBlockResponseAtScale_dilate h Q n a0 + scaleResponseAtScale_dilate := by + intro k a b h Q n p a0 + exact scaleResponseAtScale_dilate h Q n p a0 + HomogenizationError_dilate := by + intro k a b h Q n s p q a0 + exact HomogenizationError_dilate h Q n s p q a0 + HomogenizationErrorOnCube_dilate := by + intro k a b h Q s p q a0 + exact HomogenizationErrorOnCube_dilate h Q s p q a0 + +/-- Aggregate proved public dilation theorem package. -/ +theorem dilationTheory (d : ℕ) [NeZero d] : DilationTheory d where + cube := cubeDilationTheory d + multiscale := multiscaleDilationTheory d + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMu.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMu.lean new file mode 100644 index 0000000000..5d85ac9b00 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMu.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledMu + +/-! # Doubled Mu -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public doubled-`mu` theory package. The internal proof may replace the +coefficient field by an a.e.-equal pointwise representative, but this theorem is +stated only for the public a.e.-native coefficient field `a`. -/ +theorem doubledMuTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + DoubledMuTheory U a := + Homogenization.Internal.Ch02.BookCh02.doubledMuTheory U a + +namespace IsDoubledMuMinimizer + +/-- A pointwise doubled-`mu` minimizer realizes the public infimum. -/ +theorem doubledMuValue_eq_doubledMu {d : ℕ} {U : Domain d} {a : CoeffOn U} + {P : BlockVec d} {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a P X) : + doubledMuValue U a X = doubledMu U a P := by + let s : Set ℝ := doubledMuValueSet U a P + have hmem : doubledMuValue U a X ∈ s := ⟨X, hX.1, rfl⟩ + have hbdd : BddBelow s := by + refine ⟨doubledMuValue U a X, ?_⟩ + intro m hm + rcases hm with ⟨Y, hY, rfl⟩ + exact hX.2 Y hY + have hnon : s.Nonempty := ⟨doubledMuValue U a X, hmem⟩ + apply le_antisymm + · unfold doubledMu + exact le_csInf hnon (by + intro m hm + rcases hm with ⟨Y, hY, rfl⟩ + exact hX.2 Y hY) + · unfold doubledMu + exact csInf_le hbdd hmem + +end IsDoubledMuMinimizer + +/-- A doubled-`mu` minimizer at loading `(-p, q)` extracts the gradient of the +scalar canonical response maximizer from its lower block image. -/ +theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient + {d : ℕ} (U : Domain d) (a : CoeffOn U) (p q : Vec d) + {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := + Homogenization.Internal.Ch02.BookCh02.doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient + U a p q hX + +/-- A doubled-`mu` minimizer at loading `(-p, q)` extracts the flux of the +scalar canonical response maximizer from its upper block image. -/ +theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux + {d : ℕ} (U : Domain d) (a : CoeffOn U) (p q : Vec d) + {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.flux x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + matVecMul (a.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x) := + Homogenization.Internal.Ch02.BookCh02.doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux + U a p q hX + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMuDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMuDefinitions.lean new file mode 100644 index 0000000000..feafc30d04 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledMuDefinitions.lean @@ -0,0 +1,157 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.DoubledResponse + +/-! # Doubled Mu Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +theorem blockMatrixField_ae_eq_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + blockMatrixField a =ᵐ[volumeMeasureOn (U : Set (Vec d))] blockMatrixField b := + h.mono fun x hx => by + simp [blockMatrixField, hx] + +theorem blockEnergyDensityAt_ae_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (P : BlockVec d) : + (fun x => blockEnergyDensityAt a P x) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => blockEnergyDensityAt b P x := + (blockMatrixField_ae_eq_ofAEEq h).mono fun x hx => by + simp [blockEnergyDensityAt, hx] + +theorem doubledBlockPairingIntegrand_ae_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (Y X : DoubledField d) : + doubledBlockPairingIntegrand U a Y X + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + doubledBlockPairingIntegrand U b Y X := + (blockMatrixField_ae_eq_ofAEEq h).mono fun x hx => by + simp [doubledBlockPairingIntegrand, hx] + +theorem doubledMuValue_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (X : DoubledField d) : + doubledMuValue U a X = doubledMuValue U b X := by + unfold doubledMuValue average + congr 1 + exact MeasureTheory.integral_congr_ae <| + (blockMatrixField_ae_eq_ofAEEq h).mono fun x hx => by + simp [blockEnergyDensityAt, hx] + +theorem doubledMuValueSet_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (P : BlockVec d) : + doubledMuValueSet U a P = doubledMuValueSet U b P := by + ext m + constructor + · rintro ⟨X, hX, rfl⟩ + exact ⟨X, hX, by simp [doubledMuValue_eq_ofAEEq h X]⟩ + · rintro ⟨X, hX, rfl⟩ + exact ⟨X, hX, by simp [doubledMuValue_eq_ofAEEq h X]⟩ + +theorem doubledMu_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) (P : BlockVec d) : + doubledMu U a P = doubledMu U b P := by + unfold doubledMu + rw [doubledMuValueSet_eq_ofAEEq h P] + +namespace IsDoubledMuMinimizer + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {P : BlockVec d} {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a P X) : + IsDoubledMuMinimizer U b P X := by + refine ⟨hX.1, ?_⟩ + intro Y hY + simpa [doubledMuValue_eq_ofAEEq h X, doubledMuValue_eq_ofAEEq h Y] using + hX.2 Y hY + +end IsDoubledMuMinimizer + +/-- Public theorem package for the variational quantity +`e.def.block.mu.basic.definitions` and the coarse block matrix definition +`e.def.block.coarse.matrix.basic.definitions`. + +The canonical public theorem proving this package is `doubledMuTheory` in +`DoubledMu.lean`. -/ +structure DoubledMuTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop where + minimizer_exists : + ∀ P : BlockVec d, ∃ X : DoubledField d, IsDoubledMuMinimizer U a P X + minimizer_unique_ae : + ∀ P : BlockVec d, ∀ X Y : DoubledField d, + IsDoubledMuMinimizer U a P X → + IsDoubledMuMinimizer U a P Y → + DoubledField.SameAE (U := U) X Y + mu_quadratic : + ∀ P : BlockVec d, + doubledMu U a P = + (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) + minimizer_first_variation : + ∀ P : BlockVec d, ∀ X : DoubledField d, + IsDoubledMuMinimizer U a P X → + ∀ Y : DoubledField d, IsDoubledTestField U Y → + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume = 0 + +namespace DoubledMuTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (hTheory : DoubledMuTheory U a) : + DoubledMuTheory U b where + minimizer_exists := by + intro P + rcases hTheory.minimizer_exists P with ⟨X, hX⟩ + exact ⟨X, hX.ofAEEq h⟩ + minimizer_unique_ae := by + intro P X Y hX hY + exact hTheory.minimizer_unique_ae P X Y (hX.ofAEEq h.symm) (hY.ofAEEq h.symm) + mu_quadratic := by + intro P + calc + doubledMu U b P = doubledMu U a P := (doubledMu_eq_ofAEEq h P).symm + _ = + (1 / 2 : ℝ) * + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + hTheory.mu_quadratic P + _ = + (1 / 2 : ℝ) * + blockVecDot P (blockMatVecMul (coarseBlockMatrix U b) P) := by + rw [coarseBlockMatrix_eq_ofAEEq h] + minimizer_first_variation := by + intro P X hX Y hY + have hXa : IsDoubledMuMinimizer U a P X := hX.ofAEEq h.symm + have hFirst := hTheory.minimizer_first_variation P X hXa Y hY + calc + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U b Y X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae + (doubledBlockPairingIntegrand_ae_eq_ofAEEq h Y X).symm + _ = 0 := hFirst + +/-- Accessor for the public quadratic formula defining the coarse block matrix. -/ +theorem doubledMu_eq_coarseBlockMatrix {d : ℕ} {U : Domain d} {a : CoeffOn U} + (h : DoubledMuTheory U a) (P : BlockVec d) : + doubledMu U a P = + (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + h.mu_quadratic P + +end DoubledMuTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponse.lean new file mode 100644 index 0000000000..e86f2e8827 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponse.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse + +/-! # Doubled Response -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 doubled-response theorem package for +`l.block.response.functional.basic.definitions`. + +The coefficient field is used through the a.e. public `CoeffOn` interface; no +pointwise ellipticity or representative choice is exposed. -/ +theorem doubledResponseTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + DoubledResponseTheory U a := + Homogenization.Internal.Ch02.BookCh02.doubledResponseTheory U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponseDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponseDefinitions.lean new file mode 100644 index 0000000000..eb80c338bf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/DoubledResponseDefinitions.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMuDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions + +/-! # Doubled Response Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +namespace DoubledField + +theorem SameAE.refl {d : ℕ} {U : Domain d} (X : DoubledField d) : + SameAE (U := U) X X := + ⟨Filter.EventuallyEq.rfl, Filter.EventuallyEq.rfl⟩ + +theorem SameAE.symm {d : ℕ} {U : Domain d} {X Y : DoubledField d} + (hXY : SameAE (U := U) X Y) : + SameAE (U := U) Y X := + ⟨hXY.1.symm, hXY.2.symm⟩ + +theorem SameAE.trans {d : ℕ} {U : Domain d} {X Y Z : DoubledField d} + (hXY : SameAE (U := U) X Y) (hYZ : SameAE (U := U) Y Z) : + SameAE (U := U) X Z := + ⟨hXY.1.trans hYZ.1, hXY.2.trans hYZ.2⟩ + +theorem SameAE.add {d : ℕ} {U : Domain d} {X1 X2 Y1 Y2 : DoubledField d} + (hX : SameAE (U := U) X1 X2) (hY : SameAE (U := U) Y1 Y2) : + SameAE (U := U) (X1 + Y1) (X2 + Y2) := by + constructor + · filter_upwards [hX.1, hY.1] with x hx hy + change (X1.potential + Y1.potential) x = (X2.potential + Y2.potential) x + simp [hx, hy] + · filter_upwards [hX.2, hY.2] with x hx hy + change (X1.flux + Y1.flux) x = (X2.flux + Y2.flux) x + simp [hx, hy] + +theorem SameAE.smul {d : ℕ} {U : Domain d} (c : ℝ) + {X Y : DoubledField d} (hXY : SameAE (U := U) X Y) : + SameAE (U := U) (c • X) (c • Y) := by + constructor + · filter_upwards [hXY.1] with x hx + change (c • X.potential) x = (c • Y.potential) x + simp [hx] + · filter_upwards [hXY.2] with x hx + change (c • X.flux) x = (c • Y.flux) x + simp [hx] + +end DoubledField + +theorem doubledResponseIntegrand_ae_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (P Q : BlockVec d) (X : DoubledField d) : + doubledResponseIntegrand U a P Q X + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + doubledResponseIntegrand U b P Q X := + (blockMatrixField_ae_eq_ofAEEq h).mono fun x hx => by + simp [doubledResponseIntegrand, blockEnergyDensityAt, hx] + +theorem doubledResponseValue_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (P Q : BlockVec d) (X : DoubledField d) : + doubledResponseValue U a P Q X = doubledResponseValue U b P Q X := by + unfold doubledResponseValue average + congr 1 + exact MeasureTheory.integral_congr_ae + (doubledResponseIntegrand_ae_eq_ofAEEq h P Q X) + +namespace IsDoubledResponseField + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {X : DoubledField d} + (hX : IsDoubledResponseField U a X) : + IsDoubledResponseField U b X := by + refine ⟨hX.1, ?_⟩ + intro Y hY + calc + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U b Y X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae + (doubledBlockPairingIntegrand_ae_eq_ofAEEq h Y X).symm + _ = 0 := hX.2 Y hY + +end IsDoubledResponseField + +theorem doubledResponseValueSet_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (P Q : BlockVec d) : + doubledResponseValueSet U a P Q = doubledResponseValueSet U b P Q := by + ext m + constructor + · rintro ⟨X, hX, rfl⟩ + exact ⟨X, hX.ofAEEq h, by simp [doubledResponseValue_eq_ofAEEq h P Q X]⟩ + · rintro ⟨X, hX, rfl⟩ + exact ⟨X, hX.ofAEEq h.symm, by simp [doubledResponseValue_eq_ofAEEq h P Q X]⟩ + +theorem doubledResponseJ_eq_ofAEEq {d : ℕ} {U : Domain d} + {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (P Q : BlockVec d) : + doubledResponseJ U a P Q = doubledResponseJ U b P Q := by + unfold doubledResponseJ + rw [doubledResponseValueSet_eq_ofAEEq h P Q] + +namespace IsDoubledResponseMaximizer + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {P Q : BlockVec d} {X : DoubledField d} + (hX : IsDoubledResponseMaximizer U a P Q X) : + IsDoubledResponseMaximizer U b P Q X := by + refine ⟨hX.1.ofAEEq h, ?_⟩ + intro Y hY + have hYa : IsDoubledResponseField U a Y := hY.ofAEEq h.symm + simpa [doubledResponseValue_eq_ofAEEq h P Q Y, + doubledResponseValue_eq_ofAEEq h P Q X] using hX.2 Y hYa + +end IsDoubledResponseMaximizer + +/-- Public theorem package for +`l.block.response.functional.basic.definitions`. + +The canonical public theorem proving this package is `doubledResponseTheory` +in `DoubledResponse.lean`. -/ +structure DoubledResponseTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop where + response_space_by_solutions : + ∀ X : DoubledField d, + IsDoubledResponseField U a X ↔ + ∃ v : Solution U a, ∃ vStar : Solution U a.transpose, + DoubledField.SameAE (U := U) X (doubledFieldOfSolutions a v vStar) + doubled_response_by_scalar : + ∀ p pStar q qStar : Vec d, + doubledResponseJ U a (p, q) (qStar, pStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) + scalar_maximizers_give_doubled_maximizer : + ∀ p pStar q qStar : Vec d, + ∀ v : Solution U a, ∀ vStar : Solution U a.transpose, + IsResponseMaximizer U a (p - pStar) (qStar - q) v → + IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStar → + IsDoubledResponseMaximizer U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) + maximizer_exists : + ∀ P Q : BlockVec d, DoubledResponseMaximizerExists U a P Q + maximizer_unique_ae : + ∀ P Q : BlockVec d, ∀ X Y : DoubledField d, + IsDoubledResponseMaximizer U a P Q X → + IsDoubledResponseMaximizer U a P Q Y → + DoubledField.SameAE (U := U) X Y + maximizer_add_sameAE : + ∀ P1 Q1 P2 Q2 : BlockVec d, ∀ X12 X1 X2 : DoubledField d, + IsDoubledResponseMaximizer U a (P1 + P2) (Q1 + Q2) X12 → + IsDoubledResponseMaximizer U a P1 Q1 X1 → + IsDoubledResponseMaximizer U a P2 Q2 X2 → + DoubledField.SameAE (U := U) X12 (X1 + X2) + maximizer_smul_sameAE : + ∀ c : ℝ, ∀ P Q : BlockVec d, ∀ Xc X : DoubledField d, + IsDoubledResponseMaximizer U a (c • P) (c • Q) Xc → + IsDoubledResponseMaximizer U a P Q X → + DoubledField.SameAE (U := U) Xc (c • X) + first_variation : + ∀ P Q : BlockVec d, ∀ S T : DoubledField d, + IsDoubledResponseMaximizer U a P Q S → + IsDoubledResponseField U a T → + average U + (fun x => + blockVecDot Q (T.eval x) - + blockVecDot P (blockMatVecMul (blockMatrixField a x) (T.eval x))) = + average U + (fun x => + blockVecDot (T.eval x) + (blockMatVecMul (blockMatrixField a x) (S.eval x))) + +namespace DoubledResponseTheory + +/-- Accessor for the scalar splitting of doubled response +`e.block.J.by.J.Jstar.basic.definitions`. -/ +theorem doubledResponseJ_eq_scalar {d : ℕ} {U : Domain d} {a : CoeffOn U} + (h : DoubledResponseTheory U a) (p pStar q qStar : Vec d) : + doubledResponseJ U a (p, q) (qStar, pStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + h.doubled_response_by_scalar p pStar q qStar + +end DoubledResponseTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Existence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Existence.lean new file mode 100644 index 0000000000..7cabd9d544 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Existence.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence + +/-! # Existence -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 response-maximizer existence theorem. + +The proof is supplied by the internal a.e.-representative bridge, so the public +surface only mentions the note-facing `Domain` and `CoeffOn` data. -/ +theorem responseExistenceTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseExistenceTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseExistenceTheory U a + +/-- Public per-loading response-maximizer existence, derived from the proved +Chapter 2 existence theorem. -/ +theorem responseMaximizerExists {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : + ResponseMaximizerExists U a p q := + (responseExistenceTheory U a).exists_maximizer p q + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/ExistenceDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/ExistenceDefinitions.lean new file mode 100644 index 0000000000..5150d0c80f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/ExistenceDefinitions.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions + +/-! # Existence Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- The existence statement needed to turn the note's `v(.,U,p,q;a)` into a +chosen Lean object. This is a public theorem target, not a downstream hypothesis. -/ +def ResponseMaximizerExists {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : Prop := + ∃ v : Solution U a, + MeanZeroOn (U : Set (Vec d)) v.toH1.toFun ∧ IsResponseMaximizer U a p q v + +namespace ResponseMaximizerExists + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {p q : Vec d} + (hv : ResponseMaximizerExists U a p q) : + ResponseMaximizerExists U b p q := by + rcases hv with ⟨v, hmean, hmax⟩ + exact ⟨Solution.ofAEEq h v, by simpa using hmean, hmax.ofAEEq h⟩ + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {p q : Vec d} : + ResponseMaximizerExists U a p q ↔ ResponseMaximizerExists U b p q := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseMaximizerExists + +/-- Public theorem package for Chapter 2 response maximizer existence. + +This contains only the existence package used by the chosen-object API. +The proved public theorem is `responseExistenceTheory` in `Existence.lean`. +-/ +structure ResponseExistenceTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop where + exists_maximizer : ∀ p q : Vec d, ResponseMaximizerExists U a p q + +namespace ResponseExistenceTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hTheory : ResponseExistenceTheory U a) : + ResponseExistenceTheory U b where + exists_maximizer := fun p q => + (hTheory.exists_maximizer p q).ofAEEq h + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseExistenceTheory U a ↔ ResponseExistenceTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseExistenceTheory + +/-- Chosen public maximizer, once the Chapter 2 existence theorem has been supplied. -/ +noncomputable def responseMaximizer {d : ℕ} {U : Domain d} {a : CoeffOn U} + {p q : Vec d} (h : ResponseMaximizerExists U a p q) : Solution U a := + Classical.choose h + +theorem responseMaximizer_meanZero {d : ℕ} {U : Domain d} {a : CoeffOn U} + {p q : Vec d} (h : ResponseMaximizerExists U a p q) : + MeanZeroOn (U : Set (Vec d)) (responseMaximizer h).toH1.toFun := + (Classical.choose_spec h).1 + +theorem responseMaximizer_isMaximizer {d : ℕ} {U : Domain d} {a : CoeffOn U} + {p q : Vec d} (h : ResponseMaximizerExists U a p q) : + IsResponseMaximizer U a p q (responseMaximizer h) := + (Classical.choose_spec h).2 + +theorem responseJ_eq_responseValue_responseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} + (h : ResponseMaximizerExists U a p q) : + responseJ U a p q = responseValue U a p q (responseMaximizer h) := + responseJ_eq_responseValue_of_isResponseMaximizer (responseMaximizer_isMaximizer h) + +/-- The canonical maximizer supplied by the public existence interface. -/ +noncomputable def canonicalMaximizer {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) (p q : Vec d) : + CanonicalMaximizer U a p q where + toSolution := responseMaximizer (hTheory.exists_maximizer p q) + meanZero := responseMaximizer_meanZero (hTheory.exists_maximizer p q) + isMaximizer := responseMaximizer_isMaximizer (hTheory.exists_maximizer p q) + +theorem canonicalMaximizer_meanZero {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) (p q : Vec d) : + MeanZeroOn (U : Set (Vec d)) (canonicalMaximizer hTheory p q).toSolution.toH1.toFun := + (canonicalMaximizer hTheory p q).meanZero + +theorem canonicalMaximizer_isMaximizer {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) (p q : Vec d) : + IsResponseMaximizer U a p q (canonicalMaximizer hTheory p q).toSolution := + (canonicalMaximizer hTheory p q).isMaximizer + +theorem responseJ_eq_responseValue_canonicalMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) (p q : Vec d) : + responseJ U a p q = + responseValue U a p q (canonicalMaximizer hTheory p q).toSolution := + (canonicalMaximizer hTheory p q).responseJ_eq + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariation.lean new file mode 100644 index 0000000000..d93320a24c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariation.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation + +/-! # First Variation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 first-variation theorem for response maximizers. -/ +theorem responseFirstVariationTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseFirstVariationTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseFirstVariationTheory U a + +/-- Public first-variation identity for any response maximizer. -/ +theorem firstVariationValue_eq_zero {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) (w : Solution U a) : + firstVariationValue U a p q v w = 0 := + firstVariationValue_eq_zero_of_isResponseMaximizer + (responseFirstVariationTheory U a) hv w + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariationDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariationDefinitions.lean new file mode 100644 index 0000000000..4eecc3802e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/FirstVariationDefinitions.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions + +/-! # First Variation Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for the first-variation theorem. + +This is not a definition of maximizer; it is the proposition-valued package +proved by `responseFirstVariationTheory` in `FirstVariation.lean`. Downstream +note-facing wrappers should use that theorem rather than carry this package as +an additional input. -/ +structure ResponseFirstVariationTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop where + first_variation : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + ∀ w : Solution U a, firstVariationValue U a p q v w = 0 + +namespace ResponseFirstVariationTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hFirst : ResponseFirstVariationTheory U a) : + ResponseFirstVariationTheory U b where + first_variation := by + intro p q v hv w + let va : Solution U a := Solution.ofAEEq h.symm v + let wa : Solution U a := Solution.ofAEEq h.symm w + have hmax_a : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hzero := hFirst.first_variation p q va hmax_a wa + have hvalue : + firstVariationValue U a p q va wa = firstVariationValue U b p q v w := by + simpa [va, wa] using firstVariationValue_ofAEEq h.symm p q v w + simpa [hvalue] using hzero + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseFirstVariationTheory U a ↔ ResponseFirstVariationTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseFirstVariationTheory + +theorem firstVariationValue_eq_zero_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hFirst : ResponseFirstVariationTheory U a) {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) (w : Solution U a) : + firstVariationValue U a p q v w = 0 := + hFirst.first_variation p q v hv w + +theorem canonicalMaximizer_firstVariationValue_eq_zero {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) + (hFirst : ResponseFirstVariationTheory U a) (p q : Vec d) + (w : Solution U a) : + firstVariationValue U a p q (canonicalMaximizer hTheory p q).toSolution w = 0 := + firstVariationValue_eq_zero_of_isResponseMaximizer hFirst + (canonicalMaximizer_isMaximizer hTheory p q) w + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearity.lean new file mode 100644 index 0000000000..8ec1fd5b2b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearity.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity + +/-! # Gradient Linearity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 a.e. linearity theorem for response-maximizer gradients. -/ +theorem responseGradientLinearityTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseGradientLinearityTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseGradientLinearityTheory U a + +/-- Public a.e. additivity of response-maximizer gradients. -/ +theorem gradient_add_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + {p1 q1 p2 q2 : Vec d} {v12 v1 v2 : Solution U a} + (h12 : IsResponseMaximizer U a (p1 + p2) (q1 + q2) v12) + (h1 : IsResponseMaximizer U a p1 q1 v1) + (h2 : IsResponseMaximizer U a p2 q2 v2) : + v12.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => v1.toH1.grad x + v2.toH1.grad x := + gradient_add_of_response_maximizers + (responseGradientLinearityTheory U a) h12 h1 h2 + +/-- Public a.e. homogeneity of response-maximizer gradients. -/ +theorem gradient_smul_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + {c : ℝ} {p q : Vec d} {vc v : Solution U a} + (hc : IsResponseMaximizer U a (c • p) (c • q) vc) + (hv : IsResponseMaximizer U a p q v) : + vc.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • v.toH1.grad x := + gradient_smul_of_response_maximizers + (responseGradientLinearityTheory U a) hc hv + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearityDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearityDefinitions.lean new file mode 100644 index 0000000000..8adc47a8d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientLinearityDefinitions.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions + +/-! # Gradient Linearity Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for linearity of response-maximizer gradients. + +The statement is made for arbitrary maximizers and uses a.e. gradient equality. +This keeps it independent of the particular chosen representative returned by +`canonicalMaximizer`. The canonical public theorem proving this package is +`responseGradientLinearityTheory` in `GradientLinearity.lean`. -/ +structure ResponseGradientLinearityTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Prop where + add_gradient : + ∀ p1 q1 p2 q2 : Vec d, ∀ v12 v1 v2 : Solution U a, + IsResponseMaximizer U a (p1 + p2) (q1 + q2) v12 → + IsResponseMaximizer U a p1 q1 v1 → + IsResponseMaximizer U a p2 q2 v2 → + v12.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => v1.toH1.grad x + v2.toH1.grad x + smul_gradient : + ∀ c : ℝ, ∀ p q : Vec d, ∀ vc v : Solution U a, + IsResponseMaximizer U a (c • p) (c • q) vc → + IsResponseMaximizer U a p q v → + vc.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • v.toH1.grad x + +namespace ResponseGradientLinearityTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hLinear : ResponseGradientLinearityTheory U a) : + ResponseGradientLinearityTheory U b where + add_gradient := by + intro p1 q1 p2 q2 v12 v1 v2 h12 h1 h2 + let va12 : Solution U a := Solution.ofAEEq h.symm v12 + let va1 : Solution U a := Solution.ofAEEq h.symm v1 + let va2 : Solution U a := Solution.ofAEEq h.symm v2 + have hmax12 : IsResponseMaximizer U a (p1 + p2) (q1 + q2) va12 := + h12.ofAEEq h.symm + have hmax1 : IsResponseMaximizer U a p1 q1 va1 := h1.ofAEEq h.symm + have hmax2 : IsResponseMaximizer U a p2 q2 va2 := h2.ofAEEq h.symm + have hgrad := hLinear.add_gradient p1 q1 p2 q2 va12 va1 va2 hmax12 hmax1 hmax2 + simpa [va12, va1, va2] using hgrad + smul_gradient := by + intro c p q vc v hc hv + let vac : Solution U a := Solution.ofAEEq h.symm vc + let va : Solution U a := Solution.ofAEEq h.symm v + have hmaxc : IsResponseMaximizer U a (c • p) (c • q) vac := hc.ofAEEq h.symm + have hmax : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hgrad := hLinear.smul_gradient c p q vac va hmaxc hmax + simpa [vac, va] using hgrad + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseGradientLinearityTheory U a ↔ ResponseGradientLinearityTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseGradientLinearityTheory + +theorem gradient_add_of_response_maximizers {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hLinear : ResponseGradientLinearityTheory U a) + {p1 q1 p2 q2 : Vec d} {v12 v1 v2 : Solution U a} + (h12 : IsResponseMaximizer U a (p1 + p2) (q1 + q2) v12) + (h1 : IsResponseMaximizer U a p1 q1 v1) + (h2 : IsResponseMaximizer U a p2 q2 v2) : + v12.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => v1.toH1.grad x + v2.toH1.grad x := + hLinear.add_gradient p1 q1 p2 q2 v12 v1 v2 h12 h1 h2 + +theorem gradient_smul_of_response_maximizers {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hLinear : ResponseGradientLinearityTheory U a) + {c : ℝ} {p q : Vec d} {vc v : Solution U a} + (hc : IsResponseMaximizer U a (c • p) (c • q) vc) + (hv : IsResponseMaximizer U a p q v) : + vc.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • v.toH1.grad x := + hLinear.smul_gradient c p q vc v hc hv + +theorem canonicalMaximizer_add_gradientAE {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) + (hLinear : ResponseGradientLinearityTheory U a) + (p1 q1 p2 q2 : Vec d) : + (canonicalMaximizer hTheory (p1 + p2) (q1 + q2)).toSolution.toH1.grad + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer hTheory p1 q1).toSolution.toH1.grad x + + (canonicalMaximizer hTheory p2 q2).toSolution.toH1.grad x := + hLinear.add_gradient p1 q1 p2 q2 + (canonicalMaximizer hTheory (p1 + p2) (q1 + q2)).toSolution + (canonicalMaximizer hTheory p1 q1).toSolution + (canonicalMaximizer hTheory p2 q2).toSolution + (canonicalMaximizer_isMaximizer hTheory (p1 + p2) (q1 + q2)) + (canonicalMaximizer_isMaximizer hTheory p1 q1) + (canonicalMaximizer_isMaximizer hTheory p2 q2) + +theorem canonicalMaximizer_smul_gradientAE {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) + (hLinear : ResponseGradientLinearityTheory U a) + (c : ℝ) (p q : Vec d) : + (canonicalMaximizer hTheory (c • p) (c • q)).toSolution.toH1.grad + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • (canonicalMaximizer hTheory p q).toSolution.toH1.grad x := + hLinear.smul_gradient c p q + (canonicalMaximizer hTheory (c • p) (c • q)).toSolution + (canonicalMaximizer hTheory p q).toSolution + (canonicalMaximizer_isMaximizer hTheory (c • p) (c • q)) + (canonicalMaximizer_isMaximizer hTheory p q) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniqueness.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniqueness.lean new file mode 100644 index 0000000000..a1074212d9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniqueness.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence + +/-! # Gradient Uniqueness -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 a.e. uniqueness theorem for response-maximizer gradients. -/ +theorem responseGradientUniquenessTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseGradientUniquenessTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseGradientUniquenessTheory U a + +/-- Public a.e. gradient uniqueness for response maximizers with the same +loading. -/ +theorem sameGradientAE_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + {p q : Vec d} {v w : Solution U a} + (hv : IsResponseMaximizer U a p q v) (hw : IsResponseMaximizer U a p q w) : + Solution.SameGradientAE v w := + sameGradientAE_of_response_maximizers + (responseGradientUniquenessTheory U a) hv hw + +/-- Any response maximizer has the same gradient a.e. as the public canonical +maximizer for the same loading. This is the deterministic Ch2 bridge needed +when an upstream scalar-response selection is constructed by a Hilbert/Galerkin +argument. -/ +theorem canonicalMaximizer_sameGradientAE_of_isResponseMaximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} + {p q : Vec d} {v : Solution U a} + (hv : IsResponseMaximizer U a p q v) : + Solution.SameGradientAE + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution v := + sameGradientAE_of_isResponseMaximizer + (canonicalMaximizer (responseExistenceTheory U a) p q).isMaximizer hv + +/-- Transporting the public canonical response maximizer across a coefficient +a.e. equality gives a solution with the same gradient as the canonical maximizer +for the transported coefficient. -/ +theorem canonicalMaximizer_sameGradientAE_ofAEEq + {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) (p q : Vec d) : + Solution.SameGradientAE + (Solution.ofAEEq h + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution) + (canonicalMaximizer (responseExistenceTheory U b) p q).toSolution := by + have htransport : + IsResponseMaximizer U b p q + (Solution.ofAEEq h + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution) := + (canonicalMaximizer (responseExistenceTheory U a) p q).isMaximizer.ofAEEq h + have hcanonical : + IsResponseMaximizer U b p q + (canonicalMaximizer (responseExistenceTheory U b) p q).toSolution := + (canonicalMaximizer (responseExistenceTheory U b) p q).isMaximizer + exact sameGradientAE_of_isResponseMaximizer htransport hcanonical + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniquenessDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniquenessDefinitions.lean new file mode 100644 index 0000000000..da73558f2e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/GradientUniquenessDefinitions.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions + +/-! # Gradient Uniqueness Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for uniqueness of the response maximizer gradient. + +The statement is deliberately a.e. in the gradient. A later Poincare argument can +upgrade this to uniqueness of the mean-zero representative. The canonical +public theorem proving this package is `responseGradientUniquenessTheory` in +`GradientUniqueness.lean`. -/ +structure ResponseGradientUniquenessTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Prop where + unique_gradient : + ∀ p q : Vec d, ∀ v w : Solution U a, + IsResponseMaximizer U a p q v → + IsResponseMaximizer U a p q w → Solution.SameGradientAE v w + +namespace ResponseGradientUniquenessTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hUnique : ResponseGradientUniquenessTheory U a) : + ResponseGradientUniquenessTheory U b where + unique_gradient := by + intro p q v w hv hw + let va : Solution U a := Solution.ofAEEq h.symm v + let wa : Solution U a := Solution.ofAEEq h.symm w + have hmax_v : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have hmax_w : IsResponseMaximizer U a p q wa := hw.ofAEEq h.symm + have hsame := hUnique.unique_gradient p q va wa hmax_v hmax_w + simpa [Solution.SameGradientAE, va, wa] using hsame + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseGradientUniquenessTheory U a ↔ ResponseGradientUniquenessTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseGradientUniquenessTheory + +theorem sameGradientAE_of_response_maximizers {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hUnique : ResponseGradientUniquenessTheory U a) + {p q : Vec d} {v w : Solution U a} + (hv : IsResponseMaximizer U a p q v) (hw : IsResponseMaximizer U a p q w) : + Solution.SameGradientAE v w := + hUnique.unique_gradient p q v w hv hw + +theorem canonicalMaximizer_sameGradientAE {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hTheory : ResponseExistenceTheory U a) + (hUnique : ResponseGradientUniquenessTheory U a) + {p q : Vec d} {v : Solution U a} (hv : IsResponseMaximizer U a p q v) : + Solution.SameGradientAE (canonicalMaximizer hTheory p q).toSolution v := + sameGradientAE_of_response_maximizers hUnique + (canonicalMaximizer_isMaximizer hTheory p q) hv + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError.lean new file mode 100644 index 0000000000..5eb01d7bd6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl + +/-! # Homogenization Error -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/AEEq.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/AEEq.lean new file mode 100644 index 0000000000..b82c3bbc8d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/AEEq.lean @@ -0,0 +1,159 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.InfinityOne + +/-! # AEEq -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# A.E. Invariance for Chapter 2.5 Homogenization Error + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +/-- The normalized one-cube block-response value set depends only on the +coefficient family modulo a.e. equality on each triadic cube. -/ +theorem normalizedBlockResponseValueSet_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (a0 : Mat d) : + normalizedBlockResponseValueSet Q a a0 = + normalizedBlockResponseValueSet Q b a0 := by + unfold normalizedBlockResponseValueSet + ext m + constructor + · rintro ⟨e, he, rfl⟩ + refine ⟨e, he, ?_⟩ + rw [doubledResponseJ_eq_ofAEEq (h Q)] + · rintro ⟨e, he, rfl⟩ + refine ⟨e, he, ?_⟩ + rw [doubledResponseJ_eq_ofAEEq (h Q)] + +/-- The normalized one-cube block-response maximum is a.e.-representative +invariant. -/ +theorem normalizedBlockResponseMax_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (a0 : Mat d) : + normalizedBlockResponseMax Q a a0 = + normalizedBlockResponseMax Q b a0 := by + unfold normalizedBlockResponseMax + rw [normalizedBlockResponseValueSet_eq_ofAEEq h Q a0] + +/-- The descendant normalized block-response maximum is a.e.-representative +invariant. -/ +theorem maxDescendantNormalizedBlockResponseAtScale_eq_ofAEEq + {d : ℕ} [NeZero d] {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (k : ℤ) + (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q k a a0 = + maxDescendantNormalizedBlockResponseAtScale Q k b a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + exact finsetSupReal_congr _ fun R _ => + normalizedBlockResponseMax_eq_ofAEEq h R a0 + +/-- The scale-level response aggregation in the homogenization error is +a.e.-representative invariant. -/ +theorem scaleResponseAtScale_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (k : ℤ) (p : MultiscaleExponent) (a0 : Mat d) : + scaleResponseAtScale Q k p a a0 = + scaleResponseAtScale Q k p b a0 := by + cases p with + | finite p => + unfold scaleResponseAtScale finsetAverageReal + change + Real.rpow + (((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, + Real.rpow (normalizedBlockResponseMax R a a0) (p / 2)) + (1 / p) = + Real.rpow + (((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, + Real.rpow (normalizedBlockResponseMax R b a0) (p / 2)) + (1 / p) + congr 1 + congr 1 + apply Finset.sum_congr rfl + intro R _hR + rw [normalizedBlockResponseMax_eq_ofAEEq h R a0] + | infinity => + unfold scaleResponseAtScale + rw [maxDescendantNormalizedBlockResponseAtScale_eq_ofAEEq h Q k a0] + +/-- The finite-`q` multiscale homogenization error is a.e.-representative +invariant. -/ +theorem HomogenizationErrorFinite_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) + (q : ℝ) (a0 : Mat d) : + HomogenizationErrorFinite Q n s p q a a0 = + HomogenizationErrorFinite Q n s p q b a0 := by + unfold HomogenizationErrorFinite + congr 1 + apply tsum_congr + intro l + rw [scaleResponseAtScale_eq_ofAEEq h Q (n - (l : ℤ)) p a0] + +/-- The endpoint-`q` multiscale homogenization error is a.e.-representative +invariant. -/ +theorem HomogenizationErrorInfinity_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) + (a0 : Mat d) : + HomogenizationErrorInfinity Q n s p a a0 = + HomogenizationErrorInfinity Q n s p b a0 := by + unfold HomogenizationErrorInfinity + refine congrArg sSup ?_ + ext m + constructor + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + rw [scaleResponseAtScale_eq_ofAEEq h Q (n - (l : ℤ)) p a0] + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + rw [scaleResponseAtScale_eq_ofAEEq h Q (n - (l : ℤ)) p a0] + +/-- The multiscale homogenization error is a.e.-representative invariant. -/ +theorem HomogenizationError_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (n : ℤ) (s : ℝ) + (p q : MultiscaleExponent) (a0 : Mat d) : + HomogenizationError Q n s p q a a0 = + HomogenizationError Q n s p q b a0 := by + cases q with + | finite q => + exact HomogenizationErrorFinite_eq_ofAEEq h Q n s p q a0 + | infinity => + exact HomogenizationErrorInfinity_eq_ofAEEq h Q n s p a0 + +/-- The untruncated cube homogenization error is a.e.-representative +invariant. -/ +theorem HomogenizationErrorOnCube_eq_ofAEEq {d : ℕ} [NeZero d] + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (s : ℝ) (p q : MultiscaleExponent) (a0 : Mat d) : + HomogenizationErrorOnCube Q s p q a a0 = + HomogenizationErrorOnCube Q s p q b a0 := + HomogenizationError_eq_ofAEEq h Q Q.scale s p q a0 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Basic.lean new file mode 100644 index 0000000000..eefe265c2a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Basic.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationErrorDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling + +/-! # Basic -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# Basic Helpers for Chapter 2.5 Homogenization Error + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +@[simp] theorem scaleResponseAtScale_infinity_eq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (k : ℤ) (a : TriadicCoeffFamily d) (a0 : Mat d) : + scaleResponseAtScale Q k .infinity a a0 = + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q k a a0) + (1 / 2 : ℝ) := rfl + +@[simp] theorem homogenizationErrorFinite_infinity_one_eq_tsum {d : ℕ} + [NeZero d] (Q : TriadicCube d) (n : ℤ) (s : ℝ) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + HomogenizationErrorFinite Q n s .infinity 1 a a0 = + ∑' l : ℕ, + geometricWeight s 1 l * + scaleResponseAtScale Q (n - (l : ℤ)) .infinity a a0 := by + unfold HomogenizationErrorFinite + simp + +@[simp] theorem homogenizationErrorOnCube_infinity_one_eq_tsum {d : ℕ} + [NeZero d] (Q : TriadicCube d) (s : ℝ) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 = + ∑' l : ℕ, + geometricWeight s 1 l * + scaleResponseAtScale Q (Q.scale - (l : ℤ)) .infinity a a0 := by + unfold HomogenizationErrorOnCube HomogenizationError + simp + +@[simp] theorem maxDescendantNormalizedBlockResponseAtScale_self {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q Q.scale a a0 = + normalizedBlockResponseMax Q a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSupReal + rw [descendantsAtScale_self] + simp + +@[simp] theorem scaleResponseAtScale_infinity_self_eq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : + scaleResponseAtScale Q Q.scale .infinity a a0 = + Real.rpow (normalizedBlockResponseMax Q a a0) (1 / 2 : ℝ) := by + simp [scaleResponseAtScale_infinity_eq] + +/-- Average over a finite image, specialized to the public Chapter 2 +`finsetAverageReal` convention. -/ +theorem finsetAverageReal_image {α β : Type*} [DecidableEq β] (s : Finset α) + (φ : α → β) (hφ : Set.InjOn φ (↑s : Set α)) (f : β → ℝ) (g : α → ℝ) + (hfg : ∀ x ∈ s, f (φ x) = g x) : + finsetAverageReal (s.image φ) f = finsetAverageReal s g := by + unfold finsetAverageReal + rw [Finset.card_image_of_injOn hφ, Finset.sum_image hφ] + exact congrArg (fun x : ℝ => ((s.card : ℝ)⁻¹) * x) + (Finset.sum_congr rfl hfg) + +/-- Translating triadic cube indices by a fixed shift is injective. -/ +theorem translateCube_injective {d : ℕ} (z : Fin d → ℤ) : + Function.Injective (translateCube z : TriadicCube d → TriadicCube d) := by + intro Q R hQR + cases Q with + | mk Qscale Qindex => + cases R with + | mk Rscale Rindex => + have hscale : Qscale = Rscale := congrArg TriadicCube.scale hQR + have hindex : Qindex = Rindex := by + funext i + have hi := congrArg (fun S : TriadicCube d => S.index i) hQR + change Qindex i + z i = Rindex i + z i at hi + exact add_right_cancel hi + cases hscale + cases hindex + rfl + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/EllipticityControl.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/EllipticityControl.lean new file mode 100644 index 0000000000..adf1b6823f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/EllipticityControl.lean @@ -0,0 +1,829 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix + +/-! # Ellipticity Control -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius Matrix.Norms.L2Operator + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Ellipticity control by the homogenization error + +This file starts the Ch2 bridge from the normalized homogenization error +`\mathcal E` to the coarse-grained ellipticity factors. The first endpoint +needed downstream is the finite `q = 2`, scalar-normalized estimate. +-/ + +private theorem ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul + {d : ℕ} (M : FullBlockMat d) (P : BlockVec d) : + ofFullBlockVec (Matrix.mulVec M (toFullBlockVec P)) = + blockMatVecMul (ofFullBlockMat M) P := by + simpa using + (congrArg ofFullBlockVec + (toFullBlockVec_blockMatVecMul (A := ofFullBlockMat M) P)).symm + +private theorem blockMatVecMul_ofFullBlockMat_mul + {d : ℕ} (M N : FullBlockMat d) (P : BlockVec d) : + blockMatVecMul (ofFullBlockMat M) (blockMatVecMul (ofFullBlockMat N) P) = + blockMatVecMul (ofFullBlockMat (M * N)) P := by + rw [← ofFullBlockVec_toFullBlockVec + (blockMatVecMul (ofFullBlockMat M) (blockMatVecMul (ofFullBlockMat N) P))] + rw [← ofFullBlockVec_toFullBlockVec + (blockMatVecMul (ofFullBlockMat (M * N)) P)] + congr 1 + rw [toFullBlockVec_blockMatVecMul, toFullBlockVec_blockMatVecMul, + toFullBlockMat_ofFullBlockMat, toFullBlockMat_ofFullBlockMat] + simp [toFullBlockVec_blockMatVecMul, toFullBlockMat_ofFullBlockMat, + Matrix.mulVec_mulVec] + +theorem constantFullBlockMatrix_posDef_of_isEllipticMatrix + {d : ℕ} [NeZero d] {lam Lam : ℝ} {a0 : Mat d} + (ha0 : IsEllipticMatrix lam Lam a0) : + (constantFullBlockMatrix a0).PosDef := by + classical + let M := constantFullBlockMatrix a0 + have hsymm : M.IsSymm := by + dsimp [M, constantFullBlockMatrix] + simpa [constantBlockMatrix, blockMatrixOfCoeff] using + isSymm_toFullBlockMat_of_isSymmetricBlockMat + (isSymmetricBlockMat_blockMatrixOfCoeff a0) + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hsymm + · intro x hx + let X : BlockVec d := ofFullBlockVec x + have hX : X ≠ 0 := by + intro hX0 + apply hx + have hx0 : x = toFullBlockVec (0 : BlockVec d) := by + simpa [X] using congrArg toFullBlockVec hX0 + have hzero : toFullBlockVec (0 : BlockVec d) = (0 : FullBlockVec d) := by + ext i + cases i <;> simp [toFullBlockVec] + simpa [hzero] using hx0 + have hblock : + 0 < blockVecDot X (blockMatVecMul (constantBlockMatrix a0) X) := by + simpa [constantBlockMatrix, blockMatrixOfCoeff] using! + blockMatrixOfCoeff_quadratic_pos_of_isEllipticMatrix ha0 hX + have hdot : + 0 < dotProduct (toFullBlockVec X) + (Matrix.mulVec (constantFullBlockMatrix a0) (toFullBlockVec X)) := by + have hEq : + dotProduct (toFullBlockVec X) + (Matrix.mulVec (toFullBlockMat (constantBlockMatrix a0)) + (toFullBlockVec X)) = + blockVecDot X (blockMatVecMul (constantBlockMatrix a0) X) := by + rw [← dotProduct_toFullBlockVec X + (blockMatVecMul (constantBlockMatrix a0) X)] + simp [toFullBlockVec_blockMatVecMul] + have : + 0 < dotProduct (toFullBlockVec X) + (Matrix.mulVec (toFullBlockMat (constantBlockMatrix a0)) + (toFullBlockVec X)) := by + rwa [hEq] + simpa [constantFullBlockMatrix] using this + simpa [M, X] using hdot + +theorem constantFullBlockMatrixSqrt_isSymm {d : ℕ} [NeZero d] + (a0 : Mat d) : + (constantFullBlockMatrixSqrt a0).IsSymm := by + let M := constantFullBlockMatrix a0 + have hpsd : (constantFullBlockMatrixSqrt a0).PosSemidef := by + dsimp [constantFullBlockMatrixSqrt, M] + exact (Matrix.nonneg_iff_posSemidef (A := CFC.sqrt M)).mp (CFC.sqrt_nonneg M) + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hpsd.isHermitian + +theorem fullBlockVecNormSq_constantFullBlockMatrixSqrt_mul_toFullBlockVec_eq + {d : ℕ} [NeZero d] {a0 : Mat d} {lam Lam : ℝ} + (ha0 : IsEllipticMatrix lam Lam a0) (P : BlockVec d) : + fullBlockVecNormSq + (Matrix.mulVec (constantFullBlockMatrixSqrt a0) (toFullBlockVec P)) = + blockVecDot P (blockMatVecMul (constantBlockMatrix a0) P) := by + let S := constantFullBlockMatrixSqrt a0 + let B := ofFullBlockMat S + have hSsymm : S.IsSymm := constantFullBlockMatrixSqrt_isSymm a0 + have hBsymm : IsSymmetricBlockMat B := isSymmetricBlockMat_of_isSymm hSsymm + calc + fullBlockVecNormSq (Matrix.mulVec S (toFullBlockVec P)) = + blockVecDot + (ofFullBlockVec (Matrix.mulVec S (toFullBlockVec P))) + (ofFullBlockVec (Matrix.mulVec S (toFullBlockVec P))) := by + symm + exact blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq _ + _ = blockVecDot (blockMatVecMul B P) (blockMatVecMul B P) := by + rw [ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul] + _ = blockVecDot P (blockMatVecMul B (blockMatVecMul B P)) := by + symm + exact blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hBsymm P + (blockMatVecMul B P) + _ = blockVecDot P (blockMatVecMul (ofFullBlockMat (S * S)) P) := by + rw [blockMatVecMul_ofFullBlockMat_mul] + _ = blockVecDot P (blockMatVecMul (constantBlockMatrix a0) P) := by + let M := constantFullBlockMatrix a0 + have hMpos : M.PosDef := constantFullBlockMatrix_posDef_of_isEllipticMatrix + (a0 := a0) ha0 + have hsq : S ^ 2 = M := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using CFC.sq_sqrt M hMpos.posSemidef.nonneg + rw [pow_two] at hsq + rw [hsq] + simp [M, constantFullBlockMatrix] + +theorem normalizedBlockResponseValueSet_mem_of_constantBlockQuadratic_eq_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {a0 : Mat d} {lam Lam : ℝ} (ha0 : IsEllipticMatrix lam Lam a0) + (P : BlockVec d) + (hquad : + blockVecDot P (blockMatVecMul (constantBlockMatrix a0) P) = 1) : + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) P + (blockMatVecMul (constantBlockMatrix a0) P) ∈ + normalizedBlockResponseValueSet Q a a0 := by + classical + let M := constantFullBlockMatrix a0 + let S := constantFullBlockMatrixSqrt a0 + let e : FullBlockVec d := Matrix.mulVec S (toFullBlockVec P) + have hMpos : M.PosDef := by + dsimp [M] + exact constantFullBlockMatrix_posDef_of_isEllipticMatrix (a0 := a0) ha0 + have hSunit : IsUnit S := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using (CFC.isUnit_sqrt_iff M).2 hMpos.isUnit + have he : fullBlockVecNormSq e = 1 := by + simpa [e] using + (fullBlockVecNormSq_constantFullBlockMatrixSqrt_mul_toFullBlockVec_eq + (a0 := a0) ha0 P).trans hquad + refine ⟨e, he, ?_⟩ + have hP : + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) = P := by + dsimp [constantFullBlockMatrixInvSqrt, e, S] + have hSdet : IsUnit (Matrix.det S) := (Matrix.isUnit_iff_isUnit_det (A := S)).mp hSunit + calc + ofFullBlockVec (Matrix.mulVec S⁻¹ (Matrix.mulVec S (toFullBlockVec P))) = + ofFullBlockVec (Matrix.mulVec (S⁻¹ * S) (toFullBlockVec P)) := by + exact congrArg ofFullBlockVec (Matrix.mulVec_mulVec (toFullBlockVec P) S⁻¹ S) + _ = ofFullBlockVec (toFullBlockVec P) := by + rw [Matrix.nonsing_inv_mul S hSdet] + simp + _ = P := by simp + have hQ : + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) = + blockMatVecMul (constantBlockMatrix a0) P := by + have hsq : S ^ 2 = M := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using CFC.sq_sqrt M hMpos.posSemidef.nonneg + rw [pow_two] at hsq + change + ofFullBlockVec (Matrix.mulVec S (Matrix.mulVec S (toFullBlockVec P))) = + blockMatVecMul (constantBlockMatrix a0) P + calc + ofFullBlockVec (Matrix.mulVec S (Matrix.mulVec S (toFullBlockVec P))) = + ofFullBlockVec (Matrix.mulVec (S * S) (toFullBlockVec P)) := by + exact congrArg ofFullBlockVec + (Matrix.mulVec_mulVec (toFullBlockVec P) S S) + _ = ofFullBlockVec (Matrix.mulVec M (toFullBlockVec P)) := by rw [hsq] + _ = blockMatVecMul (ofFullBlockMat M) P := by + exact ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul M P + _ = blockMatVecMul (constantBlockMatrix a0) P := by + simp [M, constantFullBlockMatrix] + simp [hP, hQ] + +theorem matrixNorm_le_trace_of_posSemidef {d : ℕ} + (M : Mat d) (hM : M.PosSemidef) : + matrixNorm M ≤ Matrix.trace M := by + classical + let hHerm : M.IsHermitian := hM.isHermitian + have heig_nonneg : ∀ i : Fin d, 0 ≤ hHerm.eigenvalues i := + hM.eigenvalues_nonneg + have hsum_nonneg : 0 ≤ ∑ i : Fin d, hHerm.eigenvalues i := + Finset.sum_nonneg fun i _hi => heig_nonneg i + let D : Mat d := Matrix.diagonal hHerm.eigenvalues + have hspectral : M = Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D := by + simpa [D] using hHerm.spectral_theorem + calc + matrixNorm M = ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) M‖ := rfl + _ = ‖M‖ := Matrix.l2_opNorm_toEuclideanCLM M + _ = ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ := + congrArg (fun N : Mat d => ‖N‖) hspectral + _ = ‖D‖ := by + calc + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ = + ‖(hHerm.eigenvectorUnitary : Mat d) * D * + star (hHerm.eigenvectorUnitary : Mat d)‖ := by + simp [Unitary.conjStarAlgAut_apply] + _ = ‖D * star (hHerm.eigenvectorUnitary : Mat d)‖ := by + rw [mul_assoc, CStarRing.norm_coe_unitary_mul] + _ = ‖D * (star hHerm.eigenvectorUnitary : unitary (Mat d))‖ := by + simp + _ = ‖D‖ := by + rw [CStarRing.norm_mul_coe_unitary] + _ = ‖hHerm.eigenvalues‖ := by + simp [D] + _ ≤ ∑ i : Fin d, hHerm.eigenvalues i := by + refine (pi_norm_le_iff_of_nonneg hsum_nonneg).mpr ?_ + intro i + calc + ‖hHerm.eigenvalues i‖ = hHerm.eigenvalues i := by + simp [Real.norm_eq_abs, abs_of_nonneg (heig_nonneg i)] + _ ≤ ∑ j : Fin d, hHerm.eigenvalues j := + Finset.single_le_sum (fun j _hj => heig_nonneg j) (Finset.mem_univ i) + _ = Matrix.trace M := by + symm + simpa using hHerm.trace_eq_sum_eigenvalues + +theorem matTranspose_scalarMatrix {d : ℕ} (σ : ℝ) : + matTranspose (scalarMatrix (d := d) σ) = scalarMatrix (d := d) σ := by + ext i j + by_cases hij : i = j + · subst j + simp [matTranspose, scalarMatrix] + · have hji : j ≠ i := Ne.symm hij + simp [matTranspose, scalarMatrix, hij, hji] + +theorem symmPart_scalarMatrix {d : ℕ} (σ : ℝ) : + symmPart (scalarMatrix (d := d) σ) = scalarMatrix (d := d) σ := by + rw [symmPart_eq_smul_add_transpose, matTranspose_scalarMatrix] + ext i j + simp [scalarMatrix] + ring + +theorem skewPart_scalarMatrix {d : ℕ} (σ : ℝ) : + skewPart (scalarMatrix (d := d) σ) = (0 : Mat d) := by + rw [skewPart_eq_smul_sub_transpose, matTranspose_scalarMatrix] + simp + +theorem constantBlockMatrix_scalarMatrix {d : ℕ} {σ : ℝ} + (hσ : 0 < σ) : + constantBlockMatrix (scalarMatrix (d := d) σ) = + { upperLeft := scalarMatrix (d := d) σ + upperRight := 0 + lowerLeft := 0 + lowerRight := scalarMatrix (d := d) σ⁻¹ } := by + have hInv : ((scalarMatrix (d := d) σ)⁻¹ : Mat d) = + scalarMatrix (d := d) σ⁻¹ := by + rw [scalarMatrix, nonsing_inv_smul σ (ne_of_gt hσ) (by simp)] + simp [scalarMatrix] + unfold constantBlockMatrix + rw [BlockMat.mk.injEq] + constructor + · ext i j + simp [symmPart_scalarMatrix, skewPart_scalarMatrix, hInv, scalarMatrix] + constructor + · ext i j + simp [symmPart_scalarMatrix, skewPart_scalarMatrix, hInv, scalarMatrix, + matTranspose] + constructor + · ext i j + simp [symmPart_scalarMatrix, skewPart_scalarMatrix, hInv, scalarMatrix] + · ext i j + simp [symmPart_scalarMatrix, hInv, scalarMatrix] + +private theorem blockMatVecMul_constantBlockMatrix_scalarMatrix_probe + {d : ℕ} {σ : ℝ} (hσ : 0 < σ) (i : Fin d) : + blockMatVecMul (constantBlockMatrix (scalarMatrix (d := d) σ)) + ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) = + (Real.sqrt σ • Pi.single i 1, 0) := by + rw [constantBlockMatrix_scalarMatrix hσ] + ext k + · simp [blockMatVecMul, matVecMul_zero, matVecMul_scalarMatrix] + by_cases hki : k = i + · subst k + simp + field_simp [Real.sqrt_pos.2 hσ] + rw [Real.sq_sqrt hσ.le] + · simp [Pi.single_eq_of_ne hki] + · simp [blockMatVecMul, matVecMul_zero, matVecMul_scalarMatrix, matVecMul] + +private theorem vecDot_single_self_one {d : ℕ} (i : Fin d) : + vecDot (Pi.single i 1 : Vec d) (Pi.single i 1) = 1 := by + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _h hij + simp [Pi.single_eq_of_ne hij] + · simp + +private theorem scalarCoordinateProbe_constantBlockQuadratic_eq_one + {d : ℕ} {σ : ℝ} (hσ : 0 < σ) (i : Fin d) : + blockVecDot ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) + (blockMatVecMul (constantBlockMatrix (scalarMatrix (d := d) σ)) + ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0)) = 1 := by + rw [blockMatVecMul_constantBlockMatrix_scalarMatrix_probe hσ i] + rw [blockVecDot, vecDot_smul_left, vecDot_smul_right, vecDot_single_self_one] + simp [vecDot] + field_simp [Real.sqrt_pos.2 hσ] + +theorem doubledResponseJ_scalarCoordinateProbe_le_normalizedBlockResponseMax + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) + (i : Fin d) : + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) + ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) + (Real.sqrt σ • Pi.single i 1, 0) ≤ + normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) := by + let P : BlockVec d := ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) + have hquad : + blockVecDot P + (blockMatVecMul (constantBlockMatrix (scalarMatrix (d := d) σ)) P) = 1 := by + simpa [P] using scalarCoordinateProbe_constantBlockQuadratic_eq_one hσ i + have hmem0 := normalizedBlockResponseValueSet_mem_of_constantBlockQuadratic_eq_one + (Q := Q) (a := a) (a0 := scalarMatrix (d := d) σ) + (lam := σ) (Lam := σ) (isEllipticMatrix_scalarMatrix hσ) P hquad + have hmem : + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) + ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) + (Real.sqrt σ • Pi.single i 1, 0) ∈ + normalizedBlockResponseValueSet Q a (scalarMatrix (d := d) σ) := by + simpa [P, blockMatVecMul_constantBlockMatrix_scalarMatrix_probe hσ i] using hmem0 + unfold normalizedBlockResponseMax + exact le_csSup + (normalizedBlockResponseValueSet_bddAbove_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := Q) (k := Q.scale) (scalarMatrix (d := d) σ) + (by simp [descendantsAtScale_self])) hmem + +theorem specialCoordinateBlockJTraceBudget_le_card_mul_normalizedBlockResponseMax + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + specialCoordinateBlockJTraceBudget σ + (coarseBlockMatrix (cubeDomain Q) (a.coeffOn Q)) ≤ + (Fintype.card (Fin d) : ℝ) * + normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) := by + have hcp2 : (Real.sqrt σ)⁻¹ * (Real.sqrt σ)⁻¹ = σ⁻¹ := by + field_simp [Real.sqrt_pos.2 hσ] + rw [Real.sq_sqrt hσ.le] + have hcq2 : Real.sqrt σ * Real.sqrt σ = σ := by + simpa [pow_two] using Real.sq_sqrt hσ.le + have hcpq : (Real.sqrt σ)⁻¹ * Real.sqrt σ = 1 := by + field_simp [Real.sqrt_pos.2 hσ] + calc + specialCoordinateBlockJTraceBudget σ + (coarseBlockMatrix (cubeDomain Q) (a.coeffOn Q)) + = + ∑ i : Fin d, + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) + ((Real.sqrt σ)⁻¹ • Pi.single i 1, 0) + (Real.sqrt σ • Pi.single i 1, 0) := by + symm + exact sum_doubledResponseJ_coordinateScales_eq_specialCoordinateBlockJTraceBudget + (U := cubeDomain Q) (a := a.coeffOn Q) (σ := σ) + (cp := (Real.sqrt σ)⁻¹) (cq := Real.sqrt σ) hcp2 hcq2 hcpq + _ ≤ ∑ _i : Fin d, + normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) := by + exact Finset.sum_le_sum fun i _hi => + doubledResponseJ_scalarCoordinateProbe_le_normalizedBlockResponseMax + Q a hσ i + _ = + (Fintype.card (Fin d) : ℝ) * + normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) := by + simp [Finset.sum_const, nsmul_eq_mul] + +theorem weightedTrace_coarseBlockMatrix_eq_two_mul_budget_add_card + {d : ℕ} (U : Domain d) (a : CoeffOn U) (σ : ℝ) : + σ⁻¹ * Matrix.trace (bCoarse U a) + + σ * Matrix.trace (sigmaStarInvCoarse U a) = + 2 * (specialCoordinateBlockJTraceBudget σ (coarseBlockMatrix U a) + + (Fintype.card (Fin d) : ℝ)) := by + unfold specialCoordinateBlockJTraceBudget + simp [Matrix.trace, Finset.sum_add_distrib, Finset.sum_sub_distrib, + Finset.sum_const, nsmul_eq_mul] + have hB : + (∑ x : Fin d, (2 : ℝ)⁻¹ * (σ⁻¹ * bCoarse U a x x)) = + (2 : ℝ)⁻¹ * ∑ x : Fin d, σ⁻¹ * bCoarse U a x x := by + rw [Finset.mul_sum] + have hS : + (∑ x : Fin d, (2 : ℝ)⁻¹ * (σ * sigmaStarInvCoarse U a x x)) = + (2 : ℝ)⁻¹ * ∑ x : Fin d, σ * sigmaStarInvCoarse U a x x := by + rw [Finset.mul_sum] + rw [hB, hS] + rw [Finset.mul_sum, Finset.mul_sum] + ring + +theorem weightedCoarseEllipticityNorm_le_card_mul_normalizedBlockResponseMax_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + σ⁻¹ * coarseBMatrixNorm Q a + σ * coarseSigmaStarInvMatrixNorm Q a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + (normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) + 1) := by + let U : Domain d := cubeDomain Q + let aQ : CoeffOn U := a.coeffOn Q + let M : ℝ := normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) + have hbTrace : + coarseBMatrixNorm Q a ≤ Matrix.trace (bCoarse U aQ) := by + simpa [U, aQ, coarseBMatrixNorm] using + matrixNorm_le_trace_of_posSemidef (bCoarse U aQ) + (bCoarse_posSemidef U aQ) + have hsTrace : + coarseSigmaStarInvMatrixNorm Q a ≤ + Matrix.trace (sigmaStarInvCoarse U aQ) := by + simpa [U, aQ, coarseSigmaStarInvMatrixNorm] using + matrixNorm_le_trace_of_posSemidef (sigmaStarInvCoarse U aQ) + (sigmaStarInvCoarse_posDef U aQ).posSemidef + have hnormTrace : + σ⁻¹ * coarseBMatrixNorm Q a + σ * coarseSigmaStarInvMatrixNorm Q a ≤ + σ⁻¹ * Matrix.trace (bCoarse U aQ) + + σ * Matrix.trace (sigmaStarInvCoarse U aQ) := + add_le_add + (mul_le_mul_of_nonneg_left hbTrace (inv_nonneg.mpr hσ.le)) + (mul_le_mul_of_nonneg_left hsTrace hσ.le) + have hbudget : + specialCoordinateBlockJTraceBudget σ (coarseBlockMatrix U aQ) ≤ + (Fintype.card (Fin d) : ℝ) * M := by + simpa [U, aQ, M] using + specialCoordinateBlockJTraceBudget_le_card_mul_normalizedBlockResponseMax + Q a hσ + have htrace : + σ⁻¹ * Matrix.trace (bCoarse U aQ) + + σ * Matrix.trace (sigmaStarInvCoarse U aQ) ≤ + 2 * (Fintype.card (Fin d) : ℝ) * (M + 1) := by + calc + σ⁻¹ * Matrix.trace (bCoarse U aQ) + + σ * Matrix.trace (sigmaStarInvCoarse U aQ) + = + 2 * (specialCoordinateBlockJTraceBudget σ (coarseBlockMatrix U aQ) + + (Fintype.card (Fin d) : ℝ)) := + weightedTrace_coarseBlockMatrix_eq_two_mul_budget_add_card U aQ σ + _ ≤ 2 * ((Fintype.card (Fin d) : ℝ) * M + + (Fintype.card (Fin d) : ℝ)) := by + nlinarith + _ = 2 * (Fintype.card (Fin d) : ℝ) * (M + 1) := by + ring + exact hnormTrace.trans htrace + +theorem inv_mul_coarseBMatrixNorm_le_card_mul_normalizedBlockResponseMax_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + σ⁻¹ * coarseBMatrixNorm Q a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + (normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) + 1) := by + have htotal := + weightedCoarseEllipticityNorm_le_card_mul_normalizedBlockResponseMax_add_one + Q a hσ + have hlower_nonneg : 0 ≤ σ * coarseSigmaStarInvMatrixNorm Q a := + mul_nonneg hσ.le (coarseSigmaStarInvMatrixNorm_nonneg Q a) + nlinarith + +theorem sigma_mul_coarseSigmaStarInvMatrixNorm_le_card_mul_normalizedBlockResponseMax_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + σ * coarseSigmaStarInvMatrixNorm Q a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + (normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) + 1) := by + have htotal := + weightedCoarseEllipticityNorm_le_card_mul_normalizedBlockResponseMax_add_one + Q a hσ + have hupper_nonneg : 0 ≤ σ⁻¹ * coarseBMatrixNorm Q a := + mul_nonneg (inv_nonneg.mpr hσ.le) (coarseBMatrixNorm_nonneg Q a) + nlinarith + +theorem inv_mul_maxDescendantBMatrixNormAtScale_le_card_mul_maxResponse_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + σ⁻¹ * maxDescendantBMatrixNormAtScale Q k a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) + 1) := by + let C : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) + 1) + have hD : (descendantsAtScale Q k).Nonempty := + descendantsAtScale_nonempty Q hk + have hpoint : + ∀ R ∈ descendantsAtScale Q k, coarseBMatrixNorm R a ≤ σ * C := by + intro R hR + have hRone := + inv_mul_coarseBMatrixNorm_le_card_mul_normalizedBlockResponseMax_add_one + R a hσ + have hMle : + normalizedBlockResponseMax R a (scalarMatrix (d := d) σ) ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) := + normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale + a (scalarMatrix (d := d) σ) hR + have hcoef_nonneg : 0 ≤ 2 * (Fintype.card (Fin d) : ℝ) := by + positivity + have hRleC : σ⁻¹ * coarseBMatrixNorm R a ≤ C := by + dsimp [C] + exact hRone.trans + (mul_le_mul_of_nonneg_left (by linarith : _ ≤ _) hcoef_nonneg) + exact (inv_mul_le_iff₀ hσ).mp hRleC + have hsup : + maxDescendantBMatrixNormAtScale Q k a ≤ σ * C := by + simpa [maxDescendantBMatrixNormAtScale] using + finsetSupReal_le (descendantsAtScale Q k) hD hpoint + calc + σ⁻¹ * maxDescendantBMatrixNormAtScale Q k a ≤ σ⁻¹ * (σ * C) := + mul_le_mul_of_nonneg_left hsup (inv_nonneg.mpr hσ.le) + _ = C := by + field_simp [hσ.ne'] + +theorem sigma_mul_maxDescendantSigmaStarInvMatrixNormAtScale_le_card_mul_maxResponse_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + σ * maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) + 1) := by + let C : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) + 1) + have hD : (descendantsAtScale Q k).Nonempty := + descendantsAtScale_nonempty Q hk + have hpoint : + ∀ R ∈ descendantsAtScale Q k, + coarseSigmaStarInvMatrixNorm R a ≤ σ⁻¹ * C := by + intro R hR + have hRone := + sigma_mul_coarseSigmaStarInvMatrixNorm_le_card_mul_normalizedBlockResponseMax_add_one + R a hσ + have hMle : + normalizedBlockResponseMax R a (scalarMatrix (d := d) σ) ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) := + normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale + a (scalarMatrix (d := d) σ) hR + have hcoef_nonneg : 0 ≤ 2 * (Fintype.card (Fin d) : ℝ) := by + positivity + have hRleC : σ * coarseSigmaStarInvMatrixNorm R a ≤ C := by + dsimp [C] + exact hRone.trans + (mul_le_mul_of_nonneg_left (by linarith : _ ≤ _) hcoef_nonneg) + exact (le_inv_mul_iff₀ hσ).mpr hRleC + have hsup : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ σ⁻¹ * C := by + simpa [maxDescendantSigmaStarInvMatrixNormAtScale] using + finsetSupReal_le (descendantsAtScale Q k) hD hpoint + calc + σ * maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ σ * (σ⁻¹ * C) := + mul_le_mul_of_nonneg_left hsup hσ.le + _ = C := by + field_simp [hσ.ne'] + +theorem summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a a0) := by + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := 2) (C := normalizedBlockResponseUniformBound Q a a0) + (by nlinarith : 0 < s * (2 : ℝ)) ?_ ?_ + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + exact maxDescendantNormalizedBlockResponseAtScale_nonneg Q + (sub_le_self Q.scale hn) a a0 + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + exact maxDescendantNormalizedBlockResponseAtScale_le_uniform Q + (sub_le_self Q.scale hn) a a0 + +theorem tsum_geometricWeight_two_mul_maxResponse_add_one_eq_homogenizationError_sq_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) + {s : ℝ} (hs : 0 < s) : + (∑' n : ℕ, + geometricWeight s 2 n * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a a0 + 1)) = + (HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0) ^ 2 + 1 := by + let M : ℕ → ℝ := fun n => + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a a0 + let w : ℕ → ℝ := fun n => geometricWeight s 2 n + have hsumM : Summable (fun n : ℕ => w n * M n) := by + simpa [w, M] using + summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + Q a a0 hs + have hsumW : Summable w := by + simpa [w, geometricWeight_eq_old] using + Homogenization.summable_geometricWeight (s := s) (q := 2) + (by nlinarith : 0 < s * (2 : ℝ)) + calc + (∑' n : ℕ, + geometricWeight s 2 n * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a a0 + 1)) + = ∑' n : ℕ, (w n * M n + w n) := by + congr with n + simp [w, M] + ring + _ = (∑' n : ℕ, w n * M n) + ∑' n : ℕ, w n := by + exact hsumM.tsum_add hsumW + _ = (HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0) ^ 2 + 1 := by + rw [homogenizationErrorOnCube_infinity_two_sq_eq_tsum Q hs a a0] + rw [show (∑' n : ℕ, w n) = 1 by + simpa [w, geometricWeight_eq_old] using + Homogenization.tsum_geometricWeight_eq_one (s := s) (q := 2) + (by nlinarith : 0 < s * (2 : ℝ))] + +theorem inv_mul_LambdaSq_finite_two_le_card_mul_homogenizationError_sq_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s σ : ℝ} (hs : 0 < s) (hσ : 0 < σ) : + σ⁻¹ * LambdaSq Q s (.finite 2) a ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + let B : ℕ → ℝ := fun n => + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a + let M : ℕ → ℝ := fun n => + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix (d := d) σ) + let w : ℕ → ℝ := fun n => geometricWeight s 2 n + let C : ℝ := 2 * (Fintype.card (Fin d) : ℝ) + have hLambda_eq : LambdaSq Q s (.finite 2) a = ∑' n : ℕ, w n * B n := by + have h := LambdaSqFinite_rpow_q_div_two_eq_tsum Q s 2 a + (by norm_num : (0 : ℝ) < 2) (by nlinarith : 0 ≤ s * (2 : ℝ)) + simpa [w, B, Real.rpow_one] using h + have hsumB : Summable (fun n : ℕ => w n * B n) := by + have h := summable_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + simpa [w, B, Real.rpow_one] using h + have hsumR : Summable (fun n : ℕ => w n * (M n + 1)) := by + have hsumM : Summable (fun n : ℕ => w n * M n) := by + simpa [w, M] using + summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + Q a (scalarMatrix (d := d) σ) hs + have hsumW : Summable w := by + simpa [w, geometricWeight_eq_old] using + Homogenization.summable_geometricWeight (s := s) (q := 2) + (by nlinarith : 0 < s * (2 : ℝ)) + have hsumAdd := hsumM.add hsumW + simpa [mul_add, w, M] using hsumAdd + have hterm : ∀ n : ℕ, σ⁻¹ * (w n * B n) ≤ C * (w n * (M n + 1)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hscale := + inv_mul_maxDescendantBMatrixNormAtScale_le_card_mul_maxResponse_add_one + (Q := Q) (k := Q.scale - (n : ℤ)) (sub_le_self Q.scale hn) a hσ + have hw_nonneg : 0 ≤ w n := by + simpa [w, geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := s) (q := 2) n + (by nlinarith : 0 ≤ s * (2 : ℝ)) + dsimp [C, B, M, w] at hscale ⊢ + calc + σ⁻¹ * (geometricWeight s 2 n * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + = + geometricWeight s 2 n * + (σ⁻¹ * maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) := by + ring + _ ≤ + geometricWeight s 2 n * + (2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix σ) + 1)) := + mul_le_mul_of_nonneg_left hscale hw_nonneg + _ = + 2 * (Fintype.card (Fin d) : ℝ) * + (geometricWeight s 2 n * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix σ) + 1)) := by + ring + calc + σ⁻¹ * LambdaSq Q s (.finite 2) a + = ∑' n : ℕ, σ⁻¹ * (w n * B n) := by + rw [hLambda_eq] + exact (hsumB.tsum_mul_left σ⁻¹).symm + _ ≤ ∑' n : ℕ, C * (w n * (M n + 1)) := by + exact (hsumB.mul_left σ⁻¹).tsum_le_tsum hterm + (hsumR.mul_left C) + _ = C * (∑' n : ℕ, w n * (M n + 1)) := by + exact hsumR.tsum_mul_left C + _ = C * ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + rw [tsum_geometricWeight_two_mul_maxResponse_add_one_eq_homogenizationError_sq_add_one + Q a (scalarMatrix (d := d) σ) hs] + +theorem sigma_mul_lambdaSq_finite_two_inv_le_card_mul_homogenizationError_sq_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s σ : ℝ} (hs : 0 < s) (hσ : 0 < σ) : + σ * (lambdaSq Q s (.finite 2) a)⁻¹ ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + let S : ℕ → ℝ := fun n => + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a + let M : ℕ → ℝ := fun n => + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix (d := d) σ) + let w : ℕ → ℝ := fun n => geometricWeight s 2 n + let C : ℝ := 2 * (Fintype.card (Fin d) : ℝ) + have hlambda_eq : (lambdaSq Q s (.finite 2) a)⁻¹ = ∑' n : ℕ, w n * S n := by + have h := lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s 2 a + (by norm_num : (0 : ℝ) < 2) (by nlinarith : 0 ≤ s * (2 : ℝ)) + simpa [w, S, Real.rpow_one, Real.rpow_neg_one] using h + have hsumS : Summable (fun n : ℕ => w n * S n) := by + have h := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + simpa [w, S, Real.rpow_one] using h + have hsumR : Summable (fun n : ℕ => w n * (M n + 1)) := by + have hsumM : Summable (fun n : ℕ => w n * M n) := by + simpa [w, M] using + summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + Q a (scalarMatrix (d := d) σ) hs + have hsumW : Summable w := by + simpa [w, geometricWeight_eq_old] using + Homogenization.summable_geometricWeight (s := s) (q := 2) + (by nlinarith : 0 < s * (2 : ℝ)) + have hsumAdd := hsumM.add hsumW + simpa [mul_add, w, M] using hsumAdd + have hterm : ∀ n : ℕ, σ * (w n * S n) ≤ C * (w n * (M n + 1)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hscale := + sigma_mul_maxDescendantSigmaStarInvMatrixNormAtScale_le_card_mul_maxResponse_add_one + (Q := Q) (k := Q.scale - (n : ℤ)) (sub_le_self Q.scale hn) a hσ + have hw_nonneg : 0 ≤ w n := by + simpa [w, geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := s) (q := 2) n + (by nlinarith : 0 ≤ s * (2 : ℝ)) + dsimp [C, S, M, w] at hscale ⊢ + calc + σ * (geometricWeight s 2 n * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + = + geometricWeight s 2 n * + (σ * maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) := by + ring + _ ≤ + geometricWeight s 2 n * + (2 * (Fintype.card (Fin d) : ℝ) * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix σ) + 1)) := + mul_le_mul_of_nonneg_left hscale hw_nonneg + _ = + 2 * (Fintype.card (Fin d) : ℝ) * + (geometricWeight s 2 n * + (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a + (scalarMatrix σ) + 1)) := by + ring + calc + σ * (lambdaSq Q s (.finite 2) a)⁻¹ + = ∑' n : ℕ, σ * (w n * S n) := by + rw [hlambda_eq] + exact (hsumS.tsum_mul_left σ).symm + _ ≤ ∑' n : ℕ, C * (w n * (M n + 1)) := by + exact (hsumS.mul_left σ).tsum_le_tsum hterm + (hsumR.mul_left C) + _ = C * (∑' n : ℕ, w n * (M n + 1)) := by + exact hsumR.tsum_mul_left C + _ = C * ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + rw [tsum_geometricWeight_two_mul_maxResponse_add_one_eq_homogenizationError_sq_add_one + Q a (scalarMatrix (d := d) σ) hs] + +theorem max_weightedEllipticity_finite_two_le_card_mul_homogenizationError_sq_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s σ : ℝ} (hs : 0 < s) (hσ : 0 < σ) : + max (σ⁻¹ * LambdaSq Q s (.finite 2) a) + (σ * (lambdaSq Q s (.finite 2) a)⁻¹) ≤ + 2 * (Fintype.card (Fin d) : ℝ) * + ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + exact max_le + (inv_mul_LambdaSq_finite_two_le_card_mul_homogenizationError_sq_add_one + Q a hs hσ) + (sigma_mul_lambdaSq_finite_two_inv_le_card_mul_homogenizationError_sq_add_one + Q a hs hσ) + +theorem weightedEllipticity_finite_two_le_card_mul_homogenizationError_sq_add_one + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s σ : ℝ} (hs : 0 < s) (hσ : 0 < σ) : + σ⁻¹ * LambdaSq Q s (.finite 2) a + + σ * (lambdaSq Q s (.finite 2) a)⁻¹ ≤ + 4 * (Fintype.card (Fin d) : ℝ) * + ((HomogenizationErrorOnCube Q s .infinity (.finite 2) a + (scalarMatrix (d := d) σ)) ^ 2 + 1) := by + have hupper := + inv_mul_LambdaSq_finite_two_le_card_mul_homogenizationError_sq_add_one + Q a hs hσ + have hlower := + sigma_mul_lambdaSq_finite_two_inv_le_card_mul_homogenizationError_sq_add_one + Q a hs hσ + nlinarith + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Finite.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Finite.lean new file mode 100644 index 0000000000..88eb2d6bc8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Finite.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds + +/-! # Finite -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Finite exponent identities for the homogenization error + +This file records the finite-`q` algebra for the public homogenization error. +The first downstream use is the `p = infinity`, `q = 2` route: after squaring, +the square roots in the scale response disappear and `\mathcal E` is exactly +the geometrically weighted sum of the normalized block-response maxima. +-/ + +theorem scaleResponseAtScale_infinity_sq_eq + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + (scaleResponseAtScale Q k .infinity a a0) ^ 2 = + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + simpa [scaleResponseAtScale_infinity_eq, Real.sqrt_eq_rpow] using + Real.sq_sqrt (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hk a a0) + +theorem scaleResponseAtScale_infinity_rpow_two_eq + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + Real.rpow (scaleResponseAtScale Q k .infinity a a0) (2 : ℝ) = + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + simpa [Real.rpow_two] using scaleResponseAtScale_infinity_sq_eq Q hk a a0 + +theorem homogenizationErrorFinite_infinity_two_sq_eq_tsum + {d : ℕ} [NeZero d] (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + {s : ℝ} (hs : 0 < s) (a : TriadicCoeffFamily d) (a0 : Mat d) : + (HomogenizationErrorFinite Q n s .infinity 2 a a0) ^ 2 = + ∑' l : ℕ, + geometricWeight s 2 l * + maxDescendantNormalizedBlockResponseAtScale Q (n - (l : ℤ)) a a0 := by + let S : ℝ := + ∑' l : ℕ, + geometricWeight s 2 l * + maxDescendantNormalizedBlockResponseAtScale Q (n - (l : ℤ)) a a0 + have hterm : + (fun l : ℕ => + geometricWeight s 2 l * + Real.rpow (scaleResponseAtScale Q (n - (l : ℤ)) .infinity a a0) 2) = + fun l : ℕ => + geometricWeight s 2 l * + maxDescendantNormalizedBlockResponseAtScale Q (n - (l : ℤ)) a a0 := by + funext l + have hk : n - (l : ℤ) ≤ Q.scale := by + exact (sub_le_self n (by exact_mod_cast Nat.zero_le l)).trans hn + rw [scaleResponseAtScale_infinity_rpow_two_eq Q hk a a0] + have hS_nonneg : 0 ≤ S := by + dsimp [S] + refine tsum_nonneg ?_ + intro l + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 2) l + (by positivity : 0 ≤ s * (2 : ℝ))) + · have hk : n - (l : ℤ) ≤ Q.scale := by + exact (sub_le_self n (by exact_mod_cast Nat.zero_le l)).trans hn + exact maxDescendantNormalizedBlockResponseAtScale_nonneg Q hk a a0 + unfold HomogenizationErrorFinite + rw [hterm] + change Real.rpow S (1 / 2 : ℝ) ^ 2 = S + simpa [Real.sqrt_eq_rpow] using Real.sq_sqrt hS_nonneg + +theorem homogenizationErrorOnCube_infinity_two_sq_eq_tsum + {d : ℕ} [NeZero d] (Q : TriadicCube d) + {s : ℝ} (hs : 0 < s) (a : TriadicCoeffFamily d) (a0 : Mat d) : + (HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0) ^ 2 = + ∑' l : ℕ, + geometricWeight s 2 l * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (l : ℤ)) a a0 := by + simpa [HomogenizationErrorOnCube, HomogenizationError] using + homogenizationErrorFinite_infinity_two_sq_eq_tsum + (Q := Q) (n := Q.scale) le_rfl hs a a0 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/InfinityOne.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/InfinityOne.lean new file mode 100644 index 0000000000..9bac4b3b7b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/InfinityOne.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds + +/-! # Infinity One -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# The `p = infinity`, `q = 1` Homogenization Error Route + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +theorem summable_homogenizationErrorOnCube_infinity_one_terms + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0) := by + have hOld : + Summable (fun n : ℕ => + Homogenization.geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0) := by + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := 1) + (C := Real.rpow (normalizedBlockResponseUniformBound Q a a0) (1 / 2 : ℝ)) + (by simpa using hs) ?_ ?_ + · intro n + exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + · intro n + exact scaleResponseAtScale_infinity_le_uniform Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + simpa [geometricWeight_eq_old] using hOld + +theorem HomogenizationErrorOnCube_infinity_one_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + refine tsum_nonneg ?_ + intro n + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 1) n + (by simpa using hs.le)) + · exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + +theorem scaleResponseAtScale_infinity_self_le_homogenizationErrorOnCube_infinity_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + let c : ℝ := scaleResponseAtScale Q Q.scale .infinity a a0 + let g : ℕ → ℝ := fun n => geometricWeight s 1 n * c + let f : ℕ → ℝ := fun n => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + have hsum : Summable f := by + simpa [f] using + summable_homogenizationErrorOnCube_infinity_one_terms Q a a0 hs + have hgSummable : Summable g := by + have hOld : + Summable (fun n : ℕ => Homogenization.geometricWeight s 1 n * c) := + (Homogenization.summable_geometricWeight_one (s := s) hs).mul_right c + simpa [g, geometricWeight_eq_old] using hOld + have hterm : ∀ n : ℕ, g n ≤ f n := by + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hresp : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 := + scaleResponseAtScale_infinity_self_le Q hk a a0 + dsimp [g, f, c] + exact mul_le_mul_of_nonneg_left hresp (by + simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 1) n + (by simpa using hs.le))) + have hsumLe : ∑' n : ℕ, g n ≤ ∑' n : ℕ, f n := + Summable.tsum_le_tsum hterm hgSummable hsum + have hgEq : ∑' n : ℕ, g n = c := by + have hweight : (∑' n : ℕ, geometricWeight s 1 n) = 1 := by + simpa [geometricWeight_eq_old] using + (Homogenization.tsum_geometricWeight_one_eq_one (s := s) hs) + dsimp [g, c] + rw [tsum_mul_right, hweight, one_mul] + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + calc + scaleResponseAtScale Q Q.scale .infinity a a0 = ∑' n : ℕ, g n := by + exact hgEq.symm + _ ≤ ∑' n : ℕ, f n := hsumLe + +theorem homogenizationErrorOnCube_infinity_one_le_of_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) (a0 : Mat d) + {t s : ℝ} (ht : 0 < t) (hts : t < s) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ≤ + HomogenizationErrorOnCube Q t .infinity (.finite 1) a a0 := by + let H : ℕ → ℝ := fun n => + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by + linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + exact scaleResponseAtScale_infinity_le_of_le + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a a0 + have hnonneg : ∀ n : ℕ, 0 ≤ H n := by + intro n + exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + have hsum_t_old : + Summable (fun n : ℕ => Homogenization.geometricWeight t 1 n * H n) := by + have hsum_t := + summable_homogenizationErrorOnCube_infinity_one_terms Q a a0 ht + simpa [H, geometricWeight_eq_old] using hsum_t + have hOld := + Homogenization.tsum_geometricWeight_one_le_of_monotone + (H := H) hmono hnonneg ht hts hsum_t_old + rw [homogenizationErrorOnCube_infinity_one_eq_tsum, + homogenizationErrorOnCube_infinity_one_eq_tsum] + simpa [H, geometricWeight_eq_old] using hOld + +theorem homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) : + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + let fR : ℕ → ℝ := fun n => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0 + let factor : ℝ := Real.rpow (3 : ℝ) (s * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hsum : Summable fQ := by + simpa [fQ] using + summable_homogenizationErrorOnCube_infinity_one_terms Q a a0 hs + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 1) n + (by simpa using hs.le)) + · exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := + (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hresp : + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0 ≤ + scaleResponseAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) .infinity a a0 := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (scaleResponseAtScale_infinity_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a a0 hR hl) + have hshift : + geometricWeight s 1 n = + factor * geometricWeight s 1 (n + h) := by + simpa [factor, geometricWeight_eq_old] using + (Homogenization.geometricWeight_one_shift (s := s) h n) + calc + fR n = + factor * + (geometricWeight s 1 (n + h) * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) := by + dsimp [fR] + rw [hshift] + ring + _ ≤ factor * + (geometricWeight s 1 (n + h) * + scaleResponseAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) .infinity a a0) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hresp (by + simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 1) (n + h) + (by simpa using hs.le))) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := 1) n + (by simpa using hs.le)) + · exact scaleResponseAtScale_infinity_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := + Finset.sum_nonneg fun i _ => hQnonneg i + linarith + calc + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 = + ∑' n : ℕ, fR n := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + +theorem homogenizationErrorOnCube_infinity_one_descendantsAtScale_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) (a0 : Mat d) + {s : ℝ} (hs : 0 < s) : + finsetSupReal (descendantsAtScale Q k) + (fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + unfold finsetSupReal + have hne : + ((fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨HomogenizationErrorOnCube R s .infinity (.finite 1) a a0, + ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a a0 hs hR + +/-- Public proof package for the `p = infinity`, `q = 1` basic properties of +the homogenization error. -/ +theorem homogenizationErrorInfinityOneBasicTheory + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + HomogenizationErrorInfinityOneBasicTheory Q a a0 := by + refine + { scaleResponse_nonneg := ?_ + error_nonneg := ?_ + oneCube_le_error := ?_ + error_antitone := ?_ + descendant_error_le := ?_ + descendants_error_sup_le := ?_ } + · intro k hk + exact scaleResponseAtScale_infinity_nonneg Q hk a a0 + · intro s hs + exact HomogenizationErrorOnCube_infinity_one_nonneg Q a a0 hs + · intro s hs + exact scaleResponseAtScale_infinity_self_le_homogenizationErrorOnCube_infinity_one Q a a0 hs + · intro t s ht hts + exact homogenizationErrorOnCube_infinity_one_le_of_lt Q a a0 ht hts + · intro R k s hR hs + exact homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a a0 hs hR + · intro k s hk hs + exact homogenizationErrorOnCube_infinity_one_descendantsAtScale_le Q hk a a0 hs + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Public.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Public.lean new file mode 100644 index 0000000000..035010e75d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Public.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.AEEq + +/-! # Public -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# Public Chapter 2.5 Homogenization Error Package + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +/-- Aggregate unconditional public theorem package for the Sec. 2.5 +homogenization-error facts currently needed downstream. -/ +theorem homogenizationErrorTheory (d : ℕ) [NeZero d] : + HomogenizationErrorTheory d := by + refine ⟨?_⟩ + intro Q a a0 + exact homogenizationErrorInfinityOneBasicTheory Q a a0 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/ResponseBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/ResponseBounds.lean new file mode 100644 index 0000000000..6ffd91433d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/ResponseBounds.lean @@ -0,0 +1,662 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Translation + +/-! # Response Bounds -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# Response Bounds for Chapter 2.5 Homogenization Error + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +theorem CoeffOn.RestrictsTo.transpose {d : ℕ} {U V : Domain d} + {a : CoeffOn U} {b : CoeffOn V} (h : CoeffOn.RestrictsTo a b) : + CoeffOn.RestrictsTo a.transpose b.transpose := + h.mono fun x hx => by + simp [hx] + +/-- The public partition of an open triadic cube into descendants at a fixed +depth. -/ +noncomputable def descendantsDomainPartition {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : DomainPartition (cubeDomain Q) where + Cell := {R : TriadicCube d // R ∈ descendantsAtDepth Q j} + instFintype := inferInstance + cell i := cubeDomain i.1 + cell_subset_parent i := by + simpa [cubeDomain_coe] using openCubeSet_subset_of_mem_descendantsAtDepth i.2 + weight _ := ((Fintype.card {R : TriadicCube d // R ∈ descendantsAtDepth Q j} : ℝ)⁻¹) + weight_nonneg _ := by positivity + weight_sum_one := by + let D := descendantsAtDepth Q j + have hDne : D.Nonempty := descendantsAtDepth_nonempty Q j + have hcardD : (D.card : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr hDne + simp [Finset.sum_const, nsmul_eq_mul] + exact mul_inv_cancel₀ hcardD + triadic_realization := by + refine ⟨Q, j, rfl, ?_⟩ + refine ⟨Equiv.refl _, ?_⟩ + intro i + simp [cubeDomain_coe] + +theorem descendantsDomainPartition_weightedAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) : + (descendantsDomainPartition Q j).weightedAverage (fun i => F i.1) = + descendantsAverage Q j F := by + classical + let D := descendantsAtDepth Q j + have hsumSubtype : + (∑ s : {R : TriadicCube d // R ∈ D}, F s.1) = D.sum F := by + simpa using Finset.sum_attach D F + unfold DomainPartition.weightedAverage descendantsAverage descendantsDomainPartition + dsimp [D] at hsumSubtype ⊢ + rw [← hsumSubtype] + simp [Finset.mul_sum] + +/-- The public descendant partition's weighted matrix average is the +entrywise descendant average. -/ +theorem descendantsDomainPartition_weightedMatAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + (descendantsDomainPartition Q j).weightedMatAverage (fun i => F i.1) = + descendantsAverageMat Q j F := by + ext i k + simp [DomainPartition.weightedMatAverage, descendantsAverageMat, + descendantsDomainPartition_weightedAverage Q j (fun R => F R i k)] + +/-- The public descendant partition's weighted block-matrix average is the +entrywise descendant average. -/ +theorem descendantsDomainPartition_weightedBlockAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → BlockMat d) : + (descendantsDomainPartition Q j).weightedBlockAverage (fun i => F i.1) = + descendantsAverageBlockMat Q j F := by + simp [DomainPartition.weightedBlockAverage, descendantsAverageBlockMat] + exact + ⟨descendantsDomainPartition_weightedMatAverage Q j (fun R => (F R).upperLeft), + descendantsDomainPartition_weightedMatAverage Q j (fun R => (F R).upperRight), + descendantsDomainPartition_weightedMatAverage Q j (fun R => (F R).lowerLeft), + descendantsDomainPartition_weightedMatAverage Q j (fun R => (F R).lowerRight)⟩ + +theorem doubledResponseJ_nonneg {d : ℕ} (U : Domain d) (a : CoeffOn U) + (P Q : BlockVec d) : + 0 ≤ doubledResponseJ U a P Q := by + rcases P with ⟨p, q⟩ + rcases Q with ⟨qStar, pStar⟩ + rw [(doubledResponseTheory U a).doubledResponseJ_eq_scalar p pStar q qStar] + have h1 : 0 ≤ responseJ U a (p - pStar) (qStar - q) := + responseJ_nonneg U a (p - pStar) (qStar - q) + have h2 : 0 ≤ responseJ U a.transpose (pStar + p) (qStar + q) := + responseJ_nonneg U a.transpose (pStar + p) (qStar + q) + nlinarith + +theorem normalizedBlockResponseMax_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : + 0 ≤ normalizedBlockResponseMax Q a a0 := by + unfold normalizedBlockResponseMax + refine Real.sSup_nonneg ?_ + rintro x ⟨e, -, rfl⟩ + exact doubledResponseJ_nonneg (cubeDomain Q) (a.coeffOn Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + +theorem normalizedBlockResponseValueSet_nonempty {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : + (normalizedBlockResponseValueSet Q a a0).Nonempty := by + classical + have hd : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + let i0 : BlockCoord d := Sum.inl ⟨0, hd⟩ + let e : FullBlockVec d := Pi.single i0 1 + refine ⟨doubledResponseJ (cubeDomain Q) (a.coeffOn Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)), ?_⟩ + refine ⟨e, ?_, rfl⟩ + unfold fullBlockVecNormSq e + rw [Fintype.sum_eq_single i0] + · simp + · intro b hb + simp [hb] + +/-- A uniform deterministic bound for normalized block response on descendants +of `Q`, depending only on the root cube coefficient object and on `a0`. -/ +noncomputable def normalizedBlockResponseUniformBound {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : ℝ := + let c : ℝ := ((a.coeffOn Q).lam / (1 + 2 * (a.coeffOn Q).Lam ^ 2))⁻¹ + c * fullBlockMatRowAbsSqBound (constantFullBlockMatrixSqrt a0) + + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + fullBlockMatRowAbsSqBound (constantFullBlockMatrixInvSqrt a0) + +theorem normalizedBlockResponseValueSet_bddAbove_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) : + BddAbove (normalizedBlockResponseValueSet R a a0) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let MInv := constantFullBlockMatrixInvSqrt a0 + let MSqrt := constantFullBlockMatrixSqrt a0 + let c : ℝ := ((a.coeffOn Q).lam / (1 + 2 * (a.coeffOn Q).Lam ^ 2))⁻¹ + let B : ℝ := + c * fullBlockMatRowAbsSqBound MSqrt + + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + fullBlockMatRowAbsSqBound MInv + refine ⟨B, ?_⟩ + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + have hEllQ : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hEllR : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet R) A := + IsEllipticFieldOn.mono hEllQ (measurableSet_openCubeSet R) hsub + rintro m ⟨e, he, rfl⟩ + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) hsub + let P := ofFullBlockVec (Matrix.mulVec MInv e) + let Q' := ofFullBlockVec (Matrix.mulVec MSqrt e) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using + coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict (a := a) hk hR + have hEllRpw : + IsEllipticFieldOn aRpw.lam aRpw.Lam + (cubeDomain R : Set (Vec d)) aRpw.toCoeffField := by + simpa [aRpw, cubeDomain_coe, A] using! hEllR + have hJ : + doubledResponseJ (cubeDomain R) (a.coeffOn R) P Q' = + BlockJ (openCubeSet R) P Q' A := by + calc + doubledResponseJ (cubeDomain R) (a.coeffOn R) P Q' = + doubledResponseJ (cubeDomain R) aRpw P Q' := by + rw [doubledResponseJ_eq_ofAEEq haeeq P Q'] + _ = BlockJ (cubeDomain R : Set (Vec d)) P Q' aRpw.toCoeffField := by + exact + Internal.Ch02.BookCh02.book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn + (cubeDomain R) aRpw hEllRpw P Q' + _ = BlockJ (openCubeSet R) P Q' A := by + rfl + have hvolR : (MeasureTheory.volume (openCubeSet R)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hcoeff_nonneg : 0 ≤ c := by + have hden_pos : 0 < 1 + 2 * (a.coeffOn Q).Lam ^ 2 := by positivity + have hfrac_pos : 0 < (a.coeffOn Q).lam / (1 + 2 * (a.coeffOn Q).Lam ^ 2) := + div_pos (a.coeffOn Q).lam_pos hden_pos + dsimp [c] + positivity + have hbound_nonneg : + 0 ≤ blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam := by + unfold blockMatrixOfCoeffNormSqBound + have hLamSq : 0 ≤ (a.coeffOn Q).Lam ^ 2 := sq_nonneg _ + have hInvSq : 0 ≤ (a.coeffOn Q).lam⁻¹ * (a.coeffOn Q).lam⁻¹ := + mul_self_nonneg _ + have hFactor : 0 ≤ 2 * (a.coeffOn Q).Lam ^ 2 + 1 := by nlinarith + have hTail : + 0 ≤ + 2 * (2 * (a.coeffOn Q).Lam ^ 2 + 1) * + ((a.coeffOn Q).lam⁻¹ * (a.coeffOn Q).lam⁻¹) * + ((a.coeffOn Q).Lam ^ 2 + 1) := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by norm_num) hFactor) hInvSq) + (by nlinarith) + nlinarith + have hP : + blockVecDot P P ≤ fullBlockMatRowAbsSqBound MInv := by + dsimp [P, MInv] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + have hQ : + blockVecDot Q' Q' ≤ fullBlockMatRowAbsSqBound MSqrt := by + dsimp [Q', MSqrt] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + rw [hJ] + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet R).isFiniteMeasure_restrict_volume + calc + BlockJ (openCubeSet R) P Q' A ≤ + blockResponsePlainUpperBound (a.coeffOn Q).lam (a.coeffOn Q).Lam P Q' := by + exact blockJ_le_plainUpperBound_of_isEllipticFieldOn + (a := A) (U := openCubeSet R) (measurableSet_openCubeSet R) + hEllR hvolR P Q' + _ ≤ B := by + have htermQ : + c * blockVecDot Q' Q' ≤ c * fullBlockMatRowAbsSqBound MSqrt := + mul_le_mul_of_nonneg_left hQ hcoeff_nonneg + have htermP : + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + blockVecDot P P ≤ + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + fullBlockMatRowAbsSqBound MInv := + mul_le_mul_of_nonneg_left hP (mul_nonneg hcoeff_nonneg hbound_nonneg) + dsimp [B, c] + unfold blockResponsePlainUpperBound + dsimp [c] at htermQ htermP + linarith + +theorem normalizedBlockResponseMax_le_uniform_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) : + normalizedBlockResponseMax R a a0 ≤ + normalizedBlockResponseUniformBound Q a a0 := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let MInv := constantFullBlockMatrixInvSqrt a0 + let MSqrt := constantFullBlockMatrixSqrt a0 + let c : ℝ := ((a.coeffOn Q).lam / (1 + 2 * (a.coeffOn Q).Lam ^ 2))⁻¹ + let B : ℝ := + c * fullBlockMatRowAbsSqBound MSqrt + + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + fullBlockMatRowAbsSqBound MInv + have hB : + B = normalizedBlockResponseUniformBound Q a a0 := by + rfl + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + have hEllQ : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hEllR : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet R) A := + IsEllipticFieldOn.mono hEllQ (measurableSet_openCubeSet R) hsub + unfold normalizedBlockResponseMax + refine csSup_le (normalizedBlockResponseValueSet_nonempty R a a0) ?_ + rintro m ⟨e, he, rfl⟩ + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) hsub + let P := ofFullBlockVec (Matrix.mulVec MInv e) + let Q' := ofFullBlockVec (Matrix.mulVec MSqrt e) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using + coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict (a := a) hk hR + have hEllRpw : + IsEllipticFieldOn aRpw.lam aRpw.Lam + (cubeDomain R : Set (Vec d)) aRpw.toCoeffField := by + simpa [aRpw, cubeDomain_coe, A] using! hEllR + have hJ : + doubledResponseJ (cubeDomain R) (a.coeffOn R) P Q' = + BlockJ (openCubeSet R) P Q' A := by + calc + doubledResponseJ (cubeDomain R) (a.coeffOn R) P Q' = + doubledResponseJ (cubeDomain R) aRpw P Q' := by + rw [doubledResponseJ_eq_ofAEEq haeeq P Q'] + _ = BlockJ (cubeDomain R : Set (Vec d)) P Q' aRpw.toCoeffField := by + exact + Internal.Ch02.BookCh02.book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn + (cubeDomain R) aRpw hEllRpw P Q' + _ = BlockJ (openCubeSet R) P Q' A := by + rfl + have hvolR : (MeasureTheory.volume (openCubeSet R)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hcoeff_nonneg : 0 ≤ c := by + have hden_pos : 0 < 1 + 2 * (a.coeffOn Q).Lam ^ 2 := by positivity + have hfrac_pos : 0 < (a.coeffOn Q).lam / (1 + 2 * (a.coeffOn Q).Lam ^ 2) := + div_pos (a.coeffOn Q).lam_pos hden_pos + dsimp [c] + positivity + have hbound_nonneg : + 0 ≤ blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam := by + unfold blockMatrixOfCoeffNormSqBound + have hLamSq : 0 ≤ (a.coeffOn Q).Lam ^ 2 := sq_nonneg _ + have hInvSq : 0 ≤ (a.coeffOn Q).lam⁻¹ * (a.coeffOn Q).lam⁻¹ := + mul_self_nonneg _ + have hFactor : 0 ≤ 2 * (a.coeffOn Q).Lam ^ 2 + 1 := by nlinarith + have hTail : + 0 ≤ + 2 * (2 * (a.coeffOn Q).Lam ^ 2 + 1) * + ((a.coeffOn Q).lam⁻¹ * (a.coeffOn Q).lam⁻¹) * + ((a.coeffOn Q).Lam ^ 2 + 1) := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by norm_num) hFactor) hInvSq) + (by nlinarith) + nlinarith + have hP : + blockVecDot P P ≤ fullBlockMatRowAbsSqBound MInv := by + dsimp [P, MInv] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + have hQ : + blockVecDot Q' Q' ≤ fullBlockMatRowAbsSqBound MSqrt := by + dsimp [Q', MSqrt] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + rw [hJ, ← hB] + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet R).isFiniteMeasure_restrict_volume + calc + BlockJ (openCubeSet R) P Q' A ≤ + blockResponsePlainUpperBound (a.coeffOn Q).lam (a.coeffOn Q).Lam P Q' := by + exact blockJ_le_plainUpperBound_of_isEllipticFieldOn + (a := A) (U := openCubeSet R) (measurableSet_openCubeSet R) + hEllR hvolR P Q' + _ ≤ B := by + have htermQ : + c * blockVecDot Q' Q' ≤ c * fullBlockMatRowAbsSqBound MSqrt := + mul_le_mul_of_nonneg_left hQ hcoeff_nonneg + have htermP : + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + blockVecDot P P ≤ + c * blockMatrixOfCoeffNormSqBound (a.coeffOn Q).lam (a.coeffOn Q).Lam * + fullBlockMatRowAbsSqBound MInv := + mul_le_mul_of_nonneg_left hP (mul_nonneg hcoeff_nonneg hbound_nonneg) + dsimp [B, c] + unfold blockResponsePlainUpperBound + dsimp [c] at htermQ htermP + linarith + +theorem normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : TriadicCoeffFamily d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) : + normalizedBlockResponseMax R a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSupReal + have hBdd : + BddAbove + ((fun S => normalizedBlockResponseMax S a a0) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun S => normalizedBlockResponseMax S a a0)).bddAbove + exact le_csSup hBdd ⟨R, hR, rfl⟩ + +theorem maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k l : ℤ} + (a : TriadicCoeffFamily d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantNormalizedBlockResponseAtScale R l a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q l a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSupReal + have hne : + ((fun S => normalizedBlockResponseMax S a a0) '' + (↑(descendantsAtScale R l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty R hl with ⟨S, hS⟩ + exact ⟨normalizedBlockResponseMax S a a0, ⟨S, hS, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨S, hS, rfl⟩ + have hBdd : + BddAbove + ((fun T => normalizedBlockResponseMax T a a0) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun T => normalizedBlockResponseMax T a a0)).bddAbove + exact le_csSup hBdd ⟨S, mem_descendantsAtScale_trans hR hS, rfl⟩ + +theorem normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale_of_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) (a0 : Mat d) : + normalizedBlockResponseMax Q a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + classical + let j : ℕ := Int.toNat (Q.scale - k) + let Pcell : DomainPartition (cubeDomain Q) := descendantsDomainPartition Q j + have hj : (j : ℤ) = Q.scale - k := by + dsimp [j] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hcell : + ∀ i : Pcell.Cell, CoeffOn.RestrictsTo (a.coeffOn Q) (a.coeffOn i.1) := by + intro i + have hiScale : i.1 ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + change i.1 ∈ descendantsAtDepth Q j + exact i.2 + exact a.restrictsTo_descendant hk hiScale + unfold normalizedBlockResponseMax + refine csSup_le (normalizedBlockResponseValueSet_nonempty Q a a0) ?_ + rintro x ⟨e, he, rfl⟩ + let P := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + let F : TriadicCube d → ℝ := fun R => + responseJ (cubeDomain R) (a.coeffOn R) (P.1 - Q'.2) (Q'.1 - P.2) + let G : TriadicCube d → ℝ := fun R => + responseJ (cubeDomain R) (a.coeffOn R).transpose (Q'.2 + P.1) (Q'.1 + P.2) + have hrespF : + responseJ (cubeDomain Q) (a.coeffOn Q) (P.1 - Q'.2) (Q'.1 - P.2) ≤ + descendantsAverage Q j F := by + have hsub := + (responseSubadditivityAndScalingTheory (cubeDomain Q) (a.coeffOn Q)).responseJ_subadditive + Pcell (fun i : Pcell.Cell => a.coeffOn i.1) hcell + (P.1 - Q'.2) (Q'.1 - P.2) + calc + responseJ (cubeDomain Q) (a.coeffOn Q) (P.1 - Q'.2) (Q'.1 - P.2) + ≤ Pcell.weightedAverage + (fun i : Pcell.Cell => + responseJ (cubeDomain i.1) (a.coeffOn i.1) + (P.1 - Q'.2) (Q'.1 - P.2)) := by + simpa [Pcell, descendantsDomainPartition] using hsub + _ = descendantsAverage Q j F := by + simpa [Pcell, F] using + descendantsDomainPartition_weightedAverage Q j F + have hrespG : + responseJ (cubeDomain Q) (a.coeffOn Q).transpose (Q'.2 + P.1) (Q'.1 + P.2) ≤ + descendantsAverage Q j G := by + have hcellT : + ∀ i : Pcell.Cell, + CoeffOn.RestrictsTo (a.coeffOn Q).transpose (a.coeffOn i.1).transpose := + fun i => (hcell i).transpose + have hsub := + (responseSubadditivityAndScalingTheory (cubeDomain Q) + (a.coeffOn Q).transpose).responseJ_subadditive + Pcell (fun i : Pcell.Cell => (a.coeffOn i.1).transpose) hcellT + (Q'.2 + P.1) (Q'.1 + P.2) + calc + responseJ (cubeDomain Q) (a.coeffOn Q).transpose (Q'.2 + P.1) (Q'.1 + P.2) + ≤ Pcell.weightedAverage + (fun i : Pcell.Cell => + responseJ (cubeDomain i.1) (a.coeffOn i.1).transpose + (Q'.2 + P.1) (Q'.1 + P.2)) := by + simpa [Pcell, descendantsDomainPartition] using hsub + _ = descendantsAverage Q j G := by + simpa [Pcell, G] using + descendantsDomainPartition_weightedAverage Q j G + have hcombine : + (1 / 2 : ℝ) * descendantsAverage Q j F + + (1 / 2 : ℝ) * descendantsAverage Q j G = + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + calc + (1 / 2 : ℝ) * descendantsAverage Q j F + + (1 / 2 : ℝ) * descendantsAverage Q j G = + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R) + + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * G R) := by + rw [descendantsAverage_smul, descendantsAverage_smul] + _ = descendantsAverage Q j + (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + symm + exact descendantsAverage_add Q j + (fun R => (1 / 2 : ℝ) * F R) + (fun R => (1 / 2 : ℝ) * G R) + have hresp : + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) P Q' ≤ + descendantsAverage Q j + (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + calc + doubledResponseJ (cubeDomain Q) (a.coeffOn Q) P Q' = + (1 / 2 : ℝ) * + responseJ (cubeDomain Q) (a.coeffOn Q) + (P.1 - Q'.2) (Q'.1 - P.2) + + (1 / 2 : ℝ) * + responseJ (cubeDomain Q) (a.coeffOn Q).transpose + (Q'.2 + P.1) (Q'.1 + P.2) := by + simpa [P, Q'] using + (doubledResponseTheory (cubeDomain Q) (a.coeffOn Q)).doubledResponseJ_eq_scalar + P.1 Q'.2 P.2 Q'.1 + _ ≤ (1 / 2 : ℝ) * descendantsAverage Q j F + + (1 / 2 : ℝ) * descendantsAverage Q j G := by + nlinarith + _ = descendantsAverage Q j + (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := hcombine + have hpointwise : + ∀ R ∈ descendantsAtDepth Q j, + (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R ≤ + normalizedBlockResponseMax R a a0 := by + intro R hRdepth + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hRdepth + have hmem : + (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R ∈ + normalizedBlockResponseValueSet R a a0 := by + refine ⟨e, he, ?_⟩ + dsimp [F, G, P, Q'] + exact + ((doubledResponseTheory (cubeDomain R) (a.coeffOn R)).doubledResponseJ_eq_scalar + P.1 Q'.2 P.2 Q'.1).symm + unfold normalizedBlockResponseMax + exact le_csSup + (normalizedBlockResponseValueSet_bddAbove_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := k) a0 hRk) + hmem + have havg : + descendantsAverage Q j + (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) ≤ + descendantsAverage Q j (fun R => normalizedBlockResponseMax R a a0) := + descendantsAverage_le_descendantsAverage Q j hpointwise + have hmax : + descendantsAverage Q j (fun R => normalizedBlockResponseMax R a a0) ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j, finsetSupReal_eq_finsetSsup] using + descendantsAverage_le_finsetSsup Q j + (fun R => normalizedBlockResponseMax R a a0) + exact le_trans hresp (le_trans havg hmax) + +theorem maxDescendantNormalizedBlockResponseAtScale_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + 0 ≤ maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact le_trans (normalizedBlockResponseMax_nonneg R a a0) + (normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale + a a0 hR) + +theorem maxDescendantNormalizedBlockResponseAtScale_le_uniform + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q k a a0 ≤ + normalizedBlockResponseUniformBound Q a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSupReal + have hne : + ((fun R => normalizedBlockResponseMax R a a0) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨normalizedBlockResponseMax R a a0, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact normalizedBlockResponseMax_le_uniform_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := k) a0 hR + +theorem maxDescendantNormalizedBlockResponseAtScale_le_of_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q l a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSupReal + have hne : + ((fun R => normalizedBlockResponseMax R a a0) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hlQ with ⟨R, hR⟩ + exact ⟨normalizedBlockResponseMax R a a0, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hRscale : R.scale = l := descendant_scale_eq_of_mem_descendantsAtScale hR + have hkR : k ≤ R.scale := by + simpa [hRscale] using hkl + have hRle : + normalizedBlockResponseMax R a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale R k a a0 := + normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale_of_le + (Q := R) (k := k) hkR a a0 + have hRQ : + maxDescendantNormalizedBlockResponseAtScale R k a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := + maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := l) (l := k) a a0 hR hkR + exact le_trans hRle hRQ + +theorem scaleResponseAtScale_infinity_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + 0 ≤ scaleResponseAtScale Q k .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq] + exact Real.rpow_nonneg + (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hk a a0) _ + +theorem scaleResponseAtScale_infinity_le_of_mem_descendantsAtScale {d : ℕ} + [NeZero d] {Q R : TriadicCube d} {k l : ℤ} + (a : TriadicCoeffFamily d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + scaleResponseAtScale R l .infinity a a0 ≤ + scaleResponseAtScale Q l .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, scaleResponseAtScale_infinity_eq] + refine Real.rpow_le_rpow + (maxDescendantNormalizedBlockResponseAtScale_nonneg R hl a a0) + (maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale + a a0 hR hl) ?_ + norm_num + +theorem scaleResponseAtScale_infinity_le_of_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) + (a : TriadicCoeffFamily d) (a0 : Mat d) : + scaleResponseAtScale Q l .infinity a a0 ≤ + scaleResponseAtScale Q k .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, scaleResponseAtScale_infinity_eq] + refine Real.rpow_le_rpow + (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hlQ a a0) + (maxDescendantNormalizedBlockResponseAtScale_le_of_le + (Q := Q) (k := k) (l := l) hkl hlQ a a0) ?_ + norm_num + +theorem scaleResponseAtScale_infinity_self_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) (a0 : Mat d) : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + scaleResponseAtScale Q k .infinity a a0 := + scaleResponseAtScale_infinity_le_of_le + (Q := Q) (k := k) (l := Q.scale) hk le_rfl a a0 + +theorem scaleResponseAtScale_infinity_le_uniform + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) (a0 : Mat d) : + scaleResponseAtScale Q k .infinity a a0 ≤ + Real.rpow (normalizedBlockResponseUniformBound Q a a0) (1 / 2 : ℝ) := by + rw [scaleResponseAtScale_infinity_eq] + exact Real.rpow_le_rpow + (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hk a a0) + (maxDescendantNormalizedBlockResponseAtScale_le_uniform Q hk a a0) + (by norm_num) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Translation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Translation.lean new file mode 100644 index 0000000000..d88d40a5e4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationError/Translation.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Basic + +/-! # Translation -/ + +@[expose] public section + +open scoped BigOperators MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + + +/-! +# Translation Covariance for Chapter 2.5 Homogenization Error + +This file proves the public basic properties of the homogenization error +`\mathcal E_{s,\infty,1}` from Sec. 2.5. +-/ + +/-- Translation covariance of descendant normalized-response maxima, reduced +to one-cube normalized-response covariance. -/ +theorem maxDescendantNormalizedBlockResponseAtScale_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (a0 : Mat d) {k : ℤ} (hk : k ≤ Q.scale) + (hJ : ∀ R ∈ descendantsAtScale Q k, + normalizedBlockResponseMax + (translateCube (descendantTranslationShift (Int.toNat (Q.scale - k)) z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + maxDescendantNormalizedBlockResponseAtScale (translateCube z Q) k a a0 = + maxDescendantNormalizedBlockResponseAtScale Q k b a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + rw [descendantsAtScale_translateCube z Q hk] + exact finsetSupReal_image _ _ _ _ hJ + +/-- Translation covariance of the scale-level response aggregation, reduced to +one-cube normalized-response covariance. -/ +theorem scaleResponseAtScale_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (a0 : Mat d) {k : ℤ} (hk : k ≤ Q.scale) + (p : MultiscaleExponent) + (hJ : ∀ R ∈ descendantsAtScale Q k, + normalizedBlockResponseMax + (translateCube (descendantTranslationShift (Int.toNat (Q.scale - k)) z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + scaleResponseAtScale (translateCube z Q) k p a a0 = + scaleResponseAtScale Q k p b a0 := by + cases p with + | finite p => + unfold scaleResponseAtScale + rw [descendantsAtScale_translateCube z Q hk] + refine congrArg (fun x : ℝ => Real.rpow x (1 / p)) ?_ + refine finsetAverageReal_image _ _ ?_ _ _ ?_ + · exact (translateCube_injective + (descendantTranslationShift (Int.toNat (Q.scale - k)) z)).injOn + · intro R hR + exact congrArg (fun x : ℝ => Real.rpow x (p / 2)) (hJ R hR) + | infinity => + unfold scaleResponseAtScale + exact congrArg (fun x : ℝ => Real.rpow x (1 / 2)) + (maxDescendantNormalizedBlockResponseAtScale_translateCube_of_normalizedBlockResponseMax + a b z Q a0 hk hJ) + +/-- Translation covariance of finite-`q` homogenization error, reduced to +one-cube normalized-response covariance on all descendant scales used by the +series. -/ +theorem HomogenizationErrorFinite_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) (s : ℝ) + (p : MultiscaleExponent) (q : ℝ) (a0 : Mat d) + (hJ : ∀ (l : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (n - (l : ℤ)) → + normalizedBlockResponseMax + (translateCube + (descendantTranslationShift + (Int.toNat (Q.scale - (n - (l : ℤ)))) z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + HomogenizationErrorFinite (translateCube z Q) n s p q a a0 = + HomogenizationErrorFinite Q n s p q b a0 := by + unfold HomogenizationErrorFinite + refine congrArg (fun x : ℝ => Real.rpow x (1 / q)) ?_ + apply tsum_congr + intro l + have hk : n - (l : ℤ) ≤ Q.scale := by + exact le_trans (sub_le_self n (by exact_mod_cast Nat.zero_le l)) hn + have hscale := + scaleResponseAtScale_translateCube_of_normalizedBlockResponseMax + (a := a) (b := b) z Q a0 (k := n - (l : ℤ)) hk p + (by + intro R hR + simpa using hJ l R hR) + simpa [translateCube] using + congrArg (fun x => geometricWeight s q l * Real.rpow x q) hscale + +/-- Translation covariance of endpoint homogenization error, reduced to +one-cube normalized-response covariance on all descendant scales used by the +supremum. -/ +theorem HomogenizationErrorInfinity_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) (s : ℝ) + (p : MultiscaleExponent) (a0 : Mat d) + (hJ : ∀ (l : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (n - (l : ℤ)) → + normalizedBlockResponseMax + (translateCube + (descendantTranslationShift + (Int.toNat (Q.scale - (n - (l : ℤ)))) z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + HomogenizationErrorInfinity (translateCube z Q) n s p a a0 = + HomogenizationErrorInfinity Q n s p b a0 := by + unfold HomogenizationErrorInfinity + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + have hk : n - (l : ℤ) ≤ Q.scale := by + exact le_trans (sub_le_self n (by exact_mod_cast Nat.zero_le l)) hn + have hscale := + scaleResponseAtScale_translateCube_of_normalizedBlockResponseMax + (a := a) (b := b) z Q a0 (k := n - (l : ℤ)) hk p + (by + intro R hR + simpa using hJ l R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-s * (l : ℝ)) * x) hscale + · rintro ⟨l, rfl⟩ + refine ⟨l, ?_⟩ + have hk : n - (l : ℤ) ≤ Q.scale := by + exact le_trans (sub_le_self n (by exact_mod_cast Nat.zero_le l)) hn + have hscale := + scaleResponseAtScale_translateCube_of_normalizedBlockResponseMax + (a := a) (b := b) z Q a0 (k := n - (l : ℤ)) hk p + (by + intro R hR + simpa using hJ l R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-s * (l : ℝ)) * x) hscale.symm + +/-- Translation covariance of homogenization error, reduced to one-cube +normalized-response covariance. -/ +theorem HomogenizationError_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) (s : ℝ) + (p q : MultiscaleExponent) (a0 : Mat d) + (hJ : ∀ (l : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (n - (l : ℤ)) → + normalizedBlockResponseMax + (translateCube + (descendantTranslationShift + (Int.toNat (Q.scale - (n - (l : ℤ)))) z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + HomogenizationError (translateCube z Q) n s p q a a0 = + HomogenizationError Q n s p q b a0 := by + cases q with + | finite q => + exact HomogenizationErrorFinite_translateCube_of_normalizedBlockResponseMax + a b z Q hn s p q a0 hJ + | infinity => + exact HomogenizationErrorInfinity_translateCube_of_normalizedBlockResponseMax + a b z Q hn s p a0 hJ + +/-- Translation covariance of the on-cube homogenization error, reduced to +one-cube normalized-response covariance. -/ +theorem HomogenizationErrorOnCube_translateCube_of_normalizedBlockResponseMax + {d : ℕ} [NeZero d] (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) (p q : MultiscaleExponent) (a0 : Mat d) + (hJ : ∀ (l : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (l : ℤ)) → + normalizedBlockResponseMax (translateCube (descendantTranslationShift l z) R) + a a0 = + normalizedBlockResponseMax R b a0) : + HomogenizationErrorOnCube (translateCube z Q) s p q a a0 = + HomogenizationErrorOnCube Q s p q b a0 := by + unfold HomogenizationErrorOnCube + refine HomogenizationError_translateCube_of_normalizedBlockResponseMax + a b z Q le_rfl s p q a0 ?_ + intro l R hR + have hnat : + Int.toNat (Q.scale - (Q.scale - (l : ℤ))) = l := by + simp + simpa [hnat] using hJ l R hR + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationErrorDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationErrorDefinitions.lean new file mode 100644 index 0000000000..2268871217 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/HomogenizationErrorDefinitions.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.HomogenizationError + +/-! # Homogenization Error Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Public Chapter 2.5 Homogenization-Error Theorem Surface + +This file records the note-facing basic properties of +`\mathcal E_{s,\infty,1}`. The coefficient field is the public +`TriadicCoeffFamily`, so ellipticity and cube compatibility are a.e. facts. +-/ + +/-- Public theorem package for +`l.multiscale.homogenization.error.basic.definitions`, in the downstream +`p = infinity`, `q = 1` form used by the Chapter 3 coarse estimates. -/ +structure HomogenizationErrorInfinityOneBasicTheory {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d) : Prop where + scaleResponse_nonneg : + ∀ {k : ℤ}, k ≤ Q.scale → + 0 ≤ scaleResponseAtScale Q k .infinity a a0 + error_nonneg : + ∀ {s : ℝ}, 0 < s → + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + oneCube_le_error : + ∀ {s : ℝ}, 0 < s → + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + error_antitone : + ∀ {t s : ℝ}, 0 < t → t < s → + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ≤ + HomogenizationErrorOnCube Q t .infinity (.finite 1) a a0 + descendant_error_le : + ∀ {R : TriadicCube d} {k : ℤ} {s : ℝ}, + R ∈ descendantsAtScale Q k → 0 < s → + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + descendants_error_sup_le : + ∀ {k : ℤ} {s : ℝ}, k ≤ Q.scale → 0 < s → + finsetSupReal (descendantsAtScale Q k) + (fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + +/-- Aggregate public theorem package for the homogenization-error part of +Sec. 2.5. -/ +structure HomogenizationErrorTheory (d : ℕ) [NeZero d] : Prop where + infinity_one_basic : + ∀ (Q : TriadicCube d) (a : TriadicCoeffFamily d) (a0 : Mat d), + HomogenizationErrorInfinityOneBasicTheory Q a a0 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentities.lean new file mode 100644 index 0000000000..669342b307 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentities.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MagicIdentities + +/-! # Magic Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public note-facing magic identities for the response functional. -/ +theorem responseMagicIdentitiesTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ResponseMagicIdentitiesTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseMagicIdentitiesTheory U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentitiesDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentitiesDefinitions.lean new file mode 100644 index 0000000000..7dbd2e351f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MagicIdentitiesDefinitions.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction + +/-! # Magic Identities Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for `l.magic.identities.basic.definitions`. + +The canonical public theorem proving this package is +`responseMagicIdentitiesTheory` in `MagicIdentities.lean`. -/ +structure ResponseMagicIdentitiesTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Prop where + completed_square : + ∀ p q : Vec d, + responseJ U a p q = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * + vecDot + (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p)) + adjoint_quadratic : + ∀ p q : Vec d, + responseJ U a.transpose p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q + response_adjoint_sum : + ∀ p q h : Vec d, + responseJ U a p (q - h) + responseJ U a.transpose p (q + h) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (h - matVecMul (kappaCoarse U a) p)) + diagonal_magic : + ∀ e : Vec d, + responseJ U a e (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) e) + + responseJ U a.transpose e + (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) e) = + vecDot e (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) e) + sigmaStar_le_sigma : + MatLoewnerLE (sigmaStarCoarse U a) (sigmaCoarse U a) + kappa_symm_le_defect : + MatLoewnerLE + (kappaCoarse U a + matTranspose (kappaCoarse U a)) + (sigmaCoarse U a - sigmaStarCoarse U a) + neg_kappa_symm_le_defect : + MatLoewnerLE + (-(kappaCoarse U a + matTranspose (kappaCoarse U a))) + (sigmaCoarse U a - sigmaStarCoarse U a) + +namespace ResponseMagicIdentitiesTheory + +/-- The magic identities depend only on the public coefficient representative +up to a.e. equality on the domain. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hTheory : ResponseMagicIdentitiesTheory U a) : + ResponseMagicIdentitiesTheory U b where + completed_square := by + intro p q + simpa [responseJ_eq_ofAEEq h p q, sigmaCoarse_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h, kappaCoarse_eq_ofAEEq h, + sigmaStarInvCoarse_eq_ofAEEq h] using hTheory.completed_square p q + adjoint_quadratic := by + intro p q + simpa [responseJ_eq_ofAEEq h.transpose p q, sigmaCoarse_eq_ofAEEq h, + kappaCoarse_eq_ofAEEq h, sigmaStarInvCoarse_eq_ofAEEq h] using + hTheory.adjoint_quadratic p q + response_adjoint_sum := by + intro p q k + simpa [responseJ_eq_ofAEEq h p (q - k), + responseJ_eq_ofAEEq h.transpose p (q + k), sigmaCoarse_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h, kappaCoarse_eq_ofAEEq h, + sigmaStarInvCoarse_eq_ofAEEq h] using + hTheory.response_adjoint_sum p q k + diagonal_magic := by + intro e + simpa [responseJ_eq_ofAEEq h e + (matVecMul (sigmaStarCoarse U b - kappaCoarse U b) e), + responseJ_eq_ofAEEq h.transpose e + (matVecMul (sigmaStarCoarse U b + kappaCoarse U b) e), + sigmaCoarse_eq_ofAEEq h, sigmaStarCoarse_eq_ofAEEq h, + kappaCoarse_eq_ofAEEq h] using hTheory.diagonal_magic e + sigmaStar_le_sigma := by + simpa [sigmaStarCoarse_eq_ofAEEq h, sigmaCoarse_eq_ofAEEq h] using + hTheory.sigmaStar_le_sigma + kappa_symm_le_defect := by + simpa [sigmaCoarse_eq_ofAEEq h, sigmaStarCoarse_eq_ofAEEq h, + kappaCoarse_eq_ofAEEq h] using hTheory.kappa_symm_le_defect + neg_kappa_symm_le_defect := by + simpa [sigmaCoarse_eq_ofAEEq h, sigmaStarCoarse_eq_ofAEEq h, + kappaCoarse_eq_ofAEEq h] using hTheory.neg_kappa_symm_le_defect + +/-- A.e.-equivalent coefficient representatives satisfy the same magic +identity package. -/ +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseMagicIdentitiesTheory U a ↔ ResponseMagicIdentitiesTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseMagicIdentitiesTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtraction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtraction.lean new file mode 100644 index 0000000000..4f5402adfa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtraction.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions + +/-! # Matrix Extraction -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Note-facing identities characterizing the coarse-grained matrices. -/ +structure ResponseMatrixIdentities {d : ℕ} (U : Domain d) (a : CoeffOn U) + (M : CoarseMatrices d) : Prop where + sigma_symm : M.sigma.IsSymm + sigmaStarInv_symm : M.sigmaStarInv.IsSymm + sigmaStarInv_response : + ∀ q : Vec d, + responseJ U a 0 q = + (1 / 2 : ℝ) * vecDot q (matVecMul M.sigmaStarInv q) + kappa_response : + ∀ p q : Vec d, + mixedResponse U a p q = + vecDot q (matVecMul M.sigmaStarInv (matVecMul M.kappa p)) + sigma_response : + ∀ p : Vec d, + sigmaCorrectedResponse U a M p = + (1 / 2 : ℝ) * vecDot p (matVecMul M.sigma p) + full_response : + ∀ p q : Vec d, + responseJ U a p q = + (1 / 2 : ℝ) * vecDot p (matVecMul M.sigma p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul M.kappa p) + (matVecMul M.sigmaStarInv (q + matVecMul M.kappa p)) - + vecDot p q + +namespace ResponseMatrixIdentities + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {M : CoarseMatrices d} + (hM : ResponseMatrixIdentities U a M) : + ResponseMatrixIdentities U b M where + sigma_symm := hM.sigma_symm + sigmaStarInv_symm := hM.sigmaStarInv_symm + sigmaStarInv_response := by + intro q + simpa [responseJ_eq_ofAEEq h (0 : Vec d) q] using hM.sigmaStarInv_response q + kappa_response := by + intro p q + simpa [mixedResponse, responseJ_eq_ofAEEq h p q, + responseJ_eq_ofAEEq h p (0 : Vec d), responseJ_eq_ofAEEq h (0 : Vec d) q] + using hM.kappa_response p q + sigma_response := by + intro p + simpa [sigmaCorrectedResponse, responseJ_eq_ofAEEq h p (0 : Vec d)] + using hM.sigma_response p + full_response := by + intro p q + simpa [responseJ_eq_ofAEEq h p q] using hM.full_response p q + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) {M : CoarseMatrices d} : + ResponseMatrixIdentities U a M ↔ ResponseMatrixIdentities U b M := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseMatrixIdentities + +/-- The canonical note-facing matrix-extraction target: the matrices obtained +directly from `J` satisfy the response identities. -/ +def CanonicalResponseMatrixIdentities {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Prop := + ResponseMatrixIdentities U a (coarseMatrices U a) + +namespace CanonicalResponseMatrixIdentities + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hM : CanonicalResponseMatrixIdentities U a) : + CanonicalResponseMatrixIdentities U b := by + simpa [CanonicalResponseMatrixIdentities, coarseMatrices_eq_ofAEEq h] using + ResponseMatrixIdentities.ofAEEq h hM + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + CanonicalResponseMatrixIdentities U a ↔ + CanonicalResponseMatrixIdentities U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end CanonicalResponseMatrixIdentities + +/-- Existence of public coarse-grained matrices satisfying the note-facing +identities. -/ +def ResponseMatrixExists {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop := + ∃ M : CoarseMatrices d, ResponseMatrixIdentities U a M + +namespace ResponseMatrixExists + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hM : ResponseMatrixExists U a) : ResponseMatrixExists U b := by + rcases hM with ⟨M, hIdent⟩ + exact ⟨M, hIdent.ofAEEq h⟩ + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseMatrixExists U a ↔ ResponseMatrixExists U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseMatrixExists + +/-- Canonical matrix identities imply the existential matrix-extraction +statement. -/ +theorem responseMatrixExists_of_canonicalResponseMatrixIdentities {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hM : CanonicalResponseMatrixIdentities U a) : + ResponseMatrixExists U a := + ⟨coarseMatrices U a, hM⟩ + +/-- Chosen public coarse-grained matrices, once the extraction theorem has been +supplied. -/ +noncomputable def responseMatrices {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) : CoarseMatrices d := + Classical.choose hM + +theorem responseMatrices_identities {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) : + ResponseMatrixIdentities U a (responseMatrices hM) := + Classical.choose_spec hM + +noncomputable def sigmaMatrix {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) : Mat d := + (responseMatrices hM).sigma + +noncomputable def sigmaStarInvMatrix {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) : Mat d := + (responseMatrices hM).sigmaStarInv + +noncomputable def kappaMatrix {d : ℕ} {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) : Mat d := + (responseMatrices hM).kappa + +theorem responseJ_eq_coarseMatrices_formula {d : ℕ} + {U : Domain d} {a : CoeffOn U} {M : CoarseMatrices d} + (hM : ResponseMatrixIdentities U a M) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * vecDot p (matVecMul M.sigma p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul M.kappa p) + (matVecMul M.sigmaStarInv (q + matVecMul M.kappa p)) - + vecDot p q := + hM.full_response p q + +theorem responseJ_eq_canonical_coarseMatrices_formula {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hM : CanonicalResponseMatrixIdentities U a) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q + matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + simpa [CanonicalResponseMatrixIdentities, coarseMatrices] using + responseJ_eq_coarseMatrices_formula hM p q + +theorem responseJ_eq_responseMatrices_formula {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hM : ResponseMatrixExists U a) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaMatrix hM) p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul (kappaMatrix hM) p) + (matVecMul (sigmaStarInvMatrix hM) + (q + matVecMul (kappaMatrix hM) p)) - + vecDot p q := by + simpa [sigmaMatrix, sigmaStarInvMatrix, kappaMatrix] using + responseJ_eq_coarseMatrices_formula (responseMatrices_identities hM) p q + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtractionProofs.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtractionProofs.lean new file mode 100644 index 0000000000..0ddf9bd245 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixExtractionProofs.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction + +/-! # Matrix Extraction Proofs -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- The canonical coarse matrices extracted from the response functional satisfy +the note-facing matrix identities. -/ +theorem canonicalResponseMatrixIdentities {d : ℕ} (U : Domain d) (a : CoeffOn U) : + CanonicalResponseMatrixIdentities U a := + Homogenization.Internal.Ch02.BookCh02.canonicalResponseMatrixIdentities U a + +/-- Existence form of matrix extraction, obtained from the canonical matrices. -/ +theorem responseMatrixExists {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseMatrixExists U a := + responseMatrixExists_of_canonicalResponseMatrixIdentities + (canonicalResponseMatrixIdentities U a) + +/-- Public pure-flux quadratic formula defining `sigmaStarInv(U; a)`. -/ +theorem responseJ_zero_q_eq_sigmaStarInvCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) (q : Vec d) : + responseJ U a 0 q = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := + (canonicalResponseMatrixIdentities U a).sigmaStarInv_response q + +/-- Public mixed-response formula defining `kappa(U; a)`. -/ +theorem mixedResponse_eq_sigmaStarInv_kappa {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + mixedResponse U a p q = + vecDot q + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) := by + simpa [coarseMatrices] using + (canonicalResponseMatrixIdentities U a).kappa_response p q + +/-- Public corrected pure-gradient formula defining `sigma(U; a)`. -/ +theorem canonicalSigmaCorrectedResponse_eq_sigmaCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p : Vec d) : + canonicalSigmaCorrectedResponse U a p = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) := by + simpa [sigmaCorrectedResponse_coarseMatrices] using + (canonicalResponseMatrixIdentities U a).sigma_response p + +/-- Public direct coarse-matrix formula for the response functional. -/ +theorem responseJ_eq_coarseMatrices_formula_canonical {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q + matVecMul (kappaCoarse U a) p)) - + vecDot p q := + responseJ_eq_canonical_coarseMatrices_formula + (canonicalResponseMatrixIdentities U a) p q + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixOperatorNorm.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixOperatorNorm.lean new file mode 100644 index 0000000000..a0dbadc42d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixOperatorNorm.lean @@ -0,0 +1,614 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import Mathlib.Analysis.CStarAlgebra.Matrix +public import Mathlib.LinearAlgebra.Matrix.Reindex +public import Mathlib.LinearAlgebra.Matrix.PosDef + +/-! # Matrix Operator Norm -/ + +@[expose] public section + +open scoped BigOperators Matrix.Norms.L2Operator + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Operator Norm API for Chapter 2 Matrices + +This file gives the reusable Euclidean operator-norm API used by the public +Chapter 2 multiscale ellipticity definitions. The explicitly named Frobenius +norm below is retained only as compatibility infrastructure for older +deterministic estimates. +-/ + +/-- Euclidean/L2 operator norm of a square real matrix, viewed as an operator +on finite-dimensional Euclidean space. -/ +noncomputable def matrixOperatorNorm {d : ℕ} (A : Mat d) : ℝ := + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A‖ + +/-- Legacy Frobenius squared norm, kept under an explicit compatibility name. -/ +def matrixFrobeniusNormSq {d : ℕ} (A : Mat d) : ℝ := + ∑ i, ∑ j, A i j ^ 2 + +/-- Legacy Frobenius norm, kept under an explicit compatibility name. -/ +noncomputable def matrixFrobeniusNorm {d : ℕ} (A : Mat d) : ℝ := + Real.sqrt (matrixFrobeniusNormSq A) + +/-- Euclidean/L2 norm of a vector, compatible with the project's `vecNormSq`. -/ +noncomputable def vecNorm {d : ℕ} (x : Vec d) : ℝ := + ‖(WithLp.toLp 2 x : EuclideanSpace ℝ (Fin d))‖ + +theorem matrixOperatorNorm_eq_l2_opNorm {d : ℕ} (A : Mat d) : + matrixOperatorNorm A = ‖A‖ := by + exact Matrix.l2_opNorm_toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A + +theorem matrixOperatorNorm_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matrixOperatorNorm A := by + exact norm_nonneg _ + +@[simp] theorem matrixOperatorNorm_zero {d : ℕ} : + matrixOperatorNorm (0 : Mat d) = 0 := by + simp [matrixOperatorNorm] + +@[simp] theorem matrixOperatorNorm_one {d : ℕ} [NeZero d] : + matrixOperatorNorm (1 : Mat d) = 1 := by + simp [matrixOperatorNorm] + +theorem matrixOperatorNorm_mul_le {d : ℕ} (A B : Mat d) : + matrixOperatorNorm (A * B) ≤ matrixOperatorNorm A * matrixOperatorNorm B := by + calc + matrixOperatorNorm (A * B) + = ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) (A * B)‖ := rfl + _ = ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A * + Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) B‖ := by + rw [map_mul] + _ ≤ ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A‖ * + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) B‖ := norm_mul_le _ _ + _ = matrixOperatorNorm A * matrixOperatorNorm B := rfl + +private theorem norm_toLp_comp_equiv {n : Type*} [Fintype n] + (e : n ≃ n) (v : n → ℝ) : + ‖(WithLp.toLp 2 (v ∘ e) : PiLp 2 (fun _ : n => ℝ))‖ = + ‖(WithLp.toLp 2 v : PiLp 2 (fun _ : n => ℝ))‖ := by + rw [← sq_eq_sq₀ (norm_nonneg _) (norm_nonneg _)] + rw [PiLp.norm_sq_eq_of_L2, PiLp.norm_sq_eq_of_L2] + exact Fintype.sum_equiv e + (fun i => ‖v (e i)‖ ^ 2) (fun i => ‖v i‖ ^ 2) (by intro i; rfl) + +private theorem mulVec_reindex_self {n : Type*} [Fintype n] [DecidableEq n] + (e : n ≃ n) (M : Matrix n n ℝ) (v : n → ℝ) : + Matrix.mulVec (Matrix.reindex e e M) v = + (Matrix.mulVec M (v ∘ e)) ∘ e.symm := by + ext i + change dotProduct (Matrix.reindex e e M i) v = dotProduct (M (e.symm i)) (v ∘ e) + rw [dotProduct, dotProduct] + simp [Matrix.reindex_apply] + exact (Fintype.sum_equiv e + (fun j => M (e.symm i) j * v (e j)) + (fun j => M (e.symm i) (e.symm j) * v j) + (by intro j; simp)).symm + +private theorem norm_toEuclideanCLM_reindex_self_le {n : Type*} + [Fintype n] [DecidableEq n] (e : n ≃ n) (M : Matrix n n ℝ) : + ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) (Matrix.reindex e e M)‖ ≤ + ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M‖ := by + refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) ?_ + intro x + let v : n → ℝ := x.ofLp + have hx : x = (WithLp.toLp 2 v : PiLp 2 (fun _ : n => ℝ)) := by + simp [v] + calc + ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) (Matrix.reindex e e M) x‖ = + ‖(WithLp.toLp 2 (Matrix.mulVec (Matrix.reindex e e M) v) : + PiLp 2 (fun _ : n => ℝ))‖ := by + rw [hx] + simp [Matrix.toEuclideanCLM_toLp] + _ = ‖(WithLp.toLp 2 ((Matrix.mulVec M (v ∘ e)) ∘ e.symm) : + PiLp 2 (fun _ : n => ℝ))‖ := by + rw [mulVec_reindex_self e M v] + _ = ‖(WithLp.toLp 2 (Matrix.mulVec M (v ∘ e)) : + PiLp 2 (fun _ : n => ℝ))‖ := + norm_toLp_comp_equiv e.symm (Matrix.mulVec M (v ∘ e)) + _ = ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M + (WithLp.toLp 2 (v ∘ e) : PiLp 2 (fun _ : n => ℝ))‖ := by + simp [Matrix.toEuclideanCLM_toLp] + _ ≤ ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M‖ * + ‖(WithLp.toLp 2 (v ∘ e) : PiLp 2 (fun _ : n => ℝ))‖ := + (Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M).le_opNorm _ + _ = ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M‖ * ‖x‖ := by + rw [norm_toLp_comp_equiv e v] + +/-- Reindexing both coordinates by the same equivalence preserves the +Euclidean operator norm. -/ +theorem norm_toEuclideanCLM_reindex_self {n : Type*} [Fintype n] [DecidableEq n] + (e : n ≃ n) (M : Matrix n n ℝ) : + ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) (Matrix.reindex e e M)‖ = + ‖Matrix.toEuclideanCLM (n := n) (𝕜 := ℝ) M‖ := by + refine le_antisymm (norm_toEuclideanCLM_reindex_self_le e M) ?_ + have h := norm_toEuclideanCLM_reindex_self_le e.symm (Matrix.reindex e e M) + have hre : Matrix.reindex e.symm e.symm (Matrix.reindex e e M) = M := by + ext i j + simp [Matrix.reindex_apply] + simpa [hre] using h + +theorem matrixOperatorNorm_inv_le_of_mul_eq_one {d : ℕ} [NeZero d] + {A B : Mat d} (hAB : A * B = 1) (hApos : 0 < matrixOperatorNorm A) : + (matrixOperatorNorm A)⁻¹ ≤ matrixOperatorNorm B := by + have hmulNorm : + matrixOperatorNorm (1 : Mat d) ≤ matrixOperatorNorm A * matrixOperatorNorm B := by + calc + matrixOperatorNorm (1 : Mat d) + = matrixOperatorNorm (A * B) := by rw [hAB] + _ ≤ matrixOperatorNorm A * matrixOperatorNorm B := + matrixOperatorNorm_mul_le A B + have hOneMul : 1 ≤ matrixOperatorNorm A * matrixOperatorNorm B := by + simpa using hmulNorm + have hInvNonneg : 0 ≤ (matrixOperatorNorm A)⁻¹ := inv_nonneg.mpr hApos.le + calc + (matrixOperatorNorm A)⁻¹ = (matrixOperatorNorm A)⁻¹ * 1 := by ring + _ ≤ (matrixOperatorNorm A)⁻¹ * + (matrixOperatorNorm A * matrixOperatorNorm B) := + mul_le_mul_of_nonneg_left hOneMul hInvNonneg + _ = matrixOperatorNorm B := by + rw [← mul_assoc, inv_mul_cancel₀ hApos.ne'] + ring + +theorem matrixOperatorNorm_diagonal {d : ℕ} (v : Fin d → ℝ) : + matrixOperatorNorm (Matrix.diagonal v : Mat d) = ‖v‖ := by + rw [matrixOperatorNorm_eq_l2_opNorm] + exact Matrix.l2_opNorm_diagonal (𝕜 := ℝ) v + +theorem matrixOperatorNorm_smul_one_eq_abs {d : ℕ} [NeZero d] (σ : ℝ) : + matrixOperatorNorm (σ • (1 : Mat d)) = |σ| := by + calc + matrixOperatorNorm (σ • (1 : Mat d)) + = ‖σ • Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) (1 : Mat d)‖ := by + simp [matrixOperatorNorm] + _ = |σ| * matrixOperatorNorm (1 : Mat d) := by + rw [norm_smul, Real.norm_eq_abs] + rfl + _ = |σ| := by simp + +theorem matrixOperatorNorm_smul_one_eq_of_nonneg {d : ℕ} [NeZero d] + {σ : ℝ} (hσ : 0 ≤ σ) : + matrixOperatorNorm (σ • (1 : Mat d)) = σ := by + rw [matrixOperatorNorm_smul_one_eq_abs, abs_of_nonneg hσ] + +theorem matrixFrobeniusNormSq_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matrixFrobeniusNormSq A := by + unfold matrixFrobeniusNormSq + exact Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => sq_nonneg _ + +theorem matrixFrobeniusNorm_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matrixFrobeniusNorm A := by + exact Real.sqrt_nonneg _ + +theorem vecNorm_nonneg {d : ℕ} (x : Vec d) : + 0 ≤ vecNorm x := by + exact norm_nonneg _ + +theorem vecNorm_sq_eq_vecNormSq {d : ℕ} (x : Vec d) : + vecNorm x ^ 2 = vecNormSq x := by + rw [vecNorm, EuclideanSpace.norm_sq_eq] + simp [vecNormSq, vecDot, Real.norm_eq_abs, pow_two] + +theorem vecNormSq_matVecMul_le_matrixFrobeniusNormSq_mul_vecNormSq + {d : ℕ} (A : Mat d) (x : Vec d) : + vecNormSq (matVecMul A x) ≤ + matrixFrobeniusNormSq A * vecNormSq x := by + have hcalc : + ∑ i, (∑ j, A i j * x j) ^ 2 ≤ + (∑ i, ∑ j, (A i j) ^ 2) * ∑ j, (x j) ^ 2 := by + calc + ∑ i, (∑ j, A i j * x j) ^ 2 + ≤ ∑ i, (∑ j, (A i j) ^ 2) * ∑ j, (x j) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + simpa [pow_two] using + (Finset.sum_mul_sq_le_sq_mul_sq + (s := Finset.univ) (f := fun j => A i j) (g := x)) + _ = (∑ i, ∑ j, (A i j) ^ 2) * ∑ j, (x j) ^ 2 := by + rw [Finset.sum_mul] + simpa [vecNormSq, vecDot, matrixFrobeniusNormSq, matVecMul, pow_two] using hcalc + +theorem vecNorm_matVecMul_le_matrixOperatorNorm_mul_vecNorm + {d : ℕ} (A : Mat d) (x : Vec d) : + vecNorm (matVecMul A x) ≤ matrixOperatorNorm A * vecNorm x := by + have h := + (Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A).le_opNorm + (WithLp.toLp 2 x : EuclideanSpace ℝ (Fin d)) + simpa [matrixOperatorNorm, vecNorm, matVecMul, Matrix.toEuclideanCLM_toLp, + Matrix.mulVec] using! h + +theorem vecNormSq_matVecMul_le_matrixOperatorNorm_sq_mul_vecNormSq + {d : ℕ} (A : Mat d) (x : Vec d) : + vecNormSq (matVecMul A x) ≤ matrixOperatorNorm A ^ 2 * vecNormSq x := by + have hnorm := vecNorm_matVecMul_le_matrixOperatorNorm_mul_vecNorm A x + have hsq : + vecNorm (matVecMul A x) ^ 2 ≤ + (matrixOperatorNorm A * vecNorm x) ^ 2 := + pow_le_pow_left₀ (vecNorm_nonneg (matVecMul A x)) hnorm 2 + calc + vecNormSq (matVecMul A x) + = vecNorm (matVecMul A x) ^ 2 := by rw [vecNorm_sq_eq_vecNormSq] + _ ≤ (matrixOperatorNorm A * vecNorm x) ^ 2 := hsq + _ = matrixOperatorNorm A ^ 2 * vecNormSq x := by + rw [mul_pow, vecNorm_sq_eq_vecNormSq] + +theorem matrixOperatorNorm_le_matrixFrobeniusNorm {d : ℕ} (A : Mat d) : + matrixOperatorNorm A ≤ matrixFrobeniusNorm A := by + refine ContinuousLinearMap.opNorm_le_bound _ (matrixFrobeniusNorm_nonneg A) ?_ + intro x + let ξ : Vec d := x.ofLp + have hsq : + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A x‖ ^ 2 ≤ + (matrixFrobeniusNorm A * ‖x‖) ^ 2 := by + have hvec : + vecNormSq (matVecMul A ξ) ≤ + matrixFrobeniusNormSq A * vecNormSq ξ := + vecNormSq_matVecMul_le_matrixFrobeniusNormSq_mul_vecNormSq A ξ + calc + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A x‖ ^ 2 + = vecNormSq (matVecMul A ξ) := by + have hx : x = WithLp.toLp 2 ξ := by + simp [ξ] + rw [← vecNorm_sq_eq_vecNormSq] + rw [hx, Matrix.toEuclideanCLM_toLp] + simp [vecNorm, ξ, matVecMul, Matrix.mulVec, dotProduct] + _ ≤ matrixFrobeniusNormSq A * vecNormSq ξ := hvec + _ = (matrixFrobeniusNorm A * ‖x‖) ^ 2 := by + have hxnorm : vecNormSq ξ = ‖x‖ ^ 2 := by + rw [← vecNorm_sq_eq_vecNormSq] + simp [vecNorm, ξ] + rw [matrixFrobeniusNorm, mul_pow, + Real.sq_sqrt (matrixFrobeniusNormSq_nonneg A), hxnorm] + exact (sq_le_sq₀ (norm_nonneg _) + (mul_nonneg (matrixFrobeniusNorm_nonneg A) (norm_nonneg x))).mp hsq + +theorem abs_entry_le_matrixOperatorNorm {d : ℕ} (A : Mat d) (i j : Fin d) : + |A i j| ≤ matrixOperatorNorm A := by + let e : EuclideanSpace ℝ (Fin d) := WithLp.toLp 2 (Pi.single j (1 : ℝ)) + have hcoord : + ‖(Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e).ofLp i‖ ≤ + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e‖ := + PiLp.norm_apply_le _ i + have hop : + ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e‖ ≤ + matrixOperatorNorm A * ‖e‖ := + (Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A).le_opNorm e + have he : ‖e‖ = 1 := by + simp [e] + have hentry : + ‖(Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e).ofLp i‖ = |A i j| := by + simp [e, Real.norm_eq_abs, Matrix.ofLp_toEuclideanCLM, Matrix.mulVec] + calc + |A i j| + = ‖(Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e).ofLp i‖ := + hentry.symm + _ ≤ ‖Matrix.toEuclideanCLM (n := Fin d) (𝕜 := ℝ) A e‖ := hcoord + _ ≤ matrixOperatorNorm A * ‖e‖ := hop + _ = matrixOperatorNorm A := by simp [he] + +/-- In finite dimension the legacy Frobenius norm is controlled by `d` times +the Euclidean operator norm. This is the compatibility direction used when +old deterministic Frobenius estimates are retained as proof infrastructure. -/ +theorem matrixFrobeniusNorm_le_dim_mul_matrixOperatorNorm {d : ℕ} (A : Mat d) : + matrixFrobeniusNorm A ≤ (d : ℝ) * matrixOperatorNorm A := by + let N : ℝ := matrixOperatorNorm A + have hN_nonneg : 0 ≤ N := by + simpa [N] using matrixOperatorNorm_nonneg A + have hentry_sq : + ∀ i j : Fin d, A i j ^ 2 ≤ N ^ 2 := by + intro i j + have hentry : |A i j| ≤ N := by + simpa [N] using abs_entry_le_matrixOperatorNorm A i j + have hsq := pow_le_pow_left₀ (abs_nonneg (A i j)) hentry 2 + simpa [sq_abs, pow_two] using hsq + have hsum : + matrixFrobeniusNormSq A ≤ (d : ℝ) ^ 2 * N ^ 2 := by + calc + matrixFrobeniusNormSq A + = ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 := by + rfl + _ ≤ ∑ _i : Fin d, ∑ _j : Fin d, N ^ 2 := by + exact Finset.sum_le_sum fun i _ => + Finset.sum_le_sum fun j _ => hentry_sq i j + _ = (d : ℝ) ^ 2 * N ^ 2 := by + simp [Finset.sum_const, Fintype.card_fin] + ring + have hsq : + matrixFrobeniusNorm A ^ 2 ≤ ((d : ℝ) * N) ^ 2 := by + calc + matrixFrobeniusNorm A ^ 2 = matrixFrobeniusNormSq A := by + rw [matrixFrobeniusNorm, Real.sq_sqrt (matrixFrobeniusNormSq_nonneg A)] + _ ≤ (d : ℝ) ^ 2 * N ^ 2 := hsum + _ = ((d : ℝ) * N) ^ 2 := by ring + exact (sq_le_sq₀ (matrixFrobeniusNorm_nonneg A) + (mul_nonneg (Nat.cast_nonneg d) hN_nonneg)).mp hsq + +/-- The legacy Frobenius norm is bounded by the entrywise `l¹` norm. -/ +theorem matrixFrobeniusNorm_le_sum_abs_entries {d : ℕ} (A : Mat d) : + matrixFrobeniusNorm A ≤ ∑ i : Fin d, ∑ j : Fin d, |A i j| := by + classical + have hsqsum : + (∑ p : Fin d × Fin d, A p.1 p.2 ^ 2) = + ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 := by + simpa using + (Finset.sum_product' (Finset.univ : Finset (Fin d)) + (Finset.univ : Finset (Fin d)) (fun i j => A i j ^ 2)) + have habssum : + (∑ p : Fin d × Fin d, |A p.1 p.2|) = + ∑ i : Fin d, ∑ j : Fin d, |A i j| := by + simpa using + (Finset.sum_product' (Finset.univ : Finset (Fin d)) + (Finset.univ : Finset (Fin d)) (fun i j => |A i j|)) + have hnonneg : + 0 ≤ ∑ p : Fin d × Fin d, |A p.1 p.2| := by + exact Finset.sum_nonneg fun p _hp => abs_nonneg (A p.1 p.2) + have hsq_le : + (∑ p : Fin d × Fin d, |A p.1 p.2| ^ 2) ≤ + (∑ p : Fin d × Fin d, |A p.1 p.2|) ^ 2 := by + exact Finset.sum_sq_le_sq_sum_of_nonneg + (fun p _hp => abs_nonneg (A p.1 p.2)) + calc + matrixFrobeniusNorm A = + Real.sqrt (∑ p : Fin d × Fin d, A p.1 p.2 ^ 2) := by + unfold matrixFrobeniusNorm matrixFrobeniusNormSq + rw [hsqsum] + _ = Real.sqrt (∑ p : Fin d × Fin d, |A p.1 p.2| ^ 2) := by + simp [sq_abs] + _ ≤ Real.sqrt ((∑ p : Fin d × Fin d, |A p.1 p.2|) ^ 2) := + Real.sqrt_le_sqrt hsq_le + _ = ∑ p : Fin d × Fin d, |A p.1 p.2| := by + simp [Real.sqrt_sq_eq_abs, abs_of_nonneg hnonneg] + _ = ∑ i : Fin d, ∑ j : Fin d, |A i j| := habssum + +/-- Triangle inequality for the Euclidean operator norm around a matrix +center. -/ +theorem matrixOperatorNorm_le_matrixOperatorNorm_add_matrixOperatorNorm_sub + {d : ℕ} (A B : Mat d) : + matrixOperatorNorm A ≤ matrixOperatorNorm B + matrixOperatorNorm (A - B) := by + have hdecomp : B + (A - B) = A := by + ext i j + simp + calc + matrixOperatorNorm A = ‖A‖ := matrixOperatorNorm_eq_l2_opNorm A + _ = ‖B + (A - B)‖ := by rw [hdecomp] + _ ≤ ‖B‖ + ‖A - B‖ := norm_add_le _ _ + _ = matrixOperatorNorm B + matrixOperatorNorm (A - B) := by + rw [← matrixOperatorNorm_eq_l2_opNorm B, + ← matrixOperatorNorm_eq_l2_opNorm (A - B)] + +/-- The Euclidean operator norm around a center is controlled by the +entrywise `l¹` size of the centered matrix. -/ +theorem matrixOperatorNorm_le_matrixOperatorNorm_add_sum_abs_sub_entries + {d : ℕ} (A B : Mat d) : + matrixOperatorNorm A ≤ + matrixOperatorNorm B + ∑ i : Fin d, ∑ j : Fin d, |A i j - B i j| := by + calc + matrixOperatorNorm A ≤ matrixOperatorNorm B + matrixOperatorNorm (A - B) := + matrixOperatorNorm_le_matrixOperatorNorm_add_matrixOperatorNorm_sub A B + _ ≤ matrixOperatorNorm B + matrixFrobeniusNorm (A - B) := + add_le_add (le_refl (matrixOperatorNorm B)) + (matrixOperatorNorm_le_matrixFrobeniusNorm (A - B)) + _ ≤ matrixOperatorNorm B + + ∑ i : Fin d, ∑ j : Fin d, |A i j - B i j| := by + simpa [sub_eq_add_neg] using + add_le_add (le_refl (matrixOperatorNorm B)) + (matrixFrobeniusNorm_le_sum_abs_entries (A - B)) + +theorem abs_vecDot_le_vecNorm_mul_vecNorm {d : ℕ} (x y : Vec d) : + |vecDot x y| ≤ vecNorm x * vecNorm y := by + have hsq : + |vecDot x y| ^ 2 ≤ (vecNorm x * vecNorm y) ^ 2 := by + rw [sq_abs, mul_pow, vecNorm_sq_eq_vecNormSq, vecNorm_sq_eq_vecNormSq] + exact sq_vecDot_le_vecNormSq_mul_vecNormSq x y + exact (sq_le_sq₀ (abs_nonneg _) + (mul_nonneg (vecNorm_nonneg x) (vecNorm_nonneg y))).mp hsq + +theorem abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq + {d : ℕ} (A : Mat d) (x : Vec d) : + |vecDot x (matVecMul A x)| ≤ matrixOperatorNorm A * vecNormSq x := by + calc + |vecDot x (matVecMul A x)| + ≤ vecNorm x * vecNorm (matVecMul A x) := + abs_vecDot_le_vecNorm_mul_vecNorm x (matVecMul A x) + _ ≤ vecNorm x * (matrixOperatorNorm A * vecNorm x) := + mul_le_mul_of_nonneg_left + (vecNorm_matVecMul_le_matrixOperatorNorm_mul_vecNorm A x) + (vecNorm_nonneg x) + _ = matrixOperatorNorm A * vecNormSq x := by + rw [← vecNorm_sq_eq_vecNormSq] + ring + +theorem vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq_of_posSemidef + {d : ℕ} {A : Mat d} (hA : A.PosSemidef) (x : Vec d) : + vecDot x (matVecMul A x) ≤ matrixOperatorNorm A * vecNormSq x := by + have hnonneg : 0 ≤ vecDot x (matVecMul A x) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + hA.dotProduct_mulVec_nonneg x + simpa [abs_of_nonneg hnonneg] using + abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq A x + +theorem vecNormSq_le_matrixOperatorNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + {d : ℕ} {A B : Mat d} (hB : B.PosSemidef) + (hleftInv : ∀ ξ : Vec d, matVecMul B (matVecMul A ξ) = ξ) (ξ : Vec d) : + vecNormSq ξ ≤ matrixOperatorNorm B * vecDot ξ (matVecMul A ξ) := by + let η : Vec d := matVecMul A ξ + have hBsymm : B.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hB.1 + have hBnonneg : ∀ z : Vec d, 0 ≤ vecDot z (matVecMul B z) := by + intro z + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + hB.dotProduct_mulVec_nonneg z + have hηeq : matVecMul B η = ξ := by + simpa [η] using hleftInv ξ + have hξη_nonneg : 0 ≤ vecDot ξ η := by + have := hBnonneg η + simpa [hηeq, vecDot_comm, η] using this + have hcs : + vecNormSq ξ ^ 2 ≤ vecDot ξ (matVecMul B ξ) * vecDot ξ η := by + have hraw := sq_vecDot_matVecMul_le_of_isSymm_of_nonneg hBsymm hBnonneg ξ η + simpa [vecNormSq, hηeq, vecDot_comm, η] using hraw + have hfirst : + vecDot ξ (matVecMul B ξ) ≤ matrixOperatorNorm B * vecNormSq ξ := + vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq_of_posSemidef hB ξ + have hmain : + vecNormSq ξ ^ 2 ≤ + (matrixOperatorNorm B * vecNormSq ξ) * vecDot ξ η := by + exact le_trans hcs <| mul_le_mul_of_nonneg_right hfirst hξη_nonneg + by_cases hx : vecNormSq ξ = 0 + · rw [hx] + nlinarith [matrixOperatorNorm_nonneg B] + · have hx_pos : 0 < vecNormSq ξ := by + exact lt_of_le_of_ne (vecNormSq_nonneg ξ) (by simpa [eq_comm] using hx) + have hnorm_nonneg : 0 ≤ matrixOperatorNorm B := matrixOperatorNorm_nonneg B + nlinarith + +theorem vecNormSq_matVecMul_le_matrixOperatorNorm_sq_mul_vecNormSq_of_matLoewnerLE + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) (x : Vec d) : + vecNormSq (matVecMul A x) ≤ matrixOperatorNorm B ^ 2 * vecNormSq x := by + let y : Vec d := matVecMul A x + let Z : ℝ := vecNormSq y + let X : ℝ := vecNormSq x + let C : ℝ := matrixOperatorNorm B + have hAsymm : A.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hA.1 + have hAnonneg : ∀ z : Vec d, 0 ≤ vecDot z (matVecMul A z) := by + intro z + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + hA.dotProduct_mulVec_nonneg z + have hBnonneg : ∀ z : Vec d, 0 ≤ vecDot z (matVecMul B z) := by + intro z + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + hB.dotProduct_mulVec_nonneg z + have hAB' : + ∀ z : Vec d, vecDot z (matVecMul A z) ≤ vecDot z (matVecMul B z) := by + intro z + have hz := hAB z + nlinarith + have hleft : vecDot x (matVecMul A y) = Z := by + calc + vecDot x (matVecMul A y) = vecDot y (matVecMul A x) := + vecDot_matVecMul_comm_of_isSymm hAsymm x y + _ = Z := by + simp [Z, y, vecNormSq] + have hcs_raw := + sq_vecDot_matVecMul_le_of_isSymm_of_nonneg hAsymm hAnonneg x y + have hcs : + Z ^ 2 ≤ vecDot x (matVecMul A x) * vecDot y (matVecMul A y) := by + simpa [hleft] using hcs_raw + have hC_nonneg : 0 ≤ C := by + simpa [C] using matrixOperatorNorm_nonneg B + have hX_nonneg : 0 ≤ X := by + simpa [X] using vecNormSq_nonneg x + have hZ_nonneg : 0 ≤ Z := by + simpa [Z, y] using vecNormSq_nonneg y + have hAyy_nonneg : 0 ≤ vecDot y (matVecMul A y) := hAnonneg y + have hBxx_le : vecDot x (matVecMul B x) ≤ C * X := by + have hnonneg := hBnonneg x + have h := abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq B x + simpa [C, X, abs_of_nonneg hnonneg] using h + have hByy_le : vecDot y (matVecMul B y) ≤ C * Z := by + have hnonneg := hBnonneg y + have h := abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq B y + simpa [C, Z, abs_of_nonneg hnonneg] using h + have hAxx_le : vecDot x (matVecMul A x) ≤ C * X := + (hAB' x).trans hBxx_le + have hAyy_le : vecDot y (matVecMul A y) ≤ C * Z := + (hAB' y).trans hByy_le + have hprod : Z ^ 2 ≤ (C * X) * (C * Z) := by + exact hcs.trans + (mul_le_mul hAxx_le hAyy_le hAyy_nonneg + (mul_nonneg hC_nonneg hX_nonneg)) + have hZ_le : Z ≤ C ^ 2 * X := by + by_cases hZ0 : Z = 0 + · rw [hZ0] + exact mul_nonneg (sq_nonneg C) hX_nonneg + · have hZpos : 0 < Z := + lt_of_le_of_ne hZ_nonneg (by simpa [eq_comm] using hZ0) + have hprod' : Z ^ 2 ≤ C ^ 2 * X * Z := by + nlinarith + nlinarith + simpa [Z, X, C, y] using hZ_le + +theorem matrixOperatorNorm_le_of_matLoewnerLE_of_posSemidef + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matrixOperatorNorm A ≤ matrixOperatorNorm B := by + refine ContinuousLinearMap.opNorm_le_bound _ (matrixOperatorNorm_nonneg B) ?_ + intro x + let ξ : Vec d := x.ofLp + have hsq := + vecNormSq_matVecMul_le_matrixOperatorNorm_sq_mul_vecNormSq_of_matLoewnerLE + hA hB hAB ξ + have hvec : vecNorm (matVecMul A ξ) ≤ matrixOperatorNorm B * vecNorm ξ := by + have hsq' : + vecNorm (matVecMul A ξ) ^ 2 ≤ + (matrixOperatorNorm B * vecNorm ξ) ^ 2 := by + calc + vecNorm (matVecMul A ξ) ^ 2 = vecNormSq (matVecMul A ξ) := + vecNorm_sq_eq_vecNormSq _ + _ ≤ matrixOperatorNorm B ^ 2 * vecNormSq ξ := hsq + _ = (matrixOperatorNorm B * vecNorm ξ) ^ 2 := by + rw [mul_pow, vecNorm_sq_eq_vecNormSq] + exact (sq_le_sq₀ (vecNorm_nonneg (matVecMul A ξ)) + (mul_nonneg (matrixOperatorNorm_nonneg B) (vecNorm_nonneg ξ))).mp hsq' + simpa [matrixOperatorNorm, vecNorm, ξ, Matrix.toEuclideanCLM_toLp, + matVecMul, Matrix.mulVec] using! hvec + +theorem matrixOperatorNorm_pos_of_posDef {d : ℕ} [NeZero d] {A : Mat d} + (hA : A.PosDef) : + 0 < matrixOperatorNorm A := by + let i : Fin d := ⟨0, Nat.pos_of_ne_zero (NeZero.ne d)⟩ + have hdiag : 0 < A i i := hA.diag_pos + have hentry := abs_entry_le_matrixOperatorNorm A i i + have habs : 0 < |A i i| := abs_pos.mpr hdiag.ne' + exact lt_of_lt_of_le habs hentry + +theorem matrixOperatorNorm_descendantsAverageMat_le_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + matrixOperatorNorm (descendantsAverageMat Q j F) ≤ + descendantsAverage Q j (fun R => matrixOperatorNorm (F R)) := by + classical + let D := descendantsAtDepth Q j + let c : ℝ := (D.card : ℝ)⁻¹ + have havg : descendantsAverageMat Q j F = c • D.sum F := by + ext i k + rw [Matrix.smul_apply, Matrix.sum_apply] + simp [descendantsAverageMat, descendantsAverage, D, c] + have hc_nonneg : 0 ≤ c := by positivity + calc + matrixOperatorNorm (descendantsAverageMat Q j F) = + ‖descendantsAverageMat Q j F‖ := by + simp [matrixOperatorNorm_eq_l2_opNorm] + _ = ‖c • D.sum F‖ := by + rw [havg] + _ = |c| * ‖D.sum F‖ := by + rw [norm_smul, Real.norm_eq_abs] + _ ≤ |c| * D.sum (fun R => ‖F R‖) := by + exact mul_le_mul_of_nonneg_left (norm_sum_le D F) (abs_nonneg _) + _ = c * D.sum (fun R => ‖F R‖) := by + rw [abs_of_nonneg hc_nonneg] + _ = descendantsAverage Q j (fun R => matrixOperatorNorm (F R)) := by + simp [descendantsAverage, D, c, matrixOperatorNorm_eq_l2_opNorm] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixPositivity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixPositivity.lean new file mode 100644 index 0000000000..160406b559 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MatrixPositivity.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtractionProofs + +/-! # Matrix Positivity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- The pure-flux coarse matrix `sigmaStarInv(U; a)` is positive definite. -/ +theorem sigmaStarInvCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (sigmaStarInvCoarse U a).PosDef := + Homogenization.Internal.Ch02.BookCh02.sigmaStarInvCoarse_posDef U a + +/-- The derived coarse matrix `sigmaStar(U; a)` is positive definite. -/ +theorem sigmaStarCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (sigmaStarCoarse U a).PosDef := + Homogenization.Internal.Ch02.BookCh02.sigmaStarCoarse_posDef U a + +/-- The canonical pure-flux matrix is invertible. -/ +theorem isUnit_det_sigmaStarInvCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + IsUnit (sigmaStarInvCoarse U a).det := + Homogenization.Internal.Ch02.BookCh02.isUnit_det_sigmaStarInvCoarse U a + +/-- The canonical `sigmaStar` matrix is invertible. -/ +theorem isUnit_det_sigmaStarCoarse {d : ℕ} (U : Domain d) (a : CoeffOn U) : + IsUnit (sigmaStarCoarse U a).det := + Homogenization.Internal.Ch02.BookCh02.isUnit_det_sigmaStarCoarse U a + +/-- The response functional is nonnegative. -/ +theorem responseJ_nonneg {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : + 0 ≤ responseJ U a p q := + Homogenization.Internal.Ch02.BookCh02.responseJ_nonneg U a p q + +/-- Strict positivity of the pure-flux response away from `q = 0`. -/ +theorem responseJ_zero_right_pos {d : ℕ} (U : Domain d) (a : CoeffOn U) + {q : Vec d} (hq : q ≠ 0) : + 0 < responseJ U a 0 q := by + have hformula := + responseJ_zero_q_eq_sigmaStarInvCoarse U a q + have hquad : + 0 < vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + simpa [vecDot, matVecMul, dotProduct, Matrix.mulVec] using + (sigmaStarInvCoarse_posDef U a).dotProduct_mulVec_pos hq + rw [hformula] + nlinarith + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity.lean new file mode 100644 index 0000000000..5eb5cedd44 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Public + +/-! # Multiscale Ellipticity -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Basic.lean new file mode 100644 index 0000000000..45f1a28efe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Basic.lean @@ -0,0 +1,372 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Existence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ChangeOfQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ScaleBounds +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import Mathlib.Analysis.Complex.ExponentialBounds + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Basic Helpers for Chapter 2.5 Multiscale Ellipticity + +This file contains the matrix-norm, finite-supremum, and scale-weight helper +lemmas used by the public multiscale ellipticity theorem package. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + + +theorem matrixNorm_eq_matrixOperatorNorm {d : ℕ} (A : Mat d) : + matrixNorm A = matrixOperatorNorm A := by + rfl + +theorem matrixFrobeniusNorm_eq_matNorm {d : ℕ} (A : Mat d) : + matrixFrobeniusNorm A = Homogenization.matNorm A := by + rfl + +theorem matrixNorm_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matrixNorm A := by + simpa [matrixNorm_eq_matrixOperatorNorm] using matrixOperatorNorm_nonneg A + +theorem matrixNorm_le_matNorm {d : ℕ} (A : Mat d) : + matrixNorm A ≤ Homogenization.matNorm A := by + simpa [matrixNorm_eq_matrixOperatorNorm, matrixFrobeniusNorm_eq_matNorm] using + matrixOperatorNorm_le_matrixFrobeniusNorm A + +theorem matNorm_le_dim_mul_matrixNorm {d : ℕ} (A : Mat d) : + Homogenization.matNorm A ≤ (d : ℝ) * matrixNorm A := by + simpa [matrixNorm_eq_matrixOperatorNorm, matrixFrobeniusNorm_eq_matNorm] using + matrixFrobeniusNorm_le_dim_mul_matrixOperatorNorm A + +/-- The legacy Frobenius norm is bounded by the entrywise `l¹` norm. -/ +theorem matNorm_le_sum_abs_entries {d : ℕ} (A : Mat d) : + Homogenization.matNorm A ≤ ∑ i : Fin d, ∑ j : Fin d, |A i j| := by + simpa [matrixFrobeniusNorm_eq_matNorm] using + matrixFrobeniusNorm_le_sum_abs_entries A + +/-- Triangle inequality for the Chapter 2 matrix norm around a center. -/ +theorem matrixNorm_le_matrixNorm_add_matrixNorm_sub {d : ℕ} (A B : Mat d) : + matrixNorm A ≤ matrixNorm B + matrixNorm (A - B) := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_le_matrixOperatorNorm_add_matrixOperatorNorm_sub A B + +/-- The Chapter 2 matrix norm around a center is controlled by the entrywise +`l¹` size of the centered matrix. -/ +theorem matrixNorm_le_matrixNorm_add_sum_abs_sub_entries {d : ℕ} (A B : Mat d) : + matrixNorm A ≤ matrixNorm B + ∑ i : Fin d, ∑ j : Fin d, |A i j - B i j| := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_le_matrixOperatorNorm_add_sum_abs_sub_entries A B + +theorem coarseBMatrixNorm_nonneg {d : ℕ} (Q : TriadicCube d) + (a : TriadicCoeffFamily d) : + 0 ≤ coarseBMatrixNorm Q a := by + simpa [coarseBMatrixNorm, matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_nonneg (bCoarse (cubeDomain Q) (a.coeffOn Q)) + +theorem coarseSigmaStarInvMatrixNorm_nonneg {d : ℕ} (Q : TriadicCube d) + (a : TriadicCoeffFamily d) : + 0 ≤ coarseSigmaStarInvMatrixNorm Q a := by + simpa [coarseSigmaStarInvMatrixNorm, matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_nonneg (sigmaStarInvCoarse (cubeDomain Q) (a.coeffOn Q)) + +theorem one_le_matrixNorm_one {d : ℕ} [NeZero d] : + 1 ≤ matrixNorm (1 : Mat d) := by + simp [matrixNorm_eq_matrixOperatorNorm] + +theorem matrixNorm_inv_le_of_mul_eq_one {d : ℕ} [NeZero d] + {A B : Mat d} (hAB : A * B = 1) (hApos : 0 < matrixNorm A) : + (matrixNorm A)⁻¹ ≤ matrixNorm B := by + have hApos' : 0 < matrixOperatorNorm A := by + simpa [matrixNorm_eq_matrixOperatorNorm] using hApos + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_inv_le_of_mul_eq_one hAB hApos' + +theorem bCoarse_isSymm {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (bCoarse U a).IsSymm := by + unfold bCoarse CoarseMatrices.b coarseMatrices + exact Matrix.IsSymm.add (sigmaCoarse_isSymm U a) + (transpose_mul_symm_mul_isSymm (kappaCoarse U a) + (sigmaStarInvCoarse U a) (sigmaStarInvCoarse_isSymm U a)) + +theorem posSemidef_of_matLoewnerLE_of_posSemidef_of_isSymm + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hBsymm : B.IsSymm) + (hAB : MatLoewnerLE A B) : + B.PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hBsymm + · intro x + change 0 ≤ dotProduct x (Matrix.mulVec B x) + have hAquad : 0 ≤ dotProduct x (Matrix.mulVec A x) := + hA.dotProduct_mulVec_nonneg x + have hABx : + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec A x) ≤ + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec B x) := by + simpa [vecDot, matVecMul] using! hAB x + nlinarith + +theorem bCoarse_posSemidef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (bCoarse U a).PosSemidef := by + have hStarB : MatLoewnerLE (sigmaStarCoarse U a) (bCoarse U a) := by + intro x + exact le_trans ((sigmaStarCoarse_le_sigmaCoarse U a) x) + ((sigmaCoarse_le_bCoarse U a) x) + exact posSemidef_of_matLoewnerLE_of_posSemidef_of_isSymm + (sigmaStarCoarse_posDef U a).posSemidef (bCoarse_isSymm U a) hStarB + +theorem matrixNorm_le_matNorm_of_matLoewnerLE_of_posSemidef + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matrixNorm A ≤ Homogenization.matNorm B := by + exact le_trans (matrixNorm_le_matNorm A) + (Homogenization.matNorm_le_of_matLoewnerLE_of_posSemidef hA hB hAB) + +theorem matrixNorm_le_of_matLoewnerLE_of_posSemidef + {d : ℕ} {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matrixNorm A ≤ matrixNorm B := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_le_of_matLoewnerLE_of_posSemidef hA hB hAB + +/-- A positive semidefinite matrix below `B` in Löwner order is controlled by +the norm of any deterministic center plus the entrywise centered size of `B`. -/ +theorem matrixNorm_le_center_add_sum_abs_sub_entries_of_matLoewnerLE + {d : ℕ} {A B center : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matrixNorm A ≤ matrixNorm center + ∑ i : Fin d, ∑ j : Fin d, |B i j - center i j| := by + calc + matrixNorm A ≤ matrixNorm B := + matrixNorm_le_of_matLoewnerLE_of_posSemidef hA hB hAB + _ ≤ matrixNorm center + ∑ i : Fin d, ∑ j : Fin d, |B i j - center i j| := + matrixNorm_le_matrixNorm_add_sum_abs_sub_entries B center + +theorem matrixNorm_pos_of_posDef {d : ℕ} [NeZero d] {A : Mat d} + (hA : A.PosDef) : + 0 < matrixNorm A := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_pos_of_posDef hA + +theorem vecNormSq_le_matrixNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + {d : ℕ} {A B : Mat d} (hB : B.PosSemidef) + (hleftInv : ∀ ξ : Vec d, matVecMul B (matVecMul A ξ) = ξ) (ξ : Vec d) : + vecNormSq ξ ≤ matrixNorm B * vecDot ξ (matVecMul A ξ) := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + vecNormSq_le_matrixOperatorNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := A) (B := B) hB hleftInv ξ + +theorem bCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (bCoarse U a).PosDef := by + have hStarB : MatLoewnerLE (sigmaStarCoarse U a) (bCoarse U a) := by + intro x + exact le_trans ((sigmaStarCoarse_le_sigmaCoarse U a) x) + ((sigmaCoarse_le_bCoarse U a) x) + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using bCoarse_isSymm U a + · intro x hx + have hStarPos := (sigmaStarCoarse_posDef U a).dotProduct_mulVec_pos hx + have hleHalf := hStarB x + have hle : + vecDot x (matVecMul (sigmaStarCoarse U a) x) ≤ + vecDot x (matVecMul (bCoarse U a) x) := by + nlinarith + have hmain : 0 < vecDot x (matVecMul (bCoarse U a) x) := + lt_of_lt_of_le + (by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hStarPos) + hle + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hmain + +theorem matrixNorm_descendantsAverageMat_le_descendantsAverage_matrixNorm + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + matrixNorm (descendantsAverageMat Q j F) ≤ + descendantsAverage Q j (fun R => matrixNorm (F R)) := by + simpa [matrixNorm_eq_matrixOperatorNorm] using + matrixOperatorNorm_descendantsAverageMat_le_descendantsAverage Q j F + +theorem matrixNorm_descendantsAverageMat_le_finsetSupReal_matrixNorm + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + matrixNorm (descendantsAverageMat Q j F) ≤ + finsetSupReal (descendantsAtDepth Q j) (fun R => matrixNorm (F R)) := by + calc + matrixNorm (descendantsAverageMat Q j F) ≤ + descendantsAverage Q j (fun R => matrixNorm (F R)) := + matrixNorm_descendantsAverageMat_le_descendantsAverage_matrixNorm Q j F + _ ≤ finsetSupReal (descendantsAtDepth Q j) (fun R => matrixNorm (F R)) := by + simpa [finsetSupReal] using! + descendantsAverage_le_finsetSsup Q j (fun R => matrixNorm (F R)) + +theorem finsetSupReal_eq_finsetSsup {α : Type*} (s : Finset α) + (f : α → ℝ) : + finsetSupReal s f = Homogenization.finsetSsup s f := by + rfl + +theorem finsetSupReal_congr {α : Type*} (s : Finset α) {f g : α → ℝ} + (hfg : ∀ x ∈ s, f x = g x) : + finsetSupReal s f = finsetSupReal s g := by + unfold finsetSupReal + refine congrArg sSup ?_ + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + exact ⟨x, hx, (hfg x hx).symm⟩ + · rintro ⟨x, hx, rfl⟩ + exact ⟨x, hx, hfg x hx⟩ + +theorem finsetSupReal_image {α β : Type*} [DecidableEq β] (s : Finset α) + (φ : α → β) (f : β → ℝ) (g : α → ℝ) + (hfg : ∀ x ∈ s, f (φ x) = g x) : + finsetSupReal (s.image φ) f = finsetSupReal s g := by + unfold finsetSupReal + refine congrArg sSup ?_ + ext y + constructor + · rintro ⟨b, hb, rfl⟩ + rcases Finset.mem_image.mp hb with ⟨x, hx, rfl⟩ + exact ⟨x, hx, (hfg x hx).symm⟩ + · rintro ⟨x, hx, rfl⟩ + exact ⟨φ x, Finset.mem_image.mpr ⟨x, hx, rfl⟩, hfg x hx⟩ + +theorem finsetSupReal_nonneg {α : Type*} (s : Finset α) (f : α → ℝ) + (hf : ∀ x ∈ s, 0 ≤ f x) : + 0 ≤ finsetSupReal s f := by + unfold finsetSupReal + refine Real.sSup_nonneg ?_ + rintro _ ⟨x, hx, rfl⟩ + exact hf x hx + +theorem finsetSupReal_mono {α : Type*} (s : Finset α) (hs : s.Nonempty) + {f g : α → ℝ} (hfg : ∀ x ∈ s, f x ≤ g x) : + finsetSupReal s f ≤ finsetSupReal s g := by + unfold finsetSupReal + have hne : (f '' (↑s : Set α)).Nonempty := by + rcases hs with ⟨x, hx⟩ + exact ⟨f x, ⟨x, hx, rfl⟩⟩ + refine csSup_le hne ?_ + rintro y ⟨x, hx, rfl⟩ + have hbdd : BddAbove (g '' (↑s : Set α)) := + ((Set.toFinite _).image g).bddAbove + exact le_trans (hfg x hx) (le_csSup hbdd ⟨x, hx, rfl⟩) + +theorem finsetSupReal_const_mul_le {α : Type*} (s : Finset α) + (hs : s.Nonempty) {c : ℝ} (hc : 0 ≤ c) (f : α → ℝ) : + finsetSupReal s (fun x => c * f x) ≤ c * finsetSupReal s f := by + unfold finsetSupReal + have hne : ((fun x => c * f x) '' (↑s : Set α)).Nonempty := by + rcases hs with ⟨x, hx⟩ + exact ⟨c * f x, ⟨x, hx, rfl⟩⟩ + refine csSup_le hne ?_ + rintro y ⟨x, hx, rfl⟩ + have hbdd : BddAbove (f '' (↑s : Set α)) := + ((Set.toFinite _).image f).bddAbove + exact mul_le_mul_of_nonneg_left (le_csSup hbdd ⟨x, hx, rfl⟩) hc + +theorem finsetSupReal_le_of_subset {α : Type*} (s t : Finset α) + (hs : s.Nonempty) (hst : ↑s ⊆ (↑t : Set α)) (f : α → ℝ) : + finsetSupReal s f ≤ finsetSupReal t f := by + unfold finsetSupReal + have hne : (f '' (↑s : Set α)).Nonempty := by + rcases hs with ⟨x, hx⟩ + exact ⟨f x, ⟨x, hx, rfl⟩⟩ + refine csSup_le hne ?_ + rintro y ⟨x, hx, rfl⟩ + have hbdd : BddAbove (f '' (↑t : Set α)) := + ((Set.toFinite _).image f).bddAbove + exact le_csSup hbdd ⟨x, hst hx, rfl⟩ + +theorem finsetSupReal_le {α : Type*} (s : Finset α) (hs : s.Nonempty) + {f : α → ℝ} {C : ℝ} (hC : ∀ x ∈ s, f x ≤ C) : + finsetSupReal s f ≤ C := by + unfold finsetSupReal + have hne : (f '' (↑s : Set α)).Nonempty := by + rcases hs with ⟨x, hx⟩ + exact ⟨f x, ⟨x, hx, rfl⟩⟩ + refine csSup_le hne ?_ + rintro y ⟨x, hx, rfl⟩ + exact hC x hx + +theorem geometricDiscount_eq_old (s q : ℝ) : + geometricDiscount s q = Homogenization.geometricDiscount s q := by + rfl + +theorem geometricWeight_eq_old (s q : ℝ) (n : ℕ) : + geometricWeight s q n = Homogenization.geometricWeight s q n := by + rfl + +theorem old_descendantWeight_eq_multiscaleDescendantWeight {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (s : ℝ) : + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) = + multiscaleDescendantWeight Q k s := by + have hnatInt : (Int.toNat (Q.scale - k) : ℤ) = Q.scale - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hnatReal : + (Int.toNat (Q.scale - k) : ℝ) = ((Q.scale - k : ℤ) : ℝ) := by + exact_mod_cast hnatInt + unfold multiscaleDescendantWeight + rw [hnatReal] + +theorem infinityWeight_nonneg (s : ℝ) (n : ℕ) : + 0 ≤ Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem infinityWeight_le_one {s : ℝ} (hs : 0 ≤ s) (n : ℕ) : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) ≤ 1 := by + refine Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hn : 0 ≤ (n : ℝ) := by exact_mod_cast Nat.zero_le n + nlinarith [hs, hn] + +theorem infinityWeight_le_of_le {t s : ℝ} (hts : t ≤ s) (n : ℕ) : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-2 * t * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hn : 0 ≤ (n : ℝ) := by exact_mod_cast Nat.zero_le n + nlinarith [hts, hn] + +theorem infinityWeight_shift (s : ℝ) (h n : ℕ) : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) * + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hexp : + -2 * s * (n : ℝ) = + 2 * s * (h : ℝ) + -2 * s * ((n + h : ℕ) : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) = + Real.rpow (3 : ℝ) + (2 * s * (h : ℝ) + -2 * s * ((n + h : ℕ) : ℝ)) := by + rw [hexp] + _ = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) * + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) := by + simpa using + (Real.rpow_add h3 (2 * s * (h : ℝ)) + (-2 * s * ((n + h : ℕ) : ℝ))) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite.lean new file mode 100644 index 0000000000..4a6d604cd8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.ChangeExponentDiscount +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.OneCubeBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Series +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.SmallTail + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/ChangeExponentDiscount.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/ChangeExponentDiscount.lean new file mode 100644 index 0000000000..213d2cb2a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/ChangeExponentDiscount.lean @@ -0,0 +1,455 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.OneCubeBounds + +/-! # Change Exponent Discount -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Finite-exponent multiscale ellipticity: discount change of exponent +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +noncomputable section + +private theorem book_geometricWeight_changeOfQ_tsum_le {H : ℕ → ℝ} {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hH_nonneg : ∀ n, 0 ≤ H n) + (hsum_p : + Summable (fun n : ℕ => geometricWeight s p n * Real.rpow (H n) (p / 2))) : + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hq_div : 1 ≤ q / p := by + field_simp [hp.ne'] + exact hpq + let A : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * p * (n : ℝ)) * Real.rpow (H n) (p / 2) + have hA_nonneg : ∀ n, 0 ≤ A n := by + intro n + dsimp [A] + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact Real.rpow_nonneg (hH_nonneg n) _ + have hdisc_p_pos : 0 < geometricDiscount s p := + by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (mul_pos hs hp) + have hdisc_q_nonneg : 0 ≤ geometricDiscount s q := + by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + have hAweighted : + Summable (fun n : ℕ => geometricDiscount s p * A n) := by + simpa [A, geometricWeight, mul_assoc, mul_left_comm, mul_comm] using hsum_p + have hAsum : Summable A := (summable_mul_left_iff hdisc_p_pos.ne').1 hAweighted + have hArpow_sum : Summable (fun n : ℕ => Real.rpow (A n) (q / p)) := + Homogenization.summable_rpow_of_nonneg_of_one_le hq_div hA_nonneg hAsum + have hArpow_le : + ∑' n : ℕ, Real.rpow (A n) (q / p) ≤ Real.rpow (∑' n : ℕ, A n) (q / p) := + Homogenization.tsum_rpow_le_rpow_tsum_of_nonneg hq_div hA_nonneg hAsum + have hAq_rpow : + ∀ n : ℕ, + Real.rpow (A n) (q / p) = + Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) * Real.rpow (H n) (q / 2) := by + intro n + have hmul1 : (-s * p * (n : ℝ)) * (q / p) = -s * q * (n : ℝ) := by + field_simp [hp.ne'] + have hmul2 : (p / 2 : ℝ) * (q / p) = q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow (A n) (q / p) = + Real.rpow + (Real.rpow (3 : ℝ) (-s * p * (n : ℝ)) * Real.rpow (H n) (p / 2)) + (q / p) := by + rfl + _ = + Real.rpow (Real.rpow (3 : ℝ) (-s * p * (n : ℝ))) (q / p) * + Real.rpow (Real.rpow (H n) (p / 2)) (q / p) := by + exact Real.mul_rpow + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.rpow_nonneg (hH_nonneg n) _) + _ = + Real.rpow (3 : ℝ) ((-s * p * (n : ℝ)) * (q / p)) * + Real.rpow (H n) ((p / 2) * (q / p)) := by + congr 1 + · symm + exact Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (-s * p * (n : ℝ)) (q / p) + · symm + exact Real.rpow_mul (hH_nonneg n) (p / 2) (q / p) + _ = + Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) * Real.rpow (H n) (q / 2) := by + rw [hmul1, hmul2] + have hSeries_q : + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := by + calc + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + ∑' n : ℕ, geometricDiscount s q * Real.rpow (A n) (q / p) := by + apply tsum_congr + intro n + simpa [geometricWeight, mul_assoc, mul_left_comm, mul_comm] using + congrArg (fun x : ℝ => geometricDiscount s q * x) (hAq_rpow n).symm + _ = geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := by + simpa using (Summable.tsum_mul_left (geometricDiscount s q) hArpow_sum) + have hSeries_p : + geometricDiscount s p * ∑' n : ℕ, A n = + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + calc + geometricDiscount s p * ∑' n : ℕ, A n = + ∑' n : ℕ, geometricDiscount s p * A n := by + symm + simpa using (Summable.tsum_mul_left (geometricDiscount s p) hAsum) + _ = ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + apply tsum_congr + intro n + simp [A, geometricWeight, mul_assoc, mul_comm] + have hSeries_p_nonneg : + 0 ≤ ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + refine tsum_nonneg ?_ + intro n + exact mul_nonneg + (by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hp.le)) + (Real.rpow_nonneg (hH_nonneg n) _) + have hAsum_eq : + ∑' n : ℕ, A n = + (geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + calc + ∑' n : ℕ, A n = + ((geometricDiscount s p)⁻¹ * geometricDiscount s p) * + ∑' n : ℕ, A n := by + rw [inv_mul_cancel₀ hdisc_p_pos.ne', one_mul] + _ = (geometricDiscount s p)⁻¹ * (geometricDiscount s p * ∑' n : ℕ, A n) := by + ring + _ = + (geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + rw [hSeries_p] + have hAsum_rpow_eq : + Real.rpow (∑' n : ℕ, A n) (q / p) = + Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + rw [hAsum_eq] + calc + Real.rpow + ((geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) = + Real.rpow ((geometricDiscount s p)⁻¹) (q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + exact Real.mul_rpow + (inv_nonneg.mpr (by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hp.le))) + hSeries_p_nonneg + _ = + Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + have hnegdiv : -(q / p) = -q / p := by ring + rw [show Real.rpow ((geometricDiscount s p)⁻¹) (q / p) = + Real.rpow (geometricDiscount s p) (-(q / p)) by + simpa using + (Real.rpow_neg_eq_inv_rpow (geometricDiscount s p) (q / p)).symm] + rw [hnegdiv] + calc + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := hSeries_q + _ ≤ geometricDiscount s q * Real.rpow (∑' n : ℕ, A n) (q / p) := by + exact mul_le_mul_of_nonneg_left hArpow_le hdisc_q_nonneg + _ = + geometricDiscount s q * + (Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p)) := by + rw [hAsum_rpow_eq] + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + ring + +private theorem geometricDiscount_change_factor_nonneg {s p q : ℝ} + (hs : 0 < s) (hp : 0 < p) (hq : 0 < q) : + 0 ≤ geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) := by + refine mul_nonneg ?_ ?_ + · simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + · exact Real.rpow_nonneg + (by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) _ + +private theorem geometricDiscount_change_factor_rpow_two_div {s p q : ℝ} + (hs : 0 < s) (hp : 0 < p) (hq : 0 < q) : + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) := by + have hdisc_q_nonneg : 0 ≤ geometricDiscount s q := by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + have hdisc_p_nonneg : 0 ≤ geometricDiscount s p := by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (mul_nonneg hs.le hp.le) + have hdisc_p_pow_nonneg : + 0 ≤ Real.rpow (geometricDiscount s p) (-q / p) := + Real.rpow_nonneg hdisc_p_nonneg _ + have hmul : (-q / p : ℝ) * (2 / q) = -2 / p := by + field_simp [hq.ne', hp.ne'] + have hrpow : + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) (-2 / p) := by + calc + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) ((-q / p) * (2 / q)) := by + symm + exact Real.rpow_mul hdisc_p_nonneg (-q / p) (2 / q) + _ = Real.rpow (geometricDiscount s p) (-2 / p) := by + rw [hmul] + have hfac : + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) := + Real.mul_rpow hdisc_q_nonneg hdisc_p_pow_nonneg + rw [hfac, hrpow] + +theorem LambdaSqFinite_le_change_exponent_geometricDiscount {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) : + LambdaSq Q s (.finite q) a ≤ + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + LambdaSq Q s (.finite p) a := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hsum_p := summable_B_series_pointwiseCoeffField Q a hs hp + have hSeries := + book_geometricWeight_changeOfQ_tsum_le (hs := hs) (hp1 := hp1) (hpq := hpq) + (H := fun n => maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => + let hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) + hsum_p + have hLambdaQ_nonneg : 0 ≤ LambdaSq Q s (.finite q) a := + Real.rpow_nonneg + (LambdaSqFinite_series_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le)) _ + have hLambdaP_nonneg : 0 ≤ LambdaSq Q s (.finite p) a := + Real.rpow_nonneg + (LambdaSqFinite_series_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le)) _ + have hLambdaP_rpow : + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) = + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + have hmul : (p / 2 : ℝ) * (q / p) = q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) = + Real.rpow (Real.rpow (LambdaSq Q s (.finite p) a) (p / 2)) (q / p) := by + rw [← LambdaSqFinite_rpow_q_div_two_eq_tsum Q s p a hp + (mul_nonneg hs.le hp.le)] + _ = Real.rpow (LambdaSq Q s (.finite p) a) ((p / 2) * (q / p)) := by + symm + exact Real.rpow_mul hLambdaP_nonneg (p / 2) (q / p) + _ = Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + rw [hmul] + have hpow : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + calc + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + exact LambdaSqFinite_rpow_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le) + _ ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) := hSeries + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + rw [hLambdaP_rpow] + have hfactor_nonneg : + 0 ≤ geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) := + geometricDiscount_change_factor_nonneg hs hp hq + calc + LambdaSq Q s (.finite q) a ≤ + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + LambdaSq Q s (.finite p) a := by + exact Homogenization.le_rpow_factor_mul_of_rpow_q_div_two_le hq + hLambdaQ_nonneg hLambdaP_nonneg hfactor_nonneg hpow + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + LambdaSq Q s (.finite p) a := by + rw [geometricDiscount_change_factor_rpow_two_div hs hp hq] + +theorem lambdaSqFinite_inv_le_change_exponent_geometricDiscount {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) : + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hsum_p := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs hp + have hSeries := + book_geometricWeight_changeOfQ_tsum_le (hs := hs) (hp1 := hp1) (hpq := hpq) + (H := fun n => + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => + let hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) + hsum_p + have hlambdaQ_nonneg : 0 ≤ lambdaSq Q s (.finite q) a := + Real.rpow_nonneg + (lambdaSqFinite_series_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le)) _ + have hlambdaP_nonneg : 0 ≤ lambdaSq Q s (.finite p) a := + Real.rpow_nonneg + (lambdaSqFinite_series_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le)) _ + have hLambdaQ_inv_nonneg : 0 ≤ (lambdaSq Q s (.finite q) a)⁻¹ := + inv_nonneg.mpr hlambdaQ_nonneg + have hLambdaP_inv_nonneg : 0 ≤ (lambdaSq Q s (.finite p) a)⁻¹ := + inv_nonneg.mpr hlambdaP_nonneg + have hlambdaP_rpow : + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) = + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + have hmul_neg : (-p / 2 : ℝ) * (q / p) = -q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) = + Real.rpow (Real.rpow (lambdaSq Q s (.finite p) a) (-p / 2)) (q / p) := by + rw [← lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s p a hp + (mul_nonneg hs.le hp.le)] + _ = Real.rpow (lambdaSq Q s (.finite p) a) ((-p / 2) * (q / p)) := by + symm + exact Real.rpow_mul hlambdaP_nonneg (-p / 2) (q / p) + _ = Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + rw [hmul_neg] + have hpow : + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) ≤ + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) * + Real.rpow ((lambdaSq Q s (.finite p) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)).symm + _ = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + exact lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le) + _ ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) := hSeries + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + rw [hlambdaP_rpow] + _ = + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) * + Real.rpow ((lambdaSq Q s (.finite p) a)⁻¹) (q / 2) := by + rw [show Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) = + Real.rpow ((lambdaSq Q s (.finite p) a)⁻¹) (q / 2) by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite p) a) (q / 2))] + have hfactor_nonneg : + 0 ≤ geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) := + geometricDiscount_change_factor_nonneg hs hp hq + calc + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + exact Homogenization.le_rpow_factor_mul_of_rpow_q_div_two_le hq + hLambdaQ_inv_nonneg hLambdaP_inv_nonneg hfactor_nonneg hpow + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + rw [geometricDiscount_change_factor_rpow_two_div hs hp hq] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/DiscountBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/DiscountBounds.lean new file mode 100644 index 0000000000..e6348a9bc3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/DiscountBounds.lean @@ -0,0 +1,355 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.ChangeExponentDiscount + +/-! # Discount Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Finite-exponent multiscale ellipticity: discount scalar bounds +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +noncomputable section + +theorem book_geometricDiscount_nonneg {s q : ℝ} (hsq : 0 ≤ s * q) : + 0 ≤ geometricDiscount s q := by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hsq + +theorem book_geometricDiscount_pos {s q : ℝ} (hsq : 0 < s * q) : + 0 < geometricDiscount s q := by + simpa [geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hsq + +theorem geometricDiscount_le_two_mul {s q : ℝ} (hsq : 0 ≤ s * q) : + geometricDiscount s q ≤ 2 * (s * q) := by + let x : ℝ := s * q + have h3pos : 0 < (3 : ℝ) := by norm_num + have h3nonneg : 0 ≤ (3 : ℝ) := by norm_num + have hpow_pos : 0 < Real.rpow (3 : ℝ) x := + Real.rpow_pos_of_pos h3pos x + have hlog_le : + Real.log (3 : ℝ) ≤ 2 := by + have h := Real.log_le_sub_one_of_pos h3pos + norm_num at h ⊢ + exact h + have hxlog_le : x * Real.log (3 : ℝ) ≤ x * 2 := + mul_le_mul_of_nonneg_left hlog_le (by simpa [x] using hsq) + calc + geometricDiscount s q = 1 - Real.rpow (3 : ℝ) (-x) := by + simp [geometricDiscount, x] + _ = 1 - (Real.rpow (3 : ℝ) x)⁻¹ := by + have h := Real.rpow_neg h3nonneg x + simpa [Real.rpow_eq_pow] using congrArg (fun y : ℝ => 1 - y) h + _ ≤ Real.log (Real.rpow (3 : ℝ) x) := + Real.one_sub_inv_le_log_of_pos hpow_pos + _ = x * Real.log (3 : ℝ) := by + simpa [Real.rpow_eq_pow] using Real.log_rpow h3pos x + _ ≤ x * 2 := hxlog_le + _ = 2 * (s * q) := by + simp [x] + ring + +theorem two_mul_self_rpow_two_div_le_exp_four {q : ℝ} (hq : 1 ≤ q) : + Real.rpow (2 * q) (2 / q) ≤ Real.exp 4 := by + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hxpos : 0 < 2 * q := by positivity + have hlog_le : + Real.log (2 * q) ≤ 2 * q := by + have h := Real.log_le_sub_one_of_pos hxpos + linarith + have hfactor_nonneg : 0 ≤ 2 / q := by positivity + have hrpow_eq : + Real.rpow (2 * q) (2 / q) = + Real.exp (Real.log (2 * q) * (2 / q)) := by + simpa [Real.rpow_eq_pow] using + Real.rpow_def_of_pos hxpos (2 / q) + rw [hrpow_eq] + exact Real.exp_le_exp.mpr <| by + calc + Real.log (2 * q) * (2 / q) ≤ (2 * q) * (2 / q) := + mul_le_mul_of_nonneg_right hlog_le hfactor_nonneg + _ = 4 := by + field_simp [hqpos.ne'] + ring + +theorem geometricDiscount_rpow_two_div_le_exp_four_mul {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + Real.rpow (geometricDiscount s q) (2 / q) ≤ + Real.exp 4 * Real.rpow s (2 / q) := by + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hsq_nonneg : 0 ≤ s * q := mul_nonneg hs.le hqpos.le + have hdisc_nonneg : 0 ≤ geometricDiscount s q := + book_geometricDiscount_nonneg hsq_nonneg + have hupper : geometricDiscount s q ≤ 2 * (s * q) := + geometricDiscount_le_two_mul hsq_nonneg + have hpow_le : + Real.rpow (geometricDiscount s q) (2 / q) ≤ + Real.rpow (2 * (s * q)) (2 / q) := + Real.rpow_le_rpow hdisc_nonneg hupper (by positivity) + have hsplit : + Real.rpow (2 * (s * q)) (2 / q) = + Real.rpow s (2 / q) * Real.rpow (2 * q) (2 / q) := by + calc + Real.rpow (2 * (s * q)) (2 / q) = + Real.rpow (s * (2 * q)) (2 / q) := by + ring_nf + _ = + Real.rpow s (2 / q) * Real.rpow (2 * q) (2 / q) := by + simpa [Real.rpow_eq_pow] using + Real.mul_rpow hs.le (by positivity : 0 ≤ 2 * q) (z := 2 / q) + calc + Real.rpow (geometricDiscount s q) (2 / q) + ≤ Real.rpow (2 * (s * q)) (2 / q) := hpow_le + _ = Real.rpow s (2 / q) * Real.rpow (2 * q) (2 / q) := hsplit + _ ≤ Real.rpow s (2 / q) * Real.exp 4 := by + exact mul_le_mul_of_nonneg_left + (two_mul_self_rpow_two_div_le_exp_four hq) + (Real.rpow_nonneg hs.le _) + _ = Real.exp 4 * Real.rpow s (2 / q) := by ring + +theorem one_half_le_log_three : (1 / 2 : ℝ) ≤ Real.log 3 := by + have hexp_half_le_exp_one : Real.exp ((1 : ℝ) / 2) ≤ Real.exp 1 := + Real.exp_le_exp.mpr (by norm_num) + have hexp_half_lt_three : Real.exp ((1 : ℝ) / 2) < 3 := by + exact lt_of_le_of_lt hexp_half_le_exp_one + (lt_trans Real.exp_one_lt_d9 (by norm_num)) + exact le_of_lt <| + (Real.lt_log_iff_exp_lt (by norm_num : 0 < (3 : ℝ))).2 hexp_half_lt_three + +theorem inv_one_sub_rpow_three_neg_half_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ ≤ 5 * s⁻¹ := by + let x : ℝ := s * Real.log 3 / 2 + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hlog_pos : 0 < Real.log 3 := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hx_pos : 0 < x := by + dsimp [x] + positivity + have h1x_pos : 0 < 1 + x := by linarith + have hr_eq : r = (Real.exp x)⁻¹ := by + dsimp [r, x] + have hpow : + Real.rpow (3 : ℝ) (-s / 2) = + Real.exp (Real.log 3 * (-s / 2)) := by + simpa [Real.rpow_eq_pow] using + Real.rpow_def_of_pos (by norm_num : 0 < (3 : ℝ)) (-s / 2) + change + Real.rpow (3 : ℝ) (-s / 2) = + (Real.exp (s * Real.log 3 / 2))⁻¹ + rw [hpow] + have harg : Real.log 3 * (-s / 2) = -(s * Real.log 3 / 2) := by ring + rw [harg, Real.exp_neg] + have hexp_ge : 1 + x ≤ Real.exp x := by + simpa [add_comm] using Real.add_one_le_exp x + have hr_le : r ≤ (1 + x)⁻¹ := by + rw [hr_eq] + exact (inv_le_inv₀ (Real.exp_pos x) h1x_pos).2 hexp_ge + have hx_div_pos : 0 < x / (1 + x) := div_pos hx_pos h1x_pos + have hden_lower : x / (1 + x) ≤ 1 - r := by + have hcalc : 1 - (1 + x)⁻¹ = x / (1 + x) := by + field_simp [h1x_pos.ne'] + ring + calc + x / (1 + x) = 1 - (1 + x)⁻¹ := hcalc.symm + _ ≤ 1 - r := by linarith + have hden_pos : 0 < 1 - r := + lt_of_lt_of_le hx_div_pos hden_lower + have hinv_le : (1 - r)⁻¹ ≤ (x / (1 + x))⁻¹ := + (inv_le_inv₀ hden_pos hx_div_pos).2 hden_lower + have hquot_inv : (x / (1 + x))⁻¹ = (1 + x) / x := by + field_simp [hx_pos.ne', h1x_pos.ne'] + have hx_lower : s / 4 ≤ x := by + dsimp [x] + nlinarith [mul_le_mul_of_nonneg_left one_half_le_log_three hs.le] + have hs4_pos : 0 < s / 4 := by positivity + have hx_inv_le : x⁻¹ ≤ 4 * s⁻¹ := by + have hbase : x⁻¹ ≤ (s / 4)⁻¹ := + (inv_le_inv₀ hx_pos hs4_pos).2 hx_lower + have hrewrite : (s / 4)⁻¹ = 4 * s⁻¹ := by + field_simp [hs.ne'] + simpa [hrewrite] using hbase + have hs_inv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hquot_le : (1 + x) / x ≤ 5 * s⁻¹ := by + have hquot : (1 + x) / x = 1 + x⁻¹ := by + field_simp [hx_pos.ne'] + ring + rw [hquot] + nlinarith [hx_inv_le, hs_inv_ge_one] + calc + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ = (1 - r)⁻¹ := rfl + _ ≤ (x / (1 + x))⁻¹ := hinv_le + _ = (1 + x) / x := hquot_inv + _ ≤ 5 * s⁻¹ := hquot_le + +theorem inv_one_sub_rpow_three_neg_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ 5 * s⁻¹ := by + let r₁ : ℝ := Real.rpow (3 : ℝ) (-s / 2) + let r₂ : ℝ := Real.rpow (3 : ℝ) (-s) + have hr₁_lt_one : r₁ < 1 := by + dsimp [r₁] + simpa [Real.rpow_eq_pow] using + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith : -s / 2 < 0) + have hr₂_lt_one : r₂ < 1 := by + dsimp [r₂] + simpa [Real.rpow_eq_pow] using + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith : -s < 0) + have hr_le : r₂ ≤ r₁ := by + dsimp [r₁, r₂] + simpa [Real.rpow_eq_pow] using + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith : -s ≤ -s / 2) + have hden₁_pos : 0 < 1 - r₁ := by linarith + have hden₂_pos : 0 < 1 - r₂ := by linarith + have hden_order : 1 - r₁ ≤ 1 - r₂ := by linarith + have hinv_order : (1 - r₂)⁻¹ ≤ (1 - r₁)⁻¹ := + (inv_le_inv₀ hden₂_pos hden₁_pos).2 hden_order + calc + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = (1 - r₂)⁻¹ := rfl + _ ≤ (1 - r₁)⁻¹ := hinv_order + _ = (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := rfl + _ ≤ 5 * s⁻¹ := inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + +theorem inv_geometricDiscount_le_five_inv {s p : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) : + (geometricDiscount s p)⁻¹ ≤ 5 * s⁻¹ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hdisc_one_pos : 0 < geometricDiscount s 1 := by + exact book_geometricDiscount_pos (by simpa using hs) + have hdisc_p_pos : 0 < geometricDiscount s p := + book_geometricDiscount_pos (mul_pos hs hp_pos) + have hmono : geometricDiscount s 1 ≤ geometricDiscount s p := by + unfold geometricDiscount + have hpow : + Real.rpow (3 : ℝ) (-s * p) ≤ + Real.rpow (3 : ℝ) (-s * 1) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + linarith + calc + (geometricDiscount s p)⁻¹ ≤ (geometricDiscount s 1)⁻¹ := + (inv_le_inv₀ hdisc_p_pos hdisc_one_pos).2 hmono + _ ≤ 5 * s⁻¹ := by + simpa [geometricDiscount] using + inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + +theorem geometricDiscount_rpow_neg_two_div_le_twentyFive_mul {s p : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) : + Real.rpow (geometricDiscount s p) (-2 / p) ≤ + 25 * Real.rpow s (-2 / p) := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hdisc_p_pos : 0 < geometricDiscount s p := + book_geometricDiscount_pos (mul_pos hs hp_pos) + have hinv_le : (geometricDiscount s p)⁻¹ ≤ 5 * s⁻¹ := + inv_geometricDiscount_le_five_inv hs hs_le hp + have hinv_nonneg : 0 ≤ (geometricDiscount s p)⁻¹ := + inv_nonneg.mpr hdisc_p_pos.le + have hfive_inv_nonneg : 0 ≤ 5 * s⁻¹ := by positivity + have hpow_le : + Real.rpow ((geometricDiscount s p)⁻¹) (2 / p) ≤ + Real.rpow (5 * s⁻¹) (2 / p) := + Real.rpow_le_rpow hinv_nonneg hinv_le (by positivity) + have hleft : + Real.rpow (geometricDiscount s p) (-2 / p) = + Real.rpow ((geometricDiscount s p)⁻¹) (2 / p) := by + have hneg : (-2 / p : ℝ) = -(2 / p) := by ring + have h := + Real.rpow_neg_eq_inv_rpow (geometricDiscount s p) (2 / p) + simpa [hneg, Real.rpow_eq_pow] using h + have hsplit : + Real.rpow (5 * s⁻¹) (2 / p) = + Real.rpow (5 : ℝ) (2 / p) * Real.rpow s⁻¹ (2 / p) := by + simpa [Real.rpow_eq_pow] using + Real.mul_rpow (by norm_num : 0 ≤ (5 : ℝ)) (inv_nonneg.mpr hs.le) + (z := 2 / p) + have hexp_le : (2 / p : ℝ) ≤ 2 := by + field_simp [hp_pos.ne'] + nlinarith + have hfive_pow : Real.rpow (5 : ℝ) (2 / p) ≤ 25 := by + calc + Real.rpow (5 : ℝ) (2 / p) ≤ Real.rpow (5 : ℝ) 2 := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 5) hexp_le + _ = 25 := by norm_num + have hs_inv_rpow : + Real.rpow s⁻¹ (2 / p) = Real.rpow s (-2 / p) := by + have hneg : (-2 / p : ℝ) = -(2 / p) := by ring + have h := + (Real.rpow_neg_eq_inv_rpow s (2 / p)).symm + simpa [hneg, Real.rpow_eq_pow] using h + calc + Real.rpow (geometricDiscount s p) (-2 / p) + = Real.rpow ((geometricDiscount s p)⁻¹) (2 / p) := hleft + _ ≤ Real.rpow (5 * s⁻¹) (2 / p) := hpow_le + _ = Real.rpow (5 : ℝ) (2 / p) * Real.rpow s⁻¹ (2 / p) := hsplit + _ ≤ 25 * Real.rpow s⁻¹ (2 / p) := by + exact mul_le_mul_of_nonneg_right hfive_pow + (Real.rpow_nonneg (inv_nonneg.mpr hs.le) _) + _ = 25 * Real.rpow s (-2 / p) := by + rw [hs_inv_rpow] + +theorem geometricDiscount_change_exponent_factor_le {s p q : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) (hpq : p ≤ q) : + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) ≤ + (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hq : 1 ≤ q := le_trans hp hpq + have hq_pos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hnum := + geometricDiscount_rpow_two_div_le_exp_four_mul (s := s) (q := q) hs hq + have hden := + geometricDiscount_rpow_neg_two_div_le_twentyFive_mul + (s := s) (p := p) hs hs_le hp + have hden_nonneg : + 0 ≤ Real.rpow (geometricDiscount s p) (-2 / p) := + Real.rpow_nonneg + (book_geometricDiscount_nonneg (mul_nonneg hs.le hp_pos.le)) _ + have hnum_bound_nonneg : + 0 ≤ Real.exp 4 * Real.rpow s (2 / q) := + mul_nonneg (Real.exp_pos 4).le (Real.rpow_nonneg hs.le _) + have hcombine : + Real.rpow s (2 / q) * Real.rpow s (-2 / p) = + Real.rpow s (2 / q - 2 / p) := by + have h : + Real.rpow s (2 / q + (-2 / p)) = + Real.rpow s (2 / q) * Real.rpow s (-2 / p) := by + simpa [Real.rpow_eq_pow] using Real.rpow_add hs (2 / q) (-2 / p) + rw [← h] + congr 1 + ring + calc + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) + ≤ (Real.exp 4 * Real.rpow s (2 / q)) * + (25 * Real.rpow s (-2 / p)) := by + exact mul_le_mul hnum hden hden_nonneg hnum_bound_nonneg + _ = (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) := by + rw [show Real.exp 4 * Real.rpow s (2 / q) * + (25 * Real.rpow s (-2 / p)) = + 25 * Real.exp 4 * + (Real.rpow s (2 / q) * Real.rpow s (-2 / p)) by ring, + hcombine] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/OneCubeBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/OneCubeBounds.lean new file mode 100644 index 0000000000..8b49b66c35 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/OneCubeBounds.lean @@ -0,0 +1,774 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Series + +/-! # One Cube Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Finite-exponent multiscale ellipticity: one-cube bounds +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +noncomputable section + +private theorem natCast_rpow_half_le_self {d : ℕ} [NeZero d] : + Real.rpow (d : ℝ) (1 / 2 : ℝ) ≤ (d : ℝ) := by + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + simpa using Real.rpow_le_rpow_of_exponent_le hd_one + (by norm_num : (1 / 2 : ℝ) ≤ 1) + +private theorem sqrt_natCast_mul_le_natCast_mul_sqrt {d : ℕ} [NeZero d] (x : ℝ) : + Real.sqrt ((d : ℝ) * x) ≤ (d : ℝ) * Real.sqrt x := by + calc + Real.sqrt ((d : ℝ) * x) = Real.sqrt (d : ℝ) * Real.sqrt x := by + exact Real.sqrt_mul (Nat.cast_nonneg d) _ + _ ≤ (d : ℝ) * Real.sqrt x := by + exact mul_le_mul_of_nonneg_right + (by simpa [Real.sqrt_eq_rpow] using natCast_rpow_half_le_self (d := d)) + (Real.sqrt_nonneg x) + +theorem LambdaSq_one_rpow_half_le_old_pointwiseCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} (hs : 0 < s) : + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have holdSummable := summable_old_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have hterm : + ∀ n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 1 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (1 : ℝ)) + have hmax := + maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow + (maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) + (by simpa [A] using hmax) (by positivity) + simpa [geometricWeight_eq_old, A] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + calc + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) = + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + simpa using + (LambdaSqFinite_rpow_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))) + _ ≤ + ∑' n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + exact Summable.tsum_le_tsum hterm hpubSummable + (by simpa [A] using holdSummable) + _ = + Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) A) + (1 / 2 : ℝ) := by + simpa [A] using + (Homogenization.multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum + Q s A hs.le).symm + +theorem lambdaSq_one_rpow_neg_half_le_old_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (-1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have holdSummable := summable_old_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have hterm : + ∀ n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 1 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (1 : ℝ)) + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ hn) a) + (by simpa [A] using hmax) (by positivity) + simpa [geometricWeight_eq_old, A] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + calc + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) = + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + simpa using + (lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))) + _ ≤ + ∑' n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + exact Summable.tsum_le_tsum hterm hpubSummable + (by simpa [A] using holdSummable) + _ = + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) A) + (-1 / 2 : ℝ) := by + simpa [A] using + (Homogenization.multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum + Q s A hs.le).symm + +theorem old_LambdaSq_one_rpow_half_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (1 / 2 : ℝ) ≤ + (d : ℝ) * Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have holdSummable := summable_old_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hdim_half_le : + Real.rpow (d : ℝ) (1 / 2 : ℝ) ≤ (d : ℝ) := + natCast_rpow_half_le_self + have hterm : + ∀ n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 1 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (1 : ℝ)) + have hpub_nonneg : + 0 ≤ maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a + have hold_nonneg : + 0 ≤ + Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A := by + exact Homogenization.maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ hn) A + have hmax := + maxDescendantBBlockNormAtScale_le_dim_mul_maxDescendantBMatrixNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + (d : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + calc + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + Real.rpow + ((d : ℝ) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hold_nonneg (by simpa [A] using hmax) + (by positivity) + _ = + Real.rpow (d : ℝ) (1 / 2 : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact Real.mul_rpow hd_nonneg hpub_nonneg + _ ≤ + (d : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right hdim_half_le + (Real.rpow_nonneg hpub_nonneg _) + calc + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + geometricWeight s 1 n * + ((d : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + simpa [geometricWeight_eq_old] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + _ = + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by ring + have hscaledSummable : + Summable + (fun n : ℕ => + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) := + hpubSummable.mul_left (d : ℝ) + calc + Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) A) + (1 / 2 : ℝ) = + ∑' n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + simpa [A] using + Homogenization.multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum + Q s A hs.le + _ ≤ + ∑' n : ℕ, + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact Summable.tsum_le_tsum hterm + (by simpa [A] using holdSummable) hscaledSummable + _ = + (d : ℝ) * + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + simpa using + (Summable.tsum_mul_left (d : ℝ) hpubSummable) + _ = + (d : ℝ) * Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + rw [LambdaSqFinite_rpow_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))] + +theorem old_lambdaSq_one_rpow_neg_half_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (-1 / 2 : ℝ) ≤ + (d : ℝ) * Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have holdSummable := summable_old_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hdim_half_le : + Real.rpow (d : ℝ) (1 / 2 : ℝ) ≤ (d : ℝ) := + natCast_rpow_half_le_self + have hterm : + ∀ n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 1 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (1 : ℝ)) + have hpub_nonneg : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a := + maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a + have hold_nonneg : + 0 ≤ + Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A := by + exact Homogenization.maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ hn) A + have hmax := + maxDescendantSigmaStarInvNormAtScale_le_dim_mul_maxDescendantSigmaStarInvMatrixNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + (d : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + calc + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + Real.rpow + ((d : ℝ) * + maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hold_nonneg (by simpa [A] using hmax) + (by positivity) + _ = + Real.rpow (d : ℝ) (1 / 2 : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact Real.mul_rpow hd_nonneg hpub_nonneg + _ ≤ + (d : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right hdim_half_le + (Real.rpow_nonneg hpub_nonneg _) + calc + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) ≤ + geometricWeight s 1 n * + ((d : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + simpa [geometricWeight_eq_old] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + _ = + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by ring + have hscaledSummable : + Summable + (fun n : ℕ => + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) := + hpubSummable.mul_left (d : ℝ) + calc + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) A) + (-1 / 2 : ℝ) = + ∑' n : ℕ, + Homogenization.geometricWeight s 1 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (1 / 2 : ℝ) := by + simpa [A] using + Homogenization.multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum + Q s A hs.le + _ ≤ + ∑' n : ℕ, + (d : ℝ) * + (geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact Summable.tsum_le_tsum hterm + (by simpa [A] using holdSummable) hscaledSummable + _ = + (d : ℝ) * + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + simpa using + (Summable.tsum_mul_left (d : ℝ) hpubSummable) + _ = + (d : ℝ) * Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + rw [lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))] + +theorem old_LambdaSq_two_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + (d : ℝ) * LambdaSq Q s (.finite 2) a := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + have holdSummable := summable_old_B_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + have hterm : + ∀ n : ℕ, + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 2 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (2 : ℝ)) + have hmax := + maxDescendantBBlockNormAtScale_le_dim_mul_maxDescendantBMatrixNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + (d : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ) := by + simpa [A, Real.rpow_one] using hmax + calc + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + geometricWeight s 2 n * + ((d : ℝ) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + simpa [geometricWeight_eq_old] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + _ = + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by ring + have hscaledSummable : + Summable + (fun n : ℕ => + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ))) := + hpubSummable.mul_left (d : ℝ) + calc + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) A = + ∑' n : ℕ, + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) := by + simpa [A] using + Homogenization.multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum + Q s 2 A (by norm_num : (0 : ℝ) < 2) + (by positivity : 0 ≤ s * (2 : ℝ)) + _ ≤ + ∑' n : ℕ, + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + exact Summable.tsum_le_tsum hterm + (by simpa [A] using holdSummable) hscaledSummable + _ = + (d : ℝ) * + ∑' n : ℕ, + geometricWeight s 2 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ) := by + simpa using + (Summable.tsum_mul_left (d : ℝ) hpubSummable) + _ = + (d : ℝ) * LambdaSq Q s (.finite 2) a := by + congr 1 + simpa [Real.rpow_one] using + (LambdaSqFinite_rpow_q_div_two_eq_tsum Q s 2 a + (by norm_num : (0 : ℝ) < 2) + (by positivity : 0 ≤ s * (2 : ℝ))).symm + +theorem old_LambdaSq_two_rpow_half_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (1 / 2 : ℝ) ≤ + (d : ℝ) * Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hLambda_le := old_LambdaSq_two_le_dim_mul_pointwiseCoeffField Q a hs + have hsqrts : + Real.sqrt + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) A) ≤ + Real.sqrt ((d : ℝ) * LambdaSq Q s (.finite 2) a) := + Real.sqrt_le_sqrt (by simpa [A] using hLambda_le) + have hsqrt_dim : + Real.sqrt ((d : ℝ) * LambdaSq Q s (.finite 2) a) ≤ + (d : ℝ) * Real.sqrt (LambdaSq Q s (.finite 2) a) := + sqrt_natCast_mul_le_natCast_mul_sqrt _ + simpa [A, Real.sqrt_eq_rpow] using hsqrts.trans hsqrt_dim + +theorem old_lambdaSq_two_inv_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)))⁻¹ ≤ + (d : ℝ) * (lambdaSq Q s (.finite 2) a)⁻¹ := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hpubSummable := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + have holdSummable := summable_old_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 2) + have hterm : + ∀ n : ℕ, + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight_nonneg : 0 ≤ geometricWeight s 2 n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (by positivity : 0 ≤ s * (2 : ℝ)) + have hmax := + maxDescendantSigmaStarInvNormAtScale_le_dim_mul_maxDescendantSigmaStarInvMatrixNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + (d : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ) := by + simpa [A, Real.rpow_one] using hmax + calc + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) ≤ + geometricWeight s 2 n * + ((d : ℝ) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + simpa [geometricWeight_eq_old] using + mul_le_mul_of_nonneg_left hpow hweight_nonneg + _ = + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by ring + have hscaledSummable : + Summable + (fun n : ℕ => + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ))) := + hpubSummable.mul_left (d : ℝ) + calc + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) A)⁻¹ = + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) A) + (-1 : ℝ) := by + exact (Real.rpow_neg_one _).symm + _ = + ∑' n : ℕ, + Homogenization.geometricWeight s 2 n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (2 / 2 : ℝ) := by + simpa [A] using + Homogenization.multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum + Q s 2 A (by norm_num : (0 : ℝ) < 2) + (by positivity : 0 ≤ s * (2 : ℝ)) + _ ≤ + ∑' n : ℕ, + (d : ℝ) * + (geometricWeight s 2 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ)) := by + exact Summable.tsum_le_tsum hterm + (by simpa [A] using holdSummable) hscaledSummable + _ = + (d : ℝ) * + ∑' n : ℕ, + geometricWeight s 2 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) + (2 / 2 : ℝ) := by + simpa using + (Summable.tsum_mul_left (d : ℝ) hpubSummable) + _ = + (d : ℝ) * Real.rpow (lambdaSq Q s (.finite 2) a) (-1 : ℝ) := by + congr 1 + simpa using + (lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s 2 a + (by norm_num : (0 : ℝ) < 2) + (by positivity : 0 ≤ s * (2 : ℝ))).symm + _ = + (d : ℝ) * (lambdaSq Q s (.finite 2) a)⁻¹ := by + congr 1 + exact Real.rpow_neg_one _ + +theorem old_lambdaSq_two_rpow_neg_half_le_dim_mul_pointwiseCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (-1 / 2 : ℝ) ≤ + (d : ℝ) * Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hinv_le := old_lambdaSq_two_inv_le_dim_mul_pointwiseCoeffField Q a hs + have hsqrts : + Real.sqrt + ((Homogenization.lambdaSq Q s + (Homogenization.MultiscaleExponent.finite 2) A)⁻¹) ≤ + Real.sqrt ((d : ℝ) * (lambdaSq Q s (.finite 2) a)⁻¹) := + Real.sqrt_le_sqrt (by simpa [A] using hinv_le) + have hsqrt_dim : + Real.sqrt ((d : ℝ) * (lambdaSq Q s (.finite 2) a)⁻¹) ≤ + (d : ℝ) * Real.sqrt ((lambdaSq Q s (.finite 2) a)⁻¹) := + sqrt_natCast_mul_le_natCast_mul_sqrt _ + have hleft : + Real.sqrt + ((Homogenization.lambdaSq Q s + (Homogenization.MultiscaleExponent.finite 2) A)⁻¹) = + Real.rpow + (Homogenization.lambdaSq Q s + (Homogenization.MultiscaleExponent.finite 2) A) + (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + have hright : + Real.sqrt ((lambdaSq Q s (.finite 2) a)⁻¹) = + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + calc + Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 2) A) + (-1 / 2 : ℝ) = + Real.sqrt + ((Homogenization.lambdaSq Q s + (Homogenization.MultiscaleExponent.finite 2) A)⁻¹) := hleft.symm + _ ≤ Real.sqrt ((d : ℝ) * (lambdaSq Q s (.finite 2) a)⁻¹) := hsqrts + _ ≤ (d : ℝ) * Real.sqrt ((lambdaSq Q s (.finite 2) a)⁻¹) := hsqrt_dim + _ = (d : ℝ) * Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) := by + rw [hright] + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Properties.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Properties.lean new file mode 100644 index 0000000000..498904613b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Properties.lean @@ -0,0 +1,698 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds + +/-! # Properties -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Finite-exponent multiscale ellipticity: public properties +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +noncomputable section + +theorem LambdaSq_finite_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + 0 ≤ LambdaSq Q s (.finite q) a := by + have hq0 : 0 ≤ q := le_trans zero_le_one hq + rw [LambdaSq_finite] + exact Real.rpow_nonneg + (LambdaSqFinite_series_nonneg Q s q a hq0 (mul_nonneg hs.le hq0)) _ + +theorem lambdaSq_finite_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + 0 ≤ lambdaSq Q s (.finite q) a := by + have hq0 : 0 ≤ q := le_trans zero_le_one hq + rw [lambdaSq_finite] + exact Real.rpow_nonneg + (lambdaSqFinite_series_nonneg Q s q a hq0 (mul_nonneg hs.le hq0)) _ + +/-- The q=1 upper operator-norm series is summable for every Ch2 triadic +coefficient family. -/ +theorem summable_geometricWeight_one_mul_maxDescendantBMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) := by + let Apw : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := + 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ * + (a.coeffOn Q).Lam ^ 2 + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) Apw := by + simpa [Apw] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q Apw := by + simpa [Apw] using + pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine + Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := 1) (C := C) (by simpa using hs) ?_ ?_ + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + exact maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self Q.scale hn) a + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hmatrix_le := + maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + (a := a) Q (sub_le_self Q.scale hn) + have hblock_le : + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) Apw ≤ C := by + simpa [Apw, C] using + maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := Apw) hEll hData n + exact hmatrix_le.trans hblock_le + +/-- The q=1 lower inverse operator-norm series is summable for every Ch2 +triadic coefficient family. -/ +theorem summable_geometricWeight_one_mul_maxDescendantSigmaStarInvMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : TriadicCoeffFamily d) {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) := by + let Apw : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := + 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) Apw := by + simpa [Apw] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q Apw := by + simpa [Apw] using + pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine + Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := 1) (C := C) (by simpa using hs) ?_ ?_ + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self Q.scale hn) a + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hmatrix_le := + maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + (a := a) Q (sub_le_self Q.scale hn) + have hblock_le : + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) Apw ≤ C := by + simpa [Apw, C] using + maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := Apw) hEll hData n + exact hmatrix_le.trans hblock_le + +private theorem rpow_two_tsum_weighted_rpow_half_le_tsum_weighted + {w H : ℕ → ℝ} + (hw_nonneg : ∀ n, 0 ≤ w n) + (hH_nonneg : ∀ n, 0 ≤ H n) + (hw_sum : Summable w) + (hw_tsum_le_one : (∑' n : ℕ, w n) ≤ 1) + (hWH_sum : Summable (fun n : ℕ => w n * H n)) + (hWsqrt_sum : Summable (fun n : ℕ => w n * Real.rpow (H n) (1 / 2 : ℝ))) : + Real.rpow (∑' n : ℕ, w n * Real.rpow (H n) (1 / 2 : ℝ)) (2 : ℝ) ≤ + ∑' n : ℕ, w n * H n := by + classical + let sqrtH : ℕ → ℝ := fun n => Real.rpow (H n) (1 / 2 : ℝ) + let B : ℝ := ∑' n : ℕ, w n * H n + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact tsum_nonneg fun n => mul_nonneg (hw_nonneg n) (hH_nonneg n) + have hfinite : + ∀ s : Finset ℕ, + ∑ n ∈ s, w n * sqrtH n ≤ Real.rpow B (1 / 2 : ℝ) := by + intro s + have hholder : + ∑ n ∈ s, w n * sqrtH n ≤ + (∑ n ∈ s, w n) ^ (1 - (2 : ℝ)⁻¹) * + (∑ n ∈ s, w n * sqrtH n ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ := + Real.inner_le_weight_mul_Lp_of_nonneg + (s := s) (p := (2 : ℝ)) (w := w) (f := sqrtH) + (by norm_num) hw_nonneg + (fun n => Real.rpow_nonneg (hH_nonneg n) _) + have hsquares : + (∑ n ∈ s, w n * sqrtH n ^ (2 : ℝ)) = + ∑ n ∈ s, w n * H n := by + refine Finset.sum_congr rfl ?_ + intro n _hn + have hsqrt_sq : sqrtH n ^ 2 = H n := by + simpa [sqrtH] using + Homogenization.sq_rpow_half_eq_self_of_nonneg (hH_nonneg n) + have hsqrt_sq_rpow : sqrtH n ^ (2 : ℝ) = H n := by + calc + sqrtH n ^ (2 : ℝ) = sqrtH n ^ 2 := Real.rpow_natCast _ 2 + _ = H n := hsqrt_sq + exact congrArg (fun x : ℝ => w n * x) hsqrt_sq_rpow + have hsumw_nonneg : 0 ≤ ∑ n ∈ s, w n := + Finset.sum_nonneg fun n _hn => hw_nonneg n + have hsumw_le_tsum : ∑ n ∈ s, w n ≤ ∑' n : ℕ, w n := + hw_sum.sum_le_tsum s fun n _hn => hw_nonneg n + have hsumw_le_one : ∑ n ∈ s, w n ≤ 1 := + hsumw_le_tsum.trans hw_tsum_le_one + have hsumw_rpow_le_one : + (∑ n ∈ s, w n) ^ (1 / 2 : ℝ) ≤ 1 := by + have hpow := + Real.rpow_le_rpow hsumw_nonneg hsumw_le_one (by norm_num : 0 ≤ (1 / 2 : ℝ)) + simpa using hpow + have hsumWH_nonneg : 0 ≤ ∑ n ∈ s, w n * H n := + Finset.sum_nonneg fun n _hn => mul_nonneg (hw_nonneg n) (hH_nonneg n) + have hsumWH_le_B : ∑ n ∈ s, w n * H n ≤ B := by + dsimp [B] + exact hWH_sum.sum_le_tsum s fun n _hn => + mul_nonneg (hw_nonneg n) (hH_nonneg n) + have hsumWH_rpow_le_B : + (∑ n ∈ s, w n * H n) ^ (1 / 2 : ℝ) ≤ Real.rpow B (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hsumWH_nonneg hsumWH_le_B + (by norm_num : 0 ≤ (1 / 2 : ℝ)) + calc + ∑ n ∈ s, w n * sqrtH n + ≤ (∑ n ∈ s, w n) ^ (1 / 2 : ℝ) * + (∑ n ∈ s, w n * H n) ^ (1 / 2 : ℝ) := by + have hleftExp : 1 - (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + have hrightExp : (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + calc + ∑ n ∈ s, w n * sqrtH n ≤ + (∑ n ∈ s, w n) ^ (1 - (2 : ℝ)⁻¹) * + (∑ n ∈ s, w n * sqrtH n ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ := + hholder + _ = (∑ n ∈ s, w n) ^ (1 / 2 : ℝ) * + (∑ n ∈ s, w n * H n) ^ (1 / 2 : ℝ) := by + rw [hsquares, hleftExp, hrightExp] + _ ≤ 1 * Real.rpow B (1 / 2 : ℝ) := by + exact mul_le_mul hsumw_rpow_le_one hsumWH_rpow_le_B + (Real.rpow_nonneg hsumWH_nonneg _) (by norm_num) + _ = Real.rpow B (1 / 2 : ℝ) := by ring + have hS_nonneg : + 0 ≤ ∑' n : ℕ, w n * Real.rpow (H n) (1 / 2 : ℝ) := + tsum_nonneg fun n => + mul_nonneg (hw_nonneg n) (Real.rpow_nonneg (hH_nonneg n) _) + have hS_le : + (∑' n : ℕ, w n * Real.rpow (H n) (1 / 2 : ℝ)) ≤ + Real.rpow B (1 / 2 : ℝ) := by + have hfinite' : + ∀ s : Finset ℕ, + ∑ n ∈ s, w n * Real.rpow (H n) (1 / 2 : ℝ) ≤ + Real.rpow B (1 / 2 : ℝ) := by + intro s + simpa [sqrtH] using hfinite s + exact hWsqrt_sum.tsum_le_of_sum_le hfinite' + calc + Real.rpow (∑' n : ℕ, w n * Real.rpow (H n) (1 / 2 : ℝ)) (2 : ℝ) + = (∑' n : ℕ, w n * Real.rpow (H n) (1 / 2 : ℝ)) ^ 2 := by + exact Real.rpow_natCast _ 2 + _ ≤ (Real.rpow B (1 / 2 : ℝ)) ^ 2 := + pow_le_pow_left₀ hS_nonneg hS_le 2 + _ = B := Homogenization.sq_rpow_half_eq_self_of_nonneg hB_nonneg + +/-- Jensen upper bound for the q=1 Ch2 upper operator multiscale ellipticity. +The norm here is `Ch02.matrixNorm` through +`maxDescendantBMatrixNormAtScale`. -/ +theorem LambdaSq_finite_one_le_tsum_weighted_maxDescendantBMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + LambdaSq Q s (.finite 1) a ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := by + have hNorm_sum := + summable_geometricWeight_one_mul_maxDescendantBMatrixNormAtScale Q a hs + have hSqrt_sum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + simpa using + summable_B_series_pointwiseCoeffField Q a hs (by norm_num : (0 : ℝ) < 1) + calc + LambdaSq Q s (.finite 1) a = + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg + (LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1)) + _ = + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + rw [LambdaSqFinite_rpow_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))] + _ = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) (2 : ℝ) := by + exact (Real.rpow_natCast _ 2).symm + _ ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + rpow_two_tsum_weighted_rpow_half_le_tsum_weighted + (w := fun n : ℕ => geometricWeight s 1 n) + (H := fun n : ℕ => + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n + (mul_nonneg hs.le (by norm_num : (0 : ℝ) ≤ 1))) + (fun n => + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self Q.scale hn) a) + (by + simpa [geometricWeight_eq_old] using + Homogenization.summable_geometricWeight_one (s := s) hs) + (by + simpa [geometricWeight_eq_old] using + (Homogenization.tsum_geometricWeight_one_eq_one (s := s) hs).le) + hNorm_sum hSqrt_sum + +/-- Jensen upper bound for the q=1 Ch2 lower inverse operator multiscale +ellipticity. The norm here is `Ch02.matrixNorm` through +`maxDescendantSigmaStarInvMatrixNormAtScale`. -/ +theorem lambdaSq_finite_one_inv_le_tsum_weighted_maxDescendantSigmaStarInvMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s : ℝ} (hs : 0 < s) : + (lambdaSq Q s (.finite 1) a)⁻¹ ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := by + have hNorm_sum := + summable_geometricWeight_one_mul_maxDescendantSigmaStarInvMatrixNormAtScale Q a hs + have hSqrt_sum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + simpa using + summable_sigmaStarInv_series_pointwiseCoeffField Q a hs + (by norm_num : (0 : ℝ) < 1) + calc + (lambdaSq Q s (.finite 1) a)⁻¹ = + (Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg + (lambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1)) + _ = + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + rw [lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s 1 a + (by norm_num : (0 : ℝ) < 1) (by positivity : 0 ≤ s * (1 : ℝ))] + _ = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) (2 : ℝ) := by + exact (Real.rpow_natCast _ 2).symm + _ ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + rpow_two_tsum_weighted_rpow_half_le_tsum_weighted + (w := fun n : ℕ => geometricWeight s 1 n) + (H := fun n : ℕ => + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n + (mul_nonneg hs.le (by norm_num : (0 : ℝ) ≤ 1))) + (fun n => + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self Q.scale hn) a) + (by + simpa [geometricWeight_eq_old] using + Homogenization.summable_geometricWeight_one (s := s) hs) + (by + simpa [geometricWeight_eq_old] using + (Homogenization.tsum_geometricWeight_one_eq_one (s := s) hs).le) + hNorm_sum hSqrt_sum + +theorem LambdaSqFinite_le_change_exponent {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s p q : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) (hpq : p ≤ q) : + LambdaSq Q s (.finite q) a ≤ + (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) * + LambdaSq Q s (.finite p) a := by + have hexact := + LambdaSqFinite_le_change_exponent_geometricDiscount + Q a hs hp hpq + have hfactor := + geometricDiscount_change_exponent_factor_le + (s := s) (p := p) (q := q) hs hs_le hp hpq + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite p) a := + LambdaSq_finite_nonneg Q a hs hp + calc + LambdaSq Q s (.finite q) a ≤ + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p)) * + LambdaSq Q s (.finite p) a := by + simpa [mul_assoc] using hexact + _ ≤ + ((25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p)) * + LambdaSq Q s (.finite p) a := + mul_le_mul_of_nonneg_right hfactor hLambda_nonneg + _ = + (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) * + LambdaSq Q s (.finite p) a := by + ring + +theorem lambdaSqFinite_inv_le_change_exponent {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s p q : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) (hpq : p ≤ q) : + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + have hexact := + lambdaSqFinite_inv_le_change_exponent_geometricDiscount + Q a hs hp hpq + have hfactor := + geometricDiscount_change_exponent_factor_le + (s := s) (p := p) (q := q) hs hs_le hp hpq + have hlambda_inv_nonneg : 0 ≤ (lambdaSq Q s (.finite p) a)⁻¹ := + inv_nonneg.mpr (lambdaSq_finite_nonneg Q a hs hp) + calc + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p)) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + simpa [mul_assoc] using hexact + _ ≤ + ((25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p)) * + (lambdaSq Q s (.finite p) a)⁻¹ := + mul_le_mul_of_nonneg_right hfactor hlambda_inv_nonneg + _ = + (25 * Real.exp 4) * Real.rpow s (2 / q - 2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + ring + +theorem oneCube_b_le_LambdaSq_finite {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + coarseBMatrixNorm Q a ≤ LambdaSq Q s (.finite q) a := by + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + let H : ℕ → ℝ := fun n => + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantBMatrixNormAtScale_nonneg Q hlQ a + · exact maxDescendantBMatrixNormAtScale_le_of_le a Q hkl hlQ + · positivity + have hsum := summable_B_series_pointwiseCoeffField Q a hs hqpos + have hpow : + Real.rpow (coarseBMatrixNorm Q a) (q / 2) ≤ + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + have hself : + H 0 ≤ ∑' n : ℕ, geometricWeight s q n * H n := by + exact Homogenization.self_le_tsum_geometricWeight_of_monotone hmono + (mul_pos hs hqpos) (by simpa [H, geometricWeight_eq_old] using hsum) + calc + Real.rpow (coarseBMatrixNorm Q a) (q / 2) = H 0 := by + dsimp [H] + simp [maxDescendantBMatrixNormAtScale_self] + _ ≤ ∑' n : ℕ, geometricWeight s q n * H n := hself + _ = Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + symm + simpa [H] using + LambdaSqFinite_rpow_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le) + exact (Real.rpow_le_rpow_iff + (coarseBMatrixNorm_nonneg Q a) + (LambdaSq_finite_nonneg Q a hs hq) + (by positivity : 0 < q / 2)).1 hpow + +theorem oneCube_sigmaStarInv_le_lambdaSq_finite_inv {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + coarseSigmaStarInvMatrixNorm Q a ≤ (lambdaSq Q s (.finite q) a)⁻¹ := by + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + let H : ℕ → ℝ := fun n => + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hlQ a + · exact maxDescendantSigmaStarInvMatrixNormAtScale_le_of_le a Q hkl hlQ + · positivity + have hsum := summable_sigmaStarInv_series_pointwiseCoeffField Q a hs hqpos + have hpow : + Real.rpow (coarseSigmaStarInvMatrixNorm Q a) (q / 2) ≤ + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + have hself : + H 0 ≤ ∑' n : ℕ, geometricWeight s q n * H n := by + exact Homogenization.self_le_tsum_geometricWeight_of_monotone hmono + (mul_pos hs hqpos) (by simpa [H, geometricWeight_eq_old] using hsum) + calc + Real.rpow (coarseSigmaStarInvMatrixNorm Q a) (q / 2) = H 0 := by + dsimp [H] + simp [maxDescendantSigmaStarInvMatrixNormAtScale_self] + _ ≤ ∑' n : ℕ, geometricWeight s q n * H n := hself + _ = Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + symm + simpa [H] using + lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le) + have hpow' : + Real.rpow (coarseSigmaStarInvMatrixNorm Q a) (q / 2) ≤ + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + calc + Real.rpow (coarseSigmaStarInvMatrixNorm Q a) (q / 2) ≤ + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := hpow + _ = Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)) + exact (Real.rpow_le_rpow_iff + (coarseSigmaStarInvMatrixNorm_nonneg Q a) + (inv_nonneg.mpr (lambdaSq_finite_nonneg Q a hs hq)) + (by positivity : 0 < q / 2)).1 hpow' + +theorem coarseBMatrixNorm_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + 0 < coarseBMatrixNorm Q a := by + simpa [coarseBMatrixNorm] using + matrixNorm_pos_of_posDef (bCoarse_posDef (cubeDomain Q) (a.coeffOn Q)) + +theorem coarseSigmaStarInvMatrixNorm_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + 0 < coarseSigmaStarInvMatrixNorm Q a := by + simpa [coarseSigmaStarInvMatrixNorm] using + matrixNorm_pos_of_posDef + (sigmaStarInvCoarse_posDef (cubeDomain Q) (a.coeffOn Q)) + +theorem LambdaSq_finite_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + 0 < LambdaSq Q s (.finite q) a := by + exact lt_of_lt_of_le (coarseBMatrixNorm_pos Q a) + (oneCube_b_le_LambdaSq_finite Q a hs hq) + +theorem lambdaSq_finite_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + 0 < lambdaSq Q s (.finite q) a := by + have hle : + coarseSigmaStarInvMatrixNorm Q a ≤ + (lambdaSq Q s (.finite q) a)⁻¹ := + oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q a hs hq + have hinvpos : 0 < (lambdaSq Q s (.finite q) a)⁻¹ := + lt_of_lt_of_le (coarseSigmaStarInvMatrixNorm_pos Q a) hle + exact inv_pos.mp hinvpos + +theorem oneCube_sigmaStarInv_le_b {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + (coarseSigmaStarInvMatrixNorm Q a)⁻¹ ≤ coarseBMatrixNorm Q a := by + let U : Domain d := cubeDomain Q + let aQ : CoeffOn U := a.coeffOn Q + have hMul : + sigmaStarInvCoarse U aQ * sigmaStarCoarse U aQ = 1 := + sigmaStarInvCoarse_mul_sigmaStarCoarse + (isUnit_det_sigmaStarInvCoarse U aQ) + have hInvNorm : + (matrixNorm (sigmaStarInvCoarse U aQ))⁻¹ ≤ + matrixNorm (sigmaStarCoarse U aQ) := by + have hSInvPos : 0 < matrixNorm (sigmaStarInvCoarse U aQ) := by + simpa [U, aQ, coarseSigmaStarInvMatrixNorm] using + coarseSigmaStarInvMatrixNorm_pos Q a + exact matrixNorm_inv_le_of_mul_eq_one hMul hSInvPos + have hStarB : MatLoewnerLE (sigmaStarCoarse U aQ) (bCoarse U aQ) := by + intro x + exact le_trans ((sigmaStarCoarse_le_sigmaCoarse U aQ) x) + ((sigmaCoarse_le_bCoarse U aQ) x) + have hNormOrder : + matrixNorm (sigmaStarCoarse U aQ) ≤ matrixNorm (bCoarse U aQ) := + matrixNorm_le_of_matLoewnerLE_of_posSemidef + (sigmaStarCoarse_posDef U aQ).posSemidef + (bCoarse_posSemidef U aQ) hStarB + calc + (coarseSigmaStarInvMatrixNorm Q a)⁻¹ = + (matrixNorm (sigmaStarInvCoarse U aQ))⁻¹ := by + rfl + _ ≤ matrixNorm (sigmaStarCoarse U aQ) := hInvNorm + _ ≤ matrixNorm (bCoarse U aQ) := hNormOrder + _ = coarseBMatrixNorm Q a := by + rfl + +theorem LambdaSq_finite_antitone {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s q : ℝ} + (ht : 0 < t) (hts : t < s) (hq : 1 ≤ q) : + LambdaSq Q s (.finite q) a ≤ LambdaSq Q t (.finite q) a := by + have hs : 0 < s := lt_trans ht hts + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + exact summable_B_series_pointwiseCoeffField Q a ht hqpos + have hpow : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) ≤ + Real.rpow (LambdaSq Q t (.finite q) a) (q / 2) := by + rw [LambdaSqFinite_rpow_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le), + LambdaSqFinite_rpow_q_div_two_eq_tsum Q t q a hqpos + (mul_nonneg ht.le hqpos.le)] + refine Homogenization.tsum_geometricWeight_le_of_monotone ?_ ?_ + hqpos ht hts (by simpa [geometricWeight_eq_old] using hsum_t) + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantBMatrixNormAtScale_nonneg Q hlQ a + · exact maxDescendantBMatrixNormAtScale_le_of_le a Q hkl hlQ + · positivity + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + exact (Real.rpow_le_rpow_iff + (LambdaSq_finite_nonneg Q a hs hq) + (LambdaSq_finite_nonneg Q a ht hq) + (by positivity : 0 < q / 2)).1 hpow + +theorem lambdaSq_finite_mono {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s q : ℝ} + (ht : 0 < t) (hts : t < s) (hq : 1 ≤ q) : + lambdaSq Q t (.finite q) a ≤ lambdaSq Q s (.finite q) a := by + have hs : 0 < s := lt_trans ht hts + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + exact summable_sigmaStarInv_series_pointwiseCoeffField Q a ht hqpos + have hpow_neg : + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) ≤ + Real.rpow (lambdaSq Q t (.finite q) a) (-q / 2) := by + rw [lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le), + lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q t q a hqpos + (mul_nonneg ht.le hqpos.le)] + refine Homogenization.tsum_geometricWeight_le_of_monotone ?_ ?_ + hqpos ht hts (by simpa [geometricWeight_eq_old] using hsum_t) + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hlQ a + · exact maxDescendantSigmaStarInvMatrixNormAtScale_le_of_le a Q hkl hlQ + · positivity + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hpow_inv : + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) ≤ + Real.rpow ((lambdaSq Q t (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)).symm + _ ≤ Real.rpow (lambdaSq Q t (.finite q) a) (-q / 2) := hpow_neg + _ = Real.rpow ((lambdaSq Q t (.finite q) a)⁻¹) (q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q t (.finite q) a) (q / 2)) + have hinv : + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + (lambdaSq Q t (.finite q) a)⁻¹ := + (Real.rpow_le_rpow_iff + (inv_nonneg.mpr (lambdaSq_finite_nonneg Q a hs hq)) + (inv_nonneg.mpr (lambdaSq_finite_nonneg Q a ht hq)) + (by positivity : 0 < q / 2)).1 hpow_inv + exact (inv_le_inv₀ (lambdaSq_finite_pos Q a hs hq) + (lambdaSq_finite_pos Q a ht hq)).1 hinv + +theorem lambdaSq_finite_le_oneCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 1 ≤ q) : + lambdaSq Q s (.finite q) a ≤ (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := by + have hlambda_pos : 0 < lambdaSq Q s (.finite q) a := + lambdaSq_finite_pos Q a hs hq + have hSigpos : 0 < coarseSigmaStarInvMatrixNorm Q a := + coarseSigmaStarInvMatrixNorm_pos Q a + have hle : + coarseSigmaStarInvMatrixNorm Q a ≤ + (lambdaSq Q s (.finite q) a)⁻¹ := + oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q a hs hq + have hinvpos : 0 < (lambdaSq Q s (.finite q) a)⁻¹ := by + exact inv_pos.mpr hlambda_pos + have hconverted : + ((lambdaSq Q s (.finite q) a)⁻¹)⁻¹ ≤ + (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := + (inv_le_inv₀ hinvpos hSigpos).2 hle + simpa [inv_inv] using hconverted + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Series.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Series.lean new file mode 100644 index 0000000000..5d7e897821 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/Series.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Representatives + +/-! # Series -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Finite-exponent multiscale ellipticity: series identities +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +noncomputable section + +theorem LambdaSqFinite_series_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s q : ℝ) (a : TriadicCoeffFamily d) + (_hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + refine tsum_nonneg ?_ + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using Homogenization.geometricWeight_nonneg n hsq + · exact Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) _ + +theorem lambdaSqFinite_series_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s q : ℝ) (a : TriadicCoeffFamily d) + (_hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + refine tsum_nonneg ?_ + intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using Homogenization.geometricWeight_nonneg n hsq + · exact Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ hn) a) _ + +theorem LambdaSqFinite_rpow_q_div_two_eq_tsum {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s q : ℝ) (a : TriadicCoeffFamily d) + (hq : 0 < q) (hsq : 0 ≤ s * q) : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + rw [LambdaSq_finite] + let S : ℝ := + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact LambdaSqFinite_series_nonneg Q s q a hq.le hsq + have hmul : (2 / q : ℝ) * (q / 2) = 1 := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow S (2 / q)) (q / 2) = + Real.rpow S ((2 / q) * (q / 2)) := by + symm + exact Real.rpow_mul hS_nonneg (2 / q : ℝ) (q / 2) + _ = Real.rpow S 1 := by simp [hmul] + _ = S := by exact Real.rpow_one S + _ = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + rfl + +theorem lambdaSqFinite_rpow_neg_q_div_two_eq_tsum {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s q : ℝ) (a : TriadicCoeffFamily d) + (hq : 0 < q) (hsq : 0 ≤ s * q) : + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + rw [lambdaSq_finite] + let S : ℝ := + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact lambdaSqFinite_series_nonneg Q s q a hq.le hsq + have hmul : (-(2 / q) : ℝ) * (-q / 2) = 1 := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow S (-(2 / q))) (-q / 2) = + Real.rpow S ((-(2 / q)) * (-q / 2)) := by + symm + exact Real.rpow_mul hS_nonneg (-(2 / q) : ℝ) (-q / 2) + _ = Real.rpow S 1 := by simp [hmul] + _ = S := by exact Real.rpow_one S + _ = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + rfl + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/SmallTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/SmallTail.lean new file mode 100644 index 0000000000..9c20c73539 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Finite/SmallTail.lean @@ -0,0 +1,1311 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import Mathlib.Algebra.Order.Chebyshev + +/-! # Small Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +/-! +# Deterministic small-scale tails for q = 1 + +This file records the Ch2 operator-norm version of the deterministic +small-tail split at scale zero. +-/ + +noncomputable section + +open scoped BigOperators + +/-- Shift identity for the q = 1 geometric weights in the small-scale tail. -/ +theorem smallTail_geometricWeight_one_nat_add_eq + (s : ℝ) (j m : ℕ) : + geometricWeight s 1 (j + m) = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * geometricWeight s 1 j := by + have hexp : + -s * 1 * ((j + m : ℕ) : ℝ) = + (-s * (m : ℝ)) + (-s * 1 * (j : ℝ)) := by + norm_num + ring + have hpow : + Real.rpow (3 : ℝ) ((-s * (m : ℝ)) + (-s * 1 * (j : ℝ))) = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (3 : ℝ) (-s * 1 * (j : ℝ)) := + Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + unfold geometricWeight + rw [hexp, hpow] + ring + +/-- +Converse to descendant-depth transitivity: a descendant at depth `m + n` +factors through some depth-`m` intermediate cube. +-/ +theorem smallTail_exists_descendant_ancestor_at_depth {d : ℕ} + {Q R : TriadicCube d} (m n : ℕ) + (hR : R ∈ descendantsAtDepth Q (m + n)) : + ∃ U ∈ descendantsAtDepth Q m, R ∈ descendantsAtDepth U n := by + induction n generalizing R with + | zero => + exact ⟨R, by simpa using hR, by simp⟩ + | succ n ih => + have hRsucc : R ∈ descendantsAtDepth Q ((m + n) + 1) := by + simpa [Nat.add_assoc] using hR + rw [mem_descendantsAtDepth_succ_iff] at hRsucc + rcases hRsucc with ⟨S, hS, hRS⟩ + rcases ih hS with ⟨U, hU, hSU⟩ + refine ⟨U, hU, ?_⟩ + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨S, hSU, hRS⟩ + +/-- +Every descendant of `cu_m` at a nonpositive absolute scale `-j` factors +through a scale-zero descendant of `cu_m`. +-/ +theorem smallTail_exists_scale_zero_ancestor_of_mem_descendantsAtScale_originCube_neg_nat + {d : ℕ} {m j : ℕ} {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d (m : ℤ)) (-(j : ℤ))) : + ∃ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + R ∈ descendantsAtScale U (-(j : ℤ)) := by + let Q : TriadicCube d := originCube d (m : ℤ) + have hk : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + have hdepth : R ∈ descendantsAtDepth Q (m + j) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + have htoNat : Int.toNat (Q.scale - (-(j : ℤ))) = m + j := by + have hdiff : Q.scale - (-(j : ℤ)) = ((m + j : ℕ) : ℤ) := by + dsimp [Q, originCube] + omega + rw [hdiff] + simpa [Int.natCast_add] using (Int.toNat_natCast (m + j)) + simpa [htoNat] using! hR + rcases smallTail_exists_descendant_ancestor_at_depth + (Q := Q) (R := R) m j hdepth with + ⟨U, hUdepth, hRUdepth⟩ + have hUscale_zero : U.scale = 0 := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hUdepth + dsimp [Q, originCube] at hscale + omega + have hUscale : U ∈ descendantsAtScale Q 0 := by + have h0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + rw [descendantsAtScale_eq_descendantsAtDepth Q h0] + have htoNat : Int.toNat (Q.scale - 0) = m := by + dsimp [Q, originCube] + simp + simpa [htoNat] using! hUdepth + have hRUscale : R ∈ descendantsAtScale U (-(j : ℤ)) := by + have hle : -(j : ℤ) ≤ U.scale := by omega + rw [descendantsAtScale_eq_descendantsAtDepth U hle] + have htoNat : Int.toNat (U.scale - (-(j : ℤ))) = j := by + rw [hUscale_zero] + simp + change R ∈ descendantsAtDepth U (Int.toNat (U.scale - (-(j : ℤ)))) + rw [htoNat] + exact hRUdepth + exact ⟨U, by simpa [Q] using hUscale, hRUscale⟩ + +theorem coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (a : TriadicCoeffFamily d) (hR : R ∈ descendantsAtScale Q k) : + coarseBMatrixNorm R a ≤ maxDescendantBMatrixNormAtScale Q k a := by + unfold maxDescendantBMatrixNormAtScale finsetSupReal + have hbdd : + BddAbove + ((fun R : TriadicCube d => coarseBMatrixNorm R a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun R : TriadicCube d => coarseBMatrixNorm R a)).bddAbove + exact le_csSup hbdd ⟨R, hR, rfl⟩ + +theorem coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (a : TriadicCoeffFamily d) (hR : R ∈ descendantsAtScale Q k) : + coarseSigmaStarInvMatrixNorm R a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale finsetSupReal + have hbdd : + BddAbove + ((fun R : TriadicCube d => coarseSigmaStarInvMatrixNorm R a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact + ((Set.toFinite _).image + (fun R : TriadicCube d => coarseSigmaStarInvMatrixNorm R a)).bddAbove + exact le_csSup hbdd ⟨R, hR, rfl⟩ + +/-- +For a fixed scale-zero cube, the small-scale q = 1 square-root tail is exactly +the local `LambdaSq` square-root series times the global scale factor +`3^{-sm}`. +-/ +theorem smallTail_tsum_weighted_scale_zero_B_sqrt_tail_eq_LambdaSq_rpow_half + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + (s : ℝ) (m : ℕ) (a : TriadicCoeffFamily d) (hs : 0 ≤ s) : + (∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + calc + (∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) + = + ∑' j : ℕ, + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (geometricWeight s 1 j * + Real.rpow + (maxDescendantBMatrixNormAtScale U (U.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + congr with j + have hscale : U.scale - (j : ℤ) = -(j : ℤ) := by + rw [hUscale] + ring + rw [smallTail_geometricWeight_one_nat_add_eq, hscale] + ring + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑' j : ℕ, + geometricWeight s 1 j * + Real.rpow + (maxDescendantBMatrixNormAtScale U (U.scale - (j : ℤ)) a) + (1 / 2 : ℝ) := by + rw [tsum_mul_left] + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + rw [LambdaSqFinite_rpow_q_div_two_eq_tsum U s 1 a + (by norm_num : (0 : ℝ) < 1) (by simpa using hs)] + +/-- +For a fixed scale-zero cube, the small-scale q = 1 lower inverse square-root +tail is exactly the local `lambdaSq` inverse square-root series times the +global scale factor `3^{-sm}`. +-/ +theorem smallTail_tsum_weighted_scale_zero_sigmaStarInv_sqrt_tail_eq_lambdaSq_rpow_neg_half + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + (s : ℝ) (m : ℕ) (a : TriadicCoeffFamily d) (hs : 0 ≤ s) : + (∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + calc + (∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) + = + ∑' j : ℕ, + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (geometricWeight s 1 j * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale U (U.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + congr with j + have hscale : U.scale - (j : ℤ) = -(j : ℤ) := by + rw [hUscale] + ring + rw [smallTail_geometricWeight_one_nat_add_eq, hscale] + ring + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑' j : ℕ, + geometricWeight s 1 j * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale U (U.scale - (j : ℤ)) a) + (1 / 2 : ℝ) := by + rw [tsum_mul_left] + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + rw [lambdaSqFinite_rpow_neg_q_div_two_eq_tsum U s 1 a + (by norm_num : (0 : ℝ) < 1) (by simpa using hs)] + +/-- The upper small-scale square-root tail after splitting at scale zero. -/ +noncomputable def upperSmallSqrtTail {d : ℕ} + (m : ℕ) (s : ℝ) (a : TriadicCoeffFamily d) : ℝ := + ∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + +/-- The lower inverse small-scale square-root tail after splitting at scale zero. -/ +noncomputable def lowerSmallSqrtTail {d : ℕ} + (m : ℕ) (s : ℝ) (a : TriadicCoeffFamily d) : ℝ := + ∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + +theorem summable_upperSmallSqrtTail_scale_zero + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + (m : ℕ) {s : ℝ} (hs : 0 < s) (a : TriadicCoeffFamily d) : + Summable (fun j : ℕ => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + have hbase := + summable_B_series_pointwiseCoeffField U a hs (by norm_num : (0 : ℝ) < 1) + refine (hbase.mul_left (Real.rpow (3 : ℝ) (-s * (m : ℝ)))).congr ?_ + intro j + have hscale : U.scale - (j : ℤ) = -(j : ℤ) := by + rw [hUscale] + ring + rw [smallTail_geometricWeight_one_nat_add_eq, hscale] + ring + +theorem summable_lowerSmallSqrtTail_scale_zero + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + (m : ℕ) {s : ℝ} (hs : 0 < s) (a : TriadicCoeffFamily d) : + Summable (fun j : ℕ => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + have hbase := + summable_sigmaStarInv_series_pointwiseCoeffField U a hs + (by norm_num : (0 : ℝ) < 1) + refine (hbase.mul_left (Real.rpow (3 : ℝ) (-s * (m : ℝ)))).congr ?_ + intro j + have hscale : U.scale - (j : ℤ) = -(j : ℤ) := by + rw [hUscale] + ring + rw [smallTail_geometricWeight_one_nat_add_eq, hscale] + ring + +/-- +At a fixed small depth, the upper square-root maximum below `cu_m` is bounded +by summing the corresponding local maxima over the scale-zero descendants of +`cu_m`. +-/ +theorem rpow_half_maxDescendantBMatrixNormAtScale_originCube_neg_nat_le_sum_scale_zero + {d : ℕ} [NeZero d] (m j : ℕ) (a : TriadicCoeffFamily d) : + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let T : ℝ := + ∑ U ∈ D, Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ) + have hT_nonneg : 0 ≤ T := by + refine Finset.sum_nonneg ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a) _ + have hglobal_le_sq : + maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a ≤ T ^ 2 := by + unfold maxDescendantBMatrixNormAtScale finsetSupReal + have hne : + ((fun R => coarseBMatrixNorm R a) '' + (↑(descendantsAtScale Q (-(j : ℤ))) : Set (TriadicCube d))).Nonempty := by + have hjQ : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + rcases descendantsAtScale_nonempty Q hjQ with ⟨R, hR⟩ + exact ⟨coarseBMatrixNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + rcases + smallTail_exists_scale_zero_ancestor_of_mem_descendantsAtScale_originCube_neg_nat + (m := m) (j := j) (R := R) (by simpa [Q] using hR) with + ⟨U, hU, hRU⟩ + have hlocal_nonneg : + 0 ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact maxDescendantBMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a + have hlocal_le : + coarseBMatrixNorm R a ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := + coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale a hRU + have hsqrt_le_T : + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ T := by + dsimp [T, D] + exact Finset.single_le_sum + (s := descendantsAtScale Q 0) + (f := fun V : TriadicCube d => + Real.rpow (maxDescendantBMatrixNormAtScale V (-(j : ℤ)) a) (1 / 2 : ℝ)) + (fun V hV => by + have hVscale : V.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hV + exact Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg V (by rw [hVscale]; omega) a) _) + (by simpa [Q] using hU) + calc + coarseBMatrixNorm R a ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := hlocal_le + _ = (Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hlocal_nonneg + _ ≤ T ^ 2 := pow_le_pow_left₀ + (Real.rpow_nonneg hlocal_nonneg _) hsqrt_le_T 2 + have hglobal_nonneg : + 0 ≤ maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a := by + exact maxDescendantBMatrixNormAtScale_nonneg Q (by dsimp [Q, originCube]; omega) a + have hsqrt_le : + Real.sqrt (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) ≤ + Real.sqrt (T ^ 2) := + Real.sqrt_le_sqrt hglobal_le_sq + rw [Real.sqrt_sq hT_nonneg] at hsqrt_le + simpa [Q, D, T, Real.sqrt_eq_rpow] using hsqrt_le + +/-- +At a fixed small depth, the lower inverse square-root maximum below `cu_m` is +bounded by summing the corresponding local maxima over the scale-zero +descendants of `cu_m`. +-/ +theorem rpow_half_maxDescendantSigmaStarInvMatrixNormAtScale_originCube_neg_nat_le_sum_scale_zero + {d : ℕ} [NeZero d] (m j : ℕ) (a : TriadicCoeffFamily d) : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let T : ℝ := + ∑ U ∈ D, + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) + have hT_nonneg : 0 ≤ T := by + refine Finset.sum_nonneg ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a) _ + have hglobal_le_sq : + maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a ≤ T ^ 2 := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale finsetSupReal + have hne : + ((fun R => coarseSigmaStarInvMatrixNorm R a) '' + (↑(descendantsAtScale Q (-(j : ℤ))) : Set (TriadicCube d))).Nonempty := by + have hjQ : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + rcases descendantsAtScale_nonempty Q hjQ with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvMatrixNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + rcases + smallTail_exists_scale_zero_ancestor_of_mem_descendantsAtScale_originCube_neg_nat + (m := m) (j := j) (R := R) (by simpa [Q] using hR) with + ⟨U, hU, hRU⟩ + have hlocal_nonneg : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg U + (by rw [hUscale]; omega) a + have hlocal_le : + coarseSigmaStarInvMatrixNorm R a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := + coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + a hRU + have hsqrt_le_T : + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ T := by + dsimp [T, D] + exact Finset.single_le_sum + (s := descendantsAtScale Q 0) + (f := fun V : TriadicCube d => + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale V (-(j : ℤ)) a) + (1 / 2 : ℝ)) + (fun V hV => by + have hVscale : V.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hV + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg V + (by rw [hVscale]; omega) a) _) + (by simpa [Q] using hU) + calc + coarseSigmaStarInvMatrixNorm R a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := hlocal_le + _ = + (Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hlocal_nonneg + _ ≤ T ^ 2 := pow_le_pow_left₀ + (Real.rpow_nonneg hlocal_nonneg _) hsqrt_le_T 2 + have hglobal_nonneg : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a := by + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (by dsimp [Q, originCube]; omega) a + have hsqrt_le : + Real.sqrt (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) ≤ + Real.sqrt (T ^ 2) := + Real.sqrt_le_sqrt hglobal_le_sq + rw [Real.sqrt_sq hT_nonneg] at hsqrt_le + simpa [Q, D, T, Real.sqrt_eq_rpow] using hsqrt_le + +/-- +At a fixed small depth, the upper square-root maximum below `cu_m` is bounded +by the scale-zero supremum of the corresponding local maxima. +-/ +theorem rpow_half_maxDescendantBMatrixNormAtScale_originCube_neg_nat_le_sup_scale_zero + {d : ℕ} [NeZero d] (m j : ℕ) (a : TriadicCoeffFamily d) : + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + (descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let T : ℝ := + D.sup' (descendantsAtScale_nonempty Q hQ0) + (fun U => + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ)) + have hT_nonneg : 0 ≤ T := by + rcases descendantsAtScale_nonempty Q hQ0 with ⟨U, hU⟩ + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact (Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a) _).trans + (Finset.le_sup' + (f := fun U => + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ)) + hU) + have hglobal_le_sq : + maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a ≤ T ^ 2 := by + unfold maxDescendantBMatrixNormAtScale finsetSupReal + have hne : + ((fun R => coarseBMatrixNorm R a) '' + (↑(descendantsAtScale Q (-(j : ℤ))) : Set (TriadicCube d))).Nonempty := by + have hjQ : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + rcases descendantsAtScale_nonempty Q hjQ with ⟨R, hR⟩ + exact ⟨coarseBMatrixNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + rcases + smallTail_exists_scale_zero_ancestor_of_mem_descendantsAtScale_originCube_neg_nat + (m := m) (j := j) (R := R) (by simpa [Q] using hR) with + ⟨U, hU, hRU⟩ + have hlocal_nonneg : + 0 ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact maxDescendantBMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a + have hlocal_le : + coarseBMatrixNorm R a ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := + coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale a hRU + have hsqrt_le_T : + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ T := by + dsimp [T, D] + exact Finset.le_sup' + (f := fun V : TriadicCube d => + Real.rpow (maxDescendantBMatrixNormAtScale V (-(j : ℤ)) a) (1 / 2 : ℝ)) + (by simpa [Q] using hU) + calc + coarseBMatrixNorm R a ≤ maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a := hlocal_le + _ = (Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hlocal_nonneg + _ ≤ T ^ 2 := pow_le_pow_left₀ + (Real.rpow_nonneg hlocal_nonneg _) hsqrt_le_T 2 + have hsqrt_le : + Real.sqrt (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) ≤ + Real.sqrt (T ^ 2) := + Real.sqrt_le_sqrt hglobal_le_sq + rw [Real.sqrt_sq hT_nonneg] at hsqrt_le + simpa [Q, D, T, Real.sqrt_eq_rpow] using hsqrt_le + +/-- +At a fixed small depth, the lower inverse square-root maximum below `cu_m` is +bounded by the scale-zero supremum of the corresponding local maxima. +-/ +theorem rpow_half_maxDescendantSigmaStarInvMatrixNormAtScale_originCube_neg_nat_le_sup_scale_zero + {d : ℕ} [NeZero d] (m j : ℕ) (a : TriadicCoeffFamily d) : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + (descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let T : ℝ := + D.sup' (descendantsAtScale_nonempty Q hQ0) + (fun U => + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) + have hT_nonneg : 0 ≤ T := by + rcases descendantsAtScale_nonempty Q hQ0 with ⟨U, hU⟩ + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a) + _).trans + (Finset.le_sup' + (f := fun U => + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) + hU) + have hglobal_le_sq : + maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a ≤ T ^ 2 := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale finsetSupReal + have hne : + ((fun R => coarseSigmaStarInvMatrixNorm R a) '' + (↑(descendantsAtScale Q (-(j : ℤ))) : Set (TriadicCube d))).Nonempty := by + have hjQ : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + rcases descendantsAtScale_nonempty Q hjQ with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvMatrixNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + rcases + smallTail_exists_scale_zero_ancestor_of_mem_descendantsAtScale_originCube_neg_nat + (m := m) (j := j) (R := R) (by simpa [Q] using hR) with + ⟨U, hU, hRU⟩ + have hlocal_nonneg : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg U + (by rw [hUscale]; omega) a + have hlocal_le : + coarseSigmaStarInvMatrixNorm R a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := + coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + a hRU + have hsqrt_le_T : + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ T := by + dsimp [T, D] + exact Finset.le_sup' + (f := fun V : TriadicCube d => + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale V (-(j : ℤ)) a) + (1 / 2 : ℝ)) + (by simpa [Q] using hU) + calc + coarseSigmaStarInvMatrixNorm R a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a := hlocal_le + _ = + (Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hlocal_nonneg + _ ≤ T ^ 2 := pow_le_pow_left₀ + (Real.rpow_nonneg hlocal_nonneg _) hsqrt_le_T 2 + have hsqrt_le : + Real.sqrt (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) ≤ + Real.sqrt (T ^ 2) := + Real.sqrt_le_sqrt hglobal_le_sq + rw [Real.sqrt_sq hT_nonneg] at hsqrt_le + simpa [Q, D, T, Real.sqrt_eq_rpow] using hsqrt_le + +theorem smallTail_scale_zero_weighted_B_sqrt_le_LambdaSq_rpow_half + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + {s : ℝ} (hs : 0 < s) (j : ℕ) (a : TriadicCoeffFamily d) : + geometricWeight s 1 j * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + let F : ℕ → ℝ := fun n => + geometricWeight s 1 (n + 0) * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(n : ℤ)) a) + (1 / 2 : ℝ) + have hsum : Summable F := by + simpa [F] using summable_upperSmallSqrtTail_scale_zero hUscale 0 hs a + have hnonneg : ∀ n : ℕ, 0 ≤ F n := by + intro n + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg U (by rw [hUscale]; omega) a) _) + have hsingle : F j ≤ ∑' n : ℕ, F n := by + simpa [F] using hsum.sum_le_tsum ({j} : Finset ℕ) (fun n _hn => hnonneg n) + calc + geometricWeight s 1 j * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) = F j := by simp [F] + _ ≤ ∑' n : ℕ, F n := hsingle + _ = Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + simpa [F] using + smallTail_tsum_weighted_scale_zero_B_sqrt_tail_eq_LambdaSq_rpow_half + (U := U) hUscale s 0 a hs.le + +theorem smallTail_scale_zero_weighted_sigmaStarInv_sqrt_le_lambdaSq_rpow_neg_half + {d : ℕ} [NeZero d] {U : TriadicCube d} (hUscale : U.scale = 0) + {s : ℝ} (hs : 0 < s) (j : ℕ) (a : TriadicCoeffFamily d) : + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + let F : ℕ → ℝ := fun n => + geometricWeight s 1 (n + 0) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(n : ℤ)) a) + (1 / 2 : ℝ) + have hsum : Summable F := by + simpa [F] using summable_lowerSmallSqrtTail_scale_zero hUscale 0 hs a + have hnonneg : ∀ n : ℕ, 0 ≤ F n := by + intro n + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg U + (by rw [hUscale]; omega) a) _) + have hsingle : F j ≤ ∑' n : ℕ, F n := by + simpa [F] using hsum.sum_le_tsum ({j} : Finset ℕ) (fun n _hn => hnonneg n) + calc + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) = F j := by simp [F] + _ ≤ ∑' n : ℕ, F n := hsingle + _ = Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + simpa [F] using + smallTail_tsum_weighted_scale_zero_sigmaStarInv_sqrt_tail_eq_lambdaSq_rpow_neg_half + (U := U) hUscale s 0 a hs.le + +/-- +Fixed-scale upper small-tail localization with no scale-zero cardinality loss: +the weighted operator-norm square-root term below `cu_m` is controlled by the +scale-zero supremum of `LambdaSq`. +-/ +theorem upperSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_LambdaSq_sup'_rpow_half + {d : ℕ} [NeZero d] (m j : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => LambdaSq U s (.finite 1) a)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let hD : D.Nonempty := descendantsAtScale_nonempty Q hQ0 + let localRoot : TriadicCube d → ℝ := fun U => + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ) + let rootUpper : TriadicCube d → ℝ := fun U => + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) + have hglobal : + Real.rpow (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) (1 / 2 : ℝ) ≤ + D.sup' hD localRoot := by + simpa [Q, D, hD, localRoot] using + rpow_half_maxDescendantBMatrixNormAtScale_originCube_neg_nat_le_sup_scale_zero + (d := d) m j a + have hwjm_nonneg : 0 ≤ geometricWeight s 1 (j + m) := + geometricWeight_nonneg _ (by simpa using hs.le) + have hwj_pos : 0 < geometricWeight s 1 j := + Homogenization.geometricWeight_pos j (by simpa using hs) + have hlocal_le : D.sup' hD (fun U => geometricWeight s 1 j * localRoot U) ≤ + D.sup' hD rootUpper := by + refine Finset.sup'_le hD _ ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + exact (smallTail_scale_zero_weighted_B_sqrt_le_LambdaSq_rpow_half + (U := U) hUscale hs j a).trans (Finset.le_sup' (f := rootUpper) hU) + have hroot_sup_le : + D.sup' hD rootUpper ≤ + Real.rpow (D.sup' hD (fun U => LambdaSq U s (.finite 1) a)) (1 / 2 : ℝ) := by + refine Finset.sup'_le hD _ ?_ + intro U hU + exact Real.rpow_le_rpow + (LambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)) + (Finset.le_sup' (f := fun V => LambdaSq V s (.finite 1) a) hU) + (by norm_num : 0 ≤ (1 / 2 : ℝ)) + calc + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) (1 / 2 : ℝ) + ≤ geometricWeight s 1 (j + m) * (D.sup' hD localRoot) := + mul_le_mul_of_nonneg_left hglobal hwjm_nonneg + _ = Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (D.sup' hD (fun U => geometricWeight s 1 j * localRoot U)) := by + rw [smallTail_geometricWeight_one_nat_add_eq] + rw [show Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + geometricWeight s 1 j * D.sup' hD localRoot = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (geometricWeight s 1 j * D.sup' hD localRoot) by ring] + rw [Finset.mul₀_sup' hwj_pos.le localRoot D hD] + _ ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) * D.sup' hD rootUpper := by + exact mul_le_mul_of_nonneg_left hlocal_le + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + _ ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (D.sup' hD (fun U => LambdaSq U s (.finite 1) a)) + (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hroot_sup_le + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + _ = Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => LambdaSq U s (.finite 1) a)) + (1 / 2 : ℝ) := by + simp [Q, D] + +/-- +Fixed-scale lower small-tail localization with no scale-zero cardinality loss: +the weighted inverse operator-norm square-root term below `cu_m` is controlled +by the scale-zero supremum of `lambdaSq⁻¹`. +-/ +theorem lowerSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_lambdaSq_inv_sup'_rpow_half + {d : ℕ} [NeZero d] (m j : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let hD : D.Nonempty := descendantsAtScale_nonempty Q hQ0 + let localRoot : TriadicCube d → ℝ := fun U => + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) + let rootLower : TriadicCube d → ℝ := fun U => + Real.rpow ((lambdaSq U s (.finite 1) a)⁻¹) (1 / 2 : ℝ) + have hglobal : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + D.sup' hD localRoot := by + simpa [Q, D, hD, localRoot] using + rpow_half_maxDescendantSigmaStarInvMatrixNormAtScale_originCube_neg_nat_le_sup_scale_zero + (d := d) m j a + have hwjm_nonneg : 0 ≤ geometricWeight s 1 (j + m) := + geometricWeight_nonneg _ (by simpa using hs.le) + have hwj_pos : 0 < geometricWeight s 1 j := + Homogenization.geometricWeight_pos j (by simpa using hs) + have hlocal_le : D.sup' hD (fun U => geometricWeight s 1 j * localRoot U) ≤ + D.sup' hD rootLower := by + refine Finset.sup'_le hD _ ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + have hterm := + smallTail_scale_zero_weighted_sigmaStarInv_sqrt_le_lambdaSq_rpow_neg_half + (U := U) hUscale hs j a + have hroot_eq : + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) = rootLower U := by + dsimp [rootLower] + rw [show (-1 / 2 : ℝ) = -(1 / 2 : ℝ) by ring, + Real.rpow_neg_eq_inv_rpow] + exact (hterm.trans_eq hroot_eq).trans (Finset.le_sup' (f := rootLower) hU) + have hroot_sup_le : + D.sup' hD rootLower ≤ + Real.rpow (D.sup' hD (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + refine Finset.sup'_le hD _ ?_ + intro U hU + exact Real.rpow_le_rpow + (inv_nonneg.mpr (lambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1))) + (Finset.le_sup' (f := fun V => (lambdaSq V s (.finite 1) a)⁻¹) hU) + (by norm_num : 0 ≤ (1 / 2 : ℝ)) + calc + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + ≤ geometricWeight s 1 (j + m) * (D.sup' hD localRoot) := + mul_le_mul_of_nonneg_left hglobal hwjm_nonneg + _ = Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (D.sup' hD (fun U => geometricWeight s 1 j * localRoot U)) := by + rw [smallTail_geometricWeight_one_nat_add_eq] + rw [show Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + geometricWeight s 1 j * D.sup' hD localRoot = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (geometricWeight s 1 j * D.sup' hD localRoot) by ring] + rw [Finset.mul₀_sup' hwj_pos.le localRoot D hD] + _ ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) * D.sup' hD rootLower := by + exact mul_le_mul_of_nonneg_left hlocal_le + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + _ ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (D.sup' hD (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hroot_sup_le + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + _ = Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + simp [Q, D] + +/-- +Squared fixed-scale upper small-tail localization with no scale-zero +cardinality loss. +-/ +theorem upperSmallSqrtTailTerm_sq_le_scale_factor_mul_scale_zero_LambdaSq_sup' + {d : ℕ} [NeZero d] (m j : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + (geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => LambdaSq U s (.finite 1) a)) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let hD : D.Nonempty := descendantsAtScale_nonempty Q hQ0 + let r : ℝ := Real.rpow (3 : ℝ) (-s * (m : ℝ)) + let S : ℝ := D.sup' hD (fun U => LambdaSq U s (.finite 1) a) + let T : ℝ := + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) (1 / 2 : ℝ) + have hT_nonneg : 0 ≤ T := by + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg Q (by dsimp [Q, originCube]; omega) a) + _) + have hS_nonneg : 0 ≤ S := by + rcases hD with ⟨U, hU⟩ + exact (LambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)).trans + (Finset.le_sup' (s := D) (f := fun U => LambdaSq U s (.finite 1) a) hU) + have hr_nonneg : 0 ≤ r := Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hr_le_one : r ≤ 1 := by + have hm_nonneg : 0 ≤ (m : ℝ) := by exact_mod_cast Nat.zero_le m + have hexp_nonpos : -s * (m : ℝ) ≤ 0 := + mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hs.le) hm_nonneg + exact Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) hexp_nonpos + have hterm : + T ≤ r * Real.rpow S (1 / 2 : ℝ) := by + simpa [Q, D, hD, r, S, T] using + upperSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_LambdaSq_sup'_rpow_half + (d := d) m j hs a + have hsq := pow_le_pow_left₀ hT_nonneg hterm 2 + calc + (geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantBMatrixNormAtScale (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 = T ^ 2 := by simp [T, Q] + _ ≤ (r * Real.rpow S (1 / 2 : ℝ)) ^ 2 := hsq + _ = r ^ 2 * S := by + rw [mul_pow, Homogenization.sq_rpow_half_eq_self_of_nonneg hS_nonneg] + _ ≤ r * S := by + have hr_sq_le : r ^ 2 ≤ r := by + calc + r ^ 2 = r * r := by ring + _ ≤ r * 1 := mul_le_mul_of_nonneg_left hr_le_one hr_nonneg + _ = r := by ring + exact mul_le_mul_of_nonneg_right hr_sq_le hS_nonneg + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => LambdaSq U s (.finite 1) a)) := by + simp [Q, D, r, S] + +/-- +Squared fixed-scale lower small-tail localization with no scale-zero +cardinality loss. +-/ +theorem lowerSmallSqrtTailTerm_sq_le_scale_factor_mul_scale_zero_lambdaSq_inv_sup' + {d : ℕ} [NeZero d] (m j : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + (geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + have hQ0 : (0 : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast Nat.zero_le m + let hD : D.Nonempty := descendantsAtScale_nonempty Q hQ0 + let r : ℝ := Real.rpow (3 : ℝ) (-s * (m : ℝ)) + let S : ℝ := D.sup' hD (fun U => (lambdaSq U s (.finite 1) a)⁻¹) + let T : ℝ := + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + have hT_nonneg : 0 ≤ T := by + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (by dsimp [Q, originCube]; omega) a) _) + have hS_nonneg : 0 ≤ S := by + rcases hD with ⟨U, hU⟩ + exact (inv_nonneg.mpr + (lambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1))).trans + (Finset.le_sup' (s := D) + (f := fun U => (lambdaSq U s (.finite 1) a)⁻¹) hU) + have hr_nonneg : 0 ≤ r := Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hr_le_one : r ≤ 1 := by + have hm_nonneg : 0 ≤ (m : ℝ) := by exact_mod_cast Nat.zero_le m + have hexp_nonpos : -s * (m : ℝ) ≤ 0 := + mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hs.le) hm_nonneg + exact Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) hexp_nonpos + have hterm : + T ≤ r * Real.rpow S (1 / 2 : ℝ) := by + simpa [Q, D, hD, r, S, T] using + lowerSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_lambdaSq_inv_sup'_rpow_half + (d := d) m j hs a + have hsq := pow_le_pow_left₀ hT_nonneg hterm 2 + calc + (geometricWeight s 1 (j + m) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 = T ^ 2 := by simp [T, Q] + _ ≤ (r * Real.rpow S (1 / 2 : ℝ)) ^ 2 := hsq + _ = r ^ 2 * S := by + rw [mul_pow, Homogenization.sq_rpow_half_eq_self_of_nonneg hS_nonneg] + _ ≤ r * S := by + have hr_sq_le : r ^ 2 ≤ r := by + calc + r ^ 2 = r * r := by ring + _ ≤ r * 1 := mul_le_mul_of_nonneg_left hr_le_one hr_nonneg + _ = r := by ring + exact mul_le_mul_of_nonneg_right hr_sq_le hS_nonneg + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (lambdaSq U s (.finite 1) a)⁻¹)) := by + simp [Q, D, r, S] + +/-- +The upper small-scale square-root tail is bounded by the sum of the local +scale-zero q = 1 square-root tails, hence by the corresponding scale-zero +ellipticity square roots with the global factor `3^{-sm}`. +-/ +theorem upperSmallSqrtTail_le_scale_factor_mul_sum_scale_zero_LambdaSq_rpow_half + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + upperSmallSqrtTail (d := d) m s a ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let f : ℕ → ℝ := fun j => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) (1 / 2 : ℝ) + let g : TriadicCube d → ℕ → ℝ := fun U j => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) (1 / 2 : ℝ) + have hgSummable : Summable (fun j : ℕ => ∑ U ∈ D, g U j) := by + exact summable_sum (s := D) (fun U hU => by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g, D, Q] using summable_upperSmallSqrtTail_scale_zero hUscale m hs a) + have hterm : ∀ j : ℕ, f j ≤ ∑ U ∈ D, g U j := by + intro j + have hw_nonneg : 0 ≤ geometricWeight s 1 (j + m) := + geometricWeight_nonneg _ (by simpa using hs.le) + have hsqrt := + rpow_half_maxDescendantBMatrixNormAtScale_originCube_neg_nat_le_sum_scale_zero + (d := d) m j a + calc + f j ≤ + geometricWeight s 1 (j + m) * + (∑ U ∈ D, + Real.rpow (maxDescendantBMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left (by simpa [Q, D] using hsqrt) hw_nonneg + _ = ∑ U ∈ D, g U j := by + simp [g, Finset.mul_sum] + have hf_nonneg : ∀ j : ℕ, 0 ≤ f j := by + intro j + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg Q (by dsimp [Q, originCube]; omega) a) _) + have hfSummable : Summable f := + Summable.of_nonneg_of_le hf_nonneg hterm hgSummable + calc + upperSmallSqrtTail (d := d) m s a = ∑' j : ℕ, f j := by + simp [upperSmallSqrtTail, f, Q] + _ ≤ ∑' j : ℕ, ∑ U ∈ D, g U j := + Summable.tsum_le_tsum hterm hfSummable hgSummable + _ = ∑ U ∈ D, ∑' j : ℕ, g U j := + Summable.tsum_finsetSum (s := D) (fun U hU => by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g, D, Q] using summable_upperSmallSqrtTail_scale_zero hUscale m hs a) + _ = + ∑ U ∈ D, + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + refine Finset.sum_congr rfl ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g] using + smallTail_tsum_weighted_scale_zero_B_sqrt_tail_eq_LambdaSq_rpow_half + (U := U) hUscale s m a hs.le + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) := by + simp [D, Q, Finset.mul_sum] + +/-- +The lower inverse small-scale square-root tail is bounded by the sum of the +local scale-zero q = 1 inverse square-root tails, hence by the corresponding +scale-zero inverse ellipticity square roots with the global factor `3^{-sm}`. +-/ +theorem lowerSmallSqrtTail_le_scale_factor_mul_sum_scale_zero_lambdaSq_rpow_neg_half + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + lowerSmallSqrtTail (d := d) m s a ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let f : ℕ → ℝ := fun j => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + let g : TriadicCube d → ℕ → ℝ := fun U j => + geometricWeight s 1 (j + m) * + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ) + have hgSummable : Summable (fun j : ℕ => ∑ U ∈ D, g U j) := by + exact summable_sum (s := D) (fun U hU => by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g, D, Q] using summable_lowerSmallSqrtTail_scale_zero hUscale m hs a) + have hterm : ∀ j : ℕ, f j ≤ ∑ U ∈ D, g U j := by + intro j + have hw_nonneg : 0 ≤ geometricWeight s 1 (j + m) := + geometricWeight_nonneg _ (by simpa using hs.le) + have hsqrt := + rpow_half_maxDescendantSigmaStarInvMatrixNormAtScale_originCube_neg_nat_le_sum_scale_zero + (d := d) m j a + calc + f j ≤ + geometricWeight s 1 (j + m) * + (∑ U ∈ D, + Real.rpow (maxDescendantSigmaStarInvMatrixNormAtScale U (-(j : ℤ)) a) + (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left (by simpa [Q, D] using hsqrt) hw_nonneg + _ = ∑ U ∈ D, g U j := by + simp [g, Finset.mul_sum] + have hf_nonneg : ∀ j : ℕ, 0 ≤ f j := by + intro j + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (by dsimp [Q, originCube]; omega) a) _) + have hfSummable : Summable f := + Summable.of_nonneg_of_le hf_nonneg hterm hgSummable + calc + lowerSmallSqrtTail (d := d) m s a = ∑' j : ℕ, f j := by + simp [lowerSmallSqrtTail, f, Q] + _ ≤ ∑' j : ℕ, ∑ U ∈ D, g U j := + Summable.tsum_le_tsum hterm hfSummable hgSummable + _ = ∑ U ∈ D, ∑' j : ℕ, g U j := + Summable.tsum_finsetSum (s := D) (fun U hU => by + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g, D, Q] using summable_lowerSmallSqrtTail_scale_zero hUscale m hs a) + _ = + ∑ U ∈ D, + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + refine Finset.sum_congr rfl ?_ + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [g] using + smallTail_tsum_weighted_scale_zero_sigmaStarInv_sqrt_tail_eq_lambdaSq_rpow_neg_half + (U := U) hUscale s m a hs.le + _ = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) := by + simp [D, Q, Finset.mul_sum] + +/-- Squared upper small-tail bound using scale-zero `LambdaSq` values. -/ +theorem upperSmallSqrtTail_sq_le_scale_factor_sq_mul_card_sum_scale_zero_LambdaSq + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + upperSmallSqrtTail (d := d) m s a ^ 2 ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + LambdaSq U s (.finite 1) a := by + classical + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let r : ℝ := Real.rpow (3 : ℝ) (-s * (m : ℝ)) + let sqrtUpper : TriadicCube d → ℝ := fun U => + Real.rpow (LambdaSq U s (.finite 1) a) (1 / 2 : ℝ) + have htail_nonneg : + 0 ≤ upperSmallSqrtTail (d := d) m s a := by + unfold upperSmallSqrtTail + refine tsum_nonneg ?_ + intro j + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg (originCube d (m : ℤ)) + (by simp [originCube]) a) _) + have htail_le : + upperSmallSqrtTail (d := d) m s a ≤ + r * ∑ U ∈ D, sqrtUpper U := by + simpa [D, r, sqrtUpper] using + upperSmallSqrtTail_le_scale_factor_mul_sum_scale_zero_LambdaSq_rpow_half + (d := d) m hs a + have hsq_tail := pow_le_pow_left₀ htail_nonneg htail_le 2 + have hsum_sq : + (∑ U ∈ D, sqrtUpper U) ^ 2 ≤ + (D.card : ℝ) * ∑ U ∈ D, LambdaSq U s (.finite 1) a := by + have hcs : + (∑ U ∈ D, sqrtUpper U) ^ 2 ≤ + (D.card : ℝ) * ∑ U ∈ D, sqrtUpper U ^ 2 := + sq_sum_le_card_mul_sum_sq (s := D) (f := sqrtUpper) + have hsquares : + (∑ U ∈ D, sqrtUpper U ^ 2) = + ∑ U ∈ D, LambdaSq U s (.finite 1) a := by + refine Finset.sum_congr rfl ?_ + intro U _hU + exact Homogenization.sq_rpow_half_eq_self_of_nonneg + (LambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)) + simpa [hsquares] using hcs + calc + upperSmallSqrtTail (d := d) m s a ^ 2 + ≤ (r * ∑ U ∈ D, sqrtUpper U) ^ 2 := hsq_tail + _ = r ^ 2 * (∑ U ∈ D, sqrtUpper U) ^ 2 := by ring + _ ≤ r ^ 2 * ((D.card : ℝ) * ∑ U ∈ D, LambdaSq U s (.finite 1) a) := by + exact mul_le_mul_of_nonneg_left hsum_sq (sq_nonneg r) + _ = + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + LambdaSq U s (.finite 1) a := by + simp [D, r] + ring + +/-- Squared lower inverse small-tail bound using scale-zero `lambdaSq` values. -/ +theorem lowerSmallSqrtTail_sq_le_scale_factor_sq_mul_card_sum_scale_zero_lambdaSq_inv + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : TriadicCoeffFamily d) : + lowerSmallSqrtTail (d := d) m s a ^ 2 ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + (lambdaSq U s (.finite 1) a)⁻¹ := by + classical + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let r : ℝ := Real.rpow (3 : ℝ) (-s * (m : ℝ)) + let sqrtLower : TriadicCube d → ℝ := fun U => + Real.rpow (lambdaSq U s (.finite 1) a) (-1 / 2 : ℝ) + have htail_nonneg : + 0 ≤ lowerSmallSqrtTail (d := d) m s a := by + unfold lowerSmallSqrtTail + refine tsum_nonneg ?_ + intro j + exact mul_nonneg + (geometricWeight_nonneg _ (by simpa using hs.le)) + (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg (originCube d (m : ℤ)) + (by simp [originCube]) a) _) + have htail_le : + lowerSmallSqrtTail (d := d) m s a ≤ + r * ∑ U ∈ D, sqrtLower U := by + simpa [D, r, sqrtLower] using + lowerSmallSqrtTail_le_scale_factor_mul_sum_scale_zero_lambdaSq_rpow_neg_half + (d := d) m hs a + have hsq_tail := pow_le_pow_left₀ htail_nonneg htail_le 2 + have hsum_sq : + (∑ U ∈ D, sqrtLower U) ^ 2 ≤ + (D.card : ℝ) * ∑ U ∈ D, (lambdaSq U s (.finite 1) a)⁻¹ := by + have hcs : + (∑ U ∈ D, sqrtLower U) ^ 2 ≤ + (D.card : ℝ) * ∑ U ∈ D, sqrtLower U ^ 2 := + sq_sum_le_card_mul_sum_sq (s := D) (f := sqrtLower) + have hsquares : + (∑ U ∈ D, sqrtLower U ^ 2) = + ∑ U ∈ D, (lambdaSq U s (.finite 1) a)⁻¹ := by + refine Finset.sum_congr rfl ?_ + intro U _hU + exact Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg + (lambdaSq_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)) + simpa [hsquares] using hcs + calc + lowerSmallSqrtTail (d := d) m s a ^ 2 + ≤ (r * ∑ U ∈ D, sqrtLower U) ^ 2 := hsq_tail + _ = r ^ 2 * (∑ U ∈ D, sqrtLower U) ^ 2 := by ring + _ ≤ r ^ 2 * ((D.card : ℝ) * ∑ U ∈ D, (lambdaSq U s (.finite 1) a)⁻¹) := by + exact mul_le_mul_of_nonneg_left hsum_sq (sq_nonneg r) + _ = + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ)) * + ∑ U ∈ descendantsAtScale (originCube d (m : ℤ)) 0, + (lambdaSq U s (.finite 1) a)⁻¹ := by + simp [D, r] + ring + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Infinity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Infinity.lean new file mode 100644 index 0000000000..829e0dbfdf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Infinity.lean @@ -0,0 +1,336 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.SmallTail + +/-! # Infinity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Infinite-Depth Chapter 2.5 Multiscale Ellipticity + +This file proves the `q = infinity` boundedness, positivity, monotonicity, and +one-cube comparison lemmas. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + + +theorem LambdaSqInfinity_valueSet_bddAbove {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 ≤ s) : + BddAbove + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ * + (a.coeffOn Q).Lam ^ 2 + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine ⟨C, ?_⟩ + rintro M ⟨n, rfl⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hBound : + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := by + calc + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + Homogenization.maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) A := by + simpa [A] using + maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + (a := a) Q hk + _ ≤ C := by + simpa [A, C] using + Homogenization.maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) hEll hData n + have hMaxNonneg : + 0 ≤ maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + maxDescendantBMatrixNormAtScale_nonneg Q hk a + have hWeight : Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) ≤ 1 := + infinityWeight_le_one hs n + have hMul : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 1 * C := + mul_le_mul hWeight hBound hMaxNonneg zero_le_one + simpa using hMul + +theorem lambdaSqInfinity_denominator_valueSet_bddAbove {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 ≤ s) : + BddAbove + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine ⟨C, ?_⟩ + rintro M ⟨n, rfl⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hBound : + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := by + calc + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + Homogenization.maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) A := by + simpa [A] using + maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + (a := a) Q hk + _ ≤ C := by + simpa [A, C] using + Homogenization.maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) hEll hData n + have hMaxNonneg : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hk a + have hWeight : Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) ≤ 1 := + infinityWeight_le_one hs n + have hMul : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 1 * C := + mul_le_mul hWeight hBound hMaxNonneg zero_le_one + simpa using hMul + +theorem oneCube_b_le_LambdaSq_infinity {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + coarseBMatrixNorm Q a ≤ LambdaSq Q s .infinity a := by + have hbdd := LambdaSqInfinity_valueSet_bddAbove Q a hs.le + have hmem : + coarseBMatrixNorm Q a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + refine ⟨0, ?_⟩ + simp [maxDescendantBMatrixNormAtScale_self] + simpa [LambdaSq, LambdaSqInfinity] using le_csSup hbdd hmem + +theorem LambdaSq_infinity_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + 0 < LambdaSq Q s .infinity a := + lt_of_lt_of_le (coarseBMatrixNorm_pos Q a) + (oneCube_b_le_LambdaSq_infinity Q a hs) + +theorem LambdaSq_infinity_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + 0 ≤ LambdaSq Q s .infinity a := + (LambdaSq_infinity_pos Q a hs).le + +theorem lambdaSqInfinity_denominator_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + 0 < + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + have hbdd := lambdaSqInfinity_denominator_valueSet_bddAbove Q a hs.le + have hmem : + coarseSigmaStarInvMatrixNorm Q a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + refine ⟨0, ?_⟩ + simp [maxDescendantSigmaStarInvMatrixNormAtScale_self] + exact lt_of_lt_of_le (coarseSigmaStarInvMatrixNorm_pos Q a) (le_csSup hbdd hmem) + +theorem lambdaSq_infinity_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + 0 < lambdaSq Q s .infinity a := by + unfold lambdaSq lambdaSqInfinity + exact inv_pos.mpr (lambdaSqInfinity_denominator_pos Q a hs) + +theorem lambdaSq_infinity_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + 0 ≤ lambdaSq Q s .infinity a := + (lambdaSq_infinity_pos Q a hs).le + +theorem lambdaSq_infinity_le_oneCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + lambdaSq Q s .infinity a ≤ (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := by + let S : ℝ := + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } + have hSpos : 0 < S := by + simpa [S] using lambdaSqInfinity_denominator_pos Q a hs + have hSigpos : 0 < coarseSigmaStarInvMatrixNorm Q a := + coarseSigmaStarInvMatrixNorm_pos Q a + have hbdd := lambdaSqInfinity_denominator_valueSet_bddAbove Q a hs.le + have hmem : + coarseSigmaStarInvMatrixNorm Q a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + refine ⟨0, ?_⟩ + simp [maxDescendantSigmaStarInvMatrixNormAtScale_self] + have hle : coarseSigmaStarInvMatrixNorm Q a ≤ S := by + simpa [S] using le_csSup hbdd hmem + have hconverted : S⁻¹ ≤ (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := + (inv_le_inv₀ hSpos hSigpos).2 hle + simpa [S, lambdaSq, lambdaSqInfinity] using hconverted + +theorem LambdaSq_infinity_antitone {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s : ℝ} + (ht : 0 < t) (hts : t < s) : + LambdaSq Q s .infinity a ≤ LambdaSq Q t .infinity a := by + have hbdd_t := LambdaSqInfinity_valueSet_bddAbove Q a ht.le + have hne_s : + ({ M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a }).Nonempty := + ⟨_, ⟨0, rfl⟩⟩ + unfold LambdaSq LambdaSqInfinity + refine csSup_le hne_s ?_ + rintro M ⟨n, rfl⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hmax : + 0 ≤ maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + maxDescendantBMatrixNormAtScale_nonneg Q hk a + have hterm : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + Real.rpow (3 : ℝ) (-2 * t * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + mul_le_mul_of_nonneg_right (infinityWeight_le_of_le hts.le n) hmax + exact hterm.trans + (le_csSup hbdd_t ⟨n, rfl⟩) + +theorem lambdaSqInfinity_denominator_antitone {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s : ℝ} + (ht : 0 < t) (hts : t < s) : + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } ≤ + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * t * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + have hbdd_t := lambdaSqInfinity_denominator_valueSet_bddAbove Q a ht.le + have hne_s : + ({ M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a }).Nonempty := + ⟨_, ⟨0, rfl⟩⟩ + refine csSup_le hne_s ?_ + rintro M ⟨n, rfl⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hmax : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hk a + have hterm : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + Real.rpow (3 : ℝ) (-2 * t * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := + mul_le_mul_of_nonneg_right (infinityWeight_le_of_le hts.le n) hmax + exact hterm.trans + (le_csSup hbdd_t ⟨n, rfl⟩) + +theorem lambdaSq_infinity_mono {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s : ℝ} + (ht : 0 < t) (hts : t < s) : + lambdaSq Q t .infinity a ≤ lambdaSq Q s .infinity a := by + let St : ℝ := + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * t * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } + let Ss : ℝ := + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } + have hden : Ss ≤ St := by + simpa [Ss, St] using lambdaSqInfinity_denominator_antitone Q a ht hts + have hStpos : 0 < St := by + simpa [St] using lambdaSqInfinity_denominator_pos Q a ht + have hspos : 0 < s := lt_trans ht hts + have hSspos : 0 < Ss := by + simpa [Ss] using lambdaSqInfinity_denominator_pos Q a hspos + have hconverted : St⁻¹ ≤ Ss⁻¹ := + (inv_le_inv₀ hStpos hSspos).2 hden + simpa [St, Ss, lambdaSq, lambdaSqInfinity] using hconverted + +theorem oneCube_sigmaStarInv_le_lambdaSq_infinity_inv {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + (hs : 0 < s) : + coarseSigmaStarInvMatrixNorm Q a ≤ (lambdaSq Q s .infinity a)⁻¹ := by + have hbdd := lambdaSqInfinity_denominator_valueSet_bddAbove Q a hs.le + have hmem : + coarseSigmaStarInvMatrixNorm Q a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := by + refine ⟨0, ?_⟩ + simp [maxDescendantSigmaStarInvMatrixNormAtScale_self] + have hle : + coarseSigmaStarInvMatrixNorm Q a ≤ + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := + le_csSup hbdd hmem + simpa [lambdaSq, lambdaSqInfinity] using hle + + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Localization.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Localization.lean new file mode 100644 index 0000000000..871367aade --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Localization.lean @@ -0,0 +1,910 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Infinity + +/-! # Localization -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Localization for Chapter 2.5 Multiscale Ellipticity + +This file proves descendant localization bounds and the unified finite/infinite +public order lemmas, including the theta-ratio controls. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + +private theorem multiscaleDescendantWeight_nonneg {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (s : ℝ) : + 0 ≤ multiscaleDescendantWeight Q k s := by + unfold multiscaleDescendantWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem descendant_LambdaSq_infinity_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) : + LambdaSq R s .infinity a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s .infinity a := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + let h : ℕ := Int.toNat (Q.scale - k) + have hh_int : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hW : + multiscaleDescendantWeight Q k s = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + unfold multiscaleDescendantWeight + have hh_real : (((Q.scale - k : ℤ) : ℝ)) = (h : ℝ) := by + simpa using congrArg (fun z : ℤ => (z : ℝ)) hh_int.symm + rw [hh_real] + have hbddQ := LambdaSqInfinity_valueSet_bddAbove Q a hs.le + have hneR : + ({ M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a }).Nonempty := + ⟨_, ⟨0, rfl⟩⟩ + change + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a } ≤ + multiscaleDescendantWeight Q k s * + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } + refine csSup_le hneR ?_ + rintro M ⟨n, rfl⟩ + let l : ℤ := R.scale - (n : ℤ) + have hl : l ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hscale : + Q.scale - ((n + h : ℕ) : ℤ) = l := by + dsimp [l] + rw [hRscale] + rw [hh_int] + ring + have hmaxle : + maxDescendantBMatrixNormAtScale R l a ≤ + maxDescendantBMatrixNormAtScale Q l a := + maxDescendantBMatrixNormAtScale_le_of_mem_descendantsAtScale a hR hl + have htermle : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale R l a ≤ + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q l a := + mul_le_mul_of_nonneg_left hmaxle (infinityWeight_nonneg s n) + have hmemQ : + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := + ⟨n + h, rfl⟩ + have hQle : + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a ≤ + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := + le_csSup hbddQ hmemQ + have hWnonneg : 0 ≤ multiscaleDescendantWeight Q k s := + multiscaleDescendantWeight_nonneg Q k s + have hscaled := + mul_le_mul_of_nonneg_left hQle hWnonneg + calc + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale R l a ≤ + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q l a := htermle + _ = + multiscaleDescendantWeight Q k s * + (Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) := by + rw [hW, infinityWeight_shift s h n, hscale] + ring + _ ≤ + multiscaleDescendantWeight Q k s * + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := hscaled + +theorem descendant_lambdaSq_infinity_inv_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) : + (lambdaSq R s .infinity a)⁻¹ ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s .infinity a)⁻¹ := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + let h : ℕ := Int.toNat (Q.scale - k) + have hh_int : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hW : + multiscaleDescendantWeight Q k s = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + unfold multiscaleDescendantWeight + have hh_real : (((Q.scale - k : ℤ) : ℝ)) = (h : ℝ) := by + simpa using congrArg (fun z : ℤ => (z : ℝ)) hh_int.symm + rw [hh_real] + have hbddQ := lambdaSqInfinity_denominator_valueSet_bddAbove Q a hs.le + have hneR : + ({ M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale R (R.scale - (n : ℤ)) a }).Nonempty := + ⟨_, ⟨0, rfl⟩⟩ + simp only [lambdaSq, lambdaSqInfinity, inv_inv] + change + (sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale R (R.scale - (n : ℤ)) a }) ≤ + multiscaleDescendantWeight Q k s * + (sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a }) + refine csSup_le hneR ?_ + rintro M ⟨n, rfl⟩ + let l : ℤ := R.scale - (n : ℤ) + have hl : l ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hscale : + Q.scale - ((n + h : ℕ) : ℤ) = l := by + dsimp [l] + rw [hRscale] + rw [hh_int] + ring + have hmaxle : + maxDescendantSigmaStarInvMatrixNormAtScale R l a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q l a := + maxDescendantSigmaStarInvMatrixNormAtScale_le_of_mem_descendantsAtScale a hR hl + have htermle : + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale R l a ≤ + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q l a := + mul_le_mul_of_nonneg_left hmaxle (infinityWeight_nonneg s n) + have hmemQ : + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a ∈ + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := + ⟨n + h, rfl⟩ + have hQle : + Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a ≤ + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := + le_csSup hbddQ hmemQ + have hWnonneg : 0 ≤ multiscaleDescendantWeight Q k s := + multiscaleDescendantWeight_nonneg Q k s + have hscaled := + mul_le_mul_of_nonneg_left hQle hWnonneg + calc + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale R l a ≤ + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q l a := htermle + _ = + multiscaleDescendantWeight Q k s * + (Real.rpow (3 : ℝ) (-2 * s * ((n + h : ℕ) : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) := by + rw [hW, infinityWeight_shift s h n, hscale] + ring + _ ≤ + multiscaleDescendantWeight Q k s * + sSup + { M : ℝ | ∃ n : ℕ, + M = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a } := hscaled + +private theorem tsum_shift_le_mul_tsum_of_nonneg_le + {fQ fR : ℕ → ℝ} {factor : ℝ} (h : ℕ) + (hsum : Summable fQ) + (hQnonneg : ∀ n : ℕ, 0 ≤ fQ n) + (hRnonneg : ∀ n : ℕ, 0 ≤ fR n) + (hterm : ∀ n : ℕ, fR n ≤ factor * fQ (n + h)) + (hfactorNonneg : 0 ≤ factor) : + (∑' n : ℕ, fR n) ≤ factor * ∑' n : ℕ, fQ n := by + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := + (summable_nat_add_iff h).2 hsum + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := + Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + (∑' n : ℕ, fR n) ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := + mul_le_mul_of_nonneg_left htailLe hfactorNonneg + +private theorem rpow_geometric_shift_factor_two_div + {s q : ℝ} (h : ℕ) (hqpos : 0 < q) : + Real.rpow (Real.rpow (3 : ℝ) (s * q * (h : ℝ))) (2 / q) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + have hmul : (s * q * (h : ℝ)) * (2 / q) = 2 * s * (h : ℝ) := by + field_simp [hqpos.ne'] + calc + Real.rpow (Real.rpow (3 : ℝ) (s * q * (h : ℝ))) (2 / q) = + Real.rpow (3 : ℝ) ((s * q * (h : ℝ)) * (2 / q)) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (s * q * (h : ℝ)) (2 / q)).symm + _ = Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by simp [hmul] + +theorem descendant_LambdaSq_finite_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s q : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (hq : 1 ≤ q) : + LambdaSq R s (.finite q) a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s (.finite q) a := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + let h : ℕ := Int.toNat (Q.scale - k) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) + have hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + exact summable_B_series_pointwiseCoeffField Q a hs hqpos + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hqpos.le) + · refine Real.rpow_nonneg ?_ _ + exact maxDescendantBMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantBMatrixNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantBMatrixNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2) ≤ + Real.rpow + (maxDescendantBMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantBMatrixNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + have hweight : + geometricWeight s q n = factor * geometricWeight s q (n + h) := by + simpa [factor, geometricWeight_eq_old] using + Homogenization.geometricWeight_shift (s := s) (q := q) h n + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantBMatrixNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + dsimp [fR] + rw [hweight] + ring + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow + (maxDescendantBMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (n + h) (mul_nonneg hs.le hqpos.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hqpos.le) + · refine Real.rpow_nonneg ?_ _ + exact maxDescendantBMatrixNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hbase : + Real.rpow (LambdaSq R s (.finite q) a) (q / 2) ≤ + factor * Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + calc + Real.rpow (LambdaSq R s (.finite q) a) (q / 2) = + ∑' n : ℕ, fR n := by + simpa [fR] using + LambdaSqFinite_rpow_q_div_two_eq_tsum R s q a hqpos + (mul_nonneg hs.le hqpos.le) + _ ≤ factor * ∑' n : ℕ, fQ n := + tsum_shift_le_mul_tsum_of_nonneg_le h + (by simpa [fQ] using hsum) hQnonneg hRnonneg hterm hfactorNonneg + _ = factor * Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (LambdaSqFinite_rpow_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le)).symm + have hfactorEq : + Real.rpow factor (2 / q) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + simpa [factor] using rpow_geometric_shift_factor_two_div h hqpos + calc + LambdaSq R s (.finite q) a ≤ + Real.rpow factor (2 / q) * LambdaSq Q s (.finite q) a := by + exact Homogenization.le_rpow_factor_mul_of_rpow_q_div_two_le hqpos + (LambdaSq_finite_nonneg R a hs hq) + (LambdaSq_finite_nonneg Q a hs hq) + hfactorNonneg hbase + _ = multiscaleDescendantWeight Q k s * LambdaSq Q s (.finite q) a := by + rw [hfactorEq, old_descendantWeight_eq_multiscaleDescendantWeight Q hk s] + +theorem descendant_lambdaSq_finite_inv_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s q : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (hq : 1 ≤ q) : + (lambdaSq R s (.finite q) a)⁻¹ ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s (.finite q) a)⁻¹ := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + let h : ℕ := Int.toNat (Q.scale - k) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2) + have hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + exact summable_sigmaStarInv_series_pointwiseCoeffField Q a hs hqpos + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hqpos.le) + · refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantSigmaStarInvMatrixNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantSigmaStarInvMatrixNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2) ≤ + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + have hweight : + geometricWeight s q n = factor * geometricWeight s q (n + h) := by + simpa [factor, geometricWeight_eq_old] using + Homogenization.geometricWeight_shift (s := s) (q := q) h n + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale R + (R.scale - (n : ℤ)) a) (q / 2)) := by + dsimp [fR] + rw [hweight] + ring + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (n + h) (mul_nonneg hs.le hqpos.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hqpos.le) + · refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvMatrixNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hbase : + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) ≤ + factor * Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + calc + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) = + ∑' n : ℕ, fR n := by + simpa [fR] using + lambdaSqFinite_rpow_neg_q_div_two_eq_tsum R s q a hqpos + (mul_nonneg hs.le hqpos.le) + _ ≤ factor * ∑' n : ℕ, fQ n := + tsum_shift_le_mul_tsum_of_nonneg_le h + (by simpa [fQ] using hsum) hQnonneg hRnonneg hterm hfactorNonneg + _ = factor * Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (lambdaSqFinite_rpow_neg_q_div_two_eq_tsum Q s q a hqpos + (mul_nonneg hs.le hqpos.le)).symm + have hbase' : + Real.rpow ((lambdaSq R s (.finite q) a)⁻¹) (q / 2) ≤ + factor * Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq R s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq R s (.finite q) a) (q / 2)).symm + _ ≤ factor * Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := hbase + _ = factor * Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + simpa [hneg] using congrArg (fun x : ℝ => factor * x) + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)) + have hfactorEq : + Real.rpow factor (2 / q) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + simpa [factor] using rpow_geometric_shift_factor_two_div h hqpos + calc + (lambdaSq R s (.finite q) a)⁻¹ ≤ + Real.rpow factor (2 / q) * (lambdaSq Q s (.finite q) a)⁻¹ := by + exact Homogenization.le_rpow_factor_mul_of_rpow_q_div_two_le hqpos + (inv_nonneg.mpr (lambdaSq_finite_nonneg R a hs hq)) + (inv_nonneg.mpr (lambdaSq_finite_nonneg Q a hs hq)) + hfactorNonneg hbase' + _ = multiscaleDescendantWeight Q k s * (lambdaSq Q s (.finite q) a)⁻¹ := by + rw [hfactorEq, old_descendantWeight_eq_multiscaleDescendantWeight Q hk s] + +theorem maxDescendant_b_le_maxDescendant_LambdaSq_finite {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s q : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) (hq : 1 ≤ q) : + maxDescendantBMatrixNormAtScale Q k a ≤ + maxDescendantUpperEllipticityAtScale Q k s (.finite q) a := by + unfold maxDescendantBMatrixNormAtScale maxDescendantUpperEllipticityAtScale + exact finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) fun R _ => + oneCube_b_le_LambdaSq_finite R a hs hq + +theorem maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_finite_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {k : ℤ} {s q : ℝ} (hk : k ≤ Q.scale) (hs : 0 < s) (hq : 1 ≤ q) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + maxDescendantLowerEllipticityInvAtScale Q k s (.finite q) a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale maxDescendantLowerEllipticityInvAtScale + exact finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) fun R _ => + oneCube_sigmaStarInv_le_lambdaSq_finite_inv R a hs hq + +theorem maxDescendant_LambdaSq_finite_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s q : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) (hq : 1 ≤ q) : + maxDescendantUpperEllipticityAtScale Q k s (.finite q) a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s (.finite q) a := by + unfold maxDescendantUpperEllipticityAtScale finsetSupReal + have hne : + ((fun R => LambdaSq R s (.finite q) a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨LambdaSq R s (.finite q) a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact descendant_LambdaSq_finite_le (Q := Q) (R := R) (k := k) a hR hs hq + +theorem maxDescendant_lambdaSq_finite_inv_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s q : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) (hq : 1 ≤ q) : + maxDescendantLowerEllipticityInvAtScale Q k s (.finite q) a ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s (.finite q) a)⁻¹ := by + unfold maxDescendantLowerEllipticityInvAtScale finsetSupReal + have hne : + ((fun R => (lambdaSq R s (.finite q) a)⁻¹) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨(lambdaSq R s (.finite q) a)⁻¹, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact descendant_lambdaSq_finite_inv_le (Q := Q) (R := R) (k := k) a hR hs hq + +theorem maxDescendant_b_le_maxDescendant_LambdaSq_infinity {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) : + maxDescendantBMatrixNormAtScale Q k a ≤ + maxDescendantUpperEllipticityAtScale Q k s .infinity a := by + unfold maxDescendantBMatrixNormAtScale maxDescendantUpperEllipticityAtScale + exact finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) fun R _ => + oneCube_b_le_LambdaSq_infinity R a hs + +theorem maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_infinity_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {k : ℤ} {s : ℝ} (hk : k ≤ Q.scale) (hs : 0 < s) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + maxDescendantLowerEllipticityInvAtScale Q k s .infinity a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale + maxDescendantLowerEllipticityInvAtScale + exact finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) fun R _ => + oneCube_sigmaStarInv_le_lambdaSq_infinity_inv R a hs + +theorem maxDescendant_LambdaSq_infinity_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) : + maxDescendantUpperEllipticityAtScale Q k s .infinity a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s .infinity a := by + unfold maxDescendantUpperEllipticityAtScale finsetSupReal + have hne : + ((fun R => LambdaSq R s .infinity a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨LambdaSq R s .infinity a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact descendant_LambdaSq_infinity_le (Q := Q) (R := R) (k := k) a hR hs + +theorem maxDescendant_lambdaSq_infinity_inv_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + (hk : k ≤ Q.scale) (hs : 0 < s) : + maxDescendantLowerEllipticityInvAtScale Q k s .infinity a ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s .infinity a)⁻¹ := by + unfold maxDescendantLowerEllipticityInvAtScale finsetSupReal + have hne : + ((fun R => (lambdaSq R s .infinity a)⁻¹) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨(lambdaSq R s .infinity a)⁻¹, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact descendant_lambdaSq_infinity_inv_le (Q := Q) (R := R) (k := k) a hR hs + +theorem LambdaSq_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + 0 ≤ LambdaSq Q s q a := by + cases q with + | finite q => + exact LambdaSq_finite_nonneg Q a hs (by simpa using hq) + | infinity => + exact LambdaSq_infinity_nonneg Q a hs + +theorem lambdaSq_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + 0 ≤ lambdaSq Q s q a := by + cases q with + | finite q => + exact lambdaSq_finite_nonneg Q a hs (by simpa using hq) + | infinity => + exact lambdaSq_infinity_nonneg Q a hs + +theorem LambdaSq_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + 0 < LambdaSq Q s q a := by + cases q with + | finite q => + exact LambdaSq_finite_pos Q a hs (by simpa using hq) + | infinity => + exact LambdaSq_infinity_pos Q a hs + +theorem lambdaSq_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + 0 < lambdaSq Q s q a := by + cases q with + | finite q => + exact lambdaSq_finite_pos Q a hs (by simpa using hq) + | infinity => + exact lambdaSq_infinity_pos Q a hs + +theorem lambdaSq_mono {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s : ℝ} + {q : MultiscaleExponent} (ht : 0 < t) (hts : t < s) + (hq : q.IsAdmissible) : + lambdaSq Q t q a ≤ lambdaSq Q s q a := by + cases q with + | finite q => + exact lambdaSq_finite_mono Q a ht hts (by simpa using hq) + | infinity => + exact lambdaSq_infinity_mono Q a ht hts + +theorem LambdaSq_antitone {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {t s : ℝ} + {q : MultiscaleExponent} (ht : 0 < t) (hts : t < s) + (hq : q.IsAdmissible) : + LambdaSq Q s q a ≤ LambdaSq Q t q a := by + cases q with + | finite q => + exact LambdaSq_finite_antitone Q a ht hts (by simpa using hq) + | infinity => + exact LambdaSq_infinity_antitone Q a ht hts + +theorem lambdaSq_le_oneCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + lambdaSq Q s q a ≤ (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := by + cases q with + | finite q => + exact lambdaSq_finite_le_oneCube Q a hs (by simpa using hq) + | infinity => + exact lambdaSq_infinity_le_oneCube Q a hs + +theorem oneCube_b_le_LambdaSq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} (hs : 0 < s) (hq : q.IsAdmissible) : + coarseBMatrixNorm Q a ≤ LambdaSq Q s q a := by + cases q with + | finite q => + exact oneCube_b_le_LambdaSq_finite Q a hs (by simpa using hq) + | infinity => + exact oneCube_b_le_LambdaSq_infinity Q a hs + +theorem maxDescendant_b_le_maxDescendant_LambdaSq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + {q : MultiscaleExponent} (hk : k ≤ Q.scale) (hs : 0 < s) + (hq : q.IsAdmissible) : + maxDescendantBMatrixNormAtScale Q k a ≤ + maxDescendantUpperEllipticityAtScale Q k s q a := by + cases q with + | finite q => + exact maxDescendant_b_le_maxDescendant_LambdaSq_finite Q a hk hs + (by simpa using hq) + | infinity => + exact maxDescendant_b_le_maxDescendant_LambdaSq_infinity Q a hk hs + +theorem maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {k : ℤ} {s : ℝ} {q : MultiscaleExponent} + (hk : k ≤ Q.scale) (hs : 0 < s) (hq : q.IsAdmissible) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + maxDescendantLowerEllipticityInvAtScale Q k s q a := by + cases q with + | finite q => + exact maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_finite_inv Q a hk hs + (by simpa using hq) + | infinity => + exact maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_infinity_inv Q a hk hs + +theorem maxDescendant_LambdaSq_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + {q : MultiscaleExponent} (hk : k ≤ Q.scale) (hs : 0 < s) + (hq : q.IsAdmissible) : + maxDescendantUpperEllipticityAtScale Q k s q a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s q a := by + cases q with + | finite q => + exact maxDescendant_LambdaSq_finite_le Q a hk hs (by simpa using hq) + | infinity => + exact maxDescendant_LambdaSq_infinity_le Q a hk hs + +theorem maxDescendant_lambdaSq_inv_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {k : ℤ} {s : ℝ} + {q : MultiscaleExponent} (hk : k ≤ Q.scale) (hs : 0 < s) + (hq : q.IsAdmissible) : + maxDescendantLowerEllipticityInvAtScale Q k s q a ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s q a)⁻¹ := by + cases q with + | finite q => + exact maxDescendant_lambdaSq_finite_inv_le Q a hk hs (by simpa using hq) + | infinity => + exact maxDescendant_lambdaSq_infinity_inv_le Q a hk hs + +theorem descendant_LambdaSq_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (hq : q.IsAdmissible) : + LambdaSq R s q a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s q a := by + cases q with + | finite q => + exact descendant_LambdaSq_finite_le (Q := Q) (R := R) (k := k) a hR hs + (by simpa using hq) + | infinity => + exact descendant_LambdaSq_infinity_le (Q := Q) (R := R) (k := k) a hR hs + +theorem descendant_lambdaSq_inv_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s : ℝ} + {q : MultiscaleExponent} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (hq : q.IsAdmissible) : + (lambdaSq R s q a)⁻¹ ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s q a)⁻¹ := by + cases q with + | finite q => + exact descendant_lambdaSq_finite_inv_le (Q := Q) (R := R) (k := k) a hR hs + (by simpa using hq) + | infinity => + exact descendant_lambdaSq_infinity_inv_le (Q := Q) (R := R) (k := k) a hR hs + +theorem ThetaRatio_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) : + 0 ≤ ThetaRatio Q s t a := by + rw [ThetaRatio, LambdaS, lambdaS, div_eq_mul_inv] + exact mul_nonneg + (LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1)) + (inv_nonneg.mpr (lambdaSq_finite_nonneg Q a ht (by norm_num : (1 : ℝ) ≤ 1))) + +theorem one_le_ThetaRatio_of_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) : + 1 ≤ ThetaRatio Q s t a := by + have hq : (MultiscaleExponent.finite (1 : ℝ)).IsAdmissible := by + norm_num + have hchain : + lambdaSq Q t (.finite 1) a ≤ LambdaSq Q s (.finite 1) a := by + calc + lambdaSq Q t (.finite 1) a ≤ + (coarseSigmaStarInvMatrixNorm Q a)⁻¹ := + lambdaSq_le_oneCube Q a ht hq + _ ≤ coarseBMatrixNorm Q a := oneCube_sigmaStarInv_le_b Q a + _ ≤ LambdaSq Q s (.finite 1) a := oneCube_b_le_LambdaSq Q a hs hq + have hlambda_pos : + 0 < lambdaSq Q t (.finite 1) a := + lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 1) + rw [ThetaRatio, LambdaS, lambdaS] + exact (one_le_div hlambda_pos).mpr hchain + +theorem one_le_ThetaRatio {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s t : ℝ} + (ht : 0 < t) (hts : t < s) : + 1 ≤ ThetaRatio Q s t a := + one_le_ThetaRatio_of_pos Q a (lt_trans ht hts) ht + +theorem descendant_ThetaRatio_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s t : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (ht : 0 < t) : + ThetaRatio R s t a ≤ + (multiscaleDescendantWeight Q k s * + multiscaleDescendantWeight Q k t) * + ThetaRatio Q s t a := by + let Ws : ℝ := multiscaleDescendantWeight Q k s + let Wt : ℝ := multiscaleDescendantWeight Q k t + have hLambda : + LambdaSq R s (.finite 1) a ≤ Ws * LambdaSq Q s (.finite 1) a := by + simpa [Ws] using + descendant_LambdaSq_finite_le (Q := Q) (R := R) (k := k) a hR hs + (by norm_num : (1 : ℝ) ≤ 1) + have hlambda : + (lambdaSq R t (.finite 1) a)⁻¹ ≤ Wt * (lambdaSq Q t (.finite 1) a)⁻¹ := by + simpa [Wt] using + descendant_lambdaSq_finite_inv_le (Q := Q) (R := R) (k := k) a hR ht + (by norm_num : (1 : ℝ) ≤ 1) + have hInvR_nonneg : 0 ≤ (lambdaSq R t (.finite 1) a)⁻¹ := + inv_nonneg.mpr (lambdaSq_finite_nonneg R a ht (by norm_num : (1 : ℝ) ≤ 1)) + have hWs_nonneg : 0 ≤ Ws := by + dsimp [Ws, multiscaleDescendantWeight] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hLambdaQ_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hWsLambda_nonneg : 0 ≤ Ws * LambdaSq Q s (.finite 1) a := + mul_nonneg hWs_nonneg hLambdaQ_nonneg + calc + ThetaRatio R s t a = + LambdaSq R s (.finite 1) a * (lambdaSq R t (.finite 1) a)⁻¹ := by + rw [ThetaRatio, LambdaS, lambdaS, div_eq_mul_inv] + _ ≤ (Ws * LambdaSq Q s (.finite 1) a) * + (Wt * (lambdaSq Q t (.finite 1) a)⁻¹) := by + exact mul_le_mul hLambda hlambda hInvR_nonneg hWsLambda_nonneg + _ = + (multiscaleDescendantWeight Q k s * multiscaleDescendantWeight Q k t) * + ThetaRatio Q s t a := by + rw [ThetaRatio, LambdaS, lambdaS, div_eq_mul_inv] + simp [Ws, Wt, mul_assoc, mul_left_comm, mul_comm] + +theorem descendant_ThetaRatio_rpow_half_le {d : ℕ} [NeZero d] + {Q R : TriadicCube d} {k : ℤ} (a : TriadicCoeffFamily d) {s t : ℝ} + (hR : R ∈ descendantsAtScale Q k) (hs : 0 < s) (ht : 0 < t) : + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow + ((multiscaleDescendantWeight Q k s * + multiscaleDescendantWeight Q k t) * + ThetaRatio Q s t a) + (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow (ThetaRatio_nonneg R a hs ht) + (descendant_ThetaRatio_le (Q := Q) (R := R) (k := k) a hR hs ht) + (by norm_num : 0 ≤ (1 / 2 : ℝ)) + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Public.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Public.lean new file mode 100644 index 0000000000..84747279d2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Public.lean @@ -0,0 +1,427 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Localization + +/-! # Public -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Public Chapter 2.5 Multiscale Ellipticity Theorems + +This file assembles the public theorem packages and records that the +multiscale ellipticity quantities depend only on a.e. coefficient data. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + + +/-- Public theorem package for the Sec. 2.5 basic order and localization +facts. -/ +theorem multiscaleEllipticityBasicTheory {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + MultiscaleEllipticityBasicTheory Q a where + LambdaSq_nonneg := by + intro s q hs hq + exact LambdaSq_nonneg Q a hs hq + lambdaSq_nonneg := by + intro s q hs hq + exact lambdaSq_nonneg Q a hs hq + LambdaSq_pos := by + intro s q hs hq + exact LambdaSq_pos Q a hs hq + lambdaSq_pos := by + intro s q hs hq + exact lambdaSq_pos Q a hs hq + oneCube_sigmaStarInv_le_b := oneCube_sigmaStarInv_le_b Q a + lambdaSq_mono := by + intro t s q ht hts hq + exact lambdaSq_mono Q a ht hts hq + LambdaSq_antitone := by + intro t s q ht hts hq + exact LambdaSq_antitone Q a ht hts hq + lambdaSq_le_oneCube := by + intro s q hs hq + exact lambdaSq_le_oneCube Q a hs hq + oneCube_b_le_LambdaSq := by + intro s q hs hq + exact oneCube_b_le_LambdaSq Q a hs hq + maxDescendant_b_le_maxDescendant_LambdaSq := by + intro k s q hk hs hq + exact maxDescendant_b_le_maxDescendant_LambdaSq Q a hk hs hq + maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv := by + intro k s q hk hs hq + exact maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv Q a hk hs hq + maxDescendant_LambdaSq_le := by + intro k s q hk hs hq + exact maxDescendant_LambdaSq_le Q a hk hs hq + maxDescendant_lambdaSq_inv_le := by + intro k s q hk hs hq + exact maxDescendant_lambdaSq_inv_le Q a hk hs hq + descendant_LambdaSq_le := by + intro R k s q hR hs hq + exact descendant_LambdaSq_le (Q := Q) (R := R) (k := k) a hR hs hq + descendant_lambdaSq_inv_le := by + intro R k s q hR hs hq + exact descendant_lambdaSq_inv_le (Q := Q) (R := R) (k := k) a hR hs hq + ThetaRatio_nonneg := by + intro s t hs ht + exact ThetaRatio_nonneg Q a hs ht + one_le_ThetaRatio_of_pos := by + intro s t hs ht + exact one_le_ThetaRatio_of_pos Q a hs ht + one_le_ThetaRatio := by + intro s t ht hts + exact one_le_ThetaRatio Q a ht hts + descendant_ThetaRatio_le := by + intro R k s t hR ht hts + exact descendant_ThetaRatio_le (Q := Q) (R := R) (k := k) a hR + (lt_trans ht hts) ht + descendant_ThetaRatio_rpow_half_le := by + intro R k s t hR ht hts + exact descendant_ThetaRatio_rpow_half_le (Q := Q) (R := R) (k := k) a hR + (lt_trans ht hts) ht + +theorem coarseBMatrixNorm_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) : + coarseBMatrixNorm Q a = coarseBMatrixNorm Q b := by + unfold coarseBMatrixNorm + rw [bCoarse_eq_ofAEEq (h Q)] + +theorem coarseSigmaStarInvMatrixNorm_eq_ofAEEq {d : ℕ} + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) : + coarseSigmaStarInvMatrixNorm Q a = coarseSigmaStarInvMatrixNorm Q b := by + unfold coarseSigmaStarInvMatrixNorm + rw [sigmaStarInvCoarse_eq_ofAEEq (h Q)] + +theorem maxDescendantBMatrixNormAtScale_eq_ofAEEq {d : ℕ} + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (k : ℤ) : + maxDescendantBMatrixNormAtScale Q k a = + maxDescendantBMatrixNormAtScale Q k b := by + unfold maxDescendantBMatrixNormAtScale + exact finsetSupReal_congr _ fun R _ => coarseBMatrixNorm_eq_ofAEEq h R + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_eq_ofAEEq {d : ℕ} + {a b : TriadicCoeffFamily d} (h : TriadicCoeffFamily.AEEq a b) + (Q : TriadicCube d) (k : ℤ) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a = + maxDescendantSigmaStarInvMatrixNormAtScale Q k b := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale + exact finsetSupReal_congr _ fun R _ => + coarseSigmaStarInvMatrixNorm_eq_ofAEEq h R + +theorem maxDescendantBMatrixNormAtScale_translateCube_of_coarseBMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (hB : ∀ R ∈ descendantsAtScale Q k, + coarseBMatrixNorm + (translateCube (descendantTranslationShift (Int.toNat (Q.scale - k)) z) R) a = + coarseBMatrixNorm R b) : + maxDescendantBMatrixNormAtScale (translateCube z Q) k a = + maxDescendantBMatrixNormAtScale Q k b := by + unfold maxDescendantBMatrixNormAtScale + rw [descendantsAtScale_translateCube z Q hk] + exact finsetSupReal_image _ _ _ _ hB + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_translateCube_of_coarseSigmaStarInvMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (hSigma : ∀ R ∈ descendantsAtScale Q k, + coarseSigmaStarInvMatrixNorm + (translateCube (descendantTranslationShift (Int.toNat (Q.scale - k)) z) R) a = + coarseSigmaStarInvMatrixNorm R b) : + maxDescendantSigmaStarInvMatrixNormAtScale (translateCube z Q) k a = + maxDescendantSigmaStarInvMatrixNormAtScale Q k b := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale + rw [descendantsAtScale_translateCube z Q hk] + exact finsetSupReal_image _ _ _ _ hSigma + +theorem LambdaSqFinite_translateCube_of_coarseBMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s q : ℝ) + (hB : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseBMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseBMatrixNorm R b) : + LambdaSqFinite (translateCube z Q) s q a = LambdaSqFinite Q s q b := by + unfold LambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (2 / q)) + apply tsum_congr + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantBMatrixNormAtScale_translateCube_of_coarseBMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hB n R hR) + simpa [translateCube] using + congrArg (fun x => geometricWeight s q n * Real.rpow x (q / 2)) hmax + +theorem lambdaSqFinite_translateCube_of_coarseSigmaStarInvMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s q : ℝ) + (hSigma : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseSigmaStarInvMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseSigmaStarInvMatrixNorm R b) : + lambdaSqFinite (translateCube z Q) s q a = lambdaSqFinite Q s q b := by + unfold lambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (-(2 / q))) + apply tsum_congr + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_translateCube_of_coarseSigmaStarInvMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hSigma n R hR) + simpa [translateCube] using + congrArg (fun x => geometricWeight s q n * Real.rpow x (q / 2)) hmax + +theorem LambdaSqInfinity_translateCube_of_coarseBMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) + (hB : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseBMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseBMatrixNorm R b) : + LambdaSqInfinity (translateCube z Q) s a = LambdaSqInfinity Q s b := by + unfold LambdaSqInfinity + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantBMatrixNormAtScale_translateCube_of_coarseBMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hB n R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantBMatrixNormAtScale_translateCube_of_coarseBMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hB n R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax.symm + +theorem lambdaSqInfinity_translateCube_of_coarseSigmaStarInvMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) + (hSigma : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseSigmaStarInvMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseSigmaStarInvMatrixNorm R b) : + lambdaSqInfinity (translateCube z Q) s a = lambdaSqInfinity Q s b := by + unfold lambdaSqInfinity + congr 1 + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_translateCube_of_coarseSigmaStarInvMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hSigma n R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n) + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_translateCube_of_coarseSigmaStarInvMatrixNorm + (a := a) (b := b) z Q (k := Q.scale - (n : ℤ)) hk + (by + intro R hR + simpa using hSigma n R hR) + simpa [translateCube] using + congrArg (fun x => Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * x) hmax.symm + +theorem LambdaSq_translateCube_of_coarseBMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent) + (hB : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseBMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseBMatrixNorm R b) : + LambdaSq (translateCube z Q) s q a = LambdaSq Q s q b := by + cases q with + | finite q => + exact LambdaSqFinite_translateCube_of_coarseBMatrixNorm a b z Q s q hB + | infinity => + exact LambdaSqInfinity_translateCube_of_coarseBMatrixNorm a b z Q s hB + +theorem lambdaSq_translateCube_of_coarseSigmaStarInvMatrixNorm + {d : ℕ} (a b : TriadicCoeffFamily d) (z : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent) + (hSigma : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) → + coarseSigmaStarInvMatrixNorm (translateCube (descendantTranslationShift n z) R) a = + coarseSigmaStarInvMatrixNorm R b) : + lambdaSq (translateCube z Q) s q a = lambdaSq Q s q b := by + cases q with + | finite q => + exact lambdaSqFinite_translateCube_of_coarseSigmaStarInvMatrixNorm a b z Q s q hSigma + | infinity => + exact lambdaSqInfinity_translateCube_of_coarseSigmaStarInvMatrixNorm a b z Q s hSigma + +theorem LambdaSqFinite_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s q : ℝ) : + LambdaSqFinite Q s q a = LambdaSqFinite Q s q b := by + unfold LambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (2 / q)) + apply tsum_congr + intro n + rw [maxDescendantBMatrixNormAtScale_eq_ofAEEq h] + +theorem lambdaSqFinite_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s q : ℝ) : + lambdaSqFinite Q s q a = lambdaSqFinite Q s q b := by + unfold lambdaSqFinite + apply congrArg (fun S : ℝ => Real.rpow S (-(2 / q))) + apply tsum_congr + intro n + rw [maxDescendantSigmaStarInvMatrixNormAtScale_eq_ofAEEq h] + +theorem LambdaSqInfinity_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) : + LambdaSqInfinity Q s a = LambdaSqInfinity Q s b := by + unfold LambdaSqInfinity + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + rw [maxDescendantBMatrixNormAtScale_eq_ofAEEq h] + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + rw [maxDescendantBMatrixNormAtScale_eq_ofAEEq h] + +theorem lambdaSqInfinity_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) : + lambdaSqInfinity Q s a = lambdaSqInfinity Q s b := by + unfold lambdaSqInfinity + apply congrArg (fun S : ℝ => S⁻¹) + refine congrArg sSup ?_ + ext M + constructor + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + rw [maxDescendantSigmaStarInvMatrixNormAtScale_eq_ofAEEq h] + · rintro ⟨n, rfl⟩ + refine ⟨n, ?_⟩ + rw [maxDescendantSigmaStarInvMatrixNormAtScale_eq_ofAEEq h] + +theorem LambdaSq_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) : + LambdaSq Q s q a = LambdaSq Q s q b := by + cases q with + | finite q => + exact LambdaSqFinite_eq_ofAEEq h Q s q + | infinity => + exact LambdaSqInfinity_eq_ofAEEq h Q s + +theorem lambdaSq_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) : + lambdaSq Q s q a = lambdaSq Q s q b := by + cases q with + | finite q => + exact lambdaSqFinite_eq_ofAEEq h Q s q + | infinity => + exact lambdaSqInfinity_eq_ofAEEq h Q s + +theorem LambdaS_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) : + LambdaS Q s a = LambdaS Q s b := + LambdaSq_eq_ofAEEq h Q s (.finite 1) + +theorem lambdaS_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s : ℝ) : + lambdaS Q s a = lambdaS Q s b := + lambdaSq_eq_ofAEEq h Q s (.finite 1) + +theorem ThetaRatio_eq_ofAEEq {d : ℕ} {a b : TriadicCoeffFamily d} + (h : TriadicCoeffFamily.AEEq a b) (Q : TriadicCube d) (s t : ℝ) : + ThetaRatio Q s t a = ThetaRatio Q s t b := by + unfold ThetaRatio + rw [LambdaS_eq_ofAEEq h Q s, lambdaS_eq_ofAEEq h Q t] + +/-- Public theorem package asserting that Sec. 2.5 quantities depend only on +the coefficient family modulo a.e. equality on each triadic cube. -/ +theorem multiscaleEllipticityAEEqTheory (d : ℕ) : + MultiscaleEllipticityAEEqTheory d where + coarseBMatrixNorm_eq_ofAEEq := by + intro a b h Q + exact coarseBMatrixNorm_eq_ofAEEq h Q + coarseSigmaStarInvMatrixNorm_eq_ofAEEq := by + intro a b h Q + exact coarseSigmaStarInvMatrixNorm_eq_ofAEEq h Q + LambdaSq_eq_ofAEEq := by + intro a b h Q s q + exact LambdaSq_eq_ofAEEq h Q s q + lambdaSq_eq_ofAEEq := by + intro a b h Q s q + exact lambdaSq_eq_ofAEEq h Q s q + ThetaRatio_eq_ofAEEq := by + intro a b h Q s t + exact ThetaRatio_eq_ofAEEq h Q s t + +theorem multiscaleEllipticityChangeExponentTheory (d : ℕ) [NeZero d] : + MultiscaleEllipticityChangeExponentTheory d where + exists_change_exponent_constant := by + refine ⟨25 * Real.exp 4, by positivity, ?_⟩ + intro Q a s p q hs hs_le hp hpq + constructor + · exact LambdaSqFinite_le_change_exponent Q a hs hs_le hp hpq + · exact lambdaSqFinite_inv_le_change_exponent Q a hs hs_le hp hpq + +theorem multiscaleEllipticityTheory (d : ℕ) [NeZero d] : + MultiscaleEllipticityTheory d where + basic := by + intro Q a + exact multiscaleEllipticityBasicTheory Q a + change_exponent := multiscaleEllipticityChangeExponentTheory d + aeeq := multiscaleEllipticityAEEqTheory d + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Representatives.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Representatives.lean new file mode 100644 index 0000000000..1c783d7c47 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticity/Representatives.lean @@ -0,0 +1,1187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic + +/-! # Representatives -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Representative Bridges for Chapter 2.5 Multiscale Ellipticity + +This file bridges public a.e. coefficient families to pointwise representatives +used by the deterministic multiscale ellipticity estimates. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Frobenius + + +/-- Restrict the pointwise-good representative of a root-cube coefficient +object to a smaller triadic cube. This is an internal bridge object: public +coefficient fields remain a.e. objects, while old deterministic lemmas consume +pointwise elliptic representatives. -/ +noncomputable def pointwiseCoeffOnRestrict {d : ℕ} {Q R : TriadicCube d} + (aQ : CoeffOn (cubeDomain Q)) + (hsub : openCubeSet R ⊆ openCubeSet Q) : + CoeffOn (cubeDomain R) where + toCoeffField := Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ + lam := aQ.lam + Lam := aQ.Lam + lam_pos := aQ.lam_pos + lam_le_Lam := aQ.lam_le_Lam + aeStronglyMeasurable := by + classical + intro i j + have hcoeff : + Measurable fun x : Vec d => + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (Internal.Ch02.BookCh02.pointwiseCoeffField_measurable (cubeDomain Q) aQ) i) j) + have hentry : + Measurable fun x : Vec d => + restrictCoeffField (openCubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ) x i j := by + have hite : + Measurable fun x : Vec d => + if x ∈ openCubeSet R then + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ x i j + else 0 := + Measurable.ite (measurableSet_openCubeSet R) hcoeff measurable_const + convert hite using 1 + funext x + by_cases hx : x ∈ openCubeSet R <;> simp [restrictCoeffField, hx] + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet R)] + with x hxR + exact (Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) aQ).2 x (hsub hxR) + +theorem coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict {d : ℕ} + (a : TriadicCoeffFamily d) {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + CoeffOn.AEEq (a.coeffOn R) + (pointwiseCoeffOnRestrict (a.coeffOn Q) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) := by + have hrestrict : CoeffOn.RestrictsTo (a.coeffOn Q) (a.coeffOn R) := + a.restrictsTo_descendant hk hR + have hpointQ : + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + =ᵐ[volumeMeasureOn (openCubeSet Q)] + (a.coeffOn Q).toCoeffField := by + simpa using + Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (cubeDomain Q) (a.coeffOn Q) + have hpointR' : + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + =ᵐ[volumeMeasureOn (openCubeSet R)] + (a.coeffOn Q).toCoeffField := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) hpointQ + exact hrestrict.trans (Filter.EventuallyEq.symm hpointR') + +theorem pointwiseCoeffField_openCube_descendant_data {d : ℕ} [NeZero d] + (Q : TriadicCube d) (aQ : CoeffOn (cubeDomain Q)) : + OpenCubeDescendantDeterministicCoarseData Q + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ) := by + have hEll : + IsEllipticFieldOn aQ.lam aQ.Lam (openCubeSet Q) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ) := by + simpa using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) aQ + have hOrigin : OpenCubeOriginEllipticRecoveryExistence aQ.lam aQ.Lam := + openCubeOriginEllipticRecoveryExistence + (d := d) (lam := aQ.lam) (Lam := aQ.Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_openCubeSet_of_originCubeRecoveryExistence + Q (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) aQ) + hEll hOrigin + exact openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + +theorem coarseBMatrixNorm_le_coarseBBlockNorm_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + coarseBMatrixNorm R a ≤ + Homogenization.coarseBBlockNorm R + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict + (a := a) hk hR + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hSCanon : + IsSigmaStarCoarse (openCubeSet R) A + (Homogenization.sigmaStarCoarse (openCubeSet R) A) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] using hS + have hUpperCanon : + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) := by + calc + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft = + Homogenization.bCoarse sigma sigmaStar kappa := by + exact coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix + hA hS hK hSigma hdet + _ = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + calc + coarseBMatrixNorm R a = + matrixNorm (bCoarse (cubeDomain R) (a.coeffOn R)) := by + rfl + _ = matrixNorm (bCoarse (cubeDomain R) aRpw) := by + rw [bCoarse_eq_ofAEEq haeeq] + _ = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A)) := by + simpa [bCoarse, aRpw, A] using! + congrArg matrixNorm + (Internal.Ch02.book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse + (cubeDomain R) aRpw hSCanon) + _ ≤ + Homogenization.matNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A)) := by + exact matrixNorm_le_matNorm _ + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft := by + rw [hUpperCanon] + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (cubeSet R) A).upperLeft := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R A] + _ = Homogenization.coarseBBlockNorm R A := by + rfl + +theorem coarseSigmaStarInvMatrixNorm_le_coarseSigmaStarInvBlockNorm_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + coarseSigmaStarInvMatrixNorm R a ≤ + Homogenization.coarseSigmaStarInvBlockNorm R + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict + (a := a) hk hR + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hLower : + (Homogenization.coarseBlockMatrix (openCubeSet R) A).lowerRight = + Homogenization.sigmaStarInvCoarse (openCubeSet R) A := + coarseBlockMatrix_lowerRight_eq_of_isCoarseBlockMatrix hA + calc + coarseSigmaStarInvMatrixNorm R a = + matrixNorm (sigmaStarInvCoarse (cubeDomain R) (a.coeffOn R)) := by + rfl + _ = matrixNorm (sigmaStarInvCoarse (cubeDomain R) aRpw) := by + rw [sigmaStarInvCoarse_eq_ofAEEq haeeq] + _ = matrixNorm (Homogenization.sigmaStarInvCoarse (openCubeSet R) A) := by + simpa [aRpw, A] using! + congrArg matrixNorm + (Internal.Ch02.book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse + (cubeDomain R) aRpw) + _ ≤ Homogenization.matNorm (Homogenization.sigmaStarInvCoarse (openCubeSet R) A) := by + exact matrixNorm_le_matNorm _ + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (openCubeSet R) A).lowerRight := by + rw [hLower] + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (cubeSet R) A).lowerRight := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R A] + _ = Homogenization.coarseSigmaStarInvBlockNorm R A := by + rfl + +theorem coarseBMatrixNorm_eq_matrixNorm_bCoarse_pointwiseCoeffField_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + coarseBMatrixNorm R a = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (Homogenization.sigmaStarCoarse (cubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (Homogenization.kappaCoarse (cubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)))) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict + (a := a) hk hR + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hSCanon : + IsSigmaStarCoarse (openCubeSet R) A + (Homogenization.sigmaStarCoarse (openCubeSet R) A) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] using hS + have hOpenCube : + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A) := by + symm + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := A) hS hK hSigma hdet] + calc + coarseBMatrixNorm R a = + matrixNorm (bCoarse (cubeDomain R) (a.coeffOn R)) := by + rfl + _ = matrixNorm (bCoarse (cubeDomain R) aRpw) := by + rw [bCoarse_eq_ofAEEq haeeq] + _ = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A)) := by + simpa [bCoarse, aRpw, A] using! + congrArg matrixNorm + (Internal.Ch02.book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse + (cubeDomain R) aRpw hSCanon) + _ = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) := by + rw [hOpenCube] + +theorem coarseSigmaStarInvMatrixNorm_eq_matrixNorm_sigmaStarInv_pointwiseCoeffField_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + coarseSigmaStarInvMatrixNorm R a = + matrixNorm + (Homogenization.sigmaStarInvCoarse (cubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let aRpw : CoeffOn (cubeDomain R) := + pointwiseCoeffOnRestrict (a.coeffOn Q) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have haeeq : CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict + (a := a) hk hR + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hOpenCube : + Homogenization.sigmaStarInvCoarse (openCubeSet R) A = + Homogenization.sigmaStarInvCoarse (cubeSet R) A := by + symm + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := A) hS] + calc + coarseSigmaStarInvMatrixNorm R a = + matrixNorm (sigmaStarInvCoarse (cubeDomain R) (a.coeffOn R)) := by + rfl + _ = matrixNorm (sigmaStarInvCoarse (cubeDomain R) aRpw) := by + rw [sigmaStarInvCoarse_eq_ofAEEq haeeq] + _ = matrixNorm (Homogenization.sigmaStarInvCoarse (openCubeSet R) A) := by + simpa [aRpw, A] using! + congrArg matrixNorm + (Internal.Ch02.book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse + (cubeDomain R) aRpw) + _ = matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet R) A) := by + rw [hOpenCube] + +theorem coarseBBlockNorm_le_dim_mul_coarseBMatrixNorm_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + Homogenization.coarseBBlockNorm R + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + (d : ℝ) * coarseBMatrixNorm R a := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hUpperCanon : + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) := by + calc + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft = + Homogenization.bCoarse sigma sigmaStar kappa := by + exact coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix + hA hS hK hSigma hdet + _ = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + have hOpenCube : + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A) := by + symm + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := A) hS hK hSigma hdet] + calc + Homogenization.coarseBBlockNorm R A = + Homogenization.matNorm + (Homogenization.coarseBlockMatrix (cubeSet R) A).upperLeft := by + rfl + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (openCubeSet R) A).upperLeft := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R A] + _ = + Homogenization.matNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A)) := by + rw [hUpperCanon] + _ = + Homogenization.matNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) := by + rw [hOpenCube] + _ ≤ + (d : ℝ) * + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) := + matNorm_le_dim_mul_matrixNorm _ + _ = (d : ℝ) * coarseBMatrixNorm R a := by + rw [coarseBMatrixNorm_eq_matrixNorm_bCoarse_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) hk hR] + +theorem coarseSigmaStarInvBlockNorm_le_dim_mul_coarseSigmaStarInvMatrixNorm_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + Homogenization.coarseSigmaStarInvBlockNorm R + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + (d : ℝ) * coarseSigmaStarInvMatrixNorm R a := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hDataR : OpenCubeDeterministicCoarseData R A := + hData k hk R hR + rcases hDataR with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hLower : + (Homogenization.coarseBlockMatrix (openCubeSet R) A).lowerRight = + Homogenization.sigmaStarInvCoarse (openCubeSet R) A := + coarseBlockMatrix_lowerRight_eq_of_isCoarseBlockMatrix hA + have hOpenCube : + Homogenization.sigmaStarInvCoarse (openCubeSet R) A = + Homogenization.sigmaStarInvCoarse (cubeSet R) A := by + symm + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := A) hS] + calc + Homogenization.coarseSigmaStarInvBlockNorm R A = + Homogenization.matNorm + (Homogenization.coarseBlockMatrix (cubeSet R) A).lowerRight := by + rfl + _ = Homogenization.matNorm + (Homogenization.coarseBlockMatrix (openCubeSet R) A).lowerRight := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R A] + _ = Homogenization.matNorm + (Homogenization.sigmaStarInvCoarse (openCubeSet R) A) := by + rw [hLower] + _ = Homogenization.matNorm + (Homogenization.sigmaStarInvCoarse (cubeSet R) A) := by + rw [hOpenCube] + _ ≤ + (d : ℝ) * + matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet R) A) := + matNorm_le_dim_mul_matrixNorm _ + _ = (d : ℝ) * coarseSigmaStarInvMatrixNorm R a := by + rw [coarseSigmaStarInvMatrixNorm_eq_matrixNorm_sigmaStarInv_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) hk hR] + +private theorem canonical_bCoarse_cubeSet_posSemidef + {d : ℕ} [NeZero d] {R : TriadicCube d} {A : CoeffField d} + {sigmaR sigmaStarR kappaR : Mat d} + (hSR : IsSigmaStarCoarse (openCubeSet R) A sigmaStarR) + (hKR : IsKappaCoarse (openCubeSet R) A sigmaStarR kappaR) + (hSigmaR : IsSigmaCoarse (openCubeSet R) A sigmaR sigmaStarR kappaR) + (hdetR : IsUnit sigmaStarR.det) : + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)).PosSemidef := by + have hcanonR : + Homogenization.bCoarse sigmaR sigmaStarR kappaR = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A) := by + calc + Homogenization.bCoarse sigmaR sigmaStarR kappaR = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) := by + rw [Homogenization.sigmaCoarse_eq_of_isSigmaCoarse hSR hKR hSigmaR hdetR, + Homogenization.eq_sigmaStarCoarse_of_isSigmaStarCoarse hSR hdetR, + Homogenization.eq_kappaCoarse_of_isKappaCoarse hSR hKR hdetR] + _ = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A) := by + symm + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := A) hSR hKR hSigmaR hdetR] + rw [← hcanonR] + exact Homogenization.bCoarse_posSemidef_of_isSigmaCoarse hSR hSigmaR + +theorem coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) : + coarseBMatrixNorm Q a ≤ maxDescendantBMatrixNormAtScale Q k a := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let j : ℕ := Int.toNat (Q.scale - k) + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hQQ : Q ∈ descendantsAtScale Q Q.scale := by + simp [descendantsAtScale_self] + rcases hData Q.scale le_rfl Q hQQ with + ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + have hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) A + (deterministicCoarseBlockMatrix (openCubeSet R) A) ∧ + IsSigmaStarCoarse (openCubeSet R) A sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) A sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) A sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + exact hData k hk R hRk + have hAvgEq : + descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A)) = + descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) := by + ext i l + unfold descendantsAverageMat descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A) = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A) := by + symm + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := A) hSR hKR hSigmaR hdetR] + simpa using congrArg (fun M : Mat d => M i l) hcanonR + have hLoewner : + MatLoewnerLE + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet Q) A) + (Homogenization.sigmaStarCoarse (cubeSet Q) A) + (Homogenization.kappaCoarse (cubeSet Q) A)) + (descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A))) := by + intro p + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet Q) A) + (Homogenization.sigmaStarCoarse (cubeSet Q) A) + (Homogenization.kappaCoarse (cubeSet Q) A)) p) = + (1 / 2 : ℝ) * vecDot p + (matVecMul + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet Q) A) + (Homogenization.sigmaStarCoarse (openCubeSet Q) A) + (Homogenization.kappaCoarse (openCubeSet Q) A)) p) := by + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := Q) (a := A) hSQ hKQ hSigmaQ hdetQ] + _ ≤ (1 / 2 : ℝ) * vecDot p + (matVecMul + (descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (openCubeSet R) A) + (Homogenization.sigmaStarCoarse (openCubeSet R) A) + (Homogenization.kappaCoarse (openCubeSet R) A))) p) := by + exact + Homogenization.bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q A hEll hSQ hKQ hSigmaQ hdetQ hDesc p + _ = (1 / 2 : ℝ) * vecDot p + (matVecMul + (descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A))) p) := by + rw [hAvgEq] + have hParentPSD : + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet Q) A) + (Homogenization.sigmaStarCoarse (cubeSet Q) A) + (Homogenization.kappaCoarse (cubeSet Q) A)).PosSemidef := by + rw [Homogenization.bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := Q) (a := A) hSQ hKQ hSigmaQ hdetQ] + exact Homogenization.bCoarse_canonical_posSemidef_of_isSigmaCoarse + hSQ hKQ hSigmaQ hdetQ + have hAvgPSD : + (descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A))).PosSemidef := by + refine Homogenization.descendantsAverageMat_posSemidef ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + exact canonical_bCoarse_cubeSet_posSemidef hSR hKR hSigmaR hdetR + have hParentEq : + coarseBMatrixNorm Q a = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet Q) A) + (Homogenization.sigmaStarCoarse (cubeSet Q) A) + (Homogenization.kappaCoarse (cubeSet Q) A)) := by + simpa [A] using + coarseBMatrixNorm_eq_matrixNorm_bCoarse_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := Q) (k := Q.scale) le_rfl hQQ + have hterm_eq : + ∀ R ∈ descendantsAtDepth Q j, + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) = + coarseBMatrixNorm R a := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + simpa [A] using + (coarseBMatrixNorm_eq_matrixNorm_bCoarse_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := k) hk hRk).symm + calc + coarseBMatrixNorm Q a = + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet Q) A) + (Homogenization.sigmaStarCoarse (cubeSet Q) A) + (Homogenization.kappaCoarse (cubeSet Q) A)) := hParentEq + _ ≤ + matrixNorm + (descendantsAverageMat Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A))) := by + exact matrixNorm_le_of_matLoewnerLE_of_posSemidef + hParentPSD hAvgPSD hLoewner + _ ≤ finsetSupReal (descendantsAtDepth Q j) + (fun R => + matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A))) := by + exact matrixNorm_descendantsAverageMat_le_finsetSupReal_matrixNorm Q j + (fun R => + Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) + _ = finsetSupReal (descendantsAtDepth Q j) + (fun R => coarseBMatrixNorm R a) := by + exact finsetSupReal_congr (descendantsAtDepth Q j) hterm_eq + _ = maxDescendantBMatrixNormAtScale Q k a := by + unfold maxDescendantBMatrixNormAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + +theorem coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a : TriadicCoeffFamily d) : + coarseSigmaStarInvMatrixNorm Q a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let j : ℕ := Int.toNat (Q.scale - k) + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + have hQQ : Q ∈ descendantsAtScale Q Q.scale := by + simp [descendantsAtScale_self] + rcases hData Q.scale le_rfl Q hQQ with + ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + have hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) A + (deterministicCoarseBlockMatrix (openCubeSet R) A) ∧ + IsSigmaStarCoarse (openCubeSet R) A sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) A sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) A sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + exact hData k hk R hRk + have hAvgEq : + descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (openCubeSet R) A) = + descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A) := by + ext i l + unfold descendantsAverageMat descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + Homogenization.sigmaStarInvCoarse (openCubeSet R) A = + Homogenization.sigmaStarInvCoarse (cubeSet R) A := by + symm + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := A) hSR] + simpa using congrArg (fun M : Mat d => M i l) hcanonR + have hLoewner : + MatLoewnerLE (Homogenization.sigmaStarInvCoarse (cubeSet Q) A) + (descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A)) := by + intro q + calc + (1 / 2 : ℝ) * vecDot q + (matVecMul (Homogenization.sigmaStarInvCoarse (cubeSet Q) A) q) = + (1 / 2 : ℝ) * vecDot q + (matVecMul (Homogenization.sigmaStarInvCoarse (openCubeSet Q) A) q) := by + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := Q) (a := A) hSQ] + _ ≤ (1 / 2 : ℝ) * vecDot q + (matVecMul + (descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (openCubeSet R) A)) q) := by + exact + Homogenization.sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q A hEll hSQ hKQ hSigmaQ hdetQ hDesc q + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul + (descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A)) q) := by + rw [hAvgEq] + have hParentPSD : + (Homogenization.sigmaStarInvCoarse (cubeSet Q) A).PosSemidef := by + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := Q) (a := A) hSQ] + exact Homogenization.sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse + (U := openCubeSet Q) (a := A) hSQ + have hAvgPSD : + (descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A)).PosSemidef := by + refine Homogenization.descendantsAverageMat_posSemidef ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + rw [Homogenization.sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := A) hSR] + exact Homogenization.sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse + (U := openCubeSet R) (a := A) hSR + have hParentEq : + coarseSigmaStarInvMatrixNorm Q a = + matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet Q) A) := by + simpa [A] using + coarseSigmaStarInvMatrixNorm_eq_matrixNorm_sigmaStarInv_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := Q) (k := Q.scale) le_rfl hQQ + have hterm_eq : + ∀ R ∈ descendantsAtDepth Q j, + matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet R) A) = + coarseSigmaStarInvMatrixNorm R a := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + simpa [A] using + (coarseSigmaStarInvMatrixNorm_eq_matrixNorm_sigmaStarInv_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := k) hk hRk).symm + calc + coarseSigmaStarInvMatrixNorm Q a = + matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet Q) A) := hParentEq + _ ≤ + matrixNorm + (descendantsAverageMat Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A)) := by + exact matrixNorm_le_of_matLoewnerLE_of_posSemidef + hParentPSD hAvgPSD hLoewner + _ ≤ finsetSupReal (descendantsAtDepth Q j) + (fun R => + matrixNorm (Homogenization.sigmaStarInvCoarse (cubeSet R) A)) := by + exact matrixNorm_descendantsAverageMat_le_finsetSupReal_matrixNorm Q j + (fun R => Homogenization.sigmaStarInvCoarse (cubeSet R) A) + _ = finsetSupReal (descendantsAtDepth Q j) + (fun R => coarseSigmaStarInvMatrixNorm R a) := by + exact finsetSupReal_congr (descendantsAtDepth Q j) hterm_eq + _ = maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + +theorem maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + maxDescendantBMatrixNormAtScale Q k a ≤ + Homogenization.maxDescendantBBlockNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + refine finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) ?_ + intro R hR + exact coarseBMatrixNorm_le_coarseBBlockNorm_of_mem_descendantsAtScale + (a := a) hk hR + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + Homogenization.maxDescendantSigmaStarInvNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + refine finsetSupReal_mono (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) ?_ + intro R hR + exact coarseSigmaStarInvMatrixNorm_le_coarseSigmaStarInvBlockNorm_of_mem_descendantsAtScale + (a := a) hk hR + +theorem maxDescendantBBlockNormAtScale_le_dim_mul_maxDescendantBMatrixNormAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + Homogenization.maxDescendantBBlockNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + (d : ℝ) * maxDescendantBMatrixNormAtScale Q k a := by + have hs : (descendantsAtScale Q k).Nonempty := descendantsAtScale_nonempty Q hk + calc + Homogenization.maxDescendantBBlockNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + finsetSupReal (descendantsAtScale Q k) + (fun R => (d : ℝ) * coarseBMatrixNorm R a) := by + refine finsetSupReal_mono (descendantsAtScale Q k) hs ?_ + intro R hR + exact coarseBBlockNorm_le_dim_mul_coarseBMatrixNorm_of_mem_descendantsAtScale + (a := a) hk hR + _ ≤ (d : ℝ) * maxDescendantBMatrixNormAtScale Q k a := by + exact finsetSupReal_const_mul_le (descendantsAtScale Q k) hs + (Nat.cast_nonneg d) (fun R => coarseBMatrixNorm R a) + +theorem maxDescendantSigmaStarInvNormAtScale_le_dim_mul_maxDescendantSigmaStarInvMatrixNormAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + Homogenization.maxDescendantSigmaStarInvNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + (d : ℝ) * maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + have hs : (descendantsAtScale Q k).Nonempty := descendantsAtScale_nonempty Q hk + calc + Homogenization.maxDescendantSigmaStarInvNormAtScale Q k + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) ≤ + finsetSupReal (descendantsAtScale Q k) + (fun R => (d : ℝ) * coarseSigmaStarInvMatrixNorm R a) := by + refine finsetSupReal_mono (descendantsAtScale Q k) hs ?_ + intro R hR + exact coarseSigmaStarInvBlockNorm_le_dim_mul_coarseSigmaStarInvMatrixNorm_of_mem_descendantsAtScale + (a := a) hk hR + _ ≤ (d : ℝ) * maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + exact finsetSupReal_const_mul_le (descendantsAtScale Q k) hs + (Nat.cast_nonneg d) (fun R => coarseSigmaStarInvMatrixNorm R a) + +theorem maxDescendantBMatrixNormAtScale_le_old_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantBMatrixNormAtScale R l a ≤ + Homogenization.maxDescendantBBlockNormAtScale R l + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + have hRscale : R.scale = k := Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hlQ : l ≤ Q.scale := by + exact le_trans (by simpa [hRscale] using hl) hk + refine finsetSupReal_mono (descendantsAtScale R l) + (descendantsAtScale_nonempty R hl) ?_ + intro S hS + exact coarseBMatrixNorm_le_coarseBBlockNorm_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := S) (k := l) hlQ + (Homogenization.mem_descendantsAtScale_trans hR hS) + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_le_old_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantSigmaStarInvMatrixNormAtScale R l a ≤ + Homogenization.maxDescendantSigmaStarInvNormAtScale R l + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q)) := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + have hRscale : R.scale = k := Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hlQ : l ≤ Q.scale := by + exact le_trans (by simpa [hRscale] using hl) hk + refine finsetSupReal_mono (descendantsAtScale R l) + (descendantsAtScale_nonempty R hl) ?_ + intro S hS + exact coarseSigmaStarInvMatrixNorm_le_coarseSigmaStarInvBlockNorm_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := S) (k := l) hlQ + (Homogenization.mem_descendantsAtScale_trans hR hS) + +theorem maxDescendantBMatrixNormAtScale_self {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + maxDescendantBMatrixNormAtScale Q Q.scale a = coarseBMatrixNorm Q a := by + unfold maxDescendantBMatrixNormAtScale finsetSupReal + simp [descendantsAtScale_self] + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_self {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : + maxDescendantSigmaStarInvMatrixNormAtScale Q Q.scale a = + coarseSigmaStarInvMatrixNorm Q a := by + unfold maxDescendantSigmaStarInvMatrixNormAtScale finsetSupReal + simp [descendantsAtScale_self] + +theorem maxDescendantBMatrixNormAtScale_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (_hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) : + 0 ≤ maxDescendantBMatrixNormAtScale Q k a := by + exact finsetSupReal_nonneg (descendantsAtScale Q k) + (fun R => coarseBMatrixNorm R a) + (fun R _hR => coarseBMatrixNorm_nonneg R a) + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (_hk : k ≤ Q.scale) + (a : TriadicCoeffFamily d) : + 0 ≤ maxDescendantSigmaStarInvMatrixNormAtScale Q k a := by + exact finsetSupReal_nonneg (descendantsAtScale Q k) + (fun R => coarseSigmaStarInvMatrixNorm R a) + (fun R _hR => coarseSigmaStarInvMatrixNorm_nonneg R a) + +theorem maxDescendantBMatrixNormAtScale_le_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantBMatrixNormAtScale R l a ≤ + maxDescendantBMatrixNormAtScale Q l a := by + refine finsetSupReal_le_of_subset (descendantsAtScale R l) + (descendantsAtScale Q l) (descendantsAtScale_nonempty R hl) ?_ + (fun S => coarseBMatrixNorm S a) + intro S hS + exact Homogenization.mem_descendantsAtScale_trans hR hS + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_le_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantSigmaStarInvMatrixNormAtScale R l a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q l a := by + refine finsetSupReal_le_of_subset (descendantsAtScale R l) + (descendantsAtScale Q l) (descendantsAtScale_nonempty R hl) ?_ + (fun S => coarseSigmaStarInvMatrixNorm S a) + intro S hS + exact Homogenization.mem_descendantsAtScale_trans hR hS + +theorem maxDescendantBMatrixNormAtScale_le_of_le + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {l k : ℤ} (hlk : l ≤ k) (hk : k ≤ Q.scale) : + maxDescendantBMatrixNormAtScale Q k a ≤ + maxDescendantBMatrixNormAtScale Q l a := by + refine finsetSupReal_le (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) ?_ + intro R hR + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hlR : l ≤ R.scale := by + simpa [hRscale] using hlk + exact (coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale R hlR a).trans + (maxDescendantBMatrixNormAtScale_le_of_mem_descendantsAtScale a hR hlR) + +theorem maxDescendantSigmaStarInvMatrixNormAtScale_le_of_le + {d : ℕ} [NeZero d] (a : TriadicCoeffFamily d) + (Q : TriadicCube d) {l k : ℤ} (hlk : l ≤ k) (hk : k ≤ Q.scale) : + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + maxDescendantSigmaStarInvMatrixNormAtScale Q l a := by + refine finsetSupReal_le (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) ?_ + intro R hR + have hRscale : R.scale = k := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hlR : l ≤ R.scale := by + simpa [hRscale] using hlk + exact + (coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale + R hlR a).trans + (maxDescendantSigmaStarInvMatrixNormAtScale_le_of_mem_descendantsAtScale a hR hlR) + +theorem summable_old_B_series_pointwiseCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable (fun n : ℕ => + Homogenization.geometricWeight s q n * + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (q / 2)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ * + (a.coeffOn Q).Lam ^ 2 + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := q) (C := Real.rpow C (q / 2)) (mul_pos hs hq) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (Homogenization.maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) A) _ + · intro n + have hbound : + Homogenization.maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) A ≤ C := by + simpa [A, C] using + Homogenization.maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) hEll hData n + exact Real.rpow_le_rpow + (Homogenization.maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) A) + hbound (by positivity) + +theorem summable_old_sigmaStarInv_series_pointwiseCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable (fun n : ℕ => + Homogenization.geometricWeight s q n * + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) + (Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q))) + (q / 2)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * (a.coeffOn Q).lam⁻¹ + have hEll : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (cubeDomain Q) (a.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := q) (C := Real.rpow C (q / 2)) (mul_pos hs hq) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (Homogenization.maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) A) _ + · intro n + have hbound : + Homogenization.maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) A ≤ C := by + simpa [A, C] using + Homogenization.maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) hEll hData n + exact Real.rpow_le_rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) A) + hbound (by positivity) + +theorem summable_B_series_pointwiseCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow + (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hOld := summable_old_B_series_pointwiseCoeffField Q a hs hq + refine Summable.of_nonneg_of_le ?_ ?_ (by simpa [A] using hOld) + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hq.le) + · exact Real.rpow_nonneg + (maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) _ + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight : 0 ≤ geometricWeight s q n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hq.le) + have hmax := + maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow (maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) ≤ + Real.rpow + (Homogenization.maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) A) (q / 2) := by + exact Real.rpow_le_rpow + (maxDescendantBMatrixNormAtScale_nonneg Q (sub_le_self _ hn) a) + (by simpa [A] using hmax) (by positivity) + exact mul_le_mul_of_nonneg_left hpow hweight + +theorem summable_sigmaStarInv_series_pointwiseCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (cubeDomain Q) (a.coeffOn Q) + have hOld := summable_old_sigmaStarInv_series_pointwiseCoeffField Q a hs hq + refine Summable.of_nonneg_of_le ?_ ?_ (by simpa [A] using hOld) + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + refine mul_nonneg ?_ ?_ + · simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hq.le) + · exact Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ hn) a) _ + · intro n + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hweight : 0 ≤ geometricWeight s q n := by + simpa [geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg n (mul_nonneg hs.le hq.le) + have hmax := + maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + (a := a) Q (sub_le_self _ hn) + have hpow : + Real.rpow + (maxDescendantSigmaStarInvMatrixNormAtScale Q + (Q.scale - (n : ℤ)) a) (q / 2) ≤ + Real.rpow + (Homogenization.maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) A) (q / 2) := by + exact Real.rpow_le_rpow + (maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ hn) a) + (by simpa [A] using hmax) (by positivity) + exact mul_le_mul_of_nonneg_left hpow hweight + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticityDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticityDefinitions.lean new file mode 100644 index 0000000000..ba0a1ba387 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/MultiscaleEllipticityDefinitions.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity + +/-! # Multiscale Ellipticity Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-! +# Public Chapter 2.5 Multiscale Ellipticity Theorem Surface + +These are proposition-valued theorem packages for the basic Sec. 2.5 facts. +They are statements only: proving the packages belongs in the companion theorem +files and internal bridge layer. +-/ + +/-- Public theorem package for the order and localization facts in +`l.multiscale.ellipticity.basic.definitions`. + +The package is phrased in the downstream form needed by Chapter 3: besides the +displayed one-cube maxima, it includes individual descendant localization +lemmas for `\Lambda`, `\lambda^{-1}`, and `\Theta`. -/ +structure MultiscaleEllipticityBasicTheory {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : TriadicCoeffFamily d) : Prop where + LambdaSq_nonneg : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → 0 ≤ LambdaSq Q s q a + lambdaSq_nonneg : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → 0 ≤ lambdaSq Q s q a + LambdaSq_pos : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → 0 < LambdaSq Q s q a + lambdaSq_pos : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → 0 < lambdaSq Q s q a + oneCube_sigmaStarInv_le_b : + (coarseSigmaStarInvMatrixNorm Q a)⁻¹ ≤ coarseBMatrixNorm Q a + lambdaSq_mono : + ∀ {t s : ℝ} {q : MultiscaleExponent}, + 0 < t → t < s → q.IsAdmissible → + lambdaSq Q t q a ≤ lambdaSq Q s q a + LambdaSq_antitone : + ∀ {t s : ℝ} {q : MultiscaleExponent}, + 0 < t → t < s → q.IsAdmissible → + LambdaSq Q s q a ≤ LambdaSq Q t q a + lambdaSq_le_oneCube : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → + lambdaSq Q s q a ≤ (coarseSigmaStarInvMatrixNorm Q a)⁻¹ + oneCube_b_le_LambdaSq : + ∀ {s : ℝ} {q : MultiscaleExponent}, + 0 < s → q.IsAdmissible → + coarseBMatrixNorm Q a ≤ LambdaSq Q s q a + maxDescendant_b_le_maxDescendant_LambdaSq : + ∀ {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + k ≤ Q.scale → 0 < s → q.IsAdmissible → + maxDescendantBMatrixNormAtScale Q k a ≤ + maxDescendantUpperEllipticityAtScale Q k s q a + maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv : + ∀ {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + k ≤ Q.scale → 0 < s → q.IsAdmissible → + maxDescendantSigmaStarInvMatrixNormAtScale Q k a ≤ + maxDescendantLowerEllipticityInvAtScale Q k s q a + maxDescendant_LambdaSq_le : + ∀ {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + k ≤ Q.scale → 0 < s → q.IsAdmissible → + maxDescendantUpperEllipticityAtScale Q k s q a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s q a + maxDescendant_lambdaSq_inv_le : + ∀ {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + k ≤ Q.scale → 0 < s → q.IsAdmissible → + maxDescendantLowerEllipticityInvAtScale Q k s q a ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s q a)⁻¹ + descendant_LambdaSq_le : + ∀ {R : TriadicCube d} {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + R ∈ descendantsAtScale Q k → 0 < s → q.IsAdmissible → + LambdaSq R s q a ≤ + multiscaleDescendantWeight Q k s * LambdaSq Q s q a + descendant_lambdaSq_inv_le : + ∀ {R : TriadicCube d} {k : ℤ} {s : ℝ} {q : MultiscaleExponent}, + R ∈ descendantsAtScale Q k → 0 < s → q.IsAdmissible → + (lambdaSq R s q a)⁻¹ ≤ + multiscaleDescendantWeight Q k s * (lambdaSq Q s q a)⁻¹ + ThetaRatio_nonneg : + ∀ {s t : ℝ}, 0 < s → 0 < t → 0 ≤ ThetaRatio Q s t a + one_le_ThetaRatio_of_pos : + ∀ {s t : ℝ}, 0 < s → 0 < t → 1 ≤ ThetaRatio Q s t a + one_le_ThetaRatio : + ∀ {s t : ℝ}, 0 < t → t < s → 1 ≤ ThetaRatio Q s t a + descendant_ThetaRatio_le : + ∀ {R : TriadicCube d} {k : ℤ} {s t : ℝ}, + R ∈ descendantsAtScale Q k → 0 < t → t < s → + ThetaRatio R s t a ≤ + (multiscaleDescendantWeight Q k s * + multiscaleDescendantWeight Q k t) * + ThetaRatio Q s t a + descendant_ThetaRatio_rpow_half_le : + ∀ {R : TriadicCube d} {k : ℤ} {s t : ℝ}, + R ∈ descendantsAtScale Q k → 0 < t → t < s → + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow + ((multiscaleDescendantWeight Q k s * + multiscaleDescendantWeight Q k t) * + ThetaRatio Q s t a) + (1 / 2 : ℝ) + +/-- Public theorem package for +`e.ellipticities.change.q.basic.definitions`. + +The constant is stated once per dimension and is then uniform in cube, +coefficient family, and finite exponents. -/ +structure MultiscaleEllipticityChangeExponentTheory (d : ℕ) : Prop where + exists_change_exponent_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube d) (a : TriadicCoeffFamily d) + {s p q : ℝ}, + 0 < s → s ≤ 1 → 1 ≤ p → p ≤ q → + LambdaSq Q s (.finite q) a ≤ + C * Real.rpow s (2 / q - 2 / p) * + LambdaSq Q s (.finite p) a ∧ + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + C * Real.rpow s (2 / q - 2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ + +/-- Public theorem package asserting that the Sec. 2.5 quantities depend only +on the a.e. coefficient family. -/ +structure MultiscaleEllipticityAEEqTheory (d : ℕ) : Prop where + coarseBMatrixNorm_eq_ofAEEq : + ∀ {a b : TriadicCoeffFamily d}, TriadicCoeffFamily.AEEq a b → + ∀ Q : TriadicCube d, + coarseBMatrixNorm Q a = coarseBMatrixNorm Q b + coarseSigmaStarInvMatrixNorm_eq_ofAEEq : + ∀ {a b : TriadicCoeffFamily d}, TriadicCoeffFamily.AEEq a b → + ∀ Q : TriadicCube d, + coarseSigmaStarInvMatrixNorm Q a = + coarseSigmaStarInvMatrixNorm Q b + LambdaSq_eq_ofAEEq : + ∀ {a b : TriadicCoeffFamily d}, TriadicCoeffFamily.AEEq a b → + ∀ (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent), + LambdaSq Q s q a = LambdaSq Q s q b + lambdaSq_eq_ofAEEq : + ∀ {a b : TriadicCoeffFamily d}, TriadicCoeffFamily.AEEq a b → + ∀ (Q : TriadicCube d) (s : ℝ) (q : MultiscaleExponent), + lambdaSq Q s q a = lambdaSq Q s q b + ThetaRatio_eq_ofAEEq : + ∀ {a b : TriadicCoeffFamily d}, TriadicCoeffFamily.AEEq a b → + ∀ (Q : TriadicCube d) (s t : ℝ), + ThetaRatio Q s t a = ThetaRatio Q s t b + +/-- Aggregate public theorem package for Sec. 2.5. -/ +structure MultiscaleEllipticityTheory (d : ℕ) [NeZero d] : Prop where + basic : + ∀ (Q : TriadicCube d) (a : TriadicCoeffFamily d), + MultiscaleEllipticityBasicTheory Q a + change_exponent : + MultiscaleEllipticityChangeExponentTheory d + aeeq : + MultiscaleEllipticityAEEqTheory d + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Quadraticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Quadraticity.lean new file mode 100644 index 0000000000..7c853ad84f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/Quadraticity.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Quadraticity + +/-! # Quadraticity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public Chapter 2 quadraticity theorem for the response functional. -/ +theorem responseQuadraticTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseQuadraticTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseQuadraticTheory U a + +/-- Public homogeneity identity for the response functional. -/ +theorem responseJ_smul {d : ℕ} {U : Domain d} {a : CoeffOn U} + (c : ℝ) (p q : Vec d) : + responseJ U a (c • p) (c • q) = c ^ 2 * responseJ U a p q := + (responseQuadraticTheory U a).responseJ_smul c p q + +/-- Public parallelogram identity for the response functional. -/ +theorem responseJ_parallelogram {d : ℕ} {U : Domain d} {a : CoeffOn U} + (p1 q1 p2 q2 : Vec d) : + responseJ U a (p1 + p2) (q1 + q2) + + responseJ U a (p1 - p2) (q1 - q2) = + 2 * responseJ U a p1 q1 + 2 * responseJ U a p2 q2 := + (responseQuadraticTheory U a).responseJ_parallelogram p1 q1 p2 q2 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/QuadraticityDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/QuadraticityDefinitions.lean new file mode 100644 index 0000000000..1591d55308 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/QuadraticityDefinitions.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions + +/-! # Quadraticity Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for the statement that `(p,q) ↦ J(U,p,q;a)` is +quadratic. + +The two fields are the homogeneity and parallelogram identities. The canonical +public theorem proving this package is `responseQuadraticTheory` in +`Quadraticity.lean`. -/ +structure ResponseQuadraticTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : Prop where + responseJ_smul : + ∀ c : ℝ, ∀ p q : Vec d, + responseJ U a (c • p) (c • q) = c ^ 2 * responseJ U a p q + responseJ_parallelogram : + ∀ p1 q1 p2 q2 : Vec d, + responseJ U a (p1 + p2) (q1 + q2) + + responseJ U a (p1 - p2) (q1 - q2) = + 2 * responseJ U a p1 q1 + 2 * responseJ U a p2 q2 + +namespace ResponseQuadraticTheory + +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) + (hQuad : ResponseQuadraticTheory U a) : + ResponseQuadraticTheory U b where + responseJ_smul := by + intro c p q + calc + responseJ U b (c • p) (c • q) + = responseJ U a (c • p) (c • q) := by + rw [responseJ_eq_ofAEEq h (c • p) (c • q)] + _ = c ^ 2 * responseJ U a p q := hQuad.responseJ_smul c p q + _ = c ^ 2 * responseJ U b p q := by + rw [responseJ_eq_ofAEEq h p q] + responseJ_parallelogram := by + intro p1 q1 p2 q2 + calc + responseJ U b (p1 + p2) (q1 + q2) + + responseJ U b (p1 - p2) (q1 - q2) + = responseJ U a (p1 + p2) (q1 + q2) + + responseJ U a (p1 - p2) (q1 - q2) := by + rw [responseJ_eq_ofAEEq h (p1 + p2) (q1 + q2)] + rw [responseJ_eq_ofAEEq h (p1 - p2) (q1 - q2)] + _ = 2 * responseJ U a p1 q1 + 2 * responseJ U a p2 q2 := + hQuad.responseJ_parallelogram p1 q1 p2 q2 + _ = 2 * responseJ U b p1 q1 + 2 * responseJ U b p2 q2 := by + rw [responseJ_eq_ofAEEq h p1 q1] + rw [responseJ_eq_ofAEEq h p2 q2] + +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + (h : CoeffOn.AEEq a b) : + ResponseQuadraticTheory U a ↔ ResponseQuadraticTheory U b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +end ResponseQuadraticTheory + +theorem responseJ_smul_of_responseQuadraticTheory {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hQuad : ResponseQuadraticTheory U a) (c : ℝ) (p q : Vec d) : + responseJ U a (c • p) (c • q) = c ^ 2 * responseJ U a p q := + hQuad.responseJ_smul c p q + +theorem responseJ_parallelogram_of_responseQuadraticTheory {d : ℕ} + {U : Domain d} {a : CoeffOn U} + (hQuad : ResponseQuadraticTheory U a) (p1 q1 p2 q2 : Vec d) : + responseJ U a (p1 + p2) (q1 + q2) + + responseJ U a (p1 - p2) (q1 - q2) = + 2 * responseJ U a p1 q1 + 2 * responseJ U a p2 q2 := + hQuad.responseJ_parallelogram p1 q1 p2 q2 + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SolutionIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SolutionIntegrability.lean new file mode 100644 index 0000000000..e4e3079fb5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SolutionIntegrability.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives + +/-! # Solution Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +namespace Solution + +/-- Public solutions have `L²` flux on their Chapter 2 domain. + +The public coefficient object is only a.e.-elliptic. The proof changes to the +internal pointwise-good representative, applies the deterministic flux `L²` +bound there, and transports the result back across the a.e. equality of +coefficient representatives. -/ +theorem flux_memVectorL2 {d : ℕ} {U : Domain d} {a : CoeffOn U} + (u : Solution U a) : + MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (u.toH1.grad x)) := by + let b : CoeffOn U := Internal.Ch02.BookCh02.pointwiseCoeffOn U a + have hb : CoeffOn.AEEq b a := by + simpa [b] using Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn U a + have hbase : + MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (b.toCoeffField x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + refine MeasureTheory.MemLp.ae_eq ?_ hbase + exact hb.mono fun x hx => by + simp [hx] + +end Solution + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScaling.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScaling.lean new file mode 100644 index 0000000000..3da84d5941 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScaling.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SubadditivityScaling + +/-! # Subadditivity Scaling -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem for `l.cg.subadditivity.basic.definitions`. -/ +theorem responseSubadditivityAndScalingTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ResponseSubadditivityAndScalingTheory U a := + Homogenization.Internal.Ch02.BookCh02.responseSubadditivityAndScalingTheory U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScalingDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScalingDefinitions.lean new file mode 100644 index 0000000000..cd45cc99bb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SubadditivityScalingDefinitions.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction + +/-! # Subadditivity Scaling Definitions -/ + +@[expose] public section + +open scoped BigOperators + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public triadic partition scaffold for the Chapter 2 subadditivity theorem. + +The LaTeX statement is over triadic subcubes of a larger cube. The public +Book-layer theorem keeps a small abstraction here, but the abstraction carries a +triadic realization: cells enumerate descendants of one parent triadic cube, and +the weights are the uniform `\avsum` weights from the notes. -/ +structure DomainPartition {d : ℕ} (U : Domain d) where + Cell : Type + [instFintype : Fintype Cell] + cell : Cell → Domain d + cell_subset_parent : ∀ i : Cell, (cell i : Set (Vec d)) ⊆ (U : Set (Vec d)) + weight : Cell → ℝ + weight_nonneg : ∀ i : Cell, 0 ≤ weight i + weight_sum_one : ∑ i : Cell, weight i = 1 + triadic_realization : + ∃ root : TriadicCube d, ∃ depth : ℕ, + (U : Set (Vec d)) = openCubeSet root ∧ + ∃ e : Cell ≃ {R : TriadicCube d // R ∈ descendantsAtDepth root depth}, + ∀ i : Cell, + (cell i : Set (Vec d)) = openCubeSet ((e i).1) ∧ + weight i = ((Fintype.card Cell : ℝ)⁻¹) + +namespace DomainPartition + +/-- Weighted average over the cells of a public finite partition. -/ +noncomputable def weightedAverage {d : ℕ} {U : Domain d} + (P : DomainPartition U) (f : P.Cell → ℝ) : ℝ := by + classical + letI : Fintype P.Cell := P.instFintype + exact ∑ i : P.Cell, P.weight i * f i + +/-- Weighted matrix average over the cells of a public finite partition. -/ +noncomputable def weightedMatAverage {d : ℕ} {U : Domain d} + (P : DomainPartition U) (F : P.Cell → Mat d) : Mat d := + fun i j => P.weightedAverage fun c => F c i j + +/-- Weighted block-matrix average over the cells of a public finite partition. -/ +noncomputable def weightedBlockAverage {d : ℕ} {U : Domain d} + (P : DomainPartition U) (F : P.Cell → BlockMat d) : BlockMat d := + { upperLeft := P.weightedMatAverage fun c => (F c).upperLeft + upperRight := P.weightedMatAverage fun c => (F c).upperRight + lowerLeft := P.weightedMatAverage fun c => (F c).lowerLeft + lowerRight := P.weightedMatAverage fun c => (F c).lowerRight } + +end DomainPartition + +/-- Public theorem package for `l.cg.subadditivity.basic.definitions`. + +Coefficient rescaling is stated a.e. by `CoeffOn.AEScaled`, not by pointwise +equality of representatives. The canonical public theorem proving this package +is `responseSubadditivityAndScalingTheory` in `SubadditivityScaling.lean`. -/ +structure ResponseSubadditivityAndScalingTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : Prop where + responseJ_subadditive : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)) + (_hCell : ∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) + (p q : Vec d), + responseJ U a p q ≤ + P.weightedAverage fun i => responseJ (P.cell i) (aCell i) p q + responseJ_homogeneous : + ∀ {lam : ℝ}, 0 < lam → ∀ {b : CoeffOn U}, + CoeffOn.AEScaled lam a b → + ∀ p q : Vec d, + responseJ U b p q = + responseJ U a ((Real.sqrt lam) • p) ((Real.sqrt lam)⁻¹ • q) + sigma_homogeneous : + ∀ {lam : ℝ}, 0 < lam → ∀ {b : CoeffOn U}, + CoeffOn.AEScaled lam a b → + sigmaCoarse U b = lam • sigmaCoarse U a + sigmaStar_homogeneous : + ∀ {lam : ℝ}, 0 < lam → ∀ {b : CoeffOn U}, + CoeffOn.AEScaled lam a b → + sigmaStarCoarse U b = lam • sigmaStarCoarse U a + kappa_homogeneous : + ∀ {lam : ℝ}, 0 < lam → ∀ {b : CoeffOn U}, + CoeffOn.AEScaled lam a b → + kappaCoarse U b = lam • kappaCoarse U a + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumann.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumann.lean new file mode 100644 index 0000000000..d1def64605 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumann.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann + +/-! # Symmetric Dirichlet Neumann -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public symmetric Dirichlet--Neumann theorem package +`l.symmetric.dirichlet.neumann.split.basic.definitions`. + +The coefficient hypotheses are note-facing and a.e.-native: `a` is a public +coefficient field on a bounded open convex Chapter 2 domain, and `hsym` is +symmetry almost everywhere on that domain. -/ +theorem responseSymmetricDirichletNeumannTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + ResponseSymmetricDirichletNeumannTheory U a hsym := + Homogenization.Internal.Ch02.BookCh02.responseSymmetricDirichletNeumannTheory + U a hsym + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumannDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumannDefinitions.lean new file mode 100644 index 0000000000..ce402d43ab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/SymmetricDirichletNeumannDefinitions.lean @@ -0,0 +1,213 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Symmetric + +/-! # Symmetric Dirichlet Neumann Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +noncomputable section + +/-- Public theorem package for +`l.symmetric.dirichlet.neumann.split.basic.definitions`. + +The symmetric hypothesis is a.e.-native: no public theorem in this package uses +pointwise symmetry of the coefficient representative. The canonical public +theorem proving this package is `responseSymmetricDirichletNeumannTheory` in +`SymmetricDirichletNeumann.lean`. -/ +structure ResponseSymmetricDirichletNeumannTheory {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : Prop where + dirichlet_minimizer_exists : + ∀ p : Vec d, + ∃ u : H1Function (U : Set (Vec d)), + IsSymmetricDirichletMinimizer U a p u + neumann_meanZero_maximizer_exists : + ∀ q : Vec d, + ∃ u : H1Function (U : Set (Vec d)), + MeanZeroOn (U : Set (Vec d)) u.toFun ∧ + IsSymmetricNeumannMaximizer U a q u + response_maximizer_split : + ∀ p q : Vec d, ∀ v : Solution U a, + IsResponseMaximizer U a p q v → + ∀ uD uN : H1Function (U : Set (Vec d)), + IsSymmetricDirichletMinimizer U a p uD → + IsSymmetricNeumannMaximizer U a q uN → + v.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => uN.grad x - uD.grad x + response_dirichlet_neumann_split : + ∀ p q : Vec d, + responseJ U a p q = + symmetricDirichletNu U a p + symmetricNeumannNu U a q - vecDot p q + dirichlet_value_by_sigma : + ∀ p : Vec d, + symmetricDirichletNu U a p = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + neumann_value_by_sigmaStarInv : + ∀ q : Vec d, + symmetricNeumannNu U a q = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) + kappa_eq_zero : + kappaCoarse U a = 0 + dirichlet_average_gradient : + ∀ p : Vec d, ∀ uD : H1Function (U : Set (Vec d)), + IsSymmetricDirichletMinimizer U a p uD → + h1AverageGradient U uD = p + dirichlet_average_flux : + ∀ p : Vec d, ∀ uD : H1Function (U : Set (Vec d)), + IsSymmetricDirichletMinimizer U a p uD → + h1AverageFlux U a uD = matVecMul (sigmaCoarse U a) p + neumann_average_flux : + ∀ q : Vec d, ∀ uN : H1Function (U : Set (Vec d)), + IsSymmetricNeumannMaximizer U a q uN → + h1AverageFlux U a uN = q + neumann_average_gradient : + ∀ q : Vec d, ∀ uN : H1Function (U : Set (Vec d)), + IsSymmetricNeumannMaximizer U a q uN → + h1AverageGradient U uN = matVecMul (sigmaStarInvCoarse U a) q + response_completed_square : + ∀ p q : Vec d, + responseJ U a p q = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a) p)) + derived_matrices : + aCoarse U a = sigmaCoarse U a ∧ + aStarCoarse U a = sigmaStarCoarse U a ∧ + bCoarse U a = sigmaCoarse U a + dirichlet_neumann_bracketing : + MatLoewnerLE (averagedSymmPartInv U a)⁻¹ (sigmaStarCoarse U a) ∧ + MatLoewnerLE (sigmaStarCoarse U a) (sigmaCoarse U a) ∧ + MatLoewnerLE (sigmaCoarse U a) (averageMat U a.toCoeffField) + +namespace ResponseSymmetricDirichletNeumannTheory + +/-- Transport the full symmetric Dirichlet--Neumann theorem package across an +a.e. coefficient change. -/ +theorem ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + {hsym_a : CoeffOn.IsSymmetric a} {hsym_b : CoeffOn.IsSymmetric b} + (h : CoeffOn.AEEq a b) + (hTheory : ResponseSymmetricDirichletNeumannTheory U a hsym_a) : + ResponseSymmetricDirichletNeumannTheory U b hsym_b where + dirichlet_minimizer_exists := by + intro p + rcases hTheory.dirichlet_minimizer_exists p with ⟨u, hu⟩ + exact ⟨u, hu.ofAEEq h⟩ + neumann_meanZero_maximizer_exists := by + intro q + rcases hTheory.neumann_meanZero_maximizer_exists q with ⟨u, hmean, hu⟩ + exact ⟨u, hmean, hu.ofAEEq h⟩ + response_maximizer_split := by + intro p q v hv uD uN huD huN + let va : Solution U a := Solution.ofAEEq h.symm v + have hmax_a : IsResponseMaximizer U a p q va := hv.ofAEEq h.symm + have huD_a : IsSymmetricDirichletMinimizer U a p uD := + huD.ofAEEq h.symm + have huN_a : IsSymmetricNeumannMaximizer U a q uN := + huN.ofAEEq h.symm + have hsplit := + hTheory.response_maximizer_split p q va hmax_a uD uN huD_a huN_a + simpa [va] using hsplit + response_dirichlet_neumann_split := by + intro p q + simpa [responseJ_eq_ofAEEq h p q, + symmetricDirichletNu_eq_ofAEEq h p, + symmetricNeumannNu_eq_ofAEEq h q] using + hTheory.response_dirichlet_neumann_split p q + dirichlet_value_by_sigma := by + intro p + simpa [symmetricDirichletNu_eq_ofAEEq h p, + sigmaCoarse_eq_ofAEEq h] using hTheory.dirichlet_value_by_sigma p + neumann_value_by_sigmaStarInv := by + intro q + simpa [symmetricNeumannNu_eq_ofAEEq h q, + sigmaStarInvCoarse_eq_ofAEEq h] using + hTheory.neumann_value_by_sigmaStarInv q + kappa_eq_zero := by + simpa [kappaCoarse_eq_ofAEEq h] using hTheory.kappa_eq_zero + dirichlet_average_gradient := by + intro p uD huD + exact hTheory.dirichlet_average_gradient p uD (huD.ofAEEq h.symm) + dirichlet_average_flux := by + intro p uD huD + have hflux := + hTheory.dirichlet_average_flux p uD (huD.ofAEEq h.symm) + simpa [h1AverageFlux_eq_ofAEEq h uD, sigmaCoarse_eq_ofAEEq h] using hflux + neumann_average_flux := by + intro q uN huN + have hflux := + hTheory.neumann_average_flux q uN (huN.ofAEEq h.symm) + simpa [h1AverageFlux_eq_ofAEEq h uN] using hflux + neumann_average_gradient := by + intro q uN huN + simpa [sigmaStarInvCoarse_eq_ofAEEq h] using + hTheory.neumann_average_gradient q uN (huN.ofAEEq h.symm) + response_completed_square := by + intro p q + simpa [responseJ_eq_ofAEEq h p q, sigmaCoarse_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h, sigmaStarInvCoarse_eq_ofAEEq h] using + hTheory.response_completed_square p q + derived_matrices := by + simpa [aCoarse_eq_ofAEEq h, aStarCoarse_eq_ofAEEq h, + bCoarse_eq_ofAEEq h, sigmaCoarse_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h] using hTheory.derived_matrices + dirichlet_neumann_bracketing := by + simpa [averagedSymmPartInv_eq_ofAEEq h, + sigmaStarCoarse_eq_ofAEEq h, sigmaCoarse_eq_ofAEEq h, + averageMat_toCoeffField_eq_ofAEEq h] using + hTheory.dirichlet_neumann_bracketing + +/-- A.e.-equivalent coefficient representatives satisfy the same symmetric +Dirichlet--Neumann theorem package. -/ +theorem iff_ofAEEq {d : ℕ} {U : Domain d} {a b : CoeffOn U} + {hsym_a : CoeffOn.IsSymmetric a} {hsym_b : CoeffOn.IsSymmetric b} + (h : CoeffOn.AEEq a b) : + ResponseSymmetricDirichletNeumannTheory U a hsym_a ↔ + ResponseSymmetricDirichletNeumannTheory U b hsym_b := + ⟨ofAEEq h, ofAEEq h.symm⟩ + +/-- Accessor for the symmetric completed-square formula +`e.symmetric.J.completed.square.basic.definitions`. -/ +theorem response_completed_square_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} + {hsym : CoeffOn.IsSymmetric a} + (h : ResponseSymmetricDirichletNeumannTheory U a hsym) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a) p)) := + h.response_completed_square p q + +/-- Accessor for the symmetric Dirichlet--Neumann gap formula +`e.symmetric.J.DN.gap.basic.definitions`, in the public coarse-matrix form. -/ +theorem response_gap_eq {d : ℕ} {U : Domain d} {a : CoeffOn U} + {hsym : CoeffOn.IsSymmetric a} + (h : ResponseSymmetricDirichletNeumannTheory U a hsym) (p : Vec d) : + responseJ U a p (matVecMul (sigmaStarCoarse U a) p) = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [vecDot, matVecMul] using + h.response_completed_square p (matVecMul (sigmaStarCoarse U a) p) + +end ResponseSymmetricDirichletNeumannTheory + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/WrapAround.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/WrapAround.lean new file mode 100644 index 0000000000..1313af9fb6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch02/Theorems/WrapAround.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds + +/-! # Wrap Around -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch02 + +open scoped BigOperators + +noncomputable section + +/-! +# Deterministic wrap-around estimates + +This file contains the Chapter 2 deterministic engine behind the wrap-around +argument: finite partition subadditivity for coarse block matrices, expressed +as a normalized trace defect controlled by the averaged special-coordinate +doubled-response `J` budget. +-/ + +/-- Full-block trace of a finite matrix. -/ +noncomputable def fullBlockTrace {d : ℕ} (M : FullBlockMat d) : ℝ := + ∑ α : BlockCoord d, M α α + +/-- A block Löwner comparison controls diagonal entries of the upper-left +block. -/ +theorem blockMatLoewnerLE_upperLeft_apply {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) (i : Fin d) : + A.upperLeft i i ≤ B.upperLeft i i := by + have hquad := h (Pi.single i 1, 0) + have hA : + blockVecDot (Pi.single i 1, 0) + (blockMatVecMul A (Pi.single i 1, 0)) = A.upperLeft i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + have hB : + blockVecDot (Pi.single i 1, 0) + (blockMatVecMul B (Pi.single i 1, 0)) = B.upperLeft i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + simpa [hA, hB] using hquad + +/-- A block Löwner comparison controls diagonal entries of the lower-right +block. -/ +theorem blockMatLoewnerLE_lowerRight_apply {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) (i : Fin d) : + A.lowerRight i i ≤ B.lowerRight i i := by + have hquad := h (0, Pi.single i 1) + have hA : + blockVecDot (0, Pi.single i 1) + (blockMatVecMul A (0, Pi.single i 1)) = A.lowerRight i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + have hB : + blockVecDot (0, Pi.single i 1) + (blockMatVecMul B (0, Pi.single i 1)) = B.lowerRight i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + simpa [hA, hB] using hquad + +/-- The diagonal block-J trace budget associated with the special coordinate +probes `(σ^{-1/2} e_i, σ^{1/2} e_i)`, written directly in terms of a block +matrix. -/ +noncomputable def specialCoordinateBlockJTraceBudget {d : ℕ} (σ : ℝ) + (A : BlockMat d) : ℝ := + ∑ i : Fin d, + ((1 / 2 : ℝ) * (σ⁻¹ * A.upperLeft i i) + + (1 / 2 : ℝ) * (σ * A.lowerRight i i) - 1) + +theorem specialCoordinateBlockJTraceBudget_sub + {d : ℕ} (σ : ℝ) (A B : BlockMat d) : + specialCoordinateBlockJTraceBudget σ B - + specialCoordinateBlockJTraceBudget σ A = + ∑ i : Fin d, + ((1 / 2 : ℝ) * (σ⁻¹ * (B.upperLeft i i - A.upperLeft i i)) + + (1 / 2 : ℝ) * (σ * (B.lowerRight i i - A.lowerRight i i))) := by + unfold specialCoordinateBlockJTraceBudget + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + +/-- The normalized trace of a positive block additivity defect is controlled +by the special-coordinate trace budget of the upper matrix. -/ +theorem normalizedBlockSubTrace_le_specialCoordinateBlockJTraceBudget + {d : ℕ} {A B : BlockMat d} {σ : ℝ} (r : BlockCoord d → ℝ) + (hAB : BlockMatLoewnerLE A B) + (hrUpper : ∀ i : Fin d, r (Sum.inl i) * r (Sum.inl i) ≤ σ⁻¹) + (hrLower : ∀ i : Fin d, r (Sum.inr i) * r (Sum.inr i) ≤ σ) + (hParentBudget_nonneg : 0 ≤ specialCoordinateBlockJTraceBudget σ A) : + fullBlockTrace + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) ≤ + 2 * specialCoordinateBlockJTraceBudget σ B := by + have hUL_nonneg : ∀ i : Fin d, 0 ≤ B.upperLeft i i - A.upperLeft i i := by + intro i + exact sub_nonneg.mpr (blockMatLoewnerLE_upperLeft_apply hAB i) + have hLR_nonneg : ∀ i : Fin d, 0 ≤ B.lowerRight i i - A.lowerRight i i := by + intro i + exact sub_nonneg.mpr (blockMatLoewnerLE_lowerRight_apply hAB i) + have htrace_le : + fullBlockTrace + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) ≤ + ∑ i : Fin d, + (σ⁻¹ * (B.upperLeft i i - A.upperLeft i i) + + σ * (B.lowerRight i i - A.lowerRight i i)) := by + unfold fullBlockTrace + rw [Fintype.sum_sum_type] + calc + (∑ i : Fin d, + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) (Sum.inl i) (Sum.inl i)) + + ∑ i : Fin d, + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) (Sum.inr i) (Sum.inr i) + = + ∑ i : Fin d, + (r (Sum.inl i) * r (Sum.inl i)) * + (B.upperLeft i i - A.upperLeft i i) + + ∑ i : Fin d, + (r (Sum.inr i) * r (Sum.inr i)) * + (B.lowerRight i i - A.lowerRight i i) := by + congr 1 + · refine Finset.sum_congr rfl ?_ + intro i _hi + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat] + ring + · refine Finset.sum_congr rfl ?_ + intro i _hi + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat] + ring + _ ≤ + ∑ i : Fin d, σ⁻¹ * (B.upperLeft i i - A.upperLeft i i) + + ∑ i : Fin d, σ * (B.lowerRight i i - A.lowerRight i i) := by + exact add_le_add + (Finset.sum_le_sum fun i _hi => + mul_le_mul_of_nonneg_right (hrUpper i) (hUL_nonneg i)) + (Finset.sum_le_sum fun i _hi => + mul_le_mul_of_nonneg_right (hrLower i) (hLR_nonneg i)) + _ = + ∑ i : Fin d, + (σ⁻¹ * (B.upperLeft i i - A.upperLeft i i) + + σ * (B.lowerRight i i - A.lowerRight i i)) := by + rw [Finset.sum_add_distrib] + have hbudget_sub := specialCoordinateBlockJTraceBudget_sub σ A B + have htwice : + ∑ i : Fin d, + (σ⁻¹ * (B.upperLeft i i - A.upperLeft i i) + + σ * (B.lowerRight i i - A.lowerRight i i)) = + 2 * (specialCoordinateBlockJTraceBudget σ B - + specialCoordinateBlockJTraceBudget σ A) := by + rw [hbudget_sub] + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + calc + fullBlockTrace + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) + ≤ ∑ i : Fin d, + (σ⁻¹ * (B.upperLeft i i - A.upperLeft i i) + + σ * (B.lowerRight i i - A.lowerRight i i)) := htrace_le + _ = 2 * (specialCoordinateBlockJTraceBudget σ B - + specialCoordinateBlockJTraceBudget σ A) := htwice + _ ≤ 2 * specialCoordinateBlockJTraceBudget σ B := by + nlinarith + +theorem sum_doubledResponseJ_coordinateScales_eq_specialCoordinateBlockJTraceBudget + {d : ℕ} (U : Domain d) (a : CoeffOn U) + {σ cp cq : ℝ} (hcp2 : cp * cp = σ⁻¹) (hcq2 : cq * cq = σ) + (hcpq : cp * cq = 1) : + (∑ i : Fin d, + doubledResponseJ U a (cp • Pi.single i 1, 0) + (cq • Pi.single i 1, 0)) = + specialCoordinateBlockJTraceBudget σ (coarseBlockMatrix U a) := by + classical + unfold specialCoordinateBlockJTraceBudget + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [(blockCoarseMatrixTheory U a).doubled_response_splitting] + rw [(blockCoarseMatrixTheory U a).starred_inverse_formula] + simp [blockVecDot, blockMatVecMul, blockReflect, matVecMul_smul, + vecDot_smul_left, vecDot_smul_right, matVecMul_single, + vecDot_single_left, vecDot_single_right, matVecMul_zero, + vecDot_zero_left, vecDot_zero_right] + have hcpq' : cq * cp = 1 := by nlinarith + have hcp2' : cp ^ (2 : ℕ) = σ⁻¹ := by nlinarith + have hcq2' : cq ^ (2 : ℕ) = σ := by nlinarith + ring_nf + rw [hcp2', hcq2', hcpq] + ring + +/-- The special-coordinate block-J trace budget commutes with a finite +partition average. -/ +theorem specialCoordinateBlockJTraceBudget_weightedBlockAverage + {d : ℕ} {U : Domain d} (Pcell : DomainPartition U) + (σ : ℝ) (F : Pcell.Cell → BlockMat d) : + specialCoordinateBlockJTraceBudget σ (Pcell.weightedBlockAverage F) = + Pcell.weightedAverage (fun c => specialCoordinateBlockJTraceBudget σ (F c)) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + unfold specialCoordinateBlockJTraceBudget DomainPartition.weightedBlockAverage + DomainPartition.weightedMatAverage DomainPartition.weightedAverage + simp only + symm + calc + (∑ x, Pcell.weight x * ∑ i, + (1 / 2 * (σ⁻¹ * (F x).upperLeft i i) + + 1 / 2 * (σ * (F x).lowerRight i i) - 1)) = + ∑ x, ∑ i, + Pcell.weight x * + (1 / 2 * (σ⁻¹ * (F x).upperLeft i i) + + 1 / 2 * (σ * (F x).lowerRight i i) - 1) := by + refine Finset.sum_congr rfl ?_ + intro x _hx + rw [Finset.mul_sum] + _ = ∑ i, ∑ x, + Pcell.weight x * + (1 / 2 * (σ⁻¹ * (F x).upperLeft i i) + + 1 / 2 * (σ * (F x).lowerRight i i) - 1) := by + rw [Finset.sum_comm] + _ = ∑ i, + (1 / 2 * (σ⁻¹ * ∑ x, Pcell.weight x * (F x).upperLeft i i) + + 1 / 2 * (σ * ∑ x, Pcell.weight x * (F x).lowerRight i i) - 1) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + have hUL : + (∑ x, 1 / 2 * (σ⁻¹ * (Pcell.weight x * (F x).upperLeft i i))) = + 1 / 2 * (σ⁻¹ * ∑ x, Pcell.weight x * (F x).upperLeft i i) := by + calc + (∑ x, 1 / 2 * (σ⁻¹ * (Pcell.weight x * (F x).upperLeft i i))) = + ∑ x, (1 / 2 * σ⁻¹) * (Pcell.weight x * (F x).upperLeft i i) := by + refine Finset.sum_congr rfl ?_ + intro x _hx + ring + _ = (1 / 2 * σ⁻¹) * ∑ x, Pcell.weight x * (F x).upperLeft i i := by + rw [Finset.mul_sum] + _ = 1 / 2 * (σ⁻¹ * ∑ x, Pcell.weight x * (F x).upperLeft i i) := by + ring + have hLR : + (∑ x, 1 / 2 * (σ * (Pcell.weight x * (F x).lowerRight i i))) = + 1 / 2 * (σ * ∑ x, Pcell.weight x * (F x).lowerRight i i) := by + calc + (∑ x, 1 / 2 * (σ * (Pcell.weight x * (F x).lowerRight i i))) = + ∑ x, (1 / 2 * σ) * (Pcell.weight x * (F x).lowerRight i i) := by + refine Finset.sum_congr rfl ?_ + intro x _hx + ring + _ = (1 / 2 * σ) * ∑ x, Pcell.weight x * (F x).lowerRight i i := by + rw [Finset.mul_sum] + _ = 1 / 2 * (σ * ∑ x, Pcell.weight x * (F x).lowerRight i i) := by + ring + calc + (∑ x, Pcell.weight x * + (1 / 2 * (σ⁻¹ * (F x).upperLeft i i) + + 1 / 2 * (σ * (F x).lowerRight i i) - 1)) + = + ∑ x, + ((1 / 2 * (σ⁻¹ * (Pcell.weight x * (F x).upperLeft i i))) + + (1 / 2 * (σ * (Pcell.weight x * (F x).lowerRight i i))) - + Pcell.weight x) := by + refine Finset.sum_congr rfl ?_ + intro x _hx + ring + _ = + (∑ x, 1 / 2 * (σ⁻¹ * (Pcell.weight x * (F x).upperLeft i i))) + + (∑ x, 1 / 2 * (σ * (Pcell.weight x * (F x).lowerRight i i))) - + ∑ x, Pcell.weight x := by + rw [Finset.sum_sub_distrib, Finset.sum_add_distrib] + _ = + 1 / 2 * (σ⁻¹ * ∑ x, Pcell.weight x * (F x).upperLeft i i) + + 1 / 2 * (σ * ∑ x, Pcell.weight x * (F x).lowerRight i i) - 1 := by + rw [hUL, hLR, Pcell.weight_sum_one] + +/-- Weighted averages of symmetric block matrices remain symmetric. -/ +theorem isSymmetricBlockMat_weightedBlockAverage + {d : ℕ} {U : Domain d} (Pcell : DomainPartition U) + (F : Pcell.Cell → BlockMat d) + (hF : ∀ c : Pcell.Cell, IsSymmetricBlockMat (F c)) : + IsSymmetricBlockMat (Pcell.weightedBlockAverage F) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + intro α β + cases α with + | inl i => + cases β with + | inl j => + simp [DomainPartition.weightedBlockAverage, + DomainPartition.weightedMatAverage, DomainPartition.weightedAverage, + blockMatEntry] + refine Finset.sum_congr rfl ?_ + intro c _hc + have h := hF c (Sum.inl j) (Sum.inl i) + simp [blockMatEntry] at h + rw [h] + | inr j => + simp [DomainPartition.weightedBlockAverage, + DomainPartition.weightedMatAverage, DomainPartition.weightedAverage, + blockMatEntry] + refine Finset.sum_congr rfl ?_ + intro c _hc + have h := hF c (Sum.inr j) (Sum.inl i) + simp [blockMatEntry] at h + rw [h] + | inr i => + cases β with + | inl j => + simp [DomainPartition.weightedBlockAverage, + DomainPartition.weightedMatAverage, DomainPartition.weightedAverage, + blockMatEntry] + refine Finset.sum_congr rfl ?_ + intro c _hc + have h := hF c (Sum.inl j) (Sum.inr i) + simp [blockMatEntry] at h + rw [h] + | inr j => + simp [DomainPartition.weightedBlockAverage, + DomainPartition.weightedMatAverage, DomainPartition.weightedAverage, + blockMatEntry] + refine Finset.sum_congr rfl ?_ + intro c _hc + have h := hF c (Sum.inr j) (Sum.inr i) + simp [blockMatEntry] at h + rw [h] + +/-- Main deterministic wrap-around engine: the normalized trace defect between +a parent coarse block matrix and the weighted average of its children is +controlled by the averaged special-coordinate doubled-response budget. -/ +theorem weightedBlockAverage_wrapAround_normalizedTrace_le_specialCoordinateDoubledResponseJ + {d : ℕ} {U : Domain d} (a : CoeffOn U) + (Pcell : DomainPartition U) + (aCell : ∀ c : Pcell.Cell, CoeffOn (Pcell.cell c)) + (hcell : ∀ c : Pcell.Cell, CoeffOn.RestrictsTo a (aCell c)) + {σ cp cq : ℝ} (hcp2 : cp * cp = σ⁻¹) (hcq2 : cq * cq = σ) + (hcpq : cp * cq = 1) (r : BlockCoord d → ℝ) + (hrUpper : ∀ i : Fin d, r (Sum.inl i) * r (Sum.inl i) ≤ σ⁻¹) + (hrLower : ∀ i : Fin d, r (Sum.inr i) * r (Sum.inr i) ≤ σ) : + let A := coarseBlockMatrix U a + let B := Pcell.weightedBlockAverage fun c => + coarseBlockMatrix (Pcell.cell c) (aCell c) + let J := Pcell.weightedAverage fun c => + ∑ i : Fin d, + doubledResponseJ (Pcell.cell c) (aCell c) + (cp • Pi.single i 1, 0) (cq • Pi.single i 1, 0) + fullBlockTrace + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) ≤ + 2 * J := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + intro A B J + have hAB : BlockMatLoewnerLE A B := by + dsimp [A, B] + exact (blockCoarseMatrixTheory U a).block_matrix_subadditive Pcell aCell hcell + have hParentBudget_nonneg : 0 ≤ specialCoordinateBlockJTraceBudget σ A := by + dsimp [A] + rw [← sum_doubledResponseJ_coordinateScales_eq_specialCoordinateBlockJTraceBudget + (U := U) (a := a) hcp2 hcq2 hcpq] + exact Finset.sum_nonneg fun i _hi => + doubledResponseJ_nonneg U a + (cp • Pi.single i 1, 0) (cq • Pi.single i 1, 0) + have hBudget_eq : specialCoordinateBlockJTraceBudget σ B = J := by + dsimp [B, J] + calc + specialCoordinateBlockJTraceBudget σ + (Pcell.weightedBlockAverage fun c => + coarseBlockMatrix (Pcell.cell c) (aCell c)) = + Pcell.weightedAverage + (fun c => specialCoordinateBlockJTraceBudget σ + (coarseBlockMatrix (Pcell.cell c) (aCell c))) := by + exact specialCoordinateBlockJTraceBudget_weightedBlockAverage Pcell σ + (fun c => coarseBlockMatrix (Pcell.cell c) (aCell c)) + _ = Pcell.weightedAverage fun c => + ∑ i : Fin d, + doubledResponseJ (Pcell.cell c) (aCell c) + (cp • Pi.single i 1, 0) (cq • Pi.single i 1, 0) := by + unfold DomainPartition.weightedAverage + refine Finset.sum_congr rfl ?_ + intro c _hc + change + Pcell.weight c * + specialCoordinateBlockJTraceBudget σ + (coarseBlockMatrix (Pcell.cell c) (aCell c)) = + Pcell.weight c * + (∑ i : Fin d, + doubledResponseJ (Pcell.cell c) (aCell c) + (cp • Pi.single i 1, 0) (cq • Pi.single i 1, 0)) + rw [← sum_doubledResponseJ_coordinateScales_eq_specialCoordinateBlockJTraceBudget + (U := Pcell.cell c) (a := aCell c) hcp2 hcq2 hcpq] + have htrace := + normalizedBlockSubTrace_le_specialCoordinateBlockJTraceBudget + (A := A) (B := B) (σ := σ) r hAB hrUpper hrLower hParentBudget_nonneg + simpa [hBudget_eq] using htrace + +end + +end Ch02 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03.lean new file mode 100644 index 0000000000..410ec7fc0f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems + +/-! # Ch03 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26.lean new file mode 100644 index 0000000000..9ed3fb7ae9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FinitePToLegacyQTwo +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonCZ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonLocalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGraining +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAssemblyAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDescendantWsp +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingForcing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingNegativeAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingOneCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingPDE +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponseOrder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.NegativeBesov + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FinitePToLegacyQTwo.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FinitePToLegacyQTwo.lean new file mode 100644 index 0000000000..fc4fd519e3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FinitePToLegacyQTwo.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingForcing + +/-! +# Strict finite-`p` to legacy `q = 2` Besov regularity + +This adapter transports the source finite-`p` carrier to the legacy signed +`H^s` right-hand-side carrier consumed by the one-cube deterministic theorem. +The quantitative strict-gap summation is owned by +`LocalCoarseGrainingForcing`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem cubeEuclideanWspKernel_neg {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (g : Vec d → Vec d) : + cubeEuclideanWspKernel s p (fun x => -g x) = + fun z => -cubeEuclideanWspKernel s p g z := by + funext z + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply] + have hsub : -g z.1 - -g z.2 = -(g z.1 - g z.2) := by abel + rw [hsub, show HilbertVec.ofVec (-(g z.1 - g z.2)) = + -HilbertVec.ofVec (g z.1 - g z.2) by + exact (HilbertVec.ofVecL d).map_neg _, smul_neg] + +private theorem memCubeEuclideanFullWsp_neg {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + {g : Vec d → Vec d} (hg : MemCubeEuclideanFullWsp Q s p g) : + MemCubeEuclideanFullWsp Q s p (fun x => -g x) := by + constructor + · simpa only [map_neg] using! hg.1.neg + · unfold MemCubeEuclideanWsp + rw [cubeEuclideanWspKernel_neg] + exact hg.2.neg + +/-- A strict finite-`p` Euclidean fractional-Sobolev witness supplies the +legacy `H^s` right-hand-side carrier. The output sign is the one used by the +weak forced-equation interface. -/ +theorem MemCubeEuclideanFullWsp.toCubeVectorBesovHRegularity_neg_of_lt + {d : ℕ} [NeZero d] {Q : TriadicCube d} {s s2 : FractionalOrder} + {p : FiniteLpExponent} {g : Vec d → Vec d} + (hg : MemCubeEuclideanFullWsp Q s2 p g) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (hss2 : s.1 < s2.1) : + CubeVectorBesovHRegularity Q s.1 (fun x => -g x) := by + have hneg : MemCubeEuclideanFullWsp Q s2 p (fun x => -g x) := + memCubeEuclideanFullWsp_neg hg + exact + { memLp := MemCubeEuclideanFullWsp.memLpTwo hp hneg + partialSeminorms_bddAbove := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_memLp_finiteP + Q s s2 hss2 p hp (fun x => -g x) hneg } + +end +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonBridges.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonBridges.lean new file mode 100644 index 0000000000..4447d7849a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonBridges.lean @@ -0,0 +1,196 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Transport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp + +/-! +# Structural bridges for the Chapter 3 flux-comparison estimate + +This module converts the exact public hypotheses of the source-facing +flux-comparison statement into the representative-level potential and +solenoidal predicates used by the deterministic testing layer. It contains +only algebraic and measure-normalization bridges; no quantitative estimate is +proved here. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- A zero-trace value difference has the expected gradient difference, up to +the a.e. equality intrinsic to Sobolev functions. -/ +theorem HasCenteredCubeH10Difference.exists_grad_ae_eq + {d : ℕ} {m : ℤ} + {u v : H1Function (openCubeSet (originCube d m))} + (hzero : HasCenteredCubeH10Difference m u v) : + ∃ w : H10Function (openCubeSet (originCube d m)), + w.toH1Function.grad =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + fun x => u.grad x - v.grad x := by + rcases hzero with ⟨w, hw⟩ + refine ⟨w, ?_⟩ + have hw' : + w.toH1Function.toFun =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + (u - v).toFun := by + simpa only [H1Function.sub_toFun] using hw + have hgrad := H1Function.grad_ae_eq_of_toFun_ae_eq + (isOpen_openCubeSet (originCube d m)) + (u := w.toH1Function) (v := u - v) hw' + simpa only [H1Function.sub_grad] using hgrad + +/-- The source-facing zero-trace difference hypothesis supplies the exact +potential predicate for the gradient difference on the open cube. -/ +theorem HasCenteredCubeH10Difference.isPotentialZeroTraceOn_openCubeSet + {d : ℕ} {m : ℤ} + {u v : H1Function (openCubeSet (originCube d m))} + (hzero : HasCenteredCubeH10Difference m u v) : + IsPotentialZeroTraceOn (openCubeSet (originCube d m)) + (fun x => u.grad x - v.grad x) := by + rcases hzero.exists_grad_ae_eq with ⟨w, hw⟩ + exact IsPotentialZeroTraceOn.congr_ae hw w.isPotentialZeroTraceOn + +/-- The same zero-trace potential, transported to the half-open cube used by +the deterministic testing API. -/ +theorem HasCenteredCubeH10Difference.isPotentialZeroTraceOn_cubeSet + {d : ℕ} [NeZero d] {m : ℤ} + {u v : H1Function (openCubeSet (originCube d m))} + (hzero : HasCenteredCubeH10Difference m u v) : + IsPotentialZeroTraceOn (cubeSet (originCube d m)) + (fun x => u.grad x - v.grad x) := by + exact isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet + hzero.isPotentialZeroTraceOn_openCubeSet + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem centeredCube_normalization_factor_ne_zero {d : ℕ} (m : ℤ) : + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal ≠ 0 := by + rw [ENNReal.toReal_ofReal (inv_nonneg.2 (cubeVolume_nonneg _))] + exact (inv_ne_zero (cubeVolume_pos _).ne') + +/-- A raw cube Dirichlet divergence problem is the same weak equation after +moving to the normalized centered-cube measure. -/ +theorem cubeDirichletDivergenceProblem_to_centeredCubeH10ScalarDivergenceSolution + {d : ℕ} {p : FiniteLpExponent} (m : ℤ) + {z : H10Function (openCubeSet (originCube d m))} + {h : CubeEuclideanLpField (originCube d m) p} + (hh : MemLp (fun x => HilbertVec.ofVec (h.toField x)) 2 + (normalizedCubeMeasure (originCube d m))) + (hz : CubeDirichletDivergenceProblem (originCube d m) z h.toField) : + IsCenteredCubeH10ScalarDivergenceSolution m 1 z ⟨h.toField, hh⟩ := by + intro phi + have hmeasure := centeredCube_normalizedVolume_eq_smul_openCubeVolume (d := d) m + rw [hmeasure, MeasureTheory.integral_smul_measure, + MeasureTheory.integral_smul_measure, smul_eq_mul, smul_eq_mul, one_mul, + hz phi] + ring + +/-- The same normalization bridge when the datum already carries both its +finite-exponent and `L²` certificates. -/ +theorem CubeEuclideanL2LpField.to_centeredCubeH10ScalarDivergenceSolution + {d : ℕ} {p : FiniteLpExponent} (m : ℤ) + (h : CubeEuclideanL2LpField (originCube d m) p) + (z : H10Function (openCubeSet (originCube d m))) + (hz : CubeDirichletDivergenceProblem (originCube d m) z h.toField) : + IsCenteredCubeH10ScalarDivergenceSolution m 1 z h.toLpTwo := by + simpa only [CubeEuclideanL2LpField.toLpTwo] using + cubeDirichletDivergenceProblem_to_centeredCubeH10ScalarDivergenceSolution + m h.euclideanMemL2 hz + +/-- The normalized weak flux balance is equivalent to raw solenoidality on +the open cube: the positive volume-normalization factor cancels. -/ +theorem IsCenteredCubeFluxBalanced.isSolenoidalOn_openCubeSet + {d : ℕ} {m : ℤ} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))} + {sigma0 : ℝ} {u v : H1Function (openCubeSet (originCube d m))} + (hbal : IsCenteredCubeFluxBalanced m a sigma0 u v) : + IsSolenoidalOn (openCubeSet (originCube d m)) + (fun x => matVecMul (a.toCoeffField x) (u.grad x) - sigma0 • v.grad x) := by + intro phi + have hphi := hbal phi + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume] at hphi + rw [MeasureTheory.integral_smul_measure] at hphi + rw [smul_eq_mul] at hphi + exact (mul_eq_zero.mp hphi).resolve_left + (centeredCube_normalization_factor_ne_zero m) + +/-- The raw solenoidal field, transported to the half-open cube used by the +deterministic testing API. -/ +theorem IsCenteredCubeFluxBalanced.isSolenoidalOn_cubeSet + {d : ℕ} [NeZero d] {m : ℤ} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))} + {sigma0 : ℝ} {u v : H1Function (openCubeSet (originCube d m))} + (hbal : IsCenteredCubeFluxBalanced m a sigma0 u v) : + IsSolenoidalOn (cubeSet (originCube d m)) + (fun x => matVecMul (a.toCoeffField x) (u.grad x) - sigma0 • v.grad x) := by + exact isSolenoidalOn_cubeSet_triadicCube_of_openCubeSet + hbal.isSolenoidalOn_openCubeSet + +/-- The root scalar-comparator flux defect, with the literal representative +used in every descendant defect. -/ +noncomputable def centeredCubeRootFluxDefectL2Field {d : ℕ} + (m : ℤ) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ) (u : H1Function (openCubeSet (originCube d m))) : + CubeEuclideanLpField (originCube d m) FiniteLpExponent.two where + toField := fun x => + matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x) + euclideanMemLp := by + have h := (centeredCubeFluxDifferenceL2Field m a sigma0 u u).euclideanMemLp + simpa only [centeredCubeFluxDifferenceL2Field, sub_matVecMul, + matVecMul_scalarMatrix] using h + +/-- Exact pointwise decomposition of the global flux into the scalar gradient +difference and the root coefficient defect. -/ +theorem centeredCubeFluxDifference_eq_smul_gradientDifference_add_rootDefect + {d : ℕ} (m : ℤ) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ) (u v : H1Function (openCubeSet (originCube d m))) : + (centeredCubeFluxDifferenceL2Field m a sigma0 u v).toField = + sigma0 • (centeredCubeGradientDifferenceL2Field m u v).toField + + (centeredCubeRootFluxDefectL2Field m a sigma0 u).toField := by + funext x + simp only [centeredCubeFluxDifferenceL2Field, + centeredCubeGradientDifferenceL2Field, centeredCubeRootFluxDefectL2Field, + Pi.add_apply, Pi.smul_apply, sub_matVecMul, matVecMul_scalarMatrix] + module + +/-- Every local defect is literally the same representative as the root +defect, merely supplied with the local `L²` certificate. -/ +theorem centeredCubeRootFluxDefectL2Field_toField_eq_local + {d : ℕ} (m n : ℤ) (hnm : n < m) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ) (u : H1Function (openCubeSet (originCube d m))) + (R : TriadicCube d) + (hR : R ∈ descendantsAtScale (originCube d m) n) : + (centeredCubeRootFluxDefectL2Field m a sigma0 u).toField = + (centeredCubeLocalFluxDefectL2Field m n hnm a sigma0 u R hR).toField := + rfl + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonCZ.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonCZ.lean new file mode 100644 index 0000000000..446e898ad0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonCZ.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZFullNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualFieldPairing + +/-! +# Fractional Calderón--Zygmund flux comparison on centered cubes + +This is the source-facing assembly of the Chapter 3 deterministic duality +argument. The public theorem below is deliberately kept to the exact +manuscript hypotheses: the Dirichlet adjoint solve, fractional +Calderón--Zygmund estimate, smooth-dual passage, and descendant localization +are all internal proof steps. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem memLp_vec_of_memLp_hilbert_two {d : ℕ} {Q : TriadicCube d} + {F : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) 2 + (normalizedCubeMeasure Q)) : + MemLp F 2 (normalizedCubeMeasure Q) := by + apply MemLp.of_eval + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + +private theorem memVectorL2_cubeSet_of_cubeEuclideanLpField_two + {d : ℕ} {Q : TriadicCube d} (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + MemVectorL2 (cubeSet Q) F.toField := by + apply memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q + simpa only [FiniteLpExponent.two_exponent] using + memLp_vec_of_memLp_hilbert_two F.euclideanMemLp + +private noncomputable def smoothTestToCubeEuclideanWspL2Field + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : CubeEuclideanWspL2Field Q s p where + toField := h.toField + euclideanMemLp := h.toCubeEuclideanWspField.euclideanMemLp + euclideanMemWsp := h.toCubeEuclideanWspField.euclideanMemWsp + euclideanMemL2 := h.euclideanMemLp_two + +private noncomputable def smoothTestToCubeEuclideanL2LpField + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : CubeEuclideanL2LpField Q p where + toField := h.toField + euclideanMemLp := h.toCubeEuclideanWspField.euclideanMemLp + euclideanMemL2 := h.euclideanMemLp_two + +private theorem smoothTestToCubeEuclideanWspL2Field_toField + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + (smoothTestToCubeEuclideanWspL2Field h).toField = h.toField := rfl + +private theorem exists_centeredCubeDirichlet_adjoint + {d : ℕ} [NeZero d] (m : ℤ) {s : FractionalOrder} + {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest (originCube d m) s p) : + ∃ z : H10Function (openCubeSet (originCube d m)), + CubeDirichletDivergenceProblem (originCube d m) z h.toField := by + apply exists_cubeDirichletDivergenceProblem_of_memLp_normalizedCubeMeasure + exact memLp_vec_of_memLp_hilbert_two h.euclideanMemLp_two + +/-- The unit-coefficient adjoint solve for a smooth fractional test, bundled +with both the literal fractional field and its `L²` representative. The +constant is fixed before the cube, order, and test. -/ +private theorem exists_centeredCube_adjGradient_full_cz + (d : ℕ) [NeZero d] (p : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (s : FractionalOrder) + (h : CubeEuclideanWspSmoothTest (originCube d m) s p), + ∃ (z : H10Function (openCubeSet (originCube d m))) + (gradZ : CubeEuclideanWspL2Field (originCube d m) s p), + CubeDirichletDivergenceProblem (originCube d m) z h.toField ∧ + gradZ.toField = z.toH1Function.grad ∧ + cubeEuclideanWspFullENorm (originCube d m) s p gradZ.toField ≤ + C * cubeEuclideanWspFullENorm (originCube d m) s p h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_fractional_cz_full d p + obtain ⟨Csemi, hCsemi_top, hCsemi⟩ := + centeredCubeH10ScalarDivergence_fractional_cz d p + refine ⟨C, hCtop, ?_⟩ + intro m s h + rcases exists_centeredCubeDirichlet_adjoint m h with ⟨z, hz⟩ + let hWsp : CubeEuclideanWspL2Field (originCube d m) s p := + smoothTestToCubeEuclideanWspL2Field h + let hLp : CubeEuclideanL2LpField (originCube d m) p := + smoothTestToCubeEuclideanL2LpField h + have hsolution : IsCenteredCubeH10ScalarDivergenceSolution m 1 z hLp.toLpTwo := + CubeEuclideanL2LpField.to_centeredCubeH10ScalarDivergenceSolution m hLp z (by + simpa only [hLp] using! hz) + have hfull := hC m 1 s hWsp z zero_lt_one (by + simpa only [hWsp, hLp] using! hsolution) + obtain ⟨gradW, hgradW, _⟩ := hCsemi m 1 s hWsp z zero_lt_one (by + simpa only [hWsp, hLp] using! hsolution) + let gradZ : CubeEuclideanWspL2Field (originCube d m) s p := + { toField := gradW.toField + euclideanMemLp := gradW.euclideanMemLp + euclideanMemWsp := gradW.euclideanMemWsp + euclideanMemL2 := by + rw [memLp_piLp_iff] + intro i + simpa only [hgradW, HilbertVec.ofVec, PiLp.toLp_apply] using + z.toH1Function.grad_memL2_normalizedCubeMeasure i } + refine ⟨z, gradZ, hz, ?_, ?_⟩ + · simpa only [gradZ] using hgradW + · dsimp only [gradZ] + rw [hgradW] + simpa only [ENNReal.ofReal_one, inv_one, one_mul, mul_one, hWsp, + smoothTestToCubeEuclideanWspL2Field_toField] using hfull + +/-- The normalized adjoint-testing identity, specialized to the literal +centered-cube flux decomposition. This is deliberately a real-valued +identity; the subsequent smooth-dual estimate applies `ofReal ∘ |·|`. -/ +private theorem centeredCube_adjoint_testing_identity + {d : ℕ} [NeZero d] {m : ℤ} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))} + {sigma0 : ℝ} {u v : H1Function (openCubeSet (originCube d m))} + {h : Vec d → Vec d} {z : H10Function (openCubeSet (originCube d m))} + (hbal : IsCenteredCubeFluxBalanced m a sigma0 u v) + (hzero : HasCenteredCubeH10Difference m u v) + (hz : CubeDirichletDivergenceProblem (originCube d m) z h) : + sigma0 * cubeAverage (originCube d m) + (fun x => vecDot + ((centeredCubeGradientDifferenceL2Field m u v).toField x) (h x)) = + cubeAverage (originCube d m) + (fun x => vecDot + ((centeredCubeRootFluxDefectL2Field m a sigma0 u).toField x) + (z.toH1Function.grad x)) := by + let Q : TriadicCube d := originCube d m + let w := (centeredCubeGradientDifferenceL2Field m u v).toField + let F := (centeredCubeRootFluxDefectL2Field m a sigma0 u).toField + have hw : IsPotentialZeroTraceOn (cubeSet Q) w := by + simpa only [Q, w] using! hzero.isPotentialZeroTraceOn_cubeSet + have hF : MemVectorL2 (cubeSet Q) F := by + simpa only [Q, F] using + memVectorL2_cubeSet_of_cubeEuclideanLpField_two + (centeredCubeRootFluxDefectL2Field m a sigma0 u) + have hsol : IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) := by + rw [show (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) = + (centeredCubeFluxDifferenceL2Field m a sigma0 u v).toField by + calc + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) = + sigma0 • (centeredCubeGradientDifferenceL2Field m u v).toField + + (centeredCubeRootFluxDefectL2Field m a sigma0 u).toField := by + funext x + simp only [w, F, matVecMul_scalarMatrix] + rfl + _ = (centeredCubeFluxDifferenceL2Field m a sigma0 u v).toField := + (centeredCubeFluxDifference_eq_smul_gradientDifference_add_rootDefect + m a sigma0 u v).symm] + simpa only [Q] using! hbal.isSolenoidalOn_cubeSet + have hraw := dirichletDivergence_solutionComparison_integral_identity + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) (h := h) (v := z) + hF (by simpa only [Q] using hz) hw hsol + rw [cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet, + cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet] + have hraw' : sigma0 * + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (F x) (z.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa only [matVecMul_scalarMatrix, vecDot_smul_left, + MeasureTheory.integral_const_mul] using hraw + calc + sigma0 * ((cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume) = + (cubeVolume Q)⁻¹ * + (sigma0 * ∫ x in openCubeSet Q, vecDot (w x) (h x) + ∂MeasureTheory.volume) := by ring + _ = (cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, vecDot (F x) (z.toH1Function.grad x) + ∂MeasureTheory.volume := by rw [hraw'] + +/-- Smooth-dual subadditivity in the exact form needed for the literal flux +decomposition. -/ +private theorem cubeEuclideanNegativeWspSmoothDualENorm_le_smul_add + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F G H : CubeEuclideanLpField Q FiniteLpExponent.two) (c : ℝ) + (hc : 0 ≤ c) (hFG : G.toField = c • F.toField + H.toField) : + cubeEuclideanNegativeWspSmoothDualENorm Q s p G ≤ + ENNReal.ofReal c * cubeEuclideanNegativeWspSmoothDualENorm Q s p F + + cubeEuclideanNegativeWspSmoothDualENorm Q s p H := by + unfold cubeEuclideanNegativeWspSmoothDualENorm + apply iSup_le + rintro ⟨h, hh⟩ + have hpair : cubeEuclideanNormalizedSmoothPairing G h = + c * cubeEuclideanNormalizedSmoothPairing F h + + cubeEuclideanNormalizedSmoothPairing H h := by + unfold cubeEuclideanNormalizedSmoothPairing + rw [hFG] + calc + ∫ x, vecDot ((c • F.toField + H.toField) x) (h.toField x) + ∂normalizedCubeMeasure Q = + ∫ x, (c * vecDot (F.toField x) (h.toField x) + + vecDot (H.toField x) (h.toField x)) ∂normalizedCubeMeasure Q := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Pi.add_apply, Pi.smul_apply, vecDot_add_left, vecDot_smul_left] + _ = c * ∫ x, vecDot (F.toField x) (h.toField x) + ∂normalizedCubeMeasure Q + + ∫ x, vecDot (H.toField x) (h.toField x) + ∂normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add + ((cubeEuclideanNormalizedSmoothPairing_integrable F h).const_mul c) + (cubeEuclideanNormalizedSmoothPairing_integrable H h), + MeasureTheory.integral_const_mul] + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing G h| = + ENNReal.ofReal |c * cubeEuclideanNormalizedSmoothPairing F h + + cubeEuclideanNormalizedSmoothPairing H h| := by rw [hpair] + _ ≤ ENNReal.ofReal (|c * cubeEuclideanNormalizedSmoothPairing F h| + + |cubeEuclideanNormalizedSmoothPairing H h|) := + ENNReal.ofReal_le_ofReal (abs_add_le _ _) + _ = ENNReal.ofReal |c * cubeEuclideanNormalizedSmoothPairing F h| + + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing H h| := by + rw [ENNReal.ofReal_add (abs_nonneg _) (abs_nonneg _)] + _ = ENNReal.ofReal c * + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| + + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing H h| := by + rw [abs_mul, abs_of_nonneg hc, ENNReal.ofReal_mul hc] + _ ≤ ENNReal.ofReal c * + cubeEuclideanNegativeWspSmoothDualENorm Q s p F + + cubeEuclideanNegativeWspSmoothDualENorm Q s p H := by + gcongr + · exact le_iSup (fun u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate => + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F u.1|) ⟨h, hh⟩ + · exact le_iSup (fun u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate => + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing H u.1|) ⟨h, hh⟩ + +/-- The adjoint solve turns the smooth-dual gradient difference into the +smooth-dual root flux defect, with a cube-uniform CZ constant. -/ +private theorem exists_centeredCube_gradient_negativeDual_le_rootDefect + (d : ℕ) [NeZero d] (p : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (sigma0 : ℝ), 0 < sigma0 → + ∀ (s : FractionalOrder) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))) + (u v : H1Function (openCubeSet (originCube d m))), + IsCenteredCubeFluxBalanced m a sigma0 u v → + HasCenteredCubeH10Difference m u v → + ENNReal.ofReal sigma0 * + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeGradientDifferenceL2Field m u v) ≤ + C * cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) := by + obtain ⟨C, hCtop, hC⟩ := exists_centeredCube_adjGradient_full_cz d p.conjugate + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 hsigma0 s a u v hbal hzero + change ENNReal.ofReal sigma0 * (⨆ h : + CubeEuclideanWspSmoothUnitTest (originCube d m) s p.conjugate, + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h.1|) ≤ _ + rw [ENNReal.mul_iSup] + apply iSup_le + rintro ⟨h, hh⟩ + obtain ⟨z, gradZ, hz, hgradZ, hfull⟩ := hC m s h + have htest := centeredCube_adjoint_testing_identity hbal hzero + (h := h.toField) hz + have htest' : sigma0 * + cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h = + cubeEuclideanNormalizedFieldPairing + (centeredCubeRootFluxDefectL2Field m a sigma0 u) gradZ := by + unfold cubeEuclideanNormalizedSmoothPairing cubeEuclideanNormalizedFieldPairing + rw [hgradZ] + simpa only [cubeAverage_eq_integral_normalizedCubeMeasure] using htest + have hscale : ENNReal.ofReal sigma0 * ENNReal.ofReal + |cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h| = + ENNReal.ofReal |cubeEuclideanNormalizedFieldPairing + (centeredCubeRootFluxDefectL2Field m a sigma0 u) gradZ| := by + calc + ENNReal.ofReal sigma0 * ENNReal.ofReal + |cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h| = + ENNReal.ofReal (sigma0 * |cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h|) := + (ENNReal.ofReal_mul hsigma0.le).symm + _ = ENNReal.ofReal |sigma0 * cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h| := by + rw [abs_mul, abs_of_pos hsigma0] + _ = ENNReal.ofReal |cubeEuclideanNormalizedFieldPairing + (centeredCubeRootFluxDefectL2Field m a sigma0 u) gradZ| := by + rw [htest'] + have hpair := ennreal_ofReal_abs_cubeEuclideanNormalizedFieldPairing_le + (centeredCubeRootFluxDefectL2Field m a sigma0 u) gradZ + calc + ENNReal.ofReal sigma0 * ENNReal.ofReal + |cubeEuclideanNormalizedSmoothPairing + (centeredCubeGradientDifferenceL2Field m u v) h| = + ENNReal.ofReal |cubeEuclideanNormalizedFieldPairing + (centeredCubeRootFluxDefectL2Field m a sigma0 u) gradZ| := hscale + _ ≤ cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) * + cubeEuclideanWspFullENorm (originCube d m) s p.conjugate gradZ.toField := hpair + _ ≤ cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) * + (C * cubeEuclideanWspFullENorm (originCube d m) s p.conjugate h.toField) := by + gcongr + _ ≤ cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) * C := by + gcongr + simpa only [mul_one] using + mul_le_mul_of_nonneg_left hh (zero_le : (0 : ℝ≥0∞) ≤ C) + _ = C * cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) := by ac_rfl +theorem exists_centeredCubeFluxComparison_cz + (d : ℕ) (hd : 2 ≤ d) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) : + letI : NeZero d := ⟨by omega⟩ + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m n : ℤ) (hnm : n < m) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ), 0 < sigma0 → + ∀ (s : FractionalOrder) + (u v : H1Function (openCubeSet (originCube d m))), + IsCenteredCubeFluxBalanced m a sigma0 u v → + HasCenteredCubeH10Difference m u v → + centeredCubeFluxComparisonSmoothDualLHS + m a sigma0 u v s p ≤ + C * ENNReal.ofReal + (Real.rpow 3 (s.1 * (((m - n : ℤ) : ℝ)))) * + centeredCubeLocalFluxDefectSmoothDualLpAverage + m n hnm a sigma0 u s p := by + let : NeZero d := ⟨by omega⟩ + obtain ⟨Ccz, hCcz_top, hCcz⟩ := + exists_centeredCube_gradient_negativeDual_le_rootDefect d p + refine ⟨2 * Ccz + 1, ?_, ?_⟩ + · exact ENNReal.add_lt_top.mpr + ⟨ENNReal.mul_lt_top (by simp) hCcz_top, ENNReal.one_lt_top⟩ + intro m n hnm a sigma0 hsigma0 s u v hbal hzero + have hgradient := hCcz m sigma0 hsigma0 s a u v hbal hzero + have hflux := cubeEuclideanNegativeWspSmoothDualENorm_le_smul_add + (s := s) (p := p) + (centeredCubeGradientDifferenceL2Field m u v) + (centeredCubeFluxDifferenceL2Field m a sigma0 u v) + (centeredCubeRootFluxDefectL2Field m a sigma0 u) sigma0 hsigma0.le + (centeredCubeFluxDifference_eq_smul_gradientDifference_add_rootDefect + m a sigma0 u v) + have hflux' : + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeFluxDifferenceL2Field m a sigma0 u v) ≤ + Ccz * cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) + + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) := + hflux.trans (by + simpa only [add_comm] using add_le_add_left hgradient + (cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u))) + have hlocal := centeredCubeRootFluxDefectL2Field_negativeWspSmoothDual_localize + m n hnm a sigma0 u s p + unfold centeredCubeFluxComparisonSmoothDualLHS + calc + ENNReal.ofReal sigma0 * + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeGradientDifferenceL2Field m u v) + + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeFluxDifferenceL2Field m a sigma0 u v) ≤ + Ccz * cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) + + (Ccz * cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) + + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u)) := by + exact add_le_add hgradient hflux' + _ = (2 * Ccz + 1) * + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) := by ring + _ ≤ (2 * Ccz + 1) * + (ENNReal.ofReal (Real.rpow 3 (s.1 * (((m - n : ℤ) : ℝ)))) * + centeredCubeLocalFluxDefectSmoothDualLpAverage + m n hnm a sigma0 u s p) := by + exact mul_le_mul_of_nonneg_left hlocal (zero_le) + _ = (2 * Ccz + 1) * ENNReal.ofReal + (Real.rpow 3 (s.1 * (((m - n : ℤ) : ℝ)))) * + centeredCubeLocalFluxDefectSmoothDualLpAverage + m n hnm a sigma0 u s p := by ac_rfl + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonDefinitions.lean new file mode 100644 index 0000000000..d32491a808 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonDefinitions.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.CoeffRestriction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual + +/-! +# Exact carriers for the Chapter 3 flux-comparison estimate + +This module owns the literal fields and quantities in the frozen +Armstrong--Kuusi--Loher flux-defect duality statement. In particular, the +coefficient argument remains the public a.e. `CoeffOn` object; pointwise +representatives are used only privately to establish the `L²` certificates. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem memLp_hilbertify_normalizedCube_of_memVectorL2 {d : ℕ} + {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemVectorL2 (openCubeSet Q) F) : + MemLp (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q) := by + have hHilbert : MemLp (fun x => HilbertVec.ofVec (F x)) 2 + (volumeMeasureOn (openCubeSet Q)) := + memHilbertVectorL2_hilbertifyVecField hF + simpa only [volumeMeasureOn, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + hHilbert.smul_measure ENNReal.ofReal_ne_top + +private theorem memVectorL2_matVecMul_pointwiseCoeffOn {d : ℕ} + (Q : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) : + MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (a.toCoeffField x) (u.grad x)) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain Q) a + have hEll : IsEllipticFieldOn b.lam b.Lam (openCubeSet Q) b.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using + Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn + (Book.Ch02.cubeDomain Q) a + have hB : MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (b.toCoeffField x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain Q) a + apply (memLp_congr_ae ?_).mp hB + filter_upwards [hba] with x hx + simp only [hx] + +private theorem memVectorL2_localFluxDefect {d : ℕ} + {Q R : TriadicCube d} + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) (sigma0 : ℝ) + (u : H1Function (openCubeSet Q)) : + MemVectorL2 (openCubeSet R) + (fun x => matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x)) := by + let aR : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R) := + a.restrictToSubcube hRQ + let uR : H1Function (openCubeSet R) := + u.restrict (isOpen_openCubeSet R) hRQ + have hflux : MemVectorL2 (openCubeSet R) + (fun x => matVecMul (aR.toCoeffField x) (uR.grad x)) := + memVectorL2_matVecMul_pointwiseCoeffOn R aR uR + have hscalar : MemVectorL2 (openCubeSet R) + (fun x => sigma0 • uR.grad x) := + uR.grad_memVectorL2.const_smul sigma0 + have hsub := hflux.sub hscalar + simpa only [aR, uR, Book.Ch02.CoeffOn.restrictToSubcube_toCoeffField, + H1Function.restrict, sub_matVecMul, matVecMul_scalarMatrix] using! hsub + +/-- Function-level zero-trace difference on the centered cube. -/ +def HasCenteredCubeH10Difference {d : ℕ} (m : ℤ) + (u v : H1Function (openCubeSet (originCube d m))) : Prop := + ∃ w : H10Function (openCubeSet (originCube d m)), + w.toH1Function.toFun =ᵐ[ + volumeMeasureOn (openCubeSet (originCube d m))] + fun x => u.toFun x - v.toFun x + +/-- The flux difference is weakly divergence-free against zero-trace tests. -/ +def IsCenteredCubeFluxBalanced {d : ℕ} (m : ℤ) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) (sigma0 : ℝ) + (u v : H1Function (openCubeSet (originCube d m))) : Prop := + ∀ phi : H10Function (openCubeSet (originCube d m)), + ∫ x, + vecDot + (matVecMul (a.toCoeffField x) (u.grad x) - + sigma0 • v.grad x) + (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = 0 + +/-- The centered-cube gradient difference, bundled with its genuine `L²` +certificate. -/ +noncomputable def centeredCubeGradientDifferenceL2Field {d : ℕ} + (m : ℤ) (u v : H1Function (openCubeSet (originCube d m))) : + CubeEuclideanLpField (originCube d m) FiniteLpExponent.two where + toField := fun x => u.grad x - v.grad x + euclideanMemLp := by + rw [memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply, Pi.sub_apply] using! + (u.grad_memL2_normalizedCubeMeasure i).sub + (v.grad_memL2_normalizedCubeMeasure i) + +/-- The centered-cube coefficient/scalar flux difference, bundled with its +genuine `L²` certificate. -/ +noncomputable def centeredCubeFluxDifferenceL2Field {d : ℕ} + (m : ℤ) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) (sigma0 : ℝ) + (u v : H1Function (openCubeSet (originCube d m))) : + CubeEuclideanLpField (originCube d m) FiniteLpExponent.two where + toField := fun x => + matVecMul (a.toCoeffField x) (u.grad x) - sigma0 • v.grad x + euclideanMemLp := by + apply memLp_hilbertify_normalizedCube_of_memVectorL2 + exact (memVectorL2_matVecMul_pointwiseCoeffOn (originCube d m) a u).sub + (v.grad_memVectorL2.const_smul sigma0) + +/-- The local scalar-comparator flux defect on a descendant. -/ +noncomputable def centeredCubeLocalFluxDefectL2Field {d : ℕ} + (m n : ℤ) (hnm : n < m) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) (sigma0 : ℝ) + (u : H1Function (openCubeSet (originCube d m))) + (R : TriadicCube d) + (hR : R ∈ descendantsAtScale (originCube d m) n) : + CubeEuclideanLpField R FiniteLpExponent.two where + toField := fun x => + matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x) + euclideanMemLp := by + apply memLp_hilbertify_normalizedCube_of_memVectorL2 + exact memVectorL2_localFluxDefect a + (openCubeSet_subset_of_mem_descendantsAtScale (le_of_lt hnm) hR) sigma0 u + +/-- The normalized descendant `ell^p` average of local smooth-dual flux +defects. -/ +noncomputable def centeredCubeLocalFluxDefectSmoothDualLpAverage {d : ℕ} + (m n : ℤ) (hnm : n < m) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) (sigma0 : ℝ) + (u : H1Function (openCubeSet (originCube d m))) + (s : FractionalOrder) (p : FiniteLpExponent) : ℝ≥0∞ := by + classical + exact + (((descendantsAtScale (originCube d m) n).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale (originCube d m) n).attach.sum (fun R => + (cubeEuclideanNegativeWspSmoothDualENorm R.1 s p + (centeredCubeLocalFluxDefectL2Field + m n hnm a sigma0 u R.1 R.2)) ^ p.exponent.toReal)) ^ + (p.exponent.toReal)⁻¹ + +/-- The exact left hand side of the centered-cube flux-comparison estimate. -/ +noncomputable def centeredCubeFluxComparisonSmoothDualLHS {d : ℕ} + (m : ℤ) + (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) (sigma0 : ℝ) + (u v : H1Function (openCubeSet (originCube d m))) + (s : FractionalOrder) (p : FiniteLpExponent) : ℝ≥0∞ := + ENNReal.ofReal sigma0 * + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeGradientDifferenceL2Field m u v) + + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeFluxDifferenceL2Field m a sigma0 u v) + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonLocalization.lean new file mode 100644 index 0000000000..e77f1e392d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/FluxComparisonLocalization.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspNegativeLocalization + +/-! +# Root-to-descendant localization for the Chapter 3 flux defect + +This is the exact localization step which identifies the generic smooth-dual +negative-norm descendant average with the source-facing flux-defect average. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped ENNReal + +noncomputable section + +/-- The root scalar-comparator defect localizes to the exact normalized +average of its descendant flux defects. -/ +theorem centeredCubeRootFluxDefectL2Field_negativeWspSmoothDual_localize + {d : ℕ} [NeZero d] (m n : ℤ) (hnm : n < m) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ) (u : H1Function (openCubeSet (originCube d m))) + (s : FractionalOrder) (p : FiniteLpExponent) : + cubeEuclideanNegativeWspSmoothDualENorm (originCube d m) s p + (centeredCubeRootFluxDefectL2Field m a sigma0 u) ≤ + ENNReal.ofReal (Real.rpow 3 (s.1 * (((m - n : ℤ) : ℝ)))) * + centeredCubeLocalFluxDefectSmoothDualLpAverage + m n hnm a sigma0 u s p := by + let j : ℕ := Int.toNat (m - n) + have hscale : descendantsAtScale (originCube d m) n = + descendantsAtDepth (originCube d m) j := by + simpa [originCube, j] using + descendantsAtScale_eq_descendantsAtDepth (originCube d m) (le_of_lt hnm) + have hj : (j : ℝ) = ((m - n : ℤ) : ℝ) := by + change ((Int.toNat (m - n) : ℕ) : ℝ) = ((m - n : ℤ) : ℝ) + norm_cast + exact Int.toNat_of_nonneg (by omega) + have hlocal : + descendantsENNAverage (originCube d m) j (fun R => + if hR : R ∈ descendantsAtDepth (originCube d m) j then + cubeEuclideanNegativeWspSmoothDualENorm R s p + ((centeredCubeRootFluxDefectL2Field m a sigma0 u).restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) ^ + p.exponent.toReal + else 0) ^ p.exponent.toReal⁻¹ = + centeredCubeLocalFluxDefectSmoothDualLpAverage m n hnm a sigma0 u s p := by + let D := descendantsAtDepth (originCube d m) j + let S := descendantsAtScale (originCube d m) n + let e : {R // R ∈ D} ≃ {R // R ∈ S} := + Equiv.subtypeEquivRight fun R => by + change R ∈ descendantsAtDepth (originCube d m) j ↔ + R ∈ descendantsAtScale (originCube d m) n + rw [hscale] + have he_mem (R : {R // R ∈ D}) : e R ∈ S.attach := by + simp only [Finset.mem_attach] + have hsum : + ∑ R ∈ D.attach, + cubeEuclideanNegativeWspSmoothDualENorm R.1 s p + ((centeredCubeRootFluxDefectL2Field m a sigma0 u).restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth R.2)) ^ + p.exponent.toReal = + ∑ R ∈ S.attach, + cubeEuclideanNegativeWspSmoothDualENorm R.1 s p + (centeredCubeLocalFluxDefectL2Field m n hnm a sigma0 u R.1 R.2) ^ + p.exponent.toReal := by + refine Finset.sum_bij (fun R _ => e R) ?_ ?_ ?_ ?_ + · intro R hR + exact he_mem R + · intro R₁ _ R₂ _ hR + exact e.injective hR + · intro R hR + refine ⟨e.symm R, by simp only [Finset.mem_attach], ?_⟩ + exact e.apply_symm_apply R + · intro R hR + have hR' : R.1 ∈ D := R.2 + simp only [e] + change cubeEuclideanNegativeWspSmoothDualENorm R.1 s p + ((centeredCubeRootFluxDefectL2Field m a sigma0 u).restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR')) ^ + p.exponent.toReal = + cubeEuclideanNegativeWspSmoothDualENorm R.1 s p + (centeredCubeLocalFluxDefectL2Field m n hnm a sigma0 u R.1 + ((e R).property)) ^ p.exponent.toReal + rfl + unfold descendantsENNAverage centeredCubeLocalFluxDefectSmoothDualLpAverage + simp only [D] at hsum + rw [← hsum] + rw [hscale] + rw [← Finset.sum_attach] + congr 2 + apply Finset.sum_congr rfl + intro R hR + simp only [dif_pos R.2] + have hmain := cubeEuclideanNegativeWspSmoothDualENorm_le_descendantsENNAverage + (originCube d m) j s p (centeredCubeRootFluxDefectL2Field m a sigma0 u) + rw [hj, hlocal] at hmain + rw [ENNReal.ofReal_rpow_of_pos (by norm_num : (0 : ℝ) < 3)] at hmain + simpa only [mul_comm] using! hmain + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGraining.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGraining.lean new file mode 100644 index 0000000000..b72c874e1a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGraining.lean @@ -0,0 +1,1187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingNegativeAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingOneCube +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingForcing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponseOrder +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAssemblyAlgebra + +/-! +# Local finite-`p` coarse-graining assembly + +This is the source-facing assembly point for the frozen local finite-`p` +coarse-graining theorem. The reusable input modules deliberately keep the +negative-series expansion, descendant restriction, response localization, and +forcing summation separate; this file only combines those literal carriers. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +/-- A one-cube response maximum is invariant under a coefficient-family +comparison available on that cube alone. -/ +private theorem normalizedBlockResponseMax_eq_of_localAEEq + {d : ℕ} [NeZero d] {A B : Book.Ch02.TriadicCoeffFamily d} + {S : TriadicCube d} (hS : Book.Ch02.CoeffOn.AEEq (A.coeffOn S) (B.coeffOn S)) + (a0 : Mat d) : + Book.Ch02.normalizedBlockResponseMax S A a0 = + Book.Ch02.normalizedBlockResponseMax S B a0 := by + unfold Book.Ch02.normalizedBlockResponseMax + rw [show Book.Ch02.normalizedBlockResponseValueSet S A a0 = + Book.Ch02.normalizedBlockResponseValueSet S B a0 by + unfold Book.Ch02.normalizedBlockResponseValueSet + ext x + constructor <;> rintro ⟨e, he, rfl⟩ <;> + refine ⟨e, he, ?_⟩ <;> + rw [Book.Ch02.doubledResponseJ_eq_ofAEEq hS]] + +/-- The endpoint scale response on a root cube needs only a.e. comparison on +the descendants at that particular scale. -/ +private theorem scaleResponseAtScale_infinity_eq_of_descendantAEEq + {d : ℕ} [NeZero d] {A B : Book.Ch02.TriadicCoeffFamily d} + (R : TriadicCube d) (k : ℤ) + (h : ∀ S : TriadicCube d, S ∈ descendantsAtScale R k → + Book.Ch02.CoeffOn.AEEq (A.coeffOn S) (B.coeffOn S)) + (a0 : Mat d) : + Book.Ch02.scaleResponseAtScale R k .infinity A a0 = + Book.Ch02.scaleResponseAtScale R k .infinity B a0 := by + unfold Book.Ch02.scaleResponseAtScale + change + (Book.Ch02.finsetSupReal (descendantsAtScale R k) + (fun S => Book.Ch02.normalizedBlockResponseMax S A a0)) ^ (1 / 2 : ℝ) = + (Book.Ch02.finsetSupReal (descendantsAtScale R k) + (fun S => Book.Ch02.normalizedBlockResponseMax S B a0)) ^ (1 / 2 : ℝ) + congr 1 + apply Book.Ch02.finsetSupReal_congr + intro S hS + exact normalizedBlockResponseMax_eq_of_localAEEq (h S hS) a0 + +/-- An endpoint homogenization error on `R` is invariant under coefficient +comparison on every descendant of `R`; no global family equality is used. -/ +private theorem homogenizationErrorOnCube_infinity_eq_of_descendantAEEq + {d : ℕ} [NeZero d] {A B : Book.Ch02.TriadicCoeffFamily d} + (R : TriadicCube d) + (h : ∀ (k : ℤ) (S : TriadicCube d), S ∈ descendantsAtScale R k → + Book.Ch02.CoeffOn.AEEq (A.coeffOn S) (B.coeffOn S)) + (t : ℝ) (p : Book.Ch02.MultiscaleExponent) (a0 : Mat d) : + Book.Ch02.HomogenizationErrorOnCube R t .infinity p A a0 = + Book.Ch02.HomogenizationErrorOnCube R t .infinity p B a0 := by + unfold Book.Ch02.HomogenizationErrorOnCube Book.Ch02.HomogenizationError + cases p with + | finite q => + unfold Book.Ch02.HomogenizationErrorFinite + change + (∑' j : ℕ, Book.Ch02.geometricWeight t q j * + (Book.Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity A a0) ^ q) ^ + (1 / q) = + (∑' j : ℕ, Book.Ch02.geometricWeight t q j * + (Book.Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity B a0) ^ q) ^ + (1 / q) + congr 1 + apply tsum_congr + intro j + rw [scaleResponseAtScale_infinity_eq_of_descendantAEEq R + (R.scale - (j : ℤ)) (fun S hS => h _ S hS) a0] + | infinity => + unfold Book.Ch02.HomogenizationErrorInfinity + apply congrArg sSup + ext x + constructor <;> rintro ⟨j, rfl⟩ <;> + refine ⟨j, ?_⟩ <;> + rw [scaleResponseAtScale_infinity_eq_of_descendantAEEq R + (R.scale - (j : ℤ)) (fun S hS => h _ S hS) a0] + +/-- The canonical pointwise family rooted at a descendant and the one rooted +at its parent agree for all response computations below that descendant. +The comparison is deliberately local: their representatives need not agree +outside the descendant. -/ +private theorem rootPointwiseCoeffFamily_on_descendant_eq_parent + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) (t : ℝ) + (p : Book.Ch02.MultiscaleExponent) (a0 : Mat d) : + Book.Ch02.HomogenizationErrorOnCube R t .infinity p + (rootPointwiseCoeffFamily R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk hR))) a0 = + Book.Ch02.HomogenizationErrorOnCube R t .infinity p + (rootPointwiseCoeffFamily Q a) a0 := by + apply homogenizationErrorOnCube_infinity_eq_of_descendantAEEq R _ t p a0 + intro l S hS + let hRQ : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + have hSQ : S ∈ descendantsAtScale Q l := + mem_descendantsAtScale_trans hR hS + have hlQ : l ≤ Q.scale := + descendant_scale_le_of_mem_descendantsAtScale hSQ + have hlR : l ≤ R.scale := + descendant_scale_le_of_mem_descendantsAtScale hS + have hlocal := rootPointwiseCoeffFamily_descendant_aeeq R + (a.restrictToSubcube hRQ) hlR hS + have htrans := Book.Ch02.CoeffOn.restrictToSubcube_trans_aeeq a hRQ + (openCubeSet_subset_of_mem_descendantsAtScale hlR hS) + have hparent := rootPointwiseCoeffFamily_descendant_aeeq Q a hlQ hSQ + exact hlocal.trans (htrans.trans hparent.symm) + +/-- The source forcing and weak equation restrict together to every physical +descendant used in the outer local average. -/ +private theorem localCoarseGraining_descendant_source_data + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + {s2 : FractionalOrder} {p : FiniteLpExponent} {g : Vec d → Vec d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)} + {u : H1Function (openCubeSet Q)} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) + (hg : MemCubeEuclideanFullWsp Q s2 p g) + (hu : IsForcedEquation Q a u g) : + MemCubeEuclideanFullWsp R s2 p g ∧ + IsForcedEquation R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) g := by + exact ⟨MemCubeEuclideanFullWsp.onDescendant hk hR hg, + IsForcedEquation.restrictToDescendant hk hR hu⟩ + +/-- Re-rooting the coefficient representative on a physical descendant does +not alter its response error. This is the local a.e. invariance bridge used +when the one-cube theorem is inserted in the parent-scale series. -/ +private theorem localCoarseGraining_descendant_response_re_root + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) + (t : ℝ) (p : Book.Ch02.MultiscaleExponent) (a0 : Mat d) : + Book.Ch02.HomogenizationErrorOnCube R t .infinity p + (rootPointwiseCoeffFamily R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk hR))) a0 = + Book.Ch02.HomogenizationErrorOnCube R t .infinity p + (rootPointwiseCoeffFamily Q a) a0 := + rootPointwiseCoeffFamily_on_descendant_eq_parent Q a hk hR t p a0 + +/-- The `q = 1` local response contribution is localized at the exact +physical descendant scale. -/ +private theorem localCoarseGraining_descendant_response_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n k : ℤ) + (hn : n ≤ Q.scale) (hkn : k ≤ n) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale Q k) + (s1 : FractionalOrder) : + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s1.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 + (s1.1 * (Int.toNat (n - k) : ℝ))) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 := by + exact rootPointwise_descendant_infinity_one_le_parent + Q n hn a sigma0 hsigma0 hkn hR s1 + +/-- The one-cube `q = 1` error at the local order is first lowered to the +source order before the parent-truncated response localization is used. -/ +private theorem localCoarseGraining_descendant_response_one_of_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n k : ℤ) + (hn : n ≤ Q.scale) (hkn : k ≤ n) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale Q k) + (s1 s : FractionalOrder) (hs1s : s1.1 < s.1) : + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 + (s1.1 * (Int.toNat (n - k) : ℝ))) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 := by + calc + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s1.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) := + ENNReal.ofReal_le_ofReal + (Book.Ch02.homogenizationErrorOnCube_infinity_one_le_of_lt R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + s1.2.1 hs1s) + _ ≤ _ := localCoarseGraining_descendant_response_one Q n k hn hkn + a sigma0 hsigma0 hR s1 + +/-- The `q = 2` local response contribution is first lowered in order and +then localized by the canonical parent response. -/ +private theorem localCoarseGraining_descendant_response_two + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n k : ℤ) + (hn : n ≤ Q.scale) (hkn : k ≤ n) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale Q k) + (s1 s : FractionalOrder) (hs1s : s1.1 < s.1) : + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R + (fractionalOrderHalf s).1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 + ((fractionalOrderHalf s1).1 * (Int.toNat (n - k) : ℝ))) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1) := by + apply rootPointwise_descendant_infinity_two_le_parent_of_lt + Q n hn a sigma0 hsigma0 hkn hR (fractionalOrderHalf s1) + (fractionalOrderHalf s) + simpa only [fractionalOrderHalf_value] using (div_lt_div_of_pos_right hs1s (by norm_num : (0 : ℝ) < 2)) + +/-- The local flux-defect carrier used by the negative Besov definition is +definitionally the flux field in the one-cube theorem after restricting to +the physical descendant. -/ +private theorem localCoarseGraining_descendant_fluxDefect_eq + {d : ℕ} [NeZero d] {Q R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)} + {sigma0 : ℝ} {u : H1Function (openCubeSet Q)} + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x)) = + fluxDefect (a.restrictToSubcube hRQ).toCoeffField + (scalarMatrix (d := d) sigma0) + (restrictH1ToSubcube u hRQ).toCubeSet.grad := by + funext x + simp only [fluxDefect, Book.Ch02.CoeffOn.restrictToSubcube_toCoeffField, + sub_matVecMul] + simp only [H1Function.grad_toCubeSet, restrictH1ToSubcube_grad] + +/-- The public one-cube estimate, transported from restricted source data to +the parent-rooted response carrier. This is the pointwise input for the +physical-scale negative-Besov assembly. -/ +private theorem localCoarseGraining_descendant_oneCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) (k : ℤ) (hk : k ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s s2 : FractionalOrder) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (hss2 : s.1 < s2.1) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) + (u : H1Function (openCubeSet Q)) (hu : IsForcedEquation Q a u g) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale Q k) : + ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖ ≤ + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) * + localSymmetricEnergyENorm R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + ENNReal.ofReal + (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity + (.finite 2) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ^ 2) * + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) := by + let hRQ : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + obtain ⟨hgR, huR⟩ := localCoarseGraining_descendant_source_data hk hR hg hu + have hone := ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_localCoarseGrainingOneCube + (R := R) (a := a.restrictToSubcube hRQ) + (u := restrictH1ToSubcube u hRQ) (g := g) sigma0 hsigma0 s s2 p hp hss2 hgR huR + have hOne := localCoarseGraining_descendant_response_re_root Q a hk hR s.1 + (.finite 1) (scalarMatrix (d := d) sigma0) + have hTwo := localCoarseGraining_descendant_response_re_root Q a hk hR (s.1 / 2) + (.finite 2) (scalarMatrix (d := d) sigma0) + rw [hOne, hTwo] at hone + simpa only [localCoarseGraining_descendant_fluxDefect_eq hRQ] using hone + +/-- A finite neutral factor used while enlarging the final dimension-only +assembly constant. The actual one-cube and forcing factors are inserted only +through their public seams. -/ +private theorem localCoarseGraining_neutralConstant_lt_top : + (1 : ℝ≥0∞) < ∞ := by + norm_num + +/-- The outer finite-`p` root is subadditive. Keeping this elementary +calculation here makes the two sources of the final RHS explicit instead of +hiding an extra hypothesis in an auxiliary norm. -/ +private theorem ENNReal_rpow_inv_add_le_add_rpow_inv {r : ℝ} + (hr : 1 ≤ r) (A B : ℝ≥0∞) : + (A + B) ^ r⁻¹ ≤ A ^ r⁻¹ + B ^ r⁻¹ := by + have hrpos : 0 < r := lt_of_lt_of_le zero_lt_one hr + apply ENNReal.rpow_add_le_add_rpow + · exact inv_nonneg.mpr hrpos.le + · exact (inv_le_one₀ hrpos).mpr hr + +/-- Pulling a common nonnegative factor through the sole outer finite-`p` +root. -/ +private theorem ENNReal_rpow_inv_mul_eq_mul_rpow_inv {r : ℝ} + (hr : 0 < r) (C A : ℝ≥0∞) : + (C ^ r * A) ^ r⁻¹ = C * A ^ r⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hr.le), + ← ENNReal.rpow_mul, mul_inv_cancel₀ hr.ne', ENNReal.rpow_one] + +/-- A common factor in every term of a nonnegative series pulls through the +outer finite-`p` root. -/ +private theorem ENNReal_rpow_inv_tsum_mul_rpow_eq {r : ℝ} + (hr : 0 < r) (C : ℝ≥0∞) (F : ℕ → ℝ≥0∞) : + (∑' j : ℕ, C ^ r * F j) ^ r⁻¹ = C * (∑' j : ℕ, F j) ^ r⁻¹ := by + rw [ENNReal.tsum_mul_left] + exact ENNReal_rpow_inv_mul_eq_mul_rpow_inv hr C _ + +/-- The scale normalizations in the source-facing RHS are the corresponding +`ENNReal` inverse and fractional powers. -/ +private theorem localCoarseGraining_scale_normalizations + {s sigma0 : ℝ} (hs : 0 < s) (hsigma0 : 0 < sigma0) : + ENNReal.ofReal s⁻¹ = (ENNReal.ofReal s)⁻¹ ∧ + ENNReal.ofReal (Real.sqrt sigma0) = + (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) ∧ + ENNReal.ofReal (Real.rpow s (-(9 / 2 : ℝ))) = + (ENNReal.ofReal s) ^ (-(9 / 2 : ℝ)) := by + constructor + · exact ENNReal.ofReal_inv_of_pos hs + constructor + · rw [Real.sqrt_eq_rpow] + exact (ENNReal.ofReal_rpow_of_pos hsigma0).symm + · exact (ENNReal.ofReal_rpow_of_pos hs).symm + +/-- At the physical descendant scale `n-j`, the parent-localization depth is +literally `j`. -/ +private theorem localCoarseGraining_toNat_parent_depth + (n : ℤ) (j : ℕ) : + Int.toNat (n - (n - (j : ℤ))) = j := by + rw [show n - (n - (j : ℤ)) = j by ring] + simp + +/-- A one-level response scale factor is at least one. This absorbs the +unit part of the finite-`q = 2` envelope without creating another fractional +gap. -/ +private theorem one_le_response_scaleFactor + {s : FractionalOrder} (j : ℕ) : + (1 : ℝ≥0∞) ≤ ENNReal.ofReal (Real.rpow 3 (s.1 * (j : ℝ))) := by + rw [← ENNReal.ofReal_one] + apply ENNReal.ofReal_le_ofReal + exact Real.one_le_rpow (by norm_num) (mul_nonneg s.2.1.le (by positivity)) + +/-- Squaring the half-order response localization factor produces exactly +the full `s₁` physical-depth factor. -/ +private theorem response_half_scaleFactor_sq_eq_full + (s1 : FractionalOrder) (j : ℕ) : + (ENNReal.ofReal (Real.rpow 3 ((s1.1 / 2) * (j : ℝ)))) ^ 2 = + ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) := by + have hhalf : 0 ≤ Real.rpow 3 ((s1.1 / 2) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + rw [pow_two, ← ENNReal.ofReal_mul hhalf] + congr 1 + calc + Real.rpow 3 ((s1.1 / 2) * (j : ℝ)) * + Real.rpow 3 ((s1.1 / 2) * (j : ℝ)) = + Real.rpow 3 (((s1.1 / 2) * (j : ℝ)) + ((s1.1 / 2) * (j : ℝ))) := + (Real.rpow_add (by norm_num) _ _).symm + _ = Real.rpow 3 (s1.1 * (j : ℝ)) := by + congr 1 + ring + +/-- After response localization, the quadratic `q = 2` envelope has the +same full `s₁` scale factor as the `q = 1` response term. -/ +private theorem one_add_sq_mul_response_half_scale_le_full_scale_mul_one_add_sq + {H : ℝ≥0∞} (s1 : FractionalOrder) (j : ℕ) : + 1 + (ENNReal.ofReal (Real.rpow 3 ((s1.1 / 2) * (j : ℝ))) * H) ^ 2 ≤ + ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * (1 + H ^ 2) := by + let T : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 ((s1.1 / 2) * (j : ℝ))) + have hT : (1 : ℝ≥0∞) ≤ T := by + dsimp [T] + rw [← ENNReal.ofReal_one] + apply ENNReal.ofReal_le_ofReal + exact Real.one_le_rpow (by norm_num) + (mul_nonneg (div_nonneg s1.2.1.le (by norm_num)) (by positivity)) + have hT2 : T ^ 2 = ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) := by + simpa only [T, fractionalOrderHalf_value] using + response_half_scaleFactor_sq_eq_full s1 j + have hT2one : (1 : ℝ≥0∞) ≤ T ^ 2 := by + rw [← ENNReal.rpow_two] + simpa only [ENNReal.one_rpow] using + ENNReal.rpow_le_rpow hT (by norm_num : (0 : ℝ) ≤ 2) + calc + 1 + (T * H) ^ 2 = 1 + T ^ 2 * H ^ 2 := by + congr 1 + simpa only [ENNReal.rpow_two] using + ENNReal.mul_rpow_of_nonneg T H (by norm_num : (0 : ℝ) ≤ 2) + _ ≤ T ^ 2 * (1 + H ^ 2) := by + calc + 1 + T ^ 2 * H ^ 2 ≤ T ^ 2 + T ^ 2 * H ^ 2 := by + exact add_le_add hT2one le_rfl + _ = T ^ 2 * (1 + H ^ 2) := by ring + _ = ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * (1 + H ^ 2) := by + rw [hT2] + +/-- At depth `j` below the prescribed physical scale, the one-cube estimate +is controlled by the parent responses with a *single* `3^(s₁j)` factor on +each of its energy and forcing components. -/ +private theorem localCoarseGraining_descendant_oneCube_parent_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s1 s s2 : FractionalOrder) (hs1s : s1.1 < s.1) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) + (u : H1Function (openCubeSet Q)) (hu : IsForcedEquation Q a u g) + (j : ℕ) {R : TriadicCube d} (hR : R ∈ descendantsAtScale Q (n - (j : ℤ))) : + ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖ ≤ + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * + (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + localSymmetricEnergyENorm R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g))) := by + let S : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) + let T : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 ((s1.1 / 2) * (j : ℝ))) + let H1 : ℝ≥0∞ := Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 + let H2 : ℝ≥0∞ := Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1) + let E : ℝ≥0∞ := localSymmetricEnergyENorm R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + let B : ℝ≥0∞ := ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g) + have hone := localCoarseGraining_descendant_oneCube Q (n - (j : ℤ)) (by omega) + a sigma0 hsigma0 s s2 p hp hss2 g hg u hu hR + have h1 := localCoarseGraining_descendant_response_one_of_lt Q n (n - (j : ℤ)) hn + (by omega) a sigma0 hsigma0 hR s1 s hs1s + have h2 := localCoarseGraining_descendant_response_two Q n (n - (j : ℤ)) hn + (by omega) a sigma0 hsigma0 hR s1 s hs1s + rw [localCoarseGraining_toNat_parent_depth n j] at h1 h2 + change _ ≤ ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + (S * (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * H1 * E + + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * (1 + H2 ^ 2) * B)) + apply hone.trans + apply mul_le_mul_right + conv_rhs => rw [mul_add] + apply add_le_add + · calc + ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity + (.finite 1) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) * E ≤ + ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * (S * H1) * E := by + gcongr + _ = S * (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * H1 * E) := by + ring + · have h2sq := ENNReal.rpow_le_rpow h2 (by norm_num : (0 : ℝ) ≤ 2) + have h2sq' : ENNReal.ofReal + (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity + (.finite 2) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ^ (2 : ℝ) ≤ (T * H2) ^ (2 : ℝ) := by + simpa only [T, H2, fractionalOrderHalf_value] using h2sq + have henv : 1 + + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity + (.finite 2) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ^ 2 ≤ S * (1 + H2 ^ 2) := by + calc + 1 + ENNReal.ofReal + (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity + (.finite 2) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ^ 2 ≤ + 1 + (T * H2) ^ 2 := by + rw [← ENNReal.rpow_two, ← ENNReal.rpow_two] + simpa only [add_comm] using add_le_add_left h2sq' (1 : ℝ≥0∞) + _ ≤ S * (1 + H2 ^ 2) := by + simpa only [S, T] using + one_add_sq_mul_response_half_scale_le_full_scale_mul_one_add_sq s1 j (H := H2) + calc + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + ENNReal.ofReal + (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity + (.finite 2) (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) ^ 2) * B ≤ + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (S * (1 + H2 ^ 2)) * B := by gcongr + _ = S * (ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + H2 ^ 2) * B) := by ring + +/-- Combining the negative-Besov weight with the one-cube response +localization factor gives precisely the `(s-s₁)` geometric discount. -/ +private theorem localCoarseGraining_negative_weight_mul_response_scale_rpow + (s1 s : FractionalOrder) (r : ℝ) (hr : 0 ≤ r) (j : ℕ) : + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ)))) ^ r = + ENNReal.ofReal (Real.rpow 3 + (-((s.1 - s1.1) * r * (j : ℝ)))) := by + have hleft : 0 ≤ Real.rpow 3 (-(s.1 * r * (j : ℝ))) := + Real.rpow_nonneg (by norm_num) _ + have hresponse : 0 ≤ Real.rpow 3 (s1.1 * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + rw [ENNReal.ofReal_rpow_of_nonneg hresponse hr] + rw [← ENNReal.ofReal_mul hleft] + congr 1 + have hpow : Real.rpow (Real.rpow 3 (s1.1 * (j : ℝ))) r = + Real.rpow 3 ((s1.1 * (j : ℝ)) * r) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + rw [show Real.rpow 3 (s1.1 * (j : ℝ)) ^ r = + Real.rpow 3 ((s1.1 * (j : ℝ)) * r) by exact hpow] + have hmul : Real.rpow 3 (-(s.1 * r * (j : ℝ))) * + Real.rpow 3 ((s1.1 * (j : ℝ)) * r) = + Real.rpow 3 (-(s.1 * r * (j : ℝ)) + ((s1.1 * (j : ℝ)) * r)) := + (Real.rpow_add (by norm_num) _ _).symm + rw [hmul] + congr 1 + ring + +/-- A constant factor pulls through a finite normalized physical-scale +descendant average. -/ +private theorem localCoarseGraining_descendantsAtScale_average_mul_left + {d : ℕ} (Q : TriadicCube d) (k : ℤ) (C : ℝ≥0∞) + (F : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q k (fun R => C * F R) = + C * descendantsAtScaleENNAverage Q k F := by + unfold descendantsAtScaleENNAverage + rw [← Finset.mul_sum] + ring + +/-- The weighted physical-scale series of a response-localized component +factors into its fixed parent coefficient and the exact `(s-s₁)` series. -/ +private theorem localCoarseGraining_weighted_component_factorization + {d : ℕ} (Q : TriadicCube d) (n : ℤ) + (s1 s : FractionalOrder) (r : ℝ) (hr : 0 ≤ r) + (P : ℝ≥0∞) (F : ℕ → TriadicCube d → ℝ≥0∞) : + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * P * F j R) ^ r)) = + P ^ r * ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-((s.1 - s1.1) * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r) := by + rw [← ENNReal.tsum_mul_left] + apply tsum_congr + intro j + simp_rw [ENNReal.mul_rpow_of_nonneg _ _ hr] + rw [localCoarseGraining_descendantsAtScale_average_mul_left] + calc + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) ^ r * P ^ r * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => F j R ^ r)) = + P ^ r * (ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) ^ r) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => F j R ^ r) := by ring + _ = P ^ r * (ENNReal.ofReal (Real.rpow 3 + (-((s.1 - s1.1) * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => F j R ^ r)) := by + rw [localCoarseGraining_negative_weight_mul_response_scale_rpow s1 s r hr j] + ring + +/-- The response-localized forcing component is exactly the declared local +forcing aggregation after taking the finite power. -/ +private theorem localCoarseGraining_forcing_series_eq_localForcing + {d : ℕ} (Q : TriadicCube d) (n : ℤ) + (s1 s : FractionalOrder) (p : FiniteLpExponent) + (P : ℝ≥0∞) (g : Vec d → Vec d) : + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * P * + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal)) = + P ^ p.exponent.toReal * + (localCoarseGrainingForcingLp Q n s1 s p g) ^ p.exponent.toReal := by + rw [localCoarseGraining_weighted_component_factorization Q n s1 s + p.exponent.toReal (ENNReal.toReal_nonneg) P + (fun _ R => ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g))] + rw [localCoarseGrainingForcingLp_rpow_eq_powerEnergy] + unfold localCoarseGrainingForcingPowerEnergy + apply congrArg (fun X : ℝ≥0∞ => P ^ p.exponent.toReal * X) + apply tsum_congr + intro j + congr 3 + ring + +/-- The dependent restricted-energy summand has the same exact +factorization; this version works directly with the attached finite sum so +the restriction proof remains available. -/ +private theorem localCoarseGraining_energy_series_eq_weightedEnergy + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) + (s1 s : FractionalOrder) (p : FiniteLpExponent) + (P : ℝ≥0∞) : + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (j : ℝ)))) * + ((descendantsAtScale Q (n - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (n - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * P * + localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ + p.exponent.toReal)) = + P ^ p.exponent.toReal * + (weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) ^ p.exponent.toReal := by + rw [weightedLocalSymmetricEnergyLp_rpow_eq_tsum] + rw [← ENNReal.tsum_mul_left] + apply tsum_congr + intro j + let D : Finset (TriadicCube d) := descendantsAtScale Q (n - (j : ℤ)) + let S : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) + let r : ℝ := p.exponent.toReal + have hr : 0 ≤ r := ENNReal.toReal_nonneg + have hsum : D.attach.sum (fun R => + (S * P * localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) = + S ^ r * P ^ r * D.attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by + calc + D.attach.sum (fun R => + (S * P * localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) = + D.attach.sum (fun R => S ^ r * P ^ r * + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by + apply Finset.sum_congr rfl + intro R _ + rw [ENNReal.mul_rpow_of_nonneg _ _ hr, + ENNReal.mul_rpow_of_nonneg _ _ hr] + _ = S ^ r * P ^ r * D.attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by + rw [Finset.mul_sum] + change ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (D.card : ℝ≥0∞)⁻¹ * _ = + P ^ r * + (ENNReal.ofReal (Real.rpow 3 + (-((s.1 - s1.1) * r * (j : ℝ)))) * + (D.card : ℝ≥0∞)⁻¹ * _) + rw [hsum] + calc + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (D.card : ℝ≥0∞)⁻¹ * + (S ^ r * P ^ r * D.attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r)) = + P ^ r * (ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * S ^ r) * + (D.card : ℝ≥0∞)⁻¹ * D.attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by ring + _ = P ^ r * ENNReal.ofReal (Real.rpow 3 + (-((s.1 - s1.1) * r * (j : ℝ)))) * + (D.card : ℝ≥0∞)⁻¹ * D.attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by + rw [localCoarseGraining_negative_weight_mul_response_scale_rpow s1 s r hr j] + _ = _ := by ring + +/-- The convex finite-power triangle coefficient becomes at most `2` after +the single outer finite-`p` root. -/ +private theorem localCoarseGraining_triangle_coefficient_root_le_two + {r : ℝ} (hr : 1 ≤ r) : + ((2 : ℝ≥0∞) ^ (r - 1)) ^ r⁻¹ ≤ 2 := by + have hrpos : 0 < r := lt_of_lt_of_le zero_lt_one hr + have hinv : 0 ≤ r⁻¹ := inv_nonneg.mpr hrpos.le + have hexp : (r - 1) * r⁻¹ ≤ 1 := by + calc + (r - 1) * r⁻¹ = 1 - r⁻¹ := by field_simp [hrpos.ne'] + _ ≤ 1 := sub_le_self _ hinv + calc + ((2 : ℝ≥0∞) ^ (r - 1)) ^ r⁻¹ = + (2 : ℝ≥0∞) ^ ((r - 1) * r⁻¹) := by rw [← ENNReal.rpow_mul] + _ ≤ 2 ^ (1 : ℝ) := ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) hexp + _ = 2 := ENNReal.rpow_one _ + +/-- The finite-power triangle is already available for one physical-scale +average; this wrapper only transports a pointwise one-cube bound into that +canonical form. -/ +private theorem localCoarseGraining_one_scale_pointwise_add_bound + {d : ℕ} (Q : TriadicCube d) (k : ℤ) {r : ℝ} (hr : 1 ≤ r) + (K : ℝ≥0∞) (L E F : TriadicCube d → ℝ≥0∞) + (h : ∀ R ∈ descendantsAtScale Q k, L R ≤ K * (E R + F R)) : + descendantsAtScaleENNAverage Q k (fun R => (L R) ^ r) ≤ + K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q k (fun R => (E R) ^ r) + + descendantsAtScaleENNAverage Q k (fun R => (F R) ^ r)) := by + calc + descendantsAtScaleENNAverage Q k (fun R => (L R) ^ r) ≤ + descendantsAtScaleENNAverage Q k (fun R => (K * (E R + F R)) ^ r) := by + unfold descendantsAtScaleENNAverage + apply mul_le_mul_right + apply Finset.sum_le_sum + intro R hR + exact ENNReal.rpow_le_rpow (h R hR) (by positivity) + _ = K ^ r * descendantsAtScaleENNAverage Q k (fun R => (E R + F R) ^ r) := by + simp_rw [ENNReal.mul_rpow_of_nonneg _ _ (by positivity : (0 : ℝ) ≤ r)] + exact localCoarseGraining_descendantsAtScale_average_mul_left Q k (K ^ r) _ + _ ≤ K ^ r * ((2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q k (fun R => (E R) ^ r) + + descendantsAtScaleENNAverage Q k (fun R => (F R) ^ r))) := by + gcongr + exact descendantsAtScaleENNAverage_rpow_add_le Q k hr E F + _ = _ := by ring + +/-- The final dimension-only coefficient simultaneously absorbs the outer +two-term finite-`p` triangle and the sharp `5 · 3^d` forcing factor. -/ +private theorem two_mul_le_ten_mul_three_pow_dim + {d : ℕ} (K : ℝ≥0∞) : + 2 * K ≤ (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * K := by + have hthree : (1 : ℝ≥0∞) ≤ (3 ^ d : ℝ≥0∞) := by + exact one_le_pow₀ (by norm_num) + calc + 2 * K = K * 2 := by ring + _ ≤ K * (10 : ℝ≥0∞) := mul_le_mul_right (by norm_num) K + _ = (10 : ℝ≥0∞) * K := by ring + _ ≤ (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * K := by + have hcoef : (10 : ℝ≥0∞) ≤ 10 * (3 ^ d : ℝ≥0∞) := by + calc + (10 : ℝ≥0∞) = 10 * 1 := by ring + _ ≤ 10 * (3 ^ d : ℝ≥0∞) := mul_le_mul_right hthree 10 + calc + 10 * K = K * 10 := by ring + _ ≤ K * (10 * (3 ^ d : ℝ≥0∞)) := mul_le_mul_right hcoef K + _ = 10 * (3 ^ d : ℝ≥0∞) * K := by ring + +private theorem ten_mul_three_pow_dim_mul_lt_top + {d : ℕ} (K : ℝ≥0∞) (hK : K < ∞) : + (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * K < ∞ := by + apply ENNReal.mul_lt_top + · exact ENNReal.mul_lt_top (by norm_num) (by simp) + · exact hK + +/-- The physical-scale series obtained from the pointwise one-cube theorem. +This is deliberately stated before taking the outer root: the two terms are +then exactly the energy and forcing series which the two preceding modules +already expose. -/ +private theorem localCoarseGraining_outer_power_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s1 s s2 : FractionalOrder) (hs1s : s1.1 < s.1) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) + (u : H1Function (openCubeSet Q)) (hu : IsForcedEquation Q a u g) : + (localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p) ^ + p.exponent.toReal ≤ + (ENNReal.ofReal (localCoarseGrainingOneCubeConstant d)) ^ p.exponent.toReal * + (2 : ℝ≥0∞) ^ (p.exponent.toReal - 1) * + ((ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1) ^ p.exponent.toReal * + (weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) ^ + p.exponent.toReal + + (ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2)) ^ + p.exponent.toReal * + (localCoarseGrainingForcingLp Q n s1 s p g) ^ + p.exponent.toReal) := by + classical + let r : ℝ := p.exponent.toReal + let K : ℝ≥0∞ := ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) + let A : ℝ≥0∞ := ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar Q n hn a sigma0 hsigma0 s1 + let B : ℝ≥0∞ := ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) + let E : ℕ → TriadicCube d → ℝ≥0∞ := fun j R => + if hR : R ∈ descendantsAtScale Q (n - (j : ℤ)) then + ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * A * + localSymmetricEnergyENorm R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + else 0 + let F : ℕ → TriadicCube d → ℝ≥0∞ := fun j R => + ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * B * + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g) + have hr : (1 : ℝ) ≤ r := by + dsimp [r] + exact le_trans (by norm_num) (ENNReal.toReal_mono p.lt_top.ne hp) + have hlevel : ∀ j : ℕ, + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ r) ≤ + K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r) + + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r)) := by + intro j + apply localCoarseGraining_one_scale_pointwise_add_bound Q (n - (j : ℤ)) hr K (fun R => + ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) (E j) (F j) + intro R hR + have hbound := localCoarseGraining_descendant_oneCube_parent_bound Q n hn a sigma0 hsigma0 + s1 s s2 hs1s hss2 p hp g hg u hu j hR + calc + ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖ ≤ K * + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * + (A * localSymmetricEnergyENorm R + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) hR)) + + B * ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g))) := by + simpa only [K, A, B] using hbound + _ = K * (E j R + F j R) := by + simp only [E, F, dif_pos hR] + ring + rw [localFluxDefectNegativeBesovLpAverage_rpow_eq_tsum_descendantsAtScale] + calc + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ r)) ≤ + ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r) + + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r))) := by + apply ENNReal.tsum_le_tsum + intro j + exact mul_le_mul_right (hlevel j) _ + _ = K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + ((∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r)) + + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r))) := by + have hdistrib : (fun j : ℕ => + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + (K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r) + + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r)))) = + (fun (j : ℕ) => K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r) + + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (F j R) ^ r))) := by + funext j + ring + rw [hdistrib] + rw [ENNReal.tsum_mul_left, ENNReal.tsum_add] + _ = K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * + (A ^ r * (weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) ^ r + + B ^ r * (localCoarseGrainingForcingLp Q n s1 s p g) ^ r) := by + congr 3 + · have hE : (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => (E j R) ^ r)) = + (∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-(s.1 * r * (j : ℝ)))) * + ((descendantsAtScale Q (n - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (n - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * A * + localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r)) := by + apply tsum_congr + intro j + unfold descendantsAtScaleENNAverage + have hsum : (∑ R ∈ descendantsAtScale Q (n - (j : ℤ)), (E j R) ^ r) = + (descendantsAtScale Q (n - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal (Real.rpow 3 (s1.1 * (j : ℝ))) * A * + localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ r) := by + rw [← Finset.sum_attach] + apply Finset.sum_congr rfl + intro R hR + simp only [E, dif_pos R.2] + rw [hsum] + ring + rw [hE] + simpa only [r] using + localCoarseGraining_energy_series_eq_weightedEnergy Q n hn a u s1 s p A + · simpa only [r, F, B] using + localCoarseGraining_forcing_series_eq_localForcing Q n s1 s p B g + _ = _ := by rfl + +/-- Taking the one outer finite-`p` root leaves only the universal two-term +triangle factor. -/ +private theorem localCoarseGraining_outer_root_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s1 s s2 : FractionalOrder) (hs1s : s1.1 < s.1) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) + (u : H1Function (openCubeSet Q)) (hu : IsForcedEquation Q a u g) : + localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p ≤ + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g) := by + let r : ℝ := p.exponent.toReal + let K : ℝ≥0∞ := ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) + let A : ℝ≥0∞ := ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar Q n hn a sigma0 hsigma0 s1 + let B : ℝ≥0∞ := ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) + let E : ℝ≥0∞ := weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + let F : ℝ≥0∞ := localCoarseGrainingForcingLp Q n s1 s p g + have hr : (1 : ℝ) ≤ r := by + dsimp [r] + exact le_trans (by norm_num) (ENNReal.toReal_mono p.lt_top.ne hp) + have hrpos : 0 < r := lt_of_lt_of_le zero_lt_one hr + have hinv : 0 ≤ r⁻¹ := inv_nonneg.mpr hrpos.le + have hpow := localCoarseGraining_outer_power_bound Q n hn a sigma0 hsigma0 + s1 s s2 hs1s hss2 p hp g hg u hu + have hroot : localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p = + (localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p ^ r) ^ r⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hrpos.ne', ENNReal.rpow_one] + have hinner : (A ^ r * E ^ r + B ^ r * F ^ r) ^ r⁻¹ ≤ A * E + B * F := by + calc + (A ^ r * E ^ r + B ^ r * F ^ r) ^ r⁻¹ = + ((A * E) ^ r + (B * F) ^ r) ^ r⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg A E hrpos.le, + ENNReal.mul_rpow_of_nonneg B F hrpos.le] + _ ≤ ((A * E) ^ r) ^ r⁻¹ + ((B * F) ^ r) ^ r⁻¹ := + ENNReal_rpow_inv_add_le_add_rpow_inv hr ((A * E) ^ r) ((B * F) ^ r) + _ = A * E + B * F := by + rw [← ENNReal.rpow_mul (A * E) r r⁻¹, + ← ENNReal.rpow_mul (B * F) r r⁻¹, + mul_inv_cancel₀ hrpos.ne', ENNReal.rpow_one, + ENNReal.rpow_one] + calc + localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p = + (localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p ^ r) ^ r⁻¹ := hroot + _ ≤ (K ^ r * (2 : ℝ≥0∞) ^ (r - 1) * (A ^ r * E ^ r + B ^ r * F ^ r)) ^ r⁻¹ := by + apply ENNReal.rpow_le_rpow hpow hinv + _ = K * ((2 : ℝ≥0∞) ^ (r - 1)) ^ r⁻¹ * + (A ^ r * E ^ r + B ^ r * F ^ r) ^ r⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ hinv, + ENNReal.mul_rpow_of_nonneg _ _ hinv, + ← ENNReal.rpow_mul, ← ENNReal.rpow_mul, + mul_inv_cancel₀ hrpos.ne', ENNReal.rpow_one] + _ ≤ K * 2 * (A * E + B * F) := by + have hfac : K * ((2 : ℝ≥0∞) ^ (r - 1)) ^ r⁻¹ ≤ K * 2 := + mul_le_mul_right (localCoarseGraining_triangle_coefficient_root_le_two hr) K + exact mul_le_mul hfac hinner (by positivity) (by positivity) + _ = _ := by simp only [K, A, B, E, F]; ring + +/-- The exact local finite-`p` coarse-graining theorem frozen in the Chapter +3 declaration anchors. All regularity, trace, response, and summability +work is discharged internally through the one-cube and forcing seams. -/ +theorem exists_localCoarseGrainingLp (d : ℕ) (hd : 2 ≤ d) : + letI : NeZero d := ⟨by omega⟩ + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (p : FiniteLpExponent), (2 : ℝ≥0∞) ≤ p.exponent → + ∀ (m n : ℤ), ∀ (hnm : n < m), + ∀ (s1 s s2 : FractionalOrder), s1.1 < s.1 → s.1 < s2.1 → + ∀ (a : Book.Ch02.CoeffOn + (Book.Ch02.cubeDomain (originCube d m))) + (sigma0 : ℝ), ∀ (hsigma0 : 0 < sigma0), + ∀ (g : Vec d → Vec d), + MemCubeEuclideanFullWsp (originCube d m) s2 p g → + ∀ (u : H1Function (openCubeSet (originCube d m))), + IsForcedEquation (originCube d m) a u g → + localFluxDefectNegativeBesovLpAverage (originCube d m) n + (by simpa [originCube] using hnm.le) a sigma0 u s p ≤ + localCoarseGrainingLpRHS C + (originCube d m) n + (by simpa [originCube] using hnm.le) + a sigma0 hsigma0 g u s1 s s2 p := by + let : NeZero d := ⟨by omega⟩ + let C : ℝ≥0∞ := (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) + refine ⟨C, ?_, ?_⟩ + · apply ten_mul_three_pow_dim_mul_lt_top + exact ENNReal.ofReal_lt_top + intro p hp m n hnm s1 s s2 hs1s hss2 a sigma0 hsigma0 g hg u hu + let Q : TriadicCube d := originCube d m + have hn : n ≤ Q.scale := by simpa [Q, originCube] using hnm.le + have hroot := localCoarseGraining_outer_root_bound Q n hn a sigma0 hsigma0 + s1 s s2 hs1s hss2 p hp g hg u hu + have hforce := localCoarseGrainingForcingLp_le_five_mul_gap_inv_mul_scale_mul_overlap + Q n hn s1 s s2 hs1s hss2 p hp g hg + have hnorm := localCoarseGraining_scale_normalizations s.2.1 hsigma0 + have hroot' := hroot + rw [hnorm.1, hnorm.2.1, hnorm.2.2] at hroot' + unfold localCoarseGrainingLpRHS + change localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p ≤ _ + calc + localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p ≤ + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + + (ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g) := hroot' + _ ≤ C * (ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + + C * (ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (ENNReal.ofReal (s2.1 - s.1))⁻¹ * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + rw [show C = (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) by rfl] + have hcoef := two_mul_le_ten_mul_three_pow_dim + (ENNReal.ofReal (localCoarseGrainingOneCubeConstant d)) (d := d) + have henergy : + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) ≤ + C * (ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p := by + calc + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) = + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) * + (2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d)) := by ring + _ ≤ ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) * + ((10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d)) := + mul_le_mul_right hcoef _ + _ = _ := by + rw [show C = (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) by rfl] + ring + have hforcing : + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g) ≤ + C * (ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (ENNReal.ofReal (s2.1 - s.1))⁻¹ * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + have hgap : ENNReal.ofReal ((s2.1 - s.1)⁻¹) = + (ENNReal.ofReal (s2.1 - s.1))⁻¹ := + ENNReal.ofReal_inv_of_pos (by linarith) + rw [hgap] at hforce + calc + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g) ≤ + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + ((5 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (ENNReal.ofReal (s2.1 - s.1))⁻¹ * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g)) := by + gcongr + _ = _ := by + rw [show C = (10 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) by rfl] + norm_num + ring + calc + 2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + + (ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g) = + (2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p)) + + (2 * ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + ((ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (1 + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + localCoarseGrainingForcingLp Q n s1 s p g)) := by ring + _ ≤ _ := add_le_add henergy hforcing + + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAggregation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAggregation.lean new file mode 100644 index 0000000000..c461b64e00 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAggregation.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization + +/-! +# Finite-`p` local coarse-graining aggregation algebra + +This file contains the elementary `ENNReal` power identities used to assemble +the finite-`p` local coarse-graining estimate. It has no PDE content. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + +/-- The normalized `ENNReal` average over descendants at a prescribed +physical triadic scale. -/ +noncomputable def descendantsAtScaleENNAverage {d : ℕ} (Q : TriadicCube d) + (k : ℤ) (F : TriadicCube d → ℝ≥0∞) : ℝ≥0∞ := + ((descendantsAtScale Q k).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, F R + +/-- At an admissible physical scale, the physical-scale average is precisely +the canonical depth-descendant average. -/ +theorem descendantsAtScaleENNAverage_eq_descendantsENNAverage {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (hk : k ≤ Q.scale) + (F : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q k F = + descendantsENNAverage Q (Int.toNat (Q.scale - k)) F := by + rw [descendantsAtScaleENNAverage, descendantsENNAverage, + descendantsAtScale_eq_descendantsAtDepth Q hk] + +/-- Raising the running-scale negative Besov seminorm to the finite exponent +recovers its unrooted depth-energy series. -/ +theorem cubeEuclideanNegativeBesovESeminorm_rpow_eq_tsum_depthEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + (cubeEuclideanNegativeBesovESeminorm Q s p F) ^ p.exponent.toReal = + ∑' j : ℕ, cubeEuclideanNegativeBesovDepthEnergy Q s p F j := by + rw [cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy, + ENNReal.rpow_inv_rpow (finiteLpExponent_toReal_pos p).ne'] + +/-- Raising the weighted local symmetric-energy aggregation to the finite +exponent exposes its exact running physical-scale series. -/ +theorem weightedLocalSymmetricEnergyLp_rpow_eq_tsum {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) + (s1 s : FractionalOrder) (p : FiniteLpExponent) : + (weightedLocalSymmetricEnergyLp Q n hn a u s1 s p) ^ p.exponent.toReal = + ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 (-((s.1 - s1.1) * p.exponent.toReal * (j : ℝ)))) * + ((descendantsAtScale Q (n - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (n - (j : ℤ))).attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ + p.exponent.toReal) := by + unfold weightedLocalSymmetricEnergyLp + rw [one_div, ENNReal.rpow_inv_rpow (finiteLpExponent_toReal_pos p).ne'] + +/-- Normalized `ENNReal` descendant averages compose exactly across one +triadic generation. -/ +theorem descendantsENNAverage_succ_eq_descendantsENNAverage_descendantsENNAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ≥0∞) : + descendantsENNAverage Q (j + 1) F = + descendantsENNAverage Q j (fun R => descendantsENNAverage R 1 F) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + ∑ S ∈ descendantsAtDepth Q (j + 1), F S = + ∑ R ∈ D, ∑ S ∈ childCubes R, F S := by + rw [descendantsAtDepth_succ, Finset.sum_biUnion] + intro R hR S hS hRS + exact disjoint_childCubes_of_ne hRS + have hcoeff : + (((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ≥0∞)⁻¹ = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * ((3 ^ d : ℕ) : ℝ≥0∞)⁻¹ := by + rw [Nat.cast_mul] + exact ENNReal.mul_inv (Or.inr ENNReal.coe_ne_top) (Or.inl ENNReal.coe_ne_top) + calc + descendantsENNAverage Q (j + 1) F = + (((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ≥0∞)⁻¹ * + ∑ S ∈ descendantsAtDepth Q (j + 1), F S := by + rw [descendantsENNAverage, descendantsAtDepth_card_succ] + _ = (((descendantsAtDepth Q j).card * 3 ^ d : ℕ) : ℝ≥0∞)⁻¹ * + ∑ R ∈ D, ∑ S ∈ childCubes R, F S := by rw [hsum] + _ = ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (((3 ^ d : ℕ) : ℝ≥0∞)⁻¹ * + ∑ R ∈ D, ∑ S ∈ childCubes R, F S) := by + rw [hcoeff] + ring + _ = ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ D, (((3 ^ d : ℕ) : ℝ≥0∞)⁻¹ * + ∑ S ∈ childCubes R, F S) := by rw [Finset.mul_sum] + _ = descendantsENNAverage Q j (fun R => descendantsENNAverage R 1 F) := by + simp [descendantsENNAverage, D, childCubes_card] + +/-- Normalized `ENNReal` descendant averages compose at arbitrary finite +depths. -/ +theorem descendantsENNAverage_add_eq_descendantsENNAverage_descendantsENNAverage + {d : ℕ} (Q : TriadicCube d) (j n : ℕ) (F : TriadicCube d → ℝ≥0∞) : + descendantsENNAverage Q (j + n) F = + descendantsENNAverage Q j (fun R => descendantsENNAverage R n F) := by + induction n generalizing Q F with + | zero => simp [descendantsENNAverage] + | succ n ih => + calc + descendantsENNAverage Q (j + (n + 1)) F = + descendantsENNAverage Q (j + n) + (fun R => descendantsENNAverage R 1 F) := by + simpa [Nat.add_assoc] using + descendantsENNAverage_succ_eq_descendantsENNAverage_descendantsENNAverage + Q (j + n) F + _ = descendantsENNAverage Q j (fun R => + descendantsENNAverage R n (fun S => descendantsENNAverage S 1 F)) := by + simpa using ih Q (fun S => descendantsENNAverage S 1 F) + _ = descendantsENNAverage Q j (fun R => descendantsENNAverage R (n + 1) F) := by + refine congrArg (descendantsENNAverage Q j) ?_ + funext R + symm + exact + descendantsENNAverage_succ_eq_descendantsENNAverage_descendantsENNAverage + R n F + +/-- The rooted geometric-tail loss is bounded by a single inverse gap, with +a constant independent of the finite exponent. -/ +theorem geometricDiscount_rpow_neg_inv_le_twentyFive_mul_inv + {delta alpha : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (halpha : 2 ≤ alpha) : + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-1 / alpha) ≤ + 25 * delta⁻¹ := by + have halpha_pos : 0 < alpha := lt_of_lt_of_le (by norm_num) halpha + have hdisc_pos : 0 < Book.Ch02.geometricDiscount delta alpha := + Book.Ch02.book_geometricDiscount_pos (mul_pos hdelta halpha_pos) + have hdisc_le_one : Book.Ch02.geometricDiscount delta alpha ≤ 1 := by + unfold Book.Ch02.geometricDiscount + have hpow_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-delta * alpha) := + Real.rpow_nonneg (by norm_num) _ + linarith + have hpow_le : + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-1 / alpha) ≤ + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-2 / alpha) := by + apply Real.rpow_le_rpow_of_exponent_ge hdisc_pos hdisc_le_one + field_simp [halpha_pos.ne'] + linarith + have htail_le : + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-2 / alpha) ≤ + 25 * Real.rpow delta (-2 / alpha) := + Book.Ch02.geometricDiscount_rpow_neg_two_div_le_twentyFive_mul + hdelta hdelta_le (by linarith) + have hdelta_pow_le : Real.rpow delta (-2 / alpha) ≤ delta⁻¹ := by + rw [show delta⁻¹ = Real.rpow delta (-1 : ℝ) by + simpa using (Real.rpow_neg_one delta).symm] + apply Real.rpow_le_rpow_of_exponent_ge hdelta hdelta_le + field_simp [halpha_pos.ne'] + linarith + calc + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-1 / alpha) + ≤ Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-2 / alpha) := hpow_le + _ ≤ 25 * Real.rpow delta (-2 / alpha) := htail_le + _ ≤ 25 * delta⁻¹ := by gcongr + +/-- The preceding uniform tail bound specialized to a finite `Lp` exponent. -/ +theorem geometricDiscount_rpow_neg_inv_le_twentyFive_mul_inv_finiteLp + {delta : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (p : FiniteLpExponent) (hp : 2 ≤ p.exponent.toReal) : + Real.rpow (Book.Ch02.geometricDiscount delta p.exponent.toReal) + (-1 / p.exponent.toReal) ≤ 25 * delta⁻¹ := + geometricDiscount_rpow_neg_inv_le_twentyFive_mul_inv hdelta hdelta_le hp + +/-- `ENNReal` geometric-series form of the exponent-uniform rooted tail +bound. The ratio is the triadic decay at gap `delta`. -/ +theorem ENNReal_tsum_triadic_rpow_root_le_twentyFive_mul_inv + {delta alpha : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (halpha : 2 ≤ alpha) : + (∑' j : ℕ, + (ENNReal.ofReal (Real.rpow 3 (-delta * alpha))) ^ j) ^ (1 / alpha) ≤ + ENNReal.ofReal (25 * delta⁻¹) := by + have halpha_pos : 0 < alpha := lt_of_lt_of_le (by norm_num) halpha + have hratio_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-delta * alpha) := + Real.rpow_nonneg (by norm_num) _ + have hdisc_pos : 0 < Book.Ch02.geometricDiscount delta alpha := + Book.Ch02.book_geometricDiscount_pos (mul_pos hdelta halpha_pos) + have htail : + ∑' j : ℕ, (ENNReal.ofReal (Real.rpow 3 (-delta * alpha))) ^ j = + ENNReal.ofReal (Book.Ch02.geometricDiscount delta alpha)⁻¹ := by + rw [ENNReal.tsum_geometric, ENNReal.ofReal_inv_of_pos hdisc_pos] + congr 1 + simpa [Book.Ch02.geometricDiscount] using + (ENNReal.ofReal_sub 1 hratio_nonneg).symm + have hroot : + Real.rpow ((Book.Ch02.geometricDiscount delta alpha)⁻¹) (1 / alpha) = + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-1 / alpha) := by + calc + Real.rpow ((Book.Ch02.geometricDiscount delta alpha)⁻¹) (1 / alpha) = + Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-(1 / alpha)) := + (Real.rpow_neg_eq_inv_rpow _ _).symm + _ = Real.rpow (Book.Ch02.geometricDiscount delta alpha) (-1 / alpha) := by + congr 1 + ring + rw [htail, ENNReal.ofReal_rpow_of_pos (inv_pos.mpr hdisc_pos)] + apply ENNReal.ofReal_le_ofReal + change Real.rpow ((Book.Ch02.geometricDiscount delta alpha)⁻¹) (1 / alpha) ≤ + 25 * delta⁻¹ + rw [hroot] + exact geometricDiscount_rpow_neg_inv_le_twentyFive_mul_inv hdelta hdelta_le halpha + +/-- Finite-`Lp` specialization of the `ENNReal` triadic tail bound. -/ +theorem ENNReal_tsum_triadic_rpow_root_le_twentyFive_mul_inv_finiteLp + {delta : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (p : FiniteLpExponent) (hp : 2 ≤ p.exponent.toReal) : + (∑' j : ℕ, + (ENNReal.ofReal (Real.rpow 3 (-delta * p.exponent.toReal))) ^ j) ^ + (1 / p.exponent.toReal) ≤ + ENNReal.ofReal (25 * delta⁻¹) := + ENNReal_tsum_triadic_rpow_root_le_twentyFive_mul_inv hdelta hdelta_le hp + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAssemblyAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAssemblyAlgebra.lean new file mode 100644 index 0000000000..8ce66b9bee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingAssemblyAlgebra.lean @@ -0,0 +1,122 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation + +/-! +# Finite-`p` algebra for local coarse-graining assembly + +This module records the outer finite descendant-average triangle estimate in +the literal `ENNReal` carrier used by the local coarse-graining definitions. +It is independent of the PDE and response inputs. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped ENNReal + +noncomputable section + +/-- The finite outer descendant average obeys the powered two-term triangle +inequality. This is the algebraic form used before taking the single outer +finite-`p` root in the local coarse-graining assembly. -/ +theorem descendantsAtScaleENNAverage_rpow_add_le {d : ℕ} + (Q : TriadicCube d) (k : ℤ) {r : ℝ} (hr : 1 ≤ r) + (F G : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q k (fun R => (F R + G R) ^ r) ≤ + (2 : ℝ≥0∞) ^ (r - 1) * + (descendantsAtScaleENNAverage Q k (fun R => (F R) ^ r) + + descendantsAtScaleENNAverage Q k (fun R => (G R) ^ r)) := by + classical + let D : Finset (TriadicCube d) := descendantsAtScale Q k + let C : ℝ≥0∞ := (2 : ℝ≥0∞) ^ (r - 1) + have hpoint : ∀ R ∈ D, (F R + G R) ^ r ≤ C * ((F R) ^ r + (G R) ^ r) := by + intro R hR + exact ENNReal.rpow_add_le_mul_rpow_add_rpow (F R) (G R) hr + have hsum : + ∑ R ∈ D, (F R + G R) ^ r ≤ + ∑ R ∈ D, C * ((F R) ^ r + (G R) ^ r) := by + exact Finset.sum_le_sum fun R hR => hpoint R (by simpa [D] using hR) + unfold descendantsAtScaleENNAverage + change + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (F R + G R) ^ r ≤ + C * ((D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (F R) ^ r + + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (G R) ^ r) + calc + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (F R + G R) ^ r ≤ + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, C * ((F R) ^ r + (G R) ^ r) := + mul_le_mul_right hsum _ + _ = C * ((D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (F R) ^ r + + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (G R) ^ r) := by + calc + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, C * ((F R) ^ r + (G R) ^ r) = + ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹ * C) * ((F R) ^ r + (G R) ^ r) := by + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro R hR + ring + _ = ((D.card : ℝ≥0∞)⁻¹ * C) * + (∑ R ∈ D, (F R) ^ r + ∑ R ∈ D, (G R) ^ r) := by + calc + ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹ * C) * ((F R) ^ r + (G R) ^ r) = + ∑ R ∈ D, (((D.card : ℝ≥0∞)⁻¹ * C) * (F R) ^ r + + ((D.card : ℝ≥0∞)⁻¹ * C) * (G R) ^ r) := by + apply Finset.sum_congr rfl + intro R hR + ring + _ = ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹ * C) * (F R) ^ r + + ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹ * C) * (G R) ^ r := by + rw [Finset.sum_add_distrib] + _ = ((D.card : ℝ≥0∞)⁻¹ * C) * + (∑ R ∈ D, (F R) ^ r + ∑ R ∈ D, (G R) ^ r) := by + rw [← Finset.mul_sum, ← Finset.mul_sum] + ring + _ = C * ((D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (F R) ^ r + + (D.card : ℝ≥0∞)⁻¹ * ∑ R ∈ D, (G R) ^ r) := by ring + +/-- After the outer finite-`p` root, the preceding two-term descendant-average +triangle loss is the uniform constant `2`. -/ +theorem descendantsAtScaleENNAverage_rpow_add_root_le_two_mul {d : ℕ} + (Q : TriadicCube d) (k : ℤ) {r : ℝ} (hr : 1 ≤ r) + (F G : TriadicCube d → ℝ≥0∞) : + (descendantsAtScaleENNAverage Q k (fun R => (F R + G R) ^ r)) ^ r⁻¹ ≤ + 2 * (descendantsAtScaleENNAverage Q k (fun R => (F R) ^ r) + + descendantsAtScaleENNAverage Q k (fun R => (G R) ^ r)) ^ r⁻¹ := by + let A : ℝ≥0∞ := descendantsAtScaleENNAverage Q k (fun R => (F R + G R) ^ r) + let B : ℝ≥0∞ := descendantsAtScaleENNAverage Q k (fun R => (F R) ^ r) + + descendantsAtScaleENNAverage Q k (fun R => (G R) ^ r) + have hr_pos : 0 < r := lt_of_lt_of_le zero_lt_one hr + have hinv : 0 ≤ r⁻¹ := inv_nonneg.mpr hr_pos.le + have hpower : A ≤ (2 : ℝ≥0∞) ^ (r - 1) * B := by + dsimp [A, B] + exact descendantsAtScaleENNAverage_rpow_add_le Q k hr F G + have hexp : (r - 1) * r⁻¹ ≤ 1 := by + calc + (r - 1) * r⁻¹ = 1 - r⁻¹ := by field_simp [hr_pos.ne'] + _ ≤ 1 := sub_le_self _ hinv + have htwo : (2 : ℝ≥0∞) ^ ((r - 1) * r⁻¹) ≤ 2 := + (ENNReal.rpow_le_rpow_of_exponent_le (show (1 : ℝ≥0∞) ≤ 2 by norm_num) hexp).trans_eq + (ENNReal.rpow_one _) + calc + A ^ r⁻¹ ≤ ((2 : ℝ≥0∞) ^ (r - 1) * B) ^ r⁻¹ := + ENNReal.rpow_le_rpow hpower hinv + _ = (2 : ℝ≥0∞) ^ ((r - 1) * r⁻¹) * B ^ r⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ hinv, ← ENNReal.rpow_mul] + _ ≤ 2 * B ^ r⁻¹ := mul_le_mul_left htwo _ + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDefinitions.lean new file mode 100644 index 0000000000..2a9e40e8d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDefinitions.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FluxComparisonDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.ParentTruncatedHomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLp + +/-! +# Exact local finite-`p` coarse-graining carriers + +This file owns the source-facing local finite-`p` coarse-graining definitions +from the ABK26 statement. It reuses the canonical running-scale negative +Besov seminorm, overlap positive Besov seminorm, and parent-truncated errors. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem memLp_hilbertify_normalizedCube_of_memVectorL2 {d : ℕ} + {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemVectorL2 (openCubeSet Q) F) : + MemLp (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q) := by + have hHilbert : MemLp (fun x => HilbertVec.ofVec (F x)) 2 + (volumeMeasureOn (openCubeSet Q)) := + memHilbertVectorL2_hilbertifyVecField hF + simpa only [volumeMeasureOn, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + hHilbert.smul_measure ENNReal.ofReal_ne_top + +private theorem memVectorL2_matVecMul_pointwiseCoeffOn {d : ℕ} + (Q : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) : + MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (a.toCoeffField x) (u.grad x)) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain Q) a + have hEll : IsEllipticFieldOn b.lam b.Lam (openCubeSet Q) b.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using + Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn + (Book.Ch02.cubeDomain Q) a + have hB : MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (b.toCoeffField x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain Q) a + apply (memLp_congr_ae ?_).mp hB + filter_upwards [hba] with x hx + simp only [hx] + +private theorem memVectorL2_localFluxDefect {d : ℕ} + {Q R : TriadicCube d} + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) (sigma0 : ℝ) + (u : H1Function (openCubeSet Q)) : + MemVectorL2 (openCubeSet R) + (fun x => matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x)) := by + let aR : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R) := + a.restrictToSubcube hRQ + let uR : H1Function (openCubeSet R) := + u.restrict (isOpen_openCubeSet R) hRQ + have hflux : MemVectorL2 (openCubeSet R) + (fun x => matVecMul (aR.toCoeffField x) (uR.grad x)) := + memVectorL2_matVecMul_pointwiseCoeffOn R aR uR + have hscalar : MemVectorL2 (openCubeSet R) + (fun x => sigma0 • uR.grad x) := + uR.grad_memVectorL2.const_smul sigma0 + have hsub := hflux.sub hscalar + simpa only [aR, uR, Book.Ch02.CoeffOn.restrictToSubcube_toCoeffField, + H1Function.restrict, sub_matVecMul, matVecMul_scalarMatrix] using! hsub + +/-- Full finite-`p` fractional Sobolev membership on a cube. -/ +def MemCubeEuclideanFullWsp {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) + (g : Vec d → Vec d) : Prop := + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q) ∧ + MemCubeEuclideanWsp Q s p g + +/-- Weak form of the heterogeneous forced equation on a cube. -/ +def IsForcedEquation {d : ℕ} (Q : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) (g : Vec d → Vec d) : Prop := + ∀ phi : H10Function (openCubeSet Q), + (∫ x in openCubeSet Q, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) + (phi.toH1Function.grad x) ∂MeasureTheory.volume) = + -(∫ x in openCubeSet Q, + vecDot (g x) (phi.toH1Function.grad x) ∂MeasureTheory.volume) + +/-- Weak form of the scalar-comparator forced equation on a cube. -/ +def IsScalarForcedEquation {d : ℕ} (Q : TriadicCube d) (sigma0 : ℝ) + (v : H1Function (openCubeSet Q)) (g : Vec d → Vec d) : Prop := + ∀ phi : H10Function (openCubeSet Q), + (∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (v.grad x)) + (phi.toH1Function.grad x) ∂MeasureTheory.volume) = + -(∫ x in openCubeSet Q, + vecDot (g x) (phi.toH1Function.grad x) ∂MeasureTheory.volume) + +/-- Function-level zero-trace difference on an arbitrary cube. -/ +def HasH10Difference {d : ℕ} (Q : TriadicCube d) + (u v : H1Function (openCubeSet Q)) : Prop := + ∃ w : H10Function (openCubeSet Q), + w.toH1Function.toFun =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => u.toFun x - v.toFun x + +/-- The literal gradient difference, bundled with its `L²` certificate. -/ +noncomputable def gradientDifferenceL2Field {d : ℕ} + (Q : TriadicCube d) (u v : H1Function (openCubeSet Q)) : + CubeEuclideanLpField Q FiniteLpExponent.two where + toField := fun x => u.grad x - v.grad x + euclideanMemLp := by + rw [memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply, Pi.sub_apply] using! + (u.grad_memL2_normalizedCubeMeasure i).sub + (v.grad_memL2_normalizedCubeMeasure i) + +/-- The literal heterogeneous/scalar flux difference, bundled with `L²`. -/ +noncomputable def fluxDifferenceL2Field {d : ℕ} + (Q : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) (sigma0 : ℝ) + (u v : H1Function (openCubeSet Q)) : + CubeEuclideanLpField Q FiniteLpExponent.two where + toField := fun x => + matVecMul (a.toCoeffField x) (u.grad x) - + matVecMul (scalarMatrix (d := d) sigma0) (v.grad x) + euclideanMemLp := by + apply memLp_hilbertify_normalizedCube_of_memVectorL2 + simpa only [matVecMul_scalarMatrix] using! + (memVectorL2_matVecMul_pointwiseCoeffOn Q a u).sub + (v.grad_memVectorL2.const_smul sigma0) + +/-- The canonical reusable overlap positive Besov seminorm. -/ +noncomputable abbrev cubeEuclideanPositiveBesovOverlapESeminorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (g : Vec d → Vec d) : ℝ≥0∞ := + Homogenization.cubeEuclideanPositiveBesovOverlapESeminorm Q s p g + +/-- Restriction of an `H¹` function to a subcube. -/ +noncomputable def restrictH1ToSubcube {d : ℕ} {Q R : TriadicCube d} + (u : H1Function (openCubeSet Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + H1Function (openCubeSet R) := + u.restrict (isOpen_openCubeSet R) hRQ + +@[simp] theorem restrictH1ToSubcube_toFun {d : ℕ} {Q R : TriadicCube d} + (u : H1Function (openCubeSet Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + (restrictH1ToSubcube u hRQ).toFun = u.toFun := rfl + +@[simp] theorem restrictH1ToSubcube_grad {d : ℕ} {Q R : TriadicCube d} + (u : H1Function (openCubeSet Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + (restrictH1ToSubcube u hRQ).grad = u.grad := rfl + +/-- The normalized symmetric local energy. -/ +noncomputable def localSymmetricEnergyENorm {d : ℕ} + (R : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : ℝ≥0∞ := + (∫⁻ x, ENNReal.ofReal + (vecDot (u.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.grad x))) + ∂normalizedCubeMeasure R) ^ (1 / 2 : ℝ) + +/-- The weighted descendant `ell^p` aggregation of local symmetric energies. -/ +noncomputable def weightedLocalSymmetricEnergyLp {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (u : H1Function (openCubeSet Q)) + (s1 s : FractionalOrder) (p : FiniteLpExponent) : ℝ≥0∞ := by + classical + exact (∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 (-((s.1 - s1.1) * p.exponent.toReal * (j : ℝ)))) * + ((descendantsAtScale Q (n - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (n - (j : ℤ))).attach.sum (fun R => + (localSymmetricEnergyENorm R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale (by omega) R.2))) ^ + p.exponent.toReal)) ^ (1 / p.exponent.toReal) + +/-- The local scalar-comparator flux defect on a subcube. -/ +noncomputable def localFluxDefectL2Field {d : ℕ} + {Q R : TriadicCube d} + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) (sigma0 : ℝ) + (u : H1Function (openCubeSet Q)) : + CubeEuclideanLpField R FiniteLpExponent.two where + toField := fun x => + matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x) + euclideanMemLp := by + apply memLp_hilbertify_normalizedCube_of_memVectorL2 + exact memVectorL2_localFluxDefect a hRQ sigma0 u + +/-- The normalized `ell^p` average of descendant negative Besov flux defects. -/ +noncomputable def localFluxDefectNegativeBesovLpAverage {d : ℕ} + [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (u : H1Function (openCubeSet Q)) + (s : FractionalOrder) (p : FiniteLpExponent) : ℝ≥0∞ := by + classical + exact ENNReal.ofReal (Real.rpow 3 (-s.1 * (n : ℝ))) * + (((descendantsAtScale Q n).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q n).attach.sum (fun R => + (cubeEuclideanNegativeBesovESeminorm R.1 s p + (localFluxDefectL2Field a + (openCubeSet_subset_of_mem_descendantsAtScale hn R.2) + sigma0 u)) ^ p.exponent.toReal)) ^ + (1 / p.exponent.toReal) + +/-- The exact right-hand side of the local finite-`p` coarse-graining bound. -/ +noncomputable def localCoarseGrainingLpRHS {d : ℕ} [NeZero d] + (C : ℝ≥0∞) (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (g : Vec d → Vec d) (u : H1Function (openCubeSet Q)) + (s1 s s2 : FractionalOrder) (p : FiniteLpExponent) : ℝ≥0∞ := + C * (ENNReal.ofReal s.1)⁻¹ * (ENNReal.ofReal sigma0) ^ (1 / 2 : ℝ) * + Book.Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar + Q n hn a sigma0 hsigma0 s1 * + weightedLocalSymmetricEnergyLp Q n hn a u s1 s p + + C * (ENNReal.ofReal s.1) ^ (-(9 / 2 : ℝ)) * + (ENNReal.ofReal (s2.1 - s.1))⁻¹ * + (1 + + (Book.Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar + Q n hn a sigma0 hsigma0 (fractionalOrderHalf s1)) ^ 2) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDescendantWsp.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDescendantWsp.lean new file mode 100644 index 0000000000..11fade57ad --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingDescendantWsp.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingPDE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLpMembership + +/-! +# Descendant localization of the source fractional-Sobolev carrier + +The source finite-`p` datum is available on the parent cube. This file +provides its literal restriction to every triadic descendant, so one-cube +estimates can construct their regularity witnesses locally without adding a +new hypothesis to the local coarse-graining theorem. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem cubeEuclideanWspESeminorm_lt_top_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {s : FractionalOrder} {p : FiniteLpExponent} {g : Vec d → Vec d} + (hR : R ∈ descendantsAtDepth Q j) + (hg : MemCubeEuclideanWsp Q s p g) : + cubeEuclideanWspESeminorm R s p g < ∞ := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let E : TriadicCube d → ℝ≥0∞ := fun S => + (cubeEuclideanWspESeminorm S s p g) ^ p.exponent.toReal + have hparent : (cubeEuclideanWspESeminorm Q s p g) ^ p.exponent.toReal < ∞ := + ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hg.eSeminorm_lt_top.ne + have havg : descendantsENNAverage Q j E < ∞ := by + apply lt_of_le_of_lt + (descendantsENNAverage_cubeEuclideanWspESeminorm_rpow_le Q j s p g) + exact hparent + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne_zero : (D.card : ℝ≥0∞) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + have hcard_ne_top : (D.card : ℝ≥0∞) ≠ ∞ := ENNReal.coe_ne_top + have hsum : ∑ S ∈ D, E S < ∞ := by + have heq : ∑ S ∈ D, E S = (D.card : ℝ≥0∞) * descendantsENNAverage Q j E := by + unfold descendantsENNAverage + change ∑ S ∈ D, E S = + (D.card : ℝ≥0∞) * ((D.card : ℝ≥0∞)⁻¹ * ∑ S ∈ D, E S) + rw [← mul_assoc, ENNReal.mul_inv_cancel hcard_ne_zero hcard_ne_top, one_mul] + rw [heq] + exact ENNReal.mul_lt_top (lt_top_iff_ne_top.mpr ENNReal.coe_ne_top) havg + have hterm : E R < ∞ := by + apply lt_of_le_of_lt (Finset.single_le_sum (fun S _ => bot_le) (by simpa [D] using hR)) + exact hsum + exact (ENNReal.rpow_lt_top_iff_of_pos + (ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne)).mp hterm + +/-- A parent full Euclidean `W^{s,p}` source witness restricts canonically to +every triadic descendant. -/ +theorem MemCubeEuclideanFullWsp.onDescendant + {d : ℕ} {Q R : TriadicCube d} {n : ℤ} + {s : FractionalOrder} {p : FiniteLpExponent} {g : Vec d → Vec d} + (hn : n ≤ Q.scale) (hR : R ∈ descendantsAtScale Q n) + (hg : MemCubeEuclideanFullWsp Q s p g) : + MemCubeEuclideanFullWsp R s p g := by + have hRdepth : R ∈ descendantsAtDepth Q (Int.toNat (Q.scale - n)) := by + rw [← descendantsAtScale_eq_descendantsAtDepth Q hn] + exact hR + refine ⟨memLp_on_descendant_of_memLp_generic hRdepth hg.1, ?_⟩ + exact memCubeEuclideanWsp_of_memLp_of_eSeminorm_lt_top + (memLp_on_descendant_of_memLp_generic hRdepth hg.1) + (cubeEuclideanWspESeminorm_lt_top_on_descendant hRdepth hg.2) + +end +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingForcing.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingForcing.lean new file mode 100644 index 0000000000..8d2147148e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingForcing.lean @@ -0,0 +1,2682 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDescendantWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpDisjointBridge + +/-! +# Finite-`p` forcing aggregation for local coarse graining + +This module isolates the source forcing term before it is combined with the +PDE or response estimates. Its physical-scale index is written as `n - j`: +thus `j` is exactly the source depth below the prescribed scale `n`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +/-- The unrooted finite-`p` forcing aggregation. At outer depth `j`, this +uses the normalized average of the legacy local positive `q = 2` seminorms +over cubes at physical scale `n - j`; the coefficient is the manuscript's +`3^((s₁-s) p j)`. -/ +noncomputable def localCoarseGrainingForcingPowerEnergy {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s1 s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) : ℝ≥0∞ := + ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 (-(s.1 - s1.1) * p.exponent.toReal * (j : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) + +/-- The source normalized `ell^p` forcing aggregation, obtained by taking the +single outer finite-`p` root of `localCoarseGrainingForcingPowerEnergy`. -/ +noncomputable def localCoarseGrainingForcingLp {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s1 s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) : ℝ≥0∞ := + (localCoarseGrainingForcingPowerEnergy Q n s1 s p g) ^ + (p.exponent.toReal)⁻¹ + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + +private theorem overlapESeminorm_lt_top_of_memCubeEuclideanFullWsp + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) + (hg : MemCubeEuclideanFullWsp Q s p g) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p g < ∞ := by + let F : CubeEuclideanLpField Q p := + { toField := g + euclideanMemLp := hg.1 } + have hcomparison := cubeEuclideanOverlap_le_dimensionConstant_mul_wsp Q s p F + have hright : cubeEuclideanWspOverlapDimensionConstant d * + cubeEuclideanWspESeminorm Q s p g < ∞ := + ENNReal.mul_lt_top (cubeEuclideanWspOverlapDimensionConstant_lt_top d) + hg.2.eSeminorm_lt_top + apply lt_of_le_of_lt ?_ hright + simpa only [F] using hcomparison + +/-- The exact-overlap source hypothesis also makes the internal disjoint +power energy finite. This is the one permitted route from the localized +disjoint calculation back to the source-facing overlap carrier. -/ +private theorem disjointPowerEnergy_lt_top_of_memCubeEuclideanFullWsp + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) + (hg : MemCubeEuclideanFullWsp Q s p g) : + cubeEuclideanPositiveBesovDisjointPowerEnergy Q s p g < ∞ := by + have hov : cubeEuclideanPositiveBesovOverlapESeminorm Q s p g < ∞ := + overlapESeminorm_lt_top_of_memCubeEuclideanFullWsp Q s p g hg + have hpow : cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p g < ∞ := by + rw [← cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy] + exact ENNReal.rpow_lt_top_of_nonneg (by positivity) hov.ne + exact lt_of_le_of_lt + (cubeEuclideanPositiveBesovDisjointPowerEnergy_le_overlap Q s p g) + (lt_top_iff_ne_top.mpr + (ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) hpow.ne)) + +/-- Raising the rooted forcing carrier back to the finite exponent recovers +its literal unrooted physical-scale series. -/ +theorem localCoarseGrainingForcingLp_rpow_eq_powerEnergy {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s1 s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) : + (localCoarseGrainingForcingLp Q n s1 s p g) ^ p.exponent.toReal = + localCoarseGrainingForcingPowerEnergy Q n s1 s p g := by + unfold localCoarseGrainingForcingLp + exact ENNReal.rpow_inv_rpow (finiteLpExponent_toReal_pos p).ne' _ + +private theorem localCoarseGrainingForcingLp_le_of_power_le {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s1 s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) (B : ℝ≥0∞) + (hB : localCoarseGrainingForcingPowerEnergy Q n s1 s p g ≤ + B ^ p.exponent.toReal) : + localCoarseGrainingForcingLp Q n s1 s p g ≤ B := by + have hroot := ENNReal.rpow_le_rpow hB + (inv_nonneg.mpr (finiteLpExponent_toReal_pos p).le) + rw [← localCoarseGrainingForcingLp_rpow_eq_powerEnergy] at hroot + rw [← ENNReal.rpow_mul, + mul_inv_cancel₀ (finiteLpExponent_toReal_pos p).ne', ENNReal.rpow_one] at hroot + calc + localCoarseGrainingForcingLp Q n s1 s p g ≤ + (B ^ p.exponent.toReal) ^ (p.exponent.toReal)⁻¹ := hroot + _ = B := by + rw [← ENNReal.rpow_mul, + mul_inv_cancel₀ (finiteLpExponent_toReal_pos p).ne', ENNReal.rpow_one] + +/-! The next finite-sum estimate is the Hölder core of the local +`L²`-to-`Lᵖ` conversion. It is deliberately stated before any cube geometry: +the cube-specific proof will instantiate `w` with the fractional-order gap +discount and `a` with local oscillation averages. -/ + +private theorem weighted_square_sum_rpow_le_of_two_lt + {ι : Type*} (I : Finset ι) {p : ℝ} (hp : 2 < p) + (a w : ι → ℝ) : + (∑ i ∈ I, (w i * a i) ^ 2) ^ (p / 2) ≤ + ((∑ i ∈ I, (a i ^ 2) ^ (p / 2)) ^ (1 / (p / 2)) * + (∑ i ∈ I, (w i ^ 2) ^ (p / (p - 2))) ^ + (1 / (p / (p - 2)))) ^ (p / 2) := by + have hp_two_pos : 0 < p / 2 := by linarith + have hp_pos : 0 < p := by linarith + have hp_sub_pos : 0 < p - 2 := by linarith + have hq_pos : 0 < p / (p - 2) := div_pos hp_pos hp_sub_pos + have hholder : Real.HolderConjugate (p / 2) (p / (p - 2)) := by + refine ⟨?_, hp_two_pos, hq_pos⟩ + field_simp [hp_two_pos.ne', hp_sub_pos.ne'] + linarith + have hinner := Real.inner_le_Lp_mul_Lq_of_nonneg + (s := I) (f := fun i => a i ^ 2) (g := fun i => w i ^ 2) + hholder + (fun i hi => sq_nonneg (a i)) + (fun i hi => sq_nonneg (w i)) + have hleft_nonneg : 0 ≤ ∑ i ∈ I, (w i * a i) ^ 2 := + Finset.sum_nonneg fun i _ => sq_nonneg _ + have hleft : + (∑ i ∈ I, (w i * a i) ^ 2) = + ∑ i ∈ I, (a i ^ 2) * (w i ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro i _ + ring + rw [← hleft] at hinner + exact Real.rpow_le_rpow hleft_nonneg hinner hp_two_pos.le + +private theorem weighted_square_sum_le_of_eq_two + {ι : Type*} (I : Finset ι) (a w : ι → ℝ) + (hw_nonneg : ∀ i ∈ I, 0 ≤ w i) (hw_one : ∀ i ∈ I, w i ≤ 1) : + (∑ i ∈ I, (w i * a i) ^ 2) ^ ((2 : ℝ) / 2) ≤ + ∑ i ∈ I, a i ^ 2 := by + rw [show (2 : ℝ) / 2 = 1 by norm_num, Real.rpow_one] + refine Finset.sum_le_sum fun i hi => ?_ + have hsq : (w i) ^ 2 ≤ 1 := by + nlinarith [sq_nonneg (w i), mul_self_le_mul_self (hw_nonneg i hi) (hw_one i hi)] + calc + (w i * a i) ^ 2 = (w i) ^ 2 * (a i) ^ 2 := by ring + _ ≤ 1 * (a i) ^ 2 := + mul_le_mul_of_nonneg_right hsq (sq_nonneg _) + _ = a i ^ 2 := by ring + +/-- Finite partial square sums may be replaced termwise by their weighted +finite-`p` majorants before Hölder is applied. This small wrapper keeps the +later cube proof from mixing its depth algebra with the generic finite-sum +argument. -/ +private theorem finite_square_sum_rpow_le_weighted_of_sq_le + {ι : Type*} (I : Finset ι) {r : ℝ} (hr : 2 < r) + (D a w : ι → ℝ) + (hterm : ∀ i ∈ I, D i ^ 2 ≤ (w i * a i) ^ 2) : + (∑ i ∈ I, D i ^ 2) ^ (r / 2) ≤ + ((∑ i ∈ I, (a i ^ 2) ^ (r / 2)) ^ (1 / (r / 2)) * + (∑ i ∈ I, (w i ^ 2) ^ (r / (r - 2))) ^ + (1 / (r / (r - 2)))) ^ (r / 2) := by + have hsum : ∑ i ∈ I, D i ^ 2 ≤ ∑ i ∈ I, (w i * a i) ^ 2 := by + exact Finset.sum_le_sum fun i hi => hterm i hi + have hsum_nonneg : 0 ≤ ∑ i ∈ I, D i ^ 2 := + Finset.sum_nonneg fun i _ => sq_nonneg _ + calc + (∑ i ∈ I, D i ^ 2) ^ (r / 2) ≤ + (∑ i ∈ I, (w i * a i) ^ 2) ^ (r / 2) := + Real.rpow_le_rpow hsum_nonneg hsum (by linarith) + _ ≤ ((∑ i ∈ I, (a i ^ 2) ^ (r / 2)) ^ (1 / (r / 2)) * + (∑ i ∈ I, (w i ^ 2) ^ (r / (r - 2))) ^ + (1 / (r / (r - 2)))) ^ (r / 2) := + weighted_square_sum_rpow_le_of_two_lt I hr a w + +/-- The finite Hölder weight is controlled by the elementary triadic +geometric tail. This deliberately keeps the finite partial proof separate +from the eventual `tsum` passage. -/ +private theorem finite_triadic_geometric_tail_le_inv_discount + {delta : ℝ} (hdelta : 0 < delta) (N : ℕ) : + ∑ j ∈ Finset.range (N + 1), Real.rpow 3 (-delta * (j : ℝ)) ≤ + (Book.Ch02.geometricDiscount delta 1)⁻¹ := by + let x : ℝ := Real.rpow 3 (-delta) + have hx_nonneg : 0 ≤ x := Real.rpow_nonneg (by norm_num) _ + have hx_lt_one : x < 1 := by + dsimp [x] + apply Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) + linarith + have hterm : ∀ j : ℕ, Real.rpow 3 (-delta * (j : ℝ)) = x ^ j := by + intro j + dsimp [x] + calc + Real.rpow 3 (-delta * (j : ℝ)) = + Real.rpow 3 ((-delta) * (j : ℝ)) := rfl + _ = Real.rpow (Real.rpow 3 (-delta)) (j : ℝ) := by + exact Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _ + _ = (Real.rpow 3 (-delta)) ^ j := Real.rpow_natCast _ j + rw [show (∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (-delta * (j : ℝ))) = + ∑ j ∈ Finset.range (N + 1), x ^ j by + apply Finset.sum_congr rfl + intro j _ + exact hterm j] + calc + ∑ j ∈ Finset.range (N + 1), x ^ j ≤ ∑' j : ℕ, x ^ j := + (summable_geometric_of_lt_one hx_nonneg hx_lt_one).sum_le_tsum + (Finset.range (N + 1)) (fun _ _ => pow_nonneg hx_nonneg _) + _ = (1 - x)⁻¹ := tsum_geometric_of_lt_one hx_nonneg hx_lt_one + _ = (Book.Ch02.geometricDiscount delta 1)⁻¹ := by + congr 1 + dsimp [Book.Ch02.geometricDiscount, x] + rw [show -delta * 1 = -delta by ring] + +/-- The Hölder-conjugate finite weight is no larger than the same elementary +tail at exponent `2 delta`. This is the uniform tail estimate behind the +strict `p > 2` branch. -/ +private theorem finite_holder_weight_le_inv_discount + {delta r : ℝ} (hdelta : 0 < delta) (hr : 2 < r) (N : ℕ) : + ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) ≤ + (Book.Ch02.geometricDiscount delta 1)⁻¹ := by + have hr_sub : 0 < r - 2 := by linarith + have hq : 1 ≤ r / (r - 2) := by + apply (le_div_iff₀ hr_sub).2 + linarith + have hterm : ∀ j : ℕ, + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) ≤ + Real.rpow 3 (-delta * (j : ℝ)) := by + intro j + have hbase : 1 ≤ (3 : ℝ) := by norm_num + have hpow_nonneg : 0 ≤ Real.rpow 3 (-delta * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hsquare : (Real.rpow 3 (-delta * (j : ℝ))) ^ 2 = + Real.rpow 3 (-2 * delta * (j : ℝ)) := by + calc + (Real.rpow 3 (-delta * (j : ℝ))) ^ 2 = + Real.rpow (Real.rpow 3 (-delta * (j : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow 3 ((-delta * (j : ℝ)) * 2) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ = Real.rpow 3 (-2 * delta * (j : ℝ)) := by + congr 1 + ring + rw [hsquare] + calc + Real.rpow (Real.rpow 3 (-2 * delta * (j : ℝ))) (r / (r - 2)) = + Real.rpow 3 ((-2 * delta * (j : ℝ)) * (r / (r - 2))) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ ≤ Real.rpow 3 (-delta * (j : ℝ)) := by + apply Real.rpow_le_rpow_of_exponent_le hbase + have hj : 0 ≤ (j : ℝ) := by positivity + have hc : 0 ≤ delta * (j : ℝ) := by positivity + have hq_nonneg : 0 ≤ r / (r - 2) := le_trans zero_le_one hq + have htwoq : 1 ≤ 2 * (r / (r - 2)) := by nlinarith + have hmul := mul_le_mul_of_nonneg_left htwoq hc + have hneg := neg_le_neg hmul + calc (-2 * delta * (j : ℝ)) * (r / (r - 2)) + = -(delta * (j : ℝ) * (2 * (r / (r - 2)))) := by ring + _ ≤ -(delta * (j : ℝ) * 1) := hneg + _ = -delta * (j : ℝ) := by ring + calc + ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) ≤ + ∑ j ∈ Finset.range (N + 1), Real.rpow 3 (-delta * (j : ℝ)) := + Finset.sum_le_sum fun j _ => hterm j + _ ≤ (Book.Ch02.geometricDiscount delta 1)⁻¹ := + finite_triadic_geometric_tail_le_inv_discount hdelta N + +/-- After taking the outer finite-`p` root, the Hölder tail costs at most one +inverse fractional gap. The constant is independent of the finite +exponent. -/ +private theorem finite_holder_weight_rpow_le_five_mul_inv + {delta r : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (hr : 2 < r) (N : ℕ) : + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2))) + ((r - 2) / (2 * r)) ≤ 5 * delta⁻¹ := by + let D : ℝ := (Book.Ch02.geometricDiscount delta 1)⁻¹ + let T : ℝ := ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) + have hT : T ≤ D := finite_holder_weight_le_inv_discount hdelta hr N + have hr_pos : 0 < r := by linarith + have hgamma_nonneg : 0 ≤ (r - 2) / (2 * r) := + div_nonneg (by linarith) (by positivity) + have hgamma_le_one : (r - 2) / (2 * r) ≤ 1 := by + apply (div_le_iff₀ (by positivity : 0 < 2 * r)).2 + linarith + have hD_one : 1 ≤ D := by + have hzero := finite_triadic_geometric_tail_le_inv_discount hdelta 0 + dsimp [D] + simpa using hzero + have hroot : Real.rpow T ((r - 2) / (2 * r)) ≤ + Real.rpow D ((r - 2) / (2 * r)) := + Real.rpow_le_rpow + (Finset.sum_nonneg fun _ _ => Real.rpow_nonneg (sq_nonneg _) _) hT hgamma_nonneg + calc + Real.rpow T ((r - 2) / (2 * r)) ≤ + Real.rpow D ((r - 2) / (2 * r)) := hroot + _ ≤ D := by + calc + Real.rpow D ((r - 2) / (2 * r)) ≤ Real.rpow D 1 := + Real.rpow_le_rpow_of_exponent_le hD_one hgamma_le_one + _ = D := Real.rpow_one D + _ ≤ 5 * delta⁻¹ := by + dsimp [D] + exact Book.Ch02.inv_geometricDiscount_le_five_inv hdelta hdelta_le (by norm_num) + +/-- The termwise root used to pass from a depthwise finite-`p` estimate to +the square-sum majorant required by finite Hölder. -/ +private theorem sq_le_weighted_rpow_of_rpow_le + {x w E r : ℝ} (hx : 0 ≤ x) (hw : 0 ≤ w) (hE : 0 ≤ E) + (hr : 0 < r) (hpow : Real.rpow x r ≤ Real.rpow w r * E) : + x ^ 2 ≤ (w * Real.rpow E (1 / r)) ^ 2 := by + have hroot := Real.rpow_le_rpow (Real.rpow_nonneg hx r) hpow + (by positivity : 0 ≤ 2 / r) + have hleft : (x ^ r) ^ (2 / r) = x ^ 2 := by + calc + Real.rpow (Real.rpow x r) (2 / r) = Real.rpow x (r * (2 / r)) := + (Real.rpow_mul hx _ _).symm + _ = Real.rpow x 2 := by + congr 1 + field_simp [hr.ne'] + _ = x ^ 2 := Real.rpow_natCast x 2 + have hwroot : Real.rpow (Real.rpow w r) (2 / r) = w ^ 2 := by + calc + Real.rpow (Real.rpow w r) (2 / r) = Real.rpow w (r * (2 / r)) := + (Real.rpow_mul hw _ _).symm + _ = Real.rpow w 2 := by + congr 1 + field_simp [hr.ne'] + _ = w ^ 2 := Real.rpow_natCast w 2 + have hEroot : Real.rpow E (2 / r) = (Real.rpow E (1 / r)) ^ 2 := by + calc + Real.rpow E (2 / r) = Real.rpow E ((1 / r) * 2) := by + congr 1 + ring + _ = Real.rpow (Real.rpow E (1 / r)) 2 := Real.rpow_mul hE _ _ + _ = (Real.rpow E (1 / r)) ^ 2 := Real.rpow_natCast _ 2 + rw [hleft] at hroot + calc + x ^ 2 ≤ Real.rpow (Real.rpow w r * E) (2 / r) := hroot + _ = Real.rpow (Real.rpow w r) (2 / r) * Real.rpow E (2 / r) := by + exact Real.mul_rpow (Real.rpow_nonneg hw _) hE + _ = (w * Real.rpow E (1 / r)) ^ 2 := by + rw [hwroot, hEroot] + ring + +private theorem cubeLpNorm_two_le_eLpNorm_finite_of_memLp + {d : ℕ} (Q : TriadicCube d) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (f : Vec d → Vec d) + (hf : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (f x)) p.exponent + (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) f ≤ + (MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (f x)) p.exponent + (normalizedCubeMeasure Q)).toReal := by + let μ := normalizedCubeMeasure Q + let : MeasureTheory.IsProbabilityMeasure μ := ⟨by simp [μ]⟩ + have hle : MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (f x)) 2 μ ≤ + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (f x)) p.exponent μ := + MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le hp hf.aestronglyMeasurable + have hcompare : MeasureTheory.eLpNorm f 2 μ ≤ + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (f x)) 2 μ := by + refine MeasureTheory.eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_) + exact HilbertVec.norm_le_norm_ofVec (f x) + have hall := hcompare.trans hle + have htoReal := ENNReal.toReal_mono hf.2.ne hall + simpa only [μ, cubeLpNorm] using htoReal + +/-- The finite Euclidean carrier supplies the legacy normalized cube `L²` +membership used by the existing one-cube weak-flux theorem. This is a +carrier conversion only: it does not make any pointwise choice of a +representative. -/ +theorem MemCubeEuclideanFullWsp.memLpTwo {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + {g : Vec d → Vec d} (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (hg : MemCubeEuclideanFullWsp Q s p g) : + MeasureTheory.MemLp g 2 (normalizedCubeMeasure Q) := by + have htwo : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) 2 + (normalizedCubeMeasure Q) := + hg.1.mono_exponent hp + apply htwo.mono + · have hmeas := + (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable + htwo.aestronglyMeasurable + simpa only [Function.comp_apply, HilbertVec.continuousLinearEquivVec_apply, + HilbertVec.toVec_ofVec] using hmeas + · exact Filter.Eventually.of_forall fun x => HilbertVec.norm_le_norm_ofVec (g x) + +/-- The finite Euclidean carrier remains locally integrable after subtracting +the ordinary cube average. This is kept private because the public forcing +statement is formulated directly in terms of `g`. -/ +private theorem memLp_hilbert_cubeFluctuationVec + {d : ℕ} (R : TriadicCube d) (p : FiniteLpExponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure R)) : + MeasureTheory.MemLp + (fun x => HilbertVec.ofVec (cubeFluctuationVec R g x)) p.exponent + (normalizedCubeMeasure R) := by + have hconst : MeasureTheory.MemLp + (fun _ : Vec d => HilbertVec.ofVec (cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R) := + MeasureTheory.memLp_const _ + simpa only [cubeFluctuationVec_apply, map_sub] using! hg.sub hconst + +/-- A parent finite Euclidean `L^p` witness supplies the same witness on any +ordinary triadic descendant. -/ +private theorem memLp_hilbert_cubeFluctuationVec_of_parent + {d : ℕ} {Q R : TriadicCube d} (p : FiniteLpExponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + MeasureTheory.MemLp + (fun x => HilbertVec.ofVec (cubeFluctuationVec R g x)) p.exponent + (normalizedCubeMeasure R) := by + let F : CubeEuclideanLpField Q p := ⟨g, hg⟩ + exact memLp_hilbert_cubeFluctuationVec R p g + (by simpa only [F, CubeEuclideanLpField.restrictToSubcube_toField] using + (F.restrictToSubcube hRQ).euclideanMemLp) + +/-- Jensen's inequality for a finite ordinary-descendant average. The +nonnegativity hypothesis is deliberately local to the finite sum, which is +the form needed before the forcing proof passes to `tsum`. -/ +private theorem rpow_descendantsAverage_le_descendantsAverage_rpow + {d : ℕ} (Q : TriadicCube d) (j : ℕ) {ζ : ℝ} + (hζ : 1 ≤ ζ) {F : TriadicCube d → ℝ} + (hF_nonneg : ∀ R, R ∈ descendantsAtDepth Q j → 0 ≤ F R) : + Real.rpow (descendantsAverage Q j F) ζ ≤ + descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let w : TriadicCube d → ℝ := fun _ => (D.card : ℝ)⁻¹ + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne : (D.card : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hw_nonneg : ∀ R ∈ D, 0 ≤ w R := by + intro R _ + exact inv_nonneg.mpr hcard_pos.le + have hw_sum : ∑ R ∈ D, w R = 1 := by + simp [w, Finset.sum_const, nsmul_eq_mul, hcard_ne] + have hmem : ∀ R ∈ D, F R ∈ Set.Ici (0 : ℝ) := by + intro R hR + exact hF_nonneg R (by simpa [D] using hR) + have hJensen := + (convexOn_rpow hζ).map_sum_le + (t := D) (w := w) (p := F) hw_nonneg hw_sum hmem + have hleft : + (fun x : ℝ => x ^ ζ) (∑ R ∈ D, w R • F R) = + Real.rpow (descendantsAverage Q j F) ζ := by + congr 1 + simp only [descendantsAverage, D, w, smul_eq_mul] + rw [Finset.mul_sum] + have hright : + (∑ R ∈ D, w R • (fun x : ℝ => x ^ ζ) (F R)) = + descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := by + simp only [descendantsAverage, D, w, smul_eq_mul, Real.rpow_eq_pow] + rw [Finset.mul_sum] + calc + Real.rpow (descendantsAverage Q j F) ζ = + (fun x : ℝ => x ^ ζ) (∑ R ∈ D, w R • F R) := hleft.symm + _ ≤ ∑ R ∈ D, w R • (fun x : ℝ => x ^ ζ) (F R) := hJensen + _ = descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := hright + +/-- Pointwise input for the depth-power bridge: on every descendant the +legacy normalized `L²` oscillation is bounded by the finite Euclidean +normalized `Lᵖ` oscillation. -/ +private theorem cubeLpNorm_two_le_eLpNorm_finite_of_parent_descendant + {d : ℕ} {Q R : TriadicCube d} (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g) ≤ + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal := by + simpa only [cubeFluctuationVec_apply] using + cubeLpNorm_two_le_eLpNorm_finite_of_memLp R p hp (cubeFluctuationVec R g) + (memLp_hilbert_cubeFluctuationVec_of_parent p g hg hRQ) + +/-- The real normalized residual average at one ordinary descendant depth is +literally the `toReal` of the internal disjoint finite-`p` depth energy. +This is the conversion point at which the finite partial calculation enters +the `ENNReal` disjoint-energy lane. -/ +private theorem disjointDepthPower_toReal_eq_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p : FiniteLpExponent) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + (cubeEuclideanPositiveBesovDisjointDepthPower Q p g j).toReal = + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hcard : (D.card : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr (by + simpa [D] using descendantsAtDepth_nonempty Q j) + have htop : ∀ R ∈ D, + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)) ^ p.exponent.toReal ≠ ∞ := by + intro R hR + have hres := memLp_hilbert_cubeFluctuationVec_of_parent p g hg + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + exact ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg + hres.eLpNorm_lt_top.ne + unfold cubeEuclideanPositiveBesovDisjointDepthPower + change (((D.card : ℝ≥0∞)⁻¹ * D.attach.sum (fun R => + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R.1 g)) p.exponent + (normalizedCubeMeasure R.1)) ^ p.exponent.toReal)).toReal) = _ + rw [ENNReal.toReal_mul, + ENNReal.toReal_sum (fun R _ => htop R.1 R.2)] + simp only [ENNReal.toReal_inv, ENNReal.toReal_natCast, + ← ENNReal.toReal_rpow] + rw [Finset.sum_attach D (fun R => + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal ^ p.exponent.toReal)] + simp only [descendantsAverage, D, Real.rpow_eq_pow] + +/-- A finite initial portion of the physical-scale disjoint energy controls +the corresponding note-normalized finite residual sum. This is the exact +physical-scale reindexing needed before descendant-average composition is +used in the forcing aggregation. -/ +private theorem finite_noteResidualSum_le_scale_mul_disjointPowerEnergy + {d : ℕ} (Q : TriadicCube d) (s2 : FractionalOrder) (N : ℕ) + (p : FiniteLpExponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * p.exponent.toReal * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) ≤ + Real.rpow 3 (s2.1 * p.exponent.toReal * (Q.scale : ℝ)) * + (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal := by + let r : ℝ := p.exponent.toReal + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let w : ℕ → ℝ≥0∞ := fun j => ENNReal.ofReal + (Real.rpow 3 (-(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) ) + let A : ℕ → ℝ≥0∞ := fun j => cubeEuclideanPositiveBesovDisjointDepthPower Q p g j + have hsum : ∑ j ∈ Finset.range (N + 1), w j * A j ≤ E := by + dsimp [E, w, A, cubeEuclideanPositiveBesovDisjointPowerEnergy] + exact ENNReal.sum_le_tsum _ + have hreal : (∑ j ∈ Finset.range (N + 1), w j * A j).toReal ≤ E.toReal := + ENNReal.toReal_mono hfin.ne hsum + have hsum_fin : ∑ j ∈ Finset.range (N + 1), w j * A j < ∞ := + lt_of_le_of_lt hsum hfin + have hterm_top : ∀ j ∈ Finset.range (N + 1), w j * A j ≠ ∞ := by + intro j hj + apply lt_top_iff_ne_top.mp + apply lt_of_le_of_lt (Finset.single_le_sum (fun _ _ => bot_le) hj) + exact hsum_fin + rw [ENNReal.toReal_sum hterm_top] at hreal + have hweight_nonneg : 0 ≤ Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hconvert : + (∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) = + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * + (∑ j ∈ Finset.range (N + 1), (w j * A j).toReal) := by + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro j _ + rw [ENNReal.toReal_mul, disjointDepthPower_toReal_eq_descendantsAverage Q j p g hg] + dsimp [w] + rw [ENNReal.toReal_ofReal (Real.rpow_nonneg (by norm_num) _)] + have h3 : 0 < (3 : ℝ) := by norm_num + have hscale : + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * + Real.rpow 3 (-(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) = + Real.rpow 3 (s2.1 * r * (j : ℝ)) := by + calc + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * + Real.rpow 3 (-(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) = + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ) + + -(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) := + (Real.rpow_add h3 _ _).symm + _ = Real.rpow 3 (s2.1 * r * (j : ℝ)) := by + congr 1 + push_cast + ring + let B : ℝ := descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) + let v : ℝ := Real.rpow 3 (-(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) + have hscale' : Real.rpow 3 (s2.1 * r * (j : ℝ)) * B = + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * + (v * B) := by + dsimp [v] + change Real.rpow 3 (s2.1 * r * (j : ℝ)) * B = + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * + (Real.rpow 3 (-(s2.1 * r * ((Q.scale - (j : ℤ) : ℤ) : ℝ))) * B) + rw [← hscale] + ring + simpa [B, v, r, Real.rpow_eq_pow] using hscale' + rw [hconvert] + apply mul_le_mul_of_nonneg_left ?_ hweight_nonneg + simpa only [E] using hreal + +/-- The finite-`p` oscillation energy controls the legacy depthwise `L²` +energy before any infinite-depth supremum is taken. Keeping this statement +at a fixed depth is what permits the forcing argument to pass to the old +`sSup` only after a uniform finite partial bound has been established. -/ +private theorem cubeBesovPositiveVectorDepthAverage_rpow_le_descendantsAverage_eLpNorm + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hpoint : ∀ R, R ∈ descendantsAtDepth Q j → + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g) ≤ + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) : + Real.rpow (cubeBesovPositiveVectorDepthAverage Q g j) + (p.exponent.toReal / 2) ≤ + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) := by + let r : ℝ := p.exponent.toReal + have hr_two : 2 ≤ r := by + dsimp [r] + exact ENNReal.toReal_mono p.lt_top.ne hp + have hr_half_one : 1 ≤ r / 2 := by linarith + have hnonneg : ∀ R, R ∈ descendantsAtDepth Q j → + 0 ≤ (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2 := by + intro R _ + exact sq_nonneg _ + have hJensen := rpow_descendantsAverage_le_descendantsAverage_rpow Q j + hr_half_one (F := fun R => + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2) hnonneg + unfold cubeBesovPositiveVectorDepthAverage + calc + Real.rpow + (descendantsAverage Q j (fun R => + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2)) + (r / 2) ≤ + descendantsAverage Q j (fun R => + Real.rpow + ((cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2) + (r / 2)) := by + simpa [r] using hJensen + _ ≤ descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hRnonneg : 0 ≤ cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R g) := cubeLpNorm_nonneg R _ _ + have hbound := hpoint R hR + have he_nonneg : 0 ≤ + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal := ENNReal.toReal_nonneg + have hsquare : (cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R g)) ^ 2 ≤ + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) ^ 2 := by + nlinarith + have hpow := Real.rpow_le_rpow (sq_nonneg _ ) hsquare + (by positivity : 0 ≤ r / 2) + rw [← Real.rpow_natCast (x := + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) 2] at hpow + rw [← Real.rpow_mul he_nonneg] at hpow + have hpow' : + Real.rpow + ((cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2) + (r / 2) ≤ + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) r := by + calc + Real.rpow + ((cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2) + (r / 2) ≤ + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) (2 * (r / 2)) := by + simpa [Real.rpow_eq_pow] using hpow + _ = Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) r := by + congr 1 + ring + simpa [sub_eq_add_neg, add_comm] using hpow' + +/-- The preceding depthwise comparison with the finite Euclidean witness on +the parent cube. This is the concrete input used for each summand of the +finite partial `q = 2` seminorm. -/ +private theorem cubeBesovPositiveVectorDepthAverage_rpow_le_descendantsAverage_eLpNorm_of_memLp + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + Real.rpow (cubeBesovPositiveVectorDepthAverage Q g j) + (p.exponent.toReal / 2) ≤ + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) := by + apply cubeBesovPositiveVectorDepthAverage_rpow_le_descendantsAverage_eLpNorm + Q j p hp g + intro R hR + exact cubeLpNorm_two_le_eLpNorm_finite_of_parent_descendant p hp g hg + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + +/-- After applying the finite exponent, a single legacy positive-Besov +depth is bounded by the corresponding normalized finite-`p` disjoint +oscillation average. -/ +private theorem cubeBesovPositiveVectorDepthSeminorm_rpow_le_eLpNorm + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (j : ℕ) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + Real.rpow (cubeBesovPositiveVectorDepthSeminorm Q s.1 g j) + p.exponent.toReal ≤ + Real.rpow 3 (s.1 * p.exponent.toReal * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) := by + let r : ℝ := p.exponent.toReal + let A : ℝ := cubeBesovPositiveVectorDepthAverage Q g j + have hA : 0 ≤ A := cubeBesovPositiveVectorDepthAverage_nonneg Q g j + have hthree : 0 ≤ (3 : ℝ) := by norm_num + have hscale_nonneg : 0 ≤ Real.rpow 3 (s.1 * (j : ℝ)) := + Real.rpow_nonneg hthree _ + have hdepth := + cubeBesovPositiveVectorDepthAverage_rpow_le_descendantsAverage_eLpNorm_of_memLp + Q j p hp g hg + change Real.rpow (Real.rpow 3 (s.1 * (j : ℝ)) * Real.sqrt A) r ≤ _ + have hscale : + Real.rpow (Real.rpow 3 (s.1 * (j : ℝ))) r = + Real.rpow 3 (s.1 * r * (j : ℝ)) := by + calc + Real.rpow (Real.rpow 3 (s.1 * (j : ℝ))) r = + Real.rpow 3 ((s.1 * (j : ℝ)) * r) := + (Real.rpow_mul hthree _ _).symm + _ = Real.rpow 3 (s.1 * r * (j : ℝ)) := by + congr 1 + ring + calc + Real.rpow (Real.rpow 3 (s.1 * (j : ℝ)) * Real.sqrt A) r = + Real.rpow (Real.rpow 3 (s.1 * (j : ℝ))) r * + Real.rpow (Real.sqrt A) r := by + exact Real.mul_rpow hscale_nonneg (Real.sqrt_nonneg _) + _ = Real.rpow 3 (s.1 * r * (j : ℝ)) * Real.rpow A (r / 2) := by + rw [hscale, Real.sqrt_eq_rpow] + congr 1 + calc + Real.rpow (Real.rpow A (1 / 2)) r = + Real.rpow A ((1 / 2) * r) := + (Real.rpow_mul hA _ _).symm + _ = Real.rpow A (r / 2) := by + congr 1 + ring + _ ≤ Real.rpow 3 (s.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) := + mul_le_mul_of_nonneg_left (by simpa [A, r] using hdepth) + (Real.rpow_nonneg hthree _) + +/-- A fixed legacy depth is dominated by the fractional-gap weighted finite +`p` depth energy. This is the precise termwise hypothesis consumed by the +finite partial Hölder estimate. -/ +private theorem cubeBesovPositiveVectorDepthSeminorm_sq_le_weighted_eLpNorm + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) (j : ℕ) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + (cubeBesovPositiveVectorDepthSeminorm Q s.1 g j) ^ 2 ≤ + (Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ)) * + Real.rpow + (Real.rpow 3 (s2.1 * p.exponent.toReal * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal)) + (1 / p.exponent.toReal)) ^ 2 := by + let r : ℝ := p.exponent.toReal + let A : ℝ := descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal) + let w : ℝ := Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ)) + let E : ℝ := Real.rpow 3 (s2.1 * r * (j : ℝ)) * A + have hr : 0 < r := finiteLpExponent_toReal_pos p + have hthree : 0 < (3 : ℝ) := by norm_num + have hw : 0 ≤ w := Real.rpow_nonneg hthree.le _ + have hA : 0 ≤ A := by + dsimp [A] + exact descendantsAverage_nonneg Q j _ fun R _ => Real.rpow_nonneg + ENNReal.toReal_nonneg _ + have hE : 0 ≤ E := mul_nonneg (Real.rpow_nonneg hthree.le _) hA + have hdepth := cubeBesovPositiveVectorDepthSeminorm_rpow_le_eLpNorm + Q s j p hp g hg + have hfactor : + Real.rpow 3 (s.1 * r * (j : ℝ)) * A = Real.rpow w r * E := by + dsimp [w, E] + have hsum : + Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ) * r) * + Real.rpow 3 (s2.1 * r * (j : ℝ)) = + Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ) * r + + s2.1 * r * (j : ℝ)) := + (Real.rpow_add hthree _ _).symm + have hpoww : + Real.rpow (Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) r = + Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ) * r) := + (Real.rpow_mul hthree.le _ _).symm + calc + Real.rpow 3 (s.1 * r * (j : ℝ)) * A = + (Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ) * r) * + Real.rpow 3 (s2.1 * r * (j : ℝ))) * A := by + rw [hsum] + congr 1 + ring_nf + _ = Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ) * r) * + (Real.rpow 3 (s2.1 * r * (j : ℝ)) * A) := by ring + _ = Real.rpow (Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) r * + (Real.rpow 3 (s2.1 * r * (j : ℝ)) * A) := by + rw [hpoww] + apply sq_le_weighted_rpow_of_rpow_le + (cubeBesovPositiveVectorDepthSeminorm_nonneg Q s.1 g j) hw hE hr + rw [← hfactor] + simpa [r] using! hdepth + +/-- Finite legacy partial seminorms reduce to a weighted finite-`p` energy +sum. The only remaining task in the global forcing proof is to bound the +explicit geometric weight sum and flatten the two descendant depths. -/ +private theorem cubeBesovPositiveVectorPartialSeminormTwo_rpow_le_weighted_eLpNorm + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) (N : ℕ) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) < p.exponent) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) + p.exponent.toReal ≤ + ((∑ j ∈ Finset.range (N + 1), + (Real.rpow + (Real.rpow 3 (s2.1 * p.exponent.toReal * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal)) + (1 / p.exponent.toReal) ^ 2) ^ + (p.exponent.toReal / 2)) ^ (1 / (p.exponent.toReal / 2)) * + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ + (p.exponent.toReal / (p.exponent.toReal - 2))) ^ + (1 / (p.exponent.toReal / (p.exponent.toReal - 2)))) ^ + (p.exponent.toReal / 2) := by + let r : ℝ := p.exponent.toReal + let D : ℕ → ℝ := fun j => cubeBesovPositiveVectorDepthSeminorm Q s.1 g j + let w : ℕ → ℝ := fun j => Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ)) + let a : ℕ → ℝ := fun j => + Real.rpow + (Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) + (1 / r) + have hr : 2 < r := by + dsimp [r] + exact (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).2 hp + have hterm : ∀ j ∈ Finset.range (N + 1), D j ^ 2 ≤ (w j * a j) ^ 2 := by + intro j _ + exact cubeBesovPositiveVectorDepthSeminorm_sq_le_weighted_eLpNorm + Q s s2 j p hp.le g hg + have hpartial_nonneg : 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 N g + have hpower : + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r = + Real.rpow + ((cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2) (r / 2) := by + calc + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r = + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) + (2 * (r / 2)) := by + congr 1 + ring + _ = Real.rpow + (Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) 2) + (r / 2) := Real.rpow_mul hpartial_nonneg _ _ + _ = Real.rpow + ((cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2) (r / 2) := by + congr 1 + exact Real.rpow_natCast _ 2 + rw [hpower, sq_cubeBesovPositiveVectorPartialSeminormTwo] + change Real.rpow (∑ j ∈ Finset.range (N + 1), D j ^ 2) (r / 2) ≤ _ + simpa [D, w, a, r] using + finite_square_sum_rpow_le_weighted_of_sq_le + (Finset.range (N + 1)) hr D a w hterm + +/-- The endpoint `p = 2` finite partial estimate. No Hölder tail is needed: +the larger fractional order controls each square-sum depth directly. -/ +private theorem cubeBesovPositiveVectorPartialSeminormTwo_sq_le_eLpNorm_of_toReal_eq_two + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) (hs : s.1 ≤ s2.1) + (N : ℕ) (p : FiniteLpExponent) (hp2 : p.exponent.toReal = 2) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * 2 * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + 2) := by + rw [sq_cubeBesovPositiveVectorPartialSeminormTwo] + refine Finset.sum_le_sum ?_ + intro j _ + have hdepth := cubeBesovPositiveVectorDepthSeminorm_rpow_le_eLpNorm + Q s j p (by + apply (ENNReal.toReal_le_toReal ENNReal.ofNat_ne_top p.lt_top.ne).mp + simp [hp2]) g hg + have hA : 0 ≤ descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + 2) := + descendantsAverage_nonneg Q j _ fun R _ => Real.rpow_nonneg ENNReal.toReal_nonneg _ + have hweight : Real.rpow 3 (s.1 * 2 * (j : ℝ)) ≤ + Real.rpow 3 (s2.1 * 2 * (j : ℝ)) := by + apply Real.rpow_le_rpow_of_exponent_le (by norm_num) + gcongr + have hdepth' : (cubeBesovPositiveVectorDepthSeminorm Q s.1 g j) ^ 2 ≤ + Real.rpow 3 (s.1 * 2 * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + 2) := by + simpa [hp2, Real.rpow_natCast] using hdepth + exact hdepth'.trans (mul_le_mul_of_nonneg_right hweight hA) + +/-- The algebraic form of the strict finite-`p` partial estimate after the +Hölder first factor has been collapsed. Keeping this as a real statement +avoids any finiteness or `sSup` hypothesis at the source-facing interface. -/ +private theorem partial_rpow_le_weighted_energy_mul_holder_tail + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) (N : ℕ) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) < p.exponent) + (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) + p.exponent.toReal ≤ + (∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * p.exponent.toReal * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + p.exponent.toReal)) * + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ + (p.exponent.toReal / (p.exponent.toReal - 2))) + ((p.exponent.toReal - 2) / 2) := by + let r : ℝ := p.exponent.toReal + let A : ℝ := ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) + let T : ℝ := ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ (r / (r - 2)) + have hr : 2 < r := by + dsimp [r] + exact (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).2 hp + have hA : 0 ≤ A := by + apply Finset.sum_nonneg + intro j _ + exact mul_nonneg (Real.rpow_nonneg (by norm_num) _) + (descendantsAverage_nonneg Q j _ fun R _ => + Real.rpow_nonneg ENNReal.toReal_nonneg _) + have hT : 0 ≤ T := by + apply Finset.sum_nonneg + intro j _ + exact Real.rpow_nonneg (sq_nonneg _) _ + have hmain := cubeBesovPositiveVectorPartialSeminormTwo_rpow_le_weighted_eLpNorm + Q s s2 N p hp g hg + have hfirst : + (∑ j ∈ Finset.range (N + 1), + (Real.rpow + (Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) + (1 / r) ^ 2) ^ (r / 2)) = A := by + apply Finset.sum_congr rfl + intro j _ + let x : ℝ := Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) + have hx : 0 ≤ x := by + dsimp [x] + exact mul_nonneg (Real.rpow_nonneg (by norm_num) _) + (descendantsAverage_nonneg Q j _ fun R _ => + Real.rpow_nonneg ENNReal.toReal_nonneg _) + change ((Real.rpow x (1 / r)) ^ (2 : ℕ)) ^ (r / 2) = x + calc + ((Real.rpow x (1 / r)) ^ (2 : ℕ)) ^ (r / 2) = + Real.rpow (Real.rpow x (1 / r)) (2 * (r / 2)) := by + rw [← Real.rpow_natCast] + exact (Real.rpow_mul (Real.rpow_nonneg hx _) _ _).symm + _ = Real.rpow x ((1 / r) * (2 * (r / 2))) := by + exact (Real.rpow_mul hx _ _).symm + _ = x := by + rw [show (1 / r) * (2 * (r / 2)) = 1 by field_simp [hr.ne']] + exact Real.rpow_one x + rw [show + ((∑ j ∈ Finset.range (N + 1), + (Real.rpow + (Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) + (1 / r) ^ 2) ^ (r / 2)) ^ (1 / (r / 2)) * + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ + (r / (r - 2))) ^ (1 / (r / (r - 2)))) ^ (r / 2) = + A * Real.rpow T ((r - 2) / 2) by + rw [hfirst] + calc + (A ^ (1 / (r / 2)) * T ^ (1 / (r / (r - 2)))) ^ (r / 2) = + (A ^ (1 / (r / 2))) ^ (r / 2) * + (T ^ (1 / (r / (r - 2)))) ^ (r / 2) := by + exact Real.mul_rpow + (Real.rpow_nonneg hA _) (Real.rpow_nonneg hT _) + _ = A ^ ((1 / (r / 2)) * (r / 2)) * + T ^ ((1 / (r / (r - 2)) * (r / 2))) := by + rw [← Real.rpow_mul hA, ← Real.rpow_mul hT] + _ = A * Real.rpow T ((r - 2) / 2) := by + have htail : (1 / (r / (r - 2))) * (r / 2) = (r - 2) / 2 := by + field_simp [hr.ne'] + have hfirstexp : (1 / (r / 2)) * (r / 2) = 1 := by + field_simp [hr.ne'] + rw [hfirstexp, Real.rpow_one, htail] + rfl + ] + at hmain + simpa [A, T, r] using hmain + +/-- Strict finite-`p` partial bridge in real form. -/ +private theorem partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_root_of_two_lt + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (N : ℕ) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ + (5 * (s2.1 - s.1)⁻¹) * Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal + (p.exponent.toReal)⁻¹ := by + let r : ℝ := p.exponent.toReal + let delta : ℝ := s2.1 - s.1 + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let S : ℝ := Real.rpow 3 (s2.1 * (Q.scale : ℝ)) + let C : ℝ := 5 * delta⁻¹ + let U : ℝ := E.toReal + have hr : 2 < r := by + dsimp [r] + exact (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).2 hp + have hrpos : 0 < r := by linarith + have hdelta : 0 < delta := by dsimp [delta]; linarith + have hdelta_le : delta ≤ 1 := by + dsimp [delta] + linarith [s2.2.2, s.2.1] + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hS_nonneg : 0 ≤ S := Real.rpow_nonneg (by norm_num) _ + have hU_nonneg : 0 ≤ U := ENNReal.toReal_nonneg + have hP_nonneg : 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 N g + have hA := finite_noteResidualSum_le_scale_mul_disjointPowerEnergy + Q s2 N p g hg hfin + have hT := finite_holder_weight_rpow_le_five_mul_inv hdelta hdelta_le hr N + have hpartial := partial_rpow_le_weighted_energy_mul_holder_tail + Q s s2 N p hp g hg + have hpower : + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r ≤ + Real.rpow (C * S * Real.rpow U r⁻¹) r := by + have hA' : + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) ≤ S ^ r * U := by + rw [show S ^ r = Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) by + dsimp [S] + calc + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ r = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * r) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ = Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := by + congr 1 + ring] + simpa [U, E, r] using hA + have htailpow : + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2))) + ((r - 2) / 2) ≤ C ^ r := by + let T : ℝ := ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) + have hroot : T ^ ((r - 2) / (2 * r)) ≤ C := by + simpa [T, C] using hT + have hroot_nonneg : 0 ≤ T ^ ((r - 2) / (2 * r)) := + Real.rpow_nonneg (by + apply Finset.sum_nonneg + intro j _ + exact Real.rpow_nonneg (sq_nonneg _) _) _ + have hCpow := Real.rpow_le_rpow hroot_nonneg hroot hrpos.le + have hexp : ((r - 2) / (2 * r)) * r = (r - 2) / 2 := by + field_simp [hr.ne'] + calc + T ^ ((r - 2) / 2) = (T ^ ((r - 2) / (2 * r))) ^ r := by + rw [← Real.rpow_mul] + · congr 1 + exact hexp.symm + · apply Finset.sum_nonneg + intro j _ + exact Real.rpow_nonneg (sq_nonneg _) _ + _ ≤ C ^ r := hCpow + have htail_nonneg : 0 ≤ Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2))) + ((r - 2) / 2) := + Real.rpow_nonneg (by + apply Finset.sum_nonneg + intro j _ + exact Real.rpow_nonneg (sq_nonneg _) _) _ + have hprod := mul_le_mul hA' htailpow htail_nonneg + (mul_nonneg (Real.rpow_nonneg hS_nonneg _) hU_nonneg) + have hcpow : 0 ≤ C ^ r := Real.rpow_nonneg hC_nonneg _ + calc + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r ≤ + (∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) * + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ + (r / (r - 2))) + ((r - 2) / 2) := by + simpa [r, delta] using hpartial + _ ≤ (S ^ r * U) * C ^ r := hprod + _ = Real.rpow (C * S * Real.rpow U r⁻¹) r := by + symm + calc + Real.rpow (C * S * Real.rpow U r⁻¹) r = + Real.rpow (C * S) r * Real.rpow (Real.rpow U r⁻¹) r := + Real.mul_rpow (mul_nonneg hC_nonneg hS_nonneg) + (Real.rpow_nonneg hU_nonneg _) + _ = (C ^ r * S ^ r) * Real.rpow (Real.rpow U r⁻¹) r := by + exact congrArg (fun z : ℝ => z * Real.rpow (Real.rpow U r⁻¹) r) + (Real.mul_rpow hC_nonneg hS_nonneg) + _ = (C ^ r * S ^ r) * U := by + congr 1 + calc + Real.rpow (Real.rpow U r⁻¹) r = Real.rpow U (r⁻¹ * r) := + (Real.rpow_mul hU_nonneg _ _).symm + _ = U := by + have hinv : r⁻¹ * r = 1 := inv_mul_cancel₀ hrpos.ne' + rw [hinv] + exact Real.rpow_one U + _ = S ^ r * U * C ^ r := by ring + exact (Real.rpow_le_rpow_iff hP_nonneg + (mul_nonneg (mul_nonneg hC_nonneg hS_nonneg) + (Real.rpow_nonneg hU_nonneg _)) hrpos).mp hpower + +/-- The endpoint `p = 2` finite-partial bridge, written with a square root +before the public finite-exponent notation is restored. -/ +private theorem partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_sqrt_of_toReal_eq_two + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (N : ℕ) (p : FiniteLpExponent) + (hp2 : p.exponent.toReal = 2) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ + (5 * (s2.1 - s.1)⁻¹) * Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.sqrt (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal := by + let delta : ℝ := s2.1 - s.1 + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let S : ℝ := Real.rpow 3 (s2.1 * (Q.scale : ℝ)) + let C : ℝ := 5 * delta⁻¹ + let U : ℝ := E.toReal + have hdelta : 0 < delta := by dsimp [delta]; linarith + have hdelta_le : delta ≤ 1 := by + dsimp [delta] + linarith [s2.2.2, s.2.1] + have hC_nonneg : 0 ≤ C := by dsimp [C]; positivity + have hC_one : 1 ≤ C := by + have hinv : 1 ≤ delta⁻¹ := (one_le_inv₀ hdelta).2 hdelta_le + dsimp [C] + nlinarith + have hS_nonneg : 0 ≤ S := Real.rpow_nonneg (by norm_num) _ + have hU_nonneg : 0 ≤ U := ENNReal.toReal_nonneg + have hP_nonneg : 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 N g + have hbase := cubeBesovPositiveVectorPartialSeminormTwo_sq_le_eLpNorm_of_toReal_eq_two + Q s s2 hss2.le N p hp2 g hg + have henergy := finite_noteResidualSum_le_scale_mul_disjointPowerEnergy + Q s2 N p g hg hfin + have hbase' : (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2 ≤ S ^ 2 * U := by + calc + (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * 2 * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + 2) := hbase + _ ≤ Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) * E.toReal := by + simpa [hp2] using henergy + _ = S ^ 2 * U := by + dsimp [S, U] + apply congrArg (fun x : ℝ => x * E.toReal) + calc + Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * 2) := by + congr 1 + ring + _ = Real.rpow (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) 2 := + Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _ + _ = (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ 2 := by + exact Real.rpow_natCast _ 2 + have hC_sq : 1 ≤ C ^ 2 := by nlinarith [sq_nonneg (C - 1)] + have hSU_nonneg : 0 ≤ S ^ 2 * U := mul_nonneg (sq_nonneg S) hU_nonneg + have hmiddle : S ^ 2 * U ≤ C ^ 2 * (S ^ 2 * U) := by + simpa using mul_le_mul_of_nonneg_right hC_sq hSU_nonneg + have hB_nonneg : 0 ≤ C * S * Real.sqrt U := + mul_nonneg (mul_nonneg hC_nonneg hS_nonneg) (Real.sqrt_nonneg _) + apply (sq_le_sq₀ hP_nonneg hB_nonneg).mp + calc + (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2 ≤ S ^ 2 * U := hbase' + _ ≤ C ^ 2 * (S ^ 2 * U) := hmiddle + _ = (C * S * Real.sqrt U) ^ 2 := by + rw [mul_pow, mul_pow, Real.sq_sqrt hU_nonneg] + ring + +/-- Uniform finite-partial bridge, including the `p = 2` endpoint. -/ +private theorem partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_root + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (N : ℕ) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ + (5 * (s2.1 - s.1)⁻¹) * Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal + (p.exponent.toReal)⁻¹ := by + have hr : (2 : ℝ) ≤ p.exponent.toReal := + ENNReal.toReal_mono p.lt_top.ne hp + rcases eq_or_lt_of_le hr with htwo | htwo + · have hend := partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_sqrt_of_toReal_eq_two + Q s s2 hss2 N p htwo.symm g hg hfin + convert hend using 1 + rw [Real.sqrt_eq_rpow, htwo.symm] + norm_num + · have hp' : (2 : ℝ≥0∞) < p.exponent := by + apply (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).mp + simpa using htwo + exact partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_root_of_two_lt + Q s s2 hss2 N p hp' g hg hfin + +/-- The source-facing positive-Besov bridge from the legacy finite-`2` +seminorm to the internal disjoint finite-`p` energy. No boundedness or +summability premise is exposed: the infinite-energy case is discharged in +`ENNReal`, and the finite case uses uniform finite partial bounds. -/ +theorem cubeBesovPositiveVectorSeminormTwo_le_five_mul_gap_inv_mul_scale_mul_disjointRoot + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) : + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ≤ + (5 : ℝ≥0∞) * ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) * + (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g) ^ + (p.exponent.toReal)⁻¹ := by + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let r : ℝ := p.exponent.toReal + have hdelta : 0 < s2.1 - s.1 := by linarith + have hr : 0 < r := finiteLpExponent_toReal_pos p + by_cases hfin : E < ∞ + · have hreal : cubeBesovPositiveVectorSeminormTwo Q s.1 g ≤ + (5 * (s2.1 - s.1)⁻¹) * Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow E.toReal r⁻¹ := by + apply cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s.1 g + intro N + exact partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_root + Q s s2 hss2 N p hp g hg (by simpa [E] using hfin) + change ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ≤ + (5 : ℝ≥0∞) * ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) * E ^ r⁻¹ + rw [← ENNReal.ofReal_toReal hfin.ne, + ENNReal.ofReal_rpow_of_nonneg ENNReal.toReal_nonneg (inv_nonneg.mpr hr.le)] + rw [show (5 : ℝ≥0∞) = ENNReal.ofReal 5 by norm_num, + ← ENNReal.ofReal_mul (by norm_num : (0 : ℝ) ≤ 5), + ← ENNReal.ofReal_mul (by positivity)] + have hfrontreal : 0 ≤ 5 * (s2.1 - s.1)⁻¹ * + Real.rpow 3 (s2.1 * (Q.scale : ℝ)) := + mul_nonneg (mul_nonneg (by norm_num) (inv_nonneg.mpr hdelta.le)) + (Real.rpow_nonneg (by norm_num) _) + rw [← ENNReal.ofReal_mul hfrontreal] + exact ENNReal.ofReal_le_ofReal hreal + · have htop : E = ∞ := top_unique (not_lt.mp hfin) + have hfront : (5 : ℝ≥0∞) * ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ≠ 0 := by + have hinv : 0 < (s2.1 - s.1)⁻¹ := inv_pos.mpr hdelta + have hscale : 0 < Real.rpow 3 (s2.1 * (Q.scale : ℝ)) := + Real.rpow_pos_of_pos (by norm_num) _ + positivity + calc + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ≤ ∞ := le_top + _ = (5 : ℝ≥0∞) * ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) * + (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g) ^ r⁻¹ := by + rw [← show E = cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g by rfl, + htop, ENNReal.top_rpow_of_pos (inv_pos.mpr hr), ENNReal.mul_top hfront] + +/-- The finite Euclidean source carrier makes the legacy finite partial +positive-Besov seminorms uniformly bounded. The finite-energy conclusion is +derived from the source-facing full `W^{s₂,p}` hypothesis, rather than being +silently assumed as a bare `MemLp` consequence. -/ +theorem cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_memLp_finiteP + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (g : Vec d → Vec d) + (hgFull : MemCubeEuclideanFullWsp Q s2 p g) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) := by + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + have hfin : E < ∞ := + disjointPowerEnergy_lt_top_of_memCubeEuclideanFullWsp Q s2 p g hgFull + let B : ℝ := (5 * (s2.1 - s.1)⁻¹) * + Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow E.toReal (p.exponent.toReal)⁻¹ + refine ⟨B, ?_⟩ + rintro z ⟨N, rfl⟩ + exact partial_le_five_mul_gap_inv_mul_scale_mul_disjoint_root + Q s s2 hss2 N p hp g hgFull.1 (by simpa [E] using hfin) + +/-- The sharp strict-`p` finite partial estimate retains the Hölder tail +explicitly. Unlike the public one-cube bridge above, this is kept internal: +the outer physical-scale summation combines this tail with its own geometric +discount before either loss is simplified. -/ +private theorem partial_le_scale_mul_disjoint_root_mul_holderTail_of_two_lt + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (N : ℕ) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ + Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal + (p.exponent.toReal)⁻¹ * + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ + (p.exponent.toReal / (p.exponent.toReal - 2))) + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal)) := by + let r : ℝ := p.exponent.toReal + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let S : ℝ := Real.rpow 3 (s2.1 * (Q.scale : ℝ)) + let U : ℝ := E.toReal + let T : ℝ := ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-(s2.1 - s.1) * (j : ℝ))) ^ 2) ^ (r / (r - 2)) + have hr : 2 < r := by + dsimp [r] + exact (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).2 hp + have hrpos : 0 < r := by linarith + have hS : 0 ≤ S := Real.rpow_nonneg (by norm_num) _ + have hU : 0 ≤ U := ENNReal.toReal_nonneg + have hT : 0 ≤ T := by + apply Finset.sum_nonneg + intro j _ + exact Real.rpow_nonneg (sq_nonneg _) _ + have hP : 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 N g + have henergy := finite_noteResidualSum_le_scale_mul_disjointPowerEnergy + Q s2 N p g hg hfin + have hpartial := partial_rpow_le_weighted_energy_mul_holder_tail + Q s s2 N p hp g hg + have hA : + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r) ≤ S ^ r * U := by + rw [show S ^ r = Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) by + dsimp [S] + calc + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ r = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * r) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ = Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := by + congr 1 + ring] + simpa [U, E, r] using henergy + have hpower : + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r ≤ + Real.rpow (S * Real.rpow U r⁻¹ * Real.rpow T ((r - 2) / (2 * r))) r := by + have hprod := mul_le_mul hA (le_refl (Real.rpow T ((r - 2) / 2))) + (Real.rpow_nonneg hT _) (mul_nonneg (Real.rpow_nonneg hS _) hU) + calc + Real.rpow (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) r ≤ + (∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * r * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) + r)) * Real.rpow T ((r - 2) / 2) := by + simpa [T, r] using hpartial + _ ≤ (S ^ r * U) * Real.rpow T ((r - 2) / 2) := hprod + _ = Real.rpow (S * Real.rpow U r⁻¹ * Real.rpow T ((r - 2) / (2 * r))) r := by + symm + calc + Real.rpow (S * Real.rpow U r⁻¹ * Real.rpow T ((r - 2) / (2 * r))) r = + Real.rpow (S * Real.rpow U r⁻¹) r * + Real.rpow (Real.rpow T ((r - 2) / (2 * r))) r := + Real.mul_rpow (mul_nonneg hS (Real.rpow_nonneg hU _)) + (Real.rpow_nonneg hT _) + _ = (S ^ r * Real.rpow (Real.rpow U r⁻¹) r) * + Real.rpow (Real.rpow T ((r - 2) / (2 * r))) r := by + congr 1 + exact Real.mul_rpow hS (Real.rpow_nonneg hU _) + _ = (S ^ r * U) * Real.rpow T ((r - 2) / 2) := by + have hUexp : r⁻¹ * r = 1 := inv_mul_cancel₀ hrpos.ne' + have hTexp : ((r - 2) / (2 * r)) * r = (r - 2) / 2 := by + field_simp [hrpos.ne'] + have hUcalc : Real.rpow (Real.rpow U r⁻¹) r = U := by + calc + Real.rpow (Real.rpow U r⁻¹) r = Real.rpow U (r⁻¹ * r) := + (Real.rpow_mul hU _ _).symm + _ = U := by simp [hUexp] + have hTcalc : Real.rpow (Real.rpow T ((r - 2) / (2 * r))) r = + Real.rpow T ((r - 2) / 2) := by + calc + Real.rpow (Real.rpow T ((r - 2) / (2 * r))) r = + Real.rpow T (((r - 2) / (2 * r)) * r) := + (Real.rpow_mul hT _ _).symm + _ = Real.rpow T ((r - 2) / 2) := by rw [hTexp] + rw [hUcalc, hTcalc] + exact (Real.rpow_le_rpow_iff hP + (mul_nonneg (mul_nonneg hS (Real.rpow_nonneg hU _)) + (Real.rpow_nonneg hT _)) hrpos).mp hpower + +/-- Uniform sharp strict-`p` bridge. Its tail is deliberately left as the +geometric-discount expression: the forcing assembly later couples it to the +outer physical-scale tail, yielding the frozen single inverse-gap loss. -/ +private theorem cubeBesovPositiveVectorSeminormTwo_le_scale_mul_disjoint_root_mul_holderTail_of_two_lt + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + cubeBesovPositiveVectorSeminormTwo Q s.1 g ≤ + Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal + (p.exponent.toReal)⁻¹ * + Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal)) := by + let r : ℝ := p.exponent.toReal + let delta : ℝ := s2.1 - s.1 + let D : ℝ := (Book.Ch02.geometricDiscount delta 1)⁻¹ + have hdelta : 0 < delta := by dsimp [delta]; linarith + have hdelta_le : delta ≤ 1 := by + dsimp [delta] + linarith [s2.2.2, s.2.1] + have hr : 2 < r := by + dsimp [r] + exact (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).2 hp + have hrpos : 0 < r := by linarith + have hgamma : 0 ≤ (r - 2) / (2 * r) := + div_nonneg (by linarith) (by positivity) + apply cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s.1 g + intro N + have hpartial := partial_le_scale_mul_disjoint_root_mul_holderTail_of_two_lt + Q s s2 N p hp g hg hfin + have htail : + ∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2)) ≤ D := + finite_holder_weight_le_inv_discount hdelta hr N + have htailroot := Real.rpow_le_rpow + (Finset.sum_nonneg fun _ _ => Real.rpow_nonneg (sq_nonneg _) _) htail hgamma + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ + Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal r⁻¹ * + Real.rpow + (∑ j ∈ Finset.range (N + 1), + ((Real.rpow 3 (-delta * (j : ℝ))) ^ 2) ^ (r / (r - 2))) + ((r - 2) / (2 * r)) := by + simpa [r, delta] using hpartial + _ ≤ Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal r⁻¹ * + Real.rpow D ((r - 2) / (2 * r)) := by + apply mul_le_mul_of_nonneg_left ?_ + (mul_nonneg (Real.rpow_nonneg (by norm_num) _) + (Real.rpow_nonneg ENNReal.toReal_nonneg _)) + simpa only [Real.rpow_eq_pow] using htailroot + _ = Real.rpow 3 (s2.1 * (Q.scale : ℝ)) * + Real.rpow (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal + (p.exponent.toReal)⁻¹ * + Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal)) := by + rfl + +/-- A normalized finite descendant average commutes with a nonnegative +countable depth sum. This is the bookkeeping step used to expose the two +depth indices in the forcing calculation. -/ +private theorem descendantsENNAverage_tsum_eq_tsum_descendantsENNAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℕ → ℝ≥0∞) : + descendantsENNAverage Q j (fun R => ∑' n : ℕ, F R n) = + ∑' n : ℕ, descendantsENNAverage Q j (fun R => F R n) := by + classical + unfold descendantsENNAverage + rw [show (∑ R ∈ descendantsAtDepth Q j, (fun R => ∑' n : ℕ, F R n) R) = + ∑' n : ℕ, ∑ R ∈ descendantsAtDepth Q j, F R n by + exact (Summable.tsum_finsetSum (fun R _ => ENNReal.summable)).symm] + rw [← ENNReal.tsum_mul_left] + +/-- The disjoint residual power average composes exactly across two +descendant depths. -/ +private theorem descendantsENNAverage_disjointDepthPower_eq_disjointDepthPower_add + {d : ℕ} (Q : TriadicCube d) (j n : ℕ) + (p : FiniteLpExponent) (g : Vec d → Vec d) : + descendantsENNAverage Q j + (fun R => cubeEuclideanPositiveBesovDisjointDepthPower R p g n) = + cubeEuclideanPositiveBesovDisjointDepthPower Q p g (j + n) := by + let F : TriadicCube d → ℝ≥0∞ := fun R => + (MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)) ^ p.exponent.toReal + have hdepth (R : TriadicCube d) (k : ℕ) : + cubeEuclideanPositiveBesovDisjointDepthPower R p g k = + descendantsENNAverage R k F := by + unfold cubeEuclideanPositiveBesovDisjointDepthPower descendantsENNAverage + apply congrArg (fun z : ℝ≥0∞ => ((descendantsAtDepth R k).card : ℝ≥0∞)⁻¹ * z) + exact Finset.sum_attach _ F + rw [hdepth] + simp_rw [hdepth] + exact + (descendantsENNAverage_add_eq_descendantsENNAverage_descendantsENNAverage + Q j n F).symm + +/-- Flatten the local disjoint energy of all depth-`j` descendants into the +single parent disjoint series. This is the physical content behind the +two-index forcing sum; no overlap carrier is used here. -/ +private theorem descendantsENNAverage_disjointPowerEnergy_eq_parentTail + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) + (p : FiniteLpExponent) (g : Vec d → Vec d) : + descendantsENNAverage Q j + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s p g) = + ∑' n : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - ((j + n : ℕ) : ℤ) : ℤ) : ℝ))))) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p g (j + n) := by + let weight : TriadicCube d → ℕ → ℝ≥0∞ := fun R n => + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (((R.scale - (n : ℤ) : ℤ) : ℝ))))) + rw [show (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s p g) = + (fun R => ∑' n : ℕ, weight R n * + cubeEuclideanPositiveBesovDisjointDepthPower R p g n) by + funext R + rfl] + rw [descendantsENNAverage_tsum_eq_tsum_descendantsENNAverage] + apply tsum_congr + intro n + have hweight : ∀ R ∈ descendantsAtDepth Q j, weight R n = weight Q (j + n) := by + intro R hR + dsimp [weight] + congr 2 + rw [scale_eq_sub_of_mem_descendantsAtDepth hR] + push_cast + ring + calc + descendantsENNAverage Q j (fun R => + weight R n * cubeEuclideanPositiveBesovDisjointDepthPower R p g n) = + weight Q (j + n) * descendantsENNAverage Q j + (fun R => cubeEuclideanPositiveBesovDisjointDepthPower R p g n) := by + unfold descendantsENNAverage + calc + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, + weight R n * cubeEuclideanPositiveBesovDisjointDepthPower R p g n = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, + weight Q (j + n) * cubeEuclideanPositiveBesovDisjointDepthPower R p g n := by + congr 1 + apply Finset.sum_congr rfl + intro R hR + rw [hweight R hR] + _ = weight Q (j + n) * + (((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, + cubeEuclideanPositiveBesovDisjointDepthPower R p g n) := by + calc + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (∑ R ∈ descendantsAtDepth Q j, + weight Q (j + n) * + cubeEuclideanPositiveBesovDisjointDepthPower R p g n) = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (weight Q (j + n) * + ∑ R ∈ descendantsAtDepth Q j, + cubeEuclideanPositiveBesovDisjointDepthPower R p g n) := by + rw [← Finset.mul_sum] + _ = weight Q (j + n) * + (((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, + cubeEuclideanPositiveBesovDisjointDepthPower R p g n) := by + ring + _ = weight Q (j + n) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p g (j + n) := by + rw [descendantsENNAverage_disjointDepthPower_eq_disjointDepthPower_add] + _ = ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - ((j + n : ℕ) : ℤ) : ℤ) : ℝ))))) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p g (j + n) := by + rfl + +/-- The sharp local bridge in power form. The finite source carrier supplies +the needed local finiteness internally, so this statement exposes no local +regularity hypothesis to the eventual forcing theorem. -/ +private theorem cubeBesovPositiveVectorSeminormTwo_rpow_le_sharp_local_energy_of_two_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) (g : Vec d → Vec d) + (hg : MemCubeEuclideanFullWsp Q s2 p g) : + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ + p.exponent.toReal ≤ + (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * (Q.scale : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g := by + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let r : ℝ := p.exponent.toReal + let T : ℝ := Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((r - 2) / (2 * r)) + let S : ℝ := Real.rpow 3 (s2.1 * (Q.scale : ℝ)) + let U : ℝ := E.toReal + have hr : 0 < r := by + dsimp [r] + exact finiteLpExponent_toReal_pos p + have hfin : E < ∞ := + disjointPowerEnergy_lt_top_of_memCubeEuclideanFullWsp Q s2 p g hg + have hB := cubeBesovPositiveVectorSeminormTwo_le_scale_mul_disjoint_root_mul_holderTail_of_two_lt + Q s s2 hss2 p hp g hg.1 (by simpa [E] using hfin) + have hS : 0 ≤ S := Real.rpow_nonneg (by norm_num) _ + have hU : 0 ≤ U := ENNReal.toReal_nonneg + have hT : 0 ≤ T := Real.rpow_nonneg + (inv_nonneg.mpr (Book.Ch02.book_geometricDiscount_pos (by linarith)).le) _ + have hreal : Real.rpow (S * Real.rpow U r⁻¹ * T) r = + Real.rpow T r * Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U := by + have hUcalc : Real.rpow (Real.rpow U r⁻¹) r = U := by + calc + Real.rpow (Real.rpow U r⁻¹) r = Real.rpow U (r⁻¹ * r) := + (Real.rpow_mul hU _ _).symm + _ = U := by + have hmul : r⁻¹ * r = 1 := inv_mul_cancel₀ hr.ne' + simp [hmul] + have hScalc : Real.rpow S r = + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := by + dsimp [S] + calc + Real.rpow (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) r = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * r) := + (Real.rpow_mul (by norm_num) _ _).symm + _ = Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := by + congr 1 + ring + calc + Real.rpow (S * Real.rpow U r⁻¹ * T) r = + Real.rpow (S * Real.rpow U r⁻¹) r * Real.rpow T r := + Real.mul_rpow (mul_nonneg hS (Real.rpow_nonneg hU _)) hT + _ = (Real.rpow S r * Real.rpow (Real.rpow U r⁻¹) r) * Real.rpow T r := by + congr 1 + exact Real.mul_rpow hS (Real.rpow_nonneg hU _) + _ = Real.rpow S r * U * Real.rpow T r := by + rw [hUcalc] + _ = Real.rpow T r * Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U := by + rw [hScalc] + ring + have hpower := ENNReal.rpow_le_rpow (ENNReal.ofReal_le_ofReal hB) hr.le + change (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ r ≤ _ + calc + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ r ≤ + (ENNReal.ofReal (S * Real.rpow U r⁻¹ * T)) ^ r := by + simpa [E, S, T, U, r] using hpower + _ = ENNReal.ofReal (Real.rpow (S * Real.rpow U r⁻¹ * T) r) := + ENNReal.ofReal_rpow_of_nonneg (mul_nonneg (mul_nonneg hS + (Real.rpow_nonneg hU _)) hT) hr.le + _ = ENNReal.ofReal (Real.rpow T r * + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U) := by rw [hreal] + _ = (ENNReal.ofReal T ^ r) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * E := by + have hX : 0 ≤ Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hsplit : ENNReal.ofReal (Real.rpow T r * + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U) = + ENNReal.ofReal (Real.rpow T r) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * + ENNReal.ofReal U := by + calc + ENNReal.ofReal (Real.rpow T r * + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U) = + ENNReal.ofReal + ((Real.rpow T r * Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * U) := by + congr 1 + _ = ENNReal.ofReal (Real.rpow T r * + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * ENNReal.ofReal U := + ENNReal.ofReal_mul (mul_nonneg (Real.rpow_nonneg hT _) hX) + _ = (ENNReal.ofReal (Real.rpow T r) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)))) * + ENNReal.ofReal U := by + exact congrArg (fun z : ℝ≥0∞ => z * ENNReal.ofReal U) + (ENNReal.ofReal_mul (Real.rpow_nonneg hT _)) + _ = ENNReal.ofReal (Real.rpow T r) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * + ENNReal.ofReal U := by ring + calc + ENNReal.ofReal (Real.rpow T r * + Real.rpow 3 (s2.1 * r * (Q.scale : ℝ)) * U) = + ENNReal.ofReal (Real.rpow T r) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * + ENNReal.ofReal U := hsplit + _ = ENNReal.ofReal T ^ r * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * + ENNReal.ofReal U := by + exact congrArg (fun z : ℝ≥0∞ => + z * ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * + ENNReal.ofReal U) + (ENNReal.ofReal_rpow_of_nonneg hT hr.le).symm + _ = ENNReal.ofReal T ^ r * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (Q.scale : ℝ))) * E := by + rw [← ENNReal.ofReal_toReal hfin.ne] + +private theorem descendantsENNAverage_mul_left {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ≥0∞) (F : TriadicCube d → ℝ≥0∞) : + descendantsENNAverage Q j (fun R => c * F R) = + c * descendantsENNAverage Q j F := by + unfold descendantsENNAverage + rw [← Finset.mul_sum] + ring + +/-- One outer physical scale of the strict finite-`p` forcing calculation is +controlled by the sharp local disjoint energy. The remaining proof sums this +inequality and uses the preceding exact flattening identity. -/ +private theorem descendantsAtScale_sharp_local_forcing_power_le_of_two_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (j : ℕ) (s s2 : FractionalOrder) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) < p.exponent) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) : + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + have hnj : n - (j : ℤ) ≤ Q.scale := by omega + have hpoint : ∀ R ∈ descendantsAtScale Q (n - (j : ℤ)), + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal ≤ + (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g := by + intro R hRmem + have hgR := MemCubeEuclideanFullWsp.onDescendant hnj hRmem hg + have hlocal := cubeBesovPositiveVectorSeminormTwo_rpow_le_sharp_local_energy_of_two_lt + R s s2 hss2 p hp g hgR + rw [scale_eq_of_mem_descendantsAtScale hRmem] at hlocal + exact hlocal + rw [descendantsAtScaleENNAverage_eq_descendantsENNAverage Q (n - (j : ℤ)) hnj, + descendantsAtScaleENNAverage_eq_descendantsENNAverage Q (n - (j : ℤ)) hnj] + calc + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ)))) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ)))) (fun R => + (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + unfold descendantsENNAverage + apply mul_le_mul_right + apply Finset.sum_le_sum + intro R hR + apply hpoint + rw [descendantsAtScale_eq_descendantsAtDepth Q hnj] + exact hR + _ = (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ))) ) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + rw [show (fun R => + (ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) = + (fun R => + ((ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) 1)⁻¹ + ((p.exponent.toReal - 2) / (2 * p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ)))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) by + funext R + ring, + descendantsENNAverage_mul_left] + +/-- A nonnegative shifted tail is bounded by the complete series. -/ +private theorem ENNReal_tsum_nat_add_le (E : ℕ → ℝ≥0∞) (j : ℕ) : + ∑' l : ℕ, E (j + l) ≤ ∑' m : ℕ, E m := by + apply ENNReal.tsum_le_of_sum_range_le + intro N + calc + ∑ l ∈ Finset.range N, E (j + l) ≤ ∑ m ∈ Finset.range (j + N), E m := by + rw [Finset.sum_range_add] + exact le_add_of_nonneg_left bot_le + _ ≤ ∑' m : ℕ, E m := ENNReal.sum_le_tsum _ + +/-- The triangular double series arising from local descendant energies is +bounded by the product of its geometric outer tail and its complete parent +energy series. -/ +private theorem ENNReal_tsum_mul_shifted_tsum_le + (w E : ℕ → ℝ≥0∞) : + ∑' j : ℕ, w j * ∑' l : ℕ, E (j + l) ≤ + (∑' j : ℕ, w j) * ∑' m : ℕ, E m := by + calc + ∑' j : ℕ, w j * ∑' l : ℕ, E (j + l) ≤ + ∑' j : ℕ, w j * ∑' m : ℕ, E m := by + apply ENNReal.tsum_le_tsum + intro j + exact mul_le_mul_right (ENNReal_tsum_nat_add_le E j) _ + _ = (∑' j : ℕ, w j) * ∑' m : ℕ, E m := ENNReal.tsum_mul_right + +private theorem physicalScaleDepth_add {d : ℕ} (Q : TriadicCube d) + (n : ℤ) (hn : n ≤ Q.scale) (j : ℕ) : + Int.toNat (Q.scale - (n - (j : ℤ))) = Int.toNat (Q.scale - n) + j := by + have h0 : 0 ≤ Q.scale - n := by omega + have hj : 0 ≤ (j : ℤ) := by positivity + rw [show Q.scale - (n - (j : ℤ)) = (Q.scale - n) + j by ring, + Int.toNat_add h0 hj] + simp + +/-- At the Hilbert endpoint the local conversion has no Hölder-tail loss. +This is kept in power form because it is used only in the final two-level +forcing aggregation. -/ +private theorem cubeBesovPositiveVectorSeminormTwo_sq_le_scale_sq_mul_disjoint_of_toReal_eq_two + {d : ℕ} (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp2 : p.exponent.toReal = 2) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (g x)) p.exponent + (normalizedCubeMeasure Q)) + (hfin : cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g < ∞) : + (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ^ 2 ≤ + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ 2 * + (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g).toReal := by + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let S : ℝ := Real.rpow 3 (s2.1 * (Q.scale : ℝ)) + have hS_nonneg : 0 ≤ S := Real.rpow_nonneg (by norm_num) _ + have hE_nonneg : 0 ≤ E.toReal := ENNReal.toReal_nonneg + have hpartial : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g ≤ S * Real.sqrt E.toReal := by + intro N + have hbase := cubeBesovPositiveVectorPartialSeminormTwo_sq_le_eLpNorm_of_toReal_eq_two + Q s s2 hss2.le N p hp2 g hg + have henergy := finite_noteResidualSum_le_scale_mul_disjointPowerEnergy + Q s2 N p g hg hfin + apply (sq_le_sq₀ + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 N g) + (mul_nonneg hS_nonneg (Real.sqrt_nonneg _))).mp + calc + (cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), + Real.rpow 3 (s2.1 * 2 * (j : ℝ)) * + descendantsAverage Q j (fun R => + Real.rpow + ((MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (g x - cubeAverageVec R g)) p.exponent + (normalizedCubeMeasure R)).toReal) 2) := hbase + _ ≤ Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) * E.toReal := by + simpa [hp2, E] using henergy + _ = (S * Real.sqrt E.toReal) ^ 2 := by + dsimp [S] + rw [mul_pow, Real.sq_sqrt hE_nonneg] + congr 1 + calc + Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * 2) := by congr 1; ring + _ = (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ 2 := by + calc + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * 2) = + Real.rpow (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) (2 : ℝ) := + Real.rpow_mul (x := (3 : ℝ)) (by norm_num) + (s2.1 * (Q.scale : ℝ)) (2 : ℝ) + _ = (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ (2 : ℕ) := + Real.rpow_natCast _ 2 + have hfull := cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s.1 g hpartial + have hBdd : BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s.1 N g) := + ⟨S * Real.sqrt E.toReal, by rintro _ ⟨N, rfl⟩; exact hpartial N⟩ + have hfull_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s.1 g := + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 0 g).trans + (by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hBdd ⟨0, rfl⟩) + calc + (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ^ 2 ≤ + (S * Real.sqrt E.toReal) ^ 2 := + (sq_le_sq₀ hfull_nonneg (mul_nonneg hS_nonneg (Real.sqrt_nonneg _))).mpr hfull + _ = S ^ 2 * E.toReal := by rw [mul_pow, Real.sq_sqrt hE_nonneg] + +/-- ENNReal power version of the exact Hilbert-endpoint local conversion. -/ +private theorem cubeBesovPositiveVectorSeminormTwo_rpow_le_sharp_local_energy_of_toReal_eq_two + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s s2 : FractionalOrder) + (hss2 : s.1 < s2.1) (p : FiniteLpExponent) + (hp2 : p.exponent.toReal = 2) (g : Vec d → Vec d) + (hg : MemCubeEuclideanFullWsp Q s2 p g) : + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ + p.exponent.toReal ≤ + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * (Q.scale : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g := by + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + have hfin : E < ∞ := + disjointPowerEnergy_lt_top_of_memCubeEuclideanFullWsp Q s2 p g hg + have hpENN : (2 : ℝ≥0∞) ≤ p.exponent := by + apply (ENNReal.toReal_le_toReal ENNReal.ofNat_ne_top p.lt_top.ne).mp + simp [hp2] + have hBdd := cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_memLp_finiteP + Q s s2 hss2 p hpENN g hg + have hfull_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s.1 g := + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s.1 0 g).trans + (by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hBdd ⟨0, rfl⟩) + have hreal := cubeBesovPositiveVectorSeminormTwo_sq_le_scale_sq_mul_disjoint_of_toReal_eq_two + Q s s2 hss2 p hp2 g hg.1 (by simp [E, hfin]) + rw [hp2] + change (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ 2 ≤ _ + rw [show (2 : ℝ) = (2 : ℕ) by norm_num, ENNReal.rpow_natCast] + change (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo Q s.1 g)) ^ 2 ≤ + ENNReal.ofReal (Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ))) * E + rw [← ENNReal.ofReal_toReal hfin.ne] + have hscale : 0 ≤ Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + rw [← ENNReal.ofReal_mul hscale] + rw [← ENNReal.ofReal_pow hfull_nonneg 2] + apply ENNReal.ofReal_le_ofReal + calc + (cubeBesovPositiveVectorSeminormTwo Q s.1 g) ^ 2 ≤ + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ 2 * E.toReal := by + simpa [E] using hreal + _ = Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) * E.toReal := by + congr 1 + calc + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ 2 = + Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * 2) := by + calc + (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) ^ (2 : ℕ) = + Real.rpow (Real.rpow 3 (s2.1 * (Q.scale : ℝ))) (2 : ℝ) := + (Real.rpow_natCast _ 2).symm + _ = Real.rpow 3 ((s2.1 * (Q.scale : ℝ)) * 2) := + (Real.rpow_mul (x := (3 : ℝ)) (by norm_num) + (s2.1 * (Q.scale : ℝ)) (2 : ℝ)).symm + _ = Real.rpow 3 (s2.1 * 2 * (Q.scale : ℝ)) := by congr 1; ring + +/-- The endpoint local estimate averaged over one physical outer scale. -/ +private theorem descendantsAtScale_sharp_local_forcing_power_le_of_toReal_eq_two + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (j : ℕ) (s s2 : FractionalOrder) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp2 : p.exponent.toReal = 2) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) : + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + have hnj : n - (j : ℤ) ≤ Q.scale := by omega + have hpoint : ∀ R ∈ descendantsAtScale Q (n - (j : ℤ)), + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal ≤ + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g := by + intro R hRmem + have hgR := MemCubeEuclideanFullWsp.onDescendant hnj hRmem hg + have hlocal := cubeBesovPositiveVectorSeminormTwo_rpow_le_sharp_local_energy_of_toReal_eq_two + R s s2 hss2 p hp2 g hgR + rw [scale_eq_of_mem_descendantsAtScale hRmem] at hlocal + exact hlocal + rw [descendantsAtScaleENNAverage_eq_descendantsENNAverage Q (n - (j : ℤ)) hnj, + descendantsAtScaleENNAverage_eq_descendantsENNAverage Q (n - (j : ℤ)) hnj] + calc + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ)))) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ)))) (fun R => + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + unfold descendantsENNAverage + apply mul_le_mul_right + apply Finset.sum_le_sum + intro R hR + apply hpoint + rw [descendantsAtScale_eq_descendantsAtDepth Q hnj] + exact hR + _ = ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsENNAverage Q (Int.toNat (Q.scale - (n - (j : ℤ)))) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + rw [descendantsENNAverage_mul_left] + +/-- The retained local Hölder tail and the outer finite-`p` geometric tail +consume at most one inverse fractional gap together. This is the scalar +estimate which prevents the two-level calculation from paying the gap twice. -/ +private theorem sharp_two_level_discount_tail_le_five_mul_inv + {delta r : ℝ} (hdelta : 0 < delta) (hdelta_le : delta ≤ 1) + (hr : 2 ≤ r) : + Real.rpow (Book.Ch02.geometricDiscount delta 1)⁻¹ + ((r - 2) / (2 * r)) * + Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r) ≤ + 5 * delta⁻¹ := by + have hrpos : 0 < r := lt_of_lt_of_le (by norm_num) hr + have hrone : 1 ≤ r := le_trans (by norm_num) hr + let D : ℝ := Book.Ch02.geometricDiscount delta 1 + let Dr : ℝ := Book.Ch02.geometricDiscount delta r + have hDpos : 0 < D := by + dsimp [D] + exact Book.Ch02.book_geometricDiscount_pos (by positivity) + have hDrpos : 0 < Dr := by + dsimp [Dr] + exact Book.Ch02.book_geometricDiscount_pos (mul_pos hdelta hrpos) + have hDleDr : D ≤ Dr := by + dsimp [D, Dr, Book.Ch02.geometricDiscount] + have hp : Real.rpow (3 : ℝ) (-delta * r) ≤ Real.rpow 3 (-delta * 1) := by + apply Real.rpow_le_rpow_of_exponent_le (by norm_num) + nlinarith + exact sub_le_sub_left hp 1 + have hinv : Dr⁻¹ ≤ D⁻¹ := (inv_le_inv₀ hDrpos hDpos).2 hDleDr + have houter : Real.rpow Dr (-1 / r) ≤ Real.rpow D⁻¹ (1 / r) := by + have hrewrite : Real.rpow Dr (-1 / r) = Real.rpow Dr⁻¹ (1 / r) := by + rw [show (-1 / r : ℝ) = -(1 / r) by ring] + exact Real.rpow_neg_eq_inv_rpow _ _ + rw [hrewrite] + exact Real.rpow_le_rpow (inv_nonneg.mpr hDrpos.le) hinv (by positivity) + have hleft_nonneg : 0 ≤ Real.rpow D⁻¹ ((r - 2) / (2 * r)) := + Real.rpow_nonneg (inv_nonneg.mpr hDpos.le) _ + have hmult := mul_le_mul_of_nonneg_left houter hleft_nonneg + have hexp : (r - 2) / (2 * r) + 1 / r = 1 / 2 := by + field_simp [hrpos.ne'] + ring + have hcombine : + Real.rpow D⁻¹ ((r - 2) / (2 * r)) * Real.rpow D⁻¹ (1 / r) = + Real.rpow D⁻¹ (1 / 2) := by + rw [← hexp] + exact (Real.rpow_add (inv_pos.mpr hDpos) _ _).symm + have hroot_le : Real.rpow D⁻¹ (1 / 2) ≤ D⁻¹ := by + have hDinv_one : 1 ≤ D⁻¹ := by + have hDle : D ≤ 1 := by + dsimp [D, Book.Ch02.geometricDiscount] + have hpow : 0 ≤ Real.rpow (3 : ℝ) (-delta * 1) := + Real.rpow_nonneg (by norm_num) _ + exact sub_le_self 1 hpow + exact (one_le_inv₀ hDpos).2 hDle + calc + Real.rpow D⁻¹ (1 / 2) ≤ Real.rpow D⁻¹ 1 := + Real.rpow_le_rpow_of_exponent_le hDinv_one (by norm_num) + _ = D⁻¹ := Real.rpow_one _ + calc + Real.rpow (Book.Ch02.geometricDiscount delta 1)⁻¹ + ((r - 2) / (2 * r)) * + Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r) = + Real.rpow D⁻¹ ((r - 2) / (2 * r)) * Real.rpow Dr (-1 / r) := by rfl + _ ≤ Real.rpow D⁻¹ ((r - 2) / (2 * r)) * Real.rpow D⁻¹ (1 / r) := hmult + _ = Real.rpow D⁻¹ (1 / 2) := hcombine + _ ≤ D⁻¹ := hroot_le + _ ≤ 5 * delta⁻¹ := by + dsimp [D] + exact Book.Ch02.inv_geometricDiscount_le_five_inv hdelta hdelta_le (by norm_num) + +/-- The exact exponent bookkeeping for one outer forcing scale. -/ +private theorem outer_forcing_scale_factor_eq + {s1 s s2 r n : ℝ} (j : ℕ) : + ENNReal.ofReal (Real.rpow 3 (-(s - s1) * r * (j : ℝ))) * + ENNReal.ofReal (Real.rpow 3 (s2 * r * (n - (j : ℝ)))) = + ENNReal.ofReal (Real.rpow 3 (s2 * r * n)) * + ENNReal.ofReal (Real.rpow 3 (-(s2 + s - s1) * r * (j : ℝ))) := by + calc + ENNReal.ofReal (Real.rpow 3 (-(s - s1) * r * (j : ℝ))) * + ENNReal.ofReal (Real.rpow 3 (s2 * r * (n - (j : ℝ)))) = + ENNReal.ofReal (Real.rpow 3 (-(s - s1) * r * (j : ℝ)) * + Real.rpow 3 (s2 * r * (n - (j : ℝ)))) := by + exact (ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _)).symm + _ = ENNReal.ofReal (Real.rpow 3 + (s2 * r * n + (-(s2 + s - s1) * r * (j : ℝ)))) := by + congr 1 + rw [show s2 * r * n + (-(s2 + s - s1) * r * (j : ℝ)) = + (-(s - s1) * r * (j : ℝ)) + s2 * r * (n - (j : ℝ)) by ring] + simpa [Real.rpow_eq_pow] using + (Real.rpow_add (x := (3 : ℝ)) (by norm_num) + (-(s - s1) * r * (j : ℝ)) (s2 * r * (n - (j : ℝ)))).symm + _ = ENNReal.ofReal (Real.rpow 3 (s2 * r * n) * + Real.rpow 3 (-(s2 + s - s1) * r * (j : ℝ))) := by + congr 1 + simpa [Real.rpow_eq_pow] using + (Real.rpow_add (x := (3 : ℝ)) (by norm_num) + (s2 * r * n) (-(s2 + s - s1) * r * (j : ℝ))) + _ = ENNReal.ofReal (Real.rpow 3 (s2 * r * n)) * + ENNReal.ofReal (Real.rpow 3 (-(s2 + s - s1) * r * (j : ℝ))) := + ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _) + +/-- Physical-scale form of the exact parent-tail flattening. -/ +private theorem descendantsAtScale_disjointPowerEnergy_eq_shifted_parentTail + {d : ℕ} (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) (g : Vec d → Vec d) : + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s p g) = + ∑' l : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - ((Int.toNat (Q.scale - n) + (j + l) : ℕ) : ℤ) : ℤ) : ℝ))))) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p g + (Int.toNat (Q.scale - n) + (j + l)) := by + have hnj : n - (j : ℤ) ≤ Q.scale := by omega + rw [descendantsAtScaleENNAverage_eq_descendantsENNAverage Q (n - (j : ℤ)) hnj, + descendantsENNAverage_disjointPowerEnergy_eq_parentTail] + apply tsum_congr + intro l + rw [physicalScaleDepth_add Q n hn j] + simp only [Nat.add_assoc] + +/-- The outer physical-scale tail is no larger than the geometric tail at +the actual fractional gap. We keep this as an `ENNReal` statement so that +the final forcing proof need not reopen any real-to-extended-real coercions. -/ +private theorem forcing_outer_tsum_le_discount + {delta beta r : ℝ} (hdelta : 0 < delta) (hbeta : delta ≤ beta) + (hr : 0 < r) : + ∑' j : ℕ, ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) ≤ + ENNReal.ofReal (Book.Ch02.geometricDiscount delta r)⁻¹ := by + let x : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 (-delta * r)) + have hx_nonneg : 0 ≤ Real.rpow 3 (-delta * r) := + Real.rpow_nonneg (by norm_num) _ + have hterm : ∀ j : ℕ, + ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) ≤ x ^ j := by + intro j + have hbase : (1 : ℝ) ≤ 3 := by norm_num + have hj : 0 ≤ (j : ℝ) := by positivity + have hexp : -beta * r * (j : ℝ) ≤ (-delta * r) * (j : ℝ) := by + nlinarith [mul_nonneg (sub_nonneg.mpr hbeta) (mul_nonneg hr.le hj)] + have hreal : Real.rpow 3 (-beta * r * (j : ℝ)) ≤ + Real.rpow 3 ((-delta * r) * (j : ℝ)) := + Real.rpow_le_rpow_of_exponent_le hbase hexp + calc + ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) ≤ + ENNReal.ofReal (Real.rpow 3 ((-delta * r) * (j : ℝ))) := + ENNReal.ofReal_le_ofReal hreal + _ = x ^ j := by + have hx : 0 ≤ Real.rpow (3 : ℝ) (-delta * r) := + Real.rpow_nonneg (by norm_num) _ + dsimp [x] + rw [Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3), + Real.rpow_natCast] + change ENNReal.ofReal ((Real.rpow 3 (-delta * r)) ^ j) = + (ENNReal.ofReal (Real.rpow 3 (-delta * r))) ^ j + exact ENNReal.ofReal_pow hx j + calc + ∑' j : ℕ, ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) ≤ + ∑' j : ℕ, x ^ j := ENNReal.tsum_le_tsum hterm + _ = ENNReal.ofReal (Book.Ch02.geometricDiscount delta r)⁻¹ := by + rw [ENNReal.tsum_geometric] + have hdisc : 0 < Book.Ch02.geometricDiscount delta r := + Book.Ch02.book_geometricDiscount_pos (mul_pos hdelta hr) + rw [ENNReal.ofReal_inv_of_pos hdisc] + congr 1 + simpa [x, Book.Ch02.geometricDiscount] using + (ENNReal.ofReal_sub 1 hx_nonneg).symm + +private theorem forcing_outer_tsum_root_le_discount + {delta beta r : ℝ} (hdelta : 0 < delta) (hbeta : delta ≤ beta) (hr : 0 < r) : + (∑' j : ℕ, ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ)))) ^ r⁻¹ ≤ + ENNReal.ofReal (Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r)) := by + let D : ℝ := Book.Ch02.geometricDiscount delta r + let w : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) + have hDpos : 0 < D := by + dsimp [D] + exact Book.Ch02.book_geometricDiscount_pos (mul_pos hdelta hr) + have htail : ∑' j : ℕ, w j ≤ ENNReal.ofReal D⁻¹ := by + dsimp [w, D] + exact forcing_outer_tsum_le_discount hdelta hbeta hr + have htail_root : (∑' j : ℕ, w j) ^ r⁻¹ ≤ + ENNReal.ofReal (Real.rpow D (-1 / r)) := by + calc + (∑' j : ℕ, w j) ^ r⁻¹ ≤ (ENNReal.ofReal D⁻¹) ^ r⁻¹ := + ENNReal.rpow_le_rpow htail (inv_nonneg.mpr hr.le) + _ = ENNReal.ofReal (Real.rpow D (-1 / r)) := by + rw [ENNReal.ofReal_rpow_of_pos (inv_pos.mpr hDpos)] + congr 1 + calc + Real.rpow D⁻¹ r⁻¹ = Real.rpow (Real.rpow D (-1)) r⁻¹ := by + congr 1 + exact (Real.rpow_neg_one D).symm + _ = Real.rpow D ((-1 : ℝ) * r⁻¹) := + (Real.rpow_mul hDpos.le _ _).symm + _ = Real.rpow D (-1 / r) := by + congr 1 + exact htail_root + +/-- Root the four nonnegative factors produced by the outer forcing series. +The first two already occur at the finite exponent, while the last two are +the geometric tail and the complete parent energy. -/ +private theorem ENNReal_rpow_four_factor + {A S T E : ℝ≥0∞} {r : ℝ} (hr : 0 < r) : + (A ^ r * S ^ r * T * E) ^ r⁻¹ = + A * S * T ^ r⁻¹ * E ^ r⁻¹ := by + rw [show A ^ r * S ^ r * T * E = (A ^ r) * (S ^ r) * T * E by ring, + ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hr.le), + ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hr.le), + ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hr.le)] + rw [← ENNReal.rpow_mul, ← ENNReal.rpow_mul, + mul_inv_cancel₀ hr.ne', ENNReal.rpow_one] + simp only [ENNReal.rpow_one] + +/-- Assemble a one-level sharp forcing estimate over all physical scales. +The hypotheses deliberately expose only the internal retained-tail factor +`A`; the public theorem below supplies it in the strict and endpoint cases. -/ +private theorem localCoarseGrainingForcingLp_le_of_sharp_local + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (s1 s s2 : FractionalOrder) (hs1s : s1.1 < s.1) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) + (A : ℝ≥0∞) + (hlocal : ∀ j : ℕ, + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + A ^ p.exponent.toReal * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g)) + (hA : A * ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount (s2.1 - s.1) + p.exponent.toReal) (-1 / p.exponent.toReal)) ≤ + ENNReal.ofReal (5 * (s2.1 - s.1)⁻¹)) : + localCoarseGrainingForcingLp Q n s1 s p g ≤ + (5 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + let r : ℝ := p.exponent.toReal + let delta : ℝ := s2.1 - s.1 + let beta : ℝ := s2.1 + s.1 - s1.1 + let S : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) + let E : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s2 p g + let w : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal (Real.rpow 3 (-beta * r * (j : ℝ))) + let D : ℝ := Book.Ch02.geometricDiscount delta r + have hr : 0 < r := finiteLpExponent_toReal_pos p + have hr_two : 2 ≤ r := by + dsimp [r] + exact ENNReal.toReal_mono p.lt_top.ne hp + have hdelta : 0 < delta := by + dsimp [delta] + linarith + have hdelta_le : delta ≤ 1 := by + dsimp [delta] + have hs2_lt : s2.1 < 1 := s2.2.2 + have hs_nonneg : 0 ≤ s.1 := le_of_lt s.2.1 + linarith + have hbeta : delta ≤ beta := by + dsimp [delta, beta] + have hspos : 0 < s.1 := s.2.1 + linarith + have htail_root : (∑' j : ℕ, w j) ^ r⁻¹ ≤ + ENNReal.ofReal (Real.rpow D (-1 / r)) := by + dsimp [w, D] + exact forcing_outer_tsum_root_le_discount hdelta hbeta hr + have hlocal' : ∀ j : ℕ, + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ r) ≤ + A ^ r * + ENNReal.ofReal (Real.rpow 3 (s2.1 * r * ((n : ℝ) - (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + intro j + simpa only [r, Int.cast_sub, Int.cast_natCast] using hlocal j + have hS : S ^ r = ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (n : ℝ))) := by + dsimp [S] + rw [ENNReal.ofReal_rpow_of_nonneg + (Real.rpow_nonneg (by norm_num) _) hr.le] + congr 1 + calc + Real.rpow (Real.rpow 3 (s2.1 * (n : ℝ))) r = + Real.rpow 3 ((s2.1 * (n : ℝ)) * r) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ = Real.rpow 3 (s2.1 * r * (n : ℝ)) := by + congr 1 + ring + let h0 : ℕ := Int.toNat (Q.scale - n) + let G : ℕ → ℝ≥0∞ := fun m => + ENNReal.ofReal (Real.rpow 3 + (-(s2.1 * r * (((Q.scale - ((m : ℕ) : ℤ) : ℤ) : ℝ))))) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p g m + let F : ℕ → ℝ≥0∞ := fun m => G (h0 + m) + have hparent (j : ℕ) : + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) = + ∑' l : ℕ, F (j + l) := by + rw [descendantsAtScale_disjointPowerEnergy_eq_shifted_parentTail Q n hn j s2 p g] + have hF_tail : ∑' m : ℕ, F m ≤ E := by + calc + ∑' m : ℕ, F m = ∑' m : ℕ, G (h0 + m) := by rfl + _ ≤ ∑' m : ℕ, G m := ENNReal_tsum_nat_add_le G h0 + _ = E := by + dsimp [G, E] + rfl + have hseries : + ∑' j : ℕ, w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) ≤ + (∑' j : ℕ, w j) * E := by + calc + ∑' j : ℕ, w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) = + ∑' j : ℕ, w j * ∑' l : ℕ, F (j + l) := by + apply tsum_congr + intro j + rw [hparent] + _ ≤ (∑' j : ℕ, w j) * ∑' m : ℕ, F m := + ENNReal_tsum_mul_shifted_tsum_le w F + _ ≤ (∑' j : ℕ, w j) * E := + mul_le_mul_right hF_tail _ + have hpower : localCoarseGrainingForcingPowerEnergy Q n s1 s p g ≤ + A ^ r * S ^ r * (∑' j : ℕ, w j) * E := by + unfold localCoarseGrainingForcingPowerEnergy + calc + ∑' j : ℕ, ENNReal.ofReal + (Real.rpow 3 (-(s.1 - s1.1) * r * (j : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ r) ≤ + ∑' j : ℕ, ENNReal.ofReal + (Real.rpow 3 (-(s.1 - s1.1) * r * (j : ℝ))) * + (A ^ r * ENNReal.ofReal + (Real.rpow 3 (s2.1 * r * ((n : ℝ) - (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g)) := by + apply ENNReal.tsum_le_tsum + intro j + exact mul_le_mul_right (hlocal' j) _ + _ = ∑' j : ℕ, A ^ r * S ^ r * w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + apply tsum_congr + intro j + calc + _ = A ^ r * + (ENNReal.ofReal (Real.rpow 3 + (-(s.1 - s1.1) * r * (j : ℝ))) * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * r * ((n : ℝ) - (j : ℝ))))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + ring + _ = A ^ r * + (ENNReal.ofReal (Real.rpow 3 (s2.1 * r * (n : ℝ))) * w j) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + rw [outer_forcing_scale_factor_eq (s1 := s1.1) (s := s.1) + (s2 := s2.1) (r := r) (n := (n : ℝ)) j] + _ = A ^ r * S ^ r * w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + rw [← hS] + ring + _ = A ^ r * S ^ r * ∑' j : ℕ, w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + rw [show (fun j : ℕ => + A ^ r * S ^ r * w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g)) = + (fun j : ℕ => A ^ r * S ^ r * + (w j * descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g))) by + funext j + ring, + ENNReal.tsum_mul_left] + _ ≤ A ^ r * S ^ r * ((∑' j : ℕ, w j) * E) := by + calc + A ^ r * S ^ r * ∑' j : ℕ, w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) = + (A ^ r * S ^ r) * + (∑' j : ℕ, w j * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g)) := by + ring + _ ≤ (A ^ r * S ^ r) * ((∑' j : ℕ, w j) * E) := + mul_le_mul_right hseries _ + _ = A ^ r * S ^ r * ((∑' j : ℕ, w j) * E) := by ring + _ = A ^ r * S ^ r * (∑' j : ℕ, w j) * E := by ring + have hroot := ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr hr.le) + have hLp : localCoarseGrainingForcingLp Q n s1 s p g ^ r = + localCoarseGrainingForcingPowerEnergy Q n s1 s p g := by + simpa only [r] using localCoarseGrainingForcingLp_rpow_eq_powerEnergy Q n s1 s p g + rw [← hLp, ← ENNReal.rpow_mul, mul_inv_cancel₀ hr.ne', ENNReal.rpow_one] at hroot + rw [ENNReal_rpow_four_factor hr] at hroot + have hAE : A * (∑' j : ℕ, w j) ^ r⁻¹ ≤ + ENNReal.ofReal (5 * delta⁻¹) := by + calc + A * (∑' j : ℕ, w j) ^ r⁻¹ ≤ + A * ENNReal.ofReal (Real.rpow D (-1 / r)) := + mul_le_mul_right htail_root _ + _ ≤ ENNReal.ofReal (5 * delta⁻¹) := by + simpa only [delta, r, D] using hA + have hEroot := cubeEuclideanPositiveBesovDisjointPowerEnergy_root_le_overlap + Q s2 p hp g + calc + localCoarseGrainingForcingLp Q n s1 s p g ≤ + A * S * (∑' j : ℕ, w j) ^ r⁻¹ * E ^ r⁻¹ := hroot + _ = (A * (∑' j : ℕ, w j) ^ r⁻¹) * S * E ^ r⁻¹ := by + ac_rfl + _ ≤ ENNReal.ofReal (5 * delta⁻¹) * S * E ^ r⁻¹ := by + gcongr + _ ≤ ENNReal.ofReal (5 * delta⁻¹) * S * + ((3 ^ d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g) := by + gcongr + _ = (5 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal (delta⁻¹) * S * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + rw [ENNReal.ofReal_mul (by norm_num : (0 : ℝ) ≤ 5)] + rw [ENNReal.ofReal_ofNat 5] + norm_num + ac_rfl + _ = (5 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + rfl + +/-- The global finite-`p` forcing aggregation has exactly one inverse +fractional gap. The calculation is internalized through disjoint descendant +energies, then returned to the source-facing exact-overlap seminorm. -/ +theorem localCoarseGrainingForcingLp_le_five_mul_gap_inv_mul_scale_mul_overlap + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (s1 s s2 : FractionalOrder) (hs1s : s1.1 < s.1) (hss2 : s.1 < s2.1) + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (g : Vec d → Vec d) (hg : MemCubeEuclideanFullWsp Q s2 p g) : + localCoarseGrainingForcingLp Q n s1 s p g ≤ + (5 : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((s2.1 - s.1)⁻¹) * + ENNReal.ofReal (Real.rpow 3 (s2.1 * (n : ℝ))) * + cubeEuclideanPositiveBesovOverlapESeminorm Q s2 p g := by + let r : ℝ := p.exponent.toReal + let delta : ℝ := s2.1 - s.1 + have hr : (2 : ℝ) ≤ r := by + dsimp [r] + exact ENNReal.toReal_mono p.lt_top.ne hp + have hdelta : 0 < delta := by + dsimp [delta] + linarith + have hdelta_le : delta ≤ 1 := by + dsimp [delta] + have hs2_lt : s2.1 < 1 := s2.2.2 + have hs_nonneg : 0 ≤ s.1 := le_of_lt s.2.1 + linarith + rcases eq_or_lt_of_le hr with htwo | htwo + · have hlocal : ∀ j : ℕ, + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + (1 : ℝ≥0∞) ^ p.exponent.toReal * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + intro j + simpa using descendantsAtScale_sharp_local_forcing_power_le_of_toReal_eq_two + Q n hn j s s2 hss2 p htwo.symm g hg + have hscalar := sharp_two_level_discount_tail_le_five_mul_inv + hdelta hdelta_le hr + have hA : (1 : ℝ≥0∞) * ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r)) ≤ + ENNReal.ofReal (5 * delta⁻¹) := by + rw [one_mul] + apply ENNReal.ofReal_le_ofReal + simpa [htwo.symm] using hscalar + simpa only [delta, r] using + localCoarseGrainingForcingLp_le_of_sharp_local Q n hn s1 s s2 hs1s hss2 + p hp g 1 hlocal hA + · have hp' : (2 : ℝ≥0∞) < p.exponent := by + apply (ENNReal.toReal_lt_toReal ENNReal.ofNat_ne_top p.lt_top.ne).mp + simpa [r] using htwo + let A : ℝ≥0∞ := ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount delta 1)⁻¹ + ((r - 2) / (2 * r))) + have hlocal : ∀ j : ℕ, + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) ^ + p.exponent.toReal) ≤ + A ^ p.exponent.toReal * + ENNReal.ofReal (Real.rpow 3 + (s2.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) + (fun R => cubeEuclideanPositiveBesovDisjointPowerEnergy R s2 p g) := by + intro j + simpa only [A, delta, r] using + descendantsAtScale_sharp_local_forcing_power_le_of_two_lt + Q n hn j s s2 hss2 p hp' g hg + have hscalar := sharp_two_level_discount_tail_le_five_mul_inv + hdelta hdelta_le hr + have hA : A * ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r)) ≤ + ENNReal.ofReal (5 * delta⁻¹) := by + change ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount delta 1)⁻¹ + ((r - 2) / (2 * r))) * ENNReal.ofReal + (Real.rpow (Book.Ch02.geometricDiscount delta r) (-1 / r)) ≤ _ + have hbase : 0 ≤ (Book.Ch02.geometricDiscount delta 1)⁻¹ := + inv_nonneg.mpr (Book.Ch02.book_geometricDiscount_pos + (mul_pos hdelta (by positivity))).le + have hx : 0 ≤ Real.rpow (Book.Ch02.geometricDiscount delta 1)⁻¹ + ((r - 2) / (2 * r)) := Real.rpow_nonneg hbase _ + rw [← ENNReal.ofReal_mul hx] + exact ENNReal.ofReal_le_ofReal hscalar + simpa only [delta, r] using + localCoarseGrainingForcingLp_le_of_sharp_local Q n hn s1 s s2 hs1s hss2 + p hp g A hlocal hA + + + + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingNegativeAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingNegativeAssembly.lean new file mode 100644 index 0000000000..109582e1f1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingNegativeAssembly.lean @@ -0,0 +1,289 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingAggregation + +/-! +# Exact negative-Besov assembly for local coarse graining + +This module flattens the nested normalized descendant average in the +source-facing local negative Besov carrier into its physical-scale series. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + +private theorem descendantsENNAverage_tsum_eq_tsum_descendantsENNAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℕ → ℝ≥0∞) : + descendantsENNAverage Q j (fun R => ∑' n : ℕ, F R n) = + ∑' n : ℕ, descendantsENNAverage Q j (fun R => F R n) := by + classical + unfold descendantsENNAverage + rw [show (∑ R ∈ descendantsAtDepth Q j, (fun R => ∑' n : ℕ, F R n) R) = + ∑' n : ℕ, ∑ R ∈ descendantsAtDepth Q j, F R n by + exact (Summable.tsum_finsetSum (fun R _ => ENNReal.summable)).symm] + rw [← ENNReal.tsum_mul_left] + +private theorem physicalScaleDepth_add {d : ℕ} (Q : TriadicCube d) + (n : ℤ) (hn : n ≤ Q.scale) (j : ℕ) : + Int.toNat (Q.scale - (n - (j : ℤ))) = Int.toNat (Q.scale - n) + j := by + have h0 : 0 ≤ Q.scale - n := by omega + have hj : 0 ≤ (j : ℤ) := by positivity + rw [show Q.scale - (n - (j : ℤ)) = (Q.scale - n) + j by ring, + Int.toNat_add h0 hj] + simp + +private theorem descendantsAtScaleENNAverage_tsum_eq_tsum_descendantsAtScaleENNAverage + {d : ℕ} (Q : TriadicCube d) (k : ℤ) + (F : TriadicCube d → ℕ → ℝ≥0∞) : + descendantsAtScaleENNAverage Q k (fun R => ∑' j : ℕ, F R j) = + ∑' j : ℕ, descendantsAtScaleENNAverage Q k (fun R => F R j) := by + classical + unfold descendantsAtScaleENNAverage + rw [show (∑ R ∈ descendantsAtScale Q k, (fun R => ∑' j : ℕ, F R j) R) = + ∑' j : ℕ, ∑ R ∈ descendantsAtScale Q k, F R j by + exact (Summable.tsum_finsetSum (fun R _ => ENNReal.summable)).symm] + rw [← ENNReal.tsum_mul_left] + +private theorem descendantsAtScaleENNAverage_mul_left {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (c : ℝ≥0∞) (F : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q k (fun R => c * F R) = + c * descendantsAtScaleENNAverage Q k F := by + unfold descendantsAtScaleENNAverage + rw [← Finset.mul_sum] + ring + +private theorem descendantsAtScaleENNAverage_nested_eq {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) (j : ℕ) + (F : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q n (fun R => + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) = + descendantsAtScaleENNAverage Q (n - (j : ℤ)) F := by + rw [descendantsAtScaleENNAverage_eq_descendantsENNAverage Q n hn] + have hinner : (fun R : TriadicCube d => + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) = + (fun R => descendantsENNAverage R j F) := by + funext R + rw [descendantsAtScaleENNAverage_eq_descendantsENNAverage R + (R.scale - (j : ℤ)) (by omega)] + simp + rw [hinner] + rw [← descendantsENNAverage_add_eq_descendantsENNAverage_descendantsENNAverage] + rw [← physicalScaleDepth_add Q n hn j] + exact (descendantsAtScaleENNAverage_eq_descendantsENNAverage Q + (n - (j : ℤ)) (by omega) F).symm + +private theorem localFluxDefectNegativeBesovESeminorm_rpow_eq_tsum + {d : ℕ} {Q R : TriadicCube d} + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) (sigma0 : ℝ) + (hRQ : openCubeSet R ⊆ openCubeSet Q) + (u : H1Function (openCubeSet Q)) (s : FractionalOrder) + (p : FiniteLpExponent) : + (cubeEuclideanNegativeBesovESeminorm R s p + (localFluxDefectL2Field a hRQ sigma0 u)) ^ p.exponent.toReal = + ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) (fun S => + (ENNReal.ofReal ‖cubeAverageVec S + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ p.exponent.toReal) := by + rw [cubeEuclideanNegativeBesovESeminorm_rpow_eq_tsum_depthEnergy] + apply tsum_congr + intro j + unfold cubeEuclideanNegativeBesovDepthEnergy descendantsAtScaleENNAverage + simp only [localFluxDefectL2Field, mul_assoc] + have hsum := Finset.sum_attach (descendantsAtScale R (R.scale - (j : ℤ))) + (fun S => + (ENNReal.ofReal ‖cubeAverageVec S + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ p.exponent.toReal) + rw [hsum] + +private theorem descendantsAtScaleENNAverage_negativeDepth_tsum_eq + {d : ℕ} (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (s : FractionalOrder) (p : FiniteLpExponent) + (F : TriadicCube d → ℝ≥0∞) : + descendantsAtScaleENNAverage Q n (fun R => ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) = + ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) F := by + rw [descendantsAtScaleENNAverage_tsum_eq_tsum_descendantsAtScaleENNAverage] + apply tsum_congr + intro j + have hweight : ∀ R ∈ descendantsAtScale Q n, + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((R.scale - (j : ℤ) : ℤ) : ℝ))) = + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) := by + intro R hR + rw [descendant_scale_eq_of_mem_descendantsAtScale hR] + let c : ℝ≥0∞ := ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) + calc + descendantsAtScaleENNAverage Q n (fun R => + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) = + descendantsAtScaleENNAverage Q n (fun R => + c * descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) := by + unfold descendantsAtScaleENNAverage + congr 1 + apply Finset.sum_congr rfl + intro R hR + exact congrArg (fun z : ℝ≥0∞ => + z * descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) + (hweight R hR) + _ = c * descendantsAtScaleENNAverage Q n (fun R => + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) := + descendantsAtScaleENNAverage_mul_left Q n c _ + _ = ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) F := by + rw [descendantsAtScaleENNAverage_nested_eq Q n hn j F] + +/-- Raising the local finite-`p` flux-defect negative Besov average exposes +the exact physical-scale depth series. -/ +theorem localFluxDefectNegativeBesovLpAverage_rpow_eq_tsum_descendantsAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)) + (sigma0 : ℝ) (u : H1Function (openCubeSet Q)) + (s : FractionalOrder) (p : FiniteLpExponent) : + (localFluxDefectNegativeBesovLpAverage Q n hn a sigma0 u s p) ^ + p.exponent.toReal = + ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (j : ℝ)))) * + descendantsAtScaleENNAverage Q (n - (j : ℤ)) (fun R => + (ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ p.exponent.toReal) := by + classical + let alpha : ℝ := p.exponent.toReal + let F : TriadicCube d → ℝ≥0∞ := fun R => + (ENNReal.ofReal ‖cubeAverageVec R + (fun x => matVecMul (a.toCoeffField x - scalarMatrix (d := d) sigma0) + (u.grad x))‖) ^ alpha + have halpha : 0 < alpha := finiteLpExponent_toReal_pos p + have hbase : 0 ≤ Real.rpow 3 (-s.1 * (n : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + unfold localFluxDefectNegativeBesovLpAverage + rw [ENNReal.mul_rpow_of_nonneg _ _ halpha.le] + have halpha_inv : 1 / p.exponent.toReal = alpha⁻¹ := by simp [alpha] + rw [halpha_inv] + rw [ENNReal.rpow_inv_rpow halpha.ne'] + rw [ENNReal.ofReal_rpow_of_nonneg hbase halpha.le] + have hbase_pow : Real.rpow 3 (-s.1 * (n : ℝ)) ^ alpha = + Real.rpow 3 ((-s.1 * (n : ℝ)) * alpha) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + rw [hbase_pow] + have hinner : + ((descendantsAtScale Q n).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q n).attach.sum (fun R => + (cubeEuclideanNegativeBesovESeminorm R.1 s p + (localFluxDefectL2Field a + (openCubeSet_subset_of_mem_descendantsAtScale hn R.2) + sigma0 u)) ^ alpha) = + descendantsAtScaleENNAverage Q n (fun R => ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * alpha * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F) := by + unfold descendantsAtScaleENNAverage + let D : Finset (TriadicCube d) := descendantsAtScale Q n + have hterm (R : TriadicCube d) (hR : R ∈ D) : + (cubeEuclideanNegativeBesovESeminorm R s p + (localFluxDefectL2Field a + (openCubeSet_subset_of_mem_descendantsAtScale hn hR) + sigma0 u)) ^ alpha = + ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * alpha * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F := by + simpa only [F, alpha] using + (localFluxDefectNegativeBesovESeminorm_rpow_eq_tsum a sigma0 + (openCubeSet_subset_of_mem_descendantsAtScale hn hR) u s p) + have hsum : + (∑ R ∈ D.attach, + (cubeEuclideanNegativeBesovESeminorm R.1 s p + (localFluxDefectL2Field a + (openCubeSet_subset_of_mem_descendantsAtScale hn R.2) + sigma0 u)) ^ alpha) = + ∑ R ∈ D, ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * alpha * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F := by + let f : TriadicCube d → ℝ≥0∞ := fun R => ∑' j : ℕ, + ENNReal.ofReal (Real.rpow 3 + (s.1 * alpha * ((R.scale - (j : ℤ) : ℤ) : ℝ))) * + descendantsAtScaleENNAverage R (R.scale - (j : ℤ)) F + calc + (∑ R ∈ D.attach, + (cubeEuclideanNegativeBesovESeminorm R.1 s p + (localFluxDefectL2Field a + (openCubeSet_subset_of_mem_descendantsAtScale hn R.2) + sigma0 u)) ^ alpha) = + ∑ R ∈ D.attach, f R.1 := by + apply Finset.sum_congr rfl + intro R hR + simpa only [f] using hterm R.1 R.2 + _ = ∑ R ∈ D, f R := Finset.sum_attach D f + _ = _ := by rfl + simpa only [D] using! congrArg + (fun z : ℝ≥0∞ => ((descendantsAtScale Q n).card : ℝ≥0∞)⁻¹ * z) hsum + rw [hinner, descendantsAtScaleENNAverage_negativeDepth_tsum_eq Q n hn s p F] + rw [← ENNReal.tsum_mul_left] + apply tsum_congr + intro j + rw [← mul_assoc] + congr 1 + calc + ENNReal.ofReal (Real.rpow 3 (-s.1 * (n : ℝ) * alpha)) * + ENNReal.ofReal (Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) = + ENNReal.ofReal (Real.rpow 3 (-s.1 * (n : ℝ) * alpha) * + Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ))) := + (ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _)).symm + _ = ENNReal.ofReal (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (j : ℝ)))) := by + congr 1 + calc + Real.rpow 3 (-s.1 * (n : ℝ) * alpha) * + Real.rpow 3 + (s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ)) = + Real.rpow 3 (-s.1 * (n : ℝ) * alpha + + s.1 * p.exponent.toReal * ((n - (j : ℤ) : ℤ) : ℝ)) := + (Real.rpow_add (by norm_num : (0 : ℝ) < 3) _ _).symm + _ = Real.rpow 3 (-(s.1 * p.exponent.toReal * (j : ℝ))) := by + congr 1 + dsimp [alpha] + push_cast + ring + +end +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingOneCube.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingOneCube.lean new file mode 100644 index 0000000000..ea55b62cf9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingOneCube.lean @@ -0,0 +1,1366 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingPDE +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.FinitePToLegacyQTwo +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! +# One-cube local coarse-graining bridge + +This file packages the source weak equation in the half-open cube carrier +required by the legacy corrected weak-flux apex. Its source-facing theorem +will consume the strict finite-`p` regularity bridge, while the response-series +summability remains internal to the canonical root coefficient family. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The depth-zero `q = 2` partial negative seminorm contains the square root +of the squared norm of the cube average. -/ +private theorem sqrt_vecNormSq_cubeAverageVec_le_negativePartial_zero + {d : ℕ} (R : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + Real.sqrt (vecNormSq (cubeAverageVec R F)) ≤ + cubeBesovNegativeVectorPartialSeminormTwo R s 0 F := by + have hsq : + (Real.sqrt (vecNormSq (cubeAverageVec R F))) ^ 2 ≤ + (cubeBesovNegativeVectorPartialSeminormTwo R s 0 F) ^ 2 := by + rw [Real.sq_sqrt (vecNormSq_nonneg _)] + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + simp [sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] + exact le_of_sq_le_sq hsq + (cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s 0 F) + +/-- The norm of a cube average is bounded by the full finite `q = 2` +negative Besov seminorm whenever the field is locally `L²`. -/ +theorem ENNReal_ofReal_norm_cubeAverageVec_le_cubeBesovNegativeVectorSeminormTwo + {d : ℕ} (R : TriadicCube d) {s : ℝ} (hs : 0 < s) + (F : Vec d → Vec d) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + ENNReal.ofReal ‖cubeAverageVec R F‖ ≤ + ENNReal.ofReal (cubeBesovNegativeVectorSeminormTwo R s F) := by + apply ENNReal.ofReal_le_ofReal + calc + ‖cubeAverageVec R F‖ ≤ Real.sqrt (vecNormSq (cubeAverageVec R F)) := + norm_le_sqrt_vecNormSq _ + _ ≤ cubeBesovNegativeVectorPartialSeminormTwo R s 0 F := + sqrt_vecNormSq_cubeAverageVec_le_negativePartial_zero R s F + _ ≤ cubeBesovNegativeVectorSeminormTwo R s F := + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove R s F + (cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs F hF) 0 + +/-- Replacing a coefficient representative almost everywhere on a cube leaves +the average flux defect unchanged. -/ +theorem cubeAverageVec_fluxDefect_eq_of_ae_eq_on_cubeSet + {d : ℕ} (R : TriadicCube d) (a b : CoeffField d) (a0 : Mat d) + (gradU : Vec d → Vec d) + (hab : a =ᵐ[MeasureTheory.volume.restrict (cubeSet R)] b) : + cubeAverageVec R (fluxDefect a a0 gradU) = + cubeAverageVec R (fluxDefect b a0 gradU) := by + apply cubeAverageVec_eq_of_ae_eq_on_cubeSet + filter_upwards [hab] with x hx + simp only [fluxDefect, hx] + +/-- The scalar background has at most the explicit dimension loss needed to +compare the legacy Frobenius norm with the Chapter 2 operator normalization. -/ +private theorem matNorm_scalarMatrix_le_dim_mul + {d : ℕ} [NeZero d] {sigma : ℝ} (hsigma : 0 ≤ sigma) : + matNorm (scalarMatrix (d := d) sigma) ≤ (d : ℝ) * sigma := by + have hmatrixNorm : + Book.Ch02.matrixNorm (scalarMatrix (d := d) sigma) = sigma := by + simp [Book.Ch02.matrixNorm, scalarMatrix, hsigma] + calc + matNorm (scalarMatrix (d := d) sigma) ≤ + (d : ℝ) * Book.Ch02.matrixNorm (scalarMatrix (d := d) sigma) := + Book.Ch02.matNorm_le_dim_mul_matrixNorm _ + _ = (d : ℝ) * sigma := by rw [hmatrixNorm] + +/-- Square-root version of `matNorm_scalarMatrix_le_dim_mul`, stated with a +deliberately coarse dimension factor that is uniform for every `d ≥ 1`. -/ +private theorem sqrt_matNorm_scalarMatrix_le_dim_mul_sqrt + {d : ℕ} [NeZero d] {sigma : ℝ} (hsigma : 0 ≤ sigma) : + Real.sqrt (matNorm (scalarMatrix (d := d) sigma)) ≤ + (d : ℝ) * Real.sqrt sigma := by + have hd : 1 ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hnorm := matNorm_scalarMatrix_le_dim_mul (d := d) hsigma + apply (sq_le_sq₀ (Real.sqrt_nonneg _) + (mul_nonneg (le_trans zero_le_one hd) (Real.sqrt_nonneg _))).mp + rw [Real.sq_sqrt (matNorm_nonneg _), mul_pow, Real.sq_sqrt hsigma] + nlinarith [mul_nonneg (sub_nonneg.mpr hd) hsigma] + +/-- Chapter 2's finite-`q = 2` ellipticity control in the exact form consumed +by the two forcing components of the one-cube flux RHS. -/ +private theorem qtwo_weighted_ellipticity_envelope + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : Book.Ch02.TriadicCoeffFamily d) + {t sigma : ℝ} (ht : 0 < t) (hsigma : 0 < sigma) : + sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a + + sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹ ≤ + 4 * (Fintype.card (Fin d) : ℝ) * + ((Book.Ch02.HomogenizationErrorOnCube R t .infinity (.finite 2) a + (scalarMatrix (d := d) sigma)) ^ 2 + 1) := by + exact Book.Ch02.weightedEllipticity_finite_two_le_card_mul_homogenizationError_sq_add_one + R a ht hsigma + +/-- The product of the normalized upper and lower finite-`q = 2` ellipticity +factors is bounded by the source-normalized local `q = 2` error envelope. -/ +private theorem qtwo_sqrt_weighted_product_le_envelope + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : Book.Ch02.TriadicCoeffFamily d) + {t sigma : ℝ} (ht : 0 < t) (hsigma : 0 < sigma) : + Real.sqrt (sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a) * + Real.sqrt (sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹) ≤ + 4 * (Fintype.card (Fin d) : ℝ) * + ((Book.Ch02.HomogenizationErrorOnCube R t .infinity (.finite 2) a + (scalarMatrix (d := d) sigma)) ^ 2 + 1) := by + have hsum := qtwo_weighted_ellipticity_envelope R a ht hsigma + have hupper : 0 ≤ sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a := + mul_nonneg (inv_nonneg.mpr hsigma.le) + (Book.Ch02.LambdaSq_nonneg R a ht (by norm_num)) + have hlower : 0 ≤ sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹ := + mul_nonneg hsigma.le + (inv_nonneg.mpr (Book.Ch02.lambdaSq_nonneg R a ht (by norm_num))) + have hsq : + (Real.sqrt (sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a) - + Real.sqrt (sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹)) ^ 2 ≥ 0 := + sq_nonneg _ + have hupper_sq : + Real.sqrt (sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a) ^ 2 = + sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a := + Real.sq_sqrt hupper + have hlower_sq : + Real.sqrt (sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹) ^ 2 = + sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹ := + Real.sq_sqrt hlower + have hupper_sqrt : + 0 ≤ Real.sqrt (sigma⁻¹ * Book.Ch02.LambdaSq R t (.finite 2) a) := + Real.sqrt_nonneg _ + have hlower_sqrt : + 0 ≤ Real.sqrt (sigma * (Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹) := + Real.sqrt_nonneg _ + nlinarith + +/-- The `q=1` response error at order `s` is bounded by the `q=2` response +error at order `s/2`. Both errors use the same geometric probability weights +after this order/exponent change, so this is weighted Cauchy--Schwarz. -/ +private theorem homogenizationErrorOnCube_infinity_one_le_infinity_two_half + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : Book.Ch02.TriadicCoeffFamily d) + (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + Book.Ch02.HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + Book.Ch02.HomogenizationErrorOnCube R (s / 2) .infinity (.finite 2) a a0 := by + let w : ℕ → ℝ := fun n => Book.Ch02.geometricWeight s 1 n + let M : ℕ → ℝ := fun n => + Book.Ch02.maxDescendantNormalizedBlockResponseAtScale R (R.scale - (n : ℤ)) a a0 + have hw_nonneg : ∀ n, 0 ≤ w n := by + intro n + dsimp [w] + simpa [Book.Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := (1 : ℝ)) n + (by nlinarith : 0 ≤ s * 1)) + have hM_nonneg : ∀ n, 0 ≤ M n := by + intro n + dsimp [M] + exact Book.Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + have hw_eq : ∀ n, w n = Book.Ch02.geometricWeight (s / 2) 2 n := by + intro n + dsimp [w] + unfold Book.Ch02.geometricWeight Book.Ch02.geometricDiscount + congr 1 <;> ring_nf + have hsumw : Summable w := by + simpa only [w, Book.Ch02.geometricWeight_eq_old] using + (Homogenization.summable_geometricWeight (s := s) (q := (1 : ℝ)) + (by nlinarith : 0 < s * 1)) + have hsumWM : Summable (fun n => w n * M n) := by + simpa only [M, hw_eq] using + (Book.Ch02.summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + R a a0 (by positivity : 0 < s / 2)) + let f : ℕ → ℝ := fun n => Real.sqrt (w n) + let g : ℕ → ℝ := fun n => Real.sqrt (w n * M n) + have hf_nonneg : ∀ n, 0 ≤ f n := fun n => Real.sqrt_nonneg _ + have hg_nonneg : ∀ n, 0 ≤ g n := fun n => Real.sqrt_nonneg _ + have hf_sq : ∀ n, f n ^ (2 : ℝ) = w n := by + intro n + dsimp [f] + rw [Real.rpow_two, Real.sq_sqrt (hw_nonneg n)] + have hg_sq : ∀ n, g n ^ (2 : ℝ) = w n * M n := by + intro n + dsimp [g] + rw [Real.rpow_two, Real.sq_sqrt (mul_nonneg (hw_nonneg n) (hM_nonneg n))] + have hfg : ∀ n, f n * g n = w n * Real.sqrt (M n) := by + intro n + dsimp [f, g] + rw [Real.sqrt_mul (hw_nonneg n)] + calc + Real.sqrt (w n) * (Real.sqrt (w n) * Real.sqrt (M n)) = + (Real.sqrt (w n)) ^ 2 * Real.sqrt (M n) := by ring + _ = w n * Real.sqrt (M n) := by rw [Real.sq_sqrt (hw_nonneg n)] + have hfsum : Summable fun n => f n ^ (2 : ℝ) := by + convert hsumw using 1 + ext n + exact hf_sq n + have hgsum : Summable fun n => g n ^ (2 : ℝ) := by + convert hsumWM using 1 + ext n + exact hg_sq n + have hholder : Real.HolderConjugate (2 : ℝ) (2 : ℝ) := by + refine ⟨by norm_num, by norm_num, by norm_num⟩ + have hcs := Real.inner_le_Lp_mul_Lq_tsum_of_nonneg hholder hf_nonneg hg_nonneg hfsum hgsum + have hweights : ∑' n, w n = 1 := by + simpa only [w, Book.Ch02.geometricWeight_eq_old] using + (Homogenization.tsum_geometricWeight_eq_one (s := s) (q := (1 : ℝ)) + (by nlinarith : 0 < s * 1)) + have hleft : ∑' n, f n * g n = + Book.Ch02.HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 := by + rw [Book.Ch02.homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_congr + intro n + rw [hfg] + dsimp [w, M] + rw [Real.sqrt_eq_rpow] + have hright : (∑' n, g n ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = + Book.Ch02.HomogenizationErrorOnCube R (s / 2) .infinity (.finite 2) a a0 := by + unfold Book.Ch02.HomogenizationErrorOnCube Book.Ch02.HomogenizationError + Book.Ch02.HomogenizationErrorFinite + change (∑' n, g n ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = + (∑' n, Book.Ch02.geometricWeight (s / 2) 2 n * + (Book.Ch02.scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) ^ (2 : ℝ)) ^ + (1 / (2 : ℝ)) + congr 1 + apply tsum_congr + intro n + rw [hg_sq, hw_eq] + have hk : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hresponse : M n = + (Book.Ch02.scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) ^ (2 : ℝ) := by + dsimp [M] + calc + Book.Ch02.maxDescendantNormalizedBlockResponseAtScale R (R.scale - (n : ℤ)) a a0 = + (Book.Ch02.scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) ^ 2 := + (Book.Ch02.scaleResponseAtScale_infinity_sq_eq R hk a a0).symm + _ = (Book.Ch02.scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) ^ (2 : ℝ) := + (Real.rpow_two _).symm + exact congrArg (fun x : ℝ => Book.Ch02.geometricWeight (s / 2) 2 n * x) + hresponse + rw [← hleft] + calc + ∑' n, f n * g n ≤ + (∑' n, f n ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) * + (∑' n, g n ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := hcs + _ = Book.Ch02.HomogenizationErrorOnCube R (s / 2) .infinity (.finite 2) a a0 := by + have hfs : ∑' n, f n ^ (2 : ℝ) = 1 := by + calc + ∑' n, f n ^ (2 : ℝ) = ∑' n, w n := by + apply tsum_congr + exact hf_sq + _ = 1 := hweights + rw [hfs, Real.one_rpow, one_mul, hright] + +/-- For `0 < s ≤ 1`, the common `s^{-9/2}` forcing scale dominates both +legacy forcing exponents. -/ +private theorem rpow_neg_five_halves_le_rpow_neg_nine_halves + {s : ℝ} (hs : 0 < s) (hs_one : s ≤ 1) : + Real.rpow s (-(5 / 2 : ℝ)) ≤ Real.rpow s (-(9 / 2 : ℝ)) := by + exact Real.rpow_le_rpow_of_exponent_ge hs hs_one (by norm_num) + +private theorem rpow_neg_three_le_rpow_neg_nine_halves + {s : ℝ} (hs : 0 < s) (hs_one : s ≤ 1) : + Real.rpow s (-3 : ℝ) ≤ Real.rpow s (-(9 / 2 : ℝ)) := by + exact Real.rpow_le_rpow_of_exponent_ge hs hs_one (by norm_num) + +/-- The concrete positive `q = 2` seminorm is insensitive to the sign of a +locally square-integrable vector field. This is recorded here because the +source weak equation uses `-g`, whereas the source statement displays `g`. -/ +private theorem cubeBesovPositiveVectorSeminormTwo_neg_of_memLp + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp g 2 (normalizedCubeMeasure Q)) : + cubeBesovPositiveVectorSeminormTwo Q s (fun x => -g x) = + cubeBesovPositiveVectorSeminormTwo Q s g := by + unfold cubeBesovPositiveVectorSeminormTwo + have hpartial : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => -g x) = + cubeBesovPositiveVectorPartialSeminormTwo Q s N g := by + intro N + unfold cubeBesovPositiveVectorPartialSeminormTwo + refine congrArg Real.sqrt ?_ + apply Finset.sum_congr rfl + intro j _ + unfold cubeBesovPositiveVectorDepthSeminorm + apply congrArg (fun x : ℝ => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * Real.sqrt x) ^ 2) + unfold cubeBesovPositiveVectorDepthAverage + dsimp only [descendantsAverage] + congr 1 + apply Finset.sum_congr rfl + intro R hR + have hRmem : MeasureTheory.MemLp g 2 (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hzero : MeasureTheory.MemLp (0 : Vec d → Vec d) 2 + (normalizedCubeMeasure R) := by simp + have havg : cubeAverageVec R (fun x => -g x) = -cubeAverageVec R g := by + have hzeroavg : cubeAverageVec R (0 : Vec d → Vec d) = 0 := by + funext i + simp [cubeAverageVec, cubeAverage] + simpa [hzeroavg] using + (cubeAverageVec_sub_memLp R (0 : Vec d → Vec d) g hzero hRmem) + have hfluct : cubeFluctuationVec R (fun x => -g x) = + fun x => -(cubeFluctuationVec R g x) := by + funext x + rw [cubeFluctuationVec_apply, cubeFluctuationVec_apply, havg] + abel + rw [hfluct] + unfold cubeLpNorm + change (MeasureTheory.eLpNorm (-(cubeFluctuationVec R g)) 2 + (normalizedCubeMeasure R)).toReal ^ 2 = _ + rw [MeasureTheory.eLpNorm_neg] + simp_rw [hpartial] + +/-- The deterministic apex constant is uniform over the manuscript range +`0 < s ≤ 1`; we record the endpoint form used by the source envelope. -/ +private theorem zeroTraceDirichletCorrectedWeakFluxApexConstant_le_one + {d : ℕ} (s : ℝ) (_hs : 0 < s) (hs_one : s ≤ 1) : + _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s ≤ + _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 := by + have hdisplay : + _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s ≤ + _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d 1 := by + unfold _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + have hpow : + (3 : ℝ) ^ ((d : ℝ) + s) ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + have hinner : + (3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2 ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + unfold _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant + nlinarith + +/-- Exact `ENNReal` expansion of the legacy one-cube RHS once its four real +components have been certified nonnegative. The components respectively +contain the local energy, the `q=1` response error, and the two finite-`q=2` +forcing/ellipticity terms. -/ +private theorem ENNReal_ofReal_coarseFluxResponseRHSBound_eq_components + {d : ℕ} (R : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (henergy : 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse : 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak : 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare : 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) : + ENNReal.ofReal (coarseFluxResponseRHSBound R a a0 s gradU g) = + ENNReal.ofReal (coarseFluxResponseRHSEnergyBound R a a0 s gradU) + + ENNReal.ofReal (coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + + ENNReal.ofReal (coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + + ENNReal.ofReal (coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) := by + rw [coarseFluxResponseRHSBound_eq_component_sum] + conv_lhs => + rw [show + coarseFluxResponseRHSEnergyBound R a a0 s gradU + + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g = + (coarseFluxResponseRHSEnergyBound R a a0 s gradU + + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + + (coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) by ring] + rw [ENNReal.ofReal_add (add_nonneg henergy hresponse) (add_nonneg hweak hpoincare), + ENNReal.ofReal_add henergy hresponse, ENNReal.ofReal_add hweak hpoincare] + ring + +/-- Expand the nonnegative one-cube response RHS in `ℝ≥0∞`. This makes its +local energy term, `q = 1` response-error term, and the two finite-`q = 2` +forcing/ellipticity terms separately available to a later positive-norm +aggregation argument. -/ +theorem ENNReal_ofReal_coarseFluxResponseRHSBound_eq_components_of_bddAbove + {d : ℕ} (R : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + ENNReal.ofReal (coarseFluxResponseRHSBound R a a0 s gradU g) = + ENNReal.ofReal (coarseFluxResponseRHSEnergyBound R a a0 s gradU) + + ENNReal.ofReal (coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + + ENNReal.ofReal (coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + + ENNReal.ofReal (coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) := by + exact ENNReal_ofReal_coarseFluxResponseRHSBound_eq_components R a a0 s gradU g + (coarseFluxResponseRHSEnergyBound_nonneg R a a0 gradU hs) + (coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove R a a0 g hs hgBdd) + (coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove R a g hs hgBdd) + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove R a a0 g hs hgBdd) + +/-- Transport the source-sign convention and the open-cube weak equation to +the half-open cube used by the legacy response theorem. -/ +private theorem isH1DirichletRhsWeakSolutionOn_cubeSet_neg_of_isForcedEquation + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (h : IsForcedEquation R a u g) : + IsH1DirichletRhsWeakSolutionOn a.toCoeffField (cubeSet R) u.toCubeSet + (fun x => -g x) := by + exact isH1DirichletRhsWeakSolutionOn_cubeSet_of_openCubeSet + (Q := R) (a := a.toCoeffField) (u := u) (g := fun x => -g x) + h.toIsH1DirichletRhsWeakSolutionOnNeg + +/-- A weak solution is unchanged when its coefficient field is replaced by an +almost-everywhere equal representative on the integration cube. -/ +private theorem isH1DirichletRhsWeakSolutionOn_congr_coeff_ae + {d : ℕ} {U : Set (Vec d)} {a b : CoeffField d} + {u : H1Function U} {g : Vec d → Vec d} + (h : IsH1DirichletRhsWeakSolutionOn a U u g) + (hab : a =ᵐ[MeasureTheory.volume.restrict U] b) : + IsH1DirichletRhsWeakSolutionOn b U u g := by + intro phi + calc + ∫ x in U, vecDot (matVecMul (b x) (u.grad x)) + (phi.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (matVecMul (a x) (u.grad x)) + (phi.toH1Function.grad x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hab] with x hx + simp only [hx] + _ = ∫ x in U, vecDot (g x) (phi.toH1Function.grad x) ∂MeasureTheory.volume := + h phi + +/-- The public pointwise field built from the canonical root family agrees +with the original source coefficient on its cube. -/ +private theorem publicCoeffField_rootPointwise_ae_eq_source_cubeSet + {d : ℕ} [NeZero d] (R : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) : + publicCoeffField R (rootPointwiseCoeffFamily R a) =ᵐ[ + MeasureTheory.volume.restrict (cubeSet R)] a.toCoeffField := by + have hpublic := publicCoeffField_ae_eq_cubeSet R (rootPointwiseCoeffFamily R a) + have hroot := rootPointwiseCoeffFamily_root_aeeq R a + have hroot' : (rootPointwiseCoeffFamily R a).coeffOn R |>.toCoeffField =ᵐ[ + MeasureTheory.volume.restrict (cubeSet R)] a.toCoeffField := by + simpa only [Book.Ch02.CoeffOn.AEEq, Book.Ch02.cubeDomain_coe, + volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using hroot + exact hpublic.trans hroot' + +/-- The source local energy has the same `ℝ≥0∞` square-root representative as +the public pointwise coefficient used internally by the response machinery. -/ +private theorem ENNReal_ofReal_sqrt_cubeAverage_public_energy_eq_localSymmetricEnergy + {d : ℕ} [NeZero d] (R : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + ENNReal.ofReal + (Real.sqrt (cubeAverage R + (coefficientEnergyDensity + (publicCoeffField R (rootPointwiseCoeffFamily R a)) u.toCubeSet.grad))) = + localSymmetricEnergyENorm R a u := by + have hAeq := publicCoeffField_rootPointwise_ae_eq_source_cubeSet R a + have havg : + cubeAverage R + (coefficientEnergyDensity + (publicCoeffField R (rootPointwiseCoeffFamily R a)) u.toCubeSet.grad) = + cubeAverage R (coefficientEnergyDensity a.toCoeffField u.grad) := by + apply cubeAverage_eq_of_ae_eq_on_cubeSet + filter_upwards [hAeq] with x hx + simp only [coefficientEnergyDensity, H1Function.grad_toCubeSet] + rw [hx] + have havg_nonneg : + 0 ≤ cubeAverage R (coefficientEnergyDensity a.toCoeffField u.grad) := by + rw [← havg] + exact cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn R + _ u.toCubeSet.grad + (publicCoeffField_isEllipticFieldOn_cubeSet R (rootPointwiseCoeffFamily R a)) + rw [havg, localSymmetricEnergyENorm_eq_ofReal_cubeAverage_coefficientEnergyDensity] + rw [Real.sqrt_eq_rpow] + rw [← ENNReal.ofReal_rpow_of_nonneg] + · exact havg_nonneg + · norm_num + +/-- The finite-`q=2` lower ellipticity factor is its elementary square-root +form. Keeping this local avoids exporting a Chapter 5 assembly lemma merely +for one-cube scalar algebra. -/ +private theorem poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv_local + {d : ℕ} [NeZero d] (R : TriadicCube d) + (a : Book.Ch02.TriadicCoeffFamily d) {t : ℝ} : + poincareLowerEllipticityFactor R a t (.finite 2) = + Real.sqrt ((Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹) := by + have hleft : + Real.sqrt ((Book.Ch02.lambdaSq R t (.finite 2) a)⁻¹) = + Real.rpow (Book.Ch02.lambdaSq R t (.finite 2) a) (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + have hExp : (-1 / 2 : ℝ) = (-(1 / 2 : ℝ)) := by ring + simpa [poincareLowerEllipticityFactor, hExp] using hleft.symm + +private theorem poincareUpperEllipticityFactor_finite_two_eq_sqrt_local + {d : ℕ} [NeZero d] (R : TriadicCube d) + (a : Book.Ch02.TriadicCoeffFamily d) {t : ℝ} : + poincareUpperEllipticityFactor R a t (.finite 2) = + Real.sqrt (Book.Ch02.LambdaSq R t (.finite 2) a) := by + simp [poincareUpperEllipticityFactor, Real.sqrt_eq_rpow] + +/-- The response-error/lower-ellipticity product is absorbed by the source +finite-`q=2` ellipticity envelope at order `s/2`. -/ +private theorem sqrt_sigma_mul_lower_mul_homogenizationError_le_qtwo_envelope + {d : ℕ} [NeZero d] (R : TriadicCube d) + (a : Book.Ch02.TriadicCoeffFamily d) (sigma : ℝ) + {s : ℝ} (hs : 0 < s) (_hs_one : s ≤ 1) (hsigma : 0 < sigma) : + Real.sqrt sigma * + poincareLowerEllipticityFactor R a (s / 2) (.finite 2) * + Book.Ch02.HomogenizationErrorOnCube R s .infinity (.finite 1) a + (scalarMatrix (d := d) sigma) ≤ + 4 * (Fintype.card (Fin d) : ℝ) * + ((Book.Ch02.HomogenizationErrorOnCube R (s / 2) .infinity (.finite 2) a + (scalarMatrix (d := d) sigma)) ^ 2 + 1) := by + let E : ℝ := Book.Ch02.HomogenizationErrorOnCube R (s / 2) .infinity (.finite 2) a + (scalarMatrix (d := d) sigma) + let L : ℝ := (Book.Ch02.lambdaSq R (s / 2) (.finite 2) a)⁻¹ + let X : ℝ := Real.sqrt (sigma * L) + have hE_nonneg : 0 ≤ E := by + dsimp [E, Book.Ch02.HomogenizationErrorOnCube, + Book.Ch02.HomogenizationError, Book.Ch02.HomogenizationErrorFinite] + exact Real.rpow_nonneg (tsum_nonneg fun n => + mul_nonneg + (by + simpa [Book.Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := s / 2) (q := (2 : ℝ)) n + (by positivity : 0 ≤ (s / 2) * (2 : ℝ))) + (Real.rpow_nonneg + (Book.Ch02.scaleResponseAtScale_infinity_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + (scalarMatrix (d := d) sigma)) _)) _ + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr (Book.Ch02.lambdaSq_finite_nonneg R a (by positivity) (by norm_num)) + have hX_nonneg : 0 ≤ X := Real.sqrt_nonneg _ + have hweighted := qtwo_weighted_ellipticity_envelope R a (t := s / 2) (by positivity) hsigma + have hXL_sq : X ^ 2 = sigma * L := by + dsimp [X] + rw [Real.sq_sqrt (mul_nonneg hsigma.le hL_nonneg)] + have hX_sq : X ^ 2 ≤ 4 * (Fintype.card (Fin d) : ℝ) * (E ^ 2 + 1) := by + rw [hXL_sq] + have hupper : 0 ≤ sigma⁻¹ * Book.Ch02.LambdaSq R (s / 2) (.finite 2) a := + mul_nonneg (inv_nonneg.mpr hsigma.le) + (Book.Ch02.LambdaSq_finite_nonneg R a (s := s / 2) (q := (2 : ℝ)) + (by positivity) (by norm_num : (1 : ℝ) ≤ 2)) + dsimp [E, L] + simpa only [Book.Ch02.LambdaSq_finite, Book.Ch02.lambdaSq_finite] using + (le_add_of_nonneg_left hupper).trans hweighted + have hcard : 1 ≤ (Fintype.card (Fin d) : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hXE : X * E ≤ 4 * (Fintype.card (Fin d) : ℝ) * (E ^ 2 + 1) := by + have hyoung := two_mul_le_add_sq X E + have hE_sq_le : E ^ 2 ≤ E ^ 2 + 1 := by linarith + nlinarith [hX_sq] + have herror := homogenizationErrorOnCube_infinity_one_le_infinity_two_half R a + (scalarMatrix (d := d) sigma) hs + have hroot : + Real.sqrt sigma * poincareLowerEllipticityFactor R a (s / 2) (.finite 2) = X := by + rw [poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv_local] + dsimp [X, L] + rw [Real.sqrt_mul hsigma.le] + rw [hroot] + exact (mul_le_mul_of_nonneg_left herror hX_nonneg).trans hXE + +/-- A single explicit dimension-only envelope for the four one-cube terms. +The deterministic apex constant is evaluated at the fixed endpoint `1`, so +this quantity is uniform in every local fractional order. -/ +noncomputable def localCoarseGrainingOneCubeConstant (d : ℕ) : ℝ := + 64 * (d : ℝ) ^ 3 * + (_root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + 1) + +private theorem localCoarseGrainingOneCubeConstant_nonneg (d : ℕ) : + 0 ≤ localCoarseGrainingOneCubeConstant d := by + unfold localCoarseGrainingOneCubeConstant + exact mul_nonneg (mul_nonneg (by norm_num) (pow_nonneg (Nat.cast_nonneg d) _)) + (add_nonneg + (_root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d 1) + zero_le_one) + +private theorem localCoarseGrainingOneCubeConstant_dominates_energy + {d : ℕ} [NeZero d] + (X : ℝ) (hX : 0 ≤ X) : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ)) * X ≤ + localCoarseGrainingOneCubeConstant d * (X + 0) := by + have hd : 1 ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hM := _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d 1 + have hd0 : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hd3 : (d : ℝ) ≤ (d : ℝ) ^ 3 := by + calc + (d : ℝ) = (d : ℝ) * 1 := by ring + _ ≤ (d : ℝ) * (d : ℝ) ^ 2 := + mul_le_mul_of_nonneg_left (one_le_pow₀ hd : 1 ≤ (d : ℝ) ^ 2) hd0 + _ = (d : ℝ) ^ 3 := by ring + have hcoef : 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ≤ localCoarseGrainingOneCubeConstant d := by + unfold localCoarseGrainingOneCubeConstant + have hd30 : 0 ≤ (d : ℝ) ^ 3 := pow_nonneg hd0 _ + calc + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ≤ + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ^ 3 := by + exact mul_le_mul_of_nonneg_left hd3 (mul_nonneg (by norm_num) hM) + _ ≤ 64 * (d : ℝ) ^ 3 * + (_root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + 1) := by + nlinarith + simpa using mul_le_mul_of_nonneg_right hcoef hX + +private theorem localCoarseGrainingOneCubeConstant_dominates_forcing + {d : ℕ} [NeZero d] + (X Y : ℝ) (hX : 0 ≤ X) (hY : 0 ≤ Y) : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ)) * X + + (24 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ^ 3) * Y ≤ + localCoarseGrainingOneCubeConstant d * (X + Y) := by + have hd : 1 ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hM := _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d 1 + have hd0 : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hd3 : (d : ℝ) ≤ (d : ℝ) ^ 3 := by + calc + (d : ℝ) = (d : ℝ) * 1 := by ring + _ ≤ (d : ℝ) * (d : ℝ) ^ 2 := + mul_le_mul_of_nonneg_left (one_le_pow₀ hd : 1 ≤ (d : ℝ) ^ 2) hd0 + _ = (d : ℝ) ^ 3 := by ring + have henergy : 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ≤ localCoarseGrainingOneCubeConstant d := by + unfold localCoarseGrainingOneCubeConstant + have hd30 : 0 ≤ (d : ℝ) ^ 3 := pow_nonneg hd0 _ + calc + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ≤ + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ^ 3 := by + exact mul_le_mul_of_nonneg_left hd3 (mul_nonneg (by norm_num) hM) + _ ≤ 64 * (d : ℝ) ^ 3 * + (_root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + 1) := by + nlinarith + have hforcing : 24 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ^ 3 ≤ + localCoarseGrainingOneCubeConstant d := by + unfold localCoarseGrainingOneCubeConstant + have hd30 : 0 ≤ (d : ℝ) ^ 3 := pow_nonneg hd0 _ + nlinarith + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ)) * X + + (24 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 * (d : ℝ) ^ 3) * Y ≤ + localCoarseGrainingOneCubeConstant d * X + + localCoarseGrainingOneCubeConstant d * Y := + add_le_add (mul_le_mul_of_nonneg_right henergy hX) + (mul_le_mul_of_nonneg_right hforcing hY) + _ = localCoarseGrainingOneCubeConstant d * (X + Y) := by ring + +/-- Apply the legacy corrected weak-flux apex once its entirely internal +half-open-cube carriers have been constructed. This helper deliberately +keeps those carriers private: no source-facing hypothesis is introduced while +the `CoeffOn` response-summability bridge is unavailable. -/ +private theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_legacyApex_of_legacyCarriers + {d : ℕ} [NeZero d] {R : TriadicCube d} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (aLegacy : CoeffField d) (a0 : Mat d) (s : ℝ) + {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) aLegacy) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn aLegacy (cubeSet R) u.toCubeSet + (fun x => -g x)) + (hregularity : CubeVectorBesovHRegularity R s (fun x => -g x)) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity aLegacy a0)) : + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect aLegacy a0 u.toCubeSet.grad) ≤ + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound R aLegacy a0 s u.toCubeSet.grad (fun x => -g x) := + _root_.Homogenization.ZeroTraceDirichletCorrectorData.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy + (Q := R) (a := aLegacy) (a0 := a0) (s := s) (g := fun x => -g x) + (v := u.toCubeSet) hs hs_le hEll ha0 ha0symm hweak hregularity hresponseSum + +/-- Source-to-legacy carrier assembly for one cube. The only remaining +input is the local positive-Besov regularity of the source; Packet F supplies +that bridge from the frozen finite-`p` source hypothesis. -/ +private theorem cubeBesovNegativeVectorSeminormTwo_source_fluxDefect_le_legacyApex + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (sigma0 s : ℝ) (hsigma0 : 0 < sigma0) (hs : 0 < s) (hs_le : s ≤ 1) + (h : IsForcedEquation R a u g) + (hregularity : CubeVectorBesovHRegularity R s (fun x => -g x)) : + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad) ≤ + 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound R (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s u.toCubeSet.grad (fun x => -g x) := by + let aFam : CoeffFamily d := rootPointwiseCoeffFamily R a + let A : CoeffField d := publicCoeffField R aFam + have hAeq : A =ᵐ[MeasureTheory.volume.restrict (cubeSet R)] a.toCoeffField := by + simpa only [A, aFam] using publicCoeffField_rootPointwise_ae_eq_source_cubeSet R a + have hweakSource : + IsH1DirichletRhsWeakSolutionOn a.toCoeffField (cubeSet R) u.toCubeSet + (fun x => -g x) := + isH1DirichletRhsWeakSolutionOn_cubeSet_neg_of_isForcedEquation h + have hweak : + IsH1DirichletRhsWeakSolutionOn A (cubeSet R) u.toCubeSet + (fun x => -g x) := + isH1DirichletRhsWeakSolutionOn_congr_coeff_ae hweakSource hAeq.symm + have hEll : IsEllipticFieldOn (aFam.coeffOn R).lam (aFam.coeffOn R).Lam + (cubeSet R) A := by + simpa only [A] using publicCoeffField_isEllipticFieldOn_cubeSet R aFam + have hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity A + (scalarMatrix (d := d) sigma0)) := by + simpa only [A] using + homogenizationErrorOnCube_publicCoeffField_infinity_one_terms_summable + aFam R (scalarMatrix (d := d) sigma0) hs + have hApex := cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_legacyApex_of_legacyCarriers + (u := u) (g := g) A (scalarMatrix (d := d) sigma0) s hs hs_le hEll + (isEllipticMatrix_scalarMatrix hsigma0) (scalarMatrix_isSymm sigma0) hweak + hregularity hresponseSum + have hflux : + fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad =ᵐ[ + MeasureTheory.volume.restrict (cubeSet R)] + fluxDefect A (scalarMatrix (d := d) sigma0) u.toCubeSet.grad := by + filter_upwards [hAeq] with x hx + simp only [fluxDefect, hx] + rw [cubeBesovNegativeVectorSeminormTwo_eq_of_ae_eq_on_cubeSet s hflux] + exact hApex + +private theorem memVectorL2_source_fluxDefect_openCubeSet + {d : ℕ} (R : TriadicCube d) + (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) (sigma0 : ℝ) + (u : H1Function (openCubeSet R)) : + MemVectorL2 (openCubeSet R) + (fun x => matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x)) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain R) a + have hEll : IsEllipticFieldOn b.lam b.Lam (openCubeSet R) b.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using + Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn + (Book.Ch02.cubeDomain R) a + have hflux : MemVectorL2 (openCubeSet R) + (fun x => matVecMul (b.toCoeffField x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hscalar : MemVectorL2 (openCubeSet R) + (fun x => sigma0 • u.grad x) := + u.grad_memVectorL2.const_smul sigma0 + have hsub := hflux.sub hscalar + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet R)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain R) a + apply (memLp_congr_ae ?_).mp + (by simpa only [sub_matVecMul, matVecMul_scalarMatrix] using hsub) + filter_upwards [hba] with x hx + simp only [Pi.sub_apply, hx, sub_matVecMul, matVecMul_scalarMatrix] + +/-- The source coefficient and weak-equation carriers already suffice to +control the cube-average flux defect by the deterministic one-cube RHS. The +Besov regularity argument is deliberately private here: the strict finite-`p` +bridge will supply it from the frozen source carrier, rather than exposing a +legacy boundedness or summability premise in the eventual public theorem. -/ +private theorem ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (sigma0 s : ℝ) (hsigma0 : 0 < sigma0) (hs : 0 < s) (hs_le : s ≤ 1) + (h : IsForcedEquation R a u g) + (hregularity : CubeVectorBesovHRegularity R s (fun x => -g x)) : + ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s u.toCubeSet.grad (fun x => -g x)) := by + have hmemOpen : MemVectorL2 (openCubeSet R) + (fun x => matVecMul + (a.toCoeffField x - scalarMatrix (d := d) sigma0) (u.grad x)) := + memVectorL2_source_fluxDefect_openCubeSet R a sigma0 u + have hmemCube : MemVectorL2 (cubeSet R) + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad) := by + simpa only [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, fluxDefect, + H1Function.grad_toCubeSet, sub_matVecMul] using! hmemOpen + have hmem : MemLp + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R hmemCube + apply ENNReal.ofReal_le_ofReal + calc + ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad) := + (ENNReal.ofReal_le_ofReal_iff + (cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp R hs _ hmem)).mp + (ENNReal_ofReal_norm_cubeAverageVec_le_cubeBesovNegativeVectorSeminormTwo + R hs _ hmem) + _ ≤ 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s u.toCubeSet.grad (fun x => -g x) := + cubeBesovNegativeVectorSeminormTwo_source_fluxDefect_le_legacyApex + sigma0 s hsigma0 hs hs_le h hregularity + +/-- The source finite-`p` fractional-Sobolev datum supplies every regularity +input of the deterministic one-cube flux estimate. In particular, this +public bridge has no auxiliary boundedness, summability, weak-solution, or +ellipticity hypotheses: each is constructed internally from `CoeffOn` and +`IsForcedEquation`. -/ +theorem ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex_of_memCubeEuclideanFullWsp + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s s2 : FractionalOrder) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (hss2 : s.1 < s2.1) + (hg : MemCubeEuclideanFullWsp R s2 p g) + (h : IsForcedEquation R a u g) : + ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1 * + coarseFluxResponseRHSBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s.1 u.toCubeSet.grad (fun x => -g x)) := by + exact ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex + sigma0 s.1 hsigma0 s.2.1 s.2.2.le h + (hg.toCubeVectorBesovHRegularity_neg_of_lt hp hss2) + +/-- Exact four-component form of the source one-cube estimate. This is the +direct handoff for the finite-`p` aggregation: the legacy boundedness witness +needed to expand the RHS is constructed from the strict source Sobolev +carrier, and is not exposed as a public premise. -/ +theorem ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex_components_of_memCubeEuclideanFullWsp + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s s2 : FractionalOrder) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (hss2 : s.1 < s2.1) + (hg : MemCubeEuclideanFullWsp R s2 p g) + (h : IsForcedEquation R a u g) : + ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (ENNReal.ofReal (coarseFluxResponseRHSEnergyBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s.1 u.toCubeSet.grad) + + ENNReal.ofReal (coarseFluxResponseRHSResponseCorrectionBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSWeakFluxCorrectionBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSPoincareCorrectionBound R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) s.1 (fun x => -g x))) := by + let hreg : CubeVectorBesovHRegularity R s.1 (fun x => -g x) := + hg.toCubeVectorBesovHRegularity_neg_of_lt hp hss2 + let A : CoeffField d := publicCoeffField R (rootPointwiseCoeffFamily R a) + let a0 : Mat d := scalarMatrix (d := d) sigma0 + let C : ℝ := 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1 + let B : ℝ := coarseFluxResponseRHSBound R A a0 s.1 u.toCubeSet.grad (fun x => -g x) + have hC : 0 ≤ C := mul_nonneg (by norm_num) + (_root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d s.1) + have hB : 0 ≤ B := by + dsimp [B, A, a0] + exact coarseFluxResponseRHSBound_nonneg_of_bddAbove R + (publicCoeffField R (rootPointwiseCoeffFamily R a)) + (scalarMatrix (d := d) sigma0) u.toCubeSet.grad (fun x => -g x) + s.2.1 hreg.partialSeminorms_bddAbove + have hsplit : ENNReal.ofReal B = + ENNReal.ofReal (coarseFluxResponseRHSEnergyBound R A a0 s.1 u.toCubeSet.grad) + + ENNReal.ofReal (coarseFluxResponseRHSResponseCorrectionBound R A a0 s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSWeakFluxCorrectionBound R A s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSPoincareCorrectionBound R A a0 s.1 (fun x => -g x)) := by + dsimp [B] + exact ENNReal_ofReal_coarseFluxResponseRHSBound_eq_components_of_bddAbove + R A a0 u.toCubeSet.grad (fun x => -g x) s.2.1 hreg.partialSeminorms_bddAbove + have hapex := ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex_of_memCubeEuclideanFullWsp + sigma0 hsigma0 s s2 p hp hss2 hg h + calc + ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal (C * B) := by simpa only [C, B, A, a0] using hapex + _ = ENNReal.ofReal C * ENNReal.ofReal B := ENNReal.ofReal_mul hC + _ = ENNReal.ofReal C * + (ENNReal.ofReal (coarseFluxResponseRHSEnergyBound R A a0 s.1 u.toCubeSet.grad) + + ENNReal.ofReal (coarseFluxResponseRHSResponseCorrectionBound R A a0 s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSWeakFluxCorrectionBound R A s.1 (fun x => -g x)) + + ENNReal.ofReal (coarseFluxResponseRHSPoincareCorrectionBound R A a0 s.1 (fun x => -g x))) := by rw [hsplit] + _ = _ := by rfl + +/-- Fully absorbed source-facing one-cube estimate. The `q=1` response term +and all three ellipticity corrections are internal consequences of the +canonical root family; the displayed forcing seminorm has the manuscript sign +convention. -/ +theorem ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_localCoarseGrainingOneCube + {d : ℕ} [NeZero d] {R : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)} + {u : H1Function (openCubeSet R)} {g : Vec d → Vec d} + (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s s2 : FractionalOrder) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (hss2 : s.1 < s2.1) + (hg : MemCubeEuclideanFullWsp R s2 p g) + (h : IsForcedEquation R a u g) : + ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * + (ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + ENNReal.ofReal (Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 1) + (rootPointwiseCoeffFamily R a) (scalarMatrix (d := d) sigma0)) * + localSymmetricEnergyENorm R a u + + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + ENNReal.ofReal + (Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity (.finite 2) + (rootPointwiseCoeffFamily R a) (scalarMatrix (d := d) sigma0)) ^ 2) * + ENNReal.ofReal (cubeBesovPositiveVectorSeminormTwo R s.1 g)) := by + let A : CoeffField d := publicCoeffField R (rootPointwiseCoeffFamily R a) + let a0 : Mat d := scalarMatrix (d := d) sigma0 + let H1 : ℝ := Book.Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 1) + (rootPointwiseCoeffFamily R a) a0 + let H2 : ℝ := Book.Ch02.HomogenizationErrorOnCube R (s.1 / 2) .infinity (.finite 2) + (rootPointwiseCoeffFamily R a) a0 + let E : ℝ := Real.sqrt (cubeAverage R (coefficientEnergyDensity A u.toCubeSet.grad)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo R s.1 g + let M : ℝ := _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + let X : ℝ := s.1⁻¹ * Real.sqrt sigma0 * H1 * E + let Y : ℝ := Real.rpow s.1 (-(9 / 2 : ℝ)) * (H2 ^ 2 + 1) * B + have hBdd : BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s.1 N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_memLp_finiteP + R s s2 hss2 p hp g hg + have hBneg : cubeBesovPositiveVectorSeminormTwo R s.1 (fun x => -g x) = B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_neg_of_memLp R s.1 g + (MemCubeEuclideanFullWsp.memLpTwo hp hg) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s.1 g hBdd + have hH1_nonneg : 0 ≤ H1 := by + dsimp [H1, a0] + exact Book.Ch02.HomogenizationErrorOnCube_infinity_one_nonneg R + (rootPointwiseCoeffFamily R a) (scalarMatrix (d := d) sigma0) s.2.1 + have hH2_nonneg : 0 ≤ H2 := by + dsimp [H2, a0, Book.Ch02.HomogenizationErrorOnCube, + Book.Ch02.HomogenizationError, Book.Ch02.HomogenizationErrorFinite] + apply Real.rpow_nonneg + apply tsum_nonneg + intro j + apply mul_nonneg + · simpa [Book.Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s.1 / 2) (q := (2 : ℝ)) j + (by nlinarith [s.2.1.le] : 0 ≤ (s.1 / 2) * (2 : ℝ))) + · exact Real.rpow_nonneg + (Book.Ch02.scaleResponseAtScale_infinity_nonneg R (by omega) + (rootPointwiseCoeffFamily R a) (scalarMatrix (d := d) sigma0)) _ + have hE_nonneg : 0 ≤ E := Real.sqrt_nonneg _ + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hs_inv_nonneg : 0 ≤ s.1⁻¹ := inv_nonneg.mpr s.2.1.le + have hrpow52_nonneg : 0 ≤ Real.rpow s.1 (-(5 / 2 : ℝ)) := + Real.rpow_nonneg s.2.1.le _ + have hrpow9_nonneg : 0 ≤ Real.rpow s.1 (-(9 / 2 : ℝ)) := + Real.rpow_nonneg s.2.1.le _ + have hrpow3_nonneg : 0 ≤ Real.rpow s.1 (-3 : ℝ) := + Real.rpow_nonneg s.2.1.le _ + have hX_nonneg : 0 ≤ X := by + dsimp [X] + exact mul_nonneg (mul_nonneg (mul_nonneg hs_inv_nonneg (Real.sqrt_nonneg _)) hH1_nonneg) hE_nonneg + have hY_nonneg : 0 ≤ Y := by + dsimp [Y] + exact mul_nonneg (mul_nonneg hrpow9_nonneg (by nlinarith [sq_nonneg H2])) hB_nonneg + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d 1 + have hC : 2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1 ≤ + 2 * M := by + dsimp [M] + exact mul_le_mul_of_nonneg_left + (zeroTraceDirichletCorrectedWeakFluxApexConstant_le_one s.1 s.2.1 s.2.2.le) + (by norm_num) + have hmat : Real.sqrt (matNorm a0) ≤ (d : ℝ) * Real.sqrt sigma0 := by + dsimp [a0] + exact sqrt_matNorm_scalarMatrix_le_dim_mul_sqrt hsigma0.le + have hpow52 : Real.rpow s.1 (-(5 / 2 : ℝ)) ≤ Real.rpow s.1 (-(9 / 2 : ℝ)) := + rpow_neg_five_halves_le_rpow_neg_nine_halves s.2.1 s.2.2.le + have hpow3 : Real.rpow s.1 (-3 : ℝ) ≤ Real.rpow s.1 (-(9 / 2 : ℝ)) := + rpow_neg_three_le_rpow_neg_nine_halves s.2.1 s.2.2.le + have hresponseEnvelope : Real.sqrt sigma0 * + poincareLowerEllipticityFactor R (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2) * H1 ≤ + 4 * (d : ℝ) * (H2 ^ 2 + 1) := by + simpa only [H1, H2, a0, Fintype.card_fin] using + sqrt_sigma_mul_lower_mul_homogenizationError_le_qtwo_envelope R + (rootPointwiseCoeffFamily R a) sigma0 s.2.1 s.2.2.le hsigma0 + have hweakEnvelope : + Real.sqrt (Book.Ch02.LambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a)) * + Real.sqrt ((Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) ≤ + 4 * (d : ℝ) * (H2 ^ 2 + 1) := by + have hnormalized := qtwo_sqrt_weighted_product_le_envelope R + (rootPointwiseCoeffFamily R a) (t := s.1 / 2) (by linarith [s.2.1]) hsigma0 + have hcancel : + Real.sqrt (sigma0⁻¹ * Book.Ch02.LambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a)) * + Real.sqrt (sigma0 * (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) = + Real.sqrt (Book.Ch02.LambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a)) * + Real.sqrt ((Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) := by + rw [Real.sqrt_mul (inv_nonneg.mpr hsigma0.le), + Real.sqrt_mul hsigma0.le, Real.sqrt_inv] + field_simp [ne_of_gt (Real.sqrt_pos.2 hsigma0)] + rw [hcancel] at hnormalized + simpa only [H2, a0, Fintype.card_fin] using hnormalized + have hpoincareEnvelope : sigma0 * + (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹ ≤ + 4 * (d : ℝ) * (H2 ^ 2 + 1) := by + have hweighted := qtwo_weighted_ellipticity_envelope R + (rootPointwiseCoeffFamily R a) (t := s.1 / 2) (by linarith [s.2.1]) hsigma0 + have hupper : 0 ≤ sigma0⁻¹ * Book.Ch02.LambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a) := + mul_nonneg (inv_nonneg.mpr hsigma0.le) + (Book.Ch02.LambdaSq_finite_nonneg R (rootPointwiseCoeffFamily R a) + (by linarith [s.2.1]) (by norm_num)) + simpa only [H2, a0, Fintype.card_fin] using (le_add_of_nonneg_left hupper).trans hweighted + have hH1eq : HomogenizationErrorOnCube R s.1 .infinity (.finite 1) A a0 = H1 := by + dsimp [A, H1] + exact homogenizationErrorOnCube_publicCoeffField_infinity_one_eq_ch02 + (rootPointwiseCoeffFamily R a) R s.1 a0 + have hlowerBridge : Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) ≤ + (d : ℝ) * poincareLowerEllipticityFactor R (rootPointwiseCoeffFamily R a) + (s.1 / 2) (.finite 2) := by + dsimp [A] + exact sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + R (rootPointwiseCoeffFamily R a) (by linarith [s.2.1]) + have hupperBridge : Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) ≤ + (d : ℝ) * poincareUpperEllipticityFactor R (rootPointwiseCoeffFamily R a) + (s.1 / 2) (.finite 2) := by + dsimp [A] + exact sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + R (rootPointwiseCoeffFamily R a) (by linarith [s.2.1]) + have hinvBridge : (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ ≤ + (d : ℝ) * (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹ := by + dsimp [A] + simpa [lambdaSq, Book.Ch02.lambdaSq, Real.rpow_neg_one] using + lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_public_rpow_neg_one + R (rootPointwiseCoeffFamily R a) (s := s.1 / 2) (by linarith [s.2.1]) + have hupper_nonneg : 0 ≤ poincareUpperEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2) := by + rw [poincareUpperEllipticityFactor_finite_two_eq_sqrt_local] + exact Real.sqrt_nonneg _ + have hlower_nonneg : 0 ≤ poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2) := by + rw [poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv_local] + exact Real.sqrt_nonneg _ + have hresponseRaw : Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1 ≤ + 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by + have hprod : Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) ≤ + ((d : ℝ) * Real.sqrt sigma0) * + ((d : ℝ) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) := + mul_le_mul hmat hlowerBridge (Real.sqrt_nonneg _) + (mul_nonneg hd_nonneg (Real.sqrt_nonneg _)) + calc + Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1 ≤ + (((d : ℝ) * Real.sqrt sigma0) * + ((d : ℝ) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2))) * H1 := + mul_le_mul_of_nonneg_right hprod hH1_nonneg + _ = (d : ℝ) ^ 2 * + (Real.sqrt sigma0 * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2) * H1) := by ring + _ ≤ (d : ℝ) ^ 2 * (4 * (d : ℝ) * (H2 ^ 2 + 1)) := + mul_le_mul_of_nonneg_left hresponseEnvelope (sq_nonneg _) + _ = 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by ring + have hweakRaw : Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) ≤ + 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by + have hprod : Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) ≤ + ((d : ℝ) * poincareUpperEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) * + ((d : ℝ) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) := + mul_le_mul hupperBridge hlowerBridge (Real.sqrt_nonneg _) + (mul_nonneg hd_nonneg hupper_nonneg) + have hpublic : poincareUpperEllipticityFactor R (rootPointwiseCoeffFamily R a) + (s.1 / 2) (.finite 2) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2) ≤ + 4 * (d : ℝ) * (H2 ^ 2 + 1) := by + rw [poincareUpperEllipticityFactor_finite_two_eq_sqrt_local, + poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv_local] + exact hweakEnvelope + calc + Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) ≤ + ((d : ℝ) * poincareUpperEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) * + ((d : ℝ) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) := hprod + _ = (d : ℝ) ^ 2 * + (poincareUpperEllipticityFactor R (rootPointwiseCoeffFamily R a) + (s.1 / 2) (.finite 2) * poincareLowerEllipticityFactor R + (rootPointwiseCoeffFamily R a) (s.1 / 2) (.finite 2)) := by ring + _ ≤ (d : ℝ) ^ 2 * (4 * (d : ℝ) * (H2 ^ 2 + 1)) := + mul_le_mul_of_nonneg_left hpublic (sq_nonneg _) + _ = 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by ring + have hpoincareRaw : matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ ≤ + 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by + have hmatRaw : matNorm a0 ≤ (d : ℝ) * sigma0 := by + dsimp [a0] + exact matNorm_scalarMatrix_le_dim_mul hsigma0.le + have hprod : matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ ≤ + ((d : ℝ) * sigma0) * ((d : ℝ) * + (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) := + mul_le_mul hmatRaw hinvBridge + (inv_nonneg.mpr (multiscale_ellipticity_lambdaSq_finite_nonneg R + (s.1 / 2) 2 A (by norm_num) (by linarith [s.2.1]))) + (mul_nonneg hd_nonneg hsigma0.le) + calc + matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ ≤ + ((d : ℝ) * sigma0) * ((d : ℝ) * + (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) := hprod + _ = (d : ℝ) ^ 2 * + (sigma0 * (Book.Ch02.lambdaSq R (s.1 / 2) (.finite 2) + (rootPointwiseCoeffFamily R a))⁻¹) := by ring + _ ≤ (d : ℝ) ^ 2 * (4 * (d : ℝ) * (H2 ^ 2 + 1)) := + mul_le_mul_of_nonneg_left hpoincareEnvelope (sq_nonneg _) + _ = 4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1) := by ring + have henergy : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSEnergyBound R A a0 s.1 u.toCubeSet.grad ≤ + (2 * M * (d : ℝ)) * X := by + unfold coarseFluxResponseRHSEnergyBound + rw [hH1eq] + change + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (s.1⁻¹ * Real.sqrt (matNorm a0) * H1 * E) ≤ + (2 * M * (d : ℝ)) * X + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (s.1⁻¹ * Real.sqrt (matNorm a0) * H1 * E) ≤ + (2 * M) * (s.1⁻¹ * ((d : ℝ) * Real.sqrt sigma0) * + H1 * E) := by + gcongr + _ = (2 * M * (d : ℝ)) * X := by ring + have hresponse : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSResponseCorrectionBound R A a0 s.1 (fun x => -g x) ≤ + (8 * M * (d : ℝ) ^ 3) * Y := by + unfold coarseFluxResponseRHSResponseCorrectionBound + rw [hBneg] + rw [hH1eq] + have hraw_nonneg : 0 ≤ Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1 := + mul_nonneg (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) hH1_nonneg + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1 * B) = + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-(5 / 2 : ℝ)) * + (Real.sqrt (matNorm a0) * Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1) * B) := by ring + _ ≤ + (2 * M) * (Real.rpow s.1 (-(5 / 2 : ℝ)) * + (Real.sqrt (matNorm a0) * Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1) * B) := by + apply mul_le_mul_of_nonneg_right hC + exact mul_nonneg (mul_nonneg hrpow52_nonneg hraw_nonneg) hB_nonneg + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (Real.sqrt (matNorm a0) * Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1) * B) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hpow52 hraw_nonneg) hB_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by + calc + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (Real.sqrt (matNorm a0) * Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1) * B) = + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((Real.sqrt (matNorm a0) * Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * H1) * B)) := by ring + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hresponseRaw hB_nonneg) hrpow9_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ = (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by ring + _ = (8 * M * (d : ℝ) ^ 3) * Y := by dsimp [Y]; ring + have hweak : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSWeakFluxCorrectionBound R A s.1 (fun x => -g x) ≤ + (8 * M * (d : ℝ) ^ 3) * Y := by + unfold coarseFluxResponseRHSWeakFluxCorrectionBound + rw [hBneg] + have hraw_nonneg : 0 ≤ Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) := + mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-(5 / 2 : ℝ)) * + Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B) = + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-(5 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹)) * B) := by ring + _ ≤ + (2 * M) * (Real.rpow s.1 (-(5 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹)) * B) := by + apply mul_le_mul_of_nonneg_right hC + exact mul_nonneg (mul_nonneg hrpow52_nonneg hraw_nonneg) hB_nonneg + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹)) * B) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hpow52 hraw_nonneg) hB_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by + calc + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹)) * B) = + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((Real.sqrt (LambdaSq R (s.1 / 2) (.finite 2) A) * + Real.sqrt ((lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹)) * B)) := by ring + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hweakRaw hB_nonneg) hrpow9_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ = (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by ring + _ = (8 * M * (d : ℝ) ^ 3) * Y := by dsimp [Y]; ring + have hpoincare : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSPoincareCorrectionBound R A a0 s.1 (fun x => -g x) ≤ + (8 * M * (d : ℝ) ^ 3) * Y := by + unfold coarseFluxResponseRHSPoincareCorrectionBound + rw [hBneg] + have hraw_nonneg : 0 ≤ matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ := + mul_nonneg (matNorm_nonneg _) (inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg R (s.1 / 2) 2 A + (by norm_num) (by linarith [s.2.1]))) + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-3 : ℝ) * matNorm a0 * + (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹ * B) = + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (Real.rpow s.1 (-3 : ℝ) * + (matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B) := by ring + _ ≤ + (2 * M) * (Real.rpow s.1 (-3 : ℝ) * + (matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B) := by + apply mul_le_mul_of_nonneg_right hC + exact mul_nonneg (mul_nonneg hrpow3_nonneg hraw_nonneg) hB_nonneg + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hpow3 hraw_nonneg) hB_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by + calc + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B) = + (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((matNorm a0 * (lambdaSq R (s.1 / 2) (.finite 2) A)⁻¹) * B)) := by ring + _ ≤ (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + ((4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hpoincareRaw hB_nonneg) hrpow9_nonneg) + (mul_nonneg (by norm_num) hM_nonneg) + _ = (2 * M) * (Real.rpow s.1 (-(9 / 2 : ℝ)) * + (4 * (d : ℝ) ^ 3 * (H2 ^ 2 + 1)) * B) := by ring + _ = (8 * M * (d : ℝ) ^ 3) * Y := by dsimp [Y]; ring + have hreal : + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSBound R A a0 s.1 u.toCubeSet.grad (fun x => -g x) ≤ + localCoarseGrainingOneCubeConstant d * (X + Y) := by + rw [coarseFluxResponseRHSBound_eq_component_sum] + calc + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + (coarseFluxResponseRHSEnergyBound R A a0 s.1 u.toCubeSet.grad + + coarseFluxResponseRHSResponseCorrectionBound R A a0 s.1 (fun x => -g x) + + coarseFluxResponseRHSWeakFluxCorrectionBound R A s.1 (fun x => -g x) + + coarseFluxResponseRHSPoincareCorrectionBound R A a0 s.1 (fun x => -g x)) = + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSEnergyBound R A a0 s.1 u.toCubeSet.grad + + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSResponseCorrectionBound R A a0 s.1 (fun x => -g x) + + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSWeakFluxCorrectionBound R A s.1 (fun x => -g x) + + (2 * _root_.Homogenization.ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d s.1) * + coarseFluxResponseRHSPoincareCorrectionBound R A a0 s.1 (fun x => -g x) := by ring + _ ≤ (2 * M * (d : ℝ)) * X + (8 * M * (d : ℝ) ^ 3) * Y + + (8 * M * (d : ℝ) ^ 3) * Y + (8 * M * (d : ℝ) ^ 3) * Y := by + gcongr + _ = (2 * M * (d : ℝ)) * X + + (24 * M * (d : ℝ) ^ 3) * Y := by ring + _ ≤ localCoarseGrainingOneCubeConstant d * (X + Y) := + localCoarseGrainingOneCubeConstant_dominates_forcing X Y hX_nonneg hY_nonneg + have hapex := ENNReal_ofReal_norm_cubeAverageVec_source_fluxDefect_le_legacyApex_of_memCubeEuclideanFullWsp + sigma0 hsigma0 s s2 p hp hss2 hg h + have hmain : ENNReal.ofReal ‖cubeAverageVec R + (fluxDefect a.toCoeffField (scalarMatrix (d := d) sigma0) u.toCubeSet.grad)‖ ≤ + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d * (X + Y)) := + hapex.trans (ENNReal.ofReal_le_ofReal (by simpa only [A, a0] using hreal)) + have henergyENN : ENNReal.ofReal E = localSymmetricEnergyENorm R a u := by + dsimp [E, A] + exact ENNReal_ofReal_sqrt_cubeAverage_public_energy_eq_localSymmetricEnergy R a u + have hXENN : ENNReal.ofReal X = + ENNReal.ofReal (s.1⁻¹) * ENNReal.ofReal (Real.sqrt sigma0) * + ENNReal.ofReal H1 * localSymmetricEnergyENorm R a u := by + rw [show X = s.1⁻¹ * Real.sqrt sigma0 * H1 * E by rfl] + rw [ENNReal.ofReal_mul (mul_nonneg (mul_nonneg hs_inv_nonneg (Real.sqrt_nonneg _)) hH1_nonneg), + ENNReal.ofReal_mul (mul_nonneg hs_inv_nonneg (Real.sqrt_nonneg _)), + ENNReal.ofReal_mul hs_inv_nonneg, henergyENN] + have hYENN : ENNReal.ofReal Y = + ENNReal.ofReal (Real.rpow s.1 (-(9 / 2 : ℝ))) * + (1 + ENNReal.ofReal H2 ^ 2) * ENNReal.ofReal B := by + rw [show Y = Real.rpow s.1 (-(9 / 2 : ℝ)) * (H2 ^ 2 + 1) * B by rfl] + rw [ENNReal.ofReal_mul (mul_nonneg hrpow9_nonneg (add_nonneg (sq_nonneg H2) zero_le_one)), + ENNReal.ofReal_mul hrpow9_nonneg, ENNReal.ofReal_add (sq_nonneg H2) zero_le_one, + ENNReal.ofReal_pow] + · simp only [ENNReal.ofReal_one, add_comm] + · exact hH2_nonneg + rw [show ENNReal.ofReal (localCoarseGrainingOneCubeConstant d * (X + Y)) = + ENNReal.ofReal (localCoarseGrainingOneCubeConstant d) * ENNReal.ofReal (X + Y) by + rw [ENNReal.ofReal_mul (localCoarseGrainingOneCubeConstant_nonneg d)]] at hmain + rw [ENNReal.ofReal_add hX_nonneg hY_nonneg, hXENN, hYENN] at hmain + simpa only [H1, H2] using hmain + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingPDE.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingPDE.lean new file mode 100644 index 0000000000..24b8d91d6b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingPDE.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroExtensionGraph + +/-! +# Local coarse-graining PDE bridges + +This module transports the source-facing weak equation and finite-`p` forcing +assumption to the internal carriers used by local coarse-graining estimates. +The public statements retain `CoeffOn`; pointwise coefficient representatives +are confined to the private bridge to the legacy weak-solution predicate. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem setIntegral_vecDot_extendByZeroToOpenSuperset {d : ℕ} + {U V : Set (Vec d)} (hU : MeasurableSet U) (hV : IsOpen V) (hUV : U ⊆ V) + (F : Vec d → Vec d) (phi : H10Function U) : + ∫ x in V, vecDot (F x) + ((phi.extendByZeroToOpenSuperset hU hV hUV).grad x) ∂volume = + ∫ x in U, vecDot (F x) (phi.grad x) ∂volume := by + let phiV : H10Function V := phi.extendByZeroToOpenSuperset hU hV hUV + have hgrad : phiV.grad = phi.zeroExtensionGrad := by + simpa only [phiV] using + H10Function.extendByZeroToOpenSuperset_grad phi hU hV hUV + have hindicator : + (fun x => vecDot (F x) (phiV.grad x)) = + U.indicator (fun x => vecDot (F x) (phi.grad x)) := by + funext x + rw [hgrad] + by_cases hx : x ∈ U + · simp only [H10Function.zeroExtensionGrad_apply_of_mem _ hx, + Set.indicator_of_mem hx] + · simp only [H10Function.zeroExtensionGrad_apply_of_not_mem _ hx, + Set.indicator_of_notMem hx, vecDot_zero_right] + rw [show (phi.extendByZeroToOpenSuperset hU hV hUV).grad = phiV.grad by rfl, + hindicator, MeasureTheory.integral_indicator hU, Measure.restrict_restrict hU, + Set.inter_eq_left.mpr hUV] + +/-- The source weak equation restricts to every descendant by zero-extending +the descendant test function. -/ +theorem IsForcedEquation.restrictToDescendant {d : ℕ} + {Q R : TriadicCube d} {n : ℤ} + (hn : n ≤ Q.scale) (hR : R ∈ descendantsAtScale Q n) + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)} + {u : H1Function (openCubeSet Q)} {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsForcedEquation R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hn hR)) + (restrictH1ToSubcube u + (openCubeSet_subset_of_mem_descendantsAtScale hn hR)) g := by + let hRQ : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hn hR + intro phi + let phiQ : H10Function (openCubeSet Q) := + phi.extendByZeroToOpenSuperset (measurableSet_openCubeSet R) + (isOpen_openCubeSet Q) hRQ + have hflux := setIntegral_vecDot_extendByZeroToOpenSuperset + (measurableSet_openCubeSet R) (isOpen_openCubeSet Q) hRQ + (fun x => matVecMul (a.toCoeffField x) (u.grad x)) phi + have hforcing := setIntegral_vecDot_extendByZeroToOpenSuperset + (measurableSet_openCubeSet R) (isOpen_openCubeSet Q) hRQ g phi + calc + ∫ x in openCubeSet R, + vecDot + (matVecMul + ((a.restrictToSubcube hRQ).toCoeffField x) + ((restrictH1ToSubcube u hRQ).grad x)) + (phi.grad x) ∂volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) + (phiQ.grad x) ∂volume := by + simpa only [Book.Ch02.CoeffOn.restrictToSubcube_toCoeffField, + restrictH1ToSubcube_grad, phiQ] using hflux.symm + _ = -(∫ x in openCubeSet Q, vecDot (g x) (phiQ.grad x) ∂volume) := h phiQ + _ = -(∫ x in openCubeSet R, vecDot (g x) (phi.grad x) ∂volume) := by + rw [hforcing] + +/-- Finite-`p` source forcing is `L²` on every descendant whenever `p ≥ 2`. -/ +theorem MemCubeEuclideanFullWsp.memLpTwoOnDescendant {d : ℕ} + {Q R : TriadicCube d} {n : ℤ} {s : FractionalOrder} + {p : FiniteLpExponent} {g : Vec d → Vec d} + (hn : n ≤ Q.scale) (hR : R ∈ descendantsAtScale Q n) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) + (h : MemCubeEuclideanFullWsp Q s p g) : + MemLp (fun x => HilbertVec.ofVec (g x)) 2 (normalizedCubeMeasure R) := by + have hRdepth : R ∈ descendantsAtDepth Q (Int.toNat (Q.scale - n)) := by + rw [← descendantsAtScale_eq_descendantsAtDepth Q hn] + exact hR + exact (memLp_on_descendant_of_memLp_generic hRdepth h.1).mono_exponent hp + +private theorem isH1DirichletRhsWeakSolutionOn_pointwiseCoeffOn_neg_of_isForcedEquation + {d : ℕ} {Q : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)} + {u : H1Function (openCubeSet Q)} {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsH1DirichletRhsWeakSolutionOn + (Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain Q) a).toCoeffField + (openCubeSet Q) u (fun x => -g x) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain Q) a + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain Q) a + intro phi + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (b.toCoeffField x) (u.grad x)) (phi.grad x) ∂volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) (phi.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hba] with x hx + simp only [hx] + _ = -(∫ x in openCubeSet Q, vecDot (g x) (phi.grad x) ∂volume) := h phi + _ = ∫ x in openCubeSet Q, vecDot (-g x) (phi.grad x) ∂volume := by + rw [← MeasureTheory.integral_neg] + congr with x + exact (vecDot_neg_left (g x) (phi.grad x)).symm + +/-- The source negative-sign weak equation is the legacy weak-solution +carrier with datum `-g`. -/ +theorem IsForcedEquation.toIsH1DirichletRhsWeakSolutionOnNeg {d : ℕ} + {Q : TriadicCube d} + {a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q)} + {u : H1Function (openCubeSet Q)} {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsH1DirichletRhsWeakSolutionOn a.toCoeffField (openCubeSet Q) u + (fun x => -g x) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain Q) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain Q) a + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain Q) a + have hb := isH1DirichletRhsWeakSolutionOn_pointwiseCoeffOn_neg_of_isForcedEquation h + intro phi + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) (phi.grad x) ∂volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (b.toCoeffField x) (u.grad x)) (phi.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hba] with x hx + simp only [hx] + _ = ∫ x in openCubeSet Q, vecDot (-g x) (phi.grad x) ∂volume := hb phi + +/-- The local symmetric energy is exactly the old coefficient-energy density +integrated against the normalized cube measure. -/ +theorem localSymmetricEnergyENorm_eq_coefficientEnergyDensity {d : ℕ} + (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + localSymmetricEnergyENorm R a u = + (∫⁻ x, ENNReal.ofReal + (coefficientEnergyDensity a.toCoeffField u.grad x) + ∂normalizedCubeMeasure R) ^ (1 / 2 : ℝ) := rfl + +private theorem integrable_coefficientEnergyDensity_normalizedCubeMeasure {d : ℕ} + (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + Integrable (coefficientEnergyDensity a.toCoeffField u.grad) + (normalizedCubeMeasure R) := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain R) a + have hEll : IsEllipticFieldOn b.lam b.Lam (openCubeSet R) b.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using + Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn + (Book.Ch02.cubeDomain R) a + have hB : IntegrableOn (coefficientEnergyDensity b.toCoeffField u.grad) + (openCubeSet R) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet R)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain R) a + have hA : IntegrableOn (coefficientEnergyDensity a.toCoeffField u.grad) + (openCubeSet R) := by + apply hB.congr + filter_upwards [hba] with x hx + change vecDot (u.grad x) + (matVecMul (symmPart (b.toCoeffField x)) (u.grad x)) = + vecDot (u.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.grad x)) + rw [hx] + simpa only [volumeMeasureOn, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + hA.smul_measure ENNReal.ofReal_ne_top + +private theorem ae_nonneg_coefficientEnergyDensity_normalizedCubeMeasure {d : ℕ} + (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + ∀ᵐ x ∂normalizedCubeMeasure R, + 0 ≤ coefficientEnergyDensity a.toCoeffField u.grad x := by + let b : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R) := + Internal.Ch02.BookCh02.pointwiseCoeffOn (Book.Ch02.cubeDomain R) a + have hEll : IsEllipticFieldOn b.lam b.Lam (openCubeSet R) b.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using + Internal.Ch02.BookCh02.pointwiseCoeffOn_isEllipticFieldOn + (Book.Ch02.cubeDomain R) a + have hba : b.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet R)] a.toCoeffField := by + simpa only [b, Book.Ch02.cubeDomain_coe] using! + Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq (Book.Ch02.cubeDomain R) a + have hnonneg : ∀ᵐ x ∂volumeMeasureOn (openCubeSet R), + 0 ≤ coefficientEnergyDensity a.toCoeffField u.grad x := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet R), hba] + with x hxR hxa + change 0 ≤ vecDot (u.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.grad x)) + rw [← hxa] + exact coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll u.grad x hxR + simpa only [volumeMeasureOn, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + MeasureTheory.Measure.ae_smul_measure hnonneg (ENNReal.ofReal ((cubeVolume R)⁻¹)) + +/-- The local symmetric energy is the square-root energy associated with the +legacy normalized cube average. -/ +theorem localSymmetricEnergyENorm_eq_ofReal_cubeAverage_coefficientEnergyDensity + {d : ℕ} (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + localSymmetricEnergyENorm R a u = + (ENNReal.ofReal + (cubeAverage R (coefficientEnergyDensity a.toCoeffField u.grad))) ^ + (1 / 2 : ℝ) := by + rw [localSymmetricEnergyENorm_eq_coefficientEnergyDensity] + congr 1 + symm + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (integrable_coefficientEnergyDensity_normalizedCubeMeasure R a u) + (ae_nonneg_coefficientEnergyDensity_normalizedCubeMeasure R a u) + +/-- The normalized local symmetric energy is nonnegative. -/ +theorem localSymmetricEnergyENorm_nonneg {d : ℕ} + (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + 0 ≤ localSymmetricEnergyENorm R a u := bot_le + +/-- The local symmetric energy is finite. -/ +theorem localSymmetricEnergyENorm_ne_top {d : ℕ} + (R : TriadicCube d) (a : Book.Ch02.CoeffOn (Book.Ch02.cubeDomain R)) + (u : H1Function (openCubeSet R)) : + localSymmetricEnergyENorm R a u ≠ ⊤ := by + rw [localSymmetricEnergyENorm_eq_coefficientEnergyDensity] + apply ENNReal.rpow_ne_top_of_nonneg (by norm_num) + have hnorm_ne_top : + ∫⁻ x, ‖coefficientEnergyDensity a.toCoeffField u.grad x‖ₑ + ∂normalizedCubeMeasure R ≠ ⊤ := by + exact ne_of_lt (MeasureTheory.hasFiniteIntegral_iff_enorm.mp + (integrable_coefficientEnergyDensity_normalizedCubeMeasure R a u).hasFiniteIntegral) + exact ne_top_of_le_ne_top + hnorm_ne_top + (MeasureTheory.lintegral_ofReal_le_lintegral_enorm _) + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponse.lean new file mode 100644 index 0000000000..5278ce3e62 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponse.lean @@ -0,0 +1,691 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.ParentTruncatedHomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.AEEq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite + +/-! # Local Coarse Graining Response -/ + +@[expose] public section + +open scoped BigOperators ENNReal MatrixOrder Matrix.Norms.Frobenius + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +noncomputable section + +/-- The globally measurable pointwise-good representative of a root coefficient, +viewed as a compatible coefficient family on every triadic cube. -/ +noncomputable def rootPointwiseCoeffFamily {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) : + Ch02.TriadicCoeffFamily d where + coeffOn := fun R => + { toCoeffField := Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) a + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + classical + intro i j + have hcoeff : + Measurable fun x : Vec d => + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) a x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (Internal.Ch02.BookCh02.pointwiseCoeffField_measurable + (Ch02.cubeDomain Q) a) i) j) + have hentry : Measurable fun x : Vec d => + restrictCoeffField (openCubeSet R) + (Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) a) x i j := by + have hite : Measurable fun x : Vec d => + if x ∈ openCubeSet R then + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) a x i j + else 0 := + Measurable.ite (measurableSet_openCubeSet R) hcoeff measurable_const + convert hite using 1 + funext x + by_cases hx : x ∈ openCubeSet R <;> simp [restrictCoeffField, hx] + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet R)] + with x _hx + by_cases hxGood : x ∈ + (Internal.Ch02.BookCh02.goodSetData (Ch02.cubeDomain Q) a).set + · simpa [Internal.Ch02.BookCh02.pointwiseCoeffField, hxGood] using + (Internal.Ch02.BookCh02.goodSetData (Ch02.cubeDomain Q) a).elliptic x hxGood + · simpa [Internal.Ch02.BookCh02.pointwiseCoeffField, hxGood] using + Internal.Ch02.BookCh02.isEllipticMatrix_smul_one + (d := d) a.lam_pos a.lam_le_Lam } + restrictsTo_of_subset := by + intro R S _hSR + exact Filter.EventuallyEq.rfl + +/-- At its root, the canonical pointwise family agrees a.e. with the supplied +public coefficient. -/ +theorem rootPointwiseCoeffFamily_root_aeeq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) : + Ch02.CoeffOn.AEEq ((rootPointwiseCoeffFamily Q a).coeffOn Q) a := by + exact Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq (Ch02.cubeDomain Q) a + +/-- On every descendant, the canonical pointwise family agrees a.e. with the +literal restriction of the supplied root coefficient. -/ +theorem rootPointwiseCoeffFamily_descendant_aeeq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + Ch02.CoeffOn.AEEq ((rootPointwiseCoeffFamily Q a).coeffOn R) + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) := by + have hroot := Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (Ch02.cubeDomain Q) a + exact MeasureTheory.ae_restrict_of_ae_restrict_of_subset + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) hroot + +/-- On a descendant, the canonical extended-real scalar response maximum is no +larger than the nonnegative encoding of the legacy real response maximum. -/ +theorem normalizedBlockResponseScalarEMaxOnCube_le_ofReal_rootPointwise + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + Ch02.normalizedBlockResponseScalarEMaxOnCube R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + sigma0 hsigma0 ≤ + ENNReal.ofReal (Ch02.normalizedBlockResponseMax R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + apply csSup_le + (Ch02.normalizedBlockResponseScalarEValueSetOnCube_nonempty R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) sigma0 hsigma0) + rintro y hy + rcases (Ch02.mem_normalizedBlockResponseScalarEValueSetOnCube_iff.mp hy) + with ⟨e, he, rfl⟩ + apply ENNReal.ofReal_le_ofReal + have hA := rootPointwiseCoeffFamily_descendant_aeeq Q a hk hR + rw [Ch02.doubledResponseJ_eq_ofAEEq hA.symm] + exact le_csSup + (Ch02.normalizedBlockResponseValueSet_bddAbove_of_mem_descendantsAtScale + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) hR) + ⟨e, he, rfl⟩ + +/-- Conversely, the nonnegative encoding of the legacy real response maximum +is bounded by the canonical extended-real scalar response maximum. -/ +theorem ofReal_normalizedBlockResponseMax_le_rootPointwise + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + ENNReal.ofReal (Ch02.normalizedBlockResponseMax R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + Ch02.normalizedBlockResponseScalarEMaxOnCube R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + sigma0 hsigma0 := by + let E := Ch02.normalizedBlockResponseScalarEMaxOnCube R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + sigma0 hsigma0 + have hEtop : E ≠ ∞ := + (Ch02.normalizedBlockResponseScalarEMaxOnCube_lt_top R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + sigma0 hsigma0).ne + change ENNReal.ofReal (Ch02.normalizedBlockResponseMax R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ E + rw [← ENNReal.ofReal_toReal hEtop] + apply ENNReal.ofReal_le_ofReal + apply csSup_le + (Ch02.normalizedBlockResponseValueSet_nonempty R (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) + rintro x ⟨e, he, rfl⟩ + have hnonneg : 0 ≤ Ch02.doubledResponseJ (Ch02.cubeDomain R) + ((rootPointwiseCoeffFamily Q a).coeffOn R) + (ofFullBlockVec (Matrix.mulVec + (Ch02.constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) sigma0)) e)) + (ofFullBlockVec (Matrix.mulVec + (Ch02.constantFullBlockMatrixSqrt (scalarMatrix (d := d) sigma0)) e)) := + Ch02.doubledResponseJ_nonneg _ _ _ _ + rw [← ENNReal.toReal_ofReal hnonneg] + apply ENNReal.toReal_mono hEtop + apply Ch02.normalizedBlockResponseScalarEValueSetOnCube_le_eMax + apply Ch02.mem_normalizedBlockResponseScalarEValueSetOnCube_iff.mpr + refine ⟨e, he, ?_⟩ + have hA := rootPointwiseCoeffFamily_descendant_aeeq Q a hk hR + rw [← Ch02.doubledResponseJ_eq_ofAEEq hA.symm] + +/-- The real and extended-real one-cube response maxima agree exactly for the +canonical root family and every descendant of its root. -/ +theorem normalizedBlockResponseScalarEMaxOnCube_eq_ofReal_rootPointwise + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + Ch02.normalizedBlockResponseScalarEMaxOnCube R + (a.restrictToSubcube (openCubeSet_subset_of_mem_descendantsAtScale hk hR)) + sigma0 hsigma0 = + ENNReal.ofReal (Ch02.normalizedBlockResponseMax R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + apply le_antisymm + · exact normalizedBlockResponseScalarEMaxOnCube_le_ofReal_rootPointwise + Q a sigma0 hsigma0 hk hR + · exact ofReal_normalizedBlockResponseMax_le_rootPointwise Q a sigma0 hsigma0 hk hR + +/-- At every physical scale, the canonical parent extended-real maximum is the +nonnegative encoding of the legacy finite descendant maximum for the root +pointwise family. -/ +theorem parentTruncatedNormalizedBlockResponseScalarEMaxAtScale_eq_ofReal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (k : ℤ) (hk : k ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) : + Ch02.parentTruncatedNormalizedBlockResponseScalarEMaxAtScale Q k hk a sigma0 hsigma0 = + ENNReal.ofReal (Ch02.maxDescendantNormalizedBlockResponseAtScale Q k + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + classical + let S := descendantsAtScale Q k + let F : {R // R ∈ S} → ℝ≥0∞ := fun R => + Ch02.normalizedBlockResponseScalarEMaxOnCube R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk R.2)) sigma0 hsigma0 + let G : TriadicCube d → ℝ := fun R => Ch02.normalizedBlockResponseMax R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + have hS_nonempty : S.Nonempty := by + simpa [S] using descendantsAtScale_nonempty Q hk + have hG_bdd : BddAbove (G '' (↑S : Set (TriadicCube d))) := + (S.finite_toSet.image G).bddAbove + have hF_top : ∀ R : {R // R ∈ S}, F R < ∞ := by + intro R + exact Ch02.normalizedBlockResponseScalarEMaxOnCube_lt_top R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk R.2)) sigma0 hsigma0 + have hsup_top : S.attach.sup F < ∞ := by + exact (Finset.sup_lt_iff bot_lt_top).mpr fun R _ => hF_top R + have hleft : S.attach.sup F ≤ ENNReal.ofReal (Ch02.finsetSupReal S G) := by + apply Finset.sup_le + intro R _ + change Ch02.normalizedBlockResponseScalarEMaxOnCube R.1 + (a.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtScale hk R.2)) sigma0 hsigma0 ≤ + ENNReal.ofReal (Ch02.finsetSupReal S G) + rw [normalizedBlockResponseScalarEMaxOnCube_eq_ofReal_rootPointwise + Q a sigma0 hsigma0 hk R.2] + apply ENNReal.ofReal_le_ofReal + exact le_csSup hG_bdd ⟨R.1, R.2, rfl⟩ + have hright : ENNReal.ofReal (Ch02.finsetSupReal S G) ≤ S.attach.sup F := by + rw [← ENNReal.ofReal_toReal hsup_top.ne] + apply ENNReal.ofReal_le_ofReal + unfold Ch02.finsetSupReal + apply csSup_le + · rcases hS_nonempty with ⟨R, hR⟩ + exact ⟨G R, ⟨R, hR, rfl⟩⟩ + rintro x ⟨R, hR, rfl⟩ + dsimp [G] + rw [← ENNReal.toReal_ofReal + (Ch02.normalizedBlockResponseMax_nonneg R (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0))] + apply ENNReal.toReal_mono hsup_top.ne + calc + ENNReal.ofReal (G R) = F ⟨R, hR⟩ := by + symm + exact normalizedBlockResponseScalarEMaxOnCube_eq_ofReal_rootPointwise + Q a sigma0 hsigma0 hk hR + _ ≤ S.attach.sup F := Finset.le_sup (s := S.attach) (f := F) (by simp) + change S.attach.sup F = ENNReal.ofReal (Ch02.finsetSupReal S G) + exact le_antisymm hleft hright + +private theorem summable_rootPointwise_infinity_one_terms {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (s : FractionalOrder) : + Summable (fun j : ℕ => Ch02.geometricWeight s.1 1 j * + Ch02.scaleResponseAtScale Q (n - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + have hOld : Summable (fun j : ℕ => Homogenization.geometricWeight s.1 1 j * + Ch02.scaleResponseAtScale Q (n - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s.1) (q := 1) + (C := Real.rpow + (Ch02.normalizedBlockResponseUniformBound Q (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) (1 / 2 : ℝ)) + (by simpa using s.2.1) ?_ ?_ + · intro j + exact Ch02.scaleResponseAtScale_infinity_nonneg Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + · intro j + exact Ch02.scaleResponseAtScale_infinity_le_uniform Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + simpa [Ch02.geometricWeight_eq_old] using hOld + +/-- The canonical frozen `q = 1` parent error is exactly the extended-real +encoding of the legacy finite homogenization error for the root family. -/ +theorem parentTruncatedHomogenizationErrorInfinityOneScalar_eq_ofReal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s : FractionalOrder) : + Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar Q n hn a sigma0 hsigma0 s = + ENNReal.ofReal (Ch02.HomogenizationErrorFinite Q n s.1 .infinity 1 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + rw [Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar_eq_tsum, + Ch02.homogenizationErrorFinite_infinity_one_eq_tsum, + ENNReal.ofReal_tsum_of_nonneg] + · apply tsum_congr + intro j + have hjk : n - (j : ℤ) ≤ Q.scale := + (sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn + have hmax_nonneg := Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q hjk + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + rw [Ch02.scaleResponseAtScale_infinity_eq, + parentTruncatedNormalizedBlockResponseScalarEMaxAtScale_eq_ofReal + Q (n - (j : ℤ)) hjk a sigma0 hsigma0, + ENNReal.ofReal_rpow_of_nonneg hmax_nonneg (by norm_num : (0 : ℝ) ≤ 1 / 2)] + have hdisc : 0 ≤ 1 - Real.rpow 3 (-s.1) := by + simpa [Homogenization.geometricDiscount] using + (Homogenization.geometricDiscount_nonneg + (show 0 ≤ s.1 * (1 : ℝ) by nlinarith [s.2.1])) + have hweight : 0 ≤ (1 - Real.rpow 3 (-s.1)) * + Real.rpow 3 (-s.1 * (j : ℝ)) := + mul_nonneg hdisc (Real.rpow_nonneg (by norm_num) _) + rw [← ENNReal.ofReal_mul hdisc, ← ENNReal.ofReal_mul hweight] + simp only [Ch02.geometricWeight, Ch02.geometricDiscount] + congr 1 + change (1 - Real.rpow 3 (-s.1)) * Real.rpow 3 (-s.1 * (j : ℝ)) * + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) ^ (1 / 2 : ℝ)) = + Ch02.geometricWeight s.1 1 j * + Real.rpow + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + (1 / 2 : ℝ) + change (1 - Real.rpow 3 (-s.1)) * Real.rpow 3 (-s.1 * (j : ℝ)) * + Real.rpow + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + (1 / 2 : ℝ) = _ + unfold Ch02.geometricWeight Ch02.geometricDiscount + ring_nf + · intro j + refine mul_nonneg ?_ ?_ + · simpa [Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s.1) (q := 1) j + (show 0 ≤ s.1 * (1 : ℝ) by nlinarith [s.2.1])) + · exact Ch02.scaleResponseAtScale_infinity_nonneg Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + · exact summable_rootPointwise_infinity_one_terms Q n hn a sigma0 s + +private theorem summable_rootPointwise_infinity_two_terms {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (s : FractionalOrder) : + Summable (fun j : ℕ => Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + have hOld : Summable (fun j : ℕ => Homogenization.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + refine Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s.1) (q := 2) + (C := Ch02.normalizedBlockResponseUniformBound Q (rootPointwiseCoeffFamily Q a) + (scalarMatrix (d := d) sigma0)) + (by nlinarith [s.2.1]) ?_ ?_ + · intro j + exact Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + · intro j + exact Ch02.maxDescendantNormalizedBlockResponseAtScale_le_uniform Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + simpa [Ch02.geometricWeight_eq_old] using hOld + +/-- The canonical frozen `q = 2` parent error is exactly the extended-real +encoding of the legacy finite homogenization error for the root family. -/ +theorem parentTruncatedHomogenizationErrorInfinityTwoScalar_eq_ofReal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + (s : FractionalOrder) : + Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar Q n hn a sigma0 hsigma0 s = + ENNReal.ofReal (Ch02.HomogenizationErrorFinite Q n s.1 .infinity 2 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + rw [Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar_eq_tsum] + unfold Ch02.HomogenizationErrorFinite + have hterm : (fun j : ℕ => + Ch02.geometricWeight s.1 2 j * + Real.rpow (Ch02.scaleResponseAtScale Q (n - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) 2) = + fun j : ℕ => Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) := by + funext j + congr 1 + exact Ch02.scaleResponseAtScale_infinity_rpow_two_eq Q + (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + rw [hterm] + have hsum_nonneg : 0 ≤ ∑' j : ℕ, + Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) := by + refine tsum_nonneg fun j => mul_nonneg ?_ ?_ + · simpa [Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s.1) (q := 2) j + (show 0 ≤ s.1 * (2 : ℝ) by nlinarith [s.2.1])) + · exact Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + have hencode : ENNReal.ofReal + (Real.rpow (∑' j : ℕ, + Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) (1 / 2 : ℝ)) = + ENNReal.ofReal (∑' j : ℕ, + Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n - (j : ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ^ + (1 / 2 : ℝ) := + (ENNReal.ofReal_rpow_of_nonneg hsum_nonneg (by norm_num)).symm + rw [hencode] + congr 1 + rw [ENNReal.ofReal_tsum_of_nonneg] + · apply tsum_congr + intro j + have hjk : n - (j : ℤ) ≤ Q.scale := + (sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn + rw [parentTruncatedNormalizedBlockResponseScalarEMaxAtScale_eq_ofReal + Q (n - (j : ℤ)) hjk a sigma0 hsigma0] + have hdisc : 0 ≤ 1 - Real.rpow 3 (-s.1 * 2) := by + simpa [Homogenization.geometricDiscount] using + (Homogenization.geometricDiscount_nonneg + (show 0 ≤ s.1 * (2 : ℝ) by nlinarith [s.2.1])) + have hweight : 0 ≤ (1 - Real.rpow 3 (-s.1 * 2)) * + Real.rpow 3 (-s.1 * 2 * (j : ℝ)) := + mul_nonneg hdisc (Real.rpow_nonneg (by norm_num) _) + rw [← ENNReal.ofReal_mul hdisc, ← ENNReal.ofReal_mul hweight] + simp only [Ch02.geometricWeight, Ch02.geometricDiscount] + · intro j + refine mul_nonneg ?_ ?_ + · simpa [Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s.1) (q := 2) j + (show 0 ≤ s.1 * (2 : ℝ) by nlinarith [s.2.1])) + · exact Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q + ((sub_le_self n (by exact_mod_cast Nat.zero_le j)).trans hn) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + · exact summable_rootPointwise_infinity_two_terms Q n hn a sigma0 s + +/-- The one-scale response comparison used in the exact shifted parent-error +series. A descendant's on-cube term at depth `j` is controlled by the root +family at the matching physical scale `n - (h + j)`. -/ +theorem rootPointwise_scaleResponse_shift_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) + (hR : R ∈ descendantsAtScale Q k) (j : ℕ) : + Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) ≤ + Ch02.scaleResponseAtScale Q + (n - ((j + Int.toNat (n - k) : ℕ) : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) := by + have hkQ : k ≤ Q.scale := hkn.trans hn + have hh : (Int.toNat (n - k) : ℤ) = n - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkn) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hl : R.scale - (j : ℤ) ≤ R.scale := by omega + have hscale : R.scale - (j : ℤ) = n - ((j + Int.toNat (n - k) : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + rw [← hscale] + exact Ch02.scaleResponseAtScale_infinity_le_of_mem_descendantsAtScale + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) hR hl + +/-- The source-family-facing on-cube `q = 1` response series is summable on +every descendant. -/ +theorem summable_rootPointwise_descendant_infinity_one_terms + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) {R : TriadicCube d} {k : ℤ} + (_hR : R ∈ descendantsAtScale Q k) (sigma0 : ℝ) (s : FractionalOrder) : + Summable (fun j : ℕ => Ch02.geometricWeight s.1 1 j * + Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + exact Ch02.summable_homogenizationErrorOnCube_infinity_one_terms R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) s.2.1 + +private theorem rootPointwise_weight_one_nonneg (s : FractionalOrder) (j : ℕ) : + 0 ≤ Ch02.geometricWeight s.1 1 j := by + have h := Homogenization.geometricWeight_nonneg (s := s.1) (q := (1 : ℝ)) j + (show 0 ≤ s.1 * (1 : ℝ) by nlinarith [s.2.1]) + simpa [Ch02.geometricWeight_eq_old] using h + +private theorem rootPointwise_descendant_infinity_one_le_parent_real + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) (hR : R ∈ descendantsAtScale Q k) + (s : FractionalOrder) : + Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 1) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) ≤ + Real.rpow 3 (s.1 * (Int.toNat (n - k) : ℝ)) * + Ch02.HomogenizationErrorFinite Q n s.1 .infinity 1 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) := by + let h : ℕ := Int.toNat (n - k) + let fQ : ℕ → ℝ := fun j => Ch02.geometricWeight s.1 1 j * + Ch02.scaleResponseAtScale Q (n - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let fR : ℕ → ℝ := fun j => Ch02.geometricWeight s.1 1 j * + Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let c : ℝ := Real.rpow 3 (s.1 * (h : ℝ)) + have hsum : Summable fQ := by + simpa [fQ] using summable_rootPointwise_infinity_one_terms Q n hn a sigma0 s + have hq : ∀ j : ℕ, 0 ≤ fQ j := by + intro j + exact mul_nonneg (rootPointwise_weight_one_nonneg s j) + (Ch02.scaleResponseAtScale_infinity_nonneg Q (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + have hc : 0 ≤ c := Real.rpow_nonneg (by norm_num) _ + have hterm : ∀ j : ℕ, fR j ≤ c * fQ (j + h) := by + intro j + have hw : Ch02.geometricWeight s.1 1 j = + c * Ch02.geometricWeight s.1 1 (j + h) := by + simpa [c, h, Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_one_shift (s := s.1) h j + have hresp := rootPointwise_scaleResponse_shift_le Q n hn a sigma0 hkn hR j + calc + fR j = c * (Ch02.geometricWeight s.1 1 (j + h) * + Ch02.scaleResponseAtScale R (R.scale - (j : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + dsimp [fR]; rw [hw]; ring + _ ≤ c * (Ch02.geometricWeight s.1 1 (j + h) * + Ch02.scaleResponseAtScale Q (n - ((j + h : ℕ) : ℤ)) .infinity + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + apply mul_le_mul_of_nonneg_left _ hc + exact mul_le_mul_of_nonneg_left hresp (rootPointwise_weight_one_nonneg s (j + h)) + _ = c * fQ (j + h) := by rfl + have hr : ∀ j : ℕ, 0 ≤ fR j := by + intro j + exact mul_nonneg (rootPointwise_weight_one_nonneg s j) + (Ch02.scaleResponseAtScale_infinity_nonneg R (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + have htail : Summable (fun j : ℕ => fQ (j + h)) := (summable_nat_add_iff h).2 hsum + have hscaled : Summable (fun j : ℕ => c * fQ (j + h)) := htail.mul_left c + have hrsum : Summable fR := Summable.of_nonneg_of_le hr hterm hscaled + have hmain := Summable.tsum_le_tsum hterm hrsum hscaled + have htail_le : ∑' j : ℕ, fQ (j + h) ≤ ∑' j : ℕ, fQ j := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hpref : 0 ≤ ∑ i ∈ Finset.range h, fQ i := + Finset.sum_nonneg fun i _ => hq i + linarith + calc + Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 1) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) = ∑' j, fR j := by + rw [Ch02.homogenizationErrorOnCube_infinity_one_eq_tsum] + _ ≤ ∑' j, c * fQ (j + h) := hmain + _ = c * ∑' j, fQ (j + h) := by simpa using Summable.tsum_mul_left c htail + _ ≤ c * ∑' j, fQ j := mul_le_mul_of_nonneg_left htail_le hc + _ = c * Ch02.HomogenizationErrorFinite Q n s.1 .infinity 1 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) := by + rw [Ch02.homogenizationErrorFinite_infinity_one_eq_tsum] + +/-- Exact shifted localization of a descendant on-cube `q = 1` error by the +canonical parent-truncated error. -/ +theorem rootPointwise_descendant_infinity_one_le_parent + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) (hR : R ∈ descendantsAtScale Q k) + (s : FractionalOrder) : + ENNReal.ofReal (Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 1) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 (s.1 * (Int.toNat (n-k) : ℝ))) * + Ch02.parentTruncatedHomogenizationErrorInfinityOneScalar Q n hn a sigma0 hsigma0 s := by + rw [parentTruncatedHomogenizationErrorInfinityOneScalar_eq_ofReal] + have hc : 0 ≤ Real.rpow 3 (s.1 * (Int.toNat (n-k) : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + rw [← ENNReal.ofReal_mul hc] + exact ENNReal.ofReal_le_ofReal + (rootPointwise_descendant_infinity_one_le_parent_real Q n hn a sigma0 hkn hR s) + +private theorem rootPointwise_weight_two_nonneg (s : FractionalOrder) (j : ℕ) : + 0 ≤ Ch02.geometricWeight s.1 2 j := by + have h := Homogenization.geometricWeight_nonneg (s := s.1) (q := (2 : ℝ)) j + (show 0 ≤ s.1 * (2 : ℝ) by nlinarith [s.2.1]) + simpa [Ch02.geometricWeight_eq_old] using h + +private theorem rootPointwise_descendant_infinity_two_sq_le_parent_sq + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) (hR : R ∈ descendantsAtScale Q k) + (s : FractionalOrder) : + (Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ^ 2 ≤ + Real.rpow 3 (2 * s.1 * (Int.toNat (n-k) : ℝ)) * + (Ch02.HomogenizationErrorFinite Q n s.1 .infinity 2 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ^ 2 := by + let h := Int.toNat (n-k) + let fQ : ℕ → ℝ := fun j => Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n-(j:ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let fR : ℕ → ℝ := fun j => Ch02.geometricWeight s.1 2 j * + Ch02.maxDescendantNormalizedBlockResponseAtScale R (R.scale-(j:ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let c : ℝ := Real.rpow 3 (s.1 * 2 * (h:ℝ)) + have hsum : Summable fQ := by simpa [fQ] using + summable_rootPointwise_infinity_two_terms Q n hn a sigma0 s + have hq : ∀ j : ℕ, 0 ≤ fQ j := by + intro j; exact mul_nonneg (rootPointwise_weight_two_nonneg s j) + (Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + have hc : 0 ≤ c := Real.rpow_nonneg (by norm_num) _ + have hterm : ∀ j : ℕ, fR j ≤ c * fQ (j+h) := by + intro j + have hw : Ch02.geometricWeight s.1 2 j = c * Ch02.geometricWeight s.1 2 (j+h) := by + simpa [c, h, Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_shift (s := s.1) (q := (2:ℝ)) h j + have hl : R.scale-(j:ℤ) ≤ R.scale := by omega + have hresp := Ch02.maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) hR hl + have hscale : R.scale-(j:ℤ) = n-((j+h:ℕ):ℤ) := by + have hh : (h:ℤ) = n-k := Int.toNat_of_nonneg (sub_nonneg.mpr hkn) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + rw [hRscale, Nat.cast_add, hh]; ring + calc + fR j = c * (Ch02.geometricWeight s.1 2 (j+h) * + Ch02.maxDescendantNormalizedBlockResponseAtScale R (R.scale-(j:ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + dsimp [fR]; rw [hw]; ring + _ ≤ c * (Ch02.geometricWeight s.1 2 (j+h) * + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (n-((j+h:ℕ):ℤ)) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := by + apply mul_le_mul_of_nonneg_left _ hc + exact mul_le_mul_of_nonneg_left (by simpa [hscale] using hresp) + (rootPointwise_weight_two_nonneg s (j+h)) + _ = c * fQ (j+h) := by rfl + have hr : ∀ j : ℕ, 0 ≤ fR j := by + intro j; exact mul_nonneg (rootPointwise_weight_two_nonneg s j) + (Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg R (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) + have htail : Summable (fun j : ℕ => fQ (j+h)) := (summable_nat_add_iff h).2 hsum + have hscaled : Summable (fun j : ℕ => c*fQ (j+h)) := htail.mul_left c + have hrsum : Summable fR := Summable.of_nonneg_of_le hr hterm hscaled + have hmain := Summable.tsum_le_tsum hterm hrsum hscaled + have htail_le : ∑' j : ℕ, fQ (j+h) ≤ ∑' j : ℕ, fQ j := by + have hs := hsum.sum_add_tsum_nat_add h + have hp : 0 ≤ ∑ i ∈ Finset.range h, fQ i := Finset.sum_nonneg fun i _ => hq i + linarith + rw [Ch02.homogenizationErrorOnCube_infinity_two_sq_eq_tsum R s.2.1, + Ch02.homogenizationErrorFinite_infinity_two_sq_eq_tsum Q hn s.2.1] + have hceq : c = Real.rpow 3 (2 * s.1 * (Int.toNat (n-k) : ℝ)) := by + dsimp [c, h] + congr 1 + ring + rw [← hceq] + change (∑' j, fR j) ≤ c * (∑' j, fQ j) + calc + ∑' j, fR j ≤ ∑' j, c*fQ (j+h) := hmain + _ = c * ∑' j, fQ (j+h) := by simpa using Summable.tsum_mul_left c htail + _ ≤ c * ∑' j, fQ j := mul_le_mul_of_nonneg_left htail_le hc + +/-- Exact shifted localization of a descendant on-cube `q = 2` error by the +canonical parent-truncated error. -/ +theorem rootPointwise_descendant_infinity_two_le_parent + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) (hR : R ∈ descendantsAtScale Q k) + (s : FractionalOrder) : + ENNReal.ofReal (Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 (s.1 * (Int.toNat (n-k) : ℝ))) * + Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar Q n hn a sigma0 hsigma0 s := by + rw [parentTruncatedHomogenizationErrorInfinityTwoScalar_eq_ofReal] + have hreal := rootPointwise_descendant_infinity_two_sq_le_parent_sq + Q n hn a sigma0 hkn hR s + let x := Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let y := Ch02.HomogenizationErrorFinite Q n s.1 .infinity 2 + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) + let c := Real.rpow 3 (s.1 * (Int.toNat (n-k) : ℝ)) + have hx : 0 ≤ x := by + unfold x Ch02.HomogenizationErrorOnCube Ch02.HomogenizationError + Ch02.HomogenizationErrorFinite + apply Real.rpow_nonneg + refine tsum_nonneg fun j => mul_nonneg ?_ ?_ + · exact rootPointwise_weight_two_nonneg s j + · exact Real.rpow_nonneg + (Ch02.scaleResponseAtScale_infinity_nonneg R (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) _ + have hy : 0 ≤ y := by + unfold y Ch02.HomogenizationErrorFinite + apply Real.rpow_nonneg + refine tsum_nonneg fun j => mul_nonneg ?_ ?_ + · exact rootPointwise_weight_two_nonneg s j + · exact Real.rpow_nonneg + (Ch02.scaleResponseAtScale_infinity_nonneg Q (by omega) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) _ + have hc : 0 ≤ c := Real.rpow_nonneg (by norm_num) _ + have hcSq : c ^ 2 = Real.rpow 3 (2 * s.1 * (Int.toNat (n-k) : ℝ)) := by + rw [show c ^ 2 = Real.rpow c (2 : ℝ) by simp] + dsimp [c] + rw [← Real.rpow_mul (by norm_num : 0 ≤ (3:ℝ))] + congr 1 + ring + change ENNReal.ofReal x ≤ ENNReal.ofReal c * ENNReal.ofReal y + rw [← ENNReal.ofReal_mul hc] + apply ENNReal.ofReal_le_ofReal + have hsq : x ^ 2 ≤ (c * y) ^ 2 := by + rw [mul_pow, hcSq] + simpa [x, y, c, mul_assoc] using hreal + by_contra h + have hlt : c * y < x := lt_of_not_ge h + have hcy : 0 ≤ c * y := mul_nonneg hc hy + have hpos : 0 < (x - c * y) * (x + c * y) := by + apply mul_pos (sub_pos.mpr hlt) + nlinarith + nlinarith + + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponseOrder.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponseOrder.lean new file mode 100644 index 0000000000..36bccc160f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/LocalCoarseGrainingResponseOrder.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.LocalCoarseGrainingResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl + +/-! +# Order lowering for the local coarse-graining response + +The frozen local theorem uses a `q = 2` response at the local order and the +parent-truncated response at a smaller order. This module supplies that +order-lowering step before the existing exact descendant localization. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +private theorem homogenizationErrorOnCube_infinity_two_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + 0 ≤ Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0 := by + unfold Ch02.HomogenizationErrorOnCube Ch02.HomogenizationError + Ch02.HomogenizationErrorFinite + apply Real.rpow_nonneg + refine tsum_nonneg fun n => mul_nonneg ?_ ?_ + · simpa [Ch02.geometricWeight_eq_old] using + (Homogenization.geometricWeight_nonneg (s := s) (q := (2 : ℝ)) n + (by nlinarith)) + · exact Real.rpow_nonneg + (Ch02.scaleResponseAtScale_infinity_nonneg Q (by omega) a a0) _ + +/-- For the finite `q = 2` homogenization error, lowering the fractional +order can only increase the on-cube error. -/ +theorem homogenizationErrorOnCube_infinity_two_le_of_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {t s : ℝ} (ht : 0 < t) (hts : t < s) : + Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0 ≤ + Ch02.HomogenizationErrorOnCube Q t .infinity (.finite 2) a a0 := by + let H : ℕ → ℝ := fun n => + Ch02.maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (n : ℤ)) a a0 + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by omega + exact Ch02.maxDescendantNormalizedBlockResponseAtScale_le_of_le Q hkl + (sub_le_self Q.scale (by exact_mod_cast Nat.zero_le m)) a a0 + have hnonneg : ∀ n : ℕ, 0 ≤ H n := by + intro n + exact Ch02.maxDescendantNormalizedBlockResponseAtScale_nonneg Q + (sub_le_self Q.scale (by exact_mod_cast Nat.zero_le n)) a a0 + have hsumOld : Summable (fun n : ℕ => + Homogenization.geometricWeight t 2 n * H n) := by + simpa [H, Ch02.geometricWeight_eq_old] using + Ch02.summable_geometricWeight_two_mul_maxDescendantNormalizedBlockResponseAtScale + Q a a0 ht + have hseriesOld := Homogenization.tsum_geometricWeight_le_of_monotone + hmono hnonneg (q := (2 : ℝ)) (by norm_num) ht hts hsumOld + have hseries : + ∑' n : ℕ, Ch02.geometricWeight s 2 n * H n ≤ + ∑' n : ℕ, Ch02.geometricWeight t 2 n * H n := by + simpa [Ch02.geometricWeight_eq_old] using hseriesOld + have hs : 0 < s := lt_trans ht hts + have hsq : + (Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 2) a a0) ^ 2 ≤ + (Ch02.HomogenizationErrorOnCube Q t .infinity (.finite 2) a a0) ^ 2 := by + rw [Ch02.homogenizationErrorOnCube_infinity_two_sq_eq_tsum Q hs a a0, + Ch02.homogenizationErrorOnCube_infinity_two_sq_eq_tsum Q ht a a0] + exact hseries + exact le_of_sq_le_sq hsq (homogenizationErrorOnCube_infinity_two_nonneg Q a a0 ht) + +/-- A descendant's local finite-`q = 2` response at order `s` is controlled +by the canonical parent-truncated response at every smaller positive order +`t`, with the existing exact triadic localization factor evaluated at `t`. -/ +theorem rootPointwise_descendant_infinity_two_le_parent_of_lt + {d : ℕ} [NeZero d] (Q : TriadicCube d) (n : ℤ) (hn : n ≤ Q.scale) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (sigma0 : ℝ) (hsigma0 : 0 < sigma0) + {R : TriadicCube d} {k : ℤ} (hkn : k ≤ n) (hR : R ∈ descendantsAtScale Q k) + (t s : FractionalOrder) (hts : t.1 < s.1) : + ENNReal.ofReal (Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Real.rpow 3 (t.1 * (Int.toNat (n - k) : ℝ))) * + Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar Q n hn a sigma0 hsigma0 t := by + calc + ENNReal.ofReal (Ch02.HomogenizationErrorOnCube R s.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) ≤ + ENNReal.ofReal (Ch02.HomogenizationErrorOnCube R t.1 .infinity (.finite 2) + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0)) := + ENNReal.ofReal_le_ofReal + (homogenizationErrorOnCube_infinity_two_le_of_lt R + (rootPointwiseCoeffFamily Q a) (scalarMatrix (d := d) sigma0) t.2.1 hts) + _ ≤ ENNReal.ofReal (Real.rpow 3 (t.1 * (Int.toNat (n - k) : ℝ))) * + Ch02.parentTruncatedHomogenizationErrorInfinityTwoScalar Q n hn a sigma0 hsigma0 t := + rootPointwise_descendant_infinity_two_le_parent Q n hn a sigma0 hsigma0 hkn hR t + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/NegativeBesov.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/NegativeBesov.lean new file mode 100644 index 0000000000..1fe8112c09 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/ABK26/NegativeBesov.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! +# ABK26 running-scale negative Besov seminorm + +This file owns the literal finite-`p` concrete negative Besov quantity used +by the Chapter 3 local coarse-graining statement. Its summation variable is +the descendant depth `j`; the physical source scale is consequently +`Q.scale - j` at every summand. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The unrooted running-scale depth contribution to the concrete finite-`p` +negative Besov seminorm. -/ +noncomputable def cubeEuclideanNegativeBesovDepthEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (j : ℕ) : ℝ≥0∞ := by + classical + exact ENNReal.ofReal + (Real.rpow 3 + (s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ)))) * + ((descendantsAtScale Q (Q.scale - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (Q.scale - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal ‖cubeAverageVec R.1 F.toField‖) ^ + p.exponent.toReal) + +/-- The source-facing concrete negative Besov seminorm. Its running-scale +weight is evaluated at the descendant scale `Q.scale - j`, rather than frozen +at the parent scale. -/ +noncomputable def cubeEuclideanNegativeBesovESeminorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : ℝ≥0∞ := by + classical + exact (∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ)))) * + ((descendantsAtScale Q (Q.scale - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (Q.scale - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal ‖cubeAverageVec R.1 F.toField‖) ^ + p.exponent.toReal)) ^ (1 / p.exponent.toReal) + +/-- Exact depth decomposition of the source-facing negative Besov seminorm. -/ +theorem cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + cubeEuclideanNegativeBesovESeminorm Q s p F = + (∑' j : ℕ, cubeEuclideanNegativeBesovDepthEnergy Q s p F j) ^ + (p.exponent.toReal)⁻¹ := by + rw [cubeEuclideanNegativeBesovESeminorm] + simp only [cubeEuclideanNegativeBesovDepthEnergy, one_div] + +theorem cubeEuclideanNegativeBesovDepthEnergy_nonneg {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (j : ℕ) : + 0 ≤ cubeEuclideanNegativeBesovDepthEnergy Q s p F j := + bot_le + +theorem cubeEuclideanNegativeBesovESeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + 0 ≤ cubeEuclideanNegativeBesovESeminorm Q s p F := + bot_le + +theorem cubeEuclideanNegativeBesovDepthEnergy_zero {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + cubeEuclideanNegativeBesovDepthEnergy Q s p F 0 = + ENNReal.ofReal + (Real.rpow 3 (s.1 * p.exponent.toReal * (Q.scale : ℝ))) * + (ENNReal.ofReal ‖cubeAverageVec Q F.toField‖) ^ p.exponent.toReal := by + classical + unfold cubeEuclideanNegativeBesovDepthEnergy + have hzero : Q.scale - ((0 : ℕ) : ℤ) = Q.scale := by omega + rw [hzero, descendantsAtScale_self] + let q : {R // R ∈ ({Q} : Finset (TriadicCube d))} := ⟨Q, by simp⟩ + have hattach : ({Q} : Finset (TriadicCube d)).attach = {q} := by + apply Finset.eq_singleton_iff_unique_mem.mpr + constructor + · simp [q] + intro R _ + apply Subtype.ext + simpa [q] using (Finset.mem_singleton.mp R.property) + rw [hattach] + simp [q] + +theorem cubeEuclideanNegativeBesovESeminorm_congr_ae {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F G : CubeEuclideanLpField Q FiniteLpExponent.two) + (hFG : F.toField =ᵐ[normalizedCubeMeasure Q] G.toField) : + cubeEuclideanNegativeBesovESeminorm Q s p F = + cubeEuclideanNegativeBesovESeminorm Q s p G := by + have hcube : F.toField =ᵐ[cubeMeasure Q] G.toField := + Gagliardo.ae_normalizedCubeMeasure_iff.mp hFG + rw [cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy, + cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy] + congr 1 + apply tsum_congr + intro j + unfold cubeEuclideanNegativeBesovDepthEnergy + congr 1 + apply Finset.sum_congr rfl + intro R _ + have hscale : Q.scale - (j : ℤ) ≤ Q.scale := by omega + have hsub : cubeSet R.1 ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtScale hscale R.2 + have hR : F.toField =ᵐ[volume.restrict (cubeSet R.1)] G.toField := by + rw [cubeMeasure] at hcube + exact ae_restrict_of_ae_restrict_of_subset hsub hcube + rw [cubeAverageVec_eq_of_ae_eq_on_cubeSet hR] + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions.lean new file mode 100644 index 0000000000..d076abdb9c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions.lean @@ -0,0 +1,607 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions.Basic + +/-! # Definitions -/ + +@[expose] public section + +open scoped BigOperators ENNReal Pointwise + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Chapter 3 public vocabulary + +This file contains the note-facing quantities used in Chapter 3. The +coefficient input is the Chapter 2 `TriadicCoeffFamily`, so all ellipticity and +compatibility data remain a.e.-based on open cube domains. +-/ + +noncomputable section + +/-- Normalized integral over an arbitrary measurable set, written as a total +quantity so theorem statements do not need side hypotheses merely to parse. -/ +noncomputable abbrev normalizedSetAverage {d : ℕ} (V : Set (Vec d)) + (f : Vec d → ℝ) : ℝ := + Homogenization.volumeAverage V f + +/-- Normalized `L²` square over a set. -/ +noncomputable def normalizedL2SqOnSet {d : ℕ} (V : Set (Vec d)) + (u : Vec d → ℝ) : ℝ := + normalizedSetAverage V fun x => u x ^ 2 + +/-- Localized coefficient energy for an `H¹` function, using the symmetric part +of the public coefficient representative. -/ +noncomputable def localizedCoeffEnergyValue {d : ℕ} {U : Ch02.Domain d} + (V : Set (Vec d)) (a : Ch02.CoeffOn U) (u : H1Function (U : Set (Vec d))) : + ℝ := + normalizedSetAverage V fun x => + vecDot (u.grad x) (matVecMul (symmPart (a.toCoeffField x)) (u.grad x)) + +/-- The global coefficient-energy norm of a Chapter 2 solution on a cube. -/ +noncomputable def solutionEnergyNorm {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (u : CubeSolution Q a) : ℝ := + Real.sqrt (Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u) + +/-- Weak public formulation of `- div(a grad u) = div g` on a cube, in the +codebase's RHS sign convention. -/ +def IsForcedEquation {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (g : Vec d → Vec d) : Prop := + ∀ φ : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) (u.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +/-- Forced cube solution for the public Chapter 3.2 estimates. -/ +structure ForcedCubeSolution {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (g : Vec d → Vec d) where + toH1 : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + weakSolution : IsForcedEquation Q a toH1 g + +/-- Zero-trace forced solution used by the auxiliary Dirichlet estimate. -/ +structure ZeroTraceForcedCubeSolution {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (g : Vec d → Vec d) where + toH10 : H10Function (Ch02.cubeDomain Q : Set (Vec d)) + weakSolution : IsForcedEquation Q a toH10.toH1Function g + +/-- Boundary-patch forced solution for the RHS Caccioppoli estimate. -/ +structure BoundaryForcedCaccioppoliDatum {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (x : Vec d) (g : Vec d → Vec d) where + toH1 : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + weakSolution : IsForcedEquation Q a toH1 g + zeroTraceOnBoundaryPatch : + Ch01.LocalizedZeroTraceFunctionOn + (Ch02.cubeDomain Q : Set (Vec d)) + (openCubeAtScale x (Q.scale - 1)) + toH1.toFun + +/-- Dirichlet forced solution with boundary datum `h`, formalizing +`v - h ∈ H¹₀(Q)`. -/ +structure DirichletForcedCubeSolution {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (g : Vec d → Vec d) where + toH1 : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + boundaryData : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + weakSolution : IsForcedEquation Q a toH1 g + zeroTraceDifference : + ∃ w : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + w.toH1Function.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => toH1.toFun x - boundaryData.toFun x + +/-- Mean-zero Neumann weak formulation for the public energy consequence. -/ +def IsMeanZeroNeumannForcedEquation {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) + (w : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))) + (g : Vec d → Vec d) : Prop := + ∀ φ : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d)), + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (w.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +/-- Mean-zero Neumann solution of the forced problem on a cube. + +The forcing is centered, matching the variational Neumann statement in the +notes. The sign follows the codebase's RHS convention. -/ +structure NeumannForcedCubeSolution {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (g : Vec d → Vec d) where + toH1MeanZero : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d)) + weakSolution : + IsMeanZeroNeumannForcedEquation Q a toH1MeanZero + (fun x => g x - cubeAverageVec Q g) + +/-- Coefficient-energy norm of an arbitrary public `H¹` function on a cube. -/ +noncomputable def h1EnergyNormOnCube {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + Real.sqrt (localizedCoeffEnergyValue (openCubeSet Q) (a.coeffOn Q) u) + +/-- Energy norm of a forced cube solution. -/ +noncomputable def forcedSolutionEnergyNorm {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) : ℝ := + h1EnergyNormOnCube Q a u.toH1 + +/-- Energy norm of a zero-trace forced solution. -/ +noncomputable def zeroTraceForcedSolutionEnergyNorm {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) {g : Vec d → Vec d} + (u : ZeroTraceForcedCubeSolution Q a g) : ℝ := + h1EnergyNormOnCube Q a u.toH10.toH1Function + +/-- Energy norm of boundary-patch forced Caccioppoli data. -/ +noncomputable def boundaryForcedCaccioppoliCoreEnergy {d : ℕ} + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + {g : Vec d → Vec d} (u : BoundaryForcedCaccioppoliDatum Q a x g) : + ℝ := + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) u.toH1 + +/-- Parent-cube `L²` size of boundary-patch forced Caccioppoli data. -/ +noncomputable def boundaryForcedCaccioppoliParentL2Sq {d : ℕ} + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + {g : Vec d → Vec d} (u : BoundaryForcedCaccioppoliDatum Q a x g) : + ℝ := + normalizedL2SqOnSet (openCubeSet Q) u.toH1.toFun + +/-- Energy norm of a Dirichlet forced solution. -/ +noncomputable def dirichletForcedSolutionEnergyNorm {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) {g : Vec d → Vec d} + (u : DirichletForcedCubeSolution Q a g) : ℝ := + h1EnergyNormOnCube Q a u.toH1 + +/-- Gradient of the boundary datum in a Dirichlet forced solution. -/ +noncomputable def dirichletBoundaryGradientField {d : ℕ} + {Q : TriadicCube d} {a : CoeffFamily d} {g : Vec d → Vec d} + (u : DirichletForcedCubeSolution Q a g) : Vec d → Vec d := + u.boundaryData.grad + +/-- Energy norm of a mean-zero Neumann forced solution. -/ +noncomputable def neumannForcedSolutionEnergyNorm {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) {g : Vec d → Vec d} + (u : NeumannForcedCubeSolution Q a g) : ℝ := + h1EnergyNormOnCube Q a u.toH1MeanZero.toH1Function + +/-- Gradient field of a cube solution. -/ +noncomputable def solutionGradientField {d : ℕ} {Q : TriadicCube d} + {a : CoeffFamily d} (u : CubeSolution Q a) : Vec d → Vec d := + u.toH1.grad + +/-- Gradient field of a forced cube solution. -/ +noncomputable def forcedSolutionGradientField {d : ℕ} {Q : TriadicCube d} + {a : CoeffFamily d} {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) : Vec d → Vec d := + u.toH1.grad + +/-- Flux field `a ∇u` of a cube solution. -/ +noncomputable def solutionFluxField {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (u : CubeSolution Q a) : Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x) (u.toH1.grad x) + +/-- Flux field `a ∇u` of a forced cube solution. -/ +noncomputable def forcedSolutionFluxField {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) : Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x) (u.toH1.grad x) + +/-- A constant symmetric uniformly elliptic comparison matrix. -/ +structure ConstantCoeffMatrix (d : ℕ) where + matrix : Mat d + isSymm : matrix.IsSymm + lam : ℝ + Lam : ℝ + lam_pos : 0 < lam + lam_le_Lam : lam ≤ Lam + elliptic : IsEllipticMatrix lam Lam matrix + +/-- The factor `|a0|^{1/2}` in the flux-response estimate. -/ +noncomputable def constantCoeffMatrixNormHalf {d : ℕ} + (a0 : ConstantCoeffMatrix d) : ℝ := + Real.rpow (Ch02.matrixNorm a0.matrix) (1 / 2 : ℝ) + +/-- The factor `|a0|` in the inhomogeneous flux-response estimate. -/ +noncomputable def constantCoeffMatrixNorm {d : ℕ} + (a0 : ConstantCoeffMatrix d) : ℝ := + Ch02.matrixNorm a0.matrix + +/-- Flux defect `(a - a0)∇u` against a constant comparison matrix. -/ +noncomputable def solutionFluxDefectField {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) (u : CubeSolution Q a) : + Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x - a0.matrix) (u.toH1.grad x) + +/-- Flux defect `(a - a0)∇u` for a forced solution. -/ +noncomputable def forcedSolutionFluxDefectField {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) : Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x - a0.matrix) (u.toH1.grad x) + +/-- Constant-coefficient weak formulation of `- div(a0 grad u) = div g` on a +cube, in the codebase's RHS sign convention. -/ +def IsConstantCoeffForcedEquation {d : ℕ} (Q : TriadicCube d) + (a0 : ConstantCoeffMatrix d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (g : Vec d → Vec d) : Prop := + ∀ φ : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul a0.matrix (u.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +/-- Constant-coefficient part `a0(∇u - ∇v)` in the homogenization comparison. -/ +noncomputable def homogenizationComparisonConstantGradientField {d : ℕ} + {Q : TriadicCube d} (a0 : ConstantCoeffMatrix d) + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : Vec d → Vec d := + fun x => matVecMul a0.matrix (u.grad x - v.grad x) + +/-- Flux difference `a∇u - a0∇v` in the homogenization comparison. -/ +noncomputable def homogenizationComparisonFluxField {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x) (u.grad x) - + matVecMul a0.matrix (v.grad x) + +/-- Local flux defect `(a - a0)G`, using the coefficient representative on the +cube where the norm is evaluated. -/ +noncomputable def homogenizationComparisonFluxDefectFromGradient {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (G : Vec d → Vec d) : Vec d → Vec d := + fun x => matVecMul ((a.coeffOn Q).toCoeffField x - a0.matrix) (G x) + +/-- Local flux defect `(a - a0)∇u` on a cube. -/ +noncomputable def homogenizationComparisonFluxDefectField {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : Vec d → Vec d := + homogenizationComparisonFluxDefectFromGradient Q a a0 u.grad + +/-- Data for the duality lemma: a pair satisfying +`div(a∇u - a0∇v) = 0` and `u - v ∈ H¹₀(Q)`. -/ +structure HomogenizationComparisonDatum {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) where + u : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + v : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + fluxComparisonSolenoidal : + IsSolenoidalOn (Ch02.cubeDomain Q : Set (Vec d)) + (homogenizationComparisonFluxField Q a a0 u v) + zeroTraceDifference : + ∃ w : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + w.toH1Function.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => u.toFun x - v.toFun x + +/-- Data for the general coarse-graining theorem: two solutions with the same +right-hand side and zero-trace difference. -/ +structure CoarseGrainingComparisonDatum {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) (g : Vec d → Vec d) where + u : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + v : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + uWeakSolution : IsForcedEquation Q a u g + vWeakSolution : IsConstantCoeffForcedEquation Q a0 v g + zeroTraceDifference : + ∃ w : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + w.toH1Function.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => u.toFun x - v.toFun x + +/-- Left-hand side in the Section 3.3 comparison estimates, using the +concrete/circ negative Besov seminorm from the deterministic splitting +arguments. -/ +noncomputable def homogenizationComparisonNegativeBesovLHS {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + cubeBesovNegativeVectorSeminormTwo Q s + (homogenizationComparisonConstantGradientField a0 u v) + + cubeBesovNegativeVectorSeminormTwo Q s + (homogenizationComparisonFluxField Q a a0 u v) + +/-- Localized `ℓ²` average of the concrete/circ flux-defect negative Besov +seminorms over descendants at depth `j = m - n`. If the parent cube has scale +`m = Q.scale`, then the manuscript lower scale is `n = Q.scale - (j : ℤ)`, +which may be negative. -/ +noncomputable def localizedHomogenizationFluxDefectAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (j : ℕ) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + Real.sqrt <| + descendantsAverage Q j fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (homogenizationComparisonFluxDefectFromGradient R a a0 u.grad)) ^ 2 + +/-- Public localized boundary data for the boundary Caccioppoli theorem. + +The zero-trace condition is scalar and localized: every smooth cutoff supported +in the boundary window `x + cu_{m-1}` turns `u` into an admissible `H¹₀` test +function on the parent cube. This is the Lean form of the note's Sobolev trace +condition `u = 0` on `(∂cu_m) ∩ (x + cu_{m-1})`; it deliberately does not use a +gradient-only potential condition, since gradients cannot see constants. -/ +structure BoundaryCaccioppoliDatum {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (x : Vec d) where + toH1 : H1Function (Ch02.cubeDomain Q : Set (Vec d)) + isHarmonic : + IsAHarmonicGradient (a.coeffOn Q).toCoeffField + (Ch02.cubeDomain Q : Set (Vec d)) toH1.grad + zeroTraceOnBoundaryPatch : + Ch01.LocalizedZeroTraceFunctionOn + (Ch02.cubeDomain Q : Set (Vec d)) + (openCubeAtScale x (Q.scale - 1)) + toH1.toFun + +/-- Localized energy of boundary Caccioppoli data on the core patch. -/ +noncomputable def boundaryCaccioppoliCoreEnergy {d : ℕ} {Q : TriadicCube d} + {a : CoeffFamily d} {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) : ℝ := + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) u.toH1 + +/-- Parent-cube `L²` size for boundary Caccioppoli data. -/ +noncomputable def boundaryCaccioppoliParentL2Sq {d : ℕ} {Q : TriadicCube d} + {a : CoeffFamily d} {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) : ℝ := + normalizedL2SqOnSet (openCubeSet Q) u.toH1.toFun + +/-- Localized energy of an interior solution on the core patch. -/ +noncomputable def interiorCaccioppoliCoreEnergy {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (x : Vec d) (u : CubeSolution Q a) : ℝ := + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) u.toH1 + +/-- Parent-cube oscillation `L²` square for the interior Caccioppoli estimate. -/ +noncomputable def interiorCaccioppoliParentOscillationL2Sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (u : CubeSolution Q a) : ℝ := + normalizedL2SqOnSet (openCubeSet Q) fun x => + u.toH1.toFun x - Ch01.Legacy.normalizedAverage Q u.toH1.toFun + +/-- The Caccioppoli prefactor in +`e.coarse.grained.Caccioppoli.*.deterministic.theory`, excluding the final +`L²` square. -/ +noncomputable def caccioppoliPrefactor {d : ℕ} (C : ℝ) (Q : TriadicCube d) + (a : CoeffFamily d) (s t : ℝ) : ℝ := + Real.rpow (C / (1 - s - t)) (2 + 4 * s / (1 - s - t)) * + Real.rpow s (-(2 * s / (1 - s - t))) * + Real.rpow (Ch02.ThetaRatio Q s t a) (s / (1 - s - t)) * + Ch02.LambdaS Q s a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + +/-- Boundary Caccioppoli right-hand side. -/ +noncomputable def boundaryCaccioppoliRHS {d : ℕ} (C : ℝ) + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + (s t : ℝ) (u : BoundaryCaccioppoliDatum Q a x) : ℝ := + caccioppoliPrefactor C Q a s t * boundaryCaccioppoliParentL2Sq u + +/-- Interior Caccioppoli right-hand side. -/ +noncomputable def interiorCaccioppoliRHS {d : ℕ} (C : ℝ) + (Q : TriadicCube d) (a : CoeffFamily d) (s t : ℝ) (u : CubeSolution Q a) : + ℝ := + caccioppoliPrefactor C Q a s t * + interiorCaccioppoliParentOscillationL2Sq Q a u + +/-- The factor `c_{s,q}^{-1/q}`, with value `1` at `q = infinity`. -/ +noncomputable def poincareDiscountFactor (s : ℝ) + (q : Ch02.MultiscaleExponent) : ℝ := + match q with + | .finite q => Real.rpow (Ch02.geometricDiscount s q) (-(1 / q)) + | .infinity => 1 + +/-- The lower-ellipticity factor `\lambda_{s,q}^{-1/2}`. -/ +noncomputable def poincareLowerEllipticityFactor {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (s : ℝ) (q : Ch02.MultiscaleExponent) : ℝ := + Real.rpow (Ch02.lambdaSq Q s q a) (-(1 / 2 : ℝ)) + +/-- The upper-ellipticity factor `\Lambda_{s,q}^{1/2}`. -/ +noncomputable def poincareUpperEllipticityFactor {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (s : ℝ) (q : Ch02.MultiscaleExponent) : ℝ := + Real.rpow (Ch02.LambdaSq Q s q a) (1 / 2 : ℝ) + +/-- Right-hand side in the gradient coarse Poincare estimate. -/ +noncomputable def coarsePoincareGradientRHS {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (s : ℝ) (q : Ch02.MultiscaleExponent) + (u : CubeSolution Q a) : ℝ := + poincareDiscountFactor s q * + poincareLowerEllipticityFactor Q a s q * + solutionEnergyNorm Q a u + +/-- Right-hand side in the flux coarse Poincare estimate. -/ +noncomputable def coarsePoincareFluxRHS {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) (s : ℝ) (q : Ch02.MultiscaleExponent) + (u : CubeSolution Q a) : ℝ := + poincareDiscountFactor s q * + poincareUpperEllipticityFactor Q a s q * + solutionEnergyNorm Q a u + +/-- Right-hand side in the coarse flux-response estimate. -/ +noncomputable def coarseFluxResponseRHS {d : ℕ} [NeZero d] (C : ℝ) + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (u : CubeSolution Q a) : ℝ := + C * s⁻¹ * constantCoeffMatrixNormHalf a0 * + solutionEnergyNorm Q a u * + Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0.matrix + +/-- Right-hand side in the coarse Poincare estimate with forcing. -/ +noncomputable def coarsePoincareWithRHSGradientRHS {d : ℕ} + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (g : Vec d → Vec d) (u : ForcedCubeSolution Q a g) : ℝ := + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + forcedSolutionEnergyNorm Q a u + + C * Real.rpow s (-3 : ℝ) * + Real.rpow (Ch02.lambdaSq Q (s / 2) (.finite 2) a) (-1 : ℝ) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + +/-- Right-hand side in the auxiliary zero-Dirichlet energy estimate. -/ +noncomputable def zeroDirichletEnergyWithRHSRHS {d : ℕ} + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (t : ℝ) (g : Vec d → Vec d) : ℝ := + C * Real.rpow t (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a t (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g + +/-- Common prefactor in the boundary Caccioppoli estimate with forcing. -/ +noncomputable def caccioppoliWithRHSPrefactor {d : ℕ} (C : ℝ) + (Q : TriadicCube d) (a : CoeffFamily d) (s t : ℝ) : ℝ := + Real.rpow (C / (1 - s - t)) (2 + 4 * s / (1 - s - t)) * + Real.rpow s (-(2 * s / (1 - s - t))) * + Real.rpow (Ch02.ThetaRatio Q s t a) ((1 - t) / (1 - s - t)) + +/-- Boundary Caccioppoli right-hand side with forcing. -/ +noncomputable def boundaryCaccioppoliWithRHSRHS {d : ℕ} (C : ℝ) + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + {g : Vec d → Vec d} (s t : ℝ) + (u : BoundaryForcedCaccioppoliDatum Q a x g) : ℝ := + caccioppoliWithRHSPrefactor C Q a s t * + (Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u + + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) + +/-- Right-hand side in the weak flux estimate with forcing. -/ +noncomputable def weakFluxWithRHSRHS {d : ℕ} + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (g : Vec d → Vec d) (u : ForcedCubeSolution Q a g) : ℝ := + C * s⁻¹ * + poincareUpperEllipticityFactor Q a (s / 2) (.finite 2) * + forcedSolutionEnergyNorm Q a u + + C * Real.rpow s (-(5 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a (s / 2) (.finite 2) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + +/-- Right-hand side in the coarse flux-response estimate with forcing. -/ +noncomputable def coarseFluxResponseWithRHSRHS {d : ℕ} [NeZero d] + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) (g : Vec d → Vec d) + (u : ForcedCubeSolution Q a g) : ℝ := + C * s⁻¹ * constantCoeffMatrixNormHalf a0 * + forcedSolutionEnergyNorm Q a u * + Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0.matrix + + C * + (Real.rpow s (-(5 / 2 : ℝ)) * constantCoeffMatrixNormHalf a0 * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0.matrix + + Real.rpow s (-(5 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a (s / 2) (.finite 2) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) + + Real.rpow s (-3 : ℝ) * constantCoeffMatrixNorm a0 * + Real.rpow (Ch02.lambdaSq Q (s / 2) (.finite 2) a) (-1 : ℝ)) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + +/-- Right-hand side in the Dirichlet energy estimate with forcing and boundary +data. -/ +noncomputable def dirichletEnergyWithRHSRHS {d : ℕ} + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (g : Vec d → Vec d) + (u : DirichletForcedCubeSolution Q a g) : ℝ := + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField u) + +/-- Right-hand side in the mean-zero Neumann energy estimate with forcing. -/ +noncomputable def neumannEnergyWithRHSRHS {d : ℕ} + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + +/-- Truncated homogenization error +`\mathcal E_{s,\infty,1}(Q,n; a, a0)`, encoded by descendant depth +`j = m - n`. Equivalently, the manuscript scale is +`n = Q.scale - (j : ℤ)`, so negative `n` are represented by sufficiently large +natural depths `j`. + +This is the Ch3.3 localized envelope: the supremum of the Ch2 one-cube +homogenization error over the depth-`j` descendants of the parent cube. -/ +noncomputable def coarseGrainingHomogenizationErrorAtDepth {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (j : ℕ) : ℝ := + Ch02.finsetSupReal (descendantsAtDepth Q j) fun R => + Ch02.HomogenizationErrorOnCube R s .infinity (.finite 1) a a0.matrix + +/-- Right-hand side in the duality estimate from local flux defect to global +comparison. -/ +noncomputable def dualityFromFluxDefectRHS {d : ℕ} (C : ℝ) + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (j : ℕ) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + C * s⁻¹ * localizedHomogenizationFluxDefectAverage Q a a0 s j u + +/-- Note-facing two-exponent replacement RHS for the duality estimate. + +The comparison field is measured at exponent `s`, while the localized +flux-defect average is measured at the independent lower exponent `t`. +The scalar prefactor is the displayed manuscript loss +`s^{-1} t^{-2} (1/2 - t)^{-1}`. -/ +noncomputable def dualityFromFluxDefectExponentLossRHS {d : ℕ} (C : ℝ) + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s t : ℝ) (j : ℕ) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + C * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * + localizedHomogenizationFluxDefectAverage Q a a0 t j u + +/-- The depth factor `3^{s(m-n)/2}` in the Section 3.3 coarse-graining bound. -/ +noncomputable def coarseGrainingDepthHalfWeight (s : ℝ) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) + +/-- The depth factor `3^{s(m-n)}` in the Section 3.3 coarse-graining bound. -/ +noncomputable def coarseGrainingDepthWeight (s : ℝ) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) + +/-- The inverse depth factor `3^{-s(m-n)}` used by scale-separated forcing. -/ +noncomputable def coarseGrainingDepthInvWeight (s : ℝ) (j : ℕ) : ℝ := + (coarseGrainingDepthWeight s j)⁻¹ + +/-- Scale-separated local flux-defect RHS in the repaired general +coarse-graining estimate. The flux-response quantities are measured at +exponent `r`, while the force is measured at the stronger exponent `r₂`. -/ +noncomputable def generalCoarseGrainingL2TwoExponentFluxDefectRHS {d : ℕ} + [NeZero d] + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (r r₂ : ℝ) (j : ℕ) + (g : Vec d → Vec d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + C * + (r⁻¹ * constantCoeffMatrixNormHalf a0 * + coarseGrainingHomogenizationErrorAtDepth Q a a0 r j * + h1EnergyNormOnCube Q a u + + (Real.rpow r (-(5 / 2 : ℝ)) * constantCoeffMatrixNormHalf a0 * + coarseGrainingDepthHalfWeight r j * + poincareLowerEllipticityFactor Q a (r / 2) (.finite 2) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 r j + + Real.rpow r (-(5 / 2 : ℝ)) * + coarseGrainingDepthWeight r j * + poincareUpperEllipticityFactor Q a (r / 2) (.finite 2) * + poincareLowerEllipticityFactor Q a (r / 2) (.finite 2) + + Real.rpow r (-3 : ℝ) * + coarseGrainingDepthWeight r j * + constantCoeffMatrixNorm a0 * + Real.rpow (Ch02.lambdaSq Q (r / 2) (.finite 2) a) (-1 : ℝ)) * + (coarseGrainingDepthInvWeight r₂ j * + scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g)) + +/-- Note-facing RHS with an independent stronger force exponent `r₂`. The +comparison is measured at exponent `s`, the flux response at `r`, and the +forcing at `r₂`. -/ +noncomputable def generalCoarseGrainingL2TwoExponentRHS {d : ℕ} [NeZero d] + (C : ℝ) (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s r r₂ : ℝ) (j : ℕ) + (g : Vec d → Vec d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + generalCoarseGrainingL2TwoExponentFluxDefectRHS C Q a a0 r r₂ j g u + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions/Basic.lean new file mode 100644 index 0000000000..8d2a5764f8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Definitions/Basic.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSharpKernel +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation + +/-! # Basic Chapter 3 quantities and cube geometry -/ + +@[expose] public section + +open scoped BigOperators ENNReal Pointwise + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Chapter 3 public vocabulary + +This file contains the note-facing quantities used in Chapter 3. The +coefficient input is the Chapter 2 `TriadicCoeffFamily`, so all ellipticity and +compatibility data remain a.e.-based on open cube domains. +-/ + +noncomputable section + +abbrev CoeffFamily (d : ℕ) := + Ch02.TriadicCoeffFamily d + +abbrev CubeSolution {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) := + Ch02.Solution (Ch02.cubeDomain Q) (a.coeffOn Q) + +/-- Public regularity package for the manuscript assumption +`g ∈ H^s(Q; R^d)`, in the form consumed by the deterministic RHS development. -/ +abbrev ForceBesovRegularity {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (g : Vec d → Vec d) : Prop := + CubeVectorBesovHRegularity Q s g + +/-- The depth-`j` block-average square for a vector field on a parent cube. -/ +noncomputable def negativeBesovVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => vecNormSq (cubeAverageVec R F) + +/-- The note-normalized depth contribution in `3^{-s m} B^{-s}_{2,q}`. + +If `R` is a depth-`j` descendant of a scale-`m` cube, the outer factor +`3^{-s m}` combines with the scale of `R` to give this `3^{-s j}` weight. -/ +noncomputable def negativeBesovVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (negativeBesovVectorDepthAverage Q F j) + +/-- Finite-depth vector-valued `3^{-s m} B^{-s}_{2,q}` seminorm for finite +multiscale exponent `q`. -/ +noncomputable def negativeBesovVectorPartialNormFinite {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (N : ℕ) (F : Vec d → Vec d) : ℝ := + Real.rpow + (Finset.sum (Finset.range (N + 1)) fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) + (1 / q) + +/-- Public vector-valued `3^{-s m} B^{-s}_{2,q}` seminorm on a cube of scale +`m`, using Euclidean norms of the cube-averaged vector field. -/ +noncomputable def scaleNormalizedNegativeBesovVectorNorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (q : Ch02.MultiscaleExponent) + (F : Vec d → Vec d) : ℝ := + match q with + | .finite q => + sSup (Set.range fun N : ℕ => + negativeBesovVectorPartialNormFinite Q s q N F) + | .infinity => + sSup (Set.range fun j : ℕ => + negativeBesovVectorDepthSeminorm Q s F j) + +/-- Note-normalized positive `q = 2` Besov seminorm +`3^{s m} [F]_{\underline B^s_{2,2}(Q)}` for vector fields. -/ +noncomputable abbrev scaleNormalizedPositiveBesovVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + cubeBesovPositiveVectorSeminormTwo Q s F + +/-- Note-normalized positive `q = 2` Besov norm for vector fields. + +The positive seminorms in the deterministic RHS layer are already normalized by +the parent scale. The full norm adds the top-scale average, matching +`3^{s m} ||F||_{\underline B^s_{2,2}(Q)}`. -/ +noncomputable def scaleNormalizedPositiveBesovVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + scaleNormalizedPositiveBesovVectorSeminormTwo Q s F + +/-- Public vector-valued genuine dual negative Besov norm, normalized as +`3^{-s m} [F]_{\underline B^{-s}_{2,2}(Q)}`. + +This is deliberately separate from `scaleNormalizedNegativeBesovVectorNorm`, +which is the concrete/circ seminorm used in the homogeneous coarse-graining +estimates. -/ +noncomputable def scaleNormalizedDualNegativeBesovVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Real.rpow (3 : ℝ) (-s * (((Q.scale : ℤ) : ℝ))) * + ∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + +/-- Open cube with arbitrary center and triadic scale. -/ +noncomputable def openCubeAtScale {d : ℕ} (center : Vec d) (m : ℤ) : Set (Vec d) := + { y | ∀ i : Fin d, + |y i - center i| < Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2 } + +theorem isOpen_openCubeAtScale {d : ℕ} (center : Vec d) (m : ℤ) : + IsOpen (openCubeAtScale center m) := by + classical + unfold openCubeAtScale + rw [show + {y : Vec d | ∀ i : Fin d, + |y i - center i| < Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2} = + ⋂ i : Fin d, + {y : Vec d | + |y i - center i| < Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2} by + ext y + simp] + exact isOpen_iInter_of_finite fun i => + isOpen_Iio.preimage + ((continuous_abs.comp ((continuous_apply i).sub continuous_const))) + +theorem measurableSet_openCubeAtScale {d : ℕ} (center : Vec d) (m : ℤ) : + MeasurableSet (openCubeAtScale center m) := + (isOpen_openCubeAtScale center m).measurableSet + +theorem openCubeAtScale_eq_pi_Ioo {d : ℕ} (center : Vec d) (m : ℤ) : + openCubeAtScale center m = + Set.pi Set.univ + (fun i : Fin d => + Set.Ioo + (center i - Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2) + (center i + Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2)) := by + ext y + constructor + · intro hy i _ + rcases (abs_sub_lt_iff.mp (hy i)) with ⟨hleft, hright⟩ + constructor <;> linarith + · intro hy i + rcases hy i (by simp) with ⟨hleft, hright⟩ + exact abs_sub_lt_iff.mpr ⟨by linarith, by linarith⟩ + +theorem openCubeAtScale_zero_eq_openCubeSet_originCube {d : ℕ} (m : ℤ) : + openCubeAtScale (0 : Vec d) m = openCubeSet (originCube d m) := by + rw [openCubeAtScale_eq_pi_Ioo, openCubeSet_eq_pi_Ioo] + simp [originCube, cubeScaleFactor] + congr + funext i + congr <;> ring_nf + +theorem openCubeAtScale_eq_translateSet {d : ℕ} (center : Vec d) (m : ℤ) : + openCubeAtScale center m = + translateSet center (openCubeAtScale (0 : Vec d) m) := by + ext y + rw [mem_translateSet_iff_sub_mem] + simp [openCubeAtScale] + +theorem openCubeAtScale_eq_translateSet_smul_originCube_zero {d : ℕ} + (center : Vec d) (m : ℤ) : + openCubeAtScale center m = + translateSet center + (cubeScaleFactor (originCube d m) • openCubeAtScale (0 : Vec d) 0) := by + rw [openCubeAtScale_eq_translateSet, openCubeAtScale_zero_eq_openCubeSet_originCube, + openCubeSet_originCube_eq_smul_originCube_zero] + rw [← openCubeAtScale_zero_eq_openCubeSet_originCube (d := d) 0] + +theorem openCubeAtScale_eq_translateSet_sub {d : ℕ} + (z center : Vec d) (m : ℤ) : + openCubeAtScale center m = + translateSet z (openCubeAtScale (center - z) m) := by + ext y + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hy i + have hcoord : + (y - z) i - (center - z) i = y i - center i := by + simp [sub_eq_add_neg] + rw [hcoord] + exact hy i + · intro hy i + have hcoord : + (y - z) i - (center - z) i = y i - center i := by + simp [sub_eq_add_neg] + rw [← hcoord] + exact hy i + +/-- The boundary patch `cu_m ∩ (x + cu_{m-1})` used in the boundary +Caccioppoli statement. -/ +noncomputable def boundaryPatchSet {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + Set (Vec d) := + openCubeSet Q ∩ openCubeAtScale x (Q.scale - 1) + +theorem boundaryPatchSet_eq_translateSet_origin {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : + boundaryPatchSet Q x = + translateSet (triadicCubeShift Q) + (boundaryPatchSet (originCube d Q.scale) (x - triadicCubeShift Q)) := by + rw [boundaryPatchSet, + openCubeSet_eq_translateSet_originCube_of_triadicCube Q, + openCubeAtScale_eq_translateSet_sub (triadicCubeShift Q) x (Q.scale - 1), + ← translateSet_inter, boundaryPatchSet] + simp [originCube] + +/-- The smaller local energy patch `cu_m ∩ (x + cu_{m-2})`. -/ +noncomputable def caccioppoliCoreSet {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + Set (Vec d) := + openCubeSet Q ∩ openCubeAtScale x (Q.scale - 2) + +theorem measurableSet_caccioppoliCoreSet {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : + MeasurableSet (caccioppoliCoreSet Q x) := by + exact + (measurableSet_openCubeSet Q).inter + (measurableSet_openCubeAtScale x (Q.scale - 2)) + +theorem caccioppoliCoreSet_eq_translateSet_origin {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : + caccioppoliCoreSet Q x = + translateSet (triadicCubeShift Q) + (caccioppoliCoreSet (originCube d Q.scale) (x - triadicCubeShift Q)) := by + rw [caccioppoliCoreSet, + openCubeSet_eq_translateSet_originCube_of_triadicCube Q, + openCubeAtScale_eq_translateSet_sub (triadicCubeShift Q) x (Q.scale - 2), + ← translateSet_inter, caccioppoliCoreSet] + simp [originCube] + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems.lean new file mode 100644 index 0000000000..5341ce90c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.FluxResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Inhomogeneous +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.DualityPositivePairing +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.HomogenizationBlackBoxes + +/-! # Theorems -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli.lean new file mode 100644 index 0000000000..9d2e1c4526 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliDilationTransport + +/-! # Coarse Caccioppoli -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public coarse Caccioppoli theorem + +This is the canonical public module for the homogeneous coarse Caccioppoli +theorem. It re-exports the final apex theorem proved in +`CoarseCaccioppoliDilationTransport`, while keeping the public import path +stable for downstream note-facing consumers. +-/ + +noncomputable section + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli/Interface.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli/Interface.lean new file mode 100644 index 0000000000..80ed4d61de --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoli/Interface.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZero + +/-! # Interface -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Coarse Caccioppoli interface + +This file keeps the public Prop structure for the arbitrary-scale Caccioppoli +surface. The final unconditional public apex theorem is declared in +`Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliDilationTransport` and +re-exported by `Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli`. + +## Audit tag + +Claim: define the single public arbitrary-scale Caccioppoli package consumed by +the scale-normalization proof from the scale-zero theorem. + +Downstream target: `CoarseCaccioppoli.lean` and `CoarseCaccioppoliRHS/Theory.lean`. +New public Caccioppoli variants must amend the Ch3 surface contract first. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Public theorem package for the boundary and interior coarse-grained +Caccioppoli inequalities. The constant is dimension-only; all exponent +dependence on `s,t` is displayed in the public RHS definitions. The boundary +theorem is local in a center `x ∈ Q`; the interior theorem is the centered cube +estimate from the notes, with arbitrary translated cubes represented by the +choice of `Q`. -/ +structure CoarseCaccioppoliTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} {x : Vec d} + (u : BoundaryCaccioppoliDatum Q a x), + 0 < s → 0 < t → s + t < 1 → x ∈ openCubeSet Q → + boundaryCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliRHS C s t u) ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + (u : CubeSolution Q a), + 0 < s → 0 < t → s + t < 1 → + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + interiorCaccioppoliRHS C Q a s t u) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliDilationTransport.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliDilationTransport.lean new file mode 100644 index 0000000000..3581407417 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliDilationTransport.lean @@ -0,0 +1,868 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli.Interface +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Dilation + +/-! # Coarse Caccioppoli Dilation Transport -/ + +@[expose] public section + +open scoped Pointwise ENNReal + +namespace Homogenization +namespace Book +namespace Ch03 + +noncomputable section + +/-! +# Dilation transport proof for coarse Caccioppoli + +The scale-zero coarse Caccioppoli theorem and public arbitrary-scale target are +imported from `CoarseCaccioppoli.Interface`. This file proves the concrete +normalization witnesses and closes the public arbitrary-scale theorem directly, +without exporting an intermediate bridge package. + +The intended source of the witnesses below is the public Chapter 2 dilation +package, together with the Chapter 1 norm-scaling lemmas. The interface fixes +the normalized cube to `Ch02.dilateCube (-Q.scale) Q`, so downstream code cannot +drift to a different normalization convention. +-/ + +/-- The center of a dilated triadic cube is the dilation of its center. -/ +theorem cubeCenter_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + cubeCenter (Ch02.dilateCube k Q) = Ch02.dilateVec k (cubeCenter Q) := by + ext i + simp [cubeCenter, Ch02.dilateVec, Ch02.cubeScaleFactor_dilateCube, + Pi.smul_apply, smul_eq_mul, mul_assoc, mul_comm, mul_left_comm] + +/-- A triadic open window dilates with its center and scale. -/ +theorem openCubeAtScale_dilateVec {d : ℕ} (k m : ℤ) (x : Vec d) : + openCubeAtScale (Ch02.dilateVec k x) (m + k) = + Ch02.triadicDilationFactor k • openCubeAtScale x m := by + ext y + constructor + · intro hy + rw [Set.mem_smul_set] + refine ⟨Ch02.undilateVec k y, ?_, ?_⟩ + · intro i + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + have hri : r ≠ 0 := hr.ne' + have hyi := hy i + have hrad : + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 = + r * ((3 : ℝ) ^ m / 2) := by + calc + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 = + (Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) * + Real.rpow (3 : ℝ) (((k : ℤ) : ℝ))) / 2 := by + exact congrArg (fun z : ℝ => z / 2) + (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (((m : ℤ) : ℝ)) (((k : ℤ) : ℝ))) + _ = r * (Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2) := by + have hk : + Real.rpow (3 : ℝ) (((k : ℤ) : ℝ)) = r := by + dsimp [r, Ch02.triadicDilationFactor] + exact Real.rpow_intCast (3 : ℝ) k + rw [hk] + ring + _ = r * ((3 : ℝ) ^ m / 2) := by + exact congrArg (fun z : ℝ => r * (z / 2)) + (Real.rpow_intCast (3 : ℝ) m) + have hscaled : + |y i - r * x i| < + r * ((3 : ℝ) ^ m / 2) := by + have hyi' : + |y i - r * x i| < + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 := by + simpa [Ch02.dilateVec, Pi.smul_apply, smul_eq_mul, + Int.cast_add, r] using hyi + simpa [hrad] using hyi' + have hdiv : + |(y i - r * x i) / r| < + (3 : ℝ) ^ m / 2 := by + rw [abs_div, abs_of_pos hr] + exact (div_lt_iff₀ hr).2 (by simpa [mul_comm] using hscaled) + have hcoord : + (Ch02.undilateVec k y) i - x i = (y i - r * x i) / r := by + have hri' : Ch02.triadicDilationFactor k ≠ 0 := + Ch02.triadicDilationFactor_ne_zero k + simp [Ch02.undilateVec, r, Pi.smul_apply, smul_eq_mul, div_eq_mul_inv] + field_simp [hri'] + simpa [hcoord, Real.rpow_intCast] using hdiv + · ext i + simp [Ch02.undilateVec, Pi.smul_apply, smul_eq_mul, + Ch02.triadicDilationFactor_ne_zero k] + · rintro ⟨z, hz, rfl⟩ + intro i + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + have hrad : + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 = + r * ((3 : ℝ) ^ m / 2) := by + calc + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 = + (Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) * + Real.rpow (3 : ℝ) (((k : ℤ) : ℝ))) / 2 := by + exact congrArg (fun z : ℝ => z / 2) + (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (((m : ℤ) : ℝ)) (((k : ℤ) : ℝ))) + _ = r * (Real.rpow (3 : ℝ) (((m : ℤ) : ℝ)) / 2) := by + have hk : + Real.rpow (3 : ℝ) (((k : ℤ) : ℝ)) = r := by + dsimp [r, Ch02.triadicDilationFactor] + exact Real.rpow_intCast (3 : ℝ) k + rw [hk] + ring + _ = r * ((3 : ℝ) ^ m / 2) := by + exact congrArg (fun z : ℝ => r * (z / 2)) + (Real.rpow_intCast (3 : ℝ) m) + have hz_i := hz i + have hmul := mul_lt_mul_of_pos_left hz_i hr + have hcoord : + |(r • z) i - (Ch02.dilateVec k x) i| = + r * |z i - x i| := by + have hsub : + (r • z) i - (Ch02.dilateVec k x) i = + r * (z i - x i) := by + simp [Ch02.dilateVec, Pi.smul_apply, smul_eq_mul] + ring + rw [hsub, abs_mul, abs_of_pos hr] + have hmul' : + r * |z i - x i| < + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 := by + simpa [hrad] using hmul + have hgoal : + |(r • z) i - (Ch02.dilateVec k x) i| < + (3 : ℝ) ^ (((m : ℤ) : ℝ) + ((k : ℤ) : ℝ)) / 2 := by + rw [hcoord] + exact hmul' + simpa [openCubeAtScale, Ch02.dilateVec, Pi.smul_apply, + smul_eq_mul, Int.cast_add, r] using hgoal + +/-- Dilation commutes with the Caccioppoli core set. -/ +theorem caccioppoliCoreSet_dilateCube {d : ℕ} (k : ℤ) + (Q : TriadicCube d) (x : Vec d) : + caccioppoliCoreSet (Ch02.dilateCube k Q) (Ch02.dilateVec k x) = + Ch02.triadicDilationFactor k • caccioppoliCoreSet Q x := by + let r : ℝ := Ch02.triadicDilationFactor k + have hscale : + (Ch02.dilateCube k Q).scale - 2 = (Q.scale - 2) + k := by + simp [Ch02.dilateCube] + ring + rw [caccioppoliCoreSet, Ch02.openCubeSet_dilateCube k Q, + hscale, openCubeAtScale_dilateVec k (Q.scale - 2) x, caccioppoliCoreSet] + ext y + constructor + · rintro ⟨hyQ, hyx⟩ + rcases hyQ with ⟨zQ, hzQ, rfl⟩ + rcases hyx with ⟨zx, hzx, hzx_eq⟩ + have hz_eq : zQ = zx := by + ext i + have hr_ne : Ch02.triadicDilationFactor k ≠ 0 := + Ch02.triadicDilationFactor_ne_zero k + have hi := congrArg (fun y : Vec d => y i) hzx_eq + simp only [Pi.smul_apply, smul_eq_mul] at hi + exact (mul_left_cancel₀ hr_ne hi).symm + refine ⟨zQ, ⟨hzQ, ?_⟩, rfl⟩ + simpa [hz_eq] using hzx + · rintro ⟨z, ⟨hzQ, hzlocal⟩, rfl⟩ + exact ⟨Set.smul_mem_smul_set hzQ, Set.smul_mem_smul_set hzlocal⟩ + +/-- Dilation commutes with the boundary Caccioppoli localization window. -/ +theorem boundaryPatchWindow_dilateCube {d : ℕ} (k : ℤ) + (Q : TriadicCube d) (x : Vec d) : + openCubeAtScale (Ch02.dilateVec k x) ((Ch02.dilateCube k Q).scale - 1) = + Ch02.triadicDilationFactor k • openCubeAtScale x (Q.scale - 1) := by + have hscale : + (Ch02.dilateCube k Q).scale - 1 = (Q.scale - 1) + k := by + simp [Ch02.dilateCube] + ring + rw [hscale, openCubeAtScale_dilateVec] + +/-- Cast an `H¹₀` function across definitional set equality. -/ +private noncomputable def H10Function.castDomain {d : ℕ} + {U V : Set (Vec d)} (hUV : U = V) (u : H10Function U) : H10Function V := + hUV ▸ u + +@[simp] private theorem H10Function.castDomain_toFun {d : ℕ} + {U V : Set (Vec d)} (hUV : U = V) (u : H10Function U) : + (H10Function.castDomain hUV u).toH1Function.toFun = + u.toH1Function.toFun := by + subst V + rfl + +@[simp] private theorem H10Function.castDomain_apply {d : ℕ} + {U V : Set (Vec d)} (hUV : U = V) (u : H10Function U) (x : Vec d) : + (H10Function.castDomain hUV u) x = u x := by + subst V + rfl + +/-- Localized zero trace is transported by positive dilations, with the +solution normalization `v(y) = r u(r^{-1} y)`. -/ +theorem localizedZeroTraceFunctionOn_dilate {d : ℕ} {Ω V Ω' V' : Set (Vec d)} + {u v : Vec d → ℝ} {r : ℝ} (hr : 0 < r) + (hΩ' : Ω' = r • Ω) (hV' : V' = r • V) + (hv : ∀ y : Vec d, v y = r * u (r⁻¹ • y)) + (hu : LocalizedZeroTraceFunctionOn Ω V u) : + LocalizedZeroTraceFunctionOn Ω' V' v := by + intro η hη hη_compact hη_sub + let ζ : Vec d → ℝ := fun x => η (r • x) + have hζ_smooth : ContDiff ℝ (⊤ : ℕ∞) ζ := by + simpa [ζ] using! hη.comp (contDiff_const_smul r) + have hζ_compact : HasCompactSupport ζ := by + have hr_ne : r ≠ 0 := hr.ne' + show HasCompactSupport (η ∘ Homeomorph.smulOfNeZero r hr_ne) + simpa [ζ, Function.comp] using + hη_compact.comp_homeomorph (Homeomorph.smulOfNeZero r hr_ne) + have hζ_sub : tsupport ζ ⊆ V := by + intro x hx + have hr_ne : r ≠ 0 := hr.ne' + have hxη : r • x ∈ tsupport η := by + rw [show ζ = η ∘ Homeomorph.smulOfNeZero r hr_ne by rfl, + tsupport_comp_eq_preimage η (Homeomorph.smulOfNeZero r hr_ne)] at hx + exact hx + have hxV' : r • x ∈ V' := hη_sub hxη + rw [hV'] at hxV' + rcases hxV' with ⟨z, hzV, hz⟩ + have hz_eq : z = x := by + ext i + have hi := congrArg (fun y : Vec d => y i) hz + simp only [Pi.smul_apply, smul_eq_mul] at hi + exact mul_left_cancel₀ hr_ne hi + simpa [hz_eq] using hzV + rcases hu ζ hζ_smooth hζ_compact hζ_sub with ⟨w, hw⟩ + have hpre : r⁻¹ • Ω' = Ω := by + rw [hΩ'] + ext x + constructor + · rintro ⟨y, ⟨z, hzΩ, rfl⟩, hxy⟩ + have hx_eq : x = z := by + simpa [smul_smul, hr.ne'] using hxy.symm + simpa [hx_eq] using hzΩ + · intro hx + refine ⟨r • x, ⟨x, hx, rfl⟩, ?_⟩ + ext i + simp [Pi.smul_apply, smul_eq_mul, hr.ne'] + let wpre : H10Function (r⁻¹ • Ω') := + H10Function.castDomain hpre.symm w + let wtarget : H10Function Ω' := wpre.unscale (inv_pos.mpr hr) + have htarget_mem : + MemH10 Ω' (fun y => η y * u (r⁻¹ • y)) := by + refine ⟨wtarget, ?_⟩ + funext y + have hy : r * (r⁻¹) = 1 := by field_simp [hr.ne'] + calc + wtarget.toH1Function.toFun y = + wpre.toH1Function.toFun (r⁻¹ • y) := by + simp [wtarget] + _ = w.toH1Function.toFun (r⁻¹ • y) := by + exact congrFun (H10Function.castDomain_toFun hpre.symm w) (r⁻¹ • y) + _ = ζ (r⁻¹ • y) * u (r⁻¹ • y) := by + exact congrFun hw (r⁻¹ • y) + _ = η y * u (r⁻¹ • y) := by + simp [ζ, smul_smul, hy] + have hscaled := memH10_smul r htarget_mem + simpa [hv, mul_assoc, mul_comm, mul_left_comm] using hscaled + +/-- Normalized averages are insensitive to a.e. changes of representative. -/ +private theorem volumeAverage_eq_of_ae_eq {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → ℝ} + (hfg : f =ᵐ[volumeMeasureOn U] g) : + volumeAverage U f = volumeAverage U g := by + unfold volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae hfg + +/-- The localized coefficient energy is invariant under the public solution +dilation normalization `v(x) = r u(r^{-1}x)`. -/ +theorem localizedCoeffEnergyValue_dilate_eq {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : Ch02.CoeffOn (Ch02.cubeDomain Q)} + {b : Ch02.CoeffOn (Ch02.cubeDomain (Ch02.dilateCube k Q))} + (hCoeff : Ch02.CoeffOn.IsCubeDilation k a b) + {u : Ch02.Solution (Ch02.cubeDomain Q) a} + {v : Ch02.Solution (Ch02.cubeDomain (Ch02.dilateCube k Q)) b} + (hDilation : Ch02.Solution.IsCubeDilation hCoeff u v) + {V : Set (Vec d)} (hVsub : V ⊆ openCubeSet Q) : + localizedCoeffEnergyValue (Ch02.triadicDilationFactor k • V) b v.toH1 = + localizedCoeffEnergyValue V a u.toH1 := by + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + have htarget_subset : + r • V ⊆ openCubeSet (Ch02.dilateCube k Q) := by + rw [Ch02.openCubeSet_dilateCube k Q] + intro y hy + rcases hy with ⟨z, hzV, rfl⟩ + exact ⟨z, hVsub hzV, rfl⟩ + have hgrad : + v.toH1.grad =ᵐ[volumeMeasureOn (r • V)] + fun x => u.toH1.grad (Ch02.undilateVec k x) := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset htarget_subset + hDilation.grad_ae_eq + have hcoeff : + b.toCoeffField =ᵐ[volumeMeasureOn (r • V)] + Ch02.dilateCoeffField k a.toCoeffField := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset htarget_subset + hCoeff.coeff_ae_eq + have henergy : + (fun x : Vec d => + vecDot (v.toH1.grad x) + (matVecMul (symmPart (b.toCoeffField x)) (v.toH1.grad x))) + =ᵐ[volumeMeasureOn (r • V)] + fun x => + vecDot (u.toH1.grad (Ch02.undilateVec k x)) + (matVecMul + (symmPart (a.toCoeffField (Ch02.undilateVec k x))) + (u.toH1.grad (Ch02.undilateVec k x))) := by + filter_upwards [hgrad, hcoeff] with x hgradx hcoeffx + simp [hgradx, hcoeffx, Ch02.dilateCoeffField] + calc + localizedCoeffEnergyValue (Ch02.triadicDilationFactor k • V) b v.toH1 = + volumeAverage (r • V) + (fun x : Vec d => + vecDot (v.toH1.grad x) + (matVecMul (symmPart (b.toCoeffField x)) (v.toH1.grad x))) := by + simp [localizedCoeffEnergyValue, normalizedSetAverage, r] + _ = + volumeAverage (r • V) + (fun x => + vecDot (u.toH1.grad (Ch02.undilateVec k x)) + (matVecMul + (symmPart (a.toCoeffField (Ch02.undilateVec k x))) + (u.toH1.grad (Ch02.undilateVec k x)))) := + volumeAverage_eq_of_ae_eq henergy + _ = + volumeAverage V + (fun x => + vecDot (u.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.toH1.grad x))) := by + rw [Ch01.volumeAverage_smul_set_comp_smul_of_pos (d := d) hr V] + congr 1 + funext x + simp [Ch02.undilateVec, r, smul_smul, Ch02.triadicDilationFactor_ne_zero k] + _ = localizedCoeffEnergyValue V a u.toH1 := by + simp [localizedCoeffEnergyValue, normalizedSetAverage] + +/-- Under solution dilation, normalized scalar `L²` on a dilated set gains the +square of the amplitude factor. -/ +theorem normalizedL2SqOnSet_dilate_eq {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : Ch02.CoeffOn (Ch02.cubeDomain Q)} + {b : Ch02.CoeffOn (Ch02.cubeDomain (Ch02.dilateCube k Q))} + {hCoeff : Ch02.CoeffOn.IsCubeDilation k a b} + {u : Ch02.Solution (Ch02.cubeDomain Q) a} + {v : Ch02.Solution (Ch02.cubeDomain (Ch02.dilateCube k Q)) b} + (hDilation : Ch02.Solution.IsCubeDilation hCoeff u v) + {V : Set (Vec d)} (hVsub : V ⊆ openCubeSet Q) : + normalizedL2SqOnSet (Ch02.triadicDilationFactor k • V) v.toH1.toFun = + (Ch02.triadicDilationFactor k) ^ (2 : ℕ) * + normalizedL2SqOnSet V u.toH1.toFun := by + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + have htarget_subset : + r • V ⊆ openCubeSet (Ch02.dilateCube k Q) := by + rw [Ch02.openCubeSet_dilateCube k Q] + intro y hy + rcases hy with ⟨z, hzV, rfl⟩ + exact ⟨z, hVsub hzV, rfl⟩ + have hvalue : + v.toH1.toFun =ᵐ[volumeMeasureOn (r • V)] + fun x => r * u.toH1.toFun (Ch02.undilateVec k x) := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset htarget_subset + (by simpa [r] using! hDilation.value_ae_eq) + have hsquares : + (fun x : Vec d => v.toH1.toFun x ^ (2 : ℕ)) + =ᵐ[volumeMeasureOn (r • V)] + fun x => (r * u.toH1.toFun (Ch02.undilateVec k x)) ^ (2 : ℕ) := by + exact hvalue.mono fun x hx => by simp [hx] + calc + normalizedL2SqOnSet (Ch02.triadicDilationFactor k • V) v.toH1.toFun = + volumeAverage (r • V) (fun x : Vec d => v.toH1.toFun x ^ (2 : ℕ)) := by + simp [normalizedL2SqOnSet, normalizedSetAverage, r] + _ = + volumeAverage (r • V) + (fun x => (r * u.toH1.toFun (Ch02.undilateVec k x)) ^ (2 : ℕ)) := + volumeAverage_eq_of_ae_eq hsquares + _ = + volumeAverage V (fun x => (r * u.toH1.toFun x) ^ (2 : ℕ)) := by + rw [Ch01.volumeAverage_smul_set_comp_smul_of_pos (d := d) hr V] + congr 1 + funext x + simp [Ch02.undilateVec, r, smul_smul, Ch02.triadicDilationFactor_ne_zero k] + _ = r ^ (2 : ℕ) * + volumeAverage V (fun x => u.toH1.toFun x ^ (2 : ℕ)) := by + calc + volumeAverage V (fun x => (r * u.toH1.toFun x) ^ (2 : ℕ)) = + volumeAverage V + ((r ^ (2 : ℕ)) • fun x => u.toH1.toFun x ^ (2 : ℕ)) := by + congr 1 + funext x + simp [Pi.smul_apply, smul_eq_mul] + ring + _ = r ^ (2 : ℕ) * + volumeAverage V (fun x => u.toH1.toFun x ^ (2 : ℕ)) := + volumeAverage_smul V (r ^ (2 : ℕ)) + (fun x => u.toH1.toFun x ^ (2 : ℕ)) + _ = + (Ch02.triadicDilationFactor k) ^ (2 : ℕ) * + normalizedL2SqOnSet V u.toH1.toFun := by + simp [normalizedL2SqOnSet, normalizedSetAverage, r] + +/-- The solution-amplitude square for normalization by `-Q.scale` is exactly +the explicit scale factor in the public Caccioppoli RHS. -/ +theorem triadicDilationFactor_neg_scale_sq {d : ℕ} (Q : TriadicCube d) : + (Ch02.triadicDilationFactor (-Q.scale)) ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := by + have hcast : (((-2 * Q.scale : ℤ) : ℝ)) = + -2 * (((Q.scale : ℤ) : ℝ)) := by + norm_num + have hrpow : + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) = + (3 : ℝ) ^ (-2 * Q.scale) := by + rw [← hcast] + exact Real.rpow_intCast (3 : ℝ) (-2 * Q.scale) + rw [hrpow] + simp [Ch02.triadicDilationFactor] + rw [← zpow_natCast, ← zpow_mul] + congr 1 + ring + +/-- The public normalized cube average can be evaluated on the open cube: +the half-open boundary is null. -/ +private theorem normalizedAverage_eq_volumeAverage_open {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + Ch01.Legacy.normalizedAverage Q f = volumeAverage (openCubeSet Q) f := by + calc + Ch01.Legacy.normalizedAverage Q f = volumeAverage (cubeSet Q) f := by + rw [Ch01.Legacy.normalizedAverage] + exact (volumeAverage_cubeSet_eq_cubeAverage Q f).symm + _ = volumeAverage (openCubeSet Q) f := + ScalarCanonicalMaximizer.volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q f + +/-- The cube average of a dilated solution scales by the solution-amplitude +factor. -/ +theorem normalizedAverage_dilate_solution_eq {d : ℕ} {k : ℤ} + {Q : TriadicCube d} + {a : Ch02.CoeffOn (Ch02.cubeDomain Q)} + {b : Ch02.CoeffOn (Ch02.cubeDomain (Ch02.dilateCube k Q))} + {hCoeff : Ch02.CoeffOn.IsCubeDilation k a b} + {u : Ch02.Solution (Ch02.cubeDomain Q) a} + {v : Ch02.Solution (Ch02.cubeDomain (Ch02.dilateCube k Q)) b} + (hDilation : Ch02.Solution.IsCubeDilation hCoeff u v) : + Ch01.Legacy.normalizedAverage (Ch02.dilateCube k Q) v.toH1.toFun = + Ch02.triadicDilationFactor k * Ch01.Legacy.normalizedAverage Q u.toH1.toFun := by + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + calc + Ch01.Legacy.normalizedAverage (Ch02.dilateCube k Q) v.toH1.toFun = + volumeAverage (openCubeSet (Ch02.dilateCube k Q)) v.toH1.toFun := + normalizedAverage_eq_volumeAverage_open (Ch02.dilateCube k Q) v.toH1.toFun + _ = + volumeAverage (openCubeSet (Ch02.dilateCube k Q)) + (fun x => r * u.toH1.toFun (Ch02.undilateVec k x)) := by + exact volumeAverage_eq_of_ae_eq (by simpa [r] using hDilation.value_ae_eq) + _ = + volumeAverage (r • openCubeSet Q) + (fun x => r * u.toH1.toFun (Ch02.undilateVec k x)) := by + rw [Ch02.openCubeSet_dilateCube] + _ = + volumeAverage (openCubeSet Q) (fun x => r * u.toH1.toFun x) := by + rw [Ch01.volumeAverage_smul_set_comp_smul_of_pos (d := d) hr] + congr 1 + funext x + simp [Ch02.undilateVec, r, smul_smul, Ch02.triadicDilationFactor_ne_zero k] + _ = r * volumeAverage (openCubeSet Q) u.toH1.toFun := by + simpa [smul_eq_mul] using! + volumeAverage_smul (openCubeSet Q) r u.toH1.toFun + _ = Ch02.triadicDilationFactor k * + Ch01.Legacy.normalizedAverage Q u.toH1.toFun := by + rw [normalizedAverage_eq_volumeAverage_open Q u.toH1.toFun] + +/-- The centered parent `L²` oscillation scales with the same amplitude-square +factor as the uncentered parent `L²` term. -/ +theorem interiorCaccioppoliParentOscillationL2Sq_dilate_eq {d : ℕ} {k : ℤ} + {Q : TriadicCube d} {A B : CoeffFamily d} + {hCoeff : Ch02.CoeffOn.IsCubeDilation k (A.coeffOn Q) + (B.coeffOn (Ch02.dilateCube k Q))} + {u : CubeSolution Q A} + {v : CubeSolution (Ch02.dilateCube k Q) B} + (hDilation : Ch02.Solution.IsCubeDilation hCoeff u v) : + interiorCaccioppoliParentOscillationL2Sq (Ch02.dilateCube k Q) B v = + (Ch02.triadicDilationFactor k) ^ (2 : ℕ) * + interiorCaccioppoliParentOscillationL2Sq Q A u := by + let r : ℝ := Ch02.triadicDilationFactor k + have hr : 0 < r := by + dsimp [r] + exact Ch02.triadicDilationFactor_pos k + have havg : + Ch01.Legacy.normalizedAverage (Ch02.dilateCube k Q) v.toH1.toFun = + r * Ch01.Legacy.normalizedAverage Q u.toH1.toFun := by + simpa [r] using normalizedAverage_dilate_solution_eq hDilation + have hvalue : + v.toH1.toFun =ᵐ[volumeMeasureOn (openCubeSet (Ch02.dilateCube k Q))] + fun x => r * u.toH1.toFun (Ch02.undilateVec k x) := by + simpa [r] using hDilation.value_ae_eq + have hsquares : + (fun x : Vec d => + (v.toH1.toFun x - + Ch01.Legacy.normalizedAverage (Ch02.dilateCube k Q) v.toH1.toFun) ^ (2 : ℕ)) + =ᵐ[volumeMeasureOn (openCubeSet (Ch02.dilateCube k Q))] + fun x => + (r * (u.toH1.toFun (Ch02.undilateVec k x) - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun)) ^ (2 : ℕ) := by + filter_upwards [hvalue] with x hx + rw [hx, havg] + ring + calc + interiorCaccioppoliParentOscillationL2Sq (Ch02.dilateCube k Q) B v = + volumeAverage (openCubeSet (Ch02.dilateCube k Q)) + (fun x : Vec d => + (v.toH1.toFun x - + Ch01.Legacy.normalizedAverage (Ch02.dilateCube k Q) v.toH1.toFun) ^ (2 : ℕ)) := by + simp [interiorCaccioppoliParentOscillationL2Sq, + normalizedL2SqOnSet, normalizedSetAverage] + _ = + volumeAverage (openCubeSet (Ch02.dilateCube k Q)) + (fun x => + (r * (u.toH1.toFun (Ch02.undilateVec k x) - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun)) ^ (2 : ℕ)) := + volumeAverage_eq_of_ae_eq hsquares + _ = + volumeAverage (r • openCubeSet Q) + (fun x => + (r * (u.toH1.toFun (Ch02.undilateVec k x) - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun)) ^ (2 : ℕ)) := by + rw [Ch02.openCubeSet_dilateCube] + _ = + volumeAverage (openCubeSet Q) + (fun x => + (r * (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun)) ^ (2 : ℕ)) := by + rw [Ch01.volumeAverage_smul_set_comp_smul_of_pos (d := d) hr] + congr 1 + funext x + simp [Ch02.undilateVec, r, smul_smul, Ch02.triadicDilationFactor_ne_zero k] + _ = + r ^ (2 : ℕ) * + volumeAverage (openCubeSet Q) + (fun x => + (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun) ^ (2 : ℕ)) := by + calc + volumeAverage (openCubeSet Q) + (fun x => + (r * (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun)) ^ (2 : ℕ)) = + volumeAverage (openCubeSet Q) + ((r ^ (2 : ℕ)) • fun x => + (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun) ^ (2 : ℕ)) := by + congr 1 + funext x + simp [Pi.smul_apply, smul_eq_mul] + ring + _ = + r ^ (2 : ℕ) * + volumeAverage (openCubeSet Q) + (fun x => + (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun) ^ (2 : ℕ)) := + volumeAverage_smul (openCubeSet Q) (r ^ (2 : ℕ)) + (fun x => + (u.toH1.toFun x - + Ch01.Legacy.normalizedAverage Q u.toH1.toFun) ^ (2 : ℕ)) + _ = + (Ch02.triadicDilationFactor k) ^ (2 : ℕ) * + interiorCaccioppoliParentOscillationL2Sq Q A u := by + simp [interiorCaccioppoliParentOscillationL2Sq, + normalizedL2SqOnSet, normalizedSetAverage, r] + +/-- The Caccioppoli scalar prefactor under normalization to scale zero. + +The multiscale quantities are invariant under the public Chapter 2 dilation +relation, while the explicit `3^{-2m}` factor is exactly the scale conversion +left in the note-facing statement. -/ +theorem caccioppoliPrefactor_dilate_neg_scale {d : ℕ} [NeZero d] + (hmulti : Ch02.MultiscaleDilationTheory d) + {Q : TriadicCube d} {a b : CoeffFamily d} {C s t : ℝ} + (hFam : Ch02.TriadicCoeffFamily.IsDilation (-Q.scale) a b) : + caccioppoliPrefactor C Q a s t = + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + caccioppoliPrefactor C (Ch02.dilateCube (-Q.scale) Q) b s t := by + unfold caccioppoliPrefactor + rw [hmulti.ThetaRatio_dilate hFam Q s t, + hmulti.LambdaS_dilate hFam Q s] + have hscale0 : + Real.rpow (3 : ℝ) + (-2 * ((((Ch02.dilateCube (-Q.scale) Q).scale : ℤ) : ℝ))) = + 1 := by + simp + rw [hscale0] + ring + +/-- A boundary datum transported to the normalized scale-zero cube. + +The inequalities are intentionally oriented for the Caccioppoli reduction: +the old core energy is controlled by the normalized core energy, and the +normalized RHS is controlled by the original public RHS. -/ +private structure BoundaryCaccioppoliDilationWitness {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + (u : BoundaryCaccioppoliDatum Q a x) where + normalizedCoeff : CoeffFamily d + coeff_isDilation : + Ch02.TriadicCoeffFamily.IsDilation (-Q.scale) a normalizedCoeff + normalizedDatum : + BoundaryCaccioppoliDatum (Ch02.dilateCube (-Q.scale) Q) normalizedCoeff + (Ch02.dilateVec (-Q.scale) x) + coreEnergy_le : + boundaryCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliCoreEnergy normalizedDatum + rhs_le : + ∀ {C s t : ℝ}, 0 < C → 0 < s → 0 < t → s + t < 1 → + boundaryCaccioppoliRHS C s t normalizedDatum ≤ + boundaryCaccioppoliRHS C s t u + +/-- An interior solution transported to the normalized scale-zero cube. -/ +private structure InteriorCaccioppoliDilationWitness {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) where + normalizedCoeff : CoeffFamily d + coeff_isDilation : + Ch02.TriadicCoeffFamily.IsDilation (-Q.scale) a normalizedCoeff + normalizedSolution : + CubeSolution (Ch02.dilateCube (-Q.scale) Q) normalizedCoeff + coreEnergy_le : + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + interiorCaccioppoliCoreEnergy (Ch02.dilateCube (-Q.scale) Q) + normalizedCoeff (cubeCenter (Ch02.dilateCube (-Q.scale) Q)) + normalizedSolution + rhs_le : + ∀ {C s t : ℝ}, 0 < C → 0 < s → 0 < t → s + t < 1 → + interiorCaccioppoliRHS C (Ch02.dilateCube (-Q.scale) Q) + normalizedCoeff s t normalizedSolution ≤ + interiorCaccioppoliRHS C Q a s t u + +/-- Boundary Caccioppoli data have a concrete normalized dilation witness. -/ +private noncomputable def boundaryCaccioppoliDilationWitness {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + (u : BoundaryCaccioppoliDatum Q a x) : + BoundaryCaccioppoliDilationWitness u := by + let k : ℤ := -Q.scale + let r : ℝ := Ch02.triadicDilationFactor k + let b : CoeffFamily d := Ch02.TriadicCoeffFamily.dilate k a + have hr : 0 < r := by + dsimp [r, k] + exact Ch02.triadicDilationFactor_pos (-Q.scale) + have hFam : Ch02.TriadicCoeffFamily.IsDilation k a b := + Ch02.TriadicCoeffFamily.isDilation_dilate k a + have hCoeff : + Ch02.CoeffOn.IsCubeDilation k (a.coeffOn Q) + (b.coeffOn (Ch02.dilateCube k Q)) := + hFam Q + let uSol : Ch02.Solution (Ch02.cubeDomain Q) (a.coeffOn Q) := + { toH1 := u.toH1 + isHarmonic := u.isHarmonic } + let vPack := Ch02.Solution.dilate hCoeff uSol + let vSol : Ch02.Solution (Ch02.cubeDomain (Ch02.dilateCube k Q)) + (b.coeffOn (Ch02.dilateCube k Q)) := vPack.toSolution + have hvalue_pointwise : + ∀ y : Vec d, vSol.toH1.toFun y = + r * u.toH1.toFun (r⁻¹ • y) := by + intro y + simp [vSol, vPack, uSol, Ch02.Solution.dilate, H1Function.dilateSet, + r, k] + let vDatum : BoundaryCaccioppoliDatum (Ch02.dilateCube k Q) b + (Ch02.dilateVec k x) := + { toH1 := vSol.toH1 + isHarmonic := vSol.isHarmonic + zeroTraceOnBoundaryPatch := by + have hΩ : + (Ch02.cubeDomain (Ch02.dilateCube k Q) : Set (Vec d)) = + r • (Ch02.cubeDomain Q : Set (Vec d)) := by + simpa [Ch02.cubeDomain_coe, r] using Ch02.openCubeSet_dilateCube k Q + have hV : + openCubeAtScale (Ch02.dilateVec k x) + ((Ch02.dilateCube k Q).scale - 1) = + r • openCubeAtScale x (Q.scale - 1) := by + simpa [r] using boundaryPatchWindow_dilateCube k Q x + exact + localizedZeroTraceFunctionOn_dilate + (Ω := (Ch02.cubeDomain Q : Set (Vec d))) + (V := openCubeAtScale x (Q.scale - 1)) + (Ω' := (Ch02.cubeDomain (Ch02.dilateCube k Q) : Set (Vec d))) + (V' := openCubeAtScale (Ch02.dilateVec k x) + ((Ch02.dilateCube k Q).scale - 1)) + (u := u.toH1.toFun) (v := vSol.toH1.toFun) + hr hΩ hV hvalue_pointwise u.zeroTraceOnBoundaryPatch } + refine + { normalizedCoeff := b + coeff_isDilation := by + simpa [k, b] using hFam + normalizedDatum := by + simpa [k, b] using vDatum + coreEnergy_le := ?_ + rhs_le := ?_ } + · have hcore_sub : caccioppoliCoreSet Q x ⊆ openCubeSet Q := fun y hy => hy.1 + have henergy := + localizedCoeffEnergyValue_dilate_eq hCoeff vPack.isDilation + (V := caccioppoliCoreSet Q x) hcore_sub + have hcore_geom : + caccioppoliCoreSet (Ch02.dilateCube k Q) (Ch02.dilateVec k x) = + r • caccioppoliCoreSet Q x := by + simpa [r] using caccioppoliCoreSet_dilateCube k Q x + have heq : + boundaryCaccioppoliCoreEnergy vDatum = + boundaryCaccioppoliCoreEnergy u := by + simpa [boundaryCaccioppoliCoreEnergy, vDatum, uSol, vSol, r, hcore_geom] + using henergy + simpa [vDatum, k, b] using le_of_eq heq.symm + · intro C s t hC hs ht hst + have hparent := + normalizedL2SqOnSet_dilate_eq vPack.isDilation + (V := openCubeSet Q) (fun y hy => hy) + have hopen : + openCubeSet (Ch02.dilateCube k Q) = r • openCubeSet Q := by + simpa [r] using Ch02.openCubeSet_dilateCube k Q + have hparent_eq : + boundaryCaccioppoliParentL2Sq vDatum = + r ^ (2 : ℕ) * boundaryCaccioppoliParentL2Sq u := by + simpa [boundaryCaccioppoliParentL2Sq, normalizedL2SqOnSet, + normalizedSetAverage, vDatum, uSol, vSol, r, hopen] using hparent + have hpref := + caccioppoliPrefactor_dilate_neg_scale (Ch02.multiscaleDilationTheory d) + (Q := Q) (a := a) (b := b) (C := C) (s := s) (t := t) + (by simpa [k, b] using hFam) + have hsq : + r ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := by + simpa [r, k] using triadicDilationFactor_neg_scale_sq Q + have heq : + boundaryCaccioppoliRHS C s t vDatum = + boundaryCaccioppoliRHS C s t u := by + unfold boundaryCaccioppoliRHS + rw [hparent_eq, hsq] + rw [hpref] + ring + simpa [vDatum, k, b] using le_of_eq heq + +private theorem interiorCaccioppoliRHS_dilate_eq_of_parentOscillation + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a b : CoeffFamily d} + (u : CubeSolution Q a) (v : CubeSolution (Ch02.dilateCube (-Q.scale) Q) b) + (hFam : Ch02.TriadicCoeffFamily.IsDilation (-Q.scale) a b) + (hosc : interiorCaccioppoliParentOscillationL2Sq (Ch02.dilateCube (-Q.scale) Q) b v = + (Ch02.triadicDilationFactor (-Q.scale)) ^ (2 : ℕ) * + interiorCaccioppoliParentOscillationL2Sq Q a u) + (C s t : ℝ) : + interiorCaccioppoliRHS C (Ch02.dilateCube (-Q.scale) Q) b s t v = + interiorCaccioppoliRHS C Q a s t u := by + have hpref := + caccioppoliPrefactor_dilate_neg_scale (Ch02.multiscaleDilationTheory d) + (Q := Q) (a := a) (b := b) (C := C) (s := s) (t := t) hFam + have hsq := triadicDilationFactor_neg_scale_sq Q + unfold interiorCaccioppoliRHS + rw [hosc, hsq] + rw [hpref] + ring + +/-- Interior cube solutions have a concrete normalized dilation witness. -/ +private noncomputable def interiorCaccioppoliDilationWitness {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffFamily d} (u : CubeSolution Q a) : + InteriorCaccioppoliDilationWitness u := by + let k : ℤ := -Q.scale + let r : ℝ := Ch02.triadicDilationFactor k + let b : CoeffFamily d := Ch02.TriadicCoeffFamily.dilate k a + have hFam : Ch02.TriadicCoeffFamily.IsDilation k a b := + Ch02.TriadicCoeffFamily.isDilation_dilate k a + have hCoeff : + Ch02.CoeffOn.IsCubeDilation k (a.coeffOn Q) + (b.coeffOn (Ch02.dilateCube k Q)) := + hFam Q + let vPack := Ch02.Solution.dilate hCoeff u + let vSol : CubeSolution (Ch02.dilateCube k Q) b := vPack.toSolution + refine + { normalizedCoeff := b + coeff_isDilation := by + simpa [k, b] using hFam + normalizedSolution := by + simpa [k, b] using vSol + coreEnergy_le := ?_ + rhs_le := ?_ } + · have hcore_sub : + caccioppoliCoreSet Q (cubeCenter Q) ⊆ openCubeSet Q := fun y hy => hy.1 + have henergy := + localizedCoeffEnergyValue_dilate_eq hCoeff vPack.isDilation + (V := caccioppoliCoreSet Q (cubeCenter Q)) hcore_sub + have hcenter : + cubeCenter (Ch02.dilateCube k Q) = Ch02.dilateVec k (cubeCenter Q) := + cubeCenter_dilateCube k Q + have hcore_geom : + caccioppoliCoreSet (Ch02.dilateCube k Q) + (cubeCenter (Ch02.dilateCube k Q)) = + r • caccioppoliCoreSet Q (cubeCenter Q) := by + rw [hcenter] + simpa [r] using caccioppoliCoreSet_dilateCube k Q (cubeCenter Q) + have heq : + interiorCaccioppoliCoreEnergy (Ch02.dilateCube k Q) b + (cubeCenter (Ch02.dilateCube k Q)) vSol = + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u := by + simpa [interiorCaccioppoliCoreEnergy, vSol, r, hcore_geom] + using henergy + simpa [vSol, k, b] using le_of_eq heq.symm + · intro C s t hC hs ht hst + have hosc := + interiorCaccioppoliParentOscillationL2Sq_dilate_eq + (A := a) (B := b) (Q := Q) vPack.isDilation + have heq := interiorCaccioppoliRHS_dilate_eq_of_parentOscillation + u vSol (by simpa [k, b] using hFam) hosc C s t + simpa [vSol, k, b] using le_of_eq heq + +/-- Fully proved public coarse Caccioppoli theorem package for arbitrary +triadic scales. The scale normalization is discharged internally by concrete +dilation witnesses, so no transport bridge appears in the public API. -/ +theorem coarseCaccioppoliTheory + (d : ℕ) [NeZero d] : CoarseCaccioppoliTheory d := by + rcases (coarseCaccioppoliScaleZeroTheory d).exists_constant with + ⟨C, hCpos, hboundary₀, hinterior₀⟩ + refine ⟨⟨C, hCpos, ?_, ?_⟩⟩ + · intro Q a s t x u hs ht hst hx + let w := boundaryCaccioppoliDilationWitness u + have hscale0 : (Ch02.dilateCube (-Q.scale) Q).scale = 0 := by simp + have hx0 : + Ch02.dilateVec (-Q.scale) x ∈ + openCubeSet (Ch02.dilateCube (-Q.scale) Q) := + Ch02.dilateVec_mem_openCubeSet_dilateCube (-Q.scale) hx + exact + w.coreEnergy_le.trans + ((hboundary₀ w.normalizedDatum hs ht hst hx0 hscale0).trans + (w.rhs_le hCpos hs ht hst)) + · intro Q a s t u hs ht hst + let w := interiorCaccioppoliDilationWitness u + have hscale0 : (Ch02.dilateCube (-Q.scale) Q).scale = 0 := by simp + exact + w.coreEnergy_le.trans + ((hinterior₀ w.normalizedSolution hs ht hst hscale0).trans + (w.rhs_le hCpos hs ht hst)) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS.lean new file mode 100644 index 0000000000..c9e6b7fbdf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Theory + +/-! # Coarse Caccioppoli RHS -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Bridges.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Bridges.lean new file mode 100644 index 0000000000..872ac163bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Bridges.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.FinalBounds + +/-! # Bridges -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Internal Parent-L2 Bounds for Coarse Caccioppoli with RHS + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: prove the parent-`L²` estimate for the zero-trace corrector and expose +only the raw bound consumed by the public theorem package. + +Downstream target: `CoarseCaccioppoliRHS/Theory.lean`. This file should not +spawn public bridge packages or parallel theorem theories. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Analytic bridge needed to finish the boundary Caccioppoli estimate with +right-hand side. + +All decomposition and scalar absorption steps in this file reduce the final +public theorem to this dimension-only estimate for the zero-trace corrector. +The bridge is intentionally stated with the coarse lower ellipticity +`lambdaS`, not with the raw witness constants stored in `CoeffOn`. -/ +private structure CoarseCaccioppoliRHSParentL2Bridge + (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ K : ℝ, 0 < K ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g), + 0 < t → t < 1 / 2 → ForceBesovRegularity Q (2 * t) g → + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) + +/-- Zero-trace value estimate needed for the faithful proof of the corrector +parent `L²` bridge. + +This is the analytic replacement for the manuscript's ordinary Poincare plus +uniform-ellipticity line. It controls the full zero-trace value on the parent +cube by the public negative-Besov norm of its gradient, with the expected +`(1 - 2t)^{-1}` scale summation loss and no raw `CoeffOn` constants. -/ +private structure CoarseCaccioppoliRHSZeroTraceValueBridge + (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g), + 0 < t → t < 1 / 2 → + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + C * (1 - 2 * t)⁻¹ * + (scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (fun x => ρ.toH10.toH1Function.grad x)) ^ 2 + +/-- Proved zero-trace value bridge for the forced Caccioppoli corrector. + +The proof uses only the coarse negative-Besov gradient norm. It combines the +top-scale zero-trace value estimate above with the public normalization +identities, then spends the geometric summation loss as `(1 - 2t)^{-1}`. -/ +private theorem coarseCaccioppoliRHSZeroTraceValueBridge + {d : ℕ} [NeZero d] : + CoarseCaccioppoliRHSZeroTraceValueBridge d := by + let Kd : ℝ := (d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1) * (d : ℝ) + + 2 * (3 : ℝ) ^ ((d : ℝ) + 1) + let C : ℝ := 5 * Kd ^ 2 + 1 + have hC_pos : 0 < C := by + dsimp [C] + nlinarith [sq_nonneg Kd] + refine ⟨⟨C, hC_pos, ?_⟩⟩ + intro Q a t g ρ ht ht_lt + let f : Vec d → ℝ := fun x => ρ.toH10.toH1Function.toFun x + let F : Vec d → Vec d := fun x => ρ.toH10.toH1Function.grad x + let W : ℝ := cubeBesovScaleWeight (1 : ℝ) Q + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) f + let N : ℝ := cubeBesovNegativeVectorSeminormTwo Q (2 * t) F + let G : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹) + have hvalue := + cubeBesovScaleWeight_one_mul_cubeLpNorm_h10_le_grad_negativeBesovTwo + (Q := Q) (t := t) ρ.toH10 ht ht_lt + have hvalue' : W * L ≤ (Kd * G) * N := by + dsimp [W, L, N, G, Kd, f, F] + exact hvalue + have hWL_nonneg : 0 ≤ W * L := by + exact mul_nonneg (by dsimp [W]; exact cubeBesovScaleWeight_nonneg 1 Q) + (by dsimp [L]; exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) f) + have hvalue_sq : (W * L) ^ 2 ≤ ((Kd * G) * N) ^ 2 := + pow_le_pow_left₀ hWL_nonneg hvalue' 2 + have hscale2 : + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) = W ^ 2 := by + dsimp [W] + calc + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + = + cubeBesovScaleWeight (2 : ℝ) Q := by + simpa using publicDualBesovScaleWeight_eq_cubeBesovScaleWeight Q (2 : ℝ) + _ = cubeBesovScaleWeight (1 : ℝ) Q * + cubeBesovScaleWeight (1 : ℝ) Q := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add] + norm_num + _ = cubeBesovScaleWeight (1 : ℝ) Q ^ 2 := by + ring + have hnorm_eq : + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun = L ^ 2 := by + have hmem : MeasureTheory.MemLp + (fun x => + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.memL2_normalizedCubeMeasure + have h := normalizedL2SqOnSet_openCubeSet_eq_cubeLpNorm_two_sq Q + (fun x => + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun x) hmem + dsimp [L, f] + simpa [boundaryForcedCaccioppoliCorrectorOpenH10_toFun] using h + have hr : 0 < 1 - 2 * t := by linarith + have hr_le : 1 - 2 * t ≤ 1 := by linarith + have hpow_lt_one : Real.rpow (3 : ℝ) (-(1 - 2 * t)) < 1 := by + simpa [Real.rpow_eq_pow] using + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith : -(1 - 2 * t) < 0) + have hden_pos : 0 < 1 - Real.rpow (3 : ℝ) (-(1 - 2 * t)) := by + linarith + have harg : -2 * ((1 / 2 : ℝ) - t) = -(1 - 2 * t) := by ring + have hinv_nonneg_G : + 0 ≤ (1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹ := by + rw [harg] + exact inv_nonneg.mpr hden_pos.le + have hG_sq : G ^ 2 ≤ 5 * (1 - 2 * t)⁻¹ := by + have hs := Ch02.inv_one_sub_rpow_three_neg_le_five_inv hr hr_le + calc + G ^ 2 = + (Real.sqrt + ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹)) ^ 2 := by + rfl + _ = (1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹ := + Real.sq_sqrt hinv_nonneg_G + _ = (1 - Real.rpow (3 : ℝ) (-(1 - 2 * t)))⁻¹ := by + rw [harg] + _ ≤ 5 * (1 - 2 * t)⁻¹ := hs + have hN_sq_nonneg : 0 ≤ N ^ 2 := sq_nonneg N + have hKd_sq_nonneg : 0 ≤ Kd ^ 2 := sq_nonneg Kd + have hCcoef : 5 * Kd ^ 2 ≤ C := by + dsimp [C] + linarith + have hrinv_nonneg : 0 ≤ (1 - 2 * t)⁻¹ := inv_nonneg.mpr hr.le + have hsq_bound : + ((Kd * G) * N) ^ 2 ≤ C * (1 - 2 * t)⁻¹ * N ^ 2 := by + calc + ((Kd * G) * N) ^ 2 = Kd ^ 2 * G ^ 2 * N ^ 2 := by + ring + _ ≤ Kd ^ 2 * (5 * (1 - 2 * t)⁻¹) * N ^ 2 := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hG_sq hKd_sq_nonneg) hN_sq_nonneg + _ = (5 * Kd ^ 2) * (1 - 2 * t)⁻¹ * N ^ 2 := by + ring + _ ≤ C * (1 - 2 * t)⁻¹ * N ^ 2 := by + have hcoef_scaled : + (5 * Kd ^ 2) * (1 - 2 * t)⁻¹ ≤ C * (1 - 2 * t)⁻¹ := + mul_le_mul_of_nonneg_right hCcoef hrinv_nonneg + exact mul_le_mul_of_nonneg_right hcoef_scaled hN_sq_nonneg + have hN_eq : + scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) F = N := by + dsimp [N, F] + rw [scaleNormalizedNegativeBesovVectorNorm_finite_two_eq_cubeBesovNegativeVectorSeminormTwo] + calc + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + = W ^ 2 * L ^ 2 := by + rw [hscale2, hnorm_eq] + _ = (W * L) ^ 2 := by + ring + _ ≤ ((Kd * G) * N) ^ 2 := hvalue_sq + _ ≤ C * (1 - 2 * t)⁻¹ * N ^ 2 := hsq_bound + _ = + C * (1 - 2 * t)⁻¹ * + (scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (fun x => ρ.toH10.toH1Function.grad x)) ^ 2 := by + rw [hN_eq] + +/-- The zero-trace value bridge, together with the already-proved public RHS +Poincare theorem, supplies the coarse parent `L²` bridge needed by the final +Caccioppoli-with-RHS assembly. -/ +private theorem coarseCaccioppoliRHSParentL2Bridge_of_zeroTraceValueBridge + {d : ℕ} [NeZero d] + (hvalue : CoarseCaccioppoliRHSZeroTraceValueBridge d) : + CoarseCaccioppoliRHSParentL2Bridge d := by + rcases hvalue.exists_constant with ⟨Cv, hCv_pos, hvalue_bound⟩ + rcases (coarsePoincareRHSTheory (d := d)).exists_constant with + ⟨Cp, hCp_pos, hgrad_bound, henergy_bound⟩ + let H : ℝ := Cp ^ 2 + Cp + let A : ℝ := (25 * Real.exp 4) ^ 2 + let K : ℝ := Cv * (H ^ 2 * A) + have hCp_nonneg : 0 ≤ Cp := le_of_lt hCp_pos + have hH_pos : 0 < H := by + dsimp [H] + nlinarith [sq_nonneg Cp] + have hA_pos : 0 < A := by + dsimp [A] + positivity + have hK_pos : 0 < K := by + dsimp [K] + exact mul_pos hCv_pos (mul_pos (sq_pos_of_pos hH_pos) hA_pos) + refine ⟨⟨K, hK_pos, ?_⟩⟩ + intro Q a t g ρ ht ht_lt hg + let U : ForcedCubeSolution Q a g := + boundaryForcedCaccioppoliCorrectorForcedCubeSolution (Q := Q) (a := a) ρ + let V : ZeroTraceForcedCubeSolution Q a g := + boundaryForcedCaccioppoliCorrectorZeroTraceForcedCubeSolution + (Q := Q) (a := a) ρ + let N : ℝ := + scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (fun x => ρ.toH10.toH1Function.grad x) + let B : ℝ := scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g + let L₂ : ℝ := Ch02.lambdaSq Q t (.finite 2) a + let L₁ : ℝ := Ch02.lambdaS Q t a + let T : ℝ := Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B + let F : ℝ := Real.rpow t (-8 : ℝ) * Real.rpow L₁ (-1 : ℝ) * B ^ 2 + have htwo_t_pos : 0 < 2 * t := by nlinarith + have htwo_t_lt_one : 2 * t < 1 := by nlinarith + have hL₁_nonneg : 0 ≤ L₁ := by + dsimp [L₁] + unfold Ch02.lambdaS + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 1)).le + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := 2 * t) (g := g) hg + have hL₂_nonneg : 0 ≤ L₂ := by + dsimp [L₂] + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 2)).le + have hT_nonneg : 0 ≤ T := by + dsimp [T] + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg ht.le _) + (Real.rpow_nonneg hL₂_nonneg _)) hB_nonneg + have hgrad_eq : + scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (forcedSolutionGradientField U) = N := by + change scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + ((boundaryForcedCaccioppoliCorrectorForcedCubeSolution + (Q := Q) (a := a) ρ).toH1.grad) = + scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (fun x => ρ.toH10.toH1Function.grad x) + rw [boundaryForcedCaccioppoliCorrectorForcedCubeSolution_grad] + have hgrad_forced : + scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (forcedSolutionGradientField U) ≤ + coarsePoincareWithRHSGradientRHS Cp Q a (2 * t) g U := + hgrad_bound U htwo_t_pos htwo_t_lt_one hg + have hgrad_raw : + N ≤ coarsePoincareWithRHSGradientRHS Cp Q a (2 * t) g U := by + rw [← hgrad_eq] + exact hgrad_forced + have henergy_forced : + forcedSolutionEnergyNorm Q a U ≤ + zeroDirichletEnergyWithRHSRHS Cp Q a t g := by + change forcedSolutionEnergyNorm Q a + (boundaryForcedCaccioppoliCorrectorForcedCubeSolution + (Q := Q) (a := a) ρ) ≤ + zeroDirichletEnergyWithRHSRHS Cp Q a t g + rw [boundaryForcedCaccioppoliCorrectorForcedCubeSolution_energyNorm_eq] + exact henergy_bound V ht ht_lt hg + have hrhs_le_T : + coarsePoincareWithRHSGradientRHS Cp Q a (2 * t) g U ≤ H * T := by + dsimp [H, T, B, L₂] + exact coarsePoincareWithRHSGradientRHS_le_corrector_forceScale + (C := Cp) hCp_nonneg (Q := Q) (a := a) (t := t) (g := g) + U ht ht_lt hg henergy_forced + have hN_le : N ≤ H * T := hgrad_raw.trans hrhs_le_T + have hN_forced_nonneg : + 0 ≤ scaleNormalizedNegativeBesovVectorNorm Q (2 * t) (.finite 2) + (forcedSolutionGradientField U) := by + rw [scaleNormalizedNegativeBesovVectorNorm_finite_two_eq_cubeBesovNegativeVectorSeminormTwo] + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q (2 * t) + (forcedSolutionGradientField U) + (forcedSolutionGradientField_negativeBesovPartialSeminormTwo_bddAbove + U htwo_t_pos) + have hN_nonneg : 0 ≤ N := by + rw [← hgrad_eq] + exact hN_forced_nonneg + have hN_sq : N ^ 2 ≤ (H * T) ^ 2 := by + exact pow_le_pow_left₀ hN_nonneg hN_le 2 + have hscalar : L₁ * T ^ 2 ≤ A * F := by + dsimp [L₁, T, L₂, A, F, B] + exact lambdaS_mul_tpow_lambdaSqTwo_inv_sq_le_forceTime + (Q := Q) (a := a) (t := t) (B := B) ht ht_lt + have hgrad_sq : L₁ * N ^ 2 ≤ (H ^ 2 * A) * F := by + calc + L₁ * N ^ 2 ≤ L₁ * (H * T) ^ 2 := + mul_le_mul_of_nonneg_left hN_sq hL₁_nonneg + _ = H ^ 2 * (L₁ * T ^ 2) := by ring + _ ≤ H ^ 2 * (A * F) := + mul_le_mul_of_nonneg_left hscalar (sq_nonneg H) + _ = (H ^ 2 * A) * F := by ring + have hvalue0 : + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + Cv * (1 - 2 * t)⁻¹ * N ^ 2 := by + dsimp [N] + exact hvalue_bound ρ ht ht_lt + have hden_pos : 0 < 1 - 2 * t := by linarith + have hCv_den_nonneg : 0 ≤ Cv * (1 - 2 * t)⁻¹ := by + exact mul_nonneg hCv_pos.le (inv_nonneg.mpr hden_pos.le) + calc + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + Cv * (1 - 2 * t)⁻¹ * (L₁ * N ^ 2) := by + dsimp [L₁] + calc + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun = + Ch02.lambdaS Q t a * + (Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun) := by ring + _ ≤ Ch02.lambdaS Q t a * + (Cv * (1 - 2 * t)⁻¹ * N ^ 2) := + mul_le_mul_of_nonneg_left hvalue0 hL₁_nonneg + _ = Cv * (1 - 2 * t)⁻¹ * + (Ch02.lambdaS Q t a * N ^ 2) := by ring + _ ≤ Cv * (1 - 2 * t)⁻¹ * ((H ^ 2 * A) * F) := + mul_le_mul_of_nonneg_left hgrad_sq hCv_den_nonneg + _ = K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := by + dsimp [K, F, L₁, B] + rw [div_eq_mul_inv] + ring + +/-- Proved coarse parent `L²` bound for the zero-trace corrector. -/ +theorem zeroTraceCorrectorParentL2_le_forceScale + {d : ℕ} [NeZero d] : + ∃ K : ℝ, 0 < K ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g), + 0 < t → t < 1 / 2 → ForceBesovRegularity Q (2 * t) g → + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := + (coarseCaccioppoliRHSParentL2Bridge_of_zeroTraceValueBridge + coarseCaccioppoliRHSZeroTraceValueBridge).exists_constant + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/EnergySplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/EnergySplit.lean new file mode 100644 index 0000000000..a5b2225fa7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/EnergySplit.lean @@ -0,0 +1,576 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Setup + +/-! # Energy Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Coarse Caccioppoli with RHS Energy Split + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: split forced boundary Caccioppoli energy into the homogeneous part, +zero-trace corrector part, and cross terms using the public coefficient +representative. + +Downstream target: `CoarseCaccioppoliRHS/Prefactors.lean` and +`CoarseCaccioppoliRHS/FinalBounds.lean`. This file should contain energy +identities and inequalities only. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- On subsets of the open cube, public localized energy can be evaluated using +the pointwise deterministic coefficient representative. -/ +theorem localizedCoeffEnergyValue_eq_volumeAverage_publicCoeffField_of_subset_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {V : Set (Vec d)} + (hV : V ⊆ openCubeSet Q) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + localizedCoeffEnergyValue V (a.coeffOn Q) u = + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) u.grad) := by + have hcoeffV : + publicCoeffField Q a =ᵐ[volumeMeasureOn V] (a.coeffOn Q).toCoeffField := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset hV + (publicCoeffField_ae_eq_openCubeSet Q a) + have henergy_ae : + coefficientEnergyDensity (publicCoeffField Q a) u.grad + =ᵐ[volumeMeasureOn V] + coefficientEnergyDensity (a.coeffOn Q).toCoeffField u.grad := + hcoeffV.mono fun y hy => by + simp [coefficientEnergyDensity, hy] + rw [localizedCoeffEnergyValue_eq_volumeAverage_coefficientEnergyDensity] + exact (volumeAverage_eq_of_ae_eq henergy_ae).symm + +/-- Coefficient-energy triangle inequality for a decomposition `F = G + H` +over an arbitrary measurable set. -/ +theorem volumeAverage_coefficientEnergyDensity_le_two_mul_add_of_ae_eq_add + {d : ℕ} {V : Set (Vec d)} {A : CoeffField d} {lam Lam : ℝ} + {F G H : Vec d → Vec d} + (hEll : IsEllipticFieldOn lam Lam V A) + (hF : MemVectorL2 V F) + (hG : MemVectorL2 V G) + (hH : MemVectorL2 V H) + (hFGH : F =ᵐ[volumeMeasureOn V] fun y => G y + H y) : + volumeAverage V (coefficientEnergyDensity A F) ≤ + 2 * volumeAverage V (coefficientEnergyDensity A G) + + 2 * volumeAverage V (coefficientEnergyDensity A H) := by + let Hneg : Vec d → Vec d := (-1 : ℝ) • H + have hHneg : MemVectorL2 V Hneg := by + dsimp [Hneg] + exact hH.const_smul (-1) + have hF_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A F) V := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hF + have hG_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A G) V := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hG + have hHneg_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A Hneg) V := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hHneg + have hmem : + ∀ᵐ y ∂volumeMeasureOn V, y ∈ V := + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun _ hy => hy) + have hpoint : + ∀ᵐ y ∂volumeMeasureOn V, + coefficientEnergyDensity A F y ≤ + 2 * (coefficientEnergyDensity A G y + + coefficientEnergyDensity A Hneg y) := by + filter_upwards [hmem, hFGH] with y hy hsum + have hleft : + coefficientEnergyDensity A F y = + coefficientEnergyDensity A (fun z => G z - Hneg z) y := by + have hvec : F y = G y - Hneg y := by + rw [hsum] + simp [Hneg] + unfold coefficientEnergyDensity + rw [hvec] + exact hleft.trans_le + (coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + hEll G Hneg y hy) + have havg_raw : + volumeAverage V (coefficientEnergyDensity A F) ≤ + volumeAverage V + (fun y => 2 * (coefficientEnergyDensity A G y + + coefficientEnergyDensity A Hneg y)) := by + unfold volumeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr ENNReal.toReal_nonneg) + exact + MeasureTheory.integral_mono_ae hF_int + ((hG_int.add hHneg_int).const_mul (2 : ℝ)) hpoint + have hsplit : + volumeAverage V + (fun y => 2 * (coefficientEnergyDensity A G y + + coefficientEnergyDensity A Hneg y)) = + 2 * volumeAverage V (coefficientEnergyDensity A G) + + 2 * volumeAverage V (coefficientEnergyDensity A Hneg) := by + unfold volumeAverage + have hfun : + (fun y => 2 * (coefficientEnergyDensity A G y + + coefficientEnergyDensity A Hneg y)) = + fun y => 2 * coefficientEnergyDensity A G y + + 2 * coefficientEnergyDensity A Hneg y := by + funext y + ring + rw [hfun, MeasureTheory.integral_add (hG_int.const_mul (2 : ℝ)) + (hHneg_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + have hneg_avg : + volumeAverage V (coefficientEnergyDensity A Hneg) = + volumeAverage V (coefficientEnergyDensity A H) := by + apply volumeAverage_eq_of_ae_eq + exact Filter.Eventually.of_forall fun y => by + unfold coefficientEnergyDensity + simp [Hneg, matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + calc + volumeAverage V (coefficientEnergyDensity A F) + ≤ + volumeAverage V + (fun y => 2 * (coefficientEnergyDensity A G y + + coefficientEnergyDensity A Hneg y)) := havg_raw + _ = + 2 * volumeAverage V (coefficientEnergyDensity A G) + + 2 * volumeAverage V (coefficientEnergyDensity A Hneg) := hsplit + _ = + 2 * volumeAverage V (coefficientEnergyDensity A G) + + 2 * volumeAverage V (coefficientEnergyDensity A H) := by + rw [hneg_avg] + +/-- A core average is controlled by the parent cube average with the +dimension-only volume ratio `18^d`. -/ +theorem normalizedSetAverage_caccioppoliCoreSet_le_eighteen_pow_mul_cubeAverage + {d : ℕ} (Q : TriadicCube d) {x : Vec d} {energy : Vec d → ℝ} + (hx : x ∈ openCubeSet Q) + (henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + normalizedSetAverage (caccioppoliCoreSet Q x) energy ≤ + (18 : ℝ) ^ d * cubeAverage Q energy := by + have hcore_sub_cube_ae : + caccioppoliCoreSet Q x ≤ᵐ[MeasureTheory.volume] cubeSet Q := + Filter.Eventually.of_forall fun y hy => + caccioppoliCoreSet_subset_cubeSet Q x hy + have hnonneg_ae : + 0 ≤ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] energy := by + change ∀ᵐ y ∂MeasureTheory.volume.restrict (cubeSet Q), 0 ≤ energy y + rw [MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)] + exact Filter.Eventually.of_forall henergy_nonneg + have hraw : + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume ≤ + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume := + MeasureTheory.setIntegral_mono_set henergy_int hnonneg_ae hcore_sub_cube_ae + have hratio := caccioppoliCoreSet_volumeRatio_le_eighteen_pow Q hx + have hcube_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hvol_ne : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + unfold normalizedSetAverage volumeAverage + calc + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume ≤ + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hraw + (inv_nonneg.mpr ENNReal.toReal_nonneg) + _ = + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + cubeVolume Q) * + (cubeVolume Q)⁻¹ * + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume := by + calc + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume = + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + (1 * ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume) := by + ring + _ = + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + ((cubeVolume Q * (cubeVolume Q)⁻¹) * + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume) := by + rw [mul_inv_cancel₀ hvol_ne] + _ = + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + cubeVolume Q) * + (cubeVolume Q)⁻¹ * + ∫ y in cubeSet Q, energy y ∂MeasureTheory.volume := by + ring + _ = + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + cubeVolume Q) * + (cubeAverage Q energy) := by + simp [cubeAverage] + ring + _ ≤ + (18 : ℝ) ^ d * cubeAverage Q energy := + mul_le_mul_of_nonneg_right hratio hcube_nonneg + +/-- The zero-trace corrector's localized core energy is controlled by its +parent cube coefficient energy with only the geometric `18^d` loss. -/ +theorem boundaryForcedCaccioppoliCorrector_coreEnergy_le_eighteen_pow_mul_parentEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hx : x ∈ openCubeSet Q) : + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function ≤ + (18 : ℝ) ^ d * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun y => ρ.toH10.toH1Function.grad y)) := by + let energy : Vec d → ℝ := + coefficientEnergyDensity (publicCoeffField Q a) + (fun y => ρ.toH10.toH1Function.grad y) + have hcore_open : caccioppoliCoreSet Q x ⊆ openCubeSet Q := fun y hy => hy.1 + have henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun y => ρ.toH10.toH1Function.grad y) + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + ρ.toH10.toH1Function.grad_memVectorL2 + have hcore : + normalizedSetAverage (caccioppoliCoreSet Q x) energy ≤ + (18 : ℝ) ^ d * cubeAverage Q energy := + normalizedSetAverage_caccioppoliCoreSet_le_eighteen_pow_mul_cubeAverage + Q hx henergy_nonneg henergy_int + have henergy_core : + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function = + normalizedSetAverage (caccioppoliCoreSet Q x) energy := by + simpa [energy, normalizedSetAverage] using + localizedCoeffEnergyValue_eq_volumeAverage_publicCoeffField_of_subset_openCubeSet + (Q := Q) (a := a) hcore_open + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function + simpa [energy, henergy_core] using hcore + +/-- The public zero-Dirichlet RHS is nonnegative under the force regularity +hypothesis. -/ +theorem zeroDirichletEnergyWithRHSRHS_nonneg + {d : ℕ} [NeZero d] {C : ℝ} (hC_nonneg : 0 ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ht : 0 < t) (hg : ForceBesovRegularity Q (2 * t) g) : + 0 ≤ zeroDirichletEnergyWithRHSRHS C Q a t g := by + unfold zeroDirichletEnergyWithRHSRHS poincareLowerEllipticityFactor + exact mul_nonneg + (mul_nonneg + (mul_nonneg hC_nonneg (Real.rpow_nonneg ht.le _)) + (Real.rpow_nonneg + (Ch02.lambdaSq_finite_nonneg Q a ht + (by norm_num : (1 : ℝ) ≤ 2)) _)) + (scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := 2 * t) (g := g) hg) + +/-- Squared form of the zero-trace corrector energy estimate, tuned to the +`t`-notation used by the boundary Caccioppoli RHS theorem. -/ +theorem zeroTraceDirichletCorrectorData_parentEnergy_le_zeroDirichletEnergyWithRHSRHS_sq_publicCoeffField + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (ht : 0 < t) (ht_lt : t < 1 / 2) + (hg : ForceBesovRegularity Q (2 * t) g) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g) ^ 2 := by + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + let Z : ℝ := zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + have hZ_nonneg : 0 ≤ Z := by + dsimp [Z] + exact zeroDirichletEnergyWithRHSRHS_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d) hC_nonneg) ht hg + have hs : 0 < 2 * t := by nlinarith + have hs_lt : 2 * t < 1 := by nlinarith + have hs_half : 2 * t / 2 = t := by ring + have hsqrt_le : + Real.sqrt E ≤ Z := by + dsimp [E, Z] + simpa [hs_half] using + zeroTraceDirichletCorrectorData_energyNorm_le_zeroDirichletEnergyWithRHSRHS_half_publicCoeffField + (C := C) hC_nonneg hC_zero + (Q := Q) (a := a) (s := 2 * t) (g := g) ρ hs hs_lt hg + have hsquare : (Real.sqrt E) ^ 2 ≤ Z ^ 2 := by + nlinarith [hsqrt_le, Real.sqrt_nonneg E, hZ_nonneg, + sq_nonneg (Z - Real.sqrt E)] + calc + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + = E := rfl + _ = (Real.sqrt E) ^ 2 := (Real.sq_sqrt hE_nonneg).symm + _ ≤ Z ^ 2 := hsquare + _ = (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g) ^ 2 := rfl + +/-- The localized corrector core is controlled directly by the square of the +public zero-Dirichlet RHS, with only the geometric `18^d` loss. -/ +theorem boundaryForcedCaccioppoliCorrector_coreEnergy_le_eighteen_pow_mul_zeroDirichletEnergyWithRHSRHS_sq + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {x : Vec d} {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (ht : 0 < t) (ht_lt : t < 1 / 2) + (hx : x ∈ openCubeSet Q) + (hg : ForceBesovRegularity Q (2 * t) g) : + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function ≤ + (18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g) ^ 2 := by + have hcore := + boundaryForcedCaccioppoliCorrector_coreEnergy_le_eighteen_pow_mul_parentEnergy + (Q := Q) (a := a) (x := x) (g := g) ρ hx + have hparent := + zeroTraceDirichletCorrectorData_parentEnergy_le_zeroDirichletEnergyWithRHSRHS_sq_publicCoeffField + (C := C) hC_nonneg hC_zero + (Q := Q) (a := a) (t := t) (g := g) ρ ht ht_lt hg + have hgeom_nonneg : 0 ≤ (18 : ℝ) ^ d := by positivity + exact hcore.trans (mul_le_mul_of_nonneg_left hparent hgeom_nonneg) + +/-- Localized core-energy split for the manuscript decomposition `u = w + ρ`. +-/ +theorem boundaryForcedCaccioppoliCoreEnergy_le_two_mul_remainder_add_corrector + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + boundaryForcedCaccioppoliCoreEnergy u ≤ + 2 * boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) + + 2 * localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ).toH1Function := by + let V : Set (Vec d) := caccioppoliCoreSet Q x + let wDatum : BoundaryCaccioppoliDatum Q a x := + boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem + let ρOpen : H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ + have hV_open : V ⊆ openCubeSet Q := fun y hy => hy.1 + have hV_cube : V ⊆ cubeSet Q := + (fun y hy => openCubeSet_subset_cubeSet Q (hV_open hy)) + have hmono_open : + volumeMeasureOn V ≤ volumeMeasureOn (openCubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hV_open + have hmono_cube : + volumeMeasureOn V ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hV_cube + have hu_mem : MemVectorL2 V u.toH1.grad := by + exact u.toH1.grad_memVectorL2.mono_measure hmono_open + have hw_mem : MemVectorL2 V wDatum.toH1.grad := by + exact wDatum.toH1.grad_memVectorL2.mono_measure hmono_open + have hρ_mem : MemVectorL2 V ρOpen.toH1Function.grad := by + simpa [ρOpen] using + ρ.toH10.toH1Function.grad_memVectorL2.mono_measure hmono_cube + have hsplit : + u.toH1.grad =ᵐ[volumeMeasureOn V] + fun y => wDatum.toH1.grad y + ρOpen.toH1Function.grad y := by + exact Filter.Eventually.of_forall fun y => by + simp only [wDatum, ρOpen, boundaryForcedCaccioppoliRemainderDatum_toH1, + boundaryForcedCaccioppoliRemainderOpenH1_grad, + boundaryForcedCaccioppoliCorrectorOpenH10_grad] + abel + have htriangle : + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad) ≤ + 2 * volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) wDatum.toH1.grad) + + 2 * volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) ρOpen.toH1Function.grad) := + volumeAverage_coefficientEnergyDensity_le_two_mul_add_of_ae_eq_add + (V := V) (A := publicCoeffField Q a) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + ((publicCoeffField_isEllipticFieldOn_cubeSet Q a).mono + (measurableSet_caccioppoliCoreSet Q x) hV_cube) + hu_mem hw_mem hρ_mem hsplit + have henergy_u : + boundaryForcedCaccioppoliCoreEnergy u = + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad) := by + simpa [boundaryForcedCaccioppoliCoreEnergy, V] using + localizedCoeffEnergyValue_eq_volumeAverage_publicCoeffField_of_subset_openCubeSet + (Q := Q) (a := a) hV_open u.toH1 + have henergy_w : + boundaryCaccioppoliCoreEnergy wDatum = + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) wDatum.toH1.grad) := by + simpa [boundaryCaccioppoliCoreEnergy, V, wDatum] using + localizedCoeffEnergyValue_eq_volumeAverage_publicCoeffField_of_subset_openCubeSet + (Q := Q) (a := a) hV_open wDatum.toH1 + have henergy_ρ : + localizedCoeffEnergyValue V (a.coeffOn Q) ρOpen.toH1Function = + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) ρOpen.toH1Function.grad) := by + simpa [V, ρOpen] using + localizedCoeffEnergyValue_eq_volumeAverage_publicCoeffField_of_subset_openCubeSet + (Q := Q) (a := a) hV_open ρOpen.toH1Function + calc + boundaryForcedCaccioppoliCoreEnergy u + = + volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad) := henergy_u + _ ≤ + 2 * volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) wDatum.toH1.grad) + + 2 * volumeAverage V + (coefficientEnergyDensity (publicCoeffField Q a) ρOpen.toH1Function.grad) := + htriangle + _ = + 2 * boundaryCaccioppoliCoreEnergy wDatum + + 2 * localizedCoeffEnergyValue V (a.coeffOn Q) ρOpen.toH1Function := by + rw [henergy_w, henergy_ρ] + +/-- Parent `L²` split for the manuscript decomposition `w = u - ρ`. -/ +theorem boundaryForcedCaccioppoliRemainder_parentL2_le_two_mul_forced_add_corrector + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + boundaryCaccioppoliParentL2Sq + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + 2 * boundaryForcedCaccioppoliParentL2Sq u + + 2 * normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun := by + let U : Set (Vec d) := openCubeSet Q + let wDatum : BoundaryCaccioppoliDatum Q a x := + boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem + let ρOpen : H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ + have hw_int : + MeasureTheory.IntegrableOn (fun y => wDatum.toH1.toFun y ^ 2) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, U, wDatum, + Ch02.cubeDomain_coe, Real.norm_eq_abs, sq_abs] using + wDatum.toH1.memL2.integrable_sq + have hu_int : + MeasureTheory.IntegrableOn (fun y => u.toH1.toFun y ^ 2) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, U, + Ch02.cubeDomain_coe, Real.norm_eq_abs, sq_abs] using + u.toH1.memL2.integrable_sq + have hρ_int : + MeasureTheory.IntegrableOn (fun y => ρOpen.toH1Function.toFun y ^ 2) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, U, ρOpen, + Ch02.cubeDomain_coe, Real.norm_eq_abs, sq_abs] using + ρOpen.toH1Function.memL2.integrable_sq + have hpoint : + ∀ᵐ y ∂volumeMeasureOn U, + wDatum.toH1.toFun y ^ 2 ≤ + 2 * u.toH1.toFun y ^ 2 + 2 * ρOpen.toH1Function.toFun y ^ 2 := by + exact Filter.Eventually.of_forall fun y => by + have hsq : + (u.toH1.toFun y - ρOpen.toH1Function.toFun y) ^ 2 ≤ + 2 * u.toH1.toFun y ^ 2 + 2 * ρOpen.toH1Function.toFun y ^ 2 := by + nlinarith [sq_nonneg (u.toH1.toFun y + ρOpen.toH1Function.toFun y)] + simpa only [wDatum, ρOpen, boundaryForcedCaccioppoliRemainderDatum_toH1, + boundaryForcedCaccioppoliRemainderOpenH1_toFun, + boundaryForcedCaccioppoliCorrectorOpenH10_toFun] using hsq + have havg_raw : + volumeAverage U (fun y => wDatum.toH1.toFun y ^ 2) ≤ + volumeAverage U + (fun y => 2 * u.toH1.toFun y ^ 2 + + 2 * ρOpen.toH1Function.toFun y ^ 2) := by + unfold volumeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr ENNReal.toReal_nonneg) + exact + MeasureTheory.integral_mono_ae hw_int + ((hu_int.const_mul (2 : ℝ)).add (hρ_int.const_mul (2 : ℝ))) hpoint + have hsplit : + volumeAverage U + (fun y => 2 * u.toH1.toFun y ^ 2 + + 2 * ρOpen.toH1Function.toFun y ^ 2) = + 2 * volumeAverage U (fun y => u.toH1.toFun y ^ 2) + + 2 * volumeAverage U (fun y => ρOpen.toH1Function.toFun y ^ 2) := by + unfold volumeAverage + rw [MeasureTheory.integral_add (hu_int.const_mul (2 : ℝ)) + (hρ_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + calc + boundaryCaccioppoliParentL2Sq wDatum + = + volumeAverage U (fun y => wDatum.toH1.toFun y ^ 2) := by + rfl + _ ≤ + volumeAverage U + (fun y => 2 * u.toH1.toFun y ^ 2 + + 2 * ρOpen.toH1Function.toFun y ^ 2) := havg_raw + _ = + 2 * volumeAverage U (fun y => u.toH1.toFun y ^ 2) + + 2 * volumeAverage U (fun y => ρOpen.toH1Function.toFun y ^ 2) := hsplit + _ = + 2 * boundaryForcedCaccioppoliParentL2Sq u + + 2 * normalizedL2SqOnSet U ρOpen.toH1Function.toFun := by + rfl + +/-- Apply the proved homogeneous boundary Caccioppoli theorem to the harmonic +remainder produced from a forced datum. -/ +theorem boundaryForcedCaccioppoliRemainder_coreEnergy_le_homogeneousRHS + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hx : x ∈ openCubeSet Q) : + ∃ C : ℝ, 0 < C ∧ + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) := by + rcases (coarseCaccioppoliTheory d).exists_constant with + ⟨C, hC_pos, hboundary, _hinterior⟩ + exact + ⟨C, hC_pos, + hboundary + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) + hs ht hst hx⟩ + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/FinalBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/FinalBounds.lean new file mode 100644 index 0000000000..df63442471 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/FinalBounds.lean @@ -0,0 +1,520 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSMonotonicity + +/-! # Final Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Final Boundary Bounds for Coarse Caccioppoli with RHS + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: combine homogeneous Caccioppoli, zero-trace corrector bounds, and scalar +absorptions into the final public boundary with-RHS estimate. + +Downstream target: `CoarseCaccioppoliRHS/Bridges.lean`. This file should stay +as final-bound assembly, with no extra public `*Theory` surface. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Coarse-form absorption of the zero-trace corrector parent `L²` term. + +This is the scalar bridge matching the LaTeX proof after the corrector parent +`L²` estimate has been stated with the coarse lower ellipticity: +`lambdaS * scale^{-2} * ||ρ||² <= K * forceTerm`. No uniform ellipticity +constant appears in the conclusion. -/ +theorem boundaryForcedCaccioppoliCorrector_parentL2_term_le_RHS_of_scaled_force_bound + {d : ℕ} [NeZero d] {K C_hom C_final : ℝ} + (hM : 1 ≤ 4 * K) + (hC_hom_nonneg : 0 ≤ C_hom) + (hMC : (4 * K) * C_hom ≤ C_final) + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) + (hscaled : + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2)) : + 4 * caccioppoliPrefactor C_hom Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + boundaryCaccioppoliWithRHSRHS C_final s t u := by + let P : ℝ := caccioppoliWithRHSPrefactor C_hom Q a s t + let Pfinal : ℝ := caccioppoliWithRHSPrefactor C_final Q a s t + let L : ℝ := Ch02.lambdaS Q t a + let S : ℝ := Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + let R0 : ℝ := + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + let A : ℝ := + L * S * boundaryForcedCaccioppoliParentL2Sq u + let F : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact caccioppoliWithRHSPrefactor_nonneg hC_hom_nonneg hs ht hst + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hscaled' : L * S * R0 ≤ K * F := by + dsimp [L, S, R0, F] + exact hscaled + have hterm : + 4 * caccioppoliPrefactor C_hom Q a s t * R0 ≤ + (4 * K * P) * F := by + have hid := + caccioppoliPrefactor_eq_caccioppoliWithRHSPrefactor_mul_lambdaS_scale + (C := C_hom) (Q := Q) (a := a) hs ht hst + have hp_scaled : P * (L * S * R0) ≤ P * (K * F) := + mul_le_mul_of_nonneg_left hscaled' hP_nonneg + calc + 4 * caccioppoliPrefactor C_hom Q a s t * R0 = + 4 * (P * (L * S * R0)) := by + dsimp [P, L, S, R0] + rw [hid] + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ 4 * (P * (K * F)) := + mul_le_mul_of_nonneg_left hp_scaled + (by norm_num : (0 : ℝ) ≤ 4) + _ = (4 * K * P) * F := by ring + have hC_final_nonneg : 0 ≤ C_final := by + have hM_nonneg : 0 ≤ 4 * K := le_trans (by norm_num) hM + exact (mul_nonneg hM_nonneg hC_hom_nonneg).trans hMC + have hPfinal_nonneg : 0 ≤ Pfinal := by + dsimp [Pfinal] + exact caccioppoliWithRHSPrefactor_nonneg hC_final_nonneg hs ht hst + have hA_nonneg : 0 ≤ A := by + have hL : 0 ≤ L := by + dsimp [L] + unfold Ch02.lambdaS + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 1)).le + have hS : 0 ≤ S := by + dsimp [S] + exact Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hparent : + 0 ≤ boundaryForcedCaccioppoliParentL2Sq u := + normalizedL2SqOnSet_nonneg (openCubeSet Q) u.toH1.toFun + (measurableSet_openCubeSet Q) + dsimp [A] + exact mul_nonneg (mul_nonneg hL hS) hparent + have hpref : + (4 * K) * P ≤ Pfinal := by + dsimp [P, Pfinal] + exact caccioppoliWithRHSPrefactor_mul_const_le_of_mul_constant_le + (M := 4 * K) (C₁ := C_hom) (C₂ := C_final) + hM hC_hom_nonneg hMC hs ht hst + have hforce_to_rhs : + (4 * K * P) * F ≤ boundaryCaccioppoliWithRHSRHS C_final s t u := by + calc + (4 * K * P) * F = + ((4 * K) * P) * F := by ring + _ ≤ Pfinal * F := mul_le_mul_of_nonneg_right hpref hF_nonneg + _ ≤ Pfinal * (A + F) := + mul_le_mul_of_nonneg_left (le_add_of_nonneg_left hA_nonneg) + hPfinal_nonneg + _ = boundaryCaccioppoliWithRHSRHS C_final s t u := by + rfl + exact hterm.trans hforce_to_rhs + +/-- The first forced RHS summand absorbs a constant multiple of the homogeneous +parent contribution after enlarging the public dimension constant. -/ +theorem caccioppoliPrefactor_const_mul_forcedParentL2_le_boundaryCaccioppoliWithRHSRHS + {d : ℕ} [NeZero d] {M C₁ C₂ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + M * caccioppoliPrefactor C₁ Q a s t * + boundaryForcedCaccioppoliParentL2Sq u ≤ + boundaryCaccioppoliWithRHSRHS C₂ s t u := by + have hC₂_nonneg : 0 ≤ C₂ := by + have hM_nonneg : 0 ≤ M := le_trans (by norm_num) hM + exact (mul_nonneg hM_nonneg hC₁).trans hMC₁C₂ + have hpref : + M * caccioppoliPrefactor C₁ Q a s t ≤ + caccioppoliPrefactor C₂ Q a s t := + caccioppoliPrefactor_mul_const_le_of_mul_constant_le + hM hC₁ hMC₁C₂ hs ht hst + have hparent : + 0 ≤ boundaryForcedCaccioppoliParentL2Sq u := + normalizedL2SqOnSet_nonneg (openCubeSet Q) u.toH1.toFun + (measurableSet_openCubeSet Q) + calc + M * caccioppoliPrefactor C₁ Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + ≤ caccioppoliPrefactor C₂ Q a s t * + boundaryForcedCaccioppoliParentL2Sq u := + mul_le_mul_of_nonneg_right hpref hparent + _ ≤ boundaryCaccioppoliWithRHSRHS C₂ s t u := + caccioppoliPrefactor_mul_forcedParentL2_le_boundaryCaccioppoliWithRHSRHS + u hC₂_nonneg hs ht ht_lt hst + +/-- Exact split after subtracting the zero-trace corrector and applying the +homogeneous Caccioppoli estimate to the harmonic remainder. + +This is the PDE assembly core. The remaining work for the final theorem is +pure scalar absorption of the two corrector terms into the displayed forced +right-hand side. -/ +theorem boundaryForcedCaccioppoliCoreEnergy_le_split_homogeneous_corrector + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hhom : + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem)) : + boundaryForcedCaccioppoliCoreEnergy u ≤ + 4 * caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + + 4 * caccioppoliPrefactor C Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + + 2 * localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function := by + let wDatum : BoundaryCaccioppoliDatum Q a x := + boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem + let ρOpen : H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ + let P : ℝ := caccioppoliPrefactor C Q a s t + let U0 : ℝ := boundaryForcedCaccioppoliParentL2Sq u + let R0 : ℝ := normalizedL2SqOnSet (openCubeSet Q) ρOpen.toH1Function.toFun + let Eρ : ℝ := + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + ρOpen.toH1Function + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact caccioppoliPrefactor_nonneg hC_nonneg hs ht hst + have hcore_split : + boundaryForcedCaccioppoliCoreEnergy u ≤ + 2 * boundaryCaccioppoliCoreEnergy wDatum + 2 * Eρ := by + dsimp [wDatum, Eρ, ρOpen] + exact + boundaryForcedCaccioppoliCoreEnergy_le_two_mul_remainder_add_corrector + (Q := Q) (a := a) (x := x) (g := g) u ρ hg_mem + have hparent_split : + boundaryCaccioppoliParentL2Sq wDatum ≤ 2 * U0 + 2 * R0 := by + dsimp [wDatum, U0, R0, ρOpen] + exact + boundaryForcedCaccioppoliRemainder_parentL2_le_two_mul_forced_add_corrector + (Q := Q) (a := a) (x := x) (g := g) u ρ hg_mem + have hhom_split : + boundaryCaccioppoliCoreEnergy wDatum ≤ P * (2 * U0 + 2 * R0) := by + calc + boundaryCaccioppoliCoreEnergy wDatum + ≤ boundaryCaccioppoliRHS C s t wDatum := by + simpa [wDatum] using hhom + _ ≤ P * (2 * U0 + 2 * R0) := by + unfold boundaryCaccioppoliRHS + exact mul_le_mul_of_nonneg_left hparent_split hP_nonneg + calc + boundaryForcedCaccioppoliCoreEnergy u + ≤ 2 * boundaryCaccioppoliCoreEnergy wDatum + 2 * Eρ := hcore_split + _ ≤ 2 * (P * (2 * U0 + 2 * R0)) + 2 * Eρ := by + exact add_le_add + (mul_le_mul_of_nonneg_left hhom_split (by norm_num : (0 : ℝ) ≤ 2)) + (le_refl (2 * Eρ)) + _ = + 4 * P * U0 + 4 * P * R0 + 2 * Eρ := by ring + _ = + 4 * caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + + 4 * caccioppoliPrefactor C Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + + 2 * localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function := by + rfl + +/-- Split form with the corrector core energy already bounded by the public +zero-Dirichlet RHS estimate. The only analytic term still not absorbed is the +corrector parent `L²` contribution. -/ +theorem boundaryForcedCaccioppoliCoreEnergy_le_split_homogeneous_zeroDirichlet + {d : ℕ} [NeZero d] {C C₀ : ℝ} + (hC_nonneg : 0 ≤ C) + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) (hx : x ∈ openCubeSet Q) + (hg : ForceBesovRegularity Q (2 * t) g) + (hhom : + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem)) : + boundaryForcedCaccioppoliCoreEnergy u ≤ + 4 * caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + + 4 * caccioppoliPrefactor C Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + + 2 * ((18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a t g) ^ 2) := by + let ρOpen : H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ + let Eρ : ℝ := + localizedCoeffEnergyValue (caccioppoliCoreSet Q x) (a.coeffOn Q) + ρOpen.toH1Function + have hsplit := + boundaryForcedCaccioppoliCoreEnergy_le_split_homogeneous_corrector + (C := C) (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u ρ hg_mem hC_nonneg hs ht hst hhom + have hcoreρ : + Eρ ≤ (18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a t g) ^ 2 := by + dsimp [Eρ, ρOpen] + exact + boundaryForcedCaccioppoliCorrector_coreEnergy_le_eighteen_pow_mul_zeroDirichletEnergyWithRHSRHS_sq + (C := C₀) hC₀_nonneg hC₀_zero + (Q := Q) (a := a) (t := t) (x := x) (g := g) + ρ ht ht_lt hx hg + have hscaled : + 2 * Eρ ≤ + 2 * ((18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a t g) ^ 2) := + mul_le_mul_of_nonneg_left hcoreρ (by norm_num : (0 : ℝ) ≤ 2) + calc + boundaryForcedCaccioppoliCoreEnergy u + ≤ + 4 * caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + + 4 * caccioppoliPrefactor C Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + + 2 * Eρ := by + simpa [Eρ, ρOpen] using hsplit + _ ≤ + 4 * caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + + 4 * caccioppoliPrefactor C Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + + 2 * ((18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a t g) ^ 2) := by + exact add_le_add_right hscaled _ + +/-- Conditional final assembly for the forced boundary Caccioppoli estimate. + +All PDE and scalar pieces have been discharged here except the genuinely +analytic input controlling the zero-trace corrector's parent `L²` term. Once +that bridge is supplied in the `hcorrectorParent` hypothesis, the displayed +public RHS follows after one last constant enlargement. -/ +theorem boundaryForcedCaccioppoliCoreEnergy_le_RHS_of_correctorParent_absorption + {d : ℕ} [NeZero d] {C_hom C₀ C_inner C_final : ℝ} + (hC_hom_nonneg : 0 ≤ C_hom) + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_inner_one : 1 ≤ C_inner) + (h4_hom_inner : 4 * C_hom ≤ C_inner) + (hzero_inner : + (2 * (18 : ℝ) ^ d) * + ((25 * Real.exp 4) * (((d : ℝ) * C₀) ^ 2)) ≤ C_inner ^ 2) + (h3_inner_final : 3 * C_inner ≤ C_final) + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) (hx : x ∈ openCubeSet Q) + (hg : ForceBesovRegularity Q (2 * t) g) + (hhom : + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C_hom s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem)) + (hcorrectorParent : + 4 * caccioppoliPrefactor C_hom Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + boundaryCaccioppoliWithRHSRHS C_inner s t u) : + boundaryForcedCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliWithRHSRHS C_final s t u := by + let A : ℝ := + 4 * caccioppoliPrefactor C_hom Q a s t * + boundaryForcedCaccioppoliParentL2Sq u + let B : ℝ := + 4 * caccioppoliPrefactor C_hom Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun + let D : ℝ := + 2 * ((18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a t g) ^ 2) + let R : ℝ := boundaryCaccioppoliWithRHSRHS C_inner s t u + have hsplit : + boundaryForcedCaccioppoliCoreEnergy u ≤ A + B + D := by + dsimp [A, B, D] + exact + boundaryForcedCaccioppoliCoreEnergy_le_split_homogeneous_zeroDirichlet + (C := C_hom) (C₀ := C₀) + hC_hom_nonneg hC₀_nonneg hC₀_zero + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u ρ hg_mem hs ht ht_lt hst hx hg hhom + have hA : A ≤ R := by + dsimp [A, R] + simpa using + caccioppoliPrefactor_const_mul_forcedParentL2_le_boundaryCaccioppoliWithRHSRHS + (M := (4 : ℝ)) (C₁ := C_hom) (C₂ := C_inner) + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u (by norm_num : (1 : ℝ) ≤ 4) hC_hom_nonneg h4_hom_inner + hs ht ht_lt hst + have hB : B ≤ R := by + dsimp [B, R] + exact hcorrectorParent + have hD : D ≤ R := by + dsimp [D, R] + exact + boundaryCaccioppoliWithRHS_zeroDirichletSqTerm_le_RHS + (C := C_inner) (C₀ := (d : ℝ) * C₀) + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u hzero_inner hC_inner_one hs hs_lt ht ht_lt hst + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact boundaryCaccioppoliWithRHSRHS_nonneg + u (le_trans zero_le_one hC_inner_one) hs ht ht_lt hst + have hsum : A + B + D ≤ 3 * R := by + calc + A + B + D ≤ R + R + R := add_le_add (add_le_add hA hB) hD + _ = 3 * R := by ring + have hfinal : + 3 * R ≤ boundaryCaccioppoliWithRHSRHS C_final s t u := by + dsimp [R] + exact boundaryCaccioppoliWithRHSRHS_mul_const_le_of_mul_constant_le + (M := (3 : ℝ)) (C₁ := C_inner) (C₂ := C_final) + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u (by norm_num : (1 : ℝ) ≤ 3) (le_trans zero_le_one hC_inner_one) + h3_inner_final hs ht ht_lt hst + exact hsplit.trans (hsum.trans hfinal) + +/-- Conditional final assembly using the coarse-scaled parent `L²` estimate for +the zero-trace corrector. + +Compared with +`boundaryForcedCaccioppoliCoreEnergy_le_RHS_of_correctorParent_absorption`, this +is the theorem-shape reduction that remains faithful to the displayed +Caccioppoli-with-RHS estimate: the remaining analytic input is precisely a +bound for `lambdaS * scale^{-2} * ||ρ||²_parent` by a dimension-only multiple +of the forcing summand. -/ +theorem boundaryForcedCaccioppoliCoreEnergy_le_RHS_of_correctorParent_scaled_force_bound + {d : ℕ} [NeZero d] {K C_hom C₀ C_inner C_final : ℝ} + (hK_enlarge : 1 ≤ 4 * K) + (hC_hom_nonneg : 0 ≤ C_hom) + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_inner_one : 1 ≤ C_inner) + (h4_hom_inner : 4 * C_hom ≤ C_inner) + (hcorrector_inner : (4 * K) * C_hom ≤ C_inner) + (hzero_inner : + (2 * (18 : ℝ) ^ d) * + ((25 * Real.exp 4) * (((d : ℝ) * C₀) ^ 2)) ≤ C_inner ^ 2) + (h3_inner_final : 3 * C_inner ≤ C_final) + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) (hx : x ∈ openCubeSet Q) + (hg : ForceBesovRegularity Q (2 * t) g) + (hhom : + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C_hom s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem)) + (hcorrectorScaled : + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2)) : + boundaryForcedCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliWithRHSRHS C_final s t u := by + have hcorrectorParent : + 4 * caccioppoliPrefactor C_hom Q a s t * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + boundaryCaccioppoliWithRHSRHS C_inner s t u := by + exact + boundaryForcedCaccioppoliCorrector_parentL2_term_le_RHS_of_scaled_force_bound + (K := K) (C_hom := C_hom) (C_final := C_inner) + hK_enlarge hC_hom_nonneg hcorrector_inner + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u ρ hs ht ht_lt hst hcorrectorScaled + exact + boundaryForcedCaccioppoliCoreEnergy_le_RHS_of_correctorParent_absorption + (C_hom := C_hom) (C₀ := C₀) (C_inner := C_inner) + (C_final := C_final) + hC_hom_nonneg hC₀_nonneg hC₀_zero hC_inner_one h4_hom_inner + hzero_inner h3_inner_final + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u ρ hg_mem hs hs_lt ht ht_lt hst hx hg hhom hcorrectorParent + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Prefactors.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Prefactors.lean new file mode 100644 index 0000000000..de9e7c76d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Prefactors.lean @@ -0,0 +1,347 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.EnergySplit + +/-! # Prefactors -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Coarse Caccioppoli with RHS Prefactors + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: convert homogeneous Caccioppoli prefactors into the with-RHS prefactor +normalization used by the public boundary estimate. + +Downstream target: `CoarseCaccioppoliRHS/ZeroTraceValue.lean`. This file +should stay scalar-prefactor algebra, not analytic bridge packaging. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Scalar identity converting the homogeneous Caccioppoli prefactor into the +first term of the forced Caccioppoli RHS. -/ +theorem caccioppoliPrefactor_eq_caccioppoliWithRHSPrefactor_mul_lambdaS_scale + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + caccioppoliPrefactor C Q a s t = + caccioppoliWithRHSPrefactor C Q a s t * + (Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) ) := by + let σ : ℝ := 1 - s - t + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hlambda_pos : 0 < Ch02.lambdaS Q t a := by + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 1) + have hTheta_pos : 0 < Ch02.ThetaRatio Q s t a := + lt_of_lt_of_le zero_lt_one (Ch02.one_le_ThetaRatio_of_pos Q a hs ht) + have hden : 1 - s - t ≠ 0 := by + linarith + have hexp : + (1 - t) / (1 - s - t) = s / (1 - s - t) + 1 := by + field_simp [hden] + ring_nf + have hThetaPow : + Real.rpow (Ch02.ThetaRatio Q s t a) ((1 - t) / (1 - s - t)) = + Real.rpow (Ch02.ThetaRatio Q s t a) (s / (1 - s - t)) * + Ch02.ThetaRatio Q s t a := by + simpa [hexp, Real.rpow_one] using + Real.rpow_add hTheta_pos (s / (1 - s - t)) (1 : ℝ) + have hThetaLambda : + Ch02.ThetaRatio Q s t a * Ch02.lambdaS Q t a = + Ch02.LambdaS Q s a := by + unfold Ch02.ThetaRatio + field_simp [hlambda_pos.ne'] + let front : ℝ := + Real.rpow (C / (1 - s - t)) (2 + 4 * s / (1 - s - t)) * + Real.rpow s (-(2 * s / (1 - s - t))) + let thetaPow : ℝ := + Real.rpow (Ch02.ThetaRatio Q s t a) (s / (1 - s - t)) + let scale : ℝ := + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + have hleft0 : + caccioppoliPrefactor C Q a s t = + front * thetaPow * Ch02.LambdaS Q s a * scale := by + rfl + have hleft : + caccioppoliPrefactor C Q a s t = + front * thetaPow * (Ch02.ThetaRatio Q s t a * + Ch02.lambdaS Q t a) * scale := by + calc + caccioppoliPrefactor C Q a s t = + front * thetaPow * Ch02.LambdaS Q s a * scale := hleft0 + _ = + front * thetaPow * (Ch02.ThetaRatio Q s t a * + Ch02.lambdaS Q t a) * scale := by + rw [hThetaLambda] + have hright0 : + caccioppoliWithRHSPrefactor C Q a s t * + (Ch02.lambdaS Q t a * scale) = + front * + Real.rpow (Ch02.ThetaRatio Q s t a) + ((1 - t) / (1 - s - t)) * + (Ch02.lambdaS Q t a * scale) := by + rfl + have hright : + caccioppoliWithRHSPrefactor C Q a s t * + (Ch02.lambdaS Q t a * scale) = + front * thetaPow * (Ch02.ThetaRatio Q s t a * + Ch02.lambdaS Q t a) * scale := by + calc + caccioppoliWithRHSPrefactor C Q a s t * + (Ch02.lambdaS Q t a * scale) = + front * + Real.rpow (Ch02.ThetaRatio Q s t a) + ((1 - t) / (1 - s - t)) * + (Ch02.lambdaS Q t a * scale) := hright0 + _ = + front * (thetaPow * Ch02.ThetaRatio Q s t a) * + (Ch02.lambdaS Q t a * scale) := by + rw [hThetaPow] + _ = + front * thetaPow * (Ch02.ThetaRatio Q s t a * + Ch02.lambdaS Q t a) * scale := by + ring + rw [hleft, hright] + +/-- The forced Caccioppoli scalar prefactor is nonnegative in the theorem +range. -/ +theorem caccioppoliWithRHSPrefactor_nonneg + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ caccioppoliWithRHSPrefactor C Q a s t := by + have hden_pos : 0 < 1 - s - t := by linarith + have hCdiv_nonneg : 0 ≤ C / (1 - s - t) := by + exact div_nonneg hC_nonneg hden_pos.le + have htheta_nonneg : 0 ≤ Ch02.ThetaRatio Q s t a := + (le_trans zero_le_one (Ch02.one_le_ThetaRatio_of_pos Q a hs ht)) + have hfront_nonneg : + 0 ≤ Real.rpow (C / (1 - s - t)) (2 + 4 * s / (1 - s - t)) := + Real.rpow_nonneg hCdiv_nonneg _ + have hs_factor_nonneg : + 0 ≤ Real.rpow s (-(2 * s / (1 - s - t))) := + Real.rpow_nonneg hs.le _ + have htheta_factor_nonneg : + 0 ≤ Real.rpow (Ch02.ThetaRatio Q s t a) ((1 - t) / (1 - s - t)) := + Real.rpow_nonneg htheta_nonneg _ + simpa [caccioppoliWithRHSPrefactor] using + mul_nonneg (mul_nonneg hfront_nonneg hs_factor_nonneg) + htheta_factor_nonneg + +/-- With the displayed constant at least `1`, the forced Caccioppoli +prefactor is at least `1` throughout the theorem range. -/ +theorem one_le_caccioppoliWithRHSPrefactor + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} (hC : 1 ≤ C) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (hst : s + t < 1) : + 1 ≤ caccioppoliWithRHSPrefactor C Q a s t := by + let σ : ℝ := 1 - s - t + let p : ℝ := 2 + 4 * s / σ + let eθ : ℝ := (1 - t) / σ + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hσ_le_one : σ ≤ 1 := by + dsimp [σ] + linarith + have hp_nonneg : 0 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hbase_one : 1 ≤ C / σ := by + have hCσ : σ ≤ C := hσ_le_one.trans hC + exact (le_div_iff₀ hσ_pos).2 (by simpa using hCσ) + have hfront : + 1 ≤ Real.rpow (C / σ) p := by + have hone_pow : Real.rpow (C / σ) 0 = 1 := by + simp + calc + 1 = Real.rpow (C / σ) 0 := hone_pow.symm + _ ≤ Real.rpow (C / σ) p := + Real.rpow_le_rpow_of_exponent_le hbase_one hp_nonneg + have hs_exp_nonpos : + -(2 * s / σ) ≤ 0 := by + have hnonneg : 0 ≤ 2 * s / σ := by positivity + linarith + have hs_factor : + 1 ≤ Real.rpow s (-(2 * s / σ)) := by + have hone_pow : Real.rpow (1 : ℝ) (-(2 * s / σ)) = 1 := by + simp + calc + 1 = Real.rpow (1 : ℝ) (-(2 * s / σ)) := hone_pow.symm + _ ≤ Real.rpow s (-(2 * s / σ)) := + Real.rpow_le_rpow_of_nonpos hs hs_lt.le hs_exp_nonpos + have htheta_one : 1 ≤ Ch02.ThetaRatio Q s t a := + Ch02.one_le_ThetaRatio_of_pos Q a hs ht + have heθ_nonneg : 0 ≤ eθ := by + dsimp [eθ, σ] + have hnum : 0 ≤ 1 - t := by linarith + exact div_nonneg hnum hσ_pos.le + have htheta_factor : + 1 ≤ Real.rpow (Ch02.ThetaRatio Q s t a) eθ := by + have hone_pow : Real.rpow (Ch02.ThetaRatio Q s t a) 0 = 1 := by + simp + calc + 1 = Real.rpow (Ch02.ThetaRatio Q s t a) 0 := hone_pow.symm + _ ≤ Real.rpow (Ch02.ThetaRatio Q s t a) eθ := + Real.rpow_le_rpow_of_exponent_le htheta_one heθ_nonneg + have hfront_nonneg : + 0 ≤ Real.rpow (C / σ) p := le_trans zero_le_one hfront + have hs_factor_nonneg : + 0 ≤ Real.rpow s (-(2 * s / σ)) := le_trans zero_le_one hs_factor + have hfirst : + 1 ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := by + calc + 1 = (1 : ℝ) * 1 := by ring + _ ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := + mul_le_mul hfront hs_factor zero_le_one hfront_nonneg + have hfirst_nonneg : + 0 ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := + le_trans zero_le_one hfirst + have hall : + 1 ≤ + (Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ))) * + Real.rpow (Ch02.ThetaRatio Q s t a) eθ := by + calc + 1 = (1 : ℝ) * 1 := by ring + _ ≤ + (Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ))) * + Real.rpow (Ch02.ThetaRatio Q s t a) eθ := + mul_le_mul hfirst htheta_factor zero_le_one hfirst_nonneg + simpa [caccioppoliWithRHSPrefactor, σ, p, eθ] using hall + +/-- A slightly stronger lower bound: the forced prefactor contains at least +`C^2` when `C >= 1`. This lets a large final dimension constant absorb +dimension-only multiples of the forcing summand. -/ +theorem sq_le_caccioppoliWithRHSPrefactor + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} (hC : 1 ≤ C) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (hst : s + t < 1) : + C ^ 2 ≤ caccioppoliWithRHSPrefactor C Q a s t := by + let σ : ℝ := 1 - s - t + let p : ℝ := 2 + 4 * s / σ + let eθ : ℝ := (1 - t) / σ + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hσ_le_one : σ ≤ 1 := by + dsimp [σ] + linarith + have hp_ge_two : 2 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hC_nonneg : 0 ≤ C := le_trans zero_le_one hC + have hbase_one : 1 ≤ C / σ := by + have hCσ : σ ≤ C := hσ_le_one.trans hC + exact (le_div_iff₀ hσ_pos).2 (by simpa using hCσ) + have hC_le_base : C ≤ C / σ := by + have hmul : C * σ ≤ C * 1 := by + exact mul_le_mul_of_nonneg_left hσ_le_one hC_nonneg + have hbase : C * σ ≤ C := by simpa using hmul + exact (le_div_iff₀ hσ_pos).2 hbase + have hfront_ge_C2 : + C ^ 2 ≤ Real.rpow (C / σ) p := by + calc + C ^ 2 = Real.rpow C (2 : ℝ) := by + exact (Real.rpow_two C).symm + _ ≤ Real.rpow (C / σ) (2 : ℝ) := + Real.rpow_le_rpow hC_nonneg hC_le_base (by norm_num) + _ ≤ Real.rpow (C / σ) p := + Real.rpow_le_rpow_of_exponent_le hbase_one hp_ge_two + have hfront_nonneg : + 0 ≤ Real.rpow (C / σ) p := + le_trans (sq_nonneg C) hfront_ge_C2 + have hs_exp_nonpos : + -(2 * s / σ) ≤ 0 := by + have hnonneg : 0 ≤ 2 * s / σ := by positivity + linarith + have hs_factor : + 1 ≤ Real.rpow s (-(2 * s / σ)) := by + have hone_pow : Real.rpow (1 : ℝ) (-(2 * s / σ)) = 1 := by + simp + calc + 1 = Real.rpow (1 : ℝ) (-(2 * s / σ)) := hone_pow.symm + _ ≤ Real.rpow s (-(2 * s / σ)) := + Real.rpow_le_rpow_of_nonpos hs hs_lt.le hs_exp_nonpos + have hs_factor_nonneg : + 0 ≤ Real.rpow s (-(2 * s / σ)) := + le_trans zero_le_one hs_factor + have htheta_one : 1 ≤ Ch02.ThetaRatio Q s t a := + Ch02.one_le_ThetaRatio_of_pos Q a hs ht + have heθ_nonneg : 0 ≤ eθ := by + dsimp [eθ, σ] + have hnum : 0 ≤ 1 - t := by linarith + exact div_nonneg hnum hσ_pos.le + have htheta_factor : + 1 ≤ Real.rpow (Ch02.ThetaRatio Q s t a) eθ := by + have hone_pow : Real.rpow (Ch02.ThetaRatio Q s t a) 0 = 1 := by + simp + calc + 1 = Real.rpow (Ch02.ThetaRatio Q s t a) 0 := hone_pow.symm + _ ≤ Real.rpow (Ch02.ThetaRatio Q s t a) eθ := + Real.rpow_le_rpow_of_exponent_le htheta_one heθ_nonneg + have htheta_factor_nonneg : + 0 ≤ Real.rpow (Ch02.ThetaRatio Q s t a) eθ := + le_trans zero_le_one htheta_factor + calc + C ^ 2 ≤ Real.rpow (C / σ) p := hfront_ge_C2 + _ ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := by + calc + Real.rpow (C / σ) p = + Real.rpow (C / σ) p * 1 := by ring + _ ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := + mul_le_mul_of_nonneg_left hs_factor hfront_nonneg + _ ≤ + (Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ))) * + Real.rpow (Ch02.ThetaRatio Q s t a) eθ := by + have hprod_nonneg : + 0 ≤ Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) := + mul_nonneg hfront_nonneg hs_factor_nonneg + calc + Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ)) = + (Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ))) * 1 := by ring + _ ≤ + (Real.rpow (C / σ) p * + Real.rpow s (-(2 * s / σ))) * + Real.rpow (Ch02.ThetaRatio Q s t a) eθ := + mul_le_mul_of_nonneg_left htheta_factor hprod_nonneg + _ = caccioppoliWithRHSPrefactor C Q a s t := by + rfl + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSMonotonicity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSMonotonicity.lean new file mode 100644 index 0000000000..5bd8edc007 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSMonotonicity.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.PublicRHSScalar + +/-! # Public RHSMonotonicity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public RHS monotonicity for coarse Caccioppoli with RHS + +This file contains the scalar constant-enlargement lemmas for the public +boundary Caccioppoli RHS with forcing. + +## Audit tag + +Claim: increasing the displayed public RHS constants increases the homogeneous +and forced Caccioppoli prefactors, and therefore the full public with-RHS +boundary quantity. + +Downstream target: `CoarseCaccioppoliRHS/FinalBounds.lean`. This is scalar +bridge plumbing only and introduces no public `*Theory` package. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- The homogeneous Caccioppoli prefactor is nonnegative in the theorem range. +-/ +theorem caccioppoliPrefactor_nonneg + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ caccioppoliPrefactor C Q a s t := by + rw [caccioppoliPrefactor_eq_caccioppoliWithRHSPrefactor_mul_lambdaS_scale + (C := C) (Q := Q) (a := a) hs ht hst] + have hP : + 0 ≤ caccioppoliWithRHSPrefactor C Q a s t := + caccioppoliWithRHSPrefactor_nonneg hC_nonneg hs ht hst + have hlambda : 0 ≤ Ch02.lambdaS Q t a := by + unfold Ch02.lambdaS + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 1)).le + have hscale : + 0 ≤ Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + exact mul_nonneg hP (mul_nonneg hlambda hscale) + +/-- If the base constant is enlarged by a multiplicative factor, then the +corresponding real-power factor absorbs one copy of that factor. -/ +theorem rhs_const_mul_rpow_le_rpow_of_mul_le {M x y p : ℝ} + (hM : 1 ≤ M) (hx : 0 ≤ x) (hMxy : M * x ≤ y) (hp : 1 ≤ p) : + M * Real.rpow x p ≤ Real.rpow y p := by + have hM_nonneg : 0 ≤ M := le_trans (by norm_num) hM + have hMx_nonneg : 0 ≤ M * x := mul_nonneg hM_nonneg hx + have hM_le_Mp : M ≤ Real.rpow M p := by + simpa using Real.self_le_rpow_of_one_le hM hp + have hxpow_nonneg : 0 ≤ Real.rpow x p := Real.rpow_nonneg hx p + have hleft : M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := + mul_le_mul_of_nonneg_right hM_le_Mp hxpow_nonneg + have hmul_rpow : Real.rpow M p * Real.rpow x p = Real.rpow (M * x) p := + (Real.mul_rpow hM_nonneg hx).symm + calc + M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := hleft + _ = Real.rpow (M * x) p := hmul_rpow + _ ≤ Real.rpow y p := + Real.rpow_le_rpow hMx_nonneg hMxy (by linarith) + +/-- Multiplicative enlargement of the dimension constant absorbs the same +constant multiple of the homogeneous Caccioppoli prefactor. -/ +theorem caccioppoliPrefactor_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {M C₁ C₂ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * caccioppoliPrefactor C₁ Q a s t ≤ + caccioppoliPrefactor C₂ Q a s t := by + let σ : ℝ := 1 - s - t + let p : ℝ := 2 + 4 * s / σ + let F : ℝ := + Real.rpow s (-(2 * s / σ)) * + Real.rpow (Ch02.ThetaRatio Q s t a) (s / σ) * + Ch02.LambdaS Q s a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hp_ge_one : 1 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hbase_nonneg : 0 ≤ C₁ / σ := div_nonneg hC₁ hσ_pos.le + have hbase_le : M * (C₁ / σ) ≤ C₂ / σ := by + calc + M * (C₁ / σ) = (M * C₁) / σ := by ring + _ ≤ C₂ / σ := div_le_div_of_nonneg_right hMC₁C₂ hσ_pos.le + have hpow : + M * Real.rpow (C₁ / σ) p ≤ Real.rpow (C₂ / σ) p := + rhs_const_mul_rpow_le_rpow_of_mul_le hM hbase_nonneg hbase_le hp_ge_one + have htheta_nonneg : 0 ≤ Ch02.ThetaRatio Q s t a := + Ch02.ThetaRatio_nonneg Q a hs ht + have hLambda_nonneg : 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hscale_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg htheta_nonneg _)) + hLambda_nonneg) + hscale_nonneg + calc + M * caccioppoliPrefactor C₁ Q a s t = + (M * Real.rpow (C₁ / σ) p) * F := by + simp [F, p, σ, caccioppoliPrefactor, mul_assoc, mul_left_comm, mul_comm] + _ ≤ Real.rpow (C₂ / σ) p * F := + mul_le_mul_of_nonneg_right hpow hF_nonneg + _ = caccioppoliPrefactor C₂ Q a s t := by + simp [F, p, σ, caccioppoliPrefactor, mul_assoc, mul_left_comm, mul_comm] + +/-- Multiplicative enlargement also absorbs the same constant multiple of the +forced Caccioppoli prefactor. -/ +theorem caccioppoliWithRHSPrefactor_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {M C₁ C₂ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * caccioppoliWithRHSPrefactor C₁ Q a s t ≤ + caccioppoliWithRHSPrefactor C₂ Q a s t := by + let σ : ℝ := 1 - s - t + let p : ℝ := 2 + 4 * s / σ + let eθ : ℝ := (1 - t) / σ + let F : ℝ := + Real.rpow s (-(2 * s / σ)) * + Real.rpow (Ch02.ThetaRatio Q s t a) eθ + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hp_ge_one : 1 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hbase_nonneg : 0 ≤ C₁ / σ := div_nonneg hC₁ hσ_pos.le + have hbase_le : M * (C₁ / σ) ≤ C₂ / σ := by + calc + M * (C₁ / σ) = (M * C₁) / σ := by ring + _ ≤ C₂ / σ := div_le_div_of_nonneg_right hMC₁C₂ hσ_pos.le + have hpow : + M * Real.rpow (C₁ / σ) p ≤ Real.rpow (C₂ / σ) p := + rhs_const_mul_rpow_le_rpow_of_mul_le hM hbase_nonneg hbase_le hp_ge_one + have htheta_nonneg : 0 ≤ Ch02.ThetaRatio Q s t a := + Ch02.ThetaRatio_nonneg Q a hs ht + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact mul_nonneg + (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg htheta_nonneg _) + calc + M * caccioppoliWithRHSPrefactor C₁ Q a s t = + (M * Real.rpow (C₁ / σ) p) * F := by + simp [F, p, eθ, σ, caccioppoliWithRHSPrefactor, + mul_assoc, mul_left_comm, mul_comm] + _ ≤ Real.rpow (C₂ / σ) p * F := + mul_le_mul_of_nonneg_right hpow hF_nonneg + _ = caccioppoliWithRHSPrefactor C₂ Q a s t := by + simp [F, p, eθ, σ, caccioppoliWithRHSPrefactor, + mul_assoc, mul_left_comm, mul_comm] + +/-- Multiplicative enlargement of the public constant absorbs the same +constant multiple of the entire displayed forced RHS. -/ +theorem boundaryCaccioppoliWithRHSRHS_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {M C₁ C₂ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + M * boundaryCaccioppoliWithRHSRHS C₁ s t u ≤ + boundaryCaccioppoliWithRHSRHS C₂ s t u := by + let P₁ : ℝ := caccioppoliWithRHSPrefactor C₁ Q a s t + let P₂ : ℝ := caccioppoliWithRHSPrefactor C₂ Q a s t + let A : ℝ := + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u + let B : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP : + M * P₁ ≤ P₂ := by + dsimp [P₁, P₂] + exact caccioppoliWithRHSPrefactor_mul_const_le_of_mul_constant_le + hM hC₁ hMC₁C₂ hs ht hst + have hA_nonneg : 0 ≤ A := by + have hlambda : 0 ≤ Ch02.lambdaS Q t a := by + unfold Ch02.lambdaS + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 1)).le + have hscale : + 0 ≤ Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hparent : + 0 ≤ boundaryForcedCaccioppoliParentL2Sq u := + normalizedL2SqOnSet_nonneg (openCubeSet Q) u.toH1.toFun + (measurableSet_openCubeSet Q) + dsimp [A] + exact mul_nonneg (mul_nonneg hlambda hscale) hparent + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hsum_nonneg : 0 ≤ A + B := add_nonneg hA_nonneg hB_nonneg + calc + M * boundaryCaccioppoliWithRHSRHS C₁ s t u = + (M * P₁) * (A + B) := by + dsimp [P₁, A, B] + unfold boundaryCaccioppoliWithRHSRHS + ring_nf + simp [mul_left_comm, mul_comm] + _ ≤ P₂ * (A + B) := mul_le_mul_of_nonneg_right hP hsum_nonneg + _ = boundaryCaccioppoliWithRHSRHS C₂ s t u := by + rfl + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSScalar.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSScalar.lean new file mode 100644 index 0000000000..2ce23294d1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/PublicRHSScalar.lean @@ -0,0 +1,784 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.ZeroTraceValue + +/-! # Public RHSScalar -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public RHS Scalar Bounds for Coarse Caccioppoli with RHS + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: prove nonnegativity and scalar monotonicity facts for the public +`boundaryCaccioppoliWithRHSRHS` terms. + +Downstream target: `CoarseCaccioppoliRHS/FinalBounds.lean`. This file should +contain scalar RHS bounds only; public theorem packages belong in +`CoarseCaccioppoliRHS/Theory.lean`. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- The forcing-only term inside `boundaryCaccioppoliWithRHSRHS` is +nonnegative. -/ +theorem boundaryCaccioppoliWithRHS_forceTerm_nonneg + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {t : ℝ} {g : Vec d → Vec d} + (ht : 0 < t) (ht_lt : t < 1 / 2) : + 0 ≤ + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 := by + have hden_pos : 0 < 1 - 2 * t := by linarith + have hlambda_pos : 0 < Ch02.lambdaS Q t a := by + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 1) + have ht_rpow_nonneg : 0 ≤ Real.rpow t (-8 : ℝ) := + Real.rpow_nonneg ht.le _ + have hdiv_nonneg : 0 ≤ Real.rpow t (-8 : ℝ) / (1 - 2 * t) := + div_nonneg ht_rpow_nonneg hden_pos.le + have hlambda_factor_nonneg : + 0 ≤ Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) := + Real.rpow_nonneg hlambda_pos.le _ + exact mul_nonneg (mul_nonneg hdiv_nonneg hlambda_factor_nonneg) + (sq_nonneg (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g)) + +private theorem boundaryCaccioppoliWithRHS_parentTerm_nonneg + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) (ht : 0 < t) : + 0 ≤ + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u := by + have hlambda : 0 ≤ Ch02.lambdaS Q t a := by + unfold Ch02.lambdaS + exact (Ch02.lambdaSq_finite_pos Q a ht + (by norm_num : (1 : ℝ) ≤ 1)).le + have hscale : + 0 ≤ Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hparent : + 0 ≤ boundaryForcedCaccioppoliParentL2Sq u := + normalizedL2SqOnSet_nonneg (openCubeSet Q) u.toH1.toFun + (measurableSet_openCubeSet Q) + exact mul_nonneg (mul_nonneg hlambda hscale) hparent + +/-- The displayed forced boundary Caccioppoli RHS is nonnegative in the theorem +range. -/ +theorem boundaryCaccioppoliWithRHSRHS_nonneg + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + 0 ≤ boundaryCaccioppoliWithRHSRHS C s t u := by + let P : ℝ := caccioppoliWithRHSPrefactor C Q a s t + let A : ℝ := + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u + let B : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact caccioppoliWithRHSPrefactor_nonneg hC_nonneg hs ht hst + have hA_nonneg : 0 ≤ A := by + simpa [A] using boundaryCaccioppoliWithRHS_parentTerm_nonneg (Q := Q) (a := a) u ht + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + calc + 0 ≤ P * (A + B) := mul_nonneg hP_nonneg (add_nonneg hA_nonneg hB_nonneg) + _ = boundaryCaccioppoliWithRHSRHS C s t u := by + rfl + +/-- The forcing-only summand is contained in the displayed RHS once the +prefactor constant is at least `1`. -/ +theorem boundaryCaccioppoliWithRHS_forceTerm_le_RHS + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hC : 1 ≤ C) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 ≤ + boundaryCaccioppoliWithRHSRHS C s t u := by + let P : ℝ := caccioppoliWithRHSPrefactor C Q a s t + let A : ℝ := + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u + let B : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP_one : 1 ≤ P := by + dsimp [P] + exact one_le_caccioppoliWithRHSPrefactor hC hs hs_lt ht hst + have hP_nonneg : 0 ≤ P := le_trans zero_le_one hP_one + have hA_nonneg : 0 ≤ A := by + simpa [A] using boundaryCaccioppoliWithRHS_parentTerm_nonneg (Q := Q) (a := a) u ht + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hsum_nonneg : 0 ≤ A + B := add_nonneg hA_nonneg hB_nonneg + calc + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + = B := rfl + _ ≤ A + B := le_add_of_nonneg_left hA_nonneg + _ ≤ P * (A + B) := by + calc + A + B = 1 * (A + B) := by ring + _ ≤ P * (A + B) := + mul_le_mul_of_nonneg_right hP_one hsum_nonneg + _ = boundaryCaccioppoliWithRHSRHS C s t u := by + rfl + +/-- Any dimension-only multiple already bounded by `C^2` of the forcing +summand is contained in the displayed RHS. This is the scalar absorption +hook used after the corrector estimates have been reduced to the forcing +summand. -/ +theorem boundaryCaccioppoliWithRHS_const_mul_forceTerm_le_RHS + {d : ℕ} [NeZero d] {K C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hKC : K ≤ C ^ 2) (hC : 1 ≤ C) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) ≤ + boundaryCaccioppoliWithRHSRHS C s t u := by + let P : ℝ := caccioppoliWithRHSPrefactor C Q a s t + let A : ℝ := + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + boundaryForcedCaccioppoliParentL2Sq u + let B : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP_ge_C2 : C ^ 2 ≤ P := by + dsimp [P] + exact sq_le_caccioppoliWithRHSPrefactor hC hs hs_lt ht hst + have hK_le_P : K ≤ P := hKC.trans hP_ge_C2 + have hP_nonneg : 0 ≤ P := by + have hC2_nonneg : 0 ≤ C ^ 2 := sq_nonneg C + exact hC2_nonneg.trans hP_ge_C2 + have hA_nonneg : 0 ≤ A := by + simpa [A] using boundaryCaccioppoliWithRHS_parentTerm_nonneg (Q := Q) (a := a) u ht + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + calc + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) + = K * B := rfl + _ ≤ P * B := mul_le_mul_of_nonneg_right hK_le_P hB_nonneg + _ ≤ P * (A + B) := + mul_le_mul_of_nonneg_left (le_add_of_nonneg_left hA_nonneg) hP_nonneg + _ = boundaryCaccioppoliWithRHSRHS C s t u := by + rfl + +/-- The squared zero-Dirichlet RHS is controlled by the forcing summand used +in the boundary Caccioppoli-with-RHS statement. This is the scalar +`q = 2` to `q = 1` lower-ellipticity conversion plus the `t^{-8}` buffer. -/ +theorem zeroDirichletEnergyWithRHSRHS_sq_le_const_mul_forceTerm + {d : ℕ} [NeZero d] {C₀ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ht : 0 < t) (ht_lt : t < 1 / 2) : + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2 ≤ + ((25 * Real.exp 4) * C₀ ^ 2) * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := by + let L₂ : ℝ := Ch02.lambdaSq Q t (.finite 2) a + let L₁ : ℝ := Ch02.lambdaS Q t a + let B : ℝ := scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g + let K : ℝ := 25 * Real.exp 4 + have ht_le_one : t ≤ 1 := by linarith + have hden_pos : 0 < 1 - 2 * t := by linarith + have hL₂_pos : 0 < L₂ := by + dsimp [L₂] + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 2) + have hL₁_pos : 0 < L₁ := by + dsimp [L₁] + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 1) + have hlower : + Real.rpow L₂ (-1 : ℝ) ≤ + K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ) := by + have hchange := + Ch02.lambdaSqFinite_inv_le_change_exponent + (Q := Q) (a := a) (s := t) (p := (1 : ℝ)) (q := (2 : ℝ)) + ht ht_le_one (by norm_num : (1 : ℝ) ≤ 1) + (by norm_num : (1 : ℝ) ≤ 2) + have hchange' : + Real.rpow L₂ (-1 : ℝ) ≤ + K * Real.rpow t (2 / (2 : ℝ) - 2 / (1 : ℝ)) * + Real.rpow L₁ (-1 : ℝ) := by + dsimp [K, L₂, L₁] + simpa [Ch02.lambdaS, Real.rpow_neg_one] using hchange + calc + Real.rpow L₂ (-1 : ℝ) ≤ + K * Real.rpow t (2 / (2 : ℝ) - 2 / (1 : ℝ)) * + Real.rpow L₁ (-1 : ℝ) := hchange' + _ = K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ) := by norm_num + have ht_sq : + (Real.rpow t (-(3 / 2 : ℝ))) ^ 2 = Real.rpow t (-3 : ℝ) := by + calc + (Real.rpow t (-(3 / 2 : ℝ))) ^ 2 = + Real.rpow (Real.rpow t (-(3 / 2 : ℝ))) (2 : ℝ) := + (Real.rpow_two _).symm + _ = Real.rpow t (-(3 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul ht.le (-(3 / 2 : ℝ)) (2 : ℝ)).symm + _ = Real.rpow t (-3 : ℝ) := by norm_num + have hL₂_sq : + (poincareLowerEllipticityFactor Q a t (.finite 2)) ^ 2 = + Real.rpow L₂ (-1 : ℝ) := by + unfold poincareLowerEllipticityFactor + dsimp [L₂] + calc + (Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-(1 / 2 : ℝ))) ^ 2 = + Real.rpow + (Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-(1 / 2 : ℝ))) + (2 : ℝ) := (Real.rpow_two _).symm + _ = + Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) + (-(1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hL₂_pos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-1 : ℝ) := by + norm_num + have hZsq : + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2 = + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B ^ 2 := by + unfold zeroDirichletEnergyWithRHSRHS + change + (C₀ * Real.rpow t (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a t (.finite 2) * B) ^ 2 = + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B ^ 2 + rw [show + (C₀ * Real.rpow t (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a t (.finite 2) * + B) ^ 2 = + C₀ ^ 2 * (Real.rpow t (-(3 / 2 : ℝ))) ^ 2 * + (poincareLowerEllipticityFactor Q a t (.finite 2)) ^ 2 * + B ^ 2 by + ring] + rw [ht_sq, hL₂_sq] + have htime_mul : + Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ) = + Real.rpow t (-4 : ℝ) := by + calc + Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ) = + Real.rpow t ((-3 : ℝ) + (-1 : ℝ)) := + (Real.rpow_add ht (-3 : ℝ) (-1 : ℝ)).symm + _ = Real.rpow t (-4 : ℝ) := by norm_num + have htime_to_buffer : + Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ) ≤ + Real.rpow t (-8 : ℝ) / (1 - 2 * t) := by + have hpow48 : + Real.rpow t (-4 : ℝ) ≤ Real.rpow t (-8 : ℝ) := + Real.rpow_le_rpow_of_exponent_ge ht ht_le_one (by norm_num) + have hpow8_nonneg : 0 ≤ Real.rpow t (-8 : ℝ) := + Real.rpow_nonneg ht.le _ + have hpow8_le_div : + Real.rpow t (-8 : ℝ) ≤ Real.rpow t (-8 : ℝ) / (1 - 2 * t) := by + have hden_le_one : 1 - 2 * t ≤ 1 := by linarith + exact (le_div_iff₀ hden_pos).2 + (by + calc + Real.rpow t (-8 : ℝ) * (1 - 2 * t) ≤ + Real.rpow t (-8 : ℝ) * 1 := + mul_le_mul_of_nonneg_left hden_le_one hpow8_nonneg + _ = Real.rpow t (-8 : ℝ) := by ring) + calc + Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ) = + Real.rpow t (-4 : ℝ) := htime_mul + _ ≤ Real.rpow t (-8 : ℝ) / (1 - 2 * t) := + hpow48.trans hpow8_le_div + have hC_sq_nonneg : 0 ≤ C₀ ^ 2 := sq_nonneg C₀ + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have htime3_nonneg : 0 ≤ Real.rpow t (-3 : ℝ) := + Real.rpow_nonneg ht.le _ + have htime1_nonneg : 0 ≤ Real.rpow t (-1 : ℝ) := + Real.rpow_nonneg ht.le _ + have hL₁_inv_nonneg : 0 ≤ Real.rpow L₁ (-1 : ℝ) := + Real.rpow_nonneg hL₁_pos.le _ + have hBsq_nonneg : 0 ≤ B ^ 2 := sq_nonneg B + have hstep_lambda : + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B ^ 2 ≤ + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * + (K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ)) * + B ^ 2 := by + have hfront_nonneg : + 0 ≤ C₀ ^ 2 * Real.rpow t (-3 : ℝ) := + mul_nonneg hC_sq_nonneg htime3_nonneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hlower hfront_nonneg) hBsq_nonneg + have hstep_time : + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * + (K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ)) * + B ^ 2 ≤ + (K * C₀ ^ 2) * + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow L₁ (-1 : ℝ) * B ^ 2 := by + have hKA_nonneg : 0 ≤ K * C₀ ^ 2 := + mul_nonneg hK_nonneg hC_sq_nonneg + have htail_nonneg : 0 ≤ Real.rpow L₁ (-1 : ℝ) * B ^ 2 := + mul_nonneg hL₁_inv_nonneg hBsq_nonneg + calc + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * + (K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ)) * + B ^ 2 = + (K * C₀ ^ 2) * + ((Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ)) * + (Real.rpow L₁ (-1 : ℝ) * B ^ 2)) := by ring + _ ≤ + (K * C₀ ^ 2) * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + (Real.rpow L₁ (-1 : ℝ) * B ^ 2)) := by + have htime_tail : + (Real.rpow t (-3 : ℝ) * Real.rpow t (-1 : ℝ)) * + (Real.rpow L₁ (-1 : ℝ) * B ^ 2) ≤ + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + (Real.rpow L₁ (-1 : ℝ) * B ^ 2) := + mul_le_mul_of_nonneg_right htime_to_buffer htail_nonneg + exact mul_le_mul_of_nonneg_left htime_tail hKA_nonneg + _ = + (K * C₀ ^ 2) * + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow L₁ (-1 : ℝ) * B ^ 2 := by ring + calc + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2 = + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B ^ 2 := hZsq + _ ≤ + C₀ ^ 2 * Real.rpow t (-3 : ℝ) * + (K * Real.rpow t (-1 : ℝ) * Real.rpow L₁ (-1 : ℝ)) * + B ^ 2 := hstep_lambda + _ ≤ + (K * C₀ ^ 2) * + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow L₁ (-1 : ℝ) * B ^ 2 := hstep_time + _ = + ((25 * Real.exp 4) * C₀ ^ 2) * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := by + simp [K, L₁, B, mul_assoc, mul_left_comm, mul_comm] + +/-- Squared lower-ellipticity conversion used for the corrector parent `L²` +bridge. + +The public RHS Poincare estimate gives the corrector gradient with a +`lambda_{t,2}^{-1}` factor. After squaring and multiplying by `lambdaS` +this lemma converts the two `q = 2` lower-ellipticity factors to the displayed +`q = 1` factor, spending exactly the `t^{-8}` buffer. -/ +theorem lambdaS_mul_tpow_lambdaSqTwo_inv_sq_le_forceTime + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {t B : ℝ} (ht : 0 < t) (ht_lt : t < 1 / 2) : + Ch02.lambdaS Q t a * + (Real.rpow t (-3 : ℝ) * + Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-1 : ℝ) * B) ^ 2 ≤ + (25 * Real.exp 4) ^ 2 * + (Real.rpow t (-8 : ℝ) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * B ^ 2) := by + let L₂ : ℝ := Ch02.lambdaSq Q t (.finite 2) a + let L₁ : ℝ := Ch02.lambdaS Q t a + let A : ℝ := 25 * Real.exp 4 + let T3 : ℝ := Real.rpow t (-3 : ℝ) + let T1 : ℝ := Real.rpow t (-1 : ℝ) + let I₂ : ℝ := Real.rpow L₂ (-1 : ℝ) + let I₁ : ℝ := Real.rpow L₁ (-1 : ℝ) + have ht_le_one : t ≤ 1 := by nlinarith + have hL₂_pos : 0 < L₂ := by + dsimp [L₂] + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 2) + have hL₁_pos : 0 < L₁ := by + dsimp [L₁] + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 1) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hchange : I₂ ≤ A * T1 * I₁ := by + have h := Ch02.lambdaSqFinite_inv_le_change_exponent + (Q := Q) (a := a) (s := t) (p := (1 : ℝ)) (q := (2 : ℝ)) + ht ht_le_one (by norm_num : (1 : ℝ) ≤ 1) + (by norm_num : (1 : ℝ) ≤ 2) + have h' : + I₂ ≤ A * Real.rpow t (2 / (2 : ℝ) - 2 / (1 : ℝ)) * I₁ := by + dsimp [A, L₂, L₁, I₂, I₁] + simpa [Ch02.lambdaS, Real.rpow_neg_one] using h + calc + I₂ ≤ A * Real.rpow t (2 / (2 : ℝ) - 2 / (1 : ℝ)) * I₁ := h' + _ = A * T1 * I₁ := by norm_num [T1] + have hI₂_nonneg : 0 ≤ I₂ := by + dsimp [I₂] + exact Real.rpow_nonneg hL₂_pos.le _ + have hT1_nonneg : 0 ≤ T1 := by + dsimp [T1] + exact Real.rpow_nonneg ht.le _ + have hL₁_mul_inv : L₁ * I₁ = 1 := by + have hI : I₁ = L₁⁻¹ := by + dsimp [I₁] + exact Real.rpow_neg_one L₁ + rw [hI] + field_simp [ne_of_gt hL₁_pos] + have hL₁_L₂_once : L₁ * I₂ ≤ A * T1 := by + have hmul := mul_le_mul_of_nonneg_left hchange hL₁_pos.le + calc + L₁ * I₂ ≤ L₁ * (A * T1 * I₁) := hmul + _ = A * T1 * (L₁ * I₁) := by ring + _ = A * T1 := by rw [hL₁_mul_inv]; ring + have hfirst_nonneg : 0 ≤ A * T1 := mul_nonneg hA_nonneg hT1_nonneg + have hL₁_L₂_sq : + L₁ * I₂ ^ 2 ≤ A ^ 2 * T1 ^ 2 * I₁ := by + have hstep := mul_le_mul hL₁_L₂_once hchange hI₂_nonneg hfirst_nonneg + calc + L₁ * I₂ ^ 2 = (L₁ * I₂) * I₂ := by ring + _ ≤ (A * T1) * (A * T1 * I₁) := hstep + _ = A ^ 2 * T1 ^ 2 * I₁ := by ring + have hT3_sq : T3 ^ 2 = Real.rpow t (-6 : ℝ) := by + dsimp [T3] + calc + (Real.rpow t (-3 : ℝ)) ^ 2 = + Real.rpow (Real.rpow t (-3 : ℝ)) (2 : ℝ) := + (Real.rpow_two _).symm + _ = Real.rpow t ((-3 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul ht.le (-3 : ℝ) (2 : ℝ)).symm + _ = Real.rpow t (-6 : ℝ) := by norm_num + have hT1_sq : T1 ^ 2 = Real.rpow t (-2 : ℝ) := by + dsimp [T1] + calc + (Real.rpow t (-1 : ℝ)) ^ 2 = + Real.rpow (Real.rpow t (-1 : ℝ)) (2 : ℝ) := + (Real.rpow_two _).symm + _ = Real.rpow t ((-1 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul ht.le (-1 : ℝ) (2 : ℝ)).symm + _ = Real.rpow t (-2 : ℝ) := by norm_num + have ht_time : + Real.rpow t (-6 : ℝ) * Real.rpow t (-2 : ℝ) = + Real.rpow t (-8 : ℝ) := by + calc + Real.rpow t (-6 : ℝ) * Real.rpow t (-2 : ℝ) = + Real.rpow t ((-6 : ℝ) + (-2 : ℝ)) := + (Real.rpow_add ht (-6 : ℝ) (-2 : ℝ)).symm + _ = Real.rpow t (-8 : ℝ) := by norm_num + have hT3sq_nonneg : 0 ≤ T3 ^ 2 := sq_nonneg T3 + have hBsq_nonneg : 0 ≤ B ^ 2 := sq_nonneg B + calc + Ch02.lambdaS Q t a * + (Real.rpow t (-3 : ℝ) * + Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-1 : ℝ) * B) ^ 2 = + T3 ^ 2 * (L₁ * I₂ ^ 2) * B ^ 2 := by + dsimp [T3, I₂, L₁, L₂] + ring + _ ≤ T3 ^ 2 * (A ^ 2 * T1 ^ 2 * I₁) * B ^ 2 := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hL₁_L₂_sq hT3sq_nonneg) hBsq_nonneg + _ = A ^ 2 * ((T3 ^ 2 * T1 ^ 2) * I₁ * B ^ 2) := by ring + _ = + A ^ 2 * ((Real.rpow t (-6 : ℝ) * Real.rpow t (-2 : ℝ)) * + I₁ * B ^ 2) := by + rw [hT3_sq, hT1_sq] + _ = A ^ 2 * (Real.rpow t (-8 : ℝ) * I₁ * B ^ 2) := by + rw [ht_time] + _ = (25 * Real.exp 4) ^ 2 * + (Real.rpow t (-8 : ℝ) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * B ^ 2) := by + simp [A, I₁, L₁] + +/-- Once the zero-Dirichlet energy estimate is inserted, the public RHS +Poincare gradient bound for the zero-trace corrector has the exact force scale +needed by the Caccioppoli parent `L²` bridge. -/ +theorem coarsePoincareWithRHSGradientRHS_le_corrector_forceScale + {d : ℕ} [NeZero d] {C : ℝ} (hC_nonneg : 0 ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (ht : 0 < t) (_ht_lt : t < 1 / 2) + (hg : ForceBesovRegularity Q (2 * t) g) + (henergy : + forcedSolutionEnergyNorm Q a u ≤ zeroDirichletEnergyWithRHSRHS C Q a t g) : + coarsePoincareWithRHSGradientRHS C Q a (2 * t) g u ≤ + (C ^ 2 + C) * + (Real.rpow t (-3 : ℝ) * + Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-1 : ℝ) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) := by + let L₂ : ℝ := Ch02.lambdaSq Q t (.finite 2) a + let B : ℝ := scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g + let P : ℝ := poincareLowerEllipticityFactor Q a t (.finite 2) + let E : ℝ := forcedSolutionEnergyNorm Q a u + have htwo_t_pos : 0 < 2 * t := by nlinarith + have ht_le_two_t : t ≤ 2 * t := by nlinarith + have hpow_two_t_32 : + Real.rpow (2 * t) (-(3 / 2 : ℝ)) ≤ + Real.rpow t (-(3 / 2 : ℝ)) := + Real.rpow_le_rpow_of_nonpos ht ht_le_two_t (by norm_num) + have hpow_two_t_3 : + Real.rpow (2 * t) (-3 : ℝ) ≤ Real.rpow t (-3 : ℝ) := + Real.rpow_le_rpow_of_nonpos ht ht_le_two_t (by norm_num) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := 2 * t) (g := g) hg + have hL₂_pos : 0 < L₂ := by + dsimp [L₂] + exact Ch02.lambdaSq_finite_pos Q a ht (by norm_num : (1 : ℝ) ≤ 2) + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareLowerEllipticityFactor] + exact Real.rpow_nonneg hL₂_pos.le _ + have hP_sq : P ^ 2 = Real.rpow L₂ (-1 : ℝ) := by + dsimp [P, L₂, poincareLowerEllipticityFactor] + calc + (Real.rpow (Ch02.lambdaSq Q t (Ch02.MultiscaleExponent.finite 2) a) + (-(1 / 2 : ℝ))) ^ 2 = + Real.rpow + (Real.rpow (Ch02.lambdaSq Q t (Ch02.MultiscaleExponent.finite 2) a) + (-(1 / 2 : ℝ))) (2 : ℝ) := (Real.rpow_two _).symm + _ = Real.rpow (Ch02.lambdaSq Q t (Ch02.MultiscaleExponent.finite 2) a) + (-(1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hL₂_pos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (Ch02.lambdaSq Q t (Ch02.MultiscaleExponent.finite 2) a) + (-1 : ℝ) := by norm_num + have ht_pow32_mul : + Real.rpow t (-(3 / 2 : ℝ)) * Real.rpow t (-(3 / 2 : ℝ)) = + Real.rpow t (-3 : ℝ) := by + calc + Real.rpow t (-(3 / 2 : ℝ)) * Real.rpow t (-(3 / 2 : ℝ)) = + Real.rpow t (-(3 / 2 : ℝ) + -(3 / 2 : ℝ)) := + (Real.rpow_add ht (-(3 / 2 : ℝ)) (-(3 / 2 : ℝ))).symm + _ = Real.rpow t (-3 : ℝ) := by norm_num + have htime32_nonneg : 0 ≤ Real.rpow t (-(3 / 2 : ℝ)) := + Real.rpow_nonneg ht.le _ + have hL₂_inv_nonneg : 0 ≤ Real.rpow L₂ (-1 : ℝ) := + Real.rpow_nonneg hL₂_pos.le _ + have hEbound : E ≤ C * Real.rpow t (-(3 / 2 : ℝ)) * P * B := by + dsimp [E] + calc + forcedSolutionEnergyNorm Q a u ≤ + zeroDirichletEnergyWithRHSRHS C Q a t g := henergy + _ = C * Real.rpow t (-(3 / 2 : ℝ)) * P * B := by + unfold zeroDirichletEnergyWithRHSRHS + dsimp [P, B] + have hfront_nonneg : + 0 ≤ C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P := by + exact mul_nonneg + (mul_nonneg hC_nonneg (Real.rpow_nonneg htwo_t_pos.le _)) hP_nonneg + have hterm1 : + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P * E ≤ + C ^ 2 * + (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := by + calc + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P * E ≤ + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P * + (C * Real.rpow t (-(3 / 2 : ℝ)) * P * B) := + mul_le_mul_of_nonneg_left hEbound hfront_nonneg + _ ≤ + C * Real.rpow t (-(3 / 2 : ℝ)) * P * + (C * Real.rpow t (-(3 / 2 : ℝ)) * P * B) := by + have hcoeff : + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P ≤ + C * Real.rpow t (-(3 / 2 : ℝ)) * P := by + have hCP_nonneg : 0 ≤ C * P := mul_nonneg hC_nonneg hP_nonneg + calc + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P = + (C * P) * Real.rpow (2 * t) (-(3 / 2 : ℝ)) := by ring + _ ≤ (C * P) * Real.rpow t (-(3 / 2 : ℝ)) := + mul_le_mul_of_nonneg_left hpow_two_t_32 hCP_nonneg + _ = C * Real.rpow t (-(3 / 2 : ℝ)) * P := by ring + have htail_nonneg : + 0 ≤ C * Real.rpow t (-(3 / 2 : ℝ)) * P * B := by + exact mul_nonneg + (mul_nonneg (mul_nonneg hC_nonneg htime32_nonneg) hP_nonneg) + hB_nonneg + exact mul_le_mul_of_nonneg_right hcoeff htail_nonneg + _ = C ^ 2 * + (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := by + rw [← ht_pow32_mul, ← hP_sq] + ring + have hterm2 : + C * Real.rpow (2 * t) (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B ≤ + C * (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := by + calc + C * Real.rpow (2 * t) (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B = + (C * Real.rpow (2 * t) (-3 : ℝ) * + Real.rpow L₂ (-1 : ℝ)) * B := by ring + _ ≤ (C * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ)) * B := by + have hcoeff : + C * Real.rpow (2 * t) (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) ≤ + C * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) := by + have hCI_nonneg : 0 ≤ C * Real.rpow L₂ (-1 : ℝ) := + mul_nonneg hC_nonneg hL₂_inv_nonneg + calc + C * Real.rpow (2 * t) (-3 : ℝ) * + Real.rpow L₂ (-1 : ℝ) = + (C * Real.rpow L₂ (-1 : ℝ)) * + Real.rpow (2 * t) (-3 : ℝ) := by ring + _ ≤ (C * Real.rpow L₂ (-1 : ℝ)) * Real.rpow t (-3 : ℝ) := + mul_le_mul_of_nonneg_left hpow_two_t_3 hCI_nonneg + _ = C * Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) := by + ring + exact mul_le_mul_of_nonneg_right hcoeff hB_nonneg + _ = C * (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := by + ring + have hhalf : (2 * t) / 2 = t := by ring + calc + coarsePoincareWithRHSGradientRHS C Q a (2 * t) g u = + C * Real.rpow (2 * t) (-(3 / 2 : ℝ)) * P * E + + C * Real.rpow (2 * t) (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B := by + unfold coarsePoincareWithRHSGradientRHS + dsimp [E, P, B, L₂] + rw [hhalf] + _ ≤ + C ^ 2 * (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) + + C * (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := + add_le_add hterm1 hterm2 + _ = (C ^ 2 + C) * + (Real.rpow t (-3 : ℝ) * Real.rpow L₂ (-1 : ℝ) * B) := by ring + _ = (C ^ 2 + C) * + (Real.rpow t (-3 : ℝ) * + Real.rpow (Ch02.lambdaSq Q t (.finite 2) a) (-1 : ℝ) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) := by + rfl + +/-- The corrector core-energy scalar term produced by the zero-Dirichlet +estimate is absorbed by the forcing part of the final RHS once the final +constant is large enough. -/ +theorem boundaryCaccioppoliWithRHS_zeroDirichletSqTerm_le_RHS + {d : ℕ} [NeZero d] {C C₀ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hKC : + (2 * (18 : ℝ) ^ d) * ((25 * Real.exp 4) * C₀ ^ 2) ≤ C ^ 2) + (hC : 1 ≤ C) + (hs : 0 < s) (hs_lt : s < 1) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + 2 * ((18 : ℝ) ^ d * (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2) ≤ + boundaryCaccioppoliWithRHSRHS C s t u := by + let F : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + let K₀ : ℝ := (25 * Real.exp 4) * C₀ ^ 2 + let K : ℝ := (2 * (18 : ℝ) ^ d) * K₀ + have hZ : + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2 ≤ K₀ * F := by + dsimp [K₀, F] + exact zeroDirichletEnergyWithRHSRHS_sq_le_const_mul_forceTerm + (C₀ := C₀) (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hfront_nonneg : 0 ≤ 2 * (18 : ℝ) ^ d := by + exact mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (pow_nonneg (by norm_num : (0 : ℝ) ≤ (18 : ℝ)) d) + have hterm : + 2 * ((18 : ℝ) ^ d * (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2) + ≤ K * F := by + calc + 2 * ((18 : ℝ) ^ d * + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2) = + (2 * (18 : ℝ) ^ d) * + (zeroDirichletEnergyWithRHSRHS C₀ Q a t g) ^ 2 := by ring + _ ≤ (2 * (18 : ℝ) ^ d) * (K₀ * F) := + mul_le_mul_of_nonneg_left hZ hfront_nonneg + _ = K * F := by + dsimp [K] + ring + have hKRHS : + K * F ≤ boundaryCaccioppoliWithRHSRHS C s t u := by + dsimp [F, K] + exact boundaryCaccioppoliWithRHS_const_mul_forceTerm_le_RHS + (K := (2 * (18 : ℝ) ^ d) * ((25 * Real.exp 4) * C₀ ^ 2)) + (C := C) u hKC hC hs hs_lt ht ht_lt hst + exact hterm.trans hKRHS + +/-- The first term of the forced boundary Caccioppoli RHS contains the +homogeneous parent-`L²` contribution with the same displayed prefactor. -/ +theorem caccioppoliPrefactor_mul_forcedParentL2_le_boundaryCaccioppoliWithRHSRHS + {d : ℕ} [NeZero d] {C : ℝ} {Q : TriadicCube d} {a : CoeffFamily d} + {s t : ℝ} {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (ht : 0 < t) (ht_lt : t < 1 / 2) + (hst : s + t < 1) : + caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u ≤ + boundaryCaccioppoliWithRHSRHS C s t u := by + let P : ℝ := caccioppoliWithRHSPrefactor C Q a s t + let L : ℝ := Ch02.lambdaS Q t a + let S : ℝ := Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + let U0 : ℝ := boundaryForcedCaccioppoliParentL2Sq u + let A : ℝ := + (L * S) * U0 + let B : ℝ := + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact caccioppoliWithRHSPrefactor_nonneg hC_nonneg hs ht hst + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hid := + caccioppoliPrefactor_eq_caccioppoliWithRHSPrefactor_mul_lambdaS_scale + (C := C) (Q := Q) (a := a) hs ht hst + have hid' : + caccioppoliPrefactor C Q a s t = P * (L * S) := by + dsimp [P, L, S] + exact hid + calc + caccioppoliPrefactor C Q a s t * + boundaryForcedCaccioppoliParentL2Sq u = + P * A := by + dsimp [A, U0] + rw [hid'] + ring + _ ≤ P * (A + B) := + mul_le_mul_of_nonneg_left (le_add_of_nonneg_right hB_nonneg) hP_nonneg + _ = + boundaryCaccioppoliWithRHSRHS C s t u := by + rfl + + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Setup.lean new file mode 100644 index 0000000000..bb6c5b5333 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Setup.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.MultiscalePoincare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS + +/-! # Setup -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Coarse Caccioppoli with RHS Setup + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: define the public forced-boundary Caccioppoli decomposition data and +transport the zero-trace corrector into the open-cube public domain. + +Downstream target: `CoarseCaccioppoliRHS/EnergySplit.lean`. This file should +remain setup infrastructure, not a public theorem-package surface. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- The public/open-cube form of the zero-trace corrector attached to the +forced boundary Caccioppoli decomposition. -/ +noncomputable def boundaryForcedCaccioppoliCorrectorOpenH10 + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + castH10Domain (Ch02.cubeDomain_coe Q).symm ρ.toH10.toOpenCubeSet + +@[simp] theorem boundaryForcedCaccioppoliCorrectorOpenH10_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ).toH1Function.grad = + ρ.toH10.toH1Function.grad := by + simp only [boundaryForcedCaccioppoliCorrectorOpenH10] + rw [castH10Domain_toH1Function_grad] + rw [H10Function.toOpenCubeSet_toH1Function_grad] + +@[simp] theorem boundaryForcedCaccioppoliCorrectorOpenH10_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ).toH1Function.toFun = + ρ.toH10.toH1Function.toFun := by + simp only [boundaryForcedCaccioppoliCorrectorOpenH10] + rw [castH10Domain_toH1Function_toFun] + rw [H10Function.toOpenCubeSet_toH1Function_toFun] + +/-- Half-open zero-trace RHS weak solutions transport to the open cube because +the boundary has zero volume. -/ +theorem isZeroTraceDirichletRhsWeakSolution_openCubeSet_of_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {A : CoeffField d} {u : H10Function (cubeSet Q)} + {g : Vec d → Vec d} + (h : IsZeroTraceDirichletRhsWeakSolution A (cubeSet Q) u g) : + IsZeroTraceDirichletRhsWeakSolution A (openCubeSet Q) u.toOpenCubeSet g := by + intro φ + have hcube := h φ.toCubeSet + have hleft : + ∫ x in cubeSet Q, + vecDot (matVecMul (A x) (u.toH1Function.grad x)) + (φ.toCubeSet.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (A x) (u.toOpenCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => + vecDot (matVecMul (A x) (u.toH1Function.grad x)) + (φ.toCubeSet.toH1Function.grad x))) + have hright : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => vecDot (g x) (φ.toCubeSet.toH1Function.grad x))) + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (A x) (u.toOpenCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in cubeSet Q, + vecDot (matVecMul (A x) (u.toH1Function.grad x)) + (φ.toCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := hleft.symm + _ = + ∫ x in cubeSet Q, + vecDot (g x) (φ.toCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume := hcube + _ = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := hright + +/-- On the public open cube, replacing `publicCoeffField` by the deterministic +`coeffOn` representative preserves zero-trace RHS weak solutions. -/ +theorem isZeroTraceDirichletRhsWeakSolution_coeffOn_openCubeSet_of_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {u : H10Function (openCubeSet Q)} {g : Vec d → Vec d} + (h : IsZeroTraceDirichletRhsWeakSolution (publicCoeffField Q a) + (openCubeSet Q) u g) : + IsZeroTraceDirichletRhsWeakSolution (a.coeffOn Q).toCoeffField + (openCubeSet Q) u g := by + intro φ + have hcoeff := publicCoeffField_ae_eq_openCubeSet Q a + have hintegrand : + (fun x => + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (u.toH1Function.grad x)) (φ.toH1Function.grad x)) + =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => + vecDot (matVecMul (publicCoeffField Q a x) + (u.toH1Function.grad x)) (φ.toH1Function.grad x) := by + filter_upwards [hcoeff] with x hx + simp [hx] + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (publicCoeffField Q a x) + (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := MeasureTheory.integral_congr_ae hintegrand + _ = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := h φ + +/-- Public zero-trace forced-solution wrapper for the auxiliary corrector in +the forced boundary Caccioppoli decomposition. -/ +noncomputable def boundaryForcedCaccioppoliCorrectorZeroTraceForcedCubeSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + ZeroTraceForcedCubeSolution Q a g where + toH10 := boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ + weakSolution := by + have hopen_public : + IsZeroTraceDirichletRhsWeakSolution (publicCoeffField Q a) + (openCubeSet Q) ρ.toH10.toOpenCubeSet g := + isZeroTraceDirichletRhsWeakSolution_openCubeSet_of_cubeSet + (Q := Q) (A := publicCoeffField Q a) ρ.weakSolution + have hopen_coeff : + IsZeroTraceDirichletRhsWeakSolution (a.coeffOn Q).toCoeffField + (openCubeSet Q) ρ.toH10.toOpenCubeSet g := + isZeroTraceDirichletRhsWeakSolution_coeffOn_openCubeSet_of_publicCoeffField + (Q := Q) (a := a) hopen_public + intro φ + let φOpen : H10Function (openCubeSet Q) := + castH10Domain (Ch02.cubeDomain_coe Q) φ + have h := hopen_coeff φOpen + have hgrad : φOpen.toH1Function.grad = φ.toH1Function.grad := by + simp only [φOpen] + rw [castH10Domain_toH1Function_grad] + have hρgrad : + (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ).toH1Function.grad = + ρ.toH10.toH1Function.grad := + boundaryForcedCaccioppoliCorrectorOpenH10_grad (Q := Q) (a := a) ρ + have hρgrad' : + ρ.toH10.toOpenCubeSet.toH1Function.grad = ρ.toH10.toH1Function.grad := by + simp only [H10Function.toOpenCubeSet_toH1Function_grad] + simpa only [hgrad, hρgrad, hρgrad', Ch02.cubeDomain_coe] using h + +/-- Public forced-solution wrapper for the zero-trace corrector, used when the +RHS Poincare gradient estimate is applied to the corrector itself. -/ +noncomputable def boundaryForcedCaccioppoliCorrectorForcedCubeSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + ForcedCubeSolution Q a g where + toH1 := + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function + weakSolution := + (boundaryForcedCaccioppoliCorrectorZeroTraceForcedCubeSolution + (Q := Q) (a := a) ρ).weakSolution + +@[simp] theorem boundaryForcedCaccioppoliCorrectorForcedCubeSolution_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliCorrectorForcedCubeSolution + (Q := Q) (a := a) ρ).toH1.grad = + ρ.toH10.toH1Function.grad := by + simp [boundaryForcedCaccioppoliCorrectorForcedCubeSolution] + +@[simp] theorem boundaryForcedCaccioppoliCorrectorForcedCubeSolution_energyNorm_eq + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + forcedSolutionEnergyNorm Q a + (boundaryForcedCaccioppoliCorrectorForcedCubeSolution + (Q := Q) (a := a) ρ) = + zeroTraceForcedSolutionEnergyNorm Q a + (boundaryForcedCaccioppoliCorrectorZeroTraceForcedCubeSolution + (Q := Q) (a := a) ρ) := by + simp only [boundaryForcedCaccioppoliCorrectorForcedCubeSolution, + boundaryForcedCaccioppoliCorrectorZeroTraceForcedCubeSolution, + forcedSolutionEnergyNorm, zeroTraceForcedSolutionEnergyNorm] + +/-- Value-level homogeneous remainder `w = u - ρ` on the public open cube. -/ +noncomputable def boundaryForcedCaccioppoliRemainderOpenH1 + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + H1Function (Ch02.cubeDomain Q : Set (Vec d)) := + u.toH1 - (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ).toH1Function + +@[simp] theorem boundaryForcedCaccioppoliRemainderOpenH1_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).grad = + fun y => u.toH1.grad y - ρ.toH10.toH1Function.grad y := by + funext y + simp only [boundaryForcedCaccioppoliRemainderOpenH1, H1Function.sub_grad, + boundaryForcedCaccioppoliCorrectorOpenH10_grad] + +@[simp] theorem boundaryForcedCaccioppoliRemainderOpenH1_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).toFun = + fun y => u.toH1.toFun y - ρ.toH10.toH1Function.toFun y := by + funext y + simp only [boundaryForcedCaccioppoliRemainderOpenH1, H1Function.sub_toFun, + boundaryForcedCaccioppoliCorrectorOpenH10_toFun] + +/-- Deterministic half-open-cube realization of the homogeneous remainder. -/ +noncomputable def boundaryForcedCaccioppoliRemainderCubeH1 + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + H1Function (cubeSet Q) := + publicH1ToCubeSet (boundaryForcedCaccioppoliRemainderOpenH1 u ρ) + +@[simp] theorem boundaryForcedCaccioppoliRemainderCubeH1_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliRemainderCubeH1 u ρ).grad = + fun y => u.toH1.grad y - ρ.toH10.toH1Function.grad y := by + funext y + simp [boundaryForcedCaccioppoliRemainderCubeH1] + +@[simp] theorem boundaryForcedCaccioppoliRemainderCubeH1_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) : + (boundaryForcedCaccioppoliRemainderCubeH1 u ρ).toFun = + fun y => u.toH1.toFun y - ρ.toH10.toH1Function.toFun y := by + funext y + simp [boundaryForcedCaccioppoliRemainderCubeH1] + +/-- The value-level remainder is `a`-harmonic on the deterministic cube. -/ +theorem boundaryForcedCaccioppoliRemainderCube_isAHarmonicGradient_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + IsAHarmonicGradient (publicCoeffField Q a) (cubeSet Q) + (boundaryForcedCaccioppoliRemainderCubeH1 u ρ).grad := by + let U : H1Function (cubeSet Q) := publicH1ToCubeSet u.toH1 + let W : H1Function (cubeSet Q) := + boundaryForcedCaccioppoliRemainderCubeH1 u ρ + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) U g := by + simpa [U] using + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution + have hres_u : + IsSolenoidalOn (cubeSet Q) + (fun y => matVecMul (publicCoeffField Q a y) (U.grad y) - g y) := + hweak.residual_solenoidal + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hg_mem + have hres_ρ : + IsSolenoidalOn (cubeSet Q) + (fun y => + matVecMul (publicCoeffField Q a y) (ρ.toH10.toH1Function.grad y) - g y) := + ρ.residualFlux_solenoidal + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hg_mem + have hU_mem : MemVectorL2 (cubeSet Q) U.grad := U.grad_memVectorL2 + have hflux_u_mem : + MemVectorL2 (cubeSet Q) + (fun y => matVecMul (publicCoeffField Q a y) (U.grad y)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hU_mem + have hres_u_mem : + MemVectorL2 (cubeSet Q) + (fun y => matVecMul (publicCoeffField Q a y) (U.grad y) - g y) := + hflux_u_mem.sub hg_mem + have hflux_ρ_mem : + MemVectorL2 (cubeSet Q) + (fun y => matVecMul (publicCoeffField Q a y) + (ρ.toH10.toH1Function.grad y)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + ρ.toH10.toH1Function.grad_memVectorL2 + have hres_ρ_mem : + MemVectorL2 (cubeSet Q) + (fun y => + matVecMul (publicCoeffField Q a y) (ρ.toH10.toH1Function.grad y) - g y) := + hflux_ρ_mem.sub hg_mem + have hsol_sum : + IsSolenoidalOn (cubeSet Q) + ((fun y => matVecMul (publicCoeffField Q a y) (U.grad y) - g y) + + (-1 : ℝ) • + (fun y => + matVecMul (publicCoeffField Q a y) + (ρ.toH10.toH1Function.grad y) - g y)) := + isSolenoidalOn_add_of_memVectorL2 hres_u_mem (hres_ρ_mem.const_smul (-1)) + hres_u (isSolenoidalOn_smul hres_ρ (-1)) + have hsol : + IsSolenoidalOn (cubeSet Q) + (fun y => matVecMul (publicCoeffField Q a y) (W.grad y)) := by + convert hsol_sum using 1 + funext y + ext i + simp [W, U, boundaryForcedCaccioppoliRemainderCubeH1, + sub_eq_add_neg, matVecMul_add, matVecMul_neg, Pi.add_apply] + exact ⟨W.isPotentialOn, hsol⟩ + +/-- The value-level remainder is harmonic for the public coefficient field on +the open cube. -/ +theorem boundaryForcedCaccioppoliRemainderOpen_isAHarmonicGradient_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + IsAHarmonicGradient (publicCoeffField Q a) (openCubeSet Q) + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).grad := by + have hcube := + boundaryForcedCaccioppoliRemainderCube_isAHarmonicGradient_publicCoeffField + (Q := Q) (a := a) u ρ hg_mem + constructor + · simpa [boundaryForcedCaccioppoliRemainderCubeH1] using + isPotentialOn_openCubeSet_triadicCube_of_cubeSet hcube.1 + · simpa [boundaryForcedCaccioppoliRemainderCubeH1] using + isSolenoidalOn_openCubeSet_triadicCube_of_cubeSet hcube.2 + +/-- The value-level remainder is harmonic for the note-facing coefficient +representative on the public cube domain. -/ +theorem boundaryForcedCaccioppoliRemainderOpen_isAHarmonicGradient_coeffOn + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + IsAHarmonicGradient (a.coeffOn Q).toCoeffField + (Ch02.cubeDomain Q : Set (Vec d)) + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).grad := by + have hpublic : + IsAHarmonicGradient (publicCoeffField Q a) (openCubeSet Q) + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).grad := + boundaryForcedCaccioppoliRemainderOpen_isAHarmonicGradient_publicCoeffField + (Q := Q) (a := a) u ρ hg_mem + have hcoeff : + IsAHarmonicGradient (a.coeffOn Q).toCoeffField (openCubeSet Q) + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).grad := + IsAHarmonicGradient.of_ae_eq_coeff + (publicCoeffField_ae_eq_openCubeSet Q a) hpublic + simpa [Ch02.cubeDomain_coe] using hcoeff + +/-- Homogeneous boundary datum obtained by subtracting the zero-trace +Dirichlet corrector from a forced boundary datum. -/ +noncomputable def boundaryForcedCaccioppoliRemainderDatum + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + BoundaryCaccioppoliDatum Q a x where + toH1 := boundaryForcedCaccioppoliRemainderOpenH1 u ρ + isHarmonic := + boundaryForcedCaccioppoliRemainderOpen_isAHarmonicGradient_coeffOn + (Q := Q) (a := a) u ρ hg_mem + zeroTraceOnBoundaryPatch := by + have hρ : + LocalizedZeroTraceFunctionOn + (Ch02.cubeDomain Q : Set (Vec d)) + (openCubeAtScale x (Q.scale - 1)) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun := + localizedZeroTraceFunctionOn_of_h10_any + (boundaryForcedCaccioppoliCorrectorOpenH10 (Q := Q) (a := a) ρ) + have hsub := + localizedZeroTraceFunctionOn_sub u.zeroTraceOnBoundaryPatch hρ + have hfun : + (boundaryForcedCaccioppoliRemainderOpenH1 u ρ).toFun = + fun y => u.toH1.toFun y - + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun y := by + funext y + simp only [boundaryForcedCaccioppoliRemainderOpenH1, H1Function.sub_toFun] + rw [hfun] + exact hsub + +@[simp] theorem boundaryForcedCaccioppoliRemainderDatum_toH1 + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hg_mem : MemVectorL2 (cubeSet Q) g) : + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem).toH1 = + boundaryForcedCaccioppoliRemainderOpenH1 u ρ := + rfl + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Theory.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Theory.lean new file mode 100644 index 0000000000..18c87c4810 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/Theory.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Bridges + +/-! # Theory -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public Coarse Caccioppoli with RHS Theory + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: expose the single public boundary coarse Caccioppoli-with-RHS theorem +package and assemble it from the proved parent-`L²` corrector bound. + +Downstream target: note-facing Ch3 theorem consumers. This is the only public +`CoarseCaccioppoliRHSTheory` surface; new variants must amend the Ch3 surface +contract first. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Public theorem package for the boundary coarse-grained Caccioppoli estimate +with right-hand side. -/ +structure CoarseCaccioppoliRHSTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g), + 0 < s → s < 1 → 0 < t → t < 1 / 2 → s + t < 1 → + x ∈ openCubeSet Q → ForceBesovRegularity Q (2 * t) g → + boundaryForcedCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliWithRHSRHS C s t u + +/-- Conditional package constructor for the boundary coarse-grained Caccioppoli +estimate with right-hand side. This is the public assembly point consumed once +the theorem-specific Caccioppoli estimate is available. -/ +private theorem coarseCaccioppoliRHSTheory_of_bound + {d : ℕ} [NeZero d] {C : ℝ} (hC_pos : 0 < C) + (hbound : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + {x : Vec d} {g : Vec d → Vec d} + (u : BoundaryForcedCaccioppoliDatum Q a x g), + 0 < s → s < 1 → 0 < t → t < 1 / 2 → s + t < 1 → + x ∈ openCubeSet Q → ForceBesovRegularity Q (2 * t) g → + boundaryForcedCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliWithRHSRHS C s t u) : + CoarseCaccioppoliRHSTheory d := by + exact ⟨⟨C, hC_pos, hbound⟩⟩ + +/-- If the zero-trace corrector parent `L²` bound is available, the full public +Caccioppoli-with-RHS theorem follows. + +This theorem is the current assembly apex: homogeneous Caccioppoli, the +zero-Dirichlet RHS estimate, the forced split, and the scalar absorptions are +all wired in here. -/ +private theorem coarseCaccioppoliRHSTheory_of_parentL2_bound + {d : ℕ} [NeZero d] + (hbound : + ∃ K : ℝ, 0 < K ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g), + 0 < t → t < 1 / 2 → ForceBesovRegularity Q (2 * t) g → + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2)) : + CoarseCaccioppoliRHSTheory d := by + rcases hbound with ⟨K, _hK_pos, hbound_parentL2⟩ + rcases (coarseCaccioppoliTheory d).exists_constant with + ⟨C_hom, hC_hom_pos, hboundary, _hinterior⟩ + let Kbig : ℝ := max 1 K + let C₀base : ℝ := + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) + let C₀ : ℝ := max 1 C₀base + let Z : ℝ := + (2 * (18 : ℝ) ^ d) * ((25 * Real.exp 4) * (((d : ℝ) * C₀) ^ 2)) + let C_inner : ℝ := + max 1 (max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z)) + let C_final : ℝ := 3 * C_inner + have hKbig_one : 1 ≤ Kbig := by + dsimp [Kbig] + exact le_max_left 1 K + have hK_le_Kbig : K ≤ Kbig := by + dsimp [Kbig] + exact le_max_right 1 K + have hK_enlarge : 1 ≤ 4 * Kbig := by nlinarith + have hC_hom_nonneg : 0 ≤ C_hom := le_of_lt hC_hom_pos + have hC₀_nonneg : 0 ≤ C₀ := by + dsimp [C₀] + exact le_trans zero_le_one (le_max_left 1 C₀base) + have hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀ := by + dsimp [C₀, C₀base] + exact le_max_right 1 C₀base + have hC_inner_one : 1 ≤ C_inner := by + dsimp [C_inner] + exact le_max_left 1 (max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z)) + have h4_hom_inner : 4 * C_hom ≤ C_inner := by + dsimp [C_inner] + calc + 4 * C_hom ≤ max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z) := + le_max_left _ _ + _ ≤ max 1 (max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z)) := + le_max_right _ _ + have hcorrector_inner : (4 * Kbig) * C_hom ≤ C_inner := by + dsimp [C_inner] + calc + (4 * Kbig) * C_hom ≤ max ((4 * Kbig) * C_hom) Z := + le_max_left _ _ + _ ≤ max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z) := + le_max_right _ _ + _ ≤ max 1 (max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z)) := + le_max_right _ _ + have hZ_inner : Z ≤ C_inner := by + dsimp [C_inner] + calc + Z ≤ max ((4 * Kbig) * C_hom) Z := le_max_right _ _ + _ ≤ max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z) := + le_max_right _ _ + _ ≤ max 1 (max (4 * C_hom) (max ((4 * Kbig) * C_hom) Z)) := + le_max_right _ _ + have hinner_le_sq : C_inner ≤ C_inner ^ 2 := by + nlinarith [sq_nonneg (C_inner - 1)] + have hzero_inner : + (2 * (18 : ℝ) ^ d) * + ((25 * Real.exp 4) * (((d : ℝ) * C₀) ^ 2)) ≤ + C_inner ^ 2 := by + dsimp [Z] at hZ_inner + exact hZ_inner.trans hinner_le_sq + have h3_inner_final : 3 * C_inner ≤ C_final := by + rfl + have hC_final_pos : 0 < C_final := by + dsimp [C_final] + nlinarith + refine + coarseCaccioppoliRHSTheory_of_bound + (d := d) (C := C_final) hC_final_pos ?_ + intro Q a s t x g u hs hs_lt ht ht_lt hst hx hg + let hg_mem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_forceBesovRegularity hg + let ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g := + zeroTraceDirichletCorrectorData_publicCoeffField Q a hg_mem + have hhom : + boundaryCaccioppoliCoreEnergy + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) ≤ + boundaryCaccioppoliRHS C_hom s t + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) := + hboundary + (boundaryForcedCaccioppoliRemainderDatum u ρ hg_mem) + hs ht hst hx + have hscaledK : + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + K * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := + hbound_parentL2 ρ ht ht_lt hg + have hforce_nonneg : + 0 ≤ + (Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2 := + boundaryCaccioppoliWithRHS_forceTerm_nonneg + (Q := Q) (a := a) (t := t) (g := g) ht ht_lt + have hscaled : + Ch02.lambdaS Q t a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) * + normalizedL2SqOnSet (openCubeSet Q) + (boundaryForcedCaccioppoliCorrectorOpenH10 + (Q := Q) (a := a) ρ).toH1Function.toFun ≤ + Kbig * + ((Real.rpow t (-8 : ℝ) / (1 - 2 * t)) * + Real.rpow (Ch02.lambdaS Q t a) (-1 : ℝ) * + (scaleNormalizedPositiveBesovVectorSeminormTwo Q (2 * t) g) ^ 2) := by + exact hscaledK.trans + (mul_le_mul_of_nonneg_right hK_le_Kbig hforce_nonneg) + exact + boundaryForcedCaccioppoliCoreEnergy_le_RHS_of_correctorParent_scaled_force_bound + (K := Kbig) (C_hom := C_hom) (C₀ := C₀) (C_inner := C_inner) + (C_final := C_final) + hK_enlarge hC_hom_nonneg hC₀_nonneg hC₀_zero + hC_inner_one h4_hom_inner hcorrector_inner hzero_inner h3_inner_final + (Q := Q) (a := a) (s := s) (t := t) (x := x) (g := g) + u ρ hg_mem hs hs_lt ht ht_lt hst hx hg hhom hscaled + +/-- Proved public coarse-grained boundary Caccioppoli estimate with right-hand +side. -/ +theorem coarseCaccioppoliRHSTheory + {d : ℕ} [NeZero d] : + CoarseCaccioppoliRHSTheory d := + coarseCaccioppoliRHSTheory_of_parentL2_bound + zeroTraceCorrectorParentL2_le_forceScale + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/ZeroTraceValue.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/ZeroTraceValue.lean new file mode 100644 index 0000000000..6a0c95151b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliRHS/ZeroTraceValue.lean @@ -0,0 +1,634 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS.Prefactors + +/-! # Zero Trace Value -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Zero-Trace Value Estimates for Coarse Caccioppoli with RHS + +This file is split mechanically out of `CoarseCaccioppoliRHS.lean`. + +## Audit tag + +Claim: relate normalized open-cube `L²` squares for the zero-trace corrector +to cube norms and the public forced Caccioppoli value terms. + +Downstream target: `CoarseCaccioppoliRHS/PublicRHSScalar.lean`. This file +should remain value/norm comparison infrastructure. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Normalized `L²` squares are nonnegative. -/ +theorem normalizedL2SqOnSet_nonneg + {d : ℕ} (V : Set (Vec d)) (u : Vec d → ℝ) : + MeasurableSet V → 0 ≤ normalizedL2SqOnSet V u := by + intro hV + unfold normalizedL2SqOnSet normalizedSetAverage + exact volumeAverage_nonneg_of_nonneg_on hV + (fun x _hx => sq_nonneg (u x)) + +/-- On a parent open cube, the normalized `L²` square is the square of the +normalized cube `L²` norm. -/ +theorem normalizedL2SqOnSet_openCubeSet_eq_cubeLpNorm_two_sq + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + normalizedL2SqOnSet (openCubeSet Q) u = + (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + have hsq_integral : + ∫ y in openCubeSet Q, u y ^ (2 : ℕ) ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + have hmul := + setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q u hu + calc + ∫ y in openCubeSet Q, u y ^ (2 : ℕ) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, u y * u y ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y hy + ring + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℝ) := hmul + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + rw [Real.rpow_two] + have hvol_ne : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + unfold normalizedL2SqOnSet normalizedSetAverage volumeAverage + calc + (MeasureTheory.volume (openCubeSet Q)).toReal⁻¹ * + ∫ y in openCubeSet Q, u y ^ (2 : ℕ) ∂MeasureTheory.volume = + (cubeVolume Q)⁻¹ * + ∫ y in openCubeSet Q, u y ^ (2 : ℕ) ∂MeasureTheory.volume := by + simp + _ = + (cubeVolume Q)⁻¹ * + (cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ)) := by + rw [hsq_integral] + _ = (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ (2 : ℕ) := by + rw [← mul_assoc, inv_mul_cancel₀ hvol_ne, one_mul] + +/-- Depth zero of the scalar positive Besov seminorm of a fluctuation is the +top-scale normalized `L²` norm. -/ +theorem cubeBesovDepthSeminorm_two_depth_zero_fluctuation_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 = + cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + have hfluct : cubeFluctuation Q (cubeFluctuation Q u) = cubeFluctuation Q u := + cubeFluctuation_cubeFluctuation_of_memLp_two Q Q hu + have hnonneg : 0 ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := + cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + have hsq : + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) = + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + simpa using sq_rpow_half_eq_of_nonneg hnonneg + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 + = + cubeBesovScaleWeight s Q * + ((cubeLpNorm Q (2 : ℝ≥0∞) + (cubeFluctuation Q (cubeFluctuation Q u))) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage, descendantsAverage, + cubeBesovOscillation] + _ = + cubeBesovScaleWeight s Q * + ((cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + rw [hfluct] + _ = cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + rw [hsq] + +/-- Any positive-Besov finite top norm contains the depth-zero fluctuation +`L²` contribution. -/ +theorem cubeBesovScaleWeight_mul_cubeLpNorm_fluctuation_le_partialNormTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (M : ℕ) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + calc + cubeBesovScaleWeight s Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + = cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 := by + rw [cubeBesovDepthSeminorm_two_depth_zero_fluctuation_eq Q s u hu] + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (cubeFluctuation Q u) 0 + ≤ cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) M + (cubeFluctuation Q u) := by + unfold cubeBesovPartialSeminormTop + exact Finset.le_sup' + (s := Finset.range (M + 1)) + (f := fun k => + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) + (cubeFluctuation Q u) k) + (by simp : 0 ∈ Finset.range (M + 1)) + _ ≤ cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) M + (cubeFluctuation Q u) := by + unfold cubeBesovPartialNormTop + exact le_add_of_nonneg_right + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +/-- The fluctuation half of the zero-trace value bridge: the top-scale +fluctuation `L²` norm is controlled by the public `q = 2` negative-Besov norm +of the gradient, with the geometric exponent-gap loss left explicit. -/ +theorem cubeBesovScaleWeight_one_mul_cubeLpNorm_fluctuation_le_grad_negativeBesovTwo + {d : ℕ} [NeZero d] (Q : TriadicCube d) {t : ℝ} + (u : H1Function (openCubeSet Q)) + (ht : 0 < t) (ht_lt : t < 1 / 2) : + cubeBesovScaleWeight (1 : ℝ) Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q (fun x => u x)) ≤ + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((d : ℝ) * + Real.sqrt + ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹))) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) (fun x => u.grad x) := by + let s0 : ℝ := (1 / 2 : ℝ) - t + let a : ℝ := 1 - s0 + let N : ℝ := cubeBesovNegativeVectorSeminormTwo Q (2 * t) (fun x => u.grad x) + let G : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * s0))⁻¹) + let C : ℝ := Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1) + have hs0_pos : 0 < s0 := by + dsimp [s0] + linarith + have hs0_lt_one : s0 < 1 := by + dsimp [s0] + linarith + have ha_gap : 0 < a - 2 * t := by + dsimp [a, s0] + linarith + have ha_eq : a = (1 / 2 : ℝ) + t := by + dsimp [a, s0] + ring + have hgap_eq : a - 2 * t = s0 := by + dsimp [a, s0] + ring + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (Ch01.Legacy.fullVectorPoincareConstant_nonneg Q) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hdepth : + cubeBesovScaleWeight s0 Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q (fun x => u x)) ≤ + cubeBesovPartialNormTop Q s0 (2 : ℝ≥0∞) 1 + (cubeFluctuation Q (fun x => u x)) := + cubeBesovScaleWeight_mul_cubeLpNorm_fluctuation_le_partialNormTop + Q s0 1 (fun x => u x) u.memL2_normalizedCubeMeasure + have hpoinc : + cubeBesovPartialNormTop Q s0 (2 : ℝ≥0∞) 1 + (cubeFluctuation Q (fun x => u x)) ≤ + C * + ∑ i : Fin d, + cubeBesovCircNorm Q a (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) := by + have hp := + Ch01.Legacy.h1_fluctuation_partialNormTop_two_le_sum_grad_circNorm + (Q := Q) (s := s0) (M := 1) u hs0_pos hs0_lt_one + simpa [C, a] using hp + have hBdd : + BddAbove (Set.range fun M : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q (2 * t) M (fun x => u.grad x)) := + by + have hgrad : + MeasureTheory.MemLp (fun x => u.grad x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa using + (MeasureTheory.MemLp.of_eval + (fun i : Fin d => u.grad_memL2_normalizedCubeMeasure i)) + exact cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp + Q (by nlinarith) (fun x => u.grad x) hgrad + have hcirc : + ∀ i : Fin d, + cubeBesovCircNorm Q a (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) ≤ + cubeBesovScaleWeight (-a) Q * (G * N) := by + intro i + have hraw := + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_gap_geometric_of_bddAbove + (Q := Q) (a := a) (b := 2 * t) ha_gap + (u := fun x => u.grad x) i hBdd + simpa [G, N, hgap_eq] using hraw + have hsum : + (∑ i : Fin d, + cubeBesovCircNorm Q a (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) ≤ + (d : ℝ) * (cubeBesovScaleWeight (-a) Q * (G * N)) := by + calc + (∑ i : Fin d, + cubeBesovCircNorm Q a (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) + ≤ ∑ _i : Fin d, cubeBesovScaleWeight (-a) Q * (G * N) := by + exact Finset.sum_le_sum fun i _ => hcirc i + _ = (d : ℝ) * (cubeBesovScaleWeight (-a) Q * (G * N)) := by + simp + have hfinite : + cubeBesovScaleWeight s0 Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q (fun x => u x)) ≤ + C * ((d : ℝ) * (cubeBesovScaleWeight (-a) Q * (G * N))) := by + exact hdepth.trans (hpoinc.trans (mul_le_mul_of_nonneg_left hsum hC_nonneg)) + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight a Q := + cubeBesovScaleWeight_nonneg a Q + calc + cubeBesovScaleWeight (1 : ℝ) Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q (fun x => u x)) + = + cubeBesovScaleWeight a Q * + (cubeBesovScaleWeight s0 Q * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q (fun x => u x))) := by + rw [← mul_assoc, cubeBesovScaleWeight_mul_eq_scaleWeight_add] + congr 1 + dsimp [a, s0] + ring_nf + _ ≤ cubeBesovScaleWeight a Q * + (C * ((d : ℝ) * (cubeBesovScaleWeight (-a) Q * (G * N)))) := by + exact mul_le_mul_of_nonneg_left hfinite hscale_nonneg + _ = + (C * ((d : ℝ) * G)) * N := by + have hcancel : + cubeBesovScaleWeight a Q * cubeBesovScaleWeight (-a) Q = 1 := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add] + simp [cubeBesovScaleWeight] + calc + cubeBesovScaleWeight a Q * + (C * ((d : ℝ) * (cubeBesovScaleWeight (-a) Q * (G * N)))) + = + C * ((d : ℝ) * + ((cubeBesovScaleWeight a Q * cubeBesovScaleWeight (-a) Q) * (G * N))) := by + ring + _ = C * ((d : ℝ) * (1 * (G * N))) := by + rw [hcancel] + _ = (C * ((d : ℝ) * G)) * N := by + ring + _ = + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((d : ℝ) * + Real.sqrt + ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹))) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) (fun x => u.grad x) := by + dsimp [C, G, N, s0] + +/-- The scalar average of a zero-trace function is controlled by the public +negative-Besov norm of its gradient. The proof uses the zero-trace identity +`∫ u = -∫ ∂ᵢu (xᵢ - centerᵢ)` and tests the gradient component against the +centered coordinate. -/ +theorem cubeBesovScaleWeight_one_mul_abs_cubeAverage_h10_le_grad_negativeBesovTwo + {d : ℕ} [NeZero d] (Q : TriadicCube d) {t : ℝ} + (u : H10Function (cubeSet Q)) + (ht : 0 < t) (ht_lt : t < 1 / 2) : + cubeBesovScaleWeight (1 : ℝ) Q * + ‖cubeAverage Q (fun x => u.toH1Function.toFun x)‖ ≤ + ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹)) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) := by + let i0 : Fin d := 0 + let φ : Vec d → ℝ := fun x => x i0 - cubeCenter Q i0 + let G : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹) + let N : ℝ := + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) + have hφ_cont : Continuous φ := by + dsimp [φ] + fun_prop + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + dsimp [φ] + fun_prop + have hradius_le_scale : cubeRadius Q ≤ cubeScaleFactor Q := by + have hEq := cubeScaleFactor_eq_two_mul_cubeRadius Q + have hr := cubeRadius_nonneg Q + nlinarith + have hφ_bound : ∀ x ∈ cubeSet Q, ‖φ x‖ ≤ cubeScaleFactor Q := by + intro x hx + have hxball : x ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hx + have hdist : ‖x - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hxball + have hcoord : ‖(x - cubeCenter Q) i0‖ ≤ ‖x - cubeCenter Q‖ := + norm_le_pi_norm (x - cubeCenter Q) i0 + calc + ‖φ x‖ = ‖(x - cubeCenter Q) i0‖ := by + simp [φ, Pi.sub_apply] + _ ≤ ‖x - cubeCenter Q‖ := hcoord + _ ≤ cubeRadius Q := hdist + _ ≤ cubeScaleFactor Q := hradius_le_scale + have hφLpTop : MeasureTheory.MemLp φ ∞ (normalizedCubeMeasure Q) := by + have hbound_ae_cube : ∀ᵐ x ∂ cubeMeasure Q, ‖φ x‖ ≤ cubeScaleFactor Q := by + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall hφ_bound + have hbound_ae : ∀ᵐ x ∂ normalizedCubeMeasure Q, ‖φ x‖ ≤ cubeScaleFactor Q := by + simpa [normalizedCubeMeasure] using + (MeasureTheory.Measure.ae_smul_measure hbound_ae_cube + (ENNReal.ofReal ((cubeVolume Q)⁻¹))) + exact MeasureTheory.memLp_top_of_bound hφ_cont.aestronglyMeasurable + (cubeScaleFactor Q) hbound_ae + have hφLp2 : MeasureTheory.MemLp φ (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hφLpTop.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have hφ_linf_le : cubeLpNorm Q ∞ φ ≤ cubeScaleFactor Q := + cubeLpNorm_infty_le_of_bound_on_cubeSet Q φ + (cubeScaleFactor_nonneg Q) hφ_bound + have hprod : cubeBesovScaleWeight (1 : ℝ) Q * cubeScaleFactor Q = 1 := by + have hmul := cubeBesovScaleWeight_neg_one_mul_cubeBesovScaleWeight_one_eq_one Q + have hneg := cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor Q + calc + cubeBesovScaleWeight (1 : ℝ) Q * cubeScaleFactor Q = + cubeBesovScaleWeight (-1 : ℝ) Q * cubeBesovScaleWeight (1 : ℝ) Q := by + rw [hneg] + ring + _ = 1 := hmul + have htest : + ∀ M : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M φ ≤ 2 := by + intro M + have hraw := cubeBesovDualTestNorm_one_two_le_of_contDiff_bound + Q φ M (by norm_num : (0 : ℝ) ≤ 1) hφLpTop hφ_smooth + (fun z _hz => norm_fderiv_coord_sub_const_le_one i0 (cubeCenter Q) z) + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M φ + ≤ 1 + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ φ := hraw + _ ≤ 1 + cubeBesovScaleWeight 1 Q * cubeScaleFactor Q := by + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_left hφ_linf_le + (cubeBesovScaleWeight_nonneg 1 Q)) + _ = 2 := by + rw [hprod] + norm_num + have hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ := + cubeBesovDualLocalMemLpGlobal_of_memLp_two Q φ hφLp2 + have hgrad_i : + MeasureTheory.MemLp (fun x => u.toH1Function.grad x i0) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using u.toOpenCubeSet.toH1Function.grad_memL2_normalizedCubeMeasure i0 + have hgrad_vec : + MeasureTheory.MemLp (fun x => u.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using + (MeasureTheory.MemLp.of_eval + (fun i : Fin d => u.toOpenCubeSet.toH1Function.grad_memL2_normalizedCubeMeasure i)) + have hBdd : + BddAbove (Set.range fun M : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q (2 * t) M + (fun x => u.toH1Function.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp + Q (by nlinarith : 0 < 2 * t) (fun x => u.toH1Function.grad x) hgrad_vec + have hcirc : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.toH1Function.grad x i0) ≤ + cubeBesovScaleWeight (-1 : ℝ) Q * (G * N) := by + have hraw := + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_gap_geometric_of_bddAbove + (Q := Q) (a := 1) (b := 2 * t) + (by linarith : 0 < (1 : ℝ) - 2 * t) + (u := fun x => u.toH1Function.grad x) i0 hBdd + simpa [G, N] using hraw + have hpair := + abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + Q 1 (fun x => u.toH1Function.grad x i0) φ + (by norm_num) hgrad_i (by norm_num : (0 : ℝ) ≤ 2) htest hmem + have hpair' : + |cubeBesovPairing Q (fun x => u.toH1Function.grad x i0) φ| ≤ + ((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1 : ℝ) Q * (G * N))) * 2 := by + exact hpair.trans + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcirc + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _)) + (by norm_num : (0 : ℝ) ≤ 2)) + have hid := cubeAverage_eq_neg_cubeAverage_grad_mul_centeredCoord_of_h10OnCube Q u i0 + have havg_pair : + ‖cubeAverage Q (fun x => u.toH1Function.toFun x)‖ = + |cubeBesovPairing Q (fun x => u.toH1Function.grad x i0) φ| := by + rw [hid] + unfold cubeBesovPairing + simp [φ, Real.norm_eq_abs] + calc + cubeBesovScaleWeight (1 : ℝ) Q * + ‖cubeAverage Q (fun x => u.toH1Function.toFun x)‖ + = + cubeBesovScaleWeight (1 : ℝ) Q * + |cubeBesovPairing Q (fun x => u.toH1Function.grad x i0) φ| := by + rw [havg_pair] + _ ≤ + cubeBesovScaleWeight (1 : ℝ) Q * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1 : ℝ) Q * (G * N))) * 2) := by + exact mul_le_mul_of_nonneg_left hpair' + (cubeBesovScaleWeight_nonneg 1 Q) + _ = ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * G) * N := by + have hcancel : cubeBesovScaleWeight (1 : ℝ) Q * + cubeBesovScaleWeight (-1 : ℝ) Q = 1 := by + have h := cubeBesovScaleWeight_neg_one_mul_cubeBesovScaleWeight_one_eq_one Q + nlinarith [h] + calc + cubeBesovScaleWeight (1 : ℝ) Q * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1 : ℝ) Q * (G * N))) * 2) + = + (2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((cubeBesovScaleWeight (1 : ℝ) Q * + cubeBesovScaleWeight (-1 : ℝ) Q) * (G * N)) := by + ring + _ = (2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 * (G * N)) := by + rw [hcancel] + _ = ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * G) * N := by + ring + _ = + ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹)) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) := by + rfl + +/-- The geometric loss with exponent `2r` is no larger than the corresponding +loss with exponent `r`. -/ +theorem sqrt_inv_one_sub_rpow_three_neg_two_mul_le_sqrt_inv_one_sub_rpow_three_neg + {r : ℝ} (hr : 0 < r) : + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * r))⁻¹) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-r))⁻¹) := by + let r₁ : ℝ := Real.rpow (3 : ℝ) (-r) + let r₂ : ℝ := Real.rpow (3 : ℝ) (-2 * r) + have hr₁_lt_one : r₁ < 1 := by + dsimp [r₁] + simpa [Real.rpow_eq_pow] using + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith : -r < 0) + have hr₂_lt_one : r₂ < 1 := by + dsimp [r₂] + simpa [Real.rpow_eq_pow] using + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by nlinarith : -2 * r < 0) + have hr₂_le_r₁ : r₂ ≤ r₁ := by + dsimp [r₁, r₂] + simpa [Real.rpow_eq_pow] using + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith : -2 * r ≤ -r) + have hden₁_pos : 0 < 1 - r₁ := by linarith + have hden₂_pos : 0 < 1 - r₂ := by linarith + have hden_order : 1 - r₁ ≤ 1 - r₂ := by linarith + have hinv_order : (1 - r₂)⁻¹ ≤ (1 - r₁)⁻¹ := + (inv_le_inv₀ hden₂_pos hden₁_pos).2 hden_order + simpa [r₁, r₂] using Real.sqrt_le_sqrt hinv_order + +/-- The normalized `L²` norm is bounded by the fluctuation part plus the +absolute scalar average. -/ +theorem cubeLpNorm_two_le_cubeLpNorm_fluctuation_add_norm_cubeAverage + {d : ℕ} (Q : TriadicCube d) (v : Vec d → ℝ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + ‖cubeAverage Q v‖ := by + have hv_fluct : + MeasureTheory.MemLp (cubeFluctuation Q v) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hv.sub (MeasureTheory.memLp_const (cubeAverage Q v)) + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage Q v) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverage Q v) + calc + cubeLpNorm Q (2 : ℝ≥0∞) v = + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => cubeFluctuation Q v x + + (fun _ : Vec d => cubeAverage Q v) x) := by + congr 1 + funext x + simp [cubeFluctuation] + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => cubeAverage Q v) := by + exact cubeLpNorm_add_le Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + (fun _ : Vec d => cubeAverage Q v) hv_fluct hconst (by norm_num) + _ = cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + + ‖cubeAverage Q v‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) + (c := cubeAverage Q v) (by norm_num)] + +/-- Full parent-cube zero-trace value estimate: the top-scale normalized +`L²` norm is controlled by the public negative-Besov norm of the gradient. -/ +theorem cubeBesovScaleWeight_one_mul_cubeLpNorm_h10_le_grad_negativeBesovTwo + {d : ℕ} [NeZero d] (Q : TriadicCube d) {t : ℝ} + (u : H10Function (cubeSet Q)) + (ht : 0 < t) (ht_lt : t < 1 / 2) : + cubeBesovScaleWeight (1 : ℝ) Q * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u.toH1Function.toFun x) ≤ + ((((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1) * (d : ℝ)) + + 2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹)) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) := by + let v : Vec d → ℝ := fun x => u.toH1Function.toFun x + let F : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + let Aavg : ℝ := ‖cubeAverage Q v‖ + let W : ℝ := cubeBesovScaleWeight (1 : ℝ) Q + let G : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹) + let N : ℝ := + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) + let Kfl : ℝ := (d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1) * (d : ℝ) + let Kav : ℝ := 2 * (3 : ℝ) ^ ((d : ℝ) + 1) + have hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + dsimp [v] + simpa using u.toOpenCubeSet.toH1Function.memL2_normalizedCubeMeasure + have htri : cubeLpNorm Q (2 : ℝ≥0∞) v ≤ F + Aavg := by + dsimp [F, Aavg, v] + exact cubeLpNorm_two_le_cubeLpNorm_fluctuation_add_norm_cubeAverage Q v hv + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact cubeBesovScaleWeight_nonneg 1 Q + have hfluct_raw := + cubeBesovScaleWeight_one_mul_cubeLpNorm_fluctuation_le_grad_negativeBesovTwo + (Q := Q) (t := t) u.toOpenCubeSet.toH1Function ht ht_lt + have hfluct0 : + W * F ≤ + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * ((d : ℝ) * G)) * N := by + dsimp [W, F, G, N] + simpa [v, H10Function.toOpenCubeSet_toH1Function_toFun, + H10Function.toOpenCubeSet_toH1Function_grad, + Ch01.Legacy.fullVectorPoincareConstant, + fullVectorPoincareCubeConstant_eq_dimensionConstant] using hfluct_raw + have hfluct : W * F ≤ (Kfl * G) * N := by + calc + W * F ≤ + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * ((d : ℝ) * G)) * N := hfluct0 + _ = (Kfl * G) * N := by + dsimp [Kfl] + ring + have havg_raw := + cubeBesovScaleWeight_one_mul_abs_cubeAverage_h10_le_grad_negativeBesovTwo + (Q := Q) (t := t) u ht ht_lt + have hGavg_le : + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹) ≤ G := by + dsimp [G] + have h := sqrt_inv_one_sub_rpow_three_neg_two_mul_le_sqrt_inv_one_sub_rpow_three_neg + (by linarith : 0 < 1 - 2 * t) + simpa [show -(1 - 2 * t) = -2 * ((1 / 2 : ℝ) - t) by ring] using h + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q (2 * t) + (fun x => u.toH1Function.grad x) + (cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp + Q (by nlinarith : 0 < 2 * t) (fun x => u.toH1Function.grad x) + (by + simpa using + (MeasureTheory.MemLp.of_eval + (fun i : Fin d => + u.toOpenCubeSet.toH1Function.grad_memL2_normalizedCubeMeasure i)))) + have hKav_nonneg : 0 ≤ Kav := by + dsimp [Kav] + positivity + have havg : W * Aavg ≤ (Kav * G) * N := by + dsimp [W, Aavg, Kav, N] at havg_raw ⊢ + have hstep : + ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹)) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) ≤ + ((2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * G) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) := by + have hcoef : + (2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (1 - 2 * t)))⁻¹) ≤ + (2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * G := by + exact mul_le_mul_of_nonneg_left hGavg_le hKav_nonneg + exact mul_le_mul_of_nonneg_right hcoef hN_nonneg + exact havg_raw.trans hstep + calc + W * cubeLpNorm Q (2 : ℝ≥0∞) v ≤ W * (F + Aavg) := + mul_le_mul_of_nonneg_left htri hW_nonneg + _ = W * F + W * Aavg := by ring + _ ≤ (Kfl * G) * N + (Kav * G) * N := add_le_add hfluct havg + _ = (((Kfl + Kav) * G) * N) := by ring + _ = + ((((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1) * (d : ℝ)) + + 2 * (3 : ℝ) ^ ((d : ℝ) + 1)) * + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * ((1 / 2 : ℝ) - t)))⁻¹)) * + cubeBesovNegativeVectorSeminormTwo Q (2 * t) + (fun x => u.toH1Function.grad x) := by + rfl + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScalarEnvelopes.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScalarEnvelopes.lean new file mode 100644 index 0000000000..73cc49dda6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScalarEnvelopes.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroScalarBounds + +/-! # Coarse Caccioppoli Scalar Envelopes -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scalar envelopes for coarse Caccioppoli + +This file contains the final scalar-envelope package used to upgrade +scale-zero explicit constants to the note-facing dimension-only constant. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Scalar envelope needed to upgrade the scale-zero explicit bridge constants +to the note-facing dimension-only `C(d)`. This is deliberately only a scalar +statement: all PDE and geometry work has already been discharged below this +surface. -/ +structure CoarseCaccioppoliScaleZeroScalarEnvelope + (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + (∀ {s t : ℝ}, 0 < s → 0 < t → s + t < 1 → + boundaryCaccioppoliScaleZeroExplicitConstant d s t ≤ C) ∧ + (∀ {s t : ℝ}, 0 < s → 0 < t → s + t < 1 → + interiorCaccioppoliScaleZeroExplicitConstant d s t ≤ C) + +/-- The scale-zero scalar envelope is fully proved from the explicit split +`s,t` bookkeeping. -/ +theorem coarseCaccioppoliScaleZeroScalarEnvelope + (d : ℕ) [NeZero d] : + CoarseCaccioppoliScaleZeroScalarEnvelope d where + exists_constant := by + refine ⟨caccioppoliScaleZeroScalarBound d, ?_, ?_, ?_⟩ + · exact lt_of_lt_of_le zero_lt_one (le_max_left _ _) + · intro s t hs ht hst + exact + (boundaryCaccioppoliScaleZeroExplicitConstant_le_scalarBound + (d := d) hs ht hst).trans + ((le_max_left + (boundaryCaccioppoliScaleZeroScalarBound d) + (interiorCaccioppoliScaleZeroScalarBound d)).trans + (le_max_right (1 : ℝ) + (max (boundaryCaccioppoliScaleZeroScalarBound d) + (interiorCaccioppoliScaleZeroScalarBound d)))) + · intro s t hs ht hst + exact + (interiorCaccioppoliScaleZeroExplicitConstant_le_scalarBound + (d := d) hs ht hst).trans + ((le_max_right + (boundaryCaccioppoliScaleZeroScalarBound d) + (interiorCaccioppoliScaleZeroScalarBound d)).trans + (le_max_right (1 : ℝ) + (max (boundaryCaccioppoliScaleZeroScalarBound d) + (interiorCaccioppoliScaleZeroScalarBound d)))) + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZero.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZero.lean new file mode 100644 index 0000000000..ac565c7968 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZero.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBridge + +/-! # Coarse Caccioppoli Scale Zero -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero coarse Caccioppoli inequality + +This file contains the full scale-zero proof and theorem packages used by the +arbitrary-scale public Caccioppoli interface. + +## Audit tag + +Claim: assemble the single note-facing scale-zero Caccioppoli package from the +scalar envelope, with all `s,t` dependence displayed in the public RHS. + +Downstream target: `coarseCaccioppoliScaleZeroTheory`, consumed by the +arbitrary-scale Caccioppoli interface. No additional public `*Theory` surface +belongs in this file. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Note-facing scale-zero Caccioppoli package. This is the full public +statement with `m = 0`: the constant is dimension-only, while all `s,t` +dependence is displayed in `boundaryCaccioppoliRHS` and +`interiorCaccioppoliRHS`. -/ +structure CoarseCaccioppoliScaleZeroTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} {x : Vec d} + (u : BoundaryCaccioppoliDatum Q a x), + 0 < s → 0 < t → s + t < 1 → x ∈ openCubeSet Q → Q.scale = 0 → + boundaryCaccioppoliCoreEnergy u ≤ + boundaryCaccioppoliRHS C s t u) ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + (u : CubeSolution Q a), + 0 < s → 0 < t → s + t < 1 → Q.scale = 0 → + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + interiorCaccioppoliRHS C Q a s t u) + +/-- Once the one-dimensional scalar envelope is proved, the full note-facing +scale-zero Caccioppoli package follows with no further analytic assumptions. -/ +private theorem coarseCaccioppoliScaleZeroTheory_of_scalarEnvelope + {d : ℕ} [NeZero d] + (hscalar : CoarseCaccioppoliScaleZeroScalarEnvelope d) : + CoarseCaccioppoliScaleZeroTheory d := by + rcases hscalar.exists_constant with ⟨C, hCpos, hboundary, hinterior⟩ + let D : ℝ := (d : ℝ) ^ (2 : ℕ) + have hd_nat : 1 ≤ d := Nat.succ_le_of_lt (Nat.pos_of_ne_zero (NeZero.ne d)) + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hd_nat + have hd_pos : 0 < (d : ℝ) := lt_of_lt_of_le zero_lt_one hd_one + have hD_pos : 0 < D := by + dsimp [D] + exact pow_pos hd_pos 2 + have hD_nonneg : 0 ≤ D := hD_pos.le + refine ⟨⟨D * C, mul_pos hD_pos hCpos, ?_, ?_⟩⟩ + · intro Q a s t x u hs ht hst hx hQscale + refine + boundary_publicCoreEnergy_le_publicRHS_of_scale_zero_of_unitStandardExplicitBoundSplit + (Q := Q) (a := a) (x := x) u hs ht hst hx hQscale ?_ + have hbase := hboundary hs ht hst + have hmul : D * boundaryCaccioppoliScaleZeroExplicitConstant d s t ≤ D * C := + mul_le_mul_of_nonneg_left hbase hD_nonneg + simpa [D, boundaryCaccioppoliScaleZeroExplicitConstant, + mul_assoc, mul_left_comm, mul_comm] using hmul + · intro Q a s t u hs ht hst hQscale + refine + interior_centered_publicCoreEnergy_le_publicRHS_of_scale_zero_of_unitStandardExplicitBoundSplit + (Q := Q) (a := a) u hs ht hst hQscale ?_ + have hbase := hinterior hs ht hst + have hmul : D * interiorCaccioppoliScaleZeroExplicitConstant d s t ≤ D * C := + mul_le_mul_of_nonneg_left hbase hD_nonneg + simpa [D, interiorCaccioppoliScaleZeroExplicitConstant, + mul_assoc, mul_left_comm, mul_comm] using hmul + +/-- Fully proved note-facing scale-zero Caccioppoli package (`m = 0`). -/ +theorem coarseCaccioppoliScaleZeroTheory + (d : ℕ) [NeZero d] : + CoarseCaccioppoliScaleZeroTheory d := + coarseCaccioppoliScaleZeroTheory_of_scalarEnvelope + (coarseCaccioppoliScaleZeroScalarEnvelope d) + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBridge.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBridge.lean new file mode 100644 index 0000000000..68b6fb8356 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBridge.lean @@ -0,0 +1,440 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS.Monotonicity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScalarEnvelopes + +/-! # Coarse Caccioppoli Scale Zero Bridge -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli public bridge estimates + +This file assembles the scale-zero core estimates with the RHS bridge helpers +and explicit scalar envelope to produce the public scale-zero Caccioppoli +endpoint used by the dilation transport layer. + +## Audit tag + +Claim: bridge deterministic scale-zero core estimates and explicit scalar +budgets into the public boundary and centered-interior RHS forms. + +Downstream target: `coarseCaccioppoliScaleZeroTheory_of_scalarEnvelope`. +This file is bridge plumbing only; it should not introduce another public +`*Theory` package. +-/ + +noncomputable section + +open scoped ENNReal + +private theorem boundary_publicCoreEnergy_le_eighteen_pow_mul_publicRHS_of_scale_zero_standardExplicitBudgetSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hx : x ∈ openCubeSet Q) (hQscale : Q.scale = 0) : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal + 0 ≤ Cnote ∧ + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) s t u := by + let CsolQ : ℝ := fullVectorPoincareCubeConstant Q + let CalphaQ : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s CsolQ + let CcrossQ : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s CsolQ + let CalphaInternalQ : ℝ := (Fintype.card (Fin d) : ℝ) * CalphaQ + let CcrossInternalQ : ℝ := (Fintype.card (Fin d) : ℝ) * CcrossQ + let CnoteQ : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternalQ CcrossInternalQ + have hdet_full := + boundary_localPatch_deterministic_note_from_public_standardExplicitBudgetSplit + (Q := Q) (a := a) (x := x) u hs ht hst + have hdet : + 0 ≤ CnoteQ ∧ + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (coarseCaccioppoliHarmonicL2Sq Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic) := by + simpa [CsolQ, CalphaQ, CcrossQ, CalphaInternalQ, CcrossInternalQ, CnoteQ] + using hdet_full + rcases hdet with ⟨hCnote, hdet_bound⟩ + have hgeom := + boundaryCaccioppoliCoreEnergy_le_eighteen_pow_mul_localEnergyRadiusProfile + u hx + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + have hconvert : + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (boundaryCaccioppoliParentL2Sq u) ≤ + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) s t u := + deterministic_boundaryNoteRhs_pointwiseCoeffFor_le_publicRHS_dim_sq_mul_of_scale_zero + (Q := Q) (a := a) (x := x) u (s := s) (t := t) (C := CnoteQ) + hs ht hst hCnote hQscale + have hbound : + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) s t u := by + calc + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := hgeom + _ = + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) := by + simp [one_div] + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (coarseCaccioppoliHarmonicL2Sq Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic) := by + exact mul_le_mul_of_nonneg_left hdet_bound hfactor_nonneg + _ = + (18 : ℝ) ^ d * + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (boundaryCaccioppoliParentL2Sq u) := by + rw [boundaryCaccioppoliParentL2Sq_eq_harmonicL2Sq_pointwise u] + _ ≤ + (18 : ℝ) ^ d * + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) s t u := by + exact mul_le_mul_of_nonneg_left hconvert hfactor_nonneg + have halpha : + CalphaQ = coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s := by + simpa [CalphaQ, CsolQ] using + coarseCaccioppoliLocalPatchBufferedAlphaBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQscale + have hcross : + CcrossQ = coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s := by + simpa [CcrossQ, CsolQ] using + coarseCaccioppoliLocalPatchBufferedCrossBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQscale + simpa [CalphaQ, CcrossQ, CalphaInternalQ, CcrossInternalQ, CnoteQ, halpha, hcross] + using And.intro hCnote hbound + +private theorem interior_centered_publicCoreEnergy_le_eighteen_pow_mul_publicRHS_of_scale_zero_standardExplicitBudgetSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hQscale : Q.scale = 0) : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal + 0 ≤ Cnote ∧ + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + (18 : ℝ) ^ d * + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) Q a s t u := by + let CsolQ : ℝ := fullVectorPoincareCubeConstant Q + let CalphaQ : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s CsolQ + let CcrossQ : ℝ := coarseCaccioppoliBufferedCrossBudget Q s CsolQ + let CalphaInternalQ : ℝ := (Fintype.card (Fin d) : ℝ) * CalphaQ + let CcrossInternalQ : ℝ := (Fintype.card (Fin d) : ℝ) * CcrossQ + let CnoteQ : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternalQ CcrossInternalQ + have hdet_full := + interior_centered_deterministic_note_from_public_oscillation_standardExplicitBudgetSplit + (Q := Q) (a := a) u hs ht hst + have hdet : + 0 ≤ CnoteQ ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (interiorCaccioppoliParentOscillationL2Sq Q a u) := by + simpa [CsolQ, CalphaQ, CcrossQ, CalphaInternalQ, CcrossInternalQ, CnoteQ] + using hdet_full + rcases hdet with ⟨hCnote, hdet_bound⟩ + have hgeom := + interiorCaccioppoliCoreEnergy_le_eighteen_pow_mul_localEnergyRadiusProfile + (Q := Q) (a := a) (x := cubeCenter Q) u (cubeCenter_mem_openCubeSet Q) + let A : CoeffField d := pointwiseCoeffFor Q a + let uPw : AHarmonicFunction A (openCubeSet Q) := u.toPointwiseAHarmonic + let energy : Vec d → ℝ := fun y => scalarVariationEnergyIntegrand A uPw y + have hctrl : + CoarseCaccioppoliFluxEnergyControls Q A (1 : ℝ) + (fun y => matVecMul (A y) (uPw.toCubeSet.toH1.grad y)) + (fun y => scalarVariationEnergyIntegrand A uPw.toCubeSet y) := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := A) (s := (1 : ℝ)) (by norm_num) + (pointwiseCoeffFor_isEllipticFieldOn_cubeSet Q a) uPw.toCubeSet + have henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y := by + intro y hy + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.1 y hy + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := by + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.2.1 + have hlocal_le : + coarseCaccioppoliLocalEnergyRadiusProfile Q (cubeCenter Q) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) ≤ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) := by + simpa [energy, A, uPw] using + coarseCaccioppoliLocalEnergyRadiusProfile_cubeCenter_one_third_le_localizedEnergyRadiusProfile + (Q := Q) henergy_nonneg henergy_int + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + have hconvert : + coarseCaccioppoliInteriorNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (interiorCaccioppoliParentOscillationL2Sq Q a u) ≤ + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) Q a s t u := + deterministic_interiorNoteRhs_pointwiseCoeffFor_le_publicRHS_dim_sq_mul_of_scale_zero + (Q := Q) (a := a) u (s := s) (t := t) (C := CnoteQ) + hs ht hst hCnote hQscale + have hbound : + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + (18 : ℝ) ^ d * + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) Q a s t u := by + calc + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q (cubeCenter Q) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := hgeom + _ = + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q (cubeCenter Q) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) := by + simp [one_div] + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) := by + exact mul_le_mul_of_nonneg_left hlocal_le hfactor_nonneg + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliInteriorNoteRhs Q (pointwiseCoeffFor Q a) s t CnoteQ + (interiorCaccioppoliParentOscillationL2Sq Q a u) := by + exact mul_le_mul_of_nonneg_left hdet_bound hfactor_nonneg + _ ≤ + (18 : ℝ) ^ d * + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * CnoteQ) Q a s t u := by + exact mul_le_mul_of_nonneg_left hconvert hfactor_nonneg + have halpha : + CalphaQ = coarseCaccioppoliBufferedAlphaBudgetUnit d s := by + simpa [CalphaQ, CsolQ] using + coarseCaccioppoliBufferedAlphaBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQscale + have hcross : + CcrossQ = coarseCaccioppoliBufferedCrossBudgetUnit d s := by + simpa [CcrossQ, CsolQ] using + coarseCaccioppoliBufferedCrossBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQscale + simpa [CalphaQ, CcrossQ, CalphaInternalQ, CcrossInternalQ, CnoteQ, halpha, hcross] + using And.intro hCnote hbound + +private theorem boundary_publicCoreEnergy_le_publicRHS_of_scale_zero_of_noteConstant_mul_le + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t Cnote C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hCnote : 0 ≤ Cnote) + (hCnote_le : (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * Cnote) ≤ C) + (hbound : + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) s t u) : + boundaryCaccioppoliCoreEnergy u ≤ boundaryCaccioppoliRHS C s t u := by + have hfactor : (1 : ℝ) ≤ (18 : ℝ) ^ d := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 18) + have hD_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) := by positivity + have hD_Cnote_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) * Cnote := + mul_nonneg hD_nonneg hCnote + exact hbound.trans + (boundaryCaccioppoliRHS_mul_const_le_of_mul_constant_le + (Q := Q) (a := a) (x := x) u (s := s) (t := t) + (M := (18 : ℝ) ^ d) + (C₁ := ((d : ℝ) ^ (2 : ℕ)) * Cnote) (C₂ := C) + hfactor hD_Cnote_nonneg hCnote_le hs ht hst) + +private theorem interior_centered_publicCoreEnergy_le_publicRHS_of_scale_zero_of_noteConstant_mul_le + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t Cnote C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hCnote : 0 ≤ Cnote) + (hCnote_le : (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * Cnote) ≤ C) + (hbound : + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + (18 : ℝ) ^ d * + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) Q a s t u) : + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + interiorCaccioppoliRHS C Q a s t u := by + have hfactor : (1 : ℝ) ≤ (18 : ℝ) ^ d := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 18) + have hD_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) := by positivity + have hD_Cnote_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) * Cnote := + mul_nonneg hD_nonneg hCnote + exact hbound.trans + (interiorCaccioppoliRHS_mul_const_le_of_mul_constant_le + (Q := Q) (a := a) u (s := s) (t := t) + (M := (18 : ℝ) ^ d) + (C₁ := ((d : ℝ) ^ (2 : ℕ)) * Cnote) (C₂ := C) + hfactor hD_Cnote_nonneg hCnote_le hs ht hst) + +theorem boundary_publicCoreEnergy_le_publicRHS_of_scale_zero_of_unitStandardExplicitBoundSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hx : x ∈ openCubeSet Q) (hQscale : Q.scale = 0) + (hC : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s + (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * + caccioppoliStandardExplicitNoteBoundSplit + s t CalphaInternal CcrossInternal) ≤ C) : + boundaryCaccioppoliCoreEnergy u ≤ boundaryCaccioppoliRHS C s t u := by + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal + have hexact := + boundary_publicCoreEnergy_le_eighteen_pow_mul_publicRHS_of_scale_zero_standardExplicitBudgetSplit + (Q := Q) (a := a) (x := x) u hs ht hst hx hQscale + have hexact' : + 0 ≤ Cnote ∧ + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) s t u := by + simpa [CalphaInternal, CcrossInternal, Cnote] using hexact + rcases hexact' with ⟨hCnote, hbound⟩ + have hnote_le : + Cnote ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + simpa [CalphaInternal, CcrossInternal, Cnote] using + boundary_localPatch_standardExplicitNoteConstantSplit_le_unitExplicitBound_of_scale_zero + Q a hs ht hst hQscale + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + have hD_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) := by positivity + have hD_note_le : + ((d : ℝ) ^ (2 : ℕ)) * Cnote ≤ + ((d : ℝ) ^ (2 : ℕ)) * + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := + mul_le_mul_of_nonneg_left hnote_le hD_nonneg + have hCnote_le : + (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * Cnote) ≤ C := by + exact + (mul_le_mul_of_nonneg_left hD_note_le hfactor_nonneg).trans + (by simpa [CalphaInternal, CcrossInternal] using hC) + exact + boundary_publicCoreEnergy_le_publicRHS_of_scale_zero_of_noteConstant_mul_le + (Q := Q) (a := a) (x := x) u hs ht hst hCnote hCnote_le hbound + +theorem interior_centered_publicCoreEnergy_le_publicRHS_of_scale_zero_of_unitStandardExplicitBoundSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hQscale : Q.scale = 0) + (hC : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s + (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * + caccioppoliStandardExplicitNoteBoundSplit + s t CalphaInternal CcrossInternal) ≤ C) : + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + interiorCaccioppoliRHS C Q a s t u := by + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal + have hexact := + interior_centered_publicCoreEnergy_le_eighteen_pow_mul_publicRHS_of_scale_zero_standardExplicitBudgetSplit + (Q := Q) (a := a) u hs ht hst hQscale + have hexact' : + 0 ≤ Cnote ∧ + interiorCaccioppoliCoreEnergy Q a (cubeCenter Q) u ≤ + (18 : ℝ) ^ d * + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * Cnote) Q a s t u := by + simpa [CalphaInternal, CcrossInternal, Cnote] using hexact + rcases hexact' with ⟨hCnote, hbound⟩ + have hnote_le : + Cnote ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + simpa [CalphaInternal, CcrossInternal, Cnote] using + interior_centered_standardExplicitNoteConstantSplit_le_unitExplicitBound_of_scale_zero + Q a hs ht hst hQscale + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + have hD_nonneg : 0 ≤ ((d : ℝ) ^ (2 : ℕ)) := by positivity + have hD_note_le : + ((d : ℝ) ^ (2 : ℕ)) * Cnote ≤ + ((d : ℝ) ^ (2 : ℕ)) * + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := + mul_le_mul_of_nonneg_left hnote_le hD_nonneg + have hCnote_le : + (18 : ℝ) ^ d * (((d : ℝ) ^ (2 : ℕ)) * Cnote) ≤ C := by + exact + (mul_le_mul_of_nonneg_left hD_note_le hfactor_nonneg).trans + (by simpa [CalphaInternal, CcrossInternal] using hC) + exact + interior_centered_publicCoreEnergy_le_publicRHS_of_scale_zero_of_noteConstant_mul_le + (Q := Q) (a := a) u hs ht hst hCnote hCnote_le hbound + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBudgetEnvelopes.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBudgetEnvelopes.lean new file mode 100644 index 0000000000..a152a3bcba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroBudgetEnvelopes.lean @@ -0,0 +1,962 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliStandardScalar + +/-! # Coarse Caccioppoli Scale Zero Budget Envelopes -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli budget envelopes + +This file contains the dimension-only budget envelopes and explicit +scale-zero bridge constants used by the scalar Caccioppoli envelope. + +## Audit tag + +Claim: bound all unit-scale boundary and centered-interior alpha/cross/local +budgets by dimension-only envelopes. + +Downstream target: `CoarseCaccioppoliScaleZeroScalarBounds.lean`. This file +should contain scalar envelope arithmetic only, not public package constructors. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Dimension-only cross/local budget envelope for the scale-zero boundary +local-patch route. -/ +noncomputable def boundaryScaleZeroCrossBudgetEnvelope + (d : ℕ) [NeZero d] : ℝ := + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Clocal : ℝ := coarseCaccioppoliLocalPatchBufferedLocalBudget Q0 Csol + max 1 ((81 : ℝ) * 9 * Clocal) + +/-- Dimension-only cross/local budget envelope for the scale-zero centered +interior route. -/ +noncomputable def interiorScaleZeroCrossBudgetEnvelope + (d : ℕ) [NeZero d] : ℝ := + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q0 Csol + max 1 ((81 : ℝ) * 3 * Clocal) + +private theorem localPatchBufferedLocalBudget_unit_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ + coarseCaccioppoliLocalPatchBufferedLocalBudget (originCube d 0) + (fullVectorPoincareCubeConstant (originCube d 0)) := by + unfold coarseCaccioppoliLocalPatchBufferedLocalBudget + exact le_trans zero_le_one (le_max_left _ _) + +private theorem bufferedLocalBudget_unit_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ + coarseCaccioppoliBufferedLocalBudget (originCube d 0) + (fullVectorPoincareCubeConstant (originCube d 0)) := by + unfold coarseCaccioppoliBufferedLocalBudget + exact le_trans zero_le_one (le_max_left _ _) + +private theorem localPatchBufferedCrossBudgetUnit_le_envelope + {d : ℕ} [NeZero d] {s : ℝ} (hs_le : s ≤ 1) : + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s ≤ + boundaryScaleZeroCrossBudgetEnvelope d := by + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Clocal : ℝ := coarseCaccioppoliLocalPatchBufferedLocalBudget Q0 Csol + have hClocal_nonneg : 0 ≤ Clocal := by + dsimp [Clocal, Csol, Q0] + exact localPatchBufferedLocalBudget_unit_nonneg d + have hpow : Real.rpow (3 : ℝ) (2 * s) ≤ 9 := by + calc + Real.rpow (3 : ℝ) (2 * s) ≤ Real.rpow (3 : ℝ) 2 := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by nlinarith) + _ = 9 := by norm_num + have hterm : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * Clocal ≤ + (81 : ℝ) * 9 * Clocal := by + have hmul := mul_le_mul_of_nonneg_right hpow hClocal_nonneg + have hmul' := + mul_le_mul_of_nonneg_left hmul (by norm_num : (0 : ℝ) ≤ 81) + simpa [mul_assoc] using hmul' + unfold coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit + coarseCaccioppoliLocalPatchBufferedCrossBudget + boundaryScaleZeroCrossBudgetEnvelope + dsimp [Q0, Csol, Clocal] + exact max_le (le_max_left _ _) (hterm.trans (le_max_right _ _)) + +private theorem bufferedCrossBudgetUnit_le_envelope + {d : ℕ} [NeZero d] {s : ℝ} (hs_le : s ≤ 1) : + coarseCaccioppoliBufferedCrossBudgetUnit d s ≤ + interiorScaleZeroCrossBudgetEnvelope d := by + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q0 Csol + have hClocal_nonneg : 0 ≤ Clocal := by + dsimp [Clocal, Csol, Q0] + exact bufferedLocalBudget_unit_nonneg d + have hpow : Real.rpow (3 : ℝ) s ≤ 3 := by + calc + Real.rpow (3 : ℝ) s ≤ Real.rpow (3 : ℝ) 1 := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + hs_le + _ = 3 := by norm_num + have hterm : + (81 : ℝ) * Real.rpow (3 : ℝ) s * Clocal ≤ + (81 : ℝ) * 3 * Clocal := by + have hmul := mul_le_mul_of_nonneg_right hpow hClocal_nonneg + have hmul' := + mul_le_mul_of_nonneg_left hmul (by norm_num : (0 : ℝ) ≤ 81) + simpa [mul_assoc] using hmul' + unfold coarseCaccioppoliBufferedCrossBudgetUnit + coarseCaccioppoliBufferedCrossBudget + interiorScaleZeroCrossBudgetEnvelope + dsimp [Q0, Csol, Clocal] + exact max_le (le_max_left _ _) (hterm.trans (le_max_right _ _)) + +private theorem old_inv_geometricDiscount_le_five_inv {s p : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) (hp : 1 ≤ p) : + (Homogenization.geometricDiscount s p)⁻¹ ≤ 5 * s⁻¹ := by + have h := Ch02.inv_geometricDiscount_le_five_inv + (s := s) (p := p) hs hs_le hp + simpa [Ch02.geometricDiscount_eq_old] using h + +private theorem sqrt_inv_one_sub_rpow_three_two_mul_sub_le_five_inv {s : ℝ} + (hs : 0 < s) (hs1 : s < 1) : + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) ≤ + 5 * (1 - s)⁻¹ := by + let u : ℝ := 1 - s + let R : ℝ := 5 * u⁻¹ + have hu_pos : 0 < u := by + dsimp [u] + linarith + have hu_le : u ≤ 1 := by + dsimp [u] + linarith + have hdisc_inv : + (Homogenization.geometricDiscount u 2)⁻¹ ≤ R := by + dsimp [R] + exact old_inv_geometricDiscount_le_five_inv hu_pos hu_le + (by norm_num : (1 : ℝ) ≤ 2) + have hgeom_eq : + Homogenization.geometricDiscount u 2 = + 1 - Real.rpow (3 : ℝ) (2 * (s - 1)) := by + unfold Homogenization.geometricDiscount + dsimp [u] + congr 1 + ring_nf + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hR_ge_one : 1 ≤ R := by + have hinv_ge_one : 1 ≤ u⁻¹ := (one_le_inv₀ hu_pos).2 hu_le + dsimp [R] + nlinarith + have hR_le_sq : R ≤ R ^ (2 : ℕ) := by + nlinarith [sq_nonneg R, hR_ge_one] + rw [Real.sqrt_le_iff] + constructor + · simpa [R, u] using hR_nonneg + · calc + (1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹ + = (Homogenization.geometricDiscount u 2)⁻¹ := by rw [hgeom_eq] + _ ≤ R := hdisc_inv + _ ≤ R ^ (2 : ℕ) := hR_le_sq + _ = (5 * (1 - s)⁻¹) ^ (2 : ℕ) := by rfl + +private theorem rpow_three_d_add_s_le_d_add_one + (d : ℕ) {s : ℝ} (hs_le : s ≤ 1) : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + +private theorem inv_mul_self_one_sub_le_one {s : ℝ} + (hs : 0 < s) (_hs_le : s ≤ 1) : + s⁻¹ * (s * (1 - s)) ≤ 1 := by + have hs_ne : s ≠ 0 := hs.ne' + calc + s⁻¹ * (s * (1 - s)) = 1 - s := by + field_simp [hs_ne] + _ ≤ 1 := by linarith + +private theorem inv_mul_self_one_sub_le_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + s⁻¹ * (s * (1 - s)) ≤ s⁻¹ := by + have hone_le_inv : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + exact (inv_mul_self_one_sub_le_one hs hs_le).trans hone_le_inv + +private theorem two_endpoint_inv_mul_self_one_sub_le_inv {s : ℝ} + (hs : 0 < s) (hs1 : s < 1) : + s⁻¹ * ((1 - s)⁻¹ * (s * (1 - s))) ≤ s⁻¹ := by + have hs_ne : s ≠ 0 := hs.ne' + have hs1_pos : 0 < 1 - s := by linarith + have hs1_ne : 1 - s ≠ 0 := hs1_pos.ne' + have hs_le : s ≤ 1 := le_of_lt hs1 + have hone_le_inv : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + calc + s⁻¹ * ((1 - s)⁻¹ * (s * (1 - s))) = 1 := by + field_simp [hs_ne, hs1_ne] + _ ≤ s⁻¹ := hone_le_inv + +private noncomputable def centeredAverageFrontEnvelope + (d : ℕ) (C : ℝ) : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((5 : ℝ) * (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) + +private theorem centeredAverageFrontEnvelope_nonneg + (d : ℕ) {C : ℝ} (hC : 0 ≤ C) : + 0 ≤ centeredAverageFrontEnvelope d C := by + have hdisc_one_pos : 0 < Homogenization.geometricDiscount (1 : ℝ) 1 := by + exact Homogenization.geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hpow_nonneg : 0 ≤ Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hbase_nonneg : + 0 ≤ (3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + mul_nonneg (mul_nonneg (by norm_num) hC) hpow_nonneg + have hdisc_inv_nonneg : + 0 ≤ (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹ := + inv_nonneg.mpr hdisc_one_pos.le + have hfactor_nonneg : + 0 ≤ (5 : ℝ) * (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹ := + mul_nonneg (by norm_num) hdisc_inv_nonneg + have hcut_nonneg : 0 ≤ 2 * quantitativeCubeCutoffGradientConst d := + mul_nonneg (by norm_num) (quantitativeCubeCutoffGradientConst_nonneg d) + unfold centeredAverageFrontEnvelope + exact mul_nonneg (mul_nonneg hd_nonneg + (mul_nonneg hbase_nonneg hfactor_nonneg)) hcut_nonneg + +private theorem centeredAverageFront_le_envelope_mul_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs_le : s ≤ 1) : + coarseCaccioppoliCenteredAverageFront d s C ≤ + centeredAverageFrontEnvelope d C * s⁻¹ := by + have hdisc_one_pos : 0 < Homogenization.geometricDiscount (1 : ℝ) 1 := by + exact Homogenization.geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hdisc_s_inv : + (Homogenization.geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + old_inv_geometricDiscount_le_five_inv hs hs_le (by norm_num : (1 : ℝ) ≤ 1) + have hdisc_s_pos : 0 < Homogenization.geometricDiscount s 1 := by + exact Homogenization.geometricDiscount_pos (by simpa using hs) + have hbase_nonneg : + 0 ≤ (3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact mul_nonneg (mul_nonneg (by norm_num) hC) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hcut_nonneg : 0 ≤ 2 * quantitativeCubeCutoffGradientConst d := by + exact mul_nonneg (by norm_num) + (quantitativeCubeCutoffGradientConst_nonneg d) + unfold coarseCaccioppoliCenteredAverageFront centeredAverageFrontEnvelope + calc + (d : ℝ) * (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((Homogenization.geometricDiscount s 1)⁻¹ * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) + ≤ + (d : ℝ) * (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((5 * s⁻¹) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) := by + gcongr + _ = + ((d : ℝ) * (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((5 : ℝ) * (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d)) * s⁻¹ := by + ring_nf + +private theorem centeredAverageFront_mul_den_le_envelope_mul_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliCenteredAverageFront d s C * (s * (1 - s)) ≤ + centeredAverageFrontEnvelope d C * s⁻¹ := by + have hs_le : s ≤ 1 := le_of_lt hs1 + have hden_nonneg : 0 ≤ s * (1 - s) := by + exact mul_nonneg hs.le (by linarith) + have hfront := + centeredAverageFront_le_envelope_mul_inv d hC hs hs_le + have hscaled := + mul_le_mul_of_nonneg_right hfront hden_nonneg + have henv_nonneg : 0 ≤ centeredAverageFrontEnvelope d C := + centeredAverageFrontEnvelope_nonneg d hC + calc + coarseCaccioppoliCenteredAverageFront d s C * (s * (1 - s)) + ≤ (centeredAverageFrontEnvelope d C * s⁻¹) * (s * (1 - s)) := + hscaled + _ = centeredAverageFrontEnvelope d C * (s⁻¹ * (s * (1 - s))) := by + ring + _ ≤ centeredAverageFrontEnvelope d C * s⁻¹ := by + exact mul_le_mul_of_nonneg_left + (inv_mul_self_one_sub_le_inv hs hs_le) henv_nonneg + +private noncomputable def centeredHessianFrontEnvelope + (d : ℕ) (C : ℝ) : ℝ := + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + ((5 : ℝ) * + (2 * ((5 : ℝ) * + (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)))) * + (4 * quantitativeCubeCutoffHessianConst d) + +private theorem centeredHessianFrontEnvelope_nonneg + (d : ℕ) {C : ℝ} (hC : 0 ≤ C) : + 0 ≤ centeredHessianFrontEnvelope d C := by + have hdisc_one_pos : 0 < Homogenization.geometricDiscount (1 : ℝ) 1 := by + exact Homogenization.geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hpow_nonneg : 0 ≤ Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hnote_nonneg : + 0 ≤ (3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + mul_nonneg (mul_nonneg (by norm_num) hC) hpow_nonneg + have hnote_with_disc_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹ := + mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le) + have hfront_nonneg : + 0 ≤ (5 : ℝ) * + (2 * ((5 : ℝ) * + (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹))) := + mul_nonneg (by norm_num) + (mul_nonneg (by norm_num) + (mul_nonneg (by norm_num) hnote_with_disc_nonneg)) + have hcut_nonneg : 0 ≤ 4 * quantitativeCubeCutoffHessianConst d := + mul_nonneg (by norm_num) (quantitativeCubeCutoffHessianConst_nonneg d) + unfold centeredHessianFrontEnvelope + exact mul_nonneg (mul_nonneg (mul_nonneg hd_nonneg hpow_nonneg) + hfront_nonneg) hcut_nonneg + +private theorem centeredHessianFront_le_envelope_mul_endpoint_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliCenteredBesovHessianFront d s C ≤ + centeredHessianFrontEnvelope d C * (s⁻¹ * (1 - s)⁻¹) := by + have hs_le : s ≤ 1 := le_of_lt hs1 + have hdisc_s_inv : + (Homogenization.geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + old_inv_geometricDiscount_le_five_inv hs hs_le (by norm_num : (1 : ℝ) ≤ 1) + have hdisc_s_pos : 0 < Homogenization.geometricDiscount s 1 := by + exact Homogenization.geometricDiscount_pos (by simpa using hs) + have hsqrt : + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) ≤ + 5 * (1 - s)⁻¹ := + sqrt_inv_one_sub_rpow_three_two_mul_sub_le_five_inv hs hs1 + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + rpow_three_d_add_s_le_d_add_one d hs_le + have hnote_nonneg : + 0 ≤ (3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact mul_nonneg (mul_nonneg (by norm_num) hC) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hdisc_one_pos : 0 < Homogenization.geometricDiscount (1 : ℝ) 1 := by + exact Homogenization.geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hnote_with_disc_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹ := + mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le) + have hcut_nonneg : 0 ≤ 4 * quantitativeCubeCutoffHessianConst d := by + exact mul_nonneg (by norm_num) + (quantitativeCubeCutoffHessianConst_nonneg d) + have hprefix_large_nonneg : + 0 ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hprefix_s_nonneg : + 0 ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * (5 * s⁻¹) := + mul_nonneg hprefix_large_nonneg + (mul_nonneg (by norm_num) (inv_nonneg.mpr hs.le)) + unfold coarseCaccioppoliCenteredBesovHessianFront + coarseCaccioppoliCenteredBesovHessianBase centeredHessianFrontEnvelope + calc + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (Homogenization.geometricDiscount s 1)⁻¹ * + (2 * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹))) * + (4 * quantitativeCubeCutoffHessianConst d) + ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + (5 * s⁻¹) * + (2 * + ((5 * (1 - s)⁻¹) * + (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹))) * + (4 * quantitativeCubeCutoffHessianConst d) := by + gcongr + _ = + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + ((5 : ℝ) * + (2 * ((5 : ℝ) * + (((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (Homogenization.geometricDiscount (1 : ℝ) 1)⁻¹)))) * + (4 * quantitativeCubeCutoffHessianConst d)) * + (s⁻¹ * (1 - s)⁻¹) := by + ring_nf + +private theorem centeredHessianFront_mul_den_le_envelope_mul_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliCenteredBesovHessianFront d s C * (s * (1 - s)) ≤ + centeredHessianFrontEnvelope d C * s⁻¹ := by + have hden_nonneg : 0 ≤ s * (1 - s) := by + exact mul_nonneg hs.le (by linarith) + have hfront := + centeredHessianFront_le_envelope_mul_endpoint_inv d hC hs hs1 + have hscaled := + mul_le_mul_of_nonneg_right hfront hden_nonneg + have henv_nonneg : 0 ≤ centeredHessianFrontEnvelope d C := + centeredHessianFrontEnvelope_nonneg d hC + calc + coarseCaccioppoliCenteredBesovHessianFront d s C * (s * (1 - s)) + ≤ + (centeredHessianFrontEnvelope d C * (s⁻¹ * (1 - s)⁻¹)) * + (s * (1 - s)) := hscaled + _ = + centeredHessianFrontEnvelope d C * + (s⁻¹ * ((1 - s)⁻¹ * (s * (1 - s)))) := by + ring + _ ≤ centeredHessianFrontEnvelope d C * s⁻¹ := by + exact mul_le_mul_of_nonneg_left + (two_endpoint_inv_mul_self_one_sub_le_inv hs hs1) henv_nonneg + +private theorem inv_one_sub_rpow_three_neg_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ 5 * s⁻¹ := by + have h := old_inv_geometricDiscount_le_five_inv + (s := s) (p := 1) hs hs_le (by norm_num : (1 : ℝ) ≤ 1) + simpa [Homogenization.geometricDiscount] using h + +private theorem triple_endpoint_inv_mul_self_one_sub_eq_inv {s : ℝ} + (hs : 0 < s) (hs1 : s < 1) : + s⁻¹ * (s⁻¹ * ((1 - s)⁻¹ * (s * (1 - s)))) = s⁻¹ := by + have hs_ne : s ≠ 0 := hs.ne' + have hs1_pos : 0 < 1 - s := by linarith + have hs1_ne : 1 - s ≠ 0 := hs1_pos.ne' + field_simp [hs_ne, hs1_ne] + +private noncomputable def centeredGradientFrontEnvelope + (d : ℕ) (C : ℝ) : ℝ := + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + ((5 : ℝ) * + (2 * ((((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (5 : ℝ)) * (5 : ℝ)))) * + (2 * quantitativeCubeCutoffGradientConst d) + +private theorem centeredGradientFront_le_envelope_mul_endpoint_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliCenteredBesovGradientFront d s C ≤ + centeredGradientFrontEnvelope d C * + (s⁻¹ * (s⁻¹ * (1 - s)⁻¹)) := by + have hs_le : s ≤ 1 := le_of_lt hs1 + have hdisc_s_inv : + (Homogenization.geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + old_inv_geometricDiscount_le_five_inv hs hs_le (by norm_num : (1 : ℝ) ≤ 1) + have hgeom_inv : + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ 5 * s⁻¹ := + inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have hdisc_sub_inv : + (Homogenization.geometricDiscount (1 - s) 1)⁻¹ ≤ 5 * (1 - s)⁻¹ := + old_inv_geometricDiscount_le_five_inv + (by linarith : 0 < 1 - s) (by linarith : 1 - s ≤ 1) + (by norm_num : (1 : ℝ) ≤ 1) + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + rpow_three_d_add_s_le_d_add_one d hs_le + have hnote_nonneg : + 0 ≤ (3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact mul_nonneg (mul_nonneg (by norm_num) hC) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hdisc_s_pos : 0 < Homogenization.geometricDiscount s 1 := by + exact Homogenization.geometricDiscount_pos (by simpa using hs) + have hdisc_sub_pos : 0 < Homogenization.geometricDiscount (1 - s) 1 := by + exact Homogenization.geometricDiscount_pos + (by nlinarith : 0 < (1 - s) * 1) + have hgeom_pos : 0 < 1 - Real.rpow (3 : ℝ) (-s) := by + simpa [Homogenization.geometricDiscount] using hdisc_s_pos + have hcut_nonneg : 0 ≤ 2 * quantitativeCubeCutoffGradientConst d := by + exact mul_nonneg (by norm_num) + (quantitativeCubeCutoffGradientConst_nonneg d) + have hprefix_large_nonneg : + 0 ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hprefix_s_nonneg : + 0 ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * (5 * s⁻¹) := + mul_nonneg hprefix_large_nonneg + (mul_nonneg (by norm_num) (inv_nonneg.mpr hs.le)) + unfold coarseCaccioppoliCenteredBesovGradientFront + coarseCaccioppoliCenteredBesovGradientBase centeredGradientFrontEnvelope + calc + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (Homogenization.geometricDiscount s 1)⁻¹ * + (2 * + ((((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + (Homogenization.geometricDiscount (1 - s) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) + ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + (5 * s⁻¹) * + (2 * + ((((3 / 2 : ℝ) * C * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (5 * s⁻¹)) * + (5 * (1 - s)⁻¹))) * + (2 * quantitativeCubeCutoffGradientConst d) := by + gcongr + _ = + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * + ((5 : ℝ) * + (2 * ((((3 / 2 : ℝ) * C * + Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (5 : ℝ)) * (5 : ℝ)))) * + (2 * quantitativeCubeCutoffGradientConst d)) * + (s⁻¹ * (s⁻¹ * (1 - s)⁻¹)) := by + ring_nf + +private theorem centeredGradientFront_mul_den_le_envelope_mul_inv + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliCenteredBesovGradientFront d s C * (s * (1 - s)) ≤ + centeredGradientFrontEnvelope d C * s⁻¹ := by + have hden_nonneg : 0 ≤ s * (1 - s) := by + exact mul_nonneg hs.le (by linarith) + have hfront := + centeredGradientFront_le_envelope_mul_endpoint_inv d hC hs hs1 + have hscaled := + mul_le_mul_of_nonneg_right hfront hden_nonneg + calc + coarseCaccioppoliCenteredBesovGradientFront d s C * (s * (1 - s)) + ≤ + (centeredGradientFrontEnvelope d C * + (s⁻¹ * (s⁻¹ * (1 - s)⁻¹))) * + (s * (1 - s)) := hscaled + _ = + centeredGradientFrontEnvelope d C * + (s⁻¹ * (s⁻¹ * ((1 - s)⁻¹ * (s * (1 - s))))) := by + ring + _ = + centeredGradientFrontEnvelope d C * s⁻¹ := by + rw [triple_endpoint_inv_mul_self_one_sub_eq_inv hs hs1] + +noncomputable def boundaryScaleZeroAlphaBudgetEnvelope + (d : ℕ) [NeZero d] : ℝ := + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Ceff : ℝ := coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q0 Csol + max 1 ((81 : ℝ) * + (6 * centeredAverageFrontEnvelope d Ceff + + 12 * centeredHessianFrontEnvelope d Ceff + + 6 * centeredGradientFrontEnvelope d Ceff)) + +private theorem localPatchBufferedCeffLocalBudget_unit_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ + coarseCaccioppoliLocalPatchBufferedCeffLocalBudget (originCube d 0) + (fullVectorPoincareCubeConstant (originCube d 0)) := by + unfold coarseCaccioppoliLocalPatchBufferedCeffLocalBudget + exact mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) + (localPatchBufferedLocalBudget_unit_nonneg d) + +private theorem localPatchBufferedAlphaBudgetUnit_le_envelope_mul_inv + {d : ℕ} [NeZero d] {s : ℝ} (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s ≤ + boundaryScaleZeroAlphaBudgetEnvelope d * s⁻¹ := by + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Ceff : ℝ := coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q0 Csol + let A : ℝ := coarseCaccioppoliCenteredAverageFront d s Ceff + let H : ℝ := coarseCaccioppoliCenteredBesovHessianFront d s Ceff + let G : ℝ := coarseCaccioppoliCenteredBesovGradientFront d s Ceff + let Aenv : ℝ := centeredAverageFrontEnvelope d Ceff + let Henv : ℝ := centeredHessianFrontEnvelope d Ceff + let Genv : ℝ := centeredGradientFrontEnvelope d Ceff + let den : ℝ := s * (1 - s) + let K : ℝ := (81 : ℝ) * (6 * Aenv + 12 * Henv + 6 * Genv) + let Env : ℝ := boundaryScaleZeroAlphaBudgetEnvelope d + have hs_le : s ≤ 1 := le_of_lt hs1 + have hCeff_nonneg : 0 ≤ Ceff := by + dsimp [Ceff, Csol, Q0] + exact localPatchBufferedCeffLocalBudget_unit_nonneg d + have hAden : A * den ≤ Aenv * s⁻¹ := by + dsimp [A, Aenv, den] + exact centeredAverageFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hHden : H * den ≤ Henv * s⁻¹ := by + dsimp [H, Henv, den] + exact centeredHessianFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hGden : G * den ≤ Genv * s⁻¹ := by + dsimp [G, Genv, den] + exact centeredGradientFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hsum_den : + (6 * A + 12 * H + 6 * G) * den ≤ + (6 * Aenv + 12 * Henv + 6 * Genv) * s⁻¹ := by + calc + (6 * A + 12 * H + 6 * G) * den = + 6 * (A * den) + 12 * (H * den) + 6 * (G * den) := by ring + _ ≤ 6 * (Aenv * s⁻¹) + 12 * (Henv * s⁻¹) + + 6 * (Genv * s⁻¹) := by + nlinarith + _ = (6 * Aenv + 12 * Henv + 6 * Genv) * s⁻¹ := by ring + have hfront : + ((81 : ℝ) * (6 * A + 12 * H + 6 * G)) * den ≤ K * s⁻¹ := by + dsimp [K] + calc + ((81 : ℝ) * (6 * A + 12 * H + 6 * G)) * den = + 81 * ((6 * A + 12 * H + 6 * G) * den) := by ring + _ ≤ 81 * ((6 * Aenv + 12 * Henv + 6 * Genv) * s⁻¹) := by + exact mul_le_mul_of_nonneg_left hsum_den (by norm_num) + _ = ((81 : ℝ) * (6 * Aenv + 12 * Henv + 6 * Genv)) * s⁻¹ := by ring + have hEnv_eq : Env = max 1 K := by + dsimp [Env, boundaryScaleZeroAlphaBudgetEnvelope, K, Q0, Csol, Ceff, + Aenv, Henv, Genv] + have hEnv_ge_one : 1 ≤ Env := by + rw [hEnv_eq] + exact le_max_left _ _ + have hEnv_ge_K : K ≤ Env := by + rw [hEnv_eq] + exact le_max_right _ _ + have hEnv_nonneg : 0 ≤ Env := by linarith + have hone_le_inv : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hone_le_Env_mul_inv : 1 ≤ Env * s⁻¹ := by + calc + 1 ≤ Env := hEnv_ge_one + _ = Env * 1 := by ring + _ ≤ Env * s⁻¹ := mul_le_mul_of_nonneg_left hone_le_inv hEnv_nonneg + have hfront_le_Env : ((81 : ℝ) * (6 * A + 12 * H + 6 * G)) * den ≤ + Env * s⁻¹ := by + exact hfront.trans (mul_le_mul_of_nonneg_right hEnv_ge_K (inv_nonneg.mpr hs.le)) + unfold coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit + coarseCaccioppoliLocalPatchBufferedAlphaBudget + coarseCaccioppoliLocalPatchBufferedCenteredFrontBudget + dsimp [Q0, Csol, Ceff, A, H, G, den, Env] + exact max_le hone_le_Env_mul_inv hfront_le_Env + +noncomputable def interiorScaleZeroAlphaBudgetEnvelope + (d : ℕ) [NeZero d] : ℝ := + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Ceff : ℝ := coarseCaccioppoliBufferedCeffLocalBudget Q0 Csol + max 1 ((81 : ℝ) * + (2 * centeredAverageFrontEnvelope d Ceff + + 4 * centeredHessianFrontEnvelope d Ceff + + 2 * centeredGradientFrontEnvelope d Ceff)) + +private theorem bufferedCeffLocalBudget_unit_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ + coarseCaccioppoliBufferedCeffLocalBudget (originCube d 0) + (fullVectorPoincareCubeConstant (originCube d 0)) := by + unfold coarseCaccioppoliBufferedCeffLocalBudget + exact mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) + (bufferedLocalBudget_unit_nonneg d) + +private theorem bufferedAlphaBudgetUnit_le_envelope_mul_inv + {d : ℕ} [NeZero d] {s : ℝ} (hs : 0 < s) (hs1 : s < 1) : + coarseCaccioppoliBufferedAlphaBudgetUnit d s ≤ + interiorScaleZeroAlphaBudgetEnvelope d * s⁻¹ := by + let Q0 : TriadicCube d := originCube d 0 + let Csol : ℝ := fullVectorPoincareCubeConstant Q0 + let Ceff : ℝ := coarseCaccioppoliBufferedCeffLocalBudget Q0 Csol + let A : ℝ := coarseCaccioppoliCenteredAverageFront d s Ceff + let H : ℝ := coarseCaccioppoliCenteredBesovHessianFront d s Ceff + let G : ℝ := coarseCaccioppoliCenteredBesovGradientFront d s Ceff + let Aenv : ℝ := centeredAverageFrontEnvelope d Ceff + let Henv : ℝ := centeredHessianFrontEnvelope d Ceff + let Genv : ℝ := centeredGradientFrontEnvelope d Ceff + let den : ℝ := s * (1 - s) + let K : ℝ := (81 : ℝ) * (2 * Aenv + 4 * Henv + 2 * Genv) + let Env : ℝ := interiorScaleZeroAlphaBudgetEnvelope d + have hs_le : s ≤ 1 := le_of_lt hs1 + have hCeff_nonneg : 0 ≤ Ceff := by + dsimp [Ceff, Csol, Q0] + exact bufferedCeffLocalBudget_unit_nonneg d + have hAden : A * den ≤ Aenv * s⁻¹ := by + dsimp [A, Aenv, den] + exact centeredAverageFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hHden : H * den ≤ Henv * s⁻¹ := by + dsimp [H, Henv, den] + exact centeredHessianFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hGden : G * den ≤ Genv * s⁻¹ := by + dsimp [G, Genv, den] + exact centeredGradientFront_mul_den_le_envelope_mul_inv d hCeff_nonneg hs hs1 + have hsum_den : + (2 * A + 4 * H + 2 * G) * den ≤ + (2 * Aenv + 4 * Henv + 2 * Genv) * s⁻¹ := by + calc + (2 * A + 4 * H + 2 * G) * den = + 2 * (A * den) + 4 * (H * den) + 2 * (G * den) := by ring + _ ≤ 2 * (Aenv * s⁻¹) + 4 * (Henv * s⁻¹) + + 2 * (Genv * s⁻¹) := by + nlinarith + _ = (2 * Aenv + 4 * Henv + 2 * Genv) * s⁻¹ := by ring + have hfront : + ((81 : ℝ) * (2 * A + 4 * H + 2 * G)) * den ≤ K * s⁻¹ := by + dsimp [K] + calc + ((81 : ℝ) * (2 * A + 4 * H + 2 * G)) * den = + 81 * ((2 * A + 4 * H + 2 * G) * den) := by ring + _ ≤ 81 * ((2 * Aenv + 4 * Henv + 2 * Genv) * s⁻¹) := by + exact mul_le_mul_of_nonneg_left hsum_den (by norm_num) + _ = ((81 : ℝ) * (2 * Aenv + 4 * Henv + 2 * Genv)) * s⁻¹ := by ring + have hEnv_eq : Env = max 1 K := by + dsimp [Env, interiorScaleZeroAlphaBudgetEnvelope, K, Q0, Csol, Ceff, + Aenv, Henv, Genv] + have hEnv_ge_one : 1 ≤ Env := by + rw [hEnv_eq] + exact le_max_left _ _ + have hEnv_ge_K : K ≤ Env := by + rw [hEnv_eq] + exact le_max_right _ _ + have hEnv_nonneg : 0 ≤ Env := by linarith + have hone_le_inv : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hone_le_Env_mul_inv : 1 ≤ Env * s⁻¹ := by + calc + 1 ≤ Env := hEnv_ge_one + _ = Env * 1 := by ring + _ ≤ Env * s⁻¹ := mul_le_mul_of_nonneg_left hone_le_inv hEnv_nonneg + have hfront_le_Env : ((81 : ℝ) * (2 * A + 4 * H + 2 * G)) * den ≤ + Env * s⁻¹ := by + exact hfront.trans (mul_le_mul_of_nonneg_right hEnv_ge_K (inv_nonneg.mpr hs.le)) + unfold coarseCaccioppoliBufferedAlphaBudgetUnit + coarseCaccioppoliBufferedAlphaBudget + coarseCaccioppoliBufferedCenteredFrontBudget + dsimp [Q0, Csol, Ceff, A, H, G, den, Env] + exact max_le hone_le_Env_mul_inv hfront_le_Env + +noncomputable def boundaryScaleZeroAlphaInternalEnvelope + (d : ℕ) [NeZero d] : ℝ := + (Fintype.card (Fin d) : ℝ) * boundaryScaleZeroAlphaBudgetEnvelope d + +noncomputable def interiorScaleZeroAlphaInternalEnvelope + (d : ℕ) [NeZero d] : ℝ := + (Fintype.card (Fin d) : ℝ) * interiorScaleZeroAlphaBudgetEnvelope d + +noncomputable def boundaryScaleZeroCrossInternalEnvelope + (d : ℕ) [NeZero d] : ℝ := + (Fintype.card (Fin d) : ℝ) * boundaryScaleZeroCrossBudgetEnvelope d + +noncomputable def interiorScaleZeroCrossInternalEnvelope + (d : ℕ) [NeZero d] : ℝ := + (Fintype.card (Fin d) : ℝ) * interiorScaleZeroCrossBudgetEnvelope d + +private theorem boundaryScaleZeroAlphaInternal_le_envelope_mul_inv + {d : ℕ} [NeZero d] {s : ℝ} (hs : 0 < s) (hs1 : s < 1) : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s ≤ + boundaryScaleZeroAlphaInternalEnvelope d * s⁻¹ := by + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have h := + mul_le_mul_of_nonneg_left + (localPatchBufferedAlphaBudgetUnit_le_envelope_mul_inv (d := d) hs hs1) + hcard_nonneg + unfold boundaryScaleZeroAlphaInternalEnvelope + simpa [mul_assoc] using h + +private theorem interiorScaleZeroAlphaInternal_le_envelope_mul_inv + {d : ℕ} [NeZero d] {s : ℝ} (hs : 0 < s) (hs1 : s < 1) : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s ≤ + interiorScaleZeroAlphaInternalEnvelope d * s⁻¹ := by + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have h := + mul_le_mul_of_nonneg_left + (bufferedAlphaBudgetUnit_le_envelope_mul_inv (d := d) hs hs1) + hcard_nonneg + unfold interiorScaleZeroAlphaInternalEnvelope + simpa [mul_assoc] using h + +private theorem boundaryScaleZeroCrossInternal_le_envelope + {d : ℕ} [NeZero d] {s : ℝ} (hs_le : s ≤ 1) : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s ≤ + boundaryScaleZeroCrossInternalEnvelope d := by + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have h := + mul_le_mul_of_nonneg_left + (localPatchBufferedCrossBudgetUnit_le_envelope (d := d) hs_le) + hcard_nonneg + unfold boundaryScaleZeroCrossInternalEnvelope + exact h + +private theorem interiorScaleZeroCrossInternal_le_envelope + {d : ℕ} [NeZero d] {s : ℝ} (hs_le : s ≤ 1) : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s ≤ + interiorScaleZeroCrossInternalEnvelope d := by + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have h := + mul_le_mul_of_nonneg_left + (bufferedCrossBudgetUnit_le_envelope (d := d) hs_le) + hcard_nonneg + unfold interiorScaleZeroCrossInternalEnvelope + exact h + +private theorem localPatchBufferedAlphaBudgetUnit_nonneg + (d : ℕ) [NeZero d] (s : ℝ) : + 0 ≤ coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s := by + unfold coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit + coarseCaccioppoliLocalPatchBufferedAlphaBudget + exact le_trans (by norm_num : (0 : ℝ) ≤ 1) (le_max_left _ _) + +private theorem bufferedAlphaBudgetUnit_nonneg + (d : ℕ) [NeZero d] (s : ℝ) : + 0 ≤ coarseCaccioppoliBufferedAlphaBudgetUnit d s := by + unfold coarseCaccioppoliBufferedAlphaBudgetUnit + coarseCaccioppoliBufferedAlphaBudget + exact le_trans (by norm_num : (0 : ℝ) ≤ 1) (le_max_left _ _) + +private theorem localPatchBufferedCrossBudgetUnit_nonneg + (d : ℕ) [NeZero d] (s : ℝ) : + 0 ≤ coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s := by + unfold coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit + coarseCaccioppoliLocalPatchBufferedCrossBudget + exact le_trans (by norm_num : (0 : ℝ) ≤ 1) (le_max_left _ _) + +private theorem bufferedCrossBudgetUnit_nonneg + (d : ℕ) [NeZero d] (s : ℝ) : + 0 ≤ coarseCaccioppoliBufferedCrossBudgetUnit d s := by + unfold coarseCaccioppoliBufferedCrossBudgetUnit + coarseCaccioppoliBufferedCrossBudget + exact le_trans (by norm_num : (0 : ℝ) ≤ 1) (le_max_left _ _) + +/-- Explicit scale-zero boundary constant produced by the completed +deterministic Caccioppoli bridge with the standard beta-dependent radius +iteration. This still depends on the exponents `s,t`; the remaining scalar +majorization step is to bound it by one dimension-only constant on `0 < s`, +`0 < t`, `s + t < 1`. -/ +noncomputable def boundaryCaccioppoliScaleZeroExplicitConstant + (d : ℕ) [NeZero d] (s t : ℝ) : ℝ := + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s + (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t CalphaInternal CcrossInternal + +/-- Explicit scale-zero centered-interior constant produced by the completed +split deterministic Caccioppoli bridge with the standard beta-dependent radius +iteration. -/ +noncomputable def interiorCaccioppoliScaleZeroExplicitConstant + (d : ℕ) [NeZero d] (s t : ℝ) : ℝ := + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s + (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t CalphaInternal CcrossInternal + +theorem boundaryCaccioppoliScaleZeroExplicitConstant_le_envelopeExplicit + {d : ℕ} [NeZero d] {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + boundaryCaccioppoliScaleZeroExplicitConstant d s t ≤ + (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t + (boundaryScaleZeroAlphaInternalEnvelope d * s⁻¹) + (boundaryScaleZeroCrossInternalEnvelope d) := by + have hs1 : s < 1 := by linarith + have hs_le : s ≤ 1 := le_of_lt hs1 + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCalpha_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s := + mul_nonneg hcard_nonneg (localPatchBufferedAlphaBudgetUnit_nonneg d s) + have hCcross_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s := + mul_nonneg hcard_nonneg (localPatchBufferedCrossBudgetUnit_nonneg d s) + have hCalpha_le : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s ≤ + boundaryScaleZeroAlphaInternalEnvelope d * s⁻¹ := + boundaryScaleZeroAlphaInternal_le_envelope_mul_inv (d := d) hs hs1 + have hCcross_le : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s ≤ + boundaryScaleZeroCrossInternalEnvelope d := + boundaryScaleZeroCrossInternal_le_envelope (d := d) hs_le + have hnote := + caccioppoliStandardExplicitNoteBoundSplit_mono + (s := s) (t := t) + (Calpha₁ := (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s) + (Calpha₂ := boundaryScaleZeroAlphaInternalEnvelope d * s⁻¹) + (Ccross₁ := (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s) + (Ccross₂ := boundaryScaleZeroCrossInternalEnvelope d) + hs ht hst hCalpha_nonneg hCalpha_le hCcross_nonneg hCcross_le + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + unfold boundaryCaccioppoliScaleZeroExplicitConstant + exact mul_le_mul_of_nonneg_left hnote hfactor_nonneg + +theorem interiorCaccioppoliScaleZeroExplicitConstant_le_envelopeExplicit + {d : ℕ} [NeZero d] {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + interiorCaccioppoliScaleZeroExplicitConstant d s t ≤ + (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t + (interiorScaleZeroAlphaInternalEnvelope d * s⁻¹) + (interiorScaleZeroCrossInternalEnvelope d) := by + have hs1 : s < 1 := by linarith + have hs_le : s ≤ 1 := le_of_lt hs1 + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCalpha_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s := + mul_nonneg hcard_nonneg (bufferedAlphaBudgetUnit_nonneg d s) + have hCcross_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s := + mul_nonneg hcard_nonneg (bufferedCrossBudgetUnit_nonneg d s) + have hCalpha_le : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s ≤ + interiorScaleZeroAlphaInternalEnvelope d * s⁻¹ := + interiorScaleZeroAlphaInternal_le_envelope_mul_inv (d := d) hs hs1 + have hCcross_le : + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s ≤ + interiorScaleZeroCrossInternalEnvelope d := + interiorScaleZeroCrossInternal_le_envelope (d := d) hs_le + have hnote := + caccioppoliStandardExplicitNoteBoundSplit_mono + (s := s) (t := t) + (Calpha₁ := (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s) + (Calpha₂ := interiorScaleZeroAlphaInternalEnvelope d * s⁻¹) + (Ccross₁ := (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s) + (Ccross₂ := interiorScaleZeroCrossInternalEnvelope d) + hs ht hst hCalpha_nonneg hCalpha_le hCcross_nonneg hCcross_le + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + unfold interiorCaccioppoliScaleZeroExplicitConstant + exact mul_le_mul_of_nonneg_left hnote hfactor_nonneg + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroCore.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroCore.lean new file mode 100644 index 0000000000..b86e28fc67 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroCore.lean @@ -0,0 +1,585 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Endpoints + +/-! # Coarse Caccioppoli Scale Zero Core -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli core estimates + +This file contains the pointwise coefficient bridge, core-window geometry, +and normalized core-energy estimates used by the scale-zero Caccioppoli +proof. The theorem assembly remains in `CoarseCaccioppoliScaleZero.lean`. + +## Audit tag + +Claim: provide the pointwise-coefficient transport and unit-scale core-energy +geometry used by the scale-zero Caccioppoli bridge. + +Downstream target: `CoarseCaccioppoliScaleZeroBridge.lean`. This file should +remain core estimate infrastructure, not a public theorem-package surface. +-/ + +noncomputable section + +open scoped ENNReal + +abbrev pointwiseCoeffFor {d : ℕ} (Q : TriadicCube d) + (a : CoeffFamily d) : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + +theorem pointwiseCoeffFor_isEllipticFieldOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet Q) + (pointwiseCoeffFor Q a) := by + simpa [pointwiseCoeffFor] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn_cubeSet + Q (a.coeffOn Q) + +noncomputable def CubeSolution.toPointwiseAHarmonic {d : ℕ} + {Q : TriadicCube d} {a : CoeffFamily d} (u : CubeSolution Q a) : + AHarmonicFunction (pointwiseCoeffFor Q a) (openCubeSet Q) where + toH1 := u.toH1 + isHarmonic := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let A : CoeffField d := pointwiseCoeffFor Q a + have hA : + (a.coeffOn Q).toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] A := by + simpa [A, pointwiseCoeffFor, U, Ch02.cubeDomain] using + (Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U (a.coeffOn Q)).symm + exact IsAHarmonicGradient.of_ae_eq_coeff hA u.isHarmonic + +noncomputable def BoundaryCaccioppoliDatum.toPointwiseAHarmonic + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} {x : Vec d} + (u : BoundaryCaccioppoliDatum Q a x) : + AHarmonicFunction (pointwiseCoeffFor Q a) (openCubeSet Q) where + toH1 := u.toH1 + isHarmonic := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let A : CoeffField d := pointwiseCoeffFor Q a + have hA : + (a.coeffOn Q).toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] A := by + simpa [A, pointwiseCoeffFor, U, Ch02.cubeDomain] using + (Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U (a.coeffOn Q)).symm + exact IsAHarmonicGradient.of_ae_eq_coeff hA u.isHarmonic + +theorem coarseCaccioppoliLocalOpenCube_one_eq_openCubeAtScale + {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + coarseCaccioppoliLocalOpenCube Q x 1 = + openCubeAtScale x (Q.scale - 1) := by + ext y + constructor + · intro hy i + have hrad : + coarseCaccioppoliLocalPatchRadius Q 1 = + Real.rpow (3 : ℝ) (((Q.scale - 1 : ℤ) : ℝ)) / 2 := by + calc + coarseCaccioppoliLocalPatchRadius Q 1 = + (3 : ℝ) ^ (Q.scale - 1) / 2 := by + unfold coarseCaccioppoliLocalPatchRadius cubeRadius cubeScaleFactor + rw [zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0)] + norm_num + ring + _ = Real.rpow (3 : ℝ) (((Q.scale - 1 : ℤ) : ℝ)) / 2 := + congrArg (fun r : ℝ => r / 2) + (Real.rpow_intCast (3 : ℝ) (Q.scale - 1)).symm + simpa [openCubeAtScale, coarseCaccioppoliLocalOpenCube, hrad] using hy i + · intro hy i + have hrad : + coarseCaccioppoliLocalPatchRadius Q 1 = + Real.rpow (3 : ℝ) (((Q.scale - 1 : ℤ) : ℝ)) / 2 := by + calc + coarseCaccioppoliLocalPatchRadius Q 1 = + (3 : ℝ) ^ (Q.scale - 1) / 2 := by + unfold coarseCaccioppoliLocalPatchRadius cubeRadius cubeScaleFactor + rw [zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0)] + norm_num + ring + _ = Real.rpow (3 : ℝ) (((Q.scale - 1 : ℤ) : ℝ)) / 2 := + congrArg (fun r : ℝ => r / 2) + (Real.rpow_intCast (3 : ℝ) (Q.scale - 1)).symm + simpa [openCubeAtScale, coarseCaccioppoliLocalOpenCube, hrad] using hy i + +private theorem coarseCaccioppoliLocalPatchRadius_one_third_eq + {d : ℕ} (Q : TriadicCube d) : + coarseCaccioppoliLocalPatchRadius Q ((3 : ℝ)⁻¹) = + Real.rpow (3 : ℝ) (((Q.scale - 2 : ℤ) : ℝ)) / 2 := by + calc + coarseCaccioppoliLocalPatchRadius Q ((3 : ℝ)⁻¹) = + (3 : ℝ) ^ (Q.scale - 2) / 2 := by + unfold coarseCaccioppoliLocalPatchRadius cubeRadius cubeScaleFactor + rw [zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0)] + norm_num + ring + _ = Real.rpow (3 : ℝ) (((Q.scale - 2 : ℤ) : ℝ)) / 2 := + congrArg (fun r : ℝ => r / 2) + (Real.rpow_intCast (3 : ℝ) (Q.scale - 2)).symm + +private theorem coarseCaccioppoliLocalOpenCube_one_third_eq_openCubeAtScale + {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + coarseCaccioppoliLocalOpenCube Q x ((3 : ℝ)⁻¹) = + openCubeAtScale x (Q.scale - 2) := by + ext y + constructor + · intro hy i + have hrad := coarseCaccioppoliLocalPatchRadius_one_third_eq Q + simpa [openCubeAtScale, coarseCaccioppoliLocalOpenCube, hrad] using hy i + · intro hy i + have hrad := coarseCaccioppoliLocalPatchRadius_one_third_eq Q + simpa [openCubeAtScale, coarseCaccioppoliLocalOpenCube, hrad] using hy i + +theorem caccioppoliCoreSet_subset_cubeSet + {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + caccioppoliCoreSet Q x ⊆ cubeSet Q := by + intro y hy i + exact ⟨le_of_lt (hy.1 i).1, (hy.1 i).2⟩ + +private theorem caccioppoliCoreSet_subset_localClosedCube_one_third + {d : ℕ} (Q : TriadicCube d) (x : Vec d) : + caccioppoliCoreSet Q x ⊆ + coarseCaccioppoliLocalClosedCube Q x ((3 : ℝ)⁻¹) := by + intro y hy + have hlocalOpen : + y ∈ coarseCaccioppoliLocalOpenCube Q x ((3 : ℝ)⁻¹) := by + have hset := coarseCaccioppoliLocalOpenCube_one_third_eq_openCubeAtScale Q x + rw [hset] + exact hy.2 + exact coarseCaccioppoliLocalOpenCube_subset_closedCube Q x ((3 : ℝ)⁻¹) hlocalOpen + +theorem coreOpenCubeRadius_eq_scaleFactor_div_eighteen + {d : ℕ} (Q : TriadicCube d) : + Real.rpow (3 : ℝ) (((Q.scale - 2 : ℤ) : ℝ)) / 2 = + cubeScaleFactor Q / 18 := by + calc + Real.rpow (3 : ℝ) (((Q.scale - 2 : ℤ) : ℝ)) / 2 = + (3 : ℝ) ^ (Q.scale - 2) / 2 := by + exact congrArg (fun r : ℝ => r / 2) + (Real.rpow_intCast (3 : ℝ) (Q.scale - 2)) + _ = cubeScaleFactor Q / 18 := by + unfold cubeScaleFactor + rw [zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0)] + norm_num + ring + +theorem volume_caccioppoliCoreSet_toReal_ge_scaleFactor_div_eighteen_pow + {d : ℕ} (Q : TriadicCube d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + (cubeScaleFactor Q / 18) ^ d ≤ + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal := by + classical + let r : ℝ := Real.rpow (3 : ℝ) (((Q.scale - 2 : ℤ) : ℝ)) / 2 + let lo : Fin d → ℝ := fun i => + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) ⊔ (x i - r)) + let hi : Fin d → ℝ := fun i => + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) ⊓ (x i + r)) + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hr_eq : r = cubeScaleFactor Q / 18 := by + simpa [r] using coreOpenCubeRadius_eq_scaleFactor_div_eighteen Q + have hr_pos : 0 < r := by + rw [hr_eq] + positivity + have hcore_eq : + caccioppoliCoreSet Q x = + Set.pi Set.univ (fun i : Fin d => Set.Ioo (lo i) (hi i)) := by + rw [caccioppoliCoreSet, openCubeSet_eq_pi_Ioo, + openCubeAtScale_eq_pi_Ioo, ← Set.pi_inter_distrib] + apply Set.pi_congr rfl + intro i _ + simp [lo, hi, r, Set.Ioo_inter_Ioo] + have hside : ∀ i : Fin d, cubeScaleFactor Q / 18 ≤ hi i - lo i := by + intro i + let A : ℝ := (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + let B : ℝ := (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + have hx_i : A < x i ∧ x i < B := by + simpa [A, B, openCubeSet] using hx i + have hBA : B - A = cubeScaleFactor Q := by + dsimp [A, B] + ring + have hA_le_B_sub_r : A ≤ B - r := by + rw [hr_eq] + nlinarith [hBA, hscale_pos] + have hx_sub_r_le_B_sub_r : x i - r ≤ B - r := by + linarith [le_of_lt hx_i.2] + have hsup_le_B_sub_r : A ⊔ (x i - r) ≤ B - r := + sup_le hA_le_B_sub_r hx_sub_r_le_B_sub_r + have hsup_le_x : A ⊔ (x i - r) ≤ x i := by + apply sup_le + · exact le_of_lt hx_i.1 + · linarith [le_of_lt hr_pos] + have hsup_add_le_inf : A ⊔ (x i - r) + r ≤ B ⊓ (x i + r) := by + apply le_inf + · linarith [hsup_le_B_sub_r] + · linarith [hsup_le_x] + have hcoord : + hi i - lo i = (B ⊓ (x i + r)) - (A ⊔ (x i - r)) := by + simp [hi, lo, A, B] + rw [hcoord, ← hr_eq] + linarith + have hab : lo ≤ hi := by + intro i + have h := hside i + nlinarith [hscale_pos] + rw [hcore_eq] + have hvol : + (MeasureTheory.volume + (Set.pi Set.univ (fun i : Fin d => Set.Ioo (lo i) (hi i)))).toReal = + ∏ i : Fin d, (hi i - lo i) := + Real.volume_pi_Ioo_toReal (ι := Fin d) hab + calc + (cubeScaleFactor Q / 18) ^ d = + ∏ _i : Fin d, cubeScaleFactor Q / 18 := by + simp only [Finset.prod_const, Finset.card_univ, Fintype.card_fin] + _ ≤ ∏ i : Fin d, (hi i - lo i) := by + apply Finset.prod_le_prod + · intro i _ + exact le_of_lt (div_pos hscale_pos (by norm_num)) + · intro i _ + exact hside i + _ = + (MeasureTheory.volume + (Set.pi Set.univ (fun i : Fin d => Set.Ioo (lo i) (hi i)))).toReal := by + rw [hvol] + +theorem caccioppoliCoreSet_volumeRatio_le_eighteen_pow + {d : ℕ} (Q : TriadicCube d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal)⁻¹ * + cubeVolume Q ≤ + (18 : ℝ) ^ d := by + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hbase_pos : 0 < cubeScaleFactor Q / 18 := by + positivity + have hlower : + (cubeScaleFactor Q / 18) ^ d ≤ + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal := + volume_caccioppoliCoreSet_toReal_ge_scaleFactor_div_eighteen_pow Q hx + have hlower_pos : 0 < (cubeScaleFactor Q / 18) ^ d := + pow_pos hbase_pos d + have hcore_volume_pos : + 0 < (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal := + lt_of_lt_of_le hlower_pos hlower + have hinv : + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal)⁻¹ ≤ + ((cubeScaleFactor Q / 18) ^ d)⁻¹ := + (inv_le_inv₀ hcore_volume_pos hlower_pos).2 hlower + calc + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal)⁻¹ * + cubeVolume Q ≤ + ((cubeScaleFactor Q / 18) ^ d)⁻¹ * cubeVolume Q := by + exact mul_le_mul_of_nonneg_right hinv (cubeVolume_nonneg Q) + _ = (18 : ℝ) ^ d := by + rw [cubeVolume_eq_scaleFactor_pow, div_pow] + field_simp [pow_ne_zero d hscale_pos.ne'] + +private theorem setIntegral_caccioppoliCoreSet_le_cubeVolume_mul_localEnergyRadiusProfile + {d : ℕ} (Q : TriadicCube d) (x : Vec d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume ≤ + cubeVolume Q * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + let localCube : Set (Vec d) := + coarseCaccioppoliLocalClosedCube Q x ((3 : ℝ)⁻¹) + have hlocal_int : + MeasureTheory.IntegrableOn (localCube.indicator energy) + (cubeSet Q) MeasureTheory.volume := by + simpa [localCube] using + integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q x ((3 : ℝ)⁻¹) henergy_int + have hlocal_nonneg : + 0 ≤ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + localCube.indicator energy := by + change ∀ᵐ y ∂MeasureTheory.volume.restrict (cubeSet Q), + 0 ≤ localCube.indicator energy y + rw [MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)] + exact Filter.Eventually.of_forall fun y hyQ => by + by_cases hylocal : y ∈ localCube + · simpa [Set.indicator_of_mem hylocal] using henergy_nonneg y hyQ + · simp [Set.indicator_of_notMem hylocal] + have hcore_sub_cube_ae : + caccioppoliCoreSet Q x ≤ᵐ[MeasureTheory.volume] cubeSet Q := + Filter.Eventually.of_forall fun y hy => + caccioppoliCoreSet_subset_cubeSet Q x hy + have hmono : + ∫ y in caccioppoliCoreSet Q x, localCube.indicator energy y ∂MeasureTheory.volume ≤ + ∫ y in cubeSet Q, localCube.indicator energy y ∂MeasureTheory.volume := + MeasureTheory.setIntegral_mono_set hlocal_int hlocal_nonneg hcore_sub_cube_ae + have hcore_eq : + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume = + ∫ y in caccioppoliCoreSet Q x, localCube.indicator energy y ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_caccioppoliCoreSet Q x) + intro y hy + simp [localCube, Set.indicator_of_mem + (caccioppoliCoreSet_subset_localClosedCube_one_third Q x hy)] + have hprofile_eq : + ∫ y in cubeSet Q, localCube.indicator energy y ∂MeasureTheory.volume = + cubeVolume Q * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + have hvol_ne : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + unfold coarseCaccioppoliLocalEnergyRadiusProfile + coarseCaccioppoliLocalEnergyProfile cubeAverage + simp only [localCube] + calc + ∫ y in cubeSet Q, + (coarseCaccioppoliLocalClosedCube Q x (3 : ℝ)⁻¹).indicator energy y + ∂MeasureTheory.volume = + 1 * + ∫ y in cubeSet Q, + (coarseCaccioppoliLocalClosedCube Q x (3 : ℝ)⁻¹).indicator energy y + ∂MeasureTheory.volume := by + ring + _ = + (cubeVolume Q * (cubeVolume Q)⁻¹) * + ∫ y in cubeSet Q, + (coarseCaccioppoliLocalClosedCube Q x (3 : ℝ)⁻¹).indicator energy y + ∂MeasureTheory.volume := by + rw [mul_inv_cancel₀ hvol_ne] + _ = + cubeVolume Q * + ((cubeVolume Q)⁻¹ * + ∫ y in cubeSet Q, + (coarseCaccioppoliLocalClosedCube Q x (3 : ℝ)⁻¹).indicator energy y + ∂MeasureTheory.volume) := by + ring + calc + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume = + ∫ y in caccioppoliCoreSet Q x, localCube.indicator energy y + ∂MeasureTheory.volume := hcore_eq + _ ≤ ∫ y in cubeSet Q, localCube.indicator energy y ∂MeasureTheory.volume := hmono + _ = + cubeVolume Q * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := + hprofile_eq + +private theorem normalizedSetAverage_caccioppoliCoreSet_le_eighteen_pow_mul_localEnergyRadiusProfile + {d : ℕ} (Q : TriadicCube d) {x : Vec d} {energy : Vec d → ℝ} + (hx : x ∈ openCubeSet Q) + (henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + normalizedSetAverage (caccioppoliCoreSet Q x) energy ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + have hraw := + setIntegral_caccioppoliCoreSet_le_cubeVolume_mul_localEnergyRadiusProfile + Q x henergy_nonneg henergy_int + have hratio := caccioppoliCoreSet_volumeRatio_le_eighteen_pow Q hx + have hprofile_nonneg : + 0 ≤ coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + simpa [coarseCaccioppoliLocalEnergyRadiusProfile] using + coarseCaccioppoliLocalEnergyProfile_nonneg Q x ((3 : ℝ)⁻¹) henergy_nonneg + unfold normalizedSetAverage + calc + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + ∫ y in caccioppoliCoreSet Q x, energy y ∂MeasureTheory.volume ≤ + (MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + (cubeVolume Q * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹)) := by + exact mul_le_mul_of_nonneg_left hraw + (inv_nonneg.mpr ENNReal.toReal_nonneg) + _ = + ((MeasureTheory.volume (caccioppoliCoreSet Q x)).toReal⁻¹ * + cubeVolume Q) * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + ring + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x energy ((3 : ℝ)⁻¹) := by + exact mul_le_mul_of_nonneg_right hratio hprofile_nonneg + +private theorem boundary_scalarEnergy_normalizedCore_le_eighteen_pow_mul_localEnergyRadiusProfile + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) + (hx : x ∈ openCubeSet Q) : + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := by + let A : CoeffField d := pointwiseCoeffFor Q a + let uPw : AHarmonicFunction A (openCubeSet Q) := u.toPointwiseAHarmonic + let energy : Vec d → ℝ := fun y => scalarVariationEnergyIntegrand A uPw y + have hctrl : + CoarseCaccioppoliFluxEnergyControls Q A (1 : ℝ) + (fun y => matVecMul (A y) (uPw.toCubeSet.toH1.grad y)) + (fun y => scalarVariationEnergyIntegrand A uPw.toCubeSet y) := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := A) (s := (1 : ℝ)) (by norm_num) + (pointwiseCoeffFor_isEllipticFieldOn_cubeSet Q a) uPw.toCubeSet + have henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y := by + intro y hy + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.1 y hy + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := by + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.2.1 + simpa [energy, A, uPw] using + normalizedSetAverage_caccioppoliCoreSet_le_eighteen_pow_mul_localEnergyRadiusProfile + Q hx henergy_nonneg henergy_int + +private theorem interior_scalarEnergy_normalizedCore_le_eighteen_pow_mul_localEnergyRadiusProfile + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : CubeSolution Q a) (hx : x ∈ openCubeSet Q) : + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := by + let A : CoeffField d := pointwiseCoeffFor Q a + let uPw : AHarmonicFunction A (openCubeSet Q) := u.toPointwiseAHarmonic + let energy : Vec d → ℝ := fun y => scalarVariationEnergyIntegrand A uPw y + have hctrl : + CoarseCaccioppoliFluxEnergyControls Q A (1 : ℝ) + (fun y => matVecMul (A y) (uPw.toCubeSet.toH1.grad y)) + (fun y => scalarVariationEnergyIntegrand A uPw.toCubeSet y) := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := A) (s := (1 : ℝ)) (by norm_num) + (pointwiseCoeffFor_isEllipticFieldOn_cubeSet Q a) uPw.toCubeSet + have henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y := by + intro y hy + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.1 y hy + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := by + simpa [energy, A, uPw, scalarVariationEnergyIntegrand] using hctrl.2.1 + simpa [energy, A, uPw] using + normalizedSetAverage_caccioppoliCoreSet_le_eighteen_pow_mul_localEnergyRadiusProfile + Q hx henergy_nonneg henergy_int + +private theorem boundaryCaccioppoliCoreEnergy_eq_normalizedSetAverage_scalarEnergy_pointwise + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) : + boundaryCaccioppoliCoreEnergy u = + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + have hAopen : + (a.coeffOn Q).toCoeffField + =ᵐ[MeasureTheory.volume.restrict (openCubeSet Q)] pointwiseCoeffFor Q a := by + simpa [pointwiseCoeffFor, U, Ch02.cubeDomain] using + (Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U (a.coeffOn Q)).symm + have hAcore : + (a.coeffOn Q).toCoeffField + =ᵐ[MeasureTheory.volume.restrict (caccioppoliCoreSet Q x)] + pointwiseCoeffFor Q a := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset + (fun y hy => hy.1) hAopen + unfold boundaryCaccioppoliCoreEnergy localizedCoeffEnergyValue normalizedSetAverage + volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae <| + hAcore.mono fun y hy => by + simp [scalarVariationEnergyIntegrand, hy, + BoundaryCaccioppoliDatum.toPointwiseAHarmonic] + +private theorem interiorCaccioppoliCoreEnergy_eq_normalizedSetAverage_scalarEnergy_pointwise + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : CubeSolution Q a) : + interiorCaccioppoliCoreEnergy Q a x u = + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + have hAopen : + (a.coeffOn Q).toCoeffField + =ᵐ[MeasureTheory.volume.restrict (openCubeSet Q)] pointwiseCoeffFor Q a := by + simpa [pointwiseCoeffFor, U, Ch02.cubeDomain] using + (Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U (a.coeffOn Q)).symm + have hAcore : + (a.coeffOn Q).toCoeffField + =ᵐ[MeasureTheory.volume.restrict (caccioppoliCoreSet Q x)] + pointwiseCoeffFor Q a := + MeasureTheory.ae_restrict_of_ae_restrict_of_subset + (fun y hy => hy.1) hAopen + unfold interiorCaccioppoliCoreEnergy localizedCoeffEnergyValue normalizedSetAverage + volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae <| + hAcore.mono fun y hy => by + simp [scalarVariationEnergyIntegrand, hy, CubeSolution.toPointwiseAHarmonic] + +theorem boundaryCaccioppoliCoreEnergy_le_eighteen_pow_mul_localEnergyRadiusProfile + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) + (hx : x ∈ openCubeSet Q) : + boundaryCaccioppoliCoreEnergy u ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := by + calc + boundaryCaccioppoliCoreEnergy u = + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) := + boundaryCaccioppoliCoreEnergy_eq_normalizedSetAverage_scalarEnergy_pointwise u + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := + boundary_scalarEnergy_normalizedCore_le_eighteen_pow_mul_localEnergyRadiusProfile + u hx + +theorem interiorCaccioppoliCoreEnergy_le_eighteen_pow_mul_localEnergyRadiusProfile + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : CubeSolution Q a) (hx : x ∈ openCubeSet Q) : + interiorCaccioppoliCoreEnergy Q a x u ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := by + calc + interiorCaccioppoliCoreEnergy Q a x u = + normalizedSetAverage (caccioppoliCoreSet Q x) + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) := + interiorCaccioppoliCoreEnergy_eq_normalizedSetAverage_scalarEnergy_pointwise u + _ ≤ + (18 : ℝ) ^ d * + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := + interior_scalarEnergy_normalizedCore_le_eighteen_pow_mul_localEnergyRadiusProfile + u hx + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS.lean new file mode 100644 index 0000000000..c30a29b7c6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS.lean @@ -0,0 +1,894 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScalarEnvelopes + +/-! # Coarse Caccioppoli Scale Zero RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli RHS bridge helpers + +This file contains the parent-energy conversions, deterministic note-RHS +translations, and scalar monotonicity helpers used by the scale-zero +Caccioppoli endpoint assembly. + +## Audit tag + +Claim: convert deterministic note RHS quantities at scale zero into the public +Chapter 3 RHS forms, including parent-energy and scalar monotonicity bridges. + +Downstream target: `CoarseCaccioppoliScaleZeroBridge.lean`. Keep this file to +RHS translations and avoid new public `*Theory` surfaces. +-/ + +noncomputable section + +open scoped ENNReal + +theorem boundary_localPatch_deterministic_note_from_public_standardExplicitBudgetSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + 0 ≤ Cnote ∧ + coarseCaccioppoliLocalEnergyRadiusProfile Q x + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic) := by + have hzero : + LocalizedZeroTraceFunctionOn (openCubeSet Q) + (coarseCaccioppoliLocalOpenCube Q x 1) u.toH1.toFun := by + simpa [Ch02.cubeDomain, coarseCaccioppoliLocalOpenCube_one_eq_openCubeAtScale Q x] + using u.zeroTraceOnBoundaryPatch + exact + coarseCaccioppoli_boundary_qone_standard_note_of_closedCubeEllipticity_of_localPatchBuffered_constantFamily_of_localizedZeroTraceOnLocalOpenCube_explicitBudgetSplit + (Q := Q) (center := x) (a := pointwiseCoeffFor Q a) (s := s) (t := t) + (u := u.toPointwiseAHarmonic) hzero hs ht hst + (pointwiseCoeffFor_isEllipticFieldOn_cubeSet Q a) + +theorem boundaryCaccioppoliParentL2Sq_eq_harmonicL2Sq_pointwise + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) : + boundaryCaccioppoliParentL2Sq u = + coarseCaccioppoliHarmonicL2Sq Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic := by + let A : CoeffField d := pointwiseCoeffFor Q a + let w : AHarmonicFunction A (openCubeSet Q) := u.toPointwiseAHarmonic + let f : Vec d → ℝ := fun y => w.toH1 y + have hf : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [f] using memLp_harmonicFunction_normalizedCubeMeasure Q A w + have hsq_integral : + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + have hmul := + setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q f hf + calc + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, f y * f y ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y hy + ring + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℝ) := hmul + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + rw [Real.rpow_two] + have hvol_ne : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + unfold boundaryCaccioppoliParentL2Sq normalizedL2SqOnSet normalizedSetAverage + coarseCaccioppoliHarmonicL2Sq + calc + (MeasureTheory.volume (openCubeSet Q)).toReal⁻¹ * + ∫ y in openCubeSet Q, u.toH1.toFun y ^ (2 : ℕ) ∂MeasureTheory.volume = + (cubeVolume Q)⁻¹ * + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume := by + simp [f, w, A, BoundaryCaccioppoliDatum.toPointwiseAHarmonic] + _ = + (cubeVolume Q)⁻¹ * + (cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ)) := by + rw [hsq_integral] + _ = (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + rw [← mul_assoc, inv_mul_cancel₀ hvol_ne, one_mul] + +theorem interiorCaccioppoliParentOscillationL2Sq_eq_harmonicL2Sq_pointwise_normalizeMeanZero + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q))] + (u : CubeSolution Q a) : + interiorCaccioppoliParentOscillationL2Sq Q a u = + coarseCaccioppoliHarmonicL2Sq Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic.normalizeMeanZero := by + let A : CoeffField d := pointwiseCoeffFor Q a + let w : AHarmonicFunction A (openCubeSet Q) := + u.toPointwiseAHarmonic.normalizeMeanZero + let f : Vec d → ℝ := fun y => w.toH1 y + have hf : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [f] using memLp_harmonicFunction_normalizedCubeMeasure Q A w + have havg : + integralAverage (openCubeSet Q) (fun y => u.toH1.toFun y) = + Ch01.Legacy.normalizedAverage Q u.toH1.toFun := by + simpa [Ch01.Legacy.normalizedAverage] using + (cubeAverage_eq_integralAverage_openCubeSet Q + (fun y => u.toH1.toFun y)).symm + have hf_pointwise : + ∀ y : Vec d, f y = + u.toH1.toFun y - Ch01.Legacy.normalizedAverage Q u.toH1.toFun := by + intro y + simp [f, w, A, CubeSolution.toPointwiseAHarmonic, havg] + have hsq_integral : + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + have hmul := + setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q f hf + calc + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, f y * f y ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y hy + ring + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℝ) := hmul + _ = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + rw [Real.rpow_two] + have hvol_ne : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + unfold interiorCaccioppoliParentOscillationL2Sq normalizedL2SqOnSet + normalizedSetAverage coarseCaccioppoliHarmonicL2Sq volumeAverage + calc + (MeasureTheory.volume (openCubeSet Q)).toReal⁻¹ * + ∫ y in openCubeSet Q, + (u.toH1.toFun y - Ch01.Legacy.normalizedAverage Q u.toH1.toFun) ^ (2 : ℕ) + ∂MeasureTheory.volume = + (cubeVolume Q)⁻¹ * + ∫ y in openCubeSet Q, f y ^ (2 : ℕ) ∂MeasureTheory.volume := by + simp [hf_pointwise, volume_openCubeSet_toReal] + _ = + (cubeVolume Q)⁻¹ * + (cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ)) := by + rw [hsq_integral] + _ = (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℕ) := by + rw [← mul_assoc, inv_mul_cancel₀ hvol_ne, one_mul] + _ = + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => u.toPointwiseAHarmonic.normalizeMeanZero.toH1 x)) ^ (2 : ℕ) := by + rfl + +private theorem coarseCaccioppoliLocalizedEnergyRadiusProfile_normalizeMeanZero_eq + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q))] + (u : CubeSolution Q a) (rho : ℝ) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic.normalizeMeanZero y) rho = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) rho := by + unfold coarseCaccioppoliLocalizedEnergyRadiusProfile + coarseCaccioppoliLocalizedEnergyProfile cubeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun y => by + simp [scalarVariationEnergyIntegrand] + +theorem coarseCaccioppoliLocalEnergyRadiusProfile_cubeCenter_one_third_le_localizedEnergyRadiusProfile + {d : ℕ} (Q : TriadicCube d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ y ∈ cubeSet Q, 0 ≤ energy y) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalEnergyRadiusProfile Q (cubeCenter Q) energy (1 / 3 : ℝ) ≤ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy (1 / 3 : ℝ) := by + have hsub : + coarseCaccioppoliLocalClosedCube Q (cubeCenter Q) (1 / 3 : ℝ) ⊆ + scaledClosedCubeSet Q (1 / 3 : ℝ) := by + intro y hy i + have hrad : + coarseCaccioppoliLocalPatchRadius Q (1 / 3 : ℝ) ≤ + (1 / 3 : ℝ) * cubeRadius Q := by + have hcr_nonneg : 0 ≤ cubeRadius Q := le_of_lt (cubeRadius_pos Q) + unfold coarseCaccioppoliLocalPatchRadius + nlinarith + exact le_trans (hy i) hrad + unfold coarseCaccioppoliLocalEnergyRadiusProfile + coarseCaccioppoliLocalEnergyProfile + coarseCaccioppoliLocalizedEnergyRadiusProfile + coarseCaccioppoliLocalizedEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q + (integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q (cubeCenter Q) (1 / 3 : ℝ) henergy_int) + (integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet + Q (1 / 3 : ℝ) henergy_int) + intro y hyQ + by_cases hylocal : + y ∈ coarseCaccioppoliLocalClosedCube Q (cubeCenter Q) (1 / 3 : ℝ) + · have hyscaled : y ∈ scaledClosedCubeSet Q (1 / 3 : ℝ) := hsub hylocal + rw [Set.indicator_of_mem hylocal, Set.indicator_of_mem hyscaled] + · rw [Set.indicator_of_notMem hylocal] + by_cases hyscaled : y ∈ scaledClosedCubeSet Q (1 / 3 : ℝ) + · rw [Set.indicator_of_mem hyscaled] + exact henergy_nonneg y hyQ + · rw [Set.indicator_of_notMem hyscaled] + +theorem + interior_centered_deterministic_note_from_public_oscillation_standardExplicitBudgetSplit + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + 0 ≤ Cnote ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorNoteRhs Q (pointwiseCoeffFor Q a) s t Cnote + (interiorCaccioppoliParentOscillationL2Sq Q a u) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + rcases + coarseCaccioppoli_interior_qone_standard_note_of_closedCubeEllipticity_of_buffered_constantFamily_explicitBudgetSplit + (Q := Q) (a := pointwiseCoeffFor Q a) (s := s) (t := t) + (u := u.toPointwiseAHarmonic.normalizeMeanZero) hs ht hst + (pointwiseCoeffFor_isEllipticFieldOn_cubeSet Q a) with + ⟨hCnote, hdet⟩ + refine ⟨hCnote, ?_⟩ + have hprofile := + coarseCaccioppoliLocalizedEnergyRadiusProfile_normalizeMeanZero_eq + (Q := Q) (a := a) u (1 / 3 : ℝ) + have hprofile_inv : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic.normalizeMeanZero y) ((3 : ℝ)⁻¹) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun y => + scalarVariationEnergyIntegrand (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic y) ((3 : ℝ)⁻¹) := by + simpa [one_div] using hprofile + simpa [one_div, hprofile_inv, + interiorCaccioppoliParentOscillationL2Sq_eq_harmonicL2Sq_pointwise_normalizeMeanZero + (Q := Q) (a := a) u] using hdet + +theorem cubeCenter_mem_openCubeSet {d : ℕ} (Q : TriadicCube d) : + cubeCenter Q ∈ openCubeSet Q := by + rw [← ball_cubeCenter_eq_openCubeSet] + exact Metric.mem_ball_self (cubeRadius_pos Q) + +private theorem public_LambdaS_le_deterministic_LambdaSq_one_pointwiseCoeffFor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) (s : ℝ) : + 0 < s → + Ch02.LambdaS Q s a ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + intro hs + have hhalf := + Ch02.LambdaSq_one_rpow_half_le_old_pointwiseCoeffField Q a hs + have hpublic_nonneg : + 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hold_nonneg : + 0 ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + exact Homogenization.multiscale_ellipticity_LambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + have hsq := pow_le_pow_left₀ + (Real.rpow_nonneg hpublic_nonneg (1 / 2 : ℝ)) hhalf 2 + calc + Ch02.LambdaS Q s a = + (Real.rpow (Ch02.LambdaS Q s a) (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hpublic_nonneg + _ ≤ + (Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a)) (1 / 2 : ℝ)) ^ 2 := by + simpa [Ch02.LambdaS, pointwiseCoeffFor] using hsq + _ = + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hold_nonneg + +private theorem public_lambdaS_inv_le_deterministic_lambdaSq_one_inv_pointwiseCoeffFor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) (s : ℝ) : + 0 < s → + (Ch02.lambdaS Q s a)⁻¹ ≤ + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ := by + intro hs + have hhalf := + Ch02.lambdaSq_one_rpow_neg_half_le_old_pointwiseCoeffField Q a hs + have hpublic_nonneg : + 0 ≤ Ch02.lambdaS Q s a := by + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hold_nonneg : + 0 ≤ + Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + exact Homogenization.multiscale_ellipticity_lambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + have hsq := pow_le_pow_left₀ + (Real.rpow_nonneg hpublic_nonneg (-1 / 2 : ℝ)) hhalf 2 + calc + (Ch02.lambdaS Q s a)⁻¹ = + (Real.rpow (Ch02.lambdaS Q s a) (-1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg hpublic_nonneg + _ ≤ + (Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a)) (-1 / 2 : ℝ)) ^ 2 := by + simpa [Ch02.lambdaS, pointwiseCoeffFor] using hsq + _ = + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ := by + exact Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg hold_nonneg + +private theorem public_ThetaRatio_le_deterministic_ThetaRatio_pointwiseCoeffFor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) : + Ch02.ThetaRatio Q s t a ≤ + Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) := by + have hLambda := + public_LambdaS_le_deterministic_LambdaSq_one_pointwiseCoeffFor Q a s hs + have hlambda_inv := + public_lambdaS_inv_le_deterministic_lambdaSq_one_inv_pointwiseCoeffFor Q a t ht + have hpublic_inv_nonneg : + 0 ≤ (Ch02.lambdaS Q t a)⁻¹ := by + exact inv_nonneg.mpr + (Ch02.lambdaSq_finite_nonneg Q a ht (by norm_num : (1 : ℝ) ≤ 1)) + have holdLambda_nonneg : + 0 ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := + Homogenization.multiscale_ellipticity_LambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + calc + Ch02.ThetaRatio Q s t a = + Ch02.LambdaS Q s a * (Ch02.lambdaS Q t a)⁻¹ := by + rw [Ch02.ThetaRatio, div_eq_mul_inv] + _ ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) * + (Homogenization.lambdaSq Q t (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ := by + exact mul_le_mul hLambda hlambda_inv hpublic_inv_nonneg holdLambda_nonneg + _ = + Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) := by + rw [Homogenization.ThetaRatio, div_eq_mul_inv] + +private theorem deterministic_LambdaSq_one_pointwiseCoeffFor_le_dim_sq_mul_public_LambdaS + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) (s : ℝ) : + 0 < s → + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) ≤ + ((d : ℝ) ^ (2 : ℕ)) * Ch02.LambdaS Q s a := by + intro hs + have hhalf := + Ch02.old_LambdaSq_one_rpow_half_le_dim_mul_pointwiseCoeffField Q a hs + have hold_nonneg : + 0 ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + exact Homogenization.multiscale_ellipticity_LambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + have hpublic_nonneg : + 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hsq := pow_le_pow_left₀ + (Real.rpow_nonneg hold_nonneg (1 / 2 : ℝ)) hhalf 2 + calc + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) = + (Real.rpow + (Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a)) (1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_half_eq_self_of_nonneg hold_nonneg + _ ≤ + ((d : ℝ) * Real.rpow (Ch02.LambdaS Q s a) (1 / 2 : ℝ)) ^ 2 := by + simpa [Ch02.LambdaS, pointwiseCoeffFor] using hsq + _ = + ((d : ℝ) ^ (2 : ℕ)) * + (Real.rpow (Ch02.LambdaS Q s a) (1 / 2 : ℝ)) ^ 2 := by + ring + _ = + ((d : ℝ) ^ (2 : ℕ)) * Ch02.LambdaS Q s a := by + rw [Homogenization.sq_rpow_half_eq_self_of_nonneg hpublic_nonneg] + +private theorem deterministic_lambdaSq_one_inv_pointwiseCoeffFor_le_dim_sq_mul_public_lambdaS_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) (s : ℝ) : + 0 < s → + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ ≤ + ((d : ℝ) ^ (2 : ℕ)) * (Ch02.lambdaS Q s a)⁻¹ := by + intro hs + have hhalf := + Ch02.old_lambdaSq_one_rpow_neg_half_le_dim_mul_pointwiseCoeffField Q a hs + have hold_nonneg : + 0 ≤ + Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := by + exact Homogenization.multiscale_ellipticity_lambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + have hpublic_nonneg : + 0 ≤ Ch02.lambdaS Q s a := by + unfold Ch02.lambdaS + exact Ch02.lambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hsq := pow_le_pow_left₀ + (Real.rpow_nonneg hold_nonneg (-1 / 2 : ℝ)) hhalf 2 + calc + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ = + (Real.rpow + (Homogenization.lambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a)) (-1 / 2 : ℝ)) ^ 2 := by + symm + exact Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg hold_nonneg + _ ≤ + ((d : ℝ) * Real.rpow (Ch02.lambdaS Q s a) (-1 / 2 : ℝ)) ^ 2 := by + simpa [Ch02.lambdaS, pointwiseCoeffFor] using hsq + _ = + ((d : ℝ) ^ (2 : ℕ)) * + (Real.rpow (Ch02.lambdaS Q s a) (-1 / 2 : ℝ)) ^ 2 := by + ring + _ = + ((d : ℝ) ^ (2 : ℕ)) * (Ch02.lambdaS Q s a)⁻¹ := by + rw [Homogenization.sq_rpow_neg_half_eq_inv_of_nonneg hpublic_nonneg] + +private theorem deterministic_ThetaRatio_pointwiseCoeffFor_le_dim_four_mul_public + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) : + Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) ≤ + (((d : ℝ) ^ (2 : ℕ)) ^ (2 : ℕ)) * Ch02.ThetaRatio Q s t a := by + let D : ℝ := (d : ℝ) ^ (2 : ℕ) + have hLambda := + deterministic_LambdaSq_one_pointwiseCoeffFor_le_dim_sq_mul_public_LambdaS + Q a s hs + have hlambda_inv := + deterministic_lambdaSq_one_inv_pointwiseCoeffFor_le_dim_sq_mul_public_lambdaS_inv + Q a t ht + have hold_inv_nonneg : + 0 ≤ + (Homogenization.lambdaSq Q t (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ := by + exact inv_nonneg.mpr + (Homogenization.multiscale_ellipticity_lambdaSq_one_nonneg + Q t (pointwiseCoeffFor Q a) ht.le) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hpublic_Lambda_nonneg : + 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hD_public_Lambda_nonneg : 0 ≤ D * Ch02.LambdaS Q s a := + mul_nonneg hD_nonneg hpublic_Lambda_nonneg + calc + Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) = + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) * + (Homogenization.lambdaSq Q t (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a))⁻¹ := by + rw [Homogenization.ThetaRatio, div_eq_mul_inv] + _ ≤ + (D * Ch02.LambdaS Q s a) * + (D * (Ch02.lambdaS Q t a)⁻¹) := by + exact mul_le_mul hLambda (by simpa [D] using hlambda_inv) + hold_inv_nonneg hD_public_Lambda_nonneg + _ = + (D ^ (2 : ℕ)) * Ch02.ThetaRatio Q s t a := by + rw [Ch02.ThetaRatio, div_eq_mul_inv] + ring + _ = + (((d : ℝ) ^ (2 : ℕ)) ^ (2 : ℕ)) * Ch02.ThetaRatio Q s t a := by + rfl + +private theorem deterministic_one_le_ThetaRatio_pointwiseCoeffFor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) : + 1 ≤ Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) := by + exact (Ch02.one_le_ThetaRatio_of_pos Q a hs ht).trans + (public_ThetaRatio_le_deterministic_ThetaRatio_pointwiseCoeffFor Q a hs ht) + +private theorem boundary_localPatch_standardExplicitNoteConstantSplit_le_explicitBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + let CalphaInternal : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CcrossInternal : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + rcases coarseCaccioppoliLocalPatchBufferedBudgetSplit_spec + (Q := Q) (s := s) (t := t) (Csol := Csol) hs ht hst with + ⟨_, _, hCalpha, hCcross, _, _, _⟩ + have hcard_nat_pos : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast hcard_nat_pos + have hCalphaInternal : + 0 < (Fintype.card (Fin d) : ℝ) * Calpha := + mul_pos hcard_pos hCalpha + have hCcrossInternal : + 0 ≤ (Fintype.card (Fin d) : ℝ) * Ccross := + mul_nonneg hcard_pos.le hCcross + simpa [Csol, Calpha, Ccross, caccioppoliStandardExplicitNoteBoundSplit] using + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_le_explicitBound + Q (pointwiseCoeffFor Q a) s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + hCalphaInternal hCcrossInternal hs ht hst + (deterministic_one_le_ThetaRatio_pointwiseCoeffFor Q a hs ht) + +theorem boundary_localPatch_standardExplicitNoteConstantSplit_le_unitExplicitBound_of_scale_zero + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hQ : Q.scale = 0) : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + simpa [caccioppoliStandardExplicitNoteBoundSplit, + coarseCaccioppoliLocalPatchBufferedAlphaBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQ, + coarseCaccioppoliLocalPatchBufferedCrossBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQ] using + boundary_localPatch_standardExplicitNoteConstantSplit_le_explicitBound + Q a hs ht hst + +private theorem interior_centered_standardExplicitNoteConstantSplit_le_explicitBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + let CalphaInternal : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CcrossInternal : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + rcases coarseCaccioppoliBufferedBudgetSplit_spec + (Q := Q) (s := s) (t := t) (Csol := Csol) hs ht hst with + ⟨_, _, hCalpha, hCcross, _, _, _⟩ + have hcard_nat_pos : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast hcard_nat_pos + have hCalphaInternal : + 0 < (Fintype.card (Fin d) : ℝ) * Calpha := + mul_pos hcard_pos hCalpha + have hCcrossInternal : + 0 ≤ (Fintype.card (Fin d) : ℝ) * Ccross := + mul_nonneg hcard_pos.le hCcross + simpa [Csol, Calpha, Ccross, caccioppoliStandardExplicitNoteBoundSplit] using + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_le_explicitBound + Q (pointwiseCoeffFor Q a) s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + hCalphaInternal hCcrossInternal hs ht hst + (deterministic_one_le_ThetaRatio_pointwiseCoeffFor Q a hs ht) + +theorem interior_centered_standardExplicitNoteConstantSplit_le_unitExplicitBound_of_scale_zero + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hQ : Q.scale = 0) : + let CalphaInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudgetUnit d s + let CcrossInternal : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudgetUnit d s + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q (pointwiseCoeffFor Q a) s t CalphaInternal CcrossInternal ≤ + caccioppoliStandardExplicitNoteBoundSplit s t + CalphaInternal CcrossInternal := by + simpa [caccioppoliStandardExplicitNoteBoundSplit, + coarseCaccioppoliBufferedAlphaBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQ, + coarseCaccioppoliBufferedCrossBudget_eq_unit_of_scale_eq_zero + (Q := Q) s hQ] using + interior_centered_standardExplicitNoteConstantSplit_le_explicitBound + Q a hs ht hst + +private theorem dim_sq_theta_loss_mul_rpow_le_scaled_rpow + {D C σ e p : ℝ} (hD : 1 ≤ D) (hC : 0 ≤ C) (hσ : 0 < σ) + (he : 0 ≤ e) (hp : p = 2 + 4 * e) : + D * Real.rpow (D ^ (2 : ℕ)) e * Real.rpow (C / σ) p ≤ + Real.rpow (D * C / σ) p := by + have hD_nonneg : 0 ≤ D := le_trans zero_le_one hD + have hD_pos : 0 < D := lt_of_lt_of_le zero_lt_one hD + have hbase_nonneg : 0 ≤ C / σ := div_nonneg hC hσ.le + have hDsq_rpow : + Real.rpow (D ^ (2 : ℕ)) e = Real.rpow D (2 * e) := by + have hDsq_eq : D ^ (2 : ℕ) = Real.rpow D (2 : ℝ) := by + exact (Real.rpow_two D).symm + rw [hDsq_eq] + exact (Real.rpow_mul hD_nonneg (2 : ℝ) e).symm + have hfactor_eq : + D * Real.rpow (D ^ (2 : ℕ)) e = Real.rpow D (1 + 2 * e) := by + calc + D * Real.rpow (D ^ (2 : ℕ)) e = + D * Real.rpow D (2 * e) := by + rw [hDsq_rpow] + _ = Real.rpow D 1 * Real.rpow D (2 * e) := by + simp + _ = Real.rpow D (1 + 2 * e) := by + exact (Real.rpow_add hD_pos 1 (2 * e)).symm + have hexp_le : 1 + 2 * e ≤ p := by + rw [hp] + nlinarith [he] + have hfactor_le : + D * Real.rpow (D ^ (2 : ℕ)) e ≤ Real.rpow D p := by + rw [hfactor_eq] + exact Real.rpow_le_rpow_of_exponent_le hD hexp_le + have hscaled_eq : + Real.rpow (D * C / σ) p = + Real.rpow D p * Real.rpow (C / σ) p := by + have hbase : D * C / σ = D * (C / σ) := by ring + rw [hbase] + exact Real.mul_rpow hD_nonneg hbase_nonneg + calc + D * Real.rpow (D ^ (2 : ℕ)) e * Real.rpow (C / σ) p ≤ + Real.rpow D p * Real.rpow (C / σ) p := by + exact mul_le_mul_of_nonneg_right hfactor_le + (Real.rpow_nonneg hbase_nonneg _) + _ = Real.rpow (D * C / σ) p := hscaled_eq.symm + +private theorem deterministic_boundaryNoteCoeff_pointwiseCoeffFor_le_publicPrefactor_dim_sq_mul + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s t C : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hC : 0 ≤ C) (hQscale : Q.scale = 0) : + coarseCaccioppoliBoundaryNoteCoeff Q (pointwiseCoeffFor Q a) s t C ≤ + caccioppoliPrefactor (((d : ℝ) ^ (2 : ℕ)) * C) Q a s t := by + let σ : ℝ := 1 - s - t + let e : ℝ := s / σ + let p : ℝ := 2 + 4 * s / σ + let D : ℝ := (d : ℝ) ^ (2 : ℕ) + let front : ℝ := Real.rpow (C / σ) p * Real.rpow s (-2 * s / σ) + let F : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (Ch02.ThetaRatio Q s t a) e * + Ch02.LambdaS Q s a + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have he_nonneg : 0 ≤ e := by + dsimp [e] + positivity + have hd_nat : 1 ≤ d := Nat.succ_le_of_lt (Nat.pos_of_ne_zero (NeZero.ne d)) + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hd_nat + have hd_nonneg : 0 ≤ (d : ℝ) := le_trans zero_le_one hd_one + have hD_one : (1 : ℝ) ≤ D := by + dsimp [D] + simpa [pow_two] using + mul_le_mul hd_one hd_one (by norm_num : (0 : ℝ) ≤ 1) hd_nonneg + have hD_nonneg : 0 ≤ D := le_trans zero_le_one hD_one + have hDsq_nonneg : 0 ≤ D ^ (2 : ℕ) := pow_nonneg hD_nonneg 2 + have hbase_nonneg : 0 ≤ C / σ := div_nonneg hC hσ_pos.le + have hCpow_nonneg : 0 ≤ Real.rpow (C / σ) p := + Real.rpow_nonneg hbase_nonneg _ + have hsPow_nonneg : 0 ≤ Real.rpow s (-2 * s / σ) := + Real.rpow_nonneg hs.le _ + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg hCpow_nonneg hsPow_nonneg + have hOldTheta_nonneg : + 0 ≤ Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) := + thetaRatio_nonneg Q s t (pointwiseCoeffFor Q a) hs.le ht.le + have hPubTheta_nonneg : 0 ≤ Ch02.ThetaRatio Q s t a := + Ch02.ThetaRatio_nonneg Q a hs ht + have hOldLambda_nonneg : + 0 ≤ + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) := + Homogenization.multiscale_ellipticity_LambdaSq_one_nonneg + Q s (pointwiseCoeffFor Q a) hs.le + have hPubLambda_nonneg : 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hD_pubLambda_nonneg : 0 ≤ D * Ch02.LambdaS Q s a := + mul_nonneg hD_nonneg hPubLambda_nonneg + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact mul_nonneg + (mul_nonneg hsPow_nonneg + (Real.rpow_nonneg hPubTheta_nonneg _)) + hPubLambda_nonneg + have hLambda : + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) ≤ + D * Ch02.LambdaS Q s a := by + simpa [D] using + deterministic_LambdaSq_one_pointwiseCoeffFor_le_dim_sq_mul_public_LambdaS + Q a s hs + have hTheta : + Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a) ≤ + D ^ (2 : ℕ) * Ch02.ThetaRatio Q s t a := by + simpa [D] using + deterministic_ThetaRatio_pointwiseCoeffFor_le_dim_four_mul_public + Q a hs ht + have hThetaPow : + Real.rpow (Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a)) e ≤ + Real.rpow (D ^ (2 : ℕ) * Ch02.ThetaRatio Q s t a) e := by + exact Real.rpow_le_rpow hOldTheta_nonneg hTheta he_nonneg + have hThetaPow_mul : + Real.rpow (D ^ (2 : ℕ) * Ch02.ThetaRatio Q s t a) e = + Real.rpow (D ^ (2 : ℕ)) e * + Real.rpow (Ch02.ThetaRatio Q s t a) e := by + exact Real.mul_rpow hDsq_nonneg hPubTheta_nonneg + have hThetaLambda : + Real.rpow (Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a)) e * + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a) ≤ + Real.rpow (D ^ (2 : ℕ) * Ch02.ThetaRatio Q s t a) e * + (D * Ch02.LambdaS Q s a) := by + exact mul_le_mul hThetaPow hLambda hOldLambda_nonneg + (Real.rpow_nonneg (mul_nonneg hDsq_nonneg hPubTheta_nonneg) _) + have hconstant_absorb : + D * Real.rpow (D ^ (2 : ℕ)) e * Real.rpow (C / σ) p ≤ + Real.rpow (D * C / σ) p := + dim_sq_theta_loss_mul_rpow_le_scaled_rpow hD_one hC hσ_pos he_nonneg + (by dsimp [p, e]; ring) + have hsPow_public : + Real.rpow s (-2 * s / σ) = Real.rpow s (-(2 * s / σ)) := by + congr 1 + ring + have hsPow_public_expanded : + Real.rpow s (-2 * s / (1 - s - t)) = + Real.rpow s (-(2 * s / (1 - s - t))) := by + simpa [σ] using hsPow_public + have hscale_one : + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) = 1 := by + simp [hQscale] + calc + coarseCaccioppoliBoundaryNoteCoeff Q (pointwiseCoeffFor Q a) s t C = + front * + (Real.rpow (Homogenization.ThetaRatio Q s t (pointwiseCoeffFor Q a)) e * + Homogenization.LambdaSq Q s (Homogenization.MultiscaleExponent.finite 1) + (pointwiseCoeffFor Q a)) := by + dsimp [front, p, e, σ] + unfold coarseCaccioppoliBoundaryNoteCoeff coarseCaccioppoliSigma + simp [Homogenization.LambdaSq] + ring + _ ≤ + front * + (Real.rpow (D ^ (2 : ℕ) * Ch02.ThetaRatio Q s t a) e * + (D * Ch02.LambdaS Q s a)) := + mul_le_mul_of_nonneg_left hThetaLambda hfront_nonneg + _ = + (D * Real.rpow (D ^ (2 : ℕ)) e * Real.rpow (C / σ) p) * F := by + rw [hThetaPow_mul] + dsimp [front, F] + ring + _ ≤ Real.rpow (D * C / σ) p * F := + mul_le_mul_of_nonneg_right hconstant_absorb hF_nonneg + _ = + Real.rpow (D * C / σ) p * + (Real.rpow s (-(2 * s / σ)) * + Real.rpow (Ch02.ThetaRatio Q s t a) e * + Ch02.LambdaS Q s a) := by + simpa [F, mul_assoc] using + congrArg + (fun z : ℝ => + Real.rpow (D * C / σ) p * + (z * Real.rpow (Ch02.ThetaRatio Q s t a) e * + Ch02.LambdaS Q s a)) + hsPow_public + _ = caccioppoliPrefactor (D * C) Q a s t := by + dsimp [p, e, σ, D] + unfold caccioppoliPrefactor + simp [hQscale, mul_assoc, mul_left_comm, mul_comm] + +theorem deterministic_boundaryNoteRhs_pointwiseCoeffFor_le_publicPrefactor_dim_sq_mul + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s t C uL2Sq : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hC : 0 ≤ C) (hQscale : Q.scale = 0) (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t C uL2Sq ≤ + caccioppoliPrefactor (((d : ℝ) ^ (2 : ℕ)) * C) Q a s t * uL2Sq := by + rw [coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] + exact mul_le_mul_of_nonneg_right + (deterministic_boundaryNoteCoeff_pointwiseCoeffFor_le_publicPrefactor_dim_sq_mul + (Q := Q) (a := a) hs ht hst hC hQscale) + hu + +theorem deterministic_boundaryNoteRhs_pointwiseCoeffFor_le_publicRHS_dim_sq_mul_of_scale_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hC : 0 ≤ C) (hQscale : Q.scale = 0) : + coarseCaccioppoliBoundaryNoteRhs Q (pointwiseCoeffFor Q a) s t C + (boundaryCaccioppoliParentL2Sq u) ≤ + boundaryCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * C) s t u := by + have hu : + 0 ≤ boundaryCaccioppoliParentL2Sq u := by + rw [boundaryCaccioppoliParentL2Sq_eq_harmonicL2Sq_pointwise u] + exact + coarseCaccioppoliHarmonicL2Sq_nonneg Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic + simpa [boundaryCaccioppoliRHS] using + deterministic_boundaryNoteRhs_pointwiseCoeffFor_le_publicPrefactor_dim_sq_mul + (Q := Q) (a := a) (s := s) (t := t) (C := C) + (uL2Sq := boundaryCaccioppoliParentL2Sq u) + hs ht hst hC hQscale hu + +theorem deterministic_interiorNoteRhs_pointwiseCoeffFor_le_publicRHS_dim_sq_mul_of_scale_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t C : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hC : 0 ≤ C) (hQscale : Q.scale = 0) : + coarseCaccioppoliInteriorNoteRhs Q (pointwiseCoeffFor Q a) s t C + (interiorCaccioppoliParentOscillationL2Sq Q a u) ≤ + interiorCaccioppoliRHS (((d : ℝ) ^ (2 : ℕ)) * C) Q a s t u := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hu : + 0 ≤ interiorCaccioppoliParentOscillationL2Sq Q a u := by + rw [interiorCaccioppoliParentOscillationL2Sq_eq_harmonicL2Sq_pointwise_normalizeMeanZero + (Q := Q) (a := a) u] + exact + coarseCaccioppoliHarmonicL2Sq_nonneg Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic.normalizeMeanZero + simpa [interiorCaccioppoliRHS, coarseCaccioppoliInteriorNoteRhs] using + deterministic_boundaryNoteRhs_pointwiseCoeffFor_le_publicPrefactor_dim_sq_mul + (Q := Q) (a := a) (s := s) (t := t) (C := C) + (uL2Sq := interiorCaccioppoliParentOscillationL2Sq Q a u) + hs ht hst hC hQscale hu + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS/Monotonicity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS/Monotonicity.lean new file mode 100644 index 0000000000..d1e57c4001 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroRHS/Monotonicity.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroRHS + +/-! # Monotonicity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli RHS monotonicity helpers + +This child file contains the scalar monotonicity lemmas which let the +scale-zero bridge enlarge public Caccioppoli RHS constants. + +## Audit tag + +Claim: if a public RHS constant is enlarged after multiplication by a +dimension-only factor, the boundary and centered-interior scale-zero RHS terms +enlarge accordingly. + +Downstream target: `CoarseCaccioppoliScaleZeroBridge.lean`. This file is +internal bridge plumbing only and introduces no public `*Theory` surface. +-/ + +noncomputable section + +open scoped ENNReal + +private theorem rhs_const_mul_rpow_le_rpow_of_mul_le + {M x y p : ℝ} (hM : 1 ≤ M) (hx : 0 ≤ x) (hMxy : M * x ≤ y) + (hp : 1 ≤ p) : + M * Real.rpow x p ≤ Real.rpow y p := by + have hM_nonneg : 0 ≤ M := le_trans zero_le_one hM + have hMx_nonneg : 0 ≤ M * x := mul_nonneg hM_nonneg hx + have hM_le_Mp : M ≤ Real.rpow M p := by + simpa using Real.self_le_rpow_of_one_le hM hp + have hxpow_nonneg : 0 ≤ Real.rpow x p := Real.rpow_nonneg hx p + have hleft : M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := + mul_le_mul_of_nonneg_right hM_le_Mp hxpow_nonneg + have hmul_rpow : Real.rpow M p * Real.rpow x p = Real.rpow (M * x) p := + (Real.mul_rpow hM_nonneg hx).symm + calc + M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := hleft + _ = Real.rpow (M * x) p := hmul_rpow + _ ≤ Real.rpow y p := + Real.rpow_le_rpow hMx_nonneg hMxy (by linarith) + +private theorem caccioppoliPrefactor_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {M C₁ C₂ : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s t : ℝ} + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * caccioppoliPrefactor C₁ Q a s t ≤ + caccioppoliPrefactor C₂ Q a s t := by + let σ : ℝ := 1 - s - t + let p : ℝ := 2 + 4 * s / σ + let F : ℝ := + Real.rpow s (-(2 * s / σ)) * + Real.rpow (Ch02.ThetaRatio Q s t a) (s / σ) * + Ch02.LambdaS Q s a * + Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) + have hσ_pos : 0 < σ := by + dsimp [σ] + linarith + have hp_ge_one : 1 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hbase_nonneg : 0 ≤ C₁ / σ := div_nonneg hC₁ hσ_pos.le + have hbase_le : M * (C₁ / σ) ≤ C₂ / σ := by + calc + M * (C₁ / σ) = (M * C₁) / σ := by ring + _ ≤ C₂ / σ := div_le_div_of_nonneg_right hMC₁C₂ hσ_pos.le + have hpow : + M * Real.rpow (C₁ / σ) p ≤ Real.rpow (C₂ / σ) p := + rhs_const_mul_rpow_le_rpow_of_mul_le hM hbase_nonneg hbase_le hp_ge_one + have htheta_nonneg : 0 ≤ Ch02.ThetaRatio Q s t a := + Ch02.ThetaRatio_nonneg Q a hs ht + have hLambda_nonneg : 0 ≤ Ch02.LambdaS Q s a := by + unfold Ch02.LambdaS + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 1) + have hscale_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-2 * (((Q.scale : ℤ) : ℝ))) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg htheta_nonneg _)) + hLambda_nonneg) + hscale_nonneg + calc + M * caccioppoliPrefactor C₁ Q a s t = + (M * Real.rpow (C₁ / σ) p) * F := by + simp [F, p, σ, caccioppoliPrefactor, mul_assoc, mul_left_comm, mul_comm] + _ ≤ Real.rpow (C₂ / σ) p * F := + mul_le_mul_of_nonneg_right hpow hF_nonneg + _ = caccioppoliPrefactor C₂ Q a s t := by + simp [F, p, σ, caccioppoliPrefactor, mul_assoc, mul_left_comm, mul_comm] + +theorem boundaryCaccioppoliRHS_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {x : Vec d} (u : BoundaryCaccioppoliDatum Q a x) {s t M C₁ C₂ : ℝ} + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * boundaryCaccioppoliRHS C₁ s t u ≤ + boundaryCaccioppoliRHS C₂ s t u := by + have hu : + 0 ≤ boundaryCaccioppoliParentL2Sq u := by + rw [boundaryCaccioppoliParentL2Sq_eq_harmonicL2Sq_pointwise u] + exact + coarseCaccioppoliHarmonicL2Sq_nonneg Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic + have hpref : + M * caccioppoliPrefactor C₁ Q a s t ≤ + caccioppoliPrefactor C₂ Q a s t := + caccioppoliPrefactor_mul_const_le_of_mul_constant_le + (Q := Q) (a := a) (s := s) (t := t) + (M := M) (C₁ := C₁) (C₂ := C₂) + hM hC₁ hMC₁C₂ hs ht hst + calc + M * boundaryCaccioppoliRHS C₁ s t u = + (M * caccioppoliPrefactor C₁ Q a s t) * + boundaryCaccioppoliParentL2Sq u := by + simp [boundaryCaccioppoliRHS, mul_assoc] + _ ≤ caccioppoliPrefactor C₂ Q a s t * + boundaryCaccioppoliParentL2Sq u := by + exact mul_le_mul_of_nonneg_right hpref hu + _ = boundaryCaccioppoliRHS C₂ s t u := by + simp [boundaryCaccioppoliRHS] + +theorem interiorCaccioppoliRHS_mul_const_le_of_mul_constant_le + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + (u : CubeSolution Q a) {s t M C₁ C₂ : ℝ} + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * interiorCaccioppoliRHS C₁ Q a s t u ≤ + interiorCaccioppoliRHS C₂ Q a s t u := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hu : + 0 ≤ interiorCaccioppoliParentOscillationL2Sq Q a u := by + rw [interiorCaccioppoliParentOscillationL2Sq_eq_harmonicL2Sq_pointwise_normalizeMeanZero + (Q := Q) (a := a) u] + exact + coarseCaccioppoliHarmonicL2Sq_nonneg Q (pointwiseCoeffFor Q a) + u.toPointwiseAHarmonic.normalizeMeanZero + have hpref : + M * caccioppoliPrefactor C₁ Q a s t ≤ + caccioppoliPrefactor C₂ Q a s t := + caccioppoliPrefactor_mul_const_le_of_mul_constant_le + (Q := Q) (a := a) (s := s) (t := t) + (M := M) (C₁ := C₁) (C₂ := C₂) + hM hC₁ hMC₁C₂ hs ht hst + calc + M * interiorCaccioppoliRHS C₁ Q a s t u = + (M * caccioppoliPrefactor C₁ Q a s t) * + interiorCaccioppoliParentOscillationL2Sq Q a u := by + simp [interiorCaccioppoliRHS, mul_assoc] + _ ≤ + caccioppoliPrefactor C₂ Q a s t * + interiorCaccioppoliParentOscillationL2Sq Q a u := by + exact mul_le_mul_of_nonneg_right hpref hu + _ = interiorCaccioppoliRHS C₂ Q a s t u := by + simp [interiorCaccioppoliRHS] + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroScalarBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroScalarBounds.lean new file mode 100644 index 0000000000..751b6e9f3c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliScaleZeroScalarBounds.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliScaleZeroBudgetEnvelopes + +/-! # Coarse Caccioppoli Scale Zero Scalar Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-zero Caccioppoli scalar bounds + +This file bounds the boundary and interior scale-zero explicit constants by +one dimension-only scalar bound. + +## Audit tag + +Claim: package the boundary and centered-interior explicit scale-zero constants +under one dimension-only scalar bound. + +Downstream target: `CoarseCaccioppoliScaleZero.lean`. This file should stay as +the scalar-bound endpoint for the scale-zero stack. +-/ + +noncomputable section + +open scoped ENNReal + +private noncomputable def caccioppoliScaleZeroEnvelopeBound + (A X : ℝ) : ℝ := + 36 * ((6561 : ℝ) * 6561 * X ^ (2 : ℕ)) + + 36 * Real.exp 1 * ((9 : ℝ) * 4 * 81 * X * X * A) + 1 + +noncomputable def boundaryCaccioppoliScaleZeroScalarBound + (d : ℕ) [NeZero d] : ℝ := + (18 : ℝ) ^ d * + caccioppoliScaleZeroEnvelopeBound + (boundaryScaleZeroAlphaInternalEnvelope d) + (boundaryScaleZeroCrossInternalEnvelope d) + +noncomputable def interiorCaccioppoliScaleZeroScalarBound + (d : ℕ) [NeZero d] : ℝ := + (18 : ℝ) ^ d * + caccioppoliScaleZeroEnvelopeBound + (interiorScaleZeroAlphaInternalEnvelope d) + (interiorScaleZeroCrossInternalEnvelope d) + +/-- A dimension-only scalar bound dominating both scale-zero bridge constants. -/ +noncomputable def caccioppoliScaleZeroScalarBound + (d : ℕ) [NeZero d] : ℝ := + max 1 + (max (boundaryCaccioppoliScaleZeroScalarBound d) + (interiorCaccioppoliScaleZeroScalarBound d)) + +private theorem fin_card_real_ge_one (d : ℕ) [NeZero d] : + (1 : ℝ) ≤ (Fintype.card (Fin d) : ℝ) := by + have hd_pos : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hcard : 1 ≤ Fintype.card (Fin d) := by + simpa [Fintype.card_fin] using! hd_pos + exact_mod_cast hcard + +private theorem one_le_mul_of_one_le_of_one_le {a b : ℝ} + (ha : 1 ≤ a) (hb : 1 ≤ b) : 1 ≤ a * b := by + have ha_nonneg : 0 ≤ a := by linarith + have hmul : (1 : ℝ) * 1 ≤ a * b := + mul_le_mul ha hb (by norm_num) ha_nonneg + simpa using hmul + +private theorem boundaryScaleZeroAlphaInternalEnvelope_ge_one + (d : ℕ) [NeZero d] : + 1 ≤ boundaryScaleZeroAlphaInternalEnvelope d := by + have hcard : (1 : ℝ) ≤ (Fintype.card (Fin d) : ℝ) := + fin_card_real_ge_one d + have henv : 1 ≤ boundaryScaleZeroAlphaBudgetEnvelope d := by + unfold boundaryScaleZeroAlphaBudgetEnvelope + dsimp + exact le_max_left _ _ + unfold boundaryScaleZeroAlphaInternalEnvelope + exact one_le_mul_of_one_le_of_one_le hcard henv + +private theorem interiorScaleZeroAlphaInternalEnvelope_ge_one + (d : ℕ) [NeZero d] : + 1 ≤ interiorScaleZeroAlphaInternalEnvelope d := by + have hcard : (1 : ℝ) ≤ (Fintype.card (Fin d) : ℝ) := + fin_card_real_ge_one d + have henv : 1 ≤ interiorScaleZeroAlphaBudgetEnvelope d := by + unfold interiorScaleZeroAlphaBudgetEnvelope + dsimp + exact le_max_left _ _ + unfold interiorScaleZeroAlphaInternalEnvelope + exact one_le_mul_of_one_le_of_one_le hcard henv + +private theorem boundaryScaleZeroCrossInternalEnvelope_ge_one + (d : ℕ) [NeZero d] : + 1 ≤ boundaryScaleZeroCrossInternalEnvelope d := by + have hcard : (1 : ℝ) ≤ (Fintype.card (Fin d) : ℝ) := + fin_card_real_ge_one d + have henv : 1 ≤ boundaryScaleZeroCrossBudgetEnvelope d := by + unfold boundaryScaleZeroCrossBudgetEnvelope + dsimp + exact le_max_left _ _ + unfold boundaryScaleZeroCrossInternalEnvelope + exact one_le_mul_of_one_le_of_one_le hcard henv + +private theorem interiorScaleZeroCrossInternalEnvelope_ge_one + (d : ℕ) [NeZero d] : + 1 ≤ interiorScaleZeroCrossInternalEnvelope d := by + have hcard : (1 : ℝ) ≤ (Fintype.card (Fin d) : ℝ) := + fin_card_real_ge_one d + have henv : 1 ≤ interiorScaleZeroCrossBudgetEnvelope d := by + unfold interiorScaleZeroCrossBudgetEnvelope + dsimp + exact le_max_left _ _ + unfold interiorScaleZeroCrossInternalEnvelope + exact one_le_mul_of_one_le_of_one_le hcard henv + +theorem boundaryCaccioppoliScaleZeroExplicitConstant_le_scalarBound + {d : ℕ} [NeZero d] {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + boundaryCaccioppoliScaleZeroExplicitConstant d s t ≤ + boundaryCaccioppoliScaleZeroScalarBound d := by + let A : ℝ := boundaryScaleZeroAlphaInternalEnvelope d + let X : ℝ := boundaryScaleZeroCrossInternalEnvelope d + have hA_ge_one : 1 ≤ A := by + dsimp [A] + exact boundaryScaleZeroAlphaInternalEnvelope_ge_one d + have hX_ge_one : 1 ≤ X := by + dsimp [X] + exact boundaryScaleZeroCrossInternalEnvelope_ge_one d + have hA_nonneg : 0 ≤ A := by linarith + have hX_nonneg : 0 ≤ X := by linarith + have hCalpha_nonneg : 0 ≤ A * s⁻¹ := + mul_nonneg hA_nonneg (inv_nonneg.mpr hs.le) + have hnote : + caccioppoliStandardExplicitNoteBoundSplit s t (A * s⁻¹) X ≤ + caccioppoliScaleZeroEnvelopeBound A X := by + dsimp [caccioppoliScaleZeroEnvelopeBound] + exact + caccioppoliStandardExplicitNoteBoundSplit_le_envelope + hs ht hst hCalpha_nonneg (le_rfl : A * s⁻¹ ≤ A * s⁻¹) + hX_nonneg (le_rfl : X ≤ X) hA_ge_one hX_ge_one + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + calc + boundaryCaccioppoliScaleZeroExplicitConstant d s t + ≤ (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t (A * s⁻¹) X := by + dsimp [A, X] + exact boundaryCaccioppoliScaleZeroExplicitConstant_le_envelopeExplicit + hs ht hst + _ ≤ (18 : ℝ) ^ d * caccioppoliScaleZeroEnvelopeBound A X := + mul_le_mul_of_nonneg_left hnote hfactor_nonneg + _ = boundaryCaccioppoliScaleZeroScalarBound d := by + dsimp [A, X, boundaryCaccioppoliScaleZeroScalarBound] + +theorem interiorCaccioppoliScaleZeroExplicitConstant_le_scalarBound + {d : ℕ} [NeZero d] {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + interiorCaccioppoliScaleZeroExplicitConstant d s t ≤ + interiorCaccioppoliScaleZeroScalarBound d := by + let A : ℝ := interiorScaleZeroAlphaInternalEnvelope d + let X : ℝ := interiorScaleZeroCrossInternalEnvelope d + have hA_ge_one : 1 ≤ A := by + dsimp [A] + exact interiorScaleZeroAlphaInternalEnvelope_ge_one d + have hX_ge_one : 1 ≤ X := by + dsimp [X] + exact interiorScaleZeroCrossInternalEnvelope_ge_one d + have hA_nonneg : 0 ≤ A := by linarith + have hX_nonneg : 0 ≤ X := by linarith + have hCalpha_nonneg : 0 ≤ A * s⁻¹ := + mul_nonneg hA_nonneg (inv_nonneg.mpr hs.le) + have hnote : + caccioppoliStandardExplicitNoteBoundSplit s t (A * s⁻¹) X ≤ + caccioppoliScaleZeroEnvelopeBound A X := by + dsimp [caccioppoliScaleZeroEnvelopeBound] + exact + caccioppoliStandardExplicitNoteBoundSplit_le_envelope + hs ht hst hCalpha_nonneg (le_rfl : A * s⁻¹ ≤ A * s⁻¹) + hX_nonneg (le_rfl : X ≤ X) hA_ge_one hX_ge_one + have hfactor_nonneg : 0 ≤ (18 : ℝ) ^ d := + pow_nonneg (by norm_num : (0 : ℝ) ≤ 18) d + calc + interiorCaccioppoliScaleZeroExplicitConstant d s t + ≤ (18 : ℝ) ^ d * + caccioppoliStandardExplicitNoteBoundSplit s t (A * s⁻¹) X := by + dsimp [A, X] + exact interiorCaccioppoliScaleZeroExplicitConstant_le_envelopeExplicit + hs ht hst + _ ≤ (18 : ℝ) ^ d * caccioppoliScaleZeroEnvelopeBound A X := + mul_le_mul_of_nonneg_left hnote hfactor_nonneg + _ = interiorCaccioppoliScaleZeroScalarBound d := by + dsimp [A, X, interiorCaccioppoliScaleZeroScalarBound] + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliStandardScalar.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliStandardScalar.lean new file mode 100644 index 0000000000..177e5ff018 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseCaccioppoliStandardScalar.lean @@ -0,0 +1,823 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Endpoints + +/-! # Coarse Caccioppoli Standard Scalar -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Standard scalar bound for coarse Caccioppoli + +This file contains the scalar algebra for the standard beta-dependent split +note constant. The scale-zero envelope module imports this theorem and adds +the dimension-only budget bookkeeping. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Explicit scalar majorant for the split deterministic note constant when the +standard beta-dependent radius iteration is used. -/ +noncomputable def caccioppoliStandardExplicitNoteBoundSplit + (s t Calpha Ccross : ℝ) : ℝ := + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let q : ℝ := coarseCaccioppoliPower s t + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + let B : ℝ := R * (B₁ + B₂) + σ * Real.rpow (B + 1) p⁻¹ + +theorem caccioppoliStandardExplicitNoteBoundSplit_mono + {s t Calpha₁ Calpha₂ Ccross₁ Ccross₂ : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hCalpha₁ : 0 ≤ Calpha₁) (hCalpha₁₂ : Calpha₁ ≤ Calpha₂) + (hCcross₁ : 0 ≤ Ccross₁) (hCcross₁₂ : Ccross₁ ≤ Ccross₂) : + caccioppoliStandardExplicitNoteBoundSplit s t Calpha₁ Ccross₁ ≤ + caccioppoliStandardExplicitNoteBoundSplit s t Calpha₂ Ccross₂ := by + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let q : ℝ := coarseCaccioppoliPower s t + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ] + exact (coarseCaccioppoli_sigma_pos hst).le + have hp_inv_nonneg : 0 ≤ p⁻¹ := by + exact inv_nonneg.mpr (coarseCaccioppoli_noteExponent_pos hs hst).le + have hq_nonneg : 0 ≤ q := by + dsimp [q] + exact coarseCaccioppoli_power_nonneg hs hst + have hCalpha₂ : 0 ≤ Calpha₂ := hCalpha₁.trans hCalpha₁₂ + have hCcross₂ : 0 ≤ Ccross₂ := hCcross₁.trans hCcross₁₂ + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact + coarseCaccioppoliStandardRadiusIterationConst_nonneg + (coarseCaccioppoli_beta_nonneg hs hst) + have hs1_pos : 0 < 1 - s := by linarith + unfold caccioppoliStandardExplicitNoteBoundSplit + dsimp [σ, p, q, R] + gcongr + +private theorem caccioppoli_sigma_u_root_singular_le_exp_one + {σ s u e : ℝ} + (hσ : 0 < σ) (hs : 0 < s) (hu_eq : u = σ + s) + (hu_le_one : u ≤ 1) (hσ_le_one_sub_s : σ ≤ 1 - s) + (heq : e = s / (σ + 2 * s)) : + σ * Real.rpow (u / σ) (1 - e) * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) ≤ Real.exp 1 := by + have hu_pos : 0 < u := by + rw [hu_eq] + nlinarith + have hs_le_u : s ≤ u := by + rw [hu_eq] + linarith + have hs1_pos : 0 < 1 - s := lt_of_lt_of_le hσ hσ_le_one_sub_s + have hden_pos : 0 < σ + 2 * s := by nlinarith + have he_nonneg : 0 ≤ e := by + rw [heq] + positivity + have he_le_half : e ≤ (1 / 2 : ℝ) := by + rw [heq] + rw [div_le_iff₀ hden_pos] + nlinarith + have he_le_one_sub_e : e ≤ 1 - e := by linarith + let r : ℝ := s / u + have hr_pos : 0 < r := by + dsimp [r] + positivity + have hr_le_one : r ≤ 1 := by + dsimp [r] + rw [div_le_one₀ hu_pos] + exact hs_le_u + have he_le_r : e ≤ r := by + rw [heq] + dsimp [r] + rw [div_le_div_iff₀ hden_pos hu_pos] + nlinarith [hs_le_u] + have hneg_r_le_neg_e : -r ≤ -e := by linarith + have hcore_eq : + σ * Real.rpow (u / σ) (1 - e) * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) = + Real.rpow u (1 - e) * Real.rpow s (-e) * + Real.rpow (σ / (1 - s)) e := by + have hσe_pos : 0 < Real.rpow σ e := Real.rpow_pos_of_pos hσ e + have hs1e_pos : 0 < Real.rpow (1 - s) e := + Real.rpow_pos_of_pos hs1_pos e + have hσ_sub : + Real.rpow σ (1 - e) = σ / Real.rpow σ e := by + simpa using Real.rpow_sub hσ (1 : ℝ) e + have hdiv_uσ : + Real.rpow (u / σ) (1 - e) = + Real.rpow u (1 - e) / Real.rpow σ (1 - e) := by + simpa using Real.div_rpow hu_pos.le hσ.le (1 - e) + have hdiv_σs : + Real.rpow (σ / (1 - s)) e = + Real.rpow σ e / Real.rpow (1 - s) e := by + simpa using Real.div_rpow hσ.le hs1_pos.le e + have hs1_neg : + Real.rpow (1 - s) (-e) = (Real.rpow (1 - s) e)⁻¹ := by + simpa using Real.rpow_neg hs1_pos.le e + rw [hdiv_uσ, hdiv_σs, hσ_sub, hs1_neg] + field_simp [hσ.ne', hσe_pos.ne', hs1e_pos.ne'] + have hratio_nonneg : 0 ≤ σ / (1 - s) := div_nonneg hσ.le hs1_pos.le + have hratio_le_one : σ / (1 - s) ≤ 1 := by + rw [div_le_one₀ hs1_pos] + exact hσ_le_one_sub_s + have hratio_pow_le_one : Real.rpow (σ / (1 - s)) e ≤ 1 := by + calc + Real.rpow (σ / (1 - s)) e ≤ Real.rpow (1 : ℝ) e := + Real.rpow_le_rpow hratio_nonneg hratio_le_one he_nonneg + _ = 1 := by simp + have hu_pow_mono : + Real.rpow u (1 - e) ≤ Real.rpow u e := by + exact + Real.rpow_le_rpow_of_exponent_ge hu_pos hu_le_one he_le_one_sub_e + have hfirst_nonneg : 0 ≤ Real.rpow u (1 - e) * Real.rpow s (-e) := by + exact mul_nonneg (Real.rpow_nonneg hu_pos.le (1 - e)) + (Real.rpow_nonneg hs.le (-e)) + have hstep : + Real.rpow u (1 - e) * Real.rpow s (-e) * + Real.rpow (σ / (1 - s)) e ≤ + Real.rpow u e * Real.rpow s (-e) := by + calc + Real.rpow u (1 - e) * Real.rpow s (-e) * + Real.rpow (σ / (1 - s)) e ≤ + Real.rpow u (1 - e) * Real.rpow s (-e) * 1 := by + exact mul_le_mul_of_nonneg_left hratio_pow_le_one hfirst_nonneg + _ = Real.rpow u (1 - e) * Real.rpow s (-e) := by ring + _ ≤ Real.rpow u e * Real.rpow s (-e) := by + exact mul_le_mul_of_nonneg_right hu_pow_mono + (Real.rpow_nonneg hs.le (-e)) + have hratio_eq : + Real.rpow u e * Real.rpow s (-e) = Real.rpow r (-e) := by + have hue_pos : 0 < Real.rpow u e := Real.rpow_pos_of_pos hu_pos e + have hse_pos : 0 < Real.rpow s e := Real.rpow_pos_of_pos hs e + have hdiv_rs : + Real.rpow (s / u) (-e) = + Real.rpow s (-e) / Real.rpow u (-e) := by + simpa using Real.div_rpow hs.le hu_pos.le (-e) + have hs_neg : + Real.rpow s (-e) = (Real.rpow s e)⁻¹ := by + simpa using Real.rpow_neg hs.le e + have hu_neg : + Real.rpow u (-e) = (Real.rpow u e)⁻¹ := by + simpa using Real.rpow_neg hu_pos.le e + dsimp [r] + change Real.rpow u e * Real.rpow s (-e) = Real.rpow (s / u) (-e) + rw [hdiv_rs, hs_neg, hu_neg] + field_simp [hue_pos.ne', hse_pos.ne'] + have hrpow_le_self : + Real.rpow r (-e) ≤ Real.rpow r (-r) := by + exact Real.rpow_le_rpow_of_exponent_ge hr_pos hr_le_one hneg_r_le_neg_e + calc + σ * Real.rpow (u / σ) (1 - e) * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) + = Real.rpow u (1 - e) * Real.rpow s (-e) * + Real.rpow (σ / (1 - s)) e := hcore_eq + _ ≤ Real.rpow u e * Real.rpow s (-e) := hstep + _ = Real.rpow r (-e) := hratio_eq + _ ≤ Real.rpow r (-r) := hrpow_le_self + _ ≤ Real.exp 1 := rpow_neg_self_le_exp_one hr_pos hr_le_one + +private theorem caccioppoli_standardRadiusRoot_singular_le + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + let R : ℝ := + coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + σ * Real.rpow R p⁻¹ * Real.rpow s (-(q / p)) * + Real.rpow (1 - s) (-(q / p)) ≤ 36 * Real.exp 1 := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let β : ℝ := coarseCaccioppoliBeta s t + let p : ℝ := 2 + 4 * s / σ + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst β + let e : ℝ := q / p + let u : ℝ := 1 - t + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hp_pos : 0 < p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hp_ge_one : 1 ≤ p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_ge_one hs hst + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hp_inv_le_one : p⁻¹ ≤ 1 := inv_le_one_of_one_le₀ hp_ge_one + have hq_nonneg : 0 ≤ q := by + dsimp [q] + exact coarseCaccioppoli_power_nonneg hs hst + have he_nonneg : 0 ≤ e := by + dsimp [e] + positivity + have he_le_one : e ≤ 1 := by + dsimp [e, q, p, σ] + exact coarseCaccioppoli_power_div_noteExponent_le_one hs hst + have hone_sub_e_nonneg : 0 ≤ 1 - e := by linarith + have hone_sub_e_le_one : 1 - e ≤ 1 := by linarith + have hβ_ge_two : 2 ≤ β := by + dsimp [β] + exact coarseCaccioppoli_beta_ge_two hs hst + have hβ_nonneg : 0 ≤ β := by linarith + have hβ_pos : 0 < β := by linarith + have hbase_pos : 0 < 6 * β := by positivity + have hbase_nonneg : 0 ≤ 6 * β := hbase_pos.le + have hβp_eq : + β * p⁻¹ = 1 - e := by + have hp_ne : p ≠ 0 := hp_pos.ne' + have hβ_add_q : β + q = p := by + have hβ_eq_two_add_q : β = 2 + q := by + dsimp [β, q] + exact coarseCaccioppoli_beta_eq_two_add_power hst + have hp_eq_q : p = 2 + 2 * q := by + dsimp [p, q, σ, coarseCaccioppoliPower] + ring + rw [hβ_eq_two_add_q, hp_eq_q] + ring + dsimp [e] + field_simp [hp_ne] + linarith + have hβ_eq : β = 2 * u / σ := by + dsimp [β, u, σ, coarseCaccioppoliBeta, coarseCaccioppoliSigma] + have hstandard_root : + Real.rpow R p⁻¹ ≤ + 3 * Real.rpow (12 * (u / σ)) (1 - e) := by + have hmax : max 1 β = β := max_eq_right (by linarith) + have hthree_root_le : Real.rpow (3 : ℝ) p⁻¹ ≤ 3 := by + calc + Real.rpow (3 : ℝ) p⁻¹ ≤ Real.rpow (3 : ℝ) (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hp_inv_le_one + _ = 3 := by simp + unfold R + rw [coarseCaccioppoliStandardRadiusIterationConst_eq_growth, hmax] + have hsplit : + Real.rpow (3 * Real.rpow (6 * β) β) p⁻¹ = + Real.rpow (3 : ℝ) p⁻¹ * + Real.rpow (Real.rpow (6 * β) β) p⁻¹ := by + exact Real.mul_rpow (by norm_num : (0 : ℝ) ≤ 3) + (Real.rpow_nonneg hbase_nonneg β) + rw [hsplit] + have hbase_mul : + Real.rpow (Real.rpow (6 * β) β) p⁻¹ = + Real.rpow (6 * β) (β * p⁻¹) := by + exact (Real.rpow_mul hbase_nonneg β p⁻¹).symm + rw [hbase_mul, hβp_eq] + have hbase_eq : 6 * β = 12 * (u / σ) := by + rw [hβ_eq] + ring + rw [hbase_eq] + have htarget_nonneg : 0 ≤ 12 * (u / σ) := by + rw [← hbase_eq] + exact hbase_nonneg + exact mul_le_mul_of_nonneg_right hthree_root_le + (Real.rpow_nonneg htarget_nonneg (1 - e)) + have hu_eq : u = σ + s := by + dsimp [u, σ, coarseCaccioppoliSigma] + ring + have hu_le_one : u ≤ 1 := by + dsimp [u] + linarith + have hσ_le_one_sub_s : σ ≤ 1 - s := by + dsimp [σ, coarseCaccioppoliSigma] + linarith + have heq : e = s / (σ + 2 * s) := by + have hp_ne : p ≠ 0 := hp_pos.ne' + have hσ_ne : σ ≠ 0 := hσ_pos.ne' + have hden_ne : σ + 2 * s ≠ 0 := by nlinarith + have hp_eq_frac : p = (2 * (σ + 2 * s)) / σ := by + dsimp [p] + field_simp [hσ_ne] + ring + calc + e = q / p := rfl + _ = (2 * s / σ) / ((2 * (σ + 2 * s)) / σ) := by + rw [hp_eq_frac] + rfl + _ = s / (σ + 2 * s) := by + field_simp [hσ_ne, hden_ne] + have htwelfth_split : + Real.rpow (12 * (u / σ)) (1 - e) ≤ + 12 * Real.rpow (u / σ) (1 - e) := by + have hu_pos : 0 < u := by + rw [hu_eq] + nlinarith + have hratio_nonneg : 0 ≤ u / σ := div_nonneg hu_pos.le hσ_pos.le + have htwelfth_root : Real.rpow (12 : ℝ) (1 - e) ≤ 12 := by + calc + Real.rpow (12 : ℝ) (1 - e) ≤ Real.rpow (12 : ℝ) (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 12) hone_sub_e_le_one + _ = 12 := by simp + rw [show (12 : ℝ) * (u / σ) = 12 * (u / σ) by rfl] + have hmul : + Real.rpow ((12 : ℝ) * (u / σ)) (1 - e) = + Real.rpow (12 : ℝ) (1 - e) * + Real.rpow (u / σ) (1 - e) := by + exact Real.mul_rpow (by norm_num : (0 : ℝ) ≤ 12) + hratio_nonneg + rw [hmul] + exact mul_le_mul_of_nonneg_right htwelfth_root + (Real.rpow_nonneg hratio_nonneg (1 - e)) + have hsingular : + σ * Real.rpow (u / σ) (1 - e) * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) ≤ Real.exp 1 := + caccioppoli_sigma_u_root_singular_le_exp_one + hσ_pos hs hu_eq hu_le_one hσ_le_one_sub_s heq + have hs1_pos : 0 < 1 - s := lt_of_lt_of_le hσ_pos hσ_le_one_sub_s + have hsingularFactor_nonneg : + 0 ≤ Real.rpow s (-e) * Real.rpow (1 - s) (-e) := + mul_nonneg (Real.rpow_nonneg hs.le (-e)) + (Real.rpow_nonneg hs1_pos.le (-e)) + calc + σ * Real.rpow R p⁻¹ * Real.rpow s (-(q / p)) * + Real.rpow (1 - s) (-(q / p)) + = σ * Real.rpow R p⁻¹ * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) := by + dsimp [e] + _ ≤ σ * (3 * Real.rpow (12 * (u / σ)) (1 - e)) * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by + calc + σ * Real.rpow R p⁻¹ * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) = + (σ * Real.rpow R p⁻¹) * + (Real.rpow s (-e) * Real.rpow (1 - s) (-e)) := by ring + _ ≤ + (σ * (3 * Real.rpow (12 * (u / σ)) (1 - e))) * + (Real.rpow s (-e) * Real.rpow (1 - s) (-e)) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hstandard_root hσ_pos.le) + hsingularFactor_nonneg + _ = σ * (3 * Real.rpow (12 * (u / σ)) (1 - e)) * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by ring + _ ≤ σ * (3 * (12 * Real.rpow (u / σ) (1 - e))) * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by + calc + σ * (3 * Real.rpow (12 * (u / σ)) (1 - e)) * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) = + (σ * (3 * Real.rpow (12 * (u / σ)) (1 - e))) * + (Real.rpow s (-e) * Real.rpow (1 - s) (-e)) := by ring + _ ≤ + (σ * (3 * (12 * Real.rpow (u / σ) (1 - e)))) * + (Real.rpow s (-e) * Real.rpow (1 - s) (-e)) := by + have hleft : + σ * (3 * Real.rpow (12 * (u / σ)) (1 - e)) ≤ + σ * (3 * (12 * Real.rpow (u / σ) (1 - e))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left htwelfth_split (by norm_num)) + hσ_pos.le + exact mul_le_mul_of_nonneg_right hleft hsingularFactor_nonneg + _ = σ * (3 * (12 * Real.rpow (u / σ) (1 - e))) * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by ring + _ = 36 * + (σ * Real.rpow (u / σ) (1 - e) * Real.rpow s (-e) * + Real.rpow (1 - s) (-e)) := by ring + _ ≤ 36 * Real.exp 1 := by + exact mul_le_mul_of_nonneg_left hsingular (by norm_num) + +private theorem rpow_add_three_le_sum_rpow + {a b c α : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) (hc : 0 ≤ c) + (hα_nonneg : 0 ≤ α) (hα_le_one : α ≤ 1) : + Real.rpow (a + b + c) α ≤ + Real.rpow a α + Real.rpow b α + Real.rpow c α := by + have hab_nonneg : 0 ≤ a + b := add_nonneg ha hb + have habc_nonneg : 0 ≤ a + b + c := add_nonneg hab_nonneg hc + calc + Real.rpow (a + b + c) α ≤ Real.rpow (a + b) α + Real.rpow c α := + Real.rpow_add_le_add_rpow hab_nonneg hc hα_nonneg hα_le_one + _ ≤ (Real.rpow a α + Real.rpow b α) + Real.rpow c α := by + have h := Real.rpow_add_le_add_rpow ha hb hα_nonneg hα_le_one + exact add_le_add h (le_refl (Real.rpow c α)) + _ = Real.rpow a α + Real.rpow b α + Real.rpow c α := by ring + +private theorem rpow_mul_seven + {a b c d e f g α : ℝ} + (ha : 0 ≤ a) (hb : 0 ≤ b) (hc : 0 ≤ c) (hd : 0 ≤ d) + (he : 0 ≤ e) (hf : 0 ≤ f) (hg : 0 ≤ g) : + Real.rpow ((((((a * b) * c) * d) * e) * f) * g) α = + ((((((Real.rpow a α * Real.rpow b α) * Real.rpow c α) * + Real.rpow d α) * Real.rpow e α) * Real.rpow f α) * + Real.rpow g α) := by + have hab : 0 ≤ a * b := mul_nonneg ha hb + have habc : 0 ≤ (a * b) * c := mul_nonneg hab hc + have habcd : 0 ≤ ((a * b) * c) * d := mul_nonneg habc hd + have habcde : 0 ≤ (((a * b) * c) * d) * e := mul_nonneg habcd he + have habcdef : 0 ≤ ((((a * b) * c) * d) * e) * f := mul_nonneg habcde hf + have h₁ : + Real.rpow ((((((a * b) * c) * d) * e) * f) * g) α = + Real.rpow (((((a * b) * c) * d) * e) * f) α * + Real.rpow g α := + Real.mul_rpow habcdef hg + have h₂ : + Real.rpow (((((a * b) * c) * d) * e) * f) α = + Real.rpow ((((a * b) * c) * d) * e) α * Real.rpow f α := + Real.mul_rpow habcde hf + have h₃ : + Real.rpow ((((a * b) * c) * d) * e) α = + Real.rpow (((a * b) * c) * d) α * Real.rpow e α := + Real.mul_rpow habcd he + have h₄ : + Real.rpow (((a * b) * c) * d) α = + Real.rpow ((a * b) * c) α * Real.rpow d α := + Real.mul_rpow habc hd + have h₅ : + Real.rpow ((a * b) * c) α = + Real.rpow (a * b) α * Real.rpow c α := + Real.mul_rpow hab hc + have h₆ : + Real.rpow (a * b) α = Real.rpow a α * Real.rpow b α := + Real.mul_rpow ha hb + rw [h₁, h₂, h₃, h₄, h₅, h₆] + +private theorem rpow_le_self_of_one_le_of_exponent_le_one + {x α : ℝ} (hx : 1 ≤ x) (_hα_nonneg : 0 ≤ α) (hα_le_one : α ≤ 1) : + Real.rpow x α ≤ x := by + calc + Real.rpow x α ≤ Real.rpow x (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hx hα_le_one + _ = x := by simp + +private theorem rpow_le_bound_of_nonneg_le_of_one_le + {x X α : ℝ} (hx : 0 ≤ x) (hxX : x ≤ X) (hX : 1 ≤ X) + (hα_nonneg : 0 ≤ α) (hα_le_one : α ≤ 1) : + Real.rpow x α ≤ X := by + by_cases hx_le_one : x ≤ 1 + · exact (Real.rpow_le_one hx hx_le_one hα_nonneg).trans hX + · have hx_ge_one : 1 ≤ x := le_of_lt (lt_of_not_ge hx_le_one) + exact + (rpow_le_self_of_one_le_of_exponent_le_one hx_ge_one + hα_nonneg hα_le_one).trans hxX + +private theorem rpow_alphaBudget_le_envelope_mul_singular + {s Calpha A e : ℝ} + (hs : 0 < s) (_hs1 : s < 1) + (hCalpha_nonneg : 0 ≤ Calpha) (hCalpha_le : Calpha ≤ A * s⁻¹) + (hA_ge_one : 1 ≤ A) (he_nonneg : 0 ≤ e) (he_le_one : e ≤ 1) : + Real.rpow Calpha e ≤ A * Real.rpow s (-e) := by + have hA_nonneg : 0 ≤ A := zero_le_one.trans hA_ge_one + have hsinv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have htarget_nonneg : 0 ≤ A * s⁻¹ := mul_nonneg hA_nonneg hsinv_nonneg + have hA_root_le : Real.rpow A e ≤ A := + rpow_le_self_of_one_le_of_exponent_le_one hA_ge_one he_nonneg he_le_one + have hsplit : + Real.rpow (A * s⁻¹) e = Real.rpow A e * Real.rpow s (-e) := by + have hinv : + Real.rpow s⁻¹ e = Real.rpow s (-e) := by + have h₁ : Real.rpow s⁻¹ e = (Real.rpow s e)⁻¹ := by + exact Real.inv_rpow hs.le e + have h₂ : Real.rpow s (-e) = (Real.rpow s e)⁻¹ := by + exact Real.rpow_neg hs.le e + rw [h₁, h₂] + have hmul : + Real.rpow (A * s⁻¹) e = Real.rpow A e * Real.rpow s⁻¹ e := + Real.mul_rpow hA_nonneg hsinv_nonneg + rw [hmul, hinv] + calc + Real.rpow Calpha e ≤ Real.rpow (A * s⁻¹) e := + Real.rpow_le_rpow hCalpha_nonneg hCalpha_le he_nonneg + _ = Real.rpow A e * Real.rpow s (-e) := hsplit + _ ≤ A * Real.rpow s (-e) := by + exact mul_le_mul_of_nonneg_right hA_root_le (Real.rpow_nonneg hs.le (-e)) + +private theorem caccioppoli_localQuadraticRoot_le_envelope + {p Ccross X : ℝ} + (hp_pos : 0 < p) (hp_ge_one : 1 ≤ p) + (hCcross_nonneg : 0 ≤ Ccross) (hCcross_le : Ccross ≤ X) + (hX_ge_one : 1 ≤ X) : + Real.rpow ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ)) p⁻¹ ≤ + (6561 : ℝ) * 6561 * X ^ (2 : ℕ) := by + let M : ℝ := (6561 : ℝ) * 6561 * X ^ (2 : ℕ) + have hX_nonneg : 0 ≤ X := zero_le_one.trans hX_ge_one + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hp_inv_le_one : p⁻¹ ≤ 1 := inv_le_one_of_one_le₀ hp_ge_one + have hC_sq_le : Ccross ^ (2 : ℕ) ≤ X ^ (2 : ℕ) := by + nlinarith [sq_nonneg (X - Ccross)] + have hbase_le : + (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) ≤ M := by + dsimp [M] + exact mul_le_mul_of_nonneg_left hC_sq_le (by norm_num) + have hbase_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) := by positivity + have hM_ge_one : 1 ≤ M := by + dsimp [M] + nlinarith [sq_nonneg X, hX_ge_one] + calc + Real.rpow ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ)) p⁻¹ ≤ + Real.rpow M p⁻¹ := + Real.rpow_le_rpow hbase_nonneg hbase_le hp_inv_nonneg + _ ≤ M := + rpow_le_self_of_one_le_of_exponent_le_one hM_ge_one + hp_inv_nonneg hp_inv_le_one + _ = (6561 : ℝ) * 6561 * X ^ (2 : ℕ) := rfl + +private theorem caccioppoli_frontBranchRoot_le_envelope + {s t Calpha Ccross A X : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hCalpha_nonneg : 0 ≤ Calpha) (hCalpha_le : Calpha ≤ A * s⁻¹) + (hCcross_nonneg : 0 ≤ Ccross) (hCcross_le : Ccross ≤ X) + (hA_ge_one : 1 ≤ A) (hX_ge_one : 1 ≤ X) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + let e : ℝ := q / p + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + Real.rpow B₂ p⁻¹ ≤ + (9 : ℝ) * 4 * 81 * X * X * A * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + let e : ℝ := q / p + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + have hs1 : s < 1 := by linarith + have hs1_pos : 0 < 1 - s := by linarith + have hp_pos : 0 < p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hp_ge_one : 1 ≤ p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_ge_one hs hst + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hp_inv_le_one : p⁻¹ ≤ 1 := inv_le_one_of_one_le₀ hp_ge_one + have hq_nonneg : 0 ≤ q := by + dsimp [q] + exact coarseCaccioppoli_power_nonneg hs hst + have he_nonneg : 0 ≤ e := by + dsimp [e] + exact div_nonneg hq_nonneg hp_pos.le + have he_le_one : e ≤ 1 := by + dsimp [e, q, p, σ] + exact coarseCaccioppoli_power_div_noteExponent_le_one hs hst + have hq_mul_inv : q * p⁻¹ = e := by + dsimp [e] + rw [div_eq_mul_inv] + have h4_nonneg : 0 ≤ Real.rpow (4 : ℝ) q := + Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) q + have h81_nonneg : 0 ≤ Real.rpow (81 : ℝ) q := + Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) q + have hCalpha_q_nonneg : 0 ≤ Real.rpow Calpha q := + Real.rpow_nonneg hCalpha_nonneg q + have hs1_q_nonneg : 0 ≤ Real.rpow (1 - s) (-q) := + Real.rpow_nonneg hs1_pos.le (-q) + have hsplit : + Real.rpow B₂ p⁻¹ = + ((((((Real.rpow (9 : ℝ) p⁻¹ * + Real.rpow (Real.rpow (4 : ℝ) q) p⁻¹) * + Real.rpow (Real.rpow (81 : ℝ) q) p⁻¹) * + Real.rpow Ccross p⁻¹) * Real.rpow Ccross p⁻¹) * + Real.rpow (Real.rpow Calpha q) p⁻¹) * + Real.rpow (Real.rpow (1 - s) (-q)) p⁻¹) := by + dsimp [B₂] + simpa [mul_assoc] using + rpow_mul_seven + (a := (9 : ℝ)) (b := Real.rpow (4 : ℝ) q) + (c := Real.rpow (81 : ℝ) q) (d := Ccross) (e := Ccross) + (f := Real.rpow Calpha q) (g := Real.rpow (1 - s) (-q)) + (α := p⁻¹) + (by norm_num : 0 ≤ (9 : ℝ)) h4_nonneg h81_nonneg + hCcross_nonneg hCcross_nonneg hCalpha_q_nonneg hs1_q_nonneg + have h9_root : Real.rpow (9 : ℝ) p⁻¹ ≤ 9 := + rpow_le_self_of_one_le_of_exponent_le_one + (by norm_num : (1 : ℝ) ≤ 9) hp_inv_nonneg hp_inv_le_one + have h4_root : Real.rpow (Real.rpow (4 : ℝ) q) p⁻¹ ≤ 4 := by + have hmul : + Real.rpow (Real.rpow (4 : ℝ) q) p⁻¹ = + Real.rpow (4 : ℝ) (q * p⁻¹) := + (Real.rpow_mul (by norm_num : 0 ≤ (4 : ℝ)) q p⁻¹).symm + rw [hmul, hq_mul_inv] + exact rpow_le_self_of_one_le_of_exponent_le_one + (by norm_num : (1 : ℝ) ≤ 4) he_nonneg he_le_one + have h81_root : Real.rpow (Real.rpow (81 : ℝ) q) p⁻¹ ≤ 81 := by + have hmul : + Real.rpow (Real.rpow (81 : ℝ) q) p⁻¹ = + Real.rpow (81 : ℝ) (q * p⁻¹) := + (Real.rpow_mul (by norm_num : 0 ≤ (81 : ℝ)) q p⁻¹).symm + rw [hmul, hq_mul_inv] + exact rpow_le_self_of_one_le_of_exponent_le_one + (by norm_num : (1 : ℝ) ≤ 81) he_nonneg he_le_one + have hCcross_root : Real.rpow Ccross p⁻¹ ≤ X := + rpow_le_bound_of_nonneg_le_of_one_le hCcross_nonneg hCcross_le hX_ge_one + hp_inv_nonneg hp_inv_le_one + have hCalpha_root : + Real.rpow (Real.rpow Calpha q) p⁻¹ ≤ A * Real.rpow s (-e) := by + have hmul : + Real.rpow (Real.rpow Calpha q) p⁻¹ = + Real.rpow Calpha (q * p⁻¹) := + (Real.rpow_mul hCalpha_nonneg q p⁻¹).symm + rw [hmul, hq_mul_inv] + exact + rpow_alphaBudget_le_envelope_mul_singular hs hs1 hCalpha_nonneg + hCalpha_le hA_ge_one he_nonneg he_le_one + have hs1_root : + Real.rpow (Real.rpow (1 - s) (-q)) p⁻¹ = + Real.rpow (1 - s) (-e) := by + have hmul : + Real.rpow (Real.rpow (1 - s) (-q)) p⁻¹ = + Real.rpow (1 - s) ((-q) * p⁻¹) := + (Real.rpow_mul hs1_pos.le (-q) p⁻¹).symm + have hexp : (-q) * p⁻¹ = -e := by + rw [← hq_mul_inv] + ring + rw [hmul, hexp] + change Real.rpow B₂ p⁻¹ ≤ + (9 : ℝ) * 4 * 81 * X * X * A * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) + rw [hsplit, hs1_root] + calc + ((((((Real.rpow (9 : ℝ) p⁻¹ * + Real.rpow (Real.rpow (4 : ℝ) q) p⁻¹) * + Real.rpow (Real.rpow (81 : ℝ) q) p⁻¹) * + Real.rpow Ccross p⁻¹) * Real.rpow Ccross p⁻¹) * + Real.rpow (Real.rpow Calpha q) p⁻¹) * + Real.rpow (1 - s) (-e)) + ≤ ((((((9 : ℝ) * 4) * 81) * X) * X) * + (A * Real.rpow s (-e))) * Real.rpow (1 - s) (-e) := by + gcongr <;> + first + | exact Real.rpow_nonneg hs1_pos.le (-e) + | exact Real.rpow_nonneg hCalpha_q_nonneg p⁻¹ + | exact Real.rpow_nonneg hCcross_nonneg p⁻¹ + | exact Real.rpow_nonneg h81_nonneg p⁻¹ + | exact Real.rpow_nonneg h4_nonneg p⁻¹ + _ = (9 : ℝ) * 4 * 81 * X * X * A * + Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by ring + +theorem caccioppoliStandardExplicitNoteBoundSplit_le_envelope + {s t Calpha Ccross A X : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hCalpha_nonneg : 0 ≤ Calpha) (hCalpha_le : Calpha ≤ A * s⁻¹) + (hCcross_nonneg : 0 ≤ Ccross) (hCcross_le : Ccross ≤ X) + (hA_ge_one : 1 ≤ A) (hX_ge_one : 1 ≤ X) : + caccioppoliStandardExplicitNoteBoundSplit s t Calpha Ccross ≤ + 36 * ((6561 : ℝ) * 6561 * X ^ (2 : ℕ)) + + 36 * Real.exp 1 * ((9 : ℝ) * 4 * 81 * X * X * A) + 1 := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let e : ℝ := q / p + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + let M₁ : ℝ := (6561 : ℝ) * 6561 * X ^ (2 : ℕ) + let K₂ : ℝ := (9 : ℝ) * 4 * 81 * X * X * A + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hσ_nonneg : 0 ≤ σ := hσ_pos.le + have hσ_le_one : σ ≤ 1 := by + dsimp [σ, coarseCaccioppoliSigma] + linarith + have hp_pos : 0 < p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hp_ge_one : 1 ≤ p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_ge_one hs hst + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hp_inv_le_one : p⁻¹ ≤ 1 := inv_le_one_of_one_le₀ hp_ge_one + have hq_nonneg : 0 ≤ q := by + dsimp [q] + exact coarseCaccioppoli_power_nonneg hs hst + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact + coarseCaccioppoliStandardRadiusIterationConst_nonneg + (coarseCaccioppoli_beta_nonneg hs hst) + have hB₁_nonneg : 0 ≤ B₁ := by + dsimp [B₁] + positivity + have hs1_pos : 0 < 1 - s := by linarith + have hB₂_nonneg : 0 ≤ B₂ := by + dsimp [B₂] + positivity + have hRB₁_nonneg : 0 ≤ R * B₁ := mul_nonneg hR_nonneg hB₁_nonneg + have hRB₂_nonneg : 0 ≤ R * B₂ := mul_nonneg hR_nonneg hB₂_nonneg + have hsum_nonneg : 0 ≤ R * B₁ + R * B₂ := add_nonneg hRB₁_nonneg hRB₂_nonneg + have hmain_root : + Real.rpow (R * (B₁ + B₂) + 1) p⁻¹ ≤ + Real.rpow (R * B₁) p⁻¹ + Real.rpow (R * B₂) p⁻¹ + + Real.rpow (1 : ℝ) p⁻¹ := by + have hrewrite : R * (B₁ + B₂) + 1 = R * B₁ + R * B₂ + 1 := by ring + rw [hrewrite] + exact + rpow_add_three_le_sum_rpow hRB₁_nonneg hRB₂_nonneg + (by norm_num : 0 ≤ (1 : ℝ)) hp_inv_nonneg hp_inv_le_one + have hRroot_nonneg : 0 ≤ Real.rpow R p⁻¹ := Real.rpow_nonneg hR_nonneg p⁻¹ + have hB₁root_nonneg : 0 ≤ Real.rpow B₁ p⁻¹ := Real.rpow_nonneg hB₁_nonneg p⁻¹ + have hσRroot_nonneg : 0 ≤ σ * Real.rpow R p⁻¹ := + mul_nonneg hσ_nonneg hRroot_nonneg + have hσRroot_le : + σ * Real.rpow R p⁻¹ ≤ 36 := by + dsimp [σ, p, R] + simpa using + coarseCaccioppoli_sigma_mul_standardRadiusIterationConst_root_le + hs ht hst + have hB₁root_le : Real.rpow B₁ p⁻¹ ≤ M₁ := by + dsimp [B₁, M₁] + exact + caccioppoli_localQuadraticRoot_le_envelope + hp_pos hp_ge_one hCcross_nonneg hCcross_le hX_ge_one + have hterm₁ : + σ * Real.rpow (R * B₁) p⁻¹ ≤ 36 * M₁ := by + have hsplit : + Real.rpow (R * B₁) p⁻¹ = + Real.rpow R p⁻¹ * Real.rpow B₁ p⁻¹ := + Real.mul_rpow hR_nonneg hB₁_nonneg + calc + σ * Real.rpow (R * B₁) p⁻¹ = + (σ * Real.rpow R p⁻¹) * Real.rpow B₁ p⁻¹ := by + rw [hsplit] + ring + _ ≤ 36 * M₁ := + mul_le_mul hσRroot_le hB₁root_le hB₁root_nonneg + (by positivity : 0 ≤ (36 : ℝ)) + have hB₂root_le : + Real.rpow B₂ p⁻¹ ≤ + K₂ * Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by + dsimp [B₂, K₂, e, q, p, σ] + simpa [mul_assoc] using + caccioppoli_frontBranchRoot_le_envelope + (s := s) (t := t) (Calpha := Calpha) (Ccross := Ccross) + (A := A) (X := X) + hs ht hst hCalpha_nonneg hCalpha_le hCcross_nonneg hCcross_le + hA_ge_one hX_ge_one + have hK₂_nonneg : 0 ≤ K₂ := by + dsimp [K₂] + positivity + have hsingular : + σ * Real.rpow R p⁻¹ * Real.rpow s (-e) * + Real.rpow (1 - s) (-e) ≤ 36 * Real.exp 1 := by + dsimp [σ, q, p, R, e] + simpa using caccioppoli_standardRadiusRoot_singular_le hs ht hst + have hterm₂ : + σ * Real.rpow (R * B₂) p⁻¹ ≤ 36 * Real.exp 1 * K₂ := by + have hsplit : + Real.rpow (R * B₂) p⁻¹ = + Real.rpow R p⁻¹ * Real.rpow B₂ p⁻¹ := + Real.mul_rpow hR_nonneg hB₂_nonneg + calc + σ * Real.rpow (R * B₂) p⁻¹ = + (σ * Real.rpow R p⁻¹) * Real.rpow B₂ p⁻¹ := by + rw [hsplit] + ring + _ ≤ (σ * Real.rpow R p⁻¹) * + (K₂ * Real.rpow s (-e) * Real.rpow (1 - s) (-e)) := by + exact mul_le_mul_of_nonneg_left hB₂root_le hσRroot_nonneg + _ = K₂ * (σ * Real.rpow R p⁻¹ * Real.rpow s (-e) * + Real.rpow (1 - s) (-e)) := by ring + _ ≤ K₂ * (36 * Real.exp 1) := + mul_le_mul_of_nonneg_left hsingular hK₂_nonneg + _ = 36 * Real.exp 1 * K₂ := by ring + have hterm₃ : σ * Real.rpow (1 : ℝ) p⁻¹ ≤ 1 := by + simpa using hσ_le_one + unfold caccioppoliStandardExplicitNoteBoundSplit + dsimp [σ, p, q, R, B₁, B₂] + calc + σ * Real.rpow (R * (B₁ + B₂) + 1) p⁻¹ ≤ + σ * (Real.rpow (R * B₁) p⁻¹ + Real.rpow (R * B₂) p⁻¹ + + Real.rpow (1 : ℝ) p⁻¹) := + mul_le_mul_of_nonneg_left hmain_root hσ_nonneg + _ = + σ * Real.rpow (R * B₁) p⁻¹ + + σ * Real.rpow (R * B₂) p⁻¹ + + σ * Real.rpow (1 : ℝ) p⁻¹ := by ring + _ ≤ 36 * M₁ + 36 * Real.exp 1 * K₂ + 1 := by + linarith + _ = + 36 * ((6561 : ℝ) * 6561 * X ^ (2 : ℕ)) + + 36 * Real.exp 1 * ((9 : ℝ) * 4 * 81 * X * X * A) + 1 := by + rfl + + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseFluxResponseRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseFluxResponseRHS.lean new file mode 100644 index 0000000000..46f390f6bd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarseFluxResponseRHS.lean @@ -0,0 +1,219 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged + +/-! # Coarse Flux Response RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.2.4: Coarse-grained flux-response estimate with right-hand side + +This file assembles the public theorem package for +`l.coarse.grained.flux.response.RHS.deterministic.theory`. The left-hand side +uses the genuine dual negative Besov norm, not the concrete negative seminorm +from Section 3.1. + +## Audit tag + +Claim: expose the single public coarse flux-response-with-RHS package using +the genuine dual negative Besov norm. + +Downstream target: `InhomogeneousEquationsTheory` and the Ch3.3 coarse-graining +handoff. This file should not introduce additional RHS package variants. +-/ + +noncomputable section + +open ZeroTraceDirichletCorrectorData + +/-- Public theorem package for the coarse-grained flux-response estimate with +right-hand side. -/ +structure CoarseFluxResponseRHSTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (a0 : ConstantCoeffMatrix d) + (u : ForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) ≤ + coarseFluxResponseWithRHSRHS C Q a a0 s g u + +/-- Fully proved coarse-grained flux-response estimate with right-hand side. -/ +theorem coarseFluxResponseRHS_negativeDual_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (a0 : ConstantCoeffMatrix d) + (u : ForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) ≤ + coarseFluxResponseWithRHSRHS + ((d : ℝ) ^ 2 * + max 1 + (((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1))) + Q a a0 s g u := by + let A : CoeffField d := publicCoeffField Q a + let B : ℝ := _root_.Homogenization.coarseFluxResponseRHSBound Q A + a0.matrix s (forcedSolutionGradientField u) g + let K : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + let K₁ : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) + let M : ℝ := zeroTraceDirichletCorrectedWeakFluxApexConstant d s + let M₁ : ℝ := zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + let C₀ : ℝ := max 1 (K₁ * (2 * M₁)) + let C : ℝ := (d : ℝ) ^ 2 * C₀ + have hs_le : s ≤ 1 := hs_lt.le + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hK₁_nonneg : 0 ≤ K₁ := by + dsimp [K₁] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hK_le : K ≤ K₁ := by + dsimp [K, K₁] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + exact mul_le_mul_of_nonneg_left hpow (by exact_mod_cast Nat.zero_le d) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d s + have hM_le : M ≤ M₁ := by + dsimp [M, M₁] + have hdisplay : + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s ≤ + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d 1 := by + unfold zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + have hpow : + (3 : ℝ) ^ ((d : ℝ) + s) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + have hinner : + (3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2 ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + nlinarith + have hKM_le_C₀ : K * (2 * M) ≤ C₀ := by + have htwoM_nonneg : 0 ≤ 2 * M := by nlinarith + have htwoM_le : 2 * M ≤ 2 * M₁ := by nlinarith [hM_le] + have hprod : K * (2 * M) ≤ K₁ * (2 * M₁) := + mul_le_mul hK_le htwoM_le htwoM_nonneg hK₁_nonneg + exact hprod.trans (le_max_right 1 (K₁ * (2 * M₁))) + have hB_nonneg : 0 ≤ B := by + dsimp [B, A] + exact coarseFluxResponseRHSBound_nonneg_of_bddAbove + Q (publicCoeffField Q a) a0.matrix + (forcedSolutionGradientField u) g hs hg.partialSeminorms_bddAbove + have hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) + MultiscaleExponent.infinity A a0.matrix) := by + dsimp [A] + exact homogenizationErrorOnCube_publicCoeffField_infinity_one_terms_summable + a Q a0.matrix hs + have hdet : + cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect A a0.matrix (forcedSolutionGradientField u)) ≤ + 2 * M * B := by + have hraw := + ZeroTraceDirichletCorrectorData.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy + (Q := Q) (a := A) (a0 := a0.matrix) (s := s) (g := g) + (v := publicH1ToCubeSet u.toH1) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (lam0 := a0.lam) (Lam0 := a0.Lam) + hs hs_le (by simpa [A] using publicCoeffField_isEllipticFieldOn_cubeSet Q a) + a0.elliptic a0.isSymm + (by + simpa [A] using + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution) + hg hresponseSum + simpa [A, B, M, forcedSolutionGradientField, publicH1ToCubeSet_grad] using hraw + have hdual : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) ≤ + K * cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect A a0.matrix (forcedSolutionGradientField u)) := by + simpa [K, A] using + forcedSolutionFluxDefect_dualNorm_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo_publicCoeffField + (Q := Q) (a := a) (a0 := a0) (s := s) u hs + have hbounded : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) ≤ C₀ * B := by + calc + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) + ≤ K * cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect A a0.matrix (forcedSolutionGradientField u)) := hdual + _ ≤ K * (2 * M * B) := mul_le_mul_of_nonneg_left hdet hK_nonneg + _ = (K * (2 * M)) * B := by ring + _ ≤ C₀ * B := mul_le_mul_of_nonneg_right hKM_le_C₀ hB_nonneg + have herror : + HomogenizationErrorOnCube Q s MultiscaleExponent.infinity + (MultiscaleExponent.finite 1) (publicCoeffField Q a) a0.matrix = + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0.matrix := + homogenizationErrorOnCube_publicCoeffField_infinity_one_eq_ch02 + a Q s a0.matrix + have hC₀_nonneg : 0 ≤ C₀ := by + dsimp [C₀] + exact le_trans zero_le_one (le_max_left 1 (K₁ * (2 * M₁))) + have hBsemi_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g + hg.partialSeminorms_bddAbove + have hH_nonneg : + 0 ≤ Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0.matrix := + Ch02.HomogenizationErrorOnCube_infinity_one_nonneg Q a a0.matrix hs + have hrhs_le : + C₀ * B ≤ coarseFluxResponseWithRHSRHS C Q a a0 s g u := by + dsimp [B, A, C] + exact + coarseFluxResponseRHSBound_publicCoeffField_le_dim_sq_mul_public_of_homogenizationErrorOnCube_eq + C₀ Q a a0 u hC₀_nonneg hs hBsemi_nonneg hH_nonneg herror + simpa [C] using! hbounded.trans hrhs_le + +/-- Fully proved public coarse-grained flux-response theorem package with RHS. -/ +theorem coarseFluxResponseRHSTheory {d : ℕ} [NeZero d] : + CoarseFluxResponseRHSTheory d := by + refine ⟨?_⟩ + refine ⟨(d : ℝ) ^ 2 * max 1 + (((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1)), ?_, ?_⟩ + · have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + exact mul_pos (sq_pos_of_pos hd_pos) + (lt_of_lt_of_le zero_lt_one + (le_max_left 1 + (((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + (2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1)))) + · intro Q a s g a0 u hs hs_lt hg + exact coarseFluxResponseRHS_negativeDual_le + (Q := Q) (a := a) (a0 := a0) (u := u) hs hs_lt hg + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare.lean new file mode 100644 index 0000000000..59902be9b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare.lean @@ -0,0 +1,460 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Infinity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! # Coarse Poincare -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.1.1: Coarse-grained Poincare inequality + +This file contains the public note-facing coarse Poincare theorem package. +Helper estimates live in the `CoarsePoincare/` submodules. + +## Audit tag + +Claim: prove and package the Book-facing coarse Poincare estimate for solution +gradients and energy density on triadic cubes. + +Downstream target: Chapter 3 public theorem aggregation and later +inhomogeneous estimates. This file should keep one `CoarsePoincareTheory` +surface; helper estimates belong in the `CoarsePoincare/` submodules. +-/ + +noncomputable section + +open scoped BigOperators + +/-- Gradient part of the note-facing coarse-grained Poincare theorem. + +The proved API is uniform for every `s > 0`, and therefore strengthens the +ABK26/source range `0 < s ≤ 1`; it is not presented as a literal identity of +ranges. In particular, admissible `q` includes the endpoint `s = 1`, `q = 2`. +-/ +theorem coarsePoincareGradient_negativeBesov_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {q : Ch02.MultiscaleExponent} (u : CubeSolution Q a) + (hs : 0 < s) (hq : q.IsAdmissible) : + scaleNormalizedNegativeBesovVectorNorm Q s q + (solutionGradientField u) ≤ + coarsePoincareGradientRHS Q a s q u := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let aQ : Ch02.CoeffOn U := a.coeffOn Q + let ap : Ch02.CoeffOn U := Internal.Ch02.BookCh02.pointwiseCoeffOn U aQ + let A : CoeffField d := Internal.Ch02.BookCh02.pointwiseCoeffField U aQ + have haeeq_ap_a : Ch02.CoeffOn.AEEq ap aQ := by + simpa [ap] using Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq U aQ + have haeeq_a_ap : Ch02.CoeffOn.AEEq aQ ap := haeeq_ap_a.symm + let uPw : Ch02.Solution U ap := Ch02.Solution.ofAEEq haeeq_a_ap u + let uOpen : AHarmonicFunction A (openCubeSet Q) := by + simpa [U, ap, A] using! uPw + let uCube : AHarmonicFunction A (cubeSet Q) := uOpen.toCubeSet + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand A uCube x + have hEll : IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet Q) A := by + simpa [U, aQ, A] using pointwiseCoeffField_isEllipticFieldOn_cubeSet Q aQ + have hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) aQ.lam aQ.Lam := + openCubeOriginEllipticRecoveryExistence (d := d) + (lam := aQ.lam) (Lam := aQ.Lam) + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + simpa [energy] using + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) A hEll uCube + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := by + simpa [energy] using + ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) uCube + have hgrad : + Homogenization.CubeAverageGradientEnergyControl Q A + (fun x => uCube.toH1.grad x) energy := by + simpa [energy] using + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := A) hEll uCube hOrigin + have hgradient_local_public : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R (fun x => uCube.toH1.grad x)) ≤ + Ch02.coarseSigmaStarInvMatrixNorm R a * cubeAverage R energy := by + intro j R hR + have hj : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hj] + simpa using hR + have hEllR : + IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet R) A := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A, U, aQ] using + Ch02.pointwiseCoeffField_openCube_descendant_data Q aQ + have hDataR : OpenCubeDeterministicCoarseData R A := + hData _ hj R hRscale + let w : AHarmonicFunction A (cubeSet R) := uCube.restrictToSubcube hEll hR + have hraw := + cubeAverageGradient_le_matrixNorm_sigmaStarInv_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + (R := R) (a := A) hEllR hDataR w + have henergy_R : + cubeAverage R (scalarVariationEnergyIntegrand A w) = + cubeAverage R energy := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simp [w, energy, scalarVariationEnergyIntegrand] + have hnorm_R : + Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) A) = + Ch02.coarseSigmaStarInvMatrixNorm R a := by + simpa [A, U, aQ] using + (Ch02.coarseSigmaStarInvMatrixNorm_eq_matrixNorm_sigmaStarInv_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) hj hRscale).symm + rw [henergy_R, hnorm_R] at hraw + simpa [w] using hraw + have hgradient_depth : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q (fun x => uCube.toH1.grad x) n ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy := by + intro n + exact negativeBesovVectorDepthAverage_le_publicSigmaStarInvEnergy + (Q := Q) a (fun x => uCube.toH1.grad x) energy + henergy_nonneg henergy_int hgradient_local_public n + have henergy_eq : + cubeAverage Q energy = + Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + have henergy_fun : + energy = Ch02.variationEnergyIntegrand U ap uPw := by + funext x + simp [energy, scalarVariationEnergyIntegrand, Ch02.variationEnergyIntegrand, + uCube, uOpen, uPw, U, ap, A, Internal.Ch02.BookCh02.pointwiseCoeffOn] + rfl + have hcube_pw : + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := by + calc + cubeAverage Q energy = volumeAverage (cubeSet Q) energy := by + rw [volumeAverage_cubeSet_eq_cubeAverage] + _ = volumeAverage (openCubeSet Q) energy := + ScalarCanonicalMaximizer.volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q energy + _ = Ch02.average U (Ch02.variationEnergyIntegrand U ap uPw) := by + rw [henergy_fun] + exact (Internal.Ch02.book_average_eq_volumeAverage U + (Ch02.variationEnergyIntegrand U ap uPw)).symm + calc + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := hcube_pw + _ = Ch02.variationEnergyValue U aQ u := by + simpa [uPw] using Ch02.variationEnergyValue_ofAEEq haeeq_a_ap u + _ = Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + rfl + have hgrad_ae : + (fun x => uCube.toH1.grad x) + =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] solutionGradientField u := by + exact Filter.Eventually.of_forall fun x => by + simp [solutionGradientField, uCube, uOpen, uPw, U, ap, A] + rfl + cases q with + | finite q => + have hq' : 1 ≤ q := by simpa using hq + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq' + have hraw : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (fun x => uCube.toH1.grad x) ≤ + poincareDiscountFactor s (.finite q) * + poincareLowerEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := + finite_gradient_norm_le_of_cubeAverageEnergyControl + Q a s q hs hq' (fun x => uCube.toH1.grad x) energy + henergy_nonneg hgradient_depth + (summable_public_sigmaStar_series Q a hs hqpos) + (tsum_public_sigmaStar_series_eq_lambdaSq Q a hs hqpos) + have hnorm_eq : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (fun x => uCube.toH1.grad x) = + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (solutionGradientField u) := + scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet s (.finite q) hgrad_ae + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (solutionGradientField u) + = + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (fun x => uCube.toH1.grad x) := hnorm_eq.symm + _ ≤ + poincareDiscountFactor s (.finite q) * + poincareLowerEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := hraw + _ = coarsePoincareGradientRHS Q a s (.finite q) u := by + simp [coarsePoincareGradientRHS, solutionEnergyNorm, henergy_eq] + | infinity => + have hraw : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (fun x => uCube.toH1.grad x) ≤ + poincareDiscountFactor s .infinity * + poincareLowerEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := + infinity_gradient_norm_le_of_cubeAverageEnergyControl + Q a s hs (fun x => uCube.toH1.grad x) energy + henergy_nonneg hgradient_depth + have hnorm_eq : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (fun x => uCube.toH1.grad x) = + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (solutionGradientField u) := + scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet s .infinity hgrad_ae + calc + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (solutionGradientField u) + = + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (fun x => uCube.toH1.grad x) := hnorm_eq.symm + _ ≤ + poincareDiscountFactor s .infinity * + poincareLowerEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := hraw + _ = coarsePoincareGradientRHS Q a s .infinity u := by + simp [coarsePoincareGradientRHS, solutionEnergyNorm, henergy_eq] + +/-- Flux part of the note-facing coarse-grained Poincare theorem. + +The proved API is uniform for every `s > 0`, and therefore strengthens the +ABK26/source range `0 < s ≤ 1`; it is not presented as a literal identity of +ranges. In particular, admissible `q` includes the endpoint `s = 1`, `q = 2`. +-/ +theorem coarsePoincareFlux_negativeBesov_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {q : Ch02.MultiscaleExponent} (u : CubeSolution Q a) + (hs : 0 < s) (hq : q.IsAdmissible) : + scaleNormalizedNegativeBesovVectorNorm Q s q + (solutionFluxField Q a u) ≤ + coarsePoincareFluxRHS Q a s q u := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let aQ : Ch02.CoeffOn U := a.coeffOn Q + let ap : Ch02.CoeffOn U := Internal.Ch02.BookCh02.pointwiseCoeffOn U aQ + let A : CoeffField d := Internal.Ch02.BookCh02.pointwiseCoeffField U aQ + have haeeq_ap_a : Ch02.CoeffOn.AEEq ap aQ := by + simpa [ap] using Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq U aQ + have haeeq_a_ap : Ch02.CoeffOn.AEEq aQ ap := haeeq_ap_a.symm + let uPw : Ch02.Solution U ap := Ch02.Solution.ofAEEq haeeq_a_ap u + let uOpen : AHarmonicFunction A (openCubeSet Q) := by + simpa [U, ap, A] using! uPw + let uCube : AHarmonicFunction A (cubeSet Q) := uOpen.toCubeSet + let oldFlux : Vec d → Vec d := fun x => matVecMul (A x) (uCube.toH1.grad x) + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand A uCube x + have hEll : IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet Q) A := by + simpa [U, aQ, A] using pointwiseCoeffField_isEllipticFieldOn_cubeSet Q aQ + have hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) aQ.lam aQ.Lam := + openCubeOriginEllipticRecoveryExistence (d := d) + (lam := aQ.lam) (Lam := aQ.Lam) + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + simpa [energy] using + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) A hEll uCube + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := by + simpa [energy] using + ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) uCube + have hflux : + Homogenization.CubeAverageFluxEnergyControl Q A oldFlux energy := by + simpa [oldFlux, energy] using + cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := A) hEll uCube hOrigin + have hflux_local_public : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R oldFlux) ≤ + Ch02.coarseBMatrixNorm R a * cubeAverage R energy := by + intro j R hR + have hj : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hj] + simpa using hR + have hEllR : + IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet R) A := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hData : + OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A, U, aQ] using + Ch02.pointwiseCoeffField_openCube_descendant_data Q aQ + have hDataR : OpenCubeDeterministicCoarseData R A := + hData _ hj R hRscale + let w : AHarmonicFunction A (cubeSet R) := uCube.restrictToSubcube hEll hR + have hraw := + cubeAverageFlux_le_matrixNorm_bCoarse_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + (R := R) (a := A) hEllR hDataR w + have hflux_R : + cubeAverageVec R (fun x => matVecMul (A x) (w.toH1.grad x)) = + cubeAverageVec R oldFlux := by + apply cubeAverageVec_eq_of_eq_on_cubeSet + intro x hx + simp [w, oldFlux] + have henergy_R : + cubeAverage R (scalarVariationEnergyIntegrand A w) = + cubeAverage R energy := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simp [w, energy, scalarVariationEnergyIntegrand] + have hnorm_R : + Ch02.matrixNorm + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (cubeSet R) A) + (Homogenization.sigmaStarCoarse (cubeSet R) A) + (Homogenization.kappaCoarse (cubeSet R) A)) = + Ch02.coarseBMatrixNorm R a := by + simpa [A, U, aQ] using + (Ch02.coarseBMatrixNorm_eq_matrixNorm_bCoarse_pointwiseCoeffField_of_mem_descendantsAtScale + (a := a) (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) hj hRscale).symm + rw [hflux_R, henergy_R, hnorm_R] at hraw + simpa using hraw + have hflux_depth : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q oldFlux n ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy := by + intro n + exact negativeBesovVectorDepthAverage_le_publicBEnergy + (Q := Q) a oldFlux energy henergy_nonneg henergy_int hflux_local_public n + have henergy_eq : + cubeAverage Q energy = + Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + have henergy_fun : + energy = Ch02.variationEnergyIntegrand U ap uPw := by + funext x + simp [energy, scalarVariationEnergyIntegrand, Ch02.variationEnergyIntegrand, + uCube, uOpen, uPw, U, ap, A, Internal.Ch02.BookCh02.pointwiseCoeffOn] + rfl + have hcube_pw : + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := by + calc + cubeAverage Q energy = volumeAverage (cubeSet Q) energy := by + rw [volumeAverage_cubeSet_eq_cubeAverage] + _ = volumeAverage (openCubeSet Q) energy := + ScalarCanonicalMaximizer.volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q energy + _ = Ch02.average U (Ch02.variationEnergyIntegrand U ap uPw) := by + rw [henergy_fun] + exact (Internal.Ch02.book_average_eq_volumeAverage U + (Ch02.variationEnergyIntegrand U ap uPw)).symm + calc + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := hcube_pw + _ = Ch02.variationEnergyValue U aQ u := by + simpa [uPw] using Ch02.variationEnergyValue_ofAEEq haeeq_a_ap u + _ = Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + rfl + have hA_ae_open : + A =ᵐ[volumeMeasureOn (openCubeSet Q)] (a.coeffOn Q).toCoeffField := by + simpa [A, U, aQ, volumeMeasureOn] using + Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U aQ + have hA_ae_cube : + A =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] (a.coeffOn Q).toCoeffField := by + simpa [volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hA_ae_open + have hflux_ae : + oldFlux =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] solutionFluxField Q a u := by + exact hA_ae_cube.mono fun x hx => by + simp [oldFlux, solutionFluxField, uCube, uOpen, uPw, U, ap, A, hx] + rfl + cases q with + | finite q => + have hq' : 1 ≤ q := by simpa using hq + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq' + have hraw : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) oldFlux ≤ + poincareDiscountFactor s (.finite q) * + poincareUpperEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := + finite_flux_norm_le_of_cubeAverageEnergyControl + Q a s q hs hq' oldFlux energy + henergy_nonneg hflux_depth + (summable_public_B_series Q a hs hqpos) + (tsum_public_B_series_eq_LambdaSq Q a hs hqpos) + have hnorm_eq : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) oldFlux = + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (solutionFluxField Q a u) := + scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet s (.finite q) hflux_ae + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) + (solutionFluxField Q a u) + = + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) oldFlux := hnorm_eq.symm + _ ≤ + poincareDiscountFactor s (.finite q) * + poincareUpperEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := hraw + _ = coarsePoincareFluxRHS Q a s (.finite q) u := by + simp [coarsePoincareFluxRHS, solutionEnergyNorm, henergy_eq] + | infinity => + have hraw : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity oldFlux ≤ + poincareDiscountFactor s .infinity * + poincareUpperEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := + infinity_flux_norm_le_of_cubeAverageEnergyControl + Q a s hs oldFlux energy + henergy_nonneg hflux_depth + have hnorm_eq : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity oldFlux = + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (solutionFluxField Q a u) := + scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet s .infinity hflux_ae + calc + scaleNormalizedNegativeBesovVectorNorm Q s .infinity + (solutionFluxField Q a u) + = + scaleNormalizedNegativeBesovVectorNorm Q s .infinity oldFlux := hnorm_eq.symm + _ ≤ + poincareDiscountFactor s .infinity * + poincareUpperEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := hraw + _ = coarsePoincareFluxRHS Q a s .infinity u := by + simp [coarsePoincareFluxRHS, solutionEnergyNorm, henergy_eq] + +/-- Public theorem package for the gradient and flux coarse-grained Poincare +inequalities. + +Its proved API is uniform for every `s > 0`, hence strengthens the ABK26/source +range `0 < s ≤ 1` without claiming literal identity of ranges. Admissible `q` +includes the endpoint `s = 1`, `q = 2`. +-/ +structure CoarsePoincareTheory {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) : Prop where + gradient_negativeBesov_le : + ∀ {s : ℝ} {q : Ch02.MultiscaleExponent} (u : CubeSolution Q a), + 0 < s → q.IsAdmissible → + scaleNormalizedNegativeBesovVectorNorm Q s q + (solutionGradientField u) ≤ + coarsePoincareGradientRHS Q a s q u + flux_negativeBesov_le : + ∀ {s : ℝ} {q : Ch02.MultiscaleExponent} (u : CubeSolution Q a), + 0 < s → q.IsAdmissible → + scaleNormalizedNegativeBesovVectorNorm Q s q + (solutionFluxField Q a u) ≤ + coarsePoincareFluxRHS Q a s q u + +/-- Fully proved public coarse-grained Poincare theorem. -/ +theorem coarsePoincareTheory {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) : + CoarsePoincareTheory Q a := by + refine ⟨?_, ?_⟩ + · intro s q u hs hq + exact coarsePoincareGradient_negativeBesov_le (Q := Q) (a := a) (u := u) + hs hq + · intro s q u hs hq + exact coarsePoincareFlux_negativeBesov_le (Q := Q) (a := a) (u := u) + hs hq + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Finite.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Finite.lean new file mode 100644 index 0000000000..b54db23f10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Finite.lean @@ -0,0 +1,487 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.NegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! # Finite -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.1.1: Coarse Poincare finite-depth estimates + +This file contains the finite-depth scalar algebra and gradient/flux estimates +used by the public coarse Poincare theorem package. +-/ + +noncomputable section + +open scoped BigOperators + +theorem rpow_inv_geometricDiscount_mul_geometricWeight + {s q : ℝ} (hs : 0 < s) (hq : 0 < q) (j : ℕ) : + Real.rpow (3 : ℝ) (-s * (j : ℝ) * q) = + (Ch02.geometricDiscount s q)⁻¹ * Ch02.geometricWeight s q j := by + have hsq : 0 < s * q := mul_pos hs hq + have hdisc_pos : 0 < Ch02.geometricDiscount s q := by + have h := Homogenization.geometricDiscount_pos hsq + simpa [Ch02.geometricDiscount, Homogenization.geometricDiscount] using h + have hdisc_ne : Ch02.geometricDiscount s q ≠ 0 := hdisc_pos.ne' + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ) * q) = + (Ch02.geometricDiscount s q)⁻¹ * + (Ch02.geometricDiscount s q * + Real.rpow (3 : ℝ) (-s * (j : ℝ) * q)) := by + field_simp [hdisc_ne] + _ = (Ch02.geometricDiscount s q)⁻¹ * Ch02.geometricWeight s q j := by + unfold Ch02.geometricWeight + congr 1 + congr 1 + ring_nf + +private theorem rpow_finite_ellipticity_rhs + {disc L E q β : ℝ} (hdisc : 0 < disc) (hL : 0 ≤ L) + (hE : 0 ≤ E) (hq : 0 < q) : + Real.rpow (disc⁻¹ * Real.rpow L β * Real.rpow E (q / 2)) (1 / q) = + Real.rpow disc (-(1 / q)) * Real.rpow L (β * (1 / q)) * Real.sqrt E := by + have hdisc_nonneg : 0 ≤ disc := hdisc.le + have hdisc_inv_nonneg : 0 ≤ disc⁻¹ := inv_nonneg.mpr hdisc_nonneg + have hLpow_nonneg : 0 ≤ Real.rpow L β := Real.rpow_nonneg hL _ + have hEpow_nonneg : 0 ≤ Real.rpow E (q / 2) := Real.rpow_nonneg hE _ + have hA : + Real.rpow disc⁻¹ (1 / q) = Real.rpow disc (-(1 / q)) := by + have hinv_eq : disc⁻¹ = Real.rpow disc (-1 : ℝ) := + (Real.rpow_neg_one disc).symm + calc + Real.rpow disc⁻¹ (1 / q) = + Real.rpow (Real.rpow disc (-1 : ℝ)) (1 / q) := by + rw [hinv_eq] + _ = Real.rpow disc ((-1 : ℝ) * (1 / q)) := by + exact (Real.rpow_mul hdisc_nonneg (-1 : ℝ) (1 / q)).symm + _ = Real.rpow disc (-(1 / q)) := by ring_nf + have hB : + Real.rpow (Real.rpow L β) (1 / q) = + Real.rpow L (β * (1 / q)) := by + exact (Real.rpow_mul hL β (1 / q)).symm + have hC : + Real.rpow (Real.rpow E (q / 2)) (1 / q) = Real.sqrt E := by + calc + Real.rpow (Real.rpow E (q / 2)) (1 / q) = + Real.rpow E ((q / 2) * (1 / q)) := by + exact (Real.rpow_mul hE (q / 2) (1 / q)).symm + _ = Real.rpow E (1 / 2 : ℝ) := by + field_simp [hq.ne'] + _ = Real.sqrt E := by exact (Real.sqrt_eq_rpow E).symm + calc + Real.rpow (disc⁻¹ * Real.rpow L β * Real.rpow E (q / 2)) (1 / q) + = + Real.rpow (disc⁻¹ * Real.rpow L β) (1 / q) * + Real.rpow (Real.rpow E (q / 2)) (1 / q) := by + exact Real.mul_rpow + (mul_nonneg hdisc_inv_nonneg hLpow_nonneg) hEpow_nonneg + _ = + Real.rpow disc⁻¹ (1 / q) * + Real.rpow (Real.rpow L β) (1 / q) * + Real.rpow (Real.rpow E (q / 2)) (1 / q) := by + have hmul := + Real.mul_rpow (x := disc⁻¹) (y := Real.rpow L β) + (z := 1 / q) hdisc_inv_nonneg hLpow_nonneg + change (disc⁻¹ * Real.rpow L β) ^ (1 / q) * + (Real.rpow E (q / 2)) ^ (1 / q) = + disc⁻¹ ^ (1 / q) * + (Real.rpow L β) ^ (1 / q) * + (Real.rpow E (q / 2)) ^ (1 / q) + rw [hmul] + _ = Real.rpow disc (-(1 / q)) * Real.rpow L (β * (1 / q)) * Real.sqrt E := by + rw [hA, hB, hC] + +theorem rpow_finite_gradient_rhs + {disc L E q : ℝ} (hdisc : 0 < disc) (hL : 0 ≤ L) + (hE : 0 ≤ E) (hq : 0 < q) : + Real.rpow (disc⁻¹ * Real.rpow L (-q / 2) * Real.rpow E (q / 2)) (1 / q) = + Real.rpow disc (-(1 / q)) * Real.rpow L (-(1 / 2 : ℝ)) * Real.sqrt E := by + calc + Real.rpow (disc⁻¹ * Real.rpow L (-q / 2) * Real.rpow E (q / 2)) (1 / q) + = + Real.rpow disc (-(1 / q)) * Real.rpow L ((-q / 2) * (1 / q)) * + Real.sqrt E := by + exact rpow_finite_ellipticity_rhs + (disc := disc) (L := L) (E := E) (q := q) (β := -q / 2) + hdisc hL hE hq + _ = Real.rpow disc (-(1 / q)) * Real.rpow L (-(1 / 2 : ℝ)) * Real.sqrt E := by + rw [show (-q / 2) * (1 / q) = -(1 / 2 : ℝ) by field_simp [hq.ne']] + +theorem rpow_finite_flux_rhs + {disc L E q : ℝ} (hdisc : 0 < disc) (hL : 0 ≤ L) + (hE : 0 ≤ E) (hq : 0 < q) : + Real.rpow (disc⁻¹ * Real.rpow L (q / 2) * Real.rpow E (q / 2)) (1 / q) = + Real.rpow disc (-(1 / q)) * Real.rpow L (1 / 2 : ℝ) * Real.sqrt E := by + calc + Real.rpow (disc⁻¹ * Real.rpow L (q / 2) * Real.rpow E (q / 2)) (1 / q) + = + Real.rpow disc (-(1 / q)) * Real.rpow L ((q / 2) * (1 / q)) * + Real.sqrt E := by + exact rpow_finite_ellipticity_rhs + (disc := disc) (L := L) (E := E) (q := q) (β := q / 2) + hdisc hL hE hq + _ = Real.rpow disc (-(1 / q)) * Real.rpow L (1 / 2 : ℝ) * Real.sqrt E := by + rw [show (q / 2) * (1 / q) = (1 / 2 : ℝ) by field_simp [hq.ne']] + +private theorem finite_norm_le_of_depthAverage_tsum {d : ℕ} [NeZero d] + (Q : TriadicCube d) + (s q : ℝ) (hs : 0 < s) (hq : 1 ≤ q) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (M : ℕ → ℝ) (Lpow : ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hM_nonneg : ∀ n : ℕ, 0 ≤ M n) + (hdepthAverage : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q F n ≤ M n * cubeAverage Q energy) + (hsum : + Summable fun n : ℕ => + Ch02.geometricWeight s q n * Real.rpow (M n) (q / 2)) + (htsum : + (∑' n : ℕ, + Ch02.geometricWeight s q n * Real.rpow (M n) (q / 2)) = Lpow) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * Lpow * + Real.rpow (cubeAverage Q energy) (q / 2)) + (1 / q) := by + let E : ℝ := cubeAverage Q energy + let W : ℕ → ℝ := fun n => + Ch02.geometricWeight s q n * Real.rpow (M n) (q / 2) + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hsq_nonneg : 0 ≤ s * q := mul_nonneg hs.le hqpos.le + have hdisc_pos : 0 < Ch02.geometricDiscount s q := by + have h := Homogenization.geometricDiscount_pos (mul_pos hs hqpos) + simpa [Ch02.geometricDiscount, Homogenization.geometricDiscount] using h + have hE_nonneg : 0 ≤ E := by + exact cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hW_nonneg : ∀ n : ℕ, 0 ≤ W n := by + intro n + dsimp [W] + refine mul_nonneg ?_ (Real.rpow_nonneg (hM_nonneg n) _) + have hOld := Homogenization.geometricWeight_nonneg n hsq_nonneg + simpa [Ch02.geometricWeight_eq_old] using hOld + have hsumW : Summable W := by + simpa [W] using hsum + have htsumW : (∑' n : ℕ, W n) = Lpow := by + simpa [W] using htsum + have hpartial : + ∀ N : ℕ, + negativeBesovVectorPartialNormFinite Q s q N F ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * Lpow * + Real.rpow E (q / 2)) + (1 / q) := by + intro N + have hsum_bound : + Finset.sum (Finset.range (N + 1)) (fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) + ≤ + (Ch02.geometricDiscount s q)⁻¹ * + Finset.sum (Finset.range (N + 1)) W * + Real.rpow E (q / 2) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) + ≤ + Finset.sum (Finset.range (N + 1)) (fun j => + (Ch02.geometricDiscount s q)⁻¹ * W j * + Real.rpow E (q / 2)) := by + refine Finset.sum_le_sum ?_ + intro j _hj + have havg : + negativeBesovVectorDepthAverage Q F j ≤ M j * E := by + simpa [E] using hdepthAverage j + have hME_nonneg : 0 ≤ M j * E := mul_nonneg (hM_nonneg j) hE_nonneg + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdepth_le : + negativeBesovVectorDepthSeminorm Q s F j ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (M j * E) := by + unfold negativeBesovVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt havg) hweight_nonneg + calc + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q + ≤ + Real.rpow + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (M j * E)) q := by + exact Real.rpow_le_rpow + (negativeBesovVectorDepthSeminorm_nonneg Q s F j) hdepth_le hqpos.le + _ = + (Ch02.geometricDiscount s q)⁻¹ * W j * + Real.rpow E (q / 2) := by + have hbase3_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hsqrt_nonneg : 0 ≤ Real.sqrt (M j * E) := Real.sqrt_nonneg _ + have hpow_weight : + Real.rpow (Real.rpow (3 : ℝ) (-s * (j : ℝ))) q = + Real.rpow (3 : ℝ) (-s * (j : ℝ) * q) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (-s * (j : ℝ)) q).symm + have hsqrt_pow : + Real.rpow (Real.sqrt (M j * E)) q = + Real.rpow (M j) (q / 2) * Real.rpow E (q / 2) := by + calc + Real.rpow (Real.sqrt (M j * E)) q = + Real.rpow (Real.rpow (M j * E) (1 / 2 : ℝ)) q := by + exact congrArg (fun t => Real.rpow t q) + (Real.sqrt_eq_rpow (M j * E)) + _ = Real.rpow (M j * E) ((1 / 2 : ℝ) * q) := by + exact (Real.rpow_mul hME_nonneg (1 / 2 : ℝ) q).symm + _ = Real.rpow (M j * E) (q / 2) := by ring_nf + _ = Real.rpow (M j) (q / 2) * Real.rpow E (q / 2) := by + exact Real.mul_rpow (hM_nonneg j) hE_nonneg + calc + Real.rpow + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (M j * E)) q = + Real.rpow (Real.rpow (3 : ℝ) (-s * (j : ℝ))) q * + Real.rpow (Real.sqrt (M j * E)) q := by + exact Real.mul_rpow hbase3_nonneg hsqrt_nonneg + _ = + Real.rpow (3 : ℝ) (-s * (j : ℝ) * q) * + (Real.rpow (M j) (q / 2) * Real.rpow E (q / 2)) := by + rw [hpow_weight, hsqrt_pow] + _ = + (Ch02.geometricDiscount s q)⁻¹ * W j * + Real.rpow E (q / 2) := by + rw [rpow_inv_geometricDiscount_mul_geometricWeight hs hqpos j] + dsimp [W] + ring + _ = + (Ch02.geometricDiscount s q)⁻¹ * + Finset.sum (Finset.range (N + 1)) W * + Real.rpow E (q / 2) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (Ch02.geometricDiscount s q)⁻¹ * W j * + Real.rpow E (q / 2)) + = + Finset.sum (Finset.range (N + 1)) (fun j => + ((Ch02.geometricDiscount s q)⁻¹ * Real.rpow E (q / 2)) * W j) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + ring + _ = + ((Ch02.geometricDiscount s q)⁻¹ * Real.rpow E (q / 2)) * + Finset.sum (Finset.range (N + 1)) W := by + rw [Finset.mul_sum] + _ = + (Ch02.geometricDiscount s q)⁻¹ * + Finset.sum (Finset.range (N + 1)) W * + Real.rpow E (q / 2) := by + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) W ≤ ∑' n : ℕ, W n := + hsumW.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hW_nonneg n) + have hsum_le : + Finset.sum (Finset.range (N + 1)) (fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) + ≤ + (Ch02.geometricDiscount s q)⁻¹ * Lpow * + Real.rpow E (q / 2) := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) + ≤ + (Ch02.geometricDiscount s q)⁻¹ * + Finset.sum (Finset.range (N + 1)) W * + Real.rpow E (q / 2) := hsum_bound + _ ≤ + (Ch02.geometricDiscount s q)⁻¹ * + (∑' n : ℕ, W n) * + Real.rpow E (q / 2) := by + have hscaled : + (Ch02.geometricDiscount s q)⁻¹ * + Finset.sum (Finset.range (N + 1)) W ≤ + (Ch02.geometricDiscount s q)⁻¹ * (∑' n : ℕ, W n) := + mul_le_mul_of_nonneg_left hfinite_le_tsum (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled (Real.rpow_nonneg hE_nonneg _) + _ = + (Ch02.geometricDiscount s q)⁻¹ * Lpow * + Real.rpow E (q / 2) := by + rw [htsumW] + unfold negativeBesovVectorPartialNormFinite + have hleft_nonneg : + 0 ≤ Finset.sum (Finset.range (N + 1)) (fun j => + Real.rpow (negativeBesovVectorDepthSeminorm Q s F j) q) := + Finset.sum_nonneg fun j _ => + Real.rpow_nonneg (negativeBesovVectorDepthSeminorm_nonneg Q s F j) _ + exact Real.rpow_le_rpow hleft_nonneg hsum_le (one_div_nonneg.mpr hqpos.le) + exact scaleNormalizedNegativeBesovVectorNorm_finite_le_of_partialBound Q s q F hpartial + +theorem finite_gradient_norm_le_of_cubeAverageEnergyControl {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + (s q : ℝ) (hs : 0 < s) (hq : 1 ≤ q) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hdepthAverage : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q F n ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy) + (hsum : + Summable fun n : ℕ => + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) + (htsum : + (∑' n : ℕ, + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) = + Real.rpow (Ch02.lambdaSq Q s (.finite q) a) (-q / 2)) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ + poincareDiscountFactor s (.finite q) * + poincareLowerEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := by + have hM_nonneg : + ∀ n : ℕ, + 0 ≤ Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := by + intro n + exact Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hbase : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * + Real.rpow (Ch02.lambdaSq Q s (.finite q) a) (-q / 2) * + Real.rpow (cubeAverage Q energy) (q / 2)) + (1 / q) := by + exact finite_norm_le_of_depthAverage_tsum + (Q := Q) (s := s) (q := q) (hs := hs) (hq := hq) + (F := F) (energy := energy) + (M := fun n => + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (Lpow := Real.rpow (Ch02.lambdaSq Q s (.finite q) a) (-q / 2)) + (henergy_nonneg := henergy_nonneg) + (hM_nonneg := hM_nonneg) + (hdepthAverage := hdepthAverage) + (hsum := hsum) + (htsum := htsum) + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hdisc_pos : 0 < Ch02.geometricDiscount s q := by + have h := Homogenization.geometricDiscount_pos (mul_pos hs hqpos) + simpa [Ch02.geometricDiscount, Homogenization.geometricDiscount] using h + have hE_nonneg : 0 ≤ cubeAverage Q energy := by + exact cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hlambda_nonneg : 0 ≤ Ch02.lambdaSq Q s (.finite q) a := + Ch02.lambdaSq_finite_nonneg Q a hs hq + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F + ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * + Real.rpow (Ch02.lambdaSq Q s (.finite q) a) (-q / 2) * + Real.rpow (cubeAverage Q energy) (q / 2)) + (1 / q) := hbase + _ = + poincareDiscountFactor s (.finite q) * + poincareLowerEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := by + rw [rpow_finite_gradient_rhs hdisc_pos hlambda_nonneg hE_nonneg hqpos] + rfl + +theorem finite_flux_norm_le_of_cubeAverageEnergyControl {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + (s q : ℝ) (hs : 0 < s) (hq : 1 ≤ q) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hdepthAverage : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q F n ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy) + (hsum : + Summable fun n : ℕ => + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) + (htsum : + (∑' n : ℕ, + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) = + Real.rpow (Ch02.LambdaSq Q s (.finite q) a) (q / 2)) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ + poincareDiscountFactor s (.finite q) * + poincareUpperEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := by + have hM_nonneg : + ∀ n : ℕ, + 0 ≤ Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a := by + intro n + exact Ch02.maxDescendantBMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hbase : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * + Real.rpow (Ch02.LambdaSq Q s (.finite q) a) (q / 2) * + Real.rpow (cubeAverage Q energy) (q / 2)) + (1 / q) := by + exact finite_norm_le_of_depthAverage_tsum + (Q := Q) (s := s) (q := q) (hs := hs) (hq := hq) + (F := F) (energy := energy) + (M := fun n => + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (Lpow := Real.rpow (Ch02.LambdaSq Q s (.finite q) a) (q / 2)) + (henergy_nonneg := henergy_nonneg) + (hM_nonneg := hM_nonneg) + (hdepthAverage := hdepthAverage) + (hsum := hsum) + (htsum := htsum) + have hqpos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hdisc_pos : 0 < Ch02.geometricDiscount s q := by + have h := Homogenization.geometricDiscount_pos (mul_pos hs hqpos) + simpa [Ch02.geometricDiscount, Homogenization.geometricDiscount] using h + have hE_nonneg : 0 ≤ cubeAverage Q energy := by + exact cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hLambda_nonneg : 0 ≤ Ch02.LambdaSq Q s (.finite q) a := + Ch02.LambdaSq_finite_nonneg Q a hs hq + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F + ≤ + Real.rpow + ((Ch02.geometricDiscount s q)⁻¹ * + Real.rpow (Ch02.LambdaSq Q s (.finite q) a) (q / 2) * + Real.rpow (cubeAverage Q energy) (q / 2)) + (1 / q) := hbase + _ = + poincareDiscountFactor s (.finite q) * + poincareUpperEllipticityFactor Q a s (.finite q) * + Real.sqrt (cubeAverage Q energy) := by + rw [rpow_finite_flux_rhs hdisc_pos hLambda_nonneg hE_nonneg hqpos] + rfl + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Infinity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Infinity.lean new file mode 100644 index 0000000000..84c169dd0a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/Infinity.lean @@ -0,0 +1,357 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Finite +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! # Infinity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.1.1: Coarse Poincare infinity-depth estimates + +This file contains the infinity-depth scalar algebra and series identities used +by the public coarse Poincare theorem package. +-/ + +noncomputable section + +open scoped BigOperators + +theorem multiscaleDescendantWeight_sub_nat {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s = + Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) := by + unfold Ch02.multiscaleDescendantWeight + have hsub : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + abel + rw [hsub] + norm_num + +theorem rpow_inv_half_eq_rpow_neg_half {x : ℝ} (hx : 0 ≤ x) : + Real.rpow x⁻¹ (1 / 2 : ℝ) = Real.rpow x (-(1 / 2 : ℝ)) := by + have hinv_eq : x⁻¹ = Real.rpow x (-1 : ℝ) := + (Real.rpow_neg_one x).symm + calc + Real.rpow x⁻¹ (1 / 2 : ℝ) = + Real.rpow (Real.rpow x (-1 : ℝ)) (1 / 2 : ℝ) := by + rw [hinv_eq] + _ = Real.rpow x ((-1 : ℝ) * (1 / 2 : ℝ)) := by + exact (Real.rpow_mul hx (-1 : ℝ) (1 / 2 : ℝ)).symm + _ = Real.rpow x (-(1 / 2 : ℝ)) := by + ring_nf + +theorem rpow_depth_weight_sqrt_cancel + {s : ℝ} (j : ℕ) {L E : ℝ} (hL : 0 ≤ L) (hE : 0 ≤ E) : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt ((Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * L) * E) = + Real.rpow L (1 / 2 : ℝ) * Real.sqrt E := by + have h3nonneg : 0 ≤ (3 : ℝ) := by norm_num + have h3pos : 0 < (3 : ℝ) := by norm_num + have hA_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) := + Real.rpow_nonneg h3nonneg _ + have hLE_nonneg : 0 ≤ L * E := mul_nonneg hL hE + have hsqrt_weight : + Real.sqrt (Real.rpow (3 : ℝ) (2 * s * (j : ℝ))) = + Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + calc + Real.sqrt (Real.rpow (3 : ℝ) (2 * s * (j : ℝ))) = + Real.rpow (Real.rpow (3 : ℝ) (2 * s * (j : ℝ))) (1 / 2 : ℝ) := by + exact Real.sqrt_eq_rpow _ + _ = Real.rpow (3 : ℝ) ((2 * s * (j : ℝ)) * (1 / 2 : ℝ)) := by + exact (Real.rpow_mul h3nonneg (2 * s * (j : ℝ)) (1 / 2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + ring + have hcancel : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) = 1 := by + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) = + Real.rpow (3 : ℝ) (-s * (j : ℝ) + s * (j : ℝ)) := by + exact (Real.rpow_add h3pos (-s * (j : ℝ)) (s * (j : ℝ))).symm + _ = 1 := by + rw [show -s * (j : ℝ) + s * (j : ℝ) = 0 by ring] + exact Real.rpow_zero (3 : ℝ) + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt ((Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * L) * E) + = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * (L * E)) := by + rw [mul_assoc] + _ = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (Real.sqrt (Real.rpow (3 : ℝ) (2 * s * (j : ℝ))) * + Real.sqrt (L * E)) := by + rw [Real.sqrt_mul hA_nonneg] + _ = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (Real.sqrt L * Real.sqrt E)) := by + rw [hsqrt_weight, Real.sqrt_mul hL] + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ))) * + (Real.sqrt L * Real.sqrt E) := by + ring + _ = Real.rpow L (1 / 2 : ℝ) * Real.sqrt E := by + rw [hcancel, Real.sqrt_eq_rpow L] + simp + +theorem infinity_gradient_norm_le_of_cubeAverageEnergyControl {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (hs : 0 < s) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hdepthAverage : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q F n ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy) : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity F ≤ + poincareDiscountFactor s .infinity * + poincareLowerEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := by + let E : ℝ := cubeAverage Q energy + let M : ℕ → ℝ := fun n => + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a + let lam : ℝ := Ch02.lambdaSq Q s .infinity a + have hE_nonneg : 0 ≤ E := by + exact cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hlam_pos : 0 < lam := by + dsimp [lam] + exact Ch02.lambdaSq_infinity_pos Q a hs + have hlam_inv_nonneg : 0 ≤ lam⁻¹ := inv_nonneg.mpr hlam_pos.le + have hdepth : + ∀ j : ℕ, + negativeBesovVectorDepthSeminorm Q s F j ≤ + Real.rpow lam (-(1 / 2 : ℝ)) * Real.sqrt E := by + intro j + have havg : + negativeBesovVectorDepthAverage Q F j ≤ M j * E := by + simpa [M, E] using hdepthAverage j + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hM_bound : + M j ≤ Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * lam⁻¹ := by + have h1 : + M j ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s .infinity a := by + dsimp [M] + exact Ch02.maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv + Q a hk hs Ch02.MultiscaleExponent.isAdmissible_infinity + have h2 : + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s .infinity a ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s * + (Ch02.lambdaSq Q s .infinity a)⁻¹ := + Ch02.maxDescendant_lambdaSq_inv_le + Q a hk hs Ch02.MultiscaleExponent.isAdmissible_infinity + calc + M j ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s .infinity a := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s * + (Ch02.lambdaSq Q s .infinity a)⁻¹ := h2 + _ = Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * lam⁻¹ := by + rw [multiscaleDescendantWeight_sub_nat] + have hME_bound : + M j * E ≤ + (Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * lam⁻¹) * E := + mul_le_mul_of_nonneg_right hM_bound hE_nonneg + have htarget_nonneg : + 0 ≤ (Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * lam⁻¹) * E := by + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hlam_inv_nonneg) + hE_nonneg + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + negativeBesovVectorDepthSeminorm Q s F j + ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (M j * E) := by + unfold negativeBesovVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt havg) hweight_nonneg + _ ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt ((Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * lam⁻¹) * E) := by + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt hME_bound) hweight_nonneg + _ = Real.rpow lam (-(1 / 2 : ℝ)) * Real.sqrt E := by + rw [rpow_depth_weight_sqrt_cancel j hlam_inv_nonneg hE_nonneg] + rw [rpow_inv_half_eq_rpow_neg_half hlam_pos.le] + calc + scaleNormalizedNegativeBesovVectorNorm Q s .infinity F + ≤ Real.rpow lam (-(1 / 2 : ℝ)) * Real.sqrt E := + scaleNormalizedNegativeBesovVectorNorm_infinity_le_of_depthBound Q s F hdepth + _ = + poincareDiscountFactor s .infinity * + poincareLowerEllipticityFactor Q a s .infinity * + Real.sqrt E := by + simp [poincareDiscountFactor, poincareLowerEllipticityFactor, lam] + +theorem infinity_flux_norm_le_of_cubeAverageEnergyControl {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (hs : 0 < s) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hdepthAverage : + ∀ n : ℕ, + negativeBesovVectorDepthAverage Q F n ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a * + cubeAverage Q energy) : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity F ≤ + poincareDiscountFactor s .infinity * + poincareUpperEllipticityFactor Q a s .infinity * + Real.sqrt (cubeAverage Q energy) := by + let E : ℝ := cubeAverage Q energy + let M : ℕ → ℝ := fun n => + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a + let Lam : ℝ := Ch02.LambdaSq Q s .infinity a + have hE_nonneg : 0 ≤ E := by + exact cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact Ch02.LambdaSq_infinity_nonneg Q a hs + have hdepth : + ∀ j : ℕ, + negativeBesovVectorDepthSeminorm Q s F j ≤ + Real.rpow Lam (1 / 2 : ℝ) * Real.sqrt E := by + intro j + have havg : + negativeBesovVectorDepthAverage Q F j ≤ M j * E := by + simpa [M, E] using hdepthAverage j + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hM_bound : + M j ≤ Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * Lam := by + have h1 : + M j ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + s .infinity a := by + dsimp [M] + exact Ch02.maxDescendant_b_le_maxDescendant_LambdaSq + Q a hk hs Ch02.MultiscaleExponent.isAdmissible_infinity + have h2 : + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + s .infinity a ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s * + Ch02.LambdaSq Q s .infinity a := + Ch02.maxDescendant_LambdaSq_le + Q a hk hs Ch02.MultiscaleExponent.isAdmissible_infinity + calc + M j ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + s .infinity a := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s * + Ch02.LambdaSq Q s .infinity a := h2 + _ = Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * Lam := by + rw [multiscaleDescendantWeight_sub_nat] + have hME_bound : + M j * E ≤ + (Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * Lam) * E := + mul_le_mul_of_nonneg_right hM_bound hE_nonneg + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + negativeBesovVectorDepthSeminorm Q s F j + ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (M j * E) := by + unfold negativeBesovVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt havg) hweight_nonneg + _ ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt ((Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) * Lam) * E) := by + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt hME_bound) hweight_nonneg + _ = Real.rpow Lam (1 / 2 : ℝ) * Real.sqrt E := by + rw [rpow_depth_weight_sqrt_cancel j hLam_nonneg hE_nonneg] + calc + scaleNormalizedNegativeBesovVectorNorm Q s .infinity F + ≤ Real.rpow Lam (1 / 2 : ℝ) * Real.sqrt E := + scaleNormalizedNegativeBesovVectorNorm_infinity_le_of_depthBound Q s F hdepth + _ = + poincareDiscountFactor s .infinity * + poincareUpperEllipticityFactor Q a s .infinity * + Real.sqrt E := by + simp [poincareDiscountFactor, poincareUpperEllipticityFactor, Lam] + +theorem summable_public_sigmaStar_series {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable fun n : ℕ => + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + have hOld := + Ch02.summable_sigmaStarInv_series_pointwiseCoeffField + (Q := Q) (a := a) hs hq + simpa [A] using hOld + +theorem summable_public_B_series {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + Summable fun n : ℕ => + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + have hOld := + Ch02.summable_B_series_pointwiseCoeffField + (Q := Q) (a := a) hs hq + simpa [A] using hOld + +theorem tsum_public_sigmaStar_series_eq_lambdaSq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + (∑' n : ℕ, + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) = + Real.rpow (Ch02.lambdaSq Q s (.finite q) a) (-q / 2) := by + exact (Ch02.lambdaSqFinite_rpow_neg_q_div_two_eq_tsum + Q s q a hq (mul_nonneg hs.le hq.le)).symm + +theorem tsum_public_B_series_eq_LambdaSq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) {s q : ℝ} + (hs : 0 < s) (hq : 0 < q) : + (∑' n : ℕ, + Ch02.geometricWeight s q n * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) = + Real.rpow (Ch02.LambdaSq Q s (.finite q) a) (q / 2) := by + exact (Ch02.LambdaSqFinite_rpow_q_div_two_eq_tsum + Q s q a hq (mul_nonneg hs.le hq.le)).symm + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/NegativeBesov.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/NegativeBesov.lean new file mode 100644 index 0000000000..a19fca0cfb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincare/NegativeBesov.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! # Negative Besov -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.1.1: Coarse Poincare negative-Besov bridges + +This file contains the negative-Besov normalization and pointwise coefficient +bridges used by the public coarse Poincare theorem package. +-/ + +noncomputable section + +open scoped BigOperators + +theorem negativeBesovVectorDepthAverage_eq_old {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) : + negativeBesovVectorDepthAverage Q F j = + Homogenization.cubeBesovNegativeVectorDepthAverage Q F j := by + rfl + +theorem negativeBesovVectorDepthSeminorm_eq_old {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + negativeBesovVectorDepthSeminorm Q s F j = + Homogenization.cubeBesovNegativeVectorDepthSeminorm Q s F j := by + simp [negativeBesovVectorDepthSeminorm, + Homogenization.cubeBesovNegativeVectorDepthSeminorm, + negativeBesovVectorDepthAverage_eq_old] + +theorem negativeBesovVectorDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ negativeBesovVectorDepthAverage Q F j := by + simpa [negativeBesovVectorDepthAverage_eq_old] using + Homogenization.cubeBesovNegativeVectorDepthAverage_nonneg Q F j + +theorem negativeBesovVectorDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ negativeBesovVectorDepthSeminorm Q s F j := by + unfold negativeBesovVectorDepthSeminorm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem negativeBesovVectorPartialNormFinite_nonneg {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (N : ℕ) (F : Vec d → Vec d) : + 0 ≤ negativeBesovVectorPartialNormFinite Q s q N F := by + unfold negativeBesovVectorPartialNormFinite + exact Real.rpow_nonneg + (Finset.sum_nonneg fun j _ => + Real.rpow_nonneg (negativeBesovVectorDepthSeminorm_nonneg Q s F j) _) + _ + +theorem scaleNormalizedNegativeBesovVectorNorm_finite_le_of_partialBound + {d : ℕ} (Q : TriadicCube d) (s q : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, negativeBesovVectorPartialNormFinite Q s q N F ≤ B) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite q) F ≤ B := by + unfold scaleNormalizedNegativeBesovVectorNorm + refine csSup_le ?_ ?_ + · exact ⟨negativeBesovVectorPartialNormFinite Q s q 0 F, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem scaleNormalizedNegativeBesovVectorNorm_infinity_le_of_depthBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : ∀ j : ℕ, negativeBesovVectorDepthSeminorm Q s F j ≤ B) : + scaleNormalizedNegativeBesovVectorNorm Q s .infinity F ≤ B := by + unfold scaleNormalizedNegativeBesovVectorNorm + refine csSup_le ?_ ?_ + · exact ⟨negativeBesovVectorDepthSeminorm Q s F 0, ⟨0, rfl⟩⟩ + · rintro x ⟨j, rfl⟩ + exact hB j + +theorem negativeBesovVectorDepthAverage_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) (j : ℕ) : + negativeBesovVectorDepthAverage Q F j = + negativeBesovVectorDepthAverage Q G j := by + simp [negativeBesovVectorDepthAverage_eq_old, + Homogenization.cubeBesovNegativeVectorDepthAverage_eq_of_ae_eq_on_cubeSet hFG j] + +theorem negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s : ℝ) (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) (j : ℕ) : + negativeBesovVectorDepthSeminorm Q s F j = + negativeBesovVectorDepthSeminorm Q s G j := by + unfold negativeBesovVectorDepthSeminorm + rw [negativeBesovVectorDepthAverage_eq_of_ae_eq_on_cubeSet hFG j] + +theorem negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s q : ℝ) (N : ℕ) + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) : + negativeBesovVectorPartialNormFinite Q s q N F = + negativeBesovVectorPartialNormFinite Q s q N G := by + unfold negativeBesovVectorPartialNormFinite + congr 1 + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet s hFG j] + +theorem scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s : ℝ) (q : Ch02.MultiscaleExponent) + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) : + scaleNormalizedNegativeBesovVectorNorm Q s q F = + scaleNormalizedNegativeBesovVectorNorm Q s q G := by + cases q with + | finite q => + unfold scaleNormalizedNegativeBesovVectorNorm + apply congrArg sSup + ext y + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, + (negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s q N hFG).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, + negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s q N hFG⟩ + | infinity => + unfold scaleNormalizedNegativeBesovVectorNorm + apply congrArg sSup + ext y + constructor + · rintro ⟨j, rfl⟩ + exact ⟨j, + (negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s hFG j).symm⟩ + · rintro ⟨j, rfl⟩ + exact ⟨j, + negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s hFG j⟩ + +theorem negativeBesovVectorDepthAverage_le_publicSigmaStarInvEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} (a : CoeffFamily d) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R F) ≤ + Ch02.coarseSigmaStarInvMatrixNorm R a * cubeAverage R energy) + (j : ℕ) : + negativeBesovVectorDepthAverage Q F j ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R F) ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hRscale_eq : R.scale = Q.scale - (j : ℤ) := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hRscale + have hlR : Q.scale - (j : ℤ) ≤ R.scale := by + rw [hRscale_eq] + have hcoarse_le : + Ch02.coarseSigmaStarInvMatrixNorm R a ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a := + (Ch02.coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale + R hlR a).trans + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_le_of_mem_descendantsAtScale + a hRscale hlR) + have havg_nonneg : 0 ≤ cubeAverage R energy := by + apply cubeAverage_nonneg_of_nonneg_on + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + exact le_trans (hlocal j R hR) <| + mul_le_mul_of_nonneg_right hcoarse_le havg_nonneg + have hdesc := + descendantsAverage_le_descendantsAverage Q j hpoint + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hconst : + descendantsAverage Q j (fun R => + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy) = + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + descendantsAverage Q j (fun R => cubeAverage R energy) := by + let D := descendantsAtDepth Q j + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) a + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * Finset.sum D (fun R => M * cubeAverage R energy) = + Finset.sum D (fun R => (((D.card : ℝ)⁻¹ * M) * cubeAverage R energy)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = (((D.card : ℝ)⁻¹ * M) * Finset.sum D (fun R => cubeAverage R energy)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) (f := fun R => cubeAverage R energy) + (((D.card : ℝ)⁻¹) * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * Finset.sum D (fun R => cubeAverage R energy)) := by + ring + rw [hconst, havg_eq] at hdesc + simpa [negativeBesovVectorDepthAverage_eq_old, + Homogenization.cubeBesovNegativeVectorDepthAverage] using hdesc + +theorem negativeBesovVectorDepthAverage_le_publicBEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} (a : CoeffFamily d) + (F : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R F) ≤ + Ch02.coarseBMatrixNorm R a * cubeAverage R energy) + (j : ℕ) : + negativeBesovVectorDepthAverage Q F j ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R F) ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hRscale_eq : R.scale = Q.scale - (j : ℤ) := + Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hRscale + have hlR : Q.scale - (j : ℤ) ≤ R.scale := by + rw [hRscale_eq] + have hcoarse_le : + Ch02.coarseBMatrixNorm R a ≤ + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a := + (Ch02.coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale + R hlR a).trans + (Ch02.maxDescendantBMatrixNormAtScale_le_of_mem_descendantsAtScale + a hRscale hlR) + have havg_nonneg : 0 ≤ cubeAverage R energy := by + apply cubeAverage_nonneg_of_nonneg_on + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + exact le_trans (hlocal j R hR) <| + mul_le_mul_of_nonneg_right hcoarse_le havg_nonneg + have hdesc := + descendantsAverage_le_descendantsAverage Q j hpoint + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hconst : + descendantsAverage Q j (fun R => + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy) = + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a * + descendantsAverage Q j (fun R => cubeAverage R energy) := by + let D := descendantsAtDepth Q j + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) a + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * Finset.sum D (fun R => M * cubeAverage R energy) = + Finset.sum D (fun R => (((D.card : ℝ)⁻¹ * M) * cubeAverage R energy)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = (((D.card : ℝ)⁻¹ * M) * Finset.sum D (fun R => cubeAverage R energy)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) (f := fun R => cubeAverage R energy) + (((D.card : ℝ)⁻¹) * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * Finset.sum D (fun R => cubeAverage R energy)) := by + ring + rw [hconst, havg_eq] at hdesc + simpa [negativeBesovVectorDepthAverage_eq_old, + Homogenization.cubeBesovNegativeVectorDepthAverage] using hdesc + +theorem pointwiseCoeffField_isEllipticFieldOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (aQ : Ch02.CoeffOn (Ch02.cubeDomain Q)) : + IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet Q) + (Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) aQ) := by + classical + have hmeas : + Measurable + (fun x i j => + if x ∈ cubeSet Q then + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) aQ x i j + else 0) := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hcoeff : + Measurable fun x : Vec d => + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) aQ x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (Internal.Ch02.BookCh02.pointwiseCoeffField_measurable (Ch02.cubeDomain Q) aQ) i) j) + exact Measurable.ite (measurableSet_cubeSet Q) hcoeff measurable_const + refine ⟨hmeas, ?_⟩ + intro x _hxQ + by_cases hxGood : x ∈ (Internal.Ch02.BookCh02.goodSetData (Ch02.cubeDomain Q) aQ).set + · simpa [Internal.Ch02.BookCh02.pointwiseCoeffField, hxGood] using + (Internal.Ch02.BookCh02.goodSetData (Ch02.cubeDomain Q) aQ).elliptic x hxGood + · simpa [Internal.Ch02.BookCh02.pointwiseCoeffField, hxGood] using + Internal.Ch02.BookCh02.isEllipticMatrix_smul_one + (d := d) aQ.lam_pos aQ.lam_le_Lam + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincareRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincareRHS.lean new file mode 100644 index 0000000000..1d44a07ac2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/CoarsePoincareRHS.lean @@ -0,0 +1,664 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge + +/-! # Coarse Poincare RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.2.1: Coarse-grained Poincare inequality with right-hand side + +This file assembles the public theorem package for +`p.coarse.grained.Poincare.RHS.deterministic.theory` and the auxiliary +zero-Dirichlet energy estimate +`l.zero.Dirichlet.energy.RHS.deterministic.theory`. + +## Audit tag + +Claim: assemble the public coarse Poincare-with-RHS package and the +zero-Dirichlet energy RHS estimate from the deterministic RHS endpoints. + +Downstream target: `InhomogeneousEquationsTheory`. This file should remain +the single public `CoarsePoincareRHSTheory` endpoint for Section 3.2.1. +-/ + +noncomputable section + +private theorem inv_le_rpow_neg_three_halves {s : ℝ} (hs : 0 < s) + (hs_le_one : s ≤ 1) : + s⁻¹ ≤ Real.rpow s (-(3 / 2 : ℝ)) := by + calc + s⁻¹ = Real.rpow s (-1 : ℝ) := (Real.rpow_neg_one s).symm + _ ≤ Real.rpow s (-(3 / 2 : ℝ)) := + Real.rpow_le_rpow_of_exponent_ge hs hs_le_one (by norm_num) + +private theorem rpow_three_nat_add_le_nat_add_one (d : ℕ) {s : ℝ} + (hs_le_one : s ≤ 1) : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + +private theorem sqrt_const_mul_fourth_mul_sq_mul_sq_mul_sq + {A x y z w : ℝ} (hA : 0 ≤ A) (hy : 0 ≤ y) (hz : 0 ≤ z) (hw : 0 ≤ w) : + Real.sqrt (A * x ^ 4 * y ^ 2 * z ^ 2 * w ^ 2) = + Real.sqrt A * x ^ 2 * y * z * w := by + have hx_sq_nonneg : 0 ≤ x ^ 2 := sq_nonneg x + calc + Real.sqrt (A * x ^ 4 * y ^ 2 * z ^ 2 * w ^ 2) + = + Real.sqrt (A * (x ^ 4 * (y ^ 2 * (z ^ 2 * w ^ 2)))) := by + ring_nf + _ = + Real.sqrt A * Real.sqrt (x ^ 4 * (y ^ 2 * (z ^ 2 * w ^ 2))) := by + rw [Real.sqrt_mul hA] + _ = + Real.sqrt A * (Real.sqrt (x ^ 4) * Real.sqrt (y ^ 2 * (z ^ 2 * w ^ 2))) := by + rw [Real.sqrt_mul (by positivity : 0 ≤ x ^ 4)] + _ = + Real.sqrt A * (x ^ 2 * (y * (z * w))) := by + rw [show x ^ 4 = (x ^ 2) ^ 2 by ring] + rw [Real.sqrt_sq hx_sq_nonneg] + rw [Real.sqrt_mul (sq_nonneg y)] + rw [Real.sqrt_sq hy] + rw [show z ^ 2 * w ^ 2 = (z * w) ^ 2 by ring] + rw [Real.sqrt_sq (mul_nonneg hz hw)] + _ = Real.sqrt A * x ^ 2 * y * z * w := by ring + +private theorem coarsePoincareGradient_scalar_sqrt_bound + (d : ℕ) (C s L E B D : ℝ) + (hC_nonneg : 0 ≤ C) (hC_energy : Real.sqrt 250 ≤ C) + (hC_force : Real.sqrt 15000 * + ((d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hL_inv_nonneg : 0 ≤ L⁻¹) (hs_inv_nonneg : 0 ≤ s⁻¹) + (hE_nonneg : 0 ≤ E) (hB_nonneg : 0 ≤ B) (hD_nonneg : 0 ≤ D) + (hD_le : D ≤ (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) : + Real.sqrt + (250 * (s⁻¹) ^ 2 * L⁻¹ * E + + 15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * Real.sqrt E + + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B := by + have hs_inv_le : + s⁻¹ ≤ Real.rpow s (-(3 / 2 : ℝ)) := by + exact inv_le_rpow_neg_three_halves hs hs_le + have hs_inv_sq_eq : (s⁻¹) ^ 2 = Real.rpow s (-(2 : ℝ)) := by + calc + (s⁻¹) ^ 2 = (Real.rpow s (-1 : ℝ)) ^ 2 := by + exact congrArg (fun x : ℝ => x ^ 2) (Real.rpow_neg_one s).symm + _ = Real.rpow (Real.rpow s (-1 : ℝ)) (2 : ℝ) := by + exact (Real.rpow_natCast (Real.rpow s (-1 : ℝ)) 2).symm + _ = Real.rpow s ((-1 : ℝ) * (2 : ℝ)) := by + exact (Real.rpow_mul hs.le (-1 : ℝ) (2 : ℝ)).symm + _ = Real.rpow s (-(2 : ℝ)) := by ring_nf + have hs_inv_sq_le : + (s⁻¹) ^ 2 ≤ Real.rpow s (-3 : ℝ) := by + calc + (s⁻¹) ^ 2 = Real.rpow s (-(2 : ℝ)) := hs_inv_sq_eq + _ ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_le_rpow_of_exponent_ge hs hs_le (by norm_num) + have hA_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * L⁻¹ * E := by + positivity + have hF_nonneg : + 0 ≤ 15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2 := by + positivity + have hsqrtA : + Real.sqrt (250 * (s⁻¹) ^ 2 * L⁻¹ * E) = + Real.sqrt 250 * s⁻¹ * Real.sqrt L⁻¹ * Real.sqrt E := by + calc + Real.sqrt (250 * (s⁻¹) ^ 2 * L⁻¹ * E) + = Real.sqrt (250 * ((s⁻¹) ^ 2 * (L⁻¹ * E))) := by ring_nf + _ = Real.sqrt 250 * Real.sqrt ((s⁻¹) ^ 2 * (L⁻¹ * E)) := by + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 250)] + _ = Real.sqrt 250 * + (Real.sqrt ((s⁻¹) ^ 2) * Real.sqrt (L⁻¹ * E)) := by + rw [Real.sqrt_mul (sq_nonneg s⁻¹)] + _ = Real.sqrt 250 * (s⁻¹ * (Real.sqrt L⁻¹ * Real.sqrt E)) := by + rw [Real.sqrt_sq hs_inv_nonneg, Real.sqrt_mul hL_inv_nonneg] + _ = Real.sqrt 250 * s⁻¹ * Real.sqrt L⁻¹ * Real.sqrt E := by ring + have hsqrtF : + Real.sqrt (15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2) = + Real.sqrt 15000 * (s⁻¹) ^ 2 * L⁻¹ * D * B := by + exact sqrt_const_mul_fourth_mul_sq_mul_sq_mul_sq + (by norm_num : (0 : ℝ) ≤ 15000) hL_inv_nonneg hD_nonneg hB_nonneg + have henergy_coeff : + Real.sqrt 250 * s⁻¹ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) := by + exact mul_le_mul hC_energy hs_inv_le hs_inv_nonneg hC_nonneg + have henergy_term : + Real.sqrt 250 * s⁻¹ * Real.sqrt L⁻¹ * Real.sqrt E ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * + Real.sqrt E := by + have htail : + 0 ≤ Real.sqrt L⁻¹ * Real.sqrt E := + mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + calc + Real.sqrt 250 * s⁻¹ * Real.sqrt L⁻¹ * Real.sqrt E + = (Real.sqrt 250 * s⁻¹) * (Real.sqrt L⁻¹ * Real.sqrt E) := by ring + _ ≤ + (C * Real.rpow s (-(3 / 2 : ℝ))) * + (Real.sqrt L⁻¹ * Real.sqrt E) := + mul_le_mul_of_nonneg_right henergy_coeff htail + _ = C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * + Real.sqrt E := by ring + have hforce_coeff_bound : + Real.sqrt 15000 * D ≤ C := by + calc + Real.sqrt 15000 * D ≤ + Real.sqrt 15000 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) := + mul_le_mul_of_nonneg_left hD_le (Real.sqrt_nonneg 15000) + _ = Real.sqrt 15000 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) := rfl + _ ≤ C := hC_force + have hforce_coeff : + (Real.sqrt 15000 * D) * (s⁻¹) ^ 2 ≤ + C * Real.rpow s (-3 : ℝ) := by + exact mul_le_mul hforce_coeff_bound hs_inv_sq_le + (sq_nonneg s⁻¹) hC_nonneg + have hforce_term : + Real.sqrt 15000 * (s⁻¹) ^ 2 * L⁻¹ * D * B ≤ + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B := by + have htail : 0 ≤ L⁻¹ * B := mul_nonneg hL_inv_nonneg hB_nonneg + calc + Real.sqrt 15000 * (s⁻¹) ^ 2 * L⁻¹ * D * B + = ((Real.sqrt 15000 * D) * (s⁻¹) ^ 2) * (L⁻¹ * B) := by ring + _ ≤ (C * Real.rpow s (-3 : ℝ)) * (L⁻¹ * B) := + mul_le_mul_of_nonneg_right hforce_coeff htail + _ = C * Real.rpow s (-3 : ℝ) * L⁻¹ * B := by ring + calc + Real.sqrt + (250 * (s⁻¹) ^ 2 * L⁻¹ * E + + 15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2) ≤ + Real.sqrt (250 * (s⁻¹) ^ 2 * L⁻¹ * E) + + Real.sqrt (15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2) := + sqrt_add_le_add_sqrt_of_nonneg hA_nonneg hF_nonneg + _ = + Real.sqrt 250 * s⁻¹ * Real.sqrt L⁻¹ * Real.sqrt E + + Real.sqrt 15000 * (s⁻¹) ^ 2 * L⁻¹ * D * B := by + rw [hsqrtA, hsqrtF] + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * Real.sqrt E + + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B := + add_le_add henergy_term hforce_term + +private theorem coarsePoincareRHSGradientExpanded_le_publicRHS + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) (hC_energy : Real.sqrt 250 ≤ C) + (hC_force : + Real.sqrt 15000 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) ^ 2 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + coarsePoincareWithRHSGradientRHS ((d : ℝ) * C) Q a s g u := by + let L : ℝ := lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a) + let Lpub : ℝ := Ch02.lambdaSq Q (s / 2) (Ch02.MultiscaleExponent.finite 2) a + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let D : ℝ := + (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2) + have hs_le : s ≤ 1 := hs_lt.le + have hs_half : 0 < s / 2 := by nlinarith + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact + multiscale_ellipticity_lambdaSq_finite_nonneg + Q (s / 2) 2 (publicCoeffField Q a) + (by norm_num : (0 : ℝ) ≤ 2) + (by positivity : 0 ≤ (s / 2) * (2 : ℝ)) + have hL_inv_nonneg : 0 ≤ L⁻¹ := inv_nonneg.mpr hL_nonneg + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hE_nonneg : 0 ≤ E := by + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (forcedSolutionGradientField u)) + have hB_nonneg : 0 ≤ B := by + simpa [B, scaleNormalizedPositiveBesovVectorSeminormTwo] using + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := g) hg + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hD_le : + D ≤ + (d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2) := by + dsimp [D] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact rpow_three_nat_add_le_nat_add_one d hs_le + have hinner : + Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2 ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + have hsqrtL_public : + Real.sqrt L⁻¹ ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) := by + simpa [L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a hs_half + have hL_inv_public : + L⁻¹ ≤ (d : ℝ) * Real.rpow Lpub (-1 : ℝ) := by + simpa [L, Lpub] using + lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_public_rpow_neg_one + Q a hs_half + have henergy_public : + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * Real.sqrt E ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + ((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * Real.sqrt E := by + have hcoeff_nonneg : + 0 ≤ C * Real.rpow s (-(3 / 2 : ℝ)) := + mul_nonneg hC_nonneg (Real.rpow_nonneg hs.le _) + have htail : + Real.sqrt L⁻¹ * Real.sqrt E ≤ + ((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * Real.sqrt E := + mul_le_mul_of_nonneg_right hsqrtL_public (Real.sqrt_nonneg E) + calc + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * Real.sqrt E + = + (C * Real.rpow s (-(3 / 2 : ℝ))) * + (Real.sqrt L⁻¹ * Real.sqrt E) := by ring + _ ≤ + (C * Real.rpow s (-(3 / 2 : ℝ))) * + (((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * Real.sqrt E) := + mul_le_mul_of_nonneg_left htail hcoeff_nonneg + _ = + C * Real.rpow s (-(3 / 2 : ℝ)) * + ((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * Real.sqrt E := by ring + have hforce_public : + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B ≤ + C * Real.rpow s (-3 : ℝ) * + ((d : ℝ) * Real.rpow Lpub (-1 : ℝ)) * B := by + have hcoeff_nonneg : 0 ≤ C * Real.rpow s (-3 : ℝ) := + mul_nonneg hC_nonneg (Real.rpow_nonneg hs.le _) + have htail : + L⁻¹ * B ≤ ((d : ℝ) * Real.rpow Lpub (-1 : ℝ)) * B := + mul_le_mul_of_nonneg_right hL_inv_public hB_nonneg + calc + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B + = (C * Real.rpow s (-3 : ℝ)) * (L⁻¹ * B) := by ring + _ ≤ + (C * Real.rpow s (-3 : ℝ)) * + (((d : ℝ) * Real.rpow Lpub (-1 : ℝ)) * B) := + mul_le_mul_of_nonneg_left htail hcoeff_nonneg + _ = + C * Real.rpow s (-3 : ℝ) * + ((d : ℝ) * Real.rpow Lpub (-1 : ℝ)) * B := by ring + calc + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) ^ 2 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + = + Real.sqrt + (250 * (s⁻¹) ^ 2 * L⁻¹ * E + + 15000 * (s⁻¹) ^ 4 * (L⁻¹) ^ 2 * D ^ 2 * B ^ 2) := by + rfl + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * Real.sqrt L⁻¹ * Real.sqrt E + + C * Real.rpow s (-3 : ℝ) * L⁻¹ * B := + coarsePoincareGradient_scalar_sqrt_bound d C s L E B D + hC_nonneg hC_energy hC_force hs hs_le hL_inv_nonneg hs_inv_nonneg + hE_nonneg hB_nonneg hD_nonneg hD_le + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + ((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * Real.sqrt E + + C * Real.rpow s (-3 : ℝ) * + ((d : ℝ) * Real.rpow Lpub (-1 : ℝ)) * B := + add_le_add henergy_public hforce_public + _ = + coarsePoincareWithRHSGradientRHS ((d : ℝ) * C) Q a s g u := by + unfold coarsePoincareWithRHSGradientRHS poincareLowerEllipticityFactor + rw [← forcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) u] + simp [Lpub] + ring + +/-- The deterministic zero-trace RHS energy envelope is bounded by the +note-facing public zero-Dirichlet RHS. This algebraic bridge is reused by the +Dirichlet energy consequence, where the zero-boundary auxiliary solution is +constructed internally rather than supplied as a public `ZeroTraceForcedCubeSolution`. -/ +theorem zeroTraceDirichletEnergyEnvelope_sqrt_le_publicRHS + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} + (ht : 0 < t) (ht_lt : t < 1 / 2) + (hg : ForceBesovRegularity Q (2 * t) g) : + Real.sqrt + (_root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) (2 * t) g) ≤ + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g := by + let L : ℝ := lambdaSq Q t (MultiscaleExponent.finite 2) (publicCoeffField Q a) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q (2 * t) g + let D : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + (2 * t)) + let K : ℝ := 250 + 2 * Real.sqrt 15000 * Real.sqrt 2 + have ht_le_one : t ≤ 1 := by nlinarith + have htwo_t_pos : 0 < 2 * t := by nlinarith + have htwo_t_le_one : 2 * t ≤ 1 := by nlinarith + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact + multiscale_ellipticity_lambdaSq_finite_nonneg + Q t 2 (publicCoeffField Q a) + (by norm_num : (0 : ℝ) ≤ 2) + (by positivity : 0 ≤ t * (2 : ℝ)) + have hL_inv_nonneg : 0 ≤ L⁻¹ := inv_nonneg.mpr hL_nonneg + have hB_nonneg : 0 ≤ B := by + simpa [B, scaleNormalizedPositiveBesovVectorSeminormTwo] using + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := 2 * t) (g := g) hg + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hD_le : + D ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + dsimp [D] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + (2 * t)) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact rpow_three_nat_add_le_nat_add_one d htwo_t_le_one + exact mul_le_mul_of_nonneg_left hpow (by exact_mod_cast Nat.zero_le d) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hKsqrt_nonneg : 0 ≤ Real.sqrt K := Real.sqrt_nonneg K + have hconstD : + Real.sqrt K * D ≤ C := by + calc + Real.sqrt K * D ≤ + Real.sqrt K * ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) := + mul_le_mul_of_nonneg_left hD_le hKsqrt_nonneg + _ ≤ C := by simpa [K] using hC_zero + have htwo_t_inv_nonneg : 0 ≤ (2 * t)⁻¹ := inv_nonneg.mpr htwo_t_pos.le + have htwo_t_inv_le : + (2 * t)⁻¹ ≤ Real.rpow t (-(3 / 2 : ℝ)) := by + have h1 : (2 * t)⁻¹ ≤ t⁻¹ := by + simpa [one_div] using + one_div_le_one_div_of_le ht (by nlinarith : t ≤ 2 * t) + have h2 : t⁻¹ ≤ Real.rpow t (-(3 / 2 : ℝ)) := by + exact inv_le_rpow_neg_three_halves ht ht_le_one + exact h1.trans h2 + have hsqrtF : + Real.sqrt + (15000 * (2 * t)⁻¹ ^ 4 * L⁻¹ ^ 2 * + (D * Real.sqrt 2) ^ 2 * B ^ 2) = + Real.sqrt 15000 * (2 * t)⁻¹ ^ 2 * L⁻¹ * + (D * Real.sqrt 2) * B := by + exact sqrt_const_mul_fourth_mul_sq_mul_sq_mul_sq + (by norm_num : (0 : ℝ) ≤ 15000) hL_inv_nonneg + (mul_nonneg hD_nonneg (Real.sqrt_nonneg 2)) hB_nonneg + have henv_eq : + _root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) (2 * t) g = + K * D ^ 2 * (2 * t)⁻¹ ^ 2 * L⁻¹ * B ^ 2 := by + have hraw : + _root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) (2 * t) g = + (D * B) ^ 2 * (250 * (2 * t)⁻¹ ^ 2 * L⁻¹) + + 2 * |D * B| * + Real.sqrt + (15000 * (2 * t)⁻¹ ^ 4 * L⁻¹ ^ 2 * + (D * Real.sqrt 2) ^ 2 * B ^ 2) := by + dsimp [D, B, L] + unfold _root_.Homogenization.zeroTraceDirichletEnergyEnvelope + simp only [lambdaSq] + ring_nf + have habs : |D * B| = D * B := + abs_of_nonneg (mul_nonneg hD_nonneg hB_nonneg) + rw [hraw, habs, hsqrtF] + dsimp [K] + ring + have hsqrt_prod : + Real.sqrt (K * D ^ 2 * (2 * t)⁻¹ ^ 2 * L⁻¹ * B ^ 2) = + Real.sqrt K * D * (2 * t)⁻¹ * Real.sqrt L⁻¹ * B := by + calc + Real.sqrt (K * D ^ 2 * (2 * t)⁻¹ ^ 2 * L⁻¹ * B ^ 2) + = + Real.sqrt + (K * (D ^ 2 * ((2 * t)⁻¹ ^ 2 * (L⁻¹ * B ^ 2)))) := by + ring_nf + _ = + Real.sqrt K * + Real.sqrt (D ^ 2 * ((2 * t)⁻¹ ^ 2 * (L⁻¹ * B ^ 2))) := by + rw [Real.sqrt_mul hK_nonneg] + _ = + Real.sqrt K * + (Real.sqrt (D ^ 2) * + Real.sqrt ((2 * t)⁻¹ ^ 2 * (L⁻¹ * B ^ 2))) := by + rw [Real.sqrt_mul (sq_nonneg D)] + _ = + Real.sqrt K * + (D * (Real.sqrt ((2 * t)⁻¹ ^ 2) * + Real.sqrt (L⁻¹ * B ^ 2))) := by + rw [Real.sqrt_sq hD_nonneg] + rw [Real.sqrt_mul (sq_nonneg (2 * t)⁻¹)] + _ = + Real.sqrt K * + (D * ((2 * t)⁻¹ * (Real.sqrt L⁻¹ * Real.sqrt (B ^ 2)))) := by + rw [Real.sqrt_sq htwo_t_inv_nonneg] + rw [Real.sqrt_mul hL_inv_nonneg] + _ = + Real.sqrt K * (D * ((2 * t)⁻¹ * (Real.sqrt L⁻¹ * B))) := by + rw [Real.sqrt_sq hB_nonneg] + _ = Real.sqrt K * D * (2 * t)⁻¹ * Real.sqrt L⁻¹ * B := by ring + have hsqrtL_public : + Real.sqrt L⁻¹ ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a t (Ch02.MultiscaleExponent.finite 2) := by + simpa [L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a ht + have htail : 0 ≤ Real.sqrt L⁻¹ * B := + mul_nonneg (Real.sqrt_nonneg _) hB_nonneg + have hpublic_tail : + Real.sqrt L⁻¹ * B ≤ + ((d : ℝ) * + poincareLowerEllipticityFactor Q a t (Ch02.MultiscaleExponent.finite 2)) * B := + mul_le_mul_of_nonneg_right hsqrtL_public hB_nonneg + have hcoeff : + (Real.sqrt K * D) * (2 * t)⁻¹ ≤ + C * Real.rpow t (-(3 / 2 : ℝ)) := by + exact mul_le_mul hconstD htwo_t_inv_le htwo_t_inv_nonneg hC_nonneg + have hcoeff_public_nonneg : 0 ≤ C * Real.rpow t (-(3 / 2 : ℝ)) := + mul_nonneg hC_nonneg (Real.rpow_nonneg ht.le _) + calc + Real.sqrt + (_root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) (2 * t) g) + = + Real.sqrt (K * D ^ 2 * (2 * t)⁻¹ ^ 2 * L⁻¹ * B ^ 2) := by + rw [henv_eq] + _ = + Real.sqrt K * D * (2 * t)⁻¹ * Real.sqrt L⁻¹ * B := hsqrt_prod + _ = + (Real.sqrt K * D) * (2 * t)⁻¹ * (Real.sqrt L⁻¹ * B) := by ring + _ ≤ + (C * Real.rpow t (-(3 / 2 : ℝ))) * (Real.sqrt L⁻¹ * B) := + mul_le_mul_of_nonneg_right hcoeff htail + _ ≤ + (C * Real.rpow t (-(3 / 2 : ℝ))) * + (((d : ℝ) * + poincareLowerEllipticityFactor Q a t (Ch02.MultiscaleExponent.finite 2)) * B) := + mul_le_mul_of_nonneg_left hpublic_tail hcoeff_public_nonneg + _ = + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a t g := by + unfold zeroDirichletEnergyWithRHSRHS poincareLowerEllipticityFactor + simp [B, scaleNormalizedPositiveBesovVectorSeminormTwo] + ring + +/-- Public theorem package for the coarse-grained Poincare estimate with +right-hand side, together with the auxiliary zero-Dirichlet energy estimate. -/ +structure CoarsePoincareRHSTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionGradientField u) ≤ + coarsePoincareWithRHSGradientRHS C Q a s g u) ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {t : ℝ} + {g : Vec d → Vec d} (v : ZeroTraceForcedCubeSolution Q a g), + 0 < t → t < 1 / 2 → ForceBesovRegularity Q (2 * t) g → + zeroTraceForcedSolutionEnergyNorm Q a v ≤ + zeroDirichletEnergyWithRHSRHS C Q a t g) + +/-- Public theorem package for the coarse-grained Poincare estimate with +right-hand side and the auxiliary zero-Dirichlet energy estimate. -/ +theorem coarsePoincareRHSTheory {d : ℕ} [NeZero d] : + CoarsePoincareRHSTheory d where + exists_constant := by + let CgradEnergy : ℝ := Real.sqrt 250 + let CgradForce : ℝ := + Real.sqrt 15000 * + ((d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) + let Czero : ℝ := + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) + let Cbase : ℝ := max 1 (max (max CgradEnergy CgradForce) Czero) + let C : ℝ := (d : ℝ) * Cbase + have hCbase_pos : 0 < Cbase := by + exact lt_of_lt_of_le zero_lt_one + (le_max_left 1 (max (max CgradEnergy CgradForce) Czero)) + have hCbase_nonneg : 0 ≤ Cbase := hCbase_pos.le + have hC_pos : 0 < C := by + dsimp [C] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + exact mul_pos hd_pos hCbase_pos + have hC_energy : Real.sqrt 250 ≤ Cbase := by + calc + Real.sqrt 250 = CgradEnergy := rfl + _ ≤ max CgradEnergy CgradForce := le_max_left _ _ + _ ≤ max (max CgradEnergy CgradForce) Czero := le_max_left _ _ + _ ≤ Cbase := le_max_right _ _ + have hC_force : + Real.sqrt 15000 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ Cbase := by + calc + Real.sqrt 15000 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) + = CgradForce := rfl + _ ≤ max CgradEnergy CgradForce := le_max_right _ _ + _ ≤ max (max CgradEnergy CgradForce) Czero := le_max_left _ _ + _ ≤ Cbase := le_max_right _ _ + have hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ Cbase := by + calc + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) + = Czero := rfl + _ ≤ max (max CgradEnergy CgradForce) Czero := le_max_right _ _ + _ ≤ Cbase := le_max_right _ _ + refine ⟨C, hC_pos, ?_, ?_⟩ + · intro Q a s g u hs hs_lt hg + have hdet := + _root_.Homogenization.cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn_of_cubeVectorBesovHRegularity + (Q := Q) (a := publicCoeffField Q a) (g := g) + (u := publicH1ToCubeSet u.toH1) + (s := s) (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hs_lt.le (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + u.weakSolution) + hg + have hpub := + coarsePoincareRHSGradientExpanded_le_publicRHS + (d := d) (C := Cbase) hCbase_nonneg hC_energy hC_force u hs hs_lt hg + rw [scaleNormalizedNegativeBesovVectorNorm_finite_two_eq_cubeBesovNegativeVectorSeminormTwo] + have hmain := hdet.trans (by simpa [C, forcedSolutionGradientField] using hpub) + simpa [forcedSolutionGradientField] using hmain + · intro Q a t g v ht ht_lt hg + have htwo_t_pos : 0 < 2 * t := by nlinarith + have htwo_t_le_one : 2 * t ≤ 1 := by nlinarith + have hdet := + _root_.Homogenization.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded_of_isZeroTraceDirichletRhsWeakSolution_of_cubeVectorBesovHRegularity + (Q := Q) (a := publicCoeffField Q a) (g := g) + (v := publicH10ToCubeSet v.toH10) + (s := 2 * t) (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + htwo_t_pos htwo_t_le_one (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (isZeroTraceDirichletRhsWeakSolution_publicCoeffField_cubeSet_of_zeroTraceForcedCubeSolution + v) + hg + have henergy : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + v.toH10.toH1Function.grad) ≤ + _root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) (2 * t) g := by + simpa using hdet + rw [zeroTraceForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField] + exact (Real.sqrt_le_sqrt henergy).trans + (zeroTraceDirichletEnergyEnvelope_sqrt_le_publicRHS + (d := d) (C := Cbase) hCbase_nonneg hC_zero ht ht_lt hg) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Duality.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Duality.lean new file mode 100644 index 0000000000..721bfa743e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Duality.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.DualityPositivePairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.SharpLoss + +/-! # Duality -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.3.1: Duality estimate from flux defect to solution comparison + +This file freezes the public contract for +`l.duality.from.flux.defect.deterministic.theory`. +-/ + +noncomputable section + +/-- Public two-exponent replacement package for the deterministic duality +estimate. This is the proved replacement surface for the false same-exponent +route: the comparison fields are measured at exponent `s`, while the localized +flux defect is measured at an independent exponent `t < s / 2`. -/ +structure FluxDefectDualityTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {a0 : ConstantCoeffMatrix d} + {s t : ℝ} {j : ℕ}, + IsPositiveScalarMatrix a0.matrix → + (w : HomogenizationComparisonDatum Q a a0) → + 0 < s → 0 < t → t < s / 2 → s < 1 → + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v ≤ + dualityFromFluxDefectExponentLossRHS C Q a a0 s t j w.u + +private theorem fluxDefectDualityTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss + {d : ℕ} [NeZero d] {Cproj : ℝ} + (hproj : ScalarSolutionComparisonDualityEstimateExponentLoss d Cproj) : + FluxDefectDualityTheory d := by + let C : ℝ := Cproj + 1 + have hC_pos : 0 < C := by + dsimp [C] + linarith [hproj.1] + refine ⟨⟨C, hC_pos, ?_⟩⟩ + intro Q a a0 s t j ha0 w hs ht hts hs_lt + rcases ha0 with ⟨sigma0, hsigma0, ha0eq⟩ + let L : ℝ := + localizedFluxDefectNegativeBesovAverageTwo Q t + (fluxDefect (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) w.u.grad) j + have hlhs_eq : + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v = + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + (scalarMatrix (d := d) sigma0) w.u.grad w.v.grad := by + simpa [ha0eq] using + homogenizationComparisonNegativeBesovLHS_eq_solutionComparisonNegativeBesovLhs_publicCoeffField + Q a a0 s w.u w.v + have hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) + w.u.grad w.v.grad := by + simpa [ha0eq, publicH1ToCubeSet_grad] using + w.isHomogenizationComparisonPairOn_publicCoeffField_cubeSet + have hF : + MemVectorL2 (cubeSet Q) + (fluxDefect (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) + w.u.grad) := by + have hbase : + MemVectorL2 (cubeSet Q) + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) := + publicH1_fluxDefect_memVectorL2_descendant_cubeSet + (Q := Q) (R := Q) (a := a) (a0 := a0) (j := 0) w.u (by simp) + simpa [ha0eq] using hbase + have hinternal : + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + (scalarMatrix (d := d) sigma0) w.u.grad w.v.grad ≤ + Cproj * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L := by + dsimp [L] + exact + solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimateExponentLoss + hproj Q (publicCoeffField Q a) sigma0 w.u.grad w.v.grad j + hsigma0 hs ht hts hs_lt hF hcomparison + have hlocalized_eq : + localizedHomogenizationFluxDefectAverage Q a a0 t j w.u = L := by + dsimp [L] + simpa [ha0eq] using + localizedHomogenizationFluxDefectAverage_eq_localizedFluxDefectNegativeBesovAverageTwo_publicCoeffField + Q a a0 t j w.u + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact localizedFluxDefectNegativeBesovAverageTwo_nonneg Q t + (fluxDefect (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) w.u.grad) j + have hfactor_nonneg : + 0 ≤ s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ := by + have ht_half : t < 1 / 2 := by nlinarith + exact mul_nonneg + (mul_nonneg (inv_nonneg.mpr hs.le) + (pow_nonneg (inv_nonneg.mpr ht.le) _)) + (inv_nonneg.mpr (by linarith : 0 ≤ (1 / 2 : ℝ) - t)) + calc + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v + = + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + (scalarMatrix (d := d) sigma0) w.u.grad w.v.grad := hlhs_eq + _ ≤ + Cproj * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L := hinternal + _ ≤ + C * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L := by + have hright_nonneg : + 0 ≤ s⁻¹ * (t⁻¹) ^ (2 : ℕ) * + ((1 / 2 : ℝ) - t)⁻¹ * L := + mul_nonneg hfactor_nonneg hL_nonneg + calc + Cproj * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L = + Cproj * + (s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L) := by ring + _ ≤ + C * + (s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L) := + mul_le_mul_of_nonneg_right (by dsimp [C]; linarith) hright_nonneg + _ = + C * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * L := by ring + _ = dualityFromFluxDefectExponentLossRHS C Q a a0 s t j w.u := by + unfold dualityFromFluxDefectExponentLossRHS + rw [hlocalized_eq] + +private theorem fluxDefectDualityTheory_of_dirichletBesov_of_coordinateBridgeSharpLoss_of_localizedPairing + {d : ℕ} [NeZero d] {Cdir Cbridge Cpairing : ℝ} + (hdir : DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d Cdir) + (hbridge : UnitFullDualCoordinateOverlappingBridgeSharpLoss d Cbridge) + (hpair : LocalizedFluxDefectPositivePairingEstimate d Cpairing) : + FluxDefectDualityTheory d := + fluxDefectDualityTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss + ((scalarSolutionComparisonGenuineDualityEstimateSharpLoss_of_dirichletBesov_of_coordinateBridgeSharpLoss_of_localizedPairing + hdir hbridge hpair).to_exponentLoss) + +/-- Public two-exponent duality package with the Dirichlet Besov theorem and +localized positive pairing theorem discharged. The only remaining analytic +input is the honest sharp-boundary coordinate full-dual-test/ +overlapping-positive bridge. -/ +private theorem fluxDefectDualityTheory_of_coordinateBridge + {d : ℕ} [NeZero d] {Cbridge : ℝ} + (hbridge : UnitFullDualCoordinateOverlappingBridgeSharpLoss d Cbridge) : + FluxDefectDualityTheory d := by + rcases Homogenization.exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform d with + ⟨Cdir, hdir⟩ + exact + fluxDefectDualityTheory_of_dirichletBesov_of_coordinateBridgeSharpLoss_of_localizedPairing + hdir hbridge + (localizedFluxDefectPositivePairingEstimate_standardOverlap d) + +/-- Public two-exponent duality package with all currently formalized +analytic inputs discharged. -/ +theorem fluxDefectDualityTheory + (d : ℕ) [NeZero d] : + FluxDefectDualityTheory d := + fluxDefectDualityTheory_of_coordinateBridge + (unitFullDualCoordinateOverlappingBridgeSharpLoss d) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/DualityPositivePairing.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/DualityPositivePairing.lean new file mode 100644 index 0000000000..a15bb770d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/DualityPositivePairing.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainder +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardOverlapComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.Contracts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Localization + +/-! # Duality Positive Pairing -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Localized positive-test pairing + +This file isolates the part of the positive-test bridge that is already +available from the standard, non-overlapping Ch3 Besov duality theorem. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Standard positive-Besov version of the localized flux-defect pairing. + +The remaining bridge work is to compare the corrected overlapping positive +norm used by the Dirichlet theorem with this standard positive norm. -/ +theorem abs_cubeAverage_vecDot_le_localized_negative_standard_positive_besov + {d : ℕ} {Q : TriadicCube d} {s : ℝ} (j : ℕ) + {F H : Vec d → Vec d} {B : ℝ} + (hs : 0 < s) (hs_lt_one : s < 1) + (hF : MemVectorL2 (cubeSet Q) F) + (hH : ForceBesovRegularity Q s H) + (hB : 0 ≤ B) + (hHnorm : scaleNormalizedPositiveBesovVectorNormTwo Q s H ≤ B) : + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s F j * B := by + let C0 : ℝ := 1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q s F j + let P : ℝ := scaleNormalizedPositiveBesovVectorNormTwo Q s H + have hF_lp : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hF + have hdescBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N F) := by + intro R hR + have hFR : MemVectorL2 (cubeSet R) F := by + simpa [MemVectorL2, volumeMeasureOn] using + hF.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + exact cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs F + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R hFR) + have hfull_le_L : cubeBesovNegativeVectorSeminormTwo Q s F ≤ L := by + dsimp [L] + exact + cubeBesovNegativeVectorSeminormTwo_le_sqrt_descendantsAverage_sq_of_memLp_of_descendant_bddAbove + Q hs F hF_lp j hdescBdd + have hparentBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N F) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs F hF_lp + have hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ L := by + intro N + exact (le_csSup hparentBdd ⟨N, rfl⟩).trans hfull_le_L + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact localizedFluxDefectNegativeBesovAverageTwo_nonneg Q s F j + have hdual : + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ C0 * L * P := by + simpa [C0, L, P] using + abs_cubeAverage_vecDot_le_public_negative_positive_besov_duality_of_partial_flux_bound + (Q := Q) (s := s) (Bflux := L) (F := F) (H := H) + hs hs_lt_one.le hF_lp hH hL_nonneg hneg + have hC0_nonneg : 0 ≤ C0 := by + dsimp [C0] + exact add_nonneg zero_le_one + (mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _)) + have hsinv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_lt_one.le + have hP_le_sinv_mul_B : P ≤ s⁻¹ * B := by + have hB_le : B ≤ s⁻¹ * B := by nlinarith + exact hHnorm.trans hB_le + have htarget : C0 * L * P ≤ C0 * s⁻¹ * L * B := by + calc + C0 * L * P = (C0 * L) * P := by ring + _ ≤ (C0 * L) * (s⁻¹ * B) := + mul_le_mul_of_nonneg_left hP_le_sinv_mul_B + (mul_nonneg hC0_nonneg hL_nonneg) + _ = C0 * s⁻¹ * L * B := by ring + exact hdual.trans htarget + +theorem forceBesovRegularity_of_overlappingBesovHRegularity + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {H : Vec d → Vec d} + (hH : CubeVectorOverlappingBesovHRegularity Q s H) : + ForceBesovRegularity Q s H := by + exact + ⟨hH.memLp, + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_overlapping + Q s H hH.partialSeminorms_bddAbove⟩ + +theorem scaleNormalizedPositiveBesovVectorNormTwo_le_sqrt_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (H : Vec d → Vec d) + (hH : CubeVectorOverlappingBesovHRegularity Q s H) : + scaleNormalizedPositiveBesovVectorNormTwo Q s H ≤ + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorNormTwo Q s H := by + simpa [scaleNormalizedPositiveBesovVectorNormTwo, + scaleNormalizedPositiveBesovVectorSeminormTwo] using + positiveVectorNormTwo_le_sqrt_three_pow_mul_overlappingNorm + Q s H hH.partialSeminorms_bddAbove + +/-- Overlapping positive-Besov version of the localized flux-defect pairing. + +This is the budgeted bridge needed by the restored duality argument. It is +obtained from the standard positive-Besov pairing and the finite-overlap +comparison between the corrected overlapping positive norm and the standard +positive norm. -/ +theorem abs_cubeAverage_vecDot_le_localized_negative_overlapping_positive_besov + {d : ℕ} {Q : TriadicCube d} {s : ℝ} (j : ℕ) + {F H : Vec d → Vec d} {B : ℝ} + (hs : 0 < s) (hs_lt_one : s < 1) + (hF : MemVectorL2 (cubeSet Q) F) + (hH : CubeVectorOverlappingBesovHRegularity Q s H) + (hB : 0 ≤ B) + (hHnorm : cubeBesovOverlappingPositiveVectorNormTwo Q s H ≤ B) : + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ + ((1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + Real.sqrt (3 ^ d : ℝ)) * + s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s F j * B := by + let C0 : ℝ := 1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) + let K : ℝ := Real.sqrt (3 ^ d : ℝ) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact Real.sqrt_nonneg _ + have hstdReg : ForceBesovRegularity Q s H := + forceBesovRegularity_of_overlappingBesovHRegularity hH + have hstdNorm : + scaleNormalizedPositiveBesovVectorNormTwo Q s H ≤ K * B := by + exact + (scaleNormalizedPositiveBesovVectorNormTwo_le_sqrt_three_pow_mul_overlapping + Q s H hH).trans + (mul_le_mul_of_nonneg_left hHnorm hK_nonneg) + have hKB : 0 ≤ K * B := mul_nonneg hK_nonneg hB + have hstandard := + abs_cubeAverage_vecDot_le_localized_negative_standard_positive_besov + (Q := Q) (s := s) (F := F) (H := H) (B := K * B) j + hs hs_lt_one hF hstdReg hKB hstdNorm + simpa [C0, K, mul_comm, mul_left_comm, mul_assoc] using hstandard + +theorem localizedFluxDefectPositivePairingEstimate_standardOverlap + (d : ℕ) [NeZero d] : + LocalizedFluxDefectPositivePairingEstimate d + ((1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + Real.sqrt (3 ^ d : ℝ)) := by + constructor + · exact mul_nonneg + (add_nonneg zero_le_one + (mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _))) + (Real.sqrt_nonneg _) + · intro Q s j F H B hs hs_lt_one hF hHreg hB hHnorm + exact + abs_cubeAverage_vecDot_le_localized_negative_overlapping_positive_besov + (Q := Q) (s := s) (F := F) (H := H) (B := B) j + hs hs_lt_one hF hHreg hB hHnorm + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS.lean new file mode 100644 index 0000000000..0587158309 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Theory + +/-! # Energy RHS -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Basic.lean new file mode 100644 index 0000000000..73cc93625e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Basic.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.OneCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.Flux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyPoincare + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Basic L2 and Besov controls +-/ + +noncomputable section + +open scoped ENNReal + +private theorem vecNormSq_le_card_mul_norm_sq {d : ℕ} (v : Vec d) : + vecNormSq v ≤ (Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2 := by + rw [vecNormSq, vecDot] + calc + (∑ i : Fin d, v i * v i) ≤ ∑ _i : Fin d, ‖v‖ ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hcoord_abs : |v i| ≤ ‖v‖ := by + simpa [Real.norm_eq_abs] using norm_le_pi_norm v i + have hcoord_sq : |v i| ^ 2 ≤ ‖v‖ ^ 2 := by + nlinarith [abs_nonneg (v i), norm_nonneg v] + simpa [sq_abs, pow_two] using hcoord_sq + _ = (Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + +/-- The Euclidean square average of a vector field is controlled by the `L²` +cube norm coming from the ambient sup norm, with the expected dimension factor. -/ +theorem cubeAverage_vecNormSq_le_card_mul_cubeLpNorm_two_sq + {d : ℕ} {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage Q (fun x => vecNormSq (F x)) ≤ + (Fintype.card (Fin d) : ℝ) * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ 2 := by + let card : ℝ := Fintype.card (Fin d) + have hF_mem : MemVectorL2 (cubeSet Q) F := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hF + have hvec_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (F x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hF_mem hF_mem + have hF_vol : MeasureTheory.MemLp F (2 : ENNReal) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemVectorL2, volumeMeasureOn] using hF_mem + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖F x‖ ^ (2 : ℕ)) + (cubeSet Q) MeasureTheory.volume := by + have h := hF_vol.integrable_norm_rpow (by norm_num : (2 : ENNReal) ≠ 0) + (by norm_num : (2 : ENNReal) ≠ ⊤) + simpa using! h + have havg : + cubeAverage Q (fun x => vecNormSq (F x)) ≤ + cubeAverage Q (fun x => card * ‖F x‖ ^ (2 : ℕ)) := by + unfold cubeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr (cubeVolume_nonneg Q)) + exact + MeasureTheory.integral_mono_ae hvec_int (hnorm_int.const_mul card) <| + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x _hx => vecNormSq_le_card_mul_norm_sq (F x) + have hscale : + cubeAverage Q (fun x => card * ‖F x‖ ^ (2 : ℕ)) = + card * cubeAverage Q (fun x => ‖F x‖ ^ (2 : ℕ)) := by + unfold cubeAverage + rw [MeasureTheory.integral_const_mul] + ring + have hlp_sq : + (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℕ) = + cubeAverage Q (fun x => ‖F x‖ ^ (2 : ℕ)) := by + simpa using + cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := Q) (p := (2 : ℝ≥0∞)) + (f := F) (by norm_num) (by norm_num) hF + calc + cubeAverage Q (fun x => vecNormSq (F x)) + ≤ cubeAverage Q (fun x => card * ‖F x‖ ^ (2 : ℕ)) := havg + _ = card * cubeAverage Q (fun x => ‖F x‖ ^ (2 : ℕ)) := hscale + _ = card * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ 2 := by + rw [hlp_sq] + +/-- The depth-zero positive Besov seminorm controls the top-scale fluctuation +`L²` norm. -/ +theorem cubeLpNorm_two_cubeFluctuationVec_le_scaleNormalizedPositiveBesovVectorSeminormTwo + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {F : Vec d → Vec d} + (hF : ForceBesovRegularity Q s F) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q F) ≤ + scaleNormalizedPositiveBesovVectorSeminormTwo Q s F := by + have hpartial_le : + cubeBesovPositiveVectorPartialSeminormTwo Q s 0 F ≤ + cubeBesovPositiveVectorSeminormTwo Q s F := + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s F hF.partialSeminorms_bddAbove 0 + have hpartial_eq : + cubeBesovPositiveVectorPartialSeminormTwo Q s 0 F = + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q F) := by + unfold cubeBesovPositiveVectorPartialSeminormTwo cubeBesovPositiveVectorDepthSeminorm + simp [cubeBesovPositiveVectorDepthAverage_depth_zero, Real.sqrt_sq, + cubeLpNorm_nonneg] + simpa [scaleNormalizedPositiveBesovVectorSeminormTwo, hpartial_eq] using hpartial_le + +/-- The full public positive Besov norm controls the top-scale cube `L²` norm. -/ +theorem cubeLpNorm_two_le_scaleNormalizedPositiveBesovVectorNormTwo + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {F : Vec d → Vec d} + (hF : ForceBesovRegularity Q s F) : + cubeLpNorm Q (2 : ℝ≥0∞) F ≤ + scaleNormalizedPositiveBesovVectorNormTwo Q s F := by + have hfluct_le := + cubeLpNorm_two_cubeFluctuationVec_le_scaleNormalizedPositiveBesovVectorSeminormTwo + (Q := Q) (s := s) (F := F) hF + have hfluct_mem : MeasureTheory.MemLp (cubeFluctuationVec Q F) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q F hF.memLp + have hconst_mem : MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q F) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q F) + calc + cubeLpNorm Q (2 : ℝ≥0∞) F + = cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => cubeFluctuationVec Q F x + cubeAverageVec Q F) := by + congr 1 + funext x + simp [cubeFluctuationVec] + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q F) + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => cubeAverageVec Q F) := + cubeLpNorm_add_le Q (2 : ℝ≥0∞) (cubeFluctuationVec Q F) + (fun _ : Vec d => cubeAverageVec Q F) hfluct_mem hconst_mem (by norm_num) + _ = cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q F) + + ‖cubeAverageVec Q F‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) + (c := cubeAverageVec Q F) (by norm_num)] + _ ≤ scaleNormalizedPositiveBesovVectorSeminormTwo Q s F + + Real.sqrt (vecNormSq (cubeAverageVec Q F)) := by + exact add_le_add hfluct_le (norm_le_sqrt_vecNormSq (cubeAverageVec Q F)) + _ = scaleNormalizedPositiveBesovVectorNormTwo Q s F := by + unfold scaleNormalizedPositiveBesovVectorNormTwo + ring + +/-- Euclidean cube `L²` size is controlled by the public positive Besov norm, +with only the ambient dimension factor coming from the sup-norm model of +`Vec d`. -/ +theorem sqrt_cubeAverage_vecNormSq_le_sqrt_card_mul_scaleNormalizedPositiveBesovVectorNormTwo + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {F : Vec d → Vec d} + (hF : ForceBesovRegularity Q s F) : + Real.sqrt (cubeAverage Q (fun x => vecNormSq (F x))) ≤ + Real.sqrt (Fintype.card (Fin d) : ℝ) * + scaleNormalizedPositiveBesovVectorNormTwo Q s F := by + let card : ℝ := Fintype.card (Fin d) + let X : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let N : ℝ := scaleNormalizedPositiveBesovVectorNormTwo Q s F + have hcard_nonneg : 0 ≤ card := by + dsimp [card] + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have havg_le : + cubeAverage Q (fun x => vecNormSq (F x)) ≤ card * X ^ 2 := by + simpa [card, X] using + cubeAverage_vecNormSq_le_card_mul_cubeLpNorm_two_sq + (Q := Q) (F := F) hF.memLp + have hX_le : X ≤ N := by + simpa [X, N] using + cubeLpNorm_two_le_scaleNormalizedPositiveBesovVectorNormTwo + (Q := Q) (s := s) (F := F) hF + have hX_nonneg : 0 ≤ X := by + dsimp [X] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hN_nonneg : 0 ≤ N := by + dsimp [N, scaleNormalizedPositiveBesovVectorNormTwo] + exact add_nonneg (Real.sqrt_nonneg _) + (scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := F) hF) + have hsq_le : X ^ 2 ≤ N ^ 2 := by + nlinarith + have hfinal_avg : + cubeAverage Q (fun x => vecNormSq (F x)) ≤ card * N ^ 2 := + havg_le.trans (mul_le_mul_of_nonneg_left hsq_le hcard_nonneg) + calc + Real.sqrt (cubeAverage Q (fun x => vecNormSq (F x))) + ≤ Real.sqrt (card * N ^ 2) := + Real.sqrt_le_sqrt hfinal_avg + _ = Real.sqrt card * N := by + rw [Real.sqrt_mul hcard_nonneg] + rw [Real.sqrt_sq hN_nonneg] + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/BoundaryGradient.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/BoundaryGradient.lean new file mode 100644 index 0000000000..3e0e23084e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/BoundaryGradient.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainder + +/-! # Boundary Gradient -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Boundary-gradient estimates +-/ + +noncomputable section + +open scoped ENNReal + +/-- On the public pointwise coefficient representative, coefficient energy is +controlled by the top-scale raw ellipticity bound. This is the analytic core +of the boundary-gradient half of the Dirichlet energy estimate; the final +note-facing theorem still has to absorb this raw bound into the displayed +multiscale upper-ellipticity factor. -/ +theorem cubeAverage_coefficientEnergyDensity_publicCoeffField_le_Lam_mul_cubeAverage_vecNormSq + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {F : Vec d → Vec d} (hF : MemVectorL2 (cubeSet Q) F) : + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) F) ≤ + (a.coeffOn Q).Lam * cubeAverage Q (fun x => vecNormSq (F x)) := by + let A : CoeffField d := publicCoeffField Q a + let Lam : ℝ := (a.coeffOn Q).Lam + have hEll : IsEllipticFieldOn (a.coeffOn Q).lam Lam (cubeSet Q) A := by + simpa [A, Lam] using publicCoeffField_isEllipticFieldOn_cubeSet Q a + have henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A F) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hF + have hsq_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (F x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hF hF + have hpoint : + ∀ x ∈ cubeSet Q, + coefficientEnergyDensity A F x ≤ Lam * vecNormSq (F x) := by + intro x hx + unfold coefficientEnergyDensity + exact upperBound_symmPart_of_isEllipticMatrix (hEll.2 x hx) (F x) + have havg : + cubeAverage Q (coefficientEnergyDensity A F) ≤ + cubeAverage Q (fun x => Lam * vecNormSq (F x)) := by + unfold cubeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr (cubeVolume_nonneg Q)) + exact + MeasureTheory.integral_mono_ae henergy_int (hsq_int.const_mul Lam) <| + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall hpoint + have hscale : + cubeAverage Q (fun x => Lam * vecNormSq (F x)) = + Lam * cubeAverage Q (fun x => vecNormSq (F x)) := by + unfold cubeAverage + rw [MeasureTheory.integral_const_mul] + ring + simpa [A, Lam] using havg.trans_eq hscale + +/-- Boundary-gradient coefficient energy is bounded by the raw ellipticity +constant times the Euclidean `L²` size of the public boundary gradient. -/ +theorem dirichletBoundaryGradient_energy_le_Lam_mul_cubeAverage_vecNormSq + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v)) ≤ + (a.coeffOn Q).Lam * + cubeAverage Q (fun x => vecNormSq (dirichletBoundaryGradientField v x)) := by + have hF : MemVectorL2 (cubeSet Q) (dirichletBoundaryGradientField v) := by + simpa [dirichletBoundaryGradientField, publicH1ToCubeSet_grad] using + (publicH1ToCubeSet v.boundaryData).grad_memVectorL2 + exact + cubeAverage_coefficientEnergyDensity_publicCoeffField_le_Lam_mul_cubeAverage_vecNormSq + (Q := Q) (a := a) hF + +/-- Square-root boundary-gradient version of the raw top-ellipticity bridge. -/ +theorem dirichletBoundaryGradient_sqrt_two_energy_le_sqrt_rawLam_l2 + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) ≤ + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt + (cubeAverage Q (fun x => vecNormSq (dirichletBoundaryGradientField v x))) := by + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v)) + let L : ℝ := + cubeAverage Q (fun x => vecNormSq (dirichletBoundaryGradientField v x)) + let Lam : ℝ := (a.coeffOn Q).Lam + have hE_le : E ≤ Lam * L := by + simpa [E, L, Lam] using + dirichletBoundaryGradient_energy_le_Lam_mul_cubeAverage_vecNormSq + (Q := Q) (a := a) (g := g) v + have hLam_nonneg : 0 ≤ Lam := by + exact le_trans (le_of_lt (a.coeffOn Q).lam_pos) (by simpa [Lam] using (a.coeffOn Q).lam_le_Lam) + have hmul : + 2 * E ≤ 2 * Lam * L := by + nlinarith + simpa [E, L, Lam, mul_assoc] using + (calc + Real.sqrt (2 * E) + ≤ Real.sqrt (2 * Lam * L) := + Real.sqrt_le_sqrt hmul + _ = + Real.sqrt (2 * Lam) * Real.sqrt L := by + rw [Real.sqrt_mul (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hLam_nonneg)]) + +/-- Boundary-gradient coefficient energy controlled by the public positive +Besov norm, with the raw top ellipticity constant still explicit. -/ +theorem dirichletBoundaryGradient_sqrt_two_energy_le_sqrt_card_rawLam_mul_positiveBesovNorm + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) ≤ + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt (Fintype.card (Fin d) : ℝ) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + have hraw := + dirichletBoundaryGradient_sqrt_two_energy_le_sqrt_rawLam_l2 + (Q := Q) (a := a) (g := g) v + have hl2 := + sqrt_cubeAverage_vecNormSq_le_sqrt_card_mul_scaleNormalizedPositiveBesovVectorNormTwo + (Q := Q) (s := s) (F := dirichletBoundaryGradientField v) hboundary + calc + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) + ≤ + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt + (cubeAverage Q (fun x => vecNormSq (dirichletBoundaryGradientField v x))) := + hraw + _ ≤ + Real.sqrt (2 * (a.coeffOn Q).Lam) * + (Real.sqrt (Fintype.card (Fin d) : ℝ) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) := + mul_le_mul_of_nonneg_left hl2 (Real.sqrt_nonneg _) + _ = + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt (Fintype.card (Fin d) : ℝ) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + ring + +/-- Boundary-gradient half of the public Dirichlet energy estimate, conditional +on the remaining scalar absorption from the raw top ellipticity constant into +the public multiscale upper-ellipticity factor. -/ +theorem dirichletBoundaryGradient_sqrt_two_energy_le_dirichletEnergySecondTerm_of_rawLam_absorption + {d : ℕ} [NeZero d] {C : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (habsorb : + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt (Fintype.card (Fin d) : ℝ) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2)) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + have hnorm_nonneg : + 0 ≤ scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + unfold scaleNormalizedPositiveBesovVectorNormTwo + exact add_nonneg (Real.sqrt_nonneg _) + (scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := dirichletBoundaryGradientField v) hboundary) + calc + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) + ≤ + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt (Fintype.card (Fin d) : ℝ) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + dirichletBoundaryGradient_sqrt_two_energy_le_sqrt_card_rawLam_mul_positiveBesovNorm + (Q := Q) (a := a) (s := s) (g := g) v hboundary + _ ≤ + (C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2)) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + mul_le_mul_of_nonneg_right habsorb hnorm_nonneg + _ = + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + ring + +/-- Assembly bridge for the public Dirichlet energy estimate: once the +zero-trace and boundary pieces are each bounded by their public RHS +contributions, the full Dirichlet energy bound follows from the coefficient +energy triangle inequality. -/ +theorem dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceDifference_and_boundary_bounds + {d : ℕ} [NeZero d] {C : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (hzero : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x))) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) + (hboundary : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v := by + let E₀ : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x)) + let Eh : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v)) + have hE₀_nonneg : 0 ≤ E₀ := by + dsimp [E₀] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x)) + have hEh_nonneg : 0 ≤ Eh := by + dsimp [Eh] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (dirichletBoundaryGradientField v)) + have hsplit : + dirichletForcedSolutionEnergyNorm Q a v ≤ Real.sqrt (2 * E₀ + 2 * Eh) := by + simpa [E₀, Eh] using + dirichletForcedSolutionEnergyNorm_le_sqrt_two_mul_zeroTraceDifference_add_boundary + (Q := Q) (a := a) (g := g) v + calc + dirichletForcedSolutionEnergyNorm Q a v + ≤ Real.sqrt (2 * E₀ + 2 * Eh) := hsplit + _ ≤ Real.sqrt (2 * E₀) + Real.sqrt (2 * Eh) := by + exact sqrt_add_le_add_sqrt_of_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hE₀_nonneg) + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hEh_nonneg) + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + exact add_le_add hzero hboundary + _ = dirichletEnergyWithRHSRHS C Q a s g v := by + rfl + +/-- Dirichlet energy assembly with the boundary-gradient half discharged by +the raw-ellipticity absorption bridge. This leaves only the zero-trace +difference estimate as an external input. -/ +theorem dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceDifference_bound_and_rawLam_absorption + {d : ℕ} [NeZero d] {C : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (hzero : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x))) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) + (habsorb : + Real.sqrt (2 * (a.coeffOn Q).Lam) * + Real.sqrt (Fintype.card (Fin d) : ℝ) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2)) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v := + dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceDifference_and_boundary_bounds + (Q := Q) (a := a) (s := s) (g := g) v hzero + (dirichletBoundaryGradient_sqrt_two_energy_le_dirichletEnergySecondTerm_of_rawLam_absorption + (Q := Q) (a := a) (s := s) (g := g) v habsorb hboundary) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Corrector.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Corrector.lean new file mode 100644 index 0000000000..73886303e8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Corrector.lean @@ -0,0 +1,406 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.BoundaryGradient + +/-! # Corrector -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Zero-trace corrector estimates +-/ + +noncomputable section + +open scoped ENNReal + +private theorem sqrt_two_mul_rpow_half_neg_three_halves {s : ℝ} (hs : 0 < s) : + Real.sqrt 2 * (s / 2) ^ (-(3 / 2 : ℝ)) = + 4 * s ^ (-(3 / 2 : ℝ)) := by + have hscale : + (s / 2) ^ (-(3 / 2 : ℝ)) = + (2 : ℝ) ^ (3 / 2 : ℝ) * s ^ (-(3 / 2 : ℝ)) := by + calc + (s / 2) ^ (-(3 / 2 : ℝ)) + = + s ^ (-(3 / 2 : ℝ)) / (2 : ℝ) ^ (-(3 / 2 : ℝ)) := by + rw [Real.div_rpow hs.le (by norm_num : (0 : ℝ) ≤ 2)] + _ = + s ^ (-(3 / 2 : ℝ)) / ((2 : ℝ) ^ (3 / 2 : ℝ))⁻¹ := by + rw [Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 2)] + _ = + (2 : ℝ) ^ (3 / 2 : ℝ) * s ^ (-(3 / 2 : ℝ)) := by + field_simp + have htwo : Real.sqrt 2 * (2 : ℝ) ^ (3 / 2 : ℝ) = 4 := by + rw [Real.sqrt_eq_rpow] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 2)] + norm_num + rw [hscale, ← mul_assoc, htwo] + +/-- Zero-boundary auxiliary Dirichlet correctors satisfy the public +zero-Dirichlet energy bound at `t = s / 2`. This is the `v₀` half of the +Dirichlet energy consequence, separated from the boundary harmonic remainder. -/ +theorem zeroTraceDirichletCorrectorData_energyNorm_le_zeroDirichletEnergyWithRHSRHS_half_publicCoeffField + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) ≤ + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a (s / 2) g := by + have hs_le : s ≤ 1 := hs_lt.le + have henergy : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + _root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded_of_cubeVectorBesovHRegularity + (s := s) (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hs_le (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hg + have hs_half_pos : 0 < s / 2 := by nlinarith + have hs_half_lt : s / 2 < 1 / 2 := by nlinarith + have htwo : 2 * (s / 2) = s := by ring + have hg_half : ForceBesovRegularity Q (2 * (s / 2)) g := by + simpa [htwo] using hg + have hpub : + Real.sqrt + (_root_.Homogenization.zeroTraceDirichletEnergyEnvelope + Q (publicCoeffField Q a) s g) ≤ + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a (s / 2) g := by + simpa [htwo] using + zeroTraceDirichletEnergyEnvelope_sqrt_le_publicRHS + (d := d) (C := C) hC_nonneg hC_zero + (Q := Q) (a := a) (t := s / 2) (g := g) + hs_half_pos hs_half_lt hg_half + exact (Real.sqrt_le_sqrt henergy).trans hpub + +/-- Canonical public zero-trace corrector version of the zero-boundary +Dirichlet energy bound. -/ +theorem publicZeroTraceDirichletCorrectorData_energyNorm_le_zeroDirichletEnergyWithRHSRHS_half + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => + (zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)).toH10.toH1Function.grad x))) ≤ + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C) Q a (s / 2) g := + zeroTraceDirichletCorrectorData_energyNorm_le_zeroDirichletEnergyWithRHSRHS_half_publicCoeffField + (C := C) hC_nonneg hC_zero + (ρ := zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)) + hs hs_lt hg + +/-- Zero-boundary auxiliary Dirichlet correctors satisfy the zero-trace part of +the public Dirichlet energy RHS after absorbing the half-scale normalization +and the factor `sqrt 2` from the energy split. -/ +theorem zeroTraceDirichletCorrectorData_sqrt_two_energyNorm_le_dirichletEnergyFirstTerm_publicCoeffField + {d : ℕ} [NeZero d] {C₀ C : ℝ} + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + have hbase : + Real.sqrt E ≤ + zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a (s / 2) g := by + simpa [E] using + zeroTraceDirichletCorrectorData_energyNorm_le_zeroDirichletEnergyWithRHSRHS_half_publicCoeffField + (C := C₀) hC₀_nonneg hC₀_zero (ρ := ρ) hs hs_lt hg + have hlower_nonneg : + 0 ≤ poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) := by + unfold poincareLowerEllipticityFactor + exact Real.rpow_nonneg + (Ch02.lambdaSq_finite_nonneg Q a (by nlinarith : 0 < s / 2) + (by norm_num : (1 : ℝ) ≤ 2)) _ + have hseminorm_nonneg : + 0 ≤ scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := g) hg + have htail_nonneg : + 0 ≤ Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := + mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) hlower_nonneg) + hseminorm_nonneg + calc + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) + = + Real.sqrt 2 * Real.sqrt E := by + dsimp [E] + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 2)] + _ ≤ Real.sqrt 2 * zeroDirichletEnergyWithRHSRHS ((d : ℝ) * C₀) Q a (s / 2) g := + mul_le_mul_of_nonneg_left hbase (Real.sqrt_nonneg 2) + _ = + (4 * ((d : ℝ) * C₀)) * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + unfold zeroDirichletEnergyWithRHSRHS + rw [show 2 * (s / 2) = s by ring] + change + Real.sqrt 2 * + (((d : ℝ) * C₀) * (s / 2) ^ (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) = + (4 * ((d : ℝ) * C₀)) * s ^ (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + rw [show + Real.sqrt 2 * (((d : ℝ) * C₀) * (s / 2) ^ (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) = + ((d : ℝ) * C₀) * (Real.sqrt 2 * (s / 2) ^ (-(3 / 2 : ℝ))) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g by ring] + rw [sqrt_two_mul_rpow_half_neg_three_halves hs] + ring + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + calc + (4 * ((d : ℝ) * C₀)) * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + = + (4 * ((d : ℝ) * C₀)) * + (Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) := by + ring + _ ≤ + C * + (Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) := + mul_le_mul_of_nonneg_right hC_absorb htail_nonneg + _ = + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + ring + +/-- Canonical public zero-trace corrector version of the first Dirichlet RHS +summand bound. -/ +theorem publicZeroTraceDirichletCorrectorData_sqrt_two_energyNorm_le_dirichletEnergyFirstTerm + {d : ℕ} [NeZero d] {C₀ C : ℝ} + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => + (zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)).toH10.toH1Function.grad x))) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := + zeroTraceDirichletCorrectorData_sqrt_two_energyNorm_le_dirichletEnergyFirstTerm_publicCoeffField + (C₀ := C₀) (C := C) hC₀_nonneg hC₀_zero hC_absorb + (ρ := zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)) + hs hs_lt hg + +/-- Dirichlet energy assembly along the manuscript decomposition after the +zero-trace corrector half has been discharged by the public zero-Dirichlet +estimate. The remaining explicit input is the homogeneous boundary-remainder +energy bound. -/ +theorem dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceCorrector_public_bound_and_harmonicRemainder_bound + {d : ℕ} [NeZero d] {C₀ C : ℝ} + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hharmonic : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v := + dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceCorrector_and_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) v ρ w hgrad + (zeroTraceDirichletCorrectorData_sqrt_two_energyNorm_le_dirichletEnergyFirstTerm_publicCoeffField + (C₀ := C₀) (C := C) hC₀_nonneg hC₀_zero hC_absorb + (ρ := ρ) hs hs_lt hg) + hharmonic + +/-- Canonical public zero-trace-corrector variant of the manuscript Dirichlet +energy assembly. -/ +theorem dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_publicZeroTraceCorrector_and_harmonicRemainder_bound + {d : ℕ} [NeZero d] {C₀ C : ℝ} + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => + (zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)).toH10.toH1Function.grad x + + w.toH1.grad x) + (hharmonic : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v := + dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceCorrector_public_bound_and_harmonicRemainder_bound + (C₀ := C₀) (C := C) hC₀_nonneg hC₀_zero hC_absorb + (Q := Q) (a := a) (s := s) (g := g) v + (zeroTraceDirichletCorrectorData_publicCoeffField Q a + (memVectorL2_cubeSet_of_forceBesovRegularity hg)) + w hgrad hs hs_lt hg hharmonic + +/-- The zero-trace corrector and homogeneous harmonic remainder in the +manuscript Dirichlet decomposition can be constructed from the public forced +Dirichlet solution. The resulting energy estimate still isolates the genuine +boundary-remainder energy input. -/ +theorem exists_zeroTraceCorrector_harmonicRemainder_dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_harmonicRemainder_bound + {d : ℕ} [NeZero d] {C₀ C : ℝ} + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + ∃ ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g, + ∃ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q), + (v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) ∧ + ((Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) → + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v) := by + let U : H1Function (cubeSet Q) := publicH1ToCubeSet v.toH1 + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) U g := by + simpa [U] using + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := v.toH1) (g := g) v.weakSolution + have hg_mem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_forceBesovRegularity hg + have hresidual : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (publicCoeffField Q a x) (U.grad x) - g x) := + hweak.residual_solenoidal + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hg_mem + rcases + _root_.Homogenization.ZeroTraceDirichletCorrectorData.exists_corrector_aHarmonicRemainder_of_parent_potential_solenoidal + (Q := Q) (R := Q) (a := publicCoeffField Q a) (g := g) (n := 0) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (u := U.grad) + U.isPotentialOn hresidual (by simp [descendantsAtDepth_zero]) + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + U.grad_memVectorL2 hg_mem with + ⟨ρ, w, hsplit_point⟩ + have hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x := by + refine (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro x hx + have hx_split : + U.grad x = w.toH1.grad x + ρ.toH10.toH1Function.grad x := + hsplit_point x hx + simpa [U, publicH1ToCubeSet_grad, add_comm] using hx_split + refine ⟨ρ, w, hgrad, ?_⟩ + intro hharmonic + exact + dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceCorrector_public_bound_and_harmonicRemainder_bound + (C₀ := C₀) (C := C) hC₀_nonneg hC₀_zero hC_absorb + (Q := Q) (a := a) (s := s) (g := g) v ρ w hgrad + hs hs_lt hg hharmonic + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/DirichletSplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/DirichletSplit.lean new file mode 100644 index 0000000000..5bcd930b32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/DirichletSplit.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Basic + +/-! # Dirichlet Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Dirichlet splitting +-/ + +noncomputable section + +open scoped ENNReal + +/-- Dirichlet forced-solution energy reduced to the chosen zero-trace +correction and the boundary-gradient energy. This is the square-root form of +the public `v = (v - h) + h` energy split. -/ +theorem dirichletForcedSolutionEnergyNorm_le_sqrt_two_mul_zeroTraceDifference_add_boundary + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x)) + + 2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField v))) := by + rw [dirichletForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) v] + exact Real.sqrt_le_sqrt + (v.cubeAverage_energy_le_two_mul_zeroTraceDifference_add_boundary) + +/-- Coefficient-energy triangle inequality for a decomposition +`F = G + H` on the cube. This is the reusable analytic split behind the +Dirichlet proof route `v = v₀ + \widetilde h`. -/ +theorem cubeAverage_coefficientEnergyDensity_le_two_mul_add_of_ae_eq_add + {d : ℕ} {Q : TriadicCube d} {A : CoeffField d} {lam Lam : ℝ} + {F G H : Vec d → Vec d} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) A) + (hF : MemVectorL2 (cubeSet Q) F) + (hG : MemVectorL2 (cubeSet Q) G) + (hH : MemVectorL2 (cubeSet Q) H) + (hFGH : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => G x + H x) : + cubeAverage Q (coefficientEnergyDensity A F) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity A G) + + 2 * cubeAverage Q (coefficientEnergyDensity A H) := by + let Hneg : Vec d → Vec d := (-1 : ℝ) • H + have hHneg : MemVectorL2 (cubeSet Q) Hneg := by + dsimp [Hneg] + exact hH.const_smul (-1) + have hF_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A F) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hF + have hG_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A G) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hG + have hHneg_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A Hneg) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hHneg + have hmem : + ∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet Q), x ∈ cubeSet Q := + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 + (Filter.Eventually.of_forall fun _ hx => hx) + have hpoint : + ∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet Q), + coefficientEnergyDensity A F x ≤ + 2 * (coefficientEnergyDensity A G x + + coefficientEnergyDensity A Hneg x) := by + filter_upwards [hmem, hFGH] with x hx hsum + have hleft : + coefficientEnergyDensity A F x = + coefficientEnergyDensity A (fun y => G y - Hneg y) x := by + have hvec : F x = G x - Hneg x := by + rw [hsum] + simp [Hneg] + unfold coefficientEnergyDensity + rw [hvec] + exact hleft.trans_le + (coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + hEll G Hneg x hx) + have havg_raw : + cubeAverage Q (coefficientEnergyDensity A F) ≤ + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A G x + + coefficientEnergyDensity A Hneg x)) := by + unfold cubeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr (cubeVolume_nonneg Q)) + exact + MeasureTheory.integral_mono_ae hF_int + ((hG_int.add hHneg_int).const_mul (2 : ℝ)) hpoint + have hsplit : + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A G x + + coefficientEnergyDensity A Hneg x)) = + 2 * cubeAverage Q (coefficientEnergyDensity A G) + + 2 * cubeAverage Q (coefficientEnergyDensity A Hneg) := by + unfold cubeAverage + have hfun : + (fun x => 2 * (coefficientEnergyDensity A G x + + coefficientEnergyDensity A Hneg x)) = + fun x => 2 * coefficientEnergyDensity A G x + + 2 * coefficientEnergyDensity A Hneg x := by + funext x + ring + rw [hfun, MeasureTheory.integral_add (hG_int.const_mul (2 : ℝ)) + (hHneg_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + have hneg_avg : + cubeAverage Q (coefficientEnergyDensity A Hneg) = + cubeAverage Q (coefficientEnergyDensity A H) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x _hx + unfold coefficientEnergyDensity + simp [Hneg, matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + calc + cubeAverage Q (coefficientEnergyDensity A F) + ≤ + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A G x + + coefficientEnergyDensity A Hneg x)) := havg_raw + _ = + 2 * cubeAverage Q (coefficientEnergyDensity A G) + + 2 * cubeAverage Q (coefficientEnergyDensity A Hneg) := hsplit + _ = + 2 * cubeAverage Q (coefficientEnergyDensity A G) + + 2 * cubeAverage Q (coefficientEnergyDensity A H) := by + rw [hneg_avg] + +/-- Dirichlet forced-solution energy split along the manuscript decomposition +`v = v₀ + \widetilde h`, where `v₀` is a zero-Dirichlet corrector and +`\widetilde h` is the homogeneous boundary-data remainder. -/ +theorem dirichletForcedSolutionEnergyNorm_le_sqrt_two_mul_zeroTraceCorrector_add_harmonicRemainder + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) + + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + let E₀ : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + let Eh : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) + have hF : MemVectorL2 (cubeSet Q) v.toH1.grad := by + simpa [publicH1ToCubeSet_grad] using + (publicH1ToCubeSet v.toH1).grad_memVectorL2 + have hsplit : + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) v.toH1.grad) ≤ + 2 * E₀ + 2 * Eh := by + simpa [E₀, Eh] using + cubeAverage_coefficientEnergyDensity_le_two_mul_add_of_ae_eq_add + (Q := Q) (A := publicCoeffField Q a) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (F := v.toH1.grad) + (G := fun x => ρ.toH10.toH1Function.grad x) + (H := fun x => w.toH1.grad x) + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + hF ρ.toH10.toH1Function.grad_memVectorL2 w.toH1.grad_memVectorL2 + hgrad + have hE₀_nonneg : 0 ≤ E₀ := by + dsimp [E₀] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => ρ.toH10.toH1Function.grad x)) + have hEh_nonneg : 0 ≤ Eh := by + dsimp [Eh] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => w.toH1.grad x)) + calc + dirichletForcedSolutionEnergyNorm Q a v + = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) v.toH1.grad)) := by + rw [dirichletForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) v] + _ ≤ Real.sqrt (2 * E₀ + 2 * Eh) := Real.sqrt_le_sqrt hsplit + _ ≤ Real.sqrt (2 * E₀) + Real.sqrt (2 * Eh) := by + exact sqrt_add_le_add_sqrt_of_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hE₀_nonneg) + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hEh_nonneg) + _ = + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) + + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + simp [E₀, Eh] + +/-- Manuscript-route assembly for the public Dirichlet estimate: after +choosing the zero-Dirichlet forced corrector and the homogeneous boundary +remainder, the two square-root bounds imply the displayed RHS. -/ +theorem dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_zeroTraceCorrector_and_harmonicRemainder_bounds + {d : ℕ} [NeZero d] {C : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) + (hzero : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) + (hharmonic : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v := by + calc + dirichletForcedSolutionEnergyNorm Q a v + ≤ + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => ρ.toH10.toH1Function.grad x))) + + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := + dirichletForcedSolutionEnergyNorm_le_sqrt_two_mul_zeroTraceCorrector_add_harmonicRemainder + (Q := Q) (a := a) (g := g) v ρ w hgrad + _ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + add_le_add hzero hharmonic + _ = dirichletEnergyWithRHSRHS C Q a s g v := by + rfl + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainder.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainder.lean new file mode 100644 index 0000000000..e07f5c80ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainder.lean @@ -0,0 +1,907 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.DirichletSplit + +/-! # Harmonic Remainder -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Harmonic remainder estimates +-/ + +noncomputable section + +open scoped ENNReal + +private theorem sqrt_two_mul_le_of_le_mul_sqrt {E K : ℝ} + (hE : 0 ≤ E) (hK : 0 ≤ K) (h : E ≤ K * Real.sqrt E) : + Real.sqrt (2 * E) ≤ Real.sqrt 2 * K := by + let x : ℝ := Real.sqrt E + have hx_nonneg : 0 ≤ x := by + dsimp [x] + exact Real.sqrt_nonneg E + have hx_sq : x ^ 2 = E := by + dsimp [x] + exact Real.sq_sqrt hE + have hx_le_K : x ≤ K := by + by_cases hx_zero : x = 0 + · simpa [hx_zero] using hK + · have hx_pos : 0 < x := lt_of_le_of_ne hx_nonneg (Ne.symm hx_zero) + by_contra hx_not_le + have hK_lt_x : K < x := lt_of_not_ge hx_not_le + have hmul_lt : K * x < x * x := + mul_lt_mul_of_pos_right hK_lt_x hx_pos + have hmul_le : x * x ≤ K * x := by + have h' : x ^ 2 ≤ K * x := by + rw [hx_sq] + simpa [x] using h + simpa [pow_two] using h' + exact (not_lt_of_ge hmul_le) hmul_lt + calc + Real.sqrt (2 * E) + = Real.sqrt 2 * x := by + rw [show 2 * E = 2 * x ^ 2 by rw [hx_sq]] + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 2)] + rw [Real.sqrt_sq hx_nonneg] + _ ≤ Real.sqrt 2 * K := + mul_le_mul_of_nonneg_left hx_le_K (Real.sqrt_nonneg 2) + +private theorem sqrt_two_energy_le_scaled_rhs_of_pairing + {E Cpair Cflux C S P B : ℝ} + (hE_nonneg : 0 ≤ E) (hS_nonneg : 0 ≤ S) (hP_nonneg : 0 ≤ P) + (hB_nonneg : 0 ≤ B) (hCpair_nonneg : 0 ≤ Cpair) + (hCflux_nonneg : 0 ≤ Cflux) + (hC_absorb : Real.sqrt 2 * Cpair * Cflux ≤ C) + (hpairing : + E ≤ (Cpair * (Cflux * S * P) * B) * Real.sqrt E) : + Real.sqrt (2 * E) ≤ C * S * P * B := by + let K : ℝ := Cpair * (Cflux * S * P) * B + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg + (mul_nonneg hCpair_nonneg + (mul_nonneg (mul_nonneg hCflux_nonneg hS_nonneg) hP_nonneg)) + hB_nonneg + have hcancel : Real.sqrt (2 * E) ≤ Real.sqrt 2 * K := + sqrt_two_mul_le_of_le_mul_sqrt hE_nonneg hK_nonneg (by simpa [K] using hpairing) + have hSPB_nonneg : 0 ≤ S * P * B := + mul_nonneg (mul_nonneg hS_nonneg hP_nonneg) hB_nonneg + have habsorb_scaled : + (Real.sqrt 2 * Cpair * Cflux) * (S * P * B) ≤ + C * (S * P * B) := + mul_le_mul_of_nonneg_right hC_absorb hSPB_nonneg + calc + Real.sqrt (2 * E) ≤ Real.sqrt 2 * K := hcancel + _ = (Real.sqrt 2 * Cpair * Cflux) * (S * P * B) := by + dsimp [K] + ring + _ ≤ C * (S * P * B) := habsorb_scaled + _ = C * S * P * B := by + ring + +private theorem geometricDiscount_two_rpow_neg_half_le_sqrt_five_mul_rpow_neg_half + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) : + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) ≤ + Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ) := by + have hgd_pos : 0 < geometricDiscount s 2 := + geometricDiscount_pos (by nlinarith) + have hleft_sq : + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ)) ^ 2 = + (geometricDiscount s 2)⁻¹ := by + simpa using + (sq_rpow_neg_half_eq_inv_of_nonneg (le_of_lt hgd_pos)) + have hright_sq : + (Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ)) ^ 2 = + 5 * s⁻¹ := by + calc + (Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ)) ^ 2 = + (Real.sqrt 5) ^ 2 * (Real.rpow s (-1 / 2 : ℝ)) ^ 2 := by + ring + _ = 5 * s⁻¹ := by + rw [Real.sq_sqrt (by norm_num : (0 : ℝ) ≤ 5)] + rw [show (Real.rpow s (-1 / 2 : ℝ)) ^ 2 = s⁻¹ by + simpa using sq_rpow_neg_half_eq_inv_of_nonneg hs.le] + have hsq : + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ)) ^ 2 ≤ + (Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ)) ^ 2 := by + rw [hleft_sq, hright_sq] + exact inv_geometricDiscount_two_le_five_inv hs hs_le + exact le_of_sq_le_sq hsq + (mul_nonneg (Real.sqrt_nonneg 5) (Real.rpow_nonneg hs.le _)) + +private theorem geometricDiscount_two_mul_sqrt_LambdaSqFinite_public_le_dim_publicUpper + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s E : ℝ} (hs : 0 < s) : + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSqFinite Q s 2 (publicCoeffField Q a)) ((2 : ℝ)⁻¹) * + Real.sqrt E ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + ((d : ℝ) * poincareUpperEllipticityFactor Q a s (.finite 2)) * + Real.sqrt E := by + have hP_old_le : + Real.rpow (LambdaSqFinite Q s 2 (publicCoeffField Q a)) ((2 : ℝ)⁻¹) ≤ + (d : ℝ) * poincareUpperEllipticityFactor Q a s (.finite 2) := by + simpa [Real.sqrt_eq_rpow, one_div] using + sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + Q a hs + have hG_nonneg : + 0 ≤ Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) := + Real.rpow_nonneg (geometricDiscount_pos (by nlinarith)).le _ + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hP_old_le hG_nonneg) + (Real.sqrt_nonneg E) + +private theorem geometricDiscount_two_scale_mul_publicUpper_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s E : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) : + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + ((d : ℝ) * poincareUpperEllipticityFactor Q a s (.finite 2)) * + Real.sqrt E ≤ + (Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ)) * + ((d : ℝ) * poincareUpperEllipticityFactor Q a s (.finite 2)) * + Real.sqrt E := by + have hG_le : + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) ≤ + Real.sqrt 5 * Real.rpow s (-1 / 2 : ℝ) := + geometricDiscount_two_rpow_neg_half_le_sqrt_five_mul_rpow_neg_half hs hs_le + have hP_nonneg : 0 ≤ poincareUpperEllipticityFactor Q a s (.finite 2) := by + dsimp [poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 2)) _ + have htail_nonneg : + 0 ≤ ((d : ℝ) * poincareUpperEllipticityFactor Q a s (.finite 2)) * + Real.sqrt E := + mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d) hP_nonneg) + (Real.sqrt_nonneg E) + have h := mul_le_mul_of_nonneg_right hG_le htail_nonneg + simpa [mul_assoc] using h + +private theorem abs_vecDot_le_sqrt_vecNormSq_mul_sqrt_vecNormSq {d : ℕ} + (x y : Vec d) : + |vecDot x y| ≤ Real.sqrt (vecNormSq x) * Real.sqrt (vecNormSq y) := by + let A : ℝ := vecNormSq x + let B : ℝ := vecNormSq y + have hA : 0 ≤ A := by + simpa [A] using vecNormSq_nonneg x + have hB : 0 ≤ B := by + simpa [B] using vecNormSq_nonneg y + have hsq : (vecDot x y) ^ 2 ≤ A * B := by + simpa [A, B] using sq_vecDot_le_vecNormSq_mul_vecNormSq x y + have habs_sq : + |vecDot x y| ^ 2 ≤ (Real.sqrt A * Real.sqrt B) ^ 2 := by + calc + |vecDot x y| ^ 2 = (vecDot x y) ^ 2 := by + simp [sq_abs] + _ ≤ A * B := hsq + _ = (Real.sqrt A * Real.sqrt B) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hA, Real.sq_sqrt hB] + exact le_of_sq_le_sq habs_sq + (mul_nonneg (Real.sqrt_nonneg A) (Real.sqrt_nonneg B)) + +private theorem sqrt_vecNormSq_cubeAverageVec_le_negativePartial_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + Real.sqrt (vecNormSq (cubeAverageVec Q F)) ≤ + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 F := by + have hsq : + (Real.sqrt (vecNormSq (cubeAverageVec Q F))) ^ 2 ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 F) ^ 2 := by + rw [Real.sq_sqrt (vecNormSq_nonneg _)] + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + simp [sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] + exact le_of_sq_le_sq hsq + (cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s 0 F) + + +/-- Boundary harmonic-remainder energy from the two quantitative inputs used +in the manuscript: the weak-testing/Besov-duality pairing and the homogeneous +coarse-grained flux estimate. This deliberately keeps the route through +`poincareUpperEllipticityFactor` and contains no raw `Lam` absorption. -/ +theorem dirichletHarmonicRemainder_sqrt_two_energy_le_of_boundary_pairing_and_flux_bound + {d : ℕ} [NeZero d] {C Cpair Cflux : ℝ} + (hCpair_nonneg : 0 ≤ Cpair) (hCflux_nonneg : 0 ≤ Cflux) + (hC_absorb : Real.sqrt 2 * Cpair * Cflux ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hpairing : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + Cpair * + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) + (hflux : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) ≤ + Cflux * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)))) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) + let N : ℝ := + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + let S : ℝ := Real.rpow s (-(1 / 2 : ℝ)) + let P : ℝ := poincareUpperEllipticityFactor Q a s (.finite 2) + let B : ℝ := + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => w.toH1.grad x)) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Real.rpow_nonneg hs.le _ + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 2)) _ + have hB_nonneg : 0 ≤ B := by + dsimp [B, scaleNormalizedPositiveBesovVectorNormTwo] + exact add_nonneg (Real.sqrt_nonneg _) + (scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := dirichletBoundaryGradientField v) hboundary) + have hflux' : N ≤ Cflux * S * P * Real.sqrt E := by + simpa [N, S, P, E] using hflux + have hpairing_scaled : + E ≤ (Cpair * (Cflux * S * P) * B) * Real.sqrt E := by + have hstep : + Cpair * N * B ≤ Cpair * (Cflux * S * P * Real.sqrt E) * B := + mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hflux' hCpair_nonneg) hB_nonneg + calc + E ≤ Cpair * N * B := by + simpa [E, N, B] using hpairing + _ ≤ Cpair * (Cflux * S * P * Real.sqrt E) * B := hstep + _ = (Cpair * (Cflux * S * P) * B) * Real.sqrt E := by + ring + have hscaled : Real.sqrt (2 * E) ≤ C * S * P * B := + sqrt_two_energy_le_scaled_rhs_of_pairing hE_nonneg hS_nonneg hP_nonneg + hB_nonneg hCpair_nonneg hCflux_nonneg hC_absorb hpairing_scaled + calc + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) + = Real.sqrt (2 * E) := by + rfl + _ ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + simpa [S, P, B] using hscaled + +/-- Public wrapper for the homogeneous flux half of the notes' Dirichlet +harmonic-remainder proof. It applies the deterministic `q = 2` coarse +Poincare theorem to the public coefficient representative, rewrites +`Λ_{s,2}^{1/2}` into `poincareUpperEllipticityFactor`, and absorbs the +geometric discount into the displayed `s^(-1/2)` scale loss. -/ +theorem dirichletHarmonicRemainder_fluxSeminorm_le_poincareUpperEllipticityFactor + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) ≤ + ((d : ℝ) * Real.sqrt 5) * Real.rpow s (-1 / 2 : ℝ) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + let A : CoeffField d := publicCoeffField Q a + let N : ℝ := + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (A x) (w.toH1.grad x)) + let G : ℝ := Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) + let S : ℝ := Real.rpow s (-1 / 2 : ℝ) + let P : ℝ := poincareUpperEllipticityFactor Q a s (.finite 2) + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity A (fun x => w.toH1.grad x)) + have hdet := + (coarsePoincare_qtwo_note_bounds_of_aHarmonicFunction + (Q := Q) (a := A) (s := s) hs + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) w).2 + have henergy_eq : + cubeAverage Q (fun x => scalarVariationEnergyIntegrand A w x) = E := by + change cubeAverage Q (coefficientEnergyDensity A (fun x => w.toH1.grad x)) = E + rfl + have hdet_finite : + N ≤ G * Real.rpow (LambdaSqFinite Q s 2 A) ((2 : ℝ)⁻¹) * + Real.sqrt E := by + simpa [N, G, E, henergy_eq, LambdaSq, one_div] using hdet + have hdet' : N ≤ G * ((d : ℝ) * P) * Real.sqrt E := by + calc + N ≤ G * Real.rpow (LambdaSqFinite Q s 2 A) ((2 : ℝ)⁻¹) * + Real.sqrt E := hdet_finite + _ ≤ G * ((d : ℝ) * P) * Real.sqrt E := by + simpa [A, G, P] using + geometricDiscount_two_mul_sqrt_LambdaSqFinite_public_le_dim_publicUpper + (Q := Q) (a := a) (s := s) (E := E) hs + have hscale : + G * ((d : ℝ) * P) * Real.sqrt E ≤ + (Real.sqrt 5 * S) * ((d : ℝ) * P) * Real.sqrt E := by + simpa [G, S, P] using + geometricDiscount_two_scale_mul_publicUpper_le (Q := Q) (a := a) + (s := s) (E := E) hs hs_le + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + = N := by + rfl + _ ≤ G * ((d : ℝ) * P) * Real.sqrt E := hdet' + _ ≤ (Real.sqrt 5 * S) * ((d : ℝ) * P) * Real.sqrt E := hscale + _ = + ((d : ℝ) * Real.sqrt 5) * Real.rpow s (-1 / 2 : ℝ) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + dsimp [S, P, E, A] + ring + +/-- Finite-depth public wrapper for the homogeneous flux half of the +Dirichlet harmonic-remainder proof. This is the partial-norm version consumed +by the Besov-duality pairing theorem. -/ +theorem dirichletHarmonicRemainder_fluxPartialSeminorm_le_poincareUpperEllipticityFactor + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (N : ℕ) (hs : 0 < s) (hs_le : s ≤ 1) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) ≤ + ((d : ℝ) * Real.sqrt 5) * Real.rpow s (-1 / 2 : ℝ) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + let A : CoeffField d := publicCoeffField Q a + let flux : Vec d → Vec d := fun x => matVecMul (A x) (w.toH1.grad x) + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand A w x + let G : ℝ := Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) + let S : ℝ := Real.rpow s (-1 / 2 : ℝ) + let P : ℝ := poincareUpperEllipticityFactor Q a s (.finite 2) + let E : ℝ := + cubeAverage Q (coefficientEnergyDensity A (fun x => w.toH1.grad x)) + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) + (a.coeffOn Q).lam (a.coeffOn Q).Lam := + openCubeOriginEllipticRecoveryExistence (d := d) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + have hsum_flux := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := A) s hs (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + hOrigin + have hdet := + coarsePoincare_flux_qtwo_partial_of_cubeAverageEnergyControl + (Q := Q) (a := A) (s := s) hs (flux := flux) (energy := energy) (N := N) + (scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) A + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) w) + (ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a)) w) + (cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := A) (publicCoeffField_isEllipticFieldOn_cubeSet Q a) w hOrigin) + hsum_flux + have henergy_eq : cubeAverage Q energy = E := by + change cubeAverage Q (coefficientEnergyDensity A (fun x => w.toH1.grad x)) = E + rfl + have hdet_finite : + cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ + G * Real.rpow (LambdaSqFinite Q s 2 A) ((2 : ℝ)⁻¹) * Real.sqrt E := by + simpa [flux, energy, G, E, henergy_eq, LambdaSq, one_div] using hdet + have hdet' : + cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ + G * ((d : ℝ) * P) * Real.sqrt E := by + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ + G * Real.rpow (LambdaSqFinite Q s 2 A) ((2 : ℝ)⁻¹) * Real.sqrt E := + hdet_finite + _ ≤ G * ((d : ℝ) * P) * Real.sqrt E := by + simpa [A, G, P] using + geometricDiscount_two_mul_sqrt_LambdaSqFinite_public_le_dim_publicUpper + (Q := Q) (a := a) (s := s) (E := E) hs + have hscale : + G * ((d : ℝ) * P) * Real.sqrt E ≤ + (Real.sqrt 5 * S) * ((d : ℝ) * P) * Real.sqrt E := by + simpa [G, S, P] using + geometricDiscount_two_scale_mul_publicUpper_le (Q := Q) (a := a) + (s := s) (E := E) hs hs_le + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + = cubeBesovNegativeVectorPartialSeminormTwo Q s N flux := by + rfl + _ ≤ G * ((d : ℝ) * P) * Real.sqrt E := hdet' + _ ≤ (Real.sqrt 5 * S) * ((d : ℝ) * P) * Real.sqrt E := hscale + _ = + ((d : ℝ) * Real.sqrt 5) * Real.rpow s (-1 / 2 : ℝ) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) := by + dsimp [S, P, E, A] + ring + +/-- Weak testing for the homogeneous Dirichlet remainder. If the difference +between the homogeneous solution gradient and the prescribed boundary-extension +gradient is a zero-trace potential, then testing the homogeneous equation by +that difference identifies the energy with the boundary pairing. -/ +theorem dirichletHarmonicRemainder_energy_le_abs_boundary_pairing_of_zeroTrace + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hzero : IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.toH1.grad x - dirichletBoundaryGradientField v x)) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + |cubeAverage Q + (fun x => + vecDot + (matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + (dirichletBoundaryGradientField v x))| := by + let A : CoeffField d := publicCoeffField Q a + let flux : Vec d → Vec d := fun x => matVecMul (A x) (w.toH1.grad x) + let hgrad : Vec d → Vec d := dirichletBoundaryGradientField v + rcases hzero with ⟨φ, hφgrad⟩ + have hsol : + ∫ x in cubeSet Q, vecDot (flux x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + 0 := by + simpa [A, flux] using w.isHarmonic.2 φ + have hsol' : + ∫ x in cubeSet Q, vecDot (flux x) (w.toH1.grad x - hgrad x) ∂MeasureTheory.volume = + 0 := by + simpa [flux, hgrad, hφgrad] using hsol + have hflux_mem : MemVectorL2 (cubeSet Q) flux := by + dsimp [flux, A] + exact memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) w.toH1.grad_memVectorL2 + have hh_mem : MemVectorL2 (cubeSet Q) hgrad := by + simpa [hgrad, dirichletBoundaryGradientField, publicH1ToCubeSet_grad] using + (publicH1ToCubeSet v.boundaryData).grad_memVectorL2 + have hww_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (w.toH1.grad x)) (cubeSet Q) + MeasureTheory.volume := + integrableOn_vecDot_of_memVectorL2 hflux_mem w.toH1.grad_memVectorL2 + have hwh_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (hgrad x)) (cubeSet Q) + MeasureTheory.volume := + integrableOn_vecDot_of_memVectorL2 hflux_mem hh_mem + have hsub_fun : + (fun x => vecDot (flux x) (w.toH1.grad x - hgrad x)) = + fun x => vecDot (flux x) (w.toH1.grad x) - vecDot (flux x) (hgrad x) := by + funext x + simp [vecDot, sub_eq_add_neg, Finset.sum_add_distrib, mul_add] + have hint_eq : + ∫ x in cubeSet Q, vecDot (flux x) (w.toH1.grad x) ∂MeasureTheory.volume = + ∫ x in cubeSet Q, vecDot (flux x) (hgrad x) ∂MeasureTheory.volume := by + have hsub_int : + ∫ x in cubeSet Q, vecDot (flux x) (w.toH1.grad x - hgrad x) + ∂MeasureTheory.volume = + ∫ x in cubeSet Q, vecDot (flux x) (w.toH1.grad x) + ∂MeasureTheory.volume - + ∫ x in cubeSet Q, vecDot (flux x) (hgrad x) ∂MeasureTheory.volume := by + rw [hsub_fun] + exact MeasureTheory.integral_sub hww_int hwh_int + linarith + have henergy_avg_eq_pair : + cubeAverage Q + (coefficientEnergyDensity A (fun x => w.toH1.grad x)) = + cubeAverage Q (fun x => vecDot (flux x) (hgrad x)) := by + unfold cubeAverage + have henergy_integral : + ∫ x in cubeSet Q, coefficientEnergyDensity A (fun x => w.toH1.grad x) x + ∂MeasureTheory.volume = + ∫ x in cubeSet Q, vecDot (flux x) (w.toH1.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => by + simp [flux, coefficientEnergyDensity_eq_unsymmetrized, vecDot_comm] + rw [henergy_integral, hint_eq] + calc + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) + = cubeAverage Q (fun x => vecDot (flux x) (hgrad x)) := by + simpa [A, flux, hgrad] using henergy_avg_eq_pair + _ ≤ |cubeAverage Q (fun x => vecDot (flux x) (hgrad x))| := le_abs_self _ + _ = + |cubeAverage Q + (fun x => + vecDot + (matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + (dirichletBoundaryGradientField v x))| := by + rfl + +/-- Public `q = 2` Besov-duality wrapper for the boundary pairing. It combines +the depth-zero average term with the deterministic fluctuation duality estimate, +and absorbs the scale weights and `s ≤ 1` into the dimension-only constant +`1 + d * 3^(d+1)`. -/ +theorem abs_cubeAverage_vecDot_le_public_negative_positive_besov_duality_of_partial_flux_bound + {d : ℕ} {Q : TriadicCube d} {s Bflux : ℝ} + {F H : Vec d → Vec d} + (hs : 0 < s) (hs_le : s ≤ 1) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hH : ForceBesovRegularity Q s H) + (hBflux : 0 ≤ Bflux) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ Bflux) : + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * Bflux * + scaleNormalizedPositiveBesovVectorNormTwo Q s H := by + let Bsemi : ℝ := cubeBesovPositiveVectorSeminormTwo Q s H + let Bnorm : ℝ := scaleNormalizedPositiveBesovVectorNormTwo Q s H + have hBsemi_nonneg : 0 ≤ Bsemi := by + simpa [Bsemi, scaleNormalizedPositiveBesovVectorSeminormTwo] using + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := H) hH + have hBsemi_le_norm : Bsemi ≤ Bnorm := by + dsimp [Bnorm, scaleNormalizedPositiveBesovVectorNormTwo, Bsemi] + exact le_add_of_nonneg_left (Real.sqrt_nonneg _) + have hpos : + ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N H ≤ Bsemi := by + intro N + simpa [Bsemi, scaleNormalizedPositiveBesovVectorSeminormTwo] using + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s H hH.partialSeminorms_bddAbove N + have hdecomp := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q F H hF hH.memLp + have havg : + |vecDot (cubeAverageVec Q F) (cubeAverageVec Q H)| ≤ Bflux * Bnorm := by + have hF0 : Real.sqrt (vecNormSq (cubeAverageVec Q F)) ≤ Bflux := + (sqrt_vecNormSq_cubeAverageVec_le_negativePartial_zero Q s F).trans (hneg 0) + have hH0 : Real.sqrt (vecNormSq (cubeAverageVec Q H)) ≤ Bnorm := by + dsimp [Bnorm, scaleNormalizedPositiveBesovVectorNormTwo] + exact le_add_of_nonneg_right hBsemi_nonneg + calc + |vecDot (cubeAverageVec Q F) (cubeAverageVec Q H)| + ≤ Real.sqrt (vecNormSq (cubeAverageVec Q F)) * + Real.sqrt (vecNormSq (cubeAverageVec Q H)) := + abs_vecDot_le_sqrt_vecNormSq_mul_sqrt_vecNormSq _ _ + _ ≤ Bflux * Bnorm := + mul_le_mul hF0 hH0 (Real.sqrt_nonneg _) hBflux + have hfluct_raw := + abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_partialBounds_two_two + Q s F H hs hF hH.memLp hBsemi_nonneg hneg hpos + have hscale_cancel : + (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bflux) * + (cubeBesovScaleWeight s Q * Bsemi)) = + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * Bflux * Bsemi := by + rw [show + Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bflux) * + (cubeBesovScaleWeight s Q * Bsemi) = + Real.rpow (3 : ℝ) ((d : ℝ) + s) * + ((cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + (Bflux * Bsemi)) by ring] + rw [cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight] + ring + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + have hfluct : + |cubeAverage Q (fun x => vecDot (F x) (cubeFluctuationVec Q H x))| ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux * Bnorm := by + calc + |cubeAverage Q (fun x => vecDot (F x) (cubeFluctuationVec Q H x))| + ≤ (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bflux) * + (cubeBesovScaleWeight s Q * Bsemi)) := hfluct_raw + _ = (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * Bflux * Bsemi := + hscale_cancel + _ ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux * Bnorm := by + have hd_nonneg : 0 ≤ (d : ℝ) := by + exact_mod_cast Nat.zero_le d + have hpow1_nonneg : 0 ≤ Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + calc + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * Bflux * Bsemi + ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux * + Bsemi := by + have hbase : + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + mul_le_mul_of_nonneg_left hpow hd_nonneg + have hbaseB : + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * Bflux ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux := + mul_le_mul_of_nonneg_right hbase hBflux + exact mul_le_mul_of_nonneg_right hbaseB hBsemi_nonneg + _ ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux * + Bnorm := by + exact mul_le_mul_of_nonneg_left hBsemi_le_norm + (mul_nonneg (mul_nonneg hd_nonneg hpow1_nonneg) hBflux) + calc + |cubeAverage Q (fun x => vecDot (F x) (H x))| + = |vecDot (cubeAverageVec Q F) (cubeAverageVec Q H) + + cubeAverage Q (fun x => vecDot (F x) (cubeFluctuationVec Q H x))| := by + rw [hdecomp] + _ ≤ |vecDot (cubeAverageVec Q F) (cubeAverageVec Q H)| + + |cubeAverage Q (fun x => vecDot (F x) (cubeFluctuationVec Q H x))| := + abs_add_le _ _ + _ ≤ Bflux * Bnorm + + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Bflux * Bnorm := + add_le_add havg hfluct + _ = + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * Bflux * Bnorm := by + ring + +/-- Weak testing plus the public `q = 2` Besov-duality wrapper for the +Dirichlet harmonic remainder, with the flux side supplied as a uniform +finite-depth negative-Besov bound. -/ +theorem dirichletHarmonicRemainder_boundary_pairing_le_of_zeroTrace_and_partial_flux_bound + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} {s Bflux : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hzero : IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.toH1.grad x - dirichletBoundaryGradientField v x)) + (hBflux : 0 ≤ Bflux) + (hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) ≤ Bflux) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * Bflux * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + let flux : Vec d → Vec d := + fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x) + have hflux_mem : MemVectorL2 (cubeSet Q) flux := by + dsimp [flux] + exact memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) w.toH1.grad_memVectorL2 + have hflux_memLp : + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hflux_mem + have hweak := + dirichletHarmonicRemainder_energy_le_abs_boundary_pairing_of_zeroTrace + (Q := Q) (a := a) (g := g) v w hzero + have hdual : + |cubeAverage Q (fun x => vecDot (flux x) (dirichletBoundaryGradientField v x))| ≤ + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * Bflux * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + exact + abs_cubeAverage_vecDot_le_public_negative_positive_besov_duality_of_partial_flux_bound + (Q := Q) (s := s) (Bflux := Bflux) + (F := flux) (H := dirichletBoundaryGradientField v) + hs hs_le hflux_memLp hboundary hBflux (by + intro N + simpa [flux] using hpartial N) + exact hweak.trans (by simpa [flux] using hdual) + +/-- Harmonic-remainder energy from weak testing, public Besov duality, and a +uniform finite-depth flux bound. This is the direct partial-norm form of the +notes' argument and keeps the quantitative coefficient dependence in +`poincareUpperEllipticityFactor`. -/ +theorem dirichletHarmonicRemainder_sqrt_two_energy_le_of_zeroTrace_and_partial_flux_bound + {d : ℕ} [NeZero d] {C Cflux : ℝ} + (hCflux_nonneg : 0 ≤ Cflux) + (hC_absorb : + Real.sqrt 2 * + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * Cflux ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hzero : IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.toH1.grad x - dirichletBoundaryGradientField v x)) + (hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) ≤ + Cflux * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)))) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + let Cpair : ℝ := 1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) + let S : ℝ := Real.rpow s (-(1 / 2 : ℝ)) + let P : ℝ := poincareUpperEllipticityFactor Q a s (.finite 2) + let B : ℝ := + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) + let Bflux : ℝ := Cflux * S * P * Real.sqrt E + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (fun x => w.toH1.grad x)) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Real.rpow_nonneg hs.le _ + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 2)) _ + have hB_nonneg : 0 ≤ B := by + dsimp [B, scaleNormalizedPositiveBesovVectorNormTwo] + exact add_nonneg (Real.sqrt_nonneg _) + (scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := dirichletBoundaryGradientField v) hboundary) + have hCpair_nonneg : 0 ≤ Cpair := by + dsimp [Cpair] + positivity + have hBflux_nonneg : 0 ≤ Bflux := by + dsimp [Bflux] + exact mul_nonneg + (mul_nonneg (mul_nonneg hCflux_nonneg hS_nonneg) hP_nonneg) + (Real.sqrt_nonneg E) + have hpairing : E ≤ Cpair * Bflux * B := by + simpa [E, Cpair, Bflux, S, P, B] using + dirichletHarmonicRemainder_boundary_pairing_le_of_zeroTrace_and_partial_flux_bound + (Q := Q) (a := a) (s := s) (Bflux := Bflux) (g := g) v w + hs hs_le hboundary hzero hBflux_nonneg (by + intro N + simpa [Bflux, S, P, E] using hpartial N) + have hpairing_scaled : + E ≤ (Cpair * (Cflux * S * P) * B) * Real.sqrt E := by + calc + E ≤ Cpair * Bflux * B := hpairing + _ = (Cpair * (Cflux * S * P) * B) * Real.sqrt E := by + dsimp [Bflux] + ring + have hscaled : Real.sqrt (2 * E) ≤ C * S * P * B := + sqrt_two_energy_le_scaled_rhs_of_pairing hE_nonneg hS_nonneg hP_nonneg + hB_nonneg hCpair_nonneg hCflux_nonneg + (by simpa [Cpair] using hC_absorb) hpairing_scaled + calc + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) + = Real.sqrt (2 * E) := by + rfl + _ ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := by + simpa [S, P, B] using hscaled + + +/-- Boundary-pairing interface for the harmonic-remainder proof. The +mathematical content still sits in the two inputs: weak testing of the +homogeneous equation gives the energy-to-pairing inequality, and Besov duality +bounds that pairing by the negative flux seminorm times the positive boundary +norm. -/ +theorem dirichletHarmonicRemainder_boundary_pairing_le_of_weak_testing_and_besov_duality + {d : ℕ} [NeZero d] {Cpair : ℝ} + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hweak : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + |cubeAverage Q + (fun x => + vecDot + (matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + (dirichletBoundaryGradientField v x))|) + (hduality : + |cubeAverage Q + (fun x => + vecDot + (matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) + (dirichletBoundaryGradientField v x))| ≤ + Cpair * + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + Cpair * + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + hweak.trans hduality + +/-- Harmonic-remainder energy after the boundary pairing input is known. This +closes the homogeneous flux-Poincare half of the notes' proof; the remaining +analytic task is precisely to supply the weak-testing/Besov-duality pairing +bound. -/ +theorem dirichletHarmonicRemainder_sqrt_two_energy_le_of_boundary_pairing + {d : ℕ} [NeZero d] {C Cpair : ℝ} + (hCpair_nonneg : 0 ≤ Cpair) + (hC_absorb : Real.sqrt 2 * Cpair * ((d : ℝ) * Real.sqrt 5) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hpairing : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x)) ≤ + Cpair * + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) (w.toH1.grad x)) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + dirichletHarmonicRemainder_sqrt_two_energy_le_of_boundary_pairing_and_flux_bound + (C := C) (Cpair := Cpair) (Cflux := (d : ℝ) * Real.sqrt 5) + hCpair_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d) (Real.sqrt_nonneg 5)) hC_absorb + (Q := Q) (a := a) (s := s) (g := g) v w hs hboundary hpairing + (by + simpa [neg_div] using + dirichletHarmonicRemainder_fluxSeminorm_le_poincareUpperEllipticityFactor + (Q := Q) (a := a) (s := s) w hs hs_le) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainderSplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainderSplit.lean new file mode 100644 index 0000000000..a920fc9a11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/HarmonicRemainderSplit.lean @@ -0,0 +1,157 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainder + +/-! # Harmonic Remainder Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: harmonic remainder split wrappers + +This file contains the terminal wrappers which turn the Dirichlet decomposition +into the zero-trace hypothesis required by the harmonic-remainder estimate. + +## Audit tag + +Claim: the manuscript Dirichlet split supplies the zero-trace boundary +difference, and hence the public harmonic-remainder estimate needed by the +Dirichlet energy assembly. + +Downstream target: `EnergyRHS/Theory.lean`. This file is endpoint assembly +only and introduces no public `*Theory` package. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Direct public harmonic-remainder estimate from the zero-trace boundary +condition. This combines weak testing, public Besov duality, and the +finite-depth homogeneous flux Poincare wrapper. -/ +theorem dirichletHarmonicRemainder_sqrt_two_energy_le_of_zeroTrace + {d : ℕ} [NeZero d] {C : ℝ} + (hC_absorb : + Real.sqrt 2 * + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((d : ℝ) * Real.sqrt 5) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hzero : IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.toH1.grad x - dirichletBoundaryGradientField v x)) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + dirichletHarmonicRemainder_sqrt_two_energy_le_of_zeroTrace_and_partial_flux_bound + (C := C) (Cflux := (d : ℝ) * Real.sqrt 5) + (mul_nonneg (by exact_mod_cast Nat.zero_le d) (Real.sqrt_nonneg 5)) hC_absorb + (Q := Q) (a := a) (s := s) (g := g) v w hs hs_le hboundary hzero + (by + intro N + simpa [neg_div] using + dirichletHarmonicRemainder_fluxPartialSeminorm_le_poincareUpperEllipticityFactor + (Q := Q) (a := a) (s := s) w N hs hs_le) + +/-- The Dirichlet decomposition supplies the zero-trace boundary condition +needed by the homogeneous harmonic-remainder estimate. Indeed +`w - h = (v - h) - ρ` at the gradient level on the cube, and both terms on the +right have zero trace. -/ +theorem dirichletHarmonicRemainder_zeroTrace_boundaryDifference_of_split + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) : + IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.toH1.grad x - dirichletBoundaryGradientField v x) := by + let zgrad : Vec d → Vec d := + fun x => v.zeroTraceDifferenceH10CubeSet.toH1Function.grad x + let rhograd : Vec d → Vec d := fun x => ρ.toH10.toH1Function.grad x + let hgradBoundary : Vec d → Vec d := dirichletBoundaryGradientField v + have hzpot : IsPotentialZeroTraceOn (cubeSet Q) zgrad := by + simpa [zgrad] using v.zeroTraceDifferenceH10CubeSet.isPotentialZeroTraceOn + have hrhopot : IsPotentialZeroTraceOn (cubeSet Q) rhograd := by + simpa [rhograd] using ρ.toH10.isPotentialZeroTraceOn + have hdiff_pot : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => zgrad x - rhograd x) := by + have hsum : + IsPotentialZeroTraceOn (cubeSet Q) (zgrad + (-1 : ℝ) • rhograd) := + isPotentialZeroTraceOn_add hzpot (isPotentialZeroTraceOn_smul hrhopot (-1)) + simpa [Pi.add_apply, Pi.smul_apply, sub_eq_add_neg] using! hsum + have hz_ae : + zgrad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => v.toH1.grad x - hgradBoundary x := by + simpa [zgrad, hgradBoundary, dirichletBoundaryGradientField, volumeMeasureOn] using + v.zeroTraceDifferenceH10CubeSet_grad_ae_eq + have htarget : + (fun x => zgrad x - rhograd x) + =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => w.toH1.grad x - hgradBoundary x := by + filter_upwards [hz_ae, hgrad] with x hz hx + ext i + have hz_i : + zgrad x i = v.toH1.grad x i - hgradBoundary x i := + congrArg (fun y : Vec d => y i) hz + have hx_i : + v.toH1.grad x i = rhograd x i + w.toH1.grad x i := + congrArg (fun y : Vec d => y i) hx + simp [hz_i, hx_i, sub_eq_add_neg, add_comm, add_assoc] + exact IsPotentialZeroTraceOn.congr_ae htarget hdiff_pot + +/-- Harmonic-remainder estimate in the exact shape needed by the public +Dirichlet energy assembly. The zero-trace condition is derived from the +manuscript split rather than passed as an extra public hypothesis. -/ +theorem dirichletHarmonicRemainder_sqrt_two_energy_le_of_split + {d : ℕ} [NeZero d] {C : ℝ} + (hC_absorb : + Real.sqrt 2 * + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((d : ℝ) * Real.sqrt 5) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)) + (hs : 0 < s) (hs_le : s ≤ 1) + (hboundary : ForceBesovRegularity Q s (dirichletBoundaryGradientField v)) + (hgrad : + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) : + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v) := + dirichletHarmonicRemainder_sqrt_two_energy_le_of_zeroTrace + (C := C) hC_absorb (Q := Q) (a := a) (s := s) (g := g) v w + hs hs_le hboundary + (dirichletHarmonicRemainder_zeroTrace_boundaryDifference_of_split + (Q := Q) (a := a) (g := g) v ρ w hgrad) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Neumann.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Neumann.lean new file mode 100644 index 0000000000..0a9065999c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Neumann.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Corrector + +/-! # Neumann -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Neumann estimate +-/ + +noncomputable section + +open scoped ENNReal + +/-- Public Neumann forced solutions supply the deterministic mean-zero +corrector-energy estimate on the half-open cube. -/ +theorem neumannForcedSolutionEnergyAverage_le_force_scale_noteConstants_expanded_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} + (w : NeumannForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1MeanZero.toH1Function.grad x)) ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let ω := neumannForcedSolutionMeanZeroCorrectorData_publicCoeffField w + have hdet := + ω.coefficientEnergy_average_le_force_scale_noteConstants_expanded + (s := s) (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hs_lt.le (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + hg.memLp hg.partialSeminorms_bddAbove + simpa [ω] using hdet + +/-- Square-root form of the public Neumann forced-solution energy envelope +before the final dimension-only constant absorption. -/ +theorem neumannForcedSolutionEnergyNorm_le_sqrt_force_scale_noteConstants_expanded_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} + (w : NeumannForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + neumannForcedSolutionEnergyNorm Q a w ≤ + Real.sqrt + (500 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + rw [neumannForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) w] + exact Real.sqrt_le_sqrt + (neumannForcedSolutionEnergyAverage_le_force_scale_noteConstants_expanded_publicCoeffField + (Q := Q) (a := a) (s := s) (g := g) w hs hs_lt hg) + +/-- Public Neumann forced-solution energy estimate, assuming the displayed +constant dominates the dimension-only scalar from the deterministic envelope. -/ +theorem neumannForcedSolutionEnergyNorm_le_publicRHS_of_constant + {d : ℕ} [NeZero d] {C : ℝ} + (hC_nonneg : 0 ≤ C) + (hC_neumann : + Real.sqrt 500 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} + (w : NeumannForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + neumannForcedSolutionEnergyNorm Q a w ≤ + neumannEnergyWithRHSRHS ((d : ℝ) * C) Q a s g := by + let L : ℝ := lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let D : ℝ := + (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2) + have hs_le : s ≤ 1 := hs_lt.le + have hs_half : 0 < s / 2 := by nlinarith + have hL_nonneg : 0 ≤ L := by + simpa [L] using + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_inv_nonneg : 0 ≤ L⁻¹ := inv_nonneg.mpr hL_nonneg + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hB_nonneg : 0 ≤ B := by + simpa [B, scaleNormalizedPositiveBesovVectorSeminormTwo] using + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := g) hg + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hD_le : + D ≤ + (d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2) := by + dsimp [D] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + have hinner : + Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2 ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + have hs_inv_le : + s⁻¹ ≤ Real.rpow s (-(3 / 2 : ℝ)) := by + calc + s⁻¹ = Real.rpow s (-1 : ℝ) := (Real.rpow_neg_one s).symm + _ ≤ Real.rpow s (-(3 / 2 : ℝ)) := + Real.rpow_le_rpow_of_exponent_ge hs hs_le (by norm_num) + have hsqrt_prod : + Real.sqrt (500 * (s⁻¹) ^ 2 * L⁻¹ * D ^ 2 * B ^ 2) = + Real.sqrt 500 * s⁻¹ * Real.sqrt (L⁻¹) * D * B := by + calc + Real.sqrt (500 * (s⁻¹) ^ 2 * L⁻¹ * D ^ 2 * B ^ 2) + = + Real.sqrt (500 * ((s⁻¹) ^ 2 * (L⁻¹ * (D ^ 2 * B ^ 2)))) := by + ring_nf + _ = + Real.sqrt 500 * + Real.sqrt ((s⁻¹) ^ 2 * (L⁻¹ * (D ^ 2 * B ^ 2))) := by + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 500)] + _ = + Real.sqrt 500 * + (Real.sqrt ((s⁻¹) ^ 2) * + Real.sqrt (L⁻¹ * (D ^ 2 * B ^ 2))) := by + rw [Real.sqrt_mul (sq_nonneg s⁻¹)] + _ = + Real.sqrt 500 * + (s⁻¹ * (Real.sqrt (L⁻¹) * Real.sqrt (D ^ 2 * B ^ 2))) := by + rw [Real.sqrt_sq hs_inv_nonneg, Real.sqrt_mul hL_inv_nonneg] + _ = + Real.sqrt 500 * (s⁻¹ * (Real.sqrt (L⁻¹) * (D * B))) := by + rw [show D ^ 2 * B ^ 2 = (D * B) ^ 2 by ring] + rw [Real.sqrt_sq (mul_nonneg hD_nonneg hB_nonneg)] + _ = Real.sqrt 500 * s⁻¹ * Real.sqrt (L⁻¹) * D * B := by ring + have hconstD : + Real.sqrt 500 * D ≤ C := by + calc + Real.sqrt 500 * D ≤ + Real.sqrt 500 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) := + mul_le_mul_of_nonneg_left hD_le (Real.sqrt_nonneg 500) + _ ≤ C := hC_neumann + have hcoeff : + (Real.sqrt 500 * D) * s⁻¹ ≤ + C * Real.rpow s (-(3 / 2 : ℝ)) := by + exact mul_le_mul hconstD hs_inv_le hs_inv_nonneg hC_nonneg + have htail : 0 ≤ Real.sqrt (L⁻¹) * B := + mul_nonneg (Real.sqrt_nonneg _) hB_nonneg + have hsqrtL_public : + Real.sqrt (L⁻¹) ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) := by + simpa [L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a hs_half + have hpublic_tail : + Real.sqrt (L⁻¹) * B ≤ + ((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * B := + mul_le_mul_of_nonneg_right hsqrtL_public hB_nonneg + have hcoeff_public_nonneg : 0 ≤ C * Real.rpow s (-(3 / 2 : ℝ)) := + mul_nonneg hC_nonneg (Real.rpow_nonneg hs.le _) + calc + neumannForcedSolutionEnergyNorm Q a w + ≤ + Real.sqrt + (500 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := + neumannForcedSolutionEnergyNorm_le_sqrt_force_scale_noteConstants_expanded_publicCoeffField + (Q := Q) (a := a) (s := s) (g := g) w hs hs_lt hg + _ = + Real.sqrt 500 * s⁻¹ * Real.sqrt (L⁻¹) * D * B := by + simpa [L, B, D] using hsqrt_prod + _ = + (Real.sqrt 500 * D) * s⁻¹ * (Real.sqrt (L⁻¹) * B) := by ring + _ ≤ + (C * Real.rpow s (-(3 / 2 : ℝ))) * + (Real.sqrt (L⁻¹) * B) := + mul_le_mul_of_nonneg_right hcoeff htail + _ ≤ + (C * Real.rpow s (-(3 / 2 : ℝ))) * + (((d : ℝ) * + poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2)) * B) := + mul_le_mul_of_nonneg_left hpublic_tail hcoeff_public_nonneg + _ = + neumannEnergyWithRHSRHS ((d : ℝ) * C) Q a s g := by + unfold neumannEnergyWithRHSRHS + simp [B, scaleNormalizedPositiveBesovVectorSeminormTwo] + ring + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Theory.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Theory.lean new file mode 100644 index 0000000000..de0957a7c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/EnergyRHS/Theory.lean @@ -0,0 +1,221 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.Neumann +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS.HarmonicRemainderSplit + +/-! # Theory -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Energy RHS: Public theorem package + +## Audit tag + +Claim: expose the single public package for Dirichlet and mean-zero Neumann +energy consequences with right-hand side. + +Downstream target: `InhomogeneousEquationsTheory`. The remaining analytic +inputs belong in the Dirichlet/Neumann subfiles; this file should stay as the +package assembly endpoint. +-/ + +noncomputable section + +open scoped ENNReal + +/-- Public theorem package for the Dirichlet and mean-zero Neumann energy +consequences with right-hand side. -/ +structure EnergyConsequencesRHSTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + ForceBesovRegularity Q s (dirichletBoundaryGradientField v) → + dirichletForcedSolutionEnergyNorm Q a v ≤ + dirichletEnergyWithRHSRHS C Q a s g v) ∧ + (∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (w : NeumannForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + neumannForcedSolutionEnergyNorm Q a w ≤ + neumannEnergyWithRHSRHS C Q a s g) + +/-- Conditional public theorem package for the Dirichlet and mean-zero Neumann +energy consequences with right-hand side. The Neumann half is fully supplied +by the deterministic mean-zero corrector estimate; the remaining explicit +input is the dimension-only homogeneous boundary-remainder bound in the +Dirichlet manuscript decomposition. -/ +private theorem energyConsequencesRHSTheory_of_dirichlet_harmonicRemainder_bound + {d : ℕ} [NeZero d] {C₀ CneumannBase C : ℝ} + (hC_pos : 0 < C) + (hC₀_nonneg : 0 ≤ C₀) + (hC₀_zero : + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) ≤ C₀) + (hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C) + (hC_neumann : + Real.sqrt 500 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ CneumannBase) + (hC_neumann_absorb : (d : ℝ) * CneumannBase ≤ C) + (hharmonic : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (v : DirichletForcedCubeSolution Q a g) + (ρ : ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g) + (w : AHarmonicFunction (publicCoeffField Q a) (cubeSet Q)), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + ForceBesovRegularity Q s (dirichletBoundaryGradientField v) → + v.toH1.grad =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + (fun x => ρ.toH10.toH1Function.grad x + w.toH1.grad x) → + Real.sqrt + (2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => w.toH1.grad x))) ≤ + C * Real.rpow s (-(1 / 2 : ℝ)) * + poincareUpperEllipticityFactor Q a s (.finite 2) * + scaleNormalizedPositiveBesovVectorNormTwo Q s + (dirichletBoundaryGradientField v)) : + EnergyConsequencesRHSTheory d := by + refine ⟨⟨C, hC_pos, ?_, ?_⟩⟩ + · intro Q a s g v hs hs_lt hg hboundary + rcases + exists_zeroTraceCorrector_harmonicRemainder_dirichletForcedSolutionEnergyNorm_le_dirichletEnergyWithRHSRHS_of_harmonicRemainder_bound + (C₀ := C₀) (C := C) hC₀_nonneg hC₀_zero hC_absorb + (Q := Q) (a := a) (s := s) (g := g) v hs hs_lt hg with + ⟨ρ, w, hgrad, henergy⟩ + exact henergy + (hharmonic (Q := Q) (a := a) (s := s) (g := g) v ρ w + hs hs_lt hg hboundary hgrad) + · intro Q a s g w hs hs_lt hg + have hCneumannBase_nonneg : 0 ≤ CneumannBase := by + have hraw_nonneg : + 0 ≤ Real.sqrt 500 * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) := by + exact mul_nonneg (Real.sqrt_nonneg 500) + (mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2))) + exact le_trans + hraw_nonneg hC_neumann + have hbase := + neumannForcedSolutionEnergyNorm_le_publicRHS_of_constant + (C := CneumannBase) hCneumannBase_nonneg hC_neumann + (Q := Q) (a := a) (s := s) (g := g) w hs hs_lt hg + have htail_nonneg : + 0 ≤ Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + have hlower_nonneg : + 0 ≤ poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) := by + unfold poincareLowerEllipticityFactor + exact Real.rpow_nonneg + (Ch02.lambdaSq_finite_nonneg Q a (by nlinarith : 0 < s / 2) + (by norm_num : (1 : ℝ) ≤ 2)) _ + have hseminorm_nonneg : + 0 ≤ scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := g) hg + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) hlower_nonneg) + hseminorm_nonneg + have hmono : + neumannEnergyWithRHSRHS ((d : ℝ) * CneumannBase) Q a s g ≤ + neumannEnergyWithRHSRHS C Q a s g := by + unfold neumannEnergyWithRHSRHS + calc + ((d : ℝ) * CneumannBase) * + Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g + = + ((d : ℝ) * CneumannBase) * + (Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) := by + ring + _ ≤ + C * + (Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g) := + mul_le_mul_of_nonneg_right hC_neumann_absorb htail_nonneg + _ = + C * Real.rpow s (-(3 / 2 : ℝ)) * + poincareLowerEllipticityFactor Q a (s / 2) (.finite 2) * + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + ring + exact hbase.trans hmono + +/-- Final public theorem package for the Dirichlet and mean-zero Neumann +energy estimates with right-hand side. The Dirichlet branch follows the +manuscript route: zero-trace corrector energy, homogeneous weak testing, +Besov duality, homogeneous coarse flux Poincare, and scalar cancellation. -/ +theorem energyConsequencesRHSTheory {d : ℕ} [NeZero d] : + EnergyConsequencesRHSTheory d := by + let CzeroBase : ℝ := + Real.sqrt (250 + 2 * Real.sqrt 15000 * Real.sqrt 2) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) + let C₀ : ℝ := max 0 CzeroBase + let Charmonic : ℝ := + Real.sqrt 2 * + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + ((d : ℝ) * Real.sqrt 5) + let CneumannBase : ℝ := + Real.sqrt 500 * + ((d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) + let Ccorrector : ℝ := 4 * ((d : ℝ) * C₀) + let Cneumann : ℝ := (d : ℝ) * CneumannBase + let C : ℝ := max 1 (max Ccorrector (max Charmonic Cneumann)) + have hC_pos : 0 < C := by + exact lt_of_lt_of_le zero_lt_one + (le_max_left 1 (max Ccorrector (max Charmonic Cneumann))) + have hC₀_nonneg : 0 ≤ C₀ := by + exact le_max_left 0 CzeroBase + have hC₀_zero : CzeroBase ≤ C₀ := by + exact le_max_right 0 CzeroBase + have hC_absorb : 4 * ((d : ℝ) * C₀) ≤ C := by + calc + 4 * ((d : ℝ) * C₀) = Ccorrector := rfl + _ ≤ max Ccorrector (max Charmonic Cneumann) := le_max_left _ _ + _ ≤ C := le_max_right _ _ + have hC_harmonic : Charmonic ≤ C := by + calc + Charmonic ≤ max Charmonic Cneumann := le_max_left _ _ + _ ≤ max Ccorrector (max Charmonic Cneumann) := le_max_right _ _ + _ ≤ C := le_max_right _ _ + have hC_neumann_base : CneumannBase ≤ CneumannBase := le_rfl + have hC_neumann : Cneumann ≤ C := by + calc + Cneumann ≤ max Charmonic Cneumann := le_max_right _ _ + _ ≤ max Ccorrector (max Charmonic Cneumann) := le_max_right _ _ + _ ≤ C := le_max_right _ _ + exact + energyConsequencesRHSTheory_of_dirichlet_harmonicRemainder_bound + (d := d) (C₀ := C₀) (CneumannBase := CneumannBase) (C := C) + hC_pos hC₀_nonneg hC₀_zero hC_absorb hC_neumann_base hC_neumann + (by + intro Q a s g v ρ w hs hs_lt hg hboundary hgrad + exact + dirichletHarmonicRemainder_sqrt_two_energy_le_of_split + (C := C) hC_harmonic + (Q := Q) (a := a) (s := s) (g := g) v ρ w + hs hs_lt.le hboundary hgrad) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/FluxResponse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/FluxResponse.lean new file mode 100644 index 0000000000..01ab5511a8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/FluxResponse.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence + +/-! # Flux Response -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.1.3: Coarse-grained flux-response estimate + +This file proves the public statement of +`l.coarse.grained.flux.response.deterministic.theory`. + +## Audit tag + +Claim: prove and package the Book-facing coarse-grained flux-response estimate +from the deterministic response identities. + +Downstream target: Chapter 3 public theorem aggregation and RHS flux-response +extensions. This file should keep one `CoarseFluxResponseTheory` surface and +avoid compatibility constructor families. +-/ + +noncomputable section + +private theorem scaleNormalizedNegativeBesovVectorNorm_finite_one_eq_old + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 1) F = + Homogenization.cubeBesovNegativeVectorSeminorm Q s F := by + simp [scaleNormalizedNegativeBesovVectorNorm, negativeBesovVectorPartialNormFinite, + negativeBesovVectorDepthSeminorm, negativeBesovVectorDepthAverage, + Homogenization.cubeBesovNegativeVectorSeminorm, + Homogenization.cubeBesovNegativeVectorPartialSeminorm, + Homogenization.cubeBesovNegativeVectorDepthSeminorm, + Homogenization.cubeBesovNegativeVectorDepthAverage] + +private theorem old_blockJ_cube_eq_book_doubled {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) + (P Q' : BlockVec d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + BlockJ (cubeSet R) P Q' A = + Ch02.doubledResponseJ (Ch02.cubeDomain R) (a.coeffOn R) P Q' := by + intro A + let := isFiniteMeasureVolumeMeasureOnCubeSet R + have hsubOpen : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + let aRpw : Ch02.CoeffOn (Ch02.cubeDomain R) := + Ch02.pointwiseCoeffOnRestrict (a.coeffOn Q) hsubOpen + have haeeq : Ch02.CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using + Ch02.coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict (a := a) hk hR + have hEllQ : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet Q) A := by + simpa [A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn_cubeSet Q (a.coeffOn Q) + have hEllR : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet R) A := + hEllQ.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtScale hk hR) + have hvolR : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hbook_scalar_pw := + (Ch02.doubledResponseTheory (Ch02.cubeDomain R) aRpw).doubledResponseJ_eq_scalar + P.1 Q'.2 P.2 Q'.1 + calc + BlockJ (cubeSet R) P Q' A = + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) A + + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) + (adjointCoeffField A) := by + exact blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := A) (U := cubeSet R) (measurableSet_cubeSet R) hEllR hvolR + (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1) + _ = (1 / 2 : ℝ) * ResponseJ (openCubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) A + + (1 / 2 : ℝ) * ResponseJ (openCubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) + (adjointCoeffField A) := by + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R, + ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R] + _ = (1 / 2 : ℝ) * Ch02.responseJ (Ch02.cubeDomain R) aRpw + (P.1 - Q'.2) (Q'.1 - P.2) + + (1 / 2 : ℝ) * Ch02.responseJ (Ch02.cubeDomain R) aRpw.transpose + (Q'.2 + P.1) (Q'.1 + P.2) := by + rw [Internal.Ch02.book_responseJ_eq_ResponseJ, + Internal.Ch02.book_responseJ_eq_ResponseJ] + rfl + _ = Ch02.doubledResponseJ (Ch02.cubeDomain R) aRpw P Q' := by + exact hbook_scalar_pw.symm + _ = Ch02.doubledResponseJ (Ch02.cubeDomain R) (a.coeffOn R) P Q' := by + rw [Ch02.doubledResponseJ_eq_ofAEEq haeeq P Q'] + +private theorem old_normalizedBlockResponseValueSet_eq_book {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) (a0 : Mat d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Homogenization.normalizedBlockResponseValueSet R A a0 = + Ch02.normalizedBlockResponseValueSet R a a0 := by + intro A + ext m + constructor + · rintro ⟨e, he, hm⟩ + refine ⟨e, ?_, ?_⟩ + · simpa [Ch02.fullBlockVecNormSq, Homogenization.fullBlockVecNormSq] using he + · have hbridge := old_blockJ_cube_eq_book_doubled (a := a) (Q := Q) (R := R) + (k := k) hk hR + (ofFullBlockVec (Matrix.mulVec (Homogenization.constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (Homogenization.constantFullBlockMatrixSqrt a0) e)) + simpa [A, Ch02.constantFullBlockMatrixInvSqrt, Homogenization.constantFullBlockMatrixInvSqrt, + Ch02.constantFullBlockMatrixSqrt, Homogenization.constantFullBlockMatrixSqrt, + Ch02.constantFullBlockMatrix, Homogenization.constantFullBlockMatrix, + Ch02.constantBlockMatrix, Homogenization.blockMatrixOfCoeff] using hm.trans hbridge + · rintro ⟨e, he, hm⟩ + refine ⟨e, ?_, ?_⟩ + · simpa [Ch02.fullBlockVecNormSq, Homogenization.fullBlockVecNormSq] using he + · have hbridge := old_blockJ_cube_eq_book_doubled (a := a) (Q := Q) (R := R) + (k := k) hk hR + (ofFullBlockVec (Matrix.mulVec (Homogenization.constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (Homogenization.constantFullBlockMatrixSqrt a0) e)) + simpa [A, Ch02.constantFullBlockMatrixInvSqrt, Homogenization.constantFullBlockMatrixInvSqrt, + Ch02.constantFullBlockMatrixSqrt, Homogenization.constantFullBlockMatrixSqrt, + Ch02.constantFullBlockMatrix, Homogenization.constantFullBlockMatrix, + Ch02.constantBlockMatrix, Homogenization.blockMatrixOfCoeff] using hm.trans hbridge.symm + +private theorem old_normalizedBlockResponseMax_eq_book {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) (a0 : Mat d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Homogenization.normalizedBlockResponseMax R A a0 = + Ch02.normalizedBlockResponseMax R a a0 := by + intro A + unfold Homogenization.normalizedBlockResponseMax Ch02.normalizedBlockResponseMax + rw [old_normalizedBlockResponseValueSet_eq_book (a := a) (Q := Q) (R := R) (k := k) hk hR a0] + +private theorem old_maxDescendantNormalizedBlockResponseAtScale_eq_book {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a0 : Mat d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Homogenization.maxDescendantNormalizedBlockResponseAtScale Q k A a0 = + Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + intro A + unfold Homogenization.maxDescendantNormalizedBlockResponseAtScale + Ch02.maxDescendantNormalizedBlockResponseAtScale + rw [Ch02.finsetSupReal_eq_finsetSsup] + apply congrArg sSup + ext y + constructor + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, (old_normalizedBlockResponseMax_eq_book + (a := a) (Q := Q) (R := R) (k := k) hk hR a0).symm⟩ + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, old_normalizedBlockResponseMax_eq_book + (a := a) (Q := Q) (R := R) (k := k) hk hR a0⟩ + +private theorem old_scaleResponseAtScale_infinity_eq_book {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (a0 : Mat d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Homogenization.scaleResponseAtScale Q k Homogenization.MultiscaleExponent.infinity A a0 = + Ch02.scaleResponseAtScale Q k .infinity a a0 := by + intro A + rw [Homogenization.scaleResponseAtScale_infinity_eq, Ch02.scaleResponseAtScale_infinity_eq, + old_maxDescendantNormalizedBlockResponseAtScale_eq_book (a := a) Q hk a0] + +private theorem old_homogenizationErrorOnCube_infinity_one_eq_book {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) (s : ℝ) (a0 : Mat d) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Homogenization.HomogenizationErrorOnCube Q s Homogenization.MultiscaleExponent.infinity + (Homogenization.MultiscaleExponent.finite 1) A a0 = + Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + intro A + rw [Homogenization.homogenizationErrorOnCube_infinity_one_eq_tsum, + Ch02.homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_congr + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [← Ch02.geometricWeight_eq_old] + rw [old_scaleResponseAtScale_infinity_eq_book (a := a) Q hk a0] + +private theorem old_homogenizationErrorOnCube_infinity_one_terms_summable + {d : ℕ} [NeZero d] + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) (a0 : Mat d) + {s : ℝ} (hs : 0 < s) : + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + Summable fun n : ℕ => + Homogenization.geometricWeight s 1 n * + Homogenization.scaleResponseAtScale Q (Q.scale - (n : ℤ)) + Homogenization.MultiscaleExponent.infinity A a0 := by + intro A + have hbook := Ch02.summable_homogenizationErrorOnCube_infinity_one_terms Q a a0 hs + refine hbook.congr ?_ + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [Ch02.geometricWeight_eq_old] + rw [old_scaleResponseAtScale_infinity_eq_book (a := a) Q hk a0] + +private theorem sqrt_matNorm_le_dim_mul_constantCoeffMatrixNormHalf {d : ℕ} [NeZero d] + (a0 : ConstantCoeffMatrix d) : + Real.sqrt (Homogenization.matNorm a0.matrix) ≤ + (d : ℝ) * constantCoeffMatrixNormHalf a0 := by + have hop_nonneg : 0 ≤ Ch02.matrixNorm a0.matrix := by + simpa [Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.matrixOperatorNorm_nonneg a0.matrix + have hmat_le : + Homogenization.matNorm a0.matrix ≤ (d : ℝ) * Ch02.matrixNorm a0.matrix := + Ch02.matNorm_le_dim_mul_matrixNorm a0.matrix + have hsqrts : + Real.sqrt (Homogenization.matNorm a0.matrix) ≤ + Real.sqrt ((d : ℝ) * Ch02.matrixNorm a0.matrix) := + Real.sqrt_le_sqrt hmat_le + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hd_one : 1 ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hM_sq : + constantCoeffMatrixNormHalf a0 ^ 2 = Ch02.matrixNorm a0.matrix := by + simpa [constantCoeffMatrixNormHalf, Real.sqrt_eq_rpow] using + Real.sq_sqrt hop_nonneg + have hright_nonneg : + 0 ≤ (d : ℝ) * constantCoeffMatrixNormHalf a0 := + mul_nonneg hd_nonneg (Real.rpow_nonneg hop_nonneg _) + have hsq : + Real.sqrt ((d : ℝ) * Ch02.matrixNorm a0.matrix) ^ 2 ≤ + ((d : ℝ) * constantCoeffMatrixNormHalf a0) ^ 2 := by + rw [Real.sq_sqrt (mul_nonneg hd_nonneg hop_nonneg), mul_pow, hM_sq] + nlinarith [mul_nonneg (sub_nonneg.mpr hd_one) hop_nonneg] + exact hsqrts.trans + ((sq_le_sq₀ (Real.sqrt_nonneg _) hright_nonneg).mp hsq) + +private theorem sqrt_four_mul_matNorm_le_two_mul_dim_mul_constantCoeffMatrixNormHalf {d : ℕ} + [NeZero d] + (a0 : ConstantCoeffMatrix d) : + Real.sqrt ((4 : ℝ) * Homogenization.matNorm a0.matrix) ≤ + 2 * ((d : ℝ) * constantCoeffMatrixNormHalf a0) := by + have hroot_four : Real.sqrt (4 : ℝ) = 2 := by + rw [Real.sqrt_eq_iff_mul_self_eq (by norm_num : 0 ≤ (4 : ℝ)) + (by norm_num : 0 ≤ (2 : ℝ))] + norm_num + calc + Real.sqrt ((4 : ℝ) * Homogenization.matNorm a0.matrix) = + Real.sqrt (4 : ℝ) * Real.sqrt (Homogenization.matNorm a0.matrix) := by + rw [Real.sqrt_mul (by norm_num : 0 ≤ (4 : ℝ))] + _ = 2 * Real.sqrt (Homogenization.matNorm a0.matrix) := by + rw [hroot_four] + _ ≤ 2 * ((d : ℝ) * constantCoeffMatrixNormHalf a0) := + mul_le_mul_of_nonneg_left + (sqrt_matNorm_le_dim_mul_constantCoeffMatrixNormHalf a0) + (by norm_num) + +/-- Public theorem package for the coarse-grained flux-response estimate. -/ +structure CoarseFluxResponseTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + (a0 : ConstantCoeffMatrix d) (u : CubeSolution Q a), + 0 < s → s ≤ 1 → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 1) + (solutionFluxDefectField Q a a0 u) ≤ + coarseFluxResponseRHS C Q a a0 s u + +/-- Fully proved coarse-grained flux-response estimate. -/ +theorem coarseFluxResponse_negativeBesov_le {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (a0 : ConstantCoeffMatrix d) (u : CubeSolution Q a) + (hs : 0 < s) (hsle : s ≤ 1) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 1) + (solutionFluxDefectField Q a a0 u) ≤ + coarseFluxResponseRHS (10 * (d : ℝ)) Q a a0 s u := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let aQ : Ch02.CoeffOn U := a.coeffOn Q + let ap : Ch02.CoeffOn U := Internal.Ch02.BookCh02.pointwiseCoeffOn U aQ + let A : CoeffField d := Internal.Ch02.BookCh02.pointwiseCoeffField U aQ + have haeeq_ap_a : Ch02.CoeffOn.AEEq ap aQ := by + simpa [ap] using Internal.Ch02.BookCh02.pointwiseCoeffOn_ae_eq U aQ + have haeeq_a_ap : Ch02.CoeffOn.AEEq aQ ap := haeeq_ap_a.symm + let uPw : Ch02.Solution U ap := Ch02.Solution.ofAEEq haeeq_a_ap u + let uOpen : AHarmonicFunction A (openCubeSet Q) := by + simpa [U, ap, A] using! uPw + let uCube : AHarmonicFunction A (cubeSet Q) := uOpen.toCubeSet + let oldDefect : Vec d → Vec d := + fun x => matVecMul (A x) (uCube.toH1.grad x) - + matVecMul a0.matrix (uCube.toH1.grad x) + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand A uCube x + have hEll : IsEllipticFieldOn aQ.lam aQ.Lam (cubeSet Q) A := by + simpa [U, aQ, A] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn_cubeSet Q aQ + have hsum : + Summable fun n : ℕ => + Homogenization.geometricWeight s 1 n * + Homogenization.scaleResponseAtScale Q (Q.scale - (n : ℤ)) + Homogenization.MultiscaleExponent.infinity A a0.matrix := by + simpa [A, U, aQ] using + old_homogenizationErrorOnCube_infinity_one_terms_summable + (a := a) Q a0.matrix hs + have hraw : + cubeBesovNegativeVectorSeminorm Q s oldDefect ≤ + (Homogenization.geometricDiscount s 1)⁻¹ * + Homogenization.HomogenizationErrorOnCube Q s + Homogenization.MultiscaleExponent.infinity + (Homogenization.MultiscaleExponent.finite 1) A a0.matrix * + (Real.sqrt ((4 : ℝ) * Homogenization.matNorm a0.matrix) * + Real.sqrt (cubeAverage Q energy)) := by + have hraw0 := + Homogenization.coarseFluxResponse_qone_of_aHarmonicFunction + Q A a0.matrix s hs hEll a0.elliptic a0.isSymm uCube hsum + simpa [oldDefect, energy] using hraw0 + have henergy_eq : + cubeAverage Q energy = + Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + have henergy_fun : + energy = Ch02.variationEnergyIntegrand U ap uPw := by + have hgrad : uCube.toH1.grad = uPw.toH1.grad := + AHarmonicFunction.grad_toCubeSet uOpen + funext x + simp only [energy, scalarVariationEnergyIntegrand, Ch02.variationEnergyIntegrand, + hgrad, U, ap, A, Internal.Ch02.BookCh02.pointwiseCoeffOn] + have hcube_pw : + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := by + calc + cubeAverage Q energy = volumeAverage (cubeSet Q) energy := by + rw [volumeAverage_cubeSet_eq_cubeAverage] + _ = volumeAverage (openCubeSet Q) energy := + ScalarCanonicalMaximizer.volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q energy + _ = Ch02.average U (Ch02.variationEnergyIntegrand U ap uPw) := by + rw [henergy_fun] + exact (Internal.Ch02.book_average_eq_volumeAverage U + (Ch02.variationEnergyIntegrand U ap uPw)).symm + calc + cubeAverage Q energy = Ch02.variationEnergyValue U ap uPw := hcube_pw + _ = Ch02.variationEnergyValue U aQ u := by + simpa [uPw] using Ch02.variationEnergyValue_ofAEEq haeeq_a_ap u + _ = Ch02.variationEnergyValue (Ch02.cubeDomain Q) (a.coeffOn Q) u := by + rfl + have hA_ae_open : + A =ᵐ[volumeMeasureOn (openCubeSet Q)] (a.coeffOn Q).toCoeffField := by + simpa [A, U, aQ, volumeMeasureOn] using + Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq U aQ + have hA_ae_cube : + A =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] (a.coeffOn Q).toCoeffField := by + simpa [volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hA_ae_open + have hdefect_ae : + oldDefect =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] + solutionFluxDefectField Q a a0 u := by + have hgrad : uCube.toH1.grad = u.toH1.grad := + AHarmonicFunction.grad_toCubeSet uOpen + exact hA_ae_cube.mono fun x hx => by + simp only [oldDefect, solutionFluxDefectField, hgrad, hx, + sub_eq_add_neg, add_matVecMul, neg_matVecMul] + have hdefect_norm_eq : + cubeBesovNegativeVectorSeminorm Q s oldDefect = + cubeBesovNegativeVectorSeminorm Q s (solutionFluxDefectField Q a a0 u) := + Homogenization.cubeBesovNegativeVectorSeminorm_eq_of_ae_eq_on_cubeSet s hdefect_ae + let G : ℝ := (Homogenization.geometricDiscount s 1)⁻¹ + let H : ℝ := Ch02.HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0.matrix + let M : ℝ := constantCoeffMatrixNormHalf a0 + let E : ℝ := solutionEnergyNorm Q a u + have hH_eq : + Homogenization.HomogenizationErrorOnCube Q s + Homogenization.MultiscaleExponent.infinity + (Homogenization.MultiscaleExponent.finite 1) A a0.matrix = H := by + simpa [H, A, U, aQ] using + old_homogenizationErrorOnCube_infinity_one_eq_book + (a := a) Q s a0.matrix + have hH_nonneg : 0 ≤ H := by + simpa [H] using Ch02.HomogenizationErrorOnCube_infinity_one_nonneg Q a a0.matrix hs + have hM_nonneg : 0 ≤ M := by + dsimp [M, constantCoeffMatrixNormHalf] + exact Real.rpow_nonneg + (by + simpa [Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.matrixOperatorNorm_nonneg a0.matrix) _ + have hE_nonneg : 0 ≤ E := by + dsimp [E, solutionEnergyNorm] + exact Real.sqrt_nonneg _ + have hG_le : G ≤ 5 * s⁻¹ := by + simpa [G, Ch02.geometricDiscount_eq_old] using + Ch02.inv_geometricDiscount_le_five_inv (s := s) (p := 1) hs hsle + (by norm_num : (1 : ℝ) ≤ 1) + have hcoef : G * (2 * M * E) ≤ (10 * s⁻¹) * M * E := by + have hME_nonneg : 0 ≤ 2 * M * E := by + exact mul_nonneg (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hM_nonneg) hE_nonneg + calc + G * (2 * M * E) ≤ (5 * s⁻¹) * (2 * M * E) := + mul_le_mul_of_nonneg_right hG_le hME_nonneg + _ = (10 * s⁻¹) * M * E := by ring + have hcoef_dim : + G * (2 * ((d : ℝ) * M) * E) ≤ + (10 * (d : ℝ) * s⁻¹) * M * E := by + have hME_nonneg : 0 ≤ 2 * ((d : ℝ) * M) * E := by + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (mul_nonneg (Nat.cast_nonneg d) hM_nonneg)) hE_nonneg + calc + G * (2 * ((d : ℝ) * M) * E) ≤ + (5 * s⁻¹) * (2 * ((d : ℝ) * M) * E) := + mul_le_mul_of_nonneg_right hG_le hME_nonneg + _ = (10 * (d : ℝ) * s⁻¹) * M * E := by ring + have hrhs_old_le_public : + G * H * (2 * ((d : ℝ) * M) * E) ≤ + (10 * (d : ℝ)) * s⁻¹ * M * E * H := by + calc + G * H * (2 * ((d : ℝ) * M) * E) = + (G * (2 * ((d : ℝ) * M) * E)) * H := by ring + _ ≤ ((10 * (d : ℝ) * s⁻¹) * M * E) * H := + mul_le_mul_of_nonneg_right hcoef_dim hH_nonneg + _ = (10 * (d : ℝ)) * s⁻¹ * M * E * H := by ring + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 1) + (solutionFluxDefectField Q a a0 u) + = cubeBesovNegativeVectorSeminorm Q s (solutionFluxDefectField Q a a0 u) := + scaleNormalizedNegativeBesovVectorNorm_finite_one_eq_old Q s + (solutionFluxDefectField Q a a0 u) + _ = cubeBesovNegativeVectorSeminorm Q s oldDefect := hdefect_norm_eq.symm + _ ≤ (Homogenization.geometricDiscount s 1)⁻¹ * + Homogenization.HomogenizationErrorOnCube Q s + Homogenization.MultiscaleExponent.infinity + (Homogenization.MultiscaleExponent.finite 1) A a0.matrix * + (Real.sqrt ((4 : ℝ) * Homogenization.matNorm a0.matrix) * + Real.sqrt (cubeAverage Q energy)) := hraw + _ ≤ G * H * (2 * ((d : ℝ) * M) * E) := by + rw [hH_eq, henergy_eq] + have hsqrt : + Real.sqrt ((4 : ℝ) * Homogenization.matNorm a0.matrix) * E ≤ + (2 * ((d : ℝ) * M)) * E := + mul_le_mul_of_nonneg_right + (sqrt_four_mul_matNorm_le_two_mul_dim_mul_constantCoeffMatrixNormHalf a0) + hE_nonneg + have hGH_nonneg : 0 ≤ G * H := by + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact inv_nonneg.mpr + (Homogenization.geometricDiscount_pos (by simpa using hs)).le + exact mul_nonneg hG_nonneg hH_nonneg + exact mul_le_mul_of_nonneg_left (by simpa [mul_assoc] using! hsqrt) hGH_nonneg + _ ≤ (10 * (d : ℝ)) * s⁻¹ * M * E * H := hrhs_old_le_public + _ = coarseFluxResponseRHS (10 * (d : ℝ)) Q a a0 s u := by + dsimp [coarseFluxResponseRHS, H, M, E] + +/-- Fully proved public coarse-grained flux-response theorem package. -/ +theorem coarseFluxResponseTheory {d : ℕ} [NeZero d] : + CoarseFluxResponseTheory d := by + refine ⟨?_⟩ + refine ⟨10 * (d : ℝ), ?_, ?_⟩ + · exact mul_pos (by norm_num) + (by exact_mod_cast Nat.pos_iff_ne_zero.mpr (NeZero.ne d)) + intro Q a s a0 u hs hsle + exact coarseFluxResponse_negativeBesov_le (Q := Q) (a := a) (a0 := a0) (u := u) hs hsle + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/GeneralCoarseGrainingL2TwoExponent.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/GeneralCoarseGrainingL2TwoExponent.lean new file mode 100644 index 0000000000..4d649b7668 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/GeneralCoarseGrainingL2TwoExponent.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantEnvelope +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSCoefficientLocalization + +/-! # General Coarse Graining L2Two Exponent -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Scale-separated general coarse-graining handoff + +This file contains the repaired inhomogeneous Ch3.3 general coarse-graining +surface. The local flux-response exponent and the positive forcing exponent +are separated, so the forcing term carries the visible inverse depth factor +`3^{-r₂(m-n)}`. +-/ + +noncomputable section + +/-- Public general coarse-graining package with a stronger force exponent. -/ +structure GeneralCoarseGrainingL2TwoExponentTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {a0 : ConstantCoeffMatrix d} + {s r r₂ : ℝ} {j : ℕ} {g : Vec d → Vec d} + (_ha0 : IsPositiveScalarMatrix a0.matrix) + (w : CoarseGrainingComparisonDatum Q a a0 g), + 0 < s → 0 < r → r < s / 2 → s < 1 → r ≤ r₂ → + ForceBesovRegularity Q r₂ g → + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v ≤ + generalCoarseGrainingL2TwoExponentRHS C Q a a0 s r r₂ j g w.u + +private theorem generalCoarseGrainingL2TwoExponentFluxDefectRHS_eq_const_mul_one + {d : ℕ} [NeZero d] (C : ℝ) (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) (r r₂ : ℝ) (j : ℕ) + (g : Vec d → Vec d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + generalCoarseGrainingL2TwoExponentFluxDefectRHS C Q a a0 r r₂ j g u = + C * generalCoarseGrainingL2TwoExponentFluxDefectRHS 1 Q a a0 r r₂ j g u := by + unfold generalCoarseGrainingL2TwoExponentFluxDefectRHS + ring + +private theorem generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_localizedFluxDefectBridge + {d : ℕ} [NeZero d] {Cproj C : ℝ} + (hC_pos : 0 < C) + (hproj : ScalarSolutionComparisonDualityEstimateExponentLoss d Cproj) + (hlocalized : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {a0 : ConstantCoeffMatrix d} + {s r r₂ : ℝ} {j : ℕ} {g : Vec d → Vec d} + (_ha0 : IsPositiveScalarMatrix a0.matrix) + (w : CoarseGrainingComparisonDatum Q a a0 g), + 0 < s → 0 < r → r < s / 2 → s < 1 → r ≤ r₂ → + ForceBesovRegularity Q r₂ g → + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s)) * + (Cproj * s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) j) ≤ + generalCoarseGrainingL2TwoExponentRHS C Q a a0 s r r₂ j g w.u) : + GeneralCoarseGrainingL2TwoExponentTheory d := by + refine ⟨⟨C, hC_pos, ?_⟩⟩ + intro Q a a0 s r r₂ j g ha0 w hs hr hrs hs_lt hr₂ hg + let K : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hpublic : + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v ≤ + K * + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix w.u.grad w.v.grad := by + simpa [K] using + homogenizationComparisonNegativeBesovLHS_le_note_constant_mul_solutionComparisonNegativeBesovLhs_publicCoeffField + Q a a0 s w.u w.v hs + have hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) a0.matrix w.u.grad w.v.grad := by + simpa [publicH1ToCubeSet_grad] using + w.isHomogenizationComparisonPairOn_publicCoeffField_cubeSet + have hF : + MemVectorL2 (cubeSet Q) + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) := + publicH1_fluxDefect_memVectorL2_descendant_cubeSet + (Q := Q) (R := Q) (a := a) (a0 := a0) (j := 0) w.u (by simp) + have ha0_saved := ha0 + rcases ha0 with ⟨sigma0, hsigma0, ha0eq⟩ + have hcomparison_scalar : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) + w.u.grad w.v.grad := by + simpa [ha0eq] using hcomparison + have hF_scalar : + MemVectorL2 (cubeSet Q) + (fluxDefect (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) + w.u.grad) := by + simpa [ha0eq] using hF + have hinternal : + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix w.u.grad w.v.grad ≤ + Cproj * s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) j := by + have hscalar : + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + (scalarMatrix (d := d) sigma0) w.u.grad w.v.grad ≤ + Cproj * s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect (publicCoeffField Q a) (scalarMatrix (d := d) sigma0) + w.u.grad) j := + solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimateExponentLoss + hproj Q (publicCoeffField Q a) sigma0 w.u.grad w.v.grad j + hsigma0 hs hr hrs hs_lt hF_scalar hcomparison_scalar + simpa [ha0eq] using hscalar + calc + homogenizationComparisonNegativeBesovLHS Q a a0 s w.u w.v + ≤ K * + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix w.u.grad w.v.grad := hpublic + _ ≤ + K * + (Cproj * s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) j) := + mul_le_mul_of_nonneg_left hinternal hK_nonneg + _ ≤ generalCoarseGrainingL2TwoExponentRHS C Q a a0 s r r₂ j g w.u := + hlocalized ha0_saved w hs hr hrs hs_lt hr₂ hg + +private theorem localizedCoarseResponse_le_twoExponentBound_public + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (g : Vec d → Vec d) (j : ℕ) {r r₂ : ℝ} + (hr : 0 < r) (hr₂ : r ≤ r₂) (hg₂ : ForceBesovRegularity Q r₂ g) + (hData : _root_.Homogenization.OpenCubeDescendantDeterministicCoarseData Q + (publicCoeffField Q a)) : + _root_.Homogenization.localizedCoarseFluxResponseRHSBound Q (publicCoeffField Q a) + a0.matrix r j u.grad g ≤ + _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent Q (publicCoeffField Q a) + a0.matrix r r₂ j u.grad g := by + let A : CoeffField d := publicCoeffField Q a + have hEll : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet Q) A := by + dsimp [A] + exact publicCoeffField_isEllipticFieldOn_cubeSet Q a + have henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A u.grad) + (cubeSet Q) MeasureTheory.volume := by + have hgrad : MemVectorL2 (cubeSet Q) u.grad := by + simpa [publicH1ToCubeSet_grad] using + (publicH1ToCubeSet u).grad_memVectorL2 + exact integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hgrad + have hr_half_pos : 0 < r / 2 := by + nlinarith + have hsumB : + Summable (fun n : ℕ => + geometricWeight (r / 2) 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) A) + (2 / 2)) := by + have hsum : + Summable (fun n : ℕ => + geometricWeight (r / 2) 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) A) := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) (s := r / 2) hr_half_pos hEll hData + simpa [Real.rpow_one] using hsum + have hsumSigma : + Summable (fun n : ℕ => + geometricWeight (r / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) A) + (2 / 2)) := by + have hsum : + Summable (fun n : ℕ => + geometricWeight (r / 2) 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) A) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := A) (s := r / 2) hr_half_pos hEll hData + simpa [Real.rpow_one] using hsum + exact + _root_.Homogenization.localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBoundTwoExponent_of_bddAbove_of_isEllipticFieldOn_of_summable + Q A a0.matrix j u.grad g hr hr₂ hEll henergy_int + hg₂.partialSeminorms_bddAbove + (fun R hR => forceBesovRegularity_descendant_partialSeminorms_bddAbove hg₂ hR) + hsumB hsumSigma + +private theorem generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_const_mul_descendantCoarseFluxResponseRHSBound_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] {Cdual K : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimateExponentLoss d Cdual) + (hK_nonneg : 0 ≤ K) + (hData : + ∀ Q : TriadicCube d, ∀ a : CoeffFamily d, + _root_.Homogenization.OpenCubeDescendantDeterministicCoarseData Q + (publicCoeffField Q a)) + (hdescendantRHS : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {a0 : ConstantCoeffMatrix d} + {s : ℝ} {j : ℕ} {g : Vec d → Vec d} + (_ha0 : IsPositiveScalarMatrix a0.matrix) + (w : CoarseGrainingComparisonDatum Q a a0 g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) ≤ + K * _root_.Homogenization.coarseFluxResponseRHSBound R + (publicCoeffField Q a) a0.matrix s w.u.grad g) : + GeneralCoarseGrainingL2TwoExponentTheory d := by + let Kgeom : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1) + let Cbase : ℝ := max 1 (Kgeom * (Cdual + 1) * K) + let C : ℝ := (d : ℝ) ^ 2 * Cbase + have hCbase_pos : 0 < Cbase := by + dsimp [Cbase] + exact lt_of_lt_of_le zero_lt_one (le_max_left (1 : ℝ) (Kgeom * (Cdual + 1) * K)) + have hC_pos : 0 < C := by + dsimp [C] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + exact mul_pos (sq_pos_of_pos hd_pos) hCbase_pos + refine + generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_localizedFluxDefectBridge + (Cproj := Cdual) (C := C) hC_pos hdual ?_ + intro Q a a0 s r r₂ j g ha0 w hs hr hrs hs_lt hr₂ hg₂ + let A : CoeffField d := publicCoeffField Q a + let B : ℝ := + _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent Q A + a0.matrix r r₂ j w.u.grad g + let L : ℝ := + _root_.Homogenization.localizedCoarseFluxResponseRHSBound Q A + a0.matrix r j w.u.grad g + let Z : ℝ := + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect A a0.matrix w.u.grad) j + let Kscale : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + have hr_lt : r < 1 := by + nlinarith + have hg₁ : ForceBesovRegularity Q r g := + hg₂.of_exponent_le hr₂ + have hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R r N + (fluxDefect A a0.matrix w.u.grad)) := by + intro R hR + dsimp [A] + exact w.fluxDefect_negativeBesovPartialSeminormTwo_bddAbove_descendant hR hr + have hZ_le_L : Z ≤ K * L := by + dsimp [Z, L, A] + exact + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + Q (publicCoeffField Q a) a0.matrix w.u.grad g j hK_nonneg + hdefect_bdd (hdescendantRHS ha0 w hr hr_lt hg₁) + have hL_le_B : L ≤ B := by + dsimp [L, B, A] + exact localizedCoarseResponse_le_twoExponentBound_public Q a a0 w.u g j + hr hr₂ hg₂ (hData Q a) + have hZ_le_B : Z ≤ K * B := + hZ_le_L.trans (mul_le_mul_of_nonneg_left hL_le_B hK_nonneg) + have hB_nonneg : 0 ≤ B := by + have hL_nonneg : 0 ≤ L := by + dsimp [L, _root_.Homogenization.localizedCoarseFluxResponseRHSBound] + exact Real.sqrt_nonneg _ + exact hL_nonneg.trans hL_le_B + have hKscale_nonneg : 0 ≤ Kscale := by + dsimp [Kscale] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hKgeom_nonneg : 0 ≤ Kgeom := by + dsimp [Kgeom] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + have hKscale_le : Kscale ≤ Kgeom := by + dsimp [Kscale, Kgeom] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + exact mul_le_mul_of_nonneg_left hpow (by exact_mod_cast Nat.zero_le d) + have hCdual_nonneg : 0 ≤ Cdual := hdual.1 + have hCdual_le : Cdual ≤ Cdual + 1 := by linarith + have hscaleCoeff_le : Kscale * Cdual * K ≤ Cbase := by + have hstep₁ : Kscale * Cdual ≤ Kgeom * (Cdual + 1) := + mul_le_mul hKscale_le hCdual_le hCdual_nonneg hKgeom_nonneg + have hstep₂ : + (Kscale * Cdual) * K ≤ (Kgeom * (Cdual + 1)) * K := + mul_le_mul_of_nonneg_right hstep₁ hK_nonneg + have hmax : + Kgeom * (Cdual + 1) * K ≤ Cbase := by + dsimp [Cbase] + exact le_max_right (1 : ℝ) (Kgeom * (Cdual + 1) * K) + exact hstep₂.trans (by simpa [mul_assoc] using hmax) + have hCbase_nonneg : 0 ≤ Cbase := hCbase_pos.le + have hB_to_public : + Cbase * B ≤ + C * generalCoarseGrainingL2TwoExponentFluxDefectRHS + 1 Q a a0 r r₂ j g w.u := by + have hBsemi_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q r₂ g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q r₂ g + hg₂.partialSeminorms_bddAbove + have herror : + _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth + Q A a0.matrix r j = + coarseGrainingHomogenizationErrorAtDepth Q a a0 r j := by + dsimp [A] + exact coarseGrainingHomogenizationErrorAtDepth_publicCoeffField_eq_public Q a a0 r j + have hH_nonneg : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 r j := by + have hOld : + 0 ≤ _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth + Q A a0.matrix r j := + _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth_nonneg + Q A a0.matrix j hr.le + simpa [herror] using hOld + calc + Cbase * B = + Cbase * _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent + Q A a0.matrix r r₂ j w.u.grad g := by + rfl + _ ≤ generalCoarseGrainingL2TwoExponentFluxDefectRHS C Q a a0 r r₂ j g w.u := by + dsimp [C, A] + exact + coarseGrainingL2FluxDefectBoundTwoExponent_publicCoeffField_le_dim_sq_mul_public_of_homogenizationErrorAtDepth_eq + Cbase Q a a0 j w.u hCbase_nonneg hr hBsemi_nonneg hH_nonneg herror + _ = C * generalCoarseGrainingL2TwoExponentFluxDefectRHS 1 Q a a0 r r₂ j g w.u := + generalCoarseGrainingL2TwoExponentFluxDefectRHS_eq_const_mul_one + C Q a a0 r r₂ j g w.u + have hinner : + Kscale * (Cdual * Z) ≤ + C * generalCoarseGrainingL2TwoExponentFluxDefectRHS + 1 Q a a0 r r₂ j g w.u := by + have hfactor_nonneg : 0 ≤ Kscale * Cdual := + mul_nonneg hKscale_nonneg hCdual_nonneg + calc + Kscale * (Cdual * Z) = (Kscale * Cdual) * Z := by ring + _ ≤ (Kscale * Cdual) * (K * B) := + mul_le_mul_of_nonneg_left hZ_le_B hfactor_nonneg + _ = (Kscale * Cdual * K) * B := by ring + _ ≤ Cbase * B := + mul_le_mul_of_nonneg_right hscaleCoeff_le hB_nonneg + _ ≤ C * generalCoarseGrainingL2TwoExponentFluxDefectRHS + 1 Q a a0 r r₂ j g w.u := + hB_to_public + have hfactor_nonneg : + 0 ≤ s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ := by + have hr_lt_half : r < 1 / 2 := by nlinarith + exact mul_nonneg + (mul_nonneg (inv_nonneg.mpr hs.le) + (pow_nonneg (inv_nonneg.mpr hr.le) _)) + (inv_nonneg.mpr (by linarith : 0 ≤ (1 / 2 : ℝ) - r)) + calc + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s)) * + (Cdual * s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q r + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) j) + = + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (Kscale * (Cdual * Z)) := by + simp [Kscale, Z, A] + ring + _ ≤ + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (C * generalCoarseGrainingL2TwoExponentFluxDefectRHS + 1 Q a a0 r r₂ j g w.u) := + mul_le_mul_of_nonneg_left hinner hfactor_nonneg + _ = generalCoarseGrainingL2TwoExponentRHS C Q a a0 s r r₂ j g w.u := by + unfold generalCoarseGrainingL2TwoExponentRHS + rw [generalCoarseGrainingL2TwoExponentFluxDefectRHS_eq_const_mul_one + C Q a a0 r r₂ j g w.u] + +private theorem generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_const_mul_descendantCoarseFluxResponseRHSBound + {d : ℕ} [NeZero d] {Cdual K : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimateExponentLoss d Cdual) + (hK_nonneg : 0 ≤ K) + (hdescendantRHS : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {a0 : ConstantCoeffMatrix d} + {s : ℝ} {j : ℕ} {g : Vec d → Vec d} + (_ha0 : IsPositiveScalarMatrix a0.matrix) + (w : CoarseGrainingComparisonDatum Q a a0 g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) ≤ + K * _root_.Homogenization.coarseFluxResponseRHSBound R + (publicCoeffField Q a) a0.matrix s w.u.grad g) : + GeneralCoarseGrainingL2TwoExponentTheory d := + generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_const_mul_descendantCoarseFluxResponseRHSBound_of_openCubeDescendantDeterministicCoarseData + hdual hK_nonneg + (fun Q a => publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + hdescendantRHS + +private theorem generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimateExponentLoss d Cdual) : + GeneralCoarseGrainingL2TwoExponentTheory d := by + let K : ℝ := + 2 * + ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (ZeroTraceDirichletCorrectorData.zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg + d 1) + refine + generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss_of_const_mul_descendantCoarseFluxResponseRHSBound + (Cdual := Cdual) (K := K) hdual hK_nonneg ?_ + intro Q a a0 s j g _ha0 w hs hs_lt hg R hR + simpa [K] using + w.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_const_mul_coarseFluxResponseRHSBound_descendant + (Q := Q) (R := R) (a := a) (a0 := a0) (g := g) (j := j) + hs hs_lt hg hR + +private theorem generalCoarseGrainingL2TwoExponentTheory_of_coordinateBridge + {d : ℕ} [NeZero d] {Cbridge : ℝ} + (hbridge : UnitFullDualCoordinateOverlappingBridgeSharpLoss d Cbridge) : + GeneralCoarseGrainingL2TwoExponentTheory d := by + rcases Homogenization.exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform d with + ⟨Cdir, hdir⟩ + let Cpair : ℝ := + (1 + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + 1)) * + Real.sqrt (3 ^ d : ℝ) + let CdualGenuine : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + (Cpair * (Cdir + 1) * Cbridge) + let Cdual : ℝ := 110 * sharpBoundaryKernelNoteConstant d * CdualGenuine + have hdual : ScalarSolutionComparisonDualityEstimateExponentLoss d Cdual := by + dsimp [Cdual, CdualGenuine, Cpair] + exact + (Homogenization.scalarSolutionComparisonGenuineDualityEstimateSharpLoss_of_dirichletBesov_of_coordinateBridgeSharpLoss_of_localizedPairing + (d := d) (Cdir := Cdir) (Cbridge := Cbridge) + hdir hbridge + (localizedFluxDefectPositivePairingEstimate_standardOverlap d)).to_exponentLoss + exact + generalCoarseGrainingL2TwoExponentTheory_of_scalarSolutionComparisonDualityEstimateExponentLoss + (Cdual := Cdual) hdual + +/-- Public Ch3.3 scale-separated general coarse-graining package with all +currently formalized analytic inputs discharged. -/ +theorem generalCoarseGrainingL2TwoExponentTheory + (d : ℕ) [NeZero d] : + GeneralCoarseGrainingL2TwoExponentTheory d := + generalCoarseGrainingL2TwoExponentTheory_of_coordinateBridge + (unitFullDualCoordinateOverlappingBridgeSharpLoss d) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/HomogenizationBlackBoxes.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/HomogenizationBlackBoxes.lean new file mode 100644 index 0000000000..b831f3d005 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/HomogenizationBlackBoxes.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.Duality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.GeneralCoarseGrainingL2TwoExponent + +/-! # Homogenization Black Boxes -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.3: Deterministic homogenization black boxes + +This file bundles the public contract packages for all currently written +theorems in Chapter 3.3. +-/ + +/-- Public aggregate package for the proved two-exponent replacement route. + +This is the downstream-facing Ch3.3 surface when the comparison left-hand side +is measured at exponent `s`, but the flux-defect/Besov input is consumed at an +independent exponent `t < s / 2` with the explicit note-facing singular factor +in the public RHS. -/ +structure HomogenizationBlackBoxesTheory (d : ℕ) [NeZero d] : Prop where + fluxDefectDuality : FluxDefectDualityTheory d + generalCoarseGrainingL2TwoExponent : GeneralCoarseGrainingL2TwoExponentTheory d + +private theorem homogenizationBlackBoxesTheory_of_components + {d : ℕ} [NeZero d] + (fluxDefectDuality : FluxDefectDualityTheory d) + (generalCoarseGrainingL2TwoExponent : GeneralCoarseGrainingL2TwoExponentTheory d) : + HomogenizationBlackBoxesTheory d where + fluxDefectDuality := fluxDefectDuality + generalCoarseGrainingL2TwoExponent := generalCoarseGrainingL2TwoExponent + +/-- Public Chapter 3.3 two-exponent black-box package with all currently +formalized analytic inputs discharged. -/ +theorem homogenizationBlackBoxesTheory + (d : ℕ) [NeZero d] : + HomogenizationBlackBoxesTheory d := + homogenizationBlackBoxesTheory_of_components + (fluxDefectDualityTheory d) + (generalCoarseGrainingL2TwoExponentTheory d) + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Inhomogeneous.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Inhomogeneous.lean new file mode 100644 index 0000000000..35af16f6ef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/Inhomogeneous.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseCaccioppoliRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.EnergyRHS + +/-! # Inhomogeneous -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.2: Inhomogeneous equations + +This file bundles the public contract packages for all of Chapter 3.2. + +## Audit tag + +Claim: provide the single Chapter 3.2 aggregate package by bundling the +canonical inhomogeneous theorem packages. + +Downstream target: Ch5 and other note-facing consumers that need the whole +inhomogeneous toolkit. This file should only assemble listed component +packages, not introduce alternate component theories. +-/ + +/-- Public aggregate package for the inhomogeneous estimates of Chapter 3.2. -/ +structure InhomogeneousEquationsTheory (d : ℕ) [NeZero d] : Prop where + coarsePoincareRHS : CoarsePoincareRHSTheory d + coarseCaccioppoliRHS : CoarseCaccioppoliRHSTheory d + weakFluxRHS : WeakFluxRHSTheory d + coarseFluxResponseRHS : CoarseFluxResponseRHSTheory d + energyConsequencesRHS : EnergyConsequencesRHSTheory d + +/-- Assemble the Chapter 3.2 aggregate package from its component theorem +packages. -/ +private theorem inhomogeneousEquationsTheory_of_components + {d : ℕ} [NeZero d] + (coarsePoincareRHS : CoarsePoincareRHSTheory d) + (coarseCaccioppoliRHS : CoarseCaccioppoliRHSTheory d) + (weakFluxRHS : WeakFluxRHSTheory d) + (coarseFluxResponseRHS : CoarseFluxResponseRHSTheory d) + (energyConsequencesRHS : EnergyConsequencesRHSTheory d) : + InhomogeneousEquationsTheory d where + coarsePoincareRHS := coarsePoincareRHS + coarseCaccioppoliRHS := coarseCaccioppoliRHS + weakFluxRHS := weakFluxRHS + coarseFluxResponseRHS := coarseFluxResponseRHS + energyConsequencesRHS := energyConsequencesRHS + +/-- Public Chapter 3.2 aggregate package. -/ +theorem inhomogeneousEquationsTheory + {d : ℕ} [NeZero d] : + InhomogeneousEquationsTheory d := + inhomogeneousEquationsTheory_of_components + coarsePoincareRHSTheory + coarseCaccioppoliRHSTheory + weakFluxRHSTheory + coarseFluxResponseRHSTheory + energyConsequencesRHSTheory + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges.lean new file mode 100644 index 0000000000..346523fb23 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseFluxResponseRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutionConstructors + +/-! # Public Internal Bridges -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public/internal bridges for Chapter 3 + +This file is the stable import surface for the Chapter 3 public/internal +bridge endpoints. The proof bodies live in focused `PublicInternalBridges/` +submodules so downstream files can keep importing this module without pulling a +monolithic source file into the edit loop. +-/ + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseFluxResponseRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseFluxResponseRHS.lean new file mode 100644 index 0000000000..4e6f12e641 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseFluxResponseRHS.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints + +/-! # Coarse Flux Response RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public/internal coarse-flux-response RHS bridge + +This file contains the terminal dimension-loss comparison for the deterministic +coarse-flux-response RHS written with the Chapter 3 public coefficient field. + +## Audit tag + +Claim: the deterministic public-coefficient coarse-flux-response RHS is bounded +by the Chapter 3 public RHS after the explicit dimension-square loss. + +Downstream target: `CoarseFluxResponseRHS.lean` through the public +`PublicInternalBridges` import surface. This file is bridge plumbing only and +introduces no public `*Theory` package. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +private theorem coarseResponse_scalar_dimension_bound + (s D oldMhalf oldM oldP oldL oldLinv Mhalf M P L Linv H E B : ℝ) + (hD_nonneg : 0 ≤ D) (hD_le_sq : D ≤ D ^ 2) + (hs_inv_nonneg : 0 ≤ s⁻¹) + (hs_pow52_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ))) + (hs_pow3_nonneg : 0 ≤ Real.rpow s (-3 : ℝ)) + (hMhalf_nonneg : 0 ≤ Mhalf) (hM_nonneg : 0 ≤ M) + (holdL_nonneg : 0 ≤ oldL) (holdLinv_nonneg : 0 ≤ oldLinv) + (hP_nonneg : 0 ≤ P) (hH_nonneg' : 0 ≤ H) + (hE_nonneg : 0 ≤ E) (hB_nonneg' : 0 ≤ B) + (hMhalf_le : oldMhalf ≤ D * Mhalf) (hM_le : oldM ≤ D * M) + (hP_le : oldP ≤ D * P) (hL_le : oldL ≤ D * L) + (hLinv_le : oldLinv ≤ D * Linv) : + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B ≤ + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := by + have hterm_energy : + s⁻¹ * oldMhalf * H * E ≤ + D ^ 2 * (s⁻¹ * Mhalf * H * E) := by + calc + s⁻¹ * oldMhalf * H * E ≤ s⁻¹ * (D * Mhalf) * H * E := by + gcongr + _ = D * (s⁻¹ * Mhalf * H * E) := by ring + _ ≤ D ^ 2 * (s⁻¹ * Mhalf * H * E) := by + exact mul_le_mul_of_nonneg_right hD_le_sq + (mul_nonneg (mul_nonneg (mul_nonneg hs_inv_nonneg hMhalf_nonneg) + hH_nonneg') hE_nonneg) + have hterm_resp : + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H) := by + have hprod : oldMhalf * oldL ≤ (D * Mhalf) * (D * L) := + mul_le_mul hMhalf_le hL_le holdL_nonneg + (mul_nonneg hD_nonneg hMhalf_nonneg) + calc + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H = + Real.rpow s (-(5 / 2 : ℝ)) * (oldMhalf * oldL) * H := by ring + _ ≤ + Real.rpow s (-(5 / 2 : ℝ)) * ((D * Mhalf) * (D * L)) * H := by + gcongr + _ = D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H) := by ring + have hterm_weak : + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L) := by + have hprod : oldP * oldL ≤ (D * P) * (D * L) := + mul_le_mul hP_le hL_le holdL_nonneg (mul_nonneg hD_nonneg hP_nonneg) + calc + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL = + Real.rpow s (-(5 / 2 : ℝ)) * (oldP * oldL) := by ring + _ ≤ Real.rpow s (-(5 / 2 : ℝ)) * ((D * P) * (D * L)) := by + gcongr + _ = D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L) := by ring + have hterm_poincare : + Real.rpow s (-3 : ℝ) * oldM * oldLinv ≤ + D ^ 2 * (Real.rpow s (-3 : ℝ) * M * Linv) := by + have hprod : oldM * oldLinv ≤ (D * M) * (D * Linv) := + mul_le_mul hM_le hLinv_le holdLinv_nonneg + (mul_nonneg hD_nonneg hM_nonneg) + calc + Real.rpow s (-3 : ℝ) * oldM * oldLinv = + Real.rpow s (-3 : ℝ) * (oldM * oldLinv) := by ring + _ ≤ Real.rpow s (-3 : ℝ) * ((D * M) * (D * Linv)) := by + gcongr + _ = D ^ 2 * (Real.rpow s (-3 : ℝ) * M * Linv) := by ring + have htail : + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B ≤ + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := by + have hsum : + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H) + + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L) + + D ^ 2 * (Real.rpow s (-3 : ℝ) * M * Linv) := by + exact add_le_add (add_le_add hterm_resp hterm_weak) hterm_poincare + calc + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B ≤ + (D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H) + + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L) + + D ^ 2 * (Real.rpow s (-3 : ℝ) * M * Linv)) * B := by + exact mul_le_mul_of_nonneg_right hsum hB_nonneg' + _ = + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := by ring + calc + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B ≤ + D ^ 2 * (s⁻¹ * Mhalf * H * E) + + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := + add_le_add hterm_energy htail + _ = + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := by ring + +theorem coarseFluxResponseRHSBound_publicCoeffField_le_dim_sq_mul_public_of_homogenizationErrorOnCube_eq + {d : ℕ} [NeZero d] (C : ℝ) (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) {s : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (hC : 0 ≤ C) (hs : 0 < s) + (hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) + (hH_nonneg : + 0 ≤ Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0.matrix) + (herror : + HomogenizationErrorOnCube Q s .infinity (.finite 1) + (publicCoeffField Q a) a0.matrix = + Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0.matrix) : + C * _root_.Homogenization.coarseFluxResponseRHSBound Q (publicCoeffField Q a) + a0.matrix s (forcedSolutionGradientField u) g ≤ + coarseFluxResponseWithRHSRHS (((d : ℝ) ^ 2) * C) Q a a0 s g u := by + let D : ℝ := d + let Mhalf : ℝ := constantCoeffMatrixNormHalf a0 + let M : ℝ := constantCoeffMatrixNorm a0 + let oldMhalf : ℝ := Real.sqrt (matNorm a0.matrix) + let oldM : ℝ := matNorm a0.matrix + let oldP : ℝ := + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) + let oldL : ℝ := + Real.sqrt ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) + let oldLinv : ℝ := + (lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ + let P : ℝ := poincareUpperEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let L : ℝ := poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let Linv : ℝ := + Real.rpow (Ch02.lambdaSq Q (s / 2) + (Ch02.MultiscaleExponent.finite 2) a) (-1 : ℝ) + let H : ℝ := + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0.matrix + let E : ℝ := + Real.sqrt (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u))) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + have hs_half : 0 < s / 2 := by positivity + have hD_one : 1 ≤ D := by + norm_num [D, Nat.one_le_iff_ne_zero, NeZero.ne d] + have hD_nonneg : 0 ≤ D := le_trans zero_le_one hD_one + have hD_le_sq : D ≤ D ^ 2 := by nlinarith [hD_one] + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hs_pow52_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hs_pow3_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hMhalf_nonneg : 0 ≤ Mhalf := by + dsimp [Mhalf, constantCoeffMatrixNormHalf] + exact Real.rpow_nonneg (Ch02.matrixNorm_nonneg a0.matrix) _ + have hM_nonneg : 0 ≤ M := by + dsimp [M, constantCoeffMatrixNorm] + exact Ch02.matrixNorm_nonneg a0.matrix + have holdMhalf_nonneg : 0 ≤ oldMhalf := by simp [oldMhalf] + have holdM_nonneg : 0 ≤ oldM := by + dsimp [oldM] + exact matNorm_nonneg a0.matrix + have holdP_nonneg : 0 ≤ oldP := by simp [oldP] + have holdL_nonneg : 0 ≤ oldL := by simp [oldL] + have holdLinv_nonneg : 0 ≤ oldLinv := by + dsimp [oldLinv] + exact inv_nonneg.mpr + (Homogenization.multiscale_ellipticity_lambdaSq_finite_nonneg + Q (s / 2) 2 (publicCoeffField Q a) + (by norm_num : (0 : ℝ) ≤ 2) + (by positivity : 0 ≤ (s / 2) * (2 : ℝ))) + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hL_nonneg : 0 ≤ L := by + dsimp [L, poincareLowerEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.lambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hLinv_nonneg : 0 ≤ Linv := by + dsimp [Linv] + exact Real.rpow_nonneg + (Ch02.lambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hH_nonneg' : 0 ≤ H := by simpa [H] using hH_nonneg + have hE_nonneg : 0 ≤ E := by simp [E] + have hB_nonneg' : 0 ≤ B := by simpa [B] using hB_nonneg + have hMhalf_le : oldMhalf ≤ D * Mhalf := by + simpa [D, oldMhalf, Mhalf] using + sqrt_matNorm_le_dim_mul_constantCoeffMatrixNormHalf a0 + have hM_le : oldM ≤ D * M := by + simpa [D, oldM, M] using + matNorm_le_dim_mul_constantCoeffMatrixNorm a0 + have hP_le : oldP ≤ D * P := by + simpa [D, oldP, P] using + sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + Q a hs_half + have hL_le : oldL ≤ D * L := by + simpa [D, oldL, L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a hs_half + have hLinv_le : oldLinv ≤ D * Linv := by + simpa [D, oldLinv, Linv] using + lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_public_rpow_neg_one + Q a hs_half + have hE_eq : E = forcedSolutionEnergyNorm Q a u := by + simpa [E] using + (forcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) u).symm + have hsum_total : + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B ≤ + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B) := by + exact coarseResponse_scalar_dimension_bound + s D oldMhalf oldM oldP oldL oldLinv Mhalf M P L Linv H E B + hD_nonneg hD_le_sq hs_inv_nonneg hs_pow52_nonneg hs_pow3_nonneg + hMhalf_nonneg hM_nonneg holdL_nonneg holdLinv_nonneg hP_nonneg + hH_nonneg' hE_nonneg hB_nonneg' hMhalf_le hM_le hP_le hL_le hLinv_le + calc + C * _root_.Homogenization.coarseFluxResponseRHSBound Q (publicCoeffField Q a) + a0.matrix s (forcedSolutionGradientField u) g = + C * + (s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL + + Real.rpow s (-3 : ℝ) * oldM * oldLinv) * B) := by + unfold _root_.Homogenization.coarseFluxResponseRHSBound + rw [herror] + _ ≤ + C * + (D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * P * L + + Real.rpow s (-3 : ℝ) * M * Linv) * B)) := + mul_le_mul_of_nonneg_left hsum_total hC + _ = + coarseFluxResponseWithRHSRHS (((d : ℝ) ^ 2) * C) Q a a0 s g u := by + unfold coarseFluxResponseWithRHSRHS + simp [D, Mhalf, M, P, L, Linv, H, E, B, hE_eq, + scaleNormalizedPositiveBesovVectorSeminormTwo] + ring + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseGrainingL2.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseGrainingL2.lean new file mode 100644 index 0000000000..49f64e5e85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoarseGrainingL2.lean @@ -0,0 +1,334 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints + +/-! # Coarse Graining L2 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public/internal coarse-graining L2 RHS bridge + +This file contains the terminal dimension-loss comparison for the deterministic +coarse-graining L2 RHS written with the Chapter 3 public coefficient field. + +## Audit tag + +Claim: the deterministic public-coefficient coarse-graining L2 RHS is bounded +by the Chapter 3 public RHS after the explicit dimension-square loss. + +Downstream target: the scale-separated Ch3 aggregate theorem surface. This +file is bridge plumbing only and introduces no public `*Theory` package. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +private theorem coarseGraining_scalar_dimension_bound + (s D oldMhalf oldM oldP oldL oldLinv Mhalf M P L Linv H E B W1 W Winv : ℝ) + (hD_nonneg : 0 ≤ D) (hD_le_sq : D ≤ D ^ 2) + (hs_inv_nonneg : 0 ≤ s⁻¹) + (hs_pow52_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ))) + (hs_pow3_nonneg : 0 ≤ Real.rpow s (-3 : ℝ)) + (hMhalf_nonneg : 0 ≤ Mhalf) (hM_nonneg : 0 ≤ M) + (holdL_nonneg : 0 ≤ oldL) (holdLinv_nonneg : 0 ≤ oldLinv) + (hP_nonneg : 0 ≤ P) (hH_nonneg' : 0 ≤ H) + (hE_nonneg : 0 ≤ E) (hforce_nonneg : 0 ≤ Winv * B) + (hW1_nonneg : 0 ≤ W1) (hW_nonneg : 0 ≤ W) + (hMhalf_le : oldMhalf ≤ D * Mhalf) (hM_le : oldM ≤ D * M) + (hP_le : oldP ≤ D * P) (hL_le : oldL ≤ D * L) + (hLinv_le : oldLinv ≤ D * Linv) : + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B) ≤ + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := by + have hterm_energy : + s⁻¹ * oldMhalf * H * E ≤ + D ^ 2 * (s⁻¹ * Mhalf * H * E) := by + calc + s⁻¹ * oldMhalf * H * E ≤ s⁻¹ * (D * Mhalf) * H * E := by + gcongr + _ = D * (s⁻¹ * Mhalf * H * E) := by ring + _ ≤ D ^ 2 * (s⁻¹ * Mhalf * H * E) := by + exact mul_le_mul_of_nonneg_right hD_le_sq + (mul_nonneg (mul_nonneg (mul_nonneg hs_inv_nonneg hMhalf_nonneg) + hH_nonneg') hE_nonneg) + have hterm_resp : + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H) := by + have hprod : oldMhalf * oldL ≤ (D * Mhalf) * (D * L) := + mul_le_mul hMhalf_le hL_le holdL_nonneg + (mul_nonneg hD_nonneg hMhalf_nonneg) + calc + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H = + Real.rpow s (-(5 / 2 : ℝ)) * W1 * (oldMhalf * oldL) * H := by ring + _ ≤ + Real.rpow s (-(5 / 2 : ℝ)) * W1 * ((D * Mhalf) * (D * L)) * H := by + gcongr + _ = D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H) := by ring + have hterm_weak : + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * W * P * L) := by + have hprod : oldP * oldL ≤ (D * P) * (D * L) := + mul_le_mul hP_le hL_le holdL_nonneg (mul_nonneg hD_nonneg hP_nonneg) + calc + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL = + Real.rpow s (-(5 / 2 : ℝ)) * W * (oldP * oldL) := by ring + _ ≤ Real.rpow s (-(5 / 2 : ℝ)) * W * ((D * P) * (D * L)) := by + gcongr + _ = D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * W * P * L) := by ring + have hterm_poincare : + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv ≤ + D ^ 2 * (Real.rpow s (-3 : ℝ) * W * M * Linv) := by + have hprod : oldM * oldLinv ≤ (D * M) * (D * Linv) := + mul_le_mul hM_le hLinv_le holdLinv_nonneg + (mul_nonneg hD_nonneg hM_nonneg) + calc + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv = + Real.rpow s (-3 : ℝ) * W * (oldM * oldLinv) := by ring + _ ≤ Real.rpow s (-3 : ℝ) * W * ((D * M) * (D * Linv)) := by + gcongr + _ = D ^ 2 * (Real.rpow s (-3 : ℝ) * W * M * Linv) := by ring + have htail : + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B) ≤ + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := by + have hsum : + Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv ≤ + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H) + + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * W * P * L) + + D ^ 2 * (Real.rpow s (-3 : ℝ) * W * M * Linv) := by + exact add_le_add (add_le_add hterm_resp hterm_weak) hterm_poincare + calc + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B) ≤ + (D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H) + + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * W * P * L) + + D ^ 2 * (Real.rpow s (-3 : ℝ) * W * M * Linv)) * (Winv * B) := by + exact mul_le_mul_of_nonneg_right hsum hforce_nonneg + _ = + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := by ring + calc + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B) ≤ + D ^ 2 * (s⁻¹ * Mhalf * H * E) + + D ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := + add_le_add hterm_energy htail + _ = + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := by ring + +/-- Scale-separated flux-defect version of the public/internal coarse-graining +RHS bridge. -/ +theorem coarseGrainingL2FluxDefectBoundTwoExponent_publicCoeffField_le_dim_sq_mul_public_of_homogenizationErrorAtDepth_eq + {d : ℕ} [NeZero d] (C : ℝ) (Q : TriadicCube d) + (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) {s t : ℝ} (j : ℕ) + {g : Vec d → Vec d} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (hC : 0 ≤ C) (hs : 0 < s) + (hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q t g) + (hH_nonneg : 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) + (herror : + _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth + Q (publicCoeffField Q a) + a0.matrix s j = + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) : + C * _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent + Q (publicCoeffField Q a) a0.matrix s t j u.grad g ≤ + generalCoarseGrainingL2TwoExponentFluxDefectRHS + (((d : ℝ) ^ 2) * C) Q a a0 s t j g u := by + let D : ℝ := d + let Mhalf : ℝ := constantCoeffMatrixNormHalf a0 + let M : ℝ := constantCoeffMatrixNorm a0 + let oldMhalf : ℝ := Real.sqrt (matNorm a0.matrix) + let oldM : ℝ := matNorm a0.matrix + let oldP : ℝ := + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) + let oldL : ℝ := + Real.sqrt ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) + let oldLinv : ℝ := + (lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ + let P : ℝ := poincareUpperEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let L : ℝ := poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let Linv : ℝ := + Real.rpow (Ch02.lambdaSq Q (s / 2) + (Ch02.MultiscaleExponent.finite 2) a) (-1 : ℝ) + let H : ℝ := coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let E : ℝ := + Real.sqrt (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u.grad)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q t g + let W1 : ℝ := coarseGrainingDepthHalfWeight s j + let W : ℝ := coarseGrainingDepthWeight s j + let Winv : ℝ := coarseGrainingDepthInvWeight t j + have hs_half : 0 < s / 2 := by positivity + have hD_one : 1 ≤ D := by + norm_num [D, Nat.one_le_iff_ne_zero, NeZero.ne d] + have hD_nonneg : 0 ≤ D := le_trans zero_le_one hD_one + have hD_le_sq : D ≤ D ^ 2 := by nlinarith [hD_one] + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hs_pow52_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hs_pow3_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hW1_nonneg : 0 ≤ W1 := by + dsimp [W1, coarseGrainingDepthHalfWeight] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hW_nonneg : 0 ≤ W := by + dsimp [W, coarseGrainingDepthWeight] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hWinv_nonneg : 0 ≤ Winv := by + dsimp [Winv, coarseGrainingDepthInvWeight, coarseGrainingDepthWeight] + exact inv_nonneg.mpr (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hMhalf_nonneg : 0 ≤ Mhalf := by + dsimp [Mhalf, constantCoeffMatrixNormHalf] + exact Real.rpow_nonneg (Ch02.matrixNorm_nonneg a0.matrix) _ + have hM_nonneg : 0 ≤ M := by + dsimp [M, constantCoeffMatrixNorm] + exact Ch02.matrixNorm_nonneg a0.matrix + have holdMhalf_nonneg : 0 ≤ oldMhalf := by simp [oldMhalf] + have holdM_nonneg : 0 ≤ oldM := by + dsimp [oldM] + exact matNorm_nonneg a0.matrix + have holdP_nonneg : 0 ≤ oldP := by simp [oldP] + have holdL_nonneg : 0 ≤ oldL := by simp [oldL] + have holdLinv_nonneg : 0 ≤ oldLinv := by + dsimp [oldLinv] + exact inv_nonneg.mpr + (Homogenization.multiscale_ellipticity_lambdaSq_finite_nonneg + Q (s / 2) 2 (publicCoeffField Q a) + (by norm_num : (0 : ℝ) ≤ 2) + (by positivity : 0 ≤ (s / 2) * (2 : ℝ))) + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hL_nonneg : 0 ≤ L := by + dsimp [L, poincareLowerEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.lambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hLinv_nonneg : 0 ≤ Linv := by + dsimp [Linv] + exact Real.rpow_nonneg + (Ch02.lambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hH_nonneg' : 0 ≤ H := by simpa [H] using hH_nonneg + have hE_nonneg : 0 ≤ E := by simp [E] + have hB_nonneg' : 0 ≤ B := by simpa [B] using hB_nonneg + have hforce_nonneg : 0 ≤ Winv * B := mul_nonneg hWinv_nonneg hB_nonneg' + have hMhalf_le : oldMhalf ≤ D * Mhalf := by + simpa [D, oldMhalf, Mhalf] using + sqrt_matNorm_le_dim_mul_constantCoeffMatrixNormHalf a0 + have hM_le : oldM ≤ D * M := by + simpa [D, oldM, M] using + matNorm_le_dim_mul_constantCoeffMatrixNorm a0 + have hP_le : oldP ≤ D * P := by + simpa [D, oldP, P] using + sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + Q a hs_half + have hL_le : oldL ≤ D * L := by + simpa [D, oldL, L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a hs_half + have hLinv_le : oldLinv ≤ D * Linv := by + simpa [D, oldLinv, Linv] using + lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_public_rpow_neg_one + Q a hs_half + have hE_eq : E = h1EnergyNormOnCube Q a u := by + simpa [E] using + (h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) u).symm + have hinner : + s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B) ≤ + D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B)) := by + exact coarseGraining_scalar_dimension_bound + s D oldMhalf oldM oldP oldL oldLinv Mhalf M P L Linv H E B W1 W Winv + hD_nonneg hD_le_sq hs_inv_nonneg hs_pow52_nonneg hs_pow3_nonneg + hMhalf_nonneg hM_nonneg holdL_nonneg holdLinv_nonneg hP_nonneg + hH_nonneg' hE_nonneg hforce_nonneg hW1_nonneg hW_nonneg hMhalf_le hM_le hP_le hL_le hLinv_le + calc + C * _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent + Q (publicCoeffField Q a) a0.matrix s t j u.grad g = + C * + (s⁻¹ * oldMhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * oldMhalf * W1 * oldL * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * oldP * oldL + + Real.rpow s (-3 : ℝ) * W * oldM * oldLinv) * (Winv * B)) := by + unfold _root_.Homogenization.coarseGrainingL2FluxDefectBoundTwoExponent + _root_.Homogenization.coarseGrainingL2FluxDefectEnergyTerm + _root_.Homogenization.coarseGrainingL2FluxDefectForcingTermTwoExponent + rw [herror] + simp [oldMhalf, oldM, oldP, oldL, oldLinv, H, E, B, W1, W, Winv, + coarseGrainingDepthHalfWeight, coarseGrainingDepthWeight, + coarseGrainingDepthInvWeight] + _ ≤ + C * + (D ^ 2 * + (s⁻¹ * Mhalf * H * E + + (Real.rpow s (-(5 / 2 : ℝ)) * Mhalf * W1 * L * H + + Real.rpow s (-(5 / 2 : ℝ)) * W * P * L + + Real.rpow s (-3 : ℝ) * W * M * Linv) * (Winv * B))) := + mul_le_mul_of_nonneg_left hinner hC + _ = + generalCoarseGrainingL2TwoExponentFluxDefectRHS + (((d : ℝ) ^ 2) * C) Q a a0 s t j g u := by + unfold generalCoarseGrainingL2TwoExponentFluxDefectRHS + simp [D, Mhalf, M, P, L, Linv, H, E, B, W1, W, Winv, hE_eq, + coarseGrainingDepthHalfWeight, coarseGrainingDepthWeight, + coarseGrainingDepthInvWeight, scaleNormalizedPositiveBesovVectorSeminormTwo] + ring + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoeffField.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoeffField.lean new file mode 100644 index 0000000000..766390d03d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/CoeffField.lean @@ -0,0 +1,718 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # Coeff Field -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public coefficient-field bridges for Chapter 3 + +This file contains the pointwise coefficient representative, descendant-data +bridges, Ch2 multiscale translations, and homogenization-error translations +used by the broader Chapter 3 public/internal bridge layer. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Pointwise representative of the public coefficient family on `Q`. + +It is a.e. equal to the public `CoeffOn` field on the open cube, but is +pointwise elliptic on every descendant cube, making it suitable for the +deterministic coarse-graining APIs. -/ +abbrev publicCoeffField {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) : + CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (a.coeffOn Q) + +theorem publicCoeffField_ae_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + (a.coeffOn Q).toCoeffField := by + simpa [publicCoeffField] using + Internal.Ch02.BookCh02.pointwiseCoeffField_ae_eq + (Ch02.cubeDomain Q) (a.coeffOn Q) + +theorem publicCoeffField_ae_eq_openCubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (openCubeSet Q)] + (a.coeffOn Q).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using publicCoeffField_ae_eq Q a + +theorem publicCoeffField_ae_eq_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (cubeSet Q)] + (a.coeffOn Q).toCoeffField := by + simpa [volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using publicCoeffField_ae_eq_openCubeSet Q a + +theorem publicCoeffField_isEllipticFieldOn {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (Ch02.cubeDomain Q : Set (Vec d)) (publicCoeffField Q a) := by + simpa [publicCoeffField] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (Ch02.cubeDomain Q) (a.coeffOn Q) + +theorem publicCoeffField_isEllipticFieldOn_openCubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet Q) (publicCoeffField Q a) := by + simpa [Ch02.cubeDomain_coe] using publicCoeffField_isEllipticFieldOn Q a + +theorem publicCoeffField_isEllipticFieldOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet Q) (publicCoeffField Q a) := by + simpa [publicCoeffField] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn_cubeSet + Q (a.coeffOn Q) + +theorem publicCoeffField_isEllipticFieldOn_descendant_openCubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (openCubeSet R) (publicCoeffField Q a) := + (publicCoeffField_isEllipticFieldOn_openCubeSet Q a).mono + (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + +theorem publicCoeffField_isEllipticFieldOn_descendant_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet R) (publicCoeffField Q a) := + (publicCoeffField_isEllipticFieldOn_cubeSet Q a).mono + (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR) + +theorem publicCoeffField_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) : + OpenCubeDescendantDeterministicCoarseData Q (publicCoeffField Q a) := by + simpa [publicCoeffField] using + Ch02.pointwiseCoeffField_openCube_descendant_data Q (a.coeffOn Q) + +theorem publicCoeffField_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) : + OpenCubeDeterministicCoarseData Q (publicCoeffField Q a) := + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a).self + +theorem publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + OpenCubeDescendantDeterministicCoarseData R (publicCoeffField Q a) := by + have hscale : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + exact OpenCubeDescendantDeterministicCoarseData.of_mem_descendantsAtScale + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + hscale (mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR) + +theorem publicCoeffField_openCubeDeterministicCoarseData_descendant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + OpenCubeDeterministicCoarseData R (publicCoeffField Q a) := + (publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant + Q a hR).self + +noncomputable def h1CoerciveEstimateCubeSet + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + H1CoerciveEstimate (cubeSet Q) := + _root_.Homogenization.h1CoerciveEstimate_cubeSet Q + +theorem publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (publicCoeffField Q a)) := + _root_.Homogenization.summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := publicCoeffField Q a) s hs + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + +theorem publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_rpow_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (publicCoeffField Q a)) 1) := by + simpa [Real.rpow_one] using + publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale + (Q := Q) (a := a) hs + +theorem publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) + (publicCoeffField Q a)) := + _root_.Homogenization.summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := R) (a := publicCoeffField Q a) s hs + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + (publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant Q a hR) + +theorem publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant_rpow_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) + (publicCoeffField Q a)) 1) := by + simpa [Real.rpow_one] using + publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant + (Q := Q) (a := a) hR hs + +theorem publicCoeffField_ae_eq_descendant_openCubeSet + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (openCubeSet R)] + (a.coeffOn R).toCoeffField := by + have hsubset : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtDepth hR + have hle : + volumeMeasureOn (openCubeSet R) ≤ volumeMeasureOn (openCubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hsubset + have hparent : + publicCoeffField Q a =ᵐ[volumeMeasureOn (openCubeSet R)] + (a.coeffOn Q).toCoeffField := + (publicCoeffField_ae_eq_openCubeSet Q a).filter_mono + (MeasureTheory.ae_mono hle) + have hrestrict : + (a.coeffOn R).toCoeffField =ᵐ[volumeMeasureOn (openCubeSet R)] + (a.coeffOn Q).toCoeffField := + a.restrictsTo_of_subset hsubset + exact hparent.trans hrestrict.symm + +theorem publicCoeffField_ae_eq_descendant_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (cubeSet R)] + (a.coeffOn R).toCoeffField := by + simpa [volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet R] + using publicCoeffField_ae_eq_descendant_openCubeSet Q a hR + +theorem publicCoeffField_ae_eq_publicCoeffField_descendant_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + publicCoeffField Q a =ᵐ[volumeMeasureOn (cubeSet R)] + publicCoeffField R a := by + exact (publicCoeffField_ae_eq_descendant_cubeSet Q a hR).trans + (publicCoeffField_ae_eq_cubeSet R a).symm + +theorem memVectorL2_cubeSet_of_forceBesovRegularity + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) : + MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg.memLp + +theorem memVectorL2_descendant_cubeSet_of_forceBesovRegularity + {d : ℕ} {Q R : TriadicCube d} {s : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) g := by + have hmono : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR) + exact (memVectorL2_cubeSet_of_forceBesovRegularity hg).mono_measure hmono + +theorem forceBesovRegularity_descendant_memLp_normalizedCubeMeasure + {d : ℕ} {Q R : TriadicCube d} {s : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg.memLp + +theorem forceBesovRegularity_descendant_partialSeminorms_bddAbove + {d : ℕ} {Q R : TriadicCube d} {s : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hg.partialSeminorms_bddAbove + +theorem forceBesovRegularity_descendant_centered_partialSeminorms_bddAbove + {d : ℕ} {Q R : TriadicCube d} {s : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g)) := by + rcases forceBesovRegularity_descendant_partialSeminorms_bddAbove hg hR with + ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro _ ⟨N, rfl⟩ + have hmem : + ∀ k ∈ Finset.range (N + 1), ∀ S ∈ descendantsAtDepth R k, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro k _ S hS + exact forceBesovRegularity_descendant_memLp_normalizedCubeMeasure hg + (mem_descendantsAtDepth_add hR hS) + change cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g) ≤ B + rw [cubeBesovPositiveVectorPartialSeminormTwo_sub_const R s N g + (cubeAverageVec R g) hmem] + exact hB ⟨N, rfl⟩ + +theorem forceBesovRegularity_descendant + {d : ℕ} {Q R : TriadicCube d} {s : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + ForceBesovRegularity R s g := + ⟨forceBesovRegularity_descendant_memLp_normalizedCubeMeasure hg hR, + forceBesovRegularity_descendant_partialSeminorms_bddAbove hg hR⟩ + +theorem forceBesovRegularity_negativeBesovPartialSeminormTwo_bddAbove + {d : ℕ} {Q : TriadicCube d} {s t : ℝ} {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q t g) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N g) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs g hg.memLp + +theorem forceBesovRegularity_descendant_negativeBesovPartialSeminormTwo_bddAbove + {d : ℕ} {Q R : TriadicCube d} {s t : ℝ} {j : ℕ} + {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q t g) + (hR : R ∈ descendantsAtDepth Q j) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N g) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs g + (forceBesovRegularity_descendant_memLp_normalizedCubeMeasure hg hR) + +theorem constantCoeffMatrix_isEllipticFieldOn_constantCoeffField + {d : ℕ} {U : Set (Vec d)} + (a0 : ConstantCoeffMatrix d) (hU : MeasurableSet U) : + IsEllipticFieldOn a0.lam a0.Lam U (constantCoeffField a0.matrix) := + isEllipticFieldOn_constantCoeffField hU a0.elliptic + +theorem matNorm_le_dim_mul_constantCoeffMatrixNorm + {d : ℕ} (a0 : ConstantCoeffMatrix d) : + matNorm a0.matrix ≤ (d : ℝ) * constantCoeffMatrixNorm a0 := by + simpa [constantCoeffMatrixNorm] using + Ch02.matNorm_le_dim_mul_matrixNorm a0.matrix + +theorem sqrt_matNorm_le_dim_mul_constantCoeffMatrixNormHalf + {d : ℕ} [NeZero d] (a0 : ConstantCoeffMatrix d) : + Real.sqrt (matNorm a0.matrix) ≤ + (d : ℝ) * constantCoeffMatrixNormHalf a0 := by + have hop_nonneg : 0 ≤ Ch02.matrixNorm a0.matrix := + Ch02.matrixNorm_nonneg a0.matrix + have hmat_le : + matNorm a0.matrix ≤ (d : ℝ) * Ch02.matrixNorm a0.matrix := + Ch02.matNorm_le_dim_mul_matrixNorm a0.matrix + have hsqrts : + Real.sqrt (matNorm a0.matrix) ≤ + Real.sqrt ((d : ℝ) * Ch02.matrixNorm a0.matrix) := + Real.sqrt_le_sqrt hmat_le + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + have hd_one : 1 ≤ (d : ℝ) := by + norm_num [Nat.one_le_iff_ne_zero, NeZero.ne d] + have hM_sq : + constantCoeffMatrixNormHalf a0 ^ 2 = Ch02.matrixNorm a0.matrix := by + simpa [constantCoeffMatrixNormHalf, Real.sqrt_eq_rpow] using + Real.sq_sqrt hop_nonneg + have hright_nonneg : + 0 ≤ (d : ℝ) * constantCoeffMatrixNormHalf a0 := + mul_nonneg hd_nonneg (Real.rpow_nonneg hop_nonneg _) + have hsq : + Real.sqrt ((d : ℝ) * Ch02.matrixNorm a0.matrix) ^ 2 ≤ + ((d : ℝ) * constantCoeffMatrixNormHalf a0) ^ 2 := by + rw [Real.sq_sqrt (mul_nonneg hd_nonneg hop_nonneg), mul_pow, hM_sq] + nlinarith [mul_nonneg (sub_nonneg.mpr hd_one) hop_nonneg] + exact hsqrts.trans + ((sq_le_sq₀ (Real.sqrt_nonneg _) hright_nonneg).mp hsq) + +theorem sqrt_LambdaSq_publicCoeffField_finite_one_le_dim_mul_poincareUpperEllipticityFactor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.sqrt (LambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a)) ≤ + (d : ℝ) * + poincareUpperEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 1) := by + have h := Ch02.old_LambdaSq_one_rpow_half_le_dim_mul_pointwiseCoeffField + Q a hs + simpa [publicCoeffField, LambdaSq, Ch02.LambdaSq, + poincareUpperEllipticityFactor, Real.sqrt_eq_rpow] using h + +theorem sqrt_lambdaSq_publicCoeffField_finite_one_inv_le_dim_mul_poincareLowerEllipticityFactor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a))⁻¹) ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 1) := by + have h := Ch02.old_lambdaSq_one_rpow_neg_half_le_dim_mul_pointwiseCoeffField + Q a hs + have hleft : + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a))⁻¹) = + Real.rpow + (lambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a)) (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + calc + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a))⁻¹) = + Real.rpow + (lambdaSq Q s (MultiscaleExponent.finite 1) + (publicCoeffField Q a)) (-1 / 2 : ℝ) := hleft + _ ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 1) := by + have hExp : (-1 / 2 : ℝ) = (-(1 / 2 : ℝ)) := by ring + simpa [publicCoeffField, lambdaSq, Ch02.lambdaSq, + poincareLowerEllipticityFactor, hExp] using h + +theorem sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.sqrt (LambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) ≤ + (d : ℝ) * + poincareUpperEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 2) := by + have h := Ch02.old_LambdaSq_two_rpow_half_le_dim_mul_pointwiseCoeffField + Q a hs + simpa [publicCoeffField, LambdaSq, Ch02.LambdaSq, + poincareUpperEllipticityFactor, Real.sqrt_eq_rpow] using h + +theorem sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 2) := by + have h := Ch02.old_lambdaSq_two_rpow_neg_half_le_dim_mul_pointwiseCoeffField + Q a hs + have hleft : + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) = + Real.rpow + (lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + calc + Real.sqrt ((lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) = + Real.rpow + (lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) (-1 / 2 : ℝ) := hleft + _ ≤ + (d : ℝ) * + poincareLowerEllipticityFactor Q a s + (Ch02.MultiscaleExponent.finite 2) := by + have hExp : (-1 / 2 : ℝ) = (-(1 / 2 : ℝ)) := by ring + simpa [publicCoeffField, lambdaSq, Ch02.lambdaSq, + poincareLowerEllipticityFactor, hExp] using h + +theorem lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_public_rpow_neg_one + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} (hs : 0 < s) : + (lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ ≤ + (d : ℝ) * + Real.rpow (Ch02.lambdaSq Q s (Ch02.MultiscaleExponent.finite 2) a) + (-1 : ℝ) := by + have h := Ch02.old_lambdaSq_two_inv_le_dim_mul_pointwiseCoeffField Q a hs + calc + (lambdaSq Q s (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹ ≤ + (d : ℝ) * (Ch02.lambdaSq Q s (Ch02.MultiscaleExponent.finite 2) a)⁻¹ := by + simpa [publicCoeffField, lambdaSq, Ch02.lambdaSq] using h + _ = + (d : ℝ) * + Real.rpow (Ch02.lambdaSq Q s (Ch02.MultiscaleExponent.finite 2) a) + (-1 : ℝ) := by + congr 1 + exact (Real.rpow_neg_one _).symm + +theorem blockJ_cubeSet_publicCoeffField_eq_ch02_doubledResponseJ + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) + (P Q' : BlockVec d) : + BlockJ (cubeSet R) P Q' (publicCoeffField Q a) = + Ch02.doubledResponseJ (Ch02.cubeDomain R) (a.coeffOn R) P Q' := by + let A : CoeffField d := publicCoeffField Q a + let := isFiniteMeasureVolumeMeasureOnCubeSet R + have hsubOpen : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hk hR + let aRpw : Ch02.CoeffOn (Ch02.cubeDomain R) := + Ch02.pointwiseCoeffOnRestrict (a.coeffOn Q) hsubOpen + have haeeq : Ch02.CoeffOn.AEEq (a.coeffOn R) aRpw := by + simpa [aRpw] using + Ch02.coeffOn_descendant_aeeq_pointwiseCoeffOnRestrict (a := a) hk hR + have hEllQ : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet Q) A := by + simpa [A] using publicCoeffField_isEllipticFieldOn_cubeSet Q a + have hEllR : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet R) A := + hEllQ.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtScale hk hR) + have hvolR : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hbook_scalar_pw := + (Ch02.doubledResponseTheory (Ch02.cubeDomain R) aRpw).doubledResponseJ_eq_scalar + P.1 Q'.2 P.2 Q'.1 + calc + BlockJ (cubeSet R) P Q' (publicCoeffField Q a) = + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) A + + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) + (adjointCoeffField A) := by + simpa [A] using + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := A) (U := cubeSet R) (measurableSet_cubeSet R) hEllR + hvolR (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1) + _ = (1 / 2 : ℝ) * ResponseJ (openCubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) A + + (1 / 2 : ℝ) * ResponseJ (openCubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) + (adjointCoeffField A) := by + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R, + ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R] + _ = (1 / 2 : ℝ) * Ch02.responseJ (Ch02.cubeDomain R) aRpw + (P.1 - Q'.2) (Q'.1 - P.2) + + (1 / 2 : ℝ) * Ch02.responseJ (Ch02.cubeDomain R) aRpw.transpose + (Q'.2 + P.1) (Q'.1 + P.2) := by + rw [Internal.Ch02.book_responseJ_eq_ResponseJ, + Internal.Ch02.book_responseJ_eq_ResponseJ] + rfl + _ = Ch02.doubledResponseJ (Ch02.cubeDomain R) aRpw P Q' := by + exact hbook_scalar_pw.symm + _ = Ch02.doubledResponseJ (Ch02.cubeDomain R) (a.coeffOn R) P Q' := by + rw [Ch02.doubledResponseJ_eq_ofAEEq haeeq P Q'] + +theorem normalizedBlockResponseValueSet_publicCoeffField_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) (a0 : Mat d) : + normalizedBlockResponseValueSet R (publicCoeffField Q a) a0 = + Ch02.normalizedBlockResponseValueSet R a a0 := by + ext m + constructor + · rintro ⟨e, he, hm⟩ + refine ⟨e, ?_, ?_⟩ + · simpa [Ch02.fullBlockVecNormSq, Homogenization.fullBlockVecNormSq] using he + · have hbridge := + blockJ_cubeSet_publicCoeffField_eq_ch02_doubledResponseJ + (a := a) (Q := Q) (R := R) (k := k) hk hR + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + simpa [Ch02.constantFullBlockMatrixInvSqrt, constantFullBlockMatrixInvSqrt, + Ch02.constantFullBlockMatrixSqrt, constantFullBlockMatrixSqrt, + Ch02.constantFullBlockMatrix, constantFullBlockMatrix, + Ch02.constantBlockMatrix, blockMatrixOfCoeff] using hm.trans hbridge + · rintro ⟨e, he, hm⟩ + refine ⟨e, ?_, ?_⟩ + · simpa [Ch02.fullBlockVecNormSq, Homogenization.fullBlockVecNormSq] using he + · have hbridge := + blockJ_cubeSet_publicCoeffField_eq_ch02_doubledResponseJ + (a := a) (Q := Q) (R := R) (k := k) hk hR + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + simpa [Ch02.constantFullBlockMatrixInvSqrt, constantFullBlockMatrixInvSqrt, + Ch02.constantFullBlockMatrixSqrt, constantFullBlockMatrixSqrt, + Ch02.constantFullBlockMatrix, constantFullBlockMatrix, + Ch02.constantBlockMatrix, blockMatrixOfCoeff] using hm.trans hbridge.symm + +theorem normalizedBlockResponseMax_publicCoeffField_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) (a0 : Mat d) : + normalizedBlockResponseMax R (publicCoeffField Q a) a0 = + Ch02.normalizedBlockResponseMax R a a0 := by + unfold normalizedBlockResponseMax Ch02.normalizedBlockResponseMax + rw [normalizedBlockResponseValueSet_publicCoeffField_eq_ch02 + (a := a) (Q := Q) (R := R) (k := k) hk hR a0] + +theorem maxDescendantNormalizedBlockResponseAtScale_publicCoeffField_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) (Q : TriadicCube d) + {k : ℤ} (hk : k ≤ Q.scale) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q k (publicCoeffField Q a) a0 = + Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + Ch02.maxDescendantNormalizedBlockResponseAtScale + rw [Ch02.finsetSupReal_eq_finsetSsup] + apply congrArg sSup + ext y + constructor + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, + (normalizedBlockResponseMax_publicCoeffField_eq_ch02 + (a := a) (Q := Q) (R := R) (k := k) hk hR a0).symm⟩ + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, + normalizedBlockResponseMax_publicCoeffField_eq_ch02 + (a := a) (Q := Q) (R := R) (k := k) hk hR a0⟩ + +theorem scaleResponseAtScale_publicCoeffField_infinity_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) (Q : TriadicCube d) + {k : ℤ} (hk : k ≤ Q.scale) (a0 : Mat d) : + scaleResponseAtScale Q k MultiscaleExponent.infinity + (publicCoeffField Q a) a0 = + Ch02.scaleResponseAtScale Q k Ch02.MultiscaleExponent.infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, Ch02.scaleResponseAtScale_infinity_eq, + maxDescendantNormalizedBlockResponseAtScale_publicCoeffField_eq_ch02 + (a := a) Q hk a0] + +theorem maxDescendantNormalizedBlockResponseAtScale_parent_publicCoeffField_descendant_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale R l (publicCoeffField Q a) a0 = + Ch02.maxDescendantNormalizedBlockResponseAtScale R l a a0 := by + have hk : k ≤ Q.scale := Homogenization.descendant_scale_le_of_mem_descendantsAtScale hR + have hRscale : R.scale = k := Homogenization.descendant_scale_eq_of_mem_descendantsAtScale hR + have hlQ : l ≤ Q.scale := by + exact le_trans (by simpa [hRscale] using hl) hk + unfold maxDescendantNormalizedBlockResponseAtScale + Ch02.maxDescendantNormalizedBlockResponseAtScale + rw [Ch02.finsetSupReal_eq_finsetSsup] + apply congrArg sSup + ext y + constructor + · rintro ⟨S, hS, rfl⟩ + exact ⟨S, hS, + (normalizedBlockResponseMax_publicCoeffField_eq_ch02 + (a := a) (Q := Q) (R := S) (k := l) hlQ + (Homogenization.mem_descendantsAtScale_trans hR hS) a0).symm⟩ + · rintro ⟨S, hS, rfl⟩ + exact ⟨S, hS, + normalizedBlockResponseMax_publicCoeffField_eq_ch02 + (a := a) (Q := Q) (R := S) (k := l) hlQ + (Homogenization.mem_descendantsAtScale_trans hR hS) a0⟩ + +theorem scaleResponseAtScale_parent_publicCoeffField_descendant_infinity_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) (a0 : Mat d) : + scaleResponseAtScale R l MultiscaleExponent.infinity + (publicCoeffField Q a) a0 = + Ch02.scaleResponseAtScale R l Ch02.MultiscaleExponent.infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, Ch02.scaleResponseAtScale_infinity_eq, + maxDescendantNormalizedBlockResponseAtScale_parent_publicCoeffField_descendant_eq_ch02 + (a := a) hR hl a0] + +theorem homogenizationErrorOnCube_parent_publicCoeffField_descendant_infinity_one_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) (s : ℝ) (a0 : Mat d) : + HomogenizationErrorOnCube R s MultiscaleExponent.infinity + (MultiscaleExponent.finite 1) (publicCoeffField Q a) a0 = + Ch02.HomogenizationErrorOnCube R s Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum, + Ch02.homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_congr + intro n + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [← Ch02.geometricWeight_eq_old] + rw [scaleResponseAtScale_parent_publicCoeffField_descendant_infinity_eq_ch02 + (a := a) hR hl a0] + +theorem homogenizationErrorOnCube_parent_publicCoeffField_descendant_infinity_one_terms_summable + {d : ℕ} [NeZero d] (a : CoeffFamily d) + {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + Summable fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) + MultiscaleExponent.infinity (publicCoeffField Q a) a0 := by + have hbook := Ch02.summable_homogenizationErrorOnCube_infinity_one_terms + R a a0 hs + refine hbook.congr ?_ + intro n + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [Ch02.geometricWeight_eq_old] + rw [scaleResponseAtScale_parent_publicCoeffField_descendant_infinity_eq_ch02 + (a := a) hR hl a0] + +theorem homogenizationErrorOnCube_publicCoeffField_infinity_one_eq_ch02 + {d : ℕ} [NeZero d] (a : CoeffFamily d) (Q : TriadicCube d) + (s : ℝ) (a0 : Mat d) : + HomogenizationErrorOnCube Q s MultiscaleExponent.infinity + (MultiscaleExponent.finite 1) (publicCoeffField Q a) a0 = + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (Ch02.MultiscaleExponent.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum, + Ch02.homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_congr + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [← Ch02.geometricWeight_eq_old] + rw [scaleResponseAtScale_publicCoeffField_infinity_eq_ch02 + (a := a) Q hk a0] + +theorem homogenizationErrorOnCube_publicCoeffField_infinity_one_terms_summable + {d : ℕ} [NeZero d] (a : CoeffFamily d) (Q : TriadicCube d) + (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + Summable fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) + MultiscaleExponent.infinity (publicCoeffField Q a) a0 := by + have hbook := Ch02.summable_homogenizationErrorOnCube_infinity_one_terms + Q a a0 hs + refine hbook.congr ?_ + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + rw [Ch02.geometricWeight_eq_old] + rw [scaleResponseAtScale_publicCoeffField_infinity_eq_ch02 + (a := a) Q hk a0] + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/EndPoints.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/EndPoints.lean new file mode 100644 index 0000000000..bc389bde19 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/EndPoints.lean @@ -0,0 +1,717 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # End Points -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public/internal bridges for Chapter 3 + +This file now contains the Besov, flux-RHS, and coarse-graining public/internal +bridge endpoints. Lower bridge layers live in the `PublicInternalBridges/` +submodules. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +theorem cubeBesovPairing_eq_of_left_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {f₁ f₂ g : Vec d → ℝ} + (hf : f₁ =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] f₂) : + cubeBesovPairing Q f₁ g = cubeBesovPairing Q f₂ g := by + unfold cubeBesovPairing + exact cubeAverage_eq_of_ae_eq_on_cubeSet <| + hf.mono fun x hx => by simp [hx] + +theorem cubeBesovDualFullNormValueSet_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {f₁ f₂ : Vec d → ℝ} + (s : ℝ) (p q : ℝ≥0∞) + (hf : f₁ =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] f₂) : + cubeBesovDualFullNormValueSet Q s p q f₁ = + cubeBesovDualFullNormValueSet Q s p q f₂ := by + ext r + constructor + · rintro ⟨g, hg, rfl⟩ + exact ⟨g, hg, + congrArg abs (cubeBesovPairing_eq_of_left_ae_eq_on_cubeSet hf)⟩ + · rintro ⟨g, hg, rfl⟩ + exact ⟨g, hg, + congrArg abs (cubeBesovPairing_eq_of_left_ae_eq_on_cubeSet hf.symm)⟩ + +theorem cubeBesovDualFullNorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {f₁ f₂ : Vec d → ℝ} + (s : ℝ) (p q : ℝ≥0∞) + (hf : f₁ =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] f₂) : + cubeBesovDualFullNorm Q s p q f₁ = + cubeBesovDualFullNorm Q s p q f₂ := by + unfold cubeBesovDualFullNorm + rw [cubeBesovDualFullNormValueSet_eq_of_ae_eq_on_cubeSet s p q hf] + +theorem scaleNormalizedDualNegativeBesovVectorNormTwo_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s : ℝ) (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s F = + scaleNormalizedDualNegativeBesovVectorNormTwo Q s G := by + unfold scaleNormalizedDualNegativeBesovVectorNormTwo + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + exact cubeBesovDualFullNorm_eq_of_ae_eq_on_cubeSet s (2 : ℝ≥0∞) (2 : ℝ≥0∞) <| + hFG.mono fun x hx => congrArg (fun y : Vec d => y i) hx + +theorem negativeBesovVectorDepthAverage_eq_cubeBesovNegativeVectorDepthAverage + {d : ℕ} (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) : + negativeBesovVectorDepthAverage Q F j = + Homogenization.cubeBesovNegativeVectorDepthAverage Q F j := by + rfl + +theorem negativeBesovVectorDepthSeminorm_eq_cubeBesovNegativeVectorDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + negativeBesovVectorDepthSeminorm Q s F j = + Homogenization.cubeBesovNegativeVectorDepthSeminorm Q s F j := by + simp [negativeBesovVectorDepthSeminorm, + Homogenization.cubeBesovNegativeVectorDepthSeminorm, + negativeBesovVectorDepthAverage_eq_cubeBesovNegativeVectorDepthAverage] + +theorem negativeBesovVectorDepthAverage_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) (j : ℕ) : + negativeBesovVectorDepthAverage Q F j = + negativeBesovVectorDepthAverage Q G j := by + rw [negativeBesovVectorDepthAverage_eq_cubeBesovNegativeVectorDepthAverage, + negativeBesovVectorDepthAverage_eq_cubeBesovNegativeVectorDepthAverage] + exact Homogenization.cubeBesovNegativeVectorDepthAverage_eq_of_ae_eq_on_cubeSet hFG j + +theorem negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s : ℝ) (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) (j : ℕ) : + negativeBesovVectorDepthSeminorm Q s F j = + negativeBesovVectorDepthSeminorm Q s G j := by + unfold negativeBesovVectorDepthSeminorm + rw [negativeBesovVectorDepthAverage_eq_of_ae_eq_on_cubeSet hFG j] + +theorem negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s q : ℝ) (N : ℕ) + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) : + negativeBesovVectorPartialNormFinite Q s q N F = + negativeBesovVectorPartialNormFinite Q s q N G := by + unfold negativeBesovVectorPartialNormFinite + congr 1 + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet s hFG j] + +theorem scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {F G : Vec d → Vec d} + (s : ℝ) (q : Ch02.MultiscaleExponent) + (hFG : F =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] G) : + scaleNormalizedNegativeBesovVectorNorm Q s q F = + scaleNormalizedNegativeBesovVectorNorm Q s q G := by + cases q with + | finite q => + unfold scaleNormalizedNegativeBesovVectorNorm + apply congrArg sSup + ext y + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, + (negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s q N hFG).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, + negativeBesovVectorPartialNormFinite_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s q N hFG⟩ + | infinity => + unfold scaleNormalizedNegativeBesovVectorNorm + apply congrArg sSup + ext y + constructor + · rintro ⟨j, rfl⟩ + exact ⟨j, + (negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s hFG j).symm⟩ + · rintro ⟨j, rfl⟩ + exact ⟨j, + negativeBesovVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := F) (G := G) s hFG j⟩ + +theorem scaleNormalizedNegativeBesovVectorNorm_finite_two_eq_cubeBesovNegativeVectorSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) F = + cubeBesovNegativeVectorSeminormTwo Q s F := by + simp [scaleNormalizedNegativeBesovVectorNorm, negativeBesovVectorPartialNormFinite, + negativeBesovVectorDepthSeminorm, + Homogenization.cubeBesovNegativeVectorSeminormTwo, + Homogenization.cubeBesovNegativeVectorPartialSeminormTwo, + Homogenization.cubeBesovNegativeVectorDepthSeminorm, + negativeBesovVectorDepthAverage_eq_cubeBesovNegativeVectorDepthAverage, + Real.sqrt_eq_rpow] + +theorem scaleNormalizedNegativeBesovVectorNorm_finite_one_eq_cubeBesovNegativeVectorSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 1) F = + cubeBesovNegativeVectorSeminorm Q s F := by + simp [scaleNormalizedNegativeBesovVectorNorm, negativeBesovVectorPartialNormFinite, + negativeBesovVectorDepthSeminorm, negativeBesovVectorDepthAverage, + Homogenization.cubeBesovNegativeVectorSeminorm, + Homogenization.cubeBesovNegativeVectorPartialSeminorm, + Homogenization.cubeBesovNegativeVectorDepthSeminorm, + Homogenization.cubeBesovNegativeVectorDepthAverage, + Real.rpow_one] + +theorem publicDualBesovScaleWeight_eq_cubeBesovScaleWeight + {d : ℕ} (Q : TriadicCube d) (s : ℝ) : + Real.rpow (3 : ℝ) (-s * (((Q.scale : ℤ) : ℝ))) = + cubeBesovScaleWeight s Q := by + have h3 : 0 < (3 : ℝ) := by norm_num + calc + Real.rpow (3 : ℝ) (-s * (((Q.scale : ℤ) : ℝ))) + = Real.rpow (3 : ℝ) ((((Q.scale : ℤ) : ℝ)) * (-s)) := by ring_nf + _ = Real.rpow (Real.rpow (3 : ℝ) (((Q.scale : ℤ) : ℝ))) (-s) := by + exact Real.rpow_mul h3.le (((Q.scale : ℤ) : ℝ)) (-s) + _ = cubeBesovScaleWeight s Q := by + simp [cubeBesovScaleWeight, cubeScaleFactor, Real.rpow_intCast] + +theorem scaleNormalizedDualNegativeBesovVectorNormTwo_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hs : 0 < s) (hF : MemVectorL2 (cubeSet Q) F) : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s F ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + cubeBesovNegativeVectorSeminormTwo Q s F := by + let B : ℝ := cubeBesovNegativeVectorSeminormTwo Q s F + have hF_lp : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hF + have hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N F) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs F hF_lp + have hpartial : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N F ≤ B := by + intro N + unfold B cubeBesovNegativeVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + have hpConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [show cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)))] + norm_num + have hcomponent : + ∀ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B) := by + intro i + have hFi : + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_component_of_memLp F i hF_lp + have hdual := + cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) hs hFi + (by norm_num) (by norm_num) hpConjTop (by norm_num) + have hcirc := + cubeBesovCircNorm_two_two_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBoundTwo + Q s F i hpartial + exact hdual.trans + (mul_le_mul_of_nonneg_left hcirc + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + have hsum : + (∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ≤ + (d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B)) := by + calc + (∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) + ≤ ∑ _i : Fin d, + Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B) := by + exact Finset.sum_le_sum fun i _hi => hcomponent i + _ = (d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B)) := by + simp [Finset.sum_const, Fintype.card_fin, nsmul_eq_mul] + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q := + cubeBesovScaleWeight_nonneg s Q + calc + scaleNormalizedDualNegativeBesovVectorNormTwo Q s F + = cubeBesovScaleWeight s Q * + ∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) := by + unfold scaleNormalizedDualNegativeBesovVectorNormTwo + rw [publicDualBesovScaleWeight_eq_cubeBesovScaleWeight] + _ ≤ cubeBesovScaleWeight s Q * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B))) := + mul_le_mul_of_nonneg_left hsum hscale_nonneg + _ = (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * B := by + have hmul : + cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + simpa [mul_comm] using cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + rw [show cubeBesovScaleWeight s Q * + ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B))) = + (cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * B) by ring, + hmul] + ring + +theorem forcedSolutionFluxDefect_dualNorm_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {s : ℝ} {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) (hs : 0 < s) : + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect (publicCoeffField Q a) a0.matrix + (forcedSolutionGradientField u)) := by + let F : Vec d → Vec d := + fluxDefect (publicCoeffField Q a) a0.matrix + (forcedSolutionGradientField u) + have hgrad : MemVectorL2 (cubeSet Q) (forcedSolutionGradientField u) := + forcedSolutionGradientField_memVectorL2_cubeSet u + have hfluxA : MemVectorL2 (cubeSet Q) + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) hgrad + have hEll0 : + IsEllipticFieldOn a0.lam a0.Lam (cubeSet Q) + (constantCoeffField a0.matrix) := + constantCoeffMatrix_isEllipticFieldOn_constantCoeffField a0 + (measurableSet_cubeSet Q) + have hflux0 : MemVectorL2 (cubeSet Q) + (fun x => matVecMul a0.matrix (forcedSolutionGradientField u x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hgrad + have hF_mem : MemVectorL2 (cubeSet Q) F := by + dsimp [F, fluxDefect] + exact hfluxA.sub hflux0 + have hnorm := + scaleNormalizedDualNegativeBesovVectorNormTwo_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo + Q s F hs hF_mem + have hae : + forcedSolutionFluxDefectField Q a a0 u + =ᵐ[volumeMeasureOn (cubeSet Q)] F := by + simpa [F, forcedSolutionGradientField] using + forcedSolutionFluxDefectField_ae_eq_fluxDefect_publicCoeffField_cubeSet + (Q := Q) (a := a) (a0 := a0) u + calc + scaleNormalizedDualNegativeBesovVectorNormTwo Q s + (forcedSolutionFluxDefectField Q a a0 u) + = scaleNormalizedDualNegativeBesovVectorNormTwo Q s F := + scaleNormalizedDualNegativeBesovVectorNormTwo_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := forcedSolutionFluxDefectField Q a a0 u) (G := F) s hae + _ ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + cubeBesovNegativeVectorSeminormTwo Q s F := hnorm + +theorem homogenizationComparisonNegativeBesovLHS_eq_solutionComparisonNegativeBesovLhs_publicCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + homogenizationComparisonNegativeBesovLHS Q a a0 s u v = + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix u.grad v.grad := by + let Gf : Vec d → Vec d := + fluxComparison (publicCoeffField Q a) a0.matrix u.grad v.grad + have hflux_ae : + homogenizationComparisonFluxField Q a a0 u v + =ᵐ[volumeMeasureOn (cubeSet Q)] Gf := by + simpa [Gf] using + homogenizationComparisonFluxField_ae_eq_fluxComparison_publicCoeffField_cubeSet + (Q := Q) (a := a) (a0 := a0) u v + have hflux_eq : + cubeBesovNegativeVectorSeminormTwo Q s + (homogenizationComparisonFluxField Q a a0 u v) = + cubeBesovNegativeVectorSeminormTwo Q s Gf := + cubeBesovNegativeVectorSeminormTwo_eq_of_ae_eq_on_cubeSet + (Q := Q) (u := homogenizationComparisonFluxField Q a a0 u v) + (v := Gf) s hflux_ae + calc + homogenizationComparisonNegativeBesovLHS Q a a0 s u v + = + cubeBesovNegativeVectorSeminormTwo Q s + (constantGradientComparison a0.matrix u.grad v.grad) + + cubeBesovNegativeVectorSeminormTwo Q s Gf := by + unfold homogenizationComparisonNegativeBesovLHS + rw [homogenizationComparisonConstantGradientField_eq_constantGradientComparison + (Q := Q) (a0 := a0) u v, hflux_eq] + _ = + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix u.grad v.grad := by + rfl + +theorem homogenizationComparisonNegativeBesovLHS_le_note_constant_mul_solutionComparisonNegativeBesovLhs_publicCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) (hs : 0 < s) : + homogenizationComparisonNegativeBesovLHS Q a a0 s u v ≤ + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix u.grad v.grad := by + let K : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + let S : ℝ := + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix u.grad v.grad + let Gc : Vec d → Vec d := + constantGradientComparison a0.matrix u.grad v.grad + let Gf : Vec d → Vec d := + fluxComparison (publicCoeffField Q a) a0.matrix u.grad v.grad + have hlhs_eq : + homogenizationComparisonNegativeBesovLHS Q a a0 s u v = S := by + dsimp [S] + exact + homogenizationComparisonNegativeBesovLHS_eq_solutionComparisonNegativeBesovLhs_publicCoeffField + Q a a0 s u v + have huGrad : MemVectorL2 (cubeSet Q) u.grad := by + simpa using (publicH1ToCubeSet u).grad_memVectorL2 + have hvGrad : MemVectorL2 (cubeSet Q) v.grad := by + simpa using (publicH1ToCubeSet v).grad_memVectorL2 + have hgradDiff : MemVectorL2 (cubeSet Q) (fun x => u.grad x - v.grad x) := + huGrad.sub hvGrad + have hEll0 : + IsEllipticFieldOn a0.lam a0.Lam (cubeSet Q) + (constantCoeffField a0.matrix) := + constantCoeffMatrix_isEllipticFieldOn_constantCoeffField a0 + (measurableSet_cubeSet Q) + have hGc_mem : MemVectorL2 (cubeSet Q) Gc := by + simpa [Gc, constantGradientComparison, constantCoeffField] using! + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hgradDiff + have hfluxA : MemVectorL2 (cubeSet Q) + (fun x => matVecMul (publicCoeffField Q a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) huGrad + have hflux0 : MemVectorL2 (cubeSet Q) + (fun x => matVecMul a0.matrix (v.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hvGrad + have hGf_mem : MemVectorL2 (cubeSet Q) Gf := by + dsimp [Gf, fluxComparison] + exact hfluxA.sub hflux0 + have hGc_lp : + MeasureTheory.MemLp Gc (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hGc_mem + have hGf_lp : + MeasureTheory.MemLp Gf (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hGf_mem + have hS_nonneg : 0 ≤ S := by + dsimp [S, solutionComparisonNegativeBesovLhs, Gc, Gf] + exact add_nonneg + (cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp Q hs Gc hGc_lp) + (cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp Q hs Gf hGf_lp) + have hK_ge_one : 1 ≤ K := by + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast Nat.one_le_iff_ne_zero.mpr (NeZero.ne d) + have hd_nonneg : 0 ≤ (d : ℝ) := by + exact_mod_cast Nat.zero_le d + have hpow_one : + 1 ≤ Real.rpow (3 : ℝ) ((d : ℝ) + s) := by + exact Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) := + mul_le_mul hd_one hpow_one (by norm_num) hd_nonneg + _ = K := by rfl + calc + homogenizationComparisonNegativeBesovLHS Q a a0 s u v + = S := hlhs_eq + _ ≤ K * S := by + calc + S = 1 * S := by ring + _ ≤ K * S := mul_le_mul_of_nonneg_right hK_ge_one hS_nonneg + _ = + (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) * + solutionComparisonNegativeBesovLhs Q s (publicCoeffField Q a) + a0.matrix u.grad v.grad := by + rfl + +theorem localizedHomogenizationFluxDefectAverage_eq_localizedFluxDefectNegativeBesovAverageTwo_publicCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) (j : ℕ) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + localizedHomogenizationFluxDefectAverage Q a a0 s j u = + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad) j := by + let Fpublic : TriadicCube d → ℝ := fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (homogenizationComparisonFluxDefectFromGradient R a a0 u.grad)) ^ 2 + let Finternal : TriadicCube d → ℝ := fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad)) ^ 2 + have havg : descendantsAverage Q j Fpublic = descendantsAverage Q j Finternal := by + unfold descendantsAverage + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + change ((D.card : ℝ)⁻¹) * D.sum Fpublic = + ((D.card : ℝ)⁻¹) * D.sum Finternal + refine congrArg (HMul.hMul _) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hseminorm : + cubeBesovNegativeVectorSeminormTwo R s + (homogenizationComparisonFluxDefectFromGradient R a a0 u.grad) = + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad) := + cubeBesovNegativeVectorSeminormTwo_eq_of_ae_eq_on_cubeSet + (Q := R) + (u := homogenizationComparisonFluxDefectFromGradient R a a0 u.grad) + (v := fluxDefect (publicCoeffField Q a) a0.matrix u.grad) + s + (homogenizationComparisonFluxDefectFromGradient_ae_eq_fluxDefect_parent_publicCoeffField_descendant_cubeSet + (Q := Q) (R := R) (a := a) (a0 := a0) hR u.grad) + simp [Fpublic, Finternal, hseminorm] + simpa [localizedHomogenizationFluxDefectAverage, + localizedFluxDefectNegativeBesovAverageTwo, Fpublic, Finternal] using + congrArg Real.sqrt havg + +theorem scaleNormalizedNegativeBesovVectorNorm_forcedSolutionFluxField_finite_two_eq_cubeBesovNegativeVectorSeminormTwo_publicCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) : + scaleNormalizedNegativeBesovVectorNorm Q s (Ch02.MultiscaleExponent.finite 2) + (forcedSolutionFluxField Q a u) = + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) := by + let F : Vec d → Vec d := + fun x => matVecMul (publicCoeffField Q a x) (forcedSolutionGradientField u x) + have hae : + forcedSolutionFluxField Q a u =ᵐ[volumeMeasureOn (cubeSet Q)] F := by + simpa [F, forcedSolutionGradientField] using + forcedSolutionFluxField_ae_eq_publicCoeffField_cubeSet + (Q := Q) (a := a) u + calc + scaleNormalizedNegativeBesovVectorNorm Q s (Ch02.MultiscaleExponent.finite 2) + (forcedSolutionFluxField Q a u) + = scaleNormalizedNegativeBesovVectorNorm Q s + (Ch02.MultiscaleExponent.finite 2) F := + scaleNormalizedNegativeBesovVectorNorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (F := forcedSolutionFluxField Q a u) (G := F) + s (Ch02.MultiscaleExponent.finite 2) hae + _ = cubeBesovNegativeVectorSeminormTwo Q s F := + scaleNormalizedNegativeBesovVectorNorm_finite_two_eq_cubeBesovNegativeVectorSeminormTwo + Q s F + +theorem scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : ForceBesovRegularity Q s g) : + 0 ≤ scaleNormalizedPositiveBesovVectorSeminormTwo Q s g := by + simpa [scaleNormalizedPositiveBesovVectorSeminormTwo] using + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g + hg.partialSeminorms_bddAbove + + +theorem coarseGrainingHomogenizationErrorAtDepth_publicCoeffField_eq_public + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) (j : ℕ) : + _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth + Q (publicCoeffField Q a) a0.matrix s j = + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := by + unfold _root_.Homogenization.coarseGrainingHomogenizationErrorAtDepth + coarseGrainingHomogenizationErrorAtDepth + rw [Ch02.finsetSupReal_eq_finsetSsup] + apply congrArg sSup + ext y + constructor + · rintro ⟨R, hR, rfl⟩ + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa using hR + exact ⟨R, hR, + (homogenizationErrorOnCube_parent_publicCoeffField_descendant_infinity_one_eq_ch02 + (a := a) hRscale s a0.matrix).symm⟩ + · rintro ⟨R, hR, rfl⟩ + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa using hR + exact ⟨R, hR, + homogenizationErrorOnCube_parent_publicCoeffField_descendant_infinity_one_eq_ch02 + (a := a) hRscale s a0.matrix⟩ + +theorem weakFluxRHSBound_publicCoeffField_le_dim_sq_mul_public + {d : ℕ} [NeZero d] (C : ℝ) (Q : TriadicCube d) + (a : CoeffFamily d) {s : ℝ} {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) (hC : 0 ≤ C) (hs : 0 < s) + (hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) : + C * + (s⁻¹ * + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) * + Real.sqrt (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u))) + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) * + Real.sqrt ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g) ≤ + weakFluxWithRHSRHS (((d : ℝ) ^ 2) * C) Q a s g u := by + let D : ℝ := d + let oldP : ℝ := + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) + let oldL : ℝ := + Real.sqrt ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) + let P : ℝ := poincareUpperEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let L : ℝ := poincareLowerEllipticityFactor Q a (s / 2) + (Ch02.MultiscaleExponent.finite 2) + let E : ℝ := + Real.sqrt (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u))) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + have hs_half : 0 < s / 2 := by positivity + have hP_le : oldP ≤ D * P := by + simpa [D, oldP, P] using + sqrt_LambdaSq_publicCoeffField_finite_two_le_dim_mul_poincareUpperEllipticityFactor + Q a hs_half + have hL_le : oldL ≤ D * L := by + simpa [D, oldL, L] using + sqrt_lambdaSq_publicCoeffField_finite_two_inv_le_dim_mul_poincareLowerEllipticityFactor + Q a hs_half + have hE_eq : E = forcedSolutionEnergyNorm Q a u := by + simpa [E] using + (forcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + (Q := Q) (a := a) u).symm + have hD_one : 1 ≤ D := by + norm_num [D, Nat.one_le_iff_ne_zero, NeZero.ne d] + have hD_nonneg : 0 ≤ D := le_trans zero_le_one hD_one + have hD_le_sq : D ≤ D ^ 2 := by nlinarith [hD_one] + have hDsq_nonneg : 0 ≤ D ^ 2 := sq_nonneg D + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hs_pow_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have holdP_nonneg : 0 ≤ oldP := by simp [oldP] + have holdL_nonneg : 0 ≤ oldL := by simp [oldL] + have hP_nonneg : 0 ≤ P := by + dsimp [P, poincareUpperEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.LambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hL_nonneg : 0 ≤ L := by + dsimp [L, poincareLowerEllipticityFactor] + exact Real.rpow_nonneg + (Ch02.lambdaSq_nonneg (Q := Q) (a := a) + (q := Ch02.MultiscaleExponent.finite 2) hs_half (by norm_num)) _ + have hE_nonneg : 0 ≤ E := by simp [E] + have hterm_energy : + s⁻¹ * oldP * E ≤ D ^ 2 * (s⁻¹ * P * E) := by + calc + s⁻¹ * oldP * E ≤ s⁻¹ * (D * P) * E := by + gcongr + _ = D * (s⁻¹ * P * E) := by ring + _ ≤ D ^ 2 * (s⁻¹ * P * E) := by + exact mul_le_mul_of_nonneg_right hD_le_sq + (mul_nonneg (mul_nonneg hs_inv_nonneg hP_nonneg) hE_nonneg) + have hprod : + oldP * oldL ≤ (D * P) * (D * L) := + mul_le_mul hP_le hL_le holdL_nonneg (mul_nonneg hD_nonneg hP_nonneg) + have hterm_force : + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL * B ≤ + D ^ 2 * + (Real.rpow s (-(5 / 2 : ℝ)) * P * L * B) := by + calc + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL * B = + Real.rpow s (-(5 / 2 : ℝ)) * (oldP * oldL) * B := by ring + _ ≤ + Real.rpow s (-(5 / 2 : ℝ)) * ((D * P) * (D * L)) * B := by + gcongr + _ = + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L * B) := by ring + have hsum : + s⁻¹ * oldP * E + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL * B ≤ + D ^ 2 * + (s⁻¹ * P * E + + Real.rpow s (-(5 / 2 : ℝ)) * P * L * B) := by + calc + s⁻¹ * oldP * E + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL * B ≤ + D ^ 2 * (s⁻¹ * P * E) + + D ^ 2 * (Real.rpow s (-(5 / 2 : ℝ)) * P * L * B) := + add_le_add hterm_energy hterm_force + _ = + D ^ 2 * + (s⁻¹ * P * E + + Real.rpow s (-(5 / 2 : ℝ)) * P * L * B) := by ring + calc + C * + (s⁻¹ * + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) * + Real.sqrt (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u))) + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a)) * + Real.sqrt ((lambdaSq Q (s / 2) (MultiscaleExponent.finite 2) + (publicCoeffField Q a))⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g) + = + C * (s⁻¹ * oldP * E + + Real.rpow s (-(5 / 2 : ℝ)) * oldP * oldL * B) := by + simp [oldP, oldL, E, B] + _ ≤ + C * (D ^ 2 * + (s⁻¹ * P * E + + Real.rpow s (-(5 / 2 : ℝ)) * P * L * B)) := + mul_le_mul_of_nonneg_left hsum hC + _ = + weakFluxWithRHSRHS (((d : ℝ) ^ 2) * C) Q a s g u := by + unfold weakFluxWithRHSRHS + simp [D, P, L, E, B, hE_eq, scaleNormalizedPositiveBesovVectorSeminormTwo] + ring + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/Energy.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/Energy.lean new file mode 100644 index 0000000000..a4fbb7fae5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/Energy.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # Energy -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public energy bridges for Chapter 3 + +This file contains the energy-density and energy-norm identities that convert +public a.e. coefficient data to deterministic pointwise coefficient fields. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +theorem volumeAverage_eq_of_ae_eq {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → ℝ} + (hfg : f =ᵐ[volumeMeasureOn U] g) : + volumeAverage U f = volumeAverage U g := by + unfold volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae hfg + +theorem localizedCoeffEnergyValue_eq_volumeAverage_coefficientEnergyDensity + {d : ℕ} {U : Ch02.Domain d} (V : Set (Vec d)) + (a : Ch02.CoeffOn U) (u : H1Function (U : Set (Vec d))) : + localizedCoeffEnergyValue V a u = + volumeAverage V (coefficientEnergyDensity a.toCoeffField u.grad) := by + rfl + +theorem cubeAverage_coefficientEnergyDensity_publicCoeffField_eq_localizedCoeffEnergyValue + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) u.grad) = + localizedCoeffEnergyValue (openCubeSet Q) (a.coeffOn Q) u := by + have henergy_ae : + coefficientEnergyDensity (publicCoeffField Q a) u.grad + =ᵐ[volumeMeasureOn (openCubeSet Q)] + coefficientEnergyDensity (a.coeffOn Q).toCoeffField u.grad := by + filter_upwards [publicCoeffField_ae_eq_openCubeSet Q a] with x hx + simp [coefficientEnergyDensity, hx] + calc + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) u.grad) + = + volumeAverage (openCubeSet Q) + (coefficientEnergyDensity (publicCoeffField Q a) u.grad) := by + simp [cubeAverage, volumeAverage, volume_openCubeSet_eq_volume_cubeSet, + volume_cubeSet_toReal, setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = + volumeAverage (openCubeSet Q) + (coefficientEnergyDensity (a.coeffOn Q).toCoeffField u.grad) := + volumeAverage_eq_of_ae_eq henergy_ae + _ = + localizedCoeffEnergyValue (openCubeSet Q) (a.coeffOn Q) u := + (localizedCoeffEnergyValue_eq_volumeAverage_coefficientEnergyDensity + (openCubeSet Q) (a.coeffOn Q) u).symm + +theorem h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + h1EnergyNormOnCube Q a u = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u.grad)) := by + rw [h1EnergyNormOnCube, + cubeAverage_coefficientEnergyDensity_publicCoeffField_eq_localizedCoeffEnergyValue] + +theorem forcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) : + forcedSolutionEnergyNorm Q a u = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u))) := by + simpa [forcedSolutionEnergyNorm, forcedSolutionGradientField] using + h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + Q a u.toH1 + +theorem zeroTraceForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {g : Vec d → Vec d} (u : ZeroTraceForcedCubeSolution Q a g) : + zeroTraceForcedSolutionEnergyNorm Q a u = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + u.toH10.toH1Function.grad)) := by + simpa [zeroTraceForcedSolutionEnergyNorm] using + h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + Q a u.toH10.toH1Function + +theorem dirichletForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + dirichletForcedSolutionEnergyNorm Q a u = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad)) := by + simpa [dirichletForcedSolutionEnergyNorm] using + h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + Q a u.toH1 + +theorem neumannForcedSolutionEnergyNorm_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + {d : ℕ} (Q : TriadicCube d) (a : CoeffFamily d) + {g : Vec d → Vec d} (u : NeumannForcedCubeSolution Q a g) : + neumannForcedSolutionEnergyNorm Q a u = + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + u.toH1MeanZero.toH1Function.grad)) := by + simpa [neumannForcedSolutionEnergyNorm] using + h1EnergyNormOnCube_eq_sqrt_cubeAverage_coefficientEnergyDensity_publicCoeffField + Q a u.toH1MeanZero.toH1Function + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Casts.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Casts.lean new file mode 100644 index 0000000000..90f53ca00a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Casts.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # H1Casts -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public H1 domain casts for Chapter 3 + +This file contains small domain-cast helpers used to transport public open-cube +H1, H10, and mean-zero H1 data to the deterministic cube realization. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable def castH1Domain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : H1Function V := + hUV ▸ u + +noncomputable def castH10Domain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : H10Function V := + hUV ▸ u + +@[simp] theorem castH1Domain_grad {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castH1Domain hUV u).grad = u.grad := by + subst V + rfl + +@[simp] theorem castH1Domain_toFun {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castH1Domain hUV u).toFun = u.toFun := by + subst V + rfl + +@[simp] theorem castH10Domain_toH1Function_grad + {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : + (castH10Domain hUV u).toH1Function.grad = u.toH1Function.grad := by + subst V + rfl + +@[simp] theorem castH10Domain_toH1Function_toFun + {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : + (castH10Domain hUV u).toH1Function.toFun = u.toH1Function.toFun := by + subst V + rfl + +noncomputable def castH1MeanZeroDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1MeanZeroFunction U) : H1MeanZeroFunction V := + hUV ▸ u + +@[simp] theorem castH1MeanZeroDomain_toH1Function_grad + {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1MeanZeroFunction U) : + (castH1MeanZeroDomain hUV u).toH1Function.grad = + u.toH1Function.grad := by + subst V + rfl + +@[simp] theorem castH1MeanZeroDomain_toH1Function_toFun + {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1MeanZeroFunction U) : + (castH1MeanZeroDomain hUV u).toH1Function.toFun = + u.toH1Function.toFun := by + subst V + rfl + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Transport.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Transport.lean new file mode 100644 index 0000000000..074ae2e988 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/H1Transport.lean @@ -0,0 +1,536 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Casts +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.Energy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # H1Transport -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public H1 transport bridges for Chapter 3 + +This file transports public H1, H10, mean-zero, and zero-trace data to the +deterministic half-open cube setting used by Chapter 3 engines. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- View a public open-domain `H¹` function as an `H¹` function on the +half-open triadic cube used by the deterministic layer. -/ +noncomputable def publicH1ToCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + H1Function (cubeSet Q) := + (castH1Domain (Ch02.cubeDomain_coe Q) u).toCubeSet + +@[simp] theorem publicH1ToCubeSet_grad {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH1ToCubeSet u).grad = u.grad := by + simp only [publicH1ToCubeSet] + rw [H1Function.grad_toCubeSet] + exact castH1Domain_grad _ u + +@[simp] theorem publicH1ToCubeSet_toFun {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH1ToCubeSet u).toFun = u.toFun := by + simp only [publicH1ToCubeSet] + rw [H1Function.toFun_toCubeSet] + exact castH1Domain_toFun _ u + +theorem publicH1ToCubeSet_grad_memVectorL2_descendant_cubeSet + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) u.grad := by + have hmono : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR) + simpa using (publicH1ToCubeSet u).grad_memVectorL2.mono_measure hmono + +namespace H1MeanZeroFunction + +/-- Promote a mean-zero `H¹` witness on an open triadic cube to the +corresponding half-open cube. -/ +noncomputable def toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1MeanZeroFunction (openCubeSet Q)) : + H1MeanZeroFunction (cubeSet Q) := + { toH1Function := u.toH1Function.toCubeSet + meanZero := by + unfold MeanZeroOn + have hset := setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := u.toH1Function.toFun) + simpa using hset.trans u.meanZero } + +@[simp] theorem toCubeSet_toH1Function_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1MeanZeroFunction (openCubeSet Q)) : + (toCubeSet u).toH1Function.grad = u.toH1Function.grad := by + simp [toCubeSet] + +@[simp] theorem toCubeSet_toH1Function_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1MeanZeroFunction (openCubeSet Q)) : + (toCubeSet u).toH1Function.toFun = u.toH1Function.toFun := by + simp [toCubeSet] + +/-- Restrict a mean-zero `H¹` witness on a half-open triadic cube to its open +realization. -/ +noncomputable def toOpenCubeSet {d : ℕ} {Q : TriadicCube d} + (u : H1MeanZeroFunction (cubeSet Q)) : + H1MeanZeroFunction (openCubeSet Q) := + { toH1Function := u.toH1Function.toOpenCubeSet + meanZero := by + unfold MeanZeroOn + have hset := setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := u.toH1Function.toFun) + simpa using hset.symm.trans u.meanZero } + +@[simp] theorem toOpenCubeSet_toH1Function_grad + {d : ℕ} {Q : TriadicCube d} + (u : H1MeanZeroFunction (cubeSet Q)) : + (toOpenCubeSet u).toH1Function.grad = u.toH1Function.grad := by + simp [toOpenCubeSet] + +@[simp] theorem toOpenCubeSet_toH1Function_toFun + {d : ℕ} {Q : TriadicCube d} + (u : H1MeanZeroFunction (cubeSet Q)) : + (toOpenCubeSet u).toH1Function.toFun = u.toH1Function.toFun := by + simp [toOpenCubeSet] + +end H1MeanZeroFunction + +/-- View a public open-domain mean-zero `H¹` function as a mean-zero `H¹` +function on the half-open triadic cube used by the deterministic layer. -/ +noncomputable def publicH1MeanZeroToCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))) : + H1MeanZeroFunction (cubeSet Q) := + H1MeanZeroFunction.toCubeSet + (castH1MeanZeroDomain (Ch02.cubeDomain_coe Q) u) + +@[simp] theorem publicH1MeanZeroToCubeSet_toH1Function_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH1MeanZeroToCubeSet u).toH1Function.grad = + u.toH1Function.grad := by + simp only [publicH1MeanZeroToCubeSet, H1MeanZeroFunction.toCubeSet] + rw [H1Function.grad_toCubeSet] + exact castH1MeanZeroDomain_toH1Function_grad _ u + +@[simp] theorem publicH1MeanZeroToCubeSet_toH1Function_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH1MeanZeroToCubeSet u).toH1Function.toFun = + u.toH1Function.toFun := by + simp only [publicH1MeanZeroToCubeSet, H1MeanZeroFunction.toCubeSet] + rw [H1Function.toFun_toCubeSet] + exact castH1MeanZeroDomain_toH1Function_toFun _ u + +/-- View a public open-domain `H¹₀` function as an `H¹₀` function on the +half-open triadic cube used by the deterministic layer. -/ +noncomputable def publicH10ToCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H10Function (Ch02.cubeDomain Q : Set (Vec d))) : + H10Function (cubeSet Q) := + (castH10Domain (Ch02.cubeDomain_coe Q) u).toCubeSet + +@[simp] theorem publicH10ToCubeSet_toH1Function_grad {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H10Function (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH10ToCubeSet u).toH1Function.grad = u.toH1Function.grad := by + simp only [publicH10ToCubeSet] + rw [H10Function.toCubeSet_toH1Function_grad] + exact castH10Domain_toH1Function_grad _ u + +@[simp] theorem publicH10ToCubeSet_toH1Function_toFun {d : ℕ} [NeZero d] + {Q : TriadicCube d} + (u : H10Function (Ch02.cubeDomain Q : Set (Vec d))) : + (publicH10ToCubeSet u).toH1Function.toFun = u.toH1Function.toFun := by + simp only [publicH10ToCubeSet] + rw [H10Function.toCubeSet_toH1Function_toFun] + exact castH10Domain_toH1Function_toFun _ u + +theorem publicH10ToCubeSet_toH1Function_grad_memVectorL2_descendant_cubeSet + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (u : H10Function (Ch02.cubeDomain Q : Set (Vec d))) + (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) u.toH1Function.grad := by + have hmono : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR) + simpa using + (publicH10ToCubeSet u).toH1Function.grad_memVectorL2.mono_measure hmono + +/-- Chosen public zero-trace representative for the Dirichlet boundary +condition `v - h ∈ H¹₀(Q)`. -/ +noncomputable def DirichletForcedCubeSolution.zeroTraceDifferenceH10 + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} {g : Vec d → Vec d} + (u : DirichletForcedCubeSolution Q a g) : + H10Function (Ch02.cubeDomain Q : Set (Vec d)) := + Classical.choose u.zeroTraceDifference + +theorem DirichletForcedCubeSolution.zeroTraceDifferenceH10_toFun_ae_eq + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} {g : Vec d → Vec d} + (u : DirichletForcedCubeSolution Q a g) : + u.zeroTraceDifferenceH10.toH1Function.toFun + =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => u.toH1.toFun x - u.boundaryData.toFun x := + Classical.choose_spec u.zeroTraceDifference + +/-- The chosen public zero-trace representative, transported to the +deterministic half-open cube. -/ +noncomputable def DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + H10Function (cubeSet Q) := + publicH10ToCubeSet u.zeroTraceDifferenceH10 + +@[simp] theorem DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + u.zeroTraceDifferenceH10CubeSet.toH1Function.grad = + u.zeroTraceDifferenceH10.toH1Function.grad := by + simp [DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet] + +@[simp] theorem DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet_toFun + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + u.zeroTraceDifferenceH10CubeSet.toH1Function.toFun = + u.zeroTraceDifferenceH10.toH1Function.toFun := by + simp [DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet] + +/-- Zero-trace public test functions provide the deterministic +zero-trace-potential predicate on the corresponding half-open cube. -/ +theorem isPotentialZeroTraceOn_cubeSet_of_publicH10Function + {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (Ch02.cubeDomain Q : Set (Vec d))) : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1Function.grad x) := by + simpa using (publicH10ToCubeSet u).isPotentialZeroTraceOn + +theorem ZeroTraceForcedCubeSolution.isPotentialZeroTraceOn_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : ZeroTraceForcedCubeSolution Q a g) : + IsPotentialZeroTraceOn (cubeSet Q) + (fun x => u.toH10.toH1Function.grad x) := + isPotentialZeroTraceOn_cubeSet_of_publicH10Function u.toH10 + +namespace HasWeakPartialDerivOn + +/-- Weak partial derivatives are unique even when the underlying scalar +representatives agree only a.e. on the open domain. -/ +theorem ae_eq_of_toFun_ae_eq {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {i : Fin d} {u v gi hi : Vec d → ℝ} + (huv : u =ᵐ[MeasureTheory.volume.restrict U] v) + (hgiLoc : MeasureTheory.LocallyIntegrableOn gi U MeasureTheory.volume) + (hhiLoc : MeasureTheory.LocallyIntegrableOn hi U MeasureTheory.volume) + (hgi : HasWeakPartialDerivOn U i u gi) + (hhi : HasWeakPartialDerivOn U i v hi) : + gi =ᵐ[MeasureTheory.volume.restrict U] hi := by + refine HasWeakPartialDerivOn.ae_eq hU hgiLoc hhiLoc hgi ?_ + intro φ hφ_smooth hφ_compact hφ_sub + calc + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae <| + huv.mono fun x hx => by simp [hx] + _ = -∫ x in U, hi x * φ x ∂MeasureTheory.volume := + hhi φ hφ_smooth hφ_compact hφ_sub + +end HasWeakPartialDerivOn + +namespace H1Function + +/-- On an open domain, two `H¹` representatives with a.e.-equal values have +a.e.-equal weak gradients. -/ +theorem grad_ae_eq_of_toFun_ae_eq {d : ℕ} {U : Set (Vec d)} + (hU : IsOpen U) {u v : H1Function U} + (huv : u.toFun =ᵐ[MeasureTheory.volume.restrict U] v.toFun) : + u.grad =ᵐ[MeasureTheory.volume.restrict U] v.grad := by + have hcoord : + ∀ i : Fin d, + (fun x => u.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => v.grad x i := by + intro i + exact + HasWeakPartialDerivOn.ae_eq_of_toFun_ae_eq hU huv + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((u.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2))) + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((v.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2))) + (u.hasWeakGradient i) (v.hasWeakGradient i) + have hall : + ∀ᵐ x ∂MeasureTheory.volume.restrict U, + ∀ i : Fin d, u.grad x i = v.grad x i := + MeasureTheory.ae_all_iff.mpr hcoord + filter_upwards [hall] with x hx + ext i + exact hx i + +end H1Function + +theorem DirichletForcedCubeSolution.zeroTraceDifferenceH10CubeSet_grad_ae_eq + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + u.zeroTraceDifferenceH10CubeSet.toH1Function.grad + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => u.toH1.grad x - u.boundaryData.grad x := by + let wOpen : H10Function (openCubeSet Q) := + castH10Domain (Ch02.cubeDomain_coe Q) u.zeroTraceDifferenceH10 + let zOpen : H1Function (openCubeSet Q) := + castH1Domain (Ch02.cubeDomain_coe Q) (u.toH1 - u.boundaryData) + have hwOpen : + wOpen.toH1Function.toFun =ᵐ[volumeMeasureOn (openCubeSet Q)] + zOpen.toFun := by + show (castH10Domain (Ch02.cubeDomain_coe Q) u.zeroTraceDifferenceH10).toH1Function.toFun + =ᵐ[volumeMeasureOn (openCubeSet Q)] + (castH1Domain (Ch02.cubeDomain_coe Q) (u.toH1 - u.boundaryData)).toFun + rw [castH10Domain_toH1Function_toFun, castH1Domain_toFun, H1Function.sub_toFun, + ← Ch02.cubeDomain_coe Q] + exact u.zeroTraceDifferenceH10_toFun_ae_eq + have hgradOpen : + wOpen.toH1Function.grad =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => u.toH1.grad x - u.boundaryData.grad x := by + have h := + H1Function.grad_ae_eq_of_toFun_ae_eq + (isOpen_openCubeSet Q) (u := wOpen.toH1Function) + (v := zOpen) hwOpen + have ez : zOpen.grad = fun x => u.toH1.grad x - u.boundaryData.grad x := by + show (castH1Domain (Ch02.cubeDomain_coe Q) (u.toH1 - u.boundaryData)).grad = + fun x => u.toH1.grad x - u.boundaryData.grad x + rw [castH1Domain_grad, H1Function.sub_grad] + rw [ez] at h + exact h + have efun : u.zeroTraceDifferenceH10CubeSet.toH1Function.grad = wOpen.toH1Function.grad := by + show (publicH10ToCubeSet u.zeroTraceDifferenceH10).toH1Function.grad = + (castH10Domain (Ch02.cubeDomain_coe Q) u.zeroTraceDifferenceH10).toH1Function.grad + rw [publicH10ToCubeSet_toH1Function_grad, castH10Domain_toH1Function_grad] + have hmeas : volumeMeasureOn (cubeSet Q) = volumeMeasureOn (openCubeSet Q) := + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + rw [efun, hmeas] + exact hgradOpen + +/-- Coefficient-energy split for a public Dirichlet solution: +`∇v = ∇(v - h) + ∇h` on the deterministic cube, with the zero-trace +representative chosen from the public boundary condition. -/ +theorem DirichletForcedCubeSolution.cubeAverage_energy_le_two_mul_zeroTraceDifference_add_boundary + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : DirichletForcedCubeSolution Q a g) : + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad) ≤ + 2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => u.zeroTraceDifferenceH10CubeSet.toH1Function.grad x)) + + 2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField u)) := by + let A : CoeffField d := publicCoeffField Q a + let zgrad : Vec d → Vec d := + fun x => u.zeroTraceDifferenceH10CubeSet.toH1Function.grad x + let hgrad : Vec d → Vec d := dirichletBoundaryGradientField u + let hgradNeg : Vec d → Vec d := (-1 : ℝ) • hgrad + have hEll : IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam (cubeSet Q) A := + publicCoeffField_isEllipticFieldOn_cubeSet Q a + have hu_mem : MemVectorL2 (cubeSet Q) u.toH1.grad := by + simpa [publicH1ToCubeSet_grad] using (publicH1ToCubeSet u.toH1).grad_memVectorL2 + have hz_mem : MemVectorL2 (cubeSet Q) zgrad := by + simpa [zgrad] using u.zeroTraceDifferenceH10CubeSet.toH1Function.grad_memVectorL2 + have hh_mem : MemVectorL2 (cubeSet Q) hgrad := by + simpa [hgrad, dirichletBoundaryGradientField, publicH1ToCubeSet_grad] using + (publicH1ToCubeSet u.boundaryData).grad_memVectorL2 + have hhn_mem : MemVectorL2 (cubeSet Q) hgradNeg := by + change MemVectorL2 (cubeSet Q) ((-1 : ℝ) • hgrad) + exact hh_mem.const_smul (-1) + have huEnergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A u.toH1.grad) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hu_mem + have hzEnergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A zgrad) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hz_mem + have hhnEnergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity A hgradNeg) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hhn_mem + have hmem : + ∀ᵐ x ∂volumeMeasureOn (cubeSet Q), x ∈ cubeSet Q := + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 + (Filter.Eventually.of_forall fun _ hx => hx) + have hgrad_ae : + zgrad =ᵐ[volumeMeasureOn (cubeSet Q)] fun x => u.toH1.grad x - hgrad x := by + simpa [zgrad, hgrad, dirichletBoundaryGradientField] using + u.zeroTraceDifferenceH10CubeSet_grad_ae_eq + have hpoint : + ∀ᵐ x ∂volumeMeasureOn (cubeSet Q), + coefficientEnergyDensity A u.toH1.grad x ≤ + 2 * (coefficientEnergyDensity A zgrad x + + coefficientEnergyDensity A hgradNeg x) := by + filter_upwards [hmem, hgrad_ae] with x hx hz + have hleft : + coefficientEnergyDensity A u.toH1.grad x = + coefficientEnergyDensity A (fun y => zgrad y - hgradNeg y) x := by + have hvec : u.toH1.grad x = zgrad x - hgradNeg x := by + rw [hz] + simp [hgradNeg] + unfold coefficientEnergyDensity + rw [hvec] + exact hleft.trans_le + (coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + hEll zgrad hgradNeg x hx) + have havg_raw : + cubeAverage Q (coefficientEnergyDensity A u.toH1.grad) ≤ + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A zgrad x + + coefficientEnergyDensity A hgradNeg x)) := by + unfold cubeAverage + have hvol_inv_nonneg : 0 ≤ (cubeVolume Q)⁻¹ := + inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q)) + refine mul_le_mul_of_nonneg_left ?_ hvol_inv_nonneg + exact + MeasureTheory.integral_mono_ae huEnergy_int + ((hzEnergy_int.add hhnEnergy_int).const_mul (2 : ℝ)) hpoint + have hsplit : + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A zgrad x + + coefficientEnergyDensity A hgradNeg x)) = + 2 * cubeAverage Q (coefficientEnergyDensity A zgrad) + + 2 * cubeAverage Q (coefficientEnergyDensity A hgradNeg) := by + unfold cubeAverage + have hfun : + (fun x => 2 * (coefficientEnergyDensity A zgrad x + + coefficientEnergyDensity A hgradNeg x)) = + fun x => 2 * coefficientEnergyDensity A zgrad x + + 2 * coefficientEnergyDensity A hgradNeg x := by + funext x + ring + rw [hfun, MeasureTheory.integral_add (hzEnergy_int.const_mul (2 : ℝ)) + (hhnEnergy_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + have hneg_avg : + cubeAverage Q (coefficientEnergyDensity A hgradNeg) = + cubeAverage Q (coefficientEnergyDensity A hgrad) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x _hx + unfold coefficientEnergyDensity + simp [hgradNeg, matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + calc + cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) u.toH1.grad) + ≤ + cubeAverage Q + (fun x => 2 * (coefficientEnergyDensity A zgrad x + + coefficientEnergyDensity A hgradNeg x)) := by + simpa [A] using havg_raw + _ = + 2 * cubeAverage Q (coefficientEnergyDensity A zgrad) + + 2 * cubeAverage Q (coefficientEnergyDensity A hgradNeg) := hsplit + _ = + 2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (fun x => u.zeroTraceDifferenceH10CubeSet.toH1Function.grad x)) + + 2 * cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (dirichletBoundaryGradientField u)) := by + rw [hneg_avg] + +/-- The public value-level zero-trace difference `u - v ∈ H¹₀` supplies the +deterministic zero-trace-potential predicate for the gradient difference. -/ +theorem isPotentialZeroTraceOn_cubeSet_of_public_zeroTraceDifference + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + (hzero : + ∃ w : H10Function (Ch02.cubeDomain Q : Set (Vec d)), + w.toH1Function.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => u.toFun x - v.toFun x) : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x) := by + rcases hzero with ⟨w, hw⟩ + let wOpen : H10Function (openCubeSet Q) := + castH10Domain (Ch02.cubeDomain_coe Q) w + let zOpen : H1Function (openCubeSet Q) := + castH1Domain (Ch02.cubeDomain_coe Q) (u - v) + have hwOpen : + wOpen.toH1Function.toFun =ᵐ[volumeMeasureOn (openCubeSet Q)] + zOpen.toFun := by + show (castH10Domain (Ch02.cubeDomain_coe Q) w).toH1Function.toFun + =ᵐ[volumeMeasureOn (openCubeSet Q)] + (castH1Domain (Ch02.cubeDomain_coe Q) (u - v)).toFun + rw [castH10Domain_toH1Function_toFun, castH1Domain_toFun, H1Function.sub_toFun, + ← Ch02.cubeDomain_coe Q] + exact hw + have hgradOpen : + wOpen.toH1Function.grad =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => u.grad x - v.grad x := by + have h := + H1Function.grad_ae_eq_of_toFun_ae_eq + (isOpen_openCubeSet Q) (u := wOpen.toH1Function) + (v := zOpen) hwOpen + have ez : zOpen.grad = fun x => u.grad x - v.grad x := by + show (castH1Domain (Ch02.cubeDomain_coe Q) (u - v)).grad = + fun x => u.grad x - v.grad x + rw [castH1Domain_grad, H1Function.sub_grad] + rw [ez] at h + exact h + exact + isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet + (IsPotentialZeroTraceOn.congr_ae hgradOpen + wOpen.isPotentialZeroTraceOn) + +theorem HomogenizationComparisonDatum.isPotentialZeroTraceOn_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} + (w : HomogenizationComparisonDatum Q a a0) : + IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.u.grad x - w.v.grad x) := + isPotentialZeroTraceOn_cubeSet_of_public_zeroTraceDifference + (Q := Q) (u := w.u) (v := w.v) w.zeroTraceDifference + +theorem CoarseGrainingComparisonDatum.isPotentialZeroTraceOn_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {g : Vec d → Vec d} + (w : CoarseGrainingComparisonDatum Q a a0 g) : + IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.u.grad x - w.v.grad x) := + isPotentialZeroTraceOn_cubeSet_of_public_zeroTraceDifference + (Q := Q) (u := w.u) (v := w.v) w.zeroTraceDifference + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutionConstructors.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutionConstructors.lean new file mode 100644 index 0000000000..7b8d6531c7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutionConstructors.lean @@ -0,0 +1,226 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.WeakSolutions + +/-! # Weak Solution Constructors -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public weak-solution constructor bridges + +This file contains terminal constructor bridges built from the public +weak-solution conversion lemmas. + +## Audit tag + +Claim: construct the public-coefficient corrector data and homogenization +comparison-pair witnesses used by the Chapter 3 endpoint theorem packages. + +Downstream target: Ch3 public aggregate imports. This file is constructor +plumbing only and introduces no public `*Theory` package. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal +open ZeroTraceDirichletCorrectorData + +noncomputable def neumannForcedSolutionMeanZeroCorrectorData_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (w : NeumannForcedCubeSolution Q a g) : + MeanZeroNeumannCorrectorData Q (publicCoeffField Q a) + (fun x => g x - cubeAverageVec Q g) where + toH1MeanZero := publicH1MeanZeroToCubeSet w.toH1MeanZero + weakSolution := + isMeanZeroNeumannRhsWeakSolution_publicCoeffField_cubeSet_of_neumannForcedCubeSolution + w + +@[simp] theorem neumannForcedSolutionMeanZeroCorrectorData_publicCoeffField_grad + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (w : NeumannForcedCubeSolution Q a g) : + (neumannForcedSolutionMeanZeroCorrectorData_publicCoeffField w).toH1MeanZero.toH1Function.grad = + w.toH1MeanZero.toH1Function.grad := by + simp [neumannForcedSolutionMeanZeroCorrectorData_publicCoeffField] + +theorem forcedSolutionGradientField_coarsePoincareRHSSn_le_expanded_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hs : 0 < s) (hs_le : s ≤ 1) + (hg : ForceBesovRegularity Q s g) (m : ℕ) : + coarsePoincareRHSSn Q s (forcedSolutionGradientField u) m ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u.toH1) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution + have hdet := + _root_.Homogenization.coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := publicCoeffField Q a) (g := g) + (u := (publicH1ToCubeSet u.toH1).grad) (s := s) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hs_le (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicH1ToCubeSet u.toH1).isPotentialOn + (hweak.residual_solenoidal + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (memVectorL2_cubeSet_of_forceBesovRegularity hg)) + hg.memLp hg.partialSeminorms_bddAbove m + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using hdet + +theorem isH1DirichletRhsWeakSolutionOn_constantCoeff_cubeSet_of_isConstantCoeffForcedEquation + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a0 : ConstantCoeffMatrix d} + {u : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsConstantCoeffForcedEquation Q a0 u g) : + IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0.matrix) (cubeSet Q) + (publicH1ToCubeSet u) g := by + have hopen : + IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0.matrix) + (openCubeSet Q) (castH1Domain (Ch02.cubeDomain_coe Q) u) g := by + simpa [Ch02.cubeDomain_coe] using! + isH1DirichletRhsWeakSolutionOn_constantCoeff_of_isConstantCoeffForcedEquation + (Q := Q) (a0 := a0) (u := u) (g := g) h + simpa [publicH1ToCubeSet] using + isH1DirichletRhsWeakSolutionOn_cubeSet_of_openCubeSet + (Q := Q) (a := constantCoeffField a0.matrix) + (u := castH1Domain (Ch02.cubeDomain_coe Q) u) (g := g) hopen + +theorem isZeroTraceDirichletRhsWeakSolution_publicCoeffField_cubeSet_of_zeroTraceForcedCubeSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (u : ZeroTraceForcedCubeSolution Q a g) : + IsZeroTraceDirichletRhsWeakSolution (publicCoeffField Q a) (cubeSet Q) + (publicH10ToCubeSet u.toH10) g := by + have hopen : + IsZeroTraceDirichletRhsWeakSolution (publicCoeffField Q a) + (openCubeSet Q) (castH10Domain (Ch02.cubeDomain_coe Q) u.toH10) g := by + simpa [Ch02.cubeDomain_coe] using! + isZeroTraceDirichletRhsWeakSolution_publicCoeffField_of_zeroTraceForcedCubeSolution + (Q := Q) (a := a) (g := g) u + simpa [publicH10ToCubeSet] using + isZeroTraceDirichletRhsWeakSolution_cubeSet_of_openCubeSet + (Q := Q) (a := publicCoeffField Q a) + (u := castH10Domain (Ch02.cubeDomain_coe Q) u.toH10) (g := g) hopen + +/-- Canonical public-coefficient zero-trace RHS corrector on the half-open +cube. This is the public Chapter 3 bridge for the auxiliary zero-boundary +solution `v₀` used in the Dirichlet energy argument. -/ +noncomputable def zeroTraceDirichletCorrectorData_publicCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {g : Vec d → Vec d} (hg : MemVectorL2 (cubeSet Q) g) : + ZeroTraceDirichletCorrectorData Q (publicCoeffField Q a) g := + zeroTraceDirichletCorrectorDataOf_isEllipticFieldOn_cubeSet + (Q := Q) (a := publicCoeffField Q a) (g := g) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hg (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + +theorem isHomogenizationComparisonPairOn_publicCoeffField_cubeSet_of_public_comparison + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} + (w : HomogenizationComparisonDatum Q a a0) + (hzero : + IsPotentialZeroTraceOn (cubeSet Q) + (fun x => w.u.grad x - w.v.grad x)) : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) a0.matrix + (publicH1ToCubeSet w.u).grad (publicH1ToCubeSet w.v).grad := by + have hsolOpenOriginal : + IsSolenoidalOn (openCubeSet Q) + (homogenizationComparisonFluxField Q a a0 w.u w.v) := by + simpa [Ch02.cubeDomain_coe] using w.fluxComparisonSolenoidal + have hfluxAE : + homogenizationComparisonFluxField Q a a0 w.u w.v + =ᵐ[volumeMeasureOn (openCubeSet Q)] + fluxComparison (publicCoeffField Q a) a0.matrix w.u.grad w.v.grad := by + filter_upwards [publicCoeffField_ae_eq_openCubeSet Q a] with x hx + ext i + simp [homogenizationComparisonFluxField, fluxComparison, hx] + have hsolOpen : + IsSolenoidalOn (openCubeSet Q) + (fluxComparison (publicCoeffField Q a) a0.matrix w.u.grad w.v.grad) := + IsSolenoidalOn.congr_ae hfluxAE hsolOpenOriginal + have hsolCube : + IsSolenoidalOn (cubeSet Q) + (fluxComparison (publicCoeffField Q a) a0.matrix w.u.grad w.v.grad) := + isSolenoidalOn_cubeSet_triadicCube_of_openCubeSet hsolOpen + constructor + · simpa using hsolCube + · simpa using hzero + +theorem HomogenizationComparisonDatum.isHomogenizationComparisonPairOn_publicCoeffField_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} + (w : HomogenizationComparisonDatum Q a a0) : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) a0.matrix + (publicH1ToCubeSet w.u).grad (publicH1ToCubeSet w.v).grad := + isHomogenizationComparisonPairOn_publicCoeffField_cubeSet_of_public_comparison + (Q := Q) (a := a) (a0 := a0) w + w.isPotentialZeroTraceOn_cubeSet + +theorem isHomogenizationComparisonPairOn_publicCoeffField_cubeSet_of_same_public_forcedEquations + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} + {u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (hu : IsForcedEquation Q a u g) + (hv : IsConstantCoeffForcedEquation Q a0 v g) + (hzero : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) a0.matrix + (publicH1ToCubeSet u).grad (publicH1ToCubeSet v).grad := by + have huWeak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u) (g := g) hu + have hvWeak : + IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0.matrix) (cubeSet Q) + (publicH1ToCubeSet v) g := + isH1DirichletRhsWeakSolutionOn_constantCoeff_cubeSet_of_isConstantCoeffForcedEquation + (Q := Q) (a0 := a0) (u := v) (g := g) hv + exact + IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + (hEll := publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (ha0 := a0.elliptic) + (u := publicH1ToCubeSet u) (v := publicH1ToCubeSet v) + (g := g) huWeak hvWeak (by simpa using hzero) + +theorem CoarseGrainingComparisonDatum.isHomogenizationComparisonPairOn_publicCoeffField_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {g : Vec d → Vec d} + (w : CoarseGrainingComparisonDatum Q a a0 g) : + IsHomogenizationComparisonPairOn (cubeSet Q) + (publicCoeffField Q a) a0.matrix + (publicH1ToCubeSet w.u).grad (publicH1ToCubeSet w.v).grad := + isHomogenizationComparisonPairOn_publicCoeffField_cubeSet_of_same_public_forcedEquations + (Q := Q) (a := a) (a0 := a0) (u := w.u) (v := w.v) (g := g) + w.uWeakSolution w.vWeakSolution w.isPotentialZeroTraceOn_cubeSet + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutions.lean new file mode 100644 index 0000000000..cd91bec834 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/PublicInternalBridges/WeakSolutions.lean @@ -0,0 +1,816 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Transport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.CoeffField +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # Weak Solutions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Public weak-solution bridges for Chapter 3 + +This file contains forced-solution, flux-field, weak-solution, and comparison-pair +bridges from the public Chapter 3 data to the deterministic cube APIs. +-/ + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal +open ZeroTraceDirichletCorrectorData + +theorem forcedSolutionGradientField_memVectorL2_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) : + MemVectorL2 (cubeSet Q) (forcedSolutionGradientField u) := by + simpa [forcedSolutionGradientField] using + (publicH1ToCubeSet u.toH1).grad_memVectorL2 + +theorem forcedSolutionGradientField_memVectorL2_descendant_cubeSet + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) (forcedSolutionGradientField u) := by + have hmono : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR) + exact (forcedSolutionGradientField_memVectorL2_cubeSet u).mono_measure hmono + +theorem forcedSolutionGradientField_negativeBesovPartialSeminormTwo_bddAbove + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (forcedSolutionGradientField u)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (forcedSolutionGradientField u) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + (forcedSolutionGradientField_memVectorL2_cubeSet u)) + +theorem forcedSolutionGradientField_descendant_negativeBesovPartialSeminormTwo_bddAbove + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) + (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (forcedSolutionGradientField u)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (forcedSolutionGradientField u) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + (forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR)) + +/-- Harmonic `H¹` gradients automatically have bounded finite negative-Besov +partials on their cube. -/ +theorem AHarmonicFunction.grad_negativeBesovPartialSeminormTwo_bddAbove + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {s : ℝ} + (w : AHarmonicFunction a (cubeSet Q)) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => w.toH1.grad x) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + w.toH1.grad_memVectorL2) + +theorem forcedSolutionPublicFlux_memVectorL2_descendant_cubeSet + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + (forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR) + +theorem forcedSolutionPublicFlux_memLp_normalizedCubeMeasure_descendant + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) : + MeasureTheory.MemLp + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) + (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + (forcedSolutionPublicFlux_memVectorL2_descendant_cubeSet u hR) + +theorem forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_descendant + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) + (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) + (forcedSolutionPublicFlux_memLp_normalizedCubeMeasure_descendant u hR) + +theorem forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_child + {d : ℕ} [NeZero d] {Q R S : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {j : ℕ} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hR : R ∈ descendantsAtDepth Q j) + (hS : S ∈ descendantsAtDepth R 1) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) := + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_descendant + (Q := Q) (R := S) (a := a) (g := g) u + (mem_descendantsAtDepth_add hR hS) hs + +theorem publicH1_fluxDefect_memVectorL2_descendant_cubeSet + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {j : ℕ} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (hR : R ∈ descendantsAtDepth Q j) : + MemVectorL2 (cubeSet R) + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad) := by + have hgrad : MemVectorL2 (cubeSet R) u.grad := + publicH1ToCubeSet_grad_memVectorL2_descendant_cubeSet u hR + have hA : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (publicCoeffField Q a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) hgrad + have hEll0 : + IsEllipticFieldOn a0.lam a0.Lam (cubeSet R) + (constantCoeffField a0.matrix) := + constantCoeffMatrix_isEllipticFieldOn_constantCoeffField a0 + (measurableSet_cubeSet R) + have hA0 : + MemVectorL2 (cubeSet R) (fun x => matVecMul a0.matrix (u.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hgrad + simpa [fluxDefect] using! hA.sub hA0 + +theorem publicH1_fluxDefect_negativeBesovPartialSeminormTwo_bddAbove_descendant + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {j : ℕ} {s : ℝ} + (u : H1Function (Ch02.cubeDomain Q : Set (Vec d))) + (hR : R ∈ descendantsAtDepth Q j) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fluxDefect (publicCoeffField Q a) a0.matrix u.grad) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + (publicH1_fluxDefect_memVectorL2_descendant_cubeSet + (Q := Q) (a := a) (a0 := a0) u hR)) + +theorem CoarseGrainingComparisonDatum.fluxDefect_negativeBesovPartialSeminormTwo_bddAbove_descendant + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {g : Vec d → Vec d} {j : ℕ} {s : ℝ} + (w : CoarseGrainingComparisonDatum Q a a0 g) + (hR : R ∈ descendantsAtDepth Q j) (hs : 0 < s) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad)) := + publicH1_fluxDefect_negativeBesovPartialSeminormTwo_bddAbove_descendant + (Q := Q) (a := a) (a0 := a0) w.u hR hs + +namespace IsH1DirichletRhsWeakSolutionOn + +theorem of_residual_solenoidal + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {u : H1Function U} {g : Vec d → Vec d} + (hflux : MemVectorL2 U (fun x => matVecMul (a x) (u.grad x))) + (hg : MemVectorL2 U g) + (hsol : IsSolenoidalOn U (fun x => matVecMul (a x) (u.grad x) - g x)) : + IsH1DirichletRhsWeakSolutionOn a U u g := by + intro φ + have hflux_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.grad x)) + (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hflux φ.toH1Function.grad_memVectorL2 + have hg_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (g x) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hg φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => vecDot (matVecMul (a x) (u.grad x) - g x) + (φ.toH1Function.grad x)) = + fun x => + vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) - + vecDot (g x) (φ.toH1Function.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have h := hsol φ + rw [hfun, MeasureTheory.integral_sub hflux_int hg_int] at h + exact sub_eq_zero.mp h + +theorem restrict_cubeSet_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + {a : CoeffField d} {u : H1Function (cubeSet Q)} {g : Vec d → Vec d} + {lam Lam : ℝ} + (h : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) + (hR : R ∈ descendantsAtDepth Q j) : + IsH1DirichletRhsWeakSolutionOn a (cubeSet R) + ((u.toOpenCubeSet.restrictToOpenSubcube hR).toCubeSet) g := by + let uR : H1Function (cubeSet R) := + (u.toOpenCubeSet.restrictToOpenSubcube hR).toCubeSet + change IsH1DirichletRhsWeakSolutionOn a (cubeSet R) uR g + have hsubset : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR + have hu_grad_memR : MemVectorL2 (cubeSet R) u.grad := by + simpa [MemVectorL2, volumeMeasureOn] using + u.grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hsubset) + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) hsubset + have hfluxR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEllR hu_grad_memR + have hgR : MemVectorL2 (cubeSet R) g := + hg.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hsubset) + have hresQ : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (u.grad x) - g x) := + h.residual_solenoidal hEll hg + have hresMemR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u.grad x) - g x) := + hfluxR.sub hgR + have hresR : + IsSolenoidalOn (cubeSet R) + (fun x => matVecMul (a x) (u.grad x) - g x) := + IsSolenoidalOn.restrict_cubeSet_of_mem_descendantsAtDepth hresQ hR hresMemR + exact of_residual_solenoidal + (by simpa [uR] using hfluxR) hgR + (by simpa [uR] using hresR) + +end IsH1DirichletRhsWeakSolutionOn + +theorem weakFluxRHSScaledAveragedSeminormSq_bddAbove_publicCoeffField_forcedSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hs : 0 < s) : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q (publicCoeffField Q a) s + (forcedSolutionGradientField u) n) := by + have hQ : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hflux : + MeasureTheory.MemLp + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) + (2 : ENNReal) (normalizedCubeMeasure Q) := + forcedSolutionPublicFlux_memLp_normalizedCubeMeasure_descendant + (Q := Q) (R := Q) u hQ + simpa [weakFluxRHSScaledAveragedSeminormSq, weakFluxRHSAveragedSeminormSq, + coarsePoincareRHSSn, coarsePoincareRHSRn] using + coarsePoincareRHSSn_bddAbove_of_memLp Q hs + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) hflux + +theorem forcedSolutionFluxField_ae_eq_publicCoeffField_cubeSet + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) : + forcedSolutionFluxField Q a u =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => matVecMul (publicCoeffField Q a x) (u.toH1.grad x) := by + filter_upwards [(publicCoeffField_ae_eq_cubeSet Q a).symm] with x hx + ext i + simp [forcedSolutionFluxField, hx] + +theorem forcedSolutionFluxDefectField_ae_eq_fluxDefect_publicCoeffField_cubeSet + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {g : Vec d → Vec d} + (u : ForcedCubeSolution Q a g) : + forcedSolutionFluxDefectField Q a a0 u + =ᵐ[volumeMeasureOn (cubeSet Q)] + fluxDefect (publicCoeffField Q a) a0.matrix u.toH1.grad := by + filter_upwards [(publicCoeffField_ae_eq_cubeSet Q a).symm] with x hx + ext i + simp [forcedSolutionFluxDefectField, fluxDefect, hx, sub_eq_add_neg, + add_matVecMul, neg_matVecMul] + +theorem homogenizationComparisonFluxDefectFromGradient_ae_eq_fluxDefect_publicCoeffField_cubeSet + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} (G : Vec d → Vec d) : + homogenizationComparisonFluxDefectFromGradient Q a a0 G + =ᵐ[volumeMeasureOn (cubeSet Q)] + fluxDefect (publicCoeffField Q a) a0.matrix G := by + filter_upwards [(publicCoeffField_ae_eq_cubeSet Q a).symm] with x hx + ext i + simp [homogenizationComparisonFluxDefectFromGradient, fluxDefect, hx, + sub_eq_add_neg, add_matVecMul, neg_matVecMul] + +theorem homogenizationComparisonFluxDefectFromGradient_ae_eq_fluxDefect_parent_publicCoeffField_descendant_cubeSet + {d : ℕ} {Q R : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (G : Vec d → Vec d) : + homogenizationComparisonFluxDefectFromGradient R a a0 G + =ᵐ[volumeMeasureOn (cubeSet R)] + fluxDefect (publicCoeffField Q a) a0.matrix G := by + filter_upwards [(publicCoeffField_ae_eq_descendant_cubeSet Q a hR).symm] + with x hx + ext i + simp [homogenizationComparisonFluxDefectFromGradient, fluxDefect, hx, + sub_eq_add_neg, add_matVecMul, neg_matVecMul] + +theorem homogenizationComparisonFluxField_ae_eq_fluxComparison_publicCoeffField_cubeSet + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + homogenizationComparisonFluxField Q a a0 u v + =ᵐ[volumeMeasureOn (cubeSet Q)] + fluxComparison (publicCoeffField Q a) a0.matrix u.grad v.grad := by + filter_upwards [(publicCoeffField_ae_eq_cubeSet Q a).symm] with x hx + ext i + simp [homogenizationComparisonFluxField, fluxComparison, hx] + +theorem homogenizationComparisonConstantGradientField_eq_constantGradientComparison + {d : ℕ} {Q : TriadicCube d} {a0 : ConstantCoeffMatrix d} + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : + homogenizationComparisonConstantGradientField a0 u v = + constantGradientComparison a0.matrix u.grad v.grad := by + rfl + +/-- A zero-trace potential on the public open cube can be moved to `cubeSet` +after changing representatives a.e. on the open cube. -/ +theorem isPotentialZeroTraceOn_cubeSet_of_openCubeSet_ae + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {f g : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet Q) f) + (hfg : f =ᵐ[volumeMeasureOn (openCubeSet Q)] g) : + IsPotentialZeroTraceOn (cubeSet Q) g := + isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet + (IsPotentialZeroTraceOn.congr_ae hfg hf) + +namespace IsSolenoidalOn + +/-- The solenoidal predicate is insensitive to a.e. changes of the vector field +on the test domain. -/ +theorem congr_ae {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} + (hfg : f =ᵐ[volumeMeasureOn U] g) + (hf : IsSolenoidalOn U f) : + IsSolenoidalOn U g := by + intro φ + calc + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (f x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae <| + hfg.mono fun x hx => by simp [hx] + _ = 0 := hf φ + +end IsSolenoidalOn + +theorem isH1DirichletRhsWeakSolutionOn_coeffOn_of_isForcedEquation + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {u : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsH1DirichletRhsWeakSolutionOn (a.coeffOn Q).toCoeffField + (Ch02.cubeDomain Q : Set (Vec d)) u g := + h + +theorem isH1DirichletRhsWeakSolutionOn_publicCoeffField_of_isForcedEquation + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {u : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) + (Ch02.cubeDomain Q : Set (Vec d)) u g := by + intro φ + have hcoeff := publicCoeffField_ae_eq Q a + have hintegrand : + (fun x => + vecDot (matVecMul (publicCoeffField Q a x) (u.grad x)) + (φ.toH1Function.grad x)) + =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) (u.grad x)) + (φ.toH1Function.grad x) := by + filter_upwards [hcoeff] with x hx + simp [hx] + calc + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul (publicCoeffField Q a x) (u.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) (u.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae hintegrand + _ = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := h φ + +theorem isZeroTraceDirichletRhsWeakSolution_coeffOn_of_zeroTraceForcedCubeSolution + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (u : ZeroTraceForcedCubeSolution Q a g) : + IsZeroTraceDirichletRhsWeakSolution (a.coeffOn Q).toCoeffField + (Ch02.cubeDomain Q : Set (Vec d)) u.toH10 g := + u.weakSolution + +theorem isZeroTraceDirichletRhsWeakSolution_publicCoeffField_of_zeroTraceForcedCubeSolution + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (u : ZeroTraceForcedCubeSolution Q a g) : + IsZeroTraceDirichletRhsWeakSolution (publicCoeffField Q a) + (Ch02.cubeDomain Q : Set (Vec d)) u.toH10 g := by + intro φ + have hcoeff := publicCoeffField_ae_eq Q a + have hintegrand : + (fun x => + vecDot (matVecMul (publicCoeffField Q a x) + (u.toH10.toH1Function.grad x)) (φ.toH1Function.grad x)) + =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (u.toH10.toH1Function.grad x)) (φ.toH1Function.grad x) := by + filter_upwards [hcoeff] with x hx + simp [hx] + calc + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul (publicCoeffField Q a x) + (u.toH10.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (u.toH10.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae hintegrand + _ = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := + u.weakSolution φ + +theorem isMeanZeroNeumannRhsWeakSolution_coeffOn_of_isMeanZeroNeumannForcedEquation + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {w : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsMeanZeroNeumannForcedEquation Q a w g) : + IsMeanZeroNeumannRhsWeakSolution (a.coeffOn Q).toCoeffField + (Ch02.cubeDomain Q : Set (Vec d)) w g := + h + +theorem isMeanZeroNeumannRhsWeakSolution_publicCoeffField_of_isMeanZeroNeumannForcedEquation + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {w : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsMeanZeroNeumannForcedEquation Q a w g) : + IsMeanZeroNeumannRhsWeakSolution (publicCoeffField Q a) + (Ch02.cubeDomain Q : Set (Vec d)) w g := by + intro φ + have hcoeff := publicCoeffField_ae_eq Q a + have hintegrand : + (fun x => + vecDot (matVecMul (publicCoeffField Q a x) + (w.toH1Function.grad x)) (φ.toH1Function.grad x)) + =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + fun x => + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (w.toH1Function.grad x)) (φ.toH1Function.grad x) := by + filter_upwards [hcoeff] with x hx + simp [hx] + calc + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul (publicCoeffField Q a x) + (w.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (matVecMul ((a.coeffOn Q).toCoeffField x) + (w.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae hintegrand + _ = + ∫ x in (Ch02.cubeDomain Q : Set (Vec d)), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := + h φ + +theorem isMeanZeroNeumannRhsWeakSolution_publicCoeffField_of_neumannForcedCubeSolution + {d : ℕ} {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (w : NeumannForcedCubeSolution Q a g) : + IsMeanZeroNeumannRhsWeakSolution (publicCoeffField Q a) + (Ch02.cubeDomain Q : Set (Vec d)) w.toH1MeanZero + (fun x => g x - cubeAverageVec Q g) := + isMeanZeroNeumannRhsWeakSolution_publicCoeffField_of_isMeanZeroNeumannForcedEquation + (Q := Q) (a := a) (w := w.toH1MeanZero) + (g := fun x => g x - cubeAverageVec Q g) w.weakSolution + +theorem isH1DirichletRhsWeakSolutionOn_constantCoeff_of_isConstantCoeffForcedEquation + {d : ℕ} {Q : TriadicCube d} {a0 : ConstantCoeffMatrix d} + {u : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsConstantCoeffForcedEquation Q a0 u g) : + IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0.matrix) + (Ch02.cubeDomain Q : Set (Vec d)) u g := by + intro φ + simpa [constantCoeffField] using h φ + +/-- Open-cube weak equations transport to the half-open triadic cube because +the two realizations differ by a null boundary. -/ +theorem isH1DirichletRhsWeakSolutionOn_cubeSet_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {a : CoeffField d} {u : H1Function (openCubeSet Q)} + {g : Vec d → Vec d} + (h : IsH1DirichletRhsWeakSolutionOn a (openCubeSet Q) u g) : + IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u.toCubeSet g := by + intro φ + have hopen := h φ.toOpenCubeSet + have hleft : + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (u.toCubeSet.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.grad x)) + (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => + vecDot (matVecMul (a x) (u.toCubeSet.grad x)) + (φ.toH1Function.grad x))) + have hright : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + rw [hleft, hright] + exact hopen + +theorem isZeroTraceDirichletRhsWeakSolution_cubeSet_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {a : CoeffField d} {u : H10Function (openCubeSet Q)} + {g : Vec d → Vec d} + (h : IsZeroTraceDirichletRhsWeakSolution a (openCubeSet Q) u g) : + IsZeroTraceDirichletRhsWeakSolution a (cubeSet Q) u.toCubeSet g := by + intro φ + have hopen := h φ.toOpenCubeSet + have hleft : + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x))) + have hright : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + calc + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := hleft + _ = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume := hopen + _ = + ∫ x in cubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := hright.symm + +theorem isMeanZeroNeumannRhsWeakSolution_cubeSet_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} + {a : CoeffField d} {u : H1MeanZeroFunction (openCubeSet Q)} + {g : Vec d → Vec d} + (h : IsMeanZeroNeumannRhsWeakSolution a (openCubeSet Q) u g) : + IsMeanZeroNeumannRhsWeakSolution a (cubeSet Q) + (H1MeanZeroFunction.toCubeSet u) g := by + intro φ + have hopen := h (H1MeanZeroFunction.toOpenCubeSet φ) + have hleft : + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) + ((H1MeanZeroFunction.toCubeSet u).toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + ((H1MeanZeroFunction.toOpenCubeSet φ).toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => + vecDot (matVecMul (a x) + ((H1MeanZeroFunction.toCubeSet u).toH1Function.grad x)) + (φ.toH1Function.grad x))) + have hright : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) + ((H1MeanZeroFunction.toOpenCubeSet φ).toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + calc + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) + ((H1MeanZeroFunction.toCubeSet u).toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + ((H1MeanZeroFunction.toOpenCubeSet φ).toH1Function.grad x) + ∂MeasureTheory.volume := hleft + _ = + ∫ x in openCubeSet Q, + vecDot (g x) + ((H1MeanZeroFunction.toOpenCubeSet φ).toH1Function.grad x) + ∂MeasureTheory.volume := hopen + _ = + ∫ x in cubeSet Q, + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := hright.symm + +theorem isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {u : H1Function (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsForcedEquation Q a u g) : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u) g := by + have hopen : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (openCubeSet Q) + (castH1Domain (Ch02.cubeDomain_coe Q) u) g := by + simpa [Ch02.cubeDomain_coe] using! + isH1DirichletRhsWeakSolutionOn_publicCoeffField_of_isForcedEquation + (Q := Q) (a := a) (u := u) (g := g) h + simpa [publicH1ToCubeSet] using + isH1DirichletRhsWeakSolutionOn_cubeSet_of_openCubeSet + (Q := Q) (a := publicCoeffField Q a) + (u := castH1Domain (Ch02.cubeDomain_coe Q) u) (g := g) hopen + +theorem CoarseGrainingComparisonDatum.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_const_mul_coarseFluxResponseRHSBound_descendant + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffFamily d} + {a0 : ConstantCoeffMatrix d} {g : Vec d → Vec d} {j : ℕ} {s : ℝ} + (w : CoarseGrainingComparisonDatum Q a a0 g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hR : R ∈ descendantsAtDepth Q j) : + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) ≤ + (2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1) * + coarseFluxResponseRHSBound R + (publicCoeffField Q a) a0.matrix s w.u.grad g := by + let uR : H1Function (cubeSet R) := + ((publicH1ToCubeSet w.u).toOpenCubeSet.restrictToOpenSubcube hR).toCubeSet + have hs_le : s ≤ 1 := hs_lt.le + have hweakQ : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet w.u) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := w.u) (g := g) w.uWeakSolution + have hweakR : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet R) uR g := by + dsimp [uR] + exact + IsH1DirichletRhsWeakSolutionOn.restrict_cubeSet_of_mem_descendantsAtDepth + hweakQ (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (memVectorL2_cubeSet_of_forceBesovRegularity hg) hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity + (publicCoeffField Q a) a0.matrix) := + homogenizationErrorOnCube_parent_publicCoeffField_descendant_infinity_one_terms_summable + (a := a) hRscale a0.matrix hs + have hdet : + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix uR.grad) ≤ + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound R + (publicCoeffField Q a) a0.matrix s uR.grad g := + ZeroTraceDirichletCorrectorData.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy + (Q := R) (a := publicCoeffField Q a) (a0 := a0.matrix) (s := s) + (g := g) (v := uR) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (lam0 := a0.lam) (Lam0 := a0.Lam) + hs hs_le (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + a0.elliptic a0.isSymm hweakR (forceBesovRegularity_descendant hg hR) + hresponseSum + let B : ℝ := + coarseFluxResponseRHSBound R + (publicCoeffField Q a) a0.matrix s w.u.grad g + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact coarseFluxResponseRHSBound_nonneg_of_bddAbove + R (publicCoeffField Q a) a0.matrix w.u.grad g hs + (forceBesovRegularity_descendant_partialSeminorms_bddAbove hg hR) + have hM_le : + zeroTraceDirichletCorrectedWeakFluxApexConstant d s ≤ + zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 := by + have hdisplay : + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s ≤ + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d 1 := by + unfold zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + have hpow : + (3 : ℝ) ^ ((d : ℝ) + s) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hinner : + (3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2 ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + nlinarith + have hfactor : + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s ≤ + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1 := by + nlinarith + calc + cubeBesovNegativeVectorSeminormTwo R s + (fluxDefect (publicCoeffField Q a) a0.matrix w.u.grad) + ≤ 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s * B := by + simpa [uR, B, publicH1ToCubeSet_grad] using hdet + _ ≤ (2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d 1) * B := + mul_le_mul_of_nonneg_right hfactor hB_nonneg + +theorem isMeanZeroNeumannRhsWeakSolution_publicCoeffField_cubeSet_of_isMeanZeroNeumannForcedEquation + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {w : H1MeanZeroFunction (Ch02.cubeDomain Q : Set (Vec d))} + {g : Vec d → Vec d} + (h : IsMeanZeroNeumannForcedEquation Q a w g) : + IsMeanZeroNeumannRhsWeakSolution (publicCoeffField Q a) (cubeSet Q) + (publicH1MeanZeroToCubeSet w) g := by + have hopen : + IsMeanZeroNeumannRhsWeakSolution (publicCoeffField Q a) + (openCubeSet Q) (castH1MeanZeroDomain (Ch02.cubeDomain_coe Q) w) g := by + simpa [Ch02.cubeDomain_coe] using! + isMeanZeroNeumannRhsWeakSolution_publicCoeffField_of_isMeanZeroNeumannForcedEquation + (Q := Q) (a := a) (w := w) (g := g) h + simpa [publicH1MeanZeroToCubeSet] using + isMeanZeroNeumannRhsWeakSolution_cubeSet_of_openCubeSet + (Q := Q) (a := publicCoeffField Q a) + (u := castH1MeanZeroDomain (Ch02.cubeDomain_coe Q) w) (g := g) hopen + +theorem isMeanZeroNeumannRhsWeakSolution_publicCoeffField_cubeSet_of_neumannForcedCubeSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} + (w : NeumannForcedCubeSolution Q a g) : + IsMeanZeroNeumannRhsWeakSolution (publicCoeffField Q a) (cubeSet Q) + (publicH1MeanZeroToCubeSet w.toH1MeanZero) + (fun x => g x - cubeAverageVec Q g) := + isMeanZeroNeumannRhsWeakSolution_publicCoeffField_cubeSet_of_isMeanZeroNeumannForcedEquation + (Q := Q) (a := a) (w := w.toH1MeanZero) + (g := fun x => g x - cubeAverageVec Q g) w.weakSolution + + + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/SobolevPublic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/SobolevPublic.lean new file mode 100644 index 0000000000..eb6fcb2e81 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/SobolevPublic.lean @@ -0,0 +1,556 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.FractionalSobolevVsBesov +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.EndPoints +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.CoordinateStandard + +/-! +# Legacy Sobolev/dual-Besov compatibility wrappers for the Chapter 3 comparison + +This file supplies the compatibility layer used by `Book.MainResults`: positive +data use the componentwise legacy fractional-Sobolev form from `Ch01.Legacy`, +while the negative left-hand side is a legacy dual-Besov wrapper. The bridge +lemmas convert these compatibility quantities to the Besov quantities consumed +by the already-proved deterministic comparison theorem. The positive lane is +the legacy ambient-sup-distance, finite-truncation / real-`sSup` overlap +presentation, not the exact Euclidean / `ENNReal` manuscript API. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +namespace Legacy + +/-- Legacy componentwise fractional-Sobolev regularity for a vector force. -/ +def ForceSobolevRegularity {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (g : Vec d → Vec d) : Prop := + ∀ i : Fin d, + Ch01.Legacy.MemFractionalSobolev Q s (2 : ℝ≥0∞) (fun x => g x i) + +/-- Legacy scale-normalized componentwise fractional-Sobolev seminorm. -/ +noncomputable def scaleNormalizedPositiveSobolevVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (g : Vec d → Vec d) : ℝ := + cubeBesovScaleWeight (-s) Q * + ∑ i : Fin d, + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) (fun x => g x i) + +/-- Legacy dual-Besov wrapper used by the Chapter 3 compatibility lane. + +Its body is `scaleNormalizedDualNegativeBesovVectorNormTwo`; it is not an +identification with either Chapter 1 negative-Sobolev primitive. -/ +noncomputable abbrev scaleNormalizedNegativeSobolevVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + scaleNormalizedDualNegativeBesovVectorNormTwo Q s F + +/-- Legacy dual-Besov compatibility left-hand side of the homogenization +comparison. -/ +noncomputable def homogenizationComparisonNegativeSobolevLHS {d : ℕ} + (Q : TriadicCube d) (a : CoeffFamily d) (a0 : ConstantCoeffMatrix d) + (s : ℝ) (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) : ℝ := + scaleNormalizedNegativeSobolevVectorNormTwo Q s + (homogenizationComparisonConstantGradientField a0 u v) + + scaleNormalizedNegativeSobolevVectorNormTwo Q s + (homogenizationComparisonFluxField Q a a0 u v) + +theorem scaleNormalizedPositiveSobolevVectorSeminormTwo_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (g : Vec d → Vec d) : + 0 ≤ scaleNormalizedPositiveSobolevVectorSeminormTwo Q s g := by + unfold scaleNormalizedPositiveSobolevVectorSeminormTwo + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) + (Finset.sum_nonneg fun i _ => + Gagliardo.cubeGagliardoSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => g x i)) + +theorem forceSobolevRegularity_memLp {d : ℕ} {Q : TriadicCube d} + {s : ℝ} {g : Vec d → Vec d} + (hg : ForceSobolevRegularity Q s g) : + MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact MeasureTheory.MemLp.of_eval fun i => (hg i).memLp + +end Legacy + +theorem cubeLpNorm_two_vec_le_sum_components {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x i) := by + let μ : MeasureTheory.Measure (Vec d) := normalizedCubeMeasure Q + let D : Vec d → ℝ := fun x => ∑ i : Fin d, ‖u x i‖ + have hcoord_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) μ := by + intro i + simpa [μ] using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hcoord_norm_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := by + intro i + simpa using (hcoord_mem i).norm + have hD_mem : MeasureTheory.MemLp D (2 : ℝ≥0∞) μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => ‖u x i‖) + (fun i _hi => hcoord_norm_mem i) + simpa [D] using hsum + have hvec_le : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ ≤ + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ := by + have hpoint : + ∀ᵐ x ∂μ, ‖u x‖ ≤ (1 : ℝ) * ‖D x‖ := by + exact Filter.Eventually.of_forall fun x => by + have hD_nonneg : 0 ≤ D x := + Finset.sum_nonneg fun i _hi => norm_nonneg _ + have hu_le_D : ‖u x‖ ≤ D x := by + refine (pi_norm_le_iff_of_nonneg hD_nonneg).2 ?_ + intro i + exact Finset.single_le_sum + (fun j _hj => norm_nonneg (u x j)) (Finset.mem_univ i) + simpa [Real.norm_eq_abs, abs_of_nonneg hD_nonneg] using hu_le_D + simpa using + (MeasureTheory.eLpNorm_le_mul_eLpNorm_of_ae_le_mul hpoint + (2 : ℝ≥0∞)) + have hsum_eLp : + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := by + have hD : + D = ∑ i : Fin d, (fun x : Vec d => ‖u x i‖) := by + funext x + simp [D] + rw [hD] + exact + MeasureTheory.eLpNorm_sum_le + (μ := μ) (p := (2 : ℝ≥0∞)) (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => ‖u x i‖) + (fun i _hi => (hcoord_norm_mem i).1) + (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) + have hmain : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := + hvec_le.trans hsum_eLp + have hsum_ne_top : + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ) ≠ ∞ := + ENNReal.sum_ne_top.2 fun i _hi => (hcoord_norm_mem i).2.ne + have htoReal : + (MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ).toReal ≤ + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ).toReal := + ENNReal.toReal_mono hsum_ne_top hmain + rw [ENNReal.toReal_sum (fun i _hi => (hcoord_norm_mem i).2.ne)] at htoReal + have hsum_toReal_norm : + (∑ i : Fin d, + (MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ).toReal) = + ∑ i : Fin d, + (MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) μ).toReal := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [MeasureTheory.eLpNorm_norm] + rw [hsum_toReal_norm] at htoReal + simpa [cubeLpNorm, μ] using htoReal + +theorem sqrt_cubeBesovPositiveVectorDepthAverage_le_sum_components + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (j : ℕ) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q g j) ≤ + ∑ i : Fin d, + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => g x i) j) := by + classical + let A : TriadicCube d → Fin d → ℝ := + fun R i => cubeLpNorm R (2 : ℝ≥0∞) (fun x => cubeFluctuationVec R g x i) + have hA_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ i ∈ Finset.univ, 0 ≤ A R i := by + intro R _hR i _hi + exact cubeLpNorm_nonneg R (2 : ℝ≥0∞) _ + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) ^ 2 ≤ + (∑ i : Fin d, A R i) ^ 2 := by + intro R hR + have hgR : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hfluct : + MeasureTheory.MemLp (cubeFluctuationVec R g) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + memLp_cubeFluctuationVec R g hgR + have hnorm := + cubeLpNorm_two_vec_le_sum_components R (cubeFluctuationVec R g) hfluct + exact (sq_le_sq₀ + (cubeLpNorm_nonneg R (2 : ℝ≥0∞) (cubeFluctuationVec R g)) + (Finset.sum_nonneg fun i _hi => hA_nonneg R hR i (Finset.mem_univ i))).mpr hnorm + have havg_le : + cubeBesovPositiveVectorDepthAverage Q g j ≤ + descendantsAverage Q j fun R => (∑ i : Fin d, A R i) ^ 2 := by + unfold cubeBesovPositiveVectorDepthAverage + exact descendantsAverage_le_descendantsAverage Q j hpoint + calc + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q g j) + ≤ + Real.sqrt (descendantsAverage Q j fun R => (∑ i : Fin d, A R i) ^ 2) := + Real.sqrt_le_sqrt havg_le + _ = + (descendantsAverage Q j fun R => (∑ i : Fin d, A R i) ^ 2) ^ + (1 / 2 : ℝ) := by rw [Real.sqrt_eq_rpow] + _ ≤ + ∑ i : Fin d, + (descendantsAverage Q j fun R => (A R i) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 + Q j Finset.univ A hA_nonneg + _ = + ∑ i : Fin d, + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) + (fun x => g x i) j) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + have hbase : + descendantsAverage Q j (fun R => (A R i) ^ 2) = + cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => g x i) j := by + unfold cubeBesovDepthAverage descendantsAverage A cubeBesovOscillation + apply congrArg (fun z : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * z) + refine Finset.sum_congr rfl ?_ + intro R _hR + rw [cubeFluctuation_component_eq_cubeFluctuationVec_component R g i] + norm_num + rw [hbase, Real.sqrt_eq_rpow] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_scaleWeight_mul_sum_components + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (g : Vec d → Vec d) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ + cubeBesovScaleWeight (-s) Q * + ∑ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) := by + classical + let W : ℝ := cubeBesovScaleWeight (-s) Q + let A : ℕ → Fin d → ℝ := + fun j i => + W * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => g x i) j + have hW_nonneg : 0 ≤ W := cubeBesovScaleWeight_nonneg (-s) Q + have hA_nonneg : + ∀ j ∈ Finset.range (N + 1), ∀ i ∈ Finset.univ, 0 ≤ A j i := by + intro j _hj i _hi + exact mul_nonneg hW_nonneg + (cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => g x i) j) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovPositiveVectorDepthSeminorm Q s g j ≤ + ∑ i : Fin d, A j i := by + intro j _hj + have hroot := + sqrt_cubeBesovPositiveVectorDepthAverage_le_sum_components Q g j hg + have hscale : + cubeBesovPositiveVectorDepthSeminorm Q s g j = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q g j) := rfl + rw [hscale] + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q g j) + ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + ∑ i : Fin d, + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) + (fun x => g x i) j) := by + exact mul_le_mul_of_nonneg_left hroot + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = + ∑ i : Fin d, A j i := by + unfold A W + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + have hcoord := + cubeBesovPositiveVectorDepthSeminorm_coordinateVectorField + Q s i (fun x => g x i) j + unfold cubeBesovPositiveVectorDepthSeminorm at hcoord + rw [cubeBesovPositiveVectorDepthAverage_coordinateVectorField] at hcoord + simpa [Real.sqrt_eq_rpow] using hcoord + have hsq : + (cubeBesovPositiveVectorPartialSeminormTwo Q s N g) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), (∑ i : Fin d, A j i) ^ 2 := by + rw [sq_cubeBesovPositiveVectorPartialSeminormTwo] + refine Finset.sum_le_sum ?_ + intro j hj + have hleft_nonneg : + 0 ≤ cubeBesovPositiveVectorDepthSeminorm Q s g j := + cubeBesovPositiveVectorDepthSeminorm_nonneg Q s g j + have hright_nonneg : 0 ≤ ∑ i : Fin d, A j i := + Finset.sum_nonneg fun i hi => hA_nonneg j hj i hi + nlinarith [hdepth j hj] + have hpartial_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s N g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s N g + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N g + = + Real.sqrt ((cubeBesovPositiveVectorPartialSeminormTwo Q s N g) ^ 2) := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hpartial_nonneg] + _ ≤ + Real.sqrt (∑ j ∈ Finset.range (N + 1), (∑ i : Fin d, A j i) ^ 2) := + Real.sqrt_le_sqrt hsq + _ ≤ + ∑ i : Fin d, + Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j i) ^ 2) := by + exact sqrt_sum_sq_sum_le_sum_sqrt_sum_sq + (Finset.range (N + 1)) Finset.univ A hA_nonneg + _ = + W * + ∑ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + unfold A cubeBesovPartialSeminorm + have hsqrt := + sqrt_sum_sq_const_mul_eq_componentwise + (Finset.range (N + 1)) W + (fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i) j) hW_nonneg + simpa [Real.sqrt_eq_rpow] using hsqrt + +namespace Legacy + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_const_mul_sobolev + {d : ℕ} [NeZero d] (Q : TriadicCube d) {s : ℝ} (N : ℕ) + (g : Vec d → Vec d) (hs : 0 < s) (_hs1 : s ≤ 1) + (hg : ForceSobolevRegularity Q s g) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ + ((3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d) * + scaleNormalizedPositiveSobolevVectorSeminormTwo Q s g := by + let C : ℝ := (3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d + have hmem : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + forceSobolevRegularity_memLp hg + have hbase := + cubeBesovPositiveVectorPartialSeminormTwo_le_scaleWeight_mul_sum_components + Q s N g hmem + have hcomponent : + ∀ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ + (3 : ℝ) ^ ((d : ℝ) / 2) * + (Ch01.Legacy.wspVsBsppConstant d * + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i)) := by + intro i + obtain ⟨gi, hgi_meas, hgi_ae_norm⟩ := + (hg i).memLp.aestronglyMeasurable.aemeasurable + have hgi_ae : (fun x => g x i) =ᵐ[Homogenization.cubeMeasure Q] gi := + Gagliardo.ae_normalizedCubeMeasure_iff.1 hgi_ae_norm + have hgiLp : MeasureTheory.MemLp gi (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + (hg i).memLp.ae_eq hgi_ae_norm + have hgiW : Gagliardo.MemWsp Q s (2 : ℝ≥0∞) gi := + (Gagliardo.memWsp_congr_ae hgi_ae).1 (hg i).memWsp + have hpartial_eq : + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) = + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N gi := + Gagliardo.overlap_partialSeminorm_congr_ae hgi_ae + have hfrac_eq : + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) (fun x => g x i) = + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) gi := + congrArg ENNReal.toReal (Gagliardo.cubeGagliardoESeminorm_congr_ae hgi_ae) + have hdisjoint_overlap := + cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + Q s (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) + (by norm_num : 0 < ENNReal.toReal (2 : ℝ≥0∞)) + (by norm_num : 1 ≤ ENNReal.toReal (2 : ℝ≥0∞)) + N (fun x => g x i) + have hSob := + Ch01.Legacy.besovOverlapPartial_le_const_mul_gagliardo + (Q := Q) (s := s) (p := (2 : ℝ≥0∞)) + (u := gi) hs (by norm_num) (by norm_num) + hgi_meas hgiLp hgiW N + calc + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) + ≤ + (3 : ℝ) ^ ((d : ℝ) / ENNReal.toReal (2 : ℝ≥0∞)) * + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) := hdisjoint_overlap + _ = + (3 : ℝ) ^ ((d : ℝ) / 2) * + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) := by norm_num + _ ≤ + (3 : ℝ) ^ ((d : ℝ) / 2) * + (Ch01.Legacy.wspVsBsppConstant d * + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i)) := by + have hSob' : + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ + Ch01.Legacy.wspVsBsppConstant d * + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i) := by + simpa [hpartial_eq, hfrac_eq] using hSob + exact mul_le_mul_of_nonneg_left hSob' + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hsum : + ∑ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ + (3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d * + ∑ i : Fin d, + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i) := by + calc + ∑ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) + ≤ + ∑ i : Fin d, + (3 : ℝ) ^ ((d : ℝ) / 2) * + (Ch01.Legacy.wspVsBsppConstant d * + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i)) := by + exact Finset.sum_le_sum fun i _ => hcomponent i + _ = + (3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d * + ∑ i : Fin d, + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i) := by + rw [Finset.mul_sum] + ring_nf + have hW_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N g + ≤ cubeBesovScaleWeight (-s) Q * + ∑ i : Fin d, + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) := hbase + _ ≤ cubeBesovScaleWeight (-s) Q * + ((3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d * + ∑ i : Fin d, + Ch01.Legacy.fractionalSobolevSeminorm Q s (2 : ℝ≥0∞) + (fun x => g x i)) := by + exact mul_le_mul_of_nonneg_left hsum hW_nonneg + _ = + ((3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d) * + scaleNormalizedPositiveSobolevVectorSeminormTwo Q s g := by + unfold scaleNormalizedPositiveSobolevVectorSeminormTwo + ring + +theorem ForceSobolevRegularity.toForceBesovRegularity + {d : ℕ} [NeZero d] {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : ForceSobolevRegularity Q s g) (hs : 0 < s) (hs1 : s ≤ 1) : + ForceBesovRegularity Q s g := by + refine ⟨forceSobolevRegularity_memLp hg, ?_⟩ + refine ⟨((3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d) * + scaleNormalizedPositiveSobolevVectorSeminormTwo Q s g, ?_⟩ + rintro x ⟨N, rfl⟩ + exact cubeBesovPositiveVectorPartialSeminormTwo_le_const_mul_sobolev + Q N g hs hs1 hg + +theorem scaleNormalizedPositiveBesovVectorSeminormTwo_le_const_mul_sobolev + {d : ℕ} [NeZero d] (Q : TriadicCube d) {s : ℝ} (g : Vec d → Vec d) + (hs : 0 < s) (hs1 : s ≤ 1) + (hg : ForceSobolevRegularity Q s g) : + scaleNormalizedPositiveBesovVectorSeminormTwo Q s g ≤ + ((3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d) * + scaleNormalizedPositiveSobolevVectorSeminormTwo Q s g := by + simpa [scaleNormalizedPositiveBesovVectorSeminormTwo] using + cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s g + (fun N => + cubeBesovPositiveVectorPartialSeminormTwo_le_const_mul_sobolev + Q N g hs hs1 hg) + +theorem homogenizationComparisonNegativeSobolevLHS_le_const_mul_negativeBesovLHS + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (a0 : ConstantCoeffMatrix d) (s : ℝ) + (u v : H1Function (Ch02.cubeDomain Q : Set (Vec d))) (hs : 0 < s) : + homogenizationComparisonNegativeSobolevLHS Q a a0 s u v ≤ + ((d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s)) * + homogenizationComparisonNegativeBesovLHS Q a a0 s u v := by + let K : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + let Gc : Vec d → Vec d := + homogenizationComparisonConstantGradientField a0 u v + let Gf : Vec d → Vec d := + homogenizationComparisonFluxField Q a a0 u v + have huGrad : MemVectorL2 (cubeSet Q) u.grad := by + simpa using (publicH1ToCubeSet u).grad_memVectorL2 + have hvGrad : MemVectorL2 (cubeSet Q) v.grad := by + simpa using (publicH1ToCubeSet v).grad_memVectorL2 + have hgradDiff : MemVectorL2 (cubeSet Q) (fun x => u.grad x - v.grad x) := + huGrad.sub hvGrad + have hEll0 : + IsEllipticFieldOn a0.lam a0.Lam (cubeSet Q) + (constantCoeffField a0.matrix) := + constantCoeffMatrix_isEllipticFieldOn_constantCoeffField a0 + (measurableSet_cubeSet Q) + have hGc_mem : MemVectorL2 (cubeSet Q) Gc := by + simpa [Gc, homogenizationComparisonConstantGradientField, constantCoeffField] using! + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hgradDiff + let GfInternal : Vec d → Vec d := + fluxComparison (publicCoeffField Q a) a0.matrix u.grad v.grad + have hfluxA : MemVectorL2 (cubeSet Q) + (fun x => matVecMul (publicCoeffField Q a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) huGrad + have hflux0 : MemVectorL2 (cubeSet Q) + (fun x => matVecMul a0.matrix (v.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 hvGrad + have hGfInternal_mem : MemVectorL2 (cubeSet Q) GfInternal := by + dsimp [GfInternal, fluxComparison] + exact hfluxA.sub hflux0 + have hGf_ae : Gf =ᵐ[volumeMeasureOn (cubeSet Q)] GfInternal := by + dsimp [Gf, GfInternal] + exact + homogenizationComparisonFluxField_ae_eq_fluxComparison_publicCoeffField_cubeSet + (Q := Q) (a := a) (a0 := a0) u v + have hGf_mem : MemVectorL2 (cubeSet Q) Gf := + MeasureTheory.MemLp.ae_eq hGf_ae.symm hGfInternal_mem + have hGc_bound : + scaleNormalizedNegativeSobolevVectorNormTwo Q s Gc ≤ + K * cubeBesovNegativeVectorSeminormTwo Q s Gc := by + simpa [scaleNormalizedNegativeSobolevVectorNormTwo, K] using + scaleNormalizedDualNegativeBesovVectorNormTwo_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo + Q s Gc hs hGc_mem + have hGf_bound : + scaleNormalizedNegativeSobolevVectorNormTwo Q s Gf ≤ + K * cubeBesovNegativeVectorSeminormTwo Q s Gf := by + simpa [scaleNormalizedNegativeSobolevVectorNormTwo, K] using + scaleNormalizedDualNegativeBesovVectorNormTwo_le_note_constant_mul_cubeBesovNegativeVectorSeminormTwo + Q s Gf hs hGf_mem + calc + homogenizationComparisonNegativeSobolevLHS Q a a0 s u v + = scaleNormalizedNegativeSobolevVectorNormTwo Q s Gc + + scaleNormalizedNegativeSobolevVectorNormTwo Q s Gf := by + rfl + _ ≤ K * cubeBesovNegativeVectorSeminormTwo Q s Gc + + K * cubeBesovNegativeVectorSeminormTwo Q s Gf := + add_le_add hGc_bound hGf_bound + _ = + K * homogenizationComparisonNegativeBesovLHS Q a a0 s u v := by + unfold homogenizationComparisonNegativeBesovLHS + dsimp [Gc, Gf, K] + ring + +end Legacy + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS.lean new file mode 100644 index 0000000000..9f6c065587 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS.lean @@ -0,0 +1,676 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.AveragedTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex + +/-! # Weak Flux RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Section 3.2.3: Weak flux estimate with right-hand side + +This file assembles the public weak flux RHS theorem package from the selected +harmonic-remainder bridge layer and the deterministic absorbed apex. + +## Audit tag + +Claim: expose the single public weak-flux-with-RHS package after the +harmonic-remainder selection and deterministic absorbed apex have been +connected to the Book-facing data. + +Downstream target: `InhomogeneousEquationsTheory`. This file should not grow +parallel weak-flux `Theory` variants; missing inputs should be proved in the +selection or deterministic bridge layers. +-/ + +noncomputable section + +theorem weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_le_four_mul_add_of_decomposition_and_neumann_tail + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {s : ℝ} {g u : Vec d → Vec d} + (v : TriadicCube d → Vec d → Vec d) + (ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g)) + {BU Bω : ℝ} + (hs : 0 < s) + (hu_mem_desc : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, MemVectorL2 (cubeSet R) u) + (huBdd_desc : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hdecomp : + ∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, ∀ x ∈ cubeSet R, + u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) + (hu_tail : ∀ n : ℕ, coarsePoincareRHSSn Q s u n ≤ BU) + (hω_tail : + ∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω) : + ∀ n : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n ≤ + 4 * (BU + Bω) := by + intro n + let U : TriadicCube d → ℝ := fun R => + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 + let Ω : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0 + have hpoint : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + 4 * (U R + Ω R) := by + intro R hR + let ωR : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + ω n R hR + let ωgrad : Vec d → Vec d := + fun x => ωR.toH1MeanZero.toH1Function.grad x + have hv_eq_sub : + cubeBesovNegativeVectorSeminormTwo R s (v R) = + cubeBesovNegativeVectorSeminormTwo R s (fun x => u x - ωgrad x) := by + apply cubeBesovNegativeVectorSeminormTwo_eq_of_eq_on_cubeSet + intro x hx + ext i + have hcoord : + u x i = v R x i + ωgrad x i := by + simpa [ωR, ωgrad] using + congrArg (fun z => z i) (hdecomp n R hR x hx) + change v R x i = u x i - ωgrad x i + linarith + have hu_mem : MemVectorL2 (cubeSet R) u := hu_mem_desc n R hR + have hω_mem : MemVectorL2 (cubeSet R) ωgrad := by + simpa [ωgrad] using ωR.toH1MeanZero.toH1Function.grad_memVectorL2 + have huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u) := + huBdd_desc n R hR + have hωBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N ωgrad) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs ωgrad + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R hω_mem) + have hsub_mem : MemVectorL2 (cubeSet R) (fun x => u x - ωgrad x) := + hu_mem.sub hω_mem + have hsubBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => u x - ωgrad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => u x - ωgrad x) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R hsub_mem) + let Su : ℝ := cubeBesovNegativeVectorSeminormTwo R s u + let Sω : ℝ := cubeBesovNegativeVectorSeminormTwo R s ωgrad + let Sv : ℝ := cubeBesovNegativeVectorSeminormTwo R s (fun x => u x - ωgrad x) + have hsub_le : + Sv ≤ Real.sqrt 2 * (Su + Sω) := by + simpa [Sv, Su, Sω, ωgrad] using + cubeBesovNegativeVectorSeminormTwo_sub_le_sqrtTwo_mul_add_of_bddAbove + R s u ωgrad hu_mem hω_mem huBdd hωBdd + have hSv_nonneg : 0 ≤ Sv := by + dsimp [Sv] + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s + (fun x => u x - ωgrad x) hsubBdd + have hSu_nonneg : 0 ≤ Su := by + dsimp [Su] + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s u huBdd + have hSω_nonneg : 0 ≤ Sω := by + dsimp [Sω] + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s ωgrad hωBdd + have hsqrt2_sq : (Real.sqrt 2) ^ 2 = (2 : ℝ) := + Real.sq_sqrt (by norm_num : (0 : ℝ) ≤ 2) + have hSv_sq : + Sv ^ 2 ≤ 4 * (Su ^ 2 + Sω ^ 2) := by + have hright_nonneg : 0 ≤ Real.sqrt 2 * (Su + Sω) := + mul_nonneg (Real.sqrt_nonneg 2) (add_nonneg hSu_nonneg hSω_nonneg) + have hsq_right : + (Real.sqrt 2 * (Su + Sω)) ^ 2 = + 2 * (Su + Sω) ^ 2 := by + rw [mul_pow, hsqrt2_sq] + calc + Sv ^ 2 ≤ (Real.sqrt 2 * (Su + Sω)) ^ 2 := by + nlinarith + _ = 2 * (Su + Sω) ^ 2 := hsq_right + _ ≤ 4 * (Su ^ 2 + Sω ^ 2) := by + nlinarith [sq_nonneg (Su - Sω)] + have hΩ : Ω R = Sω ^ 2 := by + simp [Ω, Sω, ωR, ωgrad, hR] + calc + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 + = Sv ^ 2 := by + simpa [Sv] using congrArg (fun t : ℝ => t ^ 2) hv_eq_sub + _ ≤ 4 * (Su ^ 2 + Sω ^ 2) := hSv_sq + _ = 4 * (U R + Ω R) := by + simp [U, hΩ, Su] + have havg : + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n ≤ + descendantsAverage Q n (fun R => 4 * (U R + Ω R)) := by + unfold weakFluxRHSHarmonicRemainderAveragedSeminormSq + exact descendantsAverage_le_descendantsAverage Q n hpoint + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + calc + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n + = + coarsePoincareRHSDepthWeight s n * + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n := by + rfl + _ ≤ + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n (fun R => 4 * (U R + Ω R)) := + mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = + 4 * + (coarsePoincareRHSDepthWeight s n * descendantsAverage Q n U + + coarsePoincareRHSDepthWeight s n * descendantsAverage Q n Ω) := by + rw [show descendantsAverage Q n (fun R => 4 * (U R + Ω R)) = + 4 * descendantsAverage Q n (fun R => U R + Ω R) by + exact descendantsAverage_smul Q n (4 : ℝ) + (fun R => U R + Ω R)] + rw [descendantsAverage_add Q n U Ω] + ring + _ ≤ 4 * (BU + Bω) := by + exact mul_le_mul_of_nonneg_left + (add_le_add + (by simpa [coarsePoincareRHSSn, coarsePoincareRHSRn, U] using + hu_tail n) + (by simpa [Ω] using hω_tail n)) + (by norm_num : (0 : ℝ) ≤ 4) + +/-- Public forced-solution specialization of the harmonic-remainder `BV` +closure: the original-gradient tail is supplied by the public coarse-Poincare +RHS budget, so only the selected Neumann-corrector tail remains explicit. -/ +theorem forcedSolution_harmonicRemainderScaledAveragedSeminormSq_le_four_mul_add_of_decomposition_and_neumann_tail + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (v : TriadicCube d → Vec d → Vec d) + (ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g)) + {Bω : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hdecomp : + ∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) + (hω_tail : + ∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω) : + ∀ n : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n ≤ + 4 * (forcedSolutionWeakFluxPoincareTailBudget Q a s u + Bω) := by + refine + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_le_four_mul_add_of_decomposition_and_neumann_tail + (Q := Q) (a := publicCoeffField Q a) (s := s) (g := g) + (u := forcedSolutionGradientField u) v ω + (BU := forcedSolutionWeakFluxPoincareTailBudget Q a s u) (Bω := Bω) + hs ?_ ?_ hdecomp ?_ hω_tail + · intro n R hR + exact forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR + · intro n R hR + exact forcedSolutionGradientField_descendant_negativeBesovPartialSeminormTwo_bddAbove + (Q := Q) (R := R) (a := a) (g := g) u hR hs + · intro n + exact + forcedSolutionGradientField_coarsePoincareRHSSn_le_weakFluxPoincareTailBudget_publicCoeffField + (Q := Q) (a := a) (g := g) (s := s) u hs hs_lt.le hg n + +/-- Public weak-flux bridge after choosing the local harmonic remainders and +their Neumann correctors. The harmonic-remainder `BV` tail is closed by the +coarse-Poincare tail of the original solution plus the selected Neumann-corrector +negative-Besov tail. -/ +theorem exists_harmonicRemainderSelector_localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_selected_neumann_tail + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (m : ℕ) {Bω : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBω_nonneg : 0 ≤ Bω) : + ∃ v : TriadicCube d → Vec d → Vec d, + ∃ ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + (∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) ∧ + ((∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * forcedSolutionWeakFluxPoincareTailBudget Q a s u + + (5 * s⁻¹) * + (4 * (forcedSolutionWeakFluxPoincareTailBudget Q a s u + Bω)) + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2))) := by + let BV : ℝ := 4 * (forcedSolutionWeakFluxPoincareTailBudget Q a s u + Bω) + have hBV_nonneg : 0 ≤ BV := by + dsimp [BV] + exact mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) + (add_nonneg (forcedSolutionWeakFluxPoincareTailBudget_nonneg u hs) hBω_nonneg) + rcases + exists_harmonicRemainderSelector_localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_averaged_tail + (Q := Q) (a := a) (s := s) (g := g) u m + (BV := BV) hs hs_lt hg hBV_nonneg with + ⟨v, hselector, hflux⟩ + let ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g) := + fun n R hR => Classical.choose (hselector R ⟨n, hR⟩) + have hdecomp : + ∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x := by + intro n R hR x hx + let hsel := hselector R ⟨n, hR⟩ + let ωR : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g) := + Classical.choose hsel + let w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R) := + Classical.choose (Classical.choose_spec hsel) + have hspec : + v R = (fun x => w.toH1.grad x) ∧ + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + w.toH1.grad x + ωR.toH1MeanZero.toH1Function.grad x := by + simpa [hsel, ωR, w] using + Classical.choose_spec (Classical.choose_spec hsel) + have hvx : v R x = w.toH1.grad x := by + simpa using congrFun hspec.1 x + calc + forcedSolutionGradientField u x = + w.toH1.grad x + ωR.toH1MeanZero.toH1Function.grad x := hspec.2 x hx + _ = v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x := by + simp [ω, ωR, hvx] + refine ⟨v, ω, hdecomp, ?_⟩ + intro hω_tail + have hv_tail : + ∀ n : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n ≤ BV := + forcedSolution_harmonicRemainderScaledAveragedSeminormSq_le_four_mul_add_of_decomposition_and_neumann_tail + (Q := Q) (a := a) (s := s) (g := g) u v ω hs hs_lt hg hdecomp hω_tail + simpa [BV] using hflux (fun k => hv_tail (m + k)) + +/-- Depth-zero version of the selected-Neumann weak-flux bridge, with the +left side rewritten as the public negative Besov norm of the forced flux field. +The remaining input is the selected Neumann-corrector negative-Besov tail. -/ +theorem exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_selectedNeumannExpandedRHS + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + {Bω : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBω_nonneg : 0 ≤ Bω) : + ∃ v : TriadicCube d → Vec d → Vec d, + ∃ ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + (∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) ∧ + ((∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω) → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS Q a s u Bω) := by + rcases + exists_harmonicRemainderSelector_localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_selected_neumann_tail + (Q := Q) (a := a) (s := s) (g := g) u 0 hs hs_lt hg hBω_nonneg with + ⟨v, ω, hdecomp, hflux⟩ + refine ⟨v, ω, hdecomp, ?_⟩ + intro hω_tail + let F : Vec d → Vec d := + fun x => matVecMul (publicCoeffField Q a x) (forcedSolutionGradientField u x) + have hloc : + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 ≤ + forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS Q a s u Bω := by + simpa [F, forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS] using + hflux hω_tail + have hF_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N F) := by + simpa [F] using + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_descendant + (Q := Q) (R := Q) (a := a) (g := g) (j := 0) u + (by simp [descendantsAtDepth_zero]) hs + have hF_nonneg : 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s F := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s F hF_bdd + have hdepth : + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 = + cubeBesovNegativeVectorSeminormTwo Q s F := + localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg + Q s F hF_nonneg + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) + = + cubeBesovNegativeVectorSeminormTwo Q s F := by + simpa [F] using + scaleNormalizedNegativeBesovVectorNorm_forcedSolutionFluxField_finite_two_eq_cubeBesovNegativeVectorSeminormTwo_publicCoeffField + Q a s u + _ = + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 := hdepth.symm + _ ≤ forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS Q a s u Bω := hloc + +/-- Public-RHS-facing form of +`exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_selectedNeumannExpandedRHS`. +It isolates the remaining scalar absorption from the selected-Neumann expanded +RHS into the note-facing weak-flux RHS. -/ +theorem exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_weakFluxWithRHSRHS_of_selectedNeumannTail_of_expanded_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {C s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + {Bω : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBω_nonneg : 0 ≤ Bω) + (hexpanded : + forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS Q a s u Bω ≤ + weakFluxWithRHSRHS C Q a s g u) : + ∃ v : TriadicCube d → Vec d → Vec d, + ∃ ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + (∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) ∧ + ((∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω) → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + weakFluxWithRHSRHS C Q a s g u) := by + rcases + exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_selectedNeumannExpandedRHS + (Q := Q) (a := a) (s := s) (g := g) u hs hs_lt hg hBω_nonneg with + ⟨v, ω, hdecomp, hflux⟩ + refine ⟨v, ω, hdecomp, ?_⟩ + intro hω_tail + exact (hflux hω_tail).trans hexpanded + +/-- Pointwise selected-Neumann corrector tail bounds imply the averaged `Bω` +tail consumed by the public weak-flux bridge. -/ +theorem selectedNeumannCorrectorAveragedTail_le_of_pointwise_tail + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {s : ℝ} {g : Vec d → Vec d} + (ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g)) + {Bω : ℝ} + (hω_point : + ∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s n)⁻¹ * Bω) : + ∀ n : ℕ, + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ Bω := by + intro n + let W : ℝ := coarsePoincareRHSDepthWeight s n + have hW_pos : 0 < W := by + dsimp [W, coarsePoincareRHSDepthWeight] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have havg : + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) ≤ + descendantsAverage Q n (fun _R => W⁻¹ * Bω) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + simpa [W, hR] using hω_point n R hR + calc + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => + if hR : R ∈ descendantsAtDepth Q n then + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 + else 0) + ≤ + W * descendantsAverage Q n (fun _R => W⁻¹ * Bω) := by + exact mul_le_mul_of_nonneg_left havg hW_pos.le + _ = W * (W⁻¹ * Bω) := by + rw [descendantsAverage_const] + _ = Bω := by + calc + W * (W⁻¹ * Bω) = (W * W⁻¹) * Bω := by ring + _ = Bω := by + rw [mul_inv_cancel₀ hW_pos.ne'] + ring + +/-- Public weak-flux bridge with the selected-Neumann tail accepted in the +pointwise form often produced by local corrector estimates. -/ +theorem exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_weakFluxWithRHSRHS_of_selectedNeumannPointwiseTail_of_expanded_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {C s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + {Bω : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBω_nonneg : 0 ≤ Bω) + (hexpanded : + forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS Q a s u Bω ≤ + weakFluxWithRHSRHS C Q a s g u) : + ∃ v : TriadicCube d → Vec d → Vec d, + ∃ ω : (n : ℕ) → (R : TriadicCube d) → R ∈ descendantsAtDepth Q n → + MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + (∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + v R x + (ω n R hR).toH1MeanZero.toH1Function.grad x) ∧ + ((∀ n : ℕ, ∀ R : TriadicCube d, ∀ hR : R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω n R hR).toH1MeanZero.toH1Function.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s n)⁻¹ * Bω) → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + weakFluxWithRHSRHS C Q a s g u) := by + rcases + exists_harmonicRemainderSelector_scaleNormalizedForcedFlux_le_weakFluxWithRHSRHS_of_selectedNeumannTail_of_expanded_bound + (Q := Q) (a := a) (s := s) (g := g) u + (Bω := Bω) hs hs_lt hg hBω_nonneg hexpanded with + ⟨v, ω, hdecomp, hflux⟩ + refine ⟨v, ω, hdecomp, ?_⟩ + intro hω_point + exact hflux + (selectedNeumannCorrectorAveragedTail_le_of_pointwise_tail + (Q := Q) (a := publicCoeffField Q a) (s := s) (g := g) + ω hω_point) + +/-- Same public weak-flux bridge with the automatic boundedness part of the +harmonic-remainder tail discharged from `H¹` membership. The remaining input +is only the scalar `BV` estimate for the constructed harmonic remainders. -/ +theorem localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_harmonicRemainder_sq_bound_of_public_poincare_tail + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (m : ℕ) {BV : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBV_nonneg : 0 ≤ BV) + (hv_sq : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R), + (∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * forcedSolutionWeakFluxPoincareTailBudget Q a s u + + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + refine + localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_constructed_harmonicRemainder_bounds_of_public_poincare_tail + (Q := Q) (a := a) (s := s) (g := g) u m + (BV := BV) hs hs_lt hg hBV_nonneg ?_ + intro j R hR ω w hw + exact + ⟨AHarmonicFunction.grad_negativeBesovPartialSeminormTwo_bddAbove + (Q := R) (a := publicCoeffField Q a) w hs, + hv_sq j R hR ω w hw⟩ + +/-- Public theorem package for the weak flux estimate with right-hand side. -/ +structure WeakFluxRHSTheory (d : ℕ) [NeZero d] : Prop where + exists_constant : + ∃ C : ℝ, 0 < C ∧ + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + weakFluxWithRHSRHS C Q a s g u + +/-- Conditional public theorem package for the corrected weak-flux route. The +scalar absorption into the public RHS is included; the remaining input is only +the local corrected recurrence together with a selected Neumann-corrector +gradient on every descendant. -/ +private theorem weakFluxRHSTheory_of_correctorEnergySelector + {d : ℕ} [NeZero d] {C : ℝ} + (hC_pos : 0 < C) + (hC_energy : Real.sqrt 50 ≤ C) + (hC_force : + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + (hselector : + ∀ {Q : TriadicCube d} {a : CoeffFamily d} {s : ℝ} + {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g), + 0 < s → s < 1 → ForceBesovRegularity Q s g → + ∃ z : TriadicCube d → Vec d → Vec d, + (∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) ∧ + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R (publicCoeffField Q a) + (forcedSolutionGradientField u) (z R) s) : + WeakFluxRHSTheory d := by + refine ⟨⟨(d : ℝ) ^ 2 * C, ?_, ?_⟩⟩ + · have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + exact mul_pos (sq_pos_of_pos hd_pos) hC_pos + intro Q a s g u hs hs_lt hg + rcases hselector (Q := Q) (a := a) (s := s) (g := g) u hs hs_lt hg with + ⟨z, hz, hlocal⟩ + exact + scaleNormalizedForcedFlux_le_weakFluxWithRHSRHS_of_correctorEnergySelector + (d := d) (C := C) hC_energy hC_force + Q a u z hs hs_lt hg hlocal hz + +/-- Final public theorem package for the weak-flux estimate with right-hand +side. -/ +theorem weakFluxRHSTheory {d : ℕ} [NeZero d] : WeakFluxRHSTheory d := by + let D : ℝ := + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) + let C : ℝ := Real.sqrt 50 + D + 1 + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hC_pos : 0 < C := by + dsimp [C] + nlinarith [Real.sqrt_nonneg (50 : ℝ), hD_nonneg] + have hC_energy : Real.sqrt 50 ≤ C := by + dsimp [C] + nlinarith [hD_nonneg] + have hC_force : + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C := by + dsimp [C, D] + nlinarith [Real.sqrt_nonneg (50 : ℝ)] + exact + weakFluxRHSTheory_of_correctorEnergySelector + (d := d) (C := C) hC_pos hC_energy hC_force + (by + intro Q a s g u hs _hs_lt hg + exact + exists_neumannCorrectorSelector_fluxSeminormStepCorrectorEnergyLocalError_forcedSolution + (Q := Q) (a := a) (s := s) (g := g) u hs hg) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection.lean new file mode 100644 index 0000000000..623b8f8428 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.AveragedTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Budgets +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Constructed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.CorrectorEnergy + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/AveragedTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/AveragedTail.lean new file mode 100644 index 0000000000..1d72edc698 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/AveragedTail.lean @@ -0,0 +1,368 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Constructed + +/-! # Averaged Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Weak flux RHS selection: averaged tail selector +-/ + +noncomputable section + +/-- Public weak-flux bridge with the harmonic-remainder selector produced by +the deterministic Neumann-corrector construction. The selector's local +boundedness is discharged from harmonicity; the only remaining remainder input +is the averaged scalar `BV` tail for this selected field. -/ +theorem exists_harmonicRemainderSelector_localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_averaged_tail + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (m : ℕ) {BV : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBV_nonneg : 0 ≤ BV) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R), + v R = (fun x => w.toH1.grad x) ∧ + ∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + ((∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ BV) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * forcedSolutionWeakFluxPoincareTailBudget Q a s u + + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2))) := by + have hs_le : s ≤ 1 := hs_lt.le + have hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet R) (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR + have hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) (publicH1ToCubeSet u.toH1).grad := by + intro R hR + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR + have hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact memVectorL2_descendant_cubeSet_of_forceBesovRegularity hg hR + have hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R) := by + intro R _hR + exact h1CoerciveEstimateCubeSet R + have hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant Q a hR + have hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) + (publicCoeffField Q a)) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant + (Q := Q) (a := a) hR hs + have hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (publicCoeffField Q a x) + ((publicH1ToCubeSet u.toH1).grad x))) := by + intro R hR S hS + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_child + (Q := Q) (R := R) (S := S) (a := a) (g := g) u hR hS hs + have huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (publicH1ToCubeSet u.toH1).grad) := by + intro R hR + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_descendant_negativeBesovPartialSeminormTwo_bddAbove + (Q := Q) (R := R) (a := a) (g := g) u hR hs + have hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g)) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact forceBesovRegularity_descendant_centered_partialSeminorms_bddAbove hg hR + have hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q (publicCoeffField Q a) s + (publicH1ToCubeSet u.toH1).grad n) := by + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + weakFluxRHSScaledAveragedSeminormSq_bddAbove_publicCoeffField_forcedSolution + u hs + have hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (publicCoeffField Q a)) 1) := + publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_rpow_one + (Q := Q) (a := a) (s := s / 2) (by nlinarith) + have havg_parent_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) := + cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicH1ToCubeSet u.toH1).grad) + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) := by + intro j R hR + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + (publicH1ToCubeSet u.toH1).grad) + have hint : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicH1ToCubeSet u.toH1).grad_memVectorL2 + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u.toH1) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution + have hQdesc : ∃ n : ℕ, Q ∈ descendantsAtDepth Q n := ⟨0, by simp⟩ + have hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro j S hS + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hS hg.memLp + have hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro n R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hg.partialSeminorms_bddAbove + have hu_tail : + ∀ k : ℕ, + coarsePoincareRHSSn Q s (publicH1ToCubeSet u.toH1).grad (m + k) ≤ + forcedSolutionWeakFluxPoincareTailBudget Q a s u := by + intro k + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_coarsePoincareRHSSn_le_weakFluxPoincareTailBudget_publicCoeffField + (Q := Q) (a := a) (g := g) (s := s) u hs hs_le hg (m + k) + have hη : 0 < coarsePoincareRHSNoteEta s := + coarsePoincareRHSNoteEta_pos hs + rcases + _root_.Homogenization.exists_harmonicRemainderSelector_fluxSeminormStepAbsorbedLocalError_with_decomposition_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (Q := Q) (a := publicCoeffField Q a) (s := s) + (η := coarsePoincareRHSNoteEta s) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (u := (publicH1ToCubeSet u.toH1).grad) (g := g) + hs hη (publicH1ToCubeSet u.toH1).isPotentialOn + (hweak.residual_solenoidal (hEll_desc Q hQdesc) (hg_mem_desc Q hQdesc)) + hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc + hchildBdd huBdd_desc hgBdd_centered_desc with + ⟨v, hselected, hlocal_of_bdd⟩ + have hvBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R)) := by + intro R hRdesc + rcases hselected R hRdesc with ⟨ω, w, hv_eq, _hdecomp⟩ + simpa [hv_eq] using + AHarmonicFunction.grad_negativeBesovPartialSeminormTwo_bddAbove + (Q := R) (a := publicCoeffField Q a) w hs + refine ⟨v, ?_, ?_⟩ + · intro R hRdesc + rcases hselected R hRdesc with ⟨ω, w, hv_eq, hdecomp⟩ + refine ⟨ω, w, hv_eq, ?_⟩ + intro x hx + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + hdecomp x hx + · intro hv_tail + have hmain : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + ((publicH1ToCubeSet u.toH1).grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad g s m + (forcedSolutionWeakFluxPoincareTailBudget Q a s u) BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hraw := + _root_.Homogenization.localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_bddAbove + (Q := Q) (a := publicCoeffField Q a) (s := s) + (η := coarsePoincareRHSNoteEta s) + (u := (publicH1ToCubeSet u.toH1).grad) (g := g) (v := v) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hη (hlocal_of_bdd hvBdd) (m := m) hBdd + (publicCoeffField_isEllipticFieldOn_openCubeSet Q a) + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + hsum_half havg_parent_nonneg havg_nonneg hint hmem + hg.partialSeminorms_bddAbove hLocalBdd + (forcedSolutionWeakFluxPoincareTailBudget_nonneg u hs) hBV_nonneg + hu_tail hv_tail + simpa [weakFluxRHSAbsorbedLocalizedNoteBase] using hraw + have hexpanded := + _root_.Homogenization.localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_noteBase + Q (publicCoeffField Q a) (publicH1ToCubeSet u.toH1).grad g + hs hs_le m havg_parent_nonneg + (forcedSolutionWeakFluxPoincareTailBudget_nonneg u hs) hBV_nonneg hmain + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using hexpanded + +/-- Public forced-solution selector for the corrected weak-flux recurrence. +On each descendant cube it chooses the centered Neumann corrector supplied by +the deterministic local step and exposes its gradient as the selector used by +the public corrected-energy bridge. -/ +theorem exists_neumannCorrectorSelector_fluxSeminormStepCorrectorEnergyLocalError_forcedSolution + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (hs : 0 < s) (hg : ForceBesovRegularity Q s g) : + ∃ z : TriadicCube d → Vec d → Vec d, + (∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) ∧ + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R (publicCoeffField Q a) + (forcedSolutionGradientField u) (z R) s := by + have hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet R) (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR + have hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) (publicH1ToCubeSet u.toH1).grad := by + intro R hR + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR + have hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact memVectorL2_descendant_cubeSet_of_forceBesovRegularity hg hR + have hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R) := by + intro R _hR + exact h1CoerciveEstimateCubeSet R + have hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant Q a hR + have hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) + (publicCoeffField Q a)) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant + (Q := Q) (a := a) hR hs + have hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (publicCoeffField Q a x) + ((publicH1ToCubeSet u.toH1).grad x))) := by + intro R hR S hS + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_child + (Q := Q) (R := R) (S := S) (a := a) (g := g) u hR hS hs + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u.toH1) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution + have hQdesc : ∃ n : ℕ, Q ∈ descendantsAtDepth Q n := ⟨0, by simp⟩ + rcases + _root_.Homogenization.exists_correctorGradientSelector_fluxSeminormStepCorrectorEnergyLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (Q := Q) (a := publicCoeffField Q a) (s := s) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + (u := (publicH1ToCubeSet u.toH1).grad) (g := g) + hs (publicH1ToCubeSet u.toH1).isPotentialOn + (hweak.residual_solenoidal (hEll_desc Q hQdesc) (hg_mem_desc Q hQdesc)) + hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc + hchildBdd with + ⟨z, hz, hlocal⟩ + refine ⟨z, ?_, ?_⟩ + · intro n R hR + exact hz R ⟨n, hR⟩ + · intro j R hR + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + hlocal j R hR + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Budgets.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Budgets.lean new file mode 100644 index 0000000000..c71b9f0f4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Budgets.lean @@ -0,0 +1,205 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyAveraged + +/-! # Budgets -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Weak flux RHS selection: scalar budgets +-/ + +noncomputable section + +/-- The public scalar budget supplied by the RHS Poincare tail estimate for +the gradient of a forced solution. -/ +def forcedSolutionWeakFluxPoincareTailBudget + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) : ℝ := + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + +theorem forcedSolutionWeakFluxPoincareTailBudget_nonneg + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (hs : 0 < s) : + 0 ≤ forcedSolutionWeakFluxPoincareTailBudget Q a s u := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have havg_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) := + cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (forcedSolutionGradientField u)) + unfold forcedSolutionWeakFluxPoincareTailBudget + positivity + +/-- The public force-scale budget for the selected Neumann-corrector energy +component in the corrected weak-flux route. -/ +noncomputable def forcedSolutionWeakFluxCorrectorEnergyForceScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + 1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + +theorem forcedSolutionWeakFluxCorrectorEnergyForceScale_nonneg + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} (hs : 0 < s) : + 0 ≤ forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g := by + have hdiscount_nonneg : 0 ≤ (geometricDiscount s 2)⁻¹ := + inv_nonneg.mpr + (le_of_lt (geometricDiscount_pos (by nlinarith : 0 < s * (2 : ℝ)))) + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ := + inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ))) + unfold forcedSolutionWeakFluxCorrectorEnergyForceScale + positivity + +/-- Public wrapper for the deterministic averaged corrector-energy estimate: +after choosing Neumann correctors on every descendant at depth `n`, their +localized weak-flux corrector-energy component is bounded by the public +force-scale budget. -/ +theorem weakFluxRHSDepthWeight_mul_publicCorrectorEnergyErrorAverage_le_forceScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (n : ℕ) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (z : TriadicCube d → Vec d → Vec d) + (hz : + ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q (publicCoeffField Q a) z s n ≤ + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g := by + simpa [forcedSolutionWeakFluxCorrectorEnergyForceScale] using + _root_.Homogenization.weakFluxRHSDepthWeight_mul_correctorEnergyErrorAverage_le_forceScale + (Q := Q) (a := publicCoeffField Q a) (g := g) + (s := s) (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + n hs hs_lt.le (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + hg.memLp hg.partialSeminorms_bddAbove z hz + +theorem forcedSolutionWeakFluxCorrectorEnergyForceScale_mul_inv_one_sub_le_noteForceScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (g : Vec d → Vec d) {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + simpa [forcedSolutionWeakFluxCorrectorEnergyForceScale] using + _root_.Homogenization.weakFluxRHSCorrectorEnergyForceScale_mul_inv_one_sub_step_le_noteForceScale + Q (publicCoeffField Q a) g hs hs_le + +/-- Scalar expansion for the corrected weak-flux route after combining the +coefficient-energy component with the selected Neumann-corrector energy force +scale. -/ +theorem weakFluxRHSWeightedCoefficientEnergyBase_add_publicCorrectorEnergyForceScale_mul_inv_one_sub_le_noteEnergyForce + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (u g : Vec d → Vec d) {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (havg_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity (publicCoeffField Q a) u)) : + (weakFluxRHSWeightedCoefficientEnergyBase Q (publicCoeffField Q a) u s + + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hcoeff : + weakFluxRHSWeightedCoefficientEnergyBase Q (publicCoeffField Q a) u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u) := + weakFluxRHSWeightedCoefficientEnergyBase_mul_inv_one_sub_step_le_noteEnergySquare + Q (publicCoeffField Q a) u hs hs_le havg_nonneg + have hcorr : + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + forcedSolutionWeakFluxCorrectorEnergyForceScale_mul_inv_one_sub_le_noteForceScale + Q a g hs hs_le + calc + (weakFluxRHSWeightedCoefficientEnergyBase Q (publicCoeffField Q a) u s + + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + weakFluxRHSWeightedCoefficientEnergyBase Q (publicCoeffField Q a) u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + ring + _ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) u) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + add_le_add hcoeff hcorr + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Constructed.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Constructed.lean new file mode 100644 index 0000000000..56119791b2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/Constructed.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.CorrectorEnergy + +/-! # Constructed -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Weak flux RHS selection: constructed harmonic-remainder bridge +-/ + +noncomputable section + +/-- Depth-zero expanded RHS obtained after closing the `u`-tail by public +coarse Poincare and closing the harmonic-remainder `BV` tail by the selected +Neumann-corrector tail `Bω`. -/ +noncomputable def forcedSolutionWeakFluxSelectedNeumannTailExpandedRHS + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + (s : ℝ) {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (Bω : ℝ) : ℝ := + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * forcedSolutionWeakFluxPoincareTailBudget Q a s u + + (5 * s⁻¹) * + (4 * (forcedSolutionWeakFluxPoincareTailBudget Q a s u + Bω)) + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +theorem forcedSolutionGradientField_coarsePoincareRHSSn_le_weakFluxPoincareTailBudget_publicCoeffField + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffFamily d} + {g : Vec d → Vec d} {s : ℝ} + (u : ForcedCubeSolution Q a g) (hs : 0 < s) (hs_le : s ≤ 1) + (hg : ForceBesovRegularity Q s g) (m : ℕ) : + coarsePoincareRHSSn Q s (forcedSolutionGradientField u) m ≤ + forcedSolutionWeakFluxPoincareTailBudget Q a s u := by + simpa [forcedSolutionWeakFluxPoincareTailBudget] using + forcedSolutionGradientField_coarsePoincareRHSSn_le_expanded_publicCoeffField + (Q := Q) (a := a) (g := g) (s := s) u hs hs_le hg m + +/-- Public forced-solution specialization of the deterministic weak-flux +localized apex, with the harmonic-remainder tail inputs still explicit. -/ +theorem localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (m : ℕ) {BU BV : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s (forcedSolutionGradientField u) (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R), + (∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hs_le : s ≤ 1 := hs_lt.le + have hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn (a.coeffOn Q).lam (a.coeffOn Q).Lam + (cubeSet R) (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR + have hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) (publicH1ToCubeSet u.toH1).grad := by + intro R hR + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_memVectorL2_descendant_cubeSet u hR + have hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact memVectorL2_descendant_cubeSet_of_forceBesovRegularity hg hR + have hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R) := by + intro R _hR + exact h1CoerciveEstimateCubeSet R + have hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R (publicCoeffField Q a) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_openCubeDescendantDeterministicCoarseData_descendant Q a hR + have hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) + (publicCoeffField Q a)) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_descendant + (Q := Q) (a := a) hR hs + have hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (publicCoeffField Q a x) + ((publicH1ToCubeSet u.toH1).grad x))) := by + intro R hR S hS + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_child + (Q := Q) (R := R) (S := S) (a := a) (g := g) u hR hS hs + have huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (publicH1ToCubeSet u.toH1).grad) := by + intro R hR + rcases hR with ⟨j, hR⟩ + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + forcedSolutionGradientField_descendant_negativeBesovPartialSeminormTwo_bddAbove + (Q := Q) (R := R) (a := a) (g := g) u hR hs + have hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g)) := by + intro R hR + rcases hR with ⟨j, hR⟩ + exact forceBesovRegularity_descendant_centered_partialSeminorms_bddAbove hg hR + have hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q (publicCoeffField Q a) s + (publicH1ToCubeSet u.toH1).grad n) := by + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + weakFluxRHSScaledAveragedSeminormSq_bddAbove_publicCoeffField_forcedSolution + u hs + have hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (publicCoeffField Q a)) 1) := + publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_rpow_one + (Q := Q) (a := a) (s := s / 2) (by nlinarith) + have havg_parent_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) := + cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicH1ToCubeSet u.toH1).grad) + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) := by + intro j R hR + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + (publicH1ToCubeSet u.toH1).grad) + have hint : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity (publicCoeffField Q a) + (publicH1ToCubeSet u.toH1).grad) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (publicH1ToCubeSet u.toH1).grad_memVectorL2 + have hweak : + IsH1DirichletRhsWeakSolutionOn (publicCoeffField Q a) (cubeSet Q) + (publicH1ToCubeSet u.toH1) g := + isH1DirichletRhsWeakSolutionOn_publicCoeffField_cubeSet_of_isForcedEquation + (Q := Q) (a := a) (u := u.toH1) (g := g) u.weakSolution + have hu_tail' : + ∀ k : ℕ, coarsePoincareRHSSn Q s (publicH1ToCubeSet u.toH1).grad (m + k) ≤ BU := by + intro k + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using hu_tail k + have hvConstructed' : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R), + (∀ x ∈ cubeSet R, + (publicH1ToCubeSet u.toH1).grad x = + w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV := by + intro j R hR ω w hw + exact hvConstructed j R hR ω w + (by simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using hw) + simpa [forcedSolutionGradientField, publicH1ToCubeSet_grad] using + _root_.Homogenization.localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds_of_cubeVectorBesovHRegularity + (Q := Q) (a := publicCoeffField Q a) (s := s) (g := g) + (u := publicH1ToCubeSet u.toH1) + (lam := (a.coeffOn Q).lam) (Lam := (a.coeffOn Q).Lam) + hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc + hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc m hBdd + (publicCoeffField_isEllipticFieldOn_openCubeSet Q a) + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + hsum_half havg_parent_nonneg havg_nonneg hint hg + hBU_nonneg hBV_nonneg hu_tail' hvConstructed' + +/-- Public forced-solution weak-flux bridge with the coarse-Poincare tail +closed by the RHS Poincare theorem. The harmonic-remainder tail remains the +only theorem-specific input. -/ +theorem localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_constructed_harmonicRemainder_bounds_of_public_poincare_tail + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (m : ℕ) {BV : ℝ} + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hBV_nonneg : 0 ≤ BV) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction (publicCoeffField Q a) (cubeSet R), + (∀ x ∈ cubeSet R, + forcedSolutionGradientField u x = + w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + (5 * s⁻¹) * forcedSolutionWeakFluxPoincareTailBudget Q a s u + + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * + (LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a)) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + exact + localizedForcedSolutionPublicFlux_le_weakFluxExpandedRHS_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) u m + (BU := forcedSolutionWeakFluxPoincareTailBudget Q a s u) (BV := BV) + hs hs_lt hg (forcedSolutionWeakFluxPoincareTailBudget_nonneg u hs) + hBV_nonneg + (fun k => + forcedSolutionGradientField_coarsePoincareRHSSn_le_weakFluxPoincareTailBudget_publicCoeffField + (Q := Q) (a := a) (g := g) (s := s) u hs hs_lt.le hg (m + k)) + hvConstructed + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/CorrectorEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/CorrectorEnergy.lean new file mode 100644 index 0000000000..0ebd7a6db6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch03/Theorems/WeakFluxRHS/Selection/CorrectorEnergy.lean @@ -0,0 +1,558 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.WeakFluxRHS.Selection.Budgets + +/-! # Corrector Energy -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 + +/-! +# Weak flux RHS selection: corrected local energy bridge +-/ + +noncomputable section + +private theorem sqrt_2500_mul_fourth_mul_mul_mul_sq_mul_sq + {x y z u w : ℝ} (hy : 0 ≤ y) (hz : 0 ≤ z) + (hu : 0 ≤ u) (hw : 0 ≤ w) : + Real.sqrt (2500 * x ^ 4 * y * z * u ^ 2 * w ^ 2) = + 50 * x ^ 2 * Real.sqrt y * Real.sqrt z * u * w := by + have hx_sq_nonneg : 0 ≤ x ^ 2 := sq_nonneg x + calc + Real.sqrt (2500 * x ^ 4 * y * z * u ^ 2 * w ^ 2) + = + Real.sqrt (2500 * (x ^ 4 * (y * (z * (u ^ 2 * w ^ 2))))) := by + ring_nf + _ = + Real.sqrt 2500 * Real.sqrt (x ^ 4 * (y * (z * (u ^ 2 * w ^ 2)))) := by + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 2500)] + _ = + Real.sqrt 2500 * (Real.sqrt (x ^ 4) * Real.sqrt (y * (z * (u ^ 2 * w ^ 2)))) := by + rw [Real.sqrt_mul (by positivity : 0 ≤ x ^ 4)] + _ = + Real.sqrt 2500 * (x ^ 2 * (Real.sqrt y * Real.sqrt (z * (u ^ 2 * w ^ 2)))) := by + rw [show x ^ 4 = (x ^ 2) ^ 2 by ring] + rw [Real.sqrt_sq hx_sq_nonneg] + rw [Real.sqrt_mul hy] + _ = + Real.sqrt 2500 * (x ^ 2 * (Real.sqrt y * (Real.sqrt z * Real.sqrt (u ^ 2 * w ^ 2)))) := by + rw [Real.sqrt_mul hz] + _ = + Real.sqrt 2500 * (x ^ 2 * (Real.sqrt y * (Real.sqrt z * (u * w)))) := by + rw [show u ^ 2 * w ^ 2 = (u * w) ^ 2 by ring] + rw [Real.sqrt_sq (mul_nonneg hu hw)] + _ = 50 * x ^ 2 * Real.sqrt y * Real.sqrt z * u * w := by + rw [show Real.sqrt (2500 : ℝ) = 50 by + calc + Real.sqrt (2500 : ℝ) = Real.sqrt ((50 : ℝ) ^ 2) := by norm_num + _ = 50 := Real.sqrt_sq (by norm_num : 0 ≤ (50 : ℝ))] + ring + +/-- Corrected weak-flux public bridge with the local Neumann-corrector selector +already supplied. The coefficient-energy component is closed by public +multiscale ellipticity, while the corrector-energy component is closed by the +public averaged Neumann-corrector energy estimate. -/ +theorem localizedForcedSolutionPublicFlux_le_weakFluxCorrectorEnergyExpandedRHS_of_correctorEnergySelector + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (z : TriadicCube d → Vec d → Vec d) (m : ℕ) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R (publicCoeffField Q a) + (forcedSolutionGradientField u) (z R) s) + (hz : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hs_le : s ≤ 1 := hs_lt.le + have hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q (publicCoeffField Q a) s + (forcedSolutionGradientField u) n) := + weakFluxRHSScaledAveragedSeminormSq_bddAbove_publicCoeffField_forcedSolution + u hs + have hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) + (publicCoeffField Q a)) 1) := + publicCoeffField_summable_qtwo_maxDescendantBBlockNormAtScale_rpow_one + (Q := Q) (a := a) (s := s / 2) (by nlinarith) + have havg_parent_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) := + cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (forcedSolutionGradientField u)) + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) := by + intro n R hR + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_descendant_cubeSet Q a hR) + (forcedSolutionGradientField u)) + have hint : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (forcedSolutionGradientField_memVectorL2_cubeSet u) + let Bcoeff : ℝ := + weakFluxRHSWeightedCoefficientEnergyBase Q (publicCoeffField Q a) + (forcedSolutionGradientField u) s + let Bcorr : ℝ := forcedSolutionWeakFluxCorrectorEnergyForceScale Q a s g + have hBcoeff_nonneg : 0 ≤ Bcoeff := by + dsimp [Bcoeff] + exact + weakFluxRHSWeightedCoefficientEnergyBase_nonneg Q (publicCoeffField Q a) + (forcedSolutionGradientField u) hs havg_parent_nonneg + have hBcorr_nonneg : 0 ≤ Bcorr := by + dsimp [Bcorr] + exact forcedSolutionWeakFluxCorrectorEnergyForceScale_nonneg hs + have hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q (publicCoeffField Q a) + (forcedSolutionGradientField u) s (m + k) ≤ Bcoeff := by + intro k + dsimp [Bcoeff] + exact + weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_weightedCoefficientEnergyBase + Q (publicCoeffField Q a) (forcedSolutionGradientField u) (m + k) + hs (publicCoeffField_isEllipticFieldOn_openCubeSet Q a) + (publicCoeffField_openCubeDescendantDeterministicCoarseData Q a) + hsum_half (havg_nonneg (m + k)) hint + have hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q (publicCoeffField Q a) + z s (m + k) ≤ Bcorr := by + intro k + dsimp [Bcorr] + exact + weakFluxRHSDepthWeight_mul_publicCorrectorEnergyErrorAverage_le_forceScale + (Q := Q) (a := a) (s := s) (g := g) (n := m + k) + hs hs_lt hg z (hz (m + k)) + have hmain : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((Bcoeff + Bcorr) * (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := + _root_.Homogenization.localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_correctorEnergyComponents_bddAbove + Q (publicCoeffField Q a) s (forcedSolutionGradientField u) z hs + hlocal m hBdd hBcoeff_nonneg hBcorr_nonneg hcoeff hcorr + have hscalar : + (Bcoeff + Bcorr) * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [Bcoeff, Bcorr] + exact + weakFluxRHSWeightedCoefficientEnergyBase_add_publicCorrectorEnergyForceScale_mul_inv_one_sub_le_noteEnergyForce + Q a (forcedSolutionGradientField u) g hs hs_le havg_parent_nonneg + have hweight_nonneg : 0 ≤ (coarsePoincareRHSDepthWeight s m)⁻¹ := + inv_nonneg.mpr + (by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) + exact hmain.trans + (Real.sqrt_le_sqrt (mul_le_mul_of_nonneg_left hscalar hweight_nonneg)) + +/-- Depth-zero corrected weak-flux bridge with the left-hand side expressed as +the public finite-`2` negative Besov norm of the forced flux. -/ +theorem scaleNormalizedForcedFlux_le_weakFluxCorrectorEnergyExpandedRHS_of_correctorEnergySelector + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R (publicCoeffField Q a) + (forcedSolutionGradientField u) (z R) s) + (hz : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let F : Vec d → Vec d := + fun x => matVecMul (publicCoeffField Q a x) (forcedSolutionGradientField u x) + have hloc : + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 ≤ + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + simpa [F, coarsePoincareRHSDepthWeight] using + localizedForcedSolutionPublicFlux_le_weakFluxCorrectorEnergyExpandedRHS_of_correctorEnergySelector + (Q := Q) (a := a) (s := s) (g := g) u z 0 hs hs_lt hg + hlocal hz + have hF_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N F) := by + simpa [F] using + forcedSolutionPublicFlux_negativeBesovPartialSeminormTwo_bddAbove_descendant + (Q := Q) (R := Q) (a := a) (g := g) (j := 0) u + (by simp [descendantsAtDepth_zero]) hs + have hF_nonneg : 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s F := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s F hF_bdd + have hdepth : + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 = + cubeBesovNegativeVectorSeminormTwo Q s F := + localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg + Q s F hF_nonneg + calc + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) + = + cubeBesovNegativeVectorSeminormTwo Q s F := by + simpa [F] using + scaleNormalizedNegativeBesovVectorNorm_forcedSolutionFluxField_finite_two_eq_cubeBesovNegativeVectorSeminormTwo_publicCoeffField + Q a s u + _ = + localizedFluxDefectNegativeBesovAverageTwo Q s F 0 := hdepth.symm + _ ≤ + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := hloc + +/-- The corrected weak-flux square-root envelope is absorbed by the public +weak-flux RHS once the theorem constant dominates the two displayed +dimension-only scalars. -/ +theorem weakFluxCorrectorEnergyExpandedRHS_le_weakFluxWithRHSRHS_of_constant + {d : ℕ} [NeZero d] {C : ℝ} + (hC_energy : Real.sqrt 50 ≤ C) + (hC_force : + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + {Q : TriadicCube d} {a : CoeffFamily d} + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) : + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + weakFluxWithRHSRHS (((d : ℝ) ^ 2) * C) Q a s g u := by + let L : ℝ := LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) + let l : ℝ := lambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let D : ℝ := + (d : ℝ) * (Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2) + have hs_le : s ≤ 1 := hs_lt.le + have hC_nonneg : 0 ≤ C := + (Real.sqrt_nonneg 50).trans hC_energy + have hL_nonneg : 0 ≤ L := by + simpa [L] using + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hl_nonneg : 0 ≤ l := by + simpa [l] using + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 + (publicCoeffField Q a) (by norm_num) + (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hl_inv_nonneg : 0 ≤ l⁻¹ := inv_nonneg.mpr hl_nonneg + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (publicCoeffField_isEllipticFieldOn_cubeSet Q a) + (forcedSolutionGradientField u)) + have hB_nonneg : 0 ≤ B := by + simpa [B, scaleNormalizedPositiveBesovVectorSeminormTwo] using + scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := Q) (s := s) (g := g) hg + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hD_le : + D ≤ + (d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2) := by + dsimp [D] + have hpow : + Real.rpow (3 : ℝ) ((d : ℝ) + s) ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + (by linarith) + have hinner : + Real.rpow (3 : ℝ) ((d : ℝ) + s) * Real.sqrt 2 ≤ + Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2 := + mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg 2) + exact mul_le_mul_of_nonneg_left hinner (by exact_mod_cast Nat.zero_le d) + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hs_inv_sq_nonneg : 0 ≤ (s⁻¹) ^ 2 := sq_nonneg s⁻¹ + have hs_inv_sq_le : + (s⁻¹) ^ 2 ≤ Real.rpow s (-(5 / 2 : ℝ)) := by + calc + (s⁻¹) ^ 2 = Real.rpow s (-2 : ℝ) := by + rw [show (s⁻¹) ^ 2 = (s ^ (2 : ℕ))⁻¹ by field_simp [hs.ne']] + rw [show s ^ (2 : ℕ) = Real.rpow s (2 : ℝ) by + simp] + rw [show (Real.rpow s (2 : ℝ))⁻¹ = Real.rpow s (-(2 : ℝ)) by + simp] + _ ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_le_rpow_of_exponent_ge hs hs_le (by norm_num) + have hA_nonneg : 0 ≤ 50 * (s⁻¹) ^ 2 * L * E := by + positivity + have hF_nonneg : 0 ≤ 2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2 := by + positivity + have hsqrtA : + Real.sqrt (50 * (s⁻¹) ^ 2 * L * E) = + Real.sqrt 50 * s⁻¹ * Real.sqrt L * Real.sqrt E := by + calc + Real.sqrt (50 * (s⁻¹) ^ 2 * L * E) + = Real.sqrt (50 * ((s⁻¹) ^ 2 * (L * E))) := by ring_nf + _ = + Real.sqrt 50 * Real.sqrt ((s⁻¹) ^ 2 * (L * E)) := by + rw [Real.sqrt_mul (by norm_num : (0 : ℝ) ≤ 50)] + _ = + Real.sqrt 50 * + (Real.sqrt ((s⁻¹) ^ 2) * Real.sqrt (L * E)) := by + rw [Real.sqrt_mul (sq_nonneg s⁻¹)] + _ = + Real.sqrt 50 * (s⁻¹ * (Real.sqrt L * Real.sqrt E)) := by + rw [Real.sqrt_sq hs_inv_nonneg, Real.sqrt_mul hL_nonneg] + _ = Real.sqrt 50 * s⁻¹ * Real.sqrt L * Real.sqrt E := by ring + have hsqrtF : + Real.sqrt (2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2) = + 50 * (s⁻¹) ^ 2 * Real.sqrt L * Real.sqrt l⁻¹ * D * B := by + exact sqrt_2500_mul_fourth_mul_mul_mul_sq_mul_sq + hL_nonneg hl_inv_nonneg hD_nonneg hB_nonneg + have henergy : + Real.sqrt (50 * (s⁻¹) ^ 2 * L * E) ≤ + C * s⁻¹ * Real.sqrt L * Real.sqrt E := by + have hcoeff : + Real.sqrt 50 * s⁻¹ ≤ C * s⁻¹ := + mul_le_mul_of_nonneg_right hC_energy hs_inv_nonneg + have htail : 0 ≤ Real.sqrt L * Real.sqrt E := + mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + calc + Real.sqrt (50 * (s⁻¹) ^ 2 * L * E) + = (Real.sqrt 50 * s⁻¹) * (Real.sqrt L * Real.sqrt E) := by + rw [hsqrtA] + ring + _ ≤ (C * s⁻¹) * (Real.sqrt L * Real.sqrt E) := + mul_le_mul_of_nonneg_right hcoeff htail + _ = C * s⁻¹ * Real.sqrt L * Real.sqrt E := by ring + have hforce : + Real.sqrt (2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2) ≤ + C * Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt L * Real.sqrt l⁻¹ * B := by + have hconstD : 50 * D ≤ C := by + calc + 50 * D ≤ + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) := + mul_le_mul_of_nonneg_left hD_le (by norm_num : 0 ≤ (50 : ℝ)) + _ ≤ C := hC_force + have hcoeff : + (50 * D) * (s⁻¹) ^ 2 ≤ + C * Real.rpow s (-(5 / 2 : ℝ)) := + mul_le_mul hconstD hs_inv_sq_le hs_inv_sq_nonneg hC_nonneg + have htail : 0 ≤ Real.sqrt L * Real.sqrt l⁻¹ * B := + mul_nonneg + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) + hB_nonneg + calc + Real.sqrt (2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2) + = + ((50 * D) * (s⁻¹) ^ 2) * + (Real.sqrt L * Real.sqrt l⁻¹ * B) := by + rw [hsqrtF] + ring + _ ≤ + (C * Real.rpow s (-(5 / 2 : ℝ))) * + (Real.sqrt L * Real.sqrt l⁻¹ * B) := + mul_le_mul_of_nonneg_right hcoeff htail + _ = + C * Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt L * Real.sqrt l⁻¹ * B := by ring + calc + Real.sqrt + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a) * + cubeAverage Q + (coefficientEnergyDensity (publicCoeffField Q a) + (forcedSolutionGradientField u)) + + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) (publicCoeffField Q a) * + (lambdaSq Q (s / 2) (.finite 2) + (publicCoeffField Q a))⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + = + Real.sqrt + (50 * (s⁻¹) ^ 2 * L * E + + 2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2) := by + simp [L, l, E, B, D] + _ ≤ + Real.sqrt (50 * (s⁻¹) ^ 2 * L * E) + + Real.sqrt (2500 * (s⁻¹) ^ 4 * L * l⁻¹ * D ^ 2 * B ^ 2) := + sqrt_add_le_add_sqrt_of_nonneg hA_nonneg hF_nonneg + _ ≤ + C * s⁻¹ * Real.sqrt L * Real.sqrt E + + C * Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt L * Real.sqrt l⁻¹ * B := + add_le_add henergy hforce + _ = + C * + (s⁻¹ * Real.sqrt L * Real.sqrt E + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt L * Real.sqrt l⁻¹ * B) := by ring + _ ≤ weakFluxWithRHSRHS (((d : ℝ) ^ 2) * C) Q a s g u := by + simpa [L, l, E, B] using + weakFluxRHSBound_publicCoeffField_le_dim_sq_mul_public + (d := d) C Q a u hC_nonneg hs hB_nonneg + +/-- Public weak-flux estimate from a supplied corrected local selector, after +absorbing the corrected square-root envelope into `weakFluxWithRHSRHS`. -/ +theorem scaleNormalizedForcedFlux_le_weakFluxWithRHSRHS_of_correctorEnergySelector + {d : ℕ} [NeZero d] {C : ℝ} + (hC_energy : Real.sqrt 50 ≤ C) + (hC_force : + 50 * ((d : ℝ) * + (Real.rpow (3 : ℝ) ((d : ℝ) + 1) * Real.sqrt 2)) ≤ C) + (Q : TriadicCube d) (a : CoeffFamily d) + {s : ℝ} {g : Vec d → Vec d} (u : ForcedCubeSolution Q a g) + (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) (hs_lt : s < 1) (hg : ForceBesovRegularity Q s g) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (publicCoeffField Q a x) + (forcedSolutionGradientField u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R (publicCoeffField Q a) + (forcedSolutionGradientField u) (z R) s) + (hz : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R (publicCoeffField Q a) + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) : + scaleNormalizedNegativeBesovVectorNorm Q s (.finite 2) + (forcedSolutionFluxField Q a u) ≤ + weakFluxWithRHSRHS (((d : ℝ) ^ 2) * C) Q a s g u := by + exact + (scaleNormalizedForcedFlux_le_weakFluxCorrectorEnergyExpandedRHS_of_correctorEnergySelector + (Q := Q) (a := a) (s := s) (g := g) u z hs hs_lt hg hlocal hz).trans + (weakFluxCorrectorEnergyExpandedRHS_le_weakFluxWithRHSRHS_of_constant + (d := d) (C := C) hC_energy hC_force + (Q := Q) (a := a) (s := s) (g := g) u hs hs_lt hg) + +end + +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04.lean new file mode 100644 index 0000000000..f6b95c3bd3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.MuLocalityGate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Observable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Source +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems + +/-! +# Chapter 4 + +Chapter 4 exposes source-facing laws, local observables, annealed objects, and +theorem APIs used by later chapters. Its unprefixed law, locality, and +observable facade names have the exact coarse-source, integral-local semantics. +The pointwise-restriction/sup-metric engineering lane is explicit throughout: +its semantic API names begin with `Restriction`, including +`RestrictionCoeffLaw`, `RestrictionLawCarrier`, and `RestrictionObservable`. + +Route-specific witnesses and proof packages live under `Internal` namespaces or +inside private declarations. The `Source` umbrella faithfully imports the +current Chapter 4 source modules, while the restriction lane remains available +through its explicit modules and endpoints. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedDefinitions.lean new file mode 100644 index 0000000000..1e5ee50feb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedDefinitions.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic + +/-! # Annealed Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Annealed coarse definitions + +This file owns the Chapter 4 definitions of annealed coarse matrices and +response observables. Scalarization witnesses and route data live in +`Homogenization.Book.Ch04.Internal.ScalarizationWitnesses`. +-/ + +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- The annealed doubled coarse-grained matrix `\overline{\mathbf A}(U)`, +obtained by averaging each deterministic coarse matrix entry. -/ +noncomputable def annealedBlockMatrix {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : BlockMat d := + { upperLeft := fun i j => ∫ a, (coarseBlockMatrix U a.toFun).upperLeft i j ∂P + upperRight := fun i j => ∫ a, (coarseBlockMatrix U a.toFun).upperRight i j ∂P + lowerLeft := fun i j => ∫ a, (coarseBlockMatrix U a.toFun).lowerLeft i j ∂P + lowerRight := fun i j => ∫ a, (coarseBlockMatrix U a.toFun).lowerRight i j ∂P } + +/-- The annealed starred block matrix +`\overline{\mathbf A}_{*,n}^{-1}`. -/ +noncomputable def annealedStarredBlockMatrixInv {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) : BlockMat d := + blockReflect (annealedBlockMatrix P U) + +/-- The annealed inverse-star matrix `\overline\sigma_*^{-1}(U)`. -/ +noncomputable def annealedSigmaStarInv {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : Mat d := + (annealedBlockMatrix P U).lowerRight + +/-- The annealed starred matrix `\overline\sigma_*(U)`. -/ +noncomputable def annealedSigmaStar {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : Mat d := + (annealedSigmaStarInv P U)⁻¹ + +/-- The annealed mixed block +`E[\sigma_*^{-1}(U; a)\kappa(U; a)]`. -/ +noncomputable def annealedSigmaStarInvKappaMean {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) : Mat d := + -((annealedBlockMatrix P U).lowerLeft) + +/-- The annealed coupling matrix `\overline\kappa(U)`. -/ +noncomputable def annealedKappa {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : Mat d := + annealedSigmaStar P U * annealedSigmaStarInvKappaMean P U + +/-- The annealed upper-left block `\overline b(U)`. -/ +noncomputable def annealedB {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : Mat d := + (annealedBlockMatrix P U).upperLeft + +/-- The annealed conductivity matrix +`\overline\sigma = \overline b - \overline\kappa^t +\overline\sigma_*^{-1}\overline\kappa`. -/ +noncomputable def annealedSigma {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) : Mat d := + annealedB P U + - matTranspose (annealedKappa P U) * annealedSigmaStarInv P U * annealedKappa P U + +@[simp] theorem annealedBlockMatrix_upperLeft_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + (annealedBlockMatrix P U).upperLeft i j = + ∫ a, (coarseBlockMatrix U a.toFun).upperLeft i j ∂P := + rfl + +@[simp] theorem annealedBlockMatrix_upperRight_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + (annealedBlockMatrix P U).upperRight i j = + ∫ a, (coarseBlockMatrix U a.toFun).upperRight i j ∂P := + rfl + +@[simp] theorem annealedBlockMatrix_lowerLeft_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + (annealedBlockMatrix P U).lowerLeft i j = + ∫ a, (coarseBlockMatrix U a.toFun).lowerLeft i j ∂P := + rfl + +@[simp] theorem annealedBlockMatrix_lowerRight_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + (annealedBlockMatrix P U).lowerRight i j = + ∫ a, (coarseBlockMatrix U a.toFun).lowerRight i j ∂P := + rfl + +@[simp] theorem annealedSigmaStarInv_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + annealedSigmaStarInv P U i j = + ∫ a, (coarseBlockMatrix U a.toFun).lowerRight i j ∂P := + rfl + +@[simp] theorem annealedSigmaStarInvKappaMean_apply {d : ℕ} + (P : RestrictionCoeffLaw d) (U : Set (Vec d)) (i j : Fin d) : + annealedSigmaStarInvKappaMean P U i j = + -(∫ a, (coarseBlockMatrix U a.toFun).lowerLeft i j ∂P) := by + simp [annealedSigmaStarInvKappaMean] + +@[simp] theorem annealedB_apply {d : ℕ} (P : RestrictionCoeffLaw d) + (U : Set (Vec d)) (i j : Fin d) : + annealedB P U i j = + ∫ a, (coarseBlockMatrix U a.toFun).upperLeft i j ∂P := + rfl + +/-- Annealed block matrix on the origin cube at scale `n`. -/ +noncomputable def annealedBlockMatrixAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : BlockMat d := + annealedBlockMatrix P (cubeSet (originCube d n)) + +/-- Annealed starred block matrix on the origin cube at scale `n`. -/ +noncomputable def annealedStarredBlockMatrixInvAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : BlockMat d := + annealedStarredBlockMatrixInv P (cubeSet (originCube d n)) + +/-- Annealed inverse-star matrix on the origin cube at scale `n`. -/ +noncomputable def annealedSigmaStarInvAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedSigmaStarInv P (cubeSet (originCube d n)) + +/-- Annealed starred matrix on the origin cube at scale `n`. -/ +noncomputable def annealedSigmaStarAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedSigmaStar P (cubeSet (originCube d n)) + +/-- Annealed mixed block on the origin cube at scale `n`. -/ +noncomputable def annealedSigmaStarInvKappaMeanAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedSigmaStarInvKappaMean P (cubeSet (originCube d n)) + +/-- Annealed coupling matrix on the origin cube at scale `n`. -/ +noncomputable def annealedKappaAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedKappa P (cubeSet (originCube d n)) + +/-- Annealed upper-left block on the origin cube at scale `n`. -/ +noncomputable def annealedBAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedB P (cubeSet (originCube d n)) + +/-- Annealed conductivity matrix on the origin cube at scale `n`. -/ +noncomputable def annealedSigmaAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Mat d := + annealedSigma P (cubeSet (originCube d n)) + +/-- Response functional on the origin cube at scale `n`. -/ +noncomputable def responseJAtScale {d : ℕ} + (n : ℤ) (p q : Vec d) (a : CoeffField d) : ℝ := + ResponseJ (cubeSet (originCube d n)) p q a + +/-- Response functional on an arbitrary triadic cube. -/ +noncomputable def responseJOnCube {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) (a : CoeffField d) : ℝ := + ResponseJ (cubeSet Q) p q a + +/-- Annealed response functional on the origin cube at scale `n`. -/ +noncomputable def annealedResponseJAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) (p q : Vec d) : ℝ := + ∫ a, responseJAtScale n p q a.toFun ∂P + +/-- Full unfolded coarse block observable on a deterministic triadic cube. -/ +noncomputable def coarseFullBlockMatrixAtCube {d : ℕ} + (Q : TriadicCube d) : RegCoeffField d → FullBlockMat d := + fun a => coarseFullBlockMatrixObservable (cubeSet Q) a.toFun + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedObjects.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedObjects.lean new file mode 100644 index 0000000000..55bad7d6e2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/AnnealedObjects.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.ScalarizationWitnesses + +/-! +# Annealed coarse objects + +Compatibility import for the Chapter 4 annealed-object layer. + +The public annealed matrix and response definitions live in +`Homogenization.Book.Ch04.AnnealedDefinitions`. Route-specific scalarization +witnesses live under `Homogenization.Book.Ch04.Internal`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/CoeffFamily.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/CoeffFamily.lean new file mode 100644 index 0000000000..6664e36a61 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/CoeffFamily.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law + +/-! # Coeff Family -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Dependent coefficient-family bridge + +The reboot avoids the old totalized coefficient-field bridge. To build Chapter +2 objects from a Chapter 4 coefficient field, callers provide the actual +`AELocallyUniformlyEllipticField` witness. This keeps support assumptions +explicit and prevents hidden identity-totalization wrappers from leaking into +Chapter 5. +-/ + +/-- The Chapter 2 coefficient object on one triadic cube obtained from a +Chapter 4 a.e. ellipticity witness. -/ +noncomputable def coeffOnOfAEEllipticOn {d : ℕ} (a : RegCoeffField d) + (Q : TriadicCube d) + (hQ : ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ + AEEllipticOn lam Lam (openCubeSet Q) a) : + Ch02.CoeffOn (Ch02.cubeDomain Q) := + let lam := Classical.choose hQ + let hLam := Classical.choose_spec hQ + let Lam := Classical.choose hLam + let hData := Classical.choose_spec hLam + { toCoeffField := a.toFun + lam := lam + Lam := Lam + lam_pos := hData.1 + lam_le_Lam := hData.2.1 + aeStronglyMeasurable := by + intro i j + have hEll : + IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun := hData.2.2 + simpa [Ch02.cubeDomain_coe] using + IsAEEllipticFieldOn.aestronglyMeasurable_restrictCoeffField_apply hEll i j + aeElliptic := by + have hEll : + IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun := hData.2.2 + simpa [Ch02.cubeDomain_coe] using + IsAEEllipticFieldOn.ae_isEllipticMatrix hEll } + +@[simp] theorem coeffOnOfAEEllipticOn_toCoeffField {d : ℕ} + (a : RegCoeffField d) (Q : TriadicCube d) + (hQ : ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ + AEEllipticOn lam Lam (openCubeSet Q) a) : + (coeffOnOfAEEllipticOn a Q hQ).toCoeffField = a.toFun := + rfl + +/-- The Chapter 2 triadic coefficient family associated to a Chapter 4 +a.e.-locally elliptic coefficient field. -/ +noncomputable def triadicCoeffFamilyOfAELocallyUniformlyEllipticField {d : ℕ} + (a : RegCoeffField d) (h : AELocallyUniformlyEllipticField a) : + Ch02.TriadicCoeffFamily d where + coeffOn := fun Q => coeffOnOfAEEllipticOn a Q (h Q) + restrictsTo_of_subset := by + intro Q R _hsub + change a.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain R : Set (Vec d))] a.toFun + exact Filter.EventuallyEq.rfl + +@[simp] +theorem triadicCoeffFamilyOfAELocallyUniformlyEllipticField_coeffOn_toCoeffField + {d : ℕ} (a : RegCoeffField d) (h : AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) : + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h).coeffOn Q).toCoeffField = + a.toFun := + rfl + +/-- Changing only ellipticity witnesses does not change the associated triadic +family modulo Chapter 2 a.e. equality. -/ +theorem triadicCoeffFamilyOfAELocallyUniformlyEllipticField_aeeq {d : ℕ} + {a : RegCoeffField d} (h₁ h₂ : AELocallyUniformlyEllipticField a) : + Ch02.TriadicCoeffFamily.AEEq + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h₁) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h₂) := by + intro Q + change a.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] a.toFun + exact Filter.EventuallyEq.rfl + +/-- If two fields agree a.e. on every triadic cube, their dependent Chapter 2 +triadic coefficient families agree a.e. on every cube. -/ +theorem triadicCoeffFamilyOfAELocallyUniformlyEllipticField_aeeq_of_forall_ae_eq + {d : ℕ} {a b : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) + (hb : AELocallyUniformlyEllipticField b) + (hab : ∀ Q : TriadicCube d, + a.toFun =ᵐ[volumeMeasureOn (openCubeSet Q)] b.toFun) : + Ch02.TriadicCoeffFamily.AEEq + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField b hb) := by + intro Q + change a.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] b.toFun + simpa [Ch02.cubeDomain_coe] using hab Q + +/-- A one-cube a.e. equality of ambient fields gives a.e. equality of the +corresponding Chapter 2 coefficient objects on that cube. -/ +theorem coeffOnOfAELocallyUniformlyEllipticField_aeeq_of_ae_eq_on_openCubeSet + {d : ℕ} {a b : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) + (hb : AELocallyUniformlyEllipticField b) + (Q : TriadicCube d) + (hab : a.toFun =ᵐ[volumeMeasureOn (openCubeSet Q)] b.toFun) : + Ch02.CoeffOn.AEEq + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField b hb).coeffOn Q) := by + change a.toFun =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] b.toFun + simpa [Ch02.cubeDomain_coe] using hab + +namespace RestrictionLawCarrier + +/-- A Chapter 4 law carrier supplies, almost surely, the dependent Chapter 2 +triadic coefficient family associated to the sampled coefficient field. -/ +theorem ae_coeffFamily_exists {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) : + ∀ᵐ a ∂P, + ∃ h : AELocallyUniformlyEllipticField a, + ∃ F : Ch02.TriadicCoeffFamily d, + F = triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h := by + filter_upwards [hP.ae_locally_uniformly_elliptic] with a ha + exact ⟨ha, triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha, rfl⟩ + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Definitions.lean new file mode 100644 index 0000000000..113d85788d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Definitions.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.CoeffFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions + +/-! +# Chapter 4 definitions + +Canonical public imports for the Chapter 4 reboot. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal.lean new file mode 100644 index 0000000000..d65486005d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.PartitionAverageMomentHelpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.ScalarizationWitnesses + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly.lean new file mode 100644 index 0000000000..b1d9379d9c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMinimizerFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/BlockEnergyAverage.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/BlockEnergyAverage.lean new file mode 100644 index 0000000000..0dbfc659d3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/BlockEnergyAverage.lean @@ -0,0 +1,1074 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator + +/-! # Block Energy Average -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# AEE quantitative slice assembly + +## Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** the probability-facing replacement of the pointwise +quantitative-slice handoff. Re-routes the block-energy-average +measurability of `Internal/FixedCompetitorEnergyMeasurability` through the +a.e.-elliptic slice predicate `AEEQuantitativeEllipticSlice`, so the +local-test σ-algebra lane only needs a.e. quantitative ellipticity +information rather than a pointwise total cover. + +**Consumed by:** `AEESliceAssembly/MuFamily.lean`, then +`Theorems/Mu.lean :: aemeasurable_Mu_cubeSet` and the AEE-slice +specialization +`aemeasurable_Mu_cubeSet_of_measurable_aeeQuantitativeSlice`. + +Downstream developments should consume this through high-level +measurability bridges (e.g. `HasMeasurableMuFamily`) rather than threading +AEE-slice predicates through deterministic estimates. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem AEEQuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}) : + ∀ᵐ x ∂ volumeMeasureOn U, + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x ∈ + quantitativeEllipticHilbertMatSet d k := by + filter_upwards + [AEEQuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a, + MeasureTheory.ae_restrict_mem a.2.1, + a.2.2.2] + with x hcoeff hxU hxEll + rw [hcoeff] + simpa [quantitativeEllipticHilbertMatSet, restrictCoeffField, hxU] using hxEll + +theorem AEEQuantitativeEllipticSlice.ae_fullBlockCoeffEntry_toHilbertMatrixL2_eq + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}) + (α β : BlockCoord d) : + (fun x => toFullBlockMat (blockCoeffField a.1 x) α β) + =ᵐ[volumeMeasureOn U] + fun x => + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) α β := by + filter_upwards + [AEEQuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a, + MeasureTheory.ae_restrict_mem a.2.1] + with x hcoeff hxU + rw [hcoeff] + simp [blockCoeffField, restrictCoeffField, hxU] + +theorem AEEQuantitativeEllipticSlice.weightedFullBlockCoeffEntryIntegral_eq_hilbertMatrixL2 + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}) + (w : Vec d → ℝ) (α β : BlockCoord d) : + ∫ x in U, w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume = + ∫ x, + w x * + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) α β + ∂volumeMeasureOn U := by + unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [AEEQuantitativeEllipticSlice.ae_fullBlockCoeffEntry_toHilbertMatrixL2_eq a α β] + with x hx + rw [hx] + +theorem AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzExtension + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} {Q : HilbertMat d → ℝ} (hQ : LipschitzWith K Q) + (hQ_eq : + ∀ A ∈ quantitativeEllipticHilbertMatSet d k, + Q A = toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + rw [show + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) = + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x, + w x * Q (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x) + ∂volumeMeasureOn U by + funext a + calc + ∫ x in U, w x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume = + ∫ x, + w x * + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) α β + ∂volumeMeasureOn U := + AEEQuantitativeEllipticSlice.weightedFullBlockCoeffEntryIntegral_eq_hilbertMatrixL2 + a w α β + _ = + ∫ x, + w x * Q (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x) + ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [AEEQuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet + a] + with x hx + rw [hQ_eq _ hx]] + exact measurable_l2WeightedHilbertMatrixLipschitzIntegral hToL2 hw hQ + +theorem AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzOn + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} + (hLip : + LipschitzOnWith K + (fun A : HilbertMat d => toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) + (quantitativeEllipticHilbertMatSet d k)) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + obtain ⟨Q, hQ_lip, hQ_eq_on⟩ := hLip.extend_real + refine + AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzExtension + hToL2 hw α β hQ_lip ?_ + intro A hA + exact (hQ_eq_on hA).symm + +theorem AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzOn + hToL2 hw α β + (lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_quantitative α β) + +theorem AEEQuantitativeEllipticSlice.integrable_weightedFullBlockCoeffEntry_of_integrable + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {k : ℕ} {w : Vec d → ℝ} (hSlice : AEEQuantitativeEllipticSlice U k a) + (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + MeasureTheory.Integrable + (fun x => w x * toFullBlockMat (blockCoeffField a x) α β) + (volumeMeasureOn U) := by + classical + let coeff : Vec d → ℝ := fun x => toFullBlockMat (blockCoeffField a x) α β + let aSub : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := ⟨a, hSlice⟩ + have hcoeff_ae : AEMeasurable coeff (volumeMeasureOn U) := by + have htarget : + AEMeasurable + (fun x : Vec d => + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 aSub x).toMat) α β) + (volumeMeasureOn U) := + (measurable_fullBlockCoeffEntry_hilbertMat α β).comp_aemeasurable + (MeasureTheory.Lp.aestronglyMeasurable + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 aSub)).aemeasurable + exact htarget.congr + (AEEQuantitativeEllipticSlice.ae_fullBlockCoeffEntry_toHilbertMatrixL2_eq + aSub α β).symm + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖coeff x‖ ≤ Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) := by + filter_upwards [hSlice.ae_isEllipticMatrix] with x hxEll + simpa [coeff, blockCoeffField, Real.norm_eq_abs] using + abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix + (A := a x) hxEll α β + simpa [coeff] using hw.mul_bdd hcoeff_ae.aestronglyMeasurable hbound + +theorem AEEQuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral_of_measurable + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw_meas : Measurable w) + (hw_int : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + classical + let μ := volumeMeasureOn U + let C : ℝ := + Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) + let s : ℕ → Vec d → ℝ := + fun n => MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n + have hs_L2 : ∀ n, MemScalarL2 U (s n) := by + intro n + simpa [MemScalarL2, μ, s] using + (MeasureTheory.SimpleFunc.memLp_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n) + (2 : ℝ≥0∞) (volumeMeasureOn U)) + have hs_meas : + ∀ n, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + s n x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := by + intro n + exact + AEEQuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral + hToL2 (hs_L2 n) α β + have hs_tendsto : + Filter.Tendsto + (fun n : ℕ => + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, + s n x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) + atTop + (𝓝 + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := by + rw [tendsto_pi_nhds] + intro a + have hprod_int : + MeasureTheory.Integrable + (fun x => w x * toFullBlockMat (blockCoeffField a.1 x) α β) μ := by + simpa [μ] using + a.2.integrable_weightedFullBlockCoeffEntry_of_integrable hw_int α β + have hs_prod_int : + ∀ n, + MeasureTheory.Integrable + (fun x => s n x * toFullBlockMat (blockCoeffField a.1 x) α β) μ := by + intro n + have hs_int : + MeasureTheory.Integrable (s n) μ := by + simpa [s, μ] using + (MeasureTheory.SimpleFunc.integrable_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n)) + simpa [μ] using + a.2.integrable_weightedFullBlockCoeffEntry_of_integrable hs_int α β + have hcoeff_bound : + ∀ᵐ x ∂ μ, + ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ ≤ C := by + filter_upwards [a.2.2.2] with x hxEll + simpa [μ, C, blockCoeffField, Real.norm_eq_abs] using + abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix + (A := a.1 x) hxEll α β + have hbound : + ∀ n, + ∀ᵐ x ∂ μ, + ‖s n x * toFullBlockMat (blockCoeffField a.1 x) α β‖ ≤ + (2 * C) * ‖w x‖ := by + intro n + filter_upwards [hcoeff_bound] with x hxcoeff + have hsx : + ‖s n x‖ ≤ ‖w x‖ + ‖w x‖ := by + simpa [s] using + MeasureTheory.SimpleFunc.norm_approxOn_zero_le hw_meas + (s := Set.range w ∪ {0}) (by simp) x n + have hmul_nonneg : 0 ≤ ‖w x‖ + ‖w x‖ := by positivity + have hcoeff_nonneg : 0 ≤ ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ := by + positivity + calc + ‖s n x * toFullBlockMat (blockCoeffField a.1 x) α β‖ + = ‖s n x‖ * ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ := by + exact norm_mul _ _ + _ ≤ (‖w x‖ + ‖w x‖) * C := by + exact mul_le_mul hsx hxcoeff hcoeff_nonneg hmul_nonneg + _ = (2 * C) * ‖w x‖ := by ring + have hbound_int : + MeasureTheory.Integrable (fun x => (2 * C) * ‖w x‖) μ := by + simpa [mul_assoc] using hw_int.norm.const_mul (2 * C) + have hlim : + ∀ᵐ x ∂ μ, + Tendsto + (fun n : ℕ => + s n x * toFullBlockMat (blockCoeffField a.1 x) α β) + atTop + (𝓝 (w x * toFullBlockMat (blockCoeffField a.1 x) α β)) := by + refine Filter.Eventually.of_forall ?_ + intro x + exact + (MeasureTheory.SimpleFunc.tendsto_approxOn hw_meas + (s := Set.range w ∪ {0}) (y₀ := 0) (by simp) + (x := x) (subset_closure (Or.inl ⟨x, rfl⟩))).mul tendsto_const_nhds + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, μ, s] using + MeasureTheory.tendsto_integral_of_dominated_convergence + (μ := μ) (G := ℝ) + (F := fun n x => + s n x * toFullBlockMat (blockCoeffField a.1 x) α β) + (f := fun x => + w x * toFullBlockMat (blockCoeffField a.1 x) α β) + (fun x => (2 * C) * ‖w x‖) + (fun n => (hs_prod_int n).aestronglyMeasurable) + hbound_int hbound hlim + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + exact measurable_of_tendsto_metrizable hs_meas hs_tendsto + +theorem AEEQuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} + (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + classical + let w' : Vec d → ℝ := hw.aestronglyMeasurable.mk w + have hw'_meas : Measurable w' := by + simpa [w'] using hw.aestronglyMeasurable.measurable_mk + have hw'_int : MeasureTheory.Integrable w' (volumeMeasureOn U) := by + exact hw.congr hw.aestronglyMeasurable.ae_eq_mk + have hmeas' : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w' x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := + AEEQuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral_of_measurable + hToL2 hw'_meas hw'_int α β + rw [show + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) = + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, + w' x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume by + funext a + apply MeasureTheory.integral_congr_ae + filter_upwards [hw.aestronglyMeasurable.ae_eq_mk] with x hx + rw [hx]] + exact hmeas' + +theorem AEEQuantitativeEllipticSlice.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {k : ℕ} {X : BlockState d} (hSlice : AEEQuantitativeEllipticSlice U k a) + (hX : MemBlockL2 U X.eval) (α β : BlockCoord d) : + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a x) α β) + U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + hSlice.integrable_weightedFullBlockCoeffEntry_of_integrable + (integrable_blockEnergyEntryWeight_of_memBlockL2 hX α β) α β + +theorem AEEQuantitativeEllipticSlice.integrableOn_pairingWeightedFullBlockCoeffEntry_of_memBlockL2 + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {k : ℕ} {X Y : BlockState d} (hSlice : AEEQuantitativeEllipticSlice U k a) + (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) (α β : BlockCoord d) : + MeasureTheory.IntegrableOn + (fun x => + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField a x) α β) + U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + hSlice.integrable_weightedFullBlockCoeffEntry_of_integrable + (integrable_blockPairingEntryWeight_of_memBlockL2 hX hY α β) α β + +theorem measurable_blockEnergyAverage_aeeQuantitativeSlice + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockEnergyAverage U a.1 X) := by + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + exact measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => a.1) + (X := X) + (fun a α β => + a.2.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 hX α β) + (fun α β => + AEEQuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + hToL2 (integrable_blockEnergyEntryWeight_of_memBlockL2 hX α β) α β) + +theorem measurable_blockPairingAverage_aeeQuantitativeSlice + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (X Y : BlockState d) (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockPairingAverage U a.1 X Y) := by + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + exact measurable_blockPairingAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => a.1) + (X := X) (Y := Y) + (fun a α β => + a.2.integrableOn_pairingWeightedFullBlockCoeffEntry_of_memBlockL2 hX hY α β) + (fun α β => + AEEQuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + hToL2 (integrable_blockPairingEntryWeight_of_memBlockL2 hX hY α β) α β) + +/-- Canonical AEE cube-slice measurability of the Hilbert bilinear form on two +dense-generator correction probes. -/ +theorem measurable_energyBilin_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (Y Z : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) := by + let Xstate : BlockState d := + canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Z + let Ystate : BlockState d := + canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Y + have hRewrite : + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) = + fun a => blockPairingAverage (cubeSet Q) a.1 Xstate Ystate := by + funext a + simpa [Xstate, Ystate] using + canonicalAEEMuOperatorSystemData_energyBilin_generator_eq_blockPairingAverage + Q k a Y Z + rw [hRewrite] + exact + measurable_blockPairingAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + Xstate Ystate + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) (0 : BlockVec d) Z) + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) (0 : BlockVec d) Y) + +/-- Canonical AEE cube-slice measurability of the Hilbert bilinear form on a +constant affine shift and one dense-generator correction probe. -/ +theorem measurable_energyBilin_const_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) (P : BlockVec d) + (Y : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y)) := by + let Xstate : BlockState d := + canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Y + let Ystate : BlockState d := + canonicalMuGeneratorAffineField + (U := cubeSet Q) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) + have hRewrite : + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y)) = + fun a => blockPairingAverage (cubeSet Q) a.1 Xstate Ystate := by + funext a + simpa [Xstate, Ystate] using + canonicalAEEMuOperatorSystemData_energyBilin_const_generator_eq_blockPairingAverage + Q k a P Y + rw [hRewrite] + exact + measurable_blockPairingAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + Xstate Ystate + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) (0 : BlockVec d) Y) + (canonicalMuGeneratorAffineField_memBlockL2 + (U := cubeSet Q) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q))) + +/-- Canonical AEE cube-slice measurability of the Hilbert bilinear form on a +fixed block-`L²` test and one affine dense-generator probe. This is the +internal scalar-response source for measuring operator-image averages of the +selected doubled-`Mu` minimizer against deterministic tests. -/ +theorem measurable_energyBilin_fixed_canonicalMuGeneratorAffineField_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) (P : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) + (Z : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) := by + let Xstate : BlockState d := + canonicalMuGeneratorAffineField (U := cubeSet Q) P Z + have hX : MemBlockL2 (cubeSet Q) Xstate.eval := by + simpa [Xstate] using + canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) P Z + have hRewrite : + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) = + fun a => blockPairingAverage (cubeSet Q) a.1 Xstate Y := by + funext a + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + have hX_hilbert : + toHilbertBlockL2OfBlockField (U := U) + (by simpa [U, Xstate] using hX) = + blockVecToHilbertBlockL2Const (U := U) P + + canonicalMuCorrectionGeneratorEmbedding U Z := by + simpa [U, Xstate] using + canonicalMuGeneratorAffineField_hilbert_eq_const_add (U := cubeSet Q) P Z + calc + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z) + = + energyBilinOfOperator system.toMuOperatorRealization.operator + (toHilbertBlockL2OfBlockField (U := U) (by simpa [U] using hY)) + (toHilbertBlockL2OfBlockField (U := U) (by simpa [U, Xstate] using hX)) := by + simp [U, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + hX_hilbert] + _ = blockPairingAverage U a.1 Xstate Y := by + exact + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Xstate) (Y := Y) + (by simpa [U, Xstate] using hX) (by simpa [U] using hY) + rw [hRewrite] + exact + measurable_blockPairingAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + Xstate Y hX hY + +/-- Canonical AEE cube-slice measurability of every finite Galerkin affine +minimizer built from dense-generator correction probes. -/ +theorem measurable_galerkinAffineMinimizer_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) (P : BlockVec d) {n : ℕ} + (e : Fin n → canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + (HilbertBlockL2 (cubeSet Q)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel _) + (fun a => + galerkinAffineMinimizer + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin) + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P) + (fun i => + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) (e i) : + HilbertBlockL2 (cubeSet Q)))) := by + classical + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + let : MeasurableSpace (HilbertBlockL2 (cubeSet Q)) := borel _ + let : BorelSpace (HilbertBlockL2 (cubeSet Q)) := ⟨rfl⟩ + let B : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} → + HilbertBlockL2 (cubeSet Q) →L[ℝ] HilbertBlockL2 (cubeSet Q) →L[ℝ] ℝ := + fun a => ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + let x : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} → + HilbertBlockL2 (cubeSet Q) := + fun a => ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P + let ebasis : Fin n → HilbertBlockL2 (cubeSet Q) := + fun i => canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) (e i) + have hx : @Measurable + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + (HilbertBlockL2 (cubeSet Q)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel _) x := by + change @Measurable + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + (HilbertBlockL2 (cubeSet Q)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel _) + (fun _ => blockVecToHilbertBlockL2Const (U := cubeSet Q) P) + exact measurable_const + have hB : ∀ i j : Fin n, @Measurable + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => B a (ebasis j) (ebasis i)) := by + intro i j + simpa [B, ebasis] using + measurable_energyBilin_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + Q k (e j) (e i) + have hBx : ∀ i : Fin n, @Measurable + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => B a (x a) (ebasis i)) := by + intro i + simpa [B, x, ebasis] using + measurable_energyBilin_const_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + Q k P (e i) + have hCoeff : Measurable fun a => galerkinCoeff (B a) (x a) ebasis := + measurable_galerkinCoeff hB hBx + have hCorr : Measurable fun a => galerkinCorrection (B a) (x a) ebasis := by + have hAssemble : + Continuous fun c : Fin n → ℝ => ∑ j : Fin n, c j • ebasis j := by + fun_prop + change Measurable ((fun c : Fin n → ℝ => ∑ j : Fin n, c j • ebasis j) ∘ + fun a => galerkinCoeff (B a) (x a) ebasis) + exact hAssemble.measurable.comp hCoeff + have hTranslate : + Measurable fun y : HilbertBlockL2 (cubeSet Q) => + blockVecToHilbertBlockL2Const (U := cubeSet Q) P + y := + (continuous_const.add continuous_id).measurable + simpa [B, x, ebasis, galerkinAffineMinimizer] using! hTranslate.comp hCorr + +/-- Slice-local strong measurability of the selected canonical doubled-`Mu` +Hilbert minimizer, once the canonical finite Galerkin approximants satisfy the +deterministic energy-comparison convergence hypotheses. -/ +theorem stronglyMeasurable_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet_of_galerkin_energy + {d : ℕ} (Q : TriadicCube d) (k : ℕ) (P : BlockVec d) + (e : (m : ℕ) → Fin m → canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) + (v : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} → + ℕ → HilbertBlockL2 (cubeSet Q)) + (hv_mem : + ∀ a m, + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + v a m - H.constantField P ∈ + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace) + (hEnergy : + ∀ a m, + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + quadraticEnergy H.energyBilin + (galerkinAffineMinimizer H.energyBilin (H.constantField P) + (fun i => + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) (e m i) : + HilbertBlockL2 (cubeSet Q)))) ≤ + quadraticEnergy H.energyBilin (v a m)) + (hv_tendsto : + ∀ a, + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + Tendsto (fun m : ℕ => v a m) atTop + (𝓝 (affineMinimizerMap + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + H.energyBilin H.energyCoercive (H.constantField P)))) : + letI : MeasurableSpace + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + MeasureTheory.StronglyMeasurable + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + affineMinimizerMap + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + H.energyBilin H.energyCoercive (H.constantField P)) := by + classical + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + let : MeasurableSpace (HilbertBlockL2 (cubeSet Q)) := borel _ + let K : ClosedSubmodule ℝ (HilbertBlockL2 (cubeSet Q)) := + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + let B : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} → + HilbertBlockL2 (cubeSet Q) →L[ℝ] HilbertBlockL2 (cubeSet Q) →L[ℝ] ℝ := + fun a => ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + let hB : + ∀ a, IsCoercive (B a) := + fun a => ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyCoercive + let x : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} → + HilbertBlockL2 (cubeSet Q) := + fun a => ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P + let ebasis : (m : ℕ) → Fin m → HilbertBlockL2 (cubeSet Q) := + fun m i => canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) (e m i) + have hx : MeasureTheory.StronglyMeasurable x := by + change MeasureTheory.StronglyMeasurable + (fun _ : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + blockVecToHilbertBlockL2Const (U := cubeSet Q) P) + exact MeasureTheory.stronglyMeasurable_const + have hsymm : ∀ a, ∀ X Y : HilbertBlockL2 (cubeSet Q), B a X Y = B a Y X := by + intro a + exact ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energySymm + have hB_meas : + ∀ m, ∀ i j : Fin m, Measurable fun a => B a (ebasis m j) (ebasis m i) := by + intro m i j + simpa [B, ebasis] using + measurable_energyBilin_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + Q k (e m j) (e m i) + have hBx_meas : + ∀ m, ∀ i : Fin m, Measurable fun a => B a (x a) (ebasis m i) := by + intro m i + simpa [B, x, ebasis] using + measurable_energyBilin_const_canonicalAEEMuGenerator_aeeQuantitativeSlice_cubeSet + Q k P (e m i) + have hGalerkin_mem : + ∀ a m, galerkinAffineMinimizer (B a) (x a) (ebasis m) - x a ∈ K := by + intro a m + have hcorr : galerkinCorrection (B a) (x a) (ebasis m) ∈ K := by + unfold galerkinCorrection + refine K.toSubmodule.sum_mem ?_ + intro i _hi + refine K.toSubmodule.smul_mem _ ?_ + exact (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) (e m i)).2 + have hdiff : + galerkinAffineMinimizer (B a) (x a) (ebasis m) - x a = + galerkinCorrection (B a) (x a) (ebasis m) := by + simp [galerkinAffineMinimizer] + rw [hdiff] + exact hcorr + have hv_mem' : ∀ a m, v a m - x a ∈ K := by + intro a m + simpa [K, x] using hv_mem a m + have hEnergy' : + ∀ a m, + quadraticEnergy (B a) (galerkinAffineMinimizer (B a) (x a) (ebasis m)) ≤ + quadraticEnergy (B a) (v a m) := by + intro a m + simpa [B, x, ebasis] using hEnergy a m + have hv_tendsto' : + ∀ a, + Tendsto (fun m : ℕ => v a m) atTop + (𝓝 (affineMinimizerMap K (B a) (hB a) (x a))) := by + intro a + simpa [K, B, hB, x] using hv_tendsto a + simpa [K, B, hB, x] using + stronglyMeasurable_of_galerkin_energy_approximants + (K := K) + (hB := hB) + hsymm hx hB_meas hBx_meas hGalerkin_mem hv_mem' hEnergy' + hv_tendsto' + +theorem measurable_subtype_mk_aeeQuantitativeSlice_of_isLocalSigmaMeasurableOn + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, AEEQuantitativeEllipticSlice U k (A ω)) : + @Measurable Ω {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) + (fun ω => ⟨A ω, hSlice ω⟩) := by + let As : Ω → {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + change @Measurable Ω {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) As + apply Measurable.of_comap_le + unfold AEEQuantitativeEllipticSlice.localMeasurableSpace + rw [MeasurableSpace.comap_comp] + simpa [As, IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! hA.comap_le + +theorem measurable_blockEnergyAverage_comp_aeeQuantitativeSlice + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + let As : Ω → {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) As := + measurable_subtype_mk_aeeQuantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hEnergy : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockEnergyAverage U a.1 X) := + measurable_blockEnergyAverage_aeeQuantitativeSlice hToL2 X hX + change Measurable ((fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + blockEnergyAverage U a.1 X) ∘ As) + exact hEnergy.comp hAs + +theorem measurable_blockPairingAverage_comp_aeeQuantitativeSlice + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, AEEQuantitativeEllipticSlice U k (A ω)) + (X Y : BlockState d) (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) : + Measurable fun ω => blockPairingAverage U (A ω) X Y := by + let As : Ω → {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) As := + measurable_subtype_mk_aeeQuantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hPair : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockPairingAverage U a.1 X Y) := + measurable_blockPairingAverage_aeeQuantitativeSlice hToL2 X Y hX hY + change Measurable ((fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + blockPairingAverage U a.1 X Y) ∘ As) + exact hPair.comp hAs + +theorem measurable_blockEnergyAverage_comp_countable_aeeQuantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover : ⋃ k : ℕ, t k = Set.univ) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + classical + let f : (k : ℕ) → t k → ℝ := + fun k ω => blockEnergyAverage U (A ω.1) X + have hfm : ∀ k : ℕ, Measurable (f k) := by + intro k + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : t k => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : t k, + AEEQuantitativeEllipticSlice U k ((fun ω : t k => A ω.1) ω) := by + intro ω + exact hSlice k ω.1 ω.2 + exact measurable_blockEnergyAverage_comp_aeeQuantitativeSlice + (hToL2 k) (fun ω : t k => A ω.1) hA_sub hSlice_sub X hX + have hagree : + ∀ (i j : ℕ) (ω : Ω) (hωi : ω ∈ t i) (hωj : ω ∈ t j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + rfl + have hLift : Measurable (Set.liftCover t f hagree hcover) := + measurable_liftCover t ht f hfm hagree hcover + have hEq : Set.liftCover t f hagree hcover = + (fun ω => blockEnergyAverage U (A ω) X) := by + funext ω + obtain ⟨k, hωk⟩ : ∃ k : ℕ, ω ∈ t k := by + have hω_cover : ω ∈ ⋃ k : ℕ, t k := by + rw [hcover] + exact Set.mem_univ ω + exact Set.mem_iUnion.mp hω_cover + rw [Set.liftCover_of_mem (S := t) (f := f) (hf := hagree) (hS := hcover) hωk] + simpa [hEq] using hLift + +theorem aemeasurable_blockEnergyAverage_comp_countable_aeeQuantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + classical + let S : Set Ω := ⋃ k : ℕ, t k + let cover : Option ℕ → Set Ω + | none => Sᶜ + | some k => t k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, ω => blockEnergyAverage U (A ω.1) X + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => exact (MeasurableSet.iUnion ht).compl + | some k => exact ht k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : cover (some k) => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp, cover] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : cover (some k), + AEEQuantitativeEllipticSlice U k ((fun ω : cover (some k) => A ω.1) ω) := by + intro ω + have hω : ω.1 ∈ t k := by + simp [cover] at ω + exact ω.2 + exact hSlice k ω.1 hω + simpa [f, cover] using + measurable_blockEnergyAverage_comp_aeeQuantitativeSlice + (hToL2 k) (fun ω : cover (some k) => A ω.1) hA_sub hSlice_sub X hX + have hagree : + ∀ (i j : Option ℕ) (ω : Ω) (hωi : ω ∈ cover i) (hωj : ω ∈ cover j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + cases i with + | none => + cases j with + | none => rfl + | some k => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωj⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωi + exact hω_notS hωS + | some k => + cases j with + | none => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωi⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωj + exact hω_notS hωS + | some _ => rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + by_cases hωS : ω ∈ S + · obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hωk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using hωS⟩ + have hLift : Measurable (Set.liftCover cover f hagree hcover) := + measurable_liftCover cover hcover_meas f hfm hagree hcover + have hEq : + (fun ω => blockEnergyAverage U (A ω) X) =ᵐ[μ] + Set.liftCover cover f hagree hcover := by + filter_upwards [hcover_ae] with ω hωS + obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hωk)] + exact hLift.aemeasurable.congr hEq.symm + +theorem measurable_blockEnergyAverage_comp_aeeQuantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover : ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set : ⋃ k : ℕ, t k = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + exact Set.mem_iUnion.mpr (hcover ω) + exact measurable_blockEnergyAverage_comp_countable_aeeQuantitativeSlice_cover + hToL2 A hA t ht hcover_set (fun k ω hω => hω) X hX + +theorem aemeasurable_blockEnergyAverage_comp_aeeQuantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k := by + filter_upwards [hcover_ae] with ω hω + exact Set.mem_iUnion.mpr hω + exact aemeasurable_blockEnergyAverage_comp_countable_aeeQuantitativeSlice_cover + μ hToL2 A hA t ht hcover_set_ae (fun k ω hω => hω) X hX + +theorem aemeasurable_blockEnergyAverage_comp_aeeQuantitativeSlice_sets_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + exact aemeasurable_blockEnergyAverage_comp_aeeQuantitativeSlice_sets μ + (fun _k => measurable_toHilbertMatrixL2_aee_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSliceMeas hcover_ae X hX +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMinimizerFamily.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMinimizerFamily.lean new file mode 100644 index 0000000000..d61669c283 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMinimizerFamily.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily + +/-! # Carrier Minimizer Family -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Carrier canonical-minimizer measurability (Packet P5f) + +This file re-aims the raw AEE-slice canonical doubled-`Mu` Hilbert-minimizer +measurability spine (`AEESliceAssembly/MuFamily.lean`, +`measurable_energyBilin_fixed_...`, +`stronglyMeasurable_canonicalAEEMuHilbertMinimizer_...`) onto the honest carrier +`RegCoeffField d`, exactly as `CarrierMuFamily.lean` re-aims the coarse-grained +energy `Mu`. + +As in `CarrierMuFamily`, the fine local σ-algebra of the raw slice subtype does +**not** reflect into the honest entry-test carrier σ-algebra `LocalSigmaR`, so the +raw primitives cannot be reused as black boxes. The honest route is identical: +every measurability step factors through the `L²` coefficient realization, whose +carrier measurability is `measurable_toHilbertMatrixL2_carrier_cubeSet` (a finite +sum of localized entry-test generators). The Hilbert-space selection/limit +scaffolding (dense generators, index selection, energy-gap limit) is entirely +domain-generic and is transcribed here over a generic measurable source +`A : Ω → RegCoeffField d`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +noncomputable section + +variable {Ω : Type*} {mΩ : MeasurableSpace Ω} {d : ℕ} {k : ℕ} + +/-- The raw AEE-slice element attached to a carrier source (public local copy of +the `CarrierMuFamily` private helper). -/ +def slicePt (Q : TriadicCube d) (A : Ω → RegCoeffField d) + (hSlice : ∀ ω, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω).toFun) (ω : Ω) : + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + ⟨(A ω).toFun, hSlice ω⟩ + +section CarrierEngine + +variable (Q : TriadicCube d) {A : Ω → RegCoeffField d} + (hSlice : ∀ ω, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω).toFun) + +include hSlice + +/-- Carrier block-pairing average measurability from `hF` (mirrors +`measurable_blockEnergyAverage_carrier`). -/ +theorem measurable_blockPairingAverage_carrier + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + (X Y : BlockState d) (hX : MemBlockL2 (cubeSet Q) X.eval) + (hY : MemBlockL2 (cubeSet Q) Y.eval) : + @Measurable Ω ℝ mΩ _ (fun ω => blockPairingAverage (cubeSet Q) (A ω).toFun X Y) := by + have hF := measurable_toHilbertMatrixL2_carrier_cubeSet Q hSlice hEntry + exact measurable_blockPairingAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun ω => (A ω).toFun) (X := X) (Y := Y) + (fun ω α β => + (hSlice ω).integrableOn_pairingWeightedFullBlockCoeffEntry_of_memBlockL2 hX hY α β) + (fun α β => + measurable_integrableWeightedFullBlockCoeffEntry_carrier hF + (integrable_blockPairingEntryWeight_of_memBlockL2 hX hY α β) α β) + +/-- Carrier version of the fixed-generator energy pairing measurability: it equals +a fixed block-pairing average of the carrier field. -/ +theorem measurable_energyBilin_fixed_generator_carrier + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + (P : BlockVec d) (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) + (Z : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + @Measurable Ω ℝ mΩ _ + (fun ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) := by + let U : Set (Vec d) := cubeSet Q + let Xstate : BlockState d := canonicalMuGeneratorAffineField (U := U) P Z + have hX : MemBlockL2 U Xstate.eval := by + simpa [Xstate] using canonicalMuGeneratorAffineField_memBlockL2 (U := U) P Z + have hRewrite : + (fun ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z)) = + fun ω => blockPairingAverage (cubeSet Q) (A ω).toFun Xstate Y := by + funext ω + let a := slicePt Q A hSlice ω + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + have hX_hilbert : + toHilbertBlockL2OfBlockField (U := U) (by simpa [U, Xstate] using hX) = + blockVecToHilbertBlockL2Const (U := U) P + + canonicalMuCorrectionGeneratorEmbedding U Z := by + simpa [U, Xstate] using + canonicalMuGeneratorAffineField_hilbert_eq_const_add (U := cubeSet Q) P Z + calc + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (blockVecToHilbertBlockL2Const (U := cubeSet Q) P + + canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z) + = + energyBilinOfOperator system.toMuOperatorRealization.operator + (toHilbertBlockL2OfBlockField (U := U) (by simpa [U] using hY)) + (toHilbertBlockL2OfBlockField (U := U) (by simpa [U, Xstate] using hX)) := by + simp [U, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + hX_hilbert] + _ = blockPairingAverage U a.1 Xstate Y := by + exact + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Xstate) (Y := Y) + (by simpa [U, Xstate] using hX) (by simpa [U] using hY) + rw [hRewrite] + exact measurable_blockPairingAverage_carrier Q hSlice hEntry Xstate Y hX hY + +/-- **Carrier canonical doubled-`Mu` Hilbert-minimizer strong measurability.** +Generic re-aim of +`stronglyMeasurable_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet`. -/ +theorem stronglyMeasurable_canonicalMinimizer_carrier + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + (P : BlockVec d) : + @MeasureTheory.StronglyMeasurable Ω (HilbertBlockL2 (cubeSet Q)) _ mΩ + (fun ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).minimizerMap P) := by + classical + let U : Set (Vec d) := cubeSet Q + have hF := measurable_toHilbertMatrixL2_carrier_cubeSet Q hSlice hEntry + let K : ClosedSubmodule ℝ (HilbertBlockL2 U) := + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + let ξ : ℕ → canonicalMuBlockCorrectionGeneratorSubmodule U := + TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule U) + let candidate : ℕ → HilbertBlockL2 U := fun n => + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ n) : HilbertBlockL2 U) + let energy : Ω → ℕ → ℝ := fun ω n => + blockEnergyAverage U (A ω).toFun (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + let ε : ℕ → ℝ := fun m => 1 / ((m : ℝ) + 1) + have hEnergy_meas : ∀ n : ℕ, Measurable fun ω : Ω => energy ω n := by + intro n + simpa [energy, U, ξ] using + measurable_blockEnergyAverage_carrier hF + (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P (ξ n)) + have hMu_meas : Measurable fun ω : Ω => Mu U P (A ω).toFun := + measurable_Mu_comp_aeeSlice_of_measurable_entryTest Q hSlice hEntry P + have hExists : ∀ m : ℕ, ∀ ω : Ω, ∃ n : ℕ, energy ω n ≤ Mu U P (A ω).toFun + ε m := by + intro m ω + have hmu : Mu U P (A ω).toFun = ⨅ n : ℕ, energy ω n := by + simpa [energy, U, ξ] using! + mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k (slicePt Q A hSlice ω) P + have hlt : (⨅ n : ℕ, energy ω n) < (⨅ n : ℕ, energy ω n) + ε m := by + have hpos : 0 < ε m := by simp only [ε]; positivity + exact lt_add_of_le_of_pos (le_refl (⨅ n : ℕ, energy ω n)) hpos + rcases exists_lt_of_ciInf_lt hlt with ⟨n, hn⟩ + exact ⟨n, le_of_lt (by simpa [hmu] using hn)⟩ + let index : ℕ → Ω → ℕ := fun m ω => Nat.find (hExists m ω) + have hGood_meas : + ∀ m n : ℕ, MeasurableSet {ω : Ω | energy ω n ≤ Mu U P (A ω).toFun + ε m} := by + intro m n + exact measurableSet_le (hEnergy_meas n) (hMu_meas.add measurable_const) + have hIndex_meas : ∀ m : ℕ, Measurable (index m) := by + intro m + simpa [index] using measurable_find (hExists m) (hGood_meas m) + have hCandidate_strong : MeasureTheory.StronglyMeasurable candidate := + MeasureTheory.StronglyMeasurable.of_discrete + have hApprox_strong : + ∀ m : ℕ, MeasureTheory.StronglyMeasurable fun ω : Ω => candidate (index m ω) := by + intro m + simpa [Function.comp_def] using hCandidate_strong.comp_measurable (hIndex_meas m) + have hε_tendsto : Tendsto ε atTop (𝓝 0) := by + have hbase : Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) atTop (𝓝 (0 : ℝ)) := + tendsto_one_div_add_atTop_nhds_zero_nat + simpa [ε] using hbase + have hlim : + Tendsto + (fun m : ℕ => fun ω : Ω => candidate (index m ω)) + atTop + (𝓝 fun ω : Ω => + let H := ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization) + affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + rw [tendsto_pi_nhds] + intro ω + let a := slicePt Q A hSlice ω + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + have hmem : ∀ m : ℕ, candidate (index m ω) - H.constantField P ∈ K := by + intro m + change candidate (index m ω) - H.constantField P ∈ + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + have hconst : H.constantField P = blockVecToHilbertBlockL2Const (U := U) P := rfl + have hcand : candidate (index m ω) = + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m ω)) : HilbertBlockL2 U) := rfl + rw [hcand, hconst, add_sub_cancel_left] + exact (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m ω))).2 + have hnear : + ∀ m : ℕ, + quadraticEnergy H.energyBilin (candidate (index m ω)) ≤ + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by + intro m + have hgood : energy ω (index m ω) ≤ Mu U P (A ω).toFun + ε m := by + simpa [index] using Nat.find_spec (hExists m ω) + have hqe : + quadraticEnergy H.energyBilin (candidate (index m ω)) = + energy ω (index m ω) := by + simpa [H, a, candidate, energy, U, ξ] using! + canonicalAEEMuOperatorSystemData_quadraticEnergy_generatorAffine_eq_blockEnergyAverage + Q k a P (ξ (index m ω)) + have hmu : + Mu U P (A ω).toFun = + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + simpa [H, a, K, U, MuHilbertRealization.muCandidate, MuHilbertProblem.muCandidate, + MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! + mu_eq_canonicalAEEMuCandidate Q k a P + calc + quadraticEnergy H.energyBilin (candidate (index m ω)) + = energy ω (index m ω) := hqe + _ ≤ Mu U P (A ω).toFun + ε m := hgood + _ = quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by rw [hmu] + exact tendsto_of_quadraticEnergy_le_min_add_eps + K H.energyCoercive H.energySymm (H.constantField P) hmem hε_tendsto hnear + have hAffine : + MeasureTheory.StronglyMeasurable + (fun ω : Ω => + let H := ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization) + affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := + stronglyMeasurable_of_tendsto atTop hApprox_strong hlim + simpa [U, K, MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! hAffine + +/-- **Carrier fixed-test energy-pairing measurability against the canonical +minimizer.** Generic re-aim of +`measurable_energyBilin_fixed_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet`. -/ +theorem measurable_energyBilin_fixed_canonicalMinimizer_carrier + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + (P : BlockVec d) (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + @Measurable Ω ℝ mΩ _ + (fun ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).minimizerMap P)) := by + classical + let U : Set (Vec d) := cubeSet Q + have hF := measurable_toHilbertMatrixL2_carrier_cubeSet Q hSlice hEntry + let K : ClosedSubmodule ℝ (HilbertBlockL2 U) := + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + let ξ : ℕ → canonicalMuBlockCorrectionGeneratorSubmodule U := + TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule U) + let y : HilbertBlockL2 U := toHilbertBlockL2OfBlockField (U := U) (by simpa [U] using hY) + let candidate : ℕ → HilbertBlockL2 U := fun n => + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ n) : HilbertBlockL2 U) + let energy : Ω → ℕ → ℝ := fun ω n => + blockEnergyAverage U (A ω).toFun (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + let ε : ℕ → ℝ := fun m => 1 / ((m : ℝ) + 1) + have hEnergy_meas : ∀ n : ℕ, Measurable fun ω : Ω => energy ω n := by + intro n + simpa [energy, U, ξ] using + measurable_blockEnergyAverage_carrier hF + (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P (ξ n)) + have hMu_meas : Measurable fun ω : Ω => Mu U P (A ω).toFun := + measurable_Mu_comp_aeeSlice_of_measurable_entryTest Q hSlice hEntry P + have hExists : ∀ m : ℕ, ∀ ω : Ω, ∃ n : ℕ, energy ω n ≤ Mu U P (A ω).toFun + ε m := by + intro m ω + have hmu : Mu U P (A ω).toFun = ⨅ n : ℕ, energy ω n := by + simpa [energy, U, ξ] using! + mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k (slicePt Q A hSlice ω) P + have hlt : (⨅ n : ℕ, energy ω n) < (⨅ n : ℕ, energy ω n) + ε m := by + have hpos : 0 < ε m := by simp only [ε]; positivity + exact lt_add_of_le_of_pos (le_refl (⨅ n : ℕ, energy ω n)) hpos + rcases exists_lt_of_ciInf_lt hlt with ⟨n, hn⟩ + exact ⟨n, le_of_lt (by simpa [hmu] using hn)⟩ + let index : ℕ → Ω → ℕ := fun m ω => Nat.find (hExists m ω) + have hGood_meas : + ∀ m n : ℕ, MeasurableSet {ω : Ω | energy ω n ≤ Mu U P (A ω).toFun + ε m} := by + intro m n + exact measurableSet_le (hEnergy_meas n) (hMu_meas.add measurable_const) + have hApprox_meas : + ∀ n : ℕ, + Measurable fun ω : Ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + y (candidate n) := by + intro n + simpa [U, y, candidate, ξ] using + measurable_energyBilin_fixed_generator_carrier Q hSlice hEntry P Y hY (ξ n) + have hSelected_meas : + ∀ m : ℕ, + Measurable fun ω : Ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + y (candidate (index m ω)) := by + intro m + let p : ℕ → Ω → Prop := fun n ω => energy ω n ≤ Mu U P (A ω).toFun + ε m + have hp : ∀ n : ℕ, MeasurableSet {ω : Ω | p n ω} := by + intro n; simpa [p] using hGood_meas m n + have hexists : ∀ ω : Ω, ∃ n : ℕ, p n ω := by + intro ω; simpa [p] using hExists m ω + simpa [p, index] using + (Measurable.find + (f := fun n ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + y (candidate n)) + (p := p) hApprox_meas hp hexists) + have hSelected_strong : + ∀ m : ℕ, + MeasureTheory.StronglyMeasurable fun ω : Ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + y (candidate (index m ω)) := + fun m => (hSelected_meas m).stronglyMeasurable + have hε_tendsto : Tendsto ε atTop (𝓝 0) := by + have hbase : Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) atTop (𝓝 (0 : ℝ)) := + tendsto_one_div_add_atTop_nhds_zero_nat + simpa [ε] using hbase + have hlim_scalar : + Tendsto + (fun m : ℕ => fun ω : Ω => + ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization).energyBilin + y (candidate (index m ω))) + atTop + (𝓝 fun ω : Ω => + let H := ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization) + H.energyBilin y (H.minimizerMap P)) := by + rw [tendsto_pi_nhds] + intro ω + let a := slicePt Q A hSlice ω + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + have hmem : ∀ m : ℕ, candidate (index m ω) - H.constantField P ∈ K := by + intro m + change candidate (index m ω) - H.constantField P ∈ + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + have hconst : H.constantField P = blockVecToHilbertBlockL2Const (U := U) P := rfl + have hcand : candidate (index m ω) = + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m ω)) : HilbertBlockL2 U) := rfl + rw [hcand, hconst, add_sub_cancel_left] + exact (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m ω))).2 + have hnear : + ∀ m : ℕ, + quadraticEnergy H.energyBilin (candidate (index m ω)) ≤ + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by + intro m + have hgood : energy ω (index m ω) ≤ Mu U P (A ω).toFun + ε m := by + simpa [index] using Nat.find_spec (hExists m ω) + have hqe : + quadraticEnergy H.energyBilin (candidate (index m ω)) = + energy ω (index m ω) := by + simpa [H, a, candidate, energy, U, ξ] using! + canonicalAEEMuOperatorSystemData_quadraticEnergy_generatorAffine_eq_blockEnergyAverage + Q k a P (ξ (index m ω)) + have hmu : + Mu U P (A ω).toFun = + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + simpa [H, a, K, U, MuHilbertRealization.muCandidate, MuHilbertProblem.muCandidate, + MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! + mu_eq_canonicalAEEMuCandidate Q k a P + calc + quadraticEnergy H.energyBilin (candidate (index m ω)) + = energy ω (index m ω) := hqe + _ ≤ Mu U P (A ω).toFun + ε m := hgood + _ = quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by rw [hmu] + have hHilbert : + Tendsto (fun m : ℕ => candidate (index m ω)) atTop + (𝓝 (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P))) := + tendsto_of_quadraticEnergy_le_min_add_eps + K H.energyCoercive H.energySymm (H.constantField P) hmem hε_tendsto hnear + have hHilbert' : + Tendsto (fun m : ℕ => candidate (index m ω)) atTop + (𝓝 (H.minimizerMap P)) := by + simpa [H, K, MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! hHilbert + exact (H.energyBilin y).continuous.tendsto (H.minimizerMap P) |>.comp hHilbert' + have hStrong : + MeasureTheory.StronglyMeasurable + (fun ω : Ω => + let H := ((canonicalAEEMuOperatorSystemData Q k (slicePt Q A hSlice ω)).toMuHilbertRealization) + H.energyBilin y (H.minimizerMap P)) := + stronglyMeasurable_of_tendsto atTop hSelected_strong hlim_scalar + simpa [U, y] using hStrong.measurable + +end CarrierEngine + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMuFamily.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMuFamily.lean new file mode 100644 index 0000000000..e365751a61 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/CarrierMuFamily.lean @@ -0,0 +1,486 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge + +/-! # Carrier Mu Family -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Carrier `Mu` measurability (Packet P5 centrepiece) + +This file re-aims the raw AEE-slice `Mu` measurability spine onto the honest +carrier `RegCoeffField d`. The raw spine (`AEESliceAssembly/MuFamily.lean`, +`BlockEnergyAverage.lean`, `FixedCompetitorEnergyMeasurability/**`) proves +measurability of the coarse-grained energy `Mu` on the raw slice subtype for the +**fine** local σ-algebra `AEEQuantitativeEllipticSlice.localMeasurableSpace`, +which is a `comap` of the powerset-fine `PointwiseLocalSigma`. The carrier redesign needs +`Mu` measurable for the honest **entry-test** local σ-algebra `LocalSigmaR` +(P4b), and the carrier's `toFun` does **not** reflect fine local events into +`LocalSigmaR` (pointwise evaluations are not entry-test measurable — the Rao +obstruction), so the fine spine cannot be reused as a black box. + +The honest route re-derived here: + +* every measurability step of the raw spine factors through the `L²` coefficient + realization `toHilbertMatrixL2` (the block-energy averages and hence `Mu` are + Borel functions of it); the raw building blocks + (`measurable_l2WeightedHilbertMatrixLipschitzIntegral`, + `measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals`, + `measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq`) are + **domain-generic**, taking the `L²` realization's measurability as an input; +* the one genuinely new fact is that the `L²` realization of a carrier field is + `LocalSigmaR`-measurable — proved by the dense-probe inner-product criterion, + whose inner products are exactly the localized entry-test generators + `entryTestR` of the carrier (`measurable_entryTestR_localSigmaR`), not the fine + pointwise data. + +The result `measurable_Mu_comp_aeeSlice_of_measurable_entryTest` is the generic +engine consumed by `Theorems/Mu.lean`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +noncomputable section + +variable {Ω : Type*} {mΩ : MeasurableSpace Ω} {d : ℕ} {U : Set (Vec d)} {k : ℕ} + +/-- The raw AEE-slice element attached to a carrier source. -/ +private def rawSlice (A : Ω → RegCoeffField d) + (hSlice : ∀ ω, AEEQuantitativeEllipticSlice U k (A ω).toFun) (ω : Ω) : + {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + ⟨(A ω).toFun, hSlice ω⟩ + +section CarrierToL2 + +variable [IsFiniteMeasure (volumeMeasureOn U)] + {A : Ω → RegCoeffField d} + {hSlice : ∀ ω, AEEQuantitativeEllipticSlice U k (A ω).toFun} + (hU : MeasurableSet U) + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ U → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + +include hU hEntry + +/-- Scalar-entry inner product of the carrier `L²` realization against a smooth, +compactly supported scalar probe supported in `U` is a localized entry-test +generator of the carrier field, hence `mΩ`-measurable. -/ +theorem measurable_inner_toScalarL2_hilbertMatrixL2Entry_carrier + (i j : Fin d) {φ : Vec d → ℝ} (hφL2 : MemScalarL2 U φ) + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + @Measurable Ω ℝ mΩ _ + (fun ω => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω)))) := by + have hsuppφ : Function.support φ ⊆ U := + (Function.support_subset_iff.2 (fun x hx => subset_tsupport φ hx)).trans hφ_support + have hEq : + (fun ω => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω)))) + = fun ω => entryTestR i j φ (A ω) := by + funext ω + have hInner : + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) + = ∫ x in U, φ x * (A ω).toFun x i j ∂MeasureTheory.volume := by + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) + = ∫ x, φ x * + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x i j + ∂volumeMeasureOn U := + QuantitativeEllipticSlice.inner_toScalarL2_hilbertMatrixL2Entry_eq_integral + hφL2 i j (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω)) + _ = ∫ x, φ x * restrictCoeffField U (rawSlice A hSlice ω).1 x i j + ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [AEEQuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 (rawSlice A hSlice ω)] + with x hx + rw [hx] + _ = ∫ x in U, φ x * (A ω).toFun x i j ∂MeasureTheory.volume := by + unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem (rawSlice A hSlice ω).2.measurableSet] + with x hxU + simp [restrictCoeffField, hxU, rawSlice] + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) = + ∫ x in U, φ x * (A ω).toFun x i j ∂MeasureTheory.volume := hInner + _ = entryTestR i j φ (A ω) := + (entryTestR_eq_setIntegral_of_support hU i j hsuppφ (A ω)).symm + rw [hEq] + exact hEntry i j hφ_cont hφ_compact hφ_support + +/-- Smooth `HilbertMat`-valued probe inner product of the carrier `L²` +realization is `mΩ`-measurable: it decomposes into a finite sum of localized +scalar entry-test generators of the carrier field. -/ +theorem measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_carrier + {g : Vec d → HilbertMat d} (hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) (hg_compact : HasCompactSupport g) + (hg_support : tsupport g ⊆ U) : + @Measurable Ω ℝ mΩ _ + (fun ω => + inner ℝ (hgL2.toLp g) + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) := by + have hEq : + (fun ω => + inner ℝ (hgL2.toLp g) + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) + = fun ω => + ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 + (QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp + (U := U) hgL2 i j)) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) := by + funext ω + exact QuantitativeEllipticSlice.inner_hilbertMatrixL2_eq_sum_entry_inner hgL2 + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω)) + rw [hEq] + refine Finset.measurable_sum _ (fun i _ => Finset.measurable_sum _ (fun j _ => ?_)) + let gij : Vec d → ℝ := fun x => HilbertMat.entryL i j (g x) + have hgijL2 : MemScalarL2 U gij := by + simpa [gij] using + QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hgL2 i j + have hgij_cont : ContDiff ℝ (⊤ : ℕ∞) gij := by + simpa [gij, Function.comp_def] using + (ContDiff.continuousLinearMap_comp (HilbertMat.entryL i j) hg_cont) + have hgij_compact : HasCompactSupport gij := by + simpa [gij, Function.comp_def] using + hg_compact.comp_left (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) + have hgij_support : tsupport gij ⊆ U := by + have hsubset : tsupport gij ⊆ tsupport g := by + simpa [gij, Function.comp_def] using + (tsupport_comp_subset + (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) g) + exact hsubset.trans hg_support + simpa [gij, hgijL2] using + measurable_inner_toScalarL2_hilbertMatrixL2Entry_carrier + (mΩ := mΩ) hU hEntry i j hgijL2 hgij_cont hgij_compact hgij_support + +/-- **The carrier `L²` coefficient realization is `mΩ`-measurable.** Proved by +the dense smooth-probe inner-product criterion; each inner product is a finite +sum of localized entry-test generators of the carrier field. -/ +theorem measurable_toHilbertMatrixL2_carrier + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) : + @Measurable Ω (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) mΩ (borel _) + (fun ω => AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω)) := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let : MeasurableSpace (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) := borel _ + have : BorelSpace (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) := ⟨rfl⟩ + obtain ⟨u, hu, hSmooth⟩ := + exists_dense_smoothProbeSequence_of_dense_smoothProbeSet (U := U) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset hUopen hUfinite) + refine measurable_of_measurable_inner_denseRange_polish u hu (fun n => ?_) + rcases hSmooth n with ⟨g, hgL2, hEqn, hg_cont, hg_compact, hg_support⟩ + rw [hEqn] + exact measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_carrier + (mΩ := mΩ) hU hEntry hgL2 hg_cont hg_compact hg_support + +end CarrierToL2 + +/-! ## Block-energy averages and `Mu` from the carrier `L²` realization + +These lemmas take the carrier `L²` realization's measurability `hF` (produced by +`measurable_toHilbertMatrixL2_carrier`) and thread the domain-generic raw +block-energy → `Mu` spine. The weighted-integral atoms mirror +`BlockEnergyAverage.lean`, replacing the subtype `L²` realization with `hF`. -/ + +section CarrierBlockEnergy + +variable [IsFiniteMeasure (volumeMeasureOn U)] + {A : Ω → RegCoeffField d} + {hSlice : ∀ ω, AEEQuantitativeEllipticSlice U k (A ω).toFun} + (hF : @Measurable Ω (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) mΩ (borel _) + (fun ω => AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω))) + +include hF + +/-- Carrier version of the `L²`-weighted full-block coefficient-entry integral +measurability, for an `L²` weight. -/ +theorem measurable_l2WeightedFullBlockCoeffEntry_carrier + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) : + @Measurable Ω ℝ mΩ _ + (fun ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := by + obtain ⟨Q', hQ_lip, hQ_eq_on⟩ := + (lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_quantitative + (d := d) (k := k) α β).extend_real + have hrw : + (fun ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) + = fun ω => + ∫ x, w x * + Q' (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x) + ∂volumeMeasureOn U := by + funext ω + calc + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume + = ∫ x, w x * + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x).toMat) + α β + ∂volumeMeasureOn U := + AEEQuantitativeEllipticSlice.weightedFullBlockCoeffEntryIntegral_eq_hilbertMatrixL2 + (rawSlice A hSlice ω) w α β + _ = ∫ x, w x * + Q' (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x) + ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [AEEQuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet + (rawSlice A hSlice ω)] + with x hx + have h : + toFullBlockMat + (blockMatrixOfCoeff + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x).toMat) + α β + = Q' (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 (rawSlice A hSlice ω) x) := + hQ_eq_on hx + rw [h] + rw [hrw] + exact measurable_l2WeightedHilbertMatrixLipschitzIntegral hF hw hQ_lip + +/-- Carrier version of the `L²`-weighted full-block coefficient-entry integral +measurability, for an integrable weight (`L²` weights are dense; simple-function +approximation upgrades the previous lemma). -/ +theorem measurable_integrableWeightedFullBlockCoeffEntry_carrier_of_measurable + {w : Vec d → ℝ} (hw_meas : Measurable w) + (hw_int : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable Ω ℝ mΩ _ + (fun ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := by + classical + let μ := volumeMeasureOn U + let C : ℝ := + Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) + let s : ℕ → Vec d → ℝ := + fun n => MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n + have hs_L2 : ∀ n, MemScalarL2 U (s n) := by + intro n + simpa [MemScalarL2, μ, s] using + (MeasureTheory.SimpleFunc.memLp_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n) + (2 : ℝ≥0∞) (volumeMeasureOn U)) + have hs_meas : + ∀ n, @Measurable Ω ℝ mΩ _ + (fun ω => + ∫ x in U, s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := + fun n => measurable_l2WeightedFullBlockCoeffEntry_carrier hF (hs_L2 n) α β + have hs_tendsto : + Filter.Tendsto + (fun n : ℕ => fun ω : Ω => + ∫ x in U, s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) + atTop + (𝓝 fun ω : Ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := by + rw [tendsto_pi_nhds] + intro ω + have hprod_int : + MeasureTheory.Integrable + (fun x => w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β) μ := by + simpa [μ] using + (hSlice ω).integrable_weightedFullBlockCoeffEntry_of_integrable hw_int α β + have hs_prod_int : + ∀ n, MeasureTheory.Integrable + (fun x => s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β) μ := by + intro n + have hs_int : MeasureTheory.Integrable (s n) μ := by + simpa [s, μ] using + (MeasureTheory.SimpleFunc.integrable_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n)) + simpa [μ] using + (hSlice ω).integrable_weightedFullBlockCoeffEntry_of_integrable hs_int α β + have hcoeff_bound : + ∀ᵐ x ∂ μ, ‖toFullBlockMat (blockCoeffField (A ω).toFun x) α β‖ ≤ C := by + filter_upwards [(hSlice ω).ae_isEllipticMatrix] with x hxEll + simpa [μ, C, blockCoeffField, Real.norm_eq_abs] using + abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix + (A := (A ω).toFun x) hxEll α β + have hbound : + ∀ n, ∀ᵐ x ∂ μ, + ‖s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β‖ ≤ (2 * C) * ‖w x‖ := by + intro n + filter_upwards [hcoeff_bound] with x hxcoeff + have hsx : ‖s n x‖ ≤ ‖w x‖ + ‖w x‖ := by + simpa [s] using + MeasureTheory.SimpleFunc.norm_approxOn_zero_le hw_meas + (s := Set.range w ∪ {0}) (by simp) x n + have hmul_nonneg : 0 ≤ ‖w x‖ + ‖w x‖ := by positivity + have hcoeff_nonneg : + 0 ≤ ‖toFullBlockMat (blockCoeffField (A ω).toFun x) α β‖ := by positivity + calc + ‖s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β‖ + = ‖s n x‖ * ‖toFullBlockMat (blockCoeffField (A ω).toFun x) α β‖ := norm_mul _ _ + _ ≤ (‖w x‖ + ‖w x‖) * C := mul_le_mul hsx hxcoeff hcoeff_nonneg hmul_nonneg + _ = (2 * C) * ‖w x‖ := by ring + have hbound_int : MeasureTheory.Integrable (fun x => (2 * C) * ‖w x‖) μ := by + simpa [mul_assoc] using hw_int.norm.const_mul (2 * C) + have hlim : + ∀ᵐ x ∂ μ, + Tendsto (fun n : ℕ => s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β) + atTop (𝓝 (w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β)) := by + refine Filter.Eventually.of_forall (fun x => ?_) + exact + (MeasureTheory.SimpleFunc.tendsto_approxOn hw_meas + (s := Set.range w ∪ {0}) (y₀ := 0) (by simp) + (x := x) (subset_closure (Or.inl ⟨x, rfl⟩))).mul tendsto_const_nhds + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, μ, s] using + MeasureTheory.tendsto_integral_of_dominated_convergence + (μ := μ) (G := ℝ) + (F := fun n x => s n x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β) + (f := fun x => w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β) + (fun x => (2 * C) * ‖w x‖) + (fun n => (hs_prod_int n).aestronglyMeasurable) hbound_int hbound hlim + exact measurable_of_tendsto_metrizable hs_meas hs_tendsto + +/-- Carrier version, for a general integrable weight (drop the measurability of +`w` by passing to a measurable representative). -/ +theorem measurable_integrableWeightedFullBlockCoeffEntry_carrier + {w : Vec d → ℝ} (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable Ω ℝ mΩ _ + (fun ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := by + classical + let w' : Vec d → ℝ := hw.aestronglyMeasurable.mk w + have hw'_meas : Measurable w' := by + simpa [w'] using hw.aestronglyMeasurable.measurable_mk + have hw'_int : MeasureTheory.Integrable w' (volumeMeasureOn U) := + hw.congr hw.aestronglyMeasurable.ae_eq_mk + have hmeas' : + @Measurable Ω ℝ mΩ _ + (fun ω => + ∫ x in U, w' x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) := + measurable_integrableWeightedFullBlockCoeffEntry_carrier_of_measurable hF hw'_meas hw'_int α β + have hrw : + (fun ω => + ∫ x in U, w x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume) + = fun ω => + ∫ x in U, w' x * toFullBlockMat (blockCoeffField (A ω).toFun x) α β + ∂MeasureTheory.volume := by + funext ω + apply MeasureTheory.integral_congr_ae + filter_upwards [hw.aestronglyMeasurable.ae_eq_mk] with x hx + rw [hx] + rw [hrw]; exact hmeas' + +/-- Carrier block-energy average measurability from `hF`. -/ +theorem measurable_blockEnergyAverage_carrier (X : BlockState d) (hX : MemBlockL2 U X.eval) : + @Measurable Ω ℝ mΩ _ (fun ω => blockEnergyAverage U (A ω).toFun X) := + measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun ω => (A ω).toFun) (X := X) + (fun ω α β => + (hSlice ω).integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 hX α β) + (fun α β => + measurable_integrableWeightedFullBlockCoeffEntry_carrier hF + (integrable_blockEnergyEntryWeight_of_memBlockL2 hX α β) α β) + +end CarrierBlockEnergy + +/-! ## The generic engine -/ + +section CarrierEngine + +variable (Q : TriadicCube d) {A : Ω → RegCoeffField d} + (hSlice : ∀ ω, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω).toFun) + +include hSlice + +/-- **Carrier `L²` realization measurability on a triadic cube.** The half-open +cube is not open, so density of smooth probes is imported from the open core (the +two restricted volume measures agree). -/ +theorem measurable_toHilbertMatrixL2_carrier_cubeSet + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) : + @Measurable Ω (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q))) mΩ (borel _) + (fun ω => + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 + (rawSlice (U := cubeSet Q) (k := k) A hSlice ω)) := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let : MeasurableSpace (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q))) := + borel _ + have : BorelSpace (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q))) := ⟨rfl⟩ + obtain ⟨u, hu, hSmooth⟩ := + exists_dense_smoothProbeSequence_of_dense_smoothProbeSet (U := cubeSet Q) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset_cubeSet Q) + refine measurable_of_measurable_inner_denseRange_polish u hu (fun n => ?_) + rcases hSmooth n with ⟨g, hgL2, hEqn, hg_cont, hg_compact, hg_support⟩ + rw [hEqn] + exact measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_carrier + (mΩ := mΩ) (measurableSet_cubeSet Q) hEntry hgL2 hg_cont hg_compact hg_support + +/-- **The generic carrier `Mu` measurability engine.** Given a carrier source +`A` landing a.e.-elliptically in the AEE quantitative `k`-slice of a triadic cube, +whose localized entry-test generators are `mΩ`-measurable, the coarse-grained +energy `ω ↦ Mu (cubeSet Q) P (A ω).toFun` is `mΩ`-measurable. This is the P5 +carrier re-aim of the raw `Mu`-slice measurability spine. -/ +theorem measurable_Mu_comp_aeeSlice_of_measurable_entryTest + (hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable Ω ℝ mΩ _ (fun ω => entryTestR i j φ (A ω))) + (P : BlockVec d) : + @Measurable Ω ℝ mΩ _ (fun ω => Mu (cubeSet Q) P (A ω).toFun) := by + have hF := measurable_toHilbertMatrixL2_carrier_cubeSet Q hSlice hEntry + have hRewrite : + (fun ω => Mu (cubeSet Q) P (A ω).toFun) + = fun ω => + ⨅ n : ℕ, + blockEnergyAverage (cubeSet Q) (A ω).toFun + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) := by + funext ω + exact mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k (rawSlice A hSlice ω) P + rw [hRewrite] + refine Measurable.iInf (fun n => ?_) + exact measurable_blockEnergyAverage_carrier hF + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + +end CarrierEngine + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/MuFamily.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/MuFamily.lean new file mode 100644 index 0000000000..f7ecea8932 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/AEESliceAssembly/MuFamily.lean @@ -0,0 +1,1109 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability + +/-! # Mu Family -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** measurability of the `Mu` operator family restricted +to `AEEQuantitativeEllipticSlice`s, plus the progressive composition +variants (raw `Mu` → composed `Mu` → a.e. `Mu`) needed by the +`Theorems/Mu.lean` and `Theorems/CanonicalSolutions.lean` consumers. +Combines `AEESliceAssembly/BlockEnergyAverage.lean` with the +`FixedCompetitorEnergyMeasurability` chain on the AEE side of the slice +predicate. + +**Consumed by:** +- `Theorems/Mu.lean :: aemeasurable_Mu_cubeSet` and + `aemeasurable_Mu_cubeSet_of_measurable_aeeQuantitativeSlice` +- `Theorems/CanonicalSolutions.lean :: + aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet` and the rest + of the canonical-solution measurability surface. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem measurable_Mu_aeeQuantitativeSlice + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => Mu U P a.1) := by + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + refine measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq + (A := fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => a.1) + R system mu_eq_muCandidate P ?_ + intro n + exact measurable_blockEnergyAverage_aeeQuantitativeSlice hToL2 + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + (R.affineField_memBlockL2 P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + +/-- Canonical AEE cube-slice measurability of `Mu`, with the Ch4 canonical +operator/generator plumbing supplied internally. -/ +theorem measurable_Mu_aeeQuantitativeSlice_canonical_cubeSet + {d : ℕ} (Q : TriadicCube d) {k : ℕ} (P : BlockVec d) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => Mu (cubeSet Q) P a.1) := by + let : MeasurableSpace {a : CoeffField d // + AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + have hRewrite : + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + Mu (cubeSet Q) P a.1) = + fun a => + ⨅ n : ℕ, + blockEnergyAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) := by + funext a + exact mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k a P + rw [hRewrite] + exact Measurable.iInf fun n => + measurable_blockEnergyAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + +/-- Canonical AEE cube-slice strong measurability of the selected doubled-`Mu` +Hilbert maximizer/minimizer. The proof selects the first dense generator whose +block energy is within `1 / (m + 1)` of `Mu`, and then passes to the Hilbert +energy-gap limit. -/ +theorem stronglyMeasurable_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) {k : ℕ} (P : BlockVec d) : + letI : MeasurableSpace + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + MeasureTheory.StronglyMeasurable + (fun a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P) := by + classical + let U : Set (Vec d) := cubeSet Q + let Ωs := {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + let : MeasurableSpace Ωs := AEEQuantitativeEllipticSlice.localMeasurableSpace U k + let K : ClosedSubmodule ℝ (HilbertBlockL2 U) := + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + let ξ : ℕ → canonicalMuBlockCorrectionGeneratorSubmodule U := + TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule U) + let candidate : ℕ → HilbertBlockL2 U := fun n => + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ n) : HilbertBlockL2 U) + let energy : Ωs → ℕ → ℝ := fun a n => + blockEnergyAverage U a.1 (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + let ε : ℕ → ℝ := fun m => 1 / ((m : ℝ) + 1) + have hEnergy_meas : ∀ n : ℕ, Measurable fun a : Ωs => energy a n := by + intro n + simpa [energy, Ωs, U, ξ] using + measurable_blockEnergyAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + have hMu_meas : Measurable fun a : Ωs => Mu U P a.1 := by + simpa [Ωs, U] using measurable_Mu_aeeQuantitativeSlice_canonical_cubeSet Q (k := k) P + have hExists : ∀ m : ℕ, ∀ a : Ωs, ∃ n : ℕ, energy a n ≤ Mu U P a.1 + ε m := by + intro m a + have hmu : + Mu U P a.1 = ⨅ n : ℕ, energy a n := by + simpa [energy, Ωs, U, ξ] using + mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k a P + have hlt : + (⨅ n : ℕ, energy a n) < (⨅ n : ℕ, energy a n) + ε m := by + have hpos : 0 < ε m := by + simp [ε] + positivity + exact lt_add_of_le_of_pos (le_refl (⨅ n : ℕ, energy a n)) hpos + rcases exists_lt_of_ciInf_lt hlt with ⟨n, hn⟩ + exact ⟨n, le_of_lt (by simpa [hmu] using hn)⟩ + let index : ℕ → Ωs → ℕ := fun m a => Nat.find (hExists m a) + have hGood_meas : + ∀ m n : ℕ, MeasurableSet {a : Ωs | energy a n ≤ Mu U P a.1 + ε m} := by + intro m n + exact measurableSet_le (hEnergy_meas n) (hMu_meas.add measurable_const) + have hIndex_meas : ∀ m : ℕ, Measurable (index m) := by + intro m + simpa [index] using measurable_find (hExists m) (hGood_meas m) + have hCandidate_strong : MeasureTheory.StronglyMeasurable candidate := + MeasureTheory.StronglyMeasurable.of_discrete + have hApprox_strong : + ∀ m : ℕ, MeasureTheory.StronglyMeasurable fun a : Ωs => candidate (index m a) := by + intro m + simpa [Function.comp_def] using hCandidate_strong.comp_measurable (hIndex_meas m) + have hε_tendsto : Tendsto ε atTop (𝓝 0) := by + have hbase : + Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) atTop (𝓝 (0 : ℝ)) := + tendsto_one_div_add_atTop_nhds_zero_nat + simpa [ε] using hbase + have hlim : + Tendsto + (fun m : ℕ => fun a : Ωs => candidate (index m a)) + atTop + (𝓝 fun a : Ωs => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + rw [tendsto_pi_nhds] + intro a + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + have hmem : + ∀ m : ℕ, candidate (index m a) - H.constantField P ∈ K := by + intro m + change + candidate (index m a) - H.constantField P ∈ + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + have hconst : H.constantField P = blockVecToHilbertBlockL2Const (U := U) P := rfl + have hcand : candidate (index m a) = + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m a)) : HilbertBlockL2 U) := rfl + rw [hcand, hconst, add_sub_cancel_left] + exact (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m a))).2 + have hnear : + ∀ m : ℕ, + quadraticEnergy H.energyBilin (candidate (index m a)) ≤ + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by + intro m + have hgood : energy a (index m a) ≤ Mu U P a.1 + ε m := by + simpa [index] using Nat.find_spec (hExists m a) + have hqe : + quadraticEnergy H.energyBilin (candidate (index m a)) = + energy a (index m a) := by + simpa [H, candidate, energy, U, ξ] using! + canonicalAEEMuOperatorSystemData_quadraticEnergy_generatorAffine_eq_blockEnergyAverage + Q k a P (ξ (index m a)) + have hmu : + Mu U P a.1 = + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + simpa [H, K, U, MuHilbertRealization.muCandidate, MuHilbertProblem.muCandidate, + MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! + mu_eq_canonicalAEEMuCandidate Q k a P + calc + quadraticEnergy H.energyBilin (candidate (index m a)) + = energy a (index m a) := hqe + _ ≤ Mu U P a.1 + ε m := hgood + _ = quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by rw [hmu] + exact tendsto_of_quadraticEnergy_le_min_add_eps + K H.energyCoercive H.energySymm (H.constantField P) hmem hε_tendsto hnear + have hAffine : + MeasureTheory.StronglyMeasurable + (fun a : Ωs => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := + stronglyMeasurable_of_tendsto atTop hApprox_strong hlim + simpa [Ωs, U, K, MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! hAffine + +/-- Canonical AEE cube-slice measurability of a fixed block-`L²` test paired +through the Hilbert energy form with the selected canonical doubled-`Mu` +minimizer. This is the source primitive for scalar-response operator-image +averages: the proof uses the same dense-generator selection as the minimizer +measurability theorem, then passes the fixed continuous bilinear functional to +the limit. -/ +theorem measurable_energyBilin_fixed_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) {k : ℕ} (P : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + letI : MeasurableSpace + {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k + Measurable + (fun a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P)) := by + classical + let U : Set (Vec d) := cubeSet Q + let Ωs := {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + let : MeasurableSpace Ωs := AEEQuantitativeEllipticSlice.localMeasurableSpace U k + let K : ClosedSubmodule ℝ (HilbertBlockL2 U) := + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + let ξ : ℕ → canonicalMuBlockCorrectionGeneratorSubmodule U := + TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule U) + let y : HilbertBlockL2 U := + toHilbertBlockL2OfBlockField (U := U) (by simpa [U] using hY) + let candidate : ℕ → HilbertBlockL2 U := fun n => + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ n) : HilbertBlockL2 U) + let energy : Ωs → ℕ → ℝ := fun a n => + blockEnergyAverage U a.1 (canonicalMuGeneratorAffineField (U := U) P (ξ n)) + let ε : ℕ → ℝ := fun m => 1 / ((m : ℝ) + 1) + have hEnergy_meas : ∀ n : ℕ, Measurable fun a : Ωs => energy a n := by + intro n + simpa [energy, Ωs, U, ξ] using + measurable_blockEnergyAverage_aeeQuantitativeSlice + (measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet Q k) + (canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet Q) P + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) + have hMu_meas : Measurable fun a : Ωs => Mu U P a.1 := by + simpa [Ωs, U] using measurable_Mu_aeeQuantitativeSlice_canonical_cubeSet Q (k := k) P + have hExists : ∀ m : ℕ, ∀ a : Ωs, ∃ n : ℕ, energy a n ≤ Mu U P a.1 + ε m := by + intro m a + have hmu : + Mu U P a.1 = ⨅ n : ℕ, energy a n := by + simpa [energy, Ωs, U, ξ] using + mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator Q k a P + have hlt : + (⨅ n : ℕ, energy a n) < (⨅ n : ℕ, energy a n) + ε m := by + have hpos : 0 < ε m := by + simp [ε] + positivity + exact lt_add_of_le_of_pos (le_refl (⨅ n : ℕ, energy a n)) hpos + rcases exists_lt_of_ciInf_lt hlt with ⟨n, hn⟩ + exact ⟨n, le_of_lt (by simpa [hmu] using hn)⟩ + let index : ℕ → Ωs → ℕ := fun m a => Nat.find (hExists m a) + have hGood_meas : + ∀ m n : ℕ, MeasurableSet {a : Ωs | energy a n ≤ Mu U P a.1 + ε m} := by + intro m n + exact measurableSet_le (hEnergy_meas n) (hMu_meas.add measurable_const) + have hApprox_meas : + ∀ n : ℕ, + Measurable fun a : Ωs => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + y (candidate n) := by + intro n + simpa [Ωs, U, y, candidate, ξ] using + measurable_energyBilin_fixed_canonicalMuGeneratorAffineField_aeeQuantitativeSlice_cubeSet + Q k P Y hY + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n) + have hSelected_meas : + ∀ m : ℕ, + Measurable fun a : Ωs => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + y (candidate (index m a)) := by + intro m + let p : ℕ → Ωs → Prop := + fun n a => energy a n ≤ Mu U P a.1 + ε m + have hp : ∀ n : ℕ, MeasurableSet {a : Ωs | p n a} := by + intro n + simpa [p] using hGood_meas m n + have hexists : ∀ a : Ωs, ∃ n : ℕ, p n a := by + intro a + simpa [p] using hExists m a + simpa [p, index] using + (Measurable.find + (f := fun n a => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + y (candidate n)) + (p := p) hApprox_meas hp hexists) + have hSelected_strong : + ∀ m : ℕ, + MeasureTheory.StronglyMeasurable fun a : Ωs => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + y (candidate (index m a)) := + fun m => (hSelected_meas m).stronglyMeasurable + have hε_tendsto : Tendsto ε atTop (𝓝 0) := by + have hbase : + Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) atTop (𝓝 (0 : ℝ)) := + tendsto_one_div_add_atTop_nhds_zero_nat + simpa [ε] using hbase + have hlim_scalar : + Tendsto + (fun m : ℕ => fun a : Ωs => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + y (candidate (index m a))) + atTop + (𝓝 fun a : Ωs => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + H.energyBilin y (H.minimizerMap P)) := by + rw [tendsto_pi_nhds] + intro a + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + have hmem : + ∀ m : ℕ, candidate (index m a) - H.constantField P ∈ K := by + intro m + change + candidate (index m a) - H.constantField P ∈ + (canonicalAEEMuCorrectionSpaceData Q).correctionSpace + have hconst : H.constantField P = blockVecToHilbertBlockL2Const (U := U) P := rfl + have hcand : candidate (index m a) = + blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m a)) : HilbertBlockL2 U) := rfl + rw [hcand, hconst, add_sub_cancel_left] + exact (canonicalMuCorrectionGeneratorEmbedding U (ξ (index m a))).2 + have hnear : + ∀ m : ℕ, + quadraticEnergy H.energyBilin (candidate (index m a)) ≤ + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by + intro m + have hgood : energy a (index m a) ≤ Mu U P a.1 + ε m := by + simpa [index] using Nat.find_spec (hExists m a) + have hqe : + quadraticEnergy H.energyBilin (candidate (index m a)) = + energy a (index m a) := by + simpa [H, candidate, energy, U, ξ] using! + canonicalAEEMuOperatorSystemData_quadraticEnergy_generatorAffine_eq_blockEnergyAverage + Q k a P (ξ (index m a)) + have hmu : + Mu U P a.1 = + quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) := by + simpa [H, K, U, MuHilbertRealization.muCandidate, MuHilbertProblem.muCandidate, + MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! + mu_eq_canonicalAEEMuCandidate Q k a P + calc + quadraticEnergy H.energyBilin (candidate (index m a)) + = energy a (index m a) := hqe + _ ≤ Mu U P a.1 + ε m := hgood + _ = quadraticEnergy H.energyBilin + (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P)) + + ε m := by rw [hmu] + have hHilbert : + Tendsto (fun m : ℕ => candidate (index m a)) atTop + (𝓝 (affineMinimizerMap K H.energyBilin H.energyCoercive (H.constantField P))) := + tendsto_of_quadraticEnergy_le_min_add_eps + K H.energyCoercive H.energySymm (H.constantField P) hmem hε_tendsto hnear + have hHilbert' : + Tendsto (fun m : ℕ => candidate (index m a)) atTop + (𝓝 (H.minimizerMap P)) := by + simpa [H, K, MuHilbertRealization.minimizerMap, MuHilbertProblem.minimizerMap, + parameterAffineMinimizerMap] using! hHilbert + exact (H.energyBilin y).continuous.tendsto + (H.minimizerMap P) |>.comp hHilbert' + have hStrong : + MeasureTheory.StronglyMeasurable + (fun a : Ωs => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + H.energyBilin y (H.minimizerMap P)) := + stronglyMeasurable_of_tendsto atTop hSelected_strong hlim_scalar + have hMeas : + Measurable + (fun a : Ωs => + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + H.energyBilin y (H.minimizerMap P)) := + hStrong.measurable + simpa [Ωs, U, y] using hMeas + +/-- Canonical composed AEE cube-slice measurability of `Mu`. -/ +theorem measurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} (Q : TriadicCube d) {k : ℕ} + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A (cubeSet Q)) + (hSlice : ∀ ω : Ω, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)) + (P : BlockVec d) : + Measurable fun ω => Mu (cubeSet Q) P (A ω) := by + let As : Ω → {a : CoeffField d // + AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // + AEEQuantitativeEllipticSlice (cubeSet Q) k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) As := + measurable_subtype_mk_aeeQuantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hMu : + @Measurable {a : CoeffField d // + AEEQuantitativeEllipticSlice (cubeSet Q) k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel ℝ) + (fun a => Mu (cubeSet Q) P a.1) := + measurable_Mu_aeeQuantitativeSlice_canonical_cubeSet Q P + change Measurable ((fun a : {a : CoeffField d // + AEEQuantitativeEllipticSlice (cubeSet Q) k a} => + Mu (cubeSet Q) P a.1) ∘ As) + exact hMu.comp hAs + +/-- Canonical countable-cover AEE cube-slice measurability of `Mu`. -/ +theorem measurable_Mu_comp_countable_aeeQuantitativeSlice_canonical_cubeSet_cover + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} (Q : TriadicCube d) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A (cubeSet Q)) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover : ⋃ k : ℕ, t k = Set.univ) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)) + (P : BlockVec d) : + Measurable fun ω => Mu (cubeSet Q) P (A ω) := by + classical + let f : (k : ℕ) → t k → ℝ := + fun k ω => Mu (cubeSet Q) P (A ω.1) + have hfm : ∀ k : ℕ, Measurable (f k) := by + intro k + have hA_sub : IsPointwiseLocalSigmaMeasurableOn + (fun ω : t k => A ω.1) (cubeSet Q) := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : t k, + AEEQuantitativeEllipticSlice (cubeSet Q) k + ((fun ω : t k => A ω.1) ω) := by + intro ω + exact hSlice k ω.1 ω.2 + exact measurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet + Q (fun ω : t k => A ω.1) hA_sub hSlice_sub P + have hagree : + ∀ (i j : ℕ) (ω : Ω) (hωi : ω ∈ t i) (hωj : ω ∈ t j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + rfl + have hLift : Measurable (Set.liftCover t f hagree hcover) := + measurable_liftCover t ht f hfm hagree hcover + have hEq : Set.liftCover t f hagree hcover = + (fun ω => Mu (cubeSet Q) P (A ω)) := by + funext ω + obtain ⟨k, hωk⟩ : ∃ k : ℕ, ω ∈ t k := by + have hω_cover : ω ∈ ⋃ k : ℕ, t k := by + rw [hcover] + exact Set.mem_univ ω + exact Set.mem_iUnion.mp hω_cover + rw [Set.liftCover_of_mem (S := t) (f := f) (hf := hagree) (hS := hcover) hωk] + simpa [hEq] using hLift + +/-- Canonical a.e. countable-cover AEE cube-slice measurability of `Mu`. -/ +theorem aemeasurable_Mu_comp_countable_aeeQuantitativeSlice_canonical_cubeSet_cover + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} (Q : TriadicCube d) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A (cubeSet Q)) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu (cubeSet Q) P (A ω)) μ := by + classical + let S : Set Ω := ⋃ k : ℕ, t k + let cover : Option ℕ → Set Ω + | none => Sᶜ + | some k => t k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, ω => Mu (cubeSet Q) P (A ω.1) + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => exact (MeasurableSet.iUnion ht).compl + | some k => exact ht k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hA_sub : IsPointwiseLocalSigmaMeasurableOn + (fun ω : cover (some k) => A ω.1) (cubeSet Q) := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp, cover] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : cover (some k), + AEEQuantitativeEllipticSlice (cubeSet Q) k + ((fun ω : cover (some k) => A ω.1) ω) := by + intro ω + have hω : ω.1 ∈ t k := by + simp [cover] at ω + exact ω.2 + exact hSlice k ω.1 hω + simpa [f, cover] using + measurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet + Q (fun ω : cover (some k) => A ω.1) hA_sub hSlice_sub P + have hagree : + ∀ (i j : Option ℕ) (ω : Ω) (hωi : ω ∈ cover i) (hωj : ω ∈ cover j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + cases i with + | none => + cases j with + | none => rfl + | some k => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωj⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωi + exact hω_notS hωS + | some k => + cases j with + | none => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωi⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωj + exact hω_notS hωS + | some _ => rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + by_cases hωS : ω ∈ S + · obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hωk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using hωS⟩ + have hLift : Measurable (Set.liftCover cover f hagree hcover) := + measurable_liftCover cover hcover_meas f hfm hagree hcover + have hEq : + (fun ω => Mu (cubeSet Q) P (A ω)) =ᵐ[μ] Set.liftCover cover f hagree hcover := by + filter_upwards [hcover_ae] with ω hωS + obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hωk)] + exact hLift.aemeasurable.congr hEq.symm + +/-- Canonical set-cover AEE cube-slice measurability of `Mu`. -/ +theorem measurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet_sets + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} (Q : TriadicCube d) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A (cubeSet Q)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)}) + (hcover : + ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)) + (P : BlockVec d) : + Measurable fun ω => Mu (cubeSet Q) P (A ω) := by + classical + let t : ℕ → Set Ω := + fun k => {ω : Ω | AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set : ⋃ k : ℕ, t k = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + exact Set.mem_iUnion.mpr (hcover ω) + exact measurable_Mu_comp_countable_aeeQuantitativeSlice_canonical_cubeSet_cover + Q A hA t ht hcover_set (fun k ω hω => hω) P + +/-- Canonical a.e. set-cover AEE cube-slice measurability of `Mu`. -/ +theorem aemeasurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet_sets + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} (Q : TriadicCube d) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A (cubeSet Q)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)}) + (hcover_ae : + ∀ᵐ ω ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu (cubeSet Q) P (A ω)) μ := by + classical + let t : ℕ → Set Ω := + fun k => {ω : Ω | AEEQuantitativeEllipticSlice (cubeSet Q) k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k := by + filter_upwards [hcover_ae] with ω hω + exact Set.mem_iUnion.mpr hω + exact aemeasurable_Mu_comp_countable_aeeQuantitativeSlice_canonical_cubeSet_cover + μ Q A hA t ht hcover_set_ae (fun k ω hω => hω) P + +/-- Canonical cube-set `HasMeasurableMuFamily` from an AEE quantitative-slice +cover. -/ +theorem hasMeasurableMuFamily_of_measurable_aeeQuantitativeSlice_sets_canonical_cubeSet + {d : ℕ} (Q : TriadicCube d) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) (cubeSet Q)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet {a : CoeffField d | + AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (hcover : + ∀ a : CoeffField d, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a) : + HasMeasurableMuFamily (cubeSet Q) := by + intro P + simpa using + (measurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet_sets + (Q := Q) (A := fun a : CoeffField d => a) hLocal hSliceMeas hcover P) + +/-- Canonical law-facing a.e. AEE cube-slice `Mu` family bridge. -/ +theorem aemeasurable_Mu_family_of_aeeQuantitativeSlice_sets_canonical_cubeSet + {d : ℕ} (Q : TriadicCube d) + (μ : MeasureTheory.Measure (CoeffField d)) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) (cubeSet Q)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet {a : CoeffField d | + AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (hcover_ae : + ∀ᵐ a ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a) : + ∀ P : BlockVec d, AEMeasurable (fun a : CoeffField d => Mu (cubeSet Q) P a) μ := by + intro P + simpa using + (aemeasurable_Mu_comp_aeeQuantitativeSlice_canonical_cubeSet_sets + μ (Q := Q) (A := fun a : CoeffField d => a) hLocal hSliceMeas hcover_ae P) + +theorem measurable_Mu_comp_aeeQuantitativeSlice + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + let As : Ω → {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + _ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) As := + measurable_subtype_mk_aeeQuantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hMu : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => Mu U P a.1) := + measurable_Mu_aeeQuantitativeSlice hToL2 R system mu_eq_muCandidate P + change Measurable ((fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + Mu U P a.1) ∘ As) + exact hMu.comp hAs + +theorem measurable_Mu_comp_countable_aeeQuantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover : ⋃ k : ℕ, t k = Set.univ) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + classical + let f : (k : ℕ) → t k → ℝ := + fun k ω => Mu U P (A ω.1) + have hfm : ∀ k : ℕ, Measurable (f k) := by + intro k + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : t k => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : t k, + AEEQuantitativeEllipticSlice U k ((fun ω : t k => A ω.1) ω) := by + intro ω + exact hSlice k ω.1 ω.2 + exact measurable_Mu_comp_aeeQuantitativeSlice + (hToL2 k) (fun ω : t k => A ω.1) hA_sub hSlice_sub + R (system k) (mu_eq_muCandidate k) P + have hagree : + ∀ (i j : ℕ) (ω : Ω) (hωi : ω ∈ t i) (hωj : ω ∈ t j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + rfl + have hLift : Measurable (Set.liftCover t f hagree hcover) := + measurable_liftCover t ht f hfm hagree hcover + have hEq : Set.liftCover t f hagree hcover = + (fun ω => Mu U P (A ω)) := by + funext ω + obtain ⟨k, hωk⟩ : ∃ k : ℕ, ω ∈ t k := by + have hω_cover : ω ∈ ⋃ k : ℕ, t k := by + rw [hcover] + exact Set.mem_univ ω + exact Set.mem_iUnion.mp hω_cover + rw [Set.liftCover_of_mem (S := t) (f := f) (hf := hagree) (hS := hcover) hωk] + simpa [hEq] using hLift + +theorem aemeasurable_Mu_comp_countable_aeeQuantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → + AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + classical + let S : Set Ω := ⋃ k : ℕ, t k + let cover : Option ℕ → Set Ω + | none => Sᶜ + | some k => t k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, ω => Mu U P (A ω.1) + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => exact (MeasurableSet.iUnion ht).compl + | some k => exact ht k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : cover (some k) => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp, cover] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : cover (some k), + AEEQuantitativeEllipticSlice U k ((fun ω : cover (some k) => A ω.1) ω) := by + intro ω + have hω : ω.1 ∈ t k := by + simp [cover] at ω + exact ω.2 + exact hSlice k ω.1 hω + simpa [f, cover] using + measurable_Mu_comp_aeeQuantitativeSlice + (hToL2 k) (fun ω : cover (some k) => A ω.1) hA_sub hSlice_sub + R (system k) (mu_eq_muCandidate k) P + have hagree : + ∀ (i j : Option ℕ) (ω : Ω) (hωi : ω ∈ cover i) (hωj : ω ∈ cover j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + cases i with + | none => + cases j with + | none => rfl + | some k => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωj⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωi + exact hω_notS hωS + | some k => + cases j with + | none => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωi⟩ + have hω_notS : ω ∉ S := by simpa [cover] using hωj + exact hω_notS hωS + | some _ => rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + by_cases hωS : ω ∈ S + · obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hωk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using hωS⟩ + have hLift : Measurable (Set.liftCover cover f hagree hcover) := + measurable_liftCover cover hcover_meas f hfm hagree hcover + have hEq : + (fun ω => Mu U P (A ω)) =ᵐ[μ] Set.liftCover cover f hagree hcover := by + filter_upwards [hcover_ae] with ω hωS + obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hωk)] + exact hLift.aemeasurable.congr hEq.symm + +theorem measurable_Mu_comp_aeeQuantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover : ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set : ⋃ k : ℕ, t k = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + exact Set.mem_iUnion.mpr (hcover ω) + exact measurable_Mu_comp_countable_aeeQuantitativeSlice_cover + hToL2 A hA t ht hcover_set (fun k ω hω => hω) + R system mu_eq_muCandidate P + +theorem aemeasurable_Mu_comp_aeeQuantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k := by + filter_upwards [hcover_ae] with ω hω + exact Set.mem_iUnion.mpr hω + exact aemeasurable_Mu_comp_countable_aeeQuantitativeSlice_cover + μ hToL2 A hA t ht hcover_set_ae (fun k ω hω => hω) + R system mu_eq_muCandidate P + +theorem aemeasurable_Mu_comp_aeeQuantitativeSlice_sets_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + exact aemeasurable_Mu_comp_aeeQuantitativeSlice_sets μ + (fun _k => measurable_toHilbertMatrixL2_aee_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSliceMeas hcover_ae R system mu_eq_muCandidate P + +/-- Build the ambient `HasMeasurableMuFamily U` hypothesis from a measurable +AEE quantitative-slice cover. + +The explicit `hLocal` hypothesis records that the sampled coefficient field is +measurable into the local coefficient-field sigma algebra on `U`. For the +identity map on ambient coefficient fields this is now supplied by the public +coefficient-field measurable-space API. -/ +theorem hasMeasurableMuFamily_of_measurable_aeeQuantitativeSlice_sets + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {a : CoeffField d | AEEQuantitativeEllipticSlice U k a}) + (hcover : ∀ a : CoeffField d, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) : + HasMeasurableMuFamily U := by + intro P + simpa using + (measurable_Mu_comp_aeeQuantitativeSlice_sets + (hToL2 := hToL2) + (A := fun a : CoeffField d => a) hLocal hSliceMeas hcover + R system mu_eq_muCandidate P) + +/-- Open finite-volume version of +`hasMeasurableMuFamily_of_measurable_aeeQuantitativeSlice_sets`, with the +smooth-probe Hilbert `L²` measurability supplied internally. -/ +theorem hasMeasurableMuFamily_of_measurable_aeeQuantitativeSlice_sets_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {a : CoeffField d | AEEQuantitativeEllipticSlice U k a}) + (hcover : ∀ a : CoeffField d, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) : + HasMeasurableMuFamily U := by + exact hasMeasurableMuFamily_of_measurable_aeeQuantitativeSlice_sets + (fun _k => measurable_toHilbertMatrixL2_aee_of_isOpen_volume_ne_top hUopen hUfinite) + hLocal hSliceMeas hcover R system mu_eq_muCandidate + +/-- Law-facing a.e. version of the AEE-slice `Mu` family bridge. This is +the form naturally produced by a random law whose fields are only known to be +locally uniformly elliptic almost surely. -/ +theorem aemeasurable_Mu_family_of_aeeQuantitativeSlice_sets + {d : ℕ} {U : Set (Vec d)} + (μ : MeasureTheory.Measure (CoeffField d)) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {a : CoeffField d | AEEQuantitativeEllipticSlice U k a}) + (hcover_ae : + ∀ᵐ a ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) : + ∀ P : BlockVec d, AEMeasurable (fun a : CoeffField d => Mu U P a) μ := by + intro P + simpa using + (aemeasurable_Mu_comp_aeeQuantitativeSlice_sets μ + (hToL2 := hToL2) + (A := fun a : CoeffField d => a) hLocal hSliceMeas hcover_ae + R system mu_eq_muCandidate P) + +/-- Open finite-volume version of the law-facing a.e. AEE-slice `Mu` +family bridge. -/ +theorem aemeasurable_Mu_family_of_aeeQuantitativeSlice_sets_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} + (μ : MeasureTheory.Measure (CoeffField d)) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (hLocal : IsPointwiseLocalSigmaMeasurableOn (fun a : CoeffField d => a) U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {a : CoeffField d | AEEQuantitativeEllipticSlice U k a}) + (hcover_ae : + ∀ᵐ a ∂μ, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) : + ∀ P : BlockVec d, AEMeasurable (fun a : CoeffField d => Mu U P a) μ := by + exact aemeasurable_Mu_family_of_aeeQuantitativeSlice_sets μ + (fun _k => measurable_toHilbertMatrixL2_aee_of_isOpen_volume_ne_top hUopen hUfinite) + hLocal hSliceMeas hcover_ae R system mu_eq_muCandidate + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability.lean new file mode 100644 index 0000000000..900ae03d11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Basic.lean new file mode 100644 index 0000000000..eab516037c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Basic.lean @@ -0,0 +1,624 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import Mathlib.Analysis.Matrix.Normed +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Basic +public import Mathlib.MeasureTheory.SpecificCodomains.Pi + +/-! # Basic -/ + +@[expose] public section + +open scoped Matrix.Norms.Elementwise + +namespace Homogenization + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** the product measurable structure on `Mat d` and +`FullBlockMat d` coincides with their Borel σ-algebras, giving the generic +Bochner-integral API a measurable-target for full coarse matrices. + +**Consumed by:** +- `Homogenization/Book/Ch04/AnnealedObjects.lean` +- `Homogenization/Book/Ch04/Theorems/CoarseObservables.lean` + (`aemeasurable_coarseFullBlockMatrix_cubeSet` and entrywise wrappers) +- `Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Mu.lean` + +If the single-claim summary above grows into three or more distinct claims, +split or refactor per the rebuild contract. +-/ + +/-- The product measurable structure on `Mat d` agrees with its Borel +sigma-algebra. This lets the generic Bochner-integral API target full coarse +matrices directly. -/ +instance instBorelSpaceMat (d : ℕ) : BorelSpace (Mat d) := by + change BorelSpace (Fin d → Fin d → ℝ) + infer_instance + +instance instMeasurableSpaceFullBlockMat (d : ℕ) : MeasurableSpace (FullBlockMat d) := by + change MeasurableSpace (BlockCoord d → BlockCoord d → ℝ) + infer_instance + +/-- The unfolded `2d × 2d` block matrices carry the Borel sigma-algebra coming +from their coordinatewise matrix topology. -/ +instance instBorelSpaceFullBlockMat (d : ℕ) : BorelSpace (FullBlockMat d) := by + change BorelSpace (BlockCoord d → BlockCoord d → ℝ) + infer_instance + +/-- `Matrix.instTopologicalSpace` (the ambient, always-active topology on `Matrix m n R`, +coming from the coordinatewise Pi topology) and the elementwise-norm-derived topology from +`open scoped Matrix.Norms.Elementwise` are only defeq once `Matrix` is unfolded to its +underlying Pi type, which instance search will not do on its own. This head-class cache +resolves the resulting `ContinuousENorm` synthesis gap for every `Matrix m n ℝ`-valued +`Measurable`/`Integrable` statement in this file (and its `Mat d`/`FullBlockMat d` +specializations). -/ +private instance instContinuousENormMatrix {m n : Type*} [Fintype m] [Fintype n] : + ContinuousENorm (Matrix m n ℝ) := by + show ContinuousENorm (m → n → ℝ) + infer_instance + +/-- Strong ambient measurability of the variational quantity `Mu U P a` for +every deterministic block loading `P`. -/ +def HasMeasurableMuFamily {d : ℕ} (U : Set (Vec d)) : Prop := + ∀ P : BlockVec d, Measurable fun a : CoeffField d => Mu U P a + +/-- Transport `HasMeasurableMuFamily` across pointwise identities for the full +`Mu` family. -/ +theorem hasMeasurableMuFamily_of_forall_mu_eq + {d : ℕ} {U V : Set (Vec d)} + (hMu : HasMeasurableMuFamily V) + (hEq : ∀ P : BlockVec d, ∀ a : CoeffField d, Mu U P a = Mu V P a) : + HasMeasurableMuFamily U := by + intro P + have hFun : + (fun a : CoeffField d => Mu U P a) = fun a => Mu V P a := by + funext a + exact hEq P a + rw [hFun] + exact hMu P + +/-- Two domains share the same measurable `Mu` family whenever their `Mu` +values agree pointwise on every deterministic loading. -/ +theorem hasMeasurableMuFamily_iff_of_forall_mu_eq + {d : ℕ} {U V : Set (Vec d)} + (hEq : ∀ P : BlockVec d, ∀ a : CoeffField d, Mu U P a = Mu V P a) : + HasMeasurableMuFamily U ↔ HasMeasurableMuFamily V := by + constructor + · intro hMu + exact hasMeasurableMuFamily_of_forall_mu_eq hMu (fun P a => (hEq P a).symm) + · intro hMu + exact hasMeasurableMuFamily_of_forall_mu_eq hMu hEq + +/-- The `(r,c)` entry of the coarse inverse-star matrix observable +`a ↦ \sigma_*^{-1}(U; a)`. -/ +noncomputable def coarseSigmaStarInvEntryObservable {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) : CoeffField d → ℝ := + fun a => (coarseBlockMatrix U a).lowerRight r c + +/-- The `(r,c)` entry of the coarse upper-left block observable +`a ↦ b(U; a)`. -/ +noncomputable def coarseBEntryObservable {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) : CoeffField d → ℝ := + fun a => (coarseBlockMatrix U a).upperLeft r c + +/-- The `(r,c)` entry of the mean mixed observable +`a ↦ \sigma_*^{-1}(U; a)\kappa(U; a)`. -/ +noncomputable def coarseSigmaStarInvKappaMeanEntryObservable {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) : CoeffField d → ℝ := + fun a => -((coarseBlockMatrix U a).lowerLeft r c) + +/-- The `(r,c)` entry of the upper-right block of the doubled coarse matrix. -/ +noncomputable def coarseUpperRightEntryObservable {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) : CoeffField d → ℝ := + fun a => (coarseBlockMatrix U a).upperRight r c + +/-- The `(r,c)` entry of the lower-left block of the doubled coarse matrix. -/ +noncomputable def coarseLowerLeftEntryObservable {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) : CoeffField d → ℝ := + fun a => (coarseBlockMatrix U a).lowerLeft r c + +/-- The full doubled coarse matrix observable in the unfolded `2d × 2d` form. -/ +noncomputable def coarseFullBlockMatrixObservable {d : ℕ} (U : Set (Vec d)) : + CoeffField d → FullBlockMat d := + fun a => toFullBlockMat (coarseBlockMatrix U a) + +/-- The upper-left `d × d` block of an unfolded coarse matrix. -/ +def fullBlockMatUpperLeft {d : ℕ} : FullBlockMat d → Mat d := + fun M i j => M (Sum.inl i) (Sum.inl j) + +/-- The upper-right `d × d` block of an unfolded coarse matrix. -/ +def fullBlockMatUpperRight {d : ℕ} : FullBlockMat d → Mat d := + fun M i j => M (Sum.inl i) (Sum.inr j) + +/-- The lower-left `d × d` block of an unfolded coarse matrix. -/ +def fullBlockMatLowerLeft {d : ℕ} : FullBlockMat d → Mat d := + fun M i j => M (Sum.inr i) (Sum.inl j) + +/-- The lower-right `d × d` block of an unfolded coarse matrix. -/ +def fullBlockMatLowerRight {d : ℕ} : FullBlockMat d → Mat d := + fun M i j => M (Sum.inr i) (Sum.inr j) + +/-- The negative lower-left block, matching the note-facing observable +`\sigma_*^{-1}(U; a)\kappa(U; a)`. -/ +def fullBlockMatNegLowerLeft {d : ℕ} : FullBlockMat d → Mat d := + fun M i j => -M (Sum.inr i) (Sum.inl j) + +/-- The full coarse inverse-star matrix observable `a ↦ \sigma_*^{-1}(U; a)`. -/ +noncomputable def coarseSigmaStarInvObservable {d : ℕ} (U : Set (Vec d)) : + CoeffField d → Mat d := + fullBlockMatLowerRight ∘ coarseFullBlockMatrixObservable U + +/-- The full coarse upper-left block observable `a ↦ b(U; a)`. -/ +noncomputable def coarseBObservable {d : ℕ} (U : Set (Vec d)) : + CoeffField d → Mat d := + fullBlockMatUpperLeft ∘ coarseFullBlockMatrixObservable U + +/-- The full mean mixed observable `a ↦ \sigma_*^{-1}(U; a)\kappa(U; a)`. -/ +noncomputable def coarseSigmaStarInvKappaMeanObservable {d : ℕ} (U : Set (Vec d)) : + CoeffField d → Mat d := + fullBlockMatNegLowerLeft ∘ coarseFullBlockMatrixObservable U + +@[simp] theorem fullBlockMatUpperLeft_apply {d : ℕ} (M : FullBlockMat d) (i j : Fin d) : + fullBlockMatUpperLeft M i j = M (Sum.inl i) (Sum.inl j) := + rfl + +@[simp] theorem fullBlockMatUpperRight_apply {d : ℕ} (M : FullBlockMat d) (i j : Fin d) : + fullBlockMatUpperRight M i j = M (Sum.inl i) (Sum.inr j) := + rfl + +@[simp] theorem fullBlockMatLowerLeft_apply {d : ℕ} (M : FullBlockMat d) (i j : Fin d) : + fullBlockMatLowerLeft M i j = M (Sum.inr i) (Sum.inl j) := + rfl + +@[simp] theorem fullBlockMatLowerRight_apply {d : ℕ} (M : FullBlockMat d) (i j : Fin d) : + fullBlockMatLowerRight M i j = M (Sum.inr i) (Sum.inr j) := + rfl + +@[simp] theorem fullBlockMatNegLowerLeft_apply {d : ℕ} (M : FullBlockMat d) (i j : Fin d) : + fullBlockMatNegLowerLeft M i j = -M (Sum.inr i) (Sum.inl j) := + rfl + +@[simp] theorem coarseSigmaStarInvEntryObservable_apply {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) (a : CoeffField d) : + coarseSigmaStarInvEntryObservable U r c a = + (coarseBlockMatrix U a).lowerRight r c := + rfl + +@[simp] theorem coarseSigmaStarInvObservable_apply {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : + coarseSigmaStarInvObservable U a = (coarseBlockMatrix U a).lowerRight := + rfl + +@[simp] theorem coarseBEntryObservable_apply {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) (a : CoeffField d) : + coarseBEntryObservable U r c a = + (coarseBlockMatrix U a).upperLeft r c := + rfl + +@[simp] theorem coarseBObservable_apply {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : + coarseBObservable U a = (coarseBlockMatrix U a).upperLeft := + rfl + +@[simp] theorem coarseSigmaStarInvKappaMeanEntryObservable_apply {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) (a : CoeffField d) : + coarseSigmaStarInvKappaMeanEntryObservable U r c a = + -((coarseBlockMatrix U a).lowerLeft r c) := + rfl + +@[simp] theorem coarseUpperRightEntryObservable_apply {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) (a : CoeffField d) : + coarseUpperRightEntryObservable U r c a = + (coarseBlockMatrix U a).upperRight r c := + rfl + +@[simp] theorem coarseLowerLeftEntryObservable_apply {d : ℕ} (U : Set (Vec d)) + (r c : Fin d) (a : CoeffField d) : + coarseLowerLeftEntryObservable U r c a = + (coarseBlockMatrix U a).lowerLeft r c := + rfl + +@[simp] theorem coarseSigmaStarInvKappaMeanObservable_apply {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : + coarseSigmaStarInvKappaMeanObservable U a = -((coarseBlockMatrix U a).lowerLeft) := + rfl + +@[simp] theorem coarseFullBlockMatrixObservable_apply {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : + coarseFullBlockMatrixObservable U a = toFullBlockMat (coarseBlockMatrix U a) := + rfl + +theorem measurable_fullBlockMatUpperLeft {d : ℕ} : + Measurable (fullBlockMatUpperLeft (d := d)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + change Measurable fun M : FullBlockMat d => M (Sum.inl i) (Sum.inl j) + have hRow : Measurable fun M : FullBlockMat d => M (Sum.inl i) := + measurable_pi_apply (Sum.inl i) + exact Measurable.eval hRow + +theorem measurable_fullBlockMatUpperRight {d : ℕ} : + Measurable (fullBlockMatUpperRight (d := d)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + change Measurable fun M : FullBlockMat d => M (Sum.inl i) (Sum.inr j) + have hRow : Measurable fun M : FullBlockMat d => M (Sum.inl i) := + measurable_pi_apply (Sum.inl i) + exact Measurable.eval hRow + +theorem measurable_fullBlockMatLowerLeft {d : ℕ} : + Measurable (fullBlockMatLowerLeft (d := d)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + change Measurable fun M : FullBlockMat d => M (Sum.inr i) (Sum.inl j) + have hRow : Measurable fun M : FullBlockMat d => M (Sum.inr i) := + measurable_pi_apply (Sum.inr i) + exact Measurable.eval hRow + +theorem measurable_fullBlockMatLowerRight {d : ℕ} : + Measurable (fullBlockMatLowerRight (d := d)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + change Measurable fun M : FullBlockMat d => M (Sum.inr i) (Sum.inr j) + have hRow : Measurable fun M : FullBlockMat d => M (Sum.inr i) := + measurable_pi_apply (Sum.inr i) + exact Measurable.eval hRow + +theorem measurable_fullBlockMatNegLowerLeft {d : ℕ} : + Measurable (fullBlockMatNegLowerLeft (d := d)) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + change Measurable fun M : FullBlockMat d => -M (Sum.inr i) (Sum.inl j) + have hRow : Measurable fun M : FullBlockMat d => M (Sum.inr i) := + measurable_pi_apply (Sum.inr i) + exact (Measurable.eval hRow).neg + +/-- Entrywise evaluation of a Bochner integral of matrix-valued functions. -/ +theorem integral_matrix_apply {α m n : Type*} [MeasurableSpace α] + {μ : MeasureTheory.Measure α} [Fintype m] [Fintype n] + {f : α → Matrix m n ℝ} (hf : MeasureTheory.Integrable f μ) (i : m) (j : n) : + (∫ x, f x ∂μ) i j = ∫ x, f x i j ∂μ := by + have hRow : ∀ i, MeasureTheory.Integrable (fun x => f x i) μ := + fun i => MeasureTheory.Integrable.eval hf i + calc + (∫ x, f x ∂μ) i j = (∫ x, f x i ∂μ) j := by + simpa using! congrArg (fun g => g j) + (MeasureTheory.eval_integral (μ := μ) (f := f) hRow i) + _ = ∫ x, f x i j ∂μ := by + simpa using MeasureTheory.eval_integral (μ := μ) (f := fun x => f x i) + (fun j => MeasureTheory.Integrable.eval (hRow i) j) j + +theorem integrable_coarseSigmaStarInvObservable_of_integrable_coarseFullBlockMatrixObservable + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} {U : Set (Vec d)} + (hInt : MeasureTheory.Integrable (coarseFullBlockMatrixObservable U) P) : + MeasureTheory.Integrable (coarseSigmaStarInvObservable U) P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro i + refine MeasureTheory.Integrable.of_eval ?_ + intro j + simpa [coarseSigmaStarInvObservable, coarseFullBlockMatrixObservable, fullBlockMatLowerRight] + using MeasureTheory.Integrable.eval + (MeasureTheory.Integrable.eval hInt (Sum.inr i)) (Sum.inr j) + +theorem integrable_coarseBObservable_of_integrable_coarseFullBlockMatrixObservable + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} {U : Set (Vec d)} + (hInt : MeasureTheory.Integrable (coarseFullBlockMatrixObservable U) P) : + MeasureTheory.Integrable (coarseBObservable U) P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro i + refine MeasureTheory.Integrable.of_eval ?_ + intro j + simpa [coarseBObservable, coarseFullBlockMatrixObservable, fullBlockMatUpperLeft] + using MeasureTheory.Integrable.eval + (MeasureTheory.Integrable.eval hInt (Sum.inl i)) (Sum.inl j) + +theorem integrable_coarseSigmaStarInvKappaMeanObservable_of_integrable_coarseFullBlockMatrixObservable + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} {U : Set (Vec d)} + (hInt : MeasureTheory.Integrable (coarseFullBlockMatrixObservable U) P) : + MeasureTheory.Integrable (coarseSigmaStarInvKappaMeanObservable U) P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro i + refine MeasureTheory.Integrable.of_eval ?_ + intro j + simpa [coarseSigmaStarInvKappaMeanObservable, coarseFullBlockMatrixObservable, + fullBlockMatNegLowerLeft] using + (MeasureTheory.Integrable.eval + (MeasureTheory.Integrable.eval hInt (Sum.inr i)) (Sum.inl j)).fun_neg + +theorem isLocalObservable_Mu {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (P : BlockVec d) : + IsRestrictionLocalObservable U (fun a => Mu U P a) := by + intro a₁ a₂ hagree + have hrestrict : restrictCoeffField U a₁ = restrictCoeffField U a₂ := + restrictCoeffField_eq_of_forall_mem_eq hagree + calc + Mu U P a₁ = Mu U P (restrictCoeffField U a₁) := + (Mu_restrictCoeffField_eq hU P a₁).symm + _ = Mu U P (restrictCoeffField U a₂) := by rw [hrestrict] + _ = Mu U P a₂ := Mu_restrictCoeffField_eq hU P a₂ + +theorem isLocalObservable_coarseBlockMatrix {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsRestrictionLocalObservable U (fun a => coarseBlockMatrix U a) := by + intro a₁ a₂ hagree + have hrestrict : restrictCoeffField U a₁ = restrictCoeffField U a₂ := + restrictCoeffField_eq_of_forall_mem_eq hagree + calc + coarseBlockMatrix U a₁ = coarseBlockMatrix U (restrictCoeffField U a₁) := by + symm + exact coarseBlockMatrix_restrictCoeffField_eq hU a₁ + _ = coarseBlockMatrix U (restrictCoeffField U a₂) := by rw [hrestrict] + _ = coarseBlockMatrix U a₂ := coarseBlockMatrix_restrictCoeffField_eq hU a₂ + +theorem isLocalObservable_coarseFullBlockMatrixObservable {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsRestrictionLocalObservable U (coarseFullBlockMatrixObservable U) := by + intro a₁ a₂ hagree + simpa [coarseFullBlockMatrixObservable] using + congrArg toFullBlockMat (isLocalObservable_coarseBlockMatrix hU hagree) + +theorem isLocalObservable_coarseSigmaStarInvObservable {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsRestrictionLocalObservable U (coarseSigmaStarInvObservable U) := by + intro a₁ a₂ hagree + simpa [coarseSigmaStarInvObservable, Function.comp] using + congrArg fullBlockMatLowerRight + (isLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hagree) + +theorem isLocalObservable_coarseBObservable {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsRestrictionLocalObservable U (coarseBObservable U) := by + intro a₁ a₂ hagree + simpa [coarseBObservable, Function.comp] using + congrArg fullBlockMatUpperLeft + (isLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hagree) + +theorem isLocalObservable_coarseSigmaStarInvKappaMeanObservable {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsRestrictionLocalObservable U (coarseSigmaStarInvKappaMeanObservable U) := by + intro a₁ a₂ hagree + simpa [coarseSigmaStarInvKappaMeanObservable, Function.comp] using + congrArg fullBlockMatNegLowerLeft + (isLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hagree) + +theorem measurable_coarseSigmaStarInvEntryObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) (r c : Fin d) : + Measurable (coarseSigmaStarInvEntryObservable U r c) := by + by_cases hrc : r = c + · subst c + have hEq : + coarseSigmaStarInvEntryObservable U r r = + (fun a : CoeffField d => (2 : ℝ) * Mu U (0, Pi.single r 1) a) := by + funext a + simp [coarseSigmaStarInvEntryObservable, coarseBlockMatrix_lowerRight_apply] + rw [hEq] + exact measurable_const.mul (hMu (0, Pi.single r 1)) + · have hsum : Measurable fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (0, Pi.single c 1)) a := + hMu ((0, Pi.single r 1) + (0, Pi.single c 1)) + have hr : Measurable fun a : CoeffField d => Mu U (0, Pi.single r 1) a := + hMu (0, Pi.single r 1) + have hc : Measurable fun a : CoeffField d => Mu U (0, Pi.single c 1) a := + hMu (0, Pi.single c 1) + have hEq : + coarseSigmaStarInvEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (0, Pi.single c 1)) a + - Mu U (0, Pi.single r 1) a + - Mu U (0, Pi.single c 1) a) := by + funext a + simp [coarseSigmaStarInvEntryObservable, coarseBlockMatrix_lowerRight_apply, hrc] + rw [hEq] + exact (hsum.sub hr).sub hc + +theorem measurable_coarseBEntryObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) (r c : Fin d) : + Measurable (coarseBEntryObservable U r c) := by + by_cases hrc : r = c + · subst c + have hEq : + coarseBEntryObservable U r r = + (fun a : CoeffField d => (2 : ℝ) * Mu U (Pi.single r 1, 0) a) := by + funext a + simp [coarseBEntryObservable, coarseBlockMatrix_upperLeft_apply] + rw [hEq] + exact measurable_const.mul (hMu (Pi.single r 1, 0)) + · have hsum : Measurable fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (Pi.single c 1, 0)) a := + hMu ((Pi.single r 1, 0) + (Pi.single c 1, 0)) + have hr : Measurable fun a : CoeffField d => Mu U (Pi.single r 1, 0) a := + hMu (Pi.single r 1, 0) + have hc : Measurable fun a : CoeffField d => Mu U (Pi.single c 1, 0) a := + hMu (Pi.single c 1, 0) + have hEq : + coarseBEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (Pi.single c 1, 0)) a + - Mu U (Pi.single r 1, 0) a + - Mu U (Pi.single c 1, 0) a) := by + funext a + simp [coarseBEntryObservable, coarseBlockMatrix_upperLeft_apply, hrc] + rw [hEq] + exact (hsum.sub hr).sub hc + +theorem measurable_coarseSigmaStarInvKappaMeanEntryObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) (r c : Fin d) : + Measurable (coarseSigmaStarInvKappaMeanEntryObservable U r c) := by + have hsum : Measurable fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a := + hMu ((0, Pi.single r 1) + (Pi.single c 1, 0)) + have hr : Measurable fun a : CoeffField d => Mu U (0, Pi.single r 1) a := + hMu (0, Pi.single r 1) + have hc : Measurable fun a : CoeffField d => Mu U (Pi.single c 1, 0) a := + hMu (Pi.single c 1, 0) + have hEq : + coarseSigmaStarInvKappaMeanEntryObservable U r c = + (fun a : CoeffField d => + -(Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a + - Mu U (0, Pi.single r 1) a + - Mu U (Pi.single c 1, 0) a)) := by + funext a + simp [coarseSigmaStarInvKappaMeanEntryObservable, coarseBlockMatrix_lowerLeft_apply] + rw [hEq] + exact ((hsum.sub hr).sub hc).neg + +theorem measurable_coarseUpperRightEntryObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) (r c : Fin d) : + Measurable (coarseUpperRightEntryObservable U r c) := by + have hsum : Measurable fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (0, Pi.single c 1)) a := + hMu ((Pi.single r 1, 0) + (0, Pi.single c 1)) + have hr : Measurable fun a : CoeffField d => Mu U (Pi.single r 1, 0) a := + hMu (Pi.single r 1, 0) + have hc : Measurable fun a : CoeffField d => Mu U (0, Pi.single c 1) a := + hMu (0, Pi.single c 1) + have hEq : + coarseUpperRightEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (0, Pi.single c 1)) a + - Mu U (Pi.single r 1, 0) a + - Mu U (0, Pi.single c 1) a) := by + funext a + simp [coarseUpperRightEntryObservable, coarseBlockMatrix_upperRight_apply] + rw [hEq] + exact (hsum.sub hr).sub hc + +theorem measurable_coarseLowerLeftEntryObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) (r c : Fin d) : + Measurable (coarseLowerLeftEntryObservable U r c) := by + have hEq : + coarseLowerLeftEntryObservable U r c = + (fun a : CoeffField d => -coarseSigmaStarInvKappaMeanEntryObservable U r c a) := by + funext a + simp [coarseLowerLeftEntryObservable, coarseSigmaStarInvKappaMeanEntryObservable] + rw [hEq] + exact + (measurable_coarseSigmaStarInvKappaMeanEntryObservable_of_hasMeasurableMuFamily + (U := U) hMu r c).neg + +theorem measurable_coarseFullBlockMatrixObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) : + Measurable (coarseFullBlockMatrixObservable U) := by + refine measurable_pi_iff.2 fun α => ?_ + refine measurable_pi_iff.2 fun β => ?_ + cases α <;> cases β + · simpa [coarseFullBlockMatrixObservable, toFullBlockMat] using! + measurable_coarseBEntryObservable_of_hasMeasurableMuFamily (U := U) hMu _ _ + · simpa [coarseFullBlockMatrixObservable, toFullBlockMat, coarseUpperRightEntryObservable] + using! measurable_coarseUpperRightEntryObservable_of_hasMeasurableMuFamily (U := U) hMu _ _ + · simpa [coarseFullBlockMatrixObservable, toFullBlockMat, coarseLowerLeftEntryObservable] + using! measurable_coarseLowerLeftEntryObservable_of_hasMeasurableMuFamily (U := U) hMu _ _ + · simpa [coarseFullBlockMatrixObservable, toFullBlockMat] using! + measurable_coarseSigmaStarInvEntryObservable_of_hasMeasurableMuFamily (U := U) hMu _ _ + +theorem measurable_coarseSigmaStarInvObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) : + Measurable (coarseSigmaStarInvObservable U) := by + simpa [coarseSigmaStarInvObservable, Function.comp] using + measurable_fullBlockMatLowerRight.comp + (measurable_coarseFullBlockMatrixObservable_of_hasMeasurableMuFamily (U := U) hMu) + +theorem measurable_coarseBObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) : + Measurable (coarseBObservable U) := by + simpa [coarseBObservable, Function.comp] using + measurable_fullBlockMatUpperLeft.comp + (measurable_coarseFullBlockMatrixObservable_of_hasMeasurableMuFamily (U := U) hMu) + +theorem measurable_coarseSigmaStarInvKappaMeanObservable_of_hasMeasurableMuFamily + {d : ℕ} {U : Set (Vec d)} (hMu : HasMeasurableMuFamily U) : + Measurable (coarseSigmaStarInvKappaMeanObservable U) := by + simpa [coarseSigmaStarInvKappaMeanObservable, Function.comp] using + measurable_fullBlockMatNegLowerLeft.comp + (measurable_coarseFullBlockMatrixObservable_of_hasMeasurableMuFamily (U := U) hMu) + +noncomputable def measurableLocalObservable_Mu {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) (P : BlockVec d) : + MeasurableRestrictionLocalObservable d U ℝ where + toFun := fun a => Mu U P a + measurable_toFun := hMu P + isLocal_toFun := isLocalObservable_Mu hU P + +noncomputable def measurableLocalObservable_coarseSigmaStarInvEntryObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) + (r c : Fin d) : + MeasurableRestrictionLocalObservable d U ℝ where + toFun := coarseSigmaStarInvEntryObservable U r c + measurable_toFun := + measurable_coarseSigmaStarInvEntryObservable_of_hasMeasurableMuFamily (U := U) hMu r c + isLocal_toFun := by + intro a₁ a₂ hagree + simpa [coarseSigmaStarInvEntryObservable] using + congrArg (fun B : BlockMat d => B.lowerRight r c) + (isLocalObservable_coarseBlockMatrix (U := U) hU hagree) + +noncomputable def measurableLocalObservable_coarseBEntryObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) + (r c : Fin d) : + MeasurableRestrictionLocalObservable d U ℝ where + toFun := coarseBEntryObservable U r c + measurable_toFun := + measurable_coarseBEntryObservable_of_hasMeasurableMuFamily (U := U) hMu r c + isLocal_toFun := by + intro a₁ a₂ hagree + simpa [coarseBEntryObservable] using + congrArg (fun B : BlockMat d => B.upperLeft r c) + (isLocalObservable_coarseBlockMatrix (U := U) hU hagree) + +noncomputable def measurableLocalObservable_coarseSigmaStarInvKappaMeanEntryObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) + (r c : Fin d) : + MeasurableRestrictionLocalObservable d U ℝ where + toFun := coarseSigmaStarInvKappaMeanEntryObservable U r c + measurable_toFun := + measurable_coarseSigmaStarInvKappaMeanEntryObservable_of_hasMeasurableMuFamily + (U := U) hMu r c + isLocal_toFun := by + intro a₁ a₂ hagree + simpa [coarseSigmaStarInvKappaMeanEntryObservable] using + congrArg (fun B : BlockMat d => -(B.lowerLeft r c)) + (isLocalObservable_coarseBlockMatrix (U := U) hU hagree) + +noncomputable def measurableLocalObservable_coarseFullBlockMatrixObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) : + MeasurableRestrictionLocalObservable d U (FullBlockMat d) where + toFun := coarseFullBlockMatrixObservable U + measurable_toFun := + measurable_coarseFullBlockMatrixObservable_of_hasMeasurableMuFamily (U := U) hMu + isLocal_toFun := isLocalObservable_coarseFullBlockMatrixObservable (U := U) hU + +noncomputable def measurableLocalObservable_coarseSigmaStarInvObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) : + MeasurableRestrictionLocalObservable d U (Mat d) := + MeasurableRestrictionLocalObservable.comp + (measurableLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hMu) + fullBlockMatLowerRight measurable_fullBlockMatLowerRight + +noncomputable def measurableLocalObservable_coarseBObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) : + MeasurableRestrictionLocalObservable d U (Mat d) := + MeasurableRestrictionLocalObservable.comp + (measurableLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hMu) + fullBlockMatUpperLeft measurable_fullBlockMatUpperLeft + +noncomputable def measurableLocalObservable_coarseSigmaStarInvKappaMeanObservable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (hMu : HasMeasurableMuFamily U) : + MeasurableRestrictionLocalObservable d U (Mat d) := + MeasurableRestrictionLocalObservable.comp + (measurableLocalObservable_coarseFullBlockMatrixObservable (U := U) hU hMu) + fullBlockMatNegLowerLeft measurable_fullBlockMatNegLowerLeft + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Mu.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Mu.lean new file mode 100644 index 0000000000..7011df1357 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/CoarseObservableMeasurability/Mu.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic + +/-! # Mu -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** the `Mu` block quadratic form +`X ↦ (½) ⟨X, A X⟩` is measurable in the coefficient field via the +unfolded `2d × 2d` block-matrix representation. This is the measurable +bridge from full-block measurability to the scalar `Mu` energy used by +all downstream operator/recovery machinery. + +**Consumed by:** every `FixedCompetitorEnergyMeasurability/*.lean` file +(`Measurability`, `LipschitzBounds`, `Integrals`, `BlockEnergyAverage`, +`MuObservable`), which in turn feeds the AEE assembly and ultimately +`Theorems/Mu.lean :: aemeasurable_Mu_cubeSet` and +`Theorems/CanonicalSolutions.lean :: +aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet`. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +/-- Measurability of the quadratic form `X ↦ (1/2) X · (A X)` when the block +matrix observable is supplied in unfolded `2d × 2d` coordinates. -/ +theorem measurable_half_blockVecDot_blockMatVecMul_of_measurable_fullBlockMat + {α : Type*} [MeasurableSpace α] + {d : ℕ} {f : α → FullBlockMat d} + (hf : Measurable f) (X : BlockVec d) : + Measurable + (fun a => (1 / 2 : ℝ) * + blockVecDot X (blockMatVecMul (ofFullBlockMat (f a)) X)) := by + let v : FullBlockVec d := toFullBlockVec X + have hf' : ∀ i, Measurable (fun a : α => f a i) := measurable_pi_iff.1 hf + have hEntry : ∀ i j, Measurable (fun a : α => f a i j) := by + intro i j + simpa using (Measurable.eval (hf' i) : Measurable fun a : α => f a i j) + have hTerm : ∀ i j, Measurable (fun a : α => v i * v j * f a i j) := by + intro i j + simpa [mul_assoc] using (hEntry i j).const_mul (v i * v j) + have hSum : + Measurable (fun a : α => ∑ i, ∑ j, v i * v j * f a i j) := by + refine Finset.measurable_sum Finset.univ ?_ + intro i hi + exact Finset.measurable_sum Finset.univ (fun j _ => hTerm i j) + have hEq : + (fun a => (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (ofFullBlockMat (f a)) X)) = + (fun a => (1 / 2 : ℝ) * ∑ i, ∑ j, v i * v j * f a i j) := by + funext a + rw [blockVecDot_blockMatVecMul_eq_toLinearMap₂', toFullBlockMat_ofFullBlockMat, + Matrix.toLinearMap₂'_apply] + simp [v, smul_eq_mul, mul_assoc, mul_left_comm] + rw [hEq] + exact measurable_const.mul hSum + +/-- The lower-right coarse entry is measurable once the pure-flux `Mu` +coordinate slices are measurable. -/ +theorem measurable_coarseSigmaStarInvEntryObservable_of_measurable_Mu_pureFlux + {d : ℕ} {U : Set (Vec d)} + (hDiag : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a)) + (r c : Fin d) : + Measurable (coarseSigmaStarInvEntryObservable U r c) := by + by_cases hrc : r = c + · subst c + have hEq : + coarseSigmaStarInvEntryObservable U r r = + (fun a : CoeffField d => (2 : ℝ) * Mu U (0, Pi.single r 1) a) := by + funext a + simp [coarseSigmaStarInvEntryObservable, coarseBlockMatrix_lowerRight_apply] + rw [hEq] + exact measurable_const.mul (hDiag r) + · have hsum : Measurable fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (0, Pi.single c 1)) a := hPair r c + have hr : Measurable fun a : CoeffField d => Mu U (0, Pi.single r 1) a := hDiag r + have hc : Measurable fun a : CoeffField d => Mu U (0, Pi.single c 1) a := hDiag c + have hEq : + coarseSigmaStarInvEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (0, Pi.single c 1)) a + - Mu U (0, Pi.single r 1) a + - Mu U (0, Pi.single c 1) a) := by + funext a + simp [coarseSigmaStarInvEntryObservable, coarseBlockMatrix_lowerRight_apply, hrc] + rw [hEq] + exact (hsum.sub hr).sub hc + +/-- The upper-left coarse entry is measurable once the pure-gradient `Mu` +coordinate slices are measurable. -/ +theorem measurable_coarseBEntryObservable_of_measurable_Mu_pureGradient + {d : ℕ} {U : Set (Vec d)} + (hDiag : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a)) + (r c : Fin d) : + Measurable (coarseBEntryObservable U r c) := by + by_cases hrc : r = c + · subst c + have hEq : + coarseBEntryObservable U r r = + (fun a : CoeffField d => (2 : ℝ) * Mu U (Pi.single r 1, 0) a) := by + funext a + simp [coarseBEntryObservable, coarseBlockMatrix_upperLeft_apply] + rw [hEq] + exact measurable_const.mul (hDiag r) + · have hsum : Measurable fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (Pi.single c 1, 0)) a := hPair r c + have hr : Measurable fun a : CoeffField d => Mu U (Pi.single r 1, 0) a := hDiag r + have hc : Measurable fun a : CoeffField d => Mu U (Pi.single c 1, 0) a := hDiag c + have hEq : + coarseBEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (Pi.single c 1, 0)) a + - Mu U (Pi.single r 1, 0) a + - Mu U (Pi.single c 1, 0) a) := by + funext a + simp [coarseBEntryObservable, coarseBlockMatrix_upperLeft_apply, hrc] + rw [hEq] + exact (hsum.sub hr).sub hc + +/-- The mixed mean entry is measurable once the mixed and pure coordinate +`Mu` slices are measurable. -/ +theorem measurable_coarseSigmaStarInvKappaMeanEntryObservable_of_measurable_Mu_mixed + {d : ℕ} {U : Set (Vec d)} + (hFlux : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hGrad : + ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hMixed : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a)) + (r c : Fin d) : + Measurable (coarseSigmaStarInvKappaMeanEntryObservable U r c) := by + have hsum : Measurable fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a := by + simpa [add_comm] using hMixed c r + have hr : Measurable fun a : CoeffField d => Mu U (0, Pi.single r 1) a := hFlux r + have hc : Measurable fun a : CoeffField d => Mu U (Pi.single c 1, 0) a := hGrad c + have hEq : + coarseSigmaStarInvKappaMeanEntryObservable U r c = + (fun a : CoeffField d => + -(Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a + - Mu U (0, Pi.single r 1) a + - Mu U (Pi.single c 1, 0) a)) := by + funext a + simp [coarseSigmaStarInvKappaMeanEntryObservable, coarseBlockMatrix_lowerLeft_apply] + rw [hEq] + exact ((hsum.sub hr).sub hc).neg + +/-- The upper-right coarse entry is measurable once the mixed and pure +coordinate `Mu` slices are measurable. -/ +theorem measurable_coarseUpperRightEntryObservable_of_measurable_Mu_mixed + {d : ℕ} {U : Set (Vec d)} + (hFlux : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hGrad : + ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hMixed : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a)) + (r c : Fin d) : + Measurable (coarseUpperRightEntryObservable U r c) := by + have hsum : Measurable fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (0, Pi.single c 1)) a := hMixed r c + have hr : Measurable fun a : CoeffField d => Mu U (Pi.single r 1, 0) a := hGrad r + have hc : Measurable fun a : CoeffField d => Mu U (0, Pi.single c 1) a := hFlux c + have hEq : + coarseUpperRightEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((Pi.single r 1, 0) + (0, Pi.single c 1)) a + - Mu U (Pi.single r 1, 0) a + - Mu U (0, Pi.single c 1) a) := by + funext a + simp [coarseUpperRightEntryObservable, coarseBlockMatrix_upperRight_apply] + rw [hEq] + exact (hsum.sub hr).sub hc + +/-- The lower-left coarse entry is measurable once the mixed and pure +coordinate `Mu` slices are measurable. -/ +theorem measurable_coarseLowerLeftEntryObservable_of_measurable_Mu_mixed + {d : ℕ} {U : Set (Vec d)} + (hFlux : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hGrad : + ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hMixed : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a)) + (r c : Fin d) : + Measurable (coarseLowerLeftEntryObservable U r c) := by + have hsum : Measurable fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a := by + simpa [add_comm] using hMixed c r + have hr : Measurable fun a : CoeffField d => Mu U (0, Pi.single r 1) a := hFlux r + have hc : Measurable fun a : CoeffField d => Mu U (Pi.single c 1, 0) a := hGrad c + have hEq : + coarseLowerLeftEntryObservable U r c = + (fun a : CoeffField d => + Mu U ((0, Pi.single r 1) + (Pi.single c 1, 0)) a + - Mu U (0, Pi.single r 1) a + - Mu U (Pi.single c 1, 0) a) := by + funext a + simp [coarseLowerLeftEntryObservable, coarseBlockMatrix_lowerLeft_apply] + rw [hEq] + exact (hsum.sub hr).sub hc + +/-- Measurability of the full coarse block matrix from the finite coordinate +`Mu` slices that generate its entries. -/ +theorem measurable_coarseFullBlockMatrixObservable_of_measurable_coordinate_Mu + {d : ℕ} {U : Set (Vec d)} + (hFlux : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hFluxPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a)) + (hGrad : + ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hGradPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a)) + (hMixed : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a)) : + Measurable (coarseFullBlockMatrixObservable U) := by + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + cases i with + | inl r => + cases j with + | inl c => + simpa [coarseFullBlockMatrixObservable, coarseBObservable, Function.comp, + fullBlockMatUpperLeft, coarseBEntryObservable] using! + measurable_coarseBEntryObservable_of_measurable_Mu_pureGradient + (U := U) hGrad hGradPair r c + | inr c => + simpa [coarseFullBlockMatrixObservable, coarseUpperRightEntryObservable] using! + measurable_coarseUpperRightEntryObservable_of_measurable_Mu_mixed + (U := U) hFlux hGrad hMixed r c + | inr r => + cases j with + | inl c => + simpa [coarseFullBlockMatrixObservable, coarseLowerLeftEntryObservable] using! + measurable_coarseLowerLeftEntryObservable_of_measurable_Mu_mixed + (U := U) hFlux hGrad hMixed r c + | inr c => + simpa [coarseFullBlockMatrixObservable, coarseSigmaStarInvObservable, Function.comp, + fullBlockMatLowerRight, coarseSigmaStarInvEntryObservable] using! + measurable_coarseSigmaStarInvEntryObservable_of_measurable_Mu_pureFlux + (U := U) hFlux hFluxPair r c + +/-- Once the coarse block matrix is measurable and `Mu` is known to be +quadratic pointwise, the full ambient `Mu` family is measurable. -/ +theorem hasMeasurableMuFamily_of_measurable_coarseFullBlockMatrixObservable_of_hasQuadraticMu + {d : ℕ} {U : Set (Vec d)} + (hBlockMeas : Measurable (coarseFullBlockMatrixObservable U)) + (hquad : ∀ a : CoeffField d, HasQuadraticMu U a) : + HasMeasurableMuFamily U := by + intro P0 + have hQuadratic : + Measurable + (fun a : CoeffField d => + (1 / 2 : ℝ) * + blockVecDot P0 (blockMatVecMul (coarseBlockMatrix U a) P0)) := by + simpa [coarseFullBlockMatrixObservable] using + measurable_half_blockVecDot_blockMatVecMul_of_measurable_fullBlockMat + (f := coarseFullBlockMatrixObservable U) hBlockMeas P0 + have hEq : + (fun a : CoeffField d => Mu U P0 a) = + (fun a : CoeffField d => + (1 / 2 : ℝ) * + blockVecDot P0 (blockMatVecMul (coarseBlockMatrix U a) P0)) := by + funext a + exact Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu (hquad a) P0 + rw [hEq] + exact hQuadratic + +/-- Finite coordinate `Mu` measurability plus pointwise quadraticity upgrades +to the full ambient `Mu` family. -/ +theorem hasMeasurableMuFamily_of_measurable_coordinate_Mu_of_hasQuadraticMu + {d : ℕ} {U : Set (Vec d)} + (hFlux : ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (0, Pi.single i 1) a)) + (hFluxPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a)) + (hGrad : + ∀ i : Fin d, Measurable (fun a : CoeffField d => Mu U (Pi.single i 1, 0) a)) + (hGradPair : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a)) + (hMixed : + ∀ i j : Fin d, + Measurable (fun a : CoeffField d => Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a)) + (hquad : ∀ a : CoeffField d, HasQuadraticMu U a) : + HasMeasurableMuFamily U := + hasMeasurableMuFamily_of_measurable_coarseFullBlockMatrixObservable_of_hasQuadraticMu + (U := U) + (measurable_coarseFullBlockMatrixObservable_of_measurable_coordinate_Mu + (U := U) hFlux hFluxPair hGrad hGradPair hMixed) + hquad + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability.lean new file mode 100644 index 0000000000..32ba327b97 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.LipschitzBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Integrals +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.MuObservable + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +Pure-import umbrella for the five-file `FixedCompetitorEnergyMeasurability` +chain. + +**Internal claim of the chain (read top-down):** lift `PointwiseLocalSigma` scalar +atoms (`Measurability`) → fixed-coefficient Borel maps on `HilbertMat` +(`LipschitzBounds`) → quantitative-slice integral algebra (`Integrals`) → +measurable block-energy averages (`BlockEnergyAverage`) → measurability of +the `Mu` candidate as a coefficient-field functional (`MuObservable`). + +**Consumed by:** `Internal/AEESliceAssembly/{BlockEnergyAverage, +MuFamily}.lean`, then `Theorems/Mu.lean :: aemeasurable_Mu_cubeSet`. + +If a sixth file becomes necessary in this chain, that is the signal to +refactor rather than extend, per the rebuild contract. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/BlockEnergyAverage.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/BlockEnergyAverage.lean new file mode 100644 index 0000000000..a82e3eda84 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/BlockEnergyAverage.lean @@ -0,0 +1,407 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Integrals +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Geometry.Manifold.ContMDiff.NormedSpace +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! # Block Energy Average -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** block-energy-average measurability under quantitative +elliptic slices — combines `Integrals.lean` with the subtype-measurability +of locally σ-measurable coefficient fields landing in a single slice to +produce measurable block-energy-average observables of the form needed by +the `Mu`-candidate construction. + +**Consumed by (within `Internal/FixedCompetitorEnergyMeasurability/`):** +`MuObservable.lean`. Upstream chain continues to `Theorems/Mu.lean :: +aemeasurable_Mu_cubeSet`. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +/-- A locally measurable sample-space coefficient field that lands in one +quantitative slice is measurable as a map into that slice subtype. -/ +theorem measurable_subtype_mk_quantitativeSlice_of_isLocalSigmaMeasurableOn + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, QuantitativeEllipticSlice U k (A ω)) : + @Measurable Ω {a : CoeffField d // QuantitativeEllipticSlice U k a} + _ (QuantitativeEllipticSlice.localMeasurableSpace U k) + (fun ω => ⟨A ω, hSlice ω⟩) := by + let As : Ω → {a : CoeffField d // QuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + change @Measurable Ω {a : CoeffField d // QuantitativeEllipticSlice U k a} + _ (QuantitativeEllipticSlice.localMeasurableSpace U k) As + apply Measurable.of_comap_le + unfold QuantitativeEllipticSlice.localMeasurableSpace + rw [MeasurableSpace.comap_comp] + simpa [As, IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! hA.comap_le + +/-- Composition form of fixed-competitor energy measurability on a single +quantitative slice for sample-space-valued coefficient fields. -/ +theorem measurable_blockEnergyAverage_comp_quantitativeSlice + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + let As : Ω → {a : CoeffField d // QuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // QuantitativeEllipticSlice U k a} + _ (QuantitativeEllipticSlice.localMeasurableSpace U k) As := + measurable_subtype_mk_quantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hEnergy : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockEnergyAverage U a.1 X) := + measurable_blockEnergyAverage_quantitativeSlice hToL2 X hX + change Measurable ((fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + blockEnergyAverage U a.1 X) ∘ As) + exact hEnergy.comp hAs + +/-- Open finite-measure wrapper for the fixed-slice composition theorem for +fixed-competitor energies. -/ +theorem measurable_blockEnergyAverage_comp_quantitativeSlice_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + exact measurable_blockEnergyAverage_comp_quantitativeSlice + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSlice X hX + +/-- Countable-slice assembly for fixed-competitor energy averages. If a +sample-space coefficient field lands on the `k`-th quantitative ellipticity +slice on the measurable piece `t k`, and the pieces cover the whole sample +space, then the energy observable is measurable. -/ +theorem measurable_blockEnergyAverage_comp_countable_quantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover : ⋃ k : ℕ, t k = Set.univ) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + classical + let f : (k : ℕ) → t k → ℝ := + fun k ω => blockEnergyAverage U (A ω.1) X + have hfm : ∀ k : ℕ, Measurable (f k) := by + intro k + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : t k => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : t k, QuantitativeEllipticSlice U k ((fun ω : t k => A ω.1) ω) := by + intro ω + exact hSlice k ω.1 ω.2 + exact measurable_blockEnergyAverage_comp_quantitativeSlice + (hToL2 k) (fun ω : t k => A ω.1) hA_sub hSlice_sub X hX + have hagree : + ∀ (i j : ℕ) (ω : Ω) (hωi : ω ∈ t i) (hωj : ω ∈ t j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + rfl + have hLift : Measurable (Set.liftCover t f hagree hcover) := + measurable_liftCover t ht f hfm hagree hcover + have hEq : Set.liftCover t f hagree hcover = + (fun ω => blockEnergyAverage U (A ω) X) := by + funext ω + obtain ⟨k, hωk⟩ : ∃ k : ℕ, ω ∈ t k := by + have hω_cover : ω ∈ ⋃ k : ℕ, t k := by + rw [hcover] + exact Set.mem_univ ω + exact Set.mem_iUnion.mp hω_cover + rw [Set.liftCover_of_mem (S := t) (f := f) (hf := hagree) (hS := hcover) hωk] + simpa [hEq] using hLift + +/-- Almost-everywhere countable-slice assembly for fixed-competitor energy +averages. This is the AE version used after local ellipticity supplies an +almost-sure countable quantitative-slice cover. -/ +theorem aemeasurable_blockEnergyAverage_comp_countable_quantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + classical + let S : Set Ω := ⋃ k : ℕ, t k + let cover : Option ℕ → Set Ω + | none => Sᶜ + | some k => t k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, ω => blockEnergyAverage U (A ω.1) X + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => + exact (MeasurableSet.iUnion ht).compl + | some k => + exact ht k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => + exact measurable_const + | some k => + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : cover (some k) => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp, cover] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : cover (some k), + QuantitativeEllipticSlice U k ((fun ω : cover (some k) => A ω.1) ω) := by + intro ω + have hω : ω.1 ∈ t k := by + simp [cover] at ω + exact ω.2 + exact hSlice k ω.1 hω + simpa [f, cover] using + measurable_blockEnergyAverage_comp_quantitativeSlice + (hToL2 k) (fun ω : cover (some k) => A ω.1) hA_sub hSlice_sub X hX + have hagree : + ∀ (i j : Option ℕ) (ω : Ω) (hωi : ω ∈ cover i) (hωj : ω ∈ cover j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + cases i with + | none => + cases j with + | none => + rfl + | some k => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωj⟩ + have hω_notS : ω ∉ S := by + simpa [cover] using hωi + exact hω_notS hωS + | some k => + cases j with + | none => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωi⟩ + have hω_notS : ω ∉ S := by + simpa [cover] using hωj + exact hω_notS hωS + | some l => + rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + by_cases hωS : ω ∈ S + · obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hωk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using hωS⟩ + have hLift : Measurable (Set.liftCover cover f hagree hcover) := + measurable_liftCover cover hcover_meas f hfm hagree hcover + have hEq : + (fun ω => blockEnergyAverage U (A ω) X) =ᵐ[μ] Set.liftCover cover f hagree hcover := by + filter_upwards [hcover_ae] with ω hωS + obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hωk)] + exact hLift.aemeasurable.congr hEq.symm + +/-- If the raw quantitative-slice membership sets are measurable and cover the +sample space, then the countable-slice fixed-energy assembly theorem applies +directly to those sets. -/ +theorem measurable_blockEnergyAverage_comp_quantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover : ∀ ω : Ω, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + Measurable fun ω => blockEnergyAverage U (A ω) X := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | QuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set : ⋃ k : ℕ, t k = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + exact Set.mem_iUnion.mpr (hcover ω) + exact measurable_blockEnergyAverage_comp_countable_quantitativeSlice_cover + hToL2 A hA t ht hcover_set (fun k ω hω => hω) X hX + +/-- AE version of `measurable_blockEnergyAverage_comp_quantitativeSlice_sets`. +This is the immediate handoff from an almost-sure countable slice-existence +statement, provided the raw slice-membership sets are measurable. -/ +theorem aemeasurable_blockEnergyAverage_comp_quantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | QuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k := by + filter_upwards [hcover_ae] with ω hω + exact Set.mem_iUnion.mpr hω + exact aemeasurable_blockEnergyAverage_comp_countable_quantitativeSlice_cover + μ hToL2 A hA t ht hcover_set_ae (fun k ω hω => hω) X hX + +/-- Open finite-measure wrapper for the AE fixed-energy slice-set assembly +theorem. -/ +theorem aemeasurable_blockEnergyAverage_comp_quantitativeSlice_sets_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + AEMeasurable (fun ω => blockEnergyAverage U (A ω) X) μ := by + exact aemeasurable_blockEnergyAverage_comp_quantitativeSlice_sets μ + (fun _k => measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSliceMeas hcover_ae X hX + +/-- Origin-open-cube handoff from almost-sure local uniform ellipticity to +fixed-energy `AEMeasurable`, conditional on measurability of the raw +quantitative-slice membership sets. -/ +theorem aemeasurable_blockEnergyAverage_comp_openCubeSet_originCube_of_ae_locallyUniformlyElliptic + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} (n : ℤ) + (A : Ω → CoeffField d) + (hA : IsPointwiseLocalSigmaMeasurableOn A (openCubeSet (originCube d n))) + (hloc : ∀ᵐ ω ∂μ, IsLocallyUniformlyElliptic (A ω)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet + {ω : Ω | QuantitativeEllipticSlice (openCubeSet (originCube d n)) k (A ω)}) + (X : BlockState d) (hX : MemBlockL2 (openCubeSet (originCube d n)) X.eval) : + AEMeasurable + (fun ω => blockEnergyAverage (openCubeSet (originCube d n)) (A ω) X) μ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d n))) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + have hcover_ae : + ∀ᵐ ω ∂μ, + ∃ k : ℕ, QuantitativeEllipticSlice (openCubeSet (originCube d n)) k (A ω) := + hloc.mono fun _ω hω => hω.exists_quantitativeEllipticSlice_openCubeSet_originCube n + exact aemeasurable_blockEnergyAverage_comp_quantitativeSlice_sets_of_isOpen_volume_ne_top + μ (isOpen_openCubeSet (originCube d n)) + (ne_of_lt (volume_openCubeSet_lt_top (originCube d n))) + A hA hSliceMeas hcover_ae X hX + +theorem blockEnergyAverage_restrictCoeffField_eq {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (a : CoeffField d) (X : BlockState d) : + blockEnergyAverage U (restrictCoeffField U a) X = blockEnergyAverage U a X := by + exact volumeAverage_blockEnergyDensity_restrictCoeffField_eq hU a X + +theorem blockEnergyAverage_eq_of_forall_mem_eq {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) {a₁ a₂ : CoeffField d} (X : BlockState d) + (hEq : ∀ x ∈ U, a₁ x = a₂ x) : + blockEnergyAverage U a₁ X = blockEnergyAverage U a₂ X := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hax : a₁ x = a₂ x := hEq x hx + simp [blockEnergyDensity, blockCoeffField, hax] + +theorem isLocalObservable_blockEnergyAverage {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (X : BlockState d) : + IsRestrictionLocalObservable U (fun a : CoeffField d => blockEnergyAverage U a X) := by + intro a₁ a₂ hEq + exact blockEnergyAverage_eq_of_forall_mem_eq hU X hEq + +theorem measurable_blockEnergyAverage_restrictionSigma_of_measurable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (X : BlockState d) + (hX : Measurable fun a : CoeffField d => blockEnergyAverage U a X) : + @Measurable (CoeffField d) ℝ (RestrictionSigma U) _ + (fun a => blockEnergyAverage U a X) := + measurable_of_isLocalObservable_restrictionSigma hX + (isLocalObservable_blockEnergyAverage hU X) + +noncomputable def measurableLocalObservable_blockEnergyAverage_of_measurable + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) (X : BlockState d) + (hX : Measurable fun a : CoeffField d => blockEnergyAverage U a X) : + MeasurableRestrictionLocalObservable d U ℝ where + toFun := fun a => blockEnergyAverage U a X + measurable_toFun := hX + isLocal_toFun := isLocalObservable_blockEnergyAverage hU X +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Integrals.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Integrals.lean new file mode 100644 index 0000000000..780c9ea909 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Integrals.lean @@ -0,0 +1,1090 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.LipschitzBounds +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Geometry.Manifold.ContMDiff.NormedSpace +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! # Integrals -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** integrability and a.e. membership of `toHilbertMatrixL2` +in the quantitative-elliptic Hilbert-matrix set, plus the Bochner-integral +algebra needed to take the Lipschitz scalar atoms from `LipschitzBounds.lean` +and turn them into measurable energy-functional integrals on quantitative +slices. + +**Consumed by (within `Internal/FixedCompetitorEnergyMeasurability/`):** +`BlockEnergyAverage.lean`. Upstream chain continues to +`Theorems/Mu.lean :: aemeasurable_Mu_cubeSet`. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem QuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + ∀ᵐ x ∂ volumeMeasureOn U, + QuantitativeEllipticSlice.toHilbertMatrixL2 a x ∈ + quantitativeEllipticHilbertMatSet d k := by + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn a.2)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [QuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a, hmem] with x hcoeff hx + rw [hcoeff] + simpa [quantitativeEllipticHilbertMatSet, restrictCoeffField, hx] using a.2.2 x hx + +theorem IsPointwiseLocalSigmaMeasurableOn.measurable_entryTestObservable + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {A : Ω → CoeffField d} {U : Set (Vec d)} + (hA : IsPointwiseLocalSigmaMeasurableOn A U) (i j : Fin d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + Measurable fun ω => ∫ x, A ω x i j * φ x ∂MeasureTheory.volume := by + exact (measurable_entryTestObservable_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support).comp hA + +theorem measurable_blockEnergyDensity_eval {d : ℕ} (X : BlockState d) (x : Vec d) : + Measurable fun a : CoeffField d => blockEnergyDensity a X x := by + have hFull : + Measurable fun a : CoeffField d => + toFullBlockMat (blockCoeffField a x) := + measurable_toFullBlockMat_blockCoeffField (d := d) (measurable_coeffField_eval (d := d) x) + have hQuad : + Measurable + (fun a : CoeffField d => + (1 / 2 : ℝ) * + blockVecDot (X.eval x) + (blockMatVecMul (ofFullBlockMat (toFullBlockMat (blockCoeffField a x))) + (X.eval x))) := + measurable_half_blockVecDot_blockMatVecMul_of_measurable_fullBlockMat + (d := d) hFull (X.eval x) + simpa [blockEnergyDensity] using hQuad + +theorem blockEnergyDensity_eq_sum_fullBlockMat_entries {d : ℕ} + (a : CoeffField d) (X : BlockState d) (x : Vec d) : + blockEnergyDensity a X x = + (1 / 2 : ℝ) * + ∑ α, ∑ β, + toFullBlockVec (X.eval x) α * + toFullBlockVec (X.eval x) β * + toFullBlockMat (blockCoeffField a x) α β := by + rw [blockEnergyDensity, blockVecDot_blockMatVecMul_eq_toLinearMap₂', + Matrix.toLinearMap₂'_apply] + simp [smul_eq_mul, mul_assoc, mul_left_comm] + +theorem memScalarL2_fullBlockCoord_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) (α : BlockCoord d) : + MemScalarL2 U (fun x => toFullBlockVec (F x) α) := by + cases α with + | inl i => + simpa [toFullBlockVec] using + memScalarL2_coord_of_memVectorL2 (memVectorL2_fst_of_memBlockL2 hF) i + | inr i => + simpa [toFullBlockVec] using + memScalarL2_coord_of_memVectorL2 (memVectorL2_snd_of_memBlockL2 hF) i + +theorem integrableOn_fullBlockCoord_mul_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) (α β : BlockCoord d) : + MeasureTheory.IntegrableOn + (fun x => toFullBlockVec (F x) α * toFullBlockVec (F x) β) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using! + (memScalarL2_fullBlockCoord_of_memBlockL2 hF α).integrable_mul + (memScalarL2_fullBlockCoord_of_memBlockL2 hF β) + +private theorem vecNormSq_single_one {d : ℕ} (i : Fin d) : + vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro k _ hki + simp [Pi.single_eq_of_ne hki] + · simp + +private theorem blockVecDot_blockBasis_self {d : ℕ} (α : BlockCoord d) : + blockVecDot (blockBasis α) (blockBasis α) = 1 := by + cases α with + | inl i => + change vecNormSq (Pi.single i 1 : Vec d) + vecNormSq (0 : Vec d) = 1 + rw [vecNormSq_single_one] + simp [vecNormSq, vecDot] + | inr i => + change vecNormSq (0 : Vec d) + vecNormSq (Pi.single i 1 : Vec d) = 1 + rw [vecNormSq_single_one] + simp [vecNormSq, vecDot] + +theorem abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix + {d : ℕ} {A : Mat d} {lam Lam : ℝ} (hA : IsEllipticMatrix lam Lam A) + (α β : BlockCoord d) : + |toFullBlockMat (blockMatrixOfCoeff A) α β| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + let B : BlockMat d := blockMatrixOfCoeff A + let eα : BlockVec d := blockBasis α + let eβ : BlockVec d := blockBasis β + have hentry : + blockVecDot eα (blockMatVecMul B eβ) = + toFullBlockMat (blockMatrixOfCoeff A) α β := by + simpa [B, eα, eβ, toFullBlockMat, blockMatEntry] using + blockBasis_pairing B α β + have hbasisα : blockVecDot eα eα = 1 := by + simpa [eα] using blockVecDot_blockBasis_self α + have hbasisβ : blockVecDot eβ eβ = 1 := by + simpa [eβ] using blockVecDot_blockBasis_self β + have hsq : + (toFullBlockMat (blockMatrixOfCoeff A) α β) ^ 2 ≤ + blockVecDot eα eα * blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) := by + calc + (toFullBlockMat (blockMatrixOfCoeff A) α β) ^ 2 + = (blockVecDot eα (blockMatVecMul B eβ)) ^ 2 := by rw [hentry] + _ ≤ blockVecDot eα eα * blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) := + sq_blockVecDot_le_blockVecDot_mul_blockVecDot eα (blockMatVecMul B eβ) + have himage : + blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + have h := blockMatrixOfCoeff_image_bound_of_isEllipticMatrix hA eβ + simpa [B, hbasisβ] using h + have hsq' : + (toFullBlockMat (blockMatrixOfCoeff A) α β) ^ 2 ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + rw [hbasisα] at hsq + nlinarith + have hbound_nonneg : 0 ≤ blockMatrixOfCoeffNormSqBound lam Lam := + blockMatrixOfCoeffNormSqBound_nonneg lam Lam + have habs_sq : + |toFullBlockMat (blockMatrixOfCoeff A) α β| ^ 2 ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + simpa [sq_abs] using hsq' + have hsqrt_nonneg : 0 ≤ Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + exact Real.sqrt_nonneg _ + have habs_nonneg : 0 ≤ |toFullBlockMat (blockMatrixOfCoeff A) α β| := by + exact abs_nonneg _ + nlinarith [habs_sq, Real.sq_sqrt hbound_nonneg, hsqrt_nonneg, habs_nonneg, + sq_nonneg (Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) - + |toFullBlockMat (blockMatrixOfCoeff A) α β|)] + +theorem abs_fullBlockCoeffEntry_hilbertMat_le_of_mem_quantitativeEllipticHilbertMatSet + {d : ℕ} {k : ℕ} {A : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) (α β : BlockCoord d) : + |toFullBlockMat (blockMatrixOfCoeff A.toMat) α β| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) := + abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix hA α β + +theorem QuantitativeEllipticSlice.ae_fullBlockCoeffEntry_toHilbertMatrixL2_eq + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) + (α β : BlockCoord d) : + (fun x => toFullBlockMat (blockCoeffField a.1 x) α β) + =ᵐ[volumeMeasureOn U] + fun x => + toFullBlockMat + (blockMatrixOfCoeff (QuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) + α β := by + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn a.2)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [QuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a, hmem] with x hcoeff hx + rw [hcoeff] + simp [blockCoeffField, restrictCoeffField, hx] + +theorem QuantitativeEllipticSlice.ae_abs_fullBlockCoeffEntry_toHilbertMatrixL2_le + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) + (α β : BlockCoord d) : + ∀ᵐ x ∂ volumeMeasureOn U, + |toFullBlockMat + (blockMatrixOfCoeff (QuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) α β| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) := by + filter_upwards + [QuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet a] + with x hx + exact abs_fullBlockCoeffEntry_hilbertMat_le_of_mem_quantitativeEllipticHilbertMatSet hx α β + +theorem QuantitativeEllipticSlice.weightedFullBlockCoeffEntryIntegral_eq_hilbertMatrixL2 + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) + (w : Vec d → ℝ) (α β : BlockCoord d) : + ∫ x in U, w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume = + ∫ x, + w x * + toFullBlockMat + (blockMatrixOfCoeff (QuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) + α β ∂volumeMeasureOn U := by + unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [QuantitativeEllipticSlice.ae_fullBlockCoeffEntry_toHilbertMatrixL2_eq a α β] + with x hx + rw [hx] + +private theorem LipschitzWith.sub_const_right_real + {E : Type*} [PseudoMetricSpace E] {K : NNReal} {Q : E → ℝ} + (hQ : LipschitzWith K Q) (c : ℝ) : + LipschitzWith K (fun A => Q A - c) := by + refine LipschitzWith.of_dist_le_mul ?_ + intro A B + simpa [dist_sub_right] using hQ.dist_le_mul A B + +private theorem lipschitzHilbertMatrixL2Pairing_eq_integral + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {w : Vec d → ℝ} (hw : MemScalarL2 U w) + {K : NNReal} {Q : HilbertMat d → ℝ} (hQ : LipschitzWith K Q) + (F : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) : + inner ℝ (toScalarL2 hw) + ((LipschitzWith.sub_const_right_real hQ (Q (0 : HilbertMat d))).compLp (by simp) F + + MeasureTheory.Lp.const 2 (volumeMeasureOn U) (Q (0 : HilbertMat d))) = + ∫ x, w x * Q (F x) ∂volumeMeasureOn U := by + let Q0 : HilbertMat d → ℝ := fun A => Q A - Q (0 : HilbertMat d) + let hQ0 : LipschitzWith K Q0 := + LipschitzWith.sub_const_right_real hQ (Q (0 : HilbertMat d)) + have hQ0_zero : Q0 0 = 0 := by simp [Q0] + rw [MeasureTheory.L2.inner_def] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [coeFn_toScalarL2 hw, + LipschitzWith.coeFn_compLp hQ0 hQ0_zero F, + MeasureTheory.Lp.coeFn_add + (hQ0.compLp hQ0_zero F) + (MeasureTheory.Lp.const 2 (volumeMeasureOn U) (Q (0 : HilbertMat d))), + MeasureTheory.Lp.coeFn_const + (μ := volumeMeasureOn U) (p := 2) (Q (0 : HilbertMat d))] + with x hweight hcomp hadd hconst + rw [hweight, hadd] + change inner ℝ (w x) + ((hQ0.compLp hQ0_zero F : ScalarL2 U) x + + (MeasureTheory.Lp.const 2 (volumeMeasureOn U) (Q (0 : HilbertMat d)) : + ScalarL2 U) x) = + w x * Q (F x) + rw [hcomp, hconst] + simp [Q0] + ring + +/-- If a scalar observable of a Hilbert-matrix value has a global Lipschitz +extension, then its `L²`-weighted integral is measurable as a function of the +`L²` Hilbert-matrix field. This is the Nemytskii/pairing bridge used before +the final `L¹` weight approximation. -/ +theorem measurable_l2WeightedHilbertMatrixLipschitzIntegral + {Ω : Type*} {mΩ : MeasurableSpace Ω} {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {F : Ω → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)} + (hF : + @Measurable Ω (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + mΩ (borel _) F) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) + {K : NNReal} {Q : HilbertMat d → ℝ} (hQ : LipschitzWith K Q) : + @Measurable Ω ℝ mΩ (borel ℝ) + (fun ω => ∫ x, w x * Q (F ω x) ∂volumeMeasureOn U) := by + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let : MeasurableSpace Ω := mΩ + let : MeasurableSpace H := borel H + have : BorelSpace H := ⟨rfl⟩ + let hQ0 : LipschitzWith K (fun A : HilbertMat d => Q A - Q (0 : HilbertMat d)) := + LipschitzWith.sub_const_right_real hQ (Q (0 : HilbertMat d)) + let G : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) → ScalarL2 U := + fun F => hQ0.compLp (by simp) F + + MeasureTheory.Lp.const 2 (volumeMeasureOn U) (Q (0 : HilbertMat d)) + have hG_cont : Continuous G := by + have hcomp : + Continuous + (hQ0.compLp (by simp) : + MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) → ScalarL2 U) := + hQ0.continuous_compLp (by simp) + simpa [G] using! hcomp.add continuous_const + have hpair_cont : + Continuous fun F : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) => + inner ℝ (toScalarL2 hw) (G F) := + continuous_const.inner hG_cont + rw [show + (fun ω => ∫ x, w x * Q (F ω x) ∂volumeMeasureOn U) = + fun ω => inner ℝ (toScalarL2 hw) (G (F ω)) by + funext ω + exact (lipschitzHilbertMatrixL2Pairing_eq_integral hw hQ (F ω)).symm] + exact hpair_cont.measurable.comp hF + +/-- Slice-level version of the Lipschitz-extension bridge for a full-block +coefficient entry. The agreement hypothesis keeps the theorem independent of +the later finite-dimensional extension construction. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzExtension + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} {Q : HilbertMat d → ℝ} (hQ : LipschitzWith K Q) + (hQ_eq : + ∀ A ∈ quantitativeEllipticHilbertMatSet d k, + Q A = toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + rw [show + (fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) = + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x, + w x * Q (QuantitativeEllipticSlice.toHilbertMatrixL2 a x) + ∂volumeMeasureOn U by + funext a + calc + ∫ x in U, w x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume = + ∫ x, + w x * + toFullBlockMat + (blockMatrixOfCoeff + (QuantitativeEllipticSlice.toHilbertMatrixL2 a x).toMat) α β + ∂volumeMeasureOn U := + QuantitativeEllipticSlice.weightedFullBlockCoeffEntryIntegral_eq_hilbertMatrixL2 + a w α β + _ = + ∫ x, + w x * Q (QuantitativeEllipticSlice.toHilbertMatrixL2 a x) + ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [QuantitativeEllipticSlice.ae_toHilbertMatrixL2_mem_quantitativeEllipticHilbertMatSet + a] + with x hx + rw [hQ_eq _ hx]] + exact measurable_l2WeightedHilbertMatrixLipschitzIntegral hToL2 hw hQ + +/-- Open finite-measure wrapper for the `L²`-weighted full-block entry bridge. +The only remaining external input is the finite-dimensional Lipschitz extension +of the entry observable. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_isOpen_volume_ne_top_of_lipschitzExtension + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} {Q : HilbertMat d → ℝ} (hQ : LipschitzWith K Q) + (hQ_eq : + ∀ A ∈ quantitativeEllipticHilbertMatSet d k, + Q A = toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzExtension + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + hw α β hQ hQ_eq + +/-- If the finite-dimensional full-block entry is Lipschitz on the +quantitative elliptic value set, then the `L²`-weighted entry integral is +measurable on the slice. The global Lipschitz extension is supplied by +`LipschitzOnWith.extend_real`. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzOn + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} + (hLip : + LipschitzOnWith K + (fun A : HilbertMat d => toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) + (quantitativeEllipticHilbertMatSet d k)) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + obtain ⟨Q, hQ_lip, hQ_eq_on⟩ := hLip.extend_real + refine + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzExtension + hToL2 hw α β hQ_lip ?_ + intro A hA + exact (hQ_eq_on hA).symm + +/-- Open finite-measure wrapper for the Lipschitz-on-value-set version. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_isOpen_volume_ne_top_of_lipschitzOn + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) + {K : NNReal} + (hLip : + LipschitzOnWith K + (fun A : HilbertMat d => toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) + (quantitativeEllipticHilbertMatSet d k)) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzOn + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + hw α β hLip + +/-- Slice-level `L²`-weighted full-block entry measurability with the +finite-dimensional quantitative Lipschitz estimate supplied internally. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_lipschitzOn + hToL2 hw α β + (lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_quantitative α β) + +/-- Open finite-measure wrapper for the fully internal `L²`-weighted +full-block entry measurability theorem. -/ +theorem QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + hw α β + +theorem abs_toFullBlockMat_blockCoeffField_entry_le_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} (hx : x ∈ U) + (α β : BlockCoord d) : + |toFullBlockMat (blockCoeffField a x) α β| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + simpa [blockCoeffField] using + abs_toFullBlockMat_blockMatrixOfCoeff_entry_le_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) α β + +theorem QuantitativeEllipticSlice.integrable_weightedFullBlockCoeffEntry_of_integrable + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {k : ℕ} {w : Vec d → ℝ} (hSlice : QuantitativeEllipticSlice U k a) + (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + MeasureTheory.Integrable + (fun x => w x * toFullBlockMat (blockCoeffField a x) α β) + (volumeMeasureOn U) := by + classical + let coeff : Vec d → ℝ := fun x => toFullBlockMat (blockCoeffField a x) α β + let aExt : Vec d → Fin d → Fin d → ℝ := fun x i j => if x ∈ U then a x i j else 0 + have haExt : Measurable aExt := by + simpa [aExt] using hSlice.1 + have hblock : + Measurable (fun x γ δ => + toFullBlockMat (blockMatrixOfCoeff (aExt x)) γ δ) := + measurable_toFullBlockMat_blockCoeffField haExt + have hcoeffExt : + Measurable (fun x => toFullBlockMat (blockMatrixOfCoeff (aExt x)) α β) := + measurable_pi_iff.1 (measurable_pi_iff.1 hblock α) β + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hSlice)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : AEMeasurable coeff (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeffExt).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, aExt, blockCoeffField, hx] + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖coeff x‖ ≤ Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) := by + filter_upwards [hmem] with x hx + simpa [coeff, Real.norm_eq_abs] using + abs_toFullBlockMat_blockCoeffField_entry_le_of_isEllipticFieldOn hSlice hx α β + simpa [coeff] using hw.mul_bdd hcoeff_ae.aestronglyMeasurable hbound + +/-- `L¹` deterministic weights are enough for slice-level full-block entry +measurability, provided the weight is represented by an honest measurable +function. The proof approximates the weight by simple functions, uses the +already-proved `L²` theorem for each approximant, and passes to the limit by +the uniform quantitative ellipticity bound on the slice. -/ +theorem QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral_of_measurable + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} (hw_meas : Measurable w) + (hw_int : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + classical + let μ := volumeMeasureOn U + let C : ℝ := + Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) + let s : ℕ → Vec d → ℝ := + fun n => MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n + have hC_nonneg : 0 ≤ C := by + exact Real.sqrt_nonneg _ + have hs_L2 : ∀ n, MemScalarL2 U (s n) := by + intro n + simpa [MemScalarL2, μ, s] using + (MeasureTheory.SimpleFunc.memLp_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n) + (2 : ℝ≥0∞) (volumeMeasureOn U)) + have hs_meas : + ∀ n, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + s n x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := by + intro n + exact + QuantitativeEllipticSlice.measurable_l2WeightedFullBlockCoeffEntryIntegral + hToL2 (hs_L2 n) α β + have hs_tendsto : + Filter.Tendsto + (fun n : ℕ => + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + s n x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) + atTop + (𝓝 + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := by + rw [tendsto_pi_nhds] + intro a + have hprod_int : + MeasureTheory.Integrable + (fun x => w x * toFullBlockMat (blockCoeffField a.1 x) α β) μ := by + simpa [μ] using + a.2.integrable_weightedFullBlockCoeffEntry_of_integrable hw_int α β + have hs_prod_int : + ∀ n, + MeasureTheory.Integrable + (fun x => s n x * toFullBlockMat (blockCoeffField a.1 x) α β) μ := by + intro n + have hs_int : + MeasureTheory.Integrable (s n) μ := by + simpa [s, μ] using + (MeasureTheory.SimpleFunc.integrable_of_isFiniteMeasure + (MeasureTheory.SimpleFunc.approxOn w hw_meas (Set.range w ∪ {0}) 0 (by simp) n)) + simpa [μ] using + a.2.integrable_weightedFullBlockCoeffEntry_of_integrable hs_int α β + have hcoeff_bound : + ∀ᵐ x ∂ μ, + ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ ≤ C := by + have hmem : ∀ᵐ x ∂ μ, x ∈ U := by + simpa [μ] using + (MeasureTheory.ae_restrict_iff' + (measurableSet_of_isEllipticFieldOn a.2)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [hmem] with x hx + simpa [μ, C, Real.norm_eq_abs] using + abs_toFullBlockMat_blockCoeffField_entry_le_of_isEllipticFieldOn a.2 hx α β + have hbound : + ∀ n, + ∀ᵐ x ∂ μ, + ‖s n x * toFullBlockMat (blockCoeffField a.1 x) α β‖ ≤ + (2 * C) * ‖w x‖ := by + intro n + filter_upwards [hcoeff_bound] with x hxcoeff + have hsx : + ‖s n x‖ ≤ ‖w x‖ + ‖w x‖ := by + simpa [s] using + MeasureTheory.SimpleFunc.norm_approxOn_zero_le hw_meas + (s := Set.range w ∪ {0}) (by simp) x n + have hmul_nonneg : 0 ≤ ‖w x‖ + ‖w x‖ := by positivity + have hcoeff_nonneg : 0 ≤ ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ := by + positivity + calc + ‖s n x * toFullBlockMat (blockCoeffField a.1 x) α β‖ + = ‖s n x‖ * ‖toFullBlockMat (blockCoeffField a.1 x) α β‖ := by + exact norm_mul _ _ + _ ≤ (‖w x‖ + ‖w x‖) * C := by + exact mul_le_mul hsx hxcoeff hcoeff_nonneg hmul_nonneg + _ = (2 * C) * ‖w x‖ := by ring + have hbound_int : + MeasureTheory.Integrable (fun x => (2 * C) * ‖w x‖) μ := by + simpa [mul_assoc] using hw_int.norm.const_mul (2 * C) + have hlim : + ∀ᵐ x ∂ μ, + Tendsto + (fun n : ℕ => + s n x * toFullBlockMat (blockCoeffField a.1 x) α β) + atTop + (𝓝 (w x * toFullBlockMat (blockCoeffField a.1 x) α β)) := by + refine Filter.Eventually.of_forall ?_ + intro x + exact + (MeasureTheory.SimpleFunc.tendsto_approxOn hw_meas + (s := Set.range w ∪ {0}) (y₀ := 0) (by simp) + (x := x) (subset_closure (Or.inl ⟨x, rfl⟩))).mul tendsto_const_nhds + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, μ, s] using + MeasureTheory.tendsto_integral_of_dominated_convergence + (μ := μ) (G := ℝ) + (F := fun n x => + s n x * toFullBlockMat (blockCoeffField a.1 x) α β) + (f := fun x => + w x * toFullBlockMat (blockCoeffField a.1 x) α β) + (fun x => (2 * C) * ‖w x‖) + (fun n => (hs_prod_int n).aestronglyMeasurable) + hbound_int hbound hlim + let : MeasurableSpace {a : CoeffField d // QuantitativeEllipticSlice U k a} := + QuantitativeEllipticSlice.localMeasurableSpace U k + exact measurable_of_tendsto_metrizable hs_meas hs_tendsto + +/-- `L¹` deterministic weights are enough for slice-level full-block entry +measurability. This wrapper removes the need for callers to choose a +measurable representative of an integrable weight. -/ +theorem QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + {w : Vec d → ℝ} + (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + classical + let w' : Vec d → ℝ := hw.aestronglyMeasurable.mk w + have hw'_meas : Measurable w' := by + simpa [w'] using hw.aestronglyMeasurable.measurable_mk + have hw'_int : MeasureTheory.Integrable w' (volumeMeasureOn U) := by + exact hw.congr hw.aestronglyMeasurable.ae_eq_mk + have hmeas' : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w' x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume) := + QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral_of_measurable + hToL2 hw'_meas hw'_int α β + rw [show + (fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) = + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + w' x * toFullBlockMat (blockCoeffField a.1 x) α β + ∂MeasureTheory.volume by + funext a + apply MeasureTheory.integral_congr_ae + filter_upwards [hw.aestronglyMeasurable.ae_eq_mk] with x hx + rw [hx]] + exact hmeas' + +/-- Open finite-measure wrapper for the `L¹`-weighted full-block entry +measurability theorem. -/ +theorem QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + {w : Vec d → ℝ} + (hw : MeasureTheory.Integrable w (volumeMeasureOn U)) (α β : BlockCoord d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + ∫ x in U, + w x * toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) := by + exact + QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + hw α β + +theorem QuantitativeEllipticSlice.blockEnergyDensity_integrableOn_of_memBlockL2 + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {k : ℕ} {X : BlockState d} (hSlice : QuantitativeEllipticSlice U k a) + (hX : MemBlockL2 U X.eval) : + MeasureTheory.IntegrableOn (blockEnergyDensity a X) U := + blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := U) (a := a) (lam := ((k + 1 : ℝ)⁻¹)) (Lam := (k + 1 : ℝ)) hX hSlice + +noncomputable def blockEnergyEntryWeight {d : ℕ} (X : BlockState d) + (α β : BlockCoord d) (x : Vec d) : ℝ := + (1 / 2 : ℝ) * (toFullBlockVec (X.eval x) α * toFullBlockVec (X.eval x) β) + +noncomputable def blockPairingEntryWeight {d : ℕ} (X Y : BlockState d) + (α β : BlockCoord d) (x : Vec d) : ℝ := + toFullBlockVec (X.eval x) α * toFullBlockVec (Y.eval x) β + +theorem integrable_blockEnergyEntryWeight_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {X : BlockState d} (hX : MemBlockL2 U X.eval) (α β : BlockCoord d) : + MeasureTheory.Integrable (blockEnergyEntryWeight X α β) (volumeMeasureOn U) := by + have hcoord : + MeasureTheory.Integrable + (fun x => toFullBlockVec (X.eval x) α * toFullBlockVec (X.eval x) β) + (volumeMeasureOn U) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_fullBlockCoord_mul_of_memBlockL2 hX α β + change MeasureTheory.Integrable + (fun x => (1 / 2 : ℝ) * + (toFullBlockVec (X.eval x) α * toFullBlockVec (X.eval x) β)) + (volumeMeasureOn U) + exact hcoord.const_mul (1 / 2 : ℝ) + +theorem integrable_blockPairingEntryWeight_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {X Y : BlockState d} (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) + (α β : BlockCoord d) : + MeasureTheory.Integrable (blockPairingEntryWeight X Y α β) (volumeMeasureOn U) := by + simpa [blockPairingEntryWeight, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + (memScalarL2_fullBlockCoord_of_memBlockL2 hX α).integrable_mul + (memScalarL2_fullBlockCoord_of_memBlockL2 hY β) + +theorem QuantitativeEllipticSlice.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {k : ℕ} {X : BlockState d} (hSlice : QuantitativeEllipticSlice U k a) + (hX : MemBlockL2 U X.eval) (α β : BlockCoord d) : + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a x) α β) + U := by + classical + let coeff : Vec d → ℝ := fun x => toFullBlockMat (blockCoeffField a x) α β + let aExt : Vec d → Fin d → Fin d → ℝ := fun x i j => if x ∈ U then a x i j else 0 + have haExt : Measurable aExt := by + simpa [aExt] using hSlice.1 + have hblock : + Measurable (fun x γ δ => + toFullBlockMat (blockMatrixOfCoeff (aExt x)) γ δ) := + measurable_toFullBlockMat_blockCoeffField haExt + have hcoeffExt : + Measurable (fun x => toFullBlockMat (blockMatrixOfCoeff (aExt x)) α β) := + measurable_pi_iff.1 (measurable_pi_iff.1 hblock α) β + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hSlice)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hcoeff_ae : AEMeasurable coeff (volumeMeasureOn U) := by + refine (Measurable.aemeasurable hcoeffExt).congr ?_ + filter_upwards [hmem] with x hx + simp [coeff, aExt, blockCoeffField, hx] + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖coeff x‖ ≤ Real.sqrt (blockMatrixOfCoeffNormSqBound ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ)) := by + filter_upwards [hmem] with x hx + simpa [coeff, Real.norm_eq_abs] using + abs_toFullBlockMat_blockCoeffField_entry_le_of_isEllipticFieldOn hSlice hx α β + have hweight := integrable_blockEnergyEntryWeight_of_memBlockL2 (U := U) hX α β + have hprod : + MeasureTheory.Integrable + (fun x => blockEnergyEntryWeight X α β x * coeff x) (volumeMeasureOn U) := + hweight.mul_bdd hcoeff_ae.aestronglyMeasurable hbound + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, coeff] using hprod + +theorem blockEnergyDensity_eq_sum_entryWeights {d : ℕ} + (a : CoeffField d) (X : BlockState d) (x : Vec d) : + blockEnergyDensity a X x = + ∑ α, ∑ β, + blockEnergyEntryWeight X α β x * toFullBlockMat (blockCoeffField a x) α β := by + rw [blockEnergyDensity_eq_sum_fullBlockMat_entries] + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro α _ + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro β _ + simp [blockEnergyEntryWeight] + ring_nf + +theorem blockPairingIntegrand_eq_sum_entryWeights {d : ℕ} + (a : CoeffField d) (X Y : BlockState d) (x : Vec d) : + blockPairingIntegrand a X Y x = + ∑ α, ∑ β, + blockPairingEntryWeight X Y α β x * toFullBlockMat (blockCoeffField a x) α β := by + rw [blockPairingIntegrand, blockVecDot_blockMatVecMul_eq_toLinearMap₂', + Matrix.toLinearMap₂'_apply] + simp [blockPairingEntryWeight, mul_assoc] + +theorem blockEnergyAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (X : BlockState d) + (hInt : + ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight X α β x * toFullBlockMat (blockCoeffField a x) α β) + U) : + blockEnergyAverage U a X = + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume := by + unfold blockEnergyAverage volumeAverage + rw [show + blockEnergyDensity a X = + fun x => + ∑ α, ∑ β, + blockEnergyEntryWeight X α β x * toFullBlockMat (blockCoeffField a x) α β by + funext x + exact blockEnergyDensity_eq_sum_entryWeights a X x] + rw [MeasureTheory.integral_finsetSum] + · congr 1 + apply Finset.sum_congr rfl + intro α _ + rw [MeasureTheory.integral_finsetSum] + intro β _ + simpa [MeasureTheory.IntegrableOn] using hInt α β + · intro α _ + exact MeasureTheory.integrable_finsetSum + Finset.univ + (fun β _ => by + simpa [MeasureTheory.IntegrableOn] using hInt α β) + +theorem blockPairingAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (X Y : BlockState d) + (hInt : + ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockPairingEntryWeight X Y α β x * toFullBlockMat (blockCoeffField a x) α β) + U) : + blockPairingAverage U a X Y = + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume := by + unfold blockPairingAverage volumeAverage + rw [show + blockPairingIntegrand a X Y = + fun x => + ∑ α, ∑ β, + blockPairingEntryWeight X Y α β x * toFullBlockMat (blockCoeffField a x) α β by + funext x + exact blockPairingIntegrand_eq_sum_entryWeights a X Y x] + rw [MeasureTheory.integral_finsetSum] + · congr 1 + apply Finset.sum_congr rfl + intro α _ + rw [MeasureTheory.integral_finsetSum] + intro β _ + simpa [MeasureTheory.IntegrableOn] using hInt α β + · intro α _ + exact MeasureTheory.integrable_finsetSum + Finset.univ + (fun β _ => by + simpa [MeasureTheory.IntegrableOn] using hInt α β) + +theorem measurable_blockEnergyAverage_of_measurable_weightedFullBlockCoeffEntryIntegrals + {d : ℕ} {U : Set (Vec d)} (X : BlockState d) + (hInt : + ∀ a : CoeffField d, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight X α β x * toFullBlockMat (blockCoeffField a x) α β) + U) + (hMeas : + ∀ α β : BlockCoord d, + Measurable fun a : CoeffField d => + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume) : + Measurable fun a : CoeffField d => blockEnergyAverage U a X := by + rw [show + (fun a : CoeffField d => blockEnergyAverage U a X) = + fun a : CoeffField d => + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume by + funext a + exact blockEnergyAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals U a X (hInt a)] + exact measurable_const.mul + (Finset.measurable_sum Finset.univ fun α _ => + Finset.measurable_sum Finset.univ fun β _ => hMeas α β) + +theorem measurable_blockPairingAverage_of_measurable_weightedFullBlockCoeffEntryIntegrals + {d : ℕ} {U : Set (Vec d)} (X Y : BlockState d) + (hInt : + ∀ a : CoeffField d, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockPairingEntryWeight X Y α β x * toFullBlockMat (blockCoeffField a x) α β) + U) + (hMeas : + ∀ α β : BlockCoord d, + Measurable fun a : CoeffField d => + ∫ x in U, + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume) : + Measurable fun a : CoeffField d => blockPairingAverage U a X Y := by + rw [show + (fun a : CoeffField d => blockPairingAverage U a X Y) = + fun a : CoeffField d => + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume by + funext a + exact blockPairingAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals U a X Y + (hInt a)] + exact measurable_const.mul + (Finset.measurable_sum Finset.univ fun α _ => + Finset.measurable_sum Finset.univ fun β _ => hMeas α β) + +theorem measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} (A : Ω → CoeffField d) (X : BlockState d) + (hInt : + ∀ ω : Ω, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight X α β x * toFullBlockMat (blockCoeffField (A ω) x) α β) + U) + (hMeas : + ∀ α β : BlockCoord d, + Measurable fun ω : Ω => + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β ∂MeasureTheory.volume) : + Measurable fun ω : Ω => blockEnergyAverage U (A ω) X := by + rw [show + (fun ω : Ω => blockEnergyAverage U (A ω) X) = + fun ω : Ω => + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β ∂MeasureTheory.volume by + funext ω + exact blockEnergyAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals U (A ω) X + (hInt ω)] + exact measurable_const.mul + (Finset.measurable_sum Finset.univ fun α _ => + Finset.measurable_sum Finset.univ fun β _ => hMeas α β) + +theorem measurable_blockPairingAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} (A : Ω → CoeffField d) (X Y : BlockState d) + (hInt : + ∀ ω : Ω, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β) + U) + (hMeas : + ∀ α β : BlockCoord d, + Measurable fun ω : Ω => + ∫ x in U, + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β ∂MeasureTheory.volume) : + Measurable fun ω : Ω => blockPairingAverage U (A ω) X Y := by + rw [show + (fun ω : Ω => blockPairingAverage U (A ω) X Y) = + fun ω : Ω => + (MeasureTheory.volume U).toReal⁻¹ * + ∑ α, ∑ β, + ∫ x in U, + blockPairingEntryWeight X Y α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β ∂MeasureTheory.volume by + funext ω + exact blockPairingAverage_eq_sum_weightedFullBlockCoeffEntryIntegrals U (A ω) X Y + (hInt ω)] + exact measurable_const.mul + (Finset.measurable_sum Finset.univ fun α _ => + Finset.measurable_sum Finset.univ fun β _ => hMeas α β) + +theorem measurable_blockEnergyAverage_quantitativeSlice_of_measurable_weightedFullBlockCoeffEntryIntegrals + {d : ℕ} {U : Set (Vec d)} {k : ℕ} (X : BlockState d) + (hX : MemBlockL2 U X.eval) + (hMeas : + ∀ α β : BlockCoord d, + Measurable fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + blockEnergyEntryWeight X α β x * + toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) : + Measurable fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + blockEnergyAverage U a.1 X := by + exact measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => a.1) + (X := X) + (fun a α β => + a.2.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 hX α β) + hMeas + +/-- Fixed-competitor energy averages are measurable on a quantitative elliptic +slice once the slice has the note-facing measurable `L²` realization. -/ +theorem measurable_blockEnergyAverage_quantitativeSlice + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockEnergyAverage U a.1 X) := by + let : MeasurableSpace {a : CoeffField d // QuantitativeEllipticSlice U k a} := + QuantitativeEllipticSlice.localMeasurableSpace U k + exact measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => a.1) + (X := X) + (fun a α β => + a.2.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 hX α β) + (fun α β => + QuantitativeEllipticSlice.measurable_integrableWeightedFullBlockCoeffEntryIntegral + hToL2 (integrable_blockEnergyEntryWeight_of_memBlockL2 hX α β) α β) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/LipschitzBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/LipschitzBounds.lean new file mode 100644 index 0000000000..31b15266ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/LipschitzBounds.lean @@ -0,0 +1,627 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.Measurability +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Geometry.Manifold.ContMDiff.NormedSpace +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! # Lipschitz Bounds -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** Borel/Lipschitz measurability of fixed-coefficient maps +`HilbertMat d → block-coefficient entry` — the finite-dimensional nonlinear +atoms behind the bounded-elliptic Nemytskii step used to lift local scalar +atoms into measurable energy approximants. + +**Consumed by (within `Internal/FixedCompetitorEnergyMeasurability/`):** +`Integrals.lean`. Upstream chain continues to `Theorems/Mu.lean :: +aemeasurable_Mu_cubeSet`. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +/-- A single full-block coefficient entry is a Borel function of the finite +Hilbert-matrix coefficient value. This is the finite-dimensional nonlinear +atom behind the later bounded elliptic Nemytskii step. -/ +theorem measurable_fullBlockCoeffEntry_hilbertMat {d : ℕ} (α β : BlockCoord d) : + Measurable fun A : HilbertMat d => + toFullBlockMat (blockMatrixOfCoeff A.toMat) α β := by + have hA : Measurable fun A : HilbertMat d => A.toMat := + (HilbertMat.continuousLinearEquivMat d).continuous.measurable + have hblock : + Measurable (fun A : HilbertMat d => fun α β => + toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) := + measurable_toFullBlockMat_blockCoeffField hA + exact measurable_pi_iff.1 (measurable_pi_iff.1 hblock α) β + +/-- The quantitative ellipticity value set for Hilbert-matrix representatives +on the `k`-th slice. A coefficient field in `QuantitativeEllipticSlice U k` +takes values in this set for `volumeMeasureOn U`-almost every point. -/ +def quantitativeEllipticHilbertMatSet (d : ℕ) (k : ℕ) : Set (HilbertMat d) := + {A | IsEllipticMatrix ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) A.toMat} + +private theorem abs_symmPart_toMat_sub_le_norm {d : ℕ} (A B : HilbertMat d) + (i j : Fin d) : + |symmPart A.toMat i j - symmPart B.toMat i j| ≤ ‖A - B‖ := by + have hij := HilbertMat.abs_apply_sub_apply_le_norm A B i j + have hji := HilbertMat.abs_apply_sub_apply_le_norm A B j i + have htri : + |(A i j - B i j) + (A j i - B j i)| ≤ 2 * ‖A - B‖ := by + calc + |(A i j - B i j) + (A j i - B j i)| + ≤ |A i j - B i j| + |A j i - B j i| := abs_add_le _ _ + _ ≤ ‖A - B‖ + ‖A - B‖ := add_le_add hij hji + _ = 2 * ‖A - B‖ := by ring + have hentry : + symmPart A.toMat i j - symmPart B.toMat i j = + ((A i j - B i j) + (A j i - B j i)) / 2 := by + simp [symmPart, HilbertMat.toMat] + ring + calc + |symmPart A.toMat i j - symmPart B.toMat i j| + = |((A i j - B i j) + (A j i - B j i)) / 2| := by rw [hentry] + _ = |(A i j - B i j) + (A j i - B j i)| / 2 := by + rw [abs_div, abs_of_pos (by norm_num : (0 : ℝ) < 2)] + _ ≤ (2 * ‖A - B‖) / 2 := + div_le_div_of_nonneg_right htri (by norm_num) + _ = ‖A - B‖ := by ring + +private theorem abs_skewPart_toMat_sub_le_norm {d : ℕ} (A B : HilbertMat d) + (i j : Fin d) : + |skewPart A.toMat i j - skewPart B.toMat i j| ≤ ‖A - B‖ := by + have hij := HilbertMat.abs_apply_sub_apply_le_norm A B i j + have hji := HilbertMat.abs_apply_sub_apply_le_norm A B j i + have htri : + |(A i j - B i j) - (A j i - B j i)| ≤ 2 * ‖A - B‖ := by + calc + |(A i j - B i j) - (A j i - B j i)| + ≤ |A i j - B i j| + |-(A j i - B j i)| := by + simpa [sub_eq_add_neg] using + abs_add_le (A i j - B i j) (-(A j i - B j i)) + _ = |A i j - B i j| + |A j i - B j i| := by rw [abs_neg] + _ ≤ ‖A - B‖ + ‖A - B‖ := add_le_add hij hji + _ = 2 * ‖A - B‖ := by ring + have hentry : + skewPart A.toMat i j - skewPart B.toMat i j = + ((A i j - B i j) - (A j i - B j i)) / 2 := by + simp [skewPart, HilbertMat.toMat] + ring + calc + |skewPart A.toMat i j - skewPart B.toMat i j| + = |((A i j - B i j) - (A j i - B j i)) / 2| := by rw [hentry] + _ = |(A i j - B i j) - (A j i - B j i)| / 2 := by + rw [abs_div, abs_of_pos (by norm_num : (0 : ℝ) < 2)] + _ ≤ (2 * ‖A - B‖) / 2 := + div_le_div_of_nonneg_right htri (by norm_num) + _ = ‖A - B‖ := by ring + +private theorem abs_skewPart_toMat_le_of_mem_quantitative + {d : ℕ} {k : ℕ} {A : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |skewPart A.toMat i j| ≤ (k + 1 : ℝ) := by + have hij := abs_apply_le_of_isEllipticMatrix hA i j + have hji := abs_apply_le_of_isEllipticMatrix hA j i + have htri : |A i j - A j i| ≤ 2 * (k + 1 : ℝ) := by + calc + |A i j - A j i| ≤ |A i j| + |A j i| := by + simpa [sub_eq_add_neg] using abs_add_le (A i j) (-(A j i)) + _ ≤ (k + 1 : ℝ) + (k + 1 : ℝ) := add_le_add hij hji + _ = 2 * (k + 1 : ℝ) := by ring + have hentry : skewPart A.toMat i j = (A i j - A j i) / 2 := by + simp [skewPart, HilbertMat.toMat] + calc + |skewPart A.toMat i j| = |(A i j - A j i) / 2| := by rw [hentry] + _ = |A i j - A j i| / 2 := by + rw [abs_div, abs_of_pos (by norm_num : (0 : ℝ) < 2)] + _ ≤ (2 * (k + 1 : ℝ)) / 2 := + div_le_div_of_nonneg_right htri (by norm_num) + _ = (k + 1 : ℝ) := by ring + +private theorem abs_symmPartInv_toMat_sub_le_norm_of_mem_quantitative + {d : ℕ} {k : ℕ} {A B : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) + (hB : B ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |((symmPart A.toMat)⁻¹ : Mat d) i j - ((symmPart B.toMat)⁻¹ : Mat d) i j| ≤ + ((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * ‖A - B‖ := by + let lam : ℝ := ((k + 1 : ℝ)⁻¹) + let S : Mat d := symmPart A.toMat + let T : Mat d := symmPart B.toMat + have hSunit : IsUnit S := isUnit_symmPart_of_isEllipticMatrix hA + have hTunit : IsUnit T := isUnit_symmPart_of_isEllipticMatrix hB + have hunit_iff : IsUnit S ↔ IsUnit T := ⟨fun _ => hTunit, fun _ => hSunit⟩ + have hSinv_bound : + ∀ p : Fin d, |(S⁻¹ : Mat d) i p| ≤ lam⁻¹ := by + intro p + simpa [S, lam] using abs_apply_symmPartInv_le_of_isEllipticMatrix hA i p + have hTinv_bound : + ∀ q : Fin d, |(T⁻¹ : Mat d) q j| ≤ lam⁻¹ := by + intro q + simpa [T, lam] using abs_apply_symmPartInv_le_of_isEllipticMatrix hB q j + have hmid_bound : + ∀ p q : Fin d, |(T - S) p q| ≤ ‖A - B‖ := by + intro p q + simpa [S, T, abs_sub_comm] using abs_symmPart_toMat_sub_le_norm A B p q + calc + |((symmPart A.toMat)⁻¹ : Mat d) i j - ((symmPart B.toMat)⁻¹ : Mat d) i j| + = |(S⁻¹ - T⁻¹ : Mat d) i j| := by simp [S, T] + _ = |(S⁻¹ * (T - S) * T⁻¹ : Mat d) i j| := by + rw [Matrix.inv_sub_inv hunit_iff] + _ ≤ ∑ p : Fin d, ∑ q : Fin d, + |(S⁻¹ : Mat d) i q * (T - S) q p * (T⁻¹ : Mat d) p j| := by + rw [Matrix.mul_apply] + refine le_trans + (Finset.abs_sum_le_sum_abs + (fun p : Fin d => (S⁻¹ * (T - S) : Mat d) i p * (T⁻¹ : Mat d) p j) + Finset.univ) ?_ + refine Finset.sum_le_sum ?_ + intro p _ + rw [Matrix.mul_apply] + calc + |(∑ q : Fin d, (S⁻¹ : Mat d) i q * (T - S) q p) * (T⁻¹ : Mat d) p j| + = |∑ q : Fin d, (S⁻¹ : Mat d) i q * (T - S) q p| * + |(T⁻¹ : Mat d) p j| := by + rw [abs_mul] + _ ≤ (∑ q : Fin d, |(S⁻¹ : Mat d) i q * (T - S) q p|) * + |(T⁻¹ : Mat d) p j| := by + exact mul_le_mul_of_nonneg_right + (Finset.abs_sum_le_sum_abs + (fun q : Fin d => (S⁻¹ : Mat d) i q * (T - S) q p) Finset.univ) + (abs_nonneg _) + _ = ∑ q : Fin d, + |(S⁻¹ : Mat d) i q * (T - S) q p| * |(T⁻¹ : Mat d) p j| := by + rw [← Finset.sum_mul] + _ = ∑ q : Fin d, + |(S⁻¹ : Mat d) i q * (T - S) q p * (T⁻¹ : Mat d) p j| := by + apply Finset.sum_congr rfl + intro q _ + rw [abs_mul] + rw [abs_mul] + rw [abs_mul ((S⁻¹ : Mat d) i q) ((T - S) q p)] + _ ≤ ∑ _p : Fin d, ∑ _q : Fin d, lam⁻¹ * ‖A - B‖ * lam⁻¹ := by + refine Finset.sum_le_sum ?_ + intro p _ + refine Finset.sum_le_sum ?_ + intro q _ + calc + |(S⁻¹ : Mat d) i q * (T - S) q p * (T⁻¹ : Mat d) p j| + = |(S⁻¹ : Mat d) i q| * |(T - S) q p| * |(T⁻¹ : Mat d) p j| := by + rw [abs_mul, abs_mul] + _ ≤ lam⁻¹ * ‖A - B‖ * lam⁻¹ := by + gcongr + · exact hSinv_bound q + · exact hmid_bound q p + · exact hTinv_bound p + _ = ((d : ℝ) ^ 2 * lam⁻¹ ^ 2) * ‖A - B‖ := by + simp [Finset.card_univ, nsmul_eq_mul] + ring + _ = ((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * ‖A - B‖ := by + simp [lam] + +noncomputable def quantitativeSymmPartInvEntryLipschitzConstant (d k : ℕ) : NNReal := + Real.toNNReal ((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) + +noncomputable def quantitativeInvSkewProductEntryLipschitzConstant (d k : ℕ) : NNReal := + Real.toNNReal + ((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) + +noncomputable def quantitativeUpperLeftEntryLipschitzConstant (d k : ℕ) : NNReal := + Real.toNNReal + (1 + + (d : ℝ) * + (((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * + (k + 1 : ℝ) + + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹))) + +theorem lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_lowerRight_quantitative + {d : ℕ} {k : ℕ} (i j : Fin d) : + LipschitzOnWith (quantitativeSymmPartInvEntryLipschitzConstant d k) + (fun A : HilbertMat d => + toFullBlockMat (blockMatrixOfCoeff A.toMat) (Sum.inr i) (Sum.inr j)) + (quantitativeEllipticHilbertMatSet d k) := by + refine LipschitzOnWith.of_dist_le_mul ?_ + intro A hA B hB + have hC_nonneg : + 0 ≤ (d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2 := by positivity + have h := + abs_symmPartInv_toMat_sub_le_norm_of_mem_quantitative hA hB i j + have hC_coe : + ((quantitativeSymmPartInvEntryLipschitzConstant d k : NNReal) : ℝ) = + (d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2 := by + rw [quantitativeSymmPartInvEntryLipschitzConstant, Real.coe_toNNReal _ hC_nonneg] + rw [Real.dist_eq, dist_eq_norm, hC_coe] + simpa [toFullBlockMat, blockMatrixOfCoeff] using h + +private theorem abs_symmPartInv_mul_skewPart_toMat_sub_le_norm_of_mem_quantitative + {d : ℕ} {k : ℕ} {A B : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) + (hB : B ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |(((symmPart A.toMat)⁻¹ : Mat d) * skewPart A.toMat) i j - + (((symmPart B.toMat)⁻¹ : Mat d) * skewPart B.toMat) i j| ≤ + ((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * ‖A - B‖ := by + let lam : ℝ := ((k + 1 : ℝ)⁻¹) + let Cinv : ℝ := (d : ℝ) ^ 2 * lam⁻¹ ^ 2 + let SA : Mat d := symmPart A.toMat + let SB : Mat d := symmPart B.toMat + let KA : Mat d := skewPart A.toMat + let KB : Mat d := skewPart B.toMat + have hentry : + (SA⁻¹ * KA) i j - (SB⁻¹ * KB) i j = + ∑ p : Fin d, + (((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j + + (SB⁻¹ : Mat d) i p * (KA p j - KB p j)) := by + simp [Matrix.mul_apply] + rw [← Finset.sum_sub_distrib] + apply Finset.sum_congr rfl + intro p _ + ring + have hterm : + ∀ p : Fin d, + |((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j + + (SB⁻¹ : Mat d) i p * (KA p j - KB p j)| ≤ + Cinv * ‖A - B‖ * (k + 1 : ℝ) + lam⁻¹ * ‖A - B‖ := by + intro p + have hInvDiff : + |(SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p| ≤ Cinv * ‖A - B‖ := by + simpa [SA, SB, Cinv, lam] using + abs_symmPartInv_toMat_sub_le_norm_of_mem_quantitative hA hB i p + have hSkewA : |KA p j| ≤ (k + 1 : ℝ) := by + simpa [KA] using abs_skewPart_toMat_le_of_mem_quantitative hA p j + have hInvB : |(SB⁻¹ : Mat d) i p| ≤ lam⁻¹ := by + simpa [SB, lam] using abs_apply_symmPartInv_le_of_isEllipticMatrix hB i p + have hSkewDiff : |KA p j - KB p j| ≤ ‖A - B‖ := by + simpa [KA, KB] using abs_skewPart_toMat_sub_le_norm A B p j + calc + |((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j + + (SB⁻¹ : Mat d) i p * (KA p j - KB p j)| + ≤ |((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j| + + |(SB⁻¹ : Mat d) i p * (KA p j - KB p j)| := abs_add_le _ _ + _ = |(SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p| * |KA p j| + + |(SB⁻¹ : Mat d) i p| * |KA p j - KB p j| := by + rw [abs_mul, abs_mul] + _ ≤ Cinv * ‖A - B‖ * (k + 1 : ℝ) + lam⁻¹ * ‖A - B‖ := by + gcongr + calc + |(((symmPart A.toMat)⁻¹ : Mat d) * skewPart A.toMat) i j - + (((symmPart B.toMat)⁻¹ : Mat d) * skewPart B.toMat) i j| + = |∑ p : Fin d, + (((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j + + (SB⁻¹ : Mat d) i p * (KA p j - KB p j))| := by + rw [hentry] + _ ≤ ∑ p : Fin d, + |((SA⁻¹ : Mat d) i p - (SB⁻¹ : Mat d) i p) * KA p j + + (SB⁻¹ : Mat d) i p * (KA p j - KB p j)| := + Finset.abs_sum_le_sum_abs _ Finset.univ + _ ≤ ∑ _p : Fin d, (Cinv * ‖A - B‖ * (k + 1 : ℝ) + lam⁻¹ * ‖A - B‖) := by + exact Finset.sum_le_sum fun p _ => hterm p + _ = ((d : ℝ) * (Cinv * (k + 1 : ℝ) + lam⁻¹)) * ‖A - B‖ := by + simp [Finset.card_univ, nsmul_eq_mul] + ring + _ = + ((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * ‖A - B‖ := by + simp [Cinv, lam] + +theorem lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_lowerLeft_quantitative + {d : ℕ} {k : ℕ} (i j : Fin d) : + LipschitzOnWith (quantitativeInvSkewProductEntryLipschitzConstant d k) + (fun A : HilbertMat d => + toFullBlockMat (blockMatrixOfCoeff A.toMat) (Sum.inr i) (Sum.inl j)) + (quantitativeEllipticHilbertMatSet d k) := by + refine LipschitzOnWith.of_dist_le_mul ?_ + intro A hA B hB + have hC_nonneg : + 0 ≤ + (d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹)) := by positivity + have h := + abs_symmPartInv_mul_skewPart_toMat_sub_le_norm_of_mem_quantitative hA hB i j + have hC_coe : + ((quantitativeInvSkewProductEntryLipschitzConstant d k : NNReal) : ℝ) = + (d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹)) := by + rw [quantitativeInvSkewProductEntryLipschitzConstant, + Real.coe_toNNReal _ hC_nonneg] + rw [Real.dist_eq, dist_eq_norm, hC_coe] + simp only [toFullBlockMat, blockMatrixOfCoeff] + change |-(((symmPart A.toMat)⁻¹ : Mat d) * skewPart A.toMat) i j + + -(-(((symmPart B.toMat)⁻¹ : Mat d) * skewPart B.toMat) i j)| ≤ + (d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹)) * ‖A - B‖ + convert h using 1 + rw [← abs_neg] + congr 1 + ring + +private theorem toFullBlockMat_blockMatrixOfCoeff_upperRight_eq_lowerLeft_transpose + {d : ℕ} (A : Mat d) (i j : Fin d) : + toFullBlockMat (blockMatrixOfCoeff A) (Sum.inl i) (Sum.inr j) = + toFullBlockMat (blockMatrixOfCoeff A) (Sum.inr j) (Sum.inl i) := by + have h := congrArg (fun M : Mat d => M j i) (blockMatrixOfCoeff_upperRight_transpose A) + simpa [matTranspose, toFullBlockMat] using h + +theorem lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_upperRight_quantitative + {d : ℕ} {k : ℕ} (i j : Fin d) : + LipschitzOnWith (quantitativeInvSkewProductEntryLipschitzConstant d k) + (fun A : HilbertMat d => + toFullBlockMat (blockMatrixOfCoeff A.toMat) (Sum.inl i) (Sum.inr j)) + (quantitativeEllipticHilbertMatSet d k) := by + refine LipschitzOnWith.of_dist_le_mul ?_ + intro A hA B hB + have hLL := + (lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_lowerLeft_quantitative + (k := k) j i).dist_le_mul A hA B hB + simpa [toFullBlockMat_blockMatrixOfCoeff_upperRight_eq_lowerLeft_transpose] using hLL + +private theorem abs_skewTranspose_mul_symmPartInv_toMat_le_of_mem_quantitative + {d : ℕ} {k : ℕ} {A : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |(matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d)) i j| ≤ + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹) := by + let lam : ℝ := ((k + 1 : ℝ)⁻¹) + let K : Mat d := skewPart A.toMat + let SInv : Mat d := (symmPart A.toMat)⁻¹ + have hterm : + ∀ p : Fin d, |(matTranspose K) i p * SInv p j| ≤ (k + 1 : ℝ) * lam⁻¹ := by + intro p + have hK : |K p i| ≤ (k + 1 : ℝ) := by + simpa [K] using abs_skewPart_toMat_le_of_mem_quantitative hA p i + have hS : |SInv p j| ≤ lam⁻¹ := by + simpa [SInv, lam] using abs_apply_symmPartInv_le_of_isEllipticMatrix hA p j + calc + |(matTranspose K) i p * SInv p j| = |K p i| * |SInv p j| := by + simp [matTranspose, abs_mul] + _ ≤ (k + 1 : ℝ) * lam⁻¹ := by gcongr + calc + |(matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d)) i j| + = |∑ p : Fin d, (matTranspose K) i p * SInv p j| := by + rw [Matrix.mul_apply] + _ ≤ ∑ p : Fin d, |(matTranspose K) i p * SInv p j| := + Finset.abs_sum_le_sum_abs _ Finset.univ + _ ≤ ∑ _p : Fin d, (k + 1 : ℝ) * lam⁻¹ := by + exact Finset.sum_le_sum fun p _ => hterm p + _ = (d : ℝ) * (k + 1 : ℝ) * lam⁻¹ := by + simp [Finset.card_univ, nsmul_eq_mul] + ring + _ = (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹) := by + simp [lam] + +private theorem abs_skewTranspose_mul_symmPartInv_toMat_sub_le_norm_of_mem_quantitative + {d : ℕ} {k : ℕ} {A B : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) + (hB : B ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |(matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d)) i j - + (matTranspose (skewPart B.toMat) * ((symmPart B.toMat)⁻¹ : Mat d)) i j| ≤ + ((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * ‖A - B‖ := by + have hC_nonneg : + 0 ≤ + (d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹)) := by positivity + have hC_coe : + ((quantitativeInvSkewProductEntryLipschitzConstant d k : NNReal) : ℝ) = + (d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹)) := by + rw [quantitativeInvSkewProductEntryLipschitzConstant, + Real.coe_toNNReal _ hC_nonneg] + have hUR := + (lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_upperRight_quantitative + (k := k) i j).dist_le_mul A hA B hB + rw [Real.dist_eq, dist_eq_norm, hC_coe] at hUR + simp only [toFullBlockMat, blockMatrixOfCoeff] at hUR + rw [show + (-(matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d))) i j = + -((matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d)) i j) by rfl, + show + (-(matTranspose (skewPart B.toMat) * ((symmPart B.toMat)⁻¹ : Mat d))) i j = + -((matTranspose (skewPart B.toMat) * ((symmPart B.toMat)⁻¹ : Mat d)) i j) by rfl] at hUR + convert hUR using 1 + rw [← abs_neg] + congr 1 + ring + +private theorem abs_upperLeft_toMat_sub_le_norm_of_mem_quantitative + {d : ℕ} {k : ℕ} {A B : HilbertMat d} + (hA : A ∈ quantitativeEllipticHilbertMatSet d k) + (hB : B ∈ quantitativeEllipticHilbertMatSet d k) (i j : Fin d) : + |(blockMatrixOfCoeff A.toMat).upperLeft i j - + (blockMatrixOfCoeff B.toMat).upperLeft i j| ≤ + (1 + + (d : ℝ) * + (((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * + (k + 1 : ℝ) + + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹))) * ‖A - B‖ := by + let lam : ℝ := ((k + 1 : ℝ)⁻¹) + let Cinv : ℝ := (d : ℝ) ^ 2 * lam⁻¹ ^ 2 + let Cprod : ℝ := (d : ℝ) * (Cinv * (k + 1 : ℝ) + lam⁻¹) + let Hbound : ℝ := (d : ℝ) * (k + 1 : ℝ) * lam⁻¹ + let Ctriple : ℝ := (d : ℝ) * (Cprod * (k + 1 : ℝ) + Hbound) + let SA : Mat d := symmPart A.toMat + let SB : Mat d := symmPart B.toMat + let HA : Mat d := matTranspose (skewPart A.toMat) * ((symmPart A.toMat)⁻¹ : Mat d) + let HB : Mat d := matTranspose (skewPart B.toMat) * ((symmPart B.toMat)⁻¹ : Mat d) + let KA : Mat d := skewPart A.toMat + let KB : Mat d := skewPart B.toMat + have hProdEntry : + (HA * KA) i j - (HB * KB) i j = + ∑ p : Fin d, + ((HA i p - HB i p) * KA p j + HB i p * (KA p j - KB p j)) := by + simp [Matrix.mul_apply] + rw [← Finset.sum_sub_distrib] + apply Finset.sum_congr rfl + intro p _ + ring + have hterm : + ∀ p : Fin d, + |(HA i p - HB i p) * KA p j + HB i p * (KA p j - KB p j)| ≤ + Cprod * ‖A - B‖ * (k + 1 : ℝ) + Hbound * ‖A - B‖ := by + intro p + have hHDiff : |HA i p - HB i p| ≤ Cprod * ‖A - B‖ := by + simpa [HA, HB, Cprod, Cinv, lam] using + abs_skewTranspose_mul_symmPartInv_toMat_sub_le_norm_of_mem_quantitative hA hB i p + have hSkewA : |KA p j| ≤ (k + 1 : ℝ) := by + simpa [KA] using abs_skewPart_toMat_le_of_mem_quantitative hA p j + have hHB : |HB i p| ≤ Hbound := by + simpa [HB, Hbound, lam] using + abs_skewTranspose_mul_symmPartInv_toMat_le_of_mem_quantitative hB i p + have hSkewDiff : |KA p j - KB p j| ≤ ‖A - B‖ := by + simpa [KA, KB] using abs_skewPart_toMat_sub_le_norm A B p j + calc + |(HA i p - HB i p) * KA p j + HB i p * (KA p j - KB p j)| + ≤ |(HA i p - HB i p) * KA p j| + + |HB i p * (KA p j - KB p j)| := abs_add_le _ _ + _ = |HA i p - HB i p| * |KA p j| + + |HB i p| * |KA p j - KB p j| := by + rw [abs_mul, abs_mul] + _ ≤ Cprod * ‖A - B‖ * (k + 1 : ℝ) + Hbound * ‖A - B‖ := by + gcongr + have hTriple : + |(HA * KA) i j - (HB * KB) i j| ≤ Ctriple * ‖A - B‖ := by + calc + |(HA * KA) i j - (HB * KB) i j| + = |∑ p : Fin d, + ((HA i p - HB i p) * KA p j + HB i p * (KA p j - KB p j))| := by + rw [hProdEntry] + _ ≤ ∑ p : Fin d, + |(HA i p - HB i p) * KA p j + HB i p * (KA p j - KB p j)| := + Finset.abs_sum_le_sum_abs _ Finset.univ + _ ≤ ∑ _p : Fin d, (Cprod * ‖A - B‖ * (k + 1 : ℝ) + Hbound * ‖A - B‖) := by + exact Finset.sum_le_sum fun p _ => hterm p + _ = Ctriple * ‖A - B‖ := by + simp [Ctriple, Finset.card_univ, nsmul_eq_mul] + ring + have hSymm : |SA i j - SB i j| ≤ ‖A - B‖ := by + simpa [SA, SB] using abs_symmPart_toMat_sub_le_norm A B i j + have hEntry : + (blockMatrixOfCoeff A.toMat).upperLeft i j - + (blockMatrixOfCoeff B.toMat).upperLeft i j = + (SA i j - SB i j) + ((HA * KA) i j - (HB * KB) i j) := by + simp [blockMatrixOfCoeff, SA, SB, HA, HB, KA, KB] + ring + calc + |(blockMatrixOfCoeff A.toMat).upperLeft i j - + (blockMatrixOfCoeff B.toMat).upperLeft i j| + = |(SA i j - SB i j) + ((HA * KA) i j - (HB * KB) i j)| := by + rw [hEntry] + _ ≤ |SA i j - SB i j| + |(HA * KA) i j - (HB * KB) i j| := + abs_add_le _ _ + _ ≤ ‖A - B‖ + Ctriple * ‖A - B‖ := add_le_add hSymm hTriple + _ = (1 + Ctriple) * ‖A - B‖ := by ring + _ = + (1 + + (d : ℝ) * + (((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * + (k + 1 : ℝ) + + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹))) * ‖A - B‖ := by + simp [Ctriple, Cprod, Cinv, Hbound, lam] + +theorem lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_upperLeft_quantitative + {d : ℕ} {k : ℕ} (i j : Fin d) : + LipschitzOnWith (quantitativeUpperLeftEntryLipschitzConstant d k) + (fun A : HilbertMat d => + toFullBlockMat (blockMatrixOfCoeff A.toMat) (Sum.inl i) (Sum.inl j)) + (quantitativeEllipticHilbertMatSet d k) := by + refine LipschitzOnWith.of_dist_le_mul ?_ + intro A hA B hB + have hC_nonneg : + 0 ≤ + 1 + + (d : ℝ) * + (((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * + (k + 1 : ℝ) + + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹)) := by positivity + have h := + abs_upperLeft_toMat_sub_le_norm_of_mem_quantitative hA hB i j + have hC_coe : + ((quantitativeUpperLeftEntryLipschitzConstant d k : NNReal) : ℝ) = + 1 + + (d : ℝ) * + (((d : ℝ) * + (((d : ℝ) ^ 2 * (((k + 1 : ℝ)⁻¹)⁻¹) ^ 2) * (k + 1 : ℝ) + + (((k + 1 : ℝ)⁻¹)⁻¹))) * + (k + 1 : ℝ) + + (d : ℝ) * (k + 1 : ℝ) * (((k + 1 : ℝ)⁻¹)⁻¹)) := by + rw [quantitativeUpperLeftEntryLipschitzConstant, Real.coe_toNNReal _ hC_nonneg] + rw [Real.dist_eq, dist_eq_norm, hC_coe] + simpa [toFullBlockMat] using h + +noncomputable def quantitativeFullBlockCoeffEntryLipschitzConstant + (d k : ℕ) (α β : BlockCoord d) : NNReal := + match α, β with + | Sum.inl _, Sum.inl _ => quantitativeUpperLeftEntryLipschitzConstant d k + | Sum.inl _, Sum.inr _ => quantitativeInvSkewProductEntryLipschitzConstant d k + | Sum.inr _, Sum.inl _ => quantitativeInvSkewProductEntryLipschitzConstant d k + | Sum.inr _, Sum.inr _ => quantitativeSymmPartInvEntryLipschitzConstant d k + +theorem lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_quantitative + {d : ℕ} {k : ℕ} (α β : BlockCoord d) : + LipschitzOnWith (quantitativeFullBlockCoeffEntryLipschitzConstant d k α β) + (fun A : HilbertMat d => toFullBlockMat (blockMatrixOfCoeff A.toMat) α β) + (quantitativeEllipticHilbertMatSet d k) := by + cases α with + | inl i => + cases β with + | inl j => + simpa [quantitativeFullBlockCoeffEntryLipschitzConstant] using + lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_upperLeft_quantitative + (k := k) i j + | inr j => + simpa [quantitativeFullBlockCoeffEntryLipschitzConstant] using + lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_upperRight_quantitative + (k := k) i j + | inr i => + cases β with + | inl j => + simpa [quantitativeFullBlockCoeffEntryLipschitzConstant] using + lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_lowerLeft_quantitative + (k := k) i j + | inr j => + simpa [quantitativeFullBlockCoeffEntryLipschitzConstant] using + lipschitzOnWith_fullBlockCoeffEntry_hilbertMat_lowerRight_quantitative + (k := k) i j + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Measurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Measurability.lean new file mode 100644 index 0000000000..73956041fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/Measurability.lean @@ -0,0 +1,815 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Geometry.Manifold.ContMDiff.NormedSpace +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! # Measurability -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Fixed-competitor energy measurability, first atoms + +## Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** the `PointwiseLocalSigma`-measurable scalar atoms (single-vector +dot products, single-coordinate matrix-vector products, etc.) used as the +local-σ-measurable building blocks for fixed-competitor energy observables. +First layer of the internal `HasMeasurableMuFamily` cleanup. + +**Consumed by (within `Internal/FixedCompetitorEnergyMeasurability/`):** +`LipschitzBounds.lean`, which lifts these atoms to Borel-measurable +fixed-coefficient maps; ultimately reaches the public +`Theorems/Mu.lean :: aemeasurable_Mu_cubeSet` via the chain +`Measurability → LipschitzBounds → Integrals → BlockEnergyAverage → +MuObservable → AEESliceAssembly/MuFamily`. + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem vecDot_single_matVecMul_single {d : ℕ} (A : Mat d) (i j : Fin d) : + vecDot (Pi.single i 1 : Vec d) (matVecMul A (Pi.single j 1)) = A i j := by + rw [vecDot, Finset.sum_eq_single i] + · rw [matVecMul, Finset.sum_eq_single j] + · simp + · intro k _ hkj + simp [Pi.single_eq_of_ne hkj] + · simp + · intro k _ hki + simp [Pi.single_eq_of_ne hki] + · simp + +theorem localTestObservable_single_single_eq_integral_entry {d : ℕ} + (i j : Fin d) (φ : Vec d → ℝ) : + localTestObservable (Pi.single j 1 : Vec d) (Pi.single i 1 : Vec d) φ = + fun a : CoeffField d => ∫ x, a x i j * φ x ∂MeasureTheory.volume := by + funext a + unfold localTestObservable + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + simp [vecDot_single_matVecMul_single] + +theorem measurable_entryTestObservable_localSigma {d : ℕ} {U : Set (Vec d)} + (i j : Fin d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable (CoeffField d) ℝ (PointwiseLocalSigma U) (borel ℝ) + (fun a : CoeffField d => ∫ x, a x i j * φ x ∂MeasureTheory.volume) := by + rw [← localTestObservable_single_single_eq_integral_entry i j φ] + exact measurable_localTestObservable_localSigma + (U := U) (Pi.single j 1 : Vec d) (Pi.single i 1 : Vec d) + hφ_cont hφ_compact hφ_support + +theorem setIntegral_entry_mul_eq_integral_of_tsupport_subset {d : ℕ} + {U : Set (Vec d)} (a : CoeffField d) (i j : Fin d) {φ : Vec d → ℝ} + (hφ_support : tsupport φ ⊆ U) : + ∫ x in U, a x i j * φ x ∂MeasureTheory.volume = + ∫ x, a x i j * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_support hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + +theorem measurable_entryTestObservable_setIntegral_localSigma {d : ℕ} {U : Set (Vec d)} + (i j : Fin d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable (CoeffField d) ℝ (PointwiseLocalSigma U) (borel ℝ) + (fun a : CoeffField d => ∫ x in U, a x i j * φ x ∂MeasureTheory.volume) := by + rw [show + (fun a : CoeffField d => ∫ x in U, a x i j * φ x ∂MeasureTheory.volume) = + fun a : CoeffField d => ∫ x, a x i j * φ x ∂MeasureTheory.volume by + funext a + exact setIntegral_entry_mul_eq_integral_of_tsupport_subset a i j hφ_support] + exact measurable_entryTestObservable_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support + +theorem measurable_inner_toScalarL2_matrixL2Entry_toMatrixL2_localMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) {φ : Vec d → ℝ} (hφL2 : MemScalarL2 U φ) + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.matrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toMatrixL2 a))) := by + rw [show + (fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.matrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toMatrixL2 a))) = + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume by + funext a + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.matrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toMatrixL2 a)) + = ∫ x in U, φ x * a.1 x i j ∂MeasureTheory.volume := + QuantitativeEllipticSlice.inner_toScalarL2_matrixL2Entry_toMatrixL2_eq_setIntegral + hφL2 i j a + _ = ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring] + exact (measurable_entryTestObservable_setIntegral_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support).comp + QuantitativeEllipticSlice.measurable_val_localMeasurableSpace + +theorem measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_localMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) {φ : Vec d → ℝ} (hφL2 : MemScalarL2 U φ) + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toHilbertMatrixL2 a))) := by + rw [show + (fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toHilbertMatrixL2 a))) = + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume by + funext a + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toHilbertMatrixL2 a)) + = ∫ x in U, φ x * a.1 x i j ∂MeasureTheory.volume := + QuantitativeEllipticSlice.inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_eq_setIntegral + hφL2 i j a + _ = ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring] + exact (measurable_entryTestObservable_setIntegral_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support).comp + QuantitativeEllipticSlice.measurable_val_localMeasurableSpace + +theorem measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_localMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {g : Vec d → HilbertMat d} + (hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) (hg_compact : HasCompactSupport g) + (hg_support : tsupport g ⊆ U) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => inner ℝ (hgL2.toLp g) (QuantitativeEllipticSlice.toHilbertMatrixL2 a)) := by + rw [show + (fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + inner ℝ (hgL2.toLp g) (QuantitativeEllipticSlice.toHilbertMatrixL2 a)) = + fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 + (QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp + (U := U) hgL2 i j)) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (QuantitativeEllipticSlice.toHilbertMatrixL2 a)) by + funext a + exact QuantitativeEllipticSlice.inner_hilbertMatrixL2_eq_sum_entry_inner hgL2 + (QuantitativeEllipticSlice.toHilbertMatrixL2 a)] + refine Finset.measurable_sum _ ?_ + intro i _ + refine Finset.measurable_sum _ ?_ + intro j _ + let gij : Vec d → ℝ := fun x => HilbertMat.entryL i j (g x) + have hgijL2 : MemScalarL2 U gij := by + simpa [gij] using + QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hgL2 i j + have hgij_cont : ContDiff ℝ (⊤ : ℕ∞) gij := by + simpa [gij, Function.comp_def] using + (ContDiff.continuousLinearMap_comp (HilbertMat.entryL i j) hg_cont) + have hgij_compact : HasCompactSupport gij := by + simpa [gij, Function.comp_def] using + hg_compact.comp_left (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) + have hgij_support : tsupport gij ⊆ U := by + have hsubset : tsupport gij ⊆ tsupport g := by + simpa [gij, Function.comp_def] using + (tsupport_comp_subset + (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) g) + exact hsubset.trans hg_support + simpa [gij, hgijL2] using + measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_localMeasurableSpace + (U := U) i j hgijL2 hgij_cont hgij_compact hgij_support + +theorem measurable_toHilbertMatrixL2_of_dense_smoothProbeSequence + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (hu : DenseRange u) + (hSmooth : ∀ n : ℕ, ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + u n = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2 := by + refine QuantitativeEllipticSlice.measurable_toHilbertMatrixL2_of_dense_inner u hu ?_ + intro n + rcases hSmooth n with ⟨g, hgL2, hEq, hg_cont, hg_compact, hg_support⟩ + rw [hEq] + exact measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_localMeasurableSpace + (U := U) hgL2 hg_cont hg_compact hg_support + +/-- Mathlib's global smooth compact-support density, converted to the exact `toLp` +representative shape used by the probability bookkeeping. + +The later local argument still has to push these probes inside `U`; this lemma isolates the +ambient density input from that boundary-cutoff step. -/ +theorem dense_smoothCompactHilbertMatrixL2 + {d : ℕ} {U : Set (Vec d)} : + Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g} := by + have : Fact (1 ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + have hDenseAE := + MeasureTheory.Lp.dense_hasCompactSupport_contDiff + (E := Vec d) (F := HilbertMat d) (μ := volumeMeasureOn U) + (p := (2 : ENNReal)) ENNReal.ofNat_ne_top + refine hDenseAE.mono ?_ + intro f hf + rcases hf with ⟨g, hfg, hg_compact, hg_cont⟩ + let hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U) := + (MeasureTheory.Lp.memLp f).ae_eq hfg + refine ⟨g, hgL2, ?_, by simpa using hg_cont, hg_compact⟩ + calc + f = (MeasureTheory.Lp.memLp f).toLp (fun x => f x) := + (MeasureTheory.Lp.toLp_coeFn f (MeasureTheory.Lp.memLp f)).symm + _ = hgL2.toLp g := + MeasureTheory.MemLp.toLp_congr (MeasureTheory.Lp.memLp f) hgL2 hfg + +private theorem hilbertMat_norm_sub_smul_le_norm {d : ℕ} + (c : ℝ) (h0 : 0 ≤ c) (h1 : c ≤ 1) (v : HilbertMat d) : + ‖v - c • v‖ ≤ ‖v‖ := by + calc + ‖v - c • v‖ = ‖(1 - c) • v‖ := by + congr 1 + simp [sub_smul] + _ = ‖(1 - c : ℝ)‖ * ‖v‖ := norm_smul (1 - c) v + _ ≤ 1 * ‖v‖ := by + gcongr + rw [Real.norm_eq_abs, abs_of_nonneg (by linarith)] + linarith + _ = ‖v‖ := by simp + +/-- Localize a smooth `L²` matrix field to an open finite-measure set without +changing it much in `L²`. This is the analytic cutoff step that turns +Mathlib's ambient compactly supported smooth density into the note-facing +`tsupport ⊆ U` probe class. -/ +theorem exists_contDiff_hilbertMatrixL2_tsupport_subset_eLpNorm_sub_le + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) + {g : Vec d → HilbertMat d} (hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) {ε : ℝ} (hε : 0 < ε) : + ∃ φ : Vec d → HilbertMat d, + ∃ _hφL2 : MeasureTheory.MemLp φ 2 (volumeMeasureOn U), + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) ≤ ENNReal.ofReal ε ∧ + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ tsupport φ ⊆ U := by + obtain ⟨δ, hδpos, hδ⟩ := + hgL2.eLpNorm_indicator_le (p := (2 : ENNReal)) (by norm_num) + ENNReal.ofNat_ne_top (ENNReal.ofReal_pos.mpr hε) + obtain ⟨K, hKU, hK_compact, hK_closed, hμK⟩ := + hUopen.measurableSet.exists_isCompact_isClosed_sdiff_lt (μ := MeasureTheory.volume) + hUfinite hδpos.ne' + rcases exists_compact_closed_between hK_compact hUopen hKU with + ⟨L, hL_compact, hL_closed, hKL, hLU⟩ + rcases exists_contMDiffMap_one_nhds_of_subset_interior (n := ⊤) + (I := 𝓘(ℝ, Vec d)) hK_closed hKL with + ⟨η, hη_one, hη_zero, hη_range⟩ + let φ : Vec d → HilbertMat d := fun x => η x • g x + have hη_cont : ContDiff ℝ (⊤ : ℕ∞) η := η.contMDiff.contDiff + have hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa only [φ] using! hη_cont.smul hg_cont + have hφ_support : Function.support φ ⊆ L := by + intro x hx + by_contra hxL + have hz : η x = 0 := hη_zero x hxL + exact hx (by simp [φ, hz]) + have hφ_compact : HasCompactSupport φ := + HasCompactSupport.of_support_subset_isCompact hL_compact hφ_support + have hφ_tsupport : tsupport φ ⊆ U := by + have hφ_tsupport_L : tsupport φ ⊆ L := by + simpa [tsupport] using closure_minimal hφ_support hL_closed + exact hφ_tsupport_L.trans hLU + have hφL2 : MeasureTheory.MemLp φ 2 (volumeMeasureOn U) := + hφ_cont.continuous.memLp_of_hasCompactSupport hφ_compact + refine ⟨φ, hφL2, ?_, hφ_cont, hφ_compact, hφ_tsupport⟩ + have hμsmall : volumeMeasureOn U (U \ K) ≤ δ := by + unfold volumeMeasureOn + rw [MeasureTheory.Measure.restrict_apply (hUopen.measurableSet.diff hK_closed.measurableSet)] + simpa [Set.inter_eq_self_of_subset_left (Set.sdiff_subset : U \ K ⊆ U)] using hμK.le + have hindicator := hδ (U \ K) (hUopen.measurableSet.diff hK_closed.measurableSet) hμsmall + calc + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) + ≤ MeasureTheory.eLpNorm ((U \ K).indicator g) 2 (volumeMeasureOn U) := by + refine MeasureTheory.eLpNorm_mono_ae (hgL2.sub hφL2).aestronglyMeasurable ?_ + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + simpa [volumeMeasureOn] using MeasureTheory.ae_restrict_mem hUopen.measurableSet + filter_upwards [hmem] with x hxU + by_cases hxK : x ∈ K + · have hφx : φ x = g x := by + have hηx : η x = 1 := hη_one.self_of_nhdsSet x hxK + simp [φ, hηx] + simp [hφx, hxK] + · have hxDiff : x ∈ U \ K := ⟨hxU, hxK⟩ + rw [Set.indicator_of_mem hxDiff] + have hη01 := hη_range x + exact hilbertMat_norm_sub_smul_le_norm (d := d) (η x) hη01.1 hη01.2 (g x) + _ ≤ ENNReal.ofReal ε := hindicator + +/-- Smooth compactly supported `HilbertMat` probes with support contained in an +open finite-measure set are dense in `L²(U; HilbertMat d)`. -/ +theorem dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) : + Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U} := by + have : Fact (1 ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + intro f + refine (mem_closure_iff_nhds_basis Metric.nhds_basis_closedBall).2 fun ε hε => ?_ + have hε2 : 0 < ε / 2 := by positivity + obtain ⟨g, hg_compact, hg_cont, hg_err⟩ := + MeasureTheory.MemLp.exist_eLpNorm_sub_le + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + ENNReal.ofNat_ne_top (by norm_num : (1 : ENNReal) ≤ 2) + (MeasureTheory.Lp.memLp f) hε2 + have hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U) := + hg_cont.continuous.memLp_of_hasCompactSupport hg_compact + obtain ⟨φ, hφL2, hφ_err, hφ_cont, hφ_compact, hφ_support⟩ := + exists_contDiff_hilbertMatrixL2_tsupport_subset_eLpNorm_sub_le + hUopen hUfinite hgL2 hg_cont hε2 + refine ⟨hφL2.toLp φ, ?_, ?_⟩ + · exact ⟨φ, hφL2, rfl, hφ_cont, hφ_compact, hφ_support⟩ + · have hnorm : + MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U) ≤ + ENNReal.ofReal ε := by + calc + MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U) + = MeasureTheory.eLpNorm ((fun x => f x) - φ) 2 (volumeMeasureOn U) := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [hφL2.coeFn_toLp] with x hx + simp [Pi.sub_apply, hx] + _ = MeasureTheory.eLpNorm (((fun x => f x) - g) + (g - φ)) 2 + (volumeMeasureOn U) := by + congr 1 + funext x + simp [Pi.sub_apply] + _ ≤ MeasureTheory.eLpNorm ((fun x => f x) - g) 2 (volumeMeasureOn U) + + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) := by + exact MeasureTheory.eLpNorm_add_le (by norm_num : (1 : ENNReal) ≤ 2) + _ ≤ ENNReal.ofReal (ε / 2) + ENNReal.ofReal (ε / 2) := add_le_add hg_err hφ_err + _ = ENNReal.ofReal ε := by + rw [← ENNReal.ofReal_add hε2.le hε2.le, add_halves] + rw [Metric.mem_closedBall, dist_comm, MeasureTheory.Lp.dist_def] + exact ENNReal.toReal_le_of_le_ofReal + (a := MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U)) + (b := ε) hε.le hnorm + +theorem exists_dense_smoothProbeSequence_of_dense_smoothProbeSet + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hDense : Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U}) : + ∃ u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U), + DenseRange u ∧ + ∀ n : ℕ, ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + u n = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let S : Set H := {f : H | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U} + have hDenseS : Dense S := by + simpa [S, H] using hDense + have hS_nonempty : S.Nonempty := by + rcases hDenseS.inter_open_nonempty Set.univ isOpen_univ + (Set.univ_nonempty : (Set.univ : Set H).Nonempty) with + ⟨x, _, hxS⟩ + exact ⟨x, hxS⟩ + have : Nonempty S := hS_nonempty.to_subtype + rcases TopologicalSpace.exists_dense_seq S with ⟨v, hv⟩ + refine ⟨fun n => (v n : H), ?_, ?_⟩ + · exact hDenseS.denseRange_val.comp hv continuous_subtype_val + · intro n + simpa [S, H] using (v n).2 + +theorem measurable_toHilbertMatrixL2_of_dense_smoothProbeSet + {d : ℕ} {U : Set (Vec d)} {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hDense : Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U}) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2 := by + rcases exists_dense_smoothProbeSequence_of_dense_smoothProbeSet (U := U) hDense with + ⟨u, hu, hSmooth⟩ + exact measurable_toHilbertMatrixL2_of_dense_smoothProbeSequence (U := U) u hu hSmooth + +/-- On an open finite-measure domain, the quantitative-slice coefficient field +as an `L²` Hilbert-matrix object is measurable for the local sigma algebra. -/ +theorem measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2 := by + exact measurable_toHilbertMatrixL2_of_dense_smoothProbeSet (U := U) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset hUopen hUfinite) + +theorem measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_essentialLocalMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) {φ : Vec d → ℝ} (hφL2 : MemScalarL2 U φ) + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + ℝ (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a))) := by + rw [show + (fun a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a))) = + fun a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} => + ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume by + funext a + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a)) + = ∫ x, φ x * EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a x i j + ∂volumeMeasureOn U := + QuantitativeEllipticSlice.inner_toScalarL2_hilbertMatrixL2Entry_eq_integral + hφL2 i j (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a) + _ = ∫ x, φ x * restrictCoeffField U a.1 x i j ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [EssentialQuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a] + with x hx + rw [hx] + _ = ∫ x in U, φ x * a.1 x i j ∂MeasureTheory.volume := by + unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem a.2.1] with x hxU + simp [restrictCoeffField, hxU] + _ = ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring] + exact (measurable_entryTestObservable_setIntegral_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support).comp + EssentialQuantitativeEllipticSlice.measurable_val_localMeasurableSpace + +theorem measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_essentialLocalMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {g : Vec d → HilbertMat d} + (hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) (hg_compact : HasCompactSupport g) + (hg_support : tsupport g ⊆ U) : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + ℝ (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => inner ℝ (hgL2.toLp g) + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a)) := by + rw [show + (fun a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} => + inner ℝ (hgL2.toLp g) (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a)) = + fun a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} => + ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 + (QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp + (U := U) hgL2 i j)) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a)) by + funext a + exact QuantitativeEllipticSlice.inner_hilbertMatrixL2_eq_sum_entry_inner hgL2 + (EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 a)] + refine Finset.measurable_sum _ ?_ + intro i _ + refine Finset.measurable_sum _ ?_ + intro j _ + let gij : Vec d → ℝ := fun x => HilbertMat.entryL i j (g x) + have hgijL2 : MemScalarL2 U gij := by + simpa [gij] using + QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hgL2 i j + have hgij_cont : ContDiff ℝ (⊤ : ℕ∞) gij := by + simpa [gij, Function.comp_def] using + (ContDiff.continuousLinearMap_comp (HilbertMat.entryL i j) hg_cont) + have hgij_compact : HasCompactSupport gij := by + simpa [gij, Function.comp_def] using + hg_compact.comp_left (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) + have hgij_support : tsupport gij ⊆ U := by + have hsubset : tsupport gij ⊆ tsupport g := by + simpa [gij, Function.comp_def] using + (tsupport_comp_subset + (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) g) + exact hsubset.trans hg_support + simpa [gij, hgijL2] using + measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_essentialLocalMeasurableSpace + (U := U) i j hgijL2 hgij_cont hgij_compact hgij_support + +theorem measurable_toHilbertMatrixL2_essential_of_dense_smoothProbeSequence + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (hu : DenseRange u) + (hSmooth : ∀ n : ℕ, ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + u n = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U) : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let : MeasurableSpace H := borel H + have : BorelSpace H := ⟨rfl⟩ + refine + @measurable_of_measurable_inner_denseRange_polish + {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} H + (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) _ _ _ _ _ + u hu + (F := EssentialQuantitativeEllipticSlice.toHilbertMatrixL2) ?_ + intro n + rcases hSmooth n with ⟨g, hgL2, hEq, hg_cont, hg_compact, hg_support⟩ + rw [hEq] + exact measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_essentialLocalMeasurableSpace + (U := U) hgL2 hg_cont hg_compact hg_support + +theorem measurable_toHilbertMatrixL2_essential_of_dense_smoothProbeSet + {d : ℕ} {U : Set (Vec d)} {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hDense : Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U}) : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 := by + rcases exists_dense_smoothProbeSequence_of_dense_smoothProbeSet (U := U) hDense with + ⟨u, hu, hSmooth⟩ + exact measurable_toHilbertMatrixL2_essential_of_dense_smoothProbeSequence (U := U) u hu hSmooth + +/-- On an open finite-measure domain, the essential quantitative-slice +coefficient field as an `L²` Hilbert-matrix object is measurable for the local +sigma algebra. -/ +theorem measurable_toHilbertMatrixL2_essential_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (EssentialQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 := by + exact measurable_toHilbertMatrixL2_essential_of_dense_smoothProbeSet (U := U) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset hUopen hUfinite) + +/-- Smooth probes supported in the open core of a triadic cube are dense for the +half-open cube, because the two restricted volume measures agree. -/ +theorem dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset_cubeSet + {d : ℕ} (Q : TriadicCube d) : + Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q)) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn (cubeSet Q)), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ cubeSet Q} := by + have hMeasure : volumeMeasureOn (cubeSet Q) = volumeMeasureOn (openCubeSet Q) := by + simpa [volumeMeasureOn] using volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + rw [hMeasure] + refine + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset + (d := d) (U := openCubeSet Q) (isOpen_openCubeSet Q) + (ne_of_lt (volume_openCubeSet_lt_top Q))).mono ?_ + intro f hf + rcases hf with ⟨g, hgL2, hfg, hg_cont, hg_compact, hg_support⟩ + exact + ⟨g, hgL2, hfg, hg_cont, hg_compact, + hg_support.trans (openCubeSet_subset_cubeSet Q)⟩ + +/-- On a half-open triadic cube, the essential quantitative-slice coefficient +field as an `L²` Hilbert-matrix object is measurable for the local sigma +algebra. -/ +theorem measurable_toHilbertMatrixL2_essentialQuantitativeEllipticSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice (cubeSet Q) k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q))) + (EssentialQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel _) + EssentialQuantitativeEllipticSlice.toHilbertMatrixL2 := + measurable_toHilbertMatrixL2_essential_of_dense_smoothProbeSet (U := cubeSet Q) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset_cubeSet Q) + +/-- Smooth-probe coordinate pairings of the AEE `L²` coefficient realization +are local-test measurable. -/ +theorem measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_aeeLocalMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) {φ : Vec d → ℝ} (hφL2 : MemScalarL2 U φ) + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a))) := by + rw [show + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a))) = + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume by + funext a + calc + inner ℝ (toScalarL2 hφL2) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a)) + = ∫ x, φ x * AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a x i j + ∂volumeMeasureOn U := + QuantitativeEllipticSlice.inner_toScalarL2_hilbertMatrixL2Entry_eq_integral + hφL2 i j (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a) + _ = ∫ x, φ x * restrictCoeffField U a.1 x i j ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [AEEQuantitativeEllipticSlice.coeFn_toHilbertMatrixL2 a] + with x hx + rw [hx] + _ = ∫ x in U, φ x * a.1 x i j ∂MeasureTheory.volume := by + unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem a.2.measurableSet] with x hxU + simp [restrictCoeffField, hxU] + _ = ∫ x in U, a.1 x i j * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring] + exact (measurable_entryTestObservable_setIntegral_localSigma + (U := U) i j hφ_cont hφ_compact hφ_support).comp + AEEQuantitativeEllipticSlice.measurable_val_localMeasurableSpace + +theorem measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_aeeLocalMeasurableSpace + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {g : Vec d → HilbertMat d} + (hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) (hg_compact : HasCompactSupport g) + (hg_support : tsupport g ⊆ U) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + ℝ (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => inner ℝ (hgL2.toLp g) + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a)) := by + rw [show + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + inner ℝ (hgL2.toLp g) (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a)) = + fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 + (QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp + (U := U) hgL2 i j)) + (QuantitativeEllipticSlice.hilbertMatrixL2Entry (U := U) i j + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a)) by + funext a + exact QuantitativeEllipticSlice.inner_hilbertMatrixL2_eq_sum_entry_inner hgL2 + (AEEQuantitativeEllipticSlice.toHilbertMatrixL2 a)] + refine Finset.measurable_sum _ ?_ + intro i _ + refine Finset.measurable_sum _ ?_ + intro j _ + let gij : Vec d → ℝ := fun x => HilbertMat.entryL i j (g x) + have hgijL2 : MemScalarL2 U gij := by + simpa [gij] using + QuantitativeEllipticSlice.memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hgL2 i j + have hgij_cont : ContDiff ℝ (⊤ : ℕ∞) gij := by + simpa [gij, Function.comp_def] using + (ContDiff.continuousLinearMap_comp (HilbertMat.entryL i j) hg_cont) + have hgij_compact : HasCompactSupport gij := by + simpa [gij, Function.comp_def] using + hg_compact.comp_left (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) + have hgij_support : tsupport gij ⊆ U := by + have hsubset : tsupport gij ⊆ tsupport g := by + simpa [gij, Function.comp_def] using + (tsupport_comp_subset + (by simp : HilbertMat.entryL i j (0 : HilbertMat d) = 0) g) + exact hsubset.trans hg_support + simpa [gij, hgijL2] using + measurable_inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_aeeLocalMeasurableSpace + (U := U) i j hgijL2 hgij_cont hgij_compact hgij_support + +theorem measurable_toHilbertMatrixL2_aee_of_dense_smoothProbeSequence + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (hu : DenseRange u) + (hSmooth : ∀ n : ℕ, ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + u n = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let : MeasurableSpace H := borel H + have : BorelSpace H := ⟨rfl⟩ + refine + @measurable_of_measurable_inner_denseRange_polish + {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} H + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) _ _ _ _ _ + u hu + (F := AEEQuantitativeEllipticSlice.toHilbertMatrixL2) ?_ + intro n + rcases hSmooth n with ⟨g, hgL2, hEq, hg_cont, hg_compact, hg_support⟩ + rw [hEq] + exact measurable_inner_hilbertMatrixSmoothProbe_toHilbertMatrixL2_aeeLocalMeasurableSpace + (U := U) hgL2 hg_cont hg_compact hg_support + +theorem measurable_toHilbertMatrixL2_aee_of_dense_smoothProbeSet + {d : ℕ} {U : Set (Vec d)} {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hDense : Dense {f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) | + ∃ g : Vec d → HilbertMat d, + ∃ hgL2 : MeasureTheory.MemLp g 2 (volumeMeasureOn U), + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U}) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 := by + rcases exists_dense_smoothProbeSequence_of_dense_smoothProbeSet (U := U) hDense with + ⟨u, hu, hSmooth⟩ + exact measurable_toHilbertMatrixL2_aee_of_dense_smoothProbeSequence (U := U) u hu hSmooth + +/-- On an open finite-measure domain, the AEE quantitative-slice coefficient +field as an `L²` Hilbert-matrix object is measurable for the local sigma +algebra. -/ +theorem measurable_toHilbertMatrixL2_aee_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (AEEQuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 := by + exact measurable_toHilbertMatrixL2_aee_of_dense_smoothProbeSet (U := U) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset hUopen hUfinite) + +/-- On a half-open triadic cube, the AEE quantitative-slice coefficient field +as an `L²` Hilbert-matrix object is measurable for the local sigma algebra. -/ +theorem measurable_toHilbertMatrixL2_aeeQuantitativeEllipticSlice_cubeSet + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn (cubeSet Q))) + (AEEQuantitativeEllipticSlice.localMeasurableSpace (cubeSet Q) k) (borel _) + AEEQuantitativeEllipticSlice.toHilbertMatrixL2 := + measurable_toHilbertMatrixL2_aee_of_dense_smoothProbeSet (U := cubeSet Q) + (dense_smoothCompactSupportHilbertMatrixL2_tsupport_subset_cubeSet Q) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/MuObservable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/MuObservable.lean new file mode 100644 index 0000000000..01a18cf4d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/FixedCompetitorEnergyMeasurability/MuObservable.lean @@ -0,0 +1,676 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.FixedCompetitorEnergyMeasurability.BlockEnergyAverage +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Geometry.Manifold.ContMDiff.NormedSpace +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! # Mu Observable -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal +open scoped Topology +open Filter + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** measurability of the `Mu` candidate viewed as a +functional of the coefficient field, composed through the measurable +block-energy-average machinery of `BlockEnergyAverage.lean`. This is the +top of the `FixedCompetitorEnergyMeasurability/` chain — every preceding +file in this directory feeds into the proofs here. + +**Consumed by:** the umbrella module +`FixedCompetitorEnergyMeasurability.lean`, then +`Internal/AEESliceAssembly/{BlockEnergyAverage, MuFamily}.lean`, then +`Theorems/Mu.lean :: aemeasurable_Mu_cubeSet` (and the AEE-slice variant +`aemeasurable_Mu_cubeSet_of_measurable_aeeQuantitativeSlice`). + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (A : Ω → CoeffField d) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : ∀ ω : Ω, MuOperatorSystemData U (A ω)) + (mu_eq_muCandidate : + ∀ ω : Ω, ∀ P : BlockVec d, + Mu U P (A ω) = + ((system ω).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) + (hMeas : + ∀ n : ℕ, + Measurable fun ω : Ω => + blockEnergyAverage U (A ω) + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n))) : + Measurable fun ω : Ω => Mu U P (A ω) := by + rw [show + (fun ω : Ω => Mu U P (A ω)) = + fun ω : Ω => + ⨅ n : ℕ, + blockEnergyAverage U (A ω) + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) by + funext ω + exact R.Mu_eq_iInf_blockEnergyAverage_affineField_denseSeq + (system ω) (mu_eq_muCandidate ω) P] + exact Measurable.iInf hMeas + +theorem measurable_Mu_of_measurable_blockEnergyAverage_affineField_denseSeq + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : ∀ a : CoeffField d, MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ a : CoeffField d, ∀ P : BlockVec d, + Mu U P a = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) + (hMeas : + ∀ n : ℕ, + Measurable fun a : CoeffField d => + blockEnergyAverage U a + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n))) : + Measurable fun a : CoeffField d => Mu U P a := by + exact measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq + (A := fun a : CoeffField d => a) R system mu_eq_muCandidate P hMeas + +theorem measurable_Mu_of_measurable_weightedFullBlockCoeffEntryIntegrals_denseSeq + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : ∀ a : CoeffField d, MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ a : CoeffField d, ∀ P : BlockVec d, + Mu U P a = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) + (hInt : + ∀ a : CoeffField d, ∀ n : ℕ, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β x * + toFullBlockMat (blockCoeffField a x) α β) + U) + (hMeas : + ∀ n : ℕ, ∀ α β : BlockCoord d, + Measurable fun a : CoeffField d => + ∫ x in U, + blockEnergyEntryWeight + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β x * + toFullBlockMat (blockCoeffField a x) α β ∂MeasureTheory.volume) : + Measurable fun a : CoeffField d => Mu U P a := by + refine measurable_Mu_of_measurable_blockEnergyAverage_affineField_denseSeq + (U := U) R system mu_eq_muCandidate P ?_ + intro n + exact measurable_blockEnergyAverage_of_measurable_weightedFullBlockCoeffEntryIntegrals + (U := U) + (X := R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + (fun a α β => hInt a n α β) + (fun α β => hMeas n α β) + +theorem measurable_Mu_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals_denseSeq + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (A : Ω → CoeffField d) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : ∀ ω : Ω, MuOperatorSystemData U (A ω)) + (mu_eq_muCandidate : + ∀ ω : Ω, ∀ P : BlockVec d, + Mu U P (A ω) = + ((system ω).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) + (hInt : + ∀ ω : Ω, ∀ n : ℕ, ∀ α β : BlockCoord d, + MeasureTheory.IntegrableOn + (fun x => + blockEnergyEntryWeight + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β) + U) + (hMeas : + ∀ n : ℕ, ∀ α β : BlockCoord d, + Measurable fun ω : Ω => + ∫ x in U, + blockEnergyEntryWeight + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β x * + toFullBlockMat (blockCoeffField (A ω) x) α β ∂MeasureTheory.volume) : + Measurable fun ω : Ω => Mu U P (A ω) := by + refine measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq + (A := A) R system mu_eq_muCandidate P ?_ + intro n + exact measurable_blockEnergyAverage_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals + (A := A) + (X := R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + (fun ω α β => hInt ω n α β) + (fun α β => hMeas n α β) + +theorem measurable_Mu_quantitativeSlice_of_measurable_weightedFullBlockCoeffEntryIntegrals_denseSeq + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) + (hMeas : + ∀ n : ℕ, ∀ α β : BlockCoord d, + Measurable fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + ∫ x in U, + blockEnergyEntryWeight + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β x * + toFullBlockMat (blockCoeffField a.1 x) α β ∂MeasureTheory.volume) : + Measurable fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + Mu U P a.1 := by + refine measurable_Mu_comp_of_measurable_weightedFullBlockCoeffEntryIntegrals_denseSeq + (A := fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => a.1) + R system mu_eq_muCandidate P ?_ hMeas + intro a n α β + exact a.2.integrableOn_weightedFullBlockCoeffEntry_of_memBlockL2 + (R.affineField_memBlockL2 P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) α β + +/-- Note-facing quantitative-slice measurability of `Mu`: once the slice has +the measurable `L²` coefficient realization, fixed competitors are measurable +by the `L¹` entry theorem and `Mu` follows from the dense `iInf` formula. -/ +theorem measurable_Mu_quantitativeSlice + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => Mu U P a.1) := by + let : MeasurableSpace {a : CoeffField d // QuantitativeEllipticSlice U k a} := + QuantitativeEllipticSlice.localMeasurableSpace U k + refine measurable_Mu_comp_of_measurable_blockEnergyAverage_affineField_denseSeq + (A := fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => a.1) + R system mu_eq_muCandidate P ?_ + intro n + exact measurable_blockEnergyAverage_quantitativeSlice hToL2 + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + (R.affineField_memBlockL2 P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + +/-- Open finite-measure wrapper for fixed-competitor energy measurability on a +quantitative elliptic slice. -/ +theorem measurable_blockEnergyAverage_quantitativeSlice_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (X : BlockState d) (hX : MemBlockL2 U X.eval) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => blockEnergyAverage U a.1 X) := by + exact measurable_blockEnergyAverage_quantitativeSlice + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) X hX + +/-- Open finite-measure wrapper for note-facing quantitative-slice +measurability of `Mu`. -/ +theorem measurable_Mu_quantitativeSlice_of_isOpen_volume_ne_top + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => Mu U P a.1) := by + exact measurable_Mu_quantitativeSlice + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + R system mu_eq_muCandidate P + +/-- Composition form of quantitative-slice `Mu` measurability for +sample-space-valued coefficient fields landing in one slice. -/ +theorem measurable_Mu_comp_quantitativeSlice + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + let As : Ω → {a : CoeffField d // QuantitativeEllipticSlice U k a} := + fun ω => ⟨A ω, hSlice ω⟩ + have hAs : + @Measurable Ω {a : CoeffField d // QuantitativeEllipticSlice U k a} + _ (QuantitativeEllipticSlice.localMeasurableSpace U k) As := + measurable_subtype_mk_quantitativeSlice_of_isLocalSigmaMeasurableOn A hA hSlice + have hMu : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + ℝ (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel ℝ) + (fun a => Mu U P a.1) := + measurable_Mu_quantitativeSlice hToL2 R system mu_eq_muCandidate P + change Measurable ((fun a : {a : CoeffField d // QuantitativeEllipticSlice U k a} => + Mu U P a.1) ∘ As) + exact hMu.comp hAs + +/-- Open finite-measure wrapper for the fixed-slice composition theorem for +`Mu`. -/ +theorem measurable_Mu_comp_quantitativeSlice_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSlice : ∀ ω : Ω, QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, ∀ P : BlockVec d, + Mu U P a.1 = + ((system a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + exact measurable_Mu_comp_quantitativeSlice + (measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSlice R system mu_eq_muCandidate P + +/-- Countable-slice assembly for `Mu`. On each measurable piece `t k`, the +sample-space coefficient field is only required to land in the corresponding +quantitative ellipticity slice; the countable cover is glued by +`Set.liftCover`. -/ +theorem measurable_Mu_comp_countable_quantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover : ⋃ k : ℕ, t k = Set.univ) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + classical + let f : (k : ℕ) → t k → ℝ := + fun k ω => Mu U P (A ω.1) + have hfm : ∀ k : ℕ, Measurable (f k) := by + intro k + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : t k => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp] using! hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : t k, QuantitativeEllipticSlice U k ((fun ω : t k => A ω.1) ω) := by + intro ω + exact hSlice k ω.1 ω.2 + exact measurable_Mu_comp_quantitativeSlice + (hToL2 k) (fun ω : t k => A ω.1) hA_sub hSlice_sub + R (system k) (mu_eq_muCandidate k) P + have hagree : + ∀ (i j : ℕ) (ω : Ω) (hωi : ω ∈ t i) (hωj : ω ∈ t j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + rfl + have hLift : Measurable (Set.liftCover t f hagree hcover) := + measurable_liftCover t ht f hfm hagree hcover + have hEq : Set.liftCover t f hagree hcover = + (fun ω => Mu U P (A ω)) := by + funext ω + obtain ⟨k, hωk⟩ : ∃ k : ℕ, ω ∈ t k := by + have hω_cover : ω ∈ ⋃ k : ℕ, t k := by + rw [hcover] + exact Set.mem_univ ω + exact Set.mem_iUnion.mp hω_cover + rw [Set.liftCover_of_mem (S := t) (f := f) (hf := hagree) (hS := hcover) hωk] + simpa [hEq] using hLift + +/-- Almost-everywhere countable-slice assembly for `Mu`. The theorem adds a +measurable null fallback piece to an AE countable cover and then glues the +slice-wise measurable realizations. -/ +theorem aemeasurable_Mu_comp_countable_quantitativeSlice_cover + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (t : ℕ → Set Ω) (ht : ∀ k : ℕ, MeasurableSet (t k)) + (hcover_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k) + (hSlice : ∀ k : ℕ, ∀ ω : Ω, ω ∈ t k → QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + classical + let S : Set Ω := ⋃ k : ℕ, t k + let cover : Option ℕ → Set Ω + | none => Sᶜ + | some k => t k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, ω => Mu U P (A ω.1) + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => + exact (MeasurableSet.iUnion ht).compl + | some k => + exact ht k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => + exact measurable_const + | some k => + have hA_sub : IsPointwiseLocalSigmaMeasurableOn (fun ω : cover (some k) => A ω.1) U := by + simpa [IsPointwiseLocalSigmaMeasurableOn, Function.comp, cover] using! + hA.comp measurable_subtype_coe + have hSlice_sub : + ∀ ω : cover (some k), + QuantitativeEllipticSlice U k ((fun ω : cover (some k) => A ω.1) ω) := by + intro ω + have hω : ω.1 ∈ t k := by + simp [cover] at ω + exact ω.2 + exact hSlice k ω.1 hω + simpa [f, cover] using + measurable_Mu_comp_quantitativeSlice + (hToL2 k) (fun ω : cover (some k) => A ω.1) hA_sub hSlice_sub + R (system k) (mu_eq_muCandidate k) P + have hagree : + ∀ (i j : Option ℕ) (ω : Ω) (hωi : ω ∈ cover i) (hωj : ω ∈ cover j), + f i ⟨ω, hωi⟩ = f j ⟨ω, hωj⟩ := by + intro i j ω hωi hωj + cases i with + | none => + cases j with + | none => + rfl + | some k => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωj⟩ + have hω_notS : ω ∉ S := by + simpa [cover] using hωi + exact hω_notS hωS + | some k => + cases j with + | none => + exfalso + have hωS : ω ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using hωi⟩ + have hω_notS : ω ∉ S := by + simpa [cover] using hωj + exact hω_notS hωS + | some l => + rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + by_cases hωS : ω ∈ S + · obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hωk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using hωS⟩ + have hLift : Measurable (Set.liftCover cover f hagree hcover) := + measurable_liftCover cover hcover_meas f hfm hagree hcover + have hEq : + (fun ω => Mu U P (A ω)) =ᵐ[μ] Set.liftCover cover f hagree hcover := by + filter_upwards [hcover_ae] with ω hωS + obtain ⟨k, hωk⟩ := Set.mem_iUnion.mp hωS + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hωk)] + exact hLift.aemeasurable.congr hEq.symm + +/-- If the raw quantitative-slice membership sets are measurable and cover the +sample space, then the countable-slice `Mu` assembly theorem applies directly +to those sets. -/ +theorem measurable_Mu_comp_quantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover : ∀ ω : Ω, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + Measurable fun ω => Mu U P (A ω) := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | QuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set : ⋃ k : ℕ, t k = Set.univ := by + ext ω + constructor + · intro _hω + exact Set.mem_univ ω + · intro _hω + exact Set.mem_iUnion.mpr (hcover ω) + exact measurable_Mu_comp_countable_quantitativeSlice_cover + hToL2 A hA t ht hcover_set (fun k ω hω => hω) + R system mu_eq_muCandidate P + +/-- AE version of `measurable_Mu_comp_quantitativeSlice_sets`. This is the +selection/assembly handoff from almost-sure slice existence, conditional on +measurability of the raw slice-membership sets. -/ +theorem aemeasurable_Mu_comp_quantitativeSlice_sets + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hToL2 : + ∀ k : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (QuantitativeEllipticSlice.localMeasurableSpace U k) (borel _) + QuantitativeEllipticSlice.toHilbertMatrixL2) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + classical + let t : ℕ → Set Ω := fun k => {ω : Ω | QuantitativeEllipticSlice U k (A ω)} + have ht : ∀ k : ℕ, MeasurableSet (t k) := hSliceMeas + have hcover_set_ae : ∀ᵐ ω ∂μ, ω ∈ ⋃ k : ℕ, t k := by + filter_upwards [hcover_ae] with ω hω + exact Set.mem_iUnion.mpr hω + exact aemeasurable_Mu_comp_countable_quantitativeSlice_cover + μ hToL2 A hA t ht hcover_set_ae (fun k ω hω => hω) + R system mu_eq_muCandidate P + +/-- Open finite-measure wrapper for the AE `Mu` slice-set assembly theorem. -/ +theorem aemeasurable_Mu_comp_quantitativeSlice_sets_of_isOpen_volume_ne_top + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (A : Ω → CoeffField d) (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) + (hcover_ae : ∀ᵐ ω ∂μ, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + MuOperatorSystemData U a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, ∀ a : {a : CoeffField d // QuantitativeEllipticSlice U k a}, + ∀ P : BlockVec d, + Mu U P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu U P (A ω)) μ := by + exact aemeasurable_Mu_comp_quantitativeSlice_sets μ + (fun _k => measurable_toHilbertMatrixL2_of_isOpen_volume_ne_top hUopen hUfinite) + A hA hSliceMeas hcover_ae R system mu_eq_muCandidate P + +/-- Origin-open-cube handoff from almost-sure local uniform ellipticity to +`Mu` `AEMeasurable`, conditional on measurability of the raw quantitative-slice +membership sets. -/ +theorem aemeasurable_Mu_comp_openCubeSet_originCube_of_ae_locallyUniformlyElliptic + {Ω : Type*} [MeasurableSpace Ω] (μ : MeasureTheory.Measure Ω) + {d : ℕ} (n : ℤ) + (A : Ω → CoeffField d) + (hA : IsPointwiseLocalSigmaMeasurableOn A (openCubeSet (originCube d n))) + (hloc : ∀ᵐ ω ∂μ, IsLocallyUniformlyElliptic (A ω)) + (hSliceMeas : + ∀ k : ℕ, + MeasurableSet + {ω : Ω | QuantitativeEllipticSlice (openCubeSet (originCube d n)) k (A ω)}) + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : + ∀ k : ℕ, + ∀ a : + {a : CoeffField d // + QuantitativeEllipticSlice (openCubeSet (originCube d n)) k a}, + MuOperatorSystemData (openCubeSet (originCube d n)) a.1) + (mu_eq_muCandidate : + ∀ k : ℕ, + ∀ a : + {a : CoeffField d // + QuantitativeEllipticSlice (openCubeSet (originCube d n)) k a}, + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a.1 = + (((system k a).toMuOperatorRealization.toMuHilbertRealization + R.toMuCorrectionSpaceData).muCandidate P)) + (P : BlockVec d) : + AEMeasurable (fun ω => Mu (openCubeSet (originCube d n)) P (A ω)) μ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d n))) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + have hcover_ae : + ∀ᵐ ω ∂μ, + ∃ k : ℕ, QuantitativeEllipticSlice (openCubeSet (originCube d n)) k (A ω) := + hloc.mono fun _ω hω => hω.exists_quantitativeEllipticSlice_openCubeSet_originCube n + exact aemeasurable_Mu_comp_quantitativeSlice_sets_of_isOpen_volume_ne_top + μ (isOpen_openCubeSet (originCube d n)) + (ne_of_lt (volume_openCubeSet_lt_top (originCube d n))) + A hA hSliceMeas hcover_ae R system mu_eq_muCandidate P + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/PartitionAverageMomentHelpers.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/PartitionAverageMomentHelpers.lean new file mode 100644 index 0000000000..414c9469a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/PartitionAverageMomentHelpers.lean @@ -0,0 +1,522 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Corollaries + +/-! # Partition Average Moment Helpers -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Audit tag (Ch4 rebuild contract `CH04_REBUILD_SURFACE_2026-05-16.md`) + +**Internal claim:** `L^p` / `eLpNorm` and root-comparison helper lemmas +that transport integrability and `|·|^p` integrals along `Measure.map` +equalities and through a.e. translations. These are the algebraic +substrate underneath the centered descendant-average finite-moment bounds. + +**Consumed by:** `Theorems/PartitionAverageMoments/Rosenthal.lean` +(`integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_restrictionUnitRangeDependentLaw` +and the public Rosenthal-type endpoints it feeds). + +If the single-claim summary above grows into three or more distinct +claims, split or refactor per the rebuild contract. +-/ + +theorem integrable_abs_pow_of_map_eq_map + {d : ℕ} {P : MeasureTheory.Measure (RegCoeffField d)} + {f g : RegCoeffField d → ℝ} {p : ℕ} + (hf : Measurable f) (hg : Measurable g) + (hmap : MeasureTheory.Measure.map f P = MeasureTheory.Measure.map g P) + (hg_int : MeasureTheory.Integrable (fun a => |g a| ^ p) P) : + MeasureTheory.Integrable (fun a => |f a| ^ p) P := by + let φ : ℝ → ℝ := fun x => |x| ^ p + have hφ_aesm_f : + MeasureTheory.AEStronglyMeasurable φ (MeasureTheory.Measure.map f P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_aesm_g : + MeasureTheory.AEStronglyMeasurable φ (MeasureTheory.Measure.map g P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_int_g : MeasureTheory.Integrable φ (MeasureTheory.Measure.map g P) := by + exact (MeasureTheory.integrable_map_measure hφ_aesm_g hg.aemeasurable).mpr + (by simpa [φ] using! hg_int) + have hφ_int_f : MeasureTheory.Integrable φ (MeasureTheory.Measure.map f P) := by + simpa [hmap] using! hφ_int_g + exact (MeasureTheory.integrable_map_measure hφ_aesm_f hf.aemeasurable).mp + (by simpa [φ] using! hφ_int_f) + +/-- A.e.-measurable version of `integrable_abs_pow_of_map_eq_map`. -/ +theorem integrable_abs_pow_of_map_eq_map_aemeasurable + {d : ℕ} {P : MeasureTheory.Measure (RegCoeffField d)} + {f g : RegCoeffField d → ℝ} {p : ℕ} + (hf : AEMeasurable f P) (hg : AEMeasurable g P) + (hmap : MeasureTheory.Measure.map f P = MeasureTheory.Measure.map g P) + (hg_int : MeasureTheory.Integrable (fun a => |g a| ^ p) P) : + MeasureTheory.Integrable (fun a => |f a| ^ p) P := by + let φ : ℝ → ℝ := fun x => |x| ^ p + have hφ_aesm_f : + MeasureTheory.AEStronglyMeasurable φ (MeasureTheory.Measure.map f P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_aesm_g : + MeasureTheory.AEStronglyMeasurable φ (MeasureTheory.Measure.map g P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_int_g : MeasureTheory.Integrable φ (MeasureTheory.Measure.map g P) := by + exact (MeasureTheory.integrable_map_measure hφ_aesm_g hg).mpr + (by simpa [φ] using! hg_int) + have hφ_int_f : MeasureTheory.Integrable φ (MeasureTheory.Measure.map f P) := by + simpa [hmap] using! hφ_int_g + exact (MeasureTheory.integrable_map_measure hφ_aesm_f hf).mp + (by simpa [φ] using! hφ_int_f) + +theorem integral_abs_pow_eq_of_map_eq_map + {d : ℕ} {P : MeasureTheory.Measure (RegCoeffField d)} + {f g : RegCoeffField d → ℝ} {p : ℕ} + (hf : Measurable f) (hg : Measurable g) + (hmap : MeasureTheory.Measure.map f P = MeasureTheory.Measure.map g P) : + ∫ a, |f a| ^ p ∂P = ∫ a, |g a| ^ p ∂P := by + have hφ_aesm_f : + MeasureTheory.AEStronglyMeasurable (fun x : ℝ => |x| ^ p) + (MeasureTheory.Measure.map f P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_aesm_g : + MeasureTheory.AEStronglyMeasurable (fun x : ℝ => |x| ^ p) + (MeasureTheory.Measure.map g P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + calc + ∫ a, |f a| ^ p ∂P = ∫ x, |x| ^ p ∂MeasureTheory.Measure.map f P := by + symm + rw [MeasureTheory.integral_map hf.aemeasurable hφ_aesm_f] + _ = ∫ x, |x| ^ p ∂MeasureTheory.Measure.map g P := by + rw [hmap] + _ = ∫ a, |g a| ^ p ∂P := by + rw [MeasureTheory.integral_map hg.aemeasurable hφ_aesm_g] + +/-- A.e.-measurable version of `integral_abs_pow_eq_of_map_eq_map`. -/ +theorem integral_abs_pow_eq_of_map_eq_map_aemeasurable + {d : ℕ} {P : MeasureTheory.Measure (RegCoeffField d)} + {f g : RegCoeffField d → ℝ} {p : ℕ} + (hf : AEMeasurable f P) (hg : AEMeasurable g P) + (hmap : MeasureTheory.Measure.map f P = MeasureTheory.Measure.map g P) : + ∫ a, |f a| ^ p ∂P = ∫ a, |g a| ^ p ∂P := by + have hφ_aesm_f : + MeasureTheory.AEStronglyMeasurable (fun x : ℝ => |x| ^ p) + (MeasureTheory.Measure.map f P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + have hφ_aesm_g : + MeasureTheory.AEStronglyMeasurable (fun x : ℝ => |x| ^ p) + (MeasureTheory.Measure.map g P) := by + exact (continuous_abs.measurable.pow_const p).aemeasurable.aestronglyMeasurable + calc + ∫ a, |f a| ^ p ∂P = ∫ x, |x| ^ p ∂MeasureTheory.Measure.map f P := by + symm + rw [MeasureTheory.integral_map hf hφ_aesm_f] + _ = ∫ x, |x| ^ p ∂MeasureTheory.Measure.map g P := by + rw [hmap] + _ = ∫ a, |g a| ^ p ∂P := by + rw [MeasureTheory.integral_map hg hφ_aesm_g] + +theorem integral_abs_pow_rpow_inv_le_iff_of_map_eq_map + {d : ℕ} {P : MeasureTheory.Measure (RegCoeffField d)} + {f g : RegCoeffField d → ℝ} {p : ℕ} {K : ℝ} + (hf : Measurable f) (hg : Measurable g) + (hmap : MeasureTheory.Measure.map f P = MeasureTheory.Measure.map g P) : + ((∫ a, |f a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K ↔ + (∫ a, |g a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K) := by + rw [integral_abs_pow_eq_of_map_eq_map hf hg hmap] + +theorem toReal_eLpNorm_eq_integral_abs_pow_rpow_inv + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} {f : Ω → ℝ} {p : ℕ} + (hp : 1 ≤ p) (hf : Measurable f) + (hLp_int : MeasureTheory.Integrable (fun ω => |f ω| ^ p) μ) : + ENNReal.toReal (MeasureTheory.eLpNorm f p μ) = + (∫ ω, |f ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + have h_memLp : MeasureTheory.MemLp f (p : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hf.aestronglyMeasurable (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have hnonneg : + 0 ≤ (∫ a, ‖f a‖ ^ (p : ENNReal).toReal ∂μ) ^ (p : ENNReal).toReal⁻¹ := by + positivity + rw [h_memLp.eLpNorm_eq_integral_rpow_norm + (by exact_mod_cast hp_nat_ne_zero) (by simp), + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, one_div] + +/-- A.e.-measurable version of +`toReal_eLpNorm_eq_integral_abs_pow_rpow_inv`. -/ +theorem toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} {f : Ω → ℝ} {p : ℕ} + (hp : 1 ≤ p) (hf : AEMeasurable f μ) + (hLp_int : MeasureTheory.Integrable (fun ω => |f ω| ^ p) μ) : + ENNReal.toReal (MeasureTheory.eLpNorm f p μ) = + (∫ ω, |f ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + have h_memLp : MeasureTheory.MemLp f (p : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hf.aestronglyMeasurable (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have hnonneg : + 0 ≤ (∫ a, ‖f a‖ ^ (p : ENNReal).toReal ∂μ) ^ (p : ENNReal).toReal⁻¹ := by + positivity + rw [h_memLp.eLpNorm_eq_integral_rpow_norm + (by exact_mod_cast hp_nat_ne_zero) (by simp), + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, one_div] + +theorem integral_abs_finsetSum_pow_rpow_inv_le_sum + {Ω ι : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} + {f : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + (h_meas : ∀ i ∈ s, Measurable (f i)) + (hLp_int : ∀ i ∈ s, MeasureTheory.Integrable (fun ω => |f i ω| ^ p) μ) : + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + let g : Ω → ℝ := fun a => ∑ i ∈ s, f i a + have hg_meas : Measurable g := by + simpa [g] using Finset.measurable_sum s (fun i hi => h_meas i hi) + have h_memLp : + ∀ i ∈ s, MeasureTheory.MemLp (f i) (p : ENNReal) μ := by + intro i hi + refine (MeasureTheory.integrable_norm_rpow_iff + (h_meas i hi).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hLp_int i hi + have hg_memLp : MeasureTheory.MemLp g (p : ENNReal) μ := by + simpa [g] using MeasureTheory.memLp_finsetSum s h_memLp + have hg_eq : g = ∑ i ∈ s, f i := by + funext a + simp [g] + have hg_int : + MeasureTheory.Integrable (fun ω => |g ω| ^ p) μ := by + simpa [g, Real.norm_eq_abs] using hg_memLp.integrable_norm_pow + (Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp)) + have hg_eLp : + MeasureTheory.eLpNorm g (p : ENNReal) μ ≤ + ∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ := by + have hp_ennreal : (1 : ENNReal) ≤ (p : ENNReal) := by + exact_mod_cast hp + rw [hg_eq] + exact + MeasureTheory.eLpNorm_sum_le + (μ := μ) (s := s) (f := f) + (fun i hi => (h_meas i hi).aestronglyMeasurable) + hp_ennreal + have hg_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) = + (∫ ω, |g ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv hp hg_meas hg_int + have hg_toReal_le : + ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) ≤ + ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := by + exact ENNReal.toReal_mono + (ENNReal.sum_ne_top.2 fun i hi => (h_memLp i hi).2.ne) hg_eLp + have hsum_rhs : + ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) = + ∑ i ∈ s, ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := by + exact ENNReal.toReal_sum (fun i hi => (h_memLp i hi).2.ne) + have hterm : + ∀ i ∈ s, + ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) = + (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + intro i hi + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv hp (h_meas i hi) (hLp_int i hi) + calc + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + = (∫ ω, |g ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + simp [g] + _ = ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) := by + rw [hg_toReal] + _ ≤ ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := hg_toReal_le + _ = ∑ i ∈ s, ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := hsum_rhs + _ = ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + exact hterm i hi + +/-- A.e.-measurable finite-sum root triangle inequality. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_sum_aemeasurable + {Ω ι : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} + {f : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + (h_aemeas : ∀ i ∈ s, AEMeasurable (f i) μ) + (hLp_int : ∀ i ∈ s, MeasureTheory.Integrable (fun ω => |f i ω| ^ p) μ) : + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + let g : Ω → ℝ := fun a => ∑ i ∈ s, f i a + have hg_aemeas : AEMeasurable g μ := by + have hsum : AEMeasurable (∑ i ∈ s, f i) μ := + Finset.aemeasurable_sum s h_aemeas + convert hsum using 1 + ext a + simp [g] + have h_memLp : + ∀ i ∈ s, MeasureTheory.MemLp (f i) (p : ENNReal) μ := by + intro i hi + refine (MeasureTheory.integrable_norm_rpow_iff + (h_aemeas i hi).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hLp_int i hi + have hg_memLp : MeasureTheory.MemLp g (p : ENNReal) μ := by + simpa [g] using MeasureTheory.memLp_finsetSum s h_memLp + have hg_eq : g = ∑ i ∈ s, f i := by + funext a + simp [g] + have hg_int : + MeasureTheory.Integrable (fun ω => |g ω| ^ p) μ := by + simpa [g, Real.norm_eq_abs] using hg_memLp.integrable_norm_pow + (Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp)) + have hg_eLp : + MeasureTheory.eLpNorm g (p : ENNReal) μ ≤ + ∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ := by + have hp_ennreal : (1 : ENNReal) ≤ (p : ENNReal) := by + exact_mod_cast hp + rw [hg_eq] + exact + MeasureTheory.eLpNorm_sum_le + (μ := μ) (s := s) (f := f) + (fun i hi => (h_aemeas i hi).aestronglyMeasurable) + hp_ennreal + have hg_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) = + (∫ ω, |g ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + hp hg_aemeas hg_int + have hg_toReal_le : + ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) ≤ + ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := by + exact ENNReal.toReal_mono + (ENNReal.sum_ne_top.2 fun i hi => (h_memLp i hi).2.ne) hg_eLp + have hsum_rhs : + ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) = + ∑ i ∈ s, ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := by + exact ENNReal.toReal_sum (fun i hi => (h_memLp i hi).2.ne) + have hterm : + ∀ i ∈ s, + ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) = + (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + intro i hi + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + hp (h_aemeas i hi) (hLp_int i hi) + calc + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + = (∫ ω, |g ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + simp [g] + _ = ENNReal.toReal (MeasureTheory.eLpNorm g (p : ENNReal) μ) := by + rw [hg_toReal] + _ ≤ ENNReal.toReal (∑ i ∈ s, MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := hg_toReal_le + _ = ∑ i ∈ s, ENNReal.toReal (MeasureTheory.eLpNorm (f i) (p : ENNReal) μ) := hsum_rhs + _ = ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + exact hterm i hi + +theorem integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} [MeasureTheory.IsProbabilityMeasure μ] + {f : Ω → ℝ} {p : ℕ} + (hp : 2 ≤ p) + (hf : Measurable f) + (hLp_int : MeasureTheory.Integrable (fun ω => |f ω| ^ p) μ) : + (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |f ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_ne_zero : p ≠ 0 := by omega + have hf_ae : MeasureTheory.AEStronglyMeasurable f μ := hf.aestronglyMeasurable + have h_memLp_p : MeasureTheory.MemLp f (p : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hf_ae (by exact_mod_cast hp_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have h_memLp_two : MeasureTheory.MemLp f (2 : ENNReal) μ := by + exact h_memLp_p.mono_exponent (by exact_mod_cast hp) + have hcmp : + MeasureTheory.eLpNorm f (2 : ENNReal) μ ≤ + MeasureTheory.eLpNorm f (p : ENNReal) μ := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := f) (by exact_mod_cast hp) hf_ae + rw [h_memLp_two.eLpNorm_eq_integral_rpow_norm (by norm_num) (by simp), + h_memLp_p.eLpNorm_eq_integral_rpow_norm (by exact_mod_cast hp_ne_zero) (by simp)] at hcmp + exact (ENNReal.ofReal_le_ofReal_iff (by positivity)).1 (by + simpa [Real.norm_eq_abs, one_div] using hcmp) + +/-- A.e.-measurable version of +`integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv`. -/ +theorem integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv_aemeasurable + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} [MeasureTheory.IsProbabilityMeasure μ] + {f : Ω → ℝ} {p : ℕ} + (hp : 2 ≤ p) + (hf : AEMeasurable f μ) + (hLp_int : MeasureTheory.Integrable (fun ω => |f ω| ^ p) μ) : + (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |f ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_ne_zero : p ≠ 0 := by omega + have hf_ae : MeasureTheory.AEStronglyMeasurable f μ := hf.aestronglyMeasurable + have h_memLp_p : MeasureTheory.MemLp f (p : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hf_ae (by exact_mod_cast hp_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have h_memLp_two : MeasureTheory.MemLp f (2 : ENNReal) μ := by + exact h_memLp_p.mono_exponent (by exact_mod_cast hp) + have hcmp : + MeasureTheory.eLpNorm f (2 : ENNReal) μ ≤ + MeasureTheory.eLpNorm f (p : ENNReal) μ := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := f) (by exact_mod_cast hp) hf_ae + rw [h_memLp_two.eLpNorm_eq_integral_rpow_norm (by norm_num) (by simp), + h_memLp_p.eLpNorm_eq_integral_rpow_norm (by exact_mod_cast hp_ne_zero) (by simp)] at hcmp + exact (ENNReal.ofReal_le_ofReal_iff (by positivity)).1 (by + simpa [Real.norm_eq_abs, one_div] using hcmp) + +theorem integral_abs_le_integral_abs_sq_rpow_half + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} [MeasureTheory.IsProbabilityMeasure μ] + {f : Ω → ℝ} + (hf : Measurable f) + (hL2_int : MeasureTheory.Integrable (fun ω => |f ω| ^ (2 : ℕ)) μ) : + ∫ ω, |f ω| ∂μ ≤ (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) := by + have hf_ae : MeasureTheory.AEStronglyMeasurable f μ := hf.aestronglyMeasurable + have h_memLp_two : MeasureTheory.MemLp f (2 : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff hf_ae (by norm_num) (by simp)] + simpa [Real.norm_eq_abs] using hL2_int + have h_memLp_one : MeasureTheory.MemLp f (1 : ENNReal) μ := by + exact h_memLp_two.mono_exponent (by norm_num : (1 : ENNReal) ≤ 2) + have hcmp : + MeasureTheory.eLpNorm f (1 : ENNReal) μ ≤ + MeasureTheory.eLpNorm f (2 : ENNReal) μ := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := f) (by norm_num : (1 : ENNReal) ≤ 2) hf_ae + have hL1_int_f : MeasureTheory.Integrable f μ := by + rwa [MeasureTheory.memLp_one_iff_integrable] at h_memLp_one + have hL1_int : MeasureTheory.Integrable (fun ω => |f ω|) μ := by + simpa [Real.norm_eq_abs] using hL1_int_f.norm + have hL1_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) = ∫ ω, |f ω| ∂μ := by + calc + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) + = (∫ ω, |f ω| ^ (1 : ℕ) ∂μ) ^ (1 / (1 : ℝ)) := by + simpa using + (toReal_eLpNorm_eq_integral_abs_pow_rpow_inv + (μ := μ) (f := f) (p := 1) (show 1 ≤ (1 : ℕ) by norm_num) + hf (by simpa using hL1_int)) + _ = ∫ ω, |f ω| ∂μ := by simp + have hL2_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (2 : ENNReal) μ) = + (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv (show 1 ≤ (2 : ℕ) by norm_num) + hf hL2_int + have hcmp_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) ≤ + ENNReal.toReal (MeasureTheory.eLpNorm f (2 : ENNReal) μ) := by + exact ENNReal.toReal_mono h_memLp_two.2.ne hcmp + simpa [hL1_toReal, hL2_toReal] using hcmp_toReal + +/-- A.e.-measurable version of +`integral_abs_le_integral_abs_sq_rpow_half`. -/ +theorem integral_abs_le_integral_abs_sq_rpow_half_aemeasurable + {Ω : Type*} [MeasurableSpace Ω] + {μ : MeasureTheory.Measure Ω} [MeasureTheory.IsProbabilityMeasure μ] + {f : Ω → ℝ} + (hf : AEMeasurable f μ) + (hL2_int : MeasureTheory.Integrable (fun ω => |f ω| ^ (2 : ℕ)) μ) : + ∫ ω, |f ω| ∂μ ≤ (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) := by + have hf_ae : MeasureTheory.AEStronglyMeasurable f μ := hf.aestronglyMeasurable + have h_memLp_two : MeasureTheory.MemLp f (2 : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff hf_ae (by norm_num) (by simp)] + simpa [Real.norm_eq_abs] using hL2_int + have h_memLp_one : MeasureTheory.MemLp f (1 : ENNReal) μ := by + exact h_memLp_two.mono_exponent (by norm_num : (1 : ENNReal) ≤ 2) + have hcmp : + MeasureTheory.eLpNorm f (1 : ENNReal) μ ≤ + MeasureTheory.eLpNorm f (2 : ENNReal) μ := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := f) (by norm_num : (1 : ENNReal) ≤ 2) hf_ae + have hL1_int_f : MeasureTheory.Integrable f μ := by + rwa [MeasureTheory.memLp_one_iff_integrable] at h_memLp_one + have hL1_int : MeasureTheory.Integrable (fun ω => |f ω|) μ := by + simpa [Real.norm_eq_abs] using hL1_int_f.norm + have hL1_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) = ∫ ω, |f ω| ∂μ := by + calc + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) + = (∫ ω, |f ω| ^ (1 : ℕ) ∂μ) ^ (1 / (1 : ℝ)) := by + simpa using + (toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + (μ := μ) (f := f) (p := 1) (show 1 ≤ (1 : ℕ) by norm_num) + hf (by simpa using hL1_int)) + _ = ∫ ω, |f ω| ∂μ := by simp + have hL2_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (2 : ENNReal) μ) = + (∫ ω, |f ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + (show 1 ≤ (2 : ℕ) by norm_num) hf hL2_int + have hcmp_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm f (1 : ENNReal) μ) ≤ + ENNReal.toReal (MeasureTheory.eLpNorm f (2 : ENNReal) μ) := by + exact ENNReal.toReal_mono h_memLp_two.2.ne hcmp + simpa [hL1_toReal, hL2_toReal] using hcmp_toReal + +theorem sum_rpow_inv_le_card_rpow_mul_rpow_sum + {ι : Type*} {s : Finset ι} {p : ℕ} {f : ι → ℝ} + (hp : 1 ≤ p) + (hf : ∀ i ∈ s, 0 ≤ f i) : + ∑ i ∈ s, f i ^ (1 / (p : ℝ)) ≤ + (s.card : ℝ) ^ (1 - 1 / (p : ℝ)) * (∑ i ∈ s, f i) ^ (1 / (p : ℝ)) := by + have hp_real : 1 ≤ (p : ℝ) := by exact_mod_cast hp + let g : ι → ℝ := fun i => (max (f i) 0) ^ (1 / (p : ℝ)) + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + have hp_real_ne_zero : (p : ℝ) ≠ 0 := by + exact_mod_cast hp_nat_ne_zero + have hroot := + Real.inner_le_weight_mul_Lp_of_nonneg + (s := s) (p := (p : ℝ)) hp_real + (w := fun _ => (1 : ℝ)) + (f := g) + (fun _ => by positivity) + (fun i => Real.rpow_nonneg (le_max_right _ _) _) + have hleft : + ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i = ∑ i ∈ s, f i ^ (1 / (p : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [g, max_eq_left (hf i hi)] + have hright : + ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i ^ (p : ℝ) = ∑ i ∈ s, f i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp only [one_mul] + dsimp [g] + rw [max_eq_left (hf i hi), ← Real.rpow_mul (hf i hi)] + have : (1 / (p : ℝ)) * p = 1 := by + field_simp [hp_real_ne_zero] + rw [this, Real.rpow_one] + calc + ∑ i ∈ s, f i ^ (1 / (p : ℝ)) + = ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i := by simpa using hleft.symm + _ ≤ (∑ i ∈ s, (fun _ => (1 : ℝ)) i) ^ (1 - (p : ℝ)⁻¹) * + (∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i ^ (p : ℝ)) ^ ((p : ℝ)⁻¹) := hroot + _ = (s.card : ℝ) ^ (1 - 1 / (p : ℝ)) * (∑ i ∈ s, f i) ^ (1 / (p : ℝ)) := by + rw [hright] + simp + + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/ScalarizationWitnesses.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/ScalarizationWitnesses.lean new file mode 100644 index 0000000000..0ae0aa872b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Internal/ScalarizationWitnesses.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization + +/-! # Scalarization Witnesses -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 +namespace Internal + +/-! +# Scalarization witness internals + +This file contains the route-specific witness and primitive-data machinery used +to prove the public Chapter 4 scalarization theorems. The note-facing API should +prefer direct theorem endpoints over these objects. +-/ + +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- Witness data for scalarization of annealed matrices at scale `n`. -/ +structure AnnealedScalarizationWitness {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) where + sigma : ℝ + sigmaStar : ℝ + sigma_eq : annealedSigmaAtScale P n = sigma • 1 + sigmaStar_eq : annealedSigmaStarAtScale P n = sigmaStar • 1 + kappa_eq_zero : annealedKappaAtScale P n = 0 + +/-- Scalarization at scale `n`, packaged as a witness. -/ +def HasAnnealedScalarizationAtScale {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) : Prop := + Nonempty (AnnealedScalarizationWitness P n) + +/-- Abstract invariance data sufficient to build a scalarization witness. -/ +structure AnnealedScalarizationInvarianceData {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) where + sigmaFlip : IsSignFlipInvariant (annealedSigmaAtScale P n) + sigmaSwap : IsSwapInvariant (annealedSigmaAtScale P n) + sigmaStarFlip : IsSignFlipInvariant (annealedSigmaStarAtScale P n) + sigmaStarSwap : IsSwapInvariant (annealedSigmaStarAtScale P n) + kappa_eq_zero : annealedKappaAtScale P n = 0 + +/-- Primitive scalarization data for the annealed `b` and +`\sigma_*^{-1}` blocks. -/ +structure AnnealedScalarizationPrimitiveData {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) where + sigmaStarInvFlip : IsSignFlipInvariant (annealedSigmaStarInvAtScale P n) + sigmaStarInvSwap : IsSwapInvariant (annealedSigmaStarInvAtScale P n) + bFlip : IsSignFlipInvariant (annealedBAtScale P n) + bSwap : IsSwapInvariant (annealedBAtScale P n) + sigmaStarInvKappaMean_eq_zero : annealedSigmaStarInvKappaMeanAtScale P n = 0 + +/-- The scalar contrast ratio attached to a chosen scalarization witness. -/ +noncomputable def annealedContrastAtScale {d : ℕ} + {P : RestrictionCoeffLaw d} {n : ℤ} + (w : AnnealedScalarizationWitness P n) : ℝ := + w.sigma * w.sigmaStar⁻¹ + +theorem annealedSigmaAtScale_isScalarMatrix_of_invariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hFlip : IsSignFlipInvariant (annealedSigmaAtScale P n)) + (hSwap : IsSwapInvariant (annealedSigmaAtScale P n)) : + IsScalarMatrix (annealedSigmaAtScale P n) := + isScalarMatrix_of_isSignFlipInvariant_of_isSwapInvariant hFlip hSwap + +theorem annealedSigmaStarInvAtScale_isScalarMatrix_of_invariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hFlip : IsSignFlipInvariant (annealedSigmaStarInvAtScale P n)) + (hSwap : IsSwapInvariant (annealedSigmaStarInvAtScale P n)) : + IsScalarMatrix (annealedSigmaStarInvAtScale P n) := + isScalarMatrix_of_isSignFlipInvariant_of_isSwapInvariant hFlip hSwap + +theorem annealedBAtScale_isScalarMatrix_of_invariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hFlip : IsSignFlipInvariant (annealedBAtScale P n)) + (hSwap : IsSwapInvariant (annealedBAtScale P n)) : + IsScalarMatrix (annealedBAtScale P n) := + isScalarMatrix_of_isSignFlipInvariant_of_isSwapInvariant hFlip hSwap + +theorem annealedSigmaStarAtScale_isScalarMatrix_of_invariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hFlip : IsSignFlipInvariant (annealedSigmaStarAtScale P n)) + (hSwap : IsSwapInvariant (annealedSigmaStarAtScale P n)) : + IsScalarMatrix (annealedSigmaStarAtScale P n) := + isScalarMatrix_of_isSignFlipInvariant_of_isSwapInvariant hFlip hSwap + +theorem annealedSigmaStarAtScale_isScalarMatrix_of_sigmaStarInv {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) + (hScalar : IsScalarMatrix (annealedSigmaStarInvAtScale P n)) : + IsScalarMatrix (annealedSigmaStarAtScale P n) := by + simpa [annealedSigmaStarAtScale, annealedSigmaStar] using! isScalarMatrix_inv hScalar + +theorem annealedKappaAtScale_eq_zero_of_sigmaStarInvKappaMean_eq_zero {d : ℕ} + (P : RestrictionCoeffLaw d) (n : ℤ) + (hMean : annealedSigmaStarInvKappaMeanAtScale P n = 0) : + annealedKappaAtScale P n = 0 := by + change annealedKappa P (cubeSet (originCube d n)) = 0 + rw [annealedKappa] + simpa [annealedSigmaStarInvKappaMeanAtScale] using + congrArg (fun M => annealedSigmaStar P (cubeSet (originCube d n)) * M) hMean + +theorem annealedSigmaAtScale_eq_annealedBAtScale_of_sigmaStarInvKappaMean_eq_zero + {d : ℕ} (P : RestrictionCoeffLaw d) (n : ℤ) + (hMean : annealedSigmaStarInvKappaMeanAtScale P n = 0) : + annealedSigmaAtScale P n = annealedBAtScale P n := by + change annealedSigma P (cubeSet (originCube d n)) = annealedB P (cubeSet (originCube d n)) + rw [annealedSigma] + have hKappa : annealedKappa P (cubeSet (originCube d n)) = 0 := by + rw [annealedKappa] + simpa [annealedSigmaStarInvKappaMeanAtScale] using + congrArg (fun M => annealedSigmaStar P (cubeSet (originCube d n)) * M) hMean + simp [hKappa] + +theorem annealedSigmaAtScale_isScalarMatrix_of_bInvariant_of_sigmaStarInvKappaMean_eq_zero + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hBFlip : IsSignFlipInvariant (annealedBAtScale P n)) + (hBSwap : IsSwapInvariant (annealedBAtScale P n)) + (hMean : annealedSigmaStarInvKappaMeanAtScale P n = 0) : + IsScalarMatrix (annealedSigmaAtScale P n) := by + rw [annealedSigmaAtScale_eq_annealedBAtScale_of_sigmaStarInvKappaMean_eq_zero P n hMean] + exact annealedBAtScale_isScalarMatrix_of_invariant P n hBFlip hBSwap + +/-- Build scalarization from invariant annealed `\sigma`, `\sigma_*`, and +zero coupling. -/ +noncomputable def annealedScalarizationWitnessOfInvariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hSigmaFlip : IsSignFlipInvariant (annealedSigmaAtScale P n)) + (hSigmaSwap : IsSwapInvariant (annealedSigmaAtScale P n)) + (hSigmaStarFlip : IsSignFlipInvariant (annealedSigmaStarAtScale P n)) + (hSigmaStarSwap : IsSwapInvariant (annealedSigmaStarAtScale P n)) + (hKappa : annealedKappaAtScale P n = 0) : + AnnealedScalarizationWitness P n := by + classical + let hsigmaScalar := + annealedSigmaAtScale_isScalarMatrix_of_invariant P n hSigmaFlip hSigmaSwap + let hsigmaStarScalar := + annealedSigmaStarAtScale_isScalarMatrix_of_invariant P n hSigmaStarFlip hSigmaStarSwap + exact + { sigma := Classical.choose hsigmaScalar + sigmaStar := Classical.choose hsigmaStarScalar + sigma_eq := Classical.choose_spec hsigmaScalar + sigmaStar_eq := Classical.choose_spec hsigmaStarScalar + kappa_eq_zero := hKappa } + +theorem hasAnnealedScalarizationAtScale_of_invariant {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hSigmaFlip : IsSignFlipInvariant (annealedSigmaAtScale P n)) + (hSigmaSwap : IsSwapInvariant (annealedSigmaAtScale P n)) + (hSigmaStarFlip : IsSignFlipInvariant (annealedSigmaStarAtScale P n)) + (hSigmaStarSwap : IsSwapInvariant (annealedSigmaStarAtScale P n)) + (hKappa : annealedKappaAtScale P n = 0) : + HasAnnealedScalarizationAtScale P n := + ⟨annealedScalarizationWitnessOfInvariant P n + hSigmaFlip hSigmaSwap hSigmaStarFlip hSigmaStarSwap hKappa⟩ + +/-- Build scalarization from primitive invariant data for `b` and +`\sigma_*^{-1}`. -/ +noncomputable def annealedScalarizationWitnessOfPrimitive {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hSigmaStarInvFlip : IsSignFlipInvariant (annealedSigmaStarInvAtScale P n)) + (hSigmaStarInvSwap : IsSwapInvariant (annealedSigmaStarInvAtScale P n)) + (hBFlip : IsSignFlipInvariant (annealedBAtScale P n)) + (hBSwap : IsSwapInvariant (annealedBAtScale P n)) + (hMean : annealedSigmaStarInvKappaMeanAtScale P n = 0) : + AnnealedScalarizationWitness P n := by + classical + let hSigmaStarInvScalar := + annealedSigmaStarInvAtScale_isScalarMatrix_of_invariant P n + hSigmaStarInvFlip hSigmaStarInvSwap + let hSigmaStarScalar := + annealedSigmaStarAtScale_isScalarMatrix_of_sigmaStarInv P n hSigmaStarInvScalar + let hSigmaScalar := + annealedSigmaAtScale_isScalarMatrix_of_bInvariant_of_sigmaStarInvKappaMean_eq_zero + P n hBFlip hBSwap hMean + exact + { sigma := Classical.choose hSigmaScalar + sigmaStar := Classical.choose hSigmaStarScalar + sigma_eq := Classical.choose_spec hSigmaScalar + sigmaStar_eq := Classical.choose_spec hSigmaStarScalar + kappa_eq_zero := + annealedKappaAtScale_eq_zero_of_sigmaStarInvKappaMean_eq_zero P n hMean } + +theorem hasAnnealedScalarizationAtScale_of_primitive {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) + (hSigmaStarInvFlip : IsSignFlipInvariant (annealedSigmaStarInvAtScale P n)) + (hSigmaStarInvSwap : IsSwapInvariant (annealedSigmaStarInvAtScale P n)) + (hBFlip : IsSignFlipInvariant (annealedBAtScale P n)) + (hBSwap : IsSwapInvariant (annealedBAtScale P n)) + (hMean : annealedSigmaStarInvKappaMeanAtScale P n = 0) : + HasAnnealedScalarizationAtScale P n := + ⟨annealedScalarizationWitnessOfPrimitive P n + hSigmaStarInvFlip hSigmaStarInvSwap hBFlip hBSwap hMean⟩ + +namespace AnnealedScalarizationInvarianceData + +variable {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + +noncomputable def toWitness (h : AnnealedScalarizationInvarianceData P n) : + AnnealedScalarizationWitness P n := + annealedScalarizationWitnessOfInvariant P n + h.sigmaFlip h.sigmaSwap h.sigmaStarFlip h.sigmaStarSwap h.kappa_eq_zero + +theorem hasAnnealedScalarizationAtScale (h : AnnealedScalarizationInvarianceData P n) : + HasAnnealedScalarizationAtScale P n := + ⟨h.toWitness⟩ + +end AnnealedScalarizationInvarianceData + +namespace AnnealedScalarizationPrimitiveData + +variable {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + +noncomputable def toWitness (h : AnnealedScalarizationPrimitiveData P n) : + AnnealedScalarizationWitness P n := + annealedScalarizationWitnessOfPrimitive P n + h.sigmaStarInvFlip h.sigmaStarInvSwap h.bFlip h.bSwap h.sigmaStarInvKappaMean_eq_zero + +theorem hasAnnealedScalarizationAtScale (h : AnnealedScalarizationPrimitiveData P n) : + HasAnnealedScalarizationAtScale P n := + ⟨h.toWitness⟩ + +end AnnealedScalarizationPrimitiveData + +end + +end Internal +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Law.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Law.lean new file mode 100644 index 0000000000..1c480cf4e5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Law.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionLaw + +/-! +# Canonical Chapter 4 source laws + +Unprefixed Chapter 4 law names denote the exact coarse-source, integral-local +semantics. The separate pointwise-restriction/sup-metric engineering lane is +exposed through the `Restriction*` names imported from `RestrictionLaw`. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +/-- A canonical Chapter 4 law on the exact coarse source carrier. -/ +abbrev CoeffLaw (d : ℕ) := SourceCoeffLaw d + +/-- The canonical coarse-source stationarity assumption. -/ +abbrev StationaryLaw {d : ℕ} (P : CoeffLaw d) := SourceStationaryLaw P + +/-- The canonical coarse-source Euclidean unit-range assumption. -/ +abbrev UnitRangeDependentLaw {d : ℕ} (P : CoeffLaw d) := SourceUnitRangeDependentLaw P + +/-- The canonical coarse-source joint isotropy and adjoint-invariance assumption. -/ +abbrev IsotropicAndAdjointInvariantLaw {d : ℕ} (P : CoeffLaw d) := + SourceIsotropicAndAdjointInvariantLaw P + +/-- The canonical coarse-source structural law assumptions. -/ +abbrev StructuralLaw {d : ℕ} (P : CoeffLaw d) := SourceStructuralLaw P + +namespace StructuralLaw + +/-- Access the canonical stationarity field. -/ +theorem stationary {d : ℕ} {P : CoeffLaw d} (hP : StructuralLaw P) : + StationaryLaw P := + SourceStructuralLaw.stationary hP + +/-- Access the canonical unit-range field. -/ +theorem unit_range {d : ℕ} {P : CoeffLaw d} (hP : StructuralLaw P) : + UnitRangeDependentLaw P := + SourceStructuralLaw.unit_range hP + +/-- Access the canonical joint isotropy and adjoint-invariance field. -/ +theorem isotropic_and_adjoint_invariant {d : ℕ} {P : CoeffLaw d} (hP : StructuralLaw P) : + IsotropicAndAdjointInvariantLaw P := + SourceStructuralLaw.isotropic_and_adjoint_invariant hP + +end StructuralLaw + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Measurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Measurability.lean new file mode 100644 index 0000000000..0fe208da3f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Measurability.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import Mathlib.MeasureTheory.Function.StronglyMeasurable.AEStronglyMeasurable +public import Mathlib.Topology.Metrizable.Basic + +/-! # Measurability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Law-relative measurability promotion (carrier re-type, Packet P3) + +This is the canonical Ch4 bridge: + +`IsRestrictionLocalRandomVariable U hU X → AEMeasurable X P → AEStronglyMeasurable X P`. + +On the honest-fields carrier the promotion is genuine: the restriction σ-algebra +`RestrictionSigmaR U hU` is contained in the canonical carrier σ-algebra +(`restrictionSigmaR_le`), so a restriction-local random variable is honestly +measurable, hence null- and a.e.-strongly measurable. This is unconditional in +the law: the former `LocalObservableLawCarrier` hypothesis was always derivable +(a vestigial hypothesis, Packet P4 R3-family strengthening) and has been dropped +from these bridges — they now hold for *every* carrier law. + +Later chapters should not introduce section-local copies of this bridge. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +namespace IsRestrictionLocalRandomVariable + +/-- A restriction-local random variable is null-measurable under any carrier +law. -/ +theorem nullMeasurable {β : Type*} [MeasurableSpace β] {d : ℕ} + {P : RestrictionCoeffLaw d} + {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) : + NullMeasurable X P := by + intro s hs + have hXm : Measurable X := + Measurable.mono hX (restrictionSigmaR_le U hU) le_rfl + exact (hXm hs).nullMeasurableSet + +/-- A local random variable with countably generated target sigma algebra is +a.e. measurable under any carrier law. -/ +theorem aemeasurable {β : Type*} [MeasurableSpace β] + [MeasurableSpace.CountablyGenerated β] {d : ℕ} + {P : RestrictionCoeffLaw d} + {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) : + AEMeasurable X P := + (hX.nullMeasurable (P := P)).aemeasurable + +/-- A local random variable into a second-countable pseudometrizable measurable +space is a.e. strongly measurable under any carrier law. -/ +theorem aestronglyMeasurable {β : Type*} [TopologicalSpace β] + [MeasurableSpace β] [TopologicalSpace.PseudoMetrizableSpace β] + [OpensMeasurableSpace β] [SecondCountableTopology β] + [MeasurableSpace.CountablyGenerated β] + {d : ℕ} {P : RestrictionCoeffLaw d} + {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) : + AEStronglyMeasurable X P := + (hX.aemeasurable (P := P)).aestronglyMeasurable + +end IsRestrictionLocalRandomVariable + +namespace RestrictionLawCarrier + +/-- Dot-notation promotion from local-test measurability to null measurability. -/ +theorem nullMeasurable_of_isLocalRandomVariable + {β : Type*} [MeasurableSpace β] {d : ℕ} {P : RestrictionCoeffLaw d} + (_hP : RestrictionLawCarrier P) {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → β} (hX : IsRestrictionLocalRandomVariable U hU X) : + NullMeasurable X P := + hX.nullMeasurable (P := P) + +/-- Dot-notation promotion from local-test measurability to a.e. +measurability. -/ +theorem aemeasurable_of_isLocalRandomVariable + {β : Type*} [MeasurableSpace β] [MeasurableSpace.CountablyGenerated β] + {d : ℕ} {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) : + AEMeasurable X P := + hX.aemeasurable (P := P) + +/-- Dot-notation promotion from local-test measurability to a.e. strong +measurability. -/ +theorem aestronglyMeasurable_of_isLocalRandomVariable + {β : Type*} [TopologicalSpace β] [MeasurableSpace β] + [TopologicalSpace.PseudoMetrizableSpace β] [OpensMeasurableSpace β] + [SecondCountableTopology β] [MeasurableSpace.CountablyGenerated β] + {d : ℕ} {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) : + AEStronglyMeasurable X P := + hX.aestronglyMeasurable (P := P) + +/-- Bundled-observable promotion to null measurability. -/ +theorem nullMeasurable_observable + {β : Type*} [MeasurableSpace β] {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) {U : Set (Vec d)} (X : RestrictionObservable d U β) : + NullMeasurable X P := + hP.nullMeasurable_of_isLocalRandomVariable X.isLocal + +/-- Bundled-observable promotion to a.e. measurability. -/ +theorem aemeasurable_observable + {β : Type*} [MeasurableSpace β] [MeasurableSpace.CountablyGenerated β] + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {U : Set (Vec d)} (X : RestrictionObservable d U β) : + AEMeasurable X P := + hP.aemeasurable_of_isLocalRandomVariable X.isLocal + +/-- Bundled-observable promotion to a.e. strong measurability. -/ +theorem aestronglyMeasurable_observable + {β : Type*} [TopologicalSpace β] [MeasurableSpace β] + [TopologicalSpace.PseudoMetrizableSpace β] [OpensMeasurableSpace β] + [SecondCountableTopology β] [MeasurableSpace.CountablyGenerated β] + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {U : Set (Vec d)} (X : RestrictionObservable d U β) : + AEStronglyMeasurable X P := + hP.aestronglyMeasurable_of_isLocalRandomVariable X.isLocal + +/-- Canonical access to AEE quantitative slice local measurability, now the +law-independent honest form (Packet P4b): genuine `LocalSigmaR (cubeSet Q)` +measurability. The `RestrictionLawCarrier` argument is retained only for the dot-notation +call site; the content no longer depends on the law. -/ +theorem measurableSet_aeeQuantitativeEllipticSlice_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (k : ℕ) : + @MeasurableSet (RegCoeffField d) (LocalSigmaR (cubeSet Q)) + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} := + measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k + +/-- A Chapter 4 law carrier gives the a.s. countable AEE quantitative-slice +cover on each deterministic triadic cube. -/ +theorem ae_exists_aeeQuantitativeEllipticSlice_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) (Q : TriadicCube d) : + ∀ᵐ a ∂P, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun := + hP.ae_locally_uniformly_elliptic.ae_exists_aeeQuantitativeEllipticSlice_cubeSet Q + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/MuLocalityGate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/MuLocalityGate.lean new file mode 100644 index 0000000000..7021fd0dab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/MuLocalityGate.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge + +/-! # Mu Locality Gate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# The `LocalSigmaR` → `IsRestrictionLocalRandomVariable` gate (Packet P4b, P5 input) + +This file exposes the σ-algebra bridge `localSigmaR_le_restrictionSigmaR` at the +Chapter 4 observable interface: a carrier observable that is measurable for the +local entry-test σ-algebra `LocalSigmaR U` is a genuine restriction-local random +variable `IsRestrictionLocalRandomVariable U hU`. + +This is the P5 gate for carrier `Mu` locality. The plan's route for the coarse +observable `Mu` is: + +1. re-aim the raw `Mu`/`toHilbertMatrixL2` measurability machinery + (`measurable_toHilbertMatrixL2_of_dense_inner` and the dense-probe inner + products, which are set integrals `∫_U w · a(·)_{ij}` — the entry-test + generators, via `entryTestR_eq_setIntegral_of_support`) so that + `a ↦ Mu (cubeSet Q) P0 a.toFun` is `LocalSigmaR (cubeSet Q)`-measurable; +2. apply `IsRestrictionLocalRandomVariable.of_measurable_localSigmaR` (below) to conclude + `IsRestrictionLocalRandomVariable (cubeSet Q) hQ (fun a => Mu (cubeSet Q) P0 a.toFun)`. + +Step 2 is provided here, law-independently. Step 1 (the carrier re-aim of the raw +subtype/slice `L²` machinery) is the remaining P5 work; the honest, genuinely +measurable slice sets it needs are now available +(`Homogenization.measurableSet_localSigmaR_aeeSlice`). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +namespace IsRestrictionLocalRandomVariable + +/-- **The `LocalSigmaR` → restriction-local gate.** A carrier observable +measurable for the local entry-test σ-algebra `LocalSigmaR U` is a restriction-local +random variable on the measurable observation set `U`. -/ +theorem of_measurable_localSigmaR {β : Type*} [MeasurableSpace β] {d : ℕ} + {U : Set (Vec d)} (hU : MeasurableSet U) {X : RegCoeffField d → β} + (hX : @Measurable (RegCoeffField d) β (LocalSigmaR U) _ X) : + IsRestrictionLocalRandomVariable U hU X := + Homogenization.measurable_restrictionSigmaR_of_measurable_localSigmaR hU hX + +end IsRestrictionLocalRandomVariable + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Observable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Observable.lean new file mode 100644 index 0000000000..6e7ce959af --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Observable.lean @@ -0,0 +1,56 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability + +/-! +# Canonical Chapter 4 source observables + +Unprefixed locality and observable names in this file are transparent aliases +for the exact coarse-source, integral-local API. The separate +`RestrictionObservable` API remains in the pointwise-restriction engineering +lane. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +/-- A canonical local random variable on the exact coarse source carrier. -/ +abbrev IsLocalRandomVariable {β : Type*} [MeasurableSpace β] {d : ℕ} + (U : Set (Vec d)) (hU : MeasurableSet U) (X : Source.Coarse.Carrier d → β) : Prop := + IsSourceLocalRandomVariable U hU X + +namespace IsLocalRandomVariable + +export IsSourceLocalRandomVariable + (mono const comp_measurable comp_translate vec_of_components vec_component + mat_of_entries mat_entry add neg sub mul inv abs finset_sum measurable + nullMeasurable aemeasurable aestronglyMeasurable) + +end IsLocalRandomVariable + +/-- A canonical bundled observable on the exact coarse source carrier. -/ +abbrev Observable (d : ℕ) (U : Set (Vec d)) (β : Type*) [MeasurableSpace β] := + SourceObservable d U β + +namespace Observable + +abbrev apply {d : ℕ} {U : Set (Vec d)} {β : Type*} [MeasurableSpace β] + (X : Observable d U β) (a : Source.Coarse.Carrier d) : β := + SourceObservable.toFun X a + +export SourceObservable + (mono const comp translate translate_apply vecOfComponents vecComponent + matOfEntries matEntry add neg sub mul inv abs finsetSum nullMeasurable + aemeasurable aestronglyMeasurable) + +end Observable + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/PartitionAverageConstants.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/PartitionAverageConstants.lean new file mode 100644 index 0000000000..5718b6036b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/PartitionAverageConstants.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring + +/-! +# Coefficient-free constants for Chapter 4 partition averages + +This module owns the numerical scales and color-count constants shared by the +partition-average and descendant-average concentration APIs. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +noncomputable section + +/-- Cardinal square-root fluctuation scale of a triadic partition. -/ +noncomputable def partitionCardinalityScale {d : ℕ} (n m : ℤ) : ℝ := + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) / + ((descendantsAtScale (originCube d m) n).card : ℝ) + +/-- Explicit color-count constant for descendant averages with `Gamma_sigma` +tails. -/ +noncomputable def gammaSigmaDescendantsAtScaleConst (d : ℕ) (k : ℤ) (σ : ℝ) : ℝ := + gammaTriangleConst σ * gammaSigmaIndependentSumConst σ * + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) + +/-- Explicit color-count constant for descendant averages with `Psi_sigma` +tails. -/ +noncomputable def psiSigmaDescendantsAtScaleConst (d : ℕ) (k : ℤ) (σ : ℝ) : ℝ := + psiSigmaTriangleConst σ * psiSigmaIndependentSumConst σ * + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) + +/-- Explicit color-count constant multiplying the real-exponent `L^p` +Rosenthal term in a descendant-average bound. -/ +noncomputable def rosenthalDescendantsAtScaleRpowLpConst + (d : ℕ) (k : ℤ) (p : ℝ) : ℝ := + 2 * p * ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) ^ (1 - 1 / p) + +/-- Explicit color-count constant multiplying the square-function term in a +real-exponent Rosenthal descendant-average bound. -/ +noncomputable def rosenthalDescendantsAtScaleRpowSqrtConst + (d : ℕ) (k : ℤ) (p : ℝ) : ℝ := + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ))) + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionLaw.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionLaw.lean new file mode 100644 index 0000000000..707e2c9711 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionLaw.lean @@ -0,0 +1,227 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import Mathlib.MeasureTheory.Measure.ProbabilityMeasure + +/-! # Restriction Law -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Chapter 4 restriction-engineering law assumptions (carrier re-type, Packet P3) + +This file owns the separate pointwise-restriction/sup-metric engineering +assumptions used by the restriction lane of Chapter 4 and later chapters. +Following the carrier redesign, the single restriction-lane law carrier +`RestrictionCoeffLaw d` is a +measure on the honest-fields carrier `RegCoeffField d` (see +`Homogenization.Probability.RegCoeffField`), on which entrywise regularity is +free by type. The structural predicates re-base onto the carrier endomorphisms +of `RegCoeffField/Laws.lean`; the ellipticity/slice predicates apply the raw +`IsAEEllipticFieldOn`/`AEEQuantitativeEllipticSlice` vocabulary to the honest +sample `a.toFun` (least-churn encoding: the a.e.-strong-measurability conjunct is +kept in the predicate but is always satisfiable on a carrier element, and the +downstream `L²` slice machinery still consumes it). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +/-- Combine finitely many almost-everywhere statements into one statement over +all members of a finset. -/ +theorem ae_forall_mem_finset {α ι : Type*} [MeasurableSpace α] + {P : Measure α} (s : Finset ι) {p : ι → α → Prop} + (h : ∀ i, i ∈ s → ∀ᵐ a ∂P, p i a) : + ∀ᵐ a ∂P, ∀ i, i ∈ s → p i a := by + classical + revert h + refine Finset.induction_on s ?empty ?insert + · intro h + exact Filter.Eventually.of_forall (by simp) + · intro i s his ih h + have hi : ∀ᵐ a ∂P, p i a := h i (by simp) + have hs : ∀ᵐ a ∂P, ∀ j, j ∈ s → p j a := by + exact ih fun j hj => h j (by simp [hj]) + filter_upwards [hi, hs] with a ha_i ha_s j hj + simp only [Finset.mem_insert] at hj + rcases hj with rfl | hj + · exact ha_i + · exact ha_s j hj + +/-- Nested finite version of `ae_forall_mem_finset`. -/ +theorem ae_forall_mem_finset_nested {α ι κ : Type*} [MeasurableSpace α] + {P : Measure α} (s : Finset ι) (t : ι → Finset κ) + {p : ι → κ → α → Prop} + (h : ∀ i, i ∈ s → ∀ j, j ∈ t i → ∀ᵐ a ∂P, p i j a) : + ∀ᵐ a ∂P, ∀ i, i ∈ s → ∀ j, j ∈ t i → p i j a := + ae_forall_mem_finset (P := P) s fun i hi => + ae_forall_mem_finset (P := P) (t i) fun j hj => + h i hi j hj + +/-- A Chapter 4 law on global coefficient fields, carried by the honest-fields +carrier `RegCoeffField d` (regularity free by type). -/ +abbrev RestrictionCoeffLaw (d : ℕ) := + Measure (RegCoeffField d) + +/-- The measurable restriction-local coefficient-field sigma algebra on a +measurable observation set (carrier version). -/ +noncomputable abbrev restrictionSigma {d : ℕ} (U : Set (Vec d)) (hU : MeasurableSet U) : + MeasurableSpace (RegCoeffField d) := + Homogenization.RestrictionSigmaR U hU + +/-- Spatial a.e. ellipticity of a carrier coefficient field on an observation +set, evaluated on the honest sample. -/ +def AEEllipticOn {d : ℕ} (lam Lam : ℝ) (U : Set (Vec d)) + (a : RegCoeffField d) : Prop := + IsAEEllipticFieldOn lam Lam U a.toFun + +/-- Public locally a.e.-uniform ellipticity: every triadic cube has +deterministic spatial a.e. ellipticity constants. -/ +def AELocallyUniformlyEllipticField {d : ℕ} (a : RegCoeffField d) : Prop := + ∀ Q : TriadicCube d, + ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ + AEEllipticOn lam Lam (openCubeSet Q) a + +/-- A law is supported on locally a.e.-uniformly elliptic fields. -/ +def AELocallyUniformlyEllipticLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop := + ∀ᵐ a ∂P, AELocallyUniformlyEllipticField a + +/-- A locally a.e.-uniformly elliptic field is a.e.-elliptic on each half-open +cube as well as on its open core. -/ +theorem AELocallyUniformlyEllipticField.exists_aeeEllipticOn_cubeSet + {d : ℕ} {a : RegCoeffField d} + (h : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) : + ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ + AEEllipticOn lam Lam (cubeSet Q) a := by + rcases h Q with ⟨lam, Lam, hlam, hle, hEll⟩ + exact ⟨lam, Lam, hlam, hle, IsAEEllipticFieldOn.cubeSet_of_openCubeSet hEll⟩ + +/-- A locally a.e.-uniformly elliptic field lies in some countable AEE +quantitative slice on each half-open triadic cube. -/ +theorem AELocallyUniformlyEllipticField.exists_aeeQuantitativeEllipticSlice_cubeSet + {d : ℕ} {a : RegCoeffField d} + (h : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) : + ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun := by + rcases h.exists_aeeEllipticOn_cubeSet Q with ⟨lam, _Lam, hlam, _hle, hEll⟩ + exact AEEQuantitativeEllipticSlice.exists_of_aeeEllipticOn hlam hEll + +/-- A locally a.e.-elliptic law gives an a.s. countable AEE quantitative-slice +cover for each deterministic triadic cube. -/ +theorem AELocallyUniformlyEllipticLaw.ae_exists_aeeQuantitativeEllipticSlice_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : AELocallyUniformlyEllipticLaw P) (Q : TriadicCube d) : + ∀ᵐ a ∂P, ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun := by + filter_upwards [hP] with a ha + exact ha.exists_aeeQuantitativeEllipticSlice_cubeSet Q + +/-- **The honest carrier null-measurability bridge.** Every event of the local +entry-test carrier σ-algebra `LocalSigmaR U` is null-measurable for any carrier +law `P`, because `LocalSigmaR U` is genuinely coarser than the canonical carrier +σ-algebra (`LocalSigmaR_le`) — no hypothesis on `P` is required. + +This is a *free* lemma, so it replaces the former `LocalObservableLawCarrier` +hypothesis field of `RestrictionLawCarrier` (which asserted exactly this and was therefore +always derivable — a vestigial hypothesis, removed as an R3-family +strengthening). Consumers that need a local carrier event to be null-measurable +(the Ch04 `Mu`/coarse-observable measurability handoff) call this directly. + +Note (Packet P4b): the P4 report determined that the comap σ-algebra +`localSigma U = comap toFun (fine PointwiseLocalSigma U)` is **not** ≤ the +canonical carrier σ-algebra, so the AEE-slice event has no free +null-measurability bridge along that route. The honest replacement is genuine +`LocalSigmaR (cubeSet Q)` measurability +of the slice event (`measurableSet_localSigmaR_aeeQuantitativeEllipticSlice`), +which this bridge then promotes to null-measurability. -/ +theorem nullMeasurableSet_of_localSigmaR {d : ℕ} (P : RestrictionCoeffLaw d) + {U : Set (Vec d)} {s : Set (RegCoeffField d)} + (hs : @MeasurableSet (RegCoeffField d) (LocalSigmaR U) s) : + NullMeasurableSet s P := + (LocalSigmaR_le U s hs).nullMeasurableSet + +/-- **The AEE quantitative-slice event is genuinely `LocalSigmaR`-measurable, with +no hypothesis on the law** (Packet P4b). This is the honest core discovered by +the P4 report: unlike the comap slice field, the entry-test-local `LocalSigmaR` +event is genuinely below the canonical carrier σ-algebra, and its measurability +is established directly by Lebesgue differentiation and the rational-ball average +characterization (`measurableSet_localSigmaR_aeeSlice`). Being law-independent, +it is a *theorem*, not a `RestrictionLawCarrier` field. -/ +theorem measurableSet_localSigmaR_aeeQuantitativeEllipticSlice {d : ℕ} + (Q : TriadicCube d) (k : ℕ) : + @MeasurableSet (RegCoeffField d) (LocalSigmaR (cubeSet Q)) + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} := + Homogenization.measurableSet_localSigmaR_aeeSlice Q k + +/-- The single public Chapter 4 law carrier. The former +`aee_quantitative_slice_measurable` field was law-independent — its content is now +the free theorem `measurableSet_localSigmaR_aeeQuantitativeEllipticSlice` (Packet +P4b, an R3-family strengthening) — and has been removed. -/ +structure RestrictionLawCarrier {d : ℕ} (P : RestrictionCoeffLaw d) : Prop where + isProbability : IsProbabilityMeasure P + ae_locally_uniformly_elliptic : AELocallyUniformlyEllipticLaw P + +/-- A probability law supported on locally a.e.-uniformly elliptic fields is a +Chapter 4 law carrier. Both former measurability fields (the AEE-slice +measurability and the earlier local-observable measurability) were vestigial — +law-independent and derivable directly — and have been removed. -/ +theorem lawCarrier_of_aeLocallyUniformlyElliptic {d : ℕ} {P : RestrictionCoeffLaw d} + [IsProbabilityMeasure P] (hP : AELocallyUniformlyEllipticLaw P) : + RestrictionLawCarrier P where + isProbability := inferInstance + ae_locally_uniformly_elliptic := hP + +namespace RestrictionLawCarrier + +/-- Canonical access to the a.s. locally a.e.-uniform ellipticity support of a +Chapter 4 law carrier. -/ +theorem ae_locallyUniformlyEllipticField {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) : + ∀ᵐ a ∂P, AELocallyUniformlyEllipticField a := + hP.ae_locally_uniformly_elliptic + +end RestrictionLawCarrier + +/-- Public stationarity assumption `(P1)`. -/ +abbrev RestrictionStationaryLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop := + Homogenization.IsStationaryR P + +/-- The explicit restriction-unit-range dependence assumption: independence of +the pointwise restriction σ-algebras of unit-separated measurable sets. -/ +abbrev RestrictionUnitRangeDependentLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop := + Homogenization.IsRestrictionUnitRangeDependentR P + +/-- Public isotropy assumption `(P3)`, restricted to signed permutations. -/ +abbrev RestrictionIsotropicLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop := + Homogenization.IsIsotropicInLawR P + +/-- Public adjoint-invariance assumption. -/ +abbrev RestrictionAdjointInvariantLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop := + Homogenization.IsAdjointInvariantInLawR P + +/-- The combined restriction-lane structural law assumptions, kept separate from +measurability and ellipticity so downstream theorems request only what they use. -/ +structure RestrictionStructuralLaw {d : ℕ} (P : RestrictionCoeffLaw d) : Prop where + stationary : RestrictionStationaryLaw P + unit_range : RestrictionUnitRangeDependentLaw P + isotropic : RestrictionIsotropicLaw P + adjoint_invariant : RestrictionAdjointInvariantLaw P + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionObservable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionObservable.lean new file mode 100644 index 0000000000..05777b82e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/RestrictionObservable.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law + +/-! # Restriction Observable -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Local observables (carrier re-type, Packet P3) + +`IsRestrictionLocalRandomVariable U hU X` is the permanent Ch4 predicate for +restriction-local random observables. +Following the carrier redesign, observables are functions of the honest-fields +carrier `RegCoeffField d`, and locality is measurability for the carrier +restriction σ-algebra `RestrictionSigmaR U hU` (which needs the observation set to +be measurable — the D7-approved `MeasurableSet` side-condition making +`RestrictionSigmaR` well defined). Everything downstream should enter +measurability through this predicate and the promotion lemmas in +`Ch04.Measurability`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +/-- A random observable depending only on the restriction-local carrier +σ-algebra on the measurable set `U`. -/ +def IsRestrictionLocalRandomVariable {β : Type*} [MeasurableSpace β] {d : ℕ} + (U : Set (Vec d)) (hU : MeasurableSet U) (X : RegCoeffField d → β) : Prop := + @Measurable (RegCoeffField d) β (RestrictionSigmaR U hU) _ X + +namespace IsRestrictionLocalRandomVariable + +/-- Monotonicity of the restriction-local carrier σ-algebra. -/ +theorem restrictionSigma_mono {d : ℕ} {U V : Set (Vec d)} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) : + RestrictionSigmaR U hU ≤ RestrictionSigmaR V hV := + RestrictionSigmaR_mono hU hV hUV + +/-- A local observable on a smaller observation set is local on any larger one. -/ +theorem mono {β : Type*} [MeasurableSpace β] {d : ℕ} + {U V : Set (Vec d)} {X : RegCoeffField d → β} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) + (hX : IsRestrictionLocalRandomVariable U hU X) : + IsRestrictionLocalRandomVariable V hV X := by + intro s hs + exact (restrictionSigma_mono (d := d) hU hV hUV) (X ⁻¹' s) (hX hs) + +/-- Constant local observables. -/ +theorem const {β : Type*} [MeasurableSpace β] {d : ℕ} + (U : Set (Vec d)) (hU : MeasurableSet U) (b : β) : + IsRestrictionLocalRandomVariable U hU (fun _a : RegCoeffField d => b) := + measurable_const + +/-- Compose a local observable with a measurable map. -/ +theorem comp_measurable {β γ : Type*} [MeasurableSpace β] [MeasurableSpace γ] + {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} {X : RegCoeffField d → β} + (hX : IsRestrictionLocalRandomVariable U hU X) {g : β → γ} (hg : Measurable g) : + IsRestrictionLocalRandomVariable U hU (fun a => g (X a)) := + hg.comp hX + +/-- Locality of a vector-valued observable follows componentwise. -/ +theorem vec_of_components {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → Vec m} + (hX : ∀ i : Fin m, IsRestrictionLocalRandomVariable U hU (fun a => X a i)) : + IsRestrictionLocalRandomVariable U hU X := by + change @Measurable (RegCoeffField d) (Vec m) (RestrictionSigmaR U hU) _ X + rw [@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) X] + intro i + exact hX i + +/-- Components of a vector-valued local observable are local. -/ +theorem vec_component {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → Vec m} + (hX : IsRestrictionLocalRandomVariable U hU X) (i : Fin m) : + IsRestrictionLocalRandomVariable U hU (fun a => X a i) := by + change @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ (fun a => X a i) + exact ((@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) X).mp + (show @Measurable (RegCoeffField d) (Vec m) (RestrictionSigmaR U hU) _ X from hX)) i + +/-- Locality of a matrix-valued observable follows entrywise. -/ +theorem mat_of_entries {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → Mat m} + (hX : ∀ i j : Fin m, IsRestrictionLocalRandomVariable U hU (fun a => X a i j)) : + IsRestrictionLocalRandomVariable U hU X := by + change @Measurable (RegCoeffField d) (Mat m) (RestrictionSigmaR U hU) _ X + refine (@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => Fin m → ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) X).2 ?_ + intro i + rw [@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) (fun a => X a i)] + intro j + exact hX i j + +/-- Entries of a matrix-valued local observable are local. -/ +theorem mat_entry {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → Mat m} + (hX : IsRestrictionLocalRandomVariable U hU X) (i j : Fin m) : + IsRestrictionLocalRandomVariable U hU (fun a => X a i j) := by + change @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ (fun a => X a i j) + have hi : + @Measurable (RegCoeffField d) (Fin m → ℝ) (RestrictionSigmaR U hU) _ + (fun a => X a i) := + ((@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => Fin m → ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) X).mp + (show @Measurable (RegCoeffField d) (Mat m) (RestrictionSigmaR U hU) _ X from hX)) i + exact ((@measurable_pi_iff (RegCoeffField d) (Fin m) (fun _ => ℝ) + (RestrictionSigmaR U hU) (fun _ => inferInstance) (fun a => X a i)).mp hi) j + +/-- Sum of real-valued local observables. -/ +theorem add {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) + (hY : IsRestrictionLocalRandomVariable U hU Y) : + IsRestrictionLocalRandomVariable U hU (fun a => X a + Y a) := + Measurable.add hX hY + +/-- Negation of a real-valued local observable. -/ +theorem neg {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) : + IsRestrictionLocalRandomVariable U hU (fun a => -X a) := + Measurable.neg hX + +/-- Difference of real-valued local observables. -/ +theorem sub {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) + (hY : IsRestrictionLocalRandomVariable U hU Y) : + IsRestrictionLocalRandomVariable U hU (fun a => X a - Y a) := + Measurable.sub hX hY + +/-- Product of real-valued local observables. -/ +theorem mul {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) + (hY : IsRestrictionLocalRandomVariable U hU Y) : + IsRestrictionLocalRandomVariable U hU (fun a => X a * Y a) := + Measurable.mul hX hY + +/-- Inverse of a real-valued local observable. -/ +theorem inv {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) : + IsRestrictionLocalRandomVariable U hU (fun a => (X a)⁻¹) := + Measurable.inv hX + +/-- Absolute value of a real-valued local observable. -/ +theorem abs {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : RegCoeffField d → ℝ} + (hX : IsRestrictionLocalRandomVariable U hU X) : + IsRestrictionLocalRandomVariable U hU (fun a => |X a|) := + continuous_abs.measurable.comp hX + +/-- Finite sums of real-valued local observables. -/ +theorem finset_sum {d : ℕ} {ι : Type*} [Fintype ι] + {U : Set (Vec d)} {hU : MeasurableSet U} {X : ι → RegCoeffField d → ℝ} + (hX : ∀ i, IsRestrictionLocalRandomVariable U hU (X i)) : + IsRestrictionLocalRandomVariable U hU (fun a => ∑ i, X i a) := by + classical + exact Finset.measurable_sum Finset.univ fun i _hi => hX i + +end IsRestrictionLocalRandomVariable + +/-- Bundled restriction-local Chapter 4 observable. This is the canonical +engineering object for whole-restriction locality. The observation set's +measurability is kept as a field (rather than a type parameter) so the type +signature remains stable. -/ +structure RestrictionObservable (d : ℕ) (U : Set (Vec d)) (β : Type*) + [MeasurableSpace β] where + measurableSet : MeasurableSet U + toFun : RegCoeffField d → β + isLocal : IsRestrictionLocalRandomVariable U measurableSet toFun + +namespace RestrictionObservable + +variable {d m : ℕ} {U V : Set (Vec d)} + +instance {β : Type*} [MeasurableSpace β] : + CoeFun (RestrictionObservable d U β) (fun _ => RegCoeffField d → β) := + ⟨RestrictionObservable.toFun⟩ + +/-- Explicit accessor for the permanent restriction-locality predicate. -/ +theorem isRestrictionLocal {β : Type*} [MeasurableSpace β] + (X : RestrictionObservable d U β) : + IsRestrictionLocalRandomVariable U X.measurableSet X.toFun := + X.isLocal + +/-- Enlarge the observation set of a bundled observable. -/ +def mono {β : Type*} [MeasurableSpace β] (X : RestrictionObservable d U β) + (hV : MeasurableSet V) (hUV : U ⊆ V) : RestrictionObservable d V β where + measurableSet := hV + toFun := X + isLocal := X.isLocal.mono X.measurableSet hV hUV + +/-- Constant bundled observables. -/ +def const {β : Type*} [MeasurableSpace β] (U : Set (Vec d)) (hU : MeasurableSet U) + (b : β) : RestrictionObservable d U β where + measurableSet := hU + toFun := fun _a => b + isLocal := IsRestrictionLocalRandomVariable.const U hU b + +/-- Measurable postcomposition of a bundled observable. -/ +def comp {β γ : Type*} [MeasurableSpace β] [MeasurableSpace γ] + (X : RestrictionObservable d U β) (g : β → γ) (hg : Measurable g) : + RestrictionObservable d U γ where + measurableSet := X.measurableSet + toFun := fun a => g (X a) + isLocal := X.isLocal.comp_measurable hg + +/-- Build a vector-valued bundled observable from bundled components. -/ +def vecOfComponents (hU : MeasurableSet U) (X : Fin m → RestrictionObservable d U ℝ) : + RestrictionObservable d U (Vec m) where + measurableSet := hU + toFun := fun a i => X i a + isLocal := + IsRestrictionLocalRandomVariable.vec_of_components (hU := hU) + fun i => (X i).isLocal + +/-- Extract one component of a vector-valued bundled observable. -/ +def vecComponent (X : RestrictionObservable d U (Vec m)) (i : Fin m) : + RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a i + isLocal := X.isLocal.vec_component i + +/-- Build a matrix-valued bundled observable from bundled entries. -/ +def matOfEntries (hU : MeasurableSet U) + (X : Fin m → Fin m → RestrictionObservable d U ℝ) : + RestrictionObservable d U (Mat m) where + measurableSet := hU + toFun := fun a i j => X i j a + isLocal := + IsRestrictionLocalRandomVariable.mat_of_entries (hU := hU) + fun i j => (X i j).isLocal + +/-- Extract one entry of a matrix-valued bundled observable. -/ +def matEntry (X : RestrictionObservable d U (Mat m)) (i j : Fin m) : + RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a i j + isLocal := X.isLocal.mat_entry i j + +/-- Sum of real-valued bundled observables. -/ +protected def add (X Y : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a + Y a + isLocal := X.isLocal.add Y.isLocal + +/-- Negation of a real-valued bundled observable. -/ +protected def neg (X : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => -X a + isLocal := X.isLocal.neg + +/-- Difference of real-valued bundled observables. -/ +protected def sub (X Y : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a - Y a + isLocal := X.isLocal.sub Y.isLocal + +/-- Product of real-valued bundled observables. -/ +protected def mul (X Y : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a * Y a + isLocal := X.isLocal.mul Y.isLocal + +/-- Inverse of a real-valued bundled observable. -/ +protected noncomputable def inv (X : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => (X a)⁻¹ + isLocal := X.isLocal.inv + +/-- Absolute value of a real-valued bundled observable. -/ +protected def abs (X : RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => |X a| + isLocal := X.isLocal.abs + +/-- Finite sum of real-valued bundled observables over a finite type. -/ +def finsetSum {ι : Type*} [Fintype ι] (hU : MeasurableSet U) + (X : ι → RestrictionObservable d U ℝ) : RestrictionObservable d U ℝ where + measurableSet := hU + toFun := fun a => ∑ i, X i a + isLocal := + IsRestrictionLocalRandomVariable.finset_sum (hU := hU) + fun i => (X i).isLocal + +end RestrictionObservable + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Source.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Source.lean new file mode 100644 index 0000000000..4da495694b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Source.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCanonicalMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceCoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageLowMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponsePartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceStationaryExpectations + +/-! +# Exact coarse-source Chapter 4 umbrella + +This module is the complete, faithful umbrella for the current Chapter 4 +`Source*` modules. It deliberately contains no compatibility bridge to the +pointwise-restriction engineering lane. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCanonicalMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCanonicalMeasurability.lean new file mode 100644 index 0000000000..d8b99dcf04 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCanonicalMeasurability.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMinimizerFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Definitions +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RegIntegralAdapter + +/-! +# Exact-source locality of canonical doubled-`Mu` solutions + +The coarse source has deterministic AEE-slice coverage on every triadic cube. +The least-slice partition therefore assembles the canonical totalized +minimizer and its fixed-test energy pairing pointwise from source-local slice +pieces. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +noncomputable section + +private theorem measurableSet_sourceLocal_aeeSlice {d : ℕ} (Q : TriadicCube d) + (k : ℕ) : + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) + {a : Source.Coarse.Carrier d | + AEEQuantitativeEllipticSlice (cubeSet Q) k a.1} := + (measurableSet_smoothLocalSigmaR_aeeSlice Q k).preimage + (Source.Coarse.measurable_coarseToRegular_smoothLocal + (cubeSet Q) (measurableSet_cubeSet Q)) + +private theorem measurable_source_coarse_entryTest {d : ℕ} (Q : TriadicCube d) + (i j : Fin d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ cubeSet Q) : + @Measurable (Source.Coarse.Carrier d) ℝ + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ + (fun a => entryTestR i j φ (Source.Coarse.coarseToRegular a)) := by + have hentry_smooth : + @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR (cubeSet Q)) _ + (entryTestR i j φ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, hφ_cont, hφ_compact, hφ_support, t, ht, rfl⟩ + exact hentry_smooth.comp + (Source.Coarse.measurable_coarseToRegular_smoothLocal + (cubeSet Q) (measurableSet_cubeSet Q)) + +/-- The selected canonical doubled-`Mu` Hilbert minimizer is measurable for the +exact coarse-source local sigma algebra. The target carries the explicitly +specified Borel measurable space. -/ +theorem measurable_sourceLocal_canonicalMuHilbertMinimizerCubeSet {d : ℕ} + (Q : TriadicCube d) (P0 : BlockVec d) : + @Measurable (Source.Coarse.Carrier d) (HilbertBlockL2 (cubeSet Q)) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) + (borel (HilbertBlockL2 (cubeSet Q))) + (fun a : Source.Coarse.Carrier d => + canonicalMuHilbertMinimizerCubeSet Q P0 a.1) := by + classical + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + let : MeasurableSpace (HilbertBlockL2 (cubeSet Q)) := borel _ + have : BorelSpace (HilbertBlockL2 (cubeSet Q)) := ⟨rfl⟩ + let slice : ℕ → Set (Source.Coarse.Carrier d) := + fun k => {a | AEEQuantitativeEllipticSlice (cubeSet Q) k a.1} + let firstSlice : ℕ → Set (Source.Coarse.Carrier d) := + fun k => slice k ∩ ⋂ j ∈ Finset.range k, (slice j)ᶜ + have hslice_meas : ∀ k : ℕ, + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) (slice k) := by + intro k + exact measurableSet_sourceLocal_aeeSlice Q k + have hfirst_meas : ∀ k : ℕ, + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) (firstSlice k) := by + intro k + have hprev : @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) + (⋂ j ∈ Finset.range k, (slice j)ᶜ) := + (Finset.range k).measurableSet_biInter fun j _hj => (hslice_meas j).compl + exact (hslice_meas k).inter hprev + have hfirst_unique : + ∀ {i j : ℕ} {a : Source.Coarse.Carrier d}, + a ∈ firstSlice i → a ∈ firstSlice j → i = j := by + intro i j a hi hj + by_cases hij : i = j + · exact hij + rcases lt_or_gt_of_ne hij with hlt | hgt + · have hnot : a ∉ slice i := by + have hcompl : a ∈ (slice i)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hj.2 i) (by simpa using hlt)) + simpa using hcompl + exact False.elim (hnot hi.1) + · have hnot : a ∉ slice j := by + have hcompl : a ∈ (slice j)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hi.2 j) (by simpa using hgt)) + simpa using hcompl + exact False.elim (hnot hj.1) + have hcover : ⋃ k : ℕ, firstSlice k = Set.univ := by + ext a + constructor + · intro _ha + exact Set.mem_univ a + · intro _ha + obtain ⟨k, hak⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have hcover_a : ∃ n : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) n a.1 := ⟨k, hak⟩ + let k0 : ℕ := Nat.find hcover_a + have hak0 : a ∈ firstSlice k0 := by + refine ⟨?_, ?_⟩ + · simpa [slice, k0] using Nat.find_spec hcover_a + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k0 := by simpa [k0] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.1 := by + intro hja + exact (not_lt_of_ge (Nat.find_min' hcover_a hja)) (by simpa [k0] using hjlt) + simpa [slice] using hnot + exact Set.mem_iUnion.mpr ⟨k0, hak0⟩ + let piece : (k : ℕ) → firstSlice k → HilbertBlockL2 (cubeSet Q) := + fun k a => + ((canonicalAEEMuOperatorSystemData Q k + ⟨a.1.1, a.2.1⟩).toMuHilbertRealization).minimizerMap P0 + have hpiece_meas : ∀ k : ℕ, Measurable (piece k) := by + intro k + have hEntry : + ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (firstSlice k) ℝ _ _ + (fun x => entryTestR i j φ + (Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d))) := by + intro i j φ hφ_cont hφ_compact hφ_support + exact (measurable_source_coarse_entryTest Q i j hφ_cont hφ_compact hφ_support).comp + measurable_subtype_coe + have hsm := + stronglyMeasurable_canonicalMinimizer_carrier + (mΩ := (inferInstance : MeasurableSpace (firstSlice k))) Q + (A := fun x : firstSlice k => + Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d)) + (fun x => x.2.1) hEntry P0 + exact hsm.measurable + have hLift : + @Measurable (Source.Coarse.Carrier d) (HilbertBlockL2 (cubeSet Q)) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ + (Set.liftCover firstSlice piece (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover) := + measurable_liftCover firstSlice hfirst_meas piece hpiece_meas (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover + have hEq : + Set.liftCover firstSlice piece (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover = + fun a : Source.Coarse.Carrier d => canonicalMuHilbertMinimizerCubeSet Q P0 a.1 := by + funext a + obtain ⟨k, hak⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have hcover_a : ∃ n : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) n a.1 := ⟨k, hak⟩ + let k0 : ℕ := Nat.find hcover_a + have hak0 : a ∈ firstSlice k0 := by + refine ⟨?_, ?_⟩ + · simpa [slice, k0] using Nat.find_spec hcover_a + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k0 := by simpa [k0] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.1 := by + intro hja + exact (not_lt_of_ge (Nat.find_min' hcover_a hja)) (by simpa [k0] using hjlt) + simpa [slice] using hnot + rw [Set.liftCover_of_mem + (S := firstSlice) (f := piece) (i := k0) hak0] + simp only [piece, canonicalMuHilbertMinimizerCubeSet, hcover_a, k0] + rfl + rw [← hEq] + exact hLift + +/-- The canonical doubled-`Mu` Hilbert minimizer is a.e. strongly measurable +under every source law. -/ +theorem aestronglyMeasurable_sourceLocal_canonicalMuHilbertMinimizerCubeSet + {d : ℕ} {P : SourceCoeffLaw d} (Q : TriadicCube d) (P0 : BlockVec d) : + AEStronglyMeasurable + (fun a : Source.Coarse.Carrier d => canonicalMuHilbertMinimizerCubeSet Q P0 a.1) P := by + classical + let U : Set (Vec d) := cubeSet Q + let : MeasurableSpace (HilbertBlockL2 U) := borel _ + have : BorelSpace (HilbertBlockL2 U) := ⟨rfl⟩ + let f : Source.Coarse.Carrier d → HilbertBlockL2 U := + fun a => canonicalMuHilbertMinimizerCubeSet Q P0 a.1 + have hLocalMeas : + @Measurable (Source.Coarse.Carrier d) (HilbertBlockL2 U) + (Source.Coarse.localSigma U (by simpa [U] using measurableSet_cubeSet Q)) + (borel (HilbertBlockL2 U)) f := by + simpa [U, f] using measurable_sourceLocal_canonicalMuHilbertMinimizerCubeSet Q P0 + have hMeas : + @Measurable (Source.Coarse.Carrier d) (HilbertBlockL2 U) + (Source.Coarse.globalSigma d) (borel (HilbertBlockL2 U)) f := by + apply Measurable.mono hLocalMeas + · exact Source.Coarse.localSigma_mono + (by simpa [U] using measurableSet_cubeSet Q) MeasurableSet.univ (Set.subset_univ U) + · exact le_rfl + have hNull : NullMeasurable f P := by + intro s hs + exact (hMeas hs).nullMeasurableSet + let sliceRange : ℕ → Set (HilbertBlockL2 U) := fun k => + Set.range fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P0 + let sepSet : Set (HilbertBlockL2 U) := + ({0} : Set (HilbertBlockL2 U)) ∪ ⋃ k : ℕ, sliceRange k + have hSep : TopologicalSpace.IsSeparable sepSet := by + have hSlices : TopologicalSpace.IsSeparable (⋃ k : ℕ, sliceRange k) := by + refine .iUnion ?_ + intro k + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + have hslice : StronglyMeasurable + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P0) := by + simpa [U] using + Homogenization.stronglyMeasurable_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet + (Q := Q) (k := k) P0 + simpa [sliceRange] using hslice.isSeparable_range + exact (Set.finite_singleton (0 : HilbertBlockL2 U)).isSeparable.union hSlices + have hMemSep : ∀ᵐ a ∂P, f a ∈ sepSet := by + filter_upwards with a + obtain ⟨k, hslice⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have ha : ∃ n : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) n a.1 := ⟨k, hslice⟩ + let k0 : ℕ := Nat.find ha + have hslice0 : AEEQuantitativeEllipticSlice (cubeSet Q) k0 a.1 := Nat.find_spec ha + right + refine Set.mem_iUnion.mpr ⟨k0, ⟨⟨a.1, by simpa [U] using hslice0⟩, ?_⟩⟩ + simp only [f, canonicalMuHilbertMinimizerCubeSet, U, ha, k0] + rfl + exact (aestronglyMeasurable_iff_nullMeasurable_separable).2 + ⟨hNull, ⟨sepSet, hSep, hMemSep⟩⟩ + +/-- The fixed-test canonical energy pairing is local for the exact +coarse-source sigma algebra. -/ +theorem isSourceLocalRandomVariable_canonicalMuHilbertEnergyBilinFixedCubeSet + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.1) := by + classical + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + let slice : ℕ → Set (Source.Coarse.Carrier d) := + fun k => {a | AEEQuantitativeEllipticSlice (cubeSet Q) k a.1} + let firstSlice : ℕ → Set (Source.Coarse.Carrier d) := + fun k => slice k ∩ ⋂ j ∈ Finset.range k, (slice j)ᶜ + have hslice_meas : ∀ k : ℕ, + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) (slice k) := by + intro k + exact measurableSet_sourceLocal_aeeSlice Q k + have hfirst_meas : ∀ k : ℕ, + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) (firstSlice k) := by + intro k + have hprev : @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) + (⋂ j ∈ Finset.range k, (slice j)ᶜ) := + (Finset.range k).measurableSet_biInter fun j _hj => (hslice_meas j).compl + exact (hslice_meas k).inter hprev + have hfirst_unique : + ∀ {i j : ℕ} {a : Source.Coarse.Carrier d}, + a ∈ firstSlice i → a ∈ firstSlice j → i = j := by + intro i j a hi hj + by_cases hij : i = j + · exact hij + rcases lt_or_gt_of_ne hij with hlt | hgt + · have hnot : a ∉ slice i := by + have hcompl : a ∈ (slice i)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hj.2 i) (by simpa using hlt)) + simpa using hcompl + exact False.elim (hnot hi.1) + · have hnot : a ∉ slice j := by + have hcompl : a ∈ (slice j)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hi.2 j) (by simpa using hgt)) + simpa using hcompl + exact False.elim (hnot hj.1) + have hcover : ⋃ k : ℕ, firstSlice k = Set.univ := by + ext a + constructor + · intro _ha + exact Set.mem_univ a + · intro _ha + obtain ⟨k, hak⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have hcover_a : ∃ n : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) n a.1 := ⟨k, hak⟩ + let k0 : ℕ := Nat.find hcover_a + have hak0 : a ∈ firstSlice k0 := by + refine ⟨?_, ?_⟩ + · simpa [slice, k0] using Nat.find_spec hcover_a + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k0 := by simpa [k0] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.1 := by + intro hja + exact (not_lt_of_ge (Nat.find_min' hcover_a hja)) (by simpa [k0] using hjlt) + simpa [slice] using hnot + exact Set.mem_iUnion.mpr ⟨k0, hak0⟩ + let piece : (k : ℕ) → firstSlice k → ℝ := + fun k a => + ((canonicalAEEMuOperatorSystemData Q k + ⟨a.1.1, a.2.1⟩).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (((canonicalAEEMuOperatorSystemData Q k + ⟨a.1.1, a.2.1⟩).toMuHilbertRealization).minimizerMap P0) + have hpiece_meas : ∀ k : ℕ, Measurable (piece k) := by + intro k + have hEntry : + ∀ (i j : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (firstSlice k) ℝ _ _ + (fun x => entryTestR i j φ + (Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d))) := by + intro i j φ hφ_cont hφ_compact hφ_support + exact (measurable_source_coarse_entryTest Q i j hφ_cont hφ_compact hφ_support).comp + measurable_subtype_coe + exact + measurable_energyBilin_fixed_canonicalMinimizer_carrier + (mΩ := (inferInstance : MeasurableSpace (firstSlice k))) Q + (A := fun x : firstSlice k => + Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d)) + (fun x => x.2.1) hEntry P0 Y hY + have hLift : + @Measurable (Source.Coarse.Carrier d) ℝ + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ + (Set.liftCover firstSlice piece (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover) := + measurable_liftCover firstSlice hfirst_meas piece hpiece_meas (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover + have hEq : + Set.liftCover firstSlice piece (by + intro i j a hai haj + have hij := hfirst_unique hai haj + subst j + rfl) hcover = + fun a : Source.Coarse.Carrier d => + canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.1 := by + funext a + obtain ⟨k, hak⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have hcover_a : ∃ n : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) n a.1 := ⟨k, hak⟩ + let k0 : ℕ := Nat.find hcover_a + have hak0 : a ∈ firstSlice k0 := by + refine ⟨?_, ?_⟩ + · simpa [slice, k0] using Nat.find_spec hcover_a + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k0 := by simpa [k0] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.1 := by + intro hja + exact (not_lt_of_ge (Nat.find_min' hcover_a hja)) (by simpa [k0] using hjlt) + simpa [slice] using hnot + rw [Set.liftCover_of_mem + (S := firstSlice) (f := piece) (i := k0) hak0] + simp [canonicalMuHilbertEnergyBilinFixedCubeSet, hcover_a, k0, piece] + rw [← hEq] + exact hLift + +namespace SourceObservable +/-- The fixed-test canonical doubled-`Mu` energy pairing as an exact +source-local observable. -/ +noncomputable def canonicalMuHilbertEnergyBilinFixed {d : ℕ} + (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + SourceObservable d (cubeSet Q) ℝ where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.1 + isLocal := + isSourceLocalRandomVariable_canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY + +@[simp] +theorem canonicalMuHilbertEnergyBilinFixed_apply {d : ℕ} + (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) + (a : Source.Coarse.Carrier d) : + canonicalMuHilbertEnergyBilinFixed Q P0 Y hY a = + canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.1 := + rfl + +end SourceObservable + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCoarseObservables.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCoarseObservables.lean new file mode 100644 index 0000000000..0009fdb620 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceCoarseObservables.lean @@ -0,0 +1,333 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic + +/-! +# Exact-source coarse observables + +The coarse block entries are finite polarizations of the exact source-local +`Mu` observable. This module packages those deterministic consequences in +the coarse source local sigma algebra. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +noncomputable section + +/-- The upper-left entry of the coarse block matrix is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperLeft i j) := by + by_cases hij : i = j + · subst j + have hmu := (SourceObservable.mu Q (Pi.single i 1, 0)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperLeft i i) = + fun a => (2 : ℝ) * Mu (cubeSet Q) (Pi.single i 1, 0) a.1 := by + funext a + simp [coarseBlockMatrix_upperLeft_apply] + rw [hEq] + exact measurable_const.mul hmu + · have hsum := (SourceObservable.mu Q + ((Pi.single i 1, 0) + (Pi.single j 1, 0)) + ).isLocal + have hi := (SourceObservable.mu Q (Pi.single i 1, 0)).isLocal + have hj := (SourceObservable.mu Q (Pi.single j 1, 0)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperLeft i j) = + fun a => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a.1 + - Mu (cubeSet Q) (Pi.single i 1, 0) a.1 + - Mu (cubeSet Q) (Pi.single j 1, 0) a.1 := by + funext a + simp [coarseBlockMatrix_upperLeft_apply, hij] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The upper-right entry of the coarse block matrix is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperRight i j) := by + have hsum := (SourceObservable.mu Q + ((Pi.single i 1, 0) + (0, Pi.single j 1))).isLocal + have hi := (SourceObservable.mu Q (Pi.single i 1, 0)).isLocal + have hj := (SourceObservable.mu Q (0, Pi.single j 1)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperRight i j) = + fun a => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (0, Pi.single j 1)) a.1 + - Mu (cubeSet Q) (Pi.single i 1, 0) a.1 + - Mu (cubeSet Q) (0, Pi.single j 1) a.1 := by + funext a + exact coarseBlockMatrix_upperRight_apply (cubeSet Q) a.1 i j + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The lower-left entry of the coarse block matrix is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerLeft i j) := by + have hsum := (SourceObservable.mu Q + ((0, Pi.single i 1) + (Pi.single j 1, 0))).isLocal + have hi := (SourceObservable.mu Q (0, Pi.single i 1)).isLocal + have hj := (SourceObservable.mu Q (Pi.single j 1, 0)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerLeft i j) = + fun a => + Mu (cubeSet Q) ((0, Pi.single i 1) + (Pi.single j 1, 0)) a.1 + - Mu (cubeSet Q) (0, Pi.single i 1) a.1 + - Mu (cubeSet Q) (Pi.single j 1, 0) a.1 := by + funext a + exact coarseBlockMatrix_lowerLeft_apply (cubeSet Q) a.1 i j + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The lower-right entry of the coarse block matrix is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerRight i j) := by + by_cases hij : i = j + · subst j + have hmu := (SourceObservable.mu Q (0, Pi.single i 1)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerRight i i) = + fun a => (2 : ℝ) * Mu (cubeSet Q) (0, Pi.single i 1) a.1 := by + funext a + simp [coarseBlockMatrix_lowerRight_apply] + rw [hEq] + exact measurable_const.mul hmu + · have hsum := (SourceObservable.mu Q + ((0, Pi.single i 1) + (0, Pi.single j 1))).isLocal + have hi := (SourceObservable.mu Q (0, Pi.single i 1)).isLocal + have hj := (SourceObservable.mu Q (0, Pi.single j 1)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerRight i j) = + fun a => + Mu (cubeSet Q) ((0, Pi.single i 1) + (0, Pi.single j 1)) a.1 + - Mu (cubeSet Q) (0, Pi.single i 1) a.1 + - Mu (cubeSet Q) (0, Pi.single j 1) a.1 := by + funext a + simp [coarseBlockMatrix_lowerRight_apply, hij] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The unfolded full coarse block matrix is exact-source local. -/ +theorem isSourceLocalRandomVariable_toFullBlockMat_coarseBlockMatrix_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.1)) := by + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + change @Measurable (Source.Coarse.Carrier d) (FullBlockMat d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ _ + refine measurable_pi_iff.2 fun x => ?_ + refine measurable_pi_iff.2 fun y => ?_ + cases x with + | inl i => + cases y with + | inl j => + exact isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + exact isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr i => + cases y with + | inl j => + exact isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr j => + exact isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +/-- The upper-left coarse block is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperLeft) := + IsSourceLocalRandomVariable.mat_of_entries fun i j => + isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + +/-- The upper-right coarse block is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).upperRight) := + IsSourceLocalRandomVariable.mat_of_entries fun i j => + isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + +/-- The lower-left coarse block is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerLeft) := + IsSourceLocalRandomVariable.mat_of_entries fun i j => + isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + +/-- The lower-right coarse block is exact-source local. -/ +theorem isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + (coarseBlockMatrix (cubeSet Q) a.1).lowerRight) := + IsSourceLocalRandomVariable.mat_of_entries fun i j => + isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +/-- The negative lower-left coarse block is exact-source local. -/ +theorem isSourceLocalRandomVariable_neg_coarseBlockMatrix_lowerLeft_cubeSet + {d : ℕ} (Q : TriadicCube d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + -((coarseBlockMatrix (cubeSet Q) a.1).lowerLeft)) := by + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + change @Measurable (Source.Coarse.Carrier d) (Mat d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ _ + refine measurable_pi_iff.2 fun i => ?_ + refine measurable_pi_iff.2 fun j => ?_ + exact (isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j).neg + +private theorem isSourceLocalRandomVariable_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + {F : TriadicCube d → Source.Coarse.Carrier d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (F R)) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a => descendantsAverage Q j (fun R => F R a)) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + have hsum : Measurable (fun a : Source.Coarse.Carrier d => D.sum (fun R => F R a)) := by + refine Finset.measurable_sum D ?_ + intro R hR + exact (hF R (by simpa [D] using hR)).mono + (measurableSet_cubeSet R) (measurableSet_cubeSet Q) + (cubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + simpa [descendantsAverage, D] using! hsum.const_mul ((D.card : ℝ)⁻¹) + +/-- The finite descendant average of a coarse energy is exact-source local on +the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_Mu_cubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (P0 : BlockVec d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + descendantsAverage Q j (fun R => Mu (cubeSet R) P0 a.1)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + (SourceObservable.mu R P0).isLocal + +/-- The finite descendant average of an upper-left coarse entry is exact-source +local on the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_coarseBlockMatrix_upperLeft_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => descendantsAverage Q j (fun R => + (coarseBlockMatrix (cubeSet R) a.1).upperLeft i k)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_apply_cubeSet R i k + +/-- The finite descendant average of an upper-right coarse entry is exact-source +local on the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => descendantsAverage Q j (fun R => + (coarseBlockMatrix (cubeSet R) a.1).upperRight i k)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_apply_cubeSet R i k + +/-- The finite descendant average of a lower-left coarse entry is exact-source +local on the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => descendantsAverage Q j (fun R => + (coarseBlockMatrix (cubeSet R) a.1).lowerLeft i k)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_apply_cubeSet R i k + +/-- The finite descendant average of a lower-right coarse entry is exact-source +local on the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_coarseBlockMatrix_lowerRight_apply_cubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => descendantsAverage Q j (fun R => + (coarseBlockMatrix (cubeSet R) a.1).lowerRight i k)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_apply_cubeSet R i k + +namespace SourceObservable + +/-- The unfolded full coarse block matrix, bundled as an exact-source observable. -/ +noncomputable def coarseFullBlockMatrix {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (FullBlockMat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.1) + isLocal := isSourceLocalRandomVariable_toFullBlockMat_coarseBlockMatrix_cubeSet Q + +/-- The upper-left coarse block, bundled as an exact-source observable. -/ +noncomputable def coarseBlockUpperLeft {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (Mat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => (coarseBlockMatrix (cubeSet Q) a.1).upperLeft + isLocal := isSourceLocalRandomVariable_coarseBlockMatrix_upperLeft_cubeSet Q + +/-- The upper-right coarse block, bundled as an exact-source observable. -/ +noncomputable def coarseBlockUpperRight {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (Mat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => (coarseBlockMatrix (cubeSet Q) a.1).upperRight + isLocal := isSourceLocalRandomVariable_coarseBlockMatrix_upperRight_cubeSet Q + +/-- The lower-left coarse block, bundled as an exact-source observable. -/ +noncomputable def coarseBlockLowerLeft {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (Mat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => (coarseBlockMatrix (cubeSet Q) a.1).lowerLeft + isLocal := isSourceLocalRandomVariable_coarseBlockMatrix_lowerLeft_cubeSet Q + +/-- The lower-right coarse block, bundled as an exact-source observable. -/ +noncomputable def coarseBlockLowerRight {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (Mat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => (coarseBlockMatrix (cubeSet Q) a.1).lowerRight + isLocal := isSourceLocalRandomVariable_coarseBlockMatrix_lowerRight_cubeSet Q + +/-- The negative lower-left coarse block, bundled as an exact-source observable. -/ +noncomputable def negCoarseBlockLowerLeft {d : ℕ} (Q : TriadicCube d) : + SourceObservable d (cubeSet Q) (Mat d) where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => -((coarseBlockMatrix (cubeSet Q) a.1).lowerLeft) + isLocal := isSourceLocalRandomVariable_neg_coarseBlockMatrix_lowerLeft_cubeSet Q + +end SourceObservable + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassConcentration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassConcentration.lean new file mode 100644 index 0000000000..ba2c8309e5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassConcentration.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration + +/-! +# Concentration of source-local observables on a scale-color class + +These wrappers combine source unit-range dependence with the existing +independent-sum concentration estimates. Source locality supplies both the +independence input and global measurability of each summand. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +/-- A single scale-color class of descendant cubes inherits `Gamma_sigma` +concentration from uniformly controlled centered source-local summands. -/ +theorem isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hP : SourceUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsBigO P (gammaSigma σ) (X R) K) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a) + (gammaSigmaIndependentSumConst σ * + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → Source.Coarse.Carrier d → ℝ := + fun R => X R.1 + have h_indep : iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_meas : ∀ R, Measurable (Y R) := by + intro R + exact (hX_local R.1 R.2).measurable + have hY : + ∀ R ∈ S.attach, IsBigO P (gammaSigma σ) (Y R) K := by + intro R _hR + exact hX R.1 R.2 + have h_meanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hsum := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := P) (X := Y) (s := S.attach) (σ := σ) (K := K) + h_indep h_meas hS_attach hσ₀ hσ₂ hK hY h_meanY + simpa [S, hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + rw [isBigO_gammaSigma_iff] + intro t ht + have htail_empty : + absTailEvent (fun _ : Source.Coarse.Carrier d => (0 : ℝ)) 0 = ∅ := by + ext a + simp [absTailEvent] + simpa [S, hS_empty, htail_empty, absTailEvent, upperTailEvent] using + (show (0 : ℝ) ≤ Real.exp (-(t ^ σ)) by positivity) + +/-- A single scale-color class of descendant cubes inherits `Psi_sigma` +concentration from uniformly controlled centered source-local summands. -/ +theorem isBigO_psiSigma_finsetSum_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hP : SourceUnitRangeDependentLaw P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_int : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, Integrable (X R) P) + (hX : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsBigO P (psiSigma σ) (X R) K) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) : + IsBigO P (psiSigma σ) + (fun a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a) + (psiSigmaIndependentSumConst σ * + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → Source.Coarse.Carrier d → ℝ := + fun R => X R.1 + have h_indep : iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_meas : ∀ R, Measurable (Y R) := by + intro R + exact (hX_local R.1 R.2).measurable + have h_int : ∀ R ∈ S.attach, Integrable (Y R) P := by + intro R _hR + exact hX_int R.1 R.2 + have hY : + ∀ R ∈ S.attach, IsBigO P (psiSigma σ) (Y R) K := by + intro R _hR + exact hX R.1 R.2 + have h_meanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hsum := + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + (μ := P) (X := Y) (s := S.attach) (σ := σ) (K := K) + h_indep h_meas h_int h_meanY hS_attach hσ hK hY + simpa [S, hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + rw [isBigO_psiSigma_iff] + intro t ht + have htail_empty : + absTailEvent (fun _ : Source.Coarse.Carrier d => (0 : ℝ)) 0 = ∅ := by + ext a + simp [absTailEvent] + simpa [S, hS_empty, htail_empty, absTailEvent, upperTailEvent] using + (show 0 ≤ Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) by positivity) + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassIndependence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassIndependence.lean new file mode 100644 index 0000000000..28c4c128e4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassIndependence.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceIndependence +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring + +/-! +# Independence of source-local observables on a scale-color class + +This is the source-carrier counterpart of the scale-color-class independence +specialization. Its metric bridge is kept local: the coloring separates cubes +in the ambient sup metric, while source P2 is formulated with the Euclidean +metric. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory + +private theorem ambient_norm_le_source_euclideanNorm {d : ℕ} (z : Vec d) : + ‖z‖ ≤ euclideanNorm z := by + rw [euclideanNorm_eq_norm_ofVec] + rw [EuclideanSpace.norm_eq] + apply (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg _)).2 + intro i + apply (Real.le_sqrt (norm_nonneg _) (Finset.sum_nonneg fun _ _ => sq_nonneg _)).2 + exact Finset.single_le_sum (s := Finset.univ) (f := fun i : Fin d => ‖z i‖ ^ 2) + (fun _ _ => sq_nonneg _) (Finset.mem_univ i) + +private theorem euclideanUnitSeparated_scaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hR : R ∈ descendantsAtScaleScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleScaleColorClass Q k c) (hneq : R ≠ S) : + Source.Coarse.EuclideanUnitSeparated (cubeSet R) (cubeSet S) := by + intro x y hx hy + unfold euclideanDist + have hdist : 1 ≤ dist x y := + one_le_dist_of_ne_of_mem_descendantsAtScaleScaleColorClass hR hS hneq hx hy + have hnorm : 1 ≤ ‖x - y‖ := by + simpa [dist_eq_norm] using hdist + exact hnorm.trans (ambient_norm_le_source_euclideanNorm (x - y)) + +/-- Source-local observables indexed by one scale-color class are independent +under source unit-range dependence. -/ +theorem iIndepFun_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {β : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} → Type*} + [∀ R, MeasurableSpace (β R)] + {X : ∀ R, Source.Coarse.Carrier d → β R} + (hP : SourceUnitRangeDependentLaw P) + (hX : ∀ R, + IsSourceLocalRandomVariable (cubeSet R.1) (measurableSet_cubeSet R.1) (X R)) : + iIndepFun X P := by + classical + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let U : I → Set (Vec d) := fun R => cubeSet R.1 + have hU : ∀ R : I, MeasurableSet (U R) := fun R => measurableSet_cubeSet R.1 + have hXU : ∀ R : I, IsSourceLocalRandomVariable (U R) (hU R) (X R) := by + intro R + simpa [I, U] using hX R + have hsep : Pairwise fun R S : I => + Source.Coarse.EuclideanUnitSeparated (U R) (U S) := by + intro R S hRS + exact euclideanUnitSeparated_scaleColorClass R.2 S.2 + (fun h => hRS (Subtype.ext h)) + simpa [I, U] using + (iIndepFun_of_sourceLocalRandomVariable_of_sourceUnitRangeDependentLaw + (d := d) (ι := I) (U := U) hU hP hXU hsep) + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassMoments.lean new file mode 100644 index 0000000000..09038366f0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceColorClassMoments.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Corollaries + +/-! +# Real-moment bounds on one source scale-color class + +This file assembles source locality and source P2 into the independent-sum +input required by the real-exponent Rosenthal corollary, for one scale-color +class of descendants. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +/-- Color-class assembly lemma: source-local centered summands on one +descendant scale-color class satisfy the uniform real-exponent Rosenthal +bound under source unit-range dependence. -/ +theorem integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {p K : ℝ} + (hP : SourceUnitRangeDependentLaw P) (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hLp_int : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + Integrable (fun a => |X R a| ^ p) P) + (hXmean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) + (hK : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + (∫ a, |X R a| ^ p ∂P) ^ p⁻¹ ≤ K) : + (∫ a, |∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a| ^ p ∂P) ^ p⁻¹ ≤ + 2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K) + + 4 * _root_.Homogenization.IndependentSums.rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → Source.Coarse.Carrier d → ℝ := + fun R => X R.1 + have h_indep : iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_meas : ∀ R, Measurable (Y R) := by + intro R + exact (hX_local R.1 R.2).measurable + have hLp_intY : ∀ R ∈ S.attach, Integrable (fun a => |Y R a| ^ p) P := by + intro R _ + exact hLp_int R.1 R.2 + have hXmeanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _ + exact hXmean R.1 R.2 + have hKY : ∀ R ∈ S.attach, (∫ a, |Y R a| ^ p ∂P) ^ p⁻¹ ≤ K := by + intro R _ + exact hK R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hRosenthal := + _root_.Homogenization.IndependentSums.integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := P) (X := Y) (s := S.attach) (p := p) (K := K) + hS_attach hp hK_nonneg h_indep h_meas hLp_intY hXmeanY hKY + change + (∫ a, |(fun a => ∑ R ∈ S.attach, Y R a) a| ^ p ∂P) ^ p⁻¹ ≤ _ at hRosenthal + rw [hsum_eq] at hRosenthal + simpa [S] using hRosenthal + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + have hp_pos : 0 < p := by linarith + have hp_inv_pos : 0 < p⁻¹ := inv_pos.mpr hp_pos + simp [S, hS_empty, Real.zero_rpow (ne_of_gt hp_pos), + Real.zero_rpow (ne_of_gt hp_inv_pos)] + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantAverages.lean new file mode 100644 index 0000000000..8878e54274 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantAverages.lean @@ -0,0 +1,302 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.Order.Chebyshev +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverages + +/-! +# Source-local descendant-average concentration + +This module assembles source-local color-class concentration bounds into +descendant-average bounds. Its public statements depend only on source +unit-range dependence; source locality supplies summand measurability. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +private theorem gammaSigmaIndependentSumConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaSigmaIndependentSumConst σ := by + dsimp [gammaSigmaIndependentSumConst] + by_cases hσ_lt : σ < 1 + · simpa [hσ_lt, gammaSigmaHeavyTailEndpointConst] using! + (mul_pos + (Real.rpow_pos_of_pos (by norm_num : 0 < (2 : ℝ)) _) + (IndependentSums.gammaSigmaHeavyTailConst_pos hσ)) + · have hσ_one : 1 ≤ σ := le_of_not_gt hσ_lt + dsimp [gammaSigmaExpRegimeEndpointConst] + by_cases hσ_eq : σ = 1 + · subst σ + simpa [hσ_lt, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using + (mul_pos (by norm_num : 0 < (2 : ℝ)) + IndependentSums.gammaOneExpRegimeConst_pos) + · have hExpConst_pos : 0 < IndependentSums.gammaSigmaExpRegimeConst σ := by + dsimp [IndependentSums.gammaSigmaExpRegimeConst] + exact lt_of_lt_of_le + (mul_pos (by positivity) (IndependentSums.gammaMomentConst_pos hσ)) + (le_max_left _ _) + simpa [hσ_lt, hσ_eq, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using + (mul_pos (by norm_num : 0 < (2 : ℝ)) hExpConst_pos) + +private theorem psiSigmaIndependentSumConst_pos (σ : ℝ) : + 0 < psiSigmaIndependentSumConst σ := + IndependentSums.psiSigmaIndependentSumConst_pos σ + +private theorem scaleColorClass_nonempty_of_mem_image {d : ℕ} + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hc : c ∈ (descendantsAtScale Q k).image (cubeScaleColor k)) : + (descendantsAtScaleScaleColorClass Q k c).Nonempty := by + rcases Finset.mem_image.mp hc with ⟨R, hR, rfl⟩ + exact ⟨R, mem_descendantsAtScaleScaleColorClass_self hR⟩ + +private theorem scaleColor_sqrt_card_sum_le {d : ℕ} + (Q : TriadicCube d) (k : ℤ) : + ∑ c ∈ (descendantsAtScale Q k).image (cubeScaleColor k), + Real.sqrt (((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt (((descendantsAtScale Q k).card : ℝ)) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + have hsum_card_eq : + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) = + ((descendantsAtScale Q k).card : ℝ) := by + rw [← Nat.cast_sum] + exact_mod_cast (card_descendantsAtScale_eq_sum_card_scaleColorClass_image Q k).symm + have hsqrt_sum_le : + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (colors.card : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + simpa [hsum_card_eq] using + (Real.sum_sqrt_mul_sqrt_le + (s := colors) + (f := fun _ => (1 : ℝ)) + (g := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (hf := by intro c; positivity) + (hg := by intro c; positivity)) + have hcolors_card_le : + (colors.card : ℝ) ≤ ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (card_image_cubeScaleColor_descendantsAtScale_le Q k) + have hsqrt_colors_le : + Real.sqrt (colors.card : ℝ) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := + Real.sqrt_le_sqrt hcolors_card_le + exact hsqrt_sum_le.trans + (mul_le_mul_of_nonneg_right hsqrt_colors_le (by positivity)) + +/-- Averaging source-local descendants at scale `k` preserves `Gamma_sigma` +concentration under source unit-range dependence. -/ +theorem isBigO_gammaSigma_descendantAverage_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hk : k ≤ Q.scale) + (hP : SourceUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX : ∀ R ∈ descendantsAtScale Q k, IsBigO P (gammaSigma σ) (X R) K) + (h_mean : ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a) + (gammaSigmaDescendantsAtScaleConst d k σ * + (Real.sqrt ((descendantsAtScale Q k).card : ℝ) / + ((descendantsAtScale Q k).card : ℝ)) * K) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → Source.Coarse.Carrier d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + let classCount : ScaleColor d k → ℝ := + fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) + let colorCount : ℝ := (((scaleColorPeriod k) ^ d : ℕ) : ℝ) + let totalCount : ℝ := ((descendantsAtScale Q k).card : ℝ) + have hcolors : colors.Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩⟩ + have hClassCount : ∀ c ∈ colors, 0 < classCount c := by + intro c hc + have hnonempty : (descendantsAtScaleScaleColorClass Q k c).Nonempty := + scaleColorClass_nonempty_of_mem_image (Q := Q) (k := k) (c := c) + (by simpa [colors] using hc) + dsimp [classCount] + exact_mod_cast hnonempty.card_pos + have hTotal : 0 < totalCount := by + dsimp [totalCount] + exact_mod_cast (descendantsAtScale_nonempty Q hk).card_pos + have hY : + ∀ c ∈ colors, + IsBigO P (gammaSigma σ) (Y c) + (gammaSigmaIndependentSumConst σ * Real.sqrt (classCount c) * K) := by + intro c hc + have hcolor := + isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP hσ₀ hσ₂ hK X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + simpa [Y, classCount] using hcolor + have hYmeas : ∀ c ∈ colors, Measurable (Y c) := by + intro c hc + simpa [Y] using + (Finset.measurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => + (hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1).measurable)) + have hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount := by + simpa [colors, classCount, colorCount, totalCount] using + scaleColor_sqrt_card_sum_le Q k + have haverage := + isBigO_finsetAverage_colorClassSums_gammaSigma + (μ := P) (colors := colors) (Y := Y) (classCount := classCount) + (colorCount := colorCount) (totalCount := totalCount) + (C := gammaSigmaIndependentSumConst σ) (K := K) (σ := σ) + hσ₀ hcolors hClassCount hTotal (gammaSigmaIndependentSumConst_pos hσ₀) hK + hY hYmeas hSqrt + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have haverage_fun_eq : + (fun a => totalCount⁻¹ * ∑ c ∈ colors, Y c a) = + fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + rw [show (∑ c ∈ colors, Y c a) = + ∑ R ∈ descendantsAtScale Q k, X R a from congrFun hsum_eq a] + simpa [gammaSigmaDescendantsAtScaleConst, totalCount, colorCount, haverage_fun_eq, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using haverage + +/-- Averaging source-local descendants at scale `k` preserves `Psi_sigma` +concentration under source unit-range dependence. -/ +theorem isBigO_psiSigma_descendantAverage_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hk : k ≤ Q.scale) + (hP : SourceUnitRangeDependentLaw P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_int : ∀ R ∈ descendantsAtScale Q k, Integrable (X R) P) + (hX : ∀ R ∈ descendantsAtScale Q k, IsBigO P (psiSigma σ) (X R) K) + (h_mean : ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) : + IsBigO P (psiSigma σ) + (fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a) + (psiSigmaDescendantsAtScaleConst d k σ * + (Real.sqrt ((descendantsAtScale Q k).card : ℝ) / + ((descendantsAtScale Q k).card : ℝ)) * K) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → Source.Coarse.Carrier d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + let classCount : ScaleColor d k → ℝ := + fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) + let colorCount : ℝ := (((scaleColorPeriod k) ^ d : ℕ) : ℝ) + let totalCount : ℝ := ((descendantsAtScale Q k).card : ℝ) + have hcolors : colors.Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩⟩ + have hClassCount : ∀ c ∈ colors, 0 < classCount c := by + intro c hc + have hnonempty : (descendantsAtScaleScaleColorClass Q k c).Nonempty := + scaleColorClass_nonempty_of_mem_image (Q := Q) (k := k) (c := c) + (by simpa [colors] using hc) + dsimp [classCount] + exact_mod_cast hnonempty.card_pos + have hTotal : 0 < totalCount := by + dsimp [totalCount] + exact_mod_cast (descendantsAtScale_nonempty Q hk).card_pos + have hY : + ∀ c ∈ colors, + IsBigO P (psiSigma σ) (Y c) + (psiSigmaIndependentSumConst σ * Real.sqrt (classCount c) * K) := by + intro c hc + have hcolor := + isBigO_psiSigma_finsetSum_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP hσ hK X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_int R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + simpa [Y, classCount] using hcolor + have hYmeas : ∀ c ∈ colors, Measurable (Y c) := by + intro c hc + simpa [Y] using + (Finset.measurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => + (hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1).measurable)) + have hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount := by + simpa [colors, classCount, colorCount, totalCount] using + scaleColor_sqrt_card_sum_le Q k + have haverage := + isBigO_finsetAverage_colorClassSums_psiSigma + (μ := P) (colors := colors) (Y := Y) (classCount := classCount) + (colorCount := colorCount) (totalCount := totalCount) + (C := psiSigmaIndependentSumConst σ) (K := K) (σ := σ) + hσ hcolors hClassCount hTotal (psiSigmaIndependentSumConst_pos σ) hK + hY hYmeas hSqrt + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have haverage_fun_eq : + (fun a => totalCount⁻¹ * ∑ c ∈ colors, Y c a) = + fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + rw [show (∑ c ∈ colors, Y c a) = + ∑ R ∈ descendantsAtScale Q k, X R a from congrFun hsum_eq a] + simpa [psiSigmaDescendantsAtScaleConst, totalCount, colorCount, haverage_fun_eq, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using haverage + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantMoments.lean new file mode 100644 index 0000000000..e2a4553218 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDescendantMoments.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassMoments +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.MomentCalculus + +/-! +# Real-moment bounds for source descendant sums + +This internal assembly layer combines real-exponent Rosenthal bounds on +source scale-color classes into a bound over all descendants. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +/-- Source-local centered descendants satisfy the real-exponent uniform +Rosenthal bound after aggregation over all scale-color classes. -/ +theorem integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_sourceUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {p K : ℝ} + (hP : SourceUnitRangeDependentLaw P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (X : TriadicCube d → Source.Coarse.Carrier d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hLp_int : + ∀ R ∈ descendantsAtScale Q k, Integrable (fun a => |X R a| ^ p) P) + (hXmean : + ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) + (hK : + ∀ R ∈ descendantsAtScale Q k, + (∫ a, |X R a| ^ p ∂P) ^ p⁻¹ ≤ K) : + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ p⁻¹ ≤ + rosenthalDescendantsAtScaleRpowLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹ * K + + rosenthalDescendantsAtScaleRpowSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + let colors : Finset (ScaleColor d k) := + (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → Source.Coarse.Carrier d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hY_meas : ∀ c ∈ colors, Measurable (Y c) := by + intro c hc + simpa [Y] using + (Finset.measurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => + (hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1).measurable)) + have hY_int : + ∀ c ∈ colors, Integrable (fun a => |Y c a| ^ p) P := by + intro c hc + simpa [Y] using + (_root_.Homogenization.IndependentSums.integrable_abs_finsetSum_rpow + (μ := P) (f := X) (s := descendantsAtScaleScaleColorClass Q k c) hp_one + (fun R hR => + (hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1).measurable) + (fun R hR => hLp_int R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1)) + have hY : + ∀ c ∈ colors, + (∫ a, |Y c a| ^ p ∂P) ^ p⁻¹ ≤ + 2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) := by + intro c hc + simpa [Y] using + (integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP hp hK_nonneg X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hLp_int R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hXmean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hK R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1)) + have hsum : + (∫ a, |∑ c ∈ colors, Y c a| ^ p ∂P) ^ p⁻¹ ≤ + ∑ c ∈ colors, (∫ a, |Y c a| ^ p ∂P) ^ p⁻¹ := by + exact _root_.Homogenization.IndependentSums.integral_abs_finsetSum_rpow_rpow_inv_le_sum + (μ := P) hp_one hY_meas hY_int + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl fun c hc => ?_ + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion fun c hc c' hc' hne => + disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hne + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have hsum_card_eq : + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) = + ((descendantsAtScale Q k).card : ℝ) := by + rw [← Nat.cast_sum] + exact_mod_cast (card_descendantsAtScale_eq_sum_card_scaleColorClass_image Q k).symm + have hcolors_card_le : + (colors.card : ℝ) ≤ (((scaleColorPeriod k) ^ d : ℕ) : ℝ) := by + exact_mod_cast (card_image_cubeScaleColor_descendantsAtScale_le Q k) + have hexp_nonneg : 0 ≤ 1 - p⁻¹ := by + have hpinv_le_one : p⁻¹ ≤ 1 := by + exact inv_le_one_of_one_le₀ hp_one + linarith + have hcolors_card_rpow_le : + (colors.card : ℝ) ^ (1 - p⁻¹) ≤ + (((scaleColorPeriod k) ^ d : ℕ) : ℝ) ^ (1 - p⁻¹) := by + exact Real.rpow_le_rpow (by positivity) hcolors_card_le hexp_nonneg + have hsum_rpow_le : + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ ≤ + (((scaleColorPeriod k) ^ d : ℕ) : ℝ) ^ (1 - p⁻¹) * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹ := by + have hbase := + _root_.Homogenization.IndependentSums.sum_rpow_inv_le_card_rpow_mul_rpow_sum + (s := colors) (p := p) + (f := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + hp_one (by + intro c hc + positivity) + rw [hsum_card_eq] at hbase + exact hbase.trans (mul_le_mul_of_nonneg_right hcolors_card_rpow_le (by positivity)) + have hsqrt_sum_le : + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (((scaleColorPeriod k) ^ d : ℕ) : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + have hbase : + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (colors.card : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + simpa [hsum_card_eq] using + (Real.sum_sqrt_mul_sqrt_le + (s := colors) (f := fun _ => (1 : ℝ)) + (g := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (hf := fun c => by positivity) (hg := fun c => by positivity)) + exact hbase.trans + (mul_le_mul_of_nonneg_right (Real.sqrt_le_sqrt hcolors_card_le) (by positivity)) + have hA_sum : + ∑ c ∈ colors, + 2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K) ≤ + rosenthalDescendantsAtScaleRpowLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹ * K := by + calc + ∑ c ∈ colors, + 2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K) = + (2 * p * K) * + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c hc => ?_ + ring + _ ≤ 2 * p * + ((((scaleColorPeriod k) ^ d : ℕ) : ℝ) ^ (1 - p⁻¹) * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹) * K := by + have hmul := mul_le_mul_of_nonneg_left hsum_rpow_le (by positivity : 0 ≤ 2 * p * K) + simpa [mul_assoc, mul_left_comm, mul_comm] using hmul + _ = rosenthalDescendantsAtScaleRpowLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹ * K := by + rw [rosenthalDescendantsAtScaleRpowLpConst] + ring_nf + have hB_sum : + ∑ c ∈ colors, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) ≤ + rosenthalDescendantsAtScaleRpowSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst, IndependentSums.rosenthalBennettIntegralConst] + positivity + calc + ∑ c ∈ colors, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) = + (4 * rosenthalBennettIntegralConst * Real.sqrt p * K) * + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun c hc => ?_ + ring + _ ≤ 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + ((Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ)) * K)) := by + have hmul := mul_le_mul_of_nonneg_left hsqrt_sum_le + (by positivity : 0 ≤ 4 * rosenthalBennettIntegralConst * Real.sqrt p * K) + simpa [mul_assoc, mul_left_comm, mul_comm] using hmul + _ = rosenthalDescendantsAtScaleRpowSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + simp [rosenthalDescendantsAtScaleRpowSqrtConst] + ring + calc + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ p⁻¹ = + (∫ a, |∑ c ∈ colors, Y c a| ^ p ∂P) ^ p⁻¹ := by + congr 1 + apply integral_congr_ae + exact Filter.Eventually.of_forall fun a => by + have hpoint := congrArg (fun F : Source.Coarse.Carrier d → ℝ => |F a| ^ p) hsum_eq + simpa using hpoint.symm + _ ≤ ∑ c ∈ colors, (∫ a, |Y c a| ^ p ∂P) ^ p⁻¹ := hsum + _ ≤ ∑ c ∈ colors, + (2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K))) := by + exact Finset.sum_le_sum fun c hc => hY c hc + _ = (∑ c ∈ colors, + 2 * p * (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ p⁻¹ * K)) + + (∑ c ∈ colors, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K))) := by + rw [Finset.sum_add_distrib] + _ ≤ rosenthalDescendantsAtScaleRpowLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ p⁻¹ * K + + rosenthalDescendantsAtScaleRpowSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := + add_le_add hA_sum hB_sum + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDilationLaw.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDilationLaw.lean new file mode 100644 index 0000000000..9e9c655014 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceDilationLaw.lean @@ -0,0 +1,46 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RescaledLaws + +/-! +# Dilation of exact coarse-source Chapter 4 laws + +This is the thin Chapter 4 wrapper around the source-side normalized-law +kernel. Probability remains separate from the structural-law bundle. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +/-- Probability is preserved by exact-source triadic scale-normalization. -/ +theorem isProbabilityMeasure_sourceScaleNormalizedLaw {d : ℕ} (k : ℕ) + (P : SourceCoeffLaw d) [IsProbabilityMeasure P] : + IsProbabilityMeasure (Source.Coarse.scaleNormalizedLaw k P) := + Source.Coarse.isProbabilityMeasure_scaleNormalizedLaw k P + +namespace SourceStructuralLaw + +/-- The exact coarse-source structural law is preserved by triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : SourceCoeffLaw d} + (hP : SourceStructuralLaw P) (k : ℕ) : + SourceStructuralLaw (Source.Coarse.scaleNormalizedLaw k P) where + stationary := Source.Coarse.IsStationary.scaleNormalized hP.stationary k + unit_range := Source.Coarse.IsUnitRangeDependent.scaleNormalized hP.unit_range k + isotropic_and_adjoint_invariant := + Source.Coarse.IsIsotropicAndAdjointInvariant.scaleNormalized + hP.isotropic_and_adjoint_invariant k + +end SourceStructuralLaw + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceEllipticity.lean new file mode 100644 index 0000000000..210b14c20d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceEllipticity.lean @@ -0,0 +1,75 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse + +/-! +# Deterministic ellipticity slices for the exact coarse source + +Every coarse-source carrier field is locally uniformly elliptic on source +Euclidean balls. This file converts that carrier membership fact into the +countable AEE ellipticity slices used on a fixed triadic cube without invoking +any probabilistic assumptions. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +private theorem cubeSet_subset_sourceEuclideanBall {d : ℕ} (Q : TriadicCube d) : + ∃ R : ℝ, 1 ≤ R ∧ cubeSet Q ⊆ Source.Coarse.euclideanBall R := by + let e : Vec d ≃L[ℝ] EuclideanSpace ℝ (Fin d) := + (PiLp.continuousLinearEquiv 2 ℝ fun _ : Fin d => ℝ).symm + obtain ⟨C, hC⟩ := (isBounded_cubeSet Q).exists_norm_le + refine ⟨max 1 (‖e.toContinuousLinearMap‖ * C + 1), le_max_left _ _, ?_⟩ + intro x hx + have hxC : euclideanNorm x ≤ ‖e.toContinuousLinearMap‖ * C := by + calc + euclideanNorm x = ‖HilbertVec.ofVec x‖ := euclideanNorm_eq_norm_ofVec x + _ = ‖e x‖ := rfl + _ ≤ ‖e.toContinuousLinearMap‖ * C := + e.toContinuousLinearMap.le_opNorm_of_le (hC x hx) + change euclideanNorm x < max 1 (‖e.toContinuousLinearMap‖ * C + 1) + exact hxC.trans_lt ((lt_add_one _).trans_le (le_max_right _ _)) + +/-- A coarse-source carrier field has positive a.e. ellipticity constants on +every triadic cube. The only inputs are its coordinate measurability and its +pointwise source-ball ellipticity from carrier membership. -/ +theorem exists_source_isAEEllipticFieldOn_cubeSet {d : ℕ} + (a : Source.Coarse.Carrier d) (Q : TriadicCube d) : + ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ + IsAEEllipticFieldOn ε ε⁻¹ (cubeSet Q) a.1 := by + classical + obtain ⟨R, hR, hQR⟩ := cubeSet_subset_sourceEuclideanBall Q + obtain ⟨ε, hε_pos, hε_le_one, hEll⟩ := a.2.2 R hR + have hmeas : + Measurable (fun x i j => if x ∈ cubeSet Q then a.1 x i j else 0) := by + refine (measurable_pi_iff).2 fun i => (measurable_pi_iff).2 fun j => ?_ + have heq : (fun x => if x ∈ cubeSet Q then a.1 x i j else 0) = + Set.indicator (cubeSet Q) (fun x => a.1 x i j) := by + funext x + by_cases hx : x ∈ cubeSet Q <;> simp [hx] + rw [heq] + exact (a.2.1 i j).indicator (measurableSet_cubeSet Q) + have hEll_cube : IsEllipticFieldOn ε ε⁻¹ (cubeSet Q) a.1 := + ⟨hmeas, fun x hx => hEll x (hQR hx)⟩ + exact ⟨ε, hε_pos, hε_le_one, + IsAEEllipticFieldOn.of_isEllipticFieldOn hEll_cube⟩ + +/-- Every coarse-source carrier field belongs to a countable AEE ellipticity +slice on every triadic cube. -/ +theorem exists_source_aeeQuantitativeEllipticSlice_cubeSet {d : ℕ} + (a : Source.Coarse.Carrier d) (Q : TriadicCube d) : + ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.1 := by + obtain ⟨ε, hε_pos, -, hEll⟩ := exists_source_isAEEllipticFieldOn_cubeSet a Q + exact AEEQuantitativeEllipticSlice.exists_of_aeeEllipticOn hε_pos hEll + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceIndependence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceIndependence.lean new file mode 100644 index 0000000000..c176ba9fa4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceIndependence.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable + +/-! +# Independence of exact coarse-source local random variables + +This module promotes the coarse source's unit-range-dependence law to finite +independence of its exact local sigma algebras and observables. It is separate +from the regular-carrier restriction-local compatibility lane. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +/-- Source-local finite independence for Euclidean-unit-separated regions. -/ +theorem iIndep_sourceLocalSigma_of_sourceUnitRangeDependentLaw {d : ℕ} {ι : Type*} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {U : ι → Set (Vec d)} + (hU : ∀ i, MeasurableSet (U i)) + (hP : SourceUnitRangeDependentLaw P) + (hsep : Pairwise fun i j => Source.Coarse.EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndep (fun i => Source.Coarse.localSigma (U i) (hU i)) P := + Source.Coarse.iIndep_localSigma_of_pairwise_euclideanUnitSeparated P hP hU hsep + +/-- Source-local random variables on Euclidean-unit-separated regions are +independent. -/ +theorem iIndepFun_of_sourceLocalRandomVariable_of_sourceUnitRangeDependentLaw + {d : ℕ} {ι : Type*} {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {U : ι → Set (Vec d)} {X : ∀ i, Source.Coarse.Carrier d → β i} + (hU : ∀ i, MeasurableSet (U i)) + (hP : SourceUnitRangeDependentLaw P) + (hX : ∀ i, IsSourceLocalRandomVariable (U i) (hU i) (X i)) + (hsep : Pairwise fun i j => Source.Coarse.EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndepFun X P := + Source.Coarse.iIndepFun_of_localObservable_of_pairwise_euclideanUnitSeparated + P hP hU hX hsep + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLaw.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLaw.lean new file mode 100644 index 0000000000..e7e4f47619 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLaw.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Laws + +/-! +# Exact coarse-source Chapter 4 laws + +This is the staging law surface for the coarse-graining source. Its carrier +and probability assumptions are deliberately separate from the existing +regular/restriction Chapter 4 lane. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +/-- A Chapter 4 law on the exact coarse source carrier. -/ +abbrev SourceCoeffLaw (d : ℕ) : Type _ := + Measure (Source.Coarse.Carrier d) + +/-- The coarse source stationarity assumption (P1). -/ +abbrev SourceStationaryLaw {d : ℕ} (P : SourceCoeffLaw d) : Prop := + Source.Coarse.IsStationary P + +/-- The coarse source Euclidean unit-range dependence assumption (P2). -/ +abbrev SourceUnitRangeDependentLaw {d : ℕ} (P : SourceCoeffLaw d) : Prop := + Source.Coarse.IsUnitRangeDependent P + +/-- The coarse source joint isotropy and adjoint-invariance assumption (P3). -/ +abbrev SourceIsotropicAndAdjointInvariantLaw {d : ℕ} (P : SourceCoeffLaw d) : Prop := + Source.Coarse.IsIsotropicAndAdjointInvariant P + +/-- The three structural assumptions of the coarse-graining source. + +Probability is intentionally not bundled here: clients state it separately as +an `IsProbabilityMeasure` instance when it is needed. -/ +structure SourceStructuralLaw {d : ℕ} (P : SourceCoeffLaw d) : Prop where + stationary : SourceStationaryLaw P + unit_range : SourceUnitRangeDependentLaw P + isotropic_and_adjoint_invariant : SourceIsotropicAndAdjointInvariantLaw P + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLocalCoefficient.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLocalCoefficient.lean new file mode 100644 index 0000000000..f8378107f2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceLocalCoefficient.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField + +/-! +# Source-local coefficient observables + +This module provides the exact coarse-source local version of the smooth +coefficient-field test, independently of the regular-carrier observable lane. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +noncomputable section + +/-- The smooth coefficient-field test is directly measurable for the exact +coarse-source local integral sigma algebra. -/ +theorem source_isLocalObservable_localTestObservable {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (e e' : Vec d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + Source.Coarse.IsLocalObservable U hU + (fun a : Source.Coarse.Carrier d => localTestObservable e e' φ a.1) := by + change @Measurable (Source.Coarse.Carrier d) ℝ (Source.Coarse.localSigma U hU) _ + (fun a : Source.Coarse.Carrier d => localTestObservable e e' φ a.1) + have htest : + (fun a : Source.Coarse.Carrier d => localTestObservable e e' φ a.1) = + Source.Coarse.bilinearTest e e' φ := by + rfl + rw [htest] + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨e, e', φ, ⟨hφ_cont, hφ_compact⟩, hφ_support, t, ht, rfl⟩ + +namespace SourceObservable + +/-- The smooth coefficient-field test observable, bundled for the exact coarse +source carrier. Its locality is the direct source-local test generator theorem. -/ +noncomputable def localTest {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (e e' : Vec d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + SourceObservable d U ℝ where + measurableSet := hU + toFun := fun a => localTestObservable e e' φ a.1 + isLocal := + source_isLocalObservable_localTestObservable hU e e' hφ_cont hφ_compact hφ_support + +@[simp] +theorem localTest_apply {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (e e' : Vec d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) (a : Source.Coarse.Carrier d) : + localTest hU e e' hφ_cont hφ_compact hφ_support a = + localTestObservable e e' φ a.1 := + rfl + +end SourceObservable + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMeasurability.lean new file mode 100644 index 0000000000..5b33239afc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMeasurability.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import Mathlib.MeasureTheory.Function.StronglyMeasurable.AEStronglyMeasurable +public import Mathlib.Topology.Metrizable.Basic + +/-! +# Measurability of exact coarse-source local random variables + +All promotions stay on the exact coarse source carrier. In particular, no +regular-carrier or restriction-sigma bridge is used here. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +namespace IsSourceLocalRandomVariable + +/-- A source-local random variable is measurable for the source global sigma +algebra. -/ +theorem measurable {β : Type*} [MeasurableSpace β] {d : ℕ} + {U : Set (Vec d)} {hU : MeasurableSet U} {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) : + Measurable X := + Measurable.mono hX + (Source.Coarse.localSigma_mono hU MeasurableSet.univ (fun _ _ => Set.mem_univ _)) le_rfl + +/-- A source-local random variable is null-measurable under every source law. -/ +theorem nullMeasurable {β : Type*} [MeasurableSpace β] {d : ℕ} + {P : SourceCoeffLaw d} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) : + NullMeasurable X P := by + intro s hs + exact ((hX.measurable) hs).nullMeasurableSet + +/-- A source-local random variable is a.e. measurable under every source law. -/ +theorem aemeasurable {β : Type*} [MeasurableSpace β] + {d : ℕ} {P : SourceCoeffLaw d} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) : + AEMeasurable X P := + hX.measurable.aemeasurable + +/-- A source-local random variable into a second-countable pseudometrizable +measurable space is a.e. strongly measurable under every source law. -/ +theorem aestronglyMeasurable {β : Type*} [TopologicalSpace β] + [MeasurableSpace β] [TopologicalSpace.PseudoMetrizableSpace β] + [OpensMeasurableSpace β] [SecondCountableTopology β] + {d : ℕ} {P : SourceCoeffLaw d} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) : + AEStronglyMeasurable X P := + hX.measurable.aestronglyMeasurable + +end IsSourceLocalRandomVariable + +namespace SourceObservable + +/-- A bundled source observable is null-measurable under every source law. -/ +theorem nullMeasurable {β : Type*} [MeasurableSpace β] {d : ℕ} + {P : SourceCoeffLaw d} {U : Set (Vec d)} (X : SourceObservable d U β) : + NullMeasurable X P := + X.isLocal.nullMeasurable (P := P) + +/-- A bundled source observable is a.e. measurable under every source law. -/ +theorem aemeasurable {β : Type*} [MeasurableSpace β] + {d : ℕ} {P : SourceCoeffLaw d} {U : Set (Vec d)} (X : SourceObservable d U β) : + AEMeasurable X P := + X.isLocal.measurable.aemeasurable + +/-- A bundled source observable into a second-countable pseudometrizable +measurable space is a.e. strongly measurable under every source law. -/ +theorem aestronglyMeasurable {β : Type*} [TopologicalSpace β] + [MeasurableSpace β] [TopologicalSpace.PseudoMetrizableSpace β] + [OpensMeasurableSpace β] [SecondCountableTopology β] + {d : ℕ} {P : SourceCoeffLaw d} {U : Set (Vec d)} (X : SourceObservable d U β) : + AEStronglyMeasurable X P := + X.isLocal.measurable.aestronglyMeasurable + +end SourceObservable + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMu.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMu.lean new file mode 100644 index 0000000000..cd3ae2da27 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceMu.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RegIntegralAdapter + +/-! +# Source-local coarse-grained energy + +The exact coarse-source carrier has deterministic AEE-slice coverage on each +triadic cube. On every slice, the coarse-to-regular integral realization lets +the carrier `Mu` engine consume the source's smooth integral observables. A +countable `liftCover` then gives an exactly source-local, pointwise equal +version of `Mu`. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +noncomputable section + +private theorem measurableSet_sourceLocal_aeeSlice {d : ℕ} (Q : TriadicCube d) + (k : ℕ) : + @MeasurableSet (Source.Coarse.Carrier d) + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) + {a : Source.Coarse.Carrier d | + AEEQuantitativeEllipticSlice (cubeSet Q) k a.1} := + (measurableSet_smoothLocalSigmaR_aeeSlice Q k).preimage + (Source.Coarse.measurable_coarseToRegular_smoothLocal + (cubeSet Q) (measurableSet_cubeSet Q)) + +/-- The exact coarse-source energy on a triadic cube is source-local. Its +proof uses only deterministic source-carrier slice coverage. -/ +theorem isSourceLocalRandomVariable_Mu_cubeSet {d : ℕ} + (Q : TriadicCube d) (P0 : BlockVec d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => Mu (cubeSet Q) P0 a.1) := by + classical + let slice : ℕ → Set (Source.Coarse.Carrier d) := + fun k => {a | AEEQuantitativeEllipticSlice (cubeSet Q) k a.1} + let covered : Set (Source.Coarse.Carrier d) := ⋃ k : ℕ, slice k + let cover : Option ℕ → Set (Source.Coarse.Carrier d) + | none => coveredᶜ + | some k => slice k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some _k, a => Mu (cubeSet Q) P0 (Source.Coarse.coarseToRegular a.1).toFun + have hagree : + ∀ (i j : Option ℕ) (a : Source.Coarse.Carrier d) + (hai : a ∈ cover i) (haj : a ∈ cover j), + f i ⟨a, hai⟩ = f j ⟨a, haj⟩ := by + intro i j a hai haj + cases i with + | none => + cases j with + | none => rfl + | some k => exact absurd (Set.mem_iUnion.mpr ⟨k, haj⟩) hai + | some k => + cases j with + | none => exact absurd (Set.mem_iUnion.mpr ⟨k, hai⟩) haj + | some _ => rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext a + refine ⟨fun _ => Set.mem_univ a, fun _ => ?_⟩ + by_cases ha : a ∈ covered + · rcases Set.mem_iUnion.mp ha with ⟨k, hk⟩ + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using ha⟩ + let Y : Source.Coarse.Carrier d → ℝ := Set.liftCover cover f hagree hcover + have hY_local : + @Measurable (Source.Coarse.Carrier d) ℝ + (Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q)) _ Y := by + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => + exact (MeasurableSet.iUnion fun k => + measurableSet_sourceLocal_aeeSlice Q k).compl + | some k => exact measurableSet_sourceLocal_aeeSlice Q k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hEntry : + ∀ (i' j' : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (cover (some k)) ℝ _ _ + (fun x => entryTestR i' j' φ + (Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d))) := by + intro i' j' φ hφ_cont hφ_compact hφ_support + have hentry_smooth : + @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR (cubeSet Q)) _ + (entryTestR i' j' φ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i', j', φ, hφ_cont, hφ_compact, hφ_support, t, ht, rfl⟩ + exact hentry_smooth.comp + ((Source.Coarse.measurable_coarseToRegular_smoothLocal + (cubeSet Q) (measurableSet_cubeSet Q)).comp measurable_subtype_coe) + simpa [f] using + measurable_Mu_comp_aeeSlice_of_measurable_entryTest Q + (A := fun x : cover (some k) => + Source.Coarse.coarseToRegular (x : Source.Coarse.Carrier d)) + (fun x => x.2) hEntry P0 + exact measurable_liftCover cover hcover_meas f hfm hagree hcover + have hY_eq : (fun a : Source.Coarse.Carrier d => Mu (cubeSet Q) P0 a.1) = Y := by + funext a + obtain ⟨k, hak⟩ := exists_source_aeeQuantitativeEllipticSlice_cubeSet a Q + have ha_cover : a ∈ cover (some k) := hak + change Mu (cubeSet Q) P0 a.1 = Set.liftCover cover f hagree hcover a + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) ha_cover] + rfl + rw [hY_eq] + exact hY_local + +namespace SourceObservable + +/-- The coarse-grained energy on a triadic cube, bundled as an exact +source-local observable. -/ +noncomputable def mu {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) : + SourceObservable d (cubeSet Q) ℝ where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => Mu (cubeSet Q) P0 a.1 + isLocal := isSourceLocalRandomVariable_Mu_cubeSet Q P0 + +@[simp] +theorem mu_apply {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) + (a : Source.Coarse.Carrier d) : + mu Q P0 a = Mu (cubeSet Q) P0 a.1 := + rfl + +end SourceObservable + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceObservable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceObservable.lean new file mode 100644 index 0000000000..0431773b19 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceObservable.lean @@ -0,0 +1,294 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import Mathlib.MeasureTheory.Constructions.Pi + +/-! +# Exact coarse-source local observables + +Locality in this file is measurability for the coarse source's integral-only +sigma algebra. It is intentionally separate from restriction locality. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +/-- Matrices use the product measurable space of their real entries. -/ +instance instMeasurableSpaceMat (d : ℕ) : MeasurableSpace (Mat d) := + inferInstanceAs (MeasurableSpace (Fin d → Fin d → ℝ)) + +/-- A random variable local for the exact coarse source sigma algebra. -/ +def IsSourceLocalRandomVariable {β : Type*} [MeasurableSpace β] {d : ℕ} + (U : Set (Vec d)) (hU : MeasurableSet U) (X : Source.Coarse.Carrier d → β) : Prop := + Source.Coarse.IsLocalObservable U hU X + +namespace IsSourceLocalRandomVariable + +/-- Enlarge the observation set of a source-local random variable. -/ +theorem mono {β : Type*} [MeasurableSpace β] {d : ℕ} + {U V : Set (Vec d)} {X : Source.Coarse.Carrier d → β} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) + (hX : IsSourceLocalRandomVariable U hU X) : + IsSourceLocalRandomVariable V hV X := + Measurable.mono hX (Source.Coarse.localSigma_mono hU hV hUV) le_rfl + +/-- Constant source-local random variables. -/ +theorem const {β : Type*} [MeasurableSpace β] {d : ℕ} + (U : Set (Vec d)) (hU : MeasurableSet U) (b : β) : + IsSourceLocalRandomVariable U hU (fun _a : Source.Coarse.Carrier d => b) := + measurable_const + +/-- Measurable postcomposition preserves source locality. -/ +theorem comp_measurable {β γ : Type*} [MeasurableSpace β] [MeasurableSpace γ] + {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) {g : β → γ} (hg : Measurable g) : + IsSourceLocalRandomVariable U hU (fun a => g (X a)) := + hg.comp hX + +/-- Precomposing a source-local random variable with coefficient translation +translates its observation region by the same integer vector. -/ +theorem comp_translate {β : Type*} [MeasurableSpace β] {d : ℕ} + {U : Set (Vec d)} {hU : MeasurableSet U} {X : Source.Coarse.Carrier d → β} + (hX : IsSourceLocalRandomVariable U hU X) (z : Fin d → ℤ) : + IsSourceLocalRandomVariable (translateSet (intVecToRealVec z) U) (by + rw [← preimage_subRight_eq_translateSet] + exact hU.preimage (Homeomorph.subRight _).continuous.measurable) + (X ∘ Source.Coarse.Carrier.translate z) := + Source.Coarse.IsLocalObservable.comp_translate hU hX z + +/-- Source locality of a vector-valued random variable follows componentwise. -/ +theorem vec_of_components {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → Vec m} + (hX : ∀ i : Fin m, IsSourceLocalRandomVariable U hU (fun a => X a i)) : + IsSourceLocalRandomVariable U hU X := by + change @Measurable (Source.Coarse.Carrier d) (Vec m) (Source.Coarse.localSigma U hU) _ X + rw [@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) X] + intro i + exact hX i + +/-- Components of a source-local vector-valued random variable are source-local. -/ +theorem vec_component {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → Vec m} + (hX : IsSourceLocalRandomVariable U hU X) (i : Fin m) : + IsSourceLocalRandomVariable U hU (fun a => X a i) := by + change @Measurable (Source.Coarse.Carrier d) ℝ (Source.Coarse.localSigma U hU) _ + (fun a => X a i) + exact ((@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) X).mp hX) i + +/-- Source locality of a matrix-valued random variable follows entrywise. -/ +theorem mat_of_entries {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → Mat m} + (hX : ∀ i j : Fin m, IsSourceLocalRandomVariable U hU (fun a => X a i j)) : + IsSourceLocalRandomVariable U hU X := by + change @Measurable (Source.Coarse.Carrier d) (Mat m) (Source.Coarse.localSigma U hU) _ X + refine (@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => Fin m → ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) X).2 fun i => ?_ + refine (@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) (fun a => X a i)).2 fun j => ?_ + exact hX i j + +/-- Entries of a source-local matrix-valued random variable are source-local. -/ +theorem mat_entry {d m : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → Mat m} + (hX : IsSourceLocalRandomVariable U hU X) (i j : Fin m) : + IsSourceLocalRandomVariable U hU (fun a => X a i j) := by + change @Measurable (Source.Coarse.Carrier d) ℝ (Source.Coarse.localSigma U hU) _ + (fun a => X a i j) + have hi : + @Measurable (Source.Coarse.Carrier d) (Fin m → ℝ) (Source.Coarse.localSigma U hU) _ + (fun a => X a i) := + ((@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => Fin m → ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) X).mp hX) i + exact ((@measurable_pi_iff (Source.Coarse.Carrier d) (Fin m) (fun _ => ℝ) + (Source.Coarse.localSigma U hU) (fun _ => inferInstance) (fun a => X a i)).mp hi) j + +/-- Sum of source-local real random variables. -/ +theorem add {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) (hY : IsSourceLocalRandomVariable U hU Y) : + IsSourceLocalRandomVariable U hU (fun a => X a + Y a) := + Measurable.add hX hY + +/-- Negation of a source-local real random variable. -/ +theorem neg {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) : + IsSourceLocalRandomVariable U hU (fun a => -X a) := + Measurable.neg hX + +/-- Difference of source-local real random variables. -/ +theorem sub {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) (hY : IsSourceLocalRandomVariable U hU Y) : + IsSourceLocalRandomVariable U hU (fun a => X a - Y a) := + Measurable.sub hX hY + +/-- Product of source-local real random variables. -/ +theorem mul {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X Y : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) (hY : IsSourceLocalRandomVariable U hU Y) : + IsSourceLocalRandomVariable U hU (fun a => X a * Y a) := + Measurable.mul hX hY + +/-- Inverse of a source-local real random variable. -/ +theorem inv {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) : + IsSourceLocalRandomVariable U hU (fun a => (X a)⁻¹) := + Measurable.inv hX + +/-- Absolute value of a source-local real random variable. -/ +theorem abs {d : ℕ} {U : Set (Vec d)} {hU : MeasurableSet U} + {X : Source.Coarse.Carrier d → ℝ} + (hX : IsSourceLocalRandomVariable U hU X) : + IsSourceLocalRandomVariable U hU (fun a => |X a|) := + continuous_abs.measurable.comp hX + +/-- Finite sums of source-local real random variables are source-local. -/ +theorem finset_sum {d : ℕ} {ι : Type*} [Fintype ι] + {U : Set (Vec d)} {hU : MeasurableSet U} {X : ι → Source.Coarse.Carrier d → ℝ} + (hX : ∀ i, IsSourceLocalRandomVariable U hU (X i)) : + IsSourceLocalRandomVariable U hU (fun a => ∑ i, X i a) := by + classical + exact Finset.measurable_sum Finset.univ fun i _hi => hX i + +end IsSourceLocalRandomVariable + +/-- A bundled observable local for the exact coarse source sigma algebra. -/ +structure SourceObservable (d : ℕ) (U : Set (Vec d)) (β : Type*) + [MeasurableSpace β] where + measurableSet : MeasurableSet U + toFun : Source.Coarse.Carrier d → β + isLocal : IsSourceLocalRandomVariable U measurableSet toFun + +namespace SourceObservable + +variable {d m : ℕ} {U V : Set (Vec d)} + +instance {β : Type*} [MeasurableSpace β] : + CoeFun (SourceObservable d U β) (fun _ => Source.Coarse.Carrier d → β) := + ⟨SourceObservable.toFun⟩ + +/-- Enlarge the observation set of a bundled source observable. -/ +def mono {β : Type*} [MeasurableSpace β] (X : SourceObservable d U β) + (hV : MeasurableSet V) (hUV : U ⊆ V) : SourceObservable d V β where + measurableSet := hV + toFun := X + isLocal := X.isLocal.mono X.measurableSet hV hUV + +/-- Constant bundled source observables. -/ +def const {β : Type*} [MeasurableSpace β] (U : Set (Vec d)) (hU : MeasurableSet U) + (b : β) : SourceObservable d U β where + measurableSet := hU + toFun := fun _a => b + isLocal := IsSourceLocalRandomVariable.const U hU b + +/-- Measurable postcomposition of a bundled source observable. -/ +def comp {β γ : Type*} [MeasurableSpace β] [MeasurableSpace γ] + (X : SourceObservable d U β) (g : β → γ) (hg : Measurable g) : + SourceObservable d U γ where + measurableSet := X.measurableSet + toFun := fun a => g (X a) + isLocal := X.isLocal.comp_measurable hg + +/-- Translate a bundled source observable together with its observation +region. -/ +def translate {β : Type*} [MeasurableSpace β] (X : SourceObservable d U β) + (z : Fin d → ℤ) : + SourceObservable d (translateSet (intVecToRealVec z) U) β where + measurableSet := by + rw [← preimage_subRight_eq_translateSet] + exact X.measurableSet.preimage (Homeomorph.subRight _).continuous.measurable + toFun := X ∘ Source.Coarse.Carrier.translate z + isLocal := X.isLocal.comp_translate z + +@[simp] theorem translate_apply {β : Type*} [MeasurableSpace β] + (X : SourceObservable d U β) (z : Fin d → ℤ) (a : Source.Coarse.Carrier d) : + X.translate z a = X (Source.Coarse.Carrier.translate z a) := + rfl + +/-- Build a vector-valued bundled source observable from bundled components. -/ +def vecOfComponents (hU : MeasurableSet U) (X : Fin m → SourceObservable d U ℝ) : + SourceObservable d U (Vec m) where + measurableSet := hU + toFun := fun a i => X i a + isLocal := IsSourceLocalRandomVariable.vec_of_components (hU := hU) fun i => (X i).isLocal + +/-- Extract one component of a vector-valued bundled source observable. -/ +def vecComponent (X : SourceObservable d U (Vec m)) (i : Fin m) : + SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a i + isLocal := X.isLocal.vec_component i + +/-- Build a matrix-valued bundled source observable from bundled entries. -/ +def matOfEntries (hU : MeasurableSet U) + (X : Fin m → Fin m → SourceObservable d U ℝ) : SourceObservable d U (Mat m) where + measurableSet := hU + toFun := fun a i j => X i j a + isLocal := IsSourceLocalRandomVariable.mat_of_entries (hU := hU) fun i j => (X i j).isLocal + +/-- Extract one entry of a matrix-valued bundled source observable. -/ +def matEntry (X : SourceObservable d U (Mat m)) (i j : Fin m) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a i j + isLocal := X.isLocal.mat_entry i j + +/-- Sum of bundled source observables. -/ +protected def add (X Y : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a + Y a + isLocal := X.isLocal.add Y.isLocal + +/-- Negation of a bundled source observable. -/ +protected def neg (X : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => -X a + isLocal := X.isLocal.neg + +/-- Difference of bundled source observables. -/ +protected def sub (X Y : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a - Y a + isLocal := X.isLocal.sub Y.isLocal + +/-- Product of bundled source observables. -/ +protected def mul (X Y : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => X a * Y a + isLocal := X.isLocal.mul Y.isLocal + +/-- Inverse of a bundled source observable. -/ +protected noncomputable def inv (X : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => (X a)⁻¹ + isLocal := X.isLocal.inv + +/-- Absolute value of a bundled source observable. -/ +protected def abs (X : SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := X.measurableSet + toFun := fun a => |X a| + isLocal := X.isLocal.abs + +/-- Finite sum of bundled source observables. -/ +def finsetSum {ι : Type*} [Fintype ι] (hU : MeasurableSet U) + (X : ι → SourceObservable d U ℝ) : SourceObservable d U ℝ where + measurableSet := hU + toFun := fun a => ∑ i, X i a + isLocal := IsSourceLocalRandomVariable.finset_sum (hU := hU) fun i => (X i).isLocal + +end SourceObservable + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageDefinitions.lean new file mode 100644 index 0000000000..fbf4b869e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageDefinitions.lean @@ -0,0 +1,53 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.TriadicCubeTranslation + +/-! +# Source-carrier partition-average definitions + +The exact coarse-source counterparts of the origin-cube partition averages. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- An integrable one-origin source observable centered by its expectation. -/ +noncomputable def sourceCenteredObservable {d : ℕ} (P : SourceCoeffLaw d) + (X : Source.Coarse.Carrier d → ℝ) (_hX_int : Integrable X P) : + Source.Coarse.Carrier d → ℝ := + fun a => X a - ∫ b, X b ∂P + +/-- The one-origin source observable transported by an arbitrary integer shift. -/ +noncomputable def sourceTranslatedObservable {d : ℕ} (z : Fin d → ℤ) + (X : Source.Coarse.Carrier d → ℝ) : + Source.Coarse.Carrier d → ℝ := + X ∘ Source.Coarse.Carrier.translate z + +/-- The centered average of an integrable one-origin observable transported to +the scale-`n` descendants of the origin cube at scale `m`. -/ +noncomputable def sourceCenteredTranslatedDescendantAverage {d : ℕ} + (P : SourceCoeffLaw d) (n m : ℤ) (_hn : 0 ≤ n) (_hnm : n ≤ m) + (X : Source.Coarse.Carrier d → ℝ) (_hX_int : Integrable X P) : + Source.Coarse.Carrier d → ℝ := + fun a => + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, + (sourceTranslatedObservable (scaleTranslationShift n R) X a - ∫ b, X b ∂P) + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageFluctuations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageFluctuations.lean new file mode 100644 index 0000000000..0b2e98c0e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageFluctuations.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceStationaryExpectations + +/-! +# One-origin source partition-average fluctuations + +These estimates transport a single source-local observable from the origin +cube to every descendant using source stationarity and unit-range dependence. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +private theorem isBigO_gammaSigma_iff_of_map_eq_map + {d : ℕ} {P : SourceCoeffLaw d} {σ A : ℝ} + {f g : Source.Coarse.Carrier d → ℝ} + (hf : Measurable f) (hg : Measurable g) + (hmap : Measure.map f P = Measure.map g P) : + IsBigO P (gammaSigma σ) f A ↔ IsBigO P (gammaSigma σ) g A := by + rw [isBigO_gammaSigma_iff, isBigO_gammaSigma_iff] + constructor + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hfg : + P.real (absTailEvent f (A * t)) = P.real (absTailEvent g (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real + rw [← hfg] + exact h ht + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hgf : + P.real (absTailEvent g (A * t)) = P.real (absTailEvent f (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real.symm + rw [← hgf] + exact h ht + +private theorem isBigO_psiSigma_iff_of_map_eq_map + {d : ℕ} {P : SourceCoeffLaw d} {σ A : ℝ} + {f g : Source.Coarse.Carrier d → ℝ} + (hf : Measurable f) (hg : Measurable g) + (hmap : Measure.map f P = Measure.map g P) : + IsBigO P (psiSigma σ) f A ↔ IsBigO P (psiSigma σ) g A := by + rw [isBigO_psiSigma_iff, isBigO_psiSigma_iff] + constructor + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hfg : + P.real (absTailEvent f (A * t)) = P.real (absTailEvent g (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real + rw [← hfg] + exact h ht + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hgf : + P.real (absTailEvent g (A * t)) = P.real (absTailEvent f (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real.symm + rw [← hgf] + exact h ht + +/-- Source P1 makes the expectation of a translated one-origin observable +equal to its origin expectation. -/ +theorem integral_sourceTranslatedObservable_eq_origin_of_sourceStationaryLaw + {d : ℕ} {P : SourceCoeffLaw d} (hP : SourceStationaryLaw P) + (z : Fin d → ℤ) (X : Source.Coarse.Carrier d → ℝ) + (hX : Measurable X) : + ∫ a, sourceTranslatedObservable z X a ∂P = ∫ a, X a ∂P := by + simpa [sourceTranslatedObservable] using + (integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + (P := P) hP z X hX) + +/-- Centered `Gamma_sigma` concentration for the source partition average +formed by translating one origin-cube observable to every descendant. -/ +theorem isBigO_gammaSigma_sourceCenteredTranslatedDescendantAverage_of_sourceUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (X : Source.Coarse.Carrier d → ℝ) + (hX_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) X) + (hX_int : Integrable X P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (hX0 : IsBigO P (gammaSigma σ) (sourceCenteredObservable P X hX_int) K) : + IsBigO P (gammaSigma σ) + (sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int) + (gammaSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + let μ0 : ℝ := ∫ a, X a ∂P + let Y : TriadicCube d → Source.Coarse.Carrier d → ℝ := + fun R => sourceTranslatedObservable (scaleTranslationShift n R) X + let Z : TriadicCube d → Source.Coarse.Carrier d → ℝ := fun R a => Y R a - μ0 + have hX_meas : Measurable X := hX_local.measurable + have hY_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Y R) := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + simpa only [Y, sourceTranslatedObservable, hshift] using + (hX_local.comp_translate (scaleTranslationShift n R)) + have hY_meas : ∀ R ∈ descendantsAtScale (originCube d m) n, Measurable (Y R) := by + intro R hR + exact (hY_local R hR).measurable + have hY_int : ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (Y R) P := by + intro R _hR + simpa [Y, sourceTranslatedObservable] using + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_int) + have hZ_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hY_local R hR).sub + (IsSourceLocalRandomVariable.const (cubeSet R) (measurableSet_cubeSet R) μ0) + have hZ_tail : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsBigO P (gammaSigma σ) (Z R) K := by + intro R hR + have hZ_meas : Measurable (Z R) := (hZ_local R hR).measurable + have hX0_meas : Measurable (sourceCenteredObservable P X hX_int) := + hX_meas.sub measurable_const + have hmap : Measure.map (Z R) P = Measure.map (sourceCenteredObservable P X hX_int) P := by + simpa [Z, Y, μ0, sourceCenteredObservable, sourceTranslatedObservable, + Function.comp_def] using + (map_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + (P := P) hPstat (sourceCenteredObservable P X hX_int) hX0_meas + (scaleTranslationShift n R)) + exact (isBigO_gammaSigma_iff_of_map_eq_map hZ_meas hX0_meas hmap).2 hX0 + have hZ_mean : ∀ R ∈ descendantsAtScale (originCube d m) n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hY_expect : ∫ a, Y R a ∂P = μ0 := by + simpa [Y, μ0] using + (integral_sourceTranslatedObservable_eq_origin_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_meas) + calc + ∫ a, Z R a ∂P = ∫ a, Y R a ∂P - ∫ _a, μ0 ∂P := by + simpa [Z] using integral_sub (hY_int R hR) (integrable_const μ0) + _ = μ0 - μ0 := by rw [hY_expect]; simp + _ = 0 := sub_self _ + have havg := + isBigO_gammaSigma_descendantAverage_of_sourceUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) + hnm hPdep hσ₀ hσ₂ hK Z hZ_local hZ_tail hZ_mean + have havg_fun_eq : + (fun a => ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a) = + sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int := by + rfl + simpa only [havg_fun_eq, partitionCardinalityScale, div_eq_mul_inv, + mul_assoc, mul_left_comm, mul_comm] using havg + +/-- Centered `Psi_sigma` concentration for the source partition average +formed by translating one origin-cube observable to every descendant. -/ +theorem isBigO_psiSigma_sourceCenteredTranslatedDescendantAverage_of_sourceUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (X : Source.Coarse.Carrier d → ℝ) + (hX_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) X) + (hX_int : Integrable X P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX0 : IsBigO P (psiSigma σ) (sourceCenteredObservable P X hX_int) K) : + IsBigO P (psiSigma σ) + (sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int) + (psiSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + let μ0 : ℝ := ∫ a, X a ∂P + let Y : TriadicCube d → Source.Coarse.Carrier d → ℝ := + fun R => sourceTranslatedObservable (scaleTranslationShift n R) X + let Z : TriadicCube d → Source.Coarse.Carrier d → ℝ := fun R a => Y R a - μ0 + have hX_meas : Measurable X := hX_local.measurable + have hY_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Y R) := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + simpa only [Y, sourceTranslatedObservable, hshift] using + (hX_local.comp_translate (scaleTranslationShift n R)) + have hY_int : ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (Y R) P := by + intro R _hR + simpa [Y, sourceTranslatedObservable] using + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_int) + have hZ_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hY_local R hR).sub + (IsSourceLocalRandomVariable.const (cubeSet R) (measurableSet_cubeSet R) μ0) + have hZ_int : ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (Z R) P := by + intro R hR + simpa [Z] using! (hY_int R hR).sub (integrable_const μ0) + have hZ_tail : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsBigO P (psiSigma σ) (Z R) K := by + intro R hR + have hZ_meas : Measurable (Z R) := (hZ_local R hR).measurable + have hX0_meas : Measurable (sourceCenteredObservable P X hX_int) := + hX_meas.sub measurable_const + have hmap : Measure.map (Z R) P = Measure.map (sourceCenteredObservable P X hX_int) P := by + simpa [Z, Y, μ0, sourceCenteredObservable, sourceTranslatedObservable, + Function.comp_def] using + (map_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + (P := P) hPstat (sourceCenteredObservable P X hX_int) hX0_meas + (scaleTranslationShift n R)) + exact (isBigO_psiSigma_iff_of_map_eq_map hZ_meas hX0_meas hmap).2 hX0 + have hZ_mean : ∀ R ∈ descendantsAtScale (originCube d m) n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hY_expect : ∫ a, Y R a ∂P = μ0 := by + simpa [Y, μ0] using + (integral_sourceTranslatedObservable_eq_origin_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_meas) + calc + ∫ a, Z R a ∂P = ∫ a, Y R a ∂P - ∫ _a, μ0 ∂P := by + simpa [Z] using integral_sub (hY_int R hR) (integrable_const μ0) + _ = μ0 - μ0 := by rw [hY_expect]; simp + _ = 0 := sub_self _ + have havg := + isBigO_psiSigma_descendantAverage_of_sourceUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) + hnm hPdep hσ hK Z hZ_local hZ_int hZ_tail hZ_mean + have havg_fun_eq : + (fun a => ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a) = + sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int := by + rfl + simpa only [havg_fun_eq, partitionCardinalityScale, div_eq_mul_inv, + mul_assoc, mul_left_comm, mul_comm] using havg + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageLowMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageLowMoments.lean new file mode 100644 index 0000000000..aafad0d129 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageLowMoments.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.MomentCalculus + +/-! +# Finite-moment source partition-average bounds + +This module derives the finite-moment `L¹` partition-average estimate on the +exact coarse source carrier. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +/-- A finite source `ξ`-moment controls the `L¹` fluctuation of its centered +partition average. -/ +theorem integral_abs_sourceCenteredTranslatedDescendantAverage_le_of_sourceUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {ξ : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (X : Source.Coarse.Carrier d → ℝ) + (hX_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) X) + (hξ : 2 ≤ ξ) + (hXξ_int : Integrable (fun a => |X a| ^ ξ) P) : + let hX_int := + _root_.Homogenization.IndependentSums.integrable_of_integrable_abs_rpow + (μ := P) (f := X) (le_trans (by norm_num) hξ) hX_local.measurable hXξ_int + ∫ a, |sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int a| ∂P ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ ξ ∂P) ^ ξ⁻¹ := by + let hX_int : Integrable X P := + _root_.Homogenization.IndependentSums.integrable_of_integrable_abs_rpow + (μ := P) (f := X) (le_trans (by norm_num) hξ) hX_local.measurable hXξ_int + have hξ_one : 1 ≤ ξ := le_trans (by norm_num) hξ + have hX0_meas : Measurable (sourceCenteredObservable P X hX_int) := + hX_local.measurable.sub measurable_const + have hX0ξ_int : + Integrable (fun a => |sourceCenteredObservable P X hX_int a| ^ ξ) P := by + simpa [sourceCenteredObservable] using + (_root_.Homogenization.IndependentSums.integrable_abs_sub_integral_rpow_of_integrable_abs_rpow + (μ := P) (f := X) hξ_one hX_local.measurable hXξ_int) + have hX02_int : + Integrable (fun a => |sourceCenteredObservable P X hX_int a| ^ (2 : ℝ)) P := + _root_.Homogenization.IndependentSums.integrable_abs_rpow_of_integrable_abs_rpow_of_le + (μ := P) (f := sourceCenteredObservable P X hX_int) (q := 2) (p := ξ) + (by norm_num) hξ hX0_meas hX0ξ_int + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d m) n + let c : ℝ := (D.card : ℝ)⁻¹ + let Z : TriadicCube d → Source.Coarse.Carrier d → ℝ := + fun R a => sourceTranslatedObservable (scaleTranslationShift n R) X a - ∫ b, X b ∂P + have hZ_local : + ∀ R ∈ D, IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm (by simpa [D] using hR) + have htranslated := hX_local.comp_translate (scaleTranslationShift n R) + have hsub := htranslated.sub (IsSourceLocalRandomVariable.const _ _ (∫ b, X b ∂P)) + simpa only [Z, sourceTranslatedObservable, hshift] using + hsub + have hZ2_int : ∀ R ∈ D, Integrable (fun a => |Z R a| ^ (2 : ℝ)) P := by + intro R hR + simpa [Z, sourceCenteredObservable, sourceTranslatedObservable, Function.comp_def] using + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) + (fun a => |sourceCenteredObservable P X hX_int a| ^ (2 : ℝ)) hX02_int) + let S : Source.Coarse.Carrier d → ℝ := fun a => ∑ R ∈ D, Z R a + have hS_meas : Measurable S := by + simpa [S] using Finset.measurable_sum D (fun R hR => (hZ_local R hR).measurable) + have hS2_int : Integrable (fun a => |S a| ^ (2 : ℝ)) P := by + simpa [S] using + (_root_.Homogenization.IndependentSums.integrable_abs_finsetSum_rpow + (μ := P) (f := Z) (s := D) (p := 2) (by norm_num) + (fun R hR => (hZ_local R hR).measurable) hZ2_int) + let A : Source.Coarse.Carrier d → ℝ := fun a => c * S a + have hA_meas : Measurable A := hS_meas.const_mul c + have hA2_int : Integrable (fun a => |A a| ^ (2 : ℝ)) P := by + convert hS2_int.const_mul (|c| ^ (2 : ℝ)) using 1 + funext a + change |c * S a| ^ (2 : ℝ) = |c| ^ (2 : ℝ) * |S a| ^ (2 : ℝ) + rw [abs_mul, Real.mul_rpow (abs_nonneg c) (abs_nonneg (S a))] + have hA_eq : A = sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int := by + funext a + simp [A, S, Z, c, D, sourceCenteredTranslatedDescendantAverage] + have hA_l1_le_l2 : + (∫ a, |A a| ∂P) ≤ (∫ a, |A a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ := by + simpa using + (_root_.Homogenization.IndependentSums.integral_abs_rpow_rpow_inv_le_of_le + (μ := P) (f := A) (q := 1) (p := 2) (by norm_num) (by norm_num) hA_meas hA2_int) + have hmain : + (∫ a, |A a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ := by + simpa [hA_eq] using + (integral_abs_sourceCenteredTranslatedDescendantAverage_rpow_rpow_inv_le_of_sourceUnitRangeDependentLaw + (P := P) (p := 2) hn hnm hPstat hPdep X hX_local hX_int (by norm_num) hX02_int) + have hX0_l2_le_lξ : + (∫ a, |sourceCenteredObservable P X hX_int a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ ≤ + (∫ a, |sourceCenteredObservable P X hX_int a| ^ ξ ∂P) ^ ξ⁻¹ := + _root_.Homogenization.IndependentSums.integral_abs_rpow_rpow_inv_le_of_le + (μ := P) (f := sourceCenteredObservable P X hX_int) (q := 2) (p := ξ) + (by norm_num) hξ hX0_meas hX0ξ_int + have hcoeff_nonneg : + 0 ≤ ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) := by + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst, IndependentSums.rosenthalBennettIntegralConst] + positivity + rw [rosenthalDescendantsAtScaleRpowLpConst, + rosenthalDescendantsAtScaleRpowSqrtConst] + positivity + calc + ∫ a, |sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int a| ∂P = + ∫ a, |A a| ∂P := by rw [hA_eq] + _ ≤ (∫ a, |A a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ := hA_l1_le_l2 + _ ≤ ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ (2 : ℝ) ∂P) ^ (2 : ℝ)⁻¹ := hmain + _ ≤ ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ ξ ∂P) ^ ξ⁻¹ := + mul_le_mul_of_nonneg_left hX0_l2_le_lξ hcoeff_nonneg + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageMoments.lean new file mode 100644 index 0000000000..b58b02c64b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourcePartitionAverageMoments.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceDescendantMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceStationaryExpectations + +/-! +# One-origin real-moment partition-average bounds + +This module derives the real-exponent partition-average moment estimate on the +exact coarse source carrier from one local origin observable. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +/-- The real-exponent moment of a centered source partition average is bounded +using only the centered moment of its one origin observable. -/ +theorem integral_abs_sourceCenteredTranslatedDescendantAverage_rpow_rpow_inv_le_of_sourceUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {p : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (X : Source.Coarse.Carrier d → ℝ) + (hX_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) X) + (hX_int : Integrable X P) + (hp : 2 ≤ p) + (hX0Lp_int : + Integrable (fun a => |sourceCenteredObservable P X hX_int a| ^ p) P) : + (∫ a, |sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int a| ^ p ∂P) ^ p⁻¹ ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n p * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ p⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n p * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹ := by + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d m) n + let N : ℝ := (D.card : ℝ) + let c : ℝ := N⁻¹ + let μ0 : ℝ := ∫ a, X a ∂P + let Y : TriadicCube d → Source.Coarse.Carrier d → ℝ := + fun R => sourceTranslatedObservable (scaleTranslationShift n R) X + let Z : TriadicCube d → Source.Coarse.Carrier d → ℝ := fun R a => Y R a - μ0 + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp_one + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp_one + have hp_ennreal_ne_zero : ENNReal.ofReal p ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le.mpr hp_pos] + have hX_meas : Measurable X := hX_local.measurable + have hX0_meas : Measurable (sourceCenteredObservable P X hX_int) := + hX_meas.sub measurable_const + have hX0p_meas : Measurable (fun a => |sourceCenteredObservable P X hX_int a| ^ p) := + (Real.continuous_rpow_const hp_nonneg).measurable.comp + (continuous_abs.measurable.comp hX0_meas) + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty (originCube d m) hnm + have hN_pos : 0 < N := by + dsimp [N] + exact_mod_cast hD_nonempty.card_pos + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hY_local : + ∀ R ∈ D, IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Y R) := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm (by simpa [D] using hR) + simpa only [Y, sourceTranslatedObservable, hshift] using + (hX_local.comp_translate (scaleTranslationShift n R)) + have hY_int : ∀ R ∈ D, Integrable (Y R) P := by + intro R hR + simpa [Y, sourceTranslatedObservable] using + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_int) + have hZ_local : + ∀ R ∈ D, IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hY_local R hR).sub + (IsSourceLocalRandomVariable.const (cubeSet R) (measurableSet_cubeSet R) μ0) + have hZ_int : ∀ R ∈ D, Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + simpa [Z, Y, μ0, sourceCenteredObservable, sourceTranslatedObservable, Function.comp_def] using + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) + (fun a => |sourceCenteredObservable P X hX_int a| ^ p) hX0Lp_int) + have hZ_mean : ∀ R ∈ D, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hY_expect : ∫ a, Y R a ∂P = μ0 := by + simpa [Y, μ0, sourceTranslatedObservable, Function.comp_def] using + (integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_meas) + calc + ∫ a, Z R a ∂P = ∫ a, Y R a ∂P - ∫ _a, μ0 ∂P := by + simpa [Z] using integral_sub (hY_int R hR) (integrable_const μ0) + _ = μ0 - μ0 := by rw [hY_expect]; simp + _ = 0 := sub_self _ + have hZ_root : + ∀ R ∈ D, (∫ a, |Z R a| ^ p ∂P) ^ p⁻¹ ≤ + (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹ := by + intro R hR + have hmoment_eq : + ∫ a, |Z R a| ^ p ∂P = + ∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P := by + simpa [Z, Y, μ0, sourceCenteredObservable, sourceTranslatedObservable, Function.comp_def] using + (integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) + (fun a => |sourceCenteredObservable P X hX_int a| ^ p) hX0p_meas) + rw [hmoment_eq] + have hsum := + integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_sourceUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) hPdep hp + (by positivity : 0 ≤ (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹) + Z + (fun R hR => hZ_local R (by simpa [D] using hR)) + (fun R hR => hZ_int R (by simpa [D] using hR)) + (fun R hR => hZ_mean R (by simpa [D] using hR)) + (fun R hR => hZ_root R (by simpa [D] using hR)) + let S : Source.Coarse.Carrier d → ℝ := fun a => ∑ R ∈ D, Z R a + have hS_meas : Measurable S := by + simpa [S] using Finset.measurable_sum D (fun R hR => (hZ_local R hR).measurable) + have hS_int : Integrable (fun a => |S a| ^ p) P := by + simpa [S] using + (_root_.Homogenization.IndependentSums.integrable_abs_finsetSum_rpow + (μ := P) (f := Z) (s := D) hp_one + (fun R hR => (hZ_local R hR).measurable) hZ_int) + have hS_memLp : MemLp S (ENNReal.ofReal p) P := by + rw [← integrable_norm_rpow_iff hS_meas.aestronglyMeasurable hp_ennreal_ne_zero + ENNReal.ofReal_ne_top] + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] using hS_int + let Aavg : Source.Coarse.Carrier d → ℝ := c • S + have hAavg_memLp : MemLp Aavg (ENNReal.ofReal p) P := hS_memLp.const_smul c + have hAavg_int : Integrable (fun a => |Aavg a| ^ p) P := by + have hint := hAavg_memLp.integrable_norm_rpow hp_ennreal_ne_zero ENNReal.ofReal_ne_top + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] using hint + have hS_toReal : + ENNReal.toReal (eLpNorm S (ENNReal.ofReal p) P) = + (∫ a, |S a| ^ p ∂P) ^ p⁻¹ := by + have hnonneg : + 0 ≤ (∫ a, ‖S a‖ ^ (ENNReal.ofReal p).toReal ∂P) ^ + (ENNReal.ofReal p).toReal⁻¹ := by positivity + rw [hS_memLp.eLpNorm_eq_integral_rpow_norm hp_ennreal_ne_zero ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] + have hAavg_toReal : + ENNReal.toReal (eLpNorm Aavg (ENNReal.ofReal p) P) = + (∫ a, |Aavg a| ^ p ∂P) ^ p⁻¹ := by + have hnonneg : + 0 ≤ (∫ a, ‖Aavg a‖ ^ (ENNReal.ofReal p).toReal ∂P) ^ + (ENNReal.ofReal p).toReal⁻¹ := by positivity + rw [hAavg_memLp.eLpNorm_eq_integral_rpow_norm hp_ennreal_ne_zero ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] + have hscale : + ENNReal.toReal (eLpNorm Aavg (ENNReal.ofReal p) P) = + c * ENNReal.toReal (eLpNorm S (ENNReal.ofReal p) P) := by + rw [show Aavg = c • S by rfl, eLpNorm_const_smul, ENNReal.toReal_mul] + simp [Real.norm_eq_abs, abs_of_nonneg hc_nonneg] + have hAavg_eq : Aavg = sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int := by + funext a + simp [Aavg, S, Z, Y, c, N, D, μ0, sourceCenteredTranslatedDescendantAverage] + calc + (∫ a, |sourceCenteredTranslatedDescendantAverage P n m hn hnm X hX_int a| ^ p ∂P) ^ p⁻¹ = + ENNReal.toReal (eLpNorm Aavg (ENNReal.ofReal p) P) := by + rw [hAavg_toReal] + simp [hAavg_eq] + _ = c * ENNReal.toReal (eLpNorm S (ENNReal.ofReal p) P) := hscale + _ = c * (∫ a, |S a| ^ p ∂P) ^ p⁻¹ := by rw [hS_toReal] + _ ≤ c * + (rosenthalDescendantsAtScaleRpowLpConst d n p * N ^ p⁻¹ * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n p * Real.sqrt N * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹) := by + exact mul_le_mul_of_nonneg_left (by simpa [S, D, N] using hsum) hc_nonneg + _ = ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n p * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ p⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n p * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, |sourceCenteredObservable P X hX_int a| ^ p ∂P) ^ p⁻¹ := by + simp [c, N] + ring + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponseObservables.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponseObservables.lean new file mode 100644 index 0000000000..f435c76da8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponseObservables.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DeterministicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceMu + +/-! +# Exact-source scalar response observables + +The deterministic Chapter 2 response identity turns the scalar `ResponseJ` +into one exact-source local `Mu` observable and a constant. The local Chapter +2 coefficient realization below is built directly from source-carrier +ellipticity on the cube. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +noncomputable section + +private noncomputable def sourceCoeffOnCube {d : ℕ} (a : Source.Coarse.Carrier d) + (Q : TriadicCube d) : Ch02.CoeffOn (Ch02.cubeDomain Q) := by + let hExists := exists_source_isAEEllipticFieldOn_cubeSet a Q + let ε := Classical.choose hExists + have hData : 0 < ε ∧ ε ≤ 1 ∧ + IsAEEllipticFieldOn ε ε⁻¹ (cubeSet Q) a.1 := + Classical.choose_spec hExists + have hEll_open : IsAEEllipticFieldOn ε ε⁻¹ (openCubeSet Q) a.1 := + hData.2.2.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + exact + { toCoeffField := a.1 + lam := ε + Lam := ε⁻¹ + lam_pos := hData.1 + lam_le_Lam := hData.2.1.trans ((one_le_inv₀ hData.1).2 hData.2.1) + aeStronglyMeasurable := by + intro i j + simpa [Ch02.cubeDomain_coe] using + hEll_open.2.1 i j + aeElliptic := by + simpa [Ch02.cubeDomain_coe] using hEll_open.ae_isEllipticMatrix } + +/-- On the exact source carrier, the scalar response is the `Mu` energy at +`(-p,q)` minus the deterministic pairing. -/ +theorem ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot_source + {d : ℕ} [NeZero d] (Q : TriadicCube d) (p q : Vec d) + (a : Source.Coarse.Carrier d) : + ResponseJ (cubeSet Q) p q a.1 = + Mu (cubeSet Q) (-p, q) a.1 - vecDot p q := by + simpa only [sourceCoeffOnCube] using + Ch02.ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot Q (sourceCoeffOnCube a Q) p q + +/-- The scalar response on a triadic cube is exact-source local. -/ +theorem isSourceLocalRandomVariable_ResponseJ_cubeSet + {d : ℕ} [NeZero d] (Q : TriadicCube d) (p q : Vec d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => ResponseJ (cubeSet Q) p q a.1) := by + have hmu := (SourceObservable.mu Q (-p, q)).isLocal + have hEq : + (fun a : Source.Coarse.Carrier d => ResponseJ (cubeSet Q) p q a.1) = + fun a => Mu (cubeSet Q) (-p, q) a.1 - vecDot p q := by + funext a + exact ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot_source Q p q a + rw [hEq] + exact hmu.sub (IsSourceLocalRandomVariable.const (cubeSet Q) + (measurableSet_cubeSet Q) (vecDot p q)) + +private theorem isSourceLocalRandomVariable_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + {F : TriadicCube d → Source.Coarse.Carrier d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → + IsSourceLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (F R)) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a => descendantsAverage Q j (fun R => F R a)) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let : MeasurableSpace (Source.Coarse.Carrier d) := + Source.Coarse.localSigma (cubeSet Q) (measurableSet_cubeSet Q) + have hsum : Measurable (fun a : Source.Coarse.Carrier d => D.sum (fun R => F R a)) := by + refine Finset.measurable_sum D ?_ + intro R hR + exact (hF R (by simpa [D] using hR)).mono + (measurableSet_cubeSet R) (measurableSet_cubeSet Q) + (cubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + simpa [descendantsAverage, D] using! hsum.const_mul ((D.card : ℝ)⁻¹) + +/-- The finite descendant average of the scalar response is exact-source local +on the parent cube. -/ +theorem isSourceLocalRandomVariable_descendantsAverage_ResponseJ_cubeSet + {d : ℕ} [NeZero d] (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + IsSourceLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) + (fun a : Source.Coarse.Carrier d => + descendantsAverage Q j (fun R => ResponseJ (cubeSet R) p q a.1)) := + isSourceLocalRandomVariable_descendantsAverage Q j fun R _ => + isSourceLocalRandomVariable_ResponseJ_cubeSet R p q + +namespace SourceObservable + +/-- The scalar response on a triadic cube, bundled as an exact-source local +observable. -/ +noncomputable def responseJ {d : ℕ} [NeZero d] (Q : TriadicCube d) + (p q : Vec d) : SourceObservable d (cubeSet Q) ℝ where + measurableSet := measurableSet_cubeSet Q + toFun := fun a => ResponseJ (cubeSet Q) p q a.1 + isLocal := isSourceLocalRandomVariable_ResponseJ_cubeSet Q p q + +@[simp] +theorem responseJ_apply {d : ℕ} [NeZero d] (Q : TriadicCube d) + (p q : Vec d) (a : Source.Coarse.Carrier d) : + responseJ Q p q a = ResponseJ (cubeSet Q) p q a.1 := + rfl + +end SourceObservable + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponsePartitionAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponsePartitionAverages.lean new file mode 100644 index 0000000000..d668e4af22 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceResponsePartitionAverages.lean @@ -0,0 +1,319 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageLowMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourcePartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceResponseObservables + +/-! +# Exact-source ResponseJ partition averages + +This module specializes the one-origin source partition endpoint to the scalar +response observable. Its locality and translation covariance are derived +from the exact-source response API. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +private theorem sourceResponseJ_translation_covariant {d : ℕ} (p q : Vec d) : + IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => ResponseJ U p q a.1) := by + apply isSourceTranslationCovariant_comp_toCoeffField + intro U z a + simpa [translateByInt] using + (ResponseJ_translateSet_eq_translateCoeffField (intVecToRealVec z) U p q a) + +/-- The exact-source scalar response partition average `J_{n,m}`. -/ +noncomputable def sourceResponseJDescendantAverage {d : ℕ} [NeZero d] + (n m : ℤ) (_hn : 0 ≤ n) (_hnm : n ≤ m) (p q : Vec d) : + Source.Coarse.Carrier d → ℝ := + fun a => + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, ResponseJ (cubeSet R) p q a.1 + +/-- The integrably centered exact-source scalar response partition average. -/ +noncomputable def sourceCenteredResponseJDescendantAverage {d : ℕ} [NeZero d] + (P : SourceCoeffLaw d) (n m : ℤ) (_hn : 0 ≤ n) (_hnm : n ≤ m) + (p q : Vec d) + (_hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) : + Source.Coarse.Carrier d → ℝ := + fun a => + sourceResponseJDescendantAverage n m _hn _hnm p q a - + ∫ b, ResponseJ (cubeSet (originCube d n)) p q b.1 ∂P + +private theorem sourceTranslatedObservable_responseJ_eq + {d : ℕ} {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (p q : Vec d) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) : + sourceTranslatedObservable (scaleTranslationShift n R) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) = + fun a : Source.Coarse.Carrier d => ResponseJ (cubeSet R) p q a.1 := by + have hcov : IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => ResponseJ U p q a.1) := + sourceResponseJ_translation_covariant p q + funext a + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + calc + ResponseJ (cubeSet (originCube d n)) p q + (Source.Coarse.Carrier.translate (scaleTranslationShift n R) a).1 = + ResponseJ + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) p q a.1 := by + symm + exact hcov (cubeSet (originCube d n)) (scaleTranslationShift n R) a + _ = ResponseJ (cubeSet R) p q a.1 := by rw [hshift] + +private theorem sourceCenteredTranslatedDescendantAverage_responseJ_eq + {d : ℕ} [NeZero d] {n m : ℤ} (P : SourceCoeffLaw d) + (hn : 0 ≤ n) (hnm : n ≤ m) (p q : Vec d) + (hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) : + sourceCenteredTranslatedDescendantAverage P n m hn hnm + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int = + sourceCenteredResponseJDescendantAverage P n m hn hnm p q hJ_int := by + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d m) n + let μ : ℝ := ∫ b, ResponseJ (cubeSet (originCube d n)) p q b.1 ∂P + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty (originCube d m) hnm + have hD_card_ne_zero : ((D.card : ℝ)) ≠ 0 := by + exact_mod_cast hD_nonempty.card_ne_zero + have hsum_eq : ∀ a : Source.Coarse.Carrier d, + (∑ R ∈ D, + (sourceTranslatedObservable (scaleTranslationShift n R) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) a - μ)) = + ∑ R ∈ D, (ResponseJ (cubeSet R) p q a.1 - μ) := by + intro a + refine Finset.sum_congr rfl ?_ + intro R hR + rw [sourceTranslatedObservable_responseJ_eq hn hnm p q (by simpa [D] using hR)] + funext a + change ((D.card : ℝ)⁻¹ * + ∑ R ∈ D, + (sourceTranslatedObservable (scaleTranslationShift n R) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) a - μ)) = + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, ResponseJ (cubeSet R) p q a.1) - μ + rw [hsum_eq a, Finset.sum_sub_distrib, Finset.sum_const, nsmul_eq_mul] + field_simp [hD_card_ne_zero] + +/-- Under source P1, the expectation of `J_{n,m}` is the origin-cube +expectation. -/ +theorem integral_sourceResponseJDescendantAverage_eq_origin_of_sourceStationaryLaw + {d : ℕ} [NeZero d] {n m : ℤ} {P : SourceCoeffLaw d} + [IsProbabilityMeasure P] + (hn : 0 ≤ n) (hnm : n ≤ m) (hPstat : SourceStationaryLaw P) + (p q : Vec d) + (hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) : + ∫ a, sourceResponseJDescendantAverage n m hn hnm p q a ∂P = + ∫ a, ResponseJ (cubeSet (originCube d n)) p q a.1 ∂P := by + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d m) n + let X : Source.Coarse.Carrier d → ℝ := + fun a => ResponseJ (cubeSet (originCube d n)) p q a.1 + have hX_meas : Measurable X := + (isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q).measurable + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty (originCube d m) hnm + have hD_card_ne_zero : ((D.card : ℝ)) ≠ 0 := by + exact_mod_cast hD_nonempty.card_ne_zero + have hJ_int_child : ∀ R ∈ D, + Integrable (fun a : Source.Coarse.Carrier d => ResponseJ (cubeSet R) p q a.1) P := by + intro R hR + rw [← sourceTranslatedObservable_responseJ_eq hn hnm p q (by simpa [D] using hR)] + simpa [X] using! + (integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hJ_int) + have hJ_expect_child : ∀ R ∈ D, + ∫ a, ResponseJ (cubeSet R) p q a.1 ∂P = ∫ a, X a ∂P := by + intro R hR + rw [← sourceTranslatedObservable_responseJ_eq hn hnm p q (by simpa [D] using hR)] + exact integral_sourceTranslatedObservable_eq_origin_of_sourceStationaryLaw + (P := P) hPstat (scaleTranslationShift n R) X hX_meas + change ∫ a, ((D.card : ℝ)⁻¹ * ∑ R ∈ D, ResponseJ (cubeSet R) p q a.1) ∂P = + ∫ a, X a ∂P + rw [integral_const_mul, integral_finsetSum D hJ_int_child] + calc + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, ∫ a, ResponseJ (cubeSet R) p q a.1 ∂P) = + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, ∫ a, X a ∂P) := by + apply congrArg (fun x : ℝ => (D.card : ℝ)⁻¹ * x) + exact Finset.sum_congr rfl fun R hR => hJ_expect_child R hR + _ = ∫ a, X a ∂P := by + rw [Finset.sum_const, nsmul_eq_mul] + field_simp [hD_card_ne_zero] + +/-- Centered `Gamma_sigma` concentration for partition averages of the exact +source scalar response. -/ +theorem isBigO_gammaSigma_sourceCenteredResponseJDescendantAverage + {d : ℕ} [NeZero d] {n m : ℤ} {P : SourceCoeffLaw d} + [IsProbabilityMeasure P] {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (p q : Vec d) + (hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (hJ0 : IsBigO P (gammaSigma σ) + (sourceCenteredObservable P (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int) K) : + IsBigO P (gammaSigma σ) + (sourceCenteredResponseJDescendantAverage P n m hn hnm p q hJ_int) + (gammaSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + have hJ_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) := + isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q + have hsource := + isBigO_gammaSigma_sourceCenteredTranslatedDescendantAverage_of_sourceUnitRangeDependentLaw + (P := P) hn hnm hPstat hPdep + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) + hJ_local hJ_int hσ₀ hσ₂ hK hJ0 + rw [sourceCenteredTranslatedDescendantAverage_responseJ_eq P hn hnm p q hJ_int] at hsource + exact hsource + +/-- Centered `Psi_sigma` concentration for partition averages of the exact +source scalar response. -/ +theorem isBigO_psiSigma_sourceCenteredResponseJDescendantAverage + {d : ℕ} [NeZero d] {n m : ℤ} {P : SourceCoeffLaw d} + [IsProbabilityMeasure P] {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (p q : Vec d) + (hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hJ0 : IsBigO P (psiSigma σ) + (sourceCenteredObservable P (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int) K) : + IsBigO P (psiSigma σ) + (sourceCenteredResponseJDescendantAverage P n m hn hnm p q hJ_int) + (psiSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + have hJ_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) := + isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q + have hsource := + isBigO_psiSigma_sourceCenteredTranslatedDescendantAverage_of_sourceUnitRangeDependentLaw + (P := P) hn hnm hPstat hPdep + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) + hJ_local hJ_int hσ hK hJ0 + rw [sourceCenteredTranslatedDescendantAverage_responseJ_eq P hn hnm p q hJ_int] at hsource + exact hsource + +/-- The real-exponent moment bound for the centered source `ResponseJ` +partition average, reduced to the one-origin source partition endpoint. -/ +theorem integral_abs_sourceCenteredResponseJDescendantAverage_rpow_rpow_inv_le_of_sourceUnitRangeDependentLaw + {d : ℕ} [NeZero d] {n m : ℤ} {P : SourceCoeffLaw d} + [IsProbabilityMeasure P] {r : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (p q : Vec d) + (hJ_int : Integrable + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) P) + (hr : 2 ≤ r) + (hJ0r_int : Integrable + (fun a => + |sourceCenteredObservable P + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int a| ^ r) P) : + (∫ a, + |sourceCenteredResponseJDescendantAverage P n m hn hnm p q hJ_int a| ^ r ∂P) ^ r⁻¹ ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n r * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ r⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n r * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, + |sourceCenteredObservable P + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int a| ^ r ∂P) ^ r⁻¹ := by + have hJ_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) := + isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q + have hsource := + integral_abs_sourceCenteredTranslatedDescendantAverage_rpow_rpow_inv_le_of_sourceUnitRangeDependentLaw + (P := P) (p := r) hn hnm hPstat hPdep + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) + hJ_local hJ_int hr hJ0r_int + rw [sourceCenteredTranslatedDescendantAverage_responseJ_eq P hn hnm p q hJ_int] at hsource + exact hsource + +/-- A finite source `ξ`-moment of `ResponseJ` controls the `L¹` fluctuation +of its centered partition average. -/ +theorem integral_abs_sourceCenteredResponseJDescendantAverage_le_of_sourceUnitRangeDependentLaw + {d : ℕ} [NeZero d] {n m : ℤ} {P : SourceCoeffLaw d} + [IsProbabilityMeasure P] {ξ : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : SourceStationaryLaw P) (hPdep : SourceUnitRangeDependentLaw P) + (p q : Vec d) (hξ : 2 ≤ ξ) + (hJξ_int : Integrable + (fun a : Source.Coarse.Carrier d => + |ResponseJ (cubeSet (originCube d n)) p q a.1| ^ ξ) P) : + let hJ_int := + _root_.Homogenization.IndependentSums.integrable_of_integrable_abs_rpow + (μ := P) + (f := fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) + (le_trans (by norm_num) hξ) + (isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q).measurable + hJξ_int + ∫ a, |sourceCenteredResponseJDescendantAverage P n m hn hnm p q hJ_int a| ∂P ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleRpowLpConst d n 2 * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (2 : ℝ)⁻¹ + + rosenthalDescendantsAtScaleRpowSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (∫ a, + |sourceCenteredObservable P + (fun a : Source.Coarse.Carrier d => + ResponseJ (cubeSet (originCube d n)) p q a.1) hJ_int a| ^ ξ ∂P) ^ ξ⁻¹ := by + let X : Source.Coarse.Carrier d → ℝ := fun a => + ResponseJ (cubeSet (originCube d n)) p q a.1 + have hJ_local : + IsSourceLocalRandomVariable (cubeSet (originCube d n)) + (measurableSet_cubeSet (originCube d n)) X := by + simpa [X] using + (isSourceLocalRandomVariable_ResponseJ_cubeSet (originCube d n) p q) + have hsource := + integral_abs_sourceCenteredTranslatedDescendantAverage_le_of_sourceUnitRangeDependentLaw + (P := P) hn hnm hPstat hPdep X hJ_local hξ (by simpa [X] using hJξ_int) + simpa only [X, sourceCenteredTranslatedDescendantAverage_responseJ_eq] using hsource + +end + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceStationaryExpectations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceStationaryExpectations.lean new file mode 100644 index 0000000000..96ee6f11e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/SourceStationaryExpectations.lean @@ -0,0 +1,213 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField + +/-! +# Stationary expectations for the exact coarse source + +This module transports deterministic set-translation covariance to the exact +coarse-source carrier, and then applies source stationarity to obtain equality +of laws and Bochner integrals. +-/ + +@[expose] public section + +namespace Homogenization.Book.Ch04 + +open MeasureTheory + +/-- Set-indexed covariance under the exact coarse-source carrier translation. -/ +def IsSourceTranslationCovariant {β : Type*} {d : ℕ} + (X : Set (Vec d) → Source.Coarse.Carrier d → β) : Prop := + ∀ (U : Set (Vec d)) (z : Fin d → ℤ) (a : Source.Coarse.Carrier d), + X (translateSet (intVecToRealVec z) U) a = X U (Source.Coarse.Carrier.translate z a) + +/-- Carrier translation projects to raw integer translation of the underlying +coefficient field. -/ +theorem sourceCarrier_translate_toCoeffField {d : ℕ} (z : Fin d → ℤ) + (a : Source.Coarse.Carrier d) : + (Source.Coarse.Carrier.translate z a : CoeffField d) = translateByInt z a.1 := + rfl + +/-- Raw translation covariance lifts along the exact coarse-source carrier. -/ +theorem isSourceTranslationCovariant_comp_toCoeffField {β : Type*} {d : ℕ} + {X : Set (Vec d) → CoeffField d → β} (hX : IsTranslationCovariant X) : + IsSourceTranslationCovariant (fun U a => X U a.1) := by + intro U z a + change X (translateSet (intVecToRealVec z) U) a.1 = + X U (Source.Coarse.Carrier.translate z a : CoeffField d) + rw [hX U z a.1, sourceCarrier_translate_toCoeffField] + +/-- Pointwise covariance is equivalent to a composition identity on the source +carrier. -/ +theorem comp_sourceCarrier_translate_eq_of_isSourceTranslationCovariant + {β : Type*} {d : ℕ} {X : Set (Vec d) → Source.Coarse.Carrier d → β} + (hX : IsSourceTranslationCovariant X) (U : Set (Vec d)) (z : Fin d → ℤ) : + X (translateSet (intVecToRealVec z) U) = X U ∘ Source.Coarse.Carrier.translate z := by + funext a + exact hX U z a + +/-- Source stationarity identifies the laws of a measurable observable and +its precomposition with a coarse-source integer translation. -/ +theorem map_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + {β : Type*} [MeasurableSpace β] {d : ℕ} {P : SourceCoeffLaw d} + (hP : SourceStationaryLaw P) (X : Source.Coarse.Carrier d → β) + (hXmeas : Measurable X) (z : Fin d → ℤ) : + Measure.map (X ∘ Source.Coarse.Carrier.translate z) P = Measure.map X P := by + calc + Measure.map (X ∘ Source.Coarse.Carrier.translate z) P = + Measure.map X (Measure.map (Source.Coarse.Carrier.translate z) P) := by + symm + simpa [Function.comp] using + (Measure.map_map hXmeas (Source.Coarse.measurable_translate_globalSigma z) + (μ := P)) + _ = Measure.map X P := by rw [hP z] + +/-- Source stationarity preserves the Bochner integral of an observable +precomposed with a coarse-source integer translation. -/ +theorem integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw_aestronglyMeasurable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : SourceCoeffLaw d} (hP : SourceStationaryLaw P) + (z : Fin d → ℤ) (X : Source.Coarse.Carrier d → E) + (hXmeas : AEStronglyMeasurable X P) : + ∫ a, X (Source.Coarse.Carrier.translate z a) ∂P = ∫ a, X a ∂P := + integral_comp_eq_of_map_eq + (Source.Coarse.measurable_translate_globalSigma z) (hP z) X hXmeas + +/-- Measurable specialization of source stationary integral transport. -/ +theorem integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : SourceCoeffLaw d} (hP : SourceStationaryLaw P) + (z : Fin d → ℤ) (X : Source.Coarse.Carrier d → E) + (hXmeas : Measurable X) : + ∫ a, X (Source.Coarse.Carrier.translate z a) ∂P = ∫ a, X a ∂P := + integral_comp_sourceCarrier_translate_eq_of_sourceStationaryLaw_aestronglyMeasurable + hP z X hXmeas.aestronglyMeasurable + +/-- Source stationarity preserves integrability under precomposition with a +coarse-source integer translation. -/ +theorem integrable_comp_sourceCarrier_translate_of_sourceStationaryLaw + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + {d : ℕ} {P : SourceCoeffLaw d} (hP : SourceStationaryLaw P) + (z : Fin d → ℤ) (X : Source.Coarse.Carrier d → E) + (hX : Integrable X P) : + Integrable (X ∘ Source.Coarse.Carrier.translate z) P := by + have hXmap : Integrable X (Measure.map (Source.Coarse.Carrier.translate z) P) := by + simpa [hP z] using hX + exact hXmap.comp_measurable (Source.Coarse.measurable_translate_globalSigma z) + +/-- Source stationarity identifies the laws of a genuinely measurable +translation-covariant observable on translated sets. -/ +theorem map_eq_map_sourceCarrier_translate_of_isSourceTranslationCovariant + {β : Type*} [MeasurableSpace β] {d : ℕ} {P : SourceCoeffLaw d} + {X : Set (Vec d) → Source.Coarse.Carrier d → β} + (hP : SourceStationaryLaw P) {U : Set (Vec d)} (hXmeas : Measurable (X U)) + (hXcov : IsSourceTranslationCovariant X) (z : Fin d → ℤ) : + Measure.map (X (translateSet (intVecToRealVec z) U)) P = Measure.map (X U) P := by + calc + Measure.map (X (translateSet (intVecToRealVec z) U)) P = + Measure.map (X U ∘ Source.Coarse.Carrier.translate z) P := by + rw [comp_sourceCarrier_translate_eq_of_isSourceTranslationCovariant hXcov U z] + _ = Measure.map (X U) (Measure.map (Source.Coarse.Carrier.translate z) P) := by + symm + simpa [Function.comp] using + (Measure.map_map hXmeas (Source.Coarse.measurable_translate_globalSigma z) + (μ := P)) + _ = Measure.map (X U) P := by rw [hP z] + +/-- Source stationarity identifies Bochner integrals of translation-covariant +observables, assuming a.e.-strong measurability at the reference set. -/ +theorem integral_eq_of_isSourceTranslationCovariant_of_stationary_aestronglyMeasurable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : SourceCoeffLaw d} {X : Set (Vec d) → Source.Coarse.Carrier d → E} + (hP : SourceStationaryLaw P) {U : Set (Vec d)} + (hXmeas : AEStronglyMeasurable (X U) P) + (hXcov : IsSourceTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := by + rw [comp_sourceCarrier_translate_eq_of_isSourceTranslationCovariant hXcov U z] + exact integral_comp_eq_of_map_eq + (Source.Coarse.measurable_translate_globalSigma z) (hP z) (X U) hXmeas + +/-- Measurable form of source stationary integral transport. -/ +theorem integral_eq_of_isSourceTranslationCovariant_of_stationary + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : SourceCoeffLaw d} {X : Set (Vec d) → Source.Coarse.Carrier d → E} + (hP : SourceStationaryLaw P) {U : Set (Vec d)} (hXmeas : Measurable (X U)) + (hXcov : IsSourceTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := + integral_eq_of_isSourceTranslationCovariant_of_stationary_aestronglyMeasurable + hP hXmeas.aestronglyMeasurable hXcov z + +/-- The exact source coarse energy is translation-covariant. -/ +theorem sourceMu_translation_covariant {d : ℕ} (P0 : BlockVec d) : + IsSourceTranslationCovariant + (fun (_U : Set (Vec d)) (a : Source.Coarse.Carrier d) => Mu _U P0 a.1) := by + apply isSourceTranslationCovariant_comp_toCoeffField + (X := fun (U : Set (Vec d)) (a : CoeffField d) => Mu U P0 a) + intro U z a + simpa [translateByInt] using + Mu_translateSet_eq_translateCoeffField (intVecToRealVec z) U P0 a + +/-- The exact source coarse block matrix is translation-covariant. -/ +theorem sourceCoarseBlockMatrix_translation_covariant {d : ℕ} : + IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => coarseBlockMatrix U a.1) := by + apply isSourceTranslationCovariant_comp_toCoeffField + (X := fun (U : Set (Vec d)) (a : CoeffField d) => coarseBlockMatrix U a) + intro U z a + simpa [translateByInt] using + coarseBlockMatrix_translateSet_eq_translateCoeffField (intVecToRealVec z) U a + +/-- A coarse block-matrix entry is translation-covariant on the exact source. -/ +theorem sourceCoarseBlockMatrix_entry_translation_covariant {d : ℕ} + (α β : BlockCoord d) : + IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => + blockMatEntry (coarseBlockMatrix U a.1) α β) := by + apply isSourceTranslationCovariant_comp_toCoeffField + (X := fun (U : Set (Vec d)) (a : CoeffField d) => + blockMatEntry (coarseBlockMatrix U a) α β) + intro U z a + simpa [translateByInt] using congrArg (fun A : BlockMat d => blockMatEntry A α β) + (coarseBlockMatrix_translateSet_eq_translateCoeffField (intVecToRealVec z) U a) + +/-- The unfolded full coarse block matrix is translation-covariant on the exact +source. -/ +theorem sourceFullCoarseBlockMatrix_translation_covariant {d : ℕ} : + IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => + toFullBlockMat (coarseBlockMatrix U a.1)) := by + apply isSourceTranslationCovariant_comp_toCoeffField + (X := fun (U : Set (Vec d)) (a : CoeffField d) => + toFullBlockMat (coarseBlockMatrix U a)) + intro U z a + simpa [translateByInt] using congrArg toFullBlockMat + (coarseBlockMatrix_translateSet_eq_translateCoeffField (intVecToRealVec z) U a) + +/-- A component of the unfolded full coarse block matrix is translation-covariant +on the exact source. -/ +theorem sourceFullCoarseBlockMatrix_entry_translation_covariant {d : ℕ} + (i j : BlockCoord d) : + IsSourceTranslationCovariant + (fun (U : Set (Vec d)) (a : Source.Coarse.Carrier d) => + toFullBlockMat (coarseBlockMatrix U a.1) i j) := by + apply isSourceTranslationCovariant_comp_toCoeffField + (X := fun (U : Set (Vec d)) (a : CoeffField d) => + toFullBlockMat (coarseBlockMatrix U a) i j) + intro U z a + simpa [translateByInt] using congrArg (fun A : FullBlockMat d => A i j) (congrArg toFullBlockMat + (coarseBlockMatrix_translateSet_eq_translateCoeffField (intVecToRealVec z) U a)) + +end Homogenization.Book.Ch04 diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Tails.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Tails.lean new file mode 100644 index 0000000000..0a24090e85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Tails.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz + +/-! # Tails -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Public Chapter 4 weak-tail notation + +This file re-exports the already-developed independent-sums tail vocabulary +under the `Book.Ch04` namespace. +-/ + +noncomputable section + +open MeasureTheory + +/-- The weak-Orlicz upper-tail relation `X ≤ O_Psi(A)`. -/ +abbrev IsBigOWith {Ω : Type*} [MeasurableSpace Ω] := + IndependentSums.IsBigOWith (Ω := Ω) + +/-- The upper-tail event `{X > a}` used by the weak-tail notation. -/ +abbrev upperTailEvent {Ω : Type*} : (Ω → ℝ) → ℝ → Set Ω := + IndependentSums.upperTailEvent + +/-- The absolute upper-tail event `{|X| > a}`. -/ +abbrev absTailEvent {Ω : Type*} : (Ω → ℝ) → ℝ → Set Ω := + IndependentSums.absTailEvent + +/-- The symmetric weak-Orlicz relation `X = O_Psi(A)`. -/ +abbrev IsBigO {Ω : Type*} [MeasurableSpace Ω] := + IndependentSums.IsBigO (Ω := Ω) + +/-- Admissible weak-tail functions. -/ +abbrev AdmissiblePsi := + IndependentSums.AdmissiblePsi + +/-- The Chapter 4 growth hypothesis `t Psi(t) ≤ Psi(K t)` for `t ≥ 1`. -/ +abbrev HasPsiGrowth := + IndependentSums.HasPsiGrowth + +/-- The abstract doubling package used in the finite-family weak-tail triangle +inequality. -/ +abbrev HasPsiAbstractDoubling := + IndependentSums.HasPsiAbstractDoubling + +/-- The stretched-exponential model class `Gamma_sigma`. -/ +noncomputable abbrev gammaSigma (σ : ℝ) : ℝ → ℝ := + IndependentSums.gammaSigma σ + +/-- The log-normal model class `Psi_sigma`. -/ +noncomputable abbrev psiSigma (σ : ℝ) : ℝ → ℝ := + IndependentSums.psiSigma σ + +/-- Witness-level `p^(1/sigma)` moment growth for the stretched-exponential +class. -/ +abbrev HasGammaMomentGrowthWith {Ω : Type*} [MeasurableSpace Ω] := + IndependentSums.HasGammaMomentGrowthWith (Ω := Ω) + +/-- Existential `p^(1/sigma)` moment growth for the stretched-exponential +class. -/ +abbrev HasGammaMomentGrowth {Ω : Type*} [MeasurableSpace Ω] := + IndependentSums.HasGammaMomentGrowth (Ω := Ω) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems.lean new file mode 100644 index 0000000000..0bcc9f6de0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.IndependenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.LocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockResponseConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds + +/-! +# Chapter 4 theorem surface + +This aggregate imports the curated public theorem endpoints for Chapter 4. + +The public policy is direct theorem statements over `RestrictionLawCarrier`, +`RestrictionStructuralLaw`, local observables, and ordinary analytic hypotheses. Callers +should not need route-specific wrapper structures. Scalarization witnesses, +primitive route data, and proof-only bound packages remain in `Internal` +namespaces or private declarations. + +The exported theorem families cover local coefficient observables, expectations, +independence and color-class concentration, partition-average fluctuations and +moments, scalarized annealed matrices, annealed subadditivity, moment-factor +comparisons, canonical averages, canonical solution measurability, and +scalar-response weak-norm measurability. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity.lean new file mode 100644 index 0000000000..29a28073dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAEBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAnnealedMatrix +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierFullBlock + +/-! # Annealed Subadditivity -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/BlockLoewner.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/BlockLoewner.lean new file mode 100644 index 0000000000..ad0244f2cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/BlockLoewner.lean @@ -0,0 +1,523 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions + +/-! # Block Loewner -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Proved annealed subadditivity reductions + +This file replaces the old abstract `Annealed*Theory` packages with plain +proved theorems. The pointwise deterministic/a.e. subadditivity hypotheses and +integrability hypotheses remain explicit; Ch4 owns the expectation, stationarity, +matrix-order, and scalarization consequences. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- Integrating an a.e. quadratic-form comparison gives a matrix Löwner +comparison. -/ +theorem matLoewnerLE_of_integral_quadratic_mono + {d : ℕ} {P : RestrictionCoeffLaw d} {A B : Mat d} + {F G : Vec d → RegCoeffField d → ℝ} + (hFint : ∀ x : Vec d, Integrable (F x) P) + (hGint : ∀ x : Vec d, Integrable (G x) P) + (hA : ∀ x : Vec d, + (1 / 2 : ℝ) * vecDot x (matVecMul A x) = ∫ a, F x a ∂P) + (hB : ∀ x : Vec d, + ∫ a, G x a ∂P = (1 / 2 : ℝ) * vecDot x (matVecMul B x)) + (hMono : ∀ x : Vec d, F x ≤ᵐ[P] G x) : + MatLoewnerLE A B := by + intro x + calc + (1 / 2 : ℝ) * vecDot x (matVecMul A x) + = ∫ a, F x a ∂P := hA x + _ ≤ ∫ a, G x a ∂P := integral_mono_ae (hFint x) (hGint x) (hMono x) + _ = (1 / 2 : ℝ) * vecDot x (matVecMul B x) := hB x + +/-- Integrating an a.e. doubled quadratic-form comparison gives a block-matrix +Löwner comparison. -/ +theorem blockMatLoewnerLE_of_integral_quadratic_mono + {d : ℕ} {P : RestrictionCoeffLaw d} {A B : BlockMat d} + {F G : BlockVec d → RegCoeffField d → ℝ} + (hFint : ∀ X : BlockVec d, Integrable (F X) P) + (hGint : ∀ X : BlockVec d, Integrable (G X) P) + (hA : ∀ X : BlockVec d, + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul A X) = ∫ a, F X a ∂P) + (hB : ∀ X : BlockVec d, + ∫ a, G X a ∂P = (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul B X)) + (hMono : ∀ X : BlockVec d, F X ≤ᵐ[P] G X) : + BlockMatLoewnerLE A B := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul A X) + = ∫ a, F X a ∂P := hA X + _ ≤ ∫ a, G X a ∂P := integral_mono_ae (hFint X) (hGint X) (hMono X) + _ = (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul B X) := hB X + +/-- A block Löwner comparison controls diagonal entries of the upper-left +block. -/ +theorem blockMatLoewnerLE_upperLeft_apply {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) (i : Fin d) : + A.upperLeft i i ≤ B.upperLeft i i := by + have hquad := h (Pi.single i 1, 0) + have hA : + blockVecDot (Pi.single i 1, 0) + (blockMatVecMul A (Pi.single i 1, 0)) = A.upperLeft i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + have hB : + blockVecDot (Pi.single i 1, 0) + (blockMatVecMul B (Pi.single i 1, 0)) = B.upperLeft i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + simpa [hA, hB] using hquad + +/-- A block Löwner comparison controls diagonal entries of the lower-right +block. -/ +theorem blockMatLoewnerLE_lowerRight_apply {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) (i : Fin d) : + A.lowerRight i i ≤ B.lowerRight i i := by + have hquad := h (0, Pi.single i 1) + have hA : + blockVecDot (0, Pi.single i 1) + (blockMatVecMul A (0, Pi.single i 1)) = A.lowerRight i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + have hB : + blockVecDot (0, Pi.single i 1) + (blockMatVecMul B (0, Pi.single i 1)) = B.lowerRight i i := by + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul, Pi.single_apply] + simpa [hA, hB] using hquad + +/-- Finite-dimensional matrix quadratic forms are integrable when all entries +are integrable. -/ +private theorem integrable_vecDot_matVecMul_of_integrable_entries + {d : ℕ} {P : RestrictionCoeffLaw d} {M : RegCoeffField d → Mat d} + (hM : ∀ i j, Integrable (fun a => M a i j) P) (x y : Vec d) : + Integrable (fun a => vecDot x (matVecMul (M a) y)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hM i j).mul_const (y j)).const_mul (x i) + +/-- Finite-dimensional matrix quadratic forms commute with entrywise +expectation under entrywise integrability. -/ +private theorem integral_vecDot_matVecMul_eq_of_integrable_entries + {d : ℕ} {P : RestrictionCoeffLaw d} {M : RegCoeffField d → Mat d} + (hM : ∀ i j, Integrable (fun a => M a i j) P) (x y : Vec d) : + ∫ a, vecDot x (matVecMul (M a) y) ∂P = + vecDot x (matVecMul (fun i j => ∫ a, M a i j ∂P) y) := by + simp [vecDot, matVecMul] + rw [MeasureTheory.integral_finsetSum Finset.univ] + · congr 1 + ext i + rw [MeasureTheory.integral_const_mul] + rw [MeasureTheory.integral_finsetSum Finset.univ] + · simp_rw [MeasureTheory.integral_mul_const] + · intro j _hj + exact (hM i j).mul_const (y j) + · intro i _hi + exact (MeasureTheory.integrable_finsetSum Finset.univ fun j _hj => + (hM i j).mul_const (y j)).const_mul (x i) + +/-- Finite-dimensional block quadratic forms are integrable when all block +entries are integrable. -/ +theorem integrable_blockVecDot_blockMatVecMul_of_integrable_entries + {d : ℕ} {P : RestrictionCoeffLaw d} {B : RegCoeffField d → BlockMat d} + (hB : ∀ α β, Integrable (fun a => blockMatEntry (B a) α β) P) + (X Y : BlockVec d) : + Integrable (fun a => blockVecDot X (blockMatVecMul (B a) Y)) P := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨r, s⟩ + have hUL : ∀ i j, Integrable (fun a => (B a).upperLeft i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inl i) (Sum.inl j) + have hUR : ∀ i j, Integrable (fun a => (B a).upperRight i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inl i) (Sum.inr j) + have hLL : ∀ i j, Integrable (fun a => (B a).lowerLeft i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inr i) (Sum.inl j) + have hLR : ∀ i j, Integrable (fun a => (B a).lowerRight i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inr i) (Sum.inr j) + have h1 := integrable_vecDot_matVecMul_of_integrable_entries hUL p r + have h2 := integrable_vecDot_matVecMul_of_integrable_entries hUR p s + have h3 := integrable_vecDot_matVecMul_of_integrable_entries hLL q r + have h4 := integrable_vecDot_matVecMul_of_integrable_entries hLR q s + simpa [blockVecDot, blockMatVecMul, vecDot_add_right, add_assoc] using! + (h1.add h2).add (h3.add h4) + +/-- Finite-dimensional block quadratic forms commute with entrywise expectation +under entrywise integrability. -/ +theorem integral_blockVecDot_blockMatVecMul_eq_of_integrable_entries + {d : ℕ} {P : RestrictionCoeffLaw d} {B : RegCoeffField d → BlockMat d} + (hB : ∀ α β, Integrable (fun a => blockMatEntry (B a) α β) P) + (X Y : BlockVec d) : + ∫ a, blockVecDot X (blockMatVecMul (B a) Y) ∂P = + blockVecDot X + (blockMatVecMul + { upperLeft := fun i j => ∫ a, (B a).upperLeft i j ∂P + upperRight := fun i j => ∫ a, (B a).upperRight i j ∂P + lowerLeft := fun i j => ∫ a, (B a).lowerLeft i j ∂P + lowerRight := fun i j => ∫ a, (B a).lowerRight i j ∂P } Y) := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨r, s⟩ + have hUL : ∀ i j, Integrable (fun a => (B a).upperLeft i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inl i) (Sum.inl j) + have hUR : ∀ i j, Integrable (fun a => (B a).upperRight i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inl i) (Sum.inr j) + have hLL : ∀ i j, Integrable (fun a => (B a).lowerLeft i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inr i) (Sum.inl j) + have hLR : ∀ i j, Integrable (fun a => (B a).lowerRight i j) P := by + intro i j + simpa [blockMatEntry] using hB (Sum.inr i) (Sum.inr j) + let f1 : RegCoeffField d → ℝ := fun a => vecDot p (matVecMul (B a).upperLeft r) + let f2 : RegCoeffField d → ℝ := fun a => vecDot p (matVecMul (B a).upperRight s) + let f3 : RegCoeffField d → ℝ := fun a => vecDot q (matVecMul (B a).lowerLeft r) + let f4 : RegCoeffField d → ℝ := fun a => vecDot q (matVecMul (B a).lowerRight s) + have h1int : Integrable f1 P := + integrable_vecDot_matVecMul_of_integrable_entries hUL p r + have h2int : Integrable f2 P := + integrable_vecDot_matVecMul_of_integrable_entries hUR p s + have h3int : Integrable f3 P := + integrable_vecDot_matVecMul_of_integrable_entries hLL q r + have h4int : Integrable f4 P := + integrable_vecDot_matVecMul_of_integrable_entries hLR q s + have hExpand : + (fun a => blockVecDot (p, q) (blockMatVecMul (B a) (r, s))) = + fun a => (f1 a + f2 a) + (f3 a + f4 a) := by + funext a + simp [f1, f2, f3, f4, blockVecDot, blockMatVecMul, vecDot_add_right, add_assoc] + rw [hExpand] + calc + ∫ a, (f1 a + f2 a) + (f3 a + f4 a) ∂P + = + (∫ a, f1 a ∂P) + (∫ a, f2 a ∂P) + + ((∫ a, f3 a ∂P) + (∫ a, f4 a ∂P)) := by + change ∫ a, (f1 + f2) a + (f3 + f4) a ∂P = _ + rw [integral_add (h1int.add h2int) (h3int.add h4int)] + rw [show ∫ a, (f1 + f2) a ∂P = ∫ a, f1 a ∂P + ∫ a, f2 a ∂P by + exact integral_add h1int h2int] + rw [show ∫ a, (f3 + f4) a ∂P = ∫ a, f3 a ∂P + ∫ a, f4 a ∂P by + exact integral_add h3int h4int] + _ = + blockVecDot (p, q) + (blockMatVecMul + { upperLeft := fun i j => ∫ a, (B a).upperLeft i j ∂P + upperRight := fun i j => ∫ a, (B a).upperRight i j ∂P + lowerLeft := fun i j => ∫ a, (B a).lowerLeft i j ∂P + lowerRight := fun i j => ∫ a, (B a).lowerRight i j ∂P } (r, s)) := by + rw [show ∫ a, f1 a ∂P = + vecDot p (matVecMul (fun i j => ∫ a, (B a).upperLeft i j ∂P) r) from + integral_vecDot_matVecMul_eq_of_integrable_entries hUL p r] + rw [show ∫ a, f2 a ∂P = + vecDot p (matVecMul (fun i j => ∫ a, (B a).upperRight i j ∂P) s) from + integral_vecDot_matVecMul_eq_of_integrable_entries hUR p s] + rw [show ∫ a, f3 a ∂P = + vecDot q (matVecMul (fun i j => ∫ a, (B a).lowerLeft i j ∂P) r) from + integral_vecDot_matVecMul_eq_of_integrable_entries hLL q r] + rw [show ∫ a, f4 a ∂P = + vecDot q (matVecMul (fun i j => ∫ a, (B a).lowerRight i j ∂P) s) from + integral_vecDot_matVecMul_eq_of_integrable_entries hLR q s] + simp [blockVecDot, blockMatVecMul, vecDot_add_right, add_assoc] + +/-- Reflection of doubled variables preserves block Löwner comparisons. -/ +theorem blockMatLoewnerLE_blockReflect {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) : + BlockMatLoewnerLE (blockReflect A) (blockReflect B) := by + intro X + simpa using h (X.2, X.1) + +/-- The lower-right block of a block Löwner comparison is a matrix Löwner +comparison. -/ +theorem matLoewnerLE_lowerRight_of_blockMatLoewnerLE {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) : + MatLoewnerLE A.lowerRight B.lowerRight := by + intro q + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, + vecDot_zero_right] using h (0, q) + +/-- The upper-left block of a block Löwner comparison is a matrix Löwner +comparison. -/ +theorem matLoewnerLE_upperLeft_of_blockMatLoewnerLE {d : ℕ} {A B : BlockMat d} + (h : BlockMatLoewnerLE A B) : + MatLoewnerLE A.upperLeft B.upperLeft := by + intro p + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, + vecDot_zero_right] using h (p, 0) + +/-- Pointwise response subadditivity for the Ch4 scalar response observable, +with the a.e. coefficient representative handled by the Chapter 2 coefficient +family. -/ +theorem restrictionResponseJObservableCubeSet_le_descendantsAverage_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) {n m : ℤ} (hnm : n ≤ m) + (p q : Vec d) : + restrictionResponseJObservableCubeSet (originCube d m) p q a ≤ + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + intro i + have hiScale : i.1 ∈ descendantsAtScale Q n := by + rw [descendantsAtScale_eq_descendantsAtDepth Q (by simpa [Q] using! hnm)] + change i.1 ∈ descendantsAtDepth Q j + exact i.2 + exact F.restrictsTo_descendant (by simpa [Q] using! hnm) hiScale + have hsub := + (Ch02.responseSubadditivityAndScalingTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).responseJ_subadditive + Pcell (fun i : Pcell.Cell => F.coeffOn i.1) hcell p q + have hParent : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q = + restrictionResponseJObservableCubeSet Q p q a := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + = ResponseJ (openCubeSet Q) p q a.toFun := by + simpa [F, Q, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q) p q + _ = restrictionResponseJObservableCubeSet Q p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a.toFun] + rfl + have hTerm : + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) = + fun R : TriadicCube d => restrictionResponseJObservableCubeSet R p q a := by + funext R + calc + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q + = ResponseJ (openCubeSet R) p q a.toFun := by + simpa [F, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain R) (F.coeffOn R) p q + _ = restrictionResponseJObservableCubeSet R p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube R p q a.toFun] + rfl + have hAvg : + Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) = + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := by + calc + Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) + = + descendantsAverage Q j + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) := by + simpa [Pcell] using + Ch02.descendantsDomainPartition_weightedAverage Q j + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) + _ = descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := by + rw [hTerm] + calc + restrictionResponseJObservableCubeSet (originCube d m) p q a + = restrictionResponseJObservableCubeSet Q p q a := rfl + _ = Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := hParent.symm + _ ≤ Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) := hsub + _ = descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := hAvg + _ = + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) := rfl + +/-- Pointwise response subadditivity on an arbitrary triadic cube for the Ch4 +scalar response observable, with the a.e. coefficient representative handled +by the Chapter 2 coefficient family. -/ +theorem restrictionResponseJObservableCubeSet_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (p q : Vec d) : + restrictionResponseJObservableCubeSet Q p q a ≤ + descendantsAverage Q (Int.toNat (Q.scale - k)) + (fun R => restrictionResponseJObservableCubeSet R p q a) := by + let j : ℕ := Int.toNat (Q.scale - k) + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + intro i + have hiScale : i.1 ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + change i.1 ∈ descendantsAtDepth Q j + exact i.2 + exact F.restrictsTo_descendant hk hiScale + have hsub := + (Ch02.responseSubadditivityAndScalingTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).responseJ_subadditive + Pcell (fun i : Pcell.Cell => F.coeffOn i.1) hcell p q + have hParent : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q = + restrictionResponseJObservableCubeSet Q p q a := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + = ResponseJ (openCubeSet Q) p q a.toFun := by + simpa [F, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q) p q + _ = restrictionResponseJObservableCubeSet Q p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a.toFun] + rfl + have hTerm : + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) = + fun R : TriadicCube d => restrictionResponseJObservableCubeSet R p q a := by + funext R + calc + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q + = ResponseJ (openCubeSet R) p q a.toFun := by + simpa [F, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain R) (F.coeffOn R) p q + _ = restrictionResponseJObservableCubeSet R p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube R p q a.toFun] + rfl + have hAvg : + Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) = + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := by + calc + Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) + = + descendantsAverage Q j + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) := by + simpa [Pcell] using + Ch02.descendantsDomainPartition_weightedAverage Q j + (fun R : TriadicCube d => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) + _ = descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := by + rw [hTerm] + calc + restrictionResponseJObservableCubeSet Q p q a + = Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := hParent.symm + _ ≤ Pcell.weightedAverage + (fun i : Pcell.Cell => + Ch02.responseJ (Ch02.cubeDomain i.1) (F.coeffOn i.1) p q) := hsub + _ = descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) := hAvg + _ = + descendantsAverage Q (Int.toNat (Q.scale - k)) + (fun R => restrictionResponseJObservableCubeSet R p q a) := rfl + +/-- Pointwise block coarse-matrix subadditivity on an arbitrary triadic cube +for a locally a.e.-elliptic coefficient field, with the a.e. representative +handled by the Chapter 2 coefficient family. -/ +theorem coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet Q) a.toFun) + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + let j : ℕ := Int.toNat (Q.scale - k) + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + intro i + have hiScale : i.1 ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + change i.1 ∈ descendantsAtDepth Q j + exact i.2 + exact F.restrictsTo_descendant hk hiScale + have hsub := + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_subadditive + Pcell (fun i : Pcell.Cell => F.coeffOn i.1) hcell + have hParent : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + simpa [j, hParent, hAvg] using hsub + +/-- Pointwise block coarse-matrix subadditivity for a locally a.e.-elliptic +coefficient field, with the a.e. representative handled by the Chapter 2 +coefficient family. -/ +theorem coarseBlockMatrix_le_descendantsAverageBlockMat_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) {n m : ℤ} (hnm : n ≤ m) : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) + (descendantsAverageBlockMat (originCube d m) (Int.toNat (m - n)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + simpa using! + coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + ha (originCube d m) hnm + + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAEBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAEBounds.lean new file mode 100644 index 0000000000..7444399f06 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAEBounds.lean @@ -0,0 +1,741 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner + +/-! # Law Carrier AEBounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +namespace RestrictionLawCarrier + +/-- The deterministic descendant-average comparison for scalar response +observables holds almost surely under a law carrier. -/ +theorem restrictionResponseJObservableCubeSet_le_descendantsAverage_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {n m : ℤ} (hnm : n ≤ m) (p q : Vec d) : + restrictionResponseJObservableCubeSet (originCube d m) p q ≤ᵐ[P] + fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + exact + restrictionResponseJObservableCubeSet_le_descendantsAverage_of_aelocallyUniformlyEllipticField + ha hnm p q + +/-- The deterministic descendant-average comparison for coarse block matrices on +an arbitrary triadic cube holds almost surely under a law carrier. -/ +theorem coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + ∀ᵐ a ∂P, + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet Q) a.toFun) + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + exact + coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + ha Q hk + +/-- The deterministic descendant-average comparison for coarse block matrices +holds almost surely under a law carrier. -/ +theorem coarseBlockMatrix_le_descendantsAverageBlockMat_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {n m : ℤ} (hnm : n ≤ m) : + ∀ᵐ a ∂P, + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) + (descendantsAverageBlockMat (originCube d m) (Int.toNat (m - n)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + simpa using! + hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae + (originCube d m) hnm + +/-- Diagonal upper-left block positive excess is controlled by the centered +descendant average of the corresponding entry observable. -/ +theorem coarseBlockMatrix_upperLeft_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (i : Fin d) : + (fun a : RegCoeffField d => + max + ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i - + ∫ b, (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).upperLeft i i ∂P) + 0) ≤ᵐ[P] + fun a => + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i i) a| := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).upperLeft i i + let μ0 : ℝ := ∫ b, X (cubeSet (originCube d k)) b ∂P + filter_upwards [hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae Q hk] + with a hSub + have hEntryBlock := blockMatLoewnerLE_upperLeft_apply hSub i + have hEntry : + (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i ≤ + restrictionDescendantAverageOnCube Q k X a := by + have hAvg : + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).upperLeft i i = + restrictionDescendantAverageOnCube Q k X a := by + simp [X, restrictionDescendantAverageOnCube, descendantsAverageBlockMat, + descendantsAverageMat, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [hAvg] using hEntryBlock + have hCenter : + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - μ0 := by + exact congrFun + (restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + have hPoint : + max ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i - μ0) 0 ≤ + |restrictionCenteredDescendantAverageOnCube P Q k X a| := by + have hle : + (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i - μ0 ≤ + restrictionDescendantAverageOnCube Q k X a - μ0 := by + linarith + have hmax : + max ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i - μ0) 0 ≤ + max (restrictionDescendantAverageOnCube Q k X a - μ0) 0 := + max_le_max hle le_rfl + have hmax_abs : + max (restrictionDescendantAverageOnCube Q k X a - μ0) 0 ≤ + |restrictionDescendantAverageOnCube Q k X a - μ0| := + max_le (le_abs_self _) (abs_nonneg _) + simpa [hCenter] using hmax.trans hmax_abs + simpa [X, μ0] using hPoint + +/-- Operator-norm upper-left positive excess is controlled by the entrywise +centered descendant-average fluctuations. The norm here is +`Ch02.matrixNorm`, i.e. the matrix operator norm. -/ +theorem coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).upperLeft i j ∂P) : + (fun a : RegCoeffField d => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := by + filter_upwards [hP.ae_locallyUniformlyEllipticField, + hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae Q hk] + with a ha hSub + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let A : Mat d := (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft + let B : Mat d := + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).upperLeft + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hApsd : A.PosSemidef := by + change ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft).PosSemidef + rw [hEq] + exact Ch02.bCoarse_posSemidef (Ch02.cubeDomain Q) (F.coeffOn Q) + have hAB : MatLoewnerLE A B := by + simpa [A, B] using matLoewnerLE_upperLeft_of_blockMatLoewnerLE hSub + have hBpsd : B.PosSemidef := by + change + ((descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).upperLeft).PosSemidef + change + (descendantsAverageMat Q (Int.toNat (Q.scale - k)) + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft)).PosSemidef + refine descendantsAverageMat_posSemidef ?_ + intro R hR + have hEqR : + coarseBlockMatrix (cubeSet R) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + rw [hEqR] + exact Ch02.bCoarse_posSemidef (Ch02.cubeDomain R) (F.coeffOn R) + have hNorm : + Ch02.matrixNorm A ≤ + Ch02.matrixNorm center + + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := by + calc + Ch02.matrixNorm A ≤ + Ch02.matrixNorm center + ∑ i : Fin d, ∑ j : Fin d, |B i j - center i j| := + Ch02.matrixNorm_le_center_add_sum_abs_sub_entries_of_matLoewnerLE + hApsd hBpsd hAB + _ = + Ch02.matrixNorm center + + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + refine Finset.sum_congr rfl ?_ + intro j _hj + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j + have hAvg : + B i j = restrictionDescendantAverageOnCube Q k X a := by + simp [B, X, restrictionDescendantAverageOnCube, descendantsAverageBlockMat, + descendantsAverageMat, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth Q hk] + have hCentered : + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - center i j := by + calc + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - + ∫ b, X (cubeSet (originCube d k)) b ∂P := by + exact congrFun + (restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + _ = restrictionDescendantAverageOnCube Q k X a - center i j := by + exact congrArg + (fun c => restrictionDescendantAverageOnCube Q k X a - c) + (hcenter i j).symm + rw [hAvg, ← hCentered] + have hsum_nonneg : + 0 ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := by + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + have hsub : + Ch02.matrixNorm A - Ch02.matrixNorm center ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := by + linarith + exact max_le hsub hsum_nonneg + +/-- Finite-parent version of the upper-left operator-norm positive-excess +domination. This is the clean raw deterministic input for the Ch4 +large-scale fluctuation theorem: no representative observable is exposed. -/ +theorem coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {k : ℤ} + (hparent_scale : ∀ Q ∈ parents, k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).upperLeft i j ∂P) : + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0)) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a|) := by + have hPoint : + ∀ᵐ a ∂P, ∀ Q, Q ∈ parents → + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0 ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := + ae_forall_mem_finset (P := P) parents fun Q hQ => + hP.coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + Q (hparent_scale Q hQ) center hcenter + filter_upwards [hPoint] with a hPoint_a + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + calc + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0 + ≤ ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a| := + hPoint_a Q hQ + _ ≤ ∑ i : Fin d, ∑ j : Fin d, + parents.sup' hparents + (fun Q' => + |restrictionCenteredDescendantAverageOnCube P Q' k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a|) := by + exact Finset.sum_le_sum fun i _ => + Finset.sum_le_sum fun j _ => + Finset.le_sup' + (f := fun Q' => + |restrictionCenteredDescendantAverageOnCube P Q' k + (fun U a => (coarseBlockMatrix U a.toFun).upperLeft i j) a|) hQ + +/-- Representative version of +`coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae`. +Each entry may be replaced by an a.e.-equal local/measurable representative +before applying the probabilistic partition-average theorem. -/ +theorem coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_rep_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).upperLeft i j ∂P) + (Y : Fin d → Fin d → Set (Vec d) → RegCoeffField d → ℝ) + (hOrigin : + ∀ i j : Fin d, + (fun a : RegCoeffField d => + (coarseBlockMatrix (cubeSet (originCube d k)) a.toFun).upperLeft i j) =ᵐ[P] + Y i j (cubeSet (originCube d k))) + (hDesc : + ∀ i j : Fin d, ∀ R, R ∈ descendantsAtScale Q k → + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft i j) =ᵐ[P] + Y i j (cubeSet R)) : + (fun a : RegCoeffField d => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k (Y i j) a| := by + let X : Fin d → Fin d → Set (Vec d) → RegCoeffField d → ℝ := + fun i j U a => (coarseBlockMatrix U a.toFun).upperLeft i j + have hRaw := + hP.coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + Q hk center hcenter + have hCentered : + ∀ i j : Fin d, + restrictionCenteredDescendantAverageOnCube P Q k (X i j) =ᵐ[P] + restrictionCenteredDescendantAverageOnCube P Q k (Y i j) := by + intro i j + exact restrictionCenteredDescendantAverageOnCube_ae_eq_of_ae_eq + (P := P) (Q := Q) (n := k) (X := X i j) (Y := Y i j) + (by simpa [X] using hOrigin i j) + (by intro R hR; simpa [X] using hDesc i j R hR) + have hAll : + ∀ᵐ a ∂P, ∀ i j : Fin d, + restrictionCenteredDescendantAverageOnCube P Q k (X i j) a = + restrictionCenteredDescendantAverageOnCube P Q k (Y i j) a := + by + filter_upwards + [ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => hCentered i j)] with a h i j + exact h i (by simp) j (by simp) + filter_upwards [hRaw, hAll] with a hle hEq + refine hle.trans_eq ?_ + congr 1 + ext i + congr 1 + ext j + rw [hEq i j] + +/-- Same upper-left diagonal positive-excess control, after replacing the raw +coarse-block entry by an a.e.-equal representative. This is the form consumed +by local/measurable representative arguments. -/ +theorem coarseBlockMatrix_upperLeft_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_rep_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (i : Fin d) + (Y : Set (Vec d) → RegCoeffField d → ℝ) + (hOrigin : + (fun a : RegCoeffField d => + (coarseBlockMatrix (cubeSet (originCube d k)) a.toFun).upperLeft i i) =ᵐ[P] + Y (cubeSet (originCube d k))) + (hDesc : + ∀ R, R ∈ descendantsAtScale Q k → + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft i i) =ᵐ[P] + Y (cubeSet R)) : + (fun a : RegCoeffField d => + max + ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i - + ∫ b, (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).upperLeft i i ∂P) + 0) ≤ᵐ[P] + fun a => |restrictionCenteredDescendantAverageOnCube P Q k Y a| := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).upperLeft i i + have hRaw := + hP.coarseBlockMatrix_upperLeft_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_ae + Q hk i + have hCentered : + restrictionCenteredDescendantAverageOnCube P Q k X =ᵐ[P] + restrictionCenteredDescendantAverageOnCube P Q k Y := + restrictionCenteredDescendantAverageOnCube_ae_eq_of_ae_eq + (P := P) (Q := Q) (n := k) (X := X) (Y := Y) + (by simpa [X] using hOrigin) + (by intro R hR; simpa [X] using hDesc R hR) + filter_upwards [hRaw, hCentered] with a hle hEq + simpa [X, hEq] using hle + +/-- Diagonal lower-right block positive excess is controlled by the centered +descendant average of the corresponding entry observable. -/ +theorem coarseBlockMatrix_lowerRight_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (i : Fin d) : + (fun a : RegCoeffField d => + max + ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i - + ∫ b, (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).lowerRight i i ∂P) + 0) ≤ᵐ[P] + fun a => + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i i) a| := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).lowerRight i i + let μ0 : ℝ := ∫ b, X (cubeSet (originCube d k)) b ∂P + filter_upwards [hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae Q hk] + with a hSub + have hEntryBlock := blockMatLoewnerLE_lowerRight_apply hSub i + have hEntry : + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i ≤ + restrictionDescendantAverageOnCube Q k X a := by + have hAvg : + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).lowerRight i i = + restrictionDescendantAverageOnCube Q k X a := by + simp [X, restrictionDescendantAverageOnCube, descendantsAverageBlockMat, + descendantsAverageMat, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [hAvg] using hEntryBlock + have hCenter : + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - μ0 := by + exact congrFun + (restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + have hPoint : + max ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i - μ0) 0 ≤ + |restrictionCenteredDescendantAverageOnCube P Q k X a| := by + have hle : + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i - μ0 ≤ + restrictionDescendantAverageOnCube Q k X a - μ0 := by + linarith + have hmax : + max ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i - μ0) 0 ≤ + max (restrictionDescendantAverageOnCube Q k X a - μ0) 0 := + max_le_max hle le_rfl + have hmax_abs : + max (restrictionDescendantAverageOnCube Q k X a - μ0) 0 ≤ + |restrictionDescendantAverageOnCube Q k X a - μ0| := + max_le (le_abs_self _) (abs_nonneg _) + simpa [hCenter] using hmax.trans hmax_abs + simpa [X, μ0] using hPoint + +/-- Operator-norm lower-right positive excess is controlled by the entrywise +centered descendant-average fluctuations. The norm here is +`Ch02.matrixNorm`, i.e. the matrix operator norm. -/ +theorem coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).lowerRight i j ∂P) : + (fun a : RegCoeffField d => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := by + filter_upwards [hP.ae_locallyUniformlyEllipticField, + hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae Q hk] + with a ha hSub + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let A : Mat d := (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight + let B : Mat d := + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).lowerRight + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hApsd : A.PosSemidef := by + change ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight).PosSemidef + rw [hEq] + exact (Ch02.sigmaStarInvCoarse_posDef (Ch02.cubeDomain Q) (F.coeffOn Q)).posSemidef + have hAB : MatLoewnerLE A B := by + simpa [A, B] using matLoewnerLE_lowerRight_of_blockMatLoewnerLE hSub + have hBpsd : B.PosSemidef := by + change + ((descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)).lowerRight).PosSemidef + change + (descendantsAverageMat Q (Int.toNat (Q.scale - k)) + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight)).PosSemidef + refine descendantsAverageMat_posSemidef ?_ + intro R hR + have hEqR : + coarseBlockMatrix (cubeSet R) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + rw [hEqR] + exact (Ch02.sigmaStarInvCoarse_posDef (Ch02.cubeDomain R) (F.coeffOn R)).posSemidef + have hNorm : + Ch02.matrixNorm A ≤ + Ch02.matrixNorm center + + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := by + calc + Ch02.matrixNorm A ≤ + Ch02.matrixNorm center + ∑ i : Fin d, ∑ j : Fin d, |B i j - center i j| := + Ch02.matrixNorm_le_center_add_sum_abs_sub_entries_of_matLoewnerLE + hApsd hBpsd hAB + _ = + Ch02.matrixNorm center + + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + refine Finset.sum_congr rfl ?_ + intro j _hj + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j + have hAvg : + B i j = restrictionDescendantAverageOnCube Q k X a := by + simp [B, X, restrictionDescendantAverageOnCube, descendantsAverageBlockMat, + descendantsAverageMat, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth Q hk] + have hCentered : + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - center i j := by + calc + restrictionCenteredDescendantAverageOnCube P Q k X a = + restrictionDescendantAverageOnCube Q k X a - + ∫ b, X (cubeSet (originCube d k)) b ∂P := by + exact congrFun + (restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + _ = restrictionDescendantAverageOnCube Q k X a - center i j := by + exact congrArg + (fun c => restrictionDescendantAverageOnCube Q k X a - c) + (hcenter i j).symm + rw [hAvg, ← hCentered] + have hsum_nonneg : + 0 ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := by + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + have hsub : + Ch02.matrixNorm A - Ch02.matrixNorm center ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := by + linarith + exact max_le hsub hsum_nonneg + +/-- Finite-parent version of the lower-right operator-norm positive-excess +domination. This is the clean raw deterministic input for the Ch4 +large-scale fluctuation theorem: no representative observable is exposed. -/ +theorem coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {k : ℤ} + (hparent_scale : ∀ Q ∈ parents, k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).lowerRight i j ∂P) : + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0)) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a|) := by + have hPoint : + ∀ᵐ a ∂P, ∀ Q, Q ∈ parents → + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0 ≤ + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := + ae_forall_mem_finset (P := P) parents fun Q hQ => + hP.coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + Q (hparent_scale Q hQ) center hcenter + filter_upwards [hPoint] with a hPoint_a + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + calc + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0 + ≤ ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a| := + hPoint_a Q hQ + _ ≤ ∑ i : Fin d, ∑ j : Fin d, + parents.sup' hparents + (fun Q' => + |restrictionCenteredDescendantAverageOnCube P Q' k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a|) := by + exact Finset.sum_le_sum fun i _ => + Finset.sum_le_sum fun j _ => + Finset.le_sup' + (f := fun Q' => + |restrictionCenteredDescendantAverageOnCube P Q' k + (fun U a => (coarseBlockMatrix U a.toFun).lowerRight i j) a|) hQ + +/-- Representative version of +`coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae`. +Each entry may be replaced by an a.e.-equal local/measurable representative +before applying the probabilistic partition-average theorem. -/ +theorem coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_rep_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).lowerRight i j ∂P) + (Y : Fin d → Fin d → Set (Vec d) → RegCoeffField d → ℝ) + (hOrigin : + ∀ i j : Fin d, + (fun a : RegCoeffField d => + (coarseBlockMatrix (cubeSet (originCube d k)) a.toFun).lowerRight i j) =ᵐ[P] + Y i j (cubeSet (originCube d k))) + (hDesc : + ∀ i j : Fin d, ∀ R, R ∈ descendantsAtScale Q k → + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight i j) =ᵐ[P] + Y i j (cubeSet R)) : + (fun a : RegCoeffField d => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) ≤ᵐ[P] + fun a => + ∑ i : Fin d, ∑ j : Fin d, + |restrictionCenteredDescendantAverageOnCube P Q k (Y i j) a| := by + let X : Fin d → Fin d → Set (Vec d) → RegCoeffField d → ℝ := + fun i j U a => (coarseBlockMatrix U a.toFun).lowerRight i j + have hRaw := + hP.coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_le_sum_abs_restrictionCenteredDescendantAverageOnCube_ae + Q hk center hcenter + have hCentered : + ∀ i j : Fin d, + restrictionCenteredDescendantAverageOnCube P Q k (X i j) =ᵐ[P] + restrictionCenteredDescendantAverageOnCube P Q k (Y i j) := by + intro i j + exact restrictionCenteredDescendantAverageOnCube_ae_eq_of_ae_eq + (P := P) (Q := Q) (n := k) (X := X i j) (Y := Y i j) + (by simpa [X] using hOrigin i j) + (by intro R hR; simpa [X] using hDesc i j R hR) + have hAll : + ∀ᵐ a ∂P, ∀ i j : Fin d, + restrictionCenteredDescendantAverageOnCube P Q k (X i j) a = + restrictionCenteredDescendantAverageOnCube P Q k (Y i j) a := + by + filter_upwards + [ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => hCentered i j)] with a h i j + exact h i (by simp) j (by simp) + filter_upwards [hRaw, hAll] with a hle hEq + refine hle.trans_eq ?_ + congr 1 + ext i + congr 1 + ext j + rw [hEq i j] + +/-- Same lower-right diagonal positive-excess control, after replacing the raw +coarse-block entry by an a.e.-equal representative. -/ +theorem coarseBlockMatrix_lowerRight_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_rep_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (i : Fin d) + (Y : Set (Vec d) → RegCoeffField d → ℝ) + (hOrigin : + (fun a : RegCoeffField d => + (coarseBlockMatrix (cubeSet (originCube d k)) a.toFun).lowerRight i i) =ᵐ[P] + Y (cubeSet (originCube d k))) + (hDesc : + ∀ R, R ∈ descendantsAtScale Q k → + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight i i) =ᵐ[P] + Y (cubeSet R)) : + (fun a : RegCoeffField d => + max + ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i - + ∫ b, (coarseBlockMatrix (cubeSet (originCube d k)) b.toFun).lowerRight i i ∂P) + 0) ≤ᵐ[P] + fun a => |restrictionCenteredDescendantAverageOnCube P Q k Y a| := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => (coarseBlockMatrix U a.toFun).lowerRight i i + have hRaw := + hP.coarseBlockMatrix_lowerRight_apply_positiveExcess_le_abs_restrictionCenteredDescendantAverageOnCube_ae + Q hk i + have hCentered : + restrictionCenteredDescendantAverageOnCube P Q k X =ᵐ[P] + restrictionCenteredDescendantAverageOnCube P Q k Y := + restrictionCenteredDescendantAverageOnCube_ae_eq_of_ae_eq + (P := P) (Q := Q) (n := k) (X := X) (Y := Y) + (by simpa [X] using hOrigin) + (by intro R hR; simpa [X] using hDesc R hR) + filter_upwards [hRaw, hCentered] with a hle hEq + simpa [X, hEq] using hle + + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAnnealedMatrix.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAnnealedMatrix.lean new file mode 100644 index 0000000000..fc3a15f3f7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierAnnealedMatrix.lean @@ -0,0 +1,646 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAEBounds + +/-! # Law Carrier Annealed Matrix -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +namespace RestrictionLawCarrier + +/- Annealed response subadditivity from the a.e. deterministic comparison, +finite descendant integrability, and stationarity. -/ +private theorem annealedResponseJAtScale_le_of_ae_descendantsAverage + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (p q : Vec d) + (hParentInt : Integrable (restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (restrictionResponseJObservableCubeSet R p q) P) + (hSub : + restrictionResponseJObservableCubeSet (originCube d m) p q ≤ᵐ[P] + fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a)) : + annealedResponseJAtScale P m p q ≤ annealedResponseJAtScale P n p q := by + have hDescIntDepth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - n)) → + Integrable (restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDescInt R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR) + have hAvgInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a)) P := + integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescIntDepth + calc + annealedResponseJAtScale P m p q + = ∫ a, restrictionResponseJObservableCubeSet (originCube d m) p q a ∂P := rfl + _ ≤ ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) ∂P := + integral_mono_ae hParentInt hAvgInt hSub + _ = expectedResponseJCubeSet P (originCube d n) p q := + hP.integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_originCube_of_stationary + hstat hn hnm p q hDescInt + _ = annealedResponseJAtScale P n p q := rfl + +/-- Law-facing annealed response subadditivity. Ch4 supplies the deterministic +a.e. descendant comparison; callers only provide the integrability and +stationarity hypotheses used by the expectation step. -/ +theorem annealedResponseJAtScale_le + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (p q : Vec d) + (hParentInt : Integrable (restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (restrictionResponseJObservableCubeSet R p q) P) : + annealedResponseJAtScale P m p q ≤ annealedResponseJAtScale P n p q := + hP.annealedResponseJAtScale_le_of_ae_descendantsAverage hstat hn hnm p q + hParentInt hDescInt + (hP.restrictionResponseJObservableCubeSet_le_descendantsAverage_ae hnm p q) + +/-- Entrywise expectation of the deterministic descendant-average coarse block +matrix is the annealed origin-cube block matrix at the child scale. -/ +private theorem integral_descendantsAverageBlockMat_entry_eq_annealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + ∀ α β, Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) P) + (α β : BlockCoord d) : + ∫ a, + blockMatEntry + (descendantsAverageBlockMat (originCube d m) (Int.toNat (m - n)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) α β ∂P = + blockMatEntry (annealedBlockMatrixAtScale P n) α β := by + classical + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + have hDescIntDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) P := by + intro R hR + exact hDescInt R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth Q hnm] using! hR) α β + have hEntryFun : + (fun a : RegCoeffField d => + blockMatEntry + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) + α β) = + fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) := by + funext a + cases α <;> cases β <;> rfl + rw [show + (fun a : RegCoeffField d => + blockMatEntry + (descendantsAverageBlockMat (originCube d m) (Int.toNat (m - n)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) α β) = + fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) by + simpa [Q, j] using hEntryFun] + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hDscale : D = descendantsAtScale Q n := by + simpa [D, Q, j, originCube] using (descendantsAtScale_eq_descendantsAtDepth Q hnm).symm + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne : ((D.card : ℝ) ≠ 0) := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + calc + ∫ a, + descendantsAverage Q j + (fun R => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) ∂P + = + descendantsAverage Q j + (fun R => + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P) := + integral_descendantsAverage_eq_descendantsAverage_integral hDescIntDepth + _ = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P) := by + rfl + _ = + (D.card : ℝ)⁻¹ * + (∑ _R ∈ D, + ∫ a, + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) α β ∂P) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro R hR + exact + hP.integral_coarseBlockMatrix_entry_cubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + hstat hn hnm (by simpa [Q, hDscale] using hR) α β + _ = + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) α β ∂P := by + simp [Finset.sum_const, nsmul_eq_mul, hcard_ne] + _ = blockMatEntry (annealedBlockMatrixAtScale P n) α β := by + cases α <;> cases β <;> rfl + +/-- Law-facing annealed block monotonicity. Ch4 supplies the deterministic +a.e. block comparison and the stationarity step; callers provide only the +entrywise integrability needed to take expectations. -/ +theorem blockMatLoewnerLE_annealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (hParentInt : + ∀ α β, Integrable + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) α β) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + ∀ α β, Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) P) : + BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n) := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + let parentBlock : RegCoeffField d → BlockMat d := + fun a => coarseBlockMatrix (cubeSet Q) a.toFun + let childAverageBlock : RegCoeffField d → BlockMat d := + fun a => descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) + have hDescIntDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + ∀ α β, Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) P := by + intro R hR α β + exact hDescInt R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth Q hnm] using! hR) α β + have hChildAverageEntryInt : + ∀ α β, Integrable (fun a : RegCoeffField d => blockMatEntry (childAverageBlock a) α β) P := by + intro α β + have hEntryFun : + (fun a : RegCoeffField d => blockMatEntry (childAverageBlock a) α β) = + fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β) := by + funext a + cases α <;> cases β <;> rfl + rw [hEntryFun] + exact integrable_descendantsAverage (fun R hR => hDescIntDepth R hR α β) + have hChildAverageBlockEq : + { upperLeft := fun i k => ∫ a, (childAverageBlock a).upperLeft i k ∂P + upperRight := fun i k => ∫ a, (childAverageBlock a).upperRight i k ∂P + lowerLeft := fun i k => ∫ a, (childAverageBlock a).lowerLeft i k ∂P + lowerRight := fun i k => ∫ a, (childAverageBlock a).lowerRight i k ∂P } = + annealedBlockMatrixAtScale P n := by + let C : BlockMat d := + { upperLeft := fun i k => ∫ a, (childAverageBlock a).upperLeft i k ∂P + upperRight := fun i k => ∫ a, (childAverageBlock a).upperRight i k ∂P + lowerLeft := fun i k => ∫ a, (childAverageBlock a).lowerLeft i k ∂P + lowerRight := fun i k => ∫ a, (childAverageBlock a).lowerRight i k ∂P } + change C = annealedBlockMatrixAtScale P n + have hUL : C.upperLeft = (annealedBlockMatrixAtScale P n).upperLeft := by + funext i k + simpa [blockMatEntry, childAverageBlock, Q, j, C] using! + hP.integral_descendantsAverageBlockMat_entry_eq_annealedBlockMatrixAtScale + hstat hn hnm hDescInt (Sum.inl i) (Sum.inl k) + have hUR : C.upperRight = (annealedBlockMatrixAtScale P n).upperRight := by + funext i k + simpa [blockMatEntry, childAverageBlock, Q, j, C] using! + hP.integral_descendantsAverageBlockMat_entry_eq_annealedBlockMatrixAtScale + hstat hn hnm hDescInt (Sum.inl i) (Sum.inr k) + have hLL : C.lowerLeft = (annealedBlockMatrixAtScale P n).lowerLeft := by + funext i k + simpa [blockMatEntry, childAverageBlock, Q, j, C] using! + hP.integral_descendantsAverageBlockMat_entry_eq_annealedBlockMatrixAtScale + hstat hn hnm hDescInt (Sum.inr i) (Sum.inl k) + have hLR : C.lowerRight = (annealedBlockMatrixAtScale P n).lowerRight := by + funext i k + simpa [blockMatEntry, childAverageBlock, Q, j, C] using! + hP.integral_descendantsAverageBlockMat_entry_eq_annealedBlockMatrixAtScale + hstat hn hnm hDescInt (Sum.inr i) (Sum.inr k) + exact (BlockMat.mk.injEq C.upperLeft C.upperRight C.lowerLeft C.lowerRight + (annealedBlockMatrixAtScale P n).upperLeft (annealedBlockMatrixAtScale P n).upperRight + (annealedBlockMatrixAtScale P n).lowerLeft + (annealedBlockMatrixAtScale P n).lowerRight).mpr ⟨hUL, hUR, hLL, hLR⟩ + refine + blockMatLoewnerLE_of_integral_quadratic_mono + (P := P) + (A := annealedBlockMatrixAtScale P m) + (B := annealedBlockMatrixAtScale P n) + (F := fun X a => + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (parentBlock a) X)) + (G := fun X a => + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (childAverageBlock a) X)) + ?hFint ?hGint ?hA ?hB ?hMono + · intro X + exact + (integrable_blockVecDot_blockMatVecMul_of_integrable_entries + (by simpa [parentBlock, Q] using hParentInt) X X).const_mul (1 / 2 : ℝ) + · intro X + exact + (integrable_blockVecDot_blockMatVecMul_of_integrable_entries + hChildAverageEntryInt X X).const_mul (1 / 2 : ℝ) + · intro X + have hInt := + integral_blockVecDot_blockMatVecMul_eq_of_integrable_entries + (B := parentBlock) + (by simpa [parentBlock, Q] using hParentInt) X X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (annealedBlockMatrixAtScale P m) X) + = + (1 / 2 : ℝ) * + ∫ a, blockVecDot X (blockMatVecMul (parentBlock a) X) ∂P := by + simpa [parentBlock, Q, annealedBlockMatrixAtScale, annealedBlockMatrix] using + congrArg (fun t => (1 / 2 : ℝ) * t) hInt.symm + _ = + ∫ a, + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (parentBlock a) X) ∂P := by + rw [integral_const_mul] + · intro X + have hInt := + integral_blockVecDot_blockMatVecMul_eq_of_integrable_entries + (B := childAverageBlock) hChildAverageEntryInt X X + calc + ∫ a, + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (childAverageBlock a) X) ∂P + = + (1 / 2 : ℝ) * + ∫ a, blockVecDot X (blockMatVecMul (childAverageBlock a) X) ∂P := by + rw [integral_const_mul] + _ = + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (annealedBlockMatrixAtScale P n) X) := by + rw [hInt] + rw [hChildAverageBlockEq] + · intro X + filter_upwards [hP.coarseBlockMatrix_le_descendantsAverageBlockMat_ae hnm] with a ha + simpa [parentBlock, childAverageBlock, Q, j] using ha X + +end RestrictionLawCarrier + +/-- The starred annealed block monotonicity follows from annealed block +monotonicity by the built-in block reflection. -/ +theorem blockMatLoewnerLE_annealedStarredBlockMatrixInvAtScale_of_block + {d : ℕ} {P : RestrictionCoeffLaw d} {n m : ℤ} + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) : + BlockMatLoewnerLE (annealedStarredBlockMatrixInvAtScale P m) + (annealedStarredBlockMatrixInvAtScale P n) := by + simpa [annealedStarredBlockMatrixInvAtScale, annealedStarredBlockMatrixInv] using! + blockMatLoewnerLE_blockReflect hBlock + +/-- Matrix monotonicity of `σ_*⁻¹` follows from annealed block monotonicity. -/ +theorem matLoewnerLE_annealedSigmaStarInvAtScale_of_block + {d : ℕ} {P : RestrictionCoeffLaw d} {n m : ℤ} + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) : + MatLoewnerLE (annealedSigmaStarInvAtScale P m) + (annealedSigmaStarInvAtScale P n) := by + simpa [annealedSigmaStarInvAtScale, annealedSigmaStarInv, + annealedBlockMatrixAtScale] using + matLoewnerLE_lowerRight_of_blockMatLoewnerLE hBlock + +/-- Matrix monotonicity of `b` follows from annealed block monotonicity. -/ +theorem matLoewnerLE_annealedBAtScale_of_block + {d : ℕ} {P : RestrictionCoeffLaw d} {n m : ℤ} + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) : + MatLoewnerLE (annealedBAtScale P m) (annealedBAtScale P n) := by + simpa [annealedBAtScale, annealedB, annealedBlockMatrixAtScale] using + matLoewnerLE_upperLeft_of_blockMatLoewnerLE hBlock + +/-- Scalar monotonicity of the primitive inverse-star coefficient from matrix +monotonicity. -/ +private theorem barSigmaStarInv_le_of_annealedSigmaStarInvAtScale_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hMono : MatLoewnerLE (annealedSigmaStarInvAtScale P m) + (annealedSigmaStarInvAtScale P n)) : + hm.barSigmaStarInv ≤ hn.barSigmaStarInv := + Internal.AnnealedPrimitiveScalarizationData.barSigmaStarInv_le_of_matLoewnerLE hm hn hMono + +/-- Scalar monotonicity of the primitive upper-left coefficient from matrix +monotonicity. -/ +private theorem barB_le_of_annealedBAtScale_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hMono : MatLoewnerLE (annealedBAtScale P m) (annealedBAtScale P n)) : + hm.barB ≤ hn.barB := + Internal.AnnealedPrimitiveScalarizationData.barB_le_of_matLoewnerLE hm hn hMono + +/-- The scalar chain +`\barσ_{*,n} ≤ \barσ_{*,m} ≤ \barσ_m ≤ \barσ_n` from primitive +scalarization data and matrix monotonicity. -/ +private theorem scalar_chain_of_primitive_matrix_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hStarMono : MatLoewnerLE (annealedSigmaStarInvAtScale P m) + (annealedSigmaStarInvAtScale P n)) + (hBMono : MatLoewnerLE (annealedBAtScale P m) (annealedBAtScale P n)) + (hStar_m_pos : 0 < hm.barSigmaStarInv) + (hContrast_m : 1 ≤ hm.contrast) : + hScal.barSigmaStar n ≤ hScal.barSigmaStar m ∧ + hScal.barSigmaStar m ≤ hScal.barSigma m ∧ + hScal.barSigma m ≤ hScal.barSigma n := by + have hStar_le : hm.barSigmaStarInv ≤ hn.barSigmaStarInv := + barSigmaStarInv_le_of_annealedSigmaStarInvAtScale_mono hm hn hStarMono + have hB_le : hm.barB ≤ hn.barB := + barB_le_of_annealedBAtScale_mono hm hn hBMono + constructor + · exact + Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_le_of_barSigmaStarInv_le + hScal hm hn hStar_le hStar_m_pos + · constructor + · exact + Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_le_barSigma_of_one_le_contrast + hScal hm hContrast_m hStar_m_pos + · exact + Internal.AnnealedPrimitiveScalarizationData.barSigma_le_of_barB_le + hScal hm hn hB_le + +/-- The scalar chain +`\barσ_{*,n} ≤ \barσ_{*,m} ≤ \barσ_m ≤ \barσ_n` from primitive +scalarization data and annealed block monotonicity. -/ +theorem scalar_chain_of_primitive_block_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) + (hStar_m_pos : 0 < hm.barSigmaStarInv) + (hContrast_m : 1 ≤ hm.contrast) : + hScal.barSigmaStar n ≤ hScal.barSigmaStar m ∧ + hScal.barSigmaStar m ≤ hScal.barSigma m ∧ + hScal.barSigma m ≤ hScal.barSigma n := + scalar_chain_of_primitive_matrix_mono hScal hm hn + (matLoewnerLE_annealedSigmaStarInvAtScale_of_block hBlock) + (matLoewnerLE_annealedBAtScale_of_block hBlock) + hStar_m_pos hContrast_m + +/-- Primitive contrast monotonicity from primitive scalarization data and +matrix monotonicity. -/ +private theorem primitive_contrast_le_of_matrix_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hStarMono : MatLoewnerLE (annealedSigmaStarInvAtScale P m) + (annealedSigmaStarInvAtScale P n)) + (hBMono : MatLoewnerLE (annealedBAtScale P m) (annealedBAtScale P n)) + (hStar_m_nonneg : 0 ≤ hm.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hn.barB) : + hm.contrast ≤ hn.contrast := + Internal.AnnealedPrimitiveScalarizationData.contrast_le_of_component_le hm hn + (barB_le_of_annealedBAtScale_mono hm hn hBMono) + (barSigmaStarInv_le_of_annealedSigmaStarInvAtScale_mono hm hn hStarMono) + hStar_m_nonneg hB_n_nonneg + +/-- Primitive contrast monotonicity from primitive scalarization data and +annealed block monotonicity. -/ +theorem primitive_contrast_le_of_block_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) + (hStar_m_nonneg : 0 ≤ hm.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hn.barB) : + hm.contrast ≤ hn.contrast := + primitive_contrast_le_of_matrix_mono hm hn + (matLoewnerLE_annealedSigmaStarInvAtScale_of_block hBlock) + (matLoewnerLE_annealedBAtScale_of_block hBlock) + hStar_m_nonneg hB_n_nonneg + +/-- Scalar contrast monotonicity from primitive scalarization data and annealed +block monotonicity, stated for the public scalarization theory. -/ +theorem scalar_contrast_le_of_primitive_block_mono + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hm : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n)) + (hStar_m_nonneg : 0 ≤ hm.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hn.barB) : + hScal.contrast m ≤ hScal.contrast n := by + simpa [Internal.AnnealedPrimitiveScalarizationData.scalar_contrast_eq hScal hm, + Internal.AnnealedPrimitiveScalarizationData.scalar_contrast_eq hScal hn] using + primitive_contrast_le_of_block_mono hm hn hBlock + hStar_m_nonneg hB_n_nonneg + +private theorem sq_matrix_entry_le_matNormSq + {d : ℕ} (A : Mat d) (i j : Fin d) : + A i j ^ 2 ≤ matNormSq A := by + unfold matNormSq + exact le_trans + (Finset.single_le_sum (fun k _ => sq_nonneg (A i k)) (Finset.mem_univ j)) + (Finset.single_le_sum + (fun k _ => Finset.sum_nonneg fun l _ => sq_nonneg (A k l)) + (Finset.mem_univ i)) + +private theorem abs_matrix_entry_le_matNorm + {d : ℕ} (A : Mat d) (i j : Fin d) : + |A i j| ≤ matNorm A := by + calc + |A i j| = Real.sqrt (A i j ^ 2) := by + rw [Real.sqrt_sq_eq_abs] + _ ≤ Real.sqrt (matNormSq A) := + Real.sqrt_le_sqrt (sq_matrix_entry_le_matNormSq A i j) + _ = matNorm A := rfl + +private theorem blockMatVecMul_sub + {d : ℕ} (A : BlockMat d) (X Y : BlockVec d) : + blockMatVecMul A (X - Y) = blockMatVecMul A X - blockMatVecMul A Y := by + have hneg : blockMatVecMul A (-Y) = -blockMatVecMul A Y := by + simpa using blockMatVecMul_smul A (-1) Y + rw [sub_eq_add_neg, blockMatVecMul_add, hneg] + rfl + +private theorem blockVecDot_sub_left + {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot (X - Y) Z = blockVecDot X Z - blockVecDot Y Z := by + have hneg : blockVecDot (-Y) Z = -blockVecDot Y Z := by + simpa using blockVecDot_smul_left (-1) Y Z + rw [sub_eq_add_neg, blockVecDot_add_left, hneg] + rfl + +private theorem blockBasis_sub_pairing + {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α - blockBasis β) + (blockMatVecMul A (blockBasis α - blockBasis β)) = + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + rw [blockMatVecMul_sub, blockVecDot_sub_left] + rw [blockVecDot_sub_right] + rw [blockVecDot_sub_right] + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, blockBasis_pairing] + ring + +private theorem blockBasis_add_ne_zero + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α + blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem blockBasis_sub_ne_zero + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α - blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) {α β : BlockCoord d} (hαβ : α ≠ β) : + |blockMatEntry A α β| ≤ + (1 / 2 : ℝ) * (blockMatEntry A α α + blockMatEntry A β β) := by + have hplus_pos := + hPos (blockBasis α + blockBasis β) (blockBasis_add_ne_zero hαβ) + have hminus_pos := + hPos (blockBasis α - blockBasis β) (blockBasis_sub_ne_zero hαβ) + have hplus : + 0 < + blockMatEntry A α α + blockMatEntry A α β + + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sum_pairing] using hplus_pos + have hminus : + 0 < + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sub_pairing] using hminus_pos + have hsymm : blockMatEntry A β α = blockMatEntry A α β := (hSymm α β).symm + rw [abs_le] + constructor <;> nlinarith + +theorem abs_blockMatEntry_le_diagonalBlockNorms_of_symm_pos + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) (α β : BlockCoord d) : + |blockMatEntry A α β| ≤ matNorm A.upperLeft + matNorm A.lowerRight := by + cases α with + | inl i => + cases β with + | inl j => + exact le_trans (abs_matrix_entry_le_matNorm A.upperLeft i j) + (by nlinarith [matNorm_nonneg A.lowerRight]) + | inr j => + have hcross : + |blockMatEntry A (Sum.inl i) (Sum.inr j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry A (Sum.inl i) (Sum.inl i) + + blockMatEntry A (Sum.inr j) (Sum.inr j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef hSymm hPos + (by intro h; cases h) + have hUL : A.upperLeft i i ≤ matNorm A.upperLeft := + le_trans (le_abs_self (A.upperLeft i i)) + (abs_matrix_entry_le_matNorm A.upperLeft i i) + have hLR : A.lowerRight j j ≤ matNorm A.lowerRight := + le_trans (le_abs_self (A.lowerRight j j)) + (abs_matrix_entry_le_matNorm A.lowerRight j j) + have hcross' : + |A.upperRight i j| ≤ + (1 / 2 : ℝ) * (A.upperLeft i i + A.lowerRight j j) := by + simpa [blockMatEntry] using hcross + have hle : + |A.upperRight i j| ≤ matNorm A.upperLeft + matNorm A.lowerRight := by + nlinarith [hcross', hUL, hLR, matNorm_nonneg A.upperLeft, + matNorm_nonneg A.lowerRight] + simpa [blockMatEntry] using hle + | inr i => + cases β with + | inl j => + have hcross : + |blockMatEntry A (Sum.inr i) (Sum.inl j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry A (Sum.inr i) (Sum.inr i) + + blockMatEntry A (Sum.inl j) (Sum.inl j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef hSymm hPos + (by intro h; cases h) + have hLR : A.lowerRight i i ≤ matNorm A.lowerRight := + le_trans (le_abs_self (A.lowerRight i i)) + (abs_matrix_entry_le_matNorm A.lowerRight i i) + have hUL : A.upperLeft j j ≤ matNorm A.upperLeft := + le_trans (le_abs_self (A.upperLeft j j)) + (abs_matrix_entry_le_matNorm A.upperLeft j j) + have hcross' : + |A.lowerLeft i j| ≤ + (1 / 2 : ℝ) * (A.lowerRight i i + A.upperLeft j j) := by + simpa [blockMatEntry] using hcross + have hle : + |A.lowerLeft i j| ≤ matNorm A.upperLeft + matNorm A.lowerRight := by + nlinarith [hcross', hUL, hLR, matNorm_nonneg A.upperLeft, + matNorm_nonneg A.lowerRight] + simpa [blockMatEntry] using hle + | inr j => + exact le_trans (abs_matrix_entry_le_matNorm A.lowerRight i j) + (by nlinarith [matNorm_nonneg A.upperLeft]) + + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierFullBlock.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierFullBlock.lean new file mode 100644 index 0000000000..a5c368a959 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/AnnealedSubadditivity/LawCarrierFullBlock.lean @@ -0,0 +1,412 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.LawCarrierAnnealedMatrix + +/-! # Law Carrier Full Block -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +namespace RestrictionLawCarrier + +/-- Integrability of the two diagonal coarse-block norms implies integrability +of the full doubled coarse block matrix. + +This is the source theorem for the full-block hypotheses used by the public +annealed subadditivity and scalarization endpoints. The mixed blocks are +controlled by the positive definiteness of the Chapter 2 coarse block matrix, +so downstream code should not assemble entrywise integrability by hand. -/ +theorem integrable_coarseFullBlockMatrixAtCube_of_integrable_diagonalBlockNorms + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) + (hBInt : Integrable (fun a : RegCoeffField d => coarseBBlockNorm Q a.toFun) P) + (hStarInt : + Integrable (fun a : RegCoeffField d => coarseSigmaStarInvBlockNorm Q a.toFun) P) : + Integrable (coarseFullBlockMatrixAtCube Q) P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro α + refine MeasureTheory.Integrable.of_eval ?_ + intro β + have hEntryMeas : + AEMeasurable + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + have hStrong : + AEStronglyMeasurable + (fun a : RegCoeffField d => coarseFullBlockMatrixAtCube Q a α β) P := by + simpa [coarseFullBlockMatrixAtCube, coarseFullBlockMatrixObservable, + toFullBlockMat, blockMatEntry] using hEntryMeas.aestronglyMeasurable + refine (hBInt.add hStarInt).mono' hStrong ?_ + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hPos : Ch02.BlockPosDef (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_posDef + have hBound := + abs_blockMatEntry_le_diagonalBlockNorms_of_symm_pos + (A := coarseBlockMatrix (cubeSet Q) a.toFun) hSymm hPos α β + simpa [Real.norm_eq_abs, coarseFullBlockMatrixAtCube, coarseFullBlockMatrixObservable, + toFullBlockMat, blockMatEntry, coarseBBlockNorm, coarseSigmaStarInvBlockNorm] + using hBound + +/-- Full coarse-block integrability gives entrywise integrability of the +corresponding doubled coarse matrix. -/ +theorem integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} + (hInt : Integrable (coarseFullBlockMatrixAtCube Q) P) : + ∀ α β, + Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + intro α β + have hα : Integrable (fun a : RegCoeffField d => coarseFullBlockMatrixAtCube Q a α) P := + MeasureTheory.Integrable.eval hInt α + have hαβ : Integrable (fun a : RegCoeffField d => coarseFullBlockMatrixAtCube Q a α β) P := + MeasureTheory.Integrable.eval hα β + simpa [coarseFullBlockMatrixAtCube, coarseFullBlockMatrixObservable, toFullBlockMat, + blockMatEntry] using hαβ + +/-- Under a law carrier, the lower-right coarse block is a.e. positive +definite on every deterministic triadic cube. -/ +theorem coarseBlockMatrix_lowerRight_posDef_cubeSet_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + ∀ᵐ a ∂P, (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight.PosDef := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hEq] + simpa using Ch02.sigmaStarInvCoarse_posDef (Ch02.cubeDomain Q) (F.coeffOn Q) + +/-- Under a law carrier, the upper-left coarse block is a.e. positive +definite on every deterministic triadic cube. -/ +theorem coarseBlockMatrix_upperLeft_posDef_cubeSet_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + ∀ᵐ a ∂P, (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft.PosDef := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hEq] + simpa using Ch02.bCoarse_posDef (Ch02.cubeDomain Q) (F.coeffOn Q) + +/-- Full coarse-block integrability and primitive scalarization make the +inverse-star scalar coefficient strictly positive. -/ +theorem Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) {n : ℤ} + (hPrim : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 0 < hPrim.barSigmaStarInv := by + let : IsProbabilityMeasure P := hP.isProbability + let F : RegCoeffField d → Mat d := + fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight + have hFint : Integrable F P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro i + refine MeasureTheory.Integrable.of_eval ?_ + intro j + exact + integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + hBlock (Sum.inr i) (Sum.inr j) + have hScalar : (∫ a, F a ∂P) = hPrim.barSigmaStarInv • (1 : Mat d) := by + calc + (∫ a, F a ∂P) = annealedSigmaStarInvAtScale P n := by + ext i j + rw [integral_matrix_apply (μ := P) (f := F) hFint i j] + rfl + _ = hPrim.barSigmaStarInv • (1 : Mat d) := hPrim.sigmaStarInv_eq + exact + scalar_coefficient_pos_of_smul_one_eq_integral_posDef + (μ := P) (F := F) hFint + (hP.coarseBlockMatrix_lowerRight_posDef_cubeSet_ae (originCube d n)) + hScalar + +/-- Full coarse-block integrability and primitive scalarization make the +upper-left scalar coefficient strictly positive. -/ +theorem Internal.barB_pos_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) {n : ℤ} + (hPrim : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 0 < hPrim.barB := by + let : IsProbabilityMeasure P := hP.isProbability + let F : RegCoeffField d → Mat d := + fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft + have hFint : Integrable F P := by + refine MeasureTheory.Integrable.of_eval ?_ + intro i + refine MeasureTheory.Integrable.of_eval ?_ + intro j + exact + integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + hBlock (Sum.inl i) (Sum.inl j) + have hScalar : (∫ a, F a ∂P) = hPrim.barB • (1 : Mat d) := by + calc + (∫ a, F a ∂P) = annealedBAtScale P n := by + ext i j + rw [integral_matrix_apply (μ := P) (f := F) hFint i j] + rfl + _ = hPrim.barB • (1 : Mat d) := hPrim.b_eq + exact + scalar_coefficient_pos_of_smul_one_eq_integral_posDef + (μ := P) (F := F) hFint + (hP.coarseBlockMatrix_upperLeft_posDef_cubeSet_ae (originCube d n)) + hScalar + +/-- Full coarse-block integrability makes the public scalar +`\bar\sigma_n` strictly positive. -/ +theorem barSigmaAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) {n : ℤ} + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 0 < hP.barSigmaAtScale hStruct n := by + have hPrim := + Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n + have hB : 0 < hPrim.barB := + Internal.barB_pos_of_integrable_coarseFullBlockMatrixAtCube hP hPrim hBlock + simpa [RestrictionLawCarrier.barSigmaAtScale_eq_barBAtScale, RestrictionLawCarrier.barBAtScale, + Internal.AnnealedPrimitiveScalarizationData.barB, hPrim] + using hB + +/-- Law-facing primitive lower bound `1 <= Theta_n`, stated at the primitive +scalarization level. -/ +theorem Internal.one_le_primitive_contrast_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) {n : ℤ} + (hPrim : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 1 ≤ hPrim.contrast := by + let : IsProbabilityMeasure P := hP.isProbability + let e : Vec d := Pi.single (0 : Fin d) 1 + let s : ℝ := hPrim.barSigmaStarInv + let b : ℝ := hPrim.barB + let p : Vec d := s • e + let q : Vec d := e + have hExpected_nonneg : + 0 ≤ ∫ a, restrictionResponseJObservableCubeSet (originCube d n) p q a ∂P := by + exact MeasureTheory.integral_nonneg_of_ae (by + filter_upwards with a + exact responseJ_nonneg (cubeSet (originCube d n)) p q a) + have hLowerLeftZero : + (annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft = 0 := by + have h := hPrim.sigmaStarInvKappaMean_eq_zero + simpa [annealedSigmaStarInvKappaMeanAtScale, + annealedSigmaStarInvKappaMean] using congrArg Neg.neg h + have hStar : + (annealedBlockMatrix P (cubeSet (originCube d n))).lowerRight = + s • (1 : Mat d) := by + simpa [s, annealedSigmaStarInvAtScale, annealedSigmaStarInv] using + hPrim.sigmaStarInv_eq + have hB : + (annealedBlockMatrix P (cubeSet (originCube d n))).upperLeft = + b • (1 : Mat d) := by + simpa [b, annealedBAtScale, annealedB] using hPrim.b_eq + have hFormula := + hP.integral_restrictionResponseJObservableCubeSet_eq_quadratic_annealedBlockMatrix + (originCube d n) p q hBlock + have hOneP : matVecMul (1 : Mat d) p = p := by + change (1 : Matrix (Fin d) (Fin d) ℝ).mulVec p = p + exact Matrix.one_mulVec p + have hZeroP : matVecMul (0 : Mat d) p = 0 := by + funext i + simp [matVecMul] + have hEval : + ∫ a, restrictionResponseJObservableCubeSet (originCube d n) p q a ∂P = + (b * s - 1) * (s / 2) := by + rw [hFormula, hLowerLeftZero, hStar, hB] + simp [smul_matVecMul, hOneP, hZeroP, vecDot_smul_left, + vecDot_smul_right, p, q, e, s, b, matVecMul_single, vecDot_single_left] + ring_nf + rw [hEval] at hExpected_nonneg + have hStar_pos : 0 < s := by + dsimp [s] + exact Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim hBlock + have hs_div_pos : 0 < s / 2 := by positivity + have htheta_minus_nonneg : 0 ≤ b * s - 1 := + nonneg_of_mul_nonneg_left hExpected_nonneg hs_div_pos + have htheta_ge : 1 ≤ b * s := sub_nonneg.mp htheta_minus_nonneg + simpa [Internal.AnnealedPrimitiveScalarizationData.contrast, b, s] using htheta_ge + +/-- Full coarse-block integrability and primitive scalarization make the +upper-left scalar coefficient nonnegative. -/ +theorem Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) {n : ℤ} + (hPrim : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 0 ≤ hPrim.barB := by + have hContrast : + 1 ≤ hPrim.contrast := + Internal.one_le_primitive_contrast_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim hBlock + have hContrast_nonneg : 0 ≤ hPrim.contrast := + le_trans zero_le_one hContrast + have hStar_pos : + 0 < hPrim.barSigmaStarInv := + Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim hBlock + exact + nonneg_of_mul_nonneg_right + (by + simpa [Internal.AnnealedPrimitiveScalarizationData.contrast, mul_comm] using + hContrast_nonneg) + hStar_pos + +/-- Law-facing scalar lower bound `1 <= Theta_n`, stated for the public +scalarization theory. -/ +theorem Internal.one_le_scalar_contrast_of_primitive_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) {n : ℤ} + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hPrim : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hBlock : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + 1 ≤ hScal.contrast n := by + simpa [Internal.AnnealedPrimitiveScalarizationData.scalar_contrast_eq hScal hPrim] using + Internal.one_le_primitive_contrast_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim hBlock + +/-- Law-facing annealed block monotonicity from full coarse-block +integrability. This is the Ch5-facing version of +`RestrictionLawCarrier.blockMatLoewnerLE_annealedBlockMatrixAtScale`: downstream callers +should not assemble entrywise integrability by hand. -/ +theorem blockMatLoewnerLE_annealedBlockMatrixAtScale_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (hParentInt : Integrable (coarseFullBlockMatrixAtCube (originCube d m)) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (coarseFullBlockMatrixAtCube R) P) : + BlockMatLoewnerLE (annealedBlockMatrixAtScale P m) + (annealedBlockMatrixAtScale P n) := + hP.blockMatLoewnerLE_annealedBlockMatrixAtScale hstat hn hnm + (integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + hParentInt) + (fun R hR => + integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + (hDescInt R hR)) + +/-- Law-facing scalar chain from full coarse-block integrability. -/ +theorem Internal.scalar_chain_of_primitive_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hPrim_m : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hPrim_n : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hParentInt : Integrable (coarseFullBlockMatrixAtCube (originCube d m)) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (coarseFullBlockMatrixAtCube R) P) + (hStar_m_pos : 0 < hPrim_m.barSigmaStarInv) + (hContrast_m : 1 ≤ hPrim_m.contrast) : + hScal.barSigmaStar n ≤ hScal.barSigmaStar m ∧ + hScal.barSigmaStar m ≤ hScal.barSigma m ∧ + hScal.barSigma m ≤ hScal.barSigma n := + scalar_chain_of_primitive_block_mono hScal hPrim_m hPrim_n + (hP.blockMatLoewnerLE_annealedBlockMatrixAtScale_of_integrable_coarseFullBlockMatrixAtCube + hstat hn_nonneg hnm hParentInt hDescInt) + hStar_m_pos hContrast_m + +/-- Law-facing primitive contrast monotonicity from full coarse-block +integrability. -/ +theorem Internal.primitive_contrast_le_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hPrim_m : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hPrim_n : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hParentInt : Integrable (coarseFullBlockMatrixAtCube (originCube d m)) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (coarseFullBlockMatrixAtCube R) P) + (hStar_m_nonneg : 0 ≤ hPrim_m.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hPrim_n.barB) : + hPrim_m.contrast ≤ hPrim_n.contrast := + primitive_contrast_le_of_block_mono hPrim_m hPrim_n + (hP.blockMatLoewnerLE_annealedBlockMatrixAtScale_of_integrable_coarseFullBlockMatrixAtCube + hstat hn_nonneg hnm hParentInt hDescInt) + hStar_m_nonneg hB_n_nonneg + +/-- Law-facing scalar contrast monotonicity from full coarse-block +integrability. -/ +theorem Internal.scalar_contrast_le_of_primitive_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hScal : Internal.AnnealedScalarizationTheory (d := d) P) + (hPrim_m : Internal.AnnealedPrimitiveScalarizationData (d := d) P m) + (hPrim_n : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hParentInt : Integrable (coarseFullBlockMatrixAtCube (originCube d m)) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (coarseFullBlockMatrixAtCube R) P) + (hStar_m_nonneg : 0 ≤ hPrim_m.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hPrim_n.barB) : + hScal.contrast m ≤ hScal.contrast n := + scalar_contrast_le_of_primitive_block_mono hScal hPrim_m hPrim_n + (hP.blockMatLoewnerLE_annealedBlockMatrixAtScale_of_integrable_coarseFullBlockMatrixAtCube + hstat hn_nonneg hnm hParentInt hDescInt) + hStar_m_nonneg hB_n_nonneg + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockExpectations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockExpectations.lean new file mode 100644 index 0000000000..c69d6ff220 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockExpectations.lean @@ -0,0 +1,423 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations + +/-! # Block Expectations -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Block-response expectations + +This file is the public Chapter 4 surface for expectations of the block +response observable. The Ch4-facing observable is the manuscript half-sum of +one scalar response and one adjointed scalar response, so downstream sections +never supply a separate `BlockJ = half-sum` a.e. bridge. +-/ + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +/-- The standard half-sum expression for the block response: one scalar +response for `a`, and one scalar response for the adjointed field. -/ +noncomputable def blockJHalfResponseAdjointSumSet {d : ℕ} + (U : Set (Vec d)) (p pStar q qStar : Vec d) : CoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * ResponseJ U (pStar + p) (qStar + q) (adjointCoeffField a) + +/-- Cube-set specialization of the standard half-sum expression. -/ +noncomputable def blockJHalfResponseAdjointSumCubeSet {d : ℕ} + (Q : TriadicCube d) (p pStar q qStar : Vec d) : CoeffField d → ℝ := + blockJHalfResponseAdjointSumSet (cubeSet Q) p pStar q qStar + +@[simp] +theorem blockJHalfResponseAdjointSumCubeSet_apply {d : ℕ} + (Q : TriadicCube d) (p pStar q qStar : Vec d) (a : CoeffField d) : + blockJHalfResponseAdjointSumCubeSet Q p pStar q qStar a = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (pStar + p) (qStar + q) (adjointCoeffField a) := + rfl + +/-- Ch4-facing block response observable on a deterministic triadic cube. +It is definitionally the manuscript half-sum expression evaluated on the +underlying field of a carrier sample. -/ +noncomputable def blockJObservableCubeSet {d : ℕ} + (Q : TriadicCube d) (p pStar q qStar : Vec d) : RegCoeffField d → ℝ := + fun a => blockJHalfResponseAdjointSumCubeSet Q p pStar q qStar a.toFun + +@[simp] +theorem blockJObservableCubeSet_apply {d : ℕ} + (Q : TriadicCube d) (p pStar q qStar : Vec d) (a : RegCoeffField d) : + blockJObservableCubeSet Q p pStar q qStar a = + (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) := + rfl + +/-- The Ch4 block observable is definitionally the standard half-sum on the +underlying field. -/ +theorem blockJObservableCubeSet_eq_half_responseJ_adjoint_sum {d : ℕ} + (Q : TriadicCube d) (p pStar q qStar : Vec d) : + blockJObservableCubeSet Q p pStar q qStar = + fun a : RegCoeffField d => + blockJHalfResponseAdjointSumCubeSet Q p pStar q qStar a.toFun := + rfl + +/-- Carrier adjoint-composition integrability: for an adjoint-invariant law, +integrability transfers under the carrier adjoint endomorphism. -/ +private theorem integrable_comp_adjointReg_of_adjointInvariantLaw + {d : ℕ} {P : RestrictionCoeffLaw d} {F : RegCoeffField d → ℝ} + (hAdj : RestrictionAdjointInvariantLaw P) (hF : Integrable F P) : + Integrable (fun a : RegCoeffField d => F (adjointReg a)) P := by + have hFmap : Integrable F (Measure.map (adjointReg (d := d)) P) := by rwa [hAdj] + simpa [Function.comp_def] using hFmap.comp_measurable (measurable_adjointReg (d := d)) + +/-- Annealed block response on a deterministic triadic cube. -/ +noncomputable def expectedBlockJCubeSet {d : ℕ} + (P : RestrictionCoeffLaw d) (Q : TriadicCube d) (p pStar q qStar : Vec d) : ℝ := + ∫ a, blockJObservableCubeSet Q p pStar q qStar a ∂P + +/-- Annealed finite descendant average of block responses. -/ +noncomputable def expectedDescendantsAverageBlockJCubeSet {d : ℕ} + (P : RestrictionCoeffLaw d) (Q : TriadicCube d) (j : ℕ) + (p pStar q qStar : Vec d) : ℝ := + descendantsAverage Q j (fun R => expectedBlockJCubeSet P R p pStar q qStar) + +/-- Finite descendant averages of block responses are integrable if the child +block responses are integrable. -/ +theorem integrable_descendantsAverage_blockJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} + {p pStar q qStar : Vec d} + (hB : ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (blockJObservableCubeSet R p pStar q qStar) P) : + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => blockJObservableCubeSet R p pStar q qStar a)) P := + integrable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => blockJObservableCubeSet R p pStar q qStar a) hB + +/-- Finite descendant averages of block responses are in `L^r` if the child +block responses are in `L^r`. -/ +theorem memLp_descendantsAverage_blockJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} {r : ℝ≥0∞} + {p pStar q qStar : Vec d} + (hB : ∀ R, R ∈ descendantsAtDepth Q j → + MemLp (blockJObservableCubeSet R p pStar q qStar) r P) : + MemLp + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => blockJObservableCubeSet R p pStar q qStar a)) r P := + memLp_descendantsAverage + (P := P) (Q := Q) (j := j) (r := r) + (F := fun R a => blockJObservableCubeSet R p pStar q qStar a) hB + +/-- Finite descendant block-response averages commute with expectation, +assuming childwise integrability. -/ +theorem integral_descendantsAverage_blockJObservableCubeSet_eq_expectedDescendantsAverageBlockJCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} + (Q : TriadicCube d) (j : ℕ) (p pStar q qStar : Vec d) + (hB : ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (blockJObservableCubeSet R p pStar q qStar) P) : + ∫ a, + descendantsAverage Q j (fun R => blockJObservableCubeSet R p pStar q qStar a) ∂P = + expectedDescendantsAverageBlockJCubeSet P Q j p pStar q qStar := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + calc + ∫ a, + descendantsAverage Q j (fun R => blockJObservableCubeSet R p pStar q qStar a) ∂P + = + ∫ a, + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, blockJObservableCubeSet R p pStar q qStar a) ∂P := by + rfl + _ = + (D.card : ℝ)⁻¹ * + ∫ a, ∑ R ∈ D, blockJObservableCubeSet R p pStar q qStar a ∂P := by + rw [integral_const_mul] + _ = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, ∫ a, blockJObservableCubeSet R p pStar q qStar a ∂P) := by + rw [MeasureTheory.integral_finsetSum D + (fun R hR => hB R (by simpa [D] using hR))] + _ = expectedDescendantsAverageBlockJCubeSet P Q j p pStar q qStar := by + simp [expectedDescendantsAverageBlockJCubeSet, expectedBlockJCubeSet, + descendantsAverage, D] + +/-- The Ch4 block response observable is integrable when the two scalar +responses in its half-sum representation are integrable. The second scalar +response is composed with the carrier adjoint using adjoint-invariance. -/ +theorem integrable_blockJObservableCubeSet_of_integrable + {d : ℕ} {P : RestrictionCoeffLaw d} (hAdj : RestrictionAdjointInvariantLaw P) + (Q : TriadicCube d) (p pStar q qStar : Vec d) + (hJ : + Integrable (restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q)) P) + (hJAdjBase : + Integrable (restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q)) P) : + Integrable (blockJObservableCubeSet Q p pStar q qStar) P := by + have hJAdj : + Integrable + (fun a : RegCoeffField d => + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a)) P := + integrable_comp_adjointReg_of_adjointInvariantLaw hAdj hJAdjBase + refine ((hJ.const_mul (1 / 2 : ℝ)).add (hJAdj.const_mul (1 / 2 : ℝ))).congr ?_ + filter_upwards with a + simp only [Pi.add_apply, blockJObservableCubeSet_apply] + +/-- The Ch4 block-response expectation is the half-sum of ordinary response +expectations under adjoint-invariance. -/ +theorem integral_blockJObservableCubeSet_eq_half_expectedResponseJCubeSet_add + {d : ℕ} {P : RestrictionCoeffLaw d} (hAdj : RestrictionAdjointInvariantLaw P) + (Q : TriadicCube d) (p pStar q qStar : Vec d) + (hJ : + Integrable (restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q)) P) + (hJAdjBase : + Integrable (restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q)) P) : + ∫ a, blockJObservableCubeSet Q p pStar q qStar a ∂P = + (1 / 2 : ℝ) * expectedResponseJCubeSet P Q (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * expectedResponseJCubeSet P Q (pStar + p) (qStar + q) := by + have hJAdj : + Integrable + (fun a : RegCoeffField d => + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a)) P := + integrable_comp_adjointReg_of_adjointInvariantLaw hAdj hJAdjBase + calc + ∫ a, blockJObservableCubeSet Q p pStar q qStar a ∂P + = + ∫ a, + (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) ∂P := by + simp only [blockJObservableCubeSet_apply] + _ = + ∫ a, (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a ∂P + + ∫ a, + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) ∂P := by + rw [integral_add (hJ.const_mul (1 / 2 : ℝ)) (hJAdj.const_mul (1 / 2 : ℝ))] + _ = + (1 / 2 : ℝ) * ∫ a, restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a ∂P + + (1 / 2 : ℝ) * + ∫ a, restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) ∂P := by + rw [integral_const_mul, integral_const_mul] + _ = + (1 / 2 : ℝ) * expectedResponseJCubeSet P Q (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * expectedResponseJCubeSet P Q (pStar + p) (qStar + q) := by + rw [hAdj.integral_comp_adjointReg + (restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q)) + hJAdjBase.aestronglyMeasurable] + rfl + +/-- The Ch4 block response half-sum is translation-covariant as a set-indexed +coefficient-field observable. -/ +theorem blockJHalfResponseAdjointSumSet_translation_covariant {d : ℕ} + (p pStar q qStar : Vec d) : + IsTranslationCovariant + (fun U : Set (Vec d) => + blockJHalfResponseAdjointSumSet U p pStar q qStar) := by + intro U z a + have hCoeff : + translateCoeffField (intVecToRealVec z) (adjointCoeffField a) = + adjointCoeffField (translateCoeffField (intVecToRealVec z) a) := by + rfl + simp [blockJHalfResponseAdjointSumSet, translateByInt, hCoeff, + ResponseJ_translateSet_eq_translateCoeffField] + +namespace RestrictionLawCarrier + +/-- The Ch4 block response observable is a.e.-measurable under a law carrier +and adjoint-invariant law. -/ +theorem aemeasurable_blockJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hAdj : RestrictionAdjointInvariantLaw P) + (Q : TriadicCube d) (p pStar q qStar : Vec d) : + AEMeasurable (blockJObservableCubeSet Q p pStar q qStar) P := by + have hJ : + AEMeasurable (restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q)) P := + hP.aemeasurable_restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) + have hJAdj : + AEMeasurable + (fun a : RegCoeffField d => + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a)) P := + aemeasurable_comp_adjointCoeffField_of_adjointInvariantLaw hAdj + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q)) + refine ((hJ.const_mul (1 / 2 : ℝ)).add (hJAdj.const_mul (1 / 2 : ℝ))).congr ?_ + filter_upwards with a + simp only [blockJObservableCubeSet_apply] + rfl + +/-- The Ch4 block response observable is a.e.-strongly-measurable under a law +carrier and adjoint-invariant law. -/ +theorem aestronglyMeasurable_blockJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hAdj : RestrictionAdjointInvariantLaw P) + (Q : TriadicCube d) (p pStar q qStar : Vec d) : + AEStronglyMeasurable (blockJObservableCubeSet Q p pStar q qStar) P := + (hP.aemeasurable_blockJObservableCubeSet hAdj Q p pStar q qStar).aestronglyMeasurable + +/-- Under stationarity, the annealed block response on a nonnegative-scale cube +is the annealed block response on the origin cube at the same scale. -/ +theorem expectedBlockJCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hAdj : RestrictionAdjointInvariantLaw P) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) (p pStar q qStar : Vec d) : + expectedBlockJCubeSet P R p pStar q qStar = + expectedBlockJCubeSet P (originCube d R.scale) p pStar q qStar := by + have hshift := + cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + calc + expectedBlockJCubeSet P R p pStar q qStar + = + ∫ a, blockJHalfResponseAdjointSumSet (cubeSet R) p pStar q qStar a.toFun ∂P := rfl + _ = + ∫ a, + blockJHalfResponseAdjointSumSet + (translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale))) p pStar q qStar a.toFun ∂P := by + rw [hshift] + _ = + ∫ a, + blockJHalfResponseAdjointSumSet (cubeSet (originCube d R.scale)) + p pStar q qStar a.toFun ∂P := + integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw (P := P) hstat + (X := fun U a => blockJHalfResponseAdjointSumSet U p pStar q qStar a) + (U := cubeSet (originCube d R.scale)) + (by + simpa [blockJObservableCubeSet, blockJHalfResponseAdjointSumCubeSet] using! + hP.aestronglyMeasurable_blockJObservableCubeSet hAdj + (originCube d R.scale) p pStar q qStar) + (blockJHalfResponseAdjointSumSet_translation_covariant p pStar q qStar) + (scaleTranslationShift R.scale R) + _ = expectedBlockJCubeSet P (originCube d R.scale) p pStar q qStar := rfl + +/-- Under stationarity, a child cube of an origin cube has the same annealed +block response as the origin cube at the child scale. -/ +theorem expectedBlockJCubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hAdj : RestrictionAdjointInvariantLaw P) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) + (p pStar q qStar : Vec d) : + expectedBlockJCubeSet P R p pStar q qStar = + expectedBlockJCubeSet P (originCube d n) p pStar q qStar := by + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + calc + expectedBlockJCubeSet P R p pStar q qStar + = + ∫ a, blockJHalfResponseAdjointSumSet (cubeSet R) p pStar q qStar a.toFun ∂P := rfl + _ = + ∫ a, + blockJHalfResponseAdjointSumSet + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) p pStar q qStar a.toFun ∂P := by + rw [hshift] + _ = + ∫ a, + blockJHalfResponseAdjointSumSet (cubeSet (originCube d n)) + p pStar q qStar a.toFun ∂P := + integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw (P := P) hstat + (X := fun U a => blockJHalfResponseAdjointSumSet U p pStar q qStar a) + (U := cubeSet (originCube d n)) + (by + simpa [blockJObservableCubeSet, blockJHalfResponseAdjointSumCubeSet] using! + hP.aestronglyMeasurable_blockJObservableCubeSet hAdj + (originCube d n) p pStar q qStar) + (blockJHalfResponseAdjointSumSet_translation_covariant p pStar q qStar) + (scaleTranslationShift n R) + _ = expectedBlockJCubeSet P (originCube d n) p pStar q qStar := by + rfl + +/-- Under stationarity, the finite average of child annealed block responses +equals the annealed block response on the origin cube at the child scale. -/ +theorem expectedDescendantsAverageBlockJCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hAdj : RestrictionAdjointInvariantLaw P) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (p pStar q qStar : Vec d) : + expectedDescendantsAverageBlockJCubeSet P (originCube d m) + (Int.toNat (m - n)) p pStar q qStar = + expectedBlockJCubeSet P (originCube d n) p pStar q qStar := by + classical + let D : Finset (TriadicCube d) := + descendantsAtDepth (originCube d m) (Int.toNat (m - n)) + have hDscale : D = descendantsAtScale (originCube d m) n := by + simpa [D, originCube] using + (descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm).symm + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty (originCube d m) (Int.toNat (m - n)) + have hcard_ne : ((D.card : ℝ) ≠ 0) := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + calc + expectedDescendantsAverageBlockJCubeSet P (originCube d m) + (Int.toNat (m - n)) p pStar q qStar + = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, expectedBlockJCubeSet P R p pStar q qStar) := by + simp [expectedDescendantsAverageBlockJCubeSet, descendantsAverage, D] + _ = + (D.card : ℝ)⁻¹ * + (∑ _R ∈ D, expectedBlockJCubeSet P (originCube d n) p pStar q qStar) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro R hR + exact + hP.expectedBlockJCubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + hstat hAdj hn hnm (by simpa [hDscale] using hR) p pStar q qStar + _ = expectedBlockJCubeSet P (originCube d n) p pStar q qStar := by + simp [Finset.sum_const, nsmul_eq_mul, hcard_ne] + +/-- Under stationarity and childwise integrability, the expectation of the +descendant-average block response observable is the annealed block response on +the origin cube at the child scale. -/ +theorem integral_descendantsAverage_blockJObservableCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hAdj : RestrictionAdjointInvariantLaw P) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (p pStar q qStar : Vec d) + (hB : ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (blockJObservableCubeSet R p pStar q qStar) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => blockJObservableCubeSet R p pStar q qStar a) ∂P = + expectedBlockJCubeSet P (originCube d n) p pStar q qStar := by + have hB_depth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - n)) → + Integrable (blockJObservableCubeSet R p pStar q qStar) P := by + intro R hR + exact hB R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR) + calc + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => blockJObservableCubeSet R p pStar q qStar a) ∂P + = + expectedDescendantsAverageBlockJCubeSet P (originCube d m) + (Int.toNat (m - n)) p pStar q qStar := + integral_descendantsAverage_blockJObservableCubeSet_eq_expectedDescendantsAverageBlockJCubeSet + (P := P) (Q := originCube d m) (j := Int.toNat (m - n)) + p pStar q qStar hB_depth + _ = expectedBlockJCubeSet P (originCube d n) p pStar q qStar := + hP.expectedDescendantsAverageBlockJCubeSet_eq_originCube_of_stationary + hstat hAdj hn hnm p pStar q qStar + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockResponseConcentration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockResponseConcentration.lean new file mode 100644 index 0000000000..5ee41b7276 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/BlockResponseConcentration.lean @@ -0,0 +1,948 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuationsAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import Mathlib.LinearAlgebra.Matrix.Bilinear + +/-! # Block Response Concentration -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +theorem IsAEEllipticFieldOn.adjointCoeffField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} + (h : IsAEEllipticFieldOn lam Lam U a) : + IsAEEllipticFieldOn lam Lam U (adjointCoeffField a) := by + refine ⟨h.measurableSet, ?_, ?_⟩ + · intro i j + refine (h.aestronglyMeasurable_restrictCoeffField_apply j i).congr ?_ + exact Filter.Eventually.of_forall (by + intro x + by_cases hx : x ∈ U + · simp [restrictCoeffField, Homogenization.adjointCoeffField, + Homogenization.matTranspose, hx] + · simp [restrictCoeffField, hx]) + · exact h.ae_isEllipticMatrix.mono fun x hx => by + simpa [adjointCoeffField] using! isEllipticMatrix_transpose hx + +/-- The underlying field of the carrier adjoint is the raw field adjoint. -/ +theorem adjointReg_toFun {d : ℕ} (a : RegCoeffField d) : + (adjointReg a).toFun = adjointCoeffField a.toFun := rfl + +/-- Carrier a.e.-ellipticity transports under the carrier adjoint endomorphism: +the transpose preserves the local uniform elliptic bounds. -/ +theorem AELocallyUniformlyEllipticField.adjointReg {d : ℕ} + {a : RegCoeffField d} (ha : AELocallyUniformlyEllipticField a) : + AELocallyUniformlyEllipticField (Homogenization.adjointReg a) := by + intro Q + rcases ha Q with ⟨lam, Lam, hlam, hle, hEll⟩ + refine ⟨lam, Lam, hlam, hle, ?_⟩ + have hEll' : IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun := hEll + show IsAEEllipticFieldOn lam Lam (openCubeSet Q) (Homogenization.adjointReg a).toFun + rw [adjointReg_toFun] + exact IsAEEllipticFieldOn.adjointCoeffField hEll' + +private theorem isRestrictionLocalRandomVariable_fullBlockMat_of_entries + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + {X : RegCoeffField d → FullBlockMat d} + (hX : + ∀ α β : BlockCoord d, + IsRestrictionLocalRandomVariable U hU (fun a => X a α β)) : + IsRestrictionLocalRandomVariable U hU X := by + change @Measurable (RegCoeffField d) (FullBlockMat d) (RestrictionSigmaR U hU) _ X + refine (@measurable_pi_iff (RegCoeffField d) (BlockCoord d) + (fun _ => BlockCoord d → ℝ) (RestrictionSigmaR U hU) (fun _ => inferInstance) X).2 + fun α => ?_ + refine (@measurable_pi_iff (RegCoeffField d) (BlockCoord d) + (fun _ => ℝ) (RestrictionSigmaR U hU) (fun _ => inferInstance) (fun a => X a α)).2 + fun β => ?_ + exact hX α β + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j) + =ᵐ[P] Y := by + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((Pi.single i 1, 0) + (0, Pi.single j 1)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single i 1, 0) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single j 1) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j = + Mu (cubeSet Q) ((Pi.single i 1, 0) + (0, Pi.single j 1)) a.toFun - + Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun - + Mu (cubeSet Q) (0, Pi.single j 1) a.toFun := by + simp [coarseBlockMatrix_upperRight_apply] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j) + =ᵐ[P] Y := by + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((0, Pi.single i 1) + (Pi.single j 1, 0)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single i 1) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single j 1, 0) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j = + Mu (cubeSet Q) ((0, Pi.single i 1) + (Pi.single j 1, 0)) a.toFun - + Mu (cubeSet Q) (0, Pi.single i 1) a.toFun - + Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun := by + simp [coarseBlockMatrix_lowerLeft_apply] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseFullBlockMatrix_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + ∃ Y : RegCoeffField d → FullBlockMat d, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + =ᵐ[P] Y := by + classical + let entry_exists : ∀ α β : BlockCoord d, + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β) =ᵐ[P] Y := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [toFullBlockMat] using + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat] using + exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperRight_apply_cubeSet + hP Q i j + | inr i => + cases β with + | inl j => + simpa [toFullBlockMat] using + exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerLeft_apply_cubeSet + hP Q i j + | inr j => + simpa [toFullBlockMat] using + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + let Yentry : BlockCoord d → BlockCoord d → RegCoeffField d → ℝ := + fun α β => Classical.choose (entry_exists α β) + let Y : RegCoeffField d → FullBlockMat d := fun a α β => Yentry α β a + refine ⟨Y, ?_, ?_⟩ + · refine isRestrictionLocalRandomVariable_fullBlockMat_of_entries (measurableSet_cubeSet Q) ?_ + intro α β + exact (Classical.choose_spec (entry_exists α β)).1 + · have hentry : + ∀ α β : BlockCoord d, + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β) =ᵐ[P] + fun a => Y a α β := by + intro α β + exact (Classical.choose_spec (entry_exists α β)).2 + have hall : + ∀ᵐ a ∂P, + ∀ α β : BlockCoord d, + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β = Y a α β := by + rw [Filter.eventually_all] + intro α + rw [Filter.eventually_all] + intro β + exact hentry α β + filter_upwards [hall] with a ha + ext α β + exact ha α β + +noncomputable def blockJObservableCubeSetBlockVec {d : ℕ} + (Q : TriadicCube d) (P Qv : BlockVec d) : RegCoeffField d → ℝ := + blockJObservableCubeSet Q P.1 Qv.2 P.2 Qv.1 + +theorem blockJObservableCubeSetBlockVec_nonneg {d : ℕ} + (Q : TriadicCube d) (P Qv : BlockVec d) (a : RegCoeffField d) : + 0 ≤ blockJObservableCubeSetBlockVec Q P Qv a := by + rcases P with ⟨p, q⟩ + rcases Qv with ⟨qStar, pStar⟩ + dsimp [blockJObservableCubeSetBlockVec] + have h1 := restrictionResponseJObservableCubeSet_nonneg Q (p - pStar) (qStar - q) a + have h2 := restrictionResponseJObservableCubeSet_nonneg Q (pStar + p) (qStar + q) (adjointReg a) + change 0 ≤ + (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) + nlinarith + +theorem blockJObservableCubeSetBlockVec_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) (P Qv : BlockVec d) : + blockJObservableCubeSetBlockVec Q P Qv a ≤ + descendantsAverage Q (Int.toNat (Q.scale - k)) + (fun R => blockJObservableCubeSetBlockVec R P Qv a) := by + rcases P with ⟨p, q⟩ + rcases Qv with ⟨qStar, pStar⟩ + let j : ℕ := Int.toNat (Q.scale - k) + let R₁ : TriadicCube d → ℝ := + fun R => restrictionResponseJObservableCubeSet R (p - pStar) (qStar - q) a + let R₂ : TriadicCube d → ℝ := + fun R => restrictionResponseJObservableCubeSet R (pStar + p) (qStar + q) (adjointReg a) + have h1 := + restrictionResponseJObservableCubeSet_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + (a := a) ha Q hk (p - pStar) (qStar - q) + have h2 := + restrictionResponseJObservableCubeSet_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + (a := adjointReg a) ha.adjointReg Q hk + (pStar + p) (qStar + q) + have hhalf_nonneg : 0 ≤ (1 / 2 : ℝ) := by norm_num + have hsum : + (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) ≤ + (1 / 2 : ℝ) * descendantsAverage Q j R₁ + + (1 / 2 : ℝ) * descendantsAverage Q j R₂ := by + exact add_le_add + (mul_le_mul_of_nonneg_left (by simpa [j, R₁] using h1) hhalf_nonneg) + (mul_le_mul_of_nonneg_left (by simpa [j, R₂] using h2) hhalf_nonneg) + have havg : + descendantsAverage Q j + (fun R => blockJObservableCubeSetBlockVec R (p, q) (qStar, pStar) a) = + (1 / 2 : ℝ) * descendantsAverage Q j R₁ + + (1 / 2 : ℝ) * descendantsAverage Q j R₂ := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + change + (D.card : ℝ)⁻¹ * + ∑ R ∈ D, ((1 / 2 : ℝ) * R₁ R + (1 / 2 : ℝ) * R₂ R) = + (1 / 2 : ℝ) * ((D.card : ℝ)⁻¹ * ∑ R ∈ D, R₁ R) + + (1 / 2 : ℝ) * ((D.card : ℝ)⁻¹ * ∑ R ∈ D, R₂ R) + calc + (D.card : ℝ)⁻¹ * + ∑ R ∈ D, ((1 / 2 : ℝ) * R₁ R + (1 / 2 : ℝ) * R₂ R) + = + (D.card : ℝ)⁻¹ * + ((∑ R ∈ D, (1 / 2 : ℝ) * R₁ R) + + (∑ R ∈ D, (1 / 2 : ℝ) * R₂ R)) := by + rw [Finset.sum_add_distrib] + _ = + (D.card : ℝ)⁻¹ * + ((1 / 2 : ℝ) * (∑ R ∈ D, R₁ R) + + (1 / 2 : ℝ) * (∑ R ∈ D, R₂ R)) := by + rw [Finset.mul_sum, Finset.mul_sum] + _ = + (1 / 2 : ℝ) * ((D.card : ℝ)⁻¹ * ∑ R ∈ D, R₁ R) + + (1 / 2 : ℝ) * ((D.card : ℝ)⁻¹ * ∑ R ∈ D, R₂ R) := by + ring + calc + blockJObservableCubeSetBlockVec Q (p, q) (qStar, pStar) a + = + (1 / 2 : ℝ) * restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) (adjointReg a) := by + rfl + _ ≤ (1 / 2 : ℝ) * descendantsAverage Q j R₁ + + (1 / 2 : ℝ) * descendantsAverage Q j R₂ := hsum + _ = descendantsAverage Q j + (fun R => blockJObservableCubeSetBlockVec R (p, q) (qStar, pStar) a) := havg.symm + +theorem doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (P Qv : BlockVec d) : + Ch02.doubledResponseJ (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + P Qv = + blockJObservableCubeSetBlockVec Q P Qv a := by + rcases P with ⟨p, q⟩ + rcases Qv with ⟨qStar, pStar⟩ + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hresp₁ : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (p - pStar) (qStar - q) = + restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (p - pStar) (qStar - q) + = ResponseJ (openCubeSet Q) (p - pStar) (qStar - q) a.toFun := by + simpa [F, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q) (p - pStar) (qStar - q) + _ = restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (p - pStar) (qStar - q) a.toFun] + rfl + have hresp₂ : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) = + restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) + (adjointReg a) := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) + = ResponseJ (openCubeSet Q) (pStar + p) (qStar + q) + (adjointCoeffField a.toFun) := by + have hAdj : + ((F.coeffOn Q).transpose).toCoeffField = adjointCoeffField a.toFun := by + funext x + simp [F, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, adjointCoeffField] + simpa [F, hAdj, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) + _ = restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) + (adjointReg a) := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (pStar + p) (qStar + q) (adjointCoeffField a.toFun)] + rfl + rw [Ch02.doubledResponseJ_eq_half_responseJ_adjoint_sum] + simp [blockJObservableCubeSetBlockVec, F, hresp₁, hresp₂] + +def fullBlockReflect {d : ℕ} (M : FullBlockMat d) : FullBlockMat d := + toFullBlockMat (blockReflect (ofFullBlockMat M)) + +def fullBlockQuadraticCh04 {d : ℕ} (M : FullBlockMat d) (x : FullBlockVec d) : ℝ := + dotProduct x (Matrix.mulVec M x) + +noncomputable def blockJQuadraticFullBlockMat {d : ℕ} + (M : FullBlockMat d) (P Qv : BlockVec d) : ℝ := + (1 / 2 : ℝ) * fullBlockQuadraticCh04 M (toFullBlockVec P) + + (1 / 2 : ℝ) * fullBlockQuadraticCh04 (fullBlockReflect M) (toFullBlockVec Qv) - + blockVecDot P Qv + +@[simp] +theorem fullBlockReflect_toFullBlockMat {d : ℕ} (A : BlockMat d) : + fullBlockReflect (toFullBlockMat A) = toFullBlockMat (blockReflect A) := by + ext α β + cases α <;> cases β <;> simp [fullBlockReflect, toFullBlockMat, + ofFullBlockMat, blockReflect] + +theorem fullBlockQuadraticCh04_toFullBlockMat {d : ℕ} (A : BlockMat d) + (P : BlockVec d) : + fullBlockQuadraticCh04 (toFullBlockMat A) (toFullBlockVec P) = + blockVecDot P (blockMatVecMul A P) := by + unfold fullBlockQuadraticCh04 + rw [← toFullBlockVec_blockMatVecMul, dotProduct_toFullBlockVec] + +private theorem measurable_fullBlockReflect {d : ℕ} : + Measurable (fullBlockReflect (d := d)) := by + refine measurable_pi_iff.2 fun α => ?_ + refine measurable_pi_iff.2 fun β => ?_ + cases α <;> cases β + all_goals + simp [fullBlockReflect, toFullBlockMat, ofFullBlockMat, blockReflect] + measurability + +private theorem measurable_fullBlockQuadraticCh04 {d : ℕ} + (x : FullBlockVec d) : + Measurable (fun M : FullBlockMat d => fullBlockQuadraticCh04 M x) := by + unfold fullBlockQuadraticCh04 dotProduct Matrix.mulVec + measurability + +private theorem measurable_blockJQuadraticFullBlockMat {d : ℕ} + (P Qv : BlockVec d) : + Measurable (fun M : FullBlockMat d => blockJQuadraticFullBlockMat M P Qv) := by + unfold blockJQuadraticFullBlockMat + exact + (((measurable_fullBlockQuadraticCh04 (toFullBlockVec P)).const_mul (1 / 2 : ℝ)).add + (((measurable_fullBlockQuadraticCh04 (toFullBlockVec Qv)).comp measurable_fullBlockReflect).const_mul + (1 / 2 : ℝ))).sub measurable_const + +theorem blockJObservableCubeSetBlockVec_eq_blockJQuadraticFullBlockMat_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (P Qv : BlockVec d) : + blockJObservableCubeSetBlockVec Q P Qv a = + blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P Qv := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hblock := + doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + (a := a) ha Q P Qv + have hsplit := + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) (F.coeffOn Q)).doubled_response_splitting P Qv + have hcoarse : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + (a := a) ha Q + have hstar : + Ch02.coarseStarredBlockMatrixInv (Ch02.cubeDomain Q) (F.coeffOn Q) = + blockReflect (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)) := + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) (F.coeffOn Q)).starred_inverse_formula + calc + blockJObservableCubeSetBlockVec Q P Qv a = + Ch02.doubledResponseJ (Ch02.cubeDomain Q) (F.coeffOn Q) P Qv := hblock.symm + _ = + (1 / 2 : ℝ) * + blockVecDot P + (blockMatVecMul (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)) P) + + (1 / 2 : ℝ) * + blockVecDot Qv + (blockMatVecMul + (Ch02.coarseStarredBlockMatrixInv (Ch02.cubeDomain Q) (F.coeffOn Q)) Qv) - + blockVecDot P Qv := hsplit + _ = + blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P Qv := by + rw [hcoarse, hstar] + simp [blockJQuadraticFullBlockMat, fullBlockQuadraticCh04_toFullBlockMat] + +theorem blockJObservableCubeSetBlockVec_ae_eq_blockJQuadraticFullBlockMat + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} (hPμ : RestrictionLawCarrier Pμ) + (Q : TriadicCube d) (P Qv : BlockVec d) : + blockJObservableCubeSetBlockVec Q P Qv =ᵐ[Pμ] + fun a : RegCoeffField d => + blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P Qv := by + filter_upwards [hPμ.ae_locallyUniformlyEllipticField] with a ha + exact + blockJObservableCubeSetBlockVec_eq_blockJQuadraticFullBlockMat_of_aelocallyUniformlyEllipticField + ha Q P Qv + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_blockJObservableCubeSetBlockVec + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} (hPμ : RestrictionLawCarrier Pμ) + (Q : TriadicCube d) (P Qv : BlockVec d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + blockJObservableCubeSetBlockVec Q P Qv =ᵐ[Pμ] Y := by + rcases exists_isRestrictionLocalRandomVariable_ae_eq_coarseFullBlockMatrix_cubeSet hPμ Q with + ⟨Ymat, hYmat_local, hYmat_eq⟩ + let g : FullBlockMat d → ℝ := fun M => blockJQuadraticFullBlockMat M P Qv + refine ⟨fun a => g (Ymat a), + hYmat_local.comp_measurable (measurable_blockJQuadraticFullBlockMat P Qv), ?_⟩ + have hraw := + blockJObservableCubeSetBlockVec_ae_eq_blockJQuadraticFullBlockMat hPμ Q P Qv + filter_upwards [hraw, hYmat_eq] with a hJ hM + simp [g, hJ, hM] + +noncomputable def blockJSetObservableBlockVec {d : ℕ} + (P Qv : BlockVec d) : Set (Vec d) → CoeffField d → ℝ := + fun U => blockJHalfResponseAdjointSumSet U P.1 Qv.2 P.2 Qv.1 + +/-- The raw set-observable, precomposed with the honest sample on a triadic +cube, is the carrier block-response observable. -/ +@[simp] +theorem blockJSetObservableBlockVec_cubeSet {d : ℕ} + (Q : TriadicCube d) (P Qv : BlockVec d) (a : RegCoeffField d) : + blockJSetObservableBlockVec P Qv (cubeSet Q) a.toFun = + blockJObservableCubeSetBlockVec Q P Qv a := + rfl + +theorem blockJSetObservableBlockVec_translation_covariant {d : ℕ} + (P Qv : BlockVec d) : + IsTranslationCovariant (blockJSetObservableBlockVec P Qv) := by + simpa [blockJSetObservableBlockVec] using! + blockJHalfResponseAdjointSumSet_translation_covariant + (d := d) P.1 Qv.2 P.2 Qv.1 + +/-- Restriction translation covariance of the raw set-observable precomposed +with the honest sample. -/ +theorem blockJSetObservableBlockVec_restrictionTranslationCovariant {d : ℕ} + (P Qv : BlockVec d) : + IsRestrictionTranslationCovariant + (fun U a => blockJSetObservableBlockVec P Qv U a.toFun) := + isRestrictionTranslationCovariant_comp_toFun + (blockJSetObservableBlockVec_translation_covariant P Qv) + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_blockJSetObservableBlockVec_cubeSet + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} (hPμ : RestrictionLawCarrier Pμ) + (Q : TriadicCube d) (P Qv : BlockVec d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => blockJSetObservableBlockVec P Qv (cubeSet Q) a.toFun) + =ᵐ[Pμ] Y := by + simpa using + exists_isRestrictionLocalRandomVariable_ae_eq_blockJObservableCubeSetBlockVec hPμ Q P Qv + +theorem aemeasurable_blockJSetObservableBlockVec_cubeSet + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} (hPμ : RestrictionLawCarrier Pμ) + (Q : TriadicCube d) (P Qv : BlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => blockJSetObservableBlockVec P Qv (cubeSet Q) a.toFun) + Pμ := by + rcases exists_isRestrictionLocalRandomVariable_ae_eq_blockJSetObservableBlockVec_cubeSet + hPμ Q P Qv with ⟨Y, hYloc, hYeq⟩ + exact (hPμ.aemeasurable_of_isLocalRandomVariable hYloc).congr hYeq.symm + +private theorem gammaTriangleConst_pos' {σ : ℝ} : + 0 < gammaTriangleConst σ := by + simpa [gammaTriangleConst] using + (IndependentSums.gammaTriangleConst_pos (σ := σ)) + +theorem isBigO_gammaSigma_blockJObservableCubeSetBlockVec_originCube_of_scaleZero + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} [IsProbabilityMeasure Pμ] + {σ θ : ℝ} (hPμ : RestrictionLawCarrier Pμ) (hstat : RestrictionStationaryLaw Pμ) + (hσ : 0 < σ) (hθ : 0 < θ) (P Qv : BlockVec d) + (h0 : + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec (originCube d 0) P Qv) θ) + {n : ℤ} (hn : 0 ≤ n) : + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec (originCube d n) P Qv) + (gammaTriangleConst σ * θ) := by + classical + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => blockJSetObservableBlockVec P Qv U a.toFun + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d n) 0 + let Avg : RegCoeffField d → ℝ := + fun a => ((D.card : ℝ)⁻¹) * + ∑ R ∈ D, blockJObservableCubeSetBlockVec R P Qv a + have hn0 : (0 : ℤ) ≤ (originCube d n).scale := by + simpa [originCube] using hn + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty (originCube d n) hn0 + have hX_cov : IsRestrictionTranslationCovariant X := by + simpa [X] using blockJSetObservableBlockVec_restrictionTranslationCovariant P Qv + have hX0_aemeas : + AEMeasurable (X (cubeSet (originCube d 0))) Pμ := by + simpa [X] using + aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ (originCube d 0) P Qv + have hDesc_aemeas : + ∀ R, AEMeasurable (blockJObservableCubeSetBlockVec R P Qv) Pμ := by + intro R + simpa using + aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ R P Qv + have hDesc_tail : + ∀ R ∈ D, + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec R P Qv) θ := by + intro R hR + have hshift : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift 0 R)) + (cubeSet (originCube d 0)) := by + exact cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) (n := 0) (m := n) (R := R) (by norm_num) + hn (by simpa [D] using hR) + have hXR_aemeas : AEMeasurable (X (cubeSet R)) Pμ := by + simpa [X] using hDesc_aemeas R + have hmap : + Measure.map (X (cubeSet R)) Pμ = + Measure.map (X (cubeSet (originCube d 0))) Pμ := by + calc + Measure.map (X (cubeSet R)) Pμ = + Measure.map + (X + (translateSet (intVecToRealVec (scaleTranslationShift 0 R)) + (cubeSet (originCube d 0)))) Pμ := by + rw [hshift] + _ = Measure.map (X (cubeSet (originCube d 0))) Pμ := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := Pμ) hstat (U := cubeSet (originCube d 0)) + hX0_aemeas hX_cov (scaleTranslationShift 0 R) + have htailX : + IsBigO Pμ (gammaSigma σ) (X (cubeSet R)) θ := by + have h0X : + IsBigO Pμ (gammaSigma σ) (X (cubeSet (originCube d 0))) θ := by + simpa [X] using h0 + exact + (isBigO_gammaSigma_iff_of_map_eq_map_aemeasurable + (μ := Pμ) (σ := σ) (A := θ) + hXR_aemeas hX0_aemeas hmap).2 h0X + simpa [X] using htailX + have hAvg_tail_raw : + IsBigO Pμ (gammaSigma σ) Avg + (gammaTriangleConst σ * (((D.card : ℝ)⁻¹) * ∑ R ∈ D, θ)) := by + simpa [Avg, D] using + isBigO_finsetAverage_of_isBigO_gammaSigma_aemeasurable + (μ := Pμ) (s := D) + (X := fun R => blockJObservableCubeSetBlockVec R P Qv) + (a := fun _R => θ) (σ := σ) hσ hD_nonempty + (by intro R hR; exact hθ) hDesc_tail hDesc_aemeas + have hAvg_tail : + IsBigO Pμ (gammaSigma σ) Avg (gammaTriangleConst σ * θ) := by + have hD_card_ne : (D.card : ℝ) ≠ 0 := by + exact_mod_cast hD_nonempty.card_ne_zero + have hscale_card : (D.card : ℝ)⁻¹ * ((D.card : ℝ) * θ) = θ := by + field_simp [hD_card_ne] + simpa [Finset.sum_const, nsmul_eq_mul, hscale_card] using hAvg_tail_raw + have hsub_ae : + ∀ᵐ a ∂Pμ, + blockJObservableCubeSetBlockVec (originCube d n) P Qv a ≤ Avg a := by + filter_upwards [hPμ.ae_locallyUniformlyEllipticField] with a ha + have hsub := + blockJObservableCubeSetBlockVec_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + (a := a) ha (originCube d n) (k := 0) hn0 P Qv + simpa [Avg, D, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth (originCube d n) hn0] using hsub + rw [IsBigO] + refine isBigOWith_of_ae_le (μ := Pμ) (Ψ := gammaSigma σ) + (X := fun a => |Avg a|) + (Y := fun a => |blockJObservableCubeSetBlockVec (originCube d n) P Qv a|) + (A := gammaTriangleConst σ * θ) hAvg_tail ?_ + filter_upwards [hsub_ae] with a hsub + have hraw_nonneg : + 0 ≤ blockJObservableCubeSetBlockVec (originCube d n) P Qv a := + blockJObservableCubeSetBlockVec_nonneg (originCube d n) P Qv a + have hAvg_nonneg : 0 ≤ Avg a := by + dsimp [Avg, D] + refine mul_nonneg (inv_nonneg.mpr (by positivity)) ?_ + exact Finset.sum_nonneg fun R _hR => + blockJObservableCubeSetBlockVec_nonneg R P Qv a + rw [abs_of_nonneg hraw_nonneg, abs_of_nonneg hAvg_nonneg] + exact hsub + +theorem isBigO_gammaSigma_centeredOrigin_blockJSetObservableBlockVec_of_scaleZero + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} [IsProbabilityMeasure Pμ] + {σ θ : ℝ} (hPμ : RestrictionLawCarrier Pμ) (hstat : RestrictionStationaryLaw Pμ) + (hσ : 0 < σ) (hθ : 0 < θ) (P Qv : BlockVec d) + (h0 : + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec (originCube d 0) P Qv) θ) + {n : ℤ} (hn : 0 ≤ n) : + IsBigO Pμ (gammaSigma σ) + (restrictionCenteredOriginObservable Pμ n + (fun U a => blockJSetObservableBlockVec P Qv U a.toFun)) + (gammaTriangleConst σ * + (gammaTriangleConst σ * θ + + gammaMomentConst σ * (gammaTriangleConst σ * θ))) := by + let rawK : ℝ := gammaTriangleConst σ * θ + let Xn : RegCoeffField d → ℝ := + blockJObservableCubeSetBlockVec (originCube d n) P Qv + have hrawK_pos : 0 < rawK := by + exact mul_pos gammaTriangleConst_pos' hθ + have hraw : + IsBigO Pμ (gammaSigma σ) Xn rawK := by + simpa [Xn, rawK] using + isBigO_gammaSigma_blockJObservableCubeSetBlockVec_originCube_of_scaleZero + hPμ hstat hσ hθ P Qv h0 hn + have hXn_aemeas : AEMeasurable Xn Pμ := by + simpa [Xn] using + aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ (originCube d n) P Qv + have hMomentConst_pos : 0 < gammaMomentConst σ := by + simpa [gammaMomentConst] using + (IndependentSums.gammaMomentConst_pos hσ) + have hM_pos : 0 < gammaMomentConst σ * rawK := + mul_pos hMomentConst_pos hrawK_pos + have hmean_bound : + |∫ a, Xn a ∂Pμ| ≤ gammaMomentConst σ * rawK := by + have hmoment := + integral_abs_rpow_le_of_isBigO_gammaSigma + (μ := Pμ) (X := Xn) (K := rawK) (σ := σ) (p := (1 : ℝ)) + hσ hrawK_pos (by norm_num) hXn_aemeas hraw + calc + |∫ a, Xn a ∂Pμ| ≤ ∫ a, |Xn a| ∂Pμ := + abs_integral_le_integral_abs + _ = ∫ a, |Xn a| ^ (1 : ℝ) ∂Pμ := by + simp + _ ≤ (gammaMomentConst σ * (1 : ℝ) ^ σ⁻¹ * rawK) ^ (1 : ℝ) := + hmoment + _ = gammaMomentConst σ * rawK := by + simp + have hcenter := + isBigO_gammaSigma_sub_const_of_abs_const_le_aemeasurable + (μ := Pμ) (σ := σ) (K := rawK) + (M := gammaMomentConst σ * rawK) + (c := ∫ a, Xn a ∂Pμ) (X := Xn) + hσ hrawK_pos hM_pos hraw hXn_aemeas hmean_bound + simpa [restrictionCenteredOriginObservable, Xn, rawK, + mul_assoc, mul_left_comm, mul_comm] using! hcenter + +theorem isBigOWith_gammaSigma_blockJObservableCubeSetBlockVec_originCube_sub_integral + {d : ℕ} [NeZero d] {Pμ : RestrictionCoeffLaw d} [IsProbabilityMeasure Pμ] + {σ θ : ℝ} (hPμ : RestrictionLawCarrier Pμ) (hstat : RestrictionStationaryLaw Pμ) + (hdep : RestrictionUnitRangeDependentLaw Pμ) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hθ : 0 < θ) (P Qv : BlockVec d) + (h0 : + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec (originCube d 0) P Qv) θ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n < m) : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + (gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) / + ((descendantsAtScale (originCube d m) n).card : ℝ)) * + (gammaTriangleConst σ * + (gammaTriangleConst σ * θ + + gammaMomentConst σ * (gammaTriangleConst σ * θ)))) := by + classical + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => blockJSetObservableBlockVec P Qv U a.toFun + let Q : TriadicCube d := originCube d m + let centerK : ℝ := + gammaTriangleConst σ * + (gammaTriangleConst σ * θ + + gammaMomentConst σ * (gammaTriangleConst σ * θ)) + have hnm_le : n ≤ m := le_of_lt hnm + have hnQ : n ≤ Q.scale := by + simpa [Q] using! hnm_le + have hrawK_pos : 0 < gammaTriangleConst σ * θ := + mul_pos gammaTriangleConst_pos' hθ + have hMomentConst_pos : 0 < gammaMomentConst σ := by + simpa [gammaMomentConst] using + (IndependentSums.gammaMomentConst_pos hσ₀) + have hcenterK_pos : 0 < centerK := by + dsimp [centerK] + exact mul_pos gammaTriangleConst_pos' + (add_pos hrawK_pos (mul_pos hMomentConst_pos hrawK_pos)) + have hcenter : + IsBigO Pμ (gammaSigma σ) + (restrictionCenteredOriginObservable Pμ n X) centerK := by + simpa [X, centerK] using + isBigO_gammaSigma_centeredOrigin_blockJSetObservableBlockVec_of_scaleZero + hPμ hstat hσ₀ hθ P Qv h0 hn + have hX_cov : IsRestrictionTranslationCovariant X := by + simpa [X] using blockJSetObservableBlockVec_restrictionTranslationCovariant P Qv + have hX_local : + ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ + X (cubeSet R) =ᵐ[Pμ] Y := by + intro R _hR + simpa [X] using + exists_isRestrictionLocalRandomVariable_ae_eq_blockJSetObservableBlockVec_cubeSet + hPμ R P Qv + have hX0_aemeas : + AEMeasurable (X (cubeSet (originCube d n))) Pμ := by + simpa [X] using + aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ (originCube d n) P Qv + have hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) Pμ := by + intro R _hR + simpa [X] using + aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ R P Qv + have hpart : + IsBigO Pμ (gammaSigma σ) (restrictionCenteredDescendantAverageOnCube Pμ Q n X) + (gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale Q n).card : ℝ) / + ((descendantsAtScale Q n).card : ℝ)) * centerK) := + isBigO_gammaSigma_restrictionCenteredDescendantAverageOnCube_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (Q := Q) (n := n) (P := Pμ) hPμ hn hnQ hstat hdep X + hX_local hX_cov hX0_aemeas hX_desc_aemeas hσ₀ hσ₂ + hcenterK_pos hcenter + have hsub_ae : + ∀ᵐ a ∂Pμ, + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ ≤ + restrictionCenteredDescendantAverageOnCube Pμ Q n X a := by + filter_upwards [hPμ.ae_locallyUniformlyEllipticField] with a ha + have hsub := + blockJObservableCubeSetBlockVec_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + (a := a) ha Q (k := n) hnQ P Qv + have hcenter_eq := + congrFun + (restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := Pμ) (Q := Q) (n := n) hnQ X) a + calc + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ + ≤ + descendantsAverage Q (Int.toNat (Q.scale - n)) + (fun R => blockJObservableCubeSetBlockVec R P Qv a) - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ := by + simpa [Q] using sub_le_sub_right hsub + (∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + _ = + restrictionDescendantAverageOnCube Q n X a - + ∫ b, X (cubeSet (originCube d n)) b ∂Pμ := by + simp [restrictionDescendantAverageOnCube, descendantsAverage, X, Q, + descendantsAtScale_eq_descendantsAtDepth Q hnQ] + _ = restrictionCenteredDescendantAverageOnCube Pμ Q n X a := by + rw [hcenter_eq] + have hfinal : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + (gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale Q n).card : ℝ) / + ((descendantsAtScale Q n).card : ℝ)) * centerK) := by + refine isBigOWith_of_ae_le (μ := Pμ) (Ψ := gammaSigma σ) + (X := fun a => |restrictionCenteredDescendantAverageOnCube Pμ Q n X a|) + (Y := fun a => + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + (A := gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale Q n).card : ℝ) / + ((descendantsAtScale Q n).card : ℝ)) * centerK) hpart ?_ + filter_upwards [hsub_ae] with a ha + exact ha.trans (le_abs_self _) + simpa [Q, centerK, X, mul_assoc, mul_left_comm, mul_comm] using hfinal + +private theorem scaleColorPeriod_natCast_eq_zero_ch04 (n : ℕ) : + scaleColorPeriod (n : ℤ) = scaleColorPeriod 0 := by + have hpos : 0 < (3 : ℝ) ^ (-(n : ℤ)) := + zpow_pos (by norm_num : (0 : ℝ) < 3) (-(n : ℤ)) + have hle_one : (3 : ℝ) ^ (-(n : ℤ)) ≤ 1 := by + exact zpow_le_one_of_nonpos₀ + (show (1 : ℝ) ≤ 3 by norm_num) + (by exact neg_nonpos.mpr (Int.natCast_nonneg n)) + have hceil : + Nat.ceil ((3 : ℝ) ^ (-(n : ℤ))) = 1 := by + rw [Nat.ceil_eq_iff (by norm_num : (1 : ℕ) ≠ 0)] + constructor + · have h1 : ((1 : ℕ) - 1 : ℕ) = 0 := by norm_num + simp only [h1, Nat.cast_zero] + exact hpos + · simpa using hle_one + unfold scaleColorPeriod + rw [hceil] + norm_num + +private theorem gammaSigmaDescendantsAtScaleConst_eq_zero_of_nonneg + {d : ℕ} {n : ℤ} {σ : ℝ} (hn : 0 ≤ n) : + gammaSigmaDescendantsAtScaleConst d n σ = + gammaSigmaDescendantsAtScaleConst d 0 σ := by + have hn_toNat : ((Int.toNat n : ℤ) = n) := Int.toNat_of_nonneg hn + have hperiod : scaleColorPeriod n = scaleColorPeriod 0 := by + calc + scaleColorPeriod n = scaleColorPeriod (Int.toNat n : ℤ) := by + rw [hn_toNat] + _ = scaleColorPeriod 0 := scaleColorPeriod_natCast_eq_zero_ch04 (Int.toNat n) + simp [gammaSigmaDescendantsAtScaleConst, hperiod] + +private theorem descendantsAtScale_originCube_card + {d : ℕ} {n m : ℤ} (hnm : n ≤ m) : + (descendantsAtScale (originCube d m) n).card = + (3 ^ d) ^ Int.toNat (m - n) := by + rw [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] + exact descendantsAtDepth_card (originCube d m) (Int.toNat (m - n)) + +private theorem descendantsAtScale_originCube_sqrt_card_div_card + {d : ℕ} {n m : ℤ} (hnm : n ≤ m) : + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) / + ((descendantsAtScale (originCube d m) n).card : ℝ) = + (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) := by + let j : ℕ := Int.toNat (m - n) + have hcard := descendantsAtScale_originCube_card (d := d) (n := n) (m := m) hnm + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + have h3_pos : 0 < (3 : ℝ) := by norm_num + have hcast : + (((3 ^ d) ^ j : ℕ) : ℝ) = (3 : ℝ) ^ (d * j) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + have hsqrt : + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) = + (3 : ℝ) ^ (((d : ℝ) / 2) * (j : ℝ)) := by + rw [hcard, Real.sqrt_eq_rpow] + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * j)] + rw [← Real.rpow_mul h3_nonneg] + congr 1 + rw [Nat.cast_mul] + ring + have hinv : + (((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹) = + (3 : ℝ) ^ (-(d : ℝ) * (j : ℝ)) := by + rw [hcard] + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * j)] + rw [show ((d * j : ℕ) : ℝ) = (d : ℝ) * (j : ℝ) by rw [Nat.cast_mul]] + simpa [neg_mul] using + (Real.rpow_neg h3_nonneg ((d : ℝ) * (j : ℝ))).symm + calc + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) / + ((descendantsAtScale (originCube d m) n).card : ℝ) + = + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * + (((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹) := by + rw [div_eq_mul_inv] + _ = (3 : ℝ) ^ (((d : ℝ) / 2) * (j : ℝ)) * + (3 : ℝ) ^ (-(d : ℝ) * (j : ℝ)) := by + rw [hsqrt, hinv] + _ = (3 : ℝ) ^ ((((d : ℝ) / 2) * (j : ℝ)) + + (-(d : ℝ) * (j : ℝ))) := by + rw [← Real.rpow_add h3_pos] + _ = (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) := by + simp [j] + ring_nf + +noncomputable def blockJConcentrationConst (d : ℕ) (σ : ℝ) : ℝ := + gammaSigmaDescendantsAtScaleConst d 0 σ * + (gammaTriangleConst σ * + (gammaTriangleConst σ + gammaMomentConst σ * gammaTriangleConst σ)) + +theorem blockJConcentrationConst_pos {d : ℕ} {σ : ℝ} (hσ : 0 < σ) : + 0 < blockJConcentrationConst d σ := by + have hG : 0 < gammaSigmaDescendantsAtScaleConst d 0 σ := + gammaSigmaDescendantsAtScaleConst_pos hσ + have hMoment : 0 < gammaMomentConst σ := by + simpa [gammaMomentConst] using + (IndependentSums.gammaMomentConst_pos hσ) + have hcenter : + 0 < gammaTriangleConst σ * + (gammaTriangleConst σ + gammaMomentConst σ * gammaTriangleConst σ) := by + exact mul_pos gammaTriangleConst_pos' + (add_pos gammaTriangleConst_pos' + (mul_pos hMoment gammaTriangleConst_pos')) + exact mul_pos hG hcenter + +/-- Lemma `l.concentration.of.J`, in the block-vector form used by the Lean +development. The manuscript's normalized pair +`(B^{-1/2}e, B^{1/2}e)` is obtained by specializing `P` and `Qv`. + +The constant is chosen before `θ`, the law, the vectors, and the scales. -/ +theorem concentration_of_blockJObservableCubeSetBlockVec + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) : + ∃ C : ℝ, 0 < C ∧ + ∀ {θ : ℝ}, 0 < θ → + ∀ {Pμ : RestrictionCoeffLaw d} [IsProbabilityMeasure Pμ], + RestrictionLawCarrier Pμ → RestrictionStationaryLaw Pμ → RestrictionUnitRangeDependentLaw Pμ → + ∀ (P Qv : BlockVec d), + IsBigO Pμ (gammaSigma σ) + (blockJObservableCubeSetBlockVec (originCube d 0) P Qv) θ → + ∀ {n m : ℤ}, 0 ≤ n → n < m → + IsBigOWith Pμ (gammaSigma σ) + (fun a => + blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + (C * (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) * θ) := by + refine ⟨blockJConcentrationConst d σ, blockJConcentrationConst_pos hσ₀, ?_⟩ + intro θ hθ Pμ _hprob hPμ hstat hdep P Qv h0 n m hn hnm + have hnm_le : n ≤ m := le_of_lt hnm + have hexact := + isBigOWith_gammaSigma_blockJObservableCubeSetBlockVec_originCube_sub_integral + (Pμ := Pμ) hPμ hstat hdep hσ₀ hσ₂ hθ P Qv h0 hn hnm + have hG := + gammaSigmaDescendantsAtScaleConst_eq_zero_of_nonneg + (d := d) (n := n) (σ := σ) hn + have hcard := + descendantsAtScale_originCube_sqrt_card_div_card + (d := d) (n := n) (m := m) hnm_le + convert hexact using 1 + rw [hG, hcard] + simp [blockJConcentrationConst] + ring_nf + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalAverages.lean new file mode 100644 index 0000000000..fa34857bfd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalAverages.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables + +/-! # Canonical Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Canonical averaged response observables + +This file owns the Chapter 4 measurable representatives of the whole-cube +averaged gradient and flux of the canonical response maximizer. + +The definitions are finite coarse-block formulas. Chapter 2 proves that these +formulas are the corresponding averages of the public canonical maximizer. We +do not expose measurability of the full chosen maximizer field here. +-/ + +/-- Ch4 measurable representative of the whole-cube canonical averaged +gradient on a deterministic triadic cube. + +This is the lower-row coarse-block formula from Chapter 2. -/ +noncomputable def canonicalAverageGradientCubeSet {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : Vec d := + -p + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p + +/-- Ch4 measurable representative of the whole-cube canonical averaged flux on +a deterministic triadic cube. + +This is the upper-row coarse-block formula from Chapter 2. -/ +noncomputable def canonicalAverageFluxCubeSet {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : Vec d := + q + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p + +private theorem aemeasurable_matVecMul_const + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {d : ℕ} {M : α → Mat d} (hM : AEMeasurable M μ) (x : Vec d) : + AEMeasurable (fun a : α => matVecMul (M a) x) μ := by + rw [aemeasurable_pi_iff] + intro i + have hM_entry : ∀ j : Fin d, AEMeasurable (fun a : α => M a i j) μ := by + intro j + exact (aemeasurable_pi_iff.mp ((aemeasurable_pi_iff.mp hM) i)) j + simpa [matVecMul] using + (Finset.univ.aemeasurable_fun_sum + (μ := μ) (f := fun j a => M a i j * x j) + (fun j _hj => (hM_entry j).mul aemeasurable_const)) + +namespace RestrictionLawCarrier + +/-- The whole-cube canonical averaged gradient is a.e.-measurable under the +single Chapter 4 law carrier. -/ +theorem aemeasurable_canonicalAverageGradientCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable (canonicalAverageGradientCubeSet Q p q) P := by + have hLowerRight : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight) P := + hP.aemeasurable_coarseSigmaStarInv_cubeSet Q + have hLowerLeft : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft) P := + hP.aemeasurable_coarseBlockMatrix_lowerLeft_cubeSet Q + have hRight := aemeasurable_matVecMul_const hLowerRight q + have hLeft := aemeasurable_matVecMul_const hLowerLeft p + simpa [canonicalAverageGradientCubeSet] using! + ((aemeasurable_const.add hRight).sub hLeft) + +/-- The whole-cube canonical averaged flux is a.e.-measurable under the single +Chapter 4 law carrier. -/ +theorem aemeasurable_canonicalAverageFluxCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable (canonicalAverageFluxCubeSet Q p q) P := by + have hUpperRight : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight) P := + hP.aemeasurable_coarseBlockMatrix_upperRight_cubeSet Q + have hUpperLeft : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft) P := + hP.aemeasurable_coarseB_cubeSet Q + have hRight := aemeasurable_matVecMul_const hUpperRight q + have hLeft := aemeasurable_matVecMul_const hUpperLeft p + simpa [canonicalAverageFluxCubeSet] using! + ((aemeasurable_const.add hRight).sub hLeft) + +/-- Finite descendant averages of canonical averaged-gradient components are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_canonicalAverageGradientCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + fun i : Fin d => + descendantsAverage Q j + (fun R => canonicalAverageGradientCubeSet R p q a i)) P := by + rw [aemeasurable_pi_iff] + intro i + exact + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => canonicalAverageGradientCubeSet R p q a i) + (fun R _hR => + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalAverageGradientCubeSet R p q)) i) + +/-- Finite descendant averages of canonical averaged-flux components are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_canonicalAverageFluxCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + fun i : Fin d => + descendantsAverage Q j + (fun R => canonicalAverageFluxCubeSet R p q a i)) P := by + rw [aemeasurable_pi_iff] + intro i + exact + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => canonicalAverageFluxCubeSet R p q a i) + (fun R _hR => + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalAverageFluxCubeSet R p q)) i) + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions.lean new file mode 100644 index 0000000000..6e3bc32aa4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.AverageIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Measurability + +/-! # Canonical Solutions -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/AverageIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/AverageIdentities.lean new file mode 100644 index 0000000000..c0807c7b83 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/AverageIdentities.lean @@ -0,0 +1,719 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.Definitions + +/-! # Average Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open scoped ENNReal +open MeasureTheory + + +private theorem volumeAverage_cubeSet_indicator_of_subset + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + (f : Vec d → ℝ) : + volumeAverage (cubeSet Q) ((cubeSet R).indicator f) = + (cubeVolume Q)⁻¹ * ∫ x in cubeSet R, f x ∂volume := by + unfold volumeAverage + rw [volume_cubeSet_toReal] + congr 1 + calc + ∫ x in cubeSet Q, (cubeSet R).indicator f x ∂volume = + ∫ x, (cubeSet R).indicator f x ∂(volume.restrict (cubeSet Q)) := rfl + _ = ∫ x in cubeSet R, f x ∂(volume.restrict (cubeSet Q)) := by + rw [MeasureTheory.integral_indicator (measurableSet_cubeSet R)] + _ = ∫ x in cubeSet R, f x ∂volume := by + rw [MeasureTheory.Measure.restrict_restrict_of_subset hRQ] + +private theorem blockPairingAverage_lowerIndicator_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + (a : CoeffField d) (X : BlockState d) (i : Fin d) : + blockPairingAverage (cubeSet Q) a X + (canonicalLowerImageIndicatorTestStateCubeSet R i) = + (cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i ∂volume := by + have hIntegrand : + blockPairingIntegrand a X (canonicalLowerImageIndicatorTestStateCubeSet R i) = + (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i) := by + funext x + by_cases hx : x ∈ cubeSet R + · have hcomm : + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) + ((canonicalLowerImageIndicatorTestStateCubeSet R i).eval x)) = + blockVecDot ((canonicalLowerImageIndicatorTestStateCubeSet R i).eval x) + (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + simpa [blockCoeffField] using + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) + (X.eval x) ((canonicalLowerImageIndicatorTestStateCubeSet R i).eval x)) + calc + blockPairingIntegrand a X (canonicalLowerImageIndicatorTestStateCubeSet R i) x = + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) + ((canonicalLowerImageIndicatorTestStateCubeSet R i).eval x)) := rfl + _ = blockVecDot ((canonicalLowerImageIndicatorTestStateCubeSet R i).eval x) + (blockMatVecMul (blockCoeffField a x) (X.eval x)) := hcomm + _ = (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i := by + simp [canonicalLowerImageIndicatorTestStateCubeSet, BlockState.eval, hx, + blockVecDot, vecDot_single_left, vecDot_zero_left] + _ = (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i) x := by + simp [hx] + · calc + blockPairingIntegrand a X (canonicalLowerImageIndicatorTestStateCubeSet R i) x = 0 := by + simp [blockPairingIntegrand, canonicalLowerImageIndicatorTestStateCubeSet, + BlockState.eval, hx, blockMatVecMul, blockVecDot, vecDot, matVecMul_zero] + _ = (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i) x := by + simp [hx] + calc + blockPairingAverage (cubeSet Q) a X + (canonicalLowerImageIndicatorTestStateCubeSet R i) = + volumeAverage (cubeSet Q) + ((cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i)) := by + simp [blockPairingAverage, hIntegrand] + _ = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i ∂volume := + volumeAverage_cubeSet_indicator_of_subset hRQ _ + +private theorem blockPairingAverage_upperIndicator_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + (a : CoeffField d) (X : BlockState d) (i : Fin d) : + blockPairingAverage (cubeSet Q) a X + (canonicalUpperImageIndicatorTestStateCubeSet R i) = + (cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i ∂volume := by + have hIntegrand : + blockPairingIntegrand a X (canonicalUpperImageIndicatorTestStateCubeSet R i) = + (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i) := by + funext x + by_cases hx : x ∈ cubeSet R + · have hcomm : + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) + ((canonicalUpperImageIndicatorTestStateCubeSet R i).eval x)) = + blockVecDot ((canonicalUpperImageIndicatorTestStateCubeSet R i).eval x) + (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + simpa [blockCoeffField] using + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) + (X.eval x) ((canonicalUpperImageIndicatorTestStateCubeSet R i).eval x)) + calc + blockPairingIntegrand a X (canonicalUpperImageIndicatorTestStateCubeSet R i) x = + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) + ((canonicalUpperImageIndicatorTestStateCubeSet R i).eval x)) := rfl + _ = blockVecDot ((canonicalUpperImageIndicatorTestStateCubeSet R i).eval x) + (blockMatVecMul (blockCoeffField a x) (X.eval x)) := hcomm + _ = (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i := by + simp [canonicalUpperImageIndicatorTestStateCubeSet, BlockState.eval, hx, + blockVecDot, vecDot_single_left, vecDot_zero_left] + _ = (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i) x := by + simp [hx] + · calc + blockPairingIntegrand a X (canonicalUpperImageIndicatorTestStateCubeSet R i) x = 0 := by + simp [blockPairingIntegrand, canonicalUpperImageIndicatorTestStateCubeSet, + BlockState.eval, hx, blockMatVecMul, blockVecDot, vecDot, matVecMul_zero] + _ = (cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i) x := by + simp [hx] + calc + blockPairingAverage (cubeSet Q) a X + (canonicalUpperImageIndicatorTestStateCubeSet R i) = + volumeAverage (cubeSet Q) + ((cubeSet R).indicator + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i)) := by + simp [blockPairingAverage, hIntegrand] + _ = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i ∂volume := + volumeAverage_cubeSet_indicator_of_subset hRQ _ + +private theorem canonicalDoubledMuResponsePotentialFieldAverageCubeSet_eq_integral_of_ae_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + {a : CoeffField d} {p q : Vec d} {F : Vec d → Vec d} + (hF : + canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => HilbertVec.ofVec (F x)) + (i : Fin d) : + canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * ∫ x in cubeSet R, F x i ∂volume := by + have hCoord : + (fun x => canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a x i) + =ᵐ[(volumeMeasureOn (cubeSet Q)).restrict (cubeSet R)] + fun x => F x i := by + exact + (hF.filter_mono + (MeasureTheory.ae_mono (MeasureTheory.Measure.restrict_le_self))).mono + (fun x hx => by + simpa using congrArg (fun v : HilbertVec d => v i) hx) + calc + canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a x i + ∂volumeMeasureOn (cubeSet Q) := by + rw [canonicalDoubledMuResponsePotentialFieldAverageCubeSet, + hilbertVectorL2CoordSetIntegralCLM_apply] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, F x i ∂volumeMeasureOn (cubeSet Q) := by + congr 1 + exact MeasureTheory.integral_congr_ae hCoord + _ = (cubeVolume R)⁻¹ * ∫ x in cubeSet R, F x i ∂volume := by + congr 1 + rw [MeasureTheory.Measure.restrict_restrict_of_subset hRQ] + +private theorem canonicalDoubledMuResponseFluxFieldAverageCubeSet_eq_integral_of_ae_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + {a : CoeffField d} {p q : Vec d} {F : Vec d → Vec d} + (hF : + canonicalDoubledMuResponseFluxFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => HilbertVec.ofVec (F x)) + (i : Fin d) : + canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * ∫ x in cubeSet R, F x i ∂volume := by + have hCoord : + (fun x => canonicalDoubledMuResponseFluxFieldCubeSet Q p q a x i) + =ᵐ[(volumeMeasureOn (cubeSet Q)).restrict (cubeSet R)] + fun x => F x i := by + exact + (hF.filter_mono + (MeasureTheory.ae_mono (MeasureTheory.Measure.restrict_le_self))).mono + (fun x hx => by + simpa using congrArg (fun v : HilbertVec d => v i) hx) + calc + canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + canonicalDoubledMuResponseFluxFieldCubeSet Q p q a x i + ∂volumeMeasureOn (cubeSet Q) := by + rw [canonicalDoubledMuResponseFluxFieldAverageCubeSet, + hilbertVectorL2CoordSetIntegralCLM_apply] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, F x i ∂volumeMeasureOn (cubeSet Q) := by + congr 1 + exact MeasureTheory.integral_congr_ae hCoord + _ = (cubeVolume R)⁻¹ * ∫ x in cubeSet R, F x i ∂volume := by + congr 1 + rw [MeasureTheory.Measure.restrict_restrict_of_subset hRQ] + +private theorem canonicalDoubledMuResponseLowerImageAverageCubeSet_eq_integral_of_energy_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + {a : CoeffField d} {p q : Vec d} {X : BlockState d} (i : Fin d) + (hEnergy : + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalLowerImageIndicatorTestStateCubeSet R i) + (canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a = + blockPairingAverage (cubeSet Q) a X + (canonicalLowerImageIndicatorTestStateCubeSet R i)) : + canonicalDoubledMuResponseLowerImageAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i ∂volume := by + calc + canonicalDoubledMuResponseLowerImageAverageCubeSet Q R p q a i = + cubeVolume Q * (cubeVolume R)⁻¹ * + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalLowerImageIndicatorTestStateCubeSet R i) + (canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a := rfl + _ = cubeVolume Q * (cubeVolume R)⁻¹ * + blockPairingAverage (cubeSet Q) a X + (canonicalLowerImageIndicatorTestStateCubeSet R i) := by + rw [hEnergy] + _ = cubeVolume Q * (cubeVolume R)⁻¹ * + ((cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i ∂volume) := by + rw [blockPairingAverage_lowerIndicator_eq hRQ a X i] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 i ∂volume := by + field_simp [ne_of_gt (cubeVolume_pos Q)] + +private theorem canonicalDoubledMuResponseUpperImageAverageCubeSet_eq_integral_of_energy_eq + {d : ℕ} {Q R : TriadicCube d} (hRQ : cubeSet R ⊆ cubeSet Q) + {a : CoeffField d} {p q : Vec d} {X : BlockState d} (i : Fin d) + (hEnergy : + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalUpperImageIndicatorTestStateCubeSet R i) + (canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a = + blockPairingAverage (cubeSet Q) a X + (canonicalUpperImageIndicatorTestStateCubeSet R i)) : + canonicalDoubledMuResponseUpperImageAverageCubeSet Q R p q a i = + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i ∂volume := by + calc + canonicalDoubledMuResponseUpperImageAverageCubeSet Q R p q a i = + cubeVolume Q * (cubeVolume R)⁻¹ * + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalUpperImageIndicatorTestStateCubeSet R i) + (canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a := rfl + _ = cubeVolume Q * (cubeVolume R)⁻¹ * + blockPairingAverage (cubeSet Q) a X + (canonicalUpperImageIndicatorTestStateCubeSet R i) := by + rw [hEnergy] + _ = cubeVolume Q * (cubeVolume R)⁻¹ * + ((cubeVolume Q)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i ∂volume) := by + rw [blockPairingAverage_upperIndicator_eq hRQ a X i] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 i ∂volume := by + field_simp [ne_of_gt (cubeVolume_pos Q)] + +private theorem memVectorL2_descendant_of_mem_cubeDomain + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} {f : Vec d → Vec d} + (hR : R ∈ descendantsAtDepth Q j) + (hf : MemVectorL2 (Ch02.cubeDomain Q : Set (Vec d)) f) : + MemVectorL2 (cubeSet R) f := by + have hfOpen : MemVectorL2 (openCubeSet R) f := + hf.mono_measure (by + simpa [Ch02.cubeDomain_coe, volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet R] using hfOpen + +private theorem memVectorL2_right_of_add_ae_eq + {d : ℕ} {U : Set (Vec d)} {f g h : Vec d → Vec d} + (hf : MemVectorL2 U f) (hh : MemVectorL2 U h) + (heq : (fun x => f x + g x) =ᵐ[volumeMeasureOn U] h) : + MemVectorL2 U g := by + have hDiff : MemVectorL2 U (fun x => h x - f x) := hh.sub hf + refine MeasureTheory.MemLp.ae_eq ?_ hDiff + filter_upwards [heq] with x hx + ext i + have hxi := congrArg (fun v : Vec d => v i) hx + simp [Pi.add_apply, Pi.sub_apply] at hxi ⊢ + linarith + +/-- Correctness of the Ch4 scalar-response gradient average: on the a.e. +elliptic support it is the descendant-cube average of the raw Chapter 2 +canonical scalar-response maximizer gradient. -/ +theorem canonicalScalarResponseGradientAverageCubeSet_eq_cubeAverageVec_canonicalMaximizer + {d : ℕ} [NeZero d] (aR : RegCoeffField d) + (ha : AELocallyUniformlyEllipticField aR) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + canonicalScalarResponseGradientAverageCubeSet Q R p q aR.toFun = + cubeAverageVec R + (fun x => + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q)) + p q).toSolution.toH1.grad x) := by + classical + set a : CoeffField d := aR.toFun with hadef + let F := triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have haQ : aQ.toCoeffField = a := by + simp [aQ, F, hadef] + have hSlice : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a := + ha.exists_aeeQuantitativeEllipticSlice_cubeSet Q + let k : ℕ := Nat.find hSlice + have hk : AEEQuantitativeEllipticSlice (cubeSet Q) k a := by + simpa [k] using Nat.find_spec hSlice + let aSlice : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + ⟨a, hk⟩ + obtain ⟨X, hX⟩ := + (Ch02.doubledMuTheory (Ch02.cubeDomain Q) aQ).minimizer_exists (-p, q) + let Xold : BlockState d := { potential := X.potential, flux := X.flux } + obtain ⟨hAdm, hHilbert⟩ := + exists_isBlockMuAdmissible_cubeSet_and_hilbert_eq_canonicalAEEMuHilbertMinimizer_of_isDoubledMuMinimizer + Q k aSlice (-p, q) aQ haQ hX + have hRQ : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR + have hMinEq : + canonicalMuHilbertMinimizerCubeSet Q (-p, q) a = + toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval := by + calc + canonicalMuHilbertMinimizerCubeSet Q (-p, q) a = + ((canonicalAEEMuOperatorSystemData Q k aSlice).toMuHilbertRealization).minimizerMap + (-p, q) := by + simp only [canonicalMuHilbertMinimizerCubeSet, dif_pos hSlice, k, aSlice] + _ = toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval := + hHilbert.symm + have hPotentialAE : + canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => HilbertVec.ofVec (Xold.potential x) := by + have hProj : + canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval x).potential := by + simpa [canonicalDoubledMuResponsePotentialFieldCubeSet, + canonicalMuHilbertPotentialCubeSet, hMinEq] using + coeFn_hilbertBlockL2PotentialCLM + (U := cubeSet Q) + (F := toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval) + filter_upwards + [hProj, + coeFn_toHilbertBlockL2OfBlockField + (U := cubeSet Q) (F := Xold.eval) hAdm.memBlockL2_eval] + with x hproj hblock + rw [hproj, hblock] + simp [Xold, hilbertifyBlockField, BlockState.eval] + have hPotMemQ : MemVectorL2 (cubeSet Q) Xold.potential := by + simpa [Xold, BlockState.eval] using + memVectorL2_fst_of_memBlockL2 (U := cubeSet Q) hAdm.memBlockL2_eval + have hPotMemR : MemVectorL2 (cubeSet R) Xold.potential := + hPotMemQ.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hRQ) + have hGradMemR : + MemVectorL2 (cubeSet R) + (fun x => + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x) := by + exact memVectorL2_descendant_of_mem_cubeDomain hR + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad_memVectorL2 + have hExtractOpen : + (fun x => + Xold.potential x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2) + =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x := by + simpa only [Xold, haQ, Ch02.cubeDomain_coe] using! + Ch02.doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient + (Ch02.cubeDomain Q) aQ p q hX + have hExtractR : + (fun x => + Xold.potential x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2) + =ᵐ[volumeMeasureOn (cubeSet R)] + fun x => + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x := + ae_eq_cubeSet_of_mem_descendantsAtDepth_of_ae_eq_openCubeSet hR hExtractOpen + have hLowerMemR : + MemVectorL2 (cubeSet R) + (fun x => (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2) := by + exact memVectorL2_right_of_add_ae_eq hPotMemR hGradMemR hExtractR + have hEnergyLower : + ∀ i : Fin d, + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalLowerImageIndicatorTestStateCubeSet R i) + (canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a = + blockPairingAverage (cubeSet Q) a Xold + (canonicalLowerImageIndicatorTestStateCubeSet R i) := by + intro i + let Y := canonicalLowerImageIndicatorTestStateCubeSet R i + let hY := canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i + let system : AEEMuOperatorSystemData (cubeSet Q) a := + canonicalAEEMuOperatorSystemData Q k aSlice + calc + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) Y hY a = + system.toMuHilbertRealization.energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (system.toMuHilbertRealization.minimizerMap (-p, q)) := by + simp [canonicalMuHilbertEnergyBilinFixedCubeSet, hSlice, k, aSlice, system] + _ = system.toMuHilbertRealization.energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval) := by + rw [← hHilbert] + _ = blockPairingAverage (cubeSet Q) a Xold Y := by + simpa [system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, + MuHilbertRealization.ofOperator, Xold, Y, aSlice] using + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Xold) (Y := Y) + hAdm.memBlockL2_eval hY + ext i + have hPotAvg := + canonicalDoubledMuResponsePotentialFieldAverageCubeSet_eq_integral_of_ae_eq + hRQ (a := a) (p := p) (q := q) (F := Xold.potential) hPotentialAE i + have hLowerAvg := + canonicalDoubledMuResponseLowerImageAverageCubeSet_eq_integral_of_energy_eq + hRQ (a := a) (p := p) (q := q) (X := Xold) i (hEnergyLower i) + have hPotInt : + MeasureTheory.IntegrableOn (fun x => Xold.potential x i) (cubeSet R) := + CorrectionFieldData.integrableOn_coord_of_memVectorL2 + (U := cubeSet R) hPotMemR i + have hLowerInt : + MeasureTheory.IntegrableOn + (fun x => (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2 i) + (cubeSet R) := + CorrectionFieldData.integrableOn_coord_of_memVectorL2 + (U := cubeSet R) hLowerMemR i + calc + canonicalScalarResponseGradientAverageCubeSet Q R p q a i = + canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a i + + canonicalDoubledMuResponseLowerImageAverageCubeSet Q R p q a i := rfl + _ = (cubeVolume R)⁻¹ * ∫ x in cubeSet R, Xold.potential x i ∂volume + + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2 i ∂volume := by + rw [hPotAvg, hLowerAvg] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (Xold.potential x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2) i ∂volume := by + rw [show + (∫ x in cubeSet R, + (Xold.potential x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2) i ∂volume) + = + ∫ x in cubeSet R, Xold.potential x i ∂volume + + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).2 i ∂volume by + simpa [Pi.add_apply] using + MeasureTheory.integral_add hPotInt hLowerInt] + ring + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x i ∂volume := by + congr 1 + exact MeasureTheory.integral_congr_ae + (hExtractR.mono fun x hx => + congrArg (fun v : Vec d => v i) hx) + _ = cubeAverageVec R + (fun x => + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q)) + p q).toSolution.toH1.grad x) i := by + rfl + +/-- Correctness of the Ch4 scalar-response flux average: on the a.e. elliptic +support it is the descendant-cube average of the raw Chapter 2 canonical +scalar-response maximizer flux. -/ +theorem canonicalScalarResponseFluxAverageCubeSet_eq_cubeAverageVec_canonicalMaximizerFlux + {d : ℕ} [NeZero d] (aR : RegCoeffField d) + (ha : AELocallyUniformlyEllipticField aR) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + canonicalScalarResponseFluxAverageCubeSet Q R p q aR.toFun = + cubeAverageVec R + (fun x => + matVecMul + (((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q).toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q)) + p q).toSolution.toH1.grad x)) := by + classical + set a : CoeffField d := aR.toFun with hadef + let F := triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have haQ : aQ.toCoeffField = a := by + simp [aQ, F, hadef] + have hSlice : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a := + ha.exists_aeeQuantitativeEllipticSlice_cubeSet Q + let k : ℕ := Nat.find hSlice + have hk : AEEQuantitativeEllipticSlice (cubeSet Q) k a := by + simpa [k] using Nat.find_spec hSlice + let aSlice : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + ⟨a, hk⟩ + obtain ⟨X, hX⟩ := + (Ch02.doubledMuTheory (Ch02.cubeDomain Q) aQ).minimizer_exists (-p, q) + let Xold : BlockState d := { potential := X.potential, flux := X.flux } + obtain ⟨hAdm, hHilbert⟩ := + exists_isBlockMuAdmissible_cubeSet_and_hilbert_eq_canonicalAEEMuHilbertMinimizer_of_isDoubledMuMinimizer + Q k aSlice (-p, q) aQ haQ hX + have hRQ : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR + have hMinEq : + canonicalMuHilbertMinimizerCubeSet Q (-p, q) a = + toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval := by + calc + canonicalMuHilbertMinimizerCubeSet Q (-p, q) a = + ((canonicalAEEMuOperatorSystemData Q k aSlice).toMuHilbertRealization).minimizerMap + (-p, q) := by + simp only [canonicalMuHilbertMinimizerCubeSet, dif_pos hSlice, k, aSlice] + _ = toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval := + hHilbert.symm + have hFluxAE : + canonicalDoubledMuResponseFluxFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => HilbertVec.ofVec (Xold.flux x) := by + have hProj : + canonicalDoubledMuResponseFluxFieldCubeSet Q p q a + =ᵐ[volumeMeasureOn (cubeSet Q)] + fun x => + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval x).flux := by + simpa [canonicalDoubledMuResponseFluxFieldCubeSet, + canonicalMuHilbertFluxCubeSet, hMinEq] using + coeFn_hilbertBlockL2FluxCLM + (U := cubeSet Q) + (F := toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval) + filter_upwards + [hProj, + coeFn_toHilbertBlockL2OfBlockField + (U := cubeSet Q) (F := Xold.eval) hAdm.memBlockL2_eval] + with x hproj hblock + rw [hproj, hblock] + simp [Xold, hilbertifyBlockField, BlockState.eval] + have hFluxMemQ : MemVectorL2 (cubeSet Q) Xold.flux := by + simpa [Xold, BlockState.eval] using + memVectorL2_snd_of_memBlockL2 (U := cubeSet Q) hAdm.memBlockL2_eval + have hFluxMemR : MemVectorL2 (cubeSet R) Xold.flux := + hFluxMemQ.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hRQ) + have hCanonicalFluxMemR : + MemVectorL2 (cubeSet R) + (fun x => + matVecMul (aQ.toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x)) := by + exact memVectorL2_descendant_of_mem_cubeDomain hR + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.flux_memVectorL2 + have hExtractOpen : + (fun x => + Xold.flux x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1) + =ᵐ[volumeMeasureOn (openCubeSet Q)] + fun x => + matVecMul (aQ.toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x) := by + simpa only [Xold, haQ, Ch02.cubeDomain_coe] using! + Ch02.doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux + (Ch02.cubeDomain Q) aQ p q hX + have hExtractR : + (fun x => + Xold.flux x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1) + =ᵐ[volumeMeasureOn (cubeSet R)] + fun x => + matVecMul (aQ.toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x) := + ae_eq_cubeSet_of_mem_descendantsAtDepth_of_ae_eq_openCubeSet hR hExtractOpen + have hUpperMemR : + MemVectorL2 (cubeSet R) + (fun x => (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1) := by + exact memVectorL2_right_of_add_ae_eq hFluxMemR hCanonicalFluxMemR hExtractR + have hEnergyUpper : + ∀ i : Fin d, + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalUpperImageIndicatorTestStateCubeSet R i) + (canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a = + blockPairingAverage (cubeSet Q) a Xold + (canonicalUpperImageIndicatorTestStateCubeSet R i) := by + intro i + let Y := canonicalUpperImageIndicatorTestStateCubeSet R i + let hY := canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i + let system : AEEMuOperatorSystemData (cubeSet Q) a := + canonicalAEEMuOperatorSystemData Q k aSlice + calc + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) Y hY a = + system.toMuHilbertRealization.energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (system.toMuHilbertRealization.minimizerMap (-p, q)) := by + simp [canonicalMuHilbertEnergyBilinFixedCubeSet, hSlice, k, aSlice, system] + _ = system.toMuHilbertRealization.energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval) := by + rw [← hHilbert] + _ = blockPairingAverage (cubeSet Q) a Xold Y := by + simpa [system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, + MuHilbertRealization.ofOperator, Xold, Y, aSlice] using + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Xold) (Y := Y) + hAdm.memBlockL2_eval hY + ext i + have hFluxAvg := + canonicalDoubledMuResponseFluxFieldAverageCubeSet_eq_integral_of_ae_eq + hRQ (a := a) (p := p) (q := q) (F := Xold.flux) hFluxAE i + have hUpperAvg := + canonicalDoubledMuResponseUpperImageAverageCubeSet_eq_integral_of_energy_eq + hRQ (a := a) (p := p) (q := q) (X := Xold) i (hEnergyUpper i) + have hFluxInt : + MeasureTheory.IntegrableOn (fun x => Xold.flux x i) (cubeSet R) := + CorrectionFieldData.integrableOn_coord_of_memVectorL2 + (U := cubeSet R) hFluxMemR i + have hUpperInt : + MeasureTheory.IntegrableOn + (fun x => (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1 i) + (cubeSet R) := + CorrectionFieldData.integrableOn_coord_of_memVectorL2 + (U := cubeSet R) hUpperMemR i + calc + canonicalScalarResponseFluxAverageCubeSet Q R p q a i = + canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a i + + canonicalDoubledMuResponseUpperImageAverageCubeSet Q R p q a i := rfl + _ = (cubeVolume R)⁻¹ * ∫ x in cubeSet R, Xold.flux x i ∂volume + + (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1 i ∂volume := by + rw [hFluxAvg, hUpperAvg] + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (Xold.flux x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1) i ∂volume := by + rw [show + (∫ x in cubeSet R, + (Xold.flux x + + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1) i ∂volume) + = + ∫ x in cubeSet R, Xold.flux x i ∂volume + + ∫ x in cubeSet R, + (blockMatVecMul (blockCoeffField a x) (Xold.eval x)).1 i ∂volume by + simpa [Pi.add_apply] using + MeasureTheory.integral_add hFluxInt hUpperInt] + ring + _ = (cubeVolume R)⁻¹ * + ∫ x in cubeSet R, + (matVecMul (aQ.toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) + p q).toSolution.toH1.grad x)) i ∂volume := by + congr 1 + exact MeasureTheory.integral_congr_ae + (hExtractR.mono fun x hx => + congrArg (fun v : Vec d => v i) hx) + _ = cubeAverageVec R + (fun x => + matVecMul + (((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q).toCoeffField x) + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField aR ha).coeffOn Q)) + p q).toSolution.toH1.grad x)) i := by + rfl + + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Definitions.lean new file mode 100644 index 0000000000..e5068aaa17 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Definitions.lean @@ -0,0 +1,449 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.MuFamily + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open scoped ENNReal +open MeasureTheory + +/-! +# Canonical solution-field measurability + +This file is the public Ch4 handoff for selected canonical doubled-`Mu` +Hilbert minimizers. The definition below is total: on coefficient fields that +lie in some AEE quantitative slice it uses the least slice index, and outside +that support it returns `0`. Under a `RestrictionLawCarrier`, the outside branch is null. +-/ + +/-- The canonical totalized selected doubled-`Mu` Hilbert minimizer on a +deterministic cube. On fields that belong to some AEE quantitative slice it +uses the least such slice index; outside the AEE slice cover it is `0`. + +The law-facing theorem +`RestrictionLawCarrier.aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet` shows +that this totalization is harmless under a `RestrictionLawCarrier`. -/ +noncomputable def canonicalMuHilbertMinimizerCubeSet + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) : + CoeffField d → HilbertBlockL2 (cubeSet Q) := by + classical + intro a + by_cases h : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a + · let k : ℕ := Nat.find h + let ak : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + ⟨a, by simpa [k] using Nat.find_spec h⟩ + exact ((canonicalAEEMuOperatorSystemData Q k ak).toMuHilbertRealization).minimizerMap P0 + · exact 0 + +/-- Potential component of the selected doubled-`Mu` Hilbert minimizer on a +deterministic cube. -/ +noncomputable def canonicalMuHilbertPotentialCubeSet + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) : + CoeffField d → HilbertVectorL2 (cubeSet Q) := + fun a => hilbertBlockL2PotentialCLM (U := cubeSet Q) + (canonicalMuHilbertMinimizerCubeSet Q P0 a) + +/-- Flux component of the selected doubled-`Mu` Hilbert minimizer on a +deterministic cube. -/ +noncomputable def canonicalMuHilbertFluxCubeSet + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) : + CoeffField d → HilbertVectorL2 (cubeSet Q) := + fun a => hilbertBlockL2FluxCLM (U := cubeSet Q) + (canonicalMuHilbertMinimizerCubeSet Q P0 a) + +/-- Ch4 selected doubled-`Mu` potential field with response loading `(-p, q)`. + +This object is measurable and useful for the doubled-`Mu` problem, but it is +not, by definition, the raw scalar response-maximizer gradient +`∇ v(·, Q, p, q; a)`. Section 5.3 weak norms should use the scalar-response +average and weak-norm observables below, which add the selected doubled-`Mu` +projection to its coefficient-operator image averages. -/ +noncomputable def canonicalDoubledMuResponsePotentialFieldCubeSet + {d : ℕ} (Q : TriadicCube d) (p q : Vec d) : + CoeffField d → HilbertVectorL2 (cubeSet Q) := + canonicalMuHilbertPotentialCubeSet Q (-p, q) + +/-- Ch4 selected doubled-`Mu` flux field with response loading `(-p, q)`. + +This is the flux projection of the selected doubled-`Mu` minimizer. It is not, +by definition, the raw scalar response flux `a ∇ v(·, Q, p, q; a)`. -/ +noncomputable def canonicalDoubledMuResponseFluxFieldCubeSet + {d : ℕ} (Q : TriadicCube d) (p q : Vec d) : + CoeffField d → HilbertVectorL2 (cubeSet Q) := + canonicalMuHilbertFluxCubeSet Q (-p, q) + +/-- The selected doubled-`Mu` potential field averaged over `R`, viewed as a +continuous postcomposition of the parent-cube Hilbert `L²` field on `Q`. + +The intended use is `R ∈ descendantsAtDepth Q j`, but the definition is total. -/ +noncomputable def canonicalDoubledMuResponsePotentialFieldAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + (cubeVolume R)⁻¹ * + hilbertVectorL2CoordSetIntegralCLM (U := cubeSet Q) + (cubeSet R) (measurableSet_cubeSet R) i + (canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a) + +/-- The selected doubled-`Mu` flux field averaged over `R`, viewed as a continuous +postcomposition of the parent-cube Hilbert `L²` field on `Q`. + +The intended use is `R ∈ descendantsAtDepth Q j`, but the definition is total. -/ +noncomputable def canonicalDoubledMuResponseFluxFieldAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + (cubeVolume R)⁻¹ * + hilbertVectorL2CoordSetIntegralCLM (U := cubeSet Q) + (cubeSet R) (measurableSet_cubeSet R) i + (canonicalDoubledMuResponseFluxFieldCubeSet Q p q a) + +/-- Finite descendant average of the selected doubled-`Mu` potential averages. -/ +noncomputable def descendantsAverageCanonicalDoubledMuResponsePotentialFieldAverageCubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + descendantsAverage Q j + (fun R => canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a i) + +/-- Finite descendant average of the selected doubled-`Mu` flux averages. -/ +noncomputable def descendantsAverageCanonicalDoubledMuResponseFluxFieldAverageCubeSet + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + descendantsAverage Q j + (fun R => canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a i) + +/-- Finite-depth selected doubled-`Mu` potential weak norm, expressed only through +descendant averages of the selected doubled-`Mu` Hilbert field. -/ +noncomputable def canonicalDoubledMuResponsePotentialWeakNormPartialCubeSet + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q p0 : Vec d) : + CoeffField d → ℝ := + fun a => + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq (canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a - p0)) + +/-- Finite-depth selected doubled-`Mu` flux weak norm, expressed only through +descendant averages of the selected doubled-`Mu` Hilbert field. -/ +noncomputable def canonicalDoubledMuResponseFluxWeakNormPartialCubeSet + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (N : ℕ) (p q q0 : Vec d) : + CoeffField d → ℝ := + fun a => + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq (canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a - q0)) + +/-- Full selected doubled-`Mu` potential weak norm, as the countable supremum of the +finite-depth norms. -/ +noncomputable def canonicalDoubledMuResponsePotentialWeakNormCubeSet + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + CoeffField d → ℝ := + fun a => ⨆ N : ℕ, canonicalDoubledMuResponsePotentialWeakNormPartialCubeSet Q s N p q p0 a + +/-- Full selected doubled-`Mu` flux weak norm, as the countable supremum of the +finite-depth norms. -/ +noncomputable def canonicalDoubledMuResponseFluxWeakNormCubeSet + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) : + CoeffField d → ℝ := + fun a => ⨆ N : ℕ, canonicalDoubledMuResponseFluxWeakNormPartialCubeSet Q t N p q q0 a + +/-- Totalized fixed-test Hilbert energy pairing against the selected +canonical doubled-`Mu` minimizer. On the AEE elliptic support it uses the least +quantitative slice; outside that support it is set to `0`. + +This is an internal Ch4 scalar-response source: fixed indicator tests recover +averages of the coefficient-operator image of the selected minimizer. -/ +noncomputable def canonicalMuHilbertEnergyBilinFixedCubeSet + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + CoeffField d → ℝ := by + classical + intro a + by_cases h : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a + · let k : ℕ := Nat.find h + let ak : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a} := + ⟨a, by simpa [k] using Nat.find_spec h⟩ + exact + ((canonicalAEEMuOperatorSystemData Q k ak).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (((canonicalAEEMuOperatorSystemData Q k ak).toMuHilbertRealization).minimizerMap P0) + · exact 0 + +noncomputable def canonicalUpperImageIndicatorTestStateCubeSet + {d : ℕ} (R : TriadicCube d) (i : Fin d) : BlockState d := + { potential := fun x => (cubeSet R).indicator (fun _ => Pi.single i 1) x + flux := fun _ => 0 } + +noncomputable def canonicalLowerImageIndicatorTestStateCubeSet + {d : ℕ} (R : TriadicCube d) (i : Fin d) : BlockState d := + { potential := fun _ => 0 + flux := fun x => (cubeSet R).indicator (fun _ => Pi.single i 1) x } + +theorem canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 + {d : ℕ} (Q R : TriadicCube d) (i : Fin d) : + MemBlockL2 (cubeSet Q) (canonicalUpperImageIndicatorTestStateCubeSet R i).eval := by + classical + have hR_ne_top : volumeMeasureOn (cubeSet Q) (cubeSet R) ≠ ⊤ := by + have hle : + volumeMeasureOn (cubeSet Q) (cubeSet R) ≤ + volumeMeasureOn (cubeSet Q) Set.univ := + MeasureTheory.measure_mono (Set.subset_univ (cubeSet R)) + have hUniv_lt : volumeMeasureOn (cubeSet Q) Set.univ < ⊤ := by + simp [volumeMeasureOn, volume_cubeSet_lt_top Q] + exact ne_of_lt (lt_of_le_of_lt hle hUniv_lt) + have hEq : + (canonicalUpperImageIndicatorTestStateCubeSet R i).eval = + (cubeSet R).indicator + (fun _ : Vec d => ((Pi.single i 1, 0) : BlockVec d)) := by + funext x + by_cases hx : x ∈ cubeSet R + · simp [canonicalUpperImageIndicatorTestStateCubeSet, BlockState.eval, hx] + · simp [canonicalUpperImageIndicatorTestStateCubeSet, BlockState.eval, hx] + rw [hEq] + exact + MeasureTheory.memLp_indicator_const + (μ := volumeMeasureOn (cubeSet Q)) (p := (2 : ℝ≥0∞)) + (s := cubeSet R) (hs := measurableSet_cubeSet R) + (c := ((Pi.single i 1, 0) : BlockVec d)) (Or.inr hR_ne_top) + +theorem canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 + {d : ℕ} (Q R : TriadicCube d) (i : Fin d) : + MemBlockL2 (cubeSet Q) (canonicalLowerImageIndicatorTestStateCubeSet R i).eval := by + classical + have hR_ne_top : volumeMeasureOn (cubeSet Q) (cubeSet R) ≠ ⊤ := by + have hle : + volumeMeasureOn (cubeSet Q) (cubeSet R) ≤ + volumeMeasureOn (cubeSet Q) Set.univ := + MeasureTheory.measure_mono (Set.subset_univ (cubeSet R)) + have hUniv_lt : volumeMeasureOn (cubeSet Q) Set.univ < ⊤ := by + simp [volumeMeasureOn, volume_cubeSet_lt_top Q] + exact ne_of_lt (lt_of_le_of_lt hle hUniv_lt) + have hEq : + (canonicalLowerImageIndicatorTestStateCubeSet R i).eval = + (cubeSet R).indicator + (fun _ : Vec d => ((0, Pi.single i 1) : BlockVec d)) := by + funext x + by_cases hx : x ∈ cubeSet R + · simp [canonicalLowerImageIndicatorTestStateCubeSet, BlockState.eval, hx] + · simp [canonicalLowerImageIndicatorTestStateCubeSet, BlockState.eval, hx] + rw [hEq] + exact + MeasureTheory.memLp_indicator_const + (μ := volumeMeasureOn (cubeSet Q)) (p := (2 : ℝ≥0∞)) + (s := cubeSet R) (hs := measurableSet_cubeSet R) + (c := ((0, Pi.single i 1) : BlockVec d)) (Or.inr hR_ne_top) + +/-- Average over `R` of the upper component of the coefficient-operator image +of the selected doubled-`Mu` minimizer on `Q`. -/ +noncomputable def canonicalDoubledMuResponseUpperImageAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + cubeVolume Q * (cubeVolume R)⁻¹ * + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalUpperImageIndicatorTestStateCubeSet R i) + (canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a + +/-- Average over `R` of the lower component of the coefficient-operator image +of the selected doubled-`Mu` minimizer on `Q`. -/ +noncomputable def canonicalDoubledMuResponseLowerImageAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a i => + cubeVolume Q * (cubeVolume R)⁻¹ * + canonicalMuHilbertEnergyBilinFixedCubeSet Q (-p, q) + (canonicalLowerImageIndicatorTestStateCubeSet R i) + (canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i) a + +/-- Ch4 measurable representative of the raw scalar response-maximizer gradient +average over a descendant cube `R`. + +Mathematically this is `avg_R grad v(·, Q, p, q; a)`: it is extracted from the +selected doubled-`Mu` minimizer by adding its potential projection and the +lower coefficient-operator image. -/ +noncomputable def canonicalScalarResponseGradientAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a => + canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a + + canonicalDoubledMuResponseLowerImageAverageCubeSet Q R p q a + +/-- Ch4 measurable representative of the raw scalar response-maximizer flux +average over a descendant cube `R`. + +Mathematically this is `avg_R a grad v(·, Q, p, q; a)`: it is extracted from +the selected doubled-`Mu` minimizer by adding its flux projection and the upper +coefficient-operator image. -/ +noncomputable def canonicalScalarResponseFluxAverageCubeSet + {d : ℕ} (Q R : TriadicCube d) (p q : Vec d) : + CoeffField d → Vec d := + fun a => + canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a + + canonicalDoubledMuResponseUpperImageAverageCubeSet Q R p q a + +/-- Finite-depth weak norm of the raw scalar response-maximizer gradient +defect `grad v_m - p0`. -/ +noncomputable def canonicalScalarResponseGradientWeakNormPartialCubeSet + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q p0 : Vec d) : + CoeffField d → ℝ := + fun a => + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq (canonicalScalarResponseGradientAverageCubeSet Q R p q a - p0)) + +/-- Finite-depth weak norm of the raw scalar response-maximizer flux defect +`a grad v_m - q0`. -/ +noncomputable def canonicalScalarResponseFluxWeakNormPartialCubeSet + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (N : ℕ) (p q q0 : Vec d) : + CoeffField d → ℝ := + fun a => + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq (canonicalScalarResponseFluxAverageCubeSet Q R p q a - q0)) + +/-- Full weak norm of the raw scalar response-maximizer gradient defect. -/ +noncomputable def canonicalScalarResponseGradientWeakNormCubeSet + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + CoeffField d → ℝ := + fun a => ⨆ N : ℕ, canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a + +/-- Full weak norm of the raw scalar response-maximizer flux defect. -/ +noncomputable def canonicalScalarResponseFluxWeakNormCubeSet + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) : + CoeffField d → ℝ := + fun a => ⨆ N : ℕ, canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a + +private theorem isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn + {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : Book.Ch01.PotentialZeroTraceFieldOn U f) : + IsPotentialZeroTraceOn U f := by + rcases hf with ⟨_hmem, φ, hφ⟩ + exact IsPotentialZeroTraceOn.congr_ae hφ.symm φ.isPotentialZeroTraceOn + +private theorem isBlockMuAdmissible_openCubeSet_of_isDoubledMuAdmissible + {d : ℕ} {Q : TriadicCube d} {P0 : BlockVec d} {X : Ch02.DoubledField d} + (hX : Ch02.IsDoubledMuAdmissible (Ch02.cubeDomain Q) P0 X) : + IsBlockMuAdmissible (openCubeSet Q) P0 + ({ potential := X.potential, flux := X.flux } : BlockState d) := by + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [Ch02.cubeDomain_coe] using hX.1.1 + · simpa [Ch02.cubeDomain_coe] using + isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn hX.1 + · simpa [Ch02.cubeDomain_coe] using hX.2.1 + · simpa [Ch02.cubeDomain_coe] using! hX.2.2 + +/-- A pointwise Ch2 doubled-`Mu` minimizer on the open cube represents the +canonical Ch4 Hilbert minimizer selected on the corresponding half-open cube. + +This is the bridge from the pointwise variational theorem used by Ch2 +extraction to the measurable Hilbert minimizer used by Ch4. -/ +theorem exists_isBlockMuAdmissible_cubeSet_and_hilbert_eq_canonicalAEEMuHilbertMinimizer_of_isDoubledMuMinimizer + {d : ℕ} [NeZero d] (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P0 : BlockVec d) (aQ : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (haQ : aQ.toCoeffField = a.1) {X : Ch02.DoubledField d} + (hX : Ch02.IsDoubledMuMinimizer (Ch02.cubeDomain Q) aQ P0 X) : + ∃ hAdm : + IsBlockMuAdmissible (cubeSet Q) P0 + ({ potential := X.potential, flux := X.flux } : BlockState d), + toHilbertBlockL2OfBlockField (U := cubeSet Q) hAdm.memBlockL2_eval = + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P0 := by + classical + let Xold : BlockState d := { potential := X.potential, flux := X.flux } + have hOpen : IsBlockMuAdmissible (openCubeSet Q) P0 Xold := by + simpa [Xold] using + isBlockMuAdmissible_openCubeSet_of_isDoubledMuAdmissible (Q := Q) (P0 := P0) hX.1 + have hCube : IsBlockMuAdmissible (cubeSet Q) P0 Xold := + (isBlockMuAdmissible_cubeSet_triadicCube_iff_openCubeSet (Q := Q)).2 hOpen + refine ⟨hCube, ?_⟩ + let system : AEEMuOperatorSystemData (cubeSet Q) a.1 := + canonicalAEEMuOperatorSystemData Q k a + let H : MuHilbertRealization (cubeSet Q) a.1 := system.toMuHilbertRealization + let HX : HilbertBlockL2 (cubeSet Q) := + toHilbertBlockL2OfBlockField (U := cubeSet Q) hCube.memBlockL2_eval + have hEnergyOpen : + blockEnergyAverage (openCubeSet Q) a.1 Xold = + Mu (openCubeSet Q) P0 a.1 := by + calc + blockEnergyAverage (openCubeSet Q) a.1 Xold = + blockEnergyAverage (openCubeSet Q) aQ.toCoeffField Xold := by + simp [haQ] + _ = Ch02.doubledMuValue (Ch02.cubeDomain Q) aQ X := by + rfl + _ = Ch02.doubledMu (Ch02.cubeDomain Q) aQ P0 := + hX.doubledMuValue_eq_doubledMu + _ = Mu (openCubeSet Q) P0 aQ.toCoeffField := by + rw [Ch02.doubledMu_eq_Mu] + simp [Ch02.cubeDomain_coe] + _ = Mu (openCubeSet Q) P0 a.1 := by + simp [haQ] + have hEnergyCube : + blockEnergyAverage (cubeSet Q) a.1 Xold = + Mu (cubeSet Q) P0 a.1 := by + calc + blockEnergyAverage (cubeSet Q) a.1 Xold = + blockEnergyAverage (openCubeSet Q) a.1 Xold := + ScalarCanonicalMaximizer.volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube + Q (blockEnergyDensity a.1 Xold) + _ = Mu (openCubeSet Q) P0 a.1 := hEnergyOpen + _ = Mu (cubeSet Q) P0 a.1 := by + exact (Mu_cubeSet_eq_openCubeSet_of_triadicCube + (Q := Q) (P := P0) (a := a.1)).symm + have hcorr : + HX - H.constantField P0 ∈ H.correctionSpace.correctionSpace := by + have hsplit := hCube.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + rw [show HX = toHilbertBlockL2OfBlockField (U := cubeSet Q) hCube.memBlockL2_eval + from rfl, hsplit] + have hmem := hCube.toCorrectionFieldData_mem_correctionSpace + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + canonicalAEEMuOperatorSystemData, canonicalAEEMuCorrectionSpaceData, + canonicalAEEPotentialSolenoidalL2Data, MuCorrectionSpaceData.ofSubmoduleClosures, + sub_eq_add_neg, add_assoc, add_comm] using hmem + have hQuadEq : + quadraticEnergy H.energyBilin HX = + blockEnergyAverage (cubeSet Q) a.1 Xold := by + simpa [H, system, HX, Xold, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := Xold) hCube.memBlockL2_eval + have hQuadLe : quadraticEnergy H.energyBilin HX ≤ H.muCandidate P0 := by + exact le_of_eq <| by + calc + quadraticEnergy H.energyBilin HX = + blockEnergyAverage (cubeSet Q) a.1 Xold := hQuadEq + _ = Mu (cubeSet Q) P0 a.1 := hEnergyCube + _ = H.muCandidate P0 := by + simpa [H, system] using mu_eq_canonicalAEEMuCandidate Q k a P0 + have hEq : HX = H.minimizerMap P0 := + H.eq_minimizerMap_of_quadraticEnergy_le_muCandidate P0 HX hcorr hQuadLe + simpa [HX, H, system, Xold] using hEq + + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Measurability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Measurability.lean new file mode 100644 index 0000000000..15a4eccbc9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CanonicalSolutions/Measurability.lean @@ -0,0 +1,784 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMinimizerFamily + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions.AverageIdentities + +/-! # Measurability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open scoped ENNReal +open MeasureTheory + +/-! +# Canonical solution-field measurability (carrier re-aim, Packet P5f) + +This file re-aims the public Ch4 canonical doubled-`Mu` Hilbert-minimizer +measurability surface onto the honest carrier `RegCoeffField d`, mirroring the +`Mu` re-aim (`Theorems/Mu.lean`). The two per-slice primitives (minimizer strong +measurability and fixed-test energy pairing) are re-derived Ω-generically through +the `L²` realization in `Internal/AEESliceAssembly/CarrierMinimizerFamily.lean`. + +The selected minimizer/energy-pairing observables are totalized with the **least** +AEE quantitative slice index (else `0`), so a **genuine `liftCover`** over the +first-slice partition makes `a ↦ observable a.toFun` genuinely +`LocalSigmaR (cubeSet Q)`-measurable on the whole carrier (a genuine-where-null +strengthening: no a.e. bookkeeping is needed for these observables, unlike `Mu`). +The honest bridge `nullMeasurableSet_of_localSigmaR` then promotes it, and the +separable range of the slice-indexed minimizers upgrades to +`AEStronglyMeasurable`. +-/ + +namespace RestrictionLawCarrier + +private theorem aemeasurable_vecNormSq_sub_const + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {d : ℕ} {F : α → Vec d} (hF : AEMeasurable F μ) (v : Vec d) : + AEMeasurable (fun a : α => vecNormSq (F a - v)) μ := by + have hcoord : ∀ i : Fin d, AEMeasurable (fun a : α => F a i - v i) μ := by + intro i + exact ((aemeasurable_pi_iff.mp hF) i).sub aemeasurable_const + simpa [vecNormSq, vecDot] using + (Finset.univ.aemeasurable_fun_sum + (μ := μ) + (f := fun i a => (F a i - v i) * (F a i - v i)) + (fun i _hi => (hcoord i).mul (hcoord i))) + +/-- **The carrier selected minimizer is genuinely `LocalSigmaR (cubeSet Q)`- +measurable.** A genuine `liftCover` over the first-slice partition, whose pieces +are the carrier slice-minimizers of `CarrierMinimizerFamily`. -/ +private theorem measurable_canonicalMuHilbertMinimizerCubeSet_localSigmaR + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) : + @Measurable (RegCoeffField d) (HilbertBlockL2 (cubeSet Q)) + (LocalSigmaR (cubeSet Q)) (borel (HilbertBlockL2 (cubeSet Q))) + (fun a : RegCoeffField d => canonicalMuHilbertMinimizerCubeSet Q P0 a.toFun) := by + classical + let : MeasurableSpace (RegCoeffField d) := LocalSigmaR (cubeSet Q) + let : MeasurableSpace (HilbertBlockL2 (cubeSet Q)) := borel _ + have : BorelSpace (HilbertBlockL2 (cubeSet Q)) := ⟨rfl⟩ + let slice : ℕ → Set (RegCoeffField d) := + fun k => {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} + let firstSlice : ℕ → Set (RegCoeffField d) := + fun k => slice k ∩ ⋂ j ∈ Finset.range k, (slice j)ᶜ + let S : Set (RegCoeffField d) := ⋃ k : ℕ, firstSlice k + let cover : Option ℕ → Set (RegCoeffField d) + | none => Sᶜ + | some k => firstSlice k + let piece : (i : Option ℕ) → cover i → HilbertBlockL2 (cubeSet Q) + | none, _ => 0 + | some k, a => + ((canonicalAEEMuOperatorSystemData Q k ⟨(a.1).toFun, a.2.1⟩).toMuHilbertRealization).minimizerMap P0 + have hslice_meas : ∀ k : ℕ, MeasurableSet (slice k) := by + intro k + exact measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k + have hfirst_meas : ∀ k : ℕ, MeasurableSet (firstSlice k) := by + intro k + have hprev : MeasurableSet (⋂ j ∈ Finset.range k, (slice j)ᶜ) := + (Finset.range k).measurableSet_biInter fun j _hj => (hslice_meas j).compl + exact (hslice_meas k).inter hprev + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => exact (MeasurableSet.iUnion hfirst_meas).compl + | some k => exact hfirst_meas k + have hfirst_unique : + ∀ {i j : ℕ} {a : RegCoeffField d}, a ∈ firstSlice i → a ∈ firstSlice j → i = j := by + intro i j a hi hj + by_cases hij : i = j + · exact hij + rcases lt_or_gt_of_ne hij with hlt | hgt + · have hnot : a ∉ slice i := by + have hcompl : a ∈ (slice i)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hj.2 i) (by simpa using hlt)) + simpa using hcompl + exact False.elim (hnot hi.1) + · have hnot : a ∉ slice j := by + have hcompl : a ∈ (slice j)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hi.2 j) (by simpa using hgt)) + simpa using hcompl + exact False.elim (hnot hj.1) + have hagree : + ∀ (i j : Option ℕ) (a : RegCoeffField d) + (hai : a ∈ cover i) (haj : a ∈ cover j), + piece i ⟨a, hai⟩ = piece j ⟨a, haj⟩ := by + intro i j a hai haj + cases i with + | none => + cases j with + | none => rfl + | some k => + exfalso + have haS : a ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using haj⟩ + have hnotS : a ∉ S := by simpa [cover] using hai + exact hnotS haS + | some i => + cases j with + | none => + exfalso + have haS : a ∈ S := Set.mem_iUnion.mpr ⟨i, by simpa [cover] using hai⟩ + have hnotS : a ∉ S := by simpa [cover] using haj + exact hnotS haS + | some j => + have hij : i = j := hfirst_unique (by simpa [cover] using hai) (by simpa [cover] using haj) + subst j + rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext a + constructor + · intro _ha + exact Set.mem_univ a + · intro _ha + by_cases haS : a ∈ S + · rcases Set.mem_iUnion.mp haS with ⟨k, hak⟩ + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hak⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using haS⟩ + have hpiece_meas : ∀ i : Option ℕ, Measurable (piece i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hEntry : + ∀ (i' j' : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (cover (some k)) ℝ _ _ + (fun x => entryTestR i' j' φ (x : RegCoeffField d)) := by + intro i' j' φ hφ_cont hφ_compact hφ_support + have hφ_probe : IsProbeR φ := IsProbeR.of_smooth hφ_cont hφ_compact + have hφ_support' : Function.support φ ⊆ cubeSet Q := + (Function.support_subset_iff.2 fun x hx => subset_tsupport φ hx).trans hφ_support + exact (measurable_entryTestR_localSigmaR i' j' hφ_probe hφ_support').comp + measurable_subtype_coe + have hsm := + stronglyMeasurable_canonicalMinimizer_carrier + (mΩ := (inferInstance : MeasurableSpace (cover (some k)))) Q + (A := fun x : cover (some k) => (x : RegCoeffField d)) + (fun x => x.2.1) hEntry P0 + exact hsm.measurable + have hLift : Measurable (Set.liftCover cover piece hagree hcover) := + measurable_liftCover cover hcover_meas piece hpiece_meas hagree hcover + have hEq : + Set.liftCover cover piece hagree hcover = + fun a : RegCoeffField d => canonicalMuHilbertMinimizerCubeSet Q P0 a.toFun := by + funext a + by_cases ha : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun + · let k : ℕ := Nat.find ha + have hafirst : a ∈ firstSlice k := by + refine ⟨?_, ?_⟩ + · simpa [slice, k] using Nat.find_spec ha + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k := by simpa [k] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.toFun := by + intro hja + exact (not_lt_of_ge (Nat.find_min' ha hja)) (by simpa [k] using hjlt) + simpa [slice] using hnot + rw [Set.liftCover_of_mem + (S := cover) (f := piece) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hafirst)] + simp only [piece, cover, canonicalMuHilbertMinimizerCubeSet, ha, k, dif_pos] + · have ha_notS : a ∉ S := by + intro haS + rcases Set.mem_iUnion.mp haS with ⟨k, hafirst⟩ + exact ha ⟨k, hafirst.1⟩ + rw [Set.liftCover_of_mem + (S := cover) (f := piece) (hf := hagree) (hS := hcover) (i := none) + (by simpa [cover] using ha_notS)] + simp [canonicalMuHilbertMinimizerCubeSet, ha, piece, cover] + simpa [hEq] using hLift + +/-- **The carrier fixed-test energy pairing is genuinely `LocalSigmaR`- +measurable.** -/ +private theorem measurable_canonicalMuHilbertEnergyBilinFixedCubeSet_localSigmaR + {d : ℕ} (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + @Measurable (RegCoeffField d) ℝ + (LocalSigmaR (cubeSet Q)) (borel ℝ) + (fun a : RegCoeffField d => canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.toFun) := by + classical + let : MeasurableSpace (RegCoeffField d) := LocalSigmaR (cubeSet Q) + let slice : ℕ → Set (RegCoeffField d) := + fun k => {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} + let firstSlice : ℕ → Set (RegCoeffField d) := + fun k => slice k ∩ ⋂ j ∈ Finset.range k, (slice j)ᶜ + let S : Set (RegCoeffField d) := ⋃ k : ℕ, firstSlice k + let cover : Option ℕ → Set (RegCoeffField d) + | none => Sᶜ + | some k => firstSlice k + let piece : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some k, a => + ((canonicalAEEMuOperatorSystemData Q k ⟨(a.1).toFun, a.2.1⟩).toMuHilbertRealization).energyBilin + (toHilbertBlockL2OfBlockField (U := cubeSet Q) hY) + (((canonicalAEEMuOperatorSystemData Q k ⟨(a.1).toFun, a.2.1⟩).toMuHilbertRealization).minimizerMap P0) + have hslice_meas : ∀ k : ℕ, MeasurableSet (slice k) := by + intro k + exact measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k + have hfirst_meas : ∀ k : ℕ, MeasurableSet (firstSlice k) := by + intro k + have hprev : MeasurableSet (⋂ j ∈ Finset.range k, (slice j)ᶜ) := + (Finset.range k).measurableSet_biInter fun j _hj => (hslice_meas j).compl + exact (hslice_meas k).inter hprev + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => exact (MeasurableSet.iUnion hfirst_meas).compl + | some k => exact hfirst_meas k + have hfirst_unique : + ∀ {i j : ℕ} {a : RegCoeffField d}, a ∈ firstSlice i → a ∈ firstSlice j → i = j := by + intro i j a hi hj + by_cases hij : i = j + · exact hij + rcases lt_or_gt_of_ne hij with hlt | hgt + · have hnot : a ∉ slice i := by + have hcompl : a ∈ (slice i)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hj.2 i) (by simpa using hlt)) + simpa using hcompl + exact False.elim (hnot hi.1) + · have hnot : a ∉ slice j := by + have hcompl : a ∈ (slice j)ᶜ := by + simpa using + (Set.mem_iInter.mp (Set.mem_iInter.mp hi.2 j) (by simpa using hgt)) + simpa using hcompl + exact False.elim (hnot hj.1) + have hagree : + ∀ (i j : Option ℕ) (a : RegCoeffField d) + (hai : a ∈ cover i) (haj : a ∈ cover j), + piece i ⟨a, hai⟩ = piece j ⟨a, haj⟩ := by + intro i j a hai haj + cases i with + | none => + cases j with + | none => rfl + | some k => + exfalso + have haS : a ∈ S := Set.mem_iUnion.mpr ⟨k, by simpa [cover] using haj⟩ + have hnotS : a ∉ S := by simpa [cover] using hai + exact hnotS haS + | some i => + cases j with + | none => + exfalso + have haS : a ∈ S := Set.mem_iUnion.mpr ⟨i, by simpa [cover] using hai⟩ + have hnotS : a ∉ S := by simpa [cover] using haj + exact hnotS haS + | some j => + have hij : i = j := hfirst_unique (by simpa [cover] using hai) (by simpa [cover] using haj) + subst j + rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext a + constructor + · intro _ha + exact Set.mem_univ a + · intro _ha + by_cases haS : a ∈ S + · rcases Set.mem_iUnion.mp haS with ⟨k, hak⟩ + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hak⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using haS⟩ + have hpiece_meas : ∀ i : Option ℕ, Measurable (piece i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hEntry : + ∀ (i' j' : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (cover (some k)) ℝ _ _ + (fun x => entryTestR i' j' φ (x : RegCoeffField d)) := by + intro i' j' φ hφ_cont hφ_compact hφ_support + have hφ_probe : IsProbeR φ := IsProbeR.of_smooth hφ_cont hφ_compact + have hφ_support' : Function.support φ ⊆ cubeSet Q := + (Function.support_subset_iff.2 fun x hx => subset_tsupport φ hx).trans hφ_support + exact (measurable_entryTestR_localSigmaR i' j' hφ_probe hφ_support').comp + measurable_subtype_coe + exact + measurable_energyBilin_fixed_canonicalMinimizer_carrier + (mΩ := (inferInstance : MeasurableSpace (cover (some k)))) Q + (A := fun x : cover (some k) => (x : RegCoeffField d)) + (fun x => x.2.1) hEntry P0 Y hY + have hLift : Measurable (Set.liftCover cover piece hagree hcover) := + measurable_liftCover cover hcover_meas piece hpiece_meas hagree hcover + have hEq : + Set.liftCover cover piece hagree hcover = + fun a : RegCoeffField d => canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.toFun := by + funext a + by_cases ha : ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun + · let k : ℕ := Nat.find ha + have hafirst : a ∈ firstSlice k := by + refine ⟨?_, ?_⟩ + · simpa [slice, k] using Nat.find_spec ha + · refine Set.mem_iInter.mpr ?_ + intro j + refine Set.mem_iInter.mpr ?_ + intro hj + have hjlt : j < k := by simpa [k] using hj + have hnot : ¬ AEEQuantitativeEllipticSlice (cubeSet Q) j a.toFun := by + intro hja + exact (not_lt_of_ge (Nat.find_min' ha hja)) (by simpa [k] using hjlt) + simpa [slice] using hnot + rw [Set.liftCover_of_mem + (S := cover) (f := piece) (hf := hagree) (hS := hcover) (i := some k) + (by simpa [cover] using hafirst)] + simp [canonicalMuHilbertEnergyBilinFixedCubeSet, ha, k, piece, cover] + · have ha_notS : a ∉ S := by + intro haS + rcases Set.mem_iUnion.mp haS with ⟨k, hafirst⟩ + exact ha ⟨k, hafirst.1⟩ + rw [Set.liftCover_of_mem + (S := cover) (f := piece) (hf := hagree) (hS := hcover) (i := none) + (by simpa [cover] using ha_notS)] + simp [canonicalMuHilbertEnergyBilinFixedCubeSet, ha, piece, cover] + simpa [hEq] using hLift + +/-- Public Ch4 law-facing measurability of the selected canonical doubled-`Mu` +Hilbert minimizer on a deterministic cube (carrier re-type). -/ +theorem aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertMinimizerCubeSet Q P0 a.toFun) P := by + classical + let U : Set (Vec d) := cubeSet Q + let : MeasurableSpace (HilbertBlockL2 U) := borel _ + have : BorelSpace (HilbertBlockL2 U) := ⟨rfl⟩ + let f : RegCoeffField d → HilbertBlockL2 U := + fun a => canonicalMuHilbertMinimizerCubeSet Q P0 a.toFun + have hLocalMeas : + @Measurable (RegCoeffField d) (HilbertBlockL2 U) + (LocalSigmaR U) (borel (HilbertBlockL2 U)) f := + measurable_canonicalMuHilbertMinimizerCubeSet_localSigmaR Q P0 + have hNull : NullMeasurable f P := by + intro s hs + exact nullMeasurableSet_of_localSigmaR P (hLocalMeas hs) + let sliceRange : ℕ → Set (HilbertBlockL2 U) := fun k => + Set.range fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P0 + let sepSet : Set (HilbertBlockL2 U) := + ({0} : Set (HilbertBlockL2 U)) ∪ ⋃ k : ℕ, sliceRange k + have hSep : TopologicalSpace.IsSeparable sepSet := by + have hSlices : TopologicalSpace.IsSeparable (⋃ k : ℕ, sliceRange k) := by + refine .iUnion ?_ + intro k + let : MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + AEEQuantitativeEllipticSlice.localMeasurableSpace U k + have hslice : StronglyMeasurable + (fun a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} => + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).minimizerMap P0) := by + simpa [U] using + Homogenization.stronglyMeasurable_canonicalAEEMuHilbertMinimizer_aeeQuantitativeSlice_cubeSet + (Q := Q) (k := k) P0 + simpa [sliceRange] using hslice.isSeparable_range + exact (Set.finite_singleton (0 : HilbertBlockL2 U)).isSeparable.union hSlices + have hMemSep : ∀ᵐ a ∂P, f a ∈ sepSet := by + refine Filter.Eventually.of_forall ?_ + intro a + by_cases ha : ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a.toFun + · let k : ℕ := Nat.find ha + have hslice : AEEQuantitativeEllipticSlice U k a.toFun := by + simpa [k] using Nat.find_spec ha + right + refine Set.mem_iUnion.mpr ⟨k, ⟨⟨a.toFun, hslice⟩, ?_⟩⟩ + simp only [f, canonicalMuHilbertMinimizerCubeSet, U, ha, k, dif_pos] + · left + simp only [f, canonicalMuHilbertMinimizerCubeSet, U, ha, dif_neg, not_false_eq_true, + Set.mem_singleton_iff] + exact (aestronglyMeasurable_iff_nullMeasurable_separable).2 + ⟨hNull, ⟨sepSet, hSep, hMemSep⟩⟩ + +/-- Law-facing strong measurability of the potential component of the selected +doubled-`Mu` Hilbert minimizer. -/ +theorem aestronglyMeasurable_canonicalMuHilbertPotential_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertPotentialCubeSet Q P0 a.toFun) P := by + have hmin := hP.aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet Q P0 + simpa [canonicalMuHilbertPotentialCubeSet] using + (hilbertBlockL2PotentialCLM (d := d) (U := cubeSet Q)).continuous.comp_aestronglyMeasurable hmin + +/-- Law-facing strong measurability of the flux component of the selected +doubled-`Mu` Hilbert minimizer. -/ +theorem aestronglyMeasurable_canonicalMuHilbertFlux_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertFluxCubeSet Q P0 a.toFun) P := by + have hmin := hP.aestronglyMeasurable_canonicalMuHilbertMinimizer_cubeSet Q P0 + simpa [canonicalMuHilbertFluxCubeSet] using + (hilbertBlockL2FluxCLM (d := d) (U := cubeSet Q)).continuous.comp_aestronglyMeasurable hmin + +/-- Law-facing a.e.-measurability of the potential component of the selected +doubled-`Mu` Hilbert minimizer. -/ +theorem aemeasurable_canonicalMuHilbertPotential_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertPotentialCubeSet Q P0 a.toFun) P := + (hP.aestronglyMeasurable_canonicalMuHilbertPotential_cubeSet Q P0).aemeasurable + +/-- Law-facing a.e.-measurability of the flux component of the selected +doubled-`Mu` Hilbert minimizer. -/ +theorem aemeasurable_canonicalMuHilbertFlux_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertFluxCubeSet Q P0 a.toFun) P := + (hP.aestronglyMeasurable_canonicalMuHilbertFlux_cubeSet Q P0).aemeasurable + +/-- Law-facing strong measurability of the selected doubled-`Mu` potential field. -/ +theorem aestronglyMeasurable_canonicalDoubledMuResponsePotentialField_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a.toFun) P := by + simpa [canonicalDoubledMuResponsePotentialFieldCubeSet] using + hP.aestronglyMeasurable_canonicalMuHilbertPotential_cubeSet Q (-p, q) + +/-- Law-facing strong measurability of the selected doubled-`Mu` flux field. -/ +theorem aestronglyMeasurable_canonicalDoubledMuResponseFluxField_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponseFluxFieldCubeSet Q p q a.toFun) P := by + simpa [canonicalDoubledMuResponseFluxFieldCubeSet] using + hP.aestronglyMeasurable_canonicalMuHilbertFlux_cubeSet Q (-p, q) + +/-- Law-facing a.e.-measurability of the selected doubled-`Mu` potential field. -/ +theorem aemeasurable_canonicalDoubledMuResponsePotentialField_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a.toFun) P := + (hP.aestronglyMeasurable_canonicalDoubledMuResponsePotentialField_cubeSet Q p q).aemeasurable + +/-- Law-facing a.e.-measurability of the selected doubled-`Mu` flux field. -/ +theorem aemeasurable_canonicalDoubledMuResponseFluxField_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponseFluxFieldCubeSet Q p q a.toFun) P := + (hP.aestronglyMeasurable_canonicalDoubledMuResponseFluxField_cubeSet Q p q).aemeasurable + +/-- Law-facing measurability of selected doubled-`Mu` potential averages over a +deterministic subcube. -/ +theorem aemeasurable_canonicalDoubledMuResponsePotentialFieldAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + let ℓ : HilbertVectorL2 (cubeSet Q) →L[ℝ] ℝ := + (cubeVolume R)⁻¹ • + hilbertVectorL2CoordSetIntegralCLM (U := cubeSet Q) + (cubeSet R) (measurableSet_cubeSet R) i + have hfield := hP.aestronglyMeasurable_canonicalDoubledMuResponsePotentialField_cubeSet Q p q + have hℓ : AEMeasurable + (fun a : RegCoeffField d => + ℓ (canonicalDoubledMuResponsePotentialFieldCubeSet Q p q a.toFun)) P := + (ℓ.continuous.comp_aestronglyMeasurable hfield).aemeasurable + simpa [canonicalDoubledMuResponsePotentialFieldAverageCubeSet, ℓ, smul_eq_mul] using hℓ + +/-- Law-facing measurability of selected doubled-`Mu` flux averages over a +deterministic subcube. -/ +theorem aemeasurable_canonicalDoubledMuResponseFluxFieldAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + let ℓ : HilbertVectorL2 (cubeSet Q) →L[ℝ] ℝ := + (cubeVolume R)⁻¹ • + hilbertVectorL2CoordSetIntegralCLM (U := cubeSet Q) + (cubeSet R) (measurableSet_cubeSet R) i + have hfield := hP.aestronglyMeasurable_canonicalDoubledMuResponseFluxField_cubeSet Q p q + have hℓ : AEMeasurable + (fun a : RegCoeffField d => + ℓ (canonicalDoubledMuResponseFluxFieldCubeSet Q p q a.toFun)) P := + (ℓ.continuous.comp_aestronglyMeasurable hfield).aemeasurable + simpa [canonicalDoubledMuResponseFluxFieldAverageCubeSet, ℓ, smul_eq_mul] using hℓ + +/-- Law-facing measurability of finite descendant averages of selected +response-gradient averages. -/ +theorem aemeasurable_descendantsAverageCanonicalDoubledMuResponsePotentialFieldAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageCanonicalDoubledMuResponsePotentialFieldAverageCubeSet Q j p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + exact + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a.toFun i) + (fun R _hR => + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponsePotentialFieldAverage_cubeSet Q R p q)) i) + +/-- Law-facing measurability of finite descendant averages of selected +response-flux averages. -/ +theorem aemeasurable_descendantsAverageCanonicalDoubledMuResponseFluxFieldAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageCanonicalDoubledMuResponseFluxFieldAverageCubeSet Q j p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + exact + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a.toFun i) + (fun R _hR => + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponseFluxFieldAverage_cubeSet Q R p q)) i) + +/-- Law-facing measurability of finite-depth selected response-gradient weak +norms. -/ +theorem aemeasurable_canonicalDoubledMuResponsePotentialWeakNormPartial_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q p0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponsePotentialWeakNormPartialCubeSet Q s N p q p0 a.toFun) P := by + simp only [canonicalDoubledMuResponsePotentialWeakNormPartialCubeSet] + exact + Finset.aemeasurable_fun_sum (Finset.range (N + 1)) fun j _hj => + (aemeasurable_const.mul <| + (aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => + vecNormSq (canonicalDoubledMuResponsePotentialFieldAverageCubeSet Q R p q a.toFun - p0)) + (fun R _hR => + aemeasurable_vecNormSq_sub_const + (hP.aemeasurable_canonicalDoubledMuResponsePotentialFieldAverage_cubeSet Q R p q) p0)).sqrt) + +/-- Law-facing measurability of finite-depth selected response-flux weak +norms. -/ +theorem aemeasurable_canonicalDoubledMuResponseFluxWeakNormPartial_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (t : ℝ) (N : ℕ) (p q q0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun) P := by + simp only [canonicalDoubledMuResponseFluxWeakNormPartialCubeSet] + exact + Finset.aemeasurable_fun_sum (Finset.range (N + 1)) fun j _hj => + (aemeasurable_const.mul <| + (aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => + vecNormSq (canonicalDoubledMuResponseFluxFieldAverageCubeSet Q R p q a.toFun - q0)) + (fun R _hR => + aemeasurable_vecNormSq_sub_const + (hP.aemeasurable_canonicalDoubledMuResponseFluxFieldAverage_cubeSet Q R p q) q0)).sqrt) + +/-- Law-facing measurability of the selected doubled-`Mu` potential weak norm. -/ +theorem aemeasurable_canonicalDoubledMuResponsePotentialWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponsePotentialWeakNormCubeSet Q s p q p0 a.toFun) P := by + simpa [canonicalDoubledMuResponsePotentialWeakNormCubeSet] using + (AEMeasurable.iSup fun N => + hP.aemeasurable_canonicalDoubledMuResponsePotentialWeakNormPartial_cubeSet Q s N p q p0) + +/-- Law-facing measurability of the selected doubled-`Mu` flux weak norm. -/ +theorem aemeasurable_canonicalDoubledMuResponseFluxWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalDoubledMuResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) P := by + simpa [canonicalDoubledMuResponseFluxWeakNormCubeSet] using + (AEMeasurable.iSup fun N => + hP.aemeasurable_canonicalDoubledMuResponseFluxWeakNormPartial_cubeSet Q t N p q q0) + +/-- Law-facing measurability of a fixed-test Hilbert energy pairing against +the selected canonical doubled-`Mu` minimizer. This is the public Ch4 source for +raw scalar-response operator-image averages. -/ +theorem aemeasurable_canonicalMuHilbertEnergyBilinFixed_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) + (Y : BlockState d) (hY : MemBlockL2 (cubeSet Q) Y.eval) : + AEMeasurable + (fun a : RegCoeffField d => canonicalMuHilbertEnergyBilinFixedCubeSet Q P0 Y hY a.toFun) P := by + refine NullMeasurable.aemeasurable ?_ + intro s hs + exact nullMeasurableSet_of_localSigmaR P + (measurable_canonicalMuHilbertEnergyBilinFixedCubeSet_localSigmaR Q P0 Y hY hs) + +/-- Law-facing measurability of the upper coefficient-operator image averages +of the selected doubled-`Mu` response minimizer. -/ +theorem aemeasurable_canonicalDoubledMuResponseUpperImageAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponseUpperImageAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + have hpair := + hP.aemeasurable_canonicalMuHilbertEnergyBilinFixed_cubeSet Q (-p, q) + (canonicalUpperImageIndicatorTestStateCubeSet R i) + (canonicalUpperImageIndicatorTestStateCubeSet_memBlockL2 Q R i) + simpa [canonicalDoubledMuResponseUpperImageAverageCubeSet, mul_assoc] using + hpair.const_mul (cubeVolume Q * (cubeVolume R)⁻¹) + +/-- Law-facing measurability of the lower coefficient-operator image averages +of the selected doubled-`Mu` response minimizer. -/ +theorem aemeasurable_canonicalDoubledMuResponseLowerImageAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalDoubledMuResponseLowerImageAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + have hpair := + hP.aemeasurable_canonicalMuHilbertEnergyBilinFixed_cubeSet Q (-p, q) + (canonicalLowerImageIndicatorTestStateCubeSet R i) + (canonicalLowerImageIndicatorTestStateCubeSet_memBlockL2 Q R i) + simpa [canonicalDoubledMuResponseLowerImageAverageCubeSet, mul_assoc] using + hpair.const_mul (cubeVolume Q * (cubeVolume R)⁻¹) + +/-- Law-facing measurability of raw scalar response-gradient averages +`avg_R grad v_m`. -/ +theorem aemeasurable_canonicalScalarResponseGradientAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + have hPot := + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponsePotentialFieldAverage_cubeSet Q R p q)) i + have hLower := + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponseLowerImageAverage_cubeSet Q R p q)) i + simpa [canonicalScalarResponseGradientAverageCubeSet, Pi.add_apply] using! hPot.add hLower + +/-- Law-facing measurability of raw scalar response-flux averages +`avg_R a grad v_m`. -/ +theorem aemeasurable_canonicalScalarResponseFluxAverage_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q R : TriadicCube d) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun) P := by + rw [aemeasurable_pi_iff] + intro i + have hFlux := + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponseFluxFieldAverage_cubeSet Q R p q)) i + have hUpper := + (aemeasurable_pi_iff.mp + (hP.aemeasurable_canonicalDoubledMuResponseUpperImageAverage_cubeSet Q R p q)) i + simpa [canonicalScalarResponseFluxAverageCubeSet, Pi.add_apply] using! hFlux.add hUpper + +/-- Law-facing measurability of finite-depth raw scalar response-gradient weak +norms. -/ +theorem aemeasurable_canonicalScalarResponseGradientWeakNormPartial_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q p0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun) P := by + simp only [canonicalScalarResponseGradientWeakNormPartialCubeSet] + exact + Finset.aemeasurable_fun_sum (Finset.range (N + 1)) fun j _hj => + (aemeasurable_const.mul <| + (aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => + vecNormSq (canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - p0)) + (fun R _hR => + aemeasurable_vecNormSq_sub_const + (hP.aemeasurable_canonicalScalarResponseGradientAverage_cubeSet Q R p q) p0)).sqrt) + +/-- Law-facing measurability of finite-depth raw scalar response-flux weak +norms. -/ +theorem aemeasurable_canonicalScalarResponseFluxWeakNormPartial_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (t : ℝ) (N : ℕ) (p q q0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun) P := by + simp only [canonicalScalarResponseFluxWeakNormPartialCubeSet] + exact + Finset.aemeasurable_fun_sum (Finset.range (N + 1)) fun j _hj => + (aemeasurable_const.mul <| + (aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => + vecNormSq (canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - q0)) + (fun R _hR => + aemeasurable_vecNormSq_sub_const + (hP.aemeasurable_canonicalScalarResponseFluxAverage_cubeSet Q R p q) q0)).sqrt) + +/-- Law-facing measurability of the full raw scalar response-gradient weak +norm. -/ +theorem aemeasurable_canonicalScalarResponseGradientWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) P := by + simpa [canonicalScalarResponseGradientWeakNormCubeSet] using + (AEMeasurable.iSup fun N => + hP.aemeasurable_canonicalScalarResponseGradientWeakNormPartial_cubeSet Q s N p q p0) + +/-- Law-facing measurability of the full raw scalar response-flux weak norm. -/ +theorem aemeasurable_canonicalScalarResponseFluxWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) P := by + simpa [canonicalScalarResponseFluxWeakNormCubeSet] using + (AEMeasurable.iSup fun N => + hP.aemeasurable_canonicalScalarResponseFluxWeakNormPartial_cubeSet Q t N p q q0) + +/-- Law-facing strong measurability of the full raw scalar response-gradient +weak norm. -/ +theorem aestronglyMeasurable_canonicalScalarResponseGradientWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) P := + (hP.aemeasurable_canonicalScalarResponseGradientWeakNorm_cubeSet Q s p q p0).aestronglyMeasurable + +/-- Law-facing strong measurability of the full raw scalar response-flux weak +norm. -/ +theorem aestronglyMeasurable_canonicalScalarResponseFluxWeakNorm_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) P := + (hP.aemeasurable_canonicalScalarResponseFluxWeakNorm_cubeSet Q t p q q0).aestronglyMeasurable + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CoarseObservables.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CoarseObservables.lean new file mode 100644 index 0000000000..8f5bf781ab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/CoarseObservables.lean @@ -0,0 +1,625 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DeterministicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.CoeffFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Mu +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.CoarseObservableMeasurability.Basic + +/-! # Coarse Observables -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Coarse-observable measurability from `Mu` + +This file is the public Chapter 4 handoff for the finite algebraic +consequences of `RestrictionLawCarrier.aemeasurable_Mu_cubeSet`. + +The surface is deliberately law-facing and definition-facing: downstream code +gets measurability of `Mu`, the coarse block matrices, and response/block +quantities through manuscript identities. There are no provider structures and +no section-local wrapper tracks here. +-/ + +/-- Finite descendant averages preserve a.e.-measurability. -/ +theorem aemeasurable_descendantsAverage + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} + {F : TriadicCube d → RegCoeffField d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → AEMeasurable (F R) P) : + AEMeasurable + (fun a : RegCoeffField d => descendantsAverage Q j (fun R => F R a)) P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : AEMeasurable (fun a : RegCoeffField d => D.sum (fun R => F R a)) P := by + simpa using + (D.aemeasurable_fun_sum (μ := P) (f := fun R => F R) + (fun R hR => hF R (by simpa [D] using hR))) + simpa [descendantsAverage, D] using hsum.const_mul ((D.card : ℝ)⁻¹) + +namespace RestrictionLawCarrier + +/-- A locally a.e.-elliptic field has a deterministic coarse block matrix on +each triadic open cube, with the a.e. coefficient representative handled by the +Chapter 2 doubled-`Mu` theory. -/ +theorem exists_coarseBlockMatrix_openCubeSet_of_aelocallyUniformlyEllipticField + {d : ℕ} {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet Q) a.toFun Abar := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let aQ : Ch02.CoeffOn U := coeffOnOfAEEllipticOn a Q (ha Q) + refine ⟨Ch02.coarseBlockMatrix U aQ, ?_⟩ + refine ⟨Ch02.isSymmetricBlockMat_coarseBlockMatrix U aQ, ?_⟩ + intro P + calc + Mu (openCubeSet Q) P a.toFun + = Mu (U : Set (Vec d)) P aQ.toCoeffField := by + simp [U, aQ, Ch02.cubeDomain_coe] + _ = Ch02.doubledMu U aQ P := by + exact (Homogenization.Internal.Ch02.BookCh02.book_doubledMu_eq_Mu U aQ P).symm + _ = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (Ch02.coarseBlockMatrix U aQ) P) := + (Ch02.doubledMuTheory U aQ).doubledMu_eq_coarseBlockMatrix P + +/-- The public cube-set coarse block matrix agrees with the Chapter 2 +coarse block matrix built from the canonical a.e.-elliptic coefficient +representative on the cube. -/ +theorem coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) := by + let U : Ch02.Domain d := Ch02.cubeDomain Q + let aQ : Ch02.CoeffOn U := + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q + have hIso : + IsCoarseBlockMatrix (openCubeSet Q) a.toFun + (Ch02.coarseBlockMatrix U aQ) := by + refine ⟨Ch02.isSymmetricBlockMat_coarseBlockMatrix U aQ, ?_⟩ + intro P + calc + Mu (openCubeSet Q) P a.toFun + = Mu (U : Set (Vec d)) P aQ.toCoeffField := by + simp [U, aQ, Ch02.cubeDomain_coe, + triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField] + _ = Ch02.doubledMu U aQ P := by + exact (Homogenization.Internal.Ch02.BookCh02.book_doubledMu_eq_Mu U aQ P).symm + _ = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (Ch02.coarseBlockMatrix U aQ) P) := + (Ch02.doubledMuTheory U aQ).doubledMu_eq_coarseBlockMatrix P + calc + coarseBlockMatrix (cubeSet Q) a.toFun = coarseBlockMatrix (openCubeSet Q) a.toFun := + coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a.toFun + _ = Ch02.coarseBlockMatrix U aQ := + (eq_coarseBlockMatrix_of_isCoarseBlockMatrix hIso).symm + +/-- A law carrier almost surely supplies deterministic coarse block matrix +existence on every fixed triadic open cube. -/ +theorem ae_exists_coarseBlockMatrix_openCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) (Q : TriadicCube d) : + ∀ᵐ a ∂P, ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet Q) a.toFun Abar := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + exact exists_coarseBlockMatrix_openCubeSet_of_aelocallyUniformlyEllipticField ha Q + +/-- Origin-cube specialization of +`RestrictionLawCarrier.ae_exists_coarseBlockMatrix_openCubeSet`. -/ +theorem ae_exists_coarseBlockMatrix_openCubeSet_originCube + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) (n : ℤ) : + ∀ᵐ a ∂P, + ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a.toFun Abar := + hP.ae_exists_coarseBlockMatrix_openCubeSet (originCube d n) + +/-- The lower-right coarse entry `σ_*⁻¹(U; a)ᵢⱼ` is a.e.-measurable on a +deterministic triadic cube. -/ +theorem aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j) P := by + by_cases hij : i = j + · subst j + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i) = + (fun a : RegCoeffField d => (2 : ℝ) * Mu (cubeSet Q) (0, Pi.single i 1) a.toFun) := by + funext a + simp [coarseBlockMatrix_lowerRight_apply] + rw [hEq] + exact (hP.aemeasurable_Mu_cubeSet Q (0, Pi.single i 1)).const_mul (2 : ℝ) + · have hsum : + AEMeasurable + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((0, Pi.single i 1) + (0, Pi.single j 1)) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q ((0, Pi.single i 1) + (0, Pi.single j 1)) + have hi : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (0, Pi.single i 1) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (0, Pi.single i 1) + have hj : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (0, Pi.single j 1) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (0, Pi.single j 1) + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j) = + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((0, Pi.single i 1) + (0, Pi.single j 1)) a.toFun + - Mu (cubeSet Q) (0, Pi.single i 1) a.toFun + - Mu (cubeSet Q) (0, Pi.single j 1) a.toFun) := by + funext a + simp [coarseBlockMatrix_lowerRight_apply, hij] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The upper-left coarse entry `b(U; a)ᵢⱼ` is a.e.-measurable on a +deterministic triadic cube. -/ +theorem aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j) P := by + by_cases hij : i = j + · subst j + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i) = + (fun a : RegCoeffField d => (2 : ℝ) * Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun) := by + funext a + simp [coarseBlockMatrix_upperLeft_apply] + rw [hEq] + exact (hP.aemeasurable_Mu_cubeSet Q (Pi.single i 1, 0)).const_mul (2 : ℝ) + · have hsum : + AEMeasurable + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q ((Pi.single i 1, 0) + (Pi.single j 1, 0)) + have hi : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (Pi.single i 1, 0) + have hj : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (Pi.single j 1, 0) + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j) = + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a.toFun + - Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun + - Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun) := by + funext a + simp [coarseBlockMatrix_upperLeft_apply, hij] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- Law-relative local-test representative for an upper-left coarse block +entry on a fixed triadic cube. The representative is constructed from the +canonical `Mu` representatives and agrees a.e. with the raw coarse entry. -/ +theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j) + =ᵐ[P] Y := by + by_cases hij : i = j + · subst j + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single i 1, 0) with ⟨Y, hY_local, hY_eq⟩ + refine ⟨fun a => (2 : ℝ) * Y a, measurable_const.mul hY_local, ?_⟩ + filter_upwards [hY_eq] with a ha + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i i = + (2 : ℝ) * Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun := by + simp [coarseBlockMatrix_upperLeft_apply] + _ = (2 : ℝ) * Y a := by rw [ha] + · rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((Pi.single i 1, 0) + (Pi.single j 1, 0)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single i 1, 0) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single j 1, 0) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j = + Mu (cubeSet Q) ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a.toFun - + Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun - + Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun := by + simp [coarseBlockMatrix_upperLeft_apply, hij] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +/-- Law-relative local-test representative for a lower-right coarse block +entry on a fixed triadic cube. The representative is constructed from the +canonical `Mu` representatives and agrees a.e. with the raw coarse entry. -/ +theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j) + =ᵐ[P] Y := by + by_cases hij : i = j + · subst j + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single i 1) with ⟨Y, hY_local, hY_eq⟩ + refine ⟨fun a => (2 : ℝ) * Y a, measurable_const.mul hY_local, ?_⟩ + filter_upwards [hY_eq] with a ha + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i i = + (2 : ℝ) * Mu (cubeSet Q) (0, Pi.single i 1) a.toFun := by + simp [coarseBlockMatrix_lowerRight_apply] + _ = (2 : ℝ) * Y a := by rw [ha] + · rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((0, Pi.single i 1) + (0, Pi.single j 1)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single i 1) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single j 1) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j = + Mu (cubeSet Q) ((0, Pi.single i 1) + (0, Pi.single j 1)) a.toFun - + Mu (cubeSet Q) (0, Pi.single i 1) a.toFun - + Mu (cubeSet Q) (0, Pi.single j 1) a.toFun := by + simp [coarseBlockMatrix_lowerRight_apply, hij] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +/-- The upper-right mixed coarse entry is a.e.-measurable on a deterministic +triadic cube. -/ +theorem aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j) P := by + have hsum : + AEMeasurable + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (0, Pi.single j 1)) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q ((Pi.single i 1, 0) + (0, Pi.single j 1)) + have hi : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (Pi.single i 1, 0) + have hj : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (0, Pi.single j 1) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (0, Pi.single j 1) + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j) = + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((Pi.single i 1, 0) + (0, Pi.single j 1)) a.toFun + - Mu (cubeSet Q) (Pi.single i 1, 0) a.toFun + - Mu (cubeSet Q) (0, Pi.single j 1) a.toFun) := by + funext a + simp [coarseBlockMatrix_upperRight_apply] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The lower-left mixed coarse entry is a.e.-measurable on a deterministic +triadic cube. -/ +theorem aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j) P := by + have hsum : + AEMeasurable + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((0, Pi.single i 1) + (Pi.single j 1, 0)) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q ((0, Pi.single i 1) + (Pi.single j 1, 0)) + have hi : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (0, Pi.single i 1) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (0, Pi.single i 1) + have hj : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun) P := + hP.aemeasurable_Mu_cubeSet Q (Pi.single j 1, 0) + have hEq : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j) = + (fun a : RegCoeffField d => + Mu (cubeSet Q) ((0, Pi.single i 1) + (Pi.single j 1, 0)) a.toFun + - Mu (cubeSet Q) (0, Pi.single i 1) a.toFun + - Mu (cubeSet Q) (Pi.single j 1, 0) a.toFun) := by + funext a + simp [coarseBlockMatrix_lowerLeft_apply] + rw [hEq] + exact (hsum.sub hi).sub hj + +/-- The full unfolded coarse block matrix is a.e.-measurable. -/ +theorem aemeasurable_coarseFullBlockMatrix_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P := by + refine aemeasurable_pi_iff.2 fun α => ?_ + refine aemeasurable_pi_iff.2 fun β => ?_ + cases α with + | inl i => + cases β with + | inl j => + simpa [toFullBlockMat] using + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat] using + hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr i => + cases β with + | inl j => + simpa [toFullBlockMat] using + hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat] using + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +/-- The upper-left block `b(U; a)` is a.e.-measurable as a matrix-valued +observable. -/ +theorem aemeasurable_coarseB_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft) P := by + refine aemeasurable_pi_iff.2 fun i => ?_ + refine aemeasurable_pi_iff.2 fun j => ?_ + exact hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + +/-- The upper-right block of the doubled coarse matrix is a.e.-measurable. -/ +theorem aemeasurable_coarseBlockMatrix_upperRight_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight) P := by + refine aemeasurable_pi_iff.2 fun i => ?_ + refine aemeasurable_pi_iff.2 fun j => ?_ + exact hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + +/-- The lower-left block of the doubled coarse matrix is a.e.-measurable. -/ +theorem aemeasurable_coarseBlockMatrix_lowerLeft_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft) P := by + refine aemeasurable_pi_iff.2 fun i => ?_ + refine aemeasurable_pi_iff.2 fun j => ?_ + exact hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + +/-- The lower-right block `σ_*⁻¹(U; a)` is a.e.-measurable as a matrix-valued +observable. -/ +theorem aemeasurable_coarseSigmaStarInv_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight) P := by + refine aemeasurable_pi_iff.2 fun i => ?_ + refine aemeasurable_pi_iff.2 fun j => ?_ + exact hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +/-- The mixed observable `σ_*⁻¹(U; a)κ(U; a)`, represented as the negative +lower-left block, is a.e.-measurable as a matrix-valued observable. -/ +theorem aemeasurable_coarseSigmaStarInvKappaMean_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => -((coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft)) P := by + refine aemeasurable_pi_iff.2 fun i => ?_ + refine aemeasurable_pi_iff.2 fun j => ?_ + exact (hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j).neg + +/-- The full unfolded starred inverse coarse block matrix is a.e.-measurable. -/ +theorem aemeasurable_coarseStarredFullBlockMatrixInv_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => toFullBlockMat (coarseStarredBlockMatrixInv (cubeSet Q) a.toFun)) P := by + refine aemeasurable_pi_iff.2 fun α => ?_ + refine aemeasurable_pi_iff.2 fun β => ?_ + cases α with + | inl i => + cases β with + | inl j => + simpa [toFullBlockMat, coarseStarredBlockMatrixInv_eq_blockReflect, blockReflect] using + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat, coarseStarredBlockMatrixInv_eq_blockReflect, blockReflect] using + hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr i => + cases β with + | inl j => + simpa [toFullBlockMat, coarseStarredBlockMatrixInv_eq_blockReflect, blockReflect] using + hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat, coarseStarredBlockMatrixInv_eq_blockReflect, blockReflect] using + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + +/-- Finite descendant averages of `Mu` over child cubes are a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_Mu_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (P0 : BlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => Mu (cubeSet R) P0 a.toFun)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => Mu (cubeSet R) P0 a.toFun) + (fun R _ => hP.aemeasurable_Mu_cubeSet R P0) + +/-- Finite descendant averages of upper-left coarse entries are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_coarseBlockMatrix_upperLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft i k)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft i k) + (fun R _ => hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i k) + +/-- Finite descendant averages of upper-right coarse entries are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).upperRight i k)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => (coarseBlockMatrix (cubeSet R) a.toFun).upperRight i k) + (fun R _ => hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet R i k) + +/-- Finite descendant averages of lower-left coarse entries are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).lowerLeft i k)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => (coarseBlockMatrix (cubeSet R) a.toFun).lowerLeft i k) + (fun R _ => hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet R i k) + +/-- Finite descendant averages of lower-right coarse entries are +a.e.-measurable. -/ +theorem aemeasurable_descendantsAverage_coarseBlockMatrix_lowerRight_apply_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (i k : Fin d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight i k)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight i k) + (fun R _ => hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i k) + +/-- Compose an a.e.-measurable observable with adjointing the coefficient +field when the law is adjoint-invariant. -/ +theorem aemeasurable_comp_adjointCoeffField_of_adjointInvariantLaw + {d : ℕ} {P : RestrictionCoeffLaw d} {β : Type*} [MeasurableSpace β] + {F : RegCoeffField d → β} + (hAdj : RestrictionAdjointInvariantLaw P) (hF : AEMeasurable F P) : + AEMeasurable (fun a : RegCoeffField d => F (adjointReg a)) P := by + have hFMap : + AEMeasurable F (Measure.map (adjointReg (d := d)) P) := by + rwa [hAdj] + simpa [Function.comp_def] using + hFMap.comp_measurable (measurable_adjointReg (d := d)) + +/-- The adjointed `Mu` observable is a.e.-measurable under an adjoint-invariant +law. -/ +theorem aemeasurable_Mu_adjointCoeffField_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hAdj : RestrictionAdjointInvariantLaw P) (Q : TriadicCube d) (P0 : BlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => Mu (cubeSet Q) P0 (adjointReg a).toFun) P := + aemeasurable_comp_adjointCoeffField_of_adjointInvariantLaw hAdj + (hP.aemeasurable_Mu_cubeSet Q P0) + +/-- `ResponseJ` is a.e.-measurable whenever the manuscript identity expressing +it as `Mu(U; (-p,q)) - p·q` holds almost surely. -/ +theorem aemeasurable_ResponseJ_cubeSet_of_ae_eq_mu + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) + (hEq : + (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q a.toFun) =ᵐ[P] + (fun a : RegCoeffField d => Mu (cubeSet Q) (-p, q) a.toFun - vecDot p q)) : + AEMeasurable (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q a.toFun) P := by + have hMu : + AEMeasurable + (fun a : RegCoeffField d => Mu (cubeSet Q) (-p, q) a.toFun - vecDot p q) P := + (hP.aemeasurable_Mu_cubeSet Q (-p, q)).sub aemeasurable_const + exact hMu.congr hEq.symm + +/-- Under a law carrier, the deterministic Chapter 2 identity +`ResponseJ = Mu(-p,q) - p·q` holds almost surely on each deterministic +triadic cube. -/ +theorem ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q a.toFun) =ᵐ[P] + (fun a : RegCoeffField d => Mu (cubeSet Q) (-p, q) a.toFun - vecDot p q) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + have hId := + Ch02.ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot + (Q := Q) (a := coeffOnOfAEEllipticOn a Q (ha Q)) p q + simpa [coeffOnOfAEEllipticOn_toCoeffField] using hId + +/-- The scalar response observable is a.e.-measurable under a law carrier. -/ +theorem aemeasurable_ResponseJ_cubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q a.toFun) P := + hP.aemeasurable_ResponseJ_cubeSet_of_ae_eq_mu Q p q + (hP.ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot_ae Q p q) + +/-- Finite descendant averages of `ResponseJ` are a.e.-measurable whenever each +child response is almost surely identified with the corresponding `Mu` +observable. -/ +theorem aemeasurable_descendantsAverage_ResponseJ_cubeSet_of_ae_eq_mu + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) + (hEq : + ∀ R, R ∈ descendantsAtDepth Q j → + (fun a : RegCoeffField d => ResponseJ (cubeSet R) p q a.toFun) =ᵐ[P] + (fun a : RegCoeffField d => Mu (cubeSet R) (-p, q) a.toFun - vecDot p q)) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => ResponseJ (cubeSet R) p q a.toFun)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => ResponseJ (cubeSet R) p q a.toFun) + (fun R hR => hP.aemeasurable_ResponseJ_cubeSet_of_ae_eq_mu R p q (hEq R hR)) + +/-- Finite descendant averages of scalar response observables are +a.e.-measurable under a law carrier. -/ +theorem aemeasurable_descendantsAverage_ResponseJ_cubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => ResponseJ (cubeSet R) p q a.toFun)) P := + aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => ResponseJ (cubeSet R) p q a.toFun) + (fun R _hR => hP.aemeasurable_ResponseJ_cubeSet R p q) + +/-- The adjointed `ResponseJ` observable is a.e.-measurable whenever the +manuscript identity expressing it through adjointed `Mu` holds almost surely. -/ +theorem aemeasurable_ResponseJ_adjointCoeffField_cubeSet_of_ae_eq_mu + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hAdj : RestrictionAdjointInvariantLaw P) (Q : TriadicCube d) (p q : Vec d) + (hEq : + (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q (adjointReg a).toFun) =ᵐ[P] + (fun a : RegCoeffField d => + Mu (cubeSet Q) (-p, q) (adjointReg a).toFun - vecDot p q)) : + AEMeasurable + (fun a : RegCoeffField d => ResponseJ (cubeSet Q) p q (adjointReg a).toFun) P := by + have hMu : + AEMeasurable + (fun a : RegCoeffField d => + Mu (cubeSet Q) (-p, q) (adjointReg a).toFun - vecDot p q) P := + (hP.aemeasurable_Mu_adjointCoeffField_cubeSet hAdj Q (-p, q)).sub aemeasurable_const + exact hMu.congr hEq.symm + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ColorClassConcentration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ColorClassConcentration.lean new file mode 100644 index 0000000000..92fc2ac86f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ColorClassConcentration.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.RestrictionIndependence + +/-! # Color Class Concentration -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-local color-class concentration theorems + +These theorems combine the restriction-unit-range and restriction-local +engineering interface with the proved Section 4.2 independent-sums estimates. +They are the single-color-class input for the finite-color partition-average step. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- A single scale-color class of descendant cubes inherits `Gamma_sigma` +concentration from uniformly controlled centered local summands. -/ +theorem isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hP : RestrictionUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_meas : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, Measurable (X R)) + (hX : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsBigO P (gammaSigma σ) (X R) K) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a) + (gammaSigmaIndependentSumConst σ * + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → RegCoeffField d → ℝ := + fun R => X R.1 + have h_indep : ProbabilityTheory.iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_meas : ∀ R, Measurable (Y R) := by + intro R + exact hX_meas R.1 R.2 + have hY : + ∀ R ∈ S.attach, IsBigO P (gammaSigma σ) (Y R) K := by + intro R _hR + exact hX R.1 R.2 + have h_meanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hsum := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := P) (X := Y) (s := S.attach) (σ := σ) (K := K) + h_indep h_meas hS_attach hσ₀ hσ₂ hK hY h_meanY + simpa [S, hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + rw [isBigO_gammaSigma_iff] + intro t ht + have htail_empty : + absTailEvent (fun _ : RegCoeffField d => (0 : ℝ)) 0 = ∅ := by + ext a + simp [absTailEvent] + simpa [S, hS_empty, htail_empty, absTailEvent, upperTailEvent] using + (show (0 : ℝ) ≤ Real.exp (-(t ^ σ)) by positivity) + +/-- A single scale-color class of descendant cubes inherits `Psi_sigma` +concentration from uniformly controlled centered local summands. -/ +theorem isBigO_psiSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hP : RestrictionUnitRangeDependentLaw P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_meas : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, Measurable (X R)) + (hX_int : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, Integrable (X R) P) + (hX : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsBigO P (psiSigma σ) (X R) K) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) : + IsBigO P (psiSigma σ) + (fun a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a) + (psiSigmaIndependentSumConst σ * + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → RegCoeffField d → ℝ := + fun R => X R.1 + have h_indep : ProbabilityTheory.iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_meas : ∀ R, Measurable (Y R) := by + intro R + exact hX_meas R.1 R.2 + have h_int : ∀ R ∈ S.attach, Integrable (Y R) P := by + intro R _hR + exact hX_int R.1 R.2 + have hY : + ∀ R ∈ S.attach, IsBigO P (psiSigma σ) (Y R) K := by + intro R _hR + exact hX R.1 R.2 + have h_meanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hsum := + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + (μ := P) (X := Y) (s := S.attach) (σ := σ) (K := K) + h_indep h_meas h_int h_meanY hS_attach hσ hK hY + simpa [S, hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + rw [isBigO_psiSigma_iff] + intro t ht + have htail_empty : + absTailEvent (fun _ : RegCoeffField d => (0 : ℝ)) 0 = ∅ := by + ext a + simp [absTailEvent] + simpa [S, hS_empty, htail_empty, absTailEvent, upperTailEvent] using + (show 0 ≤ Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) by positivity) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Concentration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Concentration.lean new file mode 100644 index 0000000000..efbd2bfb05 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Concentration.lean @@ -0,0 +1,882 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Tails +public import Mathlib.Order.Filter.Finite +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal + +/-! # Concentration -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Public Section 4.2 concentration theorems + +This file exposes the already-proved independent-sums results from Section 4.2 +under the public Chapter 4 namespace. Unlike the local-observable and +partition-average files, these are direct imported theorem endpoints: each +theorem is proved by the existing probability mini-library. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + +/-- Explicit growth constant for the stretched-exponential class. -/ +noncomputable abbrev gammaGrowthConst (σ : ℝ) : ℝ := + IndependentSums.gammaGrowthConst σ + +/-- Explicit growth constant for the log-normal class. -/ +noncomputable abbrev psiGrowthConst (σ : ℝ) : ℝ := + IndependentSums.psiGrowthConst σ + +/-- The finite-family weak-tail triangle constant supplied by the Chapter 4 +growth hypothesis. -/ +noncomputable abbrev psiGrowthTriangleConst (K : ℝ) : ℝ := + 4 * K ^ (12 : ℝ) + +/-- The stretched-exponential weak-tail triangle constant. -/ +noncomputable abbrev gammaTriangleConst (σ : ℝ) : ℝ := + IndependentSums.gammaTriangleConst σ + +/-- The log-normal weak-tail triangle constant. -/ +noncomputable abbrev psiSigmaTriangleConst (σ : ℝ) : ℝ := + IndependentSums.psiSigmaTriangleConst σ + +/-- The moment-growth constant attached to `Gamma_sigma`. -/ +noncomputable abbrev gammaMomentConst (σ : ℝ) : ℝ := + IndependentSums.gammaMomentConst σ + +/-- The event-indicator scale `|log p|^{-1/sigma}` for `Gamma_sigma` tails. -/ +noncomputable abbrev gammaIndicatorScale (σ p : ℝ) : ℝ := + IndependentSums.gammaIndicatorScale σ p + +/-- Explicit product constant for the `Gamma_sigma` calculus. If +`tau = sigma_1 sigma_2 / (sigma_1 + sigma_2)`, then the product rule below uses +the witness `2^(1/tau) A_1 A_2`. -/ +noncomputable abbrev gammaProductConst (σ₁ σ₂ : ℝ) : ℝ := + 2 ^ ((σ₁ * σ₂ / (σ₁ + σ₂))⁻¹) + +/-- The Rosenthal/Bennett universal constant used in the finite-moment +endpoint. -/ +noncomputable abbrev rosenthalBennettIntegralConst : ℝ := + IndependentSums.rosenthalBennettIntegralConst + +/-- The exponential-regime endpoint constant for centered independent +`Gamma_sigma` summands. -/ +noncomputable abbrev gammaSigmaExpRegimeEndpointConst (σ : ℝ) : ℝ := + IndependentSums.gammaSigmaExpRegimeEndpointConst σ + +/-- The heavy-tail endpoint constant for centered independent `Gamma_sigma` +summands on the range `0 < sigma < 1`. -/ +noncomputable abbrev gammaSigmaHeavyTailEndpointConst (σ : ℝ) : ℝ := + IndependentSums.gammaSigmaHeavyTailEndpointConst σ + +/-- A public constant for the full `0 < sigma ≤ 2` centered independent +`Gamma_sigma` concentration theorem. -/ +noncomputable def gammaSigmaIndependentSumConst (σ : ℝ) : ℝ := + if σ < 1 then gammaSigmaHeavyTailEndpointConst σ else gammaSigmaExpRegimeEndpointConst σ + +/-- The log-normal centered independent-sum constant. -/ +noncomputable abbrev psiSigmaIndependentSumConst (σ : ℝ) : ℝ := + IndependentSums.psiSigmaIndependentSumConst σ + +/-! ## Weak-tail model classes and calculus -/ + +/-- The stretched-exponential model class is admissible. -/ +theorem admissiblePsi_gammaSigma {σ : ℝ} (hσ : 0 ≤ σ) : + AdmissiblePsi (gammaSigma σ) := + IndependentSums.admissiblePsi_gammaSigma hσ + +/-- The log-normal model class is admissible. -/ +theorem admissiblePsi_psiSigma {σ : ℝ} (hσ : 0 ≤ σ) : + AdmissiblePsi (psiSigma σ) := + IndependentSums.admissiblePsi_psiSigma hσ + +/-- Tail interpretation of the one-sided relation `X ≤ O_{Gamma_sigma}(A)`. -/ +theorem isBigOWith_gammaSigma_iff {X : Ω → ℝ} {A σ : ℝ} : + IsBigOWith μ (gammaSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (upperTailEvent X (A * t)) ≤ Real.exp (-(t ^ σ)) := by + simpa using + (IndependentSums.isBigOWith_gammaSigma_iff (μ := μ) (X := X) (A := A) + (σ := σ)) + +/-- Tail interpretation of `X = O_{Gamma_sigma}(A)`. -/ +theorem isBigO_gammaSigma_iff {X : Ω → ℝ} {A σ : ℝ} : + IsBigO μ (gammaSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (absTailEvent X (A * t)) ≤ Real.exp (-(t ^ σ)) := by + simpa using + (IndependentSums.isBigO_gammaSigma_iff (μ := μ) (X := X) (A := A) (σ := σ)) + +/-- A stretched-exponential tail at exponent `σ` implies the same scale at +any smaller exponent `ρ`. -/ +theorem IsBigOWith.gammaSigma_mono_exponent {X : Ω → ℝ} {A ρ σ : ℝ} + (hρσ : ρ ≤ σ) + (hX : IsBigOWith μ (gammaSigma σ) X A) : + IsBigOWith μ (gammaSigma ρ) X A := by + rw [isBigOWith_gammaSigma_iff] at hX ⊢ + intro t ht + have hpow : t ^ ρ ≤ t ^ σ := + Real.rpow_le_rpow_of_exponent_le ht hρσ + exact (hX ht).trans ((Real.exp_le_exp).2 (neg_le_neg hpow)) + +/-- A symmetric stretched-exponential tail at exponent `σ` implies the same +scale at any smaller exponent `ρ`. -/ +theorem IsBigO.gammaSigma_mono_exponent {X : Ω → ℝ} {A ρ σ : ℝ} + (hρσ : ρ ≤ σ) + (hX : IsBigO μ (gammaSigma σ) X A) : + IsBigO μ (gammaSigma ρ) X A := by + rw [isBigO_gammaSigma_iff] at hX ⊢ + intro t ht + have hpow : t ^ ρ ≤ t ^ σ := + Real.rpow_le_rpow_of_exponent_le ht hρσ + exact (hX ht).trans ((Real.exp_le_exp).2 (neg_le_neg hpow)) + +/-- Tail interpretation of the one-sided relation `X ≤ O_{Psi_sigma}(A)`. -/ +theorem isBigOWith_psiSigma_iff {X : Ω → ℝ} {A σ : ℝ} : + IsBigOWith μ (psiSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (upperTailEvent X (A * t)) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + simpa using + (IndependentSums.isBigOWith_psiSigma_iff (μ := μ) (X := X) (A := A) + (σ := σ)) + +/-- Tail interpretation of `X = O_{Psi_sigma}(A)`. -/ +theorem isBigO_psiSigma_iff {X : Ω → ℝ} {A σ : ℝ} : + IsBigO μ (psiSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (absTailEvent X (A * t)) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + simpa using + (IndependentSums.isBigO_psiSigma_iff (μ := μ) (X := X) (A := A) (σ := σ)) + +/-- `Gamma_sigma` satisfies the Chapter 4 weak-tail growth hypothesis. -/ +theorem hasPsiGrowth_gammaSigma {σ : ℝ} (hσ : 0 < σ) : + HasPsiGrowth (gammaSigma σ) (gammaGrowthConst σ) := + IndependentSums.hasPsiGrowth_gammaSigma hσ + +/-- The explicit `Gamma_sigma` growth constant is admissible for the Chapter 4 +calculus. -/ +theorem two_le_gammaGrowthConst (σ : ℝ) : + 2 ≤ gammaGrowthConst σ := + IndependentSums.two_le_gammaGrowthConst σ + +/-- `Psi_sigma` satisfies the Chapter 4 weak-tail growth hypothesis. -/ +theorem hasPsiGrowth_psiSigma {σ : ℝ} (hσ : 1 ≤ σ) : + HasPsiGrowth (psiSigma σ) (psiGrowthConst σ) := + IndependentSums.hasPsiGrowth_psiSigma hσ + +/-- The explicit `Psi_sigma` growth constant is admissible for the Chapter 4 +calculus. -/ +theorem two_le_psiGrowthConst (σ : ℝ) : + 2 ≤ psiGrowthConst σ := + IndependentSums.two_le_psiGrowthConst σ + +/-- Polynomial powers can be absorbed by dilating a weak-tail profile satisfying +the Chapter 4 growth hypothesis. -/ +theorem hasPsiGrowth_rpow_absorption + {Ψ : ℝ → ℝ} {K p t : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) : + t ^ p * Ψ t ≤ Ψ ((K ^ Nat.ceil p) * t) := + IndependentSums.hasPsiGrowth_rpow_absorption hK hΨ hAdmissible ht + +/-- The growth hypothesis forces log-squared minimal growth of an admissible +weak-tail profile. -/ +theorem admissiblePsi_minimalGrowth + {Ψ : ℝ → ℝ} {K t : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : K ^ (2 : ℕ) ≤ t) : + Real.exp (Real.log t ^ (2 : ℕ) / (9 * Real.log K)) ≤ Ψ t := + IndependentSums.admissiblePsi_minimalGrowth hK hΨ hAdmissible ht + +/-- The growth hypothesis yields the abstract doubling estimate used in the +weak-tail triangle inequality. -/ +theorem admissiblePsi_doubling + {Ψ : ℝ → ℝ} {K q t s : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (hq : 2 ≤ q) (ht : 1 ≤ t) (hs : 1 ≤ s) : + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) * (Ψ (t * s) / Ψ t) := + IndependentSums.admissiblePsi_doubling hK hΨ hAdmissible hq ht hs + +/-- The `q = 2` abstract doubling package generated by the growth hypothesis. -/ +theorem admissiblePsi_hasPsiAbstractDoubling_two + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) : + HasPsiAbstractDoubling Ψ 2 (K ^ (12 : ℝ)) := + IndependentSums.admissiblePsi_hasPsiAbstractDoubling_two hK hΨ hAdmissible + +/-- Finite-family generalized triangle inequality for a weak-tail profile +satisfying the Chapter 4 growth hypothesis. -/ +theorem isBigO_finset_sum_of_isBigO_growth + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {K : ℝ} + [IsFiniteMeasure μ] + (hK : 2 ≤ K) (hGrowth : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ (fun ω => Finset.sum s (fun i => X i ω)) + (psiGrowthTriangleConst K * Finset.sum s a) := by + simpa [psiGrowthTriangleConst] using + IndependentSums.isBigO_finset_sum_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (K := K) + hK hGrowth hAdmissible hs ha hX hXm + +/-- Average version of the growth-based weak-tail triangle inequality. -/ +theorem isBigO_finsetAverage_of_isBigO_growth + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {K : ℝ} + [IsFiniteMeasure μ] + (hK : 2 ≤ K) (hGrowth : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiGrowthTriangleConst K * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + simpa [psiGrowthTriangleConst] using + IndependentSums.isBigO_finsetAverage_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (K := K) + hK hGrowth hAdmissible hs ha hX hXm + +/-- Finite-family generalized triangle inequality for `Gamma_sigma` tails. -/ +theorem isBigO_finset_sum_of_isBigO_gammaSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (gammaSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * Finset.sum s a) := by + simpa [gammaTriangleConst] using + IndependentSums.isBigO_finset_sum_of_isBigO_gammaSigma + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hX hXm + +/-- Average version of the generalized triangle inequality for `Gamma_sigma` +tails. -/ +theorem isBigO_finsetAverage_of_isBigO_gammaSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + simpa [gammaTriangleConst] using + IndependentSums.isBigO_finsetAverage_of_isBigO_gammaSigma + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hX hXm + +/-- Finite-family generalized triangle inequality for `Psi_sigma` tails. -/ +theorem isBigO_finset_sum_of_isBigO_psiSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * Finset.sum s a) := by + simpa [psiSigmaTriangleConst] using + IndependentSums.isBigO_finset_sum_of_isBigO_psiSigma + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hX hXm + +/-- Average version of the generalized triangle inequality for `Psi_sigma` +tails. -/ +theorem isBigO_finsetAverage_of_isBigO_psiSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + simpa [psiSigmaTriangleConst] using + IndependentSums.isBigO_finsetAverage_of_isBigO_psiSigma + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hX hXm + +/-- Product rule for nonnegative stretched-exponential upper tails, with +explicit constant `2^(1/tau)`, `tau = sigma_1 sigma_2 / (sigma_1 + sigma_2)`. -/ +theorem isBigOWith_gammaSigma_mul + {X Y : Ω → ℝ} {A B σ₁ σ₂ : ℝ} + [IsFiniteMeasure μ] + (hσ₁ : 0 < σ₁) (hσ₂ : 0 < σ₂) + (hA : 0 ≤ A) (_hB : 0 ≤ B) + (_hX_nonneg : ∀ ω, 0 ≤ X ω) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hX : IsBigOWith μ (gammaSigma σ₁) X A) + (hY : IsBigOWith μ (gammaSigma σ₂) Y B) : + IsBigOWith μ (gammaSigma (σ₁ * σ₂ / (σ₁ + σ₂))) + (fun ω => X ω * Y ω) (gammaProductConst σ₁ σ₂ * A * B) := by + intro t ht + let τ : ℝ := σ₁ * σ₂ / (σ₁ + σ₂) + let L : ℝ := gammaProductConst σ₁ σ₂ + let u : ℝ := (L * t) ^ (τ / σ₁) + let v : ℝ := (L * t) ^ (τ / σ₂) + have hσsum_pos : 0 < σ₁ + σ₂ := add_pos hσ₁ hσ₂ + have hτ_pos : 0 < τ := by + dsimp [τ] + exact div_pos (mul_pos hσ₁ hσ₂) hσsum_pos + have hL_pos : 0 < L := by + dsimp [L, gammaProductConst, τ] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 2) _ + have hL_one : 1 ≤ L := by + dsimp [L, gammaProductConst, τ] + exact Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 2) (inv_nonneg.mpr hτ_pos.le) + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have hLt_one : 1 ≤ L * t := by nlinarith + have hLt_nonneg : 0 ≤ L * t := le_trans zero_le_one hLt_one + have hLt_pos : 0 < L * t := lt_of_lt_of_le zero_lt_one hLt_one + have hu_one : 1 ≤ u := by + dsimp [u] + exact Real.one_le_rpow hLt_one (div_nonneg hτ_pos.le hσ₁.le) + have hv_one : 1 ≤ v := by + dsimp [v] + exact Real.one_le_rpow hLt_one (div_nonneg hτ_pos.le hσ₂.le) + have hL_pow : L ^ τ = 2 := by + dsimp [L, gammaProductConst, τ] + calc + ((2 : ℝ) ^ τ⁻¹) ^ τ = (2 : ℝ) ^ (τ⁻¹ * τ) := by + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 2)] + _ = (2 : ℝ) := by + rw [inv_mul_cancel₀ hτ_pos.ne', Real.rpow_one] + have hu_pow : u ^ σ₁ = 2 * t ^ τ := by + calc + u ^ σ₁ = (L * t) ^ ((τ / σ₁) * σ₁) := by + dsimp [u] + rw [← Real.rpow_mul hLt_nonneg] + _ = (L * t) ^ τ := by + congr 1 + field_simp [hσ₁.ne'] + _ = L ^ τ * t ^ τ := by + rw [Real.mul_rpow hL_pos.le ht_nonneg] + _ = 2 * t ^ τ := by + rw [hL_pow] + have hv_pow : v ^ σ₂ = 2 * t ^ τ := by + calc + v ^ σ₂ = (L * t) ^ ((τ / σ₂) * σ₂) := by + dsimp [v] + rw [← Real.rpow_mul hLt_nonneg] + _ = (L * t) ^ τ := by + congr 1 + field_simp [hσ₂.ne'] + _ = L ^ τ * t ^ τ := by + rw [Real.mul_rpow hL_pos.le ht_nonneg] + _ = 2 * t ^ τ := by + rw [hL_pow] + have huv : u * v = L * t := by + calc + u * v = (L * t) ^ (τ / σ₁) * (L * t) ^ (τ / σ₂) := rfl + _ = (L * t) ^ (τ / σ₁ + τ / σ₂) := by + rw [← Real.rpow_add hLt_pos] + _ = (L * t) ^ (1 : ℝ) := by + congr 1 + dsimp [τ] + field_simp [hσ₁.ne', hσ₂.ne', hσsum_pos.ne'] + ring + _ = L * t := by + rw [Real.rpow_one] + have hthreshold : (A * u) * (B * v) = (gammaProductConst σ₁ σ₂ * A * B) * t := by + calc + (A * u) * (B * v) = A * B * (u * v) := by ring + _ = A * B * (L * t) := by rw [huv] + _ = (gammaProductConst σ₁ σ₂ * A * B) * t := by + dsimp [L] + ring + have hsubset : + upperTailEvent (fun ω => X ω * Y ω) + ((gammaProductConst σ₁ σ₂ * A * B) * t) ⊆ + upperTailEvent X (A * u) ∪ upperTailEvent Y (B * v) := by + intro ω hω + by_cases hXu : A * u < X ω + · exact Or.inl hXu + · right + by_contra hYv + have hX_le : X ω ≤ A * u := not_lt.mp hXu + have hY_le : Y ω ≤ B * v := not_lt.mp hYv + have hu_nonneg : 0 ≤ u := Real.rpow_nonneg hLt_nonneg _ + have hAu_nonneg : 0 ≤ A * u := mul_nonneg hA hu_nonneg + have hprod_le : X ω * Y ω ≤ (A * u) * (B * v) := + mul_le_mul hX_le hY_le (hY_nonneg ω) hAu_nonneg + exact not_lt_of_ge (by simpa [hthreshold] using hprod_le) hω + have hX_tail : + μ.real (upperTailEvent X (A * u)) ≤ Real.exp (-(2 * t ^ τ)) := by + simpa [gammaSigma, hu_pow, Real.exp_neg] using hX hu_one + have hY_tail : + μ.real (upperTailEvent Y (B * v)) ≤ Real.exp (-(2 * t ^ τ)) := by + simpa [gammaSigma, hv_pow, Real.exp_neg] using hY hv_one + calc + μ.real (upperTailEvent (fun ω => X ω * Y ω) + ((gammaProductConst σ₁ σ₂ * A * B) * t)) + ≤ μ.real (upperTailEvent X (A * u) ∪ upperTailEvent Y (B * v)) := by + exact measureReal_mono hsubset + _ ≤ μ.real (upperTailEvent X (A * u)) + μ.real (upperTailEvent Y (B * v)) := by + exact measureReal_union_le _ _ + _ ≤ Real.exp (-(2 * t ^ τ)) + Real.exp (-(2 * t ^ τ)) := by + exact add_le_add hX_tail hY_tail + _ = 2 * Real.exp (-2 * t ^ τ) := by ring_nf + _ ≤ Real.exp (-(t ^ τ)) := by + exact IndependentSums.two_mul_exp_neg_two_mul_le_exp_neg + (x := t ^ τ) (Real.one_le_rpow ht hτ_pos.le) + _ = (gammaSigma (σ₁ * σ₂ / (σ₁ + σ₂)) t)⁻¹ := by + simp [gammaSigma, τ, Real.exp_neg] + +/-- Power rule for nonnegative stretched-exponential upper-tail bounds. -/ +theorem isBigOWith_gammaSigma_rpow_iff + {X : Ω → ℝ} {A σ p : ℝ} + [IsFiniteMeasure μ] + (hp : 0 < p) (hA : 0 ≤ A) (hX_nonneg : ∀ ω, 0 ≤ X ω) : + IsBigOWith μ (gammaSigma σ) X A ↔ + IsBigOWith μ (gammaSigma (σ / p)) (fun ω => X ω ^ p) (A ^ p) := by + simpa using + IndependentSums.isBigOWith_gammaSigma_rpow_iff + (μ := μ) (X := X) (A := A) (σ := σ) (p := p) hp hA hX_nonneg + +/-- Symmetric power rule for stretched-exponential tails. -/ +theorem isBigO_gammaSigma_rpow_iff + {X : Ω → ℝ} {A σ p : ℝ} + [IsFiniteMeasure μ] + (hp : 0 < p) (hA : 0 ≤ A) : + IsBigO μ (gammaSigma σ) X A ↔ + IsBigO μ (gammaSigma (σ / p)) (fun ω => |X ω| ^ p) (A ^ p) := by + simpa using + IndependentSums.isBigO_gammaSigma_rpow_iff + (μ := μ) (X := X) (A := A) (σ := σ) (p := p) hp hA + +/-- Finite maximum rule for common-scale nonnegative `Gamma_sigma` upper-tail +bounds. -/ +theorem isBigOWith_gammaSigma_finset_sup' + (s : Finset ι) (hs : s.Nonempty) {X : ι → Ω → ℝ} {A σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigOWith μ (gammaSigma σ) (X i) A) : + IsBigOWith μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * A) := by + simpa using + IndependentSums.isBigOWith_gammaSigma_finset_sup' + (μ := μ) (s := s) (hs := hs) (X := X) (A := A) (σ := σ) + hσ hs_card hX + +/-- Finite maximum rule for symmetric `Gamma_sigma` tails with nonuniform +scales. -/ +theorem isBigO_gammaSigma_finset_sup'_of_scales + (s : Finset ι) (hs : s.Nonempty) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) : + IsBigO μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * s.sup' hs a) := by + simpa using + IndependentSums.isBigO_gammaSigma_finset_sup'_of_scales + (μ := μ) (s := s) (hs := hs) (X := X) (a := a) (σ := σ) + hσ hs_card hX + +/-- Event indicators have the logarithmic `Gamma_sigma` scale from the notes. -/ +theorem isBigOWith_gammaSigma_indicator + {E : Set Ω} {σ : ℝ} + (hσ : 0 < σ) (hE_pos : 0 < μ.real E) (hE_lt_one : μ.real E < 1) : + IsBigOWith μ (gammaSigma σ) (E.indicator fun _ => (1 : ℝ)) + (gammaIndicatorScale σ (μ.real E)) := by + simpa [gammaIndicatorScale] using + IndependentSums.isBigOWith_gammaSigma_indicator + (μ := μ) (E := E) (σ := σ) hσ hE_pos hE_lt_one + +/-- Symmetric event-indicator `Gamma_sigma` bound. -/ +theorem isBigO_gammaSigma_indicator + {E : Set Ω} {σ : ℝ} + (hσ : 0 < σ) (hE_pos : 0 < μ.real E) (hE_lt_one : μ.real E < 1) : + IsBigO μ (gammaSigma σ) (E.indicator fun _ => (1 : ℝ)) + (gammaIndicatorScale σ (μ.real E)) := by + simpa [gammaIndicatorScale] using + IndependentSums.isBigO_gammaSigma_indicator + (μ := μ) (E := E) (σ := σ) hσ hE_pos hE_lt_one + +/-! ## Moment growth and Rosenthal -/ + +/-- Moment growth of order `p^(1/sigma)` implies stretched-exponential upper +tails with the Chapter 4 constant `e M`. -/ +theorem isBigOWith_gammaSigma_of_moment_growth + {Y : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hY : + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => Y ω ^ p) μ ∧ + ∫ ω, Y ω ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p) : + IsBigOWith μ (gammaSigma σ) Y (Real.exp 1 * M) := + IndependentSums.isBigOWith_gammaSigma_of_moment_growth + (μ := μ) (Y := Y) (M := M) (σ := σ) hσ hM hY_nonneg hY + +/-- Symmetric moment-growth criterion for `Gamma_sigma` tails. -/ +theorem isBigO_gammaSigma_of_moment_growth + {X : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) + (hX : + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => |X ω| ^ p) μ ∧ + ∫ ω, |X ω| ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p) : + IsBigO μ (gammaSigma σ) X (Real.exp 1 * M) := + IndependentSums.isBigO_gammaSigma_of_moment_growth + (μ := μ) (X := X) (M := M) (σ := σ) hσ hM hX + +/-- Tail control with witness `K` yields `p^(1/sigma)` moment growth. -/ +theorem hasGammaMomentGrowthWith_of_isBigO_gammaSigma + {X : Ω → ℝ} {K σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) + (hXm : AEMeasurable X μ) (hX : IsBigO μ (gammaSigma σ) X K) : + HasGammaMomentGrowthWith μ σ X (gammaMomentConst σ * K) := by + simpa [gammaMomentConst] using + IndependentSums.hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) hσ hK hXm hX + +/-- Explicit moment estimate associated to a `Gamma_sigma` tail witness. -/ +theorem integral_abs_rpow_le_of_isBigO_gammaSigma + {X : Ω → ℝ} {K σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hp : 1 ≤ p) + (hXm : AEMeasurable X μ) (hX : IsBigO μ (gammaSigma σ) X K) : + ∫ ω, |X ω| ^ p ∂μ ≤ (gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p := by + simpa [gammaMomentConst, mul_assoc, mul_left_comm, mul_comm] using + IndependentSums.integral_abs_rpow_le_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) (p := p) hσ hK hp hXm hX + +/-- Rosenthal's inequality in the max-term form from the notes. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ + (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + have hcenter_eq : + IndependentSums.centeredFinsetSum X μ s = fun ω => ∑ i ∈ s, X i ω := by + have hmean_sum : ∑ i ∈ s, ∫ ω, X i ω ∂μ = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + exact hXmean i hi + funext ω + rw [IndependentSums.centeredFinsetSum, Finset.sum_sub_distrib, hmean_sum, sub_zero] + simpa [hcenter_eq, rosenthalBennettIntegralConst] using + IndependentSums.integral_abs_centeredFinsetSum_pow_rpow_inv_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_int h_sq_int hmax_int + +/-- Rosenthal's polynomial-moment corollary for finite sums of centered +independent real random variables. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + simpa [rosenthalBennettIntegralConst] using + IndependentSums.integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas hLp_int hXmean + +/-- Uniform-`K` polynomial-moment Rosenthal corollary. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} {K : ℝ} + (hp : 2 ≤ p) + (hK_nonneg : 0 ≤ K) + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * ((s.card : ℝ) ^ (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + simpa [rosenthalBennettIntegralConst] using + IndependentSums.integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := μ) (X := X) (s := s) hs hp hK_nonneg h_indep h_meas hLp_int hXmean hK + +/-- Uniform-`K` polynomial-moment Rosenthal corollary for a.e.-measurable +summands. This is the completed-law version used by Chapter 4 local-test +observables: independence is kept on the original local observables, while the +proof applies the measurable-mk representatives internally. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero_aemeasurable + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} {K : ℝ} + (hp : 2 ≤ p) + (hK_nonneg : 0 ≤ K) + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_aemeas : ∀ i, AEMeasurable (X i) μ) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * ((s.card : ℝ) ^ (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + classical + let Y : ι → Ω → ℝ := fun i => (h_aemeas i).mk (X i) + have hXY : ∀ i, X i =ᵐ[μ] Y i := fun i => (h_aemeas i).ae_eq_mk + have hY_indep : ProbabilityTheory.iIndepFun Y μ := h_indep.congr hXY + have hY_meas : ∀ i, Measurable (Y i) := fun i => (h_aemeas i).measurable_mk + have hY_Lp_int : + ∀ i ∈ s, Integrable (fun ω => |Y i ω| ^ p) μ := by + intro i hi + refine (hLp_int i hi).congr ?_ + filter_upwards [hXY i] with ω hω + simp [Y, ← hω] + have hY_mean : ∀ i ∈ s, ∫ ω, Y i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Y i ω ∂μ = ∫ ω, X i ω ∂μ := by + exact integral_congr_ae (hXY i).symm + _ = 0 := hXmean i hi + have hY_K : + ∀ i ∈ s, (∫ ω, |Y i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K := by + intro i hi + have hint : + ∫ ω, |Y i ω| ^ p ∂μ = ∫ ω, |X i ω| ^ p ∂μ := by + exact integral_congr_ae (by + filter_upwards [(hXY i).symm] with ω hω + simp [Y, hω]) + simpa [hint] using hK i hi + have hY_bound := + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) hs hp hK_nonneg hY_indep hY_meas + hY_Lp_int hY_mean hY_K + have hsum_eq : + (fun ω => |∑ i ∈ s, X i ω| ^ p) =ᵐ[μ] + fun ω => |∑ i ∈ s, Y i ω| ^ p := by + have hAll : ∀ᵐ ω ∂μ, ∀ i ∈ s, X i ω = Y i ω := by + rw [Filter.eventually_all_finset] + intro i _hi + exact hXY i + filter_upwards [hAll] with ω hω + congr 2 + exact Finset.sum_congr rfl fun i hi => by simp [hω i hi] + have hint : + ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ = + ∫ ω, |∑ i ∈ s, Y i ω| ^ p ∂μ := + integral_congr_ae hsum_eq + simpa [hint] using hY_bound + +/-! ## Independent-sum concentration endpoints -/ + +/-- Direct concentration in the exponential regime `1 ≤ sigma ≤ 2`. -/ +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₁ : 1 ≤ σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaExpRegimeEndpointConst σ * Real.sqrt (s.card : ℝ) * K) := by + simpa [gammaSigmaExpRegimeEndpointConst] using + IndependentSums.isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₁ hσ₂ hK hX hXmean + +/-- Averaged direct concentration in the exponential regime `1 ≤ sigma ≤ 2`. -/ +theorem isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₁ : 1 ≤ σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (gammaSigmaExpRegimeEndpointConst σ * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + simpa [gammaSigmaExpRegimeEndpointConst] using + IndependentSums.isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₁ hσ₂ hK hX hXmean + +/-- Full centered independent-sum concentration for `Gamma_sigma`, +`0 < sigma ≤ 2`. -/ +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) := by + by_cases hσ_lt : σ < 1 + · simpa [gammaSigmaIndependentSumConst, hσ_lt, gammaSigmaHeavyTailEndpointConst] using + IndependentSums.isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₀ hσ_lt hK hX h_mean + · have hσ₁ : 1 ≤ σ := le_of_not_gt hσ_lt + simpa [gammaSigmaIndependentSumConst, hσ_lt, gammaSigmaExpRegimeEndpointConst] using + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₁ hσ₂ hK hX h_mean + +/-- Averaged full centered independent-sum concentration for `Gamma_sigma`, +`0 < sigma ≤ 2`. -/ +theorem isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (gammaSigmaIndependentSumConst σ * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + by_cases hσ_lt : σ < 1 + · simpa [gammaSigmaIndependentSumConst, hσ_lt, gammaSigmaHeavyTailEndpointConst] using + IndependentSums.isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₀ hσ_lt hK hX h_mean + · have hσ₁ : 1 ≤ σ := le_of_not_gt hσ_lt + simpa [gammaSigmaIndependentSumConst, hσ_lt, gammaSigmaExpRegimeEndpointConst] using + isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₁ hσ₂ hK hX h_mean + +/-- Generic heavy-tail concentration estimate for centered finite independent +families under a weak-tail logarithmic constraint. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : ι → Ω → ℝ} {s : Finset ι} {a l L CΨ M : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + simpa using + IndependentSums.measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (Ψ := Ψ) (X := X) (s := s) (a := a) (l := l) (L := L) + (CΨ := CΨ) (M := M) + h_indep h_meas h_int h_mean hAdmissible hCΨ_nonneg hCΨ hX hl hl1 hL hM + hconstraint + +/-- Log-normal centered independent-sum concentration. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hs : s.Nonempty) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (psiSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) := by + simpa [psiSigmaIndependentSumConst] using + IndependentSums.isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas h_int h_mean hs hσ hK hX + +/-- Averaged log-normal centered independent-sum concentration. -/ +theorem isBigO_psiSigma_finsetAverage_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hs : s.Nonempty) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (psiSigmaIndependentSumConst σ * + (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + simpa [psiSigmaIndependentSumConst] using + IndependentSums.isBigO_psiSigma_finsetAverage_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas h_int h_mean hs hσ hK hX + +/-! ## Log-normal bridge -/ + +/-- Subgaussian upper tails imply log-normal upper tails for `exp X - 1`. -/ +theorem isBigOWith_psiSigma_exp_sub_one_of_isBigOWith_gammaTwo + {X : Ω → ℝ} {σ : ℝ} + (hσ : 1 ≤ σ) + (hX : IsBigOWith μ (gammaSigma 2) X σ) : + IsBigOWith μ (psiSigma σ) (fun ω => Real.exp (X ω) - 1) (Real.exp σ - 1) := by + simpa using + IndependentSums.isBigOWith_psiSigma_exp_sub_one_of_isBigOWith_gammaTwo + (μ := μ) (X := X) (σ := σ) hσ hX + +/-- Log-normal upper tails for `exp X - 1` imply the matching subgaussian +upper-tail relation for `X`. -/ +theorem isBigOWith_gammaTwo_of_isBigOWith_psiSigma_exp_sub_one + {X : Ω → ℝ} {σ : ℝ} + (hσ : 1 ≤ σ) + (hX : IsBigOWith μ (psiSigma σ) (fun ω => Real.exp (X ω) - 1) σ) : + IsBigOWith μ (gammaSigma 2) X σ := by + simpa using + IndependentSums.isBigOWith_gammaTwo_of_isBigOWith_psiSigma_exp_sub_one + (μ := μ) (X := X) (σ := σ) hσ hX + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ConcentrationAEMeasurable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ConcentrationAEMeasurable.lean new file mode 100644 index 0000000000..4266d41586 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ConcentrationAEMeasurable.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration + +/-! # Concentration AEMeasurable -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# A.e.-measurable concentration bridges + +The public independent-sum concentration theorems are stated for measurable +summands. Chapter 4 local-test observables are naturally only +a.e.-measurable under a law carrier. This file provides the small bridge used +by completed-local partition arguments: replace each summand by its measurable +representative, use a.e. congruence to preserve independence, and transfer the +tail conclusion back. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + +theorem measureReal_mono_ae [IsFiniteMeasure μ] {s t : Set Ω} + (hst : s ≤ᵐ[μ] t) : + μ.real s ≤ μ.real t := + ENNReal.toReal_mono (by finiteness) (measure_mono_ae hst) + +theorem isBigOWith_of_ae_le [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} + {X Y : Ω → ℝ} {A : ℝ} + (hX : IsBigOWith μ Ψ X A) (hYX : ∀ᵐ ω ∂μ, Y ω ≤ X ω) : + IsBigOWith μ Ψ Y A := by + intro t ht + refine (measureReal_mono_ae (μ := μ) ?_).trans (hX ht) + filter_upwards [hYX] with ω hω htail + exact lt_of_lt_of_le htail hω + +theorem isBigO_congr_ae {Ψ : ℝ → ℝ} {X Y : Ω → ℝ} {A : ℝ} + (hXY : X =ᵐ[μ] Y) : + IsBigO μ Ψ X A ↔ IsBigO μ Ψ Y A := by + constructor + · intro hX t ht + have hset : + absTailEvent X (A * t) =ᵐ[μ] absTailEvent Y (A * t) := by + filter_upwards [hXY] with ω hω + apply propext + change A * t < |X ω| ↔ A * t < |Y ω| + rw [hω] + have hmeasure : + μ.real (absTailEvent Y (A * t)) = + μ.real (absTailEvent X (A * t)) := by + exact congrArg ENNReal.toReal (MeasureTheory.measure_congr hset.symm) + change μ.real (absTailEvent Y (A * t)) ≤ (Ψ t)⁻¹ + rw [hmeasure] + simpa [IndependentSums.absTailEvent] using hX ht + · intro hY t ht + have hset : + absTailEvent Y (A * t) =ᵐ[μ] absTailEvent X (A * t) := by + filter_upwards [hXY] with ω hω + apply propext + change A * t < |Y ω| ↔ A * t < |X ω| + rw [hω] + have hmeasure : + μ.real (absTailEvent X (A * t)) = + μ.real (absTailEvent Y (A * t)) := by + exact congrArg ENNReal.toReal (MeasureTheory.measure_congr hset.symm) + change μ.real (absTailEvent X (A * t)) ≤ (Ψ t)⁻¹ + rw [hmeasure] + simpa [IndependentSums.absTailEvent] using hY ht + +theorem isBigO_gammaSigma_iff_of_map_eq_map + {σ A : ℝ} {X Y : Ω → ℝ} + (hX_meas : Measurable X) (hY_meas : Measurable Y) + (hmap : Measure.map X μ = Measure.map Y μ) : + IsBigO μ (gammaSigma σ) X A ↔ IsBigO μ (gammaSigma σ) Y A := by + rw [isBigO_gammaSigma_iff, isBigO_gammaSigma_iff] + constructor + · intro hX t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun ν : Measure ℝ => ν s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hXY : + μ.real (absTailEvent X (A * t)) = + μ.real (absTailEvent Y (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hX_meas hs, + Measure.map_apply hY_meas hs] using! hmass_real + rw [← hXY] + exact hX ht + · intro hY t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun ν : Measure ℝ => ν s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hYX : + μ.real (absTailEvent Y (A * t)) = + μ.real (absTailEvent X (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hX_meas hs, + Measure.map_apply hY_meas hs] using! hmass_real.symm + rw [← hYX] + exact hY ht + +theorem isBigO_gammaSigma_iff_of_map_eq_map_aemeasurable + {σ A : ℝ} {X Y : Ω → ℝ} + (hX_aemeas : AEMeasurable X μ) (hY_aemeas : AEMeasurable Y μ) + (hmap : Measure.map X μ = Measure.map Y μ) : + IsBigO μ (gammaSigma σ) X A ↔ IsBigO μ (gammaSigma σ) Y A := by + let Xm : Ω → ℝ := hX_aemeas.mk X + let Ym : Ω → ℝ := hY_aemeas.mk Y + have hXXm : X =ᵐ[μ] Xm := hX_aemeas.ae_eq_mk + have hYYm : Y =ᵐ[μ] Ym := hY_aemeas.ae_eq_mk + have hmap_mk : Measure.map Xm μ = Measure.map Ym μ := by + calc + Measure.map Xm μ = Measure.map X μ := (Measure.map_congr hXXm).symm + _ = Measure.map Y μ := hmap + _ = Measure.map Ym μ := Measure.map_congr hYYm + have hmk := + isBigO_gammaSigma_iff_of_map_eq_map + (μ := μ) (σ := σ) (A := A) + hX_aemeas.measurable_mk hY_aemeas.measurable_mk hmap_mk + exact + (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) (A := A) hXXm).trans + (hmk.trans + (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) (A := A) hYYm).symm) + +theorem isBigOWith_gammaSigma_iff_of_map_eq_map + {σ A : ℝ} {X Y : Ω → ℝ} + (hX_meas : Measurable X) (hY_meas : Measurable Y) + (hmap : Measure.map X μ = Measure.map Y μ) : + IsBigOWith μ (gammaSigma σ) X A ↔ + IsBigOWith μ (gammaSigma σ) Y A := by + rw [isBigOWith_gammaSigma_iff, isBigOWith_gammaSigma_iff] + constructor + · intro hX t ht + let s : Set ℝ := {x | A * t < x} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const measurable_id + have hmass := congrArg (fun ν : Measure ℝ => ν s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hXY : + μ.real (upperTailEvent X (A * t)) = + μ.real (upperTailEvent Y (A * t)) := by + simpa [s, upperTailEvent, Measure.map_apply hX_meas hs, + Measure.map_apply hY_meas hs] using! hmass_real + rw [← hXY] + exact hX ht + · intro hY t ht + let s : Set ℝ := {x | A * t < x} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const measurable_id + have hmass := congrArg (fun ν : Measure ℝ => ν s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hYX : + μ.real (upperTailEvent Y (A * t)) = + μ.real (upperTailEvent X (A * t)) := by + simpa [s, upperTailEvent, Measure.map_apply hX_meas hs, + Measure.map_apply hY_meas hs] using! hmass_real.symm + rw [← hYX] + exact hY ht + +theorem isBigOWith_gammaSigma_iff_of_map_eq_map_aemeasurable + {σ A : ℝ} {X Y : Ω → ℝ} + [IsFiniteMeasure μ] + (hX_aemeas : AEMeasurable X μ) (hY_aemeas : AEMeasurable Y μ) + (hmap : Measure.map X μ = Measure.map Y μ) : + IsBigOWith μ (gammaSigma σ) X A ↔ + IsBigOWith μ (gammaSigma σ) Y A := by + let Xm : Ω → ℝ := hX_aemeas.mk X + let Ym : Ω → ℝ := hY_aemeas.mk Y + have hXXm : X =ᵐ[μ] Xm := hX_aemeas.ae_eq_mk + have hYYm : Y =ᵐ[μ] Ym := hY_aemeas.ae_eq_mk + have hmap_mk : Measure.map Xm μ = Measure.map Ym μ := by + calc + Measure.map Xm μ = Measure.map X μ := (Measure.map_congr hXXm).symm + _ = Measure.map Y μ := hmap + _ = Measure.map Ym μ := Measure.map_congr hYYm + have hmk := + isBigOWith_gammaSigma_iff_of_map_eq_map + (μ := μ) (σ := σ) (A := A) + hX_aemeas.measurable_mk hY_aemeas.measurable_mk hmap_mk + constructor + · intro hX + refine Ch04.isBigOWith_of_ae_le (μ := μ) (Ψ := gammaSigma σ) + (X := Ym) (Y := Y) ?_ ?_ + · exact (hmk.1 + (Ch04.isBigOWith_of_ae_le (μ := μ) (Ψ := gammaSigma σ) + (X := X) (Y := Xm) hX (hXXm.mono fun _ h => by rw [← h]))) + · exact hYYm.mono fun _ h => by rw [h] + · intro hY + refine Ch04.isBigOWith_of_ae_le (μ := μ) (Ψ := gammaSigma σ) + (X := Xm) (Y := X) ?_ ?_ + · exact (hmk.2 + (Ch04.isBigOWith_of_ae_le (μ := μ) (Ψ := gammaSigma σ) + (X := Y) (Y := Ym) hY (hYYm.mono fun _ h => by rw [← h]))) + · exact hXXm.mono fun _ h => by rw [h] + +theorem isBigO_finset_sum_of_isBigO_gammaSigma_aemeasurable + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i, AEMeasurable (X i) μ) : + IsBigO μ (gammaSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * Finset.sum s a) := by + classical + let Y : ι → Ω → ℝ := fun i => (hXm i).mk (X i) + have hXY : ∀ i, X i =ᵐ[μ] Y i := fun i => (hXm i).ae_eq_mk + have hY : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Y i) (a i) := by + intro i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := a i) (hXY i)).1 (hX i hi) + have hYm : ∀ i ∈ s, Measurable (Y i) := by + intro i _hi + exact (hXm i).measurable_mk + have hsumY := + isBigO_finset_sum_of_isBigO_gammaSigma + (μ := μ) s hσ hs ha hY hYm + have hsumXY : + (fun ω => Finset.sum s (fun i => X i ω)) =ᵐ[μ] + fun ω => Finset.sum s (fun i => Y i ω) := by + have hAll : ∀ᵐ ω ∂μ, ∀ i ∈ s, X i ω = Y i ω := by + rw [Filter.eventually_all_finset] + intro i _hi + exact hXY i + filter_upwards [hAll] with ω hω + exact Finset.sum_congr rfl fun i hi => hω i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := gammaTriangleConst σ * Finset.sum s a) hsumXY).2 hsumY + +theorem isBigO_finsetAverage_of_isBigO_gammaSigma_aemeasurable + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i, AEMeasurable (X i) μ) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + classical + let Y : ι → Ω → ℝ := fun i => (hXm i).mk (X i) + have hXY : ∀ i, X i =ᵐ[μ] Y i := fun i => (hXm i).ae_eq_mk + have hY : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Y i) (a i) := by + intro i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := a i) (hXY i)).1 (hX i hi) + have hYm : ∀ i ∈ s, Measurable (Y i) := by + intro i _hi + exact (hXm i).measurable_mk + have havgY := + isBigO_finsetAverage_of_isBigO_gammaSigma + (μ := μ) s hσ hs ha hY hYm + have havgXY : + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) =ᵐ[μ] + fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => Y i ω) := by + have hAll : ∀ᵐ ω ∂μ, ∀ i ∈ s, X i ω = Y i ω := by + rw [Filter.eventually_all_finset] + intro i _hi + exact hXY i + filter_upwards [hAll] with ω hω + congr 1 + exact Finset.sum_congr rfl fun i hi => hω i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := gammaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) + havgXY).2 havgY + +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_aemeasurable + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : ProbabilityTheory.iIndepFun X μ) + (h_aemeas : ∀ i, AEMeasurable (X i) μ) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) := by + classical + let Y : ι → Ω → ℝ := fun i => (h_aemeas i).mk (X i) + have hXY : ∀ i, X i =ᵐ[μ] Y i := fun i => (h_aemeas i).ae_eq_mk + have hY_indep : ProbabilityTheory.iIndepFun Y μ := h_indep.congr hXY + have hY_meas : ∀ i, Measurable (Y i) := fun i => (h_aemeas i).measurable_mk + have hY_tail : + ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Y i) K := by + intro i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := K) (hXY i)).1 (hX i hi) + have hY_mean : ∀ i ∈ s, ∫ ω, Y i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Y i ω ∂μ = ∫ ω, X i ω ∂μ := integral_congr_ae (hXY i).symm + _ = 0 := h_mean i hi + have hsumY := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) (σ := σ) (K := K) + hY_indep hY_meas hs hσ₀ hσ₂ hK hY_tail hY_mean + have hsumXY : + (fun ω => ∑ i ∈ s, X i ω) =ᵐ[μ] fun ω => ∑ i ∈ s, Y i ω := by + have hAll : ∀ᵐ ω ∂μ, ∀ i ∈ s, X i ω = Y i ω := by + rw [Filter.eventually_all_finset] + intro i _hi + exact hXY i + filter_upwards [hAll] with ω hω + exact Finset.sum_congr rfl fun i hi => hω i hi + exact (isBigO_congr_ae (μ := μ) (Ψ := gammaSigma σ) + (A := gammaSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) + hsumXY).2 hsumY + +theorem isBigO_gammaSigma_const_of_abs_le + [IsFiniteMeasure μ] {σ A c : ℝ} + (hA : 0 ≤ A) (hc : |c| ≤ A) : + IsBigO μ (gammaSigma σ) (fun _ω : Ω => c) A := by + rw [isBigO_gammaSigma_iff] + intro t ht + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have hAt : A ≤ A * t := by + calc + A = A * 1 := by ring + _ ≤ A * t := mul_le_mul_of_nonneg_left ht hA + have htail_empty : + absTailEvent (fun _ω : Ω => c) (A * t) = ∅ := by + ext ω + simp [absTailEvent, not_lt_of_ge (hc.trans hAt)] + rw [htail_empty] + simpa using (Real.exp_pos (-(t ^ σ))).le + +theorem isBigO_gammaSigma_sub_const_of_abs_const_le_aemeasurable + [IsFiniteMeasure μ] {σ K M c : ℝ} {X : Ω → ℝ} + (hσ : 0 < σ) (hK : 0 < K) (hM : 0 < M) + (hX : IsBigO μ (gammaSigma σ) X K) + (hXm : AEMeasurable X μ) (hc : |c| ≤ M) : + IsBigO μ (gammaSigma σ) (fun ω => X ω - c) + (gammaTriangleConst σ * (K + M)) := by + classical + let Y : Bool → Ω → ℝ := fun b => + if b then fun _ω => -c else X + let a : Bool → ℝ := fun b => if b then M else K + have hY : + ∀ b ∈ (Finset.univ : Finset Bool), + IsBigO μ (gammaSigma σ) (Y b) (a b) := by + intro b _hb + cases b + · simpa [Y, a] using hX + · have hconst : + IsBigO μ (gammaSigma σ) (fun _ω : Ω => -c) M := by + refine isBigO_gammaSigma_const_of_abs_le (μ := μ) + (σ := σ) hM.le ?_ + simpa [abs_neg] using hc + simpa [Y, a] using hconst + have hYaemeas : ∀ b, AEMeasurable (Y b) μ := by + intro b + cases b + · simpa [Y] using hXm + · simp [Y] + have ha : ∀ b ∈ (Finset.univ : Finset Bool), 0 < a b := by + intro b _hb + cases b <;> simp [a, hK, hM] + have hsum := + isBigO_finset_sum_of_isBigO_gammaSigma_aemeasurable + (μ := μ) (s := (Finset.univ : Finset Bool)) (X := Y) (a := a) + (σ := σ) hσ (Finset.univ_nonempty) ha hY hYaemeas + have hsum_fun : + (fun ω => ∑ b ∈ (Finset.univ : Finset Bool), Y b ω) = + fun ω => X ω - c := by + funext ω + simp [Y, sub_eq_add_neg] + ring + have hsum_scale : + (∑ b ∈ (Finset.univ : Finset Bool), a b) = K + M := by + simp [a, add_comm] + convert hsum using 1 + · exact hsum_fun.symm + · rw [hsum_scale] + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAverages.lean new file mode 100644 index 0000000000..36277b13dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAverages.lean @@ -0,0 +1,335 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.Order.Chebyshev +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ColorClassConcentration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverages + +/-! # Descendant Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Public descendant-average concentration + +This file composes the public color-class concentration estimates with the +finite-color aggregation theorem. It is the coefficient-law-facing form of the +partition-average fluctuation input: the statements use `RestrictionUnitRangeDependentLaw` +and `IsRestrictionLocalRandomVariable`, while the old restriction-sigma machinery remains +outside the public theorem surface. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +private theorem gammaSigmaIndependentSumConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaSigmaIndependentSumConst σ := by + dsimp [gammaSigmaIndependentSumConst] + by_cases hσ_lt : σ < 1 + · simpa [hσ_lt, gammaSigmaHeavyTailEndpointConst] using! + (mul_pos + (Real.rpow_pos_of_pos (by norm_num : 0 < (2 : ℝ)) _) + (IndependentSums.gammaSigmaHeavyTailConst_pos hσ)) + · have hσ_one : 1 ≤ σ := le_of_not_gt hσ_lt + dsimp [gammaSigmaExpRegimeEndpointConst] + by_cases hσ_eq : σ = 1 + · subst σ + simpa [hσ_lt, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using + (mul_pos (by norm_num : 0 < (2 : ℝ)) + IndependentSums.gammaOneExpRegimeConst_pos) + · have hExpConst_pos : 0 < IndependentSums.gammaSigmaExpRegimeConst σ := by + dsimp [IndependentSums.gammaSigmaExpRegimeConst] + exact lt_of_lt_of_le + (mul_pos (by positivity) (IndependentSums.gammaMomentConst_pos hσ)) + (le_max_left _ _) + simpa [hσ_lt, hσ_eq, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using + (mul_pos (by norm_num : 0 < (2 : ℝ)) hExpConst_pos) + +private theorem psiSigmaIndependentSumConst_pos (σ : ℝ) : + 0 < psiSigmaIndependentSumConst σ := + IndependentSums.psiSigmaIndependentSumConst_pos σ + +/-- The explicit descendant-average `Gamma_sigma` color-count constant is +positive. -/ +theorem gammaSigmaDescendantsAtScaleConst_pos {d : ℕ} {k : ℤ} {σ : ℝ} + (hσ : 0 < σ) : + 0 < gammaSigmaDescendantsAtScaleConst d k σ := by + have hcolor_pos : 0 < ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (pow_pos (scaleColorPeriod_pos k) d) + exact mul_pos + (mul_pos IndependentSums.gammaTriangleConst_pos (gammaSigmaIndependentSumConst_pos hσ)) + (Real.sqrt_pos.2 hcolor_pos) + +/-- The explicit descendant-average `Psi_sigma` color-count constant is +positive. -/ +theorem psiSigmaDescendantsAtScaleConst_pos {d : ℕ} {k : ℤ} {σ : ℝ} : + 0 < psiSigmaDescendantsAtScaleConst d k σ := by + have hcolor_pos : 0 < ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (pow_pos (scaleColorPeriod_pos k) d) + have htriangle_pos : 0 < psiSigmaTriangleConst σ := by + have hgrowth_pos : 0 < IndependentSums.psiGrowthConst σ := + lt_of_lt_of_le zero_lt_two (IndependentSums.two_le_psiGrowthConst σ) + dsimp [psiSigmaTriangleConst, IndependentSums.psiSigmaTriangleConst] + positivity + exact mul_pos + (mul_pos htriangle_pos (psiSigmaIndependentSumConst_pos σ)) + (Real.sqrt_pos.2 hcolor_pos) + +private theorem scaleColorClass_nonempty_of_mem_image {d : ℕ} + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hc : c ∈ (descendantsAtScale Q k).image (cubeScaleColor k)) : + (descendantsAtScaleScaleColorClass Q k c).Nonempty := by + rcases Finset.mem_image.mp hc with ⟨R, hR, rfl⟩ + exact ⟨R, mem_descendantsAtScaleScaleColorClass_self hR⟩ + +private theorem scaleColor_sqrt_card_sum_le {d : ℕ} + (Q : TriadicCube d) (k : ℤ) : + ∑ c ∈ (descendantsAtScale Q k).image (cubeScaleColor k), + Real.sqrt (((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt (((descendantsAtScale Q k).card : ℝ)) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + have hsum_card_eq : + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) = + ((descendantsAtScale Q k).card : ℝ) := by + rw [← Nat.cast_sum] + exact_mod_cast (card_descendantsAtScale_eq_sum_card_scaleColorClass_image Q k).symm + have hsqrt_sum_le : + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (colors.card : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + simpa [hsum_card_eq] using + (Real.sum_sqrt_mul_sqrt_le + (s := colors) + (f := fun _ => (1 : ℝ)) + (g := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (hf := by intro c; positivity) + (hg := by intro c; positivity)) + have hcolors_card_le : + (colors.card : ℝ) ≤ ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (card_image_cubeScaleColor_descendantsAtScale_le Q k) + have hsqrt_colors_le : + Real.sqrt (colors.card : ℝ) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := + Real.sqrt_le_sqrt hcolors_card_le + exact hsqrt_sum_le.trans + (mul_le_mul_of_nonneg_right hsqrt_colors_le (by positivity)) + +/-- Averaging over all descendants at scale `k` preserves `Gamma_sigma` +concentration for restriction-unit-range-dependent laws. -/ +theorem isBigO_gammaSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hk : k ≤ Q.scale) + (hP : RestrictionUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_meas : ∀ R ∈ descendantsAtScale Q k, Measurable (X R)) + (hX : ∀ R ∈ descendantsAtScale Q k, IsBigO P (gammaSigma σ) (X R) K) + (h_mean : ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a) + (gammaSigmaDescendantsAtScaleConst d k σ * + (Real.sqrt ((descendantsAtScale Q k).card : ℝ) / + ((descendantsAtScale Q k).card : ℝ)) * K) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → RegCoeffField d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + let classCount : ScaleColor d k → ℝ := + fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) + let colorCount : ℝ := (((scaleColorPeriod k) ^ d : ℕ) : ℝ) + let totalCount : ℝ := ((descendantsAtScale Q k).card : ℝ) + have hcolors : colors.Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩⟩ + have hClassCount : ∀ c ∈ colors, 0 < classCount c := by + intro c hc + have hnonempty : (descendantsAtScaleScaleColorClass Q k c).Nonempty := + scaleColorClass_nonempty_of_mem_image (Q := Q) (k := k) (c := c) (by simpa [colors] using hc) + dsimp [classCount] + exact_mod_cast hnonempty.card_pos + have hTotal : 0 < totalCount := by + dsimp [totalCount] + exact_mod_cast (descendantsAtScale_nonempty Q hk).card_pos + have hY : + ∀ c ∈ colors, + IsBigO P (gammaSigma σ) (Y c) + (gammaSigmaIndependentSumConst σ * Real.sqrt (classCount c) * K) := by + intro c hc + have hcolor := + isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP hσ₀ hσ₂ hK X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_meas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + simpa [Y, classCount] using hcolor + have hYmeas : ∀ c ∈ colors, Measurable (Y c) := by + intro c hc + simpa [Y] using + (Finset.measurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => hX_meas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1)) + have hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount := by + simpa [colors, classCount, colorCount, totalCount] using + scaleColor_sqrt_card_sum_le Q k + have haverage := + isBigO_finsetAverage_colorClassSums_gammaSigma + (μ := P) (colors := colors) (Y := Y) (classCount := classCount) + (colorCount := colorCount) (totalCount := totalCount) + (C := gammaSigmaIndependentSumConst σ) (K := K) (σ := σ) + hσ₀ hcolors hClassCount hTotal (gammaSigmaIndependentSumConst_pos hσ₀) hK + hY hYmeas hSqrt + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have haverage_fun_eq : + (fun a => totalCount⁻¹ * ∑ c ∈ colors, Y c a) = + fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + rw [show (∑ c ∈ colors, Y c a) = + ∑ R ∈ descendantsAtScale Q k, X R a from congrFun hsum_eq a] + simpa [gammaSigmaDescendantsAtScaleConst, totalCount, colorCount, haverage_fun_eq, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using haverage + +/-- Averaging over all descendants at scale `k` preserves `Psi_sigma` +concentration for restriction-unit-range-dependent laws. -/ +theorem isBigO_psiSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hk : k ≤ Q.scale) + (hP : RestrictionUnitRangeDependentLaw P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_meas : ∀ R ∈ descendantsAtScale Q k, Measurable (X R)) + (hX_int : ∀ R ∈ descendantsAtScale Q k, Integrable (X R) P) + (hX : ∀ R ∈ descendantsAtScale Q k, IsBigO P (psiSigma σ) (X R) K) + (h_mean : ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) : + IsBigO P (psiSigma σ) + (fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a) + (psiSigmaDescendantsAtScaleConst d k σ * + (Real.sqrt ((descendantsAtScale Q k).card : ℝ) / + ((descendantsAtScale Q k).card : ℝ)) * K) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → RegCoeffField d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + let classCount : ScaleColor d k → ℝ := + fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) + let colorCount : ℝ := (((scaleColorPeriod k) ^ d : ℕ) : ℝ) + let totalCount : ℝ := ((descendantsAtScale Q k).card : ℝ) + have hcolors : colors.Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩⟩ + have hClassCount : ∀ c ∈ colors, 0 < classCount c := by + intro c hc + have hnonempty : (descendantsAtScaleScaleColorClass Q k c).Nonempty := + scaleColorClass_nonempty_of_mem_image (Q := Q) (k := k) (c := c) (by simpa [colors] using hc) + dsimp [classCount] + exact_mod_cast hnonempty.card_pos + have hTotal : 0 < totalCount := by + dsimp [totalCount] + exact_mod_cast (descendantsAtScale_nonempty Q hk).card_pos + have hY : + ∀ c ∈ colors, + IsBigO P (psiSigma σ) (Y c) + (psiSigmaIndependentSumConst σ * Real.sqrt (classCount c) * K) := by + intro c hc + have hcolor := + isBigO_psiSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP hσ hK X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_meas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_int R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + simpa [Y, classCount] using hcolor + have hYmeas : ∀ c ∈ colors, Measurable (Y c) := by + intro c hc + simpa [Y] using + (Finset.measurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => hX_meas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1)) + have hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount := by + simpa [colors, classCount, colorCount, totalCount] using + scaleColor_sqrt_card_sum_le Q k + have haverage := + isBigO_finsetAverage_colorClassSums_psiSigma + (μ := P) (colors := colors) (Y := Y) (classCount := classCount) + (colorCount := colorCount) (totalCount := totalCount) + (C := psiSigmaIndependentSumConst σ) (K := K) (σ := σ) + hσ hcolors hClassCount hTotal (psiSigmaIndependentSumConst_pos σ) hK + hY hYmeas hSqrt + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have haverage_fun_eq : + (fun a => totalCount⁻¹ * ∑ c ∈ colors, Y c a) = + fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + rw [show (∑ c ∈ colors, Y c a) = + ∑ R ∈ descendantsAtScale Q k, X R a from congrFun hsum_eq a] + simpa [psiSigmaDescendantsAtScaleConst, totalCount, colorCount, haverage_fun_eq, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using haverage + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAveragesAEMeasurable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAveragesAEMeasurable.lean new file mode 100644 index 0000000000..8cf1a6478d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DescendantAveragesAEMeasurable.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ConcentrationAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAverages + +/-! # Descendant Averages AEMeasurable -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# A.e.-measurable descendant-average concentration + +This file mirrors the Gamma descendant-average estimate from +`DescendantAverages`, replacing global measurability of the summands by +law-a.e. measurability. The locality and unit-range assumptions are unchanged. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +variable {Ω κ : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + +private theorem scaleColorClass_nonempty_of_mem_image {d : ℕ} + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hc : c ∈ (descendantsAtScale Q k).image (cubeScaleColor k)) : + (descendantsAtScaleScaleColorClass Q k c).Nonempty := by + rcases Finset.mem_image.mp hc with ⟨R, hR, rfl⟩ + exact ⟨R, mem_descendantsAtScaleScaleColorClass_self hR⟩ + +private theorem scaleColor_sqrt_card_sum_le {d : ℕ} + (Q : TriadicCube d) (k : ℤ) : + ∑ c ∈ (descendantsAtScale Q k).image (cubeScaleColor k), + Real.sqrt (((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt (((descendantsAtScale Q k).card : ℝ)) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + have hsum_card_eq : + ∑ c ∈ colors, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) = + ((descendantsAtScale Q k).card : ℝ) := by + rw [← Nat.cast_sum] + exact_mod_cast (card_descendantsAtScale_eq_sum_card_scaleColorClass_image Q k).symm + have hsqrt_sum_le : + ∑ c ∈ colors, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (colors.card : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + simpa [hsum_card_eq] using + (Real.sum_sqrt_mul_sqrt_le + (s := colors) + (f := fun _ => (1 : ℝ)) + (g := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (hf := by intro c; positivity) + (hg := by intro c; positivity)) + have hcolors_card_le : + (colors.card : ℝ) ≤ ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (card_image_cubeScaleColor_descendantsAtScale_le Q k) + have hsqrt_colors_le : + Real.sqrt (colors.card : ℝ) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := + Real.sqrt_le_sqrt hcolors_card_le + exact hsqrt_sum_le.trans + (mul_le_mul_of_nonneg_right hsqrt_colors_le (by positivity)) + +private theorem gammaSigmaIndependentSumConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaSigmaIndependentSumConst σ := by + dsimp [gammaSigmaIndependentSumConst] + by_cases hσ_lt : σ < 1 + · simpa [hσ_lt, gammaSigmaHeavyTailEndpointConst] using! + (mul_pos + (Real.rpow_pos_of_pos (by norm_num : 0 < (2 : ℝ)) _) + (IndependentSums.gammaSigmaHeavyTailConst_pos hσ)) + · have hσ_one : 1 ≤ σ := le_of_not_gt hσ_lt + dsimp [gammaSigmaExpRegimeEndpointConst] + by_cases hσ_eq : σ = 1 + · subst σ + simpa [hσ_lt, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using! + (mul_pos (by norm_num : 0 < (2 : ℝ)) + IndependentSums.gammaOneExpRegimeConst_pos) + · have hExpConst_pos : 0 < IndependentSums.gammaSigmaExpRegimeConst σ := by + dsimp [IndependentSums.gammaSigmaExpRegimeConst] + exact lt_of_lt_of_le + (mul_pos (by positivity) (IndependentSums.gammaMomentConst_pos hσ)) + (le_max_left _ _) + simpa [hσ_lt, hσ_eq, gammaSigmaExpRegimeEndpointConst, + IndependentSums.gammaSigmaExpRegimeEndpointConst] using! + (mul_pos (by norm_num : 0 < (2 : ℝ)) hExpConst_pos) + +private theorem inv_mul_const_sum_sqrt_scale_le + [DecidableEq κ] (colors : Finset κ) {A C K colorCount totalCount : ℝ} + {classCount : κ → ℝ} + (hA : 0 ≤ A) (hC : 0 ≤ C) (hK : 0 ≤ K) (hTotal : 0 < totalCount) + (hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount) : + totalCount⁻¹ * (A * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K) ≤ + A * C * (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K := by + have hCK_nonneg : 0 ≤ C * K := mul_nonneg hC hK + have hsum_eq : + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) = + (C * K) * ∑ c ∈ colors, Real.sqrt (classCount c) := by + calc + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) + = ∑ c ∈ colors, (C * K) * Real.sqrt (classCount c) := by + refine Finset.sum_congr rfl ?_ + intro c hc + ring + _ = (C * K) * ∑ c ∈ colors, Real.sqrt (classCount c) := by + rw [Finset.mul_sum] + have hsum_le : + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) ≤ + (C * K) * (Real.sqrt colorCount * Real.sqrt totalCount) := by + rw [hsum_eq] + exact mul_le_mul_of_nonneg_left hSqrt hCK_nonneg + calc + totalCount⁻¹ * (A * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K) + = (totalCount⁻¹ * A) * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K := by + ring + _ ≤ (totalCount⁻¹ * A) * + ((C * K) * (Real.sqrt colorCount * Real.sqrt totalCount)) := by + exact mul_le_mul_of_nonneg_left hsum_le + (mul_nonneg (inv_nonneg.mpr hTotal.le) hA) + _ = A * C * (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K := by + rw [div_eq_mul_inv] + ring + +theorem isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw_aemeasurable + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hP : RestrictionUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_aemeas : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, AEMeasurable (X R) P) + (hX : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsBigO P (gammaSigma σ) (X R) K) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a) + (gammaSigmaIndependentSumConst σ * + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K) := by + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → RegCoeffField d → ℝ := + fun R => X R.1 + have h_indep : ProbabilityTheory.iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have h_aemeas : ∀ R, AEMeasurable (Y R) P := by + intro R + exact hX_aemeas R.1 R.2 + have hY : + ∀ R ∈ S.attach, IsBigO P (gammaSigma σ) (Y R) K := by + intro R _hR + exact hX R.1 R.2 + have h_meanY : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hsum := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_aemeasurable + (μ := P) (X := Y) (s := S.attach) (σ := σ) (K := K) + h_indep h_aemeas hS_attach hσ₀ hσ₂ hK hY h_meanY + simpa [S, hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + rw [isBigO_gammaSigma_iff] + intro t ht + have htail_empty : + absTailEvent (fun _ : RegCoeffField d => (0 : ℝ)) 0 = ∅ := by + ext a + simp [absTailEvent] + simpa [S, hS_empty, htail_empty, absTailEvent, upperTailEvent] using + (show (0 : ℝ) ≤ Real.exp (-(t ^ σ)) by positivity) + +theorem isBigO_finsetAverage_colorClassSums_gammaSigma_aemeasurable + [DecidableEq κ] [IsFiniteMeasure μ] + (colors : Finset κ) {Y : κ → Ω → ℝ} + {classCount : κ → ℝ} {colorCount totalCount C K σ : ℝ} + (hσ : 0 < σ) (hcolors : colors.Nonempty) + (hClassCount : ∀ c ∈ colors, 0 < classCount c) + (hTotal : 0 < totalCount) + (hC : 0 < C) (hK : 0 < K) + (hY : + ∀ c ∈ colors, + IsBigO μ (gammaSigma σ) (Y c) + (C * Real.sqrt (classCount c) * K)) + (hY_aemeas : ∀ c, AEMeasurable (Y c) μ) + (hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount) : + IsBigO μ (gammaSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (gammaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) := by + let a : κ → ℝ := fun c => C * Real.sqrt (classCount c) * K + have ha : ∀ c ∈ colors, 0 < a c := by + intro c hc + exact mul_pos (mul_pos hC (Real.sqrt_pos.2 (hClassCount c hc))) hK + have hsum : + IsBigO μ (gammaSigma σ) (fun ω => ∑ c ∈ colors, Y c ω) + (gammaTriangleConst σ * ∑ c ∈ colors, a c) := by + exact isBigO_finset_sum_of_isBigO_gammaSigma_aemeasurable + (μ := μ) (s := colors) (X := Y) (a := a) (σ := σ) + hσ hcolors ha (by simpa [a] using hY) hY_aemeas + have hscaled : + IsBigO μ (gammaSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (totalCount⁻¹ * (gammaTriangleConst σ * ∑ c ∈ colors, a c)) := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + IndependentSums.IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => ∑ c ∈ colors, Y c ω) + (A := gammaTriangleConst σ * ∑ c ∈ colors, a c) + (c := totalCount⁻¹) (inv_nonneg.mpr hTotal.le) hsum + refine IndependentSums.IsBigO.mono_scale (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (A := totalCount⁻¹ * (gammaTriangleConst σ * ∑ c ∈ colors, a c)) + (B := gammaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) + hscaled ?_ + have hGamma_nonneg : 0 ≤ gammaTriangleConst σ := by + have hGrowth_nonneg : 0 ≤ IndependentSums.gammaGrowthConst σ := + le_trans zero_le_two (IndependentSums.two_le_gammaGrowthConst σ) + dsimp [gammaTriangleConst, IndependentSums.gammaTriangleConst] + exact mul_nonneg (by norm_num) (Real.rpow_nonneg hGrowth_nonneg _) + simpa [a, mul_assoc, mul_left_comm, mul_comm] using + inv_mul_const_sum_sqrt_scale_le (colors := colors) + (A := gammaTriangleConst σ) (C := C) (K := K) + (colorCount := colorCount) (totalCount := totalCount) + (classCount := classCount) hGamma_nonneg hC.le hK.le hTotal hSqrt + +theorem isBigO_gammaSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw_aemeasurable + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {σ K : ℝ} + (hk : k ≤ Q.scale) + (hP : RestrictionUnitRangeDependentLaw P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_aemeas : ∀ R ∈ descendantsAtScale Q k, AEMeasurable (X R) P) + (hX : ∀ R ∈ descendantsAtScale Q k, IsBigO P (gammaSigma σ) (X R) K) + (h_mean : ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) : + IsBigO P (gammaSigma σ) + (fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a) + (gammaSigmaDescendantsAtScaleConst d k σ * + (Real.sqrt ((descendantsAtScale Q k).card : ℝ) / + ((descendantsAtScale Q k).card : ℝ)) * K) := by + let colors : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + let Y : ScaleColor d k → RegCoeffField d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + let classCount : ScaleColor d k → ℝ := + fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) + let colorCount : ℝ := (((scaleColorPeriod k) ^ d : ℕ) : ℝ) + let totalCount : ℝ := ((descendantsAtScale Q k).card : ℝ) + have hcolors : colors.Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩⟩ + have hClassCount : ∀ c ∈ colors, 0 < classCount c := by + intro c hc + have hnonempty : (descendantsAtScaleScaleColorClass Q k c).Nonempty := + scaleColorClass_nonempty_of_mem_image (Q := Q) (k := k) (c := c) (by simpa [colors] using hc) + dsimp [classCount] + exact_mod_cast hnonempty.card_pos + have hTotal : 0 < totalCount := by + dsimp [totalCount] + exact_mod_cast (descendantsAtScale_nonempty Q hk).card_pos + have hY : + ∀ c ∈ colors, + IsBigO P (gammaSigma σ) (Y c) + (gammaSigmaIndependentSumConst σ * Real.sqrt (classCount c) * K) := by + intro c hc + have hcolor := + isBigO_gammaSigma_finsetSum_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw_aemeasurable + (Q := Q) (k := k) (c := c) (P := P) hP hσ₀ hσ₂ hK X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_aemeas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + simpa [Y, classCount] using hcolor + have hYaemeas : ∀ c, AEMeasurable (Y c) P := by + intro c + convert + (Finset.aemeasurable_sum (descendantsAtScaleScaleColorClass Q k c) + (fun R hR => hX_aemeas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + ) using 1 + ext a + simp [Y] + have hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount := by + simpa [colors, classCount, colorCount, totalCount] using + scaleColor_sqrt_card_sum_le Q k + have haverage := + isBigO_finsetAverage_colorClassSums_gammaSigma_aemeasurable + (μ := P) colors (Y := Y) (classCount := classCount) + (colorCount := colorCount) (totalCount := totalCount) + (C := gammaSigmaIndependentSumConst σ) (K := K) (σ := σ) + hσ₀ hcolors hClassCount hTotal (gammaSigmaIndependentSumConst_pos hσ₀) hK + hY hYaemeas hSqrt + have hsum_eq : + (fun a => ∑ c ∈ colors, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ colors, Y c a = + ∑ c ∈ colors, ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = ∑ R ∈ colors.biUnion (descendantsAtScaleScaleColorClass Q k), X R a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ R ∈ descendantsAtScale Q k, X R a := by + rw [show colors.biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k by + simpa [colors] using descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + have haverage_fun_eq : + (fun a => totalCount⁻¹ * ∑ c ∈ colors, Y c a) = + fun a => ((descendantsAtScale Q k).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + rw [show (∑ c ∈ colors, Y c a) = + ∑ R ∈ descendantsAtScale Q k, X R a from congrFun hsum_eq a] + simpa [gammaSigmaDescendantsAtScaleConst, totalCount, colorCount, + haverage_fun_eq, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using haverage + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationLaw.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationLaw.lean new file mode 100644 index 0000000000..4560108934 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationLaw.lean @@ -0,0 +1,1039 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.Dilation +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw + +/-! # Dilation Law -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Pointwise + +noncomputable section + +/-! +# Dilation of Chapter 4 laws + +This file starts the law-facing dilation API used in Section 5.5. The +normalized law is the push-forward of the original coefficient law by the +triadic pullback which sends scale `k` in the original coordinates to scale +zero in normalized coordinates. +-/ + +/-- Scale-normalize a carrier coefficient law by pulling honest fields back under +the triadic dilation `x ↦ 3^k x` (the carrier endomorphism `dilateReg`). -/ +noncomputable def restrictionScaleNormalizedLaw {d : ℕ} (k : ℕ) (P : RestrictionCoeffLaw d) : + RestrictionCoeffLaw d := + Measure.map (dilateReg (-(k : ℤ))) P + +/-- The existing probability-layer rescaling is the same map as the Ch2 +dilation by the negative natural scale (raw coefficient fields; kept as the public +raw-layer bridge still consumed by the coarse-graining and high-contrast tracks). -/ +theorem rescaleCoeffField_eq_dilateCoeffField_neg_nat {d : ℕ} (k : ℕ) : + rescaleCoeffField (d := d) k = Ch02.dilateCoeffField (-(k : ℤ)) := by + funext a x i j + have hvec : Ch02.undilateVec (-(k : ℤ)) x = triadicDilateVec k x := by + ext r + simp [Ch02.undilateVec, Ch02.triadicDilationFactor, triadicDilateVec, + smul_eq_mul, zpow_neg] + simp [rescaleCoeffField, Ch02.dilateCoeffField, hvec] + +/-- The honest sample of a triadically rescaled carrier field is the raw triadic +rescaling of its honest sample (`rfl`). -/ +theorem rescaleReg_toFun {d : ℕ} (k : ℕ) (a : RegCoeffField d) : + (rescaleReg k a).toFun = rescaleCoeffField k a.toFun := rfl + +/-- The honest sample of a triadically dilated carrier field is the raw triadic +dilation of its honest sample (`rfl`). -/ +theorem dilateReg_toFun {d : ℕ} (k : ℤ) (a : RegCoeffField d) : + (dilateReg k a).toFun = Ch02.dilateCoeffField k a.toFun := rfl + +/-- The carrier triadic rescaling by `3^k` is the carrier dilation by the negative +natural scale (carrier analog of `rescaleCoeffField_eq_dilateCoeffField_neg_nat`). -/ +theorem rescaleReg_eq_dilateReg_neg_nat {d : ℕ} (k : ℕ) : + rescaleReg (d := d) k = dilateReg (-(k : ℤ)) := by + funext a + apply RegCoeffField.ext + intro x + have hs : ((3 : ℝ) ^ k) = (((3 : ℝ) ^ (-(k : ℤ)))⁻¹) := by + rw [zpow_neg, zpow_natCast, inv_inv] + simp only [rescaleReg_apply, dilateReg_apply, hs] + +/-- `restrictionScaleNormalizedLaw` is the pushforward under the carrier triadic rescaling. -/ +theorem restrictionScaleNormalizedLaw_eq_map_rescaleReg {d : ℕ} (k : ℕ) (P : RestrictionCoeffLaw d) : + restrictionScaleNormalizedLaw k P = Measure.map (rescaleReg k) P := by + rw [restrictionScaleNormalizedLaw, rescaleReg_eq_dilateReg_neg_nat] + +/-- A scale-normalized probability law is again a probability law. -/ +theorem isProbabilityMeasure_restrictionScaleNormalizedLaw {d : ℕ} (k : ℕ) (P : RestrictionCoeffLaw d) + [IsProbabilityMeasure P] : + IsProbabilityMeasure (restrictionScaleNormalizedLaw k P) := by + rw [restrictionScaleNormalizedLaw] + exact Measure.isProbabilityMeasure_map (measurable_dilateReg (d := d) (-(k : ℤ))).aemeasurable + +/-- Bochner integral under a scale-normalized law. -/ +theorem integral_restrictionScaleNormalizedLaw {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] {P : RestrictionCoeffLaw d} (k : ℕ) + (X : RegCoeffField d → E) + (hX : AEStronglyMeasurable X (restrictionScaleNormalizedLaw k P)) : + ∫ a, X a ∂restrictionScaleNormalizedLaw k P = + ∫ a, X (dilateReg (-(k : ℤ)) a) ∂P := by + rw [restrictionScaleNormalizedLaw] + exact MeasureTheory.integral_map + (measurable_dilateReg (d := d) (-(k : ℤ))).aemeasurable hX + +/-- Integrability under a scale-normalized law is integrability after +composing with the defining dilation. -/ +theorem integrable_restrictionScaleNormalizedLaw_iff {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] {P : RestrictionCoeffLaw d} (k : ℕ) + {X : RegCoeffField d → E} + (hX : AEStronglyMeasurable X (restrictionScaleNormalizedLaw k P)) : + Integrable X (restrictionScaleNormalizedLaw k P) ↔ + Integrable (fun a => X (dilateReg (-(k : ℤ)) a)) P := by + simpa [restrictionScaleNormalizedLaw, Function.comp] using! + (integrable_map_measure + (μ := P) (f := dilateReg (d := d) (-(k : ℤ))) (g := X) + hX (measurable_dilateReg (d := d) (-(k : ℤ))).aemeasurable) + +/-- Triadic dilation preserves Borel measurability of ambient regions: the image +of a measurable set under scaling by `3^k` is the preimage of that set under +scaling by `(3^k)⁻¹`, hence measurable. -/ +theorem measurableSet_triadicDilateSet {d : ℕ} (k : ℕ) {U : Set (Vec d)} + (hU : MeasurableSet U) : MeasurableSet (triadicDilateSet k U) := by + have hc : ((3 : ℝ) ^ k) ≠ 0 := by positivity + have hg : Measurable (fun x : Vec d => fun i => ((3 : ℝ) ^ k)⁻¹ * x i) := + measurable_pi_lambda _ (fun i => (measurable_pi_apply i).const_mul _) + have hset : triadicDilateSet k U + = (fun x : Vec d => fun i => ((3 : ℝ) ^ k)⁻¹ * x i) ⁻¹' U := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + have hxy : (fun i => ((3 : ℝ) ^ k)⁻¹ * triadicDilateVec k y i) = y := by + funext i + simp only [triadicDilateVec] + rw [← mul_assoc, inv_mul_cancel₀ hc, one_mul] + simp only [Set.mem_preimage, hxy] + exact hy + · intro hx + refine ⟨fun i => ((3 : ℝ) ^ k)⁻¹ * x i, hx, ?_⟩ + funext i + simp only [triadicDilateVec] + rw [← mul_assoc, mul_inv_cancel₀ hc, one_mul] + rw [hset] + exact hU.preimage hg + +/-- **Restriction/dilation commutation on the carrier.** Restricting a triadically +rescaled field to `U` equals rescaling the field restricted to the dilated set +`triadicDilateSet k U` — the escape route recorded in the LOCALSIGMA plan. -/ +theorem restrictReg_comp_rescaleReg_eq {d : ℕ} (k : ℕ) (U : Set (Vec d)) + (hU : MeasurableSet U) : + restrictReg U hU ∘ rescaleReg k + = rescaleReg k + ∘ restrictReg (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU) := by + funext a + apply RegCoeffField.ext + intro x + have hc : ((3 : ℝ) ^ k) ≠ 0 := by positivity + have hmem : (((3 : ℝ) ^ k) • x) ∈ triadicDilateSet k U ↔ x ∈ U := by + constructor + · rintro ⟨y, hy, hxy⟩ + have hxeq : x = y := by + funext i + have := congrFun hxy i + simp only [triadicDilateVec, Pi.smul_apply, smul_eq_mul] at this + exact mul_left_cancel₀ hc this + rwa [hxeq] + · intro hx + exact ⟨x, hx, by funext i; simp [triadicDilateVec, Pi.smul_apply, smul_eq_mul]⟩ + have htdv : triadicDilateVec k x = ((3 : ℝ) ^ k) • x := by + funext i; simp [triadicDilateVec, Pi.smul_apply, smul_eq_mul] + simp only [Function.comp_apply, restrictReg_apply, rescaleReg_apply, rescaleReg_toFun] + by_cases hx : x ∈ U + · rw [Set.indicator_of_mem hx, Set.indicator_of_mem (hmem.mpr hx)] + simp only [rescaleCoeffField, htdv] + · rw [Set.indicator_of_notMem hx, Set.indicator_of_notMem (fun h => hx (hmem.mp h))] + +/-- Pullback by carrier triadic rescaling sends restriction-local information on +`U` to restriction-local information on the dilated set. -/ +theorem measurable_rescaleReg_restrictionSigmaR {d : ℕ} + (k : ℕ) (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable (RegCoeffField d) (RegCoeffField d) + (RestrictionSigmaR (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) + (RestrictionSigmaR U hU) + (rescaleReg k) := by + rw [measurable_iff_comap_le, RestrictionSigmaR, MeasurableSpace.comap_comp] + have hmeas : + @Measurable (RegCoeffField d) (RegCoeffField d) + (RestrictionSigmaR (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) _ + (restrictReg U hU ∘ rescaleReg k) := by + rw [restrictReg_comp_rescaleReg_eq k U hU] + exact (measurable_rescaleReg k).comp + (measurable_restrictReg_restrictionSigmaR (triadicDilateSet k U) + (measurableSet_triadicDilateSet k hU)) + exact hmeas.comap_le + +private theorem localTestObservable_dilateCoeffField_int_eq_const_mul + {d : ℕ} (n : ℤ) (e e' : Vec d) (φ : Vec d → ℝ) (a : CoeffField d) : + localTestObservable e e' φ (Ch02.dilateCoeffField n a) = + (((Ch02.triadicDilationFactor n)⁻¹) ^ d)⁻¹ * + localTestObservable e e' + (fun y : Vec d => φ (((Ch02.triadicDilationFactor n)⁻¹)⁻¹ • y)) a := by + let q : ℝ := (Ch02.triadicDilationFactor n)⁻¹ + have hq : 0 < q := inv_pos.mpr (Ch02.triadicDilationFactor_pos n) + let f : Vec d → ℝ := fun y => vecDot e' (matVecMul (a y) e) * φ (q⁻¹ • y) + have hcv := Ch01.setIntegral_comp_smul_of_pos + (d := d) (E := ℝ) (r := q) hq Set.univ f + have huniv : q • (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨q⁻¹ • y, trivial, ?_⟩ + ext i + simp [Pi.smul_apply, smul_eq_mul, hq.ne'] + have hundilate : ∀ x : Vec d, Ch02.undilateVec n x = q • x := by + intro x + ext i + simp [Ch02.undilateVec, q, Pi.smul_apply, smul_eq_mul] + unfold localTestObservable + calc + ∫ x, (vecDot e' (matVecMul (Ch02.dilateCoeffField n a x) e) * φ x) ∂volume + = ∫ x, f (q • x) ∂volume := by + apply integral_congr_ae + filter_upwards with x + have hqx : q⁻¹ • (q • x) = x := by + ext i + simp [Pi.smul_apply, smul_eq_mul, hq.ne'] + simp [f, Ch02.dilateCoeffField, hundilate x, hqx] + _ = ∫ x in (Set.univ : Set (Vec d)), f (q • x) ∂volume := by simp + _ = (q ^ d)⁻¹ • ∫ y in q • (Set.univ : Set (Vec d)), f y ∂volume := hcv + _ = (q ^ d)⁻¹ * + ∫ y, (vecDot e' (matVecMul (a y) e) * + φ (((Ch02.triadicDilationFactor n)⁻¹)⁻¹ • y)) ∂volume := by + simp [f, q, huniv] + +private theorem localFiniteTestObservable_dilateCoeffField_int_eq {d : ℕ} {ι : Type} + (n : ℤ) (I : Finset ι) (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) + (a : CoeffField d) : + localFiniteTestObservable I e e' φ (Ch02.dilateCoeffField n a) = + localFiniteTestObservable I e e' + (fun k y => (((Ch02.triadicDilationFactor n)⁻¹) ^ d)⁻¹ * + φ k (((Ch02.triadicDilationFactor n)⁻¹)⁻¹ • y)) a := by + let q : ℝ := (Ch02.triadicDilationFactor n)⁻¹ + have hq : 0 < q := inv_pos.mpr (Ch02.triadicDilationFactor_pos n) + let c : ℝ := (q ^ d)⁻¹ + let f : Vec d → ℝ := fun y => + ∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * φ k (q⁻¹ • y) + have hcv := Ch01.setIntegral_comp_smul_of_pos + (d := d) (E := ℝ) (r := q) hq Set.univ f + have huniv : q • (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨q⁻¹ • y, trivial, ?_⟩ + ext i + simp [Pi.smul_apply, smul_eq_mul, hq.ne'] + have hundilate : ∀ x : Vec d, Ch02.undilateVec n x = q • x := by + intro x + ext i + simp [Ch02.undilateVec, q, Pi.smul_apply, smul_eq_mul] + unfold localFiniteTestObservable + calc + ∫ x, (∑ k ∈ I, + vecDot (e' k) (matVecMul (Ch02.dilateCoeffField n a x) (e k)) * φ k x) ∂volume + = ∫ x, f (q • x) ∂volume := by + apply integral_congr_ae + filter_upwards with x + have hqx : q⁻¹ • (q • x) = x := by + ext i + simp [Pi.smul_apply, smul_eq_mul, hq.ne'] + simp [f, Ch02.dilateCoeffField, hundilate x, hqx] + _ = ∫ x in (Set.univ : Set (Vec d)), f (q • x) ∂volume := by simp + _ = (q ^ d)⁻¹ • ∫ y in q • (Set.univ : Set (Vec d)), f y ∂volume := hcv + _ = c * ∫ y, f y ∂volume := by simp [c, huniv] + _ = ∫ y, c * f y ∂volume := by + exact (integral_const_mul c f).symm + _ = ∫ y, (∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * + ((((Ch02.triadicDilationFactor n)⁻¹) ^ d)⁻¹ * + φ k (((Ch02.triadicDilationFactor n)⁻¹)⁻¹ • y))) ∂volume := by + apply integral_congr_ae + filter_upwards with y + simp [f, c, q, Finset.mul_sum] + ring_nf + +/-- The carrier triadic rescaling is a measurable equivalence, with inverse the +carrier dilation by the positive scale. -/ +private noncomputable def rescaleRegMeasurableEquiv {d : ℕ} (k : ℕ) : + RegCoeffField d ≃ᵐ RegCoeffField d where + toEquiv := + { toFun := rescaleReg k + invFun := dilateReg (k : ℤ) + left_inv := by + intro a + apply RegCoeffField.ext + intro x + simp only [dilateReg_apply, rescaleReg_apply, smul_smul] + rw [zpow_natCast, mul_inv_cancel₀ (by positivity : ((3 : ℝ) ^ k) ≠ 0), one_smul] + right_inv := by + intro a + apply RegCoeffField.ext + intro x + simp only [dilateReg_apply, rescaleReg_apply, smul_smul] + rw [zpow_natCast, inv_mul_cancel₀ (by positivity : ((3 : ℝ) ^ k) ≠ 0), one_smul] } + measurable_toFun := measurable_rescaleReg k + measurable_invFun := measurable_dilateReg (d := d) (k : ℤ) + +private theorem nullMeasurableSet_map_of_preimage_measurableEquiv + {α β : Type*} [MeasurableSpace α] [MeasurableSpace β] + {μ : Measure α} (e : α ≃ᵐ β) {s : Set β} + (hs : NullMeasurableSet (e ⁻¹' s) μ) : + NullMeasurableSet s (Measure.map e μ) := by + rcases hs with ⟨t, ht, hst⟩ + refine ⟨e '' t, e.measurableEmbedding.measurableSet_image' ht, ?_⟩ + unfold Filter.EventuallyEq + rw [e.measurableEmbedding.ae_map_iff] + filter_upwards [hst] with a ha + apply propext + constructor + · intro hs_ea + exact ⟨a, ha.mp hs_ea, rfl⟩ + · rintro ⟨b, hb, hbeq⟩ + have hb_eq : b = a := e.injective hbeq + subst hb_eq + exact ha.mpr hb + +private theorem indep_map_measurableEquiv + {α β : Type*} [mα : MeasurableSpace α] [mβ : MeasurableSpace β] + {μ : Measure α} (e : α ≃ᵐ β) {m1 m2 : MeasurableSpace β} + (h : @ProbabilityTheory.Indep α + (MeasurableSpace.comap (fun x : α => e x) m1) + (MeasurableSpace.comap (fun x : α => e x) m2) mα μ) : + @ProbabilityTheory.Indep β m1 m2 mβ + (@Measure.map α β mα mβ (fun x : α => e x) μ) := by + refine (ProbabilityTheory.Indep_iff + (m₁ := m1) (m₂ := m2) (_mΩ := mβ) + (μ := (@Measure.map α β mα mβ (fun x : α => e x) μ))).2 ?_ + intro s t hs ht + have hemb : @MeasurableEmbedding α β mα mβ (fun x : α => e x) := by + exact @MeasurableEquiv.measurableEmbedding α β mα mβ e + have h_ind := (ProbabilityTheory.Indep_iff + (m₁ := MeasurableSpace.comap (fun x : α => e x) m1) + (m₂ := MeasurableSpace.comap (fun x : α => e x) m2) + (_mΩ := mα) (μ := μ)).1 h + have hspre : @MeasurableSet α + (MeasurableSpace.comap (fun x : α => e x) m1) + ((fun x : α => e x) ⁻¹' s) := by + exact ⟨s, hs, rfl⟩ + have htpre : @MeasurableSet α + (MeasurableSpace.comap (fun x : α => e x) m2) + ((fun x : α => e x) ⁻¹' t) := by + exact ⟨t, ht, rfl⟩ + have hst := h_ind ((fun x : α => e x) ⁻¹' s) + ((fun x : α => e x) ⁻¹' t) hspre htpre + have hmap_inter : + (@Measure.map α β mα mβ (fun x : α => e x) μ) (s ∩ t) = + μ ((fun x : α => e x) ⁻¹' (s ∩ t)) := by + exact @MeasurableEmbedding.map_apply α β mα mβ + (fun x : α => e x) hemb μ (s ∩ t) + have hmap_s : + (@Measure.map α β mα mβ (fun x : α => e x) μ) s = + μ ((fun x : α => e x) ⁻¹' s) := by + exact @MeasurableEmbedding.map_apply α β mα mβ + (fun x : α => e x) hemb μ s + have hmap_t : + (@Measure.map α β mα mβ (fun x : α => e x) μ) t = + μ ((fun x : α => e x) ⁻¹' t) := by + exact @MeasurableEmbedding.map_apply α β mα mβ + (fun x : α => e x) hemb μ t + calc + (@Measure.map α β mα mβ (fun x : α => e x) μ) (s ∩ t) + = μ ((fun x : α => e x) ⁻¹' (s ∩ t)) := hmap_inter + _ = μ (((fun x : α => e x) ⁻¹' s) ∩ + ((fun x : α => e x) ⁻¹' t)) := by rfl + _ = μ ((fun x : α => e x) ⁻¹' s) * + μ ((fun x : α => e x) ⁻¹' t) := hst + _ = (@Measure.map α β mα mβ (fun x : α => e x) μ) s * + (@Measure.map α β mα mβ (fun x : α => e x) μ) t := by + rw [hmap_s, hmap_t] + +private theorem dist_triadicDilateVec {d : ℕ} (k : ℕ) (x y : Vec d) : + dist (triadicDilateVec k x) (triadicDilateVec k y) = + ((3 : ℝ) ^ k) * dist x y := by + let r : ℝ := (3 : ℝ) ^ k + have hr : 0 ≤ r := by positivity + have hsub : triadicDilateVec k x - triadicDilateVec k y = r • (x - y) := by + ext i + simp only [triadicDilateVec, r, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + ring + rw [dist_eq_norm, dist_eq_norm, hsub, norm_smul_of_nonneg hr] + +private theorem AreUnitSeparated.triadicDilateSet {d : ℕ} {U V : Set (Vec d)} + (hUV : AreUnitSeparated U V) (k : ℕ) : + AreUnitSeparated (triadicDilateSet k U) (triadicDilateSet k V) := by + intro x y hx hy + rcases hx with ⟨x0, hx0, rfl⟩ + rcases hy with ⟨y0, hy0, rfl⟩ + rw [dist_triadicDilateVec] + have hsep : 1 ≤ dist x0 y0 := hUV hx0 hy0 + have hscale : 1 ≤ ((3 : ℝ) ^ k) := by + exact (one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) : 1 ≤ (3 : ℝ) ^ k) + have hmul : (1 : ℝ) * 1 ≤ ((3 : ℝ) ^ k) * dist x0 y0 := by + exact mul_le_mul hscale hsep zero_le_one (by positivity) + simpa using hmul + +namespace RestrictionUnitRangeDependentLaw + +/-- Restriction-unit-range dependence is preserved by triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionUnitRangeDependentLaw P) (k : ℕ) : + RestrictionUnitRangeDependentLaw (restrictionScaleNormalizedLaw k P) := by + intro U V hU hV hUV + let e := rescaleRegMeasurableEquiv (d := d) k + have hIndepDilated : ProbabilityTheory.Indep + (RestrictionSigmaR (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) + (RestrictionSigmaR (triadicDilateSet k V) (measurableSet_triadicDilateSet k hV)) P := + hP (triadicDilateSet k U) (triadicDilateSet k V) + (measurableSet_triadicDilateSet k hU) (measurableSet_triadicDilateSet k hV) + (AreUnitSeparated.triadicDilateSet hUV k) + have hU_le : MeasurableSpace.comap + (fun a : RegCoeffField d => rescaleReg k a) (RestrictionSigmaR U hU) ≤ + RestrictionSigmaR (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU) := by + exact (measurable_rescaleReg_restrictionSigmaR (d := d) k U hU).comap_le + have hV_le : MeasurableSpace.comap + (fun a : RegCoeffField d => rescaleReg k a) (RestrictionSigmaR V hV) ≤ + RestrictionSigmaR (triadicDilateSet k V) (measurableSet_triadicDilateSet k hV) := by + exact (measurable_rescaleReg_restrictionSigmaR (d := d) k V hV).comap_le + have hComap : ProbabilityTheory.Indep + (MeasurableSpace.comap + (fun a : RegCoeffField d => rescaleReg k a) (RestrictionSigmaR U hU)) + (MeasurableSpace.comap + (fun a : RegCoeffField d => rescaleReg k a) (RestrictionSigmaR V hV)) P := + ProbabilityTheory.indep_of_indep_of_le_right + (ProbabilityTheory.indep_of_indep_of_le_left hIndepDilated hU_le) hV_le + have hmap := indep_map_measurableEquiv (μ := P) e + (m1 := RestrictionSigmaR U hU) (m2 := RestrictionSigmaR V hV) hComap + simpa [restrictionScaleNormalizedLaw_eq_map_rescaleReg, e] using! hmap + +end RestrictionUnitRangeDependentLaw + +private theorem dilatedCoeffFamily_coeffOn_ae_eq_rescaleCoeffField + {d : ℕ} {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) (Q : TriadicCube d) : + ((Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha)).coeffOn Q).toCoeffField + =ᵐ[volumeMeasureOn (openCubeSet Q)] + (rescaleReg k a).toFun := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hD := + Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F Qsrc + have hcoeff' : + ((Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F).coeffOn + (Ch02.dilateCube (-(k : ℤ)) Qsrc)).toCoeffField + =ᵐ[volumeMeasureOn (openCubeSet Q)] + Ch02.dilateCoeffField (-(k : ℤ)) a.toFun := by + simpa [F, Qsrc, htarget] using hD.coeff_ae_eq + have hcast := hcoeff' + rw [htarget] at hcast + simpa [F, rescaleReg_toFun, rescaleCoeffField_eq_dilateCoeffField_neg_nat k] using hcast + +namespace AELocallyUniformlyEllipticField + +/-- Locally a.e.-uniform ellipticity is preserved by triadic rescaling of the +carrier coefficient field. -/ +theorem of_rescaleCoeffField {d : ℕ} {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) : + AELocallyUniformlyEllipticField (Homogenization.rescaleReg k a) := by + intro Q + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let bQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := B.coeffOn Q + have hcoeff : + bQ.toCoeffField =ᵐ[volumeMeasureOn (openCubeSet Q)] + (Homogenization.rescaleReg k a).toFun := by + simpa [bQ, B] using dilatedCoeffFamily_coeffOn_ae_eq_rescaleCoeffField ha k Q + refine ⟨bQ.lam, bQ.Lam, bQ.lam_pos, bQ.lam_le_Lam, ?_⟩ + refine ⟨measurableSet_openCubeSet Q, ?_, ?_⟩ + · intro i j + refine (bQ.aeStronglyMeasurable i j).congr ?_ + filter_upwards [hcoeff] with x hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [restrictCoeffField, hxQ, hx] + · simp [restrictCoeffField, hxQ] + · filter_upwards [bQ.aeElliptic, hcoeff] with x hxEll hx + simpa [hx] using hxEll + +end AELocallyUniformlyEllipticField + +namespace AELocallyUniformlyEllipticLaw + +/-- A locally a.e.-uniformly elliptic law remains so after triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : AELocallyUniformlyEllipticLaw P) (k : ℕ) : + AELocallyUniformlyEllipticLaw (restrictionScaleNormalizedLaw k P) := by + rw [restrictionScaleNormalizedLaw_eq_map_rescaleReg] + exact ((rescaleRegMeasurableEquiv (d := d) k).measurableEmbedding.ae_map_iff).2 <| by + filter_upwards [hP] with a ha + exact ha.of_rescaleCoeffField k + +end AELocallyUniformlyEllipticLaw + +namespace RestrictionLawCarrier + +/-- The Chapter 4 law carrier is preserved by triadic scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) (k : ℕ) : + RestrictionLawCarrier (restrictionScaleNormalizedLaw k P) := by + let : IsProbabilityMeasure P := hP.isProbability + let : IsProbabilityMeasure (restrictionScaleNormalizedLaw k P) := + isProbabilityMeasure_restrictionScaleNormalizedLaw k P + exact lawCarrier_of_aeLocallyUniformlyElliptic + (hP.ae_locally_uniformly_elliptic.scaleNormalized k) + +end RestrictionLawCarrier + +theorem triadicCoeffFamily_rescaleCoeffField_aeeq_dilate + {d : ℕ} {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) : + Ch02.TriadicCoeffFamily.AEEq + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k)) + (Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha)) := by + intro Q + change + (rescaleReg k a).toFun + =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] + ((Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha)).coeffOn Q).toCoeffField + simpa [Ch02.cubeDomain_coe] using + (dilatedCoeffFamily_coeffOn_ae_eq_rescaleCoeffField ha k Q).symm + +theorem LambdaSqCoeffField_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) + (Q : TriadicCube d) (s : ℝ) (q : Ch02.MultiscaleExponent) : + LambdaSqCoeffField Q s q (rescaleReg k a) = + LambdaSqCoeffField (Ch02.dilateCube (k : ℤ) Q) s q a := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k) + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hGB : Ch02.TriadicCoeffFamily.AEEq G B := by + simpa [G, B, F] using triadicCoeffFamily_rescaleCoeffField_aeeq_dilate ha k + have hAEEq := Ch02.LambdaSq_eq_ofAEEq hGB Q s q + have hdilate := + Ch02.LambdaSq_dilate + (Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F) Qsrc s q + calc + LambdaSqCoeffField Q s q (rescaleReg k a) + = Ch02.LambdaSq Q s q G := by + simp [LambdaSqCoeffField, G, ha.of_rescaleCoeffField k] + _ = Ch02.LambdaSq Q s q B := hAEEq + _ = Ch02.LambdaSq Qsrc s q F := by + simpa [Qsrc, htarget, B] using hdilate + _ = LambdaSqCoeffField Qsrc s q a := by + simp [LambdaSqCoeffField, F, ha] + +theorem lambdaSqCoeffField_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) + (Q : TriadicCube d) (s : ℝ) (q : Ch02.MultiscaleExponent) : + lambdaSqCoeffField Q s q (rescaleReg k a) = + lambdaSqCoeffField (Ch02.dilateCube (k : ℤ) Q) s q a := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k) + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hGB : Ch02.TriadicCoeffFamily.AEEq G B := by + simpa [G, B, F] using triadicCoeffFamily_rescaleCoeffField_aeeq_dilate ha k + have hAEEq := Ch02.lambdaSq_eq_ofAEEq hGB Q s q + have hdilate := + Ch02.lambdaSq_dilate + (Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F) Qsrc s q + calc + lambdaSqCoeffField Q s q (rescaleReg k a) + = Ch02.lambdaSq Q s q G := by + simp [lambdaSqCoeffField, G, ha.of_rescaleCoeffField k] + _ = Ch02.lambdaSq Q s q B := hAEEq + _ = Ch02.lambdaSq Qsrc s q F := by + simpa [Qsrc, htarget, B] using hdilate + _ = lambdaSqCoeffField Qsrc s q a := by + simp [lambdaSqCoeffField, F, ha] + +@[simp] theorem dilateCube_originCube_nat {d : ℕ} (k m : ℕ) : + Ch02.dilateCube (k : ℤ) (originCube d (m : ℤ)) = + originCube d ((k + m : ℕ) : ℤ) := by + simp [Ch02.dilateCube, originCube, add_comm] + +theorem LambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k m : ℕ) + (s : ℝ) (q : Ch02.MultiscaleExponent) : + LambdaSqCoeffField (originCube d (m : ℤ)) s q (rescaleReg k a) = + LambdaSqCoeffField (originCube d ((k + m : ℕ) : ℤ)) s q a := by + simpa using + LambdaSqCoeffField_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k (originCube d (m : ℤ)) s q + +theorem lambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k m : ℕ) + (s : ℝ) (q : Ch02.MultiscaleExponent) : + lambdaSqCoeffField (originCube d (m : ℤ)) s q (rescaleReg k a) = + lambdaSqCoeffField (originCube d ((k + m : ℕ) : ℤ)) s q a := by + simpa using + lambdaSqCoeffField_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k (originCube d (m : ℤ)) s q + +/-- The ambient coarse block matrix rescales by shifting the origin-cube +scale. -/ +theorem coarseBlockMatrix_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k m : ℕ) : + coarseBlockMatrix (cubeSet (originCube d (m : ℤ))) (rescaleReg k a).toFun = + coarseBlockMatrix (cubeSet (originCube d ((k + m : ℕ) : ℤ))) a.toFun := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k) + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let Q : TriadicCube d := originCube d (m : ℤ) + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hGB : Ch02.TriadicCoeffFamily.AEEq G B := by + simpa [G, B, F] using triadicCoeffFamily_rescaleCoeffField_aeeq_dilate ha k + have hAEEq := Ch02.coarseBlockMatrix_eq_ofAEEq (hGB Q) + have hdilate := + Ch02.coarseBlockMatrix_dilate + (Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F Qsrc) + have hdilate' : + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (B.coeffOn Q) = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) := by + rw [htarget] at hdilate + simpa [B] using hdilate + calc + coarseBlockMatrix (cubeSet (originCube d (m : ℤ))) (rescaleReg k a).toFun + = Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (G.coeffOn Q) := by + simpa [Q, G] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + (ha.of_rescaleCoeffField k) Q + _ = Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (B.coeffOn Q) := hAEEq + _ = Ch02.coarseBlockMatrix (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) := hdilate' + _ = coarseBlockMatrix (cubeSet Qsrc) a.toFun := + (RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Qsrc).symm + _ = coarseBlockMatrix (cubeSet (originCube d ((k + m : ℕ) : ℤ))) a.toFun := by + simp [Qsrc, Q] +/-- Scalar response observables rescale by shifting the origin-cube scale. -/ +theorem restrictionResponseJObservableCubeSet_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k m : ℕ) (p q : Vec d) : + restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p q (rescaleReg k a) = + restrictionResponseJObservableCubeSet (originCube d ((k + m : ℕ) : ℤ)) p q a := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k) + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let Q : TriadicCube d := originCube d (m : ℤ) + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hGB : Ch02.TriadicCoeffFamily.AEEq G B := by + simpa [G, B, F] using triadicCoeffFamily_rescaleCoeffField_aeeq_dilate ha k + have hAEEq : Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q = + Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q := + Ch02.responseJ_eq_ofAEEq (hGB Q) p q + have hdilate := + Ch02.responseJ_dilate + (Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F Qsrc) p q + have hdilate' : + Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q = + Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q := by + rw [htarget] at hdilate + simpa [B] using hdilate + calc + restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p q (rescaleReg k a) + = Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q := by + symm + calc + Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q = + ResponseJ (openCubeSet Q) p q (rescaleReg k a).toFun := by + simpa [G, Q, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (G.coeffOn Q) p q + _ = restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p q + (rescaleReg k a) := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q + (rescaleReg k a).toFun] + rfl + _ = Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q := hAEEq + _ = Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q := hdilate' + _ = restrictionResponseJObservableCubeSet Qsrc p q a := by + calc + Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q = + ResponseJ (openCubeSet Qsrc) p q a.toFun := by + simpa [F, Qsrc, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q + _ = restrictionResponseJObservableCubeSet Qsrc p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Qsrc p q a.toFun] + rfl + _ = restrictionResponseJObservableCubeSet (originCube d ((k + m : ℕ) : ℤ)) p q a := by + simp [Qsrc, Q] + +/-- Scalar response observables under the dilation defining `restrictionScaleNormalizedLaw`. -/ +theorem restrictionResponseJObservableCubeSet_originCube_dilateCoeffField_neg_nat_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k m : ℕ) (p q : Vec d) : + restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p q + (dilateReg (-(k : ℤ)) a) = + restrictionResponseJObservableCubeSet (originCube d ((k + m : ℕ) : ℤ)) p q a := by + rw [← rescaleReg_eq_dilateReg_neg_nat] + exact restrictionResponseJObservableCubeSet_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k m p q +/-- Upper multiscale ellipticity moments shift under scale-normalization of the +law. -/ +theorem LambdaMomentAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) {s : ℝ} (hs : 0 < s) (ξ : ℕ) : + LambdaMomentAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) s ξ = + LambdaMomentAtScale P ((k + m : ℕ) : ℤ) s ξ := by + unfold LambdaMomentAtScale annealedMomentRoot + rw [integral_restrictionScaleNormalizedLaw] + · apply congrArg (fun x : ℝ => x ^ (1 / (ξ : ℝ))) + apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [LambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k m s (.finite 1)] + · exact ((hP.scaleNormalized k).aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (m : ℤ)) hs).pow_const ξ |>.aestronglyMeasurable + +/-- Lower inverse multiscale ellipticity moments shift under +scale-normalization of the law. -/ +theorem lambdaInvMomentAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) {s : ℝ} (hs : 0 < s) (ξ : ℕ) : + lambdaInvMomentAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) s ξ = + lambdaInvMomentAtScale P ((k + m : ℕ) : ℤ) s ξ := by + unfold lambdaInvMomentAtScale annealedMomentRoot + rw [integral_restrictionScaleNormalizedLaw] + · apply congrArg (fun x : ℝ => x ^ (1 / (ξ : ℝ))) + apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [lambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k m s (.finite 1)] + · exact ((hP.scaleNormalized k).aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (m : ℤ)) hs).pow_const ξ |>.aestronglyMeasurable + +/-- The enhanced ellipticity moment contrast shifts under scale-normalization +of the law. -/ +theorem widetildeThetaAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) {sUpper sLower : ℝ} (hsUpper : 0 < sUpper) + (hsLower : 0 < sLower) (ξ : ℕ) : + widetildeThetaAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) sUpper sLower ξ = + widetildeThetaAtScale P ((k + m : ℕ) : ℤ) sUpper sLower ξ := by + simp [widetildeThetaAtScale, + LambdaMomentAtScale_restrictionScaleNormalizedLaw hP k m hsUpper ξ, + lambdaInvMomentAtScale_restrictionScaleNormalizedLaw hP k m hsLower ξ] + +private theorem smul_one_mat_eq_scalar_eq {d : ℕ} [NeZero d] {r s : ℝ} + (h : r • (1 : Mat d) = s • (1 : Mat d)) : r = s := by + classical + let i : Fin d := Classical.choice (Fin.pos_iff_nonempty.mp (NeZero.pos d)) + have hentry := congrArg (fun M : Mat d => M i i) h + simpa [Pi.smul_apply, Matrix.one_apply, i] using hentry + +/-- The annealed full coarse block matrix shifts under scale-normalization of +the law. -/ +theorem annealedBlockMatrixAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) : + annealedBlockMatrixAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) = + annealedBlockMatrixAtScale P ((k + m : ℕ) : ℤ) := by + unfold annealedBlockMatrixAtScale annealedBlockMatrix + refine Eq.mpr (BlockMat.mk.injEq _ _ _ _ _ _ _ _) ?_ + constructor + · ext i j + rw [integral_restrictionScaleNormalizedLaw] + · apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [coarseBlockMatrix_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic ha k m] + · exact ((hP.scaleNormalized k).aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + (originCube d (m : ℤ)) i j).aestronglyMeasurable + constructor + · ext i j + rw [integral_restrictionScaleNormalizedLaw] + · apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [coarseBlockMatrix_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic ha k m] + · exact ((hP.scaleNormalized k).aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet + (originCube d (m : ℤ)) i j).aestronglyMeasurable + constructor + · ext i j + rw [integral_restrictionScaleNormalizedLaw] + · apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [coarseBlockMatrix_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic ha k m] + · exact ((hP.scaleNormalized k).aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet + (originCube d (m : ℤ)) i j).aestronglyMeasurable + · ext i j + rw [integral_restrictionScaleNormalizedLaw] + · apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← rescaleReg_eq_dilateReg_neg_nat k] + rw [coarseBlockMatrix_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic ha k m] + · exact ((hP.scaleNormalized k).aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + (originCube d (m : ℤ)) i j).aestronglyMeasurable + +/-- The annealed upper-left scalar block shifts under scale-normalization of +the law. -/ +theorem annealedBAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) : + annealedBAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) = + annealedBAtScale P ((k + m : ℕ) : ℤ) := by + simpa [annealedBAtScale, annealedB, annealedBlockMatrixAtScale] using + congrArg BlockMat.upperLeft (annealedBlockMatrixAtScale_restrictionScaleNormalizedLaw hP k m) + +/-- The annealed inverse-star scalar block shifts under scale-normalization of +the law. -/ +theorem annealedSigmaStarInvAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (k m : ℕ) : + annealedSigmaStarInvAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) = + annealedSigmaStarInvAtScale P ((k + m : ℕ) : ℤ) := by + simpa [annealedSigmaStarInvAtScale, annealedSigmaStarInv, annealedBlockMatrixAtScale] using + congrArg BlockMat.lowerRight (annealedBlockMatrixAtScale_restrictionScaleNormalizedLaw hP k m) + +namespace RestrictionStationaryLaw + +/-- Commutation of integer translation with carrier triadic rescaling: rescaling +after translating by `z` equals translating by the `3^k`-scaled integer shift +after rescaling. -/ +private theorem translateReg_comp_rescaleReg {d : ℕ} (k : ℕ) (z : Fin d → ℤ) : + translateReg (intVecToRealVec z) ∘ rescaleReg k + = rescaleReg k ∘ translateReg (intVecToRealVec (triadicScaleIntShift k z)) := by + funext a + apply RegCoeffField.ext + intro x + simp only [Function.comp_apply, translateReg_apply, rescaleReg_apply] + congr 1 + funext i + simp only [intVecToRealVec, triadicScaleIntShift, Pi.smul_apply, Pi.add_apply, smul_eq_mul] + push_cast + ring + +/-- Stationarity is preserved by triadic scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionStationaryLaw P) (k : ℕ) : + RestrictionStationaryLaw (restrictionScaleNormalizedLaw k P) := by + intro z + rw [restrictionScaleNormalizedLaw_eq_map_rescaleReg, + Measure.map_map (measurable_translateReg (intVecToRealVec z)) (measurable_rescaleReg k), + translateReg_comp_rescaleReg k z, + ← Measure.map_map (measurable_rescaleReg k) + (measurable_translateReg (intVecToRealVec (triadicScaleIntShift k z))), + hP (triadicScaleIntShift k z)] + +end RestrictionStationaryLaw + +namespace RestrictionIsotropicLaw + +/-- Commutation of signed-permutation rotation with carrier triadic rescaling. -/ +private theorem rotateReg_comp_rescaleReg {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) (k : ℕ) : + rotateReg R hR ∘ rescaleReg k = rescaleReg k ∘ rotateReg R hR := by + funext a + apply RegCoeffField.ext + intro x + simp only [Function.comp_apply, rotateReg_apply, rescaleReg_apply, matVecMul_smul] + +/-- Isotropy under signed permutations is preserved by triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionIsotropicLaw P) (k : ℕ) : + RestrictionIsotropicLaw (restrictionScaleNormalizedLaw k P) := by + intro R hR + rw [restrictionScaleNormalizedLaw_eq_map_rescaleReg, + Measure.map_map (measurable_rotateReg R hR) (measurable_rescaleReg k), + rotateReg_comp_rescaleReg R hR k, + ← Measure.map_map (measurable_rescaleReg k) (measurable_rotateReg R hR), + hP R hR] + +end RestrictionIsotropicLaw + +namespace RestrictionAdjointInvariantLaw + +/-- Commutation of the entrywise adjoint with carrier triadic rescaling. -/ +private theorem adjointReg_comp_rescaleReg {d : ℕ} (k : ℕ) : + adjointReg ∘ rescaleReg (d := d) k = rescaleReg k ∘ adjointReg := by + funext a + apply RegCoeffField.ext + intro x + simp only [Function.comp_apply, adjointReg_apply, rescaleReg_apply] + +/-- Adjoint invariance is preserved by triadic scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionAdjointInvariantLaw P) (k : ℕ) : + RestrictionAdjointInvariantLaw (restrictionScaleNormalizedLaw k P) := by + show Measure.map adjointReg (restrictionScaleNormalizedLaw k P) = restrictionScaleNormalizedLaw k P + rw [restrictionScaleNormalizedLaw_eq_map_rescaleReg, + Measure.map_map measurable_adjointReg (measurable_rescaleReg k), + adjointReg_comp_rescaleReg k, + ← Measure.map_map (measurable_rescaleReg k) measurable_adjointReg, + hP] + +end RestrictionAdjointInvariantLaw + +namespace RestrictionStructuralLaw + +/-- The full structural law package is preserved by triadic scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : RestrictionCoeffLaw d} + (hP : RestrictionStructuralLaw P) (k : ℕ) : + RestrictionStructuralLaw (restrictionScaleNormalizedLaw k P) where + stationary := hP.stationary.scaleNormalized k + unit_range := RestrictionUnitRangeDependentLaw.scaleNormalized hP.unit_range k + isotropic := hP.isotropic.scaleNormalized k + adjoint_invariant := hP.adjoint_invariant.scaleNormalized k + +end RestrictionStructuralLaw + +namespace RestrictionLawCarrier + +/-- The primitive upper-left structural scalar shifts under +scale-normalization. -/ +theorem barBAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (k m : ℕ) : + (hP.scaleNormalized k).barBAtScale (hStruct.scaleNormalized k) (m : ℤ) = + hP.barBAtScale hStruct ((k + m : ℕ) : ℤ) := by + apply smul_one_mat_eq_scalar_eq (d := d) + calc + (hP.scaleNormalized k).barBAtScale (hStruct.scaleNormalized k) (m : ℤ) • (1 : Mat d) + = annealedBAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) := + ((hP.scaleNormalized k).annealedBAtScale_eq_barBAtScale + (hStruct.scaleNormalized k) (m : ℤ)).symm + _ = annealedBAtScale P ((k + m : ℕ) : ℤ) := + annealedBAtScale_restrictionScaleNormalizedLaw hP k m + _ = hP.barBAtScale hStruct ((k + m : ℕ) : ℤ) • (1 : Mat d) := + hP.annealedBAtScale_eq_barBAtScale hStruct ((k + m : ℕ) : ℤ) + +/-- The primitive inverse-star structural scalar shifts under +scale-normalization. -/ +theorem barSigmaStarInvAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (k m : ℕ) : + (hP.scaleNormalized k).barSigmaStarInvAtScale + (hStruct.scaleNormalized k) (m : ℤ) = + hP.barSigmaStarInvAtScale hStruct ((k + m : ℕ) : ℤ) := by + apply smul_one_mat_eq_scalar_eq (d := d) + calc + (hP.scaleNormalized k).barSigmaStarInvAtScale + (hStruct.scaleNormalized k) (m : ℤ) • (1 : Mat d) + = annealedSigmaStarInvAtScale (restrictionScaleNormalizedLaw k P) (m : ℤ) := + ((hP.scaleNormalized k).annealedSigmaStarInvAtScale_eq_barSigmaStarInvAtScale + (hStruct.scaleNormalized k) (m : ℤ)).symm + _ = annealedSigmaStarInvAtScale P ((k + m : ℕ) : ℤ) := + annealedSigmaStarInvAtScale_restrictionScaleNormalizedLaw hP k m + _ = hP.barSigmaStarInvAtScale hStruct ((k + m : ℕ) : ℤ) • (1 : Mat d) := + hP.annealedSigmaStarInvAtScale_eq_barSigmaStarInvAtScale hStruct + ((k + m : ℕ) : ℤ) + +/-- The structural-law scalar `\bar\sigma` shifts under scale-normalization. -/ +theorem barSigmaAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (k m : ℕ) : + (hP.scaleNormalized k).barSigmaAtScale (hStruct.scaleNormalized k) (m : ℤ) = + hP.barSigmaAtScale hStruct ((k + m : ℕ) : ℤ) := by + calc + (hP.scaleNormalized k).barSigmaAtScale (hStruct.scaleNormalized k) (m : ℤ) + = (hP.scaleNormalized k).barBAtScale (hStruct.scaleNormalized k) (m : ℤ) := + (hP.scaleNormalized k).barSigmaAtScale_eq_barBAtScale + (hStruct.scaleNormalized k) (m : ℤ) + _ = hP.barBAtScale hStruct ((k + m : ℕ) : ℤ) := + hP.barBAtScale_restrictionScaleNormalizedLaw hStruct k m + _ = hP.barSigmaAtScale hStruct ((k + m : ℕ) : ℤ) := + (hP.barSigmaAtScale_eq_barBAtScale hStruct ((k + m : ℕ) : ℤ)).symm + +/-- The structural-law scalar `\bar\sigma_*` shifts under scale-normalization. -/ +theorem barSigmaStarAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (k m : ℕ) : + (hP.scaleNormalized k).barSigmaStarAtScale + (hStruct.scaleNormalized k) (m : ℤ) = + hP.barSigmaStarAtScale hStruct ((k + m : ℕ) : ℤ) := by + calc + (hP.scaleNormalized k).barSigmaStarAtScale (hStruct.scaleNormalized k) (m : ℤ) + = ((hP.scaleNormalized k).barSigmaStarInvAtScale + (hStruct.scaleNormalized k) (m : ℤ))⁻¹ := + (hP.scaleNormalized k).barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale + (hStruct.scaleNormalized k) (m : ℤ) + _ = (hP.barSigmaStarInvAtScale hStruct ((k + m : ℕ) : ℤ))⁻¹ := by + rw [hP.barSigmaStarInvAtScale_restrictionScaleNormalizedLaw hStruct k m] + _ = hP.barSigmaStarAtScale hStruct ((k + m : ℕ) : ℤ) := + (hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct + ((k + m : ℕ) : ℤ)).symm + +/-- The structural-law contrast `\Theta` shifts under scale-normalization. -/ +theorem thetaAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (k m : ℕ) : + (hP.scaleNormalized k).thetaAtScale (hStruct.scaleNormalized k) (m : ℤ) = + hP.thetaAtScale hStruct ((k + m : ℕ) : ℤ) := by + simp [RestrictionLawCarrier.thetaAtScale, + hP.barSigmaAtScale_restrictionScaleNormalizedLaw hStruct k m, + hP.barSigmaStarAtScale_restrictionScaleNormalizedLaw hStruct k m] + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationResponse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationResponse.lean new file mode 100644 index 0000000000..54000102b0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/DilationResponse.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw + +/-! # Dilation Response -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +noncomputable section + +/-! +# Response observables under dilation + +This file exposes the arbitrary-cube response observable transport used by the +Section 5.6 wrap-around branch. `DilationLaw` already contained the origin-cube +specialization needed for scale-normalized laws; descendant averages need the +same statement before specializing to origin descendants. +-/ + +theorem restrictionResponseJObservableCubeSet_rescaleCoeffField_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) + (Q : TriadicCube d) (p q : Vec d) : + restrictionResponseJObservableCubeSet Q p q (rescaleReg k a) = + restrictionResponseJObservableCubeSet (Ch02.dilateCube (k : ℤ) Q) p q a := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (rescaleReg k a) (ha.of_rescaleCoeffField k) + let B : Ch02.TriadicCoeffFamily d := Ch02.TriadicCoeffFamily.dilate (-(k : ℤ)) F + let Qsrc : TriadicCube d := Ch02.dilateCube (k : ℤ) Q + have htarget : Ch02.dilateCube (-(k : ℤ)) Qsrc = Q := by + simpa [Qsrc] using Ch02.dilateCube_neg_dilateCube (k : ℤ) Q + have hGB : Ch02.TriadicCoeffFamily.AEEq G B := by + simpa [G, B, F] using triadicCoeffFamily_rescaleCoeffField_aeeq_dilate ha k + have hAEEq : Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q = + Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q := + Ch02.responseJ_eq_ofAEEq (hGB Q) p q + have hdilate := + Ch02.responseJ_dilate + (Ch02.TriadicCoeffFamily.isDilation_dilate (-(k : ℤ)) F Qsrc) p q + have hdilate' : + Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q = + Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q := by + rw [htarget] at hdilate + simpa [B] using hdilate + calc + restrictionResponseJObservableCubeSet Q p q (rescaleReg k a) + = Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q := by + symm + calc + Ch02.responseJ (Ch02.cubeDomain Q) (G.coeffOn Q) p q = + ResponseJ (openCubeSet Q) p q (rescaleReg k a).toFun := by + simpa [G, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (G.coeffOn Q) p q + _ = restrictionResponseJObservableCubeSet Q p q (rescaleReg k a) := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q + (rescaleReg k a).toFun] + rfl + _ = Ch02.responseJ (Ch02.cubeDomain Q) (B.coeffOn Q) p q := hAEEq + _ = Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q := hdilate' + _ = restrictionResponseJObservableCubeSet Qsrc p q a := by + calc + Ch02.responseJ (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q = + ResponseJ (openCubeSet Qsrc) p q a.toFun := by + simpa [F, Qsrc, triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Qsrc) (F.coeffOn Qsrc) p q + _ = restrictionResponseJObservableCubeSet Qsrc p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Qsrc p q a.toFun] + rfl + +/-- Scalar response observables under the dilation defining +`restrictionScaleNormalizedLaw`, for arbitrary triadic cubes. -/ +theorem restrictionResponseJObservableCubeSet_dilateCoeffField_neg_nat_of_aelocallyUniformlyElliptic + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (k : ℕ) + (Q : TriadicCube d) (p q : Vec d) : + restrictionResponseJObservableCubeSet Q p q (dilateReg (-(k : ℤ)) a) = + restrictionResponseJObservableCubeSet (Ch02.dilateCube (k : ℤ) Q) p q a := by + rw [← rescaleReg_eq_dilateReg_neg_nat] + exact restrictionResponseJObservableCubeSet_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k Q p q + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Expectations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Expectations.lean new file mode 100644 index 0000000000..af5ac61371 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Expectations.lean @@ -0,0 +1,643 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Basic + +/-! # Expectations -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Expectations and finite response moments + +This file is the public Chapter 4 surface for taking expectations of the +scalar response observables already exposed in `CoarseObservables`. + +The surface is intentionally small: it names the observable, its expectation, +the centered observable used in the manuscript, and the finite descendant +average expectation theorem. Integrability remains an explicit theorem +hypothesis; there is no extra moment carrier or section-local wrapper track. +-/ + +noncomputable section + +open MeasureTheory +open scoped ENNReal +open scoped Matrix.Norms.Elementwise + +/-- Finite-dimensional matrix quadratic forms commute with entrywise +expectation under entrywise integrability. -/ +theorem integral_vecDot_matVecMul_eq_entrywise_integral + {d : ℕ} {P : RestrictionCoeffLaw d} {M : RegCoeffField d → Mat d} + (hM : ∀ i j, Integrable (fun a => M a i j) P) (x y : Vec d) : + ∫ a, vecDot x (matVecMul (M a) y) ∂P = + vecDot x (matVecMul (fun i j => ∫ a, M a i j ∂P) y) := by + simp [vecDot, matVecMul] + rw [MeasureTheory.integral_finsetSum Finset.univ] + · congr 1 + ext i + rw [MeasureTheory.integral_const_mul] + rw [MeasureTheory.integral_finsetSum Finset.univ] + · simp_rw [MeasureTheory.integral_mul_const] + · intro j _hj + exact (hM i j).mul_const (y j) + · intro i _hi + exact (MeasureTheory.integrable_finsetSum Finset.univ fun j _hj => + (hM i j).mul_const (y j)).const_mul (x i) + +/-- Full coarse-block integrability gives entrywise integrability of the +corresponding doubled coarse matrix. -/ +private theorem integrable_blockMatEntry_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} + (hInt : Integrable (coarseFullBlockMatrixAtCube Q) P) : + ∀ α β, + Integrable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + intro α β + have hα : Integrable (fun a : RegCoeffField d => coarseFullBlockMatrixAtCube Q a α) P := + MeasureTheory.Integrable.eval hInt α + have hαβ : Integrable (fun a : RegCoeffField d => coarseFullBlockMatrixAtCube Q a α β) P := + MeasureTheory.Integrable.eval hα β + simpa [coarseFullBlockMatrixAtCube, coarseFullBlockMatrixObservable, toFullBlockMat, + blockMatEntry] using hαβ + +/-- Scalar response observable on a deterministic triadic cube. -/ +noncomputable def restrictionResponseJObservableCubeSet {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) : RegCoeffField d → ℝ := + fun a => ResponseJ (cubeSet Q) p q a.toFun + +@[simp] +theorem restrictionResponseJObservableCubeSet_apply {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : + restrictionResponseJObservableCubeSet Q p q a = ResponseJ (cubeSet Q) p q a.toFun := + rfl + +/-- The scalar response observable is pointwise nonnegative. -/ +theorem restrictionResponseJObservableCubeSet_nonneg {d : ℕ} + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : + 0 ≤ restrictionResponseJObservableCubeSet Q p q a := by + simpa [restrictionResponseJObservableCubeSet] using responseJ_nonneg (cubeSet Q) p q a.toFun + +theorem restrictionResponseJObservableCubeSet_ae_eq_quadratic_coarseBlockMatrix_of_lawCarrier + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + (fun a : RegCoeffField d => restrictionResponseJObservableCubeSet Q p q a) =ᵐ[P] + (fun a : RegCoeffField d => + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p)) := by + filter_upwards + [hP.ResponseJ_cubeSet_eq_Mu_neg_left_sub_vecDot_ae Q p q, + hP.ae_exists_coarseBlockMatrix_openCubeSet Q] with a hResponse hex + have hCoarse : + IsCoarseBlockMatrix (openCubeSet Q) a.toFun (coarseBlockMatrix (openCubeSet Q) a.toFun) := + isCoarseBlockMatrix_coarseBlockMatrix hex + calc + restrictionResponseJObservableCubeSet Q p q a = ResponseJ (cubeSet Q) p q a.toFun := rfl + _ = Mu (cubeSet Q) (-p, q) a.toFun - vecDot p q := hResponse + _ = Mu (openCubeSet Q) (-p, q) a.toFun - vecDot p q := by + rw [Mu_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (P := (-p, q)) (a := a.toFun)] + _ = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun) (-p, q)) - + vecDot p q := by + rw [Mu_eq_half_blockVecDot_coarseBlockMatrix hex (-p, q)] + _ = + (1 / 2 : ℝ) * + vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).lowerLeft p) + + (1 / 2 : ℝ) * + vecDot p (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).upperLeft p) := by + rw [magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat hCoarse.1 p q] + ring + _ = + (1 / 2 : ℝ) * + vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p) + + (1 / 2 : ℝ) * + vecDot p (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p) := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a.toFun] + +private theorem integrable_responseJQuadratic_coarseBlockMatrix_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} {P : RestrictionCoeffLaw d} [IsFiniteMeasure P] {Q : TriadicCube d} (p q : Vec d) + (hBlock : Integrable (coarseFullBlockMatrixAtCube Q) P) : + Integrable + (fun a : RegCoeffField d => + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p)) P := by + let M : RegCoeffField d → BlockMat d := fun a => coarseBlockMatrix (cubeSet Q) a.toFun + have hEntry := integrable_blockMatEntry_of_integrable_coarseFullBlockMatrixAtCube hBlock + have hLR : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerRight i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inr j) + have hLL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inl j) + have hUL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).upperLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inl i) (Sum.inl j) + have hTermLR : + Integrable (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerRight q)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLR i j).mul_const (q j)).const_mul (q i) + have hTermLL : + Integrable (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerLeft p)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLL i j).mul_const (p j)).const_mul (q i) + have hTermUL : + Integrable (fun a : RegCoeffField d => vecDot p (matVecMul (M a).upperLeft p)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hUL i j).mul_const (p j)).const_mul (p i) + simpa [M] using! + (((hTermLR.const_mul (1 / 2 : ℝ)).sub (integrable_const _)).sub hTermLL).add + (hTermUL.const_mul (1 / 2 : ℝ)) + +namespace RestrictionLawCarrier + +/-- Full coarse-block integrability makes the scalar response integrable. + +The law carrier supplies the a.s. elliptic support and the deterministic +`ResponseJ = Mu(-p,q) - p·q` identity; the only remaining analytic input is +integrability of the finite-dimensional coarse block. -/ +theorem integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) + (hBlock : Integrable (coarseFullBlockMatrixAtCube Q) P) : + Integrable (restrictionResponseJObservableCubeSet Q p q) P := by + let : IsProbabilityMeasure P := hP.isProbability + exact + (integrable_responseJQuadratic_coarseBlockMatrix_of_integrable_coarseFullBlockMatrixAtCube + (P := P) (Q := Q) p q hBlock).congr + (restrictionResponseJObservableCubeSet_ae_eq_quadratic_coarseBlockMatrix_of_lawCarrier + hP Q p q).symm + +/-- Expected scalar response expressed through the annealed coarse block +matrix, with the stochastic hypotheses packaged in `RestrictionLawCarrier`. + +This is the note-facing Chapter 4 source identity: Ch5 should call this rather +than passing deterministic coarse-data witnesses. -/ +theorem integral_restrictionResponseJObservableCubeSet_eq_quadratic_annealedBlockMatrix + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) + (hBlock : Integrable (coarseFullBlockMatrixAtCube Q) P) : + ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P = + (1 / 2 : ℝ) * vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (annealedBlockMatrix P (cubeSet Q)).upperLeft p) := by + let : IsProbabilityMeasure P := hP.isProbability + let M : RegCoeffField d → BlockMat d := fun a => coarseBlockMatrix (cubeSet Q) a.toFun + have hEntry := integrable_blockMatEntry_of_integrable_coarseFullBlockMatrixAtCube hBlock + have hLR : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerRight i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inr j) + have hLL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inl j) + have hUL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).upperLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inl i) (Sum.inl j) + have hFormula := + restrictionResponseJObservableCubeSet_ae_eq_quadratic_coarseBlockMatrix_of_lawCarrier hP Q p q + have hLRint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hLR q q + have hLLint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hLL q p + have hULint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hUL p p + calc + ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P + = + ∫ a, + (1 / 2 : ℝ) * vecDot q (matVecMul (M a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (M a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (M a).upperLeft p) ∂P := + integral_congr_ae hFormula + _ = + (1 / 2 : ℝ) * ∫ a, vecDot q (matVecMul (M a).lowerRight q) ∂P - + vecDot p q - + ∫ a, vecDot q (matVecMul (M a).lowerLeft p) ∂P + + (1 / 2 : ℝ) * ∫ a, vecDot p (matVecMul (M a).upperLeft p) ∂P := by + let f : RegCoeffField d → ℝ := fun a => vecDot q (matVecMul (M a).lowerRight q) + let g : RegCoeffField d → ℝ := fun a => vecDot q (matVecMul (M a).lowerLeft p) + let h : RegCoeffField d → ℝ := fun a => vecDot p (matVecMul (M a).upperLeft p) + have hf : Integrable f P := by + simp [f, vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLR i j).mul_const (q j)).const_mul (q i) + have hg : Integrable g P := by + simp [g, vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLL i j).mul_const (p j)).const_mul (q i) + have hh : Integrable h P := by + simp [h, vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hUL i j).mul_const (p j)).const_mul (p i) + rw [integral_add] + · rw [integral_sub] + · rw [integral_sub] + · rw [integral_const_mul] + rw [integral_const] + rw [integral_const_mul] + simp [Measure.real, IsProbabilityMeasure.measure_univ] + · exact hf.const_mul (1 / 2 : ℝ) + · exact integrable_const _ + · exact (hf.const_mul (1 / 2 : ℝ)).sub (integrable_const _) + · exact hg + · exact ((hf.const_mul (1 / 2 : ℝ)).sub (integrable_const _)).sub hg + · exact hh.const_mul (1 / 2 : ℝ) + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (annealedBlockMatrix P (cubeSet Q)).upperLeft p) := by + rw [hLRint, hLLint, hULint] + rfl + +end RestrictionLawCarrier + +/-- Centered scalar response observable on a deterministic triadic cube. -/ +noncomputable def restrictionCenteredResponseJObservableCubeSet {d : ℕ} + (Q : TriadicCube d) (p q p0 q0 : Vec d) : RegCoeffField d → ℝ := + fun a => restrictionResponseJObservableCubeSet Q p q a - (1 / 2 : ℝ) * vecDot p0 q0 + +@[simp] +theorem restrictionCenteredResponseJObservableCubeSet_apply {d : ℕ} + (Q : TriadicCube d) (p q p0 q0 : Vec d) (a : RegCoeffField d) : + restrictionCenteredResponseJObservableCubeSet Q p q p0 q0 a = + restrictionResponseJObservableCubeSet Q p q a - (1 / 2 : ℝ) * vecDot p0 q0 := + rfl + +/-- Annealed scalar response on a deterministic triadic cube. -/ +noncomputable def expectedResponseJCubeSet {d : ℕ} + (P : RestrictionCoeffLaw d) (Q : TriadicCube d) (p q : Vec d) : ℝ := + ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P + +/-- Expected scalar response expressed through the annealed coarse block matrix. + +The only stochastic hypotheses are the deterministic coarse-data identity +almost surely and integrability of the full coarse block. Scalarization is +not used here; Ch5 gets its scalar formula by specializing this source +identity. -/ +theorem integral_restrictionResponseJObservableCubeSet_eq_quadratic_annealedBlockMatrix + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (Q : TriadicCube d) (p q : Vec d) + (hData : ∀ᵐ a ∂P, OpenCubeDeterministicCoarseData Q a.toFun) + (hBlock : Integrable (coarseFullBlockMatrixAtCube Q) P) : + ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P = + (1 / 2 : ℝ) * vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (annealedBlockMatrix P (cubeSet Q)).upperLeft p) := by + let M : RegCoeffField d → BlockMat d := fun a => coarseBlockMatrix (cubeSet Q) a.toFun + have hEntry := integrable_blockMatEntry_of_integrable_coarseFullBlockMatrixAtCube hBlock + have hLR : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerRight i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inr j) + have hLL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).lowerLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inr i) (Sum.inl j) + have hUL : ∀ i j, Integrable (fun a : RegCoeffField d => (M a).upperLeft i j) P := by + intro i j + simpa [M, blockMatEntry] using hEntry (Sum.inl i) (Sum.inl j) + have hTermLR : + Integrable (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerRight q)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLR i j).mul_const (q j)).const_mul (q i) + have hTermLL : + Integrable (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerLeft p)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hLL i j).mul_const (p j)).const_mul (q i) + have hTermUL : + Integrable (fun a : RegCoeffField d => vecDot p (matVecMul (M a).upperLeft p)) P := by + simp [vecDot, matVecMul] + exact MeasureTheory.integrable_finsetSum Finset.univ fun i _ => + (MeasureTheory.integrable_finsetSum Finset.univ fun j _ => + (hUL i j).mul_const (p j)).const_mul (p i) + have hFormula : + (fun a : RegCoeffField d => restrictionResponseJObservableCubeSet Q p q a) =ᵐ[P] + (fun a : RegCoeffField d => + (1 / 2 : ℝ) * vecDot q (matVecMul (M a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (M a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (M a).upperLeft p)) := by + filter_upwards [hData] with a ha + calc + restrictionResponseJObservableCubeSet Q p q a = ResponseJ (cubeSet Q) p q a.toFun := rfl + _ = ResponseJ (openCubeSet Q) p q a.toFun := + responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a.toFun + _ = + (1 / 2 : ℝ) * + vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).lowerLeft p) + + (1 / 2 : ℝ) * + vecDot p (matVecMul (coarseBlockMatrix (openCubeSet Q) a.toFun).upperLeft p) := + responseJ_formula_coarseBlockMatrix_openCubeSet_of_deterministicCoarseData ha p q + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (M a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (M a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (M a).upperLeft p) := by + rw [← coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a.toFun] + have hLRint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hLR q q + have hLLint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hLL q p + have hULint := integral_vecDot_matVecMul_eq_entrywise_integral (P := P) hUL p p + calc + ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P + = + ∫ a, + (1 / 2 : ℝ) * vecDot q (matVecMul (M a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (M a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (M a).upperLeft p) ∂P := + integral_congr_ae hFormula + _ = + (1 / 2 : ℝ) * ∫ a, vecDot q (matVecMul (M a).lowerRight q) ∂P - + vecDot p q - + ∫ a, vecDot q (matVecMul (M a).lowerLeft p) ∂P + + (1 / 2 : ℝ) * ∫ a, vecDot p (matVecMul (M a).upperLeft p) ∂P := by + rw [integral_add] + · rw [integral_sub] + · rw [integral_sub] + · rw [integral_const_mul] + rw [integral_const] + rw [integral_const_mul] + simp [Measure.real, IsProbabilityMeasure.measure_univ] + · exact hTermLR.const_mul (1 / 2 : ℝ) + · exact integrable_const _ + · exact (hTermLR.const_mul (1 / 2 : ℝ)).sub (integrable_const _) + · exact hTermLL + · exact ((hTermLR.const_mul (1 / 2 : ℝ)).sub (integrable_const _)).sub hTermLL + · exact hTermUL.const_mul (1 / 2 : ℝ) + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (annealedBlockMatrix P (cubeSet Q)).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (annealedBlockMatrix P (cubeSet Q)).upperLeft p) := by + rw [hLRint, hLLint, hULint] + rfl + +/-- Annealed finite descendant average of scalar responses. -/ +noncomputable def expectedDescendantsAverageResponseJCubeSet {d : ℕ} + (P : RestrictionCoeffLaw d) (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : ℝ := + descendantsAverage Q j (fun R => expectedResponseJCubeSet P R p q) + +/-- Difference of two annealed scalar responses, the basic `τ`-type quantity. -/ +noncomputable def tauResponseJCubeSet {d : ℕ} + (P : RestrictionCoeffLaw d) (Qchild Qparent : TriadicCube d) (p q : Vec d) : ℝ := + expectedResponseJCubeSet P Qchild p q - expectedResponseJCubeSet P Qparent p q + +/-- Finite descendant averages preserve integrability. -/ +theorem integrable_descendantsAverage + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} + {F : TriadicCube d → RegCoeffField d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → Integrable (F R) P) : + Integrable + (fun a : RegCoeffField d => descendantsAverage Q j (fun R => F R a)) P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + Integrable (fun a : RegCoeffField d => ∑ R ∈ D, F R a) P := by + exact MeasureTheory.integrable_finsetSum D + (fun R hR => hF R (by simpa [D] using hR)) + simpa [descendantsAverage, D] using hsum.const_mul ((D.card : ℝ)⁻¹) + +/-- Finite descendant averages commute with expectation under childwise +integrability. -/ +theorem integral_descendantsAverage_eq_descendantsAverage_integral + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} + {F : TriadicCube d → RegCoeffField d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → Integrable (F R) P) : + ∫ a, descendantsAverage Q j (fun R => F R a) ∂P = + descendantsAverage Q j (fun R => ∫ a, F R a ∂P) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + calc + ∫ a, descendantsAverage Q j (fun R => F R a) ∂P + = + ∫ a, + (D.card : ℝ)⁻¹ * (∑ R ∈ D, F R a) ∂P := by + rfl + _ = + (D.card : ℝ)⁻¹ * + ∫ a, ∑ R ∈ D, F R a ∂P := by + rw [integral_const_mul] + _ = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, ∫ a, F R a ∂P) := by + rw [MeasureTheory.integral_finsetSum D + (fun R hR => hF R (by simpa [D] using hR))] + _ = descendantsAverage Q j (fun R => ∫ a, F R a ∂P) := by + simp [descendantsAverage, D] + +/-- Finite descendant averages preserve `MemLp`. -/ +theorem memLp_descendantsAverage + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} {r : ℝ≥0∞} + {F : TriadicCube d → RegCoeffField d → ℝ} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → MemLp (F R) r P) : + MemLp + (fun a : RegCoeffField d => descendantsAverage Q j (fun R => F R a)) r P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + MemLp (fun a : RegCoeffField d => ∑ R ∈ D, F R a) r P := by + exact MeasureTheory.memLp_finsetSum D + (fun R hR => hF R (by simpa [D] using hR)) + simpa [descendantsAverage, D] using hsum.const_mul ((D.card : ℝ)⁻¹) + +/-- Finite descendant averages of response observables are integrable if the +child responses are integrable. -/ +theorem integrable_descendantsAverage_restrictionResponseJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} {p q : Vec d} + (hJ : ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (restrictionResponseJObservableCubeSet R p q) P) : + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a)) P := + integrable_descendantsAverage + (P := P) (Q := Q) (j := j) + (F := fun R a => restrictionResponseJObservableCubeSet R p q a) hJ + +/-- Finite descendant averages of response observables are in `L^r` if the +child responses are in `L^r`. -/ +theorem memLp_descendantsAverage_restrictionResponseJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {j : ℕ} {r : ℝ≥0∞} + {p q : Vec d} + (hJ : ∀ R, R ∈ descendantsAtDepth Q j → + MemLp (restrictionResponseJObservableCubeSet R p q) r P) : + MemLp + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a)) r P := + memLp_descendantsAverage + (P := P) (Q := Q) (j := j) (r := r) + (F := fun R a => restrictionResponseJObservableCubeSet R p q a) hJ + +/-- Centering by a deterministic scalar preserves integrability. -/ +theorem integrable_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} [IsFiniteMeasure P] + (Q : TriadicCube d) (p q p0 q0 : Vec d) + (hJ : Integrable (restrictionResponseJObservableCubeSet Q p q) P) : + Integrable (restrictionCenteredResponseJObservableCubeSet Q p q p0 q0) P := by + simpa [restrictionCenteredResponseJObservableCubeSet] using! hJ.sub (integrable_const _) + +/-- Centering by a deterministic scalar preserves `MemLp` under a finite +measure. -/ +theorem memLp_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} {r : ℝ≥0∞} [IsFiniteMeasure P] + (Q : TriadicCube d) (p q p0 q0 : Vec d) + (hJ : MemLp (restrictionResponseJObservableCubeSet Q p q) r P) : + MemLp (restrictionCenteredResponseJObservableCubeSet Q p q p0 q0) r P := by + convert + hJ.sub + (MeasureTheory.memLp_const + (μ := P) (p := r) (c := (1 / 2 : ℝ) * vecDot p0 q0)) using 1 + funext a + simp [restrictionCenteredResponseJObservableCubeSet, Pi.sub_apply] + +/-- The integral of the centered response is the annealed response minus the +deterministic centering scalar. -/ +theorem integral_restrictionCenteredResponseJObservableCubeSet_eq_expectedResponseJCubeSet_sub_half_dot + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (Q : TriadicCube d) (p q p0 q0 : Vec d) + (hJ : Integrable (restrictionResponseJObservableCubeSet Q p q) P) : + ∫ a, restrictionCenteredResponseJObservableCubeSet Q p q p0 q0 a ∂P = + expectedResponseJCubeSet P Q p q - (1 / 2 : ℝ) * vecDot p0 q0 := by + have hConst : + Integrable (fun _ : RegCoeffField d => (1 / 2 : ℝ) * vecDot p0 q0) P := + integrable_const _ + calc + ∫ a, restrictionCenteredResponseJObservableCubeSet Q p q p0 q0 a ∂P + = ∫ a, + restrictionResponseJObservableCubeSet Q p q a - + (1 / 2 : ℝ) * vecDot p0 q0 ∂P := by + rfl + _ = ∫ a, restrictionResponseJObservableCubeSet Q p q a ∂P - + ∫ _a : RegCoeffField d, (1 / 2 : ℝ) * vecDot p0 q0 ∂P := by + rw [integral_sub hJ hConst] + _ = expectedResponseJCubeSet P Q p q - (1 / 2 : ℝ) * vecDot p0 q0 := by + rw [integral_const] + simp [expectedResponseJCubeSet, Measure.real, IsProbabilityMeasure.measure_univ] + +/-- Finite descendant response averages commute with expectation, assuming +childwise integrability. -/ +theorem integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_expectedDescendantsAverageResponseJCubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) + (hJ : ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) ∂P = + expectedDescendantsAverageResponseJCubeSet P Q j p q := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + calc + ∫ a, + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a) ∂P + = + ∫ a, + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, restrictionResponseJObservableCubeSet R p q a) ∂P := by + rfl + _ = + (D.card : ℝ)⁻¹ * + ∫ a, ∑ R ∈ D, restrictionResponseJObservableCubeSet R p q a ∂P := by + rw [integral_const_mul] + _ = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, ∫ a, restrictionResponseJObservableCubeSet R p q a ∂P) := by + rw [MeasureTheory.integral_finsetSum D + (fun R hR => hJ R (by simpa [D] using hR))] + _ = expectedDescendantsAverageResponseJCubeSet P Q j p q := by + simp [expectedDescendantsAverageResponseJCubeSet, expectedResponseJCubeSet, + descendantsAverage, D] + +namespace RestrictionLawCarrier + +/-- The named response observable is a.e.-measurable under a law carrier. -/ +theorem aemeasurable_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEMeasurable (restrictionResponseJObservableCubeSet Q p q) P := by + simpa [restrictionResponseJObservableCubeSet] using! hP.aemeasurable_ResponseJ_cubeSet Q p q + +/-- The named response observable is a.e.-strongly-measurable under a law +carrier. -/ +theorem aestronglyMeasurable_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q : Vec d) : + AEStronglyMeasurable (restrictionResponseJObservableCubeSet Q p q) P := + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q p q).aestronglyMeasurable + +/-- Centered response observables are a.e.-measurable under a law carrier. -/ +theorem aemeasurable_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q p0 q0 : Vec d) : + AEMeasurable (restrictionCenteredResponseJObservableCubeSet Q p q p0 q0) P := by + simpa [restrictionCenteredResponseJObservableCubeSet] using! + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q p q).sub aemeasurable_const + +/-- Centered response observables are a.e.-strongly-measurable under a law +carrier. -/ +theorem aestronglyMeasurable_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (p q p0 q0 : Vec d) : + AEStronglyMeasurable (restrictionCenteredResponseJObservableCubeSet Q p q p0 q0) P := + (hP.aemeasurable_restrictionCenteredResponseJObservableCubeSet Q p q p0 q0).aestronglyMeasurable + +/-- Finite descendant averages of the named response observables are +a.e.-measurable under a law carrier. -/ +theorem aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a)) P := by + simpa [restrictionResponseJObservableCubeSet] using + hP.aemeasurable_descendantsAverage_ResponseJ_cubeSet Q j p q + +/-- Finite descendant averages of the named response observables are +a.e.-strongly-measurable under a law carrier. -/ +theorem aestronglyMeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => + descendantsAverage Q j (fun R => restrictionResponseJObservableCubeSet R p q a)) P := + (hP.aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet Q j p q).aestronglyMeasurable + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/IndependenceDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/IndependenceDefinitions.lean new file mode 100644 index 0000000000..f425afcb4f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/IndependenceDefinitions.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceIndependence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceColorClassIndependence + +/-! # Independence Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Canonical source-local finite independence + +This module exposes the Chapter 4 finite-independence facade on the exact +source carrier. Restriction-local finite independence is available explicitly +from `RestrictionIndependence`. +-/ + +noncomputable section + +open MeasureTheory + +/-- Canonical source-local finite independence for Euclidean-unit-separated +regions. -/ +theorem iIndep_localSigma_of_unitRangeDependentLaw {d : ℕ} {ι : Type*} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] {U : ι → Set (Vec d)} + (hU : ∀ i, MeasurableSet (U i)) + (hP : SourceUnitRangeDependentLaw P) + (hsep : Pairwise fun i j => Source.Coarse.EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndep (fun i => Source.Coarse.localSigma (U i) (hU i)) P := + iIndep_sourceLocalSigma_of_sourceUnitRangeDependentLaw hU hP hsep + +/-- Canonical source-local random-variable independence. -/ +theorem iIndepFun_of_unitRangeDependentLaw_of_pairwise_separated {d : ℕ} + {ι : Type*} {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {U : ι → Set (Vec d)} {X : ∀ i, Source.Coarse.Carrier d → β i} + (hU : ∀ i, MeasurableSet (U i)) + (hP : SourceUnitRangeDependentLaw P) + (hX : ∀ i, IsSourceLocalRandomVariable (U i) (hU i) (X i)) + (hsep : Pairwise fun i j => Source.Coarse.EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndepFun X P := + iIndepFun_of_sourceLocalRandomVariable_of_sourceUnitRangeDependentLaw hU hP hX hsep + +/-- Canonical source-local descendant color-class independence. -/ +theorem iIndepFun_descendantsAtScaleScaleColorClass_of_unitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : SourceCoeffLaw d} [IsProbabilityMeasure P] + {β : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} → Type*} + [∀ R, MeasurableSpace (β R)] + {X : ∀ R, Source.Coarse.Carrier d → β R} + (hP : SourceUnitRangeDependentLaw P) + (hX : ∀ R, IsSourceLocalRandomVariable (cubeSet R.1) (measurableSet_cubeSet R.1) (X R)) : + ProbabilityTheory.iIndepFun X P := + iIndepFun_descendantsAtScaleScaleColorClass_of_sourceUnitRangeDependentLaw hP hX + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/LocalCoefficient.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/LocalCoefficient.lean new file mode 100644 index 0000000000..0a7e536a2c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/LocalCoefficient.lean @@ -0,0 +1,129 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Measurability +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge + +/-! # Local Coefficient -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# Local coefficient observables (carrier re-type, Packet P5e) + +This file starts the Ch4 theorem surface for coefficient-field observables. +The primitive observable is the smooth local test used to generate +the restriction-local observable interface; downstream code should compose from +bundled `RestrictionObservable`s instead of reproving measurability in Chapter 5. + +Following the carrier redesign, the local test observable is evaluated on the +honest sample `a.toFun` of a carrier field `a : RegCoeffField d`. Its locality +is established by the **carrier mixing identity**: the smooth local test is a +finite `(e' i · e j)`-weighted sum of the localized linear entry-test generators +`entryTestR i j φ` of the carrier, each of which is genuinely `LocalSigmaR U`- +measurable (probe supported in `U`), hence restriction-local by +`localSigmaR_le_restrictionSigmaR`. (The observation set's measurability is a +D7-approved side-condition making `RestrictionSigmaR` well defined.) + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +/-- **The carrier mixing identity for the smooth local test.** The smooth local +test on the honest sample of a carrier field is a finite `(e' i · e j)`-weighted +sum of localized linear entry-test generators of the carrier field. It is proved +by expanding the bilinear form and splitting the integral term-by-term (each term +integrable: locally-integrable carrier entry times bounded compactly-supported +probe). -/ +theorem localTestObservable_toFun_eq_sum_entryTestR {d : ℕ} + (e e' : Vec d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) (a : RegCoeffField d) : + localTestObservable e e' φ a.toFun = + ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a := by + have hpt : ∀ x : Vec d, + vecDot e' (matVecMul (a.toFun x) e) * φ x = + ∑ i, ∑ j, (e' i * e j) * (a x i j * φ x) := by + intro x + simp only [vecDot, matVecMul, Finset.sum_mul, Finset.mul_sum] + refine Finset.sum_congr rfl (fun i _ => Finset.sum_congr rfl (fun j _ => ?_)) + ring + have hintegrable : ∀ i j : Fin d, + Integrable (fun x => (e' i * e j) * (a x i j * φ x)) volume := + fun i j => (integrable_entry_mul_probe i j hφ a).const_mul _ + calc + localTestObservable e e' φ a.toFun + = ∫ x, ∑ i, ∑ j, (e' i * e j) * (a x i j * φ x) ∂volume := by + unfold localTestObservable + exact integral_congr_ae (Filter.Eventually.of_forall hpt) + _ = ∑ i, ∫ x, ∑ j, (e' i * e j) * (a x i j * φ x) ∂volume := by + rw [MeasureTheory.integral_finsetSum] + intro i _ + exact integrable_finsetSum _ (fun j _ => hintegrable i j) + _ = ∑ i, ∑ j, ∫ x, (e' i * e j) * (a x i j * φ x) ∂volume := by + refine Finset.sum_congr rfl (fun i _ => ?_) + rw [MeasureTheory.integral_finsetSum] + intro j _ + exact hintegrable i j + _ = ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a := by + refine Finset.sum_congr rfl (fun i _ => Finset.sum_congr rfl (fun j _ => ?_)) + rw [integral_const_mul] + rfl + +namespace RestrictionObservable + +/-- The smooth coefficient-field test observable, evaluated on the honest sample, +bundled with its Ch4 locality proof. The observation-set measurability `hU` is +the D7-approved side-condition making `RestrictionSigmaR` well defined. -/ +noncomputable def localTest {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (e e' : Vec d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) : + RestrictionObservable d U ℝ where + measurableSet := hU + toFun := fun a => localTestObservable e e' φ a.toFun + isLocal := by + have hφ : IsProbeR φ := IsProbeR.of_smooth hφ_cont hφ_compact + have hsupp : Function.support φ ⊆ U := (subset_tsupport φ).trans hφ_support + have hrw : + (fun a : RegCoeffField d => localTestObservable e e' φ a.toFun) = + fun a => ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a := by + funext a + exact localTestObservable_toFun_eq_sum_entryTestR e e' hφ a + show @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ + (fun a => localTestObservable e e' φ a.toFun) + rw [hrw] + let : MeasurableSpace (RegCoeffField d) := LocalSigmaR U + have hlocal : + Measurable + (fun a : RegCoeffField d => ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a) := by + refine Finset.measurable_sum _ (fun i _ => Finset.measurable_sum _ (fun j _ => ?_)) + exact (measurable_entryTestR_localSigmaR i j hφ hsupp).const_mul _ + exact hlocal.mono (localSigmaR_le_restrictionSigmaR U hU) le_rfl + +@[simp] +theorem localTest_apply {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (e e' : Vec d) {φ : Vec d → ℝ} + (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_support : tsupport φ ⊆ U) (a : RegCoeffField d) : + localTest hU e e' hφ_cont hφ_compact hφ_support a = + localTestObservable e e' φ a.toFun := + rfl + +end RestrictionObservable + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds.lean new file mode 100644 index 0000000000..c94a3bf7a7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Helpers +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Apex + +/-! # Moment Factor Bounds -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Apex.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Apex.lean new file mode 100644 index 0000000000..5cb50b2c36 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Apex.lean @@ -0,0 +1,489 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds + +/-! # Apex -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise Matrix.Norms.L2Operator BigOperators + +noncomputable section + +namespace RestrictionLawCarrier + +/-- A full coarse block is integrable as soon as the two factor observables on +the same cube have finite `ξ` moments. + +This is the Ch4 source theorem that prevents Ch5 from carrying a separate +full-block integrability hypothesis once it has the factor moments. -/ +theorem integrable_coarseFullBlockMatrixAtCube_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hUpperPowInt : + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField Q sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹) ^ ξ) P) : + Integrable (coarseFullBlockMatrixAtCube Q) P := by + let : IsProbabilityMeasure P := hP.isProbability + have hUpperEntryAbsInt : + ∀ i j : Fin d, + Integrable + (fun a : RegCoeffField d => + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j|) P := by + intro i j + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j + let Y : RegCoeffField d → ℝ := + fun a => LambdaSqCoeffField Q sUpper (.finite 1) a + have hX_meas : AEMeasurable X P := by + simpa [X] using hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + LambdaSqCoeffField_finite_nonneg Q a hsUpper (by norm_num : (1 : ℝ) ≤ 1) + have hXY : (fun a => |X a|) ≤ᵐ[P] Y := by + simpa [X, Y] using + upperLeft_abs_entry_le_LambdaSqCoeffField_ae hP Q hsUpper i j + have hAbsPowInt : Integrable (fun a => |X a| ^ ξ) P := + integrable_abs_pow_of_ae_abs_le_nonneg hX_meas hY_nonneg hXY + (by simpa [Y] using hUpperPowInt) + have hAbsMeas : AEMeasurable (fun a => |X a|) P := by + simpa [Real.norm_eq_abs] using hX_meas.norm + have hAbsNonneg : ∀ᵐ a ∂P, 0 ≤ |X a| := + Filter.Eventually.of_forall fun a => abs_nonneg (X a) + simpa [X] using + integrable_of_ae_nonneg_pow_integrable hξ hAbsMeas hAbsNonneg hAbsPowInt + have hLowerEntryAbsInt : + ∀ i j : Fin d, + Integrable + (fun a : RegCoeffField d => + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j|) P := by + intro i j + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j + let Y : RegCoeffField d → ℝ := + fun a => (lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ + have hX_meas : AEMeasurable X P := by + simpa [X] using hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + inv_nonneg.mpr + (lambdaSqCoeffField_finite_nonneg Q a hsLower (by norm_num : (1 : ℝ) ≤ 1)) + have hXY : (fun a => |X a|) ≤ᵐ[P] Y := by + simpa [X, Y] using + lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae hP Q hsLower i j + have hAbsPowInt : Integrable (fun a => |X a| ^ ξ) P := + integrable_abs_pow_of_ae_abs_le_nonneg hX_meas hY_nonneg hXY + (by simpa [Y] using hLowerPowInt) + have hAbsMeas : AEMeasurable (fun a => |X a|) P := by + simpa [Real.norm_eq_abs] using hX_meas.norm + have hAbsNonneg : ∀ᵐ a ∂P, 0 ≤ |X a| := + Filter.Eventually.of_forall fun a => abs_nonneg (X a) + simpa [X] using + integrable_of_ae_nonneg_pow_integrable hξ hAbsMeas hAbsNonneg hAbsPowInt + have hBInt : Integrable (fun a : RegCoeffField d => coarseBBlockNorm Q a.toFun) P := by + have hSumInt : + Integrable + (fun a : RegCoeffField d => + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j|) P := by + refine integrable_finsetSum Finset.univ ?_ + intro i _hi + refine integrable_finsetSum Finset.univ ?_ + intro j _hj + exact hUpperEntryAbsInt i j + have hBMeas : + AEMeasurable (fun a : RegCoeffField d => coarseBBlockNorm Q a.toFun) P := by + have hSqMeas : + AEMeasurable + (fun a : RegCoeffField d => + matNormSq (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft) P := by + unfold matNormSq + exact + Finset.aemeasurable_fun_sum Finset.univ fun i _hi => + Finset.aemeasurable_fun_sum Finset.univ fun j _hj => + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j).pow_const 2 + simpa [coarseBBlockNorm, matNorm] using hSqMeas.sqrt + refine hSumInt.mono' hBMeas.aestronglyMeasurable ?_ + filter_upwards with a + have hbound := + Ch02.matNorm_le_sum_abs_entries + ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft) + have hsum_nonneg : + 0 ≤ ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| := by + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + have hleft : + ‖coarseBBlockNorm Q a.toFun‖ = coarseBBlockNorm Q a.toFun := by + simp [Real.norm_eq_abs, abs_of_nonneg (coarseBBlockNorm_nonneg Q a)] + have hright : + ‖(∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j|)‖ = + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| := by + simp [Real.norm_eq_abs, abs_of_nonneg hsum_nonneg] + have hbound_abs : + |matNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft| ≤ + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| := by + simpa [abs_of_nonneg (matNorm_nonneg _)] using hbound + simpa [hleft, hright, coarseBBlockNorm] using hbound_abs + have hStarInt : + Integrable (fun a : RegCoeffField d => coarseSigmaStarInvBlockNorm Q a.toFun) P := by + have hSumInt : + Integrable + (fun a : RegCoeffField d => + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j|) P := by + refine integrable_finsetSum Finset.univ ?_ + intro i _hi + refine integrable_finsetSum Finset.univ ?_ + intro j _hj + exact hLowerEntryAbsInt i j + have hStarMeas : + AEMeasurable (fun a : RegCoeffField d => coarseSigmaStarInvBlockNorm Q a.toFun) P := by + have hSqMeas : + AEMeasurable + (fun a : RegCoeffField d => + matNormSq (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight) P := by + unfold matNormSq + exact + Finset.aemeasurable_fun_sum Finset.univ fun i _hi => + Finset.aemeasurable_fun_sum Finset.univ fun j _hj => + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j).pow_const 2 + simpa [coarseSigmaStarInvBlockNorm, matNorm] using hSqMeas.sqrt + refine hSumInt.mono' hStarMeas.aestronglyMeasurable ?_ + filter_upwards with a + have hbound := + Ch02.matNorm_le_sum_abs_entries + ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight) + have hsum_nonneg : + 0 ≤ ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| := by + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + have hleft : + ‖coarseSigmaStarInvBlockNorm Q a.toFun‖ = coarseSigmaStarInvBlockNorm Q a.toFun := by + simp [Real.norm_eq_abs, abs_of_nonneg (coarseSigmaStarInvBlockNorm_nonneg Q a)] + have hright : + ‖(∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j|)‖ = + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| := by + simp [Real.norm_eq_abs, abs_of_nonneg hsum_nonneg] + have hbound_abs : + |matNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight| ≤ + ∑ i : Fin d, ∑ j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| := by + simpa [abs_of_nonneg (matNorm_nonneg _)] using hbound + simpa [hleft, hright, coarseSigmaStarInvBlockNorm] using hbound_abs + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_diagonalBlockNorms + Q hBInt hStarInt + +/-- The unit full coarse block is integrable as soon as the two unit factor +observables in `(P4)` have finite `ξ` moments. -/ +theorem integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hUpperPowInt : + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d 0) sLower (.finite 1) a)⁻¹) ^ ξ) P) : + Integrable (coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := by + simpa using + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_factor_observables + (originCube d (0 : ℤ)) hsUpper hsLower hξ hUpperPowInt hLowerPowInt + +/-- Law-facing construction of the primitive moment-factor package. + +This theorem owns the deterministic one-cube ellipticity domination, the +passage from scalar annealed blocks to coefficient-field ellipticity +observables, and the `L^ξ` mean-to-root comparison. -/ +private theorem annealedPrimitiveMomentFactorBounds_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hBlock : + ∀ n : ℕ, + Integrable (coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) + (hUpperMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) P) + (hLowerMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + (lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) P) + (hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ ξ) P) : + AnnealedPrimitiveMomentFactorBounds (d := d) P sUpper sLower ξ where + upper := by + intro primitive n + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft 0 0 + let Y : RegCoeffField d → ℝ := + fun a => LambdaSqCoeffField Q sUpper (.finite 1) a + have hEntryInt : Integrable X P := by + simpa [X, Q, blockMatEntry] using + integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + (hBlock n) (Sum.inl (0 : Fin d)) (Sum.inl (0 : Fin d)) + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => by + exact LambdaSqCoeffField_finite_nonneg Q a hsUpper (by norm_num : (1 : ℝ) ≤ 1) + have hYInt : Integrable Y P := + integrable_of_ae_nonneg_pow_integrable hξ + (by simpa [Y, Q] using hUpperMeas n) hY_nonneg + (by simpa [Y, Q] using hUpperPowInt n) + have hYMeanLeRoot : + ∫ a, Y a ∂P ≤ LambdaMomentAtScale P (n : ℤ) sUpper ξ := by + simpa [Y, Q, LambdaMomentAtScale] using + integral_le_annealedMomentRoot_of_ae_nonneg hξ + (by simpa [Y, Q] using hUpperMeas n) hY_nonneg + (by simpa [Y, Q] using hUpperPowInt n) + have hEntryEq : + ∫ a, X a ∂P = Internal.barBAtScaleOfPrimitive (primitive n) := by + simpa [X, Q, Internal.barBAtScaleOfPrimitive, annealedBAtScale, annealedB, + annealedBlockMatrix] using + congrArg (fun M : Mat d => M 0 0) (primitive n).b_eq + calc + Internal.barBAtScaleOfPrimitive (primitive n) + = ∫ a, X a ∂P := hEntryEq.symm + _ ≤ ∫ a, Y a ∂P := + integral_mono_ae hEntryInt hYInt + (by + simpa [X, Y, Q] using + upperLeft_entry_le_LambdaSqCoeffField_ae hP Q hsUpper) + _ ≤ LambdaMomentAtScale P (n : ℤ) sUpper ξ := hYMeanLeRoot + lower := by + intro primitive n + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight 0 0 + let Y : RegCoeffField d → ℝ := + fun a => (lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ + have hEntryInt : Integrable X P := by + simpa [X, Q, blockMatEntry] using + integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + (hBlock n) (Sum.inr (0 : Fin d)) (Sum.inr (0 : Fin d)) + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => by + exact inv_nonneg.mpr + (lambdaSqCoeffField_finite_nonneg Q a hsLower (by norm_num : (1 : ℝ) ≤ 1)) + have hYInt : Integrable Y P := + integrable_of_ae_nonneg_pow_integrable hξ + (by simpa [Y, Q] using hLowerMeas n) hY_nonneg + (by simpa [Y, Q] using hLowerPowInt n) + have hYMeanLeRoot : + ∫ a, Y a ∂P ≤ lambdaInvMomentAtScale P (n : ℤ) sLower ξ := by + simpa [Y, Q, lambdaInvMomentAtScale] using + integral_le_annealedMomentRoot_of_ae_nonneg hξ + (by simpa [Y, Q] using hLowerMeas n) hY_nonneg + (by simpa [Y, Q] using hLowerPowInt n) + have hEntryEq : + ∫ a, X a ∂P = Internal.barSigmaStarInvAtScaleOfPrimitive (primitive n) := by + simpa [X, Q, Internal.barSigmaStarInvAtScaleOfPrimitive, annealedSigmaStarInvAtScale, + annealedSigmaStarInv, annealedBlockMatrix] using + congrArg (fun M : Mat d => M 0 0) (primitive n).sigmaStarInv_eq + calc + Internal.barSigmaStarInvAtScaleOfPrimitive (primitive n) + = ∫ a, X a ∂P := hEntryEq.symm + _ ≤ ∫ a, Y a ∂P := + integral_mono_ae hEntryInt hYInt + (by + simpa [X, Y, Q] using + lowerRight_entry_le_lambdaSqCoeffField_inv_ae hP Q hsLower) + _ ≤ lambdaInvMomentAtScale P (n : ℤ) sLower ξ := hYMeanLeRoot + +/-- Structural-law upper scalar factor bound from integrable moment +observables. -/ +theorem barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hBlock : + ∀ n : ℕ, + Integrable (coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) + (hUpperMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) P) + (hLowerMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + (lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) P) + (hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ ξ) P) + (n : ℕ) : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + LambdaMomentAtScale P (n : ℤ) sUpper ξ := by + let primitive : AnnealedPrimitiveScalarizationFamily (d := d) P := + fun n => Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (n : ℤ) + have hBounds := + hP.annealedPrimitiveMomentFactorBounds_of_integrable_factor_observables + hsUpper hsLower hξ hBlock hUpperMeas hLowerMeas hUpperPowInt hLowerPowInt + have hbar := hP.barSigmaAtScale_eq_barBAtScale hStruct (n : ℤ) + rw [hbar] + simpa [barBAtScale, primitive] using hBounds.upper primitive n + +/-- Structural-law lower inverse-star scalar factor bound from integrable +moment observables. -/ +theorem barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hBlock : + ∀ n : ℕ, + Integrable (coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) + (hUpperMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) P) + (hLowerMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + (lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) P) + (hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ ξ) P) + (n : ℕ) : + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ ≤ + lambdaInvMomentAtScale P (n : ℤ) sLower ξ := by + let primitive : AnnealedPrimitiveScalarizationFamily (d := d) P := + fun n => Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (n : ℤ) + have hBounds := + hP.annealedPrimitiveMomentFactorBounds_of_integrable_factor_observables + hsUpper hsLower hξ hBlock hUpperMeas hLowerMeas hUpperPowInt hLowerPowInt + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (n : ℤ) + rw [hstar, inv_inv] + simpa [barSigmaStarInvAtScale, primitive] using hBounds.lower primitive n + +/-- Direct structural-law comparison `Theta_n <= widetildeTheta_n` from +integrable moment observables. -/ +theorem thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) + {sUpper sLower : ℝ} {ξ : ℕ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) (hξ : 1 ≤ ξ) + (hBlock : + ∀ n : ℕ, + Integrable (coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) + (hUpperMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) P) + (hLowerMeas : + ∀ n : ℕ, + AEMeasurable + (fun a : RegCoeffField d => + (lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) P) + (hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ ξ) P) + (hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ ξ) P) + (n : ℕ) : + hP.thetaAtScale hStruct (n : ℤ) ≤ + widetildeThetaAtScale P (n : ℤ) sUpper sLower ξ := by + have hUpper : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + LambdaMomentAtScale P (n : ℤ) sUpper ξ := + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hsUpper hsLower hξ hBlock hUpperMeas hLowerMeas hUpperPowInt + hLowerPowInt n + have hLower : + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ ≤ + lambdaInvMomentAtScale P (n : ℤ) sLower ξ := + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hsUpper hsLower hξ hBlock hUpperMeas hLowerMeas hUpperPowInt + hLowerPowInt n + have hStarInv_nonneg : + 0 ≤ (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ := by + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (n : ℤ) + rw [hstar, inv_inv] + simpa [barSigmaStarInvAtScale] using + (Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (n : ℤ)) + (hBlock n)).le + have hUpperMoment_nonneg : + 0 ≤ LambdaMomentAtScale P (n : ℤ) sUpper ξ := + LambdaMomentAtScale_nonneg P (n : ℤ) ξ hsUpper + simpa [thetaAtScale, widetildeThetaAtScale] using + mul_le_mul hUpper hLower hStarInv_nonneg hUpperMoment_nonneg + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/FactorBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/FactorBounds.lean new file mode 100644 index 0000000000..d0f4d45d20 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/FactorBounds.lean @@ -0,0 +1,564 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Helpers + +/-! # Factor Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise Matrix.Norms.L2Operator BigOperators + +noncomputable section + +namespace RestrictionLawCarrier + +/-- Lower-right finite-parent coarse-block fluctuation bound, stated directly +against the law-facing Ch4 surface. The proof owns all locality, +measurability, covariance, and deterministic positive-excess domination. -/ +theorem lowerRight_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {n : ℤ} {ξ : ℕ} {K B : ℝ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d n)) b).lowerRight i j ∂P) + (hξ : 2 ≤ ξ) (hK_nonneg : 0 ≤ K) (hB_nonneg : 0 ≤ B) + (hOriginLp_int : + ∀ i j : Fin d, + Integrable + (fun a => + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ ξ) P) + (hOriginLp : + ∀ i j : Fin d, + (∫ a, + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ K) + (hBudget : + ∀ Q ∈ parents, + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n ξ * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (ξ : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n ξ * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) ≤ B) : + annealedMomentRoot P ξ + (fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + ((parents.card : ℝ) ^ (1 / (ξ : ℝ)) * B) := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := (parents.card : ℝ) ^ (1 / (ξ : ℝ)) * B + let excess : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) + let entry : Fin d → Fin d → RegCoeffField d → ℝ := + fun i j a => + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a|) + have hξ_one : 1 ≤ ξ := by omega + have hexcess_nonneg : ∀ a, 0 ≤ excess a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) hQ0) + have hentry_nonneg : ∀ i j a, 0 ≤ entry i j a := by + intro i j a + exact finsetSup_abs_restrictionCenteredDescendantAverageOnCube_nonneg hparents + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a + have hexcess_aemeas : AEMeasurable excess P := by + simpa [excess] using + aemeasurable_lowerRight_matrixNorm_positiveExcess_finsetSup hP hparents center + have hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P := by + intro i j + simpa [entry] using + aemeasurable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube + (P := P) (n := n) hparents + (fun U a => (coarseBlockMatrix U a).lowerRight i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + have hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P := by + intro i j + have hint : + Integrable + (fun a : RegCoeffField d => + (parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a|)) ^ ξ) P := + integrable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_of_stationary + (d := d) (n := n) (P := P) (parents := parents) hparents + hn hparent_scale hPstat + (fun U a => (coarseBlockMatrix U a).lowerRight i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inr i) (Sum.inr j))) + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + hξ_one (hOriginLp_int i j) + refine hint.congr ?_ + filter_upwards with a + simp [entry, abs_of_nonneg (hentry_nonneg i j a)] + have hentry_root : + ∀ i j, + (∫ a, |entry i j a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ C := by + intro i j + have hroot := + integral_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (n := n) (P := P) (parents := parents) hparents + (p := ξ) (K := K) (B := B) + hP hn hparent_scale hPstat hPdep + (fun U a => (coarseBlockMatrix U a).lowerRight i j) + (fun Q hQ R hR => + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inr i) (Sum.inr j))) + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + hξ hK_nonneg hB_nonneg (hOriginLp_int i j) (hOriginLp i j) hBudget + calc + (∫ a, |entry i j a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + = (∫ a, entry i j a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hentry_nonneg i j a)]) + _ ≤ C := by + simpa [entry, C] using hroot + have hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a := by + simpa [excess, entry] using + hP.coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + hparents hparent_scale center hcenter + simpa [excess, entry, C] using + momentRoot_excess_le_card_mul_entryRootBound + (P := P) (ξ := ξ) (C := C) hξ_one + excess entry hexcess_nonneg hexcess_aemeas hentry_nonneg + hentry_aemeas hentry_int hentry_root hpoint + +private theorem upperLeft_abs_entry_le_LambdaSqCoeffField_ae_aux + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (i j : Fin d) : + (fun a : RegCoeffField d => |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j|) ≤ᵐ[P] + fun a => LambdaSqCoeffField Q s (.finite 1) a := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hEntry : + |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft i j| ≤ + Ch02.coarseBMatrixNorm Q F := by + simpa [Ch02.coarseBMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft) i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft i j| := by + rw [hEq] + _ ≤ Ch02.coarseBMatrixNorm Q F := hEntry + _ ≤ Ch02.LambdaSq Q s (.finite 1) F := + Ch02.oneCube_b_le_LambdaSq_finite Q F hs (by norm_num : (1 : ℝ) ≤ 1) + _ = LambdaSqCoeffField Q s (.finite 1) a := by + simp [LambdaSqCoeffField, ha, F] + +private theorem lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae_aux + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (i j : Fin d) : + (fun a : RegCoeffField d => |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j|) ≤ᵐ[P] + fun a => (lambdaSqCoeffField Q s (.finite 1) a)⁻¹ := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hEntry : + |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight i j| ≤ + Ch02.coarseSigmaStarInvMatrixNorm Q F := by + simpa [Ch02.coarseSigmaStarInvMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight) i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight i j| := by + rw [hEq] + _ ≤ Ch02.coarseSigmaStarInvMatrixNorm Q F := hEntry + _ ≤ (Ch02.lambdaSq Q s (.finite 1) F)⁻¹ := + Ch02.oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q F hs + (by norm_num : (1 : ℝ) ≤ 1) + _ = (lambdaSqCoeffField Q s (.finite 1) a)⁻¹ := by + simp [lambdaSqCoeffField, ha, F] + + +theorem upperLeft_entry_le_LambdaSqCoeffField_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft 0 0) ≤ᵐ[P] + fun a => LambdaSqCoeffField Q s (.finite 1) a := by + filter_upwards [upperLeft_abs_entry_le_LambdaSqCoeffField_ae_aux hP Q hs 0 0] with a hle + exact (le_abs_self ((coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft 0 0)).trans hle + +theorem lowerRight_entry_le_lambdaSqCoeffField_inv_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight 0 0) ≤ᵐ[P] + fun a => (lambdaSqCoeffField Q s (.finite 1) a)⁻¹ := by + filter_upwards [lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae_aux hP Q hs 0 0] with a hle + exact (le_abs_self ((coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight 0 0)).trans hle + +theorem upperLeft_abs_entry_le_LambdaSqCoeffField_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (i j : Fin d) : + (fun a : RegCoeffField d => |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j|) ≤ᵐ[P] + fun a => LambdaSqCoeffField Q s (.finite 1) a := by + exact upperLeft_abs_entry_le_LambdaSqCoeffField_ae_aux hP Q hs i j + +theorem lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (i j : Fin d) : + (fun a : RegCoeffField d => |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j|) ≤ᵐ[P] + fun a => (lambdaSqCoeffField Q s (.finite 1) a)⁻¹ := by + exact lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae_aux hP Q hs i j + +theorem integrable_abs_pow_of_ae_abs_le_nonneg + {d : ℕ} {P : RestrictionCoeffLaw d} {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a) + (hXY : (fun a => |X a|) ≤ᵐ[P] Y) + (hY_pow_int : Integrable (fun a => Y a ^ ξ) P) : + Integrable (fun a => |X a| ^ ξ) P := by + have hY_abs_pow_int : Integrable (fun a => |Y a| ^ ξ) P := by + refine hY_pow_int.congr ?_ + filter_upwards [hY_nonneg] with a ha + simp [abs_of_nonneg ha] + refine Integrable.mono' hY_abs_pow_int ?_ ?_ + · exact ((hX_meas.norm.pow_const ξ)).aestronglyMeasurable + · filter_upwards [hY_nonneg, hXY] with a hY_nonneg_a hXY_a + have hpow : |X a| ^ ξ ≤ |Y a| ^ ξ := by + simpa [abs_of_nonneg hY_nonneg_a] using + pow_le_pow_left₀ (abs_nonneg (X a)) hXY_a ξ + have hleft_nonneg : 0 ≤ |X a| ^ ξ := + pow_nonneg (abs_nonneg (X a)) ξ + have hright_nonneg : 0 ≤ |Y a| ^ ξ := + pow_nonneg (abs_nonneg (Y a)) ξ + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, + abs_of_nonneg hright_nonneg] using hpow + +private theorem annealedMomentRoot_abs_le_of_ae_abs_le_nonneg + {d : ℕ} {P : RestrictionCoeffLaw d} {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (_hY_nonneg : ∀ a, 0 ≤ Y a) + (hXY : (fun a => |X a|) ≤ᵐ[P] Y) + (hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P) + (hY_pow_int : Integrable (fun a => Y a ^ ξ) P) : + annealedMomentRoot P ξ (fun a => |X a|) ≤ annealedMomentRoot P ξ Y := by + have hpow : + (fun a => |X a| ^ ξ) ≤ᵐ[P] fun a => Y a ^ ξ := by + filter_upwards [hXY] with a hle + exact pow_le_pow_left₀ (abs_nonneg (X a)) hle ξ + have hint_le : + ∫ a, |X a| ^ ξ ∂P ≤ ∫ a, Y a ^ ξ ∂P := + integral_mono_ae hX_abs_pow_int hY_pow_int hpow + have hleft_nonneg : 0 ≤ ∫ a, |X a| ^ ξ ∂P := + integral_nonneg fun a => pow_nonneg (abs_nonneg (X a)) ξ + have hexp_nonneg : 0 ≤ 1 / (ξ : ℝ) := by positivity + simpa [annealedMomentRoot] using + Real.rpow_le_rpow hleft_nonneg hint_le hexp_nonneg + +private theorem annealedMomentRoot_abs_sub_integral_le_two_mul + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P) : + annealedMomentRoot P ξ + (fun a => |X a - ∫ b, X b ∂P|) ≤ + 2 * annealedMomentRoot P ξ (fun a => |X a|) := by + have hξ_ne : ξ ≠ 0 := by omega + have hmem_p : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_pow_int + have hmem_one : MemLp X (1 : ENNReal) P := + hmem_p.mono_exponent (by exact_mod_cast hξ) + have hX_int : Integrable X P := by + rwa [MeasureTheory.memLp_one_iff_integrable] at hmem_one + let c : ℝ := ∫ b, X b ∂P + have hconst_mem : MemLp (fun _ : RegCoeffField d => c) (ξ : ENNReal) P := + memLp_const c + have hcenter_mem : MemLp (fun a => X a - c) (ξ : ENNReal) P := + hmem_p.sub hconst_mem + have hcenter_toReal : + ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) = + annealedMomentRoot P ξ (fun a => |X a - c|) := by + calc + ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) + = (∫ a, ‖X a - c‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := fun a => X a - c) (p := ξ) hξ hcenter_mem + _ = annealedMomentRoot P ξ (fun a => |X a - c|) := by + simp [annealedMomentRoot, Real.norm_eq_abs] + have hX_toReal : + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) = + annealedMomentRoot P ξ (fun a => |X a|) := by + calc + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) + = (∫ a, ‖X a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := X) (p := ξ) hξ hmem_p + _ = annealedMomentRoot P ξ (fun a => |X a|) := by + simp [annealedMomentRoot, Real.norm_eq_abs] + have hroot_abs_nonneg : + 0 ≤ annealedMomentRoot P ξ (fun a => |X a|) := + annealedMomentRoot_nonneg_of_nonneg P ξ fun a => abs_nonneg (X a) + have hmean_le : + |c| ≤ annealedMomentRoot P ξ (fun a => |X a|) := by + have hAbs_meas : AEMeasurable (fun a => |X a|) P := by + simpa [Real.norm_eq_abs] using hX_meas.norm + have hAbs_int : Integrable (fun a => |X a|) P := by + have hAbs_mem_one : MemLp (fun a => |X a|) (1 : ENNReal) P := by + have hAbs_mem_p : MemLp (fun a => |X a|) (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hAbs_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs, abs_abs] using hX_abs_pow_int + exact hAbs_mem_p.mono_exponent (by exact_mod_cast hξ) + rwa [MeasureTheory.memLp_one_iff_integrable] at hAbs_mem_one + have hInt_le_root : + ∫ a, |X a| ∂P ≤ annealedMomentRoot P ξ (fun a => |X a|) := by + exact integral_le_annealedMomentRoot_of_ae_nonneg hξ hAbs_meas + (Filter.Eventually.of_forall fun a => abs_nonneg (X a)) + (by simpa using hX_abs_pow_int) + exact (abs_integral_le_integral_abs (f := X) (μ := P)).trans hInt_le_root + have hconst_toReal : + ENNReal.toReal (eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P) = |c| := by + have hμ_ne_zero : (P : Measure (RegCoeffField d)) ≠ 0 := + IsProbabilityMeasure.ne_zero P + have hξ_enn_ne_zero : (ξ : ENNReal) ≠ 0 := by exact_mod_cast hξ_ne + rw [MeasureTheory.eLpNorm_const (μ := P) (c := c) (p := (ξ : ENNReal)) + hξ_enn_ne_zero hμ_ne_zero] + simp [IsProbabilityMeasure.measure_univ, Real.norm_eq_abs] + have hconst_ne_top : + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P ≠ ⊤ := + hconst_mem.2.ne + have hsum_ne_top : + eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P ≠ ⊤ := + ENNReal.add_ne_top.mpr ⟨hmem_p.2.ne, hconst_ne_top⟩ + have hsub_le : + eLpNorm (fun a => X a - c) (ξ : ENNReal) P ≤ + eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P := by + simpa [c, Pi.sub_apply] using! + eLpNorm_sub_le hX_meas.aestronglyMeasurable + (aestronglyMeasurable_const (μ := P) (b := c)) + (by exact_mod_cast hξ) + calc + annealedMomentRoot P ξ (fun a => |X a - ∫ b, X b ∂P|) + = ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) := by + simp [hcenter_toReal, c] + _ ≤ ENNReal.toReal + (eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P) := + ENNReal.toReal_mono hsum_ne_top hsub_le + _ = annealedMomentRoot P ξ (fun a => |X a|) + |c| := by + rw [ENNReal.toReal_add hmem_p.2.ne hconst_ne_top, + hX_toReal, hconst_toReal] + _ ≤ annealedMomentRoot P ξ (fun a => |X a|) + + annealedMomentRoot P ξ (fun a => |X a|) := by + gcongr + _ = 2 * annealedMomentRoot P ξ (fun a => |X a|) := by ring + +private theorem centered_abs_sub_integrable_and_momentRoot_le_two_of_abs_le_nonneg + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hX_meas : AEMeasurable X P) + (hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a) (hY_nonneg_forall : ∀ a, 0 ≤ Y a) + (hXY : (fun a => |X a|) ≤ᵐ[P] Y) + (hY_pow_int : Integrable (fun a => Y a ^ ξ) P) : + Integrable (fun a => |X a - ∫ b, X b ∂P| ^ ξ) P ∧ + (∫ a, |X a - ∫ b, X b ∂P| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ + 2 * annealedMomentRoot P ξ Y := by + have hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P := + integrable_abs_pow_of_ae_abs_le_nonneg hX_meas hY_nonneg hXY hY_pow_int + have hcenter_int : Integrable (fun a => |X a - ∫ b, X b ∂P| ^ ξ) P := by + have hcenter_mem : MemLp (fun a => X a - ∫ b, X b ∂P) (ξ : ENNReal) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hmem_p : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_pow_int + exact hmem_p.sub (memLp_const (∫ b, X b ∂P)) + have hξ_ne : (ξ : ENNReal) ≠ 0 := by + have hnat : ξ ≠ 0 := by omega + exact_mod_cast hnat + have hξ_top : (ξ : ENNReal) ≠ ⊤ := by simp + have hint := hcenter_mem.integrable_norm_rpow hξ_ne hξ_top + simpa [Real.norm_eq_abs] using hint + constructor + · exact hcenter_int + · have hroot := + annealedMomentRoot_abs_sub_integral_le_two_mul + (P := P) (ξ := ξ) (X := X) hξ hX_meas hX_abs_pow_int + have hUncentered : + annealedMomentRoot P ξ (fun a => |X a|) ≤ annealedMomentRoot P ξ Y := + annealedMomentRoot_abs_le_of_ae_abs_le_nonneg + (P := P) (ξ := ξ) (X := X) (Y := Y) + hξ hY_nonneg_forall hXY hX_abs_pow_int hY_pow_int + calc + (∫ a, |X a - ∫ b, X b ∂P| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + ≤ 2 * annealedMomentRoot P ξ (fun a => |X a|) := by + simpa [annealedMomentRoot] using hroot + _ ≤ 2 * annealedMomentRoot P ξ Y := by + exact mul_le_mul_of_nonneg_left hUncentered (by norm_num) + +/-- Unit-scale centered upper-left entries have their `L^ξ` roots controlled +by the unit upper multiscale ellipticity moment. -/ +theorem restrictionCenteredOriginObservable_upperLeft_entry_momentRoot_le_two_LambdaMomentAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {s : ℝ} {ξ : ℕ} (hs : 0 < s) (hξ : 1 ≤ ξ) + (hUpperPowInt : + Integrable + (fun a : RegCoeffField d => + (LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) + (i j : Fin d) : + Integrable + (fun a => + |restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ ξ) P ∧ + (∫ a, + |restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ + 2 * LambdaMomentAtScale P 0 s ξ := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet (originCube d 0)) a).upperLeft i j + let Y : RegCoeffField d → ℝ := + fun a => LambdaSqCoeffField (originCube d 0) s (.finite 1) a + have hX_meas : AEMeasurable X P := by + simpa [X] using hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + (originCube d 0) i j + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + LambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg_forall : ∀ a, 0 ≤ Y a := fun a => + LambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hXY : (fun a => |X a|) ≤ᵐ[P] Y := by + simpa [X, Y] using + upperLeft_abs_entry_le_LambdaSqCoeffField_ae hP (originCube d 0) hs i j + simpa [restrictionCenteredOriginObservable, X, Y, LambdaMomentAtScale] using + centered_abs_sub_integrable_and_momentRoot_le_two_of_abs_le_nonneg + (P := P) (ξ := ξ) (X := X) (Y := Y) + hξ hX_meas hY_nonneg hY_nonneg_forall hXY + (by simpa [Y] using hUpperPowInt) + +/-- Unit-scale centered lower-right entries have their `L^ξ` roots controlled +by the unit lower inverse multiscale ellipticity moment. -/ +theorem restrictionCenteredOriginObservable_lowerRight_entry_momentRoot_le_two_lambdaInvMomentAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {s : ℝ} {ξ : ℕ} (hs : 0 < s) (hξ : 1 ≤ ξ) + (hLowerPowInt : + Integrable + (fun a : RegCoeffField d => + ((lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) + (i j : Fin d) : + Integrable + (fun a => + |restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ ξ) P ∧ + (∫ a, + |restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ + 2 * lambdaInvMomentAtScale P 0 s ξ := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := + fun a => (coarseBlockMatrix (cubeSet (originCube d 0)) a).lowerRight i j + let Y : RegCoeffField d → ℝ := + fun a => (lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹ + have hX_meas : AEMeasurable X P := by + simpa [X] using hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + (originCube d 0) i j + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + inv_nonneg.mpr + (lambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hY_nonneg_forall : ∀ a, 0 ≤ Y a := fun a => + inv_nonneg.mpr + (lambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hXY : (fun a => |X a|) ≤ᵐ[P] Y := by + simpa [X, Y] using + lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae hP (originCube d 0) hs i j + simpa [restrictionCenteredOriginObservable, X, Y, lambdaInvMomentAtScale] using + centered_abs_sub_integrable_and_momentRoot_le_two_of_abs_le_nonneg + (P := P) (ξ := ξ) (X := X) (Y := Y) + hξ hX_meas hY_nonneg hY_nonneg_forall hXY + (by simpa [Y] using hLowerPowInt) + + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Helpers.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Helpers.lean new file mode 100644 index 0000000000..2abc9b3dbf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/MomentFactorBounds/Helpers.lean @@ -0,0 +1,867 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory + +/-! # Helpers -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise Matrix.Norms.L2Operator BigOperators + +/-! +# Moment factor bounds + +This file exposes Chapter 4 scalar factor bounds used to compare the structural +contrast `Theta_n` with the moment-enhanced quantity `widetildeTheta_n`. +-/ + +noncomputable section + +/-- Proof-local primitive scalarization data at every nonnegative scale. -/ +abbrev AnnealedPrimitiveScalarizationFamily {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) : Prop := + ∀ n : ℕ, Internal.AnnealedPrimitiveScalarizationData (d := d) P (n : ℤ) + +/-- Proof-local scalar factor bounds used to compare `Theta_n` with +`widetildeTheta_n` internally. -/ +structure AnnealedPrimitiveMomentFactorBounds {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (sUpper sLower : ℝ) (ξ : ℕ) : Prop where + upper : + ∀ (primitive : AnnealedPrimitiveScalarizationFamily (d := d) P) (n : ℕ), + Internal.barBAtScaleOfPrimitive (primitive n) ≤ + LambdaMomentAtScale P (n : ℤ) sUpper ξ + lower : + ∀ (primitive : AnnealedPrimitiveScalarizationFamily (d := d) P) (n : ℕ), + Internal.barSigmaStarInvAtScaleOfPrimitive (primitive n) ≤ + lambdaInvMomentAtScale P (n : ℤ) sLower ξ + +theorem toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + {Ω : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} {f : Ω → ℝ} {p : ℕ} + (hp : 1 ≤ p) (hmem : MemLp f (p : ENNReal) μ) : + ENNReal.toReal (eLpNorm f (p : ENNReal) μ) = + (∫ x, ‖f x‖ ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_ne : p ≠ 0 := by omega + rw [hmem.eLpNorm_eq_integral_rpow_norm (by exact_mod_cast hp_ne) (by simp)] + have hnonneg : + 0 ≤ (∫ x, ‖f x‖ ^ (p : ENNReal).toReal ∂μ) ^ + (p : ENNReal).toReal⁻¹ := by + positivity + rw [ENNReal.toReal_ofReal hnonneg] + simp [one_div] + +theorem integrable_of_ae_nonneg_pow_integrable + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hXpow_int : Integrable (fun a => X a ^ ξ) P) : + Integrable X P := by + have hξ_ne : ξ ≠ 0 := by omega + have hnormpow_int : Integrable (fun a => ‖X a‖ ^ ξ) P := by + refine hXpow_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + simp [Real.norm_eq_abs, abs_of_nonneg ha] + have hmem_p : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa using hnormpow_int + have hmem_one : MemLp X (1 : ENNReal) P := by + exact hmem_p.mono_exponent (by exact_mod_cast hξ) + rwa [MeasureTheory.memLp_one_iff_integrable] at hmem_one + +theorem integral_le_annealedMomentRoot_of_ae_nonneg + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hXpow_int : Integrable (fun a => X a ^ ξ) P) : + ∫ a, X a ∂P ≤ annealedMomentRoot P ξ X := by + have hξ_ne : ξ ≠ 0 := by omega + have hnormpow_int : Integrable (fun a => ‖X a‖ ^ ξ) P := by + refine hXpow_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + simp [Real.norm_eq_abs, abs_of_nonneg ha] + have hmem_p : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa using hnormpow_int + have hmem_one : MemLp X (1 : ENNReal) P := by + exact hmem_p.mono_exponent (by exact_mod_cast hξ) + have hX_int : Integrable X P := by + rwa [MeasureTheory.memLp_one_iff_integrable] at hmem_one + have hX_norm_int : Integrable (fun a => ‖X a‖) P := hX_int.norm + have hint_le_norm : ∫ a, X a ∂P ≤ ∫ a, ‖X a‖ ∂P := by + exact integral_mono_ae hX_int hX_norm_int + (Filter.Eventually.of_forall fun a => by + simpa [Real.norm_eq_abs] using le_abs_self (X a)) + have hcmp : + eLpNorm X (1 : ENNReal) P ≤ eLpNorm X (ξ : ENNReal) P := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + (μ := P) (f := X) (by exact_mod_cast hξ) hX_meas.aestronglyMeasurable + have hcmp_toReal : + ENNReal.toReal (eLpNorm X (1 : ENNReal) P) ≤ + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) := by + exact ENNReal.toReal_mono hmem_p.2.ne hcmp + have hL1 : + ENNReal.toReal (eLpNorm X (1 : ENNReal) P) = ∫ a, ‖X a‖ ∂P := by + calc + ENNReal.toReal (eLpNorm X (1 : ENNReal) P) + = (∫ a, ‖X a‖ ^ (1 : ℕ) ∂P) ^ (1 / (1 : ℝ)) := by + simpa using + (toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := X) (p := 1) (by norm_num) (by simpa using hmem_one)) + _ = ∫ a, ‖X a‖ ∂P := by simp + have hLp : + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) = + annealedMomentRoot P ξ X := by + calc + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) + = (∫ a, ‖X a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := X) (p := ξ) hξ hmem_p + _ = (∫ a, X a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae (by + filter_upwards [hX_nonneg] with a ha + simp [Real.norm_eq_abs, abs_of_nonneg ha]) + _ = annealedMomentRoot P ξ X := rfl + calc + ∫ a, X a ∂P ≤ ∫ a, ‖X a‖ ∂P := hint_le_norm + _ = ENNReal.toReal (eLpNorm X (1 : ENNReal) P) := hL1.symm + _ ≤ ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) := hcmp_toReal + _ = annealedMomentRoot P ξ X := hLp + +namespace RestrictionLawCarrier + +theorem finsetSup_abs_restrictionCenteredDescendantAverageOnCube_nonneg + {d : ℕ} {n : ℤ} {P : RestrictionCoeffLaw d} + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + (X : Set (Vec d) → RegCoeffField d → ℝ) (a : RegCoeffField d) : + 0 ≤ parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) := by + rcases hparents with ⟨Q0, hQ0⟩ + exact (abs_nonneg (restrictionCenteredDescendantAverageOnCube P Q0 n X a)).trans + (Finset.le_sup' + (f := fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) hQ0) + +theorem aemeasurable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube + {d : ℕ} {n : ℤ} {P : RestrictionCoeffLaw d} + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_desc_aemeas : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, + AEMeasurable (X (cubeSet R)) P) : + AEMeasurable + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) P := by + have h : + AEMeasurable + (parents.sup' hparents + (fun Q (a : RegCoeffField d) => + |restrictionCenteredDescendantAverageOnCube P Q n X a|)) P := by + refine aemeasurable_finset_sup' (μ := P) (s := parents) hparents ?_ + intro Q hQ + have havg : + AEMeasurable + (fun a : RegCoeffField d => restrictionCenteredDescendantAverageOnCube P Q n X a) P := by + unfold restrictionCenteredDescendantAverageOnCube + have hsum : + AEMeasurable + (fun a => + ∑ R ∈ descendantsAtScale Q n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P)) P := by + have hsum' : AEMeasurable + (∑ R ∈ descendantsAtScale Q n, + fun a => X (cubeSet R) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P) P := + Finset.aemeasurable_sum _ fun R hR => + (hX_desc_aemeas Q hQ R hR).sub aemeasurable_const + convert hsum' using 1 + ext a + simp + exact aemeasurable_const.mul hsum + simpa [Real.norm_eq_abs] using havg.norm + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hparents + (fun Q (a : RegCoeffField d) => + |restrictionCenteredDescendantAverageOnCube P Q n X a|) a).symm + +/-- AEMeasurability of the upper-left finite-parent positive excess for the +operator norm of coarse blocks. -/ +theorem aemeasurable_upperLeft_matrixNorm_positiveExcess_finsetSup + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + (center : Mat d) : + AEMeasurable + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0)) P := by + have h : + AEMeasurable + (parents.sup' hparents + (fun Q (a : RegCoeffField d) => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0)) P := by + refine aemeasurable_finset_sup' (μ := P) (s := parents) hparents ?_ + intro Q _hQ + have hNorm : + AEMeasurable + (fun a : RegCoeffField d => + Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft) P := by + simpa [Ch02.matrixNorm, Real.norm_eq_abs] using! + (hP.aemeasurable_coarseB_cubeSet Q).norm + exact (hNorm.sub aemeasurable_const).max aemeasurable_const + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hparents + (fun Q (a : RegCoeffField d) => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) a).symm + +/-- AEMeasurability of the lower-right finite-parent positive excess for the +operator norm of coarse blocks. -/ +theorem aemeasurable_lowerRight_matrixNorm_positiveExcess_finsetSup + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + (center : Mat d) : + AEMeasurable + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0)) P := by + have h : + AEMeasurable + (parents.sup' hparents + (fun Q (a : RegCoeffField d) => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0)) P := by + refine aemeasurable_finset_sup' (μ := P) (s := parents) hparents ?_ + intro Q _hQ + have hNorm : + AEMeasurable + (fun a : RegCoeffField d => + Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight) P := by + simpa [Ch02.matrixNorm, Real.norm_eq_abs] using! + (hP.aemeasurable_coarseSigmaStarInv_cubeSet Q).norm + exact (hNorm.sub aemeasurable_const).max aemeasurable_const + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hparents + (fun Q (a : RegCoeffField d) => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) a).symm + +private theorem finset_univ_pair_sum_eq_sum_sum + {d : ℕ} (f : Fin d → Fin d → ℝ) : + (∑ ij : Fin d × Fin d, f ij.1 ij.2) = + ∑ i : Fin d, ∑ j : Fin d, f i j := by + classical + simpa [Finset.univ_product_univ] using + (Finset.sum_product' + (s := (Finset.univ : Finset (Fin d))) + (t := (Finset.univ : Finset (Fin d))) + (f := fun i j => f i j)) + +private theorem integrable_abs_pow_excess_of_ae_nonneg_le_entry_sum + {d : ℕ} {P : RestrictionCoeffLaw d} {ξ : ℕ} + (hξ : 1 ≤ ξ) + (excess : RegCoeffField d → ℝ) + (entry : Fin d → Fin d → RegCoeffField d → ℝ) + (hexcess_nonneg : ∀ a, 0 ≤ excess a) + (hexcess_aemeas : AEMeasurable excess P) + (hentry_nonneg : ∀ i j a, 0 ≤ entry i j a) + (hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P) + (hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P) + (hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a) : + Integrable (fun a => |excess a| ^ ξ) P := by + classical + let s : Finset (Fin d × Fin d) := Finset.univ + let entryPair : Fin d × Fin d → RegCoeffField d → ℝ := + fun ij a => entry ij.1 ij.2 a + let entrySum : RegCoeffField d → ℝ := + fun a => ∑ ij ∈ s, entryPair ij a + have hξ_ne_zero : ξ ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hξ) + have hentryPair_nonneg : ∀ ij a, 0 ≤ entryPair ij a := by + intro ij a + exact hentry_nonneg ij.1 ij.2 a + have hentryPair_aemeas : ∀ ij ∈ s, AEMeasurable (entryPair ij) P := by + intro ij _hij + exact hentry_aemeas ij.1 ij.2 + have hentryPair_int : + ∀ ij ∈ s, Integrable (fun a => |entryPair ij a| ^ ξ) P := by + intro ij _hij + exact hentry_int ij.1 ij.2 + have hentryPair_memLp : + ∀ ij ∈ s, MemLp (entryPair ij) (ξ : ENNReal) P := by + intro ij hij + rw [← integrable_norm_rpow_iff + (hentryPair_aemeas ij hij).aestronglyMeasurable + (by exact_mod_cast hξ_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hentryPair_int ij hij + have hentrySum_memLp : MemLp entrySum (ξ : ENNReal) P := by + have hsum : MemLp (fun a => ∑ ij ∈ s, entryPair ij a) (ξ : ENNReal) P := + memLp_finsetSum s hentryPair_memLp + simpa [entrySum] using hsum + have hentrySum_abs_int : + Integrable (fun a => |entrySum a| ^ ξ) P := by + simpa [entrySum, Real.norm_eq_abs] using + hentrySum_memLp.integrable_norm_pow hξ_ne_zero + have hentrySum_nonneg : ∀ a, 0 ≤ entrySum a := by + intro a + exact Finset.sum_nonneg fun ij _hij => hentryPair_nonneg ij a + have hpoint_pair : excess ≤ᵐ[P] entrySum := by + filter_upwards [hpoint] with a ha + show excess a ≤ ∑ ij : Fin d × Fin d, entry ij.1 ij.2 a + have hpair_eq : + (∑ ij : Fin d × Fin d, entry ij.1 ij.2 a) = + ∑ i : Fin d, ∑ j : Fin d, entry i j a := + finset_univ_pair_sum_eq_sum_sum (fun i j => entry i j a) + rw [hpair_eq] + exact ha + refine Integrable.mono' hentrySum_abs_int + (hexcess_aemeas.norm.pow_const ξ).aestronglyMeasurable ?_ + filter_upwards [hpoint_pair] with a ha + have hx : 0 ≤ excess a := hexcess_nonneg a + have hy : 0 ≤ entrySum a := hentrySum_nonneg a + have hpow : |excess a| ^ ξ ≤ |entrySum a| ^ ξ := by + simpa [abs_of_nonneg hx, abs_of_nonneg hy] using + pow_le_pow_left₀ hx ha ξ + have hleft_nonneg : 0 ≤ |excess a| ^ ξ := + pow_nonneg (abs_nonneg (excess a)) ξ + have hright_nonneg : 0 ≤ |entrySum a| ^ ξ := + pow_nonneg (abs_nonneg (entrySum a)) ξ + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, + abs_of_nonneg hright_nonneg] using hpow + +theorem momentRoot_excess_le_card_mul_entryRootBound + {d : ℕ} {P : RestrictionCoeffLaw d} {ξ : ℕ} {C : ℝ} + (hξ : 1 ≤ ξ) + (excess : RegCoeffField d → ℝ) + (entry : Fin d → Fin d → RegCoeffField d → ℝ) + (hexcess_nonneg : ∀ a, 0 ≤ excess a) + (hexcess_aemeas : AEMeasurable excess P) + (hentry_nonneg : ∀ i j a, 0 ≤ entry i j a) + (hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P) + (hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P) + (hentry_root : + ∀ i j, + (∫ a, |entry i j a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ C) + (hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a) : + annealedMomentRoot P ξ excess ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * C := by + classical + let s : Finset (Fin d × Fin d) := Finset.univ + let entryPair : Fin d × Fin d → RegCoeffField d → ℝ := + fun ij a => entry ij.1 ij.2 a + let entrySum : RegCoeffField d → ℝ := + fun a => ∑ ij ∈ s, entryPair ij a + have hξ_ne_zero : ξ ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hξ) + have hentryPair_nonneg : ∀ ij a, 0 ≤ entryPair ij a := by + intro ij a + exact hentry_nonneg ij.1 ij.2 a + have hentryPair_aemeas : ∀ ij ∈ s, AEMeasurable (entryPair ij) P := by + intro ij _hij + exact hentry_aemeas ij.1 ij.2 + have hentryPair_int : + ∀ ij ∈ s, Integrable (fun a => |entryPair ij a| ^ ξ) P := by + intro ij _hij + exact hentry_int ij.1 ij.2 + have hentryPair_root : + ∀ ij ∈ s, + (∫ a, |entryPair ij a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ C := by + intro ij _hij + exact hentry_root ij.1 ij.2 + have hentryPair_memLp : + ∀ ij ∈ s, MemLp (entryPair ij) (ξ : ENNReal) P := by + intro ij hij + rw [← integrable_norm_rpow_iff + (hentryPair_aemeas ij hij).aestronglyMeasurable + (by exact_mod_cast hξ_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hentryPair_int ij hij + have hentrySum_memLp : MemLp entrySum (ξ : ENNReal) P := by + have hsum : MemLp (fun a => ∑ ij ∈ s, entryPair ij a) (ξ : ENNReal) P := + memLp_finsetSum s hentryPair_memLp + simpa [entrySum] using hsum + have hentrySum_abs_int : + Integrable (fun a => |entrySum a| ^ ξ) P := by + simpa [entrySum, Real.norm_eq_abs] using + hentrySum_memLp.integrable_norm_pow hξ_ne_zero + have hentrySum_nonneg : ∀ a, 0 ≤ entrySum a := by + intro a + exact Finset.sum_nonneg fun ij _hij => hentryPair_nonneg ij a + have hentrySum_int : + Integrable (fun a => entrySum a ^ ξ) P := by + refine hentrySum_abs_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hentrySum_nonneg a)] + have hpoint_pair : excess ≤ᵐ[P] entrySum := by + filter_upwards [hpoint] with a ha + show excess a ≤ ∑ ij : Fin d × Fin d, entry ij.1 ij.2 a + have hpair_eq : + (∑ ij : Fin d × Fin d, entry ij.1 ij.2 a) = + ∑ i : Fin d, ∑ j : Fin d, entry i j a := + finset_univ_pair_sum_eq_sum_sum (fun i j => entry i j a) + rw [hpair_eq] + exact ha + have hexcess_int : + Integrable (fun a => excess a ^ ξ) P := by + refine Integrable.mono' hentrySum_int + (hexcess_aemeas.pow_const ξ).aestronglyMeasurable ?_ + filter_upwards [hpoint_pair] with a ha + have hx : 0 ≤ excess a := hexcess_nonneg a + have hy : 0 ≤ entrySum a := hentrySum_nonneg a + have hpow : excess a ^ ξ ≤ entrySum a ^ ξ := + pow_le_pow_left₀ hx ha ξ + have hleft_abs : |excess a| = excess a := abs_of_nonneg hx + have hright_abs : |entrySum a ^ ξ| = entrySum a ^ ξ := + abs_of_nonneg (pow_nonneg hy ξ) + simpa [Real.norm_eq_abs, hleft_abs, hright_abs] using hpow + have hroot_excess_sum : + annealedMomentRoot P ξ excess ≤ annealedMomentRoot P ξ entrySum := + annealedMomentRoot_le_of_ae_nonneg_le hξ hexcess_nonneg hexcess_int hentrySum_int hpoint_pair + have htriangle : + (∫ a, |entrySum a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ + ∑ ij ∈ s, (∫ a, |entryPair ij a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + simpa [entrySum] using + integral_abs_finsetSum_pow_rpow_inv_le_sum_aemeasurable + (μ := P) (s := s) (p := ξ) hξ hentryPair_aemeas hentryPair_int + have hsum_roots : + ∑ ij ∈ s, (∫ a, |entryPair ij a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * C := by + calc + ∑ ij ∈ s, (∫ a, |entryPair ij a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + ≤ ∑ ij ∈ s, C := by + exact Finset.sum_le_sum hentryPair_root + _ = ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * C := by + simp [s, Finset.sum_const, nsmul_eq_mul, Fintype.card_prod] + have hentryRoot : + annealedMomentRoot P ξ entrySum ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * C := by + calc + annealedMomentRoot P ξ entrySum + = (∫ a, |entrySum a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + unfold annealedMomentRoot + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hentrySum_nonneg a)]) + _ ≤ ∑ ij ∈ s, + (∫ a, |entryPair ij a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := htriangle + _ ≤ ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * C := + hsum_roots + exact hroot_excess_sum.trans hentryRoot + +/-- Integrability of the upper-left finite-parent operator-norm positive +excess. This is the integrability half of +`upperLeft_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw`. -/ +theorem upperLeft_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {n : ℤ} {ξ : ℕ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) + (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d n)) b).upperLeft i j ∂P) + (hξ : 2 ≤ ξ) + (hOriginLp_int : + ∀ i j : Fin d, + Integrable + (fun a => + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ ξ) P) : + Integrable + (fun a => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0))‖ ^ ξ) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let excess : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) + let entry : Fin d → Fin d → RegCoeffField d → ℝ := + fun i j a => + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a|) + have hξ_one : 1 ≤ ξ := by omega + have hexcess_nonneg : ∀ a, 0 ≤ excess a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) hQ0) + have hentry_nonneg : ∀ i j a, 0 ≤ entry i j a := by + intro i j a + exact finsetSup_abs_restrictionCenteredDescendantAverageOnCube_nonneg hparents + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a + have hexcess_aemeas : AEMeasurable excess P := by + simpa [excess] using + aemeasurable_upperLeft_matrixNorm_positiveExcess_finsetSup hP hparents center + have hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P := by + intro i j + simpa [entry] using + aemeasurable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube + (P := P) (n := n) hparents + (fun U a => (coarseBlockMatrix U a).upperLeft i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + have hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P := by + intro i j + have hint : + Integrable + (fun a : RegCoeffField d => + (parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a|)) ^ ξ) P := + integrable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_of_stationary + (d := d) (n := n) (P := P) (parents := parents) hparents + hn hparent_scale hPstat + (fun U a => (coarseBlockMatrix U a).upperLeft i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inl i) (Sum.inl j))) + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + hξ_one (hOriginLp_int i j) + refine hint.congr ?_ + filter_upwards with a + simp [entry, abs_of_nonneg (hentry_nonneg i j a)] + have hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a := by + simpa [excess, entry] using + hP.coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + hparents hparent_scale center hcenter + simpa [excess, Real.norm_eq_abs] using + integrable_abs_pow_excess_of_ae_nonneg_le_entry_sum + (P := P) (ξ := ξ) hξ_one excess entry hexcess_nonneg + hexcess_aemeas hentry_nonneg hentry_aemeas hentry_int hpoint + +/-- Upper-left finite-parent coarse-block fluctuation bound, stated directly +against the law-facing Ch4 surface. The proof owns all locality, +measurability, covariance, and deterministic positive-excess domination. -/ +theorem upperLeft_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {n : ℤ} {ξ : ℕ} {K B : ℝ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d n)) b).upperLeft i j ∂P) + (hξ : 2 ≤ ξ) (hK_nonneg : 0 ≤ K) (hB_nonneg : 0 ≤ B) + (hOriginLp_int : + ∀ i j : Fin d, + Integrable + (fun a => + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ ξ) P) + (hOriginLp : + ∀ i j : Fin d, + (∫ a, + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ K) + (hBudget : + ∀ Q ∈ parents, + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n ξ * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (ξ : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n ξ * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) ≤ B) : + annealedMomentRoot P ξ + (fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + ((parents.card : ℝ) ^ (1 / (ξ : ℝ)) * B) := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := (parents.card : ℝ) ^ (1 / (ξ : ℝ)) * B + let excess : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) + let entry : Fin d → Fin d → RegCoeffField d → ℝ := + fun i j a => + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a|) + have hξ_one : 1 ≤ ξ := by omega + have hexcess_nonneg : ∀ a, 0 ≤ excess a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm center) + 0) hQ0) + have hentry_nonneg : ∀ i j a, 0 ≤ entry i j a := by + intro i j a + exact finsetSup_abs_restrictionCenteredDescendantAverageOnCube_nonneg hparents + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a + have hexcess_aemeas : AEMeasurable excess P := by + simpa [excess] using + aemeasurable_upperLeft_matrixNorm_positiveExcess_finsetSup hP hparents center + have hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P := by + intro i j + simpa [entry] using + aemeasurable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube + (P := P) (n := n) hparents + (fun U a => (coarseBlockMatrix U a).upperLeft i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + have hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P := by + intro i j + have hint : + Integrable + (fun a : RegCoeffField d => + (parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a|)) ^ ξ) P := + integrable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_of_stationary + (d := d) (n := n) (P := P) (parents := parents) hparents + hn hparent_scale hPstat + (fun U a => (coarseBlockMatrix U a).upperLeft i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inl i) (Sum.inl j))) + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + hξ_one (hOriginLp_int i j) + refine hint.congr ?_ + filter_upwards with a + simp [entry, abs_of_nonneg (hentry_nonneg i j a)] + have hentry_root : + ∀ i j, + (∫ a, |entry i j a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ C := by + intro i j + have hroot := + integral_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (n := n) (P := P) (parents := parents) hparents + (p := ξ) (K := K) (B := B) + hP hn hparent_scale hPstat hPdep + (fun U a => (coarseBlockMatrix U a).upperLeft i j) + (fun Q hQ R hR => + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inl i) (Sum.inl j))) + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet R i j) + hξ hK_nonneg hB_nonneg (hOriginLp_int i j) (hOriginLp i j) hBudget + calc + (∫ a, |entry i j a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + = (∫ a, entry i j a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hentry_nonneg i j a)]) + _ ≤ C := by + simpa [entry, C] using hroot + have hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a := by + simpa [excess, entry] using + hP.coarseBlockMatrix_upperLeft_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + hparents hparent_scale center hcenter + simpa [excess, entry, C] using + momentRoot_excess_le_card_mul_entryRootBound + (P := P) (ξ := ξ) (C := C) hξ_one + excess entry hexcess_nonneg hexcess_aemeas hentry_nonneg + hentry_aemeas hentry_int hentry_root hpoint + +/-- Integrability of the lower-right finite-parent operator-norm positive +excess. This is the integrability half of +`lowerRight_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw`. -/ +theorem lowerRight_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {n : ℤ} {ξ : ℕ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) + (center : Mat d) + (hcenter : + ∀ i j : Fin d, + center i j = + ∫ b, + (coarseBlockMatrix (cubeSet (originCube d n)) b).lowerRight i j ∂P) + (hξ : 2 ≤ ξ) + (hOriginLp_int : + ∀ i j : Fin d, + Integrable + (fun a => + |restrictionCenteredOriginObservable P n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ ξ) P) : + Integrable + (fun a => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0))‖ ^ ξ) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let excess : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) + let entry : Fin d → Fin d → RegCoeffField d → ℝ := + fun i j a => + parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a|) + have hξ_one : 1 ≤ ξ := by omega + have hexcess_nonneg : ∀ a, 0 ≤ excess a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm center) + 0) hQ0) + have hentry_nonneg : ∀ i j a, 0 ≤ entry i j a := by + intro i j a + exact finsetSup_abs_restrictionCenteredDescendantAverageOnCube_nonneg hparents + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a + have hexcess_aemeas : AEMeasurable excess P := by + simpa [excess] using + aemeasurable_lowerRight_matrixNorm_positiveExcess_finsetSup hP hparents center + have hentry_aemeas : ∀ i j, AEMeasurable (entry i j) P := by + intro i j + simpa [entry] using + aemeasurable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube + (P := P) (n := n) hparents + (fun U a => (coarseBlockMatrix U a).lowerRight i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + have hentry_int : + ∀ i j, Integrable (fun a => |entry i j a| ^ ξ) P := by + intro i j + have hint : + Integrable + (fun a : RegCoeffField d => + (parents.sup' hparents + (fun Q => + |restrictionCenteredDescendantAverageOnCube P Q n + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a|)) ^ ξ) P := + integrable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_of_stationary + (d := d) (n := n) (P := P) (parents := parents) hparents + hn hparent_scale hPstat + (fun U a => (coarseBlockMatrix U a).lowerRight i j) + (by + simpa [blockMatEntry] using + isRestrictionTranslationCovariant_comp_toFun + (coarseBlockMatrix_entry_translation_covariant (Sum.inr i) (Sum.inr j))) + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet (originCube d n) i j) + (fun Q hQ R hR => + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet R i j) + hξ_one (hOriginLp_int i j) + refine hint.congr ?_ + filter_upwards with a + simp [entry, abs_of_nonneg (hentry_nonneg i j a)] + have hpoint : + excess ≤ᵐ[P] fun a => ∑ i : Fin d, ∑ j : Fin d, entry i j a := by + simpa [excess, entry] using + hP.coarseBlockMatrix_lowerRight_matrixNorm_positiveExcess_finsetSup_le_sum_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_ae + hparents hparent_scale center hcenter + simpa [excess, Real.norm_eq_abs] using + integrable_abs_pow_excess_of_ae_nonneg_le_entry_sum + (P := P) (ξ := ξ) hξ_one excess entry hexcess_nonneg + hexcess_aemeas hentry_nonneg hentry_aemeas hentry_int hpoint + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Mu.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Mu.lean new file mode 100644 index 0000000000..ace3b1f01c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Mu.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.MuLocalityGate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily + +/-! # Mu -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open MeasureTheory + +/-! +# `Mu` measurability (carrier re-aim, Packet P5 centrepiece) + +This file is the public Ch4 handoff for the coarse-grained energy `Mu` on the +honest carrier. Following the carrier redesign, a law `P : RestrictionCoeffLaw d` is a +measure on `RegCoeffField d`, and the observable is `a ↦ Mu (cubeSet Q) P0 a.toFun`. + +The measurability is genuinely established, not merely null-covered. The +carrier `Mu`-slice engine `measurable_Mu_comp_aeeSlice_of_measurable_entryTest` +(`Internal/AEESliceAssembly/CarrierMuFamily.lean`) makes `Mu ∘ toFun` +**genuinely `LocalSigmaR (cubeSet Q)`-measurable on each AEE quantitative slice**, +using only the honest entry-test generators of the carrier (no fine pointwise +data). The AEE slice events are genuinely `LocalSigmaR`-measurable (P4b), so the +countable slice cover assembles by a **genuine `liftCover`** — no null +bookkeeping — into a `LocalSigmaR`-measurable representative `Y`, which the gate +`IsRestrictionLocalRandomVariable.of_measurable_localSigmaR` promotes to a genuine +restriction-local random variable. + +Note (statement check, Packet P5): `Mu ∘ toFun` is **not** `LocalSigmaR`-measurable +on all of the carrier — off the a.e.-elliptic locus the carrier admits fields on +which `Mu` is uninformative — so `exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet` +is *not* trivialised: the a.e.-representative `Y` (equal to `Mu ∘ toFun` on the +a.s.-full elliptic locus) is genuinely needed. The honest endpoint therefore +remains law-relative `AEMeasurable`, with the genuine local representative `Y`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +namespace RestrictionLawCarrier + +/-- **Law-relative local representative of `Mu` on a fixed triadic cube.** The +carrier `Mu`-slice engine makes `Mu ∘ toFun` genuinely `LocalSigmaR (cubeSet Q)`- +measurable on each AEE quantitative slice; the slices are genuinely +`LocalSigmaR`-measurable and cover the law a.s., so a genuine `liftCover` produces +a `LocalSigmaR`-measurable `Y` agreeing with `Mu ∘ toFun` almost surely, promoted +to a restriction-local random variable by the gate. -/ +theorem exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => Mu (cubeSet Q) P0 a.toFun) =ᵐ[P] Y := by + classical + let slice : ℕ → Set (RegCoeffField d) := + fun k => {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} + let covered : Set (RegCoeffField d) := ⋃ k : ℕ, slice k + let cover : Option ℕ → Set (RegCoeffField d) + | none => coveredᶜ + | some k => slice k + let f : (i : Option ℕ) → cover i → ℝ + | none, _ => 0 + | some _k, a => Mu (cubeSet Q) P0 a.1.toFun + have hagree : + ∀ (i j : Option ℕ) (a : RegCoeffField d) + (hai : a ∈ cover i) (haj : a ∈ cover j), + f i ⟨a, hai⟩ = f j ⟨a, haj⟩ := by + intro i j a hai haj + cases i with + | none => + cases j with + | none => rfl + | some k => + exact absurd (Set.mem_iUnion.mpr ⟨k, haj⟩) hai + | some k => + cases j with + | none => + exact absurd (Set.mem_iUnion.mpr ⟨k, hai⟩) haj + | some _ => rfl + have hcover : ⋃ i : Option ℕ, cover i = Set.univ := by + ext a + refine ⟨fun _ => Set.mem_univ a, fun _ => ?_⟩ + by_cases ha : a ∈ covered + · rcases Set.mem_iUnion.mp ha with ⟨k, hk⟩ + exact Set.mem_iUnion.mpr ⟨some k, by simpa [cover] using hk⟩ + · exact Set.mem_iUnion.mpr ⟨none, by simpa [cover] using ha⟩ + let Y : RegCoeffField d → ℝ := Set.liftCover cover f hagree hcover + refine ⟨Y, ?_, ?_⟩ + · -- `Y` is `LocalSigmaR (cubeSet Q)`-measurable, hence restriction-local. + have hY_localSigma : + @Measurable (RegCoeffField d) ℝ (LocalSigmaR (cubeSet Q)) _ Y := by + let : MeasurableSpace (RegCoeffField d) := LocalSigmaR (cubeSet Q) + have hcover_meas : ∀ i : Option ℕ, MeasurableSet (cover i) := by + intro i + cases i with + | none => + exact (MeasurableSet.iUnion fun k => + measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k).compl + | some k => exact measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k + have hfm : ∀ i : Option ℕ, Measurable (f i) := by + intro i + cases i with + | none => exact measurable_const + | some k => + have hEntry : + ∀ (i' j' : Fin d) {φ : Vec d → ℝ}, ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → tsupport φ ⊆ cubeSet Q → + @Measurable (cover (some k)) ℝ _ _ + (fun x => entryTestR i' j' φ (x : RegCoeffField d)) := by + intro i' j' φ hφ_cont hφ_compact hφ_support + have hφ_probe : IsProbeR φ := IsProbeR.of_smooth hφ_cont hφ_compact + have hφ_support' : Function.support φ ⊆ cubeSet Q := + (Function.support_subset_iff.2 fun x hx => subset_tsupport φ hx).trans hφ_support + exact (measurable_entryTestR_localSigmaR i' j' hφ_probe hφ_support').comp + measurable_subtype_coe + simpa [f] using + measurable_Mu_comp_aeeSlice_of_measurable_entryTest Q + (A := fun x : cover (some k) => (x : RegCoeffField d)) + (fun x => x.2) hEntry P0 + exact measurable_liftCover cover hcover_meas f hfm hagree hcover + exact IsRestrictionLocalRandomVariable.of_measurable_localSigmaR (measurableSet_cubeSet Q) hY_localSigma + · -- `Y` agrees with `Mu ∘ toFun` on the a.s.-full elliptic locus. + have hcovered_ae : ∀ᵐ a ∂P, a ∈ covered := by + filter_upwards + [hP.ae_locally_uniformly_elliptic.ae_exists_aeeQuantitativeEllipticSlice_cubeSet Q] + with a ha + exact Set.mem_iUnion.mpr ha + filter_upwards [hcovered_ae] with a ha + rcases Set.mem_iUnion.mp ha with ⟨k, hak⟩ + have ha_cover : a ∈ cover (some k) := hak + change Mu (cubeSet Q) P0 a.toFun = Set.liftCover cover f hagree hcover a + rw [Set.liftCover_of_mem + (S := cover) (f := f) (hf := hagree) (hS := hcover) (i := some k) ha_cover] + +/-- The canonical Chapter 4 law-facing measurability theorem for `Mu` on a +deterministic triadic cube. Downstream chapters should use this theorem +directly; `coarseBlockMatrix`, `ResponseJ`, and `BlockJ` measurability should +be derived from this finite-polarization root. -/ +theorem aemeasurable_Mu_cubeSet + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (P0 : BlockVec d) : + AEMeasurable (fun a : RegCoeffField d => Mu (cubeSet Q) P0 a.toFun) P := by + obtain ⟨Y, hY_local, hY_eq⟩ := hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet Q P0 + have hY_restr : + @Measurable (RegCoeffField d) ℝ + (RestrictionSigmaR (cubeSet Q) (measurableSet_cubeSet Q)) _ Y := hY_local + have hY_meas : Measurable Y := + hY_restr.mono (restrictionSigmaR_le (cubeSet Q) (measurableSet_cubeSet Q)) le_rfl + exact hY_meas.aemeasurable.congr hY_eq.symm + +end RestrictionLawCarrier + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuations.lean new file mode 100644 index 0000000000..24d05edd35 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuations.lean @@ -0,0 +1,500 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations + +/-! # Partition Average Fluctuations -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-local partition-average fluctuation theorems + +This file connects the restriction-local descendant-average concentration estimates to +the centered origin-cube formulation used in the notes. The proof uses the +existing stationarity lemmas internally, but the theorem statements are phrased +only in terms of the explicit restriction law and restriction-local-random-variable notions. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +private theorem isBigO_gammaSigma_iff_of_map_eq_map + {d : ℕ} {P : RestrictionCoeffLaw d} {σ A : ℝ} + {f g : RegCoeffField d → ℝ} + (hf : Measurable f) (hg : Measurable g) + (hmap : Measure.map f P = Measure.map g P) : + IsBigO P (gammaSigma σ) f A ↔ IsBigO P (gammaSigma σ) g A := by + rw [isBigO_gammaSigma_iff, isBigO_gammaSigma_iff] + constructor + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hfg : + P.real (absTailEvent f (A * t)) = P.real (absTailEvent g (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real + rw [← hfg] + exact h ht + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hgf : + P.real (absTailEvent g (A * t)) = P.real (absTailEvent f (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real.symm + rw [← hgf] + exact h ht + +private theorem isBigO_psiSigma_iff_of_map_eq_map + {d : ℕ} {P : RestrictionCoeffLaw d} {σ A : ℝ} + {f g : RegCoeffField d → ℝ} + (hf : Measurable f) (hg : Measurable g) + (hmap : Measure.map f P = Measure.map g P) : + IsBigO P (psiSigma σ) f A ↔ IsBigO P (psiSigma σ) g A := by + rw [isBigO_psiSigma_iff, isBigO_psiSigma_iff] + constructor + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hfg : + P.real (absTailEvent f (A * t)) = P.real (absTailEvent g (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real + rw [← hfg] + exact h ht + · intro h t ht + let s : Set ℝ := {x | A * t < |x|} + have hs : MeasurableSet s := by + dsimp [s] + exact measurableSet_lt measurable_const continuous_abs.measurable + have hmass := congrArg (fun μ : Measure ℝ => μ s) hmap + have hmass_real := congrArg ENNReal.toReal hmass + have hgf : + P.real (absTailEvent g (A * t)) = P.real (absTailEvent f (A * t)) := by + simpa [s, absTailEvent, Measure.map_apply hf hs, Measure.map_apply hg hs] + using! hmass_real.symm + rw [← hgf] + exact h ht + +private theorem centered_descendant_map_eq_origin {d : ℕ} {n m : ℤ} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hn : 0 ≤ n) (hnm : n ≤ m) (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX0_meas : Measurable (X (cubeSet (originCube d n)))) + (hX_cov : IsRestrictionTranslationCovariant X) + (R : TriadicCube d) (hR : R ∈ descendantsAtScale (originCube d m) n) : + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + Measure.map (fun a => X (cubeSet R) a - μ0) P = + Measure.map (fun a => X (cubeSet (originCube d n)) a - μ0) P := by + intro μ0 + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_meas : Measurable (Y (cubeSet (originCube d n))) := by + simpa [Y] using! hX0_meas.sub measurable_const + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + calc + Measure.map (fun a => X (cubeSet R) a - μ0) P = + Measure.map (Y (cubeSet R)) P := by + rfl + _ = Measure.map + (Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)))) P := by + rw [hshift] + _ = Measure.map (Y (cubeSet (originCube d n))) P := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant + (P := P) hPstat (U := cubeSet (originCube d n)) hY0_meas hY_cov + (scaleTranslationShift n R) + _ = Measure.map (fun a => X (cubeSet (originCube d n)) a - μ0) P := by + rfl + +/-- Stationarity identifies the expectation of the uncentered descendant +partition average with the expectation on the origin cube at the descendant +scale. -/ +theorem integral_restrictionDescendantAverage_eq_integral_originCube_of_stationary + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX0_meas : Measurable (X (cubeSet (originCube d n)))) + (hX_desc_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (X (cubeSet R)) P) + (hX_cov : IsRestrictionTranslationCovariant X) : + ∫ a, restrictionDescendantAverage n m X a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P := by + let s := descendantsAtScale (originCube d m) n + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + have hs_nonempty : s.Nonempty := by + simpa [s] using descendantsAtScale_nonempty (originCube d m) hnm + have hs_card_ne_zero : ((s.card : ℝ)) ≠ 0 := by + exact_mod_cast hs_nonempty.card_ne_zero + have hterm : ∀ R ∈ s, ∫ a, X (cubeSet R) a ∂P = μ0 := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm (by simpa [s] using hR) + calc + ∫ a, X (cubeSet R) a ∂P + = ∫ a, + X + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + rw [hshift] + _ = ∫ a, X (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary + (P := P) hPstat (U := cubeSet (originCube d n)) hX0_meas hX_cov + (scaleTranslationShift n R) + _ = μ0 := by + rfl + calc + ∫ a, restrictionDescendantAverage n m X a ∂P + = ∫ a, ((s.card : ℝ)⁻¹ * ∑ R ∈ s, X (cubeSet R) a) ∂P := by + simp [restrictionDescendantAverage, s] + _ = (s.card : ℝ)⁻¹ * ∫ a, ∑ R ∈ s, X (cubeSet R) a ∂P := by + rw [integral_const_mul] + _ = (s.card : ℝ)⁻¹ * ∑ R ∈ s, ∫ a, X (cubeSet R) a ∂P := by + rw [integral_finsetSum s] + intro R hR + exact hX_desc_int R (by simpa [s] using hR) + _ = (s.card : ℝ)⁻¹ * ∑ _R ∈ s, μ0 := by + refine congrArg (fun t : ℝ => ((s.card : ℝ)⁻¹) * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + exact hterm R hR + _ = μ0 := by + rw [Finset.sum_const] + simp [nsmul_eq_mul, hs_card_ne_zero] + _ = ∫ a, X (cubeSet (originCube d n)) a ∂P := by + rfl + +/-- The centered descendant partition average has mean zero under stationarity. -/ +theorem integral_restrictionCenteredDescendantAverage_eq_zero_of_stationary + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX0_meas : Measurable (X (cubeSet (originCube d n)))) + (hX_desc_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (X (cubeSet R)) P) + (hX_cov : IsRestrictionTranslationCovariant X) : + ∫ a, restrictionCenteredDescendantAverage P n m X a ∂P = 0 := by + let s := descendantsAtScale (originCube d m) n + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + have hs_nonempty : s.Nonempty := by + simpa [s] using descendantsAtScale_nonempty (originCube d m) hnm + have hs_card_ne_zero : ((s.card : ℝ)) ≠ 0 := by + exact_mod_cast hs_nonempty.card_ne_zero + have havg := + integral_restrictionDescendantAverage_eq_integral_originCube_of_stationary + (P := P) hn hnm hPstat X hX0_meas hX_desc_int hX_cov + have hsum_int : + Integrable (fun a => ∑ R ∈ s, X (cubeSet R) a) P := by + refine integrable_finsetSum _ ?_ + intro R hR + exact hX_desc_int R (by simpa [s] using hR) + have hdesc_int : Integrable (restrictionDescendantAverage n m X) P := by + have hdesc_eq : + restrictionDescendantAverage n m X = + fun a => ((s.card : ℝ)⁻¹ * ∑ R ∈ s, X (cubeSet R) a) := by + funext a + simp [restrictionDescendantAverage, s] + rw [hdesc_eq] + exact hsum_int.const_mul ((s.card : ℝ)⁻¹) + have hcenter_eq : + restrictionCenteredDescendantAverage P n m X = + fun a => restrictionDescendantAverage n m X a - μ0 := by + funext a + rw [restrictionCenteredDescendantAverage, restrictionDescendantAverage] + change + ((s.card : ℝ)⁻¹ * ∑ R ∈ s, (X (cubeSet R) a - μ0)) = + ((s.card : ℝ)⁻¹ * ∑ R ∈ s, X (cubeSet R) a) - μ0 + rw [Finset.sum_sub_distrib, Finset.sum_const] + simp [nsmul_eq_mul, μ0] + field_simp [hs_card_ne_zero] + calc + ∫ a, restrictionCenteredDescendantAverage P n m X a ∂P + = ∫ a, restrictionDescendantAverage n m X a - μ0 ∂P := by + rw [hcenter_eq] + _ = ∫ a, restrictionDescendantAverage n m X a ∂P - ∫ _a, μ0 ∂P := by + exact integral_sub hdesc_int (integrable_const μ0) + _ = μ0 - μ0 := by + rw [havg] + simp [μ0] + _ = 0 := by + ring + +/-- Centered `Gamma_sigma` fluctuation bound for restriction-centered +descendant averages of a translation-covariant cube observable. -/ +theorem isBigO_gammaSigma_restrictionCenteredDescendantAverage_of_restrictionUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_meas : Measurable (X (cubeSet (originCube d n)))) + (hX_desc_meas : + ∀ R ∈ descendantsAtScale (originCube d m) n, Measurable (X (cubeSet R))) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (hX0 : IsBigO P (gammaSigma σ) (restrictionCenteredOriginObservable P n X) K) : + IsBigO P (gammaSigma σ) (restrictionCenteredDescendantAverage P n m X) + (gammaSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hX_local R hR).sub measurable_const + have hZ_meas : + ∀ R ∈ descendantsAtScale (originCube d m) n, Measurable (Z R) := by + intro R hR + simpa [Z] using! (hX_desc_meas R hR).sub measurable_const + have hZ_tail : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsBigO P (gammaSigma σ) (Z R) K := by + intro R hR + have hmap := + centered_descendant_map_eq_origin + (P := P) hn hnm hPstat X hX0_meas hX_cov R hR + have hZR_meas : Measurable (Z R) := hZ_meas R hR + have hZ0_meas : + Measurable (fun a => X (cubeSet (originCube d n)) a - μ0) := + hX0_meas.sub measurable_const + have horigin : + IsBigO P (gammaSigma σ) (fun a => X (cubeSet (originCube d n)) a - μ0) K := by + simpa [restrictionCenteredOriginObservable, μ0] using! hX0 + have htail := + (isBigO_gammaSigma_iff_of_map_eq_map + (P := P) (σ := σ) (A := K) hZR_meas hZ0_meas (by simpa [Z] using hmap)).2 + horigin + simpa [Z] using htail + have hZ0_int : Integrable (Z (originCube d n)) P := by + have hZ0_meas : Measurable (Z (originCube d n)) := by + simpa [Z] using! hX0_meas.sub measurable_const + have hZ0_mom := + hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := P) (X := Z (originCube d n)) (K := K) (σ := σ) + hσ₀ hK hZ0_meas.aemeasurable (by + simpa [Z, restrictionCenteredOriginObservable, μ0] using! hX0) + have hZ0_abs_int : Integrable (fun a => |Z (originCube d n) a|) P := by + simpa using + (IndependentSums.gammaMomentGrowth_natCast_bound + (μ := P) (X := Z (originCube d n)) (σ := σ) + (M := gammaMomentConst σ * K) (n := 1) (by norm_num) hZ0_mom).1 + have hZ0_norm_int : Integrable (fun a => ‖Z (originCube d n) a‖) P := by + simpa [Real.norm_eq_abs] using hZ0_abs_int + exact + (integrable_norm_iff hZ0_meas.aemeasurable.aestronglyMeasurable).1 hZ0_norm_int + have hX0_int : Integrable (X (cubeSet (originCube d n))) P := by + have hX0_eq : + (fun a => X (cubeSet (originCube d n)) a) = + fun a => Z (originCube d n) a + μ0 := by + funext a + simp [Z, μ0] + simpa [hX0_eq] using hZ0_int.add (integrable_const μ0) + have hZ0_mean : ∫ a, Z (originCube d n) a ∂P = 0 := by + calc + ∫ a, Z (originCube d n) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Z] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by + simp [μ0] + _ = 0 := by + ring + have hZ_mean : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + have hZ_cov : IsRestrictionTranslationCovariant (fun U a => X U a - μ0) := by + intro U z a + simpa using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hZ0_meas' : Measurable ((fun U a => X U a - μ0) (cubeSet (originCube d n))) := by + simpa using! hX0_meas.sub measurable_const + have hint : + ∫ a, Z R a ∂P = ∫ a, Z (originCube d n) a ∂P := by + calc + ∫ a, Z R a ∂P = + ∫ a, + (fun U a => X U a - μ0) + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + change + ∫ a, (fun U a => X U a - μ0) (cubeSet R) a ∂P = + ∫ a, + (fun U a => X U a - μ0) + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P + rw [hshift] + _ = ∫ a, (fun U a => X U a - μ0) (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary + (P := P) hPstat (U := cubeSet (originCube d n)) hZ0_meas' hZ_cov + (scaleTranslationShift n R) + _ = ∫ a, Z (originCube d n) a ∂P := by + rfl + exact hint.trans hZ0_mean + have havg := + isBigO_gammaSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) + hnm hPdep hσ₀ hσ₂ hK Z hZ_local hZ_meas hZ_tail hZ_mean + have havg_fun_eq : + (fun a => ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a) = + restrictionCenteredDescendantAverage P n m X := by + funext a + simp [restrictionCenteredDescendantAverage, Z, μ0] + simpa [havg_fun_eq, partitionCardinalityScale, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using havg + +/-- Centered `Psi_sigma` fluctuation bound for restriction-centered +descendant averages of a translation-covariant cube observable. -/ +theorem isBigO_psiSigma_restrictionCenteredDescendantAverage_of_restrictionUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {σ K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_meas : Measurable (X (cubeSet (originCube d n)))) + (hX0_int : Integrable (X (cubeSet (originCube d n))) P) + (hX_desc_meas : + ∀ R ∈ descendantsAtScale (originCube d m) n, Measurable (X (cubeSet R))) + (hX_desc_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (X (cubeSet R)) P) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX0 : IsBigO P (psiSigma σ) (restrictionCenteredOriginObservable P n X) K) : + IsBigO P (psiSigma σ) (restrictionCenteredDescendantAverage P n m X) + (psiSigmaDescendantsAtScaleConst d n σ * + partitionCardinalityScale (d := d) n m * K) := by + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hX_local R hR).sub measurable_const + have hZ_meas : + ∀ R ∈ descendantsAtScale (originCube d m) n, Measurable (Z R) := by + intro R hR + simpa [Z] using! (hX_desc_meas R hR).sub measurable_const + have hZ_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, Integrable (Z R) P := by + intro R hR + simpa [Z] using! (hX_desc_int R hR).sub (integrable_const μ0) + have hZ_tail : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsBigO P (psiSigma σ) (Z R) K := by + intro R hR + have hmap := + centered_descendant_map_eq_origin + (P := P) hn hnm hPstat X hX0_meas hX_cov R hR + have hZR_meas : Measurable (Z R) := hZ_meas R hR + have hZ0_meas : + Measurable (fun a => X (cubeSet (originCube d n)) a - μ0) := + hX0_meas.sub measurable_const + have horigin : + IsBigO P (psiSigma σ) (fun a => X (cubeSet (originCube d n)) a - μ0) K := by + simpa [restrictionCenteredOriginObservable, μ0] using! hX0 + have htail := + (isBigO_psiSigma_iff_of_map_eq_map + (P := P) (σ := σ) (A := K) hZR_meas hZ0_meas (by simpa [Z] using hmap)).2 + horigin + simpa [Z] using htail + have hZ0_mean : ∫ a, Z (originCube d n) a ∂P = 0 := by + calc + ∫ a, Z (originCube d n) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Z] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by + simp [μ0] + _ = 0 := by + ring + have hZ_mean : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hshift := + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) hn hnm hR + have hZ_cov : IsRestrictionTranslationCovariant (fun U a => X U a - μ0) := by + intro U z a + simpa using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hZ0_meas' : Measurable ((fun U a => X U a - μ0) (cubeSet (originCube d n))) := by + simpa using! hX0_meas.sub measurable_const + have hint : + ∫ a, Z R a ∂P = ∫ a, Z (originCube d n) a ∂P := by + calc + ∫ a, Z R a ∂P = + ∫ a, + (fun U a => X U a - μ0) + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + change + ∫ a, (fun U a => X U a - μ0) (cubeSet R) a ∂P = + ∫ a, + (fun U a => X U a - μ0) + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P + rw [hshift] + _ = ∫ a, (fun U a => X U a - μ0) (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary + (P := P) hPstat (U := cubeSet (originCube d n)) hZ0_meas' hZ_cov + (scaleTranslationShift n R) + _ = ∫ a, Z (originCube d n) a ∂P := by + rfl + exact hint.trans hZ0_mean + have havg := + isBigO_psiSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) + hnm hPdep hσ hK Z hZ_local hZ_meas hZ_int hZ_tail hZ_mean + have havg_fun_eq : + (fun a => ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a) = + restrictionCenteredDescendantAverage P n m X := by + funext a + simp [restrictionCenteredDescendantAverage, Z, μ0] + simpa [havg_fun_eq, partitionCardinalityScale, + div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using havg + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuationsAEMeasurable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuationsAEMeasurable.lean new file mode 100644 index 0000000000..0ea7c712ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageFluctuationsAEMeasurable.lean @@ -0,0 +1,247 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DescendantAveragesAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations + +/-! # Partition Average Fluctuations AEMeasurable -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-local Gamma partition fluctuations + +This is the a.e.-restriction-local counterpart of the Gamma partition fluctuation +estimate. It is designed for totalized Ch4 observables which are only +a.e.-equal to local representatives on each descendant cube. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +private theorem cubeSet_descendant_eq_translate_origin_of_nonneg + {d : ℕ} {Q R : TriadicCube d} {n : ℤ} + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) (hR : R ∈ descendantsAtScale Q n) : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscaleR : R.scale = n := by + calc + R.scale = Q.scale - Int.toNat (Q.scale - n) := by + exact scale_eq_sub_of_mem_descendantsAtScale (Q := Q) hnQ hR + _ = n := by + rw [Int.toNat_of_nonneg (sub_nonneg.mpr hnQ)] + ring + have hshift : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscale_nonneg : 0 ≤ R.scale := by + simpa [hscaleR] using hn + calc + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_nonneg_scale hscale_nonneg + _ = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + simp [hscaleR] + exact hshift + +theorem isBigO_gammaSigma_restrictionCenteredDescendantAverageOnCube_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + {d : ℕ} {Q : TriadicCube d} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {σ K : ℝ} + (hP : RestrictionLawCarrier P) + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_localRep : + ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hσ₀ : 0 < σ) (hσ₂ : σ ≤ 2) (hK : 0 < K) + (hX0 : IsBigO P (gammaSigma σ) (restrictionCenteredOriginObservable P n X) K) : + IsBigO P (gammaSigma σ) (restrictionCenteredDescendantAverageOnCube P Q n X) + (gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale Q n).card : ℝ) / + ((descendantsAtScale Q n).card : ℝ)) * K) := by + classical + let D : Finset (TriadicCube d) := descendantsAtScale Q n + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + let Yrep : TriadicCube d → RegCoeffField d → ℝ := + fun R => + if hR : R ∈ D then Classical.choose (hX_localRep R (by simpa [D] using hR)) + else fun _a => 0 + let Zraw : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => Yrep R a - μ0 + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hYrep_local : + ∀ R ∈ D, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Yrep R) := by + intro R hR + dsimp [Yrep] + rw [dif_pos hR] + exact (Classical.choose_spec (hX_localRep R (by simpa [D] using hR))).1 + have hX_eq_Yrep : + ∀ R ∈ D, X (cubeSet R) =ᵐ[P] Yrep R := by + intro R hR + dsimp [Yrep] + rw [dif_pos hR] + exact (Classical.choose_spec (hX_localRep R (by simpa [D] using hR))).2 + have hZraw_eq_Z : + ∀ R ∈ D, Zraw R =ᵐ[P] Z R := by + intro R hR + filter_upwards [hX_eq_Yrep R hR] with a ha + simp [Zraw, Z, ha] + have hZ_local : + ∀ R ∈ D, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hYrep_local R hR).sub measurable_const + have hZ_aemeas : + ∀ R ∈ D, AEMeasurable (Z R) P := by + intro R hR + exact hP.aemeasurable_of_isLocalRandomVariable (hZ_local R hR) + have hZ_tail : + ∀ R ∈ D, IsBigO P (gammaSigma σ) (Z R) K := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin_of_nonneg + (Q := Q) (R := R) hn hnQ (by simpa [D] using hR) + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! + (hX_desc_aemeas R (by simpa [D] using hR)).sub measurable_const.aemeasurable + have hmap : + Measure.map (Y (cubeSet R)) P = + Measure.map (Y (cubeSet (originCube d n))) P := by + calc + Measure.map (Y (cubeSet R)) P = + Measure.map + (Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)))) P := by + rw [hshift] + _ = Measure.map (Y (cubeSet (originCube d n))) P := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) hY0_aemeas hY_cov + (scaleTranslationShift n R) + have hraw : + IsBigO P (gammaSigma σ) (Zraw R) K := by + have horigin : + IsBigO P (gammaSigma σ) (Y (cubeSet (originCube d n))) K := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using! hX0 + have htail := + (isBigO_gammaSigma_iff_of_map_eq_map_aemeasurable + (μ := P) (σ := σ) (A := K) + hYR_aemeas hY0_aemeas hmap).2 horigin + simpa [Zraw, Y] using htail + exact (isBigO_congr_ae (μ := P) (Ψ := gammaSigma σ) (A := K) + (hZraw_eq_Z R hR)).1 hraw + have hY0_int : Integrable (Y (cubeSet (originCube d n))) P := by + have hY0_tail : + IsBigO P (gammaSigma σ) (Y (cubeSet (originCube d n))) K := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using! hX0 + have hY0_mom := + hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := P) (X := Y (cubeSet (originCube d n))) (K := K) (σ := σ) + hσ₀ hK hY0_aemeas hY0_tail + have hY0_abs_int : Integrable (fun a => |Y (cubeSet (originCube d n)) a|) P := by + simpa using + (IndependentSums.gammaMomentGrowth_natCast_bound + (μ := P) (X := Y (cubeSet (originCube d n))) (σ := σ) + (M := gammaMomentConst σ * K) (n := 1) (by norm_num) hY0_mom).1 + have hY0_norm_int : Integrable (fun a => ‖Y (cubeSet (originCube d n)) a‖) P := by + simpa [Real.norm_eq_abs] using hY0_abs_int + exact + (integrable_norm_iff hY0_aemeas.aestronglyMeasurable).1 hY0_norm_int + have hX0_int : Integrable (X (cubeSet (originCube d n))) P := by + have hX0_eq : + (fun a => X (cubeSet (originCube d n)) a) = + fun a => Y (cubeSet (originCube d n)) a + μ0 := by + funext a + simp [Y, μ0] + simpa [hX0_eq] using hY0_int.add (integrable_const μ0) + have hY0_mean : ∫ a, Y (cubeSet (originCube d n)) a ∂P = 0 := by + calc + ∫ a, Y (cubeSet (originCube d n)) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Y] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by simp [μ0] + _ = 0 := by ring + have hZraw_mean : + ∀ R ∈ D, ∫ a, Zraw R a ∂P = 0 := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin_of_nonneg + (Q := Q) (R := R) hn hnQ (by simpa [D] using hR) + have hint : + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + calc + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, + Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + rw [hshift] + _ = ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) + hY0_aemeas.aestronglyMeasurable hY_cov (scaleTranslationShift n R) + simpa [Zraw, Y] using hint.trans hY0_mean + have hZ_mean : + ∀ R ∈ D, ∫ a, Z R a ∂P = 0 := by + intro R hR + calc + ∫ a, Z R a ∂P = ∫ a, Zraw R a ∂P := + integral_congr_ae (hZraw_eq_Z R hR).symm + _ = 0 := hZraw_mean R hR + have havg := + isBigO_gammaSigma_restrictionDescendantAverage_of_restrictionUnitRangeDependentLaw_aemeasurable + (Q := Q) (k := n) (P := P) hnQ hPdep hσ₀ hσ₂ hK Z + (by intro R hR; exact hZ_local R (by simpa [D] using hR)) + (by intro R hR; exact hZ_aemeas R (by simpa [D] using hR)) + (by intro R hR; exact hZ_tail R (by simpa [D] using hR)) + (by intro R hR; exact hZ_mean R (by simpa [D] using hR)) + have hcenter_eq : + restrictionCenteredDescendantAverageOnCube P Q n X =ᵐ[P] + fun a => ((descendantsAtScale Q n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q n, Z R a := by + have hAll : ∀ᵐ a ∂P, ∀ R ∈ D, Zraw R a = Z R a := by + rw [Filter.eventually_all_finset] + intro R hR + exact hZraw_eq_Z R hR + filter_upwards [hAll] with a hAll_a + change + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, Zraw R a) = + ((D.card : ℝ)⁻¹ * ∑ R ∈ D, Z R a) + congr 1 + exact Finset.sum_congr rfl fun R hR => hAll_a R hR + exact (isBigO_congr_ae (μ := P) (Ψ := gammaSigma σ) + (A := gammaSigmaDescendantsAtScaleConst d n σ * + (Real.sqrt ((descendantsAtScale Q n).card : ℝ) / + ((descendantsAtScale Q n).card : ℝ)) * K) + hcenter_eq).2 havg + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments.lean new file mode 100644 index 0000000000..24ffe92bac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory + +/-! # Partition Average Moments -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/CenteredAverage.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/CenteredAverage.lean new file mode 100644 index 0000000000..02f95e2473 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/CenteredAverage.lean @@ -0,0 +1,295 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Rosenthal + +/-! # Centered Average -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-carrier partition-average moment estimates: centered descendant averages +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- A descendant at a nonnegative scale is an integer translate of the origin cube at that scale. -/ +theorem cubeSet_descendant_eq_translate_origin + {d : ℕ} {n : ℤ} {Q R : TriadicCube d} + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) (hR : R ∈ descendantsAtScale Q n) : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscaleR : R.scale = n := by + calc + R.scale = Q.scale - Int.toNat (Q.scale - n) := by + exact scale_eq_sub_of_mem_descendantsAtScale (Q := Q) hnQ hR + _ = n := by + rw [Int.toNat_of_nonneg (sub_nonneg.mpr hnQ)] + ring + have hshift : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscale_nonneg : 0 ≤ R.scale := by + simpa [hscaleR] using hn + calc + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_nonneg_scale hscale_nonneg + _ = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + simp [hscaleR] + exact hshift + +/-- A stationary restriction law gives equal pushforward laws for a covariant observable on an +integer-translated cube and its origin representative. Only the origin observable must be a.e. +measurable. -/ +theorem restrictionCovariant_map_eq_of_cubeTranslation + {d : ℕ} {n : ℤ} {R : TriadicCube d} {P : RestrictionCoeffLaw d} + {Y : Set (Vec d) → RegCoeffField d → ℝ} + (hPstat : RestrictionStationaryLaw P) (hY_cov : IsRestrictionTranslationCovariant Y) + (hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P) + (hshift : cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) : + Measure.map (Y (cubeSet R)) P = + Measure.map (Y (cubeSet (originCube d n))) P := by + calc + Measure.map (Y (cubeSet R)) P = + Measure.map + (Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)))) P := by + rw [hshift] + _ = Measure.map (Y (cubeSet (originCube d n))) P := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) hY0_aemeas hY_cov + (scaleTranslationShift n R) + +/-- Centered polynomial-moment fluctuation bound for restriction-centered +descendant averages of a translation-covariant cube observable. -/ +theorem integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) : + (∫ a, |restrictionCenteredDescendantAverage P n m X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ + (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + have hp_nat_ne_zero : p ≠ 0 := by omega + let N : ℝ := ((descendantsAtScale (originCube d m) n).card : ℝ) + let c : ℝ := N⁻¹ + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + have hdesc_nonempty : (descendantsAtScale (originCube d m) n).Nonempty := by + exact descendantsAtScale_nonempty (originCube d m) hnm + have hN_pos : 0 < N := by + dsimp [N] + exact_mod_cast hdesc_nonempty.card_pos + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hY0Lp_int : + Integrable (fun a => |Y (cubeSet (originCube d n)) a| ^ p) P := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp_int + have hY0Lp : + (∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp + have hY0_memLp : MemLp (Y (cubeSet (originCube d n))) (p : ENNReal) P := by + rw [← integrable_norm_rpow_iff + hY0_aemeas.aestronglyMeasurable (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hY0Lp_int + have hY0_memL1 : MemLp (Y (cubeSet (originCube d n))) (1 : ENNReal) P := by + exact hY0_memLp.mono_exponent (by exact_mod_cast (show 1 ≤ p by omega)) + have hY0_int : Integrable (Y (cubeSet (originCube d n))) P := by + rwa [memLp_one_iff_integrable] at hY0_memL1 + have hX0_int : Integrable (X (cubeSet (originCube d n))) P := by + have hX0_eq : + (fun a => X (cubeSet (originCube d n)) a) = + fun a => Y (cubeSet (originCube d n)) a + μ0 := by + funext a + simp [Y, μ0] + simpa [hX0_eq] using hY0_int.add (integrable_const μ0) + have hY0_mean : ∫ a, Y (cubeSet (originCube d n)) a ∂P = 0 := by + calc + ∫ a, Y (cubeSet (originCube d n)) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Y] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by + simp [μ0] + _ = 0 := by + ring + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hX_local R hR).sub measurable_const + have hZ_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (Z R) P := by + intro R hR + simpa [Z] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hZ_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, + Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnm hR + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR_int : + Integrable (fun a => |Y (cubeSet R) a| ^ p) P := by + exact integrable_abs_pow_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap hY0Lp_int + simpa [Z, Y] using hYR_int + have hZ_mean : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnm hR + have hint : + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + calc + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, + Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + rw [hshift] + _ = ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) + hY0_aemeas.aestronglyMeasurable hY_cov (scaleTranslationShift n R) + simpa [Z, Y] using hint.trans hY0_mean + have hZ_bound : + ∀ R ∈ descendantsAtScale (originCube d m) n, + (∫ a, |Z R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnm hR + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR : + (∫ a, |Y (cubeSet R) a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + have hint : + ∫ a, |Y (cubeSet R) a| ^ p ∂P = + ∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P := + integral_abs_pow_eq_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap + simpa [hint] using hY0Lp + simpa [Z, Y] using hYR + have hsum := + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_restrictionUnitRangeDependentLaw + (Q := originCube d m) (k := n) (P := P) + hPdep hp hK_nonneg Z hZ_local hZ_aemeas hZ_int hZ_mean hZ_bound + let S : RegCoeffField d → ℝ := + fun a => ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a + have hS_aemeas : AEMeasurable S P := by + have hsum : AEMeasurable + (∑ R ∈ descendantsAtScale (originCube d m) n, Z R) P := + Finset.aemeasurable_sum _ (fun R hR => hZ_aemeas R hR) + convert hsum using 1 + ext a + simp [S] + have hS_memLp : MemLp S (p : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro R hR + refine (integrable_norm_rpow_iff + (hZ_aemeas R hR).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hZ_int R hR + have hS_int : Integrable (fun a => |S a| ^ p) P := by + simpa [S, Real.norm_eq_abs] using hS_memLp.integrable_norm_pow hp_nat_ne_zero + let Aavg : RegCoeffField d → ℝ := c • S + have hAavg_aemeas : AEMeasurable Aavg P := hS_aemeas.const_smul c + have hAavg_memLp : MemLp Aavg (p : ENNReal) P := hS_memLp.const_smul c + have hAavg_int : Integrable (fun a => |Aavg a| ^ p) P := by + simpa [Aavg, S, Real.norm_eq_abs] using hAavg_memLp.integrable_norm_pow hp_nat_ne_zero + have hS_toReal : + ENNReal.toReal (eLpNorm S (p : ENNReal) P) = + (∫ a, |S a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable (show 1 ≤ p by omega) hS_aemeas hS_int + have hAavg_toReal : + ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) = + (∫ a, |Aavg a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + (show 1 ≤ p by omega) hAavg_aemeas hAavg_int + have hscale : + ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) = + c * ENNReal.toReal (eLpNorm S (p : ENNReal) P) := by + rw [show Aavg = c • S by rfl, eLpNorm_const_smul] + rw [ENNReal.toReal_mul] + simp [Real.norm_eq_abs, abs_of_nonneg hc_nonneg] + have hAavg_eq : Aavg = restrictionCenteredDescendantAverage P n m X := by + funext a + simp [Aavg, S, Z, restrictionCenteredDescendantAverage, μ0, c, N] + calc + (∫ a, |restrictionCenteredDescendantAverage P n m X a| ^ p ∂P) ^ (1 / (p : ℝ)) + = ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) := by + rw [hAavg_toReal] + simp [hAavg_eq] + _ = c * ENNReal.toReal (eLpNorm S (p : ENNReal) P) := hscale + _ = c * (∫ a, |S a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + rw [hS_toReal] + _ ≤ c * + (rosenthalDescendantsAtScaleLpConst d n p * N ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * Real.sqrt N * K) := by + exact mul_le_mul_of_nonneg_left (by simpa [S, N] using hsum) hc_nonneg + _ = N⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * N ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * Real.sqrt N * K) := by + simp [c] + _ = ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ + (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + simp [N] + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Integrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Integrability.lean new file mode 100644 index 0000000000..ee89c22b40 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Integrability.lean @@ -0,0 +1,400 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.OnCube + +/-! # Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-carrier partition-average moment estimates: integrability +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- Integrability of the centered descendant average follows from the +corresponding centered origin-cube moment by stationarity and translation +covariance. -/ +theorem integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary_of_isTranslationCovariant + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (X (cubeSet R)) P) + (hp : 1 ≤ p) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) : + Integrable (fun a => |restrictionCenteredDescendantAverage P n m X a| ^ p) P := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hY0Lp_int : + Integrable (fun a => |Y (cubeSet (originCube d n)) a| ^ p) P := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp_int + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (Z R) P := by + intro R hR + simpa [Z] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hZ_int : + ∀ R ∈ descendantsAtScale (originCube d m) n, + Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + have hscaleR : R.scale = n := by + calc + R.scale = (originCube d m).scale - Int.toNat ((originCube d m).scale - n) := by + exact scale_eq_sub_of_mem_descendantsAtScale (Q := originCube d m) hnm hR + _ = m - Int.toNat (m - n) := by + rfl + _ = n := by + rw [Int.toNat_of_nonneg (sub_nonneg.mpr hnm)] + ring + have hshift : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscale_nonneg : 0 ≤ R.scale := by + simpa [hscaleR] using hn + calc + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_nonneg_scale hscale_nonneg + _ = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + simp [hscaleR] + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap : + Measure.map (Y (cubeSet R)) P = + Measure.map (Y (cubeSet (originCube d n))) P := by + calc + Measure.map (Y (cubeSet R)) P = + Measure.map + (Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)))) P := by + rw [hshift] + _ = Measure.map (Y (cubeSet (originCube d n))) P := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) hY0_aemeas hY_cov + (scaleTranslationShift n R) + have hYR_int : + Integrable (fun a => |Y (cubeSet R) a| ^ p) P := by + exact integrable_abs_pow_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap hY0Lp_int + simpa [Z, Y] using hYR_int + let S : RegCoeffField d → ℝ := + fun a => ∑ R ∈ descendantsAtScale (originCube d m) n, Z R a + have hS_memLp : MemLp S (p : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro R hR + refine (integrable_norm_rpow_iff + (hZ_aemeas R hR).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hZ_int R hR + let Aavg : RegCoeffField d → ℝ := + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ • S + have hAavg_eq : Aavg = restrictionCenteredDescendantAverage P n m X := by + funext a + simp [Aavg, S, Z, restrictionCenteredDescendantAverage, μ0] + have hAavg_memLp : MemLp Aavg (p : ENNReal) P := hS_memLp.const_smul _ + simpa [Aavg, hAavg_eq, Real.norm_eq_abs] using + hAavg_memLp.integrable_norm_pow hp_nat_ne_zero + +/-- Integrability of the centered descendant average follows from the +corresponding centered origin-cube moment by stationarity. -/ +theorem integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (X (cubeSet R)) P) + (hp : 1 ≤ p) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) : + Integrable (fun a => |restrictionCenteredDescendantAverage P n m X a| ^ p) P := + integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary_of_isTranslationCovariant + (d := d) (n := n) (m := m) (P := P) (p := p) + hn hnm hPstat X hX_cov hX0_aemeas hX_desc_aemeas hp hX0Lp_int + +/-- Integrability of the centered descendant average over an arbitrary parent +cube follows from the corresponding centered origin-cube moment by +stationarity and translation covariance. -/ +theorem integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary_of_isTranslationCovariant + {d : ℕ} {Q : TriadicCube d} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hp : 1 ≤ p) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) : + Integrable (fun a => |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p) P := by + have hp_nat_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hY0Lp_int : + Integrable (fun a => |Y (cubeSet (originCube d n)) a| ^ p) P := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp_int + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (Z R) P := by + intro R hR + simpa [Z] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hZ_int : + ∀ R ∈ descendantsAtScale Q n, + Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + have hscaleR : R.scale = n := by + calc + R.scale = Q.scale - Int.toNat (Q.scale - n) := by + exact scale_eq_sub_of_mem_descendantsAtScale (Q := Q) hnQ hR + _ = n := by + rw [Int.toNat_of_nonneg (sub_nonneg.mpr hnQ)] + ring + have hshift : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscale_nonneg : 0 ≤ R.scale := by + simpa [hscaleR] using hn + calc + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_nonneg_scale hscale_nonneg + _ = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + simp [hscaleR] + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap : + Measure.map (Y (cubeSet R)) P = + Measure.map (Y (cubeSet (originCube d n))) P := by + calc + Measure.map (Y (cubeSet R)) P = + Measure.map + (Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)))) P := by + rw [hshift] + _ = Measure.map (Y (cubeSet (originCube d n))) P := by + exact map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) hY0_aemeas hY_cov + (scaleTranslationShift n R) + have hYR_int : + Integrable (fun a => |Y (cubeSet R) a| ^ p) P := by + exact integrable_abs_pow_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap hY0Lp_int + simpa [Z, Y] using hYR_int + let S : RegCoeffField d → ℝ := + fun a => ∑ R ∈ descendantsAtScale Q n, Z R a + have hS_memLp : MemLp S (p : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro R hR + refine (integrable_norm_rpow_iff + (hZ_aemeas R hR).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hZ_int R hR + let Aavg : RegCoeffField d → ℝ := + ((descendantsAtScale Q n).card : ℝ)⁻¹ • S + have hAavg_eq : Aavg = restrictionCenteredDescendantAverageOnCube P Q n X := by + funext a + simp [Aavg, S, Z, restrictionCenteredDescendantAverageOnCube, μ0] + have hAavg_memLp : MemLp Aavg (p : ENNReal) P := hS_memLp.const_smul _ + simpa [Aavg, hAavg_eq, Real.norm_eq_abs] using + hAavg_memLp.integrable_norm_pow hp_nat_ne_zero + +/-- Integrability of the centered descendant average over an arbitrary parent +cube follows from the corresponding centered origin-cube moment by +stationarity. -/ +theorem integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary + {d : ℕ} {Q : TriadicCube d} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hp : 1 ≤ p) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) : + Integrable (fun a => |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p) P := + integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary_of_isTranslationCovariant + (d := d) (Q := Q) (n := n) (P := P) (p := p) + hn hnQ hPstat X hX_cov hX0_aemeas hX_desc_aemeas hp hX0Lp_int + +/-- Integrability of the finite parent maximum of centered descendant averages. + +This is the integrability half of the public finite-parent moment estimate; it +is useful when a downstream theorem first compares another observable to this +finite maximum and then applies the Ch4 moment bound. -/ +theorem integrable_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_of_stationary + {d : ℕ} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {p : ℕ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hp : 1 ≤ p) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) : + Integrable + (fun a : RegCoeffField d => + (parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) ^ p) P := by + have hsum_int : + Integrable + (fun a : RegCoeffField d => + ∑ Q ∈ parents, |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p) P := + MeasureTheory.integrable_finsetSum parents fun Q hQ => + integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary + (d := d) (Q := Q) (n := n) (P := P) (p := p) + hn (hparent_scale Q hQ) hPstat X hX_cov hX0_aemeas + (hX_desc_aemeas Q hQ) hp hX0Lp_int + have hsup_aemeas : + AEMeasurable + (fun a : RegCoeffField d => + parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) P := by + have h : + AEMeasurable + (parents.sup' hparents + (fun Q (a : RegCoeffField d) => + |restrictionCenteredDescendantAverageOnCube P Q n X a|)) P := by + refine Finset.sup'_induction (s := parents) (H := hparents) + (f := fun Q a => |restrictionCenteredDescendantAverageOnCube P Q n X a|) + (p := fun f => AEMeasurable f P) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro Q hQ + have havg : + AEMeasurable (fun a => restrictionCenteredDescendantAverageOnCube P Q n X a) P := by + unfold restrictionCenteredDescendantAverageOnCube + have hsum : + AEMeasurable + (fun a => + ∑ R ∈ descendantsAtScale Q n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P)) P := by + have hsum' : AEMeasurable + (∑ R ∈ descendantsAtScale Q n, + fun a => X (cubeSet R) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P) P := + Finset.aemeasurable_sum _ fun R hR => + (hX_desc_aemeas Q hQ R hR).sub aemeasurable_const + convert hsum' using 1 + ext a + simp + exact aemeasurable_const.mul + hsum + simpa [Real.norm_eq_abs] using havg.norm + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hparents + (fun Q (a : RegCoeffField d) => + |restrictionCenteredDescendantAverageOnCube P Q n X a|) a).symm + refine Integrable.mono' hsum_int (hsup_aemeas.pow_const p).aestronglyMeasurable ?_ + refine Filter.Eventually.of_forall ?_ + intro a + have hparents_nonempty : parents.Nonempty := hparents + obtain ⟨Q0, hQ0⟩ := hparents_nonempty + have hsup_nonneg : + 0 ≤ parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) := + (abs_nonneg (restrictionCenteredDescendantAverageOnCube P Q0 n X a)).trans + (Finset.le_sup' + (f := fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) hQ0) + have hsup_le_sum : + (parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) ^ p ≤ + ∑ Q ∈ parents, |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p := by + obtain ⟨Q, hQ, hsup_le⟩ : + ∃ Q ∈ parents, + parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) ≤ + |restrictionCenteredDescendantAverageOnCube P Q n X a| := by + simpa only [Finset.le_sup'_iff] using + (show parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) ≤ + parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) from le_rfl) + have hQ_le_sup : + |restrictionCenteredDescendantAverageOnCube P Q n X a| ≤ + parents.sup' hparents + (fun R => |restrictionCenteredDescendantAverageOnCube P R n X a|) := + Finset.le_sup' + (f := fun R => |restrictionCenteredDescendantAverageOnCube P R n X a|) hQ + have hsup_eq : + parents.sup' hparents + (fun R => |restrictionCenteredDescendantAverageOnCube P R n X a|) = + |restrictionCenteredDescendantAverageOnCube P Q n X a| := + le_antisymm hsup_le hQ_le_sup + rw [hsup_eq] + exact Finset.single_le_sum + (f := fun R => |restrictionCenteredDescendantAverageOnCube P R n X a| ^ p) + (fun R _ => by positivity) hQ + have hleft_nonneg : + 0 ≤ + (parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) ^ p := + pow_nonneg hsup_nonneg p + have habs_eq : + |parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)| = + parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|) := + abs_of_nonneg hsup_nonneg + simpa [Real.norm_eq_abs, habs_eq, abs_of_nonneg hleft_nonneg] using hsup_le_sum + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/OnCube.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/OnCube.lean new file mode 100644 index 0000000000..6cbeb7fc52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/OnCube.lean @@ -0,0 +1,469 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.CenteredAverage + +/-! # On Cube -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-carrier partition-average moment estimates: parent-cube and response averages +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- A nonnegative scalar multiple of a finite sum inherits its polynomial-moment +bound, including when the observable is identified only almost everywhere. -/ +private theorem integral_abs_scaled_finsetSum_pow_rpow_inv_le_of_ae_eq + {Ω ι : Type*} [MeasurableSpace Ω] {P : Measure Ω} + {D : Finset ι} {Z : ι → Ω → ℝ} {A : Ω → ℝ} {p : ℕ} {c B : ℝ} + (hp : 1 ≤ p) (hc_nonneg : 0 ≤ c) + (hZ_aemeas : ∀ i ∈ D, AEMeasurable (Z i) P) + (hZ_int : ∀ i ∈ D, Integrable (fun a => |Z i a| ^ p) P) + (hA : A =ᵐ[P] c • (fun a => ∑ i ∈ D, Z i a)) + (hsum : (∫ a, |∑ i ∈ D, Z i a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ B) : + (∫ a, |A a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ c * B := by + classical + have hp_nat_ne_zero : p ≠ 0 := by omega + let S : Ω → ℝ := fun a => ∑ i ∈ D, Z i a + have hS_aemeas : AEMeasurable S P := by + have hsum : AEMeasurable (∑ R ∈ D, Z R) P := + Finset.aemeasurable_sum _ (fun R hR => hZ_aemeas R hR) + convert hsum using 1 + ext a + simp [S] + have hS_memLp : MemLp S (p : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro R hR + refine (integrable_norm_rpow_iff + (hZ_aemeas R hR).aestronglyMeasurable + (by exact_mod_cast hp_nat_ne_zero) (by simp)).1 ?_ + simpa [Real.norm_eq_abs] using hZ_int R hR + have hS_int : Integrable (fun a => |S a| ^ p) P := by + simpa [S, Real.norm_eq_abs] using hS_memLp.integrable_norm_pow hp_nat_ne_zero + let Aavg : Ω → ℝ := c • S + have hAavg_aemeas : AEMeasurable Aavg P := hS_aemeas.const_smul c + have hAavg_memLp : MemLp Aavg (p : ENNReal) P := hS_memLp.const_smul c + have hAavg_int : Integrable (fun a => |Aavg a| ^ p) P := by + simpa [Aavg, S, Real.norm_eq_abs] using hAavg_memLp.integrable_norm_pow hp_nat_ne_zero + have hS_toReal : + ENNReal.toReal (eLpNorm S (p : ENNReal) P) = + (∫ a, |S a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + hp hS_aemeas hS_int + have hAavg_toReal : + ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) = + (∫ a, |Aavg a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + exact toReal_eLpNorm_eq_integral_abs_pow_rpow_inv_aemeasurable + hp hAavg_aemeas hAavg_int + have hscale : + ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) = + c * ENNReal.toReal (eLpNorm S (p : ENNReal) P) := by + rw [show Aavg = c • S by rfl, eLpNorm_const_smul] + rw [ENNReal.toReal_mul] + simp [Real.norm_eq_abs, abs_of_nonneg hc_nonneg] + have hA_integral_eq : ∫ a, |A a| ^ p ∂P = ∫ a, |Aavg a| ^ p ∂P := + integral_congr_ae (by + filter_upwards [hA] with a ha + change A a = Aavg a at ha + rw [ha]) + calc + (∫ a, |A a| ^ p ∂P) ^ (1 / (p : ℝ)) = + ENNReal.toReal (eLpNorm Aavg (p : ENNReal) P) := by + rw [hA_integral_eq, ← hAavg_toReal] + _ = c * ENNReal.toReal (eLpNorm S (p : ENNReal) P) := hscale + _ = c * (∫ a, |S a| ^ p ∂P) ^ (1 / (p : ℝ)) := by rw [hS_toReal] + _ ≤ c * B := mul_le_mul_of_nonneg_left hsum hc_nonneg + +/-- Centered polynomial-moment fluctuation bound for restriction-centered +descendant averages over an arbitrary parent cube. -/ +theorem integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) : + (∫ a, |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) := by + have hp_nat_ne_zero : p ≠ 0 := by omega + let N : ℝ := ((descendantsAtScale Q n).card : ℝ) + let c : ℝ := N⁻¹ + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + have hdesc_nonempty : (descendantsAtScale Q n).Nonempty := by + exact descendantsAtScale_nonempty Q hnQ + have hN_pos : 0 < N := by + dsimp [N] + exact_mod_cast hdesc_nonempty.card_pos + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hY0Lp_int : + Integrable (fun a => |Y (cubeSet (originCube d n)) a| ^ p) P := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp_int + have hY0Lp : + (∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp + have hY0_memLp : MemLp (Y (cubeSet (originCube d n))) (p : ENNReal) P := by + rw [← integrable_norm_rpow_iff + hY0_aemeas.aestronglyMeasurable (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hY0Lp_int + have hY0_memL1 : MemLp (Y (cubeSet (originCube d n))) (1 : ENNReal) P := by + exact hY0_memLp.mono_exponent (by exact_mod_cast (show 1 ≤ p by omega)) + have hY0_int : Integrable (Y (cubeSet (originCube d n))) P := by + rwa [memLp_one_iff_integrable] at hY0_memL1 + have hX0_int : Integrable (X (cubeSet (originCube d n))) P := by + have hX0_eq : + (fun a => X (cubeSet (originCube d n)) a) = + fun a => Y (cubeSet (originCube d n)) a + μ0 := by + funext a + simp [Y, μ0] + simpa [hX0_eq] using hY0_int.add (integrable_const μ0) + have hY0_mean : ∫ a, Y (cubeSet (originCube d n)) a ∂P = 0 := by + calc + ∫ a, Y (cubeSet (originCube d n)) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Y] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by + simp [μ0] + _ = 0 := by + ring + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + have hZ_local : + ∀ R ∈ descendantsAtScale Q n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hX_local R hR).sub measurable_const + have hZ_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (Z R) P := by + intro R hR + simpa [Z] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hZ_int : + ∀ R ∈ descendantsAtScale Q n, + Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnQ hR + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR_int : + Integrable (fun a => |Y (cubeSet R) a| ^ p) P := by + exact integrable_abs_pow_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap hY0Lp_int + simpa [Z, Y] using hYR_int + have hZ_mean : + ∀ R ∈ descendantsAtScale Q n, ∫ a, Z R a ∂P = 0 := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnQ hR + have hint : + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + calc + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, + Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + rw [hshift] + _ = ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) + hY0_aemeas.aestronglyMeasurable hY_cov (scaleTranslationShift n R) + simpa [Z, Y] using hint.trans hY0_mean + have hZ_bound : + ∀ R ∈ descendantsAtScale Q n, + (∫ a, |Z R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin hn hnQ hR + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! (hX_desc_aemeas R hR).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR : + (∫ a, |Y (cubeSet R) a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + have hint : + ∫ a, |Y (cubeSet R) a| ^ p ∂P = + ∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P := + integral_abs_pow_eq_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap + simpa [hint] using hY0Lp + simpa [Z, Y] using hYR + have hsum := + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := n) (P := P) + hPdep hp hK_nonneg Z hZ_local hZ_aemeas hZ_int hZ_mean hZ_bound + have haverage : restrictionCenteredDescendantAverageOnCube P Q n X =ᵐ[P] + c • (fun a => ∑ R ∈ descendantsAtScale Q n, Z R a) := by + filter_upwards [] with a + simp [Z, restrictionCenteredDescendantAverageOnCube, μ0, c, N] + simpa only [c, N] using + integral_abs_scaled_finsetSum_pow_rpow_inv_le_of_ae_eq + (by omega : 1 ≤ p) hc_nonneg hZ_aemeas hZ_int haverage hsum + +/-- Completed-local version of +`integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw`. + +The raw observable is allowed to be only a.e.-equal, under the law, to local +representatives on the finitely many descendant cubes. This is the honest +surface for totalized Ch4 observables such as coarse-block entries: stationarity +and moment transfer use the raw translation-covariant observable, while +unit-range independence is applied to the local representatives internally. -/ +theorem integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + {d : ℕ} {Q : TriadicCube d} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hP : RestrictionLawCarrier P) + (hn : 0 ≤ n) (hnQ : n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_localRep : + ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale Q n, AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) : + (∫ a, |restrictionCenteredDescendantAverageOnCube P Q n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) := by + classical + have hp_nat_ne_zero : p ≠ 0 := by omega + let D : Finset (TriadicCube d) := descendantsAtScale Q n + let N : ℝ := (D.card : ℝ) + let c : ℝ := N⁻¹ + let μ0 : ℝ := ∫ a, X (cubeSet (originCube d n)) a ∂P + let Y : Set (Vec d) → RegCoeffField d → ℝ := fun U a => X U a - μ0 + let Yrep : TriadicCube d → RegCoeffField d → ℝ := + fun R => + if hR : R ∈ D then Classical.choose (hX_localRep R (by simpa [D] using hR)) + else fun _a => 0 + let Zraw : TriadicCube d → RegCoeffField d → ℝ := fun R a => X (cubeSet R) a - μ0 + let Z : TriadicCube d → RegCoeffField d → ℝ := fun R a => Yrep R a - μ0 + have hdesc_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty Q hnQ + have hN_pos : 0 < N := by + dsimp [N] + exact_mod_cast hdesc_nonempty.card_pos + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hY_cov : IsRestrictionTranslationCovariant Y := by + intro U z a + simpa [Y] using congrArg (fun x : ℝ => x - μ0) (hX_cov U z a) + have hY0_aemeas : AEMeasurable (Y (cubeSet (originCube d n))) P := by + simpa [Y] using! hX0_aemeas.sub measurable_const.aemeasurable + have hY0Lp_int : + Integrable (fun a => |Y (cubeSet (originCube d n)) a| ^ p) P := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp_int + have hY0Lp : + (∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K := by + simpa [Y, μ0, restrictionCenteredOriginObservable] using hX0Lp + have hY0_memLp : MemLp (Y (cubeSet (originCube d n))) (p : ENNReal) P := by + rw [← integrable_norm_rpow_iff + hY0_aemeas.aestronglyMeasurable (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hY0Lp_int + have hY0_memL1 : MemLp (Y (cubeSet (originCube d n))) (1 : ENNReal) P := by + exact hY0_memLp.mono_exponent (by exact_mod_cast (show 1 ≤ p by omega)) + have hY0_int : Integrable (Y (cubeSet (originCube d n))) P := by + rwa [memLp_one_iff_integrable] at hY0_memL1 + have hX0_int : Integrable (X (cubeSet (originCube d n))) P := by + have hX0_eq : + (fun a => X (cubeSet (originCube d n)) a) = + fun a => Y (cubeSet (originCube d n)) a + μ0 := by + funext a + simp [Y, μ0] + simpa [hX0_eq] using hY0_int.add (integrable_const μ0) + have hY0_mean : ∫ a, Y (cubeSet (originCube d n)) a ∂P = 0 := by + calc + ∫ a, Y (cubeSet (originCube d n)) a ∂P = + ∫ a, X (cubeSet (originCube d n)) a ∂P - ∫ _a, μ0 ∂P := by + simpa [Y] using integral_sub hX0_int (integrable_const μ0) + _ = μ0 - μ0 := by simp [μ0] + _ = 0 := by ring + have hYrep_local : + ∀ R ∈ D, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Yrep R) := by + intro R hR + dsimp [Yrep] + rw [dif_pos hR] + exact (Classical.choose_spec (hX_localRep R (by simpa [D] using hR))).1 + have hX_eq_Yrep : + ∀ R ∈ D, X (cubeSet R) =ᵐ[P] Yrep R := by + intro R hR + dsimp [Yrep] + rw [dif_pos hR] + exact (Classical.choose_spec (hX_localRep R (by simpa [D] using hR))).2 + have hZraw_eq_Z : + ∀ R ∈ D, Zraw R =ᵐ[P] Z R := by + intro R hR + filter_upwards [hX_eq_Yrep R hR] with a ha + simp [Zraw, Z, ha] + have hZ_local : + ∀ R ∈ D, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (Z R) := by + intro R hR + simpa [Z] using (hYrep_local R hR).sub measurable_const + have hZ_aemeas : + ∀ R ∈ D, AEMeasurable (Z R) P := by + intro R hR + exact hP.aemeasurable_of_isLocalRandomVariable (hZ_local R hR) + have hZraw_int : + ∀ R ∈ D, Integrable (fun a => |Zraw R a| ^ p) P := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin + (Q := Q) (R := R) hn hnQ (by simpa [D] using hR) + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! + (hX_desc_aemeas R (by simpa [D] using hR)).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR_int : + Integrable (fun a => |Y (cubeSet R) a| ^ p) P := by + exact integrable_abs_pow_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap hY0Lp_int + simpa [Zraw, Y] using hYR_int + have hZraw_mean : + ∀ R ∈ D, ∫ a, Zraw R a ∂P = 0 := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin + (Q := Q) (R := R) hn hnQ (by simpa [D] using hR) + have hint : + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + calc + ∫ a, Y (cubeSet R) a ∂P = + ∫ a, + Y + (translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n))) a ∂P := by + rw [hshift] + _ = ∫ a, Y (cubeSet (originCube d n)) a ∂P := by + exact integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + (P := P) hPstat (U := cubeSet (originCube d n)) + hY0_aemeas.aestronglyMeasurable hY_cov (scaleTranslationShift n R) + simpa [Zraw, Y] using hint.trans hY0_mean + have hZraw_bound : + ∀ R ∈ D, + (∫ a, |Zraw R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + intro R hR + have hshift := cubeSet_descendant_eq_translate_origin + (Q := Q) (R := R) hn hnQ (by simpa [D] using hR) + have hYR_aemeas : AEMeasurable (Y (cubeSet R)) P := by + simpa [Y] using! + (hX_desc_aemeas R (by simpa [D] using hR)).sub measurable_const.aemeasurable + have hmap := restrictionCovariant_map_eq_of_cubeTranslation + hPstat hY_cov hY0_aemeas hshift + have hYR : + (∫ a, |Y (cubeSet R) a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + have hint : + ∫ a, |Y (cubeSet R) a| ^ p ∂P = + ∫ a, |Y (cubeSet (originCube d n)) a| ^ p ∂P := + integral_abs_pow_eq_of_map_eq_map_aemeasurable hYR_aemeas hY0_aemeas hmap + simpa [hint] using hY0Lp + simpa [Zraw, Y] using hYR + have hZ_int : + ∀ R ∈ D, Integrable (fun a => |Z R a| ^ p) P := by + intro R hR + refine (hZraw_int R hR).congr ?_ + filter_upwards [(hZraw_eq_Z R hR).symm] with a ha + simp [ha] + have hZ_mean : + ∀ R ∈ D, ∫ a, Z R a ∂P = 0 := by + intro R hR + calc + ∫ a, Z R a ∂P = ∫ a, Zraw R a ∂P := + integral_congr_ae (hZraw_eq_Z R hR).symm + _ = 0 := hZraw_mean R hR + have hZ_bound : + ∀ R ∈ D, + (∫ a, |Z R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + intro R hR + have hint : + ∫ a, |Z R a| ^ p ∂P = ∫ a, |Zraw R a| ^ p ∂P := + integral_congr_ae (by + filter_upwards [(hZraw_eq_Z R hR).symm] with a ha + simp [ha]) + simpa [hint] using hZraw_bound R hR + have hsum := + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := n) (P := P) + hPdep hp hK_nonneg Z + (by intro R hR; exact hZ_local R (by simpa [D] using hR)) + (by intro R hR; exact hZ_aemeas R (by simpa [D] using hR)) + (by intro R hR; exact hZ_int R (by simpa [D] using hR)) + (by intro R hR; exact hZ_mean R (by simpa [D] using hR)) + (by intro R hR; exact hZ_bound R (by simpa [D] using hR)) + let S : RegCoeffField d → ℝ := fun a => ∑ R ∈ D, Z R a + let Sraw : RegCoeffField d → ℝ := fun a => ∑ R ∈ D, Zraw R a + have hSraw_eq_S : Sraw =ᵐ[P] S := by + have hAll : ∀ᵐ a ∂P, ∀ R ∈ D, Zraw R a = Z R a := by + rw [Filter.eventually_all_finset] + intro R hR + exact hZraw_eq_Z R hR + filter_upwards [hAll] with a hAll_a + simp [Sraw, S] + exact Finset.sum_congr rfl fun R hR => by simp [hAll_a R hR] + let Aavg : RegCoeffField d → ℝ := c • S + have hCentered_eq_Aavg : + restrictionCenteredDescendantAverageOnCube P Q n X =ᵐ[P] Aavg := by + filter_upwards [hSraw_eq_S] with a hS_a + calc + restrictionCenteredDescendantAverageOnCube P Q n X a = c * Sraw a := by + simp [restrictionCenteredDescendantAverageOnCube, Sraw, Zraw, μ0, c, N, D] + _ = c * S a := by rw [hS_a] + _ = Aavg a := by simp [Aavg] + simpa only [c, N, D] using + integral_abs_scaled_finsetSum_pow_rpow_inv_le_of_ae_eq + (by omega : 1 ≤ p) hc_nonneg hZ_aemeas hZ_int hCentered_eq_Aavg + (by simpa only [D] using hsum) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Rosenthal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Rosenthal.lean new file mode 100644 index 0000000000..5c72192972 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Rosenthal.lean @@ -0,0 +1,439 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageFluctuations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.PartitionAverageMomentHelpers + +/-! # Rosenthal -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-local partition-average moment estimates: Rosenthal bounds +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- Rosenthal's `L^p` bound on a single scale-color class of descendants under +the restriction-unit-range and restriction-local-random-variable assumptions. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hP : RestrictionUnitRangeDependentLaw P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_aemeas : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, AEMeasurable (X R) P) + (hLp_int : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + Integrable (fun a => |X R a| ^ p) P) + (h_mean : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, ∫ a, X R a ∂P = 0) + (hK : + ∀ R ∈ descendantsAtScaleScaleColorClass Q k c, + (∫ a, |X R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K) : + (∫ a, |∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) := by + have hp_nat_ne_zero : p ≠ 0 := by omega + let S : Finset (TriadicCube d) := descendantsAtScaleScaleColorClass Q k c + by_cases hS : S.Nonempty + · let Y : {R : TriadicCube d // R ∈ S} → RegCoeffField d → ℝ := + fun R => X R.1 + have h_indep : ProbabilityTheory.iIndepFun Y P := by + exact iIndepFun_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (Q := Q) (k := k) (c := c) (P := P) hP + (fun R => hX_local R.1 R.2) + have hLp_int' : + ∀ R ∈ S.attach, Integrable (fun a => |Y R a| ^ p) P := by + intro R _hR + exact hLp_int R.1 R.2 + have h_mean' : ∀ R ∈ S.attach, ∫ a, Y R a ∂P = 0 := by + intro R _hR + exact h_mean R.1 R.2 + have hK' : + ∀ R ∈ S.attach, + (∫ a, |Y R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K := by + intro R _hR + exact hK R.1 R.2 + have hS_attach : S.attach.Nonempty := by + simpa using hS + have hsum_eq : + (fun a => ∑ R ∈ S.attach, Y R a) = + fun a => ∑ R ∈ S, X R a := by + funext a + simpa [Y] using + (Finset.sum_attach (s := S) (f := fun R => X R a)) + have hmain := + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero_aemeasurable + (μ := P) (X := Y) (s := S.attach) (K := K) + hS_attach hp hK_nonneg h_indep + (fun R => hX_aemeas R.1 R.2) hLp_int' h_mean' hK' + have hleft : + (∫ ω, |∑ i ∈ S.attach, Y i ω| ^ p ∂P) = + ∫ a, |∑ R ∈ S, X R a| ^ p ∂P := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun a => by + have hpoint := congrArg (fun f : RegCoeffField d → ℝ => |f a| ^ p) hsum_eq + simpa using hpoint + rw [hleft] at hmain + simpa [S, rosenthalBennettIntegralConst] using hmain + · have hS_empty : S = ∅ := Finset.not_nonempty_iff_eq_empty.mp hS + have hleft_zero : + (∫ a, |∑ R ∈ S, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) = 0 := by + have hpow_zero : (0 : ℝ) ^ p = 0 := by simp [hp_nat_ne_zero] + calc + (∫ a, |∑ R ∈ S, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) + = ((0 : ℝ) ^ p) ^ (1 / (p : ℝ)) := by + simp [hS_empty] + _ = 0 := by + rw [hpow_zero, Real.zero_rpow (by positivity : (1 / (p : ℝ)) ≠ 0)] + have hrhs_nonneg : 0 ≤ + 2 * (p : ℝ) * (0 ^ ((p : ℝ)⁻¹) * K) := by + refine mul_nonneg ?_ ?_ + · positivity + · exact mul_nonneg (Real.zero_rpow_nonneg _) hK_nonneg + rw [hleft_zero] + simpa [S, hS_empty, one_div] using hrhs_nonneg + +private lemma rosenthal_scaleColor_cardinality_bounds + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {p : ℕ} {K : ℝ} + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) : + (∑ c ∈ (descendantsAtScale Q k).image (cubeScaleColor k), + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K) ≤ + rosenthalDescendantsAtScaleLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K) ∧ + (∑ c ∈ (descendantsAtScale Q k).image (cubeScaleColor k), + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) ≤ + rosenthalDescendantsAtScaleSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K) := by + let s : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + have hsum_card_eq : + ∑ c ∈ s, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) = + ((descendantsAtScale Q k).card : ℝ) := by + rw [← Nat.cast_sum] + exact_mod_cast (card_descendantsAtScale_eq_sum_card_scaleColorClass_image Q k).symm + have hs_card_le : + (s.card : ℝ) ≤ ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact_mod_cast (card_image_cubeScaleColor_descendantsAtScale_le Q k) + have hs_card_rpow_le : + (s.card : ℝ) ^ (1 - 1 / (p : ℝ)) ≤ + ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) ^ (1 - 1 / (p : ℝ)) := by + have hexp_nonneg : 0 ≤ 1 - 1 / (p : ℝ) := by + have hp_one : (1 : ℝ) ≤ p := by + exact_mod_cast (show 1 ≤ p by omega) + have hpinv_le_one : 1 / (p : ℝ) ≤ 1 := by + simpa using (one_div_le_one_div_of_le zero_lt_one hp_one) + linarith + exact Real.rpow_le_rpow (by positivity) hs_card_le hexp_nonneg + have hsqrt_card_le : + Real.sqrt (s.card : ℝ) ≤ Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) := by + exact Real.sqrt_le_sqrt hs_card_le + have hsum_rpow_le : + ∑ c ∈ s, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) ≤ + ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) ^ (1 - 1 / (p : ℝ)) * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) := by + have hbase := + sum_rpow_inv_le_card_rpow_mul_rpow_sum + (s := s) (p := p) + (f := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (show 1 ≤ p by omega) + (fun c hc => by positivity) + rw [hsum_card_eq] at hbase + exact hbase.trans <| mul_le_mul_of_nonneg_right hs_card_rpow_le (by positivity) + have hsqrt_sum_le : + ∑ c ∈ s, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + have hbase : + ∑ c ∈ s, Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ≤ + Real.sqrt (s.card : ℝ) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) := by + simpa [hsum_card_eq] using + (Real.sum_sqrt_mul_sqrt_le + (s := s) + (f := fun _ => (1 : ℝ)) + (g := fun c => ((descendantsAtScaleScaleColorClass Q k c).card : ℝ)) + (hf := by intro c; positivity) + (hg := by intro c; positivity)) + exact hbase.trans <| + mul_le_mul_of_nonneg_right hsqrt_card_le (by positivity) + have hA_sum : + ∑ c ∈ s, + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K) ≤ + rosenthalDescendantsAtScaleLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K := by + calc + ∑ c ∈ s, + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K) + = (2 * (p : ℝ) * K) * + ∑ c ∈ s, ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro c hc + ring + _ ≤ 2 * (p : ℝ) * + ((((scaleColorPeriod k) ^ d : ℕ) : ℝ) ^ (1 - 1 / (p : ℝ)) * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K) := by + have hconst_nonneg : 0 ≤ 2 * (p : ℝ) * K := by positivity + have hmul := mul_le_mul_of_nonneg_left hsum_rpow_le hconst_nonneg + simpa [mul_assoc, mul_left_comm, mul_comm] using hmul + _ = rosenthalDescendantsAtScaleLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K := by + simp [rosenthalDescendantsAtScaleLpConst] + ring + have hB_sum : + ∑ c ∈ s, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) ≤ + rosenthalDescendantsAtScaleSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst, IndependentSums.rosenthalBennettIntegralConst] + positivity + calc + ∑ c ∈ s, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) + = (4 * rosenthalBennettIntegralConst * Real.sqrt p * K) * + ∑ c ∈ s, + Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro c hc + ring + _ ≤ 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + ((Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) * + Real.sqrt ((descendantsAtScale Q k).card : ℝ)) * K)) := by + have hconst_nonneg : + 0 ≤ 4 * rosenthalBennettIntegralConst * Real.sqrt p * K := by + have htmp : 0 ≤ 4 * rosenthalBennettIntegralConst * Real.sqrt p := by + exact mul_nonneg (mul_nonneg (by positivity) hRB_nonneg) (by positivity) + exact mul_nonneg htmp hK_nonneg + have hmul := mul_le_mul_of_nonneg_left hsqrt_sum_le hconst_nonneg + simpa [mul_assoc, mul_left_comm, mul_comm] using hmul + _ = rosenthalDescendantsAtScaleSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + simp [rosenthalDescendantsAtScaleSqrtConst] + ring + exact ⟨hA_sum, hB_sum⟩ + +/-- Rosenthal's `L^p` bound for sums over all descendants at a fixed scale, +using the restriction-local and restriction-unit-range interfaces. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScale_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hP : RestrictionUnitRangeDependentLaw P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (X : TriadicCube d → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale Q k, IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X R)) + (hX_aemeas : ∀ R ∈ descendantsAtScale Q k, AEMeasurable (X R) P) + (hLp_int : + ∀ R ∈ descendantsAtScale Q k, Integrable (fun a => |X R a| ^ p) P) + (h_mean : + ∀ R ∈ descendantsAtScale Q k, ∫ a, X R a ∂P = 0) + (hK : + ∀ R ∈ descendantsAtScale Q k, + (∫ a, |X R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ K) : + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ + rosenthalDescendantsAtScaleLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + have hp_nat_ne_zero : p ≠ 0 := by omega + have hp_ennreal_ne_zero : (p : ENNReal) ≠ 0 := by + simpa using hp_nat_ne_zero + have hp_ennreal_top : (p : ENNReal) ≠ ⊤ := by simp + let s : Finset (ScaleColor d k) := (descendantsAtScale Q k).image (cubeScaleColor k) + by_cases hs : s.Nonempty + · let Y : ScaleColor d k → RegCoeffField d → ℝ := + fun c a => ∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R a + have h_aemeas : ∀ c ∈ s, AEMeasurable (Y c) P := by + intro c hc + have hsum : AEMeasurable + (∑ R ∈ descendantsAtScaleScaleColorClass Q k c, X R) P := + Finset.aemeasurable_sum _ fun R hR => + hX_aemeas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1 + convert hsum using 1 + ext a + simp [Y] + have hLp_int_color : + ∀ c ∈ s, Integrable (fun a => |Y c a| ^ p) P := by + intro c hc + have h_attach_int : + ∀ R ∈ (descendantsAtScaleScaleColorClass Q k c).attach, + Integrable (fun a => |X R.1 a| ^ p) P := by + intro R _hR + exact hLp_int R.1 (mem_descendantsAtScaleScaleColorClass_iff.mp R.2).1 + have h_sum := + memLp_finsetSum + ((descendantsAtScaleScaleColorClass Q k c).attach) + (fun R hR => + (integrable_norm_rpow_iff + ((hX_aemeas R.1 + (mem_descendantsAtScaleScaleColorClass_iff.mp R.2).1).aestronglyMeasurable) + hp_ennreal_ne_zero hp_ennreal_top).1 + (by simpa [Real.norm_eq_abs] using h_attach_int R hR)) + have h_sum_int : + Integrable + (fun a => + |∑ R ∈ (descendantsAtScaleScaleColorClass Q k c).attach, X R.1 a| ^ p) P := by + simpa [Real.norm_eq_abs] using h_sum.integrable_norm_pow + (Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one (show 1 ≤ p by omega))) + have hsum_eq_attach : + (fun a => ∑ R ∈ (descendantsAtScaleScaleColorClass Q k c).attach, X R.1 a) = + Y c := by + funext a + simpa [Y] using + (Finset.sum_attach (s := descendantsAtScaleScaleColorClass Q k c) + (f := fun R => X R a)) + have hpow_eq : + (fun a => |Y c a| ^ p) = + (fun a => |∑ R ∈ (descendantsAtScaleScaleColorClass Q k c).attach, + X R.1 a| ^ p) := by + funext a + rw [← hsum_eq_attach] + rw [hpow_eq] + exact h_sum_int + have hY : + ∀ c ∈ s, + (∫ a, |Y c a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K)) := by + intro c hc + exact + integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + (d := d) (Q := Q) (k := k) (c := c) hP hp hK_nonneg X + (fun R hR => hX_local R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hX_aemeas R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hLp_int R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => h_mean R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + (fun R hR => hK R (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1) + have hsum : + (∫ a, |∑ c ∈ s, Y c a| ^ p ∂P) ^ (1 / (p : ℝ)) ≤ + ∑ c ∈ s, (∫ a, |Y c a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + exact _root_.Homogenization.integral_abs_finsetSum_pow_rpow_inv_le_sum_aemeasurable + (μ := P) (show 1 ≤ p by omega) h_aemeas hLp_int_color + have hsum_eq : + (fun a => ∑ c ∈ s, Y c a) = + fun a => ∑ R ∈ descendantsAtScale Q k, X R a := by + funext a + calc + ∑ c ∈ s, Y c a = + ∑ c ∈ s, ∑ i ∈ descendantsAtScaleScaleColorClass Q k c, X i a := by + refine Finset.sum_congr rfl ?_ + intro c hc + simp [Y] + _ = + ∑ i ∈ s.biUnion (descendantsAtScaleScaleColorClass Q k), X i a := by + symm + exact Finset.sum_biUnion (by + intro c hc c' hc' hneq + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hneq) + _ = ∑ i ∈ descendantsAtScale Q k, X i a := by + rw [descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + obtain ⟨hA_sum, hB_sum⟩ := + rosenthal_scaleColor_cardinality_bounds (Q := Q) (k := k) hp hK_nonneg + calc + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) + = (∫ a, |∑ c ∈ s, Y c a| ^ p ∂P) ^ (1 / (p : ℝ)) := by + congr 1 + apply integral_congr_ae + exact Filter.Eventually.of_forall fun a => by + have hpoint := congrArg (fun f : RegCoeffField d → ℝ => |f a| ^ p) hsum_eq + simpa using hpoint.symm + _ ≤ ∑ c ∈ s, (∫ a, |Y c a| ^ p ∂P) ^ (1 / (p : ℝ)) := hsum + _ ≤ ∑ c ∈ s, + (2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K))) := by + exact Finset.sum_le_sum fun c hc => hY c hc + _ = (∑ c ∈ s, + 2 * (p : ℝ) * + (((descendantsAtScaleScaleColorClass Q k c).card : ℝ) ^ + (1 / (p : ℝ)) * K)) + + (∑ c ∈ s, + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * + (Real.sqrt ((descendantsAtScaleScaleColorClass Q k c).card : ℝ) * K))) := by + rw [Finset.sum_add_distrib] + _ ≤ rosenthalDescendantsAtScaleLpConst d k p * + ((descendantsAtScale Q k).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d k p * + Real.sqrt ((descendantsAtScale Q k).card : ℝ) * K := by + exact add_le_add hA_sum hB_sum + · have hs_empty : s = ∅ := Finset.not_nonempty_iff_eq_empty.mp hs + have hdesc_empty : descendantsAtScale Q k = ∅ := by + calc + descendantsAtScale Q k = + s.biUnion (descendantsAtScaleScaleColorClass Q k) := by + rw [show s = (descendantsAtScale Q k).image (cubeScaleColor k) by rfl] + symm + exact descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k + _ = ∅ := by + simp [hs_empty] + have hleft_zero : + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) = 0 := by + have hpow_zero : (0 : ℝ) ^ p = 0 := by simp [hp_nat_ne_zero] + calc + (∫ a, |∑ R ∈ descendantsAtScale Q k, X R a| ^ p ∂P) ^ (1 / (p : ℝ)) + = ((0 : ℝ) ^ p) ^ (1 / (p : ℝ)) := by + simp [hdesc_empty] + _ = 0 := by + rw [hpow_zero, Real.zero_rpow (by positivity : (1 / (p : ℝ)) ≠ 0)] + have hconst_nonneg : 0 ≤ rosenthalDescendantsAtScaleLpConst d k p := by + simp [rosenthalDescendantsAtScaleLpConst] + positivity + have hrhs_nonneg : + 0 ≤ rosenthalDescendantsAtScaleLpConst d k p * 0 ^ ((p : ℝ)⁻¹) * K := by + exact mul_nonneg (mul_nonneg hconst_nonneg (Real.zero_rpow_nonneg _)) hK_nonneg + rw [hleft_zero] + simpa [hdesc_empty, one_div] using hrhs_nonneg + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Theory.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Theory.lean new file mode 100644 index 0000000000..d6bf16a4d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverageMoments/Theory.lean @@ -0,0 +1,429 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Integrability + +/-! # Theory -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-carrier partition-average moment estimates + +This file exposes the finite-moment partition-average estimate against the +clean Chapter 4 observable surface. The hypotheses are direct: locality on the +descendant cubes, translation covariance, measurability, and the origin-cube +moment input. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-- A finite supremum costs only `card ^ (1 / p)` in an `L^p` root when each +observable has `L^p` root bounded by the same constant. -/ +theorem integral_finsetSup_abs_pow_rpow_inv_le_card_rpow_mul + {Ω ι : Type*} [MeasurableSpace Ω] [DecidableEq ι] + {μ : Measure Ω} [IsProbabilityMeasure μ] + {s : Finset ι} (hs : s.Nonempty) {p : ℕ} {K : ℝ} + (hp : 1 ≤ p) (hK_nonneg : 0 ≤ K) + (X : ι → Ω → ℝ) + (hX_aemeas : ∀ i ∈ s, AEMeasurable (X i) μ) + (hX_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hX_root : + ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + (s.card : ℝ) ^ (1 / (p : ℝ)) * K := by + have hp_ne_zero : p ≠ 0 := by + exact Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hp) + have hsum_int : + Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := + MeasureTheory.integrable_finsetSum s hX_int + have hsup_aemeas : + AEMeasurable (fun ω => s.sup' hs (fun i => |X i ω|)) μ := by + have h : + AEMeasurable (s.sup' hs (fun i (ω : Ω) => |X i ω|)) μ := by + refine Finset.sup'_induction (s := s) (H := hs) + (f := fun i ω => |X i ω|) + (p := fun f => AEMeasurable f μ) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro i hi + simpa [Real.norm_eq_abs] using (hX_aemeas i hi).norm + convert h using 1 + ext ω + exact (Finset.sup'_apply (C := fun _ : Ω => ℝ) hs + (fun i (ω : Ω) => |X i ω|) ω).symm + have hsup_pow_int : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := by + refine Integrable.mono' hsum_int (hsup_aemeas.pow_const p).aestronglyMeasurable ?_ + filter_upwards with ω + have hs_nonempty : s.Nonempty := hs + obtain ⟨i0, hi0⟩ := hs_nonempty + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := + (abs_nonneg (X i0 ω)).trans (Finset.le_sup' (f := fun i => |X i ω|) hi0) + have hsup_le_sum : + s.sup' hs (fun i => |X i ω|) ^ p ≤ ∑ i ∈ s, |X i ω| ^ p := by + obtain ⟨i, hi, hsup_le⟩ : + ∃ i ∈ s, s.sup' hs (fun i => |X i ω|) ≤ |X i ω| := by + simpa only [Finset.le_sup'_iff] using + (show s.sup' hs (fun i => |X i ω|) ≤ + s.sup' hs (fun i => |X i ω|) from le_rfl) + have hi_le_sup : |X i ω| ≤ s.sup' hs (fun i => |X i ω|) := + Finset.le_sup' (f := fun j => |X j ω|) hi + have hsup_eq : s.sup' hs (fun i => |X i ω|) = |X i ω| := + le_antisymm hsup_le hi_le_sup + rw [hsup_eq] + exact Finset.single_le_sum + (f := fun j => |X j ω| ^ p) (fun j _ => by positivity) hi + have hleft_nonneg : 0 ≤ (s.sup' hs (fun i => |X i ω|)) ^ p := + pow_nonneg hsup_nonneg p + have habs_eq : |s.sup' hs (fun i => |X i ω|)| = s.sup' hs (fun i => |X i ω|) := + abs_of_nonneg hsup_nonneg + simpa [Real.norm_eq_abs, habs_eq, abs_of_nonneg hleft_nonneg] using hsup_le_sum + have hsup_integral_le : + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ ≤ + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + calc + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + ≤ ∫ ω, ∑ i ∈ s, |X i ω| ^ p ∂μ := by + refine integral_mono hsup_pow_int hsum_int ?_ + intro ω + have hs_nonempty : s.Nonempty := hs + obtain ⟨i0, hi0⟩ := hs_nonempty + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := + (abs_nonneg (X i0 ω)).trans + (Finset.le_sup' (f := fun i => |X i ω|) hi0) + obtain ⟨i, hi, hsup_le⟩ : + ∃ i ∈ s, s.sup' hs (fun i => |X i ω|) ≤ |X i ω| := by + simpa only [Finset.le_sup'_iff] using + (show s.sup' hs (fun i => |X i ω|) ≤ + s.sup' hs (fun i => |X i ω|) from le_rfl) + have hi_le_sup : |X i ω| ≤ s.sup' hs (fun i => |X i ω|) := + Finset.le_sup' (f := fun j => |X j ω|) hi + have hsup_eq : s.sup' hs (fun i => |X i ω|) = |X i ω| := + le_antisymm hsup_le hi_le_sup + change (s.sup' hs (fun i => |X i ω|)) ^ p ≤ + ∑ i ∈ s, |X i ω| ^ p + rw [hsup_eq] + exact Finset.single_le_sum + (f := fun j => |X j ω| ^ p) (fun j _ => by positivity) hi + _ = ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + simpa using integral_finsetSum (μ := μ) s hX_int + have hsum_le : + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ ≤ (s.card : ℝ) * K ^ p := by + calc + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ + ≤ ∑ i ∈ s, K ^ p := by + refine Finset.sum_le_sum ?_ + intro i hi + have hroot := hX_root i hi + have hroot_nonneg : + 0 ≤ (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + positivity + have hpow : + ((∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ))) ^ p ≤ K ^ p := + pow_le_pow_left₀ hroot_nonneg hroot p + have hint_nonneg : 0 ≤ ∫ ω, |X i ω| ^ p ∂μ := by + positivity + have hint_eq : + ((∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ))) ^ p = + ∫ ω, |X i ω| ^ p ∂μ := by + rw [← Real.rpow_natCast, ← Real.rpow_mul hint_nonneg, one_div, + inv_mul_cancel₀ (show (p : ℝ) ≠ 0 by exact_mod_cast hp_ne_zero), + Real.rpow_one] + exact hint_eq ▸ hpow + _ = (s.card : ℝ) * K ^ p := by + simp [Finset.sum_const, nsmul_eq_mul, mul_comm] + have hsup_integral_nonneg : + 0 ≤ ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + refine integral_nonneg ?_ + intro ω + have hs_nonempty : s.Nonempty := hs + obtain ⟨i0, hi0⟩ := hs_nonempty + exact pow_nonneg + ((abs_nonneg (X i0 ω)).trans (Finset.le_sup' (f := fun i => |X i ω|) hi0)) + p + have hroot : + (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + ((s.card : ℝ) * K ^ p) ^ (1 / (p : ℝ)) := by + exact Real.rpow_le_rpow hsup_integral_nonneg + (hsup_integral_le.trans hsum_le) (by positivity) + have htarget : + ((s.card : ℝ) * K ^ p) ^ (1 / (p : ℝ)) = + (s.card : ℝ) ^ (1 / (p : ℝ)) * K := by + rw [one_div, Real.mul_rpow (by positivity) (pow_nonneg hK_nonneg p), + Real.pow_rpow_inv_natCast hK_nonneg hp_ne_zero] + exact hroot.trans_eq htarget + +/-- Finite-parent maximum of restriction-centered descendant averages, using +the restriction-unit-range partition-average moment theorem on each parent cube. + +This is the Ch4 probabilistic block behind the one-scale fluctuation estimate +in the Section 5.2 multiscale ellipticity moment lemma: the finite maximum over +parents costs only `parents.card ^ (1 / p)` after the per-parent Rosenthal +bound has been proved. -/ +theorem integral_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {p : ℕ} {K B : ℝ} + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, + AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) (hB_nonneg : 0 ≤ B) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) + (hB : + ∀ Q ∈ parents, + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) ≤ B) : + (∫ a, + (parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + (parents.card : ℝ) ^ (1 / (p : ℝ)) * B := by + have hp_one : 1 ≤ p := by omega + refine + integral_finsetSup_abs_pow_rpow_inv_le_card_rpow_mul + (μ := P) (s := parents) hparents (p := p) (K := B) + hp_one hB_nonneg + (fun Q a => restrictionCenteredDescendantAverageOnCube P Q n X a) ?_ ?_ ?_ + · intro Q hQ + unfold restrictionCenteredDescendantAverageOnCube + have hsum : + AEMeasurable + (fun a => + ∑ R ∈ descendantsAtScale Q n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P)) P := by + have hsum' : AEMeasurable + (∑ R ∈ descendantsAtScale Q n, + fun a => X (cubeSet R) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P) P := + Finset.aemeasurable_sum _ fun R hR => + (hX_desc_aemeas Q hQ R hR).sub aemeasurable_const + convert hsum' using 1 + ext a + simp + exact aemeasurable_const.mul + hsum + · intro Q hQ + exact + integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary + (d := d) (Q := Q) (n := n) (P := P) (p := p) + hn (hparent_scale Q hQ) hPstat X hX_cov hX0_aemeas + (hX_desc_aemeas Q hQ) hp_one hX0Lp_int + · intro Q hQ + exact + (integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw + (d := d) (Q := Q) (n := n) (P := P) (p := p) (K := K) + hn (hparent_scale Q hQ) hPstat hPdep X + (hX_local Q hQ) hX_cov hX0_aemeas (hX_desc_aemeas Q hQ) + hp hK_nonneg hX0Lp_int hX0Lp).trans (hB Q hQ) + +/-- Completed-local finite-parent version of +`integral_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw`. + +The caller supplies raw translation-covariant observables and Ch4 supplies +local representatives on each descendant cube. This is the form used by +law-facing coarse-block fluctuation estimates, where the raw totalized +observable is a.e.-equal to a local-test representative but is not itself +definitionally local. -/ +theorem integral_finsetSup_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + {d : ℕ} {n : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {parents : Finset (TriadicCube d)} (hparents : parents.Nonempty) + {p : ℕ} {K B : ℝ} + (hP : RestrictionLawCarrier P) + (hn : 0 ≤ n) + (hparent_scale : ∀ Q ∈ parents, n ≤ Q.scale) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_localRep : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ Q ∈ parents, ∀ R ∈ descendantsAtScale Q n, + AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) (hB_nonneg : 0 ≤ B) + (hX0Lp_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) + (hB : + ∀ Q ∈ parents, + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale Q n).card : ℝ) ^ (1 / (p : ℝ)) * K + + rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale Q n).card : ℝ) * K) ≤ B) : + (∫ a, + (parents.sup' hparents + (fun Q => |restrictionCenteredDescendantAverageOnCube P Q n X a|)) ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + (parents.card : ℝ) ^ (1 / (p : ℝ)) * B := by + have hp_one : 1 ≤ p := by omega + refine + integral_finsetSup_abs_pow_rpow_inv_le_card_rpow_mul + (μ := P) (s := parents) hparents (p := p) (K := B) + hp_one hB_nonneg + (fun Q a => restrictionCenteredDescendantAverageOnCube P Q n X a) ?_ ?_ ?_ + · intro Q hQ + unfold restrictionCenteredDescendantAverageOnCube + have hsum : + AEMeasurable + (fun a => + ∑ R ∈ descendantsAtScale Q n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P)) P := by + have hsum' : AEMeasurable + (∑ R ∈ descendantsAtScale Q n, + fun a => X (cubeSet R) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P) P := + Finset.aemeasurable_sum _ fun R hR => + (hX_desc_aemeas Q hQ R hR).sub aemeasurable_const + convert hsum' using 1 + ext a + simp + exact aemeasurable_const.mul hsum + · intro Q hQ + exact + integrable_abs_pow_restrictionCenteredDescendantAverageOnCube_of_stationary + (d := d) (Q := Q) (n := n) (P := P) (p := p) + hn (hparent_scale Q hQ) hPstat X hX_cov hX0_aemeas + (hX_desc_aemeas Q hQ) hp_one hX0Lp_int + · intro Q hQ + exact + (integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (Q := Q) (n := n) (P := P) (p := p) (K := K) + hP hn (hparent_scale Q hQ) hPstat hPdep X + (hX_localRep Q hQ) hX_cov hX0_aemeas (hX_desc_aemeas Q hQ) + hp hK_nonneg hX0Lp_int hX0Lp).trans (hB Q hQ) + +/-- Low-moment finite partition-average fluctuation estimate with explicit +Rosenthal constants. -/ +theorem integral_abs_restrictionCenteredDescendantAverage_le_of_restrictionUnitRangeDependentLaw + {d : ℕ} {n m : ℤ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : RestrictionStationaryLaw P) (hPdep : RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_local : + ∀ R ∈ descendantsAtScale (originCube d m) n, + IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) (X (cubeSet R))) + (hX_cov : IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (X (cubeSet R)) P) + (hξ : 2 ≤ ξ) (hK_nonneg : 0 ≤ K) + (hX0ξ_int : + Integrable (fun a => |restrictionCenteredOriginObservable P n X a| ^ ξ) P) + (hX0ξ : + (∫ a, |restrictionCenteredOriginObservable P n X a| ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ K) : + ∫ a, |restrictionCenteredDescendantAverage P n m X a| ∂P ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K + + rosenthalDescendantsAtScaleSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + let X0 : RegCoeffField d → ℝ := restrictionCenteredOriginObservable P n X + have hX0c_aemeas : AEMeasurable X0 P := by + simpa [X0, restrictionCenteredOriginObservable] using! hX0_aemeas.sub measurable_const.aemeasurable + have hX0_two_int : + Integrable (fun a => |X0 a| ^ (2 : ℕ)) P := by + have hξ_ne_zero : ξ ≠ 0 := by omega + have h_memLp_ξ : MemLp X0 (ξ : ENNReal) P := by + rw [← integrable_norm_rpow_iff + hX0c_aemeas.aestronglyMeasurable (by exact_mod_cast hξ_ne_zero) (by simp)] + simpa [X0, Real.norm_eq_abs] using hX0ξ_int + have h_memLp_two : MemLp X0 (2 : ENNReal) P := by + exact h_memLp_ξ.mono_exponent (by exact_mod_cast hξ) + simpa [X0, Real.norm_eq_abs] using h_memLp_two.integrable_norm_pow (by norm_num) + have hX0_two : + (∫ a, |X0 a| ^ (2 : ℕ) ∂P) ^ (1 / (2 : ℝ)) ≤ K := by + exact + (integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv_aemeasurable + (μ := P) (f := X0) hξ hX0c_aemeas (by simpa [X0] using hX0ξ_int)).trans + (by simpa [X0] using hX0ξ) + have havg_two := + integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw + (d := d) (n := n) (m := m) (P := P) (p := 2) (K := K) + hn hnm hPstat hPdep X hX_local hX_cov hX0_aemeas hX_desc_aemeas + (by norm_num) hK_nonneg (by simpa [X0] using hX0_two_int) + (by simpa [X0] using hX0_two) + have hAavg_aemeas : AEMeasurable (restrictionCenteredDescendantAverage P n m X) P := by + unfold restrictionCenteredDescendantAverage + have hsum : + AEMeasurable + (fun a => + ∑ R ∈ descendantsAtScale (originCube d m) n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P)) P := by + have hsum' : AEMeasurable + (∑ R ∈ descendantsAtScale (originCube d m) n, + fun a => X (cubeSet R) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P) P := + Finset.aemeasurable_sum _ (fun R hR => + (hX_desc_aemeas R hR).sub aemeasurable_const) + convert hsum' using 1 + ext a + simp + exact aemeasurable_const.mul + hsum + have hAavg_two_int : + Integrable (fun a => |restrictionCenteredDescendantAverage P n m X a| ^ (2 : ℕ)) P := by + exact + integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary + (d := d) (n := n) (m := m) (P := P) (p := 2) + hn hnm hPstat X hX_cov hX0_aemeas hX_desc_aemeas + (by norm_num) (by simpa [X0] using hX0_two_int) + have hsqrt_card : + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) = + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ (1 / (2 : ℝ)) := by + rw [Real.sqrt_eq_rpow] + calc + ∫ a, |restrictionCenteredDescendantAverage P n m X a| ∂P + ≤ + (∫ a, |restrictionCenteredDescendantAverage P n m X a| ^ (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ)) := by + exact integral_abs_le_integral_abs_sq_rpow_half_aemeasurable + hAavg_aemeas hAavg_two_int + _ ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (rosenthalDescendantsAtScaleLpConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K + + rosenthalDescendantsAtScaleSqrtConst d n 2 * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + simpa [hsqrt_card, Real.rpow_natCast, one_div] using havg_two + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverages.lean new file mode 100644 index 0000000000..83b26a4300 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAverages.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Concentration + +/-! # Partition Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Public partition-average concentration tools + +This file contains proved, coefficient-free probability tools for the +finite-coloring step in Proposition +`p.local.partition.average.fluctuations.stationary.random.fields`. The +locality and stationarity bridges remain separate; the aggregation of +independent color-class estimates is already a theorem. +-/ + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +variable {Ω κ : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + +private theorem inv_mul_const_sum_sqrt_scale_le + [DecidableEq κ] (colors : Finset κ) {A C K colorCount totalCount : ℝ} + {classCount : κ → ℝ} + (hA : 0 ≤ A) (hC : 0 ≤ C) (hK : 0 ≤ K) (hTotal : 0 < totalCount) + (hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount) : + totalCount⁻¹ * (A * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K) ≤ + A * C * (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K := by + have hCK_nonneg : 0 ≤ C * K := mul_nonneg hC hK + have hsum_eq : + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) = + (C * K) * ∑ c ∈ colors, Real.sqrt (classCount c) := by + calc + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) + = ∑ c ∈ colors, (C * K) * Real.sqrt (classCount c) := by + refine Finset.sum_congr rfl ?_ + intro c hc + ring + _ = (C * K) * ∑ c ∈ colors, Real.sqrt (classCount c) := by + rw [Finset.mul_sum] + have hsum_le : + (∑ c ∈ colors, C * Real.sqrt (classCount c) * K) ≤ + (C * K) * (Real.sqrt colorCount * Real.sqrt totalCount) := by + rw [hsum_eq] + exact mul_le_mul_of_nonneg_left hSqrt hCK_nonneg + calc + totalCount⁻¹ * (A * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K) + = (totalCount⁻¹ * A) * ∑ c ∈ colors, C * Real.sqrt (classCount c) * K := by + ring + _ ≤ (totalCount⁻¹ * A) * + ((C * K) * (Real.sqrt colorCount * Real.sqrt totalCount)) := by + exact mul_le_mul_of_nonneg_left hsum_le + (mul_nonneg (inv_nonneg.mpr hTotal.le) hA) + _ = A * C * (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K := by + rw [div_eq_mul_inv] + ring + +/-- Aggregating `Gamma_sigma` color-class sum estimates and then dividing by +the total cardinality gives the partition-average square-root scale. -/ +theorem isBigO_finsetAverage_colorClassSums_gammaSigma + [DecidableEq κ] [IsFiniteMeasure μ] + (colors : Finset κ) {Y : κ → Ω → ℝ} + {classCount : κ → ℝ} {colorCount totalCount C K σ : ℝ} + (hσ : 0 < σ) (hcolors : colors.Nonempty) + (hClassCount : ∀ c ∈ colors, 0 < classCount c) + (hTotal : 0 < totalCount) + (hC : 0 < C) (hK : 0 < K) + (hY : + ∀ c ∈ colors, + IsBigO μ (gammaSigma σ) (Y c) + (C * Real.sqrt (classCount c) * K)) + (hYmeas : ∀ c ∈ colors, Measurable (Y c)) + (hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount) : + IsBigO μ (gammaSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (gammaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) := by + let a : κ → ℝ := fun c => C * Real.sqrt (classCount c) * K + have ha : ∀ c ∈ colors, 0 < a c := by + intro c hc + exact mul_pos (mul_pos hC (Real.sqrt_pos.2 (hClassCount c hc))) hK + have hsum : + IsBigO μ (gammaSigma σ) (fun ω => ∑ c ∈ colors, Y c ω) + (gammaTriangleConst σ * ∑ c ∈ colors, a c) := by + exact isBigO_finset_sum_of_isBigO_gammaSigma + (μ := μ) (s := colors) (X := Y) (a := a) (σ := σ) + hσ hcolors ha (by simpa [a] using hY) hYmeas + have hscaled : + IsBigO μ (gammaSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (totalCount⁻¹ * (gammaTriangleConst σ * ∑ c ∈ colors, a c)) := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + IndependentSums.IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => ∑ c ∈ colors, Y c ω) + (A := gammaTriangleConst σ * ∑ c ∈ colors, a c) + (c := totalCount⁻¹) (inv_nonneg.mpr hTotal.le) hsum + refine IndependentSums.IsBigO.mono_scale (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (A := totalCount⁻¹ * (gammaTriangleConst σ * ∑ c ∈ colors, a c)) + (B := gammaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) + hscaled ?_ + have hGamma_nonneg : 0 ≤ gammaTriangleConst σ := by + have hGrowth_nonneg : 0 ≤ IndependentSums.gammaGrowthConst σ := + le_trans zero_le_two (IndependentSums.two_le_gammaGrowthConst σ) + dsimp [gammaTriangleConst, IndependentSums.gammaTriangleConst] + exact mul_nonneg (by norm_num) (Real.rpow_nonneg hGrowth_nonneg _) + simpa [a, mul_assoc, mul_left_comm, mul_comm] using + inv_mul_const_sum_sqrt_scale_le (colors := colors) + (A := gammaTriangleConst σ) (C := C) (K := K) + (colorCount := colorCount) (totalCount := totalCount) + (classCount := classCount) hGamma_nonneg hC.le hK.le hTotal hSqrt + +/-- Aggregating `Psi_sigma` color-class sum estimates and then dividing by the +total cardinality gives the partition-average square-root scale. -/ +theorem isBigO_finsetAverage_colorClassSums_psiSigma + [DecidableEq κ] [IsFiniteMeasure μ] + (colors : Finset κ) {Y : κ → Ω → ℝ} + {classCount : κ → ℝ} {colorCount totalCount C K σ : ℝ} + (hσ : 1 ≤ σ) (hcolors : colors.Nonempty) + (hClassCount : ∀ c ∈ colors, 0 < classCount c) + (hTotal : 0 < totalCount) + (hC : 0 < C) (hK : 0 < K) + (hY : + ∀ c ∈ colors, + IsBigO μ (psiSigma σ) (Y c) + (C * Real.sqrt (classCount c) * K)) + (hYmeas : ∀ c ∈ colors, Measurable (Y c)) + (hSqrt : + ∑ c ∈ colors, Real.sqrt (classCount c) ≤ + Real.sqrt colorCount * Real.sqrt totalCount) : + IsBigO μ (psiSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (psiSigmaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) := by + let a : κ → ℝ := fun c => C * Real.sqrt (classCount c) * K + have ha : ∀ c ∈ colors, 0 < a c := by + intro c hc + exact mul_pos (mul_pos hC (Real.sqrt_pos.2 (hClassCount c hc))) hK + have hsum : + IsBigO μ (psiSigma σ) (fun ω => ∑ c ∈ colors, Y c ω) + (psiSigmaTriangleConst σ * ∑ c ∈ colors, a c) := by + exact isBigO_finset_sum_of_isBigO_psiSigma + (μ := μ) (s := colors) (X := Y) (a := a) (σ := σ) + hσ hcolors ha (by simpa [a] using hY) hYmeas + have hscaled : + IsBigO μ (psiSigma σ) + (fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (totalCount⁻¹ * (psiSigmaTriangleConst σ * ∑ c ∈ colors, a c)) := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + IndependentSums.IsBigO.const_mul (μ := μ) (Ψ := psiSigma σ) + (X := fun ω => ∑ c ∈ colors, Y c ω) + (A := psiSigmaTriangleConst σ * ∑ c ∈ colors, a c) + (c := totalCount⁻¹) (inv_nonneg.mpr hTotal.le) hsum + refine IndependentSums.IsBigO.mono_scale (μ := μ) (Ψ := psiSigma σ) + (X := fun ω => totalCount⁻¹ * ∑ c ∈ colors, Y c ω) + (A := totalCount⁻¹ * (psiSigmaTriangleConst σ * ∑ c ∈ colors, a c)) + (B := psiSigmaTriangleConst σ * C * + (Real.sqrt colorCount * (Real.sqrt totalCount / totalCount)) * K) + hscaled ?_ + have hPsi_nonneg : 0 ≤ psiSigmaTriangleConst σ := by + have hGrowth_nonneg : 0 ≤ IndependentSums.psiGrowthConst σ := + le_trans zero_le_two (IndependentSums.two_le_psiGrowthConst σ) + dsimp [psiSigmaTriangleConst, IndependentSums.psiSigmaTriangleConst] + exact mul_nonneg (by norm_num) (Real.rpow_nonneg hGrowth_nonneg _) + simpa [a, mul_assoc, mul_left_comm, mul_comm] using + inv_mul_const_sum_sqrt_scale_le (colors := colors) + (A := psiSigmaTriangleConst σ) (C := C) (K := K) + (colorCount := colorCount) (totalCount := totalCount) + (classCount := classCount) hPsi_nonneg hC.le hK.le hTotal hSqrt + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAveragesDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAveragesDefinitions.lean new file mode 100644 index 0000000000..d2de1c21ef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/PartitionAveragesDefinitions.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.PartitionAverageConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable + +/-! # Partition Averages Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +open scoped BigOperators +open MeasureTheory + +/-! +# Restriction-Carrier Partition-Average Fluctuation Definitions + +Definitions and equality lemmas for the restriction-carrier engineering +partition-average fluctuation endpoints. Source-manuscript counterparts live +in the source-specific API. +-/ + +noncomputable section + +/-- The origin observable centered by its expectation. -/ +noncomputable def restrictionCenteredOriginObservable {d : ℕ} (P : RestrictionCoeffLaw d) + (n : ℤ) (X : Set (Vec d) → RegCoeffField d → ℝ) : RegCoeffField d → ℝ := + fun a => X (cubeSet (originCube d n)) a - + ∫ b, X (cubeSet (originCube d n)) b ∂P + +/-- The uncentered descendant partition average over the scale-`n` descendants +of the origin cube at scale `m`. -/ +noncomputable def restrictionDescendantAverage {d : ℕ} + (n m : ℤ) (X : Set (Vec d) → RegCoeffField d → ℝ) : RegCoeffField d → ℝ := + fun a => + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, X (cubeSet R) a + +/-- The centered descendant partition average over the scale-`n` descendants of +the origin cube at scale `m`. -/ +noncomputable def restrictionCenteredDescendantAverage {d : ℕ} (P : RestrictionCoeffLaw d) + (n m : ℤ) (X : Set (Vec d) → RegCoeffField d → ℝ) : RegCoeffField d → ℝ := + fun a => + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale (originCube d m) n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P) + +/-- The uncentered descendant partition average over the scale-`n` descendants +of an arbitrary parent cube. -/ +noncomputable def restrictionDescendantAverageOnCube {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (X : Set (Vec d) → RegCoeffField d → ℝ) : + RegCoeffField d → ℝ := + fun a => + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q n, X (cubeSet R) a + +/-- The centered descendant partition average over the scale-`n` descendants +of an arbitrary parent cube, centered by the origin scale-`n` expectation. -/ +noncomputable def restrictionCenteredDescendantAverageOnCube {d : ℕ} (P : RestrictionCoeffLaw d) + (Q : TriadicCube d) (n : ℤ) (X : Set (Vec d) → RegCoeffField d → ℝ) : + RegCoeffField d → ℝ := + fun a => + ((descendantsAtScale Q n).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtScale Q n, + (X (cubeSet R) a - ∫ b, X (cubeSet (originCube d n)) b ∂P) + +/-- A.e.-equal observables have the same centered origin observable. -/ +theorem restrictionCenteredOriginObservable_ae_eq_of_ae_eq {d : ℕ} {P : RestrictionCoeffLaw d} + {n : ℤ} {X Y : Set (Vec d) → RegCoeffField d → ℝ} + (hXY : + X (cubeSet (originCube d n)) =ᵐ[P] Y (cubeSet (originCube d n))) : + restrictionCenteredOriginObservable P n X =ᵐ[P] restrictionCenteredOriginObservable P n Y := by + have hμ : + ∫ b, X (cubeSet (originCube d n)) b ∂P = + ∫ b, Y (cubeSet (originCube d n)) b ∂P := + integral_congr_ae hXY + filter_upwards [hXY] with a ha + simp [restrictionCenteredOriginObservable, ha, hμ] + +/-- A.e.-equal descendant observables have the same uncentered descendant +average on a fixed parent cube. -/ +theorem restrictionDescendantAverageOnCube_ae_eq_of_ae_eq {d : ℕ} {P : RestrictionCoeffLaw d} + {Q : TriadicCube d} {n : ℤ} {X Y : Set (Vec d) → RegCoeffField d → ℝ} + (hXY : + ∀ R, R ∈ descendantsAtScale Q n → + X (cubeSet R) =ᵐ[P] Y (cubeSet R)) : + restrictionDescendantAverageOnCube Q n X =ᵐ[P] restrictionDescendantAverageOnCube Q n Y := by + have hAll : + ∀ᵐ a ∂P, ∀ R, R ∈ descendantsAtScale Q n → + X (cubeSet R) a = Y (cubeSet R) a := + ae_forall_mem_finset (P := P) (descendantsAtScale Q n) hXY + filter_upwards [hAll] with a ha + unfold restrictionDescendantAverageOnCube + congr 1 + exact Finset.sum_congr rfl fun R hR => by + simp [ha R hR] + +/-- A.e.-equal descendant observables, with a.e.-equal origin representatives +for the centering constant, have the same centered descendant average on a +fixed parent cube. -/ +theorem restrictionCenteredDescendantAverageOnCube_ae_eq_of_ae_eq {d : ℕ} {P : RestrictionCoeffLaw d} + {Q : TriadicCube d} {n : ℤ} {X Y : Set (Vec d) → RegCoeffField d → ℝ} + (hOrigin : + X (cubeSet (originCube d n)) =ᵐ[P] Y (cubeSet (originCube d n))) + (hDesc : + ∀ R, R ∈ descendantsAtScale Q n → + X (cubeSet R) =ᵐ[P] Y (cubeSet R)) : + restrictionCenteredDescendantAverageOnCube P Q n X =ᵐ[P] + restrictionCenteredDescendantAverageOnCube P Q n Y := by + have hμ : + ∫ b, X (cubeSet (originCube d n)) b ∂P = + ∫ b, Y (cubeSet (originCube d n)) b ∂P := + integral_congr_ae hOrigin + have hAll : + ∀ᵐ a ∂P, ∀ R, R ∈ descendantsAtScale Q n → + X (cubeSet R) a = Y (cubeSet R) a := + ae_forall_mem_finset (P := P) (descendantsAtScale Q n) hDesc + filter_upwards [hAll] with a ha + unfold restrictionCenteredDescendantAverageOnCube + rw [hμ] + congr 1 + exact Finset.sum_congr rfl fun R hR => by + simp [ha R hR] + +/-- The centered descendant average on an arbitrary parent cube is the +uncentered descendant average minus the origin-cube centering constant. -/ +theorem restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + {d : ℕ} {P : RestrictionCoeffLaw d} {Q : TriadicCube d} {n : ℤ} + (hnQ : n ≤ Q.scale) (X : Set (Vec d) → RegCoeffField d → ℝ) : + restrictionCenteredDescendantAverageOnCube P Q n X = + fun a => + restrictionDescendantAverageOnCube Q n X a - + ∫ b, X (cubeSet (originCube d n)) b ∂P := by + let s := descendantsAtScale Q n + let μ0 : ℝ := ∫ b, X (cubeSet (originCube d n)) b ∂P + have hs_nonempty : s.Nonempty := by + simpa [s] using descendantsAtScale_nonempty Q hnQ + have hs_card_ne_zero : ((s.card : ℝ)) ≠ 0 := by + exact_mod_cast hs_nonempty.card_ne_zero + funext a + rw [restrictionCenteredDescendantAverageOnCube, restrictionDescendantAverageOnCube] + change + ((s.card : ℝ)⁻¹ * ∑ R ∈ s, (X (cubeSet R) a - μ0)) = + ((s.card : ℝ)⁻¹ * ∑ R ∈ s, X (cubeSet R) a) - μ0 + rw [Finset.sum_sub_distrib, Finset.sum_const] + simp [nsmul_eq_mul, μ0] + field_simp [hs_card_ne_zero] + +/-- The response observable `U ↦ J(U,p,q;·)` used in the special partition +average corollary. -/ +noncomputable abbrev restrictionResponseJCubeObservable {d : ℕ} (p q : Vec d) : + Set (Vec d) → RegCoeffField d → ℝ := + fun U a => ResponseJ U p q a.toFun + +/-- The response observable on the origin cube, centered by its expectation. -/ +noncomputable abbrev restrictionCenteredResponseJOriginObservable {d : ℕ} (P : RestrictionCoeffLaw d) + (n : ℤ) (p q : Vec d) : RegCoeffField d → ℝ := + restrictionCenteredOriginObservable P n (restrictionResponseJCubeObservable p q) + +/-- The uncentered partition average of the response functional over scale-`n` +descendants of the origin cube at scale `m`. -/ +noncomputable abbrev restrictionResponseJDescendantAverage {d : ℕ} + (n m : ℤ) (p q : Vec d) : RegCoeffField d → ℝ := + restrictionDescendantAverage n m (restrictionResponseJCubeObservable p q) + +/-- The centered partition average of the response functional over scale-`n` +descendants of the origin cube at scale `m`. -/ +noncomputable abbrev restrictionCenteredResponseJDescendantAverage {d : ℕ} (P : RestrictionCoeffLaw d) + (n m : ℤ) (p q : Vec d) : RegCoeffField d → ℝ := + restrictionCenteredDescendantAverage P n m (restrictionResponseJCubeObservable p q) + +/-- Exact Chapter 4 color-count constant multiplying the genuinely `L^p` +Rosenthal term in the partition-average fluctuation bound. -/ +noncomputable def rosenthalDescendantsAtScaleLpConst + (d : ℕ) (k : ℤ) (p : ℕ) : ℝ := + 2 * (p : ℝ) * ((((scaleColorPeriod k) ^ d : ℕ) : ℝ)) ^ (1 - 1 / (p : ℝ)) + +/-- Exact Chapter 4 color-count constant multiplying the square-function +Rosenthal term in the partition-average fluctuation bound. -/ +noncomputable def rosenthalDescendantsAtScaleSqrtConst + (d : ℕ) (k : ℤ) (p : ℕ) : ℝ := + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt ((((scaleColorPeriod k) ^ d : ℕ) : ℝ))) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/RestrictionIndependence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/RestrictionIndependence.lean new file mode 100644 index 0000000000..c98548c8d9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/RestrictionIndependence.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.RestrictionObservable +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring + +/-! # Restriction Independence -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Restriction-local independence and coloring lemmas + +This module owns the finite-family independence consequences of the explicit +restriction-unit-range assumption. It concerns `RestrictionSigmaR` and +whole-restriction-local random variables only; source-local finite independence +belongs in a separate module. +-/ + +noncomputable section + +open MeasureTheory + +/-- Separation from each member of a finite family implies separation from the +union of that family. -/ +private theorem areUnitSeparated_biUnion_right {d : ℕ} {ι : Type*} {U : Set (Vec d)} + {V : ι → Set (Vec d)} {s : Finset ι} + (h : ∀ i ∈ s, AreUnitSeparated U (V i)) : + AreUnitSeparated U (⋃ i ∈ s, V i) := by + intro x y hx hy + simp only [Set.mem_iUnion] at hy + rcases hy with ⟨i, hi, hyi⟩ + exact h i hi hx hyi + +/-- Events measurable with respect to finitely many carrier restriction +σ-algebras are measurable with respect to the restriction σ-algebra on the +union of the observation sets. -/ +private theorem measurableSet_biInter_restrictionSigmaR_biUnion {d : ℕ} {ι : Type*} + {U : ι → Set (Vec d)} (hU : ∀ i, MeasurableSet (U i)) + {f : ι → Set (RegCoeffField d)} {s : Finset ι} + (hf : ∀ i ∈ s, @MeasurableSet (RegCoeffField d) (RestrictionSigmaR (U i) (hU i)) (f i)) : + @MeasurableSet (RegCoeffField d) + (RestrictionSigmaR (⋃ i ∈ s, U i) (Finset.measurableSet_biUnion s fun i _ => hU i)) + (⋂ i ∈ s, f i) := by + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi ih => + have hUnion : MeasurableSet (⋃ j ∈ insert i s, U j) := + Finset.measurableSet_biUnion _ fun j _ => hU j + have hsubset_i : U i ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hi_meas : + @MeasurableSet (RegCoeffField d) + (RestrictionSigmaR (⋃ j ∈ insert i s, U j) hUnion) (f i) := + (RestrictionSigmaR_mono (hU i) hUnion hsubset_i) (f i) (hf i (by simp)) + have hsubset_s : (⋃ j ∈ s, U j) ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hs_meas : + @MeasurableSet (RegCoeffField d) + (RestrictionSigmaR (⋃ j ∈ insert i s, U j) hUnion) (⋂ j ∈ s, f j) := + (RestrictionSigmaR_mono + (Finset.measurableSet_biUnion s fun j _ => hU j) hUnion hsubset_s) + (⋂ j ∈ s, f j) (ih fun j hj => hf j (by simp [hj])) + simpa [Finset.set_biInter_insert, hi] using hi_meas.inter hs_meas + +/-- Restriction-unit-range dependence gives independence of any pairwise +separated finite family of carrier restriction σ-algebras. -/ +theorem iIndep_restrictionSigmaR_of_restrictionUnitRangeDependentLaw + {d : ℕ} {ι : Type*} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {U : ι → Set (Vec d)} + (hU : ∀ i, MeasurableSet (U i)) + (hP : RestrictionUnitRangeDependentLaw P) + (hsep : Pairwise fun i j => AreUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndep (fun i => RestrictionSigmaR (U i) (hU i)) P := by + classical + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi ih => + have hUnion : MeasurableSet (⋃ j ∈ s, U j) := + Finset.measurableSet_biUnion _ fun j _ => hU j + have hsep_union : AreUnitSeparated (U i) (⋃ j ∈ s, U j) := by + refine areUnitSeparated_biUnion_right (U := U i) (V := U) ?_ + intro j hj + exact hsep (by + intro hij + exact hi (hij ▸ hj)) + have hs_meas : + @MeasurableSet (RegCoeffField d) (RestrictionSigmaR (⋃ j ∈ s, U j) hUnion) + (⋂ j ∈ s, f j) := + measurableSet_biInter_restrictionSigmaR_biUnion (U := U) hU + (f := f) (s := s) fun j hj => hf j (by simp [hj]) + have h_inter : + P (f i ∩ ⋂ j ∈ s, f j) = P (f i) * P (⋂ j ∈ s, f j) := by + exact (ProbabilityTheory.Indep_iff + (RestrictionSigmaR (U i) (hU i)) (RestrictionSigmaR (⋃ j ∈ s, U j) hUnion) P).1 + (hP (U i) (⋃ j ∈ s, U j) (hU i) hUnion hsep_union) + (f i) (⋂ j ∈ s, f j) (hf i (by simp)) hs_meas + calc + P (⋂ j ∈ insert i s, f j) = P (f i ∩ ⋂ j ∈ s, f j) := by + simp + _ = P (f i) * P (⋂ j ∈ s, f j) := h_inter + _ = P (f i) * ∏ j ∈ s, P (f j) := by + rw [ih (fun j hj => hf j (by simp [hj]))] + _ = ∏ j ∈ insert i s, P (f j) := by simp [Finset.prod_insert, hi] + +/-- Restriction-local random variables indexed by pairwise separated observation +sets are independent under restriction-unit-range dependence. -/ +theorem iIndepFun_of_restrictionUnitRangeDependentLaw_of_pairwise_separated + {d : ℕ} {ι : Type*} {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {U : ι → Set (Vec d)} {X : ∀ i, RegCoeffField d → β i} + (hU : ∀ i, MeasurableSet (U i)) + (hP : RestrictionUnitRangeDependentLaw P) + (hX : ∀ i, IsRestrictionLocalRandomVariable (U i) (hU i) (X i)) + (hsep : Pairwise fun i j => AreUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndepFun X P := by + classical + rw [ProbabilityTheory.iIndepFun_iff_iIndep] + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + exact (ProbabilityTheory.iIndep_iff (fun i => RestrictionSigmaR (U i) (hU i)) P).1 + (iIndep_restrictionSigmaR_of_restrictionUnitRangeDependentLaw (P := P) hU hP hsep) s + (fun i hi => (Measurable.comap_le (hX i)) (f i) (hf i hi)) + +/-- A single scale-color class of descendant cube observables is an independent +family under the explicit restriction-unit-range dependence assumption. -/ +theorem iIndepFun_descendantsAtScaleScaleColorClass_of_restrictionUnitRangeDependentLaw + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {β : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} → Type*} + [∀ R, MeasurableSpace (β R)] + {X : ∀ R, RegCoeffField d → β R} + (hP : RestrictionUnitRangeDependentLaw P) + (hX : ∀ R, + IsRestrictionLocalRandomVariable (cubeSet R.1) (measurableSet_cubeSet R.1) (X R)) : + ProbabilityTheory.iIndepFun X P := by + classical + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let U : I → Set (Vec d) := fun R => cubeSet R.1 + have hU : ∀ R : I, MeasurableSet (U R) := fun R => measurableSet_cubeSet R.1 + have hXU : ∀ R : I, IsRestrictionLocalRandomVariable (U R) (hU R) (X R) := by + intro R + simpa [I, U] using hX R + have hsep : Pairwise fun R S : I => AreUnitSeparated (U R) (U S) := by + intro R S hRS x y hx hy + exact one_le_dist_of_ne_of_mem_descendantsAtScaleScaleColorClass + (hR := R.2) (hS := S.2) + (hneq := by + intro h + apply hRS + exact Subtype.ext h) + hx hy + simpa [I, U] using + (iIndepFun_of_restrictionUnitRangeDependentLaw_of_pairwise_separated + (d := d) (ι := I) (β := β) (P := P) (U := U) (X := X) hU hP hXU hsep) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Scalarization.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Scalarization.lean new file mode 100644 index 0000000000..2f7beaa672 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/Scalarization.lean @@ -0,0 +1,550 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge + +/-! # Scalarization -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Scalarization from isotropy + +This file turns the structural symmetries of the law into the primitive +scalarization data used by the scalarized Chapter 4 moment surface. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem swap_mul_mul_swap_apply {d : ℕ} (i j r c : Fin d) (A : Mat d) : + (Matrix.swap ℝ i j * A * Matrix.swap ℝ i j) r c = + A (Equiv.swap i j r) (Equiv.swap i j c) := by + by_cases hr_i : r = i + · subst r + by_cases hc_i : c = i + · subst c + simp + · by_cases hc_j : c = j + · subst c + simp + · simp [Matrix.mul_swap_of_ne hc_i hc_j, Equiv.swap_apply_of_ne_of_ne hc_i hc_j] + · by_cases hr_j : r = j + · subst r + by_cases hc_i : c = i + · subst c + simp + · by_cases hc_j : c = j + · subst c + simp + · simp [Matrix.mul_swap_of_ne hc_i hc_j, Equiv.swap_apply_of_ne_of_ne hc_i hc_j] + · by_cases hc_i : c = i + · subst c + simp [Matrix.swap_mul_of_ne hr_i hr_j, Equiv.swap_apply_of_ne_of_ne hr_i hr_j] + · by_cases hc_j : c = j + · subst c + simp [Matrix.swap_mul_of_ne hr_i hr_j, Equiv.swap_apply_of_ne_of_ne hr_i hr_j] + · simp [Matrix.swap_mul_of_ne hr_i hr_j, Matrix.mul_swap_of_ne hc_i hc_j, + Equiv.swap_apply_of_ne_of_ne hr_i hr_j, Equiv.swap_apply_of_ne_of_ne hc_i hc_j] + +private theorem rotateReg_toFun {d : ℕ} (R : Mat d) (hR : IsSignedPermutationMatrix R) + (a : RegCoeffField d) : + (rotateReg R hR a).toFun = rotateCoeffField R a.toFun := rfl + +private theorem adjointReg_toFun {d : ℕ} (a : RegCoeffField d) : + (adjointReg a).toFun = adjointCoeffField a.toFun := rfl + +private theorem coarseBlockMatrix_lowerRight_signFlip_cubeSet_originCube_of_exists + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i : Fin d) : + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a)).lowerRight = + signFlipMatrix i * + (coarseBlockMatrix (cubeSet (originCube d n)) a).lowerRight * + signFlipMatrix i := by + rw [coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet, + coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet] + exact coarseBlockMatrix_lowerRight_signFlip_openCubeSet_originCube_of_exists + (n := n) (a := a) hex i + +private theorem coarseBlockMatrix_lowerRight_swap_cubeSet_originCube_of_exists + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i j : Fin d) : + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a)).lowerRight = + Matrix.swap ℝ i j * + (coarseBlockMatrix (cubeSet (originCube d n)) a).lowerRight * + Matrix.swap ℝ i j := by + rw [coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet, + coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet] + exact coarseBlockMatrix_lowerRight_swap_openCubeSet_originCube_of_exists + (n := n) (a := a) hex i j + +private theorem coarseBlockMatrix_upperLeft_signFlip_cubeSet_originCube_of_exists + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i : Fin d) : + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a)).upperLeft = + signFlipMatrix i * + (coarseBlockMatrix (cubeSet (originCube d n)) a).upperLeft * + signFlipMatrix i := by + rw [coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet, + coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet] + exact coarseBlockMatrix_upperLeft_signFlip_openCubeSet_originCube_of_exists + (n := n) (a := a) hex i + +private theorem coarseBlockMatrix_upperLeft_swap_cubeSet_originCube_of_exists + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i j : Fin d) : + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a)).upperLeft = + Matrix.swap ℝ i j * + (coarseBlockMatrix (cubeSet (originCube d n)) a).upperLeft * + Matrix.swap ℝ i j := by + rw [coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet, + coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet] + exact coarseBlockMatrix_upperLeft_swap_openCubeSet_originCube_of_exists + (n := n) (a := a) hex i j + +private theorem coarseBlockMatrix_neg_lowerLeft_adjoint_cubeSet_originCube_of_exists + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) : + -((coarseBlockMatrix (cubeSet (originCube d n)) + (adjointCoeffField a)).lowerLeft) = + -(-((coarseBlockMatrix (cubeSet (originCube d n)) a).lowerLeft)) := by + rw [coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet, + coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet] + exact congrArg Neg.neg + (coarseBlockMatrix_lowerLeft_adjointCoeffField_of_exists + (U := openCubeSet (originCube d n)) (a := a) hex) + +/-- **Hoisted invariance core (sign flip).** The block observable is an +opaque function variable `F`; keeping the heavy `coarseBlockMatrix _ a.toFun` +term out of this proof avoids the `isDefEq` blow-up that the concrete +integrand triggers. See the paper (Armstrong–Kuusi–Loher, to appear). -/ +private theorem matrix_signFlip_conj_integral_eq {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} (hIso : RestrictionIsotropicLaw P) (i : Fin d) + (F : RegCoeffField d → Mat d) + (hmeas : ∀ r c : Fin d, AEStronglyMeasurable (fun a => F a r c) P) + (hcov : ∀ᵐ a ∂P, + F (rotateReg (signFlipMatrix i) (isSignedPermutationMatrix_signFlipMatrix i) a) = + signFlipMatrix i * F a * signFlipMatrix i) : + signFlipMatrix i * (Matrix.of fun r c => ∫ a, F a r c ∂P) * signFlipMatrix i = + Matrix.of fun r c => ∫ a, F a r c ∂P := by + ext r c + set s : ℝ := (if r = i then (-1 : ℝ) else 1) * (if c = i then (-1 : ℝ) else 1) with hs + calc + (signFlipMatrix i * (Matrix.of fun r c => ∫ a, F a r c ∂P) * signFlipMatrix i) r c + = s * ∫ a, F a r c ∂P := by + rw [signFlipMatrix_mul_mul_signFlipMatrix_apply, Matrix.of_apply, hs]; ring + _ = ∫ a, s * F a r c ∂P := (MeasureTheory.integral_const_mul s _).symm + _ = ∫ a, F (rotateReg (signFlipMatrix i) + (isSignedPermutationMatrix_signFlipMatrix i) a) r c ∂P := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hcov] with a ha + have hentry : F (rotateReg (signFlipMatrix i) + (isSignedPermutationMatrix_signFlipMatrix i) a) r c = + (signFlipMatrix i * F a * signFlipMatrix i) r c := + congrArg (fun M => M r c) ha + rw [signFlipMatrix_mul_mul_signFlipMatrix_apply] at hentry + rw [hentry, hs]; ring + _ = ∫ a, F a r c ∂P := + hIso.integral_comp_rotateReg (isSignedPermutationMatrix_signFlipMatrix i) + (fun a => F a r c) (hmeas r c) + _ = (Matrix.of fun r c => ∫ a, F a r c ∂P) r c := (Matrix.of_apply (fun r c => ∫ a, F a r c ∂P) r c).symm + +/-- **Hoisted invariance core (swap).** Opaque block observable `F`, as in +`matrix_signFlip_conj_integral_eq`. -/ +private theorem matrix_swap_conj_integral_eq {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} (hIso : RestrictionIsotropicLaw P) (i j : Fin d) + (F : RegCoeffField d → Mat d) + (hmeas : ∀ r c : Fin d, AEStronglyMeasurable (fun a => F a r c) P) + (hcov : ∀ᵐ a ∂P, + F (rotateReg (Matrix.swap ℝ i j) (isSignedPermutationMatrix_swap i j) a) = + Matrix.swap ℝ i j * F a * Matrix.swap ℝ i j) : + Matrix.swap ℝ i j * (Matrix.of fun r c => ∫ a, F a r c ∂P) * Matrix.swap ℝ i j = + Matrix.of fun r c => ∫ a, F a r c ∂P := by + ext r c + calc + (Matrix.swap ℝ i j * (Matrix.of fun r c => ∫ a, F a r c ∂P) * Matrix.swap ℝ i j) r c + = ∫ a, F a (Equiv.swap i j r) (Equiv.swap i j c) ∂P := by + rw [swap_mul_mul_swap_apply, Matrix.of_apply] + _ = ∫ a, F (rotateReg (Matrix.swap ℝ i j) + (isSignedPermutationMatrix_swap i j) a) r c ∂P := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hcov] with a ha + have hentry : F (rotateReg (Matrix.swap ℝ i j) + (isSignedPermutationMatrix_swap i j) a) r c = + (Matrix.swap ℝ i j * F a * Matrix.swap ℝ i j) r c := + congrArg (fun M => M r c) ha + rw [swap_mul_mul_swap_apply] at hentry + rw [hentry] + _ = ∫ a, F a r c ∂P := + hIso.integral_comp_rotateReg (isSignedPermutationMatrix_swap i j) + (fun a => F a r c) (hmeas r c) + _ = (Matrix.of fun r c => ∫ a, F a r c ∂P) r c := (Matrix.of_apply (fun r c => ∫ a, F a r c ∂P) r c).symm + +/-- **Hoisted vanishing core (adjoint).** Opaque block observable `G`. -/ +private theorem matrix_adjoint_neg_integral_eq_zero {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} (hAdj : RestrictionAdjointInvariantLaw P) + (G : RegCoeffField d → Mat d) + (hmeas : ∀ r c : Fin d, AEStronglyMeasurable (fun a => G a r c) P) + (hcov : ∀ᵐ a ∂P, G (adjointReg a) = -G a) : + (Matrix.of fun r c => ∫ a, G a r c ∂P) = 0 := by + ext r c + simp only [Matrix.of_apply, Matrix.zero_apply] + have hcomp : ∫ a, G (adjointReg a) r c ∂P = ∫ a, G a r c ∂P := + hAdj.integral_comp_adjointReg (fun a => G a r c) (hmeas r c) + have hEq : (∫ a, G a r c ∂P) = -(∫ a, G a r c ∂P) := by + calc + (∫ a, G a r c ∂P) = ∫ a, G (adjointReg a) r c ∂P := hcomp.symm + _ = ∫ a, -(G a r c) ∂P := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hcov] with a ha + have hentry : G (adjointReg a) r c = (-G a) r c := congrArg (fun M => M r c) ha + rw [hentry, Matrix.neg_apply] + _ = -(∫ a, G a r c ∂P) := MeasureTheory.integral_neg _ + linarith + +private theorem annealedSigmaStarInvAtScale_isSignFlipInvariant_of_covariant_ae + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hIso : RestrictionIsotropicLaw P) + (hmeas : ∀ r c : Fin d, + AEStronglyMeasurable + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight r c) P) + (hcov : ∀ i : Fin d, ∀ᵐ a ∂P, + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a.toFun)).lowerRight = + signFlipMatrix i * + (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight * + signFlipMatrix i) : + IsSignFlipInvariant (annealedSigmaStarInvAtScale P n) := by + intro i + have hform : annealedSigmaStarInvAtScale P n = + Matrix.of fun r c => + ∫ a, (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight r c ∂P := by + ext r c + simp only [annealedSigmaStarInvAtScale, annealedSigmaStarInv_apply, Matrix.of_apply] + rw [hform] + exact matrix_signFlip_conj_integral_eq hIso i + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight) hmeas (hcov i) + +private theorem annealedSigmaStarInvAtScale_isSwapInvariant_of_covariant_ae + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hIso : RestrictionIsotropicLaw P) + (hmeas : ∀ r c : Fin d, + AEStronglyMeasurable + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight r c) P) + (hcov : ∀ i j : Fin d, ∀ᵐ a ∂P, + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a.toFun)).lowerRight = + Matrix.swap ℝ i j * + (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight * + Matrix.swap ℝ i j) : + IsSwapInvariant (annealedSigmaStarInvAtScale P n) := by + intro i j + have hform : annealedSigmaStarInvAtScale P n = + Matrix.of fun r c => + ∫ a, (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight r c ∂P := by + ext r c + simp only [annealedSigmaStarInvAtScale, annealedSigmaStarInv_apply, Matrix.of_apply] + rw [hform] + exact matrix_swap_conj_integral_eq hIso i j + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerRight) hmeas (hcov i j) + +private theorem annealedBAtScale_isSignFlipInvariant_of_covariant_ae + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hIso : RestrictionIsotropicLaw P) + (hmeas : ∀ r c : Fin d, + AEStronglyMeasurable + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft r c) P) + (hcov : ∀ i : Fin d, ∀ᵐ a ∂P, + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a.toFun)).upperLeft = + signFlipMatrix i * + (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft * + signFlipMatrix i) : + IsSignFlipInvariant (annealedBAtScale P n) := by + intro i + have hform : annealedBAtScale P n = + Matrix.of fun r c => + ∫ a, (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft r c ∂P := by + ext r c + simp only [annealedBAtScale, annealedB_apply, Matrix.of_apply] + rw [hform] + exact matrix_signFlip_conj_integral_eq hIso i + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft) hmeas (hcov i) + +private theorem annealedBAtScale_isSwapInvariant_of_covariant_ae + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hIso : RestrictionIsotropicLaw P) + (hmeas : ∀ r c : Fin d, + AEStronglyMeasurable + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft r c) P) + (hcov : ∀ i j : Fin d, ∀ᵐ a ∂P, + (coarseBlockMatrix (cubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a.toFun)).upperLeft = + Matrix.swap ℝ i j * + (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft * + Matrix.swap ℝ i j) : + IsSwapInvariant (annealedBAtScale P n) := by + intro i j + have hform : annealedBAtScale P n = + Matrix.of fun r c => + ∫ a, (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft r c ∂P := by + ext r c + simp only [annealedBAtScale, annealedB_apply, Matrix.of_apply] + rw [hform] + exact matrix_swap_conj_integral_eq hIso i j + (fun a => (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).upperLeft) hmeas (hcov i j) + +private theorem annealedSigmaStarInvKappaMeanAtScale_eq_zero_of_adjoint_covariant_ae + {d : ℕ} [NeZero d] (P : RestrictionCoeffLaw d) (n : ℤ) + (hAdj : RestrictionAdjointInvariantLaw P) + (hmeas : ∀ r c : Fin d, + AEStronglyMeasurable + (fun a => -((coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerLeft r c)) P) + (hcov : ∀ᵐ a ∂P, + -((coarseBlockMatrix (cubeSet (originCube d n)) + (adjointCoeffField a.toFun)).lowerLeft) = + -(-((coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerLeft))) : + annealedSigmaStarInvKappaMeanAtScale P n = 0 := by + have hform : annealedSigmaStarInvKappaMeanAtScale P n = + Matrix.of fun r c => + ∫ a, (-(((coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerLeft))) r c ∂P := by + ext r c + simp only [annealedSigmaStarInvKappaMeanAtScale, annealedSigmaStarInvKappaMean_apply, + Matrix.of_apply, Matrix.neg_apply] + rw [MeasureTheory.integral_neg] + rw [hform] + exact matrix_adjoint_neg_integral_eq_zero hAdj + (fun a => -((coarseBlockMatrix (cubeSet (originCube d n)) a.toFun).lowerLeft)) hmeas hcov + +/-- +Isotropy and adjoint invariance scalarize the primitive annealed blocks at a +fixed scale. The a.s. deterministic coarse-block existence needed by the +covariance identities is supplied by `RestrictionLawCarrier`. +-/ +theorem Internal.annealedPrimitiveScalarizationData_of_isotropic_adjoint + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hIso : RestrictionIsotropicLaw P) (hAdj : RestrictionAdjointInvariantLaw P) (n : ℤ) : + Internal.AnnealedPrimitiveScalarizationData (d := d) P n := + let hex := hP.ae_exists_coarseBlockMatrix_openCubeSet_originCube n + { + sigmaStarInvFlip := + annealedSigmaStarInvAtScale_isSignFlipInvariant_of_covariant_ae P n hIso + (fun r c => + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + (originCube d n) r c).aestronglyMeasurable) + (fun i => by + filter_upwards [hex] with a ha + exact coarseBlockMatrix_lowerRight_signFlip_cubeSet_originCube_of_exists + (n := n) (a := a.toFun) ha i) + sigmaStarInvSwap := + annealedSigmaStarInvAtScale_isSwapInvariant_of_covariant_ae P n hIso + (fun r c => + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + (originCube d n) r c).aestronglyMeasurable) + (fun i j => by + filter_upwards [hex] with a ha + exact coarseBlockMatrix_lowerRight_swap_cubeSet_originCube_of_exists + (n := n) (a := a.toFun) ha i j) + bFlip := + annealedBAtScale_isSignFlipInvariant_of_covariant_ae P n hIso + (fun r c => + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + (originCube d n) r c).aestronglyMeasurable) + (fun i => by + filter_upwards [hex] with a ha + exact coarseBlockMatrix_upperLeft_signFlip_cubeSet_originCube_of_exists + (n := n) (a := a.toFun) ha i) + bSwap := + annealedBAtScale_isSwapInvariant_of_covariant_ae P n hIso + (fun r c => + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + (originCube d n) r c).aestronglyMeasurable) + (fun i j => by + filter_upwards [hex] with a ha + exact coarseBlockMatrix_upperLeft_swap_cubeSet_originCube_of_exists + (n := n) (a := a.toFun) ha i j) + sigmaStarInvKappaMean_eq_zero := + annealedSigmaStarInvKappaMeanAtScale_eq_zero_of_adjoint_covariant_ae P n hAdj + (fun r c => + ((hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet + (originCube d n) r c).neg).aestronglyMeasurable) + (by + filter_upwards [hex] with a ha + exact coarseBlockMatrix_neg_lowerLeft_adjoint_cubeSet_originCube_of_exists + (n := n) (a := a.toFun) ha) } + +/-- Structural-law version of +`Internal.annealedPrimitiveScalarizationData_of_isotropic_adjoint`. -/ +theorem Internal.annealedPrimitiveScalarizationData_of_structuralLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + Internal.AnnealedPrimitiveScalarizationData (d := d) P n := + Internal.annealedPrimitiveScalarizationData_of_isotropic_adjoint hP + hStruct.isotropic hStruct.adjoint_invariant n + +/-- Isotropy and adjoint invariance give scalarization at a fixed scale. -/ +theorem Internal.hasAnnealedScalarizationAtScale_of_isotropic_adjoint + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hIso : RestrictionIsotropicLaw P) (hAdj : RestrictionAdjointInvariantLaw P) (n : ℤ) : + Internal.HasAnnealedScalarizationAtScale P n := + Internal.AnnealedScalarizationPrimitiveData.hasAnnealedScalarizationAtScale + (Internal.annealedPrimitiveScalarizationData_of_isotropic_adjoint hP hIso hAdj n) + +/-- Structural-law version of scalarization at a fixed scale. -/ +theorem Internal.hasAnnealedScalarizationAtScale_of_structuralLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + Internal.HasAnnealedScalarizationAtScale P n := + Internal.AnnealedScalarizationPrimitiveData.hasAnnealedScalarizationAtScale + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) + +/-- Isotropy and adjoint invariance give scalarization at every scale. -/ +theorem Internal.annealedScalarizationTheory_of_isotropic_adjoint + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hIso : RestrictionIsotropicLaw P) (hAdj : RestrictionAdjointInvariantLaw P) : + Internal.AnnealedScalarizationTheory P where + scalarized n := + Internal.hasAnnealedScalarizationAtScale_of_isotropic_adjoint hP hIso hAdj n + +/-- Structural-law version of scalarization at every scale. -/ +theorem Internal.annealedScalarizationTheory_of_structuralLaw + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) : + Internal.AnnealedScalarizationTheory P := + Internal.annealedScalarizationTheory_of_isotropic_adjoint hP + hStruct.isotropic hStruct.adjoint_invariant + +/-- Structural-law scalar `\bar\sigma_n`. -/ +noncomputable def RestrictionLawCarrier.barSigmaAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : ℝ := + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).barSigma n + +/-- Structural-law scalar `\bar\sigma_{*,n}`. -/ +noncomputable def RestrictionLawCarrier.barSigmaStarAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : ℝ := + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).barSigmaStar n + +/-- Structural-law scalar upper-left coefficient `\bar b_n`. -/ +noncomputable def RestrictionLawCarrier.barBAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : ℝ := + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n).barB + +/-- Structural-law scalar inverse-star coefficient `\bar\sigma_{*,n}^{-1}`. -/ +noncomputable def RestrictionLawCarrier.barSigmaStarInvAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : ℝ := + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n).barSigmaStarInv + +/-- Structural-law contrast `\Theta_n = \bar\sigma_n \bar\sigma_{*,n}^{-1}`. -/ +noncomputable def RestrictionLawCarrier.thetaAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : ℝ := + hP.barSigmaAtScale hStruct n * (hP.barSigmaStarAtScale hStruct n)⁻¹ + +/-- The structural-law scalar `\bar\sigma_n` scalarizes the annealed matrix. -/ +theorem RestrictionLawCarrier.annealedSigmaAtScale_eq_barSigmaAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + annealedSigmaAtScale P n = hP.barSigmaAtScale hStruct n • (1 : Mat d) := by + simpa [RestrictionLawCarrier.barSigmaAtScale] using + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).annealedSigma_eq n + +/-- The structural-law scalar `\bar\sigma_{*,n}` scalarizes the annealed +starred matrix. -/ +theorem RestrictionLawCarrier.annealedSigmaStarAtScale_eq_barSigmaStarAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + annealedSigmaStarAtScale P n = + hP.barSigmaStarAtScale hStruct n • (1 : Mat d) := by + simpa [RestrictionLawCarrier.barSigmaStarAtScale] using + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).annealedSigmaStar_eq n + +/-- The structural-law scalar `\bar b_n` scalarizes the annealed upper-left +block. -/ +theorem RestrictionLawCarrier.annealedBAtScale_eq_barBAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + annealedBAtScale P n = hP.barBAtScale hStruct n • (1 : Mat d) := by + simpa [RestrictionLawCarrier.barBAtScale] using + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n).b_eq + +/-- The structural-law scalar `\bar\sigma_{*,n}^{-1}` scalarizes the annealed +inverse-star matrix. -/ +theorem RestrictionLawCarrier.annealedSigmaStarInvAtScale_eq_barSigmaStarInvAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + annealedSigmaStarInvAtScale P n = + hP.barSigmaStarInvAtScale hStruct n • (1 : Mat d) := by + simpa [RestrictionLawCarrier.barSigmaStarInvAtScale] using + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n).sigmaStarInv_eq + +/-- Under the structural law, the scalarized conductivity agrees with the +primitive upper-left scalar. -/ +theorem RestrictionLawCarrier.barSigmaAtScale_eq_barBAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + hP.barSigmaAtScale hStruct n = hP.barBAtScale hStruct n := by + simpa [RestrictionLawCarrier.barSigmaAtScale, RestrictionLawCarrier.barBAtScale] using + Internal.AnnealedPrimitiveScalarizationData.barSigma_eq_barB + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) + +/-- Under the structural law, `\bar\sigma_{*,n}` is the inverse of the primitive +inverse-star scalar. -/ +theorem RestrictionLawCarrier.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + hP.barSigmaStarAtScale hStruct n = + (hP.barSigmaStarInvAtScale hStruct n)⁻¹ := by + simpa [RestrictionLawCarrier.barSigmaStarAtScale, RestrictionLawCarrier.barSigmaStarInvAtScale] using + Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_eq_inv_barSigmaStarInv + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) + +/-- Under the structural law, the annealed coupling matrix vanishes. -/ +theorem RestrictionLawCarrier.annealedKappaAtScale_eq_zero + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + annealedKappaAtScale P n = 0 := by + simpa using + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).annealedKappa_eq_zero n + +/-- Internal compatibility between the structural-law contrast and the +scalarization route contrast. -/ +theorem Internal.thetaAtScale_eq_scalarization_contrast + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hStruct : RestrictionStructuralLaw P) (n : ℤ) : + hP.thetaAtScale hStruct n = + (Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct).contrast n := by + rfl + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ScalarizationDefinitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ScalarizationDefinitions.lean new file mode 100644 index 0000000000..35d797bd73 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/ScalarizationDefinitions.lean @@ -0,0 +1,362 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.ScalarizationWitnesses + +/-! # Scalarization Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Scalarization definitions + +Scalar-matrix helper lemmas and the internal scalarization route used to prove +the public Chapter 4 scalar selectors. +-/ + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +namespace Internal + +/-- Internal route package for scalarization of the annealed coarse-grained +matrices on origin cubes. Public callers should use the direct +`RestrictionLawCarrier.*AtScale` scalar selectors instead. -/ +structure AnnealedScalarizationTheory {d : ℕ} (P : RestrictionCoeffLaw d) : Prop where + scalarized : ∀ n : ℤ, HasAnnealedScalarizationAtScale P n + +namespace AnnealedScalarizationTheory + +/-- The chosen scalarization witness at scale `n`. -/ +noncomputable def witness {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : + AnnealedScalarizationWitness P n := + Classical.choice (h.scalarized n) + +/-- The scalar `\bar\sigma_n`. -/ +noncomputable def barSigma {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : ℝ := + (h.witness n).sigma + +/-- The scalar `\bar\sigma_{*,n}`. -/ +noncomputable def barSigmaStar {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : ℝ := + (h.witness n).sigmaStar + +theorem annealedSigma_eq {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : + annealedSigmaAtScale P n = h.barSigma n • (1 : Mat d) := + (h.witness n).sigma_eq + +theorem annealedSigmaStar_eq {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : + annealedSigmaStarAtScale P n = h.barSigmaStar n • (1 : Mat d) := + (h.witness n).sigmaStar_eq + +theorem annealedKappa_eq_zero {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : + annealedKappaAtScale P n = 0 := + (h.witness n).kappa_eq_zero + +/-- The scalar contrast ratio used downstream. -/ +noncomputable def contrast {d : ℕ} {P : RestrictionCoeffLaw d} + (h : AnnealedScalarizationTheory P) (n : ℤ) : ℝ := + h.barSigma n * (h.barSigmaStar n)⁻¹ + +end AnnealedScalarizationTheory + +end Internal + +/-- A Löwner comparison between scalar matrices is the corresponding scalar +comparison. -/ +theorem scalar_le_of_matLoewnerLE_smul_one + {d : ℕ} [NeZero d] {a b : ℝ} + (h : MatLoewnerLE (a • (1 : Mat d)) (b • (1 : Mat d))) : + a ≤ b := by + have hbasis := h (Pi.single (0 : Fin d) 1) + simpa [smul_matVecMul, matVecMul_single, vecDot_single_left] using hbasis + +/-- Scalar comparisons lift to Löwner comparisons between scalar identity +matrices. -/ +theorem matLoewnerLE_smul_one_of_scalar_le + {d : ℕ} {a b : ℝ} (h : a ≤ b) : + MatLoewnerLE (a • (1 : Mat d)) (b • (1 : Mat d)) := by + intro x + have hnorm_nonneg : 0 ≤ vecNormSq x := vecNormSq_nonneg x + have hmul : + (1 / 2 : ℝ) * (a * vecNormSq x) ≤ + (1 / 2 : ℝ) * (b * vecNormSq x) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right h hnorm_nonneg) (by norm_num) + have hOne : matVecMul (1 : Mat d) x = x := by + change (1 : Matrix (Fin d) (Fin d) ℝ).mulVec x = x + exact Matrix.one_mulVec x + simpa [smul_matVecMul, vecDot_smul_right, vecNormSq, hOne] using hmul + +/-- Scalar coefficients of scalar identity matrices are unique. -/ +theorem scalar_eq_of_smul_one_eq_smul_one + {d : ℕ} [NeZero d] {a b : ℝ} + (h : a • (1 : Mat d) = b • (1 : Mat d)) : + a = b := by + have hentry := congrArg (fun M : Mat d => M 0 0) h + simpa using hentry + +/-- A strictly positive a.e. integrable real function has strictly positive +expectation under a probability measure. -/ +theorem integral_pos_of_integrable_pos_ae + {α : Type*} [MeasurableSpace α] {μ : Measure α} + [IsProbabilityMeasure μ] {f : α → ℝ} + (hfint : Integrable f μ) (hfpos : ∀ᵐ x ∂μ, 0 < f x) : + 0 < ∫ x, f x ∂μ := by + have hnonneg : 0 ≤ᵐ[μ] f := by + filter_upwards [hfpos] with x hx + exact le_of_lt hx + rw [integral_pos_iff_support_of_nonneg_ae hnonneg hfint] + rw [pos_iff_ne_zero] + intro hsupp_zero + have hsupp_ae : Function.support f ∈ ae μ := by + filter_upwards [hfpos] with x hx + exact hx.ne' + have hcompl_zero : μ (Function.support f)ᶜ = 0 := + mem_ae_iff.mp hsupp_ae + have huniv_le : + μ Set.univ ≤ μ (Function.support f) + μ (Function.support f)ᶜ := + measure_univ_le_add_compl (μ := μ) (Function.support f) + have huniv_le_zero : μ Set.univ ≤ 0 := by + simp [hsupp_zero, hcompl_zero] at huniv_le + have huniv_pos : 0 < μ Set.univ := by + simp + exact (not_lt_of_ge huniv_le_zero) huniv_pos + +theorem matrix_posDef_diag_pos {d : ℕ} {A : Mat d} (hA : A.PosDef) (i : Fin d) : + 0 < A i i := by + simpa using (hA.diag_pos (i := i)) + +/-- If the integral of an a.e. positive-definite matrix field is a scalar +multiple of the identity, then the scalar coefficient is positive. -/ +theorem scalar_coefficient_pos_of_smul_one_eq_integral_posDef + {α : Type*} [MeasurableSpace α] {μ : Measure α} + [IsProbabilityMeasure μ] + {d : ℕ} [NeZero d] {F : α → Mat d} {c : ℝ} + (hFint : Integrable F μ) + (hPos : ∀ᵐ x ∂μ, (F x).PosDef) + (hScalar : (∫ x, F x ∂μ) = c • (1 : Mat d)) : + 0 < c := by + let i : Fin d := 0 + have hEntryInt : Integrable (fun x => F x i i) μ := + Integrable.eval (Integrable.eval hFint i) i + have hEntryPos : ∀ᵐ x ∂μ, 0 < F x i i := by + filter_upwards [hPos] with x hx + exact matrix_posDef_diag_pos hx i + have hIntegralPos : 0 < ∫ x, F x i i ∂μ := + integral_pos_of_integrable_pos_ae hEntryInt hEntryPos + have hCoeff : (∫ x, F x i i ∂μ) = c := by + calc + (∫ x, F x i i ∂μ) = (∫ x, F x ∂μ) i i := by + exact (integral_matrix_apply (μ := μ) (f := F) hFint i i).symm + _ = (c • (1 : Mat d)) i i := by + rw [hScalar] + _ = c := by + simp [i] + simpa [hCoeff] using hIntegralPos + +namespace Internal + +/-- Internal primitive scalarization data for the inverse-star and upper-left +annealed blocks. Public callers should use direct structural-law endpoints. -/ +abbrev AnnealedPrimitiveScalarizationData {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) := + AnnealedScalarizationPrimitiveData P n + +namespace AnnealedPrimitiveScalarizationData + +/-- The scalar coefficient of the annealed inverse-star block. -/ +noncomputable def barSigmaStarInv {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + Classical.choose + (annealedSigmaStarInvAtScale_isScalarMatrix_of_invariant P n + h.sigmaStarInvFlip h.sigmaStarInvSwap) + +/-- The scalar coefficient of the annealed upper-left block. -/ +noncomputable def barB {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + Classical.choose + (annealedBAtScale_isScalarMatrix_of_invariant P n h.bFlip h.bSwap) + +/-- The primitive scalar contrast used by downstream estimates. -/ +noncomputable def contrast {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + h.barB * h.barSigmaStarInv + +theorem sigmaStarInv_eq {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : + annealedSigmaStarInvAtScale P n = h.barSigmaStarInv • (1 : Mat d) := + Classical.choose_spec + (annealedSigmaStarInvAtScale_isScalarMatrix_of_invariant P n + h.sigmaStarInvFlip h.sigmaStarInvSwap) + +theorem b_eq {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : + annealedBAtScale P n = h.barB • (1 : Mat d) := + Classical.choose_spec + (annealedBAtScale_isScalarMatrix_of_invariant P n h.bFlip h.bSwap) + +theorem sigma_eq {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : + annealedSigmaAtScale P n = h.barB • (1 : Mat d) := by + rw [annealedSigmaAtScale_eq_annealedBAtScale_of_sigmaStarInvKappaMean_eq_zero + P n h.sigmaStarInvKappaMean_eq_zero] + exact h.b_eq + +theorem kappa_eq_zero {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : + annealedKappaAtScale P n = 0 := + annealedKappaAtScale_eq_zero_of_sigmaStarInvKappaMean_eq_zero + P n h.sigmaStarInvKappaMean_eq_zero + +theorem barSigma_eq_barB {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hPrim : AnnealedPrimitiveScalarizationData (d := d) P n) : + hScal.barSigma n = hPrim.barB := + scalar_eq_of_smul_one_eq_smul_one <| by + calc + hScal.barSigma n • (1 : Mat d) = annealedSigmaAtScale P n := + (hScal.annealedSigma_eq n).symm + _ = hPrim.barB • (1 : Mat d) := hPrim.sigma_eq + +theorem barSigmaStar_eq_inv_barSigmaStarInv {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} {n : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hPrim : AnnealedPrimitiveScalarizationData (d := d) P n) : + hScal.barSigmaStar n = hPrim.barSigmaStarInv⁻¹ := + scalar_eq_of_smul_one_eq_smul_one <| by + have hInv : + (hPrim.barSigmaStarInv • (1 : Mat d))⁻¹ = + hPrim.barSigmaStarInv⁻¹ • (1 : Mat d) := by + by_cases hs : hPrim.barSigmaStarInv = 0 + · simp [hs] + · rw [nonsing_inv_smul hPrim.barSigmaStarInv hs (by simp)] + simp + calc + hScal.barSigmaStar n • (1 : Mat d) = annealedSigmaStarAtScale P n := + (hScal.annealedSigmaStar_eq n).symm + _ = (annealedSigmaStarInvAtScale P n)⁻¹ := rfl + _ = (hPrim.barSigmaStarInv • (1 : Mat d))⁻¹ := by + rw [hPrim.sigmaStarInv_eq] + _ = hPrim.barSigmaStarInv⁻¹ • (1 : Mat d) := hInv + +theorem scalar_contrast_eq {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hPrim : AnnealedPrimitiveScalarizationData (d := d) P n) : + hScal.contrast n = hPrim.contrast := by + simp [AnnealedScalarizationTheory.contrast, contrast, + barSigma_eq_barB hScal hPrim, + barSigmaStar_eq_inv_barSigmaStarInv hScal hPrim] + +theorem barSigmaStarInv_le_of_matLoewnerLE + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {m n : ℤ} + (hm : AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : AnnealedPrimitiveScalarizationData (d := d) P n) + (hLE : MatLoewnerLE (annealedSigmaStarInvAtScale P m) + (annealedSigmaStarInvAtScale P n)) : + hm.barSigmaStarInv ≤ hn.barSigmaStarInv := by + rw [hm.sigmaStarInv_eq, hn.sigmaStarInv_eq] at hLE + exact scalar_le_of_matLoewnerLE_smul_one hLE + +theorem barB_le_of_matLoewnerLE + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {m n : ℤ} + (hm : AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : AnnealedPrimitiveScalarizationData (d := d) P n) + (hLE : MatLoewnerLE (annealedBAtScale P m) (annealedBAtScale P n)) : + hm.barB ≤ hn.barB := by + rw [hm.b_eq, hn.b_eq] at hLE + exact scalar_le_of_matLoewnerLE_smul_one hLE + +theorem contrast_le_of_component_le + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {m n : ℤ} + (hm : AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : AnnealedPrimitiveScalarizationData (d := d) P n) + (hB_le : hm.barB ≤ hn.barB) + (hStar_le : hm.barSigmaStarInv ≤ hn.barSigmaStarInv) + (hStar_m_nonneg : 0 ≤ hm.barSigmaStarInv) + (hB_n_nonneg : 0 ≤ hn.barB) : + hm.contrast ≤ hn.contrast := by + dsimp [contrast] + exact mul_le_mul hB_le hStar_le hStar_m_nonneg hB_n_nonneg + +theorem barSigmaStar_le_of_barSigmaStarInv_le + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hm : AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : AnnealedPrimitiveScalarizationData (d := d) P n) + (hStar_le : hm.barSigmaStarInv ≤ hn.barSigmaStarInv) + (hStar_m_pos : 0 < hm.barSigmaStarInv) : + hScal.barSigmaStar n ≤ hScal.barSigmaStar m := by + have hStar_n_pos : 0 < hn.barSigmaStarInv := + lt_of_lt_of_le hStar_m_pos hStar_le + have hInv_le : hn.barSigmaStarInv⁻¹ ≤ hm.barSigmaStarInv⁻¹ := + (inv_le_inv₀ hStar_n_pos hStar_m_pos).2 hStar_le + simpa [barSigmaStar_eq_inv_barSigmaStarInv hScal hm, + barSigmaStar_eq_inv_barSigmaStarInv hScal hn] using hInv_le + +theorem barSigmaStar_le_barSigma_of_one_le_contrast + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hPrim : AnnealedPrimitiveScalarizationData (d := d) P n) + (hContrast : 1 ≤ hPrim.contrast) + (hStar_pos : 0 < hPrim.barSigmaStarInv) : + hScal.barSigmaStar n ≤ hScal.barSigma n := by + have hInv_le : hPrim.barSigmaStarInv⁻¹ ≤ hPrim.barB := by + exact (inv_le_iff_one_le_mul₀' hStar_pos).2 (by + simpa [contrast, mul_comm] using hContrast) + simpa [barSigmaStar_eq_inv_barSigmaStarInv hScal hPrim, + barSigma_eq_barB hScal hPrim] using hInv_le + +theorem barSigma_le_of_barB_le + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n m : ℤ} + (hScal : AnnealedScalarizationTheory (d := d) P) + (hm : AnnealedPrimitiveScalarizationData (d := d) P m) + (hn : AnnealedPrimitiveScalarizationData (d := d) P n) + (hB_le : hm.barB ≤ hn.barB) : + hScal.barSigma m ≤ hScal.barSigma n := by + simpa [barSigma_eq_barB hScal hm, barSigma_eq_barB hScal hn] using hB_le + +end AnnealedPrimitiveScalarizationData + +/-- Internal scalar coefficient of the primitive upper-left block. -/ +noncomputable abbrev barBAtScaleOfPrimitive {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + h.barB + +/-- Internal scalar coefficient of the primitive inverse-star block. -/ +noncomputable abbrev barSigmaStarInvAtScaleOfPrimitive {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + h.barSigmaStarInv + +/-- Internal primitive contrast `Theta_n`. -/ +noncomputable abbrev annealedThetaAtScaleOfPrimitive {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} {n : ℤ} + (h : AnnealedPrimitiveScalarizationData (d := d) P n) : ℝ := + h.contrast + +end Internal + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/StationaryExpectations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/StationaryExpectations.lean new file mode 100644 index 0000000000..a0f524b49c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/StationaryExpectations.lean @@ -0,0 +1,738 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable + +/-! # Stationary Expectations -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Stationary response expectations + +This file is the public Chapter 4 surface for the stationarity step used by +the expectation/moment arguments: at nonnegative scales, deterministic child +cubes are integer translates of the origin cube at the same scale, so +stationarity identifies their annealed response expectations. + +The statements are phrased directly in terms of the clean response expectation +objects from `Expectations.lean`. +-/ + +noncomputable section + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +/-- Scalar response is translation-covariant as a set-indexed coefficient-field +observable. -/ +theorem responseJCubeSet_translation_covariant {d : ℕ} (p q : Vec d) : + IsTranslationCovariant + (fun U : Set (Vec d) => fun a : CoeffField d => ResponseJ U p q a) := by + intro U z a + simpa [translateByInt] using + ResponseJ_translateSet_eq_translateCoeffField (intVecToRealVec z) U p q a + +/-- Coarse block matrix entries are translation-covariant as set-indexed +coefficient-field observables. -/ +theorem coarseBlockMatrix_entry_translation_covariant {d : ℕ} + (α β : BlockCoord d) : + IsTranslationCovariant + (fun U : Set (Vec d) => fun a : CoeffField d => + blockMatEntry (coarseBlockMatrix U a) α β) := by + intro U z a + simpa [translateByInt] using + congrArg (fun A : BlockMat d => blockMatEntry A α β) + (coarseBlockMatrix_translateSet_eq_translateCoeffField + (intVecToRealVec z) U a) + +/-- Scalar block diagonal center used to normalize full-block fluctuations at a +structural-law scale. The lower-right block is the inverse starred scalar. -/ +noncomputable def scalarAnnealedBlockMatrixAtScale {d : ℕ} [NeZero d] + {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) + (m : ℤ) : BlockMat d := + Ch02.blockDiag + (hP.barSigmaAtScale hStruct m • (1 : Mat d)) + ((hP.barSigmaStarAtScale hStruct m)⁻¹ • (1 : Mat d)) + +/-- Diagonal full-block normalization associated with scalar blocks `b,c`. -/ +noncomputable def scalarFullBlockInvSqrtDiag {d : ℕ} (b c : ℝ) : + BlockCoord d → ℝ + | Sum.inl _ => (Real.sqrt b)⁻¹ + | Sum.inr _ => Real.sqrt c + +/-- Manuscript normalized full-block fluctuation observable at center scale +`m`, written for an arbitrary deterministic set. The norm is the Euclidean +operator norm of the associated full block matrix. -/ +noncomputable def fullBlockNormalizedFluctuationOperatorNormSq + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) + (m : ℤ) (U : Set (Vec d)) (a : CoeffField d) : ℝ := + let b := hP.barSigmaAtScale hStruct m + let c := hP.barSigmaStarAtScale hStruct m + let D : FullBlockMat d := Matrix.diagonal (scalarFullBlockInvSqrtDiag b c) + let A := coarseBlockMatrix U a + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct m + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (D * (toFullBlockMat A - toFullBlockMat Abar) * D)‖ ^ 2 + +/-- Manuscript normalized full-block fluctuation observable on a triadic cube. +The norm is the Euclidean operator norm, not the Frobenius norm. -/ +noncomputable def fullBlockNormalizedFluctuationOperatorNormSqAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : ℝ := + fullBlockNormalizedFluctuationOperatorNormSq hP hStruct m (cubeSet R) a.toFun + +/-- The normalized full-block fluctuation observable is translation-covariant +in its deterministic set argument. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSq_translation_covariant + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) (m : ℤ) : + IsTranslationCovariant + (fun U : Set (Vec d) => fun a : CoeffField d => + fullBlockNormalizedFluctuationOperatorNormSq hP hStruct m U a) := by + intro U z a + simp [fullBlockNormalizedFluctuationOperatorNormSq, translateByInt, + coarseBlockMatrix_translateSet_eq_translateCoeffField] + +/-- Carrier bridge for integer translation: precomposition on the carrier +projects to the raw integer translation (rfl). -/ +theorem translateReg_toFun {d : ℕ} (z : Fin d → ℤ) (a : RegCoeffField d) : + (translateReg (intVecToRealVec z) a).toFun = translateByInt z a.toFun := rfl + +/-- Translation transfer under a restriction-stationary carrier law for a raw +translation-covariant observable +composed with `toFun` integrates equally on translated sets under a stationary +carrier law. Uses `IsStationaryR.integral_comp_translateReg` and the +`translateReg`/`translateByInt` bridge. -/ +theorem integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw + {d : ℕ} {P : RestrictionCoeffLaw d} {X : Set (Vec d) → CoeffField d → ℝ} + (hstat : RestrictionStationaryLaw P) {U : Set (Vec d)} + (hmeas : AEStronglyMeasurable (fun a : RegCoeffField d => X U a.toFun) P) + (hcov : IsTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a.toFun ∂P = + ∫ a, X U a.toFun ∂P := by + have hbridge : + (fun a : RegCoeffField d => X (translateSet (intVecToRealVec z) U) a.toFun) = + fun a : RegCoeffField d => + (fun a : RegCoeffField d => X U a.toFun) (translateReg (intVecToRealVec z) a) := by + funext a + show X (translateSet (intVecToRealVec z) U) a.toFun = + X U (translateReg (intVecToRealVec z) a).toFun + rw [hcov U z a.toFun, translateReg_toFun] + calc + ∫ a, X (translateSet (intVecToRealVec z) U) a.toFun ∂P + = ∫ a, (fun a : RegCoeffField d => X U a.toFun) + (translateReg (intVecToRealVec z) a) ∂P := by rw [hbridge] + _ = ∫ a, X U a.toFun ∂P := + hstat.integral_comp_translateReg z (fun a => X U a.toFun) hmeas + +/-- Restriction translation covariance: a set-indexed carrier observable commutes +with spatial integer translation via the carrier translation `translateReg`. -/ +def IsRestrictionTranslationCovariant {β : Type*} {d : ℕ} + (X : Set (Vec d) → RegCoeffField d → β) : Prop := + ∀ (U : Set (Vec d)) (z : Fin d → ℤ) (a : RegCoeffField d), + X (translateSet (intVecToRealVec z) U) a = + X U (translateReg (intVecToRealVec z) a) + +/-- A raw translation-covariant observable, precomposed with `toFun`, is +restriction translation covariant. -/ +theorem isRestrictionTranslationCovariant_comp_toFun {β : Type*} {d : ℕ} + {X : Set (Vec d) → CoeffField d → β} (hX : IsTranslationCovariant X) : + IsRestrictionTranslationCovariant (fun U a => X U a.toFun) := by + intro U z a + show X (translateSet (intVecToRealVec z) U) a.toFun = + X U (translateReg (intVecToRealVec z) a).toFun + rw [hX U z a.toFun, translateReg_toFun] + +/-- Restriction-carrier analogue of +`comp_translateByInt_eq_of_isTranslationCovariant`. -/ +theorem comp_translateReg_eq_of_isRestrictionTranslationCovariant {β : Type*} {d : ℕ} + {X : Set (Vec d) → RegCoeffField d → β} (hX : IsRestrictionTranslationCovariant X) + (U : Set (Vec d)) (z : Fin d → ℤ) : + X (translateSet (intVecToRealVec z) U) = + X U ∘ translateReg (intVecToRealVec z) := by + funext a + exact hX U z a + +/-- Restriction-carrier analogue of +`map_eq_map_translateByInt_of_isTranslationCovariant`. -/ +theorem map_eq_map_translateReg_of_isRestrictionTranslationCovariant {β : Type*} + [MeasurableSpace β] {d : ℕ} {P : RestrictionCoeffLaw d} + {X : Set (Vec d) → RegCoeffField d → β} + (hP : RestrictionStationaryLaw P) {U : Set (Vec d)} (hX_meas : Measurable (X U)) + (hX_cov : IsRestrictionTranslationCovariant X) (z : Fin d → ℤ) : + Measure.map (X (translateSet (intVecToRealVec z) U)) P = + Measure.map (X U) P := by + calc + Measure.map (X (translateSet (intVecToRealVec z) U)) P = + Measure.map (X U ∘ translateReg (intVecToRealVec z)) P := by + rw [comp_translateReg_eq_of_isRestrictionTranslationCovariant hX_cov U z] + _ = Measure.map (X U) (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + simpa [Function.comp] using + (Measure.map_map hX_meas (measurable_translateReg (intVecToRealVec z)) + (μ := P)) + _ = Measure.map (X U) P := by rw [hP z] + +/-- A.e.-measurable carrier analogue of +`map_eq_map_translateByInt_of_isTranslationCovariant_aemeasurable`. -/ +theorem map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable {β : Type*} + [MeasurableSpace β] {d : ℕ} {P : RestrictionCoeffLaw d} + {X : Set (Vec d) → RegCoeffField d → β} + (hP : RestrictionStationaryLaw P) {U : Set (Vec d)} (hX_aemeas : AEMeasurable (X U) P) + (hX_cov : IsRestrictionTranslationCovariant X) (z : Fin d → ℤ) : + Measure.map (X (translateSet (intVecToRealVec z) U)) P = + Measure.map (X U) P := by + calc + Measure.map (X (translateSet (intVecToRealVec z) U)) P = + Measure.map (X U ∘ translateReg (intVecToRealVec z)) P := by + rw [comp_translateReg_eq_of_isRestrictionTranslationCovariant hX_cov U z] + _ = Measure.map (X U) (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hP z] using hX_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map (X U) P := by rw [hP z] + +/-- Carrier analogue of +`integral_eq_of_isTranslationCovariant_of_isStationary`. -/ +theorem integral_eq_of_isRestrictionTranslationCovariant_of_stationary {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : RestrictionCoeffLaw d} {X : Set (Vec d) → RegCoeffField d → E} + (hP : RestrictionStationaryLaw P) {U : Set (Vec d)} + (hX_meas : Measurable (X U)) + (hX_cov : IsRestrictionTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := by + rw [comp_translateReg_eq_of_isRestrictionTranslationCovariant hX_cov U z] + exact integral_comp_eq_of_map_eq + (measurable_translateReg (intVecToRealVec z)) (hP z) (X U) + hX_meas.aestronglyMeasurable + +/-- A.e.-strongly-measurable carrier analogue of +`integral_eq_of_isTranslationCovariant_of_isStationary_aestronglyMeasurable`. -/ +theorem integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : RestrictionCoeffLaw d} {X : Set (Vec d) → RegCoeffField d → E} + (hP : RestrictionStationaryLaw P) {U : Set (Vec d)} + (hX_aemeas : AEStronglyMeasurable (X U) P) + (hX_cov : IsRestrictionTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := by + rw [comp_translateReg_eq_of_isRestrictionTranslationCovariant hX_cov U z] + exact integral_comp_eq_of_map_eq + (measurable_translateReg (intVecToRealVec z)) (hP z) (X U) hX_aemeas + +namespace RestrictionLawCarrier + +/-- Under stationarity, the annealed response on a nonnegative-scale cube is +the annealed response on the origin cube at the same scale. -/ +theorem expectedResponseJCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) + (p q : Vec d) : + expectedResponseJCubeSet P R p q = + expectedResponseJCubeSet P (originCube d R.scale) p q := by + have hshift := + cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + calc + expectedResponseJCubeSet P R p q + = ∫ a, ResponseJ (cubeSet R) p q a.toFun ∂P := rfl + _ = + ∫ a, + ResponseJ + (translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale))) p q a.toFun ∂P := by + rw [hshift] + _ = ∫ a, ResponseJ (cubeSet (originCube d R.scale)) p q a.toFun ∂P := + integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw (P := P) hstat + (X := fun U a => ResponseJ U p q a) + (U := cubeSet (originCube d R.scale)) + (by + simpa [restrictionResponseJObservableCubeSet] using! + hP.aestronglyMeasurable_restrictionResponseJObservableCubeSet + (originCube d R.scale) p q) + (responseJCubeSet_translation_covariant p q) + (scaleTranslationShift R.scale R) + _ = expectedResponseJCubeSet P (originCube d R.scale) p q := rfl + +/-- Under stationarity, every coarse block matrix entry on a nonnegative-scale +cube has the same expectation as the corresponding origin-cube entry. -/ +theorem integral_coarseBlockMatrix_entry_cubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) + (α β : BlockCoord d) : + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P = + ∫ a, + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d R.scale)) a.toFun) α β ∂P := by + have hshift := + cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + have hmeas : + AEStronglyMeasurable + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d R.scale)) a.toFun) α β) P := by + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatEntry] using + (hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet + (originCube d R.scale) i j).aestronglyMeasurable + | inr j => + simpa [blockMatEntry] using + (hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet + (originCube d R.scale) i j).aestronglyMeasurable + | inr i => + cases β with + | inl j => + simpa [blockMatEntry] using + (hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet + (originCube d R.scale) i j).aestronglyMeasurable + | inr j => + simpa [blockMatEntry] using + (hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet + (originCube d R.scale) i j).aestronglyMeasurable + calc + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P + = + ∫ a, + blockMatEntry + (coarseBlockMatrix + (translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale))) a.toFun) α β ∂P := by + rw [hshift] + _ = + ∫ a, + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d R.scale)) a.toFun) α β ∂P := + integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw (P := P) hstat + (X := fun U a => blockMatEntry (coarseBlockMatrix U a) α β) + (U := cubeSet (originCube d R.scale)) hmeas + (coarseBlockMatrix_entry_translation_covariant α β) + (scaleTranslationShift R.scale R) + +/-- Under stationarity, a child cube of an origin cube has the same annealed +response as the origin cube at the child scale. -/ +theorem expectedResponseJCubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) + (p q : Vec d) : + expectedResponseJCubeSet P R p q = + expectedResponseJCubeSet P (originCube d n) p q := by + have hscale : R.scale = n := + scale_eq_of_mem_descendantsAtScale_originCube hnm hR + have hR_nonneg : 0 ≤ R.scale := by + simpa [hscale] using hn + calc + expectedResponseJCubeSet P R p q = + expectedResponseJCubeSet P (originCube d R.scale) p q := + hP.expectedResponseJCubeSet_eq_originCube_of_stationary hstat R hR_nonneg p q + _ = expectedResponseJCubeSet P (originCube d n) p q := by + rw [hscale] + +/-- Under stationarity, every coarse block matrix entry on a child cube of an +origin cube has the same expectation as the corresponding origin-cube entry at +the child scale. -/ +theorem integral_coarseBlockMatrix_entry_cubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) + (α β : BlockCoord d) : + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P = + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) α β ∂P := by + have hscale : R.scale = n := + scale_eq_of_mem_descendantsAtScale_originCube hnm hR + have hR_nonneg : 0 ≤ R.scale := by + simpa [hscale] using hn + calc + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet R) a.toFun) α β ∂P + = + ∫ a, + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d R.scale)) a.toFun) α β ∂P := + hP.integral_coarseBlockMatrix_entry_cubeSet_eq_originCube_of_stationary + hstat R hR_nonneg α β + _ = + ∫ a, blockMatEntry (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) α β ∂P := by + rw [hscale] + +/-- Under stationarity, the normalized full-block fluctuation on a +nonnegative-scale cube has the same expectation as the corresponding +origin-cube fluctuation. The norm is the Euclidean operator norm of the full +block matrix. -/ +theorem integral_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hStruct : RestrictionStructuralLaw P) (center : ℤ) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale)) P) : + ∫ a, fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center R a ∂P = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale) a ∂P := by + have hshift := + cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + calc + ∫ a, fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center R a ∂P + = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center + (translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale))) a.toFun ∂P := by + simp only [fullBlockNormalizedFluctuationOperatorNormSqAtScale, hshift] + _ = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center + (cubeSet (originCube d R.scale)) a.toFun ∂P := + integral_comp_toFun_translation_transfer_of_restrictionStationaryLaw (P := P) hstat + (X := fun U a => + fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center U a) + (U := cubeSet (originCube d R.scale)) + (by + simpa [fullBlockNormalizedFluctuationOperatorNormSqAtScale] using! + hOrigin.aestronglyMeasurable) + (fullBlockNormalizedFluctuationOperatorNormSq_translation_covariant + hP hStruct center) + (scaleTranslationShift R.scale R) + _ = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale) a ∂P := rfl + +/-- Under stationarity, integrability of the origin-cube normalized full-block +fluctuation transfers to every same-scale cube. -/ +theorem integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hStruct : RestrictionStructuralLaw P) (center : ℤ) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale)) P) : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center R) P := by + let z : Fin d → ℤ := scaleTranslationShift R.scale R + have hset : + cubeSet R = + translateSet (intVecToRealVec z) (cubeSet (originCube d R.scale)) := by + simpa [z] using + cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + have hmap : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center + (originCube d R.scale)) + (Measure.map (translateReg (intVecToRealVec z)) P) := by + rw [hstat z]; exact hOrigin + have hcomp := hmap.comp_measurable (measurable_translateReg (intVecToRealVec z)) + refine hcomp.congr ?_ + filter_upwards with a + show fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center + (originCube d R.scale) (translateReg (intVecToRealVec z) a) = + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center R a + simp only [fullBlockNormalizedFluctuationOperatorNormSqAtScale, translateReg_toFun] + rw [hset] + exact + (fullBlockNormalizedFluctuationOperatorNormSq_translation_covariant + hP hStruct center (cubeSet (originCube d R.scale)) z a.toFun).symm + +/-- Under stationarity, integrability of the origin-cube normalized full-block +fluctuation at the child scale transfers to descendants of a larger origin +cube. -/ +theorem integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendantsAtScale_originCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hStruct : RestrictionStructuralLaw P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P) : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center R) P := by + have hscale : R.scale = n := + scale_eq_of_mem_descendantsAtScale_originCube hnm hR + have hR_nonneg : 0 ≤ R.scale := by + simpa [hscale] using hn + exact + hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_stationary + hstat hStruct center R hR_nonneg (by simpa [hscale] using hOrigin) + +/-- Under stationarity, the expectation of a descendant average of normalized +full-block fluctuation observables is the corresponding origin-cube +expectation at the descendant scale. The observable uses the Euclidean +operator norm of the full block matrix. -/ +theorem integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (hStruct : RestrictionStructuralLaw P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + classical + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R) P := by + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d m) n := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR + exact + hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendantsAtScale_originCube + hstat hStruct center hn hnm hRscale hOrigin + calc + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P + = + descendantsAverage Q j + (fun R => + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a ∂P) := + integral_descendantsAverage_eq_descendantsAverage_integral + (P := P) (Q := Q) (j := j) + (F := fun R a => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) hDepth + _ = + descendantsAverage Q j + (fun _R => + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((D.card : ℝ)⁻¹) * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d m) n := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR + have hscale : R.scale = n := + scale_eq_of_mem_descendantsAtScale_originCube hnm hRscale + have hR_nonneg : 0 ≤ R.scale := by + simpa [hscale] using hn + calc + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a ∂P + = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale) a ∂P := + hP.integral_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hstat hStruct center R hR_nonneg (by simpa [hscale] using hOrigin) + _ = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + rw [hscale] + _ = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + simp [descendantsAverage_const] + +/-- Full coarse-block integrability transfers from the origin cube at scale +`n` to every scale-`n` descendant of the origin cube at a larger scale. This +is the stationarity source theorem for the descendant integrability hypotheses +in annealed subadditivity. -/ +theorem integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) + (hOrigin : Integrable (coarseFullBlockMatrixAtCube (originCube d n)) P) : + Integrable (coarseFullBlockMatrixAtCube R) P := by + let z : Fin d → ℤ := scaleTranslationShift n R + have hset : + cubeSet R = + translateSet (intVecToRealVec z) (cubeSet (originCube d n)) := by + simpa [z] using + cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + hn hnm hR + have hmap : + Integrable (coarseFullBlockMatrixAtCube (originCube d n)) + (Measure.map (translateReg (intVecToRealVec z)) P) := by + rw [hstat z]; exact hOrigin + have hcomp := hmap.comp_measurable (measurable_translateReg (intVecToRealVec z)) + refine hcomp.congr ?_ + filter_upwards with a + show coarseFullBlockMatrixAtCube (originCube d n) (translateReg (intVecToRealVec z) a) = + coarseFullBlockMatrixAtCube R a + simp only [coarseFullBlockMatrixAtCube, coarseFullBlockMatrixObservable, translateReg_toFun] + rw [hset, coarseBlockMatrix_translateSet_eq_translateCoeffField] + rfl + +/-- Under stationarity, the finite descendant average of child annealed +responses equals the annealed response on the origin cube at the child scale. -/ +theorem expectedDescendantsAverageResponseJCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (p q : Vec d) : + expectedDescendantsAverageResponseJCubeSet P (originCube d m) + (Int.toNat (m - n)) p q = + expectedResponseJCubeSet P (originCube d n) p q := by + classical + let D : Finset (TriadicCube d) := + descendantsAtDepth (originCube d m) (Int.toNat (m - n)) + have hDscale : D = descendantsAtScale (originCube d m) n := by + simpa [D, originCube] using + (descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm).symm + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty (originCube d m) (Int.toNat (m - n)) + have hcard_ne : ((D.card : ℝ) ≠ 0) := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + calc + expectedDescendantsAverageResponseJCubeSet P (originCube d m) + (Int.toNat (m - n)) p q + = + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, expectedResponseJCubeSet P R p q) := by + simp [expectedDescendantsAverageResponseJCubeSet, descendantsAverage, D] + _ = + (D.card : ℝ)⁻¹ * + (∑ _R ∈ D, expectedResponseJCubeSet P (originCube d n) p q) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro R hR + exact + hP.expectedResponseJCubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + hstat hn hnm (by simpa [hDscale] using hR) p q + _ = expectedResponseJCubeSet P (originCube d n) p q := by + simp [Finset.sum_const, nsmul_eq_mul, hcard_ne] + +/-- Under stationarity, the expectation of the finite descendant average of +response observables is the annealed response on the origin cube at the child +scale. -/ +theorem integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (p q : Vec d) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) ∂P = + expectedResponseJCubeSet P (originCube d n) p q := by + have hJ_depth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - n)) → + Integrable (restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hJ R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR) + calc + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => restrictionResponseJObservableCubeSet R p q a) ∂P + = + expectedDescendantsAverageResponseJCubeSet P (originCube d m) + (Int.toNat (m - n)) p q := + integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_expectedDescendantsAverageResponseJCubeSet + (P := P) (Q := originCube d m) (j := Int.toNat (m - n)) p q hJ_depth + _ = expectedResponseJCubeSet P (originCube d n) p q := + hP.expectedDescendantsAverageResponseJCubeSet_eq_originCube_of_stationary + hstat hn hnm p q + +/-- Weighted finite descendant response averages reduce to the average of the +deterministic weights times the origin-cube expectation under stationarity. + +This is the source theorem for the cancellation step in Section 5.3: Ch5 +supplies the cutoff weights and the scalar identity saying their finite +descendant average is zero. -/ +theorem integral_weightedDescendantsAverage_restrictionResponseJObservableCubeSet_eq_weight_average_mul_originCube_of_stationary + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (weight : TriadicCube d → ℝ) (p q : Vec d) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => weight R * restrictionResponseJObservableCubeSet R p q a) ∂P = + descendantsAverage (originCube d m) (Int.toNat (m - n)) weight * + expectedResponseJCubeSet P (originCube d n) p q := by + classical + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hJ_depth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (fun a : RegCoeffField d => + weight R * restrictionResponseJObservableCubeSet R p q a) P := by + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d m) n := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR + exact (hJ R hRscale).const_mul (weight R) + calc + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => weight R * restrictionResponseJObservableCubeSet R p q a) ∂P + = + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => ∫ a, weight R * restrictionResponseJObservableCubeSet R p q a ∂P) := + integral_descendantsAverage_eq_descendantsAverage_integral + (P := P) (Q := Q) (j := j) + (F := fun R a => weight R * restrictionResponseJObservableCubeSet R p q a) hJ_depth + _ = + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => weight R * expectedResponseJCubeSet P (originCube d n) p q) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((D.card : ℝ)⁻¹) * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d m) n := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hnm] using! hR + have hstationary : + expectedResponseJCubeSet P R p q = + expectedResponseJCubeSet P (originCube d n) p q := + hP.expectedResponseJCubeSet_eq_originCube_of_mem_descendantsAtScale_originCube + hstat hn hnm hRscale p q + rw [integral_const_mul] + change weight R * expectedResponseJCubeSet P R p q = + weight R * expectedResponseJCubeSet P (originCube d n) p q + rw [hstationary] + _ = + descendantsAverage (originCube d m) (Int.toNat (m - n)) weight * + expectedResponseJCubeSet P (originCube d n) p q := by + let C : ℝ := expectedResponseJCubeSet P (originCube d n) p q + change ((D.card : ℝ)⁻¹ * ∑ R ∈ D, weight R * C) = + (((D.card : ℝ)⁻¹ * ∑ R ∈ D, weight R) * C) + rw [← Finset.sum_mul] + ring + +end RestrictionLawCarrier + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/WidetildeTheta.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/WidetildeTheta.lean new file mode 100644 index 0000000000..8dbd10fb0c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/Theorems/WidetildeTheta.lean @@ -0,0 +1,894 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ScalarizationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.Properties +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality + +/-! # Widetilde Theta -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +/-! +# Moment roots and `widetildeTheta` + +Clean Ch4 definitions of the scalar moment roots used to compare the primitive +contrast `Theta_n` to the moment-enhanced quantity `widetildeTheta_n`. +-/ + +open MeasureTheory +open scoped Matrix.Norms.L2Operator BigOperators + +noncomputable section + +/-- The annealed `L^ξ` moment root of a nonnegative scalar observable. -/ +noncomputable def annealedMomentRoot {d : ℕ} + (P : RestrictionCoeffLaw d) (ξ : ℕ) (X : RegCoeffField d → ℝ) : ℝ := + (∫ a, X a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + +/-- The upper multiscale ellipticity observable on ambient coefficient fields. +On the a.e.-elliptic support it uses the canonical dependent Ch2 coefficient +family; off support it is totalized by `0`. -/ +noncomputable def LambdaSqCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s : ℝ) (q : Ch02.MultiscaleExponent) + (a : RegCoeffField d) : ℝ := by + classical + exact + if h : AELocallyUniformlyEllipticField a then + Ch02.LambdaSq Q s q (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) + else + 0 + +/-- The lower multiscale ellipticity observable on ambient coefficient fields. +On the a.e.-elliptic support it uses the canonical dependent Ch2 coefficient +family; off support it is totalized by `0`. -/ +noncomputable def lambdaSqCoeffField {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s : ℝ) (q : Ch02.MultiscaleExponent) + (a : RegCoeffField d) : ℝ := by + classical + exact + if h : AELocallyUniformlyEllipticField a then + Ch02.lambdaSq Q s q (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) + else + 0 + +private theorem cubeSet_translateCube_descendantTranslationShift_eq_translateSet_int + {d : ℕ} (z : Fin d → ℤ) (n : ℕ) {R : TriadicCube d} + (hRscale : R.scale = -((n : ℕ) : ℤ)) : + cubeSet (translateCube (descendantTranslationShift n z) R) = + translateSet (intVecToRealVec z) (cubeSet R) := by + ext x + rw [mem_cubeSet_translateCube_iff, mem_translateSet_iff_sub_mem] + have hvec : + (fun i => ((descendantTranslationShift n z i : ℤ) : ℝ) * cubeScaleFactor R) = + intVecToRealVec z := by + ext i + simp [descendantTranslationShift, cubeScaleFactor, hRscale, intVecToRealVec] + field_simp [pow_ne_zero n (by norm_num : (3 : ℝ) ≠ 0)] + simp [hvec] + +private theorem scale_eq_neg_natCast_of_mem_descendantsAtScale_originCube_zero + {d : ℕ} {n : ℕ} {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d 0) ((originCube d 0).scale - (n : ℤ))) : + R.scale = -((n : ℕ) : ℤ) := by + have hk : (originCube d 0).scale - (n : ℤ) ≤ (originCube d 0).scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hscale := scale_eq_sub_of_mem_descendantsAtScale (Q := originCube d 0) hk hR + simpa [originCube] using hscale + +private theorem coarseBlockMatrix_translateCube_descendant_eq_translateByInt + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (z : Fin d → ℤ) + (htranslate : AELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a)) + (n : ℕ) {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d 0) ((originCube d 0).scale - (n : ℤ))) : + Ch02.coarseBlockMatrix (Ch02.cubeDomain (translateCube (descendantTranslationShift n z) R)) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (translateCube (descendantTranslationShift n z) R)) = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (translateReg (intVecToRealVec z) a) htranslate).coeffOn R) := by + let T : TriadicCube d := translateCube (descendantTranslationShift n z) R + have hleft : + Ch02.coarseBlockMatrix (Ch02.cubeDomain T) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn T) = + coarseBlockMatrix (cubeSet T) a.toFun := by + simpa [T] using + (RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha T).symm + have hset : cubeSet T = translateSet (intVecToRealVec z) (cubeSet R) := by + have hRscale := scale_eq_neg_natCast_of_mem_descendantsAtScale_originCube_zero hR + simpa [T] using + cubeSet_translateCube_descendantTranslationShift_eq_translateSet_int z n hRscale + have hright : + coarseBlockMatrix (cubeSet R) (translateReg (intVecToRealVec z) a).toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (translateReg (intVecToRealVec z) a) htranslate).coeffOn R) := by + simpa using + RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + htranslate R + calc + Ch02.coarseBlockMatrix (Ch02.cubeDomain T) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn T) + = coarseBlockMatrix (cubeSet T) a.toFun := hleft + _ = coarseBlockMatrix (translateSet (intVecToRealVec z) (cubeSet R)) a.toFun := by + rw [hset] + _ = coarseBlockMatrix (cubeSet R) (translateReg (intVecToRealVec z) a).toFun := by + simpa [translateByInt] using! + coarseBlockMatrix_translateSet_eq_translateCoeffField + (intVecToRealVec z) (cubeSet R) a.toFun + _ = Ch02.coarseBlockMatrix (Ch02.cubeDomain R) + ((triadicCoeffFamilyOfAELocallyUniformlyEllipticField + (translateReg (intVecToRealVec z) a) htranslate).coeffOn R) := hright + +private theorem LambdaSqCoeffField_originCube_zero_translateByInt_pointwise + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (z : Fin d → ℤ) + (htranslate : AELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a)) + (s : ℝ) (q : Ch02.MultiscaleExponent) : + LambdaSqCoeffField (translateCube z (originCube d 0)) s q a = + LambdaSqCoeffField (originCube d 0) s q (translateReg (intVecToRealVec z) a) := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a) htranslate + have hB : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale (originCube d 0) ((originCube d 0).scale - (n : ℤ)) → + Ch02.coarseBMatrixNorm (translateCube (descendantTranslationShift n z) R) F = + Ch02.coarseBMatrixNorm R G := by + intro n R hR + have hmat : + Ch02.coarseBlockMatrix + (Ch02.cubeDomain (translateCube (descendantTranslationShift n z) R)) + (F.coeffOn (translateCube (descendantTranslationShift n z) R)) = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (G.coeffOn R) := by + simpa [F, G] using + coarseBlockMatrix_translateCube_descendant_eq_translateByInt + (ha := ha) z (htranslate := htranslate) n hR + have hupper := congrArg (fun A : BlockMat d => Ch02.matrixNorm A.upperLeft) hmat + simpa [Ch02.coarseBMatrixNorm] using hupper + have h := Ch02.LambdaSq_translateCube_of_coarseBMatrixNorm + F G z (originCube d 0) s q hB + simpa [LambdaSqCoeffField, ha, htranslate, F, G] using h + +private theorem lambdaSqCoeffField_originCube_zero_translateByInt_pointwise + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (z : Fin d → ℤ) + (htranslate : AELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a)) + (s : ℝ) (q : Ch02.MultiscaleExponent) : + lambdaSqCoeffField (translateCube z (originCube d 0)) s q a = + lambdaSqCoeffField (originCube d 0) s q (translateReg (intVecToRealVec z) a) := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let G : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a) htranslate + have hSigma : ∀ (n : ℕ) (R : TriadicCube d), + R ∈ descendantsAtScale (originCube d 0) ((originCube d 0).scale - (n : ℤ)) → + Ch02.coarseSigmaStarInvMatrixNorm + (translateCube (descendantTranslationShift n z) R) F = + Ch02.coarseSigmaStarInvMatrixNorm R G := by + intro n R hR + have hmat : + Ch02.coarseBlockMatrix + (Ch02.cubeDomain (translateCube (descendantTranslationShift n z) R)) + (F.coeffOn (translateCube (descendantTranslationShift n z) R)) = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (G.coeffOn R) := by + simpa [F, G] using + coarseBlockMatrix_translateCube_descendant_eq_translateByInt + (ha := ha) z (htranslate := htranslate) n hR + have hlower := congrArg (fun A : BlockMat d => Ch02.matrixNorm A.lowerRight) hmat + simpa [Ch02.coarseSigmaStarInvMatrixNorm] using hlower + have h := Ch02.lambdaSq_translateCube_of_coarseSigmaStarInvMatrixNorm + F G z (originCube d 0) s q hSigma + simpa [lambdaSqCoeffField, ha, htranslate, F, G] using h + +private theorem ae_locallyUniformlyEllipticField_translateByInt + {d : ℕ} {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (z : Fin d → ℤ) : + ∀ᵐ a ∂P, AELocallyUniformlyEllipticField (translateReg (intVecToRealVec z) a) := by + have hmapSupport : + ∀ᵐ b ∂Measure.map (translateReg (intVecToRealVec z)) P, AELocallyUniformlyEllipticField b := by + simpa [hstat z] using hP.ae_locallyUniformlyEllipticField + exact MeasureTheory.ae_of_ae_map (measurable_translateReg (intVecToRealVec z)).aemeasurable hmapSupport + +/-- Upper multiscale ellipticity on the scale-zero origin cube is covariant +under integer translations, almost surely under a stationary law carrier. -/ +theorem LambdaSqCoeffField_originCube_zero_translateByInt_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (z : Fin d → ℤ) (s : ℝ) (q : Ch02.MultiscaleExponent) : + (fun a => LambdaSqCoeffField (translateCube z (originCube d 0)) s q a) =ᵐ[P] + fun a => LambdaSqCoeffField (originCube d 0) s q (translateReg (intVecToRealVec z) a) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField, + ae_locallyUniformlyEllipticField_translateByInt hP hstat z] with a ha htranslate + exact LambdaSqCoeffField_originCube_zero_translateByInt_pointwise ha z htranslate s q + +/-- Lower multiscale ellipticity on the scale-zero origin cube is covariant +under integer translations, almost surely under a stationary law carrier. -/ +theorem lambdaSqCoeffField_originCube_zero_translateByInt_ae + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (hstat : RestrictionStationaryLaw P) (z : Fin d → ℤ) (s : ℝ) (q : Ch02.MultiscaleExponent) : + (fun a => lambdaSqCoeffField (translateCube z (originCube d 0)) s q a) =ᵐ[P] + fun a => lambdaSqCoeffField (originCube d 0) s q (translateReg (intVecToRealVec z) a) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField, + ae_locallyUniformlyEllipticField_translateByInt hP hstat z] with a ha htranslate + exact lambdaSqCoeffField_originCube_zero_translateByInt_pointwise ha z htranslate s q + +theorem LambdaSqCoeffField_finite_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {s q : ℝ} (a : RegCoeffField d) + (hs : 0 < s) (hq : 1 ≤ q) : + 0 ≤ LambdaSqCoeffField Q s (.finite q) a := by + classical + by_cases h : AELocallyUniformlyEllipticField a + · have hnonneg : + 0 ≤ Ch02.LambdaSq Q s (.finite q) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) := + Ch02.LambdaSq_finite_nonneg Q + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) hs hq + simpa [LambdaSqCoeffField, h] using hnonneg + · simp [LambdaSqCoeffField, h] + +theorem lambdaSqCoeffField_finite_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) {s q : ℝ} (a : RegCoeffField d) + (hs : 0 < s) (hq : 1 ≤ q) : + 0 ≤ lambdaSqCoeffField Q s (.finite q) a := by + classical + by_cases h : AELocallyUniformlyEllipticField a + · have hnonneg : + 0 ≤ Ch02.lambdaSq Q s (.finite q) + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) := + Ch02.lambdaSq_finite_nonneg Q + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) hs hq + simpa [lambdaSqCoeffField, h] using hnonneg + · simp [lambdaSqCoeffField, h] + +/-- Ambient coefficient-field lift of the Ch2 descendant upper-left operator +norm maximum. It uses the canonical dependent Ch2 coefficient family on the +a.e.-locally elliptic support and is zero off that support. -/ +noncomputable def maxDescendantBMatrixNormCoeffFieldAtScale {d : ℕ} [NeZero d] + (Q : TriadicCube d) (k : ℤ) (a : RegCoeffField d) : ℝ := by + classical + exact + if h : AELocallyUniformlyEllipticField a then + Ch02.maxDescendantBMatrixNormAtScale Q k + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) + else + 0 + +/-- Ambient coefficient-field lift of the Ch2 descendant lower-right inverse +operator-norm maximum. -/ +noncomputable def maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (k : ℤ) + (a : RegCoeffField d) : ℝ := by + classical + exact + if h : AELocallyUniformlyEllipticField a then + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) + else + 0 + +namespace RestrictionLawCarrier + +theorem finsetSupReal_eq_sup' {α : Type*} + (s : Finset α) (hs : s.Nonempty) (f : α → ℝ) : + Ch02.finsetSupReal s f = s.sup' hs f := by + apply le_antisymm + · exact Ch02.finsetSupReal_le s hs (fun x hx => Finset.le_sup' f hx) + · refine Finset.sup'_le hs f ?_ + intro x hx + unfold Ch02.finsetSupReal + have hbdd : BddAbove (f '' (↑s : Set α)) := + ((Set.toFinite _).image f).bddAbove + exact le_csSup hbdd ⟨x, hx, rfl⟩ + +/-- Finite nonempty suprema of almost-everywhere measurable real observables +remain almost-everywhere measurable. -/ +theorem aemeasurable_finset_sup' + {Ω ι : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} {s : Finset ι} (hs : s.Nonempty) + {f : ι → Ω → ℝ} + (hf : ∀ i ∈ s, AEMeasurable (f i) μ) : + AEMeasurable (s.sup' hs f) μ := + Finset.sup'_induction (s := s) (H := hs) (f := f) + (p := fun g => AEMeasurable g μ) + (fun _f hf' _g hg' => hf'.sup hg') + (fun i hi => hf i hi) + +theorem maxDescendantBMatrixNormCoeffFieldAtScale_eq_finsetSupReal_ae + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) (k : ℤ) : + maxDescendantBMatrixNormCoeffFieldAtScale Q k a = + Ch02.finsetSupReal (descendantsAtScale Q k) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) := by + classical + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hnorm : ∀ R ∈ descendantsAtScale Q k, + Ch02.coarseBMatrixNorm R F = + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft := by + intro R _hR + have hmat := + coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + have hupper := + congrArg (fun A : BlockMat d => Ch02.matrixNorm A.upperLeft) hmat + simpa [Ch02.coarseBMatrixNorm, F] using hupper.symm + simpa [maxDescendantBMatrixNormCoeffFieldAtScale, + Ch02.maxDescendantBMatrixNormAtScale, ha, F] using + Ch02.finsetSupReal_congr (descendantsAtScale Q k) hnorm + +theorem maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_eq_finsetSupReal_ae + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : AELocallyUniformlyEllipticField a) (Q : TriadicCube d) (k : ℤ) : + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q k a = + Ch02.finsetSupReal (descendantsAtScale Q k) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) := by + classical + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hnorm : ∀ R ∈ descendantsAtScale Q k, + Ch02.coarseSigmaStarInvMatrixNorm R F = + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight := by + intro R _hR + have hmat := + coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + have hlower := + congrArg (fun A : BlockMat d => Ch02.matrixNorm A.lowerRight) hmat + simpa [Ch02.coarseSigmaStarInvMatrixNorm, F] using hlower.symm + simpa [maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale, ha, F] using + Ch02.finsetSupReal_congr (descendantsAtScale Q k) hnorm + +private theorem aemeasurable_maxDescendantBMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (n : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) P := by + classical + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + let sDesc := descendantsAtScale Q (Q.scale - (n : ℤ)) + have hsDesc : sDesc.Nonempty := + descendantsAtScale_nonempty Q (sub_le_self Q.scale hn) + have hsup : + AEMeasurable + (sDesc.sup' hsDesc + (fun R (a : RegCoeffField d) => + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft)) P := by + refine aemeasurable_finset_sup' hsDesc ?_ + intro R _hR + simpa [Ch02.matrixNorm, Matrix.l2_opNorm_toEuclideanCLM] using + (hP.aemeasurable_coarseB_cubeSet R).norm + have hfin : + AEMeasurable + (fun a : RegCoeffField d => + Ch02.finsetSupReal sDesc + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft)) P := by + convert hsup using 1 + ext a + rw [Finset.sup'_apply] + exact finsetSupReal_eq_sup' sDesc hsDesc + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) + refine hfin.congr ?_ + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + simpa [sDesc] using + (maxDescendantBMatrixNormCoeffFieldAtScale_eq_finsetSupReal_ae + (a := a) ha Q (Q.scale - (n : ℤ))).symm + +private theorem aemeasurable_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) (n : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) P := by + classical + have hn : (0 : ℤ) ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + let sDesc := descendantsAtScale Q (Q.scale - (n : ℤ)) + have hsDesc : sDesc.Nonempty := + descendantsAtScale_nonempty Q (sub_le_self Q.scale hn) + have hsup : + AEMeasurable + (sDesc.sup' hsDesc + (fun R (a : RegCoeffField d) => + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight)) P := by + refine aemeasurable_finset_sup' hsDesc ?_ + intro R _hR + simpa [Ch02.matrixNorm, Matrix.l2_opNorm_toEuclideanCLM] using + (hP.aemeasurable_coarseSigmaStarInv_cubeSet R).norm + have hfin : + AEMeasurable + (fun a : RegCoeffField d => + Ch02.finsetSupReal sDesc + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight)) P := by + convert hsup using 1 + ext a + rw [Finset.sup'_apply] + exact finsetSupReal_eq_sup' sDesc hsDesc + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) + refine hfin.congr ?_ + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + simpa [sDesc] using + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_eq_finsetSupReal_ae + (a := a) ha Q (Q.scale - (n : ℤ))).symm + +theorem summable_weighted_maxDescendantBMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + classical + by_cases ha : AELocallyUniformlyEllipticField a + · simpa [maxDescendantBMatrixNormCoeffFieldAtScale, ha] using + Ch02.summable_B_series_pointwiseCoeffField Q + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) hs + (by norm_num : (0 : ℝ) < 1) + · simp [maxDescendantBMatrixNormCoeffFieldAtScale, ha] + +theorem summable_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + classical + by_cases ha : AELocallyUniformlyEllipticField a + · simpa [maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] using + Ch02.summable_sigmaStarInv_series_pointwiseCoeffField Q + (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) hs + (by norm_num : (0 : ℝ) < 1) + · simp [maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + +private theorem aemeasurable_tsum_weighted_maxDescendantBMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + AEMeasurable + (fun a : RegCoeffField d => + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) P := by + refine + aemeasurable_of_tendsto_metrizable_ae (Filter.atTop : Filter ℕ) + (f := fun N a => + ∑ n ∈ Finset.range N, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) + (g := fun a => + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ?_ ?_ + · intro N + refine Finset.aemeasurable_fun_sum (μ := P) + (f := fun n (a : RegCoeffField d) => + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) (Finset.range N) ?_ + intro n _hn + have hpow : + AEMeasurable + (fun a : RegCoeffField d => + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) P := + by + have hrpow : Measurable (fun x : ℝ => Real.rpow x (1 / 2 : ℝ)) := + (Real.continuous_rpow_const (by positivity : 0 ≤ (1 / 2 : ℝ))).measurable + exact hrpow.comp_aemeasurable + (aemeasurable_maxDescendantBMatrixNormCoeffFieldAtScale hP Q n) + exact hpow.const_mul (Ch02.geometricWeight s 1 n) + · exact Filter.Eventually.of_forall fun a => + HasSum.tendsto_sum_nat + ((summable_weighted_maxDescendantBMatrixNormCoeffFieldAtScale Q a hs).hasSum) + +private theorem aemeasurable_tsum_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + AEMeasurable + (fun a : RegCoeffField d => + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) P := by + refine + aemeasurable_of_tendsto_metrizable_ae (Filter.atTop : Filter ℕ) + (f := fun N a => + ∑ n ∈ Finset.range N, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) + (g := fun a => + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ?_ ?_ + · intro N + refine Finset.aemeasurable_fun_sum (μ := P) + (f := fun n (a : RegCoeffField d) => + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) (Finset.range N) ?_ + intro n _hn + have hpow : + AEMeasurable + (fun a : RegCoeffField d => + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) P := + by + have hrpow : Measurable (fun x : ℝ => Real.rpow x (1 / 2 : ℝ)) := + (Real.continuous_rpow_const (by positivity : 0 ≤ (1 / 2 : ℝ))).measurable + exact hrpow.comp_aemeasurable + (aemeasurable_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale hP Q n) + exact hpow.const_mul (Ch02.geometricWeight s 1 n) + · exact Filter.Eventually.of_forall fun a => + HasSum.tendsto_sum_nat + ((summable_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q a hs).hasSum) + +theorem LambdaSqCoeffField_finite_one_eq_tsum_sq + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) (s : ℝ) : + LambdaSqCoeffField Q s (.finite 1) a = + (∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ^ 2 := by + classical + by_cases ha : AELocallyUniformlyEllipticField a + · simp [LambdaSqCoeffField, Ch02.LambdaSqFinite, + maxDescendantBMatrixNormCoeffFieldAtScale, ha] + · simp [LambdaSqCoeffField, maxDescendantBMatrixNormCoeffFieldAtScale, ha] + +theorem lambdaSqCoeffField_finite_one_eq_tsum_sq_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {s : ℝ} (hs : 0 < s) : + lambdaSqCoeffField Q s (.finite 1) a = + ((∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ^ 2)⁻¹ := by + classical + by_cases ha : AELocallyUniformlyEllipticField a + · let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let S : ℝ := + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) F) + (1 / 2 : ℝ) + have hS_nonneg : 0 ≤ S := by + simpa [S] using + Ch02.lambdaSqFinite_series_nonneg Q s 1 F + (by norm_num : (0 : ℝ) ≤ 1) (by simpa using hs.le) + have hneg : Real.rpow S (-(2 : ℝ)) = (Real.rpow S (2 : ℝ))⁻¹ := + Real.rpow_neg hS_nonneg 2 + simp [lambdaSqCoeffField, Ch02.lambdaSqFinite, + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + · simp [lambdaSqCoeffField, maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + +/-- The upper all-scale coefficient observable at a deterministic triadic cube +is a.e.-measurable under a Chapter 4 law carrier. -/ +theorem aemeasurable_LambdaSqCoeffField_finite_one + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + AEMeasurable + (fun a : RegCoeffField d => LambdaSqCoeffField Q s (.finite 1) a) P := by + have hS := + aemeasurable_tsum_weighted_maxDescendantBMatrixNormCoeffFieldAtScale hP Q hs + refine (hS.mul hS).congr ?_ + filter_upwards with a + simpa [pow_two] using (LambdaSqCoeffField_finite_one_eq_tsum_sq Q a s).symm + +/-- The lower all-scale coefficient observable at a deterministic triadic cube +is a.e.-measurable under a Chapter 4 law carrier. -/ +theorem aemeasurable_lambdaSqCoeffField_finite_one + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + AEMeasurable + (fun a : RegCoeffField d => lambdaSqCoeffField Q s (.finite 1) a) P := by + have hS := + aemeasurable_tsum_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale hP Q hs + refine (hS.mul hS).inv.congr ?_ + filter_upwards with a + simpa [pow_two] using (lambdaSqCoeffField_finite_one_eq_tsum_sq_inv Q a hs).symm + +/-- The inverse lower all-scale coefficient observable at a deterministic +triadic cube is a.e.-measurable under a Chapter 4 law carrier. -/ +theorem aemeasurable_lambdaSqCoeffField_finite_one_inv + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier P) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) : + AEMeasurable + (fun a : RegCoeffField d => (lambdaSqCoeffField Q s (.finite 1) a)⁻¹) P := + (hP.aemeasurable_lambdaSqCoeffField_finite_one Q hs).inv + +end RestrictionLawCarrier + +/-- The q=1 deterministic Jensen split for the ambient upper multiscale +ellipticity observable. This is the Ch4-facing form of the Ch2 theorem, with +no probability or measurability assumptions. -/ +theorem LambdaSqCoeffField_finite_one_le_tsum_weighted_maxDescendantBMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {s : ℝ} (hs : 0 < s) : + LambdaSqCoeffField Q s (.finite 1) a ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a := by + classical + by_cases h : AELocallyUniformlyEllipticField a + · simpa [LambdaSqCoeffField, maxDescendantBMatrixNormCoeffFieldAtScale, h] using + Ch02.LambdaSq_finite_one_le_tsum_weighted_maxDescendantBMatrixNormAtScale + Q (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) hs + · have htsum_nonneg : + 0 ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + maxDescendantBMatrixNormCoeffFieldAtScale Q (Q.scale - (n : ℤ)) a := by + refine tsum_nonneg fun n => ?_ + simp [maxDescendantBMatrixNormCoeffFieldAtScale, h] + simpa [LambdaSqCoeffField, h] using htsum_nonneg + +/-- The q=1 deterministic Jensen split for the ambient lower inverse +multiscale ellipticity observable. -/ +theorem lambdaSqCoeffField_finite_one_inv_le_tsum_weighted_maxDescendantSigmaStarInvMatrixNormAtScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {s : ℝ} (hs : 0 < s) : + (lambdaSqCoeffField Q s (.finite 1) a)⁻¹ ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a := by + classical + by_cases h : AELocallyUniformlyEllipticField a + · simpa [lambdaSqCoeffField, + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, h] using + Ch02.lambdaSq_finite_one_inv_le_tsum_weighted_maxDescendantSigmaStarInvMatrixNormAtScale + Q (triadicCoeffFamilyOfAELocallyUniformlyEllipticField a h) hs + · have htsum_nonneg : + 0 ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + Q (Q.scale - (n : ℤ)) a := by + refine tsum_nonneg fun n => ?_ + simp [maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, h] + simpa [lambdaSqCoeffField, h] using htsum_nonneg + +/-- Upper multiscale ellipticity moment at scale `n`. -/ +noncomputable def LambdaMomentAtScale {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) : ℝ := + annealedMomentRoot P ξ + (fun a => LambdaSqCoeffField (originCube d n) s (.finite 1) a) + +/-- Lower inverse multiscale ellipticity moment at scale `n`. -/ +noncomputable def lambdaInvMomentAtScale {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) : ℝ := + annealedMomentRoot P ξ + (fun a => (lambdaSqCoeffField (originCube d n) s (.finite 1) a)⁻¹) + +/-- The moment-enhanced contrast `\widetilde\Theta_n`. -/ +noncomputable def widetildeThetaAtScale {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) (sUpper sLower : ℝ) (ξ : ℕ) : ℝ := + LambdaMomentAtScale P n sUpper ξ * lambdaInvMomentAtScale P n sLower ξ + +theorem annealedMomentRoot_nonneg_of_nonneg {d : ℕ} + (P : RestrictionCoeffLaw d) (ξ : ℕ) {X : RegCoeffField d → ℝ} + (hX : ∀ a, 0 ≤ X a) : + 0 ≤ annealedMomentRoot P ξ X := by + rw [annealedMomentRoot] + exact Real.rpow_nonneg + (MeasureTheory.integral_nonneg fun a => pow_nonneg (hX a) ξ) _ + +/-- Monotonicity of the annealed moment root under a.e. domination of +nonnegative observables. -/ +theorem annealedMomentRoot_le_of_ae_nonneg_le {d : ℕ} {P : RestrictionCoeffLaw d} + {ξ : ℕ} {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hX_nonneg : ∀ a, 0 ≤ X a) + (hX_int : Integrable (fun a => X a ^ ξ) P) + (hY_int : Integrable (fun a => Y a ^ ξ) P) + (hXY : X ≤ᵐ[P] Y) : + annealedMomentRoot P ξ X ≤ annealedMomentRoot P ξ Y := by + have hpow : + (fun a => X a ^ ξ) ≤ᵐ[P] fun a => Y a ^ ξ := by + filter_upwards [hXY] with a hle + exact pow_le_pow_left₀ (hX_nonneg a) hle ξ + have hInt_le : + ∫ a, X a ^ ξ ∂P ≤ ∫ a, Y a ^ ξ ∂P := + integral_mono_ae hX_int hY_int hpow + have hIntX_nonneg : 0 ≤ ∫ a, X a ^ ξ ∂P := by + exact integral_nonneg fun a => pow_nonneg (hX_nonneg a) ξ + have hExp_nonneg : 0 ≤ 1 / (ξ : ℝ) := by + positivity + simpa [annealedMomentRoot] using + Real.rpow_le_rpow hIntX_nonneg hInt_le hExp_nonneg + +theorem LambdaMomentAtScale_nonneg {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) {s : ℝ} (ξ : ℕ) + (hs : 0 < s) : + 0 ≤ LambdaMomentAtScale P n s ξ := + annealedMomentRoot_nonneg_of_nonneg P ξ fun a => + LambdaSqCoeffField_finite_nonneg (originCube d n) a hs (by norm_num : (1 : ℝ) ≤ 1) + +theorem lambdaInvMomentAtScale_nonneg {d : ℕ} [NeZero d] + (P : RestrictionCoeffLaw d) (n : ℤ) {s : ℝ} (ξ : ℕ) + (hs : 0 < s) : + 0 ≤ lambdaInvMomentAtScale P n s ξ := + annealedMomentRoot_nonneg_of_nonneg P ξ fun a => + inv_nonneg.mpr + (lambdaSqCoeffField_finite_nonneg (originCube d n) a hs (by norm_num : (1 : ℝ) ≤ 1)) + +private theorem toReal_eLpNorm_eq_integral_abs_pow_rpow_inv + {Ω : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} {f : Ω → ℝ} {p : ℕ} + (hp : 1 ≤ p) (hf : AEStronglyMeasurable f μ) + (hLp_int : Integrable (fun ω => |f ω| ^ p) μ) : + ENNReal.toReal (eLpNorm f (p : ENNReal) μ) = + (∫ ω, |f ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_nat_ne_zero : p ≠ 0 := by omega + have h_memLp : MemLp f (p : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff hf + (by exact_mod_cast hp_nat_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have hnonneg : + 0 ≤ (∫ a, ‖f a‖ ^ (p : ENNReal).toReal ∂μ) ^ + (p : ENNReal).toReal⁻¹ := by + positivity + rw [h_memLp.eLpNorm_eq_integral_rpow_norm + (by exact_mod_cast hp_nat_ne_zero) (by simp), + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, one_div] + +/-- Root decomposition for a nonnegative observable controlled by a +deterministic base plus a nonnegative error: +`||X||_ξ <= A + ||E||_ξ` when `X <= A + E`. + +This is the Ch4-owned scalar Minkowski step used in the Section 5.2 moment +lemma. -/ +theorem annealedMomentRoot_le_const_add_of_nonneg_le + {d : ℕ} {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X E : RegCoeffField d → ℝ} {A : ℝ} + (hξ : 1 ≤ ξ) (hA_nonneg : 0 ≤ A) + (hX_nonneg : ∀ a, 0 ≤ X a) + (hE_nonneg : ∀ a, 0 ≤ E a) + (hX_le : ∀ a, X a ≤ A + E a) + (hX_meas : AEMeasurable X P) + (hE_meas : AEMeasurable E P) + (hX_int : Integrable (fun a => |X a| ^ ξ) P) + (hE_int : Integrable (fun a => |E a| ^ ξ) P) : + annealedMomentRoot P ξ X ≤ A + annealedMomentRoot P ξ E := by + have hξ_enn : (1 : ENNReal) ≤ (ξ : ENNReal) := by exact_mod_cast hξ + have hξ_ne : ξ ≠ 0 := by omega + have hE_memLp : MemLp E (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hE_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hE_int + have hP_ne_zero : (P : Measure (RegCoeffField d)) ≠ 0 := by + exact IsProbabilityMeasure.ne_zero P + have hConst_toReal : + ENNReal.toReal (eLpNorm (fun _ : RegCoeffField d => A) (ξ : ENNReal) P) = A := by + have hξ_enn_ne_zero : (ξ : ENNReal) ≠ 0 := by exact_mod_cast hξ_ne + rw [MeasureTheory.eLpNorm_const (μ := P) (c := A) (p := (ξ : ENNReal)) + hξ_enn_ne_zero hP_ne_zero] + simp [IsProbabilityMeasure.measure_univ, Real.norm_eq_abs, abs_of_nonneg hA_nonneg] + have hConst_ne_top : + eLpNorm (fun _ : RegCoeffField d => A) (ξ : ENNReal) P ≠ ⊤ := by + have hξ_enn_ne_zero : (ξ : ENNReal) ≠ 0 := by exact_mod_cast hξ_ne + rw [MeasureTheory.eLpNorm_const (μ := P) (c := A) (p := (ξ : ENNReal)) + hξ_enn_ne_zero hP_ne_zero] + simp + have hX_toReal : + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) = + annealedMomentRoot P ξ X := by + calc + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) + = (∫ a, |X a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := + toReal_eLpNorm_eq_integral_abs_pow_rpow_inv hξ + hX_meas.aestronglyMeasurable hX_int + _ = (∫ a, X a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae + (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hX_nonneg a)]) + _ = annealedMomentRoot P ξ X := rfl + have hE_toReal : + ENNReal.toReal (eLpNorm E (ξ : ENNReal) P) = + annealedMomentRoot P ξ E := by + calc + ENNReal.toReal (eLpNorm E (ξ : ENNReal) P) + = (∫ a, |E a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := + toReal_eLpNorm_eq_integral_abs_pow_rpow_inv hξ + hE_meas.aestronglyMeasurable hE_int + _ = (∫ a, E a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae + (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hE_nonneg a)]) + _ = annealedMomentRoot P ξ E := rfl + have hmono : + eLpNorm X (ξ : ENNReal) P ≤ + eLpNorm (fun a : RegCoeffField d => A + E a) (ξ : ENNReal) P := + MeasureTheory.eLpNorm_mono fun a => by + have hX_abs : |X a| = X a := abs_of_nonneg (hX_nonneg a) + have hAE_nonneg : 0 ≤ A + E a := add_nonneg hA_nonneg (hE_nonneg a) + have hAE_abs : |A + E a| = A + E a := abs_of_nonneg hAE_nonneg + simpa [Real.norm_eq_abs, hX_abs, hAE_abs] using hX_le a + have hadd : + eLpNorm (fun a : RegCoeffField d => A + E a) (ξ : ENNReal) P ≤ + eLpNorm (fun _ : RegCoeffField d => A) (ξ : ENNReal) P + + eLpNorm E (ξ : ENNReal) P := by + simpa [Pi.add_apply] using! + (MeasureTheory.eLpNorm_add_le + (aestronglyMeasurable_const (μ := P) (b := A)) + hE_meas.aestronglyMeasurable hξ_enn) + have hsum_ne_top : + eLpNorm (fun _ : RegCoeffField d => A) (ξ : ENNReal) P + + eLpNorm E (ξ : ENNReal) P ≠ ⊤ := + ENNReal.add_ne_top.mpr ⟨hConst_ne_top, hE_memLp.2.ne⟩ + calc + annealedMomentRoot P ξ X = + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) := hX_toReal.symm + _ ≤ ENNReal.toReal + (eLpNorm (fun _ : RegCoeffField d => A) (ξ : ENNReal) P + + eLpNorm E (ξ : ENNReal) P) := + ENNReal.toReal_mono hsum_ne_top (le_trans hmono hadd) + _ = A + annealedMomentRoot P ξ E := by + rw [ENNReal.toReal_add hConst_ne_top hE_memLp.2.ne, hConst_toReal, hE_toReal] + +/-- Internal primitive factor bounds imply `Theta_n <= widetildeTheta_n`. -/ +theorem Internal.annealedThetaAtScaleOfPrimitive_le_widetildeThetaAtScale_of_factor_bounds + {d : ℕ} [NeZero d] {P : RestrictionCoeffLaw d} {n : ℤ} + {sUpper sLower : ℝ} {ξ : ℕ} + (primitive : Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (hsUpper : 0 < sUpper) + (hUpper : Internal.barBAtScaleOfPrimitive primitive ≤ + LambdaMomentAtScale P n sUpper ξ) + (hStarInv_nonneg : 0 ≤ Internal.barSigmaStarInvAtScaleOfPrimitive primitive) + (hLower : Internal.barSigmaStarInvAtScaleOfPrimitive primitive ≤ + lambdaInvMomentAtScale P n sLower ξ) : + Internal.annealedThetaAtScaleOfPrimitive primitive ≤ + widetildeThetaAtScale P n sUpper sLower ξ := by + exact mul_le_mul hUpper hLower hStarInv_nonneg + (LambdaMomentAtScale_nonneg P n ξ hsUpper) + +end + +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch04/TriadicCubeTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/TriadicCubeTranslation.lean new file mode 100644 index 0000000000..4ac6e7d722 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch04/TriadicCubeTranslation.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition + +/-! # Triadic Cube Translation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch04 + +noncomputable section + +/-- Integer shift taking a nonnegative-scale origin cube to a cube at the same +scale. -/ +def scaleTranslationShift {d : ℕ} (k : ℤ) (R : TriadicCube d) : Fin d → ℤ := + fun i => Int.ofNat (3 ^ Int.toNat k) * R.index i + +/-- At nonnegative scale, every triadic cube is an integer translate of the +origin cube at the same scale. -/ +theorem cubeSet_eq_translateSet_originCube_of_nonneg_scale {d : ℕ} + {R : TriadicCube d} (hk : 0 ≤ R.scale) : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := by + calc + cubeSet R = + translateSet (fun i => (R.index i : ℝ) * cubeScaleFactor R) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_triadicCube R + _ = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := by + congr 1 + funext i + have hpow : + (((Int.ofNat (3 ^ Int.toNat R.scale) : ℤ) : ℝ)) = cubeScaleFactor R := by + calc + (((Int.ofNat (3 ^ Int.toNat R.scale) : ℤ) : ℝ)) + = (((3 ^ Int.toNat R.scale : ℕ) : ℝ)) := by + simp + _ = (3 : ℝ) ^ Int.toNat R.scale := by + simp [Nat.cast_pow] + _ = (3 : ℝ) ^ R.scale := by + symm + calc + (3 : ℝ) ^ R.scale = (3 : ℝ) ^ ((Int.toNat R.scale : ℤ)) := by + rw [Int.toNat_of_nonneg hk] + _ = (3 : ℝ) ^ Int.toNat R.scale := by + rw [zpow_natCast] + _ = cubeScaleFactor R := by + simp [cubeScaleFactor] + calc + (R.index i : ℝ) * cubeScaleFactor R + = (R.index i : ℝ) * + (((Int.ofNat (3 ^ Int.toNat R.scale) : ℤ) : ℝ)) := by + rw [hpow.symm] + _ = (((Int.ofNat (3 ^ Int.toNat R.scale) : ℤ) : ℝ)) * + (R.index i : ℝ) := by + ring + _ = intVecToRealVec (scaleTranslationShift R.scale R) i := by + simp [intVecToRealVec, scaleTranslationShift] + +/-- Descendants of the origin cube at a fixed scale have that scale. -/ +theorem scale_eq_of_mem_descendantsAtScale_originCube {d : ℕ} + {n m : ℤ} {R : TriadicCube d} (hnm : n ≤ m) + (hR : R ∈ descendantsAtScale (originCube d m) n) : + R.scale = n := by + calc + R.scale = (originCube d m).scale - Int.toNat ((originCube d m).scale - n) := by + exact scale_eq_sub_of_mem_descendantsAtScale (Q := originCube d m) hnm hR + _ = m - Int.toNat (m - n) := by + rfl + _ = n := by + rw [Int.toNat_of_nonneg (sub_nonneg.mpr hnm)] + ring + +/-- A descendant of a nonnegative-scale origin cube is an integer translate of +the origin cube at the descendant scale. -/ +theorem cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + {d : ℕ} {n m : ℤ} {R : TriadicCube d} (hn : 0 ≤ n) (hnm : n ≤ m) + (hR : R ∈ descendantsAtScale (originCube d m) n) : + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + have hscaleR : R.scale = n := + scale_eq_of_mem_descendantsAtScale_originCube hnm hR + have hscale_nonneg : 0 ≤ R.scale := by + simpa [hscaleR] using hn + calc + cubeSet R = + translateSet (intVecToRealVec (scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale)) := + cubeSet_eq_translateSet_originCube_of_nonneg_scale hscale_nonneg + _ = + translateSet (intVecToRealVec (scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + simp [hscaleR] + +end +end Ch04 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05.lean new file mode 100644 index 0000000000..b4c70aef87 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems + +/-! # Ch05 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 + +/-! +# Chapter 5 reboot scaffold + +The previous Chapter 5 implementation has been archived under +`Archive/Ch05_legacy_2026_05_16`. Active Chapter 5 is intentionally rebuilt +from a small theorem surface and a quarantined Ch4 boundary. + +Active Ch5 code must not import legacy Ch5 modules, Ch5 measurability or +identification wrapper files, or unapproved Ch4 compatibility lanes. Run +`scripts/audit_ch5_boundary.sh` before committing Ch5 work. +-/ + +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Definitions.lean new file mode 100644 index 0000000000..7ae6bb138e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Definitions.lean @@ -0,0 +1,607 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Expectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 + +/-! +# Chapter 5 definitions reboot + +This file is the active Chapter 5 definition surface. Add definitions here +only when they are manuscript-facing and not merely proof plumbing. +-/ + +noncomputable section + +/-- The parameter-only part of the Chapter 5 quantitative coarse-grained +ellipticity input `(P4)`. + +This record remembers only the manuscript parameters and inequalities for +`s_1`, `s_2`, and `\xi`; it deliberately contains no law-specific +integrability data. It is useful for stating constants with the manuscript +dependency `C(d,s_1,s_2,\xi)`. -/ +structure QuantitativeCoarseGrainedEllipticityParams (d : ℕ) : Type where + sUpper : ℝ + sLower : ℝ + xi : ℕ + two_le_dim : 2 ≤ d + sUpper_nonneg : 0 ≤ sUpper + sUpper_lt_one : sUpper < 1 + sLower_nonneg : 0 ≤ sLower + sLower_lt_one : sLower < 1 + xi_gt_two_mul_dim : (2 * d : ℝ) < (xi : ℝ) + sum_lt_one : sUpper + sLower < 1 + dim_div_xi_lt_min : (d : ℝ) / (xi : ℝ) < min sUpper sLower + +namespace QuantitativeCoarseGrainedEllipticityParams + +/-- The exponent `xi` in the parameter-only `(P4)` data is positive. -/ +theorem xi_pos {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < params.xi := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_pos_real : (0 : ℝ) < (params.xi : ℝ) := by + nlinarith [params.xi_gt_two_mul_dim, hd_nonneg] + exact_mod_cast hxi_pos_real + +/-- The exponent `xi` in the parameter-only `(P4)` data is at least two. -/ +theorem two_le_xi {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) : + 2 ≤ params.xi := by + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by + have hd_nat : 1 ≤ d := le_trans (by norm_num : 1 ≤ 2) params.two_le_dim + exact_mod_cast hd_nat + have htwo_le_two_d : (2 : ℝ) ≤ 2 * (d : ℝ) := by nlinarith + have htwo_lt_xi : (2 : ℝ) < (params.xi : ℝ) := + lt_of_le_of_lt htwo_le_two_d params.xi_gt_two_mul_dim + exact_mod_cast htwo_lt_xi.le + +/-- The upper regularity exponent in the parameter-only `(P4)` data is +positive. -/ +theorem sUpper_pos {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < params.sUpper := by + have hd_pos_nat : 0 < d := lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd_pos : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hxi_pos_real : (0 : ℝ) < (params.xi : ℝ) := by + exact_mod_cast params.xi_pos + have hdiv_pos : 0 < (d : ℝ) / (params.xi : ℝ) := div_pos hd_pos hxi_pos_real + exact lt_trans hdiv_pos + (lt_of_lt_of_le params.dim_div_xi_lt_min (min_le_left _ _)) + +/-- The lower regularity exponent in the parameter-only `(P4)` data is +positive. -/ +theorem sLower_pos {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < params.sLower := by + have hd_pos_nat : 0 < d := lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd_pos : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hxi_pos_real : (0 : ℝ) < (params.xi : ℝ) := by + exact_mod_cast params.xi_pos + have hdiv_pos : 0 < (d : ℝ) / (params.xi : ℝ) := div_pos hd_pos hxi_pos_real + exact lt_trans hdiv_pos + (lt_of_lt_of_le params.dim_div_xi_lt_min (min_le_right _ _)) + +/-- The parameter-only `(P4)` lower endpoint gives `d / xi < sUpper`. -/ +theorem dim_div_xi_lt_sUpper {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (d : ℝ) / (params.xi : ℝ) < params.sUpper := + lt_of_lt_of_le params.dim_div_xi_lt_min (min_le_left _ _) + +/-- The parameter-only `(P4)` lower endpoint gives `d / xi < sLower`. -/ +theorem dim_div_xi_lt_sLower {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (d : ℝ) / (params.xi : ℝ) < params.sLower := + lt_of_lt_of_le params.dim_div_xi_lt_min (min_le_right _ _) + +end QuantitativeCoarseGrainedEllipticityParams + +/-- The Chapter 5 quantitative coarse-grained ellipticity input `(P4)`. + +The fields `sUpper`, `sLower`, and `xi` are the manuscript parameters +`s_1`, `s_2`, and `\xi`. The last two fields encode finiteness of the unit-cube +moments in `(P4)` as integrability of the corresponding powers. -/ +structure QuantitativeCoarseGrainedEllipticity {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) : Type where + sUpper : ℝ + sLower : ℝ + xi : ℕ + two_le_dim : 2 ≤ d + sUpper_nonneg : 0 ≤ sUpper + sUpper_lt_one : sUpper < 1 + sLower_nonneg : 0 ≤ sLower + sLower_lt_one : sLower < 1 + xi_gt_two_mul_dim : (2 * d : ℝ) < (xi : ℝ) + sum_lt_one : sUpper + sLower < 1 + dim_div_xi_lt_min : (d : ℝ) / (xi : ℝ) < min sUpper sLower + upper_moment_integrable : + MeasureTheory.Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (0 : ℤ)) sUpper (.finite 1) a) ^ xi) P + lower_inv_moment_integrable : + MeasureTheory.Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (0 : ℤ)) sLower (.finite 1) a)⁻¹) ^ xi) P + +namespace QuantitativeCoarseGrainedEllipticity + +/-- Forget the law-specific integrability part of `(P4)`, retaining only the +manuscript parameters and inequalities. -/ +def params {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + QuantitativeCoarseGrainedEllipticityParams d where + sUpper := hP4.sUpper + sLower := hP4.sLower + xi := hP4.xi + two_le_dim := hP4.two_le_dim + sUpper_nonneg := hP4.sUpper_nonneg + sUpper_lt_one := hP4.sUpper_lt_one + sLower_nonneg := hP4.sLower_nonneg + sLower_lt_one := hP4.sLower_lt_one + xi_gt_two_mul_dim := hP4.xi_gt_two_mul_dim + sum_lt_one := hP4.sum_lt_one + dim_div_xi_lt_min := hP4.dim_div_xi_lt_min + +@[simp] +theorem params_sUpper {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.params.sUpper = hP4.sUpper := rfl + +@[simp] +theorem params_sLower {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.params.sLower = hP4.sLower := rfl + +@[simp] +theorem params_xi {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.params.xi = hP4.xi := rfl + +/-- The exponent `xi` in `(P4)` is positive. -/ +theorem xi_pos {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.xi := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_pos_real : (0 : ℝ) < (hP4.xi : ℝ) := by + nlinarith [hP4.xi_gt_two_mul_dim, hd_nonneg] + exact_mod_cast hxi_pos_real + +/-- The exponent `xi` in `(P4)` is at least two. -/ +theorem two_le_xi {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 2 ≤ hP4.xi := by + have hd_one : (1 : ℝ) ≤ (d : ℝ) := by + have hd_nat : 1 ≤ d := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_dim + exact_mod_cast hd_nat + have htwo_le_two_d : (2 : ℝ) ≤ 2 * (d : ℝ) := by nlinarith + have htwo_lt_xi : (2 : ℝ) < (hP4.xi : ℝ) := + lt_of_le_of_lt htwo_le_two_d hP4.xi_gt_two_mul_dim + exact_mod_cast htwo_lt_xi.le + +/-- The upper regularity exponent in `(P4)` is positive. -/ +theorem sUpper_pos {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sUpper := by + have hd_pos_nat : 0 < d := lt_of_lt_of_le (by norm_num : 0 < 2) hP4.two_le_dim + have hd_pos : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hxi_pos_real : (0 : ℝ) < (hP4.xi : ℝ) := by + exact_mod_cast hP4.xi_pos + have hdiv_pos : 0 < (d : ℝ) / (hP4.xi : ℝ) := div_pos hd_pos hxi_pos_real + exact lt_trans hdiv_pos + (lt_of_lt_of_le hP4.dim_div_xi_lt_min (min_le_left _ _)) + +/-- The lower regularity exponent in `(P4)` is positive. -/ +theorem sLower_pos {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sLower := by + have hd_pos_nat : 0 < d := lt_of_lt_of_le (by norm_num : 0 < 2) hP4.two_le_dim + have hd_pos : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hxi_pos_real : (0 : ℝ) < (hP4.xi : ℝ) := by + exact_mod_cast hP4.xi_pos + have hdiv_pos : 0 < (d : ℝ) / (hP4.xi : ℝ) := div_pos hd_pos hxi_pos_real + exact lt_trans hdiv_pos + (lt_of_lt_of_le hP4.dim_div_xi_lt_min (min_le_right _ _)) + +/-- The P4 lower endpoint gives `d / xi < sUpper`. -/ +theorem dim_div_xi_lt_sUpper {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (d : ℝ) / (hP4.xi : ℝ) < hP4.sUpper := + lt_of_lt_of_le hP4.dim_div_xi_lt_min (min_le_left _ _) + +/-- The P4 lower endpoint gives `d / xi < sLower`. -/ +theorem dim_div_xi_lt_sLower {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (d : ℝ) / (hP4.xi : ℝ) < hP4.sLower := + lt_of_lt_of_le hP4.dim_div_xi_lt_min (min_le_right _ _) + +/-- The upper geometric-series denominator in the Section 5.2 moment lemma is +positive under `(P4)`. -/ +theorem upperMomentDenom_pos {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sUpper := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg hd_nonneg hxi_nonneg + linarith [hP4.sUpper_lt_one] + +/-- The lower geometric-series denominator in the Section 5.2 moment lemma is +positive under `(P4)`. -/ +theorem lowerMomentDenom_pos {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sLower := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg hd_nonneg hxi_nonneg + linarith [hP4.sLower_lt_one] + +end QuantitativeCoarseGrainedEllipticity + +/-- The scalar contrast `Theta_n = \bar\sigma_n \bar\sigma_{*,n}^{-1}`, +read from the Chapter 4 structural-law scalar surface. -/ +noncomputable def thetaAtScale {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (n : ℤ) : ℝ := + hP.thetaAtScale hStruct n + +@[simp] +theorem thetaAtScale_eq {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (n : ℤ) : + thetaAtScale hP hStruct n = hP.thetaAtScale hStruct n := + rfl + +/-- The high-moment contrast `widetildeTheta_n` with the parameters supplied by +the Chapter 5 quantitative ellipticity input. -/ +noncomputable def widetildeThetaAtScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + Ch04.widetildeThetaAtScale P n hP4.sUpper hP4.sLower hP4.xi + +@[simp] +theorem widetildeThetaAtScale_eq {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + widetildeThetaAtScale P n hP4 = + Ch04.widetildeThetaAtScale P n hP4.sUpper hP4.sLower hP4.xi := + rfl + +/-- The positive excess of the upper ellipticity moment over the unit-scale +structural-law scalar upper coefficient. -/ +noncomputable def LambdaPositiveExcessMomentAtScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : ℝ := + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + max + (Ch04.LambdaSqCoeffField (originCube d n) s (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) + +@[simp] +theorem LambdaPositiveExcessMomentAtScale_eq {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : + LambdaPositiveExcessMomentAtScale P n s ξ hP hStruct = + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + max + (Ch04.LambdaSqCoeffField (originCube d n) s (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) := + rfl + +/-- The positive excess of the lower inverse ellipticity moment over the +unit-scale structural-law inverse-star coefficient. -/ +noncomputable def lambdaInvPositiveExcessMomentAtScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : ℝ := + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + max + ((Ch04.lambdaSqCoeffField (originCube d n) s (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) + +@[simp] +theorem lambdaInvPositiveExcessMomentAtScale_eq {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : + lambdaInvPositiveExcessMomentAtScale P n s ξ hP hStruct = + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + max + ((Ch04.lambdaSqCoeffField (originCube d n) s (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) := + rfl + +/-- The displayed positive-excess coefficient in Section 5.2: +`C xi / (d / 2 + d / xi - s) * 3^{-(s - d / xi)m}`. -/ +noncomputable def section52MomentBoundCoeff + (d ξ : ℕ) (C s : ℝ) (m : ℕ) : ℝ := + C * (ξ : ℝ) / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + +/-- The corrected two-exponent Section 5.2 moment-loss factor +`\Gamma_{s,r,\xi}`. Here `s` is the unit-scale source exponent and `r` is the +tracked exponent at scale `m`. -/ +noncomputable def section52MomentLossCoeff + (d ξ : ℕ) (s r : ℝ) : ℝ := + s⁻¹ ^ 2 * + ((ξ : ℝ) / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) + + (r - s)⁻¹ ^ 2) + +/-- The corrected two-exponent positive-excess coefficient in Section 5.2: +`C Gamma_{s,r,xi} * 3^{-(r - d / xi)m}`. -/ +noncomputable def section52TwoExponentMomentBoundCoeff + (d ξ : ℕ) (C s r : ℝ) (m : ℕ) : ℝ := + C * section52MomentLossCoeff d ξ s r * + Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + +/-- The displayed `widetildeTheta` error coefficient in Section 5.2: +`C xi^2 3^{-(sMin - d / xi)m}`. -/ +noncomputable def section52WidetildeThetaErrorCoeff + (d ξ : ℕ) (C sMin : ℝ) (m : ℕ) : ℝ := + C * (ξ : ℝ) ^ 2 * + Real.rpow (3 : ℝ) (-(sMin - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + +/-- The combined coefficient before the common Section 5.2 +`widetildeTheta` scale. -/ +noncomputable def section52WidetildeThetaCombinedCoeff + (d ξ : ℕ) (CUpper CLower sUpper sLower : ℝ) : ℝ := + CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) + + CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower) + + (CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper)) * + (CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower)) + +/-- The annealed additivity defect +`tau_{n,k}(p,q) = E[J(cu_k,p,q)] - E[J(cu_n,p,q)]`. -/ +noncomputable def tauAtScale {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (n k : ℤ) (p q : Vec d) : ℝ := + Ch04.annealedResponseJAtScale P k p q - + Ch04.annealedResponseJAtScale P n p q + +@[simp] +theorem tauAtScale_eq {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (n k : ℤ) (p q : Vec d) : + tauAtScale P n k p q = + Ch04.annealedResponseJAtScale P k p q - + Ch04.annealedResponseJAtScale P n p q := + rfl + +/-- The scalar geometric mean +`\widehat\sigma_m = (\bar\sigma_m \bar\sigma_{*,m})^{1/2}`. -/ +noncomputable def sigmaHatAtScale {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : ℝ := + Real.sqrt (hP.barSigmaAtScale hStruct m * hP.barSigmaStarAtScale hStruct m) + +@[simp] +theorem sigmaHatAtScale_eq {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + sigmaHatAtScale hP hStruct m = + Real.sqrt (hP.barSigmaAtScale hStruct m * hP.barSigmaStarAtScale hStruct m) := + rfl + +/-- The special vector `p_e = \widehat\sigma_m^{-1/2} e`. -/ +noncomputable def specialPAtScale {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (e : Vec d) : Vec d := + Real.rpow (sigmaHatAtScale hP hStruct m) (-(1 / 2 : ℝ)) • e + +@[simp] +theorem specialPAtScale_eq {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (e : Vec d) : + specialPAtScale hP hStruct m e = + Real.rpow (sigmaHatAtScale hP hStruct m) (-(1 / 2 : ℝ)) • e := + rfl + +/-- The special vector `q_e = \widehat\sigma_m^{1/2} e`. -/ +noncomputable def specialQAtScale {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (e : Vec d) : Vec d := + Real.rpow (sigmaHatAtScale hP hStruct m) (1 / 2 : ℝ) • e + +@[simp] +theorem specialQAtScale_eq {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (e : Vec d) : + specialQAtScale hP hStruct m e = + Real.rpow (sigmaHatAtScale hP hStruct m) (1 / 2 : ℝ) • e := + rfl + +/-- The scalar centering term +`1/2 * (\bar\sigma_{*,m}^{-1} q - p) · (q - \bar\sigma_m p)`. -/ +noncomputable def scalarizedResponseCenteringTerm {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : ℝ := + (1 / 2 : ℝ) * + vecDot (((hP.barSigmaStarAtScale hStruct m)⁻¹ • q) - p) + (q - hP.barSigmaAtScale hStruct m • p) + +@[simp] +theorem scalarizedResponseCenteringTerm_eq {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : + scalarizedResponseCenteringTerm hP hStruct m p q = + (1 / 2 : ℝ) * + vecDot (((hP.barSigmaStarAtScale hStruct m)⁻¹ • q) - p) + (q - hP.barSigmaAtScale hStruct m • p) := + rfl + +/-- The scalarized expectation formula for the annealed response: +`1/2 q · \bar\sigma_*^{-1} q - p · q + 1/2 p · \bar\sigma p`. -/ +noncomputable def expectedJScalarFormula {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : ℝ := + (1 / 2 : ℝ) * vecDot q ((hP.barSigmaStarAtScale hStruct m)⁻¹ • q) - + vecDot p q + + (1 / 2 : ℝ) * vecDot p (hP.barSigmaAtScale hStruct m • p) + +@[simp] +theorem expectedJScalarFormula_eq {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : + expectedJScalarFormula hP hStruct m p q = + (1 / 2 : ℝ) * vecDot q ((hP.barSigmaStarAtScale hStruct m)⁻¹ • q) - + vecDot p q + + (1 / 2 : ℝ) * vecDot p (hP.barSigmaAtScale hStruct m • p) := + rfl + +/-- The scalarized formula for +`tau_{n,k}(p,q) = E[J(cu_k,p,q)] - E[J(cu_n,p,q)]`. -/ +noncomputable def tauScalarFormula {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (n k : ℤ) + (p q : Vec d) : ℝ := + (1 / 2 : ℝ) * + vecDot p ((hP.barSigmaAtScale hStruct k - hP.barSigmaAtScale hStruct n) • p) + + (1 / 2 : ℝ) * + vecDot q (((hP.barSigmaStarAtScale hStruct k)⁻¹ - + (hP.barSigmaStarAtScale hStruct n)⁻¹) • q) + +@[simp] +theorem tauScalarFormula_eq {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (n k : ℤ) + (p q : Vec d) : + tauScalarFormula hP hStruct n k p q = + (1 / 2 : ℝ) * + vecDot p ((hP.barSigmaAtScale hStruct k - hP.barSigmaAtScale hStruct n) • p) + + (1 / 2 : ℝ) * + vecDot q (((hP.barSigmaStarAtScale hStruct k)⁻¹ - + (hP.barSigmaStarAtScale hStruct n)⁻¹) • q) := + rfl + +/-- The scalarized expectation of the centered response: +`1/2 p · ((Theta_m - 1) q)`. -/ +noncomputable def centeredResponseExpectationFormula {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : ℝ := + (1 / 2 : ℝ) * vecDot p ((thetaAtScale hP hStruct m - 1) • q) + +@[simp] +theorem centeredResponseExpectationFormula_eq {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : + centeredResponseExpectationFormula hP hStruct m p q = + (1 / 2 : ℝ) * vecDot p ((thetaAtScale hP hStruct m - 1) • q) := + rfl + +/-- The centered scalar response observable on a deterministic cube, with the +centering scale supplied separately. -/ +noncomputable def restrictionCenteredResponseJObservableCubeSet {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) : RegCoeffField d → ℝ := + fun a => + Ch04.restrictionResponseJObservableCubeSet Q p q a - + scalarizedResponseCenteringTerm hP hStruct m p q + +@[simp] +theorem restrictionCenteredResponseJObservableCubeSet_apply {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : + restrictionCenteredResponseJObservableCubeSet hP hStruct m Q p q a = + Ch04.restrictionResponseJObservableCubeSet Q p q a - + scalarizedResponseCenteringTerm hP hStruct m p q := + rfl + +/-- The centered adjoint scalar response observable on a deterministic cube. -/ +noncomputable def restrictionCenteredResponseJStarObservableCubeSet {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) : RegCoeffField d → ℝ := + fun a => + Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a) - + scalarizedResponseCenteringTerm hP hStruct m p q + +@[simp] +theorem restrictionCenteredResponseJStarObservableCubeSet_apply {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) (a : RegCoeffField d) : + restrictionCenteredResponseJStarObservableCubeSet hP hStruct m Q p q a = + Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a) - + scalarizedResponseCenteringTerm hP hStruct m p q := + rfl + +/-- The expected centered scalar response on the origin cube at scale `m`. -/ +noncomputable def expectedCenteredResponseJAtScale {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : ℝ := + ∫ a, restrictionCenteredResponseJObservableCubeSet hP hStruct m (originCube d m) p q a ∂P + +/-- The expected centered adjoint scalar response on the origin cube at scale +`m`. -/ +noncomputable def expectedCenteredResponseJStarAtScale {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : ℝ := + ∫ a, restrictionCenteredResponseJStarObservableCubeSet hP hStruct m (originCube d m) p q a ∂P + +/-- The first ceiling contribution in the annealed entry scale, depending on +the unit-scale value of `widetildeTheta`. -/ +noncomputable def annealedConvergenceEntryScaleBound {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (C : ℝ) : ℕ := + Nat.ceil (C * (Real.log (2 + widetildeThetaAtScale P (0 : ℤ) hP4)) ^ 2) + +/-- The second ceiling contribution in the annealed entry scale, depending on +the target perturbative accuracy `sigma`. -/ +noncomputable def annealedConvergenceSigmaTailScale + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (C sigma : ℝ) : ℕ := + Nat.ceil (C * (hP4.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4)) + +/-- The entry scale `N_sigma` from the main annealed convergence theorem. -/ +noncomputable def annealedEntryScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C sigma : ℝ) : ℕ := + annealedConvergenceEntryScaleBound P hP4 C + + annealedConvergenceSigmaTailScale P hP4 C sigma + +/-- The algebraic-decay entry scale `N_0` in Theorem +`t.annealed.convergence`. + +This is the two-ceiling scale used after the perturbative entry scale has been +dilated to unit scale and the small-contrast algebraic iteration has been +applied. -/ +noncomputable def annealedAlgebraicEntryScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (C : ℝ) : ℕ := + Nat.ceil (C * (Real.log (2 + widetildeThetaAtScale P (0 : ℤ) hP4)) ^ 2) + + Nat.ceil (C * (hP4.xi : ℝ) * + Real.log (2 + C * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4)) + +end + +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems.lean new file mode 100644 index 0000000000..a5598d43dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Public + +/-! # Theorems -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 + +/-! +# Chapter 5 theorem reboot surface + +Section files in this directory are scaffolds for the rebuilt Chapter 5 proof +lane, following the current manuscript order: + +* Section 5.1: scalar quantities and the main theorem. +* Section 5.2: annealed scalar identities and moment bounds. +* Section 5.3: analytic reduction to coarse-grained fluctuations. +* Section 5.4: good scales and variance bounds. +* Section 5.5: iteration and annealed convergence. +* Section 5.6: small-contrast iteration. +* Section 5.7: quenched minimal scales and perturbative consequences. +-/ + +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Public.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Public.lean new file mode 100644 index 0000000000..b1de2443f6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Public.lean @@ -0,0 +1,346 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyOptimized + +/-! # Public -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Public Chapter 5 minimal-scale theorem + +This file is the public landing zone for the quenched minimal-scale theorem. +The proof-internal Section 5.7 development exposes separate finite-`sigma` and +uniform-endpoint statements; the public theorem below packages them as the two +branches of the manuscript theorem. +-/ + +noncomputable section + +/-- Public Chapter 5.7 quenched minimal-scale theorem. + +The first component is the finite-`sigma` statement, with a single algebraic +exponent selected before `sigma` and stochastic exponent +`finiteQuenchedTailExponent d sigma t`. The second component is the +`Gamma_infty` endpoint, with stochastic exponent `d` and the same public +condition `t ≤ 1`. In both branches the minimal-scale constant is selected +before the probability law. The Section 5.7 parameter bundle contains only +`sUpper` and `sLower`; the finite moment exponent needed by older Chapter 5 APIs +is chosen internally. -/ +theorem homogenization_quenched_minimal_scale + {d : ℕ} [NeZero d] + (params : Section57.GammaCoarseGrainedEllipticityParams d) : + (∃ α : ℝ, 0 < α ∧ + ∀ {σ : ℝ}, 0 < σ → + ∀ {t : ℝ}, max params.sUpper params.sLower < t → t ≤ 1 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : Section57.GammaSigmaCoarseGrainedEllipticityNoXi + P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let η : ℝ := Section57.finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + Section57.localizedLimitNormalizedJMax + hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α)) ∧ + (∃ α : ℝ, 0 < α ∧ + ∀ {t : ℝ}, + max params.sUpper params.sLower < t → + t ≤ 1 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : Section57.GammaInfinityCoarseGrainedEllipticityNoXi + P hP hStruct), + hInf.params = params → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + Section57.localizedLimitNormalizedJMax + hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α)) := by + constructor + · obtain ⟨α, hα, _hαmax, hfinite⟩ := + Section57.exists_quenchedLocalizedEstimate_interpolated_expLogSq_uniformAnnealedExponent + (d := d) params.toQuantitativeParams + refine ⟨α, hα, ?_⟩ + intro σ hσ t ht ht_one + obtain ⟨Cscale, hCscale, hscale⟩ := hfinite hσ ht ht_one + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let hΓold : Section57.GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hΓ.withInternalXi + have hσ_old : hΓold.sigma = σ := by + simpa [hΓold] using hσ_eq + have hparams_old : hΓold.params = params.toQuantitativeParams := by + dsimp [hΓold, Section57.GammaSigmaCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + obtain ⟨X, hX, hX_one, hmain⟩ := + hscale hP hStruct hΓold hσ_old hparams_old + exact ⟨X, by simpa [hΓold] using hX, hX_one, hmain⟩ + · obtain ⟨α, hα, _hαmax, hendpoint⟩ := + Section57.exists_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + (d := d) params.toQuantitativeParams + refine ⟨α, hα, ?_⟩ + intro t ht ht_one + have ht_dim : t ≤ (d : ℝ) / 2 := by + have hd : (2 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast params.two_le_dim + have hone_le_dim_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by + nlinarith + exact ht_one.trans hone_le_dim_half + obtain ⟨Cscale, hCscale, hscale⟩ := hendpoint ht ht_dim + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hInf hparams + let hInfOld : Section57.GammaInfinityCoarseGrainedEllipticity P hP hStruct := + hInf.withInternalXi + have hparams_old : hInfOld.params = params.toQuantitativeParams := by + dsimp [hInfOld, Section57.GammaInfinityCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + obtain ⟨X, hX, hX_one, hmain⟩ := + hscale hP hStruct hInfOld hparams_old + exact ⟨X, by simpa [hInfOld] using hX, hX_one, hmain⟩ + +/-- Public Chapter 5.7 quenched homogenization comparison theorem. + +This is the public Ch3-facing consequence of the minimal-scale theorem, +stated in the manuscript's simplified two-parameter form: `t` is the +stochastic integrability dial and `s` is both the negative Besov comparison +exponent and the force regularity exponent, subject to `s₁ ∨ s₂ < t` and +`4t < s < 1`. The coarse-graining exponent `r = t + s / 4`, the discount +exponent `τ = 2t`, and the localization depth `j` of the compressed +two-exponent RHS are all chosen inside the proof; the depth is optimized so +that the RHS collapses to a single constant times `(3^m / X)^(-α)` times the +two natural data norms. The finite branch has stochastic exponent +`finiteQuenchedTailExponent d sigma t` (the interpolated min collapses by +monotonicity in the discount); the uniform endpoint has exponent `d`. The +exponent `α` is selected before `sigma` and is already the relabeled +post-optimization exponent. -/ +theorem homogenization_quenched_homogenization_comparison + {d : ℕ} [NeZero d] + (params : Section57.GammaCoarseGrainedEllipticityParams d) : + (∃ α : ℝ, 0 < α ∧ + ∀ {σ t s : ℝ}, 0 < σ → + max params.sUpper params.sLower < t → + 4 * t < s → + s < 1 → + ∃ C Cscale : ℝ, 0 < C ∧ 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : Section57.GammaSigmaCoarseGrainedEllipticityNoXi + P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma (Section57.finiteQuenchedTailExponent d σ t)) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (w : Section57.assemblyComparisonDatum + hP hStruct hΓ.withInternalXi aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity + (Section57.assemblyOriginCube d m) s g → + Ch03.homogenizationComparisonNegativeBesovLHS + (Section57.assemblyOriginCube d m) + (Section57.assemblyCoeffFamily aω ha) + (Section57.assemblyConstantCoeffMatrix + hP hStruct hΓ.withInternalXi) + s w.u w.v ≤ + Section57.assemblyHomogenizationComparisonRHS + hP hStruct hΓ.withInternalXi + C α s X aω ha m g w) ∧ + (∃ α : ℝ, 0 < α ∧ + ∀ {t s : ℝ}, + max params.sUpper params.sLower < t → + 4 * t < s → + s < 1 → + ∃ C Cscale : ℝ, 0 < C ∧ 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : Section57.GammaInfinityCoarseGrainedEllipticityNoXi + P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma ((d : ℕ) : ℝ)) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (w : Section57.assemblyComparisonDatumOfScalar + (Section57.barSigmaLimit hP hStruct) + (hInf.withInternalXi.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity + (Section57.assemblyOriginCube d m) s g → + Ch03.homogenizationComparisonNegativeBesovLHS + (Section57.assemblyOriginCube d m) + (Section57.assemblyCoeffFamily aω ha) + (Section57.assemblyConstantCoeffMatrixOfScalar + (Section57.barSigmaLimit hP hStruct) + (hInf.withInternalXi.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos) + s w.u w.v ≤ + Section57.assemblyHomogenizationComparisonRHSOfScalar + (Section57.barSigmaLimit hP hStruct) + (hInf.withInternalXi.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + C α s X aω ha m g w) := by + constructor + · obtain ⟨Ccg, α₀, hCcg, hα₀, hα₀max, hfinite⟩ := + Section57.exists_homogenizationComparison_compressedTwoExponentRHS_interpolated_expLogSq + (d := d) params.toQuantitativeParams + refine ⟨α₀ / 8, by positivity, ?_⟩ + intro σ t s hσ ht hts hs_one + have hα₀max' : α₀ < max params.sUpper params.sLower := by + simpa using hα₀max + have hα₀t : α₀ < t := hα₀max'.trans ht + have ht0 : 0 < t := by + exact (lt_of_lt_of_le params.sUpper_pos (le_max_left _ _)).trans ht + have hs_pos : 0 < s := by linarith + let r : ℝ := t + s / 4 + have hτr : 2 * t < r := by dsimp [r]; linarith + have hrs : r < s / 2 := by dsimp [r]; linarith + have hrrs : 3 / 2 * r ≤ s := by dsimp [r]; linarith + have hr_pos : 0 < r := by linarith + have hr_le_s : r ≤ s := by linarith + have hτ2 : max params.sUpper params.sLower < 2 * t / 2 := by linarith + have hατ : α₀ < 2 * t / 2 := by linarith + have hτ_one : 2 * t ≤ 1 := by linarith + obtain ⟨Cclean, hCclean, hclean⟩ := + Section57.exists_compressedTwoExponentRHS_le_homogenizationComparisonRHS + d hCcg hα₀ (by linarith : (0 : ℝ) < 2 * t) hτr hs_pos hr_pos hrs + hs_one hrrs + obtain ⟨Cscale, hCscale, hlaw⟩ := + hfinite hσ hτ2 hατ hτ_one hs_pos hr_pos hrs hs_one hτr hr_le_s + refine ⟨Cclean, Cscale, hCclean, hCscale, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let hΓold : Section57.GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hΓ.withInternalXi + have hσ_old : hΓold.sigma = σ := by + simpa [hΓold] using hσ_eq + have hparams_old : hΓold.params = params.toQuantitativeParams := by + dsimp [hΓold, Section57.GammaSigmaCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + obtain ⟨X, hX, hX_one, hmain⟩ := + hlaw hP hStruct hΓold hσ_old hparams_old + have hηeq : + min (Section57.finiteQuenchedTailExponent d σ (2 * t)) + (Section57.finiteQuenchedTailExponent d σ (2 * t / 2)) = + Section57.finiteQuenchedTailExponent d σ t := by + rw [show (2 * t / 2 : ℝ) = t by ring] + exact min_eq_right + (Section57.finiteQuenchedTailExponent_le_of_le hσ ht0 + (by linarith : t ≤ 2 * t)) + refine ⟨X, ?_, hX_one, ?_⟩ + · rw [← hηeq] + simpa [hΓold] using hX + · filter_upwards [hmain] with aω haω + intro ha m g w hXm hg + have hstep := + haω ha (m := m) + (j := Section57.assemblyOptimizedDepth α₀ r X aω m) (g := g) w hXm hg + have hcompress := + hclean (σ0 := Section57.barSigmaLimit hP hStruct) + hΓold.barSigmaLimit_pos X aω ha m g w (hX_one aω) hXm hg + refine hstep.trans ?_ + simpa [Section57.assemblyCompressedTwoExponentRHS, + Section57.assemblyHomogenizationComparisonRHS, hΓold] using hcompress + · obtain ⟨Ccg, α₀, hCcg, hα₀, hα₀max, hendpoint⟩ := + Section57.exists_homogenizationComparison_compressedTwoExponentRHS_uniformEndpoint_expLogSq + (d := d) params.toQuantitativeParams + refine ⟨α₀ / 8, by positivity, ?_⟩ + intro t s ht hts hs_one + have hα₀max' : α₀ < max params.sUpper params.sLower := by + simpa using hα₀max + have hα₀t : α₀ < t := hα₀max'.trans ht + have ht0 : 0 < t := by + exact (lt_of_lt_of_le params.sUpper_pos (le_max_left _ _)).trans ht + have hs_pos : 0 < s := by linarith + let r : ℝ := t + s / 4 + have hτr : 2 * t < r := by dsimp [r]; linarith + have hrs : r < s / 2 := by dsimp [r]; linarith + have hrrs : 3 / 2 * r ≤ s := by dsimp [r]; linarith + have hr_pos : 0 < r := by linarith + have hr_le_s : r ≤ s := by linarith + have hτ2 : max params.sUpper params.sLower < 2 * t / 2 := by linarith + have hατ : α₀ < 2 * t / 2 := by linarith + have hτ_one : 2 * t ≤ 1 := by linarith + obtain ⟨Cclean, hCclean, hclean⟩ := + Section57.exists_compressedTwoExponentRHS_le_homogenizationComparisonRHS + d hCcg hα₀ (by linarith : (0 : ℝ) < 2 * t) hτr hs_pos hr_pos hrs + hs_one hrrs + obtain ⟨Cscale, hCscale, hlaw⟩ := + hendpoint hτ2 hατ hτ_one hs_pos hr_pos hrs hs_one hτr hr_le_s + refine ⟨Cclean, Cscale, hCclean, hCscale, ?_⟩ + intro P hP hStruct hInf hparams + let hInfOld : Section57.GammaInfinityCoarseGrainedEllipticity P hP hStruct := + hInf.withInternalXi + have hparams_old : hInfOld.params = params.toQuantitativeParams := by + dsimp [hInfOld, Section57.GammaInfinityCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + obtain ⟨X, hX, hX_one, hmain⟩ := + hlaw hP hStruct hInfOld hparams_old + refine ⟨X, by simpa [hInfOld] using hX, hX_one, ?_⟩ + filter_upwards [hmain] with aω haω + intro ha m g w hXm hg + have hstep := + haω ha (m := m) + (j := Section57.assemblyOptimizedDepth α₀ r X aω m) (g := g) w hXm hg + have hcompress := + hclean (σ0 := Section57.barSigmaLimit hP hStruct) + (hInfOld.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + X aω ha m g w (hX_one aω) hXm hg + refine hstep.trans ?_ + simpa [hInfOld] using hcompress + +end + +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51.lean new file mode 100644 index 0000000000..7d0d3082be --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.AnnealedConvergence + +/-! # Section51 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +/-! +# Section 5.1: scalar quantities and the main theorem + +This file is the current manuscript's opening theorem surface: the scalar +quantities and the main annealed convergence theorem. + +The perturbative entry theorem formerly exposed here now belongs to Section +5.5 as `Section55.annealedPerturbativeEntry_homogenizationScale`. The main +theorem `t.annealed.convergence` is formalized here by combining that entry +result with Section 5.6 small-contrast algebraic decay. +-/ + +noncomputable section + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/AnnealedConvergence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/AnnealedConvergence.lean new file mode 100644 index 0000000000..59e74702d5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/AnnealedConvergence.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ExponentAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay + +/-! # Annealed Convergence -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +open MeasureTheory +open Section53.JUpperBoundCoarseFluctuations +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Theorem `t.annealed.convergence` + +The main theorem combines the perturbative entry mechanism with the +small-contrast algebraic iteration, applied after shifting the `(P4)` exponents +by the Section 5.3 fluctuation buffer. +-/ + +private def unitCoordinateVector {d : ℕ} [NeZero d] : Vec d := + Pi.single (0 : Fin d) 1 + +private theorem unitCoordinateVector_vecNormSq {d : ℕ} [NeZero d] : + vecNormSq (unitCoordinateVector : Vec d) = 1 := by + rw [unitCoordinateVector, vecNormSq, vecDot, Finset.sum_eq_single (0 : Fin d)] + · simp + · intro j _ hj + simp [Pi.single_eq_of_ne hj] + · simp + +/-- Theorem `t.annealed.convergence`: convergence of the annealed contrast. + +The constants are selected from the quantitative ellipticity parameter record +before the probability law, hence are independent of the law itself. -/ +theorem annealedConvergence_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C α : ℝ, 0 < C ∧ 0 < α ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ n : ℕ, + thetaAtScale hP hStruct + ((annealedAlgebraicEntryScale P hP4 C + n : ℕ) : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + classical + obtain ⟨αsc, δ0, K, hαsc_pos, hδ0_pos, hK_pos, hsmallContrast⟩ := + Section56.SmallContrastAlgebraicDecay.smallContrastAlgebraicDecay_homogenizationScale + (twoBetaShiftedParams params) + let δ : ℝ := min δ0 (1 / 4) + have hδ_pos : 0 < δ := by + dsimp [δ] + exact lt_min hδ0_pos (by norm_num) + have hδ_le_δ0 : δ ≤ δ0 := by dsimp [δ]; exact min_le_left _ _ + have hδ_le_quarter : δ ≤ 1 / 4 := by dsimp [δ]; exact min_le_right _ _ + obtain ⟨Centry, hCentry_pos, hentry⟩ := + shiftedSmallContrastEntry_homogenizationScale params hδ_pos + let R : ℕ := + Nat.ceil (Real.log (max (4 * K) 1) / ((αsc / 2) * Real.log 3)) + let α : ℝ := min (αsc / 2) (((R + 1 : ℕ) : ℝ)⁻¹) + have hα_pos : 0 < α := by + dsimp [α] + exact lt_min (by positivity) (by positivity) + refine ⟨Centry, α, hCentry_pos, hα_pos, ?_⟩ + intro P hP hStruct hP4 hparams n + + -- Enter the small-contrast regime for the shifted exponents at `N`. + let N : ℕ := annealedAlgebraicEntryScale P hP4 Centry + let PN : Ch04.RestrictionCoeffLaw d := Ch04.restrictionScaleNormalizedLaw N P + let hPN : Ch04.RestrictionLawCarrier PN := hP.scaleNormalized N + let hStructN : Ch04.RestrictionStructuralLaw PN := hStruct.scaleNormalized N + let hP4N : QuantitativeCoarseGrainedEllipticity PN := + hP4.scaleNormalized hP hStruct N + let hP4S : QuantitativeCoarseGrainedEllipticity PN := + twoBetaShiftedP4 hPN hStructN hP4N + have hentryN : + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) - 1 ≤ δ := by + have h := hentry hP hStruct hP4 hparams + simpa [N] using h + have hwide_eq : + widetildeThetaAtScale PN (0 : ℤ) hP4S = + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) := by + simpa [PN, hPN, hStructN, hP4N, hP4S] using + widetildeThetaAtScale_zero_scaleNormalized_twoBetaShiftedP4 + hP hStruct hP4 N + have hsmall0_delta : + widetildeThetaAtScale PN (0 : ℤ) hP4S - 1 ≤ δ := by + calc + widetildeThetaAtScale PN (0 : ℤ) hP4S - 1 = + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) - 1 := by + rw [hwide_eq] + _ ≤ δ := hentryN + have hsmall0_δ0 : + widetildeThetaAtScale PN (0 : ℤ) hP4S - 1 ≤ δ0 := + hsmall0_delta.trans hδ_le_δ0 + have hsmall0_quarter : + widetildeThetaAtScale PN (0 : ℤ) hP4S - 1 ≤ 1 / 4 := + hsmall0_delta.trans hδ_le_quarter + have hP4N_params : hP4N.params = params := by + simpa [hP4N, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using! hparams + have hparamsS : hP4S.params = twoBetaShiftedParams params := by + calc + hP4S.params = twoBetaShiftedParams hP4N.params := by + simp [hP4S] + _ = twoBetaShiftedParams params := by rw [hP4N_params] + + -- Apply the Section 5.6 small-contrast theorem to the dilated law. + have htheta_sub_quarter : + thetaAtScale hPN hStructN (n : ℤ) - 1 ≤ 1 / 4 := by + have htheta_delta : + thetaAtScale hPN hStructN (n : ℤ) - 1 ≤ δ := + Section56.SmallContrastAlgebraicDecay.thetaAtScale_sub_one_le_delta_of_widetildeThetaAtScale_zero_sub_one_le_delta + hPN hStructN hP4S hsmall0_delta n + exact htheta_delta.trans hδ_le_quarter + have hwide_two : widetildeThetaAtScale PN (0 : ℤ) hP4S ≤ 2 := by + linarith + let e : Vec d := unitCoordinateVector + have he : vecNormSq e = 1 := by + simpa [e] using unitCoordinateVector_vecNormSq (d := d) + have hJ_upper := hsmallContrast hPN hStructN hP4S hparamsS hsmall0_δ0 n e he + have hJ_lower := + Section56.expectedResponseJCubeSet_special_ge_quarter_theta_sub_one + hPN hStructN hP4S hwide_two n e he + have htheta_sub_decay : + thetaAtScale hPN hStructN (n : ℤ) - 1 ≤ + 4 * K * Real.rpow (3 : ℝ) (-αsc * (n : ℝ)) := by + dsimp only at hJ_upper hJ_lower + nlinarith + + -- Shrink the exponent so the displayed estimate has unit prefactor. + have htheta_sub_unit_decay : + thetaAtScale hPN hStructN (n : ℤ) - 1 ≤ + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + by_cases hnR : n ≤ R + · have hα_le_inv : α ≤ (((R + 1 : ℕ) : ℝ)⁻¹) := by + dsimp [α] + exact min_le_right _ _ + have hαn : α * (n : ℝ) ≤ 1 := + mul_nat_le_one_of_le_inverse_succ hα_le_inv hnR + exact htheta_sub_quarter.trans + (quarter_le_rpow_three_neg_mul_of_mul_nat_le_one hαn) + · have hR_lt_n : R < n := Nat.lt_of_not_ge hnR + have hlarge : + Real.log (max (4 * K) 1) / ((αsc / 2) * Real.log 3) ≤ (n : ℝ) := by + have hceil : + Real.log (max (4 * K) 1) / ((αsc / 2) * Real.log 3) ≤ (R : ℝ) := by + simpa [R] using + Nat.le_ceil + (Real.log (max (4 * K) 1) / ((αsc / 2) * Real.log 3)) + exact hceil.trans (by exact_mod_cast (Nat.le_of_lt hR_lt_n)) + have hpref : + 4 * K * Real.rpow (3 : ℝ) (-αsc * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-(αsc / 2) * (n : ℝ)) := + prefactor_decay_le_half_exponent_decay_of_large + (α₀ := αsc) (K := K) hαsc_pos hlarge + have hhalf_to_alpha : + Real.rpow (3 : ℝ) (-(αsc / 2) * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hα_le_half : α ≤ αsc / 2 := by + dsimp [α] + exact min_le_left _ _ + have hn_nonneg : 0 ≤ (n : ℝ) := by positivity + nlinarith + exact htheta_sub_decay.trans (hpref.trans hhalf_to_alpha) + have hthetaN : + thetaAtScale hPN hStructN (n : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + linarith + + -- Undo the scale normalization. + have hscale : + thetaAtScale hPN hStructN (n : ℤ) = + thetaAtScale hP hStruct ((N + n : ℕ) : ℤ) := by + dsimp [thetaAtScale, hPN, hStructN] + exact hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct N n + have htarget_eq : + thetaAtScale hP hStruct + ((annealedAlgebraicEntryScale P hP4 Centry + n : ℕ) : ℤ) = + thetaAtScale hPN hStructN (n : ℤ) := by + simpa [N] using hscale.symm + rw [htarget_eq] + exact hthetaN + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/EntryScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/EntryScale.lean new file mode 100644 index 0000000000..537dea2061 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/EntryScale.lean @@ -0,0 +1,273 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedConvergence + +/-! # Entry Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Entry-scale arithmetic for Theorem `t.annealed.convergence` + +The lemmas in this file are pure scale bookkeeping: they show that the +manuscript two-ceiling scale with a sufficiently large universal constant +dominates the fixed perturbative entry, shifted-moment tail, and algebraic +burn-in scales. +-/ + +theorem widetildeThetaAtScale_nonneg + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) : + 0 ≤ widetildeThetaAtScale P m hP4 := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos) + +theorem log_two_add_ge_half {T : ℝ} (hT : 0 ≤ T) : + (1 / 2 : ℝ) ≤ Real.log (2 + T) := by + have hlog_two_le : Real.log (2 : ℝ) ≤ Real.log (2 + T) := + Real.log_le_log (by norm_num) + (by simpa using add_le_add_left hT (2 : ℝ)) + have hhalf_le_log_two : (1 / 2 : ℝ) ≤ Real.log (2 : ℝ) := by + linarith [Real.log_two_gt_d9] + exact hhalf_le_log_two.trans hlog_two_le + +theorem log_two_add_nonneg {T : ℝ} (hT : 0 ≤ T) : + 0 ≤ Real.log (2 + T) := by + exact le_trans (by norm_num : (0 : ℝ) ≤ 1 / 2) (log_two_add_ge_half hT) + +theorem natCeil_le_add_one {x : ℝ} (hx : 0 ≤ x) : + (Nat.ceil x : ℝ) ≤ x + 1 := + (Nat.ceil_lt_add_one hx).le + +theorem natCeil_add_nat_le_natCeil_mul_logSq + {A C T : ℝ} {R : ℕ} + (hT : 0 ≤ T) (hA : 0 ≤ A) + (hC : A + 4 * ((R : ℝ) + 1) ≤ C) : + Nat.ceil (A * (Real.log (2 + T)) ^ (2 : ℕ)) + R ≤ + Nat.ceil (C * (Real.log (2 + T)) ^ (2 : ℕ)) := by + let L : ℝ := Real.log (2 + T) + have hL_half : (1 / 2 : ℝ) ≤ L := by + simpa [L] using log_two_add_ge_half hT + have hLsq_nonneg : 0 ≤ L ^ (2 : ℕ) := sq_nonneg L + have hone_le_four_Lsq : (1 : ℝ) ≤ 4 * L ^ (2 : ℕ) := by + have hL_nonneg : 0 ≤ L := le_trans (by norm_num) hL_half + have hsq : (1 / 2 : ℝ) * (1 / 2 : ℝ) ≤ L * L := + mul_le_mul hL_half hL_half (by norm_num) hL_nonneg + calc + (1 : ℝ) = 4 * ((1 / 2 : ℝ) * (1 / 2 : ℝ)) := by norm_num + _ ≤ 4 * (L * L) := mul_le_mul_of_nonneg_left hsq (by norm_num) + _ = 4 * L ^ (2 : ℕ) := by ring + have hx_nonneg : 0 ≤ A * L ^ (2 : ℕ) := + mul_nonneg hA hLsq_nonneg + have hceil_left : + (Nat.ceil (A * L ^ (2 : ℕ)) : ℝ) ≤ A * L ^ (2 : ℕ) + 1 := + natCeil_le_add_one hx_nonneg + have hleft_real : + (Nat.ceil (A * L ^ (2 : ℕ)) + R : ℝ) ≤ + C * L ^ (2 : ℕ) := by + have hRplus : + ((R : ℝ) + 1) ≤ 4 * ((R : ℝ) + 1) * L ^ (2 : ℕ) := by + have hR1_nonneg : 0 ≤ (R : ℝ) + 1 := by positivity + have hmul := mul_le_mul_of_nonneg_left hone_le_four_Lsq hR1_nonneg + calc + (R : ℝ) + 1 = ((R : ℝ) + 1) * 1 := by ring + _ ≤ ((R : ℝ) + 1) * (4 * L ^ (2 : ℕ)) := hmul + _ = 4 * ((R : ℝ) + 1) * L ^ (2 : ℕ) := by ring + calc + (Nat.ceil (A * L ^ (2 : ℕ)) + R : ℝ) + = (Nat.ceil (A * L ^ (2 : ℕ)) : ℝ) + (R : ℝ) := by norm_num + _ ≤ A * L ^ (2 : ℕ) + ((R : ℝ) + 1) := by + calc + (Nat.ceil (A * L ^ (2 : ℕ)) : ℝ) + (R : ℝ) + ≤ (A * L ^ (2 : ℕ) + 1) + (R : ℝ) := + add_le_add_left hceil_left (R : ℝ) + _ = A * L ^ (2 : ℕ) + ((R : ℝ) + 1) := by ring + _ ≤ A * L ^ (2 : ℕ) + + 4 * ((R : ℝ) + 1) * L ^ (2 : ℕ) := + add_le_add_right hRplus (A * L ^ (2 : ℕ)) + _ = (A + 4 * ((R : ℝ) + 1)) * L ^ (2 : ℕ) := by ring + _ ≤ C * L ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hC hLsq_nonneg + have hceil_right : + C * L ^ (2 : ℕ) ≤ + (Nat.ceil (C * L ^ (2 : ℕ)) : ℝ) := Nat.le_ceil _ + exact_mod_cast hleft_real.trans hceil_right + +theorem natCeil_two_log_terms_le_natCeil_large_log + {Acoef Aarg Bcoef Barg C xi T : ℝ} + (hT : 0 ≤ T) (hxi : 1 ≤ xi) + (hAcoef : 0 ≤ Acoef) (hAarg : 0 ≤ Aarg) + (hBcoef : 0 ≤ Bcoef) (hBarg : 0 ≤ Barg) + (hAarg_le_C : Aarg ≤ C) (hBarg_le_C : Barg ≤ C) + (hsum_le_C : Acoef + Bcoef + 4 ≤ C) : + Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) + + Nat.ceil (Bcoef * Real.log (2 + Barg * T)) ≤ + Nat.ceil (C * xi * Real.log (2 + C * xi * T)) := by + have hxi_nonneg : 0 ≤ xi := le_trans zero_le_one hxi + have hC_nonneg : 0 ≤ C := by + have hsum_nonneg : 0 ≤ Acoef + Bcoef + 4 := by positivity + exact hsum_nonneg.trans hsum_le_C + let L : ℝ := Real.log (2 + C * xi * T) + have hargC_ge_one : 1 ≤ 2 + C * xi * T := by + have hprod : 0 ≤ C * xi * T := by positivity + exact le_trans (by norm_num : (1 : ℝ) ≤ 2) + (by simpa using add_le_add_left hprod (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.log_nonneg hargC_ge_one + have hL_half : (1 / 2 : ℝ) ≤ L := by + dsimp [L] + exact log_two_add_ge_half (by positivity : 0 ≤ C * xi * T) + have hAarg_arg : + 2 + Aarg * xi * T ≤ 2 + C * xi * T := by + have hmul := mul_le_mul_of_nonneg_right hAarg_le_C + (by positivity : 0 ≤ xi * T) + calc + 2 + Aarg * xi * T = 2 + Aarg * (xi * T) := by ring + _ = Aarg * (xi * T) + 2 := by ring + _ ≤ C * (xi * T) + 2 := add_le_add_left hmul 2 + _ = 2 + C * (xi * T) := by ring + _ = 2 + C * xi * T := by ring + have hBarg_arg : + 2 + Barg * T ≤ 2 + C * xi * T := by + have hBarg_le_Cxi : Barg ≤ C * xi := by + have hmul := mul_le_mul_of_nonneg_left hxi hC_nonneg + calc + Barg ≤ C := hBarg_le_C + _ = C * 1 := by ring + _ ≤ C * xi := hmul + have hmul := mul_le_mul_of_nonneg_right hBarg_le_Cxi hT + calc + 2 + Barg * T = Barg * T + 2 := by ring + _ ≤ C * xi * T + 2 := add_le_add_left hmul 2 + _ = 2 + C * xi * T := by ring + have hlogA : + Real.log (2 + Aarg * xi * T) ≤ L := by + dsimp [L] + exact Real.log_le_log (by positivity) hAarg_arg + have hlogB : + Real.log (2 + Barg * T) ≤ L := by + dsimp [L] + exact Real.log_le_log (by positivity) hBarg_arg + have hlogA_nonneg : 0 ≤ Real.log (2 + Aarg * xi * T) := by + exact Real.log_nonneg (by + have hprod : 0 ≤ Aarg * xi * T := by positivity + exact le_trans (by norm_num : (1 : ℝ) ≤ 2) + (by simpa using add_le_add_left hprod (2 : ℝ))) + have hlogB_nonneg : 0 ≤ Real.log (2 + Barg * T) := by + exact Real.log_nonneg (by + have hprod : 0 ≤ Barg * T := by positivity + exact le_trans (by norm_num : (1 : ℝ) ≤ 2) + (by simpa using add_le_add_left hprod (2 : ℝ))) + have hx_nonneg : + 0 ≤ Acoef * xi * Real.log (2 + Aarg * xi * T) := by positivity + have hy_nonneg : + 0 ≤ Bcoef * Real.log (2 + Barg * T) := by positivity + have hceilx : + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) : ℝ) ≤ + Acoef * xi * Real.log (2 + Aarg * xi * T) + 1 := + natCeil_le_add_one hx_nonneg + have hceily : + (Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) ≤ + Bcoef * Real.log (2 + Barg * T) + 1 := + natCeil_le_add_one hy_nonneg + have hx_le : Acoef * xi * Real.log (2 + Aarg * xi * T) ≤ + Acoef * xi * L := by + exact mul_le_mul_of_nonneg_left hlogA (mul_nonneg hAcoef hxi_nonneg) + have hy_le : Bcoef * Real.log (2 + Barg * T) ≤ + Bcoef * xi * L := by + calc + Bcoef * Real.log (2 + Barg * T) ≤ Bcoef * L := + mul_le_mul_of_nonneg_left hlogB hBcoef + _ ≤ Bcoef * xi * L := by + have hBL_nonneg : 0 ≤ Bcoef * L := mul_nonneg hBcoef hL_nonneg + have hmul := mul_le_mul_of_nonneg_right hxi hBL_nonneg + calc + Bcoef * L = 1 * (Bcoef * L) := by ring + _ ≤ xi * (Bcoef * L) := hmul + _ = Bcoef * xi * L := by ring + have htwo_le : (2 : ℝ) ≤ 4 * xi * L := by + have hxiL : (1 / 2 : ℝ) ≤ xi * L := by + simpa using + mul_le_mul hxi hL_half (by norm_num : (0 : ℝ) ≤ 1 / 2) hxi_nonneg + calc + (2 : ℝ) = 4 * (1 / 2 : ℝ) := by norm_num + _ ≤ 4 * (xi * L) := mul_le_mul_of_nonneg_left hxiL (by norm_num) + _ = 4 * xi * L := by ring + have hceil_sum : + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) : ℝ) + + (Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) ≤ + Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T) + 2 := by + calc + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) : ℝ) + + (Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) + ≤ (Acoef * xi * Real.log (2 + Aarg * xi * T) + 1) + + (Bcoef * Real.log (2 + Barg * T) + 1) := + add_le_add hceilx hceily + _ = Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T) + 2 := by ring + have hlogs_sum : + Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T) + 2 ≤ + Acoef * xi * L + Bcoef * xi * L + 2 := by + calc + Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T) + 2 + = (Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T)) + 2 := by ring + _ ≤ (Acoef * xi * L + Bcoef * xi * L) + 2 := + add_le_add_left (add_le_add hx_le hy_le) 2 + _ = Acoef * xi * L + Bcoef * xi * L + 2 := by ring + have htwo_absorb : + Acoef * xi * L + Bcoef * xi * L + 2 ≤ + Acoef * xi * L + Bcoef * xi * L + 4 * xi * L := by + exact add_le_add_right htwo_le (Acoef * xi * L + Bcoef * xi * L) + have hleft_real : + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) + + Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) ≤ + C * xi * L := by + calc + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) + + Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) + = + (Nat.ceil (Acoef * xi * Real.log (2 + Aarg * xi * T)) : ℝ) + + (Nat.ceil (Bcoef * Real.log (2 + Barg * T)) : ℝ) := by norm_num + _ ≤ Acoef * xi * Real.log (2 + Aarg * xi * T) + + Bcoef * Real.log (2 + Barg * T) + 2 := hceil_sum + _ ≤ Acoef * xi * L + Bcoef * xi * L + 2 := hlogs_sum + _ ≤ Acoef * xi * L + Bcoef * xi * L + 4 * xi * L := htwo_absorb + _ = (Acoef + Bcoef + 4) * xi * L := by ring + _ ≤ C * xi * L := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hsum_le_C hxi_nonneg) hL_nonneg + have hceil_right : + C * xi * L ≤ + (Nat.ceil (C * xi * Real.log (2 + C * xi * T)) : ℝ) := by + simpa [L] using Nat.le_ceil (C * xi * Real.log (2 + C * xi * T)) + exact_mod_cast hleft_real.trans hceil_right + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ExponentAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ExponentAbsorption.lean new file mode 100644 index 0000000000..bd3075674d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ExponentAbsorption.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.SmallWidetildeEntry + +/-! # Exponent Absorption -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +noncomputable section + +/-! +# Exponent absorption for the main annealed convergence theorem + +This file contains the pure real-arithmetic step which turns a bound with a +fixed prefactor into the note-facing bound with unit prefactor, after shrinking +the algebraic exponent. +-/ + +theorem quarter_le_rpow_three_neg_mul_of_mul_nat_le_one + {α : ℝ} {n : ℕ} (hαn : α * (n : ℝ) ≤ 1) : + (1 / 4 : ℝ) ≤ Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + have hmono : + Real.rpow (3 : ℝ) (-(1 : ℝ)) ≤ + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + have hthird : Real.rpow (3 : ℝ) (-(1 : ℝ)) = (1 / 3 : ℝ) := by + calc + Real.rpow (3 : ℝ) (-(1 : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (-(1 : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) (y := -(1 : ℝ)) + (by norm_num : 0 < (3 : ℝ))) + _ = (1 / 3 : ℝ) := by + rw [mul_neg, mul_one, Real.exp_neg, Real.exp_log (by norm_num : 0 < (3 : ℝ))] + norm_num + calc + (1 / 4 : ℝ) ≤ 1 / 3 := by norm_num + _ = Real.rpow (3 : ℝ) (-(1 : ℝ)) := hthird.symm + _ ≤ Real.rpow (3 : ℝ) (-α * (n : ℝ)) := hmono + +theorem prefactor_decay_le_half_exponent_decay_of_large + {α₀ K : ℝ} {n : ℕ} + (hα₀ : 0 < α₀) + (hlarge : + Real.log (max (4 * K) 1) / ((α₀ / 2) * Real.log 3) ≤ (n : ℝ)) : + 4 * K * Real.rpow (3 : ℝ) (-α₀ * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-(α₀ / 2) * (n : ℝ)) := by + let A : ℝ := max (4 * K) 1 + let γ : ℝ := α₀ / 2 + have hγ_pos : 0 < γ := by dsimp [γ]; positivity + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hden_pos : 0 < γ * Real.log 3 := mul_pos hγ_pos hlog3 + have hA_ge_pref : 4 * K ≤ A := by + dsimp [A] + exact le_max_left _ _ + have hA_ge_one : 1 ≤ A := by + dsimp [A] + exact le_max_right _ _ + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hlog_le : Real.log A ≤ γ * Real.log 3 * (n : ℝ) := by + have hmul := (div_le_iff₀ hden_pos).mp (by simpa [A, γ] using hlarge) + nlinarith + have hA_le_rpow : A ≤ Real.rpow (3 : ℝ) (γ * (n : ℝ)) := by + have hexp : A ≤ Real.exp (γ * Real.log 3 * (n : ℝ)) := + (Real.log_le_iff_le_exp hA_pos).mp hlog_le + have hrpow : + Real.rpow (3 : ℝ) (γ * (n : ℝ)) = + Real.exp (γ * Real.log 3 * (n : ℝ)) := by + calc + Real.rpow (3 : ℝ) (γ * (n : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (γ * (n : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) (y := γ * (n : ℝ)) + (by norm_num : 0 < (3 : ℝ))) + _ = Real.exp (γ * Real.log 3 * (n : ℝ)) := by + congr 1 + ring + rw [hrpow] + exact hexp + have hdecay_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-α₀ * (n : ℝ)) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + calc + 4 * K * Real.rpow (3 : ℝ) (-α₀ * (n : ℝ)) + ≤ Real.rpow (3 : ℝ) (γ * (n : ℝ)) * + Real.rpow (3 : ℝ) (-α₀ * (n : ℝ)) := by + exact mul_le_mul_of_nonneg_right (hA_ge_pref.trans hA_le_rpow) hdecay_nonneg + _ = Real.rpow (3 : ℝ) (γ * (n : ℝ) + -α₀ * (n : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (γ * (n : ℝ)) (-α₀ * (n : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-(α₀ / 2) * (n : ℝ)) := by + congr 1 + dsimp [γ] + ring + +theorem mul_nat_le_one_of_le_inverse_succ + {α : ℝ} {R n : ℕ} + (hα : α ≤ ((R + 1 : ℕ) : ℝ)⁻¹) (hn : n ≤ R) : + α * (n : ℝ) ≤ 1 := by + have hn_nonneg : 0 ≤ (n : ℝ) := by positivity + have hR_pos : 0 < ((R + 1 : ℕ) : ℝ) := by positivity + have hn_le_Rsucc : (n : ℝ) ≤ ((R + 1 : ℕ) : ℝ) := by + exact_mod_cast (hn.trans (Nat.le_succ R)) + calc + α * (n : ℝ) ≤ ((R + 1 : ℕ) : ℝ)⁻¹ * (n : ℝ) := + mul_le_mul_of_nonneg_right hα hn_nonneg + _ = (n : ℝ) / ((R + 1 : ℕ) : ℝ) := by ring + _ ≤ 1 := (div_le_one hR_pos).mpr hn_le_Rsucc + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ShiftedP4.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ShiftedP4.lean new file mode 100644 index 0000000000..20ad4839a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/ShiftedP4.lean @@ -0,0 +1,205 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.EntryScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final + +/-! # Shifted P4 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Shifted `(P4)` data for the main theorem + +The Section 5.5 localization produces smallness for the `2β`-shifted moment +quantity. Since the Lean value of `β` is chosen with enough slack, these +shifted exponents still define valid `(P4)` data. This file packages that +renaming of exponents. +-/ + +private theorem section53CoarseFluctuationBetaCoreParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaCoreParams params := by + have hgap : 0 < 1 - params.sUpper - params.sLower := by + linarith [params.sum_lt_one] + have hupper : 0 < params.sUpper := params.sUpper_pos + have hlower : 0 < params.sLower := params.sLower_pos + have hupper_gain : 0 < params.sUpper - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < params.sLower - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sLower] + unfold section53CoarseFluctuationBetaCoreParams + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +theorem section53CoarseFluctuationBetaParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaParams params := by + unfold section53CoarseFluctuationBetaParams + nlinarith [section53CoarseFluctuationBetaCoreParams_pos params] + +private theorem section53CoarseFluctuationBetaCoreParams_le_sum_gap {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + section53CoarseFluctuationBetaCoreParams params ≤ + 1 - params.sUpper - params.sLower := by + unfold section53CoarseFluctuationBetaCoreParams + exact min_le_left _ _ + +private theorem twoBetaShiftedParams_sum_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (params.sUpper + 2 * section53CoarseFluctuationBetaParams params) + + (params.sLower + 2 * section53CoarseFluctuationBetaParams params) < 1 := by + have hcore_le := section53CoarseFluctuationBetaCoreParams_le_sum_gap params + have hsum := params.sum_lt_one + unfold section53CoarseFluctuationBetaParams + nlinarith + +private theorem twoBetaShiftedParams_sUpper_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + params.sUpper + 2 * section53CoarseFluctuationBetaParams params < 1 := by + have hsum := twoBetaShiftedParams_sum_lt_one params + have hlower_nonneg : + 0 ≤ params.sLower + 2 * section53CoarseFluctuationBetaParams params := by + have hβ := (section53CoarseFluctuationBetaParams_pos params).le + nlinarith [params.sLower_nonneg] + nlinarith + +private theorem twoBetaShiftedParams_sLower_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + params.sLower + 2 * section53CoarseFluctuationBetaParams params < 1 := by + have hsum := twoBetaShiftedParams_sum_lt_one params + have hupper_nonneg : + 0 ≤ params.sUpper + 2 * section53CoarseFluctuationBetaParams params := by + have hβ := (section53CoarseFluctuationBetaParams_pos params).le + nlinarith [params.sUpper_nonneg] + nlinarith + +/-- Parameter-only `(P4)` data with both exponents shifted by `2β`. -/ +def twoBetaShiftedParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + QuantitativeCoarseGrainedEllipticityParams d where + sUpper := params.sUpper + 2 * section53CoarseFluctuationBetaParams params + sLower := params.sLower + 2 * section53CoarseFluctuationBetaParams params + xi := params.xi + two_le_dim := params.two_le_dim + sUpper_nonneg := by + have hβ := (section53CoarseFluctuationBetaParams_pos params).le + nlinarith [params.sUpper_nonneg] + sUpper_lt_one := twoBetaShiftedParams_sUpper_lt_one params + sLower_nonneg := by + have hβ := (section53CoarseFluctuationBetaParams_pos params).le + nlinarith [params.sLower_nonneg] + sLower_lt_one := twoBetaShiftedParams_sLower_lt_one params + xi_gt_two_mul_dim := params.xi_gt_two_mul_dim + sum_lt_one := twoBetaShiftedParams_sum_lt_one params + dim_div_xi_lt_min := by + rw [lt_min_iff] + constructor + · have hβ := (section53CoarseFluctuationBetaParams_pos params).le + linarith [params.dim_div_xi_lt_sUpper] + · have hβ := (section53CoarseFluctuationBetaParams_pos params).le + linarith [params.dim_div_xi_lt_sLower] + +/-- Law-specific `(P4)` data with both exponents shifted by `2β`. -/ +def twoBetaShiftedP4 {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + QuantitativeCoarseGrainedEllipticity P where + sUpper := hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 + sLower := hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 + xi := hP4.xi + two_le_dim := hP4.two_le_dim + sUpper_nonneg := by + have hβ := (section53CoarseFluctuationBeta_pos hP4).le + nlinarith [hP4.sUpper_nonneg] + sUpper_lt_one := by + have h := + twoBetaShiftedParams_sUpper_lt_one hP4.params + simpa [section53CoarseFluctuationBetaParams_eq_of_P4 hP4] using h + sLower_nonneg := by + have hβ := (section53CoarseFluctuationBeta_pos hP4).le + nlinarith [hP4.sLower_nonneg] + sLower_lt_one := by + have h := + twoBetaShiftedParams_sLower_lt_one hP4.params + simpa [section53CoarseFluctuationBetaParams_eq_of_P4 hP4] using h + xi_gt_two_mul_dim := hP4.xi_gt_two_mul_dim + sum_lt_one := by + have h := + twoBetaShiftedParams_sum_lt_one hP4.params + simpa [section53CoarseFluctuationBetaParams_eq_of_P4 hP4] using h + dim_div_xi_lt_min := by + rw [lt_min_iff] + constructor + · have hβ := (section53CoarseFluctuationBeta_pos hP4).le + linarith [hP4.dim_div_xi_lt_sUpper] + · have hβ := (section53CoarseFluctuationBeta_pos hP4).le + linarith [hP4.dim_div_xi_lt_sLower] + upper_moment_integrable := + Section55.upperTwoBetaFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 0 + lower_inv_moment_integrable := + Section55.lowerTwoBetaFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 0 + +@[simp] +theorem twoBetaShiftedP4_params {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (twoBetaShiftedP4 hP hStruct hP4).params = + twoBetaShiftedParams hP4.params := rfl + +theorem widetildeThetaAtScale_twoBetaShiftedP4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (n : ℤ) : + widetildeThetaAtScale P n (twoBetaShiftedP4 hP hStruct hP4) = + Section55.shiftedWidetildeThetaAtScale P n hP4 + (2 * section53CoarseFluctuationBeta hP4) := by + rfl + +theorem widetildeThetaAtScale_zero_scaleNormalized_twoBetaShiftedP4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k : ℕ) : + widetildeThetaAtScale (Ch04.restrictionScaleNormalizedLaw k P) (0 : ℤ) + (twoBetaShiftedP4 (hP.scaleNormalized k) (hStruct.scaleNormalized k) + (hP4.scaleNormalized hP hStruct k)) = + Section55.shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) := by + have hβ : + section53CoarseFluctuationBeta (hP4.scaleNormalized hP hStruct k) = + section53CoarseFluctuationBeta hP4 := rfl + have hshift := + Section55.shiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw + hP hStruct hP4 + (η := 2 * section53CoarseFluctuationBeta hP4) + (by + have hβpos := section53CoarseFluctuationBeta_pos hP4 + nlinarith [hP4.sUpper_pos]) + (by + have hβpos := section53CoarseFluctuationBeta_pos hP4 + nlinarith [hP4.sLower_pos]) + k 0 + simpa [widetildeThetaAtScale_twoBetaShiftedP4, hβ] using! hshift + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/SmallWidetildeEntry.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/SmallWidetildeEntry.lean new file mode 100644 index 0000000000..31689074fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section51/SmallWidetildeEntry.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.ShiftedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final + +/-! # Small Widetilde Entry -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section51 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Entry into shifted small contrast + +This file combines the Section 5.5 perturbative entry theorem with the shifted +high-moment localization estimate to produce small contrast for the `2β` +shifted `(P4)` data at the algebraic entry scale. +-/ + +private theorem rpow_three_neg_mul_antitone_nat + {β : ℝ} (hβ : 0 < β) {h l : ℕ} (hl : h ≤ l) : + Real.rpow (3 : ℝ) (-β * (l : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (h : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hcast : (h : ℝ) ≤ (l : ℝ) := by exact_mod_cast hl + nlinarith + +private theorem rpow_three_neg_mul_le_inv_of_log_gap + {β A : ℝ} {h : ℕ} (hβ : 0 < β) (hA : 1 ≤ A) + (hh : (β * Real.log 3)⁻¹ * Real.log A ≤ (h : ℝ)) : + Real.rpow (3 : ℝ) (-β * (h : ℝ)) ≤ A⁻¹ := by + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβlog : 0 < β * Real.log 3 := mul_pos hβ hlog3 + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hlogA_nonneg : 0 ≤ Real.log A := Real.log_nonneg hA + have hmain : Real.log A ≤ β * Real.log 3 * (h : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hh hβlog.le + have hcancel : β * Real.log 3 * ((β * Real.log 3)⁻¹ * Real.log A) = + Real.log A := by + field_simp [hβlog.ne'] + nlinarith + have hexp : + Real.log (3 : ℝ) * (-β * (h : ℝ)) ≤ -Real.log A := by + nlinarith + calc + Real.rpow (3 : ℝ) (-β * (h : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (-β * (h : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) + (y := -β * (h : ℝ)) (by norm_num : 0 < (3 : ℝ))) + _ ≤ Real.exp (-Real.log A) := Real.exp_le_exp.mpr hexp + _ = A⁻¹ := by + rw [Real.exp_neg, Real.exp_log hA_pos] + +private theorem shifted_tail_le_half_delta + {β Cshift δ W : ℝ} {h : ℕ} + (hβ : 0 < β) (hCshift : 0 ≤ Cshift) (hδ : 0 < δ) (hW : 0 ≤ W) + (hh : + (β * Real.log 3)⁻¹ * + Real.log (2 + (2 * (Cshift + 1) / δ) * W) ≤ (h : ℝ)) : + Cshift * Real.rpow (3 : ℝ) (-β * (h : ℝ)) * W ≤ δ / 2 := by + let A : ℝ := 2 + (2 * (Cshift + 1) / δ) * W + have hcoef_pos : 0 < 2 * (Cshift + 1) / δ := by + positivity + have hA_ge_one : 1 ≤ A := by + dsimp [A] + have hprod : 0 ≤ (2 * (Cshift + 1) / δ) * W := by positivity + nlinarith + have hdecay : Real.rpow (3 : ℝ) (-β * (h : ℝ)) ≤ A⁻¹ := by + exact rpow_three_neg_mul_le_inv_of_log_gap hβ hA_ge_one (by simpa [A] using hh) + have hden_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hmain : + Cshift * A⁻¹ * W ≤ δ / 2 := by + by_cases hWzero : W = 0 + · simpa [hWzero] using (show (0 : ℝ) ≤ δ / 2 by positivity) + · have hW_pos : 0 < W := lt_of_le_of_ne hW (Ne.symm hWzero) + have hA_lower : + (2 * (Cshift + 1) / δ) * W ≤ A := by + dsimp [A] + nlinarith + have h_inv_le : + A⁻¹ ≤ ((2 * (Cshift + 1) / δ) * W)⁻¹ := by + exact (inv_le_inv₀ hden_pos (mul_pos hcoef_pos hW_pos)).mpr hA_lower + calc + Cshift * A⁻¹ * W ≤ + Cshift * (((2 * (Cshift + 1) / δ) * W)⁻¹) * W := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left h_inv_le hCshift) hW + _ = Cshift / (2 * (Cshift + 1) / δ) := by + field_simp [hδ.ne', hW_pos.ne'] + _ ≤ δ / 2 := by + rw [div_le_iff₀ hcoef_pos] + have hmul : + δ / 2 * (2 * (Cshift + 1) / δ) = Cshift + 1 := by + field_simp [hδ.ne'] + nlinarith + calc + Cshift * Real.rpow (3 : ℝ) (-β * (h : ℝ)) * W + ≤ Cshift * A⁻¹ * W := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hdecay hCshift) hW + _ ≤ δ / 2 := hmain + +/-- Section 5.1 entry into the small-contrast regime for the `2β`-shifted +ellipticity exponents. + +The constant is selected before the law. The target smallness parameter is +explicit so the final theorem can feed in the small-contrast threshold from +Section 5.6. -/ +theorem shiftedSmallContrastEntry_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) + {delta : ℝ} (hdelta_pos : 0 < delta) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (_hP : Ch04.RestrictionLawCarrier P) (_hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + let N := annealedAlgebraicEntryScale P hP4 C + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) - 1 ≤ delta := by + classical + obtain ⟨Centry, hCentry_pos, hentry⟩ := + Section55.annealedPerturbativeEntry_homogenizationScale params + let β : ℝ := section53CoarseFluctuationBetaParams params + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBetaParams_pos params + obtain ⟨Cshift, hCshift_nonneg, hshift⟩ := + Section55.shiftedWidetildeThetaBound_homogenizationScale + (d := d) params.xi β hβ_pos + let sigma : ℝ := min (delta / 2) (1 / 2) + have hsigma_pos : 0 < sigma := by + dsimp [sigma] + exact lt_min (by positivity) (by norm_num) + have hsigma_le_half : sigma ≤ 1 / 2 := by + dsimp [sigma] + exact min_le_right _ _ + have hsigma_le_delta_half : sigma ≤ delta / 2 := by + dsimp [sigma] + exact min_le_left _ _ + let Acoef : ℝ := Centry * sigma⁻¹ ^ (4 : ℕ) * |Real.log sigma| + let Aarg : ℝ := sigma⁻¹ ^ (4 : ℕ) + let Bcoef : ℝ := (β * Real.log 3)⁻¹ + let Barg : ℝ := 2 * (Cshift + 1) / delta + let C : ℝ := max (Centry + 4) + (max Aarg (max Barg (max (Acoef + Bcoef + 4) 1))) + have hC_pos : 0 < C := by + have hC_ge_one : (1 : ℝ) ≤ C := by + dsimp [C] + exact + (le_max_right (Acoef + Bcoef + 4) 1).trans + ((le_max_right Barg (max (Acoef + Bcoef + 4) 1)).trans + ((le_max_right Aarg (max Barg (max (Acoef + Bcoef + 4) 1))).trans + (le_max_right (Centry + 4) + (max Aarg (max Barg (max (Acoef + Bcoef + 4) 1)))))) + exact lt_of_lt_of_le zero_lt_one hC_ge_one + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams + let W : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let N : ℕ := annealedAlgebraicEntryScale P hP4 C + let k : ℕ := annealedEntryScale P hP4 Centry sigma + let htail : ℕ := Nat.ceil (Bcoef * Real.log (2 + Barg * W)) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact widetildeThetaAtScale_nonneg P hP4 0 + have hxi_eq : hP4.xi = params.xi := by + rw [← hparams] + rfl + have hβ_eq : section53CoarseFluctuationBeta hP4 = β := by + rw [← section53CoarseFluctuationBetaParams_eq_of_P4 hP4, hparams] + have htheta_k : + thetaAtScale hP hStruct (k : ℤ) ≤ 1 + sigma := by + simpa [k] using hentry hP hStruct hP4 hparams sigma hsigma_pos hsigma_le_half + have hC_ge_Centry4 : Centry + 4 ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hC_ge_Aarg : Aarg ≤ C := by + dsimp [C] + exact (le_max_left Aarg (max Barg (max (Acoef + Bcoef + 4) 1))).trans + (le_max_right (Centry + 4) + (max Aarg (max Barg (max (Acoef + Bcoef + 4) 1)))) + have hC_ge_Barg : Barg ≤ C := by + dsimp [C] + exact + (le_max_left Barg (max (Acoef + Bcoef + 4) 1)).trans + ((le_max_right Aarg (max Barg (max (Acoef + Bcoef + 4) 1))).trans + (le_max_right (Centry + 4) + (max Aarg (max Barg (max (Acoef + Bcoef + 4) 1))))) + have hC_ge_sum : Acoef + Bcoef + 4 ≤ C := by + dsimp [C] + exact + (le_max_left (Acoef + Bcoef + 4) 1).trans + ((le_max_right Barg (max (Acoef + Bcoef + 4) 1)).trans + ((le_max_right Aarg (max Barg (max (Acoef + Bcoef + 4) 1))).trans + (le_max_right (Centry + 4) + (max Aarg (max Barg (max (Acoef + Bcoef + 4) 1)))))) + have hAcoef_nonneg : 0 ≤ Acoef := by + dsimp [Acoef] + positivity + have hAarg_nonneg : 0 ≤ Aarg := by + dsimp [Aarg] + positivity + have hBcoef_nonneg : 0 ≤ Bcoef := by + dsimp [Bcoef] + positivity + have hBarg_nonneg : 0 ≤ Barg := by + dsimp [Barg] + positivity + let kEntry : ℕ := annealedConvergenceEntryScaleBound P hP4 Centry + let kTail : ℕ := annealedConvergenceSigmaTailScale P hP4 Centry sigma + let NEntry : ℕ := Nat.ceil (C * (Real.log (2 + W)) ^ (2 : ℕ)) + let NTail : ℕ := Nat.ceil (C * (hP4.xi : ℝ) * + Real.log (2 + C * (hP4.xi : ℝ) * W)) + have hk_decomp : k = kEntry + kTail := by + dsimp [k, kEntry, kTail, annealedEntryScale] + have hN_decomp : N = NEntry + NTail := by + dsimp [N, NEntry, NTail, annealedAlgebraicEntryScale, W] + have hkEntry_le_NEntry : kEntry ≤ NEntry := by + have h := + natCeil_add_nat_le_natCeil_mul_logSq + (A := Centry) (C := C) (T := W) (R := 0) + hW_nonneg hCentry_pos.le (by simpa using hC_ge_Centry4) + simpa [kEntry, NEntry, annealedConvergenceEntryScaleBound, W] using h + have hkTail_htail_le_NTail : kTail + htail ≤ NTail := by + have hxi_ge_one : (1 : ℝ) ≤ (hP4.xi : ℝ) := by + have htwo : 2 ≤ hP4.xi := hP4.two_le_xi + exact_mod_cast (show (1 : ℕ) ≤ hP4.xi by omega) + have h := + natCeil_two_log_terms_le_natCeil_large_log + (Acoef := Acoef) (Aarg := Aarg) (Bcoef := Bcoef) + (Barg := Barg) (C := C) (xi := (hP4.xi : ℝ)) (T := W) + hW_nonneg hxi_ge_one hAcoef_nonneg hAarg_nonneg hBcoef_nonneg + hBarg_nonneg hC_ge_Aarg hC_ge_Barg hC_ge_sum + have hkTail_eq : + kTail = + Nat.ceil (Acoef * (hP4.xi : ℝ) * + Real.log (2 + Aarg * (hP4.xi : ℝ) * W)) := by + dsimp [kTail, annealedConvergenceSigmaTailScale, Acoef, Aarg, W] + congr 1 + ring + rw [hkTail_eq] + simpa [htail, NTail, Bcoef, Barg, hxi_eq, W] using h + have hk_htail_le_N : k + htail ≤ N := by + rw [hk_decomp, hN_decomp] + omega + have hk_le_N : k ≤ N := le_trans (Nat.le_add_right k htail) hk_htail_le_N + have htail_le_gap : htail ≤ N - k := by + exact Nat.le_sub_of_add_le (by simpa [Nat.add_comm] using hk_htail_le_N) + have hshiftN := hshift hP hStruct hP4 hxi_eq hβ_eq hk_le_N + have hceil_tail : + Bcoef * Real.log (2 + Barg * W) ≤ (htail : ℝ) := by + simpa [htail] using Nat.le_ceil (Bcoef * Real.log (2 + Barg * W)) + have htail_decay : + Cshift * + Real.rpow (3 : ℝ) (-β * ((N - k : ℕ) : ℝ)) * + W ≤ delta / 2 := by + have hdecay_le : + Real.rpow (3 : ℝ) (-β * ((N - k : ℕ) : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (htail : ℝ)) := + rpow_three_neg_mul_antitone_nat hβ_pos htail_le_gap + calc + Cshift * Real.rpow (3 : ℝ) (-β * ((N - k : ℕ) : ℝ)) * W + ≤ Cshift * Real.rpow (3 : ℝ) (-β * (htail : ℝ)) * W := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hdecay_le hCshift_nonneg) hW_nonneg + _ ≤ delta / 2 := by + exact shifted_tail_le_half_delta hβ_pos hCshift_nonneg hdelta_pos + hW_nonneg (by simpa [Bcoef, Barg] using hceil_tail) + calc + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) - 1 + ≤ (thetaAtScale hP hStruct (k : ℤ) + + Cshift * Real.rpow (3 : ℝ) (-β * ((N - k : ℕ) : ℝ)) * + W) - 1 := by + have hupper : + Section55.shiftedWidetildeThetaAtScale P (N : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) ≤ + thetaAtScale hP hStruct (k : ℤ) + + Cshift * Real.rpow (3 : ℝ) (-β * ((N - k : ℕ) : ℝ)) * W := by + simpa [hβ_eq, W] using hshiftN.2 + linarith + _ ≤ (1 + sigma + delta / 2) - 1 := by + nlinarith + _ ≤ delta := by + nlinarith + +end + +end Section51 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52.lean new file mode 100644 index 0000000000..a1115422f5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.MomentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.CenteredResponses + +/-! # Section52 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +/-! +# Section 5.2: annealed scalar identities and moment bounds + +This compatibility module re-exports the split Section 5.2 theorem files. +The public theorem surface is unchanged: + +* `multiscaleEllipticityMomentBounds_homogenizationScale`; +* `scalarPreliminaries_homogenizationScale`; +* `centeredResponses_homogenizationScale`. +-/ + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/CenteredResponses.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/CenteredResponses.lean new file mode 100644 index 0000000000..6c8b1a370c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/CenteredResponses.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries + +/-! # Centered Responses -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: CenteredResponses + +Centered primal and adjoint response identities. +-/ + +theorem expectedJScalarFormula_sub_scalarizedResponseCenteringTerm_eq_centeredResponseExpectationFormula + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) : + expectedJScalarFormula hP hStruct m p q - + scalarizedResponseCenteringTerm hP hStruct m p q = + centeredResponseExpectationFormula hP hStruct m p q := by + simp [expectedJScalarFormula, scalarizedResponseCenteringTerm, + centeredResponseExpectationFormula, sub_eq_add_neg, + vecDot_add_right, vecDot_neg_right, vecDot_smul_right, + vecDot_comm, thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] + ring_nf + +theorem integrable_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsFiniteMeasure P] + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) P) : + Integrable (restrictionCenteredResponseJObservableCubeSet hP hStruct m Q p q) P := by + simpa [restrictionCenteredResponseJObservableCubeSet] using! + hJ.sub (integrable_const _) + +theorem integrable_restrictionCenteredResponseJStarObservableCubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsFiniteMeasure P] + (hAdj : Ch04.RestrictionAdjointInvariantLaw P) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) P) : + Integrable (restrictionCenteredResponseJStarObservableCubeSet hP hStruct m Q p q) P := by + have hJAdj : + Integrable + (fun a : RegCoeffField d => + Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a)) P := + by + have hFmap : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) + (Measure.map (adjointReg (d := d)) P) := by rwa [hAdj] + simpa [Function.comp_def] using + hFmap.comp_measurable (measurable_adjointReg (d := d)) + simpa [restrictionCenteredResponseJStarObservableCubeSet] using! + hJAdj.sub (integrable_const _) + +theorem integral_restrictionCenteredResponseJObservableCubeSet_eq_expectedResponseJCubeSet_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) P) : + ∫ a, restrictionCenteredResponseJObservableCubeSet hP hStruct m Q p q a ∂P = + Ch04.expectedResponseJCubeSet P Q p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + have hConst : + Integrable + (fun _ : RegCoeffField d => + scalarizedResponseCenteringTerm hP hStruct m p q) P := + integrable_const _ + calc + ∫ a, restrictionCenteredResponseJObservableCubeSet hP hStruct m Q p q a ∂P + = + ∫ a, + Ch04.restrictionResponseJObservableCubeSet Q p q a - + scalarizedResponseCenteringTerm hP hStruct m p q ∂P := by + rfl + _ = + ∫ a, Ch04.restrictionResponseJObservableCubeSet Q p q a ∂P - + ∫ _a : RegCoeffField d, + scalarizedResponseCenteringTerm hP hStruct m p q ∂P := by + rw [integral_sub hJ hConst] + _ = + Ch04.expectedResponseJCubeSet P Q p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + rw [integral_const] + simp [Ch04.expectedResponseJCubeSet, Measure.real, + IsProbabilityMeasure.measure_univ] + +theorem integral_restrictionCenteredResponseJStarObservableCubeSet_eq_expectedResponseJCubeSet_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hAdj : Ch04.RestrictionAdjointInvariantLaw P) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (Q : TriadicCube d) (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) P) : + ∫ a, restrictionCenteredResponseJStarObservableCubeSet hP hStruct m Q p q a ∂P = + Ch04.expectedResponseJCubeSet P Q p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + have hJAdj : + Integrable + (fun a : RegCoeffField d => + Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a)) P := + by + have hFmap : Integrable (Ch04.restrictionResponseJObservableCubeSet Q p q) + (Measure.map (adjointReg (d := d)) P) := by rwa [hAdj] + simpa [Function.comp_def] using + hFmap.comp_measurable (measurable_adjointReg (d := d)) + have hConst : + Integrable + (fun _ : RegCoeffField d => + scalarizedResponseCenteringTerm hP hStruct m p q) P := + integrable_const _ + calc + ∫ a, restrictionCenteredResponseJStarObservableCubeSet hP hStruct m Q p q a ∂P + = + ∫ a, + Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a) - + scalarizedResponseCenteringTerm hP hStruct m p q ∂P := by + rfl + _ = + ∫ a, Ch04.restrictionResponseJObservableCubeSet Q p q (adjointReg a) ∂P - + ∫ _a : RegCoeffField d, + scalarizedResponseCenteringTerm hP hStruct m p q ∂P := by + rw [integral_sub hJAdj hConst] + _ = + ∫ a, Ch04.restrictionResponseJObservableCubeSet Q p q a ∂P - + scalarizedResponseCenteringTerm hP hStruct m p q := by + rw [hAdj.integral_comp_adjointReg (Ch04.restrictionResponseJObservableCubeSet Q p q) hJ.aestronglyMeasurable] + rw [integral_const] + simp [Measure.real, IsProbabilityMeasure.measure_univ] + _ = + Ch04.expectedResponseJCubeSet P Q p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + rfl + +theorem expectedCenteredResponseJAtScale_eq_annealedResponseJAtScale_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) : + expectedCenteredResponseJAtScale hP hStruct m p q = + Ch04.annealedResponseJAtScale P m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + simpa [expectedCenteredResponseJAtScale, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale, Ch04.restrictionResponseJObservableCubeSet] using! + integral_restrictionCenteredResponseJObservableCubeSet_eq_expectedResponseJCubeSet_sub + hP hStruct m (originCube d m) p q hJ + +theorem expectedCenteredResponseJStarAtScale_eq_annealedResponseJAtScale_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hAdj : Ch04.RestrictionAdjointInvariantLaw P) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) + (p q : Vec d) + (hJ : Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) : + expectedCenteredResponseJStarAtScale hP hStruct m p q = + Ch04.annealedResponseJAtScale P m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + simpa [expectedCenteredResponseJStarAtScale, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale, Ch04.restrictionResponseJObservableCubeSet] using! + integral_restrictionCenteredResponseJStarObservableCubeSet_eq_expectedResponseJCubeSet_sub + hAdj hP hStruct m (originCube d m) p q hJ + +/-- Note-facing primal centered-response expectation formula. -/ +theorem expectedCenteredResponseJAtScale_eq_centeredResponseExpectationFormula + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (p q : Vec d) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P) : + expectedCenteredResponseJAtScale hP hStruct m p q = + centeredResponseExpectationFormula hP hStruct m p q := by + let : IsProbabilityMeasure P := hP.isProbability + have hJ : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d m) p q hBlock + calc + expectedCenteredResponseJAtScale hP hStruct m p q = + Ch04.annealedResponseJAtScale P m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := + expectedCenteredResponseJAtScale_eq_annealedResponseJAtScale_sub + hP hStruct m p q hJ + _ = + expectedJScalarFormula hP hStruct m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + rw [annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct m p q hBlock] + _ = centeredResponseExpectationFormula hP hStruct m p q := + expectedJScalarFormula_sub_scalarizedResponseCenteringTerm_eq_centeredResponseExpectationFormula + hP hStruct m p q + +/-- Note-facing adjoint centered-response expectation formula. -/ +theorem expectedCenteredResponseJStarAtScale_eq_centeredResponseExpectationFormula + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (p q : Vec d) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P) : + expectedCenteredResponseJStarAtScale hP hStruct m p q = + centeredResponseExpectationFormula hP hStruct m p q := by + let : IsProbabilityMeasure P := hP.isProbability + have hJ : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d m) p q hBlock + calc + expectedCenteredResponseJStarAtScale hP hStruct m p q = + Ch04.annealedResponseJAtScale P m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := + expectedCenteredResponseJStarAtScale_eq_annealedResponseJAtScale_sub + hStruct.adjoint_invariant hP hStruct m p q hJ + _ = + expectedJScalarFormula hP hStruct m p q - + scalarizedResponseCenteringTerm hP hStruct m p q := by + rw [annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct m p q hBlock] + _ = centeredResponseExpectationFormula hP hStruct m p q := + expectedJScalarFormula_sub_scalarizedResponseCenteringTerm_eq_centeredResponseExpectationFormula + hP hStruct m p q + +/-- Manuscript Lemma `l.centered.responses.homogenization.scale`, expectation +identity part: the centered primal and adjoint responses have the same +scalarized expectation. -/ +theorem centeredResponses_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (p q : Vec d) : + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p q = + centeredResponseExpectationFormula hP hStruct (m : ℤ) p q ∧ + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) p q = + centeredResponseExpectationFormula hP hStruct (m : ℤ) p q := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + constructor + · exact expectedCenteredResponseJAtScale_eq_centeredResponseExpectationFormula + hP hStruct (m : ℤ) p q hBlock + · exact expectedCenteredResponseJStarAtScale_eq_centeredResponseExpectationFormula + hP hStruct (m : ℤ) p q hBlock + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients.lean new file mode 100644 index 0000000000..8dd4118f9e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.Constants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.RootCoeff + +/-! # Coefficients -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/Constants.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/Constants.lean new file mode 100644 index 0000000000..cc963a98f4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/Constants.lean @@ -0,0 +1,675 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries + +/-! # Constants -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: Coefficients + +Coefficient absorption and large-scale root coefficients. +-/ + +noncomputable def section52LargeScalarAbsorptionConst (d : ℕ) : ℝ := + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + (20 * (2 * (d : ℝ)) * ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) + + 40 * (2 * (d : ℝ)) * Ch04.rosenthalBennettIntegralConst * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ))) + +theorem section52LargeScalarAbsorptionConst_nonneg (d : ℕ) : + 0 ≤ section52LargeScalarAbsorptionConst d := by + unfold section52LargeScalarAbsorptionConst + have hRB_nonneg : 0 ≤ Ch04.rosenthalBennettIntegralConst := by + unfold Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + +theorem section52_rosenthalDescendantsAtScaleLpConst_zero_le_color_mul_xi + {d ξ : ℕ} (hξ : 1 ≤ (ξ : ℝ)) : + Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ ≤ + 2 * (ξ : ℝ) * ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) := by + let A : ℝ := ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) + have hξ_pos : 0 < (ξ : ℝ) := lt_of_lt_of_le zero_lt_one hξ + have hA_pos_nat : 0 < (scaleColorPeriod 0) ^ d := + pow_pos (scaleColorPeriod_pos 0) d + have hA_ge_one_nat : 1 ≤ (scaleColorPeriod 0) ^ d := + Nat.succ_le_of_lt hA_pos_nat + have hA_ge_one : (1 : ℝ) ≤ A := by + dsimp [A] + exact_mod_cast hA_ge_one_nat + have hexp_le_one : 1 - 1 / (ξ : ℝ) ≤ 1 := by + have hnonneg : 0 ≤ 1 / (ξ : ℝ) := by positivity + linarith + have hpow_le : + A ^ (1 - 1 / (ξ : ℝ)) ≤ A := by + calc + A ^ (1 - 1 / (ξ : ℝ)) ≤ A ^ (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hA_ge_one hexp_le_one + _ = A := by simp + unfold Ch04.rosenthalDescendantsAtScaleLpConst + dsimp [A] at hpow_le ⊢ + exact mul_le_mul_of_nonneg_left hpow_le (by positivity) + +theorem section52_rosenthalDescendantsAtScaleSqrtConst_zero_le_color_mul_xi + {d ξ : ℕ} (hξ : 1 ≤ (ξ : ℝ)) : + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ ≤ + 4 * Ch04.rosenthalBennettIntegralConst * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) * (ξ : ℝ) := by + let A : ℝ := ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) + have hξ_nonneg : 0 ≤ (ξ : ℝ) := le_trans (by norm_num : (0 : ℝ) ≤ 1) hξ + have hsqrt_ξ_le : Real.sqrt (ξ : ℝ) ≤ (ξ : ℝ) := by + rw [Real.sqrt_le_left hξ_nonneg] + nlinarith [hξ] + have hRB_nonneg : 0 ≤ Ch04.rosenthalBennettIntegralConst := by + unfold Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hleft_nonneg : + 0 ≤ 4 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A := by + positivity + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst + dsimp [A] at hsqrt_ξ_le hleft_nonneg ⊢ + calc + 4 * Ch04.rosenthalBennettIntegralConst * + (Real.sqrt (ξ : ℝ) * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ))) = + (4 * Ch04.rosenthalBennettIntegralConst * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ))) * + Real.sqrt (ξ : ℝ) := by + ring + _ ≤ + (4 * Ch04.rosenthalBennettIntegralConst * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ))) * + (ξ : ℝ) := + mul_le_mul_of_nonneg_left hsqrt_ξ_le hleft_nonneg + _ = + 4 * Ch04.rosenthalBennettIntegralConst * + Real.sqrt ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) * (ξ : ℝ) := by + ring + +theorem section52LargeScalarAbsorptionConst_absorbs + {d ξ : ℕ} [NeZero d] {s : ℝ} + (hξ_one : 1 ≤ (ξ : ℝ)) (hξ_two : (2 : ℝ) ≤ (ξ : ℝ)) + (hs : 0 ≤ s) (hs_lt_one : s < 1) + (hlargeGap : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) : + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹) ≤ + section52LargeScalarAbsorptionConst d * + ((ξ : ℝ) * + ((((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s)⁻¹)) := by + let A : ℝ := ((((scaleColorPeriod 0) ^ d : ℕ) : ℝ)) + let B : ℝ := 2 * (d : ℝ) + let δ : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast (Nat.pos_of_ne_zero (NeZero.ne d)) + have hd_nonneg : 0 ≤ (d : ℝ) := hd_pos.le + have hd_ge_one : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt (Nat.pos_of_ne_zero (NeZero.ne d))) + have hB_ge_one : (1 : ℝ) ≤ B := by + dsimp [B] + nlinarith + have hB_nonneg : 0 ≤ B := le_trans (by norm_num : (0 : ℝ) ≤ 1) hB_ge_one + have hξ_nonneg : 0 ≤ (ξ : ℝ) := + le_trans (by norm_num : (0 : ℝ) ≤ 1) hξ_one + have hδ_pos : 0 < δ := by + simpa [δ] using hlargeGap + have hδ_inv_nonneg : 0 ≤ δ⁻¹ := inv_nonneg.mpr hδ_pos.le + have hLpGap_pos : 0 < (d : ℝ) - s := by + linarith + have hLpGap_le_B : (d : ℝ) - s ≤ B := by + dsimp [B] + nlinarith + have hdiv_le_d : (d : ℝ) / (ξ : ℝ) ≤ (d : ℝ) := by + have h := div_le_div_of_nonneg_left hd_nonneg (by norm_num : (0 : ℝ) < 1) hξ_one + simpa using h + have hδ_le_B : δ ≤ B := by + dsimp [δ, B] + nlinarith + have hdiv_le_half : (d : ℝ) / (ξ : ℝ) ≤ (d : ℝ) / 2 := by + exact div_le_div_of_nonneg_left hd_nonneg (by norm_num : (0 : ℝ) < 2) hξ_two + have hδ_le_LpGap : δ ≤ (d : ℝ) - s := by + dsimp [δ] + linarith + have hdisc_s_nonneg : 0 ≤ geometricDiscount s 1 := + geometricDiscount_nonneg (by simpa using hs) + have hdisc_s_le_one : geometricDiscount s 1 ≤ 1 := + geometricDiscount_one_le_one s + have hdisc_lp_pos : 0 < geometricDiscount ((d : ℝ) - s) 1 := + geometricDiscount_pos (by simpa using hLpGap_pos) + have hinv_lp_nonneg : 0 ≤ (geometricDiscount ((d : ℝ) - s) 1)⁻¹ := + inv_nonneg.mpr hdisc_lp_pos.le + have hinv_lp_raw : + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ ≤ + 5 * B * (((d : ℝ) - s)⁻¹) := + inv_geometricDiscount_one_le_five_mul_upper_mul_inv + hLpGap_pos hLpGap_le_B hB_ge_one + have hLpGap_inv_le_delta_inv : ((d : ℝ) - s)⁻¹ ≤ δ⁻¹ := + (inv_le_inv₀ hLpGap_pos hδ_pos).2 hδ_le_LpGap + have hinv_lp : + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ ≤ 5 * B * δ⁻¹ := by + calc + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ ≤ + 5 * B * (((d : ℝ) - s)⁻¹) := hinv_lp_raw + _ ≤ 5 * B * δ⁻¹ := by + exact mul_le_mul_of_nonneg_left hLpGap_inv_le_delta_inv + (by positivity) + have hdisc_delta_pos : 0 < geometricDiscount δ 1 := + geometricDiscount_pos (by simpa using hδ_pos) + have hinv_delta_nonneg : 0 ≤ (geometricDiscount δ 1)⁻¹ := + inv_nonneg.mpr hdisc_delta_pos.le + have hinv_delta : + (geometricDiscount δ 1)⁻¹ ≤ 5 * B * δ⁻¹ := + inv_geometricDiscount_one_le_five_mul_upper_mul_inv hδ_pos hδ_le_B hB_ge_one + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact_mod_cast Nat.zero_le ((scaleColorPeriod 0) ^ d) + have hsqrtA_nonneg : 0 ≤ Real.sqrt A := Real.sqrt_nonneg A + have hRB_nonneg : 0 ≤ Ch04.rosenthalBennettIntegralConst := by + unfold Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hLp_const := + section52_rosenthalDescendantsAtScaleLpConst_zero_le_color_mul_xi + (d := d) (ξ := ξ) hξ_one + have hTwoLp_const : + 2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ ≤ + 4 * A * (ξ : ℝ) := by + calc + 2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ ≤ + 2 * (2 * (ξ : ℝ) * A) := + mul_le_mul_of_nonneg_left (by simpa [A] using hLp_const) + (by norm_num) + _ = 4 * A * (ξ : ℝ) := by ring + have hSqrt_const := + section52_rosenthalDescendantsAtScaleSqrtConst_zero_le_color_mul_xi + (d := d) (ξ := ξ) hξ_one + have hTwoSqrt_const : + 2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ ≤ + 8 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * (ξ : ℝ) := by + calc + 2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ ≤ + 2 * (4 * Ch04.rosenthalBennettIntegralConst * + Real.sqrt A * (ξ : ℝ)) := + mul_le_mul_of_nonneg_left (by simpa [A] using hSqrt_const) + (by norm_num) + _ = 8 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * (ξ : ℝ) := by + ring + have hLp_factor : + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ) * + geometricDiscount s 1 ≤ + (4 * A * (ξ : ℝ)) * 1 := + mul_le_mul hTwoLp_const hdisc_s_le_one hdisc_s_nonneg + (by positivity) + have hLp_factor_nonneg : 0 ≤ (4 * A * (ξ : ℝ)) * 1 := by + positivity + have hLp_term : + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ) * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ ≤ + 20 * B * A * ((ξ : ℝ) * δ⁻¹) := by + calc + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ) * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ ≤ + ((4 * A * (ξ : ℝ)) * 1) * (5 * B * δ⁻¹) := + mul_le_mul hLp_factor hinv_lp hinv_lp_nonneg hLp_factor_nonneg + _ = 20 * B * A * ((ξ : ℝ) * δ⁻¹) := by ring + have hSqrt_factor : + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ) * + geometricDiscount s 1 ≤ + (8 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * (ξ : ℝ)) * 1 := + mul_le_mul hTwoSqrt_const hdisc_s_le_one hdisc_s_nonneg + (by positivity) + have hSqrt_factor_nonneg : + 0 ≤ (8 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * (ξ : ℝ)) * 1 := by + positivity + have hSqrt_term : + ((2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ) * + geometricDiscount s 1) * + (geometricDiscount δ 1)⁻¹ ≤ + 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * + ((ξ : ℝ) * δ⁻¹) := by + calc + ((2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ) * + geometricDiscount s 1) * + (geometricDiscount δ 1)⁻¹ ≤ + ((8 * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * (ξ : ℝ)) * 1) * + (5 * B * δ⁻¹) := + mul_le_mul hSqrt_factor hinv_delta hinv_delta_nonneg hSqrt_factor_nonneg + _ = 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * + ((ξ : ℝ) * δ⁻¹) := by ring + have hcomponent : + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount δ 1)⁻¹ ≤ + (20 * B * A + + 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A) * + ((ξ : ℝ) * δ⁻¹) := by + calc + _ ≤ 20 * B * A * ((ξ : ℝ) * δ⁻¹) + + 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A * + ((ξ : ℝ) * δ⁻¹) := + add_le_add hLp_term hSqrt_term + _ = (20 * B * A + + 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A) * + ((ξ : ℝ) * δ⁻¹) := by ring + have hentry_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) := by + positivity + calc + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹) = + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + geometricDiscount s 1) * + (geometricDiscount δ 1)⁻¹) := by + simp [δ] + _ ≤ + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((20 * B * A + + 40 * B * Ch04.rosenthalBennettIntegralConst * Real.sqrt A) * + ((ξ : ℝ) * δ⁻¹)) := by + exact mul_le_mul_of_nonneg_left hcomponent hentry_nonneg + _ = + section52LargeScalarAbsorptionConst d * + ((ξ : ℝ) * + ((((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s)⁻¹)) := by + simp [section52LargeScalarAbsorptionConst, A, B, δ] + ring + +/-- The displayed Section 5.2 positive-excess coefficient is nonnegative. -/ +theorem section52MomentBoundCoeff_nonneg + {d ξ m : ℕ} {C s : ℝ} + (hC : 0 ≤ C) + (hDenom : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) : + 0 ≤ section52MomentBoundCoeff d ξ C s m := by + unfold section52MomentBoundCoeff + have hxi_nonneg : 0 ≤ (ξ : ℝ) := by exact_mod_cast Nat.zero_le ξ + exact mul_nonneg + (div_nonneg (mul_nonneg hC hxi_nonneg) hDenom.le) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + +/-- The displayed Section 5.2 `widetildeTheta` error coefficient is +nonnegative. -/ +theorem section52WidetildeThetaErrorCoeff_nonneg + {d ξ m : ℕ} {C sMin : ℝ} + (hC : 0 ≤ C) : + 0 ≤ section52WidetildeThetaErrorCoeff d ξ C sMin m := by + unfold section52WidetildeThetaErrorCoeff + exact mul_nonneg + (mul_nonneg hC (sq_nonneg (ξ : ℝ))) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + +/-- A displayed Section 5.2 positive-excess coefficient is bounded by the +common `widetildeTheta` scale whenever its exponent is at least the common +minimum exponent. -/ +theorem section52MomentBoundCoeff_le_common_scale + {d ξ m : ℕ} {C s sMin : ℝ} + (hξ : 1 ≤ ξ) + (hC : 0 ≤ C) + (hDenom : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) + (hsMin_le : sMin ≤ s) : + section52MomentBoundCoeff d ξ C s m ≤ + (C / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s)) * (ξ : ℝ) ^ 2 * + Real.rpow (3 : ℝ) (-(sMin - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + unfold section52MomentBoundCoeff + let D : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s + let X : ℝ := (ξ : ℝ) + let scale : ℝ := Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + let commonScale : ℝ := + Real.rpow (3 : ℝ) (-(sMin - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + have hDpos : 0 < D := by simpa [D] using hDenom + have hX_nonneg : 0 ≤ X := by + dsimp [X] + exact_mod_cast Nat.zero_le ξ + have hX_one : 1 ≤ X := by + dsimp [X] + exact_mod_cast hξ + have hX_le_sq : X ≤ X ^ 2 := by + calc + X = X * 1 := by ring + _ ≤ X * X := mul_le_mul_of_nonneg_left hX_one hX_nonneg + _ = X ^ 2 := by ring + have hratio_nonneg : 0 ≤ C / D := div_nonneg hC hDpos.le + have hscale_nonneg : 0 ≤ scale := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hscale_le : scale ≤ commonScale := by + have hExp : + -(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) ≤ + -(sMin - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) := by + have hm_nonneg : 0 ≤ (m : ℝ) := by exact_mod_cast Nat.zero_le m + have hneg : + -(s - (d : ℝ) / (ξ : ℝ)) ≤ + -(sMin - (d : ℝ) / (ξ : ℝ)) := by + linarith + exact mul_le_mul_of_nonneg_right hneg hm_nonneg + simpa [scale, commonScale] using + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hExp + calc + C * X / D * scale = + (C / D) * X * scale := by ring + _ ≤ (C / D) * X ^ 2 * scale := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hX_le_sq hratio_nonneg) + hscale_nonneg + _ ≤ (C / D) * X ^ 2 * commonScale := by + exact mul_le_mul_of_nonneg_left hscale_le + (mul_nonneg hratio_nonneg (sq_nonneg X)) + _ = + (C / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s)) * (ξ : ℝ) ^ 2 * + Real.rpow (3 : ℝ) (-(sMin - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + simp [D, X, commonScale] + +/-- The product of the two displayed Section 5.2 positive-excess coefficients +is also bounded by the common `widetildeTheta` scale. -/ +theorem section52MomentBoundCoeff_mul_le_common_scale + {d ξ m : ℕ} {CUpper CLower sUpper sLower : ℝ} + (hCUpper : 0 ≤ CUpper) + (hCLower : 0 ≤ CLower) + (hsUpper_gt : (d : ℝ) / (ξ : ℝ) < sUpper) + (hsLower_gt : (d : ℝ) / (ξ : ℝ) < sLower) + (hUpperDenom : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) + (hLowerDenom : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower) : + section52MomentBoundCoeff d ξ CUpper sUpper m * + section52MomentBoundCoeff d ξ CLower sLower m ≤ + (CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) * + (CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower))) * + (ξ : ℝ) ^ 2 * + Real.rpow (3 : ℝ) + (-(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + unfold section52MomentBoundCoeff + let DU : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper + let DL : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower + let X : ℝ := (ξ : ℝ) + let eU : ℝ := -(sUpper - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) + let eL : ℝ := -(sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) + let eMin : ℝ := -(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) + have hDUpos : 0 < DU := by simpa [DU] using hUpperDenom + have hDLpos : 0 < DL := by simpa [DL] using hLowerDenom + have hratio_nonneg : + 0 ≤ CUpper / DU * (CLower / DL) := + mul_nonneg (div_nonneg hCUpper hDUpos.le) (div_nonneg hCLower hDLpos.le) + have hscale_prod_eq : + Real.rpow (3 : ℝ) eU * Real.rpow (3 : ℝ) eL = + Real.rpow (3 : ℝ) (eU + eL) := + (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) eU eL).symm + have hExp : eU + eL ≤ eMin := by + have hm_nonneg : 0 ≤ (m : ℝ) := by exact_mod_cast Nat.zero_le m + have hbeta_le_sum : + min sUpper sLower - (d : ℝ) / (ξ : ℝ) ≤ + (sUpper - (d : ℝ) / (ξ : ℝ)) + + (sLower - (d : ℝ) / (ξ : ℝ)) := by + have hbeta_le_upper : + min sUpper sLower - (d : ℝ) / (ξ : ℝ) ≤ + sUpper - (d : ℝ) / (ξ : ℝ) := by + linarith [min_le_left sUpper sLower] + have hlower_nonneg : 0 ≤ sLower - (d : ℝ) / (ξ : ℝ) := by + linarith + have hupper_nonneg : 0 ≤ sUpper - (d : ℝ) / (ξ : ℝ) := by + linarith + linarith + have hneg : + -((sUpper - (d : ℝ) / (ξ : ℝ)) + + (sLower - (d : ℝ) / (ξ : ℝ))) ≤ + -(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) := by + linarith + have hmul := mul_le_mul_of_nonneg_right hneg hm_nonneg + calc + eU + eL = + -((sUpper - (d : ℝ) / (ξ : ℝ)) + + (sLower - (d : ℝ) / (ξ : ℝ))) * (m : ℝ) := by + dsimp [eU, eL] + ring + _ ≤ -(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) := hmul + _ = eMin := by + dsimp [eMin] + have hscale_le : + Real.rpow (3 : ℝ) (eU + eL) ≤ Real.rpow (3 : ℝ) eMin := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hExp + calc + (CUpper * X / DU * Real.rpow (3 : ℝ) eU) * + (CLower * X / DL * Real.rpow (3 : ℝ) eL) = + (CUpper / DU * (CLower / DL)) * X ^ 2 * + (Real.rpow (3 : ℝ) eU * Real.rpow (3 : ℝ) eL) := by + ring + _ = (CUpper / DU * (CLower / DL)) * X ^ 2 * + Real.rpow (3 : ℝ) (eU + eL) := by + rw [hscale_prod_eq] + _ ≤ (CUpper / DU * (CLower / DL)) * X ^ 2 * + Real.rpow (3 : ℝ) eMin := by + exact mul_le_mul_of_nonneg_left hscale_le + (mul_nonneg hratio_nonneg (sq_nonneg X)) + _ = + (CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) * + (CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower))) * + (ξ : ℝ) ^ 2 * + Real.rpow (3 : ℝ) + (-(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + dsimp [DU, DL, X, eMin] + +/-- Coefficient absorption for the final displayed Section 5.2 +`widetildeTheta` estimate. -/ +theorem section52_coefficients_mixed_le_widetildeThetaErrorCoeff + {d ξ m : ℕ} {CUpper CLower CTheta sUpper sLower : ℝ} + (hξ : 1 ≤ ξ) + (hCUpper : 0 ≤ CUpper) + (hCLower : 0 ≤ CLower) + (hsUpper_gt : (d : ℝ) / (ξ : ℝ) < sUpper) + (hsLower_gt : (d : ℝ) / (ξ : ℝ) < sLower) + (hUpperDenom : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) + (hLowerDenom : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower) + (hCTheta : + CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper) + + CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower) + + (CUpper / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper)) * + (CLower / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower)) ≤ + CTheta) : + section52MomentBoundCoeff d ξ CUpper sUpper m + + section52MomentBoundCoeff d ξ CLower sLower m + + section52MomentBoundCoeff d ξ CUpper sUpper m * + section52MomentBoundCoeff d ξ CLower sLower m ≤ + section52WidetildeThetaErrorCoeff d ξ CTheta (min sUpper sLower) m := by + let DU : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sUpper + let DL : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - sLower + let scale : ℝ := + Real.rpow (3 : ℝ) (-(min sUpper sLower - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + have hscale_nonneg : 0 ≤ scale := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hxi_sq_scale_nonneg : 0 ≤ (ξ : ℝ) ^ 2 * scale := + mul_nonneg (sq_nonneg (ξ : ℝ)) hscale_nonneg + have hUpper : + section52MomentBoundCoeff d ξ CUpper sUpper m ≤ + (CUpper / DU) * (ξ : ℝ) ^ 2 * scale := by + simpa [DU, scale] using + section52MomentBoundCoeff_le_common_scale + (d := d) (ξ := ξ) (m := m) (C := CUpper) + (s := sUpper) (sMin := min sUpper sLower) + hξ hCUpper hUpperDenom (min_le_left sUpper sLower) + have hLower : + section52MomentBoundCoeff d ξ CLower sLower m ≤ + (CLower / DL) * (ξ : ℝ) ^ 2 * scale := by + simpa [DL, scale] using + section52MomentBoundCoeff_le_common_scale + (d := d) (ξ := ξ) (m := m) (C := CLower) + (s := sLower) (sMin := min sUpper sLower) + hξ hCLower hLowerDenom (min_le_right sUpper sLower) + have hProd : + section52MomentBoundCoeff d ξ CUpper sUpper m * + section52MomentBoundCoeff d ξ CLower sLower m ≤ + ((CUpper / DU) * (CLower / DL)) * (ξ : ℝ) ^ 2 * scale := by + simpa [DU, DL, scale] using + section52MomentBoundCoeff_mul_le_common_scale + (d := d) (ξ := ξ) (m := m) + (CUpper := CUpper) (CLower := CLower) + (sUpper := sUpper) (sLower := sLower) + hCUpper hCLower hsUpper_gt hsLower_gt hUpperDenom hLowerDenom + calc + section52MomentBoundCoeff d ξ CUpper sUpper m + + section52MomentBoundCoeff d ξ CLower sLower m + + section52MomentBoundCoeff d ξ CUpper sUpper m * + section52MomentBoundCoeff d ξ CLower sLower m + ≤ (CUpper / DU) * (ξ : ℝ) ^ 2 * scale + + (CLower / DL) * (ξ : ℝ) ^ 2 * scale + + ((CUpper / DU) * (CLower / DL)) * (ξ : ℝ) ^ 2 * scale := by + linarith + _ = + (CUpper / DU + CLower / DL + (CUpper / DU) * (CLower / DL)) * + ((ξ : ℝ) ^ 2 * scale) := by + ring + _ ≤ CTheta * ((ξ : ℝ) ^ 2 * scale) := by + exact mul_le_mul_of_nonneg_right (by simpa [DU, DL] using hCTheta) + hxi_sq_scale_nonneg + _ = section52WidetildeThetaErrorCoeff d ξ CTheta (min sUpper sLower) m := by + simp [section52WidetildeThetaErrorCoeff, scale, mul_assoc] + +/-- The one-parent Rosenthal budget for unit-descendant averages over `Q`. +This is a private coefficient used to feed the Ch4 law-facing finite-parent +fluctuation theorem. -/ +noncomputable def section52UnitDescendantRosenthalBudget {d : ℕ} + (Q : TriadicCube d) (ξ : ℕ) (K : ℝ) : ℝ := + ((descendantsAtScale Q (0 : ℤ)).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + ((descendantsAtScale Q (0 : ℤ)).card : ℝ) ^ (1 / (ξ : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + Real.sqrt ((descendantsAtScale Q (0 : ℤ)).card : ℝ) * K) + +theorem section52UnitDescendantRosenthalBudget_nonneg {d : ℕ} + (Q : TriadicCube d) (ξ : ℕ) {K : ℝ} (hK : 0 ≤ K) : + 0 ≤ section52UnitDescendantRosenthalBudget Q ξ K := by + unfold section52UnitDescendantRosenthalBudget + have hcard_nonneg : + 0 ≤ ((descendantsAtScale Q (0 : ℤ)).card : ℝ) := by + exact_mod_cast Nat.zero_le _ + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ := by + have hξ_nonneg : 0 ≤ (ξ : ℝ) := by exact_mod_cast Nat.zero_le ξ + have hbase_nonneg : + 0 ≤ (((scaleColorPeriod 0) ^ d : ℕ) : ℝ) := by + exact_mod_cast Nat.zero_le ((scaleColorPeriod 0) ^ d) + have hpow_nonneg : + 0 ≤ (((scaleColorPeriod 0) ^ d : ℕ) : ℝ) ^ (1 - (ξ : ℝ)⁻¹) := + Real.rpow_nonneg hbase_nonneg _ + have hprod : + 0 ≤ 2 * (ξ : ℝ) * + (((scaleColorPeriod 0) ^ d : ℕ) : ℝ) ^ (1 - (ξ : ℝ)⁻¹) := + mul_nonneg (mul_nonneg (by norm_num) hξ_nonneg) hpow_nonneg + simpa [Ch04.rosenthalDescendantsAtScaleLpConst, one_div, mul_assoc] using hprod + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst + Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + +noncomputable def section52LargeScaleLpRootCoeff + (d ξ : ℕ) (s : ℝ) (m : ℕ) (n : ℤ) : ℝ := + section52LargeScaleWeight s m n * + ((((descendantsAtScale (originCube d (m : ℤ)) n).card : ℝ) ^ + (1 / (ξ : ℝ))) * + (((descendantsAtScale (originCube d n) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + (((descendantsAtScale (originCube d n) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) * 2))) + +noncomputable def section52LargeScaleSqrtRootCoeff + (d ξ : ℕ) (s : ℝ) (m : ℕ) (n : ℤ) : ℝ := + section52LargeScaleWeight s m n * + ((((descendantsAtScale (originCube d (m : ℤ)) n).card : ℝ) ^ + (1 / (ξ : ℝ))) * + (((descendantsAtScale (originCube d n) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + Real.sqrt ((descendantsAtScale (originCube d n) 0).card : ℝ) * 2))) + +noncomputable def section52LargeScaleRootCoeff + (d ξ : ℕ) (s : ℝ) (m : ℕ) (n : ℤ) : ℝ := + section52LargeScaleLpRootCoeff d ξ s m n + + section52LargeScaleSqrtRootCoeff d ξ s m n + +theorem section52LargeScaleLpRootCoeff_nonneg + {d ξ : ℕ} {s : ℝ} (m : ℕ) (n : ℤ) (hs : 0 ≤ s) : + 0 ≤ section52LargeScaleLpRootCoeff d ξ s m n := by + unfold section52LargeScaleLpRootCoeff + have hweight : 0 ≤ section52LargeScaleWeight s m n := + section52LargeScaleWeight_nonneg m hs n + have hcard_m_nonneg : + 0 ≤ (((descendantsAtScale (originCube d (m : ℤ)) n).card : ℝ)) := by + exact_mod_cast Nat.zero_le _ + have hcard_n_nonneg : + 0 ≤ (((descendantsAtScale (originCube d n) 0).card : ℝ)) := by + exact_mod_cast Nat.zero_le _ + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + positivity + +theorem section52LargeScaleSqrtRootCoeff_nonneg + {d ξ : ℕ} {s : ℝ} (m : ℕ) (n : ℤ) (hs : 0 ≤ s) : + 0 ≤ section52LargeScaleSqrtRootCoeff d ξ s m n := by + unfold section52LargeScaleSqrtRootCoeff + have hweight : 0 ≤ section52LargeScaleWeight s m n := + section52LargeScaleWeight_nonneg m hs n + have hcard_m_nonneg : + 0 ≤ (((descendantsAtScale (originCube d (m : ℤ)) n).card : ℝ)) := by + exact_mod_cast Nat.zero_le _ + have hcard_n_nonneg : + 0 ≤ (((descendantsAtScale (originCube d n) 0).card : ℝ)) := by + exact_mod_cast Nat.zero_le _ + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + +theorem section52LargeScaleRootCoeff_nonneg + {d ξ : ℕ} {s : ℝ} (m : ℕ) (n : ℤ) (hs : 0 ≤ s) : + 0 ≤ section52LargeScaleRootCoeff d ξ s m n := by + unfold section52LargeScaleRootCoeff + exact add_nonneg + (section52LargeScaleLpRootCoeff_nonneg (d := d) (ξ := ξ) (s := s) m n hs) + (section52LargeScaleSqrtRootCoeff_nonneg (d := d) (ξ := ξ) (s := s) m n hs) + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/RootCoeff.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/RootCoeff.lean new file mode 100644 index 0000000000..83156ccff9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Coefficients/RootCoeff.lean @@ -0,0 +1,662 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.Constants + +/-! # Root Coeff -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +theorem section52LargeScaleLpRootCoeff_eq_const_mul_decay_mul_gap_rpow + {d ξ : ℕ} {s : ℝ} {m : ℕ} {n : ℤ} + (hn : n ∈ section52LargeScaleSet m) : + section52LargeScaleLpRootCoeff d ξ s m n = + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(d - s) * (Int.toNat n : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_le : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + rw [section52LargeScaleLpRootCoeff, section52LargeScaleWeight, geometricWeight_one_eq] + rw [section52_descendantsAtScale_originCube_large_card_rpow d ξ m hn_le] + rw [section52_descendantsAtScale_originCube_int_zero_card_inv d hn_nonneg] + rw [section52_descendantsAtScale_originCube_int_zero_card_rpow d ξ hn_nonneg] + have hdepth : + (Int.toNat ((m : ℤ) - n) : ℝ) + (Int.toNat n : ℝ) = (m : ℝ) := by + exact_mod_cast section52LargeScaleSet_toNat_sub_add_toNat hn + have hpow : + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) = + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(d - s) * (Int.toNat n : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) = + (Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ))) * + (Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ))) := by + ring + _ = + Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) := by + have hAB : + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ)) = + Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ)) := + (Real.rpow_add h3 + (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) + (((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ))).symm + have hCD : + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) = + Real.rpow (3 : ℝ) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) := + (Real.rpow_add h3 + (-(d : ℝ) * (Int.toNat n : ℝ)) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ))).symm + exact congrArg₂ (fun x y : ℝ => x * y) hAB hCD + _ = + Real.rpow (3 : ℝ) + ((-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) + + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ))) := by + exact (Real.rpow_add h3 + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ))).symm + _ = + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) + -(d - s) * + (Int.toNat n : ℝ)) := by + congr 1 + have hdepth_sub : + (Int.toNat ((m : ℤ) - n) : ℝ) = + (m : ℝ) - (Int.toNat n : ℝ) := by + linarith + rw [hdepth_sub] + ring_nf + _ = + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(d - s) * (Int.toNat n : ℝ)) := by + exact Real.rpow_add h3 + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + (-(d - s) * (Int.toNat n : ℝ)) + calc + geometricDiscount s 1 * Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + (Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + (Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) * 2))) = + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + (Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ))) := by + ring + _ = + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + (Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(d - s) * (Int.toNat n : ℝ))) := by + rw [hpow] + _ = + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(d - s) * (Int.toNat n : ℝ)) := by + ring + +theorem section52LargeScaleSqrtRootCoeff_eq_const_mul_decay_mul_gap_rpow + {d ξ : ℕ} {s : ℝ} {m : ℕ} {n : ℤ} + (hn : n ∈ section52LargeScaleSet m) : + section52LargeScaleSqrtRootCoeff d ξ s m n = + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * (Int.toNat n : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_le : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + rw [section52LargeScaleSqrtRootCoeff, section52LargeScaleWeight, geometricWeight_one_eq] + rw [section52_descendantsAtScale_originCube_large_card_rpow d ξ m hn_le] + rw [section52_descendantsAtScale_originCube_int_zero_card_inv d hn_nonneg] + rw [section52_descendantsAtScale_originCube_int_zero_card_sqrt d hn_nonneg] + have hdepth : + (Int.toNat ((m : ℤ) - n) : ℝ) + (Int.toNat n : ℝ) = (m : ℝ) := by + exact_mod_cast section52LargeScaleSet_toNat_sub_add_toNat hn + have hpow : + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (Int.toNat n : ℝ)) = + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (Int.toNat n : ℝ)) = + (Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ))) * + (Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (Int.toNat n : ℝ))) := by + ring + _ = + Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / 2) * (Int.toNat n : ℝ)) := by + have hAB : + Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ)) = + Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ)) := + (Real.rpow_add h3 + (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) + (((d : ℝ) / (ξ : ℝ)) * + (Int.toNat ((m : ℤ) - n) : ℝ))).symm + have hCD : + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (Int.toNat n : ℝ)) = + Real.rpow (3 : ℝ) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / 2) * (Int.toNat n : ℝ)) := + (Real.rpow_add h3 + (-(d : ℝ) * (Int.toNat n : ℝ)) + (((d : ℝ) / 2) * (Int.toNat n : ℝ))).symm + exact congrArg₂ (fun x y : ℝ => x * y) hAB hCD + _ = + Real.rpow (3 : ℝ) + ((-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) + + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / 2) * (Int.toNat n : ℝ))) := by + exact (Real.rpow_add h3 + (-s * (Int.toNat ((m : ℤ) - n) : ℝ) + + ((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) + (-(d : ℝ) * (Int.toNat n : ℝ) + + ((d : ℝ) / 2) * (Int.toNat n : ℝ))).symm + _ = + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ) + + -(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ)) := by + congr 1 + have hdepth_sub : + (Int.toNat ((m : ℤ) - n) : ℝ) = + (m : ℝ) - (Int.toNat n : ℝ) := by + linarith + rw [hdepth_sub] + ring_nf + _ = + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ)) := by + exact Real.rpow_add h3 + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ)) + calc + geometricDiscount s 1 * Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + (Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + (Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + (Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * + (Int.toNat n : ℝ)) * 2))) = + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + (Real.rpow (3 : ℝ) (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * + (Int.toNat n : ℝ))) := by + ring + _ = + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + (Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ))) := by + rw [hpow] + _ = + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + Real.rpow (3 : ℝ) + (-(((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) * + (Int.toNat n : ℝ)) := by + ring + +theorem section52LargeScaleLpRootCoeff_scale_sum_le_geometricDiscount + {d ξ : ℕ} {s : ℝ} (m : ℕ) + (hs : 0 ≤ s) (hgap : 0 < (d : ℝ) - s) : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleLpRootCoeff d ξ s m n) ≤ + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ := by + let coeff : ℝ := + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hdisc_nonneg : 0 ≤ geometricDiscount s 1 := + geometricDiscount_nonneg (by simpa using hs) + have hcoeff_nonneg : 0 ≤ coeff := by + dsimp [coeff] + positivity + have hraw := + section52LargeScaleSet_raw_rpow_sum_le_inv_geometricDiscount + (m := m) hgap + calc + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleLpRootCoeff d ξ s m n) = + ∑ n ∈ section52LargeScaleSet m, + coeff * Real.rpow (3 : ℝ) (-((d : ℝ) - s) * (Int.toNat n : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro n hn + rw [section52LargeScaleLpRootCoeff_eq_const_mul_decay_mul_gap_rpow + (d := d) (ξ := ξ) (s := s) (m := m) hn] + _ = coeff * + (∑ n ∈ section52LargeScaleSet m, + Real.rpow (3 : ℝ) (-((d : ℝ) - s) * (Int.toNat n : ℝ))) := by + simp [Finset.mul_sum] + _ ≤ coeff * (geometricDiscount ((d : ℝ) - s) 1)⁻¹ := + mul_le_mul_of_nonneg_left hraw hcoeff_nonneg + _ = + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ := by + simp [coeff] + +theorem section52LargeScaleSqrtRootCoeff_scale_sum_le_geometricDiscount + {d ξ : ℕ} {s : ℝ} (m : ℕ) + (hs : 0 ≤ s) (hgap : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleSqrtRootCoeff d ξ s m n) ≤ + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹ := by + let gap : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s + let coeff : ℝ := + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hdisc_nonneg : 0 ≤ geometricDiscount s 1 := + geometricDiscount_nonneg (by simpa using hs) + have hcoeff_nonneg : 0 ≤ coeff := by + dsimp [coeff] + positivity + have hgap' : 0 < gap := by simpa [gap] using hgap + have hraw := + section52LargeScaleSet_raw_rpow_sum_le_inv_geometricDiscount + (m := m) hgap' + calc + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleSqrtRootCoeff d ξ s m n) = + ∑ n ∈ section52LargeScaleSet m, + coeff * Real.rpow (3 : ℝ) (-gap * (Int.toNat n : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro n hn + rw [section52LargeScaleSqrtRootCoeff_eq_const_mul_decay_mul_gap_rpow + (d := d) (ξ := ξ) (s := s) (m := m) hn] + _ = coeff * + (∑ n ∈ section52LargeScaleSet m, + Real.rpow (3 : ℝ) (-gap * (Int.toNat n : ℝ))) := by + simp [Finset.mul_sum] + _ ≤ coeff * (geometricDiscount gap 1)⁻¹ := + mul_le_mul_of_nonneg_left hraw hcoeff_nonneg + _ = + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹ := by + simp [coeff, gap] + +theorem section52LargeScaleRootCoeff_scale_sum_le_geometricDiscount + {d ξ : ℕ} {s : ℝ} (m : ℕ) + (hs : 0 ≤ s) (hgapLp : 0 < (d : ℝ) - s) + (hgapSqrt : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) ≤ + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹) * + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + have hLp := + section52LargeScaleLpRootCoeff_scale_sum_le_geometricDiscount + (d := d) (ξ := ξ) (s := s) m hs hgapLp + have hSqrt := + section52LargeScaleSqrtRootCoeff_scale_sum_le_geometricDiscount + (d := d) (ξ := ξ) (s := s) m hs hgapSqrt + have hsplit : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) = + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleLpRootCoeff d ξ s m n) + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleSqrtRootCoeff d ξ s m n) := by + simp [section52LargeScaleRootCoeff, Finset.sum_add_distrib] + calc + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) = + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleLpRootCoeff d ξ s m n) + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleSqrtRootCoeff d ξ s m n) := hsplit + _ ≤ + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹ := + add_le_add hLp hSqrt + _ = + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹) * + Real.rpow (3 : ℝ) + (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + ring + +theorem section52LargeScaleRootCoeff_scale_sum_le_momentBoundCoeff + {d ξ : ℕ} [NeZero d] {s : ℝ} (m : ℕ) + (hξ_one : 1 ≤ (ξ : ℝ)) (hξ_two : (2 : ℝ) ≤ (ξ : ℝ)) + (hs : 0 ≤ s) (hs_lt_one : s < 1) + (hgapSqrt : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) : + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) ≤ + section52MomentBoundCoeff d ξ (section52LargeScalarAbsorptionConst d) s m := by + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast (Nat.pos_of_ne_zero (NeZero.ne d)) + have hd_ge_one : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt (Nat.pos_of_ne_zero (NeZero.ne d))) + have hgapLp : 0 < (d : ℝ) - s := by + linarith + let component : ℝ := + (2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 ξ * geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s) 1)⁻¹ + let decay : ℝ := + Real.rpow (3 : ℝ) (-(s - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + let delta : ℝ := ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - s + have hscale : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) ≤ component * decay := by + simpa [component, decay] using + section52LargeScaleRootCoeff_scale_sum_le_geometricDiscount + (d := d) (ξ := ξ) (s := s) m hs hgapLp hgapSqrt + have hentry_nonneg : + 0 ≤ (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) := by + positivity + have habsorb : + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * component ≤ + section52LargeScalarAbsorptionConst d * ((ξ : ℝ) * delta⁻¹) := by + simpa [component, delta] using + section52LargeScalarAbsorptionConst_absorbs + (d := d) (ξ := ξ) (s := s) + hξ_one hξ_two hs hs_lt_one hgapSqrt + have hdecay_nonneg : 0 ≤ decay := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ s m n) ≤ + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + (component * decay) := + mul_le_mul_of_nonneg_left hscale hentry_nonneg + _ = + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * component) * + decay := by ring + _ ≤ (section52LargeScalarAbsorptionConst d * ((ξ : ℝ) * delta⁻¹)) * decay := + mul_le_mul_of_nonneg_right habsorb hdecay_nonneg + _ = section52MomentBoundCoeff d ξ (section52LargeScalarAbsorptionConst d) s m := by + simp [section52MomentBoundCoeff, delta, decay, div_eq_mul_inv] + ring_nf + exact Or.inl trivial + +theorem section52SmallRawCoeff_eq + {d ξ m : ℕ} {s r : ℝ} (hr : 0 < r) : + (((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) = + 625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + let e : ℝ := -r * (m : ℝ) + let f : ℝ := ((d : ℝ) / (ξ : ℝ)) * (m : ℝ) + have hW : section52SmallTailWeight r m = Real.rpow (3 : ℝ) e := by + simpa [e] using section52SmallTailWeight_eq_rpow hr m + have hcard : + (((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) = + Real.rpow (3 : ℝ) f := by + have h := + section52_descendantsAtScale_originCube_int_zero_card_rpow + (d := d) (ξ := ξ) (n := (m : ℤ)) + (by exact_mod_cast Nat.zero_le m) + simpa [f] using h + have hpowe : Real.rpow (3 : ℝ) e ≠ 0 := + (Real.rpow_pos_of_pos h3 e).ne' + have hpow_mul : + Real.rpow (3 : ℝ) e * Real.rpow (3 : ℝ) f = + Real.rpow (3 : ℝ) (e + f) := + (Real.rpow_add h3 e f).symm + have hdiv_pow : + Real.rpow (3 : ℝ) e ^ 2 / Real.rpow (3 : ℝ) e = + Real.rpow (3 : ℝ) e := by + rw [sq] + field_simp [hpowe] + calc + (((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) = + (((25 * s⁻¹ * (r - s)⁻¹ * Real.rpow (3 : ℝ) e) ^ 2 / + Real.rpow (3 : ℝ) e) * + Real.rpow (3 : ℝ) f) := by + rw [hW, hcard] + _ = + ((625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + (Real.rpow (3 : ℝ) e ^ 2 / Real.rpow (3 : ℝ) e)) * + Real.rpow (3 : ℝ) f) := by + ring + _ = + (625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + Real.rpow (3 : ℝ) e) * + Real.rpow (3 : ℝ) f := by + rw [hdiv_pow] + _ = + 625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + (Real.rpow (3 : ℝ) e * Real.rpow (3 : ℝ) f) := by + ring + _ = + 625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + Real.rpow (3 : ℝ) (e + f) := by + rw [hpow_mul] + _ = + 625 * s⁻¹ ^ 2 * (r - s)⁻¹ ^ 2 * + Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + congr 1 + dsimp [e, f] + ring_nf + +theorem section52RawTwoExponentCoeff_le_twoExponentMomentBoundCoeff + {d ξ m : ℕ} [NeZero d] {s r : ℝ} + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hlargeGap : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) : + (((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + ((descendantsAtScale (originCube d (m : ℤ)) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n) ≤ + section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m := by + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let L : ℝ := section52LargeScalarAbsorptionConst d + let A : ℝ := (ξ : ℝ) / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) + let B : ℝ := (r - s)⁻¹ ^ 2 + let S2 : ℝ := s⁻¹ ^ 2 + let decay : ℝ := + Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) + have hr_pos : 0 < r := hs.trans hsr + have hs_le_one : s ≤ 1 := le_trans hsr.le hr_lt_one.le + have hS2_ge_one : 1 ≤ S2 := by + have hone_le_inv : (1 : ℝ) ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le_one + dsimp [S2] + calc + (1 : ℝ) = 1 ^ 2 := by norm_num + _ ≤ s⁻¹ ^ 2 := pow_le_pow_left₀ zero_le_one hone_le_inv 2 + have hS2_nonneg : 0 ≤ S2 := by + dsimp [S2] + exact sq_nonneg _ + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg (by exact_mod_cast Nat.zero_le ξ) hlargeGap.le + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact sq_nonneg _ + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact section52LargeScalarAbsorptionConst_nonneg d + have hdecay_nonneg : 0 ≤ decay := by + dsimp [decay] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hsmall_eq : + (((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) = + 625 * S2 * B * decay := by + dsimp [D, S2, B, decay] + exact section52SmallRawCoeff_eq (d := d) (ξ := ξ) (m := m) + (s := s) (r := r) hr_pos + have hlarge : + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n) ≤ + L * A * decay := by + have hξ_one_real : (1 : ℝ) ≤ (ξ : ℝ) := by exact_mod_cast hξ_one + have hξ_two_real : (2 : ℝ) ≤ (ξ : ℝ) := by exact_mod_cast hξ_two + have h := + section52LargeScaleRootCoeff_scale_sum_le_momentBoundCoeff + (d := d) (ξ := ξ) (s := r) m + hξ_one_real hξ_two_real hr_pos.le hr_lt_one hlargeGap + simpa [section52MomentBoundCoeff, L, A, decay, div_eq_mul_inv, + mul_assoc] using h + have hlarge_absorb : + L * A * decay ≤ L * (S2 * A) * decay := by + have hA_le : A ≤ S2 * A := by + calc + A = 1 * A := by ring + _ ≤ S2 * A := mul_le_mul_of_nonneg_right hS2_ge_one hA_nonneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hA_le hL_nonneg) hdecay_nonneg + have hfinal : + 625 * S2 * B * decay + L * (S2 * A) * decay ≤ + (625 + L) * S2 * (A + B) * decay := by + have hterm1 : 0 ≤ 625 * S2 * A * decay := by positivity + have hterm2 : 0 ≤ L * S2 * B * decay := by positivity + nlinarith + calc + (((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n) + ≤ 625 * S2 * B * decay + L * A * decay := by + rw [hsmall_eq] + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hlarge (625 * S2 * B * decay) + _ ≤ 625 * S2 * B * decay + L * (S2 * A) * decay := + by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hlarge_absorb (625 * S2 * B * decay) + _ ≤ (625 + L) * S2 * (A + B) * decay := hfinal + _ = section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m := by + simp [section52TwoExponentMomentBoundCoeff, section52MomentLossCoeff, + L, A, B, S2, decay, div_eq_mul_inv] + ring_nf + exact Or.inl trivial + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/FluctuationBridge.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/FluctuationBridge.lean new file mode 100644 index 0000000000..7518538feb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/FluctuationBridge.lean @@ -0,0 +1,756 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients + +/-! # Fluctuation Bridge -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: FluctuationBridge + +Pointwise fluctuation bridges for positive-excess bounds. +-/ + +theorem finsetSupReal_eq_sup' {α : Type*} + (s : Finset α) (hs : s.Nonempty) (f : α → ℝ) : + Ch02.finsetSupReal s f = s.sup' hs f := by + apply le_antisymm + · exact Ch02.finsetSupReal_le s hs (fun x hx => Finset.le_sup' f hx) + · refine Finset.sup'_le hs f ?_ + intro x hx + unfold Ch02.finsetSupReal + have hbdd : BddAbove (f '' (↑s : Set α)) := + ((Set.toFinite _).image f).bddAbove + exact le_csSup hbdd ⟨x, hx, rfl⟩ + +theorem maxDescendantBMatrixNormCoeffFieldAtScale_eq_sup_upperLeft_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q k a = + (descendantsAtScale Q k).sup' (descendantsAtScale_nonempty Q hk) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hterm : + ∀ R ∈ descendantsAtScale Q k, + Ch02.coarseBMatrixNorm R F = + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft := by + intro R _hR + have hEq : + coarseBlockMatrix (cubeSet R) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + simp [Ch02.coarseBMatrixNorm, hEq] + calc + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q k a = + Ch02.maxDescendantBMatrixNormAtScale Q k F := by + simp [Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha, F] + _ = + Ch02.finsetSupReal (descendantsAtScale Q k) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) := by + simpa [Ch02.maxDescendantBMatrixNormAtScale] using + Ch02.finsetSupReal_congr (descendantsAtScale Q k) hterm + _ = + (descendantsAtScale Q k).sup' (descendantsAtScale_nonempty Q hk) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) := by + exact finsetSupReal_eq_sup' (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) _ + +theorem maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_eq_sup_lowerRight_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q k a = + (descendantsAtScale Q k).sup' (descendantsAtScale_nonempty Q hk) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hterm : + ∀ R ∈ descendantsAtScale Q k, + Ch02.coarseSigmaStarInvMatrixNorm R F = + Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight := by + intro R _hR + have hEq : + coarseBlockMatrix (cubeSet R) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R + simp [Ch02.coarseSigmaStarInvMatrixNorm, hEq] + calc + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q k a = + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k F := by + simp [Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha, F] + _ = + Ch02.finsetSupReal (descendantsAtScale Q k) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) := by + simpa [Ch02.maxDescendantSigmaStarInvMatrixNormAtScale] using + Ch02.finsetSupReal_congr (descendantsAtScale Q k) hterm + _ = + (descendantsAtScale Q k).sup' (descendantsAtScale_nonempty Q hk) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) := by + exact finsetSupReal_eq_sup' (descendantsAtScale Q k) + (descendantsAtScale_nonempty Q hk) _ + +theorem matrixNorm_smul_one_eq_of_nonneg + {d : ℕ} [NeZero d] {c : ℝ} (hc : 0 ≤ c) : + Ch02.matrixNorm (c • (1 : Mat d)) = c := by + simpa [Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.matrixOperatorNorm_smul_one_eq_of_nonneg (d := d) hc + +theorem upperLargeScaleRaw_sum_le_base_add_positiveExcess_sum + {d : ℕ} [NeZero d] (m : ℕ) {s base : ℝ} (hs : 0 < s) + (hbase : 0 ≤ base) (a : RegCoeffField d) : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) ≤ + base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + classical + let Qm : TriadicCube d := originCube d (m : ℤ) + let raw : ℤ → ℝ := + fun n => Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Qm n a + let excess : (n : ℤ) → n ∈ section52LargeScaleSet m → ℝ := + fun n hn => + let parents := descendantsAtScale Qm n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty Qm (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun R => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) + have hweighted := + weighted_sum_le_base_add_weighted_positiveExcess + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (f := raw) hbase + (fun n hn => section52LargeScaleWeight_nonneg m hs.le n) + (section52LargeScaleWeight_sum_le_one hs m) + have hterm : + ∀ (n : ℤ) (hn : n ∈ section52LargeScaleSet m), + max (raw n - base) 0 ≤ excess n hn := by + intro n hn + have hnle : n ≤ Qm.scale := by + simpa [Qm, originCube] using section52LargeScaleSet_mem_le_m hn + have hcenter : Ch02.matrixNorm (base • (1 : Mat d)) = base := + matrixNorm_smul_one_eq_of_nonneg hbase + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · have hraw_eq := + maxDescendantBMatrixNormCoeffFieldAtScale_eq_sup_upperLeft_of_aelocallyUniformlyEllipticField + (a := a) ha Qm hnle + simpa [raw, excess, hcenter, hraw_eq] using + max_sup'_sub_base_le_sup'_max_sub_base + (descendantsAtScale_nonempty Qm hnle) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft) + base + · have hraw_zero : raw n = 0 := by + simp [raw, Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha] + have hexcess_nonneg : 0 ≤ excess n hn := by + dsimp [excess] + let parents := descendantsAtScale Qm n + let hparents : parents.Nonempty := descendantsAtScale_nonempty Qm hnle + rcases hparents with ⟨R0, hR0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R0) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) 0).trans + (Finset.le_sup' + (s := parents) + (f := fun R => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) hR0) + simpa [raw, hraw_zero, hbase] using hexcess_nonneg + have hsum : + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * max (raw n.1 - base) 0) ≤ + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * excess n.1 n.2) := by + refine Finset.sum_le_sum ?_ + intro n hn + exact mul_le_mul_of_nonneg_left (hterm n.1 n.2) + (section52LargeScaleWeight_nonneg m hs.le n.1) + calc + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) + = ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * raw n := by + simp [raw, Qm] + _ ≤ base + + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * max (raw n - base) 0 := hweighted + _ ≤ base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * excess n.1 n.2) := by + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * max (raw n - base) 0) = + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * max (raw n.1 - base) 0) := by + exact (Finset.sum_attach (section52LargeScaleSet m) + (fun n => section52LargeScaleWeight s m n * max (raw n - base) 0)).symm + rw [hleft] + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hsum base + _ = + base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + simp [excess, Qm] + +theorem upperPositiveExcess_pointwise_le_smallTail_add_largeScalePositiveExcess + {d : ℕ} [NeZero d] (m : ℕ) {s base : ℝ} (hs : 0 < s) + (hbase : 0 ≤ base) (a : RegCoeffField d) : + max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a - base) + 0 ≤ + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + classical + let small : ℝ := + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + let largeRaw : ℝ := + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a + let largeExcess : ℝ := + (section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0)) + have hsmall_nonneg : 0 ≤ small := by + dsimp [small] + exact div_nonneg (sq_nonneg _) + (section52SmallTailWeight_pos hs m).le + have hlargeExcess_nonneg : 0 ≤ largeExcess := by + dsimp [largeExcess] + refine Finset.sum_nonneg ?_ + intro n _hn + refine mul_nonneg (section52LargeScaleWeight_nonneg m hs.le n.1) ?_ + let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) 0).trans + (Finset.le_sup' + (s := parents) + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) hQ0) + have hsplit : + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a ≤ + small + largeRaw := by + simpa [small, largeRaw, add_comm] using + LambdaSqCoeffField_originCube_finite_one_le_upperSmallSqrtTail_sq_div_add_largeScale_sum + (d := d) m hs a + have hlarge : + largeRaw ≤ base + largeExcess := by + simpa [largeRaw, largeExcess] using + upperLargeScaleRaw_sum_le_base_add_positiveExcess_sum + (d := d) m hs hbase a + have hpoint : + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a ≤ + base + (small + largeExcess) := by + linarith + have hnonneg : 0 ≤ small + largeExcess := add_nonneg hsmall_nonneg hlargeExcess_nonneg + exact max_sub_base_zero_le_of_le_base_add_nonneg hnonneg hpoint + +theorem lowerLargeScaleRaw_sum_le_base_add_positiveExcess_sum + {d : ℕ} [NeZero d] (m : ℕ) {s base : ℝ} (hs : 0 < s) + (hbase : 0 ≤ base) (a : RegCoeffField d) : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) ≤ + base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + classical + let Qm : TriadicCube d := originCube d (m : ℤ) + let raw : ℤ → ℝ := + fun n => Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Qm n a + let excess : (n : ℤ) → n ∈ section52LargeScaleSet m → ℝ := + fun n hn => + let parents := descendantsAtScale Qm n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty Qm (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun R => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) + have hweighted := + weighted_sum_le_base_add_weighted_positiveExcess + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (f := raw) hbase + (fun n hn => section52LargeScaleWeight_nonneg m hs.le n) + (section52LargeScaleWeight_sum_le_one hs m) + have hterm : + ∀ (n : ℤ) (hn : n ∈ section52LargeScaleSet m), + max (raw n - base) 0 ≤ excess n hn := by + intro n hn + have hnle : n ≤ Qm.scale := by + simpa [Qm, originCube] using section52LargeScaleSet_mem_le_m hn + have hcenter : Ch02.matrixNorm (base • (1 : Mat d)) = base := + matrixNorm_smul_one_eq_of_nonneg hbase + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · have hraw_eq := + maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_eq_sup_lowerRight_of_aelocallyUniformlyEllipticField + (a := a) ha Qm hnle + simpa [raw, excess, hcenter, hraw_eq] using + max_sup'_sub_base_le_sup'_max_sub_base + (descendantsAtScale_nonempty Qm hnle) + (fun R => Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight) + base + · have hraw_zero : raw n = 0 := by + simp [raw, Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + have hexcess_nonneg : 0 ≤ excess n hn := by + dsimp [excess] + let parents := descendantsAtScale Qm n + let hparents : parents.Nonempty := descendantsAtScale_nonempty Qm hnle + rcases hparents with ⟨R0, hR0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R0) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) 0).trans + (Finset.le_sup' + (s := parents) + (f := fun R => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet R) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) hR0) + simpa [raw, hraw_zero, hbase] using hexcess_nonneg + have hsum : + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * max (raw n.1 - base) 0) ≤ + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * excess n.1 n.2) := by + refine Finset.sum_le_sum ?_ + intro n hn + exact mul_le_mul_of_nonneg_left (hterm n.1 n.2) + (section52LargeScaleWeight_nonneg m hs.le n.1) + calc + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) + = ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * raw n := by + simp [raw, Qm] + _ ≤ base + + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * max (raw n - base) 0 := hweighted + _ ≤ base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * excess n.1 n.2) := by + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * max (raw n - base) 0) = + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * max (raw n.1 - base) 0) := by + exact (Finset.sum_attach (section52LargeScaleSet m) + (fun n => section52LargeScaleWeight s m n * max (raw n - base) 0)).symm + rw [hleft] + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hsum base + _ = + base + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + simp [excess, Qm] + +theorem lowerPositiveExcess_pointwise_le_smallTail_add_largeScalePositiveExcess + {d : ℕ} [NeZero d] (m : ℕ) {s base : ℝ} (hs : 0 < s) + (hbase : 0 ≤ base) (a : RegCoeffField d) : + max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ - base) + 0 ≤ + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + ((section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0))) := by + classical + let small : ℝ := + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + let largeRaw : ℝ := + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a + let largeExcess : ℝ := + (section52LargeScaleSet m).attach.sum fun n => + section52LargeScaleWeight s m n.1 * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0)) + have hsmall_nonneg : 0 ≤ small := by + dsimp [small] + exact div_nonneg (sq_nonneg _) + (section52SmallTailWeight_pos hs m).le + have hlargeExcess_nonneg : 0 ≤ largeExcess := by + dsimp [largeExcess] + refine Finset.sum_nonneg ?_ + intro n _hn + refine mul_nonneg (section52LargeScaleWeight_nonneg m hs.le n.1) ?_ + let parents := descendantsAtScale (originCube d (m : ℤ)) n.1 + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m n.2) + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) 0).trans + (Finset.le_sup' + (s := parents) + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0) hQ0) + have hsplit : + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ ≤ + small + largeRaw := by + simpa [small, largeRaw, add_comm] using + lambdaSqCoeffField_originCube_finite_one_inv_le_lowerSmallSqrtTail_sq_div_add_largeScale_sum + (d := d) m hs a + have hlarge : + largeRaw ≤ base + largeExcess := by + simpa [largeRaw, largeExcess] using + lowerLargeScaleRaw_sum_le_base_add_positiveExcess_sum + (d := d) m hs hbase a + have hpoint : + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ ≤ + base + (small + largeExcess) := by + linarith + have hnonneg : 0 ≤ small + largeExcess := add_nonneg hsmall_nonneg hlargeExcess_nonneg + exact max_sub_base_zero_le_of_le_base_add_nonneg hnonneg hpoint + +theorem section52_upperCenter_entries + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (i j : Fin d) : + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d)) i j = + ∫ b, (coarseBlockMatrix (cubeSet (originCube d (0 : ℤ))) b).upperLeft i j ∂P := by + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hb : + Ch04.annealedBAtScale P (0 : ℤ) = primitive0.barB • (1 : Mat d) := by + simpa [primitive0] using Ch04.Internal.AnnealedPrimitiveScalarizationData.b_eq primitive0 + have hbar : scalarization.barSigma 0 = primitive0.barB := by + simpa [scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigma_eq_barB scalarization primitive0 + calc + (scalarization.barSigma 0 • (1 : Mat d)) i j = + (primitive0.barB • (1 : Mat d)) i j := by rw [hbar] + _ = (Ch04.annealedBAtScale P (0 : ℤ)) i j := by rw [hb] + _ = ∫ b, (coarseBlockMatrix (cubeSet (originCube d (0 : ℤ))) b).upperLeft i j ∂P := by + rfl + +theorem section52_lowerCenter_entries + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (i j : Fin d) : + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d)) i j = + ∫ b, (coarseBlockMatrix (cubeSet (originCube d (0 : ℤ))) b).lowerRight i j ∂P := by + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hsigma : + Ch04.annealedSigmaStarInvAtScale P (0 : ℤ) = + primitive0.barSigmaStarInv • (1 : Mat d) := by + simpa [primitive0] using Ch04.Internal.AnnealedPrimitiveScalarizationData.sigmaStarInv_eq primitive0 + have hstar : + scalarization.barSigmaStar 0 = + (primitive0.barSigmaStarInv)⁻¹ := by + simpa [scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_eq_inv_barSigmaStarInv + scalarization primitive0 + calc + ((scalarization.barSigmaStar 0)⁻¹ • (1 : Mat d)) i j = + (primitive0.barSigmaStarInv • (1 : Mat d)) i j := by + rw [hstar, inv_inv] + _ = (Ch04.annealedSigmaStarInvAtScale P (0 : ℤ)) i j := by rw [hsigma] + _ = ∫ b, (coarseBlockMatrix (cubeSet (originCube d (0 : ℤ))) b).lowerRight i j ∂P := by + rfl + +theorem upperLargeScaleFiniteParentFluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m n : ℕ} (hnm : n ≤ m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) (n : ℤ) + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by + change (n : ℤ) ≤ (m : ℤ) + exact_mod_cast hnm) + let K := 2 * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let B := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) + Ch04.annealedMomentRoot P hP4.xi + (fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + ((parents.card : ℝ) ^ (1 / (hP4.xi : ℝ)) * B) := by + classical + intro parents hparents K B + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : (0 : ℤ) ≤ 0 := le_rfl + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = (n : ℤ) := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact_mod_cast Nat.zero_le n + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by norm_num) + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + have hbudget_nonneg : + ∀ Q : TriadicCube d, 0 ≤ section52UnitDescendantRosenthalBudget Q hP4.xi K := + fun Q => section52UnitDescendantRosenthalBudget_nonneg Q hP4.xi hK_nonneg + have hB_nonneg : 0 ≤ B := by + dsimp [B] + rcases hparents with ⟨Q0, hQ0⟩ + exact (hbudget_nonneg Q0).trans + (Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) hQ0) + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + hP4.xi) P ∧ + (∫ a, + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + intro i j + have h := + Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_upperLeft_entry_momentRoot_le_two_LambdaMomentAtScale + hP hP4.sUpper_pos (Nat.succ_le_of_lt hP4.xi_pos) + hP4.upper_moment_integrable i j + simpa [K] using h + exact + Ch04.RestrictionLawCarrier.upperLeft_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + hP hparents hn_nonneg hparent_scale hStruct.stationary hStruct.unit_range + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d)) + (section52_upperCenter_entries hP hStruct) + hP4.two_le_xi hK_nonneg hB_nonneg + (fun i j => (hOrigin i j).1) + (fun i j => (hOrigin i j).2) + (by + intro Q hQ + dsimp [B, section52UnitDescendantRosenthalBudget] + exact Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) hQ) + +theorem lowerLargeScaleFiniteParentFluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m n : ℕ} (hnm : n ≤ m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) (n : ℤ) + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by + change (n : ℤ) ≤ (m : ℤ) + exact_mod_cast hnm) + let K := 2 * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let B := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) + Ch04.annealedMomentRoot P hP4.xi + (fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + ((parents.card : ℝ) ^ (1 / (hP4.xi : ℝ)) * B) := by + classical + intro parents hparents K B + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : (0 : ℤ) ≤ 0 := le_rfl + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = (n : ℤ) := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact_mod_cast Nat.zero_le n + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (by norm_num) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + have hbudget_nonneg : + ∀ Q : TriadicCube d, 0 ≤ section52UnitDescendantRosenthalBudget Q hP4.xi K := + fun Q => section52UnitDescendantRosenthalBudget_nonneg Q hP4.xi hK_nonneg + have hB_nonneg : 0 ≤ B := by + dsimp [B] + rcases hparents with ⟨Q0, hQ0⟩ + exact (hbudget_nonneg Q0).trans + (Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) hQ0) + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + hP4.xi) P ∧ + (∫ a, + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + intro i j + have h := + Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_lowerRight_entry_momentRoot_le_two_lambdaInvMomentAtScale + hP hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hP4.lower_inv_moment_integrable i j + simpa [K] using h + exact + Ch04.RestrictionLawCarrier.lowerRight_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + hP hparents hn_nonneg hparent_scale hStruct.stationary hStruct.unit_range + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d)) + (section52_lowerCenter_entries hP hStruct) + hP4.two_le_xi hK_nonneg hB_nonneg + (fun i j => (hOrigin i j).1) + (fun i j => (hOrigin i j).2) + (by + intro Q hQ + dsimp [B, section52UnitDescendantRosenthalBudget] + exact Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) hQ) + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries.lean new file mode 100644 index 0000000000..368dd85951 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.TwoExponentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.SmallTailTerm + +/-! # Geometry Series -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/DescendantCardinality.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/DescendantCardinality.lean new file mode 100644 index 0000000000..46b3480628 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/DescendantCardinality.lean @@ -0,0 +1,685 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PointwiseSplits + +/-! # Descendant Cardinality -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: GeometrySeries + +Descendant geometry, geometric series, and small-tail estimates. +-/ + +/-- Cardinality of scale-`n` descendants of `cu_m`. -/ +theorem section52_descendantsAtScale_originCube_large_card + (d m : ℕ) {n : ℤ} (hn : n ≤ (m : ℤ)) : + (descendantsAtScale (originCube d (m : ℤ)) n).card = + (3 ^ d) ^ Int.toNat ((m : ℤ) - n) := by + rw [descendantsAtScale_eq_descendantsAtDepth (originCube d (m : ℤ)) hn] + exact descendantsAtDepth_card (originCube d (m : ℤ)) (Int.toNat ((m : ℤ) - n)) + +/-- Real `1 / xi` root of the number of scale-`n` descendants of `cu_m`. -/ +theorem section52_descendantsAtScale_originCube_large_card_rpow + (d ξ m : ℕ) {n : ℤ} (hn : n ≤ (m : ℤ)) : + (((descendantsAtScale (originCube d (m : ℤ)) n).card : ℝ) ^ + (1 / (ξ : ℝ))) = + Real.rpow (3 : ℝ) + (((d : ℝ) / (ξ : ℝ)) * (Int.toNat ((m : ℤ) - n) : ℝ)) := by + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + rw [section52_descendantsAtScale_originCube_large_card d m hn] + have hcast : + (((3 ^ d) ^ Int.toNat ((m : ℤ) - n) : ℕ) : ℝ) = + ((3 : ℝ) ^ (d * Int.toNat ((m : ℤ) - n))) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * Int.toNat ((m : ℤ) - n))] + rw [← Real.rpow_mul h3_nonneg] + congr 1 + rw [Nat.cast_mul] + ring_nf + +/-- Cardinality of unit descendants of a nonnegative-scale origin cube. -/ +theorem section52_descendantsAtScale_originCube_int_zero_card + (d : ℕ) {n : ℤ} (hn : 0 ≤ n) : + (descendantsAtScale (originCube d n) 0).card = + (3 ^ d) ^ Int.toNat n := by + rw [descendantsAtScale_eq_descendantsAtDepth (originCube d n) hn] + simpa [originCube] using descendantsAtDepth_card (originCube d n) (Int.toNat n) + +/-- Real `1 / xi` root of the number of unit descendants of a scale-`n` cube. -/ +theorem section52_descendantsAtScale_originCube_int_zero_card_rpow + (d ξ : ℕ) {n : ℤ} (hn : 0 ≤ n) : + (((descendantsAtScale (originCube d n) 0).card : ℝ) ^ + (1 / (ξ : ℝ))) = + Real.rpow (3 : ℝ) (((d : ℝ) / (ξ : ℝ)) * (Int.toNat n : ℝ)) := by + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + rw [section52_descendantsAtScale_originCube_int_zero_card d hn] + have hcast : + (((3 ^ d) ^ Int.toNat n : ℕ) : ℝ) = + ((3 : ℝ) ^ (d * Int.toNat n)) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * Int.toNat n)] + rw [← Real.rpow_mul h3_nonneg] + congr 1 + rw [Nat.cast_mul] + ring_nf + +/-- Square root of the number of unit descendants of a scale-`n` cube. -/ +theorem section52_descendantsAtScale_originCube_int_zero_card_sqrt + (d : ℕ) {n : ℤ} (hn : 0 ≤ n) : + Real.sqrt ((descendantsAtScale (originCube d n) 0).card : ℝ) = + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (Int.toNat n : ℝ)) := by + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + rw [Real.sqrt_eq_rpow] + rw [section52_descendantsAtScale_originCube_int_zero_card d hn] + have hcast : + (((3 ^ d) ^ Int.toNat n : ℕ) : ℝ) = + ((3 : ℝ) ^ (d * Int.toNat n)) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * Int.toNat n)] + rw [← Real.rpow_mul h3_nonneg] + congr 1 + rw [Nat.cast_mul] + ring_nf + +/-- Inverse of the number of unit descendants of a nonnegative-scale origin cube. -/ +theorem section52_descendantsAtScale_originCube_int_zero_card_inv + (d : ℕ) {n : ℤ} (hn : 0 ≤ n) : + (((descendantsAtScale (originCube d n) 0).card : ℝ)⁻¹) = + Real.rpow (3 : ℝ) (-(d : ℝ) * (Int.toNat n : ℝ)) := by + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + rw [section52_descendantsAtScale_originCube_int_zero_card d hn] + have hcast : + (((3 ^ d) ^ Int.toNat n : ℕ) : ℝ) = + ((3 : ℝ) ^ (d * Int.toNat n)) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * Int.toNat n)] + rw [show ((d * Int.toNat n : ℕ) : ℝ) = + (d : ℝ) * (Int.toNat n : ℝ) by rw [Nat.cast_mul]] + simpa [neg_mul] using + (Real.rpow_neg h3_nonneg ((d : ℝ) * (Int.toNat n : ℝ))).symm + +/-- +For manuscript large scales, the `q = 1` depth from `cu_m` to scale `n` plus +the absolute scale `n` is exactly `m`. +-/ +theorem section52LargeScaleSet_toNat_sub_add_toNat + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + Int.toNat ((m : ℤ) - n) + Int.toNat n = m := by + rcases Finset.mem_image.mp hn with ⟨l, hl, rfl⟩ + have hl_le : l ≤ m := Nat.le_of_lt (Finset.mem_range.mp hl) + have hsub : + Int.toNat ((m : ℤ) - ((m : ℤ) - (l : ℤ))) = l := by + have hdiff : (m : ℤ) - ((m : ℤ) - (l : ℤ)) = (l : ℤ) := by ring + simp [hdiff] + have hscale : + Int.toNat ((m : ℤ) - (l : ℤ)) = m - l := by + have hsub_int : (m : ℤ) - (l : ℤ) = ((m - l : ℕ) : ℤ) := by + omega + rw [hsub_int] + simp + rw [hsub, hscale] + omega + +/-- `Int.toNat` is injective on the nonnegative manuscript large scales. -/ +theorem section52LargeScaleSet_toNat_injOn (m : ℕ) : + Set.InjOn Int.toNat (↑(section52LargeScaleSet m) : Set ℤ) := by + intro n hn k hk hnk + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hk_nonneg : 0 ≤ k := section52LargeScaleSet_mem_nonneg hk + have hn_cast : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + have hk_cast : ((Int.toNat k : ℕ) : ℤ) = k := + Int.toNat_of_nonneg hk_nonneg + omega + +/-- The raw geometric powers underlying `q = 1` normalized weights are summable. -/ +theorem summable_rpow_three_neg_mul_nat {gap : ℝ} (hgap : 0 < gap) : + Summable (fun n : ℕ => Real.rpow (3 : ℝ) (-gap * (n : ℝ))) := by + have hdisc_pos : 0 < geometricDiscount gap 1 := + geometricDiscount_pos (by simpa using hgap) + refine + ((summable_geometricWeight_one hgap).mul_left + ((geometricDiscount gap 1)⁻¹)).congr ?_ + intro n + rw [geometricWeight_one_eq] + field_simp [hdisc_pos.ne'] + +/-- Closed form of the raw `q = 1` geometric-power series. -/ +theorem tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount {gap : ℝ} + (hgap : 0 < gap) : + (∑' n : ℕ, Real.rpow (3 : ℝ) (-gap * (n : ℝ))) = + (geometricDiscount gap 1)⁻¹ := by + have hdisc_pos : 0 < geometricDiscount gap 1 := + geometricDiscount_pos (by simpa using hgap) + calc + (∑' n : ℕ, Real.rpow (3 : ℝ) (-gap * (n : ℝ))) = + ∑' n : ℕ, (geometricDiscount gap 1)⁻¹ * geometricWeight gap 1 n := by + refine tsum_congr ?_ + intro n + rw [geometricWeight_one_eq] + field_simp [hdisc_pos.ne'] + _ = (geometricDiscount gap 1)⁻¹ * + ∑' n : ℕ, geometricWeight gap 1 n := by + rw [tsum_mul_left] + _ = (geometricDiscount gap 1)⁻¹ := by + rw [tsum_geometricWeight_one_eq_one hgap, mul_one] + +theorem section52SmallTailWeight_eq_rpow {s : ℝ} (hs : 0 < s) (m : ℕ) : + section52SmallTailWeight s m = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) := by + unfold section52SmallTailWeight + have h3 : 0 < (3 : ℝ) := by norm_num + have hdisc_pos : 0 < geometricDiscount s 1 := + geometricDiscount_pos (by simpa using hs) + calc + (∑' j : ℕ, geometricWeight s 1 (j + m)) = + ∑' j : ℕ, + geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * ((j + m : ℕ) : ℝ)) := by + refine tsum_congr ?_ + intro j + rw [geometricWeight_one_eq] + _ = + ∑' j : ℕ, + (geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * + Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + refine tsum_congr ?_ + intro j + calc + geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * ((j + m : ℕ) : ℝ)) = + geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * (m : ℝ) + -s * (j : ℝ)) := by + congr 1 + norm_num + ring_nf + _ = + geometricDiscount s 1 * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (3 : ℝ) (-s * (j : ℝ))) := by + exact congrArg (fun t => geometricDiscount s 1 * t) + (Real.rpow_add h3 (-s * (m : ℝ)) (-s * (j : ℝ))) + _ = + (geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * + Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by ring + _ = + (geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * + ∑' j : ℕ, Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + rw [tsum_mul_left] + _ = + (geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * + (geometricDiscount s 1)⁻¹ := by + rw [tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hs] + _ = Real.rpow (3 : ℝ) (-s * (m : ℝ)) := by + field_simp [hdisc_pos.ne'] + +/-- +The finite manuscript large-scale set is dominated by the full raw geometric +tail with the same positive gap. +-/ +theorem section52LargeScaleSet_raw_rpow_sum_le_inv_geometricDiscount + {gap : ℝ} (m : ℕ) (hgap : 0 < gap) : + (∑ n ∈ section52LargeScaleSet m, + Real.rpow (3 : ℝ) (-gap * (Int.toNat n : ℝ))) ≤ + (geometricDiscount gap 1)⁻¹ := by + classical + have hraw_summable := summable_rpow_three_neg_mul_nat hgap + have hsum_image : + (∑ n ∈ section52LargeScaleSet m, + Real.rpow (3 : ℝ) (-gap * (Int.toNat n : ℝ))) = + ∑ k ∈ (section52LargeScaleSet m).image Int.toNat, + Real.rpow (3 : ℝ) (-gap * (k : ℝ)) := by + rw [Finset.sum_image] + · exact section52LargeScaleSet_toNat_injOn m + rw [hsum_image] + calc + (∑ k ∈ (section52LargeScaleSet m).image Int.toNat, + Real.rpow (3 : ℝ) (-gap * (k : ℝ))) ≤ + ∑' k : ℕ, Real.rpow (3 : ℝ) (-gap * (k : ℝ)) := + hraw_summable.sum_le_tsum + ((section52LargeScaleSet m).image Int.toNat) + (fun k _hk => Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = (geometricDiscount gap 1)⁻¹ := + tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hgap + +/-- A one-step geometric discount is always at most one. -/ +theorem geometricDiscount_one_le_one (s : ℝ) : + geometricDiscount s 1 ≤ 1 := by + unfold geometricDiscount + have hpow_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-s * 1) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + linarith + +theorem geometricWeight_one_le_inv_discount_mul_gap_decay_mul_geometricWeight + {s r : ℝ} (hs : 0 < s) (_hsr : s < r) (N : ℕ) : + geometricWeight r 1 N ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (N : ℝ)) * + geometricWeight s 1 N := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hdisc_s_pos : 0 < geometricDiscount s 1 := + geometricDiscount_pos (by simpa using hs) + have hdisc_r_le_one : geometricDiscount r 1 ≤ 1 := + geometricDiscount_one_le_one r + have hpow_r_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-r * (N : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hpow_eq : + Real.rpow (3 : ℝ) (-(r - s) * (N : ℝ)) * + Real.rpow (3 : ℝ) (-s * (N : ℝ)) = + Real.rpow (3 : ℝ) (-r * (N : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-(r - s) * (N : ℝ)) * + Real.rpow (3 : ℝ) (-s * (N : ℝ)) = + Real.rpow (3 : ℝ) + (-(r - s) * (N : ℝ) + -s * (N : ℝ)) := by + exact (Real.rpow_add h3 (-(r - s) * (N : ℝ)) (-s * (N : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-r * (N : ℝ)) := by + congr 1 + ring + have hpow_eq' : + Real.rpow (3 : ℝ) (-(r * (N : ℝ))) = + Real.rpow (3 : ℝ) (-((N : ℝ) * (r - s))) * + Real.rpow (3 : ℝ) (-((N : ℝ) * s)) := by + rw [show -(r * (N : ℝ)) = -r * (N : ℝ) by ring] + rw [← hpow_eq] + congr 2 <;> ring + calc + geometricWeight r 1 N = + geometricDiscount r 1 * Real.rpow (3 : ℝ) (-r * (N : ℝ)) := by + rw [geometricWeight_one_eq] + _ ≤ 1 * Real.rpow (3 : ℝ) (-r * (N : ℝ)) := + mul_le_mul_of_nonneg_right hdisc_r_le_one hpow_r_nonneg + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (N : ℝ)) * + geometricWeight s 1 N := by + rw [geometricWeight_one_eq] + field_simp [hdisc_s_pos.ne'] + exact hpow_eq' + +theorem inv_geometricDiscount_one_le_five_inv_of_pos_lt_one + {s : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) : + (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + Book.Ch02.inv_geometricDiscount_le_five_inv + (s := s) (p := 1) hs hs_lt_one.le (by norm_num) + +theorem upper_unitCube_source_rpow_half_nonneg + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) (a : RegCoeffField d) : + 0 ≤ + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (by + classical + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube]) + rcases hD with ⟨U, hU⟩ + exact + (Ch04.LambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1)).trans + (Finset.le_sup' + (s := D) (f := fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) hU)) _ + +theorem lower_unitCube_source_rpow_half_nonneg + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) (a : RegCoeffField d) : + 0 ≤ + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (by + classical + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube]) + rcases hD with ⟨U, hU⟩ + exact + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1))).trans + (Finset.le_sup' + (s := D) + (f := fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) hU)) _ + +theorem translateCube_originCube_zero_eq_of_scale_zero + {d : ℕ} (Q : TriadicCube d) (hQ : Q.scale = 0) : + translateCube (Book.Ch04.scaleTranslationShift 0 Q) (originCube d 0) = Q := by + cases Q with + | mk scale index => + change scale = 0 at hQ + subst scale + simp [originCube, translateCube, Book.Ch04.scaleTranslationShift] + +theorem upper_unitDescendantSup_momentRoot_le_card_mul_origin + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) (hξ_one : 1 ≤ ξ) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) ≤ + (D.card : ℝ) ^ (1 / (ξ : ℝ)) * + Ch04.LambdaMomentAtScale P 0 s ξ := by + classical + intro D hD + let : IsProbabilityMeasure P := hP.isProbability + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => Ch04.LambdaSqCoeffField U s (.finite 1) a + let X0 : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a + have hK_nonneg : 0 ≤ Ch04.LambdaMomentAtScale P 0 s ξ := + Ch04.LambdaMomentAtScale_nonneg P 0 ξ hs + have hX_nonneg : ∀ U ∈ D, ∀ a, 0 ≤ X U a := by + intro U _hU a + exact Ch04.LambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hX_aemeas : ∀ U ∈ D, AEMeasurable (X U) P := by + intro U _hU + exact hP.aemeasurable_LambdaSqCoeffField_finite_one U hs + have hX0_aemeas : AEMeasurable X0 P := by + exact hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d 0) hs + have hX0_abs_int : Integrable (fun a : RegCoeffField d => |X0 a| ^ ξ) P := by + refine hSourceInt.congr ?_ + filter_upwards with a + rw [abs_of_nonneg] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hX_int : ∀ U ∈ D, Integrable (fun a : RegCoeffField d => |X U a| ^ ξ) P := by + intro U hU + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => X U a) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.LambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + simpa [X, X0, hUeq] using hcov + have hmap : + Measure.map (X U) P = Measure.map X0 P := by + calc + Measure.map (X U) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + exact integrable_abs_pow_of_map_eq_map_aemeasurable + (hX_aemeas U hU) hX0_aemeas hmap hX0_abs_int + have hX_root : + ∀ U ∈ D, + (∫ a, |X U a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ + Ch04.LambdaMomentAtScale P 0 s ξ := by + intro U hU + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => X U a) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.LambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + simpa [X, X0, hUeq] using hcov + have hmap : + Measure.map (X U) P = Measure.map X0 P := by + calc + Measure.map (X U) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + have hint : + ∫ a, |X U a| ^ ξ ∂P = ∫ a, |X0 a| ^ ξ ∂P := + integral_abs_pow_eq_of_map_eq_map_aemeasurable + (hX_aemeas U hU) hX0_aemeas hmap + calc + (∫ a, |X U a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + = (∫ a, |X0 a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by rw [hint] + _ ≤ Ch04.LambdaMomentAtScale P 0 s ξ := by + apply le_of_eq + unfold Ch04.LambdaMomentAtScale Ch04.annealedMomentRoot X0 + congr 2 with a + rw [abs_of_nonneg] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hsup := + Ch04.integral_finsetSup_abs_pow_rpow_inv_le_card_rpow_mul + (μ := P) (s := D) hD (p := ξ) + hξ_one hK_nonneg X hX_aemeas hX_int hX_root + calc + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + = + (∫ a, (D.sup' hD (fun U => |X U a|)) ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) := by + unfold Ch04.annealedMomentRoot + congr 2 with a + congr 1 + apply le_antisymm + · refine Finset.sup'_le hD _ ?_ + intro U hU + calc + X U a = |X U a| := (abs_of_nonneg (hX_nonneg U hU a)).symm + _ ≤ D.sup' hD (fun U => |X U a|) := + Finset.le_sup' (f := fun U => |X U a|) hU + · refine Finset.sup'_le hD _ ?_ + intro U hU + calc + |X U a| = X U a := abs_of_nonneg (hX_nonneg U hU a) + _ ≤ D.sup' hD (fun U => X U a) := + Finset.le_sup' (f := fun U => X U a) hU + _ ≤ (D.card : ℝ) ^ (1 / (ξ : ℝ)) * + Ch04.LambdaMomentAtScale P 0 s ξ := hsup + +theorem lower_unitDescendantSup_momentRoot_le_card_mul_origin + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) (hξ_one : 1 ≤ ξ) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) ≤ + (D.card : ℝ) ^ (1 / (ξ : ℝ)) * + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + classical + intro D hD + let : IsProbabilityMeasure P := hP.isProbability + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ + let X0 : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹ + have hK_nonneg : 0 ≤ Ch04.lambdaInvMomentAtScale P 0 s ξ := + Ch04.lambdaInvMomentAtScale_nonneg P 0 ξ hs + have hX_nonneg : ∀ U ∈ D, ∀ a, 0 ≤ X U a := by + intro U _hU a + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_aemeas : ∀ U ∈ D, AEMeasurable (X U) P := by + intro U _hU + exact hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs + have hX0_aemeas : AEMeasurable X0 P := by + exact hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d 0) hs + have hX0_abs_int : Integrable (fun a : RegCoeffField d => |X0 a| ^ ξ) P := by + refine hSourceInt.congr ?_ + filter_upwards with a + rw [abs_of_nonneg] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_int : ∀ U ∈ D, Integrable (fun a : RegCoeffField d => |X U a| ^ ξ) P := by + intro U hU + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => X U a) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.lambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + filter_upwards [by simpa [X, X0, hUeq] using! hcov] with a ha + simpa [X, X0, hUeq] using congrArg Inv.inv ha + have hmap : + Measure.map (X U) P = Measure.map X0 P := by + calc + Measure.map (X U) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + exact integrable_abs_pow_of_map_eq_map_aemeasurable + (hX_aemeas U hU) hX0_aemeas hmap hX0_abs_int + have hX_root : + ∀ U ∈ D, + (∫ a, |X U a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) ≤ + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + intro U hU + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => X U a) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.lambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + filter_upwards [by simpa [X, X0, hUeq] using! hcov] with a ha + simpa [X, X0, hUeq] using congrArg Inv.inv ha + have hmap : + Measure.map (X U) P = Measure.map X0 P := by + calc + Measure.map (X U) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + have hint : + ∫ a, |X U a| ^ ξ ∂P = ∫ a, |X0 a| ^ ξ ∂P := + integral_abs_pow_eq_of_map_eq_map_aemeasurable + (hX_aemeas U hU) hX0_aemeas hmap + calc + (∫ a, |X U a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) + = (∫ a, |X0 a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by rw [hint] + _ ≤ Ch04.lambdaInvMomentAtScale P 0 s ξ := by + apply le_of_eq + unfold Ch04.lambdaInvMomentAtScale Ch04.annealedMomentRoot X0 + congr 2 with a + rw [abs_of_nonneg] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hsup := + Ch04.integral_finsetSup_abs_pow_rpow_inv_le_card_rpow_mul + (μ := P) (s := D) hD (p := ξ) + hξ_one hK_nonneg X hX_aemeas hX_int hX_root + calc + Ch04.annealedMomentRoot P ξ + (fun a : RegCoeffField d => + D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + = + (∫ a, (D.sup' hD (fun U => |X U a|)) ^ ξ ∂P) ^ + (1 / (ξ : ℝ)) := by + unfold Ch04.annealedMomentRoot + congr 2 with a + congr 1 + apply le_antisymm + · refine Finset.sup'_le hD _ ?_ + intro U hU + calc + X U a = |X U a| := (abs_of_nonneg (hX_nonneg U hU a)).symm + _ ≤ D.sup' hD (fun U => |X U a|) := + Finset.le_sup' (f := fun U => |X U a|) hU + · refine Finset.sup'_le hD _ ?_ + intro U hU + calc + |X U a| = X U a := abs_of_nonneg (hX_nonneg U hU a) + _ ≤ D.sup' hD (fun U => X U a) := + Finset.le_sup' (f := fun U => X U a) hU + _ ≤ (D.card : ℝ) ^ (1 / (ξ : ℝ)) * + Ch04.lambdaInvMomentAtScale P 0 s ξ := hsup + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/SmallTailTerm.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/SmallTailTerm.lean new file mode 100644 index 0000000000..e4882badf4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/SmallTailTerm.lean @@ -0,0 +1,323 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PointwiseSplits +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.TwoExponentBounds + +/-! # Small Tail Term -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +theorem upperSmallTailTerm_le_raw_unitDescendantSup + {d : ℕ} [NeZero d] (m : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (hr : r < 1) (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + upperSmallSqrtTailCoeffField (d := d) m r a ^ 2 / + section52SmallTailWeight r m ≤ + ((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) := by + intro D hD + let S : ℝ := D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) + let B : ℝ := 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) + have hr_pos : 0 < r := hs.trans hsr + have hVpos : 0 < section52SmallTailWeight r m := + section52SmallTailWeight_pos hr_pos m + have hS_nonneg : 0 ≤ S := by + dsimp [S, D] + rcases hD with ⟨U0, hU0⟩ + exact + (Ch04.LambdaSqCoeffField_finite_nonneg U0 a hs + (by norm_num : (1 : ℝ) ≤ 1)).trans + (Finset.le_sup' + (f := fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) hU0) + have hsqrtS_nonneg : 0 ≤ Real.rpow S (1 / 2 : ℝ) := + Real.rpow_nonneg hS_nonneg _ + have hB_nonneg : 0 ≤ B := by + dsimp [B] + have hgap_pos : 0 < r - s := sub_pos.mpr hsr + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (25 : ℝ)) (inv_nonneg.mpr hs.le)) + (inv_nonneg.mpr hgap_pos.le)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hT_nonneg : 0 ≤ upperSmallSqrtTailCoeffField (d := d) m r a := + upperSmallSqrtTailCoeffField_nonneg m hr_pos.le a + have hT_le : + upperSmallSqrtTailCoeffField (d := d) m r a ≤ + B * Real.rpow S (1 / 2 : ℝ) := by + simpa [B, S, D] using + upperSmallSqrtTailCoeffField_le_two_exponent_unitCube_source + (d := d) m hs hsr hr a + have hsq : + upperSmallSqrtTailCoeffField (d := d) m r a ^ 2 ≤ + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 := + pow_le_pow_left₀ hT_nonneg hT_le 2 + have hsq_rhs : + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 = B ^ 2 * S := by + rw [mul_pow] + have hsS : (Real.rpow S (1 / 2 : ℝ)) ^ 2 = S := + Homogenization.sq_rpow_half_eq_self_of_nonneg hS_nonneg + rw [hsS] + calc + upperSmallSqrtTailCoeffField (d := d) m r a ^ 2 / + section52SmallTailWeight r m ≤ + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 / + section52SmallTailWeight r m := + div_le_div_of_nonneg_right hsq hVpos.le + _ = (B ^ 2 / section52SmallTailWeight r m) * S := by + rw [hsq_rhs] + ring + _ = + ((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) := by + simp [B, S] + +theorem lowerSmallTailTerm_le_raw_unitDescendantSup + {d : ℕ} [NeZero d] (m : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (hr : r < 1) (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + lowerSmallSqrtTailCoeffField (d := d) m r a ^ 2 / + section52SmallTailWeight r m ≤ + ((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) := by + intro D hD + let S : ℝ := D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) + let B : ℝ := 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) + have hr_pos : 0 < r := hs.trans hsr + have hVpos : 0 < section52SmallTailWeight r m := + section52SmallTailWeight_pos hr_pos m + have hS_nonneg : 0 ≤ S := by + dsimp [S, D] + rcases hD with ⟨U0, hU0⟩ + exact + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U0 a hs + (by norm_num : (1 : ℝ) ≤ 1))).trans + (Finset.le_sup' + (f := fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) hU0) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + have hgap_pos : 0 < r - s := sub_pos.mpr hsr + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (25 : ℝ)) (inv_nonneg.mpr hs.le)) + (inv_nonneg.mpr hgap_pos.le)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hT_nonneg : 0 ≤ lowerSmallSqrtTailCoeffField (d := d) m r a := + lowerSmallSqrtTailCoeffField_nonneg m hr_pos.le a + have hT_le : + lowerSmallSqrtTailCoeffField (d := d) m r a ≤ + B * Real.rpow S (1 / 2 : ℝ) := by + simpa [B, S, D] using + lowerSmallSqrtTailCoeffField_le_two_exponent_unitCube_source + (d := d) m hs hsr hr a + have hsq : + lowerSmallSqrtTailCoeffField (d := d) m r a ^ 2 ≤ + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 := + pow_le_pow_left₀ hT_nonneg hT_le 2 + have hsq_rhs : + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 = B ^ 2 * S := by + rw [mul_pow] + have hsS : (Real.rpow S (1 / 2 : ℝ)) ^ 2 = S := + Homogenization.sq_rpow_half_eq_self_of_nonneg hS_nonneg + rw [hsS] + calc + lowerSmallSqrtTailCoeffField (d := d) m r a ^ 2 / + section52SmallTailWeight r m ≤ + (B * Real.rpow S (1 / 2 : ℝ)) ^ 2 / + section52SmallTailWeight r m := + div_le_div_of_nonneg_right hsq hVpos.le + _ = (B ^ 2 / section52SmallTailWeight r m) * S := by + rw [hsq_rhs] + ring + _ = + ((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) := by + simp [B, S] + +theorem upperSmallTailTerm_le_sameExponent_unitDescendantSum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let V := section52SmallTailWeight s m + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / V ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V) * + ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a := by + classical + intro D V + have hVpos : 0 < V := by + simpa [V] using section52SmallTailWeight_pos hs m + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have htail : + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ)) * + ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a := by + simpa [upperSmallSqrtTailCoeffField, Ch02.upperSmallSqrtTail, + Ch02.geometricWeight_eq_old, D, F, + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, + Ch04.LambdaSqCoeffField, ha] using + Ch02.upperSmallSqrtTail_sq_le_scale_factor_sq_mul_card_sum_scale_zero_LambdaSq + (d := d) m hs F + calc + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / V + ≤ ((Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ)) * + ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a) / V := + div_le_div_of_nonneg_right htail hVpos.le + _ = + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V) * + ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a := by + ring + · have htail_zero : upperSmallSqrtTailCoeffField (d := d) m s a = 0 := by + simp [upperSmallSqrtTailCoeffField, + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha] + have hsum_nonneg : + 0 ≤ ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a := by + exact Finset.sum_nonneg fun U _hU => + Ch04.LambdaSqCoeffField_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1) + have hcoeff_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V := by + exact div_nonneg + (mul_nonneg (sq_nonneg _) (by exact_mod_cast Nat.zero_le D.card)) + hVpos.le + simpa [htail_zero] using mul_nonneg hcoeff_nonneg hsum_nonneg + +theorem lowerSmallTailTerm_le_sameExponent_unitDescendantSum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let V := section52SmallTailWeight s m + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / V ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V) * + ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ := by + classical + intro D V + have hVpos : 0 < V := by + simpa [V] using section52SmallTailWeight_pos hs m + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have htail : + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 ≤ + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ)) * + ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ := by + simpa [lowerSmallSqrtTailCoeffField, Ch02.lowerSmallSqrtTail, + Ch02.geometricWeight_eq_old, D, F, + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, + Ch04.lambdaSqCoeffField, ha] using + Ch02.lowerSmallSqrtTail_sq_le_scale_factor_sq_mul_card_sum_scale_zero_lambdaSq_inv + (d := d) m hs F + calc + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / V + ≤ ((Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ)) * + ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) / V := + div_le_div_of_nonneg_right htail hVpos.le + _ = + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V) * + ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ := by + ring + · have htail_zero : lowerSmallSqrtTailCoeffField (d := d) m s a = 0 := by + simp [lowerSmallSqrtTailCoeffField, + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + have hsum_nonneg : + 0 ≤ ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ := by + exact Finset.sum_nonneg fun U _hU => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)) + have hcoeff_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V := by + exact div_nonneg + (mul_nonneg (sq_nonneg _) (by exact_mod_cast Nat.zero_le D.card)) + hVpos.le + simpa [htail_zero] using mul_nonneg hcoeff_nonneg hsum_nonneg + +theorem inv_geometricDiscount_one_le_five_mul_upper_mul_inv + {gap B : ℝ} (hgap : 0 < gap) (hgap_le_B : gap ≤ B) (hB : 1 ≤ B) : + (geometricDiscount gap 1)⁻¹ ≤ 5 * B * gap⁻¹ := by + by_cases hgap_le_one : gap ≤ 1 + · have hinv : + (geometricDiscount gap 1)⁻¹ ≤ 5 * gap⁻¹ := + Book.Ch02.inv_geometricDiscount_le_five_inv + (s := gap) (p := 1) hgap hgap_le_one (by norm_num) + have hgap_inv_nonneg : 0 ≤ gap⁻¹ := inv_nonneg.mpr hgap.le + have hBmul : 5 * gap⁻¹ ≤ 5 * B * gap⁻¹ := by + calc + 5 * gap⁻¹ ≤ (5 * B) * gap⁻¹ := + mul_le_mul_of_nonneg_right (by nlinarith) hgap_inv_nonneg + _ = 5 * B * gap⁻¹ := by ring + exact hinv.trans hBmul + · have hone_le_gap : (1 : ℝ) ≤ gap := by linarith + have hdisc_gap_pos : 0 < geometricDiscount gap 1 := + geometricDiscount_pos (by simpa using hgap) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num) + have hmono : geometricDiscount (1 : ℝ) 1 ≤ geometricDiscount gap 1 := by + unfold geometricDiscount + have hpow : + Real.rpow (3 : ℝ) (-gap * 1) ≤ + Real.rpow (3 : ℝ) (-(1 : ℝ) * 1) := by + refine Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + linarith + have hinv_order : + (geometricDiscount gap 1)⁻¹ ≤ (geometricDiscount (1 : ℝ) 1)⁻¹ := + (inv_le_inv₀ hdisc_gap_pos hdisc_one_pos).2 hmono + have hinv_one : + (geometricDiscount (1 : ℝ) 1)⁻¹ ≤ 5 := by + have hinv_one_ch02 : + (Book.Ch02.geometricDiscount (1 : ℝ) 1)⁻¹ ≤ 5 * (1 : ℝ)⁻¹ := + Book.Ch02.inv_geometricDiscount_le_five_inv + (s := (1 : ℝ)) (p := 1) (by norm_num) (by norm_num) (by norm_num) + simpa [Book.Ch02.geometricDiscount_eq_old] using hinv_one_ch02 + have hone_le_B_mul_inv : (1 : ℝ) ≤ B * gap⁻¹ := by + have hmul : + gap * gap⁻¹ ≤ B * gap⁻¹ := + mul_le_mul_of_nonneg_right hgap_le_B (inv_nonneg.mpr hgap.le) + have hgap_mul_inv : gap * gap⁻¹ = 1 := by + field_simp [hgap.ne'] + simpa [hgap_mul_inv] using hmul + have hfive_le : (5 : ℝ) ≤ 5 * B * gap⁻¹ := by + calc + (5 : ℝ) = 5 * 1 := by ring + _ ≤ 5 * (B * gap⁻¹) := + mul_le_mul_of_nonneg_left hone_le_B_mul_inv (by norm_num) + _ = 5 * B * gap⁻¹ := by ring + exact hinv_order.trans (hinv_one.trans hfive_le) + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/TwoExponentBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/TwoExponentBounds.lean new file mode 100644 index 0000000000..2f64cd4917 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/GeometrySeries/TwoExponentBounds.lean @@ -0,0 +1,583 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PointwiseSplits +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality + +/-! # Two Exponent Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +theorem section52_gap_decay_mul_scale_decay_eq + {s r : ℝ} (m j : ℕ) : + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-s * (m : ℝ)) = + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + calc + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-s * (m : ℝ)) = + Real.rpow (3 : ℝ) + (-(r - s) * ((j + m : ℕ) : ℝ) + -s * (m : ℝ)) := by + exact (Real.rpow_add h3 _ _).symm + _ = Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ) + -r * (m : ℝ)) := by + congr 1 + norm_num + ring + _ = + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) := by + exact Real.rpow_add h3 _ _ + +theorem upperSmallSqrtTailCoeffField_term_le_two_exponent + {d : ℕ} [NeZero d] (m j : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (a : RegCoeffField d) : + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let source : ℝ := + Real.rpow + ((descendantsAtScale Q 0).sup' + (descendantsAtScale_nonempty Q (by simp [Q, originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) + have hsource_nonneg : 0 ≤ source := by + simpa [source, Q] using upper_unitCube_source_rpow_half_nonneg m hs a + have hdisc_nonneg : 0 ≤ (geometricDiscount s 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le + have hgap_decay_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hscale_decay_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let root : ℝ := + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + have hroot_nonneg : 0 ≤ root := by + exact Real.rpow_nonneg + (maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le Q a + (by dsimp [Q, originCube]; omega)) _ + have hweight : + geometricWeight r 1 (j + m) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + geometricWeight s 1 (j + m) := + geometricWeight_one_le_inv_discount_mul_gap_decay_mul_geometricWeight + hs hsr (j + m) + have hterm_s : + geometricWeight s 1 (j + m) * root ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source := by + simpa [Q, source, root, F, Ch02.geometricWeight_eq_old, + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, + Ch04.LambdaSqCoeffField, ha] using + Ch02.upperSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_LambdaSq_sup'_rpow_half + (d := d) m j hs F + have hcoef_nonneg : + 0 ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) := by + exact mul_nonneg hdisc_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + calc + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + = geometricWeight r 1 (j + m) * root := by simp [Q, root] + _ ≤ + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + geometricWeight s 1 (j + m)) * root := + mul_le_mul_of_nonneg_right hweight hroot_nonneg + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (geometricWeight s 1 (j + m) * root) := by ring + _ ≤ + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source) := + mul_le_mul_of_nonneg_left hterm_s hcoef_nonneg + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by + calc + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source) = + (geometricDiscount s 1)⁻¹ * + (Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * source := by ring + _ = + (geometricDiscount s 1)⁻¹ * + (Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) * source := by + rw [section52_gap_decay_mul_scale_decay_eq (s := s) (r := r) m j] + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by ring + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) := by + simp [source, Q] + · have hleft : + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) = 0 := by + simp [Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha] + rw [hleft] + positivity + +theorem lowerSmallSqrtTailCoeffField_term_le_two_exponent + {d : ℕ} [NeZero d] (m j : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (a : RegCoeffField d) : + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let source : ℝ := + Real.rpow + ((descendantsAtScale Q 0).sup' + (descendantsAtScale_nonempty Q (by simp [Q, originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) + have hsource_nonneg : 0 ≤ source := by + simpa [source, Q] using lower_unitCube_source_rpow_half_nonneg m hs a + have hdisc_nonneg : 0 ≤ (geometricDiscount s 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le + have hgap_decay_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hscale_decay_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let root : ℝ := + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + have hroot_nonneg : 0 ≤ root := by + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le Q a + (by dsimp [Q, originCube]; omega)) _ + have hweight : + geometricWeight r 1 (j + m) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + geometricWeight s 1 (j + m) := + geometricWeight_one_le_inv_discount_mul_gap_decay_mul_geometricWeight + hs hsr (j + m) + have hterm_s : + geometricWeight s 1 (j + m) * root ≤ + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source := by + simpa [Q, source, root, F, Ch02.geometricWeight_eq_old, + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, + Ch04.lambdaSqCoeffField, ha] using + Ch02.lowerSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_lambdaSq_inv_sup'_rpow_half + (d := d) m j hs F + have hcoef_nonneg : + 0 ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) := by + exact mul_nonneg hdisc_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + calc + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + = geometricWeight r 1 (j + m) * root := by simp [Q, root] + _ ≤ + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + geometricWeight s 1 (j + m)) * root := + mul_le_mul_of_nonneg_right hweight hroot_nonneg + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (geometricWeight s 1 (j + m) * root) := by ring + _ ≤ + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source) := + mul_le_mul_of_nonneg_left hterm_s hcoef_nonneg + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by + calc + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ))) * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * source) = + (geometricDiscount s 1)⁻¹ * + (Real.rpow (3 : ℝ) (-(r - s) * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-s * (m : ℝ))) * source := by ring + _ = + (geometricDiscount s 1)⁻¹ * + (Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) * source := by + rw [section52_gap_decay_mul_scale_decay_eq (s := s) (r := r) m j] + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by ring + _ = + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + simp [source, Q] + · have hleft : + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) = 0 := by + simp [Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + rw [hleft] + positivity + +theorem upperSmallSqrtTailCoeffField_le_two_exponent_unitCube_source + {d : ℕ} [NeZero d] (m : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (hr : r < 1) (a : RegCoeffField d) : + upperSmallSqrtTailCoeffField (d := d) m r a ≤ + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let source : ℝ := + Real.rpow + ((descendantsAtScale Q 0).sup' + (descendantsAtScale_nonempty Q (by simp [Q, originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) + let f : ℕ → ℝ := fun j => + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + let g : ℕ → ℝ := fun j => + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source + have hr_pos : 0 < r := hs.trans hsr + have hgap_pos : 0 < r - s := sub_pos.mpr hsr + have hgap_lt_one : r - s < 1 := by linarith + have hsource_nonneg : 0 ≤ source := by + simpa [source, Q] using upper_unitCube_source_rpow_half_nonneg m hs a + have hfSummable : Summable f := by + have hbase := + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantBMatrixNormCoeffFieldAtScale + (Q := Q) a hr_pos + have htail := (summable_nat_add_iff m).2 hbase + refine htail.congr ?_ + intro j + simp [f, Q, originCube, Ch02.geometricWeight_eq_old] + have hgSummable : Summable g := by + have hraw := summable_rpow_three_neg_mul_nat hgap_pos + refine + (hraw.mul_left + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source)).congr ?_ + intro j + simp [g] + ring + have hterm : ∀ j : ℕ, f j ≤ g j := by + intro j + simpa [f, g, Q, source] using + upperSmallSqrtTailCoeffField_term_le_two_exponent + (d := d) m j hs hsr a + have hsum : + upperSmallSqrtTailCoeffField (d := d) m r a ≤ ∑' j : ℕ, g j := by + calc + upperSmallSqrtTailCoeffField (d := d) m r a = ∑' j : ℕ, f j := by + simp [upperSmallSqrtTailCoeffField, f, Q] + _ ≤ ∑' j : ℕ, g j := + Summable.tsum_le_tsum hterm hfSummable hgSummable + have htsum_g : + (∑' j : ℕ, g j) = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + calc + (∑' j : ℕ, g j) = + ∑' j : ℕ, + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := by + refine tsum_congr ?_ + intro j + simp [g] + ring + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + ∑' j : ℕ, Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := by + rw [tsum_mul_left] + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + rw [tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hgap_pos] + have hdisc_s : + (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + inv_geometricDiscount_one_le_five_inv_of_pos_lt_one hs (by linarith) + have hdisc_gap : + (geometricDiscount (r - s) 1)⁻¹ ≤ 5 * (r - s)⁻¹ := + inv_geometricDiscount_one_le_five_inv_of_pos_lt_one hgap_pos hgap_lt_one + have hdisc_s_nonneg : 0 ≤ (geometricDiscount s 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le + have hdisc_gap_nonneg : 0 ≤ (geometricDiscount (r - s) 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hgap_pos)).le + have hscale_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmid_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source * + (geometricDiscount (r - s) 1)⁻¹ := by + exact mul_nonneg (mul_nonneg hscale_nonneg hsource_nonneg) hdisc_gap_nonneg + have hlast_nonneg : 0 ≤ 5 * (r - s)⁻¹ := by + exact mul_nonneg (by norm_num) (inv_nonneg.mpr hgap_pos.le) + calc + upperSmallSqrtTailCoeffField (d := d) m r a ≤ ∑' j : ℕ, g j := hsum + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := htsum_g + _ ≤ + (5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + nlinarith [mul_le_mul_of_nonneg_right hdisc_s hmid_nonneg] + _ ≤ + (5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (5 * (r - s)⁻¹) := by + have hleft_nonneg : + 0 ≤ 5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by + positivity + exact mul_le_mul_of_nonneg_left hdisc_gap hleft_nonneg + _ = + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by ring + _ = + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) + (1 / 2 : ℝ) := by + simp [source, Q] + +theorem lowerSmallSqrtTailCoeffField_le_two_exponent_unitCube_source + {d : ℕ} [NeZero d] (m : ℕ) {s r : ℝ} + (hs : 0 < s) (hsr : s < r) (hr : r < 1) (a : RegCoeffField d) : + lowerSmallSqrtTailCoeffField (d := d) m r a ≤ + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let source : ℝ := + Real.rpow + ((descendantsAtScale Q 0).sup' + (descendantsAtScale_nonempty Q (by simp [Q, originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) + let f : ℕ → ℝ := fun j => + geometricWeight r 1 (j + m) * + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + let g : ℕ → ℝ := fun j => + (geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source + have hr_pos : 0 < r := hs.trans hsr + have hgap_pos : 0 < r - s := sub_pos.mpr hsr + have hgap_lt_one : r - s < 1 := by linarith + have hsource_nonneg : 0 ≤ source := by + simpa [source, Q] using lower_unitCube_source_rpow_half_nonneg m hs a + have hfSummable : Summable f := by + have hbase := + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (Q := Q) a hr_pos + have htail := (summable_nat_add_iff m).2 hbase + refine htail.congr ?_ + intro j + simp [f, Q, originCube, Ch02.geometricWeight_eq_old] + have hgSummable : Summable g := by + have hraw := summable_rpow_three_neg_mul_nat hgap_pos + refine + (hraw.mul_left + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source)).congr ?_ + intro j + simp [g] + ring + have hterm : ∀ j : ℕ, f j ≤ g j := by + intro j + simpa [f, g, Q, source] using + lowerSmallSqrtTailCoeffField_term_le_two_exponent + (d := d) m j hs hsr a + have hsum : + lowerSmallSqrtTailCoeffField (d := d) m r a ≤ ∑' j : ℕ, g j := by + calc + lowerSmallSqrtTailCoeffField (d := d) m r a = ∑' j : ℕ, f j := by + simp [lowerSmallSqrtTailCoeffField, f, Q] + _ ≤ ∑' j : ℕ, g j := + Summable.tsum_le_tsum hterm hfSummable hgSummable + have htsum_g : + (∑' j : ℕ, g j) = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + calc + (∑' j : ℕ, g j) = + ∑' j : ℕ, + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := by + refine tsum_congr ?_ + intro j + simp [g] + ring + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + ∑' j : ℕ, Real.rpow (3 : ℝ) (-(r - s) * (j : ℝ)) := by + rw [tsum_mul_left] + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + rw [tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hgap_pos] + have hdisc_s : + (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := + inv_geometricDiscount_one_le_five_inv_of_pos_lt_one hs (by linarith) + have hdisc_gap : + (geometricDiscount (r - s) 1)⁻¹ ≤ 5 * (r - s)⁻¹ := + inv_geometricDiscount_one_le_five_inv_of_pos_lt_one hgap_pos hgap_lt_one + have hdisc_s_nonneg : 0 ≤ (geometricDiscount s 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le + have hdisc_gap_nonneg : 0 ≤ (geometricDiscount (r - s) 1)⁻¹ := + inv_nonneg.mpr (geometricDiscount_pos (by simpa using hgap_pos)).le + have hscale_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmid_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source * + (geometricDiscount (r - s) 1)⁻¹ := by + exact mul_nonneg (mul_nonneg hscale_nonneg hsource_nonneg) hdisc_gap_nonneg + have hlast_nonneg : 0 ≤ 5 * (r - s)⁻¹ := by + exact mul_nonneg (by norm_num) (inv_nonneg.mpr hgap_pos.le) + calc + lowerSmallSqrtTailCoeffField (d := d) m r a ≤ ∑' j : ℕ, g j := hsum + _ = + ((geometricDiscount s 1)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := htsum_g + _ ≤ + (5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (geometricDiscount (r - s) 1)⁻¹ := by + nlinarith [mul_le_mul_of_nonneg_right hdisc_s hmid_nonneg] + _ ≤ + (5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source) * + (5 * (r - s)⁻¹) := by + have hleft_nonneg : + 0 ≤ 5 * s⁻¹ * Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by + positivity + exact mul_le_mul_of_nonneg_left hdisc_gap hleft_nonneg + _ = + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * source := by ring + _ = + 25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ)) * + Real.rpow + ((descendantsAtScale (originCube d (m : ℤ)) 0).sup' + (descendantsAtScale_nonempty (originCube d (m : ℤ)) + (by simp [originCube])) + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) := by + simp [source, Q] + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/MomentBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/MomentBounds.lean new file mode 100644 index 0000000000..9537f938ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/MomentBounds.lean @@ -0,0 +1,1053 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability + +/-! # Moment Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: MomentBounds + +Final positive-excess and multiscale ellipticity moment bounds. +-/ + +private theorem section52_sum_insert_image_some + {ι α : Type*} [DecidableEq ι] [AddCommMonoid α] + (s : Finset ι) (x0 : α) (f : ι → α) : + (∑ o ∈ insert none (s.image some), + match o with + | none => x0 + | some i => f i) = + x0 + ∑ i ∈ s, f i := by + classical + simp + +private theorem section52_sum_insert_image_some_apply + {ι α β : Type*} [DecidableEq ι] [AddCommMonoid β] + (s : Finset ι) (x0 : α → β) (f : ι → α → β) (a : α) : + (∑ o ∈ insert none (s.image some), + (match o with + | none => x0 + | some i => f i) a) = + x0 a + ∑ i ∈ s, f i a := by + classical + simp + +theorem section52_annealedMomentRoot_positiveExcess_le_finset_sum + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} {ξ : ℕ} + {s : Finset ι} {X : RegCoeffField d → ℝ} {base : ℝ} + {G : ι → RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hG_nonneg : ∀ i ∈ s, ∀ a, 0 ≤ G i a) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) + (hExcess_int : + Integrable (fun a => |max (X a - base) 0| ^ ξ) P) + (hPoint : ∀ᵐ a ∂P, max (X a - base) 0 ≤ ∑ i ∈ s, G i a) : + Ch04.annealedMomentRoot P ξ (fun a => max (X a - base) 0) ≤ + ∑ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) := by + let Y : RegCoeffField d → ℝ := fun a => ∑ i ∈ s, G i a + have hY_nonneg : ∀ a, 0 ≤ Y a := by + intro a + exact Finset.sum_nonneg (fun i hi => hG_nonneg i hi a) + have hY_abs_int : Integrable (fun a => |Y a| ^ ξ) P := by + simpa [Y] using + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := s) (G := G) + hξ hG_aemeas hG_int + have hY_int : Integrable (fun a => Y a ^ ξ) P := by + refine hY_abs_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hY_nonneg a)] + have hPointY : (fun a => max (X a - base) 0) ≤ᵐ[P] Y := by + filter_upwards [hPoint] with a ha + simpa [Y] using ha + have hExcess_pow_int : + Integrable (fun a => (max (X a - base) 0) ^ ξ) P := by + refine hExcess_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (le_max_right (X a - base) 0)] + have hmono : + Ch04.annealedMomentRoot P ξ (fun a => max (X a - base) 0) ≤ + Ch04.annealedMomentRoot P ξ Y := + Ch04.annealedMomentRoot_le_of_ae_nonneg_le + (P := P) (ξ := ξ) + (X := fun a => max (X a - base) 0) (Y := Y) + hξ + (fun a => le_max_right (X a - base) 0) + hExcess_pow_int hY_int hPointY + have htriangle : + Ch04.annealedMomentRoot P ξ Y ≤ + ∑ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) := by + have hsum := + integral_abs_finsetSum_pow_rpow_inv_le_sum_aemeasurable + (μ := P) (s := s) (p := ξ) hξ hG_aemeas hG_int + calc + Ch04.annealedMomentRoot P ξ Y = + (∫ a, |∑ i ∈ s, G i a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + unfold Ch04.annealedMomentRoot + congr 1 + exact integral_congr_ae + (Filter.Eventually.of_forall fun a => by + simp [Y, abs_of_nonneg (hY_nonneg a)]) + _ ≤ ∑ i ∈ s, (∫ a, |G i a| ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := hsum + _ = ∑ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + unfold Ch04.annealedMomentRoot + congr 1 + exact integral_congr_ae + (Filter.Eventually.of_forall fun a => by + simp [abs_of_nonneg (hG_nonneg i hi a)]) + exact hmono.trans htriangle + +theorem section52_annealedMomentRoot_positiveExcess_le_scaled_initial + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} {ξ : ℕ} + {s : Finset ι} {X : RegCoeffField d → ℝ} {base initial finalCoeff : ℝ} + {G : ι → RegCoeffField d → ℝ} {coeff : ι → ℝ} + (hξ : 1 ≤ ξ) + (hInitial_nonneg : 0 ≤ initial) + (hG_nonneg : ∀ i ∈ s, ∀ a, 0 ≤ G i a) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) + (hExcess_int : + Integrable (fun a => |max (X a - base) 0| ^ ξ) P) + (hPoint : ∀ᵐ a ∂P, max (X a - base) 0 ≤ ∑ i ∈ s, G i a) + (hRoot : ∀ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) ≤ coeff i * initial) + (hCoeffSum : ∑ i ∈ s, coeff i ≤ finalCoeff) : + Ch04.annealedMomentRoot P ξ (fun a => max (X a - base) 0) ≤ + finalCoeff * initial := by + calc + Ch04.annealedMomentRoot P ξ (fun a => max (X a - base) 0) + ≤ ∑ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) := + section52_annealedMomentRoot_positiveExcess_le_finset_sum + (P := P) (ξ := ξ) (s := s) (X := X) (base := base) (G := G) + hξ hG_nonneg hG_aemeas hG_int hExcess_int hPoint + _ ≤ ∑ i ∈ s, coeff i * initial := + Finset.sum_le_sum hRoot + _ = (∑ i ∈ s, coeff i) * initial := by + rw [Finset.sum_mul] + _ ≤ finalCoeff * initial := + mul_le_mul_of_nonneg_right hCoeffSum hInitial_nonneg + +theorem section52_integrable_positiveExcess_pow_of_one_add_finset_bound + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} [DecidableEq ι] {ξ : ℕ} + {s : Finset ι} {X : RegCoeffField d → ℝ} {base : ℝ} + {G0 : RegCoeffField d → ℝ} {G : ι → RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hG0_nonneg : ∀ a, 0 ≤ G0 a) + (hG_nonneg : ∀ i ∈ s, ∀ a, 0 ≤ G i a) + (hG0_aemeas : AEMeasurable G0 P) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG0_int : Integrable (fun a => |G0 a| ^ ξ) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) + (hX_aemeas : AEMeasurable X P) + (hPoint : ∀ᵐ a ∂P, max (X a - base) 0 ≤ G0 a + ∑ i ∈ s, G i a) : + Integrable (fun a => (max (X a - base) 0) ^ ξ) P := by + classical + let I : Finset (Option ι) := insert none (s.image some) + let H : Option ι → RegCoeffField d → ℝ := fun o => + match o with + | none => G0 + | some i => G i + have hH_nonneg : ∀ o ∈ I, ∀ a, 0 ≤ H o a := by + intro o ho a + cases o with + | none => + exact hG0_nonneg a + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_nonneg i hi a + have hH_aemeas : ∀ o ∈ I, AEMeasurable (H o) P := by + intro o ho + cases o with + | none => + exact hG0_aemeas + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_aemeas i hi + have hH_int : ∀ o ∈ I, Integrable (fun a => |H o a| ^ ξ) P := by + intro o ho + cases o with + | none => + exact hG0_int + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_int i hi + have hPointI : + ∀ᵐ a ∂P, max (X a - base) 0 ≤ ∑ o ∈ I, H o a := by + filter_upwards [hPoint] with a ha + calc + max (X a - base) 0 ≤ G0 a + ∑ i ∈ s, G i a := ha + _ = ∑ o ∈ I, H o a := by + dsimp [I, H] + exact (section52_sum_insert_image_some_apply (s := s) (x0 := G0) + (f := G) a).symm + have hAbsInt : + Integrable (fun a => |max (X a - base) 0| ^ ξ) P := + section52_integrable_abs_positiveExcess_pow_of_ae_finset_sum_bound + (P := P) (ξ := ξ) (s := I) (X := X) (base := base) (G := H) + hξ hX_aemeas hH_nonneg hH_aemeas hH_int hPointI + refine hAbsInt.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (le_max_right (X a - base) 0)] + +theorem section52_annealedMomentRoot_positiveExcess_le_one_add_finset_scaled + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} [DecidableEq ι] {ξ : ℕ} + {s : Finset ι} {X : RegCoeffField d → ℝ} {base initial finalCoeff coeff0 : ℝ} + {G0 : RegCoeffField d → ℝ} {G : ι → RegCoeffField d → ℝ} {coeff : ι → ℝ} + (hξ : 1 ≤ ξ) + (hInitial_nonneg : 0 ≤ initial) + (hG0_nonneg : ∀ a, 0 ≤ G0 a) + (hG_nonneg : ∀ i ∈ s, ∀ a, 0 ≤ G i a) + (hG0_aemeas : AEMeasurable G0 P) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG0_int : Integrable (fun a => |G0 a| ^ ξ) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) + (hX_aemeas : AEMeasurable X P) + (hPoint : ∀ᵐ a ∂P, max (X a - base) 0 ≤ G0 a + ∑ i ∈ s, G i a) + (hRoot0 : Ch04.annealedMomentRoot P ξ G0 ≤ coeff0 * initial) + (hRoot : ∀ i ∈ s, Ch04.annealedMomentRoot P ξ (G i) ≤ coeff i * initial) + (hCoeffSum : coeff0 + ∑ i ∈ s, coeff i ≤ finalCoeff) : + Ch04.annealedMomentRoot P ξ (fun a => max (X a - base) 0) ≤ + finalCoeff * initial := by + classical + let I : Finset (Option ι) := insert none (s.image some) + let H : Option ι → RegCoeffField d → ℝ := fun o => + match o with + | none => G0 + | some i => G i + let C : Option ι → ℝ := fun o => + match o with + | none => coeff0 + | some i => coeff i + have hH_nonneg : ∀ o ∈ I, ∀ a, 0 ≤ H o a := by + intro o ho a + cases o with + | none => + exact hG0_nonneg a + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_nonneg i hi a + have hH_aemeas : ∀ o ∈ I, AEMeasurable (H o) P := by + intro o ho + cases o with + | none => + exact hG0_aemeas + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_aemeas i hi + have hH_int : ∀ o ∈ I, Integrable (fun a => |H o a| ^ ξ) P := by + intro o ho + cases o with + | none => + exact hG0_int + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hG_int i hi + have hPointI : + ∀ᵐ a ∂P, max (X a - base) 0 ≤ ∑ o ∈ I, H o a := by + filter_upwards [hPoint] with a ha + calc + max (X a - base) 0 ≤ G0 a + ∑ i ∈ s, G i a := ha + _ = ∑ o ∈ I, H o a := by + dsimp [I, H] + exact (section52_sum_insert_image_some_apply (s := s) (x0 := G0) + (f := G) a).symm + have hRootI : + ∀ o ∈ I, Ch04.annealedMomentRoot P ξ (H o) ≤ C o * initial := by + intro o ho + cases o with + | none => + exact hRoot0 + | some i => + have hi : i ∈ s := by + exact section52_mem_of_some_mem_insert_image_some (s := s) ho + exact hRoot i hi + have hCoeffI : ∑ o ∈ I, C o ≤ finalCoeff := by + calc + ∑ o ∈ I, C o = coeff0 + ∑ i ∈ s, coeff i := by + dsimp [I, C] + exact section52_sum_insert_image_some (s := s) (x0 := coeff0) (f := coeff) + _ ≤ finalCoeff := hCoeffSum + have hExcess_int : + Integrable (fun a => |max (X a - base) 0| ^ ξ) P := + section52_integrable_abs_positiveExcess_pow_of_ae_finset_sum_bound + (P := P) (ξ := ξ) (s := I) (X := X) (base := base) (G := H) + hξ hX_aemeas hH_nonneg hH_aemeas hH_int hPointI + exact + section52_annealedMomentRoot_positiveExcess_le_scaled_initial + (P := P) (ξ := ξ) (s := I) (X := X) (base := base) + (initial := initial) (finalCoeff := finalCoeff) (G := H) (coeff := C) + hξ hInitial_nonneg hH_nonneg hH_aemeas hH_int hExcess_int + hPointI hRootI hCoeffI + +theorem upperPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hUpperSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ ξ) P ∧ + LambdaPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.LambdaMomentAtScale P 0 s ξ := by + classical + intro D + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + let : IsProbabilityMeasure P := hP.isProbability + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let initial : ℝ := Ch04.LambdaMomentAtScale P 0 s ξ + let c0 : ℝ := + (25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m + let S : RegCoeffField d → ℝ := + fun a => D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) + let G0 : RegCoeffField d → ℝ := fun a => c0 * S a + let G : ℤ → RegCoeffField d → ℝ := fun n a => + if hn : n ∈ section52LargeScaleSet m then + section52LargeScaleWeight r m n * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (scalarization.barSigma 0 • (1 : Mat d))) + 0)) + else 0 + let coeff0 : ℝ := c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ)) + let coeff : ℤ → ℝ := fun n => + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d ξ r m n + have hr_pos : 0 < r := hs.trans hsr + have hr_nonneg : 0 ≤ r := hr_pos.le + have hgap_pos : 0 < r - s := sub_pos.mpr hsr + have hVpos : 0 < section52SmallTailWeight r m := + section52SmallTailWeight_pos hr_pos m + have hc0_nonneg : 0 ≤ c0 := by + dsimp [c0] + exact div_nonneg (sq_nonneg _) hVpos.le + have hInitial_nonneg : 0 ≤ initial := by + exact Ch04.LambdaMomentAtScale_nonneg P 0 ξ hs + have hbase_nonneg : 0 ≤ scalarization.barSigma 0 := by + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hBarSigma0_eq : + scalarization.barSigma 0 = + Ch04.Internal.barBAtScaleOfPrimitive primitive0 := by + simpa [scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigma_eq_barB + (Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + have hB0 : + 0 ≤ Ch04.Internal.barBAtScaleOfPrimitive primitive0 := by + simpa [primitive0] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + hBlock0 + simpa [hBarSigma0_eq] using hB0 + have hS_nonneg : ∀ a, 0 ≤ S a := by + intro a + exact upper_unitDescendantSup_nonneg (d := d) (s := s) (m := m) hs a + have hG0_nonneg : ∀ a, 0 ≤ G0 a := by + intro a + exact mul_nonneg hc0_nonneg (hS_nonneg a) + have hG_nonneg : + ∀ n ∈ section52LargeScaleSet m, ∀ a, 0 ≤ G n a := by + intro n hn a + simpa only [G, scalarization, hn, dif_pos] using! + upperLargeScalePositiveExcess_nonneg_source + hP hStruct hr_nonneg hn a + have hS_aemeas : AEMeasurable S P := by + exact upper_unitDescendantSup_aemeasurable + (d := d) (P := P) hP (s := s) (m := m) hs + have hG0_aemeas : AEMeasurable G0 P := by + exact aemeasurable_const.mul hS_aemeas + have hG_aemeas : + ∀ n ∈ section52LargeScaleSet m, AEMeasurable (G n) P := by + intro n hn + simpa only [G, scalarization, hn, dif_pos] using! + upperLargeScalePositiveExcess_aemeasurable_source + hP hStruct (r := r) hn + have hS_int : Integrable (fun a : RegCoeffField d => |S a| ^ ξ) P := by + exact upper_unitDescendantSup_integrable_abs_pow + (d := d) (P := P) hP hStruct (s := s) (ξ := ξ) (m := m) + hs hξ_one hUpperSourceInt + have hG0_int : Integrable (fun a : RegCoeffField d => |G0 a| ^ ξ) P := by + refine (hS_int.const_mul (|c0| ^ ξ)).congr ?_ + filter_upwards with a + simp only [G0, abs_mul, mul_pow] + have hG_int : + ∀ n ∈ section52LargeScaleSet m, + Integrable (fun a : RegCoeffField d => |G n a| ^ ξ) P := by + intro n hn + have hInt := + upperLargeScalePositiveExcess_integrable_abs_pow_source + hP hStruct (sSource := s) (r := r) (ξ := ξ) + hs hξ_one hξ_two hUpperSourceInt hn + simpa only [G, scalarization, Real.norm_eq_abs, hn, dif_pos] using! hInt + have hX_aemeas : + AEMeasurable + (fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a) P := + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d (m : ℤ)) hr_pos + have hPoint : + ∀ᵐ a ∂P, + max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a - + scalarization.barSigma 0) + 0 ≤ G0 a + ∑ n ∈ section52LargeScaleSet m, G n a := by + filter_upwards with a + have hsplit := + upperPositiveExcess_pointwise_le_smallTail_add_largeScalePositiveExcess + (d := d) m (s := r) (base := scalarization.barSigma 0) + hr_pos hbase_nonneg a + have hsmall := + upperSmallTailTerm_le_raw_unitDescendantSup + (d := d) m (s := s) (r := r) hs hsr hr_lt_one a + refine section52_le_add_finsetSum_of_le_add_attachSum + (G := fun n => G n a) hsplit hsmall ?_ + intro n + dsimp [G] + rw [dif_pos n.2] + have hRoot0 : Ch04.annealedMomentRoot P ξ G0 ≤ coeff0 * initial := by + have hSRoot := upper_unitDescendantSup_momentRoot_le_card_mul_origin + (d := d) (P := P) hP hStruct (s := s) (ξ := ξ) (m := m) + hs hξ_one hUpperSourceInt + calc + Ch04.annealedMomentRoot P ξ G0 = c0 * Ch04.annealedMomentRoot P ξ S := + section52_annealedMomentRoot_const_mul_of_nonneg hξ_one hc0_nonneg hS_nonneg + _ ≤ c0 * ((D.card : ℝ) ^ (1 / (ξ : ℝ)) * initial) := + mul_le_mul_of_nonneg_left hSRoot hc0_nonneg + _ = coeff0 * initial := (mul_assoc c0 _ initial).symm + have hRoot : + ∀ n ∈ section52LargeScaleSet m, + Ch04.annealedMomentRoot P ξ (G n) ≤ coeff n * initial := by + intro n hn + simpa only [G, coeff, scalarization, initial, hn, dif_pos, mul_assoc] using! + upperLargeScalePositiveExcessRoot_le_largeScaleRootCoeff_source + hP hStruct (sSource := s) (r := r) (ξ := ξ) + hs hr_nonneg hξ_one hξ_two hUpperSourceInt hn + have hCoeffSum : + coeff0 + ∑ n ∈ section52LargeScaleSet m, coeff n ≤ + ((c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) := by + dsimp [coeff0, coeff] + rw [Finset.mul_sum] + have hmain := + section52_annealedMomentRoot_positiveExcess_le_one_add_finset_scaled + (P := P) (ξ := ξ) (s := section52LargeScaleSet m) + (X := fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a) + (base := scalarization.barSigma 0) (initial := initial) + (finalCoeff := + (c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) + (coeff0 := coeff0) (G0 := G0) (G := G) (coeff := coeff) + hξ_one hInitial_nonneg hG0_nonneg hG_nonneg hG0_aemeas hG_aemeas + hG0_int hG_int hX_aemeas hPoint hRoot0 hRoot hCoeffSum + have hPowIntScalar : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a - + scalarization.barSigma 0) + 0) ^ ξ) P := + section52_integrable_positiveExcess_pow_of_one_add_finset_bound + (P := P) (ξ := ξ) (s := section52LargeScaleSet m) + (X := fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a) + (base := scalarization.barSigma 0) (G0 := G0) (G := G) + hξ_one hG0_nonneg hG_nonneg hG0_aemeas hG_aemeas + hG0_int hG_int hX_aemeas hPoint + exact ⟨hPowIntScalar, hmain⟩ + +theorem upperPositiveExcessMomentAtScale_le_raw_twoExponentCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hUpperSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + LambdaPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.LambdaMomentAtScale P 0 s ξ := by + classical + intro D + have h := + upperPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct (s := s) (r := r) (ξ := ξ) (m := m) + hs hsr hr_lt_one hξ_one hξ_two hBlock0 hUpperSourceInt + exact h.2 + +theorem lowerPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hLowerSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ ξ) P ∧ + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + classical + intro D + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + let : IsProbabilityMeasure P := hP.isProbability + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let initial : ℝ := Ch04.lambdaInvMomentAtScale P 0 s ξ + let c0 : ℝ := + (25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m + let S : RegCoeffField d → ℝ := + fun a => D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) + let G0 : RegCoeffField d → ℝ := fun a => c0 * S a + let G : ℤ → RegCoeffField d → ℝ := fun n a => + if hn : n ∈ section52LargeScaleSet m then + section52LargeScaleWeight r m n * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((scalarization.barSigmaStar 0)⁻¹ • (1 : Mat d))) + 0)) + else 0 + let coeff0 : ℝ := c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ)) + let coeff : ℤ → ℝ := fun n => + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d ξ r m n + have hr_pos : 0 < r := hs.trans hsr + have hr_nonneg : 0 ≤ r := hr_pos.le + have hVpos : 0 < section52SmallTailWeight r m := + section52SmallTailWeight_pos hr_pos m + have hc0_nonneg : 0 ≤ c0 := by + dsimp [c0] + exact div_nonneg (sq_nonneg _) hVpos.le + have hInitial_nonneg : 0 ≤ initial := by + exact Ch04.lambdaInvMomentAtScale_nonneg P 0 ξ hs + have hbase_nonneg : 0 ≤ (scalarization.barSigmaStar 0)⁻¹ := by + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hBarSigmaStar0_inv_eq : + (scalarization.barSigmaStar 0)⁻¹ = + Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0 := by + have hstar : + scalarization.barSigmaStar 0 = + (Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0)⁻¹ := by + simpa [scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_eq_inv_barSigmaStarInv + (Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + rw [hstar, inv_inv] + have hStar0 : + 0 < Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0 := by + simpa [primitive0] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + hBlock0 + simpa [hBarSigmaStar0_inv_eq] using hStar0.le + have hS_nonneg : ∀ a, 0 ≤ S a := by + intro a + exact lower_unitDescendantSup_nonneg (d := d) (s := s) (m := m) hs a + have hG0_nonneg : ∀ a, 0 ≤ G0 a := by + intro a + exact mul_nonneg hc0_nonneg (hS_nonneg a) + have hG_nonneg : + ∀ n ∈ section52LargeScaleSet m, ∀ a, 0 ≤ G n a := by + intro n hn a + simpa only [G, scalarization, hn, dif_pos] using! + lowerLargeScalePositiveExcess_nonneg_source + hP hStruct hr_nonneg hn a + have hS_aemeas : AEMeasurable S P := by + exact lower_unitDescendantSup_aemeasurable + (d := d) (P := P) hP (s := s) (m := m) hs + have hG0_aemeas : AEMeasurable G0 P := by + exact aemeasurable_const.mul hS_aemeas + have hG_aemeas : + ∀ n ∈ section52LargeScaleSet m, AEMeasurable (G n) P := by + intro n hn + simpa only [G, scalarization, hn, dif_pos] using! + lowerLargeScalePositiveExcess_aemeasurable_source + hP hStruct (r := r) hn + have hS_int : Integrable (fun a : RegCoeffField d => |S a| ^ ξ) P := by + exact lower_unitDescendantSup_integrable_abs_pow + (d := d) (P := P) hP hStruct (s := s) (ξ := ξ) (m := m) + hs hξ_one hLowerSourceInt + have hG0_int : Integrable (fun a : RegCoeffField d => |G0 a| ^ ξ) P := by + refine (hS_int.const_mul (|c0| ^ ξ)).congr ?_ + filter_upwards with a + simp only [G0, abs_mul, mul_pow] + have hG_int : + ∀ n ∈ section52LargeScaleSet m, + Integrable (fun a : RegCoeffField d => |G n a| ^ ξ) P := by + intro n hn + have hInt := + lowerLargeScalePositiveExcess_integrable_abs_pow_source + hP hStruct (sSource := s) (r := r) (ξ := ξ) + hs hξ_one hξ_two hLowerSourceInt hn + simpa only [G, scalarization, Real.norm_eq_abs, hn, dif_pos] using! hInt + have hX_aemeas : + AEMeasurable + (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹) P := + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d (m : ℤ)) hr_pos + have hPoint : + ∀ᵐ a ∂P, + max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹ - + (scalarization.barSigmaStar 0)⁻¹) + 0 ≤ G0 a + ∑ n ∈ section52LargeScaleSet m, G n a := by + filter_upwards with a + have hsplit := + lowerPositiveExcess_pointwise_le_smallTail_add_largeScalePositiveExcess + (d := d) m (s := r) (base := (scalarization.barSigmaStar 0)⁻¹) + hr_pos hbase_nonneg a + have hsmall := + lowerSmallTailTerm_le_raw_unitDescendantSup + (d := d) m (s := s) (r := r) hs hsr hr_lt_one a + refine section52_le_add_finsetSum_of_le_add_attachSum + (G := fun n => G n a) hsplit hsmall ?_ + intro n + dsimp [G] + rw [dif_pos n.2] + have hRoot0 : Ch04.annealedMomentRoot P ξ G0 ≤ coeff0 * initial := by + have hSRoot := lower_unitDescendantSup_momentRoot_le_card_mul_origin + (d := d) (P := P) hP hStruct (s := s) (ξ := ξ) (m := m) + hs hξ_one hLowerSourceInt + calc + Ch04.annealedMomentRoot P ξ G0 = c0 * Ch04.annealedMomentRoot P ξ S := + section52_annealedMomentRoot_const_mul_of_nonneg hξ_one hc0_nonneg hS_nonneg + _ ≤ c0 * ((D.card : ℝ) ^ (1 / (ξ : ℝ)) * initial) := + mul_le_mul_of_nonneg_left hSRoot hc0_nonneg + _ = coeff0 * initial := (mul_assoc c0 _ initial).symm + have hRoot : + ∀ n ∈ section52LargeScaleSet m, + Ch04.annealedMomentRoot P ξ (G n) ≤ coeff n * initial := by + intro n hn + simpa only [G, coeff, scalarization, initial, hn, dif_pos, mul_assoc] using! + lowerLargeScalePositiveExcessRoot_le_largeScaleRootCoeff_source + hP hStruct (sSource := s) (r := r) (ξ := ξ) + hs hr_nonneg hξ_one hξ_two hLowerSourceInt hn + have hCoeffSum : + coeff0 + ∑ n ∈ section52LargeScaleSet m, coeff n ≤ + ((c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) := by + dsimp [coeff0, coeff] + rw [Finset.mul_sum] + have hmain := + section52_annealedMomentRoot_positiveExcess_le_one_add_finset_scaled + (P := P) (ξ := ξ) (s := section52LargeScaleSet m) + (X := fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹) + (base := (scalarization.barSigmaStar 0)⁻¹) (initial := initial) + (finalCoeff := + (c0 * (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) + (coeff0 := coeff0) (G0 := G0) (G := G) (coeff := coeff) + hξ_one hInitial_nonneg hG0_nonneg hG_nonneg hG0_aemeas hG_aemeas + hG0_int hG_int hX_aemeas hPoint hRoot0 hRoot hCoeffSum + have hPowIntScalar : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹ - + (scalarization.barSigmaStar 0)⁻¹) + 0) ^ ξ) P := + section52_integrable_positiveExcess_pow_of_one_add_finset_bound + (P := P) (ξ := ξ) (s := section52LargeScaleSet m) + (X := fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) r (.finite 1) a)⁻¹) + (base := (scalarization.barSigmaStar 0)⁻¹) (G0 := G0) (G := G) + hξ_one hG0_nonneg hG_nonneg hG0_aemeas hG_aemeas + hG0_int hG_int hX_aemeas hPoint + exact ⟨hPowIntScalar, hmain⟩ + +theorem lowerPositiveExcessMomentAtScale_le_raw_twoExponentCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hLowerSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + classical + intro D + have h := + lowerPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct (s := s) (r := r) (ξ := ξ) (m := m) + hs hsr hr_lt_one hξ_one hξ_two hBlock0 hLowerSourceInt + exact h.2 + +/-- Upper positive-excess estimate in the corrected two-exponent Section 5.2 +moment lemma. The source exponent is `s`; the scale-`m` target exponent is +`r`. -/ +theorem LambdaPositiveExcessMomentAtScale_le_twoExponentMomentBoundCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hlargeGap : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hUpperSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) : + LambdaPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m * + Ch04.LambdaMomentAtScale P 0 s ξ := by + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + have hraw := + upperPositiveExcessMomentAtScale_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct (s := s) (r := r) (ξ := ξ) (m := m) + hs hsr hr_lt_one hξ_one hξ_two hBlock0 hUpperSourceInt + have hcoeff := + section52RawTwoExponentCoeff_le_twoExponentMomentBoundCoeff + (d := d) (ξ := ξ) (m := m) (s := s) (r := r) + hξ_one hξ_two hs hsr hr_lt_one hlargeGap + have hinitial_nonneg : 0 ≤ Ch04.LambdaMomentAtScale P 0 s ξ := + Ch04.LambdaMomentAtScale_nonneg P 0 ξ hs + calc + LambdaPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct + ≤ ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.LambdaMomentAtScale P 0 s ξ := by + exact hraw + _ ≤ section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m * + Ch04.LambdaMomentAtScale P 0 s ξ := + mul_le_mul_of_nonneg_right + (by + change + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) ≤ + section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m + exact hcoeff) + hinitial_nonneg + +/-- Lower inverse positive-excess estimate in the corrected two-exponent +Section 5.2 moment lemma. -/ +theorem lambdaInvPositiveExcessMomentAtScale_le_twoExponentMomentBoundCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s r : ℝ} {ξ m : ℕ} + (hs : 0 < s) (hsr : s < r) (hr_lt_one : r < 1) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hlargeGap : 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) + (hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P) + (hLowerSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct ≤ + section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m * + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + have hraw := + lowerPositiveExcessMomentAtScale_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct (s := s) (r := r) (ξ := ξ) (m := m) + hs hsr hr_lt_one hξ_one hξ_two hBlock0 hLowerSourceInt + have hcoeff := + section52RawTwoExponentCoeff_le_twoExponentMomentBoundCoeff + (d := d) (ξ := ξ) (m := m) (s := s) (r := r) + hξ_one hξ_two hs hsr hr_lt_one hlargeGap + have hinitial_nonneg : 0 ≤ Ch04.lambdaInvMomentAtScale P 0 s ξ := + Ch04.lambdaInvMomentAtScale_nonneg P 0 ξ hs + calc + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) r ξ + hP hStruct + ≤ ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) * + Ch04.lambdaInvMomentAtScale P 0 s ξ := by + exact hraw + _ ≤ section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m * + Ch04.lambdaInvMomentAtScale P 0 s ξ := + mul_le_mul_of_nonneg_right + (by + change + ((((25 * s⁻¹ * (r - s)⁻¹ * + Real.rpow (3 : ℝ) (-r * (m : ℝ))) ^ 2 / + section52SmallTailWeight r m) * + (D.card : ℝ) ^ (1 / (ξ : ℝ))) + + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleRootCoeff d ξ r m n)) ≤ + section52TwoExponentMomentBoundCoeff d ξ + (625 + section52LargeScalarAbsorptionConst d) s r m + exact hcoeff) + hinitial_nonneg + +/-- The shifted upper positive excess appearing in Section 5.3 is integrable +under `(P4)`. This extracts the integrability already used inside the +Section 5.2 two-exponent moment estimate. -/ +theorem upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {rUpper : ℝ} (hrUpper_gt : hP4.sUpper < rUpper) + (hrUpper_lt_one : rUpper < 1) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P := by + have hξ_one : 1 ≤ hP4.xi := Nat.succ_le_of_lt hP4.xi_pos + have hξ_two : 2 ≤ hP4.xi := hP4.two_le_xi + have hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + hP4.sUpper_pos hP4.sLower_pos hξ_one + hP4.upper_moment_integrable hP4.lower_inv_moment_integrable + simpa using + (upperPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct + (s := hP4.sUpper) (r := rUpper) (ξ := hP4.xi) (m := m) + hP4.sUpper_pos hrUpper_gt hrUpper_lt_one hξ_one hξ_two + hBlock0 hP4.upper_moment_integrable).1 + +/-- The shifted lower inverse positive excess appearing in Section 5.3 is +integrable under `(P4)`. -/ +theorem lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {rLower : ℝ} (hrLower_gt : hP4.sLower < rLower) + (hrLower_lt_one : rLower < 1) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P := by + have hξ_one : 1 ≤ hP4.xi := Nat.succ_le_of_lt hP4.xi_pos + have hξ_two : 2 ≤ hP4.xi := hP4.two_le_xi + have hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + hP4.sUpper_pos hP4.sLower_pos hξ_one + hP4.upper_moment_integrable hP4.lower_inv_moment_integrable + simpa using + (lowerPositiveExcessMomentAtScale_integrable_and_le_raw_twoExponentCoeff + (d := d) (P := P) hP hStruct + (s := hP4.sLower) (r := rLower) (ξ := hP4.xi) (m := m) + hP4.sLower_pos hrLower_gt hrLower_lt_one hξ_one hξ_two + hBlock0 hP4.lower_inv_moment_integrable).1 + +/-- Manuscript Lemma `l.multiscale.ellipticity.moments.homogenization.scale`, +in its corrected two-exponent form. + +The single constant is explicit in Lean and depends only on `d`; the public +statement exposes it existentially, matching the manuscript's `C(d)`. -/ +theorem multiscaleEllipticityMomentBounds_homogenizationScale + {d : ℕ} [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + ∀ (rUpper rLower : ℝ) (m : ℕ), + hP4.sUpper < rUpper → rUpper < 1 → + hP4.sLower < rLower → rLower < 1 → + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi + hP hStruct ≤ + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sUpper rUpper m * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi ∧ + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi + hP hStruct ≤ + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sLower rLower m * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + refine ⟨625 + section52LargeScalarAbsorptionConst d, + add_nonneg (by norm_num) (section52LargeScalarAbsorptionConst_nonneg d), ?_⟩ + intro P hP hStruct hP4 rUpper rLower m hsrUpper hrUpper hsrLower hrLower + have hξ_one : 1 ≤ hP4.xi := Nat.succ_le_of_lt hP4.xi_pos + have hξ_two : 2 ≤ hP4.xi := hP4.two_le_xi + have hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + hP4.sUpper_pos hP4.sLower_pos hξ_one + hP4.upper_moment_integrable hP4.lower_inv_moment_integrable + have hUpperGap : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - rUpper := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by + rw [le_div_iff₀ (by norm_num : (0 : ℝ) < 2)] + simpa using hd_two + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg hd_nonneg hxi_nonneg + have hr_lt : + rUpper < (d : ℝ) / 2 + (d : ℝ) / (hP4.xi : ℝ) := by + calc + rUpper < 1 := hrUpper + _ ≤ (d : ℝ) / 2 := hd_half + _ ≤ (d : ℝ) / 2 + (d : ℝ) / (hP4.xi : ℝ) := + le_add_of_nonneg_right hdiv_nonneg + exact sub_pos.mpr hr_lt + have hLowerGap : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - rLower := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by + rw [le_div_iff₀ (by norm_num : (0 : ℝ) < 2)] + simpa using hd_two + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg hd_nonneg hxi_nonneg + have hr_lt : + rLower < (d : ℝ) / 2 + (d : ℝ) / (hP4.xi : ℝ) := by + calc + rLower < 1 := hrLower + _ ≤ (d : ℝ) / 2 := hd_half + _ ≤ (d : ℝ) / 2 + (d : ℝ) / (hP4.xi : ℝ) := + le_add_of_nonneg_right hdiv_nonneg + exact sub_pos.mpr hr_lt + constructor + · exact + LambdaPositiveExcessMomentAtScale_le_twoExponentMomentBoundCoeff + hP hStruct hP4.sUpper_pos hsrUpper hrUpper hξ_one hξ_two + hUpperGap hBlock0 hP4.upper_moment_integrable + · exact + lambdaInvPositiveExcessMomentAtScale_le_twoExponentMomentBoundCoeff + hP hStruct hP4.sLower_pos hsrLower hrLower hξ_one hξ_two + hLowerGap hBlock0 hP4.lower_inv_moment_integrable + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/P4Integrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/P4Integrability.lean new file mode 100644 index 0000000000..574f6dd14c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/P4Integrability.lean @@ -0,0 +1,581 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.LowerVariants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.PowIntegrable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup + +/-! # P4Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: P4Integrability + +Origin-block integrability consequences of P4. +-/ + +private theorem memLp_two_of_nonneg_pow_integrable + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 2 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hXpow_int : Integrable (fun a => X a ^ ξ) P) : + MemLp X (2 : ENNReal) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hnormpow_int : Integrable (fun a => ‖X a‖ ^ ξ) P := by + refine hXpow_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + simp [Real.norm_eq_abs, abs_of_nonneg ha] + have hmem_ξ : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa using hnormpow_int + exact hmem_ξ.mono_exponent (by exact_mod_cast hξ) + +private theorem integrable_abs_sq_of_ae_abs_le_nonneg_memLp_two + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} + {X Y : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hY_nonneg : ∀ a, 0 ≤ Y a) + (hXY : ∀ᵐ a ∂P, |X a| ≤ Y a) + (hY_mem : MemLp Y (2 : ENNReal) P) : + Integrable (fun a => |X a| ^ 2) P := by + have hY_int : Integrable (fun a => |Y a| ^ 2) P := by + simpa [Real.norm_eq_abs] using hY_mem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + refine Integrable.mono' hY_int + ((hX_meas.norm.pow_const 2).aestronglyMeasurable) ?_ + filter_upwards [hXY] with a ha + have hpow : |X a| ^ 2 ≤ Y a ^ 2 := + pow_le_pow_left₀ (abs_nonneg (X a)) ha 2 + have hleft : ‖|X a| ^ 2‖ = |X a| ^ 2 := by + simp [Real.norm_eq_abs] + have hright : |Y a| ^ 2 = Y a ^ 2 := by + rw [abs_of_nonneg (hY_nonneg a)] + simpa [hleft, hright] using hpow + +private theorem norm_toEuclideanCLM_le_sum_abs_entries + {ι : Type*} [Fintype ι] [DecidableEq ι] (M : Matrix ι ι ℝ) : + ‖Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M‖ ≤ + (Fintype.card ι : ℝ) * ∑ i : ι, ∑ j : ι, |M i j| := by + classical + let S : ℝ := ∑ i : ι, ∑ j : ι, |M i j| + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + refine ContinuousLinearMap.opNorm_le_bound _ + (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) ?_ + intro x + have hcoord : + ∀ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ≤ + S * ‖x‖ := by + intro i + calc + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ + = |∑ j : ι, M i j * x.ofLp j| := by + simp [Real.norm_eq_abs, Matrix.mulVec, dotProduct] + _ ≤ ∑ j : ι, |M i j * x.ofLp j| := + Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun j => M i j * x.ofLp j) + _ = ∑ j : ι, |M i j| * ‖x.ofLp j‖ := by + simp [abs_mul, Real.norm_eq_abs] + _ ≤ ∑ j : ι, |M i j| * ‖x‖ := by + exact Finset.sum_le_sum fun j _ => + mul_le_mul_of_nonneg_left (PiLp.norm_apply_le x j) (abs_nonneg _) + _ = (∑ j : ι, |M i j|) * ‖x‖ := by + rw [Finset.sum_mul] + _ ≤ S * ‖x‖ := by + exact mul_le_mul_of_nonneg_right + (Finset.single_le_sum + (fun k _ => Finset.sum_nonneg fun j _ => abs_nonneg (M k j)) + (Finset.mem_univ i)) + (norm_nonneg x) + have hnorm_sq : + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 ≤ + (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + calc + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 + = ∑ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ^ 2 := by + rw [EuclideanSpace.norm_sq_eq] + _ ≤ ∑ i : ι, (S * ‖x‖) ^ 2 := by + exact Finset.sum_le_sum fun i _ => + pow_le_pow_left₀ (norm_nonneg _) (hcoord i) 2 + _ ≤ (∑ _i : ι, S * ‖x‖) ^ 2 := by + exact Finset.sum_sq_le_sq_sum_of_nonneg + (fun _ _ => mul_nonneg hS_nonneg (norm_nonneg x)) + _ = (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + simp [Finset.sum_const] + ring + exact (sq_le_sq₀ (norm_nonneg _) + (mul_nonneg (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) (norm_nonneg x))).mp hnorm_sq + +private theorem norm_toEuclideanCLM_sq_integrable_of_entry_memLp_two + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {Z : RegCoeffField d → FullBlockMat d} + (hZ_aemeas : AEMeasurable Z P) + (hZ_entry : ∀ α β : BlockCoord d, MemLp (fun a => Z a α β) (2 : ENNReal) P) : + Integrable + (fun a : RegCoeffField d => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (Z a)‖ ^ 2) P := by + classical + let S : RegCoeffField d → ℝ := fun a => ∑ α : BlockCoord d, ∑ β : BlockCoord d, |Z a α β| + have hS_mem : MemLp S (2 : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro α _hα + refine memLp_finsetSum _ ?_ + intro β _hβ + simpa [Real.norm_eq_abs] using (hZ_entry α β).norm + have hS_sq_int : Integrable (fun a => S a ^ 2) P := by + simpa [Real.norm_eq_abs, S] using + hS_mem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + let C : ℝ := Fintype.card (BlockCoord d) + let L : + FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (BlockCoord d) →L[ℝ] EuclideanSpace ℝ (BlockCoord d)) := { + toFun := fun M => Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M + map_add' := by + intro A B + exact map_add (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) A B + map_smul' := by + intro r A + exact map_smul (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) r A + } + have hCS_sq_int : Integrable (fun a => (C * S a) ^ 2) P := by + convert hS_sq_int.const_mul (C * C) using 1 + ext a + ring + refine Integrable.mono' hCS_sq_int ?_ ?_ + · exact ((continuous_norm.measurable.comp_aemeasurable + (L.continuous_of_finiteDimensional.measurable.comp_aemeasurable hZ_aemeas)).pow_const 2).aestronglyMeasurable + · filter_upwards with a + have hnorm := + norm_toEuclideanCLM_le_sum_abs_entries (Z a) + have hpow := pow_le_pow_left₀ (norm_nonneg _) hnorm 2 + simpa [S, C, Real.norm_eq_abs] using hpow + +private theorem blockMatVecMul_sub' + {d : ℕ} (A : BlockMat d) (X Y : BlockVec d) : + blockMatVecMul A (X - Y) = blockMatVecMul A X - blockMatVecMul A Y := by + have hneg : blockMatVecMul A (-Y) = -blockMatVecMul A Y := by + simpa using blockMatVecMul_smul A (-1) Y + rw [sub_eq_add_neg, blockMatVecMul_add, hneg] + rfl + +private theorem blockVecDot_sub_left' + {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot (X - Y) Z = blockVecDot X Z - blockVecDot Y Z := by + have hneg : blockVecDot (-Y) Z = -blockVecDot Y Z := by + simpa using blockVecDot_smul_left (-1) Y Z + rw [sub_eq_add_neg, blockVecDot_add_left, hneg] + rfl + +private theorem blockBasis_sub_pairing' + {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α - blockBasis β) + (blockMatVecMul A (blockBasis α - blockBasis β)) = + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + rw [blockMatVecMul_sub', blockVecDot_sub_left'] + rw [blockVecDot_sub_right] + rw [blockVecDot_sub_right] + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, blockBasis_pairing] + ring + +private theorem aemeasurable_blockMatEntry_coarseBlockMatrix_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) + (α β : BlockCoord d) : + AEMeasurable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +private theorem blockBasis_add_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α + blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem blockBasis_sub_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α - blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) {α β : BlockCoord d} (hαβ : α ≠ β) : + |blockMatEntry A α β| ≤ + (1 / 2 : ℝ) * (blockMatEntry A α α + blockMatEntry A β β) := by + have hplus_pos := + hPos (blockBasis α + blockBasis β) (blockBasis_add_ne_zero' hαβ) + have hminus_pos := + hPos (blockBasis α - blockBasis β) (blockBasis_sub_ne_zero' hαβ) + have hplus : + 0 < + blockMatEntry A α α + blockMatEntry A α β + + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sum_pairing] using hplus_pos + have hminus : + 0 < + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sub_pairing'] using hminus_pos + have hsymm : blockMatEntry A β α = blockMatEntry A α β := (hSymm α β).symm + rw [abs_le] + constructor <;> nlinarith + +private theorem blockMatEntry_abs_le_factor_sum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) + {sUpper sLower : ℝ} (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + (α β : BlockCoord d) : + (fun a : RegCoeffField d => + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β|) ≤ᵐ[P] + fun a => + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hPos : Ch02.BlockPosDef (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_posDef + have hUpperEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft i j| := by + rw [hEq] + _ ≤ Ch02.coarseBMatrixNorm Q F := by + simpa [Ch02.coarseBMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft) i j + _ ≤ Ch02.LambdaSq Q sUpper (.finite 1) F := + Ch02.oneCube_b_le_LambdaSq_finite Q F hsUpper + (by norm_num : (1 : ℝ) ≤ 1) + _ = Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + simp [Ch04.LambdaSqCoeffField, ha, F] + have hLowerEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight i j| := by + rw [hEq] + _ ≤ Ch02.coarseSigmaStarInvMatrixNorm Q F := by + simpa [Ch02.coarseSigmaStarInvMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight) i j + _ ≤ (Ch02.lambdaSq Q sLower (.finite 1) F)⁻¹ := + Ch02.oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q F hsLower + (by norm_num : (1 : ℝ) ≤ 1) + _ = (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + simp [Ch04.lambdaSqCoeffField, ha, F] + have hX_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg Q a hsUpper (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hsLower (by norm_num : (1 : ℝ) ≤ 1)) + cases α with + | inl i => + cases β with + | inl j => + exact (hUpperEntry i j).trans (by linarith) + | inr j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inr j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry i i) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j) ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry j j) + linarith + | inr i => + cases β with + | inl j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inl j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry i i) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j) ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry j j) + linarith + | inr j => + exact (hLowerEntry i j).trans (by linarith) + +theorem originBlockIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_factor_observables + (originCube d (m : ℤ)) + hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + (upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 m) + (lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 m) + +theorem memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (n : ℕ) (α β : BlockCoord d) : + MemLp + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d (n : ℤ))) a) α β) + (2 : ENNReal) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a + let Y : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ + have hX_meas : AEMeasurable X P := by + simpa [X, Q] using + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d (n : ℤ)) hP4.sUpper_pos + have hY_meas : AEMeasurable Y P := by + simpa [Y, Q] using! + hP.aemeasurable_lambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sLower_pos + have hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a := + Filter.Eventually.of_forall fun a => + Ch04.LambdaSqCoeffField_finite_nonneg Q a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_mem2 : MemLp X (2 : ENNReal) P := + memLp_two_of_nonneg_pow_integrable hP4.two_le_xi hX_meas hX_nonneg + (by + simpa [X, Q] using + upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + have hY_mem2 : MemLp Y (2 : ENNReal) P := + memLp_two_of_nonneg_pow_integrable hP4.two_le_xi hY_meas hY_nonneg + (by + simpa [Y, Q] using + lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + have hXY_mem2 : MemLp (fun a => X a + Y a) (2 : ENNReal) P := + hX_mem2.add hY_mem2 + have hEntry_meas : + AEMeasurable + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + simpa [Q] using + aemeasurable_blockMatEntry_coarseBlockMatrix_cubeSet + hP (originCube d (n : ℤ)) α β + have hXY_nonneg : ∀ a, 0 ≤ X a + Y a := by + intro a + exact add_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg Q a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1)) + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1))) + have hEntry_bound : + ∀ᵐ a ∂P, + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β| ≤ + X a + Y a := by + simpa [X, Y, Q] using! + blockMatEntry_abs_le_factor_sum_ae + hP (originCube d (n : ℤ)) hP4.sUpper_pos hP4.sLower_pos α β + have hEntry_abs_sq : + Integrable + (fun a : RegCoeffField d => + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β| ^ 2) P := + integrable_abs_sq_of_ae_abs_le_nonneg_memLp_two + hEntry_meas hXY_nonneg hEntry_bound hXY_mem2 + rw [← MeasureTheory.integrable_norm_rpow_iff hEntry_meas.aestronglyMeasurable + (by norm_num : (2 : ENNReal) ≠ 0) (by simp)] + simpa [Real.norm_eq_abs] using hEntry_abs_sq + +theorem integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) (n : ℕ) : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct m (originCube d (n : ℤ))) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let b := hP.barSigmaAtScale hStruct m + let c := hP.barSigmaStarAtScale hStruct m + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let Abar : BlockMat d := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct m + let Z : RegCoeffField d → FullBlockMat d := + fun a => D * (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) - toFullBlockMat Abar) * D + have hZ_entry : ∀ α β : BlockCoord d, MemLp (fun a => Z a α β) (2 : ENNReal) P := by + intro α β + dsimp [Z] + have hsum : + MemLp + (fun a : RegCoeffField d => + ∑ γ : BlockCoord d, + (∑ δ : BlockCoord d, + D α δ * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ)) * + D γ β) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (BlockCoord d))) + (p := (2 : ENNReal)) ?_ + intro γ _hγ + have hinner : + MemLp + (fun a : RegCoeffField d => + ∑ δ : BlockCoord d, + D α δ * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ)) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (BlockCoord d))) + (p := (2 : ENNReal)) ?_ + intro δ _hδ + have hbase : + MemLp + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ) + (2 : ENNReal) P := by + have hentry : + MemLp + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ) + (2 : ENNReal) P := by + simpa [Q, toFullBlockMat, blockMatEntry] using + memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + hP hStruct hP4 n δ γ + exact hentry.sub + (memLp_const + (c := toFullBlockMat Abar δ γ) (μ := P) (p := (2 : ENNReal))) + exact hbase.const_mul (D α δ) + simpa [mul_comm] using hinner.const_mul (D γ β) + exact MemLp.ae_eq (Filter.Eventually.of_forall fun a => by + simp [Matrix.mul_apply]) hsum + have hZ_aemeas : AEMeasurable Z P := by + refine aemeasurable_pi_lambda Z ?_ + intro α + refine aemeasurable_pi_lambda (fun a => Z a α) ?_ + intro β + exact (hZ_entry α β).aestronglyMeasurable.aemeasurable + change + Integrable + (fun a : RegCoeffField d => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (D * (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) - toFullBlockMat Abar) * D)‖ ^ 2) + P + exact norm_toEuclideanCLM_sq_integrable_of_entry_memLp_two hZ_aemeas hZ_entry + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PointwiseSplits.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PointwiseSplits.lean new file mode 100644 index 0000000000..00b62539f0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PointwiseSplits.lean @@ -0,0 +1,660 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Weights + +/-! # Pointwise Splits -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: PointwiseSplits + +Pointwise upper and lower finite-one decompositions. +-/ + +theorem sq_add_le_weighted_sum_add_tail_sq_div + {L T A W V : ℝ} + (hV : 0 < V) (hA : 0 ≤ A) + (hW : 0 ≤ W) (hWV : W + V ≤ 1) + (hLsq : L ^ 2 ≤ W * A) : + (L + T) ^ 2 ≤ A + T ^ 2 / V := by + by_cases hWpos : 0 < W + · have hV_nonneg : 0 ≤ V := hV.le + have hWinv_nonneg : 0 ≤ W⁻¹ := inv_nonneg.mpr hWpos.le + have hVinv_nonneg : 0 ≤ V⁻¹ := inv_nonneg.mpr hV.le + have hLsq_div : L ^ 2 / W ≤ A := by + rw [div_le_iff₀ hWpos] + simpa [mul_comm, mul_left_comm, mul_assoc] using hLsq + have hcross : + 2 * L * T ≤ V / W * L ^ 2 + W / V * T ^ 2 := by + have hsq : 0 ≤ + (Real.sqrt (V / W) * L - Real.sqrt (W / V) * T) ^ 2 := + sq_nonneg _ + have hVW_nonneg : 0 ≤ V / W := div_nonneg hV.le hWpos.le + have hWV_nonneg : 0 ≤ W / V := div_nonneg hW hV.le + have hprod : + Real.sqrt (V / W) * Real.sqrt (W / V) = 1 := by + have hmul : (V / W) * (W / V) = 1 := by + field_simp [hV.ne', hWpos.ne'] + rw [← Real.sqrt_mul hVW_nonneg, hmul, Real.sqrt_one] + have hsq_expanded : + 0 ≤ V / W * L ^ 2 - 2 * L * T + W / V * T ^ 2 := by + have hsq_eq : + (Real.sqrt (V / W) * L - Real.sqrt (W / V) * T) ^ 2 = + V / W * L ^ 2 - 2 * L * T + W / V * T ^ 2 := by + rw [sub_sq, mul_pow, mul_pow, Real.sq_sqrt hVW_nonneg, + Real.sq_sqrt hWV_nonneg] + calc + V / W * L ^ 2 - 2 * (Real.sqrt (V / W) * L) * + (Real.sqrt (W / V) * T) + W / V * T ^ 2 = + V / W * L ^ 2 - + 2 * (Real.sqrt (V / W) * Real.sqrt (W / V)) * (L * T) + + W / V * T ^ 2 := by ring + _ = V / W * L ^ 2 - 2 * L * T + W / V * T ^ 2 := by + rw [hprod] + ring + simpa [hsq_eq] using hsq + nlinarith + have hcoeffL : + 1 + V / W ≤ W⁻¹ := by + rw [div_eq_mul_inv] + have hmul := mul_le_mul_of_nonneg_right hWV hWinv_nonneg + have hW_mul_inv : W * W⁻¹ = 1 := by field_simp [hWpos.ne'] + have hV_mul_inv : V * W⁻¹ = V / W := by rw [div_eq_mul_inv] + linarith + have hcoeffT : + 1 + W / V ≤ V⁻¹ := by + rw [div_eq_mul_inv] + have hmul := mul_le_mul_of_nonneg_right hWV hVinv_nonneg + have hV_mul_inv : V * V⁻¹ = 1 := by field_simp [hV.ne'] + have hW_mul_inv : W * V⁻¹ = W / V := by rw [div_eq_mul_inv] + linarith + calc + (L + T) ^ 2 = L ^ 2 + 2 * L * T + T ^ 2 := by ring + _ ≤ L ^ 2 + (V / W * L ^ 2 + W / V * T ^ 2) + T ^ 2 := by + linarith + _ = (1 + V / W) * L ^ 2 + (1 + W / V) * T ^ 2 := by ring + _ ≤ W⁻¹ * L ^ 2 + V⁻¹ * T ^ 2 := by + exact add_le_add + (mul_le_mul_of_nonneg_right hcoeffL (sq_nonneg L)) + (mul_le_mul_of_nonneg_right hcoeffT (sq_nonneg T)) + _ = L ^ 2 / W + T ^ 2 / V := by ring + _ ≤ A + T ^ 2 / V := by + linarith + · have hW_zero : W = 0 := le_antisymm (le_of_not_gt hWpos) hW + have hLsq_zero : L ^ 2 = 0 := by + have hnonneg : 0 ≤ L ^ 2 := sq_nonneg L + have hle : L ^ 2 ≤ 0 := by simpa [hW_zero] using hLsq + exact le_antisymm hle hnonneg + have hL_zero : L = 0 := sq_eq_zero_iff.mp hLsq_zero + have hV_le_one : V ≤ 1 := by linarith + have hT_sq_nonneg : 0 ≤ T ^ 2 := sq_nonneg T + have hT_sq_le_div : T ^ 2 ≤ T ^ 2 / V := by + rw [le_div_iff₀ hV] + nlinarith + calc + (L + T) ^ 2 = T ^ 2 := by simp [hL_zero] + _ ≤ T ^ 2 / V := hT_sq_le_div + _ ≤ A + T ^ 2 / V := by exact le_add_of_nonneg_left hA + +noncomputable def upperSmallSqrtTailCoeffField {d : ℕ} [NeZero d] + (m : ℕ) (s : ℝ) (a : RegCoeffField d) : ℝ := + ∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow + (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + +theorem maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {k : ℤ} (hk : k ≤ Q.scale) : + 0 ≤ Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q k a := by + classical + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · simpa [Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha] using + Ch02.maxDescendantBMatrixNormAtScale_nonneg Q hk + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + · simp [Ch04.maxDescendantBMatrixNormCoeffFieldAtScale, ha] + +theorem upperSmallSqrtTailCoeffField_nonneg + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 ≤ s) (a : RegCoeffField d) : + 0 ≤ upperSmallSqrtTailCoeffField (d := d) m s a := by + unfold upperSmallSqrtTailCoeffField + refine tsum_nonneg fun j => ?_ + exact mul_nonneg (geometricWeight_nonneg (j + m) (by simpa using hs)) + (Real.rpow_nonneg + (maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le + (originCube d (m : ℤ)) a (by simp [originCube])) _) + +theorem LambdaSqCoeffField_originCube_finite_one_le_two_upperSmallSqrtTail_sq_add_two_largeScale_sum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a ≤ + 2 * upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let F : ℤ → ℝ := fun n => + Real.rpow (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a) (1 / 2 : ℝ) + let S : ℝ := ∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) + let L : ℝ := + ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n + let T : ℝ := + ∑' l : ℕ, + geometricWeight s 1 (l + m) * F ((m : ℤ) - ((l + m : ℕ) : ℤ)) + have hsumF : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) := by + simpa [F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantBMatrixNormCoeffFieldAtScale + (Q := Q) a hs + have hsplit : S = L + T := by + simpa [S, L, T] using + section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + s m F hsumF + have hLambda_eq : + Ch04.LambdaSqCoeffField Q s (.finite 1) a = S ^ 2 := by + simpa [S, F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.LambdaSqCoeffField_finite_one_eq_tsum_sq Q a s + have hLsq : + L ^ 2 ≤ + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a := by + let H : ℤ → ℝ := fun n => + if n ≤ (m : ℤ) then + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a + else + 0 + have hfinite := + section52_sq_finset_sum_weighted_rpow_half_le_finset_sum_weighted + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (H := H) + (fun n => section52LargeScaleWeight_nonneg m hs.le n) + (fun n => by + by_cases hn : n ≤ (m : ℤ) + · simp [H, hn] + exact maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le Q a hn + · simp [H, hn]) + (section52LargeScaleWeight_sum_le_one hs m) + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * Real.rpow (H n) (1 / 2 : ℝ)) = L := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle, F] + have hright : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * H n) = + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle] + rw [hleft, hright] at hfinite + exact hfinite + have htail_eq : T = upperSmallSqrtTailCoeffField (d := d) m s a := by + unfold T upperSmallSqrtTailCoeffField + congr with j + have hscale : (m : ℤ) - ((j + m : ℕ) : ℤ) = -(j : ℤ) := by + omega + rw [hscale] + have hsq_add : (L + T) ^ 2 ≤ 2 * T ^ 2 + 2 * L ^ 2 := by + nlinarith [sq_nonneg (L - T)] + calc + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a = + S ^ 2 := by + simpa [Q] using hLambda_eq + _ = (L + T) ^ 2 := by rw [hsplit] + _ ≤ 2 * T ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a) := by + nlinarith + _ = + 2 * upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + simp [Q, htail_eq] + +theorem LambdaSqCoeffField_originCube_finite_one_le_upperSmallSqrtTail_sq_div_add_largeScale_sum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a ≤ + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let F : ℤ → ℝ := fun n => + Real.rpow (Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a) (1 / 2 : ℝ) + let S : ℝ := ∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) + let L : ℝ := + ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n + let T : ℝ := + ∑' l : ℕ, + geometricWeight s 1 (l + m) * F ((m : ℤ) - ((l + m : ℕ) : ℤ)) + let W : ℝ := ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n + let A : ℝ := + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a + let V : ℝ := section52SmallTailWeight s m + have hsumF : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) := by + simpa [F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantBMatrixNormCoeffFieldAtScale + (Q := Q) a hs + have hsplit : S = L + T := by + simpa [S, L, T] using + section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + s m F hsumF + have hLambda_eq : + Ch04.LambdaSqCoeffField Q s (.finite 1) a = S ^ 2 := by + simpa [S, F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.LambdaSqCoeffField_finite_one_eq_tsum_sq Q a s + have hLsq : + L ^ 2 ≤ W * A := by + let H : ℤ → ℝ := fun n => + if n ≤ (m : ℤ) then + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale Q n a + else + 0 + have hfinite := + section52_sq_finset_sum_weighted_rpow_half_le_weight_sum_mul_finset_sum_weighted + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (H := H) + (fun n => section52LargeScaleWeight_nonneg m hs.le n) + (fun n => by + by_cases hn : n ≤ (m : ℤ) + · simp [H, hn] + exact maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le Q a hn + · simp [H, hn]) + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * Real.rpow (H n) (1 / 2 : ℝ)) = L := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle, F] + have hright : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * H n) = A := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle] + rw [hleft, hright] at hfinite + simpa [W, A] using hfinite + have htail_eq : T = upperSmallSqrtTailCoeffField (d := d) m s a := by + unfold T upperSmallSqrtTailCoeffField + congr with j + have hscale : (m : ℤ) - ((j + m : ℕ) : ℤ) = -(j : ℤ) := by + omega + rw [hscale] + have hV_pos : 0 < V := by + dsimp [V] + have hsum_total := section52LargeScaleWeight_sum_add_smallTailWeight_eq_one hs m + have hprefix_succ_le_one : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ 1 := + calc + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ + ∑' l : ℕ, geometricWeight s 1 l := + (summable_geometricWeight_one hs).sum_le_tsum (Finset.range (m + 1)) + (fun l _hl => geometricWeight_nonneg l (by simpa using hs.le)) + _ = 1 := tsum_geometricWeight_one_eq_one hs + have hlast_pos : 0 < geometricWeight s 1 m := + geometricWeight_pos m (by simpa using hs) + have hprefix_succ_eq : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) = + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) + + geometricWeight s 1 m := by + rw [Finset.sum_range_succ] + rw [← section52LargeScaleWeight_sum_eq_prefix_sum] + have hW_lt_one : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) < 1 := by + linarith + linarith + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Finset.sum_nonneg fun n _hn => section52LargeScaleWeight_nonneg m hs.le n + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact Finset.sum_nonneg fun n hn => + mul_nonneg (section52LargeScaleWeight_nonneg m hs.le n) + (maxDescendantBMatrixNormCoeffFieldAtScale_nonneg_of_le Q a + (section52LargeScaleSet_mem_le_m hn)) + have hWV_le : W + V ≤ 1 := by + have h := section52LargeScaleWeight_sum_add_smallTailWeight_eq_one hs m + simpa [W, V] using h.le + have hsq : + (L + T) ^ 2 ≤ A + T ^ 2 / V := + sq_add_le_weighted_sum_add_tail_sq_div hV_pos hA_nonneg hW_nonneg hWV_le hLsq + calc + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a = + S ^ 2 := by + simpa [Q] using hLambda_eq + _ = (L + T) ^ 2 := by rw [hsplit] + _ ≤ A + T ^ 2 / V := hsq + _ = + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + simp [A, V, Q, htail_eq, add_comm] + +noncomputable def lowerSmallSqrtTailCoeffField {d : ℕ} [NeZero d] + (m : ℕ) (s : ℝ) (a : RegCoeffField d) : ℝ := + ∑' j : ℕ, + geometricWeight s 1 (j + m) * + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ) + +theorem maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {k : ℤ} (hk : k ≤ Q.scale) : + 0 ≤ Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q k a := by + classical + by_cases ha : Ch04.AELocallyUniformlyEllipticField a + · simpa [Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] using + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hk + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + · simp [Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale, ha] + +theorem lowerSmallSqrtTailCoeffField_nonneg + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 ≤ s) (a : RegCoeffField d) : + 0 ≤ lowerSmallSqrtTailCoeffField (d := d) m s a := by + unfold lowerSmallSqrtTailCoeffField + refine tsum_nonneg fun j => ?_ + exact mul_nonneg (geometricWeight_nonneg (j + m) (by simpa using hs)) + (Real.rpow_nonneg + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le + (originCube d (m : ℤ)) a (by simp [originCube])) _) + +theorem lambdaSqCoeffField_originCube_finite_one_inv_le_two_lowerSmallSqrtTail_sq_add_two_largeScale_sum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ ≤ + 2 * lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let F : ℤ → ℝ := fun n => + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a) + (1 / 2 : ℝ) + let S : ℝ := ∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) + let L : ℝ := + ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n + let T : ℝ := + ∑' l : ℕ, + geometricWeight s 1 (l + m) * F ((m : ℤ) - ((l + m : ℕ) : ℤ)) + have hsumF : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) := by + simpa [F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (Q := Q) a hs + have hsplit : S = L + T := by + simpa [S, L, T] using + section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + s m F hsumF + have hlambdaInv_eq : + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ = S ^ 2 := by + have h := + Ch04.RestrictionLawCarrier.lambdaSqCoeffField_finite_one_eq_tsum_sq_inv Q a hs + simpa [S, F, Q, originCube, Ch02.geometricWeight_eq_old] using congrArg Inv.inv h + have hLsq : + L ^ 2 ≤ + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a := by + let H : ℤ → ℝ := fun n => + if n ≤ (m : ℤ) then + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a + else + 0 + have hfinite := + section52_sq_finset_sum_weighted_rpow_half_le_finset_sum_weighted + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (H := H) + (fun n => section52LargeScaleWeight_nonneg m hs.le n) + (fun n => by + by_cases hn : n ≤ (m : ℤ) + · simp [H, hn] + exact maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le + Q a hn + · simp [H, hn]) + (section52LargeScaleWeight_sum_le_one hs m) + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * Real.rpow (H n) (1 / 2 : ℝ)) = L := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle, F] + have hright : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * H n) = + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle] + rw [hleft, hright] at hfinite + exact hfinite + have htail_eq : T = lowerSmallSqrtTailCoeffField (d := d) m s a := by + unfold T lowerSmallSqrtTailCoeffField + congr with j + have hscale : (m : ℤ) - ((j + m : ℕ) : ℤ) = -(j : ℤ) := by + omega + rw [hscale] + have hsq_add : (L + T) ^ 2 ≤ 2 * T ^ 2 + 2 * L ^ 2 := by + nlinarith [sq_nonneg (L - T)] + calc + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ = + S ^ 2 := by + simpa [Q] using hlambdaInv_eq + _ = (L + T) ^ 2 := by rw [hsplit] + _ ≤ 2 * T ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a) := by + nlinarith + _ = + 2 * lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 + + 2 * + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + simp [Q, htail_eq] + +theorem lambdaSqCoeffField_originCube_finite_one_inv_le_lowerSmallSqrtTail_sq_div_add_largeScale_sum + {d : ℕ} [NeZero d] (m : ℕ) {s : ℝ} (hs : 0 < s) + (a : RegCoeffField d) : + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ ≤ + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + classical + let Q : TriadicCube d := originCube d (m : ℤ) + let F : ℤ → ℝ := fun n => + Real.rpow + (Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a) + (1 / 2 : ℝ) + let S : ℝ := ∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) + let L : ℝ := + ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n + let T : ℝ := + ∑' l : ℕ, + geometricWeight s 1 (l + m) * F ((m : ℤ) - ((l + m : ℕ) : ℤ)) + let W : ℝ := ∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n + let A : ℝ := + ∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a + let V : ℝ := section52SmallTailWeight s m + have hsumF : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) := by + simpa [F, Q, originCube, Ch02.geometricWeight_eq_old] using + Ch04.RestrictionLawCarrier.summable_weighted_maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (Q := Q) a hs + have hsplit : S = L + T := by + simpa [S, L, T] using + section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + s m F hsumF + have hlambdaInv_eq : + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ = S ^ 2 := by + have h := + Ch04.RestrictionLawCarrier.lambdaSqCoeffField_finite_one_eq_tsum_sq_inv Q a hs + simpa [S, F, Q, originCube, Ch02.geometricWeight_eq_old] using congrArg Inv.inv h + have hLsq : + L ^ 2 ≤ W * A := by + let H : ℤ → ℝ := fun n => + if n ≤ (m : ℤ) then + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale Q n a + else + 0 + have hfinite := + section52_sq_finset_sum_weighted_rpow_half_le_weight_sum_mul_finset_sum_weighted + (s := section52LargeScaleSet m) + (w := section52LargeScaleWeight s m) + (H := H) + (fun n => section52LargeScaleWeight_nonneg m hs.le n) + (fun n => by + by_cases hn : n ≤ (m : ℤ) + · simp [H, hn] + exact maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le + Q a hn + · simp [H, hn]) + have hleft : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * Real.rpow (H n) (1 / 2 : ℝ)) = L := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle, F] + have hright : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * H n) = A := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnle : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + simp [H, hnle] + rw [hleft, hright] at hfinite + simpa [W, A] using hfinite + have htail_eq : T = lowerSmallSqrtTailCoeffField (d := d) m s a := by + unfold T lowerSmallSqrtTailCoeffField + congr with j + have hscale : (m : ℤ) - ((j + m : ℕ) : ℤ) = -(j : ℤ) := by + omega + rw [hscale] + have hV_pos : 0 < V := by + dsimp [V] + have hsum_total := section52LargeScaleWeight_sum_add_smallTailWeight_eq_one hs m + have hprefix_succ_le_one : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ 1 := + calc + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ + ∑' l : ℕ, geometricWeight s 1 l := + (summable_geometricWeight_one hs).sum_le_tsum (Finset.range (m + 1)) + (fun l _hl => geometricWeight_nonneg l (by simpa using hs.le)) + _ = 1 := tsum_geometricWeight_one_eq_one hs + have hlast_pos : 0 < geometricWeight s 1 m := + geometricWeight_pos m (by simpa using hs) + have hprefix_succ_eq : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) = + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) + + geometricWeight s 1 m := by + rw [Finset.sum_range_succ] + rw [← section52LargeScaleWeight_sum_eq_prefix_sum] + have hW_lt_one : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) < 1 := by + linarith + linarith + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Finset.sum_nonneg fun n _hn => section52LargeScaleWeight_nonneg m hs.le n + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact Finset.sum_nonneg fun n hn => + mul_nonneg (section52LargeScaleWeight_nonneg m hs.le n) + (maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale_nonneg_of_le Q a + (section52LargeScaleSet_mem_le_m hn)) + have hWV_le : W + V ≤ 1 := by + have h := section52LargeScaleWeight_sum_add_smallTailWeight_eq_one hs m + simpa [W, V] using h.le + have hsq : + (L + T) ^ 2 ≤ A + T ^ 2 / V := + sq_add_le_weighted_sum_add_tail_sq_div hV_pos hA_nonneg hW_nonneg hWV_le hLsq + calc + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ = + S ^ 2 := by + simpa [Q] using hlambdaInv_eq + _ = (L + T) ^ 2 := by rw [hsplit] + _ ≤ A + T ^ 2 / V := hsq + _ = + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m + + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) := by + simp [A, V, Q, htail_eq, add_comm] + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability.lean new file mode 100644 index 0000000000..451d11fb6b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.LowerVariants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.PowIntegrable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/LowerVariants.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/LowerVariants.lean new file mode 100644 index 0000000000..8cc2918387 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/LowerVariants.lean @@ -0,0 +1,693 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessUpper + +/-! # Lower Variants -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: PositiveExcessLowerAndIntegrability + +Lower large-scale estimates and factor integrability from P4. +-/ + +theorem lowerLargeScalePositiveExcessRoot_le_largeScaleRootCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Ch04.annealedMomentRoot P hP4.xi + (fun a => + section52LargeScaleWeight hP4.sLower m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d hP4.xi hP4.sLower m n * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + classical + intro parents hparents + let initial : ℝ := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let K : ℝ := 2 * initial + let B : ℝ := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) + let parentFactor : ℝ := ((parents.card : ℝ) ^ (1 / (hP4.xi : ℝ))) + let entryFactor : ℝ := (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) + let X : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_le_m : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + have hn_cast : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + have hnm_nat : Int.toNat n ≤ m := by omega + have hweight_nonneg : 0 ≤ section52LargeScaleWeight hP4.sLower m n := + section52LargeScaleWeight_nonneg m hP4.sLower_nonneg n + have hinitial_nonneg : 0 ≤ initial := by + simpa [initial] using + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hparentFactor_nonneg : 0 ≤ parentFactor := by + dsimp [parentFactor] + positivity + have hentryFactor_nonneg : 0 ≤ entryFactor := by + dsimp [entryFactor] + positivity + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) hQ0) + have hfluct : + Ch04.annealedMomentRoot P hP4.xi X ≤ entryFactor * (parentFactor * B) := by + have h := + lowerLargeScaleFiniteParentFluctuation + hP hStruct hP4 (m := m) (n := Int.toNat n) hnm_nat + simpa [X, entryFactor, parentFactor, B, K, parents, hn_cast] using h + have hB_le : + B ≤ section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K := by + dsimp [B] + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + have hQscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + exact le_of_eq + (section52UnitDescendantRosenthalBudget_eq_originCube_of_scale_eq + Q hn_nonneg hQscale hP4.xi K) + have hweighted : + Ch04.annealedMomentRoot P hP4.xi + (fun a => section52LargeScaleWeight hP4.sLower m n * X a) = + section52LargeScaleWeight hP4.sLower m n * + Ch04.annealedMomentRoot P hP4.xi X := + section52_annealedMomentRoot_const_mul_of_nonneg + (Nat.succ_le_of_lt hP4.xi_pos) hweight_nonneg hX_nonneg + have hB_step : + section52LargeScaleWeight hP4.sLower m n * + (entryFactor * (parentFactor * B)) ≤ + section52LargeScaleWeight hP4.sLower m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) := by + have h1 : + parentFactor * B ≤ + parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K := + mul_le_mul_of_nonneg_left hB_le hparentFactor_nonneg + have h2 : + entryFactor * (parentFactor * B) ≤ + entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K) := + mul_le_mul_of_nonneg_left h1 hentryFactor_nonneg + exact mul_le_mul_of_nonneg_left h2 hweight_nonneg + have hcoeff_eq : + section52LargeScaleWeight hP4.sLower m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) = + entryFactor * section52LargeScaleRootCoeff d hP4.xi hP4.sLower m n * initial := by + simp [section52LargeScaleRootCoeff, section52LargeScaleLpRootCoeff, + section52LargeScaleSqrtRootCoeff, section52UnitDescendantRosenthalBudget, + entryFactor, parentFactor, K, initial] + ring + calc + Ch04.annealedMomentRoot P hP4.xi + (fun a => + section52LargeScaleWeight hP4.sLower m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) + = Ch04.annealedMomentRoot P hP4.xi + (fun a => section52LargeScaleWeight hP4.sLower m n * X a) := by + rfl + _ = section52LargeScaleWeight hP4.sLower m n * + Ch04.annealedMomentRoot P hP4.xi X := hweighted + _ ≤ section52LargeScaleWeight hP4.sLower m n * + (entryFactor * (parentFactor * B)) := + mul_le_mul_of_nonneg_left hfluct hweight_nonneg + _ ≤ section52LargeScaleWeight hP4.sLower m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) := hB_step + _ = entryFactor * section52LargeScaleRootCoeff d hP4.xi hP4.sLower m n * + initial := hcoeff_eq + +theorem lowerLargeScalePositiveExcessRoot_le_largeScaleRootCoeff_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {sSource r : ℝ} {ξ : ℕ} + (hsSource : 0 < sSource) (hr_nonneg : 0 ≤ r) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hLowerSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) sSource (.finite 1) a)⁻¹) ^ ξ) P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Ch04.annealedMomentRoot P ξ + (fun a => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d ξ r m n * + Ch04.lambdaInvMomentAtScale P 0 sSource ξ := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + let initial : ℝ := Ch04.lambdaInvMomentAtScale P 0 sSource ξ + let K : ℝ := 2 * initial + let B : ℝ := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q ξ K) + let parentFactor : ℝ := ((parents.card : ℝ) ^ (1 / (ξ : ℝ))) + let entryFactor : ℝ := (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) + let X : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_cast : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + have hnm_nat : Int.toNat n ≤ m := by + have hn_le_m : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + omega + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hweight_nonneg : 0 ≤ section52LargeScaleWeight r m n := + section52LargeScaleWeight_nonneg m hr_nonneg n + have hinitial_nonneg : 0 ≤ initial := by + simpa [initial] using + Ch04.lambdaInvMomentAtScale_nonneg P 0 ξ hsSource + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hparentFactor_nonneg : 0 ≤ parentFactor := by + dsimp [parentFactor] + positivity + have hentryFactor_nonneg : 0 ≤ entryFactor := by + dsimp [entryFactor] + positivity + have hbudget_nonneg : + ∀ Q : TriadicCube d, 0 ≤ section52UnitDescendantRosenthalBudget Q ξ K := + fun Q => section52UnitDescendantRosenthalBudget_nonneg Q ξ hK_nonneg + have hB_nonneg : 0 ≤ B := by + dsimp [B] + rcases hparents with ⟨Q0, hQ0⟩ + exact (hbudget_nonneg Q0).trans + (Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q ξ K) hQ0) + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + ξ) P ∧ + (∫ a, + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ K := by + intro i j + have h := + Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_lowerRight_entry_momentRoot_le_two_lambdaInvMomentAtScale + hP hsSource hξ_one hLowerSourceInt i j + simpa [K, initial] using h + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) hQ0) + have hfluct : + Ch04.annealedMomentRoot P ξ X ≤ entryFactor * (parentFactor * B) := by + exact + Ch04.RestrictionLawCarrier.lowerRight_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + hP hparents le_rfl hparent_scale hStruct.stationary hStruct.unit_range + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d)) + (section52_lowerCenter_entries hP hStruct) + hξ_two hK_nonneg hB_nonneg + (fun i j => (hOrigin i j).1) + (fun i j => (hOrigin i j).2) + (by + intro Q hQ + dsimp [B, section52UnitDescendantRosenthalBudget] + exact Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q ξ K) hQ) + have hB_le : + B ≤ section52UnitDescendantRosenthalBudget (originCube d n) ξ K := by + dsimp [B] + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + have hQscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + exact le_of_eq + (section52UnitDescendantRosenthalBudget_eq_originCube_of_scale_eq + Q hn_nonneg hQscale ξ K) + have hweighted : + Ch04.annealedMomentRoot P ξ + (fun a => section52LargeScaleWeight r m n * X a) = + section52LargeScaleWeight r m n * + Ch04.annealedMomentRoot P ξ X := + section52_annealedMomentRoot_const_mul_of_nonneg + hξ_one hweight_nonneg hX_nonneg + have hB_step : + section52LargeScaleWeight r m n * + (entryFactor * (parentFactor * B)) ≤ + section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) := by + have h1 : + parentFactor * B ≤ + parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K := + mul_le_mul_of_nonneg_left hB_le hparentFactor_nonneg + have h2 : + entryFactor * (parentFactor * B) ≤ + entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K) := + mul_le_mul_of_nonneg_left h1 hentryFactor_nonneg + exact mul_le_mul_of_nonneg_left h2 hweight_nonneg + have hcoeff_eq : + section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) = + entryFactor * section52LargeScaleRootCoeff d ξ r m n * initial := by + simp [section52LargeScaleRootCoeff, section52LargeScaleLpRootCoeff, + section52LargeScaleSqrtRootCoeff, section52UnitDescendantRosenthalBudget, + entryFactor, parentFactor, K, initial] + ring + calc + Ch04.annealedMomentRoot P ξ + (fun a => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) + = Ch04.annealedMomentRoot P ξ + (fun a => section52LargeScaleWeight r m n * X a) := by + rfl + _ = section52LargeScaleWeight r m n * + Ch04.annealedMomentRoot P ξ X := hweighted + _ ≤ section52LargeScaleWeight r m n * + (entryFactor * (parentFactor * B)) := + mul_le_mul_of_nonneg_left hfluct hweight_nonneg + _ ≤ section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) := hB_step + _ = entryFactor * section52LargeScaleRootCoeff d ξ r m n * + initial := hcoeff_eq + +theorem lowerLargeScalePositiveExcess_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Integrable + (fun a : RegCoeffField d => + ‖(section52LargeScaleWeight hP4.sLower m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + hP4.xi) P := by + intro i j + exact + (Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_lowerRight_entry_momentRoot_le_two_lambdaInvMomentAtScale + hP hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hP4.lower_inv_moment_integrable i j).1 + have hBase : + Integrable + (fun a : RegCoeffField d => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := by + exact + Ch04.RestrictionLawCarrier.lowerRight_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + hP hparents (n := (0 : ℤ)) (ξ := hP4.xi) + le_rfl hparent_scale hStruct.stationary + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d)) + (section52_lowerCenter_entries hP hStruct) + hP4.two_le_xi hOrigin + have hconst : + Integrable + (fun a : RegCoeffField d => + ‖section52LargeScaleWeight hP4.sLower m n‖ ^ hP4.xi * + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := + hBase.const_mul _ + refine hconst.congr ?_ + filter_upwards with a + rw [← mul_pow, ← norm_mul] + +theorem lowerLargeScalePositiveExcess_integrable_abs_pow_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {sSource r : ℝ} {ξ : ℕ} + (hsSource : 0 < sSource) (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hLowerSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) sSource (.finite 1) a)⁻¹) ^ ξ) P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Integrable + (fun a : RegCoeffField d => + ‖(section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ ξ) P := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).lowerRight i j) a| ^ + ξ) P := by + intro i j + exact + (Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_lowerRight_entry_momentRoot_le_two_lambdaInvMomentAtScale + hP hsSource hξ_one hLowerSourceInt i j).1 + have hBase : + Integrable + (fun a : RegCoeffField d => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ ξ) P := by + exact + Ch04.RestrictionLawCarrier.lowerRight_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + hP hparents (n := (0 : ℤ)) (ξ := ξ) + le_rfl hparent_scale hStruct.stationary + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d)) + (section52_lowerCenter_entries hP hStruct) + hξ_two hOrigin + have hconst : + Integrable + (fun a : RegCoeffField d => + ‖section52LargeScaleWeight r m n‖ ^ ξ * + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0))‖ ^ ξ) P := + hBase.const_mul _ + refine hconst.congr ?_ + filter_upwards with a + rw [← mul_pow, ← norm_mul] + +theorem lowerLargeScalePositiveExcess_aemeasurable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + AEMeasurable + (fun a : RegCoeffField d => + section52LargeScaleWeight hP4.sLower m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) P := by + intro parents hparents + exact aemeasurable_const.mul + (Ch04.RestrictionLawCarrier.aemeasurable_lowerRight_matrixNorm_positiveExcess_finsetSup + hP hparents + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + +theorem lowerLargeScalePositiveExcess_aemeasurable_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {r : ℝ} {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + AEMeasurable + (fun a : RegCoeffField d => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0)) P := by + intro parents hparents + exact aemeasurable_const.mul + (Ch04.RestrictionLawCarrier.aemeasurable_lowerRight_matrixNorm_positiveExcess_finsetSup + hP hparents + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + +theorem lowerLargeScalePositiveExcess_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) + (a : RegCoeffField d) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + 0 ≤ + section52LargeScaleWeight hP4.sLower m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) := by + intro parents hparents + have hweight : 0 ≤ section52LargeScaleWeight hP4.sLower m n := + section52LargeScaleWeight_nonneg m hP4.sLower_nonneg n + have hsup : 0 ≤ + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) := by + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) hQ0) + exact mul_nonneg hweight hsup + +theorem lowerLargeScalePositiveExcess_nonneg_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {r : ℝ} (hr_nonneg : 0 ≤ r) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) + (a : RegCoeffField d) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + 0 ≤ + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) := by + intro parents hparents + have hweight : 0 ≤ section52LargeScaleWeight r m n := + section52LargeScaleWeight_nonneg m hr_nonneg n + have hsup : 0 ≤ + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) := by + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm + ((hP.barSigmaStarAtScale hStruct 0)⁻¹ • + (1 : Mat d))) + 0) hQ0) + exact mul_nonneg hweight hsup + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/PowIntegrable.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/PowIntegrable.lean new file mode 100644 index 0000000000..5b46b62629 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/PowIntegrable.lean @@ -0,0 +1,388 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessUpper +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.LowerVariants + +/-! # Pow Integrable -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +theorem section52_integrable_abs_pow_of_ae_abs_le_nonneg + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hX_aemeas : AEMeasurable X P) + (hY_nonneg : ∀ a, 0 ≤ Y a) + (hXY : ∀ᵐ a ∂P, |X a| ≤ Y a) + (hY_int : Integrable (fun a => |Y a| ^ ξ) P) : + Integrable (fun a => |X a| ^ ξ) P := by + refine Integrable.mono' hY_int + ((hX_aemeas.norm.pow_const ξ).aestronglyMeasurable) ?_ + filter_upwards [hXY] with a ha + have hpow : |X a| ^ ξ ≤ Y a ^ ξ := + pow_le_pow_left₀ (abs_nonneg (X a)) ha ξ + have hleft : ‖|X a| ^ ξ‖ = |X a| ^ ξ := by + simp [Real.norm_eq_abs] + have hright : |Y a| ^ ξ = Y a ^ ξ := by + rw [abs_of_nonneg (hY_nonneg a)] + simpa [hleft, hright] using hpow + +theorem section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} {ξ : ℕ} + {s : Finset ι} {G : ι → RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) : + Integrable (fun a => |∑ i ∈ s, G i a| ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hG_memLp : + ∀ i ∈ s, MemLp (G i) (ξ : ENNReal) P := by + intro i hi + rw [← MeasureTheory.integrable_norm_rpow_iff + (hG_aemeas i hi).aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hG_int i hi + have hsum_memLp : + MemLp (fun a => ∑ i ∈ s, G i a) (ξ : ENNReal) P := + memLp_finsetSum s hG_memLp + simpa [Real.norm_eq_abs] using + hsum_memLp.integrable_norm_pow + (Nat.pos_iff_ne_zero.mp (lt_of_lt_of_le zero_lt_one hξ)) + +theorem section52_integrable_abs_positiveExcess_pow_of_ae_finset_sum_bound + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ι : Type*} {ξ : ℕ} + {s : Finset ι} {X : RegCoeffField d → ℝ} {base : ℝ} + {G : ι → RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hX_aemeas : AEMeasurable X P) + (hG_nonneg : ∀ i ∈ s, ∀ a, 0 ≤ G i a) + (hG_aemeas : ∀ i ∈ s, AEMeasurable (G i) P) + (hG_int : ∀ i ∈ s, Integrable (fun a => |G i a| ^ ξ) P) + (hPoint : ∀ᵐ a ∂P, max (X a - base) 0 ≤ ∑ i ∈ s, G i a) : + Integrable (fun a => |max (X a - base) 0| ^ ξ) P := by + let Y : RegCoeffField d → ℝ := fun a => ∑ i ∈ s, G i a + have hY_nonneg : ∀ a, 0 ≤ Y a := by + intro a + exact Finset.sum_nonneg (fun i hi => hG_nonneg i hi a) + have hY_int : Integrable (fun a => |Y a| ^ ξ) P := by + simpa [Y] using + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := s) (G := G) + hξ hG_aemeas hG_int + have hExcess_aemeas : AEMeasurable (fun a => max (X a - base) 0) P := + (hX_aemeas.sub aemeasurable_const).max aemeasurable_const + have hPoint_abs : + ∀ᵐ a ∂P, |max (X a - base) 0| ≤ Y a := by + filter_upwards [hPoint] with a ha + simpa [Y, abs_of_nonneg (le_max_right (X a - base) 0)] using ha + exact + section52_integrable_abs_pow_of_ae_abs_le_nonneg + (P := P) (ξ := ξ) + (X := fun a => max (X a - base) 0) (Y := Y) + hExcess_aemeas hY_nonneg hPoint_abs hY_int + +theorem upper_unitDescendant_Lambda_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) + {U : TriadicCube d} + (hU : U ∈ descendantsAtScale (originCube d (m : ℤ)) 0) : + Integrable + (fun a : RegCoeffField d => |Ch04.LambdaSqCoeffField U s (.finite 1) a| ^ ξ) P := by + classical + let X0 : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a + have hX0_aemeas : AEMeasurable X0 P := + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d 0) hs + have hX0_abs_int : Integrable (fun a : RegCoeffField d => |X0 a| ^ ξ) P := by + refine hSourceInt.congr ?_ + filter_upwards with a + rw [abs_of_nonneg] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => Ch04.LambdaSqCoeffField U s (.finite 1) a) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.LambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + simpa [X0, hUeq] using hcov + have hmap : + Measure.map (fun a : RegCoeffField d => Ch04.LambdaSqCoeffField U s (.finite 1) a) P = + Measure.map X0 P := by + calc + Measure.map (fun a : RegCoeffField d => Ch04.LambdaSqCoeffField U s (.finite 1) a) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + exact integrable_abs_pow_of_map_eq_map_aemeasurable + (hP.aemeasurable_LambdaSqCoeffField_finite_one U hs) hX0_aemeas hmap hX0_abs_int + +/-- Membership of a `some` index in a finite family with an extra `none` +entry is membership of the original index in the original family. -/ +theorem section52_mem_of_some_mem_insert_image_some + {ι : Type*} [DecidableEq ι] {s : Finset ι} {i : ι} + (hi : some i ∈ insert none (s.image some)) : + i ∈ s := by + classical + have hsome : some i ∈ s.image some := by + rcases Finset.mem_insert.mp hi with hnone | hsome + · cases hnone + · exact hsome + rcases Finset.mem_image.mp hsome with ⟨j, hj, hji⟩ + exact (Option.some.inj hji) ▸ hj + +/-- An attached-sum upper bound transfers to the corresponding ordinary finite +sum while replacing its initial summand by a larger one. -/ +theorem section52_le_add_finsetSum_of_le_add_attachSum + {ι : Type*} {s : Finset ι} {F : {i // i ∈ s} → ℝ} {G : ι → ℝ} + {x a b : ℝ} + (hsplit : x ≤ a + ∑ i ∈ s.attach, F i) + (hsmall : a ≤ b) (hFG : ∀ i, F i = G i.1) : + x ≤ b + ∑ i ∈ s, G i := by + have hsum : ∑ i ∈ s.attach, F i = ∑ i ∈ s, G i := by + calc + ∑ i ∈ s.attach, F i = ∑ i ∈ s.attach, G i.1 := + Finset.sum_congr rfl (fun i _ => hFG i) + _ = ∑ i ∈ s, G i := Finset.sum_attach s G + calc + x ≤ b + ∑ i ∈ s.attach, F i := hsplit.trans (add_le_add_right hsmall _) + _ = b + ∑ i ∈ s, G i := congrArg (b + ·) hsum + +theorem upperFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let s : ℝ := hP4.sUpper + let ξ : ℕ := hP4.xi + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let V : ℝ := section52SmallTailWeight s m + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let base : ℝ := scalarization.barSigma 0 + let cSmall : ℝ := + Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V + let small : RegCoeffField d → ℝ := + fun a => cSmall * + ∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a + let large : ℤ → RegCoeffField d → ℝ := fun n a => + if hn : n ∈ section52LargeScaleSet m then + section52LargeScaleWeight s m n * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm (base • (1 : Mat d))) + 0)) + else 0 + let I : Finset (Option ℤ) := insert none ((section52LargeScaleSet m).image some) + let G : Option ℤ → RegCoeffField d → ℝ := fun o a => + match o with + | none => small a + base + | some n => large n a + have hξ_one : 1 ≤ ξ := by + simpa [ξ] using Nat.succ_le_of_lt hP4.xi_pos + have hξ_two : 2 ≤ ξ := by + simpa [ξ] using hP4.two_le_xi + have hs : 0 < s := by simpa [s] using hP4.sUpper_pos + have hs_nonneg : 0 ≤ s := hs.le + have hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + hP4.sUpper_pos hP4.sLower_pos hξ_one + hP4.upper_moment_integrable hP4.lower_inv_moment_integrable + have hbase_nonneg : 0 ≤ base := by + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hBarSigma0_eq : + base = Ch04.Internal.barBAtScaleOfPrimitive primitive0 := by + simpa [base, scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigma_eq_barB + (Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + have hB0 : + 0 ≤ Ch04.Internal.barBAtScaleOfPrimitive primitive0 := by + simpa [primitive0] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + hBlock0 + simpa [hBarSigma0_eq] using hB0 + have hcSmall_nonneg : 0 ≤ cSmall := by + have hVpos : 0 < V := by + simpa [V, s] using section52SmallTailWeight_pos hP4.sUpper_pos m + exact div_nonneg + (mul_nonneg (sq_nonneg _) (by exact_mod_cast Nat.zero_le D.card)) + hVpos.le + have hsmall_nonneg : ∀ a, 0 ≤ small a := by + intro a + exact mul_nonneg hcSmall_nonneg + (Finset.sum_nonneg fun U _hU => + Ch04.LambdaSqCoeffField_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1)) + have hlarge_nonneg : + ∀ n ∈ section52LargeScaleSet m, ∀ a, 0 ≤ large n a := by + intro n hn a + simpa [large, s, scalarization, base, hn] using! + upperLargeScalePositiveExcess_nonneg_source + hP hStruct hs_nonneg hn a + have hG_nonneg : ∀ o ∈ I, ∀ a, 0 ≤ G o a := by + intro o ho a + cases o with + | none => + exact add_nonneg (hsmall_nonneg a) hbase_nonneg + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + exact hlarge_nonneg n hn a + have hsmall_aemeas : AEMeasurable small P := + aemeasurable_const.mul (Finset.aemeasurable_fun_sum D fun U _ => + hP.aemeasurable_LambdaSqCoeffField_finite_one U hs) + have hG_aemeas : ∀ o ∈ I, AEMeasurable (G o) P := by + intro o ho + cases o with + | none => + exact hsmall_aemeas.add aemeasurable_const + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + simpa [G, large, s, scalarization, base, hn] using! + upperLargeScalePositiveExcess_aemeasurable_source + hP hStruct (r := s) hn + have hsmall_int : Integrable (fun a : RegCoeffField d => |small a| ^ ξ) P := by + have hunit_int : + ∀ U ∈ D, + Integrable + (fun a : RegCoeffField d => + |Ch04.LambdaSqCoeffField U s (.finite 1) a| ^ ξ) P := by + intro U hU + exact upper_unitDescendant_Lambda_integrable_abs_pow + hP hStruct hs hP4.upper_moment_integrable hU + have hsum_int : + Integrable + (fun a : RegCoeffField d => + |∑ U ∈ D, Ch04.LambdaSqCoeffField U s (.finite 1) a| ^ ξ) P := + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := D) + (G := fun U a => Ch04.LambdaSqCoeffField U s (.finite 1) a) + hξ_one + (fun U _hU => hP.aemeasurable_LambdaSqCoeffField_finite_one U hs) + hunit_int + refine (hsum_int.const_mul (|cSmall| ^ ξ)).congr ?_ + filter_upwards with a + simp [small, abs_mul, mul_pow] + have hnone_int : Integrable (fun a : RegCoeffField d => |small a + base| ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hsmall_mem : MemLp small (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hsmall_aemeas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hsmall_int + have hbase_mem : MemLp (fun _ : RegCoeffField d => base) (ξ : ENNReal) P := + memLp_const base + have hadd := hsmall_mem.add hbase_mem + have hint := hadd.integrable_norm_pow hξ_ne + simpa [Real.norm_eq_abs] using hint + have hG_int : ∀ o ∈ I, Integrable (fun a : RegCoeffField d => |G o a| ^ ξ) P := by + intro o ho + cases o with + | none => + simpa [G] using hnone_int + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + have hInt := + upperLargeScalePositiveExcess_integrable_abs_pow_source + hP hStruct (sSource := s) (r := s) (ξ := ξ) + hs hξ_one hξ_two hP4.upper_moment_integrable hn + simpa [G, large, s, scalarization, base, Real.norm_eq_abs, hn] using! hInt + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a + have hX_aemeas : AEMeasurable X P := + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d (m : ℤ)) hs + have hPoint : + ∀ᵐ a ∂P, max (X a - 0) 0 ≤ ∑ o ∈ I, G o a := by + filter_upwards with a + have hsplit := + LambdaSqCoeffField_originCube_finite_one_le_upperSmallSqrtTail_sq_div_add_largeScale_sum + (d := d) m hs a + have hsmall := upperSmallTailTerm_le_sameExponent_unitDescendantSum (d := d) m hs a + have hlarge := upperLargeScaleRaw_sum_le_base_add_positiveExcess_sum + (d := d) m hs hbase_nonneg a + have hX_nonneg : 0 ≤ X a := + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hsmall_le : + upperSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m ≤ small a := by + simpa [small, cSmall, D, V, s] using hsmall + have hlarge_sum : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantBMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) ≤ + base + ∑ n ∈ section52LargeScaleSet m, large n a := by + refine section52_le_add_finsetSum_of_le_add_attachSum + (G := fun n => large n a) hlarge le_rfl ?_ + intro n + simp [large, n.2] + calc + max (X a - 0) 0 = X a := by simp [X, hX_nonneg] + _ ≤ small a + (base + ∑ n ∈ section52LargeScaleSet m, large n a) := + hsplit.trans (add_le_add hsmall_le hlarge_sum) + _ = ∑ o ∈ I, G o a := by simp [I, G, add_assoc] + have hAbsInt : + Integrable (fun a : RegCoeffField d => |max (X a - 0) 0| ^ ξ) P := + section52_integrable_abs_positiveExcess_pow_of_ae_finset_sum_bound + (P := P) (ξ := ξ) (s := I) (X := X) (base := 0) (G := G) + hξ_one hX_aemeas hG_nonneg hG_aemeas hG_int hPoint + have hPowInt : Integrable (fun a : RegCoeffField d => X a ^ ξ) P := by + refine hAbsInt.congr ?_ + filter_upwards with a + have hX_nonneg : 0 ≤ X a := + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a hs + (by norm_num : (1 : ℝ) ≤ 1) + simp [abs_of_nonneg hX_nonneg, max_eq_left hX_nonneg] + simpa [X, s, ξ] using hPowInt + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/UnitDescendantSup.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/UnitDescendantSup.lean new file mode 100644 index 0000000000..29a81e313e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessLowerAndIntegrability/UnitDescendantSup.lean @@ -0,0 +1,563 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessUpper +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.PowIntegrable + +/-! # Unit Descendant Sup -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +theorem section52_annealedMomentRoot_le_const_mul_of_ae_le + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} {c : ℝ} + {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hc : 0 ≤ c) + (hX_nonneg : ∀ a, 0 ≤ X a) (hY_nonneg : ∀ a, 0 ≤ Y a) + (hX_aemeas : AEMeasurable X P) + (hY_abs_int : Integrable (fun a => |Y a| ^ ξ) P) + (hXY : X ≤ᵐ[P] fun a => c * Y a) : + Ch04.annealedMomentRoot P ξ X ≤ c * Ch04.annealedMomentRoot P ξ Y := by + have hCY_nonneg : ∀ a, 0 ≤ c * Y a := fun a => mul_nonneg hc (hY_nonneg a) + have hY_pow_int : Integrable (fun a => Y a ^ ξ) P := by + refine hY_abs_int.congr ?_ + filter_upwards with a + rw [abs_of_nonneg (hY_nonneg a)] + have hCY_pow_int : Integrable (fun a => (c * Y a) ^ ξ) P := by + refine (hY_pow_int.const_mul (c ^ ξ)).congr ?_ + filter_upwards with a + rw [mul_pow] + have hCY_abs_int : Integrable (fun a => |c * Y a| ^ ξ) P := by + refine hCY_pow_int.congr ?_ + filter_upwards with a + rw [abs_of_nonneg (hCY_nonneg a)] + have hX_abs_le : + ∀ᵐ a ∂P, |X a| ≤ c * Y a := by + filter_upwards [hXY] with a ha + simpa [abs_of_nonneg (hX_nonneg a)] using ha + have hX_abs_int : Integrable (fun a => |X a| ^ ξ) P := + section52_integrable_abs_pow_of_ae_abs_le_nonneg + (P := P) (ξ := ξ) (X := X) (Y := fun a => c * Y a) + hX_aemeas hCY_nonneg hX_abs_le hCY_abs_int + have hX_pow_int : Integrable (fun a => X a ^ ξ) P := by + refine hX_abs_int.congr ?_ + filter_upwards with a + rw [abs_of_nonneg (hX_nonneg a)] + have hmono : + Ch04.annealedMomentRoot P ξ X ≤ + Ch04.annealedMomentRoot P ξ (fun a => c * Y a) := + Ch04.annealedMomentRoot_le_of_ae_nonneg_le + (P := P) (ξ := ξ) (X := X) (Y := fun a => c * Y a) + hξ hX_nonneg hX_pow_int hCY_pow_int hXY + calc + Ch04.annealedMomentRoot P ξ X ≤ + Ch04.annealedMomentRoot P ξ (fun a => c * Y a) := hmono + _ = c * Ch04.annealedMomentRoot P ξ Y := + section52_annealedMomentRoot_const_mul_of_nonneg hξ hc hY_nonneg + +theorem upper_unitDescendantSup_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) (hξ_one : 1 ≤ ξ) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) s (.finite 1) a) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + Integrable + (fun a : RegCoeffField d => + |D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)| ^ ξ) P := by + classical + intro D hD + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => Ch04.LambdaSqCoeffField U s (.finite 1) a + have hX_nonneg : ∀ U ∈ D, ∀ a, 0 ≤ X U a := by + intro U _hU a + exact Ch04.LambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hX_aemeas : ∀ U ∈ D, AEMeasurable (X U) P := by + intro U _hU + exact hP.aemeasurable_LambdaSqCoeffField_finite_one U hs + have hX_int : ∀ U ∈ D, Integrable (fun a : RegCoeffField d => |X U a| ^ ξ) P := by + intro U hU + exact upper_unitDescendant_Lambda_integrable_abs_pow + hP hStruct hs hSourceInt hU + have hsum_int : + Integrable (fun a : RegCoeffField d => |∑ U ∈ D, X U a| ^ ξ) P := + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := D) (G := X) + hξ_one hX_aemeas hX_int + have hsum_nonneg : ∀ a, 0 ≤ ∑ U ∈ D, X U a := by + intro a + exact Finset.sum_nonneg fun U hU => hX_nonneg U hU a + have hS_aemeas : + AEMeasurable + (fun a : RegCoeffField d => D.sup' hD (fun U => X U a)) P := by + have h : + AEMeasurable (D.sup' hD (fun U (a : RegCoeffField d) => X U a)) P := by + refine Finset.sup'_induction (s := D) (H := hD) + (f := fun U (a : RegCoeffField d) => X U a) + (p := fun f => AEMeasurable f P) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro U hU + exact hX_aemeas U hU + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hD + (fun U (a : RegCoeffField d) => X U a) a).symm + have hS_le_sum : + ∀ᵐ a ∂P, + |D.sup' hD (fun U => X U a)| ≤ ∑ U ∈ D, X U a := by + filter_upwards with a + have hS_nonneg : 0 ≤ D.sup' hD (fun U => X U a) := by + rcases hD with ⟨U0, hU0⟩ + exact (hX_nonneg U0 hU0 a).trans + (Finset.le_sup' (f := fun U => X U a) hU0) + rw [abs_of_nonneg hS_nonneg] + refine Finset.sup'_le hD _ ?_ + intro U hU + exact Finset.single_le_sum + (f := fun V => X V a) (fun V hV => hX_nonneg V hV a) hU + exact + section52_integrable_abs_pow_of_ae_abs_le_nonneg + (P := P) (ξ := ξ) + (X := fun a : RegCoeffField d => D.sup' hD (fun U => X U a)) + (Y := fun a : RegCoeffField d => ∑ U ∈ D, X U a) + hS_aemeas hsum_nonneg hS_le_sum hsum_int + +theorem upper_unitDescendantSup_aemeasurable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) {s : ℝ} {m : ℕ} (hs : 0 < s) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + AEMeasurable + (fun a : RegCoeffField d => + D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a)) P := by + classical + intro D hD + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => Ch04.LambdaSqCoeffField U s (.finite 1) a + have h : + AEMeasurable (D.sup' hD (fun U (a : RegCoeffField d) => X U a)) P := by + refine Finset.sup'_induction (s := D) (H := hD) + (f := fun U (a : RegCoeffField d) => X U a) + (p := fun f => AEMeasurable f P) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro U _hU + exact hP.aemeasurable_LambdaSqCoeffField_finite_one U hs + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hD + (fun U (a : RegCoeffField d) => X U a) a).symm + +theorem upper_unitDescendantSup_nonneg + {d : ℕ} [NeZero d] {s : ℝ} {m : ℕ} (hs : 0 < s) (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + 0 ≤ D.sup' hD (fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) := by + intro D hD + rcases hD with ⟨U0, hU0⟩ + exact + (Ch04.LambdaSqCoeffField_finite_nonneg U0 a hs + (by norm_num : (1 : ℝ) ≤ 1)).trans + (Finset.le_sup' + (f := fun U => Ch04.LambdaSqCoeffField U s (.finite 1) a) hU0) + +theorem lower_unitDescendant_lambdaInv_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) + {U : TriadicCube d} + (hU : U ∈ descendantsAtScale (originCube d (m : ℤ)) 0) : + Integrable + (fun a : RegCoeffField d => |(Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹| ^ ξ) P := by + classical + let X0 : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹ + have hX0_aemeas : AEMeasurable X0 P := + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d 0) hs + have hX0_abs_int : Integrable (fun a : RegCoeffField d => |X0 a| ^ ξ) P := by + refine hSourceInt.congr ?_ + filter_upwards with a + rw [abs_of_nonneg] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hscale : U.scale = 0 := scale_eq_of_mem_descendantsAtScale hU + let z : Fin d → ℤ := Book.Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using (translateCube_originCube_zero_eq_of_scale_zero U hscale).symm + have hae : + (fun a : RegCoeffField d => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) =ᵐ[P] + fun a => X0 (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.lambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z s (.finite 1) + filter_upwards [by simpa [X0, hUeq] using! hcov] with a ha + simpa [X0, hUeq] using congrArg Inv.inv ha + have hmap : + Measure.map (fun a : RegCoeffField d => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) P = + Measure.map X0 P := by + calc + Measure.map (fun a : RegCoeffField d => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + exact integrable_abs_pow_of_map_eq_map_aemeasurable + (hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs) hX0_aemeas hmap hX0_abs_int + +theorem lower_unitDescendantSup_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {s : ℝ} {ξ m : ℕ} (hs : 0 < s) (hξ_one : 1 ≤ ξ) + (hSourceInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d 0) s (.finite 1) a)⁻¹) ^ ξ) P) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + Integrable + (fun a : RegCoeffField d => + |D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)| ^ ξ) P := by + classical + intro D hD + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ + have hX_nonneg : ∀ U ∈ D, ∀ a, 0 ≤ X U a := by + intro U _hU a + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_aemeas : ∀ U ∈ D, AEMeasurable (X U) P := by + intro U _hU + exact hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs + have hX_int : ∀ U ∈ D, Integrable (fun a : RegCoeffField d => |X U a| ^ ξ) P := by + intro U hU + exact lower_unitDescendant_lambdaInv_integrable_abs_pow + hP hStruct hs hSourceInt hU + have hsum_int : + Integrable (fun a : RegCoeffField d => |∑ U ∈ D, X U a| ^ ξ) P := + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := D) (G := X) + hξ_one hX_aemeas hX_int + have hsum_nonneg : ∀ a, 0 ≤ ∑ U ∈ D, X U a := by + intro a + exact Finset.sum_nonneg fun U hU => hX_nonneg U hU a + have hS_aemeas : + AEMeasurable + (fun a : RegCoeffField d => D.sup' hD (fun U => X U a)) P := by + have h : + AEMeasurable (D.sup' hD (fun U (a : RegCoeffField d) => X U a)) P := by + refine Finset.sup'_induction (s := D) (H := hD) + (f := fun U (a : RegCoeffField d) => X U a) + (p := fun f => AEMeasurable f P) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro U hU + exact hX_aemeas U hU + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hD + (fun U (a : RegCoeffField d) => X U a) a).symm + have hS_le_sum : + ∀ᵐ a ∂P, + |D.sup' hD (fun U => X U a)| ≤ ∑ U ∈ D, X U a := by + filter_upwards with a + have hS_nonneg : 0 ≤ D.sup' hD (fun U => X U a) := by + rcases hD with ⟨U0, hU0⟩ + exact (hX_nonneg U0 hU0 a).trans + (Finset.le_sup' (f := fun U => X U a) hU0) + rw [abs_of_nonneg hS_nonneg] + refine Finset.sup'_le hD _ ?_ + intro U hU + exact Finset.single_le_sum + (f := fun V => X V a) (fun V hV => hX_nonneg V hV a) hU + exact + section52_integrable_abs_pow_of_ae_abs_le_nonneg + (P := P) (ξ := ξ) + (X := fun a : RegCoeffField d => D.sup' hD (fun U => X U a)) + (Y := fun a : RegCoeffField d => ∑ U ∈ D, X U a) + hS_aemeas hsum_nonneg hS_le_sum hsum_int + +theorem lower_unitDescendantSup_aemeasurable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) {s : ℝ} {m : ℕ} (hs : 0 < s) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + AEMeasurable + (fun a : RegCoeffField d => + D.sup' hD (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹)) P := by + classical + intro D hD + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U a => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ + have h : + AEMeasurable (D.sup' hD (fun U (a : RegCoeffField d) => X U a)) P := by + refine Finset.sup'_induction (s := D) (H := hD) + (f := fun U (a : RegCoeffField d) => X U a) + (p := fun f => AEMeasurable f P) ?_ ?_ + · intro _f hf _g hg + exact hf.sup hg + · intro U _hU + exact hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs + convert h using 1 + ext a + exact (Finset.sup'_apply (C := fun _ : RegCoeffField d => ℝ) hD + (fun U (a : RegCoeffField d) => X U a) a).symm + +theorem lower_unitDescendantSup_nonneg + {d : ℕ} [NeZero d] {s : ℝ} {m : ℕ} (hs : 0 < s) (a : RegCoeffField d) : + let D := descendantsAtScale (originCube d (m : ℤ)) 0 + let hD : D.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) (by simp [originCube]) + 0 ≤ D.sup' hD + (fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) := by + intro D hD + rcases hD with ⟨U0, hU0⟩ + exact + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U0 a hs + (by norm_num : (1 : ℝ) ≤ 1))).trans + (Finset.le_sup' + (f := fun U => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) hU0) + +theorem lowerFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let s : ℝ := hP4.sLower + let ξ : ℕ := hP4.xi + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d (m : ℤ)) 0 + let V : ℝ := section52SmallTailWeight s m + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let base : ℝ := (scalarization.barSigmaStar 0)⁻¹ + let cSmall : ℝ := + Real.rpow (3 : ℝ) (-s * (m : ℝ)) ^ 2 * (D.card : ℝ) / V + let small : RegCoeffField d → ℝ := + fun a => cSmall * + ∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹ + let large : ℤ → RegCoeffField d → ℝ := fun n a => + if hn : n ∈ section52LargeScaleSet m then + section52LargeScaleWeight s m n * + (let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight - + Ch02.matrixNorm (base • (1 : Mat d))) + 0)) + else 0 + let I : Finset (Option ℤ) := insert none ((section52LargeScaleSet m).image some) + let G : Option ℤ → RegCoeffField d → ℝ := fun o a => + match o with + | none => small a + base + | some n => large n a + have hξ_one : 1 ≤ ξ := by + simpa [ξ] using Nat.succ_le_of_lt hP4.xi_pos + have hξ_two : 2 ≤ ξ := by + simpa [ξ] using hP4.two_le_xi + have hs : 0 < s := by simpa [s] using hP4.sLower_pos + have hs_nonneg : 0 ≤ s := hs.le + have hBlock0 : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_origin_of_integrable_factor_observables + hP4.sUpper_pos hP4.sLower_pos hξ_one + hP4.upper_moment_integrable hP4.lower_inv_moment_integrable + have hbase_nonneg : 0 ≤ base := by + let primitive0 := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ) + have hBarSigmaStar0_inv_eq : + base = Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0 := by + have hstar : + scalarization.barSigmaStar 0 = + (Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0)⁻¹ := by + simpa [base, scalarization, primitive0] using + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_eq_inv_barSigmaStarInv + (Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + simp [base, hstar] + have hStar0 : + 0 < Ch04.Internal.barSigmaStarInvAtScaleOfPrimitive primitive0 := by + simpa [primitive0] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + hBlock0 + simpa [hBarSigmaStar0_inv_eq] using hStar0.le + have hcSmall_nonneg : 0 ≤ cSmall := by + have hVpos : 0 < V := by + simpa [V, s] using section52SmallTailWeight_pos hP4.sLower_pos m + exact div_nonneg + (mul_nonneg (sq_nonneg _) (by exact_mod_cast Nat.zero_le D.card)) + hVpos.le + have hsmall_nonneg : ∀ a, 0 ≤ small a := by + intro a + exact mul_nonneg hcSmall_nonneg + (Finset.sum_nonneg fun U _hU => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hs (by norm_num : (1 : ℝ) ≤ 1))) + have hlarge_nonneg : + ∀ n ∈ section52LargeScaleSet m, ∀ a, 0 ≤ large n a := by + intro n hn a + simpa [large, s, scalarization, base, hn] using! + lowerLargeScalePositiveExcess_nonneg_source + hP hStruct hs_nonneg hn a + have hG_nonneg : ∀ o ∈ I, ∀ a, 0 ≤ G o a := by + intro o ho a + cases o with + | none => + exact add_nonneg (hsmall_nonneg a) hbase_nonneg + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + exact hlarge_nonneg n hn a + have hsmall_aemeas : AEMeasurable small P := + aemeasurable_const.mul (Finset.aemeasurable_fun_sum D fun U _ => + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs) + have hG_aemeas : ∀ o ∈ I, AEMeasurable (G o) P := by + intro o ho + cases o with + | none => + exact hsmall_aemeas.add aemeasurable_const + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + simpa [G, large, s, scalarization, base, hn] using! + lowerLargeScalePositiveExcess_aemeasurable_source + hP hStruct (r := s) hn + have hsmall_int : Integrable (fun a : RegCoeffField d => |small a| ^ ξ) P := by + have hsum_int : + Integrable + (fun a : RegCoeffField d => + |∑ U ∈ D, (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹| ^ ξ) P := + section52_integrable_abs_finset_sum_pow_of_integrable_abs_pow + (P := P) (ξ := ξ) (s := D) + (G := fun U a => (Ch04.lambdaSqCoeffField U s (.finite 1) a)⁻¹) + hξ_one + (fun U _hU => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv U hs) + (fun U hU => lower_unitDescendant_lambdaInv_integrable_abs_pow + hP hStruct hs hP4.lower_inv_moment_integrable hU) + refine (hsum_int.const_mul (|cSmall| ^ ξ)).congr ?_ + filter_upwards with a + simp [small, abs_mul, mul_pow] + have hnone_int : Integrable (fun a : RegCoeffField d => |small a + base| ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hsmall_mem : MemLp small (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hsmall_aemeas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hsmall_int + have hbase_mem : MemLp (fun _ : RegCoeffField d => base) (ξ : ENNReal) P := + memLp_const base + have hadd := hsmall_mem.add hbase_mem + have hint := hadd.integrable_norm_pow hξ_ne + simpa [Real.norm_eq_abs] using hint + have hG_int : ∀ o ∈ I, Integrable (fun a : RegCoeffField d => |G o a| ^ ξ) P := by + intro o ho + cases o with + | none => + simpa [G] using hnone_int + | some n => + have hn : n ∈ section52LargeScaleSet m := + section52_mem_of_some_mem_insert_image_some ho + have hInt := + lowerLargeScalePositiveExcess_integrable_abs_pow_source + hP hStruct (sSource := s) (r := s) (ξ := ξ) + hs hξ_one hξ_two hP4.lower_inv_moment_integrable hn + simpa [G, large, s, scalarization, base, Real.norm_eq_abs, hn] using! hInt + let X : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) s (.finite 1) a)⁻¹ + have hX_aemeas : AEMeasurable X P := + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d (m : ℤ)) hs + have hPoint : + ∀ᵐ a ∂P, max (X a - 0) 0 ≤ ∑ o ∈ I, G o a := by + filter_upwards with a + have hsplit := + lambdaSqCoeffField_originCube_finite_one_inv_le_lowerSmallSqrtTail_sq_div_add_largeScale_sum + (d := d) m hs a + have hsmall := lowerSmallTailTerm_le_sameExponent_unitDescendantSum (d := d) m hs a + have hlarge := lowerLargeScaleRaw_sum_le_base_add_positiveExcess_sum + (d := d) m hs hbase_nonneg a + have hX_nonneg : 0 ≤ X a := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hsmall_le : + lowerSmallSqrtTailCoeffField (d := d) m s a ^ 2 / + section52SmallTailWeight s m ≤ small a := by + simpa [small, cSmall, D, V, s] using hsmall + have hlarge_sum : + (∑ n ∈ section52LargeScaleSet m, + section52LargeScaleWeight s m n * + Ch04.maxDescendantSigmaStarInvMatrixNormCoeffFieldAtScale + (originCube d (m : ℤ)) n a) ≤ + base + ∑ n ∈ section52LargeScaleSet m, large n a := by + refine section52_le_add_finsetSum_of_le_add_attachSum + (G := fun n => large n a) hlarge le_rfl ?_ + intro n + simp [large, n.2] + calc + max (X a - 0) 0 = X a := by simp [X, hX_nonneg] + _ ≤ small a + (base + ∑ n ∈ section52LargeScaleSet m, large n a) := + hsplit.trans (add_le_add hsmall_le hlarge_sum) + _ = ∑ o ∈ I, G o a := by simp [I, G, add_assoc] + have hAbsInt : + Integrable (fun a : RegCoeffField d => |max (X a - 0) 0| ^ ξ) P := + section52_integrable_abs_positiveExcess_pow_of_ae_finset_sum_bound + (P := P) (ξ := ξ) (s := I) (X := X) (base := 0) (G := G) + hξ_one hX_aemeas hG_nonneg hG_aemeas hG_int hPoint + have hPowInt : Integrable (fun a : RegCoeffField d => X a ^ ξ) P := by + refine hAbsInt.congr ?_ + filter_upwards with a + have hX_nonneg : 0 ≤ X a := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + simp [abs_of_nonneg hX_nonneg, max_eq_left hX_nonneg] + simpa [X, s, ξ] using hPowInt + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessUpper.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessUpper.lean new file mode 100644 index 0000000000..a9f521a86a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/PositiveExcessUpper.lean @@ -0,0 +1,739 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.FluctuationBridge + +/-! # Positive Excess Upper -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: PositiveExcessUpper + +Upper large-scale positive-excess estimates. +-/ + +theorem section52_annealedMomentRoot_const_mul_of_nonneg + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} {c : ℝ} + {X : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hc : 0 ≤ c) (hX_nonneg : ∀ a, 0 ≤ X a) : + Ch04.annealedMomentRoot P ξ (fun a => c * X a) = + c * Ch04.annealedMomentRoot P ξ X := by + have hξ_ne_zero : ξ ≠ 0 := by omega + let I : ℝ := ∫ a, X a ^ ξ ∂P + have hI_nonneg : 0 ≤ I := by + exact MeasureTheory.integral_nonneg (fun a => pow_nonneg (hX_nonneg a) ξ) + have hint : + ∫ a, (c * X a) ^ ξ ∂P = c ^ ξ * I := by + simp [I, mul_pow, MeasureTheory.integral_const_mul] + calc + Ch04.annealedMomentRoot P ξ (fun a => c * X a) + = (c ^ ξ * I) ^ (1 / (ξ : ℝ)) := by + simp [Ch04.annealedMomentRoot, hint, I] + _ = (c ^ ξ) ^ (1 / (ξ : ℝ)) * I ^ (1 / (ξ : ℝ)) := by + exact Real.mul_rpow (pow_nonneg hc ξ) hI_nonneg + _ = c * I ^ (1 / (ξ : ℝ)) := by + rw [one_div, Real.pow_rpow_inv_natCast hc hξ_ne_zero] + _ = c * Ch04.annealedMomentRoot P ξ X := by + simp [Ch04.annealedMomentRoot, I] + +theorem section52_descendantsAtScale_zero_card_of_scale_eq + {d : ℕ} (Q : TriadicCube d) {n : ℤ} (hn : 0 ≤ n) + (hQscale : Q.scale = n) : + (descendantsAtScale Q 0).card = (3 ^ d) ^ Int.toNat n := by + have hzero_le_scale : (0 : ℤ) ≤ Q.scale := by + simpa [hQscale] using hn + rw [descendantsAtScale_eq_descendantsAtDepth Q hzero_le_scale] + have hdepth : Int.toNat (Q.scale - 0) = Int.toNat n := by + simp [hQscale] + rw [hdepth] + exact descendantsAtDepth_card Q (Int.toNat n) + +theorem section52UnitDescendantRosenthalBudget_eq_originCube_of_scale_eq + {d : ℕ} (Q : TriadicCube d) {n : ℤ} (hn : 0 ≤ n) + (hQscale : Q.scale = n) (ξ : ℕ) (K : ℝ) : + section52UnitDescendantRosenthalBudget Q ξ K = + section52UnitDescendantRosenthalBudget (originCube d n) ξ K := by + unfold section52UnitDescendantRosenthalBudget + rw [section52_descendantsAtScale_zero_card_of_scale_eq Q hn hQscale, + section52_descendantsAtScale_originCube_int_zero_card d hn] + +theorem upperLargeScalePositiveExcessRoot_le_largeScaleRootCoeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Ch04.annealedMomentRoot P hP4.xi + (fun a => + section52LargeScaleWeight hP4.sUpper m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d hP4.xi hP4.sUpper m n * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + classical + intro parents hparents + let initial : ℝ := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let K : ℝ := 2 * initial + let B : ℝ := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q hP4.xi K) + let parentFactor : ℝ := ((parents.card : ℝ) ^ (1 / (hP4.xi : ℝ))) + let entryFactor : ℝ := (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) + let X : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_le_m : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + have hn_cast : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + have hnm_nat : Int.toNat n ≤ m := by omega + have hweight_nonneg : 0 ≤ section52LargeScaleWeight hP4.sUpper m n := + section52LargeScaleWeight_nonneg m hP4.sUpper_nonneg n + have hinitial_nonneg : 0 ≤ initial := by + simpa [initial] using + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hparentFactor_nonneg : 0 ≤ parentFactor := by + dsimp [parentFactor] + positivity + have hentryFactor_nonneg : 0 ≤ entryFactor := by + dsimp [entryFactor] + positivity + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) hQ0) + have hfluct : + Ch04.annealedMomentRoot P hP4.xi X ≤ entryFactor * (parentFactor * B) := by + have h := + upperLargeScaleFiniteParentFluctuation + hP hStruct hP4 (m := m) (n := Int.toNat n) hnm_nat + simpa [X, entryFactor, parentFactor, B, K, parents, hn_cast] using h + have hB_le : + B ≤ section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K := by + dsimp [B] + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + have hQscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + exact le_of_eq + (section52UnitDescendantRosenthalBudget_eq_originCube_of_scale_eq + Q hn_nonneg hQscale hP4.xi K) + have hweighted : + Ch04.annealedMomentRoot P hP4.xi + (fun a => section52LargeScaleWeight hP4.sUpper m n * X a) = + section52LargeScaleWeight hP4.sUpper m n * + Ch04.annealedMomentRoot P hP4.xi X := + section52_annealedMomentRoot_const_mul_of_nonneg + (Nat.succ_le_of_lt hP4.xi_pos) hweight_nonneg hX_nonneg + have hB_step : + section52LargeScaleWeight hP4.sUpper m n * + (entryFactor * (parentFactor * B)) ≤ + section52LargeScaleWeight hP4.sUpper m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) := by + have h1 : + parentFactor * B ≤ + parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K := + mul_le_mul_of_nonneg_left hB_le hparentFactor_nonneg + have h2 : + entryFactor * (parentFactor * B) ≤ + entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K) := + mul_le_mul_of_nonneg_left h1 hentryFactor_nonneg + exact mul_le_mul_of_nonneg_left h2 hweight_nonneg + have hcoeff_eq : + section52LargeScaleWeight hP4.sUpper m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) = + entryFactor * section52LargeScaleRootCoeff d hP4.xi hP4.sUpper m n * initial := by + simp [section52LargeScaleRootCoeff, section52LargeScaleLpRootCoeff, + section52LargeScaleSqrtRootCoeff, section52UnitDescendantRosenthalBudget, + entryFactor, parentFactor, K, initial] + ring + calc + Ch04.annealedMomentRoot P hP4.xi + (fun a => + section52LargeScaleWeight hP4.sUpper m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) + = Ch04.annealedMomentRoot P hP4.xi + (fun a => section52LargeScaleWeight hP4.sUpper m n * X a) := by + rfl + _ = section52LargeScaleWeight hP4.sUpper m n * + Ch04.annealedMomentRoot P hP4.xi X := hweighted + _ ≤ section52LargeScaleWeight hP4.sUpper m n * + (entryFactor * (parentFactor * B)) := + mul_le_mul_of_nonneg_left hfluct hweight_nonneg + _ ≤ section52LargeScaleWeight hP4.sUpper m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) hP4.xi K)) := hB_step + _ = entryFactor * section52LargeScaleRootCoeff d hP4.xi hP4.sUpper m n * + initial := hcoeff_eq + +theorem upperLargeScalePositiveExcess_integrable_abs_pow + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Integrable + (fun a : RegCoeffField d => + ‖(section52LargeScaleWeight hP4.sUpper m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_le_m : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + hP4.xi) P := by + intro i j + exact + (Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_upperLeft_entry_momentRoot_le_two_LambdaMomentAtScale + hP hP4.sUpper_pos (Nat.succ_le_of_lt hP4.xi_pos) + hP4.upper_moment_integrable i j).1 + have hBase : + Integrable + (fun a : RegCoeffField d => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := by + exact + Ch04.RestrictionLawCarrier.upperLeft_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + hP hparents (n := (0 : ℤ)) (ξ := hP4.xi) + le_rfl hparent_scale hStruct.stationary + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d)) + (section52_upperCenter_entries hP hStruct) + hP4.two_le_xi hOrigin + have hconst : + Integrable + (fun a : RegCoeffField d => + ‖section52LargeScaleWeight hP4.sUpper m n‖ ^ hP4.xi * + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ hP4.xi) P := + hBase.const_mul _ + refine hconst.congr ?_ + filter_upwards with a + rw [← mul_pow, ← norm_mul] + +theorem upperLargeScalePositiveExcess_integrable_abs_pow_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {sSource r : ℝ} {ξ : ℕ} + (hsSource : 0 < sSource) (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hUpperSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) sSource (.finite 1) a) ^ ξ) P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Integrable + (fun a : RegCoeffField d => + ‖(section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ ξ) P := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + ξ) P := by + intro i j + exact + (Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_upperLeft_entry_momentRoot_le_two_LambdaMomentAtScale + hP hsSource hξ_one hUpperSourceInt i j).1 + have hBase : + Integrable + (fun a : RegCoeffField d => + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ ξ) P := by + exact + Ch04.RestrictionLawCarrier.upperLeft_matrixNorm_positiveExcess_finsetSup_integrable_abs_pow_of_stationary + hP hparents (n := (0 : ℤ)) (ξ := ξ) + le_rfl hparent_scale hStruct.stationary + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d)) + (section52_upperCenter_entries hP hStruct) + hξ_two hOrigin + have hconst : + Integrable + (fun a : RegCoeffField d => + ‖section52LargeScaleWeight r m n‖ ^ ξ * + ‖(parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0))‖ ^ ξ) P := + hBase.const_mul _ + refine hconst.congr ?_ + filter_upwards with a + rw [← mul_pow, ← norm_mul] + +theorem upperLargeScalePositiveExcess_aemeasurable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + AEMeasurable + (fun a : RegCoeffField d => + section52LargeScaleWeight hP4.sUpper m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) P := by + intro parents hparents + exact aemeasurable_const.mul + (Ch04.RestrictionLawCarrier.aemeasurable_upperLeft_matrixNorm_positiveExcess_finsetSup + hP hparents + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + +theorem upperLargeScalePositiveExcess_aemeasurable_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {r : ℝ} {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + AEMeasurable + (fun a : RegCoeffField d => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) P := by + intro parents hparents + exact aemeasurable_const.mul + (Ch04.RestrictionLawCarrier.aemeasurable_upperLeft_matrixNorm_positiveExcess_finsetSup + hP hparents + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + +theorem upperLargeScalePositiveExcess_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) + (a : RegCoeffField d) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + 0 ≤ + section52LargeScaleWeight hP4.sUpper m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) := by + intro parents hparents + have hweight : 0 ≤ section52LargeScaleWeight hP4.sUpper m n := + section52LargeScaleWeight_nonneg m hP4.sUpper_nonneg n + have hsup : 0 ≤ + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) := by + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) hQ0) + exact mul_nonneg hweight hsup + +theorem upperLargeScalePositiveExcess_nonneg_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {r : ℝ} (hr_nonneg : 0 ≤ r) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) + (a : RegCoeffField d) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + 0 ≤ + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) := by + intro parents hparents + have hweight : 0 ≤ section52LargeScaleWeight r m n := + section52LargeScaleWeight_nonneg m hr_nonneg n + have hsup : 0 ≤ + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) := by + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q0) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) hQ0) + exact mul_nonneg hweight hsup + +theorem upperLargeScalePositiveExcessRoot_le_largeScaleRootCoeff_source + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {sSource r : ℝ} {ξ : ℕ} + (hsSource : 0 < sSource) (hr_nonneg : 0 ≤ r) + (hξ_one : 1 ≤ ξ) (hξ_two : 2 ≤ ξ) + (hUpperSourceInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d 0) sSource (.finite 1) a) ^ ξ) P) + {m : ℕ} {n : ℤ} (hn : n ∈ section52LargeScaleSet m) : + let parents := descendantsAtScale (originCube d (m : ℤ)) n + let hparents : parents.Nonempty := + descendantsAtScale_nonempty (originCube d (m : ℤ)) + (section52LargeScaleSet_mem_le_m hn) + Ch04.annealedMomentRoot P ξ + (fun a => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) ≤ + ((Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ)) * + section52LargeScaleRootCoeff d ξ r m n * + Ch04.LambdaMomentAtScale P 0 sSource ξ := by + classical + intro parents hparents + let : IsProbabilityMeasure P := hP.isProbability + let initial : ℝ := Ch04.LambdaMomentAtScale P 0 sSource ξ + let K : ℝ := 2 * initial + let B : ℝ := parents.sup' hparents + (fun Q => section52UnitDescendantRosenthalBudget Q ξ K) + let parentFactor : ℝ := ((parents.card : ℝ) ^ (1 / (ξ : ℝ))) + let entryFactor : ℝ := (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) + let X : RegCoeffField d → ℝ := + fun a => + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) + have hn_nonneg : 0 ≤ n := section52LargeScaleSet_mem_nonneg hn + have hn_cast : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + have hnm_nat : Int.toNat n ≤ m := by + have hn_le_m : n ≤ (m : ℤ) := section52LargeScaleSet_mem_le_m hn + omega + have hparent_scale : ∀ Q ∈ parents, (0 : ℤ) ≤ Q.scale := by + intro Q hQ + have hscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + rw [hscale] + exact hn_nonneg + have hweight_nonneg : 0 ≤ section52LargeScaleWeight r m n := + section52LargeScaleWeight_nonneg m hr_nonneg n + have hinitial_nonneg : 0 ≤ initial := by + simpa [initial] using + Ch04.LambdaMomentAtScale_nonneg P 0 ξ hsSource + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hparentFactor_nonneg : 0 ≤ parentFactor := by + dsimp [parentFactor] + positivity + have hentryFactor_nonneg : 0 ≤ entryFactor := by + dsimp [entryFactor] + positivity + have hbudget_nonneg : + ∀ Q : TriadicCube d, 0 ≤ section52UnitDescendantRosenthalBudget Q ξ K := + fun Q => section52UnitDescendantRosenthalBudget_nonneg Q ξ hK_nonneg + have hB_nonneg : 0 ≤ B := by + dsimp [B] + rcases hparents with ⟨Q0, hQ0⟩ + exact (hbudget_nonneg Q0).trans + (Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q ξ K) hQ0) + have hOrigin : + ∀ i j : Fin d, + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + ξ) P ∧ + (∫ a, + |Ch04.restrictionCenteredOriginObservable P 0 + (fun U a => (coarseBlockMatrix U a).upperLeft i j) a| ^ + ξ ∂P) ^ + (1 / (ξ : ℝ)) ≤ K := by + intro i j + have h := + Ch04.RestrictionLawCarrier.restrictionCenteredOriginObservable_upperLeft_entry_momentRoot_le_two_LambdaMomentAtScale + hP hsSource hξ_one hUpperSourceInt i j + simpa [K, initial] using h + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + rcases hparents with ⟨Q0, hQ0⟩ + exact (le_max_right _ _).trans + (Finset.le_sup' + (f := fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0) hQ0) + have hfluct : + Ch04.annealedMomentRoot P ξ X ≤ entryFactor * (parentFactor * B) := by + exact + Ch04.RestrictionLawCarrier.upperLeft_matrixNorm_positiveExcess_finsetSup_momentRoot_le_of_restrictionUnitRangeDependentLaw + hP hparents le_rfl hparent_scale hStruct.stationary hStruct.unit_range + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d)) + (section52_upperCenter_entries hP hStruct) + hξ_two hK_nonneg hB_nonneg + (fun i j => (hOrigin i j).1) + (fun i j => (hOrigin i j).2) + (by + intro Q hQ + dsimp [B, section52UnitDescendantRosenthalBudget] + exact Finset.le_sup' + (f := fun Q => section52UnitDescendantRosenthalBudget Q ξ K) hQ) + have hB_le : + B ≤ section52UnitDescendantRosenthalBudget (originCube d n) ξ K := by + dsimp [B] + refine Finset.sup'_le hparents _ ?_ + intro Q hQ + have hQscale : Q.scale = n := scale_eq_of_mem_descendantsAtScale hQ + exact le_of_eq + (section52UnitDescendantRosenthalBudget_eq_originCube_of_scale_eq + Q hn_nonneg hQscale ξ K) + have hweighted : + Ch04.annealedMomentRoot P ξ + (fun a => section52LargeScaleWeight r m n * X a) = + section52LargeScaleWeight r m n * + Ch04.annealedMomentRoot P ξ X := + section52_annealedMomentRoot_const_mul_of_nonneg + hξ_one hweight_nonneg hX_nonneg + have hB_step : + section52LargeScaleWeight r m n * + (entryFactor * (parentFactor * B)) ≤ + section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) := by + have h1 : + parentFactor * B ≤ + parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K := + mul_le_mul_of_nonneg_left hB_le hparentFactor_nonneg + have h2 : + entryFactor * (parentFactor * B) ≤ + entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K) := + mul_le_mul_of_nonneg_left h1 hentryFactor_nonneg + exact mul_le_mul_of_nonneg_left h2 hweight_nonneg + have hcoeff_eq : + section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) = + entryFactor * section52LargeScaleRootCoeff d ξ r m n * initial := by + simp [section52LargeScaleRootCoeff, section52LargeScaleLpRootCoeff, + section52LargeScaleSqrtRootCoeff, section52UnitDescendantRosenthalBudget, + entryFactor, parentFactor, K, initial] + ring + calc + Ch04.annealedMomentRoot P ξ + (fun a => + section52LargeScaleWeight r m n * + parents.sup' hparents + (fun Q => + max + (Ch02.matrixNorm (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft - + Ch02.matrixNorm + (hP.barSigmaAtScale hStruct 0 • + (1 : Mat d))) + 0)) + = Ch04.annealedMomentRoot P ξ + (fun a => section52LargeScaleWeight r m n * X a) := by + rfl + _ = section52LargeScaleWeight r m n * + Ch04.annealedMomentRoot P ξ X := hweighted + _ ≤ section52LargeScaleWeight r m n * + (entryFactor * (parentFactor * B)) := + mul_le_mul_of_nonneg_left hfluct hweight_nonneg + _ ≤ section52LargeScaleWeight r m n * + (entryFactor * + (parentFactor * + section52UnitDescendantRosenthalBudget (originCube d n) ξ K)) := hB_step + _ = entryFactor * section52LargeScaleRootCoeff d ξ r m n * + initial := hcoeff_eq + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarAlgebra.lean new file mode 100644 index 0000000000..0e579c7535 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarAlgebra.lean @@ -0,0 +1,757 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAverageMoments.Theory +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.Scalarization + +/-! # Scalar Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: ScalarAlgebra + +Scalar identities, positive-excess algebra, and product estimates. +-/ + +/-- The `1 <= Theta_n` part of the scalar preliminary lemma, with the +inverse-star positivity proved in Chapter 4. -/ +theorem one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (n : ℤ) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) : + 1 ≤ thetaAtScale hP hStruct n := by + simpa [thetaAtScale, Ch04.Internal.thetaAtScale_eq_scalarization_contrast] using + Ch04.RestrictionLawCarrier.Internal.one_le_scalar_contrast_of_primitive_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) + hBlock + +/-- The `Theta_n <= widetildeTheta_n` part of the scalar preliminary lemma, +using the direct Chapter 4 moment-factor endpoint. -/ +theorem thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + (n : ℕ) : + thetaAtScale hP hStruct (n : ℤ) ≤ + widetildeThetaAtScale P (n : ℤ) hP4 := by + simpa [thetaAtScale, widetildeThetaAtScale] using + hP.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hBlock + (fun l => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + hUpperPowInt hLowerPowInt n + +/-- The upper positive-excess moment is nonnegative. -/ +theorem LambdaPositiveExcessMomentAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + 0 ≤ LambdaPositiveExcessMomentAtScale P m s ξ hP hStruct := by + simpa [LambdaPositiveExcessMomentAtScale] using + Ch04.annealedMomentRoot_nonneg_of_nonneg P ξ + (fun a : RegCoeffField d => + le_max_right + (Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) + +/-- The lower inverse positive-excess moment is nonnegative. -/ +theorem lambdaInvPositiveExcessMomentAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (s : ℝ) (ξ : ℕ) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + 0 ≤ lambdaInvPositiveExcessMomentAtScale P m s ξ hP hStruct := by + simpa [lambdaInvPositiveExcessMomentAtScale] using + Ch04.annealedMomentRoot_nonneg_of_nonneg P ξ + (fun a : RegCoeffField d => + le_max_right + ((Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) + +theorem real_le_base_add_max_sub_base_zero (x base : ℝ) : + x ≤ base + max (x - base) 0 := by + have h : x - base ≤ max (x - base) 0 := le_max_left _ _ + linarith + +theorem max_sub_base_zero_le_of_le_base_add_nonneg + {x base y : ℝ} (hy : 0 ≤ y) (hxy : x ≤ base + y) : + max (x - base) 0 ≤ y := by + have hsub : x - base ≤ y := by linarith + exact max_le hsub hy + +theorem weighted_sum_le_base_add_weighted_positiveExcess + {ι : Type*} {s : Finset ι} {w f : ι → ℝ} {base : ℝ} + (hbase : 0 ≤ base) + (hw_nonneg : ∀ i ∈ s, 0 ≤ w i) + (hw_sum : ∑ i ∈ s, w i ≤ 1) : + (∑ i ∈ s, w i * f i) ≤ + base + ∑ i ∈ s, w i * max (f i - base) 0 := by + have hterm : + ∀ i ∈ s, w i * f i ≤ w i * (base + max (f i - base) 0) := by + intro i hi + exact mul_le_mul_of_nonneg_left + (real_le_base_add_max_sub_base_zero (f i) base) (hw_nonneg i hi) + have hsum_term : + (∑ i ∈ s, w i * f i) ≤ + ∑ i ∈ s, w i * (base + max (f i - base) 0) := + Finset.sum_le_sum hterm + have hweight_base : + base * (∑ i ∈ s, w i) ≤ base := by + calc + base * (∑ i ∈ s, w i) ≤ base * 1 := + mul_le_mul_of_nonneg_left hw_sum hbase + _ = base := by ring + calc + (∑ i ∈ s, w i * f i) + ≤ ∑ i ∈ s, w i * (base + max (f i - base) 0) := hsum_term + _ = ∑ i ∈ s, (w i * base + w i * max (f i - base) 0) := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = base * (∑ i ∈ s, w i) + + ∑ i ∈ s, w i * max (f i - base) 0 := by + rw [Finset.sum_add_distrib] + congr 1 + · rw [← Finset.sum_mul] + ring + _ ≤ base + ∑ i ∈ s, w i * max (f i - base) 0 := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hweight_base + (∑ i ∈ s, w i * max (f i - base) 0) + +theorem max_sup'_sub_base_le_sup'_max_sub_base + {ι : Type*} {s : Finset ι} (hs : s.Nonempty) (f : ι → ℝ) (base : ℝ) : + max (s.sup' hs f - base) 0 ≤ + s.sup' hs (fun i => max (f i - base) 0) := by + have hsup_nonneg : + 0 ≤ s.sup' hs (fun i => max (f i - base) 0) := by + rcases hs with ⟨i0, hi0⟩ + exact (le_max_right (f i0 - base) 0).trans + (Finset.le_sup' (f := fun i => max (f i - base) 0) hi0) + refine max_le ?_ hsup_nonneg + have hle : + s.sup' hs f ≤ base + s.sup' hs (fun i => max (f i - base) 0) := by + refine Finset.sup'_le hs f ?_ + intro i hi + have hi_le : + max (f i - base) 0 ≤ + s.sup' hs (fun i => max (f i - base) 0) := + Finset.le_sup' (f := fun i => max (f i - base) 0) hi + have hfi : f i ≤ base + max (f i - base) 0 := + real_le_base_add_max_sub_base_zero (f i) base + linarith + linarith + +theorem section52_sq_finset_sum_weighted_rpow_half_le_finset_sum_weighted + {ι : Type*} (s : Finset ι) {w H : ι → ℝ} + (hw_nonneg : ∀ i, 0 ≤ w i) + (hH_nonneg : ∀ i, 0 ≤ H i) + (hw_sum : ∑ i ∈ s, w i ≤ 1) : + (∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ)) ^ 2 ≤ + ∑ i ∈ s, w i * H i := by + classical + let sqrtH : ι → ℝ := fun i => Real.rpow (H i) (1 / 2 : ℝ) + let W : ℝ := ∑ i ∈ s, w i + let B : ℝ := ∑ i ∈ s, w i * H i + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Finset.sum_nonneg fun i _hi => hw_nonneg i + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact Finset.sum_nonneg fun i _hi => mul_nonneg (hw_nonneg i) (hH_nonneg i) + have hholder : + ∑ i ∈ s, w i * sqrtH i ≤ + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ := by + simpa [W, sqrtH] using + Real.inner_le_weight_mul_Lp_of_nonneg + (s := s) (p := (2 : ℝ)) (w := w) (f := sqrtH) + (by norm_num : (1 : ℝ) ≤ 2) hw_nonneg + (fun i => Real.rpow_nonneg (hH_nonneg i) _) + have hsquares : + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) = B := by + dsimp [B, sqrtH] + refine Finset.sum_congr rfl ?_ + intro i hi + have hsqrt_sq : Real.rpow (H i) (1 / 2 : ℝ) ^ 2 = H i := + Homogenization.sq_rpow_half_eq_self_of_nonneg (hH_nonneg i) + have hsqrt_sq_rpow : + Real.rpow (H i) (1 / 2 : ℝ) ^ (2 : ℝ) = H i := by + calc + Real.rpow (H i) (1 / 2 : ℝ) ^ (2 : ℝ) = + Real.rpow (H i) (1 / 2 : ℝ) ^ 2 := Real.rpow_natCast _ 2 + _ = H i := hsqrt_sq + exact congrArg (fun x : ℝ => w i * x) hsqrt_sq_rpow + have hW_rpow_le_one : W ^ (1 / 2 : ℝ) ≤ 1 := by + have hpow := Real.rpow_le_rpow hW_nonneg hw_sum (by norm_num : 0 ≤ (1 / 2 : ℝ)) + simpa [W] using hpow + have hright_le_sqrtB : + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ ≤ + Real.rpow B (1 / 2 : ℝ) := by + have hleftExp : 1 - (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + have hrightExp : (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + calc + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ + = W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ) := by + rw [hsquares, hleftExp, hrightExp] + _ ≤ 1 * Real.rpow B (1 / 2 : ℝ) := by + exact mul_le_mul hW_rpow_le_one le_rfl + (Real.rpow_nonneg hB_nonneg _) (by norm_num) + _ = Real.rpow B (1 / 2 : ℝ) := by ring + have hsum_le_sqrtB : + ∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ) ≤ + Real.rpow B (1 / 2 : ℝ) := by + simpa [sqrtH] using hholder.trans hright_le_sqrtB + have hsum_nonneg : + 0 ≤ ∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ) := by + exact Finset.sum_nonneg fun i hi => + mul_nonneg (hw_nonneg i) (Real.rpow_nonneg (hH_nonneg i) _) + have hsq := + pow_le_pow_left₀ hsum_nonneg hsum_le_sqrtB 2 + calc + (∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ)) ^ 2 + ≤ Real.rpow B (1 / 2 : ℝ) ^ 2 := hsq + _ = B := Homogenization.sq_rpow_half_eq_self_of_nonneg hB_nonneg + _ = ∑ i ∈ s, w i * H i := rfl + +theorem section52_sq_finset_sum_weighted_rpow_half_le_weight_sum_mul_finset_sum_weighted + {ι : Type*} (s : Finset ι) {w H : ι → ℝ} + (hw_nonneg : ∀ i, 0 ≤ w i) + (hH_nonneg : ∀ i, 0 ≤ H i) : + (∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ)) ^ 2 ≤ + (∑ i ∈ s, w i) * (∑ i ∈ s, w i * H i) := by + classical + let sqrtH : ι → ℝ := fun i => Real.rpow (H i) (1 / 2 : ℝ) + let W : ℝ := ∑ i ∈ s, w i + let B : ℝ := ∑ i ∈ s, w i * H i + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Finset.sum_nonneg fun i _hi => hw_nonneg i + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact Finset.sum_nonneg fun i _hi => mul_nonneg (hw_nonneg i) (hH_nonneg i) + have hholder : + ∑ i ∈ s, w i * sqrtH i ≤ + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ := by + simpa [W, sqrtH] using + Real.inner_le_weight_mul_Lp_of_nonneg + (s := s) (p := (2 : ℝ)) (w := w) (f := sqrtH) + (by norm_num : (1 : ℝ) ≤ 2) hw_nonneg + (fun i => Real.rpow_nonneg (hH_nonneg i) _) + have hsquares : + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) = B := by + dsimp [B, sqrtH] + refine Finset.sum_congr rfl ?_ + intro i hi + have hsqrt_sq : Real.rpow (H i) (1 / 2 : ℝ) ^ 2 = H i := + Homogenization.sq_rpow_half_eq_self_of_nonneg (hH_nonneg i) + have hsqrt_sq_rpow : + Real.rpow (H i) (1 / 2 : ℝ) ^ (2 : ℝ) = H i := by + calc + Real.rpow (H i) (1 / 2 : ℝ) ^ (2 : ℝ) = + Real.rpow (H i) (1 / 2 : ℝ) ^ 2 := Real.rpow_natCast _ 2 + _ = H i := hsqrt_sq + exact congrArg (fun x : ℝ => w i * x) hsqrt_sq_rpow + have hright_eq : + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ = + W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ) := by + have hleftExp : 1 - (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + have hrightExp : (2 : ℝ)⁻¹ = 1 / 2 := by norm_num + rw [hsquares, hleftExp, hrightExp] + have hsum_nonneg : + 0 ≤ ∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ) := by + exact Finset.sum_nonneg fun i hi => + mul_nonneg (hw_nonneg i) (Real.rpow_nonneg (hH_nonneg i) _) + have hholder2 : + ∑ i ∈ s, w i * sqrtH i ≤ + W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ) := by + calc + ∑ i ∈ s, w i * sqrtH i ≤ + W ^ (1 - (2 : ℝ)⁻¹) * + (∑ i ∈ s, w i * sqrtH i ^ (2 : ℝ)) ^ (2 : ℝ)⁻¹ := hholder + _ = W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ) := hright_eq + have hsq := + pow_le_pow_left₀ hsum_nonneg hholder2 2 + have hsq' : + (∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ)) ^ 2 ≤ + (W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ)) ^ 2 := by + simpa [sqrtH] using hsq + calc + (∑ i ∈ s, w i * Real.rpow (H i) (1 / 2 : ℝ)) ^ 2 + ≤ (W ^ (1 / 2 : ℝ) * B ^ (1 / 2 : ℝ)) ^ 2 := hsq' + _ = W * B := by + have hWsq : (W ^ (1 / 2 : ℝ)) ^ 2 = W := + Homogenization.sq_rpow_half_eq_self_of_nonneg hW_nonneg + have hBsq : (B ^ (1 / 2 : ℝ)) ^ 2 = B := + Homogenization.sq_rpow_half_eq_self_of_nonneg hB_nonneg + rw [mul_pow, hWsq, hBsq] + _ = (∑ i ∈ s, w i) * (∑ i ∈ s, w i * H i) := rfl + +/-- Root decomposition for the upper ellipticity factor: +`||Λ_m||_ξ <= \barσ_0 + ||(Λ_m-\barσ_0)_+||_ξ`. -/ +theorem LambdaMomentAtScale_le_barSigma_zero_add_positiveExcessMomentAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {m : ℤ} {s : ℝ} {ξ : ℕ} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hξ : 1 ≤ ξ) (hs : 0 < s) + (hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0) + (hUpperMeas : + AEMeasurable + (fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a) P) + (hUpperPowInt : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a) ^ ξ) P) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ ξ) P) : + Ch04.LambdaMomentAtScale P m s ξ ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P m s ξ hP hStruct := by + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a + let E : RegCoeffField d → ℝ := + fun a => max (X a - hP.barSigmaAtScale hStruct 0) 0 + have hX_meas : AEMeasurable X P := by + simpa [X] using hUpperMeas + have hX_pow_int : Integrable (fun a => X a ^ ξ) P := by + simpa [X] using hUpperPowInt + have hE_pow_int : Integrable (fun a => E a ^ ξ) P := by + simpa [E, X] using hUpperExcessPowInt + have hE_meas : AEMeasurable E P := by + exact (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hX_abs_int : Integrable (fun a => |X a| ^ ξ) P := by + refine hX_pow_int.congr ?_ + filter_upwards with a + simp [X, abs_of_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1))] + have hE_abs_int : Integrable (fun a => |E a| ^ ξ) P := by + refine hE_pow_int.congr ?_ + filter_upwards with a + simp [E, abs_of_nonneg (le_max_right (X a - hP.barSigmaAtScale hStruct 0) 0)] + simpa [Ch04.LambdaMomentAtScale, LambdaPositiveExcessMomentAtScale, X, E] using + Ch04.annealedMomentRoot_le_const_add_of_nonneg_le + (P := P) (ξ := ξ) (X := X) (E := E) + (A := hP.barSigmaAtScale hStruct 0) + hξ hBarSigma0_nonneg + (fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + (fun a => le_max_right (X a - hP.barSigmaAtScale hStruct 0) 0) + (fun a => real_le_base_add_max_sub_base_zero (X a) (hP.barSigmaAtScale hStruct 0)) + hX_meas hE_meas hX_abs_int hE_abs_int + +/-- Root decomposition for the lower inverse ellipticity factor: +`||λ_m^{-1}||_ξ <= \barσ_{*,0}^{-1} + +||(λ_m^{-1}-\barσ_{*,0}^{-1})_+||_ξ`. -/ +theorem lambdaInvMomentAtScale_le_barSigmaStar_zero_inv_add_positiveExcessMomentAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {m : ℤ} {s : ℝ} {ξ : ℕ} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hξ : 1 ≤ ξ) (hs : 0 < s) + (hBarSigmaStar0_inv_nonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹) + (hLowerMeas : + AEMeasurable + (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹) P) + (hLowerPowInt : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹) ^ ξ) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ ξ) P) : + Ch04.lambdaInvMomentAtScale P m s ξ ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P m s ξ hP hStruct := by + let X : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹ + let E : RegCoeffField d → ℝ := + fun a => max (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0 + have hX_meas : AEMeasurable X P := by + simpa [X] using hLowerMeas + have hX_pow_int : Integrable (fun a => X a ^ ξ) P := by + simpa [X] using hLowerPowInt + have hE_pow_int : Integrable (fun a => E a ^ ξ) P := by + simpa [E, X] using hLowerExcessPowInt + have hE_meas : AEMeasurable E P := by + exact (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hX_abs_int : Integrable (fun a => |X a| ^ ξ) P := by + refine hX_pow_int.congr ?_ + filter_upwards with a + simp [X, abs_of_nonneg + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1)))] + have hE_abs_int : Integrable (fun a => |E a| ^ ξ) P := by + refine hE_pow_int.congr ?_ + filter_upwards with a + simp [E, abs_of_nonneg + (le_max_right (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0)] + simpa [Ch04.lambdaInvMomentAtScale, lambdaInvPositiveExcessMomentAtScale, X, E] using + Ch04.annealedMomentRoot_le_const_add_of_nonneg_le + (P := P) (ξ := ξ) (X := X) (E := E) + (A := (hP.barSigmaStarAtScale hStruct 0)⁻¹) + hξ hBarSigmaStar0_inv_nonneg + (fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1))) + (fun a => le_max_right (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0) + (fun a => real_le_base_add_max_sub_base_zero (X a) + ((hP.barSigmaStarAtScale hStruct 0)⁻¹)) + hX_meas hE_meas hX_abs_int hE_abs_int + +/-- Product assembly for the "in particular" estimate in the multiscale +ellipticity moment lemma. + +Once the two component positive-excess estimates are known, this theorem is +the Ch5 algebra turning them into a bound for `widetildeTheta_m`. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) + (hUpper : + Ch04.LambdaMomentAtScale P m hP4.sUpper hP4.xi ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct) + (hLower : + Ch04.lambdaInvMomentAtScale P m hP4.sLower hP4.xi ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct) + (hUpper0 : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLower0 : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0) : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct := by + let Lm := Ch04.LambdaMomentAtScale P m hP4.sUpper hP4.xi + let lm := Ch04.lambdaInvMomentAtScale P m hP4.sLower hP4.xi + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let b0 := hP.barSigmaAtScale hStruct 0 + let s0 := (hP.barSigmaStarAtScale hStruct 0)⁻¹ + let UE := LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct + let LE := lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct + have hLm_nonneg : 0 ≤ Lm := by + simpa [Lm] using + Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos + have hlm_nonneg : 0 ≤ lm := by + simpa [lm] using + Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos + have hUE_nonneg : 0 ≤ UE := by + simpa [UE] using + LambdaPositiveExcessMomentAtScale_nonneg hP4.sUpper hP4.xi hP hStruct m + have hLE_nonneg : 0 ≤ LE := by + simpa [LE] using + lambdaInvPositiveExcessMomentAtScale_nonneg hP4.sLower hP4.xi hP hStruct m + have hUpper' : Lm ≤ b0 + UE := by + simpa [Lm, b0, UE] using hUpper + have hLower' : lm ≤ s0 + LE := by + simpa [lm, s0, LE] using hLower + have hUpper0' : b0 ≤ L0 := by + simpa [b0, L0] using hUpper0 + have hLower0' : s0 ≤ l0 := by + simpa [s0, l0] using hLower0 + have hUpperRhs_nonneg : 0 ≤ b0 + UE := by + exact add_nonneg (by simpa [b0] using hBarSigma0_nonneg) hUE_nonneg + have hProd : Lm * lm ≤ (b0 + UE) * (s0 + LE) := + mul_le_mul hUpper' hLower' hlm_nonneg hUpperRhs_nonneg + have hUEs0 : UE * s0 ≤ UE * l0 := + mul_le_mul_of_nonneg_left hLower0' hUE_nonneg + have hLEb0 : LE * b0 ≤ LE * L0 := + mul_le_mul_of_nonneg_left hUpper0' hLE_nonneg + have hExpand : + (b0 + UE) * (s0 + LE) ≤ b0 * s0 + UE * l0 + LE * L0 + UE * LE := by + calc + (b0 + UE) * (s0 + LE) = b0 * s0 + UE * s0 + LE * b0 + UE * LE := by ring + _ ≤ b0 * s0 + UE * l0 + LE * L0 + UE * LE := + add_le_add (add_le_add (add_le_add le_rfl hUEs0) hLEb0) le_rfl + calc + widetildeThetaAtScale P m hP4 = Lm * lm := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, Lm, lm] + _ ≤ (b0 + UE) * (s0 + LE) := hProd + _ ≤ b0 * s0 + UE * l0 + LE * L0 + UE * LE := hExpand + _ = + thetaAtScale hP hStruct 0 + + UE * l0 + LE * L0 + UE * LE := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, s0] + _ = + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct := by + simp [UE, LE, L0, l0] + +/-- Product assembly with the two positive-excess roots already bounded by +unit-scale moment roots. This is the final algebraic step in the Section 5.2 +moment lemma. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) + {coeffUpper coeffLower finalCoeff : ℝ} + (hUpper : + Ch04.LambdaMomentAtScale P m hP4.sUpper hP4.xi ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct) + (hLower : + Ch04.lambdaInvMomentAtScale P m hP4.sLower hP4.xi ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct) + (hUpper0 : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLower0 : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0) + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (_hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let UE := LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct + let LE := lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct + have hL0_nonneg : 0 ≤ L0 := by + simpa [L0] using Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hl0_nonneg : 0 ≤ l0 := by + simpa [l0] using Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUE_nonneg : 0 ≤ UE := by + simpa [UE] using + LambdaPositiveExcessMomentAtScale_nonneg hP4.sUpper hP4.xi hP hStruct m + have hLE_nonneg : 0 ≤ LE := by + simpa [LE] using + lambdaInvPositiveExcessMomentAtScale_nonneg hP4.sLower hP4.xi hP hStruct m + have hBase_nonneg : 0 ≤ L0 * l0 := mul_nonneg hL0_nonneg hl0_nonneg + have hProduct : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := by + simpa [UE, LE, L0, l0] using + widetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products + hP hStruct hP4 m hUpper hLower hUpper0 hLower0 hBarSigma0_nonneg + have hUE_le : UE ≤ coeffUpper * L0 := by + simpa [UE, L0] using hUpperExcess + have hLE_le : LE ≤ coeffLower * l0 := by + simpa [LE, l0] using hLowerExcess + have hTermUpper : UE * l0 ≤ coeffUpper * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hUE_le hl0_nonneg + calc + UE * l0 ≤ (coeffUpper * L0) * l0 := h + _ = coeffUpper * (L0 * l0) := by ring + have hTermLower : LE * L0 ≤ coeffLower * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hLE_le hL0_nonneg + calc + LE * L0 ≤ (coeffLower * l0) * L0 := h + _ = coeffLower * (L0 * l0) := by ring + have hTermMixed : UE * LE ≤ coeffUpper * coeffLower * (L0 * l0) := by + have hUpperRhs_nonneg : 0 ≤ coeffUpper * L0 := + mul_nonneg hCoeffUpper_nonneg hL0_nonneg + have h := mul_le_mul hUE_le hLE_le hLE_nonneg hUpperRhs_nonneg + calc + UE * LE ≤ (coeffUpper * L0) * (coeffLower * l0) := h + _ = coeffUpper * coeffLower * (L0 * l0) := by ring + have hError : + UE * l0 + LE * L0 + UE * LE ≤ + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by + calc + UE * l0 + LE * L0 + UE * LE + ≤ + coeffUpper * (L0 * l0) + coeffLower * (L0 * l0) + + coeffUpper * coeffLower * (L0 * l0) := + add_le_add (add_le_add hTermUpper hTermLower) hTermMixed + _ = (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by ring + have hCoeffError : + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) ≤ + finalCoeff * (L0 * l0) := + mul_le_mul_of_nonneg_right hCoeff hBase_nonneg + calc + widetildeThetaAtScale P m hP4 + ≤ thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := hProduct + _ = thetaAtScale hP hStruct 0 + (UE * l0 + LE * L0 + UE * LE) := by ring + _ ≤ thetaAtScale hP hStruct 0 + + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := + add_le_add_right hError _ + _ ≤ thetaAtScale hP hStruct 0 + finalCoeff * (L0 * l0) := + add_le_add_right hCoeffError _ + _ = thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + +/-- Final product algebra from an already assembled positive-excess product +bound. This is useful when the scalar root decomposition has already been +proved upstream. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_positiveExcess_product_bound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) + {coeffUpper coeffLower finalCoeff : ℝ} + (hProduct : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct) + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (_hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let UE := LambdaPositiveExcessMomentAtScale P m hP4.sUpper hP4.xi hP hStruct + let LE := lambdaInvPositiveExcessMomentAtScale P m hP4.sLower hP4.xi hP hStruct + have hL0_nonneg : 0 ≤ L0 := by + simpa [L0] using Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hl0_nonneg : 0 ≤ l0 := by + simpa [l0] using Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUE_nonneg : 0 ≤ UE := by + simpa [UE] using + LambdaPositiveExcessMomentAtScale_nonneg hP4.sUpper hP4.xi hP hStruct m + have hLE_nonneg : 0 ≤ LE := by + simpa [LE] using + lambdaInvPositiveExcessMomentAtScale_nonneg hP4.sLower hP4.xi hP hStruct m + have hBase_nonneg : 0 ≤ L0 * l0 := mul_nonneg hL0_nonneg hl0_nonneg + have hProduct' : + widetildeThetaAtScale P m hP4 ≤ + thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := by + simpa [UE, LE, L0, l0] using hProduct + have hUE_le : UE ≤ coeffUpper * L0 := by + simpa [UE, L0] using hUpperExcess + have hLE_le : LE ≤ coeffLower * l0 := by + simpa [LE, l0] using hLowerExcess + have hTermUpper : UE * l0 ≤ coeffUpper * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hUE_le hl0_nonneg + calc + UE * l0 ≤ (coeffUpper * L0) * l0 := h + _ = coeffUpper * (L0 * l0) := by ring + have hTermLower : LE * L0 ≤ coeffLower * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hLE_le hL0_nonneg + calc + LE * L0 ≤ (coeffLower * l0) * L0 := h + _ = coeffLower * (L0 * l0) := by ring + have hTermMixed : UE * LE ≤ coeffUpper * coeffLower * (L0 * l0) := by + have hUpperRhs_nonneg : 0 ≤ coeffUpper * L0 := + mul_nonneg hCoeffUpper_nonneg hL0_nonneg + have h := mul_le_mul hUE_le hLE_le hLE_nonneg hUpperRhs_nonneg + calc + UE * LE ≤ (coeffUpper * L0) * (coeffLower * l0) := h + _ = coeffUpper * coeffLower * (L0 * l0) := by ring + have hError : + UE * l0 + LE * L0 + UE * LE ≤ + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by + calc + UE * l0 + LE * L0 + UE * LE + ≤ + coeffUpper * (L0 * l0) + coeffLower * (L0 * l0) + + coeffUpper * coeffLower * (L0 * l0) := + add_le_add (add_le_add hTermUpper hTermLower) hTermMixed + _ = (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by ring + have hCoeffError : + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) ≤ + finalCoeff * (L0 * l0) := + mul_le_mul_of_nonneg_right hCoeff hBase_nonneg + calc + widetildeThetaAtScale P m hP4 + ≤ thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := hProduct' + _ = thetaAtScale hP hStruct 0 + (UE * l0 + LE * L0 + UE * LE) := by ring + _ ≤ thetaAtScale hP hStruct 0 + + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by + exact add_le_add_right hError _ + _ ≤ thetaAtScale hP hStruct 0 + finalCoeff * (L0 * l0) := by + exact add_le_add_right hCoeffError _ + _ = thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarPreliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarPreliminaries.lean new file mode 100644 index 0000000000..6aa79c49f1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/ScalarPreliminaries.lean @@ -0,0 +1,339 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability + +/-! # Scalar Preliminaries -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: ScalarPreliminaries + +Scalar monotonicity, response identities, and tau nonnegativity. +-/ + +/-- Scalar contrast monotonicity in Ch5 notation. The only inputs are the +note-level integrability facts used to take expectations. -/ +theorem thetaAtScale_mono_of_integrable_diagonalBlockNorms + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hParentBInt : + Integrable (fun a : RegCoeffField d => coarseBBlockNorm (originCube d m) a) P) + (hParentStarInt : + Integrable + (fun a : RegCoeffField d => coarseSigmaStarInvBlockNorm (originCube d m) a) P) + (hDescBInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (fun a : RegCoeffField d => coarseBBlockNorm R a) P) + (hDescStarInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (fun a : RegCoeffField d => coarseSigmaStarInvBlockNorm R a) P) + (hChildBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) : + thetaAtScale hP hStruct m ≤ + thetaAtScale hP hStruct n := by + have hParentInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_diagonalBlockNorms + (originCube d m) hParentBInt hParentStarInt + have hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_diagonalBlockNorms + R (hDescBInt R hR) (hDescStarInt R hR) + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let hPrim_m := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct m + let hPrim_n := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n + have hStar_m_nonneg : 0 ≤ hPrim_m.barSigmaStarInv := + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim_m hParentInt).le + have hB_n_nonneg : 0 ≤ hPrim_n.barB := + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim_n hChildBlockInt + simpa [thetaAtScale, scalarization, hPrim_m, hPrim_n, + Ch04.Internal.thetaAtScale_eq_scalarization_contrast] using + Ch04.RestrictionLawCarrier.Internal.scalar_contrast_le_of_primitive_of_integrable_coarseFullBlockMatrixAtCube hP + hStruct.stationary hn_nonneg hnm scalarization hPrim_m hPrim_n + hParentInt hDescInt hStar_m_nonneg hB_n_nonneg + +/-- Scalar contrast monotonicity in Ch5 notation, with full coarse-block +integrability as the only analytic input. -/ +theorem thetaAtScale_mono_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hParentBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P) + (hChildBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) + (hDescBlockInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P) : + thetaAtScale hP hStruct m ≤ + thetaAtScale hP hStruct n := by + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let hPrim_m := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct m + let hPrim_n := Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n + have hStar_m_nonneg : 0 ≤ hPrim_m.barSigmaStarInv := + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim_m hParentBlockInt).le + have hB_n_nonneg : 0 ≤ hPrim_n.barB := + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + hPrim_n hChildBlockInt + simpa [thetaAtScale, scalarization, hPrim_m, hPrim_n, + Ch04.Internal.thetaAtScale_eq_scalarization_contrast] using + Ch04.RestrictionLawCarrier.Internal.scalar_contrast_le_of_primitive_of_integrable_coarseFullBlockMatrixAtCube hP + hStruct.stationary hn_nonneg hnm scalarization hPrim_m hPrim_n + hParentBlockInt hDescBlockInt hStar_m_nonneg hB_n_nonneg + +theorem tauAtScale_nonneg_of_integrable_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k n : ℤ} (hk_nonneg : 0 ≤ k) (hkn : k ≤ n) + (p q : Vec d) + (hParentInt : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d n) p q) P) + (hDescInt : + ∀ R, R ∈ descendantsAtScale (originCube d n) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + 0 ≤ tauAtScale P n k p q := by + have hle : + Ch04.annealedResponseJAtScale P n p q ≤ + Ch04.annealedResponseJAtScale P k p q := + hP.annealedResponseJAtScale_le hstat hk_nonneg hkn p q hParentInt hDescInt + dsimp [tauAtScale] + linarith + +/-- Nonnegativity of the annealed additivity defect, with response +integrability derived from full coarse-block integrability. -/ +theorem tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k n : ℤ} (hk_nonneg : 0 ≤ k) (hkn : k ≤ n) + (p q : Vec d) + (hParentBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) + (hDescBlockInt : + ∀ R, R ∈ descendantsAtScale (originCube d n) k → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P) : + 0 ≤ tauAtScale P n k p q := by + exact tauAtScale_nonneg_of_integrable_restrictionResponseJObservableCubeSet hP hstat + hk_nonneg hkn p q + (hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d n) p q hParentBlockInt) + (fun R hR => + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + R p q (hDescBlockInt R hR)) + +private theorem annealedResponseJAtScale_eq_expectedJScalarFormula_of_primitive + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) {n : ℤ} + (primitive : Ch04.Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (p q : Vec d) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) : + Ch04.annealedResponseJAtScale P n p q = + expectedJScalarFormula hP hStruct n p q := by + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + have hLowerLeftZero : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft = 0 := by + have h := primitive.sigmaStarInvKappaMean_eq_zero + simpa [Ch04.annealedSigmaStarInvKappaMeanAtScale, + Ch04.annealedSigmaStarInvKappaMean] using congrArg Neg.neg h + have hStar : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerRight = + primitive.barSigmaStarInv • (1 : Mat d) := by + simpa [Ch04.annealedSigmaStarInvAtScale, Ch04.annealedSigmaStarInv] using + primitive.sigmaStarInv_eq + have hB : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).upperLeft = + primitive.barB • (1 : Mat d) := by + simpa [Ch04.annealedBAtScale, Ch04.annealedB] using primitive.b_eq + have hOneQ : matVecMul (1 : Mat d) q = q := by + change (1 : Matrix (Fin d) (Fin d) ℝ).mulVec q = q + exact Matrix.one_mulVec q + have hOneP : matVecMul (1 : Mat d) p = p := by + change (1 : Matrix (Fin d) (Fin d) ℝ).mulVec p = p + exact Matrix.one_mulVec p + have hZeroP : matVecMul (0 : Mat d) p = 0 := by + funext i + simp [matVecMul] + have hSource := + hP.integral_restrictionResponseJObservableCubeSet_eq_quadratic_annealedBlockMatrix + (originCube d n) p q hBlock + calc + Ch04.annealedResponseJAtScale P n p q = + ∫ a, Ch04.restrictionResponseJObservableCubeSet (originCube d n) p q a ∂P := rfl + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).upperLeft p) := + hSource + _ = expectedJScalarFormula hP hStruct n p q := by + rw [hLowerLeftZero, hStar, hB] + simp [expectedJScalarFormula, + Ch04.RestrictionLawCarrier.barSigmaAtScale, Ch04.RestrictionLawCarrier.barSigmaStarAtScale, + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigma_eq_barB scalarization primitive, + Ch04.Internal.AnnealedPrimitiveScalarizationData.barSigmaStar_eq_inv_barSigmaStarInv + scalarization primitive, + smul_matVecMul, hOneQ, hOneP, hZeroP, vecDot_smul_right, vecDot_zero_right] + +private theorem tauAtScale_eq_tauScalarFormula_of_primitive + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) {n k : ℤ} + (primitive_n : Ch04.Internal.AnnealedPrimitiveScalarizationData (d := d) P n) + (primitive_k : Ch04.Internal.AnnealedPrimitiveScalarizationData (d := d) P k) + (p q : Vec d) + (hBlock_n : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) + (hBlock_k : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d k)) P) : + tauAtScale P n k p q = + tauScalarFormula hP hStruct n k p q := by + calc + tauAtScale P n k p q = + Ch04.annealedResponseJAtScale P k p q - + Ch04.annealedResponseJAtScale P n p q := rfl + _ = + expectedJScalarFormula hP hStruct k p q - + expectedJScalarFormula hP hStruct n p q := by + rw [annealedResponseJAtScale_eq_expectedJScalarFormula_of_primitive + hP hStruct primitive_k p q hBlock_k, + annealedResponseJAtScale_eq_expectedJScalarFormula_of_primitive + hP hStruct primitive_n p q hBlock_n] + _ = tauScalarFormula hP hStruct n k p q := by + simp [expectedJScalarFormula, tauScalarFormula, vecDot_smul_right] + ring_nf + +/-- Note-facing scalar response formula under the Chapter 4 law and structural +assumptions. -/ +theorem annealedResponseJAtScale_eq_expectedJScalarFormula + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (n : ℤ) (p q : Vec d) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) : + Ch04.annealedResponseJAtScale P n p q = + expectedJScalarFormula hP hStruct n p q := + annealedResponseJAtScale_eq_expectedJScalarFormula_of_primitive hP + hStruct + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) p q hBlock + +/-- Note-facing scalar formula for `τ_{n,k}`. -/ +theorem tauAtScale_eq_tauScalarFormula + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (n k : ℤ) (p q : Vec d) + (hBlock_n : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) + (hBlock_k : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d k)) P) : + tauAtScale P n k p q = + tauScalarFormula hP hStruct n k p q := + tauAtScale_eq_tauScalarFormula_of_primitive hP + hStruct + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n) + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct k) + p q hBlock_n hBlock_k + +/-- Manuscript Lemma `l.scalar.preliminaries.homogenization.scale`. + +All integrability needed for scalar monotonicity, response identities, and +moment-factor comparison is derived internally from the law carrier, structural +law, and `(P4)` hypotheses. -/ +theorem scalarPreliminaries_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (n m k : ℕ) (hnm : n ≤ m) (hkn : k ≤ n) (p q : Vec d) : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) ∧ + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (n : ℤ) ∧ + thetaAtScale hP hStruct (n : ℤ) ≤ + widetildeThetaAtScale P (n : ℤ) hP4 ∧ + Ch04.annealedResponseJAtScale P (n : ℤ) p q = + expectedJScalarFormula hP hStruct (n : ℤ) p q ∧ + tauAtScale P (n : ℤ) (k : ℤ) p q = + tauScalarFormula hP hStruct (n : ℤ) (k : ℤ) p q ∧ + 0 ≤ tauAtScale P (n : ℤ) (k : ℤ) p q := by + have hn_nonneg : 0 ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hk_nonneg : 0 ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hnm_int : (n : ℤ) ≤ (m : ℤ) := by exact_mod_cast hnm + have hkn_int : (k : ℤ) ≤ (n : ℤ) := by exact_mod_cast hkn + have hOriginBlockInt : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P := + fun l => originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l + have hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P := + fun l => upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P := + fun l => lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hDescBlockInt_mn : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (n : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary hn_nonneg hnm_int hR (hOriginBlockInt n) + have hDescBlockInt_nk : + ∀ R, R ∈ descendantsAtScale (originCube d (n : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary hk_nonneg hkn_int hR (hOriginBlockInt k) + constructor + · exact + one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) (hOriginBlockInt m) + constructor + · exact + thetaAtScale_mono_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct hn_nonneg hnm_int + (hOriginBlockInt m) (hOriginBlockInt n) hDescBlockInt_mn + constructor + · exact + thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hP hStruct hP4 hOriginBlockInt hUpperPowInt hLowerPowInt n + constructor + · exact + annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (n : ℤ) p q (hOriginBlockInt n) + constructor + · exact + tauAtScale_eq_tauScalarFormula + hP hStruct (n : ℤ) (k : ℤ) p q (hOriginBlockInt n) (hOriginBlockInt k) + · exact + tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct.stationary hk_nonneg hkn_int p q + (hOriginBlockInt n) hDescBlockInt_nk + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Weights.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Weights.lean new file mode 100644 index 0000000000..de2d9fcb93 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/Weights.lean @@ -0,0 +1,215 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarAlgebra + +/-! # Weights -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: Weights + +Large-scale weights and finite/tail decompositions. +-/ + +/-- +The large scales appearing after the Section 5.2 Jensen split. + +For a cube `cu_m`, a `q = 1` series index `l < m` corresponds to the absolute +scale `m - l`, hence to one of the manuscript large scales `1, ..., m`. +-/ +def section52LargeScaleSet (m : ℕ) : Finset ℤ := + (Finset.range m).image fun l : ℕ => (m : ℤ) - (l : ℤ) + +/-- The `q = 1` geometric weight transported from series depth to absolute scale. -/ +noncomputable def section52LargeScaleWeight (s : ℝ) (m : ℕ) (n : ℤ) : ℝ := + geometricWeight s 1 (Int.toNat ((m : ℤ) - n)) + +theorem section52LargeScaleSet_mem_nonneg {m : ℕ} {n : ℤ} + (hn : n ∈ section52LargeScaleSet m) : + 0 ≤ n := by + rcases Finset.mem_image.mp hn with ⟨l, hl, rfl⟩ + have hl_le : l ≤ m := Nat.le_of_lt (Finset.mem_range.mp hl) + omega + +theorem section52LargeScaleSet_mem_pos {m : ℕ} {n : ℤ} + (hn : n ∈ section52LargeScaleSet m) : + 1 ≤ n := by + rcases Finset.mem_image.mp hn with ⟨l, hl, rfl⟩ + have hl_lt : l < m := Finset.mem_range.mp hl + omega + +theorem section52LargeScaleSet_mem_le_m {m : ℕ} {n : ℤ} + (hn : n ∈ section52LargeScaleSet m) : + n ≤ (m : ℤ) := by + rcases Finset.mem_image.mp hn with ⟨l, _hl, rfl⟩ + omega + +theorem section52LargeScaleWeight_nonneg {s : ℝ} (m : ℕ) + (hs : 0 ≤ s) (n : ℤ) : + 0 ≤ section52LargeScaleWeight s m n := by + exact geometricWeight_nonneg _ (by simpa using hs) + +theorem section52LargeScaleSet_injOn (m : ℕ) : + Set.InjOn (fun l : ℕ => (m : ℤ) - (l : ℤ)) (↑(Finset.range m) : Set ℕ) := by + intro l _hl k _hk h + have hcast : (l : ℤ) = (k : ℤ) := by linarith + exact Int.ofNat.inj hcast + +theorem section52LargeScaleWeight_sum_eq_prefix_sum (s : ℝ) (m : ℕ) : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) = + ∑ l ∈ Finset.range m, geometricWeight s 1 l := by + classical + change (section52LargeScaleSet m).sum (section52LargeScaleWeight s m) = + ∑ l ∈ Finset.range m, geometricWeight s 1 l + unfold section52LargeScaleSet + rw [Finset.sum_image] + · refine Finset.sum_congr rfl ?_ + intro l _hl + have htoNat : Int.toNat ((m : ℤ) - ((m : ℤ) - (l : ℤ))) = l := by + have hdiff : (m : ℤ) - ((m : ℤ) - (l : ℤ)) = (l : ℤ) := by ring + simp [hdiff] + rw [section52LargeScaleWeight, htoNat] + · exact section52LargeScaleSet_injOn m + +theorem section52LargeScaleWeight_sum_le_one {s : ℝ} (hs : 0 < s) (m : ℕ) : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) ≤ 1 := by + rw [section52LargeScaleWeight_sum_eq_prefix_sum] + calc + (∑ l ∈ Finset.range m, geometricWeight s 1 l) ≤ + ∑' l : ℕ, geometricWeight s 1 l := + (summable_geometricWeight_one hs).sum_le_tsum (Finset.range m) + (fun l _hl => geometricWeight_nonneg l (by simpa using hs.le)) + _ = 1 := tsum_geometricWeight_one_eq_one hs + +/-- Reindex a finite `q = 1` depth-prefix sum as a sum over large absolute scales. -/ +theorem section52LargeScaleSet_weighted_sum_eq_prefix_sum + (s : ℝ) (m : ℕ) (F : ℤ → ℝ) : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n) = + ∑ l ∈ Finset.range m, + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) := by + classical + unfold section52LargeScaleSet + rw [Finset.sum_image] + · refine Finset.sum_congr rfl ?_ + intro l _hl + simp [section52LargeScaleWeight] + · exact section52LargeScaleSet_injOn m + +/-- +Exact large/small split of a `q = 1` depth-indexed weighted series. + +The first term is the finite manuscript large-scale sum over absolute scales +`1, ..., m`; the second term is the small-scale tail beginning at series depth +`m`. +-/ +theorem section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + (s : ℝ) (m : ℕ) (F : ℤ → ℝ) + (hsum : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)))) : + (∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) = + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n) + + ∑' l : ℕ, + geometricWeight s 1 (l + m) * + F ((m : ℤ) - ((l + m : ℕ) : ℤ)) := by + let f : ℕ → ℝ := fun l => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ)) + have hsplit : + (∑ l ∈ Finset.range m, f l) + ∑' l : ℕ, f (l + m) = + ∑' l : ℕ, f l := by + simpa [f] using hsum.sum_add_tsum_nat_add m + calc + (∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) = + (∑ l ∈ Finset.range m, + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) + + ∑' l : ℕ, + geometricWeight s 1 (l + m) * + F ((m : ℤ) - ((l + m : ℕ) : ℤ)) := by + simpa [f] using hsplit.symm + _ = + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n * F n) + + ∑' l : ℕ, + geometricWeight s 1 (l + m) * + F ((m : ℤ) - ((l + m : ℕ) : ℤ)) := by + congr 1 + exact (section52LargeScaleSet_weighted_sum_eq_prefix_sum s m F).symm + +noncomputable def section52SmallTailWeight (s : ℝ) (m : ℕ) : ℝ := + ∑' j : ℕ, geometricWeight s 1 (j + m) + +theorem section52SmallTailWeight_nonneg {s : ℝ} (hs : 0 ≤ s) (m : ℕ) : + 0 ≤ section52SmallTailWeight s m := by + unfold section52SmallTailWeight + exact tsum_nonneg fun j => geometricWeight_nonneg (j + m) (by simpa using hs) + +theorem section52LargeScaleWeight_sum_add_smallTailWeight_eq_one + {s : ℝ} (hs : 0 < s) (m : ℕ) : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) + + section52SmallTailWeight s m = 1 := by + let F : ℤ → ℝ := fun _ => 1 + have hsum : + Summable (fun l : ℕ => + geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) := by + simpa [F] using summable_geometricWeight_one hs + have hsplit := + section52_tsum_weighted_scale_function_eq_largeScaleSet_sum_add_tail + s m F hsum + have hleft : + (∑' l : ℕ, geometricWeight s 1 l * F ((m : ℤ) - (l : ℤ))) = 1 := by + simpa [F] using tsum_geometricWeight_one_eq_one hs + have htail : + (∑' l : ℕ, + geometricWeight s 1 (l + m) * + F ((m : ℤ) - ((l + m : ℕ) : ℤ))) = + section52SmallTailWeight s m := by + simp [section52SmallTailWeight, F] + have h := hsplit + rw [hleft, htail] at h + simpa [F] using h.symm + +theorem section52SmallTailWeight_pos {s : ℝ} (hs : 0 < s) (m : ℕ) : + 0 < section52SmallTailWeight s m := by + have hsum_total := section52LargeScaleWeight_sum_add_smallTailWeight_eq_one hs m + have hprefix_succ_le_one : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ 1 := + calc + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) ≤ + ∑' l : ℕ, geometricWeight s 1 l := + (summable_geometricWeight_one hs).sum_le_tsum (Finset.range (m + 1)) + (fun l _hl => geometricWeight_nonneg l (by simpa using hs.le)) + _ = 1 := tsum_geometricWeight_one_eq_one hs + have hlast_pos : 0 < geometricWeight s 1 m := + geometricWeight_pos m (by simpa using hs) + have hprefix_succ_eq : + (∑ l ∈ Finset.range (m + 1), geometricWeight s 1 l) = + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) + + geometricWeight s 1 m := by + rw [Finset.sum_range_succ] + rw [← section52LargeScaleWeight_sum_eq_prefix_sum] + have hW_lt_one : + (∑ n ∈ section52LargeScaleSet m, section52LargeScaleWeight s m n) < 1 := by + linarith + linarith + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/WidetildeTheta.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/WidetildeTheta.lean new file mode 100644 index 0000000000..fca9d43668 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section52/WidetildeTheta.lean @@ -0,0 +1,311 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients + +/-! # Widetilde Theta -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section52 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section +/-! +# Section 5.2 internals: WidetildeTheta + +Widetilde-theta product consequences. +-/ + +/-- Product assembly for the Section 5.2 moment lemma, with the scalar +Minkowski decomposition and the unit-scale base comparisons proved from the +Chapter 4 law-facing surfaces. + +The remaining analytic inputs are exactly the two positive-excess power +integrability facts; the quantitative bounds on those positive-excess roots are +the genuine partition-average fluctuation step. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products_of_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + (m : ℕ) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) hP4.sUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) hP4.sLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) : + widetildeThetaAtScale P (m : ℤ) hP4 ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi + hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi + hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi + hP hStruct * + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi + hP hStruct := by + let : IsProbabilityMeasure P := hP.isProbability + have hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0 := by + rw [hP.barSigmaAtScale_eq_barBAtScale hStruct (0 : ℤ)] + simpa [Ch04.RestrictionLawCarrier.barBAtScale] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + (hBlock 0) + have hBarSigmaStar0_inv_nonneg : + 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (0 : ℤ) + rw [hstar, inv_inv] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + (hBlock 0)).le + have hUpper0 : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + exact + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hBlock + (fun l => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + hUpperPowInt hLowerPowInt 0 + have hLower0 : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + exact + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hBlock + (fun l => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + hUpperPowInt hLowerPowInt 0 + have hUpper : + Ch04.LambdaMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi hP hStruct := + LambdaMomentAtScale_le_barSigma_zero_add_positiveExcessMomentAtScale + hP hStruct (Nat.succ_le_of_lt hP4.xi_pos) hP4.sUpper_pos + hBarSigma0_nonneg + (hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (m : ℤ)) hP4.sUpper_pos) + (hUpperPowInt m) hUpperExcessPowInt + have hLower : + Ch04.lambdaInvMomentAtScale P (m : ℤ) hP4.sLower hP4.xi ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi + hP hStruct := + lambdaInvMomentAtScale_le_barSigmaStar_zero_inv_add_positiveExcessMomentAtScale + hP hStruct (Nat.succ_le_of_lt hP4.xi_pos) hP4.sLower_pos + hBarSigmaStar0_inv_nonneg + (hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (m : ℤ)) hP4.sLower_pos) + (hLowerPowInt m) hLowerExcessPowInt + simpa using + widetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products + hP hStruct hP4 (m : ℤ) hUpper hLower hUpper0 hLower0 hBarSigma0_nonneg + +/-- The `widetildeTheta` consequence of the Section 5.2 moment lemma from +quantitative positive-excess estimates, with all scalar root decomposition and +unit-scale factor comparisons discharged from the Chapter 4 surfaces. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_integrable_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + (m : ℕ) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) hP4.sUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) hP4.sLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) + {coeffUpper coeffLower finalCoeff : ℝ} + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi + hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi + hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + widetildeThetaAtScale P (m : ℤ) hP4 ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + let scalarization := Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + have hProduct : + widetildeThetaAtScale P (m : ℤ) hP4 ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi hP hStruct := by + simpa using + widetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products_of_integrable + hP hStruct hP4 hBlock hUpperPowInt hLowerPowInt + m hUpperExcessPowInt hLowerExcessPowInt + have h := + widetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_positiveExcess_product_bound + hP hStruct hP4 (m : ℤ) hProduct hCoeffUpper_nonneg hCoeffLower_nonneg + hUpperExcess hLowerExcess + hCoeff + simpa using h + +/-- The displayed Section 5.2 `widetildeTheta` estimate from the two +positive-excess estimates with their manuscript coefficients. The probabilistic +content is exactly the two positive-excess bounds supplied as hypotheses. -/ +theorem widetildeThetaAtScale_le_thetaAtScale_zero_add_section52_error_of_integrable_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + (m : ℕ) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) hP4.sUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) hP4.sLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) + {CUpper CLower CTheta : ℝ} + (hCUpper_nonneg : 0 ≤ CUpper) + (hCLower_nonneg : 0 ≤ CLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P (m : ℤ) hP4.sUpper hP4.xi + hP hStruct ≤ + section52MomentBoundCoeff d hP4.xi CUpper hP4.sUpper m * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) hP4.sLower hP4.xi + hP hStruct ≤ + section52MomentBoundCoeff d hP4.xi CLower hP4.sLower m * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCTheta : + CUpper / (((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sUpper) + + CLower / (((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sLower) + + (CUpper / (((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sUpper)) * + (CLower / (((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - hP4.sLower)) ≤ + CTheta) : + widetildeThetaAtScale P (m : ℤ) hP4 ≤ + thetaAtScale hP hStruct 0 + + section52WidetildeThetaErrorCoeff d hP4.xi CTheta + (min hP4.sUpper hP4.sLower) m * + widetildeThetaAtScale P 0 hP4 := by + have hUpperDenom := hP4.upperMomentDenom_pos + have hLowerDenom := hP4.lowerMomentDenom_pos + have hCoeff : + section52MomentBoundCoeff d hP4.xi CUpper hP4.sUpper m + + section52MomentBoundCoeff d hP4.xi CLower hP4.sLower m + + section52MomentBoundCoeff d hP4.xi CUpper hP4.sUpper m * + section52MomentBoundCoeff d hP4.xi CLower hP4.sLower m ≤ + section52WidetildeThetaErrorCoeff d hP4.xi CTheta + (min hP4.sUpper hP4.sLower) m := + section52_coefficients_mixed_le_widetildeThetaErrorCoeff + (d := d) (ξ := hP4.xi) (m := m) + (CUpper := CUpper) (CLower := CLower) (CTheta := CTheta) + (sUpper := hP4.sUpper) (sLower := hP4.sLower) + (Nat.succ_le_of_lt hP4.xi_pos) hCUpper_nonneg hCLower_nonneg + hP4.dim_div_xi_lt_sUpper hP4.dim_div_xi_lt_sLower + hUpperDenom hLowerDenom hCTheta + exact + widetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_integrable_positiveExcess_bounds + hP hStruct hP4 hBlock hUpperPowInt hLowerPowInt + m hUpperExcessPowInt hLowerExcessPowInt + (section52MomentBoundCoeff_nonneg hCUpper_nonneg hUpperDenom) + (section52MomentBoundCoeff_nonneg hCLower_nonneg hLowerDenom) + hUpperExcess hLowerExcess hCoeff + +end + +end Section52 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53.lean new file mode 100644 index 0000000000..9a41e676ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53.lean @@ -0,0 +1,37 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations + +/-! # Section53 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 + +/-! +# Section 5.3: analytic reduction to coarse-grained fluctuations + +Compatibility module re-exporting the split Section 5.3 theorem files. + +The manuscript-facing structure is: + +* upper bound for `J` by weak norms; +* deterministic weak-norm bounds for the maximizer; +* upper bound for centered response by coarse fluctuations. +-/ + +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/Common.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/Common.lean new file mode 100644 index 0000000000..a3c687ebb9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/Common.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.CutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.ResponseBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SolutionIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.PublicInternalBridges.H1Transport +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.CoeffFamily +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CanonicalSolutions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliCutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices.SymmetricL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Common -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 + +/-! +# Section 5.3 common imports + +Shared base context for the split Section 5.3 files. The mathematical content +lives in the three manuscript-lemma modules and their proof subdirectories. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations.lean new file mode 100644 index 0000000000..9140d2f841 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations.lean @@ -0,0 +1,50 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ScalarLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.AdditivityDefects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ResponseMomentIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.HighScaleAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessResponseDefect +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessDefectSquare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleTails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleExpectation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedWeakNormSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LinearProductAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CutoffOscillationUniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormSquareIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FinalRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.YoungRHS + +/-! # JUpper Bound Coarse Fluctuations -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 + +/-! +# Upper bound for centered response by coarse fluctuations + +Top-level module reserved for the third manuscript lemma in Section 5.3. It +will consume the first two Section 5.3 lemmas when the proof is developed. +-/ + +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/AdditivityDefects.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/AdditivityDefects.lean new file mode 100644 index 0000000000..27465ec991 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/AdditivityDefects.lean @@ -0,0 +1,497 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.RHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Definitions + +/-! # Additivity Defects -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators + +/-! +# Response-defect expectation conversion + +This file contains the proof-internal expectation conversion for the +response-defect baseline sums in the third Section 5.3 lemma. +-/ + +noncomputable section + +/-- The weak-norm maximizer response-defect observable is the same +parent/descendant response defect used in the first Section 5.3 lemma. -/ +private theorem responseDefectAverageAtScale_eq_responseJAdditivityDefectAtScale + {d : ℕ} [NeZero d] (m n : ℤ) (p q : Vec d) (a : RegCoeffField d) : + WeakNormsMaximizer.responseDefectAverageAtScale m n p q a = + JUpperBoundWeakNorms.responseJAdditivityDefectAtScale m n p q a := by + rfl + +/-- Integrability of the response defect in the notation of the weak-norm +maximizer RHS. -/ +private theorem integrable_responseDefectAverageAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {n m : ℤ} (hnm : n ≤ m) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + Integrable (WeakNormsMaximizer.responseDefectAverageAtScale m n p q) P := by + exact JUpperBoundWeakNorms.integrable_responseJAdditivityDefectAtScale + hnm p q hParent hDesc + +/-- A.e. nonnegativity of the response defect in the notation of the +weak-norm maximizer RHS. -/ +private theorem responseDefectAverageAtScale_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) {n m : ℤ} (hnm : n ≤ m) (p q : Vec d) : + 0 ≤ᵐ[P] WeakNormsMaximizer.responseDefectAverageAtScale m n p q := by + exact JUpperBoundWeakNorms.responseJAdditivityDefectAtScale_nonneg_ae + hP hnm p q + +/-- Law-facing tau conversion for the response defect as it appears in the +weak-norm maximizer RHS. -/ +private theorem integral_responseDefectAverageAtScale_eq_tauAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, WeakNormsMaximizer.responseDefectAverageAtScale m n p q a ∂P = + tauAtScale P m n p q := by + simpa [responseDefectAverageAtScale_eq_responseJAdditivityDefectAtScale] using + JUpperBoundWeakNorms.integral_responseJAdditivityDefectAtScale_eq_tauAtScale + hP hstat hn_nonneg hnm p q hParent hDesc + +private theorem int_mem_Icc_succ_right_nonneg_and_le + {k m n : ℤ} (hk : 0 ≤ k) (hn : n ∈ Finset.Icc (k + 1) m) : + 0 ≤ n ∧ n ≤ m := by + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + constructor + · linarith + · exact hn_high + +private theorem sum_range_to_Icc_descending {k m : ℤ} (hkm : k ≤ m) + (F : ℕ → ℝ) : + (∑ j ∈ Finset.range (Int.toNat (m - k)), F j) = + ∑ n ∈ Finset.Icc (k + 1) m, F (Int.toNat (m - n)) := by + classical + refine Finset.sum_bij (fun j _hj => m - (j : ℤ)) ?_ ?_ ?_ ?_ + · intro j hj + have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hj_lt_nat : j < Int.toNat (m - k) := Finset.mem_range.mp hj + have hj_lt : (j : ℤ) < m - k := by + have hj_lt' : (j : ℤ) < ((Int.toNat (m - k) : ℕ) : ℤ) := by + exact_mod_cast hj_lt_nat + simpa [hL] using hj_lt' + simp only [Finset.mem_Icc] + constructor <;> omega + · intro j₁ _hj₁ j₂ _hj₂ h + have h' : m - (j₁ : ℤ) = m - (j₂ : ℤ) := by simpa using h + have hcast : (j₁ : ℤ) = (j₂ : ℤ) := by omega + exact_mod_cast hcast + · intro n hn + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + refine ⟨Int.toNat (m - n), ?_, ?_⟩ + · have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hmn_lt : m - n < m - k := by omega + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + apply Finset.mem_range.mpr + have hcast : ((Int.toNat (m - n) : ℕ) : ℤ) < + ((Int.toNat (m - k) : ℕ) : ℤ) := by + simpa [hto, hL] using hmn_lt + exact_mod_cast hcast + · have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + change m - ((Int.toNat (m - n) : ℕ) : ℤ) = n + rw [hto] + omega + · intro j _hj + have harg : Int.toNat (m - (m - (j : ℤ))) = j := by + have hsub : m - (m - (j : ℤ)) = (j : ℤ) := by ring + simp [hsub] + exact congrArg F harg.symm + +private theorem sum_Icc_betaWeight_le_geometric_inv + {k m : ℤ} (hkm : k ≤ m) {β : ℝ} (hβ : 0 < β) : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) ≤ + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := by + let L : ℕ := Int.toNat (m - k) + have hsum_eq : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + simpa [L] using + (sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => Real.rpow (3 : ℝ) (-β * (j : ℝ)))).symm + have hrange_le : + (∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ))) ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + simpa only [Finset.mem_filter, and_true] using + Finset.mem_range.mpr (Nat.lt_succ_of_lt (Finset.mem_range.mp hj)) + · intro j _hj _hj_not + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom := + Homogenization.sum_filter_triadicDepthWeight_le_geometric_inv + β L (fun _j => True) hβ + calc + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) + = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hsum_eq + _ ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hrange_le + _ ≤ (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := hgeom + +/-- Integrability of the square of a finite weighted response-defect +square-root sum. This is the integrability part of the Cauchy/tau estimate +below, exposed proof-internally for the final paired-square assembly. -/ +theorem integrable_sq_weighted_sqrt_responseDefectAverageAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) + (w : ℤ → ℝ) (p q : Vec d) + (hw : ∀ n ∈ Finset.Icc (k + 1) m, 0 ≤ w n) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : + ∀ n ∈ Finset.Icc (k + 1) m, + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + Integrable + (fun a : RegCoeffField d => + (∑ n ∈ Finset.Icc (k + 1) m, + w n * Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2) P := by + let S : Finset ℤ := Finset.Icc (k + 1) m + let D : ℤ → RegCoeffField d → ℝ := + fun n a => WeakNormsMaximizer.responseDefectAverageAtScale m n p q a + let X : RegCoeffField d → ℝ := + fun a => (∑ n ∈ S, w n * Real.sqrt (D n a)) ^ 2 + let Y : RegCoeffField d → ℝ := + fun a => (∑ n ∈ S, w n) * ∑ n ∈ S, w n * D n a + have hIndex : ∀ n ∈ S, 0 ≤ n ∧ n ≤ m := by + intro n hn + exact int_mem_Icc_succ_right_nonneg_and_le hk_nonneg (by simpa [S] using hn) + have hDInt : ∀ n ∈ S, Integrable (D n) P := by + intro n hn + have hnm : n ≤ m := (hIndex n hn).2 + exact integrable_responseDefectAverageAtScale hnm p q hParent + (hDesc n (by simpa [S] using hn)) + have hDNonneg : ∀ n ∈ S, 0 ≤ᵐ[P] D n := by + intro n hn + exact responseDefectAverageAtScale_nonneg_ae hP (hIndex n hn).2 p q + have hDNonneg_all : ∀ᵐ a ∂P, ∀ n ∈ S, 0 ≤ D n a := by + exact (Finset.eventually_all (I := S) + (l := ae P) (p := fun n a => 0 ≤ D n a)).2 hDNonneg + have hYInt : Integrable Y P := by + have hsum : + Integrable (fun a : RegCoeffField d => ∑ n ∈ S, w n * D n a) P := + integrable_finsetSum S + (fun n hn => (hDInt n hn).const_mul (w n)) + exact hsum.const_mul (∑ n ∈ S, w n) + have hsumAEMeas : + AEStronglyMeasurable + (fun a : RegCoeffField d => ∑ n ∈ S, w n * Real.sqrt (D n a)) P := by + have hfun : + AEStronglyMeasurable + (∑ n ∈ S, fun a : RegCoeffField d => w n * Real.sqrt (D n a)) P := + Finset.aestronglyMeasurable_sum S + (f := fun n a => w n * Real.sqrt (D n a)) + (by + intro n hn + have hsqrt : + AEStronglyMeasurable (fun a : RegCoeffField d => Real.sqrt (D n a)) P := + (hDInt n hn).aestronglyMeasurable.aemeasurable.sqrt.aestronglyMeasurable + exact hsqrt.const_mul (w n)) + refine hfun.congr ?_ + filter_upwards with a + simp [Finset.sum_apply] + have hXAEMeas : AEStronglyMeasurable X P := by + simpa [X] using! hsumAEMeas.pow 2 + have hPoint : ∀ᵐ a ∂P, X a ≤ Y a := by + filter_upwards [hDNonneg_all] with a hnonneg + have hCauchy := + sq_sum_mul_sqrt_le_sum_mul_sum_mul S w (fun n => D n a) + (by intro n hn; exact hw n (by simpa [S] using hn)) + (by intro n hn; exact hnonneg n hn) + simpa [X, Y, S, D] using hCauchy + have hXNonneg : ∀ᵐ a ∂P, 0 ≤ X a := by + filter_upwards with a + exact sq_nonneg _ + have hXInt : Integrable X P := by + refine Integrable.mono' hYInt hXAEMeas ?_ + filter_upwards [hPoint, hXNonneg] with a hle hnonneg + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hle + simpa [X, D, S] using hXInt + +/-- Finite weighted Cauchy plus stationarity converts the square of a weighted +sum of response-defect square roots into the corresponding weighted tau sum. -/ +theorem integral_sq_weighted_sqrt_responseDefectAverageAtScale_le_sum_weights_mul_tauAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) + (w : ℤ → ℝ) (p q : Vec d) + (hw : ∀ n ∈ Finset.Icc (k + 1) m, 0 ≤ w n) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : + ∀ n ∈ Finset.Icc (k + 1) m, + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + (∑ n ∈ Finset.Icc (k + 1) m, + w n * Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 ∂P + ≤ + (∑ n ∈ Finset.Icc (k + 1) m, w n) * + ∑ n ∈ Finset.Icc (k + 1) m, w n * tauAtScale P m n p q := by + let S : Finset ℤ := Finset.Icc (k + 1) m + let D : ℤ → RegCoeffField d → ℝ := + fun n a => WeakNormsMaximizer.responseDefectAverageAtScale m n p q a + let X : RegCoeffField d → ℝ := + fun a => (∑ n ∈ S, w n * Real.sqrt (D n a)) ^ 2 + let Y : RegCoeffField d → ℝ := + fun a => (∑ n ∈ S, w n) * ∑ n ∈ S, w n * D n a + have hIndex : ∀ n ∈ S, 0 ≤ n ∧ n ≤ m := by + intro n hn + exact int_mem_Icc_succ_right_nonneg_and_le hk_nonneg (by simpa [S] using hn) + have hDInt : ∀ n ∈ S, Integrable (D n) P := by + intro n hn + have hnm : n ≤ m := (hIndex n hn).2 + exact integrable_responseDefectAverageAtScale hnm p q hParent + (hDesc n (by simpa [S] using hn)) + have hDNonneg : ∀ n ∈ S, 0 ≤ᵐ[P] D n := by + intro n hn + exact responseDefectAverageAtScale_nonneg_ae hP (hIndex n hn).2 p q + have hDNonneg_all : ∀ᵐ a ∂P, ∀ n ∈ S, 0 ≤ D n a := by + exact (Finset.eventually_all (I := S) + (l := ae P) (p := fun n a => 0 ≤ D n a)).2 hDNonneg + have hYInt : Integrable Y P := by + have hsum : + Integrable (fun a : RegCoeffField d => ∑ n ∈ S, w n * D n a) P := + integrable_finsetSum S + (fun n hn => (hDInt n hn).const_mul (w n)) + exact hsum.const_mul (∑ n ∈ S, w n) + have hsumAEMeas : + AEStronglyMeasurable + (fun a : RegCoeffField d => ∑ n ∈ S, w n * Real.sqrt (D n a)) P := by + have hfun : + AEStronglyMeasurable + (∑ n ∈ S, fun a : RegCoeffField d => w n * Real.sqrt (D n a)) P := + Finset.aestronglyMeasurable_sum S + (f := fun n a => w n * Real.sqrt (D n a)) + (by + intro n hn + have hsqrt : + AEStronglyMeasurable (fun a : RegCoeffField d => Real.sqrt (D n a)) P := + (hDInt n hn).aestronglyMeasurable.aemeasurable.sqrt.aestronglyMeasurable + exact hsqrt.const_mul (w n)) + refine hfun.congr ?_ + filter_upwards with a + simp [Finset.sum_apply] + have hXAEMeas : AEStronglyMeasurable X P := by + simpa [X] using! hsumAEMeas.pow 2 + have hPoint : ∀ᵐ a ∂P, X a ≤ Y a := by + filter_upwards [hDNonneg_all] with a hnonneg + have hCauchy := + sq_sum_mul_sqrt_le_sum_mul_sum_mul S w (fun n => D n a) + (by intro n hn; exact hw n (by simpa [S] using hn)) + (by intro n hn; exact hnonneg n hn) + simpa [X, Y, S, D] using hCauchy + have hXNonneg : ∀ᵐ a ∂P, 0 ≤ X a := by + filter_upwards with a + exact sq_nonneg _ + have hXInt : Integrable X P := by + refine Integrable.mono' hYInt hXAEMeas ?_ + filter_upwards [hPoint, hXNonneg] with a hle hnonneg + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hle + have hIntegralY : + ∫ a, Y a ∂P = + (∑ n ∈ S, w n) * ∑ n ∈ S, w n * tauAtScale P m n p q := by + calc + ∫ a, Y a ∂P = + (∑ n ∈ S, w n) * + ∫ a, (∑ n ∈ S, w n * D n a) ∂P := by + simp [Y, integral_const_mul] + _ = + (∑ n ∈ S, w n) * + ∑ n ∈ S, ∫ a, w n * D n a ∂P := by + rw [integral_finsetSum S + (fun n hn => (hDInt n hn).const_mul (w n))] + _ = + (∑ n ∈ S, w n) * + ∑ n ∈ S, w n * tauAtScale P m n p q := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro n hn + have hn_nonneg : 0 ≤ n := (hIndex n hn).1 + have hnm : n ≤ m := (hIndex n hn).2 + rw [integral_const_mul] + rw [integral_responseDefectAverageAtScale_eq_tauAtScale + hP hstat hn_nonneg hnm p q hParent + (hDesc n (by simpa [S] using hn))] + calc + ∫ a, (∑ n ∈ Finset.Icc (k + 1) m, + w n * Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 ∂P + = + ∫ a, X a ∂P := by simp [X, D, S] + _ ≤ ∫ a, Y a ∂P := integral_mono_ae hXInt hYInt hPoint + _ = + (∑ n ∈ Finset.Icc (k + 1) m, w n) * + ∑ n ∈ Finset.Icc (k + 1) m, w n * tauAtScale P m n p q := by + simpa [S] using hIntegralY + +/-- The beta-weighted response-defect baseline term is bounded by the geometric +series factor times the beta-weighted tau sum. -/ +theorem integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_geometric_tauSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {β : ℝ} (hβ : 0 < β) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : + ∀ n ∈ Finset.Icc (k + 1) m, + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 ∂P + ≤ + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ * + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + tauAtScale P m n p q := by + let S : Finset ℤ := Finset.Icc (k + 1) m + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) + have hw : ∀ n ∈ S, 0 ≤ w n := by + intro n _hn + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hbase := + integral_sq_weighted_sqrt_responseDefectAverageAtScale_le_sum_weights_mul_tauAtScale + hP hstat hk_nonneg w p q + (by intro n hn; exact hw n (by simpa [S] using hn)) + hParent hDesc + have hTauNonneg : ∀ n ∈ S, 0 ≤ tauAtScale P m n p q := by + intro n hn + have hIndex := int_mem_Icc_succ_right_nonneg_and_le hk_nonneg (by simpa [S] using hn) + have hint := + integral_responseDefectAverageAtScale_eq_tauAtScale + hP hstat hIndex.1 hIndex.2 p q hParent + (hDesc n (by simpa [S] using hn)) + rw [← hint] + exact integral_nonneg_of_ae + (responseDefectAverageAtScale_nonneg_ae hP hIndex.2 p q) + have hTauSumNonneg : + 0 ≤ ∑ n ∈ S, w n * tauAtScale P m n p q := by + exact Finset.sum_nonneg fun n hn => mul_nonneg (hw n hn) (hTauNonneg n hn) + have hWeight : + (∑ n ∈ S, w n) ≤ (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := by + simpa [S, w] using + sum_Icc_betaWeight_le_geometric_inv (k := k) (m := m) hkm hβ + have hfactor : + (∑ n ∈ S, w n) * + ∑ n ∈ S, w n * tauAtScale P m n p q + ≤ + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ * + ∑ n ∈ S, w n * tauAtScale P m n p q := + mul_le_mul_of_nonneg_right hWeight hTauSumNonneg + exact hbase.trans (by simpa [S, w] using hfactor) + +/-- The beta-weighted response-defect baseline term with the geometric factor +absorbed into the standard `5 * beta^{-1}` loss. -/ +theorem integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_beta_inv_tauSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {β : ℝ} (hβ : 0 < β) (hβ_le : β ≤ 1) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : + ∀ n ∈ Finset.Icc (k + 1) m, + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 ∂P + ≤ + (5 * β⁻¹) * + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + tauAtScale P m n p q := by + let S : Finset ℤ := Finset.Icc (k + 1) m + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) + have hgeom := + integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_geometric_tauSum + hP hstat hk_nonneg hkm hβ p q hParent hDesc + have hw : ∀ n ∈ S, 0 ≤ w n := by + intro n _hn + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hTauNonneg : ∀ n ∈ S, 0 ≤ tauAtScale P m n p q := by + intro n hn + have hIndex := int_mem_Icc_succ_right_nonneg_and_le hk_nonneg (by simpa [S] using hn) + have hint := + integral_responseDefectAverageAtScale_eq_tauAtScale + hP hstat hIndex.1 hIndex.2 p q hParent + (hDesc n (by simpa [S] using hn)) + rw [← hint] + exact integral_nonneg_of_ae + (responseDefectAverageAtScale_nonneg_ae hP hIndex.2 p q) + have hTauSumNonneg : + 0 ≤ ∑ n ∈ S, w n * tauAtScale P m n p q := by + exact Finset.sum_nonneg fun n hn => mul_nonneg (hw n hn) (hTauNonneg n hn) + have hfactor : + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ * + ∑ n ∈ S, w n * tauAtScale P m n p q + ≤ + (5 * β⁻¹) * + ∑ n ∈ S, w n * tauAtScale P m n p q := + mul_le_mul_of_nonneg_right + (Homogenization.Book.Ch02.inv_one_sub_rpow_three_neg_le_five_inv hβ hβ_le) + hTauSumNonneg + exact hgeom.trans (by simpa [S, w] using hfactor) + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Assembly.lean new file mode 100644 index 0000000000..05433c0c3d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Assembly.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.HighScaleAverages + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators + +/-! +# Assembly for the coarse-fluctuation lemma + +This file is the intended owner of the final proof of +`JUpperBoundCoarseFluctuations_homogenizationScale`. The deterministic +high-scale bridge is available from `CoarseAverages.lean`; the remaining +assembly step needs a law-facing stationarity/integrability theorem for the +normalized full-block operator-norm-square fluctuation observable. +-/ + +noncomputable section + +/-- The RHS obtained by applying the first Section 5.3 lemma to the +coarse-fluctuation special vectors, before the second and third Section 5.3 +lemmas are used to rewrite it into manuscript coarse-fluctuation quantities. -/ +noncomputable def specialWeakNormManuscriptRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + JUpperBoundWeakNorms.jUpperWeakNormManuscriptExpectedRHSAtScale + P (m : ℤ) (k : ℤ) s t + (1 + JUpperBoundWeakNorms.section53CutoffBound (originCube d (m : ℤ))) + (JUpperBoundWeakNorms.section53CutoffOscillationConstant (originCube d (m : ℤ))) + (JUpperBoundWeakNorms.section53CutoffScaleSep + (originCube d (m : ℤ)) (Int.toNat ((m : ℤ) - (k : ℤ)))) + (JUpperBoundWeakNorms.section53CutoffDualBound (originCube d (m : ℤ)) s) + (JUpperBoundWeakNorms.section53CutoffDualBound (originCube d (m : ℤ)) t) + (JUpperBoundWeakNorms.section53CutoffProductCoeff (originCube d (m : ℤ)) s t) + p_e q_e p0_e q0_e + +/-- Scalar weight multiplying the tau and low-scale tail terms in the final +coarse-fluctuation RHS. -/ +noncomputable def coarseFluctuationScalarWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℕ) : ℝ := + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + σ * (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + σ⁻¹ * hP.barSigmaAtScale hStruct 0 + +/-- Weighted sum of normalized full-block operator-norm-square fluctuation +expectations appearing in the final coarse-fluctuation RHS. -/ +noncomputable def coarseFluctuationFullBlockSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + ∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P + +/-- Weighted tau sum appearing in the final coarse-fluctuation RHS. -/ +noncomputable def coarseFluctuationTauSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + tauAtScale P (m : ℤ) n p_e q_e + +/-- Unit-scale moment weight appearing in the final coarse-fluctuation RHS. -/ +noncomputable def coarseFluctuationUnitMomentWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : ℝ := + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + σ * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + σ⁻¹ * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + +/-- Response moment appearing in the positive-excess contribution of the final +coarse-fluctuation RHS. -/ +noncomputable def coarseFluctuationResponseMomentAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : ℝ := + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Real.rpow + (∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ ∂P) + ζ⁻¹ + +/-- The six-term manuscript RHS from +`e.J.upper.bound.coarse.fluctuations.homogenization.scale`. + +This is the target RHS for the final third Section 5.3 lemma. The matrix +fluctuation term uses the Euclidean operator norm via +`fullBlockNormalizedFluctuationOperatorNormSqAtScale`. -/ +noncomputable def coarseFluctuationManuscriptRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C ε : ℝ) (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let scalarWeight := coarseFluctuationScalarWeightAtScale hP hStruct m + let fluctuationSum := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let tauSum := coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let unitMomentWeight := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let responseMoment := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + C * Real.sqrt (tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + + C * ε * (Real.sqrt θ - 1) ^ 2 + + C * ε⁻¹ * β⁻¹ * θ * fluctuationSum + + C * ε⁻¹ * (β ^ 2)⁻¹ * scalarWeight * tauSum + + C * (hP4.xi : ℝ) * ε⁻¹ * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + unitMomentWeight * responseMoment + + C * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * ((m - k : ℕ) : ℝ)) * + scalarWeight * (θ - 1) + +/-- The first Section 5.3 lemma instantiated at the special vectors used in +the coarse-fluctuation lemma. The two integrability hypotheses are exactly +the finite-RHS side conditions intentionally left on +`JUpperBoundWeakNorms_homogenizationScale`; this theorem does not introduce a +new proof package. -/ +theorem expectedCenteredResponseJAtScale_le_specialWeakNormManuscriptRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) + (hGradSq : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d (m : ℤ)) s p_e q_e p0_e a.toFun) ^ 2) P) + (hFluxSq : + let β := section53CoarseFluctuationBeta hP4 + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d (m : ℤ)) t p_e q_e q0_e a.toFun) ^ 2) P) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e ≤ + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + have hk_nonneg : 0 ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm.le + have hs_pos : 0 < s := by + dsimp [s, β] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have ht_pos : 0 < t := by + dsimp [t, β] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hs_lt_one : s < 1 := by + dsimp [s, β] + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hupper := hP4.sUpper_pos + have hbeta := section53CoarseFluctuationBeta_pos hP4 + nlinarith + have hst : s + t ≤ 1 := by + dsimp [s, t, β] + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + nlinarith + have hWeak := + JUpperBoundWeakNorms_homogenizationScale + hP hstat hStruct hP4 hk_nonneg hkm_int + (s := s) (t := t) hs_pos hs_lt_one ht_pos hst + p_e q_e p0_e q0_e + (by simpa [s, p_e, q_e, p0_e, β] using hGradSq) + (by simpa [t, p_e, q_e, q0_e, β] using hFluxSq) + have hCenter := + expectedResponseJCubeSet_sub_half_vecDot_specialCentering_eq_expectedCenteredResponseJAtScale + hP hStruct hP4 m e + calc + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e = + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e - + (1 / 2 : ℝ) * vecDot p0_e q0_e := by + rw [← hCenter] + _ ≤ + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e := by + simpa [specialWeakNormManuscriptRHSAtScale, s, t, p_e, q_e, p0_e, q0_e, β] + using hWeak + +/-- Proof-internal bridge from the Section 5.3 fluctuation notation to the +Ch4 law-facing stationarity theorem. The observable is the Ch4 normalized +full-block operator-norm-square fluctuation; this theorem only rewrites the +proof-folder alias and applies stationarity. -/ +private theorem integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P = + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + simpa [fullBlockNormalizedFluctuationOperatorNormSqAtScale] using + hP.integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hstat hStruct center hn hnm + (by simpa [fullBlockNormalizedFluctuationOperatorNormSqAtScale] using! hOrigin) + +/-- Constant multiples of the normalized full-block fluctuation descendant +average also stationarize to the origin cube. This is the form used after the +deterministic coarse-average bridge, whose right side carries the deterministic +factor `2 * thetaAtScale`. -/ +private theorem integral_descendantsAverage_const_mul_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (C : ℝ) + (hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + C * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P = + C * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + have hbase := + integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hP hstat hStruct center hn hnm hOrigin + calc + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + C * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P + = + ∫ a, + C * + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P := by + congr 1 + ext a + rw [descendantsAverage_mul_left] + _ = + C * + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P := by + rw [integral_const_mul] + _ = + C * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + rw [hbase] + +/-- Expectation-level stationarity conversion for the weighted full-block +fluctuation sum generated by the deterministic high-scale bridge. -/ +theorem integral_weighted_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + ∫ a, + ∑ n ∈ S, w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P = + ∑ n ∈ S, w n * + (2 * θ * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P) := by + classical + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + have htermInt : + ∀ n ∈ S, + Integrable + (fun a : RegCoeffField d => + w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a)) P := by + intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n)) P := by + have hnat := + Section52.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_originCube_from_P4 + hP hStruct hP4 (m : ℤ) (Int.toNat n) + simpa [Int.toNat_of_nonneg hn_nonneg] using! hnat + have hdesc : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a)) P := by + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d (m : ℤ)) n := by + simpa [descendantsAtScale_eq_descendantsAtDepth + (originCube d (m : ℤ)) hnm] using! hR + exact + (hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendantsAtScale_originCube + hstat hStruct (m : ℤ) hn_nonneg hnm hRscale hOrigin).const_mul (2 * θ) + exact hdesc.const_mul (w n) + calc + ∫ a, + ∑ n ∈ S, w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P + = + ∑ n ∈ S, + ∫ a, + w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P := by + rw [integral_finsetSum S htermInt] + _ = + ∑ n ∈ S, w n * + (2 * θ * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P) := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n)) P := by + have hnat := + Section52.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_originCube_from_P4 + hP hStruct hP4 (m : ℤ) (Int.toNat n) + simpa [Int.toNat_of_nonneg hn_nonneg] using! hnat + have hstatn := + integral_descendantsAverage_const_mul_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hP hstat hStruct (m : ℤ) hn_nonneg hnm (2 * θ) hOrigin + calc + ∫ a, + w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P + = + w n * + ∫ a, + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P := by + rw [integral_const_mul] + _ = + w n * + (2 * θ * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P) := by + rw [hstatn] + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Basic.lean new file mode 100644 index 0000000000..bb1e5720a2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/Basic.lean @@ -0,0 +1,440 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.Common + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open scoped BigOperators + +/-! +# Basic scalar parameters for the third Section 5.3 lemma + +This file contains only the manuscript scalar parameters for +`l.J.upper.bound.coarse.fluctuations.homogenization.scale` and the elementary +inequalities extracted from `(P4)`. +-/ + +noncomputable section + +/-- The minimum quantity whose fixed small fraction is the exponent `β` in the +third Section 5.3 lemma. -/ +noncomputable def section53CoarseFluctuationBetaCore {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + min (1 - hP4.sUpper - hP4.sLower) + (min hP4.sUpper + (min hP4.sLower + (min (hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ)) + (hP4.sLower - (d : ℝ) / (hP4.xi : ℝ))))) + +/-- The exponent `β` used in +`l.J.upper.bound.coarse.fluctuations.homogenization.scale`. -/ +noncomputable def section53CoarseFluctuationBeta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + section53CoarseFluctuationBetaCore hP4 / 8 + +/-- The Hölder conjugate `ζ = ξ / (ξ - 1)` used in the third Section 5.3 +lemma. -/ +noncomputable def section53CoarseFluctuationZeta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + (hP4.xi : ℝ) / ((hP4.xi : ℝ) - 1) + +/-- Parameter-only version of the Section 5.3 coarse-fluctuation beta core. -/ +noncomputable def section53CoarseFluctuationBetaCoreParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + min (1 - params.sUpper - params.sLower) + (min params.sUpper + (min params.sLower + (min (params.sUpper - (d : ℝ) / (params.xi : ℝ)) + (params.sLower - (d : ℝ) / (params.xi : ℝ))))) + +/-- Parameter-only version of the Section 5.3 coarse-fluctuation beta. -/ +noncomputable def section53CoarseFluctuationBetaParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + section53CoarseFluctuationBetaCoreParams params / 8 + +/-- Parameter-only version of the Section 5.3 Hölder conjugate exponent. -/ +noncomputable def section53CoarseFluctuationZetaParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (params.xi : ℝ) / ((params.xi : ℝ) - 1) + +@[simp] +theorem section53CoarseFluctuationBetaCoreParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCoreParams hP4.params = + section53CoarseFluctuationBetaCore hP4 := rfl + +@[simp] +theorem section53CoarseFluctuationBetaParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaParams hP4.params = + section53CoarseFluctuationBeta hP4 := rfl + +@[simp] +theorem section53CoarseFluctuationZetaParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationZetaParams hP4.params = + section53CoarseFluctuationZeta hP4 := rfl + +private theorem section53CoarseFluctuationBetaCore_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < section53CoarseFluctuationBetaCore hP4 := by + have hgap : 0 < 1 - hP4.sUpper - hP4.sLower := by + linarith [hP4.sum_lt_one] + have hupper : 0 < hP4.sUpper := hP4.sUpper_pos + have hlower : 0 < hP4.sLower := hP4.sLower_pos + have hupper_gain : 0 < hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sLower] + unfold section53CoarseFluctuationBetaCore + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +theorem section53CoarseFluctuationBeta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < section53CoarseFluctuationBeta hP4 := by + unfold section53CoarseFluctuationBeta + nlinarith [section53CoarseFluctuationBetaCore_pos hP4] + +theorem section53CoarseFluctuationBeta_nonneg {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ section53CoarseFluctuationBeta hP4 := + (section53CoarseFluctuationBeta_pos hP4).le + +private theorem section53CoarseFluctuationBetaCore_le_sum_gap {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCore hP4 ≤ + 1 - hP4.sUpper - hP4.sLower := by + unfold section53CoarseFluctuationBetaCore + exact min_le_left _ _ + +private theorem section53CoarseFluctuationBetaCore_le_sUpper {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCore hP4 ≤ hP4.sUpper := by + unfold section53CoarseFluctuationBetaCore + exact (min_le_right _ _).trans (min_le_left _ _) + +private theorem section53CoarseFluctuationBetaCore_le_sLower {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCore hP4 ≤ hP4.sLower := by + unfold section53CoarseFluctuationBetaCore + exact (min_le_right _ _).trans ((min_le_right _ _).trans (min_le_left _ _)) + +private theorem section53CoarseFluctuationBetaCore_le_sUpper_gain {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCore hP4 ≤ + hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section53CoarseFluctuationBetaCore + exact (min_le_right _ _).trans + ((min_le_right _ _).trans ((min_le_right _ _).trans (min_le_left _ _))) + +private theorem section53CoarseFluctuationBetaCore_le_sLower_gain {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBetaCore hP4 ≤ + hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section53CoarseFluctuationBetaCore + exact (min_le_right _ _).trans + ((min_le_right _ _).trans ((min_le_right _ _).trans (min_le_right _ _))) + +theorem section53CoarseFluctuationBeta_le_sUpper {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBeta hP4 ≤ hP4.sUpper := by + unfold section53CoarseFluctuationBeta + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + have hcore_le := section53CoarseFluctuationBetaCore_le_sUpper hP4 + nlinarith + +theorem section53CoarseFluctuationBeta_le_sLower {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBeta hP4 ≤ hP4.sLower := by + unfold section53CoarseFluctuationBeta + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + have hcore_le := section53CoarseFluctuationBetaCore_le_sLower hP4 + nlinarith + +theorem section53CoarseFluctuationBeta_le_sUpper_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBeta hP4 ≤ + hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section53CoarseFluctuationBeta + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + have hcore_le := section53CoarseFluctuationBetaCore_le_sUpper_gain hP4 + nlinarith + +theorem section53CoarseFluctuationBeta_le_sLower_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBeta hP4 ≤ + hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section53CoarseFluctuationBeta + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + have hcore_le := section53CoarseFluctuationBetaCore_le_sLower_gain hP4 + nlinarith + +theorem sUpper_add_sLower_add_two_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + hP4.sLower + + 2 * section53CoarseFluctuationBeta hP4 ≤ 1 := by + unfold section53CoarseFluctuationBeta + have hcore_le := section53CoarseFluctuationBetaCore_le_sum_gap hP4 + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + nlinarith + +theorem sUpper_add_sLower_add_four_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + hP4.sLower + + 4 * section53CoarseFluctuationBeta hP4 ≤ 1 := by + unfold section53CoarseFluctuationBeta + have hcore_le := section53CoarseFluctuationBetaCore_le_sum_gap hP4 + have hcore_nonneg : 0 ≤ section53CoarseFluctuationBetaCore hP4 := + (section53CoarseFluctuationBetaCore_pos hP4).le + nlinarith + +theorem sLower_add_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + section53CoarseFluctuationBeta hP4 ≤ 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hupper_nonneg := hP4.sUpper_nonneg + have hbeta_nonneg := section53CoarseFluctuationBeta_nonneg hP4 + nlinarith + +theorem sLower_add_two_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 ≤ 1 := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hupper_nonneg := hP4.sUpper_nonneg + have hbeta_nonneg := section53CoarseFluctuationBeta_nonneg hP4 + nlinarith + +theorem sUpper_add_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + section53CoarseFluctuationBeta hP4 ≤ 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hlower_nonneg := hP4.sLower_nonneg + have hbeta_nonneg := section53CoarseFluctuationBeta_nonneg hP4 + nlinarith + +theorem sUpper_add_two_beta_le_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 ≤ 1 := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hlower_nonneg := hP4.sLower_nonneg + have hbeta_nonneg := section53CoarseFluctuationBeta_nonneg hP4 + nlinarith + +theorem half_sLower_add_beta_le_sLower {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP4.sLower + section53CoarseFluctuationBeta hP4) / 2 ≤ hP4.sLower := by + have hle := section53CoarseFluctuationBeta_le_sLower hP4 + nlinarith + +theorem sLower_lt_sLower_add_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower < hP4.sLower + section53CoarseFluctuationBeta hP4 := by + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem half_sLower_add_two_beta_le_sLower_add_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP4.sLower + 2 * section53CoarseFluctuationBeta hP4) / 2 ≤ + hP4.sLower + section53CoarseFluctuationBeta hP4 := by + have hlower_nonneg := hP4.sLower_nonneg + nlinarith + +theorem sLower_add_beta_lt_sLower_add_two_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + section53CoarseFluctuationBeta hP4 < + hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 := by + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem half_sUpper_add_beta_le_sUpper {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP4.sUpper + section53CoarseFluctuationBeta hP4) / 2 ≤ hP4.sUpper := by + have hle := section53CoarseFluctuationBeta_le_sUpper hP4 + nlinarith + +theorem sUpper_lt_sUpper_add_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper < hP4.sUpper + section53CoarseFluctuationBeta hP4 := by + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem half_sUpper_add_two_beta_le_sUpper_add_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4) / 2 ≤ + hP4.sUpper + section53CoarseFluctuationBeta hP4 := by + have hupper_nonneg := hP4.sUpper_nonneg + nlinarith + +theorem sUpper_add_beta_lt_sUpper_add_two_beta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + section53CoarseFluctuationBeta hP4 < + hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 := by + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem sLower_add_beta_sub_dim_div_xi_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sLower + section53CoarseFluctuationBeta hP4 - + (d : ℝ) / (hP4.xi : ℝ) := by + have hgain : 0 < hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sLower] + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem sUpper_add_beta_sub_dim_div_xi_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sUpper + section53CoarseFluctuationBeta hP4 - + (d : ℝ) / (hP4.xi : ℝ) := by + have hgain : 0 < hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sUpper] + have hbeta := section53CoarseFluctuationBeta_pos hP4 + linarith + +theorem section53CoarseFluctuationZeta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < section53CoarseFluctuationZeta hP4 := by + unfold section53CoarseFluctuationZeta + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast hP4.two_le_xi + exact div_pos (by linarith) (by linarith) + +theorem one_lt_section53CoarseFluctuationZeta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 1 < section53CoarseFluctuationZeta hP4 := by + unfold section53CoarseFluctuationZeta + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast hP4.two_le_xi + have hden_pos : 0 < (hP4.xi : ℝ) - 1 := by linarith + rw [one_lt_div hden_pos] + linarith + +theorem section53CoarseFluctuationZeta_le_two {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationZeta hP4 ≤ 2 := by + unfold section53CoarseFluctuationZeta + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast hP4.two_le_xi + have hden_pos : 0 < (hP4.xi : ℝ) - 1 := by linarith + rw [div_le_iff₀ hden_pos] + linarith + +theorem inv_xi_add_inv_section53CoarseFluctuationZeta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + ((hP4.xi : ℝ)⁻¹ + (section53CoarseFluctuationZeta hP4)⁻¹) = 1 := by + unfold section53CoarseFluctuationZeta + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by exact_mod_cast hP4.two_le_xi + have hxi_ne : (hP4.xi : ℝ) ≠ 0 := by linarith + have hden_ne : (hP4.xi : ℝ) - 1 ≠ 0 := by linarith + field_simp [hxi_ne, hden_ne] + ring + +/-- Weighted finite Cauchy-Schwarz in the square-root form used by the +expectation-level Section 5.3 RHS conversion. -/ +theorem sq_sum_mul_sqrt_le_sum_mul_sum_mul + {ι : Type*} [DecidableEq ι] (s : Finset ι) (w X : ι → ℝ) + (hw : ∀ i ∈ s, 0 ≤ w i) (hX : ∀ i ∈ s, 0 ≤ X i) : + (∑ i ∈ s, w i * Real.sqrt (X i)) ^ 2 ≤ + (∑ i ∈ s, w i) * (∑ i ∈ s, w i * X i) := by + let f : ι → ℝ := fun i => Real.sqrt (w i) + let g : ι → ℝ := fun i => Real.sqrt (w i) * Real.sqrt (X i) + have hcs := Finset.sum_mul_sq_le_sq_mul_sq s f g + have hleft : + (∑ i ∈ s, f i * g i) = ∑ i ∈ s, w i * Real.sqrt (X i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + dsimp [f, g] + rw [← mul_assoc, Real.mul_self_sqrt (hw i hi)] + have hsum_f : + (∑ i ∈ s, f i ^ 2) = ∑ i ∈ s, w i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [f, Real.sq_sqrt (hw i hi)] + have hsum_g : + (∑ i ∈ s, g i ^ 2) = ∑ i ∈ s, w i * X i := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [g, mul_pow, Real.sq_sqrt (hw i hi), Real.sq_sqrt (hX i hi)] + simpa [hleft, hsum_f, hsum_g] using hcs + +/-- Paired weighted finite Cauchy-Schwarz estimate, with separate scalar +weights on the two components. -/ +theorem weighted_pair_sq_sum_mul_sqrt_le + {ι : Type*} [DecidableEq ι] (s : Finset ι) + (wg wf G F : ι → ℝ) {σ τ : ℝ} + (hσ : 0 ≤ σ) (hτ : 0 ≤ τ) + (hwg : ∀ i ∈ s, 0 ≤ wg i) (hwf : ∀ i ∈ s, 0 ≤ wf i) + (hG : ∀ i ∈ s, 0 ≤ G i) (hF : ∀ i ∈ s, 0 ≤ F i) : + σ * (∑ i ∈ s, wg i * Real.sqrt (G i)) ^ 2 + + τ * (∑ i ∈ s, wf i * Real.sqrt (F i)) ^ 2 ≤ + (∑ i ∈ s, wg i) * (∑ i ∈ s, wg i * (σ * G i)) + + (∑ i ∈ s, wf i) * (∑ i ∈ s, wf i * (τ * F i)) := by + have hg := + sq_sum_mul_sqrt_le_sum_mul_sum_mul s wg G hwg hG + have hf := + sq_sum_mul_sqrt_le_sum_mul_sum_mul s wf F hwf hF + have hg' : + σ * (∑ i ∈ s, wg i * Real.sqrt (G i)) ^ 2 ≤ + σ * ((∑ i ∈ s, wg i) * (∑ i ∈ s, wg i * G i)) := + mul_le_mul_of_nonneg_left hg hσ + have hf' : + τ * (∑ i ∈ s, wf i * Real.sqrt (F i)) ^ 2 ≤ + τ * ((∑ i ∈ s, wf i) * (∑ i ∈ s, wf i * F i)) := + mul_le_mul_of_nonneg_left hf hτ + calc + σ * (∑ i ∈ s, wg i * Real.sqrt (G i)) ^ 2 + + τ * (∑ i ∈ s, wf i * Real.sqrt (F i)) ^ 2 + ≤ + σ * ((∑ i ∈ s, wg i) * (∑ i ∈ s, wg i * G i)) + + τ * ((∑ i ∈ s, wf i) * (∑ i ∈ s, wf i * F i)) := + add_le_add hg' hf' + _ = + (∑ i ∈ s, wg i) * (∑ i ∈ s, wg i * (σ * G i)) + + (∑ i ∈ s, wf i) * (∑ i ∈ s, wf i * (τ * F i)) := by + have hGsum : + (∑ i ∈ s, wg i * (σ * G i)) = + σ * (∑ i ∈ s, wg i * G i) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + have hFsum : + (∑ i ∈ s, wf i * (τ * F i)) = + τ * (∑ i ∈ s, wf i * F i) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + rw [hGsum, hFsum] + ring + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CoarseAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CoarseAverages.lean new file mode 100644 index 0000000000..af6bc33009 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CoarseAverages.lean @@ -0,0 +1,829 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormInput + +/-! # Coarse Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +/-! +# Coarse-average terms in the third Section 5.3 lemma + +This file starts the bridge from the high-scale average terms in +`WeakNormsMaximizer` to the manuscript coarse block-matrix fluctuation. The +first step is deterministic: on the a.e.-elliptic support, the Ch4 measurable +scalar-response average over a cube agrees with the corresponding coarse-block +formula from Chapter 2. +-/ + +noncomputable section + +private theorem canonicalScalarResponseGradientAverageCubeSet_self_eq_blockMatrix + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (p q : Vec d) : + Ch04.canonicalScalarResponseGradientAverageCubeSet Q Q p q a.toFun = + -p + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let v := + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) p q).toSolution + have hself : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hAverage := + Ch04.canonicalScalarResponseGradientAverageCubeSet_eq_cubeAverageVec_canonicalMaximizer + a ha (Q := Q) (R := Q) (j := 0) hself p q + have hCubeAverage : + cubeAverageVec Q (fun x => v.toH1.grad x) = + Ch02.averageGradient (Ch02.cubeDomain Q) aQ v := by + ext i + rw [Ch02.averageGradient, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + rfl + have hCh02 := + Ch02.averageGradient_canonicalMaximizer_eq_blockMatrix + (Ch02.cubeDomain Q) aQ p q + have hCoarse : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ := by + simpa [F, aQ] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + calc + Ch04.canonicalScalarResponseGradientAverageCubeSet Q Q p q a.toFun = + cubeAverageVec Q (fun x => v.toH1.grad x) := by + simpa [F, aQ, v] using hAverage + _ = Ch02.averageGradient (Ch02.cubeDomain Q) aQ v := hCubeAverage + _ = + -p + matVecMul (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ).lowerRight q - + matVecMul (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ).lowerLeft p := by + simpa [aQ, v] using hCh02 + _ = + -p + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft p := by + rw [hCoarse] + +private theorem canonicalScalarResponseFluxAverageCubeSet_self_eq_blockMatrix + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (p q : Vec d) : + Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun = + q + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let v := + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) aQ) p q).toSolution + have hself : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hAverage := + Ch04.canonicalScalarResponseFluxAverageCubeSet_eq_cubeAverageVec_canonicalMaximizerFlux + a ha (Q := Q) (R := Q) (j := 0) hself p q + have hCubeAverage : + cubeAverageVec Q (fun x => matVecMul (aQ.toCoeffField x) (v.toH1.grad x)) = + Ch02.averageFlux (Ch02.cubeDomain Q) aQ v := by + ext i + rw [Ch02.averageFlux, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + rfl + have hCh02 := + Ch02.averageFlux_canonicalMaximizer_eq_blockMatrix + (Ch02.cubeDomain Q) aQ p q + have hCoarse : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ := by + simpa [F, aQ] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + calc + Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun = + cubeAverageVec Q (fun x => matVecMul (aQ.toCoeffField x) (v.toH1.grad x)) := by + simpa [F, aQ, v] using hAverage + _ = Ch02.averageFlux (Ch02.cubeDomain Q) aQ v := hCubeAverage + _ = + q + matVecMul (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ).upperRight q - + matVecMul (Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) aQ).upperLeft p := by + simpa [aQ, v] using hCh02 + _ = + q + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight q - + matVecMul (coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft p := by + rw [hCoarse] + +private theorem matVecMul_smul_one {d : ℕ} (c : ℝ) (x : Vec d) : + matVecMul (c • (1 : Mat d)) x = c • x := by + rw [smul_matVecMul] + change c • (Matrix.mulVec (1 : Matrix (Fin d) (Fin d) ℝ) x) = c • x + rw [Matrix.one_mulVec] + +private theorem zero_matVecMul {d : ℕ} (x : Vec d) : + matVecMul (0 : Mat d) x = 0 := by + funext i + simp [matVecMul] + +private noncomputable def scalarAnnealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + BlockMat d := + Ch02.blockDiag + (hP.barSigmaAtScale hStruct m • (1 : Mat d)) + ((hP.barSigmaStarAtScale hStruct m)⁻¹ • (1 : Mat d)) + +private theorem special_average_mismatch_eq_reflected_block_fluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (R : TriadicCube d) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ) + let P_e : BlockVec d := (-q_e, p_e) + (-(Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e), + -(Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e)) = + blockMatVecMul + (ofFullBlockMat (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar))) + P_e := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ) + let P_e : BlockVec d := (-q_e, p_e) + have hgrad := + canonicalScalarResponseGradientAverageCubeSet_self_eq_blockMatrix a ha R p_e q_e + have hflux := + canonicalScalarResponseFluxAverageCubeSet_self_eq_blockMatrix a ha R p_e q_e + have hblock : + blockMatVecMul + (ofFullBlockMat (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar))) + P_e = + blockMatVecMul (blockReflect A) P_e - blockMatVecMul (blockReflect Abar) P_e := + blockMatVecMul_ofFullBlockMat_sub (blockReflect A) (blockReflect Abar) P_e + rw [hblock] + rw [hgrad, hflux] + ext i <;> + simp [p_e, q_e, P_e, A, Abar, scalarAnnealedBlockMatrixAtScale, + Ch02.blockDiag, blockReflect, blockMatVecMul, matVecMul_smul_one, + matVecMul_neg, matVecMul_smul, zero_matVecMul, sub_eq_add_neg] <;> + ring + +private theorem vecNormSq_neg {d : ℕ} (x : Vec d) : + vecNormSq (-x) = vecNormSq x := by + simp [vecNormSq, vecDot] + +private theorem vecNormSq_sub_comm {d : ℕ} (x y : Vec d) : + vecNormSq (x - y) = vecNormSq (y - x) := by + have h : x - y = -(y - x) := by + ext i + simp [sub_eq_add_neg] + rw [h, vecNormSq_neg] + +private noncomputable def reflectedBlockFluctuationOperatorNormSqAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : ℝ := + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct m + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar))‖ ^ 2 + +private noncomputable def starInvSqrtDiag {d : ℕ} (b c : ℝ) : BlockCoord d → ℝ + | Sum.inl _ => Real.sqrt c + | Sum.inr _ => (Real.sqrt b)⁻¹ + +private noncomputable def starSqrtDiag {d : ℕ} (b c : ℝ) : BlockCoord d → ℝ + | Sum.inl _ => (Real.sqrt c)⁻¹ + | Sum.inr _ => Real.sqrt b + +private def blockCoordSwapEquiv (d : ℕ) : BlockCoord d ≃ BlockCoord d where + toFun + | Sum.inl i => Sum.inr i + | Sum.inr i => Sum.inl i + invFun + | Sum.inl i => Sum.inr i + | Sum.inr i => Sum.inl i + left_inv := by + intro α + cases α <;> rfl + right_inv := by + intro α + cases α <;> rfl + +private noncomputable def fullBlockInvSqrtDiag {d : ℕ} (b c : ℝ) : BlockCoord d → ℝ + | Sum.inl _ => (Real.sqrt b)⁻¹ + | Sum.inr _ => Real.sqrt c + +private theorem toFullBlockMat_blockReflect_eq_reindex_swap {d : ℕ} (A : BlockMat d) : + toFullBlockMat (blockReflect A) = + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) (toFullBlockMat A) := by + ext α β + cases α <;> cases β <;> rfl + +private theorem diagonal_starInvSqrtDiag_eq_reindex_fullBlockInvSqrtDiag + {d : ℕ} (b c : ℝ) : + Matrix.diagonal (starInvSqrtDiag (d := d) b c) = + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) + (Matrix.diagonal (fullBlockInvSqrtDiag b c)) := by + ext α β + cases α <;> cases β <;> + simp [Matrix.diagonal, blockCoordSwapEquiv, starInvSqrtDiag, fullBlockInvSqrtDiag] + +private theorem reindex_swap_mul {d : ℕ} (M N : FullBlockMat d) : + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) (M * N) = + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) M * + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) N := by + exact map_mul (Matrix.reindexAlgEquiv ℝ ℝ (blockCoordSwapEquiv d)) M N + +private theorem reflectedNormalizedBlockFluctuationMatrix_eq_reindex_full + {d : ℕ} (b c : ℝ) (A Abar : BlockMat d) : + let Dstar : FullBlockMat d := Matrix.diagonal (starInvSqrtDiag b c) + let D : FullBlockMat d := Matrix.diagonal (fullBlockInvSqrtDiag b c) + Dstar * (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar)) * Dstar = + Matrix.reindex (blockCoordSwapEquiv d) (blockCoordSwapEquiv d) + (D * (toFullBlockMat A - toFullBlockMat Abar) * D) := by + dsimp only + let e := blockCoordSwapEquiv d + let Dstar : FullBlockMat d := Matrix.diagonal (starInvSqrtDiag b c) + let D : FullBlockMat d := Matrix.diagonal (fullBlockInvSqrtDiag b c) + let M : FullBlockMat d := toFullBlockMat A - toFullBlockMat Abar + have hD : Dstar = Matrix.reindex e e D := by + simpa [Dstar, D, e] using + diagonal_starInvSqrtDiag_eq_reindex_fullBlockInvSqrtDiag (d := d) b c + have hM : + toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar) = + Matrix.reindex e e M := by + rw [toFullBlockMat_blockReflect_eq_reindex_swap A, + toFullBlockMat_blockReflect_eq_reindex_swap Abar] + ext α β + rfl + calc + Dstar * (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar)) * Dstar = + Matrix.reindex e e D * Matrix.reindex e e M * Matrix.reindex e e D := by + rw [hD, hM] + _ = Matrix.reindex e e (D * M) * Matrix.reindex e e D := by + rw [← reindex_swap_mul] + _ = Matrix.reindex e e ((D * M) * D) := by + rw [← reindex_swap_mul] + _ = Matrix.reindex e e (D * (toFullBlockMat A - toFullBlockMat Abar) * D) := by + rfl + +private theorem starInvSqrtDiag_mul_starSqrtDiag {d : ℕ} {b c : ℝ} + (hb : 0 < b) (hc : 0 < c) : + Matrix.diagonal (starInvSqrtDiag (d := d) b c) * + Matrix.diagonal (starSqrtDiag b c) = 1 := by + rw [Matrix.diagonal_mul_diagonal] + ext α β + by_cases h : α = β + · subst β + cases α + · simp [starInvSqrtDiag, starSqrtDiag, ne_of_gt (Real.sqrt_pos_of_pos hc)] + · simp [starInvSqrtDiag, starSqrtDiag, ne_of_gt (Real.sqrt_pos_of_pos hb)] + · simp [Matrix.diagonal, h] + +private theorem norm_sq_starInvSqrtDiag_mulVec_toFullBlockVec + {d : ℕ} {b c : ℝ} (hb : 0 < b) (hc : 0 < c) (X : BlockVec d) : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starInvSqrtDiag (d := d) b c)) (toFullBlockVec X)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + c * vecNormSq X.1 + b⁻¹ * vecNormSq X.2 := by + rw [PiLp.norm_sq_eq_of_L2, Fintype.sum_sum_type] + rcases X with ⟨x, y⟩ + simp [starInvSqrtDiag, toFullBlockVec, Matrix.mulVec, vecNormSq, vecDot, + abs_of_nonneg (Real.sqrt_nonneg c), abs_of_nonneg (Real.sqrt_nonneg b)] + simp_rw [mul_pow, sq_abs, inv_pow] + rw [Real.sq_sqrt hc.le] + have hs : (√b) ^ 2 = b := Real.sq_sqrt hb.le + rw [hs] + rw [← Finset.mul_sum, ← Finset.mul_sum] + field_simp [ne_of_gt hb] + +private theorem norm_sq_starSqrtDiag_mulVec_toFullBlockVec + {d : ℕ} {b c : ℝ} (hb : 0 < b) (hc : 0 < c) (X : BlockVec d) : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) (toFullBlockVec X)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + c⁻¹ * vecNormSq X.1 + b * vecNormSq X.2 := by + rw [PiLp.norm_sq_eq_of_L2, Fintype.sum_sum_type] + rcases X with ⟨x, y⟩ + simp [starSqrtDiag, toFullBlockVec, Matrix.mulVec, vecNormSq, vecDot, + abs_of_nonneg (Real.sqrt_nonneg c), abs_of_nonneg (Real.sqrt_nonneg b)] + simp_rw [mul_pow, sq_abs, inv_pow] + have hc_sq : (√c) ^ 2 = c := Real.sq_sqrt hc.le + rw [hc_sq, Real.sq_sqrt hb.le] + rw [← Finset.mul_sum, ← Finset.mul_sum] + field_simp [ne_of_gt hc] + +private theorem normalized_mulVec_norm_sq_le + {d : ℕ} [NeZero d] {b c : ℝ} (hb : 0 < b) (hc : 0 < c) + (M : FullBlockMat d) (P : FullBlockVec d) : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starInvSqrtDiag (d := d) b c)) (Matrix.mulVec M P)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) P) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 := by + let D : FullBlockMat d := Matrix.diagonal (starInvSqrtDiag (d := d) b c) + let E : FullBlockMat d := Matrix.diagonal (starSqrtDiag (d := d) b c) + let x : PiLp 2 (fun _ : BlockCoord d => ℝ) := WithLp.toLp 2 (Matrix.mulVec E P) + let y : PiLp 2 (fun _ : BlockCoord d => ℝ) := WithLp.toLp 2 (Matrix.mulVec D (Matrix.mulVec M P)) + have hDE : D * E = 1 := starInvSqrtDiag_mul_starSqrtDiag (d := d) hb hc + have hmulVec : Matrix.mulVec D (Matrix.mulVec M P) = + Matrix.mulVec (D * M * D) (Matrix.mulVec E P) := by + symm + calc + Matrix.mulVec (D * M * D) (Matrix.mulVec E P) = + Matrix.mulVec ((D * M * D) * E) P := by + rw [Matrix.mulVec_mulVec] + _ = Matrix.mulVec (D * M * (D * E)) P := by + rw [Matrix.mul_assoc] + _ = Matrix.mulVec (D * M * 1) P := by + rw [hDE] + _ = Matrix.mulVec (D * M) P := by + rw [mul_one] + _ = Matrix.mulVec D (Matrix.mulVec M P) := by + rw [Matrix.mulVec_mulVec] + have hy : (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (D * M * D)) x = y := by + change WithLp.toLp 2 (Matrix.mulVec (D * M * D) (Matrix.mulVec E P)) = + WithLp.toLp 2 (Matrix.mulVec D (Matrix.mulVec M P)) + rw [← hmulVec] + have hnorm0 := (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (D * M * D)).le_opNorm x + rw [hy] at hnorm0 + have hsq := pow_le_pow_left₀ (norm_nonneg y) hnorm0 2 + simpa [D, E, x, y, mul_pow] using hsq + +private theorem sigma_mul_inv_star_sq_eq_theta {b c σ θ : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (hθ : θ = b * c⁻¹) : + (σ * c⁻¹) ^ 2 = θ := by + have hprod_pos : 0 < b * c := mul_pos hb hc + rw [hσ, hθ] + rw [mul_pow, Real.sq_sqrt hprod_pos.le] + field_simp [ne_of_gt hc] + +private theorem barSigma_mul_sigma_inv_eq_sigma_mul_inv_star {b c σ : ℝ} + (hb : 0 < b) (hc : 0 < c) (hσ : σ = Real.sqrt (b * c)) : + b * σ⁻¹ = σ * c⁻¹ := by + have hprod_pos : 0 < b * c := mul_pos hb hc + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos hprod_pos + rw [hσ] + have hsqrt_ne : Real.sqrt (b * c) ≠ 0 := ne_of_gt (Real.sqrt_pos_of_pos hprod_pos) + field_simp [hsqrt_ne, ne_of_gt hc] + rw [Real.sq_sqrt hprod_pos.le] + +private theorem norm_sq_starSqrtDiag_mulVec_specialBlockVec + {d : ℕ} {b c σ : ℝ} (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (e : Vec d) : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) + (toFullBlockVec (-(σ ^ (1 / 2 : ℝ) • e), σ ^ (-(1 / 2 : ℝ)) • e))) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + 2 * (σ * c⁻¹) * vecNormSq e := by + have hprod_pos : 0 < b * c := mul_pos hb hc + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos hprod_pos + have hpos_sq : (σ ^ (1 / 2 : ℝ)) ^ 2 = σ := by + calc + (σ ^ (1 / 2 : ℝ)) ^ 2 = + (σ ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (1 / 2 : ℝ)) 2).symm + _ = σ ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = σ ^ (1 : ℝ) := by + norm_num + _ = σ := by + rw [Real.rpow_one] + have hneg_sq : (σ ^ (-(1 / 2 : ℝ))) ^ 2 = σ⁻¹ := by + calc + (σ ^ (-(1 / 2 : ℝ))) ^ 2 = + (σ ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (-(1 / 2 : ℝ))) 2).symm + _ = σ ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = σ ^ (-1 : ℝ) := by + norm_num + _ = (σ ^ (1 : ℝ))⁻¹ := + Real.rpow_neg hσpos.le 1 + _ = σ⁻¹ := by + rw [Real.rpow_one] + have hnorm := + norm_sq_starSqrtDiag_mulVec_toFullBlockVec (d := d) hb hc + (-(σ ^ (1 / 2 : ℝ) • e), σ ^ (-(1 / 2 : ℝ)) • e) + have hq_norm : vecNormSq (-(σ ^ (1 / 2 : ℝ) • e)) = σ * vecNormSq e := by + have hneg : + -(σ ^ (1 / 2 : ℝ) • e) = (-(σ ^ (1 / 2 : ℝ))) • e := by + ext i + simp + rw [hneg, vecNormSq_smul] + rw [show (-(σ ^ (1 / 2 : ℝ))) ^ 2 = (σ ^ (1 / 2 : ℝ)) ^ 2 by ring] + rw [hpos_sq] + have hp_norm : vecNormSq (σ ^ (-(1 / 2 : ℝ)) • e) = σ⁻¹ * vecNormSq e := by + rw [vecNormSq_smul, hneg_sq] + calc + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) + (toFullBlockVec (-(σ ^ (1 / 2 : ℝ) • e), σ ^ (-(1 / 2 : ℝ)) • e))) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + c⁻¹ * vecNormSq (-(σ ^ (1 / 2 : ℝ) • e)) + + b * vecNormSq (σ ^ (-(1 / 2 : ℝ)) • e) := hnorm + _ = c⁻¹ * (σ * vecNormSq e) + b * (σ⁻¹ * vecNormSq e) := by + rw [hq_norm, hp_norm] + _ = 2 * (σ * c⁻¹) * vecNormSq e := by + have hbar := barSigma_mul_sigma_inv_eq_sigma_mul_inv_star hb hc hσ + calc + c⁻¹ * (σ * vecNormSq e) + b * (σ⁻¹ * vecNormSq e) = + (c⁻¹ * σ + b * σ⁻¹) * vecNormSq e := by ring + _ = (σ * c⁻¹ + σ * c⁻¹) * vecNormSq e := by + rw [hbar] + ring + _ = 2 * (σ * c⁻¹) * vecNormSq e := by ring + +private theorem weighted_blockVec_norm_sq_eq_sigma_inv_star_mul_normalized_norm_sq + {d : ℕ} {b c σ : ℝ} (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (X : BlockVec d) : + σ * vecNormSq X.1 + σ⁻¹ * vecNormSq X.2 = + (σ * c⁻¹) * + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starInvSqrtDiag (d := d) b c)) (toFullBlockVec X)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 := by + have hprod_pos : 0 < b * c := mul_pos hb hc + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos hprod_pos + have hsigma_sq : σ ^ 2 = b * c := by + rw [hσ] + exact Real.sq_sqrt hprod_pos.le + rw [norm_sq_starInvSqrtDiag_mulVec_toFullBlockVec (d := d) hb hc X] + have hcoeff : σ * c⁻¹ * b⁻¹ = σ⁻¹ := by + have hbne : b ≠ 0 := ne_of_gt hb + have hcne : c ≠ 0 := ne_of_gt hc + have hσne : σ ≠ 0 := ne_of_gt hσpos + field_simp [hbne, hcne, hσne] + nlinarith [hsigma_sq] + calc + σ * vecNormSq X.1 + σ⁻¹ * vecNormSq X.2 = + σ * vecNormSq X.1 + (σ * c⁻¹ * b⁻¹) * vecNormSq X.2 := by + rw [hcoeff] + _ = (σ * c⁻¹) * (c * vecNormSq X.1 + b⁻¹ * vecNormSq X.2) := by + field_simp [ne_of_gt hc] + +private noncomputable def reflectedNormalizedBlockFluctuationOperatorNormSqAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : ℝ := + let b := hP.barSigmaAtScale hStruct m + let c := hP.barSigmaStarAtScale hStruct m + let D : FullBlockMat d := Matrix.diagonal (starInvSqrtDiag b c) + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct m + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (D * (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar)) * D)‖ ^ 2 + +/-- Proof-internal manuscript normalized full-block fluctuation, using the +Euclidean operator norm of the full block matrix. This is exposed inside the +third-lemma proof namespace so the assembly file can state the variance term +without introducing a public Ch5 wrapper. -/ +noncomputable def fullBlockNormalizedFluctuationOperatorNormSqAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : ℝ := + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m R a + +private theorem reflectedNormalizedBlockFluctuationOperatorNormSqAtScale_eq_fullBlock + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : + reflectedNormalizedBlockFluctuationOperatorNormSqAtScale hP hStruct m R a = + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m R a := by + let b := hP.barSigmaAtScale hStruct m + let c := hP.barSigmaStarAtScale hStruct m + let D : FullBlockMat d := Matrix.diagonal (fullBlockInvSqrtDiag b c) + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct m + let e := blockCoordSwapEquiv d + have hmat : + Matrix.diagonal (starInvSqrtDiag (d := d) b c) * + (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar)) * + Matrix.diagonal (starInvSqrtDiag b c) = + Matrix.reindex e e (D * (toFullBlockMat A - toFullBlockMat Abar) * D) := by + simpa [D, e] using + reflectedNormalizedBlockFluctuationMatrix_eq_reindex_full (d := d) b c A Abar + have hnorm : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.reindex e e (D * (toFullBlockMat A - toFullBlockMat Abar) * D))‖ = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (D * (toFullBlockMat A - toFullBlockMat Abar) * D)‖ := + Ch02.norm_toEuclideanCLM_reindex_self e _ + unfold reflectedNormalizedBlockFluctuationOperatorNormSqAtScale + unfold fullBlockNormalizedFluctuationOperatorNormSqAtScale + dsimp only + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * + (toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar)) * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.reindex e e (D * (toFullBlockMat A - toFullBlockMat Abar) * D))‖ ^ 2 := by + rw [hmat] + _ = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (D * (toFullBlockMat A - toFullBlockMat Abar) * D)‖ ^ 2 := by + rw [hnorm] + +private theorem weighted_special_average_mismatch_le_reflected_normalized_block_fluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (R : TriadicCube d) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + sigmaHatAtScale hP hStruct (m : ℤ) * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e) ≤ + 2 * thetaAtScale hP hStruct (m : ℤ) * + reflectedNormalizedBlockFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a * + vecNormSq e := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := c⁻¹ • q_e - p_e + let q0_e := q_e - b • p_e + let A := coarseBlockMatrix (cubeSet R) a.toFun + let Abar := scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ) + let M : FullBlockMat d := toFullBlockMat (blockReflect A) - toFullBlockMat (blockReflect Abar) + let P_e : BlockVec d := (-q_e, p_e) + let X : BlockVec d := + (-(Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e), + -(Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e)) + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hid : X = blockMatVecMul (ofFullBlockMat M) P_e := by + simpa [X, M, P_e, p_e, q_e, p0_e, q0_e, A, Abar, b, c, σ] using + special_average_mismatch_eq_reflected_block_fluctuation hP hStruct a ha m R e + have hmulVec : Matrix.mulVec M (toFullBlockVec P_e) = toFullBlockVec X := by + calc + Matrix.mulVec M (toFullBlockVec P_e) = + toFullBlockVec (blockMatVecMul (ofFullBlockMat M) P_e) := by + rw [toFullBlockVec_blockMatVecMul] + simp [M] + _ = toFullBlockVec X := by + rw [← hid] + have hnorm_le := + normalized_mulVec_norm_sq_le (d := d) (b := b) (c := c) hb hc M (toFullBlockVec P_e) + have hnorm_le' : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starInvSqrtDiag (d := d) b c)) (toFullBlockVec X)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) (toFullBlockVec P_e)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 := by + simpa [hmulVec] using hnorm_le + have hP_norm : + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) (toFullBlockVec P_e)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + 2 * (σ * c⁻¹) * vecNormSq e := by + have h := + norm_sq_starSqrtDiag_mulVec_specialBlockVec (d := d) hb hc hσ e + simpa [P_e, p_e, q_e, specialPAtScale, specialQAtScale, σ, mul_assoc] using h + have hweight := + weighted_blockVec_norm_sq_eq_sigma_inv_star_mul_normalized_norm_sq + (d := d) hb hc hσ X + have hα_nonneg : 0 ≤ σ * c⁻¹ := by + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + exact mul_nonneg hσpos.le (inv_pos.mpr hc).le + have hmul_le := mul_le_mul_of_nonneg_left hnorm_le' hα_nonneg + have hscalar : + (σ * c⁻¹) * + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + (2 * (σ * c⁻¹) * vecNormSq e)) = + 2 * θ * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + vecNormSq e := by + have hsq := sigma_mul_inv_star_sq_eq_theta hb hc hσ hθ + calc + (σ * c⁻¹) * + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + (2 * (σ * c⁻¹) * vecNormSq e)) = + 2 * (σ * c⁻¹) ^ 2 * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + vecNormSq e := by + ring + _ = 2 * θ * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + vecNormSq e := by + rw [hsq] + calc + σ * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + σ⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e) + = σ * vecNormSq X.1 + σ⁻¹ * vecNormSq X.2 := by + simp [X] + rw [vecNormSq_sub_comm + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun) p0_e, + vecNormSq_sub_comm + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun) q0_e] + _ = (σ * c⁻¹) * + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starInvSqrtDiag (d := d) b c)) (toFullBlockVec X)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 := hweight + _ ≤ (σ * c⁻¹) * + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + ‖(WithLp.toLp 2 + (Matrix.mulVec (Matrix.diagonal (starSqrtDiag (d := d) b c)) (toFullBlockVec P_e)) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2) := hmul_le + _ = (σ * c⁻¹) * + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + (2 * (σ * c⁻¹) * vecNormSq e)) := by + rw [hP_norm] + _ = 2 * θ * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal (starInvSqrtDiag (d := d) b c) * M * + Matrix.diagonal (starInvSqrtDiag b c))‖ ^ 2 * + vecNormSq e := hscalar + _ = 2 * thetaAtScale hP hStruct (m : ℤ) * + reflectedNormalizedBlockFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a * + vecNormSq e := by + simp [reflectedNormalizedBlockFluctuationOperatorNormSqAtScale, M, A, Abar, b, c, θ, + mul_assoc] + +/-- Pointwise special-vector average mismatch controlled by the manuscript +normalized full-block fluctuation, with the Euclidean size of the special +direction left explicit. This is the robust internal form; the unit-vector +corollary below is the one currently consumed by the high-scale assembly. -/ +theorem weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation_mul_vecNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (R : TriadicCube d) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + sigmaHatAtScale hP hStruct (m : ℤ) * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e) ≤ + 2 * thetaAtScale hP hStruct (m : ℤ) * + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a * + vecNormSq e := by + simpa [reflectedNormalizedBlockFluctuationOperatorNormSqAtScale_eq_fullBlock hP hStruct + (m : ℤ) R a, mul_assoc] using + weighted_special_average_mismatch_le_reflected_normalized_block_fluctuation + hP hStruct a ha m R e hb hc + +/-- Pointwise special-vector average mismatch controlled by the manuscript +normalized full-block fluctuation for Euclidean-unit directions. This remains +a theorem in the coarse-fluctuation proof namespace, not a new public theorem +package. -/ +theorem weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (R : TriadicCube d) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + sigmaHatAtScale hP hStruct (m : ℤ) * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e) ≤ + 2 * thetaAtScale hP hStruct (m : ℤ) * + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a := by + simpa [reflectedNormalizedBlockFluctuationOperatorNormSqAtScale_eq_fullBlock hP hStruct + (m : ℤ) R a, he, mul_assoc] using + weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation_mul_vecNormSq + hP hStruct a ha m R e hb hc + +/-- Descendant-averaged special-vector average mismatch controlled by the +manuscript normalized full-block fluctuation, with the Euclidean direction +size explicit. -/ +theorem descendantsAverage_weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation_mul_vecNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + descendantsAverage Q j + (fun R => + sigmaHatAtScale hP hStruct (m : ℤ) * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e)) ≤ + descendantsAverage Q j + (fun R => + 2 * thetaAtScale hP hStruct (m : ℤ) * + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a * + vecNormSq e) := by + dsimp only + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact + weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation_mul_vecNormSq + hP hStruct a ha m R e hb hc + +/-- Descendant-averaged special-vector average mismatch controlled by the +manuscript normalized full-block fluctuation. -/ +theorem descendantsAverage_weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + descendantsAverage Q j + (fun R => + sigmaHatAtScale hP hStruct (m : ℤ) * + vecNormSq (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + vecNormSq (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e)) ≤ + descendantsAverage Q j + (fun R => + 2 * thetaAtScale hP hStruct (m : ℤ) * + fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct (m : ℤ) R a) := by + dsimp only + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact + weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation + hP hStruct a ha m R e hb hc he + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CutoffOscillationUniform.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CutoffOscillationUniform.lean new file mode 100644 index 0000000000..4a0a7593d8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/CutoffOscillationUniform.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion + +/-! # Cutoff Oscillation Uniform -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +/-! +# Uniform cutoff-oscillation absorption + +This file removes the non-uniform ratio argument from the cutoff-oscillation +term in the third Section 5.3 lemma. +-/ + +noncomputable section + +private theorem two_mul_beta_le_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 2 * section53CoarseFluctuationBeta hP4 ≤ 1 := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hupper := hP4.sUpper_nonneg + have hlower := hP4.sLower_nonneg + have hbeta := section53CoarseFluctuationBeta_nonneg hP4 + nlinarith + +private theorem cutoff_decay_le_low_tail_decay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (N : ℕ) : + ((3 : ℝ) ^ N)⁻¹ ≤ + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * (N : ℝ)) := by + have htwo : 2 * section53CoarseFluctuationBeta hP4 ≤ 1 := + two_mul_beta_le_one hP4 + have hN_nonneg : 0 ≤ (N : ℝ) := by positivity + have hexp : + -(N : ℝ) ≤ + -2 * section53CoarseFluctuationBeta hP4 * (N : ℝ) := by + nlinarith + have hrpow : + Real.rpow (3 : ℝ) (-(N : ℝ)) ≤ + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * (N : ℝ)) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hexp + have hpow_pos : 0 < (3 : ℝ) ^ N := pow_pos (by norm_num) N + have hpow_eq : ((3 : ℝ) ^ N)⁻¹ = Real.rpow (3 : ℝ) (-(N : ℝ)) := by + calc + ((3 : ℝ) ^ N)⁻¹ = (Real.rpow (3 : ℝ) (N : ℝ))⁻¹ := by + simp [Real.rpow_natCast] + _ = Real.rpow (3 : ℝ) (-(N : ℝ)) := by + exact (Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3) (N : ℝ)).symm + rw [hpow_eq] + exact hrpow + +private theorem cutoffCoeff_le_uniform_low_tail_coeff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) {k m : ℕ} (hkm : k < m) + {ε : ℝ} (hε : 0 < ε) (hε_le : ε ≤ 1) : + let β := section53CoarseFluctuationBeta hP4 + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j + ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * β * (((m - k : ℕ) : ℝ))) := by + intro β Q j + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hε_inv_ge_one : 1 ≤ ε⁻¹ := by + exact (one_le_inv₀ hε).mpr hε_le + have hβ_sq_inv_ge_one : 1 ≤ (β ^ 2)⁻¹ := by + have hβ_le_one : β ≤ 1 := by + have htwo := two_mul_beta_le_one hP4 + have hβ_nonneg : 0 ≤ β := hβ_pos.le + nlinarith + have hsquare_le_one : β ^ 2 ≤ 1 := by + nlinarith + exact (one_le_inv₀ (sq_pos_of_pos hβ_pos)).mpr hsquare_le_one + have hosc := + JUpperBoundWeakNorms.section53CutoffOscillationConstant_mul_scaleSep_eq Q j + have hbound := JUpperBoundWeakNorms.section53CutoffBound_le_two_pow_card Q + have hgrad_nonneg := quantitativeCubeCutoffGradientConst_nonneg d + have htwo_pow_nonneg : 0 ≤ (2 : ℝ) ^ d := pow_nonneg (by norm_num) d + have hcut_base : + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j + ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ((3 : ℝ) ^ j)⁻¹ := by + calc + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j + = + (8 * quantitativeCubeCutoffGradientConst d * + JUpperBoundWeakNorms.section53CutoffBound Q) * + ((3 : ℝ) ^ j)⁻¹ := hosc + _ ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ((3 : ℝ) ^ j)⁻¹ := by + exact mul_le_mul_of_nonneg_right + (by + nlinarith [mul_le_mul_of_nonneg_left hbound + (mul_nonneg (by norm_num : 0 ≤ (8 : ℝ)) hgrad_nonneg)]) + (inv_nonneg.mpr (pow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) j)) + have hmk_nat : j = m - k := by + dsimp [j] + omega + have hdecay : + ((3 : ℝ) ^ j)⁻¹ ≤ + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by + simpa [β, hmk_nat, mul_assoc] using + cutoff_decay_le_low_tail_decay hP4 (m - k) + have hbase_nonneg : + 0 ≤ 8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d := by + exact mul_nonneg + (mul_nonneg (by norm_num) hgrad_nonneg) htwo_pow_nonneg + have htail_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have htail_le : + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) ≤ + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by + have hfac : 1 ≤ ε⁻¹ * (β ^ 2)⁻¹ := by + nlinarith [hε_inv_ge_one, hβ_sq_inv_ge_one] + calc + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + = + 1 * Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by ring + _ ≤ + (ε⁻¹ * (β ^ 2)⁻¹) * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := + mul_le_mul_of_nonneg_right hfac htail_nonneg + calc + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j + ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ((3 : ℝ) ^ j)⁻¹ := hcut_base + _ ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := + mul_le_mul_of_nonneg_left hdecay hbase_nonneg + _ ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by + calc + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + (ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ)))) := + mul_le_mul_of_nonneg_left htail_le hbase_nonneg + _ = + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by ring + +private theorem expectedResponseJCubeSet_nonneg + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (Q : TriadicCube d) (p q : Vec d) : + 0 ≤ Ch04.expectedResponseJCubeSet P Q p q := by + dsimp [Ch04.expectedResponseJCubeSet] + exact integral_nonneg fun a => by + exact Ch04.restrictionResponseJObservableCubeSet_nonneg Q p q a + +/-- Uniform cutoff-oscillation absorption. The constant is chosen before the +law, scales, vector, and `ε`. -/ +theorem cutoffOscillation_special_expectedResponse_le_lowScaleTail_uniform + {d : ℕ} [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ}, k < m → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ε : ℝ}, 0 < ε → ε ≤ 1 → + let β := section53CoarseFluctuationBeta hP4 + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j * + Ch04.expectedResponseJCubeSet P Q p_e q_e + ≤ + C * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (thetaAtScale hP hStruct (m : ℤ) - 1) := by + refine ⟨8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d, + mul_nonneg (mul_nonneg (by norm_num) (quantitativeCubeCutoffGradientConst_nonneg d)) + (pow_nonneg (by norm_num) d), ?_⟩ + intro P hP hStruct hP4 k m hkm e he ε hε hε_le + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let θ := thetaAtScale hP hStruct (m : ℤ) + have hCoeff := + cutoffCoeff_le_uniform_low_tail_coeff hP4 hkm hε hε_le + have hWeight : 1 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := + one_le_coarseFluctuationScalarWeightAtScale hP hStruct hP4 m + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hθ_sub_nonneg : 0 ≤ θ - 1 := by linarith + have hJ_le : + Ch04.expectedResponseJCubeSet P Q + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) ≤ + θ - 1 := by + simpa [Q, θ] using + expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_of_vecNormSq_eq_one + hP hStruct hP4 m e he + have hJ_nonneg : + 0 ≤ Ch04.expectedResponseJCubeSet P Q + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) := + expectedResponseJCubeSet_nonneg P Q + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + have hCoeffTail_nonneg : + 0 ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by + have hbase : + 0 ≤ 8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d := + mul_nonneg + (mul_nonneg (by norm_num) (quantitativeCubeCutoffGradientConst_nonneg d)) + (pow_nonneg (by norm_num) d) + exact mul_nonneg + (mul_nonneg + (mul_nonneg hbase (inv_nonneg.mpr hε.le)) + (inv_nonneg.mpr (sq_nonneg _))) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + calc + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j * + Ch04.expectedResponseJCubeSet P Q + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + ≤ + ((8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ)))) * + (θ - 1) := by + exact mul_le_mul hCoeff hJ_le hJ_nonneg hCoeffTail_nonneg + _ ≤ + ((8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m) * + (θ - 1) := by + exact mul_le_mul_of_nonneg_right + (by + calc + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + = + ((8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ)))) * 1 := by + ring + _ ≤ + ((8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ)))) * + coarseFluctuationScalarWeightAtScale hP hStruct m := + mul_le_mul_of_nonneg_left hWeight hCoeffTail_nonneg) + hθ_sub_nonneg + _ = + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) := by + ring + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/EllipticityMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/EllipticityMoments.lean new file mode 100644 index 0000000000..3adefa72bd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/EllipticityMoments.lean @@ -0,0 +1,568 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.MomentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.EnergyDefect + +/-! # Ellipticity Moments -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +noncomputable section + +/-! +# Ellipticity positive-excess moments for the coarse-fluctuation lemma + +This file contains the internal Holder conversion for the lower and upper +positive-excess ellipticity factors appearing in the third Section 5.3 lemma. +-/ + +theorem holderConjugate_xi_section53CoarseFluctuationZeta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP4.xi : ℝ).HolderConjugate (section53CoarseFluctuationZeta hP4) where + inv_add_inv_eq_inv := by + simpa using inv_xi_add_inv_section53CoarseFluctuationZeta hP4 + left_pos := by + exact_mod_cast hP4.xi_pos + right_pos := section53CoarseFluctuationZeta_pos hP4 + +theorem memLp_of_integrable_nonneg_nat_pow + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 0 < ξ) (hX_aemeas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hX_int : Integrable (fun a => X a ^ ξ) P) : + MemLp X (ENNReal.ofReal (ξ : ℝ)) P := by + have hξ_ne : ξ ≠ 0 := Nat.ne_of_gt hξ + have hnorm_int : Integrable (fun a => ‖X a‖ ^ ξ) P := by + refine hX_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + rw [Real.norm_of_nonneg ha] + have hmem : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff + hX_aemeas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.rpow_natCast] using hnorm_int + simpa using hmem + +private theorem memLp_of_integrable_nonneg_rpow + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {p : ℝ} {X : RegCoeffField d → ℝ} + (hp : 0 < p) (hX_aemeas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hX_int : Integrable (fun a => Real.rpow (X a) p) P) : + MemLp X (ENNReal.ofReal p) P := by + have hnorm_int : + Integrable (fun a => ‖X a‖ ^ (ENNReal.ofReal p).toReal) P := by + refine hX_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + rw [Real.norm_of_nonneg ha, ENNReal.toReal_ofReal hp.le, Real.rpow_eq_pow] + rw [← MeasureTheory.integrable_norm_rpow_iff + hX_aemeas.aestronglyMeasurable + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp]) + (by simp)] + exact hnorm_int + +theorem shiftedUpperDecay_le_betaDecay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + Real.rpow (3 : ℝ) + (-((hP4.sUpper + β) - (d : ℝ) / (hP4.xi : ℝ)) * (m : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hβ_le : β ≤ hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + simpa [β] using section53CoarseFluctuationBeta_le_sUpper_sub_dim_div_xi hP4 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + +theorem shiftedLowerDecay_le_betaDecay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + Real.rpow (3 : ℝ) + (-((hP4.sLower + β) - (d : ℝ) / (hP4.xi : ℝ)) * (m : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hβ_le : β ≤ hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + simpa [β] using section53CoarseFluctuationBeta_le_sLower_sub_dim_div_xi hP4 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + +private theorem shiftedMomentDenom_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) {r : ℝ} (hr : r < 1) : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - r := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg hd_nonneg hxi_nonneg + linarith + +theorem section52MomentLossCoeff_nonneg_at_shift + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) {s r : ℝ} + (_hs : 0 < s) (_hsr : s < r) (hr : r < 1) : + 0 ≤ section52MomentLossCoeff d hP4.xi s r := by + unfold section52MomentLossCoeff + have hden : 0 ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - r := + (shiftedMomentDenom_pos hP4 hr).le + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + exact mul_nonneg (sq_nonneg _) + (add_nonneg (div_nonneg hxi_nonneg hden) (sq_nonneg _)) + +private theorem int_toNat_sub_add_toNat_sub + {k n m : ℤ} (hkn : k ≤ n) (hnm : n ≤ m) : + Int.toNat (m - n) + Int.toNat (n - k) = Int.toNat (m - k) := by + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hnm + have hnk_nonneg : 0 ≤ n - k := sub_nonneg.mpr hkn + have hmk_nonneg : 0 ≤ m - k := sub_nonneg.mpr (hkn.trans hnm) + have hcast : + ((Int.toNat (m - n) + Int.toNat (n - k) : ℕ) : ℤ) = + ((Int.toNat (m - k) : ℕ) : ℤ) := by + rw [Nat.cast_add, Int.toNat_of_nonneg hmn_nonneg, + Int.toNat_of_nonneg hnk_nonneg, Int.toNat_of_nonneg hmk_nonneg] + ring + exact_mod_cast hcast + +private theorem sum_range_to_Icc_descending {k m : ℤ} (hkm : k ≤ m) + (F : ℕ → ℝ) : + (∑ j ∈ Finset.range (Int.toNat (m - k)), F j) = + ∑ n ∈ Finset.Icc (k + 1) m, F (Int.toNat (m - n)) := by + classical + refine Finset.sum_bij (fun j _hj => m - (j : ℤ)) ?_ ?_ ?_ ?_ + · intro j hj + have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hj_lt_nat : j < Int.toNat (m - k) := Finset.mem_range.mp hj + have hj_lt : (j : ℤ) < m - k := by + have hj_lt' : (j : ℤ) < ((Int.toNat (m - k) : ℕ) : ℤ) := by + exact_mod_cast hj_lt_nat + simpa [hL] using hj_lt' + simp only [Finset.mem_Icc] + constructor <;> omega + · intro j₁ _hj₁ j₂ _hj₂ h + have h' : m - (j₁ : ℤ) = m - (j₂ : ℤ) := by simpa using h + have hcast : (j₁ : ℤ) = (j₂ : ℤ) := by omega + exact_mod_cast hcast + · intro n hn + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + refine ⟨Int.toNat (m - n), ?_, ?_⟩ + · have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hmn_lt : m - n < m - k := by omega + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + apply Finset.mem_range.mpr + have hcast : ((Int.toNat (m - n) : ℕ) : ℤ) < + ((Int.toNat (m - k) : ℕ) : ℤ) := by + simpa [hto, hL] using hmn_lt + exact_mod_cast hcast + · have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + change m - ((Int.toNat (m - n) : ℕ) : ℤ) = n + rw [hto] + omega + · intro j _hj + have harg : Int.toNat (m - (m - (j : ℤ))) = j := by + have hsub : m - (m - (j : ℤ)) = (j : ℤ) := by ring + simp [hsub] + exact congrArg F harg.symm + +private theorem sum_Icc_betaWeight_le_five_beta_inv + {k m : ℤ} (hkm : k ≤ m) {β : ℝ} (hβ : 0 < β) (hβ_le : β ≤ 1) : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) ≤ + 5 * β⁻¹ := by + let L : ℕ := Int.toNat (m - k) + have hsum_eq : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + simpa [L] using + (sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => Real.rpow (3 : ℝ) (-β * (j : ℝ)))).symm + have hrange_le : + (∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ))) ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + simpa only [Finset.mem_filter, and_true] using + Finset.mem_range.mpr (Nat.lt_succ_of_lt (Finset.mem_range.mp hj)) + · intro j _hj _hj_not + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom := + Homogenization.sum_filter_triadicDepthWeight_le_geometric_inv + β L (fun _j => True) hβ + have hgeom_five : + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ ≤ 5 * β⁻¹ := + Homogenization.Book.Ch02.inv_one_sub_rpow_three_neg_le_five_inv hβ hβ_le + calc + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) + = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hsum_eq + _ ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hrange_le + _ ≤ (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := hgeom + _ ≤ 5 * β⁻¹ := hgeom_five + +private theorem descendantsAverage_restrictionResponseJObservableCubeSet_mono_to_finerScale + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k n m : ℤ} (hkn : k ≤ n) (hnm : n ≤ m) (p q : Vec d) : + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) ≤ + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - n) + let l : ℕ := Int.toNat (n - k) + let F : TriadicCube d → ℝ := fun R => Ch04.restrictionResponseJObservableCubeSet R p q a + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, F R ≤ descendantsAverage R l F := by + intro R hR + have hRscaleMem : R ∈ descendantsAtScale Q n := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth Q hnm] using! hR + have hRscale : R.scale = n := scale_eq_of_mem_descendantsAtScale hRscaleMem + have hkR : k ≤ R.scale := by simpa [hRscale] using hkn + simpa [F, l, hRscale] using + Ch04.restrictionResponseJObservableCubeSet_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + ha R hkR p q + have hmono : + descendantsAverage Q j F ≤ + descendantsAverage Q j (fun R => descendantsAverage R l F) := + descendantsAverage_le_descendantsAverage Q j hpoint + have hcompose : + descendantsAverage Q j (fun R => descendantsAverage R l F) = + descendantsAverage Q (j + l) F := by + exact (descendantsAverage_add_eq_descendantsAverage_descendantsAverage Q j l F).symm + have hjl : j + l = Int.toNat (m - k) := by + simpa [j, l] using int_toNat_sub_add_toNat_sub hkn hnm + calc + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + = descendantsAverage Q j F := rfl + _ ≤ descendantsAverage Q j (fun R => descendantsAverage R l F) := hmono + _ = descendantsAverage Q (j + l) F := hcompose + _ = descendantsAverage Q (Int.toNat (m - k)) F := by rw [hjl] + _ = + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := rfl + +private theorem responseDefectAverageAtScale_le_childResponseAverageAtScale + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k n m : ℤ} (hkn : k ≤ n) (hnm : n ≤ m) (p q : Vec d) : + WeakNormsMaximizer.responseDefectAverageAtScale m n p q a ≤ + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + have hparent_nonneg : + 0 ≤ Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a := + Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d m) p q a + have hdef_le : + WeakNormsMaximizer.responseDefectAverageAtScale m n p q a ≤ + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + have hparent_nonneg' : + 0 ≤ ResponseJ (cubeSet (originCube d m)) p q a := by + simpa [Ch04.restrictionResponseJObservableCubeSet] using hparent_nonneg + dsimp [WeakNormsMaximizer.responseDefectAverageAtScale] + linarith + exact hdef_le.trans + (descendantsAverage_restrictionResponseJObservableCubeSet_mono_to_finerScale + ha hkn hnm p q) + +theorem sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_childResponseAverageAtScale + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (_hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {β : ℝ} (hβ : 0 < β) (hβ_le : β ≤ 1) (p q : Vec d) : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 + ≤ + (5 * β⁻¹) ^ 2 * + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + let S : Finset ℤ := Finset.Icc (k + 1) m + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) + let D : ℤ → ℝ := + fun n => WeakNormsMaximizer.responseDefectAverageAtScale m n p q a + let childK : ℝ := + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + have hw : ∀ n ∈ S, 0 ≤ w n := by + intro n _hn + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hIndex : ∀ n ∈ S, k ≤ n ∧ n ≤ m := by + intro n hn + have hn' := Finset.mem_Icc.mp hn + constructor + · linarith + · exact hn'.2 + have hD_nonneg : ∀ n ∈ S, 0 ≤ D n := by + intro n hn + exact WeakNormsMaximizer.responseDefectAverageAtScale_nonneg_of_aelocallyUniformlyEllipticField + a ha m n p q + have hD_le_child : ∀ n ∈ S, D n ≤ childK := by + intro n hn + exact responseDefectAverageAtScale_le_childResponseAverageAtScale + ha (hIndex n hn).1 (hIndex n hn).2 p q + have hchild_nonneg : 0 ≤ childK := by + dsimp [childK] + exact JUpperBoundWeakNorms.descendantsAverage_restrictionResponseJObservableCubeSet_nonneg + (originCube d m) (Int.toNat (m - k)) p q a + have hCauchy := + sq_sum_mul_sqrt_le_sum_mul_sum_mul S w D hw hD_nonneg + have hsumD : + ∑ n ∈ S, w n * D n ≤ (∑ n ∈ S, w n) * childK := by + calc + ∑ n ∈ S, w n * D n + ≤ ∑ n ∈ S, w n * childK := + Finset.sum_le_sum fun n hn => + mul_le_mul_of_nonneg_left (hD_le_child n hn) (hw n hn) + _ = (∑ n ∈ S, w n) * childK := by + rw [Finset.sum_mul] + have hsum_nonneg : 0 ≤ ∑ n ∈ S, w n := + Finset.sum_nonneg hw + have hsum_le : (∑ n ∈ S, w n) ≤ 5 * β⁻¹ := by + simpa [S, w] using + sum_Icc_betaWeight_le_five_beta_inv + (k := k) (m := m) hkm hβ hβ_le + have hfive_nonneg : 0 ≤ 5 * β⁻¹ := + mul_nonneg (by norm_num) (inv_nonneg.mpr hβ.le) + calc + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ)) * + Real.sqrt (WeakNormsMaximizer.responseDefectAverageAtScale m n p q a)) ^ 2 + = + (∑ n ∈ S, w n * Real.sqrt (D n)) ^ 2 := rfl + _ ≤ (∑ n ∈ S, w n) * ∑ n ∈ S, w n * D n := hCauchy + _ ≤ (∑ n ∈ S, w n) * ((∑ n ∈ S, w n) * childK) := + mul_le_mul_of_nonneg_left hsumD hsum_nonneg + _ = (∑ n ∈ S, w n) ^ 2 * childK := by ring + _ ≤ (5 * β⁻¹) ^ 2 * childK := by + have habs : |∑ n ∈ S, w n| ≤ |5 * β⁻¹| := by + rwa [abs_of_nonneg hsum_nonneg, abs_of_nonneg hfive_nonneg] + exact mul_le_mul_of_nonneg_right + (sq_le_sq.mpr habs) hchild_nonneg + +/-- Holder conversion for the lower inverse ellipticity positive-excess term. -/ +theorem lowerPositiveExcess_responseJ_expectation_le_of_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) + (hLowerPowInt : + let β := section53CoarseFluctuationBeta hP4 + let rLower := hP4.sLower + β + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) + (hResponsePowInt : + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Integrable + (fun a : RegCoeffField d => + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ) P) : + let β := section53CoarseFluctuationBeta hP4 + let rLower := hP4.sLower + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∫ a, + (max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) * + Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a ∂P + ≤ + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let ζ := section53CoarseFluctuationZeta hP4 + let rLower := hP4.sLower + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let J : RegCoeffField d → ℝ := + fun a => Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hrLower_pos : 0 < rLower := by + dsimp [rLower, β] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have hLower_aemeas : AEMeasurable lowerExcess P := by + exact + ((hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (m : ℤ)) hrLower_pos).sub aemeasurable_const).max + aemeasurable_const + have hLower_nonneg : ∀ᵐ a ∂P, 0 ≤ lowerExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hLower_mem : + MemLp lowerExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := by + exact + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hLower_aemeas + hLower_nonneg (by simpa [lowerExcess, rLower, β] using hLowerPowInt) + have hJ_aemeas : AEMeasurable J P := by + simpa [J] using! + hP.aemeasurable_restrictionResponseJObservableCubeSet + (originCube d (k : ℤ)) p_e q_e + have hJ_nonneg : ∀ᵐ a ∂P, 0 ≤ J a := by + filter_upwards with a + exact Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a + have hJ_mem : MemLp J (ENNReal.ofReal ζ) P := by + exact + memLp_of_integrable_nonneg_rpow hζ_pos hJ_aemeas hJ_nonneg + (by simpa [J, ζ, p_e, q_e] using hResponsePowInt) + have hHolder := + integral_mul_le_Lp_mul_Lq_of_nonneg + (μ := P) (holderConjugate_xi_section53CoarseFluctuationZeta hP4) + hLower_nonneg hJ_nonneg hLower_mem hJ_mem + simpa [lowerExcess, J, lambdaInvPositiveExcessMomentAtScale, + Ch04.annealedMomentRoot, coarseFluctuationResponseMomentAtScale, + rLower, β, ζ, p_e, q_e, one_div, Real.rpow_natCast] using hHolder + +/-- Holder conversion for the upper ellipticity positive-excess term. -/ +theorem upperPositiveExcess_responseJ_expectation_le_of_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) + (hUpperPowInt : + let β := section53CoarseFluctuationBeta hP4 + let rUpper := hP4.sUpper + β + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hResponsePowInt : + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Integrable + (fun a : RegCoeffField d => + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ) P) : + let β := section53CoarseFluctuationBeta hP4 + let rUpper := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∫ a, + (max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) * + Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a ∂P + ≤ + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let ζ := section53CoarseFluctuationZeta hP4 + let rUpper := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let J : RegCoeffField d → ℝ := + fun a => Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hrUpper_pos : 0 < rUpper := by + dsimp [rUpper, β] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hUpper_aemeas : AEMeasurable upperExcess P := by + exact + ((hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (m : ℤ)) hrUpper_pos).sub aemeasurable_const).max + aemeasurable_const + have hUpper_nonneg : ∀ᵐ a ∂P, 0 ≤ upperExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hUpper_mem : + MemLp upperExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := by + exact + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hUpper_aemeas + hUpper_nonneg (by simpa [upperExcess, rUpper, β] using hUpperPowInt) + have hJ_aemeas : AEMeasurable J P := by + simpa [J] using! + hP.aemeasurable_restrictionResponseJObservableCubeSet + (originCube d (k : ℤ)) p_e q_e + have hJ_nonneg : ∀ᵐ a ∂P, 0 ≤ J a := by + filter_upwards with a + exact Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a + have hJ_mem : MemLp J (ENNReal.ofReal ζ) P := by + exact + memLp_of_integrable_nonneg_rpow hζ_pos hJ_aemeas hJ_nonneg + (by simpa [J, ζ, p_e, q_e] using hResponsePowInt) + have hHolder := + integral_mul_le_Lp_mul_Lq_of_nonneg + (μ := P) (holderConjugate_xi_section53CoarseFluctuationZeta hP4) + hUpper_nonneg hJ_nonneg hUpper_mem hJ_mem + simpa [upperExcess, J, LambdaPositiveExcessMomentAtScale, + Ch04.annealedMomentRoot, coarseFluctuationResponseMomentAtScale, + rUpper, β, ζ, p_e, q_e, one_div, Real.rpow_natCast] using hHolder + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FinalRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FinalRHS.lean new file mode 100644 index 0000000000..9cee84fb7f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FinalRHS.lean @@ -0,0 +1,521 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedWeakNormSquares +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LinearProductAbsorption +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CutoffOscillationUniform +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormSquareIntegrability + +/-! # Final RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Final RHS conversion for the coarse-fluctuation lemma + +This proof-internal file collects the already proved expectation estimates into +the manuscript coarse-fluctuation RHS. +-/ + +noncomputable section + +attribute [local irreducible] specialWeakNormManuscriptRHSAtScale + coarseFluctuationManuscriptRHSAtScale + +private theorem firstTermCoeff_le_dimensional + {d : ℕ} (Q : TriadicCube d) : + 2 * (1 + JUpperBoundWeakNorms.section53CutoffBound Q) ≤ + 2 * (1 + (2 : ℝ) ^ d) := by + have hB := JUpperBoundWeakNorms.section53CutoffBound_le_two_pow_card Q + nlinarith + +private theorem firstTermCoeff_dimensional_nonneg (d : ℕ) : + 0 ≤ 2 * (1 + (2 : ℝ) ^ d) := by + positivity + +private theorem finalRHS_linear_pair + {LinProd Center Pairs Ssum CLin CPair ε : ℝ} + (hCLin_nonneg : 0 ≤ CLin) (hε_inv_nonneg : 0 ≤ ε⁻¹) + (hLin : LinProd ≤ CLin * ε * Center + CLin * ε⁻¹ * Pairs) + (hPair : Pairs ≤ CPair * Ssum) : + LinProd ≤ CLin * ε * Center + (CLin * CPair) * ε⁻¹ * Ssum := by + have hpair_term : + CLin * ε⁻¹ * Pairs ≤ (CLin * CPair) * ε⁻¹ * Ssum := by + calc + CLin * ε⁻¹ * Pairs ≤ CLin * ε⁻¹ * (CPair * Ssum) := by + exact mul_le_mul_of_nonneg_left hPair + (mul_nonneg hCLin_nonneg hε_inv_nonneg) + _ = (CLin * CPair) * ε⁻¹ * Ssum := by ring + calc + LinProd ≤ CLin * ε * Center + CLin * ε⁻¹ * Pairs := hLin + _ ≤ CLin * ε * Center + (CLin * CPair) * ε⁻¹ * Ssum := + by nlinarith [hpair_term] + +private theorem finalRHS_osc_pair + {D Ssum COsc CLin CPair C ε : ℝ} + (hε_inv_nonneg : 0 ≤ ε⁻¹) (hS_nonneg : 0 ≤ Ssum) + (hD_le_Ssum : D ≤ Ssum) (hCOsc_nonneg : 0 ≤ COsc) + (hCOscPair_le : COsc + CLin * CPair ≤ C) : + COsc * ε⁻¹ * D + (CLin * CPair) * ε⁻¹ * Ssum ≤ + C * ε⁻¹ * Ssum := by + have hleft : + COsc * ε⁻¹ * D ≤ COsc * ε⁻¹ * Ssum := by + exact mul_le_mul_of_nonneg_left hD_le_Ssum + (mul_nonneg hCOsc_nonneg hε_inv_nonneg) + have hsum : + COsc * ε⁻¹ * Ssum + (CLin * CPair) * ε⁻¹ * Ssum ≤ + C * ε⁻¹ * Ssum := by + have hcoeff : + (COsc + CLin * CPair) * (ε⁻¹ * Ssum) ≤ + C * (ε⁻¹ * Ssum) := by + exact mul_le_mul_of_nonneg_right hCOscPair_le + (mul_nonneg hε_inv_nonneg hS_nonneg) + calc + COsc * ε⁻¹ * Ssum + (CLin * CPair) * ε⁻¹ * Ssum = + (COsc + CLin * CPair) * (ε⁻¹ * Ssum) := by ring + _ ≤ C * (ε⁻¹ * Ssum) := hcoeff + _ = C * ε⁻¹ * Ssum := by ring + have hleftsum : + COsc * ε⁻¹ * D + (CLin * CPair) * ε⁻¹ * Ssum ≤ + COsc * ε⁻¹ * Ssum + (CLin * CPair) * ε⁻¹ * Ssum := + by nlinarith [hleft] + exact hleftsum.trans hsum + +private theorem finalRHS_first_center + {first T Center CLin C ε : ℝ} + (hT_nonneg : 0 ≤ T) (hCenter_nonneg : 0 ≤ Center) + (hε_nonneg : 0 ≤ ε) (hfirst_le : first ≤ C) + (hCLin_le : CLin ≤ C) : + first * T + CLin * ε * Center ≤ C * T + C * ε * Center := by + have hfirst : first * T ≤ C * T := + mul_le_mul_of_nonneg_right hfirst_le hT_nonneg + have hcenter : CLin * ε * Center ≤ C * ε * Center := by + calc + CLin * ε * Center = CLin * (ε * Center) := by ring + _ ≤ C * (ε * Center) := + mul_le_mul_of_nonneg_right hCLin_le + (mul_nonneg hε_nonneg hCenter_nonneg) + _ = C * ε * Center := by ring + exact add_le_add hfirst hcenter + +private theorem finalRHS_combine_three + {A B C D E Y Z : ℝ} + (hB : B ≤ D + (C + E)) (hA : A + C ≤ Y) (hD : D + E ≤ Z) : + A + B ≤ Y + Z := by + calc + A + B ≤ A + (D + (C + E)) := add_le_add (le_refl A) hB + _ = (A + C) + (D + E) := by + rw [add_comm D (C + E)] + rw [add_assoc C E D] + rw [add_comm E D] + rw [← add_assoc A C (D + E)] + _ ≤ Y + Z := add_le_add hA hD + +private theorem finalRHS_bound + {first T Osc LinProd COsc ε D CLin Center CPair Pairs Ssum C : ℝ} + (hCLin_nonneg : 0 ≤ CLin) (hε_inv_nonneg : 0 ≤ ε⁻¹) + (hLin' : LinProd ≤ CLin * ε * Center + CLin * ε⁻¹ * Pairs) + (hPair' : Pairs ≤ CPair * Ssum) + (hS_nonneg : 0 ≤ Ssum) (hD_le_Ssum : D ≤ Ssum) + (hCOsc_nonneg : 0 ≤ COsc) (hCOscPair_le : COsc + CLin * CPair ≤ C) + (hOsc' : Osc ≤ COsc * ε⁻¹ * D) + (hT_nonneg : 0 ≤ T) (hCenter_nonneg : 0 ≤ Center) + (hε_nonneg : 0 ≤ ε) (hFirstCoeff_le : first ≤ C) (hCLin_le : CLin ≤ C) : + first * T + Osc + LinProd ≤ C * T + C * ε * Center + C * ε⁻¹ * Ssum := by + have hLinPair := + finalRHS_linear_pair hCLin_nonneg hε_inv_nonneg hLin' hPair' + have hOscPair := + finalRHS_osc_pair hε_inv_nonneg hS_nonneg hD_le_Ssum hCOsc_nonneg + hCOscPair_le + have hosc_lin : + Osc + LinProd ≤ + COsc * ε⁻¹ * D + + (CLin * ε * Center + (CLin * CPair) * ε⁻¹ * Ssum) := + add_le_add hOsc' hLinPair + have hfirst_center := + finalRHS_first_center hT_nonneg hCenter_nonneg hε_nonneg hFirstCoeff_le hCLin_le + have hcombine : + first * T + + (Osc + LinProd) ≤ + (C * T + C * ε * Center) + C * ε⁻¹ * Ssum := + finalRHS_combine_three hosc_lin hfirst_center hOscPair + simpa [add_assoc] using hcombine + +private theorem finalRHS_sum_four_nonneg + {A B R D : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (hR : 0 ≤ R) (hD : 0 ≤ D) : + 0 ≤ A + B + R + D := by + nlinarith + +private theorem finalRHS_fourth_le_sum_four + {A B R D : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (hR : 0 ≤ R) : + D ≤ A + B + R + D := by + nlinarith + +private theorem finalRHS_constant_nonneg + {CFirst COsc CLin CPair : ℝ} + (hCFirst : 0 ≤ CFirst) (hCOsc : 0 ≤ COsc) (hCLin : 0 ≤ CLin) + (hCPair : 0 ≤ CPair) : + 0 ≤ CFirst + COsc + CLin + CLin * CPair + 1 := by + have hprod : 0 ≤ CLin * CPair := mul_nonneg hCLin hCPair + nlinarith + +private theorem finalRHS_firstCoeff_le_constant + {first CFirst COsc CLin CPair : ℝ} + (hfirst : first ≤ CFirst) (hCOsc : 0 ≤ COsc) (hCLin : 0 ≤ CLin) + (hCPair : 0 ≤ CPair) : + first ≤ CFirst + COsc + CLin + CLin * CPair + 1 := by + have hprod : 0 ≤ CLin * CPair := mul_nonneg hCLin hCPair + nlinarith + +private theorem finalRHS_oscPairCoeff_le_constant + {CFirst COsc CLin CPair : ℝ} + (hCFirst : 0 ≤ CFirst) (hCLin : 0 ≤ CLin) : + COsc + CLin * CPair ≤ CFirst + COsc + CLin + CLin * CPair + 1 := by + nlinarith + +private theorem finalRHS_linearCoeff_le_constant + {CFirst COsc CLin CPair : ℝ} + (hCFirst : 0 ≤ CFirst) (hCOsc : 0 ≤ COsc) (hCLin : 0 ≤ CLin) + (hCPair : 0 ≤ CPair) : + CLin ≤ CFirst + COsc + CLin + CLin * CPair + 1 := by + have hprod : 0 ≤ CLin * CPair := mul_nonneg hCLin hCPair + nlinarith + +private theorem specialWeakNormManuscriptRHSAtScale_eq_decomp + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e = + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let G := ∫ a, (gradWeak a) ^ 2 ∂P + let F := ∫ a, (fluxWeak a) ^ 2 ∂P + let T := + Real.sqrt (tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + let Osc := + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j * + Ch04.expectedResponseJCubeSet P Q p_e q_e + let LinProd := + (1 / 2 : ℝ) * ‖q0_e‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q s)) * + ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0_e‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q t)) * + ∫ a, fluxWeak a ∂P) + + JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t * + (Real.sqrt G * Real.sqrt F) + (2 * (1 + JUpperBoundWeakNorms.section53CutoffBound Q)) * T + Osc + LinProd := by + unfold specialWeakNormManuscriptRHSAtScale + simp [JUpperBoundWeakNorms.jUpperWeakNormManuscriptExpectedRHSAtScale] + ring + +private theorem coarseFluctuationManuscriptRHSAtScale_eq_decomp + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C ε : ℝ) (k m : ℕ) (e : Vec d) : + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε k m e = + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let T := + Real.sqrt (tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + let Center := (Real.sqrt θ - 1) ^ 2 + let A := + β⁻¹ * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let B := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let R := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let Ssum := A + B + R + D + C * T + C * ε * Center + C * ε⁻¹ * Ssum := by + unfold coarseFluctuationManuscriptRHSAtScale + simp [mul_assoc, mul_left_comm, mul_comm] + ring + +/-- The first-lemma special-vector RHS is bounded by the final manuscript +coarse-fluctuation RHS. -/ +theorem specialWeakNormManuscriptRHSAtScale_le_coarseFluctuationManuscriptRHSAtScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ε : ℝ}, 0 < ε → ε ≤ 1 → + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e ≤ + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε k m e := by + classical + rcases cutoffOscillation_special_expectedResponse_le_lowScaleTail_uniform + (d := d) with ⟨COsc, hCOsc_nonneg, hOsc_all⟩ + rcases linearProductTerms_special_le_centering_add_pairedWeakNormSquares + (d := d) with ⟨CLin, hCLin_nonneg, hLin_all⟩ + rcases paired_weakNormSquares_special_le_coarseFluctuationTerms + params with ⟨CPair, hCPair_nonneg, hPair_all⟩ + let CFirst : ℝ := 2 * (1 + (2 : ℝ) ^ d) + let C : ℝ := CFirst + COsc + CLin + CLin * CPair + 1 + have hCFirst_nonneg : 0 ≤ CFirst := by + simpa [CFirst] using firstTermCoeff_dimensional_nonneg d + have hC_nonneg : 0 ≤ C := by + simpa [C] using + finalRHS_constant_nonneg hCFirst_nonneg hCOsc_nonneg hCLin_nonneg hCPair_nonneg + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e he ε hε hε_le + subst params + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let G := ∫ a, (gradWeak a) ^ 2 ∂P + let F := ∫ a, (fluxWeak a) ^ 2 ∂P + let T := + Real.sqrt (tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + let Center := (Real.sqrt θ - 1) ^ 2 + let A := + β⁻¹ * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let B := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let R := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let Ssum := A + B + R + D + let Osc := + JUpperBoundWeakNorms.section53CutoffOscillationConstant Q * + JUpperBoundWeakNorms.section53CutoffScaleSep Q j * + Ch04.expectedResponseJCubeSet P Q p_e q_e + let LinProd := + (1 / 2 : ℝ) * ‖q0_e‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q s)) * + ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0_e‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q t)) * + ∫ a, fluxWeak a ∂P) + + JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t * + (Real.sqrt G * Real.sqrt F) + let Pairs := σ * G + σ⁻¹ * F + have hGradSq : + Integrable (fun a : RegCoeffField d => (gradWeak a) ^ 2) P := by + have h := + integrable_specialGradientWeakNormSquare_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + unfold Internal.specialGradientWeakNormSquare at h + simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using h + have hFluxSq : + Integrable (fun a : RegCoeffField d => (fluxWeak a) ^ 2) P := by + have h := + integrable_specialFluxWeakNormSquare_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + unfold Internal.specialFluxWeakNormSquare at h + simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using h + have hOsc := hOsc_all hP hStruct hP4 hkm e he hε hε_le + have hLin := hLin_all hP hStruct hP4 hkm e he hε hε_le + (by simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using hGradSq) + (by simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using hFluxSq) + have hPair := hPair_all hP hstat hStruct hP4 rfl hkm e he + (by simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using hGradSq) + (by simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using hFluxSq) + have hOsc' : Osc ≤ COsc * ε⁻¹ * D := by + have hOsc0 : + Osc ≤ + COsc * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (θ - 1) := by + simpa [Osc, β, Q, j, p_e, q_e, θ] using hOsc + calc + Osc ≤ + COsc * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (θ - 1) := hOsc0 + _ = COsc * ε⁻¹ * D := by + simp [D] + ring + have hLin' : + LinProd ≤ CLin * ε * Center + CLin * ε⁻¹ * Pairs := by + simpa [LinProd, Pairs, Center, β, s, t, Q, p_e, q_e, p0_e, q0_e, + σ, θ, gradWeak, fluxWeak, G, F] using hLin + have hPair' : Pairs ≤ CPair * Ssum := by + simpa [Pairs, Ssum, A, B, R, D, β, s, t, Q, p_e, q_e, p0_e, q0_e, + σ, θ, gradWeak, fluxWeak, G, F] using hPair + obtain ⟨hA_nonneg, hB_nonneg, hR_nonneg, hD_nonneg⟩ := + coarseFluctuationTerms_nonneg hP hstat hStruct hP4 k m e + have hS_nonneg : 0 ≤ Ssum := by + simpa [Ssum] using + finalRHS_sum_four_nonneg hA_nonneg hB_nonneg hR_nonneg hD_nonneg + have hD_le_Ssum : D ≤ Ssum := by + simpa [Ssum] using + finalRHS_fourth_le_sum_four (D := D) hA_nonneg hB_nonneg hR_nonneg + have hT_nonneg : 0 ≤ T := by + dsimp [T] + exact mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + have hCenter_nonneg : 0 ≤ Center := by + exact sq_nonneg _ + have hε_nonneg : 0 ≤ ε := hε.le + have hε_inv_nonneg : 0 ≤ ε⁻¹ := inv_nonneg.mpr hε_nonneg + have hFirstCoeff_le : 2 * (1 + JUpperBoundWeakNorms.section53CutoffBound Q) ≤ C := by + have hdim := firstTermCoeff_le_dimensional Q + simpa [C, CFirst] using + finalRHS_firstCoeff_le_constant hdim hCOsc_nonneg hCLin_nonneg hCPair_nonneg + have hCOscPair_le : COsc + CLin * CPair ≤ C := by + simpa [C] using + finalRHS_oscPairCoeff_le_constant (CPair := CPair) hCFirst_nonneg hCLin_nonneg + have hCLin_le : CLin ≤ C := by + simpa [C] using + finalRHS_linearCoeff_le_constant hCFirst_nonneg hCOsc_nonneg hCLin_nonneg + hCPair_nonneg + have hSpecial_eq : + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e = + (2 * (1 + JUpperBoundWeakNorms.section53CutoffBound Q)) * T + + Osc + LinProd := by + simpa [β, s, t, Q, j, p_e, q_e, p0_e, q0_e, T, Osc, LinProd, G, F, + gradWeak, fluxWeak] using + specialWeakNormManuscriptRHSAtScale_eq_decomp hP hStruct hP4 k m e + have hCoarse_eq : + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε k m e = + C * T + C * ε * Center + C * ε⁻¹ * Ssum := by + simpa [T, Center, Ssum, A, B, R, D, β, p_e, q_e, θ, C] using + coarseFluctuationManuscriptRHSAtScale_eq_decomp hP hStruct hP4 C ε k m e + have hBound : + specialWeakNormManuscriptRHSAtScale hP hStruct hP4 k m e ≤ + C * T + C * ε * Center + C * ε⁻¹ * Ssum := by + rw [hSpecial_eq] + exact finalRHS_bound hCLin_nonneg hε_inv_nonneg hLin' hPair' hS_nonneg + hD_le_Ssum hCOsc_nonneg hCOscPair_le hOsc' hT_nonneg hCenter_nonneg + hε_nonneg hFirstCoeff_le hCLin_le + rw [hCoarse_eq] + exact hBound + +/-- The third Section 5.3 coarse-fluctuation lemma, assembled from the +first-lemma special-vector estimate and the final RHS conversion. -/ +theorem JUpperBoundCoarseFluctuations_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ε : ℝ}, 0 < ε → ε ≤ 1 → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e ≤ + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε k m e := by + classical + rcases + specialWeakNormManuscriptRHSAtScale_le_coarseFluctuationManuscriptRHSAtScale + params with + ⟨C, hC_nonneg, hRHS_all⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e he ε hε hε_le + subst params + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + have hGradSq : + Integrable (fun a : RegCoeffField d => (gradWeak a) ^ 2) P := by + have h := + integrable_specialGradientWeakNormSquare_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + unfold Internal.specialGradientWeakNormSquare at h + simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using h + have hFluxSq : + Integrable (fun a : RegCoeffField d => (fluxWeak a) ^ 2) P := by + have h := + integrable_specialFluxWeakNormSquare_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + unfold Internal.specialFluxWeakNormSquare at h + simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using h + have hRHS := hRHS_all hP hstat hStruct hP4 rfl hkm e he hε hε_le + dsimp only + exact + (expectedCenteredResponseJAtScale_le_specialWeakNormManuscriptRHSAtScale + hP hstat hStruct hP4 hkm e + (by simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using hGradSq) + (by simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using hFluxSq)).trans hRHS + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FluctuationIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FluctuationIntegrability.lean new file mode 100644 index 0000000000..fa972cf26e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/FluctuationIntegrability.lean @@ -0,0 +1,858 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CoarseAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability + +/-! # Fluctuation Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem memLp_two_of_nonneg_pow_integrable + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 2 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a) + (hXpow_int : Integrable (fun a => X a ^ ξ) P) : + MemLp X (2 : ENNReal) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hnormpow_int : Integrable (fun a => ‖X a‖ ^ ξ) P := by + refine hXpow_int.congr ?_ + filter_upwards [hX_nonneg] with a ha + simp [Real.norm_eq_abs, abs_of_nonneg ha] + have hmem_ξ : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa using hnormpow_int + exact hmem_ξ.mono_exponent (by exact_mod_cast hξ) + +private theorem integrable_abs_sq_of_ae_abs_le_nonneg_memLp_two + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} + {X Y : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hY_nonneg : ∀ a, 0 ≤ Y a) + (hXY : ∀ᵐ a ∂P, |X a| ≤ Y a) + (hY_mem : MemLp Y (2 : ENNReal) P) : + Integrable (fun a => |X a| ^ 2) P := by + have hY_int : Integrable (fun a => |Y a| ^ 2) P := by + simpa [Real.norm_eq_abs] using hY_mem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + refine Integrable.mono' hY_int + ((hX_meas.norm.pow_const 2).aestronglyMeasurable) ?_ + filter_upwards [hXY] with a ha + have hpow : |X a| ^ 2 ≤ Y a ^ 2 := + pow_le_pow_left₀ (abs_nonneg (X a)) ha 2 + have hleft : ‖|X a| ^ 2‖ = |X a| ^ 2 := by + simp [Real.norm_eq_abs] + have hright : |Y a| ^ 2 = Y a ^ 2 := by + rw [abs_of_nonneg (hY_nonneg a)] + simpa [hleft, hright] using hpow + +private theorem blockMatVecMul_sub' + {d : ℕ} (A : BlockMat d) (X Y : BlockVec d) : + blockMatVecMul A (X - Y) = blockMatVecMul A X - blockMatVecMul A Y := by + have hneg : blockMatVecMul A (-Y) = -blockMatVecMul A Y := by + simpa using blockMatVecMul_smul A (-1) Y + rw [sub_eq_add_neg, blockMatVecMul_add, hneg] + rfl + +private theorem blockVecDot_sub_left' + {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot (X - Y) Z = blockVecDot X Z - blockVecDot Y Z := by + have hneg : blockVecDot (-Y) Z = -blockVecDot Y Z := by + simpa using blockVecDot_smul_left (-1) Y Z + rw [sub_eq_add_neg, blockVecDot_add_left, hneg] + rfl + +private theorem blockBasis_sub_pairing' + {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α - blockBasis β) + (blockMatVecMul A (blockBasis α - blockBasis β)) = + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + rw [blockMatVecMul_sub', blockVecDot_sub_left'] + rw [blockVecDot_sub_right] + rw [blockVecDot_sub_right] + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, blockBasis_pairing] + ring + +private theorem aemeasurable_blockMatEntry_coarseBlockMatrix_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) + (α β : BlockCoord d) : + AEMeasurable + (fun a : RegCoeffField d => blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet Q i j + | inr i => + cases β with + | inl j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet Q i j + | inr j => + simpa [blockMatEntry] using + hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + +private theorem blockBasis_add_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α + blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem blockBasis_sub_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α - blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) {α β : BlockCoord d} (hαβ : α ≠ β) : + |blockMatEntry A α β| ≤ + (1 / 2 : ℝ) * (blockMatEntry A α α + blockMatEntry A β β) := by + have hplus_pos := + hPos (blockBasis α + blockBasis β) (blockBasis_add_ne_zero' hαβ) + have hminus_pos := + hPos (blockBasis α - blockBasis β) (blockBasis_sub_ne_zero' hαβ) + have hplus : + 0 < + blockMatEntry A α α + blockMatEntry A α β + + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sum_pairing] using hplus_pos + have hminus : + 0 < + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sub_pairing'] using hminus_pos + have hsymm : blockMatEntry A β α = blockMatEntry A α β := (hSymm α β).symm + rw [abs_le] + constructor <;> nlinarith + +private theorem blockMatEntry_abs_le_factor_sum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) + {sUpper sLower : ℝ} (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + (α β : BlockCoord d) : + (fun a : RegCoeffField d => + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β|) ≤ᵐ[P] + fun a => + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hPos : Ch02.BlockPosDef (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_posDef + have hUpperEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft i j| := by + rw [hEq] + _ ≤ Ch02.coarseBMatrixNorm Q F := by + simpa [Ch02.coarseBMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft) i j + _ ≤ Ch02.LambdaSq Q sUpper (.finite 1) F := + Ch02.oneCube_b_le_LambdaSq_finite Q F hsUpper + (by norm_num : (1 : ℝ) ≤ 1) + _ = Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + simp [Ch04.LambdaSqCoeffField, ha, F] + have hLowerEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight i j| := by + rw [hEq] + _ ≤ Ch02.coarseSigmaStarInvMatrixNorm Q F := by + simpa [Ch02.coarseSigmaStarInvMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight) i j + _ ≤ (Ch02.lambdaSq Q sLower (.finite 1) F)⁻¹ := + Ch02.oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q F hsLower + (by norm_num : (1 : ℝ) ≤ 1) + _ = (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + simp [Ch04.lambdaSqCoeffField, ha, F] + have hX_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg Q a hsUpper (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hsLower (by norm_num : (1 : ℝ) ≤ 1)) + cases α with + | inl i => + cases β with + | inl j => + exact (hUpperEntry i j).trans (by linarith) + | inr j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inr j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry i i) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j) ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry j j) + linarith + | inr i => + cases β with + | inl j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inl j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) ≤ + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry i i) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j) ≤ + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry j j) + linarith + | inr j => + exact (hLowerEntry i j).trans (by linarith) + +private theorem memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (n : ℕ) (α β : BlockCoord d) : + MemLp + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d (n : ℤ))) a.toFun) α β) + (2 : ENNReal) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a + let Y : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ + have hX_meas : AEMeasurable X P := by + simpa [X, Q] using + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d (n : ℤ)) hP4.sUpper_pos + have hY_meas : AEMeasurable Y P := by + exact (hP.aemeasurable_lambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sLower_pos).inv + have hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a := + Filter.Eventually.of_forall fun a => + Ch04.LambdaSqCoeffField_finite_nonneg Q a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a := + Filter.Eventually.of_forall fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_mem2 : MemLp X (2 : ENNReal) P := + memLp_two_of_nonneg_pow_integrable hP4.two_le_xi hX_meas hX_nonneg + (by + simpa [X, Q] using + Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + have hY_mem2 : MemLp Y (2 : ENNReal) P := + memLp_two_of_nonneg_pow_integrable hP4.two_le_xi hY_meas hY_nonneg + (by + simpa [Y, Q] using + Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + have hXY_mem2 : MemLp (fun a => X a + Y a) (2 : ENNReal) P := + hX_mem2.add hY_mem2 + have hEntry_meas : + AEMeasurable + (fun a : RegCoeffField d => + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β) P := by + simpa [Q] using + aemeasurable_blockMatEntry_coarseBlockMatrix_cubeSet + hP (originCube d (n : ℤ)) α β + have hXY_nonneg : ∀ a, 0 ≤ X a + Y a := by + intro a + exact add_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg Q a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1)) + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1))) + have hEntry_bound : + ∀ᵐ a ∂P, + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β| ≤ + X a + Y a := by + simpa [X, Y, Q] using! + blockMatEntry_abs_le_factor_sum_ae + hP (originCube d (n : ℤ)) hP4.sUpper_pos hP4.sLower_pos α β + have hEntry_abs_sq : + Integrable + (fun a : RegCoeffField d => + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) α β| ^ 2) P := + integrable_abs_sq_of_ae_abs_le_nonneg_memLp_two + hEntry_meas hXY_nonneg hEntry_bound hXY_mem2 + rw [← MeasureTheory.integrable_norm_rpow_iff hEntry_meas.aestronglyMeasurable + (by norm_num : (2 : ENNReal) ≠ 0) (by simp)] + simpa [Real.norm_eq_abs] using hEntry_abs_sq + +theorem memLp_two_restrictionResponseJObservableCubeSet_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k : ℕ) (p q : Vec d) : + MemLp + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p q) + (2 : ENNReal) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (k : ℤ) + let M : RegCoeffField d → BlockMat d := fun a => coarseBlockMatrix (cubeSet Q) a.toFun + let quad : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * vecDot q (matVecMul (M a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (M a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (M a).upperLeft p) + have hLR_entry : + ∀ i j : Fin d, + MemLp (fun a : RegCoeffField d => (M a).lowerRight i j) + (2 : ENNReal) P := by + intro i j + simpa [M, Q, blockMatEntry] using + memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + hP hStruct hP4 k (Sum.inr i) (Sum.inr j) + have hLL_entry : + ∀ i j : Fin d, + MemLp (fun a : RegCoeffField d => (M a).lowerLeft i j) + (2 : ENNReal) P := by + intro i j + simpa [M, Q, blockMatEntry] using + memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + hP hStruct hP4 k (Sum.inr i) (Sum.inl j) + have hUL_entry : + ∀ i j : Fin d, + MemLp (fun a : RegCoeffField d => (M a).upperLeft i j) + (2 : ENNReal) P := by + intro i j + simpa [M, Q, blockMatEntry] using + memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + hP hStruct hP4 k (Sum.inl i) (Sum.inl j) + have hLR : + MemLp (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerRight q)) + (2 : ENNReal) P := by + simp [vecDot, matVecMul] + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro i _hi + have hinner : + MemLp (fun a : RegCoeffField d => ∑ j : Fin d, (M a).lowerRight i j * q j) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro j _hj + simpa [mul_comm] using (hLR_entry i j).const_mul (q j) + exact hinner.const_mul (q i) + have hLL : + MemLp (fun a : RegCoeffField d => vecDot q (matVecMul (M a).lowerLeft p)) + (2 : ENNReal) P := by + simp [vecDot, matVecMul] + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro i _hi + have hinner : + MemLp (fun a : RegCoeffField d => ∑ j : Fin d, (M a).lowerLeft i j * p j) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro j _hj + simpa [mul_comm] using (hLL_entry i j).const_mul (p j) + exact hinner.const_mul (q i) + have hUL : + MemLp (fun a : RegCoeffField d => vecDot p (matVecMul (M a).upperLeft p)) + (2 : ENNReal) P := by + simp [vecDot, matVecMul] + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro i _hi + have hinner : + MemLp (fun a : RegCoeffField d => ∑ j : Fin d, (M a).upperLeft i j * p j) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (Fin d))) ?_ + intro j _hj + simpa [mul_comm] using (hUL_entry i j).const_mul (p j) + exact hinner.const_mul (p i) + have hquad : + MemLp quad (2 : ENNReal) P := by + simpa [quad] using! + (((hLR.const_mul (1 / 2 : ℝ)).sub + (memLp_const (c := vecDot p q) (μ := P) (p := (2 : ENNReal)))).sub hLL).add + (hUL.const_mul (1 / 2 : ℝ)) + have hformula : + (fun a : RegCoeffField d => + Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p q a) =ᵐ[P] + quad := by + simpa [quad, M, Q] using + Ch04.restrictionResponseJObservableCubeSet_ae_eq_quadratic_coarseBlockMatrix_of_lawCarrier + hP (originCube d (k : ℤ)) p q + exact MemLp.ae_eq hformula.symm hquad + +theorem memLp_two_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) (p q : Vec d) : + MemLp (Ch04.restrictionResponseJObservableCubeSet R p q) (2 : ENNReal) P := by + let n : ℕ := Int.toNat R.scale + let z : Fin d → ℤ := Ch04.scaleTranslationShift R.scale R + let X : RegCoeffField d → ℝ := + fun a => ResponseJ (cubeSet (originCube d R.scale)) p q a.toFun + have hOrigin : + MemLp X (2 : ENNReal) P := by + have hbase := + memLp_two_restrictionResponseJObservableCubeSet_originCube_from_P4 + hP hStruct hP4 n p q + have hn : ((n : ℕ) : ℤ) = R.scale := by + simpa [n] using Int.toNat_of_nonneg hR_nonneg + simpa [X, Ch04.restrictionResponseJObservableCubeSet, hn] using! hbase + have hOrigin_map : + MemLp X (2 : ENNReal) (Measure.map (translateReg (intVecToRealVec z)) P) := by + simpa [hstat z] using hOrigin + have hComp : MemLp (X ∘ translateReg (intVecToRealVec z)) (2 : ENNReal) P := + hOrigin_map.comp_of_map (measurable_translateReg (intVecToRealVec z)).aemeasurable + have hshift : + cubeSet R = + translateSet (intVecToRealVec z) (cubeSet (originCube d R.scale)) := by + simpa [z] using + Ch04.cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + have hEq : + Ch04.restrictionResponseJObservableCubeSet R p q =ᵐ[P] X ∘ translateReg (intVecToRealVec z) := by + filter_upwards with a + dsimp [X, Ch04.restrictionResponseJObservableCubeSet, Function.comp] + rw [hshift, Ch04.translateReg_toFun] + exact Ch04.responseJCubeSet_translation_covariant p q + (cubeSet (originCube d R.scale)) z a.toFun + exact MemLp.ae_eq hEq.symm hComp + +theorem memLp_zeta_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) (p q : Vec d) : + MemLp (Ch04.restrictionResponseJObservableCubeSet R p q) + (ENNReal.ofReal (section53CoarseFluctuationZeta hP4)) P := by + let : IsProbabilityMeasure P := hP.isProbability + let ζ := section53CoarseFluctuationZeta hP4 + have hζ_le_two : ENNReal.ofReal ζ ≤ (2 : ENNReal) := by + rw [← ENNReal.ofReal_ofNat] + exact ENNReal.ofReal_le_ofReal (by + simpa [ζ] using section53CoarseFluctuationZeta_le_two hP4) + exact + (memLp_two_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hstat hStruct hP4 R hR_nonneg p q).mono_exponent hζ_le_two + +theorem memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (p q : Vec d) : + MemLp + (fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) + (ENNReal.ofReal (section53CoarseFluctuationZeta hP4)) P := by + refine Ch04.memLp_descendantsAverage_restrictionResponseJObservableCubeSet ?_ + intro R hR + have hRscaleMem : R ∈ descendantsAtScale (originCube d m) k := by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR + have hRscale : R.scale = k := scale_eq_of_mem_descendantsAtScale hRscaleMem + exact + memLp_zeta_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hstat hStruct hP4 R (by simpa [hRscale] using hk_nonneg) p q + +private theorem restrictionResponseJObservableCubeSet_rpow_translation_covariant + {d : ℕ} (ζ : ℝ) (p q : Vec d) : + Ch04.IsRestrictionTranslationCovariant + (fun U : Set (Vec d) => fun a : RegCoeffField d => + Real.rpow (ResponseJ U p q a.toFun) ζ) := by + have hraw : IsTranslationCovariant + (fun U : Set (Vec d) => fun a : CoeffField d => + Real.rpow (ResponseJ U p q a) ζ) := by + intro U z a + exact congrArg (fun x : ℝ => Real.rpow x ζ) + (Ch04.responseJCubeSet_translation_covariant p q U z a) + exact Ch04.isRestrictionTranslationCovariant_comp_toFun hraw + +theorem integral_rpow_restrictionResponseJObservableCubeSet_cubeSet_eq_originCube_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) + {ζ : ℝ} (hζ_nonneg : 0 ≤ ζ) (p q : Vec d) : + ∫ a, + Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ ∂P = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d R.scale) p q a) ζ ∂P := by + have hshift := + Ch04.cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + calc + ∫ a, Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ ∂P + = + ∫ a, Real.rpow (ResponseJ (cubeSet R) p q a.toFun) ζ ∂P := by + rfl + _ = + ∫ a, + Real.rpow + (ResponseJ + (translateSet (intVecToRealVec (Ch04.scaleTranslationShift R.scale R)) + (cubeSet (originCube d R.scale))) p q a) ζ ∂P := by + rw [hshift] + _ = + ∫ a, Real.rpow (ResponseJ (cubeSet (originCube d R.scale)) p q a.toFun) ζ ∂P := by + exact + Ch04.integral_eq_of_isRestrictionTranslationCovariant_of_stationary_aestronglyMeasurable + (P := P) hstat + (U := cubeSet (originCube d R.scale)) + (by + exact + ((Real.continuous_rpow_const hζ_nonneg).measurable.comp_aemeasurable + (by + simpa [Ch04.restrictionResponseJObservableCubeSet] using! + hP.aemeasurable_restrictionResponseJObservableCubeSet + (originCube d R.scale) p q)).aestronglyMeasurable) + (restrictionResponseJObservableCubeSet_rpow_translation_covariant ζ p q) + (Ch04.scaleTranslationShift R.scale R) + _ = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d R.scale) p q a) ζ ∂P := by + rfl + +private theorem rpow_descendantsAverage_le_descendantsAverage_rpow + {d : ℕ} (Q : TriadicCube d) (j : ℕ) {ζ : ℝ} + (hζ : 1 ≤ ζ) {F : TriadicCube d → ℝ} + (hF_nonneg : ∀ R, R ∈ descendantsAtDepth Q j → 0 ≤ F R) : + Real.rpow (descendantsAverage Q j F) ζ ≤ + descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let w : TriadicCube d → ℝ := fun _ => (D.card : ℝ)⁻¹ + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne : ((D.card : ℝ) ≠ 0) := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hw_nonneg : ∀ R ∈ D, 0 ≤ w R := by + intro R hR + dsimp [w] + exact inv_nonneg.mpr hcard_pos.le + have hw_sum : ∑ R ∈ D, w R = 1 := by + simp [w, Finset.sum_const, nsmul_eq_mul, hcard_ne] + have hmem : ∀ R ∈ D, F R ∈ Set.Ici (0 : ℝ) := by + intro R hR + exact hF_nonneg R (by simpa [D] using hR) + have hJensen := + (convexOn_rpow hζ).map_sum_le + (t := D) (w := w) (p := F) hw_nonneg hw_sum hmem + have hleft : + (fun x : ℝ => x ^ ζ) (∑ R ∈ D, w R • F R) = + Real.rpow (descendantsAverage Q j F) ζ := by + congr 1 + simp only [descendantsAverage, D, w, smul_eq_mul] + rw [Finset.mul_sum] + have hright : + (∑ R ∈ D, w R • (fun x : ℝ => x ^ ζ) (F R)) = + descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := by + simp only [descendantsAverage, D, w, smul_eq_mul, Real.rpow_eq_pow] + rw [Finset.mul_sum] + calc + Real.rpow (descendantsAverage Q j F) ζ + = (fun x : ℝ => x ^ ζ) (∑ R ∈ D, w R • F R) := hleft.symm + _ ≤ ∑ R ∈ D, w R • (fun x : ℝ => x ^ ζ) (F R) := hJensen + _ = descendantsAverage Q j (fun R => Real.rpow (F R) ζ) := hright + +private theorem integrable_rpow_of_memLp_nonneg + {Ω : Type*} [MeasurableSpace Ω] {P : Measure Ω} {f : Ω → ℝ} {ζ : ℝ} + (hζ_pos : 0 < ζ) (hf : MemLp f (ENNReal.ofReal ζ) P) (hnonneg : ∀ a, 0 ≤ f a) : + Integrable (fun a => Real.rpow (f a) ζ) P := by + have hζ_ne_zero : ENNReal.ofReal ζ ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le.mpr hζ_pos] + have hζ_ne_top : ENNReal.ofReal ζ ≠ ⊤ := by simp + have hint : Integrable (fun a => ‖f a‖ ^ (ENNReal.ofReal ζ).toReal) P := + hf.integrable_norm_rpow hζ_ne_zero hζ_ne_top + refine hint.congr ?_ + filter_upwards with a + rw [ENNReal.toReal_ofReal hζ_pos.le, Real.norm_of_nonneg (hnonneg a), + Real.rpow_eq_pow] + +theorem integral_rpow_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_le_originCube_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) (p q : Vec d) : + let ζ := section53CoarseFluctuationZeta hP4 + ∫ a, + Real.rpow + (descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) ζ ∂P + ≤ + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P := by + dsimp only + let : IsProbabilityMeasure P := hP.isProbability + let ζ := section53CoarseFluctuationZeta hP4 + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAvg : RegCoeffField d → ℝ := + fun a => + descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hζ_one : 1 ≤ ζ := by + exact (one_lt_section53CoarseFluctuationZeta hP4).le + have hchild_mem : + MemLp childAvg (ENNReal.ofReal ζ) P := by + simpa [childAvg, Q, j, ζ] using + memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + hP hstat hStruct hP4 hk_nonneg hkm p q + have hchild_int : + Integrable (fun a : RegCoeffField d => Real.rpow (childAvg a) ζ) P := by + apply integrable_rpow_of_memLp_nonneg hζ_pos hchild_mem + intro a + exact descendantsAverage_nonneg Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + (fun R hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p q a) + have horigin_int : + Integrable + (fun a : RegCoeffField d => + Real.rpow (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ) P := by + have hknat : ((Int.toNat k : ℕ) : ℤ) = k := + Int.toNat_of_nonneg hk_nonneg + let J : RegCoeffField d → ℝ := + Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q + have hζ_le_two : ENNReal.ofReal ζ ≤ (2 : ENNReal) := by + rw [← ENNReal.ofReal_ofNat] + exact ENNReal.ofReal_le_ofReal (by + simpa [ζ] using section53CoarseFluctuationZeta_le_two hP4) + have hJ_mem2 : MemLp J (2 : ENNReal) P := by + have hbase := + memLp_two_restrictionResponseJObservableCubeSet_originCube_from_P4 + hP hStruct hP4 (Int.toNat k) p q + simpa [J, hknat] using hbase + have hJ_memζ : MemLp J (ENNReal.ofReal ζ) P := + hJ_mem2.mono_exponent hζ_le_two + exact integrable_rpow_of_memLp_nonneg hζ_pos hJ_memζ + (fun a => Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d k) p q a) + have hpoint : + (fun a : RegCoeffField d => Real.rpow (childAvg a) ζ) ≤ᵐ[P] + fun a => descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) := by + filter_upwards with a + dsimp [childAvg] + exact + rpow_descendantsAverage_le_descendantsAverage_rpow Q j hζ_one + (fun R hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p q a) + have hdesc_int : + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ)) P := by + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hRscaleMem : R ∈ descendantsAtScale (originCube d m) k := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR + have hRscale : R.scale = k := scale_eq_of_mem_descendantsAtScale hRscaleMem + have hstat_eq := + integral_rpow_restrictionResponseJObservableCubeSet_cubeSet_eq_originCube_of_stationary + hP hstat R (by simpa [hRscale] using hk_nonneg) hζ_pos.le p q + have hR_mem : + MemLp (Ch04.restrictionResponseJObservableCubeSet R p q) + (ENNReal.ofReal ζ) P := by + simpa [ζ] using + memLp_zeta_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hstat hStruct hP4 R (by simpa [hRscale] using hk_nonneg) p q + exact integrable_rpow_of_memLp_nonneg hζ_pos hR_mem + (fun a => Ch04.restrictionResponseJObservableCubeSet_nonneg R p q a) + have hmono : + ∫ a, Real.rpow (childAvg a) ζ ∂P ≤ + ∫ a, + descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) ∂P := + integral_mono_ae hchild_int hdesc_int hpoint + have hdesc_eq : + ∫ a, + descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) ∂P = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hFint : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable + (fun a : RegCoeffField d => + Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) P := by + intro R hR + have hRscaleMem : R ∈ descendantsAtScale (originCube d m) k := by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR + have hRscale : R.scale = k := scale_eq_of_mem_descendantsAtScale hRscaleMem + have hR_mem : + MemLp (Ch04.restrictionResponseJObservableCubeSet R p q) + (ENNReal.ofReal ζ) P := by + simpa [ζ] using + memLp_zeta_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hstat hStruct hP4 R (by simpa [hRscale] using hk_nonneg) p q + exact integrable_rpow_of_memLp_nonneg hζ_pos hR_mem + (fun a => Ch04.restrictionResponseJObservableCubeSet_nonneg R p q a) + calc + ∫ a, + descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) ∂P + = + descendantsAverage Q j + (fun R => ∫ a, + Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ ∂P) := + Ch04.integral_descendantsAverage_eq_descendantsAverage_integral + (P := P) (Q := Q) (j := j) + (F := fun R a => + Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) hFint + _ = + descendantsAverage Q j + (fun _R => ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((D.card : ℝ)⁻¹) * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hRscaleMem : R ∈ descendantsAtScale (originCube d m) k := by + simpa [Q, j, D, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR + have hRscale : R.scale = k := scale_eq_of_mem_descendantsAtScale hRscaleMem + have hR_nonneg : 0 ≤ R.scale := by simpa [hRscale] using hk_nonneg + calc + ∫ a, Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ ∂P + = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d R.scale) p q a) ζ ∂P := + integral_rpow_restrictionResponseJObservableCubeSet_cubeSet_eq_originCube_of_stationary + hP hstat R hR_nonneg hζ_pos.le p q + _ = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P := by + rw [hRscale] + _ = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P := by + simp [descendantsAverage_const, Q, j] + calc + ∫ a, + Real.rpow + (descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) ζ ∂P + = + ∫ a, Real.rpow (childAvg a) ζ ∂P := rfl + _ ≤ + ∫ a, + descendantsAverage Q j + (fun R => Real.rpow (Ch04.restrictionResponseJObservableCubeSet R p q a) ζ) ∂P := hmono + _ = + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d k) p q a) ζ ∂P := hdesc_eq + + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/HighScaleAverages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/HighScaleAverages.lean new file mode 100644 index 0000000000..953b75b377 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/HighScaleAverages.lean @@ -0,0 +1,304 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.CoarseAverages +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Basic + +/-! # High Scale Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open scoped BigOperators + +/-! +# High-scale average terms for the coarse-fluctuation lemma + +This file contains the proof-internal deterministic conversion of the paired +high-scale average terms from `WeakNormsMaximizer` at the Section 5.3 special +vectors into the weighted descendant average of the normalized full-block +operator-norm-square fluctuation. +-/ + +noncomputable section + +private theorem finset_weighted_sqrt_sum_sq_le_sum_mul_sum + {ι : Type*} [DecidableEq ι] (S : Finset ι) (w A : ι → ℝ) + (hw : ∀ i, 0 ≤ w i) (hA : ∀ i, 0 ≤ A i) : + (∑ i ∈ S, w i * Real.sqrt (A i)) ^ 2 ≤ + (∑ i ∈ S, w i) * ∑ i ∈ S, w i * A i := by + have hsum_eq : + (∑ i ∈ S, Real.sqrt (w i) * Real.sqrt (w i * A i)) = + ∑ i ∈ S, w i * Real.sqrt (A i) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [Real.sqrt_mul (hw i) (A i)] + rw [← mul_assoc, ← sq, Real.sq_sqrt (hw i)] + have hCauchy : + (∑ i ∈ S, w i * Real.sqrt (A i)) ≤ + Real.sqrt (∑ i ∈ S, w i) * + Real.sqrt (∑ i ∈ S, w i * A i) := by + simpa [hsum_eq] using + (Real.sum_sqrt_mul_sqrt_le (s := S) (f := w) (g := fun i => w i * A i) + hw (fun i => mul_nonneg (hw i) (hA i))) + have hleft_nonneg : 0 ≤ ∑ i ∈ S, w i * Real.sqrt (A i) := + Finset.sum_nonneg fun i _hi => mul_nonneg (hw i) (Real.sqrt_nonneg _) + have hW_nonneg : 0 ≤ ∑ i ∈ S, w i := + Finset.sum_nonneg fun i _hi => hw i + have hWA_nonneg : 0 ≤ ∑ i ∈ S, w i * A i := + Finset.sum_nonneg fun i _hi => mul_nonneg (hw i) (hA i) + have hsq := + pow_le_pow_left₀ hleft_nonneg hCauchy 2 + calc + (∑ i ∈ S, w i * Real.sqrt (A i)) ^ 2 + ≤ (Real.sqrt (∑ i ∈ S, w i) * + Real.sqrt (∑ i ∈ S, w i * A i)) ^ 2 := hsq + _ = (∑ i ∈ S, w i) * ∑ i ∈ S, w i * A i := by + rw [mul_pow, Real.sq_sqrt hW_nonneg, Real.sq_sqrt hWA_nonneg] + +private theorem finset_weighted_sqrt_sum_sq_le_of_weight_le + {ι : Type*} [DecidableEq ι] (S : Finset ι) (v w A : ι → ℝ) + (hv : ∀ i, 0 ≤ v i) (hw : ∀ i, 0 ≤ w i) (hvw : ∀ i, v i ≤ w i) + (hA : ∀ i, 0 ≤ A i) : + (∑ i ∈ S, v i * Real.sqrt (A i)) ^ 2 ≤ + (∑ i ∈ S, w i) * ∑ i ∈ S, w i * A i := by + have hsum_le : + (∑ i ∈ S, v i * Real.sqrt (A i)) ≤ + ∑ i ∈ S, w i * Real.sqrt (A i) := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact mul_le_mul_of_nonneg_right (hvw i) (Real.sqrt_nonneg _) + have hleft_nonneg : 0 ≤ ∑ i ∈ S, v i * Real.sqrt (A i) := + Finset.sum_nonneg fun i _hi => mul_nonneg (hv i) (Real.sqrt_nonneg _) + have hright_nonneg : 0 ≤ ∑ i ∈ S, w i * Real.sqrt (A i) := + Finset.sum_nonneg fun i _hi => mul_nonneg (hw i) (Real.sqrt_nonneg _) + have hsq_le := + pow_le_pow_left₀ hleft_nonneg hsum_le 2 + exact hsq_le.trans + (finset_weighted_sqrt_sum_sq_le_sum_mul_sum S w A hw hA) + +private theorem highScaleWeight_le_betaWeight + (β s : ℝ) (hβs : β ≤ s) (r : ℕ) : + Real.rpow (3 : ℝ) (-s * (r : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (r : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hr : 0 ≤ (r : ℝ) := by positivity + nlinarith + +private theorem sigmaHatAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + 0 ≤ sigmaHatAtScale hP hStruct m := by + exact Real.sqrt_nonneg _ + +/-- Deterministic finite-sum/Cauchy conversion for the paired high-scale +average terms at the Section 5.3 special vectors. The right side is the +weighted descendant average of the normalized full-block operator-norm-square +fluctuation. -/ +theorem paired_highScaleAverageTerms_special_le_weighted_fullBlockNormalized_fluctuation + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℕ} (β s t : ℝ) (hβs : β ≤ s) (hβt : β ≤ t) (e : Vec d) + (hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ)) + (hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ)) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let wβ : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 ≤ + (∑ n ∈ S, wβ n) * + ∑ n ∈ S, wβ n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let wβ : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + let ws : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-s * (Int.toNat ((m : ℤ) - n) : ℝ)) + let wt : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-t * (Int.toNat ((m : ℤ) - n) : ℝ)) + let G : ℤ → ℝ := + fun n => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e)) + let F : ℤ → ℝ := + fun n => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e)) + let H : ℤ → ℝ := + fun n => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) + have hwβ : ∀ n, 0 ≤ wβ n := by + intro n + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hws : ∀ n, 0 ≤ ws n := by + intro n + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hwt : ∀ n, 0 ≤ wt n := by + intro n + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hws_le : ∀ n, ws n ≤ wβ n := by + intro n + exact highScaleWeight_le_betaWeight β s hβs (Int.toNat ((m : ℤ) - n)) + have hwt_le : ∀ n, wt n ≤ wβ n := by + intro n + exact highScaleWeight_le_betaWeight β t hβt (Int.toNat ((m : ℤ) - n)) + have hG_nonneg : ∀ n, 0 ≤ G n := by + intro n + exact descendantsAverage_nonneg _ _ _ fun R _hR => vecNormSq_nonneg _ + have hF_nonneg : ∀ n, 0 ≤ F n := by + intro n + exact descendantsAverage_nonneg _ _ _ fun R _hR => vecNormSq_nonneg _ + have hσ_nonneg : 0 ≤ σ := by + change 0 ≤ sigmaHatAtScale hP hStruct (m : ℤ) + exact sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hgrad_cauchy : + (∑ n ∈ S, ws n * Real.sqrt (G n)) ^ 2 ≤ + (∑ n ∈ S, wβ n) * ∑ n ∈ S, wβ n * G n := + finset_weighted_sqrt_sum_sq_le_of_weight_le S ws wβ G hws hwβ hws_le hG_nonneg + have hflux_cauchy : + (∑ n ∈ S, wt n * Real.sqrt (F n)) ^ 2 ≤ + (∑ n ∈ S, wβ n) * ∑ n ∈ S, wβ n * F n := + finset_weighted_sqrt_sum_sq_le_of_weight_le S wt wβ F hwt hwβ hwt_le hF_nonneg + have hgrad_scaled : + σ * (∑ n ∈ S, ws n * Real.sqrt (G n)) ^ 2 ≤ + (∑ n ∈ S, wβ n) * (∑ n ∈ S, wβ n * (σ * G n)) := by + have h := mul_le_mul_of_nonneg_left hgrad_cauchy hσ_nonneg + simpa [Finset.mul_sum, mul_assoc, mul_left_comm, mul_comm] using h + have hflux_scaled : + σ⁻¹ * (∑ n ∈ S, wt n * Real.sqrt (F n)) ^ 2 ≤ + (∑ n ∈ S, wβ n) * (∑ n ∈ S, wβ n * (σ⁻¹ * F n)) := by + have h := mul_le_mul_of_nonneg_left hflux_cauchy hσ_inv_nonneg + simpa [Finset.mul_sum, mul_assoc, mul_left_comm, mul_comm] using h + have hpaired_sums : + σ * (∑ n ∈ S, ws n * Real.sqrt (G n)) ^ 2 + + σ⁻¹ * (∑ n ∈ S, wt n * Real.sqrt (F n)) ^ 2 ≤ + (∑ n ∈ S, wβ n) * + (∑ n ∈ S, wβ n * (σ * G n + σ⁻¹ * F n)) := by + have hsum_nonneg : 0 ≤ ∑ n ∈ S, wβ n := + Finset.sum_nonneg fun n _hn => hwβ n + have h := add_le_add hgrad_scaled hflux_scaled + calc + σ * (∑ n ∈ S, ws n * Real.sqrt (G n)) ^ 2 + + σ⁻¹ * (∑ n ∈ S, wt n * Real.sqrt (F n)) ^ 2 + ≤ + (∑ n ∈ S, wβ n) * (∑ n ∈ S, wβ n * (σ * G n)) + + (∑ n ∈ S, wβ n) * (∑ n ∈ S, wβ n * (σ⁻¹ * F n)) := h + _ = + (∑ n ∈ S, wβ n) * + (∑ n ∈ S, wβ n * (σ * G n + σ⁻¹ * F n)) := by + rw [← mul_add, ← Finset.sum_add_distrib] + congr 2 + ext n + ring + have hpoint : + ∀ n ∈ S, σ * G n + σ⁻¹ * F n ≤ H n := by + intro n _hn + let j := Int.toNat ((m : ℤ) - n) + let Q : TriadicCube d := originCube d (m : ℤ) + let Grad : TriadicCube d → ℝ := + fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p_e q_e a.toFun - p0_e) + let Flux : TriadicCube d → ℝ := + fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p_e q_e a.toFun - q0_e) + have hlinear : + descendantsAverage Q j (fun R => σ * Grad R + σ⁻¹ * Flux R) = + σ * G n + σ⁻¹ * F n := by + rw [descendantsAverage_add, descendantsAverage_mul_left, + descendantsAverage_mul_left] + have hbase := + descendantsAverage_weighted_special_average_mismatch_le_fullBlockNormalized_fluctuation + hP hStruct a ha m Q j e hb hc he + calc + σ * G n + σ⁻¹ * F n = + descendantsAverage Q j (fun R => σ * Grad R + σ⁻¹ * Flux R) := hlinear.symm + _ ≤ H n := by + simpa [H, Q, j, Grad, Flux, σ, θ, p_e, q_e, p0_e, q0_e] using hbase + have hsum_point : + (∑ n ∈ S, wβ n * (σ * G n + σ⁻¹ * F n)) ≤ + ∑ n ∈ S, wβ n * H n := by + refine Finset.sum_le_sum ?_ + intro n hn + exact mul_le_mul_of_nonneg_left (hpoint n hn) (hwβ n) + have hsum_nonneg : 0 ≤ ∑ n ∈ S, wβ n := + Finset.sum_nonneg fun n _hn => hwβ n + have hfluct := + mul_le_mul_of_nonneg_left hsum_point hsum_nonneg + calc + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + = + σ * (∑ n ∈ S, ws n * Real.sqrt (G n)) ^ 2 + + σ⁻¹ * (∑ n ∈ S, wt n * Real.sqrt (F n)) ^ 2 := by + simp [WeakNormsMaximizer.gradientAverageTermAtScale, + WeakNormsMaximizer.fluxAverageTermAtScale, S, ws, wt, G, F, + p_e, q_e, p0_e, q0_e] + _ ≤ + (∑ n ∈ S, wβ n) * + (∑ n ∈ S, wβ n * (σ * G n + σ⁻¹ * F n)) := hpaired_sums + _ ≤ + (∑ n ∈ S, wβ n) * ∑ n ∈ S, wβ n * H n := hfluct + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LinearProductAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LinearProductAbsorption.lean new file mode 100644 index 0000000000..48a27d217f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LinearProductAbsorption.lean @@ -0,0 +1,864 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.WeakNormInput + +/-! # Linear Product Absorption -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Linear/product absorption for the coarse-fluctuation RHS + +This proof-internal file absorbs the first-lemma linear weak-norm terms and +cutoff-product Cauchy term into the special-vector centering term plus paired +weak-norm square expectations. +-/ + +noncomputable section + +private theorem barSigmaStarAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (m : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (m : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (m : ℤ)] + exact inv_pos.mpr hInv + +private theorem barSigmaAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta := + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + have hstar_pos := barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hprod_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + exact lt_of_lt_of_le zero_lt_one (by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using htheta) + exact pos_of_mul_pos_left hprod_pos (inv_pos.mpr hstar_pos).le + +private theorem sigmaHatAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + 0 ≤ sigmaHatAtScale hP hStruct m := by + exact Real.sqrt_nonneg _ + +private theorem sigmaHatAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < sigmaHatAtScale hP hStruct (m : ℤ) := by + dsimp [sigmaHatAtScale] + exact Real.sqrt_pos_of_pos + (mul_pos (barSigmaAtScale_pos_of_P4 hP hStruct hP4 m) + (barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m)) + +private theorem young_mul_le_eps_sq_add_inv_eps_sq + {ε x y : ℝ} (hε : 0 < ε) : + x * y ≤ ε * x ^ 2 / 2 + ε⁻¹ * y ^ 2 / 2 := by + have hε_nonneg : 0 ≤ ε := hε.le + have hε_inv_nonneg : 0 ≤ ε⁻¹ := inv_nonneg.mpr hε_nonneg + have htwo := + two_mul_le_add_sq (Real.sqrt ε * x) (Real.sqrt ε⁻¹ * y) + have hsqrtε : (Real.sqrt ε) ^ 2 = ε := by + simpa [pow_two] using Real.sq_sqrt hε_nonneg + have hsqrti : (Real.sqrt ε⁻¹) ^ 2 = ε⁻¹ := by + simpa [pow_two] using Real.sq_sqrt hε_inv_nonneg + have hsqrt_mul : Real.sqrt ε * Real.sqrt ε⁻¹ = 1 := by + rw [← Real.sqrt_mul hε_nonneg (ε⁻¹)] + have hε_ne : ε ≠ 0 := ne_of_gt hε + field_simp [hε_ne] + norm_num + have hmain : 2 * x * y ≤ ε * x ^ 2 + ε⁻¹ * y ^ 2 := by + calc + 2 * x * y = + 2 * (Real.sqrt ε * x) * (Real.sqrt ε⁻¹ * y) := by + nlinarith [hsqrt_mul] + _ ≤ + (Real.sqrt ε * x) ^ 2 + (Real.sqrt ε⁻¹ * y) ^ 2 := htwo + _ = + ε * x ^ 2 + ε⁻¹ * y ^ 2 := by + nlinarith [hsqrtε, hsqrti] + nlinarith + +private theorem integral_le_sqrt_integral_sq_of_ae_nonneg + {α : Type*} [MeasurableSpace α] {μ : Measure α} [IsProbabilityMeasure μ] + {X : α → ℝ} + (hX_sq : Integrable (fun x => (X x) ^ 2) μ) + (hX_nonneg : 0 ≤ᵐ[μ] X) : + ∫ x, X x ∂μ ≤ Real.sqrt (∫ x, (X x) ^ 2 ∂μ) := by + have hY_sq : Integrable (fun _x : α => ((1 : ℝ) : ℝ) ^ 2) μ := by + simp + have hY_nonneg : 0 ≤ᵐ[μ] fun _x : α => (1 : ℝ) := by + filter_upwards with _x + norm_num + have h := + JUpperBoundWeakNorms.integral_mul_le_sqrt_integral_sq_mul_sqrt_integral_sq_of_ae_nonneg + (μ := μ) (X := X) (Y := fun _x : α => (1 : ℝ)) + hX_sq hY_sq hX_nonneg hY_nonneg + have hOne : Real.sqrt (∫ _x : α, ((1 : ℝ) : ℝ) ^ 2 ∂μ) = 1 := by + simp + calc + ∫ x, X x ∂μ = ∫ x, X x * (1 : ℝ) ∂μ := by simp + _ ≤ Real.sqrt (∫ x, (X x) ^ 2 ∂μ) * + Real.sqrt (∫ _x : α, ((1 : ℝ) : ℝ) ^ 2 ∂μ) := h + _ = Real.sqrt (∫ x, (X x) ^ 2 ∂μ) := by rw [hOne, mul_one] + +private theorem norm_sq_le_vecNormSq {d : ℕ} (v : Vec d) : + ‖v‖ ^ 2 ≤ vecNormSq v := by + have hnorm_le : ‖v‖ ≤ Real.sqrt (vecNormSq v) := by + refine (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg _)).2 ?_ + intro i + have hi : ‖v i‖ ^ 2 ≤ vecNormSq v := by + calc + ‖v i‖ ^ 2 = v i ^ 2 := by rw [Real.norm_eq_abs, sq_abs] + _ ≤ ∑ j, v j ^ 2 := by + exact Finset.single_le_sum (fun j _hj => sq_nonneg (v j)) (Finset.mem_univ i) + _ = vecNormSq v := by + simp [vecNormSq, vecDot, pow_two] + exact Real.le_sqrt_of_sq_le hi + have hsqrt_sq : (Real.sqrt (vecNormSq v)) ^ 2 = vecNormSq v := by + simpa [pow_two] using Real.sq_sqrt (vecNormSq_nonneg v) + calc + ‖v‖ ^ 2 ≤ (Real.sqrt (vecNormSq v)) ^ 2 := by + exact (sq_le_sq₀ (norm_nonneg _) (Real.sqrt_nonneg _)).2 hnorm_le + _ = vecNormSq v := hsqrt_sq + +private theorem sigmaHatAtScale_mul_norm_specialPCentering_sq_le_of_vecNormSq_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + sigmaHatAtScale hP hStruct (m : ℤ) * ‖p0_e‖ ^ 2 ≤ + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hσ_nonneg : 0 ≤ σ := by + exact sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hnorm := norm_sq_le_vecNormSq p0_e + have hvec := + sigmaHatAtScale_mul_vecNormSq_specialPCentering_eq hP hStruct hP4 m e + calc + σ * ‖p0_e‖ ^ 2 ≤ σ * vecNormSq p0_e := + mul_le_mul_of_nonneg_left hnorm hσ_nonneg + _ = (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + simpa [p_e, q_e, p0_e, σ, he] using hvec + +private theorem inv_sigmaHatAtScale_mul_norm_specialQCentering_sq_le_of_vecNormSq_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * ‖q0_e‖ ^ 2 ≤ + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hσ_nonneg : 0 ≤ σ := by + exact sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hnorm := norm_sq_le_vecNormSq q0_e + have hvec := + inv_sigmaHatAtScale_mul_vecNormSq_specialQCentering_eq hP hStruct hP4 m e + calc + σ⁻¹ * ‖q0_e‖ ^ 2 ≤ σ⁻¹ * vecNormSq q0_e := + mul_le_mul_of_nonneg_left hnorm hσ_inv_nonneg + _ = (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + simpa [p_e, q_e, q0_e, σ, he] using hvec + +private theorem weighted_young_left_le + {ε σ K u v G : ℝ} (hε : 0 < ε) (hσ : 0 < σ) + (hv_sq : v ^ 2 ≤ G) : + K * u * v ≤ + ε * (σ⁻¹ * u ^ 2) / 2 + ε⁻¹ * (K ^ 2 * σ * G) / 2 := by + have hσ_nonneg : 0 ≤ σ := hσ.le + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hsqrt_inv_sq : (Real.sqrt (σ⁻¹)) ^ 2 = σ⁻¹ := by + simpa [pow_two] using Real.sq_sqrt hσ_inv_nonneg + have hsqrt_sq : (Real.sqrt σ) ^ 2 = σ := by + simpa [pow_two] using Real.sq_sqrt hσ_nonneg + have hsqrt_mul : Real.sqrt (σ⁻¹) * Real.sqrt σ = 1 := by + rw [← Real.sqrt_mul hσ_inv_nonneg σ] + have hσ_ne : σ ≠ 0 := ne_of_gt hσ + field_simp [hσ_ne] + norm_num + have hy := young_mul_le_eps_sq_add_inv_eps_sq (ε := ε) + (x := Real.sqrt (σ⁻¹) * u) (y := K * Real.sqrt σ * v) hε + have hleft_eq : + (Real.sqrt (σ⁻¹) * u) * (K * Real.sqrt σ * v) = K * u * v := by + calc + (Real.sqrt (σ⁻¹) * u) * (K * Real.sqrt σ * v) + = (Real.sqrt (σ⁻¹) * Real.sqrt σ) * (K * u * v) := by ring + _ = K * u * v := by rw [hsqrt_mul]; ring + have hy2_le : (K * Real.sqrt σ * v) ^ 2 ≤ K ^ 2 * σ * G := by + have hfactor_nonneg : 0 ≤ K ^ 2 * σ := mul_nonneg (sq_nonneg K) hσ_nonneg + calc + (K * Real.sqrt σ * v) ^ 2 = K ^ 2 * σ * v ^ 2 := by + rw [mul_pow, mul_pow, hsqrt_sq] + _ ≤ K ^ 2 * σ * G := by + exact mul_le_mul_of_nonneg_left hv_sq hfactor_nonneg + have hright_le : + ε * (Real.sqrt (σ⁻¹) * u) ^ 2 / 2 + + ε⁻¹ * (K * Real.sqrt σ * v) ^ 2 / 2 ≤ + ε * (σ⁻¹ * u ^ 2) / 2 + ε⁻¹ * (K ^ 2 * σ * G) / 2 := by + have hfirst : (Real.sqrt (σ⁻¹) * u) ^ 2 = σ⁻¹ * u ^ 2 := by + rw [mul_pow, hsqrt_inv_sq] + rw [hfirst] + gcongr + calc + K * u * v = (Real.sqrt (σ⁻¹) * u) * (K * Real.sqrt σ * v) := hleft_eq.symm + _ ≤ + ε * (Real.sqrt (σ⁻¹) * u) ^ 2 / 2 + + ε⁻¹ * (K * Real.sqrt σ * v) ^ 2 / 2 := hy + _ ≤ + ε * (σ⁻¹ * u ^ 2) / 2 + + ε⁻¹ * (K ^ 2 * σ * G) / 2 := hright_le + +private theorem weighted_young_right_le + {ε σ K u v F : ℝ} (hε : 0 < ε) (hσ : 0 < σ) + (hv_sq : v ^ 2 ≤ F) : + K * u * v ≤ + ε * (σ * u ^ 2) / 2 + ε⁻¹ * (K ^ 2 * σ⁻¹ * F) / 2 := by + have hσ_inv_pos : 0 < σ⁻¹ := inv_pos.mpr hσ + have h := + weighted_young_left_le (ε := ε) (σ := σ⁻¹) (K := K) (u := u) + (v := v) (G := F) hε hσ_inv_pos hv_sq + simpa [inv_inv] using h + +private theorem product_sqrt_le_paired_squares + {ε σ K G F : ℝ} (hε : 0 < ε) (hε_le : ε ≤ 1) + (hσ : 0 < σ) (hK : 0 ≤ K) (hG : 0 ≤ G) (hF : 0 ≤ F) : + K * (Real.sqrt G * Real.sqrt F) ≤ + ε⁻¹ * (K * (σ * G + σ⁻¹ * F) / 2) := by + have hσ_nonneg : 0 ≤ σ := hσ.le + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hsqrtσ_sq : (Real.sqrt σ) ^ 2 = σ := by + simpa [pow_two] using Real.sq_sqrt hσ_nonneg + have hsqrti_sq : (Real.sqrt (σ⁻¹)) ^ 2 = σ⁻¹ := by + simpa [pow_two] using Real.sq_sqrt hσ_inv_nonneg + have hsqrt_mul : Real.sqrt σ * Real.sqrt (σ⁻¹) = 1 := by + rw [← Real.sqrt_mul hσ_nonneg (σ⁻¹)] + have hσ_ne : σ ≠ 0 := ne_of_gt hσ + field_simp [hσ_ne] + norm_num + have hy := young_mul_le_eps_sq_add_inv_eps_sq (ε := (1 : ℝ)) + (x := Real.sqrt σ * Real.sqrt G) + (y := Real.sqrt (σ⁻¹) * Real.sqrt F) (by norm_num) + have hleft_eq : + (Real.sqrt σ * Real.sqrt G) * + (Real.sqrt (σ⁻¹) * Real.sqrt F) = + Real.sqrt G * Real.sqrt F := by + calc + (Real.sqrt σ * Real.sqrt G) * + (Real.sqrt (σ⁻¹) * Real.sqrt F) + = (Real.sqrt σ * Real.sqrt (σ⁻¹)) * + (Real.sqrt G * Real.sqrt F) := by ring + _ = Real.sqrt G * Real.sqrt F := by rw [hsqrt_mul]; ring + have hright_eq : + (1 : ℝ) * (Real.sqrt σ * Real.sqrt G) ^ 2 / 2 + + (1 : ℝ)⁻¹ * (Real.sqrt (σ⁻¹) * Real.sqrt F) ^ 2 / 2 = + (σ * G + σ⁻¹ * F) / 2 := by + rw [mul_pow, mul_pow, hsqrtσ_sq, hsqrti_sq, Real.sq_sqrt hG, + Real.sq_sqrt hF] + ring + have hbase : + Real.sqrt G * Real.sqrt F ≤ (σ * G + σ⁻¹ * F) / 2 := by + rw [hleft_eq, hright_eq] at hy + exact hy + have hmul : + K * (Real.sqrt G * Real.sqrt F) ≤ + K * ((σ * G + σ⁻¹ * F) / 2) := + mul_le_mul_of_nonneg_left hbase hK + have htail_nonneg : 0 ≤ K * ((σ * G + σ⁻¹ * F) / 2) := by + exact mul_nonneg hK + (div_nonneg + (add_nonneg (mul_nonneg hσ_nonneg hG) + (mul_nonneg hσ_inv_nonneg hF)) + (by norm_num)) + have hε_inv_ge_one : 1 ≤ ε⁻¹ := by + exact (one_le_inv₀ hε).2 hε_le + calc + K * (Real.sqrt G * Real.sqrt F) ≤ + K * ((σ * G + σ⁻¹ * F) / 2) := hmul + _ = 1 * (K * (σ * G + σ⁻¹ * F) / 2) := by ring + _ ≤ ε⁻¹ * (K * (σ * G + σ⁻¹ * F) / 2) := + mul_le_mul_of_nonneg_right hε_inv_ge_one + (by simpa [div_eq_mul_inv, mul_assoc] using htail_nonneg) + +private theorem linear_product_absorb_into_centering_and_pairedSquares + {ε σ center G F Kg Kf Kp u v : ℝ} + (hε : 0 < ε) (hε_le : ε ≤ 1) (hσ : 0 < σ) + (hcenter : 0 ≤ center) (hG : 0 ≤ G) (hF : 0 ≤ F) + (_hKg : 0 ≤ Kg) (_hKf : 0 ≤ Kf) (hKp : 0 ≤ Kp) + (hu_center : σ * u ^ 2 ≤ center) + (hv_center : σ⁻¹ * v ^ 2 ≤ center) : + let C : ℝ := Kg ^ 2 + Kf ^ 2 + Kp + 2 + 0 ≤ C ∧ + Kg * v * Real.sqrt G + Kf * u * Real.sqrt F + + Kp * (Real.sqrt G * Real.sqrt F) ≤ + C * ε * center + + C * ε⁻¹ * (σ * G + σ⁻¹ * F) := by + let C : ℝ := Kg ^ 2 + Kf ^ 2 + Kp + 2 + have hC_nonneg : 0 ≤ C := by + dsimp [C] + linarith [sq_nonneg Kg, sq_nonneg Kf, hKp] + have hpaired_nonneg : 0 ≤ σ * G + σ⁻¹ * F := by + exact add_nonneg (mul_nonneg hσ.le hG) + (mul_nonneg (inv_nonneg.mpr hσ.le) hF) + have hgrad := + weighted_young_left_le (ε := ε) (σ := σ) (K := Kg) (u := v) + (v := Real.sqrt G) (G := G) hε hσ (by + simpa [pow_two] using (Real.sq_sqrt hG).le) + have hgrad' : + Kg * v * Real.sqrt G ≤ + ε * center / 2 + ε⁻¹ * (Kg ^ 2 * (σ * G + σ⁻¹ * F)) / 2 := by + have hfirst : + ε * (σ⁻¹ * v ^ 2) / 2 ≤ ε * center / 2 := by + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left hv_center hε.le) (by norm_num) + have hsecond : + ε⁻¹ * (Kg ^ 2 * σ * G) / 2 ≤ + ε⁻¹ * (Kg ^ 2 * (σ * G + σ⁻¹ * F)) / 2 := by + have hKG_nonneg : 0 ≤ Kg ^ 2 := sq_nonneg Kg + have htail : Kg ^ 2 * σ * G ≤ Kg ^ 2 * (σ * G + σ⁻¹ * F) := by + calc + Kg ^ 2 * σ * G = Kg ^ 2 * (σ * G) := by ring + _ ≤ Kg ^ 2 * (σ * G + σ⁻¹ * F) := + mul_le_mul_of_nonneg_left + (le_add_of_nonneg_right (mul_nonneg (inv_nonneg.mpr hσ.le) hF)) + hKG_nonneg + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left htail (inv_nonneg.mpr hε.le)) (by norm_num) + exact hgrad.trans (add_le_add hfirst hsecond) + have hflux := + weighted_young_right_le (ε := ε) (σ := σ) (K := Kf) (u := u) + (v := Real.sqrt F) (F := F) hε hσ (by + simpa [pow_two] using (Real.sq_sqrt hF).le) + have hflux' : + Kf * u * Real.sqrt F ≤ + ε * center / 2 + ε⁻¹ * (Kf ^ 2 * (σ * G + σ⁻¹ * F)) / 2 := by + have hfirst : + ε * (σ * u ^ 2) / 2 ≤ ε * center / 2 := by + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left hu_center hε.le) (by norm_num) + have hsecond : + ε⁻¹ * (Kf ^ 2 * σ⁻¹ * F) / 2 ≤ + ε⁻¹ * (Kf ^ 2 * (σ * G + σ⁻¹ * F)) / 2 := by + have hKF_nonneg : 0 ≤ Kf ^ 2 := sq_nonneg Kf + have htail : Kf ^ 2 * σ⁻¹ * F ≤ Kf ^ 2 * (σ * G + σ⁻¹ * F) := by + calc + Kf ^ 2 * σ⁻¹ * F = Kf ^ 2 * (σ⁻¹ * F) := by ring + _ ≤ Kf ^ 2 * (σ * G + σ⁻¹ * F) := + mul_le_mul_of_nonneg_left + (le_add_of_nonneg_left (mul_nonneg hσ.le hG)) + hKF_nonneg + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left htail (inv_nonneg.mpr hε.le)) (by norm_num) + exact hflux.trans (add_le_add hfirst hsecond) + have hproduct : + Kp * (Real.sqrt G * Real.sqrt F) ≤ + ε⁻¹ * (Kp * (σ * G + σ⁻¹ * F) / 2) := + product_sqrt_le_paired_squares hε hε_le hσ hKp hG hF + have hC_ge_grad : Kg ^ 2 / 2 ≤ C := by + dsimp [C] + linarith [sq_nonneg Kg, sq_nonneg Kf, hKp] + have hC_ge_flux : Kf ^ 2 / 2 ≤ C := by + dsimp [C] + linarith [sq_nonneg Kg, sq_nonneg Kf, hKp] + have hC_ge_prod : Kp / 2 ≤ C := by + dsimp [C] + linarith [sq_nonneg Kg, sq_nonneg Kf, hKp] + refine ⟨hC_nonneg, ?_⟩ + calc + Kg * v * Real.sqrt G + Kf * u * Real.sqrt F + + Kp * (Real.sqrt G * Real.sqrt F) + ≤ + (ε * center / 2 + ε⁻¹ * (Kg ^ 2 * (σ * G + σ⁻¹ * F)) / 2) + + (ε * center / 2 + ε⁻¹ * (Kf ^ 2 * (σ * G + σ⁻¹ * F)) / 2) + + ε⁻¹ * (Kp * (σ * G + σ⁻¹ * F) / 2) := by + nlinarith [hgrad', hflux', hproduct] + _ = + ε * center + + ε⁻¹ * ((Kg ^ 2 / 2 + Kf ^ 2 / 2 + Kp / 2) * + (σ * G + σ⁻¹ * F)) := by ring + _ ≤ + C * ε * center + C * ε⁻¹ * (σ * G + σ⁻¹ * F) := by + have hεcenter_nonneg : 0 ≤ ε * center := mul_nonneg hε.le hcenter + have hcoef_le : Kg ^ 2 / 2 + Kf ^ 2 / 2 + Kp / 2 ≤ C := by + linarith [hC_ge_grad, hC_ge_flux, hC_ge_prod] + have hleft1 : ε * center ≤ C * ε * center := by + have hC_ge_one : 1 ≤ C := by + dsimp [C] + linarith [sq_nonneg Kg, sq_nonneg Kf, hKp] + calc + ε * center = 1 * (ε * center) := by ring + _ ≤ C * (ε * center) := + mul_le_mul_of_nonneg_right hC_ge_one hεcenter_nonneg + _ = C * ε * center := by ring + have hleft2 : + ε⁻¹ * ((Kg ^ 2 / 2 + Kf ^ 2 / 2 + Kp / 2) * + (σ * G + σ⁻¹ * F)) ≤ + C * ε⁻¹ * (σ * G + σ⁻¹ * F) := by + have hε_inv_nonneg : 0 ≤ ε⁻¹ := inv_nonneg.mpr hε.le + calc + ε⁻¹ * ((Kg ^ 2 / 2 + Kf ^ 2 / 2 + Kp / 2) * + (σ * G + σ⁻¹ * F)) + = + ((Kg ^ 2 / 2 + Kf ^ 2 / 2 + Kp / 2) * + (ε⁻¹ * (σ * G + σ⁻¹ * F))) := by ring + _ ≤ C * (ε⁻¹ * (σ * G + σ⁻¹ * F)) := + mul_le_mul_of_nonneg_right hcoef_le + (mul_nonneg hε_inv_nonneg hpaired_nonneg) + _ = C * ε⁻¹ * (σ * G + σ⁻¹ * F) := by ring + exact add_le_add hleft1 hleft2 + +private theorem linear_integral_product_absorb + {Ω : Type*} [MeasurableSpace Ω] {P : Measure Ω} [IsProbabilityMeasure P] + {gradWeak fluxWeak : Ω → ℝ} + {gradCoeff fluxCoeff productCoeff Kgrad Kflux Kprod ε σ center u v : ℝ} + (hε : 0 < ε) (hε_le : ε ≤ 1) (hσ_pos : 0 < σ) (hcenter_nonneg : 0 ≤ center) + (hu : 0 ≤ u) (hv : 0 ≤ v) + (hgrad_nonneg_ae : 0 ≤ᵐ[P] gradWeak) (hflux_nonneg_ae : 0 ≤ᵐ[P] fluxWeak) + (hGradSq' : Integrable (fun a => (gradWeak a) ^ 2) P) + (hFluxSq' : Integrable (fun a => (fluxWeak a) ^ 2) P) + (hGradCoeff_nonneg : 0 ≤ gradCoeff) (hFluxCoeff_nonneg : 0 ≤ fluxCoeff) + (hGradCoeff_le : gradCoeff ≤ 2 * Kgrad) (hFluxCoeff_le : fluxCoeff ≤ 2 * Kflux) + (hProductCoeff_le : productCoeff ≤ Kprod) + (hKgrad_nonneg : 0 ≤ Kgrad) (hKflux_nonneg : 0 ≤ Kflux) (hKprod_nonneg : 0 ≤ Kprod) + (hp_center : σ * u ^ 2 ≤ center) (hq_center : σ⁻¹ * v ^ 2 ≤ center) : + (1 / 2 : ℝ) * v * (gradCoeff * ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * u * (fluxCoeff * ∫ a, fluxWeak a ∂P) + + productCoeff * (Real.sqrt (∫ a, (gradWeak a) ^ 2 ∂P) * + Real.sqrt (∫ a, (fluxWeak a) ^ 2 ∂P)) ≤ + (Kgrad ^ 2 + Kflux ^ 2 + Kprod + 2) * ε * center + + (Kgrad ^ 2 + Kflux ^ 2 + Kprod + 2) * ε⁻¹ * + (σ * (∫ a, (gradWeak a) ^ 2 ∂P) + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P)) := by + let G := ∫ a, (gradWeak a) ^ 2 ∂P + let F := ∫ a, (fluxWeak a) ^ 2 ∂P + let C : ℝ := Kgrad ^ 2 + Kflux ^ 2 + Kprod + 2 + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact integral_nonneg fun a => sq_nonneg _ + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact integral_nonneg fun a => sq_nonneg _ + have hIntGrad_le : ∫ a, gradWeak a ∂P ≤ Real.sqrt G := by + simpa [G] using + integral_le_sqrt_integral_sq_of_ae_nonneg + (μ := P) (X := gradWeak) hGradSq' hgrad_nonneg_ae + have hIntFlux_le : ∫ a, fluxWeak a ∂P ≤ Real.sqrt F := by + simpa [F] using + integral_le_sqrt_integral_sq_of_ae_nonneg + (μ := P) (X := fluxWeak) hFluxSq' hflux_nonneg_ae + have hAbsorb_pair := linear_product_absorb_into_centering_and_pairedSquares + (ε := ε) (σ := σ) (center := center) + (G := G) (F := F) (Kg := Kgrad) (Kf := Kflux) (Kp := Kprod) + (u := u) (v := v) + hε hε_le hσ_pos hcenter_nonneg hG_nonneg hF_nonneg + hKgrad_nonneg hKflux_nonneg hKprod_nonneg hp_center hq_center + have hAbsorb := hAbsorb_pair.2 + have hGradTerm_le : + (1 / 2 : ℝ) * v * (gradCoeff * ∫ a, gradWeak a ∂P) ≤ + Kgrad * v * Real.sqrt G := by + have hint_nonneg : 0 ≤ ∫ a, gradWeak a ∂P := + integral_nonneg_of_ae hgrad_nonneg_ae + have hsqrt_nonneg : 0 ≤ Real.sqrt G := Real.sqrt_nonneg _ + calc + (1 / 2 : ℝ) * v * (gradCoeff * ∫ a, gradWeak a ∂P) + = (gradCoeff / 2) * v * (∫ a, gradWeak a ∂P) := by ring + _ ≤ (gradCoeff / 2) * v * Real.sqrt G := by + gcongr + _ ≤ Kgrad * v * Real.sqrt G := by + have hhalf : gradCoeff / 2 ≤ Kgrad := by linarith [hGradCoeff_le] + gcongr + have hFluxTerm_le : + (1 / 2 : ℝ) * u * (fluxCoeff * ∫ a, fluxWeak a ∂P) ≤ + Kflux * u * Real.sqrt F := by + have hint_nonneg : 0 ≤ ∫ a, fluxWeak a ∂P := + integral_nonneg_of_ae hflux_nonneg_ae + have hsqrt_nonneg : 0 ≤ Real.sqrt F := Real.sqrt_nonneg _ + calc + (1 / 2 : ℝ) * u * (fluxCoeff * ∫ a, fluxWeak a ∂P) + = (fluxCoeff / 2) * u * (∫ a, fluxWeak a ∂P) := by ring + _ ≤ (fluxCoeff / 2) * u * Real.sqrt F := by + gcongr + _ ≤ Kflux * u * Real.sqrt F := by + have hhalf : fluxCoeff / 2 ≤ Kflux := by linarith [hFluxCoeff_le] + gcongr + have hProductTerm_le : + productCoeff * (Real.sqrt G * Real.sqrt F) ≤ + Kprod * (Real.sqrt G * Real.sqrt F) := by + exact mul_le_mul_of_nonneg_right hProductCoeff_le + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) + calc + (1 / 2 : ℝ) * v * (gradCoeff * ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * u * (fluxCoeff * ∫ a, fluxWeak a ∂P) + + productCoeff * (Real.sqrt G * Real.sqrt F) + ≤ + Kgrad * v * Real.sqrt G + + Kflux * u * Real.sqrt F + + Kprod * (Real.sqrt G * Real.sqrt F) := + add_le_add (add_le_add hGradTerm_le hFluxTerm_le) hProductTerm_le + _ ≤ + C * ε * center + + C * ε⁻¹ * (σ * G + σ⁻¹ * F) := hAbsorb + +/-- The linear weak-norm terms and the cutoff-product Cauchy term in the first +Section 5.3 expected RHS are absorbed by the special-vector centering term and +the paired weak-norm square expectations. -/ +theorem linearProductTerms_special_le_centering_add_pairedWeakNormSquares + {d : ℕ} [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ε : ℝ}, 0 < ε → ε ≤ 1 → + (let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d (m : ℤ)) s p_e q_e p0_e a.toFun) ^ 2) P) → + (let β := section53CoarseFluctuationBeta hP4 + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d (m : ℤ)) t p_e q_e q0_e a.toFun) ^ 2) P) → + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let gradWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e a.toFun + let fluxWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e a.toFun + let gradCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovScaleWeight (-s) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q s) + let fluxCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * + cubeBesovScaleWeight (-t) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q t) + let productCoeff := + JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t + let G := ∫ a, (gradWeak a) ^ 2 ∂P + let F := ∫ a, (fluxWeak a) ^ 2 ∂P + (1 / 2 : ℝ) * ‖q0_e‖ * (gradCoeff * ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0_e‖ * (fluxCoeff * ∫ a, fluxWeak a ∂P) + + productCoeff * (Real.sqrt G * Real.sqrt F) + ≤ + C * ε * (Real.sqrt θ - 1) ^ 2 + + C * ε⁻¹ * (σ * G + σ⁻¹ * F) := by + classical + dsimp only + let Kgrad : ℝ := + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) / 2 + let Kflux : ℝ := + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) / 2 + let KprodDim : ℝ := + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) + let Kprod : ℝ := max KprodDim 0 + let C : ℝ := Kgrad ^ 2 + Kflux ^ 2 + Kprod + 2 + have hC_nonneg : 0 ≤ C := by + dsimp [C, Kprod] + linarith [sq_nonneg Kgrad, sq_nonneg Kflux, le_max_right KprodDim (0 : ℝ)] + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 k m _hkm e he ε hε hε_le hGradSq hFluxSq + let : IsProbabilityMeasure P := hP.isProbability + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let gradWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e a.toFun + let fluxWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e a.toFun + let gradCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovScaleWeight (-s) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q s) + let fluxCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * + cubeBesovScaleWeight (-t) Q * + JUpperBoundWeakNorms.section53CutoffDualBound Q t) + let productCoeff := + JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t + let G := ∫ a, (gradWeak a) ^ 2 ∂P + let F := ∫ a, (fluxWeak a) ^ 2 ∂P + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs_pos : 0 < s := by + dsimp [s, β] + linarith [hP4.sLower_pos, hβ_pos] + have ht_pos : 0 < t := by + dsimp [t, β] + linarith [hP4.sUpper_pos, hβ_pos] + have hs_nonneg : 0 ≤ s := hs_pos.le + have ht_nonneg : 0 ≤ t := ht_pos.le + have hs_le : s ≤ 1 := by + simpa [s, β] using sLower_add_two_beta_le_one hP4 + have ht_le : t ≤ 1 := by + simpa [t, β] using sUpper_add_two_beta_le_one hP4 + have hst_nonneg : 0 ≤ s + t := add_nonneg hs_nonneg ht_nonneg + have hσ_pos : 0 < σ := by + simpa [σ] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hcenter_nonneg : 0 ≤ (Real.sqrt θ - 1) ^ 2 := sq_nonneg _ + have hgrad_nonneg_ae : 0 ≤ᵐ[P] gradWeak := by + simpa [gradWeak, Q, s, p_e, q_e, p0_e] using + JUpperBoundWeakNorms.canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae + hP Q hs_pos p_e q_e p0_e + have hflux_nonneg_ae : 0 ≤ᵐ[P] fluxWeak := by + simpa [fluxWeak, Q, t, p_e, q_e, q0_e] using + JUpperBoundWeakNorms.canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae + hP Q ht_pos p_e q_e q0_e + have hGradSq' : Integrable (fun a : RegCoeffField d => (gradWeak a) ^ 2) P := by + simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using hGradSq + have hFluxSq' : Integrable (fun a : RegCoeffField d => (fluxWeak a) ^ 2) P := by + simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using hFluxSq + have hGradCoeff_nonneg : 0 ≤ gradCoeff := by + dsimp [gradCoeff] + exact mul_nonneg (Nat.cast_nonneg _) + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovScaleWeight_nonneg (-s) Q)) + (JUpperBoundWeakNorms.section53CutoffDualBound_nonneg Q s)) + have hFluxCoeff_nonneg : 0 ≤ fluxCoeff := by + dsimp [fluxCoeff] + exact mul_nonneg (Nat.cast_nonneg _) + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovScaleWeight_nonneg (-t) Q)) + (JUpperBoundWeakNorms.section53CutoffDualBound_nonneg Q t)) + have hProductCoeff_nonneg : 0 ≤ productCoeff := by + simpa [productCoeff, Q] using + JUpperBoundWeakNorms.section53CutoffProductCoeff_nonneg Q s t + have hGradCoeff_le : gradCoeff ≤ 2 * Kgrad := by + have h := + JUpperBoundWeakNorms.section53_linearCutoffCoeff_le_dimensional + Q hs_nonneg hs_le + calc + gradCoeff ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + simpa [gradCoeff, Q, s, mul_assoc] using h + _ = 2 * Kgrad := by ring + have hFluxCoeff_le : fluxCoeff ≤ 2 * Kflux := by + have h := + JUpperBoundWeakNorms.section53_linearCutoffCoeff_le_dimensional + Q ht_nonneg ht_le + calc + fluxCoeff ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + simpa [fluxCoeff, Q, t, mul_assoc] using h + _ = 2 * Kflux := by ring + have hKgrad_nonneg : 0 ≤ Kgrad := by + linarith [hGradCoeff_le, hGradCoeff_nonneg] + have hKflux_nonneg : 0 ≤ Kflux := by + linarith [hFluxCoeff_le, hFluxCoeff_nonneg] + have hProductCoeff_le_dim : productCoeff ≤ KprodDim := by + simpa [productCoeff, KprodDim, Q, s, t] using + JUpperBoundWeakNorms.section53CutoffProductCoeff_origin_le_dimensional + (d := d) m hs_nonneg hst_nonneg + have hProductCoeff_le : productCoeff ≤ Kprod := + hProductCoeff_le_dim.trans (le_max_left KprodDim (0 : ℝ)) + have hKprod_nonneg : 0 ≤ Kprod := le_max_right KprodDim (0 : ℝ) + have hq_center : + σ⁻¹ * ‖q0_e‖ ^ 2 ≤ (Real.sqrt θ - 1) ^ 2 := by + simpa [σ, θ, p_e, q_e, q0_e] using + inv_sigmaHatAtScale_mul_norm_specialQCentering_sq_le_of_vecNormSq_eq_one + hP hStruct hP4 m e he + have hp_center : + σ * ‖p0_e‖ ^ 2 ≤ (Real.sqrt θ - 1) ^ 2 := by + simpa [σ, θ, p_e, q_e, p0_e] using + sigmaHatAtScale_mul_norm_specialPCentering_sq_le_of_vecNormSq_eq_one + hP hStruct hP4 m e he + exact linear_integral_product_absorb hε hε_le hσ_pos hcenter_nonneg + (norm_nonneg _) (norm_nonneg _) hgrad_nonneg_ae hflux_nonneg_ae hGradSq' hFluxSq' + hGradCoeff_nonneg hFluxCoeff_nonneg hGradCoeff_le hFluxCoeff_le hProductCoeff_le + hKgrad_nonneg hKflux_nonneg hKprod_nonneg hp_center hq_center + +/-- Almost-sure paired square version of the beta-shifted weak-norm maximizer +input. This is kept pointwise so subsequent expectation estimates can expand +the RHS into separately integrable manuscript pieces. -/ +theorem ae_paired_weakNormSquares_special_le_four_rhsSquares + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) : + ∀ᵐ a ∂P, + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e a.toFun + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e a.toFun + let gradRHS := + WeakNormsMaximizer.gradientRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a + let fluxRHS := + WeakNormsMaximizer.fluxRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a + σ * gradWeak ^ 2 + σ⁻¹ * fluxWeak ^ 2 ≤ + 4 * (σ * gradRHS ^ 2 + σ⁻¹ * fluxRHS ^ 2) := by + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hs_pos : 0 < s := by + dsimp [s, β] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have ht_pos : 0 < t := by + dsimp [t, β] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hσ_nonneg : 0 ≤ σ := by + exact sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + filter_upwards + [ae_specialWeakNormsMaximizer_homogenizationScale hP hStruct hP4 hkm e, + JUpperBoundWeakNorms.canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae + hP Q hs_pos p_e q_e p0_e, + JUpperBoundWeakNorms.canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae + hP Q ht_pos p_e q_e q0_e] with a hWeak hGradNonneg hFluxNonneg + dsimp only at hWeak ⊢ + let s' := hP4.sLower + β + let t' := hP4.sUpper + β + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e a.toFun + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e a.toFun + let gradRHS := + WeakNormsMaximizer.gradientRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a + let fluxRHS := + WeakNormsMaximizer.fluxRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a + have hGrad_le : gradWeak ≤ 2 * gradRHS := by + simpa [gradWeak, gradRHS, Q, s, s', t, t', p_e, q_e, p0_e, q0_e, β] using + hWeak.1 + have hFlux_le : fluxWeak ≤ 2 * fluxRHS := by + simpa [fluxWeak, fluxRHS, Q, s, s', t, t', p_e, q_e, p0_e, q0_e, β] using + hWeak.2 + have hGradRHS_nonneg : 0 ≤ 2 * gradRHS := hGradNonneg.trans hGrad_le + have hFluxRHS_nonneg : 0 ≤ 2 * fluxRHS := hFluxNonneg.trans hFlux_le + have hGradSq_le : gradWeak ^ 2 ≤ 4 * gradRHS ^ 2 := by + have hsq := (sq_le_sq₀ hGradNonneg hGradRHS_nonneg).2 hGrad_le + calc + gradWeak ^ 2 ≤ (2 * gradRHS) ^ 2 := hsq + _ = 4 * gradRHS ^ 2 := by ring + have hFluxSq_le : fluxWeak ^ 2 ≤ 4 * fluxRHS ^ 2 := by + have hsq := (sq_le_sq₀ hFluxNonneg hFluxRHS_nonneg).2 hFlux_le + calc + fluxWeak ^ 2 ≤ (2 * fluxRHS) ^ 2 := hsq + _ = 4 * fluxRHS ^ 2 := by ring + calc + σ * gradWeak ^ 2 + σ⁻¹ * fluxWeak ^ 2 + ≤ σ * (4 * gradRHS ^ 2) + σ⁻¹ * (4 * fluxRHS ^ 2) := + add_le_add + (mul_le_mul_of_nonneg_left hGradSq_le hσ_nonneg) + (mul_le_mul_of_nonneg_left hFluxSq_le hσ_inv_nonneg) + _ = 4 * (σ * gradRHS ^ 2 + σ⁻¹ * fluxRHS ^ 2) := by ring + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleExpectation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleExpectation.lean new file mode 100644 index 0000000000..c11c4f5381 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleExpectation.lean @@ -0,0 +1,568 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleTails +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.RHSConversion + +/-! # Low Scale Expectation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +/-! +# Low-scale expectation estimates + +This proof-internal file owns the expectation-level conversion of the +low-scale tails in the third Section 5.3 lemma. The pointwise low-scale split +stays in `LowScaleTails.lean`. +-/ + +noncomputable section + +private theorem lowScaleTailFactor_le_beta_inv_cube {β n : ℝ} + (hβ_pos : 0 < β) (hβ_le_one : β ≤ 1) (hn_nonneg : 0 ≤ n) : + (β ^ 2)⁻¹ * Real.rpow (3 : ℝ) (-2 * β * n) ≤ (β ^ 3)⁻¹ := by + have hexp_nonpos : -2 * β * n ≤ 0 := by nlinarith + have hdecay_le_one : + Real.rpow (3 : ℝ) (-2 * β * n) ≤ 1 := by + calc + Real.rpow (3 : ℝ) (-2 * β * n) + ≤ Real.rpow (1 : ℝ) (-2 * β * n) := + Real.rpow_le_rpow_of_nonpos (by norm_num : (0 : ℝ) < 1) + (by norm_num : (1 : ℝ) ≤ 3) hexp_nonpos + _ = 1 := by simp + have hsq_inv_nonneg : 0 ≤ (β ^ 2)⁻¹ := + inv_nonneg.mpr (sq_nonneg β) + have hsq_inv_le_cube_inv : (β ^ 2)⁻¹ ≤ (β ^ 3)⁻¹ := by + have hpow_le : β ^ 3 ≤ β ^ 2 := by + nlinarith [sq_nonneg β, hβ_le_one] + exact (inv_le_inv₀ (pow_pos hβ_pos 2) (pow_pos hβ_pos 3)).mpr hpow_le + calc + (β ^ 2)⁻¹ * Real.rpow (3 : ℝ) (-2 * β * n) + ≤ (β ^ 2)⁻¹ * 1 := + mul_le_mul_of_nonneg_left hdecay_le_one hsq_inv_nonneg + _ ≤ (β ^ 3)⁻¹ := by simpa using hsq_inv_le_cube_inv + +private theorem integral_le_scaled_baseline_excess + {Ω : Type*} [MeasurableSpace Ω] {P : Measure Ω} + {X Jm childAvg lowerExcess upperExcess : Ω → ℝ} {tailFactor baseline σ : ℝ} + (hJInt : Integrable Jm P) + (hLowerChildInt : Integrable (fun a => lowerExcess a * childAvg a) P) + (hUpperChildInt : Integrable (fun a => upperExcess a * childAvg a) P) + (hXAEMeas : AEMeasurable X P) + (hPointXY : X ≤ᵐ[P] fun a => tailFactor * + (baseline * Jm a + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a)) + (hXNonneg : ∀ᵐ a ∂P, 0 ≤ X a) : + Integrable X P ∧ ∫ a, X a ∂P ≤ + tailFactor * (baseline * ∫ a, Jm a ∂P + + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P))) := by + let Y : Ω → ℝ := + fun a => + tailFactor * + (baseline * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) + have hPosInt : + Integrable + (fun a : Ω => + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) P := by + have hsum : + Integrable + (fun a : Ω => + σ * (lowerExcess a * childAvg a) + + σ⁻¹ * (upperExcess a * childAvg a)) P := + (hLowerChildInt.const_mul σ).add (hUpperChildInt.const_mul σ⁻¹) + refine hsum.congr ?_ + filter_upwards with a + ring + have hYInt : Integrable Y P := by + have hInside : + Integrable + (fun a : Ω => + baseline * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) P := + (hJInt.const_mul (baseline)).add + hPosInt + simpa [Y] using hInside.const_mul tailFactor + have hXInt : Integrable X P := by + refine Integrable.mono' hYInt hXAEMeas.aestronglyMeasurable ?_ + filter_upwards [hPointXY, hXNonneg] with a hle hnonneg + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hle + have hIntegralY : + ∫ a, Y a ∂P = + tailFactor * + (baseline * ∫ a, Jm a ∂P + + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P))) := by + calc + ∫ a, Y a ∂P = + tailFactor * + ∫ a, + (baseline * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) ∂P := by + simp [Y, integral_const_mul] + _ = + tailFactor * + (∫ a, baseline * Jm a ∂P + + ∫ a, (σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a ∂P) := by + rw [integral_add (hJInt.const_mul _) hPosInt] + _ = + tailFactor * + (baseline * ∫ a, Jm a ∂P + + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P))) := by + rw [integral_const_mul] + congr 1 + have hsplit : + ∫ a, (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a ∂P = + ∫ a, σ * (lowerExcess a * childAvg a) + + σ⁻¹ * (upperExcess a * childAvg a) ∂P := by + refine integral_congr_ae ?_ + filter_upwards with a + ring + rw [hsplit] + rw [integral_add (hLowerChildInt.const_mul σ) + (hUpperChildInt.const_mul σ⁻¹)] + rw [integral_const_mul, integral_const_mul] + refine ⟨hXInt, ?_⟩ + exact (integral_mono_ae hXInt hYInt hPointXY).trans_eq hIntegralY + +/-- Raw expectation-level low-scale reduction: the paired low-scale tails are +bounded by the parent-response baseline plus the shifted positive-excess terms +with the child-response average. -/ +theorem integral_paired_lowScaleTailSquares_special_le_rawLowScaleTerms + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let childAvg : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let tailFactor := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + Integrable + (fun a : RegCoeffField d => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) P ∧ + ∫ a, + (σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + Ch04.expectedResponseJCubeSet P Q p_e q_e + + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P))) := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let Jm : RegCoeffField d → ℝ := + fun a => Ch04.restrictionResponseJObservableCubeSet Q p_e q_e a + let childAvg : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let tailFactor := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + let X : RegCoeffField d → ℝ := + fun a => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let Y : RegCoeffField d → ℝ := + fun a => + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) + have htail_nonneg : 0 ≤ tailFactor := by + dsimp [tailFactor] + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hJInt : Integrable Jm P := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube Q) P := by + simpa [Q] using + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + simpa [Jm] using! + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + Q p_e q_e hBlock + obtain ⟨hLowerAE, hUpperAE, hLowerMem, hUpperMem⟩ := + shifted_excess_regularity hP hStruct hP4 m + have hJAE : AEMeasurable Jm P := by + simpa [Jm] using! hP.aemeasurable_restrictionResponseJObservableCubeSet Q p_e q_e + have hGradAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) P := by + simpa [WeakNormsMaximizer.gradientLowScaleTailAtScale, Q, s, s', Jm] using! + (((aemeasurable_const.mul aemeasurable_const).mul hLowerAE.sqrt).mul + hJAE.sqrt) + have hFluxAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) P := by + simpa [WeakNormsMaximizer.fluxLowScaleTailAtScale, Q, t, t', Jm] using! + (((aemeasurable_const.mul aemeasurable_const).mul hUpperAE.sqrt).mul + hJAE.sqrt) + have hXAEMeas : AEMeasurable X P := by + simpa [X, pow_two] using! + (aemeasurable_const.mul (hGradAE.mul hGradAE)).add + (aemeasurable_const.mul (hFluxAE.mul hFluxAE)) + let ζ := section53CoarseFluctuationZeta hP4 + have hChildMem : + MemLp childAvg (ENNReal.ofReal ζ) P := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm.le + simpa [childAvg, Q, j, ζ, p_e, q_e] using + memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + hP hstat hStruct hP4 hk_nonneg hkm_int p_e q_e + have hHolderReal : ζ.HolderConjugate (hP4.xi : ℝ) := by + simpa [ζ] using + (holderConjugate_xi_section53CoarseFluctuationZeta hP4).symm + let : ENNReal.HolderTriple (ENNReal.ofReal ζ) + (ENNReal.ofReal (hP4.xi : ℝ)) 1 := by + simpa using Real.HolderTriple.ennrealOfReal hHolderReal + have hLowerChildInt : + Integrable (fun a : RegCoeffField d => lowerExcess a * childAvg a) P := by + simpa [mul_comm] using! hChildMem.integrable_mul hLowerMem + have hUpperChildInt : + Integrable (fun a : RegCoeffField d => upperExcess a * childAvg a) P := by + simpa [mul_comm] using! hChildMem.integrable_mul hUpperMem + have hParent_le_child : Jm ≤ᵐ[P] childAvg := by + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm.le + simpa [Jm, childAvg, Q, j] using! + hP.restrictionResponseJObservableCubeSet_le_descendantsAverage_ae + (n := (k : ℤ)) (m := (m : ℤ)) hkm_int p_e q_e + have hPointXY : X ≤ᵐ[P] Y := by + filter_upwards [hParent_le_child] with a hsub + have hpoint0 := + paired_lowScaleTailSquares_special_le_baseline_add_positiveExcess + hP hStruct hP4 hkm.le e a + have hpoint0' : X a ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * Jm a) := by + simpa [X, tailFactor, lowerExcess, upperExcess, Jm, Q, p_e, q_e, + σ, s, s', t, t', β] using hpoint0 + have hcoef_nonneg : + 0 ≤ σ * lowerExcess a + σ⁻¹ * upperExcess a := by + exact add_nonneg + (mul_nonneg hσ_nonneg (le_max_right _ _)) + (mul_nonneg hσ_inv_nonneg (le_max_right _ _)) + have hpos_le : + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * Jm a ≤ + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a := + mul_le_mul_of_nonneg_left hsub hcoef_nonneg + have hinside_le : + coarseFluctuationScalarWeightAtScale hP hStruct m * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * Jm a + ≤ + coarseFluctuationScalarWeightAtScale hP hStruct m * Jm a + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a := + add_le_add le_rfl hpos_le + exact hpoint0'.trans (mul_le_mul_of_nonneg_left hinside_le htail_nonneg) + have hXNonneg : ∀ᵐ a ∂P, 0 ≤ X a := by + filter_upwards with a + dsimp [X] + exact add_nonneg + (mul_nonneg hσ_nonneg (sq_nonneg _)) + (mul_nonneg hσ_inv_nonneg (sq_nonneg _)) + have hbound := integral_le_scaled_baseline_excess + hJInt hLowerChildInt hUpperChildInt hXAEMeas hPointXY hXNonneg + refine ⟨by simpa [X, β, s, s', t, t', p_e, q_e, σ] using hbound.1, ?_⟩ + simpa [X, Jm, Ch04.expectedResponseJCubeSet] using hbound.2 + +private theorem lowScale_combine {X tail baseline excess C lowTerm posTerm : ℝ} + (hraw : X ≤ tail * (baseline + excess)) + (hbaseline : tail * baseline ≤ C * lowTerm) + (hpositive : tail * excess ≤ C * posTerm) : + X ≤ C * (lowTerm + posTerm) := by + calc + X ≤ tail * (baseline + excess) := hraw + _ = tail * baseline + tail * excess := by ring + _ ≤ C * lowTerm + C * posTerm := add_le_add hbaseline hpositive + _ = C * (lowTerm + posTerm) := by ring + +/-- Final low-scale expectation conversion in manuscript form. -/ +theorem integral_paired_lowScaleTailSquares_special_le_coarseFluctuationTerms_uniform + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + ∫ a, + (σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + ≤ + C * + ((β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + dsimp only + rcases ellipticityPositiveExcess_childResponseAverage_expectation_le_uniform + params with ⟨Cpos, hCpos_nonneg, hCpos_all⟩ + let C : ℝ := max 1 Cpos + refine ⟨C, by dsimp [C]; exact le_trans zero_le_one (le_max_left _ _), ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e he + subst params + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let childAvg : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let tailFactor := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + let lowTerm := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let posCore := + (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let posTerm := (β ^ 3)⁻¹ * posCore + have hCpos := hCpos_all hP hstat hStruct hP4 rfl hkm e + have hC_ge_one : 1 ≤ C := le_max_left _ _ + have hC_ge_pos : Cpos ≤ C := le_max_right _ _ + have hraw := + integral_paired_lowScaleTailSquares_special_le_rawLowScaleTerms + hP hstat hStruct hP4 hkm e + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_le_one : β ≤ 1 := by + have hle := sLower_add_beta_le_one hP4 + dsimp [β] at hle ⊢ + linarith [hP4.sLower_pos] + have htail_nonneg : 0 ≤ tailFactor := by + dsimp [tailFactor] + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have htail_le_beta_inv_cube : + tailFactor ≤ (β ^ 3)⁻¹ := by + simpa [tailFactor] using + lowScaleTailFactor_le_beta_inv_cube hβ_pos hβ_le_one + (show 0 ≤ (((m - k : ℕ) : ℝ)) by positivity) + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hθ_sub_nonneg : 0 ≤ θ - 1 := by linarith + have hscalar_nonneg : + 0 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := + coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m + have hunit_nonneg : + 0 ≤ coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := + coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m + have hresponse_nonneg : + 0 ≤ coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := + coarseFluctuationResponseMomentAtScale_nonneg hP hStruct hP4 k m e + have hposCore_nonneg : 0 ≤ posCore := by + dsimp [posCore] + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le hP4.xi) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hunit_nonneg) + hresponse_nonneg + have hposTerm_nonneg : 0 ≤ posTerm := by + dsimp [posTerm] + exact mul_nonneg (inv_nonneg.mpr (pow_nonneg hβ_pos.le 3)) hposCore_nonneg + have hlowTerm_nonneg : 0 ≤ lowTerm := by + dsimp [lowTerm] + exact mul_nonneg (mul_nonneg htail_nonneg hscalar_nonneg) hθ_sub_nonneg + have hJ_le : + Ch04.expectedResponseJCubeSet P Q p_e q_e ≤ θ - 1 := by + simpa [Q, p_e, q_e, θ] using + expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_of_vecNormSq_eq_one + hP hStruct hP4 m e he + have hbaseline_le : + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + Ch04.expectedResponseJCubeSet P Q p_e q_e) + ≤ C * lowTerm := by + calc + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + Ch04.expectedResponseJCubeSet P Q p_e q_e) + ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1)) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hJ_le hscalar_nonneg) htail_nonneg + _ = 1 * lowTerm := by simp [lowTerm, tailFactor, mul_assoc] + _ ≤ C * lowTerm := + mul_le_mul_of_nonneg_right hC_ge_one hlowTerm_nonneg + have hpositive_child_le : + σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P) + ≤ Cpos * posCore := by + calc + σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P) + ≤ + Cpos * (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + simpa [β, s', t', Q, j, p_e, q_e, σ, childAvg, lowerExcess, + upperExcess] using hCpos + _ = Cpos * posCore := by + simp [posCore] + ring + have hpositive_le : + tailFactor * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) + ≤ C * posTerm := by + calc + tailFactor * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) + ≤ tailFactor * (Cpos * posCore) := + mul_le_mul_of_nonneg_left hpositive_child_le htail_nonneg + _ = Cpos * (tailFactor * posCore) := by ring + _ ≤ Cpos * ((β ^ 3)⁻¹ * posCore) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right htail_le_beta_inv_cube hposCore_nonneg) + hCpos_nonneg + _ ≤ C * ((β ^ 3)⁻¹ * posCore) := + mul_le_mul_of_nonneg_right hC_ge_pos hposTerm_nonneg + _ = C * posTerm := by simp [posTerm] + have hmain : + ∫ a, + (σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + ≤ C * (lowTerm + posTerm) := by + refine lowScale_combine ?_ hbaseline_le hpositive_le + simpa [β, s, s', t, t', Q, j, p_e, q_e, σ, childAvg, + lowerExcess, upperExcess, tailFactor] using hraw.2 + simpa only [lowTerm, posTerm, posCore, mul_assoc, mul_left_comm, mul_comm] using hmain + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleTails.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleTails.lean new file mode 100644 index 0000000000..2a0fb4e5a7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/LowScaleTails.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessResponseDefect + +/-! # Low Scale Tails -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +/-! +# Low-scale tails for the coarse-fluctuation lemma + +This proof-internal file owns the low-scale tail route in the final +coarse-fluctuation assembly. The important point is that the weak-norm +maximizer is instantiated with two buffers, so the ellipticity coefficients in +the low-scale tails are shifted by one buffer. +-/ + +noncomputable section + +private theorem rpow_three_sq (x : ℝ) : + Real.rpow (3 : ℝ) x ^ 2 = Real.rpow (3 : ℝ) (2 * x) := by + calc + Real.rpow (3 : ℝ) x ^ 2 = + Real.rpow (3 : ℝ) x * Real.rpow (3 : ℝ) x := by ring + _ = Real.rpow (3 : ℝ) (x + x) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) x x).symm + _ = Real.rpow (3 : ℝ) (2 * x) := by ring_nf + +private theorem inv_sq_eq_inv_sq {x : ℝ} (hx : x ≠ 0) : + x⁻¹ ^ 2 = (x ^ 2)⁻¹ := by + field_simp [hx] + +private theorem positivePart_split_le (x base : ℝ) : + x ≤ base + max (x - base) 0 := by + by_cases h : x ≤ base + · exact h.trans (le_add_of_nonneg_right (le_max_right _ _)) + · have hx : base ≤ x := le_of_lt (lt_of_not_ge h) + have hmax : max (x - base) 0 = x - base := max_eq_left (sub_nonneg.mpr hx) + linarith + +private theorem buffered_lowScaleTail_sq (m k : ℕ) {β coefficient Jm : ℝ} + (hβ_ne : β ≠ 0) (hcoefficient_nonneg : 0 ≤ coefficient) (hJ_nonneg : 0 ≤ Jm) : + (β⁻¹ * Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ)) * + Real.sqrt coefficient * Real.sqrt Jm) ^ 2 = + (β ^ 2)⁻¹ * Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + (coefficient * Jm) := by + have hpow : + Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ)) ^ 2 = + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) := by + have hmk : + (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ) = ((m - k : ℕ) : ℝ) := by + have hmk_nat : Int.toNat ((m : ℤ) - (k : ℤ)) = m - k := by + omega + exact_mod_cast hmk_nat + rw [hmk] + calc + Real.rpow (3 : ℝ) (-β * ((m - k : ℕ) : ℝ)) ^ 2 = + Real.rpow (3 : ℝ) (2 * (-β * ((m - k : ℕ) : ℝ))) := + rpow_three_sq _ + _ = Real.rpow (3 : ℝ) (-2 * β * ((m - k : ℕ) : ℝ)) := by ring_nf + change + (β⁻¹ * Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ)) * + Real.sqrt coefficient * Real.sqrt Jm) ^ 2 = + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + (coefficient * Jm) + have hsqrt : + (Real.sqrt coefficient * Real.sqrt Jm) ^ 2 = coefficient * Jm := by + rw [mul_pow, Real.sq_sqrt hcoefficient_nonneg, Real.sq_sqrt hJ_nonneg] + calc + (β⁻¹ * Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ)) * + Real.sqrt coefficient * Real.sqrt Jm) ^ 2 + = + (β⁻¹) ^ 2 * + Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ)) ^ 2 * + (Real.sqrt coefficient * Real.sqrt Jm) ^ 2 := by ring + _ = + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + (coefficient * Jm) := by + rw [inv_sq_eq_inv_sq hβ_ne, hpow, hsqrt] + +/-- Pointwise algebraic reduction of the paired low-scale tails. The +ellipticity coefficients are the shifted coefficients +`sLower + beta` and `sUpper + beta`, as required for the Section 5.2 moment +input. -/ +theorem paired_lowScaleTailSquares_special_le_baseline_add_positiveExcess + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) (a : RegCoeffField d) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let Jm := Ch04.restrictionResponseJObservableCubeSet Q p_e q_e a + let lowerCoeff := (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ + let upperCoeff := Ch04.LambdaSqCoeffField Q t' (.finite 1) a + let lowerBase := (hP.barSigmaStarAtScale hStruct 0)⁻¹ + let upperBase := hP.barSigmaAtScale hStruct 0 + let lowerExcess := max (lowerCoeff - lowerBase) 0 + let upperExcess := max (upperCoeff - upperBase) 0 + let tailFactor := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm + + (σ * lowerExcess + σ⁻¹ * upperExcess) * Jm) := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let Jm := Ch04.restrictionResponseJObservableCubeSet Q p_e q_e a + let lowerCoeff := (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ + let upperCoeff := Ch04.LambdaSqCoeffField Q t' (.finite 1) a + let lowerBase := (hP.barSigmaStarAtScale hStruct 0)⁻¹ + let upperBase := hP.barSigmaAtScale hStruct 0 + let lowerExcess := max (lowerCoeff - lowerBase) 0 + let upperExcess := max (upperCoeff - upperBase) 0 + let tailFactor := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_ne : β ≠ 0 := hβ_pos.ne' + have hs'_pos : 0 < s' := by + dsimp [s', β] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have ht'_pos : 0 < t' := by + dsimp [t', β] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hlower_nonneg : 0 ≤ lowerCoeff := by + dsimp [lowerCoeff] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hs'_pos (by norm_num)) + have hupper_nonneg : 0 ≤ upperCoeff := by + dsimp [upperCoeff] + exact Ch04.LambdaSqCoeffField_finite_nonneg Q a ht'_pos (by norm_num) + have hJ_nonneg : 0 ≤ Jm := by + dsimp [Jm] + exact Ch04.restrictionResponseJObservableCubeSet_nonneg Q p_e q_e a + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have htail_nonneg : 0 ≤ tailFactor := by + dsimp [tailFactor] + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hlower_split : lowerCoeff ≤ lowerBase + lowerExcess := by + simpa [lowerExcess] using positivePart_split_le lowerCoeff lowerBase + have hupper_split : upperCoeff ≤ upperBase + upperExcess := by + simpa [upperExcess] using positivePart_split_le upperCoeff upperBase + have hgrad_sq : + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 = + tailFactor * (lowerCoeff * Jm) := by + dsimp [WeakNormsMaximizer.gradientLowScaleTailAtScale, tailFactor, + Q, s, s', β] + have hgap : hP4.sLower + 2 * β - (hP4.sLower + β) = β := by ring + rw [hgap] + exact buffered_lowScaleTail_sq m k hβ_ne hlower_nonneg hJ_nonneg + have hflux_sq : + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 = + tailFactor * (upperCoeff * Jm) := by + dsimp [WeakNormsMaximizer.fluxLowScaleTailAtScale, tailFactor, + Q, t, t', β] + have hgap : hP4.sUpper + 2 * β - (hP4.sUpper + β) = β := by ring + rw [hgap] + exact buffered_lowScaleTail_sq m k hβ_ne hupper_nonneg hJ_nonneg + have hpoint : + σ * (tailFactor * (lowerCoeff * Jm)) + + σ⁻¹ * (tailFactor * (upperCoeff * Jm)) ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm + + (σ * lowerExcess + σ⁻¹ * upperExcess) * Jm) := by + have hlowerJ : + lowerCoeff * Jm ≤ (lowerBase + lowerExcess) * Jm := + mul_le_mul_of_nonneg_right hlower_split hJ_nonneg + have hupperJ : + upperCoeff * Jm ≤ (upperBase + upperExcess) * Jm := + mul_le_mul_of_nonneg_right hupper_split hJ_nonneg + calc + σ * (tailFactor * (lowerCoeff * Jm)) + + σ⁻¹ * (tailFactor * (upperCoeff * Jm)) + = + tailFactor * (σ * (lowerCoeff * Jm) + σ⁻¹ * (upperCoeff * Jm)) := by ring + _ ≤ + tailFactor * (σ * ((lowerBase + lowerExcess) * Jm) + + σ⁻¹ * ((upperBase + upperExcess) * Jm)) := by + refine mul_le_mul_of_nonneg_left ?_ htail_nonneg + exact add_le_add + (mul_le_mul_of_nonneg_left hlowerJ hσ_nonneg) + (mul_le_mul_of_nonneg_left hupperJ hσ_inv_nonneg) + _ = + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm + + (σ * lowerExcess + σ⁻¹ * upperExcess) * Jm) := by + dsimp [coarseFluctuationScalarWeightAtScale, σ, lowerBase, + upperBase, lowerExcess, upperExcess] + ring + calc + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + = + σ * (tailFactor * (lowerCoeff * Jm)) + + σ⁻¹ * (tailFactor * (upperCoeff * Jm)) := by + rw [hgrad_sq, hflux_sq] + _ ≤ + tailFactor * + (coarseFluctuationScalarWeightAtScale hP hStruct m * Jm + + (σ * lowerExcess + σ⁻¹ * upperExcess) * Jm) := hpoint + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedSquares.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedSquares.lean new file mode 100644 index 0000000000..8792a4e56f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedSquares.lean @@ -0,0 +1,822 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LowScaleExpectation + +/-! # Paired Squares -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Paired weak-norm square conversion + +This proof-internal file assembles the square estimates coming from the +weak-norm maximizer theorem for the third Section 5.3 lemma. +-/ + +noncomputable section + +attribute [local irreducible] coarseFluctuationScalarWeightAtScale + coarseFluctuationTauSumAtScale coarseFluctuationUnitMomentWeightAtScale + coarseFluctuationResponseMomentAtScale + +private theorem positivePart_split_le (x base : ℝ) : + x ≤ base + max (x - base) 0 := by + by_cases h : x ≤ base + · exact h.trans (le_add_of_nonneg_right (le_max_right _ _)) + · have hx : base ≤ x := le_of_lt (lt_of_not_ge h) + have hmax : max (x - base) 0 = x - base := max_eq_left (sub_nonneg.mpr hx) + linarith + +/-- Pointwise decomposition of the response-defect mismatch-square pair in +the weak-norm maximizer RHS. The endpoint ellipticity factors are split into +their scale-zero baseline plus the shifted positive excess. -/ +theorem paired_mismatchTermSquares_special_le_baseline_add_positiveExcess + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) (a : RegCoeffField d) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let defectSum : ℝ := + ∑ n ∈ Finset.Icc (((k : ℤ) + 1)) (m : ℤ), + Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) + let lowerExcess : ℝ := + max + ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : ℝ := + max + (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + ≤ + (coarseFluctuationScalarWeightAtScale hP hStruct m + + (σ * lowerExcess + σ⁻¹ * upperExcess)) * + defectSum ^ 2 := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let D : ℝ := + ∑ n ∈ Finset.Icc (((k : ℤ) + 1)) (m : ℤ), + Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) + let lowerCoeff : ℝ := (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ + let upperCoeff : ℝ := Ch04.LambdaSqCoeffField Q t' (.finite 1) a + let lowerBase : ℝ := (hP.barSigmaStarAtScale hStruct 0)⁻¹ + let upperBase : ℝ := hP.barSigmaAtScale hStruct 0 + let lowerExcess : ℝ := max (lowerCoeff - lowerBase) 0 + let upperExcess : ℝ := max (upperCoeff - upperBase) 0 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs'_pos : 0 < s' := by + dsimp [s', β] + linarith [hP4.sLower_pos, hβ_pos] + have ht'_pos : 0 < t' := by + dsimp [t', β] + linarith [hP4.sUpper_pos, hβ_pos] + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hlowerCoeff_nonneg : 0 ≤ lowerCoeff := by + dsimp [lowerCoeff] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hs'_pos (by norm_num)) + have hupperCoeff_nonneg : 0 ≤ upperCoeff := by + dsimp [upperCoeff] + exact Ch04.LambdaSqCoeffField_finite_nonneg Q a ht'_pos (by norm_num) + have hGradSq : + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 = + lowerCoeff * D ^ 2 := by + have hgap : s - s' = β := by + dsimp [s, s'] + ring + dsimp [WeakNormsMaximizer.gradientMismatchTermAtScale, D, lowerCoeff, Q] + rw [hgap] + rw [mul_pow, Real.sq_sqrt hlowerCoeff_nonneg] + have hFluxSq : + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 = + upperCoeff * D ^ 2 := by + have hgap : t - t' = β := by + dsimp [t, t'] + ring + dsimp [WeakNormsMaximizer.fluxMismatchTermAtScale, D, upperCoeff, Q] + rw [hgap] + rw [mul_pow, Real.sq_sqrt hupperCoeff_nonneg] + have hlower_le : lowerCoeff ≤ lowerBase + lowerExcess := by + simpa [lowerExcess] using positivePart_split_le lowerCoeff lowerBase + have hupper_le : upperCoeff ≤ upperBase + upperExcess := by + simpa [upperExcess] using positivePart_split_le upperCoeff upperBase + have hDsq_nonneg : 0 ≤ D ^ 2 := sq_nonneg _ + have hScalarWeight : + coarseFluctuationScalarWeightAtScale hP hStruct m = + σ * lowerBase + σ⁻¹ * upperBase := by + unfold coarseFluctuationScalarWeightAtScale + simp [σ, lowerBase, upperBase] + calc + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + = + (σ * lowerCoeff + σ⁻¹ * upperCoeff) * D ^ 2 := by + rw [hGradSq, hFluxSq] + ring + _ ≤ + (σ * (lowerBase + lowerExcess) + + σ⁻¹ * (upperBase + upperExcess)) * D ^ 2 := by + exact mul_le_mul_of_nonneg_right + (add_le_add + (mul_le_mul_of_nonneg_left hlower_le hσ_nonneg) + (mul_le_mul_of_nonneg_left hupper_le hσ_inv_nonneg)) + hDsq_nonneg + _ = + (coarseFluctuationScalarWeightAtScale hP hStruct m + + (σ * lowerExcess + σ⁻¹ * upperExcess)) * D ^ 2 := by + rw [hScalarWeight] + ring + +/-- Expectation-level conversion for the paired response-defect mismatch +squares in the weak-norm maximizer RHS. -/ +theorem integral_paired_mismatchTermSquares_special_le_coarseFluctuationTerms_uniform + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + Integrable + (fun a : RegCoeffField d => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) P ∧ + ∫ a, + (σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + ≤ + C * + ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + classical + rcases ellipticityPositiveExcess_childResponseAverage_expectation_le_uniform + params with ⟨Cpos, hCpos_nonneg, hCpos_all⟩ + let C : ℝ := max 10 (25 * Cpos + 10) + refine ⟨C, by + dsimp [C] + exact le_trans (by norm_num : (0 : ℝ) ≤ 10) (le_max_left _ _), ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e + subst params + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let j : ℕ := Int.toNat ((m : ℤ) - (k : ℤ)) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let S : Finset ℤ := Finset.Icc (((k : ℤ) + 1)) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + let defectSum : RegCoeffField d → ℝ := + fun a => + ∑ n ∈ S, w n * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) + let childAvg : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let X : RegCoeffField d → ℝ := + fun a => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let coeff : ℝ := (5 * β⁻¹) ^ 2 + let Y : RegCoeffField d → ℝ := + fun a => + coarseFluctuationScalarWeightAtScale hP hStruct m * (defectSum a) ^ 2 + + coeff * ((σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) + have hCpos := hCpos_all hP hstat hStruct hP4 rfl hkm e + have hC_ge_ten : 10 ≤ C := by dsimp [C]; exact le_max_left _ _ + have hC_ge_pos : 25 * Cpos ≤ C := by + dsimp [C] + have hle : 25 * Cpos ≤ 25 * Cpos + 10 := by linarith + exact hle.trans (le_max_right _ _) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_le_one : β ≤ 1 := by + have hle := sLower_add_beta_le_one hP4 + dsimp [β] at hle ⊢ + linarith [hP4.sLower_pos] + have hs'_pos : 0 < s' := by + dsimp [s', β] + linarith [hP4.sLower_pos, hβ_pos] + have ht'_pos : 0 < t' := by + dsimp [t', β] + linarith [hP4.sUpper_pos, hβ_pos] + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm.le + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hscalar_nonneg : + 0 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := + coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m + have hBlockM : + Integrable + (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hParent : + Integrable + (Ch04.restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p_e q_e) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d (m : ℤ)) p_e q_e hBlockM + have hDesc : + ∀ n ∈ S, + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p_e q_e) P := by + intro n hn R hR + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk0 : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat n : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat n) + have hOrigin : + Integrable + (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P := by + simpa [Int.toNat_of_nonneg hn_nonneg] using hOrigin_nat + have hBlockR : + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hn_nonneg hnm hR hOrigin + exact + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + R p_e q_e hBlockR + have hw : ∀ n ∈ S, 0 ≤ w n := by + intro n _hn + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hDsqInt : + Integrable (fun a : RegCoeffField d => (defectSum a) ^ 2) P := by + simpa [defectSum, S, w, p_e, q_e] using + integrable_sq_weighted_sqrt_responseDefectAverageAtScale + hP hk_nonneg w p_e q_e + (by intro n hn; exact hw n (by simpa [S] using hn)) + hParent hDesc + have hChildMem : + MemLp childAvg (ENNReal.ofReal (section53CoarseFluctuationZeta hP4)) P := by + simpa [childAvg, Q, j, p_e, q_e] using + memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + hP hstat hStruct hP4 hk_nonneg hkm_int p_e q_e + have hLowerAE : AEMeasurable lowerExcess P := by + simpa [lowerExcess, Q] using + ((hP.aemeasurable_lambdaSqCoeffField_finite_one_inv Q hs'_pos).sub + aemeasurable_const).max aemeasurable_const + have hUpperAE : AEMeasurable upperExcess P := by + simpa [upperExcess, Q] using + ((hP.aemeasurable_LambdaSqCoeffField_finite_one Q ht'_pos).sub + aemeasurable_const).max aemeasurable_const + have hLower_nonneg : ∀ᵐ a ∂P, 0 ≤ lowerExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hUpper_nonneg : ∀ᵐ a ∂P, 0 ≤ upperExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hs'_gt : hP4.sLower < s' := by + dsimp [s', β] + linarith + have ht'_gt : hP4.sUpper < t' := by + dsimp [t', β] + linarith + have hs'_lt_one : s' < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [s', β] + nlinarith [hP4.sUpper_pos, hβ_pos] + have ht'_lt_one : t' < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [t', β] + nlinarith [hP4.sLower_pos, hβ_pos] + have hLowerPowInt : + Integrable (fun a : RegCoeffField d => lowerExcess a ^ hP4.xi) P := by + simpa [lowerExcess, Q, s', β] using + Section52.lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hs'_gt hs'_lt_one m + have hUpperPowInt : + Integrable (fun a : RegCoeffField d => upperExcess a ^ hP4.xi) P := by + simpa [upperExcess, Q, t', β] using + Section52.upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 ht'_gt ht'_lt_one m + have hLowerMem : + MemLp lowerExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hLowerAE + hLower_nonneg hLowerPowInt + have hUpperMem : + MemLp upperExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hUpperAE + hUpper_nonneg hUpperPowInt + have hHolderReal : + (section53CoarseFluctuationZeta hP4).HolderConjugate (hP4.xi : ℝ) := by + simpa using + (holderConjugate_xi_section53CoarseFluctuationZeta hP4).symm + let : ENNReal.HolderTriple + (ENNReal.ofReal (section53CoarseFluctuationZeta hP4)) + (ENNReal.ofReal (hP4.xi : ℝ)) 1 := by + simpa using Real.HolderTriple.ennrealOfReal hHolderReal + have hLowerChildInt : + Integrable (fun a : RegCoeffField d => lowerExcess a * childAvg a) P := by + simpa [mul_comm] using! hChildMem.integrable_mul hLowerMem + have hUpperChildInt : + Integrable (fun a : RegCoeffField d => upperExcess a * childAvg a) P := by + simpa [mul_comm] using! hChildMem.integrable_mul hUpperMem + have hPosInt : + Integrable + (fun a : RegCoeffField d => + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) P := by + have hsum : + Integrable + (fun a : RegCoeffField d => + σ * (lowerExcess a * childAvg a) + + σ⁻¹ * (upperExcess a * childAvg a)) P := + (hLowerChildInt.const_mul σ).add (hUpperChildInt.const_mul σ⁻¹) + refine hsum.congr ?_ + filter_upwards with a + ring + have hYInt : Integrable Y P := by + exact + (hDsqInt.const_mul (coarseFluctuationScalarWeightAtScale hP hStruct m)).add + (hPosInt.const_mul coeff) + have hDefectAE : AEMeasurable defectSum P := by + refine S.aemeasurable_fun_sum (μ := P) ?_ + intro n _hn + have hDefAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) P := by + simpa [WeakNormsMaximizer.responseDefectAverageAtScale, Q] using! + (hP.aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + Q (Int.toNat ((m : ℤ) - n)) p_e q_e).sub + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q p_e q_e) + exact aemeasurable_const.mul hDefAE.sqrt + have hGradMismatchAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) P := by + dsimp [WeakNormsMaximizer.gradientMismatchTermAtScale] + refine (hP.aemeasurable_lambdaSqCoeffField_finite_one_inv Q hs'_pos).sqrt.mul ?_ + change AEMeasurable + (fun a : RegCoeffField d => + ∑ n ∈ S, + Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a)) P + refine S.aemeasurable_fun_sum (μ := P) ?_ + intro n _hn + have hDefAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) P := by + simpa [WeakNormsMaximizer.responseDefectAverageAtScale, Q] using! + (hP.aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + Q (Int.toNat ((m : ℤ) - n)) p_e q_e).sub + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q p_e q_e) + exact aemeasurable_const.mul hDefAE.sqrt + have hFluxMismatchAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) P := by + dsimp [WeakNormsMaximizer.fluxMismatchTermAtScale] + refine (hP.aemeasurable_LambdaSqCoeffField_finite_one Q ht'_pos).sqrt.mul ?_ + change AEMeasurable + (fun a : RegCoeffField d => + ∑ n ∈ S, + Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a)) P + refine S.aemeasurable_fun_sum (μ := P) ?_ + intro n _hn + have hDefAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a) P := by + simpa [WeakNormsMaximizer.responseDefectAverageAtScale, Q] using! + (hP.aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + Q (Int.toNat ((m : ℤ) - n)) p_e q_e).sub + (hP.aemeasurable_restrictionResponseJObservableCubeSet Q p_e q_e) + exact aemeasurable_const.mul hDefAE.sqrt + have hXAE : AEMeasurable X P := by + simpa [X, pow_two] using! + (aemeasurable_const.mul (hGradMismatchAE.mul hGradMismatchAE)).add + (aemeasurable_const.mul (hFluxMismatchAE.mul hFluxMismatchAE)) + have hXNonneg : ∀ᵐ a ∂P, 0 ≤ X a := by + filter_upwards with a + dsimp [X] + exact add_nonneg + (mul_nonneg hσ_nonneg (sq_nonneg _)) + (mul_nonneg hσ_inv_nonneg (sq_nonneg _)) + have hDefect_le : + ∀ᵐ a ∂P, (defectSum a) ^ 2 ≤ coeff * childAvg a := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + simpa [defectSum, childAvg, coeff, S, w, Q, j, β, p_e, q_e] using + sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_childResponseAverageAtScale + ha hk_nonneg hkm_int hβ_pos hβ_le_one p_e q_e + have hPoint : X ≤ᵐ[P] Y := by + filter_upwards [hDefect_le] with a hdef + have hsplit := + paired_mismatchTermSquares_special_le_baseline_add_positiveExcess + hP hStruct hP4 k m e a + have hpos_nonneg : + 0 ≤ σ * lowerExcess a + σ⁻¹ * upperExcess a := by + exact add_nonneg + (mul_nonneg hσ_nonneg (le_max_right _ _)) + (mul_nonneg hσ_inv_nonneg (le_max_right _ _)) + calc + X a ≤ + (coarseFluctuationScalarWeightAtScale hP hStruct m + + (σ * lowerExcess a + σ⁻¹ * upperExcess a)) * + (defectSum a) ^ 2 := by + simpa [X, defectSum, lowerExcess, upperExcess, S, w, σ, s, s', t, + t', Q, p_e, q_e, β] using hsplit + _ = + coarseFluctuationScalarWeightAtScale hP hStruct m * + (defectSum a) ^ 2 + + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * + (defectSum a) ^ 2 := by ring + _ ≤ + coarseFluctuationScalarWeightAtScale hP hStruct m * + (defectSum a) ^ 2 + + coeff * ((σ * lowerExcess a + σ⁻¹ * upperExcess a) * childAvg a) := by + refine add_le_add le_rfl ?_ + calc + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * (defectSum a) ^ 2 + ≤ + (σ * lowerExcess a + σ⁻¹ * upperExcess a) * + (coeff * childAvg a) := + mul_le_mul_of_nonneg_left hdef hpos_nonneg + _ = coeff * ((σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a) := by ring + _ = Y a := by simp [Y] + have hXInt : Integrable X P := by + refine Integrable.mono' hYInt hXAE.aestronglyMeasurable ?_ + filter_upwards [hPoint, hXNonneg] with a hle hnonneg + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hle + have hmono : + ∫ a, X a ∂P ≤ ∫ a, Y a ∂P := + integral_mono_ae hXInt hYInt hPoint + have hY_eq : + ∫ a, Y a ∂P = + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + + coeff * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) := by + calc + ∫ a, Y a ∂P = + ∫ a, + coarseFluctuationScalarWeightAtScale hP hStruct m * + (defectSum a) ^ 2 + + coeff * ((σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a) ∂P := by simp [Y] + _ = + ∫ a, + coarseFluctuationScalarWeightAtScale hP hStruct m * + (defectSum a) ^ 2 ∂P + + ∫ a, + coeff * ((σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a) ∂P := by + rw [integral_add + (hDsqInt.const_mul (coarseFluctuationScalarWeightAtScale hP hStruct m)) + (hPosInt.const_mul coeff)] + _ = + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + + coeff * + ∫ a, (σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a ∂P := by + rw [integral_const_mul, integral_const_mul] + _ = + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + + coeff * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) := by + congr 1 + have hsplit : + ∫ a, (σ * lowerExcess a + σ⁻¹ * upperExcess a) * + childAvg a ∂P = + ∫ a, σ * (lowerExcess a * childAvg a) + + σ⁻¹ * (upperExcess a * childAvg a) ∂P := by + refine integral_congr_ae ?_ + filter_upwards with a + ring + rw [hsplit] + rw [integral_add (hLowerChildInt.const_mul σ) + (hUpperChildInt.const_mul σ⁻¹)] + rw [integral_const_mul, integral_const_mul] + have htauBase := + integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_special_le_tauSum + hP hstat hStruct hP4 hkm e + have hpositiveChild : + σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P) + ≤ + Cpos * (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + simpa [β, s', t', Q, j, p_e, q_e, σ, childAvg, lowerExcess, upperExcess] using + hCpos + have hTau_nonneg : + 0 ≤ coarseFluctuationTauSumAtScale hP hStruct hP4 k m e := + coarseFluctuationTauSumAtScale_nonneg hP hstat hStruct hP4 k m e + have hUnit_nonneg : + 0 ≤ coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := + coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m + have hResp_nonneg : + 0 ≤ coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := + coarseFluctuationResponseMomentAtScale_nonneg hP hStruct hP4 k m e + have hPosCore_nonneg : + 0 ≤ + (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le hP4.xi) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hUnit_nonneg) + hResp_nonneg + have hβ2_inv_nonneg : 0 ≤ (β ^ 2)⁻¹ := + inv_nonneg.mpr (sq_nonneg β) + have hβ3_inv_nonneg : 0 ≤ (β ^ 3)⁻¹ := + inv_nonneg.mpr (pow_nonneg hβ_pos.le 3) + have hBaseline_le : + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + ≤ + C * ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) := by + have hβinv_le_beta2 : + β⁻¹ ≤ (β ^ 2)⁻¹ := by + have hβ2_le : β ^ 2 ≤ β := by nlinarith [hβ_pos, hβ_le_one] + exact (inv_le_inv₀ hβ_pos (sq_pos_of_pos hβ_pos)).mpr hβ2_le + have hbase : + ∫ a, (defectSum a) ^ 2 ∂P + ≤ (5 * β⁻¹) * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e := by + simpa [defectSum, S, w, β, p_e, q_e] using htauBase + calc + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + ≤ + coarseFluctuationScalarWeightAtScale hP hStruct m * + ((5 * β⁻¹) * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) := + mul_le_mul_of_nonneg_left hbase hscalar_nonneg + _ = + 5 * β⁻¹ * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) := by ring + _ ≤ + 5 * (β ^ 2)⁻¹ * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) := by + gcongr + _ ≤ + C * ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) := by + have htail_nonneg : + 0 ≤ (β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e := by + exact mul_nonneg (mul_nonneg hβ2_inv_nonneg hscalar_nonneg) hTau_nonneg + have hC_ge_five : 5 ≤ C := by linarith + nlinarith + have hCoeff_le_beta3 : + coeff ≤ 25 * (β ^ 3)⁻¹ := by + have hcoeff_eq : coeff = 25 * (β ^ 2)⁻¹ := by + dsimp [coeff] + field_simp [hβ_pos.ne'] + ring + have hβ3_le_β2 : β ^ 3 ≤ β ^ 2 := by + calc + β ^ 3 = β ^ 2 * β := by ring + _ ≤ β ^ 2 * 1 := + mul_le_mul_of_nonneg_left hβ_le_one (sq_nonneg β) + _ = β ^ 2 := by ring + have hinv_le : (β ^ 2)⁻¹ ≤ (β ^ 3)⁻¹ := + (inv_le_inv₀ (sq_pos_of_pos hβ_pos) (by positivity : 0 < β ^ 3)).mpr + hβ3_le_β2 + calc + coeff = 25 * (β ^ 2)⁻¹ := hcoeff_eq + _ ≤ 25 * (β ^ 3)⁻¹ := + mul_le_mul_of_nonneg_left hinv_le (by norm_num) + have hPositive_le : + coeff * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) + ≤ + C * ((hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + calc + coeff * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) + ≤ + coeff * + (Cpos * (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := + mul_le_mul_of_nonneg_left hpositiveChild + (by dsimp [coeff]; positivity) + _ = + (coeff * Cpos) * + ((hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by ring + _ ≤ + (25 * (β ^ 3)⁻¹ * Cpos) * + ((hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hCoeff_le_beta3 hCpos_nonneg) + hPosCore_nonneg + _ = + (25 * Cpos) * + ((hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by ring + _ ≤ + C * ((hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + have htail_nonneg : + 0 ≤ (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le hP4.xi) + hβ3_inv_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hUnit_nonneg) + hResp_nonneg + exact mul_le_mul_of_nonneg_right hC_ge_pos htail_nonneg + have hmain : + ∫ a, X a ∂P ≤ + C * + ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by + calc + ∫ a, X a ∂P ≤ ∫ a, Y a ∂P := hmono + _ = + coarseFluctuationScalarWeightAtScale hP hStruct m * + ∫ a, (defectSum a) ^ 2 ∂P + + coeff * + (σ * (∫ a, lowerExcess a * childAvg a ∂P) + + σ⁻¹ * (∫ a, upperExcess a * childAvg a ∂P)) := hY_eq + _ ≤ + C * ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) + + C * ((hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := + add_le_add hBaseline_le hPositive_le + _ = + C * + ((β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) := by ring + refine ⟨by exact hXInt, ?_⟩ + simpa [X, β, s, s', t, t', p_e, q_e, σ] using hmain + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedWeakNormSquares.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedWeakNormSquares.lean new file mode 100644 index 0000000000..6d296a53b6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PairedWeakNormSquares.lean @@ -0,0 +1,973 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedSquares + +/-! # Paired Weak Norm Squares -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Paired weak-norm square conversion + +This proof-internal file converts the actual paired weak-norm square +expectations from the first Section 5.3 lemma into the coarse-fluctuation +manuscript terms. The component expectation estimates live in the preceding +files; this file owns the final square algebra. +-/ + +noncomputable section + +private theorem rhsSum_nonneg + {A B R D : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (hR : 0 ≤ R) (hD : 0 ≤ D) : + 0 ≤ A + B + R + D := by + nlinarith + +private theorem first_le_rhsSum + {A B R D : ℝ} (hB : 0 ≤ B) (hR : 0 ≤ R) (hD : 0 ≤ D) : + A ≤ A + B + R + D := by + nlinarith + +private theorem middle_pair_le_rhsSum + {A B R D : ℝ} (hA : 0 ≤ A) (hD : 0 ≤ D) : + B + R ≤ A + B + R + D := by + nlinarith + +private theorem last_pair_le_rhsSum + {A B R D : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) : + D + R ≤ A + B + R + D := by + nlinarith + +private theorem fourth_le_rhsSum + {A B R D : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (hR : 0 ≤ R) : + D ≤ A + B + R + D := by + nlinarith + +private theorem pairedConstant_nonneg + {CH CM CL K : ℝ} (hCH : 0 ≤ CH) (hCM : 0 ≤ CM) (hCL : 0 ≤ CL) : + 0 ≤ CH + K ^ 2 * CM + K ^ 2 * CL + 2 * K ^ 2 := by + have hK2 : 0 ≤ K ^ 2 := sq_nonneg K + nlinarith + +private theorem pairedComponentSum_le + {H M L T Ssum CH CM CL K C0 : ℝ} + (hH : H ≤ CH * Ssum) (hM : M ≤ CM * Ssum) + (hL : L ≤ CL * Ssum) (hT : T ≤ 2 * Ssum) + (hK2 : 0 ≤ K ^ 2) + (hC0 : C0 = CH + K ^ 2 * CM + K ^ 2 * CL + 2 * K ^ 2) : + H + K ^ 2 * M + K ^ 2 * L + K ^ 2 * T ≤ C0 * Ssum := by + have hKM : K ^ 2 * M ≤ K ^ 2 * (CM * Ssum) := + mul_le_mul_of_nonneg_left hM hK2 + have hKL : K ^ 2 * L ≤ K ^ 2 * (CL * Ssum) := + mul_le_mul_of_nonneg_left hL hK2 + have hKT : K ^ 2 * T ≤ K ^ 2 * (2 * Ssum) := + mul_le_mul_of_nonneg_left hT hK2 + calc + H + K ^ 2 * M + K ^ 2 * L + K ^ 2 * T + ≤ CH * Ssum + K ^ 2 * (CM * Ssum) + + K ^ 2 * (CL * Ssum) + K ^ 2 * (2 * Ssum) := by + nlinarith + _ = C0 * Ssum := by + rw [hC0] + ring + +private theorem sq_sum_four_le_const_sum_sq (a b c d : ℝ) : + (a + b + c + d) ^ 2 ≤ + 4 * (a ^ 2 + b ^ 2 + c ^ 2 + d ^ 2) := by + nlinarith [sq_nonneg (a - b), sq_nonneg (a - c), sq_nonneg (a - d), + sq_nonneg (b - c), sq_nonneg (b - d), sq_nonneg (c - d)] + +private theorem norm_sq_le_vecNormSq {d : ℕ} (v : Vec d) : + ‖v‖ ^ 2 ≤ vecNormSq v := by + have hnorm_le : ‖v‖ ≤ Real.sqrt (vecNormSq v) := by + refine (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg _)).2 ?_ + intro i + have hi : ‖v i‖ ^ 2 ≤ vecNormSq v := by + calc + ‖v i‖ ^ 2 = v i ^ 2 := by rw [Real.norm_eq_abs, sq_abs] + _ ≤ ∑ j, v j ^ 2 := by + exact Finset.single_le_sum (fun j _hj => sq_nonneg (v j)) (Finset.mem_univ i) + _ = vecNormSq v := by + simp [vecNormSq, vecDot, pow_two] + exact Real.le_sqrt_of_sq_le hi + have hsqrt_sq : (Real.sqrt (vecNormSq v)) ^ 2 = vecNormSq v := by + simpa [pow_two] using Real.sq_sqrt (vecNormSq_nonneg v) + calc + ‖v‖ ^ 2 ≤ (Real.sqrt (vecNormSq v)) ^ 2 := by + exact (sq_le_sq₀ (norm_nonneg _) (Real.sqrt_nonneg _)).2 hnorm_le + _ = vecNormSq v := hsqrt_sq + +private theorem paired_rhsSquares_le_componentSquares + {σ K AG MG LG CG AF MF LF CF : ℝ} (hσ : 0 ≤ σ) : + σ * (AG + K * MG + K * LG + K * CG) ^ 2 + + σ⁻¹ * (AF + K * MF + K * LF + K * CF) ^ 2 + ≤ + 4 * + ((σ * AG ^ 2 + σ⁻¹ * AF ^ 2) + + K ^ 2 * (σ * MG ^ 2 + σ⁻¹ * MF ^ 2) + + K ^ 2 * (σ * LG ^ 2 + σ⁻¹ * LF ^ 2) + + K ^ 2 * (σ * CG ^ 2 + σ⁻¹ * CF ^ 2)) := by + have hσinv : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ + have hg := sq_sum_four_le_const_sum_sq AG (K * MG) (K * LG) (K * CG) + have hf := sq_sum_four_le_const_sum_sq AF (K * MF) (K * LF) (K * CF) + calc + σ * (AG + K * MG + K * LG + K * CG) ^ 2 + + σ⁻¹ * (AF + K * MF + K * LF + K * CF) ^ 2 + ≤ + σ * (4 * (AG ^ 2 + (K * MG) ^ 2 + (K * LG) ^ 2 + (K * CG) ^ 2)) + + σ⁻¹ * (4 * (AF ^ 2 + (K * MF) ^ 2 + (K * LF) ^ 2 + (K * CF) ^ 2)) := + add_le_add + (mul_le_mul_of_nonneg_left hg hσ) + (mul_le_mul_of_nonneg_left hf hσinv) + _ = + 4 * + ((σ * AG ^ 2 + σ⁻¹ * AF ^ 2) + + K ^ 2 * (σ * MG ^ 2 + σ⁻¹ * MF ^ 2) + + K ^ 2 * (σ * LG ^ 2 + σ⁻¹ * LF ^ 2) + + K ^ 2 * (σ * CG ^ 2 + σ⁻¹ * CF ^ 2)) := by ring + +private theorem rpow_three_sq (x : ℝ) : + Real.rpow (3 : ℝ) x ^ 2 = Real.rpow (3 : ℝ) (2 * x) := by + calc + Real.rpow (3 : ℝ) x ^ 2 = + Real.rpow (3 : ℝ) x * Real.rpow (3 : ℝ) x := by ring + _ = Real.rpow (3 : ℝ) (x + x) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) x x).symm + _ = Real.rpow (3 : ℝ) (2 * x) := by ring_nf + +private theorem inv_sq_rpow_tail_le + {β r N : ℝ} (hβ : 0 < β) (hβr : β ≤ r) (hN : 0 ≤ N) : + r⁻¹ ^ 2 * Real.rpow (3 : ℝ) (-2 * r * N) ≤ + (β ^ 2)⁻¹ * Real.rpow (3 : ℝ) (-2 * β * N) := by + have hr : 0 < r := hβ.trans_le hβr + have hinv : r⁻¹ ≤ β⁻¹ := (inv_le_inv₀ hr hβ).2 hβr + have hinv_sq : r⁻¹ ^ 2 ≤ β⁻¹ ^ 2 := + pow_le_pow_left₀ (inv_nonneg.mpr hr.le) hinv 2 + have hβ_inv_sq : β⁻¹ ^ 2 = (β ^ 2)⁻¹ := by + field_simp [hβ.ne'] + have hinv_sq' : r⁻¹ ^ 2 ≤ (β ^ 2)⁻¹ := by + simpa [hβ_inv_sq] using hinv_sq + have hpow : + Real.rpow (3 : ℝ) (-2 * r * N) ≤ + Real.rpow (3 : ℝ) (-2 * β * N) := by + apply Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) + nlinarith + exact mul_le_mul hinv_sq' hpow + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (inv_nonneg.mpr (sq_nonneg β)) + +private theorem sqrt_sub_one_sq_le_sub_one {θ : ℝ} (hθ : 1 ≤ θ) : + (Real.sqrt θ - 1) ^ 2 ≤ θ - 1 := by + have hθ_nonneg : 0 ≤ θ := le_trans zero_le_one hθ + have hs_nonneg : 0 ≤ Real.sqrt θ - 1 := by + have hs : 1 ≤ Real.sqrt θ := Real.one_le_sqrt.mpr hθ + linarith + have hfactor : + (Real.sqrt θ - 1) * (Real.sqrt θ + 1) = θ - 1 := by + calc + (Real.sqrt θ - 1) * (Real.sqrt θ + 1) = + (Real.sqrt θ) ^ 2 - 1 := by ring + _ = θ - 1 := by rw [Real.sq_sqrt hθ_nonneg] + calc + (Real.sqrt θ - 1) ^ 2 = + (Real.sqrt θ - 1) * (Real.sqrt θ - 1) := by ring + _ ≤ (Real.sqrt θ - 1) * (Real.sqrt θ + 1) := by + exact mul_le_mul_of_nonneg_left (by linarith) hs_nonneg + _ = θ - 1 := hfactor + +private theorem gradientConstantTailAtScale_sq + {d : ℕ} (m k : ℕ) (s : ℝ) (p0_e : Vec d) : + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 = + s⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * s * (((m - k : ℕ) : ℝ))) * ‖p0_e‖ ^ 2 := by + dsimp [WeakNormsMaximizer.gradientConstantTailAtScale] + have hmk : + (Int.toNat ((m : ℤ) - (k : ℤ)) : ℝ) = ((m - k : ℕ) : ℝ) := by + have hmk_nat : Int.toNat ((m : ℤ) - (k : ℤ)) = m - k := by omega + exact_mod_cast hmk_nat + rw [hmk] + rw [mul_pow, mul_pow] + change + s⁻¹ ^ 2 * + (Real.rpow (3 : ℝ) (-s * (((m - k : ℕ) : ℝ)))) ^ 2 * + ‖p0_e‖ ^ 2 = + s⁻¹ ^ 2 * + Real.rpow (3 : ℝ) (-2 * s * (((m - k : ℕ) : ℝ))) * + ‖p0_e‖ ^ 2 + rw [rpow_three_sq] + ring_nf + +/-- The constant affine tails in the weak-norm maximizer RHS are absorbed by +the low-scale scalar tail of the final manuscript RHS. -/ +theorem paired_constantTail_special_le_lowScaleTail + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (_hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + ≤ + 2 * ((β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1)) := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let tail := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs_ge : β ≤ s := by + dsimp [s, β] + linarith [hP4.sLower_nonneg, hβ_pos.le] + have ht_ge : β ≤ t := by + dsimp [t, β] + linarith [hP4.sUpper_nonneg, hβ_pos.le] + have hN_nonneg : 0 ≤ (((m - k : ℕ) : ℝ)) := by positivity + have hs_factor : + s⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * s * (((m - k : ℕ) : ℝ))) ≤ tail := by + simpa [tail] using inv_sq_rpow_tail_le hβ_pos hs_ge hN_nonneg + have ht_factor : + t⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * t * (((m - k : ℕ) : ℝ))) ≤ tail := by + simpa [tail] using inv_sq_rpow_tail_le hβ_pos ht_ge hN_nonneg + have htail_nonneg : 0 ≤ tail := by + dsimp [tail] + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hσ_nonneg : 0 ≤ σ := Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hθ_sub_nonneg : 0 ≤ θ - 1 := by linarith + have hcenter_le : (Real.sqrt θ - 1) ^ 2 ≤ θ - 1 := + sqrt_sub_one_sq_le_sub_one hθ_one + have hp_center : + σ * ‖p0_e‖ ^ 2 ≤ (Real.sqrt θ - 1) ^ 2 := by + have hnorm := norm_sq_le_vecNormSq p0_e + have hvec := + sigmaHatAtScale_mul_vecNormSq_specialPCentering_eq hP hStruct hP4 m e + calc + σ * ‖p0_e‖ ^ 2 ≤ σ * vecNormSq p0_e := + mul_le_mul_of_nonneg_left hnorm hσ_nonneg + _ = (Real.sqrt θ - 1) ^ 2 := by + simpa [σ, θ, p_e, q_e, p0_e, he] using hvec + have hq_center : + σ⁻¹ * ‖q0_e‖ ^ 2 ≤ (Real.sqrt θ - 1) ^ 2 := by + have hnorm := norm_sq_le_vecNormSq q0_e + have hvec := + inv_sigmaHatAtScale_mul_vecNormSq_specialQCentering_eq hP hStruct hP4 m e + calc + σ⁻¹ * ‖q0_e‖ ^ 2 ≤ σ⁻¹ * vecNormSq q0_e := + mul_le_mul_of_nonneg_left hnorm hσ_inv_nonneg + _ = (Real.sqrt θ - 1) ^ 2 := by + simpa [σ, θ, p_e, q_e, q0_e, he] using hvec + have hscalar_one : + 1 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := + one_le_coarseFluctuationScalarWeightAtScale hP hStruct hP4 m + have hgrad_sq := gradientConstantTailAtScale_sq m k s p0_e + have hflux_sq : + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 = + t⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * t * (((m - k : ℕ) : ℝ))) * ‖q0_e‖ ^ 2 := by + simpa only [WeakNormsMaximizer.fluxConstantTailAtScale, + WeakNormsMaximizer.gradientConstantTailAtScale] using + gradientConstantTailAtScale_sq m k t q0_e + have hgrad_le : + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + ≤ tail * (θ - 1) := by + calc + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + = + (s⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * s * (((m - k : ℕ) : ℝ)))) * + (σ * ‖p0_e‖ ^ 2) := by + rw [hgrad_sq] + ring + _ ≤ tail * (θ - 1) := by + have hp_nonneg : 0 ≤ σ * ‖p0_e‖ ^ 2 := + mul_nonneg hσ_nonneg (sq_nonneg _) + exact mul_le_mul hs_factor (hp_center.trans hcenter_le) + hp_nonneg htail_nonneg + have hflux_le : + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + ≤ tail * (θ - 1) := by + calc + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + = + (t⁻¹ ^ 2 * + Real.rpow (3 : ℝ) + (-2 * t * (((m - k : ℕ) : ℝ)))) * + (σ⁻¹ * ‖q0_e‖ ^ 2) := by + rw [hflux_sq] + ring + _ ≤ tail * (θ - 1) := by + have hq_nonneg : 0 ≤ σ⁻¹ * ‖q0_e‖ ^ 2 := + mul_nonneg hσ_inv_nonneg (sq_nonneg _) + exact mul_le_mul ht_factor (hq_center.trans hcenter_le) + hq_nonneg htail_nonneg + calc + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + ≤ tail * (θ - 1) + tail * (θ - 1) := + add_le_add hgrad_le hflux_le + _ = 2 * (tail * (θ - 1)) := by ring + _ ≤ + 2 * (tail * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1)) := by + have htail_theta_nonneg : 0 ≤ tail * (θ - 1) := + mul_nonneg htail_nonneg hθ_sub_nonneg + have htail_scalar : + tail * (θ - 1) ≤ + tail * coarseFluctuationScalarWeightAtScale hP hStruct m * + (θ - 1) := by + calc + tail * (θ - 1) = tail * 1 * (θ - 1) := by ring + _ ≤ tail * coarseFluctuationScalarWeightAtScale hP hStruct m * + (θ - 1) := by + gcongr + exact mul_le_mul_of_nonneg_left htail_scalar (by norm_num) + _ = + 2 * ((β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1)) := by + simp [tail, mul_assoc] + +private theorem paired_component_integral_bound + {Ω : Type*} [MeasurableSpace Ω] {P : Measure Ω} [IsProbabilityMeasure P] + {gradWeak fluxWeak H M L : Ω → ℝ} {σ K T : ℝ} + (hGradWeakSqInt : Integrable (fun a => (gradWeak a) ^ 2) P) + (hFluxWeakSqInt : Integrable (fun a => (fluxWeak a) ^ 2) P) + (hHInt : Integrable H P) (hMInt : Integrable M P) (hLInt : Integrable L P) + (hPoint : (fun a => σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2) ≤ᵐ[P] + (fun a => 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T))) : + σ * (∫ a, (gradWeak a) ^ 2 ∂P) + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) ≤ + 16 * ((∫ a, H a ∂P) + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + K ^ 2 * T) := by + let W : Ω → ℝ := fun a => + σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2 + let Z : Ω → ℝ := fun a => + 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) + have hWInt : Integrable W P := by + have hG : Integrable (fun a : Ω => σ * (gradWeak a) ^ 2) P := + hGradWeakSqInt.const_mul σ + have hF : Integrable (fun a : Ω => σ⁻¹ * (fluxWeak a) ^ 2) P := + hFluxWeakSqInt.const_mul σ⁻¹ + simpa [W] using! hG.add hF + have hZInt : Integrable Z P := by + have hinside : + Integrable (fun a : Ω => + ((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) P := + ((hHInt.add (hMInt.const_mul (K ^ 2))).add + (hLInt.const_mul (K ^ 2))).add (integrable_const (K ^ 2 * T)) + simpa [Z, mul_assoc] using hinside.const_mul 16 + have hmono : ∫ a, W a ∂P ≤ ∫ a, Z a ∂P := + integral_mono_ae hWInt hZInt hPoint + have hZeq : + ∫ a, Z a ∂P = + 16 * + ((∫ a, H a ∂P) + + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + + K ^ 2 * T) := by + let HM : Ω → ℝ := fun a => H a + K ^ 2 * M a + let HML : Ω → ℝ := fun a => HM a + K ^ 2 * L a + let TC : Ω → ℝ := fun _ => K ^ 2 * T + have hHMInt : Integrable HM P := by + simpa [HM] using! hHInt.add (hMInt.const_mul (K ^ 2)) + have hHMLInt : Integrable HML P := by + simpa [HML] using! hHMInt.add (hLInt.const_mul (K ^ 2)) + have hTCInt : Integrable TC P := by + simpa [TC] using integrable_const (K ^ 2 * T : ℝ) + have hBody : + ∫ a, ((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T ∂P = + (∫ a, H a ∂P) + + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + + K ^ 2 * T := by + calc + ∫ a, ((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T ∂P + = ∫ a, HML a + TC a ∂P := by + simp [HML, HM, TC] + _ = ∫ a, HML a ∂P + ∫ a, TC a ∂P := by + rw [integral_add hHMLInt hTCInt] + _ = (∫ a, HM a ∂P + ∫ a, K ^ 2 * L a ∂P) + + ∫ a, TC a ∂P := by + rw [integral_add hHMInt (hLInt.const_mul (K ^ 2))] + _ = ((∫ a, H a ∂P + ∫ a, K ^ 2 * M a ∂P) + + ∫ a, K ^ 2 * L a ∂P) + + ∫ a, TC a ∂P := by + rw [integral_add hHInt (hMInt.const_mul (K ^ 2))] + _ = + (∫ a, H a ∂P) + + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + + K ^ 2 * T := by + rw [integral_const_mul, integral_const_mul, integral_const] + simp + calc + ∫ a, Z a ∂P = + 16 * ∫ a, ((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T ∂P := by + rw [integral_const_mul] + _ = + 16 * + ((∫ a, H a ∂P) + + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + + K ^ 2 * T) := by + rw [hBody] + calc + σ * (∫ a, (gradWeak a) ^ 2 ∂P) + + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) + = ∫ a, W a ∂P := by + have hG : Integrable (fun a : Ω => σ * (gradWeak a) ^ 2) P := + hGradWeakSqInt.const_mul σ + have hF : Integrable (fun a : Ω => σ⁻¹ * (fluxWeak a) ^ 2) P := + hFluxWeakSqInt.const_mul σ⁻¹ + rw [integral_add hG hF, integral_const_mul, integral_const_mul] + _ ≤ ∫ a, Z a ∂P := hmono + _ = + 16 * + ((∫ a, H a ∂P) + + K ^ 2 * (∫ a, M a ∂P) + + K ^ 2 * (∫ a, L a ∂P) + + K ^ 2 * T) := hZeq + +/-- The paired special-vector weak-norm square expectation is bounded by the +four component square expectations coming from the weak-norm maximizer RHS. +This is the expectation-level square algebra; later lemmas convert the +component integrals into the manuscript coarse-fluctuation terms. -/ +theorem paired_weakNormSquares_special_le_componentIntegrals + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) + (hGradSq : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d (m : ℤ)) s p_e q_e p0_e a.toFun) ^ 2) P) + (hFluxSq : + let β := section53CoarseFluctuationBeta hP4 + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d (m : ℤ)) t p_e q_e q0_e a.toFun) ^ 2) P) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + σ * (∫ a, (gradWeak a) ^ 2 ∂P) + + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) + ≤ + 16 * + ((∫ a, + (σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) ∂P) + + K ^ 2 * + (∫ a, + (σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P) + + K ^ 2 * + (∫ a, + (σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P) + + K ^ 2 * + (σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2)) := by + classical + let : IsProbabilityMeasure P := hP.isProbability + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let H : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + let M : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let L : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let T : ℝ := + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + let W : RegCoeffField d → ℝ := fun a => + σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2 + let Z : RegCoeffField d → ℝ := fun a => + 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) + have hσ_nonneg : 0 ≤ σ := by + exact Real.sqrt_nonneg _ + have hGradWeakSqInt : + Integrable (fun a : RegCoeffField d => (gradWeak a) ^ 2) P := by + simpa [gradWeak, Q, s, p_e, q_e, p0_e, β] using hGradSq + have hFluxWeakSqInt : + Integrable (fun a : RegCoeffField d => (fluxWeak a) ^ 2) P := by + simpa [fluxWeak, Q, t, p_e, q_e, q0_e, β] using hFluxSq + have hHigh := integral_paired_highScaleAverageTerms_special_le_fullBlockSumAtScale + hP hstat hStruct hP4 hkm e he + rcases integral_paired_mismatchTermSquares_special_le_coarseFluctuationTerms_uniform + hP4.params with ⟨Cmis, hCmis_nonneg, hMis_all⟩ + have hMis := hMis_all hP hstat hStruct hP4 rfl hkm e + have hLowRaw := + integral_paired_lowScaleTailSquares_special_le_rawLowScaleTerms + hP hstat hStruct hP4 hkm e + have hHInt : Integrable H P := by + simpa [H, β, s, t, p_e, q_e, p0_e, q0_e, σ] using hHigh.1 + have hMInt : Integrable M P := by + simpa [M, β, s, s', t, t', p_e, q_e, σ] using hMis.1 + have hLInt : Integrable L P := by + simpa [L, β, s, s', t, t', p_e, q_e, σ] using hLowRaw.1 + have hPoint : W ≤ᵐ[P] Z := by + filter_upwards [ae_paired_weakNormSquares_special_le_four_rhsSquares + hP hStruct hP4 hkm e] with a hweak + have hAlg := + paired_rhsSquares_le_componentSquares + (σ := σ) (K := K) + (AG := WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) + (MG := WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) + (LG := WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) + (CG := WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) + (AF := WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) + (MF := WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) + (LF := WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) + (CF := WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) hσ_nonneg + calc + W a ≤ + 4 * + (σ * + (WeakNormsMaximizer.gradientRHSAtScale K + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxRHSAtScale K + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a) ^ 2) := by + simpa [W, gradWeak, fluxWeak, K, Q, β, s, s', t, t', + p_e, q_e, p0_e, q0_e, σ] using hweak + _ ≤ Z a := by + dsimp [Z, H, M, L, T, WeakNormsMaximizer.gradientRHSAtScale, + WeakNormsMaximizer.fluxRHSAtScale] + nlinarith [hAlg] + exact paired_component_integral_bound hGradWeakSqInt hFluxWeakSqInt + hHInt hMInt hLInt hPoint + +/-- The block, fluctuation, response-moment, and low-scale tail components of the +coarse-fluctuation manuscript bound are nonnegative under the structural law. -/ +theorem coarseFluctuationTerms_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k m : ℕ) (e : Vec d) : + let β := section53CoarseFluctuationBeta hP4 + let θ := thetaAtScale hP hStruct (m : ℤ) + let A : ℝ := + β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let B : ℝ := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let R : ℝ := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D : ℝ := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + 0 ≤ A ∧ 0 ≤ B ∧ 0 ≤ R ∧ 0 ≤ D := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let θ := thetaAtScale hP hStruct (m : ℤ) + let A : ℝ := + β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let B : ℝ := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let R : ℝ := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D : ℝ := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg + (mul_nonneg (inv_nonneg.mpr hβ_pos.le) + (by + have hθ : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith)) + (coarseFluctuationFullBlockSumAtScale_nonneg hP hStruct hP4 k m) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg + (mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m)) + (coarseFluctuationTauSumAtScale_nonneg hP hstat hStruct hP4 k m e) + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le hP4.xi) + (inv_nonneg.mpr (pow_nonneg hβ_pos.le 3))) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m)) + (coarseFluctuationResponseMomentAtScale_nonneg hP hStruct hP4 k m e) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact mul_nonneg + (mul_nonneg + (mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m)) + (by + have hθ : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith) + exact ⟨hA_nonneg, hB_nonneg, hR_nonneg, hD_nonneg⟩ + +/-- The paired special-vector weak-norm square expectations are bounded by the +four square-conversion terms of the manuscript coarse-fluctuation RHS. -/ +theorem paired_weakNormSquares_special_le_coarseFluctuationTerms + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + (let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d (m : ℤ)) s p_e q_e p0_e a.toFun) ^ 2) P) → + (let β := section53CoarseFluctuationBeta hP4 + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d (m : ℤ)) t p_e q_e q0_e a.toFun) ^ 2) P) → + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + σ * (∫ a, (gradWeak a) ^ 2 ∂P) + + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) + ≤ + C * + (β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + + (β ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (θ - 1)) := by + classical + dsimp only + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + rcases integral_paired_highScaleAverageTerms_special_le_beta_inv_fullBlockSumAtScale + (d := d) with ⟨CH, hCH_nonneg, hH_all⟩ + rcases integral_paired_mismatchTermSquares_special_le_coarseFluctuationTerms_uniform + params with ⟨CM, hCM_nonneg, hM_all⟩ + rcases integral_paired_lowScaleTailSquares_special_le_coarseFluctuationTerms_uniform + params with ⟨CL, hCL_nonneg, hL_all⟩ + let C0 : ℝ := CH + K ^ 2 * CM + K ^ 2 * CL + 2 * K ^ 2 + let C : ℝ := 16 * C0 + have hC0_nonneg : 0 ≤ C0 := by + simpa [C0] using pairedConstant_nonneg (K := K) hCH_nonneg hCM_nonneg hCL_nonneg + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (by norm_num) hC0_nonneg + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e he hGradSq hFluxSq + let : IsProbabilityMeasure P := hP.isProbability + subst params + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let H : ℝ := + ∫ a, + (σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) ∂P + let M : ℝ := + ∫ a, + (σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + let L : ℝ := + ∫ a, + (σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2) ∂P + let T : ℝ := + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + let A : ℝ := + β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let B : ℝ := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let R : ℝ := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D : ℝ := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let Ssum : ℝ := A + B + R + D + have hcomp := + paired_weakNormSquares_special_le_componentIntegrals + hP hstat hStruct hP4 hkm e he hGradSq hFluxSq + have hH := hH_all hP hstat hStruct hP4 hkm e he + have hM := hM_all hP hstat hStruct hP4 rfl hkm e + have hL := hL_all hP hstat hStruct hP4 rfl hkm e he + have hT := + paired_constantTail_special_le_lowScaleTail hP hStruct hP4 hkm e he + obtain ⟨hA_nonneg, hB_nonneg, hR_nonneg, hD_nonneg⟩ := + coarseFluctuationTerms_nonneg hP hstat hStruct hP4 k m e + have hS_nonneg : 0 ≤ Ssum := by + simpa [Ssum] using rhsSum_nonneg hA_nonneg hB_nonneg hR_nonneg hD_nonneg + have hA_le_Ssum : A ≤ Ssum := by + simpa [Ssum] using first_le_rhsSum hB_nonneg hR_nonneg hD_nonneg + have hBR_le_Ssum : B + R ≤ Ssum := by + simpa [Ssum] using middle_pair_le_rhsSum hA_nonneg hD_nonneg + have hDR_le_Ssum : D + R ≤ Ssum := by + simpa [Ssum] using last_pair_le_rhsSum hA_nonneg hB_nonneg + have hD_le_Ssum : D ≤ Ssum := by + simpa [Ssum] using fourth_le_rhsSum (D := D) hA_nonneg hB_nonneg hR_nonneg + have hH_le : H ≤ CH * Ssum := by + have hHA : H ≤ CH * A := by + simpa [H, A, β, s, t, p_e, q_e, p0_e, q0_e, σ, θ, mul_assoc] using hH + exact hHA.trans (mul_le_mul_of_nonneg_left hA_le_Ssum hCH_nonneg) + have hM_le : M ≤ CM * Ssum := by + have hMBR : M ≤ CM * (B + R) := by + simpa [M, B, R, β, s, s', t, t', p_e, q_e, σ] using hM.2 + exact hMBR.trans (mul_le_mul_of_nonneg_left hBR_le_Ssum hCM_nonneg) + have hL_le : L ≤ CL * Ssum := by + have hLDR : L ≤ CL * (D + R) := by + simpa [L, D, R, β, s, s', t, t', p_e, q_e, σ, θ] using hL + exact hLDR.trans (mul_le_mul_of_nonneg_left hDR_le_Ssum hCL_nonneg) + have hT_le : T ≤ 2 * Ssum := by + have hTD : T ≤ 2 * D := by + simpa [T, D, β, s, t, p_e, q_e, p0_e, q0_e, σ, θ] using hT + exact hTD.trans (mul_le_mul_of_nonneg_left hD_le_Ssum (by norm_num)) + have hinside : + H + K ^ 2 * M + K ^ 2 * L + K ^ 2 * T ≤ C0 * Ssum := by + exact pairedComponentSum_le hH_le hM_le hL_le hT_le (sq_nonneg K) (by rfl) + change σ * (∫ a, (gradWeak a) ^ 2 ∂P) + + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) ≤ C * Ssum + calc + σ * (∫ a, (gradWeak a) ^ 2 ∂P) + + σ⁻¹ * (∫ a, (fluxWeak a) ^ 2 ∂P) + ≤ 16 * (H + K ^ 2 * M + K ^ 2 * L + K ^ 2 * T) := by + simpa [H, M, L, T, K, β, s, s', t, t', Q, p_e, q_e, p0_e, + q0_e, σ, gradWeak, fluxWeak] using hcomp + _ ≤ 16 * (C0 * Ssum) := + mul_le_mul_of_nonneg_left hinside (by norm_num) + _ = C * Ssum := by + simp [C] + ring + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessDefectSquare.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessDefectSquare.lean new file mode 100644 index 0000000000..6504949b5f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessDefectSquare.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessResponseDefect + +/-! # Positive Excess Defect Square -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +/-! +# Positive-excess weighted response-defect-square estimate + +This proof-internal file owns the final positive-excess estimate needed after +squaring the weak-norm maximizer RHS. +-/ + +noncomputable section + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessResponseDefect.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessResponseDefect.lean new file mode 100644 index 0000000000..ea2060ec75 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/PositiveExcessResponseDefect.lean @@ -0,0 +1,758 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ResponseMomentIntegrability + +/-! # Positive Excess Response Defect -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +/-! +# Positive-excess response-defect estimates + +This proof-internal file contains the positive-excess estimates whose response +side is a child-response average or the weighted response-defect square sum. +The Holder/P4 source estimates remain in `EllipticityMoments.lean`. +-/ + +noncomputable section + +/-- At the beta-shifted exponents, the ellipticity coefficients are almost everywhere +measurable and their positive excesses belong to the xi moment spaces. -/ +theorem shifted_excess_regularity + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + let Q : TriadicCube d := originCube d (m : ℤ) + let lowerCoeff := fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField Q (hP4.sLower + β) (.finite 1) a)⁻¹ + let upperCoeff := fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField Q (hP4.sUpper + β) (.finite 1) a + AEMeasurable lowerCoeff P ∧ AEMeasurable upperCoeff P ∧ + MemLp (fun a => max (lowerCoeff a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0) + (ENNReal.ofReal (hP4.xi : ℝ)) P ∧ + MemLp (fun a => max (upperCoeff a - hP.barSigmaAtScale hStruct 0) 0) + (ENNReal.ofReal (hP4.xi : ℝ)) P := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s' := hP4.sLower + β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let lowerExcess : RegCoeffField d → ℝ := + fun a => max ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => max (Ch04.LambdaSqCoeffField Q t' (.finite 1) a - + hP.barSigmaAtScale hStruct 0) 0 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs'_pos : 0 < s' := by + dsimp [s', β] + linarith [hP4.sLower_pos, hβ_pos] + have ht'_pos : 0 < t' := by + dsimp [t', β] + linarith [hP4.sUpper_pos, hβ_pos] + have hLowerAE : + AEMeasurable (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) P := + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv Q hs'_pos + have hUpperAE : + AEMeasurable (fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField Q t' (.finite 1) a) P := + hP.aemeasurable_LambdaSqCoeffField_finite_one Q ht'_pos + have hs'_gt : hP4.sLower < s' := by + dsimp [s', β] + linarith + have ht'_gt : hP4.sUpper < t' := by + dsimp [t', β] + linarith + have hs'_lt_one : s' < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [s', β] + nlinarith [hP4.sUpper_pos, hβ_pos] + have ht'_lt_one : t' < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [t', β] + nlinarith [hP4.sLower_pos, hβ_pos] + have hLowerExcessAE : AEMeasurable lowerExcess P := by + simpa [lowerExcess] using + (hLowerAE.sub aemeasurable_const).max aemeasurable_const + have hUpperExcessAE : AEMeasurable upperExcess P := by + simpa [upperExcess] using + (hUpperAE.sub aemeasurable_const).max aemeasurable_const + have hLowerExcess_nonneg : ∀ᵐ a ∂P, 0 ≤ lowerExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hUpperExcess_nonneg : ∀ᵐ a ∂P, 0 ≤ upperExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hLowerPowInt : + Integrable (fun a : RegCoeffField d => lowerExcess a ^ hP4.xi) P := by + simpa [lowerExcess, Q, s', β] using + Section52.lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hs'_gt hs'_lt_one m + have hUpperPowInt : + Integrable (fun a : RegCoeffField d => upperExcess a ^ hP4.xi) P := by + simpa [upperExcess, Q, t', β] using + Section52.upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 ht'_gt ht'_lt_one m + have hLowerMem : + MemLp lowerExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hLowerExcessAE + hLowerExcess_nonneg hLowerPowInt + have hUpperMem : + MemLp upperExcess (ENNReal.ofReal (hP4.xi : ℝ)) P := + memLp_of_integrable_nonneg_nat_pow hP4.xi_pos hUpperExcessAE + hUpperExcess_nonneg hUpperPowInt + exact ⟨hLowerAE, hUpperAE, hLowerMem, hUpperMem⟩ + +private theorem integral_mul_le_momentRoot_mul_of_root_le + {α : Type*} [MeasurableSpace α] {μ : Measure α} {p q R : ℝ} + {X Y : α → ℝ} (hpq : p.HolderConjugate q) + (hX_nonneg : 0 ≤ᵐ[μ] X) (hY_nonneg : 0 ≤ᵐ[μ] Y) + (hX : MemLp X (ENNReal.ofReal p) μ) (hY : MemLp Y (ENNReal.ofReal q) μ) + (hYroot : (∫ a, Y a ^ q ∂μ) ^ (1 / q) ≤ R) : + ∫ a, X a * Y a ∂μ ≤ (∫ a, X a ^ p ∂μ) ^ (1 / p) * R := by + have hXroot_nonneg : 0 ≤ (∫ a, X a ^ p ∂μ) ^ (1 / p) := by + apply Real.rpow_nonneg + apply integral_nonneg_of_ae + filter_upwards [hX_nonneg] with a ha + exact Real.rpow_nonneg ha _ + exact (integral_mul_le_Lp_mul_Lq_of_nonneg hpq hX_nonneg hY_nonneg hX hY).trans + (mul_le_mul_of_nonneg_left hYroot hXroot_nonneg) + +private theorem childResponseAverage_moment_facts + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) {k m : ℕ} (hkm : k ≤ m) + (e : Vec d) : + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let childAvg : RegCoeffField d → ℝ := fun a => + descendantsAverage (originCube d (m : ℤ)) (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + AEMeasurable childAvg P ∧ (0 ≤ᵐ[P] childAvg) ∧ MemLp childAvg (ENNReal.ofReal ζ) P ∧ + (∫ a, childAvg a ^ ζ ∂P) ^ (1 / ζ) ≤ + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + dsimp only + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let childAvg : RegCoeffField d → ℝ := fun a => + descendantsAverage (originCube d (m : ℤ)) (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let responseMoment := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + have hζ_pos : 0 < ζ := section53CoarseFluctuationZeta_pos hP4 + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm + have hChild_aemeas : AEMeasurable childAvg P := by + simpa [childAvg] using + hP.aemeasurable_descendantsAverage_restrictionResponseJObservableCubeSet + (originCube d (m : ℤ)) (Int.toNat ((m : ℤ) - (k : ℤ))) p_e q_e + have hChild_nonneg : ∀ᵐ a ∂P, 0 ≤ childAvg a := by + filter_upwards with a + dsimp [childAvg] + exact descendantsAverage_nonneg (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + (fun R hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p_e q_e a) + have hChild_mem : + MemLp childAvg (ENNReal.ofReal ζ) P := by + simpa [childAvg, ζ, p_e, q_e] using + memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + hP hstat hStruct hP4 hk_nonneg hkm_int p_e q_e + have hChildMomentRoot_le : + (∫ a, childAvg a ^ ζ ∂P) ^ (1 / ζ) ≤ responseMoment := by + have hIntLe := + integral_rpow_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_le_originCube_of_stationary + hP hstat hStruct hP4 hk_nonneg hkm_int p_e q_e + have hChildPow_nonneg : + 0 ≤ ∫ a, childAvg a ^ ζ ∂P := by + refine integral_nonneg ?_ + intro a + have hnonneg : 0 ≤ childAvg a := by + dsimp [childAvg] + exact descendantsAverage_nonneg (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + (fun R hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p_e q_e a) + exact Real.rpow_nonneg hnonneg _ + have hroot_nonneg : 0 ≤ 1 / ζ := by positivity + have hroot := + Real.rpow_le_rpow hChildPow_nonneg + (by simpa [childAvg, ζ, p_e, q_e, Real.rpow_eq_pow] using hIntLe) + hroot_nonneg + simpa [responseMoment, coarseFluctuationResponseMomentAtScale, ζ, p_e, q_e, + one_div] using hroot + exact ⟨hChild_aemeas, hChild_nonneg, hChild_mem, hChildMomentRoot_le⟩ + +private theorem twoExponentCoeff_le_scaled_decay + {d ξ : ℕ} {C52 s r decay C0 : ℝ} (m : ℕ) + (hC52_nonneg : 0 ≤ C52) + (hLoss_nonneg : 0 ≤ section52MomentLossCoeff d ξ s r) + (hdecay_nonneg : 0 ≤ decay) + (hC0 : C52 * section52MomentLossCoeff d ξ s r ≤ C0) + (hdecay : Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) ≤ decay) : + section52TwoExponentMomentBoundCoeff d ξ C52 s r m ≤ C0 * decay := by + have hpref_nonneg : 0 ≤ C52 * section52MomentLossCoeff d ξ s r := + mul_nonneg hC52_nonneg hLoss_nonneg + calc + section52TwoExponentMomentBoundCoeff d ξ C52 s r m = + (C52 * section52MomentLossCoeff d ξ s r) * + Real.rpow (3 : ℝ) (-(r - (d : ℝ) / (ξ : ℝ)) * (m : ℝ)) := by + simp [section52TwoExponentMomentBoundCoeff, mul_assoc] + _ ≤ (C52 * section52MomentLossCoeff d ξ s r) * decay := + mul_le_mul_of_nonneg_left hdecay hpref_nonneg + _ ≤ C0 * decay := mul_le_mul_of_nonneg_right hC0 hdecay_nonneg + +private theorem paired_positiveExcess_scalar_bound + {σ lowerIntegral upperIntegral lowerMoment upperMoment lowerCoeff upperCoeff + lowerZero upperZero C0 decay responseMoment ξ : ℝ} + (hσ_nonneg : 0 ≤ σ) (hLower0_nonneg : 0 ≤ lowerZero) + (hUpper0_nonneg : 0 ≤ upperZero) (hResponse_nonneg : 0 ≤ responseMoment) + (hC0_nonneg : 0 ≤ C0) (hdecay_nonneg : 0 ≤ decay) (hXi_one : 1 ≤ ξ) + (hLowerCoeff_le : lowerCoeff ≤ C0 * decay) + (hUpperCoeff_le : upperCoeff ≤ C0 * decay) + (hLowerMomentBound : lowerMoment ≤ lowerCoeff * lowerZero) + (hUpperMomentBound : upperMoment ≤ upperCoeff * upperZero) + (hLowerHolder : lowerIntegral ≤ lowerMoment * responseMoment) + (hUpperHolder : upperIntegral ≤ upperMoment * responseMoment) : + σ * lowerIntegral + σ⁻¹ * upperIntegral ≤ + C0 * ξ * decay * (σ * lowerZero + σ⁻¹ * upperZero) * responseMoment := by + let unitMoment := σ * lowerZero + σ⁻¹ * upperZero + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hLowerIntegral_le : + lowerIntegral ≤ + ((C0 * decay) * + lowerZero) * + responseMoment := by + calc + lowerIntegral + ≤ + lowerMoment * + responseMoment := hLowerHolder + _ ≤ + (lowerCoeff * lowerZero) * + responseMoment := + mul_le_mul_of_nonneg_right hLowerMomentBound hResponse_nonneg + _ ≤ + ((C0 * decay) * + lowerZero) * + responseMoment := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hLowerCoeff_le hLower0_nonneg) + hResponse_nonneg + have hUpperIntegral_le : + upperIntegral ≤ + ((C0 * decay) * + upperZero) * + responseMoment := by + calc + upperIntegral + ≤ + upperMoment * + responseMoment := hUpperHolder + _ ≤ + (upperCoeff * upperZero) * + responseMoment := + mul_le_mul_of_nonneg_right hUpperMomentBound hResponse_nonneg + _ ≤ + ((C0 * decay) * + upperZero) * + responseMoment := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hUpperCoeff_le hUpper0_nonneg) + hResponse_nonneg + have hWeightedLower : + σ * (lowerIntegral) ≤ + (C0 * decay) * + (σ * lowerZero) * + responseMoment := by + calc + σ * (lowerIntegral) + ≤ σ * + (((C0 * decay) * + lowerZero) * + responseMoment) := + mul_le_mul_of_nonneg_left hLowerIntegral_le hσ_nonneg + _ = + (C0 * decay) * + (σ * lowerZero) * + responseMoment := by ring + have hWeightedUpper : + σ⁻¹ * (upperIntegral) ≤ + (C0 * decay) * + (σ⁻¹ * upperZero) * + responseMoment := by + calc + σ⁻¹ * (upperIntegral) + ≤ σ⁻¹ * + (((C0 * decay) * + upperZero) * + responseMoment) := + mul_le_mul_of_nonneg_left hUpperIntegral_le hσ_inv_nonneg + _ = + (C0 * decay) * + (σ⁻¹ * upperZero) * + responseMoment := by ring + have hUnit_nonneg : + 0 ≤ unitMoment := by + dsimp [unitMoment] + exact add_nonneg + (mul_nonneg hσ_nonneg hLower0_nonneg) + (mul_nonneg hσ_inv_nonneg hUpper0_nonneg) + calc + σ * (lowerIntegral) + + σ⁻¹ * (upperIntegral) + ≤ + (C0 * decay) * + (σ * lowerZero) * + responseMoment + + (C0 * decay) * + (σ⁻¹ * upperZero) * + responseMoment := + add_le_add hWeightedLower hWeightedUpper + _ = + C0 * decay * + unitMoment * + responseMoment := by + simp [unitMoment] + ring + _ ≤ + C0 * ξ * decay * + unitMoment * + responseMoment := by + have hC0_le : C0 ≤ C0 * ξ := by + calc + C0 = C0 * 1 := by ring + _ ≤ C0 * ξ := + mul_le_mul_of_nonneg_left hXi_one hC0_nonneg + have htail_nonneg : + 0 ≤ decay * + unitMoment * + responseMoment := + mul_nonneg (mul_nonneg hdecay_nonneg hUnit_nonneg) hResponse_nonneg + calc + C0 * decay * + unitMoment * + responseMoment + = + C0 * + (decay * + unitMoment * + responseMoment) := by ring + _ ≤ + (C0 * ξ) * + (decay * + unitMoment * + responseMoment) := + mul_le_mul_of_nonneg_right hC0_le htail_nonneg + _ = + C0 * ξ * decay * + unitMoment * + responseMoment := by ring + +private theorem ellipticityPositiveExcessContribution_expectation_le_of_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) + (hLowerPowInt : + let β := section53CoarseFluctuationBeta hP4 + let rLower := hP4.sLower + β + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) + (hUpperPowInt : + let β := section53CoarseFluctuationBeta hP4 + let rUpper := hP4.sUpper + β + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hResponsePowInt : + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Integrable + (fun a : RegCoeffField d => + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ) P) : + ∃ C : ℝ, 0 ≤ C ∧ + let β := section53CoarseFluctuationBeta hP4 + let rLower := hP4.sLower + β + let rUpper := hP4.sUpper + β + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let J : RegCoeffField d → ℝ := + fun a => Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a + σ * + (∫ a, + (max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) * J a ∂P) + + σ⁻¹ * + (∫ a, + (max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) * J a ∂P) + ≤ + C * (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + let β := section53CoarseFluctuationBeta hP4 + let ζ := section53CoarseFluctuationZeta hP4 + let rLower := hP4.sLower + β + let rUpper := hP4.sUpper + β + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let J : RegCoeffField d → ℝ := + fun a => Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let responseMoment := + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + rcases Section52.multiscaleEllipticityMomentBounds_homogenizationScale + (d := d) with ⟨C52, hC52_nonneg, hC52_bound⟩ + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hrLower_gt : hP4.sLower < rLower := by + dsimp [rLower, β] + linarith + have hrUpper_gt : hP4.sUpper < rUpper := by + dsimp [rUpper, β] + linarith + have hrLower_lt_one : rLower < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [rLower, β] + nlinarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hrUpper_lt_one : rUpper < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + dsimp [rUpper, β] + nlinarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have hBounds := hC52_bound hP hStruct hP4 rUpper rLower m + hrUpper_gt hrUpper_lt_one hrLower_gt hrLower_lt_one + let upperCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 hP4.sUpper rUpper m + let lowerCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 hP4.sLower rLower m + let upperLoss : ℝ := + section52MomentLossCoeff d hP4.xi hP4.sUpper rUpper + let lowerLoss : ℝ := + section52MomentLossCoeff d hP4.xi hP4.sLower rLower + let decay : ℝ := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let C0 : ℝ := max (C52 * lowerLoss) (C52 * upperLoss) + have hUpperLoss_nonneg : 0 ≤ upperLoss := by + simpa [upperLoss, rUpper] using + section52MomentLossCoeff_nonneg_at_shift hP4 + hP4.sUpper_pos hrUpper_gt hrUpper_lt_one + have hLowerLoss_nonneg : 0 ≤ lowerLoss := by + simpa [lowerLoss, rLower] using + section52MomentLossCoeff_nonneg_at_shift hP4 + hP4.sLower_pos hrLower_gt hrLower_lt_one + have hC0_nonneg : 0 ≤ C0 := by + exact (mul_nonneg hC52_nonneg hLowerLoss_nonneg).trans + (le_max_left (C52 * lowerLoss) (C52 * upperLoss)) + have hdecay_nonneg : 0 ≤ decay := by + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hUpperCoeff_le : upperCoeff ≤ C0 * decay := by + apply twoExponentCoeff_le_scaled_decay m hC52_nonneg hUpperLoss_nonneg + hdecay_nonneg (le_max_right (C52 * lowerLoss) (C52 * upperLoss)) + simpa only [rUpper, β, decay] using shiftedUpperDecay_le_betaDecay hP4 m + have hLowerCoeff_le : lowerCoeff ≤ C0 * decay := by + apply twoExponentCoeff_le_scaled_decay m hC52_nonneg hLowerLoss_nonneg + hdecay_nonneg (le_max_left (C52 * lowerLoss) (C52 * upperLoss)) + simpa only [rLower, β, decay] using shiftedLowerDecay_le_betaDecay hP4 m + refine ⟨C0, hC0_nonneg, ?_⟩ + dsimp only + have hLowerHolder := + lowerPositiveExcess_responseJ_expectation_le_of_integrable hP hStruct hP4 k m e + (by simpa [β, rLower] using hLowerPowInt) + (by simpa [ζ, p_e, q_e] using hResponsePowInt) + have hUpperHolder := + upperPositiveExcess_responseJ_expectation_le_of_integrable hP hStruct hP4 k m e + (by simpa [β, rUpper] using hUpperPowInt) + (by simpa [ζ, p_e, q_e] using hResponsePowInt) + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hLower0_nonneg : + 0 ≤ Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUpper0_nonneg : + 0 ≤ Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hJpow_nonneg : + ∀ a, 0 ≤ Real.rpow (J a) ζ := by + intro a + exact Real.rpow_nonneg + (Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a) _ + have hJpow_integral_nonneg : + 0 ≤ ∫ a, Real.rpow (J a) ζ ∂P := + integral_nonneg hJpow_nonneg + have hResponse_nonneg : 0 ≤ responseMoment := by + dsimp [responseMoment, coarseFluctuationResponseMomentAtScale, J, ζ, p_e, q_e] + exact Real.rpow_nonneg hJpow_integral_nonneg _ + have hLowerMomentBound : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct ≤ + lowerCoeff * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + simpa [lowerCoeff, rLower] using hBounds.2 + have hUpperMomentBound : + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct ≤ + upperCoeff * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + simpa [upperCoeff, rUpper] using hBounds.1 + have hXi_one : (1 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.succ_le_of_lt hP4.xi_pos + exact paired_positiveExcess_scalar_bound hσ_nonneg hLower0_nonneg hUpper0_nonneg + hResponse_nonneg hC0_nonneg hdecay_nonneg hXi_one hLowerCoeff_le hUpperCoeff_le + hLowerMomentBound hUpperMomentBound + (by simpa [lowerExcess, J, responseMoment, rLower, β, p_e, q_e] using hLowerHolder) + (by simpa [upperExcess, J, responseMoment, rUpper, β, p_e, q_e] using hUpperHolder) + +theorem ellipticityPositiveExcess_childResponseAverage_expectation_le_uniform + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, + let β := section53CoarseFluctuationBeta hP4 + let rLower := hP4.sLower + β + let rUpper := hP4.sUpper + β + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let childAvg : RegCoeffField d → ℝ := + fun a => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + σ * + (∫ a, + (max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) * childAvg a ∂P) + + σ⁻¹ * + (∫ a, + (max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) * childAvg a ∂P) + ≤ + C * (hP4.xi : ℝ) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + let β := section53CoarseFluctuationBetaParams params + let ζ := section53CoarseFluctuationZetaParams params + let rLower := params.sLower + β + let rUpper := params.sUpper + β + rcases Section52.multiscaleEllipticityMomentBounds_homogenizationScale + (d := d) with ⟨C52, hC52_nonneg, hC52_bound⟩ + let upperLoss : ℝ := + section52MomentLossCoeff d params.xi params.sUpper rUpper + let lowerLoss : ℝ := + section52MomentLossCoeff d params.xi params.sLower rLower + let C0 : ℝ := max 0 (max (C52 * lowerLoss) (C52 * upperLoss)) + have hC0_nonneg : 0 ≤ C0 := by + dsimp [C0] + exact le_max_left _ _ + refine ⟨C0, hC0_nonneg, ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e + subst params + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hrLower_gt : hP4.sLower < rLower := by + simpa [rLower, β] using sLower_lt_sLower_add_beta hP4 + have hrUpper_gt : hP4.sUpper < rUpper := by + simpa [rUpper, β] using sUpper_lt_sUpper_add_beta hP4 + have hrLower_lt_one : rLower < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hbeta := section53CoarseFluctuationBeta_pos hP4 + have hlt : hP4.sLower + section53CoarseFluctuationBeta hP4 < 1 := by + nlinarith [hP4.sUpper_pos] + simpa [rLower, β] using hlt + have hrUpper_lt_one : rUpper < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hbeta := section53CoarseFluctuationBeta_pos hP4 + have hlt : hP4.sUpper + section53CoarseFluctuationBeta hP4 < 1 := by + nlinarith [hP4.sLower_pos] + simpa [rUpper, β] using hlt + have hUpperLoss_nonneg : 0 ≤ upperLoss := by + simpa [upperLoss, rUpper] using + section52MomentLossCoeff_nonneg_at_shift hP4 + hP4.sUpper_pos hrUpper_gt hrUpper_lt_one + have hLowerLoss_nonneg : 0 ≤ lowerLoss := by + simpa [lowerLoss, rLower] using + section52MomentLossCoeff_nonneg_at_shift hP4 + hP4.sLower_pos hrLower_gt hrLower_lt_one + have hC0_ge_lower : C52 * lowerLoss ≤ C0 := by + dsimp [C0] + exact (le_max_left (C52 * lowerLoss) (C52 * upperLoss)).trans + (le_max_right 0 (max (C52 * lowerLoss) (C52 * upperLoss))) + have hC0_ge_upper : C52 * upperLoss ≤ C0 := by + dsimp [C0] + exact (le_max_right (C52 * lowerLoss) (C52 * upperLoss)).trans + (le_max_right 0 (max (C52 * lowerLoss) (C52 * upperLoss))) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let childAvg : RegCoeffField d → ℝ := + fun a => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - (k : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + let lowerExcess : RegCoeffField d → ℝ := + fun a => + max + ((Ch04.lambdaSqCoeffField + (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0 + let upperExcess : RegCoeffField d → ℝ := + fun a => + max + (Ch04.LambdaSqCoeffField + (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0 + let responseMoment := + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + have hBounds := hC52_bound hP hStruct hP4 rUpper rLower m + hrUpper_gt hrUpper_lt_one hrLower_gt hrLower_lt_one + let upperCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 hP4.sUpper rUpper m + let lowerCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 hP4.sLower rLower m + let decay : ℝ := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + have hdecay_nonneg : 0 ≤ decay := by + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hUpperCoeff_le : upperCoeff ≤ C0 * decay := by + apply twoExponentCoeff_le_scaled_decay m hC52_nonneg hUpperLoss_nonneg + hdecay_nonneg hC0_ge_upper + simpa only [rUpper, β, decay] using shiftedUpperDecay_le_betaDecay hP4 m + have hLowerCoeff_le : lowerCoeff ≤ C0 * decay := by + apply twoExponentCoeff_le_scaled_decay m hC52_nonneg hLowerLoss_nonneg + hdecay_nonneg hC0_ge_lower + simpa only [rLower, β, decay] using shiftedLowerDecay_le_betaDecay hP4 m + obtain ⟨_, _, hLower_mem, hUpper_mem⟩ := + shifted_excess_regularity hP hStruct hP4 m + have hLower_nonneg : ∀ᵐ a ∂P, 0 ≤ lowerExcess a := by + filter_upwards with a + exact le_max_right _ _ + have hUpper_nonneg : ∀ᵐ a ∂P, 0 ≤ upperExcess a := by + filter_upwards with a + exact le_max_right _ _ + obtain ⟨hChild_aemeas, hChild_nonneg, hChild_mem, hChildMomentRoot_le⟩ := + childResponseAverage_moment_facts hP hstat hStruct hP4 hkm.le e + have hLowerHolder : + ∫ a, lowerExcess a * childAvg a ∂P ≤ + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct * + responseMoment := by + simpa [lowerExcess, lambdaInvPositiveExcessMomentAtScale, + Ch04.annealedMomentRoot, rLower, ζ, one_div, Real.rpow_natCast] using + integral_mul_le_momentRoot_mul_of_root_le + (holderConjugate_xi_section53CoarseFluctuationZeta hP4) + hLower_nonneg hChild_nonneg hLower_mem hChild_mem hChildMomentRoot_le + have hUpperHolder : + ∫ a, upperExcess a * childAvg a ∂P ≤ + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + responseMoment := by + simpa [upperExcess, LambdaPositiveExcessMomentAtScale, + Ch04.annealedMomentRoot, rUpper, ζ, one_div, Real.rpow_natCast] using + integral_mul_le_momentRoot_mul_of_root_le + (holderConjugate_xi_section53CoarseFluctuationZeta hP4) + hUpper_nonneg hChild_nonneg hUpper_mem hChild_mem hChildMomentRoot_le + -- The remaining coefficient bookkeeping is identical to + -- `ellipticityPositiveExcessContribution_expectation_le_of_integrable`. + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ, sigmaHatAtScale] + exact Real.sqrt_nonneg _ + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ_nonneg + have hLower0_nonneg : + 0 ≤ Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUpper0_nonneg : + 0 ≤ Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hResponse_nonneg : 0 ≤ responseMoment := by + dsimp [responseMoment, coarseFluctuationResponseMomentAtScale, ζ, p_e, q_e] + refine Real.rpow_nonneg ?_ _ + refine integral_nonneg ?_ + intro a + exact Real.rpow_nonneg + (Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a) _ + have hLowerMomentBound : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct ≤ + lowerCoeff * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + simpa [lowerCoeff, rLower] using hBounds.2 + have hUpperMomentBound : + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct ≤ + upperCoeff * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + simpa [upperCoeff, rUpper] using hBounds.1 + have hXi_one : (1 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.succ_le_of_lt hP4.xi_pos + exact paired_positiveExcess_scalar_bound hσ_nonneg hLower0_nonneg hUpper0_nonneg + hResponse_nonneg hC0_nonneg hdecay_nonneg hXi_one hLowerCoeff_le hUpperCoeff_le + hLowerMomentBound hUpperMomentBound + hLowerHolder hUpperHolder + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/RHSConversion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/RHSConversion.lean new file mode 100644 index 0000000000..b063afe446 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/RHSConversion.lean @@ -0,0 +1,770 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PositiveExcessDefectSquare +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.AdditivityDefects +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.LinearProductAbsorption + +/-! # RHSConversion -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# RHS conversion for the coarse-fluctuation lemma + +This file is proof-internal to the third Section 5.3 lemma. It owns the +scalar/nonnegativity bookkeeping and the expectation-level conversion from the +first-lemma weak-norm RHS to the manuscript coarse-fluctuation RHS. +-/ + +noncomputable section + +private theorem barSigmaStarAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (m : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (m : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (m : ℤ)] + exact inv_pos.mpr hInv + +private theorem barSigmaAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta := + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + have hstar_pos := barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hprod_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + exact lt_of_lt_of_le zero_lt_one (by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using htheta) + exact pos_of_mul_pos_left hprod_pos (inv_pos.mpr hstar_pos).le + +private theorem sigmaHatAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℤ) : + 0 ≤ sigmaHatAtScale hP hStruct m := by + exact Real.sqrt_nonneg _ + +private theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : + 0 ≤ fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m R a := by + simp [fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Ch04.fullBlockNormalizedFluctuationOperatorNormSq] + +private theorem aemeasurable_vecNormSq_sub_const + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {d : ℕ} {F : α → Vec d} (hF : AEMeasurable F μ) (v : Vec d) : + AEMeasurable (fun a : α => vecNormSq (F a - v)) μ := by + have hcoord : ∀ i : Fin d, AEMeasurable (fun a : α => F a i - v i) μ := by + intro i + exact ((aemeasurable_pi_iff.mp hF) i).sub aemeasurable_const + simpa [vecNormSq, vecDot] using + (Finset.univ.aemeasurable_fun_sum + (μ := μ) + (f := fun i a => (F a i - v i) * (F a i - v i)) + (fun i _hi => (hcoord i).mul (hcoord i))) + +/-- Nonnegativity of the scalar ellipticity weight in the final RHS. -/ +theorem coarseFluctuationScalarWeightAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := by + dsimp [coarseFluctuationScalarWeightAtScale] + have hσ : 0 ≤ sigmaHatAtScale hP hStruct (m : ℤ) := + sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hσ_inv : 0 ≤ (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ := + inv_nonneg.mpr hσ + have hstar_inv : + 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := + (inv_pos.mpr (by + simpa using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0)).le + have hbar : + 0 ≤ hP.barSigmaAtScale hStruct 0 := + (barSigmaAtScale_pos_of_P4 hP hStruct hP4 0).le + exact add_nonneg (mul_nonneg hσ hstar_inv) (mul_nonneg hσ_inv hbar) + +private theorem sigmaHatAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < sigmaHatAtScale hP hStruct (m : ℤ) := by + dsimp [sigmaHatAtScale] + exact Real.sqrt_pos_of_pos + (mul_pos (barSigmaAtScale_pos_of_P4 hP hStruct hP4 m) + (barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m)) + +/-- The scalar weight in the coarse-fluctuation RHS is uniformly bounded +below. This is just AM-GM applied to +`\widehat\sigma_m \bar\sigma_{*,0}^{-1}` and +`\widehat\sigma_m^{-1} \bar\sigma_0`, whose product is `Theta_0 ≥ 1`. -/ +theorem one_le_coarseFluctuationScalarWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 1 ≤ coarseFluctuationScalarWeightAtScale hP hStruct m := by + dsimp [coarseFluctuationScalarWeightAtScale] + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let b0 := hP.barSigmaAtScale hStruct 0 + let c0 := hP.barSigmaStarAtScale hStruct 0 + let θ0 := thetaAtScale hP hStruct (0 : ℤ) + let x := σ * c0⁻¹ + let y := σ⁻¹ * b0 + have hσ : 0 < σ := by + simpa [σ] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hb0 : 0 < b0 := by + simpa [b0] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0 : 0 < c0 := by + simpa [c0] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hx : 0 ≤ x := by + dsimp [x] + exact mul_nonneg hσ.le (inv_pos.mpr hc0).le + have hy : 0 ≤ y := by + dsimp [y] + exact mul_nonneg (inv_pos.mpr hσ).le hb0.le + have hθ0_one : 1 ≤ θ0 := by + simpa [θ0] using one_le_thetaAtScale_of_P4 hP hStruct hP4 0 + have hθ0_nonneg : 0 ≤ θ0 := le_trans zero_le_one hθ0_one + have hxy : x * y = θ0 := by + dsimp [x, y, θ0, thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, + b0, c0] + field_simp [hσ.ne', hc0.ne'] + have hAM : 2 * Real.sqrt θ0 ≤ x + y := + two_mul_le_add_of_sq_le_mul hx hy (by + rw [Real.sq_sqrt hθ0_nonneg, hxy]) + have hsqrt_one : 1 ≤ Real.sqrt θ0 := by + simpa [θ0] using (Real.one_le_sqrt.mpr hθ0_one) + have hone : 1 ≤ x + y := by nlinarith + simpa [x, y, σ, b0, c0] using hone + +/-- Nonnegativity of the full-block fluctuation sum. The fluctuation term is +the squared Euclidean operator norm (`Matrix.toEuclideanCLM`), not a Frobenius +norm. -/ +theorem coarseFluctuationFullBlockSumAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k m : ℕ) : + 0 ≤ coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := by + dsimp [coarseFluctuationFullBlockSumAtScale] + refine Finset.sum_nonneg ?_ + intro n _hn + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (integral_nonneg fun a => + fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) (originCube d n) a) + +/-- Nonnegativity of the tau sum in the final RHS. -/ +theorem coarseFluctuationTauSumAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : + 0 ≤ coarseFluctuationTauSumAtScale hP hStruct hP4 k m e := by + dsimp [coarseFluctuationTauSumAtScale] + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + refine Finset.sum_nonneg ?_ + intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (Int.toNat n : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat n) + have hOrigin' : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P := by + simpa [Int.toNat_of_nonneg hn_nonneg] using hOrigin + have hParent : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hDesc : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) n → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary hn_nonneg hnm hR hOrigin' + have htau : + 0 ≤ tauAtScale P (m : ℤ) n p_e q_e := + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hn_nonneg hnm p_e q_e hParent hDesc + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) htau + +/-- Nonnegativity of the unit-scale ellipticity moment weight. -/ +theorem coarseFluctuationUnitMomentWeightAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := by + dsimp [coarseFluctuationUnitMomentWeightAtScale] + have hσ : 0 ≤ sigmaHatAtScale hP hStruct (m : ℤ) := + sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + have hσ_inv : 0 ≤ (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ := + inv_nonneg.mpr hσ + have hLower : + 0 ≤ Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUpper : + 0 ≤ Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + exact add_nonneg (mul_nonneg hσ hLower) (mul_nonneg hσ_inv hUpper) + +/-- Nonnegativity of the response moment term. -/ +theorem coarseFluctuationResponseMomentAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) : + 0 ≤ coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e := by + dsimp [coarseFluctuationResponseMomentAtScale] + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hJpow_nonneg : + ∀ a : RegCoeffField d, + 0 ≤ Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ := by + intro a + exact Real.rpow_nonneg + (Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a) _ + exact Real.rpow_nonneg (integral_nonneg hJpow_nonneg) _ + +private theorem sum_range_to_Icc_descending {k m : ℤ} (hkm : k ≤ m) + (F : ℕ → ℝ) : + (∑ j ∈ Finset.range (Int.toNat (m - k)), F j) = + ∑ n ∈ Finset.Icc (k + 1) m, F (Int.toNat (m - n)) := by + classical + refine Finset.sum_bij (fun j _hj => m - (j : ℤ)) ?_ ?_ ?_ ?_ + · intro j hj + have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hj_lt_nat : j < Int.toNat (m - k) := Finset.mem_range.mp hj + have hj_lt : (j : ℤ) < m - k := by + have hj_lt' : (j : ℤ) < ((Int.toNat (m - k) : ℕ) : ℤ) := by + exact_mod_cast hj_lt_nat + simpa [hL] using hj_lt' + simp only [Finset.mem_Icc] + constructor <;> omega + · intro j₁ _hj₁ j₂ _hj₂ h + have h' : m - (j₁ : ℤ) = m - (j₂ : ℤ) := by simpa using h + have hcast : (j₁ : ℤ) = (j₂ : ℤ) := by omega + exact_mod_cast hcast + · intro n hn + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + refine ⟨Int.toNat (m - n), ?_, ?_⟩ + · have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hmn_lt : m - n < m - k := by omega + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + apply Finset.mem_range.mpr + have hcast : ((Int.toNat (m - n) : ℕ) : ℤ) < + ((Int.toNat (m - k) : ℕ) : ℤ) := by + simpa [hto, hL] using hmn_lt + exact_mod_cast hcast + · have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + change m - ((Int.toNat (m - n) : ℕ) : ℤ) = n + rw [hto] + omega + · intro j _hj + have harg : Int.toNat (m - (m - (j : ℤ))) = j := by + have hsub : m - (m - (j : ℤ)) = (j : ℤ) := by ring + simp [hsub] + exact congrArg F harg.symm + +private theorem sum_Icc_betaWeight_le_five_beta_inv + {k m : ℤ} (hkm : k ≤ m) {β : ℝ} (hβ : 0 < β) (hβ_le : β ≤ 1) : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) ≤ + 5 * β⁻¹ := by + let L : ℕ := Int.toNat (m - k) + have hsum_eq : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + simpa [L] using + (sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => Real.rpow (3 : ℝ) (-β * (j : ℝ)))).symm + have hrange_le : + (∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ))) ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + simpa only [Finset.mem_filter, and_true] using + Finset.mem_range.mpr (Nat.lt_succ_of_lt (Finset.mem_range.mp hj)) + · intro j _hj _hj_not + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom := + Homogenization.sum_filter_triadicDepthWeight_le_geometric_inv + β L (fun _j => True) hβ + have hgeom_five : + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ ≤ 5 * β⁻¹ := + Homogenization.Book.Ch02.inv_one_sub_rpow_three_neg_le_five_inv hβ hβ_le + calc + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) + = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hsum_eq + _ ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hrange_le + _ ≤ (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := hgeom + _ ≤ 5 * β⁻¹ := hgeom_five + +private theorem aemeasurable_weighted_descendants_norm_sqrt + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {S : Finset ℤ} {Q : TriadicCube d} + {j : ℤ → ℕ} {w : ℤ → ℝ} {V : TriadicCube d → RegCoeffField d → Vec d} {v : Vec d} + (hV : ∀ R, AEMeasurable (V R) P) : + AEMeasurable (fun a => ∑ n ∈ S, w n * + Real.sqrt (descendantsAverage Q (j n) (fun R => vecNormSq (V R a - v)))) P := by + classical + refine S.aemeasurable_fun_sum (μ := P) ?_ + intro n _hn + exact aemeasurable_const.mul + ((Ch04.aemeasurable_descendantsAverage + (P := P) (Q := Q) (j := j n) + (F := fun R a => vecNormSq (V R a - v)) + (fun R _hR => aemeasurable_vecNormSq_sub_const (hV R) v)).sqrt) + +/-- Expectation-level conversion for the paired high-scale average terms in the +weak-norm maximizer RHS. This is the full-block fluctuation part of the +paired square estimate; the fluctuation observable is the squared Euclidean +operator norm (`Matrix.toEuclideanCLM`), not a Frobenius norm. -/ +theorem integral_paired_highScaleAverageTerms_special_le_fullBlockSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (_hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + Integrable + (fun a : RegCoeffField d => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) P ∧ + ∫ a, + (σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) ∂P + ≤ + (∑ n ∈ S, w n) * + (2 * thetaAtScale hP hStruct (m : ℤ) * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := by + classical + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + let X : RegCoeffField d → ℝ := + fun a => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + let Y : RegCoeffField d → ℝ := + fun a => + (∑ n ∈ S, w n) * + ∑ n ∈ S, w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) + have hβs : β ≤ s := by + dsimp [s] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have hβt : β ≤ t := by + dsimp [t] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + have hb : 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hX_nonneg : 0 ≤ᵐ[P] X := by + filter_upwards with a + have hσ : 0 ≤ σ := by + exact sigmaHatAtScale_nonneg hP hStruct (m : ℤ) + exact add_nonneg + (mul_nonneg hσ (sq_nonneg _)) + (mul_nonneg (inv_nonneg.mpr hσ) (sq_nonneg _)) + have hPoint : X ≤ᵐ[P] Y := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + have h := + paired_highScaleAverageTerms_special_le_weighted_fullBlockNormalized_fluctuation + hP hStruct a ha (k := k) (m := m) β s t hβs hβt e hb hc he + simpa [X, Y, S, w, σ, θ, p_e, q_e, p0_e, q0_e, s, t, β] using h + have hTermInt : + ∀ n ∈ S, + Integrable + (fun a : RegCoeffField d => + w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a)) P := by + intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin : + Integrable + (fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n)) P := by + have hnat := + Section52.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_originCube_from_P4 + hP hStruct hP4 (m : ℤ) (Int.toNat n) + simpa [Int.toNat_of_nonneg hn_nonneg] using! hnat + have hdesc : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a)) P := by + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d (m : ℤ)) n := by + simpa [descendantsAtScale_eq_descendantsAtDepth + (originCube d (m : ℤ)) hnm] using! hR + exact + (hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendantsAtScale_originCube + hstat hStruct (m : ℤ) hn_nonneg hnm hRscale hOrigin).const_mul (2 * θ) + exact hdesc.const_mul (w n) + have hY_int : Integrable Y P := by + exact (MeasureTheory.integrable_finsetSum S hTermInt).const_mul (∑ n ∈ S, w n) + have hGradAvgAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) P := by + dsimp [WeakNormsMaximizer.gradientAverageTermAtScale] + exact aemeasurable_weighted_descendants_norm_sqrt + (fun R => hP.aemeasurable_canonicalScalarResponseGradientAverage_cubeSet R R p_e q_e) + have hFluxAvgAE : + AEMeasurable + (fun a : RegCoeffField d => + WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) P := by + dsimp [WeakNormsMaximizer.fluxAverageTermAtScale] + exact aemeasurable_weighted_descendants_norm_sqrt + (fun R => hP.aemeasurable_canonicalScalarResponseFluxAverage_cubeSet R R p_e q_e) + have hXAE : AEMeasurable X P := by + simpa [X, pow_two] using! + (aemeasurable_const.mul (hGradAvgAE.mul hGradAvgAE)).add + (aemeasurable_const.mul (hFluxAvgAE.mul hFluxAvgAE)) + have hX_int : Integrable X P := by + refine Integrable.mono' hY_int hXAE.aestronglyMeasurable ?_ + filter_upwards [hPoint, hX_nonneg] with a hle hnonneg + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hle + have hmono : ∫ a, X a ∂P ≤ ∫ a, Y a ∂P := + integral_mono_ae hX_int hY_int hPoint + have hstationary := + integral_weighted_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq + hP hstat hStruct hP4 k m + have hY_eq : + ∫ a, Y a ∂P = + (∑ n ∈ S, w n) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := by + calc + ∫ a, Y a ∂P = + (∑ n ∈ S, w n) * + ∫ a, + ∑ n ∈ S, w n * + descendantsAverage (originCube d (m : ℤ)) + (Int.toNat ((m : ℤ) - n)) + (fun R => + 2 * θ * + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) ∂P := by + rw [integral_const_mul] + _ = + (∑ n ∈ S, w n) * + (∑ n ∈ S, w n * + (2 * θ * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P)) := by + rw [hstationary] + _ = + (∑ n ∈ S, w n) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := by + congr 1 + simp [coarseFluctuationFullBlockSumAtScale, S, w, β, θ, + Finset.mul_sum, mul_assoc, mul_comm] + have hmain : + ∫ a, X a ∂P ≤ + (∑ n ∈ S, w n) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := by + simpa only [hY_eq] using hmono + refine ⟨by simpa [X, S, w, σ, θ, s, t, p_e, q_e, p0_e, q0_e, β] using hX_int, ?_⟩ + simpa [X, S, w, σ, θ, s, t, p_e, q_e, p0_e, q0_e, β] using hmain + +/-- The paired high-scale average part of the weak-norm maximizer RHS has the +manuscript `beta^{-1} * theta * full-block fluctuation` form. The fluctuation +observable is the squared Euclidean operator norm (`Matrix.toEuclideanCLM`), +not a Frobenius norm. -/ +theorem integral_paired_highScaleAverageTerms_special_le_beta_inv_fullBlockSumAtScale + {d : ℕ} [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + ∫ a, + (σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) ∂P + ≤ + C * β⁻¹ * thetaAtScale hP hStruct (m : ℤ) * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := by + refine ⟨10, by norm_num, ?_⟩ + intro P hP hstat hStruct hP4 k m hkm e he + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := Finset.Icc ((k : ℤ) + 1) (m : ℤ) + let w : ℤ → ℝ := + fun n => Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) + have hbase := + integral_paired_highScaleAverageTerms_special_le_fullBlockSumAtScale + hP hstat hStruct hP4 hkm e he + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_le_one : β ≤ 1 := by + have hle := sLower_add_beta_le_one hP4 + dsimp [β] at hle ⊢ + linarith [hP4.sLower_pos] + have hsum_le : + (∑ n ∈ S, w n) ≤ 5 * β⁻¹ := by + simpa [S, w, β] using + sum_Icc_betaWeight_le_five_beta_inv + (k := (k : ℤ)) (m := (m : ℤ)) + (by exact_mod_cast hkm.le) hβ_pos hβ_le_one + have hθ_nonneg : 0 ≤ θ := by + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith + have hFull_nonneg : + 0 ≤ coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := + coarseFluctuationFullBlockSumAtScale_nonneg hP hStruct hP4 k m + have hβ_inv_nonneg : 0 ≤ β⁻¹ := inv_nonneg.mpr hβ_pos.le + have htail_nonneg : + 0 ≤ 2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := by + exact mul_nonneg (mul_nonneg (by norm_num) hθ_nonneg) hFull_nonneg + have hfactor : + (∑ n ∈ S, w n) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) + ≤ + (5 * β⁻¹) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := + mul_le_mul_of_nonneg_right hsum_le htail_nonneg + have hrewrite : + (5 * β⁻¹) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) + = + 10 * β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := by ring + calc + ∫ a, + (σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2) ∂P + ≤ + (∑ n ∈ S, w n) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := by + simpa [β, s, t, p_e, q_e, p0_e, q0_e, σ, θ, S, w] using hbase.2 + _ ≤ + (5 * β⁻¹) * + (2 * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) := hfactor + _ = + 10 * β⁻¹ * θ * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m := hrewrite + +/-- The beta-weighted response-defect square-root sum at the Section 5.3 +special vectors is controlled by the manuscript weighted tau sum. All +response integrability inputs are discharged from `(P4)` and the Ch4 +law-facing integrability surface. -/ +theorem integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_special_le_tauSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) : + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∫ a, + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) + (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + Real.sqrt + (WeakNormsMaximizer.responseDefectAverageAtScale + (m : ℤ) n p_e q_e a)) ^ 2 ∂P + ≤ + (5 * β⁻¹) * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hk_nonneg : 0 ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm.le + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_le_one : β ≤ 1 := by + have hle := sLower_add_beta_le_one hP4 + dsimp [β] at hle ⊢ + linarith [hP4.sLower_pos] + have hBlockM : + Integrable + (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hParent : + Integrable + (Ch04.restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) p_e q_e) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d (m : ℤ)) p_e q_e hBlockM + have hDesc : + ∀ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) n → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p_e q_e) P := by + intro n hn R hR + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk0 : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + linarith + have hnm : n ≤ (m : ℤ) := hn_bounds.2 + have hOrigin_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat n : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat n) + have hOrigin : + Integrable + (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P := by + simpa [Int.toNat_of_nonneg hn_nonneg] using hOrigin_nat + have hBlockR : + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hn_nonneg hnm hR hOrigin + exact + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + R p_e q_e hBlockR + have hbase := + integral_sq_beta_weighted_sqrt_responseDefectAverageAtScale_le_beta_inv_tauSum + hP hstat hk_nonneg hkm_int hβ_pos hβ_le_one p_e q_e hParent hDesc + simpa [coarseFluctuationTauSumAtScale, β, p_e, q_e] using hbase + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ResponseMomentIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ResponseMomentIntegrability.lean new file mode 100644 index 0000000000..b077bdfcb7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ResponseMomentIntegrability.lean @@ -0,0 +1,78 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability + +/-! # Response Moment Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +/-! +# Response moment integrability + +This proof-internal file exposes the origin-cube `ζ`-moment integrability of +the response observable from the `L^2` response surface and `(P4)`. +-/ + +noncomputable section + +theorem integrable_rpow_restrictionResponseJObservableCubeSet_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k : ℕ) (p q : Vec d) : + Integrable + (fun a : RegCoeffField d => + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p q a) + (section53CoarseFluctuationZeta hP4)) P := by + let : IsProbabilityMeasure P := hP.isProbability + let ζ := section53CoarseFluctuationZeta hP4 + let J : RegCoeffField d → ℝ := + Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p q + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hζ_le_two : ENNReal.ofReal ζ ≤ (2 : ENNReal) := by + rw [← ENNReal.ofReal_ofNat] + exact ENNReal.ofReal_le_ofReal (by + simpa [ζ] using section53CoarseFluctuationZeta_le_two hP4) + have hJ_mem2 : MemLp J (2 : ENNReal) P := by + simpa [J] using + memLp_two_restrictionResponseJObservableCubeSet_originCube_from_P4 + hP hStruct hP4 k p q + have hJ_memζ : MemLp J (ENNReal.ofReal ζ) P := + hJ_mem2.mono_exponent hζ_le_two + have hζ_ne_zero : ENNReal.ofReal ζ ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le.mpr hζ_pos] + have hζ_ne_top : ENNReal.ofReal ζ ≠ ⊤ := by + simp + have hint : + Integrable (fun a : RegCoeffField d => ‖J a‖ ^ (ENNReal.ofReal ζ).toReal) P := + hJ_memζ.integrable_norm_rpow hζ_ne_zero hζ_ne_top + refine hint.congr ?_ + filter_upwards with a + have hJ_nonneg : 0 ≤ J a := by + simpa [J] using + Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p q a + rw [ENNReal.toReal_ofReal hζ_pos.le, Real.norm_of_nonneg hJ_nonneg, + Real.rpow_eq_pow] +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ScalarLoss.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ScalarLoss.lean new file mode 100644 index 0000000000..1006c91fda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/ScalarLoss.lean @@ -0,0 +1,290 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic + +/-! # Scalar Loss -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +/-! +# Uniform scalar losses for the third Section 5.3 lemma + +This file isolates the purely scalar estimates that keep the Section 5.3 +coarse-fluctuation constant independent of the scale parameters. In +particular, it bounds the corrected Section 5.2 two-exponent loss at the +`β`-shifted exponents by the manuscript `ξ β^{-3}` factor. +-/ + +noncomputable section + +private theorem inv_sq_mul_div_le_xi_mul_inv_cube + {s β D ξ : ℝ} (hβ : 0 < β) (hs : 0 < s) (hD : β ≤ D) + (hβ_le_s : β ≤ s) (hξ_nonneg : 0 ≤ ξ) : + s⁻¹ ^ 2 * (ξ / D) ≤ ξ * (β ^ 3)⁻¹ := by + have hD_pos : 0 < D := lt_of_lt_of_le hβ hD + have hs_inv_le_beta_inv : s⁻¹ ≤ β⁻¹ := + (inv_le_inv₀ hs hβ).mpr hβ_le_s + have hs_inv_sq_le : s⁻¹ ^ 2 ≤ β⁻¹ ^ 2 := by + exact pow_le_pow_left₀ (inv_nonneg.mpr hs.le) hs_inv_le_beta_inv 2 + have hdiv_le : ξ / D ≤ ξ / β := + div_le_div_of_nonneg_left hξ_nonneg hβ hD + have hdiv_nonneg : 0 ≤ ξ / D := div_nonneg hξ_nonneg hD_pos.le + calc + s⁻¹ ^ 2 * (ξ / D) ≤ β⁻¹ ^ 2 * (ξ / β) := + mul_le_mul hs_inv_sq_le hdiv_le hdiv_nonneg (sq_nonneg _) + _ = ξ * (β ^ 3)⁻¹ := by + field_simp [hβ.ne'] + +private theorem inv_sq_mul_inv_sq_le_xi_mul_inv_cube + {s β ξ : ℝ} (hβ : 0 < β) (hs : 0 < s) + (hβ_le_s : β ≤ s) (hs_inv_le_xi : s⁻¹ ≤ ξ) : + s⁻¹ ^ 2 * β⁻¹ ^ 2 ≤ ξ * (β ^ 3)⁻¹ := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hξ_nonneg : 0 ≤ ξ := hs_inv_nonneg.trans hs_inv_le_xi + have hβ_inv_nonneg : 0 ≤ β⁻¹ := inv_nonneg.mpr hβ.le + have hs_inv_le_beta_inv : s⁻¹ ≤ β⁻¹ := + (inv_le_inv₀ hs hβ).mpr hβ_le_s + calc + s⁻¹ ^ 2 * β⁻¹ ^ 2 = + (s⁻¹ * s⁻¹) * (β⁻¹ * β⁻¹) := by ring + _ ≤ (ξ * β⁻¹) * (β⁻¹ * β⁻¹) := by + exact mul_le_mul + (mul_le_mul hs_inv_le_xi hs_inv_le_beta_inv hs_inv_nonneg hξ_nonneg) + (le_rfl : β⁻¹ * β⁻¹ ≤ β⁻¹ * β⁻¹) + (mul_nonneg hβ_inv_nonneg hβ_inv_nonneg) + (mul_nonneg hξ_nonneg hβ_inv_nonneg) + _ = ξ * (β ^ 3)⁻¹ := by + field_simp [hβ.ne'] + +private theorem section52MomentLossCoeff_shift_le_xi_beta_cubed_core + {s β D ξ : ℝ} (hβ : 0 < β) (hs : 0 < s) (hD : β ≤ D) + (hβ_le_s : β ≤ s) (hs_inv_le_xi : s⁻¹ ≤ ξ) (hξ_nonneg : 0 ≤ ξ) : + s⁻¹ ^ 2 * (ξ / D + β⁻¹ ^ 2) ≤ + 2 * ξ * (β ^ 3)⁻¹ := by + have hterm1 := + inv_sq_mul_div_le_xi_mul_inv_cube hβ hs hD hβ_le_s hξ_nonneg + have hterm2 := + inv_sq_mul_inv_sq_le_xi_mul_inv_cube hβ hs hβ_le_s hs_inv_le_xi + calc + s⁻¹ ^ 2 * (ξ / D + β⁻¹ ^ 2) = + s⁻¹ ^ 2 * (ξ / D) + s⁻¹ ^ 2 * β⁻¹ ^ 2 := by ring + _ ≤ ξ * (β ^ 3)⁻¹ + ξ * (β ^ 3)⁻¹ := add_le_add hterm1 hterm2 + _ = 2 * ξ * (β ^ 3)⁻¹ := by ring + +theorem section53CoarseFluctuationBeta_inv_le_xi_of_sUpper + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper⁻¹ ≤ (hP4.xi : ℝ) := by + have hdim : (1 : ℝ) ≤ (d : ℝ) := by + have hd : 1 ≤ d := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_dim + exact_mod_cast hd + have hxi_pos : 0 < (hP4.xi : ℝ) := by exact_mod_cast hP4.xi_pos + have hs_pos := hP4.sUpper_pos + have hxi_inv_le_s : (hP4.xi : ℝ)⁻¹ ≤ hP4.sUpper := by + calc + (hP4.xi : ℝ)⁻¹ ≤ (d : ℝ) / (hP4.xi : ℝ) := by + rw [div_eq_mul_inv] + exact le_mul_of_one_le_left (inv_nonneg.mpr hxi_pos.le) hdim + _ ≤ hP4.sUpper := hP4.dim_div_xi_lt_sUpper.le + exact (inv_le_comm₀ hs_pos hxi_pos).mpr hxi_inv_le_s + +theorem section53CoarseFluctuationBeta_inv_le_xi_of_sLower + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower⁻¹ ≤ (hP4.xi : ℝ) := by + have hdim : (1 : ℝ) ≤ (d : ℝ) := by + have hd : 1 ≤ d := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_dim + exact_mod_cast hd + have hxi_pos : 0 < (hP4.xi : ℝ) := by exact_mod_cast hP4.xi_pos + have hs_pos := hP4.sLower_pos + have hxi_inv_le_s : (hP4.xi : ℝ)⁻¹ ≤ hP4.sLower := by + calc + (hP4.xi : ℝ)⁻¹ ≤ (d : ℝ) / (hP4.xi : ℝ) := by + rw [div_eq_mul_inv] + exact le_mul_of_one_le_left (inv_nonneg.mpr hxi_pos.le) hdim + _ ≤ hP4.sLower := hP4.dim_div_xi_lt_sLower.le + exact (inv_le_comm₀ hs_pos hxi_pos).mpr hxi_inv_le_s + +private theorem shiftedMomentDenom_upper_beta_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sUpper + β) := by + intro β + have hdim : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hhalf : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hβ_nonneg : 0 ≤ β := by + simpa [β] using section53CoarseFluctuationBeta_nonneg hP4 + have hlower_nonneg : 0 ≤ hP4.sLower := hP4.sLower_nonneg + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg (by exact_mod_cast Nat.zero_le d) hxi_nonneg + nlinarith + +private theorem shiftedMomentDenom_lower_beta_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sLower + β) := by + intro β + have hdim : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hhalf : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hβ_nonneg : 0 ≤ β := by + simpa [β] using section53CoarseFluctuationBeta_nonneg hP4 + have hupper_nonneg : 0 ≤ hP4.sUpper := hP4.sUpper_nonneg + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg (by exact_mod_cast Nat.zero_le d) hxi_nonneg + nlinarith + +theorem section52MomentLossCoeff_upper_beta_shift_le_xi_beta_cubed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + section52MomentLossCoeff d hP4.xi hP4.sUpper (hP4.sUpper + β) ≤ + 2 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ := by + intro β + have hβ : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs : 0 < hP4.sUpper := hP4.sUpper_pos + have hβ_le_s : β ≤ hP4.sUpper := by + simpa [β] using section53CoarseFluctuationBeta_le_sUpper hP4 + have hD : β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sUpper + β) := by + simpa [β] using shiftedMomentDenom_upper_beta_le hP4 + have hsinv := section53CoarseFluctuationBeta_inv_le_xi_of_sUpper hP4 + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + simpa [section52MomentLossCoeff, sub_self] using + section52MomentLossCoeff_shift_le_xi_beta_cubed_core + (s := hP4.sUpper) (β := β) + (D := ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sUpper + β)) + (ξ := (hP4.xi : ℝ)) hβ hs hD hβ_le_s hsinv hxi_nonneg + +theorem section52MomentLossCoeff_lower_beta_shift_le_xi_beta_cubed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + section52MomentLossCoeff d hP4.xi hP4.sLower (hP4.sLower + β) ≤ + 2 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ := by + intro β + have hβ : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs : 0 < hP4.sLower := hP4.sLower_pos + have hβ_le_s : β ≤ hP4.sLower := by + simpa [β] using section53CoarseFluctuationBeta_le_sLower hP4 + have hD : β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sLower + β) := by + simpa [β] using shiftedMomentDenom_lower_beta_le hP4 + have hsinv := section53CoarseFluctuationBeta_inv_le_xi_of_sLower hP4 + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + simpa [section52MomentLossCoeff, sub_self] using + section52MomentLossCoeff_shift_le_xi_beta_cubed_core + (s := hP4.sLower) (β := β) + (D := ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sLower + β)) + (ξ := (hP4.xi : ℝ)) hβ hs hD hβ_le_s hsinv hxi_nonneg + +theorem section52MomentLossCoeff_upper_two_beta_shift_le_xi_beta_cubed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + section52MomentLossCoeff d hP4.xi (hP4.sUpper + β) + (hP4.sUpper + 2 * β) ≤ + 2 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ := by + intro β + have hβ : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs : 0 < hP4.sUpper + β := add_pos hP4.sUpper_pos hβ + have hβ_le_s : β ≤ hP4.sUpper + β := by linarith [hP4.sUpper_nonneg] + have hD : β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sUpper + 2 * β) := by + have hdim : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hhalf : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hlower_nonneg : 0 ≤ hP4.sLower := hP4.sLower_nonneg + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg (by exact_mod_cast Nat.zero_le d) hxi_nonneg + nlinarith + have hsinv : (hP4.sUpper + β)⁻¹ ≤ (hP4.xi : ℝ) := by + have hle : hP4.sUpper ≤ hP4.sUpper + β := by linarith [hβ.le] + have hinv : (hP4.sUpper + β)⁻¹ ≤ hP4.sUpper⁻¹ := + (inv_le_inv₀ hs hP4.sUpper_pos).mpr hle + exact hinv.trans (section53CoarseFluctuationBeta_inv_le_xi_of_sUpper hP4) + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hsub : hP4.sUpper + 2 * β - (hP4.sUpper + β) = β := by ring + have htwosub : 2 * β + -β = β := by ring + simpa [section52MomentLossCoeff, sub_eq_add_neg, add_comm, add_left_comm, + add_assoc, hsub, htwosub] using + section52MomentLossCoeff_shift_le_xi_beta_cubed_core + (s := hP4.sUpper + β) (β := β) + (D := ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sUpper + 2 * β)) + (ξ := (hP4.xi : ℝ)) hβ hs hD hβ_le_s hsinv hxi_nonneg + +theorem section52MomentLossCoeff_lower_two_beta_shift_le_xi_beta_cubed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + let β := section53CoarseFluctuationBeta hP4 + section52MomentLossCoeff d hP4.xi (hP4.sLower + β) + (hP4.sLower + 2 * β) ≤ + 2 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ := by + intro β + have hβ : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs : 0 < hP4.sLower + β := add_pos hP4.sLower_pos hβ + have hβ_le_s : β ≤ hP4.sLower + β := by linarith [hP4.sLower_nonneg] + have hD : β ≤ ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sLower + 2 * β) := by + have hdim : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + have hhalf : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hupper_nonneg : 0 ≤ hP4.sUpper := hP4.sUpper_nonneg + have hxi_nonneg : (0 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast Nat.zero_le hP4.xi + have hdiv_nonneg : 0 ≤ (d : ℝ) / (hP4.xi : ℝ) := + div_nonneg (by exact_mod_cast Nat.zero_le d) hxi_nonneg + nlinarith + have hsinv : (hP4.sLower + β)⁻¹ ≤ (hP4.xi : ℝ) := by + have hle : hP4.sLower ≤ hP4.sLower + β := by linarith [hβ.le] + have hinv : (hP4.sLower + β)⁻¹ ≤ hP4.sLower⁻¹ := + (inv_le_inv₀ hs hP4.sLower_pos).mpr hle + exact hinv.trans (section53CoarseFluctuationBeta_inv_le_xi_of_sLower hP4) + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hsub : hP4.sLower + 2 * β - (hP4.sLower + β) = β := by ring + have htwosub : 2 * β + -β = β := by ring + simpa [section52MomentLossCoeff, sub_eq_add_neg, add_comm, add_left_comm, + add_assoc, hsub, htwosub] using + section52MomentLossCoeff_shift_le_xi_beta_cubed_core + (s := hP4.sLower + β) (β := β) + (D := ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (hP4.sLower + 2 * β)) + (ξ := (hP4.xi : ℝ)) hβ hs hD hβ_le_s hsinv hxi_nonneg + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/SpecialVectors.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/SpecialVectors.lean new file mode 100644 index 0000000000..2556893071 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/SpecialVectors.lean @@ -0,0 +1,603 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.CenteredResponses + +/-! # Special Vectors -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Special vectors for the third Section 5.3 lemma + +This file contains the scalar algebra for the manuscript choices +`p_e = \widehat\sigma_m^{-1/2} e` and +`q_e = \widehat\sigma_m^{1/2} e`. +-/ + +/-- The centered-response expectation is the raw response expectation with the +manuscript scalar centering subtracted, specialized to the Section 5.3 special +vectors. -/ +theorem expectedResponseJCubeSet_sub_half_vecDot_specialCentering_eq_expectedCenteredResponseJAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e - + (1 / 2 : ℝ) * vecDot p0_e q0_e = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := by + dsimp only + let : IsProbabilityMeasure P := hP.isProbability + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hJ : + Integrable + (Ch04.restrictionResponseJObservableCubeSet (originCube d (m : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e)) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d (m : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) hBlock + have hCentered := + Section52.expectedCenteredResponseJAtScale_eq_annealedResponseJAtScale_sub + hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) hJ + rw [hCentered] + simp [Ch04.expectedResponseJCubeSet, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale, Ch04.restrictionResponseJObservableCubeSet, + scalarizedResponseCenteringTerm] + +private theorem sigma_mul_inv_star_eq_sqrt_theta {b c σ θ : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (hθ : θ = b * c⁻¹) : + σ * c⁻¹ = Real.sqrt θ := by + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hθnonneg : 0 ≤ θ := by + rw [hθ] + exact mul_nonneg hb.le (inv_pos.mpr hc).le + have hleft_nonneg : 0 ≤ σ * c⁻¹ := mul_nonneg hσpos.le (inv_pos.mpr hc).le + have hsq : (σ * c⁻¹) * (σ * c⁻¹) = Real.sqrt θ * Real.sqrt θ := by + calc + (σ * c⁻¹) * (σ * c⁻¹) = + (Real.sqrt (b * c) * Real.sqrt (b * c)) * (c⁻¹ * c⁻¹) := by + rw [hσ] + ring + _ = (b * c) * (c⁻¹ * c⁻¹) := by + rw [Real.mul_self_sqrt (mul_pos hb hc).le] + _ = b * c⁻¹ := by + have hcne : c ≠ 0 := ne_of_gt hc + field_simp [hcne] + _ = θ := by + rw [hθ] + _ = Real.sqrt θ * Real.sqrt θ := + (Real.mul_self_sqrt hθnonneg).symm + exact (mul_self_inj_of_nonneg hleft_nonneg (Real.sqrt_nonneg θ)).1 hsq + +private theorem barSigma_mul_inv_sigma_eq_sqrt_theta {b c σ θ : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (hθ : θ = b * c⁻¹) : + b * σ⁻¹ = Real.sqrt θ := by + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hθnonneg : 0 ≤ θ := by + rw [hθ] + exact mul_nonneg hb.le (inv_pos.mpr hc).le + have hleft_nonneg : 0 ≤ b * σ⁻¹ := mul_nonneg hb.le (inv_pos.mpr hσpos).le + have hsq : (b * σ⁻¹) * (b * σ⁻¹) = Real.sqrt θ * Real.sqrt θ := by + calc + (b * σ⁻¹) * (b * σ⁻¹) = + (b * b) * (Real.sqrt (b * c))⁻¹ * (Real.sqrt (b * c))⁻¹ := by + rw [hσ] + ring + _ = b * c⁻¹ := by + have hprod_pos : 0 < b * c := mul_pos hb hc + have hprod_ne : b * c ≠ 0 := ne_of_gt hprod_pos + have hsqrt_ne : Real.sqrt (b * c) ≠ 0 := + ne_of_gt (Real.sqrt_pos_of_pos hprod_pos) + field_simp [hsqrt_ne, hprod_ne] + rw [Real.sq_sqrt hprod_pos.le] + _ = θ := by + rw [hθ] + _ = Real.sqrt θ * Real.sqrt θ := + (Real.mul_self_sqrt hθnonneg).symm + exact (mul_self_inj_of_nonneg hleft_nonneg (Real.sqrt_nonneg θ)).1 hsq + +private theorem sigmaHat_mul_specialP_centering_coeff_sq_eq {b c σ θ : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (hθ : θ = b * c⁻¹) : + σ * (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) ^ 2 = + (Real.sqrt θ - 1) ^ 2 := by + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := sigma_mul_inv_star_eq_sqrt_theta hb hc hσ hθ + have hhalf : σ ^ (1 / 2 : ℝ) = σ * σ ^ (-(1 / 2 : ℝ)) := by + calc + σ ^ (1 / 2 : ℝ) = σ ^ ((1 : ℝ) + (-(1 / 2 : ℝ))) := by + norm_num + _ = σ ^ (1 : ℝ) * σ ^ (-(1 / 2 : ℝ)) := + Real.rpow_add hσpos 1 (-(1 / 2 : ℝ)) + _ = σ * σ ^ (-(1 / 2 : ℝ)) := by + rw [Real.rpow_one] + have hneg_sq : (σ ^ (-(1 / 2 : ℝ))) ^ 2 = σ⁻¹ := by + calc + (σ ^ (-(1 / 2 : ℝ))) ^ 2 = + (σ ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (-(1 / 2 : ℝ))) 2).symm + _ = σ ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = σ ^ (-1 : ℝ) := by + norm_num + _ = (σ ^ (1 : ℝ))⁻¹ := + Real.rpow_neg hσpos.le 1 + _ = σ⁻¹ := by + rw [Real.rpow_one] + calc + σ * (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) ^ 2 = + σ * (σ ^ (-(1 / 2 : ℝ)) * (Real.sqrt θ - 1)) ^ 2 := by + rw [hhalf] + rw [← hdiv] + ring + _ = (Real.sqrt θ - 1) ^ 2 := by + rw [mul_pow, hneg_sq] + field_simp [ne_of_gt hσpos] + +private theorem inv_sigmaHat_mul_specialQ_centering_coeff_sq_eq {b c σ θ : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hσ : σ = Real.sqrt (b * c)) (hθ : θ = b * c⁻¹) : + σ⁻¹ * (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) ^ 2 = + (Real.sqrt θ - 1) ^ 2 := by + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := barSigma_mul_inv_sigma_eq_sqrt_theta hb hc hσ hθ + have hhalf : σ ^ (1 / 2 : ℝ) = σ * σ ^ (-(1 / 2 : ℝ)) := by + calc + σ ^ (1 / 2 : ℝ) = σ ^ ((1 : ℝ) + (-(1 / 2 : ℝ))) := by + norm_num + _ = σ ^ (1 : ℝ) * σ ^ (-(1 / 2 : ℝ)) := + Real.rpow_add hσpos 1 (-(1 / 2 : ℝ)) + _ = σ * σ ^ (-(1 / 2 : ℝ)) := by + rw [Real.rpow_one] + have hpos_sq : (σ ^ (1 / 2 : ℝ)) ^ 2 = σ := by + calc + (σ ^ (1 / 2 : ℝ)) ^ 2 = + (σ ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (1 / 2 : ℝ)) 2).symm + _ = σ ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = σ ^ (1 : ℝ) := by + norm_num + _ = σ := by + rw [Real.rpow_one] + calc + σ⁻¹ * (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) ^ 2 = + σ⁻¹ * (σ ^ (1 / 2 : ℝ) * (1 - Real.sqrt θ)) ^ 2 := by + rw [hhalf] + rw [← hdiv] + field_simp [ne_of_gt hσpos] + _ = (Real.sqrt θ - 1) ^ 2 := by + rw [mul_pow, hpos_sq] + field_simp [ne_of_gt hσpos] + ring + +private theorem barSigmaStarAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (m : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (m : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (m : ℤ)] + exact inv_pos.mpr hInv + +private theorem barSigmaAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta := + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + have hstar_pos := barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hprod_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + exact lt_of_lt_of_le zero_lt_one (by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using htheta) + exact pos_of_mul_pos_left hprod_pos (inv_pos.mpr hstar_pos).le + +/-- Under `(P4)`, the scalar condition number at every origin scale is at +least one. -/ +theorem one_le_thetaAtScale_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + exact + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + +/-- At the Section 5.3 special vectors, the raw annealed scalar response is +the scalar gap `sqrt(Theta_m) - 1`, times the Euclidean square of the chosen +direction. -/ +theorem expectedResponseJCubeSet_special_eq_sqrtTheta_sub_one_mul_vecNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e = + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) * vecNormSq e := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hb : 0 < b := by + simpa [b] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hσpos : 0 < σ := by + rw [hσ] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hpos_sq : (σ ^ (1 / 2 : ℝ)) ^ 2 = σ := by + calc + (σ ^ (1 / 2 : ℝ)) ^ 2 = + (σ ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (1 / 2 : ℝ)) 2).symm + _ = σ ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = σ ^ (1 : ℝ) := by + norm_num + _ = σ := by + rw [Real.rpow_one] + have hneg_sq : (σ ^ (-(1 / 2 : ℝ))) ^ 2 = σ⁻¹ := by + calc + (σ ^ (-(1 / 2 : ℝ))) ^ 2 = + (σ ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (σ ^ (-(1 / 2 : ℝ))) 2).symm + _ = σ ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hσpos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = σ ^ (-1 : ℝ) := by + norm_num + _ = (σ ^ (1 : ℝ))⁻¹ := + Real.rpow_neg hσpos.le 1 + _ = σ⁻¹ := by + rw [Real.rpow_one] + have hhalf_mul : + σ ^ (-(1 / 2 : ℝ)) * σ ^ (1 / 2 : ℝ) = 1 := by + calc + σ ^ (-(1 / 2 : ℝ)) * σ ^ (1 / 2 : ℝ) = + σ ^ (-(1 / 2 : ℝ) + (1 / 2 : ℝ)) := + (Real.rpow_add hσpos (-(1 / 2 : ℝ)) (1 / 2 : ℝ)).symm + _ = 1 := by + norm_num + have hq : + vecDot q_e (c⁻¹ • q_e) = Real.sqrt θ * vecNormSq e := by + have hqnorm : vecDot q_e q_e = σ * vecNormSq e := by + calc + vecDot q_e q_e = + vecDot (σ ^ (1 / 2 : ℝ) • e) (σ ^ (1 / 2 : ℝ) • e) := by + simp [q_e, σ] + _ = σ ^ (1 / 2 : ℝ) * (σ ^ (1 / 2 : ℝ) * vecDot e e) := by + rw [vecDot_smul_left, vecDot_smul_right] + _ = ((σ ^ (1 / 2 : ℝ)) ^ 2) * vecNormSq e := by + simp [vecNormSq, pow_two, mul_assoc] + _ = σ * vecNormSq e := by + rw [hpos_sq] + calc + vecDot q_e (c⁻¹ • q_e) = c⁻¹ * vecDot q_e q_e := by + rw [vecDot_smul_right] + _ = c⁻¹ * (σ * vecNormSq e) := by + rw [hqnorm] + _ = (σ * c⁻¹) * vecNormSq e := by + ring + _ = Real.sqrt θ * vecNormSq e := by + rw [sigma_mul_inv_star_eq_sqrt_theta hb hc hσ hθ] + have hpq : + vecDot p_e q_e = vecNormSq e := by + calc + vecDot p_e q_e = + σ ^ (1 / 2 : ℝ) * (σ ^ (-(1 / 2 : ℝ)) * vecDot e e) := by + simp [p_e, q_e, σ, vecDot_smul_left, vecDot_smul_right] + _ = (σ ^ (-(1 / 2 : ℝ)) * σ ^ (1 / 2 : ℝ)) * vecNormSq e := by + simp [vecNormSq, mul_left_comm, mul_comm] + _ = vecNormSq e := by + rw [hhalf_mul] + ring + have hp : + vecDot p_e (b • p_e) = Real.sqrt θ * vecNormSq e := by + have hpnorm : vecDot p_e p_e = σ⁻¹ * vecNormSq e := by + calc + vecDot p_e p_e = + vecDot (σ ^ (-(1 / 2 : ℝ)) • e) (σ ^ (-(1 / 2 : ℝ)) • e) := by + simp [p_e, σ] + _ = σ ^ (-(1 / 2 : ℝ)) * (σ ^ (-(1 / 2 : ℝ)) * vecDot e e) := by + rw [vecDot_smul_left, vecDot_smul_right] + _ = ((σ ^ (-(1 / 2 : ℝ))) ^ 2) * vecNormSq e := by + simp [vecNormSq, pow_two, mul_assoc] + _ = σ⁻¹ * vecNormSq e := by + rw [hneg_sq] + calc + vecDot p_e (b • p_e) = b * vecDot p_e p_e := by + rw [vecDot_smul_right] + _ = b * (σ⁻¹ * vecNormSq e) := by + rw [hpnorm] + _ = (b * σ⁻¹) * vecNormSq e := by + ring + _ = Real.sqrt θ * vecNormSq e := by + rw [barSigma_mul_inv_sigma_eq_sqrt_theta hb hc hσ hθ] + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hScalar := + Section52.annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (m : ℤ) p_e q_e hBlock + calc + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e = + expectedJScalarFormula hP hStruct (m : ℤ) p_e q_e := by + simpa [Ch04.expectedResponseJCubeSet, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale] using hScalar + _ = + (Real.sqrt θ - 1) * vecNormSq e := by + simp [expectedJScalarFormula, b, c, θ, hq, hpq, hp] + ring + +/-- At the special vectors, the raw annealed scalar response is bounded by the +condition-number excess, with the Euclidean square of the chosen direction. -/ +theorem expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_mul_vecNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + (thetaAtScale hP hStruct (m : ℤ) - 1) * vecNormSq e := by + dsimp only + let θ := thetaAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hsqrt_le : Real.sqrt θ ≤ θ := by + rw [Real.sqrt_le_iff] + constructor + · linarith + · nlinarith [hθ_one] + have hcoeff : Real.sqrt θ - 1 ≤ θ - 1 := by + linarith + have hEq := + expectedResponseJCubeSet_special_eq_sqrtTheta_sub_one_mul_vecNormSq + hP hStruct hP4 m e + calc + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e = + (Real.sqrt θ - 1) * vecNormSq e := by + simpa [p_e, q_e, θ] using hEq + _ ≤ (θ - 1) * vecNormSq e := + mul_le_mul_of_nonneg_right hcoeff (vecNormSq_nonneg e) + +/-- Euclidean-unit specialization of +`expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_mul_vecNormSq`. -/ +theorem expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_of_vecNormSq_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + thetaAtScale hP hStruct (m : ℤ) - 1 := by + dsimp only + have h := + expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_mul_vecNormSq + hP hStruct hP4 m e + simpa [he] using h + +/-- The manuscript special vector `p_e` has the exact centered size. -/ +theorem sigmaHatAtScale_mul_norm_specialPCentering_sq_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : ‖e‖ = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + sigmaHatAtScale hP hStruct (m : ℤ) * ‖p0_e‖ ^ 2 = + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hp0 : + c⁻¹ • (σ ^ (1 / 2 : ℝ) • e) - σ ^ (-(1 / 2 : ℝ)) • e = + (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + σ * ‖c⁻¹ • (σ ^ (1 / 2 : ℝ) • e) - + σ ^ (-(1 / 2 : ℝ)) • e‖ ^ 2 = + σ * (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) ^ 2 := by + rw [hp0, norm_smul, Real.norm_eq_abs, he, mul_one, sq_abs] + _ = (Real.sqrt θ - 1) ^ 2 := + sigmaHat_mul_specialP_centering_coeff_sq_eq hb hc hσ hθ + +/-- Euclidean-squared form of the manuscript special-vector centered size for +`p_e`. This is the robust form used by the coarse-fluctuation argument; the +direction size is left explicit and can later be specialized by +`vecNormSq e = 1`. -/ +theorem sigmaHatAtScale_mul_vecNormSq_specialPCentering_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + sigmaHatAtScale hP hStruct (m : ℤ) * vecNormSq p0_e = + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 * vecNormSq e := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hp0 : + c⁻¹ • (σ ^ (1 / 2 : ℝ) • e) - σ ^ (-(1 / 2 : ℝ)) • e = + (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + σ * vecNormSq (c⁻¹ • (σ ^ (1 / 2 : ℝ) • e) - + σ ^ (-(1 / 2 : ℝ)) • e) = + σ * (c⁻¹ * σ ^ (1 / 2 : ℝ) - σ ^ (-(1 / 2 : ℝ))) ^ 2 * + vecNormSq e := by + rw [hp0, vecNormSq_smul] + ring + _ = (Real.sqrt θ - 1) ^ 2 * vecNormSq e := by + rw [sigmaHat_mul_specialP_centering_coeff_sq_eq hb hc hσ hθ] + +/-- The manuscript special vector `q_e` has the exact centered size. -/ +theorem inv_sigmaHatAtScale_mul_norm_specialQCentering_sq_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : ‖e‖ = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * ‖q0_e‖ ^ 2 = + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hq0 : + σ ^ (1 / 2 : ℝ) • e - b • (σ ^ (-(1 / 2 : ℝ)) • e) = + (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + σ⁻¹ * ‖σ ^ (1 / 2 : ℝ) • e - + b • (σ ^ (-(1 / 2 : ℝ)) • e)‖ ^ 2 = + σ⁻¹ * (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) ^ 2 := by + rw [hq0, norm_smul, Real.norm_eq_abs, he, mul_one, sq_abs] + _ = (Real.sqrt θ - 1) ^ 2 := + inv_sigmaHat_mul_specialQ_centering_coeff_sq_eq hb hc hσ hθ + +/-- Euclidean-squared form of the manuscript special-vector centered size for +`q_e`. -/ +theorem inv_sigmaHatAtScale_mul_vecNormSq_specialQCentering_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * vecNormSq q0_e = + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ 2 * vecNormSq e := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ : σ = Real.sqrt (b * c) := by + rfl + have hθ : θ = b * c⁻¹ := by + rfl + have hq0 : + σ ^ (1 / 2 : ℝ) • e - b • (σ ^ (-(1 / 2 : ℝ)) • e) = + (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + σ⁻¹ * vecNormSq (σ ^ (1 / 2 : ℝ) • e - + b • (σ ^ (-(1 / 2 : ℝ)) • e)) = + σ⁻¹ * (σ ^ (1 / 2 : ℝ) - b * σ ^ (-(1 / 2 : ℝ))) ^ 2 * + vecNormSq e := by + rw [hq0, vecNormSq_smul] + ring + _ = (Real.sqrt θ - 1) ^ 2 * vecNormSq e := by + rw [inv_sigmaHat_mul_specialQ_centering_coeff_sq_eq hb hc hσ hθ] + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormInput.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormInput.lean new file mode 100644 index 0000000000..c498d04710 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormInput.lean @@ -0,0 +1,103 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.SpecialVectors +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer + +/-! # Weak Norm Input -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory + +noncomputable section + +/-! +# Weak-norm inputs for the coarse-fluctuation lemma + +This file instantiates the deterministic weak-norm maximizer theorem at the +special vectors and beta-shifted Section 5.3 exponents. +-/ + +/-- Almost-sure beta-shifted weak-norm bounds for the special-vector scalar +maximizer. This is the direct bridge from the second Section 5.3 lemma into +the third one. -/ +theorem ae_specialWeakNormsMaximizer_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) : + ∀ᵐ a ∂P, + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d (m : ℤ)) s p_e q_e p0_e a.toFun ≤ + 2 * + WeakNormsMaximizer.gradientRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a ∧ + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d (m : ℤ)) t p_e q_e q0_e a.toFun ≤ + 2 * + WeakNormsMaximizer.fluxRHSAtScale + (WeakNormsMaximizer.section53WeakNormMaximizerConst d) + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a := by + have hkm_int : (k : ℤ) < (m : ℤ) := by exact_mod_cast hkm + let β := section53CoarseFluctuationBeta hP4 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hs : 0 < hP4.sLower + 2 * β := by + linarith [hP4.sLower_pos, hβ_pos] + have hs_le : hP4.sLower + 2 * β ≤ 1 := by + simpa [β] using sLower_add_two_beta_le_one hP4 + have hs'_low : (hP4.sLower + 2 * β) / 2 ≤ hP4.sLower + β := by + simpa [β] using half_sLower_add_two_beta_le_sLower_add_beta hP4 + have hs'_high : hP4.sLower + β < hP4.sLower + 2 * β := by + simpa [β] using sLower_add_beta_lt_sLower_add_two_beta hP4 + have ht : 0 < hP4.sUpper + 2 * β := by + linarith [hP4.sUpper_pos, hβ_pos] + have ht_le : hP4.sUpper + 2 * β ≤ 1 := by + simpa [β] using sUpper_add_two_beta_le_one hP4 + have ht'_low : (hP4.sUpper + 2 * β) / 2 ≤ hP4.sUpper + β := by + simpa [β] using half_sUpper_add_two_beta_le_sUpper_add_beta hP4 + have ht'_high : hP4.sUpper + β < hP4.sUpper + 2 * β := by + simpa [β] using sUpper_add_beta_lt_sUpper_add_two_beta hP4 + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + dsimp only + exact + WeakNormsMaximizer.weakNormsMaximizer_homogenizationScale + a ha hkm_int hs hs_le hs'_low hs'_high ht ht_le ht'_low ht'_high + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + ((hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • + specialQAtScale hP hStruct (m : ℤ) e - + specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e - + hP.barSigmaAtScale hStruct (m : ℤ) • + specialPAtScale hP hStruct (m : ℤ) e) + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormSquareIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormSquareIntegrability.lean new file mode 100644 index 0000000000..5f143e65c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/WeakNormSquareIntegrability.lean @@ -0,0 +1,649 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.PairedWeakNormSquares + +/-! # Weak Norm Square Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Special-vector weak-norm square integrability + +This proof-internal file discharges the finite-RHS side conditions inherited +from the first Section 5.3 lemma, in the special-vector regime used by the +coarse-fluctuation lemma. +-/ + +noncomputable section + +namespace Internal + +@[irreducible] noncomputable def specialGradientWeakNormSquare + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (a : RegCoeffField d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e a.toFun) ^ 2 + +@[irreducible] noncomputable def specialFluxWeakNormSquare + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (a : RegCoeffField d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e a.toFun) ^ 2 + +@[irreducible] noncomputable def specialPairedWeakNormSquare + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (a : RegCoeffField d) : ℝ := + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + σ * specialGradientWeakNormSquare hP hStruct hP4 m e a + + σ⁻¹ * specialFluxWeakNormSquare hP hStruct hP4 m e a + +@[irreducible] noncomputable def specialWeakNormComponentSquareSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) (e : Vec d) (a : RegCoeffField d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + let H : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + let M : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let L : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let T : ℝ := + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) + +end Internal + +private theorem barSigmaStarAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (m : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (m : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (m : ℤ)] + exact inv_pos.mpr hInv + +private theorem barSigmaAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta := + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + have hstar_pos := barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hprod_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + exact lt_of_lt_of_le zero_lt_one (by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using htheta) + exact pos_of_mul_pos_left hprod_pos (inv_pos.mpr hstar_pos).le + +private theorem sigmaHatAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < sigmaHatAtScale hP hStruct (m : ℤ) := by + dsimp [sigmaHatAtScale] + exact Real.sqrt_pos_of_pos + (mul_pos (barSigmaAtScale_pos_of_P4 hP hStruct hP4 m) + (barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m)) + +private theorem sq_sum_four_le_const_sum_sq (a b c d : ℝ) : + (a + b + c + d) ^ 2 ≤ + 4 * (a ^ 2 + b ^ 2 + c ^ 2 + d ^ 2) := by + nlinarith [sq_nonneg (a - b), sq_nonneg (a - c), sq_nonneg (a - d), + sq_nonneg (b - c), sq_nonneg (b - d), sq_nonneg (c - d)] + +private theorem paired_rhsSquares_le_componentSquares + {σ K AG MG LG CG AF MF LF CF : ℝ} (hσ : 0 ≤ σ) : + σ * (AG + K * MG + K * LG + K * CG) ^ 2 + + σ⁻¹ * (AF + K * MF + K * LF + K * CF) ^ 2 + ≤ + 4 * + ((σ * AG ^ 2 + σ⁻¹ * AF ^ 2) + + K ^ 2 * (σ * MG ^ 2 + σ⁻¹ * MF ^ 2) + + K ^ 2 * (σ * LG ^ 2 + σ⁻¹ * LF ^ 2) + + K ^ 2 * (σ * CG ^ 2 + σ⁻¹ * CF ^ 2)) := by + have hσinv : 0 ≤ σ⁻¹ := inv_nonneg.mpr hσ + have hg := sq_sum_four_le_const_sum_sq AG (K * MG) (K * LG) (K * CG) + have hf := sq_sum_four_le_const_sum_sq AF (K * MF) (K * LF) (K * CF) + calc + σ * (AG + K * MG + K * LG + K * CG) ^ 2 + + σ⁻¹ * (AF + K * MF + K * LF + K * CF) ^ 2 + ≤ + σ * (4 * (AG ^ 2 + (K * MG) ^ 2 + (K * LG) ^ 2 + (K * CG) ^ 2)) + + σ⁻¹ * (4 * (AF ^ 2 + (K * MF) ^ 2 + (K * LF) ^ 2 + (K * CF) ^ 2)) := + add_le_add + (mul_le_mul_of_nonneg_left hg hσ) + (mul_le_mul_of_nonneg_left hf hσinv) + _ = + 4 * + ((σ * AG ^ 2 + σ⁻¹ * AF ^ 2) + + K ^ 2 * (σ * MG ^ 2 + σ⁻¹ * MF ^ 2) + + K ^ 2 * (σ * LG ^ 2 + σ⁻¹ * LF ^ 2) + + K ^ 2 * (σ * CG ^ 2 + σ⁻¹ * CF ^ 2)) := by ring + +private theorem integrable_specialWeakNormComponentSquareSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + Integrable (Internal.specialWeakNormComponentSquareSum hP hStruct hP4 k m e) P := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let H : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + let M : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let L : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let T : ℝ := + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + let W := Internal.specialPairedWeakNormSquare hP hStruct hP4 m e + let Z : RegCoeffField d → ℝ := fun a => + 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) + have hHigh := + integral_paired_highScaleAverageTerms_special_le_fullBlockSumAtScale + hP hstat hStruct hP4 hkm e he + have hHighInt : Integrable H P := by + simpa [H, β, s, t, p_e, q_e, p0_e, q0_e, σ] using hHigh.1 + rcases integral_paired_mismatchTermSquares_special_le_coarseFluctuationTerms_uniform + hP4.params with ⟨_Cmis, _hCmis_nonneg, hMis_all⟩ + have hMis := hMis_all hP hstat hStruct hP4 rfl hkm e + have hMInt : Integrable M P := by + simpa [M, β, s, s', t, t', p_e, q_e, σ] using hMis.1 + have hLowRaw := + integral_paired_lowScaleTailSquares_special_le_rawLowScaleTerms + hP hstat hStruct hP4 hkm e + have hLInt : Integrable L P := by + simpa [L, β, s, s', t, t', p_e, q_e, σ] using hLowRaw.1 + have hinside : + Integrable (fun a : RegCoeffField d => + ((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) P := + ((hHighInt.add (hMInt.const_mul (K ^ 2))).add + (hLInt.const_mul (K ^ 2))).add (integrable_const (K ^ 2 * T)) + unfold Internal.specialWeakNormComponentSquareSum + change + Integrable + (fun a : RegCoeffField d => + 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T)) P + simpa [mul_assoc] using hinside.const_mul 16 + +private theorem aemeasurable_specialPairedWeakNormSquares + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} (e : Vec d) : + AEMeasurable (Internal.specialPairedWeakNormSquare hP hStruct hP4 m e) P := by + classical + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + have hg := + hP.aemeasurable_canonicalScalarResponseGradientWeakNorm_cubeSet Q s p_e q_e p0_e + have hf := + hP.aemeasurable_canonicalScalarResponseFluxWeakNorm_cubeSet Q t p_e q_e q0_e + unfold Internal.specialPairedWeakNormSquare + unfold Internal.specialGradientWeakNormSquare + unfold Internal.specialFluxWeakNormSquare + simpa [gradWeak, fluxWeak, β, s, t, Q, p_e, q_e, p0_e, q0_e, σ, pow_two] using! + ((hg.mul hg).const_mul σ).add + ((hf.mul hf).const_mul σ⁻¹) + +private theorem ae_nonneg_specialPairedWeakNormSquares + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℕ} (e : Vec d) : + 0 ≤ᵐ[P] Internal.specialPairedWeakNormSquare hP hStruct hP4 m e := by + classical + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + have hσ_nonneg : 0 ≤ σ := Real.sqrt_nonneg _ + have hs_pos : 0 < s := by + dsimp [s, β] + linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4] + have ht_pos : 0 < t := by + dsimp [t, β] + linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4] + filter_upwards + [JUpperBoundWeakNorms.canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae + hP Q hs_pos p_e q_e p0_e, + JUpperBoundWeakNorms.canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae + hP Q ht_pos p_e q_e q0_e] with a hg hf + unfold Internal.specialPairedWeakNormSquare + unfold Internal.specialGradientWeakNormSquare + unfold Internal.specialFluxWeakNormSquare + simpa [gradWeak, fluxWeak, β, s, t, Q, p_e, q_e, p0_e, q0_e, σ] using + add_nonneg + (mul_nonneg hσ_nonneg (sq_nonneg _)) + (mul_nonneg (inv_nonneg.mpr hσ_nonneg) (sq_nonneg _)) + +private theorem ae_specialPairedWeakNormSquares_le_componentSquareSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) : + Internal.specialPairedWeakNormSquare hP hStruct hP4 m e + ≤ᵐ[P] Internal.specialWeakNormComponentSquareSum hP hStruct hP4 k m e := by + classical + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let s' := hP4.sLower + β + let t := hP4.sUpper + 2 * β + let t' := hP4.sUpper + β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let K := WeakNormsMaximizer.section53WeakNormMaximizerConst d + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let H : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) ^ 2 + let M : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let L : RegCoeffField d → ℝ := fun a => + σ * + (WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) ^ 2 + let T : ℝ := + σ * + (WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) ^ 2 + have hσ_nonneg : 0 ≤ σ := Real.sqrt_nonneg _ + filter_upwards [ae_paired_weakNormSquares_special_le_four_rhsSquares + hP hStruct hP4 hkm e] with a hweak + have hAlg := + paired_rhsSquares_le_componentSquares + (σ := σ) (K := K) + (AG := WeakNormsMaximizer.gradientAverageTermAtScale + (m : ℤ) (k : ℤ) s p_e q_e p0_e a) + (MG := WeakNormsMaximizer.gradientMismatchTermAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) + (LG := WeakNormsMaximizer.gradientLowScaleTailAtScale + (m : ℤ) (k : ℤ) s s' p_e q_e a) + (CG := WeakNormsMaximizer.gradientConstantTailAtScale + (m : ℤ) (k : ℤ) s p0_e) + (AF := WeakNormsMaximizer.fluxAverageTermAtScale + (m : ℤ) (k : ℤ) t p_e q_e q0_e a) + (MF := WeakNormsMaximizer.fluxMismatchTermAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) + (LF := WeakNormsMaximizer.fluxLowScaleTailAtScale + (m : ℤ) (k : ℤ) t t' p_e q_e a) + (CF := WeakNormsMaximizer.fluxConstantTailAtScale + (m : ℤ) (k : ℤ) t q0_e) hσ_nonneg + calc + Internal.specialPairedWeakNormSquare hP hStruct hP4 m e a ≤ + 4 * + (σ * + (WeakNormsMaximizer.gradientRHSAtScale K + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxRHSAtScale K + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a) ^ 2) := by + simpa [Internal.specialPairedWeakNormSquare, Internal.specialGradientWeakNormSquare, + Internal.specialFluxWeakNormSquare, gradWeak, fluxWeak, K, Q, β, s, s', t, + t', + p_e, q_e, p0_e, q0_e, σ] using hweak + _ ≤ Internal.specialWeakNormComponentSquareSum hP hStruct hP4 k m e a := by + have hAlg' : + 4 * + (σ * + (WeakNormsMaximizer.gradientRHSAtScale K + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxRHSAtScale K + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a) ^ 2) + ≤ 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) := by + dsimp [H, M, L, T, WeakNormsMaximizer.gradientRHSAtScale, + WeakNormsMaximizer.fluxRHSAtScale] + nlinarith [hAlg] + unfold Internal.specialWeakNormComponentSquareSum + change + 4 * + (σ * + (WeakNormsMaximizer.gradientRHSAtScale K + (m : ℤ) (k : ℤ) s s' p_e q_e p0_e a) ^ 2 + + σ⁻¹ * + (WeakNormsMaximizer.fluxRHSAtScale K + (m : ℤ) (k : ℤ) t t' p_e q_e q0_e a) ^ 2) + ≤ 16 * (((H a + K ^ 2 * M a) + K ^ 2 * L a) + K ^ 2 * T) + exact hAlg' + +/-- The paired special-vector weak-norm square is integrable. This is the +non-circular version: the left side is integrated by domination from the +second Section 5.3 weak-norm maximizer estimate and the already proved +component-square integrability facts. -/ +theorem integrable_paired_specialWeakNormSquares_from_weakNormMaximizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + Integrable (Internal.specialPairedWeakNormSquare hP hStruct hP4 m e) P := by + classical + let W := Internal.specialPairedWeakNormSquare hP hStruct hP4 m e + let Z := Internal.specialWeakNormComponentSquareSum hP hStruct hP4 k m e + have hZInt : Integrable Z P := by + simpa [Z] using + integrable_specialWeakNormComponentSquareSum hP hstat hStruct hP4 hkm e he + have hWAE : AEMeasurable W P := by + simpa [W] using + aemeasurable_specialPairedWeakNormSquares hP hStruct hP4 e + have hW_nonneg : 0 ≤ᵐ[P] W := by + simpa [W] using + ae_nonneg_specialPairedWeakNormSquares hP hStruct hP4 e + have hPoint : W ≤ᵐ[P] Z := by + simpa [W, Z] using + ae_specialPairedWeakNormSquares_le_componentSquareSum + hP hStruct hP4 hkm e + refine Integrable.mono' hZInt hWAE.aestronglyMeasurable ?_ + filter_upwards [hPoint, hW_nonneg] with a hle hnonneg + change ‖W a‖ ≤ Z a + rw [Real.norm_eq_abs, abs_of_nonneg hnonneg] + exact hle + +/-- Special-vector gradient weak-norm square integrability from the second +Section 5.3 weak-norm maximizer lemma. -/ +theorem integrable_specialGradientWeakNormSquare_from_weakNormMaximizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + Integrable (Internal.specialGradientWeakNormSquare hP hStruct hP4 m e) P := by + classical + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let W := Internal.specialPairedWeakNormSquare hP hStruct hP4 m e + have hσ_pos := sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hσ_ne : σ ≠ 0 := by + simpa [σ] using hσ_pos.ne' + have hσ_inv_pos : 0 < σ⁻¹ := inv_pos.mpr hσ_pos + have hWInt : + Integrable W P := by + simpa [W] using + integrable_paired_specialWeakNormSquares_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + have hAE : + AEMeasurable (Internal.specialGradientWeakNormSquare hP hStruct hP4 m e) P := by + have hg := + hP.aemeasurable_canonicalScalarResponseGradientWeakNorm_cubeSet Q s p_e q_e p0_e + unfold Internal.specialGradientWeakNormSquare + simpa [β, s, Q, p_e, q_e, p0_e, gradWeak, pow_two] using! hg.mul hg + refine Integrable.mono' (hWInt.const_mul σ⁻¹) hAE.aestronglyMeasurable ?_ + filter_upwards with a + have hle : + Internal.specialGradientWeakNormSquare hP hStruct hP4 m e a ≤ σ⁻¹ * W a := by + have hflux_nonneg : 0 ≤ σ⁻¹ * (fluxWeak a) ^ 2 := + mul_nonneg hσ_inv_pos.le (sq_nonneg _) + calc + Internal.specialGradientWeakNormSquare hP hStruct hP4 m e a = + (gradWeak a) ^ 2 := by + unfold Internal.specialGradientWeakNormSquare + simp [β, s, Q, p_e, q_e, p0_e, gradWeak] + _ = σ⁻¹ * (σ * (gradWeak a) ^ 2) := by + calc + (gradWeak a) ^ 2 = (σ⁻¹ * σ) * (gradWeak a) ^ 2 := by + rw [inv_mul_cancel₀ hσ_ne, one_mul] + _ = σ⁻¹ * (σ * (gradWeak a) ^ 2) := by ring + _ ≤ σ⁻¹ * (σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2) := by + exact mul_le_mul_of_nonneg_left (le_add_of_nonneg_right hflux_nonneg) + hσ_inv_pos.le + _ = σ⁻¹ * W a := by + have hW_eval : + W a = σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2 := by + simp [W, Internal.specialPairedWeakNormSquare, + Internal.specialGradientWeakNormSquare, Internal.specialFluxWeakNormSquare, + β, s, t, Q, p_e, q_e, p0_e, q0_e, σ, gradWeak, fluxWeak] + rw [hW_eval] + have hleft_nonneg : + 0 ≤ Internal.specialGradientWeakNormSquare hP hStruct hP4 m e a := by + unfold Internal.specialGradientWeakNormSquare + simpa [β, s, Q, p_e, q_e, p0_e, gradWeak] using sq_nonneg (gradWeak a) + have hright_nonneg : 0 ≤ σ⁻¹ * W a := hleft_nonneg.trans hle + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, abs_of_nonneg hright_nonneg] using hle + +/-- Special-vector flux weak-norm square integrability from the second +Section 5.3 weak-norm maximizer lemma. -/ +theorem integrable_specialFluxWeakNormSquare_from_weakNormMaximizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) : + Integrable (Internal.specialFluxWeakNormSquare hP hStruct hP4 m e) P := by + classical + let β := section53CoarseFluctuationBeta hP4 + let s := hP4.sLower + 2 * β + let t := hP4.sUpper + 2 * β + let Q : TriadicCube d := originCube d (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let gradWeak := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p_e q_e p0_e + let fluxWeak := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p_e q_e q0_e + let W := Internal.specialPairedWeakNormSquare hP hStruct hP4 m e + have hσ_pos := sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hσ_ne : σ ≠ 0 := by + simpa [σ] using hσ_pos.ne' + have hWInt : + Integrable W P := by + simpa [W] using + integrable_paired_specialWeakNormSquares_from_weakNormMaximizer + hP hstat hStruct hP4 hkm e he + have hAE : + AEMeasurable (Internal.specialFluxWeakNormSquare hP hStruct hP4 m e) P := by + have hf := + hP.aemeasurable_canonicalScalarResponseFluxWeakNorm_cubeSet Q t p_e q_e q0_e + unfold Internal.specialFluxWeakNormSquare + simpa [β, t, Q, p_e, q_e, q0_e, fluxWeak, pow_two] using! hf.mul hf + refine Integrable.mono' (hWInt.const_mul σ) hAE.aestronglyMeasurable ?_ + filter_upwards with a + have hgrad_nonneg : 0 ≤ σ * (gradWeak a) ^ 2 := + mul_nonneg hσ_pos.le (sq_nonneg _) + have hle : + Internal.specialFluxWeakNormSquare hP hStruct hP4 m e a ≤ σ * W a := by + calc + Internal.specialFluxWeakNormSquare hP hStruct hP4 m e a = + (fluxWeak a) ^ 2 := by + unfold Internal.specialFluxWeakNormSquare + simp [β, t, Q, p_e, q_e, q0_e, fluxWeak] + _ = σ * (σ⁻¹ * (fluxWeak a) ^ 2) := by + calc + (fluxWeak a) ^ 2 = (σ * σ⁻¹) * (fluxWeak a) ^ 2 := by + rw [mul_inv_cancel₀ hσ_ne, one_mul] + _ = σ * (σ⁻¹ * (fluxWeak a) ^ 2) := by ring + _ ≤ σ * (σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2) := by + exact mul_le_mul_of_nonneg_left (le_add_of_nonneg_left hgrad_nonneg) + hσ_pos.le + _ = σ * W a := by + have hW_eval : + W a = σ * (gradWeak a) ^ 2 + σ⁻¹ * (fluxWeak a) ^ 2 := by + simp [W, Internal.specialPairedWeakNormSquare, + Internal.specialGradientWeakNormSquare, Internal.specialFluxWeakNormSquare, + β, s, t, Q, p_e, q_e, p0_e, q0_e, σ, gradWeak, fluxWeak] + rw [hW_eval] + have hleft_nonneg : + 0 ≤ Internal.specialFluxWeakNormSquare hP hStruct hP4 m e a := by + unfold Internal.specialFluxWeakNormSquare + simpa [β, t, Q, p_e, q_e, q0_e, fluxWeak] using sq_nonneg (fluxWeak a) + have hright_nonneg : 0 ≤ σ * W a := hleft_nonneg.trans hle + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, abs_of_nonneg hright_nonneg] using hle + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/YoungRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/YoungRHS.lean new file mode 100644 index 0000000000..1b8608e7c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundCoarseFluctuations/YoungRHS.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FinalRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries + +/-! # Young RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundCoarseFluctuations + +/-! +# YoungRHS + +The standard coarse-fluctuation estimate contains the initial term +`sqrt(tau_{m,k}) * sqrt(E[J_k])`. For the flatness-rules route we need the +same theorem with this term treated by Young, yielding +`eta * E[J_k] + eta^{-1} * tau_{m,k}`. This file derives that theorem from the +already proved Section 5.3 coarse-fluctuation estimate by a scalar comparison +of right-hand sides. +-/ + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +noncomputable section + +/-- The coarse-fluctuation manuscript RHS with the initial square-root term +replaced by its Young envelope. -/ +noncomputable def coarseFluctuationYoungManuscriptRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C ε η : ℝ) (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let scalarWeight := coarseFluctuationScalarWeightAtScale hP hStruct m + let fluctuationSum := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let tauSum := coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let unitMomentWeight := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let responseMoment := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + C * + (η * Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e + + η⁻¹ * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) + + C * ε * (Real.sqrt θ - 1) ^ 2 + + C * ε⁻¹ * β⁻¹ * θ * fluctuationSum + + C * ε⁻¹ * (β ^ 2)⁻¹ * scalarWeight * tauSum + + C * (hP4.xi : ℝ) * ε⁻¹ * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + unitMomentWeight * responseMoment + + C * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * ((m - k : ℕ) : ℝ)) * + scalarWeight * (θ - 1) + +private theorem sqrt_mul_sqrt_le_young + {x y η : ℝ} (hx : 0 ≤ x) (hy : 0 ≤ y) (hη : 0 < η) : + Real.sqrt x * Real.sqrt y ≤ + (η * y + η⁻¹ * x) / 2 := by + have hyoung := + two_mul_le_add_mul_sq (a := Real.sqrt y) (b := Real.sqrt x) hη + have hx_sq : (Real.sqrt x) ^ (2 : ℕ) = x := by + simpa [pow_two] using Real.sq_sqrt hx + have hy_sq : (Real.sqrt y) ^ (2 : ℕ) = y := by + simpa [pow_two] using Real.sq_sqrt hy + have htwice : + 2 * (Real.sqrt x * Real.sqrt y) ≤ η * y + η⁻¹ * x := by + simpa [mul_assoc, mul_left_comm, mul_comm, hx_sq, hy_sq] using hyoung + linarith + +private theorem expectedResponseJCubeSet_nonneg + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (Q : TriadicCube d) (p q : Vec d) : + 0 ≤ Ch04.expectedResponseJCubeSet P Q p q := by + dsimp [Ch04.expectedResponseJCubeSet] + exact integral_nonneg fun a => Ch04.restrictionResponseJObservableCubeSet_nonneg Q p q a + +/-- Scalar comparison of the standard Section 5.3 coarse-fluctuation RHS with +the Young-envelope RHS. -/ +theorem coarseFluctuationManuscriptRHSAtScale_le_youngManuscriptRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C ε η : ℝ} (hC : 0 ≤ C) (hη : 0 < η) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) : + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε k m e ≤ + coarseFluctuationYoungManuscriptRHSAtScale hP hStruct hP4 C ε η k m e := by + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hk_nonneg : 0 ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm_int hR hBlockK + have htau : + 0 ≤ tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm_int p_e q_e hBlockM hDescBlock + have hresponse : + 0 ≤ Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e := + expectedResponseJCubeSet_nonneg P (originCube d (k : ℤ)) p_e q_e + let T := + Real.sqrt (tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + let Y := + η * Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e + + η⁻¹ * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + have hTY : 2 * T ≤ Y := by + have h := + sqrt_mul_sqrt_le_young + (x := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) + (y := Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e) + htau hresponse hη + have hmul := mul_le_mul_of_nonneg_left h (by norm_num : (0 : ℝ) ≤ 2) + calc + 2 * T ≤ 2 * (Y / 2) := by + simpa [T, Y, mul_assoc, mul_left_comm, mul_comm] using hmul + _ = Y := by ring + have hT_nonneg : 0 ≤ T := by + dsimp [T] + exact mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + have hfirst : + C * T ≤ C * Y := by + exact mul_le_mul_of_nonneg_left (by nlinarith [hTY, hT_nonneg]) hC + unfold coarseFluctuationManuscriptRHSAtScale + unfold coarseFluctuationYoungManuscriptRHSAtScale + dsimp only + nlinarith [hfirst] + +/-- Section 5.3 coarse-fluctuation bound with the initial square-root term +replaced by the Young envelope. -/ +theorem JUpperBoundCoarseFluctuations_young_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {k m : ℕ}, k < m → ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ε η : ℝ}, 0 < ε → ε ≤ 1 → 0 < η → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e ≤ + coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C ε η k m e := by + rcases JUpperBoundCoarseFluctuations_homogenizationScale params with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hstat hStruct hP4 hparams k m hkm e he ε η hε hε_le hη + have hstandard := + hC hP hstat hStruct hP4 hparams hkm e he hε hε_le + have hcompare := + coarseFluctuationManuscriptRHSAtScale_le_youngManuscriptRHSAtScale + hP hstat hStruct hP4 (C := C) (ε := ε) (η := η) + hC_nonneg hη (k := k) (m := m) hkm.le e + exact hstandard.trans hcompare + +end + +end JUpperBoundCoarseFluctuations +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms.lean new file mode 100644 index 0000000000..2779773704 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.YoungRHS + +/-! # JUpper Bound Weak Norms -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 + +/-! +# Upper bound for `J` by weak norms + +Top-level module for the first manuscript lemma in Section 5.3. The proof is +split under `Section53/JUpperBoundWeakNorms/`; this file is the stable import +surface for the lemma. +-/ + +open MeasureTheory + +open scoped ENNReal BigOperators + +noncomputable section + +/-- First manuscript lemma of Section 5.3, in its note-facing form up to the +finite-RHS inputs supplied by the scalar maximizer weak-norm lemma. The two +integrability hypotheses say exactly that the scaled gradient and flux weak-norm +square expectations appearing on the right-hand side are finite. -/ +theorem JUpperBoundWeakNorms_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (p q p0 q0 : Vec d) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + JUpperBoundWeakNorms.jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + (1 + JUpperBoundWeakNorms.section53CutoffBound Q) + (JUpperBoundWeakNorms.section53CutoffOscillationConstant Q) + (JUpperBoundWeakNorms.section53CutoffScaleSep Q j) + (JUpperBoundWeakNorms.section53CutoffDualBound Q s) + (JUpperBoundWeakNorms.section53CutoffDualBound Q t) + (JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t) + p q p0 q0 := by + exact + JUpperBoundWeakNorms.expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_normalizedCutoff_of_P4 + hP hstat hStruct hP4 hk_nonneg hkm hs hs_lt_one ht hst p q p0 q0 + hGradSq hFluxSq + +/-- First Section 5.3 lemma with the additivity term treated by Young rather +than by Cauchy in probability. This is the surface used by the flatness-rules +route: the RHS contains `eta * E[J_k] + eta^{-1} * tau_{m,k}` instead of +`sqrt(tau_{m,k}) * sqrt(E[J_k])`. -/ +theorem JUpperBoundWeakNorms_young_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (p q p0 q0 : Vec d) {η : ℝ} (hη : 0 < η) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + JUpperBoundWeakNorms.jUpperWeakNormYoungManuscriptExpectedRHSAtScale P m k s t + (1 + JUpperBoundWeakNorms.section53CutoffBound Q) + (JUpperBoundWeakNorms.section53CutoffOscillationConstant Q) + (JUpperBoundWeakNorms.section53CutoffScaleSep Q j) + (JUpperBoundWeakNorms.section53CutoffDualBound Q s) + (JUpperBoundWeakNorms.section53CutoffDualBound Q t) + (JUpperBoundWeakNorms.section53CutoffProductCoeff Q s t) + η p q p0 q0 := by + exact + JUpperBoundWeakNorms.expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormYoungManuscriptExpectedRHSAtScale_of_normalizedCutoff_of_P4 + hP hstat hStruct hP4 hk_nonneg hkm hs hs_lt_one ht hst p q p0 q0 hη + hGradSq hFluxSq + +end + +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity.lean new file mode 100644 index 0000000000..1eb0e65141 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.AnalyticInequalities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.CrossTerm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.Densities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.ParentRestriction + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/AnalyticInequalities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/AnalyticInequalities.lean new file mode 100644 index 0000000000..669c266e45 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/AnalyticInequalities.lean @@ -0,0 +1,384 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.ParentRestriction + +/-! # Analytic Inequalities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# AdditivityAnalyticInequalities + +Finite-measure Cauchy inequalities for the additivity-cross term. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- The local sum half-energy density is locally integrable. -/ +theorem additivitySumHalfEnergyDensityOnFamilyOnCube_integrableOn + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + IntegrableOn (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q) + (cubeSet R) volume := by + let : IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + let : Fact (volume (cubeSet R) < ⊤) := ⟨volume_cubeSet_lt_top R⟩ + change IsFiniteMeasure (volume.restrict (cubeSet R)) + infer_instance + let topGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q + let childGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q + let coeff : CoeffField d := (a.coeffOn R).toCoeffField + have hTop : MemVectorL2 (cubeSet R) topGrad := by + simpa [topGrad, canonicalMaximizerGradientOnCube] using! + (Ch03.publicH1ToCubeSet_grad_memVectorL2_descendant_cubeSet + (Q := Q) (R := R) (j := j) + (canonicalMaximizerSolutionOnCube Q (a.coeffOn Q) p q).toH1 hR) + have hChild : MemVectorL2 (cubeSet R) childGrad := by + have h := + (Ch03.publicH1ToCubeSet + (Q := R) (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q).toH1).grad_memVectorL2 + simpa [childGrad, canonicalMaximizerGradientOnCube, Ch03.publicH1ToCubeSet_grad] using! h + have hSumGrad : MemVectorL2 (cubeSet R) (fun x => topGrad x + childGrad x) := by + simpa using! hTop.add hChild + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) coeff := by + simpa [coeff, Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) coeff := + hEllOpen.cubeSet_of_openCubeSet + have hSymmSum : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (symmPart (coeff x)) (topGrad x + childGrad x)) := + IsAEEllipticFieldOn.memVectorL2_matVecMul_symmPart hEll hSumGrad + have hQuad : + IntegrableOn + (fun x => vecDot (topGrad x + childGrad x) + (matVecMul (symmPart (coeff x)) (topGrad x + childGrad x))) + (cubeSet R) volume := + integrableOn_vecDot_of_memVectorL2 hSumGrad hSymmSum + show IntegrableOn + (fun x => + (1 / 2 : ℝ) * + vecDot + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x))) + (cubeSet R) volume + simpa [additivitySumHalfEnergyDensityOnFamilyOnCube, topGrad, childGrad, coeff] using! + hQuad.const_mul (1 / 2 : ℝ) + +/-- An integrable nonnegative scalar density has a square root in normalized +`L²`. -/ +theorem memLp_sqrt_two_of_integrable_of_ae_nonneg + {α : Type*} [MeasurableSpace α] {μ : Measure α} {f : α → ℝ} + (hf_int : Integrable f μ) (hf_nonneg : 0 ≤ᵐ[μ] f) : + MemLp (fun x => Real.sqrt (f x)) (2 : ℝ≥0∞) μ := by + let sqrtF : α → ℝ := fun x => Real.sqrt (f x) + have hf_mem_one : MemLp f 1 μ := + memLp_one_iff_integrable.mpr hf_int + have hsqrt_meas : AEStronglyMeasurable sqrtF μ := + hf_int.aestronglyMeasurable.aemeasurable.sqrt.aestronglyMeasurable + have hnorm_sq_ae : + (fun x => ‖sqrtF x‖ ^ (2 : ℝ)) =ᵐ[μ] f := by + filter_upwards [hf_nonneg] with x hx + have hnorm : ‖sqrtF x‖ = Real.sqrt (f x) := by + simp [sqrtF, Real.norm_eq_abs, abs_of_nonneg (Real.sqrt_nonneg _)] + rw [hnorm] + simpa [Real.rpow_natCast] using Real.sq_sqrt hx + have hnorm_sq_mem_one : + MemLp (fun x => ‖sqrtF x‖ ^ (2 : ℝ)) 1 μ := + (memLp_congr_ae hnorm_sq_ae).2 hf_mem_one + have hnorm_sq_mem_div : + MemLp (fun x => ‖sqrtF x‖ ^ (2 : ℝ)) + ((2 : ℝ≥0∞) / (2 : ℝ≥0∞)) μ := by + have hdiv : ((2 : ℝ≥0∞) / (2 : ℝ≥0∞)) = 1 := + ENNReal.div_self (by norm_num) (by norm_num) + rw [hdiv] + exact hnorm_sq_mem_one + have hiff := + memLp_norm_rpow_iff + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) + (f := sqrtF) (μ := μ) hsqrt_meas + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by norm_num : (2 : ℝ≥0∞) ≠ ∞) + simpa [sqrtF] using hiff.mp hnorm_sq_mem_div + +/-- Cauchy-Schwarz for square roots of nonnegative integrable scalar +observables, in the form used by the stochastic additivity term. -/ +theorem integral_sqrt_mul_sqrt_le_sqrt_integral_mul_sqrt_integral + {α : Type*} [MeasurableSpace α] {μ : Measure α} {A B : α → ℝ} + (hA_int : Integrable A μ) (hB_int : Integrable B μ) + (hA_nonneg : 0 ≤ᵐ[μ] A) (hB_nonneg : 0 ≤ᵐ[μ] B) : + ∫ x, Real.sqrt (A x) * Real.sqrt (B x) ∂μ ≤ + Real.sqrt (∫ x, A x ∂μ) * Real.sqrt (∫ x, B x ∂μ) := by + let sqrtA : α → ℝ := fun x => Real.sqrt (A x) + let sqrtB : α → ℝ := fun x => Real.sqrt (B x) + have hSqrtA_mem : + MemLp sqrtA (ENNReal.ofReal (2 : ℝ)) μ := by + simpa [sqrtA] using + memLp_sqrt_two_of_integrable_of_ae_nonneg hA_int hA_nonneg + have hSqrtB_mem : + MemLp sqrtB (ENNReal.ofReal (2 : ℝ)) μ := by + simpa [sqrtB] using + memLp_sqrt_two_of_integrable_of_ae_nonneg hB_int hB_nonneg + have hSqrtA_nonneg : 0 ≤ᵐ[μ] sqrtA := by + filter_upwards with x + exact Real.sqrt_nonneg _ + have hSqrtB_nonneg : 0 ≤ᵐ[μ] sqrtB := by + filter_upwards with x + exact Real.sqrt_nonneg _ + have hHolder : + ∫ x, sqrtA x * sqrtB x ∂μ ≤ + (∫ x, sqrtA x ^ (2 : ℝ) ∂μ) ^ (1 / (2 : ℝ)) * + (∫ x, sqrtB x ^ (2 : ℝ) ∂μ) ^ (1 / (2 : ℝ)) := + integral_mul_le_Lp_mul_Lq_of_nonneg Real.HolderConjugate.two_two + hSqrtA_nonneg hSqrtB_nonneg hSqrtA_mem hSqrtB_mem + have hA_sq : + (∫ x, sqrtA x ^ (2 : ℝ) ∂μ) = ∫ x, A x ∂μ := by + refine integral_congr_ae ?_ + filter_upwards [hA_nonneg] with x hx + simpa [sqrtA, Real.rpow_natCast] using Real.sq_sqrt hx + have hB_sq : + (∫ x, sqrtB x ^ (2 : ℝ) ∂μ) = ∫ x, B x ∂μ := by + refine integral_congr_ae ?_ + filter_upwards [hB_nonneg] with x hx + simpa [sqrtB, Real.rpow_natCast] using Real.sq_sqrt hx + calc + ∫ x, Real.sqrt (A x) * Real.sqrt (B x) ∂μ + = ∫ x, sqrtA x * sqrtB x ∂μ := by rfl + _ ≤ + (∫ x, sqrtA x ^ (2 : ℝ) ∂μ) ^ (1 / (2 : ℝ)) * + (∫ x, sqrtB x ^ (2 : ℝ) ∂μ) ^ (1 / (2 : ℝ)) := hHolder + _ = + Real.sqrt (∫ x, A x ∂μ) * Real.sqrt (∫ x, B x ∂μ) := by + rw [hA_sq, hB_sq, ← Real.sqrt_eq_rpow, ← Real.sqrt_eq_rpow] + +/-- Integrability companion to the square-root Cauchy estimate. -/ +theorem integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + {α : Type*} [MeasurableSpace α] {μ : Measure α} [IsFiniteMeasure μ] + {A B : α → ℝ} + (hA_int : Integrable A μ) (hB_int : Integrable B μ) + (hA_nonneg : 0 ≤ᵐ[μ] A) (hB_nonneg : 0 ≤ᵐ[μ] B) : + Integrable (fun x => Real.sqrt (A x) * Real.sqrt (B x)) μ := by + let sqrtA : α → ℝ := fun x => Real.sqrt (A x) + let sqrtB : α → ℝ := fun x => Real.sqrt (B x) + have hSqrtA_mem : + MemLp sqrtA (2 : ℝ≥0∞) μ := by + simpa [sqrtA] using + memLp_sqrt_two_of_integrable_of_ae_nonneg hA_int hA_nonneg + have hSqrtB_mem : + MemLp sqrtB (2 : ℝ≥0∞) μ := by + simpa [sqrtB] using + memLp_sqrt_two_of_integrable_of_ae_nonneg hB_int hB_nonneg + have : ENNReal.HolderTriple (2 : ℝ≥0∞) (2 : ℝ≥0∞) (1 : ℝ≥0∞) := by + infer_instance + have hProd_mem : MemLp (fun x => sqrtA x * sqrtB x) 1 μ := by + simpa [sqrtA, sqrtB] using! hSqrtB_mem.mul hSqrtA_mem + simpa [sqrtA, sqrtB] using hProd_mem.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 1) + +/-- Integrability of a nonnegative product from square integrability of both +factors. -/ +theorem integrable_mul_of_integrable_sq_of_ae_nonneg + {α : Type*} [MeasurableSpace α] {μ : Measure α} [IsFiniteMeasure μ] + {X Y : α → ℝ} + (hX_sq : Integrable (fun x => (X x) ^ 2) μ) + (hY_sq : Integrable (fun x => (Y x) ^ 2) μ) + (hX_nonneg : 0 ≤ᵐ[μ] X) (hY_nonneg : 0 ≤ᵐ[μ] Y) : + Integrable (fun x => X x * Y x) μ := by + have hsqrt : + Integrable + (fun x => Real.sqrt ((X x) ^ 2) * Real.sqrt ((Y x) ^ 2)) μ := + integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + (A := fun x => (X x) ^ 2) (B := fun x => (Y x) ^ 2) + hX_sq hY_sq + (by filter_upwards with x; exact sq_nonneg (X x)) + (by filter_upwards with x; exact sq_nonneg (Y x)) + refine hsqrt.congr ?_ + filter_upwards [hX_nonneg, hY_nonneg] with x hx hy + rw [Real.sqrt_sq_eq_abs, Real.sqrt_sq_eq_abs, abs_of_nonneg hx, abs_of_nonneg hy] + +/-- Cauchy-Schwarz in the form needed for the manuscript product of the two +scaled weak norms. -/ +theorem integral_mul_le_sqrt_integral_sq_mul_sqrt_integral_sq_of_ae_nonneg + {α : Type*} [MeasurableSpace α] {μ : Measure α} [IsFiniteMeasure μ] + {X Y : α → ℝ} + (hX_sq : Integrable (fun x => (X x) ^ 2) μ) + (hY_sq : Integrable (fun x => (Y x) ^ 2) μ) + (hX_nonneg : 0 ≤ᵐ[μ] X) (hY_nonneg : 0 ≤ᵐ[μ] Y) : + ∫ x, X x * Y x ∂μ ≤ + Real.sqrt (∫ x, (X x) ^ 2 ∂μ) * + Real.sqrt (∫ x, (Y x) ^ 2 ∂μ) := by + have hsqrt := + integral_sqrt_mul_sqrt_le_sqrt_integral_mul_sqrt_integral + (μ := μ) (A := fun x => (X x) ^ 2) (B := fun x => (Y x) ^ 2) + hX_sq hY_sq + (by filter_upwards with x; exact sq_nonneg (X x)) + (by filter_upwards with x; exact sq_nonneg (Y x)) + have hleft : + ∫ x, X x * Y x ∂μ = + ∫ x, Real.sqrt ((X x) ^ 2) * Real.sqrt ((Y x) ^ 2) ∂μ := by + refine integral_congr_ae ?_ + filter_upwards [hX_nonneg, hY_nonneg] with x hx hy + rw [Real.sqrt_sq_eq_abs, Real.sqrt_sq_eq_abs, abs_of_nonneg hx, abs_of_nonneg hy] + simpa [hleft] using hsqrt + +/-- If `|F| ≤ sqrt A sqrt B` a.e. on a normalized cube, then the cube average +of `F` is bounded by the square roots of the cube averages of `A` and `B`. -/ +theorem abs_cubeAverage_le_sqrt_cubeAverage_mul_sqrt_cubeAverage_of_ae_abs_le_sqrt_mul_sqrt + {d : ℕ} (Q : TriadicCube d) {F A B : Vec d → ℝ} + (hF_int : Integrable F (normalizedCubeMeasure Q)) + (hA_nonneg : 0 ≤ᵐ[normalizedCubeMeasure Q] A) + (hB_nonneg : 0 ≤ᵐ[normalizedCubeMeasure Q] B) + (hSqrtA_mem : + MemLp (fun x => Real.sqrt (A x)) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hSqrtB_mem : + MemLp (fun x => Real.sqrt (B x)) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hPoint : + ∀ᵐ x ∂ normalizedCubeMeasure Q, + |F x| ≤ Real.sqrt (A x) * Real.sqrt (B x)) : + |cubeAverage Q F| ≤ + Real.sqrt (cubeAverage Q A) * Real.sqrt (cubeAverage Q B) := by + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let sqrtA : Vec d → ℝ := fun x => Real.sqrt (A x) + let sqrtB : Vec d → ℝ := fun x => Real.sqrt (B x) + have hProd_nonneg : 0 ≤ᵐ[μ] fun x => sqrtA x * sqrtB x := by + filter_upwards with x + exact mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + have : ENNReal.HolderTriple (2 : ℝ≥0∞) (2 : ℝ≥0∞) (1 : ℝ≥0∞) := by + infer_instance + have hProd_mem : MemLp (fun x => sqrtA x * sqrtB x) 1 μ := by + simpa [μ, sqrtA, sqrtB] using! hSqrtB_mem.mul hSqrtA_mem + have hProd_int : Integrable (fun x => sqrtA x * sqrtB x) μ := + hProd_mem.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 1) + have hAbs_le : + (fun x => |F x|) ≤ᵐ[μ] fun x => sqrtA x * sqrtB x := by + simpa [μ, sqrtA, sqrtB] using! hPoint + have hInt_abs_le : + ∫ x, |F x| ∂μ ≤ ∫ x, sqrtA x * sqrtB x ∂μ := + integral_mono_ae hF_int.norm hProd_int hAbs_le + have hProd_avg_nonneg : + 0 ≤ cubeAverage Q (fun x => sqrtA x * sqrtB x) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact integral_nonneg_of_ae (by simpa [μ] using hProd_nonneg) + have hHolder : + |cubeAverage Q (fun x => sqrtA x * sqrtB x)| ≤ + cubeLpNorm Q (2 : ℝ≥0∞) sqrtA * + cubeLpNorm Q (2 : ℝ≥0∞) sqrtB := by + let : ENNReal.HolderConjugate (2 : ℝ≥0∞) (2 : ℝ≥0∞) := by + infer_instance + exact + abs_cubeAverage_mul_le_mul_cubeLpNorm_of_holderConjugate + Q (2 : ℝ≥0∞) (2 : ℝ≥0∞) sqrtA sqrtB + (by simpa [sqrtA] using hSqrtA_mem) + (by simpa [sqrtB] using hSqrtB_mem) + have hAavg_nonneg : 0 ≤ cubeAverage Q A := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact integral_nonneg_of_ae hA_nonneg + have hBavg_nonneg : 0 ≤ cubeAverage Q B := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact integral_nonneg_of_ae hB_nonneg + have hSqrtA_norm : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtA = Real.sqrt (cubeAverage Q A) := by + have hp0 : (2 : ℝ≥0∞) ≠ 0 := by norm_num + have hpTop : (2 : ℝ≥0∞) ≠ ∞ := by norm_num + have hpow := + cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := sqrtA) hp0 hpTop + (by simpa [sqrtA] using hSqrtA_mem) + have hpow_two : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtA ^ (2 : ℝ) = + cubeAverage Q (fun x => ‖sqrtA x‖ ^ (2 : ℝ)) := by + simpa using hpow + have havg_norm : + cubeAverage Q (fun x => ‖sqrtA x‖ ^ (2 : ℝ)) = + cubeAverage Q A := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + refine integral_congr_ae ?_ + filter_upwards [hA_nonneg] with x hx + have hsqrt_abs : ‖sqrtA x‖ = Real.sqrt (A x) := by + simp [sqrtA, Real.norm_eq_abs, abs_of_nonneg (Real.sqrt_nonneg _)] + rw [hsqrt_abs] + simpa [Real.rpow_natCast] using Real.sq_sqrt hx + have hsq : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtA ^ 2 = cubeAverage Q A := by + simpa [Real.rpow_natCast] using hpow_two.trans havg_norm + symm + rw [Real.sqrt_eq_iff_eq_sq hAavg_nonneg + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) sqrtA)] + exact hsq.symm + have hSqrtB_norm : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtB = Real.sqrt (cubeAverage Q B) := by + have hp0 : (2 : ℝ≥0∞) ≠ 0 := by norm_num + have hpTop : (2 : ℝ≥0∞) ≠ ∞ := by norm_num + have hpow := + cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := sqrtB) hp0 hpTop + (by simpa [sqrtB] using hSqrtB_mem) + have hpow_two : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtB ^ (2 : ℝ) = + cubeAverage Q (fun x => ‖sqrtB x‖ ^ (2 : ℝ)) := by + simpa using hpow + have havg_norm : + cubeAverage Q (fun x => ‖sqrtB x‖ ^ (2 : ℝ)) = + cubeAverage Q B := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + refine integral_congr_ae ?_ + filter_upwards [hB_nonneg] with x hx + have hsqrt_abs : ‖sqrtB x‖ = Real.sqrt (B x) := by + simp [sqrtB, Real.norm_eq_abs, abs_of_nonneg (Real.sqrt_nonneg _)] + rw [hsqrt_abs] + simpa [Real.rpow_natCast] using Real.sq_sqrt hx + have hsq : + cubeLpNorm Q (2 : ℝ≥0∞) sqrtB ^ 2 = cubeAverage Q B := by + simpa [Real.rpow_natCast] using hpow_two.trans havg_norm + symm + rw [Real.sqrt_eq_iff_eq_sq hBavg_nonneg + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) sqrtB)] + exact hsq.symm + calc + |cubeAverage Q F| + = |∫ x, F x ∂μ| := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ ≤ ∫ x, |F x| ∂μ := abs_integral_le_integral_abs + _ ≤ ∫ x, sqrtA x * sqrtB x ∂μ := hInt_abs_le + _ = cubeAverage Q (fun x => sqrtA x * sqrtB x) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = |cubeAverage Q (fun x => sqrtA x * sqrtB x)| := by + rw [abs_of_nonneg hProd_avg_nonneg] + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) sqrtA * + cubeLpNorm Q (2 : ℝ≥0∞) sqrtB := hHolder + _ = Real.sqrt (cubeAverage Q A) * Real.sqrt (cubeAverage Q B) := by + rw [hSqrtA_norm, hSqrtB_norm] + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/CrossTerm.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/CrossTerm.lean new file mode 100644 index 0000000000..6953b74f4f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/CrossTerm.lean @@ -0,0 +1,738 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.AnalyticInequalities + +/-! # Cross Term -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# AdditivityCrossTerm + +Averaged additivity-cross estimates. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- One-child additivity-cross Cauchy estimate with local obligations +discharged. -/ +theorem abs_cubeAverage_childAdditivityCrossDensityOnFamilyOnCube_le_sqrt_diff_avg_mul_sqrt_sum_avg_of_descendant + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + |cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q)| ≤ + Real.sqrt + (cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q)) * + Real.sqrt + (cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q)) := by + let F : Vec d → ℝ := childAdditivityCrossDensityOnFamilyOnCube a Q R p q + let A : Vec d → ℝ := additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q + let B : Vec d → ℝ := additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q + have hF_int : Integrable F (normalizedCubeMeasure R) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R + (by simpa [F] using + childAdditivityCrossDensityOnFamilyOnCube_integrableOn a Q hR p q) + have hA_int : Integrable A (normalizedCubeMeasure R) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R + (by simpa [A] using + additivityDiffHalfEnergyDensityOnFamilyOnCube_integrableOn a Q hR p q) + have hB_int : Integrable B (normalizedCubeMeasure R) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R + (by simpa [B] using + additivitySumHalfEnergyDensityOnFamilyOnCube_integrableOn a Q hR p q) + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) (a.coeffOn R).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) (a.coeffOn R).toCoeffField := + hEllOpen.cubeSet_of_openCubeSet + have hEll_norm : + ∀ᵐ x ∂ normalizedCubeMeasure R, + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) := by + change + ∀ᵐ x ∂ ENNReal.ofReal ((cubeVolume R)⁻¹) • volume.restrict (cubeSet R), + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) + exact ae_smul_measure + (by simpa [volumeMeasureOn] using hEll.ae_isEllipticMatrix) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + have hA_nonneg : 0 ≤ᵐ[normalizedCubeMeasure R] A := by + filter_upwards [hEll_norm] with x hx + simpa [A] using + additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + a Q R p q x hx + have hB_nonneg : 0 ≤ᵐ[normalizedCubeMeasure R] B := by + filter_upwards [hEll_norm] with x hx + simpa [B] using + additivitySumHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + a Q R p q x hx + have hSqrtA_mem : + MemLp (fun x => Real.sqrt (A x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + memLp_sqrt_two_of_integrable_of_ae_nonneg hA_int hA_nonneg + have hSqrtB_mem : + MemLp (fun x => Real.sqrt (B x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure R) := + memLp_sqrt_two_of_integrable_of_ae_nonneg hB_int hB_nonneg + have hPoint : + ∀ᵐ x ∂ normalizedCubeMeasure R, + |F x| ≤ Real.sqrt (A x) * Real.sqrt (B x) := by + filter_upwards [hEll_norm] with x hx + simpa [F, A, B] using + abs_childAdditivityCrossDensityOnFamilyOnCube_le_sqrt_diff_mul_sqrt_sum_of_isEllipticMatrix + a Q R p q x hx + simpa [F, A, B] using + abs_cubeAverage_le_sqrt_cubeAverage_mul_sqrt_cubeAverage_of_ae_abs_le_sqrt_mul_sqrt + R hF_int hA_nonneg hB_nonneg hSqrtA_mem hSqrtB_mem hPoint + +/-- Child-energy replacement with the concrete additivity-cross density. -/ +theorem cubeAverage_topHalfEnergyOnFamily_eq_childAdditivityCross_add_responseJOnChild + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) + (hCoeff : (a.coeffOn Q).toCoeffField = (a.coeffOn R).toCoeffField) + (hCross_int : + IntegrableOn (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + (cubeSet R) volume) : + cubeAverage R (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) = + cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q := by + let childEnergy : Vec d → ℝ := + topHalfEnergyDensityOnCube R (a.coeffOn R) p q + have hChildEnergy_int : + IntegrableOn childEnergy (cubeSet R) volume := by + simpa [childEnergy] using + topHalfEnergyDensityOnCube_integrableOn_cubeSet R (a.coeffOn R) p q + have hPoint : + topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q = + fun x => childAdditivityCrossDensityOnFamilyOnCube a Q R p q x + + childEnergy x := by + funext x + have hquad := + half_quad_eq_additivity_cross_add_half_quad + ((a.coeffOn R).toCoeffField x) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x) + (canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + simpa [topHalfEnergyDensityOnCube, childAdditivityCrossDensityOnFamilyOnCube, + childEnergy, Ch02.variationEnergyIntegrand, canonicalMaximizerGradientOnCube, + hCoeff] using hquad + rw [hPoint] + rw [cubeAverage_add_of_integrableOn R + (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + childEnergy hCross_int hChildEnergy_int] + rw [← responseJOnCube_eq_cubeAverage_topHalfEnergy R (a.coeffOn R) p q] + +/-- Averaged finite Cauchy for nonnegative scalar data. -/ +theorem finset_average_sqrt_mul_sqrt_le_sqrt_average_mul_sqrt_average + {ι : Type*} [DecidableEq ι] (S : Finset ι) (hS : S.Nonempty) + (A B : ι → ℝ) + (hA : ∀ i, 0 ≤ A i) (hB : ∀ i, 0 ≤ B i) : + (S.card : ℝ)⁻¹ * (∑ i ∈ S, Real.sqrt (A i) * Real.sqrt (B i)) ≤ + Real.sqrt ((S.card : ℝ)⁻¹ * (∑ i ∈ S, A i)) * + Real.sqrt ((S.card : ℝ)⁻¹ * (∑ i ∈ S, B i)) := by + let invN : ℝ := (S.card : ℝ)⁻¹ + have hcard_pos_nat : 0 < S.card := Finset.card_pos.mpr hS + have hcard_pos : 0 < (S.card : ℝ) := Nat.cast_pos.mpr hcard_pos_nat + have hinv_nonneg : 0 ≤ invN := inv_nonneg.mpr hcard_pos.le + have hCauchy : + (∑ i ∈ S, Real.sqrt (A i) * Real.sqrt (B i)) ≤ + Real.sqrt (∑ i ∈ S, A i) * Real.sqrt (∑ i ∈ S, B i) := + Real.sum_sqrt_mul_sqrt_le (s := S) (f := A) (g := B) hA hB + have hScale : + invN * (Real.sqrt (∑ i ∈ S, A i) * Real.sqrt (∑ i ∈ S, B i)) = + Real.sqrt (invN * (∑ i ∈ S, A i)) * + Real.sqrt (invN * (∑ i ∈ S, B i)) := by + rw [Real.sqrt_mul hinv_nonneg, Real.sqrt_mul hinv_nonneg] + rw [show + invN * (Real.sqrt (∑ i ∈ S, A i) * Real.sqrt (∑ i ∈ S, B i)) = + (Real.sqrt invN * Real.sqrt invN) * + (Real.sqrt (∑ i ∈ S, A i) * Real.sqrt (∑ i ∈ S, B i)) by + rw [← sq, Real.sq_sqrt hinv_nonneg]] + ring + calc + invN * (∑ i ∈ S, Real.sqrt (A i) * Real.sqrt (B i)) + ≤ invN * (Real.sqrt (∑ i ∈ S, A i) * Real.sqrt (∑ i ∈ S, B i)) := by + exact mul_le_mul_of_nonneg_left hCauchy hinv_nonneg + _ = + Real.sqrt (invN * (∑ i ∈ S, A i)) * + Real.sqrt (invN * (∑ i ∈ S, B i)) := hScale + +/-- Finite averaged Cauchy after a pointwise absolute-value estimate. -/ +theorem abs_finset_average_le_const_mul_sqrt_average_mul_sqrt_average_of_abs_le + {ι : Type*} [DecidableEq ι] (S : Finset ι) (hS : S.Nonempty) + {C : ℝ} (A B X : ι → ℝ) + (hC : 0 ≤ C) + (hA : ∀ i, 0 ≤ A i) (hB : ∀ i, 0 ≤ B i) + (hX : ∀ i, |X i| ≤ C * (Real.sqrt (A i) * Real.sqrt (B i))) : + |(S.card : ℝ)⁻¹ * (∑ i ∈ S, X i)| ≤ + C * + (Real.sqrt ((S.card : ℝ)⁻¹ * (∑ i ∈ S, A i)) * + Real.sqrt ((S.card : ℝ)⁻¹ * (∑ i ∈ S, B i))) := by + let invN : ℝ := (S.card : ℝ)⁻¹ + have hcard_pos_nat : 0 < S.card := Finset.card_pos.mpr hS + have hcard_pos : 0 < (S.card : ℝ) := Nat.cast_pos.mpr hcard_pos_nat + have hinv_nonneg : 0 ≤ invN := inv_nonneg.mpr hcard_pos.le + have hAbsSum : + |∑ i ∈ S, X i| ≤ ∑ i ∈ S, |X i| := + Finset.abs_sum_le_sum_abs (s := S) (f := X) + have hTerm : + ∑ i ∈ S, |X i| ≤ + ∑ i ∈ S, C * (Real.sqrt (A i) * Real.sqrt (B i)) := + Finset.sum_le_sum fun i _ => hX i + have hAvgCauchy := + finset_average_sqrt_mul_sqrt_le_sqrt_average_mul_sqrt_average + S hS A B hA hB + calc + |invN * (∑ i ∈ S, X i)| + = invN * |∑ i ∈ S, X i| := by + rw [abs_mul, abs_of_nonneg hinv_nonneg] + _ ≤ invN * (∑ i ∈ S, |X i|) := by + exact mul_le_mul_of_nonneg_left hAbsSum hinv_nonneg + _ ≤ invN * (∑ i ∈ S, C * (Real.sqrt (A i) * Real.sqrt (B i))) := by + exact mul_le_mul_of_nonneg_left hTerm hinv_nonneg + _ = C * (invN * (∑ i ∈ S, Real.sqrt (A i) * Real.sqrt (B i))) := by + rw [← Finset.mul_sum] + ring + _ ≤ + C * + (Real.sqrt (invN * (∑ i ∈ S, A i)) * + Real.sqrt (invN * (∑ i ∈ S, B i))) := by + exact mul_le_mul_of_nonneg_left hAvgCauchy hC + +/-- Descendant response subadditivity for the raw scalar response. -/ +theorem responseJOnCube_le_childResponseJAverageOnFamilyAtDepth + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + Ch02.responseJ (Ch02.cubeDomain Q) (a.coeffOn Q) p q ≤ + childResponseJAverageOnFamilyAtDepth a Q j p q := by + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (a.coeffOn Q) (a.coeffOn i.1) := by + intro i + exact a.restrictsTo_of_subset + (by simpa [Ch02.cubeDomain_coe] using + openCubeSet_subset_of_mem_descendantsAtDepth i.2) + have hsub : + Ch02.responseJ (Ch02.cubeDomain Q) (a.coeffOn Q) p q ≤ + Pcell.weightedAverage fun i => + Ch02.responseJ (Pcell.cell i) (a.coeffOn i.1) p q := + (Ch02.responseSubadditivityAndScalingTheory + (Ch02.cubeDomain Q) (a.coeffOn Q)).responseJ_subadditive + Pcell (fun i : Pcell.Cell => a.coeffOn i.1) hcell p q + let F : TriadicCube d → ℝ := fun R => + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q + calc + Ch02.responseJ (Ch02.cubeDomain Q) (a.coeffOn Q) p q + ≤ Pcell.weightedAverage fun i => + Ch02.responseJ (Pcell.cell i) (a.coeffOn i.1) p q := hsub + _ = descendantsAverage Q j F := by + simpa [Pcell, F] using! + Ch02.descendantsDomainPartition_weightedAverage Q j F + _ = childResponseJAverageOnFamilyAtDepth a Q j p q := by + rfl + +/-- Child-response averages are nonnegative. -/ +theorem childResponseJAverageOnFamilyAtDepth_nonneg + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) + (j : ℕ) (p q : Vec d) : + 0 ≤ childResponseJAverageOnFamilyAtDepth a Q j p q := by + simpa [childResponseJAverageOnFamilyAtDepth] using + descendantsAverage_nonneg Q j + (fun R => Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q) + (fun R _hR => Ch02.responseJ_nonneg (Ch02.cubeDomain R) (a.coeffOn R) p q) + +/-- The cube average of the difference half-energy density is nonnegative. -/ +theorem cubeAverage_additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) : + 0 ≤ cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) := by + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) (a.coeffOn R).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) (a.coeffOn R).toCoeffField := + hEllOpen.cubeSet_of_openCubeSet + have hEll_norm : + ∀ᵐ x ∂ normalizedCubeMeasure R, + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) := by + change + ∀ᵐ x ∂ ENNReal.ofReal ((cubeVolume R)⁻¹) • volume.restrict (cubeSet R), + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) + exact ae_smul_measure + (by simpa [volumeMeasureOn] using hEll.ae_isEllipticMatrix) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + have hNonneg : + 0 ≤ᵐ[normalizedCubeMeasure R] + additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q := by + filter_upwards [hEll_norm] with x hx + exact additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + a Q R p q x hx + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact integral_nonneg_of_ae hNonneg + +/-- The cube average of the sum half-energy density is nonnegative. -/ +theorem cubeAverage_additivitySumHalfEnergyDensityOnFamilyOnCube_nonneg + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) : + 0 ≤ cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q) := by + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) (a.coeffOn R).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) (a.coeffOn R).toCoeffField := + hEllOpen.cubeSet_of_openCubeSet + have hEll_norm : + ∀ᵐ x ∂ normalizedCubeMeasure R, + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) := by + change + ∀ᵐ x ∂ ENNReal.ofReal ((cubeVolume R)⁻¹) • volume.restrict (cubeSet R), + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) + exact ae_smul_measure + (by simpa [volumeMeasureOn] using hEll.ae_isEllipticMatrix) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + have hNonneg : + 0 ≤ᵐ[normalizedCubeMeasure R] + additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q := by + filter_upwards [hEll_norm] with x hx + exact additivitySumHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + a Q R p q x hx + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + exact integral_nonneg_of_ae hNonneg + +/-- Pointwise comparison of the additivity sum energy with parent and child +half-energies on one child cube. -/ +theorem additivitySumHalfEnergyDensityOnFamilyOnCube_le_two_topHalfEnergy_add_two_childHalfEnergy + {d : ℕ} {lam Lam : ℝ} (a : Ch02.TriadicCoeffFamily d) + (Q R : TriadicCube d) (p q : Vec d) (x : Vec d) + (hEll : IsEllipticMatrix lam Lam ((a.coeffOn R).toCoeffField x)) + (hCoeff : (a.coeffOn Q).toCoeffField = (a.coeffOn R).toCoeffField) : + additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q x ≤ + 2 * topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q x + + 2 * topHalfEnergyDensityOnCube R (a.coeffOn R) p q x := by + let topGrad : Vec d := canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + let childGrad : Vec d := canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A : Mat d := (a.coeffOn R).toCoeffField x + have hsum := + vecDot_matVecMul_symmPart_sub_le_two_mul_add_of_isEllipticMatrix + (A := A) hEll topGrad (-childGrad) + have hsum_add : + vecDot (topGrad + childGrad) (matVecMul (symmPart A) (topGrad + childGrad)) ≤ + 2 * (vecDot topGrad (matVecMul (symmPart A) topGrad) + + vecDot childGrad (matVecMul (symmPart A) childGrad)) := by + simpa [sub_neg_eq_add, matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + using hsum + have hgoal : + (1 / 2 : ℝ) * + vecDot (topGrad + childGrad) + (matVecMul (symmPart A) (topGrad + childGrad)) ≤ + vecDot topGrad (matVecMul (symmPart A) topGrad) + + vecDot childGrad (matVecMul (symmPart A) childGrad) := by + nlinarith + simpa [additivitySumHalfEnergyDensityOnFamilyOnCube, topHalfEnergyDensityOnCube, + Ch02.variationEnergyIntegrand, canonicalMaximizerGradientOnCube, + topGrad, childGrad, A, hCoeff] using hgoal + +/-- One-cube averaged comparison of sum energy with parent top energy plus +child response. -/ +theorem cubeAverage_additivitySumHalfEnergyDensityOnFamilyOnCube_le_two_topHalfEnergy_add_two_childResponse + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) + (hCoeff : (a.coeffOn Q).toCoeffField = (a.coeffOn R).toCoeffField) : + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q) ≤ + 2 * cubeAverage R (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q := by + let topF : Vec d → ℝ := topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q + let childF : Vec d → ℝ := topHalfEnergyDensityOnCube R (a.coeffOn R) p q + let sumF : Vec d → ℝ := additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q + have hsubset : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR + have hTop_int : IntegrableOn topF (cubeSet R) volume := + (topHalfEnergyDensityOnCube_integrableOn_cubeSet Q (a.coeffOn Q) p q).mono_set hsubset + have hChild_int : IntegrableOn childF (cubeSet R) volume := by + simpa [childF] using topHalfEnergyDensityOnCube_integrableOn_cubeSet R (a.coeffOn R) p q + have hSum_int : IntegrableOn sumF (cubeSet R) volume := by + simpa [sumF] using additivitySumHalfEnergyDensityOnFamilyOnCube_integrableOn + a Q hR p q + let μ : Measure (Vec d) := normalizedCubeMeasure R + have hTop_norm : Integrable topF μ := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R hTop_int + have hChild_norm : Integrable childF μ := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R hChild_int + have hSum_norm : Integrable sumF μ := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R hSum_int + have hRhs_norm : + Integrable (fun x => 2 * topF x + 2 * childF x) μ := + (hTop_norm.const_mul 2).add (hChild_norm.const_mul 2) + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) (a.coeffOn R).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) (a.coeffOn R).toCoeffField := + hEllOpen.cubeSet_of_openCubeSet + have hEll_norm : + ∀ᵐ x ∂ μ, + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) := by + change + ∀ᵐ x ∂ ENNReal.ofReal ((cubeVolume R)⁻¹) • volume.restrict (cubeSet R), + IsEllipticMatrix (a.coeffOn R).lam (a.coeffOn R).Lam + ((a.coeffOn R).toCoeffField x) + exact ae_smul_measure + (by simpa [volumeMeasureOn] using hEll.ae_isEllipticMatrix) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + have hpoint : sumF ≤ᵐ[μ] fun x => 2 * topF x + 2 * childF x := by + filter_upwards [hEll_norm] with x hx + simpa [sumF, topF, childF] using + additivitySumHalfEnergyDensityOnFamilyOnCube_le_two_topHalfEnergy_add_two_childHalfEnergy + a Q R p q x hx hCoeff + have hInt_le : + ∫ x, sumF x ∂μ ≤ ∫ x, (2 * topF x + 2 * childF x) ∂μ := + integral_mono_ae hSum_norm hRhs_norm hpoint + calc + cubeAverage R sumF = ∫ x, sumF x ∂μ := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ ≤ ∫ x, (2 * topF x + 2 * childF x) ∂μ := hInt_le + _ = 2 * cubeAverage R topF + 2 * cubeAverage R childF := by + rw [integral_add (hTop_norm.const_mul 2) (hChild_norm.const_mul 2)] + rw [integral_const_mul, integral_const_mul] + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + _ = 2 * cubeAverage R (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q := by + rw [← responseJOnCube_eq_cubeAverage_topHalfEnergy R (a.coeffOn R) p q] + +/-- The descendant average of parent top half-energy over children is the +parent response. -/ +theorem descendantsAverage_cubeAverage_topHalfEnergyOnCube_eq_responseJOnCube + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) (p q : Vec d) : + descendantsAverage Q j + (fun R => cubeAverage R (topHalfEnergyDensityOnCube Q a p q)) = + Ch02.responseJ (Ch02.cubeDomain Q) a p q := by + let F : Vec d → ℝ := topHalfEnergyDensityOnCube Q a p q + have hTop_int : IntegrableOn F (cubeSet Q) volume := by + simpa [F] using topHalfEnergyDensityOnCube_integrableOn_cubeSet Q a p q + calc + descendantsAverage Q j (fun R => cubeAverage R F) + = cubeAverage Q F := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := F) hTop_int] + _ = Ch02.responseJ (Ch02.cubeDomain Q) a p q := by + rw [← responseJOnCube_eq_cubeAverage_topHalfEnergy Q a p q] + +/-- The descendant-averaged sum-energy factor is controlled by twice the parent +response plus twice the child-response average. -/ +theorem descendantsAverage_additivitySumHalfEnergyOnDependentFamily_le_two_responseJ_add_two_childResponse + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q)) ≤ + 2 * Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + intro F + classical + let S : Finset (TriadicCube d) := descendantsAtDepth Q j + have hS_nonempty : S.Nonempty := by + simpa [S] using descendantsAtDepth_nonempty Q j + have hinv_nonneg : 0 ≤ ((S.card : ℝ)⁻¹) := + inv_nonneg.mpr (Nat.cast_nonneg S.card) + have hterm : + ∀ R ∈ S, + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q) ≤ + 2 * cubeAverage R (topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q := by + intro R hR + exact + cubeAverage_additivitySumHalfEnergyDensityOnFamilyOnCube_le_two_topHalfEnergy_add_two_childResponse + F Q (by simpa [S] using hR) p q (by rfl) + have hsum : + ∑ R ∈ S, + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q) ≤ + ∑ R ∈ S, + (2 * cubeAverage R (topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) := + Finset.sum_le_sum hterm + have havg : + descendantsAverage Q j + (fun R => cubeAverage R + (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q)) ≤ + descendantsAverage Q j + (fun R => + 2 * cubeAverage R (topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) := by + simpa [descendantsAverage, S] using + mul_le_mul_of_nonneg_left hsum hinv_nonneg + calc + descendantsAverage Q j + (fun R => cubeAverage R + (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q)) + ≤ + descendantsAverage Q j + (fun R => + 2 * cubeAverage R (topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + + 2 * Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q) := havg + _ = + 2 * descendantsAverage Q j + (fun R => cubeAverage R (topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q)) + + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + rw [descendantsAverage_add] + rw [descendantsAverage_smul, descendantsAverage_smul] + rfl + _ = + 2 * Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + rw [descendantsAverage_cubeAverage_topHalfEnergyOnCube_eq_responseJOnCube] + +/-- The descendant-averaged sum-energy factor is bounded by four times the +child-response average. -/ +theorem descendantsAverage_additivitySumHalfEnergyOnDependentFamily_le_four_childResponse + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q)) ≤ + 4 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + intro F + have hsum := + descendantsAverage_additivitySumHalfEnergyOnDependentFamily_le_two_responseJ_add_two_childResponse + a ha Q j p q + have hparent_le_child : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q ≤ + childResponseJAverageOnFamilyAtDepth F Q j p q := + responseJOnCube_le_childResponseJAverageOnFamilyAtDepth F Q j p q + calc + descendantsAverage Q j + (fun R => cubeAverage R + (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q)) + ≤ + 2 * Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + simpa [F] using hsum + _ ≤ + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q + + 2 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + nlinarith [hparent_le_child] + _ = 4 * childResponseJAverageOnFamilyAtDepth F Q j p q := by + ring + +/-- Square-root form of a `4`-multiple upper bound. -/ +theorem sqrt_le_two_mul_sqrt_of_le_four_mul {x y : ℝ} + (hxy : x ≤ 4 * y) : + Real.sqrt x ≤ 2 * Real.sqrt y := by + have hsqrt4 : Real.sqrt (4 : ℝ) = 2 := by + rw [Real.sqrt_eq_iff_eq_sq (by norm_num : 0 ≤ (4 : ℝ)) + (by norm_num : 0 ≤ (2 : ℝ))] + norm_num + calc + Real.sqrt x ≤ Real.sqrt (4 * y) := Real.sqrt_le_sqrt hxy + _ = Real.sqrt (4 : ℝ) * Real.sqrt y := by + rw [Real.sqrt_mul (by norm_num : 0 ≤ (4 : ℝ)) y] + _ = 2 * Real.sqrt y := by + rw [hsqrt4] + +/-- One-child additivity-cross estimate with the cutoff mean factor included. -/ +theorem abs_one_sub_cubeAverage_mul_cubeAverage_childAdditivityCrossDensityOnFamilyOnCube_le_const_mul_sqrt_diff_avg_mul_sqrt_sum_avg + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (φ : Vec d → ℝ) + (p q : Vec d) {C : ℝ} + (hCut : |1 - cubeAverage R φ| ≤ C) : + |(1 - cubeAverage R φ) * + cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q)| ≤ + C * + (Real.sqrt + (cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q)) * + Real.sqrt + (cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q))) := by + have hC_nonneg : 0 ≤ C := + (abs_nonneg (1 - cubeAverage R φ)).trans hCut + have hCross := + abs_cubeAverage_childAdditivityCrossDensityOnFamilyOnCube_le_sqrt_diff_avg_mul_sqrt_sum_avg_of_descendant + (a := a) (Q := Q) (R := R) hR p q + calc + |(1 - cubeAverage R φ) * + cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q)| + = + |1 - cubeAverage R φ| * + |cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q)| := by + rw [abs_mul] + _ ≤ + C * + (Real.sqrt + (cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q)) * + Real.sqrt + (cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q))) := by + exact + mul_le_mul hCut hCross + (abs_nonneg + (cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q))) + hC_nonneg + +/-- Descendant-averaged additivity-cross term after the one-cube Cauchy step. -/ +theorem abs_concreteAdditivityCrossTermOnFamilyAtDepth_le_const_mul_sqrt_descAvg_diffEnergy_mul_sqrt_descAvg_sumEnergy + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) + {C : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) : + |concreteAdditivityCrossTermOnFamilyAtDepth a Q j φ p q| ≤ + C * + (Real.sqrt + (descendantsAverage Q j fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q)) * + Real.sqrt + (descendantsAverage Q j fun R => + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q))) := by + let A : TriadicCube d → ℝ := fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) + let B : TriadicCube d → ℝ := fun R => + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q) + let X : TriadicCube d → ℝ := fun R => + if R ∈ descendantsAtDepth Q j then + (1 - cubeAverage R φ) * + cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + else + 0 + have hCauchy := + abs_finset_average_le_const_mul_sqrt_average_mul_sqrt_average_of_abs_le + (S := descendantsAtDepth Q j) + (hS := descendantsAtDepth_nonempty Q j) + (C := C) (A := A) (B := B) (X := X) + hC + (fun R => cubeAverage_additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg a Q R p q) + (fun R => cubeAverage_additivitySumHalfEnergyDensityOnFamilyOnCube_nonneg a Q R p q) + (by + intro R + by_cases hR : R ∈ descendantsAtDepth Q j + · simpa [X, A, B, hR] using + abs_one_sub_cubeAverage_mul_cubeAverage_childAdditivityCrossDensityOnFamilyOnCube_le_const_mul_sqrt_diff_avg_mul_sqrt_sum_avg + (a := a) (Q := Q) (R := R) hR φ p q (hCut R hR) + · have hRight_nonneg : + 0 ≤ C * (Real.sqrt (A R) * Real.sqrt (B R)) := + mul_nonneg hC (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) + simpa [X, hR] using hRight_nonneg) + simpa [concreteAdditivityCrossTermOnFamilyAtDepth, additivityCrossTermOnCubeAtDepth, + descendantsAverage, X, A, B] using hCauchy + +/-- Deterministic additivity-cross bound for the Chapter 4 dependent family, +with the second energy factor reduced to child responses. -/ +theorem abs_concreteAdditivityCrossTermOnDependentFamilyAtDepth_le_two_const_mul_sqrt_descAvg_diffEnergy_mul_sqrt_childResponseJAverage + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) + {C : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + |concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt + (descendantsAverage Q j fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q)) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) := by + intro F + let diffAvg : ℝ := + descendantsAverage Q j fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) + let sumAvg : ℝ := + descendantsAverage Q j fun R => + cubeAverage R (additivitySumHalfEnergyDensityOnFamilyOnCube F Q R p q) + let childAvg : ℝ := childResponseJAverageOnFamilyAtDepth F Q j p q + have hbase : + |concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q| ≤ + C * (Real.sqrt diffAvg * Real.sqrt sumAvg) := by + simpa [diffAvg, sumAvg, F] using + abs_concreteAdditivityCrossTermOnFamilyAtDepth_le_const_mul_sqrt_descAvg_diffEnergy_mul_sqrt_descAvg_sumEnergy + (a := F) (Q := Q) (j := j) (φ := φ) (p := p) (q := q) + hC hCut + have hsum_le : sumAvg ≤ 4 * childAvg := by + simpa [sumAvg, childAvg, F] using + descendantsAverage_additivitySumHalfEnergyOnDependentFamily_le_four_childResponse + a ha Q j p q + have hsqrt_sum_le : Real.sqrt sumAvg ≤ 2 * Real.sqrt childAvg := + sqrt_le_two_mul_sqrt_of_le_four_mul hsum_le + have hmul_sqrt : + Real.sqrt diffAvg * Real.sqrt sumAvg ≤ + Real.sqrt diffAvg * (2 * Real.sqrt childAvg) := + mul_le_mul_of_nonneg_left hsqrt_sum_le (Real.sqrt_nonneg diffAvg) + have hmul_C : + C * (Real.sqrt diffAvg * Real.sqrt sumAvg) ≤ + C * (Real.sqrt diffAvg * (2 * Real.sqrt childAvg)) := + mul_le_mul_of_nonneg_left hmul_sqrt hC + calc + |concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q| + ≤ C * (Real.sqrt diffAvg * Real.sqrt sumAvg) := hbase + _ ≤ C * (Real.sqrt diffAvg * (2 * Real.sqrt childAvg)) := hmul_C + _ = (2 * C) * (Real.sqrt diffAvg * Real.sqrt childAvg) := by + ring + +/-- Deterministic additivity-cross bound in the manuscript form, with the +difference-energy factor identified as the response partition defect. -/ +theorem abs_concreteAdditivityCrossTermOnDependentFamilyAtDepth_le_two_const_mul_sqrt_responseJPartitionDefect_mul_sqrt_childResponseJAverage + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) + {C : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + |concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) := by + intro F + have hbase := + abs_concreteAdditivityCrossTermOnDependentFamilyAtDepth_le_two_const_mul_sqrt_descAvg_diffEnergy_mul_sqrt_childResponseJAverage + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) (p := p) (q := q) + hC hCut + have hdefect := + descendantsAverage_additivityDiffHalfEnergyOnDependentFamily_eq_responseJPartitionDefectOnFamilyAtDepth + a ha Q j p q + simpa [F, hdefect] using hbase + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/Densities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/Densities.lean new file mode 100644 index 0000000000..39d65f3216 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/Densities.lean @@ -0,0 +1,499 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.EnergyDensities + +/-! # Densities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# AdditivityDensities + +Additivity-cross densities and pointwise elliptic estimates. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Quadratic algebra behind the child additivity-cross term. -/ +theorem half_quad_eq_additivity_cross_add_half_quad + {d : ℕ} (A : Mat d) (top child : Vec d) : + (1 / 2 : ℝ) * vecDot top (matVecMul (symmPart A) top) = + ((1 / 2 : ℝ) * + vecDot (top - child) (matVecMul (symmPart A) (top - child)) + + vecDot (top - child) (matVecMul (symmPart A) child)) + + (1 / 2 : ℝ) * vecDot child (matVecMul (symmPart A) child) := by + have hcomm : + vecDot child (matVecMul (symmPart A) top) = + vecDot top (matVecMul (symmPart A) child) := by + simpa using vecDot_matVecMul_symmPart_comm A child top + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, + vecDot_add_right, vecDot_neg_left, vecDot_neg_right, hcomm] + ring + +/-- Concrete child-cube cross density for a deterministic coefficient family. -/ +noncomputable def childAdditivityCrossDensityOnFamilyOnCube {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) : Vec d → ℝ := + fun x => + let topGrad := canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + let childGrad := canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A := (a.coeffOn R).toCoeffField x + (1 / 2 : ℝ) * + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) + + vecDot (topGrad - childGrad) (matVecMul (symmPart A) childGrad) + +/-- Concrete additivity-cross term over all depth-`j` children. -/ +noncomputable def concreteAdditivityCrossTermOnFamilyAtDepth {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) : ℝ := + additivityCrossTermOnCubeAtDepth Q j φ fun R => + cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + +/-- Unweighted average of child responses for a deterministic triadic +coefficient family. -/ +noncomputable def childResponseJAverageOnFamilyAtDepth {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) (j : ℕ) + (p q : Vec d) : ℝ := + descendantsAverage Q j fun R => + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q + +/-- Deterministic child-minus-parent response defect for a triadic coefficient +family. -/ +noncomputable def responseJPartitionDefectOnFamilyAtDepth {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) (j : ℕ) + (p q : Vec d) : ℝ := + childResponseJAverageOnFamilyAtDepth a Q j p q - + Ch02.responseJ (Ch02.cubeDomain Q) (a.coeffOn Q) p q + +/-- The local half-energy of the top-minus-child gradient difference on one +child cube. -/ +noncomputable def additivityDiffHalfEnergyDensityOnFamilyOnCube {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) : Vec d → ℝ := + fun x => + let diff := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A := (a.coeffOn R).toCoeffField x + (1 / 2 : ℝ) * vecDot diff (matVecMul (symmPart A) diff) + +/-- The local half-energy of the top-plus-child gradient sum on one child +cube. -/ +noncomputable def additivitySumHalfEnergyDensityOnFamilyOnCube {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) : Vec d → ℝ := + fun x => + let topGrad := canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + let childGrad := canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A := (a.coeffOn R).toCoeffField x + (1 / 2 : ℝ) * + vecDot (topGrad + childGrad) (matVecMul (symmPart A) (topGrad + childGrad)) + +/-- The concrete child additivity-cross density is locally integrable. -/ +theorem childAdditivityCrossDensityOnFamilyOnCube_integrableOn + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + IntegrableOn (childAdditivityCrossDensityOnFamilyOnCube a Q R p q) + (cubeSet R) volume := by + let : IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + let : Fact (volume (cubeSet R) < ⊤) := ⟨volume_cubeSet_lt_top R⟩ + change IsFiniteMeasure (volume.restrict (cubeSet R)) + infer_instance + let topGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q + let childGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q + let coeff : CoeffField d := (a.coeffOn R).toCoeffField + have hTop : MemVectorL2 (cubeSet R) topGrad := by + simpa [topGrad, canonicalMaximizerGradientOnCube] using! + (Ch03.publicH1ToCubeSet_grad_memVectorL2_descendant_cubeSet + (Q := Q) (R := R) (j := j) + (canonicalMaximizerSolutionOnCube Q (a.coeffOn Q) p q).toH1 hR) + have hChild : MemVectorL2 (cubeSet R) childGrad := by + have h := + (Ch03.publicH1ToCubeSet + (Q := R) (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q).toH1).grad_memVectorL2 + simpa [childGrad, canonicalMaximizerGradientOnCube, Ch03.publicH1ToCubeSet_grad] using! h + have hDiff : MemVectorL2 (cubeSet R) (fun x => topGrad x - childGrad x) := by + simpa using! hTop.sub hChild + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) coeff := by + simpa [coeff, Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) coeff := + hEllOpen.cubeSet_of_openCubeSet + have hSymmDiff : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (symmPart (coeff x)) (topGrad x - childGrad x)) := + IsAEEllipticFieldOn.memVectorL2_matVecMul_symmPart hEll hDiff + have hSymmChild : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (symmPart (coeff x)) (childGrad x)) := + IsAEEllipticFieldOn.memVectorL2_matVecMul_symmPart hEll hChild + have hQuad : + IntegrableOn + (fun x => vecDot (topGrad x - childGrad x) + (matVecMul (symmPart (coeff x)) (topGrad x - childGrad x))) + (cubeSet R) volume := + integrableOn_vecDot_of_memVectorL2 hDiff hSymmDiff + have hCross : + IntegrableOn + (fun x => vecDot (topGrad x - childGrad x) + (matVecMul (symmPart (coeff x)) (childGrad x))) + (cubeSet R) volume := + integrableOn_vecDot_of_memVectorL2 hDiff hSymmChild + have hSum : + IntegrableOn + (fun x => + (1 / 2 : ℝ) * + vecDot (topGrad x - childGrad x) + (matVecMul (symmPart (coeff x)) (topGrad x - childGrad x)) + + vecDot (topGrad x - childGrad x) + (matVecMul (symmPart (coeff x)) (childGrad x))) + (cubeSet R) volume := + (hQuad.const_mul (1 / 2 : ℝ)).add hCross + show + IntegrableOn + (fun x => + (1 / 2 : ℝ) * + vecDot + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x)) + + vecDot + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) + (canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x))) + (cubeSet R) volume + simpa [childAdditivityCrossDensityOnFamilyOnCube, topGrad, childGrad, coeff] using hSum + +/-- The concrete child additivity-cross density is the manuscript +`1/2 (top-child) · a_s (top+child)` density. -/ +theorem childAdditivityCrossDensityOnFamilyOnCube_eq_half_diff_dot_symmPart_sum + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) (x : Vec d) : + childAdditivityCrossDensityOnFamilyOnCube a Q R p q x = + (1 / 2 : ℝ) * + vecDot + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x)) := by + let topGrad := canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + let childGrad := canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A := (a.coeffOn R).toCoeffField x + have htop : topGrad = (topGrad - childGrad) + childGrad := by + ext i + simp + have hcomm : + vecDot (topGrad - childGrad) (matVecMul (symmPart A) topGrad) = + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) + + vecDot (topGrad - childGrad) (matVecMul (symmPart A) childGrad) := by + calc + vecDot (topGrad - childGrad) (matVecMul (symmPart A) topGrad) + = + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) ((topGrad - childGrad) + childGrad)) := by + conv_lhs => + arg 2 + arg 2 + rw [htop] + _ = + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) + + vecDot (topGrad - childGrad) (matVecMul (symmPart A) childGrad) := by + rw [matVecMul_add, vecDot_add_right] + simp [childAdditivityCrossDensityOnFamilyOnCube, topGrad, childGrad, A, + matVecMul_add, vecDot_add_right, hcomm] + ring + +/-- Pointwise Cauchy for the symmetric coefficient energy. -/ +theorem abs_half_vecDot_matVecMul_symmPart_le_sqrt_half_quad_mul_sqrt_half_quad_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ η : Vec d) : + |(1 / 2 : ℝ) * vecDot ξ (matVecMul (symmPart A) η)| ≤ + Real.sqrt ((1 / 2 : ℝ) * vecDot ξ (matVecMul (symmPart A) ξ)) * + Real.sqrt ((1 / 2 : ℝ) * vecDot η (matVecMul (symmPart A) η)) := by + let X : ℝ := vecDot ξ (matVecMul (symmPart A) ξ) + let Y : ℝ := vecDot η (matVecMul (symmPart A) η) + let Z : ℝ := vecDot ξ (matVecMul (symmPart A) η) + have hsq : Z ^ 2 ≤ X * Y := by + simpa [X, Y, Z] using + sq_vecDot_matVecMul_symmPart_le_of_isEllipticMatrix hA ξ η + have hX_nonneg : 0 ≤ X := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA ξ + have hnorm : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + have hlam_pos : 0 < lam := hA.1 + nlinarith + have hY_nonneg : 0 ≤ Y := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hnorm : 0 ≤ vecNormSq η := vecNormSq_nonneg η + have hlam_pos : 0 < lam := hA.1 + nlinarith + have hhalf_nonneg : 0 ≤ (1 / 2 : ℝ) := by norm_num + have hleft_sq : + |(1 / 2 : ℝ) * Z| ^ 2 = ((1 / 2 : ℝ) ^ 2) * Z ^ 2 := by + rw [sq_abs] + ring + have hright_sq : + (Real.sqrt ((1 / 2 : ℝ) * X) * Real.sqrt ((1 / 2 : ℝ) * Y)) ^ 2 = + ((1 / 2 : ℝ) * X) * ((1 / 2 : ℝ) * Y) := by + rw [mul_pow, Real.sq_sqrt (mul_nonneg hhalf_nonneg hX_nonneg), + Real.sq_sqrt (mul_nonneg hhalf_nonneg hY_nonneg)] + have hsq_abs : + |(1 / 2 : ℝ) * Z| ^ 2 ≤ + (Real.sqrt ((1 / 2 : ℝ) * X) * Real.sqrt ((1 / 2 : ℝ) * Y)) ^ 2 := by + rw [hleft_sq, hright_sq] + nlinarith + have hright_nonneg : + 0 ≤ Real.sqrt ((1 / 2 : ℝ) * X) * + Real.sqrt ((1 / 2 : ℝ) * Y) := + mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + simpa [X, Y, Z] using abs_le_of_sq_le_sq hsq_abs hright_nonneg + +/-- Pointwise local Cauchy estimate for the concrete child additivity-cross +density. -/ +theorem abs_childAdditivityCrossDensityOnFamilyOnCube_le_sqrt_diff_mul_sqrt_sum_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} (a : Ch02.TriadicCoeffFamily d) + (Q R : TriadicCube d) (p q : Vec d) (x : Vec d) + (hEll : IsEllipticMatrix lam Lam ((a.coeffOn R).toCoeffField x)) : + |childAdditivityCrossDensityOnFamilyOnCube a Q R p q x| ≤ + Real.sqrt (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q x) * + Real.sqrt (additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q x) := by + rw [childAdditivityCrossDensityOnFamilyOnCube_eq_half_diff_dot_symmPart_sum] + simpa [additivityDiffHalfEnergyDensityOnFamilyOnCube, + additivitySumHalfEnergyDensityOnFamilyOnCube] using + abs_half_vecDot_matVecMul_symmPart_le_sqrt_half_quad_mul_sqrt_half_quad_of_isEllipticMatrix + hEll + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + +/-- The local difference half-energy density is nonnegative at elliptic points. -/ +theorem additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} (a : Ch02.TriadicCoeffFamily d) + (Q R : TriadicCube d) (p q : Vec d) (x : Vec d) + (hEll : IsEllipticMatrix lam Lam ((a.coeffOn R).toCoeffField x)) : + 0 ≤ additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q x := by + let diff := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + have hquad : + 0 ≤ vecDot diff + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) diff) := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hEll diff + have hnorm : 0 ≤ vecNormSq diff := vecNormSq_nonneg diff + have hlam_pos : 0 < lam := hEll.1 + nlinarith + simpa [additivityDiffHalfEnergyDensityOnFamilyOnCube, diff] using + mul_nonneg (by norm_num : 0 ≤ (1 / 2 : ℝ)) hquad + +/-- The local sum half-energy density is nonnegative at elliptic points. -/ +theorem additivitySumHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} (a : Ch02.TriadicCoeffFamily d) + (Q R : TriadicCube d) (p q : Vec d) (x : Vec d) + (hEll : IsEllipticMatrix lam Lam ((a.coeffOn R).toCoeffField x)) : + 0 ≤ additivitySumHalfEnergyDensityOnFamilyOnCube a Q R p q x := by + let sumGrad := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + have hquad : + 0 ≤ vecDot sumGrad + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) sumGrad) := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hEll sumGrad + have hnorm : 0 ≤ vecNormSq sumGrad := vecNormSq_nonneg sumGrad + have hlam_pos : 0 < lam := hEll.1 + nlinarith + simpa [additivitySumHalfEnergyDensityOnFamilyOnCube, sumGrad] using + mul_nonneg (by norm_num : 0 ≤ (1 / 2 : ℝ)) hquad + +/-- The local difference half-energy density is locally integrable. -/ +theorem additivityDiffHalfEnergyDensityOnFamilyOnCube_integrableOn + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + IntegrableOn (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) + (cubeSet R) volume := by + let : IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + let : Fact (volume (cubeSet R) < ⊤) := ⟨volume_cubeSet_lt_top R⟩ + change IsFiniteMeasure (volume.restrict (cubeSet R)) + infer_instance + let topGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q + let childGrad : Vec d → Vec d := + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q + let coeff : CoeffField d := (a.coeffOn R).toCoeffField + have hTop : MemVectorL2 (cubeSet R) topGrad := by + simpa [topGrad, canonicalMaximizerGradientOnCube] using! + (Ch03.publicH1ToCubeSet_grad_memVectorL2_descendant_cubeSet + (Q := Q) (R := R) (j := j) + (canonicalMaximizerSolutionOnCube Q (a.coeffOn Q) p q).toH1 hR) + have hChild : MemVectorL2 (cubeSet R) childGrad := by + have h := + (Ch03.publicH1ToCubeSet + (Q := R) (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q).toH1).grad_memVectorL2 + simpa [childGrad, canonicalMaximizerGradientOnCube, Ch03.publicH1ToCubeSet_grad] using! h + have hDiff : MemVectorL2 (cubeSet R) (fun x => topGrad x - childGrad x) := by + simpa using! hTop.sub hChild + have hEllOpen : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (openCubeSet R) coeff := by + simpa [coeff, Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (a.coeffOn R)) + have hEll : + IsAEEllipticFieldOn (a.coeffOn R).lam (a.coeffOn R).Lam + (cubeSet R) coeff := + hEllOpen.cubeSet_of_openCubeSet + have hSymmDiff : + MemVectorL2 (cubeSet R) + (fun x => matVecMul (symmPart (coeff x)) (topGrad x - childGrad x)) := + IsAEEllipticFieldOn.memVectorL2_matVecMul_symmPart hEll hDiff + have hQuad : + IntegrableOn + (fun x => vecDot (topGrad x - childGrad x) + (matVecMul (symmPart (coeff x)) (topGrad x - childGrad x))) + (cubeSet R) volume := + integrableOn_vecDot_of_memVectorL2 hDiff hSymmDiff + show IntegrableOn + (fun x => + (1 / 2 : ℝ) * + vecDot + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x) + (matVecMul (symmPart ((a.coeffOn R).toCoeffField x)) + (canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x - + canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x))) + (cubeSet R) volume + simpa [additivityDiffHalfEnergyDensityOnFamilyOnCube, topGrad, childGrad, coeff] using! + hQuad.const_mul (1 / 2 : ℝ) + +/-! ### Difference energy and the response partition defect -/ + +/-- +One-cube second variation in the concrete Section 5.3 notation. If a child +cube solution has the parent gradient, then the local difference half-energy is +the gap between the child canonical response and that solution's response +value. +-/ +theorem cubeAverage_additivityDiffHalfEnergyDensityOnFamilyOnCube_eq_responseJOnCube_sub_responseValue_of_grad_eq + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q R : TriadicCube d) + (p q : Vec d) + (w : Ch02.Solution (Ch02.cubeDomain R) (a.coeffOn R)) + (hgrad : w.toH1.grad = + canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q) : + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) = + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q - + Ch02.responseValue (Ch02.cubeDomain R) (a.coeffOn R) p q w := by + have hmax : + Ch02.IsResponseMaximizer (Ch02.cubeDomain R) (a.coeffOn R) p q + (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q) := by + simpa [canonicalMaximizerSolutionOnCube] using + Ch02.canonicalMaximizer_isMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain R) (a.coeffOn R)) p q + have hsecond := + Ch02.secondVariation_eq_of_isResponseMaximizer hmax w + have henergy : + Ch02.secondVariationEnergyValue (Ch02.cubeDomain R) (a.coeffOn R) + (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q) w = + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) := by + unfold Ch02.secondVariationEnergyValue + rw [ch02_average_cubeDomain_eq_cubeAverage] + congr 1 + funext x + have hw : + w.toH1.grad x = canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x := by + rw [hgrad] + let topGrad : Vec d := canonicalMaximizerGradientOnCube Q (a.coeffOn Q) p q x + let childGrad : Vec d := canonicalMaximizerGradientOnCube R (a.coeffOn R) p q x + let A : Mat d := (a.coeffOn R).toCoeffField x + have hdiff : childGrad - topGrad = -(topGrad - childGrad) := by + ext i + simp [topGrad, childGrad] + have hquad_same : + vecDot (childGrad - topGrad) + (matVecMul (symmPart A) (childGrad - topGrad)) = + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) := by + calc + vecDot (childGrad - topGrad) + (matVecMul (symmPart A) (childGrad - topGrad)) + = + vecDot (-(topGrad - childGrad)) + (matVecMul (symmPart A) (-(topGrad - childGrad))) := by + rw [hdiff] + _ = + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) := by + rw [matVecMul_neg, vecDot_neg_right, vecDot_neg_left, neg_neg] + calc + (1 / 2 : ℝ) * + vecDot + ((canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q).toH1.grad x - + w.toH1.grad x) + (matVecMul + (symmPart ((a.coeffOn R).toCoeffField x)) + ((canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q).toH1.grad x - + w.toH1.grad x)) + = + (1 / 2 : ℝ) * + vecDot (childGrad - topGrad) + (matVecMul (symmPart A) (childGrad - topGrad)) := by + simp [childGrad, topGrad, A, canonicalMaximizerGradientOnCube, hw] + _ = + (1 / 2 : ℝ) * + vecDot (topGrad - childGrad) + (matVecMul (symmPart A) (topGrad - childGrad)) := by + rw [hquad_same] + _ = additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q x := by + simp [additivityDiffHalfEnergyDensityOnFamilyOnCube, + topGrad, childGrad, A] + calc + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube a Q R p q) + = + Ch02.secondVariationEnergyValue (Ch02.cubeDomain R) (a.coeffOn R) + (canonicalMaximizerSolutionOnCube R (a.coeffOn R) p q) w := + henergy.symm + _ = + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q - + Ch02.responseValue (Ch02.cubeDomain R) (a.coeffOn R) p q w := by + exact hsecond.symm + +@[simp] theorem h1Function_restrict_grad {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (hVopen : IsOpen V) (hVU : V ⊆ U) : + (u.restrict hVopen hVU).grad = u.grad := + rfl + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/ParentRestriction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/ParentRestriction.lean new file mode 100644 index 0000000000..e26630ce5a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Additivity/ParentRestriction.lean @@ -0,0 +1,286 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.Densities + +/-! # Parent Restriction -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# AdditivityParentRestriction + +Parent-restricted response identities and the partition defect. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +noncomputable def castAHarmonicCoeff {d : ℕ} {U : Set (Vec d)} + {a b : CoeffField d} (h : a = b) (u : AHarmonicFunction a U) : + AHarmonicFunction b U := + h ▸ u + +@[simp] theorem castAHarmonicCoeff_grad {d : ℕ} {U : Set (Vec d)} + {a b : CoeffField d} (h : a = b) (u : AHarmonicFunction a U) : + (castAHarmonicCoeff h u).toH1.grad = u.toH1.grad := by + subst b + rfl + +/-- +The parent canonical response solution, restricted to a descendant child cube +and viewed with the child coefficient representative. For the Chapter 4 +dependent family the parent and child coefficient representatives are the same +sampled coefficient field, so this needs no representative-identification +layer. +-/ +noncomputable def parentResponseSolutionOnDependentFamilyRestrictedToCube + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + Ch02.Solution (Ch02.cubeDomain R) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn R) := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + letI : IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet R).isFiniteMeasure_restrict_volume + have hCoeff : (F.coeffOn Q).toCoeffField = (F.coeffOn R).toCoeffField := by + simp [F] + let uParent : AHarmonicFunction (F.coeffOn R).toCoeffField (openCubeSet Q) := + castAHarmonicCoeff hCoeff + (canonicalMaximizerSolutionOnCube Q (F.coeffOn Q) p q) + have hsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtDepth hR + have hGradR : MemVectorL2 (openCubeSet R) uParent.toH1.grad := by + simpa using + (uParent.toH1.restrict (isOpen_openCubeSet R) hsub).grad_memVectorL2 + have hEllOpen : + IsAEEllipticFieldOn (F.coeffOn R).lam (F.coeffOn R).Lam + (openCubeSet R) (F.coeffOn R).toCoeffField := by + simpa [Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn (F.coeffOn R)) + have hFluxR : + MemVectorL2 (openCubeSet R) + (fun x => matVecMul ((F.coeffOn R).toCoeffField x) (uParent.toH1.grad x)) := + hEllOpen.memVectorL2_matVecMul hGradR + exact uParent.restrictOfMemVectorL2 + (isOpen_openCubeSet Q) (isOpen_openCubeSet R) hsub hFluxR + +/-- The restricted parent solution has the parent canonical gradient. -/ +theorem parentResponseSolutionOnDependentFamilyRestrictedToCube_grad + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q).toH1.grad = + canonicalMaximizerGradientOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q := by + funext x + rfl + +/-- +One-child diff-energy identity with the restricted parent solution supplied by +the Chapter 4 dependent coefficient family. +-/ +theorem cubeAverage_additivityDiffHalfEnergyDensityOnDependentFamilyOnCube_eq_responseJOnCube_sub_parentRestrictedResponseValue + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) = + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q - + Ch02.responseValue (Ch02.cubeDomain R) (F.coeffOn R) p q + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) := by + intro F + exact + cubeAverage_additivityDiffHalfEnergyDensityOnFamilyOnCube_eq_responseJOnCube_sub_responseValue_of_grad_eq + (a := F) (Q := Q) (R := R) (p := p) (q := q) + (w := parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) + (by + simpa [F] using + parentResponseSolutionOnDependentFamilyRestrictedToCube_grad a ha Q hR p q) + +/-- +The response value of the restricted parent solution on one child cube is the +child cube average of the parent response integrand. +-/ +theorem parentRestrictedResponseValueOnDependentFamily_eq_cubeAverage_parentResponseIntegrand + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.responseValue (Ch02.cubeDomain R) (F.coeffOn R) p q + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) = + cubeAverage R + (Ch02.responseIntegrand (Ch02.cubeDomain Q) (F.coeffOn Q) p q + (canonicalMaximizerSolutionOnCube Q (F.coeffOn Q) p q)) := by + intro F + unfold Ch02.responseValue + rw [ch02_average_cubeDomain_eq_cubeAverage] + congr 1 + +/-- The descendant-indexed restricted-parent response value. -/ +noncomputable def parentRestrictedResponseValueOnDependentFamilyAtDepth + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + TriadicCube d → ℝ := + fun R => + if hR : R ∈ descendantsAtDepth Q j then + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.responseValue (Ch02.cubeDomain R) (F.coeffOn R) p q + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) + else + 0 + +/-- +The descendant average of restricted-parent response values is the parent +response. +-/ +theorem descendantsAverage_parentRestrictedResponseValueOnDependentFamilyAtDepth_eq_responseJOnCube + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (parentRestrictedResponseValueOnDependentFamilyAtDepth a ha Q j p q) = + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + intro F + let G : Vec d → ℝ := + Ch02.responseIntegrand (Ch02.cubeDomain Q) (F.coeffOn Q) p q + (canonicalMaximizerSolutionOnCube Q (F.coeffOn Q) p q) + have hG_int_open : + IntegrableOn G (openCubeSet Q) volume := by + simpa [G, Ch02.cubeDomain_coe] using + ch02_responseIntegrand_integrableOn + (Ch02.cubeDomain Q) (F.coeffOn Q) p q + (canonicalMaximizerSolutionOnCube Q (F.coeffOn Q) p q) + have hG_int : IntegrableOn G (cubeSet Q) volume := by + rw [integrableOn_cubeSet_iff_integrableOn_openCubeSet] + exact hG_int_open + have hcongr : + descendantsAverage Q j + (parentRestrictedResponseValueOnDependentFamilyAtDepth a ha Q j p q) = + descendantsAverage Q j (fun R => cubeAverage R G) := by + apply descendantsAverage_congr_of_eq_on_descendants + intro R hR + simp [parentRestrictedResponseValueOnDependentFamilyAtDepth, hR, F, G, + parentRestrictedResponseValueOnDependentFamily_eq_cubeAverage_parentResponseIntegrand] + calc + descendantsAverage Q j + (parentRestrictedResponseValueOnDependentFamilyAtDepth a ha Q j p q) + = descendantsAverage Q j (fun R => cubeAverage R G) := hcongr + _ = cubeAverage Q G := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := G) hG_int] + _ = Ch02.responseValue (Ch02.cubeDomain Q) (F.coeffOn Q) p q + (canonicalMaximizerSolutionOnCube Q (F.coeffOn Q) p q) := by + rw [Ch02.responseValue, ch02_average_cubeDomain_eq_cubeAverage] + _ = Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + symm + exact + Ch02.responseJ_eq_responseValue_of_isResponseMaximizer + (by + simpa [canonicalMaximizerSolutionOnCube] using + Ch02.canonicalMaximizer_isMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) (F.coeffOn Q)) + p q) + +/-- +The descendant average of the local difference half-energy is exactly the +response partition defect for the Chapter 4 dependent coefficient family. +-/ +theorem descendantsAverage_additivityDiffHalfEnergyOnDependentFamily_eq_responseJPartitionDefectOnFamilyAtDepth + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q)) = + responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + intro F + let D : TriadicCube d → ℝ := fun R => + cubeAverage R (additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) + let Child : TriadicCube d → ℝ := fun R => + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q + let Parent : TriadicCube d → ℝ := + parentRestrictedResponseValueOnDependentFamilyAtDepth a ha Q j p q + have hlocal : + descendantsAverage Q j D = + descendantsAverage Q j (fun R => Child R - Parent R) := by + apply descendantsAverage_congr_of_eq_on_descendants + intro R hR + have hdiff := + cubeAverage_additivityDiffHalfEnergyDensityOnDependentFamilyOnCube_eq_responseJOnCube_sub_parentRestrictedResponseValue + (a := a) (ha := ha) (Q := Q) (R := R) hR p q + have hParent : + Parent R = + Ch02.responseValue (Ch02.cubeDomain R) (F.coeffOn R) p q + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) := by + simp [Parent, parentRestrictedResponseValueOnDependentFamilyAtDepth, hR, F] + calc + D R = + Ch02.responseJ (Ch02.cubeDomain R) (F.coeffOn R) p q - + Ch02.responseValue (Ch02.cubeDomain R) (F.coeffOn R) p q + (parentResponseSolutionOnDependentFamilyRestrictedToCube a ha Q hR p q) := by + simpa [D, F] using hdiff + _ = Child R - Parent R := by + rw [hParent] + have hlinear : + descendantsAverage Q j (fun R => Child R - Parent R) = + descendantsAverage Q j Child - descendantsAverage Q j Parent := by + calc + descendantsAverage Q j (fun R => Child R - Parent R) + = + descendantsAverage Q j (fun R => Child R + (-1 : ℝ) * Parent R) := by + congr 1 + funext R + ring + _ = + descendantsAverage Q j Child + + descendantsAverage Q j (fun R => (-1 : ℝ) * Parent R) := by + rw [descendantsAverage_add] + _ = + descendantsAverage Q j Child + (-1 : ℝ) * descendantsAverage Q j Parent := by + rw [descendantsAverage_smul] + _ = + descendantsAverage Q j Child - descendantsAverage Q j Parent := by + ring + calc + descendantsAverage Q j D + = descendantsAverage Q j (fun R => Child R - Parent R) := hlocal + _ = descendantsAverage Q j Child - descendantsAverage Q j Parent := hlinear + _ = + childResponseJAverageOnFamilyAtDepth F Q j p q - + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + rw [descendantsAverage_parentRestrictedResponseValueOnDependentFamilyAtDepth_eq_responseJOnCube] + rfl + _ = responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + rfl + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Averages.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Averages.lean new file mode 100644 index 0000000000..e9803630e4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Averages.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.WeightedChildren + +/-! # Averages -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# Averages + +Cube-average algebra used by the first Section 5.3 lemma. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Integrability on a cube gives integrability with respect to the normalized +cube measure. -/ +theorem integrable_normalizedCubeMeasure_of_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : IntegrableOn f (cubeSet Q) volume) : + Integrable f (normalizedCubeMeasure Q) := by + have hscale_ne_zero : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := + (ENNReal.ofReal_pos.mpr (inv_pos.mpr (cubeVolume_pos Q))).ne' + change Integrable f (normalizedCubeMeasure Q) + rw [normalizedCubeMeasure, cubeMeasure] + exact + (integrable_smul_measure + (μ := volume.restrict (cubeSet Q)) + hscale_ne_zero ENNReal.ofReal_ne_top).2 hf + +/-- Linearity of cube averages under cube-set integrability hypotheses. -/ +theorem cubeAverage_add_of_integrableOn + {d : ℕ} (Q : TriadicCube d) (f g : Vec d → ℝ) + (hf : IntegrableOn f (cubeSet Q) volume) + (hg : IntegrableOn g (cubeSet Q) volume) : + cubeAverage Q (fun x => f x + g x) = cubeAverage Q f + cubeAverage Q g := by + have hf_norm : Integrable f (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q hf + have hg_norm : Integrable g (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q hg + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + rw [integral_add hf_norm hg_norm] + +/-- The public Ch2 average on an open cube agrees with `cubeAverage`. -/ +theorem ch02_average_cubeDomain_eq_cubeAverage {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + Ch02.average (Ch02.cubeDomain Q) f = cubeAverage Q f := by + unfold Ch02.average cubeAverage + rw [Ch02.cubeDomain_coe] + rw [← setIntegral_cubeSet_eq_setIntegral_openCubeSet (Q := Q) (f := f)] + rw [volume_openCubeSet_toReal] + +/-- Scalar cutoff insertion behind the centered energy splitting. -/ +theorem integral_sub_const_eq_integral_cutoff_centered_add_integral_one_sub_cutoff_mul + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {φ F : α → ℝ} {c : ℝ} + (hF_int : Integrable F μ) + (hφ_int : Integrable φ μ) + (hCut_int : Integrable (fun x => φ x * (F x - c)) μ) + (hRem_int : Integrable (fun x => (1 - φ x) * F x) μ) + (hMean : ∫ x, φ x ∂μ = 1) : + ∫ x, F x ∂μ - c = + ∫ x, φ x * (F x - c) ∂μ + + ∫ x, (1 - φ x) * F x ∂μ := by + have hpoint : + (fun x => φ x * (F x - c) + (1 - φ x) * F x) = + fun x => F x - c * φ x := by + funext x + ring + calc + ∫ x, F x ∂μ - c + = ∫ x, F x ∂μ - c * ∫ x, φ x ∂μ := by + rw [hMean] + ring + _ = ∫ x, F x ∂μ - ∫ x, c * φ x ∂μ := by + rw [integral_const_mul] + _ = ∫ x, F x - c * φ x ∂μ := by + rw [integral_sub hF_int (hφ_int.const_mul c)] + _ = ∫ x, φ x * (F x - c) + (1 - φ x) * F x ∂μ := by + rw [hpoint] + _ = + ∫ x, φ x * (F x - c) ∂μ + + ∫ x, (1 - φ x) * F x ∂μ := by + rw [integral_add hCut_int hRem_int] + +/-- Cube-average form of mean-one cutoff insertion. -/ +theorem cubeAverage_sub_const_eq_cubeAverage_cutoff_centered_add_cubeAverage_one_sub_cutoff_mul + {d : ℕ} (Q : TriadicCube d) {φ F : Vec d → ℝ} {c : ℝ} + (hF_int : Integrable F (normalizedCubeMeasure Q)) + (hφ_int : Integrable φ (normalizedCubeMeasure Q)) + (hCut_int : + Integrable (fun x => φ x * (F x - c)) (normalizedCubeMeasure Q)) + (hRem_int : + Integrable (fun x => (1 - φ x) * F x) (normalizedCubeMeasure Q)) + (hMean : cubeAverage Q φ = 1) : + cubeAverage Q F - c = + cubeAverage Q (fun x => φ x * (F x - c)) + + cubeAverage Q (fun x => (1 - φ x) * F x) := by + have hMeanInt : ∫ x, φ x ∂ normalizedCubeMeasure Q = 1 := by + rwa [cubeAverage_eq_integral_normalizedCubeMeasure] at hMean + simpa [cubeAverage_eq_integral_normalizedCubeMeasure] using + integral_sub_const_eq_integral_cutoff_centered_add_integral_one_sub_cutoff_mul + (μ := normalizedCubeMeasure Q) (φ := φ) (F := F) (c := c) + hF_int hφ_int hCut_int hRem_int hMeanInt + +/-- On a child cube, the leftover cutoff factor decomposes as +`1 - φ = ((φ)_R - φ) + (1 - (φ)_R)`. -/ +theorem cubeAverage_one_sub_cutoff_mul_eq_cutoff_oscillation_add_mean_defect + {d : ℕ} (R : TriadicCube d) (φ F : Vec d → ℝ) + (hOsc : + IntegrableOn + (fun x => (cubeAverage R φ - φ x) * F x) + (cubeSet R) volume) + (hF : IntegrableOn F (cubeSet R) volume) : + cubeAverage R (fun x => (1 - φ x) * F x) = + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x) + + (1 - cubeAverage R φ) * cubeAverage R F := by + have hOsc_norm : + Integrable + (fun x => (cubeAverage R φ - φ x) * F x) + (normalizedCubeMeasure R) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R hOsc + have hMeanDef_norm : + Integrable + (fun x => (1 - cubeAverage R φ) * F x) + (normalizedCubeMeasure R) := + (integrable_normalizedCubeMeasure_of_integrableOn_cubeSet R hF).const_mul + (1 - cubeAverage R φ) + calc + cubeAverage R (fun x => (1 - φ x) * F x) + = ∫ x, (1 - φ x) * F x ∂ normalizedCubeMeasure R := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = + ∫ x, + (cubeAverage R φ - φ x) * F x + + (1 - cubeAverage R φ) * F x ∂ normalizedCubeMeasure R := by + refine integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => by ring + _ = + ∫ x, (cubeAverage R φ - φ x) * F x ∂ normalizedCubeMeasure R + + ∫ x, (1 - cubeAverage R φ) * F x ∂ normalizedCubeMeasure R := by + rw [integral_add hOsc_norm hMeanDef_norm] + _ = + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x) + + (1 - cubeAverage R φ) * cubeAverage R F := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure, + integral_const_mul] + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- Descendant partition of the leftover cutoff energy term. -/ +theorem cubeAverage_one_sub_cutoff_mul_eq_descendantsAverage_cutoff_oscillation_add_mean_defect + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (φ F : Vec d → ℝ) + (hRem : + IntegrableOn + (fun x => (1 - φ x) * F x) (cubeSet Q) volume) + (hOsc : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => (cubeAverage R φ - φ x) * F x) + (cubeSet R) volume) + (hF : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn F (cubeSet R) volume) : + cubeAverage Q (fun x => (1 - φ x) * F x) = + descendantsAverage Q j fun R => + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x) + + (1 - cubeAverage R φ) * cubeAverage R F := by + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => (1 - φ x) * F x) hRem] + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + exact + cubeAverage_one_sub_cutoff_mul_eq_cutoff_oscillation_add_mean_defect + R φ F (hOsc R hR) (hF R hR) + +/-- Congruence for descendant averages at a fixed depth. -/ +theorem descendantsAverage_congr_of_eq_on_descendants {d : ℕ} + (Q : TriadicCube d) (j : ℕ) {F G : TriadicCube d → ℝ} + (h : ∀ R ∈ descendantsAtDepth Q j, F R = G R) : + descendantsAverage Q j F = descendantsAverage Q j G := by + unfold descendantsAverage + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum F = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum G + congr 1 + exact Finset.sum_congr rfl h + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Basic.lean new file mode 100644 index 0000000000..dcb88bba96 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Basic.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.Common + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# Basic + +Basic right-hand-side definitions for the first Section 5.3 lemma. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Private right-hand side for the cutoff-product estimate used in the first +Section 5.3 lemma. This is just the active deterministic cutoff-product +bound, renamed with the roles used in the manuscript proof. -/ +noncomputable def cutoffProductBridgeRHS {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (cutoffGradient : Vec d → Vec d) + (fluxWeakOne fluxWeakS fluxAverage cutoffCircOne poincareConst + cutoffConstant centeredCutoffConstant : ℝ) : ℝ := + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * fluxWeakOne)) * cutoffConstant) + + ((d : ℝ) * + (fluxAverage * (cubeLpNorm Q ∞ cutoffGradient * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * fluxWeakS)) * + (cubeBesovScaleWeight s Q * centeredCutoffConstant)))) + +/-- Private coefficient in the manuscript product estimate after centering the +potential and applying Ch01's legacy disjoint-Besov cutoff-product bound. -/ +noncomputable def cutoffProductScaledWeakNormCoeff {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s t B : ℝ) (cutoffGradient : Vec d → Vec d) : ℝ := + let gradCoeff := + (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ cutoffGradient) * + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Fintype.card (Fin d) : ℝ)) + let fluxCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + (1 - s)) * + cubeBesovScaleWeight (-(1 - s - t)) Q) + gradCoeff * fluxCoeff + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CanonicalFields.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CanonicalFields.lean new file mode 100644 index 0000000000..4ba7c97798 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CanonicalFields.lean @@ -0,0 +1,495 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Averages + +/-! # Canonical Fields -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# CanonicalFields + +Canonical scalar maximizer fields and Ch4 extraction identities. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- A Chapter 2 coefficient object is a spatially a.e. elliptic field on its +public domain. -/ +theorem ch02_coeffOn_isAEEllipticFieldOn {d : ℕ} {U : Ch02.Domain d} + (a : Ch02.CoeffOn U) : + IsAEEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField := + ⟨U.measurableSet, a.aeStronglyMeasurable, a.aeElliptic⟩ + +/-- Private raw Chapter 2 canonical maximizer on a cube. This is a local +Section 5.3 adapter for deterministic estimates; the measurable selected +observables remain the Ch4 Hilbert-field definitions. -/ +noncomputable def canonicalMaximizerSolutionOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : + Ch02.Solution (Ch02.cubeDomain Q) a := + (Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) a) p q).toSolution + +/-- The affine comparison function `ell_p0(x) = p0 dot x`, used only inside +the private product-term reduction. -/ +noncomputable def linearPotential {d : ℕ} (p0 : Vec d) : Vec d → ℝ := + fun x => vecDot p0 x + +/-- Continuous-linear version of `linearPotential`, used to compute its +Fréchet derivative without exposing another public definition. -/ +noncomputable def linearPotentialCLM {d : ℕ} (p0 : Vec d) : + Vec d →L[ℝ] ℝ := + ∑ i : Fin d, (p0 i) • (ContinuousLinearMap.proj (R := ℝ) i) + +theorem linearPotential_eq_linearPotentialCLM {d : ℕ} + (p0 : Vec d) : + linearPotential p0 = fun x => linearPotentialCLM p0 x := by + funext x + simp [linearPotential, linearPotentialCLM, vecDot] + +theorem linearPotentialCLM_apply_basisVec {d : ℕ} + (p0 : Vec d) (i : Fin d) : + linearPotentialCLM p0 (basisVec i) = p0 i := by + rw [linearPotentialCLM] + simp only [_root_.sum_apply, _root_.smul_apply, + ContinuousLinearMap.proj_apply] + rw [Finset.sum_eq_single i] + · simp [basisVec] + · intro j _hj hji + simp [basisVec, hji] + · intro hi + exact False.elim (hi (Finset.mem_univ i)) + +theorem fderiv_linearPotential_apply_basisVec {d : ℕ} + (p0 x : Vec d) (i : Fin d) : + (fderiv ℝ (linearPotential p0) x) (basisVec i) = p0 i := by + rw [linearPotential_eq_linearPotentialCLM p0] + have hfd : + fderiv ℝ (fun x => linearPotentialCLM p0 x) x = + linearPotentialCLM p0 := by + exact ContinuousLinearMap.fderiv (linearPotentialCLM p0) + rw [hfd] + exact linearPotentialCLM_apply_basisVec p0 i + +/-- `ell_p0` as an `H¹` function on the parent open cube. -/ +noncomputable def linearPotentialH1OnCube {d : ℕ} + (Q : TriadicCube d) (p0 : Vec d) : + H1Function ((Ch02.cubeDomain Q : Ch02.Domain d) : Set (Vec d)) := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (U := ((Ch02.cubeDomain Q : Ch02.Domain d) : Set (Vec d))) + (f := linearPotential p0) (Ch02.cubeDomain Q).isDomain (by + unfold linearPotential vecDot + fun_prop) + +@[simp] theorem linearPotentialH1OnCube_toFun {d : ℕ} + (Q : TriadicCube d) (p0 : Vec d) : + (linearPotentialH1OnCube Q p0).toFun = linearPotential p0 := + rfl + +@[simp] theorem linearPotentialH1OnCube_grad {d : ℕ} + (Q : TriadicCube d) (p0 : Vec d) : + (linearPotentialH1OnCube Q p0).grad = fun _ => p0 := by + funext x i + simp [linearPotentialH1OnCube, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, + fderiv_linearPotential_apply_basisVec] + +/-- Private potential defect `v_m - ell_p0` for the raw canonical maximizer. -/ +noncomputable def canonicalMaximizerPotentialDefectOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : Vec d → ℝ := + fun x => (canonicalMaximizerSolutionOnCube Q a p q).toH1.toFun x - + linearPotential p0 x + +/-- Raw gradient field of the canonical maximizer on a cube. -/ +noncomputable def canonicalMaximizerGradientOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : Vec d → Vec d := + fun x => (canonicalMaximizerSolutionOnCube Q a p q).toH1.grad x + +/-- Private gradient defect `grad v_m - p0` for the raw canonical maximizer. -/ +noncomputable def canonicalMaximizerGradientDefectOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : Vec d → Vec d := + fun x => canonicalMaximizerGradientOnCube Q a p q x - p0 + +/-- Raw flux field of the canonical maximizer on a cube. -/ +noncomputable def canonicalMaximizerFluxOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : Vec d → Vec d := + fun x => matVecMul (a.toCoeffField x) + (canonicalMaximizerGradientOnCube Q a p q x) + +/-- Private flux defect `a grad v_m - q0` for the raw canonical maximizer. -/ +noncomputable def canonicalMaximizerFluxDefectOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q q0 : Vec d) : Vec d → Vec d := + fun x => canonicalMaximizerFluxOnCube Q a p q x - q0 + +/-- `v_m - ell_p0` as an `H¹` function on the parent open cube. -/ +noncomputable def canonicalMaximizerPotentialDefectH1OnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : + H1Function ((Ch02.cubeDomain Q : Ch02.Domain d) : Set (Vec d)) := + (canonicalMaximizerSolutionOnCube Q a p q).toH1 - + linearPotentialH1OnCube Q p0 + +@[simp] theorem canonicalMaximizerPotentialDefectH1OnCube_toFun {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : + (canonicalMaximizerPotentialDefectH1OnCube Q a p q p0).toFun = + canonicalMaximizerPotentialDefectOnCube Q a p q p0 := by + funext x + show ((canonicalMaximizerSolutionOnCube Q a p q).toH1 - linearPotentialH1OnCube Q p0) x = + canonicalMaximizerPotentialDefectOnCube Q a p q p0 x + rw [congrFun (H1Function.sub_toFun _ _) x] + simp [canonicalMaximizerPotentialDefectOnCube] + +@[simp] theorem canonicalMaximizerPotentialDefectH1OnCube_grad {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : + (canonicalMaximizerPotentialDefectH1OnCube Q a p q p0).grad = + fun x => canonicalMaximizerGradientOnCube Q a p q x - p0 := by + funext x i + show ((canonicalMaximizerSolutionOnCube Q a p q).toH1 - linearPotentialH1OnCube Q p0).grad x i = + canonicalMaximizerGradientOnCube Q a p q x i - p0 i + rw [congrFun (congrFun (H1Function.sub_grad _ _) x) i] + simp [canonicalMaximizerGradientOnCube] + +/-- The raw canonical maximizer potential defect is `L²` on the normalized +cube. This is deterministic `H¹` membership plus the smooth affine comparison, +not a law/measurability fact. -/ +theorem canonicalMaximizerPotentialDefectOnCube_memLp {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : + MemLp (canonicalMaximizerPotentialDefectOnCube Q a p q p0) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hv : + MemLp (fun x => (canonicalMaximizerSolutionOnCube Q a p q).toH1.toFun x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [Ch02.cubeDomain_coe] using + (canonicalMaximizerSolutionOnCube Q a p q).toH1.memL2_normalizedCubeMeasure + have hlin : MemLp (linearPotential p0) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + let u : H1Function (openCubeSet Q) := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (U := openCubeSet Q) (f := linearPotential p0) + (isOpenBoundedConvexDomain_openCubeSet Q) (by + unfold linearPotential vecDot + fun_prop) + simpa [u] using! u.memL2_normalizedCubeMeasure + simpa [canonicalMaximizerPotentialDefectOnCube] using! hv.sub hlin + +/-- The raw canonical maximizer gradient defect is `L²` on the normalized cube. -/ +theorem canonicalMaximizerGradientDefectOnCube_memLp {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) : + MemLp (canonicalMaximizerGradientDefectOnCube Q a p q p0) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hgradOpen : + MemVectorL2 (openCubeSet Q) (canonicalMaximizerGradientOnCube Q a p q) := by + simpa [canonicalMaximizerGradientOnCube, canonicalMaximizerSolutionOnCube, + Ch02.cubeDomain_coe] using! + (canonicalMaximizerSolutionOnCube Q a p q).toH1.grad_memVectorL2 + have hgrad : + MemLp (canonicalMaximizerGradientOnCube Q a p q) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet Q hgradOpen + have hconst : + MemLp (fun _ : Vec d => p0) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using + (MeasureTheory.memLp_const + (μ := normalizedCubeMeasure Q) (p := (2 : ℝ≥0∞)) (c := p0)) + simpa [canonicalMaximizerGradientDefectOnCube] using! hgrad.sub hconst + +/-- The raw canonical maximizer flux defect is `L²` on the normalized cube. + +The coefficient object is only a.e.-elliptic, so the flux bound is delegated to +the public Ch2 source theorem `Solution.flux_memVectorL2`, which hides the +pointwise-good representative used in its proof. -/ +theorem canonicalMaximizerFluxDefectOnCube_memLp {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q q0 : Vec d) : + MemLp (canonicalMaximizerFluxDefectOnCube Q a p q q0) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hfluxOpen : + MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (a.toCoeffField x) + ((canonicalMaximizerSolutionOnCube Q a p q).toH1.grad x)) := by + simpa [Ch02.cubeDomain_coe] using! + Ch02.Solution.flux_memVectorL2 (canonicalMaximizerSolutionOnCube Q a p q) + have hflux : + MemLp + (fun x => matVecMul (a.toCoeffField x) + ((canonicalMaximizerSolutionOnCube Q a p q).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet Q hfluxOpen + have hconst : + MemLp (fun _ : Vec d => q0) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using + (MeasureTheory.memLp_const + (μ := normalizedCubeMeasure Q) (p := (2 : ℝ≥0∞)) (c := q0)) + simpa [canonicalMaximizerFluxDefectOnCube] using! hflux.sub hconst + +theorem canonicalMaximizerGradientOnCube_memLp_descendant {d : ℕ} + (Q R : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + MemLp (canonicalMaximizerGradientOnCube Q a p q) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + have hgradOpen : + MemVectorL2 (openCubeSet Q) + (canonicalMaximizerGradientOnCube Q a p q) := by + simpa [canonicalMaximizerGradientOnCube, canonicalMaximizerSolutionOnCube, + Ch02.cubeDomain_coe] using! + (canonicalMaximizerSolutionOnCube Q a p q).toH1.grad_memVectorL2 + have hgradOpenR : + MemVectorL2 (openCubeSet R) + (canonicalMaximizerGradientOnCube Q a p q) := by + exact hgradOpen.mono_measure (by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + exact memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet R hgradOpenR + +theorem cubeAverageVec_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q p0 : Vec d) : + cubeAverageVec R + (canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) = + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - p0 := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hgrad : + MemLp (canonicalMaximizerGradientOnCube Q aQ p q) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + canonicalMaximizerGradientOnCube_memLp_descendant Q R aQ hR p q + have hch04 : + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun = + cubeAverageVec R (canonicalMaximizerGradientOnCube Q aQ p q) := by + simpa [F, aQ, canonicalMaximizerGradientOnCube, canonicalMaximizerSolutionOnCube] + using! + Ch04.canonicalScalarResponseGradientAverageCubeSet_eq_cubeAverageVec_canonicalMaximizer + a ha hR p q + calc + cubeAverageVec R + (canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) = + cubeAverageVec R (fun x => canonicalMaximizerGradientOnCube Q aQ p q x - p0) := by + rfl + _ = cubeAverageVec R (canonicalMaximizerGradientOnCube Q aQ p q) - p0 := by + simpa using cubeAverageVec_sub_const R (canonicalMaximizerGradientOnCube Q aQ p q) p0 hgrad + _ = Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - p0 := by + rw [hch04] + +theorem cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q p0 : Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) = + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun := by + unfold cubeBesovNegativeVectorPartialSeminorm + cubeBesovNegativeVectorDepthSeminorm cubeBesovNegativeVectorDepthAverage + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet + refine Finset.sum_congr rfl ?_ + intro j hj + apply congrArg (fun z : ℝ => Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt z) + unfold descendantsAverage + apply congrArg (fun z : ℝ => (((descendantsAtDepth Q j).card : ℝ)⁻¹) * z) + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeAverageVec_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha hR p q p0] + +theorem cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (N : ℕ) (p q p0 : Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) ≤ + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hRawBdd : + BddAbove (Set.range fun M : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s M + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0)) := + cubeBesovNegativeVectorPartialSeminorm_bddAbove_of_memLp Q hs + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) + (canonicalMaximizerGradientDefectOnCube_memLp Q aQ p q p0) + rcases hRawBdd with ⟨B, hB⟩ + have hCh4Bdd : + BddAbove (Set.range fun M : ℕ => + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s M p q p0 a.toFun) := by + refine ⟨B, ?_⟩ + rintro x ⟨M, rfl⟩ + have hRaw : + cubeBesovNegativeVectorPartialSeminorm Q s M + (canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) ≤ B := by + simpa [F, aQ] using hB ⟨M, rfl⟩ + simpa [cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha Q s M p q p0] using hRaw + rw [cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha Q s N p q p0] + exact le_csSup hCh4Bdd ⟨N, rfl⟩ + +theorem canonicalMaximizerFluxOnCube_memLp_descendant {d : ℕ} + (Q R : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + MemLp (canonicalMaximizerFluxOnCube Q a p q) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + have hfluxOpen : + MemVectorL2 (openCubeSet Q) + (canonicalMaximizerFluxOnCube Q a p q) := by + simpa [canonicalMaximizerFluxOnCube, canonicalMaximizerGradientOnCube, + canonicalMaximizerSolutionOnCube, Ch02.cubeDomain_coe] using! + Ch02.Solution.flux_memVectorL2 (canonicalMaximizerSolutionOnCube Q a p q) + have hfluxOpenR : + MemVectorL2 (openCubeSet R) + (canonicalMaximizerFluxOnCube Q a p q) := by + exact hfluxOpen.mono_measure (by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + exact memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet R hfluxOpenR + +theorem cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q q0 : Vec d) : + cubeAverageVec R + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) = + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - q0 := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hflux : + MemLp (canonicalMaximizerFluxOnCube Q aQ p q) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + canonicalMaximizerFluxOnCube_memLp_descendant Q R aQ hR p q + have hch04 : + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun = + cubeAverageVec R (canonicalMaximizerFluxOnCube Q aQ p q) := by + simpa [F, aQ, canonicalMaximizerFluxOnCube, canonicalMaximizerGradientOnCube, + canonicalMaximizerSolutionOnCube] using! + Ch04.canonicalScalarResponseFluxAverageCubeSet_eq_cubeAverageVec_canonicalMaximizerFlux + a ha hR p q + calc + cubeAverageVec R + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) = + cubeAverageVec R (fun x => canonicalMaximizerFluxOnCube Q aQ p q x - q0) := by + rfl + _ = cubeAverageVec R (canonicalMaximizerFluxOnCube Q aQ p q) - q0 := by + simpa using cubeAverageVec_sub_const R (canonicalMaximizerFluxOnCube Q aQ p q) q0 hflux + _ = Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - q0 := by + rw [hch04] + +theorem cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (p q q0 : Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) = + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q s N p q q0 a.toFun := by + unfold cubeBesovNegativeVectorPartialSeminorm + cubeBesovNegativeVectorDepthSeminorm cubeBesovNegativeVectorDepthAverage + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet + refine Finset.sum_congr rfl ?_ + intro j hj + apply congrArg (fun z : ℝ => Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt z) + unfold descendantsAverage + apply congrArg (fun z : ℝ => (((descendantsAtDepth Q j).card : ℝ)⁻¹) * z) + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha hR p q q0] + +theorem cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (N : ℕ) (p q q0 : Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) ≤ + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hRawBdd : + BddAbove (Set.range fun M : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s M + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0)) := + cubeBesovNegativeVectorPartialSeminorm_bddAbove_of_memLp Q hs + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) + (canonicalMaximizerFluxDefectOnCube_memLp Q aQ p q q0) + rcases hRawBdd with ⟨B, hB⟩ + have hCh4Bdd : + BddAbove (Set.range fun M : ℕ => + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q s M p q q0 a.toFun) := by + refine ⟨B, ?_⟩ + rintro x ⟨M, rfl⟩ + have hRaw : + cubeBesovNegativeVectorPartialSeminorm Q s M + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) ≤ B := by + simpa [F, aQ] using hB ⟨M, rfl⟩ + simpa [cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha Q s M p q q0] using hRaw + rw [cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha Q s N p q q0] + exact le_csSup hCh4Bdd ⟨N, rfl⟩ + +theorem norm_cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (p q q0 : Vec d) : + ‖cubeAverageVec Q + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0)‖ ≤ + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ := by + rw [cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + (a := a) (ha := ha) (Q := Q) (R := Q) (j := 0) (by simp) p q q0] + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CutoffOscillation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CutoffOscillation.lean new file mode 100644 index 0000000000..75212e26ae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/CutoffOscillation.lean @@ -0,0 +1,183 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.FiveTermSplit + +/-! # Cutoff Oscillation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# CutoffOscillation + +Cutoff oscillation bounds. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- +Second manuscript term: the cutoff oscillation is bounded by its childwise +oscillation size times the parent response. +-/ +theorem abs_cutoffOscillationTermOnCubeAtDepth_le_osc_mul_responseJOnCube + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) {osc : ℝ} + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * topHalfEnergyDensityOnCube Q a p q x) + (cubeSet R) volume) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ osc) : + |cutoffOscillationTermOnCubeAtDepth Q a j φ p q| ≤ + osc * Ch02.responseJ (Ch02.cubeDomain Q) a p q := by + classical + let S : Finset (TriadicCube d) := descendantsAtDepth Q j + let F : Vec d → ℝ := topHalfEnergyDensityOnCube Q a p q + have hS_nonempty : S.Nonempty := by + simpa [S] using descendantsAtDepth_nonempty Q j + have hcard_pos_nat : 0 < S.card := Finset.card_pos.mpr hS_nonempty + have hcard_pos : 0 < (S.card : ℝ) := Nat.cast_pos.mpr hcard_pos_nat + have hinv_nonneg : 0 ≤ ((S.card : ℝ)⁻¹) := inv_nonneg.mpr hcard_pos.le + have hTop_int : IntegrableOn F (cubeSet Q) volume := by + simpa [F] using topHalfEnergyDensityOnCube_integrableOn_cubeSet Q a p q + have hTerm : + ∀ R ∈ S, + |cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)| ≤ + osc * cubeAverage R F := by + intro R hR + have hR' : R ∈ descendantsAtDepth Q j := by simpa [S] using hR + have hsubset : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR' + have hle : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set volume hsubset + have hF_int_R : IntegrableOn F (cubeSet R) volume := + hTop_int.mono_set hsubset + have hF_nonneg_R : 0 ≤ᵐ[volumeMeasureOn (cubeSet R)] F := + (topHalfEnergyDensityOnCube_ae_nonneg_cubeSet Q a p q).filter_mono + (MeasureTheory.ae_mono hle) + have hwf_int : + IntegrableOn (fun x => (cubeAverage R φ - φ x) * F x) + (cubeSet R) volume := by + simpa [F] using hOsc_int R hR' + exact + abs_cubeAverage_mul_nonneg_le_mul_cubeAverage_of_ae_abs_le + R hF_int_R hwf_int hF_nonneg_R (hOscPoint R hR') + have hAbsSum : + |∑ R ∈ S, + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)| ≤ + ∑ R ∈ S, |cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)| := + Finset.abs_sum_le_sum_abs + (s := S) + (f := fun R => + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)) + have hSumBound : + ∑ R ∈ S, |cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)| ≤ + ∑ R ∈ S, osc * cubeAverage R F := + Finset.sum_le_sum fun R hR => hTerm R hR + have hDesc : + descendantsAverage Q j (fun R => cubeAverage R F) = cubeAverage Q F := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := F) hTop_int] + calc + |cutoffOscillationTermOnCubeAtDepth Q a j φ p q| + = + |(S.card : ℝ)⁻¹ * + (∑ R ∈ S, + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x))| := by + simp [cutoffOscillationTermOnCubeAtDepth, descendantsAverage, S, F] + _ = + (S.card : ℝ)⁻¹ * + |∑ R ∈ S, + cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)| := by + rw [abs_mul, abs_of_nonneg hinv_nonneg] + _ ≤ + (S.card : ℝ)⁻¹ * + (∑ R ∈ S, + |cubeAverage R (fun x => (cubeAverage R φ - φ x) * F x)|) := by + exact mul_le_mul_of_nonneg_left hAbsSum hinv_nonneg + _ ≤ (S.card : ℝ)⁻¹ * (∑ R ∈ S, osc * cubeAverage R F) := by + exact mul_le_mul_of_nonneg_left hSumBound hinv_nonneg + _ = osc * descendantsAverage Q j (fun R => cubeAverage R F) := by + simp only [descendantsAverage, S] + rw [← Finset.mul_sum] + ring + _ = osc * cubeAverage Q F := by rw [hDesc] + _ = osc * Ch02.responseJ (Ch02.cubeDomain Q) a p q := by + rw [← responseJOnCube_eq_cubeAverage_topHalfEnergy Q a p q] + +/-- Cutoff-oscillation bound with the product integrability discharged from a +bounded cutoff. -/ +theorem abs_cutoffOscillationTermOnCubeAtDepth_le_scale_mul_responseJOnCube_of_ae_bounded_cutoff + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) {φ : Vec d → ℝ} {B C scaleSep : ℝ} (p q : Vec d) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ C * scaleSep) : + |cutoffOscillationTermOnCubeAtDepth Q a j φ p q| ≤ + C * scaleSep * Ch02.responseJ (Ch02.cubeDomain Q) a p q := by + have hbase := + abs_cutoffOscillationTermOnCubeAtDepth_le_osc_mul_responseJOnCube + (Q := Q) (a := a) (j := j) (φ := φ) (p := p) (q := q) + (osc := C * scaleSep) + (cutoffOscillationTermOnCubeAtDepth_integrableOn_descendants_of_ae_bounded + Q a j p q hφ_meas hφ_bound) + hOscPoint + simpa [mul_assoc] using hbase + +/-- Law-facing form of the cutoff-oscillation bound for the Ch4 dependent +triadic coefficient family. -/ +theorem abs_cutoffOscillationTermOnDependentFamilyAtDepth_le_scale_mul_restrictionResponseJObservableCubeSet_of_ae_bounded_cutoff + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) {φ : Vec d → ℝ} {B C scaleSep : ℝ} + (p q : Vec d) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ C * scaleSep) : + |cutoffOscillationTermOnCubeAtDepth Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + j φ p q| ≤ + C * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a := by + have hraw := + abs_cutoffOscillationTermOnCubeAtDepth_le_scale_mul_responseJOnCube_of_ae_bounded_cutoff + (Q := Q) + (a := (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + (j := j) (φ := φ) (B := B) (C := C) (scaleSep := scaleSep) + p q hφ_meas hφ_bound hOscPoint + simpa [responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha Q p q] + using hraw + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/DeterministicAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/DeterministicAssembly.lean new file mode 100644 index 0000000000..52d6b4c55a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/DeterministicAssembly.lean @@ -0,0 +1,744 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bound + +/-! # Deterministic Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# DeterministicAssembly + +Deterministic manuscript pointwise assembly. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Deterministic assembled Section 5.3 estimate with the actual product term +replaced by the scalar-response weak-norm cutoff-product bridge. The +cutoff-oscillation and linear-pair terms are still displayed separately here; +those are the next deterministic terms to insert before taking expectations. -/ +theorem abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillation_add_linearPair_add_cutoffProductBridgeRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (s : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {C cutoffCircOne cutoffCircS cutoffDerivative poincareConst cutoffConstant + centeredCutoffConstant : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient_eq : cutoffGradient = scalarCutoffGradientField φ) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + intro F + let P : ℝ := + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + have hsplit : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| := by + simpa [F] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillation_add_linearPair_add_product + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + hC hCut hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int hOsc_int hMean + have hprod : + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ P := by + simpa [F, P] using + abs_cutoffProductTermOnDependentFamily_le_cutoffProductBridgeRHS + (Q := Q) (s := s) (a := a) (ha := ha) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hφ hφ_compact hφ_sub hcutoffGradient_eq hcutoffDerivative + hs_pos hs_lt_one hdualField hcutoffGradient hcutoffConstant + hcenteredCutoffConstant hpoincareConst hcutoffCircOne hcutoffCircS + hfull hcutoffSmooth hcutoffDeriv hdualCircOne hdualCircS + hcutoffConstant_bound hcenteredCutoffConstant_bound + exact hsplit.trans (by nlinarith [hprod]) + +/-- Deterministic assembled Section 5.3 estimate with both the cutoff +oscillation term and the product term replaced by their manuscript bounds. +The linear pair is the only displayed deterministic split term still not +inserted here. -/ +theorem abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearPair_add_cutoffProductBridgeRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (s : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {C B Cosc scaleSep cutoffCircOne cutoffCircS cutoffDerivative + poincareConst cutoffConstant centeredCutoffConstant : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hMean : cubeAverage Q φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient_eq : cutoffGradient = scalarCutoffGradientField φ) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + intro F + let P : ℝ := + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + have hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q x) + (cubeSet R) volume := by + simpa [F] using + cutoffOscillationTermOnCubeAtDepth_integrableOn_descendants_of_ae_bounded + Q (F.coeffOn Q) j p q hφ_meas hφ_bound + have hdet : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + P := by + simpa [F, P] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillation_add_linearPair_add_cutoffProductBridgeRHS + (a := a) (ha := ha) (Q := Q) (j := j) (s := s) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (C := C) (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hC hCut hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int + hOsc_int hMean hφ hφ_compact hφ_sub hcutoffGradient_eq + hcutoffDerivative hs_pos hs_lt_one hdualField hcutoffGradient + hcutoffConstant hcenteredCutoffConstant hpoincareConst + hcutoffCircOne hcutoffCircS hfull hcutoffSmooth hcutoffDeriv + hdualCircOne hdualCircS hcutoffConstant_bound hcenteredCutoffConstant_bound + have hosc : + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| ≤ + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a := by + simpa [F] using + abs_cutoffOscillationTermOnDependentFamilyAtDepth_le_scale_mul_restrictionResponseJObservableCubeSet_of_ae_bounded_cutoff + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (B := B) (C := Cosc) (scaleSep := scaleSep) + p q hφ_meas hφ_bound hOscPoint + exact hdet.trans (by nlinarith [hosc]) + +/-- Deterministic assembled Section 5.3 estimate with all four displayed +split terms replaced by their current deterministic manuscript bounds. This +is the pointwise estimate to feed into the expectation step. -/ +theorem abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearWeakNorms_add_cutoffProductBridgeRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (s t : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {C B Cosc scaleSep BφS BφT cutoffCircOne cutoffCircS cutoffDerivative + poincareConst cutoffConstant centeredCutoffConstant : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 x) i) + (cubeSet Q) volume) + (hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0 x) i) + (cubeSet Q) volume) + (hMean : cubeAverage Q φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient_eq : cutoffGradient = scalarCutoffGradientField φ) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak)) + + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + intro F gradWeak fluxWeak gradCoeff fluxCoeff + let P : ℝ := + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + let L : ℝ := + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) + let A : ℝ := + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + have hdet : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + A + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + P := by + simpa [F, P, A, add_assoc] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearPair_add_cutoffProductBridgeRHS + (a := a) (ha := ha) (Q := Q) (j := j) (s := s) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (C := C) (B := B) (Cosc := Cosc) (scaleSep := scaleSep) + (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hC hCut hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int + hMean hφ_meas hφ_bound hOscPoint hφ hφ_compact hφ_sub + hcutoffGradient_eq hcutoffDerivative hs_pos hs_lt_one hdualField + hcutoffGradient hcutoffConstant hcenteredCutoffConstant + hpoincareConst hcutoffCircOne hcutoffCircS hfull hcutoffSmooth + hcutoffDeriv hdualCircOne hdualCircS hcutoffConstant_bound + hcenteredCutoffConstant_bound + have hlin : + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ L := by + simpa [F, gradWeak, fluxWeak, gradCoeff, fluxCoeff, L] using + abs_cutoffLinearPairTermOnDependentFamily_le_ch04WeakNorms_of_cutoffDualBounds + (a := a) (ha := ha) (Q := Q) (s := s) (t := t) + (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (BφS := BφS) (BφT := BφT) + hGradField hFluxField hs_pos ht_pos hBφS hBφT hφDualS hφDualT hφMem + have hreplace : + A + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + P ≤ + A + L + P := + by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (add_le_add_left hlin A) P + have hmain := hdet.trans hreplace + simpa [A, L, P, add_assoc] using hmain + +/-- Deterministic pointwise estimate with the product term in the final +scaled-gradient/scaled-flux weak-norm form. -/ +theorem abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearWeakNorms_add_scaledProduct + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (s t : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + {C B Cosc scaleSep BφS BφT cutoffDerivative : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 x) i) + (cubeSet Q) volume) + (hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0 x) i) + (cubeSet Q) volume) + (hMean : cubeAverage Q φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hst : s + t ≤ 1) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure Q)) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField φ x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ cutoffDerivative) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad := cubeBesovScaleWeight (-s) Q * gradWeak + let scaledFlux := cubeBesovScaleWeight (-t) Q * fluxWeak + let productCoeff := + cutoffProductScaledWeakNormCoeff Q s t cutoffDerivative (scalarCutoffGradientField φ) + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak)) + + productCoeff * (scaledGrad * scaledFlux) := by + intro F gradWeak fluxWeak gradCoeff fluxCoeff scaledGrad scaledFlux productCoeff + let L : ℝ := + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) + let P : ℝ := productCoeff * (scaledGrad * scaledFlux) + let A : ℝ := + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + have hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q x) + (cubeSet R) volume := by + simpa [F] using + cutoffOscillationTermOnCubeAtDepth_integrableOn_descendants_of_ae_bounded + Q (F.coeffOn Q) j p q hφ_meas hφ_bound + have hdet : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| := by + simpa [F] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillation_add_linearPair_add_product + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + hC hCut hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int + hOsc_int hMean + have hosc : + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| ≤ + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a := by + simpa [F] using + abs_cutoffOscillationTermOnDependentFamilyAtDepth_le_scale_mul_restrictionResponseJObservableCubeSet_of_ae_bounded_cutoff + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (B := B) (C := Cosc) (scaleSep := scaleSep) + p q hφ_meas hφ_bound hOscPoint + have hlin : + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ L := by + simpa [F, gradWeak, fluxWeak, gradCoeff, fluxCoeff, L] using + abs_cutoffLinearPairTermOnDependentFamily_le_ch04WeakNorms_of_cutoffDualBounds + (a := a) (ha := ha) (Q := Q) (s := s) (t := t) + (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (BφS := BφS) (BφT := BφT) + hGradField hFluxField hs_pos ht_pos hBφS hBφT hφDualS hφDualT hφMem + have hprod : + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ P := by + simpa [F, gradWeak, fluxWeak, scaledGrad, scaledFlux, productCoeff, P, + cutoffProductScaledWeakNormCoeff] using + abs_cutoffProductTermOnDependentFamily_le_scaledWeakNormProduct + (Q := Q) (s := s) (t := t) hs_pos hs_lt_one ht_pos hst + (a := a) (ha := ha) (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (B := cutoffDerivative) hcutoffDerivative + hφ hφ_compact hφ_sub hcutoffGradient hcutoffSmooth hcutoffDeriv + have hreplace : + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ + A + L + P := by + nlinarith [hosc, hlin, hprod] + exact hdet.trans (by simpa [A, L, P, add_assoc] using hreplace) + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/EnergyDensities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/EnergyDensities.lean new file mode 100644 index 0000000000..39c93e637f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/EnergyDensities.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CanonicalFields + +/-! # Energy Densities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# EnergyDensities + +Energy densities, product densities, and integrability facts. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Parent half-energy density `1/2 ∇v · a∇v`. -/ +noncomputable def topHalfEnergyDensityOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : Vec d → ℝ := + fun x => (1 / 2 : ℝ) * + Ch02.variationEnergyIntegrand (Ch02.cubeDomain Q) a + (canonicalMaximizerSolutionOnCube Q a p q) x + +/-- Centered raw Ch2 response on a cube. -/ +noncomputable def centeredResponseJOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : ℝ := + Ch02.responseJ (Ch02.cubeDomain Q) a p q - + (1 / 2 : ℝ) * vecDot p0 q0 + +/-- The product density in the centered splitting. -/ +noncomputable def centeredProductDensityOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : Vec d → ℝ := + fun x => + (1 / 2 : ℝ) * + vecDot (canonicalMaximizerGradientOnCube Q a p q x - p0) + (canonicalMaximizerFluxOnCube Q a p q x - q0) + +/-- The `q0` linear density in the centered splitting. -/ +noncomputable def centeredGradientLinearDensityOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : Vec d → ℝ := + fun x => (1 / 2 : ℝ) * + vecDot q0 (canonicalMaximizerGradientOnCube Q a p q x - p0) + +/-- The `p0` linear density in the centered splitting. -/ +noncomputable def centeredFluxLinearDensityOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : Vec d → ℝ := + fun x => (1 / 2 : ℝ) * + vecDot p0 (canonicalMaximizerFluxOnCube Q a p q x - q0) + +/-- The cutoff product term in the deterministic centered split. -/ +noncomputable def cutoffProductTermOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : ℝ := + cubeAverage Q (fun x => φ x * centeredProductDensityOnCube Q a p q p0 q0 x) + +/-- The cutoff oscillation term in the deterministic centered split. -/ +noncomputable def cutoffOscillationTermOnCubeAtDepth {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) : ℝ := + descendantsAverage Q j fun R => + cubeAverage R + (fun x => (cubeAverage R φ - φ x) * topHalfEnergyDensityOnCube Q a p q x) + +/-- The mean-defect parent-energy term before child-energy replacement. -/ +noncomputable def meanDefectTopEnergyTermOnCubeAtDepth {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) : ℝ := + descendantsAverage Q j fun R => + (1 - cubeAverage R φ) * + cubeAverage R (topHalfEnergyDensityOnCube Q a p q) + +/-- Scalar additivity-cross term, indexed by child cubes. -/ +noncomputable def additivityCrossTermOnCubeAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) + (cross : TriadicCube d → ℝ) : ℝ := + descendantsAverage Q j fun R => + (1 - cubeAverage R φ) * cross R + +/-- The cutoff `q0` linear term. -/ +noncomputable def cutoffGradientLinearTermOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : ℝ := + cubeAverage Q + (fun x => φ x * centeredGradientLinearDensityOnCube Q a p q p0 q0 x) + +/-- The cutoff `p0` linear term. -/ +noncomputable def cutoffFluxLinearTermOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : ℝ := + cubeAverage Q + (fun x => φ x * centeredFluxLinearDensityOnCube Q a p q p0 q0 x) + +/-- The two cutoff linear terms, in manuscript order. -/ +noncomputable def cutoffLinearPairTermOnCube {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : ℝ := + cutoffGradientLinearTermOnCube Q a φ p q p0 q0 + + cutoffFluxLinearTermOnCube Q a φ p q p0 q0 + +/-- Cutoff-weighted child response for a deterministic triadic coefficient +family. -/ +noncomputable def cutoffWeightedChildResponseJOnFamilyAtDepth {d : ℕ} + (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) (j : ℕ) + (φ : Vec d → ℝ) (p q : Vec d) : ℝ := + descendantsAverage Q j fun R => + cutoffChildWeight φ R * + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q + +/-- Pure vector algebra behind the product plus two linear terms. -/ +theorem centered_product_add_linear_terms_eq_half_vecDot_sub_half_vecDot + {d : ℕ} (g f p0 q0 : Vec d) : + (1 / 2 : ℝ) * vecDot (g - p0) (f - q0) + + (1 / 2 : ℝ) * vecDot q0 (g - p0) + + (1 / 2 : ℝ) * vecDot p0 (f - q0) = + (1 / 2 : ℝ) * vecDot g f - (1 / 2 : ℝ) * vecDot p0 q0 := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, vecDot_comm] + ring + +/-- Pointwise algebra turning the parent energy into product plus linear terms. -/ +theorem centeredProduct_add_linear_densities_eq_topHalfEnergy_sub_half_dot + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) (x : Vec d) : + centeredProductDensityOnCube Q a p q p0 q0 x + + centeredGradientLinearDensityOnCube Q a p q p0 q0 x + + centeredFluxLinearDensityOnCube Q a p q p0 q0 x = + topHalfEnergyDensityOnCube Q a p q x - + (1 / 2 : ℝ) * vecDot p0 q0 := by + calc + centeredProductDensityOnCube Q a p q p0 q0 x + + centeredGradientLinearDensityOnCube Q a p q p0 q0 x + + centeredFluxLinearDensityOnCube Q a p q p0 q0 x = + (1 / 2 : ℝ) * + vecDot (canonicalMaximizerGradientOnCube Q a p q x) + (canonicalMaximizerFluxOnCube Q a p q x) - + (1 / 2 : ℝ) * vecDot p0 q0 := by + exact centered_product_add_linear_terms_eq_half_vecDot_sub_half_vecDot + (canonicalMaximizerGradientOnCube Q a p q x) + (canonicalMaximizerFluxOnCube Q a p q x) p0 q0 + _ = topHalfEnergyDensityOnCube Q a p q x - + (1 / 2 : ℝ) * vecDot p0 q0 := by + simp [topHalfEnergyDensityOnCube, Ch02.variationEnergyIntegrand, + canonicalMaximizerGradientOnCube, canonicalMaximizerFluxOnCube, + vecDot_matVecMul_symmPart] + +/-- Raw response as a parent half-energy average, centered by `p0 · q0 / 2`. -/ +theorem centeredResponseJOnCube_eq_cubeAverage_topHalfEnergy_sub_half_dot + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : + centeredResponseJOnCube Q a p q p0 q0 = + cubeAverage Q (topHalfEnergyDensityOnCube Q a p q) - + (1 / 2 : ℝ) * vecDot p0 q0 := by + rw [centeredResponseJOnCube] + rw [Ch02.responseJ_eq_energy_of_isResponseMaximizer + ((Ch02.canonicalMaximizer + (Ch02.responseExistenceTheory (Ch02.cubeDomain Q) a) p q).isMaximizer)] + rw [Ch02.variationEnergyValue, ch02_average_cubeDomain_eq_cubeAverage] + rw [← cubeAverage_const_mul] + rfl + +/-- Raw response as a parent half-energy average. -/ +theorem responseJOnCube_eq_cubeAverage_topHalfEnergy + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : + Ch02.responseJ (Ch02.cubeDomain Q) a p q = + cubeAverage Q (topHalfEnergyDensityOnCube Q a p q) := by + have h := + centeredResponseJOnCube_eq_cubeAverage_topHalfEnergy_sub_half_dot + Q a p q (0 : Vec d) (0 : Vec d) + simpa [centeredResponseJOnCube] using h + +/-- The Chapter 2 energy integrand of a public solution is locally integrable. -/ +theorem ch02_variationEnergyIntegrand_integrableOn {d : ℕ} + (U : Ch02.Domain d) (a : Ch02.CoeffOn U) (v : Ch02.Solution U a) : + IntegrableOn (Ch02.variationEnergyIntegrand U a v) + (U : Set (Vec d)) volume := by + have hEll : IsAEEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField := + ch02_coeffOn_isAEEllipticFieldOn a + have hflux : MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x)) := + hEll.memVectorL2_matVecMul v.toH1.grad_memVectorL2 + have hUnsym : + IntegrableOn + (fun x => vecDot (v.toH1.grad x) + (matVecMul (a.toCoeffField x) (v.toH1.grad x))) + (U : Set (Vec d)) volume := + integrableOn_vecDot_of_memVectorL2 v.toH1.grad_memVectorL2 hflux + refine hUnsym.congr_fun ?_ U.measurableSet + intro x _hx + exact (vecDot_matVecMul_symmPart (a.toCoeffField x) (v.toH1.grad x)).symm + +/-- The Chapter 2 response integrand of a public solution is locally +integrable. -/ +theorem ch02_responseIntegrand_integrableOn {d : ℕ} + (U : Ch02.Domain d) (a : Ch02.CoeffOn U) (p q : Vec d) + (v : Ch02.Solution U a) : + IntegrableOn (Ch02.responseIntegrand U a p q v) + (U : Set (Vec d)) volume := by + have hEnergy : + IntegrableOn + (fun x => + (1 / 2 : ℝ) * + Ch02.variationEnergyIntegrand U a v x) + (U : Set (Vec d)) volume := + (ch02_variationEnergyIntegrand_integrableOn U a v).const_mul (1 / 2 : ℝ) + have hEll : IsAEEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField := + ch02_coeffOn_isAEEllipticFieldOn a + have hFluxMem : + MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x)) := + hEll.memVectorL2_matVecMul v.toH1.grad_memVectorL2 + have hFluxPair : + IntegrableOn + (fun x => vecDot p (matVecMul (a.toCoeffField x) (v.toH1.grad x))) + (U : Set (Vec d)) volume := + CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 p hFluxMem + have hGradPair : + IntegrableOn (fun x => vecDot q (v.toH1.grad x)) + (U : Set (Vec d)) volume := + CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 q + v.toH1.grad_memVectorL2 + have hAll : + IntegrableOn + (fun x => + -((1 / 2 : ℝ) * + Ch02.variationEnergyIntegrand U a v x) - + vecDot p (matVecMul (a.toCoeffField x) (v.toH1.grad x)) + + vecDot q (v.toH1.grad x)) + (U : Set (Vec d)) volume := + (hEnergy.neg.sub hFluxPair).add hGradPair + refine hAll.congr_fun ?_ U.measurableSet + intro x _hx + simp only [Ch02.responseIntegrand, Ch02.variationEnergyIntegrand] + +/-- The parent half-energy density is integrable on the half-open cube. -/ +theorem topHalfEnergyDensityOnCube_integrableOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : + IntegrableOn (topHalfEnergyDensityOnCube Q a p q) (cubeSet Q) volume := by + have hOpen := + ch02_variationEnergyIntegrand_integrableOn + (Ch02.cubeDomain Q) a (canonicalMaximizerSolutionOnCube Q a p q) + have hCube : + IntegrableOn + (Ch02.variationEnergyIntegrand + (Ch02.cubeDomain Q) a (canonicalMaximizerSolutionOnCube Q a p q)) + (cubeSet Q) volume := by + rw [integrableOn_cubeSet_iff_integrableOn_openCubeSet] + simpa [Ch02.cubeDomain_coe] using hOpen + exact hCube.const_mul (1 / 2 : ℝ) + +/-- The parent half-energy density is nonnegative a.e. on the half-open cube. -/ +theorem topHalfEnergyDensityOnCube_ae_nonneg_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q : Vec d) : + 0 ≤ᵐ[volumeMeasureOn (cubeSet Q)] topHalfEnergyDensityOnCube Q a p q := by + let coeff : CoeffField d := a.toCoeffField + have hEllOpen : + IsAEEllipticFieldOn a.lam a.Lam (openCubeSet Q) coeff := by + simpa [coeff, Ch02.cubeDomain_coe] using + (ch02_coeffOn_isAEEllipticFieldOn a) + have hEll : IsAEEllipticFieldOn a.lam a.Lam (cubeSet Q) coeff := + hEllOpen.cubeSet_of_openCubeSet + filter_upwards [hEll.ae_isEllipticMatrix] with x hxEll + let g : Vec d := canonicalMaximizerGradientOnCube Q a p q x + have hquad_nonneg : + 0 ≤ vecDot g (matVecMul (symmPart (coeff x)) g) := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hxEll g + have hnorm : 0 ≤ vecNormSq g := vecNormSq_nonneg g + have hlam_pos : 0 < a.lam := hxEll.1 + nlinarith + have henergy_nonneg : + 0 ≤ + vecDot ((canonicalMaximizerSolutionOnCube Q a p q).toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) + ((canonicalMaximizerSolutionOnCube Q a p q).toH1.grad x)) := by + simpa [g, coeff, canonicalMaximizerGradientOnCube] using hquad_nonneg + dsimp [topHalfEnergyDensityOnCube, Ch02.variationEnergyIntegrand] + nlinarith + +/-- A bounded a.e.-strongly-measurable multiplier preserves local +integrability. -/ +theorem integrableOn_mul_left_of_integrableOn_of_ae_bounded + {d : ℕ} {U : Set (Vec d)} {φ f : Vec d → ℝ} {C : ℝ} + (hf : IntegrableOn f U volume) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn U)) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn U, ‖φ x‖ ≤ C) : + IntegrableOn (fun x => φ x * f x) U volume := by + have hf_int : Integrable f (volumeMeasureOn U) := by + simpa [IntegrableOn, volumeMeasureOn] using hf + simpa [IntegrableOn, volumeMeasureOn] using + (hf_int.bdd_mul hφ_meas hφ_bound) + +/-- Components of the raw canonical maximizer gradient defect are integrable +on the parent cube. -/ +theorem canonicalMaximizerGradientDefectOnCube_component_integrableOn + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 : Vec d) (i : Fin d) : + IntegrableOn (fun x => canonicalMaximizerGradientDefectOnCube Q a p q p0 x i) + (cubeSet Q) volume := by + have hcomp : + MemLp (fun x => canonicalMaximizerGradientDefectOnCube Q a p q p0 x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_component_of_memLp + (canonicalMaximizerGradientDefectOnCube Q a p q p0) i + (canonicalMaximizerGradientDefectOnCube_memLp Q a p q p0) + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hcomp.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2)) + +/-- Components of the raw canonical maximizer flux defect are integrable on +the parent cube. -/ +theorem canonicalMaximizerFluxDefectOnCube_component_integrableOn + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q q0 : Vec d) (i : Fin d) : + IntegrableOn (fun x => canonicalMaximizerFluxDefectOnCube Q a p q q0 x i) + (cubeSet Q) volume := by + have hcomp : + MemLp (fun x => canonicalMaximizerFluxDefectOnCube Q a p q q0 x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_component_of_memLp + (canonicalMaximizerFluxDefectOnCube Q a p q q0) i + (canonicalMaximizerFluxDefectOnCube_memLp Q a p q q0) + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hcomp.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2)) + +/-- The centered product density in the deterministic Section 5.3 split is +integrable on the parent cube. -/ +theorem centeredProductDensityOnCube_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : + IntegrableOn (centeredProductDensityOnCube Q a p q p0 q0) + (cubeSet Q) volume := by + let gradDef : Vec d → Vec d := canonicalMaximizerGradientDefectOnCube Q a p q p0 + let fluxDef : Vec d → Vec d := canonicalMaximizerFluxDefectOnCube Q a p q q0 + have hgrad : MemLp gradDef (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [gradDef] using canonicalMaximizerGradientDefectOnCube_memLp Q a p q p0 + have hflux : MemLp fluxDef (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [fluxDef] using canonicalMaximizerFluxDefectOnCube_memLp Q a p q q0 + have hdot : + Integrable (fun x => vecDot (gradDef x) (fluxDef x)) + (normalizedCubeMeasure Q) := by + rw [show (fun x => vecDot (gradDef x) (fluxDef x)) = + fun x => ∑ i : Fin d, gradDef x i * fluxDef x i by + funext x + simp [vecDot]] + exact MeasureTheory.integrable_finsetSum _ fun i _ => + (memLp_component_of_memLp gradDef i hgrad).integrable_mul + (memLp_component_of_memLp fluxDef i hflux) + have hprod : + Integrable (centeredProductDensityOnCube Q a p q p0 q0) + (normalizedCubeMeasure Q) := by + change Integrable + (fun x => + (1 / 2 : ℝ) * + vecDot (canonicalMaximizerGradientDefectOnCube Q a p q p0 x) + (canonicalMaximizerFluxDefectOnCube Q a p q q0 x)) + (normalizedCubeMeasure Q) + simpa [gradDef, fluxDef, one_div] using + hdot.const_mul (1 / 2 : ℝ) + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) hprod + +/-- The centered gradient-linear density in the deterministic Section 5.3 +split is integrable on the parent cube. -/ +theorem centeredGradientLinearDensityOnCube_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : + IntegrableOn (centeredGradientLinearDensityOnCube Q a p q p0 q0) + (cubeSet Q) volume := by + let gradDef : Vec d → Vec d := canonicalMaximizerGradientDefectOnCube Q a p q p0 + have hgrad : MemLp gradDef (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [gradDef] using canonicalMaximizerGradientDefectOnCube_memLp Q a p q p0 + have hdot : + Integrable (fun x => vecDot q0 (gradDef x)) (normalizedCubeMeasure Q) := by + rw [show (fun x => vecDot q0 (gradDef x)) = + fun x => ∑ i : Fin d, q0 i * gradDef x i by + funext x + simp [vecDot]] + exact MeasureTheory.integrable_finsetSum _ fun i _ => + ((memLp_component_of_memLp gradDef i hgrad).integrable + (by norm_num : (1 : ℝ≥0∞) ≤ 2)).const_mul (q0 i) + have hlin : + Integrable (centeredGradientLinearDensityOnCube Q a p q p0 q0) + (normalizedCubeMeasure Q) := by + change Integrable + (fun x => + (1 / 2 : ℝ) * + vecDot q0 (canonicalMaximizerGradientDefectOnCube Q a p q p0 x)) + (normalizedCubeMeasure Q) + simpa [gradDef, one_div] using + hdot.const_mul (1 / 2 : ℝ) + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) hlin + +/-- The centered flux-linear density in the deterministic Section 5.3 split +is integrable on the parent cube. -/ +theorem centeredFluxLinearDensityOnCube_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (p q p0 q0 : Vec d) : + IntegrableOn (centeredFluxLinearDensityOnCube Q a p q p0 q0) + (cubeSet Q) volume := by + let fluxDef : Vec d → Vec d := canonicalMaximizerFluxDefectOnCube Q a p q q0 + have hflux : MemLp fluxDef (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [fluxDef] using canonicalMaximizerFluxDefectOnCube_memLp Q a p q q0 + have hdot : + Integrable (fun x => vecDot p0 (fluxDef x)) (normalizedCubeMeasure Q) := by + rw [show (fun x => vecDot p0 (fluxDef x)) = + fun x => ∑ i : Fin d, p0 i * fluxDef x i by + funext x + simp [vecDot]] + exact MeasureTheory.integrable_finsetSum _ fun i _ => + ((memLp_component_of_memLp fluxDef i hflux).integrable + (by norm_num : (1 : ℝ≥0∞) ≤ 2)).const_mul (p0 i) + have hlin : + Integrable (centeredFluxLinearDensityOnCube Q a p q p0 q0) + (normalizedCubeMeasure Q) := by + change Integrable + (fun x => + (1 / 2 : ℝ) * + vecDot p0 (canonicalMaximizerFluxDefectOnCube Q a p q q0 x)) + (normalizedCubeMeasure Q) + simpa [fluxDef, one_div] using + hdot.const_mul (1 / 2 : ℝ) + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) hlin + +/-- A bounded cutoff gives the descendant cutoff-oscillation integrability +condition. -/ +theorem cutoffOscillationTermOnCubeAtDepth_integrableOn_descendants_of_ae_bounded + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) {φ : Vec d → ℝ} {C : ℝ} (p q : Vec d) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ C) : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * topHalfEnergyDensityOnCube Q a p q x) + (cubeSet R) volume := by + intro R hR + have hsubset : cubeSet R ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth hR + have hle : + volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set volume hsubset + have hφ_measR : + AEStronglyMeasurable φ (volumeMeasureOn (cubeSet R)) := + hφ_meas.mono_measure hle + have hφ_boundR : + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), ‖φ x‖ ≤ C := + hφ_bound.filter_mono (MeasureTheory.ae_mono hle) + have hdiff_meas : + AEStronglyMeasurable (fun x : Vec d => cubeAverage R φ - φ x) + (volumeMeasureOn (cubeSet R)) := + (aestronglyMeasurable_const (b := cubeAverage R φ)).sub hφ_measR + have hdiff_bound : + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + ‖cubeAverage R φ - φ x‖ ≤ |cubeAverage R φ| + C := by + filter_upwards [hφ_boundR] with x hx + calc + ‖cubeAverage R φ - φ x‖ = |cubeAverage R φ - φ x| := + Real.norm_eq_abs _ + _ ≤ |cubeAverage R φ| + |φ x| := by + simpa [sub_eq_add_neg] using + abs_add_le (cubeAverage R φ) (-φ x) + _ = |cubeAverage R φ| + ‖φ x‖ := by simp [Real.norm_eq_abs] + _ ≤ |cubeAverage R φ| + C := by nlinarith [hx] + have hTopR : + IntegrableOn (topHalfEnergyDensityOnCube Q a p q) (cubeSet R) volume := + (topHalfEnergyDensityOnCube_integrableOn_cubeSet Q a p q).mono_set hsubset + exact + integrableOn_mul_left_of_integrableOn_of_ae_bounded + hTopR hdiff_meas hdiff_bound + +/-- +Cube-average estimate for a bounded oscillating scalar times a nonnegative +integrable density. +-/ +theorem abs_cubeAverage_mul_nonneg_le_mul_cubeAverage_of_ae_abs_le + {d : ℕ} (R : TriadicCube d) {w f : Vec d → ℝ} {B : ℝ} + (hf_int : IntegrableOn f (cubeSet R) volume) + (hwf_int : IntegrableOn (fun x => w x * f x) (cubeSet R) volume) + (hf_nonneg : 0 ≤ᵐ[volumeMeasureOn (cubeSet R)] f) + (hw_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), |w x| ≤ B) : + |cubeAverage R (fun x => w x * f x)| ≤ + B * cubeAverage R f := by + have hwf_int' : Integrable (fun x => w x * f x) + (volumeMeasureOn (cubeSet R)) := by + simpa [IntegrableOn, volumeMeasureOn] using hwf_int + have habs_int : + Integrable (fun x => |w x * f x|) + (volumeMeasureOn (cubeSet R)) := by + simpa [Real.norm_eq_abs] using hwf_int'.norm + have hBf_int : + Integrable (fun x => B * f x) (volumeMeasureOn (cubeSet R)) := by + have hf_int' : Integrable f (volumeMeasureOn (cubeSet R)) := by + simpa [IntegrableOn, volumeMeasureOn] using hf_int + exact hf_int'.const_mul B + have hpoint : + (fun x => |w x * f x|) ≤ᵐ[volumeMeasureOn (cubeSet R)] + fun x => B * f x := by + filter_upwards [hf_nonneg, hw_bound] with x hf_pos hw + calc + |w x * f x| = |w x| * f x := by + rw [abs_mul, abs_of_nonneg hf_pos] + _ ≤ B * f x := mul_le_mul_of_nonneg_right hw hf_pos + have hint_abs_le : + ∫ x, |w x * f x| ∂ volumeMeasureOn (cubeSet R) ≤ + ∫ x, B * f x ∂ volumeMeasureOn (cubeSet R) := + integral_mono_ae habs_int hBf_int hpoint + rw [cubeAverage] + have hinv_nonneg : 0 ≤ (cubeVolume R)⁻¹ := + inv_nonneg.mpr (cubeVolume_nonneg R) + calc + |(cubeVolume R)⁻¹ * ∫ x in cubeSet R, w x * f x ∂volume| + = (cubeVolume R)⁻¹ * + |∫ x in cubeSet R, w x * f x ∂volume| := by + rw [abs_mul, abs_of_nonneg hinv_nonneg] + _ ≤ (cubeVolume R)⁻¹ * + ∫ x, |w x * f x| ∂ volumeMeasureOn (cubeSet R) := by + exact mul_le_mul_of_nonneg_left abs_integral_le_integral_abs hinv_nonneg + _ ≤ (cubeVolume R)⁻¹ * + ∫ x, B * f x ∂ volumeMeasureOn (cubeSet R) := by + exact mul_le_mul_of_nonneg_left hint_abs_le hinv_nonneg + _ = B * ((cubeVolume R)⁻¹ * ∫ x in cubeSet R, f x ∂volume) := by + rw [integral_const_mul] + ring + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation.lean new file mode 100644 index 0000000000..72b2ce0a72 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.AEBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ExpectedRHSComparison +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptPointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.NormalizedCutoff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.PointwiseBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.RHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.YoungRHS + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/AEBound.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/AEBound.lean new file mode 100644 index 0000000000..9bcd354388 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/AEBound.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptPointwiseBound + +/-! # AEBound -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# AEBound + +Law-relative a.e. pointwise bound for the manuscript RHS. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Law-facing a.e. pointwise bridge from the fixed-coefficient deterministic +split to the manuscript RHS. + +This theorem discharges the coefficient-dependent integrability inputs and the +a.s. ellipticity support. The remaining hypotheses are deterministic cutoff +controls for the still-arbitrary manuscript cutoff `φ`. -/ +theorem ae_abs_centeredJMinusCutoffWeightedChildAtScale_le_jUpperWeakNormManuscriptPointwiseRHS + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (m k : ℤ) (s t : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + {C B Cosc scaleSep BφS BφT cutoffDerivative Cprod : ℝ} + (hC : 0 ≤ C) + (hCut : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + |1 - cubeAverage R φ| ≤ C) + (hMean : cubeAverage (originCube d m) φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet (originCube d m)))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet (originCube d m)), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d m)) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hst : s + t ≤ 1) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal (originCube d m) (2 : ℝ≥0∞) φ) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure (originCube d m))) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField φ x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet (originCube d m), + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ cutoffDerivative) + (hProductCoeff : + cutoffProductScaledWeakNormCoeff (originCube d m) s t cutoffDerivative + (scalarCutoffGradientField φ) * + cubeBesovScaleWeight (-s) (originCube d m) * + cubeBesovScaleWeight (-t) (originCube d m) ≤ Cprod) : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a := by + let Q : TriadicCube d := originCube d m + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hφ_int : IntegrableOn φ (cubeSet Q) volume := by + simpa [Q, volumeMeasureOn] using + (IntegrableOn.of_bound + (μ := volume) (s := cubeSet Q) (f := φ) + (volume_cubeSet_lt_top Q) + (by simpa [Q, volumeMeasureOn] using hφ_meas) B + (by simpa [Q, volumeMeasureOn] using hφ_bound)) + have hOneSub_meas : + AEStronglyMeasurable (fun x : Vec d => (1 : ℝ) - φ x) + (volumeMeasureOn (cubeSet Q)) := by + simpa [sub_eq_add_neg] using! + (aestronglyMeasurable_const (b := (1 : ℝ))).sub + (by simpa [Q] using hφ_meas) + have hOneSub_bound : + ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), + ‖(1 : ℝ) - φ x‖ ≤ |(1 : ℝ)| + B := by + filter_upwards [by simpa [Q] using! hφ_bound] with x hx + calc + ‖(1 : ℝ) - φ x‖ = |(1 : ℝ) - φ x| := Real.norm_eq_abs _ + _ ≤ |(1 : ℝ)| + |φ x| := by + simpa [sub_eq_add_neg] using abs_add_le (1 : ℝ) (-φ x) + _ ≤ |(1 : ℝ)| + B := add_le_add le_rfl hx + have hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q aQ p q x) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + (topHalfEnergyDensityOnCube_integrableOn_cubeSet Q aQ p q) + hOneSub_meas hOneSub_bound + have hProduct_int : + IntegrableOn + (fun x => φ x * centeredProductDensityOnCube Q aQ p q p0 q0 x) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + (centeredProductDensityOnCube_integrableOn_cubeSet Q aQ p q p0 q0) + (by simpa [Q] using hφ_meas) (by simpa [Q] using hφ_bound) + have hGradLinear_int : + IntegrableOn + (fun x => φ x * centeredGradientLinearDensityOnCube Q aQ p q p0 q0 x) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + (centeredGradientLinearDensityOnCube_integrableOn_cubeSet Q aQ p q p0 q0) + (by simpa [Q] using hφ_meas) (by simpa [Q] using hφ_bound) + have hFluxLinear_int : + IntegrableOn + (fun x => φ x * centeredFluxLinearDensityOnCube Q aQ p q p0 q0 x) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + (centeredFluxLinearDensityOnCube_integrableOn_cubeSet Q aQ p q p0 q0) + (by simpa [Q] using hφ_meas) (by simpa [Q] using hφ_bound) + have hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube Q aQ p q p0 x) i) + (cubeSet Q) volume := by + intro i + have hbase := + canonicalMaximizerGradientDefectOnCube_component_integrableOn Q aQ p q p0 i + have hmul : + IntegrableOn + (fun x => φ x * canonicalMaximizerGradientDefectOnCube Q aQ p q p0 x i) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + hbase (by simpa [Q] using hφ_meas) (by simpa [Q] using hφ_bound) + simpa [Pi.smul_apply, smul_eq_mul] using hmul + have hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube Q aQ p q q0 x) i) + (cubeSet Q) volume := by + intro i + have hbase := + canonicalMaximizerFluxDefectOnCube_component_integrableOn Q aQ p q q0 i + have hmul : + IntegrableOn + (fun x => φ x * canonicalMaximizerFluxDefectOnCube Q aQ p q q0 x i) + (cubeSet Q) volume := + integrableOn_mul_left_of_integrableOn_of_ae_bounded + hbase (by simpa [Q] using hφ_meas) (by simpa [Q] using hφ_bound) + simpa [Pi.smul_apply, smul_eq_mul] using hmul + simpa [Q, F, aQ] using + abs_centeredJMinusCutoffWeightedChildAtScale_le_jUpperWeakNormManuscriptPointwiseRHS + (a := a) (ha := ha) (m := m) (k := k) (s := s) (t := t) + (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (C := C) (B := B) (Cosc := Cosc) (scaleSep := scaleSep) + (BφS := BφS) (BφT := BφT) (cutoffDerivative := cutoffDerivative) + (Cprod := Cprod) + hC hCut (by simpa [Q] using hφ_int) + (by simpa [Q, F, aQ] using hRem_int) + (by simpa [Q, F, aQ] using hProduct_int) + (by simpa [Q, F, aQ] using hGradLinear_int) + (by simpa [Q, F, aQ] using hFluxLinear_int) + (by simpa [Q, F, aQ] using hGradField) + (by simpa [Q, F, aQ] using hFluxField) + hMean hφ_meas hφ_bound hOscPoint hφ hφ_compact hφ_sub + hcutoffDerivative hs_pos hs_lt_one ht_pos hst hBφS hBφT + hφDualS hφDualT hφMem hcutoffGradient hcutoffSmooth hcutoffDeriv hProductCoeff + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/Assembly.lean new file mode 100644 index 0000000000..3a8b582b59 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/Assembly.lean @@ -0,0 +1,656 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.AEBound + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ExpectationAssembly + +Final expectation assembly for the first Section 5.3 lemma. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Expectation reduction against the named pointwise RHS for the first +Section 5.3 lemma. This is still private: later steps prove the a.e. bound and +integrability from the deterministic cutoff construction and Ch4 law-facing +surfaces. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_integral_jUpperWeakNormPointwiseRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (s t : ℝ) (φ : Vec d → ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hRHS : + Integrable + (jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0) P) + (hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P := by + exact + integral_centeredJMinusCutoffWeightedChildAtScale_le_integral_of_ae_abs_le + (P := P) hP hstat hk_nonneg hkm φ p q p0 q0 + (jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0) + hφ_int hMean hParent hJ hRHS hBound + +/-- Integrability of the Ch4-facing pointwise RHS from integrability of its +remaining scalar-response weak-norm and cutoff-product components. -/ +theorem integrable_jUpperWeakNormPointwiseRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + {k m : ℤ} (hkm : k ≤ m) + (s t : ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hProduct : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) : + Integrable + (jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let addPoint : RegCoeffField d → ℝ := + fun a => + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) + let oscPoint : RegCoeffField d → ℝ := + fun a => Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + let gradPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak a) + let fluxPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak a) + let productPoint : RegCoeffField d → ℝ := + fun a => + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] + using! hR) + have hChildInt : Integrable childAverage P := by + simpa [childAverage, Q, j] using + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + have hDefectInt : + Integrable (responseJAdditivityDefectAtScale m k p q) P := + integrable_responseJAdditivityDefectAtScale hkm p q hParent hDesc + have hDefectNonneg : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := + responseJAdditivityDefectAtScale_nonneg_ae hP hkm p q + have hChildNonneg : 0 ≤ᵐ[P] childAverage := by + filter_upwards with a + simpa [childAverage, Q, j] using + descendantsAverage_restrictionResponseJObservableCubeSet_nonneg Q j p q a + have hSqrtProdInt : + Integrable + (fun a : RegCoeffField d => + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) P := + integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + (A := responseJAdditivityDefectAtScale m k p q) + (B := childAverage) hDefectInt hChildInt hDefectNonneg hChildNonneg + have hAddInt : Integrable addPoint P := by + simpa [addPoint] using hSqrtProdInt.const_mul (2 * C) + have hOscInt : Integrable oscPoint P := by + simpa [oscPoint, Q] using hParent.const_mul (Cosc * scaleSep) + have hGradInt : Integrable gradPoint P := by + refine + (hGradWeak.const_mul + ((1 / 2 : ℝ) * ‖q0‖ * ((Fintype.card (Fin d) : ℝ) * gradCoeff))).congr ?_ + filter_upwards with a + simp [gradPoint, gradWeak, Q, mul_assoc] + have hFluxInt : Integrable fluxPoint P := by + refine + (hFluxWeak.const_mul + ((1 / 2 : ℝ) * ‖p0‖ * ((Fintype.card (Fin d) : ℝ) * fluxCoeff))).congr ?_ + filter_upwards with a + simp [fluxPoint, fluxWeak, Q, mul_assoc] + have hProductInt : Integrable productPoint P := by + simpa [productPoint, Q] using hProduct + have hSumInt : + Integrable + (fun a : RegCoeffField d => + (addPoint a + oscPoint a) + ((gradPoint a + fluxPoint a) + productPoint a)) P := + (hAddInt.add hOscInt).add ((hGradInt.add hFluxInt).add hProductInt) + refine hSumInt.congr ?_ + filter_upwards with a + simp [jUpperWeakNormPointwiseRHSAtScale, addPoint, oscPoint, gradPoint, + fluxPoint, productPoint, childAverage, gradWeak, fluxWeak, gradCoeff, + fluxCoeff, Q, j, add_assoc, add_comm, mul_assoc] + +/-- Composed expectation assembly for the first Section 5.3 lemma: the +centered parent response is bounded directly by the expected manuscript RHS. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormExpectedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (s t : ℝ) (φ : Vec d → ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hProduct : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) + (hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 := by + have hRHS : + Integrable + (jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0) P := + integrable_jUpperWeakNormPointwiseRHSAtScale + hP hkm s t cutoffGradient C Cosc scaleSep BφS BφT cutoffCircOne + poincareConst cutoffConstant centeredCutoffConstant p q p0 q0 + hParent hJ hGradWeak hFluxWeak hProduct + have hIntegralBound : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P := + expectedResponseJCubeSet_sub_half_dot_le_integral_jUpperWeakNormPointwiseRHSAtScale + hP hstat hk_nonneg hkm s t φ cutoffGradient C Cosc scaleSep BφS BφT + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant p q p0 q0 + hφ_int hMean hParent hJ hRHS hBound + have hExpectedBound : + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P + ≤ + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 := + integral_jUpperWeakNormPointwiseRHSAtScale_le_expectedRHS + hP hstat hk_nonneg hkm s t cutoffGradient C Cosc scaleSep BφS BφT + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant p q p0 q0 + hC hParent hJ hGradWeak hFluxWeak hProduct + exact hIntegralBound.trans hExpectedBound + +/-- Replace the remaining cutoff-product bridge expectation by the +manuscript-facing Cauchy product of note-normalized gradient/flux weak-norm +square expectations. The pointwise product replacement is kept private here; it +is the next deterministic source theorem, not part of the public Section 5.3 +statement. -/ +theorem jUpperWeakNormExpectedRHSAtScale_le_manuscriptExpectedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (m k : ℤ) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) + (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant Cprod : ℝ) + (p q p0 q0 : Vec d) + (hCprod : 0 ≤ Cprod) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) + (hProductInt : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) + (hProductPoint : + ∀ᵐ a ∂P, + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + ≤ + Cprod * + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun)) : + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 + ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + let Q : TriadicCube d := originCube d m + have hprod : + ∫ a, + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant ∂P + ≤ + Cprod * + (Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) ^ 2 ∂P) * + Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) ^ 2 ∂P)) := by + simpa [Q] using + integral_cutoffProductBridgeRHS_le_weakNormSquareProduct + (P := P) hP Q hs ht cutoffGradient cutoffCircOne poincareConst + cutoffConstant centeredCutoffConstant Cprod p q p0 q0 hCprod + hGradSq hFluxSq hProductInt hProductPoint + simpa [jUpperWeakNormExpectedRHSAtScale, + jUpperWeakNormManuscriptExpectedRHSAtScale, Q, add_assoc] using + add_le_add_left hprod + ((2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) + + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q + + ((1 / 2 : ℝ) * ‖q0‖ * + ((((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS)) * + ∫ a, Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun ∂P)) + + (1 / 2 : ℝ) * ‖p0‖ * + ((((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT)) * + ∫ a, Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun ∂P)))) + +/-- Composed private assembly landing on the manuscript-facing expected RHS. +The only remaining non-manuscript input is the private deterministic product +replacement `hProductPoint`, which must be discharged by the next deterministic +cutoff-product theorem rather than exposed publicly. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) + (φ : Vec d → ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant Cprod : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) (hCprod : 0 ≤ Cprod) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) + (hProduct : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) + (hProductPoint : + ∀ᵐ a ∂P, + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + ≤ + Cprod * + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun)) + (hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + have hold : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 := + expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormExpectedRHSAtScale + hP hstat hk_nonneg hkm s t φ cutoffGradient C Cosc scaleSep BφS BφT + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant p q p0 q0 + hC hφ_int hMean hParent hJ hGradWeak hFluxWeak hProduct hBound + have hreplace : + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 + ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := + jUpperWeakNormExpectedRHSAtScale_le_manuscriptExpectedRHSAtScale + hP m k hs ht cutoffGradient C Cosc scaleSep BφS BφT cutoffCircOne + poincareConst cutoffConstant centeredCutoffConstant Cprod p q p0 q0 + hCprod hGradSq hFluxSq hProduct hProductPoint + exact hold.trans hreplace + +/-- Composed expectation assembly through the manuscript pointwise RHS. This +route has no cutoff-product bridge expectation and no `hProductPoint` input. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_manuscriptPointwise + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) + (φ : Vec d → ℝ) + (C Cosc scaleSep BφS BφT Cprod : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) (hCprod : 0 ≤ Cprod) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) + (hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + have hRHS : + Integrable + (jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0) P := + integrable_jUpperWeakNormManuscriptPointwiseRHSAtScale + hP hkm hs ht C Cosc scaleSep BφS BφT Cprod p q p0 q0 + hParent hJ hGradWeak hFluxWeak hGradSq hFluxSq + have hIntegralBound : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + ∫ a, + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a ∂P := + integral_centeredJMinusCutoffWeightedChildAtScale_le_integral_of_ae_abs_le + (P := P) hP hstat hk_nonneg hkm φ p q p0 q0 + (jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0) + hφ_int hMean hParent hJ hRHS hBound + have hExpectedBound : + ∫ a, + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a ∂P + ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := + integral_jUpperWeakNormManuscriptPointwiseRHSAtScale_le_manuscriptExpectedRHSAtScale + hP hstat hk_nonneg hkm hs ht C Cosc scaleSep BφS BφT Cprod p q p0 q0 + hC hCprod hParent hJ hGradWeak hFluxWeak hGradSq hFluxSq + exact hIntegralBound.trans hExpectedBound + +/-- Expectation assembly with the a.e. pointwise bridge supplied by the +deterministic cutoff controls. The remaining inputs are law-facing +integrability/moment facts for the Ch4 observables, not fixed-coefficient proof +packages. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_cutoffControls + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (φ : Vec d → ℝ) + (C B Cosc scaleSep BφS BφT cutoffDerivative Cprod : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) (hCprod : 0 ≤ Cprod) + (hCut : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + |1 - cubeAverage R φ| ≤ C) + (hMean : cubeAverage (originCube d m) φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet (originCube d m)))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet (originCube d m)), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d m)) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal (originCube d m) (2 : ℝ≥0∞) φ) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure (originCube d m))) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField φ x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet (originCube d m), + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ cutoffDerivative) + (hProductCoeff : + cutoffProductScaledWeakNormCoeff (originCube d m) s t cutoffDerivative + (scalarCutoffGradientField φ) * + cubeBesovScaleWeight (-s) (originCube d m) * + cubeBesovScaleWeight (-t) (originCube d m) ≤ Cprod) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + have hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume := by + simpa [volumeMeasureOn] using + (IntegrableOn.of_bound + (μ := volume) (s := cubeSet (originCube d m)) (f := φ) + (volume_cubeSet_lt_top (originCube d m)) + (by simpa [volumeMeasureOn] using hφ_meas) B + (by simpa [volumeMeasureOn] using hφ_bound)) + have hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a := + ae_abs_centeredJMinusCutoffWeightedChildAtScale_le_jUpperWeakNormManuscriptPointwiseRHS + (P := P) hP m k s t φ p q p0 q0 hC hCut hMean hφ_meas hφ_bound + hOscPoint hφ hφ_compact hφ_sub hcutoffDerivative hs hs_lt_one ht hst + hBφS hBφT hφDualS hφDualT hφMem hcutoffGradient hcutoffSmooth hcutoffDeriv + hProductCoeff + exact + expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_manuscriptPointwise + hP hstat hk_nonneg hkm hs ht φ C Cosc scaleSep BφS BφT Cprod p q p0 q0 + hC hCprod hφ_int hMean hParent hJ hGradWeak hFluxWeak hGradSq hFluxSq hBound + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ExpectedRHSComparison.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ExpectedRHSComparison.lean new file mode 100644 index 0000000000..54d9d421d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ExpectedRHSComparison.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ManuscriptRHS + +/-! # Expected RHSComparison -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ExpectedRHSComparison + +Comparison between the preliminary pointwise RHS and the preliminary expected RHS. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Integrating the named pointwise RHS replaces the square-root additivity +piece by the manuscript `sqrt tau * sqrt E[J_k]` term. The remaining +weak-norm and cutoff-product terms stay as expectations of the Ch4 scalar +observables; later steps supply their law-facing integrability. -/ +theorem integral_jUpperWeakNormPointwiseRHSAtScale_le_expectedRHS + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (s t : ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hProduct : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS (originCube d m) s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet + (originCube d m) (originCube d m) p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) : + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P + ≤ + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let addPoint : RegCoeffField d → ℝ := + fun a => + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) + let oscPoint : RegCoeffField d → ℝ := + fun a => Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + let gradPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak a) + let fluxPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak a) + let productPoint : RegCoeffField d → ℝ := + fun a => + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] + using! hR) + have hChildInt : Integrable childAverage P := by + simpa [childAverage, Q, j] using + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + have hDefectInt : + Integrable (responseJAdditivityDefectAtScale m k p q) P := + integrable_responseJAdditivityDefectAtScale hkm p q hParent hDesc + have hDefectNonneg : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := + responseJAdditivityDefectAtScale_nonneg_ae hP hkm p q + have hChildNonneg : 0 ≤ᵐ[P] childAverage := by + filter_upwards with a + simpa [childAverage, Q, j] using + descendantsAverage_restrictionResponseJObservableCubeSet_nonneg Q j p q a + have hSqrtProdInt : + Integrable + (fun a : RegCoeffField d => + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) P := + integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + (A := responseJAdditivityDefectAtScale m k p q) + (B := childAverage) hDefectInt hChildInt hDefectNonneg hChildNonneg + have hAddInt : Integrable addPoint P := by + simpa [addPoint] using hSqrtProdInt.const_mul (2 * C) + have hOscInt : Integrable oscPoint P := by + simpa [oscPoint, Q] using hParent.const_mul (Cosc * scaleSep) + have hGradInt : Integrable gradPoint P := by + refine + (hGradWeak.const_mul + ((1 / 2 : ℝ) * ‖q0‖ * ((Fintype.card (Fin d) : ℝ) * gradCoeff))).congr ?_ + filter_upwards with a + simp [gradPoint, gradWeak, Q, mul_assoc] + have hFluxInt : Integrable fluxPoint P := by + refine + (hFluxWeak.const_mul + ((1 / 2 : ℝ) * ‖p0‖ * ((Fintype.card (Fin d) : ℝ) * fluxCoeff))).congr ?_ + filter_upwards with a + simp [fluxPoint, fluxWeak, Q, mul_assoc] + have hProductInt : Integrable productPoint P := by + simpa [productPoint, Q] using hProduct + have hRHS_eq : + (fun a : RegCoeffField d => + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a) = + fun a => (addPoint a + oscPoint a) + ((gradPoint a + fluxPoint a) + productPoint a) := by + funext a + simp [jUpperWeakNormPointwiseRHSAtScale, addPoint, oscPoint, gradPoint, + fluxPoint, productPoint, childAverage, gradWeak, fluxWeak, gradCoeff, + fluxCoeff, Q, j, add_assoc, add_comm, mul_assoc] + have hIntegral_eq : + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P = + ∫ a, addPoint a ∂P + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + ∫ a, productPoint a ∂P)) := by + rw [hRHS_eq] + rw [integral_add + (f := fun a : RegCoeffField d => addPoint a + oscPoint a) + (g := fun a : RegCoeffField d => (gradPoint a + fluxPoint a) + productPoint a) + (hAddInt.add hOscInt) ((hGradInt.add hFluxInt).add hProductInt)] + rw [integral_add (f := addPoint) (g := oscPoint) hAddInt hOscInt] + rw [integral_add + (f := fun a : RegCoeffField d => gradPoint a + fluxPoint a) + (g := productPoint) (hGradInt.add hFluxInt) hProductInt] + rw [integral_add (f := gradPoint) (g := fluxPoint) hGradInt hFluxInt] + ring + have hSqrtBound : + ∫ a, + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a) ∂P ≤ + Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q) := by + simpa [childAverage, Q, j] using + integral_sqrt_responseJAdditivityDefectAtScale_mul_sqrt_childResponseAverage_le + hP hstat hk_nonneg hkm p q hParent hDesc + have hAddBound : + ∫ a, addPoint a ∂P ≤ + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) := by + have htwoC_nonneg : 0 ≤ 2 * C := by nlinarith + calc + ∫ a, addPoint a ∂P = + (2 * C) * + ∫ a, + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a) ∂P := by + simp [addPoint, integral_const_mul] + _ ≤ + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) := + mul_le_mul_of_nonneg_left hSqrtBound htwoC_nonneg + have hOscIntegral : + ∫ a, oscPoint a ∂P = + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q := by + simp [oscPoint, Ch04.expectedResponseJCubeSet, integral_const_mul, mul_assoc] + have hGradIntegral : + ∫ a, gradPoint a ∂P = + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * + ∫ a, gradWeak a ∂P) := by + simp [gradPoint, integral_const_mul, mul_assoc] + have hFluxIntegral : + ∫ a, fluxPoint a ∂P = + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * + ∫ a, fluxWeak a ∂P) := by + simp [fluxPoint, integral_const_mul, mul_assoc] + calc + ∫ a, + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a ∂P + = + ∫ a, addPoint a ∂P + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + ∫ a, productPoint a ∂P)) := hIntegral_eq + _ ≤ + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + ∫ a, productPoint a ∂P)) := by + exact add_le_add hAddBound (le_refl _) + _ = + jUpperWeakNormExpectedRHSAtScale P m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 := by + rw [hOscIntegral, hGradIntegral, hFluxIntegral] + simp [jUpperWeakNormExpectedRHSAtScale, productPoint, gradWeak, fluxWeak, + gradCoeff, fluxCoeff, Q, add_assoc, mul_assoc] + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptPointwiseBound.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptPointwiseBound.lean new file mode 100644 index 0000000000..e0fc0817ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptPointwiseBound.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.PointwiseBound + +/-! # Manuscript Pointwise Bound -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ManuscriptPointwiseBound + +Fixed-coefficient pointwise bound by the manuscript RHS. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Pointwise bridge from the deterministic split directly to the +manuscript-product RHS at origin scales. -/ +theorem abs_centeredJMinusCutoffWeightedChildAtScale_le_jUpperWeakNormManuscriptPointwiseRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m k : ℤ) (s t : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + {C B Cosc scaleSep BφS BφT cutoffDerivative Cprod : ℝ} + (hC : 0 ≤ C) + (hCut : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q x) + (cubeSet (originCube d m)) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 x) i) + (cubeSet (originCube d m)) volume) + (hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q q0 x) i) + (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet (originCube d m)))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet (originCube d m)), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d m)) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hst : s + t ≤ 1) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal (originCube d m) (2 : ℝ≥0∞) φ) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure (originCube d m))) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField φ x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet (originCube d m), + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ cutoffDerivative) + (hProductCoeff : + cutoffProductScaledWeakNormCoeff (originCube d m) s t cutoffDerivative + (scalarCutoffGradientField φ) * + cubeBesovScaleWeight (-s) (originCube d m) * + cubeBesovScaleWeight (-t) (originCube d m) ≤ Cprod) : + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let productCoeff : ℝ := + cutoffProductScaledWeakNormCoeff Q s t cutoffDerivative (scalarCutoffGradientField φ) + let gradWeak : ℝ := + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : ℝ := + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let scaledGrad : ℝ := cubeBesovScaleWeight (-s) Q * gradWeak + let scaledFlux : ℝ := cubeBesovScaleWeight (-t) Q * fluxWeak + have hgradWeak_nonneg : 0 ≤ gradWeak := by + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + simpa [gradWeak, Q, F, aQ] using + (cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0)).trans + (cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs_pos 0 p q p0) + have hfluxWeak_nonneg : 0 ≤ fluxWeak := by + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + simpa [fluxWeak, Q, F, aQ] using + (cubeBesovNegativeVectorPartialSeminorm_nonneg Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0)).trans + (cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q ht_pos 0 p q q0) + have hscaledGrad_nonneg : 0 ≤ scaledGrad := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) hgradWeak_nonneg + have hscaledFlux_nonneg : 0 ≤ scaledFlux := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-t) Q) hfluxWeak_nonneg + have hdet : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS)) * + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT)) * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun)) + + productCoeff * (scaledGrad * scaledFlux) := by + simpa [Q, j, F, productCoeff, scaledGrad, scaledFlux] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearWeakNorms_add_scaledProduct + (a := a) (ha := ha) (Q := Q) (j := j) (s := s) (t := t) + (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (C := C) (B := B) (Cosc := Cosc) (scaleSep := scaleSep) + (BφS := BφS) (BφT := BφT) (cutoffDerivative := cutoffDerivative) + hC (by simpa [Q, j] using hCut) (by simpa [Q] using hφ_int) + (by simpa [Q, F] using hRem_int) + (by simpa [Q, F] using hProduct_int) + (by simpa [Q, F] using hGradLinear_int) + (by simpa [Q, F] using hFluxLinear_int) + (by simpa [Q, F] using hGradField) + (by simpa [Q, F] using hFluxField) + (by simpa [Q] using hMean) + (by simpa [Q] using hφ_meas) + (by simpa [Q] using hφ_bound) + (by simpa [Q, j] using hOscPoint) + hφ hφ_compact (by simpa [Q] using hφ_sub) + hcutoffDerivative hs_pos hs_lt_one ht_pos hst hBφS hBφT + (by simpa [Q] using hφDualS) (by simpa [Q] using hφDualT) + (by simpa [Q] using hφMem) + (by simpa [Q] using hcutoffGradient) + hcutoffSmooth (by simpa [Q] using hcutoffDeriv) + have hproductCoeff' : productCoeff * (scaledGrad * scaledFlux) ≤ + Cprod * (gradWeak * fluxWeak) := by + have hprod_nonneg : 0 ≤ gradWeak * fluxWeak := + mul_nonneg hgradWeak_nonneg hfluxWeak_nonneg + calc + productCoeff * (scaledGrad * scaledFlux) + = + (productCoeff * cubeBesovScaleWeight (-s) Q * + cubeBesovScaleWeight (-t) Q) * (gradWeak * fluxWeak) := by + ring + _ ≤ Cprod * (gradWeak * fluxWeak) := + mul_le_mul_of_nonneg_right + (by simpa [Q, productCoeff, mul_assoc] using hProductCoeff) hprod_nonneg + have hleft : + centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a = + centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q := by + simpa [Q, j, F] using + centeredJMinusCutoffWeightedChildAtScale_eq_dependentFamily_left + a ha m k φ p q p0 q0 + have hpartition : + responseJPartitionDefectOnFamilyAtDepth F Q j p q = + responseJAdditivityDefectAtScale m k p q a := by + simpa [Q, j, F] using + responseJPartitionDefectOnDependentFamilyAtScale_eq_responseJAdditivityDefectAtScale + a ha m k p q + have hchild : + childResponseJAverageOnFamilyAtDepth F Q j p q = + descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + simpa [Q, j, F] using + childResponseJAverageOnDependentFamilyAtScale_eq_ch04 a ha m k p q + have hdet' : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS)) * + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT)) * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun)) + + Cprod * (gradWeak * fluxWeak) := by + nlinarith [hdet, hproductCoeff'] + simpa [jUpperWeakNormManuscriptPointwiseRHSAtScale, Q, j, F, hleft, + hpartition, hchild, gradWeak, fluxWeak, scaledGrad, scaledFlux, add_assoc] using hdet' + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptRHS.lean new file mode 100644 index 0000000000..07739353a1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/ManuscriptRHS.lean @@ -0,0 +1,403 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.RHS + +/-! # Manuscript RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ManuscriptRHS + +Comparison between the manuscript pointwise RHS and the manuscript expected RHS. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +theorem integral_jUpperWeakNormManuscriptPointwiseRHSAtScale_le_manuscriptExpectedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) + (C Cosc scaleSep BφS BφT Cprod : ℝ) + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) (hCprod : 0 ≤ Cprod) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + ∫ a, + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a ∂P + ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad : RegCoeffField d → ℝ := gradWeak + let scaledFlux : RegCoeffField d → ℝ := fluxWeak + let addPoint : RegCoeffField d → ℝ := + fun a => + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) + let oscPoint : RegCoeffField d → ℝ := + fun a => Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + let gradPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak a) + let fluxPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak a) + let productPoint : RegCoeffField d → ℝ := + fun a => Cprod * (scaledGrad a * scaledFlux a) + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] + using! hR) + have hChildInt : Integrable childAverage P := by + simpa [childAverage, Q, j] using + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + have hDefectInt : + Integrable (responseJAdditivityDefectAtScale m k p q) P := + integrable_responseJAdditivityDefectAtScale hkm p q hParent hDesc + have hDefectNonneg : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := + responseJAdditivityDefectAtScale_nonneg_ae hP hkm p q + have hChildNonneg : 0 ≤ᵐ[P] childAverage := by + filter_upwards with a + simpa [childAverage, Q, j] using + descendantsAverage_restrictionResponseJObservableCubeSet_nonneg Q j p q a + have hSqrtProdInt : + Integrable + (fun a : RegCoeffField d => + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) P := + integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + (A := responseJAdditivityDefectAtScale m k p q) + (B := childAverage) hDefectInt hChildInt hDefectNonneg hChildNonneg + have hAddInt : Integrable addPoint P := by + simpa [addPoint] using hSqrtProdInt.const_mul (2 * C) + have hOscInt : Integrable oscPoint P := by + simpa [oscPoint, Q] using hParent.const_mul (Cosc * scaleSep) + have hGradInt : Integrable gradPoint P := by + refine + (hGradWeak.const_mul + ((1 / 2 : ℝ) * ‖q0‖ * ((Fintype.card (Fin d) : ℝ) * gradCoeff))).congr ?_ + filter_upwards with a + simp [gradPoint, gradWeak, Q, mul_assoc] + have hFluxInt : Integrable fluxPoint P := by + refine + (hFluxWeak.const_mul + ((1 / 2 : ℝ) * ‖p0‖ * ((Fintype.card (Fin d) : ℝ) * fluxCoeff))).congr ?_ + filter_upwards with a + simp [fluxPoint, fluxWeak, Q, mul_assoc] + have hGradNonneg : 0 ≤ᵐ[P] scaledGrad := by + simpa [scaledGrad, gradWeak, Q] using + canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae hP Q hs p q p0 + have hFluxNonneg : 0 ≤ᵐ[P] scaledFlux := by + simpa [scaledFlux, fluxWeak, Q] using + canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae hP Q ht p q q0 + have hScaledProdInt : Integrable (fun a => scaledGrad a * scaledFlux a) P := + integrable_mul_of_integrable_sq_of_ae_nonneg + (X := scaledGrad) (Y := scaledFlux) + (by simpa [scaledGrad, gradWeak, Q] using hGradSq) + (by simpa [scaledFlux, fluxWeak, Q] using hFluxSq) + hGradNonneg hFluxNonneg + have hProductInt : Integrable productPoint P := by + simpa [productPoint] using hScaledProdInt.const_mul Cprod + have hRHS_eq : + (fun a : RegCoeffField d => + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a) = + fun a => (addPoint a + oscPoint a) + ((gradPoint a + fluxPoint a) + productPoint a) := by + funext a + simp [jUpperWeakNormManuscriptPointwiseRHSAtScale, addPoint, oscPoint, gradPoint, + fluxPoint, productPoint, childAverage, gradWeak, fluxWeak, scaledGrad, + scaledFlux, gradCoeff, fluxCoeff, Q, j, add_assoc, add_comm, mul_assoc] + ring + have hIntegral_eq : + ∫ a, + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a ∂P = + ∫ a, addPoint a ∂P + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + ∫ a, productPoint a ∂P)) := by + rw [hRHS_eq] + rw [integral_add + (f := fun a : RegCoeffField d => addPoint a + oscPoint a) + (g := fun a : RegCoeffField d => (gradPoint a + fluxPoint a) + productPoint a) + (hAddInt.add hOscInt) ((hGradInt.add hFluxInt).add hProductInt)] + rw [integral_add (f := addPoint) (g := oscPoint) hAddInt hOscInt] + rw [integral_add + (f := fun a : RegCoeffField d => gradPoint a + fluxPoint a) + (g := productPoint) (hGradInt.add hFluxInt) hProductInt] + rw [integral_add (f := gradPoint) (g := fluxPoint) hGradInt hFluxInt] + ring + have hSqrtBound : + ∫ a, + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a) ∂P ≤ + Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q) := by + simpa [childAverage, Q, j] using + integral_sqrt_responseJAdditivityDefectAtScale_mul_sqrt_childResponseAverage_le + hP hstat hk_nonneg hkm p q hParent hDesc + have hAddBound : + ∫ a, addPoint a ∂P ≤ + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) := by + dsimp only [addPoint] + rw [integral_const_mul] + exact mul_le_mul_of_nonneg_left hSqrtBound (mul_nonneg (by norm_num) hC) + have hOscIntegral : + ∫ a, oscPoint a ∂P = + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q := by + simp [oscPoint, Ch04.expectedResponseJCubeSet, integral_const_mul, mul_assoc] + have hGradIntegral : + ∫ a, gradPoint a ∂P = + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * + ∫ a, gradWeak a ∂P) := by + simp [gradPoint, integral_const_mul, mul_assoc] + have hFluxIntegral : + ∫ a, fluxPoint a ∂P = + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * + ∫ a, fluxWeak a ∂P) := by + simp [fluxPoint, integral_const_mul, mul_assoc] + have hCauchy : + ∫ a, scaledGrad a * scaledFlux a ∂P ≤ + Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P) := + integral_mul_le_sqrt_integral_sq_mul_sqrt_integral_sq_of_ae_nonneg + (X := scaledGrad) (Y := scaledFlux) + (by simpa [scaledGrad, gradWeak, Q] using hGradSq) + (by simpa [scaledFlux, fluxWeak, Q] using hFluxSq) + hGradNonneg hFluxNonneg + have hProductBound : + ∫ a, productPoint a ∂P ≤ + Cprod * + (Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P)) := by + dsimp only [productPoint] + rw [integral_const_mul] + exact mul_le_mul_of_nonneg_left hCauchy hCprod + calc + ∫ a, + jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 a ∂P + = + ∫ a, addPoint a ∂P + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + ∫ a, productPoint a ∂P)) := hIntegral_eq + _ ≤ + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) + + (∫ a, oscPoint a ∂P + + ((∫ a, gradPoint a ∂P + ∫ a, fluxPoint a ∂P) + + Cprod * + (Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P)))) := by + exact add_le_add hAddBound + (add_le_add_left (add_le_add_left hProductBound _) _) + _ = + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + rw [hOscIntegral, hGradIntegral, hFluxIntegral] + simp [jUpperWeakNormManuscriptExpectedRHSAtScale, gradWeak, fluxWeak, + scaledGrad, scaledFlux, gradCoeff, fluxCoeff, Q, add_assoc, mul_assoc] + +theorem integrable_jUpperWeakNormManuscriptPointwiseRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) {k m : ℤ} (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) + (C Cosc scaleSep BφS BφT Cprod : ℝ) (p q p0 q0 : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) P) + (hFluxWeak : + Integrable + (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + Integrable + (jUpperWeakNormManuscriptPointwiseRHSAtScale m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage : RegCoeffField d → ℝ := + fun a => descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff : ℝ := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad : RegCoeffField d → ℝ := gradWeak + let scaledFlux : RegCoeffField d → ℝ := fluxWeak + let addPoint : RegCoeffField d → ℝ := + fun a => + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) + let oscPoint : RegCoeffField d → ℝ := + fun a => Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + let gradPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak a) + let fluxPoint : RegCoeffField d → ℝ := + fun a => + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak a) + let productPoint : RegCoeffField d → ℝ := + fun a => Cprod * (scaledGrad a * scaledFlux a) + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth Q j → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [Q, j, descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] + using! hR) + have hChildInt : Integrable childAverage P := by + simpa [childAverage, Q, j] using + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + have hDefectInt : + Integrable (responseJAdditivityDefectAtScale m k p q) P := + integrable_responseJAdditivityDefectAtScale hkm p q hParent hDesc + have hDefectNonneg : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := + responseJAdditivityDefectAtScale_nonneg_ae hP hkm p q + have hChildNonneg : 0 ≤ᵐ[P] childAverage := by + filter_upwards with a + simpa [childAverage, Q, j] using + descendantsAverage_restrictionResponseJObservableCubeSet_nonneg Q j p q a + have hSqrtProdInt : + Integrable + (fun a : RegCoeffField d => + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt (childAverage a)) P := + integrable_sqrt_mul_sqrt_of_integrable_of_ae_nonneg + (A := responseJAdditivityDefectAtScale m k p q) + (B := childAverage) hDefectInt hChildInt hDefectNonneg hChildNonneg + have hAddInt : Integrable addPoint P := by + simpa [addPoint] using hSqrtProdInt.const_mul (2 * C) + have hOscInt : Integrable oscPoint P := by + simpa [oscPoint, Q] using hParent.const_mul (Cosc * scaleSep) + have hGradInt : Integrable gradPoint P := by + refine + (hGradWeak.const_mul + ((1 / 2 : ℝ) * ‖q0‖ * ((Fintype.card (Fin d) : ℝ) * gradCoeff))).congr ?_ + filter_upwards with a + simp [gradPoint, gradWeak, Q, mul_assoc] + have hFluxInt : Integrable fluxPoint P := by + refine + (hFluxWeak.const_mul + ((1 / 2 : ℝ) * ‖p0‖ * ((Fintype.card (Fin d) : ℝ) * fluxCoeff))).congr ?_ + filter_upwards with a + simp [fluxPoint, fluxWeak, Q, mul_assoc] + have hGradNonneg : 0 ≤ᵐ[P] scaledGrad := by + simpa [scaledGrad, gradWeak, Q] using + canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae hP Q hs p q p0 + have hFluxNonneg : 0 ≤ᵐ[P] scaledFlux := by + simpa [scaledFlux, fluxWeak, Q] using + canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae hP Q ht p q q0 + have hScaledProdInt : Integrable (fun a => scaledGrad a * scaledFlux a) P := + integrable_mul_of_integrable_sq_of_ae_nonneg + (X := scaledGrad) (Y := scaledFlux) + (by simpa [scaledGrad, gradWeak, Q] using hGradSq) + (by simpa [scaledFlux, fluxWeak, Q] using hFluxSq) + hGradNonneg hFluxNonneg + have hProductInt : Integrable productPoint P := by + simpa [productPoint] using hScaledProdInt.const_mul Cprod + have hSumInt : + Integrable + (fun a : RegCoeffField d => + (addPoint a + oscPoint a) + ((gradPoint a + fluxPoint a) + productPoint a)) P := + (hAddInt.add hOscInt).add ((hGradInt.add hFluxInt).add hProductInt) + refine hSumInt.congr ?_ + filter_upwards with a + simp [jUpperWeakNormManuscriptPointwiseRHSAtScale, addPoint, oscPoint, gradPoint, + fluxPoint, productPoint, childAverage, gradWeak, fluxWeak, scaledGrad, + scaledFlux, gradCoeff, fluxCoeff, Q, j, add_assoc, add_comm, mul_assoc] + ring + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/NormalizedCutoff.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/NormalizedCutoff.lean new file mode 100644 index 0000000000..6a95317382 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/NormalizedCutoff.lean @@ -0,0 +1,895 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ScaleBounds + +/-! # Normalized Cutoff -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# NormalizedCutoff + +Concrete normalized cutoff used in the first Section 5.3 lemma. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- The normalized quantitative cutoff used in Section 5.3. -/ +noncomputable def section53NormalizedCutoff {d : ℕ} (Q : TriadicCube d) : Vec d → ℝ := + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + fun x => (cubeAverage Q η)⁻¹ * η x + +/-- Pointwise bound for the normalized Section 5.3 cutoff. -/ +noncomputable def section53CutoffBound {d : ℕ} (Q : TriadicCube d) : ℝ := + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + (cubeAverage Q η)⁻¹ + +/-- Average oscillation constant for the normalized Section 5.3 cutoff. -/ +noncomputable def section53CutoffOscillationConstant {d : ℕ} (Q : TriadicCube d) : ℝ := + section53CutoffBound Q * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) + +/-- Descendant scale separation at depth `j`. -/ +noncomputable def section53CutoffScaleSep {d : ℕ} (Q : TriadicCube d) (j : ℕ) : ℝ := + cubeScaleFactor Q / (3 : ℝ) ^ j + +/-- Dual Besov bound for the normalized Section 5.3 cutoff. -/ +noncomputable def section53CutoffDualBound {d : ℕ} (Q : TriadicCube d) (r : ℝ) : ℝ := + cubeBesovScaleWeight r Q * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + section53CutoffBound Q) + +/-- Derivative bound for the scalar-gradient cutoff field. -/ +noncomputable def section53CutoffDerivativeBound {d : ℕ} (Q : TriadicCube d) : ℝ := + section53CutoffBound Q * + (quantitativeCubeCutoffHessianConst d / + ((((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) ^ 2)) + +/-- Product coefficient used after selecting the concrete normalized cutoff. +The deterministic product estimate is first proved for the unnormalized +negative Besov norms. This coefficient includes exactly the two parent-scale +factors needed to convert that estimate back to the note-normalized Ch4 weak +norms used in the manuscript RHS. -/ +noncomputable def section53CutoffProductCoeff {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s t : ℝ) : ℝ := + max + (cutoffProductScaledWeakNormCoeff Q s t (section53CutoffDerivativeBound Q) + (scalarCutoffGradientField (section53NormalizedCutoff Q)) * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q) 0 + +theorem section53CutoffBound_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ section53CutoffBound Q := by + dsimp [section53CutoffBound] + exact inv_nonneg.mpr (le_of_lt (cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q)) + +/-- The normalized Section 5.3 cutoff amplitude is bounded by a +dimension-only constant. -/ +theorem section53CutoffBound_le_two_pow_card {d : ℕ} (Q : TriadicCube d) : + section53CutoffBound Q ≤ (2 : ℝ) ^ d := by + simpa [section53CutoffBound] using + inv_cubeAverage_quantitativeCubeCutoff_canonicalFun_le_two_pow_card Q + +theorem section53CutoffOscillationConstant_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ section53CutoffOscillationConstant Q := by + dsimp [section53CutoffOscillationConstant] + refine mul_nonneg (section53CutoffBound_nonneg Q) ?_ + refine div_nonneg (quantitativeCubeCutoffGradientConst_nonneg d) ?_ + have hrad : 0 < cubeRadius Q := cubeRadius_pos Q + nlinarith + +theorem section53CutoffDualBound_nonneg {d : ℕ} (Q : TriadicCube d) (r : ℝ) : + 0 ≤ section53CutoffDualBound Q r := by + dsimp [section53CutoffDualBound] + refine mul_nonneg (cubeBesovScaleWeight_nonneg r Q) ?_ + exact add_nonneg + (mul_nonneg (cubeScaleFactor_nonneg Q) (section53CutoffOscillationConstant_nonneg Q)) + (section53CutoffBound_nonneg Q) + +theorem section53CutoffDerivativeBound_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ section53CutoffDerivativeBound Q := by + dsimp [section53CutoffDerivativeBound] + refine mul_nonneg (section53CutoffBound_nonneg Q) ?_ + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + +theorem section53CutoffDerivativeBound_mul_scaleFactor_sq_eq + {d : ℕ} (Q : TriadicCube d) : + section53CutoffDerivativeBound Q * (cubeScaleFactor Q) ^ 2 = + 64 * quantitativeCubeCutoffHessianConst d * section53CutoffBound Q := by + have hr : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + dsimp [section53CutoffDerivativeBound] + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q] + field_simp [hr] + ring + +theorem cubeScaleFactor_mul_section53CutoffDerivativeBound_eq + {d : ℕ} (Q : TriadicCube d) : + cubeScaleFactor Q * section53CutoffDerivativeBound Q = + (64 * quantitativeCubeCutoffHessianConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := by + have hsq := section53CutoffDerivativeBound_mul_scaleFactor_sq_eq Q + have hscale_ne : cubeScaleFactor Q ≠ 0 := by + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact hpos.ne' + unfold cubeBesovScaleWeight + rw [Real.rpow_neg_one] + field_simp [hscale_ne] + nlinarith [hsq] + +theorem cubeLpNorm_section53NormalizedCutoff_gradient_le + {d : ℕ} (Q : TriadicCube d) : + cubeLpNorm Q ∞ (scalarCutoffGradientField (section53NormalizedCutoff Q)) ≤ + (8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := by + have hraw := + cubeLpNorm_infty_scalarCutoffGradientField_normalized_quantitativeCubeCutoff_canonicalFun_le Q + have hEq : + section53CutoffBound Q * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) = + (8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := by + have hr : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + unfold cubeBesovScaleWeight + rw [Real.rpow_neg_one] + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q] + field_simp [hr] + ring + calc + cubeLpNorm Q ∞ (scalarCutoffGradientField (section53NormalizedCutoff Q)) + ≤ + section53CutoffBound Q * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) := by + simpa [section53NormalizedCutoff, section53CutoffBound] using hraw + _ = + (8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := hEq + +theorem section53CutoffProductCoeff_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s t : ℝ) : + 0 ≤ section53CutoffProductCoeff Q s t := by + exact le_max_right _ _ + +/-- The normalized cutoff oscillation coefficient has the exact descendant +scale decay. The only remaining size information is the normalized cutoff +amplitude `section53CutoffBound Q`. -/ +theorem section53CutoffOscillationConstant_mul_scaleSep_eq + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + section53CutoffOscillationConstant Q * section53CutoffScaleSep Q j = + (8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q) * + ((3 : ℝ) ^ j)⁻¹ := by + have hr : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + have hpow : (3 : ℝ) ^ j ≠ 0 := pow_ne_zero _ (by norm_num : (3 : ℝ) ≠ 0) + dsimp [section53CutoffOscillationConstant, section53CutoffScaleSep] + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q] + field_simp [hr, hpow] + ring + +/-- The complete linear cutoff coefficient that appears in the first +Section 5.3 expected RHS is bounded by a dimension-only constant. This is the +coefficient-weighted form where the Besov scale weights cancel. -/ +theorem section53_linearCutoffCoeff_le_dimensional + {d : ℕ} (Q : TriadicCube d) {r : ℝ} + (_hr_nonneg : 0 ≤ r) (hr_le_one : r ≤ 1) : + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r) ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + have hosc : + cubeScaleFactor Q * section53CutoffOscillationConstant Q = + 8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q := by + have h := + section53CutoffOscillationConstant_mul_scaleSep_eq (d := d) Q 0 + simpa [section53CutoffScaleSep, mul_assoc, mul_left_comm, mul_comm] using h + have hcut : + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q ≤ + (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := by + have hB := section53CutoffBound_le_two_pow_card Q + have hcoef_nonneg : + 0 ≤ 8 * quantitativeCubeCutoffGradientConst d + 1 := by + have hG : 0 ≤ quantitativeCubeCutoffGradientConst d := + quantitativeCubeCutoffGradientConst_nonneg d + nlinarith + calc + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q = + (8 * quantitativeCubeCutoffGradientConst d + 1) * + section53CutoffBound Q := by + rw [hosc] + ring + _ ≤ (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := + mul_le_mul_of_nonneg_left hB hcoef_nonneg + have hcut_nonneg : + 0 ≤ cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q := by + exact add_nonneg + (mul_nonneg (cubeScaleFactor_nonneg Q) + (section53CutoffOscillationConstant_nonneg Q)) + (section53CutoffBound_nonneg Q) + have hdual : + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r = + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q := by + calc + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r = + (cubeBesovScaleWeight (-r) Q * cubeBesovScaleWeight r Q) * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q) := by + simp [section53CutoffDualBound] + ring + _ = + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q := by + rw [cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight] + ring + have hpow : + (3 : ℝ) ^ ((d : ℝ) + r) ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + r) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hpow_upper_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmain : + (3 : ℝ) ^ ((d : ℝ) + r) * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d) := + mul_le_mul hpow hcut hcut_nonneg hpow_upper_nonneg + have hinner : + (3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r = + (3 : ℝ) ^ ((d : ℝ) + r) * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q) := by + calc + (3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r = + (3 : ℝ) ^ ((d : ℝ) + r) * + (cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r) := by ring + _ = + (3 : ℝ) ^ ((d : ℝ) + r) * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q) := by rw [hdual] + calc + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovScaleWeight (-r) Q * section53CutoffDualBound Q r) + = + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + r) * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q)) := by + rw [hinner] + _ ≤ + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + exact mul_le_mul_of_nonneg_left hmain (Nat.cast_nonneg _) + _ = + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + simp + +private theorem cubeBesovScaleWeight_originCube_nat_le_one + {d : ℕ} (m : ℕ) {r : ℝ} (hr : 0 ≤ r) : + cubeBesovScaleWeight r (originCube d (m : ℤ)) ≤ 1 := by + unfold cubeBesovScaleWeight + rw [cubeScaleFactor_originCube] + exact Real.rpow_le_one_of_one_le_of_nonpos + (one_le_zpow₀ (by norm_num : (1 : ℝ) ≤ 3) + (by exact_mod_cast Nat.zero_le m : (0 : ℤ) ≤ (m : ℤ))) + (by linarith) + +/-- The cutoff-dual coefficient that multiplies the integral of the +note-normalized weak norm is bounded by a dimension-only constant on origin +cubes. This is the coefficient form used in the coarse-fluctuation RHS +conversion. -/ +theorem section53_linearCutoffCoeff_origin_le_dimensional + {d : ℕ} (m : ℕ) {r : ℝ} + (hr_nonneg : 0 ≤ r) (hr_le_one : r ≤ 1) : + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + r) * + section53CutoffDualBound (originCube d (m : ℤ)) r) ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + let Q : TriadicCube d := originCube d (m : ℤ) + have hosc : + cubeScaleFactor Q * section53CutoffOscillationConstant Q = + 8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q := by + have h := + section53CutoffOscillationConstant_mul_scaleSep_eq (d := d) Q 0 + simpa [section53CutoffScaleSep, mul_assoc, mul_left_comm, mul_comm] using h + have hcut : + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q ≤ + (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := by + have hB := section53CutoffBound_le_two_pow_card Q + have hcoef_nonneg : + 0 ≤ 8 * quantitativeCubeCutoffGradientConst d + 1 := by + have hG : 0 ≤ quantitativeCubeCutoffGradientConst d := + quantitativeCubeCutoffGradientConst_nonneg d + nlinarith + calc + cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q = + (8 * quantitativeCubeCutoffGradientConst d + 1) * + section53CutoffBound Q := by + rw [hosc] + ring + _ ≤ (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := + mul_le_mul_of_nonneg_left hB hcoef_nonneg + have hcut_nonneg : + 0 ≤ cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q := by + exact add_nonneg + (mul_nonneg (cubeScaleFactor_nonneg Q) + (section53CutoffOscillationConstant_nonneg Q)) + (section53CutoffBound_nonneg Q) + have hK_nonneg : + 0 ≤ (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := by + exact hcut_nonneg.trans hcut + have hdual : + section53CutoffDualBound Q r ≤ + (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := by + have hweight : cubeBesovScaleWeight r Q ≤ 1 := by + simpa [Q] using + cubeBesovScaleWeight_originCube_nat_le_one (d := d) m hr_nonneg + calc + section53CutoffDualBound Q r = + cubeBesovScaleWeight r Q * + (cubeScaleFactor Q * section53CutoffOscillationConstant Q + + section53CutoffBound Q) := by + simp [section53CutoffDualBound] + _ ≤ + 1 * ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d) := + mul_le_mul hweight hcut hcut_nonneg zero_le_one + _ = + (8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d := by ring + have hpow : + (3 : ℝ) ^ ((d : ℝ) + r) ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hpow_upper_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmain : + (3 : ℝ) ^ ((d : ℝ) + r) * section53CutoffDualBound Q r ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d) := + mul_le_mul hpow hdual (section53CutoffDualBound_nonneg Q r) hpow_upper_nonneg + calc + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + r) * section53CutoffDualBound Q r) + ≤ + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + exact mul_le_mul_of_nonneg_left hmain (Nat.cast_nonneg _) + _ = + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * + ((8 * quantitativeCubeCutoffGradientConst d + 1) * (2 : ℝ) ^ d)) := by + simp + +/-- A weighted bound and a bound on a nonnegative factor remain valid after +multiplication by the same nonnegative scalar coefficients. -/ +private theorem scalar_product_le_of_weighted_bound + {A K P n x X v w z : ℝ} + (hweighted : A * (v * w * z) ≤ K) (hx : x ≤ X) + (hx_nonneg : 0 ≤ x) (hK_nonneg : 0 ≤ K) + (hP_nonneg : 0 ≤ P) (hn_nonneg : 0 ≤ n) : + A * P * (n * (x * v)) * w * z ≤ K * P * (n * X) := by + have hproduct := mul_le_mul hweighted hx hx_nonneg hK_nonneg + calc + A * P * (n * (x * v)) * w * z = (P * n) * ((A * (v * w * z)) * x) := by ring + _ ≤ (P * n) * (K * X) := + mul_le_mul_of_nonneg_left hproduct (mul_nonneg hP_nonneg hn_nonneg) + _ = K * P * (n * X) := by ring + +/-- The concrete cutoff-product coefficient is bounded by a dimension-only +constant on origin cubes in the Section 5.3 exponent range. The proof keeps +the scale cancellation explicit: +the derivative and gradient cutoff sizes contribute one factor of +`cubeBesovScaleWeight 1`, while the product coefficient contributes +`cubeBesovScaleWeight (-(1 - s - t))`; their product is +`cubeBesovScaleWeight (s + t) ≤ 1` on origin cubes. -/ +theorem section53CutoffProductCoeff_origin_le_dimensional + {d : ℕ} [NeZero d] (m : ℕ) {s t : ℝ} + (hs_nonneg : 0 ≤ s) (hst_nonneg : 0 ≤ s + t) : + section53CutoffProductCoeff (originCube d (m : ℤ)) s t ≤ + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) := by + let Q : TriadicCube d := originCube d (m : ℤ) + let A : ℝ := + 2 * cubeScaleFactor Q * section53CutoffDerivativeBound Q + + 3 * cubeLpNorm Q ∞ (scalarCutoffGradientField (section53NormalizedCutoff Q)) + let Kcut : ℝ := + (128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d + let Poinc : ℝ := + (Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Fintype.card (Fin d) : ℝ) + let Flux : ℝ := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + (1 - s)) * + cubeBesovScaleWeight (-(1 - s - t)) Q) + have hH_nonneg : 0 ≤ quantitativeCubeCutoffHessianConst d := + quantitativeCubeCutoffHessianConst_nonneg d + have hG_nonneg : 0 ≤ quantitativeCubeCutoffGradientConst d := + quantitativeCubeCutoffGradientConst_nonneg d + have hKcut_nonneg : 0 ≤ Kcut := by + dsimp [Kcut] + have hpow : 0 ≤ (2 : ℝ) ^ d := by positivity + nlinarith + have hW1_nonneg : 0 ≤ cubeBesovScaleWeight 1 Q := + cubeBesovScaleWeight_nonneg 1 Q + have hD_le : + cubeScaleFactor Q * section53CutoffDerivativeBound Q ≤ + (64 * quantitativeCubeCutoffHessianConst d * (2 : ℝ) ^ d) * + cubeBesovScaleWeight 1 Q := by + have hEq := cubeScaleFactor_mul_section53CutoffDerivativeBound_eq Q + have hB := section53CutoffBound_le_two_pow_card Q + have hcoef : 0 ≤ 64 * quantitativeCubeCutoffHessianConst d := by + nlinarith + calc + cubeScaleFactor Q * section53CutoffDerivativeBound Q = + (64 * quantitativeCubeCutoffHessianConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := hEq + _ ≤ + (64 * quantitativeCubeCutoffHessianConst d * (2 : ℝ) ^ d) * + cubeBesovScaleWeight 1 Q := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hB hcoef) hW1_nonneg + have hGrad_le : + cubeLpNorm Q ∞ (scalarCutoffGradientField (section53NormalizedCutoff Q)) ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + cubeBesovScaleWeight 1 Q := by + have hbase := cubeLpNorm_section53NormalizedCutoff_gradient_le Q + have hB := section53CutoffBound_le_two_pow_card Q + have hcoef : 0 ≤ 8 * quantitativeCubeCutoffGradientConst d := by + nlinarith + calc + cubeLpNorm Q ∞ (scalarCutoffGradientField (section53NormalizedCutoff Q)) + ≤ + (8 * quantitativeCubeCutoffGradientConst d * section53CutoffBound Q) * + cubeBesovScaleWeight 1 Q := hbase + _ ≤ + (8 * quantitativeCubeCutoffGradientConst d * (2 : ℝ) ^ d) * + cubeBesovScaleWeight 1 Q := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hB hcoef) hW1_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg + (mul_nonneg (mul_nonneg (by norm_num) (cubeScaleFactor_nonneg Q)) + (section53CutoffDerivativeBound_nonneg Q)) + (mul_nonneg (by norm_num) (cubeLpNorm_nonneg Q ∞ _)) + have hA_le : + A ≤ Kcut * cubeBesovScaleWeight 1 Q := by + dsimp [A, Kcut] + nlinarith [hD_le, hGrad_le] + have hWprod : + cubeBesovScaleWeight 1 Q * cubeBesovScaleWeight (-(1 - s - t)) Q = + cubeBesovScaleWeight (s + t) Q := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add] + ring_nf + have hWst_le : cubeBesovScaleWeight (s + t) Q ≤ 1 := by + simpa [Q] using + cubeBesovScaleWeight_originCube_nat_le_one (d := d) m hst_nonneg + have hWneg_nonneg : 0 ≤ cubeBesovScaleWeight (-(1 - s - t)) Q := + cubeBesovScaleWeight_nonneg (-(1 - s - t)) Q + have hA_weight_le : + A * cubeBesovScaleWeight (-(1 - s - t)) Q ≤ Kcut := by + calc + _ ≤ (Kcut * cubeBesovScaleWeight 1 Q) * + cubeBesovScaleWeight (-(1 - s - t)) Q := + mul_le_mul_of_nonneg_right hA_le hWneg_nonneg + _ = Kcut * cubeBesovScaleWeight (s + t) Q := by rw [mul_assoc, hWprod] + _ ≤ Kcut := by + simpa only [mul_one] using mul_le_mul_of_nonneg_left hWst_le hKcut_nonneg + have hpow_flux : + (3 : ℝ) ^ ((d : ℝ) + (1 - s)) ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + linarith + have hpow_flux_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + (1 - s)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hpow_upper_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hPoinc_nonneg : 0 ≤ Poinc := by + dsimp [Poinc] + exact mul_nonneg + (mul_nonneg (Ch01.Legacy.fullVectorPoincareConstant_nonneg Q) hpow_upper_nonneg) + (Nat.cast_nonneg _) + have hFlux_nonneg : 0 ≤ Flux := by + dsimp [Flux] + exact mul_nonneg (Nat.cast_nonneg _) + (mul_nonneg hpow_flux_nonneg hWneg_nonneg) + have hcore : + A * Poinc * Flux ≤ + Kcut * Poinc * + ((Fintype.card (Fin d) : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + have hbound := scalar_product_le_of_weighted_bound + (A := A) (K := Kcut) (v := cubeBesovScaleWeight (-(1 - s - t)) Q) + (w := 1) (z := 1) (by simpa only [mul_one] using hA_weight_le) + hpow_flux hpow_flux_nonneg hKcut_nonneg hPoinc_nonneg + (Nat.cast_nonneg (Fintype.card (Fin d))) + simpa only [Flux, mul_one] using hbound + have hdim : + Kcut * Poinc * + ((Fintype.card (Fin d) : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1)) = + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) := by + simp [Kcut, Poinc, Ch01.Legacy.fullVectorPoincareConstant, + fullVectorPoincareCubeConstant_eq_dimensionConstant] + have hW_s_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + have hW_t_nonneg : 0 ≤ cubeBesovScaleWeight (-t) Q := + cubeBesovScaleWeight_nonneg (-t) Q + have hweights_cancel : + cubeBesovScaleWeight 1 Q * + cubeBesovScaleWeight (-(1 - s - t)) Q * + cubeBesovScaleWeight (-s) Q * + cubeBesovScaleWeight (-t) Q = 1 := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add, + cubeBesovScaleWeight_mul_eq_scaleWeight_add, + cubeBesovScaleWeight_mul_eq_scaleWeight_add] + rw [show (1 : ℝ) + -(1 - s - t) + -s + -t = 0 by ring] + simp [cubeBesovScaleWeight] + have hcore_scaled : + A * Poinc * Flux * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q ≤ + Kcut * Poinc * + ((Fintype.card (Fin d) : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + have hweight_nonneg : + 0 ≤ cubeBesovScaleWeight (-(1 - s - t)) Q * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q := + mul_nonneg (mul_nonneg hWneg_nonneg hW_s_nonneg) hW_t_nonneg + have hweighted : + A * (cubeBesovScaleWeight (-(1 - s - t)) Q * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q) ≤ Kcut := by + calc + _ ≤ (Kcut * cubeBesovScaleWeight 1 Q) * + (cubeBesovScaleWeight (-(1 - s - t)) Q * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q) := + mul_le_mul_of_nonneg_right hA_le hweight_nonneg + _ = Kcut * (cubeBesovScaleWeight 1 Q * + cubeBesovScaleWeight (-(1 - s - t)) Q * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q) := by ring + _ = Kcut := by rw [hweights_cancel, mul_one] + simpa only [Flux] using + scalar_product_le_of_weighted_bound hweighted hpow_flux hpow_flux_nonneg + hKcut_nonneg hPoinc_nonneg (Nat.cast_nonneg (Fintype.card (Fin d))) + have hinside : + cutoffProductScaledWeakNormCoeff Q s t (section53CutoffDerivativeBound Q) + (scalarCutoffGradientField (section53NormalizedCutoff Q)) * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q ≤ + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) := by + calc + cutoffProductScaledWeakNormCoeff Q s t (section53CutoffDerivativeBound Q) + (scalarCutoffGradientField (section53NormalizedCutoff Q)) * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q = + A * Poinc * Flux * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q := by + simp [cutoffProductScaledWeakNormCoeff, A, Poinc, Flux] + _ ≤ Kcut * Poinc * + ((Fintype.card (Fin d) : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1)) := hcore_scaled + _ = + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) := hdim + have hRhs_nonneg : + 0 ≤ + (((128 * quantitativeCubeCutoffHessianConst d + + 24 * quantitativeCubeCutoffGradientConst d) * (2 : ℝ) ^ d) * + (((d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (d : ℝ)) * + ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1))) := by + rw [← hdim] + exact mul_nonneg (mul_nonneg hKcut_nonneg hPoinc_nonneg) + (mul_nonneg (Nat.cast_nonneg _) hpow_upper_nonneg) + exact max_le hinside hRhs_nonneg + +/-- The first Section 5.3 expectation assembly after selecting the concrete +normalized quantitative cutoff. The remaining hypotheses are law-facing +integrability/moment facts for the Ch4 observables. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_normalizedCutoff + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (p q p0 q0 : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + (1 + section53CutoffBound Q) + (section53CutoffOscillationConstant Q) + (section53CutoffScaleSep Q j) + (section53CutoffDualBound Q s) + (section53CutoffDualBound Q t) + (section53CutoffProductCoeff Q s t) + p q p0 q0 := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let : IsProbabilityMeasure P := hP.isProbability + have hbasic := normalized_quantitativeCubeCutoff_canonicalFun_basic_controls Q + rcases hbasic with ⟨hMean, hφ_meas, hφ_bound, hφ_smooth, hφ_compact, hφ_sub⟩ + have hosc := + normalized_quantitativeCubeCutoff_canonicalFun_descendant_average_oscillation_controls Q j + rcases hosc with ⟨hCutRaw, hOscRaw⟩ + have hgradControls := normalized_quantitativeCubeCutoff_canonicalFun_gradient_controls Q + rcases hgradControls with ⟨hcutoffGradient, hcutoffSmooth, hcutoffDerivRaw⟩ + have hC : 0 ≤ 1 + section53CutoffBound Q := by + linarith [section53CutoffBound_nonneg Q] + have hCut : + ∀ R ∈ descendantsAtDepth Q j, + |1 - cubeAverage R (section53NormalizedCutoff Q)| ≤ + 1 + section53CutoffBound Q := by + intro R hR + simpa [section53NormalizedCutoff, section53CutoffBound] using hCutRaw R hR + have hMean' : cubeAverage Q (section53NormalizedCutoff Q) = 1 := by + simpa [section53NormalizedCutoff] using hMean + have hφ_meas' : + AEStronglyMeasurable (section53NormalizedCutoff Q) (volumeMeasureOn (cubeSet Q)) := by + simpa [section53NormalizedCutoff] using hφ_meas + have hφ_bound' : + ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), + ‖section53NormalizedCutoff Q x‖ ≤ section53CutoffBound Q := by + simpa [section53NormalizedCutoff, section53CutoffBound] using hφ_bound + have hOscPoint : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R (section53NormalizedCutoff Q) - section53NormalizedCutoff Q x| ≤ + section53CutoffOscillationConstant Q * section53CutoffScaleSep Q j := by + intro R hR + exact (hOscRaw R hR).mono fun x hx => by + calc + |cubeAverage R (section53NormalizedCutoff Q) - section53NormalizedCutoff Q x| + ≤ cubeScaleFactor R * section53CutoffOscillationConstant Q := by + simpa [section53NormalizedCutoff, section53CutoffBound, + section53CutoffOscillationConstant] using hx + _ = section53CutoffOscillationConstant Q * section53CutoffScaleSep Q j := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + simp [section53CutoffScaleSep] + ring + have hφ_smooth' : ContDiff ℝ (⊤ : ℕ∞) (section53NormalizedCutoff Q) := by + simpa [section53NormalizedCutoff] using hφ_smooth + have hφ_compact' : HasCompactSupport (section53NormalizedCutoff Q) := by + simpa [section53NormalizedCutoff] using hφ_compact + have hφ_sub' : tsupport (section53NormalizedCutoff Q) ⊆ openCubeSet Q := by + simpa [section53NormalizedCutoff] using hφ_sub + have ht_le_one : t ≤ 1 := by + linarith + have hφDualS : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (section53NormalizedCutoff Q) ≤ + section53CutoffDualBound Q s := by + intro N + simpa [section53NormalizedCutoff, section53CutoffBound, + section53CutoffOscillationConstant, section53CutoffDualBound] using + cubeBesovDualTestNorm_normalized_quantitativeCubeCutoff_canonicalFun_le + Q (le_of_lt hs_lt_one) N + have hφDualT : + ∀ N : ℕ, + cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (section53NormalizedCutoff Q) ≤ + section53CutoffDualBound Q t := by + intro N + simpa [section53NormalizedCutoff, section53CutoffBound, + section53CutoffOscillationConstant, section53CutoffDualBound] using + cubeBesovDualTestNorm_normalized_quantitativeCubeCutoff_canonicalFun_le + Q ht_le_one N + have hφMem : + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (section53NormalizedCutoff Q) := by + simpa [section53NormalizedCutoff] using + cubeBesovDualLocalMemLpGlobal_normalized_quantitativeCubeCutoff_canonicalFun Q + have hcutoffGradient' : + MemLp (scalarCutoffGradientField (section53NormalizedCutoff Q)) ∞ + (normalizedCubeMeasure Q) := by + simpa [section53NormalizedCutoff] using hcutoffGradient + have hcutoffSmooth' : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField (section53NormalizedCutoff Q) x i) := by + intro i + simpa [section53NormalizedCutoff] using hcutoffSmooth i + have hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField (section53NormalizedCutoff Q) x i) z‖ ≤ + section53CutoffDerivativeBound Q := by + intro i z hz + simpa [section53NormalizedCutoff, section53CutoffBound, + section53CutoffDerivativeBound] using hcutoffDerivRaw i z hz + have hProductCoeff : + cutoffProductScaledWeakNormCoeff Q s t (section53CutoffDerivativeBound Q) + (scalarCutoffGradientField (section53NormalizedCutoff Q)) * + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight (-t) Q ≤ + section53CutoffProductCoeff Q s t := by + exact le_max_left _ _ + have hCprod : 0 ≤ section53CutoffProductCoeff Q s t := by + exact section53CutoffProductCoeff_nonneg Q s t + have hOneSq : Integrable (fun _ : RegCoeffField d => (1 : ℝ) ^ 2) P := by + simp + have hGradWeak : + Integrable + (fun a : RegCoeffField d => + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) P := by + have hprod := + integrable_mul_of_integrable_sq_of_ae_nonneg + (μ := P) + (X := fun a : RegCoeffField d => + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) + (Y := fun _ : RegCoeffField d => (1 : ℝ)) + (by simpa [Q] using hGradSq) hOneSq + (canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae hP Q hs p q p0) + (by filter_upwards with a; norm_num) + simpa using hprod + have hFluxWeak : + Integrable + (fun a : RegCoeffField d => + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) P := by + have hprod := + integrable_mul_of_integrable_sq_of_ae_nonneg + (μ := P) + (X := fun a : RegCoeffField d => + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) + (Y := fun _ : RegCoeffField d => (1 : ℝ)) + (by simpa [Q] using hFluxSq) hOneSq + (canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae hP Q ht p q q0) + (by filter_upwards with a; norm_num) + simpa using hprod + change + Ch04.expectedResponseJCubeSet P Q p q - (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + (1 + section53CutoffBound Q) (section53CutoffOscillationConstant Q) + (section53CutoffScaleSep Q j) (section53CutoffDualBound Q s) + (section53CutoffDualBound Q t) (section53CutoffProductCoeff Q s t) + p q p0 q0 + exact + expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_cutoffControls + hP hstat hk_nonneg hkm hs hs_lt_one ht hst + (section53NormalizedCutoff Q) + (1 + section53CutoffBound Q) (section53CutoffBound Q) + (section53CutoffOscillationConstant Q) (section53CutoffScaleSep Q j) + (section53CutoffDualBound Q s) (section53CutoffDualBound Q t) + (section53CutoffDerivativeBound Q) (section53CutoffProductCoeff Q s t) + p q p0 q0 hC hCprod hCut hMean' hφ_meas' hφ_bound' hOscPoint + hφ_smooth' hφ_compact' hφ_sub' (section53CutoffDerivativeBound_nonneg Q) + (section53CutoffDualBound_nonneg Q s) (section53CutoffDualBound_nonneg Q t) + hφDualS hφDualT hφMem hcutoffGradient' hcutoffSmooth' hcutoffDeriv hProductCoeff + hParent hJ hGradWeak hFluxWeak hGradSq hFluxSq + +/-- Normalized-cutoff assembly with the response integrability facts supplied +from the Section 5.2 `(P4)` integrability theorem and Ch4 stationarity. The +remaining inputs are exactly the two square-integrability facts for the scalar +maximizer weak norms. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_normalizedCutoff_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (p q p0 q0 : Vec d) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + (1 + section53CutoffBound Q) + (section53CutoffOscillationConstant Q) + (section53CutoffScaleSep Q j) + (section53CutoffDualBound Q s) + (section53CutoffDualBound Q t) + (section53CutoffProductCoeff Q s t) + p q p0 q0 := by + let Q : TriadicCube d := originCube d m + have hm_nonneg : 0 ≤ m := le_trans hk_nonneg hkm + have hBlockM_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat m : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat m) + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P := by + simpa [Int.toNat_of_nonneg hm_nonneg] using hBlockM_nat + have hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d m) p q hBlockM + have hBlockK_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat k : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat k) + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d k)) P := by + simpa [Int.toNat_of_nonneg hk_nonneg] using hBlockK_nat + have hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + have hBlockR : + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm hR hBlockK + exact + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + R p q hBlockR + exact + expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_normalizedCutoff + hP hstat hk_nonneg hkm hs hs_lt_one ht hst p q p0 q0 + hParent hJ hGradSq hFluxSq + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/PointwiseBound.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/PointwiseBound.lean new file mode 100644 index 0000000000..f4840ef835 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/PointwiseBound.lean @@ -0,0 +1,262 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.ExpectedRHSComparison + +/-! # Pointwise Bound -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# PointwiseBound + +Fixed-coefficient pointwise bound by the preliminary RHS. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Pointwise bridge from the deterministic split to the total Ch4-facing RHS at +origin scales. This is the a.e. ingredient that will be fed into the expectation +assembly theorem. -/ +theorem abs_centeredJMinusCutoffWeightedChildAtScale_le_jUpperWeakNormPointwiseRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m k : ℤ) (s t : ℝ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {C B Cosc scaleSep BφS BφT cutoffCircOne cutoffCircS cutoffDerivative + poincareConst cutoffConstant centeredCutoffConstant : ℝ} + (hC : 0 ≤ C) + (hCut : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q x) + (cubeSet (originCube d m)) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 x) + (cubeSet (originCube d m)) volume) + (hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 x) i) + (cubeSet (originCube d m)) volume) + (hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q q0 x) i) + (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hφ_meas : AEStronglyMeasurable φ (volumeMeasureOn (cubeSet (originCube d m)))) + (hφ_bound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet (originCube d m)), ‖φ x‖ ≤ B) + (hOscPoint : + ∀ R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)), + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ Cosc * scaleSep) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d m)) + (hcutoffGradient_eq : cutoffGradient = scalarCutoffGradientField φ) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, + cubeBesovDualTestNorm (originCube d m) t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal (originCube d m) (2 : ℝ≥0∞) φ) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hcutoffGradient : + MemLp cutoffGradient ∞ (normalizedCubeMeasure (originCube d m))) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate (originCube d m) poincareConst + (cubeFluctuation (originCube d m) + (canonicalMaximizerPotentialDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet (originCube d m), + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm (originCube d m) 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm (originCube d m) (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 (originCube d m) * + cubeLpNorm (originCube d m) ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor (originCube d m) * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm (originCube d m) ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) (originCube d m) * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ + jUpperWeakNormPointwiseRHSAtScale m k s t cutoffGradient + C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant p q p0 q0 a := by + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hdet : + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS)) * + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT)) * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun)) + + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + simpa [Q, j, F] using + abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillationBound_add_linearWeakNorms_add_cutoffProductBridgeRHS + (a := a) (ha := ha) (Q := Q) (j := j) (s := s) (t := t) + (φ := φ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (C := C) (B := B) (Cosc := Cosc) (scaleSep := scaleSep) + (BφS := BφS) (BφT := BφT) + (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hC (by simpa [Q, j] using hCut) (by simpa [Q] using hφ_int) + (by simpa [Q, F] using hRem_int) + (by simpa [Q, F] using hProduct_int) + (by simpa [Q, F] using hGradLinear_int) + (by simpa [Q, F] using hFluxLinear_int) + (by simpa [Q, F] using hGradField) + (by simpa [Q, F] using hFluxField) + (by simpa [Q] using hMean) + (by simpa [Q] using hφ_meas) + (by simpa [Q] using hφ_bound) + (by simpa [Q, j] using hOscPoint) + hφ hφ_compact (by simpa [Q] using hφ_sub) + hcutoffGradient_eq hcutoffDerivative hs_pos hs_lt_one ht_pos hBφS hBφT + (by simpa [Q] using hφDualS) (by simpa [Q] using hφDualT) + (by simpa [Q] using hφMem) + (by simpa [Q] using hdualField) + (by simpa [Q] using hcutoffGradient) + hcutoffConstant hcenteredCutoffConstant hpoincareConst + hcutoffCircOne hcutoffCircS + (by simpa [Q, F] using hfull) + hcutoffSmooth (by simpa [Q] using hcutoffDeriv) + (by simpa [Q] using hdualCircOne) + (by simpa [Q] using hdualCircS) + (by simpa [Q, F] using hcutoffConstant_bound) + (by simpa [Q] using hcenteredCutoffConstant_bound) + have hleft : + centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a = + centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q := by + simpa [Q, j, F] using + centeredJMinusCutoffWeightedChildAtScale_eq_dependentFamily_left + a ha m k φ p q p0 q0 + have hpartition : + responseJPartitionDefectOnFamilyAtDepth F Q j p q = + responseJAdditivityDefectAtScale m k p q a := by + simpa [Q, j, F] using + responseJPartitionDefectOnDependentFamilyAtScale_eq_responseJAdditivityDefectAtScale + a ha m k p q + have hchild : + childResponseJAverageOnFamilyAtDepth F Q j p q = + descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + simpa [Q, j, F] using + childResponseJAverageOnDependentFamilyAtScale_eq_ch04 a ha m k p q + simpa [jUpperWeakNormPointwiseRHSAtScale, Q, j, F, hleft, hpartition, hchild, + add_assoc] using hdet + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/RHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/RHS.lean new file mode 100644 index 0000000000..b34e00b737 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/RHS.lean @@ -0,0 +1,486 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.DeterministicAssembly + +/-! # RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ExpectationRHS + +Expected right-hand sides and nonnegativity facts. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Total Ch4-facing pointwise RHS for the first Section 5.3 lemma after the +deterministic split has been assembled. The only non-total deterministic +objects have been rewritten to Ch4 observables. -/ +noncomputable def jUpperWeakNormPointwiseRHSAtScale {d : ℕ} + (m k : ℤ) (s t : ℝ) (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) : RegCoeffField d → ℝ := + fun a => + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage := + descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt childAverage) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak)) + + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + +/-- Pointwise RHS with the cutoff-product term already in the manuscript Cauchy +product form. -/ +noncomputable def jUpperWeakNormManuscriptPointwiseRHSAtScale {d : ℕ} + (m k : ℤ) (s t : ℝ) + (C Cosc scaleSep BφS BφT Cprod : ℝ) + (p q p0 q0 : Vec d) : RegCoeffField d → ℝ := + fun a => + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let childAverage := + descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad := gradWeak + let scaledFlux := fluxWeak + (2 * C) * + (Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt childAverage) + + Cosc * scaleSep * Ch04.restrictionResponseJObservableCubeSet Q p q a + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak)) + + Cprod * (scaledGrad * scaledFlux) + +/-- Expected right-hand side after the first stochastic assembly step for +Lemma `l.J.upper.bound.weak.norms.homogenization.scale`. The square-root +additivity term has been converted to `sqrt tau * sqrt E[J_k]`; the remaining +weak-norm and cutoff-product terms are still written as expectations of the +Ch4 scalar-response observables. -/ +noncomputable def jUpperWeakNormExpectedRHSAtScale {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (m k : ℤ) (s t : ℝ) + (cutoffGradient : Vec d → Vec d) + (C Cosc scaleSep BφS BφT cutoffCircOne poincareConst cutoffConstant + centeredCutoffConstant : ℝ) + (p q p0 q0 : Vec d) : ℝ := + let Q : TriadicCube d := originCube d m + let gradWeak : RegCoeffField d → ℝ := fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) + + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * + ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * + ∫ a, fluxWeak a ∂P)) + + ∫ a, + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant ∂P + +/-- Manuscript-facing expected RHS for Lemma +`l.J.upper.bound.weak.norms.homogenization.scale`. Compared with +`jUpperWeakNormExpectedRHSAtScale`, the cutoff-product bridge expectation has +been replaced by the final Cauchy product of the note-normalized gradient and +flux weak-norm square expectations. -/ +noncomputable def jUpperWeakNormManuscriptExpectedRHSAtScale {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (m k : ℤ) (s t : ℝ) + (C Cosc scaleSep BφS BφT Cprod : ℝ) + (p q p0 q0 : Vec d) : ℝ := + let Q : TriadicCube d := originCube d m + let gradWeak : RegCoeffField d → ℝ := fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad : RegCoeffField d → ℝ := gradWeak + let scaledFlux : RegCoeffField d → ℝ := fluxWeak + (2 * C) * + (Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q)) + + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * + ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * + ∫ a, fluxWeak a ∂P)) + + Cprod * + (Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P)) + +/-- At origin scales, the deterministic child response average for the Ch4 +dependent family is the total Ch4 descendant response average. -/ +theorem childResponseJAverageOnDependentFamilyAtScale_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m k : ℤ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + childResponseJAverageOnFamilyAtDepth F (originCube d m) (Int.toNat (m - k)) p q = + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + intro F + unfold childResponseJAverageOnFamilyAtDepth + exact descendantsAverage_congr_of_eq_on_descendants + (originCube d m) (Int.toNat (m - k)) (by + intro R _hR + exact responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha R p q) + +/-- The total Ch4 descendant response average is pointwise nonnegative. -/ +theorem descendantsAverage_restrictionResponseJObservableCubeSet_nonneg + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (p q : Vec d) + (a : RegCoeffField d) : + 0 ≤ descendantsAverage Q j + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + simpa [Ch04.restrictionResponseJObservableCubeSet] using + descendantsAverage_nonneg Q j + (fun R => ResponseJ (cubeSet R) p q a) + (fun R _hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p q a) + +/-- The private additivity-defect observable is integrable when the parent and +child response observables are integrable. -/ +theorem integrable_responseJAdditivityDefectAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {k m : ℤ} (hkm : k ≤ m) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + Integrable (responseJAdditivityDefectAtScale m k p q) P := by + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)) → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR) + have hAvgInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) P := + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + simpa [responseJAdditivityDefectAtScale] using! hAvgInt.sub hParent + +/-- The additivity-defect observable is nonnegative on the a.s. elliptic +support of a Chapter 4 law carrier. -/ +theorem responseJAdditivityDefectAtScale_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) {k m : ℤ} (hkm : k ≤ m) + (p q : Vec d) : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + have hle : + Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a ≤ + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := + Ch04.restrictionResponseJObservableCubeSet_le_descendantsAverage_of_aelocallyUniformlyEllipticField + (a := a) ha hkm p q + simpa [responseJAdditivityDefectAtScale] using sub_nonneg.mpr hle + +/-- The square-root additivity term is controlled in expectation by the +geometric mean of the `tau` defect and the child-scale annealed response. -/ +theorem integral_sqrt_responseJAdditivityDefectAtScale_mul_sqrt_childResponseAverage_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + Real.sqrt (responseJAdditivityDefectAtScale m k p q a) * + Real.sqrt + (descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) ∂P + ≤ + Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q) := by + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)) → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR) + have hChildInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) P := + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + have hDefectInt : + Integrable (responseJAdditivityDefectAtScale m k p q) P := + integrable_responseJAdditivityDefectAtScale hkm p q hParent hDesc + have hDefectNonneg : + 0 ≤ᵐ[P] responseJAdditivityDefectAtScale m k p q := + responseJAdditivityDefectAtScale_nonneg_ae hP hkm p q + have hChildNonneg : + 0 ≤ᵐ[P] + fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) := by + filter_upwards with a + exact descendantsAverage_restrictionResponseJObservableCubeSet_nonneg + (originCube d m) (Int.toNat (m - k)) p q a + have hCauchy := + integral_sqrt_mul_sqrt_le_sqrt_integral_mul_sqrt_integral + (μ := P) + (A := responseJAdditivityDefectAtScale m k p q) + (B := fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) + hDefectInt hChildInt hDefectNonneg hChildNonneg + have hDefectIntegral : + ∫ a, responseJAdditivityDefectAtScale m k p q a ∂P = + tauAtScale P m k p q := + integral_responseJAdditivityDefectAtScale_eq_tauAtScale + hP hstat hk_nonneg hkm p q hParent hDesc + have hChildIntegral : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) ∂P = + Ch04.expectedResponseJCubeSet P (originCube d k) p q := + hP.integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_originCube_of_stationary + hstat hk_nonneg hkm p q hDesc + have hChildIntegral' : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => ResponseJ (cubeSet R) p q a) ∂P = + Ch04.expectedResponseJCubeSet P (originCube d k) p q := by + simpa [Ch04.restrictionResponseJObservableCubeSet] using hChildIntegral + simpa [Ch04.restrictionResponseJObservableCubeSet, hDefectIntegral, hChildIntegral'] using hCauchy + +/-- A.e. nonnegativity of the Ch4 scalar-response gradient weak norm. -/ +theorem canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) + (p q p0 : Vec d) : + 0 ≤ᵐ[P] (fun a : RegCoeffField d => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminorm Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) := + cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) + have hpartial_le : + cubeBesovNegativeVectorPartialSeminorm Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) ≤ + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun := by + simpa [F, aQ] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs 0 p q p0 + exact hpartial_nonneg.trans hpartial_le + +/-- A.e. nonnegativity of the Ch4 scalar-response flux weak norm. -/ +theorem canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) {t : ℝ} (ht : 0 < t) + (p q q0 : Vec d) : + 0 ≤ᵐ[P] (fun a : RegCoeffField d => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminorm Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) := + cubeBesovNegativeVectorPartialSeminorm_nonneg Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) + have hpartial_le : + cubeBesovNegativeVectorPartialSeminorm Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) ≤ + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun := by + simpa [F, aQ] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q ht 0 p q q0 + exact hpartial_nonneg.trans hpartial_le + +/-- A.e. nonnegativity of a scaled Ch4 scalar-response gradient weak norm. -/ +theorem scaledCanonicalScalarResponseGradientWeakNorm_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) + (p q p0 : Vec d) : + 0 ≤ᵐ[P] + fun a : RegCoeffField d => + cubeBesovScaleWeight (-s) Q * + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun := by + filter_upwards [canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae hP Q hs p q p0] + with a ha + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) ha + +/-- A.e. nonnegativity of a scaled Ch4 scalar-response flux weak norm. -/ +theorem scaledCanonicalScalarResponseFluxWeakNorm_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) {t : ℝ} (ht : 0 < t) + (p q q0 : Vec d) : + 0 ≤ᵐ[P] + fun a : RegCoeffField d => + cubeBesovScaleWeight (-t) Q * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun := by + filter_upwards [canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae hP Q ht p q q0] + with a ha + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-t) Q) ha + +/-- Expectation of the cutoff-product bridge is bounded by the manuscript +square-root product once the deterministic bridge has been pointwise replaced +by the note-normalized gradient/flux weak-norm product. -/ +theorem integral_cutoffProductBridgeRHS_le_weakNormSquareProduct + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) + (cutoffGradient : Vec d → Vec d) + (cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant Cprod : ℝ) + (p q p0 q0 : Vec d) + (hCprod : 0 ≤ Cprod) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) ^ 2) P) + (hProductInt : + Integrable + (fun a : RegCoeffField d => + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant) P) + (hProductPoint : + ∀ᵐ a ∂P, + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + ≤ + Cprod * + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun * + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun)) : + ∫ a, + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant ∂P + ≤ + Cprod * + (Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) ^ 2 ∂P) * + Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) ^ 2 ∂P)) := by + let : IsProbabilityMeasure P := hP.isProbability + let scaledGrad : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let scaledFlux : RegCoeffField d → ℝ := + fun a => Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let productPoint : RegCoeffField d → ℝ := + fun a => + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant + have hGradNonneg : 0 ≤ᵐ[P] scaledGrad := by + simpa [scaledGrad] using + canonicalScalarResponseGradientWeakNormCubeSet_nonneg_ae hP Q hs p q p0 + have hFluxNonneg : 0 ≤ᵐ[P] scaledFlux := by + simpa [scaledFlux] using + canonicalScalarResponseFluxWeakNormCubeSet_nonneg_ae hP Q ht p q q0 + have hScaledProdInt : Integrable (fun a => scaledGrad a * scaledFlux a) P := + integrable_mul_of_integrable_sq_of_ae_nonneg + (X := scaledGrad) (Y := scaledFlux) + (by simpa [scaledGrad] using hGradSq) + (by simpa [scaledFlux] using hFluxSq) + hGradNonneg hFluxNonneg + have hConstProdInt : + Integrable (fun a => Cprod * (scaledGrad a * scaledFlux a)) P := by + simpa using hScaledProdInt.const_mul Cprod + have hMono : + ∫ a, productPoint a ∂P ≤ + ∫ a, Cprod * (scaledGrad a * scaledFlux a) ∂P := + integral_mono_ae + (by simpa [productPoint] using hProductInt) hConstProdInt + (by simpa [productPoint, scaledGrad, scaledFlux] using! hProductPoint) + have hCauchy : + ∫ a, scaledGrad a * scaledFlux a ∂P ≤ + Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P) := + integral_mul_le_sqrt_integral_sq_mul_sqrt_integral_sq_of_ae_nonneg + (X := scaledGrad) (Y := scaledFlux) + (by simpa [scaledGrad] using hGradSq) + (by simpa [scaledFlux] using hFluxSq) + hGradNonneg hFluxNonneg + calc + ∫ a, productPoint a ∂P + ≤ ∫ a, Cprod * (scaledGrad a * scaledFlux a) ∂P := hMono + _ = Cprod * ∫ a, scaledGrad a * scaledFlux a ∂P := by + rw [integral_const_mul] + _ ≤ + Cprod * + (Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P)) := + mul_le_mul_of_nonneg_left hCauchy hCprod + _ = + Cprod * + (Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun) ^ 2 ∂P) * + Real.sqrt + (∫ a, + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun) ^ 2 ∂P)) := by + simp [scaledGrad, scaledFlux] + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/YoungRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/YoungRHS.lean new file mode 100644 index 0000000000..4b3759b20f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Expectation/YoungRHS.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Expectation.NormalizedCutoff +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries + +/-! # Young RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# YoungRHS + +An alternative expectation surface for the first Section 5.3 lemma. The +standard manuscript RHS collapses the additivity term by Cauchy in probability, +giving `sqrt tau * sqrt E[J_k]`. For the flatness-rules route we keep the +estimate base-free by applying Young to that scalar product, producing +`eta * E[J_k] + eta^{-1} * tau` instead. +-/ + +open MeasureTheory +open scoped BigOperators +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- Manuscript expected RHS with the first square-root additivity term replaced +by its Young envelope. -/ +noncomputable def jUpperWeakNormYoungManuscriptExpectedRHSAtScale {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (m k : ℤ) (s t : ℝ) + (C Cosc scaleSep BφS BφT Cprod η : ℝ) + (p q p0 q0 : Vec d) : ℝ := + let Q : TriadicCube d := originCube d m + let gradWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak : RegCoeffField d → ℝ := fun a => + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + let scaledGrad : RegCoeffField d → ℝ := gradWeak + let scaledFlux : RegCoeffField d → ℝ := fluxWeak + C * + (η * Ch04.expectedResponseJCubeSet P (originCube d k) p q + + η⁻¹ * tauAtScale P m k p q) + + Cosc * scaleSep * Ch04.expectedResponseJCubeSet P Q p q + + ((1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * + ∫ a, gradWeak a ∂P) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * + ∫ a, fluxWeak a ∂P)) + + Cprod * + (Real.sqrt (∫ a, (scaledGrad a) ^ 2 ∂P) * + Real.sqrt (∫ a, (scaledFlux a) ^ 2 ∂P)) + +private theorem sqrt_mul_sqrt_le_young + {x y η : ℝ} (hx : 0 ≤ x) (hy : 0 ≤ y) (hη : 0 < η) : + Real.sqrt x * Real.sqrt y ≤ + (η * y + η⁻¹ * x) / 2 := by + have hyoung := + two_mul_le_add_mul_sq (a := Real.sqrt y) (b := Real.sqrt x) hη + have hx_sq : (Real.sqrt x) ^ (2 : ℕ) = x := by + simpa [pow_two] using Real.sq_sqrt hx + have hy_sq : (Real.sqrt y) ^ (2 : ℕ) = y := by + simpa [pow_two] using Real.sq_sqrt hy + have htwice : + 2 * (Real.sqrt x * Real.sqrt y) ≤ η * y + η⁻¹ * x := by + simpa [mul_assoc, mul_left_comm, mul_comm, hx_sq, hy_sq] using hyoung + linarith + +private theorem expectedResponseJCubeSet_nonneg + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (Q : TriadicCube d) (p q : Vec d) : + 0 ≤ Ch04.expectedResponseJCubeSet P Q p q := by + dsimp [Ch04.expectedResponseJCubeSet] + exact integral_nonneg fun a => Ch04.restrictionResponseJObservableCubeSet_nonneg Q p q a + +/-- The standard manuscript RHS is bounded by the Young-envelope RHS for the +first additivity term. -/ +theorem jUpperWeakNormManuscriptExpectedRHSAtScale_le_youngManuscriptExpectedRHSAtScale + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {m k : ℤ} {s t : ℝ} + {C Cosc scaleSep BφS BφT Cprod η : ℝ} + (p q p0 q0 : Vec d) + (hC : 0 ≤ C) (hη : 0 < η) + (htau : 0 ≤ tauAtScale P m k p q) + (hresponse : 0 ≤ Ch04.expectedResponseJCubeSet P (originCube d k) p q) : + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 + ≤ + jUpperWeakNormYoungManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod η p q p0 q0 := by + let Q : TriadicCube d := originCube d m + let T := + Real.sqrt (tauAtScale P m k p q) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d k) p q) + let Y := + η * Ch04.expectedResponseJCubeSet P (originCube d k) p q + + η⁻¹ * tauAtScale P m k p q + have hTY : 2 * T ≤ Y := by + have h := + sqrt_mul_sqrt_le_young + (x := tauAtScale P m k p q) + (y := Ch04.expectedResponseJCubeSet P (originCube d k) p q) + htau hresponse hη + have hmul := mul_le_mul_of_nonneg_left h (by norm_num : (0 : ℝ) ≤ 2) + calc + 2 * T ≤ 2 * (Y / 2) := by + simpa [T, Y, mul_assoc, mul_left_comm, mul_comm] using hmul + _ = Y := by ring + have hfirst : + (2 * C) * T ≤ C * Y := by + calc + (2 * C) * T = C * (2 * T) := by ring + _ ≤ C * Y := mul_le_mul_of_nonneg_left hTY hC + unfold jUpperWeakNormManuscriptExpectedRHSAtScale + unfold jUpperWeakNormYoungManuscriptExpectedRHSAtScale + dsimp only + nlinarith [hfirst] + +/-- First Section 5.3 lemma with the Young-envelope additivity term, using the +same normalized cutoff and P4 integrability inputs as the standard public +surface. -/ +theorem expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormYoungManuscriptExpectedRHSAtScale_of_normalizedCutoff_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + {s t : ℝ} (hs : 0 < s) (hs_lt_one : s < 1) (ht : 0 < t) + (hst : s + t ≤ 1) + (p q p0 q0 : Vec d) {η : ℝ} (hη : 0 < η) + (hGradSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a.toFun) ^ 2) P) + (hFluxSq : + Integrable + (fun a : RegCoeffField d => + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a.toFun) ^ 2) P) : + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormYoungManuscriptExpectedRHSAtScale P m k s t + (1 + section53CutoffBound Q) + (section53CutoffOscillationConstant Q) + (section53CutoffScaleSep Q j) + (section53CutoffDualBound Q s) + (section53CutoffDualBound Q t) + (section53CutoffProductCoeff Q s t) + η p q p0 q0 := by + dsimp only + let Q : TriadicCube d := originCube d m + let j : ℕ := Int.toNat (m - k) + let C := 1 + section53CutoffBound Q + let Cosc := section53CutoffOscillationConstant Q + let scaleSep := section53CutoffScaleSep Q j + let BφS := section53CutoffDualBound Q s + let BφT := section53CutoffDualBound Q t + let Cprod := section53CutoffProductCoeff Q s t + have hstandard : + Ch04.expectedResponseJCubeSet P Q p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 := by + simpa [Q, j, C, Cosc, scaleSep, BφS, BφT, Cprod] using + expectedResponseJCubeSet_sub_half_dot_le_jUpperWeakNormManuscriptExpectedRHSAtScale_of_normalizedCutoff_of_P4 + hP hstat hStruct hP4 hk_nonneg hkm hs hs_lt_one ht hst p q p0 q0 + hGradSq hFluxSq + have hm_nonneg : 0 ≤ m := le_trans hk_nonneg hkm + have hBlockM_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat m : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat m) + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P := by + simpa [Int.toNat_of_nonneg hm_nonneg] using hBlockM_nat + have hBlockK_nat : + Integrable + (Ch04.coarseFullBlockMatrixAtCube + (originCube d ((Int.toNat k : ℕ) : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 (Int.toNat k) + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d k)) P := by + simpa [Int.toNat_of_nonneg hk_nonneg] using hBlockK_nat + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm hR hBlockK + have htau : + 0 ≤ tauAtScale P m k p q := + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm p q hBlockM hDescBlock + have hresponse : + 0 ≤ Ch04.expectedResponseJCubeSet P (originCube d k) p q := + expectedResponseJCubeSet_nonneg P (originCube d k) p q + have hC_nonneg : 0 ≤ C := by + dsimp [C] + nlinarith [section53CutoffBound_nonneg Q] + have hcompare : + jUpperWeakNormManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod p q p0 q0 + ≤ + jUpperWeakNormYoungManuscriptExpectedRHSAtScale P m k s t + C Cosc scaleSep BφS BφT Cprod η p q p0 q0 := + jUpperWeakNormManuscriptExpectedRHSAtScale_le_youngManuscriptExpectedRHSAtScale + p q p0 q0 hC_nonneg hη htau hresponse + exact hstandard.trans hcompare + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/FiveTermSplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/FiveTermSplit.lean new file mode 100644 index 0000000000..326dcd7d2f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/FiveTermSplit.lean @@ -0,0 +1,593 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Additivity.CrossTerm + +/-! # Five Term Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# FiveTermSplit + +Deterministic five-term splitting of the centered response. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Cutoff insertion and descendant partition for the parent centered response, +before the mean-defect term is rewritten using child energies. -/ +theorem centeredResponseJOnCube_eq_cutoffProduct_add_cutoffOscillation_add_meanDefect_add_linearPair + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hTop_int : + IntegrableOn (topHalfEnergyDensityOnCube Q a p q) + (cubeSet Q) volume) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * topHalfEnergyDensityOnCube Q a p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * centeredProductDensityOnCube Q a p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * centeredGradientLinearDensityOnCube Q a p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * centeredFluxLinearDensityOnCube Q a p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * topHalfEnergyDensityOnCube Q a p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) : + centeredResponseJOnCube Q a p q p0 q0 = + cutoffProductTermOnCube Q a φ p q p0 q0 + + cutoffOscillationTermOnCubeAtDepth Q a j φ p q + + meanDefectTopEnergyTermOnCubeAtDepth Q a j φ p q + + cutoffLinearPairTermOnCube Q a φ p q p0 q0 := by + classical + let F : Vec d → ℝ := topHalfEnergyDensityOnCube Q a p q + let c : ℝ := (1 / 2 : ℝ) * vecDot p0 q0 + let Pden : Vec d → ℝ := centeredProductDensityOnCube Q a p q p0 q0 + let Gden : Vec d → ℝ := centeredGradientLinearDensityOnCube Q a p q p0 q0 + let Hden : Vec d → ℝ := centeredFluxLinearDensityOnCube Q a p q p0 q0 + have hF_norm : Integrable F (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q + (by simpa [F] using hTop_int) + have hφ_norm : Integrable φ (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q hφ_int + have hRem_norm : Integrable (fun x => (1 - φ x) * F x) (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q + (by simpa [F] using hRem_int) + have hProduct_norm : + Integrable (fun x => φ x * Pden x) (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q + (by simpa [Pden] using hProduct_int) + have hGrad_norm : + Integrable (fun x => φ x * Gden x) (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q + (by simpa [Gden] using hGradLinear_int) + have hFlux_norm : + Integrable (fun x => φ x * Hden x) (normalizedCubeMeasure Q) := + integrable_normalizedCubeMeasure_of_integrableOn_cubeSet Q + (by simpa [Hden] using hFluxLinear_int) + have hCutPoint : + (fun x => φ x * (F x - c)) = + fun x => φ x * Pden x + (φ x * Gden x + φ x * Hden x) := by + funext x + have hcenter : + F x - c = Pden x + Gden x + Hden x := by + calc + F x - c = + centeredProductDensityOnCube Q a p q p0 q0 x + + centeredGradientLinearDensityOnCube Q a p q p0 q0 x + + centeredFluxLinearDensityOnCube Q a p q p0 q0 x := by + simpa [F, c] using + (centeredProduct_add_linear_densities_eq_topHalfEnergy_sub_half_dot + Q a p q p0 q0 x).symm + _ = Pden x + Gden x + Hden x := by + simp [Pden, Gden, Hden] + rw [hcenter] + ring + have hCut_norm : + Integrable (fun x => φ x * (F x - c)) (normalizedCubeMeasure Q) := by + have hsum : + Integrable + (fun x => φ x * Pden x + (φ x * Gden x + φ x * Hden x)) + (normalizedCubeMeasure Q) := + hProduct_norm.add (hGrad_norm.add hFlux_norm) + simpa [hCutPoint] using hsum + have hCutoffInsert : + cubeAverage Q F - c = + cubeAverage Q (fun x => φ x * (F x - c)) + + cubeAverage Q (fun x => (1 - φ x) * F x) := + cubeAverage_sub_const_eq_cubeAverage_cutoff_centered_add_cubeAverage_one_sub_cutoff_mul + Q hF_norm hφ_norm hCut_norm hRem_norm hMean + have hCutAvg : + cubeAverage Q (fun x => φ x * (F x - c)) = + cutoffProductTermOnCube Q a φ p q p0 q0 + + cutoffLinearPairTermOnCube Q a φ p q p0 q0 := by + rw [hCutPoint] + rw [cubeAverage_add_of_integrableOn Q + (fun x => φ x * Pden x) + (fun x => φ x * Gden x + φ x * Hden x)] + · rw [cubeAverage_add_of_integrableOn Q + (fun x => φ x * Gden x) (fun x => φ x * Hden x)] + · simp [Pden, Gden, Hden, cutoffProductTermOnCube, + cutoffLinearPairTermOnCube, cutoffGradientLinearTermOnCube, + cutoffFluxLinearTermOnCube] + · simpa [Gden] using hGradLinear_int + · simpa [Hden] using hFluxLinear_int + · simpa [Pden] using hProduct_int + · simpa [Gden, Hden] using! hGradLinear_int.add hFluxLinear_int + have hRemAvg : + cubeAverage Q (fun x => (1 - φ x) * F x) = + cutoffOscillationTermOnCubeAtDepth Q a j φ p q + + meanDefectTopEnergyTermOnCubeAtDepth Q a j φ p q := by + have hpart := + cubeAverage_one_sub_cutoff_mul_eq_descendantsAverage_cutoff_oscillation_add_mean_defect + Q j φ F + (by simpa [F] using hRem_int) + (by + intro R hR + simpa [F] using hOsc_int R hR) + (by + intro R hR + exact hTop_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR)) + rw [hpart] + rw [descendantsAverage_add] + simp [F, cutoffOscillationTermOnCubeAtDepth, + meanDefectTopEnergyTermOnCubeAtDepth] + calc + centeredResponseJOnCube Q a p q p0 q0 + = cubeAverage Q F - c := by + simpa [F, c] using + centeredResponseJOnCube_eq_cubeAverage_topHalfEnergy_sub_half_dot + Q a p q p0 q0 + _ = cubeAverage Q (fun x => φ x * (F x - c)) + + cubeAverage Q (fun x => (1 - φ x) * F x) := hCutoffInsert + _ = (cutoffProductTermOnCube Q a φ p q p0 q0 + + cutoffLinearPairTermOnCube Q a φ p q p0 q0) + + (cutoffOscillationTermOnCubeAtDepth Q a j φ p q + + meanDefectTopEnergyTermOnCubeAtDepth Q a j φ p q) := by + rw [hCutAvg, hRemAvg] + _ = + cutoffProductTermOnCube Q a φ p q p0 q0 + + cutoffOscillationTermOnCubeAtDepth Q a j φ p q + + meanDefectTopEnergyTermOnCubeAtDepth Q a j φ p q + + cutoffLinearPairTermOnCube Q a φ p q p0 q0 := by + ring + +/-- The parent-energy mean-defect term becomes additivity-cross plus the +cutoff-weighted child response once child energy has been identified. -/ +theorem meanDefectTopEnergyTermOnCubeAtDepth_eq_additivityCross_add_cutoffWeightedChildResponseJ + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) + (cross : TriadicCube d → ℝ) + (hChildEnergy : + ∀ R ∈ descendantsAtDepth Q j, + cubeAverage R (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) = + cross R + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q) : + meanDefectTopEnergyTermOnCubeAtDepth Q (a.coeffOn Q) j φ p q = + additivityCrossTermOnCubeAtDepth Q j φ cross + + cutoffWeightedChildResponseJOnFamilyAtDepth a Q j φ p q := by + classical + unfold meanDefectTopEnergyTermOnCubeAtDepth additivityCrossTermOnCubeAtDepth + cutoffWeightedChildResponseJOnFamilyAtDepth cutoffChildWeight + rw [← descendantsAverage_add] + refine descendantsAverage_congr_of_eq_on_descendants Q j ?_ + intro R hR + rw [hChildEnergy R hR] + ring + +/-- Deterministic analytic core of the first Section 5.3 lemma: the centered +parent response minus the cutoff-weighted child response splits into the +additivity cross term, cutoff oscillation, linear terms, and product term. -/ +theorem centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_additivityCross_add_cutoffOscillation_add_linearPair_add_product + {d : ℕ} (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (cross : TriadicCube d → ℝ) + (hTop_int : + IntegrableOn (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) + (cubeSet Q) volume) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) + (hChildEnergy : + ∀ R ∈ descendantsAtDepth Q j, + cubeAverage R (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) = + cross R + Ch02.responseJ (Ch02.cubeDomain R) (a.coeffOn R) p q) : + centeredResponseJOnCube Q (a.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth a Q j φ p q = + additivityCrossTermOnCubeAtDepth Q j φ cross + + cutoffOscillationTermOnCubeAtDepth Q (a.coeffOn Q) j φ p q + + cutoffLinearPairTermOnCube Q (a.coeffOn Q) φ p q p0 q0 + + cutoffProductTermOnCube Q (a.coeffOn Q) φ p q p0 q0 := by + have hsplit := + centeredResponseJOnCube_eq_cutoffProduct_add_cutoffOscillation_add_meanDefect_add_linearPair + Q (a.coeffOn Q) j φ p q p0 q0 hTop_int hφ_int hRem_int + hProduct_int hGradLinear_int hFluxLinear_int hOsc_int hMean + have hmean := + meanDefectTopEnergyTermOnCubeAtDepth_eq_additivityCross_add_cutoffWeightedChildResponseJ + a Q j φ p q cross hChildEnergy + rw [hsplit, hmean] + ring + +/-- Concrete deterministic analytic core, with the child-energy equality +discharged by the explicit additivity-cross density. -/ +theorem centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_concreteAdditivityCross_add_cutoffOscillation_add_linearPair_add_product + {d : ℕ} [NeZero d] (a : Ch02.TriadicCoeffFamily d) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hTop_int : + IntegrableOn (topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q) + (cubeSet Q) volume) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q (a.coeffOn Q) p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q (a.coeffOn Q) p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) + (hCoeff : + ∀ R ∈ descendantsAtDepth Q j, + (a.coeffOn Q).toCoeffField = (a.coeffOn R).toCoeffField) : + centeredResponseJOnCube Q (a.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth a Q j φ p q = + concreteAdditivityCrossTermOnFamilyAtDepth a Q j φ p q + + cutoffOscillationTermOnCubeAtDepth Q (a.coeffOn Q) j φ p q + + cutoffLinearPairTermOnCube Q (a.coeffOn Q) φ p q p0 q0 + + cutoffProductTermOnCube Q (a.coeffOn Q) φ p q p0 q0 := by + simpa [concreteAdditivityCrossTermOnFamilyAtDepth] using + centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_additivityCross_add_cutoffOscillation_add_linearPair_add_product + a Q j φ p q p0 q0 + (fun R => cubeAverage R (childAdditivityCrossDensityOnFamilyOnCube a Q R p q)) + hTop_int hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int + hOsc_int hMean + (by + intro R hR + exact + cubeAverage_topHalfEnergyOnFamily_eq_childAdditivityCross_add_responseJOnChild + a Q R p q (hCoeff R hR) + (childAdditivityCrossDensityOnFamilyOnCube_integrableOn + a Q hR p q)) + +/-- Concrete deterministic analytic core for the Chapter 4 dependent +coefficient family. Here the parent and child representatives are definitionally +the sampled coefficient field, so no representative-equality hypothesis remains. -/ +theorem centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_concreteAdditivityCross_add_cutoffOscillation_add_linearPair_add_product_of_aELocallyUniformlyEllipticField + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q = + concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q + + cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q + + cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0 + + cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0 := by + intro F + exact + centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_concreteAdditivityCross_add_cutoffOscillation_add_linearPair_add_product + F Q j φ p q p0 q0 + (topHalfEnergyDensityOnCube_integrableOn_cubeSet Q (F.coeffOn Q) p q) + hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int hOsc_int + hMean + (by + intro R _hR + simp [F, Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField_coeffOn_toCoeffField]) + +/-- Deterministic assembled Section 5.3 estimate after the five-term split: +the additivity-cross term is in the manuscript response-partition-defect form, +while the cutoff oscillation, linear pair, and product terms remain as the +separate deterministic terms estimated elsewhere. -/ +theorem abs_centeredResponseJOnCube_sub_cutoffWeightedChildResponseJOnDependentFamily_le_additivityDefect_add_cutoffOscillation_add_linearPair_add_product + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + {C : ℝ} + (hC : 0 ≤ C) + (hCut : ∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ C) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hRem_int : + IntegrableOn + (fun x => (1 - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet Q) volume) + (hProduct_int : + IntegrableOn + (fun x => φ x * + centeredProductDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hGradLinear_int : + IntegrableOn + (fun x => φ x * + centeredGradientLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hFluxLinear_int : + IntegrableOn + (fun x => φ x * + centeredFluxLinearDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 x) + (cubeSet Q) volume) + (hOsc_int : + ∀ R ∈ descendantsAtDepth Q j, + IntegrableOn + (fun x => + (cubeAverage R φ - φ x) * + topHalfEnergyDensityOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x) + (cubeSet R) volume) + (hMean : cubeAverage Q φ = 1) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| ≤ + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + + |cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q| + + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| + + |cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0| := by + intro F + let X : ℝ := concreteAdditivityCrossTermOnFamilyAtDepth F Q j φ p q + let O : ℝ := cutoffOscillationTermOnCubeAtDepth Q (F.coeffOn Q) j φ p q + let L : ℝ := cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0 + let Prod : ℝ := cutoffProductTermOnCube Q (F.coeffOn Q) φ p q p0 q0 + let B : ℝ := + (2 * C) * + (Real.sqrt (responseJPartitionDefectOnFamilyAtDepth F Q j p q) * + Real.sqrt (childResponseJAverageOnFamilyAtDepth F Q j p q)) + have hsplit : + centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q = + X + O + L + Prod := by + simpa [F, X, O, L, Prod] using + centeredResponseJOnCube_sub_cutoffWeightedChildResponseJ_eq_concreteAdditivityCross_add_cutoffOscillation_add_linearPair_add_product_of_aELocallyUniformlyEllipticField + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (p := p) (q := q) (p0 := p0) (q0 := q0) + hφ_int hRem_int hProduct_int hGradLinear_int hFluxLinear_int hOsc_int hMean + have hcross : |X| ≤ B := by + simpa [F, X, B] using + abs_concreteAdditivityCrossTermOnDependentFamilyAtDepth_le_two_const_mul_sqrt_responseJPartitionDefect_mul_sqrt_childResponseJAverage + (a := a) (ha := ha) (Q := Q) (j := j) (φ := φ) + (p := p) (q := q) hC hCut + have htri : |X + O + L + Prod| ≤ |X| + |O| + |L| + |Prod| := by + calc + |X + O + L + Prod| = |(X + O) + (L + Prod)| := by ring_nf + _ ≤ |X + O| + |L + Prod| := abs_add_le _ _ + _ ≤ (|X| + |O|) + (|L| + |Prod|) := by + exact add_le_add (abs_add_le X O) (abs_add_le L Prod) + _ = |X| + |O| + |L| + |Prod| := by ring + calc + |centeredResponseJOnCube Q (F.coeffOn Q) p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth F Q j φ p q| + = |X + O + L + Prod| := by rw [hsplit] + _ ≤ |X| + |O| + |L| + |Prod| := htri + _ ≤ B + |O| + |L| + |Prod| := by nlinarith + +/-- Raw Ch2 response for the Chapter 4 dependent coefficient family is the +Ch4 cube-set response observable. -/ +theorem responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + {d : ℕ} [NeZero d] (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (p q : Vec d) : + Ch02.responseJ (Ch02.cubeDomain Q) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q = + Ch04.restrictionResponseJObservableCubeSet Q p q a := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q + = ResponseJ (openCubeSet Q) p q a := by + simpa [F, Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + Ch04.coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q) p q + _ = Ch04.restrictionResponseJObservableCubeSet Q p q a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a] + rfl + +/-- At origin scales, the deterministic response partition defect for the Ch4 +dependent family is the Ch4 additivity-defect observable. -/ +theorem responseJPartitionDefectOnDependentFamilyAtScale_eq_responseJAdditivityDefectAtScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m k : ℤ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + responseJPartitionDefectOnFamilyAtDepth F (originCube d m) (Int.toNat (m - k)) p q = + responseJAdditivityDefectAtScale m k p q a := by + intro F + unfold responseJPartitionDefectOnFamilyAtDepth childResponseJAverageOnFamilyAtDepth + responseJAdditivityDefectAtScale + congr 1 + · exact descendantsAverage_congr_of_eq_on_descendants + (originCube d m) (Int.toNat (m - k)) (by + intro R _hR + exact responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha R p q) + · exact responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha (originCube d m) p q + +/-- Centered raw Ch2 response for the Chapter 4 dependent family is the Ch4 +centered response observable. -/ +theorem centeredResponseJOnDependentFamily_eq_restrictionCenteredResponseJObservableCubeSet + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (p q p0 q0 : Vec d) : + centeredResponseJOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 = + Ch04.restrictionCenteredResponseJObservableCubeSet Q p q p0 q0 a := by + simp [centeredResponseJOnCube, Ch04.restrictionCenteredResponseJObservableCubeSet, + responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha Q p q] + +/-- The deterministic child-weighted raw Ch2 response average agrees with the +Ch4 response-observable average. -/ +theorem cutoffWeightedChildResponseJOnDependentFamilyAtDepth_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) (p q : Vec d) : + cutoffWeightedChildResponseJOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j φ p q = + descendantsAverage Q j + (fun R => cutoffChildWeight φ R * Ch04.restrictionResponseJObservableCubeSet R p q a) := by + unfold cutoffWeightedChildResponseJOnFamilyAtDepth + refine descendantsAverage_congr_of_eq_on_descendants Q j ?_ + intro R _hR + rw [responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet a ha R p q] + +/-- Pointwise bridge from the deterministic raw split left side to the Ch4 +centered-minus-child expression used before taking expectations. -/ +theorem centeredResponseJOnDependentFamily_sub_cutoffWeightedChildResponseJ_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : + centeredResponseJOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j φ p q = + Ch04.restrictionCenteredResponseJObservableCubeSet Q p q p0 q0 a - + descendantsAverage Q j + (fun R => cutoffChildWeight φ R * Ch04.restrictionResponseJObservableCubeSet R p q a) := by + rw [centeredResponseJOnDependentFamily_eq_restrictionCenteredResponseJObservableCubeSet a ha Q p q p0 q0, + cutoffWeightedChildResponseJOnDependentFamilyAtDepth_eq_ch04 a ha Q j φ p q] + +/-- Origin-scale version of the raw/Ch4 left-side bridge, matching the private +stochastic expression used above. -/ +theorem centeredJMinusCutoffWeightedChildAtScale_eq_dependentFamily_left + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m k : ℤ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : + centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a = + centeredResponseJOnCube (originCube d m) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d m)) + p q p0 q0 - + cutoffWeightedChildResponseJOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (originCube d m) (Int.toNat (m - k)) φ p q := by + rw [centeredResponseJOnDependentFamily_sub_cutoffWeightedChildResponseJ_eq_ch04 + a ha (originCube d m) (Int.toNat (m - k)) φ p q p0 q0] + rfl + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/LinearTerms.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/LinearTerms.lean new file mode 100644 index 0000000000..d5882c1e5e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/LinearTerms.lean @@ -0,0 +1,420 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CutoffOscillation + +/-! # Linear Terms -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# LinearTerms + +Linear gradient and flux term bounds. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- A constant-vector dot product against a cube average is bounded +componentwise. -/ +theorem abs_vecDot_const_cubeAverageVec_le_sum_abs_mul_norm_cubeAverage + {d : ℕ} (Q : TriadicCube d) (c : Vec d) (field : Vec d → Vec d) : + |vecDot c (cubeAverageVec Q field)| ≤ + ∑ i : Fin d, |c i| * ‖cubeAverage Q (fun x => field x i)‖ := by + calc + |vecDot c (cubeAverageVec Q field)| + = |∑ i : Fin d, c i * cubeAverage Q (fun x => field x i)| := by + simp [vecDot, cubeAverageVec] + _ ≤ ∑ i : Fin d, |c i * cubeAverage Q (fun x => field x i)| := by + exact Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun i : Fin d => c i * cubeAverage Q (fun x => field x i)) + _ = ∑ i : Fin d, |c i| * ‖cubeAverage Q (fun x => field x i)‖ := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [abs_mul, Real.norm_eq_abs] + +/-- A constant-vector dot product commutes with `cubeAverageVec`. -/ +theorem cubeAverage_vecDot_const_left_eq_vecDot_cubeAverageVec + {d : ℕ} (Q : TriadicCube d) (c : Vec d) (field : Vec d → Vec d) + (hField : + ∀ i : Fin d, + IntegrableOn (fun x => field x i) (cubeSet Q) volume) : + cubeAverage Q (fun x => vecDot c (field x)) = + vecDot c (cubeAverageVec Q field) := by + have hterm : + ∀ i ∈ (Finset.univ : Finset (Fin d)), + Integrable (fun x => c i * field x i) + (volume.restrict (cubeSet Q)) := by + intro i _hi + simpa [IntegrableOn] using + (hField i).integrable.const_mul (c i) + unfold cubeAverage vecDot cubeAverageVec + rw [integral_finsetSum Finset.univ hterm] + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [integral_const_mul] + unfold cubeAverage + ring_nf + +/-- Single half-linear term from per-component average estimates. -/ +theorem abs_half_vecDot_const_cubeAverageVec_le_const_mul_size_weak_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (c : Vec d) (field : Vec d → Vec d) + (componentBound : Fin d → ℝ) {C cSize fieldWeak : ℝ} + (hhalfC : (1 / 2 : ℝ) ≤ C) + (hcSize_nonneg : 0 ≤ cSize) (hfieldWeak_nonneg : 0 ≤ fieldWeak) + (hComponentBound : + ∀ i : Fin d, ‖cubeAverage Q (fun x => field x i)‖ ≤ componentBound i) + (hComponentSum : + (∑ i : Fin d, |c i| * componentBound i) ≤ cSize * fieldWeak) : + |(1 / 2 : ℝ) * vecDot c (cubeAverageVec Q field)| ≤ + C * cSize * fieldWeak := by + have hComponent : + (∑ i : Fin d, |c i| * ‖cubeAverage Q (fun x => field x i)‖) ≤ + cSize * fieldWeak := by + refine (Finset.sum_le_sum ?_).trans hComponentSum + intro i _hi + exact mul_le_mul_of_nonneg_left (hComponentBound i) (abs_nonneg (c i)) + have hbase : + |vecDot c (cubeAverageVec Q field)| ≤ cSize * fieldWeak := + (abs_vecDot_const_cubeAverageVec_le_sum_abs_mul_norm_cubeAverage Q c field).trans + hComponent + have hhalf_nonneg : 0 ≤ (1 / 2 : ℝ) := by norm_num + have hprod_nonneg : 0 ≤ cSize * fieldWeak := + mul_nonneg hcSize_nonneg hfieldWeak_nonneg + calc + |(1 / 2 : ℝ) * vecDot c (cubeAverageVec Q field)| + = (1 / 2 : ℝ) * |vecDot c (cubeAverageVec Q field)| := by + rw [abs_mul, abs_of_nonneg hhalf_nonneg] + _ ≤ (1 / 2 : ℝ) * (cSize * fieldWeak) := by + exact mul_le_mul_of_nonneg_left hbase hhalf_nonneg + _ ≤ C * (cSize * fieldWeak) := by + exact mul_le_mul_of_nonneg_right hhalfC hprod_nonneg + _ = C * cSize * fieldWeak := by ring + +/-- The two manuscript linear terms after componentwise average/Besov bounds +have been supplied. -/ +theorem abs_half_linear_pair_cubeAverageVec_le_const_mul_sizes_weaks_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (q0 p0 : Vec d) + (gradField fluxField : Vec d → Vec d) + (gradComponentBound fluxComponentBound : Fin d → ℝ) + {C q0Size p0Size gradWeak fluxWeak : ℝ} + (hhalfC : (1 / 2 : ℝ) ≤ C) + (hq0Size_nonneg : 0 ≤ q0Size) (hp0Size_nonneg : 0 ≤ p0Size) + (hgradWeak_nonneg : 0 ≤ gradWeak) (hfluxWeak_nonneg : 0 ≤ fluxWeak) + (hGradComponentBound : + ∀ i : Fin d, ‖cubeAverage Q (fun x => gradField x i)‖ ≤ gradComponentBound i) + (hFluxComponentBound : + ∀ i : Fin d, ‖cubeAverage Q (fun x => fluxField x i)‖ ≤ fluxComponentBound i) + (hGradComponentSum : + (∑ i : Fin d, |q0 i| * gradComponentBound i) ≤ q0Size * gradWeak) + (hFluxComponentSum : + (∑ i : Fin d, |p0 i| * fluxComponentBound i) ≤ p0Size * fluxWeak) : + |(1 / 2 : ℝ) * vecDot q0 (cubeAverageVec Q gradField) + + (1 / 2 : ℝ) * vecDot p0 (cubeAverageVec Q fluxField)| ≤ + C * q0Size * gradWeak + C * p0Size * fluxWeak := by + have hGrad : + |(1 / 2 : ℝ) * vecDot q0 (cubeAverageVec Q gradField)| ≤ + C * q0Size * gradWeak := + abs_half_vecDot_const_cubeAverageVec_le_const_mul_size_weak_of_component_bounds + Q q0 gradField gradComponentBound hhalfC hq0Size_nonneg hgradWeak_nonneg + hGradComponentBound hGradComponentSum + have hFlux : + |(1 / 2 : ℝ) * vecDot p0 (cubeAverageVec Q fluxField)| ≤ + C * p0Size * fluxWeak := + abs_half_vecDot_const_cubeAverageVec_le_const_mul_size_weak_of_component_bounds + Q p0 fluxField fluxComponentBound hhalfC hp0Size_nonneg hfluxWeak_nonneg + hFluxComponentBound hFluxComponentSum + exact (abs_add_le _ _).trans (add_le_add hGrad hFlux) + +/-- The cutoff `q0` linear term as a half dot-product of a vector cube +average. -/ +theorem cutoffGradientLinearTermOnCube_eq_half_vecDot_cubeAverageVec + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hField : + ∀ i : Fin d, + IntegrableOn + (fun x => (φ x • canonicalMaximizerGradientDefectOnCube Q a p q p0 x) i) + (cubeSet Q) volume) : + cutoffGradientLinearTermOnCube Q a φ p q p0 q0 = + (1 / 2 : ℝ) * vecDot q0 + (cubeAverageVec Q + (fun x => φ x • canonicalMaximizerGradientDefectOnCube Q a p q p0 x)) := by + let field : Vec d → Vec d := + fun x => φ x • canonicalMaximizerGradientDefectOnCube Q a p q p0 x + have hAvg : + cubeAverage Q (fun x => vecDot q0 (field x)) = + vecDot q0 (cubeAverageVec Q field) := + cubeAverage_vecDot_const_left_eq_vecDot_cubeAverageVec Q q0 field + (by simpa [field] using hField) + have hpoint : + (fun x => φ x * centeredGradientLinearDensityOnCube Q a p q p0 q0 x) = + fun x => (1 / 2 : ℝ) * vecDot q0 (field x) := by + funext x + change + φ x * ((1 / 2 : ℝ) * + vecDot q0 (canonicalMaximizerGradientOnCube Q a p q x - p0)) = + (1 / 2 : ℝ) * + vecDot q0 (φ x • canonicalMaximizerGradientDefectOnCube Q a p q p0 x) + rw [vecDot_smul_right] + simp [canonicalMaximizerGradientDefectOnCube] + ring + calc + cutoffGradientLinearTermOnCube Q a φ p q p0 q0 = + cubeAverage Q (fun x => φ x * + centeredGradientLinearDensityOnCube Q a p q p0 q0 x) := by + simp [cutoffGradientLinearTermOnCube] + _ = cubeAverage Q (fun x => (1 / 2 : ℝ) * vecDot q0 (field x)) := by + rw [hpoint] + _ = (1 / 2 : ℝ) * vecDot q0 (cubeAverageVec Q field) := by + rw [cubeAverage_const_mul, hAvg] + +/-- The cutoff `p0` linear term as a half dot-product of a vector cube +average. -/ +theorem cutoffFluxLinearTermOnCube_eq_half_vecDot_cubeAverageVec + {d : ℕ} (Q : TriadicCube d) (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hField : + ∀ i : Fin d, + IntegrableOn + (fun x => (φ x • canonicalMaximizerFluxDefectOnCube Q a p q q0 x) i) + (cubeSet Q) volume) : + cutoffFluxLinearTermOnCube Q a φ p q p0 q0 = + (1 / 2 : ℝ) * vecDot p0 + (cubeAverageVec Q + (fun x => φ x • canonicalMaximizerFluxDefectOnCube Q a p q q0 x)) := by + let field : Vec d → Vec d := + fun x => φ x • canonicalMaximizerFluxDefectOnCube Q a p q q0 x + have hAvg : + cubeAverage Q (fun x => vecDot p0 (field x)) = + vecDot p0 (cubeAverageVec Q field) := + cubeAverage_vecDot_const_left_eq_vecDot_cubeAverageVec Q p0 field + (by simpa [field] using hField) + have hpoint : + (fun x => φ x * centeredFluxLinearDensityOnCube Q a p q p0 q0 x) = + fun x => (1 / 2 : ℝ) * vecDot p0 (field x) := by + funext x + change + φ x * ((1 / 2 : ℝ) * + vecDot p0 (canonicalMaximizerFluxOnCube Q a p q x - q0)) = + (1 / 2 : ℝ) * + vecDot p0 (φ x • canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + rw [vecDot_smul_right] + simp [canonicalMaximizerFluxDefectOnCube] + ring + calc + cutoffFluxLinearTermOnCube Q a φ p q p0 q0 = + cubeAverage Q (fun x => φ x * + centeredFluxLinearDensityOnCube Q a p q p0 q0 x) := by + simp [cutoffFluxLinearTermOnCube] + _ = cubeAverage Q (fun x => (1 / 2 : ℝ) * vecDot p0 (field x)) := by + rw [hpoint] + _ = (1 / 2 : ℝ) * vecDot p0 (cubeAverageVec Q field) := by + rw [cubeAverage_const_mul, hAvg] + +/-- The deterministic linear-pair term is controlled by the current Ch4 +scalar-response gradient and flux weak norms. The only cutoff inputs are the +ordinary Besov dual-test bounds for the scalar cutoff `φ`. -/ +theorem abs_cutoffLinearPairTermOnDependentFamily_le_ch04WeakNorms_of_cutoffDualBounds + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s t : ℝ) (φ : Vec d → ℝ) + (p q p0 q0 : Vec d) {BφS BφT : ℝ} + (hGradField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 x) i) + (cubeSet Q) volume) + (hFluxField : + ∀ i : Fin d, + IntegrableOn + (fun x => + (φ x • canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0 x) i) + (cubeSet Q) volume) + (hs : 0 < s) (ht : 0 < t) + (hBφS : 0 ≤ BφS) (hBφT : 0 ≤ BφT) + (hφDualS : + ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφS) + (hφDualT : + ∀ N : ℕ, cubeBesovDualTestNorm Q t (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ BφT) + (hφMem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let gradCoeff := + (3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * BφS + let fluxCoeff := + (3 : ℝ) ^ ((d : ℝ) + t) * cubeBesovScaleWeight (-t) Q * BφT + |cutoffLinearPairTermOnCube Q (F.coeffOn Q) φ p q p0 q0| ≤ + (1 / 2 : ℝ) * ‖q0‖ * + (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + + (1 / 2 : ℝ) * ‖p0‖ * + (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) := by + intro F gradWeak fluxWeak gradCoeff fluxCoeff + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let gradField : Vec d → Vec d := + fun x => φ x • canonicalMaximizerGradientDefectOnCube Q aQ p q p0 x + let fluxField : Vec d → Vec d := + fun x => φ x • canonicalMaximizerFluxDefectOnCube Q aQ p q q0 x + have hgradWeak_nonneg : 0 ≤ gradWeak := by + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminorm Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) := + cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) + have hpartial_le : + cubeBesovNegativeVectorPartialSeminorm Q s 0 + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) ≤ gradWeak := by + simpa [F, aQ, gradWeak] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs 0 p q p0 + exact hpartial_nonneg.trans hpartial_le + have hfluxWeak_nonneg : 0 ≤ fluxWeak := by + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminorm Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) := + cubeBesovNegativeVectorPartialSeminorm_nonneg Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) + have hpartial_le : + cubeBesovNegativeVectorPartialSeminorm Q t 0 + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) ≤ fluxWeak := by + simpa [F, aQ, fluxWeak] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q ht 0 p q q0 + exact hpartial_nonneg.trans hpartial_le + have hgradCoeff_nonneg : 0 ≤ gradCoeff := by + dsimp [gradCoeff] + exact mul_nonneg + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovScaleWeight_nonneg (-s) Q)) + hBφS + have hfluxCoeff_nonneg : 0 ≤ fluxCoeff := by + dsimp [fluxCoeff] + exact mul_nonneg + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovScaleWeight_nonneg (-t) Q)) + hBφT + have hGradComponentBound : + ∀ i : Fin d, + ‖cubeAverage Q (fun x => gradField x i)‖ ≤ gradCoeff * gradWeak := by + intro i + have hcomp : + MemLp (fun x => canonicalMaximizerGradientDefectOnCube Q aQ p q p0 x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_component_of_memLp + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) i + (canonicalMaximizerGradientDefectOnCube_memLp Q aQ p q p0) + have hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) ≤ gradWeak := by + intro N + simpa [F, aQ, gradWeak] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs N p q p0 + simpa [F, aQ, gradField, gradCoeff] using + norm_cubeAverage_smul_component_le_cutoffDualCoeff_mul_negativeVectorPartialBound + Q s (canonicalMaximizerGradientDefectOnCube Q aQ p q p0) φ i + hs hcomp hBφS hφDualS hφMem hpartial + have hFluxComponentBound : + ∀ i : Fin d, + ‖cubeAverage Q (fun x => fluxField x i)‖ ≤ fluxCoeff * fluxWeak := by + intro i + have hcomp : + MemLp (fun x => canonicalMaximizerFluxDefectOnCube Q aQ p q q0 x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_component_of_memLp + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) i + (canonicalMaximizerFluxDefectOnCube_memLp Q aQ p q q0) + have hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q t N + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) ≤ fluxWeak := by + intro N + simpa [F, aQ, fluxWeak] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q ht N p q q0 + simpa [F, aQ, fluxField, fluxCoeff] using + norm_cubeAverage_smul_component_le_cutoffDualCoeff_mul_negativeVectorPartialBound + Q t (canonicalMaximizerFluxDefectOnCube Q aQ p q q0) φ i + ht hcomp hBφT hφDualT hφMem hpartial + have hGradComponentSum : + (∑ i : Fin d, |q0 i| * (gradCoeff * gradWeak)) ≤ + ‖q0‖ * (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) := by + have hsum := + sum_abs_mul_const_mul_le_card_mul_norm_mul_const_mul_of_nonneg + q0 hgradCoeff_nonneg hgradWeak_nonneg + calc + (∑ i : Fin d, |q0 i| * (gradCoeff * gradWeak)) + ≤ ((Fintype.card (Fin d) : ℝ) * gradCoeff) * ‖q0‖ * gradWeak := hsum + _ = ‖q0‖ * (((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) := by + ring + have hFluxComponentSum : + (∑ i : Fin d, |p0 i| * (fluxCoeff * fluxWeak)) ≤ + ‖p0‖ * (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) := by + have hsum := + sum_abs_mul_const_mul_le_card_mul_norm_mul_const_mul_of_nonneg + p0 hfluxCoeff_nonneg hfluxWeak_nonneg + calc + (∑ i : Fin d, |p0 i| * (fluxCoeff * fluxWeak)) + ≤ ((Fintype.card (Fin d) : ℝ) * fluxCoeff) * ‖p0‖ * fluxWeak := hsum + _ = ‖p0‖ * (((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) := by + ring + have hGradEq := + cutoffGradientLinearTermOnCube_eq_half_vecDot_cubeAverageVec + Q aQ φ p q p0 q0 (by simpa [F, aQ, gradField] using hGradField) + have hFluxEq := + cutoffFluxLinearTermOnCube_eq_half_vecDot_cubeAverageVec + Q aQ φ p q p0 q0 (by simpa [F, aQ, fluxField] using hFluxField) + have hPair : + cutoffLinearPairTermOnCube Q aQ φ p q p0 q0 = + (1 / 2 : ℝ) * vecDot q0 (cubeAverageVec Q gradField) + + (1 / 2 : ℝ) * vecDot p0 (cubeAverageVec Q fluxField) := by + simp [cutoffLinearPairTermOnCube, gradField, fluxField, hGradEq, hFluxEq] + rw [show (F.coeffOn Q) = aQ by rfl, hPair] + simpa using + abs_half_linear_pair_cubeAverageVec_le_const_mul_sizes_weaks_of_component_bounds + Q q0 p0 gradField fluxField (fun _ => gradCoeff * gradWeak) + (fun _ => fluxCoeff * fluxWeak) + (C := (1 / 2 : ℝ)) (q0Size := ‖q0‖) (p0Size := ‖p0‖) + (gradWeak := ((Fintype.card (Fin d) : ℝ) * gradCoeff) * gradWeak) + (fluxWeak := ((Fintype.card (Fin d) : ℝ) * fluxCoeff) * fluxWeak) + le_rfl (norm_nonneg q0) (norm_nonneg p0) + (mul_nonneg + (mul_nonneg (Nat.cast_nonneg _) hgradCoeff_nonneg) + hgradWeak_nonneg) + (mul_nonneg + (mul_nonneg (Nat.cast_nonneg _) hfluxCoeff_nonneg) + hfluxWeak_nonneg) + hGradComponentBound hFluxComponentBound hGradComponentSum hFluxComponentSum + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product.lean new file mode 100644 index 0000000000..c72b70fbd6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Identity + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bound.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bound.lean new file mode 100644 index 0000000000..1178139eb2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bound.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Identity + +/-! # Bound -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ProductBound + +Cutoff-product bound by Ch4 scalar-response weak norms. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +theorem abs_cutoffProductTermOnDependentFamily_le_scaledWeakNormProduct + {d : ℕ} [NeZero d] (Q : TriadicCube d) {s t : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) (ht_pos : 0 < t) + (hst : s + t ≤ 1) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + {φ : Vec d → ℝ} (p q p0 q0 : Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure Q)) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) + (fun x => scalarCutoffGradientField φ x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ B) : + let gradWeak := Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun + let fluxWeak := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun + let scaledGrad := cubeBesovScaleWeight (-s) Q * gradWeak + let scaledFlux := cubeBesovScaleWeight (-t) Q * fluxWeak + let gradCoeff := + (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ (scalarCutoffGradientField φ)) * + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Fintype.card (Fin d) : ℝ)) + let fluxCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + (1 - s)) * + cubeBesovScaleWeight (-(1 - s - t)) Q) + |cutoffProductTermOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + φ p q p0 q0| ≤ + (gradCoeff * fluxCoeff) * (scaledGrad * scaledFlux) := by + intro gradWeak fluxWeak scaledGrad scaledFlux gradCoeff fluxCoeff + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let u : H1Function (openCubeSet Q) := + canonicalMaximizerPotentialDefectH1OnCube Q aQ p q p0 + let flux : Vec d → Vec d := canonicalMaximizerFluxDefectOnCube Q aQ p q q0 + let ξ : Vec d → Vec d := scalarCutoffGradientField φ + let A : ℝ := + cubeAverage Q + (fun x => vecDot (flux x) + (((u x - cubeAverage Q (fun y => u y)) • ξ x : Vec d))) + have hid : + cutoffProductTermOnCube Q aQ φ p q p0 q0 = -(1 / 2 : ℝ) * A := by + have hraw := + cutoffProductTermOnCube_eq_neg_half_cubeAverage_fluxDefect_centeredPotentialDefect_smul_scalarCutoffGradientField + (Q := Q) (a := aQ) (φ := φ) p q p0 q0 + hφ hφ_compact hφ_sub hcutoffGradient + simpa [A, u, flux, ξ, F, aQ] using hraw + have hhalf : + |cutoffProductTermOnCube Q aQ φ p q p0 q0| ≤ |A| := by + rw [hid] + have h_abs : |-(1 / 2 : ℝ) * A| = (1 / 2 : ℝ) * |A| := by + rw [abs_mul] + norm_num + rw [h_abs] + nlinarith [abs_nonneg A] + have hmain : + |A| ≤ (gradCoeff * fluxCoeff) * (scaledGrad * scaledFlux) := by + simpa [A, u, flux, ξ, gradWeak, fluxWeak, scaledGrad, scaledFlux, + gradCoeff, fluxCoeff, F, aQ, canonicalMaximizerPotentialDefectH1OnCube_grad] using + abs_cubeAverage_vecDot_centered_scalar_cutoff_le_scaledWeakNormProduct + (Q := Q) (s := s) (t := t) hs_pos hs_lt_one hst + (flux := flux) (u := u) (ξ := ξ) (B := B) + (gradWeak := gradWeak) (fluxWeak := fluxWeak) + hB hcutoffGradient hcutoffSmooth hcutoffDeriv + (by simpa [flux] using canonicalMaximizerFluxDefectOnCube_memLp Q aQ p q q0) + (by + intro N + have hraw := + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs_pos N p q p0 + unfold canonicalMaximizerGradientDefectOnCube at hraw + simpa [u, F, aQ, gradWeak, canonicalMaximizerPotentialDefectH1OnCube_grad] using hraw) + (by + intro N + simpa [flux, F, aQ, fluxWeak] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q ht_pos N p q q0) + simpa [F, aQ] using hhalf.trans hmain + +/-- The actual manuscript cutoff product term is controlled by the Ch4 +scalar-response flux weak norms, once `cutoffGradient` is identified as the +gradient field of the scalar cutoff. -/ +theorem abs_cutoffProductTermOnDependentFamily_le_cutoffProductBridgeRHS + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : ℝ) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + {φ : Vec d → ℝ} (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {cutoffCircOne cutoffCircS cutoffDerivative poincareConst cutoffConstant + centeredCutoffConstant : ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient_eq : cutoffGradient = scalarCutoffGradientField φ) + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + |cutoffProductTermOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + φ p q p0 q0| ≤ + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let T : ℝ := + cubeAverage Q + (fun x => + vecDot + (canonicalMaximizerFluxDefectOnCube Q aQ p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q aQ p q p0 x • + cutoffGradient x)) + have hid : + cutoffProductTermOnCube Q aQ φ p q p0 q0 = + -(1 / 2 : ℝ) * T := by + have hraw := + cutoffProductTermOnCube_eq_neg_half_cubeAverage_fluxDefect_potentialDefect_smul_scalarCutoffGradientField + (Q := Q) (a := aQ) (φ := φ) p q p0 q0 hφ hφ_compact hφ_sub + simpa [T, hcutoffGradient_eq] using hraw + have hprod_abs : |cutoffProductTermOnCube Q aQ φ p q p0 q0| ≤ |T| := by + rw [hid] + have habs : |-(1 / 2 : ℝ) * T| = (1 / 2 : ℝ) * |T| := by + rw [abs_mul] + norm_num + rw [habs] + nlinarith [abs_nonneg T] + have hbridge : + |T| ≤ + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + simpa [T, F, aQ] using + productTerm_le_cutoffProductBridge_of_dependentCanonicalMaximizer + (Q := Q) (s := s) (a := a) (ha := ha) + (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hcutoffDerivative hs_pos hs_lt_one hdualField hcutoffGradient + hcutoffConstant hcenteredCutoffConstant hpoincareConst + hcutoffCircOne hcutoffCircS hfull hcutoffSmooth hcutoffDeriv + hdualCircOne hdualCircS hcutoffConstant_bound + hcenteredCutoffConstant_bound + exact hprod_abs.trans hbridge + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bridge.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bridge.lean new file mode 100644 index 0000000000..1e6c549ebc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Bridge.lean @@ -0,0 +1,543 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.LinearTerms + +/-! # Bridge -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ProductBridge + +Generic cutoff-product bridge bounds. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Direct cutoff-product duality bound in the manuscript `s,t` form, through +Ch01's legacy disjoint-Besov compatibility lane. + +This is the deterministic source for the final Cauchy product: the positive +side is Ch01's cutoff-product theorem for +`(u - (u)_Q) ∇φ`, and the negative side is the scaled `t`-weak norm of the +flux with the exponent comparison `t ≤ 1 - s`. -/ +theorem abs_cubeAverage_vecDot_centered_scalar_cutoff_le_scaledWeakNormProduct + {d : ℕ} [NeZero d] (Q : TriadicCube d) {s t : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) (hst : s + t ≤ 1) + (flux : Vec d → Vec d) (u : H1Function (openCubeSet Q)) + (ξ : Vec d → Vec d) {B gradWeak fluxWeak : ℝ} + (hB : 0 ≤ B) + (hξLp : MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hflux : MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgradWeak : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u.grad ≤ gradWeak) + (hfluxWeak : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q t N flux ≤ fluxWeak) : + let scaledGrad := cubeBesovScaleWeight (-s) Q * gradWeak + let scaledFlux := cubeBesovScaleWeight (-t) Q * fluxWeak + let gradCoeff := + (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ ξ) * + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Fintype.card (Fin d) : ℝ)) + let fluxCoeff := + (Fintype.card (Fin d) : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + (1 - s)) * + cubeBesovScaleWeight (-(1 - s - t)) Q) + |cubeAverage Q + (fun x => vecDot (flux x) + (((u x - cubeAverage Q (fun y => u y)) • ξ x : Vec d)))| ≤ + (gradCoeff * fluxCoeff) * (scaledGrad * scaledFlux) := by + intro scaledGrad scaledFlux gradCoeff fluxCoeff + let r : ℝ := 1 - s + let productField : Vec d → Vec d := + fun x => ((u x - cubeAverage Q (fun y => u y)) • ξ x : Vec d) + let productBound : ℝ := gradCoeff * scaledGrad + have hr_pos : 0 < r := by dsimp [r]; linarith + have hr_lt_one : r < 1 := by dsimp [r]; linarith + have ht_le_r : t ≤ r := by dsimp [r]; linarith + have hgradWeak_nonneg : 0 ≤ gradWeak := + (cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 u.grad).trans (hgradWeak 0) + have hfluxWeak_nonneg : 0 ≤ fluxWeak := + (cubeBesovNegativeVectorPartialSeminorm_nonneg Q t 0 flux).trans (hfluxWeak 0) + have hscaledGrad_nonneg : 0 ≤ scaledGrad := by + dsimp [scaledGrad] + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) hgradWeak_nonneg + have hscaledFlux_nonneg : 0 ≤ scaledFlux := by + dsimp [scaledFlux] + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-t) Q) hfluxWeak_nonneg + have hfront_nonneg : 0 ≤ 2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ ξ := by + exact add_nonneg + (mul_nonneg (mul_nonneg (by norm_num) (cubeScaleFactor_nonneg Q)) hB) + (mul_nonneg (by norm_num) (cubeLpNorm_nonneg Q ∞ ξ)) + have hpoincare_nonneg : + 0 ≤ Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1) := by + exact mul_nonneg (Ch01.Legacy.fullVectorPoincareConstant_nonneg Q) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hgradCoeff_nonneg : 0 ≤ gradCoeff := by + dsimp [gradCoeff] + exact mul_nonneg hfront_nonneg + (mul_nonneg hpoincare_nonneg (Nat.cast_nonneg _)) + have hproductBound_nonneg : 0 ≤ productBound := by + dsimp [productBound] + exact mul_nonneg hgradCoeff_nonneg hscaledGrad_nonneg + have hgradComp : + ∀ i : Fin d, + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u.grad x i) ≤ + scaledGrad := by + intro i + simpa [scaledGrad] using + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q s u.grad i hgradWeak + have hgradCircSum : + (∑ i : Fin d, + Ch01.Legacy.circNegativeBesovNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) ≤ + (Fintype.card (Fin d) : ℝ) * scaledGrad := by + calc + _ ≤ ∑ _i : Fin d, scaledGrad := + Finset.sum_le_sum fun i _ => by + simpa only [Ch01.Legacy.circNegativeBesovNorm] using hgradComp i + _ = (Fintype.card (Fin d) : ℝ) * scaledGrad := by + simp [Finset.sum_const, nsmul_eq_mul] + have hproductDual : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => productField x i) ≤ + productBound := by + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hqConj : + cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + intro i N + have hch01 : + cubeBesovPartialNormTop Q r (2 : ℝ≥0∞) N (fun x => productField x i) ≤ + (2 * cubeScaleFactor Q * B + 3 * cubeLpNorm Q ∞ ξ) * + ((Ch01.Legacy.fullVectorPoincareConstant Q * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + Ch01.Legacy.circNegativeBesovNorm Q (1 - r) (2 : ℝ≥0∞) + (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + simpa [productField, r, sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + Ch01.Legacy.cutoffProduct_component_partialNormTop_le_gradient_rhs + Q r N u ξ hB hξLp hξ hderiv hr_pos hr_lt_one i + have hsum : + (∑ i : Fin d, + Ch01.Legacy.circNegativeBesovNorm Q (1 - r) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) ≤ + (Fintype.card (Fin d) : ℝ) * scaledGrad := by + simpa [r] using hgradCircSum + have hmain := mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hsum hpoincare_nonneg) hfront_nonneg + have hdual : + cubeBesovDualTestNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => productField x i) = + cubeBesovPartialNormTop Q r (2 : ℝ≥0∞) N (fun x => productField x i) := by + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top + Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => productField x i) hqConj] + rw [hpConj] + rw [hdual] + refine hch01.trans (hmain.trans ?_) + apply le_of_eq + dsimp [productBound, gradCoeff] + ring + have hu : MemLp (fun x => u x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + u.memL2_normalizedCubeMeasure + have hfluct : + MemLp (fun x => u x - cubeAverage Q (fun y => u y)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (cubeAverage Q (fun y => u y))) + have hproductField : + MemLp productField (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + simpa [productField] using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hfluct + have hproductMem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => productField x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q productField i hproductField + have hfluxComp : + ∀ i : Fin d, + MemLp (fun x => flux x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hpair : + |cubeAverage Q (fun x => vecDot (flux x) (productField x))| ≤ + ∑ i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => flux x i)) * + productBound) := by + simpa [productField] using + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_one_of_nonneg + Q r flux productField (fun _ : Fin d => productBound) hr_pos hfluxComp + (fun _ => hproductBound_nonneg) hproductDual hproductMem + have hfluxScaledPartial : + ∀ N : ℕ, + cubeBesovScaleWeight (-t) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N flux ≤ + scaledFlux := by + intro N + dsimp [scaledFlux] + exact mul_le_mul_of_nonneg_left (hfluxWeak N) (cubeBesovScaleWeight_nonneg (-t) Q) + have hfluxCompCirc : + ∀ i : Fin d, + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) ≤ + cubeBesovScaleWeight (-(r - t)) Q * scaledFlux := by + intro i + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_gap_mul_of_scaled_negativeVectorPartialBound + Q ht_le_r flux i hfluxScaledPartial + have hsum : + (∑ i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => flux x i)) * + productBound)) ≤ + (gradCoeff * fluxCoeff) * (scaledGrad * scaledFlux) := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + r) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hcomponent : + ∀ i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => flux x i)) * + productBound) ≤ + (((3 : ℝ) ^ ((d : ℝ) + r) * + (cubeBesovScaleWeight (-(r - t)) Q * scaledFlux)) * + productBound) := by + intro i + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left (hfluxCompCirc i) hpow_nonneg) + hproductBound_nonneg + calc + (∑ i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + r) * + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => flux x i)) * + productBound)) + ≤ + ∑ _i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + r) * + (cubeBesovScaleWeight (-(r - t)) Q * scaledFlux)) * + productBound) := by + exact Finset.sum_le_sum fun i _hi => hcomponent i + _ = + (gradCoeff * fluxCoeff) * (scaledGrad * scaledFlux) := by + simp [fluxCoeff, productBound, r] + ring + exact hpair.trans hsum + +/-- Private Section 5.3 product-term bridge. + +This is the manuscript integration-by-parts product estimate in the form needed +before inserting the canonical maximizer fields: `potential` is +`v_m - ell_{p0}`, `cutoffGradient` is `grad phi`, and `flux` is +`a grad v_m - q0`. The proof deliberately consumes the active deterministic +cutoff-product theorem directly, without recreating the archived +`HasCutoffProduct...` socket layer. -/ +theorem productTerm_le_cutoffProductBridge + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (potential : Vec d → ℝ) (dualField cutoffGradient : Vec d → Vec d) + {fluxWeakOne fluxWeakS fluxAverage cutoffCircOne cutoffCircS + cutoffDerivative poincareConst cutoffConstant centeredCutoffConstant : ℝ} + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hflux : MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hpotential : MemLp potential (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hfluxAverage : 0 ≤ fluxAverage) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ fluxAverage) + (hfluxWeakOne : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ fluxWeakOne) + (hfluxWeakS : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ fluxWeakS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q potential) dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) potential * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + |cubeAverage Q + (fun x => vecDot (flux x) (potential x • cutoffGradient x))| ≤ + cutoffProductBridgeRHS Q s cutoffGradient fluxWeakOne fluxWeakS fluxAverage + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + simpa [cutoffProductBridgeRHS] using + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_fullCirc_effective_constant + (Q := Q) (s := s) (flux := flux) (u := potential) + (G := dualField) (ξ := cutoffGradient) + (Bu1 := fluxWeakOne) (BuS := fluxWeakS) (Bavg := fluxAverage) + (Bcirc1 := cutoffCircOne) (BcircS := cutoffCircS) + (B := cutoffDerivative) (C := poincareConst) + (BgConst := cutoffConstant) (BgCent := centeredCutoffConstant) + hcutoffDerivative hs_pos hs_lt_one hflux hpotential hdualField + hcutoffGradient hcutoffConstant hcenteredCutoffConstant hfluxAverage + hpoincareConst hcutoffCircOne hcutoffCircS havg hfluxWeakOne hfluxWeakS + hfull hcutoffSmooth hcutoffDeriv hdualCircOne hdualCircS + hcutoffConstant_bound hcenteredCutoffConstant_bound + +/-- Private product-term bridge after inserting the raw Chapter 2 canonical +maximizer. The remaining hypotheses are the analytic inputs for the cutoff +and duality estimates; this theorem does not create a public proof package. -/ +theorem productTerm_le_cutoffProductBridge_of_canonicalMaximizer + {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {fluxWeakOne fluxWeakS fluxAverage cutoffCircOne cutoffCircS + cutoffDerivative poincareConst cutoffConstant centeredCutoffConstant : ℝ} + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hfluxAverage : 0 ≤ fluxAverage) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (havg : + ‖cubeAverageVec Q (canonicalMaximizerFluxDefectOnCube Q a p q q0)‖ ≤ + fluxAverage) + (hfluxWeakOne : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q 1 N + (canonicalMaximizerFluxDefectOnCube Q a p q q0) ≤ fluxWeakOne) + (hfluxWeakS : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N + (canonicalMaximizerFluxDefectOnCube Q a p q q0) ≤ fluxWeakS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q (canonicalMaximizerPotentialDefectOnCube Q a p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q a p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + |cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q a p q p0 x • + cutoffGradient x))| ≤ + cutoffProductBridgeRHS Q s cutoffGradient fluxWeakOne fluxWeakS fluxAverage + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + exact productTerm_le_cutoffProductBridge + (Q := Q) (s := s) + (flux := canonicalMaximizerFluxDefectOnCube Q a p q q0) + (potential := canonicalMaximizerPotentialDefectOnCube Q a p q p0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + hcutoffDerivative hs_pos hs_lt_one + (canonicalMaximizerFluxDefectOnCube_memLp Q a p q q0) + (canonicalMaximizerPotentialDefectOnCube_memLp Q a p q p0) hdualField + hcutoffGradient hcutoffConstant hcenteredCutoffConstant hfluxAverage + hpoincareConst hcutoffCircOne hcutoffCircS havg hfluxWeakOne hfluxWeakS + hfull hcutoffSmooth hcutoffDeriv hdualCircOne hdualCircS + hcutoffConstant_bound hcenteredCutoffConstant_bound + +/-- Private product-term bridge for the Ch4 dependent coefficient family. + +Compared with `productTerm_le_cutoffProductBridge_of_canonicalMaximizer`, the +raw flux-average and weak-norm hypotheses have been discharged through the Ch4 +scalar-response surface. The remaining hypotheses are the genuine analytic +cutoff/duality inputs for this deterministic product estimate. -/ +theorem productTerm_le_cutoffProductBridge_of_dependentCanonicalMaximizer + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : ℝ) + (a : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField a) + (p q p0 q0 : Vec d) + (dualField cutoffGradient : Vec d → Vec d) + {cutoffCircOne cutoffCircS cutoffDerivative poincareConst cutoffConstant + centeredCutoffConstant : ℝ} + (hcutoffDerivative : 0 ≤ cutoffDerivative) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hdualField : + ∀ i : Fin d, + MemLp (fun x => dualField x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hcutoffGradient : MemLp cutoffGradient ∞ (normalizedCubeMeasure Q)) + (hcutoffConstant : 0 ≤ cutoffConstant) + (hcenteredCutoffConstant : 0 ≤ centeredCutoffConstant) + (hpoincareConst : 0 ≤ poincareConst) + (hcutoffCircOne : 0 ≤ cutoffCircOne) + (hcutoffCircS : 0 ≤ cutoffCircS) + (hfull : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q poincareConst + (cubeFluctuation Q + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0)) + dualField N) + (hcutoffSmooth : + ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => cutoffGradient x i)) + (hcutoffDeriv : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => cutoffGradient x i) z‖ ≤ cutoffDerivative) + (hdualCircOne : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircOne) + (hdualCircS : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => dualField x i) ≤ cutoffCircS) + (hcutoffConstant_bound : + cubeLpNorm Q (2 : ℝ≥0∞) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) * + (cutoffDerivative + cubeBesovScaleWeight 1 Q * + cubeLpNorm Q ∞ cutoffGradient) ≤ + cutoffConstant) + (hcenteredCutoffConstant_bound : + 2 * (cubeScaleFactor Q * cutoffDerivative * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * cutoffCircOne)) + + cubeLpNorm Q ∞ cutoffGradient * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * poincareConst) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * cutoffCircS))) ≤ + centeredCutoffConstant) : + |cubeAverage Q + (fun x => + vecDot + (canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0 x • cutoffGradient x))| ≤ + cutoffProductBridgeRHS Q s cutoffGradient + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖ + cutoffCircOne poincareConst cutoffConstant centeredCutoffConstant := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + exact productTerm_le_cutoffProductBridge_of_canonicalMaximizer + (Q := Q) (s := s) (a := aQ) (p := p) (q := q) (p0 := p0) (q0 := q0) + (dualField := dualField) (cutoffGradient := cutoffGradient) + (fluxWeakOne := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q 1 p q q0 a.toFun) + (fluxWeakS := Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun) + (fluxAverage := ‖Ch04.canonicalScalarResponseFluxAverageCubeSet Q Q p q a.toFun - q0‖) + (cutoffCircOne := cutoffCircOne) (cutoffCircS := cutoffCircS) + (cutoffDerivative := cutoffDerivative) (poincareConst := poincareConst) + (cutoffConstant := cutoffConstant) + (centeredCutoffConstant := centeredCutoffConstant) + hcutoffDerivative hs_pos hs_lt_one hdualField hcutoffGradient + hcutoffConstant hcenteredCutoffConstant (norm_nonneg _) + hpoincareConst hcutoffCircOne hcutoffCircS + (by + simpa [F, aQ] using + norm_cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04 + a ha Q p q q0) + (by + intro N + simpa [F, aQ] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q (by norm_num : (0 : ℝ) < 1) N p q q0) + (by + intro N + simpa [F, aQ] using + cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_le_ch04WeakNorm + a ha Q hs_pos N p q q0) + (by simpa [F, aQ] using hfull) + hcutoffSmooth hcutoffDeriv hdualCircOne hdualCircS + (by simpa [F, aQ] using hcutoffConstant_bound) + hcenteredCutoffConstant_bound + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Identity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Identity.lean new file mode 100644 index 0000000000..178112a3f2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/Product/Identity.lean @@ -0,0 +1,460 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Product.Bridge + +/-! # Identity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# ProductIdentity + +Cutoff-product identities from first variation. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- First-variation identity converting the actual cutoff product term into +the flux-defect/product-gradient pairing consumed by the deterministic +cutoff-product bridge. -/ +theorem cutoffProductTermOnCube_eq_neg_half_cubeAverage_fluxDefect_potentialDefect_smul_scalarCutoffGradientField + {d : ℕ} (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) {φ : Vec d → ℝ} + (p q p0 q0 : Vec d) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) : + cutoffProductTermOnCube Q a φ p q p0 q0 = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q a p q p0 x • + scalarCutoffGradientField φ x)) := by + classical + let U : Set (Vec d) := ((Ch02.cubeDomain Q : Ch02.Domain d) : Set (Vec d)) + let v : Ch02.Solution (Ch02.cubeDomain Q) a := + canonicalMaximizerSolutionOnCube Q a p q + let flux : Vec d → Vec d := + fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x) + let fluxDef : Vec d → Vec d := fun x => flux x - q0 + let u : H1Function U := + canonicalMaximizerPotentialDefectH1OnCube Q a p q p0 + let uφ : H1Function U := u.mulContDiffHasCompactSupport hφ hφ_compact + have hφ_sub_U : tsupport φ ⊆ U := by + simpa [U, Ch02.cubeDomain_coe] using hφ_sub + let ψ : H10Function U := + u.mulContDiffHasCompactSupportToH10 + (Ch02.cubeDomain Q).isDomain hφ hφ_compact hφ_sub_U + have hflux_mem : MemVectorL2 U flux := by + simpa [U, flux, v, canonicalMaximizerSolutionOnCube] using + Ch02.Solution.flux_memVectorL2 (canonicalMaximizerSolutionOnCube Q a p q) + have hconst_mem : MemVectorL2 U (fun _ : Vec d => q0) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) q0 + have hfluxDef_mem : MemVectorL2 U fluxDef := by + simpa [fluxDef] using! hflux_mem.sub hconst_mem + have hpair_vec_mem : + MemVectorL2 U (fun x => u x • scalarCutoffGradientField φ x) := by + simpa [MemVectorL2, volumeMeasureOn, Pi.smul_apply, smul_eq_mul, mul_comm] using + (MeasureTheory.MemLp.of_eval fun i : Fin d => by + have hgradφ_compact : + HasCompactSupport (fun x => scalarCutoffGradientField φ x i) := by + simpa [scalarCutoffGradientField] using + hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + rcases + memH1_mul_of_contDiff_hasCompactSupport + (contDiff_scalarCutoffGradientField_component hφ i) hgradφ_compact + u.memH1 with + ⟨w, hw_toFun⟩ + simpa [hw_toFun, mul_comm] using w.memL2) + have hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (fluxDef x) (u x • scalarCutoffGradientField φ x)) U := + integrableOn_vecDot_of_memVectorL2 hfluxDef_mem hpair_vec_mem + have hprod_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (fluxDef x) (uφ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hfluxDef_mem uφ.grad_memVectorL2 + have hgrad_ae : + (fun x => ψ.toH1Function.grad x) =ᵐ[MeasureTheory.volume.restrict U] + (fun x => uφ.grad x) := by + simpa only [ψ, uφ, H1Function.mulContDiffHasCompactSupport_grad] using + WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + u (Ch02.cubeDomain Q).isDomain hφ hφ_compact hφ_sub_U + have hsol_ψ : + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = 0 := by + have hdrop_const : + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (flux x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [fluxDef] using + integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hflux_mem ψ q0 + calc + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (flux x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := hdrop_const + _ = 0 := by + simpa [U, flux, v, canonicalMaximizerSolutionOnCube] using + (canonicalMaximizerSolutionOnCube Q a p q).isHarmonic.2 ψ + have hsol_uφ : + ∫ x in U, vecDot (fluxDef x) (uφ.grad x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, vecDot (fluxDef x) (uφ.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hgrad_ae] with x hx + rw [hx] + _ = 0 := hsol_ψ + let first : Vec d → ℝ := + fun x => φ x * vecDot (fluxDef x) (u.grad x) + let bridge : Vec d → ℝ := + fun x => vecDot (fluxDef x) (u x • scalarCutoffGradientField φ x) + have hprod_split : + (fun x => vecDot (fluxDef x) (uφ.grad x)) = + fun x => first x + bridge x := by + funext x + have huφ_grad : + uφ.grad x = φ x • u.grad x + u x • scalarCutoffGradientField φ x := by + ext i + simp [uφ, scalarCutoffGradientField, Pi.smul_apply, smul_eq_mul] + calc + vecDot (fluxDef x) (uφ.grad x) + = vecDot (fluxDef x) + (φ x • u.grad x + u x • scalarCutoffGradientField φ x) := by + rw [huφ_grad] + _ = vecDot (fluxDef x) (φ x • u.grad x) + + vecDot (fluxDef x) (u x • scalarCutoffGradientField φ x) := by + rw [vecDot_add_right] + _ = φ x * vecDot (fluxDef x) (u.grad x) + + vecDot (fluxDef x) (u x • scalarCutoffGradientField φ x) := by + rw [vecDot_smul_right] + _ = first x + bridge x := rfl + have hfirst_int : + MeasureTheory.IntegrableOn first U := by + have hdiff_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (fluxDef x) (uφ.grad x) - bridge x) U := by + simpa [MeasureTheory.IntegrableOn] using! + hprod_int.integrable.sub hpair_int.integrable + have hfirst_eq : + first = fun x => vecDot (fluxDef x) (uφ.grad x) - bridge x := by + funext x + have hx := congrFun hprod_split x + linarith + simpa [hfirst_eq] using hdiff_int + have hsum_zero : + ∫ x in U, (first x + bridge x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, (first x + bridge x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (fluxDef x) (uφ.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => (congrFun hprod_split x).symm + _ = 0 := hsol_uφ + have hsum_zero' : + ∫ x in U, first x ∂MeasureTheory.volume + + ∫ x in U, bridge x ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, first x ∂MeasureTheory.volume + + ∫ x in U, bridge x ∂MeasureTheory.volume = + ∫ x in U, (first x + bridge x) ∂MeasureTheory.volume := by + symm + rw [MeasureTheory.integral_add hfirst_int hpair_int] + _ = 0 := hsum_zero + have hfirst_setIntegral : + ∫ x in U, first x ∂MeasureTheory.volume = + -∫ x in U, bridge x ∂MeasureTheory.volume := by + linarith + have hfirst_avg : cubeAverage Q first = -cubeAverage Q bridge := by + calc + cubeAverage Q first = + (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, first x ∂MeasureTheory.volume := rfl + _ = (cubeVolume Q)⁻¹ * + ∫ x in U, first x ∂MeasureTheory.volume := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet (Q := Q) (f := first)] + simp [U, Ch02.cubeDomain_coe] + _ = (cubeVolume Q)⁻¹ * + (-∫ x in U, bridge x ∂MeasureTheory.volume) := by + rw [hfirst_setIntegral] + _ = -((cubeVolume Q)⁻¹ * + ∫ x in U, bridge x ∂MeasureTheory.volume) := by + ring + _ = -((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, bridge x ∂MeasureTheory.volume) := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet (Q := Q) (f := bridge)] + simp [U, Ch02.cubeDomain_coe] + _ = -cubeAverage Q bridge := rfl + have hproduct_as_first : + cutoffProductTermOnCube Q a φ p q p0 q0 = + (1 / 2 : ℝ) * cubeAverage Q first := by + calc + cutoffProductTermOnCube Q a φ p q p0 q0 = + cubeAverage Q (fun x => (1 / 2 : ℝ) * first x) := by + unfold cutoffProductTermOnCube centeredProductDensityOnCube + apply congrArg + funext x + simp [first, fluxDef, flux, u, v, + canonicalMaximizerFluxOnCube, canonicalMaximizerGradientOnCube, + canonicalMaximizerPotentialDefectH1OnCube_grad, vecDot_comm] + ring + _ = (1 / 2 : ℝ) * cubeAverage Q first := by + rw [cubeAverage_const_mul] + have hbridge_as_goal : + bridge = + fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q a p q p0 x • + scalarCutoffGradientField φ x) := by + funext x + simp [bridge, fluxDef, flux, u, v, canonicalMaximizerFluxDefectOnCube, + canonicalMaximizerFluxOnCube, canonicalMaximizerGradientOnCube] + calc + cutoffProductTermOnCube Q a φ p q p0 q0 = + (1 / 2 : ℝ) * cubeAverage Q first := hproduct_as_first + _ = -(1 / 2 : ℝ) * cubeAverage Q bridge := by + rw [hfirst_avg] + ring + _ = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (canonicalMaximizerPotentialDefectOnCube Q a p q p0 x • + scalarCutoffGradientField φ x)) := by + rw [hbridge_as_goal] + +theorem cubeAverage_vecDot_canonicalMaximizerFluxDefect_const_smul_scalarCutoffGradientField_eq_zero + {d : ℕ} (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) {φ : Vec d → ℝ} + (p q q0 : Vec d) (c : ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) : + cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (c • scalarCutoffGradientField φ x)) = 0 := by + classical + let U : Set (Vec d) := ((Ch02.cubeDomain Q : Ch02.Domain d) : Set (Vec d)) + let v : Ch02.Solution (Ch02.cubeDomain Q) a := + canonicalMaximizerSolutionOnCube Q a p q + let flux : Vec d → Vec d := + fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x) + let fluxDef : Vec d → Vec d := fun x => flux x - q0 + let u : H1Function U := H1Function.const (U := U) c + have hφ_sub_U : tsupport φ ⊆ U := by + simpa [U, Ch02.cubeDomain_coe] using hφ_sub + let ψ : H10Function U := + u.mulContDiffHasCompactSupportToH10 + (Ch02.cubeDomain Q).isDomain hφ hφ_compact hφ_sub_U + have hflux_mem : MemVectorL2 U flux := by + simpa [U, flux, v, canonicalMaximizerSolutionOnCube] using + Ch02.Solution.flux_memVectorL2 (canonicalMaximizerSolutionOnCube Q a p q) + have hdrop_const : + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (flux x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [fluxDef, ψ] using + integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hflux_mem ψ q0 + have hsol : + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (flux x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := hdrop_const + _ = 0 := by + simpa [U, flux, v, canonicalMaximizerSolutionOnCube] using + (canonicalMaximizerSolutionOnCube Q a p q).isHarmonic.2 ψ + have hgrad_ae : + (fun x => ψ.toH1Function.grad x) =ᵐ[MeasureTheory.volume.restrict U] + fun x => c • scalarCutoffGradientField φ x := by + have h := + WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + u (Ch02.cubeDomain Q).isDomain hφ hφ_compact hφ_sub_U + filter_upwards [h] with x hx + ext i + have hxi := congrFun hx i + simpa [u, scalarCutoffGradientField, Pi.smul_apply, smul_eq_mul] using hxi + have htarget : + ∫ x in U, + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (c • scalarCutoffGradientField φ x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (c • scalarCutoffGradientField φ x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (fluxDef x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + simp [canonicalMaximizerFluxDefectOnCube, fluxDef, flux, v, + canonicalMaximizerFluxOnCube, canonicalMaximizerGradientOnCube, hx] + _ = 0 := hsol + rw [cubeAverage_eq_integralAverage_openCubeSet Q] + unfold integralAverage + have htarget_open : + ∫ x in openCubeSet Q, + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (c • scalarCutoffGradientField φ x) ∂MeasureTheory.volume = 0 := by + simpa [U, Ch02.cubeDomain_coe] using htarget + rw [htarget_open] + ring + +theorem cutoffProductTermOnCube_eq_neg_half_cubeAverage_fluxDefect_centeredPotentialDefect_smul_scalarCutoffGradientField + {d : ℕ} (Q : TriadicCube d) + (a : Ch02.CoeffOn (Ch02.cubeDomain Q)) {φ : Vec d → ℝ} + (p q p0 q0 : Vec d) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet Q) + (hcutoffGradient : + MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure Q)) : + cutoffProductTermOnCube Q a φ p q p0 q0 = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (((canonicalMaximizerPotentialDefectOnCube Q a p q p0 x - + cubeAverage Q (canonicalMaximizerPotentialDefectOnCube Q a p q p0)) • + scalarCutoffGradientField φ x : Vec d))) := by + classical + let flux : Vec d → Vec d := canonicalMaximizerFluxDefectOnCube Q a p q q0 + let u : Vec d → ℝ := canonicalMaximizerPotentialDefectOnCube Q a p q p0 + let ξ : Vec d → Vec d := scalarCutoffGradientField φ + let c : ℝ := cubeAverage Q u + have hbase := + cutoffProductTermOnCube_eq_neg_half_cubeAverage_fluxDefect_potentialDefect_smul_scalarCutoffGradientField + (Q := Q) (a := a) (φ := φ) p q p0 q0 hφ hφ_compact hφ_sub + have hconst_zero : + cubeAverage Q (fun x => vecDot (flux x) (c • ξ x)) = 0 := by + simpa [flux, ξ, c] using + cubeAverage_vecDot_canonicalMaximizerFluxDefect_const_smul_scalarCutoffGradientField_eq_zero + Q a p q q0 c hφ hφ_compact hφ_sub + have hflux_mem : + MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [flux] using canonicalMaximizerFluxDefectOnCube_memLp Q a p q q0 + have hu_mem : + MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [u] using canonicalMaximizerPotentialDefectOnCube_memLp Q a p q p0 + have hfluct : + MemLp (fun x => u x - c) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu_mem.sub (MeasureTheory.memLp_const c) + have hprod_fluct : + MemLp (fun x => (u x - c) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + simpa [ξ] using! hcutoffGradient.smul + (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hfluct + have hprod_const : + MemLp (fun x => c • ξ x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + have hc : MemLp (fun _ : Vec d => c) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const c + simpa [ξ] using! hcutoffGradient.smul + (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hc + have hdot_fluct : + Integrable + (fun x => vecDot (flux x) ((u x - c) • ξ x)) + (normalizedCubeMeasure Q) := by + rw [show (fun x => vecDot (flux x) ((u x - c) • ξ x)) = + fun x => ∑ i : Fin d, flux x i * ((u x - c) • ξ x) i by + funext x + simp [vecDot]] + exact MeasureTheory.integrable_finsetSum _ fun i _ => + (memLp_component_of_memLp flux i hflux_mem).integrable_mul + (memLp_component_of_memLp (fun x => (u x - c) • ξ x) i hprod_fluct) + have hdot_const : + Integrable + (fun x => vecDot (flux x) (c • ξ x)) + (normalizedCubeMeasure Q) := by + rw [show (fun x => vecDot (flux x) (c • ξ x)) = + fun x => ∑ i : Fin d, flux x i * (c • ξ x) i by + funext x + simp [vecDot]] + exact MeasureTheory.integrable_finsetSum _ fun i _ => + (memLp_component_of_memLp flux i hflux_mem).integrable_mul + (memLp_component_of_memLp (fun x => c • ξ x) i hprod_const) + have havg : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((u x - c) • ξ x)) := by + have hpoint : + (fun x => vecDot (flux x) (u x • ξ x)) = + fun x => + vecDot (flux x) ((u x - c) • ξ x) + + vecDot (flux x) (c • ξ x) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((u x - c) • ξ x) + (c • ξ x)) := by + congr 1 + ext i + simp [Pi.smul_apply, smul_eq_mul] + ring + _ = + vecDot (flux x) ((u x - c) • ξ x) + + vecDot (flux x) (c • ξ x) := by + rw [vecDot_add_right] + rw [hpoint, cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + have hconst_zero_int : + ∫ x, vecDot (flux x) (c • ξ x) ∂ normalizedCubeMeasure Q = 0 := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure Q + (fun x => vecDot (flux x) (c • ξ x))] + exact hconst_zero + rw [MeasureTheory.integral_add hdot_fluct hdot_const] + rw [hconst_zero_int] + ring + calc + cutoffProductTermOnCube Q a φ p q p0 q0 + = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (flux x) (u x • ξ x)) := by + simpa [flux, u, ξ] using hbase + _ = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (flux x) ((u x - c) • ξ x)) := by + rw [havg] + _ = + -(1 / 2 : ℝ) * + cubeAverage Q + (fun x => + vecDot (canonicalMaximizerFluxDefectOnCube Q a p q q0 x) + (((canonicalMaximizerPotentialDefectOnCube Q a p q p0 x - + cubeAverage Q (canonicalMaximizerPotentialDefectOnCube Q a p q p0)) • + scalarCutoffGradientField φ x : Vec d))) := by + simp [flux, u, ξ, c] + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/WeightedChildren.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/WeightedChildren.lean new file mode 100644 index 0000000000..0405d7d1c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/JUpperBoundWeakNorms/WeightedChildren.lean @@ -0,0 +1,346 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.Basic + +/-! # Weighted Children -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace JUpperBoundWeakNorms + +/-! +# WeightedChildren + +Weighted child response observables and stationarity cancellations. +-/ + +open MeasureTheory +open MeasureTheory.Measure +open scoped ENNReal BigOperators + +noncomputable section + +/-- Private Section 5.3 stationarity cancellation for weighted child +responses. + +The manuscript later supplies `weight R = 1 - (phi)_R`; the only stochastic +input here is the Ch4 source theorem for weighted descendant response +expectations. -/ +theorem integral_weightedChildResponseJ_eq_zero_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (weight : TriadicCube d → ℝ) (p q : Vec d) + (hweight : + descendantsAverage (originCube d m) (Int.toNat (m - k)) weight = 0) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => weight R * Ch04.restrictionResponseJObservableCubeSet R p q a) ∂P = 0 := by + rw [ + hP.integral_weightedDescendantsAverage_restrictionResponseJObservableCubeSet_eq_weight_average_mul_originCube_of_stationary + hstat hk_nonneg hkm weight p q hJ, + hweight] + ring + +/-- Manuscript cutoff child weight `1 - (phi)_R`. This is deterministic; +measurability and stationarity enter only through the response observable that +it weights. -/ +noncomputable def cutoffChildWeight {d : ℕ} + (φ : Vec d → ℝ) (R : TriadicCube d) : ℝ := + 1 - cubeAverage R φ + +/-- If the cutoff has parent average one, then the finite average of the child +weights `1 - (phi)_R` is zero. -/ +theorem descendantsAverage_cutoffChildWeight_eq_zero_of_cubeAverage_eq_one + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (φ : Vec d → ℝ) + (hφ_int : IntegrableOn φ (cubeSet Q) volume) + (hMean : cubeAverage Q φ = 1) : + descendantsAverage Q j (fun R => cutoffChildWeight φ R) = 0 := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne : ((D.card : ℝ) ≠ 0) := by + exact_mod_cast Finset.card_ne_zero.mpr hD_nonempty + have hdesc : + descendantsAverage Q j (fun R => cubeAverage R φ) = 1 := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := φ) hφ_int] + exact hMean + have hsum_avg : ∑ R ∈ D, cubeAverage R φ = (D.card : ℝ) := by + have hscaled : + (D.card : ℝ)⁻¹ * (∑ R ∈ D, cubeAverage R φ) = 1 := by + simpa [descendantsAverage, D] using hdesc + have hmul := congrArg (fun x : ℝ => (D.card : ℝ) * x) hscaled + simpa [mul_assoc, hcard_ne] using hmul + unfold descendantsAverage cutoffChildWeight + change (D.card : ℝ)⁻¹ * ∑ R ∈ D, (1 - cubeAverage R φ) = 0 + rw [Finset.sum_sub_distrib, Finset.sum_const, nsmul_eq_mul, hsum_avg] + ring + +/-- Cutoff-weighted child response average from the manuscript splitting. -/ +noncomputable def cutoffWeightedChildResponseJAtScale {d : ℕ} + (m k : ℤ) (φ : Vec d → ℝ) (p q : Vec d) : + RegCoeffField d → ℝ := + fun a => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => cutoffChildWeight φ R * + Ch04.restrictionResponseJObservableCubeSet R p q a) + +/-- Childwise response integrability makes the cutoff-weighted child average +integrable. The cutoff weights are deterministic scalars. -/ +theorem integrable_cutoffWeightedChildResponseJAtScale + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {k m : ℤ} (hkm : k ≤ m) + (φ : Vec d → ℝ) (p q : Vec d) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + Integrable (cutoffWeightedChildResponseJAtScale m k φ p q) P := by + have hDepth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)) → + Integrable + (fun a : RegCoeffField d => + cutoffChildWeight φ R * + Ch04.restrictionResponseJObservableCubeSet R p q a) P := by + intro R hR + have hRscale : R ∈ descendantsAtScale (originCube d m) k := by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR + exact (hJ R hRscale).const_mul (cutoffChildWeight φ R) + simpa [cutoffWeightedChildResponseJAtScale] using! + Ch04.integrable_descendantsAverage + (P := P) (Q := originCube d m) (j := Int.toNat (m - k)) + (F := fun R a => + cutoffChildWeight φ R * Ch04.restrictionResponseJObservableCubeSet R p q a) hDepth + +/-- The manuscript cutoff-weighted child response has zero expectation under +stationarity once the cutoff is normalized to have parent average one. -/ +theorem integral_cutoffWeightedChildResponseJAtScale_eq_zero_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (φ : Vec d → ℝ) (p q : Vec d) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, cutoffWeightedChildResponseJAtScale m k φ p q a ∂P = 0 := by + have hweight : + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => cutoffChildWeight φ R) = 0 := + descendantsAverage_cutoffChildWeight_eq_zero_of_cubeAverage_eq_one + (Q := originCube d m) (j := Int.toNat (m - k)) (φ := φ) hφ_int hMean + simpa [cutoffWeightedChildResponseJAtScale] using + integral_weightedChildResponseJ_eq_zero_of_stationary + (P := P) hP hstat hk_nonneg hkm + (fun R => cutoffChildWeight φ R) p q hweight hJ + +/-- Parent centered response in the Section 5.3 notation. -/ +noncomputable def centeredResponseJAtScale {d : ℕ} + (m : ℤ) (p q p0 q0 : Vec d) : RegCoeffField d → ℝ := + Ch04.restrictionCenteredResponseJObservableCubeSet (originCube d m) p q p0 q0 + +/-- The centered parent response minus the cutoff-weighted child response +average. This is the stochastic side of the manuscript's centered splitting. -/ +noncomputable def centeredJMinusCutoffWeightedChildAtScale {d : ℕ} + (m k : ℤ) (φ : Vec d → ℝ) (p q p0 q0 : Vec d) : + RegCoeffField d → ℝ := + fun a => + centeredResponseJAtScale m p q p0 q0 a - + cutoffWeightedChildResponseJAtScale m k φ p q a + +/-- The expectation of the centered splitting term is just the centered parent +expectation: the cutoff-weighted child contribution cancels by stationarity and +normalization. -/ +theorem integral_centeredJMinusCutoffWeightedChildAtScale_eq_expectedResponseJCubeSet_sub_half_dot + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a ∂P = + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 := by + let : IsProbabilityMeasure P := hP.isProbability + have hWeightedInt : + Integrable (cutoffWeightedChildResponseJAtScale m k φ p q) P := + integrable_cutoffWeightedChildResponseJAtScale (P := P) hkm φ p q hJ + have hCenteredInt : + Integrable (centeredResponseJAtScale m p q p0 q0) P := by + simpa [centeredResponseJAtScale] using + Ch04.integrable_restrictionCenteredResponseJObservableCubeSet + (P := P) (Q := originCube d m) p q p0 q0 hParent + have hCenteredIntegral : + ∫ a, centeredResponseJAtScale m p q p0 q0 a ∂P = + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 := by + simpa [centeredResponseJAtScale] using + Ch04.integral_restrictionCenteredResponseJObservableCubeSet_eq_expectedResponseJCubeSet_sub_half_dot + (P := P) (Q := originCube d m) p q p0 q0 hParent + have hWeightedZero : + ∫ a, cutoffWeightedChildResponseJAtScale m k φ p q a ∂P = 0 := + integral_cutoffWeightedChildResponseJAtScale_eq_zero_of_stationary + (P := P) hP hstat hk_nonneg hkm φ p q hφ_int hMean hJ + calc + ∫ a, centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a ∂P = + ∫ a, centeredResponseJAtScale m p q p0 q0 a ∂P - + ∫ a, cutoffWeightedChildResponseJAtScale m k φ p q a ∂P := by + change + ∫ a, + centeredResponseJAtScale m p q p0 q0 a - + cutoffWeightedChildResponseJAtScale m k φ p q a ∂P = + ∫ a, centeredResponseJAtScale m p q p0 q0 a ∂P - + ∫ a, cutoffWeightedChildResponseJAtScale m k φ p q a ∂P + rw [integral_sub hCenteredInt hWeightedInt] + _ = + (Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0) - 0 := by + rw [hCenteredIntegral, hWeightedZero] + _ = + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 := by + ring + +/-- Private additivity-defect observable from the manuscript proof: +child-scale average of `J` minus parent-scale `J`. -/ +noncomputable def responseJAdditivityDefectAtScale {d : ℕ} + (m k : ℤ) (p q : Vec d) : RegCoeffField d → ℝ := + fun a => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) - + Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a + +/-- The additivity-defect observable has expectation `tau_{m,k}` under +stationarity. This is the stochastic identity used in the square-root +Cauchy step of Lemma `l.J.upper.bound.weak.norms.homogenization.scale`. -/ +theorem integral_responseJAdditivityDefectAtScale_eq_tauAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) (p q : Vec d) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hDesc : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) : + ∫ a, responseJAdditivityDefectAtScale m k p q a ∂P = + tauAtScale P m k p q := by + have hDescDepth : + ∀ R, R ∈ descendantsAtDepth (originCube d m) (Int.toNat (m - k)) → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P := by + intro R hR + exact hDesc R (by + simpa [descendantsAtScale_eq_descendantsAtDepth (originCube d m) hkm] using! hR) + have hAvgInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a)) P := + Ch04.integrable_descendantsAverage_restrictionResponseJObservableCubeSet hDescDepth + calc + ∫ a, responseJAdditivityDefectAtScale m k p q a ∂P + = + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) ∂P - + ∫ a, Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a ∂P := by + change + ∫ a, + (descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) - + Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a) ∂P = + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - k)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) ∂P - + ∫ a, Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a ∂P + rw [integral_sub hAvgInt hParent] + _ = + Ch04.expectedResponseJCubeSet P (originCube d k) p q - + Ch04.expectedResponseJCubeSet P (originCube d m) p q := by + rw [ + hP.integral_descendantsAverage_restrictionResponseJObservableCubeSet_eq_originCube_of_stationary + hstat hk_nonneg hkm p q hDesc] + rfl + _ = tauAtScale P m k p q := by + rfl + +/-- If a scalar observable is a.e. bounded in absolute value by an integrable +right-hand side, then its expectation is bounded by the expectation of that +right-hand side. -/ +theorem integral_le_integral_of_ae_abs_le + {α : Type*} [MeasurableSpace α] {μ : Measure α} {X Y : α → ℝ} + (hX : Integrable X μ) (hY : Integrable Y μ) + (hXY : ∀ᵐ a ∂μ, |X a| ≤ Y a) : + ∫ a, X a ∂μ ≤ ∫ a, Y a ∂μ := by + exact integral_mono_ae hX hY <| + hXY.mono fun a ha => (le_abs_self (X a)).trans ha + +/-- Expectation assembly for the centered-minus-child split: stationarity turns +the left side into the centered parent expectation, and an a.e. deterministic +absolute-value bound controls it by the expectation of any integrable RHS. -/ +theorem integral_centeredJMinusCutoffWeightedChildAtScale_le_integral_of_ae_abs_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + {k m : ℤ} (hk_nonneg : 0 ≤ k) (hkm : k ≤ m) + (φ : Vec d → ℝ) (p q p0 q0 : Vec d) (RHS : RegCoeffField d → ℝ) + (hφ_int : IntegrableOn φ (cubeSet (originCube d m)) volume) + (hMean : cubeAverage (originCube d m) φ = 1) + (hParent : + Integrable (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q) P) + (hJ : ∀ R, R ∈ descendantsAtScale (originCube d m) k → + Integrable (Ch04.restrictionResponseJObservableCubeSet R p q) P) + (hRHS : Integrable RHS P) + (hBound : + ∀ᵐ a ∂P, + |centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 a| ≤ RHS a) : + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 ≤ + ∫ a, RHS a ∂P := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := + centeredJMinusCutoffWeightedChildAtScale m k φ p q p0 q0 + have hWeightedInt : + Integrable (cutoffWeightedChildResponseJAtScale m k φ p q) P := + integrable_cutoffWeightedChildResponseJAtScale (P := P) hkm φ p q hJ + have hCenteredInt : + Integrable (centeredResponseJAtScale m p q p0 q0) P := by + simpa [centeredResponseJAtScale] using + Ch04.integrable_restrictionCenteredResponseJObservableCubeSet + (P := P) (Q := originCube d m) p q p0 q0 hParent + have hXint : Integrable X P := by + simpa [X, centeredJMinusCutoffWeightedChildAtScale] using! + hCenteredInt.sub hWeightedInt + have hInt_le : + ∫ a, X a ∂P ≤ ∫ a, RHS a ∂P := + integral_le_integral_of_ae_abs_le hXint hRHS (by + simpa [X] using hBound) + have hIntegral_eq : + ∫ a, X a ∂P = + Ch04.expectedResponseJCubeSet P (originCube d m) p q - + (1 / 2 : ℝ) * vecDot p0 q0 := by + simpa [X] using + integral_centeredJMinusCutoffWeightedChildAtScale_eq_expectedResponseJCubeSet_sub_half_dot + (P := P) hP hstat hk_nonneg hkm φ p q p0 q0 + hφ_int hMean hParent hJ + simpa [hIntegral_eq] using hInt_le + +end + +end JUpperBoundWeakNorms +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer.lean new file mode 100644 index 0000000000..8bd8a04034 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyFinal + +/-! # Weak Norms Maximizer -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 + +/-! +# Deterministic weak-norm bounds for the maximizer + +Top-level module for the second manuscript lemma in Section 5.3, +`l.weak.norms.maximizer.homogenization.scale`. The apex theorem and its +paired gradient/flux constituents are proved in +`Section53/WeakNormsMaximizer/Assembly.lean` inside `namespace +WeakNormsMaximizer` and re-exported here at the `Section53` namespace level +so downstream callers can use the short manuscript-shaped name. +-/ + +export WeakNormsMaximizer + (weakNormsMaximizer_homogenizationScale + weakNormsMaximizerGradient_homogenizationScale + weakNormsMaximizerFlux_homogenizationScale) + +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyCore.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyCore.lean new file mode 100644 index 0000000000..8f394b14fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyCore.lean @@ -0,0 +1,959 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.LowScales +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.DiscountBounds + +/-! # Assembly Core -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Assembly for the weak-norm maximizer lemma + +This file assembles the finite-depth deterministic weak-norm bounds from: + +* the high/low weak-norm split; +* the high-scale response-defect controls; +* the low-scale parent-response tails. + +The finite-depth estimates are kept private for now. The public manuscript +surface will be added after the scale-indexed RHS conversion and supremum step. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +/-- A harmless dimension constant for the deterministic weak-norm maximizer +bound. It is deliberately oversized: it absorbs the accepted leading factor +`2`, the high-scale factor `4`, and the geometric-tail constants. -/ +def section53WeakNormMaximizerConst (d : ℕ) : ℝ := + 100 * ((d : ℝ) + 1) + +theorem section53WeakNormMaximizerConst_nonneg (d : ℕ) : + 0 ≤ section53WeakNormMaximizerConst d := by + unfold section53WeakNormMaximizerConst + have hd : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + nlinarith + +theorem ten_le_section53WeakNormMaximizerConst (d : ℕ) : + 10 ≤ section53WeakNormMaximizerConst d := by + unfold section53WeakNormMaximizerConst + have hd : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + nlinarith + +theorem five_mul_succ_le_section53WeakNormMaximizerConst (d : ℕ) : + 5 * ((d : ℝ) + 1) ≤ section53WeakNormMaximizerConst d := by + unfold section53WeakNormMaximizerConst + have hd : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + nlinarith + +theorem two_le_section53WeakNormMaximizerConst (d : ℕ) : + 2 ≤ section53WeakNormMaximizerConst d := + (by norm_num : (2 : ℝ) ≤ 10).trans (ten_le_section53WeakNormMaximizerConst d) + +theorem sqrt_vecNormSq_le_succ_mul_norm {d : ℕ} (v : Vec d) : + Real.sqrt (vecNormSq v) ≤ ((d : ℝ) + 1) * ‖v‖ := by + have hsum : + vecNormSq v ≤ (d : ℝ) * ‖v‖ ^ 2 := by + rw [vecNormSq, vecDot] + calc + (∑ i : Fin d, v i * v i) = ∑ i : Fin d, v i ^ (2 : ℕ) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + _ ≤ ∑ _i : Fin d, ‖v‖ ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hcoord_abs : |v i| ≤ ‖v‖ := by + simpa [Real.norm_eq_abs] using norm_le_pi_norm v i + have hcoord_sq : |v i| ^ 2 ≤ ‖v‖ ^ 2 := by + nlinarith [abs_nonneg (v i), norm_nonneg v] + simpa [sq_abs, pow_two] using hcoord_sq + _ = (Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + _ = (d : ℝ) * ‖v‖ ^ 2 := by + simp + have hsq : + vecNormSq v ≤ (((d : ℝ) + 1) * ‖v‖) ^ (2 : ℕ) := by + have hd : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hnorm_sq : 0 ≤ ‖v‖ ^ 2 := sq_nonneg _ + have hd_le : (d : ℝ) ≤ ((d : ℝ) + 1) ^ (2 : ℕ) := by + nlinarith + nlinarith + exact (Real.sqrt_le_iff).2 ⟨mul_nonneg (by positivity) (norm_nonneg v), hsq⟩ + +private theorem gradientMismatchTermAtScale_nonneg {d : ℕ} [NeZero d] + (m k : ℤ) (s s' : ℝ) (p q : Vec d) (a : RegCoeffField d) : + 0 ≤ gradientMismatchTermAtScale m k s s' p q a := by + unfold gradientMismatchTermAtScale + refine mul_nonneg (Real.sqrt_nonneg _) ?_ + refine Finset.sum_nonneg ?_ + intro n _hn + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem fluxMismatchTermAtScale_nonneg {d : ℕ} [NeZero d] + (m k : ℤ) (t t' : ℝ) (p q : Vec d) (a : RegCoeffField d) : + 0 ≤ fluxMismatchTermAtScale m k t t' p q a := by + unfold fluxMismatchTermAtScale + refine mul_nonneg (Real.sqrt_nonneg _) ?_ + refine Finset.sum_nonneg ?_ + intro n _hn + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem inv_one_sub_rpow_three_neg_le_five_inv {r : ℝ} + (hr : 0 < r) (hr_le : r ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-r))⁻¹ ≤ 5 * r⁻¹ := + Ch02.inv_one_sub_rpow_three_neg_le_five_inv hr hr_le + +private theorem descendantsAverage_zero_vecNormSq {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + descendantsAverage Q j (fun _R => vecNormSq (0 : Vec d)) = 0 := by + rw [descendantsAverage_const_eq] + simp [vecNormSq, vecDot] + +private theorem sum_range_filter_lt_le_range {N L : ℕ} {f : ℕ → ℝ} + (hf : ∀ j, 0 ≤ f j) : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), f j) ≤ + ∑ j ∈ Finset.range L, f j := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + exact Finset.mem_range.mpr ((Finset.mem_filter.mp hj).2) + · intro j _hj _hnot + exact hf j + +private theorem sum_range_to_Icc_descending {k m : ℤ} (hkm : k ≤ m) + (F : ℕ → ℝ) : + (∑ j ∈ Finset.range (Int.toNat (m - k)), F j) = + ∑ n ∈ Finset.Icc (k + 1) m, F (Int.toNat (m - n)) := by + classical + refine Finset.sum_bij (fun j _hj => m - (j : ℤ)) ?_ ?_ ?_ ?_ + · intro j hj + have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hj_lt_nat : j < Int.toNat (m - k) := Finset.mem_range.mp hj + have hj_lt : (j : ℤ) < m - k := by + have hj_lt' : (j : ℤ) < ((Int.toNat (m - k) : ℕ) : ℤ) := by + exact_mod_cast hj_lt_nat + simpa [hL] using hj_lt' + simp only [Finset.mem_Icc] + constructor <;> omega + · intro j₁ _hj₁ j₂ _hj₂ h + have h' : m - (j₁ : ℤ) = m - (j₂ : ℤ) := by simpa using h + have hcast : (j₁ : ℤ) = (j₂ : ℤ) := by omega + exact_mod_cast hcast + · intro n hn + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + refine ⟨Int.toNat (m - n), ?_, ?_⟩ + · have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hmn_lt : m - n < m - k := by omega + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + apply Finset.mem_range.mpr + have hcast : ((Int.toNat (m - n) : ℕ) : ℤ) < + ((Int.toNat (m - k) : ℕ) : ℤ) := by + simpa [hto, hL] using hmn_lt + exact_mod_cast hcast + · have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + change m - ((Int.toNat (m - n) : ℕ) : ℤ) = n + rw [hto] + omega + · intro j hj + have harg : Int.toNat (m - (m - (j : ℤ))) = j := by + have hsub : m - (m - (j : ℤ)) = (j : ℤ) := by ring + simp [hsub] + simp + +private theorem canonicalScalarResponseGradientWeakNormCubeSet_le_of_partialBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) + (a : RegCoeffField d) {B : ℝ} + (hB : + ∀ N : ℕ, + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun ≤ B) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun ≤ B := by + unfold Ch04.canonicalScalarResponseGradientWeakNormCubeSet + refine csSup_le ?_ ?_ + · exact ⟨Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s 0 p q p0 a.toFun, + ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +private theorem canonicalScalarResponseFluxWeakNormCubeSet_le_of_partialBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (p q q0 : Vec d) + (a : RegCoeffField d) {B : ℝ} + (hB : + ∀ N : ℕ, + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun ≤ B) : + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun ≤ B := by + unfold Ch04.canonicalScalarResponseFluxWeakNormCubeSet + refine csSup_le ?_ ?_ + · exact ⟨Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t 0 p q q0 a.toFun, + ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +private theorem gradientWeakNormPartial_le_depthRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N L : ℕ) {s s' : ℝ} + (hs : 0 < s) (hs' : 0 < s') (hgap : 0 < s - s') + (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun ≤ + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) + + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + have hsplit := + canonicalScalarResponseGradientWeakNormPartialCubeSet_le_highLowSplit + a ha Q s N L hs p q p0 + let high : ℕ → Prop := fun j => j < L + let avgTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0)) + let mismatchTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + let zeroTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + let lowSum : ℝ := + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q) j + let constTail : ℝ := + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0)) + let mismatchRHS : ℝ := + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) + let lowRHS : ℝ := + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + have hzero : ∀ j, zeroTerm j = 0 := by + intro j + dsimp [zeroTerm] + rw [descendantsAverage_zero_vecNormSq] + simp + have hsplit' : + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + + 2 * (lowSum + constTail) := by + simpa [high, avgTerm, mismatchTerm, zeroTerm, lowSum, constTail] using hsplit + have hhigh_rewrite : + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) := by + calc + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + = + ∑ j ∈ (Finset.range (N + 1)).filter high, + (2 * avgTerm j + 2 * mismatchTerm j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + rw [hzero j] + ring + _ = + (∑ j ∈ (Finset.range (N + 1)).filter high, 2 * avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, 2 * mismatchTerm j := by + rw [← Finset.sum_add_distrib] + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) := by + rw [← Finset.mul_sum, ← Finset.mul_sum] + ring + have hmismatch : + (∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) ≤ mismatchRHS := by + simpa [high, mismatchTerm, mismatchRHS] using + gradientHighMismatchSum_le_lambdaSqCoeffField_responseDefectSum + a ha Q N high hs' p q + have hlow : lowSum ≤ lowRHS := by + simpa [high, lowSum, lowRHS] using + gradientLowScaleDepthSum_le_lambdaSqCoeffField_responseJ + a ha Q N L hs' hgap p q + calc + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun + ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + + 2 * (lowSum + constTail) := hsplit' + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) + + 2 * (lowSum + constTail) := by + rw [hhigh_rewrite] + _ ≤ + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + mismatchRHS) + + 2 * (lowRHS + constTail) := by + nlinarith [hmismatch, hlow] + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) + + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + simp [high, avgTerm, mismatchRHS, lowRHS, constTail] + +private theorem fluxWeakNormPartial_le_depthRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N L : ℕ) {t t' : ℝ} + (ht : 0 < t) (ht' : 0 < t') (hgap : 0 < t - t') + (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun ≤ + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) + + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + have hsplit := + canonicalScalarResponseFluxWeakNormPartialCubeSet_le_highLowSplit + a ha Q t N L ht p q q0 + let high : ℕ → Prop := fun j => j < L + let avgTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0)) + let mismatchTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + let zeroTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + let lowSum : ℝ := + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q t + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q) j + let constTail : ℝ := + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0)) + let mismatchRHS : ℝ := + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) + let lowRHS : ℝ := + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + have hzero : ∀ j, zeroTerm j = 0 := by + intro j + dsimp [zeroTerm] + rw [descendantsAverage_zero_vecNormSq] + simp + have hsplit' : + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + + 2 * (lowSum + constTail) := by + simpa [high, avgTerm, mismatchTerm, zeroTerm, lowSum, constTail] using hsplit + have hhigh_rewrite : + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) := by + calc + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + = + ∑ j ∈ (Finset.range (N + 1)).filter high, + (2 * avgTerm j + 2 * mismatchTerm j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + rw [hzero j] + ring + _ = + (∑ j ∈ (Finset.range (N + 1)).filter high, 2 * avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, 2 * mismatchTerm j := by + rw [← Finset.sum_add_distrib] + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) := by + rw [← Finset.mul_sum, ← Finset.mul_sum] + ring + have hmismatch : + (∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) ≤ mismatchRHS := by + simpa [high, mismatchTerm, mismatchRHS] using + fluxHighMismatchSum_le_LambdaSqCoeffField_responseDefectSum + a ha Q N high ht' p q + have hlow : lowSum ≤ lowRHS := by + simpa [high, lowSum, lowRHS] using + fluxLowScaleDepthSum_le_LambdaSqCoeffField_responseJ + a ha Q N L ht' hgap p q + calc + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun + ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * (avgTerm j + mismatchTerm j + zeroTerm j + zeroTerm j)) + + 2 * (lowSum + constTail) := hsplit' + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + + ∑ j ∈ (Finset.range (N + 1)).filter high, mismatchTerm j) + + 2 * (lowSum + constTail) := by + rw [hhigh_rewrite] + _ ≤ + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter high, avgTerm j) + mismatchRHS) + + 2 * (lowRHS + constTail) := by + nlinarith [hmismatch, hlow] + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) + + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + simp [high, avgTerm, mismatchRHS, lowRHS, constTail] + +private theorem gradientWeakNorm_le_depthRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (L : ℕ) {s s' : ℝ} + (hs : 0 < s) (hs' : 0 < s') (hgap : 0 < s - s') + (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun ≤ + 2 * + ((∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) + + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + ∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + let avgTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0)) + let defectTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) + let coeff : ℝ := 2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) + let lowTail : ℝ := + coeff * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + let constTail : ℝ := + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0)) + refine + canonicalScalarResponseGradientWeakNormCubeSet_le_of_partialBound + Q s p q p0 a ?_ + intro N + have hpartial := + gradientWeakNormPartial_le_depthRHS a ha Q N L hs hs' hgap p q p0 + have havg_nonneg : ∀ j, 0 ≤ avgTerm j := by + intro j + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have hdefect_nonneg : ∀ j, 0 ≤ defectTerm j := by + intro j + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have havg : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), avgTerm j) ≤ + ∑ j ∈ Finset.range L, avgTerm j := + sum_range_filter_lt_le_range (N := N) (L := L) havg_nonneg + have hdefect : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), defectTerm j) ≤ + ∑ j ∈ Finset.range L, defectTerm j := + sum_range_filter_lt_le_range (N := N) (L := L) hdefect_nonneg + have hcoeff_nonneg : 0 ≤ coeff := by + exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + have hdefect_coeff : + coeff * + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), defectTerm j) ≤ + coeff * ∑ j ∈ Finset.range L, defectTerm j := + mul_le_mul_of_nonneg_left hdefect hcoeff_nonneg + have hmain : + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun ≤ + 2 * ((∑ j ∈ Finset.range L, avgTerm j) + + coeff * ∑ j ∈ Finset.range L, defectTerm j) + + 2 * (lowTail + constTail) := by + nlinarith [hpartial, havg, hdefect_coeff] + simpa [avgTerm, defectTerm, coeff, lowTail, constTail] using hmain + +private theorem fluxWeakNorm_le_depthRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (L : ℕ) {t t' : ℝ} + (ht : 0 < t) (ht' : 0 < t') (hgap : 0 < t - t') + (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q t p q q0 a.toFun ≤ + 2 * + ((∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) + + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + ∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + + 2 * + (((2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a)) + + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + let avgTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0)) + let defectTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) + let coeff : ℝ := 2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a) + let lowTail : ℝ := + coeff * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + let constTail : ℝ := + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0)) + refine + canonicalScalarResponseFluxWeakNormCubeSet_le_of_partialBound + Q t p q q0 a ?_ + intro N + have hpartial := + fluxWeakNormPartial_le_depthRHS a ha Q N L ht ht' hgap p q q0 + have havg_nonneg : ∀ j, 0 ≤ avgTerm j := by + intro j + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have hdefect_nonneg : ∀ j, 0 ≤ defectTerm j := by + intro j + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have havg : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), avgTerm j) ≤ + ∑ j ∈ Finset.range L, avgTerm j := + sum_range_filter_lt_le_range (N := N) (L := L) havg_nonneg + have hdefect : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), defectTerm j) ≤ + ∑ j ∈ Finset.range L, defectTerm j := + sum_range_filter_lt_le_range (N := N) (L := L) hdefect_nonneg + have hcoeff_nonneg : 0 ≤ coeff := by + exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + have hdefect_coeff : + coeff * + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), defectTerm j) ≤ + coeff * ∑ j ∈ Finset.range L, defectTerm j := + mul_le_mul_of_nonneg_left hdefect hcoeff_nonneg + have hmain : + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun ≤ + 2 * ((∑ j ∈ Finset.range L, avgTerm j) + + coeff * ∑ j ∈ Finset.range L, defectTerm j) + + 2 * (lowTail + constTail) := by + nlinarith [hpartial, havg, hdefect_coeff] + simpa [avgTerm, defectTerm, coeff, lowTail, constTail] using hmain + +theorem gradientWeakNorm_le_scaleGeometricRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (hkm : k ≤ m) {s s' : ℝ} + (hs : 0 < s) (hs' : 0 < s') (hgap : 0 < s - s') + (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a ≤ + 2 * + (gradientAverageTermAtScale m k s p q p0 a + + 2 * gradientMismatchTermAtScale m k s s' p q a) + + 2 * + (((2 * Real.sqrt + ((Ch04.lambdaSqCoeffField (originCube d m) s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a)) + + (Real.rpow (3 : ℝ) (-s * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + let Q : TriadicCube d := originCube d m + let L : ℕ := Int.toNat (m - k) + have hraw := + gradientWeakNorm_le_depthRHS a ha Q L hs hs' hgap p q p0 + have hAvg : + (∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) = + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-s * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (descendantsAverage Q (Int.toNat (m - n)) fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0)) := by + simpa [L] using + sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) + have hDefect : + (∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) = + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - n) : ℝ)) * + Real.sqrt (responseDefectAverageAtScale m n p q a) := by + have h := + sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + simpa [Q, L, responseDefectAverageAtScale_eq_responseJPartitionDefectOnDependentFamily + a ha] using h + rw [hAvg, hDefect] at hraw + simpa [Q, L, gradientAverageTermAtScale, gradientMismatchTermAtScale, + mul_assoc] using hraw + +theorem fluxWeakNorm_le_scaleGeometricRHS + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (hkm : k ≤ m) {t t' : ℝ} + (ht : 0 < t) (ht' : 0 < t') (hgap : 0 < t - t') + (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a ≤ + 2 * + (fluxAverageTermAtScale m k t p q q0 a + + 2 * fluxMismatchTermAtScale m k t t' p q a) + + 2 * + (((2 * Real.sqrt + (Ch04.LambdaSqCoeffField (originCube d m) t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a)) + + (Real.rpow (3 : ℝ) (-t * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + let Q : TriadicCube d := originCube d m + let L : ℕ := Int.toNat (m - k) + have hraw := + fluxWeakNorm_le_depthRHS a ha Q L ht ht' hgap p q q0 + have hAvg : + (∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) = + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-t * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (descendantsAverage Q (Int.toNat (m - n)) fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0)) := by + simpa [L] using + sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) + have hDefect : + (∑ j ∈ Finset.range L, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) = + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - n) : ℝ)) * + Real.sqrt (responseDefectAverageAtScale m n p q a) := by + have h := + sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q)) + simpa [Q, L, responseDefectAverageAtScale_eq_responseJPartitionDefectOnDependentFamily + a ha] using h + rw [hAvg, hDefect] at hraw + simpa [Q, L, fluxAverageTermAtScale, fluxMismatchTermAtScale, + mul_assoc] using hraw + +theorem gradientScaleGeometricRHS_le_two_gradientRHSAtScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + {k m : ℤ} {s s' : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hgap : 0 < s - s') (hgap_le : s - s' ≤ 1) + (p q p0 : Vec d) : + 2 * + (gradientAverageTermAtScale m k s p q p0 a + + 2 * gradientMismatchTermAtScale m k s s' p q a) + + 2 * + (((2 * Real.sqrt + ((Ch04.lambdaSqCoeffField (originCube d m) s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a)) + + (Real.rpow (3 : ℝ) (-s * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) ≤ + 2 * + gradientRHSAtScale (section53WeakNormMaximizerConst d) + m k s s' p q p0 a := by + let C : ℝ := section53WeakNormMaximizerConst d + let Q : TriadicCube d := originCube d m + let A : ℝ := gradientAverageTermAtScale m k s p q p0 a + let M : ℝ := gradientMismatchTermAtScale m k s s' p q a + let Low : ℝ := gradientLowScaleTailAtScale m k s s' p q a + let Const : ℝ := gradientConstantTailAtScale m k s p0 + let lam : ℝ := Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) + let tailGap : ℝ := Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - k) : ℝ)) + let discGap : ℝ := (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹ + let sqrtJ : ℝ := Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + let tailS : ℝ := Real.rpow (3 : ℝ) (-s * (Int.toNat (m - k) : ℝ)) + let discS : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let sqrtP : ℝ := Real.sqrt (vecNormSq (-p0)) + have hM_nonneg : 0 ≤ M := by + simpa [M] using gradientMismatchTermAtScale_nonneg m k s s' p q a + have hM_le : 2 * M ≤ C * M := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using two_le_section53WeakNormMaximizerConst d) hM_nonneg + have hdiscGap : discGap ≤ 5 * (s - s')⁻¹ := by + simpa [discGap] using inv_one_sub_rpow_three_neg_le_five_inv hgap hgap_le + have hdiscS : discS ≤ 5 * s⁻¹ := by + simpa [discS] using inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have htailGap_nonneg : 0 ≤ tailGap := by + dsimp [tailGap] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hlam_nonneg : 0 ≤ lam := by + dsimp [lam] + exact Real.sqrt_nonneg _ + have hsqrtJ_nonneg : 0 ≤ sqrtJ := by + dsimp [sqrtJ] + exact Real.sqrt_nonneg _ + have hLowBase_nonneg : 0 ≤ (s - s')⁻¹ * tailGap * lam * sqrtJ := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (inv_nonneg.mpr hgap.le) htailGap_nonneg) hlam_nonneg) + hsqrtJ_nonneg + have hLowGeom_le : + (2 * lam) * (tailGap * discGap) * sqrtJ ≤ C * Low := by + have hstep : + (2 * lam) * (tailGap * discGap) * sqrtJ ≤ + (2 * lam) * (tailGap * (5 * (s - s')⁻¹)) * sqrtJ := by + gcongr + calc + (2 * lam) * (tailGap * discGap) * sqrtJ + ≤ (2 * lam) * (tailGap * (5 * (s - s')⁻¹)) * sqrtJ := hstep + _ = 10 * ((s - s')⁻¹ * tailGap * lam * sqrtJ) := by ring + _ ≤ C * ((s - s')⁻¹ * tailGap * lam * sqrtJ) := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using ten_le_section53WeakNormMaximizerConst d) + hLowBase_nonneg + _ = C * Low := by + simp [Low, gradientLowScaleTailAtScale, Q, lam, tailGap, sqrtJ] + have hsqrtP : sqrtP ≤ ((d : ℝ) + 1) * ‖p0‖ := by + simpa [sqrtP, norm_neg] using sqrt_vecNormSq_le_succ_mul_norm (-p0) + have htailS_nonneg : 0 ≤ tailS := by + dsimp [tailS] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have htailS_discBound_nonneg : 0 ≤ tailS * (5 * s⁻¹) := by + exact mul_nonneg htailS_nonneg + (mul_nonneg (by norm_num : 0 ≤ (5 : ℝ)) (inv_nonneg.mpr hs.le)) + have hConstBase_nonneg : 0 ≤ s⁻¹ * tailS * ‖p0‖ := by + exact mul_nonneg (mul_nonneg (inv_nonneg.mpr hs.le) htailS_nonneg) (norm_nonneg p0) + have hConstGeom_le : + tailS * discS * sqrtP ≤ C * Const := by + calc + tailS * discS * sqrtP + ≤ tailS * (5 * s⁻¹) * (((d : ℝ) + 1) * ‖p0‖) := by + gcongr + _ = (5 * ((d : ℝ) + 1)) * (s⁻¹ * tailS * ‖p0‖) := by ring + _ ≤ C * (s⁻¹ * tailS * ‖p0‖) := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using five_mul_succ_le_section53WeakNormMaximizerConst d) + hConstBase_nonneg + _ = C * Const := by + simp [Const, gradientConstantTailAtScale, tailS] + have hmain : + 2 * (A + 2 * M) + 2 * + (((2 * lam) * (tailGap * discGap) * sqrtJ) + + tailS * discS * sqrtP) ≤ + 2 * (A + C * M + C * Low + C * Const) := by + nlinarith [hM_le, hLowGeom_le, hConstGeom_le] + simpa [C, Q, A, M, Low, Const, lam, tailGap, discGap, sqrtJ, tailS, discS, sqrtP, + gradientRHSAtScale, mul_assoc] using hmain + + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyFinal.lean new file mode 100644 index 0000000000..9d9ab0d8f3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/AssemblyFinal.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.AssemblyCore + +/-! # Assembly Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Final assembly for the weak-norm maximizer lemma + +This file finishes the deterministic weak-norm maximizer theorem from the +scale-geometric core estimates. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +private theorem fluxScaleGeometricRHS_le_two_fluxRHSAtScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + {k m : ℤ} {t t' : ℝ} + (ht : 0 < t) (ht_le : t ≤ 1) + (hgap : 0 < t - t') (hgap_le : t - t' ≤ 1) + (p q q0 : Vec d) : + 2 * + (fluxAverageTermAtScale m k t p q q0 a + + 2 * fluxMismatchTermAtScale m k t t' p q a) + + 2 * + (((2 * Real.sqrt + (Ch04.LambdaSqCoeffField (originCube d m) t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet (originCube d m) p q a)) + + (Real.rpow (3 : ℝ) (-t * (Int.toNat (m - k) : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) ≤ + 2 * + fluxRHSAtScale (section53WeakNormMaximizerConst d) + m k t t' p q q0 a := by + let C : ℝ := section53WeakNormMaximizerConst d + let Q : TriadicCube d := originCube d m + let A : ℝ := fluxAverageTermAtScale m k t p q q0 a + let M : ℝ := fluxMismatchTermAtScale m k t t' p q a + let Low : ℝ := fluxLowScaleTailAtScale m k t t' p q a + let Const : ℝ := fluxConstantTailAtScale m k t q0 + let lam : ℝ := Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a) + let tailGap : ℝ := Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - k) : ℝ)) + let discGap : ℝ := (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹ + let sqrtJ : ℝ := Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + let tailT : ℝ := Real.rpow (3 : ℝ) (-t * (Int.toNat (m - k) : ℝ)) + let discT : ℝ := (1 - Real.rpow (3 : ℝ) (-t))⁻¹ + let sqrtQ : ℝ := Real.sqrt (vecNormSq (-q0)) + have hM_nonneg : 0 ≤ M := by + simpa [M] using fluxMismatchTermAtScale_nonneg m k t t' p q a + have hM_le : 2 * M ≤ C * M := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using two_le_section53WeakNormMaximizerConst d) hM_nonneg + have hdiscGap : discGap ≤ 5 * (t - t')⁻¹ := by + simpa [discGap] using inv_one_sub_rpow_three_neg_le_five_inv hgap hgap_le + have hdiscT : discT ≤ 5 * t⁻¹ := by + simpa [discT] using inv_one_sub_rpow_three_neg_le_five_inv ht ht_le + have htailGap_nonneg : 0 ≤ tailGap := by + dsimp [tailGap] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hlam_nonneg : 0 ≤ lam := by + dsimp [lam] + exact Real.sqrt_nonneg _ + have hsqrtJ_nonneg : 0 ≤ sqrtJ := by + dsimp [sqrtJ] + exact Real.sqrt_nonneg _ + have hLowBase_nonneg : 0 ≤ (t - t')⁻¹ * tailGap * lam * sqrtJ := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (inv_nonneg.mpr hgap.le) htailGap_nonneg) hlam_nonneg) + hsqrtJ_nonneg + have hLowGeom_le : + (2 * lam) * (tailGap * discGap) * sqrtJ ≤ C * Low := by + have hstep : + (2 * lam) * (tailGap * discGap) * sqrtJ ≤ + (2 * lam) * (tailGap * (5 * (t - t')⁻¹)) * sqrtJ := by + gcongr + calc + (2 * lam) * (tailGap * discGap) * sqrtJ + ≤ (2 * lam) * (tailGap * (5 * (t - t')⁻¹)) * sqrtJ := hstep + _ = 10 * ((t - t')⁻¹ * tailGap * lam * sqrtJ) := by ring + _ ≤ C * ((t - t')⁻¹ * tailGap * lam * sqrtJ) := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using ten_le_section53WeakNormMaximizerConst d) + hLowBase_nonneg + _ = C * Low := by + simp [Low, fluxLowScaleTailAtScale, Q, lam, tailGap, sqrtJ] + have hsqrtQ : sqrtQ ≤ ((d : ℝ) + 1) * ‖q0‖ := by + simpa [sqrtQ, norm_neg] using sqrt_vecNormSq_le_succ_mul_norm (-q0) + have htailT_nonneg : 0 ≤ tailT := by + dsimp [tailT] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have htailT_discBound_nonneg : 0 ≤ tailT * (5 * t⁻¹) := by + exact mul_nonneg htailT_nonneg + (mul_nonneg (by norm_num : 0 ≤ (5 : ℝ)) (inv_nonneg.mpr ht.le)) + have hConstBase_nonneg : 0 ≤ t⁻¹ * tailT * ‖q0‖ := by + exact mul_nonneg (mul_nonneg (inv_nonneg.mpr ht.le) htailT_nonneg) (norm_nonneg q0) + have hConstGeom_le : + tailT * discT * sqrtQ ≤ C * Const := by + calc + tailT * discT * sqrtQ + ≤ tailT * (5 * t⁻¹) * (((d : ℝ) + 1) * ‖q0‖) := by + gcongr + _ = (5 * ((d : ℝ) + 1)) * (t⁻¹ * tailT * ‖q0‖) := by ring + _ ≤ C * (t⁻¹ * tailT * ‖q0‖) := by + exact mul_le_mul_of_nonneg_right + (by simpa [C] using five_mul_succ_le_section53WeakNormMaximizerConst d) + hConstBase_nonneg + _ = C * Const := by + simp [Const, fluxConstantTailAtScale, tailT] + have hmain : + 2 * (A + 2 * M) + 2 * + (((2 * lam) * (tailGap * discGap) * sqrtJ) + + tailT * discT * sqrtQ) ≤ + 2 * (A + C * M + C * Low + C * Const) := by + nlinarith [hM_le, hLowGeom_le, hConstGeom_le] + simpa [C, Q, A, M, Low, Const, lam, tailGap, discGap, sqrtJ, tailT, discT, sqrtQ, + fluxRHSAtScale, mul_assoc] using hmain + +/-- Deterministic gradient weak-norm bound for the scalar response maximizer +at homogenization scale. The leading factor `2` records the current +high/low split normalization and is absorbed harmlessly in later constants. -/ +theorem weakNormsMaximizerGradient_homogenizationScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (hkm : k < m) {s s' : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hs'_low : s / 2 ≤ s') (hs'_high : s' < s) + (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a ≤ + 2 * + gradientRHSAtScale (section53WeakNormMaximizerConst d) + m k s s' p q p0 a := by + have hs'_pos : 0 < s' := by linarith + have hgap : 0 < s - s' := sub_pos.mpr hs'_high + have hgap_le : s - s' ≤ 1 := by linarith + exact + (gradientWeakNorm_le_scaleGeometricRHS a ha hkm.le hs hs'_pos hgap p q p0).trans + (gradientScaleGeometricRHS_le_two_gradientRHSAtScale + a hs hs_le hgap hgap_le p q p0) + +/-- Deterministic flux weak-norm bound for the scalar response maximizer at +homogenization scale. The leading factor `2` records the accepted split +loss and is absorbed harmlessly in later constants. -/ +theorem weakNormsMaximizerFlux_homogenizationScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (hkm : k < m) {t t' : ℝ} + (ht : 0 < t) (ht_le : t ≤ 1) + (ht'_low : t / 2 ≤ t') (ht'_high : t' < t) + (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a ≤ + 2 * + fluxRHSAtScale (section53WeakNormMaximizerConst d) + m k t t' p q q0 a := by + have ht'_pos : 0 < t' := by linarith + have hgap : 0 < t - t' := sub_pos.mpr ht'_high + have hgap_le : t - t' ≤ 1 := by linarith + exact + (fluxWeakNorm_le_scaleGeometricRHS a ha hkm.le ht ht'_pos hgap p q q0).trans + (fluxScaleGeometricRHS_le_two_fluxRHSAtScale + a ht ht_le hgap hgap_le p q q0) + +/-- The paired deterministic weak-norm maximizer estimate, in the manuscript +parameter regime. -/ +theorem weakNormsMaximizer_homogenizationScale + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {k m : ℤ} (hkm : k < m) + {s s' t t' : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hs'_low : s / 2 ≤ s') (hs'_high : s' < s) + (ht : 0 < t) (ht_le : t ≤ 1) + (ht'_low : t / 2 ≤ t') (ht'_high : t' < t) + (p q p0 q0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet + (originCube d m) s p q p0 a ≤ + 2 * + gradientRHSAtScale (section53WeakNormMaximizerConst d) + m k s s' p q p0 a ∧ + Ch04.canonicalScalarResponseFluxWeakNormCubeSet + (originCube d m) t p q q0 a ≤ + 2 * + fluxRHSAtScale (section53WeakNormMaximizerConst d) + m k t t' p q q0 a := by + constructor + · exact weakNormsMaximizerGradient_homogenizationScale + a ha hkm hs hs_le hs'_low hs'_high p q p0 + · exact weakNormsMaximizerFlux_homogenizationScale + a ha hkm ht ht_le ht'_low ht'_high p q q0 + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Basic.lean new file mode 100644 index 0000000000..f461f0f320 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Basic.lean @@ -0,0 +1,141 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.Common + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Basic definitions for the weak-norm maximizer lemma + +Named right-hand-side terms for manuscript Lemma +`l.weak.norms.maximizer.homogenization.scale`. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +/-- The high-scale averaged-gradient term in the weak-norm maximizer estimate. -/ +noncomputable def gradientAverageTermAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (s : ℝ) (p q p0 : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-s * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (descendantsAverage Q (Int.toNat (m - n)) + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0))) + +/-- The high-scale averaged-flux term in the weak-norm maximizer estimate. -/ +noncomputable def fluxAverageTermAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (t : ℝ) (p q q0 : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-t * (Int.toNat (m - n) : ℝ)) * + Real.sqrt + (descendantsAverage Q (Int.toNat (m - n)) + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0))) + +/-- The parent-child response defect at a child scale. -/ +noncomputable def responseDefectAverageAtScale {d : ℕ} + (m n : ℤ) (p q : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + descendantsAverage Q (Int.toNat (m - n)) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) - + Ch04.restrictionResponseJObservableCubeSet Q p q a + +/-- The high-scale gradient mismatch term controlled by the lower ellipticity +quantity on the parent cube. The dimensional constant is inserted by the final +RHS. -/ +noncomputable def gradientMismatchTermAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (s s' : ℝ) (p q : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) * + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - n) : ℝ)) * + Real.sqrt (responseDefectAverageAtScale m n p q a) + +/-- The high-scale flux mismatch term controlled by the upper ellipticity +quantity on the parent cube. The dimensional constant is inserted by the final +RHS. -/ +noncomputable def fluxMismatchTermAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (t t' : ℝ) (p q : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a) * + ∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - n) : ℝ)) * + Real.sqrt (responseDefectAverageAtScale m n p q a) + +/-- The low-scale gradient tail in the weak-norm maximizer estimate. -/ +noncomputable def gradientLowScaleTailAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (s s' : ℝ) (p q : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + (s - s')⁻¹ * + Real.rpow (3 : ℝ) (-(s - s') * (Int.toNat (m - k) : ℝ)) * + Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + +/-- The low-scale flux tail in the weak-norm maximizer estimate. -/ +noncomputable def fluxLowScaleTailAtScale {d : ℕ} [NeZero d] + (m k : ℤ) (t t' : ℝ) (p q : Vec d) (a : RegCoeffField d) : ℝ := + let Q : TriadicCube d := originCube d m + (t - t')⁻¹ * + Real.rpow (3 : ℝ) (-(t - t') * (Int.toNat (m - k) : ℝ)) * + Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) + +/-- The affine-gradient constant tail in the gradient weak-norm estimate. -/ +noncomputable def gradientConstantTailAtScale {d : ℕ} + (m k : ℤ) (s : ℝ) (p0 : Vec d) : ℝ := + s⁻¹ * Real.rpow (3 : ℝ) (-s * (Int.toNat (m - k) : ℝ)) * ‖p0‖ + +/-- The affine-flux constant tail in the flux weak-norm estimate. -/ +noncomputable def fluxConstantTailAtScale {d : ℕ} + (m k : ℤ) (t : ℝ) (q0 : Vec d) : ℝ := + t⁻¹ * Real.rpow (3 : ℝ) (-t * (Int.toNat (m - k) : ℝ)) * ‖q0‖ + +/-- Manuscript right-hand side for the gradient estimate in +`l.weak.norms.maximizer.homogenization.scale`. -/ +noncomputable def gradientRHSAtScale {d : ℕ} [NeZero d] + (C : ℝ) (m k : ℤ) (s s' : ℝ) + (p q p0 : Vec d) (a : RegCoeffField d) : ℝ := + gradientAverageTermAtScale m k s p q p0 a + + C * gradientMismatchTermAtScale m k s s' p q a + + C * gradientLowScaleTailAtScale m k s s' p q a + + C * gradientConstantTailAtScale m k s p0 + +/-- Manuscript right-hand side for the flux estimate in +`l.weak.norms.maximizer.homogenization.scale`. -/ +noncomputable def fluxRHSAtScale {d : ℕ} [NeZero d] + (C : ℝ) (m k : ℤ) (t t' : ℝ) + (p q q0 : Vec d) (a : RegCoeffField d) : ℝ := + fluxAverageTermAtScale m k t p q q0 a + + C * fluxMismatchTermAtScale m k t t' p q a + + C * fluxLowScaleTailAtScale m k t t' p q a + + C * fluxConstantTailAtScale m k t q0 + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/EnergyDefect.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/EnergyDefect.lean new file mode 100644 index 0000000000..4a2ce1ae38 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/EnergyDefect.lean @@ -0,0 +1,988 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Splitting +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.FiveTermSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimates +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo + +/-! # Energy Defect -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Response-defect identifications for the weak-norm maximizer lemma + +This file connects the defect term used in the second Section 5.3 lemma to +the deterministic response partition defect already developed for the first +Section 5.3 lemma. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +/-- For the Ch4 dependent coefficient family, the descendant average of Ch4 +response observables minus the parent response is the raw deterministic +partition defect. -/ +theorem descendantsAverage_restrictionResponseJObservableCubeSet_sub_eq_responseJPartitionDefectOnDependentFamily + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + descendantsAverage Q j (fun R => Ch04.restrictionResponseJObservableCubeSet R p q a) - + Ch04.restrictionResponseJObservableCubeSet Q p q a = + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q := by + unfold JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + JUpperBoundWeakNorms.childResponseJAverageOnFamilyAtDepth + congr 1 + · exact JUpperBoundWeakNorms.descendantsAverage_congr_of_eq_on_descendants Q j + (by + intro R _hR + exact + (JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha R p q).symm) + · exact + (JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha Q p q).symm + +/-- The scale-indexed defect in the weak-norm maximizer RHS is the deterministic +response partition defect for the dependent coefficient family. -/ +theorem responseDefectAverageAtScale_eq_responseJPartitionDefectOnDependentFamily + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m n : ℤ) (p q : Vec d) : + responseDefectAverageAtScale m n p q a = + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (originCube d m) (Int.toNat (m - n)) p q := by + simpa [responseDefectAverageAtScale] using + descendantsAverage_restrictionResponseJObservableCubeSet_sub_eq_responseJPartitionDefectOnDependentFamily + a ha (originCube d m) (Int.toNat (m - n)) p q + +/-- Deterministic nonnegativity of the raw response partition defect. -/ +theorem responseJPartitionDefectOnFamilyAtDepth_nonneg + {d : ℕ} [NeZero d] (F : Ch02.TriadicCoeffFamily d) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + 0 ≤ JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + unfold JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + exact sub_nonneg.mpr + (JUpperBoundWeakNorms.responseJOnCube_le_childResponseJAverageOnFamilyAtDepth + F Q j p q) + +/-- Deterministic nonnegativity of the weak-norm maximizer response-defect +term on the a.e.-elliptic support. -/ +theorem responseDefectAverageAtScale_nonneg_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (m n : ℤ) (p q : Vec d) : + 0 ≤ responseDefectAverageAtScale m n p q a := by + rw [responseDefectAverageAtScale_eq_responseJPartitionDefectOnDependentFamily a ha] + exact responseJPartitionDefectOnFamilyAtDepth_nonneg + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (originCube d m) (Int.toNat (m - n)) p q + +/-- The Ch4 gradient average mismatch is the cube average of the raw +parent-minus-child canonical maximizer gradients. -/ +theorem cubeAverageVec_parentChildCanonicalGradientMismatchOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q x) = + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun := by + intro F + let parentGrad := + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q + let childGrad := + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q + have hparent_mem : + MemLp parentGrad (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + simpa [F, parentGrad] using + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube_memLp_descendant + Q R (F.coeffOn Q) hR p q + have hchild_mem : + MemLp childGrad (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + have hRR : R ∈ descendantsAtDepth R 0 := by + simp [descendantsAtDepth_zero] + simpa [F, childGrad] using + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube_memLp_descendant + R R (F.coeffOn R) hRR p q + have hparent_avg : + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun = + cubeAverageVec R parentGrad := by + simpa [F, parentGrad, JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, + JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube] using! + Ch04.canonicalScalarResponseGradientAverageCubeSet_eq_cubeAverageVec_canonicalMaximizer + a ha hR p q + have hchild_avg : + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun = + cubeAverageVec R childGrad := by + have hRR : R ∈ descendantsAtDepth R 0 := by + simp [descendantsAtDepth_zero] + simpa [F, childGrad, JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, + JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube] using! + Ch04.canonicalScalarResponseGradientAverageCubeSet_eq_cubeAverageVec_canonicalMaximizer + a ha hRR p q + calc + cubeAverageVec R (fun x => parentGrad x - childGrad x) + = cubeAverageVec R parentGrad - cubeAverageVec R childGrad := by + exact cubeAverageVec_sub_memLp R parentGrad childGrad hparent_mem hchild_mem + _ = Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun := by + rw [← hparent_avg, ← hchild_avg] + +/-- The Ch4 flux average mismatch is the cube average of the raw +parent-minus-child canonical maximizer fluxes. -/ +theorem cubeAverageVec_parentChildCanonicalFluxMismatchOnDependentFamily_eq_ch04 + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q x) = + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun := by + intro F + let parentFlux := + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q + let childFlux := + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q + have hparent_mem : + MemLp parentFlux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + simpa [F, parentFlux] using + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube_memLp_descendant + Q R (F.coeffOn Q) hR p q + have hchild_mem : + MemLp childFlux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + have hRR : R ∈ descendantsAtDepth R 0 := by + simp [descendantsAtDepth_zero] + simpa [F, childFlux] using + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube_memLp_descendant + R R (F.coeffOn R) hRR p q + have hparent_avg : + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun = + cubeAverageVec R parentFlux := by + simpa [F, parentFlux, JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube, + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, + JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube] using! + Ch04.canonicalScalarResponseFluxAverageCubeSet_eq_cubeAverageVec_canonicalMaximizerFlux + a ha hR p q + have hchild_avg : + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun = + cubeAverageVec R childFlux := by + have hRR : R ∈ descendantsAtDepth R 0 := by + simp [descendantsAtDepth_zero] + simpa [F, childFlux, JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube, + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, + JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube] using! + Ch04.canonicalScalarResponseFluxAverageCubeSet_eq_cubeAverageVec_canonicalMaximizerFlux + a ha hRR p q + calc + cubeAverageVec R (fun x => parentFlux x - childFlux x) + = cubeAverageVec R parentFlux - cubeAverageVec R childFlux := by + exact cubeAverageVec_sub_memLp R parentFlux childFlux hparent_mem hchild_mem + _ = Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun := by + rw [← hparent_avg, ← hchild_avg] + +/-- The parent-child canonical difference as an honest Chapter 2 solution on +the child cube. This is the deterministic object whose variation energy is +the additivity defect. -/ +noncomputable def parentChildCanonicalDifferenceSolutionOnDependentFamily + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + Ch02.Solution (Ch02.cubeDomain R) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn R) := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let parent := + JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q + let child := + JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube R (F.coeffOn R) p q + have hparent_int : + ∀ φ : H10Function (openCubeSet R), + IntegrableOn + (fun x => + vecDot + (matVecMul ((F.coeffOn R).toCoeffField x) (parent.toH1.grad x)) + (φ.toH1Function.grad x)) + (openCubeSet R) volume := by + intro φ + simpa [parent, Ch02.cubeDomain_coe] using! + integrableOn_vecDot_of_memVectorL2 + (Ch02.Solution.flux_memVectorL2 parent) + φ.toH1Function.grad_memVectorL2 + have hchild_int : + ∀ φ : H10Function (openCubeSet R), + IntegrableOn + (fun x => + vecDot + (matVecMul ((F.coeffOn R).toCoeffField x) (child.toH1.grad x)) + (φ.toH1Function.grad x)) + (openCubeSet R) volume := by + intro φ + simpa [child, Ch02.cubeDomain_coe] using + integrableOn_vecDot_of_memVectorL2 + (Ch02.Solution.flux_memVectorL2 child) + φ.toH1Function.grad_memVectorL2 + exact AHarmonicFunction.addSMulOfIntegrable parent child hparent_int hchild_int (-1) + +/-- The gradient of the parent-child difference solution is the raw +parent-minus-child canonical maximizer gradient. -/ +theorem parentChildCanonicalDifferenceSolutionOnDependentFamily_grad + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q).toH1.grad = + fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn R) + p q x := by + have hgrad : + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q).toH1.grad = + (JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q).toH1.grad + + (-1 : ℝ) • + (JUpperBoundWeakNorms.canonicalMaximizerSolutionOnCube R + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn R) + p q).toH1.grad := + rfl + funext x i + rw [hgrad] + simp only [JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube_grad, + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, + Pi.add_apply, Pi.smul_apply, Pi.neg_apply, smul_eq_mul, sub_eq_add_neg] + ring + +/-- The averaged gradient of the parent-child difference solution is the raw +parent-minus-child gradient cube average. -/ +theorem averageGradient_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq_cubeAverageVec + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.averageGradient (Ch02.cubeDomain R) (F.coeffOn R) + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q) = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q x) := by + intro F + ext i + rw [Ch02.averageGradient, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + simp [cubeAverageVec, F, + parentChildCanonicalDifferenceSolutionOnDependentFamily_grad] + +/-- The averaged flux of the parent-child difference solution is the raw +parent-minus-child flux cube average. -/ +theorem averageFlux_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq_cubeAverageVec + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.averageFlux (Ch02.cubeDomain R) (F.coeffOn R) + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q) = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q x) := by + intro F + ext i + rw [Ch02.averageFlux, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + apply cubeAverage_eq_of_eq_on_cubeSet + intro x _hx + simp [parentChildCanonicalDifferenceSolutionOnDependentFamily_grad, + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube, F, sub_eq_add_neg, + matVecMul_add, matVecMul_neg] + +/-- The variation energy of the parent-child difference solution is twice the +local additivity half-energy. -/ +theorem variationEnergyValue_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q) = + 2 * cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + intro F + rw [Ch02.variationEnergyValue, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + have hpoint : + Ch02.variationEnergyIntegrand (Ch02.cubeDomain R) (F.coeffOn R) + (parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q) = + fun x => + 2 * + JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q x := by + funext x + simp [Ch02.variationEnergyIntegrand, + parentChildCanonicalDifferenceSolutionOnDependentFamily_grad, + JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube, F] + rw [hpoint, cubeAverage_const_mul] + +/-- One-child averaged parent-child gradient mismatch is controlled by the +local `σ_*^{-1}` norm and the additivity defect energy. -/ +theorem vecNormSq_cubeAverageVec_parentChildCanonicalGradientMismatchOnDependentFamily_le + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + vecNormSq + (cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q x)) ≤ + 2 * Ch02.coarseSigmaStarInvMatrixNorm R F * + cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + intro F + let w := + parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q + have hraw := + Ch02.vecNormSq_averageGradient_le_matrixNorm_sigmaStarInvCoarse_mul_variationEnergyValue + (Ch02.cubeDomain R) (F.coeffOn R) w + have havg : + Ch02.averageGradient (Ch02.cubeDomain R) (F.coeffOn R) w = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q x) := by + simpa [F, w] using + averageGradient_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq_cubeAverageVec + a ha Q hR p q + have henergy : + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) w = + 2 * cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + simpa [F, w] using + variationEnergyValue_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq + a ha Q hR p q + simpa [havg, henergy, Ch02.coarseSigmaStarInvMatrixNorm, mul_assoc, mul_left_comm, + mul_comm] using hraw + +/-- One-child averaged parent-child flux mismatch is controlled by the local +`b` norm and the additivity defect energy. -/ +theorem vecNormSq_cubeAverageVec_parentChildCanonicalFluxMismatchOnDependentFamily_le + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + vecNormSq + (cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q x)) ≤ + 2 * Ch02.coarseBMatrixNorm R F * + cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + intro F + let w := + parentChildCanonicalDifferenceSolutionOnDependentFamily a ha Q hR p q + have hraw := + Ch02.vecNormSq_averageFlux_le_matrixNorm_bCoarse_mul_variationEnergyValue + (Ch02.cubeDomain R) (F.coeffOn R) w + have havg : + Ch02.averageFlux (Ch02.cubeDomain R) (F.coeffOn R) w = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q x) := by + simpa [F, w] using + averageFlux_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq_cubeAverageVec + a ha Q hR p q + have henergy : + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) w = + 2 * cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + simpa [F, w] using + variationEnergyValue_parentChildCanonicalDifferenceSolutionOnDependentFamily_eq + a ha Q hR p q + simpa [havg, henergy, Ch02.coarseBMatrixNorm, mul_assoc, mul_left_comm, + mul_comm] using hraw + +private theorem cubeAverage_nonneg_of_ae_nonneg {d : ℕ} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : ∀ᵐ x ∂volume.restrict (cubeSet Q), 0 ≤ f x) : + 0 ≤ cubeAverage Q f := by + unfold cubeAverage + refine mul_nonneg (inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q))) ?_ + exact MeasureTheory.integral_nonneg_of_ae hf + +private theorem cubeAverage_additivityDiffHalfEnergyDensityOnDependentFamily_nonneg + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (_hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + 0 ≤ cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) := by + intro F + have hEllOpen : + IsAEEllipticFieldOn (F.coeffOn R).lam (F.coeffOn R).Lam + (openCubeSet R) (F.coeffOn R).toCoeffField := by + simpa [F, Ch02.cubeDomain_coe] using + JUpperBoundWeakNorms.ch02_coeffOn_isAEEllipticFieldOn (F.coeffOn R) + have hEllCube : + IsAEEllipticFieldOn (F.coeffOn R).lam (F.coeffOn R).Lam + (cubeSet R) (F.coeffOn R).toCoeffField := + hEllOpen.cubeSet_of_openCubeSet + exact cubeAverage_nonneg_of_ae_nonneg <| + hEllCube.ae_isEllipticMatrix.mono fun x hx => + JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube_nonneg_of_isEllipticMatrix + F Q R p q x hx + +/-- At one depth, the Ch4 gradient parent-child mismatch average is controlled +by the max descendant `σ_*^{-1}` norm and the response partition defect. -/ +theorem descendantsAverage_ch04GradientMismatch_le_maxSigmaStarInv_mul_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) ≤ + 2 * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + intro F + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let E : TriadicCube d → ℝ := fun R => + cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun) ≤ + 2 * M * E R := by + intro R hR + have hEq : + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube R (F.coeffOn R) p q x) := by + simpa [F] using + (cubeAverageVec_parentChildCanonicalGradientMismatchOnDependentFamily_eq_ch04 + a ha hR p q).symm + have hraw := + vecNormSq_cubeAverageVec_parentChildCanonicalGradientMismatchOnDependentFamily_le + a ha Q hR p q + have hlocal : + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun) ≤ + 2 * Ch02.coarseSigmaStarInvMatrixNorm R F * E R := by + simpa [F, E, hEq] using hraw + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hcoarse : + Ch02.coarseSigmaStarInvMatrixNorm R F ≤ M := by + simpa [M] using + Ch02.coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + F hRscale + have hE_nonneg : 0 ≤ E R := by + simpa [F, E] using + cubeAverage_additivityDiffHalfEnergyDensityOnDependentFamily_nonneg + a ha Q hR p q + have hreplace : + 2 * Ch02.coarseSigmaStarInvMatrixNorm R F * E R ≤ 2 * M * E R := by + have hmul : + Ch02.coarseSigmaStarInvMatrixNorm R F * E R ≤ M * E R := + mul_le_mul_of_nonneg_right hcoarse hE_nonneg + nlinarith + exact hlocal.trans hreplace + have hdesc := descendantsAverage_le_descendantsAverage Q j hpoint + calc + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + ≤ descendantsAverage Q j (fun R => 2 * M * E R) := hdesc + _ = 2 * M * descendantsAverage Q j E := by + rw [descendantsAverage_mul_left] + _ = + 2 * M * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + rw [JUpperBoundWeakNorms.descendantsAverage_additivityDiffHalfEnergyOnDependentFamily_eq_responseJPartitionDefectOnFamilyAtDepth + a ha Q j p q] + +/-- At one depth, the Ch4 flux parent-child mismatch average is controlled by +the max descendant `b` norm and the response partition defect. -/ +theorem descendantsAverage_ch04FluxMismatch_le_maxB_mul_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) ≤ + 2 * Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + intro F + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let E : TriadicCube d → ℝ := fun R => + cubeAverage R + (JUpperBoundWeakNorms.additivityDiffHalfEnergyDensityOnFamilyOnCube F Q R p q) + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun) ≤ + 2 * M * E R := by + intro R hR + have hEq : + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun = + cubeAverageVec R + (fun x => + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q x - + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube R (F.coeffOn R) p q x) := by + simpa [F] using + (cubeAverageVec_parentChildCanonicalFluxMismatchOnDependentFamily_eq_ch04 + a ha hR p q).symm + have hraw := + vecNormSq_cubeAverageVec_parentChildCanonicalFluxMismatchOnDependentFamily_le + a ha Q hR p q + have hlocal : + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun) ≤ + 2 * Ch02.coarseBMatrixNorm R F * E R := by + simpa [F, E, hEq] using hraw + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hcoarse : + Ch02.coarseBMatrixNorm R F ≤ M := by + simpa [M] using + Ch02.coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale + F hRscale + have hE_nonneg : 0 ≤ E R := by + simpa [F, E] using + cubeAverage_additivityDiffHalfEnergyDensityOnDependentFamily_nonneg + a ha Q hR p q + have hreplace : + 2 * Ch02.coarseBMatrixNorm R F * E R ≤ 2 * M * E R := by + have hmul : Ch02.coarseBMatrixNorm R F * E R ≤ M * E R := + mul_le_mul_of_nonneg_right hcoarse hE_nonneg + nlinarith + exact hlocal.trans hreplace + have hdesc := descendantsAverage_le_descendantsAverage Q j hpoint + calc + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + ≤ descendantsAverage Q j (fun R => 2 * M * E R) := hdesc + _ = 2 * M * descendantsAverage Q j E := by + rw [descendantsAverage_mul_left] + _ = + 2 * M * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + rw [JUpperBoundWeakNorms.descendantsAverage_additivityDiffHalfEnergyOnDependentFamily_eq_responseJPartitionDefectOnFamilyAtDepth + a ha Q j p q] + +/-- Square-root form of the depth-`j` gradient mismatch estimate. -/ +theorem sqrt_descendantsAverage_ch04GradientMismatch_le_two_mul_sqrt_maxSigmaStarInv_mul_sqrt_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Real.sqrt + (descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun))) ≤ + 2 * + Real.sqrt (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q) := by + intro F + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q + let A := + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + have hmain : A ≤ 2 * M * D := by + simpa [A, M, D, F] using + descendantsAverage_ch04GradientMismatch_le_maxSigmaStarInv_mul_responseDefect + a ha Q j p q + have hM_nonneg : 0 ≤ M := by + have hj : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + simpa [M] using + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hj F + have hD_nonneg : 0 ≤ D := by + simpa [D, F] using + responseJPartitionDefectOnFamilyAtDepth_nonneg F Q j p q + have hfour : A ≤ 4 * (M * D) := by + have hMD : 0 ≤ M * D := mul_nonneg hM_nonneg hD_nonneg + nlinarith + calc + Real.sqrt A ≤ 2 * Real.sqrt (M * D) := + JUpperBoundWeakNorms.sqrt_le_two_mul_sqrt_of_le_four_mul hfour + _ = 2 * Real.sqrt M * Real.sqrt D := by + rw [Real.sqrt_mul hM_nonneg] + ring + +/-- Square-root form of the depth-`j` flux mismatch estimate. -/ +theorem sqrt_descendantsAverage_ch04FluxMismatch_le_two_mul_sqrt_maxB_mul_sqrt_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Real.sqrt + (descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun))) ≤ + 2 * + Real.sqrt (Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q) := by + intro F + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q + let A := + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + have hmain : A ≤ 2 * M * D := by + simpa [A, M, D, F] using + descendantsAverage_ch04FluxMismatch_le_maxB_mul_responseDefect + a ha Q j p q + have hM_nonneg : 0 ≤ M := by + have hj : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + simpa [M] using + Ch02.maxDescendantBMatrixNormAtScale_nonneg Q hj F + have hD_nonneg : 0 ≤ D := by + simpa [D, F] using + responseJPartitionDefectOnFamilyAtDepth_nonneg F Q j p q + have hfour : A ≤ 4 * (M * D) := by + have hMD : 0 ≤ M * D := mul_nonneg hM_nonneg hD_nonneg + nlinarith + calc + Real.sqrt A ≤ 2 * Real.sqrt (M * D) := + JUpperBoundWeakNorms.sqrt_le_two_mul_sqrt_of_le_four_mul hfour + _ = 2 * Real.sqrt M * Real.sqrt D := by + rw [Real.sqrt_mul hM_nonneg] + ring + +private theorem multiscaleDescendantWeight_sub_nat {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s = + Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) := by + unfold Ch02.multiscaleDescendantWeight + have hsub : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + omega + rw [hsub] + norm_num + +/-- Depth-`j` gradient mismatch localized by the q=1 lower ellipticity +observable on the parent cube. -/ +theorem descendantsAverage_ch04GradientMismatch_le_lambdaSqCoeffField_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) {s' : ℝ} (hs' : 0 < s') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) ≤ + ((2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + intro F + let A := descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q + let lamInv := (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ + let W := Real.rpow (3 : ℝ) (2 * s' * (j : ℝ)) + have hbase : A ≤ 2 * M * D := by + simpa [A, M, D, F] using + descendantsAverage_ch04GradientMismatch_le_maxSigmaStarInv_mul_responseDefect + a ha Q j p q + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hlocM : M ≤ W * lamInv := by + have h1 : + M ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F := by + simpa [M] using + Ch02.maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv + Q F hk hs' (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + have h2 : + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s' * + (Ch02.lambdaSq Q s' (.finite 1) F)⁻¹ := + Ch02.maxDescendant_lambdaSq_inv_le Q F hk hs' + (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + calc + M ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s' * + (Ch02.lambdaSq Q s' (.finite 1) F)⁻¹ := h2 + _ = W * lamInv := by + rw [multiscaleDescendantWeight_sub_nat] + simp [W, lamInv, F, Ch04.lambdaSqCoeffField, ha] + have hD_nonneg : 0 ≤ D := by + simpa [D, F] using responseJPartitionDefectOnFamilyAtDepth_nonneg F Q j p q + have hlamInv_nonneg : 0 ≤ lamInv := by + dsimp [lamInv] + exact inv_nonneg.mpr <| + Ch04.lambdaSqCoeffField_finite_nonneg Q a hs' (by norm_num : (1 : ℝ) ≤ 1) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA1 : A ≤ 2 * (W * lamInv) * D := by + have hmul : M * D ≤ (W * lamInv) * D := + mul_le_mul_of_nonneg_right hlocM hD_nonneg + nlinarith + have hfactor_nonneg : 0 ≤ W * lamInv * D := + mul_nonneg (mul_nonneg hW_nonneg hlamInv_nonneg) hD_nonneg + have hrhs_eq : + ((2 * Real.sqrt lamInv) * Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 * D = + 4 * (W * lamInv) * D := by + have hpow : (Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 = W := by + dsimp [W] + calc + (Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 + = Real.rpow (3 : ℝ) (s' * (j : ℝ) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (s' * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s' * (j : ℝ)) := by + ring_nf + rw [mul_pow, mul_pow, Real.sq_sqrt hlamInv_nonneg, hpow] + ring + rw [hrhs_eq] + nlinarith [hA1, hfactor_nonneg] + +/-- Depth-`j` flux mismatch localized by the q=1 upper ellipticity observable +on the parent cube. -/ +theorem descendantsAverage_ch04FluxMismatch_le_LambdaSqCoeffField_responseDefect + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) {t' : ℝ} (ht' : 0 < t') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) ≤ + ((2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 * + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q := by + intro F + let A := descendantsAverage Q j + (fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth F Q j p q + let Lam := Ch04.LambdaSqCoeffField Q t' (.finite 1) a + let W := Real.rpow (3 : ℝ) (2 * t' * (j : ℝ)) + have hbase : A ≤ 2 * M * D := by + simpa [A, M, D, F] using + descendantsAverage_ch04FluxMismatch_le_maxB_mul_responseDefect a ha Q j p q + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hlocM : M ≤ W * Lam := by + have h1 : + M ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F := by + simpa [M] using + Ch02.maxDescendant_b_le_maxDescendant_LambdaSq + Q F hk ht' (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + have h2 : + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) t' * + Ch02.LambdaSq Q t' (.finite 1) F := + Ch02.maxDescendant_LambdaSq_le Q F hk ht' + (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + calc + M ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) t' * + Ch02.LambdaSq Q t' (.finite 1) F := h2 + _ = W * Lam := by + rw [multiscaleDescendantWeight_sub_nat] + simp [W, Lam, F, Ch04.LambdaSqCoeffField, ha] + have hD_nonneg : 0 ≤ D := by + simpa [D, F] using responseJPartitionDefectOnFamilyAtDepth_nonneg F Q j p q + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact Ch04.LambdaSqCoeffField_finite_nonneg Q a ht' + (by norm_num : (1 : ℝ) ≤ 1) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA1 : A ≤ 2 * (W * Lam) * D := by + have hmul : M * D ≤ (W * Lam) * D := + mul_le_mul_of_nonneg_right hlocM hD_nonneg + nlinarith + have hfactor_nonneg : 0 ≤ W * Lam * D := + mul_nonneg (mul_nonneg hW_nonneg hLam_nonneg) hD_nonneg + have hrhs_eq : + ((2 * Real.sqrt Lam) * Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 * D = + 4 * (W * Lam) * D := by + have hpow : (Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 = W := by + dsimp [W] + calc + (Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 + = Real.rpow (3 : ℝ) (t' * (j : ℝ) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (t' * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * t' * (j : ℝ)) := by + ring_nf + rw [mul_pow, mul_pow, Real.sq_sqrt hLam_nonneg, hpow] + ring + rw [hrhs_eq] + nlinarith [hA1, hfactor_nonneg] + +/-- Finite high-depth gradient mismatch sum localized by the q=1 lower +ellipticity observable and the response partition defect. -/ +theorem gradientHighMismatchSum_le_lambdaSqCoeffField_responseDefectSum + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N : ℕ) (high : ℕ → Prop) [DecidablePred high] + {s s' : ℝ} (hs' : 0 < s') (p q : Vec d) : + (∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun))) ≤ + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) := by + refine + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + Q s s' (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) + N high + (fun _j R => + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun) + (fun j => + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) Q j p q) + ?_ ?_ + · exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + · intro j _hj + simpa using + descendantsAverage_ch04GradientMismatch_le_lambdaSqCoeffField_responseDefect + a ha Q j hs' p q + +/-- Finite high-depth flux mismatch sum localized by the q=1 upper ellipticity +observable and the response partition defect. -/ +theorem fluxHighMismatchSum_le_LambdaSqCoeffField_responseDefectSum + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N : ℕ) (high : ℕ → Prop) [DecidablePred high] + {t t' : ℝ} (ht' : 0 < t') (p q : Vec d) : + (∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun))) ≤ + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * + Real.sqrt + (JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + Q j p q) := by + refine + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + Q t t' (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) + N high + (fun _j R => + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun) + (fun j => + JUpperBoundWeakNorms.responseJPartitionDefectOnFamilyAtDepth + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) Q j p q) + ?_ ?_ + · exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + · intro j _hj + simpa using + descendantsAverage_ch04FluxMismatch_le_LambdaSqCoeffField_responseDefect + a ha Q j ht' p q + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/LowScales.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/LowScales.lean new file mode 100644 index 0000000000..f606da6a84 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/LowScales.lean @@ -0,0 +1,590 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.EnergyDefect + +/-! # Low Scales -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Low-scale tails for the weak-norm maximizer lemma + +This file controls the low-depth part of the parent scalar-response maximizer +field by the parent response and the q=1 multiscale ellipticity observables. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +private theorem cubeAverage_nonneg_of_ae_nonneg {d : ℕ} + {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : ∀ᵐ x ∂volume.restrict (cubeSet Q), 0 ≤ f x) : + 0 ≤ cubeAverage Q f := by + unfold cubeAverage + refine mul_nonneg (inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q))) ?_ + exact MeasureTheory.integral_nonneg_of_ae hf + +private theorem multiscaleDescendantWeight_sub_nat {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s = + Real.rpow (3 : ℝ) (2 * s * (j : ℝ)) := by + unfold Ch02.multiscaleDescendantWeight + have hsub : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + omega + rw [hsub] + norm_num + +private theorem averageGradient_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq_cubeAverageVec + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.averageGradient (Ch02.cubeDomain R) (F.coeffOn R) + (JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q) = + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q) := by + intro F + ext i + rw [Ch02.averageGradient, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + simp [cubeAverageVec, F, + JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube_grad] + +private theorem averageFlux_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq_cubeAverageVec + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.averageFlux (Ch02.cubeDomain R) (F.coeffOn R) + (JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q) = + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q) := by + intro F + ext i + rw [Ch02.averageFlux, Ch02.averageVec, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + apply cubeAverage_eq_of_eq_on_cubeSet + intro x _hx + simp [JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube_grad, + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube, F] + +private theorem variationEnergyValue_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) {R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) + (JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q) = + 2 * cubeAverage R (JUpperBoundWeakNorms.topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) := by + intro F + rw [Ch02.variationEnergyValue, + JUpperBoundWeakNorms.ch02_average_cubeDomain_eq_cubeAverage] + have hpoint : + Ch02.variationEnergyIntegrand (Ch02.cubeDomain R) (F.coeffOn R) + (JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q) = + fun x => 2 * JUpperBoundWeakNorms.topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q x := by + funext x + simp [Ch02.variationEnergyIntegrand, + JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube_grad, + JUpperBoundWeakNorms.topHalfEnergyDensityOnCube, + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube, F] + rw [hpoint, cubeAverage_const_mul] + +private theorem descendantsAverage_parentGradient_le_maxSigmaStarInv_mul_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q))) ≤ + 2 * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F * + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + intro F + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let E : TriadicCube d → ℝ := fun R => + cubeAverage R (JUpperBoundWeakNorms.topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + have hpoint : ∀ R ∈ descendantsAtDepth Q j, + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q)) ≤ + 2 * M * E R := by + intro R hR + let w := + JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q + have hraw := + Ch02.vecNormSq_averageGradient_le_matrixNorm_sigmaStarInvCoarse_mul_variationEnergyValue + (Ch02.cubeDomain R) (F.coeffOn R) w + have havg : + Ch02.averageGradient (Ch02.cubeDomain R) (F.coeffOn R) w = + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q) := by + simpa [F, w] using + averageGradient_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq_cubeAverageVec + a ha Q hR p q + have henergy : + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) w = + 2 * E R := by + simpa [F, E, w] using + variationEnergyValue_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq + a ha Q hR p q + have hlocal : + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q)) ≤ + 2 * Ch02.coarseSigmaStarInvMatrixNorm R F * E R := by + simpa [havg, henergy, Ch02.coarseSigmaStarInvMatrixNorm, mul_assoc, + mul_comm, mul_left_comm] using hraw + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hcoarse : Ch02.coarseSigmaStarInvMatrixNorm R F ≤ M := by + simpa [M] using + Ch02.coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + F hRscale + have hE_nonneg : 0 ≤ E R := by + dsimp [E] + have hsubset : cubeSet R ⊆ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hR + have hle : volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set volume hsubset + exact cubeAverage_nonneg_of_ae_nonneg <| + (JUpperBoundWeakNorms.topHalfEnergyDensityOnCube_ae_nonneg_cubeSet + Q (F.coeffOn Q) p q).filter_mono (MeasureTheory.ae_mono hle) + have hreplace : + 2 * Ch02.coarseSigmaStarInvMatrixNorm R F * E R ≤ 2 * M * E R := by + have hmul : Ch02.coarseSigmaStarInvMatrixNorm R F * E R ≤ M * E R := + mul_le_mul_of_nonneg_right hcoarse hE_nonneg + nlinarith + exact hlocal.trans hreplace + have hdesc := descendantsAverage_le_descendantsAverage Q j hpoint + calc + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q))) + ≤ descendantsAverage Q j (fun R => 2 * M * E R) := hdesc + _ = 2 * M * descendantsAverage Q j E := by + rw [descendantsAverage_mul_left] + _ = 2 * M * Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + rw [JUpperBoundWeakNorms.descendantsAverage_cubeAverage_topHalfEnergyOnCube_eq_responseJOnCube] + +private theorem descendantsAverage_parentFlux_le_maxB_mul_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q))) ≤ + 2 * Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F * + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + intro F + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let E : TriadicCube d → ℝ := fun R => + cubeAverage R (JUpperBoundWeakNorms.topHalfEnergyDensityOnCube Q (F.coeffOn Q) p q) + have hpoint : ∀ R ∈ descendantsAtDepth Q j, + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q)) ≤ + 2 * M * E R := by + intro R hR + let w := + JUpperBoundWeakNorms.parentResponseSolutionOnDependentFamilyRestrictedToCube + a ha Q hR p q + have hraw := + Ch02.vecNormSq_averageFlux_le_matrixNorm_bCoarse_mul_variationEnergyValue + (Ch02.cubeDomain R) (F.coeffOn R) w + have havg : + Ch02.averageFlux (Ch02.cubeDomain R) (F.coeffOn R) w = + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q) := by + simpa [F, w] using + averageFlux_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq_cubeAverageVec + a ha Q hR p q + have henergy : + Ch02.variationEnergyValue (Ch02.cubeDomain R) (F.coeffOn R) w = + 2 * E R := by + simpa [F, E, w] using + variationEnergyValue_parentResponseSolutionOnDependentFamilyRestrictedToCube_eq + a ha Q hR p q + have hlocal : + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q)) ≤ + 2 * Ch02.coarseBMatrixNorm R F * E R := by + simpa [havg, henergy, Ch02.coarseBMatrixNorm, mul_assoc, mul_comm, + mul_left_comm] using hraw + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hcoarse : Ch02.coarseBMatrixNorm R F ≤ M := by + simpa [M] using + Ch02.coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale + F hRscale + have hE_nonneg : 0 ≤ E R := by + dsimp [E] + have hsubset : cubeSet R ⊆ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hR + have hle : volumeMeasureOn (cubeSet R) ≤ volumeMeasureOn (cubeSet Q) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono_set volume hsubset + exact cubeAverage_nonneg_of_ae_nonneg <| + (JUpperBoundWeakNorms.topHalfEnergyDensityOnCube_ae_nonneg_cubeSet + Q (F.coeffOn Q) p q).filter_mono (MeasureTheory.ae_mono hle) + have hreplace : 2 * Ch02.coarseBMatrixNorm R F * E R ≤ 2 * M * E R := by + have hmul : Ch02.coarseBMatrixNorm R F * E R ≤ M * E R := + mul_le_mul_of_nonneg_right hcoarse hE_nonneg + nlinarith + exact hlocal.trans hreplace + have hdesc := descendantsAverage_le_descendantsAverage Q j hpoint + calc + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q))) + ≤ descendantsAverage Q j (fun R => 2 * M * E R) := hdesc + _ = 2 * M * descendantsAverage Q j E := by + rw [descendantsAverage_mul_left] + _ = 2 * M * Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) p q := by + rw [JUpperBoundWeakNorms.descendantsAverage_cubeAverage_topHalfEnergyOnCube_eq_responseJOnCube] + +theorem descendantsAverage_parentGradient_le_lambdaSqCoeffField_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) {s' : ℝ} (hs' : 0 < s') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q))) ≤ + ((2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 * + Ch04.restrictionResponseJObservableCubeSet Q p q a := by + intro F + let A := descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q))) + let M := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := Ch04.restrictionResponseJObservableCubeSet Q p q a + let lamInv := (Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹ + let W := Real.rpow (3 : ℝ) (2 * s' * (j : ℝ)) + have hbase : A ≤ 2 * M * D := by + have h := + descendantsAverage_parentGradient_le_maxSigmaStarInv_mul_responseJ a ha Q j p q + simpa [A, M, D, F, + JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha Q p q] using h + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hlocM : M ≤ W * lamInv := by + have h1 : + M ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F := by + simpa [M] using + Ch02.maxDescendant_sigmaStarInv_le_maxDescendant_lambdaSq_inv + Q F hk hs' (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + have h2 : + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s' * + (Ch02.lambdaSq Q s' (.finite 1) F)⁻¹ := + Ch02.maxDescendant_lambdaSq_inv_le Q F hk hs' + (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + calc + M ≤ + Ch02.maxDescendantLowerEllipticityInvAtScale Q (Q.scale - (j : ℤ)) + s' (.finite 1) F := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) s' * + (Ch02.lambdaSq Q s' (.finite 1) F)⁻¹ := h2 + _ = W * lamInv := by + rw [multiscaleDescendantWeight_sub_nat] + simp [W, lamInv, F, Ch04.lambdaSqCoeffField, ha] + have hD_nonneg : 0 ≤ D := by + change 0 ≤ Ch04.restrictionResponseJObservableCubeSet Q p q a + rw [← JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha Q p q] + exact Ch02.responseJ_nonneg (Ch02.cubeDomain Q) (F.coeffOn Q) p q + have hlamInv_nonneg : 0 ≤ lamInv := by + dsimp [lamInv] + exact inv_nonneg.mpr <| + Ch04.lambdaSqCoeffField_finite_nonneg Q a hs' (by norm_num : (1 : ℝ) ≤ 1) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA1 : A ≤ 2 * (W * lamInv) * D := by + have hmul : M * D ≤ (W * lamInv) * D := + mul_le_mul_of_nonneg_right hlocM hD_nonneg + nlinarith + have hfactor_nonneg : 0 ≤ W * lamInv * D := + mul_nonneg (mul_nonneg hW_nonneg hlamInv_nonneg) hD_nonneg + have hrhs_eq : + ((2 * Real.sqrt lamInv) * Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 * D = + 4 * (W * lamInv) * D := by + have hpow : (Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 = W := by + dsimp [W] + calc + (Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 + = Real.rpow (3 : ℝ) (s' * (j : ℝ) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (s' * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s' * (j : ℝ)) := by + ring_nf + rw [mul_pow, mul_pow, Real.sq_sqrt hlamInv_nonneg, hpow] + ring + rw [hrhs_eq] + nlinarith [hA1, hfactor_nonneg] + +theorem descendantsAverage_parentFlux_le_LambdaSqCoeffField_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) {t' : ℝ} (ht' : 0 < t') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q))) ≤ + ((2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 * + Ch04.restrictionResponseJObservableCubeSet Q p q a := by + intro F + let A := descendantsAverage Q j + (fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q))) + let M := Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (j : ℤ)) F + let D := Ch04.restrictionResponseJObservableCubeSet Q p q a + let Lam := Ch04.LambdaSqCoeffField Q t' (.finite 1) a + let W := Real.rpow (3 : ℝ) (2 * t' * (j : ℝ)) + have hbase : A ≤ 2 * M * D := by + have h := descendantsAverage_parentFlux_le_maxB_mul_responseJ a ha Q j p q + simpa [A, M, D, F, + JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha Q p q] using h + have hk : Q.scale - (j : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hlocM : M ≤ W * Lam := by + have h1 : + M ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F := by + simpa [M] using + Ch02.maxDescendant_b_le_maxDescendant_LambdaSq + Q F hk ht' (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + have h2 : + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F ≤ + Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) t' * + Ch02.LambdaSq Q t' (.finite 1) F := + Ch02.maxDescendant_LambdaSq_le Q F hk ht' + (by simp [Ch02.MultiscaleExponent.IsAdmissible]) + calc + M ≤ + Ch02.maxDescendantUpperEllipticityAtScale Q (Q.scale - (j : ℤ)) + t' (.finite 1) F := h1 + _ ≤ Ch02.multiscaleDescendantWeight Q (Q.scale - (j : ℤ)) t' * + Ch02.LambdaSq Q t' (.finite 1) F := h2 + _ = W * Lam := by + rw [multiscaleDescendantWeight_sub_nat] + simp [W, Lam, F, Ch04.LambdaSqCoeffField, ha] + have hD_nonneg : 0 ≤ D := by + change 0 ≤ Ch04.restrictionResponseJObservableCubeSet Q p q a + rw [← JUpperBoundWeakNorms.responseJOnDependentFamily_eq_restrictionResponseJObservableCubeSet + a ha Q p q] + exact Ch02.responseJ_nonneg (Ch02.cubeDomain Q) (F.coeffOn Q) p q + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact Ch04.LambdaSqCoeffField_finite_nonneg Q a ht' + (by norm_num : (1 : ℝ) ≤ 1) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA1 : A ≤ 2 * (W * Lam) * D := by + have hmul : M * D ≤ (W * Lam) * D := + mul_le_mul_of_nonneg_right hlocM hD_nonneg + nlinarith + have hfactor_nonneg : 0 ≤ W * Lam * D := + mul_nonneg (mul_nonneg hW_nonneg hLam_nonneg) hD_nonneg + have hrhs_eq : + ((2 * Real.sqrt Lam) * Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 * D = + 4 * (W * Lam) * D := by + have hpow : (Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 = W := by + dsimp [W] + calc + (Real.rpow (3 : ℝ) (t' * (j : ℝ))) ^ 2 + = Real.rpow (3 : ℝ) (t' * (j : ℝ) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (t' * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * t' * (j : ℝ)) := by + ring_nf + rw [mul_pow, mul_pow, Real.sq_sqrt hLam_nonneg, hpow] + ring + rw [hrhs_eq] + nlinarith [hA1, hfactor_nonneg] + +theorem gradientLowScaleDepthSum_le_lambdaSqCoeffField_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N L : ℕ) {s s' : ℝ} + (hs' : 0 < s') (hgap : 0 < s - s') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q) j) ≤ + (2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹)) * + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) := by + intro F + let low : ℕ → Prop := fun j => ¬ j < L + let C := 2 * Real.sqrt ((Ch04.lambdaSqCoeffField Q s' (.finite 1) a)⁻¹) + let J := Ch04.restrictionResponseJObservableCubeSet Q p q a + have hshift : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q)))) ≤ + C * + ∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt J := by + refine + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + Q s s' C N low + (fun _j R => + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q (F.coeffOn Q) p q)) + (fun _j => J) ?_ ?_ + · exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + · intro j _hj + simpa [C, J, F] using + descendantsAverage_parentGradient_le_lambdaSqCoeffField_responseJ a ha Q j hs' p q + have hgeom : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt J) ≤ + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * Real.sqrt J := by + have htail := + sum_range_filter_not_lt_triadicDepthWeight_le_geometric_tail + (s - s') N L hgap + calc + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt J) + = + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ))) * Real.sqrt J := by + rw [Finset.sum_mul] + _ ≤ + (Real.rpow (3 : ℝ) (-(s - s') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(s - s')))⁻¹) * Real.sqrt J := + mul_le_mul_of_nonneg_right htail (Real.sqrt_nonneg J) + have hC_nonneg : 0 ≤ C := mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + have hmain := hshift.trans (mul_le_mul_of_nonneg_left hgeom hC_nonneg) + simpa [cubeBesovNegativeVectorDepthSeminorm, cubeBesovNegativeVectorDepthAverage, + low, C, J, F, mul_assoc] using hmain + +theorem fluxLowScaleDepthSum_le_LambdaSqCoeffField_responseJ + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (N L : ℕ) {t t' : ℝ} + (ht' : 0 < t') (hgap : 0 < t - t') (p q : Vec d) : + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q t + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q) j) ≤ + (2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a)) * + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * + Real.sqrt (Ch04.restrictionResponseJObservableCubeSet Q p q a) := by + intro F + let low : ℕ → Prop := fun j => ¬ j < L + let C := 2 * Real.sqrt (Ch04.LambdaSqCoeffField Q t' (.finite 1) a) + let J := Ch04.restrictionResponseJObservableCubeSet Q p q a + have hshift : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q)))) ≤ + C * + ∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * Real.sqrt J := by + refine + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + Q t t' C N low + (fun _j R => + cubeAverageVec R + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q (F.coeffOn Q) p q)) + (fun _j => J) ?_ ?_ + · exact mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + · intro j _hj + simpa [C, J, F] using + descendantsAverage_parentFlux_le_LambdaSqCoeffField_responseJ a ha Q j ht' p q + have hgeom : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * Real.sqrt J) ≤ + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * Real.sqrt J := by + have htail := + sum_range_filter_not_lt_triadicDepthWeight_le_geometric_tail + (t - t') N L hgap + calc + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ)) * Real.sqrt J) + = + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-(t - t') * (j : ℝ))) * Real.sqrt J := by + rw [Finset.sum_mul] + _ ≤ + (Real.rpow (3 : ℝ) (-(t - t') * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-(t - t')))⁻¹) * Real.sqrt J := + mul_le_mul_of_nonneg_right htail (Real.sqrt_nonneg J) + have hC_nonneg : 0 ≤ C := mul_nonneg (by norm_num) (Real.sqrt_nonneg _) + have hmain := hshift.trans (mul_le_mul_of_nonneg_left hgeom hC_nonneg) + simpa [cubeBesovNegativeVectorDepthSeminorm, cubeBesovNegativeVectorDepthAverage, + low, C, J, F, mul_assoc] using hmain + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/RawIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/RawIdentities.lean new file mode 100644 index 0000000000..566d1eebd5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/RawIdentities.lean @@ -0,0 +1,87 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundWeakNorms.CanonicalFields + +/-! # Raw Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Raw identities for scalar-response weak norms + +These deterministic identities connect the Ch4 scalar-response weak-norm +objects used by the first Section 5.3 lemma to the raw Chapter 2 canonical +maximizer fields used in the second lemma proof. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +theorem canonicalScalarResponseGradientWeakNormCubeSet_eq_raw + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s : ℝ) (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormCubeSet Q s p q p0 a.toFun = + cubeBesovNegativeVectorSeminorm Q s + (JUpperBoundWeakNorms.canonicalMaximizerGradientDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q p0) := by + unfold Ch04.canonicalScalarResponseGradientWeakNormCubeSet + cubeBesovNegativeVectorSeminorm + apply congrArg sSup + ext x + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, + JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha Q s N p q p0⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, + (JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha Q s N p q p0).symm⟩ + +theorem canonicalScalarResponseFluxWeakNormCubeSet_eq_raw + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s : ℝ) (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormCubeSet Q s p q q0 a.toFun = + cubeBesovNegativeVectorSeminorm Q s + (JUpperBoundWeakNorms.canonicalMaximizerFluxDefectOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q q0) := by + unfold Ch04.canonicalScalarResponseFluxWeakNormCubeSet + cubeBesovNegativeVectorSeminorm + apply congrArg sSup + ext x + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, + JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha Q s N p q q0⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, + (JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha Q s N p q q0).symm⟩ + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Splitting.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Splitting.lean new file mode 100644 index 0000000000..1b37ab9b6b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section53/WeakNormsMaximizer/Splitting.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.WeakNormsMaximizer.RawIdentities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Bounds + +/-! # Splitting -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section53 +namespace WeakNormsMaximizer + +/-! +# Splitting for the weak-norm maximizer lemma + +Finite-depth high/low Besov splits for the raw scalar-response maximizer +fields. The high-depth terms are still deterministic analytic terms; later +files bound them by the energy defect and multiscale ellipticity factors. +-/ + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +/-- Finite-depth gradient split for the second Section 5.3 lemma. Depths +`j < L` are split into the child maximizer average and the parent-child +mismatch. Depths `L ≤ j` are left as the raw parent-gradient low-scale term +plus the affine `p0` tail. -/ +theorem canonicalScalarResponseGradientWeakNormPartialCubeSet_le_highLowSplit + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (s : ℝ) (N L : ℕ) (hs : 0 < s) + (p q p0 : Vec d) : + Ch04.canonicalScalarResponseGradientWeakNormPartialCubeSet Q s N p q p0 a.toFun ≤ + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s + (JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q) j) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let grad := JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube Q aQ p q + let gradDefect := + JUpperBoundWeakNorms.canonicalMaximizerGradientDefectOnCube Q aQ p q p0 + have hraw : + cubeBesovNegativeVectorPartialSeminorm Q s N gradDefect ≤ + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s grad j) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq (-p0))) := by + refine + cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_below_cutoff_add_low_self_add_geometric_const + Q s N L gradDefect grad (-p0) + (fun _j R => + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun - p0) + (fun _j R => + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseGradientAverageCubeSet R R p q a.toFun) + (fun _j _R => (0 : Vec d)) (fun _j _R => (0 : Vec d)) + hs ?_ ?_ + · intro j hj hjL R hR + have hparent : + cubeAverageVec R gradDefect = + Ch04.canonicalScalarResponseGradientAverageCubeSet Q R p q a.toFun - p0 := by + simpa [F, aQ, gradDefect] using + JUpperBoundWeakNorms.cubeAverageVec_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha hR p q p0 + rw [hparent] + ext i + simp [sub_eq_add_neg] + ring + · intro j hj hjL R hR + have hgrad : + MemLp grad (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + simpa [F, aQ, grad] using + JUpperBoundWeakNorms.canonicalMaximizerGradientOnCube_memLp_descendant + Q R aQ hR p q + simpa [gradDefect, grad, add_comm, sub_eq_add_neg] using! + cubeAverageVec_sub_const R grad p0 hgrad + rw [← JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerGradientDefectOnDependentFamily_eq_ch04 + a ha Q s N p q p0] + exact hraw + +/-- Finite-depth flux split for the second Section 5.3 lemma. This is the +flux analogue of +`canonicalScalarResponseGradientWeakNormPartialCubeSet_le_highLowSplit`. -/ +theorem canonicalScalarResponseFluxWeakNormPartialCubeSet_le_highLowSplit + {d : ℕ} [NeZero d] (a : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (t : ℝ) (N L : ℕ) (ht : 0 < t) + (p q q0 : Vec d) : + Ch04.canonicalScalarResponseFluxWeakNormPartialCubeSet Q t N p q q0 a.toFun ≤ + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + 2 * + (Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q t + (JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + p q) j) + + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + let F := Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let aQ : Ch02.CoeffOn (Ch02.cubeDomain Q) := F.coeffOn Q + let flux := JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube Q aQ p q + let fluxDefect := + JUpperBoundWeakNorms.canonicalMaximizerFluxDefectOnCube Q aQ p q q0 + have hraw : + cubeBesovNegativeVectorPartialSeminorm Q t N fluxDefect ≤ + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + 2 * + (Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + vecNormSq + (Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)) + + Real.rpow (3 : ℝ) (-t * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun _R => vecNormSq (0 : Vec d)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q t flux j) + + (Real.rpow (3 : ℝ) (-t * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + Real.sqrt (vecNormSq (-q0))) := by + refine + cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_below_cutoff_add_low_self_add_geometric_const + Q t N L fluxDefect flux (-q0) + (fun _j R => + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun - q0) + (fun _j R => + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - + Ch04.canonicalScalarResponseFluxAverageCubeSet R R p q a.toFun) + (fun _j _R => (0 : Vec d)) (fun _j _R => (0 : Vec d)) + ht ?_ ?_ + · intro j hj hjL R hR + have hparent : + cubeAverageVec R fluxDefect = + Ch04.canonicalScalarResponseFluxAverageCubeSet Q R p q a.toFun - q0 := by + simpa [F, aQ, fluxDefect] using + JUpperBoundWeakNorms.cubeAverageVec_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha hR p q q0 + rw [hparent] + ext i + simp [sub_eq_add_neg] + ring + · intro j hj hjL R hR + have hflux : + MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + simpa [F, aQ, flux] using + JUpperBoundWeakNorms.canonicalMaximizerFluxOnCube_memLp_descendant + Q R aQ hR p q + simpa [fluxDefect, flux, add_comm, sub_eq_add_neg] using! + cubeAverageVec_sub_const R flux q0 hflux + rw [← JUpperBoundWeakNorms.cubeBesovNegativeVectorPartialSeminorm_canonicalMaximizerFluxDefectOnDependentFamily_eq_ch04 + a ha Q t N p q q0] + exact hraw + +end + +end WeakNormsMaximizer +end Section53 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54.lean new file mode 100644 index 0000000000..0813679068 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54.lean @@ -0,0 +1,40 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction + +/-! # Section54 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 + +/-! +# Section 5.4: good scales and variance bounds + +This file is the scaffold for the current manuscript's Section 5.4: + +* the pigeonhole lemma; +* good-scale parameter bounds; +* the variance bound at a nearly stationary scale; +* one-step contraction of the annealed flow. + +This is the first current-manuscript section where the one-step contraction +proposition belongs. +-/ + +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Common.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Common.lean new file mode 100644 index 0000000000..2ffea5dc2c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Common.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52 + +/-! # Common -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 + +/-! +# Section 5.4 common imports + +This file is the shared import surface for the current-manuscript Section 5.4 +formalization. It deliberately re-exports only the established Section 5.2 +surface; the first three Section 5.4 results must remain independent of +Section 5.3. +-/ + +noncomputable section + +end + +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale.lean new file mode 100644 index 0000000000..0dd6cc69bf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.Assembly + +/-! # Good Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 + +/-! +# Good-scale parameter bounds + +This module is the public entry point for the second result of Section 5.4. +-/ + +noncomputable section + +end + +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/Assembly.lean new file mode 100644 index 0000000000..4a983c6d54 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/Assembly.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace GoodScale + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Assembly of the good-scale parameter bounds + +This file assembles the scalar monotonicity, `(P4)`-supplied integrability, and +special-vector algebra into the manuscript-facing good-scale lemma. +-/ + +private theorem abs_sqrt_theta_sub_one_le_sqrt_theta_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| ≤ + Real.sqrt (thetaAtScale hP hStruct 0) := by + have htheta_m0 : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct 0 := by + simpa using + thetaAtScale_mono_of_P4 hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have htheta_one : 1 ≤ thetaAtScale hP hStruct (m : ℤ) := + one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hsqrt_one : + 1 ≤ Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) := by + rw [← Real.sqrt_one] + exact Real.sqrt_le_sqrt htheta_one + have hsqrt_m0 : + Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) ≤ + Real.sqrt (thetaAtScale hP hStruct 0) := + Real.sqrt_le_sqrt htheta_m0 + have habs : + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| = + Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1 := + abs_of_nonneg (sub_nonneg.mpr hsqrt_one) + calc + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| = + Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1 := habs + _ ≤ Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) := by linarith + _ ≤ Real.sqrt (thetaAtScale hP hStruct 0) := hsqrt_m0 + +private theorem sigmaHat_inv_mul_barSigma_zero_le_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) : + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let theta_m := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_pos : 0 < sigma := by + simpa [sigma] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma : sigma = Real.sqrt (b * c) := by rfl + have htheta_m : theta_m = b * c⁻¹ := by rfl + have hdiv : + b * sigma⁻¹ = Real.sqrt theta_m := + barSigma_mul_inv_sigma_eq_sqrt_theta hb hc hsigma htheta_m + have htheta_m0 : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct 0 := by + simpa using + thetaAtScale_mono_of_P4 hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have hsqrt_m0 : + Real.sqrt theta_m ≤ Real.sqrt (thetaAtScale hP hStruct 0) := by + simpa [theta_m] using Real.sqrt_le_sqrt htheta_m0 + have hfactor_nonneg : 0 ≤ 1 + delta := by linarith + have hscale : + sigma⁻¹ * hP.barSigmaAtScale hStruct 0 ≤ + sigma⁻¹ * ((1 + delta) * b) := by + exact mul_le_mul_of_nonneg_left (by simpa [b] using hgood_upper) + (inv_pos.mpr hsigma_pos).le + calc + sigma⁻¹ * hP.barSigmaAtScale hStruct 0 ≤ + sigma⁻¹ * ((1 + delta) * b) := hscale + _ = (1 + delta) * (b * sigma⁻¹) := by ring + _ = (1 + delta) * Real.sqrt theta_m := by rw [hdiv] + _ ≤ (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := + mul_le_mul_of_nonneg_left hsqrt_m0 hfactor_nonneg + +private theorem sigmaHat_mul_barSigmaStar_inv_zero_le_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (m : ℕ) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let theta_m := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_pos : 0 < sigma := by + simpa [sigma] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma : sigma = Real.sqrt (b * c) := by rfl + have htheta_m : theta_m = b * c⁻¹ := by rfl + have hdiv : + sigma * c⁻¹ = Real.sqrt theta_m := + sigma_mul_inv_star_eq_sqrt_theta hb hc hsigma htheta_m + have htheta_m0 : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct 0 := by + simpa using + thetaAtScale_mono_of_P4 hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have hsqrt_m0 : + Real.sqrt theta_m ≤ Real.sqrt (thetaAtScale hP hStruct 0) := by + simpa [theta_m] using Real.sqrt_le_sqrt htheta_m0 + have hfactor_nonneg : 0 ≤ 1 + delta := by linarith + have hscale : + sigma * (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + sigma * ((1 + delta) * c⁻¹) := by + exact mul_le_mul_of_nonneg_left (by simpa [c] using hgood_lower) hsigma_pos.le + calc + sigma * (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + sigma * ((1 + delta) * c⁻¹) := hscale + _ = (1 + delta) * (sigma * c⁻¹) := by ring + _ = (1 + delta) * Real.sqrt theta_m := by rw [hdiv] + _ ≤ (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := + mul_le_mul_of_nonneg_left hsqrt_m0 hfactor_nonneg + +/-- Nearly stationary scalar chains control both rescaled coefficient differences at any +nonnegative comparison scale. This estimate is independent of the chosen special vectors. -/ +private theorem scaled_scalar_differences_le_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (m k : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let sqrtTheta0 := Real.sqrt (thetaAtScale hP hStruct 0) + sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) ≤ delta * sqrtTheta0 ∧ + sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) ≤ delta * sqrtTheta0 := by + intro sigma sqrtTheta0 + have hchain_k0 := Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (Nat.zero_le k) + have hsigma_pos : 0 < sigma := by + simpa [sigma] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_inv_nonneg : 0 ≤ sigma⁻¹ := (inv_pos.mpr hsigma_pos).le + have hsigma_nonneg : 0 ≤ sigma := hsigma_pos.le + have hdelta_nonneg : 0 ≤ delta := hdelta_pos.le + have hbar_k_le_zero : + hP.barSigmaAtScale hStruct (k : ℤ) ≤ + hP.barSigmaAtScale hStruct 0 := by + simpa using hchain_k0.2.2 + have hstarInv_k_le_zero : + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + simpa using hchain_k0.2.1 + have hbar_diff_le : + hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ) ≤ + delta * hP.barSigmaAtScale hStruct (m : ℤ) := by + have hkm : + hP.barSigmaAtScale hStruct (k : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ) := + le_trans hbar_k_le_zero hgood_upper + nlinarith + have hstarInv_diff_le : + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ ≤ + delta * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + have hkm : + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + le_trans hstarInv_k_le_zero hgood_lower + nlinarith + have htheta_m0 : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct 0 := by + simpa using + thetaAtScale_mono_of_P4 hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + let theta_m := thetaAtScale hP hStruct (m : ℤ) + have hsqrt_m0 : + Real.sqrt theta_m ≤ sqrtTheta0 := by + simpa [theta_m, sqrtTheta0] using Real.sqrt_le_sqrt htheta_m0 + let b_m := hP.barSigmaAtScale hStruct (m : ℤ) + let c_m := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hb_m : 0 < b_m := by + simpa [b_m] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc_m : 0 < c_m := by + simpa [c_m] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_eq : sigma = Real.sqrt (b_m * c_m) := by rfl + have htheta_eq : theta_m = b_m * c_m⁻¹ := by rfl + have hscaled_bar_m_eq : + sigma⁻¹ * b_m = Real.sqrt theta_m := by + rw [mul_comm] + exact barSigma_mul_inv_sigma_eq_sqrt_theta hb_m hc_m hsigma_eq htheta_eq + have hscaled_star_m_eq : + sigma * c_m⁻¹ = Real.sqrt theta_m := + sigma_mul_inv_star_eq_sqrt_theta hb_m hc_m hsigma_eq htheta_eq + have hscaled_bar_diff : + sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) ≤ + delta * sqrtTheta0 := by + calc + sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) ≤ + sigma⁻¹ * (delta * hP.barSigmaAtScale hStruct (m : ℤ)) := + mul_le_mul_of_nonneg_left hbar_diff_le hsigma_inv_nonneg + _ = delta * (sigma⁻¹ * b_m) := by ring + _ = delta * Real.sqrt theta_m := by rw [hscaled_bar_m_eq] + _ ≤ delta * sqrtTheta0 := + mul_le_mul_of_nonneg_left hsqrt_m0 hdelta_nonneg + have hscaled_star_diff : + sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) ≤ + delta * sqrtTheta0 := by + calc + sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) ≤ + sigma * (delta * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := + mul_le_mul_of_nonneg_left hstarInv_diff_le hsigma_nonneg + _ = delta * (sigma * c_m⁻¹) := by ring + _ = delta * Real.sqrt theta_m := by rw [hscaled_star_m_eq] + _ ≤ delta * sqrtTheta0 := + mul_le_mul_of_nonneg_left hsqrt_m0 hdelta_nonneg + exact ⟨hscaled_bar_diff, hscaled_star_diff⟩ + +/-- Section 5.4 good-scale parameter bounds. At a scale where both scalar +coefficient chains are nearly stationary, the special vectors have controlled +centering, response, and additivity defect bounds. -/ +theorem goodScaleParameterBounds_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Ch02.vecNorm + (Real.rpow (sigmaHatAtScale hP hStruct (m : ℤ)) (1 / 2 : ℝ) • p0_e) = + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| ∧ + Ch02.vecNorm + (Real.rpow (sigmaHatAtScale hP hStruct (m : ℤ)) (-(1 / 2 : ℝ)) • q0_e) = + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| ∧ + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| ≤ + Real.sqrt (thetaAtScale hP hStruct 0) ∧ + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) ∧ + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) ∧ + (∀ k : ℕ, k ≤ m → + Ch04.annealedResponseJAtScale P (k : ℤ) p_e q_e ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) ∧ + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e ≤ + delta * Real.sqrt (thetaAtScale hP hStruct 0)) := by + classical + dsimp only + have hp_norm := + scaled_specialP_centering_vecNorm_eq_of_P4 hP hStruct hP4 m e he + have hq_norm := + scaled_specialQ_centering_vecNorm_eq_of_P4 hP hStruct hP4 m e he + have hcenter_bound := + abs_sqrt_theta_sub_one_le_sqrt_theta_zero_of_P4 hP hStruct hP4 m + have hcompare_upper := + sigmaHat_inv_mul_barSigma_zero_le_of_good hP hStruct hP4 hdelta_pos m hgood_upper + have hcompare_lower := + sigmaHat_mul_barSigmaStar_inv_zero_le_of_good hP hStruct hP4 hdelta_pos m hgood_lower + refine ⟨hp_norm, hq_norm, hcenter_bound, hcompare_upper, hcompare_lower, ?_⟩ + intro k _hk + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let sqrtTheta0 := Real.sqrt (thetaAtScale hP hStruct 0) + have heSq : vecNormSq e = 1 := vecNormSq_eq_one_of_vecNorm_eq_one he + have hchain_k0 := Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (Nat.zero_le k) + have hsigma_pos : 0 < sigma := by + simpa [sigma] using sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_inv_nonneg : 0 ≤ sigma⁻¹ := (inv_pos.mpr hsigma_pos).le + have hsigma_nonneg : 0 ≤ sigma := hsigma_pos.le + have hfactor_nonneg : 0 ≤ 1 + delta := by linarith + have hsqrtTheta0_nonneg : 0 ≤ sqrtTheta0 := by + dsimp [sqrtTheta0] + exact Real.sqrt_nonneg _ + have hB_nonneg : 0 ≤ (1 + delta) * sqrtTheta0 := + mul_nonneg hfactor_nonneg hsqrtTheta0_nonneg + have hbar_k_le_zero : + hP.barSigmaAtScale hStruct (k : ℤ) ≤ + hP.barSigmaAtScale hStruct 0 := by + simpa using hchain_k0.2.2 + have hstarInv_k_le_zero : + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + simpa using hchain_k0.2.1 + have hscaled_bar_k : + sigma⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) ≤ + (1 + delta) * sqrtTheta0 := by + calc + sigma⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) ≤ + sigma⁻¹ * hP.barSigmaAtScale hStruct 0 := + mul_le_mul_of_nonneg_left hbar_k_le_zero hsigma_inv_nonneg + _ ≤ (1 + delta) * sqrtTheta0 := by simpa [sigma, sqrtTheta0] using hcompare_upper + have hscaled_star_k : + sigma * (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (1 + delta) * sqrtTheta0 := by + calc + sigma * (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + sigma * (hP.barSigmaStarAtScale hStruct 0)⁻¹ := + mul_le_mul_of_nonneg_left hstarInv_k_le_zero hsigma_nonneg + _ ≤ (1 + delta) * sqrtTheta0 := by simpa [sigma, sqrtTheta0] using hcompare_lower + have hJ_formula : + Ch04.annealedResponseJAtScale P (k : ℤ) p_e q_e = + (1 / 2 : ℝ) * sigma⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) + + (1 / 2 : ℝ) * sigma * + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - 1 := by + have hBlock_k : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + calc + Ch04.annealedResponseJAtScale P (k : ℤ) p_e q_e = + expectedJScalarFormula hP hStruct (k : ℤ) p_e q_e := by + rw [Section52.annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (k : ℤ) p_e q_e hBlock_k] + _ = (1 / 2 : ℝ) * sigma⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) + + (1 / 2 : ℝ) * sigma * + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - 1 := by + simpa [p_e, q_e, sigma] using + expectedJScalarFormula_special_eq_of_P4 hP hStruct hP4 m k e heSq + have hJ_bound : + Ch04.annealedResponseJAtScale P (k : ℤ) p_e q_e ≤ + (1 + delta) * sqrtTheta0 := by + rw [hJ_formula] + nlinarith [hscaled_bar_k, hscaled_star_k, hB_nonneg] + obtain ⟨hscaled_bar_diff, hscaled_star_diff⟩ := + scaled_scalar_differences_le_of_good hP hStruct hP4 hdelta_pos m k + hgood_upper hgood_lower + have htau_formula : + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e = + (1 / 2 : ℝ) * sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + have hBlock_m : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlock_k : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + calc + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e = + tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) p_e q_e := by + rw [Section52.tauAtScale_eq_tauScalarFormula + hP hStruct (m : ℤ) (k : ℤ) p_e q_e hBlock_m hBlock_k] + _ = (1 / 2 : ℝ) * sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + simpa [p_e, q_e, sigma] using + tauScalarFormula_special_eq_of_P4 hP hStruct hP4 m k e heSq + have htau_bound : + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e ≤ + delta * sqrtTheta0 := by + have hbar_half : + (1 / 2 : ℝ) * + (sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ))) ≤ + (1 / 2 : ℝ) * (delta * sqrtTheta0) := + mul_le_mul_of_nonneg_left hscaled_bar_diff (by norm_num) + have hstar_half : + (1 / 2 : ℝ) * + (sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹)) ≤ + (1 / 2 : ℝ) * (delta * sqrtTheta0) := + mul_le_mul_of_nonneg_left hscaled_star_diff (by norm_num) + rw [htau_formula] + calc + (1 / 2 : ℝ) * sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) = + (1 / 2 : ℝ) * + (sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ))) + + (1 / 2 : ℝ) * + (sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹)) := by + ring + _ ≤ + (1 / 2 : ℝ) * (delta * sqrtTheta0) + + (1 / 2 : ℝ) * (delta * sqrtTheta0) := + add_le_add hbar_half hstar_half + _ = delta * sqrtTheta0 := by ring + exact ⟨hJ_bound, htau_bound⟩ + +end + +end GoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/ScalarBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/ScalarBounds.lean new file mode 100644 index 0000000000..1081778379 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/ScalarBounds.lean @@ -0,0 +1,309 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.SpecialVectorAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain + +/-! # Scalar Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace GoodScale + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Scalar bounds for the good-scale lemma + +This file supplies the `(P4)`-based scalar positivity, monotonicity, and +special-vector formula rewrites used by the good-scale parameter bounds. +-/ + +/-- Euclidean vector norm of a scalar multiple. -/ +theorem vecNorm_smul {d : ℕ} (c : ℝ) (e : Vec d) : + Ch02.vecNorm (c • e) = |c| * Ch02.vecNorm e := by + change ‖(WithLp.toLp 2 (c • e) : EuclideanSpace ℝ (Fin d))‖ = + |c| * ‖(WithLp.toLp 2 e : EuclideanSpace ℝ (Fin d))‖ + have h : + (WithLp.toLp 2 (c • e) : EuclideanSpace ℝ (Fin d)) = + c • (WithLp.toLp 2 e : EuclideanSpace ℝ (Fin d)) := by + ext i + rfl + rw [h, norm_smul, Real.norm_eq_abs] + +/-- A Euclidean unit vector has squared project norm one. -/ +theorem vecNormSq_eq_one_of_vecNorm_eq_one {d : ℕ} {e : Vec d} + (he : Ch02.vecNorm e = 1) : + vecNormSq e = 1 := by + rw [← Ch02.vecNorm_sq_eq_vecNormSq, he] + norm_num + +/-- Under `(P4)`, `\widehat\sigma_m` is strictly positive. -/ +theorem sigmaHatAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < sigmaHatAtScale hP hStruct (m : ℤ) := by + have hb := Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc := Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + dsimp [sigmaHatAtScale] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + +/-- Under `(P4)`, the contrast is monotone along nonnegative scales. -/ +theorem thetaAtScale_mono_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {n m : ℕ} (hnm : n ≤ m) : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (n : ℤ) := by + have hn_nonneg : 0 ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hnm_int : (n : ℤ) ≤ (m : ℤ) := by exact_mod_cast hnm + have hParentBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hChildBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n + have hDescBlockInt : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (n : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary hn_nonneg hnm_int hR hChildBlockInt + exact + Section52.thetaAtScale_mono_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct hn_nonneg hnm_int hParentBlockInt hChildBlockInt hDescBlockInt + +/-- Under `(P4)`, the scalar contrast is at least one. -/ +theorem one_le_thetaAtScale_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + exact + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + +/-- The scaled `p_e` centering has the manuscript norm. -/ +theorem scaled_specialP_centering_vecNorm_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let p0_e := (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ • q_e - p_e + Ch02.vecNorm + (Real.rpow (sigmaHatAtScale hP hStruct (m : ℤ)) (1 / 2 : ℝ) • p0_e) = + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let theta := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma : sigma = Real.sqrt (b * c) := by rfl + have htheta : theta = b * c⁻¹ := by rfl + have hcoeff := rpow_half_mul_specialP_centering_coeff_eq hb hc hsigma htheta + have hp0 : + c⁻¹ • (sigma ^ (1 / 2 : ℝ) • e) - sigma ^ (-(1 / 2 : ℝ)) • e = + (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + Ch02.vecNorm + (sigma ^ (1 / 2 : ℝ) • + (c⁻¹ • (sigma ^ (1 / 2 : ℝ) • e) - + sigma ^ (-(1 / 2 : ℝ)) • e)) = + Ch02.vecNorm + ((sigma ^ (1 / 2 : ℝ) * + (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ)))) • e) := by + rw [hp0, smul_smul] + _ = |sigma ^ (1 / 2 : ℝ) * + (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ)))| * + Ch02.vecNorm e := by + rw [vecNorm_smul] + _ = |Real.sqrt theta - 1| := by + rw [hcoeff, he, mul_one] + +/-- The scaled `q_e` centering has the manuscript norm. -/ +theorem scaled_specialQ_centering_vecNorm_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let q0_e := q_e - hP.barSigmaAtScale hStruct (m : ℤ) • p_e + Ch02.vecNorm + (Real.rpow (sigmaHatAtScale hP hStruct (m : ℤ)) (-(1 / 2 : ℝ)) • q0_e) = + |Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1| := by + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + let theta := thetaAtScale hP hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma : sigma = Real.sqrt (b * c) := by rfl + have htheta : theta = b * c⁻¹ := by rfl + have hcoeff := rpow_neg_half_mul_specialQ_centering_coeff_eq hb hc hsigma htheta + have hq0 : + sigma ^ (1 / 2 : ℝ) • e - b • (sigma ^ (-(1 / 2 : ℝ)) • e) = + (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ))) • e := by + rw [smul_smul] + rw [← sub_smul] + calc + Ch02.vecNorm + (sigma ^ (-(1 / 2 : ℝ)) • + (sigma ^ (1 / 2 : ℝ) • e - + b • (sigma ^ (-(1 / 2 : ℝ)) • e))) = + Ch02.vecNorm + ((sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ)))) • e) := by + rw [hq0, smul_smul] + _ = |sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ)))| * + Ch02.vecNorm e := by + rw [vecNorm_smul] + _ = |Real.sqrt theta - 1| := by + rw [hcoeff, abs_sub_comm, he, mul_one] + +/-- The special-vector scalar formula for the expected response. -/ +theorem expectedJScalarFormula_special_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m k : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + expectedJScalarFormula hP hStruct (k : ℤ) p_e q_e = + (1 / 2 : ℝ) * (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct (k : ℤ) + + (1 / 2 : ℝ) * sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - 1 := by + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + have hb := Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc := Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_pos : 0 < sigma := by + dsimp [sigma, sigmaHatAtScale] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have heDot : vecDot e e = 1 := by simpa [vecNormSq] using he + have hcross : + sigma ^ (1 / 2 : ℝ) * (sigma ^ (-(1 / 2 : ℝ)) * vecDot e e) = 1 := by + rw [← mul_assoc, mul_comm (sigma ^ (1 / 2 : ℝ)) (sigma ^ (-(1 / 2 : ℝ)))] + rw [rpow_neg_half_mul_rpow_half_eq_one hsigma_pos, one_mul, heDot] + have hq : sigma ^ (1 / 2 : ℝ) * (sigma ^ (1 / 2 : ℝ) * vecDot e e) = sigma := by + rw [← mul_assoc] + rw [show sigma ^ (1 / 2 : ℝ) * sigma ^ (1 / 2 : ℝ) = + (sigma ^ (1 / 2 : ℝ)) ^ 2 by ring] + rw [rpow_half_sq_eq_self hsigma_pos, heDot, mul_one] + have hp : + sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (-(1 / 2 : ℝ)) * vecDot e e) = sigma⁻¹ := by + rw [← mul_assoc] + rw [show sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (-(1 / 2 : ℝ)) = + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 by ring] + rw [rpow_neg_half_sq_eq_inv hsigma_pos, heDot, mul_one] + have hcross2 : + sigma ^ (2⁻¹ : ℝ) * (sigma ^ (-(2⁻¹ : ℝ)) * vecDot e e) = 1 := by + convert hcross using 1 + all_goals norm_num + have hq2 : sigma ^ (2⁻¹ : ℝ) * (sigma ^ (2⁻¹ : ℝ) * vecDot e e) = sigma := by + convert hq using 1 + all_goals norm_num + have hp2 : + sigma ^ (-(2⁻¹ : ℝ)) * (sigma ^ (-(2⁻¹ : ℝ)) * vecDot e e) = sigma⁻¹ := by + convert hp using 1 + all_goals norm_num + dsimp [specialPAtScale, specialQAtScale] + change expectedJScalarFormula hP hStruct (k : ℤ) + (sigma ^ (-(1 / 2 : ℝ)) • e) (sigma ^ (1 / 2 : ℝ) • e) = + (1 / 2 : ℝ) * sigma⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) + + (1 / 2 : ℝ) * sigma * (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - 1 + simp [expectedJScalarFormula, vecDot_smul_left, vecDot_smul_right] + rw [hcross2, hq2, hp2] + ring + +/-- The special-vector scalar formula for the additivity defect. -/ +theorem tauScalarFormula_special_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m k : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) p_e q_e = + (1 / 2 : ℝ) * (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * sigmaHatAtScale hP hStruct (m : ℤ) * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + let sigma := sigmaHatAtScale hP hStruct (m : ℤ) + have hb := Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc := Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hsigma_pos : 0 < sigma := by + dsimp [sigma, sigmaHatAtScale] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have heDot : vecDot e e = 1 := by simpa [vecNormSq] using he + have hq : sigma ^ (1 / 2 : ℝ) * (sigma ^ (1 / 2 : ℝ) * vecDot e e) = sigma := by + rw [← mul_assoc] + rw [show sigma ^ (1 / 2 : ℝ) * sigma ^ (1 / 2 : ℝ) = + (sigma ^ (1 / 2 : ℝ)) ^ 2 by ring] + rw [rpow_half_sq_eq_self hsigma_pos, heDot, mul_one] + have hp : + sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (-(1 / 2 : ℝ)) * vecDot e e) = sigma⁻¹ := by + rw [← mul_assoc] + rw [show sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (-(1 / 2 : ℝ)) = + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 by ring] + rw [rpow_neg_half_sq_eq_inv hsigma_pos, heDot, mul_one] + have hq2 : sigma ^ (2⁻¹ : ℝ) * (sigma ^ (2⁻¹ : ℝ) * vecDot e e) = sigma := by + convert hq using 1 + all_goals norm_num + have hp2 : + sigma ^ (-(2⁻¹ : ℝ)) * (sigma ^ (-(2⁻¹ : ℝ)) * vecDot e e) = sigma⁻¹ := by + convert hp using 1 + all_goals norm_num + dsimp [specialPAtScale, specialQAtScale] + change tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) + (sigma ^ (-(1 / 2 : ℝ)) • e) (sigma ^ (1 / 2 : ℝ) • e) = + (1 / 2 : ℝ) * sigma⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * sigma * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + simp [tauScalarFormula, vecDot_smul_left, vecDot_smul_right] + rw [hq2, hp2] + ring + +end + +end GoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/SpecialVectorAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/SpecialVectorAlgebra.lean new file mode 100644 index 0000000000..2bb6c0a785 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/GoodScale/SpecialVectorAlgebra.lean @@ -0,0 +1,296 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common + +/-! # Special Vector Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace GoodScale + +noncomputable section + +/-! +# Special-vector scalar algebra for the good-scale lemma + +This file contains only the real-variable algebra behind the manuscript choices +`p_e = \widehat\sigma_m^{-1/2} e` and `q_e = \widehat\sigma_m^{1/2} e`. +The law-facing good-scale theorem will use these identities after the +manuscript-facing scalar hypotheses are available. +-/ + +/-- With `σ = sqrt (b * c)` and `θ = b * c⁻¹`, the product `σ * c⁻¹` +is `sqrt θ`. -/ +theorem sigma_mul_inv_star_eq_sqrt_theta {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + sigma * c⁻¹ = Real.sqrt theta := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have htheta_nonneg : 0 ≤ theta := by + rw [htheta] + exact mul_nonneg hb.le (inv_pos.mpr hc).le + have hleft_nonneg : 0 ≤ sigma * c⁻¹ := + mul_nonneg hsigma_pos.le (inv_pos.mpr hc).le + have hsq : (sigma * c⁻¹) * (sigma * c⁻¹) = + Real.sqrt theta * Real.sqrt theta := by + calc + (sigma * c⁻¹) * (sigma * c⁻¹) = + (Real.sqrt (b * c) * Real.sqrt (b * c)) * (c⁻¹ * c⁻¹) := by + rw [hsigma] + ring + _ = (b * c) * (c⁻¹ * c⁻¹) := by + rw [Real.mul_self_sqrt (mul_pos hb hc).le] + _ = b * c⁻¹ := by + have hc_ne : c ≠ 0 := ne_of_gt hc + field_simp [hc_ne] + _ = theta := by + rw [htheta] + _ = Real.sqrt theta * Real.sqrt theta := + (Real.mul_self_sqrt htheta_nonneg).symm + exact (mul_self_inj_of_nonneg hleft_nonneg (Real.sqrt_nonneg theta)).1 hsq + +/-- With `σ = sqrt (b * c)` and `θ = b * c⁻¹`, the product `b * σ⁻¹` +is `sqrt θ`. -/ +theorem barSigma_mul_inv_sigma_eq_sqrt_theta {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + b * sigma⁻¹ = Real.sqrt theta := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have htheta_nonneg : 0 ≤ theta := by + rw [htheta] + exact mul_nonneg hb.le (inv_pos.mpr hc).le + have hleft_nonneg : 0 ≤ b * sigma⁻¹ := + mul_nonneg hb.le (inv_pos.mpr hsigma_pos).le + have hsq : (b * sigma⁻¹) * (b * sigma⁻¹) = + Real.sqrt theta * Real.sqrt theta := by + calc + (b * sigma⁻¹) * (b * sigma⁻¹) = + (b * b) * (Real.sqrt (b * c))⁻¹ * (Real.sqrt (b * c))⁻¹ := by + rw [hsigma] + ring + _ = b * c⁻¹ := by + have hprod_pos : 0 < b * c := mul_pos hb hc + have hprod_ne : b * c ≠ 0 := ne_of_gt hprod_pos + have hsqrt_ne : Real.sqrt (b * c) ≠ 0 := + ne_of_gt (Real.sqrt_pos_of_pos hprod_pos) + field_simp [hsqrt_ne, hprod_ne] + rw [Real.sq_sqrt hprod_pos.le] + _ = theta := by + rw [htheta] + _ = Real.sqrt theta * Real.sqrt theta := + (Real.mul_self_sqrt htheta_nonneg).symm + exact (mul_self_inj_of_nonneg hleft_nonneg (Real.sqrt_nonneg theta)).1 hsq + +/-- The product of the negative and positive half-powers of a positive scalar. -/ +theorem rpow_neg_half_mul_rpow_half_eq_one {sigma : ℝ} (hsigma_pos : 0 < sigma) : + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (1 / 2 : ℝ) = 1 := by + calc + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (1 / 2 : ℝ) = + sigma ^ ((-(1 / 2 : ℝ)) + (1 / 2 : ℝ)) := by + rw [Real.rpow_add hsigma_pos (-(1 / 2 : ℝ)) (1 / 2 : ℝ)] + _ = 1 := by norm_num [Real.rpow_zero] + +/-- The square of the positive half-power of a positive scalar. -/ +theorem rpow_half_sq_eq_self {sigma : ℝ} (hsigma_pos : 0 < sigma) : + (sigma ^ (1 / 2 : ℝ)) ^ 2 = sigma := by + calc + (sigma ^ (1 / 2 : ℝ)) ^ 2 = + (sigma ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (1 / 2 : ℝ)) 2).symm + _ = sigma ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = sigma := by norm_num [Real.rpow_one] + +/-- The square of the negative half-power of a positive scalar. -/ +theorem rpow_neg_half_sq_eq_inv {sigma : ℝ} (hsigma_pos : 0 < sigma) : + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 = sigma⁻¹ := by + calc + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + (sigma ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (-(1 / 2 : ℝ))) 2).symm + _ = sigma ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = sigma ^ (-1 : ℝ) := by norm_num + _ = (sigma ^ (1 : ℝ))⁻¹ := Real.rpow_neg hsigma_pos.le 1 + _ = sigma⁻¹ := by rw [Real.rpow_one] + +/-- Coefficient identity for the scaled centered special vector `p_e`. -/ +theorem rpow_half_mul_specialP_centering_coeff_eq {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + sigma ^ (1 / 2 : ℝ) * + (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ))) = + Real.sqrt theta - 1 := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := sigma_mul_inv_star_eq_sqrt_theta hb hc hsigma htheta + have hhalf_sq : (sigma ^ (1 / 2 : ℝ)) * (sigma ^ (1 / 2 : ℝ)) = sigma := by + calc + (sigma ^ (1 / 2 : ℝ)) * (sigma ^ (1 / 2 : ℝ)) = + (sigma ^ (1 / 2 : ℝ)) ^ 2 := by ring + _ = (sigma ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (1 / 2 : ℝ)) 2).symm + _ = sigma ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = sigma := by norm_num [Real.rpow_one] + have hhalf_neg : sigma ^ (1 / 2 : ℝ) * sigma ^ (-(1 / 2 : ℝ)) = 1 := by + calc + sigma ^ (1 / 2 : ℝ) * sigma ^ (-(1 / 2 : ℝ)) = + sigma ^ ((1 / 2 : ℝ) + (-(1 / 2 : ℝ))) := by + rw [Real.rpow_add hsigma_pos (1 / 2 : ℝ) (-(1 / 2 : ℝ))] + _ = 1 := by norm_num [Real.rpow_zero] + calc + sigma ^ (1 / 2 : ℝ) * + (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ))) = + c⁻¹ * (sigma ^ (1 / 2 : ℝ) * sigma ^ (1 / 2 : ℝ)) - + sigma ^ (1 / 2 : ℝ) * sigma ^ (-(1 / 2 : ℝ)) := by ring + _ = c⁻¹ * sigma - 1 := by rw [hhalf_sq, hhalf_neg] + _ = Real.sqrt theta - 1 := by + rw [← hdiv] + ring + +/-- Coefficient identity for the scaled centered special vector `q_e`. -/ +theorem rpow_neg_half_mul_specialQ_centering_coeff_eq {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ))) = + 1 - Real.sqrt theta := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := barSigma_mul_inv_sigma_eq_sqrt_theta hb hc hsigma htheta + have hhalf_neg : sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (1 / 2 : ℝ) = 1 := by + calc + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (1 / 2 : ℝ) = + sigma ^ ((-(1 / 2 : ℝ)) + (1 / 2 : ℝ)) := by + rw [Real.rpow_add hsigma_pos (-(1 / 2 : ℝ)) (1 / 2 : ℝ)] + _ = 1 := by norm_num [Real.rpow_zero] + have hneg_sq : + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (-(1 / 2 : ℝ)) = sigma⁻¹ := by + calc + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (-(1 / 2 : ℝ)) = + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 := by ring + _ = (sigma ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (-(1 / 2 : ℝ))) 2).symm + _ = sigma ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = sigma ^ (-1 : ℝ) := by norm_num + _ = (sigma ^ (1 : ℝ))⁻¹ := Real.rpow_neg hsigma_pos.le 1 + _ = sigma⁻¹ := by rw [Real.rpow_one] + calc + sigma ^ (-(1 / 2 : ℝ)) * + (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ))) = + sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (1 / 2 : ℝ) - + b * (sigma ^ (-(1 / 2 : ℝ)) * sigma ^ (-(1 / 2 : ℝ))) := by ring + _ = 1 - b * sigma⁻¹ := by rw [hhalf_neg, hneg_sq] + _ = 1 - Real.sqrt theta := by + rw [← hdiv] + +/-- Squared scalar coefficient identity for the centered special vector +`p_e`. -/ +theorem sigmaHat_mul_specialP_centering_coeff_sq_eq {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + sigma * (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + (Real.sqrt theta - 1) ^ 2 := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := sigma_mul_inv_star_eq_sqrt_theta hb hc hsigma htheta + have hhalf : sigma ^ (1 / 2 : ℝ) = + sigma * sigma ^ (-(1 / 2 : ℝ)) := by + calc + sigma ^ (1 / 2 : ℝ) = sigma ^ ((1 : ℝ) + (-(1 / 2 : ℝ))) := by + norm_num + _ = sigma ^ (1 : ℝ) * sigma ^ (-(1 / 2 : ℝ)) := + Real.rpow_add hsigma_pos 1 (-(1 / 2 : ℝ)) + _ = sigma * sigma ^ (-(1 / 2 : ℝ)) := by + rw [Real.rpow_one] + have hneg_sq : (sigma ^ (-(1 / 2 : ℝ))) ^ 2 = sigma⁻¹ := by + calc + (sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + (sigma ^ (-(1 / 2 : ℝ))) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (-(1 / 2 : ℝ))) 2).symm + _ = sigma ^ ((-(1 / 2 : ℝ)) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (-(1 / 2 : ℝ)) (2 : ℝ)).symm + _ = sigma ^ (-1 : ℝ) := by + norm_num + _ = (sigma ^ (1 : ℝ))⁻¹ := + Real.rpow_neg hsigma_pos.le 1 + _ = sigma⁻¹ := by + rw [Real.rpow_one] + calc + sigma * (c⁻¹ * sigma ^ (1 / 2 : ℝ) - sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + sigma * (sigma ^ (-(1 / 2 : ℝ)) * (Real.sqrt theta - 1)) ^ 2 := by + rw [hhalf] + rw [← hdiv] + ring + _ = (Real.sqrt theta - 1) ^ 2 := by + rw [mul_pow, hneg_sq] + field_simp [ne_of_gt hsigma_pos] + +/-- Squared scalar coefficient identity for the centered special vector +`q_e`. -/ +theorem inv_sigmaHat_mul_specialQ_centering_coeff_sq_eq {b c sigma theta : ℝ} + (hb : 0 < b) (hc : 0 < c) + (hsigma : sigma = Real.sqrt (b * c)) (htheta : theta = b * c⁻¹) : + sigma⁻¹ * (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + (Real.sqrt theta - 1) ^ 2 := by + have hsigma_pos : 0 < sigma := by + rw [hsigma] + exact Real.sqrt_pos_of_pos (mul_pos hb hc) + have hdiv := barSigma_mul_inv_sigma_eq_sqrt_theta hb hc hsigma htheta + have hhalf : sigma ^ (1 / 2 : ℝ) = + sigma * sigma ^ (-(1 / 2 : ℝ)) := by + calc + sigma ^ (1 / 2 : ℝ) = sigma ^ ((1 : ℝ) + (-(1 / 2 : ℝ))) := by + norm_num + _ = sigma ^ (1 : ℝ) * sigma ^ (-(1 / 2 : ℝ)) := + Real.rpow_add hsigma_pos 1 (-(1 / 2 : ℝ)) + _ = sigma * sigma ^ (-(1 / 2 : ℝ)) := by + rw [Real.rpow_one] + have hpos_sq : (sigma ^ (1 / 2 : ℝ)) ^ 2 = sigma := by + calc + (sigma ^ (1 / 2 : ℝ)) ^ 2 = + (sigma ^ (1 / 2 : ℝ)) ^ (2 : ℝ) := by + exact (Real.rpow_natCast (sigma ^ (1 / 2 : ℝ)) 2).symm + _ = sigma ^ ((1 / 2 : ℝ) * (2 : ℝ)) := + (Real.rpow_mul hsigma_pos.le (1 / 2 : ℝ) (2 : ℝ)).symm + _ = sigma ^ (1 : ℝ) := by + norm_num + _ = sigma := by + rw [Real.rpow_one] + calc + sigma⁻¹ * (sigma ^ (1 / 2 : ℝ) - b * sigma ^ (-(1 / 2 : ℝ))) ^ 2 = + sigma⁻¹ * (sigma ^ (1 / 2 : ℝ) * (1 - Real.sqrt theta)) ^ 2 := by + rw [hhalf] + rw [← hdiv] + field_simp [ne_of_gt hsigma_pos] + _ = (Real.sqrt theta - 1) ^ 2 := by + rw [mul_pow, hpos_sq] + field_simp [ne_of_gt hsigma_pos] + ring + +end + +end GoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction.lean new file mode 100644 index 0000000000..2e7bd271d1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction.lean @@ -0,0 +1,39 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Assembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.BetaBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFluctuationInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ResponseMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RHSCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.TauSum + +/-! # One Step Contraction -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +/-! +# One-step contraction of the annealed flow + +This top-level module exposes the public theorem +`oneStepContraction_homogenizationScale`. +-/ + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Assembly.lean new file mode 100644 index 0000000000..d5ca989d75 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Assembly.lean @@ -0,0 +1,345 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RHSCompression + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Assembly of the one-step contraction + +This file combines the Section 5.3 centered-response estimate, the good-scale +RHS compression, and the centered-response identity to prove the public +Section 5.4 one-step contraction proposition. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +private def unitCoordinateVector {d : ℕ} [NeZero d] : Vec d := + Pi.single (0 : Fin d) 1 + +private theorem unitCoordinateVector_vecNormSq {d : ℕ} [NeZero d] : + vecNormSq (unitCoordinateVector : Vec d) = 1 := by + rw [unitCoordinateVector, vecNormSq, vecDot, Finset.sum_eq_single (0 : Fin d)] + · simp + · intro j _ hj + simp [Pi.single_eq_of_ne hj] + · simp + +private theorem unitCoordinateVector_vecNorm {d : ℕ} [NeZero d] : + Ch02.vecNorm (unitCoordinateVector : Vec d) = 1 := by + have hsq : + Ch02.vecNorm (unitCoordinateVector : Vec d) ^ (2 : ℕ) = 1 := by + simpa [unitCoordinateVector_vecNormSq] using + Ch02.vecNorm_sq_eq_vecNormSq (unitCoordinateVector : Vec d) + have hnonneg : + 0 ≤ Ch02.vecNorm (unitCoordinateVector : Vec d) := + Ch02.vecNorm_nonneg _ + rcases sq_eq_one_iff.mp hsq with h | h + · exact h + · linarith + +/-- Parameter-only one-step scale-separation constant. -/ +noncomputable def oneStepScaleSeparationConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 2 * (section53CoarseFluctuationBetaParams params * Real.log 3)⁻¹ + +/-- Parameter-only linear budget constant for Section 5.3-beta full-block +sums. -/ +noncomputable def oneStepCoarsePairLinearBudgetConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 params.xi * + (geometricDiscount + (VarianceBoundGoodScale.lpVarianceDecayParams d params - + section53CoarseFluctuationBetaParams params) 1)⁻¹ + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 params.xi * + (geometricDiscount + (VarianceBoundGoodScale.sqrtVarianceDecay d - + section53CoarseFluctuationBetaParams params) 1)⁻¹) + +/-- Parameter-only refined budget constant for Section 5.3-beta full-block +sums. -/ +noncomputable def oneStepWeightedRefinedBudgetConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (geometricDiscount (section53CoarseFluctuationBetaParams params) 1)⁻¹ + + 2 * oneStepCoarsePairLinearBudgetConstParams params + + 2 * VarianceBoundGoodScale.pairPointwiseBudgetConstParams params * + oneStepCoarsePairLinearBudgetConstParams params + +/-- Parameter-only full-block constant for the one-step RHS compression. -/ +noncomputable def oneStepCoarseFullBlockConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 3 * + (VarianceBoundGoodScale.refinedMatrixBudgetConst d * + oneStepWeightedRefinedBudgetConstParams params) + +/-- Parameter-only tau-sum constant for the one-step RHS compression. -/ +noncomputable def oneStepCoarseTauSumConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 3 * (geometricDiscount (section53CoarseFluctuationBetaParams params) 1)⁻¹ + +/-- Parameter-only multiplier compressing the Section 5.3 manuscript RHS. The +outer `max` gives a nonnegative witness without exposing any proof package. -/ +noncomputable def oneStepCompressionMultiplierParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + max 0 + (3 + + (section53CoarseFluctuationBetaParams params)⁻¹ * + oneStepCoarseFullBlockConstParams params + + (section53CoarseFluctuationBetaParams params ^ 2)⁻¹ * + oneStepCoarseTauSumConstParams params + + (params.xi : ℝ) * + (section53CoarseFluctuationBetaParams params ^ 3)⁻¹ * 4 + + (section53CoarseFluctuationBetaParams params ^ 2)⁻¹ * 3) + +@[simp] +theorem oneStepScaleSeparationConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + oneStepScaleSeparationConstParams hP4.params = + oneStepScaleSeparationConst hP4 := rfl + +@[simp] +theorem oneStepCoarsePairLinearBudgetConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + oneStepCoarsePairLinearBudgetConstParams hP4.params = + oneStepCoarsePairLinearBudgetConst hP4 := rfl + +@[simp] +theorem oneStepWeightedRefinedBudgetConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + oneStepWeightedRefinedBudgetConstParams hP4.params = + oneStepWeightedRefinedBudgetConst hP4 := rfl + +@[simp] +theorem oneStepCoarseFullBlockConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + oneStepCoarseFullBlockConstParams hP4.params = + oneStepCoarseFullBlockConst hP4 := rfl + +@[simp] +theorem oneStepCoarseTauSumConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + oneStepCoarseTauSumConstParams hP4.params = + oneStepCoarseTauSumConst hP4 := rfl + +private theorem oneStepCompressionMultiplierParams_nonneg {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 ≤ oneStepCompressionMultiplierParams params := by + unfold oneStepCompressionMultiplierParams + exact le_max_left _ _ + +/-- Compressed form of the Section 5.3 input at a good scale. -/ +theorem exists_expectedCenteredResponseJAtScale_special_le_compressed + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ K : ℝ, 0 ≤ K ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {Csep delta epsilon : ℝ} {m : ℕ}, + oneStepScaleSeparationConstParams params ≤ Csep → + 0 < delta → delta ≤ 1 / 2 → + Csep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ) → + 0 < epsilon → epsilon ≤ 1 → + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ) → + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ → + ∀ e : Vec d, Ch02.vecNorm e = 1 → + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) ≤ + K * ((epsilon + epsilon⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ)) := by + rcases + exists_expectedCenteredResponseJAtScale_special_le_coarseFluctuationRHS_zero_uniform + params with + ⟨C0, hC0_nonneg, hC0⟩ + let Mparams : ℝ := oneStepCompressionMultiplierParams params + refine ⟨C0 * Mparams, + mul_nonneg hC0_nonneg (oneStepCompressionMultiplierParams_nonneg params), ?_⟩ + intro P hP hStruct hP4 hparams Csep delta epsilon m hCsep hdelta_pos hdelta_le hsep + hepsilon_pos hepsilon_le hgood_upper hgood_lower e he + subst params + let M : ℝ := + 3 + + (section53CoarseFluctuationBeta hP4)⁻¹ * + oneStepCoarseFullBlockConst hP4 + + (section53CoarseFluctuationBeta hP4 ^ 2)⁻¹ * + oneStepCoarseTauSumConst hP4 + + (hP4.xi : ℝ) * + (section53CoarseFluctuationBeta hP4 ^ 3)⁻¹ * 4 + + (section53CoarseFluctuationBeta hP4 ^ 2)⁻¹ * 3 + have hCsep_law : oneStepScaleSeparationConst hP4 ≤ Csep := by + simpa using hCsep + have hsep_law : + Csep * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ) := by + simpa using hsep + have hm_pos : + 0 < m := + oneStepScaleSeparation_m_pos hP4 hCsep_law hdelta_pos hsep_law + have hJ := + hC0 hP hStruct hP4 rfl hm_pos e he hepsilon_pos hepsilon_le + have hRHS := + coarseFluctuationManuscriptRHSAtScale_zero_le_compressed + hP hStruct hP4 hC0_nonneg hCsep_law hdelta_pos hdelta_le hsep_law + hepsilon_pos hepsilon_le hgood_upper hgood_lower e he + (C0 := C0) (Csep := Csep) + have hM_le : M ≤ Mparams := by + dsimp [Mparams, oneStepCompressionMultiplierParams] + simp [M] + have hθ0_nonneg : + 0 ≤ thetaAtScale hP hStruct (0 : ℤ) := + le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hterm_nonneg : + 0 ≤ (epsilon + epsilon⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ) := by + have hsum_nonneg : + 0 ≤ epsilon + epsilon⁻¹ * Real.sqrt delta := by + exact add_nonneg hepsilon_pos.le + (mul_nonneg (inv_nonneg.mpr hepsilon_pos.le) (Real.sqrt_nonneg delta)) + exact mul_nonneg hsum_nonneg hθ0_nonneg + calc + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) ≤ + C0 * M * ((epsilon + epsilon⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ)) := + hJ.trans (by simpa [M] using hRHS) + _ ≤ C0 * Mparams * ((epsilon + epsilon⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ)) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hM_le hC0_nonneg) hterm_nonneg + +/-- Proposition `p.one.step.contraction.homogenization.scale` from the +manuscript. -/ +theorem oneStepContraction_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta : ℝ}, 0 < delta → delta ≤ 1 / 2 → + ∀ {m : ℕ}, + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ) → + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ) → + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ → + thetaAtScale hP hStruct (m : ℤ) ≤ + 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct 0 := by + rcases + exists_expectedCenteredResponseJAtScale_special_le_compressed + params with + ⟨K, hK_nonneg, hK⟩ + let C : ℝ := max (oneStepScaleSeparationConstParams params) (max (4 * K) 1) + have hC_pos : 0 < C := by + have hle : (1 : ℝ) ≤ C := by + dsimp [C] + exact le_trans (le_max_right (4 * K) 1) + (le_max_right (oneStepScaleSeparationConstParams params) (max (4 * K) 1)) + linarith + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams delta hdelta_pos hdelta_le m hsep hgood_upper hgood_lower + subst params + let ε := oneStepContractionEpsilon delta + let e : Vec d := unitCoordinateVector + have he : Ch02.vecNorm e = 1 := by + simpa [e] using (unitCoordinateVector_vecNorm (d := d)) + have hCsep : oneStepScaleSeparationConstParams hP4.params ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hK_le_C : 4 * K ≤ C := by + dsimp [C] + exact le_trans (le_max_left (4 * K) 1) + (le_max_right (oneStepScaleSeparationConst hP4) (max (4 * K) 1)) + have hε_pos : 0 < ε := by + simpa [ε] using oneStepContractionEpsilon_pos hdelta_pos + have hε_le : ε ≤ 1 := by + simpa [ε] using oneStepContractionEpsilon_le_one hdelta_pos hdelta_le + have hθ0_nonneg : + 0 ≤ thetaAtScale hP hStruct (0 : ℤ) := + le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hJ := + hK hP hStruct hP4 rfl hCsep hdelta_pos hdelta_le hsep hε_pos hε_le + hgood_upper hgood_lower e he + have hε_abs : + ε + ε⁻¹ * Real.sqrt delta ≤ 2 * ε := by + simpa [ε] using oneStepContractionEpsilon_add_inv_mul_sqrt_le hdelta_pos + have htarget_le : + (ε + ε⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ) ≤ + 2 * ε * thetaAtScale hP hStruct (0 : ℤ) := by + exact mul_le_mul_of_nonneg_right hε_abs hθ0_nonneg + have hcenter := + thetaAtScale_sub_one_eq_two_centeredResponse_special + hP hStruct hP4 m e he + have hsub_le : + thetaAtScale hP hStruct (m : ℤ) - 1 ≤ + C * ε * thetaAtScale hP hStruct (0 : ℤ) := by + calc + thetaAtScale hP hStruct (m : ℤ) - 1 = + 2 * + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) := hcenter + _ ≤ 2 * (K * + ((ε + ε⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ))) := + mul_le_mul_of_nonneg_left hJ (by norm_num) + _ ≤ 2 * (K * (2 * ε * thetaAtScale hP hStruct (0 : ℤ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left htarget_le hK_nonneg) (by norm_num) + _ = (4 * K) * ε * thetaAtScale hP hStruct (0 : ℤ) := by ring + _ ≤ C * ε * thetaAtScale hP hStruct (0 : ℤ) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hK_le_C hε_pos.le) hθ0_nonneg + calc + thetaAtScale hP hStruct (m : ℤ) = + 1 + (thetaAtScale hP hStruct (m : ℤ) - 1) := by ring + _ ≤ 1 + C * ε * thetaAtScale hP hStruct (0 : ℤ) := + by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hsub_le 1 + _ = 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct 0 := by + simp [ε, oneStepContractionEpsilon] + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Basic.lean new file mode 100644 index 0000000000..ba79ab40a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/Basic.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Basic definitions for the one-step contraction + +This file contains only the scalar abbreviations used by the Section 5.4 +one-step contraction proof. The theorem-facing statement remains in the final +assembly file. +-/ + +/-- The internal manuscript choice `epsilon = delta^(1/4)`. -/ +noncomputable def oneStepContractionEpsilon (delta : ℝ) : ℝ := + Real.rpow delta (1 / 4 : ℝ) + +/-- The scalar coefficient combination multiplying the additivity-defect sum +in the Section 5.3 coarse-fluctuation estimate. -/ +noncomputable def oneStepScalarWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℕ) : ℝ := + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 + +/-- The one-step scalar weight is the sum of the two good-scale scalar +comparisons used in the manuscript proof. -/ +theorem oneStepScalarWeightAtScale_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℕ) : + oneStepScalarWeightAtScale hP hStruct m = + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 := by + rfl + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/BetaBridge.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/BetaBridge.lean new file mode 100644 index 0000000000..c66f6a07fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/BetaBridge.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.GoodScaleInputs +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic + +/-! # Beta Bridge -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Beta bridge between Sections 5.3 and 5.4 + +The current Section 5.3 coarse-fluctuation proof uses half of the Section 5.4 +variance exponent. This file keeps that comparison local to the +one-step-contraction implementation slice. +-/ + +/-- The Section 5.3 and Section 5.4 beta cores are definitionally the same +minimum of manuscript exponent gaps. -/ +theorem section53CoarseFluctuationBetaCore_eq_section54VarianceBetaCore + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBetaCore hP4 = + VarianceBoundGoodScale.section54VarianceBetaCore hP4 := by + rfl + +/-- The current Section 5.3 beta is a fixed fraction of the Section 5.4 +variance beta. -/ +theorem section53CoarseFluctuationBeta_eq_quarter_section54VarianceBeta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 = + VarianceBoundGoodScale.section54VarianceBeta hP4 / 4 := by + unfold Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta + VarianceBoundGoodScale.section54VarianceBeta + rw [section53CoarseFluctuationBetaCore_eq_section54VarianceBetaCore hP4] + ring + +/-- The Section 5.3 beta is positive. -/ +theorem section53CoarseFluctuationBeta_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 := + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta_pos hP4 + +/-- The Section 5.3 beta is no larger than the Section 5.4 variance beta. -/ +theorem section53CoarseFluctuationBeta_le_section54VarianceBeta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 ≤ + VarianceBoundGoodScale.section54VarianceBeta hP4 := by + have hrel := section53CoarseFluctuationBeta_eq_quarter_section54VarianceBeta hP4 + have h54_nonneg : + 0 ≤ VarianceBoundGoodScale.section54VarianceBeta hP4 := + VarianceBoundGoodScale.section54VarianceBeta_nonneg hP4 + nlinarith + +/-- Section 5.4 variance weights are bounded by the slower Section 5.3 +coarse-fluctuation weights. -/ +theorem varianceWeight_section54VarianceBeta_le_section53CoarseFluctuationBeta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m j : ℕ) : + VarianceBoundGoodScale.varianceWeight + (VarianceBoundGoodScale.section54VarianceBeta hP4) m j ≤ + VarianceBoundGoodScale.varianceWeight + (Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) + m j := by + unfold VarianceBoundGoodScale.varianceWeight + have hβ := + section53CoarseFluctuationBeta_le_section54VarianceBeta hP4 + have hk_nonneg : 0 ≤ ((m - j : ℕ) : ℝ) := by positivity + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CenteredResponses.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CenteredResponses.lean new file mode 100644 index 0000000000..5a6668a225 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CenteredResponses.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RealAlgebra + +/-! # Centered Responses -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Centered-response identities for the one-step contraction + +This file proves the Section 5.4 special-vector bridge from the Section 5.2 +centered-response identities to the scalar contrast `Theta_m - 1`. +-/ + +private theorem vecDot_specialP_specialQ_eq_vecNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + vecDot (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) = + vecNormSq e := by + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hσ_pos : 0 < σ := by + simpa [σ] using GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + calc + vecDot (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) = + (σ ^ (-(1 / 2 : ℝ)) * σ ^ (1 / 2 : ℝ)) * vecNormSq e := by + simp [σ, specialPAtScale, specialQAtScale, vecDot_smul_left, + vecDot_smul_right, vecNormSq, mul_comm, mul_left_comm] + _ = vecNormSq e := by + rw [GoodScale.rpow_neg_half_mul_rpow_half_eq_one hσ_pos] + simp + +private theorem centeredResponseExpectationFormula_special_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) : + centeredResponseExpectationFormula hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) = + (1 / 2 : ℝ) * (thetaAtScale hP hStruct (m : ℤ) - 1) * + vecNormSq e := by + have hpq := vecDot_specialP_specialQ_eq_vecNormSq hP hStruct hP4 m e + rw [centeredResponseExpectationFormula_eq, vecDot_smul_right] + rw [hpq] + ring + +/-- Special-vector centered responses sum to `Theta_m - 1` for vectors with +unit squared norm. -/ +theorem thetaAtScale_sub_one_eq_centeredResponses_special_of_vecNormSq_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : vecNormSq e = 1) : + thetaAtScale hP hStruct (m : ℤ) - 1 = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) := by + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hcent := + Section52.centeredResponses_homogenizationScale hP hStruct hP4 m p_e q_e + have hformula : + centeredResponseExpectationFormula hP hStruct (m : ℤ) p_e q_e = + (1 / 2 : ℝ) * (thetaAtScale hP hStruct (m : ℤ) - 1) := by + have hraw := centeredResponseExpectationFormula_special_eq hP hStruct hP4 m e + simpa [p_e, q_e, he] using hraw + calc + thetaAtScale hP hStruct (m : ℤ) - 1 = + centeredResponseExpectationFormula hP hStruct (m : ℤ) p_e q_e + + centeredResponseExpectationFormula hP hStruct (m : ℤ) p_e q_e := by + rw [hformula] + ring + _ = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e + + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) p_e q_e := by + rw [hcent.1, hcent.2] + +/-- Special-vector centered responses sum to `Theta_m - 1` for unit vectors, +in the same norm convention used by the good-scale theorem. -/ +theorem thetaAtScale_sub_one_eq_centeredResponses_special + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : Ch02.vecNorm e = 1) : + thetaAtScale hP hStruct (m : ℤ) - 1 = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) := by + exact + thetaAtScale_sub_one_eq_centeredResponses_special_of_vecNormSq_eq_one + hP hStruct hP4 m e (GoodScale.vecNormSq_eq_one_of_vecNorm_eq_one he) + +/-- The centered adjoint response has the same expectation as the centered +primal response. This is the Section 5.2 identity in a rewrite-friendly form +for the one-step proof. -/ +theorem expectedCenteredResponseJStarAtScale_eq_expectedCenteredResponseJAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) + (p q : Vec d) : + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) p q = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p q := by + have hcent := + Section52.centeredResponses_homogenizationScale hP hStruct hP4 m p q + rw [hcent.1, hcent.2] + +/-- Special-vector form of the one-step centered-response identity using only +the primal centered response. -/ +theorem thetaAtScale_sub_one_eq_two_centeredResponse_special + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) (e : Vec d) + (he : Ch02.vecNorm e = 1) : + thetaAtScale hP hStruct (m : ℤ) - 1 = + 2 * + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) := by + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hsum := + thetaAtScale_sub_one_eq_centeredResponses_special hP hStruct hP4 m e he + have hstar : + expectedCenteredResponseJStarAtScale hP hStruct (m : ℤ) p_e q_e = + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := + expectedCenteredResponseJStarAtScale_eq_expectedCenteredResponseJAtScale + hP hStruct hP4 m p_e q_e + rw [hsum, hstar] + ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFluctuationInput.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFluctuationInput.lean new file mode 100644 index 0000000000..0b24c2511a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFluctuationInput.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations + +/-! # Coarse Fluctuation Input -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Section 5.3 input for the one-step contraction + +This file is the narrow bridge from the public Section 5.3 +coarse-fluctuation lemma to the `k = 0` special-vector estimate used in the +Section 5.4 one-step contraction proof. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +/-- The public Section 5.3 coarse-fluctuation lemma, specialized to `k = 0` +and to the Section 5.4 unit-vector convention, with the constant chosen from +the fixed `(P4)` parameters before the law is introduced. -/ +theorem exists_expectedCenteredResponseJAtScale_special_le_coarseFluctuationRHS_zero_uniform + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {m : ℕ}, 0 < m → ∀ e : Vec d, Ch02.vecNorm e = 1 → + ∀ {ε : ℝ}, 0 < ε → ε ≤ 1 → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e ≤ + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε 0 m e := by + rcases JUpperBoundCoarseFluctuations_homogenizationScale + params with ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 hparams m hm_pos e he ε hε hε_le + exact hC hP hStruct.stationary hStruct hP4 hparams + (k := 0) (m := m) (by simpa using hm_pos) + e (GoodScale.vecNormSq_eq_one_of_vecNorm_eq_one he) (ε := ε) hε hε_le + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFullBlock.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFullBlock.lean new file mode 100644 index 0000000000..b09cbe0aea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseFullBlock.lean @@ -0,0 +1,742 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep + +/-! # Coarse Full Block -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Section 5.3-beta full-block fluctuation sums + +The public variance lemma uses the Section 5.4 beta. The Section 5.3 +coarse-fluctuation RHS uses the slower quarter-beta, so the one-step proof +needs the same refined budget argument with that beta. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +private theorem section53CoarseFluctuationBeta_lt_dim_div_two + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section53CoarseFluctuationBeta hP4 < (d : ℝ) / 2 := by + have hbeta_le := section53CoarseFluctuationBeta_le_sUpper hP4 + have hupper_lt : hP4.sUpper < 1 := hP4.sUpper_lt_one + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + nlinarith + +private theorem lpVarianceDecay_gap_pos_section53 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < VarianceBoundGoodScale.lpVarianceDecay d hP4 - + section53CoarseFluctuationBeta hP4 := by + have hbeta := section53CoarseFluctuationBeta_lt_dim_div_two hP4 + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast hP4.two_le_xi + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdiv_le : (d : ℝ) / (hP4.xi : ℝ) ≤ (d : ℝ) / 2 := by + exact div_le_div_of_nonneg_left hd_nonneg (by norm_num) hxi_two + dsimp [VarianceBoundGoodScale.lpVarianceDecay] + nlinarith + +private theorem sqrtVarianceDecay_gap_pos_section53 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < VarianceBoundGoodScale.sqrtVarianceDecay d - + section53CoarseFluctuationBeta hP4 := by + simpa [VarianceBoundGoodScale.sqrtVarianceDecay] using + section53CoarseFluctuationBeta_lt_dim_div_two hP4 + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +/-- Linear constant for refined pair budgets summed with the Section 5.3 +beta. -/ +noncomputable def oneStepCoarsePairLinearBudgetConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + (geometricDiscount + (VarianceBoundGoodScale.lpVarianceDecay d hP4 - + section53CoarseFluctuationBeta hP4) 1)⁻¹ + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + (geometricDiscount + (VarianceBoundGoodScale.sqrtVarianceDecay d - + section53CoarseFluctuationBeta hP4) 1)⁻¹) + +theorem oneStepCoarsePairLinearBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ oneStepCoarsePairLinearBudgetConst hP4 := by + unfold oneStepCoarsePairLinearBudgetConst + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hdiscLp : + 0 ≤ (geometricDiscount + (VarianceBoundGoodScale.lpVarianceDecay d hP4 - + section53CoarseFluctuationBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos + (by simpa using lpVarianceDecay_gap_pos_section53 hP4)).le + have hdiscSqrt : + 0 ≤ (geometricDiscount + (VarianceBoundGoodScale.sqrtVarianceDecay d - + section53CoarseFluctuationBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos + (by simpa using sqrtVarianceDecay_gap_pos_section53 hP4)).le + positivity + +theorem pairPointwiseBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 := by + unfold VarianceBoundGoodScale.pairPointwiseBudgetConst + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + +/-- Constant controlling the Section 5.3-beta refined scalar budget. -/ +noncomputable def oneStepWeightedRefinedBudgetConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ + + 2 * oneStepCoarsePairLinearBudgetConst hP4 + + 2 * VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 * + oneStepCoarsePairLinearBudgetConst hP4 + +/-- The Section 5.3-beta refined scalar budget constant is nonnegative. -/ +theorem oneStepWeightedRefinedBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ oneStepWeightedRefinedBudgetConst hP4 := by + unfold oneStepWeightedRefinedBudgetConst + have hG : + 0 ≤ (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos + (by simpa using section53CoarseFluctuationBeta_pos hP4)).le + have hL : 0 ≤ oneStepCoarsePairLinearBudgetConst hP4 := + oneStepCoarsePairLinearBudgetConst_nonneg hP4 + have hM : 0 ≤ VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 := + pairPointwiseBudgetConst_nonneg hP4 + positivity + +/-- Final constant for the Section 5.3-beta full-block fluctuation sum. -/ +noncomputable def oneStepCoarseFullBlockConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 3 * + (VarianceBoundGoodScale.refinedMatrixBudgetConst d * + oneStepWeightedRefinedBudgetConst hP4) + +theorem oneStepCoarseFullBlockConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ oneStepCoarseFullBlockConst hP4 := by + unfold oneStepCoarseFullBlockConst + have hM : 0 ≤ VarianceBoundGoodScale.refinedMatrixBudgetConst d := by + unfold VarianceBoundGoodScale.refinedMatrixBudgetConst + positivity + have hB : 0 ≤ oneStepWeightedRefinedBudgetConst hP4 := + oneStepWeightedRefinedBudgetConst_nonneg hP4 + positivity + +theorem sum_Icc_varianceWeight_mul_pairProbeRefinedK_le_section53 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight + (section53CoarseFluctuationBeta hP4) m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + oneStepCoarsePairLinearBudgetConst hP4 * + widetildeThetaAtScale P 0 hP4 * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) := by + let β := section53CoarseFluctuationBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let Lp := Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + let Sqrt := Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi + let γLp := VarianceBoundGoodScale.lpVarianceDecay d hP4 + let γSqrt := VarianceBoundGoodScale.sqrtVarianceDecay d + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let GLp := (geometricDiscount (γLp - β) 1)⁻¹ + let GSqrt := (geometricDiscount (γSqrt - β) 1)⁻¹ + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hLp_nonneg : 0 ≤ Lp := by + dsimp [Lp] + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Sqrt := by + dsimp [Sqrt] + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hsumLp : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + Real.rpow (3 : ℝ) (-γLp * (j : ℝ))) ≤ + D * GLp := by + simpa [β, γLp, D, GLp] using + VarianceBoundGoodScale.sum_Icc_varianceWeight_mul_rpow_decay_le + (β := section53CoarseFluctuationBeta hP4) + (γ := VarianceBoundGoodScale.lpVarianceDecay d hP4) + (lpVarianceDecay_gap_pos_section53 hP4) m + have hsumSqrt : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ))) ≤ + D * GSqrt := by + simpa [β, γSqrt, D, GSqrt, mul_comm, mul_left_comm, mul_assoc] using + VarianceBoundGoodScale.sum_Icc_varianceWeight_mul_rpow_decay_le + (β := section53CoarseFluctuationBeta hP4) + (γ := VarianceBoundGoodScale.sqrtVarianceDecay d) + (sqrtVarianceDecay_gap_pos_section53 hP4) m + have hterm : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * + (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ)) + + Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (by + simpa [β, θ, Lp, Sqrt, γLp, γSqrt] using + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK_le_geometric + hP4 hdelta_le_half j) + (VarianceBoundGoodScale.varianceWeight_nonneg β m j) + _ = + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + have hLp_part : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) ≤ + 16 * θ * (Lp * (D * GLp)) := by + have hLp_sum := mul_le_mul_of_nonneg_left hsumLp hLp_nonneg + have hscaled := mul_le_mul_of_nonneg_left hLp_sum + (show 0 ≤ 16 * θ from mul_nonneg (by norm_num) hθ) + simpa [Finset.mul_sum, mul_comm, mul_left_comm, mul_assoc] using hscaled + have hSqrt_part : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ))))) ≤ + 16 * θ * (Sqrt * (D * GSqrt)) := by + have hSqrt_sum := mul_le_mul_of_nonneg_left hsumSqrt hSqrt_nonneg + have hscaled := mul_le_mul_of_nonneg_left hSqrt_sum + (show 0 ≤ 16 * θ from mul_nonneg (by norm_num) hθ) + simpa [Finset.mul_sum, mul_comm, mul_left_comm, mul_assoc] using hscaled + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := hterm + _ ≤ + 16 * θ * (Lp * (D * GLp)) + + 16 * θ * (Sqrt * (D * GSqrt)) := + add_le_add hLp_part hSqrt_part + _ = + oneStepCoarsePairLinearBudgetConst hP4 * + widetildeThetaAtScale P 0 hP4 * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) := by + simp [oneStepCoarsePairLinearBudgetConst, β, θ, Lp, Sqrt, γLp, γSqrt, + D, GLp, GSqrt] + ring + +theorem sum_Icc_varianceWeight_mul_pairProbeRefinedK_sq_le_section53 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight + (section53CoarseFluctuationBeta hP4) m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 * + oneStepCoarsePairLinearBudgetConst hP4 * + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) := by + let β := section53CoarseFluctuationBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let M := VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 + let L := oneStepCoarsePairLinearBudgetConst hP4 + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hM_nonneg : 0 ≤ M := by + simpa [M] using pairPointwiseBudgetConst_nonneg hP4 + have hlinear := + sum_Icc_varianceWeight_mul_pairProbeRefinedK_le_section53 hP4 hdelta_le_half m + have hterm : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + ((M * θ) * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hK_nonneg := + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK_nonneg + hP4 hdelta_nonneg j + have hK_le : + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ≤ + M * θ := by + simpa [M, θ] using + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK_le_pointwiseConst + hP4 hdelta_le_half j + have hsq : + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) ≤ + (M * θ) * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j := by + rw [sq] + exact mul_le_mul_of_nonneg_right hK_le hK_nonneg + exact mul_le_mul_of_nonneg_left hsq + (VarianceBoundGoodScale.varianceWeight_nonneg β m j) + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + ((M * θ) * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) := hterm + _ = + (M * θ) * + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ ≤ + (M * θ) * (L * θ * D) := by + exact mul_le_mul_of_nonneg_left + (by simpa [β, θ, L, D] using hlinear) + (mul_nonneg hM_nonneg hθ) + _ = + VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 * + oneStepCoarsePairLinearBudgetConst hP4 * + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) := by + simp [M, L, θ, D, β] + ring + +private theorem sum_Icc_varianceWeight_mul_refinedVarianceBasicBudget_le_section53 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight + (section53CoarseFluctuationBeta hP4) m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) ≤ + oneStepWeightedRefinedBudgetConst hP4 * + (delta + + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ))) := by + let β := section53CoarseFluctuationBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let C := oneStepWeightedRefinedBudgetConst hP4 + let L := oneStepCoarsePairLinearBudgetConst hP4 + let M := VarianceBoundGoodScale.pairPointwiseBudgetConst hP4 + let Gβ := (geometricDiscount β 1)⁻¹ + have hδ_nonneg : 0 ≤ delta := hdelta_pos.le + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hD : 0 ≤ D := by + dsimp [D] + exact Real.rpow_nonneg (by norm_num) _ + have hC_nonneg : 0 ≤ C := by + simpa [C] using oneStepWeightedRefinedBudgetConst_nonneg hP4 + have hL_nonneg : 0 ≤ L := by + simpa [L] using oneStepCoarsePairLinearBudgetConst_nonneg hP4 + have hM_nonneg : 0 ≤ M := by + simpa [M] using pairPointwiseBudgetConst_nonneg hP4 + have hG_nonneg : 0 ≤ Gβ := by + dsimp [Gβ, β] + exact inv_nonneg.mpr + (geometricDiscount_pos + (by simpa using section53CoarseFluctuationBeta_pos hP4)).le + have hC_ge_G : Gβ ≤ C := by + dsimp [C, Gβ, oneStepWeightedRefinedBudgetConst] + nlinarith [hL_nonneg, hM_nonneg] + have hC_ge_2L : 2 * L ≤ C := by + dsimp [C, L, Gβ, oneStepWeightedRefinedBudgetConst] + nlinarith [hG_nonneg, hL_nonneg, hM_nonneg] + have hC_ge_2ML : 2 * M * L ≤ C := by + dsimp [C, M, L, Gβ, oneStepWeightedRefinedBudgetConst] + nlinarith [hG_nonneg, hL_nonneg, hM_nonneg] + have hbudgetTerm : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (delta + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (VarianceBoundGoodScale.refinedVarianceBasicBudget_le_pairBudget hP4 hδ_nonneg j) + (VarianceBoundGoodScale.varianceWeight_nonneg β m j) + have hconst : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * delta) ≤ Gβ * delta := by + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * delta) = + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) * delta := by + rw [Finset.sum_mul] + _ ≤ Gβ * delta := by + exact mul_le_mul_of_nonneg_right + (by + simpa [β, Gβ] using + VarianceBoundGoodScale.sum_Icc_varianceWeight_le_inv_geometricDiscount + (section53CoarseFluctuationBeta_pos hP4) m) + hδ_nonneg + have hlinear : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + L * θ * D := by + simpa [β, L, θ, D] using + sum_Icc_varianceWeight_mul_pairProbeRefinedK_le_section53 + hP4 hdelta_le_half m + have hsquare : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ)) ≤ + M * L * θ ^ (2 : ℕ) * D := by + simpa [β, M, L, θ, D] using + sum_Icc_varianceWeight_mul_pairProbeRefinedK_sq_le_section53 + hP4 hδ_nonneg hdelta_le_half m + have hsum : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (delta + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ))) ≤ + Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) := by + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (delta + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ))) = + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * delta) + + 2 * + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ)) := by + rw [show + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (delta + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ))) = + (∑ j ∈ Finset.Icc 1 m, + (VarianceBoundGoodScale.varianceWeight β m j * delta + + 2 * (VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * (VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ)))) by + refine Finset.sum_congr rfl ?_ + intro j hj + ring] + rw [Finset.sum_add_distrib, Finset.sum_add_distrib] + rw [Finset.mul_sum, Finset.mul_sum] + _ ≤ Gβ * delta + 2 * (L * θ * D) + + 2 * (M * L * θ ^ (2 : ℕ) * D) := by + nlinarith + have htail_nonneg : 0 ≤ θ + θ ^ (2 : ℕ) := add_nonneg hθ (sq_nonneg θ) + have hinside_nonneg : + 0 ≤ delta + D * (θ + θ ^ (2 : ℕ)) := + add_nonneg hδ_nonneg (mul_nonneg hD htail_nonneg) + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (delta + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * + VarianceBoundGoodScale.pairProbeRefinedDescendantAverageK hP4 delta j ^ + (2 : ℕ)) := hbudgetTerm + _ ≤ Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) := + hsum + _ ≤ C * (delta + D * (θ + θ ^ (2 : ℕ))) := by + calc + Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) ≤ + C * delta + C * (D * θ) + C * (D * θ ^ (2 : ℕ)) := by + have h1 := mul_le_mul_of_nonneg_right hC_ge_G hδ_nonneg + have h2 := mul_le_mul_of_nonneg_right hC_ge_2L (mul_nonneg hθ hD) + have h3 := mul_le_mul_of_nonneg_right hC_ge_2ML + (mul_nonneg (sq_nonneg θ) hD) + nlinarith + _ = C * (delta + D * (θ + θ ^ (2 : ℕ))) := by ring + +/-- The Section 5.3-beta full-block fluctuation sum is controlled by the +refined scalar budget at a good scale. -/ +theorem oneStepCoarseFullBlockSumAtScale_le_budget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m ≤ + VarianceBoundGoodScale.refinedMatrixBudgetConst d * + (oneStepWeightedRefinedBudgetConst hP4 * + (delta + + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ)))) := by + let β := section53CoarseFluctuationBeta hP4 + let M := VarianceBoundGoodScale.refinedMatrixBudgetConst d + have hdelta_nonneg : 0 ≤ delta := hdelta_pos.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + unfold VarianceBoundGoodScale.refinedMatrixBudgetConst + positivity + have hsum_matrix : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedMatrixVarianceScaleBound hP4 delta j) ≤ + M * + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) := by + calc + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedMatrixVarianceScaleBound hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + (M * VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (by + simpa [M] using + VarianceBoundGoodScale.refinedMatrixVarianceScaleBound_le_basicBudget + hP4 hdelta_nonneg (by linarith) j) + (VarianceBoundGoodScale.varianceWeight_nonneg β m j) + _ = + M * + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + have hsum_budget : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) ≤ + oneStepWeightedRefinedBudgetConst hP4 * + (delta + + Real.rpow (3 : ℝ) (-(β) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ))) := by + simpa [β] using + sum_Icc_varianceWeight_mul_refinedVarianceBasicBudget_le_section53 + hP4 hdelta_pos hdelta_le_half m + calc + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m = + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P := by + simp [oneStepCoarseFullBlockSumAtScale, β] + _ ≤ + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedMatrixVarianceScaleBound hP4 delta j := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_refinedMatrixVarianceScaleBound + hP hStruct hP4 hdelta_nonneg m j (Finset.mem_Icc.mp hj).2 + hgood_upper hgood_lower) + (VarianceBoundGoodScale.varianceWeight_nonneg β m j) + _ ≤ M * + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + VarianceBoundGoodScale.refinedVarianceBasicBudget hP4 delta j) := + hsum_matrix + _ ≤ + M * + (oneStepWeightedRefinedBudgetConst hP4 * + (delta + + Real.rpow (3 : ℝ) (-(β) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ)))) := + mul_le_mul_of_nonneg_left hsum_budget hM_nonneg + +/-- Under the one-step logarithmic scale separation, the Section 5.3-beta +full-block fluctuation sum is `O(sqrt(delta))`. -/ +theorem oneStepCoarseFullBlockSumAtScale_le_sqrt_delta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (hsep : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m ≤ + oneStepCoarseFullBlockConst hP4 * Real.sqrt delta := by + let θ := widetildeThetaAtScale P 0 hP4 + let D := + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) + let M := VarianceBoundGoodScale.refinedMatrixBudgetConst d + let B := oneStepWeightedRefinedBudgetConst hP4 + have hM_nonneg : 0 ≤ M := by + dsimp [M] + unfold VarianceBoundGoodScale.refinedMatrixBudgetConst + positivity + have hB_nonneg : 0 ≤ B := by + simpa [B] using oneStepWeightedRefinedBudgetConst_nonneg hP4 + have hMB_nonneg : 0 ≤ M * B := mul_nonneg hM_nonneg hB_nonneg + have hsqrt_nonneg : 0 ≤ Real.sqrt delta := Real.sqrt_nonneg delta + have hbudget := + oneStepCoarseFullBlockSumAtScale_le_budget + hP hStruct hP4 hdelta_pos hdelta_le_half m hgood_upper hgood_lower + have habsorb : + D * (θ + θ ^ (2 : ℕ)) ≤ 2 * Real.sqrt delta := by + simpa [D, θ] using + oneStepScaleSeparation_absorbs_section53Beta_widetildeThetaBudget + hP4 hC hdelta_pos hdelta_le_half hsep + have hdelta_le_sqrt : + delta ≤ Real.sqrt delta := + delta_le_sqrt_of_pos_of_le_half hdelta_pos hdelta_le_half + have hinside : + delta + D * (θ + θ ^ (2 : ℕ)) ≤ 3 * Real.sqrt delta := by + nlinarith + calc + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m ≤ + M * (B * (delta + D * (θ + θ ^ (2 : ℕ)))) := by + simpa [M, B, D, θ, mul_assoc] using hbudget + _ = (M * B) * (delta + D * (θ + θ ^ (2 : ℕ))) := by ring + _ ≤ (M * B) * (3 * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hinside hMB_nonneg + _ = oneStepCoarseFullBlockConst hP4 * Real.sqrt delta := by + simp [oneStepCoarseFullBlockConst, M, B] + ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseRHSPrep.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseRHSPrep.lean new file mode 100644 index 0000000000..579af7f272 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/CoarseRHSPrep.lean @@ -0,0 +1,389 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.BetaBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.TauSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Assembly + +/-! # Coarse RHSPrep -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Preparing the Section 5.3 coarse-fluctuation RHS + +This file records the pieces of the final one-step contraction assembly that +can be proved before the final Section 5.3 estimate lands. The dependencies +on Section 5.3 remain local to the one-step-contraction directory. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +/-- The scalar weight in the Section 5.3 coarse-fluctuation RHS is exactly the +one used by the Section 5.4 one-step contraction proof. -/ +theorem coarseFluctuationScalarWeightAtScale_eq_oneStepScalarWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (m : ℕ) : + coarseFluctuationScalarWeightAtScale hP hStruct m = + oneStepScalarWeightAtScale hP hStruct m := by + rfl + +private theorem int_toNat_nat_sub_of_le {j m : ℕ} (hjm : j ≤ m) : + Int.toNat ((m : ℤ) - (j : ℤ)) = m - j := by + have hnonneg : 0 ≤ (m : ℤ) - (j : ℤ) := by + omega + have hto : + ((Int.toNat ((m : ℤ) - (j : ℤ)) : ℕ) : ℤ) = + (m : ℤ) - (j : ℤ) := + Int.toNat_of_nonneg hnonneg + have hsub : ((m - j : ℕ) : ℤ) = (m : ℤ) - (j : ℤ) := by + omega + exact Int.ofNat.inj (hto.trans hsub.symm) + +private theorem sum_int_Icc_one_nat_eq_sum_nat_Icc (m : ℕ) (F : ℤ → ℝ) : + (∑ n ∈ Finset.Icc (1 : ℤ) (m : ℤ), F n) = + ∑ j ∈ Finset.Icc 1 m, F (j : ℤ) := by + classical + refine + Finset.sum_bij' + (fun n _hn => Int.toNat n) + (fun j _hj => (j : ℤ)) ?_ ?_ ?_ ?_ ?_ + · intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by linarith + have hto : ((Int.toNat n : ℕ) : ℤ) = n := + Int.toNat_of_nonneg hn_nonneg + exact Finset.mem_Icc.mpr + ⟨by + have hcast : (1 : ℤ) ≤ ((Int.toNat n : ℕ) : ℤ) := by + simpa [hto] using hn_bounds.1 + exact_mod_cast hcast, + by + have hcast : ((Int.toNat n : ℕ) : ℤ) ≤ (m : ℤ) := by + simpa [hto] using hn_bounds.2 + exact_mod_cast hcast⟩ + · intro j hj + have hj_bounds := Finset.mem_Icc.mp hj + exact Finset.mem_Icc.mpr + ⟨by + change (1 : ℤ) ≤ (j : ℤ) + exact_mod_cast hj_bounds.1, + by + change (j : ℤ) ≤ (m : ℤ) + exact_mod_cast hj_bounds.2⟩ + · intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by linarith + exact Int.toNat_of_nonneg hn_nonneg + · intro j _hj + simp + · intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by linarith + rw [Int.toNat_of_nonneg hn_nonneg] + +/-- The Section 5.3-beta tau sum, reindexed over natural lower scales. -/ +noncomputable def oneStepCoarseTauSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e + +/-- At `k = 0`, the Section 5.3 tau sum is the natural-scale sum used by the +one-step proof, with the Section 5.3 beta. -/ +theorem coarseFluctuationTauSumAtScale_zero_eq_oneStepCoarseTauSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) : + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e = + oneStepCoarseTauSumAtScale hP hStruct hP4 m e := by + classical + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + unfold coarseFluctuationTauSumAtScale oneStepCoarseTauSumAtScale + dsimp only + rw [show ((0 : ℕ) : ℤ) + 1 = (1 : ℤ) by norm_num] + rw [sum_int_Icc_one_nat_eq_sum_nat_Icc] + refine Finset.sum_congr rfl ?_ + intro j hj + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + simp [VarianceBoundGoodScale.varianceWeight, int_toNat_nat_sub_of_le hjm] + +/-- The Section 5.3-beta full-block fluctuation sum, reindexed over natural +lower scales. -/ +noncomputable def oneStepCoarseFullBlockSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + ∫ a, + fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P + +/-- At `k = 0`, the Section 5.3 full-block fluctuation sum is the natural-scale +sum used by the one-step proof, with the Section 5.3 beta. -/ +theorem coarseFluctuationFullBlockSumAtScale_zero_eq_oneStepCoarseFullBlockSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m = + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m := by + classical + let β := section53CoarseFluctuationBeta hP4 + unfold coarseFluctuationFullBlockSumAtScale oneStepCoarseFullBlockSumAtScale + dsimp only + rw [show ((0 : ℕ) : ℤ) + 1 = (1 : ℤ) by norm_num] + rw [sum_int_Icc_one_nat_eq_sum_nat_Icc] + refine Finset.sum_congr rfl ?_ + intro j hj + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + simp [VarianceBoundGoodScale.varianceWeight, int_toNat_nat_sub_of_le hjm] + +/-- The reindexed Section 5.3-beta full-block fluctuation sum is +nonnegative. -/ +theorem oneStepCoarseFullBlockSumAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m := by + unfold oneStepCoarseFullBlockSumAtScale + refine VarianceBoundGoodScale.sum_Icc_varianceWeight_mul_nonneg ?_ + intro j _hj + exact integral_nonneg fun a => + by + simpa using! + VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a + +/-- The harmless geometric constant for the Section 5.3-beta tau sum. -/ +noncomputable def oneStepCoarseTauSumConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 3 * (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ + +/-- The Section 5.3-beta tau-sum constant is nonnegative. -/ +theorem oneStepCoarseTauSumConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ oneStepCoarseTauSumConst hP4 := by + unfold oneStepCoarseTauSumConst + have hgeo : 0 < geometricDiscount (section53CoarseFluctuationBeta hP4) 1 := + geometricDiscount_pos (by simpa using section53CoarseFluctuationBeta_pos hP4) + positivity + +/-- At a good scale, the Section 5.3-beta tau sum is bounded by the +geometric tail times `delta * sqrt(Theta_0)`. -/ +theorem oneStepCoarseTauSumAtScale_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + oneStepCoarseTauSumAtScale hP hStruct hP4 m e ≤ + (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ * + (delta * Real.sqrt (thetaAtScale hP hStruct 0)) := by + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let K := delta * Real.sqrt (thetaAtScale hP hStruct 0) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg hdelta_pos.le (Real.sqrt_nonneg _) + have hpoint : + ∀ j, j ∈ Finset.Icc 1 m → + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e ≤ K := by + intro j hj + have hj_le : j ≤ m := (Finset.mem_Icc.mp hj).2 + simpa [p_e, q_e, K] using + goodScale_tau_le hP hStruct hP4 hdelta_pos hdelta_le + (m := m) (j := j) hj_le hgood_upper hgood_lower e he + have hsum_const : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e) ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) * K := + VarianceBoundGoodScale.sum_Icc_varianceWeight_mul_le_const_mul + (β := β) (C := K) (m := m) + (f := fun j => tauAtScale P (m : ℤ) (j : ℤ) p_e q_e) hpoint + have hweights : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) ≤ + (geometricDiscount β 1)⁻¹ := + VarianceBoundGoodScale.sum_Icc_varianceWeight_le_inv_geometricDiscount + (by simpa [β] using section53CoarseFluctuationBeta_pos hP4) m + calc + oneStepCoarseTauSumAtScale hP hStruct hP4 m e = + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e := by + simp [oneStepCoarseTauSumAtScale, β, p_e, q_e] + _ ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) * K := + hsum_const + _ ≤ (geometricDiscount β 1)⁻¹ * K := + mul_le_mul_of_nonneg_right hweights hK_nonneg + _ = + (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ * + (delta * Real.sqrt (thetaAtScale hP hStruct 0)) := by + rfl + +/-- At a good scale, the scalar-weighted Section 5.3 tau sum at `k = 0` is +`O(delta * Theta_0)`. -/ +theorem coarseFluctuationScalarWeight_mul_tauSum_zero_le_delta_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e ≤ + oneStepCoarseTauSumConst hP4 * delta * thetaAtScale hP hStruct 0 := by + let θ0 := thetaAtScale hP hStruct 0 + let sqrtθ0 := Real.sqrt θ0 + let B := (geometricDiscount (section53CoarseFluctuationBeta hP4) 1)⁻¹ + have hscalar_nonneg : + 0 ≤ oneStepScalarWeightAtScale hP hStruct m := + oneStepScalarWeightAtScale_nonneg hP hStruct hP4 m + have hscalar_le : + oneStepScalarWeightAtScale hP hStruct m ≤ 3 * sqrtθ0 := by + simpa [sqrtθ0] using! + goodScale_oneStepScalarWeight_le hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have htau_le : + oneStepCoarseTauSumAtScale hP hStruct hP4 m e ≤ + B * (delta * sqrtθ0) := by + simpa [B, sqrtθ0] using! + oneStepCoarseTauSumAtScale_le hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have hB_nonneg : 0 ≤ B := by + dsimp [B] + have hgeo : 0 < geometricDiscount (section53CoarseFluctuationBeta hP4) 1 := + geometricDiscount_pos (by simpa using section53CoarseFluctuationBeta_pos hP4) + positivity + have htau_bound_nonneg : 0 ≤ B * (delta * sqrtθ0) := by + exact mul_nonneg hB_nonneg + (mul_nonneg hdelta_pos.le (by dsimp [sqrtθ0]; exact Real.sqrt_nonneg _)) + have htheta_nonneg : 0 ≤ θ0 := by + dsimp [θ0] + exact le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hsqrt_sq : sqrtθ0 * sqrtθ0 = θ0 := by + dsimp [sqrtθ0] + exact Real.mul_self_sqrt htheta_nonneg + calc + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e = + oneStepScalarWeightAtScale hP hStruct m * + oneStepCoarseTauSumAtScale hP hStruct hP4 m e := by + rw [coarseFluctuationScalarWeightAtScale_eq_oneStepScalarWeightAtScale, + coarseFluctuationTauSumAtScale_zero_eq_oneStepCoarseTauSumAtScale] + _ ≤ + oneStepScalarWeightAtScale hP hStruct m * + (B * (delta * sqrtθ0)) := + mul_le_mul_of_nonneg_left htau_le hscalar_nonneg + _ ≤ (3 * sqrtθ0) * (B * (delta * sqrtθ0)) := + mul_le_mul_of_nonneg_right hscalar_le htau_bound_nonneg + _ = 3 * B * delta * (sqrtθ0 * sqrtθ0) := by ring + _ = 3 * B * delta * θ0 := by rw [hsqrt_sq] + _ = oneStepCoarseTauSumConst hP4 * delta * + thetaAtScale hP hStruct 0 := by + simp [oneStepCoarseTauSumConst, B, θ0] + +/-- At a good scale, the scalar-weighted Section 5.3 tau sum at `k = 0` is +also `O(sqrt(delta) * Theta_0)`. -/ +theorem coarseFluctuationScalarWeight_mul_tauSum_zero_le_sqrt_delta_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e ≤ + oneStepCoarseTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + have hdelta_le_sqrt : + delta ≤ Real.sqrt delta := + delta_le_sqrt_of_pos_of_le_half hdelta_pos hdelta_le + have hC_nonneg : 0 ≤ oneStepCoarseTauSumConst hP4 := + oneStepCoarseTauSumConst_nonneg hP4 + have htheta_nonneg : + 0 ≤ thetaAtScale hP hStruct 0 := + le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + calc + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e ≤ + oneStepCoarseTauSumConst hP4 * delta * + thetaAtScale hP hStruct 0 := + coarseFluctuationScalarWeight_mul_tauSum_zero_le_delta_theta + hP hStruct hP4 hdelta_pos hdelta_le hgood_upper hgood_lower e he + _ ≤ oneStepCoarseTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + calc + oneStepCoarseTauSumConst hP4 * delta * + thetaAtScale hP hStruct 0 = + (oneStepCoarseTauSumConst hP4 * + thetaAtScale hP hStruct 0) * delta := by + ring + _ ≤ (oneStepCoarseTauSumConst hP4 * + thetaAtScale hP hStruct 0) * Real.sqrt delta := + mul_le_mul_of_nonneg_left hdelta_le_sqrt + (mul_nonneg hC_nonneg htheta_nonneg) + _ = oneStepCoarseTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/GoodScaleInputs.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/GoodScaleInputs.lean new file mode 100644 index 0000000000..83f500c2f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/GoodScaleInputs.lean @@ -0,0 +1,192 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CenteredResponses + +/-! # Good Scale Inputs -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Good-scale inputs for the one-step contraction + +This file repackages the public good-scale parameter bounds into the exact +pieces consumed by the one-step contraction proof. +-/ + +/-- At a good scale, the unit-scale annealed response for the special vectors +is controlled by `sqrt(Theta_0)`. -/ +theorem goodScale_J_zero_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.annealedResponseJAtScale P (0 : ℤ) p_e q_e ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + dsimp only + have hGS := + GoodScale.goodScaleParameterBounds_homogenizationScale + hP hStruct hP4 hdelta_pos hdelta_le m hgood_upper hgood_lower e he + exact (hGS.2.2.2.2.2 0 (Nat.zero_le m)).1 + +/-- At a good scale, all lower-scale additivity defects for the special +vectors are controlled by `delta * sqrt(Theta_0)`. -/ +theorem goodScale_tau_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m j : ℕ} (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e ≤ + delta * Real.sqrt (thetaAtScale hP hStruct 0) := by + dsimp only + have hGS := + GoodScale.goodScaleParameterBounds_homogenizationScale + hP hStruct hP4 hdelta_pos hdelta_le m hgood_upper hgood_lower e he + exact (hGS.2.2.2.2.2 j hj).2 + +/-- Good-scale upper scalar-chain comparison in the normalized variables. -/ +theorem goodScale_sigmaHat_inv_barSigma_zero_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + have hGS := + GoodScale.goodScaleParameterBounds_homogenizationScale + hP hStruct hP4 hdelta_pos hdelta_le m hgood_upper hgood_lower e he + exact hGS.2.2.2.1 + +/-- Good-scale lower scalar-chain comparison in the normalized variables. -/ +theorem goodScale_sigmaHat_barSigmaStar_zero_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + have hGS := + GoodScale.goodScaleParameterBounds_homogenizationScale + hP hStruct hP4 hdelta_pos hdelta_le m hgood_upper hgood_lower e he + exact hGS.2.2.2.2.1 + +/-- The scalar weight multiplying the tau sum is bounded by a harmless +constant times `sqrt(Theta_0)` at a good scale. -/ +theorem goodScale_oneStepScalarWeight_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + oneStepScalarWeightAtScale hP hStruct m ≤ + 3 * Real.sqrt (thetaAtScale hP hStruct 0) := by + have hupper := + goodScale_sigmaHat_inv_barSigma_zero_le + hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have hlower := + goodScale_sigmaHat_barSigmaStar_zero_inv_le + hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have hsqrt_nonneg : 0 ≤ Real.sqrt (thetaAtScale hP hStruct 0) := + Real.sqrt_nonneg _ + calc + oneStepScalarWeightAtScale hP hStruct m = + sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct 0 := rfl + _ ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) + + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := + add_le_add hlower hupper + _ = (2 * (1 + delta)) * Real.sqrt (thetaAtScale hP hStruct 0) := by + ring + _ ≤ 3 * Real.sqrt (thetaAtScale hP hStruct 0) := by + have hcoeff : 2 * (1 + delta) ≤ 3 := by nlinarith + exact mul_le_mul_of_nonneg_right hcoeff hsqrt_nonneg + +/-- At scale zero, `(P4)` implies `Theta_0 >= 1`. -/ +theorem one_le_thetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 0 + +/-- At scale zero, `sqrt(Theta_0) <= Theta_0`. -/ +theorem sqrt_thetaAtScale_zero_le_thetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + Real.sqrt (thetaAtScale hP hStruct (0 : ℤ)) ≤ + thetaAtScale hP hStruct (0 : ℤ) := by + have htheta := one_le_thetaAtScale_zero_of_P4 hP hStruct hP4 + exact (Real.sqrt_le_iff).2 + ⟨le_trans zero_le_one htheta, by nlinarith [htheta]⟩ + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RHSCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RHSCompression.lean new file mode 100644 index 0000000000..bd2e79f1b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RHSCompression.lean @@ -0,0 +1,980 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFluctuationInput +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseFullBlock +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ResponseMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression + +/-! # RHSCompression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Compressing the Section 5.3 RHS at a good scale + +This file turns the public Section 5.3 coarse-fluctuation RHS, specialized to +`k = 0` and to the Section 5.4 special vectors, into the one-step scale +quantity `(\epsilon + \epsilon^{-1}\sqrt\delta) \Theta_0`. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +private theorem expectedResponseJCubeSet_nonneg + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (Q : TriadicCube d) (p q : Vec d) : + 0 ≤ Ch04.expectedResponseJCubeSet P Q p q := by + dsimp [Ch04.expectedResponseJCubeSet] + exact integral_nonneg fun a => by + exact Ch04.restrictionResponseJObservableCubeSet_nonneg Q p q a + +theorem thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := by + have hξ_one : 1 ≤ hP4.xi := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + exact + Section52.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hP hStruct hP4 + (fun n => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 n) + 0 + +private theorem sigmaHatAtScale_le_LambdaMomentAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + sigmaHatAtScale hP hStruct (m : ℤ) ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + let b_m := hP.barSigmaAtScale hStruct (m : ℤ) + let c_m := hP.barSigmaStarAtScale hStruct (m : ℤ) + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + have hb_m_pos : 0 < b_m := by + simpa [b_m] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc_m_le_b_m : c_m ≤ b_m := by + simpa [b_m, c_m] using + VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hσ_le_bm : + sigmaHatAtScale hP hStruct (m : ℤ) ≤ b_m := by + calc + sigmaHatAtScale hP hStruct (m : ℤ) = + Real.sqrt (b_m * c_m) := rfl + _ ≤ Real.sqrt (b_m * b_m) := + Real.sqrt_le_sqrt (mul_le_mul_of_nonneg_left hc_m_le_b_m hb_m_pos.le) + _ = b_m := by + rw [show b_m * b_m = b_m ^ (2 : ℕ) by ring, + Real.sqrt_sq_eq_abs, abs_of_pos hb_m_pos] + have hbm_le_b0 : b_m ≤ b0 := by + simpa [b_m, b0] using + (Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (n := 0) (m := m) + (Nat.zero_le m)).2.2 + have hb0_le_L0 : b0 ≤ L0 := by + have hξ_one : 1 ≤ hP4.xi := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + simpa [b0, L0] using + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos hξ_one + (fun n => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sUpper_pos) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hP4.sLower_pos) + (fun n => Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + (fun n => Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + 0 + exact hσ_le_bm.trans (hbm_le_b0.trans hb0_le_L0) + +private theorem inv_sigmaHatAtScale_le_lambdaInvMomentAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + let b_m := hP.barSigmaAtScale hStruct (m : ℤ) + let c_m := hP.barSigmaStarAtScale hStruct (m : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + have hb_m_pos : 0 < b_m := by + simpa [b_m] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc_m_pos : 0 < c_m := by + simpa [c_m] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hc_m_le_b_m : c_m ≤ b_m := by + simpa [b_m, c_m] using + VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hc_m_le_σ : + c_m ≤ sigmaHatAtScale hP hStruct (m : ℤ) := by + calc + c_m = Real.sqrt (c_m * c_m) := by + rw [show c_m * c_m = c_m ^ (2 : ℕ) by ring, + Real.sqrt_sq_eq_abs, abs_of_pos hc_m_pos] + _ ≤ Real.sqrt (b_m * c_m) := by + exact Real.sqrt_le_sqrt + (by + have hmul := mul_le_mul_of_nonneg_right hc_m_le_b_m hc_m_pos.le + simpa [mul_comm] using hmul) + _ = sigmaHatAtScale hP hStruct (m : ℤ) := rfl + have hσ_pos : 0 < sigmaHatAtScale hP hStruct (m : ℤ) := by + simpa using GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hσ_inv_le_cm_inv : + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ ≤ c_m⁻¹ := + (inv_le_inv₀ hσ_pos hc_m_pos).2 hc_m_le_σ + have hcm_inv_le_c0_inv : c_m⁻¹ ≤ c0⁻¹ := by + simpa [c_m, c0] using + (Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (n := 0) (m := m) + (Nat.zero_le m)).2.1 + have hc0_inv_le_l0 : c0⁻¹ ≤ l0 := by + have hξ_one : 1 ≤ hP4.xi := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + simpa [c0, l0] using + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos hξ_one + (fun n => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sUpper_pos) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hP4.sLower_pos) + (fun n => Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + (fun n => Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + 0 + exact hσ_inv_le_cm_inv.trans (hcm_inv_le_c0_inv.trans hc0_inv_le_l0) + +theorem coarseFluctuationUnitMomentWeightAtScale_le_two_widetildeTheta_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m ≤ + 2 * widetildeThetaAtScale P (0 : ℤ) hP4 := by + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + have hσ_le_L0 : σ ≤ L0 := by + simpa [σ, L0] using + sigmaHatAtScale_le_LambdaMomentAtScale_zero_of_P4 hP hStruct hP4 m + have hσ_inv_le_l0 : σ⁻¹ ≤ l0 := by + simpa [σ, l0] using + inv_sigmaHatAtScale_le_lambdaInvMomentAtScale_zero_of_P4 hP hStruct hP4 m + have hL0_nonneg : 0 ≤ L0 := by + simpa [L0] using Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hl0_nonneg : 0 ≤ l0 := by + simpa [l0] using Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + calc + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m = + σ * l0 + σ⁻¹ * L0 := by + simp [coarseFluctuationUnitMomentWeightAtScale, σ, L0, l0] + _ ≤ L0 * l0 + l0 * L0 := + add_le_add + (mul_le_mul_of_nonneg_right hσ_le_L0 hl0_nonneg) + (mul_le_mul_of_nonneg_right hσ_inv_le_l0 hL0_nonneg) + _ = 2 * widetildeThetaAtScale P (0 : ℤ) hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + ring + +theorem oneStepScaleSeparation_m_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) + (hsep : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) : + 0 < m := by + have hC_pos : 0 < C := + lt_of_lt_of_le (oneStepScaleSeparationConst_pos hP4) hC + have hxi_pos : 0 < (hP4.xi : ℝ) := by + exact_mod_cast hP4.xi_pos + have htheta_tilde_nonneg : + 0 ≤ widetildeThetaAtScale P (0 : ℤ) hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + have harg_gt_one : + 1 < + 2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4 := by + have hprod_nonneg : + 0 ≤ delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4 := + mul_nonneg (mul_nonneg (inv_nonneg.mpr hdelta_pos.le) hxi_pos.le) + htheta_tilde_nonneg + linarith + have hlog_pos : + 0 < + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := + Real.log_pos harg_gt_one + have hleft_pos : + 0 < + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := + mul_pos (mul_pos hC_pos hxi_pos) hlog_pos + have hm_real : 0 < (m : ℝ) := lt_of_lt_of_le hleft_pos hsep + exact_mod_cast hm_real + +private theorem sqrt_mul_sqrt_le_two_sqrt_delta_mul_theta + {delta theta A B : ℝ} + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (htheta_one : 1 ≤ theta) + (hA_nonneg : 0 ≤ A) (hB_nonneg : 0 ≤ B) + (hA_le : A ≤ delta * Real.sqrt theta) + (hB_le : B ≤ (1 + delta) * Real.sqrt theta) : + Real.sqrt A * Real.sqrt B ≤ 2 * Real.sqrt delta * theta := by + have htheta_nonneg : 0 ≤ theta := le_trans zero_le_one htheta_one + have hsqrttheta_nonneg : 0 ≤ Real.sqrt theta := Real.sqrt_nonneg theta + have hB_le_two : B ≤ 2 * Real.sqrt theta := by + have hcoeff : 1 + delta ≤ 2 := by linarith + exact hB_le.trans (mul_le_mul_of_nonneg_right hcoeff hsqrttheta_nonneg) + have hAB : + A * B ≤ (delta * Real.sqrt theta) * (2 * Real.sqrt theta) := + mul_le_mul hA_le hB_le_two hB_nonneg + (mul_nonneg hdelta_pos.le hsqrttheta_nonneg) + have hsqrt_sq : (Real.sqrt theta) ^ (2 : ℕ) = theta := + Real.sq_sqrt htheta_nonneg + have hleft_sq : + (Real.sqrt A * Real.sqrt B) ^ (2 : ℕ) = A * B := by + rw [mul_pow, Real.sq_sqrt hA_nonneg, Real.sq_sqrt hB_nonneg] + have hright_nonneg : 0 ≤ 2 * Real.sqrt delta * theta := by + positivity + have hsq : + (Real.sqrt A * Real.sqrt B) ^ (2 : ℕ) ≤ + (2 * Real.sqrt delta * theta) ^ (2 : ℕ) := by + rw [hleft_sq] + have hdelta_nonneg : 0 ≤ delta := hdelta_pos.le + have hsqrtdelta_sq : (Real.sqrt delta) ^ (2 : ℕ) = delta := + Real.sq_sqrt hdelta_nonneg + calc + A * B ≤ (delta * Real.sqrt theta) * (2 * Real.sqrt theta) := hAB + _ = 2 * delta * (Real.sqrt theta) ^ (2 : ℕ) := by + ring_nf + _ = 2 * delta * theta := by + rw [hsqrt_sq] + _ ≤ 4 * delta * theta ^ (2 : ℕ) := by + have hθ_le_θsq : theta ≤ theta ^ (2 : ℕ) := by + nlinarith + nlinarith + _ = (2 * Real.sqrt delta * theta) ^ (2 : ℕ) := by + rw [mul_pow, mul_pow, hsqrtdelta_sq] + ring + exact le_of_sq_le_sq hsq hright_nonneg + +private theorem centerTerm_le_theta_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ (2 : ℕ) ≤ + thetaAtScale hP hStruct (0 : ℤ) := by + have htheta_m0 : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + GoodScale.thetaAtScale_mono_of_P4 hP hStruct hP4 + (n := 0) (m := m) (Nat.zero_le m) + have htheta_m_one : 1 ≤ thetaAtScale hP hStruct (m : ℤ) := + GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have htheta0_nonneg : + 0 ≤ thetaAtScale hP hStruct (0 : ℤ) := + le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hsqrt_m_one : + 1 ≤ Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) := + Real.one_le_sqrt.mpr htheta_m_one + have hsqrt_m0 : + Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) ≤ + Real.sqrt (thetaAtScale hP hStruct (0 : ℤ)) := + Real.sqrt_le_sqrt htheta_m0 + have hterm_nonneg : + 0 ≤ Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1 := by + linarith + have hterm_le : + Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1 ≤ + Real.sqrt (thetaAtScale hP hStruct (0 : ℤ)) := by + linarith + have hsqrt_sq : + (Real.sqrt (thetaAtScale hP hStruct (0 : ℤ))) ^ (2 : ℕ) = + thetaAtScale hP hStruct (0 : ℤ) := + Real.sq_sqrt htheta0_nonneg + have hsquare := + pow_le_pow_left₀ hterm_nonneg hterm_le 2 + rw [hsqrt_sq] at hsquare + exact hsquare + +private theorem thetaAtScale_m_le_thetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + thetaAtScale hP hStruct (m : ℤ) ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + GoodScale.thetaAtScale_mono_of_P4 hP hStruct hP4 + (n := 0) (m := m) (Nat.zero_le m) + +private theorem thetaAtScale_m_sub_one_le_thetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + thetaAtScale hP hStruct (m : ℤ) - 1 ≤ + thetaAtScale hP hStruct (0 : ℤ) := by + have hmono := thetaAtScale_m_le_thetaAtScale_zero_of_P4 hP hStruct hP4 m + linarith + +private theorem sqrt_thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + Real.sqrt (thetaAtScale hP hStruct (0 : ℤ)) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := + (sqrt_thetaAtScale_zero_le_thetaAtScale_zero_of_P4 hP hStruct hP4).trans + (thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 hP hStruct hP4) + +private theorem tauAtScale_zero_nonneg_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) + (p q : Vec d) : + 0 ≤ tauAtScale P (m : ℤ) (0 : ℤ) p q := by + have hParent := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hOrigin0 := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 0 + refine + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct.stationary (by norm_num) (by exact_mod_cast Nat.zero_le m) + p q hParent ?_ + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary (by norm_num) + (by exact_mod_cast Nat.zero_le m) hR hOrigin0 + +private theorem firstCoarseRhsTerm_le_two_sqrt_delta_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Real.sqrt (tauAtScale P (m : ℤ) (0 : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (0 : ℤ)) p_e q_e) ≤ + 2 * Real.sqrt delta * thetaAtScale hP hStruct (0 : ℤ) := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have htheta_one : + 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := + one_le_thetaAtScale_zero_of_P4 hP hStruct hP4 + have htau_nonneg : + 0 ≤ tauAtScale P (m : ℤ) (0 : ℤ) p_e q_e := + tauAtScale_zero_nonneg_of_P4 hP hStruct hP4 m p_e q_e + have hJ_nonneg : + 0 ≤ Ch04.expectedResponseJCubeSet P (originCube d (0 : ℤ)) p_e q_e := + expectedResponseJCubeSet_nonneg P (originCube d (0 : ℤ)) p_e q_e + have htau_le : + tauAtScale P (m : ℤ) (0 : ℤ) p_e q_e ≤ + delta * Real.sqrt (thetaAtScale hP hStruct 0) := by + simpa [p_e, q_e] using + goodScale_tau_le hP hStruct hP4 hdelta_pos hdelta_le + (m := m) (j := 0) (Nat.zero_le m) + hgood_upper hgood_lower e he + have hJ_le : + Ch04.expectedResponseJCubeSet P (originCube d (0 : ℤ)) p_e q_e ≤ + (1 + delta) * Real.sqrt (thetaAtScale hP hStruct 0) := by + have h := + goodScale_J_zero_le hP hStruct hP4 hdelta_pos hdelta_le + (m := m) hgood_upper hgood_lower e he + simpa [p_e, q_e, Ch04.expectedResponseJCubeSet, + Ch04.annealedResponseJAtScale, Ch04.responseJAtScale] using h + exact + sqrt_mul_sqrt_le_two_sqrt_delta_mul_theta + hdelta_pos hdelta_le htheta_one htau_nonneg hJ_nonneg htau_le hJ_le + +private theorem responseMomentTail_le_four_sqrt_delta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + (hsep : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let D := + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) + D * coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e ≤ + 4 * Real.sqrt delta := by + dsimp only + let D := + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) + let T := widetildeThetaAtScale P (0 : ℤ) hP4 + let U := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let R := coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hU_nonneg : 0 ≤ U := by + simpa [U] using + coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m + have hU_le : U ≤ 2 * T := by + simpa [U, T] using + coarseFluctuationUnitMomentWeightAtScale_le_two_widetildeTheta_zero + hP hStruct hP4 m + have hUR_le_sq : U * R ≤ U ^ (2 : ℕ) := by + simpa [U, R] using + coarseFluctuationUnitMomentWeight_mul_responseMoment_zero_le_sq + hP hStruct hP4 m e he + have hU_sq_le : U ^ (2 : ℕ) ≤ (2 * T) ^ (2 : ℕ) := + pow_le_pow_left₀ hU_nonneg hU_le 2 + have htail : + D * T ^ (2 : ℕ) ≤ Real.sqrt delta := by + simpa [D, T] using + oneStepScaleSeparation_absorbs_section53Beta_widetildeThetaSq + hP4 hC hdelta_pos hdelta_le hsep + calc + D * U * R = D * (U * R) := by ring + _ ≤ D * U ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left hUR_le_sq hD_nonneg + _ ≤ D * (2 * T) ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left hU_sq_le hD_nonneg + _ = 4 * (D * T ^ (2 : ℕ)) := by ring + _ ≤ 4 * Real.sqrt delta := + mul_le_mul_of_nonneg_left htail (by norm_num) + +private theorem lowScaleTail_le_three_sqrt_delta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + (hsep : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let β := section53CoarseFluctuationBeta hP4 + let D := + Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) + let θ := thetaAtScale hP hStruct (m : ℤ) + D * coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) ≤ + 3 * Real.sqrt delta := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let D2 := Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) + let D1 := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let T := widetildeThetaAtScale P (0 : ℤ) hP4 + let θ0 := thetaAtScale hP hStruct (0 : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let S := coarseFluctuationScalarWeightAtScale hP hStruct m + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hD2_nonneg : 0 ≤ D2 := by + dsimp [D2] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hD2_le_D1 : D2 ≤ D1 := by + dsimp [D1, D2, β] + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hm_nonneg : 0 ≤ (m : ℝ) := by exact_mod_cast Nat.zero_le m + have hβ_pos' : + 0 < section53CoarseFluctuationBeta hP4 := by + simpa [β] using hβ_pos + nlinarith [hβ_pos', hm_nonneg] + have hS_nonneg : 0 ≤ S := by + simpa [S] using + coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m + have hT_nonneg : 0 ≤ T := by + simpa [T, widetildeThetaAtScale, Ch04.widetildeThetaAtScale] using + mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + have hθ0_nonneg : 0 ≤ θ0 := by + dsimp [θ0] + exact le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hsqrtθ0_le_T : Real.sqrt θ0 ≤ T := by + simpa [θ0, T] using + sqrt_thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hP4 + have hθ0_le_T : θ0 ≤ T := by + simpa [θ0, T] using + thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hP4 + have hS_le_T : S ≤ 3 * T := by + have hS_le_sqrt : + S ≤ 3 * Real.sqrt θ0 := by + have h := + goodScale_oneStepScalarWeight_le hP hStruct hP4 + hdelta_pos hdelta_le hgood_upper hgood_lower e he + simpa [S, θ0, coarseFluctuationScalarWeightAtScale_eq_oneStepScalarWeightAtScale] + using h + calc + S ≤ 3 * Real.sqrt θ0 := hS_le_sqrt + _ ≤ 3 * T := mul_le_mul_of_nonneg_left hsqrtθ0_le_T (by norm_num) + have hθ_sub_nonneg : 0 ≤ θ - 1 := by + have hθ_one : 1 ≤ θ := by + simpa [θ] using GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith + have hθ_sub_le_T : θ - 1 ≤ T := by + have hleθ0 : + θ - 1 ≤ θ0 := by + simpa [θ, θ0] using + thetaAtScale_m_sub_one_le_thetaAtScale_zero_of_P4 hP hStruct hP4 m + exact hleθ0.trans hθ0_le_T + have htail : + D1 * T ^ (2 : ℕ) ≤ Real.sqrt delta := by + simpa [D1, T] using + oneStepScaleSeparation_absorbs_section53Beta_widetildeThetaSq + hP4 hC hdelta_pos hdelta_le hsep + calc + D2 * S * (θ - 1) = D2 * (S * (θ - 1)) := by ring + _ ≤ D2 * ((3 * T) * T) := by + refine mul_le_mul_of_nonneg_left ?_ hD2_nonneg + exact mul_le_mul hS_le_T hθ_sub_le_T hθ_sub_nonneg + (mul_nonneg (by norm_num) hT_nonneg) + _ = 3 * (D2 * T ^ (2 : ℕ)) := by ring + _ ≤ 3 * (D1 * T ^ (2 : ℕ)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hD2_le_D1 (sq_nonneg T)) (by norm_num) + _ ≤ 3 * Real.sqrt delta := + mul_le_mul_of_nonneg_left htail (by norm_num) + +private theorem sqrt_delta_mul_theta_le_compressionTarget + {delta epsilon theta : ℝ} + (_hdelta_nonneg : 0 ≤ delta) (hepsilon_pos : 0 < epsilon) + (hepsilon_le : epsilon ≤ 1) (htheta_nonneg : 0 ≤ theta) : + Real.sqrt delta * theta ≤ + (epsilon + epsilon⁻¹ * Real.sqrt delta) * theta := by + have hinv_ge_one : 1 ≤ epsilon⁻¹ := (one_le_inv₀ hepsilon_pos).2 hepsilon_le + have hsqrt_nonneg : 0 ≤ Real.sqrt delta := Real.sqrt_nonneg delta + have hmain : Real.sqrt delta ≤ epsilon + epsilon⁻¹ * Real.sqrt delta := by + have hmul : Real.sqrt delta ≤ epsilon⁻¹ * Real.sqrt delta := + by simpa using mul_le_mul_of_nonneg_right hinv_ge_one hsqrt_nonneg + nlinarith [hepsilon_pos] + exact mul_le_mul_of_nonneg_right hmain htheta_nonneg + +private theorem epsilon_mul_theta_le_compressionTarget + {delta epsilon theta : ℝ} + (_hdelta_nonneg : 0 ≤ delta) (hepsilon_pos : 0 < epsilon) + (htheta_nonneg : 0 ≤ theta) : + epsilon * theta ≤ + (epsilon + epsilon⁻¹ * Real.sqrt delta) * theta := by + have hterm_nonneg : + 0 ≤ epsilon⁻¹ * Real.sqrt delta := + mul_nonneg (inv_nonneg.mpr hepsilon_pos.le) (Real.sqrt_nonneg delta) + exact mul_le_mul_of_nonneg_right (by nlinarith) htheta_nonneg + +private theorem epsilon_inv_mul_sqrt_delta_mul_theta_le_compressionTarget + {delta epsilon theta : ℝ} + (_hdelta_nonneg : 0 ≤ delta) (hepsilon_pos : 0 < epsilon) + (htheta_nonneg : 0 ≤ theta) : + epsilon⁻¹ * Real.sqrt delta * theta ≤ + (epsilon + epsilon⁻¹ * Real.sqrt delta) * theta := by + have hmain : + epsilon⁻¹ * Real.sqrt delta ≤ + epsilon + epsilon⁻¹ * Real.sqrt delta := by + nlinarith [hepsilon_pos] + exact mul_le_mul_of_nonneg_right hmain htheta_nonneg + +private theorem epsilon_inv_mul_sqrt_delta_le_compressionTarget_of_one_le_theta + {delta epsilon theta : ℝ} + (hdelta_nonneg : 0 ≤ delta) (hepsilon_pos : 0 < epsilon) + (htheta_one : 1 ≤ theta) : + epsilon⁻¹ * Real.sqrt delta ≤ + (epsilon + epsilon⁻¹ * Real.sqrt delta) * theta := by + have htheta_nonneg : 0 ≤ theta := le_trans zero_le_one htheta_one + have hterm_nonneg : + 0 ≤ epsilon⁻¹ * Real.sqrt delta := + mul_nonneg (inv_nonneg.mpr hepsilon_pos.le) (Real.sqrt_nonneg delta) + calc + epsilon⁻¹ * Real.sqrt delta ≤ + epsilon⁻¹ * Real.sqrt delta * theta := by + simpa [one_mul] using + mul_le_mul_of_nonneg_left htheta_one hterm_nonneg + _ ≤ (epsilon + epsilon⁻¹ * Real.sqrt delta) * theta := + epsilon_inv_mul_sqrt_delta_mul_theta_le_compressionTarget + hdelta_nonneg hepsilon_pos htheta_nonneg + +private theorem coarseFluctuationManuscriptRHSAtScale_zero_eq_decomp + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C ε : ℝ) (m : ℕ) (e : Vec d) : + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C ε 0 m e = + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let T := + Real.sqrt (tauAtScale P (m : ℤ) (0 : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (0 : ℤ)) p_e q_e) + let Center := (Real.sqrt θ - 1) ^ 2 + let A := + β⁻¹ * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m + let B := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e + let R := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + let D := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let Ssum := A + B + R + D + C * T + C * ε * Center + C * ε⁻¹ * Ssum := by + unfold coarseFluctuationManuscriptRHSAtScale + dsimp only + ring_nf + +theorem coarseFluctuationManuscriptRHSAtScale_zero_le_compressed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C0 Csep delta epsilon : ℝ} {m : ℕ} + (hC0_nonneg : 0 ≤ C0) + (hCsep : oneStepScaleSeparationConst hP4 ≤ Csep) + (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + (hsep : + Csep * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) + (hepsilon_pos : 0 < epsilon) (hepsilon_le : epsilon ≤ 1) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + let β := section53CoarseFluctuationBeta hP4 + let M := + 3 + + β⁻¹ * oneStepCoarseFullBlockConst hP4 + + (β ^ 2)⁻¹ * oneStepCoarseTauSumConst hP4 + + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * 4 + + (β ^ 2)⁻¹ * 3 + coarseFluctuationManuscriptRHSAtScale hP hStruct hP4 C0 epsilon 0 m e ≤ + C0 * M * + ((epsilon + epsilon⁻¹ * Real.sqrt delta) * + thetaAtScale hP hStruct (0 : ℤ)) := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let θ0 := thetaAtScale hP hStruct (0 : ℤ) + let θ := thetaAtScale hP hStruct (m : ℤ) + let target := (epsilon + epsilon⁻¹ * Real.sqrt delta) * θ0 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let Tfirst := + Real.sqrt (tauAtScale P (m : ℤ) (0 : ℤ) p_e q_e) * + Real.sqrt (Ch04.expectedResponseJCubeSet P (originCube d (0 : ℤ)) p_e q_e) + let Center := (Real.sqrt θ - 1) ^ (2 : ℕ) + let A := β⁻¹ * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m + let B := + (β ^ 2)⁻¹ * coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e + let R := + (hP4.xi : ℝ) * (β ^ 3)⁻¹ * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + let D := + (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) + let Ssum := A + B + R + D + let coefA := β⁻¹ * oneStepCoarseFullBlockConst hP4 + let coefB := (β ^ 2)⁻¹ * oneStepCoarseTauSumConst hP4 + let coefR := (hP4.xi : ℝ) * (β ^ 3)⁻¹ * 4 + let coefD := (β ^ 2)⁻¹ * 3 + let M := 3 + coefA + coefB + coefR + coefD + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβinv_nonneg : 0 ≤ β⁻¹ := inv_nonneg.mpr hβ_pos.le + have hβ2inv_nonneg : 0 ≤ (β ^ 2)⁻¹ := + inv_nonneg.mpr (sq_nonneg β) + have hβ3inv_nonneg : 0 ≤ (β ^ 3)⁻¹ := + inv_nonneg.mpr (pow_nonneg hβ_pos.le 3) + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hθ0_one : 1 ≤ θ0 := by + simpa [θ0] using one_le_thetaAtScale_zero_of_P4 hP hStruct hP4 + have hθ0_nonneg : 0 ≤ θ0 := le_trans zero_le_one hθ0_one + have hsqrtdelta_nonneg : 0 ≤ Real.sqrt delta := Real.sqrt_nonneg delta + have htarget_nonneg : 0 ≤ target := by + dsimp [target] + exact mul_nonneg + (add_nonneg hepsilon_pos.le + (mul_nonneg (inv_nonneg.mpr hepsilon_pos.le) hsqrtdelta_nonneg)) + hθ0_nonneg + have hsqrt_delta_theta_le : + Real.sqrt delta * θ0 ≤ target := by + simpa [target, θ0] using + sqrt_delta_mul_theta_le_compressionTarget hdelta_pos.le + hepsilon_pos hepsilon_le hθ0_nonneg + have hepsilon_theta_le : + epsilon * θ0 ≤ target := by + simpa [target, θ0] using + epsilon_mul_theta_le_compressionTarget hdelta_pos.le + hepsilon_pos hθ0_nonneg + have hepsilon_inv_sqrt_theta_le : + epsilon⁻¹ * Real.sqrt delta * θ0 ≤ target := by + simpa [target, θ0] using + epsilon_inv_mul_sqrt_delta_mul_theta_le_compressionTarget + hdelta_pos.le hepsilon_pos hθ0_nonneg + have hepsilon_inv_sqrt_le : + epsilon⁻¹ * Real.sqrt delta ≤ target := by + simpa [target, θ0] using + epsilon_inv_mul_sqrt_delta_le_compressionTarget_of_one_le_theta + hdelta_pos.le hepsilon_pos hθ0_one + have hTfirst_le : + Tfirst ≤ 2 * target := by + have h := + firstCoarseRhsTerm_le_two_sqrt_delta_theta + hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + calc + Tfirst ≤ 2 * Real.sqrt delta * θ0 := by + simpa [Tfirst, p_e, q_e, θ0] using h + _ = 2 * (Real.sqrt delta * θ0) := by ring + _ ≤ 2 * target := + mul_le_mul_of_nonneg_left hsqrt_delta_theta_le (by norm_num) + have hCenter_le : + Center ≤ θ0 := by + simpa [Center, θ, θ0] using + centerTerm_le_theta_zero hP hStruct hP4 m + have hCenterTerm_le : + epsilon * Center ≤ target := by + calc + epsilon * Center ≤ epsilon * θ0 := + mul_le_mul_of_nonneg_left hCenter_le hepsilon_pos.le + _ ≤ target := hepsilon_theta_le + have hθ_le : θ ≤ θ0 := by + simpa [θ, θ0] using + thetaAtScale_m_le_thetaAtScale_zero_of_P4 hP hStruct hP4 m + have hθ_nonneg : 0 ≤ θ := by + have hθ_one : 1 ≤ θ := by + simpa [θ] using GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + exact le_trans zero_le_one hθ_one + have hfull_nonneg : + 0 ≤ coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m := + coarseFluctuationFullBlockSumAtScale_nonneg hP hStruct hP4 0 m + have hfull_le : + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m ≤ + oneStepCoarseFullBlockConst hP4 * Real.sqrt delta := by + calc + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m = + oneStepCoarseFullBlockSumAtScale hP hStruct hP4 m := by + exact + coarseFluctuationFullBlockSumAtScale_zero_eq_oneStepCoarseFullBlockSumAtScale + hP hStruct hP4 m + _ ≤ oneStepCoarseFullBlockConst hP4 * Real.sqrt delta := + oneStepCoarseFullBlockSumAtScale_le_sqrt_delta + hP hStruct hP4 hCsep hdelta_pos hdelta_le hsep + hgood_upper hgood_lower + have hfbConst_nonneg : 0 ≤ oneStepCoarseFullBlockConst hP4 := + oneStepCoarseFullBlockConst_nonneg hP4 + have hA_le : + A ≤ coefA * (Real.sqrt delta * θ0) := by + calc + A = β⁻¹ * θ * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m := rfl + _ ≤ β⁻¹ * θ0 * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 0 m := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hθ_le hβinv_nonneg) hfull_nonneg + _ ≤ β⁻¹ * θ0 * (oneStepCoarseFullBlockConst hP4 * Real.sqrt delta) := by + exact mul_le_mul_of_nonneg_left hfull_le + (mul_nonneg hβinv_nonneg hθ0_nonneg) + _ = coefA * (Real.sqrt delta * θ0) := by + simp [coefA] + ring + have hAterm_le : + epsilon⁻¹ * A ≤ coefA * target := by + have hcoef_nonneg : 0 ≤ coefA := by + dsimp [coefA] + positivity + calc + epsilon⁻¹ * A ≤ epsilon⁻¹ * (coefA * (Real.sqrt delta * θ0)) := + mul_le_mul_of_nonneg_left hA_le (inv_nonneg.mpr hepsilon_pos.le) + _ = coefA * (epsilon⁻¹ * Real.sqrt delta * θ0) := by ring + _ ≤ coefA * target := + mul_le_mul_of_nonneg_left hepsilon_inv_sqrt_theta_le hcoef_nonneg + have htau_le : + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e ≤ + oneStepCoarseTauSumConst hP4 * Real.sqrt delta * θ0 := by + simpa [θ0] using + coarseFluctuationScalarWeight_mul_tauSum_zero_le_sqrt_delta_theta + hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have htauConst_nonneg : 0 ≤ oneStepCoarseTauSumConst hP4 := + oneStepCoarseTauSumConst_nonneg hP4 + have hB_le : + B ≤ coefB * (Real.sqrt delta * θ0) := by + calc + B = + (β ^ 2)⁻¹ * + (coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 0 m e) := by + simp [B] + ring + _ ≤ (β ^ 2)⁻¹ * + (oneStepCoarseTauSumConst hP4 * Real.sqrt delta * θ0) := + mul_le_mul_of_nonneg_left htau_le hβ2inv_nonneg + _ = coefB * (Real.sqrt delta * θ0) := by + simp [coefB] + ring + have hBterm_le : + epsilon⁻¹ * B ≤ coefB * target := by + have hcoef_nonneg : 0 ≤ coefB := by + dsimp [coefB] + positivity + calc + epsilon⁻¹ * B ≤ epsilon⁻¹ * (coefB * (Real.sqrt delta * θ0)) := + mul_le_mul_of_nonneg_left hB_le (inv_nonneg.mpr hepsilon_pos.le) + _ = coefB * (epsilon⁻¹ * Real.sqrt delta * θ0) := by ring + _ ≤ coefB * target := + mul_le_mul_of_nonneg_left hepsilon_inv_sqrt_theta_le hcoef_nonneg + have hRtail : + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e ≤ + 4 * Real.sqrt delta := by + simpa [β] using + responseMomentTail_le_four_sqrt_delta + hP hStruct hP4 hCsep hdelta_pos hdelta_le hsep e he + have hR_le : + R ≤ coefR * Real.sqrt delta := by + calc + R = + ((hP4.xi : ℝ) * (β ^ 3)⁻¹) * + (Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e) := by + simp [R] + ring + _ ≤ ((hP4.xi : ℝ) * (β ^ 3)⁻¹) * (4 * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hRtail + (mul_nonneg hxi_nonneg hβ3inv_nonneg) + _ = coefR * Real.sqrt delta := by + simp [coefR] + ring + have hRterm_le : + epsilon⁻¹ * R ≤ coefR * target := by + have hcoef_nonneg : 0 ≤ coefR := by + dsimp [coefR] + positivity + calc + epsilon⁻¹ * R ≤ epsilon⁻¹ * (coefR * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hR_le (inv_nonneg.mpr hepsilon_pos.le) + _ = coefR * (epsilon⁻¹ * Real.sqrt delta) := by ring + _ ≤ coefR * target := + mul_le_mul_of_nonneg_left hepsilon_inv_sqrt_le hcoef_nonneg + have hDtail : + Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1) ≤ + 3 * Real.sqrt delta := by + simpa [β, θ] using + lowScaleTail_le_three_sqrt_delta + hP hStruct hP4 hCsep hdelta_pos hdelta_le hsep + hgood_upper hgood_lower e he + have hD_le : + D ≤ coefD * Real.sqrt delta := by + calc + D = + (β ^ 2)⁻¹ * + (Real.rpow (3 : ℝ) (-2 * β * (((m - 0 : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * (θ - 1)) := by + simp [D] + ring + _ ≤ (β ^ 2)⁻¹ * (3 * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hDtail hβ2inv_nonneg + _ = coefD * Real.sqrt delta := by + simp [coefD] + ring + have hDterm_le : + epsilon⁻¹ * D ≤ coefD * target := by + have hcoef_nonneg : 0 ≤ coefD := by + dsimp [coefD] + positivity + calc + epsilon⁻¹ * D ≤ epsilon⁻¹ * (coefD * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hD_le (inv_nonneg.mpr hepsilon_pos.le) + _ = coefD * (epsilon⁻¹ * Real.sqrt delta) := by ring + _ ≤ coefD * target := + mul_le_mul_of_nonneg_left hepsilon_inv_sqrt_le hcoef_nonneg + have hSterm_le : + epsilon⁻¹ * Ssum ≤ (coefA + coefB + coefR + coefD) * target := by + calc + epsilon⁻¹ * Ssum = + epsilon⁻¹ * A + epsilon⁻¹ * B + epsilon⁻¹ * R + epsilon⁻¹ * D := by + simp [Ssum] + ring + _ ≤ coefA * target + coefB * target + coefR * target + coefD * target := + add_le_add (add_le_add (add_le_add hAterm_le hBterm_le) hRterm_le) + hDterm_le + _ = (coefA + coefB + coefR + coefD) * target := by ring + have hbase : + Tfirst + epsilon * Center + epsilon⁻¹ * Ssum ≤ M * target := by + calc + Tfirst + epsilon * Center + epsilon⁻¹ * Ssum ≤ + 2 * target + target + (coefA + coefB + coefR + coefD) * target := + add_le_add (add_le_add hTfirst_le hCenterTerm_le) hSterm_le + _ = M * target := by + simp [M] + ring + have hdecomp := + coarseFluctuationManuscriptRHSAtScale_zero_eq_decomp + hP hStruct hP4 C0 epsilon m e + rw [hdecomp] + calc + C0 * Tfirst + C0 * epsilon * Center + C0 * epsilon⁻¹ * Ssum = + C0 * (Tfirst + epsilon * Center + epsilon⁻¹ * Ssum) := by ring + _ ≤ C0 * (M * target) := + mul_le_mul_of_nonneg_left hbase hC0_nonneg + _ = C0 * M * ((epsilon + epsilon⁻¹ * Real.sqrt delta) * θ0) := by + simp [target] + ring +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RealAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RealAlgebra.lean new file mode 100644 index 0000000000..73d704b997 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/RealAlgebra.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.Basic + +/-! # Real Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Real algebra for the one-step contraction + +The final proof chooses `epsilon = delta^(1/4)`. This file isolates the +elementary estimates for that choice. +-/ + +/-- The one-step epsilon is positive for positive `delta`. -/ +theorem oneStepContractionEpsilon_pos {delta : ℝ} (hdelta_pos : 0 < delta) : + 0 < oneStepContractionEpsilon delta := by + dsimp [oneStepContractionEpsilon] + exact Real.rpow_pos_of_pos hdelta_pos _ + +/-- The one-step epsilon is nonnegative for nonnegative `delta`. -/ +theorem oneStepContractionEpsilon_nonneg {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) : + 0 ≤ oneStepContractionEpsilon delta := by + dsimp [oneStepContractionEpsilon] + exact Real.rpow_nonneg hdelta_nonneg _ + +/-- In the manuscript range, the one-step epsilon is at most one. -/ +theorem oneStepContractionEpsilon_le_one {delta : ℝ} + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) : + oneStepContractionEpsilon delta ≤ 1 := by + dsimp [oneStepContractionEpsilon] + exact Real.rpow_le_one hdelta_pos.le (by linarith) (by norm_num) + +/-- The square root dominates `delta` on the manuscript range. -/ +theorem delta_le_sqrt_of_pos_of_le_half {delta : ℝ} + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) : + delta ≤ Real.sqrt delta := by + have hdelta_le_one : delta ≤ 1 := by linarith + have hsq : delta ^ (2 : ℕ) ≤ (Real.sqrt delta) ^ (2 : ℕ) := by + rw [Real.sq_sqrt hdelta_pos.le] + nlinarith + exact (sq_le_sq₀ hdelta_pos.le (Real.sqrt_nonneg delta)).1 hsq + +/-- The quarter power dominates the square root when `0 < delta <= 1`. -/ +theorem sqrt_le_oneStepContractionEpsilon {delta : ℝ} + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) : + Real.sqrt delta ≤ oneStepContractionEpsilon delta := by + have hdelta_le_one : delta ≤ 1 := by linarith + calc + Real.sqrt delta = Real.rpow delta (1 / 2 : ℝ) := Real.sqrt_eq_rpow delta + _ ≤ Real.rpow delta (1 / 4 : ℝ) := + Real.rpow_le_rpow_of_exponent_ge hdelta_pos hdelta_le_one (by norm_num) + _ = oneStepContractionEpsilon delta := by + rfl + +/-- The quarter power dominates `delta` on the manuscript range. -/ +theorem delta_le_oneStepContractionEpsilon {delta : ℝ} + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) : + delta ≤ oneStepContractionEpsilon delta := + (delta_le_sqrt_of_pos_of_le_half hdelta_pos hdelta_le_half).trans + (sqrt_le_oneStepContractionEpsilon hdelta_pos hdelta_le_half) + +/-- With `epsilon = delta^(1/4)`, the product `epsilon^{-1} sqrt(delta)` +is again `epsilon`. -/ +theorem oneStepContractionEpsilon_inv_mul_sqrt_eq {delta : ℝ} + (hdelta_pos : 0 < delta) : + (oneStepContractionEpsilon delta)⁻¹ * Real.sqrt delta = + oneStepContractionEpsilon delta := by + have hinv : + (Real.rpow delta (1 / 4 : ℝ))⁻¹ = + Real.rpow delta (-(1 / 4 : ℝ)) := by + simpa using (Real.rpow_neg hdelta_pos.le (1 / 4 : ℝ)).symm + calc + (oneStepContractionEpsilon delta)⁻¹ * Real.sqrt delta = + Real.rpow delta (-(1 / 4 : ℝ)) * Real.rpow delta (1 / 2 : ℝ) := by + rw [oneStepContractionEpsilon, hinv] + exact congrArg + (fun z : ℝ => Real.rpow delta (-(1 / 4 : ℝ)) * z) + (Real.sqrt_eq_rpow delta) + _ = Real.rpow delta (-(1 / 4 : ℝ) + 1 / 2) := by + exact + (Real.rpow_add hdelta_pos (-(1 / 4 : ℝ)) (1 / 2 : ℝ)).symm + _ = oneStepContractionEpsilon delta := by + norm_num [oneStepContractionEpsilon] + +/-- The final epsilon absorption used after the Section 5.3 estimate. -/ +theorem oneStepContractionEpsilon_add_inv_mul_sqrt_le + {delta : ℝ} (hdelta_pos : 0 < delta) : + oneStepContractionEpsilon delta + + (oneStepContractionEpsilon delta)⁻¹ * Real.sqrt delta ≤ + 2 * oneStepContractionEpsilon delta := by + rw [oneStepContractionEpsilon_inv_mul_sqrt_eq hdelta_pos] + ring_nf + exact le_rfl + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ResponseMoment.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ResponseMoment.lean new file mode 100644 index 0000000000..19d7f7caaf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ResponseMoment.lean @@ -0,0 +1,578 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.CoarseRHSPrep +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ResponseMomentIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeMomentCompression + +/-! # Response Moment -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Unit-scale response moment bridge + +This file proves the local bridge used in the one-step contraction proof: for +the special vectors at scale `m`, the unit-cube `L^ζ` response moment is +controlled by the unit-scale `(P4)` ellipticity moment weight with the matched +normalizations `sigma^{-1} Lambda + sigma lambda^{-1}`. +-/ + +open Section53.JUpperBoundCoarseFluctuations + +private theorem blockPosDef_quadratic_nonneg + {d : ℕ} {A : BlockMat d} (hA : Ch02.BlockPosDef A) (X : BlockVec d) : + 0 ≤ blockVecDot X (blockMatVecMul A X) := by + by_cases hX : X = 0 + · subst X + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul] + · exact (hA X hX).le + +private theorem block_cross_abs_le_half_quadratics + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) (p q : Vec d) : + |vecDot q (matVecMul A.lowerLeft p)| ≤ + (1 / 2 : ℝ) * + (vecDot p (matVecMul A.upperLeft p) + + vecDot q (matVecMul A.lowerRight q)) := by + let X : BlockVec d := (0, q) + let Y : BlockVec d := (p, 0) + have hcomm : + blockVecDot Y (blockMatVecMul A X) = + blockVecDot X (blockMatVecMul A Y) := by + exact (blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hSymm Y X) + have hXX : + blockVecDot X (blockMatVecMul A X) = + vecDot q (matVecMul A.lowerRight q) := by + simp [X, blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left] + have hYY : + blockVecDot Y (blockMatVecMul A Y) = + vecDot p (matVecMul A.upperLeft p) := by + simp [Y, blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left] + have hXY : + blockVecDot X (blockMatVecMul A Y) = + vecDot q (matVecMul A.lowerLeft p) := by + simp [X, Y, blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left] + have hYX : + blockVecDot Y (blockMatVecMul A X) = + vecDot q (matVecMul A.lowerLeft p) := by + rw [hcomm, hXY] + let z := vecDot q (matVecMul A.lowerLeft p) + let a := vecDot q (matVecMul A.lowerRight q) + let b := vecDot p (matVecMul A.upperLeft p) + have hplus : + 0 ≤ a + z + z + b := by + have hnonneg := blockPosDef_quadratic_nonneg hPos (X + Y) + have hraw : + 0 ≤ a + z + (z + b) := by + simpa [z, a, b, blockMatVecMul_add, blockVecDot_add_left, + blockVecDot_add_right, hXX, hYY, hXY, hYX] using hnonneg + nlinarith + have hminus : + 0 ≤ a - z - z + b := by + have hnonneg := blockPosDef_quadratic_nonneg hPos (X - Y) + have hnegMul : blockMatVecMul A (-Y) = -blockMatVecMul A Y := by + simpa using blockMatVecMul_smul A (-1) Y + have hnegDotL : + blockVecDot (-Y) (blockMatVecMul A X) = + -blockVecDot Y (blockMatVecMul A X) := by + simpa using blockVecDot_smul_left (-1) Y (blockMatVecMul A X) + have hnegDotR : + blockVecDot X (-blockMatVecMul A Y) = + -blockVecDot X (blockMatVecMul A Y) := by + simpa using blockVecDot_smul_right X (blockMatVecMul A Y) (-1) + have hnegYY : + blockVecDot (-Y) (-blockMatVecMul A Y) = + blockVecDot Y (blockMatVecMul A Y) := by + calc + blockVecDot (-Y) (-blockMatVecMul A Y) = + -blockVecDot (-Y) (blockMatVecMul A Y) := by + simpa using blockVecDot_smul_right (-Y) (blockMatVecMul A Y) (-1) + _ = blockVecDot Y (blockMatVecMul A Y) := by + rw [show blockVecDot (-Y) (blockMatVecMul A Y) = + -blockVecDot Y (blockMatVecMul A Y) by + simpa using blockVecDot_smul_left (-1) Y (blockMatVecMul A Y)] + ring + have hraw : + 0 ≤ a + -z + (-z + b) := by + simpa [sub_eq_add_neg, z, a, b, blockMatVecMul_add, hnegMul, + blockVecDot_add_left, blockVecDot_add_right, hXX, hYY, hXY, hYX, + hnegDotL, hnegDotR, hnegYY] using hnonneg + nlinarith + have habs : 2 * |z| ≤ a + b := by + have hz_abs : |z| ≤ (a + b) / 2 := by + rw [abs_le] + constructor <;> nlinarith + nlinarith + have htarget : |z| ≤ (1 / 2 : ℝ) * (b + a) := by + nlinarith + simpa [z, a, b, add_comm] using htarget + +private theorem responseJ_special_pointwise_le_weighted_factors + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (he : Ch02.vecNorm e = 1) : + (fun a : RegCoeffField d => + Ch04.restrictionResponseJObservableCubeSet (originCube d 0) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) a) + ≤ᵐ[P] + fun a => + (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + sigmaHatAtScale hP hStruct (m : ℤ) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hσ_pos : 0 < σ := by + simpa [σ] using GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have he_sq : vecNormSq e = 1 := + GoodScale.vecNormSq_eq_one_of_vecNorm_eq_one he + have he_dot : vecDot e e = 1 := by + simpa [vecNormSq] using he_sq + have hp_norm : + vecNormSq p_e = σ⁻¹ := by + change + vecNormSq + (((sigmaHatAtScale hP hStruct (m : ℤ)) ^ (-(1 / 2 : ℝ))) • e) = σ⁻¹ + rw [show sigmaHatAtScale hP hStruct (m : ℤ) = σ by rfl] + rw [vecNormSq_smul] + rw [GoodScale.rpow_neg_half_sq_eq_inv hσ_pos, he_sq, mul_one] + have hq_norm : + vecNormSq q_e = σ := by + change + vecNormSq + (((sigmaHatAtScale hP hStruct (m : ℤ)) ^ (1 / 2 : ℝ)) • e) = σ + rw [show sigmaHatAtScale hP hStruct (m : ℤ) = σ by rfl] + rw [vecNormSq_smul] + rw [GoodScale.rpow_half_sq_eq_self hσ_pos, he_sq, mul_one] + have hdot_nonneg : 0 ≤ vecDot p_e q_e := by + have hpq : + vecDot p_e q_e = 1 := by + change + vecDot + (((sigmaHatAtScale hP hStruct (m : ℤ)) ^ (-(1 / 2 : ℝ))) • e) + (((sigmaHatAtScale hP hStruct (m : ℤ)) ^ (1 / 2 : ℝ)) • e) = 1 + rw [show sigmaHatAtScale hP hStruct (m : ℤ) = σ by rfl] + simp [vecDot_smul_left, vecDot_smul_right] + have hcross : + σ ^ (1 / 2 : ℝ) * (σ ^ (-(1 / 2 : ℝ)) * vecDot e e) = 1 := by + rw [← mul_assoc, mul_comm (σ ^ (1 / 2 : ℝ)) (σ ^ (-(1 / 2 : ℝ)))] + rw [GoodScale.rpow_neg_half_mul_rpow_half_eq_one hσ_pos, one_mul, he_dot] + have hcross2 : + σ ^ (2⁻¹ : ℝ) * (σ ^ (-2⁻¹ : ℝ) * vecDot e e) = 1 := by + convert hcross using 1 + norm_num + simpa using hcross2 + rw [hpq] + norm_num + filter_upwards + [Ch04.restrictionResponseJObservableCubeSet_ae_eq_quadratic_coarseBlockMatrix_of_lawCarrier + hP (originCube d 0) p_e q_e, + hP.ae_locallyUniformlyEllipticField] with a hJ ha + let Q : TriadicCube d := originCube d 0 + let A : BlockMat d := coarseBlockMatrix (cubeSet Q) a.toFun + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + A = Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [A, F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat A := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hPos : Ch02.BlockPosDef A := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_posDef + let upperQuad := vecDot p_e (matVecMul A.upperLeft p_e) + let lowerQuad := vecDot q_e (matVecMul A.lowerRight q_e) + have hcross : + |vecDot q_e (matVecMul A.lowerLeft p_e)| ≤ + (1 / 2 : ℝ) * (upperQuad + lowerQuad) := by + simpa [upperQuad, lowerQuad, add_comm] using + block_cross_abs_le_half_quadratics hSymm hPos p_e q_e + have hJ_le_quads : + Ch04.restrictionResponseJObservableCubeSet Q p_e q_e a ≤ upperQuad + lowerQuad := by + calc + Ch04.restrictionResponseJObservableCubeSet Q p_e q_e a = + (1 / 2 : ℝ) * lowerQuad - vecDot p_e q_e - + vecDot q_e (matVecMul A.lowerLeft p_e) + + (1 / 2 : ℝ) * upperQuad := by + simpa [Q, A, upperQuad, lowerQuad] using hJ + _ ≤ (1 / 2 : ℝ) * lowerQuad + + |vecDot q_e (matVecMul A.lowerLeft p_e)| + + (1 / 2 : ℝ) * upperQuad := by + nlinarith [hdot_nonneg, neg_le_abs (vecDot q_e (matVecMul A.lowerLeft p_e))] + _ ≤ (1 / 2 : ℝ) * lowerQuad + + (1 / 2 : ℝ) * (upperQuad + lowerQuad) + + (1 / 2 : ℝ) * upperQuad := by + nlinarith + _ = upperQuad + lowerQuad := by ring + have hUL_norm : + Ch02.matrixOperatorNorm A.upperLeft ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + calc + Ch02.matrixOperatorNorm A.upperLeft = + Ch02.coarseBMatrixNorm Q F := by + rw [hEq] + rfl + _ ≤ Ch02.LambdaSq Q hP4.sUpper (.finite 1) F := + Ch02.oneCube_b_le_LambdaSq_finite Q F hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + _ = Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + simp [Ch04.LambdaSqCoeffField, ha, F] + have hLR_norm : + Ch02.matrixOperatorNorm A.lowerRight ≤ + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + calc + Ch02.matrixOperatorNorm A.lowerRight = + Ch02.coarseSigmaStarInvMatrixNorm Q F := by + rw [hEq] + rfl + _ ≤ (Ch02.lambdaSq Q hP4.sLower (.finite 1) F)⁻¹ := + Ch02.oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q F hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1) + _ = (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + simp [Ch04.lambdaSqCoeffField, ha, F] + have hUpperQuad_le : + upperQuad ≤ σ⁻¹ * Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + have hraw := + Ch02.abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq + A.upperLeft p_e + have hle : + upperQuad ≤ Ch02.matrixOperatorNorm A.upperLeft * vecNormSq p_e := + (le_abs_self upperQuad).trans hraw + calc + upperQuad ≤ Ch02.matrixOperatorNorm A.upperLeft * vecNormSq p_e := hle + _ = Ch02.matrixOperatorNorm A.upperLeft * σ⁻¹ := by rw [hp_norm] + _ ≤ Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a * σ⁻¹ := by + exact mul_le_mul_of_nonneg_right hUL_norm (inv_pos.mpr hσ_pos).le + _ = σ⁻¹ * Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by ring + have hLowerQuad_le : + lowerQuad ≤ σ * + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + have hraw := + Ch02.abs_vecDot_matVecMul_le_matrixOperatorNorm_mul_vecNormSq + A.lowerRight q_e + have hle : + lowerQuad ≤ Ch02.matrixOperatorNorm A.lowerRight * vecNormSq q_e := + (le_abs_self lowerQuad).trans hraw + calc + lowerQuad ≤ Ch02.matrixOperatorNorm A.lowerRight * vecNormSq q_e := hle + _ = Ch02.matrixOperatorNorm A.lowerRight * σ := by rw [hq_norm] + _ ≤ (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ * σ := by + exact mul_le_mul_of_nonneg_right hLR_norm hσ_pos.le + _ = σ * (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by ring + exact hJ_le_quads.trans (add_le_add hUpperQuad_le hLowerQuad_le) + +private theorem realRpowMomentRoot_le_natAnnealedMomentRoot_of_ae_le + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ζ : ℝ} {ξ : ℕ} {X Y : RegCoeffField d → ℝ} + (hζ_pos : 0 < ζ) (hζ_le_ξ : ζ ≤ (ξ : ℝ)) (hξ_one : 1 ≤ ξ) + (hX_meas : AEMeasurable X P) + (hX_nonneg : ∀ a, 0 ≤ X a) (hY_nonneg : ∀ a, 0 ≤ Y a) + (hY_memξ : MemLp Y (ξ : ENNReal) P) + (hXY : X ≤ᵐ[P] Y) : + Real.rpow (∫ a, Real.rpow (X a) ζ ∂P) ζ⁻¹ ≤ + Ch04.annealedMomentRoot P ξ Y := by + have hζ_ne_zero : ENNReal.ofReal ζ ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le.mpr hζ_pos] + have hζ_ne_top : ENNReal.ofReal ζ ≠ ⊤ := by + simp + have hζ_le_enn : ENNReal.ofReal ζ ≤ (ξ : ENNReal) := by + rw [← ENNReal.ofReal_natCast] + exact ENNReal.ofReal_le_ofReal hζ_le_ξ + have hY_memζ : MemLp Y (ENNReal.ofReal ζ) P := + hY_memξ.mono_exponent hζ_le_enn + have hX_memζ : MemLp X (ENNReal.ofReal ζ) P := by + refine hY_memζ.mono hX_meas.aestronglyMeasurable ?_ + filter_upwards [hXY] with a hle + rw [Real.norm_of_nonneg (hX_nonneg a), + Real.norm_of_nonneg (hY_nonneg a)] + exact hle + have hcmp₁ : + eLpNorm X (ENNReal.ofReal ζ) P ≤ + eLpNorm Y (ENNReal.ofReal ζ) P := by + refine eLpNorm_mono_ae ?_ + filter_upwards [hXY] with a hle + rw [Real.norm_of_nonneg (hX_nonneg a), + Real.norm_of_nonneg (hY_nonneg a)] + exact hle + have hcmp₂ : + eLpNorm Y (ENNReal.ofReal ζ) P ≤ eLpNorm Y (ξ : ENNReal) P := + eLpNorm_le_eLpNorm_of_exponent_le hζ_le_enn + hY_memξ.aestronglyMeasurable + have hcmp : + eLpNorm X (ENNReal.ofReal ζ) P ≤ eLpNorm Y (ξ : ENNReal) P := + hcmp₁.trans hcmp₂ + have hcmp_toReal : + (eLpNorm X (ENNReal.ofReal ζ) P).toReal ≤ + (eLpNorm Y (ξ : ENNReal) P).toReal := + ENNReal.toReal_mono hY_memξ.2.ne hcmp + have hleft : + (eLpNorm X (ENNReal.ofReal ζ) P).toReal = + Real.rpow (∫ a, Real.rpow (X a) ζ ∂P) ζ⁻¹ := by + rw [hX_memζ.eLpNorm_eq_integral_rpow_norm hζ_ne_zero hζ_ne_top] + have hnonneg : + 0 ≤ + (∫ a, ‖X a‖ ^ (ENNReal.ofReal ζ).toReal ∂P) ^ + (ENNReal.ofReal ζ).toReal⁻¹ := by + positivity + rw [ENNReal.toReal_ofReal hnonneg] + congr 1 + · exact integral_congr_ae (by + filter_upwards with a + rw [ENNReal.toReal_ofReal hζ_pos.le, + Real.norm_of_nonneg (hX_nonneg a), Real.rpow_eq_pow]) + · rw [ENNReal.toReal_ofReal hζ_pos.le] + have hright : + (eLpNorm Y (ξ : ENNReal) P).toReal = + Ch04.annealedMomentRoot P ξ Y := by + calc + (eLpNorm Y (ξ : ENNReal) P).toReal = + (∫ a, ‖Y a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := Y) (p := ξ) hξ_one hY_memξ + _ = (∫ a, Y a ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + congr 1 + exact integral_congr_ae (by + filter_upwards with a + rw [Real.norm_of_nonneg (hY_nonneg a)]) + _ = Ch04.annealedMomentRoot P ξ Y := rfl + calc + Real.rpow (∫ a, Real.rpow (X a) ζ ∂P) ζ⁻¹ = + (eLpNorm X (ENNReal.ofReal ζ) P).toReal := hleft.symm + _ ≤ (eLpNorm Y (ξ : ENNReal) P).toReal := hcmp_toReal + _ = Ch04.annealedMomentRoot P ξ Y := hright + +/-- Unit-scale response-moment bridge for the special vectors in the +one-step proof. The constant is `1`; the important point is that the +normalizations remain matched as +`\widehat\sigma_m^{-1} \Lambda + \widehat\sigma_m \lambda^{-1}`. -/ +theorem coarseFluctuationResponseMomentAtScale_zero_le_unitMomentWeightAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (he : Ch02.vecNorm e = 1) : + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e ≤ + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := by + let : IsProbabilityMeasure P := hP.isProbability + let ζ := section53CoarseFluctuationZeta hP4 + let ξ := hP4.xi + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + let I : RegCoeffField d → ℝ := + fun a => + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + let YUpper : RegCoeffField d → ℝ := fun a => σ⁻¹ * L a + let YLower : RegCoeffField d → ℝ := fun a => σ * I a + let Y : RegCoeffField d → ℝ := fun a => YUpper a + YLower a + let X : RegCoeffField d → ℝ := + fun a => + Ch04.restrictionResponseJObservableCubeSet (originCube d 0) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) a + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hζ_le_ξ : ζ ≤ (ξ : ℝ) := by + dsimp [ζ, ξ, section53CoarseFluctuationZeta] + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast hP4.two_le_xi + have hden_pos : 0 < (hP4.xi : ℝ) - 1 := by linarith + rw [div_le_iff₀ hden_pos] + nlinarith + have hξ_one : 1 ≤ ξ := + le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + have hξ_pos : 0 < ξ := lt_of_lt_of_le (by norm_num : 0 < 1) hξ_one + have hσ_pos : 0 < σ := by + simpa [σ] using GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hσ_inv_nonneg : 0 ≤ σ⁻¹ := (inv_pos.mpr hσ_pos).le + have hσ_nonneg : 0 ≤ σ := hσ_pos.le + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hP4.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hYUpper_nonneg : ∀ a, 0 ≤ YUpper a := fun a => + mul_nonneg hσ_inv_nonneg (hL_nonneg a) + have hYLower_nonneg : ∀ a, 0 ≤ YLower a := fun a => + mul_nonneg hσ_nonneg (hI_nonneg a) + have hY_nonneg : ∀ a, 0 ≤ Y a := fun a => + add_nonneg (hYUpper_nonneg a) (hYLower_nonneg a) + have hX_nonneg : ∀ a, 0 ≤ X a := fun a => + by + dsimp [X] + exact + Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d 0) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) a + have hX_meas : AEMeasurable X P := by + simpa [X] using! + hP.aemeasurable_restrictionResponseJObservableCubeSet + (originCube d 0) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hP4.sUpper_pos + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hP4.sLower_pos + have hYUpper_meas : AEMeasurable YUpper P := hL_meas.const_mul σ⁻¹ + have hYLower_meas : AEMeasurable YLower P := hI_meas.const_mul σ + have hL_int : Integrable (fun a => L a ^ ξ) P := by + simpa [L, ξ] using + Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hI_int : Integrable (fun a => I a ^ ξ) P := by + simpa [I, ξ] using + Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hL_mem : MemLp L (ξ : ENNReal) P := by + simpa [ξ] using + memLp_of_integrable_nonneg_nat_pow hξ_pos hL_meas + (Filter.Eventually.of_forall hL_nonneg) hL_int + have hI_mem : MemLp I (ξ : ENNReal) P := by + simpa [ξ] using + memLp_of_integrable_nonneg_nat_pow hξ_pos hI_meas + (Filter.Eventually.of_forall hI_nonneg) hI_int + have hYUpper_mem : MemLp YUpper (ξ : ENNReal) P := by + simpa [YUpper] using hL_mem.const_mul σ⁻¹ + have hYLower_mem : MemLp YLower (ξ : ENNReal) P := by + simpa [YLower] using hI_mem.const_mul σ + have hY_mem : MemLp Y (ξ : ENNReal) P := by + simpa [Y] using! hYUpper_mem.add hYLower_mem + have hpoint : X ≤ᵐ[P] Y := by + simpa [X, Y, YUpper, YLower, L, I, σ] using + responseJ_special_pointwise_le_weighted_factors + hP hStruct hP4 m e he + have hmoment_to_Y : + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e ≤ + Ch04.annealedMomentRoot P ξ Y := by + simpa [coarseFluctuationResponseMomentAtScale, X, ζ, ξ] using + realRpowMomentRoot_le_natAnnealedMomentRoot_of_ae_le + (P := P) (ζ := ζ) (ξ := ξ) (X := X) (Y := Y) + hζ_pos hζ_le_ξ hξ_one hX_meas hX_nonneg hY_nonneg hY_mem hpoint + have hYUpper_int : Integrable (fun a => YUpper a ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := Nat.ne_of_gt hξ_pos + have hint := hYUpper_mem.integrable_norm_pow hξ_ne + refine hint.congr ?_ + filter_upwards with a + rw [Real.norm_of_nonneg (hYUpper_nonneg a)] + have hYLower_int : Integrable (fun a => YLower a ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := Nat.ne_of_gt hξ_pos + have hint := hYLower_mem.integrable_norm_pow hξ_ne + refine hint.congr ?_ + filter_upwards with a + rw [Real.norm_of_nonneg (hYLower_nonneg a)] + have hY_root : + Ch04.annealedMomentRoot P ξ Y ≤ + σ⁻¹ * Ch04.LambdaMomentAtScale P 0 hP4.sUpper ξ + + σ * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower ξ := by + have hY_add : + Ch04.annealedMomentRoot P ξ Y ≤ + Ch04.annealedMomentRoot P ξ YUpper + + Ch04.annealedMomentRoot P ξ YLower := by + simpa [Y] using + VarianceBoundGoodScale.section54_annealedMomentRoot_add_le + (P := P) (ξ := ξ) (X := YUpper) (Y := YLower) + hξ_one hYUpper_nonneg hYLower_nonneg hYUpper_meas hYLower_meas + hYUpper_int hYLower_int + have hUpper_eq : + Ch04.annealedMomentRoot P ξ YUpper = + σ⁻¹ * Ch04.LambdaMomentAtScale P 0 hP4.sUpper ξ := by + simpa [YUpper, L, Ch04.LambdaMomentAtScale] using + Section52.section52_annealedMomentRoot_const_mul_of_nonneg + (P := P) (ξ := ξ) (c := σ⁻¹) (X := L) + hξ_one hσ_inv_nonneg hL_nonneg + have hLower_eq : + Ch04.annealedMomentRoot P ξ YLower = + σ * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower ξ := by + simpa [YLower, I, Ch04.lambdaInvMomentAtScale] using + Section52.section52_annealedMomentRoot_const_mul_of_nonneg + (P := P) (ξ := ξ) (c := σ) (X := I) + hξ_one hσ_nonneg hI_nonneg + simpa [hUpper_eq, hLower_eq] using hY_add + calc + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + ≤ Ch04.annealedMomentRoot P ξ Y := hmoment_to_Y + _ ≤ σ⁻¹ * Ch04.LambdaMomentAtScale P 0 hP4.sUpper ξ + + σ * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower ξ := hY_root + _ = coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := by + simp [coarseFluctuationUnitMomentWeightAtScale, σ, ξ, add_comm] + +/-- Product form of the unit-scale response-moment bridge, matching the +positive-excess term in the Section 5.3 RHS. -/ +theorem coarseFluctuationUnitMomentWeight_mul_responseMoment_zero_le_sq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (he : Ch02.vecNorm e = 1) : + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e ≤ + (coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m) ^ (2 : ℕ) := by + have hunit_nonneg : + 0 ≤ coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := by + have hσ_nonneg : + 0 ≤ sigmaHatAtScale hP hStruct (m : ℤ) := + Real.sqrt_nonneg _ + have hσ_inv_nonneg : + 0 ≤ (sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ := + inv_nonneg.mpr hσ_nonneg + have hLower : + 0 ≤ Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUpper : + 0 ≤ Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + dsimp [coarseFluctuationUnitMomentWeightAtScale] + exact add_nonneg (mul_nonneg hσ_nonneg hLower) + (mul_nonneg hσ_inv_nonneg hUpper) + have hresp_le := + coarseFluctuationResponseMomentAtScale_zero_le_unitMomentWeightAtScale + hP hStruct hP4 m e he + calc + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + ≤ coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m := by + exact mul_le_mul_of_nonneg_left hresp_le hunit_nonneg + _ = (coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m) ^ (2 : ℕ) := by + ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ScaleErrors.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ScaleErrors.lean new file mode 100644 index 0000000000..4ecaae3420 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/ScaleErrors.lean @@ -0,0 +1,420 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.BetaBridge + +/-! # Scale Errors -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +noncomputable section + +/-! +# Scale-separation errors for the one-step contraction + +The Section 5.3 tail terms contain the square of `widetildeTheta_0`. This +file records the Section 5.4 logarithmic absorption needed to make those tails +small. Constants are intentionally harmless: the final theorem will absorb +the numerical factors into its existential constant. +-/ + +/-- A scale-separation constant sufficient for the current one-step tail +absorption. -/ +noncomputable def oneStepScaleSeparationConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 2 * (Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 * + Real.log 3)⁻¹ + +/-- The one-step scale-separation constant is positive. -/ +theorem oneStepScaleSeparationConst_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < oneStepScaleSeparationConst hP4 := by + unfold oneStepScaleSeparationConst + have hβ : + 0 < Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 := + section53CoarseFluctuationBeta_pos hP4 + have hlog : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + positivity + +private theorem oneStepScaleSeparationConst_ge_section54 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 2 * (VarianceBoundGoodScale.section54VarianceBeta hP4 * Real.log 3)⁻¹ ≤ + oneStepScaleSeparationConst hP4 := by + have hβ53 : + 0 < Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 := + section53CoarseFluctuationBeta_pos hP4 + have hβ54 : 0 < VarianceBoundGoodScale.section54VarianceBeta hP4 := + VarianceBoundGoodScale.section54VarianceBeta_pos hP4 + have hlog : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβ_le : + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 ≤ + VarianceBoundGoodScale.section54VarianceBeta hP4 := + section53CoarseFluctuationBeta_le_section54VarianceBeta hP4 + have hprod_le : + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 * + Real.log 3 ≤ + VarianceBoundGoodScale.section54VarianceBeta hP4 * Real.log 3 := + mul_le_mul_of_nonneg_right hβ_le hlog.le + have hprod53 : + 0 < + Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 * + Real.log 3 := + mul_pos hβ53 hlog + have hinv : + (VarianceBoundGoodScale.section54VarianceBeta hP4 * Real.log 3)⁻¹ ≤ + (Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4 * + Real.log 3)⁻¹ := + inv_anti₀ hprod53 hprod_le + unfold oneStepScaleSeparationConst + exact mul_le_mul_of_nonneg_left hinv (by norm_num) + +private theorem rpow_decay_le_log_scale_two + {β C ξ δ T : ℝ} {m : ℕ} + (hβ : 0 < β) (hξ : 1 ≤ ξ) + (hδ : 0 < δ) (hT : 0 ≤ T) + (hC : 2 * (β * Real.log 3)⁻¹ ≤ C) + (hm : C * ξ * Real.log (2 + δ⁻¹ * ξ * T) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) (-β * (m : ℝ)) ≤ + Real.rpow (2 + δ⁻¹ * ξ * T) (-2 : ℝ) := by + let A : ℝ := 2 + δ⁻¹ * ξ * T + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβlog : 0 < β * Real.log (3 : ℝ) := mul_pos hβ hlog3 + have hξ_nonneg : 0 ≤ ξ := by linarith + have hA_ge_two : 2 ≤ A := by + have hprod : 0 ≤ δ⁻¹ * ξ * T := by + exact mul_nonneg (mul_nonneg (inv_nonneg.mpr hδ.le) hξ_nonneg) hT + dsimp [A] + linarith + have hA_pos : 0 < A := lt_of_lt_of_le (by norm_num) hA_ge_two + have hlogA_nonneg : 0 ≤ Real.log A := Real.log_nonneg (by linarith) + have hsep0 : + (2 * (β * Real.log 3)⁻¹) * Real.log A ≤ (m : ℝ) := by + have hC2 : 2 * (β * Real.log 3)⁻¹ ≤ C * ξ := by + have hC_nonneg : 0 ≤ C := by + exact le_trans (by positivity) hC + have hC_le_Cξ : C ≤ C * ξ := by + simpa using mul_le_mul_of_nonneg_left hξ hC_nonneg + exact hC.trans hC_le_Cξ + calc + (2 * (β * Real.log 3)⁻¹) * Real.log A ≤ + (C * ξ) * Real.log A := + mul_le_mul_of_nonneg_right hC2 hlogA_nonneg + _ = C * ξ * Real.log A := by ring + _ ≤ (m : ℝ) := by simpa [A] using hm + have hexp_le : + Real.log (3 : ℝ) * (-β * (m : ℝ)) ≤ Real.log A * (-2 : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hsep0 hβlog.le + have htwo : β * Real.log (3 : ℝ) * + ((2 * (β * Real.log 3)⁻¹) * Real.log A) = + 2 * Real.log A := by + field_simp [hβlog.ne'] + have hmain : 2 * Real.log A ≤ β * Real.log (3 : ℝ) * (m : ℝ) := by + calc + 2 * Real.log A = + β * Real.log (3 : ℝ) * + ((2 * (β * Real.log 3)⁻¹) * Real.log A) := htwo.symm + _ ≤ β * Real.log (3 : ℝ) * (m : ℝ) := hmul + calc + Real.log (3 : ℝ) * (-β * (m : ℝ)) = + -(β * Real.log (3 : ℝ) * (m : ℝ)) := by ring + _ ≤ -(2 * Real.log A) := neg_le_neg hmain + _ = Real.log A * (-2 : ℝ) := by ring + calc + Real.rpow (3 : ℝ) (-β * (m : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (-β * (m : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) + (y := -β * (m : ℝ)) (by norm_num : 0 < (3 : ℝ))) + _ ≤ Real.exp (Real.log A * (-2 : ℝ)) := + Real.exp_le_exp.mpr hexp_le + _ = Real.rpow A (-2 : ℝ) := by + simpa using + (Real.rpow_def_of_pos (x := A) (y := (-2 : ℝ)) hA_pos).symm + +private theorem rpow_neg_two_mul_sq_le_sqrt_delta + {δ A T : ℝ} (hδ_pos : 0 < δ) (hδ_le_half : δ ≤ 1 / 2) + (hA_ge_one : 1 ≤ A) (hT_nonneg : 0 ≤ T) + (hT_le : T ≤ δ * A) : + Real.rpow A (-2 : ℝ) * T ^ (2 : ℕ) ≤ Real.sqrt δ := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hA_inv_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr hA_pos.le + have hT_over_A : A⁻¹ * T ≤ δ := by + have hmul := mul_le_mul_of_nonneg_left hT_le hA_inv_nonneg + have hcancel : A⁻¹ * (δ * A) = δ := by + field_simp [hA_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + have hA_m2 : Real.rpow A (-2 : ℝ) = A⁻¹ ^ (2 : ℕ) := by + calc + Real.rpow A (-2 : ℝ) = (Real.rpow A (2 : ℝ))⁻¹ := by + simp + _ = (A ^ (2 : ℕ))⁻¹ := by + exact congrArg Inv.inv (Real.rpow_natCast A 2) + _ = A⁻¹ ^ (2 : ℕ) := by + field_simp [hA_pos.ne'] + have hT_over_A_sq : (A⁻¹ * T) ^ (2 : ℕ) ≤ δ ^ (2 : ℕ) := + pow_le_pow_left₀ (mul_nonneg hA_inv_nonneg hT_nonneg) hT_over_A 2 + have hdelta_sq_le_delta : δ ^ (2 : ℕ) ≤ δ := by + have hdelta_le_one : δ ≤ 1 := + hδ_le_half.trans (by norm_num : (1 / 2 : ℝ) ≤ 1) + calc + δ ^ (2 : ℕ) = δ * δ := by ring + _ ≤ δ * 1 := mul_le_mul_of_nonneg_left hdelta_le_one hδ_pos.le + _ = δ := by ring + have hdelta_le_sqrt : + δ ≤ Real.sqrt δ := + delta_le_sqrt_of_pos_of_le_half hδ_pos hδ_le_half + calc + Real.rpow A (-2 : ℝ) * T ^ (2 : ℕ) = + (A⁻¹ * T) ^ (2 : ℕ) := by + rw [hA_m2] + ring + _ ≤ δ ^ (2 : ℕ) := hT_over_A_sq + _ ≤ δ := hdelta_sq_le_delta + _ ≤ Real.sqrt δ := hdelta_le_sqrt + +private theorem rpow_neg_two_mul_self_le_sqrt_delta + {δ A T : ℝ} (hδ_pos : 0 < δ) (hδ_le_half : δ ≤ 1 / 2) + (hA_ge_one : 1 ≤ A) (hT_nonneg : 0 ≤ T) + (hT_le : T ≤ δ * A) : + Real.rpow A (-2 : ℝ) * T ≤ Real.sqrt δ := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hA_inv_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr hA_pos.le + have hA_inv_le_one : A⁻¹ ≤ 1 := by + exact inv_le_one_of_one_le₀ hA_ge_one + have hT_over_A : A⁻¹ * T ≤ δ := by + have hmul := mul_le_mul_of_nonneg_left hT_le hA_inv_nonneg + have hcancel : A⁻¹ * (δ * A) = δ := by + field_simp [hA_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + have hA_m2 : Real.rpow A (-2 : ℝ) = A⁻¹ ^ (2 : ℕ) := by + calc + Real.rpow A (-2 : ℝ) = (Real.rpow A (2 : ℝ))⁻¹ := by + simp + _ = (A ^ (2 : ℕ))⁻¹ := by + exact congrArg Inv.inv (Real.rpow_natCast A 2) + _ = A⁻¹ ^ (2 : ℕ) := by + field_simp [hA_pos.ne'] + have hlinear : + Real.rpow A (-2 : ℝ) * T ≤ A⁻¹ * T := by + rw [hA_m2, sq] + exact mul_le_mul_of_nonneg_right + (mul_le_of_le_one_left hA_inv_nonneg hA_inv_le_one) hT_nonneg + have hdelta_le_sqrt : + δ ≤ Real.sqrt δ := + delta_le_sqrt_of_pos_of_le_half hδ_pos hδ_le_half + exact hlinear.trans (hT_over_A.trans hdelta_le_sqrt) + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P (0 : ℤ) hP4 := by + simp [Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +private theorem le_delta_mul_log_scale_argument + {δ ξ T : ℝ} (hδ_pos : 0 < δ) (hξ_one : 1 ≤ ξ) (hT_nonneg : 0 ≤ T) : + T ≤ δ * (2 + δ⁻¹ * ξ * T) := by + have hξT : T ≤ ξ * T := by + calc + T = 1 * T := by ring + _ ≤ ξ * T := mul_le_mul_of_nonneg_right hξ_one hT_nonneg + have hcore : T ≤ δ * (δ⁻¹ * ξ * T) := by + calc + T ≤ ξ * T := hξT + _ = δ * (δ⁻¹ * ξ * T) := by + field_simp [hδ_pos.ne'] + have harg_le : δ⁻¹ * ξ * T ≤ 2 + δ⁻¹ * ξ * T := by + have htwo_nonneg : 0 ≤ (2 : ℝ) := by norm_num + exact le_add_of_nonneg_left htwo_nonneg + exact hcore.trans (mul_le_mul_of_nonneg_left harg_le hδ_pos.le) + +/-- The logarithmic scale separation absorbs the square of +`widetildeTheta_0`. -/ +theorem oneStepScaleSeparation_absorbs_widetildeThetaSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (hm : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) + (-(VarianceBoundGoodScale.section54VarianceBeta hP4) * (m : ℝ)) * + (widetildeThetaAtScale P (0 : ℤ) hP4) ^ (2 : ℕ) ≤ + Real.sqrt delta := by + let T : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let A : ℝ := 2 + delta⁻¹ * (hP4.xi : ℝ) * T + have hT_nonneg : 0 ≤ T := by + simpa [T] using widetildeThetaAtScale_zero_nonneg hP4 + have hxi_one : 1 ≤ (hP4.xi : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hP4.xi_pos) + have hdecay : + Real.rpow (3 : ℝ) + (-(VarianceBoundGoodScale.section54VarianceBeta hP4) * (m : ℝ)) ≤ + Real.rpow A (-2 : ℝ) := + rpow_decay_le_log_scale_two + (β := VarianceBoundGoodScale.section54VarianceBeta hP4) (C := C) + (ξ := (hP4.xi : ℝ)) (δ := delta) (T := T) (m := m) + (VarianceBoundGoodScale.section54VarianceBeta_pos hP4) hxi_one + hdelta_pos hT_nonneg + ((oneStepScaleSeparationConst_ge_section54 hP4).trans hC) + (by simpa [T, A, mul_assoc] using hm) + have hA_ge_one : 1 ≤ A := by + have hprod : 0 ≤ delta⁻¹ * (hP4.xi : ℝ) * T := + mul_nonneg (mul_nonneg (inv_nonneg.mpr hdelta_pos.le) (by linarith)) hT_nonneg + dsimp [A] + linarith + have hT_le : T ≤ delta * A := by + simpa [A, mul_assoc] using + le_delta_mul_log_scale_argument hdelta_pos hxi_one hT_nonneg + exact + (mul_le_mul_of_nonneg_right hdecay (sq_nonneg T)).trans + (by + simpa [T, A] using + rpow_neg_two_mul_sq_le_sqrt_delta hdelta_pos hdelta_le_half + hA_ge_one hT_nonneg hT_le) + +/-- The same logarithmic scale separation absorbs the Section 5.3-beta tail +that appears in the final coarse-fluctuation RHS. -/ +theorem oneStepScaleSeparation_absorbs_section53Beta_widetildeThetaSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (hm : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) + (-(Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) * + (m : ℝ)) * + (widetildeThetaAtScale P (0 : ℤ) hP4) ^ (2 : ℕ) ≤ + Real.sqrt delta := by + let T : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let A : ℝ := 2 + delta⁻¹ * (hP4.xi : ℝ) * T + have hT_nonneg : 0 ≤ T := by + simpa [T] using widetildeThetaAtScale_zero_nonneg hP4 + have hxi_one : 1 ≤ (hP4.xi : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hP4.xi_pos) + have hdecay : + Real.rpow (3 : ℝ) + (-(Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) * + (m : ℝ)) ≤ + Real.rpow A (-2 : ℝ) := + rpow_decay_le_log_scale_two + (β := Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) + (C := C) (ξ := (hP4.xi : ℝ)) (δ := delta) (T := T) (m := m) + (section53CoarseFluctuationBeta_pos hP4) hxi_one + hdelta_pos hT_nonneg (by simpa [oneStepScaleSeparationConst] using hC) + (by simpa [T, A, mul_assoc] using hm) + have hA_ge_one : 1 ≤ A := by + have hprod : 0 ≤ delta⁻¹ * (hP4.xi : ℝ) * T := + mul_nonneg (mul_nonneg (inv_nonneg.mpr hdelta_pos.le) (by linarith)) hT_nonneg + dsimp [A] + linarith + have hT_le : T ≤ delta * A := by + simpa [A, mul_assoc] using + le_delta_mul_log_scale_argument hdelta_pos hxi_one hT_nonneg + exact + (mul_le_mul_of_nonneg_right hdecay (sq_nonneg T)).trans + (by + simpa [T, A] using + rpow_neg_two_mul_sq_le_sqrt_delta hdelta_pos hdelta_le_half + hA_ge_one hT_nonneg hT_le) + +/-- The same logarithmic scale separation absorbs both +`3^{-βm} widetildeTheta_0` and +`3^{-βm} widetildeTheta_0^2` for the Section 5.3 beta. -/ +theorem oneStepScaleSeparation_absorbs_section53Beta_widetildeThetaBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : oneStepScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (hm : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) + (-(Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) * + (m : ℝ)) * + (widetildeThetaAtScale P (0 : ℤ) hP4 + + (widetildeThetaAtScale P (0 : ℤ) hP4) ^ (2 : ℕ)) ≤ + 2 * Real.sqrt delta := by + let T : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let A : ℝ := 2 + delta⁻¹ * (hP4.xi : ℝ) * T + let D : ℝ := + Real.rpow (3 : ℝ) + (-(Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) * + (m : ℝ)) + have hT_nonneg : 0 ≤ T := by + simpa [T] using widetildeThetaAtScale_zero_nonneg hP4 + have hxi_one : 1 ≤ (hP4.xi : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hP4.xi_pos) + have hdecay : D ≤ Real.rpow A (-2 : ℝ) := + rpow_decay_le_log_scale_two + (β := Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBeta hP4) + (C := C) (ξ := (hP4.xi : ℝ)) (δ := delta) (T := T) (m := m) + (section53CoarseFluctuationBeta_pos hP4) hxi_one + hdelta_pos hT_nonneg (by simpa [oneStepScaleSeparationConst] using hC) + (by simpa [T, A, mul_assoc] using hm) + have hA_ge_one : 1 ≤ A := by + have hprod : 0 ≤ delta⁻¹ * (hP4.xi : ℝ) * T := + mul_nonneg (mul_nonneg (inv_nonneg.mpr hdelta_pos.le) (by linarith)) hT_nonneg + dsimp [A] + linarith + have hT_le : T ≤ delta * A := by + simpa [A, mul_assoc] using + le_delta_mul_log_scale_argument hdelta_pos hxi_one hT_nonneg + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hlinear : + D * T ≤ Real.sqrt delta := by + exact + (mul_le_mul_of_nonneg_right hdecay hT_nonneg).trans + (by + simpa [T, A] using + rpow_neg_two_mul_self_le_sqrt_delta hdelta_pos hdelta_le_half + hA_ge_one hT_nonneg hT_le) + have hsquare : + D * T ^ (2 : ℕ) ≤ Real.sqrt delta := by + exact + (mul_le_mul_of_nonneg_right hdecay (sq_nonneg T)).trans + (by + simpa [T, A] using + rpow_neg_two_mul_sq_le_sqrt_delta hdelta_pos hdelta_le_half + hA_ge_one hT_nonneg hT_le) + calc + D * (T + T ^ (2 : ℕ)) = D * T + D * T ^ (2 : ℕ) := by ring + _ ≤ Real.sqrt delta + Real.sqrt delta := add_le_add hlinear hsquare + _ = 2 * Real.sqrt delta := by ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/TauSum.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/TauSum.lean new file mode 100644 index 0000000000..cc576274ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/OneStepContraction/TauSum.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ScaleErrors + +/-! # Tau Sum -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace OneStepContraction + +open scoped BigOperators + +noncomputable section + +/-! +# Tau-sum absorption for the one-step contraction + +The Section 5.3 coarse-fluctuation estimate contains a beta-weighted sum of +additivity defects multiplied by a scalar coefficient combination. At a good +scale this term is `O(delta * Theta_0)`, hence also +`O(sqrt(delta) * Theta_0)` in the manuscript range. +-/ + +/-- The Section 5.4 beta-weighted additivity-defect sum used in the one-step +contraction proof. -/ +noncomputable def oneStepTauSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) : ℝ := + let β := VarianceBoundGoodScale.section54VarianceBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e + +/-- The harmless geometric constant for the one-step tau-sum absorption. -/ +noncomputable def oneStepTauSumConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 3 * (geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1)⁻¹ + +/-- The tau-sum constant is nonnegative. -/ +theorem oneStepTauSumConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ oneStepTauSumConst hP4 := by + unfold oneStepTauSumConst + have hgeo : + 0 < geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1 := + geometricDiscount_pos + (by simpa using VarianceBoundGoodScale.section54VarianceBeta_pos hP4) + positivity + +/-- The scalar weight multiplying the tau sum is nonnegative. -/ +theorem oneStepScalarWeightAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ oneStepScalarWeightAtScale hP hStruct m := by + have hσ : 0 < sigmaHatAtScale hP hStruct (m : ℤ) := + GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hb0 : 0 < hP.barSigmaAtScale hStruct 0 := + Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0 : 0 < hP.barSigmaStarAtScale hStruct 0 := + Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + dsimp [oneStepScalarWeightAtScale] + positivity + +/-- At a good scale, the weighted tau sum is bounded by the geometric tail +times `delta * sqrt(Theta_0)`. -/ +theorem oneStepTauSumAtScale_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + oneStepTauSumAtScale hP hStruct hP4 m e ≤ + (geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1)⁻¹ * + (delta * Real.sqrt (thetaAtScale hP hStruct 0)) := by + let β := VarianceBoundGoodScale.section54VarianceBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let K := delta * Real.sqrt (thetaAtScale hP hStruct 0) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg hdelta_pos.le (Real.sqrt_nonneg _) + have hpoint : + ∀ j, j ∈ Finset.Icc 1 m → + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e ≤ K := by + intro j hj + have hj_le : j ≤ m := (Finset.mem_Icc.mp hj).2 + simpa [p_e, q_e, K] using + goodScale_tau_le hP hStruct hP4 hdelta_pos hdelta_le + (m := m) (j := j) hj_le hgood_upper hgood_lower e he + have hsum_const : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e) ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) * K := + VarianceBoundGoodScale.sum_Icc_varianceWeight_mul_le_const_mul + (β := β) (C := K) (m := m) + (f := fun j => tauAtScale P (m : ℤ) (j : ℤ) p_e q_e) hpoint + have hweights : + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) ≤ + (geometricDiscount β 1)⁻¹ := + VarianceBoundGoodScale.sum_Icc_varianceWeight_le_inv_geometricDiscount + (by simpa [β] using VarianceBoundGoodScale.section54VarianceBeta_pos hP4) m + calc + oneStepTauSumAtScale hP hStruct hP4 m e = + ∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j * + tauAtScale P (m : ℤ) (j : ℤ) p_e q_e := by + simp [oneStepTauSumAtScale, β, p_e, q_e] + _ ≤ + (∑ j ∈ Finset.Icc 1 m, + VarianceBoundGoodScale.varianceWeight β m j) * K := + hsum_const + _ ≤ (geometricDiscount β 1)⁻¹ * K := + mul_le_mul_of_nonneg_right hweights hK_nonneg + _ = + (geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1)⁻¹ * + (delta * Real.sqrt (thetaAtScale hP hStruct 0)) := by + rfl + +/-- At a good scale, the scalar-weighted tau sum is +`O(delta * Theta_0)`. -/ +theorem oneStepScalarWeight_mul_tauSum_le_delta_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + oneStepScalarWeightAtScale hP hStruct m * + oneStepTauSumAtScale hP hStruct hP4 m e ≤ + oneStepTauSumConst hP4 * delta * thetaAtScale hP hStruct 0 := by + let θ0 := thetaAtScale hP hStruct 0 + let sqrtθ0 := Real.sqrt θ0 + let B := (geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1)⁻¹ + have hscalar_nonneg : + 0 ≤ oneStepScalarWeightAtScale hP hStruct m := + oneStepScalarWeightAtScale_nonneg hP hStruct hP4 m + have hscalar_le : + oneStepScalarWeightAtScale hP hStruct m ≤ 3 * sqrtθ0 := by + simpa [sqrtθ0] using! + goodScale_oneStepScalarWeight_le hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have htau_le : + oneStepTauSumAtScale hP hStruct hP4 m e ≤ B * (delta * sqrtθ0) := by + simpa [B, sqrtθ0] using! + oneStepTauSumAtScale_le hP hStruct hP4 hdelta_pos hdelta_le + hgood_upper hgood_lower e he + have hB_nonneg : 0 ≤ B := by + dsimp [B] + have hgeo : + 0 < geometricDiscount (VarianceBoundGoodScale.section54VarianceBeta hP4) 1 := + geometricDiscount_pos + (by simpa using VarianceBoundGoodScale.section54VarianceBeta_pos hP4) + positivity + have htau_bound_nonneg : 0 ≤ B * (delta * sqrtθ0) := by + exact mul_nonneg hB_nonneg + (mul_nonneg hdelta_pos.le (by dsimp [sqrtθ0]; exact Real.sqrt_nonneg _)) + have hsqrt_nonneg : 0 ≤ sqrtθ0 := by + dsimp [sqrtθ0] + exact Real.sqrt_nonneg _ + have htheta_nonneg : 0 ≤ θ0 := by + dsimp [θ0] + exact le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + have hsqrt_sq : sqrtθ0 * sqrtθ0 = θ0 := by + dsimp [sqrtθ0] + exact Real.mul_self_sqrt htheta_nonneg + calc + oneStepScalarWeightAtScale hP hStruct m * + oneStepTauSumAtScale hP hStruct hP4 m e ≤ + oneStepScalarWeightAtScale hP hStruct m * + (B * (delta * sqrtθ0)) := + mul_le_mul_of_nonneg_left htau_le hscalar_nonneg + _ ≤ (3 * sqrtθ0) * (B * (delta * sqrtθ0)) := + mul_le_mul_of_nonneg_right hscalar_le htau_bound_nonneg + _ = 3 * B * delta * (sqrtθ0 * sqrtθ0) := by ring + _ = 3 * B * delta * θ0 := by rw [hsqrt_sq] + _ = oneStepTauSumConst hP4 * delta * thetaAtScale hP hStruct 0 := by + simp [oneStepTauSumConst, B, θ0] + +/-- At a good scale, the scalar-weighted tau sum is also +`O(sqrt(delta) * Theta_0)`. -/ +theorem oneStepScalarWeight_mul_tauSum_le_sqrt_delta_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + {m : ℕ} + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (e : Vec d) (he : Ch02.vecNorm e = 1) : + oneStepScalarWeightAtScale hP hStruct m * + oneStepTauSumAtScale hP hStruct hP4 m e ≤ + oneStepTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + have hdelta_le_sqrt : + delta ≤ Real.sqrt delta := + delta_le_sqrt_of_pos_of_le_half hdelta_pos hdelta_le + have hC_nonneg : 0 ≤ oneStepTauSumConst hP4 := + oneStepTauSumConst_nonneg hP4 + have htheta_nonneg : + 0 ≤ thetaAtScale hP hStruct 0 := + le_trans zero_le_one (one_le_thetaAtScale_zero_of_P4 hP hStruct hP4) + calc + oneStepScalarWeightAtScale hP hStruct m * + oneStepTauSumAtScale hP hStruct hP4 m e ≤ + oneStepTauSumConst hP4 * delta * thetaAtScale hP hStruct 0 := + oneStepScalarWeight_mul_tauSum_le_delta_theta + hP hStruct hP4 hdelta_pos hdelta_le hgood_upper hgood_lower e he + _ ≤ oneStepTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + calc + oneStepTauSumConst hP4 * delta * thetaAtScale hP hStruct 0 = + (oneStepTauSumConst hP4 * thetaAtScale hP hStruct 0) * delta := by + ring + _ ≤ (oneStepTauSumConst hP4 * thetaAtScale hP hStruct 0) * + Real.sqrt delta := + mul_le_mul_of_nonneg_left hdelta_le_sqrt + (mul_nonneg hC_nonneg htheta_nonneg) + _ = oneStepTauSumConst hP4 * Real.sqrt delta * + thetaAtScale hP hStruct 0 := by + ring + +end + +end OneStepContraction +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole.lean new file mode 100644 index 0000000000..db49395d2d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.Assembly + +/-! # Pigeonhole -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 + +/-! +# Pigeonhole lemma + +This module is the public entry point for the first result of Section 5.4. +-/ + +noncomputable section + +/-- Section 5.4 pigeonhole lemma for the annealed scalar contrast. Either +there is a scale `n ∈ {h, ..., N}` at which both scalar chains are nearly +stationary across the gap `h`, or the contrast has already contracted by +`sigma`. -/ +theorem pigeonhole_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta sigma : ℝ} (hdelta_pos : 0 < delta) + (hdelta_le : delta ≤ 1 / 2) + (hsigma_pos : 0 < sigma) (hsigma_le : sigma ≤ 1 / 2) + {N h : ℕ} + (hsep : (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|)) * h ≤ N) : + (∃ n : ℕ, + h ≤ n ∧ n ≤ N ∧ + hP.barSigmaAtScale hStruct ((n - h : ℕ) : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (n : ℤ) ∧ + (hP.barSigmaStarAtScale hStruct ((n - h : ℕ) : ℤ))⁻¹ ≤ + (1 + delta) * + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹) ∨ + thetaAtScale hP hStruct (N : ℤ) ≤ + sigma * thetaAtScale hP hStruct 0 := by + classical + let k : ℕ := Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) + by_cases hh : h = 0 + · subst h + left + refine ⟨0, by simp, Nat.zero_le N, ?_, ?_⟩ + · have hfactor : (1 : ℝ) ≤ 1 + delta := by linarith + have hnonneg : 0 ≤ hP.barSigmaAtScale hStruct (0 : ℤ) := + (Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0).le + simpa using mul_le_mul_of_nonneg_right hfactor hnonneg + · have hfactor : (1 : ℝ) ≤ 1 + delta := by linarith + have hnonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct (0 : ℤ))⁻¹ := + (Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 hP hStruct hP4 0).le + simpa using mul_le_mul_of_nonneg_right hfactor hnonneg + · by_cases hgood : ∃ n : ℕ, + h ≤ n ∧ n ≤ N ∧ + hP.barSigmaAtScale hStruct ((n - h : ℕ) : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (n : ℤ) ∧ + (hP.barSigmaStarAtScale hStruct ((n - h : ℕ) : ℤ))⁻¹ ≤ + (1 + delta) * + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ + · exact Or.inl hgood + · right + let a : ℕ → ℝ := fun m => hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℕ → ℝ := fun m => (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + let A : ℕ → ℝ := fun j => a (j * h) * b (j * h) + let r : ℝ := (1 + delta)⁻¹ + have hr_nonneg : 0 ≤ r := by dsimp [r]; positivity + have hstep : ∀ j : ℕ, 1 ≤ j → j ≤ k → A j ≤ r * A (j - 1) := by + intro j hj_pos hj_le + have hprev_eq : j * h - h = (j - 1) * h := by + cases j with + | zero => omega + | succ j => simp [Nat.succ_mul] + have h_le_now : h ≤ j * h := by + calc + h = 1 * h := by simp + _ ≤ j * h := Nat.mul_le_mul_right h hj_pos + have hnow_le_kh : j * h ≤ k * h := Nat.mul_le_mul_right h hj_le + have hnow_le_N : j * h ≤ N := + Nat.le_trans hnow_le_kh (by simpa [k] using hsep) + have hbad_step : ¬ + (a ((j - 1) * h) ≤ (1 + delta) * a (j * h) ∧ + b ((j - 1) * h) ≤ (1 + delta) * b (j * h)) := by + intro hpair + apply hgood + refine ⟨j * h, h_le_now, hnow_le_N, ?_, ?_⟩ + · simpa [a, hprev_eq] using hpair.1 + · simpa [b, hprev_eq] using hpair.2 + have hprev_le_now : (j - 1) * h ≤ j * h := + Nat.mul_le_mul_right h (Nat.sub_le j 1) + have hchain := Pigeonhole.scalarChain_of_P4 hP hStruct hP4 hprev_le_now + have ha_mono : a (j * h) ≤ a ((j - 1) * h) := by + simpa [a] using hchain.2.2 + have hb_mono : b (j * h) ≤ b ((j - 1) * h) := by + simpa [b] using hchain.2.1 + have ha_now_nonneg : 0 ≤ a (j * h) := + (Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 (j * h)).le + have hb_now_nonneg : 0 ≤ b (j * h) := + (Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 hP hStruct hP4 (j * h)).le + simpa [A, a, b, r] using + Pigeonhole.product_step_le_inv_mul_of_not_good hdelta_pos + ha_now_nonneg hb_now_nonneg ha_mono hb_mono hbad_step + have hgeom : A k ≤ r ^ k * A 0 := + Pigeonhole.iterate_le_geometric_of_step hr_nonneg k hstep + have hchainN := + Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (by simpa [k] using hsep) + have hthetaN_le_Ak : thetaAtScale hP hStruct (N : ℤ) ≤ A k := by + have ha_mono : + hP.barSigmaAtScale hStruct (N : ℤ) ≤ + hP.barSigmaAtScale hStruct ((k * h : ℕ) : ℤ) := by + simpa using hchainN.2.2 + have hb_mono : + (hP.barSigmaStarAtScale hStruct (N : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct ((k * h : ℕ) : ℤ))⁻¹ := by + simpa using hchainN.2.1 + have hbN_nonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct (N : ℤ))⁻¹ := + (Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 hP hStruct hP4 N).le + have haK_nonneg : 0 ≤ hP.barSigmaAtScale hStruct ((k * h : ℕ) : ℤ) := + (Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 (k * h)).le + have hprod := mul_le_mul ha_mono hb_mono hbN_nonneg haK_nonneg + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, A, a, b] using hprod + have hA0_nonneg : 0 ≤ A 0 := by + have ha0 := Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hb0 := Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 hP hStruct hP4 0 + simpa [A, a, b] using (mul_pos ha0 hb0).le + have hsigma_le_one : sigma ≤ 1 := by linarith + have htail : r ^ k ≤ sigma := by + simpa [r, k] using + Pigeonhole.inv_one_add_delta_pow_natCeil_two_delta_inv_abs_log_le + hdelta_pos hdelta_le hsigma_pos hsigma_le_one + have hAk_le_sigma : A k ≤ sigma * A 0 := by + calc + A k ≤ r ^ k * A 0 := hgeom + _ ≤ sigma * A 0 := mul_le_mul_of_nonneg_right htail hA0_nonneg + calc + thetaAtScale hP hStruct (N : ℤ) ≤ A k := hthetaN_le_Ak + _ ≤ sigma * A 0 := hAk_le_sigma + _ = sigma * thetaAtScale hP hStruct 0 := by + simp [A, a, b, thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] + +end + +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/Assembly.lean new file mode 100644 index 0000000000..267469d055 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/Assembly.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.RealAlgebra + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace Pigeonhole + +noncomputable section + +/-! +# Assembly staging for the Section 5.4 pigeonhole lemma + +The manuscript-facing theorem will live here. Its scalar-chain input is now +available from `(P4)`; the remaining work is the finite pigeonhole and +telescoping argument over the arithmetic progression of scales. +-/ + +/-- If one of the two good-scale inequalities fails while both scalar chains +are monotone, then the product contracts by `(1 + δ)⁻¹`. -/ +theorem product_step_le_inv_mul_of_not_good + {delta aPrev aNow bPrev bNow : ℝ} (hdelta_pos : 0 < delta) + (haNow_nonneg : 0 ≤ aNow) (hbNow_nonneg : 0 ≤ bNow) + (ha_mono : aNow ≤ aPrev) (hb_mono : bNow ≤ bPrev) + (hbad : ¬ (aPrev ≤ (1 + delta) * aNow ∧ + bPrev ≤ (1 + delta) * bNow)) : + aNow * bNow ≤ (1 + delta)⁻¹ * (aPrev * bPrev) := by + let c : ℝ := 1 + delta + have hc_pos : 0 < c := by dsimp [c]; positivity + have hc_inv_nonneg : 0 ≤ c⁻¹ := (inv_pos.mpr hc_pos).le + have haPrev_nonneg : 0 ≤ aPrev := le_trans haNow_nonneg ha_mono + have hbPrev_nonneg : 0 ≤ bPrev := le_trans hbNow_nonneg hb_mono + by_cases ha_good : aPrev ≤ c * aNow + · have hb_bad : ¬ bPrev ≤ c * bNow := by + intro hb_good + exact hbad ⟨by simpa [c] using ha_good, by simpa [c] using hb_good⟩ + have hb_contract : bNow ≤ c⁻¹ * bPrev := + (le_inv_mul_iff₀ hc_pos).2 (not_le.mp hb_bad).le + have hmul : aNow * bNow ≤ aPrev * (c⁻¹ * bPrev) := + mul_le_mul ha_mono hb_contract hbNow_nonneg haPrev_nonneg + calc + aNow * bNow ≤ aPrev * (c⁻¹ * bPrev) := hmul + _ = c⁻¹ * (aPrev * bPrev) := by ring + _ = (1 + delta)⁻¹ * (aPrev * bPrev) := by simp [c] + · have ha_contract : aNow ≤ c⁻¹ * aPrev := + (le_inv_mul_iff₀ hc_pos).2 (not_le.mp ha_good).le + have hright_nonneg : 0 ≤ c⁻¹ * aPrev := + mul_nonneg hc_inv_nonneg haPrev_nonneg + have hmul : aNow * bNow ≤ (c⁻¹ * aPrev) * bPrev := + mul_le_mul ha_contract hb_mono hbNow_nonneg hright_nonneg + calc + aNow * bNow ≤ (c⁻¹ * aPrev) * bPrev := hmul + _ = c⁻¹ * (aPrev * bPrev) := by ring + _ = (1 + delta)⁻¹ * (aPrev * bPrev) := by simp [c] + +/-- A one-sided finite Gronwall estimate for a sequence whose consecutive +steps are bounded by multiplication by `r`. -/ +theorem iterate_le_geometric_of_step + {A : ℕ → ℝ} {r : ℝ} (hr_nonneg : 0 ≤ r) : + ∀ k : ℕ, + (∀ j : ℕ, 1 ≤ j → j ≤ k → A j ≤ r * A (j - 1)) → + A k ≤ r ^ k * A 0 + | 0, _ => by simp + | k + 1, hstep => by + have hprev : A k ≤ r ^ k * A 0 := + iterate_le_geometric_of_step hr_nonneg k (by + intro j hj_pos hj_le + exact hstep j hj_pos (Nat.le_trans hj_le (Nat.le_succ k))) + have hlast : A (k + 1) ≤ r * A ((k + 1) - 1) := + hstep (k + 1) (Nat.succ_le_succ (Nat.zero_le k)) le_rfl + have hlast' : A (k + 1) ≤ r * A k := by + simpa using hlast + calc + A (k + 1) ≤ r * A k := hlast' + _ ≤ r * (r ^ k * A 0) := mul_le_mul_of_nonneg_left hprev hr_nonneg + _ = r ^ (k + 1) * A 0 := by ring + +end + +end Pigeonhole +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/RealAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/RealAlgebra.lean new file mode 100644 index 0000000000..7cea8768aa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/RealAlgebra.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common + +/-! # Real Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace Pigeonhole + +noncomputable section + +/-! +# Real-variable staging for the Section 5.4 pigeonhole lemma + +The final pigeonhole proof needs a small logarithmic estimate for the chosen +number of scale steps. This file is reserved for that pure real algebra, +separate from the law-facing scalar-chain input. +-/ + +/-- The logarithmic scale count used in the pigeonhole lemma makes the +exponential tail at most `sigma`. -/ +theorem exp_neg_half_delta_mul_natCeil_two_delta_inv_abs_log_le + {delta sigma : ℝ} (hdelta_pos : 0 < delta) + (hsigma_pos : 0 < sigma) (hsigma_le_one : sigma ≤ 1) : + Real.exp + (-((1 / 2 : ℝ) * delta * + (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) : ℝ))) ≤ sigma := by + let k : ℕ := Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) + have hceil : 2 * delta⁻¹ * |Real.log sigma| ≤ (k : ℝ) := by + simpa [k] using Nat.le_ceil (2 * delta⁻¹ * |Real.log sigma|) + have hhalf_delta_pos : 0 < (1 / 2 : ℝ) * delta := by positivity + have hlog_nonpos : Real.log sigma ≤ 0 := + Real.log_nonpos hsigma_pos.le hsigma_le_one + have habs_log : |Real.log sigma| = -Real.log sigma := + abs_of_nonpos hlog_nonpos + have hscale : + ((1 / 2 : ℝ) * delta) * (2 * delta⁻¹ * |Real.log sigma|) = + |Real.log sigma| := by + field_simp [hdelta_pos.ne'] + have hlog_abs_le : + |Real.log sigma| ≤ ((1 / 2 : ℝ) * delta) * (k : ℝ) := by + calc + |Real.log sigma| = + ((1 / 2 : ℝ) * delta) * (2 * delta⁻¹ * |Real.log sigma|) := + hscale.symm + _ ≤ ((1 / 2 : ℝ) * delta) * (k : ℝ) := + mul_le_mul_of_nonneg_left hceil hhalf_delta_pos.le + have hlog_bound : + -(((1 / 2 : ℝ) * delta) * (k : ℝ)) ≤ Real.log sigma := by + have hneg := neg_le_neg hlog_abs_le + simpa [habs_log] using hneg + rw [← Real.exp_log hsigma_pos] + exact Real.exp_le_exp.mpr (by simpa [k, mul_assoc] using hlog_bound) + +/-- The elementary estimate `(1 + δ)⁻¹ ≤ exp (-δ / 2)` on the range used by +the pigeonhole lemma. -/ +theorem inv_one_add_delta_le_exp_neg_half + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le : delta ≤ 1 / 2) : + (1 + delta)⁻¹ ≤ Real.exp (-((1 / 2 : ℝ) * delta)) := by + have hlog_low : (1 / 2 : ℝ) * delta ≤ Real.log (1 + delta) := by + have hmain := Real.le_log_one_add_of_nonneg hdelta_nonneg + have hden_pos : 0 < delta + 2 := by positivity + have hhalf_le : (1 / 2 : ℝ) * delta ≤ 2 * delta / (delta + 2) := by + rw [le_div_iff₀ hden_pos] + nlinarith + exact le_trans hhalf_le hmain + have hbase_pos : 0 < 1 + delta := by positivity + calc + (1 + delta)⁻¹ = (Real.exp (Real.log (1 + delta)))⁻¹ := by + rw [Real.exp_log hbase_pos] + _ = Real.exp (-Real.log (1 + delta)) := by + rw [Real.exp_neg] + _ ≤ Real.exp (-((1 / 2 : ℝ) * delta)) := + Real.exp_le_exp.mpr (neg_le_neg hlog_low) + +/-- Iterated version of `inv_one_add_delta_le_exp_neg_half`. -/ +theorem inv_one_add_delta_pow_le_exp_neg_half_mul + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le : delta ≤ 1 / 2) (k : ℕ) : + ((1 + delta)⁻¹) ^ k ≤ + Real.exp (-((1 / 2 : ℝ) * delta * (k : ℝ))) := by + have hbase := inv_one_add_delta_le_exp_neg_half hdelta_nonneg hdelta_le + calc + ((1 + delta)⁻¹) ^ k ≤ Real.exp (-((1 / 2 : ℝ) * delta)) ^ k := + pow_le_pow_left₀ (by positivity : 0 ≤ (1 + delta)⁻¹) hbase k + _ = Real.exp (-((1 / 2 : ℝ) * delta * (k : ℝ))) := by + rw [← Real.exp_nat_mul] + congr 1 + ring + +/-- The manuscript scale count makes the repeated `(1 + δ)⁻¹` loss no larger +than `σ`. -/ +theorem inv_one_add_delta_pow_natCeil_two_delta_inv_abs_log_le + {delta sigma : ℝ} (hdelta_pos : 0 < delta) (hdelta_le : delta ≤ 1 / 2) + (hsigma_pos : 0 < sigma) (hsigma_le_one : sigma ≤ 1) : + ((1 + delta)⁻¹) ^ Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) ≤ sigma := by + have hpow := + inv_one_add_delta_pow_le_exp_neg_half_mul hdelta_pos.le hdelta_le + (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|)) + have hexp := + exp_neg_half_delta_mul_natCeil_two_delta_inv_abs_log_le + hdelta_pos hsigma_pos hsigma_le_one + exact le_trans hpow hexp + +end + +end Pigeonhole +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/ScalarChain.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/ScalarChain.lean new file mode 100644 index 0000000000..e46d625f83 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/Pigeonhole/ScalarChain.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common + +/-! # Scalar Chain -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace Pigeonhole + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Scalar-chain input for the Section 5.4 pigeonhole lemma + +The manuscript pigeonhole argument uses monotonicity of the scalar annealed +coefficients. The current Ch4 endpoint proves this from full coarse-block +integrability; this file records the exact Section 5.4-facing consequence +without making it part of the public pigeonhole theorem statement. +-/ + +/-- Component-wise scalar-chain monotonicity obtained from the existing Ch4 +full-block integrability endpoint. -/ +theorem scalarChain_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {n m : ℤ} (hn_nonneg : 0 ≤ n) (hnm : n ≤ m) + (hParentBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d m)) P) + (hChildBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) + (hDescBlockInt : + ∀ R, R ∈ descendantsAtScale (originCube d m) n → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P) : + hP.barSigmaStarAtScale hStruct n ≤ hP.barSigmaStarAtScale hStruct m ∧ + (hP.barSigmaStarAtScale hStruct m)⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct n)⁻¹ ∧ + hP.barSigmaAtScale hStruct m ≤ hP.barSigmaAtScale hStruct n := by + let scalarization := + Ch04.Internal.annealedScalarizationTheory_of_structuralLaw hP hStruct + let hPrim_m := + Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct m + let hPrim_n := + Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct n + have hStarInv_m_pos : 0 < hPrim_m.barSigmaStarInv := + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP hPrim_m hParentBlockInt + have hStarInv_n_pos : 0 < hPrim_n.barSigmaStarInv := + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP hPrim_n hChildBlockInt + have hContrast_m : 1 ≤ hPrim_m.contrast := + Ch04.RestrictionLawCarrier.Internal.one_le_primitive_contrast_of_integrable_coarseFullBlockMatrixAtCube + hP hPrim_m hParentBlockInt + have hChain := + Ch04.RestrictionLawCarrier.Internal.scalar_chain_of_primitive_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct.stationary hn_nonneg hnm scalarization hPrim_m hPrim_n + hParentBlockInt hDescBlockInt hStarInv_m_pos hContrast_m + have hStar_nm : + hP.barSigmaStarAtScale hStruct n ≤ hP.barSigmaStarAtScale hStruct m := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarAtScale, scalarization] using hChain.1 + have hSigma_mn : + hP.barSigmaAtScale hStruct m ≤ hP.barSigmaAtScale hStruct n := by + simpa [Ch04.RestrictionLawCarrier.barSigmaAtScale, scalarization] using hChain.2.2 + have hStar_m_pos : 0 < hP.barSigmaStarAtScale hStruct m := by + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct m] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale, hPrim_m] using inv_pos.mpr hStarInv_m_pos + have hStar_n_pos : 0 < hP.barSigmaStarAtScale hStruct n := by + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct n] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale, hPrim_n] using inv_pos.mpr hStarInv_n_pos + refine ⟨hStar_nm, ?_, hSigma_mn⟩ + exact (inv_le_inv₀ hStar_m_pos hStar_n_pos).2 hStar_nm + +/-- Component-wise scalar-chain monotonicity with the full-block +integrability supplied by `(P4)`. -/ +theorem scalarChain_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {n m : ℕ} (hnm : n ≤ m) : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaStarAtScale hStruct (m : ℤ) ∧ + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ ∧ + hP.barSigmaAtScale hStruct (m : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := by + have hn_nonneg : 0 ≤ (n : ℤ) := by exact_mod_cast Nat.zero_le n + have hnm_int : (n : ℤ) ≤ (m : ℤ) := by exact_mod_cast hnm + have hParentBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hChildBlockInt : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n + have hDescBlockInt : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (n : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary hn_nonneg hnm_int hR hChildBlockInt + exact + scalarChain_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct hn_nonneg hnm_int hParentBlockInt hChildBlockInt hDescBlockInt + +/-- Under `(P4)`, the starred scalar coefficient is positive at every +nonnegative scale. -/ +theorem barSigmaStarAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (m : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (m : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (m : ℤ)] + exact inv_pos.mpr hInv + +/-- Under `(P4)`, the inverse starred scalar coefficient is positive at every +nonnegative scale. -/ +theorem barSigmaStarAtScale_inv_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr (barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m) + +/-- Under `(P4)`, the upper scalar coefficient is positive at every +nonnegative scale. -/ +theorem barSigmaAtScale_pos_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta := + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + have hstar_pos := barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hprod_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + exact lt_of_lt_of_le zero_lt_one (by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using htheta) + exact pos_of_mul_pos_left hprod_pos (inv_pos.mpr hstar_pos).le + +end + +end Pigeonhole +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale.lean new file mode 100644 index 0000000000..6d352c715e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleAbsorption + +/-! # Variance Bound Good Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open scoped BigOperators + +noncomputable section + +/-! +# Variance bound at a good scale + +This file exposes the LaTeX-facing Section 5.4 variance lemma. The proof +assembles the refined finite-probe estimate, the deterministic budget +summation, and the logarithmic scale-separation absorption. +-/ + +/-- Final constant used in the good-scale variance bound. -/ +noncomputable def varianceBoundGoodScaleConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + max 1 + (max (varianceScaleSeparationConst hP4) + (3 * (refinedMatrixBudgetConst d * weightedRefinedBudgetConst hP4))) + +/-- Parameter-only version of the Section 5.4 variance beta core. -/ +noncomputable def section54VarianceBetaCoreParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + min (1 - params.sUpper - params.sLower) + (min params.sUpper + (min params.sLower + (min (params.sUpper - (d : ℝ) / (params.xi : ℝ)) + (params.sLower - (d : ℝ) / (params.xi : ℝ))))) + +/-- Parameter-only version of the Section 5.4 variance beta. -/ +noncomputable def section54VarianceBetaParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + section54VarianceBetaCoreParams params / 2 + +/-- Parameter-only version of the variance scale-separation constant. -/ +noncomputable def varianceScaleSeparationConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 8 * (section54VarianceBetaParams params * Real.log 3)⁻¹ + +/-- Parameter-only version of the `L^ξ` geometric decay exponent. -/ +noncomputable def lpVarianceDecayParams (d : ℕ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (d : ℝ) - (d : ℝ) / (params.xi : ℝ) + +/-- Parameter-only version of the linear weighted pair-budget constant. -/ +noncomputable def pairLinearBudgetConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 params.xi * + (geometricDiscount + (lpVarianceDecayParams d params - section54VarianceBetaParams params) 1)⁻¹ + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 params.xi * + (geometricDiscount (sqrtVarianceDecay d - section54VarianceBetaParams params) 1)⁻¹) + +/-- Parameter-only version of the pointwise pair-budget constant. -/ +noncomputable def pairPointwiseBudgetConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 params.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 params.xi) + +/-- Parameter-only version of the weighted refined budget constant. -/ +noncomputable def weightedRefinedBudgetConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (geometricDiscount (section54VarianceBetaParams params) 1)⁻¹ + + 2 * pairLinearBudgetConstParams params + + 2 * pairPointwiseBudgetConstParams params * pairLinearBudgetConstParams params + +/-- Parameter-only final constant for the good-scale variance bound. -/ +noncomputable def varianceBoundGoodScaleConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + max 1 + (max (varianceScaleSeparationConstParams params) + (3 * (refinedMatrixBudgetConst d * weightedRefinedBudgetConstParams params))) + +@[simp] +theorem section54VarianceBetaCoreParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaCoreParams hP4.params = + section54VarianceBetaCore hP4 := rfl + +@[simp] +theorem section54VarianceBetaParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaParams hP4.params = + section54VarianceBeta hP4 := rfl + +@[simp] +theorem varianceScaleSeparationConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + varianceScaleSeparationConstParams hP4.params = + varianceScaleSeparationConst hP4 := rfl + +@[simp] +theorem lpVarianceDecayParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + lpVarianceDecayParams d hP4.params = lpVarianceDecay d hP4 := rfl + +@[simp] +theorem pairLinearBudgetConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + pairLinearBudgetConstParams hP4.params = + pairLinearBudgetConst hP4 := rfl + +@[simp] +theorem pairPointwiseBudgetConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + pairPointwiseBudgetConstParams hP4.params = + pairPointwiseBudgetConst hP4 := rfl + +@[simp] +theorem weightedRefinedBudgetConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + weightedRefinedBudgetConstParams hP4.params = + weightedRefinedBudgetConst hP4 := rfl + +@[simp] +theorem varianceBoundGoodScaleConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + varianceBoundGoodScaleConstParams hP4.params = + varianceBoundGoodScaleConst hP4 := rfl + +private theorem refinedMatrixBudgetConst_nonneg (d : ℕ) : + 0 ≤ refinedMatrixBudgetConst d := by + unfold refinedMatrixBudgetConst + positivity + +private theorem varianceBoundGoodScaleConstParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < varianceBoundGoodScaleConstParams params := by + unfold varianceBoundGoodScaleConstParams + exact lt_of_lt_of_le zero_lt_one (le_max_left _ _) + +private theorem varianceBoundGoodScaleConst_ge_scaleSep + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + varianceScaleSeparationConst hP4 ≤ varianceBoundGoodScaleConst hP4 := by + unfold varianceBoundGoodScaleConst + exact (le_max_left _ _).trans (le_max_right _ _) + +private theorem varianceBoundGoodScaleConst_ge_budget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 3 * (refinedMatrixBudgetConst d * weightedRefinedBudgetConst hP4) ≤ + varianceBoundGoodScaleConst hP4 := by + unfold varianceBoundGoodScaleConst + exact (le_max_right _ _).trans (le_max_right _ _) + +/-- Section 5.4, variance bound at a good scale. -/ +theorem varianceBoundGoodScale_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta : ℝ}, 0 < delta → delta ≤ 1 / 2 → + ∀ {m : ℕ}, + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ) → + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ) → + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ → + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + C * Real.sqrt delta := by + refine ⟨varianceBoundGoodScaleConstParams params, ?_, ?_⟩ + · exact varianceBoundGoodScaleConstParams_pos params + intro P hP hStruct hP4 hparams delta hdelta_pos hdelta_le_half m hsep + hgood_upper hgood_lower + subst params + let C : ℝ := varianceBoundGoodScaleConst hP4 + let θ : ℝ := widetildeThetaAtScale P 0 hP4 + let D : ℝ := Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) + let M : ℝ := refinedMatrixBudgetConst d + let B : ℝ := weightedRefinedBudgetConst hP4 + have hsep_law : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ) := by + simpa [C] using hsep + have hdelta_nonneg : 0 ≤ delta := hdelta_pos.le + have hdelta_le_one : delta ≤ 1 := by linarith + have hsqrt_nonneg : 0 ≤ Real.sqrt delta := Real.sqrt_nonneg delta + have hM_nonneg : 0 ≤ M := by + simpa [M] using refinedMatrixBudgetConst_nonneg d + have hB_nonneg : 0 ≤ B := by + simpa [B] using weightedRefinedBudgetConst_nonneg hP4 + have hMB_nonneg : 0 ≤ M * B := mul_nonneg hM_nonneg hB_nonneg + have hsum_matrix : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedMatrixVarianceScaleBound hP4 delta j) ≤ + M * + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedVarianceBasicBudget hP4 delta j) := by + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedMatrixVarianceScaleBound hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + (M * refinedVarianceBasicBudget hP4 delta j) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (by + simpa [M] using + refinedMatrixVarianceScaleBound_le_basicBudget + hP4 hdelta_nonneg hdelta_le_one j) + (varianceWeight_nonneg (section54VarianceBeta hP4) m j) + _ = + M * + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedVarianceBasicBudget hP4 delta j) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + have hsum_budget : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedVarianceBasicBudget hP4 delta j) ≤ + B * (delta + D * (θ + θ ^ (2 : ℕ))) := by + simpa [B, D, θ] using + sum_Icc_varianceWeight_mul_refinedVarianceBasicBudget_le + hP4 hdelta_pos hdelta_le_half m + have habsorb : D * (θ + θ ^ (2 : ℕ)) ≤ 2 * delta := by + simpa [C, D, θ] using + scaleSeparation_absorbs_widetildeThetaBudget + hP4 (hC := varianceBoundGoodScaleConst_ge_scaleSep hP4) + hdelta_pos hdelta_le_half hsep_law + have hinside_sqrt : + delta + D * (θ + θ ^ (2 : ℕ)) ≤ 3 * Real.sqrt delta := by + have hδ_le_sqrt := le_sqrt_of_pos_of_le_half hdelta_pos hdelta_le_half + nlinarith + have hbudget_sqrt : + M * (B * (delta + D * (θ + θ ^ (2 : ℕ)))) ≤ + (3 * (M * B)) * Real.sqrt delta := by + calc + M * (B * (delta + D * (θ + θ ^ (2 : ℕ)))) = + (M * B) * (delta + D * (θ + θ ^ (2 : ℕ))) := by ring + _ ≤ (M * B) * (3 * Real.sqrt delta) := + mul_le_mul_of_nonneg_left hinside_sqrt hMB_nonneg + _ = (3 * (M * B)) * Real.sqrt delta := by ring + have hC_budget : + 3 * (M * B) ≤ C := by + simpa [C, M, B] using varianceBoundGoodScaleConst_ge_budget hP4 + calc + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedMatrixVarianceScaleBound hP4 delta j := + varianceGoodScaleFullBlockSumAtScale_le_weighted_refinedMatrixVarianceScaleBound + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower + _ ≤ M * + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedVarianceBasicBudget hP4 delta j) := hsum_matrix + _ ≤ M * (B * (delta + D * (θ + θ ^ (2 : ℕ)))) := + mul_le_mul_of_nonneg_left hsum_budget hM_nonneg + _ ≤ (3 * (M * B)) * Real.sqrt delta := hbudget_sqrt + _ ≤ C * Real.sqrt delta := + mul_le_mul_of_nonneg_right hC_budget hsqrt_nonneg + _ = varianceBoundGoodScaleConstParams hP4.params * Real.sqrt delta := by + simp [C] + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Assembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Assembly.lean new file mode 100644 index 0000000000..560d312e99 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Assembly.lean @@ -0,0 +1,290 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.MatrixVariance + +/-! # Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Assembly lemmas for the variance bound at a good scale + +This file begins the final assembly: scalar coordinate and pair estimates are +plugged into the finite-dimensional matrix variance bridge. +-/ + +/-- The scalar variance bound produced by the good-scale reduction for one +probe. -/ +noncomputable def scalarProbeVarianceBound + {d : ℕ} (delta : ℝ) (q : FullBlockVec d) (K : ℝ) : ℝ := + 4 * (delta * dotProduct q q) ^ (2 : ℕ) + 4 * K ^ (2 : ℕ) + + 2 * dotProduct q q * (delta * dotProduct q q + K) + +/-- Coordinate-probe scalar variance budget at scale `j` normalized by scale +`m`. -/ +noncomputable def coordinateProbeVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (m j : ℕ) (α : BlockCoord d) : ℝ := + scalarProbeVarianceBound delta (fullBlockCoordinateProbe α) + (coordinateProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α) + +/-- Off-diagonal plus-pair scalar variance budget at scale `j` normalized by +scale `m`. -/ +noncomputable def plusProbeVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (m j : ℕ) (α β : BlockCoord d) : ℝ := + scalarProbeVarianceBound delta (fullBlockPlusProbe α β) + (pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β) + +/-- Off-diagonal minus-pair scalar variance budget at scale `j` normalized by +scale `m`. -/ +noncomputable def minusProbeVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (m j : ℕ) (α β : BlockCoord d) : ℝ := + scalarProbeVarianceBound delta (fullBlockMinusProbe α β) + (pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β) + +/-- The finite-probe matrix variance budget at one scale. Diagonal pair +probes are handled algebraically: `e_α + e_α = 2e_α` and +`e_α - e_α = 0`. -/ +noncomputable def matrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (m j : ℕ) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + (coordinateProbeVarianceBound hP hStruct hP4 delta m j α + + (if α = β then + 16 * coordinateProbeVarianceBound hP hStruct hP4 delta m j α + else + plusProbeVarianceBound hP hStruct hP4 delta m j α β) + + (if α = β then + 0 + else + minusProbeVarianceBound hP hStruct hP4 delta m j α β))) + +private theorem integral_plusProbe_self_sq_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m j : ℕ) (α : BlockCoord d) : + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α α)) ^ (2 : ℕ) ∂P = + 16 * + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P := by + have hpoint : + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α α)) ^ (2 : ℕ)) + = + fun a : RegCoeffField d => + 16 * + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) := by + funext a + rw [fullBlockQuadratic_plusProbe_self] + ring + rw [hpoint, integral_const_mul] + +private theorem integral_minusProbe_self_sq_eq_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m j : ℕ) (α : BlockCoord d) : + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α α)) ^ (2 : ℕ) ∂P = 0 := by + have hpoint : + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α α)) ^ (2 : ℕ)) + = + fun _a : RegCoeffField d => 0 := by + funext a + rw [fullBlockQuadratic_minusProbe_self] + norm_num + rw [hpoint, integral_zero] + +/-- Per-scale matrix variance bound obtained by assembling all scalar probe +estimates at a good scale. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_matrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P ≤ + matrixVarianceScaleBound hP hStruct hP4 delta m j := by + let Ccoord : BlockCoord d → ℝ := + coordinateProbeVarianceBound hP hStruct hP4 delta m j + let Cplus : BlockCoord d → BlockCoord d → ℝ := fun α β => + if α = β then 16 * Ccoord α else plusProbeVarianceBound hP hStruct hP4 delta m j α β + let Cminus : BlockCoord d → BlockCoord d → ℝ := fun α β => + if α = β then 0 else minusProbeVarianceBound hP hStruct hP4 delta m j α β + have hcoord_int : ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P := by + intro α + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockCoordinateProbe α) + have hplus_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ)) P := by + intro α β + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockPlusProbe α β) + have hminus_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P := by + intro α β + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockMinusProbe α β) + have hcoord : ∀ α : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P) ≤ Ccoord α := by + intro α + rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockCoordinateProbe α)] + simpa [Ccoord, coordinateProbeVarianceBound, scalarProbeVarianceBound] using + coordinateProbe_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower α + have hplus : ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cplus α β := by + intro α β + by_cases hαβ : α = β + · subst β + rw [integral_plusProbe_self_sq_eq hP hStruct m j α] + have hc : + (∫ a, + fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a α α ^ (2 : ℕ) ∂P) ≤ + Ccoord α := by + simpa using hcoord α + simp [Cplus] + nlinarith + · rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockPlusProbe α β)] + simpa [Cplus, hαβ, plusProbeVarianceBound, scalarProbeVarianceBound] using + plusProbe_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower hαβ + have hminus : ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cminus α β := by + intro α β + by_cases hαβ : α = β + · subst β + rw [integral_minusProbe_self_sq_eq_zero hP hStruct m j α] + simp [Cminus] + · rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockMinusProbe α β)] + simpa [Cminus, hαβ, minusProbeVarianceBound, scalarProbeVarianceBound] using + minusProbe_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower hαβ + simpa [matrixVarianceScaleBound, Ccoord, Cplus, Cminus] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_probeBounds + hP hStruct hP4 m j Ccoord Cplus Cminus + hcoord_int hplus_int hminus_int hcoord hplus hminus + +/-- The exact beta-weighted variance sum is bounded by the corresponding +sum of per-scale matrix budgets. -/ +theorem varianceGoodScaleFullBlockSumAtScale_le_weighted_matrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + matrixVarianceScaleBound hP hStruct hP4 delta m j := by + refine varianceGoodScaleFullBlockSumAtScale_le_weighted_sum hP hStruct hP4 m ?_ + intro j hj + exact + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_matrixVarianceScaleBound + hP hStruct hP4 hdelta_nonneg m j (Finset.mem_Icc.mp hj).2 + hgood_upper hgood_lower + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Basic.lean new file mode 100644 index 0000000000..7339349ccd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/Basic.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Common + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +noncomputable section + +/-! +# Basic scalar parameters for the Section 5.4 variance bound + +This file owns the Section 5.4 variance exponent and the elementary scalar +weight used in the beta-weighted fluctuation sum. +-/ + +/-- The minimum quantity whose half is the exponent `β` in the Section 5.4 +variance bound at a good scale. -/ +noncomputable def section54VarianceBetaCore {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + min (1 - hP4.sUpper - hP4.sLower) + (min hP4.sUpper + (min hP4.sLower + (min (hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ)) + (hP4.sLower - (d : ℝ) / (hP4.xi : ℝ))))) + +/-- The exponent `β` used in +`l.variance.bound.good.scale.homogenization.scale`. -/ +noncomputable def section54VarianceBeta {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + section54VarianceBetaCore hP4 / 2 + +private theorem section54VarianceBetaCore_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < section54VarianceBetaCore hP4 := by + have hgap : 0 < 1 - hP4.sUpper - hP4.sLower := by + linarith [hP4.sum_lt_one] + have hupper : 0 < hP4.sUpper := hP4.sUpper_pos + have hlower : 0 < hP4.sLower := hP4.sLower_pos + have hupper_gain : 0 < hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + linarith [hP4.dim_div_xi_lt_sLower] + unfold section54VarianceBetaCore + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +/-- The Section 5.4 variance exponent is positive. -/ +theorem section54VarianceBeta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < section54VarianceBeta hP4 := by + unfold section54VarianceBeta + nlinarith [section54VarianceBetaCore_pos hP4] + +/-- The Section 5.4 variance exponent is nonnegative. -/ +theorem section54VarianceBeta_nonneg {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ section54VarianceBeta hP4 := + (section54VarianceBeta_pos hP4).le + +private theorem section54VarianceBetaCore_le_sUpper {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaCore hP4 ≤ hP4.sUpper := by + unfold section54VarianceBetaCore + exact (min_le_right _ _).trans (min_le_left _ _) + +private theorem section54VarianceBetaCore_le_sLower {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaCore hP4 ≤ hP4.sLower := by + unfold section54VarianceBetaCore + exact (min_le_right _ _).trans ((min_le_right _ _).trans (min_le_left _ _)) + +private theorem section54VarianceBetaCore_le_sUpper_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaCore hP4 ≤ + hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section54VarianceBetaCore + exact (min_le_right _ _).trans + ((min_le_right _ _).trans ((min_le_right _ _).trans (min_le_left _ _))) + +private theorem section54VarianceBetaCore_le_sLower_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBetaCore hP4 ≤ + hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section54VarianceBetaCore + exact (min_le_right _ _).trans + ((min_le_right _ _).trans ((min_le_right _ _).trans (min_le_right _ _))) + +/-- The variance exponent is no larger than the upper regularity exponent. -/ +theorem section54VarianceBeta_le_sUpper {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBeta hP4 ≤ hP4.sUpper := by + unfold section54VarianceBeta + have hcore_nonneg : 0 ≤ section54VarianceBetaCore hP4 := + (section54VarianceBetaCore_pos hP4).le + have hcore_le := section54VarianceBetaCore_le_sUpper hP4 + nlinarith + +/-- The variance exponent is no larger than the lower regularity exponent. -/ +theorem section54VarianceBeta_le_sLower {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBeta hP4 ≤ hP4.sLower := by + unfold section54VarianceBeta + have hcore_nonneg : 0 ≤ section54VarianceBetaCore hP4 := + (section54VarianceBetaCore_pos hP4).le + have hcore_le := section54VarianceBetaCore_le_sLower hP4 + nlinarith + +/-- The variance exponent fits inside the upper positive-excess gain. -/ +theorem section54VarianceBeta_le_sUpper_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBeta hP4 ≤ + hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section54VarianceBeta + have hcore_nonneg : 0 ≤ section54VarianceBetaCore hP4 := + (section54VarianceBetaCore_pos hP4).le + have hcore_le := section54VarianceBetaCore_le_sUpper_sub_dim_div_xi hP4 + nlinarith + +/-- The variance exponent fits inside the lower positive-excess gain. -/ +theorem section54VarianceBeta_le_sLower_sub_dim_div_xi {d : ℕ} + [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBeta hP4 ≤ + hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + unfold section54VarianceBeta + have hcore_nonneg : 0 ≤ section54VarianceBetaCore hP4 := + (section54VarianceBetaCore_pos hP4).le + have hcore_le := section54VarianceBetaCore_le_sLower_sub_dim_div_xi hP4 + nlinarith + +/-- The variance exponent is strictly below `d / 2`, which leaves room in the +geometric sums. -/ +theorem section54VarianceBeta_lt_dim_div_two {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + section54VarianceBeta hP4 < (d : ℝ) / 2 := by + have hbeta_le := section54VarianceBeta_le_sUpper hP4 + have hupper_lt : hP4.sUpper < 1 := hP4.sUpper_lt_one + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hP4.two_le_dim + nlinarith + +/-- The beta weight in the variance bound. -/ +noncomputable def varianceWeight (β : ℝ) (m j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (-β * ((m - j : ℕ) : ℝ)) + +/-- The beta weight is nonnegative. -/ +theorem varianceWeight_nonneg (β : ℝ) (m j : ℕ) : + 0 ≤ varianceWeight β m j := by + unfold varianceWeight + exact Real.rpow_nonneg (by norm_num) _ + +/-- At the top scale, the beta weight is one. -/ +@[simp] +theorem varianceWeight_self (β : ℝ) (m : ℕ) : + varianceWeight β m m = 1 := by + unfold varianceWeight + simp + +/-- If `j` is above `m`, the `Nat`-truncated beta weight is one. -/ +theorem varianceWeight_eq_one_of_le {β : ℝ} {m j : ℕ} (hmj : m ≤ j) : + varianceWeight β m j = 1 := by + unfold varianceWeight + have hsub : m - j = 0 := Nat.sub_eq_zero_of_le hmj + simp [hsub] + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/BudgetAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/BudgetAbsorption.lean new file mode 100644 index 0000000000..4b12e5b670 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/BudgetAbsorption.lean @@ -0,0 +1,460 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.GeometricSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.Coefficients.RootCoeff + +/-! # Budget Absorption -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open scoped BigOperators + +noncomputable section + +/-! +# Absorbing the refined variance budgets + +This file controls the deterministic scalar budgets that remain after the +finite-probe assembly. The key point is that the Rosenthal descendant-average +coefficient is a Section 5.2 large-scale root coefficient with exponent +`β + d / ξ`. +-/ + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +/-- Coordinate-probe descendant-average budgets are nonnegative. -/ +theorem coordinateProbeRefinedDescendantAverageK_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (j : ℕ) : + 0 ≤ coordinateProbeRefinedDescendantAverageK hP4 delta j := by + have htheta : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_zero_nonneg hP4 + have hK0 : 0 ≤ 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + have hfactor : 0 ≤ 1 + delta := by linarith + exact mul_nonneg (by norm_num) (mul_nonneg hfactor htheta) + have hcard_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) := by + exact_mod_cast Nat.zero_le _ + have hcard_inv_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ)⁻¹ := + inv_nonneg.mpr hcard_nonneg + have hcard_rpow_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) := + Real.rpow_nonneg hcard_nonneg _ + have hsqrt_nonneg : + 0 ≤ Real.sqrt ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) := + Real.sqrt_nonneg _ + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + unfold coordinateProbeRefinedDescendantAverageK + exact mul_nonneg hcard_inv_nonneg + (add_nonneg + (mul_nonneg (mul_nonneg hLp_nonneg hcard_rpow_nonneg) hK0) + (mul_nonneg (mul_nonneg hSqrt_nonneg hsqrt_nonneg) hK0)) + +/-- Pair-probe descendant-average budgets are nonnegative. -/ +theorem pairProbeRefinedDescendantAverageK_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (j : ℕ) : + 0 ≤ pairProbeRefinedDescendantAverageK hP4 delta j := by + have htheta : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_zero_nonneg hP4 + have hK0 : 0 ≤ 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + have hfactor : 0 ≤ 1 + delta := by linarith + exact mul_nonneg (by norm_num) (mul_nonneg hfactor htheta) + have hcard_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) := by + exact_mod_cast Nat.zero_le _ + have hcard_inv_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ)⁻¹ := + inv_nonneg.mpr hcard_nonneg + have hcard_rpow_nonneg : + 0 ≤ ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) := + Real.rpow_nonneg hcard_nonneg _ + have hsqrt_nonneg : + 0 ≤ Real.sqrt ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) := + Real.sqrt_nonneg _ + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + unfold pairProbeRefinedDescendantAverageK + exact mul_nonneg hcard_inv_nonneg + (add_nonneg + (mul_nonneg (mul_nonneg hLp_nonneg hcard_rpow_nonneg) hK0) + (mul_nonneg (mul_nonneg hSqrt_nonneg hsqrt_nonneg) hK0)) + +/-- Coordinate probes have Euclidean square norm `1`. -/ +@[simp] +theorem dotProduct_coordinateProbe_self + {d : ℕ} (α : BlockCoord d) : + dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α) = 1 := by + rw [← fullBlockQuadratic_one] + simp + +private theorem one_fullBlockMat_isSymm {d : ℕ} : + (1 : FullBlockMat d).IsSymm := by + exact Matrix.isSymm_one + +/-- Plus probes have Euclidean square norm at most `4`. -/ +theorem dotProduct_plusProbe_self_le_four + {d : ℕ} (α β : BlockCoord d) : + dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) ≤ 4 := by + by_cases hαβ : α = β + · subst β + rw [← fullBlockQuadratic_one] + rw [fullBlockQuadratic_plusProbe_self] + simp + · rw [← fullBlockQuadratic_one] + rw [fullBlockQuadratic_plusProbe_of_ne one_fullBlockMat_isSymm hαβ] + norm_num [Matrix.one_apply, hαβ, Ne.symm hαβ] + +/-- Minus probes have Euclidean square norm at most `4`. -/ +theorem dotProduct_minusProbe_self_le_four + {d : ℕ} (α β : BlockCoord d) : + dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) ≤ 4 := by + by_cases hαβ : α = β + · subst β + rw [← fullBlockQuadratic_one] + rw [fullBlockQuadratic_minusProbe_self] + norm_num + · rw [← fullBlockQuadratic_one] + rw [fullBlockQuadratic_minusProbe_of_ne one_fullBlockMat_isSymm hαβ] + norm_num [Matrix.one_apply, hαβ, Ne.symm hαβ] + +/-- A scalar variance budget with probe square norm at most `4` is controlled by +the elementary expression `δ + K + K^2`. -/ +theorem refinedScalarProbeVarianceBound_le_basic + {d : ℕ} {delta K : ℝ} (q : FullBlockVec d) + (hdelta_nonneg : 0 ≤ delta) (hdelta_le_one : delta ≤ 1) + (hK_nonneg : 0 ≤ K) + (hq_le : dotProduct q q ≤ 4) : + refinedScalarProbeVarianceBound delta q K ≤ + 256 * (delta + K + K ^ (2 : ℕ)) := by + let x : ℝ := dotProduct q q + have hx_nonneg : 0 ≤ x := by + simpa [x] using dotProduct_self_nonneg q + have hx_sq_le : x ^ (2 : ℕ) ≤ 16 := by + have hx_mul : x * x ≤ 4 * x := mul_le_mul_of_nonneg_right (by simpa [x] using hq_le) hx_nonneg + nlinarith + have hdelta_sq_le : delta ^ (2 : ℕ) ≤ delta := by + nlinarith + have hdelta_x_sq_le : (delta * x) ^ (2 : ℕ) ≤ 16 * delta := by + have hdelta_sq_nonneg : 0 ≤ delta ^ (2 : ℕ) := sq_nonneg delta + have hx_sq_nonneg : 0 ≤ x ^ (2 : ℕ) := sq_nonneg x + have hmul := mul_le_mul hdelta_sq_le hx_sq_le hx_sq_nonneg hdelta_nonneg + nlinarith + have hdelta_x2_le : delta * x ^ (2 : ℕ) ≤ 16 * delta := by + simpa [mul_comm] using mul_le_mul_of_nonneg_left hx_sq_le hdelta_nonneg + have hxK_le : x * K ≤ 4 * K := + mul_le_mul_of_nonneg_right (by simpa [x] using hq_le) hK_nonneg + unfold refinedScalarProbeVarianceBound + dsimp [x] at * + nlinarith + +/-- Coordinate scalar budgets obey the uniform elementary bound. -/ +theorem coordinateProbeRefinedVarianceBound_le_basic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_one : delta ≤ 1) + (j : ℕ) (α : BlockCoord d) : + coordinateProbeRefinedVarianceBound hP4 delta j α ≤ + 256 * + (delta + coordinateProbeRefinedDescendantAverageK hP4 delta j + + coordinateProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) := by + unfold coordinateProbeRefinedVarianceBound + exact refinedScalarProbeVarianceBound_le_basic + (fullBlockCoordinateProbe α) hdelta_nonneg hdelta_le_one + (coordinateProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j) + (by simp) + +/-- Plus-pair scalar budgets obey the uniform elementary bound. -/ +theorem plusProbeRefinedVarianceBound_le_basic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_one : delta ≤ 1) + (j : ℕ) (α β : BlockCoord d) : + plusProbeRefinedVarianceBound hP4 delta j α β ≤ + 256 * + (delta + pairProbeRefinedDescendantAverageK hP4 delta j + + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) := by + unfold plusProbeRefinedVarianceBound + exact refinedScalarProbeVarianceBound_le_basic + (fullBlockPlusProbe α β) hdelta_nonneg hdelta_le_one + (pairProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j) + (dotProduct_plusProbe_self_le_four α β) + +/-- Minus-pair scalar budgets obey the uniform elementary bound. -/ +theorem minusProbeRefinedVarianceBound_le_basic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_one : delta ≤ 1) + (j : ℕ) (α β : BlockCoord d) : + minusProbeRefinedVarianceBound hP4 delta j α β ≤ + 256 * + (delta + pairProbeRefinedDescendantAverageK hP4 delta j + + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) := by + unfold minusProbeRefinedVarianceBound + exact refinedScalarProbeVarianceBound_le_basic + (fullBlockMinusProbe α β) hdelta_nonneg hdelta_le_one + (pairProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j) + (dotProduct_minusProbe_self_le_four α β) + +/-- The Section 5.2 large-scale set is the integer copy of `{1, ..., m}`. -/ +theorem section52LargeScaleSet_eq_Icc_int (m : ℕ) : + Section52.section52LargeScaleSet m = + (Finset.Icc 1 m).image (fun j : ℕ => (j : ℤ)) := by + classical + ext n + constructor + · intro hn + rcases Finset.mem_image.mp hn with ⟨l, hl, rfl⟩ + have hl_lt : l < m := Finset.mem_range.mp hl + have hle : l ≤ m := Nat.le_of_lt hl_lt + refine Finset.mem_image.mpr ?_ + refine ⟨m - l, ?_, ?_⟩ + · exact Finset.mem_Icc.mpr ⟨by omega, by omega⟩ + · omega + · intro hn + rcases Finset.mem_image.mp hn with ⟨j, hj, rfl⟩ + have hj_bounds := Finset.mem_Icc.mp hj + refine Finset.mem_image.mpr ?_ + refine ⟨m - j, ?_, ?_⟩ + · exact Finset.mem_range.mpr (by omega) + · omega + +/-- Reindex a finite sum over manuscript scales as a Section 5.2 large-scale +sum. -/ +theorem sum_Icc_int_eq_section52LargeScaleSet_sum (m : ℕ) (F : ℤ → ℝ) : + (∑ j ∈ Finset.Icc 1 m, F (j : ℤ)) = + ∑ n ∈ Section52.section52LargeScaleSet m, F n := by + classical + rw [section52LargeScaleSet_eq_Icc_int] + rw [Finset.sum_image] + intro a ha b hb hab + exact Int.ofNat.inj hab + +private theorem section54VarianceBeta_plus_dim_div_xi_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ section54VarianceBeta hP4 + (d : ℝ) / (hP4.xi : ℝ) := by + have hbeta := section54VarianceBeta_nonneg hP4 + have hxi_nonneg : 0 ≤ (hP4.xi : ℝ) := by exact_mod_cast Nat.zero_le hP4.xi + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + exact add_nonneg hbeta (div_nonneg hd_nonneg hxi_nonneg) + +private theorem section54VarianceBeta_plus_dim_div_xi_gapLp_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < (d : ℝ) - (section54VarianceBeta hP4 + (d : ℝ) / (hP4.xi : ℝ)) := by + have hbeta_lt := section54VarianceBeta_lt_dim_div_two hP4 + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast hP4.two_le_xi + have hxi_pos : 0 < (hP4.xi : ℝ) := by + exact_mod_cast hP4.xi_pos + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdiv_le : (d : ℝ) / (hP4.xi : ℝ) ≤ (d : ℝ) / 2 := by + exact div_le_div_of_nonneg_left hd_nonneg (by norm_num) hxi_two + nlinarith + +private theorem section54VarianceBeta_plus_dim_div_xi_gapSqrt_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < + ((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - + (section54VarianceBeta hP4 + (d : ℝ) / (hP4.xi : ℝ)) := by + have hbeta_lt := section54VarianceBeta_lt_dim_div_two hP4 + nlinarith + +/-- Sum of the Section 5.2 large-scale root coefficient at the exponent +`β + d/ξ`, where its scale decay is exactly `3^{-β m}`. -/ +theorem section52LargeScaleRootCoeff_sum_le_beta_decay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let s : ℝ := section54VarianceBeta hP4 + (d : ℝ) / (hP4.xi : ℝ) + (∑ n ∈ Section52.section52LargeScaleSet m, + Section52.section52LargeScaleRootCoeff d hP4.xi s m n) ≤ + ((2 * Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + geometricDiscount s 1) * + (geometricDiscount ((d : ℝ) - s) 1)⁻¹ + + (2 * Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + geometricDiscount s 1) * + (geometricDiscount (((d : ℝ) / 2) + (d : ℝ) / (hP4.xi : ℝ) - s) 1)⁻¹) * + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) := by + dsimp only + have hraw := + Section52.section52LargeScaleRootCoeff_scale_sum_le_geometricDiscount + (d := d) (ξ := hP4.xi) + (s := section54VarianceBeta hP4 + (d : ℝ) / (hP4.xi : ℝ)) m + (section54VarianceBeta_plus_dim_div_xi_nonneg hP4) + (section54VarianceBeta_plus_dim_div_xi_gapLp_pos hP4) + (section54VarianceBeta_plus_dim_div_xi_gapSqrt_pos hP4) + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using hraw + +/-- The scalar budget left after compressing the finite-probe matrix estimate. -/ +noncomputable def refinedVarianceBasicBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) : ℝ := + delta + + coordinateProbeRefinedDescendantAverageK hP4 delta j + + coordinateProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) + + pairProbeRefinedDescendantAverageK hP4 delta j + + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) + +/-- Dimension-only finite-probe constant for the refined variance budget. -/ +noncomputable def refinedMatrixBudgetConst (d : ℕ) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * (54 * 256) + +private theorem refinedVarianceBasicBudget_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (j : ℕ) : + 0 ≤ refinedVarianceBasicBudget hP4 delta j := by + have hcoord := coordinateProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + have hpair := pairProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + unfold refinedVarianceBasicBudget + nlinarith [sq_nonneg (coordinateProbeRefinedDescendantAverageK hP4 delta j), + sq_nonneg (pairProbeRefinedDescendantAverageK hP4 delta j)] + +/-- The per-scale matrix budget is bounded by the compressed scalar budget. -/ +theorem refinedMatrixVarianceScaleBound_le_basicBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_one : delta ≤ 1) + (j : ℕ) : + refinedMatrixVarianceScaleBound hP4 delta j ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudget hP4 delta j := by + classical + let B : ℝ := refinedVarianceBasicBudget hP4 delta j + let c : ℝ := (Fintype.card (BlockCoord d) : ℝ) + have hB_nonneg : 0 ≤ B := by + simpa [B] using refinedVarianceBasicBudget_nonneg hP4 hdelta_nonneg j + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hcoordBudget : + delta + coordinateProbeRefinedDescendantAverageK hP4 delta j + + coordinateProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) ≤ B := by + have hpair := pairProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + dsimp [B, refinedVarianceBasicBudget] + nlinarith [sq_nonneg (pairProbeRefinedDescendantAverageK hP4 delta j)] + have hpairBudget : + delta + pairProbeRefinedDescendantAverageK hP4 delta j + + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) ≤ B := by + have hcoord := coordinateProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + dsimp [B, refinedVarianceBasicBudget] + nlinarith [sq_nonneg (coordinateProbeRefinedDescendantAverageK hP4 delta j)] + have hcoord_le : ∀ α : BlockCoord d, + coordinateProbeRefinedVarianceBound hP4 delta j α ≤ 256 * B := by + intro α + exact (coordinateProbeRefinedVarianceBound_le_basic hP4 hdelta_nonneg hdelta_le_one j α).trans + (mul_le_mul_of_nonneg_left hcoordBudget (by norm_num)) + have hplus_le : ∀ α β : BlockCoord d, + plusProbeRefinedVarianceBound hP4 delta j α β ≤ 256 * B := by + intro α β + exact (plusProbeRefinedVarianceBound_le_basic hP4 hdelta_nonneg hdelta_le_one j α β).trans + (mul_le_mul_of_nonneg_left hpairBudget (by norm_num)) + have hminus_le : ∀ α β : BlockCoord d, + minusProbeRefinedVarianceBound hP4 delta j α β ≤ 256 * B := by + intro α β + exact (minusProbeRefinedVarianceBound_le_basic hP4 hdelta_nonneg hdelta_le_one j α β).trans + (mul_le_mul_of_nonneg_left hpairBudget (by norm_num)) + let T : BlockCoord d → BlockCoord d → ℝ := fun α β => + 3 * + (coordinateProbeRefinedVarianceBound hP4 delta j α + + (if α = β then + 16 * coordinateProbeRefinedVarianceBound hP4 delta j α + else + plusProbeRefinedVarianceBound hP4 delta j α β) + + (if α = β then + 0 + else + minusProbeRefinedVarianceBound hP4 delta j α β)) + have hT : ∀ α β : BlockCoord d, T α β ≤ 54 * 256 * B := by + intro α β + by_cases hαβ : α = β + · subst β + have hcα := hcoord_le α + simp [T] + nlinarith + · have hcα := hcoord_le α + have hpαβ := hplus_le α β + have hmαβ := hminus_le α β + simp [T, hαβ] + nlinarith + have hsumβ : ∀ α : BlockCoord d, + (∑ β : BlockCoord d, T α β) ≤ c * (54 * 256 * B) := by + intro α + calc + (∑ β : BlockCoord d, T α β) ≤ + ∑ _β : BlockCoord d, 54 * 256 * B := + Finset.sum_le_sum fun β _hβ => hT α β + _ = c * (54 * 256 * B) := by + simp [c] + have hsumα : + (∑ α : BlockCoord d, c * ∑ β : BlockCoord d, T α β) ≤ + c * (c * (c * (54 * 256 * B))) := by + calc + (∑ α : BlockCoord d, c * ∑ β : BlockCoord d, T α β) ≤ + ∑ _α : BlockCoord d, c * (c * (54 * 256 * B)) := by + refine Finset.sum_le_sum ?_ + intro α _hα + exact mul_le_mul_of_nonneg_left (hsumβ α) hc_nonneg + _ = c * (c * (c * (54 * 256 * B))) := by + simp [c, mul_assoc] + have hinside : + c * (∑ α : BlockCoord d, c * ∑ β : BlockCoord d, T α β) ≤ + c * (c * (c * (c * (54 * 256 * B)))) := by + have hstep := mul_le_mul_of_nonneg_left hsumα hc_nonneg + simpa [mul_assoc] using hstep + calc + refinedMatrixVarianceScaleBound hP4 delta j = + c ^ (2 : ℕ) * + (c * (∑ α : BlockCoord d, c * ∑ β : BlockCoord d, T α β)) := by + simp [refinedMatrixVarianceScaleBound, c, T] + _ ≤ c ^ (2 : ℕ) * (c * (c * (c * (c * (54 * 256 * B))))) := + mul_le_mul_of_nonneg_left hinside (sq_nonneg c) + _ = refinedMatrixBudgetConst d * refinedVarianceBasicBudget hP4 delta j := by + simp [refinedMatrixBudgetConst, refinedVarianceBasicBudget, B, c] + ring + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FinalAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FinalAbsorption.lean new file mode 100644 index 0000000000..cb79006aff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FinalAbsorption.lean @@ -0,0 +1,831 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.BudgetAbsorption + +/-! # Final Absorption -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open scoped BigOperators + +noncomputable section + +/-! +# Final scalar absorption for the good-scale variance bound + +This file finishes the purely deterministic part of the Section 5.4 variance +lemma. The analytic work has already reduced the fluctuation estimate to the +refined scalar budgets in `BudgetAbsorption`; here we sum those budgets and +absorb the remaining `\widetilde\Theta_0` terms with the manuscript +scale-separation hypothesis. +-/ + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +private theorem weighted_rpow_decay_eq + {β γ : ℝ} {m j : ℕ} (hj : j ≤ m) : + varianceWeight β m j * Real.rpow (3 : ℝ) (-γ * (j : ℝ)) = + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(γ - β) * (j : ℝ)) := by + unfold varianceWeight + have h3 : 0 < (3 : ℝ) := by norm_num + have hcast : ((m - j : ℕ) : ℝ) = (m : ℝ) - (j : ℝ) := by + rw [Nat.cast_sub hj] + rw [hcast] + calc + Real.rpow (3 : ℝ) (-β * ((m : ℝ) - (j : ℝ))) * + Real.rpow (3 : ℝ) (-γ * (j : ℝ)) = + Real.rpow (3 : ℝ) + (-β * ((m : ℝ) - (j : ℝ)) + -γ * (j : ℝ)) := by + exact (Real.rpow_add h3 _ _).symm + _ = Real.rpow (3 : ℝ) + (-β * (m : ℝ) + -(γ - β) * (j : ℝ)) := by + congr 1 + ring + _ = Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + Real.rpow (3 : ℝ) (-(γ - β) * (j : ℝ)) := by + exact Real.rpow_add h3 _ _ + +/-- A beta-weighted finite sum with an additional scale decay gains the +top-scale factor `3^{-βm}`. -/ +theorem sum_Icc_varianceWeight_mul_rpow_decay_le + {β γ : ℝ} (hgap : 0 < γ - β) (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * Real.rpow (3 : ℝ) (-γ * (j : ℝ))) ≤ + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + (geometricDiscount (γ - β) 1)⁻¹ := by + let f : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-(γ - β) * (j : ℝ)) + have hsummable : Summable f := by + simpa [f] using Section52.summable_rpow_three_neg_mul_nat hgap + have hnonneg : ∀ j : ℕ, 0 ≤ f j := by + intro j + dsimp [f] + exact Real.rpow_nonneg (by norm_num) _ + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * Real.rpow (3 : ℝ) (-γ * (j : ℝ))) = + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + ∑ j ∈ Finset.Icc 1 m, f j := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + exact weighted_rpow_decay_eq (β := β) (γ := γ) + (m := m) (j := j) (Finset.mem_Icc.mp hj).2 + _ ≤ Real.rpow (3 : ℝ) (-β * (m : ℝ)) * ∑' j : ℕ, f j := by + exact mul_le_mul_of_nonneg_left + (hsummable.sum_le_tsum (Finset.Icc 1 m) (fun j _ => hnonneg j)) + (Real.rpow_nonneg (by norm_num) _) + _ = Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + (geometricDiscount (γ - β) 1)⁻¹ := by + rw [Section52.tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hgap] + +/-- The pair-probe descendant-average budget has the expected two geometric +decay components. -/ +theorem pairProbeRefinedDescendantAverageK_eq_geometric + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (delta : ℝ) (j : ℕ) : + pairProbeRefinedDescendantAverageK hP4 delta j = + 8 * ((1 + delta) * + Ch04.widetildeThetaAtScale P 0 hP4.sUpper hP4.sLower hP4.xi) * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) + (((d : ℝ) / (hP4.xi : ℝ) - (d : ℝ)) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-((d : ℝ) / 2 * (j : ℝ)))) := by + have hj_nonneg : 0 ≤ (j : ℤ) := by exact_mod_cast Nat.zero_le j + rw [pairProbeRefinedDescendantAverageK] + rw [Section52.section52_descendantsAtScale_originCube_int_zero_card_inv d hj_nonneg] + rw [Section52.section52_descendantsAtScale_originCube_int_zero_card_rpow d hP4.xi hj_nonneg] + rw [Section52.section52_descendantsAtScale_originCube_int_zero_card_sqrt d hj_nonneg] + simp [widetildeThetaAtScale] + have h3 : 0 < (3 : ℝ) := by norm_num + have hLp_pow : + Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / (hP4.xi : ℝ)) * (j : ℝ)) = + Real.rpow (3 : ℝ) (((d : ℝ) / (hP4.xi : ℝ) - (d : ℝ)) * + (j : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / (hP4.xi : ℝ)) * (j : ℝ)) = + Real.rpow (3 : ℝ) + (-((d : ℝ) * (j : ℝ)) + ((d : ℝ) / (hP4.xi : ℝ)) * (j : ℝ)) := by + exact (Real.rpow_add h3 _ _).symm + _ = Real.rpow (3 : ℝ) + (((d : ℝ) / (hP4.xi : ℝ) - (d : ℝ)) * (j : ℝ)) := by + congr 1 + ring + have hSqrt_pow : + Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (j : ℝ)) = + Real.rpow (3 : ℝ) (-((d : ℝ) / 2 * (j : ℝ))) := by + calc + Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (j : ℝ)) = + Real.rpow (3 : ℝ) + (-((d : ℝ) * (j : ℝ)) + ((d : ℝ) / 2) * (j : ℝ)) := by + exact (Real.rpow_add h3 _ _).symm + _ = Real.rpow (3 : ℝ) (-((d : ℝ) / 2 * (j : ℝ))) := by + congr 1 + ring + calc + Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (((d : ℝ) / (hP4.xi : ℝ)) * (j : ℝ)) * + (8 * ((1 + delta) * + Ch04.widetildeThetaAtScale P 0 hP4.sUpper hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (j : ℝ)) * + (8 * ((1 + delta) * + Ch04.widetildeThetaAtScale P 0 hP4.sUpper hP4.sLower hP4.xi))) = + 8 * ((1 + delta) * + Ch04.widetildeThetaAtScale P 0 hP4.sUpper hP4.sLower hP4.xi) * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + (Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / (hP4.xi : ℝ)) * (j : ℝ))) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + (Real.rpow (3 : ℝ) (-((d : ℝ) * (j : ℝ))) * + Real.rpow (3 : ℝ) (((d : ℝ) / 2) * (j : ℝ)))) := by + ring + _ = + 8 * ((1 + delta) * + Ch04.widetildeThetaAtScale P 0 hP4.sUpper hP4.sLower hP4.xi) * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) + (((d : ℝ) / (hP4.xi : ℝ) - (d : ℝ)) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-((d : ℝ) / 2 * (j : ℝ)))) := by + rw [hLp_pow, hSqrt_pow] + +/-- The `L^ξ` geometric decay exponent in the refined pair budget. -/ +noncomputable def lpVarianceDecay + (d : ℕ) [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + (d : ℝ) - (d : ℝ) / (hP4.xi : ℝ) + +/-- The square-root geometric decay exponent in the refined pair budget. -/ +noncomputable def sqrtVarianceDecay (d : ℕ) : ℝ := + (d : ℝ) / 2 + +private theorem lpVarianceDecay_gap_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < lpVarianceDecay d hP4 - section54VarianceBeta hP4 := by + have hbeta := section54VarianceBeta_lt_dim_div_two hP4 + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast hP4.two_le_xi + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdiv_le : (d : ℝ) / (hP4.xi : ℝ) ≤ (d : ℝ) / 2 := by + exact div_le_div_of_nonneg_left hd_nonneg (by norm_num) hxi_two + dsimp [lpVarianceDecay] + linarith + +private theorem sqrtVarianceDecay_gap_pos + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < sqrtVarianceDecay d - section54VarianceBeta hP4 := by + simpa [sqrtVarianceDecay] using section54VarianceBeta_lt_dim_div_two hP4 + +private theorem lpVarianceDecay_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ lpVarianceDecay d hP4 := by + have hgap := lpVarianceDecay_gap_pos hP4 + have hbeta := section54VarianceBeta_nonneg hP4 + linarith + +private theorem sqrtVarianceDecay_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ sqrtVarianceDecay d := by + have hgap := sqrtVarianceDecay_gap_pos hP4 + have hbeta := section54VarianceBeta_nonneg hP4 + linarith + +/-- Linear constant for the weighted refined pair budgets. -/ +noncomputable def pairLinearBudgetConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + (geometricDiscount (lpVarianceDecay d hP4 - section54VarianceBeta hP4) 1)⁻¹ + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + (geometricDiscount (sqrtVarianceDecay d - section54VarianceBeta hP4) 1)⁻¹) + +/-- Pointwise constant for the refined pair budget before the extra +top-scale decay is summed. -/ +noncomputable def pairPointwiseBudgetConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 16 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi) + +private theorem pairLinearBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ pairLinearBudgetConst hP4 := by + unfold pairLinearBudgetConst + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hdiscLp : + 0 ≤ (geometricDiscount (lpVarianceDecay d hP4 - + section54VarianceBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos (by simpa using lpVarianceDecay_gap_pos hP4)).le + have hdiscSqrt : + 0 ≤ (geometricDiscount (sqrtVarianceDecay d - + section54VarianceBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos (by simpa using sqrtVarianceDecay_gap_pos hP4)).le + positivity + +private theorem pairPointwiseBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ pairPointwiseBudgetConst hP4 := by + unfold pairPointwiseBudgetConst + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + +/-- Pointwise refined pair budgets are controlled by the two geometric +decays with the scale-zero moment factor. -/ +theorem pairProbeRefinedDescendantAverageK_le_geometric + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_le_half : delta ≤ 1 / 2) + (j : ℕ) : + pairProbeRefinedDescendantAverageK hP4 delta j ≤ + 16 * widetildeThetaAtScale P 0 hP4 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ))) := by + have htheta : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_zero_nonneg hP4 + let A : ℝ := + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + positivity + have hfactor : + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) ≤ + 16 * widetildeThetaAtScale P 0 hP4 := by + have hcoef : 8 * (1 + delta) ≤ (16 : ℝ) := by linarith + calc + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) + = (8 * (1 + delta)) * widetildeThetaAtScale P 0 hP4 := by ring + _ ≤ 16 * widetildeThetaAtScale P 0 hP4 := + mul_le_mul_of_nonneg_right hcoef htheta + have heq := pairProbeRefinedDescendantAverageK_eq_geometric hP4 delta j + have heq' : + pairProbeRefinedDescendantAverageK hP4 delta j = + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) * A := by + simpa [A, widetildeThetaAtScale, lpVarianceDecay, sqrtVarianceDecay] using heq + calc + pairProbeRefinedDescendantAverageK hP4 delta j = + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) * A := heq' + _ ≤ (16 * widetildeThetaAtScale P 0 hP4) * A := + mul_le_mul_of_nonneg_right hfactor hA_nonneg + _ = 16 * widetildeThetaAtScale P 0 hP4 * A := by ring + _ = + 16 * widetildeThetaAtScale P 0 hP4 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ))) := rfl + +/-- A scale-uniform pointwise bound for refined pair budgets. -/ +theorem pairProbeRefinedDescendantAverageK_le_pointwiseConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_le_half : delta ≤ 1 / 2) + (j : ℕ) : + pairProbeRefinedDescendantAverageK hP4 delta j ≤ + pairPointwiseBudgetConst hP4 * widetildeThetaAtScale P 0 hP4 := by + have hgeo := pairProbeRefinedDescendantAverageK_le_geometric hP4 hdelta_le_half j + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hLp_decay : + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) + (by + have hγ := lpVarianceDecay_nonneg hP4 + have hj : 0 ≤ (j : ℝ) := by exact_mod_cast Nat.zero_le j + exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hγ) hj) + have hSqrt_decay : + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) + (by + have hγ := sqrtVarianceDecay_nonneg hP4 + have hj : 0 ≤ (j : ℝ) := by exact_mod_cast Nat.zero_le j + exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hγ) hj) + have htheta : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_zero_nonneg hP4 + have hinside : + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) ≤ + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + exact add_le_add + (by simpa using mul_le_mul_of_nonneg_left hLp_decay hLp_nonneg) + (by simpa using mul_le_mul_of_nonneg_left hSqrt_decay hSqrt_nonneg) + calc + pairProbeRefinedDescendantAverageK hP4 delta j ≤ + 16 * widetildeThetaAtScale P 0 hP4 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ))) := hgeo + _ ≤ + 16 * widetildeThetaAtScale P 0 hP4 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi) := + mul_le_mul_of_nonneg_left hinside (mul_nonneg (by norm_num) htheta) + _ = pairPointwiseBudgetConst hP4 * widetildeThetaAtScale P 0 hP4 := by + simp [pairPointwiseBudgetConst] + ring + +/-- The compressed scalar budget is controlled by the pair budget. -/ +theorem refinedVarianceBasicBudget_le_pairBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (j : ℕ) : + refinedVarianceBasicBudget hP4 delta j ≤ + delta + 2 * pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) := by + let c := coordinateProbeRefinedDescendantAverageK hP4 delta j + let p := pairProbeRefinedDescendantAverageK hP4 delta j + have hc_nonneg : 0 ≤ c := by + simpa [c] using coordinateProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + have hp_eq : p = 4 * c := by + dsimp [p, c] + simp [pairProbeRefinedDescendantAverageK, coordinateProbeRefinedDescendantAverageK] + ring + have hp_nonneg : 0 ≤ p := by + rw [hp_eq] + positivity + have hc_le_p : c ≤ p := by + rw [hp_eq] + calc + c = 1 * c := by ring + _ ≤ 4 * c := mul_le_mul_of_nonneg_right (by norm_num : (1 : ℝ) ≤ 4) hc_nonneg + have hc_sq_le_p_sq : c ^ (2 : ℕ) ≤ p ^ (2 : ℕ) := + pow_le_pow_left₀ hc_nonneg hc_le_p 2 + unfold refinedVarianceBasicBudget + dsimp [c, p] at * + linarith [sq_nonneg p] + +/-- Constant controlling the beta-weighted refined scalar budget before the +scale-separation absorption. -/ +noncomputable def weightedRefinedBudgetConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + (geometricDiscount (section54VarianceBeta hP4) 1)⁻¹ + + 2 * pairLinearBudgetConst hP4 + + 2 * pairPointwiseBudgetConst hP4 * pairLinearBudgetConst hP4 + +theorem weightedRefinedBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ weightedRefinedBudgetConst hP4 := by + unfold weightedRefinedBudgetConst + have hdisc : + 0 ≤ (geometricDiscount (section54VarianceBeta hP4) 1)⁻¹ := + inv_nonneg.mpr + (geometricDiscount_pos (by simpa using section54VarianceBeta_pos hP4)).le + have hlin := pairLinearBudgetConst_nonneg hP4 + have hpoint := pairPointwiseBudgetConst_nonneg hP4 + have hprod : 0 ≤ pairPointwiseBudgetConst hP4 * pairLinearBudgetConst hP4 := + mul_nonneg hpoint hlin + linarith + +/-- Weighted sum of the refined pair budgets. -/ +theorem sum_Icc_varianceWeight_mul_pairProbeRefinedK_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + pairLinearBudgetConst hP4 * + widetildeThetaAtScale P 0 hP4 * + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) := by + let β := section54VarianceBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let Lp := Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + let Sqrt := Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi + let γLp := lpVarianceDecay d hP4 + let γSqrt := sqrtVarianceDecay d + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let GLp := (geometricDiscount (γLp - β) 1)⁻¹ + let GSqrt := (geometricDiscount (γSqrt - β) 1)⁻¹ + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hLp_nonneg : 0 ≤ Lp := by + dsimp [Lp] + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + have hSqrt_nonneg : 0 ≤ Sqrt := by + dsimp [Sqrt] + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact Real.rpow_nonneg (by norm_num) _ + have hsumLp : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))) ≤ + D * GLp := by + simpa [β, γLp, D, GLp] using + sum_Icc_varianceWeight_mul_rpow_decay_le + (β := section54VarianceBeta hP4) (γ := lpVarianceDecay d hP4) + (lpVarianceDecay_gap_pos hP4) m + have hsumSqrt : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ))) ≤ + D * GSqrt := by + simpa [β, γSqrt, D, GSqrt, mul_comm, mul_left_comm, mul_assoc] using + sum_Icc_varianceWeight_mul_rpow_decay_le + (β := section54VarianceBeta hP4) (γ := sqrtVarianceDecay d) + (sqrtVarianceDecay_gap_pos hP4) m + have hterm : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * + (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ)) + + Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (by + simpa [β, θ, Lp, Sqrt, γLp, γSqrt] using + pairProbeRefinedDescendantAverageK_le_geometric hP4 hdelta_le_half j) + (varianceWeight_nonneg β m j) + _ = + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := by + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + have hLp_part : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) ≤ + 16 * θ * (Lp * (D * GLp)) := by + have hLp_sum := mul_le_mul_of_nonneg_left hsumLp hLp_nonneg + have hscaled := mul_le_mul_of_nonneg_left hLp_sum + (show 0 ≤ 16 * θ from mul_nonneg (by norm_num) hθ) + simpa [Finset.mul_sum, mul_comm, mul_left_comm, mul_assoc] using hscaled + have hSqrt_part : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ))))) ≤ + 16 * θ * (Sqrt * (D * GSqrt)) := by + have hSqrt_sum := mul_le_mul_of_nonneg_left hsumSqrt hSqrt_nonneg + have hscaled := mul_le_mul_of_nonneg_left hSqrt_sum + (show 0 ≤ 16 * θ from mul_nonneg (by norm_num) hθ) + simpa [Finset.mul_sum, mul_comm, mul_left_comm, mul_assoc] using hscaled + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Lp * Real.rpow (3 : ℝ) (-γLp * (j : ℝ))))) + + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (16 * θ * (Sqrt * Real.rpow (3 : ℝ) (-γSqrt * (j : ℝ)))) := hterm + _ ≤ + 16 * θ * (Lp * (D * GLp)) + + 16 * θ * (Sqrt * (D * GSqrt)) := + add_le_add hLp_part hSqrt_part + _ = + 16 * θ * (Lp * (D * GLp) + Sqrt * (D * GSqrt)) := by + ring + _ = + pairLinearBudgetConst hP4 * widetildeThetaAtScale P 0 hP4 * + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) := by + simp [pairLinearBudgetConst, β, θ, Lp, Sqrt, γLp, γSqrt, D, GLp, GSqrt] + ring + +/-- Weighted sum of the squares of the refined pair budgets. -/ +theorem sum_Icc_varianceWeight_mul_pairProbeRefinedK_sq_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + pairPointwiseBudgetConst hP4 * pairLinearBudgetConst hP4 * + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) := by + let β := section54VarianceBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let M := pairPointwiseBudgetConst hP4 + let L := pairLinearBudgetConst hP4 + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hM_nonneg : 0 ≤ M := by + simpa [M] using pairPointwiseBudgetConst_nonneg hP4 + have hlinear := + sum_Icc_varianceWeight_mul_pairProbeRefinedK_le hP4 hdelta_le_half m + have hterm : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + ((M * θ) * pairProbeRefinedDescendantAverageK hP4 delta j) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hK_nonneg := + pairProbeRefinedDescendantAverageK_nonneg hP4 hdelta_nonneg j + have hK_le : pairProbeRefinedDescendantAverageK hP4 delta j ≤ M * θ := by + simpa [M, θ] using + pairProbeRefinedDescendantAverageK_le_pointwiseConst hP4 hdelta_le_half j + have hsq : + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ) ≤ + (M * θ) * pairProbeRefinedDescendantAverageK hP4 delta j := by + rw [sq] + exact mul_le_mul_of_nonneg_right hK_le hK_nonneg + exact mul_le_mul_of_nonneg_left hsq (varianceWeight_nonneg β m j) + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + ((M * θ) * pairProbeRefinedDescendantAverageK hP4 delta j) := hterm + _ = + (M * θ) * + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ ≤ + (M * θ) * (L * θ * D) := by + exact mul_le_mul_of_nonneg_left + (by simpa [β, θ, L, D] using hlinear) + (mul_nonneg hM_nonneg hθ) + _ = + pairPointwiseBudgetConst hP4 * pairLinearBudgetConst hP4 * + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) := by + simp [M, L, θ, D, β] + ring + +/-- The full weighted refined scalar budget has only the manuscript-size +terms `δ` and `3^{-βm}(\widetilde\Theta_0+\widetilde\Theta_0^2)`. -/ +theorem sum_Icc_varianceWeight_mul_refinedVarianceBasicBudget_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedVarianceBasicBudget hP4 delta j) ≤ + weightedRefinedBudgetConst hP4 * + (delta + + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ))) := by + let β := section54VarianceBeta hP4 + let θ := widetildeThetaAtScale P 0 hP4 + let D := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let C := weightedRefinedBudgetConst hP4 + let L := pairLinearBudgetConst hP4 + let M := pairPointwiseBudgetConst hP4 + let Gβ := (geometricDiscount β 1)⁻¹ + have hδ_nonneg : 0 ≤ delta := hdelta_pos.le + have hθ : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hD : 0 ≤ D := by + dsimp [D] + exact Real.rpow_nonneg (by norm_num) _ + have hC_nonneg : 0 ≤ C := by + simpa [C] using weightedRefinedBudgetConst_nonneg hP4 + have hL_nonneg : 0 ≤ L := by + simpa [L] using pairLinearBudgetConst_nonneg hP4 + have hM_nonneg : 0 ≤ M := by + simpa [M] using pairPointwiseBudgetConst_nonneg hP4 + have hG_nonneg : 0 ≤ Gβ := by + dsimp [Gβ, β] + exact inv_nonneg.mpr + (geometricDiscount_pos (by simpa using section54VarianceBeta_pos hP4)).le + have hC_ge_G : Gβ ≤ C := by + dsimp [C, Gβ, weightedRefinedBudgetConst] + have hML_nonneg : 0 ≤ M * L := mul_nonneg hM_nonneg hL_nonneg + linarith + have hC_ge_2L : 2 * L ≤ C := by + dsimp [C, L, Gβ, weightedRefinedBudgetConst] + have hML_nonneg : 0 ≤ M * L := mul_nonneg hM_nonneg hL_nonneg + linarith + have hC_ge_2ML : 2 * M * L ≤ C := by + dsimp [C, M, L, Gβ, weightedRefinedBudgetConst] + linarith + have hbudgetTerm : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + refinedVarianceBasicBudget hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (delta + 2 * pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left + (refinedVarianceBasicBudget_le_pairBudget hP4 hδ_nonneg j) + (varianceWeight_nonneg β m j) + have hconst : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * delta) ≤ Gβ * delta := by + calc + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * delta) = + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) * delta := by + rw [Finset.sum_mul] + _ ≤ Gβ * delta := by + exact mul_le_mul_of_nonneg_right + (by + simpa [β, Gβ] using + sum_Icc_varianceWeight_le_inv_geometricDiscount + (section54VarianceBeta_pos hP4) m) + hδ_nonneg + have hlinear : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j) ≤ + L * θ * D := by + simpa [β, L, θ, D] using + sum_Icc_varianceWeight_mul_pairProbeRefinedK_le hP4 hdelta_le_half m + have hsquare : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) ≤ + M * L * θ ^ (2 : ℕ) * D := by + simpa [β, M, L, θ, D, mul_assoc] using + sum_Icc_varianceWeight_mul_pairProbeRefinedK_sq_le + hP4 hδ_nonneg hdelta_le_half m + have hsplit : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (delta + 2 * pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ))) = + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) + + (∑ j ∈ Finset.Icc 1 m, delta * varianceWeight β m j) := by + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (delta + 2 * pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ))) = + ∑ j ∈ Finset.Icc 1 m, + (2 * (varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * (varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) + + delta * varianceWeight β m j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) + + (∑ j ∈ Finset.Icc 1 m, delta * varianceWeight β m j) := by + simp [Finset.sum_add_distrib, Finset.mul_sum] + have hconst' : + (∑ j ∈ Finset.Icc 1 m, delta * varianceWeight β m j) ≤ Gβ * delta := by + simpa [mul_comm] using hconst + have hraw : + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + refinedVarianceBasicBudget hP4 delta j) ≤ + Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) := by + calc + (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + refinedVarianceBasicBudget hP4 delta j) ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + (delta + 2 * pairProbeRefinedDescendantAverageK hP4 delta j + + 2 * pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) := hbudgetTerm + _ = + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j) + + 2 * (∑ j ∈ Finset.Icc 1 m, + varianceWeight β m j * + pairProbeRefinedDescendantAverageK hP4 delta j ^ (2 : ℕ)) + + (∑ j ∈ Finset.Icc 1 m, delta * varianceWeight β m j) := hsplit + _ ≤ Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) := by + linarith + have hfinal : + Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) ≤ + C * (delta + D * (θ + θ ^ (2 : ℕ))) := by + have h1 : Gβ * delta ≤ C * delta := + mul_le_mul_of_nonneg_right hC_ge_G hδ_nonneg + have h2 : 2 * (L * θ * D) ≤ C * (D * θ) := by + have hcoef : 2 * L ≤ C := hC_ge_2L + have hDθ : 0 ≤ D * θ := mul_nonneg hD hθ + have hmul := mul_le_mul_of_nonneg_right hcoef hDθ + calc + 2 * (L * θ * D) = (2 * L) * (D * θ) := by ring + _ ≤ C * (D * θ) := hmul + have h3 : 2 * (M * L * θ ^ (2 : ℕ) * D) ≤ C * (D * θ ^ (2 : ℕ)) := by + have hcoef : 2 * M * L ≤ C := hC_ge_2ML + have hDθ2 : 0 ≤ D * θ ^ (2 : ℕ) := mul_nonneg hD (sq_nonneg θ) + have hmul := mul_le_mul_of_nonneg_right hcoef hDθ2 + calc + 2 * (M * L * θ ^ (2 : ℕ) * D) = (2 * M * L) * (D * θ ^ (2 : ℕ)) := by + ring + _ ≤ C * (D * θ ^ (2 : ℕ)) := hmul + calc + Gβ * delta + 2 * (L * θ * D) + 2 * (M * L * θ ^ (2 : ℕ) * D) + ≤ C * delta + C * (D * θ) + C * (D * θ ^ (2 : ℕ)) := by + exact add_le_add (add_le_add h1 h2) h3 + _ = C * (delta + D * (θ + θ ^ (2 : ℕ))) := by ring + exact hraw.trans hfinal + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FiniteNet.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FiniteNet.lean new file mode 100644 index 0000000000..8145c37c9b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/FiniteNet.lean @@ -0,0 +1,383 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarReduction + +/-! # Finite Net -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +noncomputable section + +/-! +# Finite-dimensional probes for full-block matrices + +This file starts the deterministic finite-dimensional upgrade used in the +variance bound. The eventual argument controls the Euclidean operator norm of +a symmetric full-block matrix by finitely many quadratic probes. +-/ + +/-- Coordinate probe in the full-block space. -/ +def fullBlockCoordinateProbe {d : ℕ} (α : BlockCoord d) : FullBlockVec d := + Pi.single α 1 + +/-- The quadratic form on a coordinate probe reads off a diagonal entry. -/ +@[simp] +theorem fullBlockQuadratic_coordinateProbe + {d : ℕ} (M : FullBlockMat d) (α : BlockCoord d) : + fullBlockQuadratic M (fullBlockCoordinateProbe α) = M α α := by + classical + unfold fullBlockQuadratic fullBlockCoordinateProbe + rw [dotProduct, Finset.sum_eq_single α] + · rw [Matrix.mulVec, dotProduct, Finset.sum_eq_single α] + · simp + · intro β _hβ hβα + simp [Pi.single_eq_of_ne hβα] + · simp + · intro β _hβ hβα + simp [Pi.single_eq_of_ne hβα] + · simp + +/-- The plus-pair probe used in the polarization step. -/ +def fullBlockPlusProbe {d : ℕ} (α β : BlockCoord d) : FullBlockVec d := + fullBlockCoordinateProbe α + fullBlockCoordinateProbe β + +/-- The minus-pair probe used in the polarization step. -/ +def fullBlockMinusProbe {d : ℕ} (α β : BlockCoord d) : FullBlockVec d := + fullBlockCoordinateProbe α - fullBlockCoordinateProbe β + +/-- Off-diagonal plus-probe expansion for a symmetric full-block matrix. -/ +theorem fullBlockQuadratic_plusProbe_of_ne + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) + {α β : BlockCoord d} (hαβ : α ≠ β) : + fullBlockQuadratic M (fullBlockPlusProbe α β) = + M α α + 2 * M α β + M β β := by + classical + have hβα : β ≠ α := hαβ.symm + have hsymm : M β α = M α β := (hM.apply β α).symm + unfold fullBlockQuadratic fullBlockPlusProbe fullBlockCoordinateProbe + rw [dotProduct, Fintype.sum_eq_add α β hαβ] + · rw [Matrix.mulVec, dotProduct, Fintype.sum_eq_add α β hαβ] + · rw [Matrix.mulVec, dotProduct, Fintype.sum_eq_add α β hαβ] + · simp [Pi.single_eq_same, Pi.single_eq_of_ne, hαβ, hβα, hsymm] + ring + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + +/-- Off-diagonal minus-probe expansion for a symmetric full-block matrix. -/ +theorem fullBlockQuadratic_minusProbe_of_ne + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) + {α β : BlockCoord d} (hαβ : α ≠ β) : + fullBlockQuadratic M (fullBlockMinusProbe α β) = + M α α - 2 * M α β + M β β := by + classical + have hβα : β ≠ α := hαβ.symm + have hsymm : M β α = M α β := (hM.apply β α).symm + unfold fullBlockQuadratic fullBlockMinusProbe fullBlockCoordinateProbe + rw [dotProduct, Fintype.sum_eq_add α β hαβ] + · rw [Matrix.mulVec, dotProduct, Fintype.sum_eq_add α β hαβ] + · rw [Matrix.mulVec, dotProduct, Fintype.sum_eq_add α β hαβ] + · simp [Pi.single_eq_same, Pi.single_eq_of_ne, hαβ, hβα, hsymm] + ring + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + · intro γ hγ + simp [Pi.single_eq_of_ne hγ.1, Pi.single_eq_of_ne hγ.2] + +/-- Polarization recovers an off-diagonal entry from the plus and minus +quadratic probes. -/ +theorem fullBlock_entry_eq_quarter_plus_sub_minus_of_ne + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) + {α β : BlockCoord d} (hαβ : α ≠ β) : + M α β = + (1 / 4 : ℝ) * + (fullBlockQuadratic M (fullBlockPlusProbe α β) - + fullBlockQuadratic M (fullBlockMinusProbe α β)) := by + rw [fullBlockQuadratic_plusProbe_of_ne hM hαβ, + fullBlockQuadratic_minusProbe_of_ne hM hαβ] + ring + +/-- A finite sum of coordinate and pair probes controlling all entries of a +symmetric full-block matrix. -/ +noncomputable def fullBlockProbeAbsSum {d : ℕ} (M : FullBlockMat d) : ℝ := + ∑ α : BlockCoord d, ∑ β : BlockCoord d, + (|fullBlockQuadratic M (fullBlockCoordinateProbe α)| + + |fullBlockQuadratic M (fullBlockPlusProbe α β)| + + |fullBlockQuadratic M (fullBlockMinusProbe α β)|) + +theorem fullBlockProbeAbsSum_nonneg {d : ℕ} (M : FullBlockMat d) : + 0 ≤ fullBlockProbeAbsSum M := by + unfold fullBlockProbeAbsSum + positivity + +private theorem fullBlock_entry_abs_le_probe_abs + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) + (α β : BlockCoord d) : + |M α β| ≤ + |fullBlockQuadratic M (fullBlockCoordinateProbe α)| + + |fullBlockQuadratic M (fullBlockPlusProbe α β)| + + |fullBlockQuadratic M (fullBlockMinusProbe α β)| := by + by_cases hαβ : α = β + · subst β + rw [fullBlockQuadratic_coordinateProbe] + nlinarith [abs_nonneg (fullBlockQuadratic M (fullBlockPlusProbe α α)), + abs_nonneg (fullBlockQuadratic M (fullBlockMinusProbe α α))] + · have hpol := fullBlock_entry_eq_quarter_plus_sub_minus_of_ne hM hαβ + let P := fullBlockQuadratic M (fullBlockPlusProbe α β) + let N := fullBlockQuadratic M (fullBlockMinusProbe α β) + have habs_sub : |P - N| ≤ |P| + |N| := by + calc + |P - N| = |P + -N| := by rw [sub_eq_add_neg] + _ ≤ |P| + |-N| := abs_add_le P (-N) + _ = |P| + |N| := by rw [abs_neg] + have hquarter : |(1 / 4 : ℝ) * (P - N)| ≤ |P| + |N| := by + calc + |(1 / 4 : ℝ) * (P - N)| = (1 / 4 : ℝ) * |P - N| := by + simp [abs_mul] + _ ≤ 1 * |P - N| := by + exact mul_le_mul_of_nonneg_right (by norm_num) (abs_nonneg _) + _ ≤ |P| + |N| := by simpa using habs_sub + calc + |M α β| = |(1 / 4 : ℝ) * (P - N)| := by rw [hpol] + _ ≤ |P| + |N| := hquarter + _ ≤ |fullBlockQuadratic M (fullBlockCoordinateProbe α)| + |P| + |N| := by + nlinarith [abs_nonneg (fullBlockQuadratic M (fullBlockCoordinateProbe α))] + +private theorem norm_toEuclideanCLM_le_sum_abs_entries + {ι : Type*} [Fintype ι] [DecidableEq ι] (M : Matrix ι ι ℝ) : + ‖Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M‖ ≤ + (Fintype.card ι : ℝ) * ∑ i : ι, ∑ j : ι, |M i j| := by + classical + let S : ℝ := ∑ i : ι, ∑ j : ι, |M i j| + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + refine ContinuousLinearMap.opNorm_le_bound _ + (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) ?_ + intro x + have hcoord : + ∀ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ≤ + S * ‖x‖ := by + intro i + calc + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ + = |∑ j : ι, M i j * x.ofLp j| := by + simp [Real.norm_eq_abs, Matrix.mulVec, dotProduct] + _ ≤ ∑ j : ι, |M i j * x.ofLp j| := + Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun j => M i j * x.ofLp j) + _ = ∑ j : ι, |M i j| * ‖x.ofLp j‖ := by + simp [abs_mul, Real.norm_eq_abs] + _ ≤ ∑ j : ι, |M i j| * ‖x‖ := by + exact Finset.sum_le_sum fun j _ => + mul_le_mul_of_nonneg_left (PiLp.norm_apply_le x j) (abs_nonneg _) + _ = (∑ j : ι, |M i j|) * ‖x‖ := by + rw [Finset.sum_mul] + _ ≤ S * ‖x‖ := by + exact mul_le_mul_of_nonneg_right + (Finset.single_le_sum + (fun k _ => Finset.sum_nonneg fun j _ => abs_nonneg (M k j)) + (Finset.mem_univ i)) + (norm_nonneg x) + have hnorm_sq : + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 ≤ + (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + calc + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 + = ∑ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ^ 2 := by + rw [EuclideanSpace.norm_sq_eq] + _ ≤ ∑ i : ι, (S * ‖x‖) ^ 2 := by + exact Finset.sum_le_sum fun i _ => + pow_le_pow_left₀ (norm_nonneg _) (hcoord i) 2 + _ ≤ (∑ _i : ι, S * ‖x‖) ^ 2 := by + exact Finset.sum_sq_le_sq_sum_of_nonneg + (fun _ _ => mul_nonneg hS_nonneg (norm_nonneg x)) + _ = (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + simp [Finset.sum_const] + ring + exact (sq_le_sq₀ (norm_nonneg _) + (mul_nonneg (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) (norm_nonneg x))).mp hnorm_sq + +/-- The Euclidean operator norm of a symmetric full-block matrix is controlled +by finitely many coordinate and pair quadratic probes. -/ +theorem fullBlock_operatorNorm_le_probeAbsSum + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ≤ + (Fintype.card (BlockCoord d) : ℝ) * fullBlockProbeAbsSum M := by + classical + have hentry_sum : + (∑ α : BlockCoord d, ∑ β : BlockCoord d, |M α β|) ≤ + fullBlockProbeAbsSum M := by + calc + (∑ α : BlockCoord d, ∑ β : BlockCoord d, |M α β|) + ≤ ∑ α : BlockCoord d, ∑ β : BlockCoord d, + (|fullBlockQuadratic M (fullBlockCoordinateProbe α)| + + |fullBlockQuadratic M (fullBlockPlusProbe α β)| + + |fullBlockQuadratic M (fullBlockMinusProbe α β)|) := by + exact Finset.sum_le_sum fun α _ => + Finset.sum_le_sum fun β _ => + fullBlock_entry_abs_le_probe_abs hM α β + _ = + ∑ α : BlockCoord d, ∑ β : BlockCoord d, + (|fullBlockQuadratic M (fullBlockCoordinateProbe α)| + + |fullBlockQuadratic M (fullBlockPlusProbe α β)| + + |fullBlockQuadratic M (fullBlockMinusProbe α β)|) := rfl + _ = fullBlockProbeAbsSum M := by + rfl + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ + ≤ (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, ∑ β : BlockCoord d, |M α β| := + norm_toEuclideanCLM_le_sum_abs_entries M + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * fullBlockProbeAbsSum M := + mul_le_mul_of_nonneg_left hentry_sum (Nat.cast_nonneg _) + +/-- Squared version of `fullBlock_operatorNorm_le_probeAbsSum`. -/ +theorem fullBlock_operatorNorm_sq_le_probeAbsSum_sq + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ 2 ≤ + ((Fintype.card (BlockCoord d) : ℝ) * fullBlockProbeAbsSum M) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (fullBlock_operatorNorm_le_probeAbsSum hM) 2 + +/-- Dimension-weighted square budget for the finite coordinate and pair probes. +This is intentionally generous; constants are harmless in the final +dimension-dependent variance constant. -/ +noncomputable def fullBlockProbeSqBudget {d : ℕ} (M : FullBlockMat d) : ℝ := + (Fintype.card (BlockCoord d) : ℝ) * + (∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + 3 * ((fullBlockQuadratic M (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockMinusProbe α β)) ^ (2 : ℕ))) + +private theorem three_abs_sum_sq_le_three_sq_sum (a b c : ℝ) : + (|a| + |b| + |c|) ^ (2 : ℕ) ≤ + 3 * (a ^ (2 : ℕ) + b ^ (2 : ℕ) + c ^ (2 : ℕ)) := by + nlinarith [sq_nonneg (|a| - |b|), sq_nonneg (|a| - |c|), + sq_nonneg (|b| - |c|), sq_abs a, sq_abs b, sq_abs c] + +/-- The finite-probe absolute sum is controlled by the square budget. -/ +theorem fullBlockProbeAbsSum_sq_le_probeSqBudget + {d : ℕ} (M : FullBlockMat d) : + (fullBlockProbeAbsSum M) ^ (2 : ℕ) ≤ fullBlockProbeSqBudget M := by + classical + let g : BlockCoord d → BlockCoord d → ℝ := fun α β => + |fullBlockQuadratic M (fullBlockCoordinateProbe α)| + + |fullBlockQuadratic M (fullBlockPlusProbe α β)| + + |fullBlockQuadratic M (fullBlockMinusProbe α β)| + have houter := + sq_sum_le_card_mul_sum_sq (s := (Finset.univ : Finset (BlockCoord d))) + (f := fun α => ∑ β : BlockCoord d, g α β) + have hinner : + (∑ α : BlockCoord d, (∑ β : BlockCoord d, g α β) ^ (2 : ℕ)) ≤ + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + (g α β) ^ (2 : ℕ) := by + refine Finset.sum_le_sum ?_ + intro α _hα + exact + sq_sum_le_card_mul_sum_sq (s := (Finset.univ : Finset (BlockCoord d))) + (f := fun β => g α β) + have hpoint : + (∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + (g α β) ^ (2 : ℕ)) ≤ + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + 3 * ((fullBlockQuadratic M (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockMinusProbe α β)) ^ (2 : ℕ)) := by + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + simpa [g] using three_abs_sum_sq_le_three_sq_sum + (fullBlockQuadratic M (fullBlockCoordinateProbe α)) + (fullBlockQuadratic M (fullBlockPlusProbe α β)) + (fullBlockQuadratic M (fullBlockMinusProbe α β)) + calc + (fullBlockProbeAbsSum M) ^ (2 : ℕ) + = (∑ α : BlockCoord d, ∑ β : BlockCoord d, g α β) ^ (2 : ℕ) := by + simp [fullBlockProbeAbsSum, g] + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, (∑ β : BlockCoord d, g α β) ^ (2 : ℕ) := houter + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + (∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + (g α β) ^ (2 : ℕ)) := by + exact mul_le_mul_of_nonneg_left hinner (Nat.cast_nonneg _) + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + (∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * ∑ β : BlockCoord d, + 3 * ((fullBlockQuadratic M (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic M (fullBlockMinusProbe α β)) ^ (2 : ℕ))) := by + exact mul_le_mul_of_nonneg_left hpoint (Nat.cast_nonneg _) + _ = fullBlockProbeSqBudget M := by rfl + +/-- Squared operator-norm control by the finite quadratic-probe square +budget. -/ +theorem fullBlock_operatorNorm_sq_le_probeSqBudget + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ 2 ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget M := by + have h1 := fullBlock_operatorNorm_sq_le_probeAbsSum_sq hM + have h2 := fullBlockProbeAbsSum_sq_le_probeSqBudget M + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ 2 + ≤ ((Fintype.card (BlockCoord d) : ℝ) * fullBlockProbeAbsSum M) ^ (2 : ℕ) := + h1 + _ = ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + (fullBlockProbeAbsSum M) ^ (2 : ℕ) := by ring + _ ≤ ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget M := + mul_le_mul_of_nonneg_left h2 (sq_nonneg _) + +/-- Almost-sure finite-probe control of the Ch4 normalized full-block +fluctuation observable on a cube. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_probeSqBudget_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) : + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct center Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget + (fullBlockNormalizedFluctuationMatrix hP hStruct center (cubeSet Q) a) := by + filter_upwards [fullBlockNormalizedFluctuationMatrix_isSymm_ae hP hStruct center Q] with a hM + rw [Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq] + exact fullBlock_operatorNorm_sq_le_probeSqBudget hM + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/GeometricSum.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/GeometricSum.lean new file mode 100644 index 0000000000..f75e6df89e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/GeometricSum.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.Basic + +/-! # Geometric Sum -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open scoped BigOperators + +noncomputable section + +/-! +# Elementary real estimates for the variance-bound sum + +This file collects the low-level nonnegativity and square-root estimates used +when summing the beta-weighted fluctuation bounds. +-/ + +/-- The square root dominates `δ` on `[0, 1]`. -/ +theorem le_sqrt_of_nonneg_of_le_one {δ : ℝ} (hδ_nonneg : 0 ≤ δ) + (hδ_le_one : δ ≤ 1) : + δ ≤ Real.sqrt δ := by + have hsq : δ ^ 2 ≤ (Real.sqrt δ) ^ 2 := by + rw [Real.sq_sqrt hδ_nonneg] + nlinarith + exact (sq_le_sq₀ hδ_nonneg (Real.sqrt_nonneg δ)).1 hsq + +/-- In the manuscript range `0 < δ ≤ 1/2`, the square root dominates `δ`. -/ +theorem le_sqrt_of_pos_of_le_half {δ : ℝ} (hδ_pos : 0 < δ) + (hδ_le_half : δ ≤ 1 / 2) : + δ ≤ Real.sqrt δ := + le_sqrt_of_nonneg_of_le_one hδ_pos.le (by linarith) + +/-- The square root of an admissible `δ` is nonnegative. -/ +theorem sqrt_nonneg_of_pos {δ : ℝ} (_hδ_pos : 0 < δ) : + 0 ≤ Real.sqrt δ := + Real.sqrt_nonneg δ + +/-- A beta-weighted nonnegative term is nonnegative. -/ +theorem varianceWeight_mul_nonneg {β x : ℝ} {m j : ℕ} (hx : 0 ≤ x) : + 0 ≤ varianceWeight β m j * x := + mul_nonneg (varianceWeight_nonneg β m j) hx + +/-- A finite beta-weighted sum of nonnegative terms is nonnegative. -/ +theorem sum_Icc_varianceWeight_mul_nonneg {β : ℝ} {m : ℕ} {f : ℕ → ℝ} + (hf : ∀ j, j ∈ Finset.Icc 1 m → 0 ≤ f j) : + 0 ≤ ∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * f j := by + refine Finset.sum_nonneg ?_ + intro j hj + exact varianceWeight_mul_nonneg (hf j hj) + +/-- Multiplication by a beta weight preserves an upper bound between +nonnegative terms. -/ +theorem varianceWeight_mul_le_mul {β x y : ℝ} {m j : ℕ} + (hxy : x ≤ y) : + varianceWeight β m j * x ≤ varianceWeight β m j * y := + mul_le_mul_of_nonneg_left hxy (varianceWeight_nonneg β m j) + +/-- Sumwise version of `varianceWeight_mul_le_mul`. -/ +theorem sum_Icc_varianceWeight_mul_le_mul {β : ℝ} {m : ℕ} {f g : ℕ → ℝ} + (hfg : ∀ j, j ∈ Finset.Icc 1 m → f j ≤ g j) : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * f j) ≤ + ∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * g j := by + refine Finset.sum_le_sum ?_ + intro j hj + exact varianceWeight_mul_le_mul (hfg j hj) + +/-- A constant can be pulled through a beta-weighted finite sum. -/ +theorem sum_Icc_varianceWeight_mul_const (β c : ℝ) (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * c) = + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) * c := by + rw [Finset.sum_mul] + +/-- If `C` is nonnegative, enlarging a beta-weighted sum by a nonnegative +constant preserves inequalities. -/ +theorem sum_Icc_varianceWeight_mul_le_const_mul {β C : ℝ} {m : ℕ} {f : ℕ → ℝ} + (hf : ∀ j, j ∈ Finset.Icc 1 m → f j ≤ C) : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j * f j) ≤ + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) * C := by + rw [← sum_Icc_varianceWeight_mul_const β C m] + exact sum_Icc_varianceWeight_mul_le_mul hf + +/-- The finite beta-weight sum is bounded by the full geometric tail. -/ +theorem sum_Icc_varianceWeight_le_inv_geometricDiscount {β : ℝ} (hβ : 0 < β) + (m : ℕ) : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) ≤ + (geometricDiscount β 1)⁻¹ := by + classical + let f : ℕ → ℝ := fun k => Real.rpow (3 : ℝ) (-β * (k : ℝ)) + let s : Finset ℕ := (Finset.Icc 1 m).image fun j => m - j + have hinj : Set.InjOn (fun j => m - j) (Finset.Icc 1 m) := by + intro a ha b hb hab + have ha_le : a ≤ m := (Finset.mem_Icc.mp ha).2 + have hb_le : b ≤ m := (Finset.mem_Icc.mp hb).2 + exact (tsub_right_inj ha_le hb_le).1 hab + have hsum_image : + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) = + ∑ k ∈ s, f k := by + calc + (∑ j ∈ Finset.Icc 1 m, varianceWeight β m j) = + ∑ j ∈ Finset.Icc 1 m, f (m - j) := by + simp [f, varianceWeight] + _ = ∑ k ∈ s, f k := by + simpa [s] using + (Finset.sum_image (s := Finset.Icc 1 m) (g := fun j => m - j) + (f := f) hinj).symm + have hsummable : Summable f := + Section52.summable_rpow_three_neg_mul_nat hβ + rw [hsum_image] + calc + (∑ k ∈ s, f k) ≤ ∑' k : ℕ, f k := + hsummable.sum_le_tsum s (fun k _hk => Real.rpow_nonneg (by norm_num) _) + _ = (geometricDiscount β 1)⁻¹ := by + simpa [f] using Section52.tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hβ + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/MatrixVariance.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/MatrixVariance.lean new file mode 100644 index 0000000000..49f35d3bd5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/MatrixVariance.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarVariance + +/-! # Matrix Variance -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Matrix variance from finite scalar probes + +This file integrates the finite-dimensional probe bound. It is deliberately +internal: scalar probe integrability and bounds are supplied by the preceding +Section 5.4 files before the public lemma is assembled. +-/ + +private theorem fullBlockQuadratic_smul + {d : ℕ} (M : FullBlockMat d) (c : ℝ) (q : FullBlockVec d) : + fullBlockQuadratic M (c • q) = c ^ (2 : ℕ) * fullBlockQuadratic M q := by + unfold fullBlockQuadratic + rw [Matrix.mulVec_smul, smul_dotProduct, dotProduct_smul] + simp [pow_two, smul_eq_mul, mul_assoc] + +private theorem fullBlockPlusProbe_self + {d : ℕ} (α : BlockCoord d) : + fullBlockPlusProbe α α = (2 : ℝ) • fullBlockCoordinateProbe α := by + classical + ext γ + by_cases hγα : γ = α + · subst γ + simp [fullBlockPlusProbe, fullBlockCoordinateProbe] + norm_num + · simp [fullBlockPlusProbe, fullBlockCoordinateProbe, hγα] + +private theorem fullBlockMinusProbe_self + {d : ℕ} (α : BlockCoord d) : + fullBlockMinusProbe α α = 0 := by + classical + ext γ + by_cases hγα : γ = α + · subst γ + simp [fullBlockMinusProbe, fullBlockCoordinateProbe] + · simp [fullBlockMinusProbe, fullBlockCoordinateProbe, hγα] + +theorem fullBlockQuadratic_plusProbe_self + {d : ℕ} (M : FullBlockMat d) (α : BlockCoord d) : + fullBlockQuadratic M (fullBlockPlusProbe α α) = + 4 * fullBlockQuadratic M (fullBlockCoordinateProbe α) := by + rw [fullBlockPlusProbe_self, fullBlockQuadratic_smul] + norm_num + +theorem fullBlockQuadratic_minusProbe_self + {d : ℕ} (M : FullBlockMat d) (α : BlockCoord d) : + fullBlockQuadratic M (fullBlockMinusProbe α α) = 0 := by + rw [fullBlockMinusProbe_self] + unfold fullBlockQuadratic + simp [dotProduct, Matrix.mulVec] + +theorem integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m j : ℕ) (q : FullBlockVec d) : + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) q) ^ (2 : ℕ) ∂P = + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a - dotProduct q q| ^ + (2 : ℕ) ∂P := by + apply integral_congr_ae + filter_upwards with a + have hquad := + fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 m q (cubeSet (originCube d (j : ℤ))) a + symm + rw [hquad, sq_abs] + +theorem integrable_fluctuationQuadratic_sq_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m j : ℕ) (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) q) ^ (2 : ℕ)) P := by + have hcenter := + integrable_abs_sub_dotProduct_sq_fullBlockNormalizedQuadraticObservable_from_P4 + hP hStruct hP4 m j q + refine hcenter.congr ?_ + filter_upwards with a + have hquad := + fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 m q (cubeSet (originCube d (j : ℤ))) a + rw [hquad, sq_abs] + +/-- Integrating the finite-probe pointwise bound reduces the full-block matrix +variance to scalar quadratic-probe variances. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_probeBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m j : ℕ) + (Ccoord : BlockCoord d → ℝ) + (Cplus Cminus : BlockCoord d → BlockCoord d → ℝ) + (hcoord_int : + ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P) + (hplus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ)) P) + (hminus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P) + (hcoord : + ∀ α : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P) ≤ Ccoord α) + (hplus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cplus α β) + (hminus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cminus α β) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β)) := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (j : ℤ) + let M : RegCoeffField d → FullBlockMat d := fun a => + fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) (cubeSet Q) a + have hF_int : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q) P := by + simpa [Q] using + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + hP hStruct hP4 (m : ℤ) j + have hterm_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + 3 * ((fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ))) P := by + intro α β + have hsum : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P := by + have hci : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hcoord_int α + have hpi : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hplus_int α β + have hmi : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hminus_int α β + exact (hci.add hpi).add hmi + exact hsum.const_mul 3 + have hbudget_int : + Integrable + (fun a : RegCoeffField d => + fullBlockProbeSqBudget (M a)) P := by + unfold fullBlockProbeSqBudget + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro α _hα + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro β _hβ + simpa [M] using hterm_int α β + have hpoint : + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) := by + simpa [M, Q] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_probeSqBudget_ae + hP hStruct (m : ℤ) Q + have hfirst : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ∂P ≤ + ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) ∂P := by + exact integral_mono_ae hF_int (hbudget_int.const_mul _) hpoint + have hbudget_eval : + ∫ a, fullBlockProbeSqBudget (M a) ∂P = + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + (∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ + (2 : ℕ) ∂P) := by + unfold fullBlockProbeSqBudget + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr 1 + ext α + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr 1 + ext β + rw [integral_const_mul] + congr 1 + have hci : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hcoord_int α + have hpi : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hplus_int α β + have hmi : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P := by + simpa [M, Q] using hminus_int α β + calc + ∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P + = + ∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := by + simpa [Pi.add_apply, add_assoc] using + integral_add (hci.add hpi) hmi + _ = + (∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P) + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := by + rw [integral_add hci hpi] + _ = + ∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := by + ring + · intro β _hβ + simpa [M] using hterm_int α β + · intro α _hα + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro β _hβ + simpa [M] using hterm_int α β + have hbudget_bound : + ∫ a, fullBlockProbeSqBudget (M a) ∂P ≤ + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β) := by + rw [hbudget_eval] + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + have hc := hcoord α + have hp := hplus α β + have hm := hminus α β + nlinarith + calc + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P + = ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ∂P := rfl + _ ≤ ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) ∂P := hfirst + _ = ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ∫ a, fullBlockProbeSqBudget (M a) ∂P := by + rw [integral_const_mul] + _ ≤ ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β)) := by + exact mul_le_mul_of_nonneg_left hbudget_bound (sq_nonneg _) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/NormalizedBlocks.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/NormalizedBlocks.lean new file mode 100644 index 0000000000..79d5c1bac9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/NormalizedBlocks.lean @@ -0,0 +1,753 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.GeometricSum + +/-! # Normalized Blocks -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory + +noncomputable section + +/-! +# Normalized full-block fluctuation wrappers + +This file records the Section 5.4-facing consequences of the public Ch4 and +Section 5.2 APIs for the normalized full-block fluctuation observable appearing +in the variance bound at a good scale. +-/ + +/-- The quadratic form associated with a full-block matrix. -/ +def fullBlockQuadratic {d : ℕ} (M : FullBlockMat d) (x : FullBlockVec d) : ℝ := + dotProduct x (Matrix.mulVec M x) + +/-- Quadratic form of the identity full-block matrix. -/ +theorem fullBlockQuadratic_one {d : ℕ} (q : FullBlockVec d) : + fullBlockQuadratic (1 : FullBlockMat d) q = dotProduct q q := by + simp [fullBlockQuadratic, Matrix.one_mulVec] + +/-- The Euclidean dot product of a full-block vector with itself is +nonnegative. -/ +theorem dotProduct_self_nonneg {d : ℕ} (q : FullBlockVec d) : + 0 ≤ dotProduct q q := by + simpa using dotProduct_star_self_nonneg (v := q) + +private theorem norm_sq_toFullBlockVec {d : ℕ} (X : BlockVec d) : + ‖(WithLp.toLp 2 (toFullBlockVec X) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + blockVecDot X X := by + rw [PiLp.norm_sq_eq_of_L2, Fintype.sum_sum_type] + rcases X with ⟨p, q⟩ + simp [toFullBlockVec, blockVecDot, vecDot, sq] + +private theorem abs_blockVecDot_le_norm_mul_norm {d : ℕ} (X Y : BlockVec d) : + |blockVecDot X Y| ≤ + ‖(WithLp.toLp 2 (toFullBlockVec X) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ * + ‖(WithLp.toLp 2 (toFullBlockVec Y) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ := by + let x : PiLp 2 (fun _ : BlockCoord d => ℝ) := WithLp.toLp 2 (toFullBlockVec X) + let y : PiLp 2 (fun _ : BlockCoord d => ℝ) := WithLp.toLp 2 (toFullBlockVec Y) + have hinner : inner ℝ x y = blockVecDot X Y := by + rw [← dotProduct_toFullBlockVec X Y] + simp [x, y, PiLp.inner_apply, dotProduct, mul_comm] + simpa [hinner] using abs_real_inner_le_norm x y + +private theorem fullBlockMat_mulVec_norm_sq_le_operatorNorm_sq + {d : ℕ} [NeZero d] (M : FullBlockMat d) (X : BlockVec d) : + blockVecDot (blockMatVecMul (ofFullBlockMat M) X) + (blockMatVecMul (ofFullBlockMat M) X) ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ 2 * + blockVecDot X X := by + let x : PiLp 2 (fun _ : BlockCoord d => ℝ) := WithLp.toLp 2 (toFullBlockVec X) + let y : PiLp 2 (fun _ : BlockCoord d => ℝ) := + WithLp.toLp 2 (toFullBlockVec (blockMatVecMul (ofFullBlockMat M) X)) + have hy : (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M) x = y := by + simp [x, y, Matrix.toEuclideanCLM_toLp, toFullBlockVec_blockMatVecMul] + have hnorm : + ‖y‖ ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * ‖x‖ := by + simpa [hy] using + (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M).le_opNorm x + have hsq : + ‖y‖ ^ 2 ≤ + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * ‖x‖) ^ 2 := + pow_le_pow_left₀ (norm_nonneg y) hnorm 2 + calc + blockVecDot (blockMatVecMul (ofFullBlockMat M) X) + (blockMatVecMul (ofFullBlockMat M) X) = ‖y‖ ^ 2 := by + rw [norm_sq_toFullBlockVec] + _ ≤ (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * ‖x‖) ^ 2 := hsq + _ = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ 2 * + blockVecDot X X := by + rw [mul_pow, norm_sq_toFullBlockVec] + +/-- A scalar full-block quadratic probe is controlled by the squared +Euclidean operator norm of the matrix. -/ +theorem fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq + {d : ℕ} [NeZero d] (M : FullBlockMat d) (q : FullBlockVec d) : + |fullBlockQuadratic M q| ^ (2 : ℕ) ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) * + (dotProduct q q) ^ (2 : ℕ) := by + let X : BlockVec d := ofFullBlockVec q + let Y : BlockVec d := blockMatVecMul (ofFullBlockMat M) X + have hquad : fullBlockQuadratic M q = blockVecDot X Y := by + rw [← dotProduct_toFullBlockVec X Y] + simp [fullBlockQuadratic, X, Y, toFullBlockVec_blockMatVecMul] + have hcs := abs_blockVecDot_le_norm_mul_norm X Y + have hcs_sq := pow_le_pow_left₀ (abs_nonneg (blockVecDot X Y)) hcs 2 + have hY := fullBlockMat_mulVec_norm_sq_le_operatorNorm_sq M X + have hXX : blockVecDot X X = dotProduct q q := by + rw [← dotProduct_toFullBlockVec X X] + simp [X] + have hX_nonneg : 0 ≤ blockVecDot X X := by + rw [hXX] + exact dotProduct_self_nonneg q + have hnormX_sq : + ‖(WithLp.toLp 2 (toFullBlockVec X) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + blockVecDot X X := norm_sq_toFullBlockVec X + have hnormY_sq : + ‖(WithLp.toLp 2 (toFullBlockVec Y) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ ^ 2 = + blockVecDot Y Y := norm_sq_toFullBlockVec Y + calc + |fullBlockQuadratic M q| ^ (2 : ℕ) = |blockVecDot X Y| ^ (2 : ℕ) := by + rw [hquad] + _ ≤ (‖(WithLp.toLp 2 (toFullBlockVec X) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖ * + ‖(WithLp.toLp 2 (toFullBlockVec Y) : + PiLp 2 (fun _ : BlockCoord d => ℝ))‖) ^ (2 : ℕ) := hcs_sq + _ = (blockVecDot X X) * (blockVecDot Y Y) := by + rw [mul_pow, hnormX_sq, hnormY_sq] + _ ≤ (blockVecDot X X) * + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) * + blockVecDot X X) := + mul_le_mul_of_nonneg_left hY hX_nonneg + _ = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) * + (dotProduct q q) ^ (2 : ℕ) := by + rw [hXX] + ring + +/-- Quadratic forms are linear in the matrix argument. -/ +theorem fullBlockQuadratic_sub {d : ℕ} (M N : FullBlockMat d) + (q : FullBlockVec d) : + fullBlockQuadratic (M - N) q = + fullBlockQuadratic M q - fullBlockQuadratic N q := by + unfold fullBlockQuadratic + rw [Matrix.sub_mulVec, dotProduct_sub] + +private theorem dotProduct_diagonal_mulVec_left_eq_right + {ι : Type*} [Fintype ι] [DecidableEq ι] (r x y : ι → ℝ) : + dotProduct (Matrix.mulVec (Matrix.diagonal r) x) y = + dotProduct x (Matrix.mulVec (Matrix.diagonal r) y) := by + simp [dotProduct, Matrix.mulVec, Matrix.diagonal, mul_left_comm, mul_comm] + +/-- Diagonal normalization of a block quadratic form is the block quadratic +form evaluated on the diagonally normalized vector. -/ +theorem fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + {d : ℕ} (r : BlockCoord d → ℝ) (A : BlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) q = + blockVecDot (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q)) + (blockMatVecMul A (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q))) := by + unfold fullBlockQuadratic + rw [← Matrix.mulVec_mulVec q (Matrix.diagonal r * toFullBlockMat A) (Matrix.diagonal r)] + change dotProduct q + ((Matrix.diagonal r * toFullBlockMat A).mulVec ((Matrix.diagonal r).mulVec q)) = _ + rw [← Matrix.mulVec_mulVec ((Matrix.diagonal r).mulVec q) (Matrix.diagonal r) + (toFullBlockMat A)] + rw [← dotProduct_diagonal_mulVec_left_eq_right] + have hdot := dotProduct_toFullBlockVec + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q)) + (blockMatVecMul A (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q))) + rw [toFullBlockVec_ofFullBlockVec, toFullBlockVec_blockMatVecMul] at hdot + simpa using hdot + +private theorem diagonal_quadratic_le_mul_dotProduct + {ι : Type*} [Fintype ι] [DecidableEq ι] {r : ι → ℝ} {C : ℝ} (q : ι → ℝ) + (hr : ∀ α, r α ≤ C) : + dotProduct q (Matrix.mulVec (Matrix.diagonal r) q) ≤ C * dotProduct q q := by + classical + unfold dotProduct + simp [Matrix.mulVec, diagonal_dotProduct] + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro α _hα + have hsq : 0 ≤ q α * q α := by nlinarith [sq_nonneg (q α)] + have h := mul_le_mul_of_nonneg_right (hr α) hsq + nlinarith + +private theorem mul_dotProduct_le_diagonal_quadratic + {ι : Type*} [Fintype ι] [DecidableEq ι] {r : ι → ℝ} {C : ℝ} (q : ι → ℝ) + (hr : ∀ α, C ≤ r α) : + C * dotProduct q q ≤ dotProduct q (Matrix.mulVec (Matrix.diagonal r) q) := by + classical + unfold dotProduct + simp [Matrix.mulVec, diagonal_dotProduct] + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro α _hα + have hsq : 0 ≤ q α * q α := by nlinarith [sq_nonneg (q α)] + have h := mul_le_mul_of_nonneg_right (hr α) hsq + nlinarith + +/-- A diagonal full-block quadratic form is controlled above by the largest +diagonal coefficient. -/ +theorem fullBlockQuadratic_diagonal_le_mul_dotProduct + {d : ℕ} {r : BlockCoord d → ℝ} {C : ℝ} (q : FullBlockVec d) + (hr : ∀ α, r α ≤ C) : + fullBlockQuadratic (Matrix.diagonal r) q ≤ C * dotProduct q q := + diagonal_quadratic_le_mul_dotProduct q hr + +/-- A diagonal full-block quadratic form is controlled below by the smallest +diagonal coefficient. -/ +theorem mul_dotProduct_le_fullBlockQuadratic_diagonal + {d : ℕ} {r : BlockCoord d → ℝ} {C : ℝ} (q : FullBlockVec d) + (hr : ∀ α, C ≤ r α) : + C * dotProduct q q ≤ fullBlockQuadratic (Matrix.diagonal r) q := + mul_dotProduct_le_diagonal_quadratic q hr + +/-- Symmetry is preserved by diagonal congruence of a full-block matrix. -/ +theorem isSymm_diagonal_mul_fullBlockMat_mul_diagonal + {d : ℕ} (r : BlockCoord d → ℝ) {M : FullBlockMat d} + (hM : M.IsSymm) : + (Matrix.diagonal r * M * Matrix.diagonal r).IsSymm := by + rw [Matrix.IsSymm] + ext α β + simp [Matrix.transpose_apply, Matrix.mul_apply, Matrix.diagonal] + have h := hM.apply α β + rw [h] + ring + +/-- Scalar annealed full-block matrices remain diagonal after scalar +normalization. -/ +theorem normalizedScalarAnnealedBlockMatrix_eq_diagonal + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center n : ℤ) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let bn := hP.barSigmaAtScale hStruct n + let cn := hP.barSigmaStarAtScale hStruct n + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + D * toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct n) * D = + Matrix.diagonal (fun α : BlockCoord d => + match α with + | Sum.inl _ => (Real.sqrt b)⁻¹ * bn * (Real.sqrt b)⁻¹ + | Sum.inr _ => Real.sqrt c * cn⁻¹ * Real.sqrt c) := by + classical + dsimp only + ext α β + cases α with + | inl i => + cases β with + | inl j => + by_cases hij : i = j + · subst j + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal] + · simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal, hij] + | inr j => + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal] + | inr i => + cases β with + | inl j => + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal] + | inr j => + by_cases hij : i = j + · subst j + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal] + · simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, toFullBlockMat, + Ch04.scalarFullBlockInvSqrtDiag, Matrix.mul_apply, Matrix.diagonal, hij] + +/-- At the center scale, scalar normalization turns the scalar annealed block +into the identity. -/ +theorem normalizedScalarAnnealedBlockMatrix_self_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + D * toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ)) * D = + 1 := by + classical + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hdiag := normalizedScalarAnnealedBlockMatrix_eq_diagonal hP hStruct (m : ℤ) (m : ℤ) + dsimp only at hdiag + rw [hdiag] + ext α β + by_cases hαβ : α = β + · subst β + cases α with + | inl i => + simp [Matrix.diagonal] + field_simp [ne_of_gt (Real.sqrt_pos.mpr (by simpa [b] using hb))] + rw [Real.sq_sqrt (by simpa [b] using hb.le)] + | inr i => + simp [Matrix.diagonal] + field_simp [ne_of_gt (Real.sqrt_pos.mpr (by simpa [c] using hc))] + rw [Real.sq_sqrt (by simpa [c] using hc.le)] + field_simp [ne_of_gt (by simpa [c] using hc)] + · simp [Matrix.diagonal, hαβ] + +/-- Under the structural law, the annealed full block is exactly the scalar +block diagonal used to normalize the manuscript fluctuation observable. -/ +theorem annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (n : ℤ) : + Ch04.annealedBlockMatrixAtScale P n = + Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct n := by + rw [Ch04.scalarAnnealedBlockMatrixAtScale, Ch04.annealedBlockMatrixAtScale, + Ch04.annealedBlockMatrix, Ch02.blockDiag] + refine Eq.mpr (BlockMat.mk.injEq _ _ _ _ _ _ _ _) ?_ + constructor + · change Ch04.annealedBAtScale P n = hP.barSigmaAtScale hStruct n • 1 + rw [hP.annealedBAtScale_eq_barBAtScale hStruct n, + hP.barSigmaAtScale_eq_barBAtScale hStruct n] + constructor + · have hLowerLeft : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft = 0 := by + have h := + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct n).sigmaStarInvKappaMean_eq_zero + simpa [Ch04.annealedSigmaStarInvKappaMeanAtScale, + Ch04.annealedSigmaStarInvKappaMean] using congrArg Neg.neg h + have hSymm : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).upperRight = 0 := by + ext i j + have hEntry : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).upperRight i j = + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft j i := by + apply integral_congr_ae + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet (originCube d n)) a = + Ch02.coarseBlockMatrix (Ch02.cubeDomain (originCube d n)) + (F.coeffOn (originCube d n)) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha (originCube d n) + have hSymm := + Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain (originCube d n)) (F.coeffOn (originCube d n)) + have hentry := hSymm (Sum.inl i) (Sum.inr j) + simpa [hEq, blockMatEntry] using hentry + rw [hEntry, hLowerLeft] + simp + simpa [Ch04.annealedBlockMatrix] using hSymm + constructor + · have hLowerLeft : + (Ch04.annealedBlockMatrix P (cubeSet (originCube d n))).lowerLeft = 0 := by + have h := + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct n).sigmaStarInvKappaMean_eq_zero + simpa [Ch04.annealedSigmaStarInvKappaMeanAtScale, + Ch04.annealedSigmaStarInvKappaMean] using congrArg Neg.neg h + simpa [Ch04.annealedBlockMatrix] using hLowerLeft + · change Ch04.annealedSigmaStarInvAtScale P n = + (hP.barSigmaStarAtScale hStruct n)⁻¹ • 1 + rw [hP.annealedSigmaStarInvAtScale_eq_barSigmaStarInvAtScale hStruct n, + hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct n] + simp + +/-- The scalar annealed block matrix is symmetric as a doubled block matrix. -/ +theorem isSymmetricBlockMat_scalarAnnealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (center : ℤ) : + IsSymmetricBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + by_cases hij : i = j + · subst j + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry] + · have hji : j ≠ i := fun h => hij h.symm + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry, + hij, hji] + | inr j => + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry] + | inr i => + cases β with + | inl j => + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry] + | inr j => + by_cases hij : i = j + · subst j + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry] + · have hji : j ≠ i := fun h => hij h.symm + simp [Ch04.scalarAnnealedBlockMatrixAtScale, Ch02.blockDiag, blockMatEntry, + hij, hji] + +/-- At the center scale, scalar normalization turns the annealed block into +the identity. -/ +theorem normalizedAnnealedBlockMatrix_self_eq_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (m : ℤ)) * D = 1 := by + rw [annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ)] + exact normalizedScalarAnnealedBlockMatrix_self_eq_one hP hStruct hP4 m + +/-- The normalized full-block fluctuation observable is nonnegative. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (R : TriadicCube d) (a : RegCoeffField d) : + 0 ≤ + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a := by + unfold Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + unfold Ch04.fullBlockNormalizedFluctuationOperatorNormSq + exact sq_nonneg _ + +/-- The normalized full-block fluctuation matrix whose Euclidean operator norm +is squared in the manuscript observable. -/ +noncomputable def fullBlockNormalizedFluctuationMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (U : Set (Vec d)) (a : CoeffField d) : FullBlockMat d := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let A := coarseBlockMatrix U a + let Abar := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + D * (toFullBlockMat A - toFullBlockMat Abar) * D + +/-- The normalized full-block fluctuation matrix is symmetric whenever the +underlying coarse block matrix is symmetric. -/ +theorem fullBlockNormalizedFluctuationMatrix_isSymm_of_isSymmetricBlockMat + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) {U : Set (Vec d)} {a : CoeffField d} + (hA : IsSymmetricBlockMat (coarseBlockMatrix U a)) : + (fullBlockNormalizedFluctuationMatrix hP hStruct center U a).IsSymm := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let A := coarseBlockMatrix U a + let Abar := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + have hA_full : (toFullBlockMat A).IsSymm := by + simpa [A] using isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + have hAbar_full : (toFullBlockMat Abar).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat + (isSymmetricBlockMat_scalarAnnealedBlockMatrixAtScale hP hStruct center) + have hsub : (toFullBlockMat A - toFullBlockMat Abar).IsSymm := hA_full.sub hAbar_full + simpa [fullBlockNormalizedFluctuationMatrix, b, c, D, A, Abar] using + isSymm_diagonal_mul_fullBlockMat_mul_diagonal + (Ch04.scalarFullBlockInvSqrtDiag (d := d) b c) hsub + +/-- On cube sets, the public coarse block matrix is symmetric almost surely. -/ +theorem isSymmetricBlockMat_coarseBlockMatrix_cubeSet_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (Q : TriadicCube d) : + ∀ᵐ a ∂P, IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) + +/-- On cube sets, the normalized full-block fluctuation matrix is symmetric +almost surely. -/ +theorem fullBlockNormalizedFluctuationMatrix_isSymm_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) : + ∀ᵐ a ∂P, + (fullBlockNormalizedFluctuationMatrix hP hStruct center (cubeSet Q) a.toFun).IsSymm := by + filter_upwards [isSymmetricBlockMat_coarseBlockMatrix_cubeSet_ae hP Q] with a hA + exact fullBlockNormalizedFluctuationMatrix_isSymm_of_isSymmetricBlockMat + hP hStruct center hA + +/-- The Ch4 normalized fluctuation observable is the squared operator norm of +`fullBlockNormalizedFluctuationMatrix`. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (U : Set (Vec d)) (a : CoeffField d) : + Ch04.fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center U a = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (fullBlockNormalizedFluctuationMatrix hP hStruct center U a)‖ ^ (2 : ℕ) := by + rfl + +/-- Normalized quadratic probe observable used before the finite-probe upgrade +in the good-scale variance bound. This is linear in the coarse block matrix; +centering is supplied by `Ch04.restrictionCenteredOriginObservable`. -/ +noncomputable def fullBlockNormalizedQuadraticObservable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (U : Set (Vec d)) + (a : CoeffField d) : ℝ := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + fullBlockQuadratic (D * toFullBlockMat (coarseBlockMatrix U a) * D) q + +/-- Carrier realization of the normalized quadratic probe observable, applied +to the honest sample of a carrier field. This is the form consumed by the +Ch4 descendant-average machinery. -/ +noncomputable def fullBlockNormalizedQuadraticObservableR + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (U : Set (Vec d)) + (a : RegCoeffField d) : ℝ := + fullBlockNormalizedQuadraticObservable hP hStruct center q U a.toFun + +/-- Centering a normalized quadratic probe at the center-scale annealed value +is the quadratic form of the normalized fluctuation matrix. -/ +theorem fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) + (q : FullBlockVec d) (U : Set (Vec d)) (a : CoeffField d) : + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q U a - + dotProduct q q = + fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) U a) q := by + classical + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let A := coarseBlockMatrix U a + let Abar := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ) + have hcenter : D * toFullBlockMat Abar * D = 1 := by + simpa [D, Abar, b, c] using + normalizedScalarAnnealedBlockMatrix_self_eq_one hP hStruct hP4 m + have hmat : D * toFullBlockMat A * D - 1 = + D * (toFullBlockMat A - toFullBlockMat Abar) * D := by + rw [← hcenter] + ext α β + simp [Matrix.mul_apply, Finset.sum_sub_distrib, sub_mul, mul_sub] + calc + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q U a - dotProduct q q + = fullBlockQuadratic (D * toFullBlockMat A * D) q - fullBlockQuadratic 1 q := by + rw [fullBlockQuadratic_one] + simp [fullBlockNormalizedQuadraticObservable, D, A, b, c] + _ = fullBlockQuadratic (D * toFullBlockMat A * D - 1) q := by + rw [fullBlockQuadratic_sub] + _ = fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) U a) q := by + rw [hmat] + rfl + +private theorem blockPosDef_quadratic_nonneg + {d : ℕ} {A : BlockMat d} (hA : Ch02.BlockPosDef A) (X : BlockVec d) : + 0 ≤ blockVecDot X (blockMatVecMul A X) := by + by_cases hX : X = 0 + · subst X + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul] + · exact (hA X hX).le + +/-- Normalized quadratic probes are nonnegative on cube sets, almost surely. -/ +theorem fullBlockNormalizedQuadraticObservable_nonneg_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) : + ∀ᵐ a ∂P, + 0 ≤ fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let X : BlockVec d := ofFullBlockVec (Matrix.mulVec D q) + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hPos : Ch02.BlockPosDef (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) (F.coeffOn Q)).block_matrix_posDef + have hobs : + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun = + blockVecDot X (blockMatVecMul (coarseBlockMatrix (cubeSet Q) a.toFun) X) := by + dsimp [fullBlockNormalizedQuadraticObservable, fullBlockQuadratic, b, c, D, X] + simpa [D] using! + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Ch04.scalarFullBlockInvSqrtDiag (d := d) b c) + (coarseBlockMatrix (cubeSet Q) a.toFun) q + rw [hobs] + exact blockPosDef_quadratic_nonneg hPos X + +/-- Translation covariance of the normalized quadratic probe observable. -/ +theorem fullBlockNormalizedQuadraticObservable_translation_covariant + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) : + IsTranslationCovariant + (fun U : Set (Vec d) => fun a : CoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q U a) := by + intro U z a + simp [fullBlockNormalizedQuadraticObservable, translateByInt, + coarseBlockMatrix_translateSet_eq_translateCoeffField] + +/-- `(P4)` supplies integrability of the normalized full-block fluctuation on +origin cubes. -/ +theorem integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center : ℤ) (n : ℕ) : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d (n : ℤ))) P := + Section52.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_originCube_from_P4 + hP hStruct hP4 center n + +/-- Integer-scale version of the origin-cube integrability consequence of +`(P4)`. -/ +theorem integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center n : ℤ) + (hn : 0 ≤ n) : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P := by + have hnat := + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + hP hStruct hP4 center (Int.toNat n) + simpa [Int.toNat_of_nonneg hn] using hnat + +/-- Under `(P4)` and stationarity, the normalized full-block fluctuation is +integrable on every nonnegative-scale cube. -/ +theorem integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg_scale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center : ℤ) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R) P := by + have hOrigin : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale)) P := + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg + hP hStruct hP4 center R.scale hR_nonneg + exact + hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_stationary + hStruct.stationary hStruct center R hR_nonneg hOrigin + +/-- Stationarity identifies the expectation on a nonnegative-scale cube with +the corresponding origin-cube expectation, with integrability supplied by +`(P4)`. -/ +theorem integral_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center : ℤ) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a ∂P = + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale) a ∂P := by + have hOrigin : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d R.scale)) P := + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg + hP hStruct hP4 center R.scale hR_nonneg + exact + hP.integral_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hStruct.stationary hStruct center R hR_nonneg hOrigin + +/-- `(P4)` supplies the integrability hypothesis needed for descendant +averages of the normalized full-block fluctuation observable. -/ +theorem integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendants_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} (hR : R ∈ descendantsAtScale (originCube d m) n) : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R) P := by + have hOrigin : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P := + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg + hP hStruct hP4 center n hn + exact + hP.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_of_mem_descendantsAtScale_originCube + hStruct.stationary hStruct center hn hnm hR hOrigin + +/-- Expectation of a descendant average of normalized full-block fluctuations +collapses to the corresponding origin-cube expectation under stationarity, with +integrability supplied by `(P4)`. -/ +theorem integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (center : ℤ) + {n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) : + ∫ a, + descendantsAverage (originCube d m) (Int.toNat (m - n)) + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center R a) ∂P = + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n) a ∂P := by + have hOrigin : + Integrable + (Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center (originCube d n)) P := + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg + hP hStruct hP4 center n hn + exact + hP.integral_descendantsAverage_fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_originCube_of_stationary + hStruct.stationary hStruct center hn hnm hOrigin + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/PartitionAverage.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/PartitionAverage.lean new file mode 100644 index 0000000000..82179d9514 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/PartitionAverage.lean @@ -0,0 +1,946 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet +public import Mathlib.LinearAlgebra.Matrix.Bilinear + +/-! # Partition Average -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory + +noncomputable section + +/-! +# Local-representative bridge for partition averages + +This file builds the Section 5.4-local bridge needed to feed the normalized +full-block fluctuation observable into the Chapter 4 partition-average +theorems. The bridge is internal to the variance-bound slice: it proves the +locality/measurability facts from existing Ch4 entrywise local representatives, +without adding proof objects to the public Section 5.4 theorem. +-/ + +private theorem isLocalRandomVariable_fullBlockMat_of_entries + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + {X : RegCoeffField d → FullBlockMat d} + (hX : + ∀ α β : BlockCoord d, + Ch04.IsRestrictionLocalRandomVariable U hU (fun a => X a α β)) : + Ch04.IsRestrictionLocalRandomVariable U hU X := by + change @Measurable (RegCoeffField d) (FullBlockMat d) (Ch04.restrictionSigma U hU) _ X + refine (@measurable_pi_iff (RegCoeffField d) (BlockCoord d) + (fun _ => BlockCoord d → ℝ) (Ch04.restrictionSigma U hU) (fun _ => inferInstance) X).2 ?_ + intro α + refine (@measurable_pi_iff (RegCoeffField d) (BlockCoord d) + (fun _ => ℝ) (Ch04.restrictionSigma U hU) (fun _ => inferInstance) (fun a => X a α)).2 ?_ + intro β + exact hX α β + +private def normalizedFullBlockCLMLinearMap {d : ℕ} [NeZero d] + (D : FullBlockMat d) : + FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (BlockCoord d) →L[ℝ] EuclideanSpace ℝ (BlockCoord d)) := + let left : FullBlockMat d →ₗ[ℝ] FullBlockMat d := + mulLeftLinearMap (BlockCoord d) ℝ D + let right : FullBlockMat d →ₗ[ℝ] FullBlockMat d := + mulRightLinearMap (BlockCoord d) ℝ D + let sandwich : FullBlockMat d →ₗ[ℝ] FullBlockMat d := right.comp left + let toCLM : + FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (BlockCoord d) →L[ℝ] EuclideanSpace ℝ (BlockCoord d)) := + LinearEquiv.toLinearMap + (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + |>.toAlgEquiv |>.toLinearEquiv) + toCLM.comp sandwich + +private theorem normalizedFullBlockCLMLinearMap_apply {d : ℕ} [NeZero d] + (D M : FullBlockMat d) : + normalizedFullBlockCLMLinearMap D M = + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (D * M * D) := by + rfl + +private theorem measurable_normalizedFullBlockFluctuationMap {d : ℕ} [NeZero d] + (D Abar : FullBlockMat d) : + Measurable + (fun M : FullBlockMat d => + ‖normalizedFullBlockCLMLinearMap D (M - Abar)‖ ^ 2) := by + have hcont : + Continuous + (fun M : FullBlockMat d => + normalizedFullBlockCLMLinearMap D (M - Abar)) := + (normalizedFullBlockCLMLinearMap D).continuous_of_finiteDimensional.comp + (continuous_id.sub continuous_const) + exact ((continuous_norm.comp hcont).pow 2).measurable + +private def normalizedFullBlockMatLinearMap {d : ℕ} + (D : FullBlockMat d) : FullBlockMat d →ₗ[ℝ] FullBlockMat d := + let left : FullBlockMat d →ₗ[ℝ] FullBlockMat d := + mulLeftLinearMap (BlockCoord d) ℝ D + let right : FullBlockMat d →ₗ[ℝ] FullBlockMat d := + mulRightLinearMap (BlockCoord d) ℝ D + right.comp left + +private theorem normalizedFullBlockMatLinearMap_apply {d : ℕ} + (D M : FullBlockMat d) : + normalizedFullBlockMatLinearMap D M = D * M * D := by + rfl + +private theorem measurable_normalizedFullBlockQuadraticMap {d : ℕ} + [NeZero d] (D : FullBlockMat d) (q : FullBlockVec d) : + Measurable + (fun M : FullBlockMat d => fullBlockQuadratic (D * M * D) q) := by + have hcont : + Continuous + (fun M : FullBlockMat d => + fullBlockQuadratic (normalizedFullBlockMatLinearMap D M) q) := by + unfold fullBlockQuadratic + fun_prop + simpa [normalizedFullBlockMatLinearMap_apply] using hcont.measurable + +theorem section54_annealedMomentRoot_abs_le_of_ae_abs_le_nonneg + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (_hY_nonneg : ∀ a, 0 ≤ Y a) + (hXY : (fun a => |X a|) ≤ᵐ[P] Y) + (hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P) + (hY_pow_int : Integrable (fun a => Y a ^ ξ) P) : + Ch04.annealedMomentRoot P ξ (fun a => |X a|) ≤ + Ch04.annealedMomentRoot P ξ Y := by + have hpow : + (fun a => |X a| ^ ξ) ≤ᵐ[P] fun a => Y a ^ ξ := by + filter_upwards [hXY] with a hle + exact pow_le_pow_left₀ (abs_nonneg (X a)) hle ξ + have hint_le : + ∫ a, |X a| ^ ξ ∂P ≤ ∫ a, Y a ^ ξ ∂P := + integral_mono_ae hX_abs_pow_int hY_pow_int hpow + have hleft_nonneg : 0 ≤ ∫ a, |X a| ^ ξ ∂P := + integral_nonneg fun a => pow_nonneg (abs_nonneg (X a)) ξ + have hexp_nonneg : 0 ≤ 1 / (ξ : ℝ) := by positivity + simpa [Ch04.annealedMomentRoot] using + Real.rpow_le_rpow hleft_nonneg hint_le hexp_nonneg + +theorem section54_integrable_abs_pow_of_ae_abs_le_nonneg + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {ξ : ℕ} + {X Y : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hY_nonneg : ∀ᵐ a ∂P, 0 ≤ Y a) + (hXY : (fun a => |X a|) ≤ᵐ[P] Y) + (hY_pow_int : Integrable (fun a => Y a ^ ξ) P) : + Integrable (fun a => |X a| ^ ξ) P := by + have hY_abs_pow_int : Integrable (fun a => |Y a| ^ ξ) P := by + refine hY_pow_int.congr ?_ + filter_upwards [hY_nonneg] with a ha + simp [abs_of_nonneg ha] + refine Integrable.mono' hY_abs_pow_int ?_ ?_ + · exact ((hX_meas.norm.pow_const ξ)).aestronglyMeasurable + · filter_upwards [hY_nonneg, hXY] with a hY_nonneg_a hXY_a + have hpow : |X a| ^ ξ ≤ |Y a| ^ ξ := by + simpa [abs_of_nonneg hY_nonneg_a] using + pow_le_pow_left₀ (abs_nonneg (X a)) hXY_a ξ + have hleft_nonneg : 0 ≤ |X a| ^ ξ := + pow_nonneg (abs_nonneg (X a)) ξ + have hright_nonneg : 0 ≤ |Y a| ^ ξ := + pow_nonneg (abs_nonneg (Y a)) ξ + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, + abs_of_nonneg hright_nonneg] using hpow + +theorem section54_annealedMomentRoot_abs_sub_integral_le_two_mul + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) (hX_meas : AEMeasurable X P) + (hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P) : + Ch04.annealedMomentRoot P ξ + (fun a => |X a - ∫ b, X b ∂P|) ≤ + 2 * Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + have hξ_ne : ξ ≠ 0 := by omega + have hmem_p : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_pow_int + have hmem_one : MemLp X (1 : ENNReal) P := + hmem_p.mono_exponent (by exact_mod_cast hξ) + have hX_int : Integrable X P := by + rwa [MeasureTheory.memLp_one_iff_integrable] at hmem_one + let c : ℝ := ∫ b, X b ∂P + have hconst_mem : MemLp (fun _ : RegCoeffField d => c) (ξ : ENNReal) P := + memLp_const c + have hcenter_mem : MemLp (fun a => X a - c) (ξ : ENNReal) P := + hmem_p.sub hconst_mem + have hcenter_toReal : + ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) = + Ch04.annealedMomentRoot P ξ (fun a => |X a - c|) := by + calc + ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) + = (∫ a, ‖X a - c‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := fun a => X a - c) (p := ξ) hξ hcenter_mem + _ = Ch04.annealedMomentRoot P ξ (fun a => |X a - c|) := by + simp [Ch04.annealedMomentRoot, Real.norm_eq_abs] + have hX_toReal : + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) = + Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + calc + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) + = (∫ a, ‖X a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := X) (p := ξ) hξ hmem_p + _ = Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + simp [Ch04.annealedMomentRoot, Real.norm_eq_abs] + have hroot_abs_nonneg : + 0 ≤ Ch04.annealedMomentRoot P ξ (fun a => |X a|) := + Ch04.annealedMomentRoot_nonneg_of_nonneg P ξ fun a => abs_nonneg (X a) + have hmean_le : + |c| ≤ Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + have hAbs_meas : AEMeasurable (fun a => |X a|) P := by + simpa [Real.norm_eq_abs] using hX_meas.norm + have hAbs_int : Integrable (fun a => |X a|) P := by + have hAbs_mem_one : MemLp (fun a => |X a|) (1 : ENNReal) P := by + have hAbs_mem_p : MemLp (fun a => |X a|) (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hAbs_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs, abs_abs] using hX_abs_pow_int + exact hAbs_mem_p.mono_exponent (by exact_mod_cast hξ) + rwa [MeasureTheory.memLp_one_iff_integrable] at hAbs_mem_one + have hInt_le_root : + ∫ a, |X a| ∂P ≤ + Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + exact Ch04.integral_le_annealedMomentRoot_of_ae_nonneg hξ hAbs_meas + (Filter.Eventually.of_forall fun a => abs_nonneg (X a)) + (by simpa using hX_abs_pow_int) + exact (abs_integral_le_integral_abs (f := X) (μ := P)).trans hInt_le_root + have hconst_toReal : + ENNReal.toReal (eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P) = |c| := by + have hμ_ne_zero : (P : Measure (RegCoeffField d)) ≠ 0 := + IsProbabilityMeasure.ne_zero P + have hξ_enn_ne_zero : (ξ : ENNReal) ≠ 0 := by exact_mod_cast hξ_ne + rw [MeasureTheory.eLpNorm_const (μ := P) (c := c) (p := (ξ : ENNReal)) + hξ_enn_ne_zero hμ_ne_zero] + simp [IsProbabilityMeasure.measure_univ, Real.norm_eq_abs] + have hconst_ne_top : + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P ≠ ⊤ := + hconst_mem.2.ne + have hsum_ne_top : + eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P ≠ ⊤ := + ENNReal.add_ne_top.mpr ⟨hmem_p.2.ne, hconst_ne_top⟩ + have hsub_le : + eLpNorm (fun a => X a - c) (ξ : ENNReal) P ≤ + eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P := by + simpa only [c, Pi.sub_def, Pi.sub_apply] using + eLpNorm_sub_le hX_meas.aestronglyMeasurable + (aestronglyMeasurable_const (μ := P) (b := c)) + (by exact_mod_cast hξ) + calc + Ch04.annealedMomentRoot P ξ (fun a => |X a - ∫ b, X b ∂P|) + = ENNReal.toReal (eLpNorm (fun a => X a - c) (ξ : ENNReal) P) := by + simp [hcenter_toReal, c] + _ ≤ ENNReal.toReal + (eLpNorm X (ξ : ENNReal) P + + eLpNorm (fun _ : RegCoeffField d => c) (ξ : ENNReal) P) := + ENNReal.toReal_mono hsum_ne_top hsub_le + _ = Ch04.annealedMomentRoot P ξ (fun a => |X a|) + |c| := by + rw [ENNReal.toReal_add hmem_p.2.ne hconst_ne_top, + hX_toReal, hconst_toReal] + _ ≤ Ch04.annealedMomentRoot P ξ (fun a => |X a|) + + Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by + gcongr + _ = 2 * Ch04.annealedMomentRoot P ξ (fun a => |X a|) := by ring + +theorem section54_annealedMomentRoot_add_le + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X Y : RegCoeffField d → ℝ} + (hξ : 1 ≤ ξ) + (hX_nonneg : ∀ a, 0 ≤ X a) (hY_nonneg : ∀ a, 0 ≤ Y a) + (hX_meas : AEMeasurable X P) (hY_meas : AEMeasurable Y P) + (hX_int : Integrable (fun a => X a ^ ξ) P) + (hY_int : Integrable (fun a => Y a ^ ξ) P) : + Ch04.annealedMomentRoot P ξ (fun a => X a + Y a) ≤ + Ch04.annealedMomentRoot P ξ X + Ch04.annealedMomentRoot P ξ Y := by + have hξ_ne : ξ ≠ 0 := by omega + have hX_abs_int : Integrable (fun a => |X a| ^ ξ) P := by + refine hX_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hX_nonneg a)] + have hY_abs_int : Integrable (fun a => |Y a| ^ ξ) P := by + refine hY_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hY_nonneg a)] + have hX_mem : MemLp X (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_int + have hY_mem : MemLp Y (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hY_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hY_abs_int + have hsum_mem : MemLp (fun a => X a + Y a) (ξ : ENNReal) P := + hX_mem.add hY_mem + have hsum_toReal : + ENNReal.toReal (eLpNorm (fun a => X a + Y a) (ξ : ENNReal) P) = + Ch04.annealedMomentRoot P ξ (fun a => X a + Y a) := by + calc + ENNReal.toReal (eLpNorm (fun a => X a + Y a) (ξ : ENNReal) P) + = (∫ a, ‖X a + Y a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := fun a => X a + Y a) (p := ξ) hξ hsum_mem + _ = Ch04.annealedMomentRoot P ξ (fun a => X a + Y a) := by + rw [Ch04.annealedMomentRoot] + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [Real.norm_eq_abs, abs_of_nonneg + (add_nonneg (hX_nonneg a) (hY_nonneg a))]) + have hX_toReal : + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) = + Ch04.annealedMomentRoot P ξ X := by + calc + ENNReal.toReal (eLpNorm X (ξ : ENNReal) P) + = (∫ a, ‖X a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := X) (p := ξ) hξ hX_mem + _ = Ch04.annealedMomentRoot P ξ X := by + rw [Ch04.annealedMomentRoot] + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [Real.norm_eq_abs, abs_of_nonneg (hX_nonneg a)]) + have hY_toReal : + ENNReal.toReal (eLpNorm Y (ξ : ENNReal) P) = + Ch04.annealedMomentRoot P ξ Y := by + calc + ENNReal.toReal (eLpNorm Y (ξ : ENNReal) P) + = (∫ a, ‖Y a‖ ^ ξ ∂P) ^ (1 / (ξ : ℝ)) := by + exact Ch04.toReal_eLpNorm_eq_integral_norm_pow_rpow_inv + (μ := P) (f := Y) (p := ξ) hξ hY_mem + _ = Ch04.annealedMomentRoot P ξ Y := by + rw [Ch04.annealedMomentRoot] + congr 1 + exact integral_congr_ae (Filter.Eventually.of_forall fun a => by + simp [Real.norm_eq_abs, abs_of_nonneg (hY_nonneg a)]) + have hsum_ne_top : + eLpNorm X (ξ : ENNReal) P + eLpNorm Y (ξ : ENNReal) P ≠ ⊤ := + ENNReal.add_ne_top.mpr ⟨hX_mem.2.ne, hY_mem.2.ne⟩ + have hadd : + eLpNorm (fun a => X a + Y a) (ξ : ENNReal) P ≤ + eLpNorm X (ξ : ENNReal) P + eLpNorm Y (ξ : ENNReal) P := by + simpa only [Pi.add_def, Pi.add_apply] using + (MeasureTheory.eLpNorm_add_le + hX_meas.aestronglyMeasurable hY_meas.aestronglyMeasurable + (by exact_mod_cast hξ)) + calc + Ch04.annealedMomentRoot P ξ (fun a => X a + Y a) + = ENNReal.toReal (eLpNorm (fun a => X a + Y a) (ξ : ENNReal) P) := + hsum_toReal.symm + _ ≤ ENNReal.toReal (eLpNorm X (ξ : ENNReal) P + eLpNorm Y (ξ : ENNReal) P) := + ENNReal.toReal_mono hsum_ne_top hadd + _ = Ch04.annealedMomentRoot P ξ X + Ch04.annealedMomentRoot P ξ Y := by + rw [ENNReal.toReal_add hX_mem.2.ne hY_mem.2.ne, hX_toReal, hY_toReal] + +theorem section54_centeredOrigin_momentRoot_le_factor_sum_of_abs_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C : ℝ} (hC_nonneg : 0 ≤ C) {X : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hX_abs_le : + (fun a => |X a|) ≤ᵐ[P] + fun a => + C * + (Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹)) : + Integrable (fun a => |X a - ∫ b, X b ∂P| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => |X a - ∫ b, X b ∂P|) ≤ + 2 * C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + let : IsProbabilityMeasure P := hP.isProbability + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + let I : RegCoeffField d → ℝ := + fun a => + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + let Y : RegCoeffField d → ℝ := fun a => C * (L a + I a) + have hξ_one : 1 ≤ hP4.xi := + le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + have hY_nonneg : ∀ a, 0 ≤ Y a := fun a => + mul_nonneg hC_nonneg (add_nonneg (hL_nonneg a) (hI_nonneg a)) + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hP4.sUpper_pos + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hP4.sLower_pos + have hL_int : Integrable (fun a => L a ^ hP4.xi) P := by + simpa [L] using + Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hI_int : Integrable (fun a => I a ^ hP4.xi) P := by + simpa [I] using + Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hξ_ne : hP4.xi ≠ 0 := + Nat.ne_of_gt (lt_of_lt_of_le (by norm_num : 0 < 2) hP4.two_le_xi) + have hL_mem : MemLp L (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hL_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + have hL_abs_int : Integrable (fun a => |L a| ^ hP4.xi) P := by + refine hL_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hL_nonneg a)] + simpa [Real.norm_eq_abs] using hL_abs_int + have hI_mem : MemLp I (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hI_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + have hI_abs_int : Integrable (fun a => |I a| ^ hP4.xi) P := by + refine hI_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hI_nonneg a)] + simpa [Real.norm_eq_abs] using hI_abs_int + have hsum_mem : MemLp (fun a => L a + I a) (hP4.xi : ENNReal) P := + hL_mem.add hI_mem + have hsum_int : Integrable (fun a => (L a + I a) ^ hP4.xi) P := by + have hint := hsum_mem.integrable_norm_pow (by exact hξ_ne) + refine hint.congr ?_ + filter_upwards with a + simp [Real.norm_eq_abs, abs_of_nonneg + (add_nonneg (hL_nonneg a) (hI_nonneg a))] + have hY_int : Integrable (fun a => Y a ^ hP4.xi) P := by + have hscaled := hsum_int.const_mul (C ^ hP4.xi) + refine hscaled.congr ?_ + filter_upwards with a + simp [Y, mul_pow] + have hX_abs_pow_int : + Integrable (fun a => |X a| ^ hP4.xi) P := + section54_integrable_abs_pow_of_ae_abs_le_nonneg + hX_meas (Filter.Eventually.of_forall hY_nonneg) + (by simpa [Y] using hX_abs_le) hY_int + have hcenter_mem : MemLp (fun a => X a - ∫ b, X b ∂P) (hP4.xi : ENNReal) P := by + have hmem_p : MemLp X (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_pow_int + exact hmem_p.sub (memLp_const (∫ b, X b ∂P)) + have hcenter_int : + Integrable (fun a => |X a - ∫ b, X b ∂P| ^ hP4.xi) P := by + have hint := hcenter_mem.integrable_norm_pow (by exact hξ_ne) + simpa [Real.norm_eq_abs] using hint + refine ⟨hcenter_int, ?_⟩ + have hcenter_root := + section54_annealedMomentRoot_abs_sub_integral_le_two_mul + (P := P) (ξ := hP4.xi) (X := X) hξ_one hX_meas hX_abs_pow_int + have hraw_root : + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) ≤ + C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + have hraw_to_Y : + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) ≤ + Ch04.annealedMomentRoot P hP4.xi Y := + section54_annealedMomentRoot_abs_le_of_ae_abs_le_nonneg + (P := P) (ξ := hP4.xi) (X := X) (Y := Y) + hξ_one hY_nonneg (by simpa [Y] using hX_abs_le) + hX_abs_pow_int hY_int + have hY_eq : + Ch04.annealedMomentRoot P hP4.xi Y = + C * Ch04.annealedMomentRoot P hP4.xi (fun a => L a + I a) := by + simpa [Y] using + Section52.section52_annealedMomentRoot_const_mul_of_nonneg + (P := P) (ξ := hP4.xi) (c := C) (X := fun a => L a + I a) + hξ_one hC_nonneg + (fun a => add_nonneg (hL_nonneg a) (hI_nonneg a)) + have hsum_root : + Ch04.annealedMomentRoot P hP4.xi (fun a => L a + I a) ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + simpa [L, I, Ch04.LambdaMomentAtScale, Ch04.lambdaInvMomentAtScale] using + section54_annealedMomentRoot_add_le + (P := P) (ξ := hP4.xi) (X := L) (Y := I) + hξ_one hL_nonneg hI_nonneg hL_meas hI_meas hL_int hI_int + calc + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) + ≤ Ch04.annealedMomentRoot P hP4.xi Y := hraw_to_Y + _ = C * Ch04.annealedMomentRoot P hP4.xi (fun a => L a + I a) := hY_eq + _ ≤ C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := + mul_le_mul_of_nonneg_left hsum_root hC_nonneg + calc + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a - ∫ b, X b ∂P|) + ≤ 2 * Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) := hcenter_root + _ ≤ 2 * (C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) := by + exact mul_le_mul_of_nonneg_left hraw_root (by norm_num) + _ = 2 * C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by ring + +private theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperRight_apply_cubeSet + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j) + =ᵐ[P] Y := by + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((Pi.single i 1, 0) + (0, Pi.single j 1)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single i 1, 0) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single j 1) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).upperRight i j = + Mu (cubeSet Q) ((Pi.single i 1, 0) + (0, Pi.single j 1)) a - + Mu (cubeSet Q) (Pi.single i 1, 0) a - + Mu (cubeSet Q) (0, Pi.single j 1) a := by + simp [coarseBlockMatrix_upperRight_apply] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +private theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerLeft_apply_cubeSet + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (Q : TriadicCube d) (i j : Fin d) : + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j) + =ᵐ[P] Y := by + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q ((0, Pi.single i 1) + (Pi.single j 1, 0)) with + ⟨Ysum, hYsum_local, hYsum_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (0, Pi.single i 1) with ⟨Yi, hYi_local, hYi_eq⟩ + rcases hP.exists_isRestrictionLocalRandomVariable_ae_eq_Mu_cubeSet + Q (Pi.single j 1, 0) with ⟨Yj, hYj_local, hYj_eq⟩ + refine ⟨fun a => Ysum a - Yi a - Yj a, + (hYsum_local.sub hYi_local).sub hYj_local, ?_⟩ + filter_upwards [hYsum_eq, hYi_eq, hYj_eq] with a hsum hi hj + calc + (coarseBlockMatrix (cubeSet Q) a.toFun).lowerLeft i j = + Mu (cubeSet Q) ((0, Pi.single i 1) + (Pi.single j 1, 0)) a - + Mu (cubeSet Q) (0, Pi.single i 1) a - + Mu (cubeSet Q) (Pi.single j 1, 0) a := by + simp [coarseBlockMatrix_lowerLeft_apply] + _ = Ysum a - Yi a - Yj a := by rw [hsum, hi, hj] + +private theorem exists_isRestrictionLocalRandomVariable_ae_eq_coarseFullBlockMatrix_cubeSet + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (Q : TriadicCube d) : + ∃ Y : RegCoeffField d → FullBlockMat d, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + =ᵐ[P] Y := by + classical + let entry_exists : ∀ α β : BlockCoord d, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β) =ᵐ[P] Y := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [toFullBlockMat] using + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperLeft_apply_cubeSet Q i j + | inr j => + simpa [toFullBlockMat] using + exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_upperRight_apply_cubeSet + hP Q i j + | inr i => + cases β with + | inl j => + simpa [toFullBlockMat] using + exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerLeft_apply_cubeSet + hP Q i j + | inr j => + simpa [toFullBlockMat] using + hP.exists_isRestrictionLocalRandomVariable_ae_eq_coarseBlockMatrix_lowerRight_apply_cubeSet Q i j + let Yentry : BlockCoord d → BlockCoord d → RegCoeffField d → ℝ := + fun α β => Classical.choose (entry_exists α β) + let Y : RegCoeffField d → FullBlockMat d := fun a α β => Yentry α β a + refine ⟨Y, ?_, ?_⟩ + · refine isLocalRandomVariable_fullBlockMat_of_entries (measurableSet_cubeSet Q) ?_ + intro α β + exact (Classical.choose_spec (entry_exists α β)).1 + · have hentry : + ∀ α β : BlockCoord d, + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β) =ᵐ[P] + fun a => Y a α β := by + intro α β + exact (Classical.choose_spec (entry_exists α β)).2 + have hall : + ∀ᵐ a ∂P, + ∀ α β : BlockCoord d, + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) α β = Y a α β := by + rw [Filter.eventually_all] + intro α + rw [Filter.eventually_all] + intro β + exact hentry α β + filter_upwards [hall] with a ha + ext α β + exact ha α β + +private theorem aemeasurable_fullBlockNormalizedFluctuationOperatorNormSq_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center (cubeSet Q) a.toFun) P := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let Abar : BlockMat d := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + let g : FullBlockMat d → ℝ := + fun M => ‖normalizedFullBlockCLMLinearMap D (M - toFullBlockMat Abar)‖ ^ 2 + have hg : Measurable g := + measurable_normalizedFullBlockFluctuationMap D (toFullBlockMat Abar) + have hM : + AEMeasurable + (fun a : RegCoeffField d => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P := + hP.aemeasurable_coarseFullBlockMatrix_cubeSet Q + simpa only [Ch04.fullBlockNormalizedFluctuationOperatorNormSq, b, c, D, Abar, g, + normalizedFullBlockCLMLinearMap_apply, Function.comp_def] using + hg.comp_aemeasurable hM + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedFluctuationOperatorNormSq_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) : + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center (cubeSet Q) a.toFun) =ᵐ[P] Y := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let Abar : BlockMat d := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + let g : FullBlockMat d → ℝ := + fun M => ‖normalizedFullBlockCLMLinearMap D (M - toFullBlockMat Abar)‖ ^ 2 + have hg : Measurable g := + measurable_normalizedFullBlockFluctuationMap D (toFullBlockMat Abar) + rcases exists_isRestrictionLocalRandomVariable_ae_eq_coarseFullBlockMatrix_cubeSet + hP Q with ⟨Ymat, hYmat_local, hYmat_eq⟩ + refine ⟨fun a => g (Ymat a), hYmat_local.comp_measurable hg, ?_⟩ + filter_upwards [hYmat_eq] with a ha + simp [Ch04.fullBlockNormalizedFluctuationOperatorNormSq, b, c, D, Abar, g, + normalizedFullBlockCLMLinearMap_apply, ha] + +private theorem aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable + hP hStruct center q (cubeSet Q) a.toFun) P := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let g : FullBlockMat d → ℝ := + fun M => fullBlockQuadratic (D * M * D) q + have hg : Measurable g := + measurable_normalizedFullBlockQuadraticMap D q + have hM : + AEMeasurable + (fun a : RegCoeffField d => toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P := + hP.aemeasurable_coarseFullBlockMatrix_cubeSet Q + simpa only [fullBlockNormalizedQuadraticObservable, b, c, D, g, + Function.comp_def] using + hg.comp_aemeasurable hM + +theorem exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) : + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet Q) (measurableSet_cubeSet Q) Y ∧ + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable + hP hStruct center q (cubeSet Q) a.toFun) =ᵐ[P] Y := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let g : FullBlockMat d → ℝ := + fun M => fullBlockQuadratic (D * M * D) q + have hg : Measurable g := + measurable_normalizedFullBlockQuadraticMap D q + rcases exists_isRestrictionLocalRandomVariable_ae_eq_coarseFullBlockMatrix_cubeSet + hP Q with ⟨Ymat, hYmat_local, hYmat_eq⟩ + refine ⟨fun a => g (Ymat a), hYmat_local.comp_measurable hg, ?_⟩ + filter_upwards [hYmat_eq] with a ha + simp [fullBlockNormalizedQuadraticObservable, b, c, D, g, ha] + +/-- Descendant-family local representatives for the normalized full-block +fluctuation observable. This is the local-representative hypothesis needed by +the a.e.-local Ch4 partition-average theorem. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSq_descendants_localRep + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center (cubeSet R) a.toFun) =ᵐ[P] Y := by + intro R _hR + exact + exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedFluctuationOperatorNormSq_cubeSet + hP hStruct center R + +/-- Descendant-family a.e.-measurability for the normalized full-block +fluctuation observable. -/ +private theorem aemeasurable_fullBlockNormalizedFluctuationOperatorNormSq_descendants + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + AEMeasurable + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center (cubeSet R) a.toFun) P := by + intro R _hR + exact + aemeasurable_fullBlockNormalizedFluctuationOperatorNormSq_cubeSet + hP hStruct center R + +/-- Descendant-family local representatives for normalized quadratic probes. -/ +theorem fullBlockNormalizedQuadraticObservable_descendants_localRep + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable + hP hStruct center q (cubeSet R) a.toFun) =ᵐ[P] Y := by + intro R _hR + exact + exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q R + +/-- Descendant-family a.e.-measurability for normalized quadratic probes. -/ +private theorem aemeasurable_fullBlockNormalizedQuadraticObservable_descendants + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable + hP hStruct center q (cubeSet R) a.toFun) P := by + intro R _hR + exact + aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q R + +/-- Origin-cube partition-average moment estimate with a.e.-local descendant +representatives. This is the Section 5.4-local bridge from the exact-local +Ch4 Rosenthal theorem to the totalized coarse-block observables used in Ch5. -/ +theorem integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + {d : ℕ} {n m : ℤ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {p : ℕ} {K : ℝ} + (hP : Ch04.RestrictionLawCarrier P) + (hn : 0 ≤ n) (hnm : n ≤ m) + (hPstat : Ch04.RestrictionStationaryLaw P) (hPdep : Ch04.RestrictionUnitRangeDependentLaw P) + (X : Set (Vec d) → RegCoeffField d → ℝ) + (hX_localRep : + ∀ R ∈ descendantsAtScale (originCube d m) n, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y) + (hX_cov : Ch04.IsRestrictionTranslationCovariant X) + (hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P) + (hX_desc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, AEMeasurable (X (cubeSet R)) P) + (hp : 2 ≤ p) (hK_nonneg : 0 ≤ K) + (hX0Lp_int : + Integrable (fun a => |Ch04.restrictionCenteredOriginObservable P n X a| ^ p) P) + (hX0Lp : + (∫ a, |Ch04.restrictionCenteredOriginObservable P n X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ K) : + (∫ a, |Ch04.restrictionCenteredDescendantAverage P n m X a| ^ p ∂P) ^ + (1 / (p : ℝ)) ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d n p * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ + (1 / (p : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d n p * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + simpa [Ch04.restrictionCenteredDescendantAverage, Ch04.restrictionCenteredDescendantAverageOnCube] + using + Ch04.integral_abs_restrictionCenteredDescendantAverageOnCube_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (Q := originCube d m) (n := n) (P := P) (p := p) (K := K) + hP hn (by simpa [originCube] using hnm) hPstat hPdep X + hX_localRep hX_cov hX0_aemeas hX_desc_aemeas hp hK_nonneg + hX0Lp_int hX0Lp + +/-- Rosenthal/partition-average estimate for the normalized full-block +fluctuation observable, assuming only the origin-scale moment root that the +good-scale scalar estimates will provide. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSq_restrictionCenteredDescendantAverage_pow_rpow_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center n m : ℤ} {K : ℝ} + (hn : 0 ≤ n) (hnm : n ≤ m) (hK_nonneg : 0 ≤ K) + (hOriginMoment_int : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P n + (fun U a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center U a.toFun) a| ^ hP4.xi) P) + (hOriginMoment : + (∫ a, + |Ch04.restrictionCenteredOriginObservable P n + (fun U a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center U a.toFun) a| ^ hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K) : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P n m + (fun U a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq + hP hStruct center U a.toFun) a| ^ hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d n hP4.xi * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d n hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center U a.toFun + have hlocal : + ∀ R ∈ descendantsAtScale (originCube d m) n, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y := by + simpa only [X] using + fullBlockNormalizedFluctuationOperatorNormSq_descendants_localRep + hP hStruct center (originCube d m) n + have hdesc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, + AEMeasurable (X (cubeSet R)) P := by + simpa only [X] using + aemeasurable_fullBlockNormalizedFluctuationOperatorNormSq_descendants + hP hStruct center (originCube d m) n + have h0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P := by + simpa only [X] using + aemeasurable_fullBlockNormalizedFluctuationOperatorNormSq_cubeSet + hP hStruct center (originCube d n) + simpa [X] using + integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (n := n) (m := m) (P := P) (p := hP4.xi) (K := K) + hP hn hnm hStruct.stationary hStruct.unit_range X hlocal + (Ch04.isRestrictionTranslationCovariant_comp_toFun + (Ch04.fullBlockNormalizedFluctuationOperatorNormSq_translation_covariant + hP hStruct center)) + h0_aemeas hdesc_aemeas hP4.two_le_xi hK_nonneg + (by simpa [X] using hOriginMoment_int) + (by simpa [X] using hOriginMoment) + +/-- Rosenthal/partition-average estimate for a normalized quadratic probe, +assuming the origin-scale moment root supplied by the good-scale scalar +estimate. -/ +theorem fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center n m : ℤ} {K : ℝ} (q : FullBlockVec d) + (hn : 0 ≤ n) (hnm : n ≤ m) (hK_nonneg : 0 ≤ K) + (hOriginMoment_int : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P n + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi) P) + (hOriginMoment : + (∫ a, + |Ch04.restrictionCenteredOriginObservable P n + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K) : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ + ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d n hP4.xi * + ((descendantsAtScale (originCube d m) n).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d n hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) n).card : ℝ) * K) := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + have hlocal : + ∀ R ∈ descendantsAtScale (originCube d m) n, + ∃ Y : RegCoeffField d → ℝ, + Ch04.IsRestrictionLocalRandomVariable (cubeSet R) (measurableSet_cubeSet R) Y ∧ X (cubeSet R) =ᵐ[P] Y := by + simpa only [X, fullBlockNormalizedQuadraticObservableR] using! + fullBlockNormalizedQuadraticObservable_descendants_localRep + hP hStruct center q (originCube d m) n + have hdesc_aemeas : + ∀ R ∈ descendantsAtScale (originCube d m) n, + AEMeasurable (X (cubeSet R)) P := by + simpa only [X, fullBlockNormalizedQuadraticObservableR] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_descendants + hP hStruct center q (originCube d m) n + have h0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) P := by + simpa only [X, fullBlockNormalizedQuadraticObservableR] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q (originCube d n) + simpa [X] using + integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (n := n) (m := m) (P := P) (p := hP4.xi) (K := K) + hP hn hnm hStruct.stationary hStruct.unit_range X hlocal + (Ch04.isRestrictionTranslationCovariant_comp_toFun + (fullBlockNormalizedQuadraticObservable_translation_covariant + hP hStruct center q)) + h0_aemeas hdesc_aemeas hP4.two_le_xi hK_nonneg + (by simpa [X] using hOriginMoment_int) + (by simpa [X] using hOriginMoment) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeMomentCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeMomentCompression.lean new file mode 100644 index 0000000000..dad52f8418 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeMomentCompression.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.QuadraticProbeBounds + +/-! # Probe Moment Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory + +noncomputable section + +/-! +# Compressed origin moments for variance probes + +The first Rosenthal bridge used the coarse bound `C * (Λ + λ⁻¹)`. For the +final variance lemma we also need the sharper matched form +`CUpper * Λ + CLower * λ⁻¹`, so that good-scale scalar comparisons compress the +normalization constants to `\widetilde\Theta_0`. +-/ + +/-- Centered origin moment bound from a matched upper/lower unit-scale +ellipticity domination. -/ +theorem section54_centeredOrigin_momentRoot_le_weighted_factor_sum_of_abs_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {CUpper CLower : ℝ} (hCUpper_nonneg : 0 ≤ CUpper) + (hCLower_nonneg : 0 ≤ CLower) {X : RegCoeffField d → ℝ} + (hX_meas : AEMeasurable X P) + (hX_abs_le : + (fun a => |X a|) ≤ᵐ[P] + fun a => + CUpper * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + CLower * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹) : + Integrable (fun a => |X a - ∫ b, X b ∂P| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => |X a - ∫ b, X b ∂P|) ≤ + 2 * + (CUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + CLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + let : IsProbabilityMeasure P := hP.isProbability + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + let I : RegCoeffField d → ℝ := + fun a => + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + let YUpper : RegCoeffField d → ℝ := fun a => CUpper * L a + let YLower : RegCoeffField d → ℝ := fun a => CLower * I a + let Y : RegCoeffField d → ℝ := fun a => YUpper a + YLower a + have hξ_one : 1 ≤ hP4.xi := + le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + have hYUpper_nonneg : ∀ a, 0 ≤ YUpper a := fun a => + mul_nonneg hCUpper_nonneg (hL_nonneg a) + have hYLower_nonneg : ∀ a, 0 ≤ YLower a := fun a => + mul_nonneg hCLower_nonneg (hI_nonneg a) + have hY_nonneg : ∀ a, 0 ≤ Y a := fun a => + add_nonneg (hYUpper_nonneg a) (hYLower_nonneg a) + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hP4.sUpper_pos + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hP4.sLower_pos + have hYUpper_meas : AEMeasurable YUpper P := by + exact hL_meas.const_mul CUpper + have hYLower_meas : AEMeasurable YLower P := by + exact hI_meas.const_mul CLower + have hL_int : Integrable (fun a => L a ^ hP4.xi) P := by + simpa [L] using + Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hI_int : Integrable (fun a => I a ^ hP4.xi) P := by + simpa [I] using + Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 0 + have hYUpper_int : Integrable (fun a => YUpper a ^ hP4.xi) P := by + have hscaled := hL_int.const_mul (CUpper ^ hP4.xi) + refine hscaled.congr ?_ + filter_upwards with a + simp [YUpper, mul_pow] + have hYLower_int : Integrable (fun a => YLower a ^ hP4.xi) P := by + have hscaled := hI_int.const_mul (CLower ^ hP4.xi) + refine hscaled.congr ?_ + filter_upwards with a + simp [YLower, mul_pow] + have hξ_ne : hP4.xi ≠ 0 := + Nat.ne_of_gt (lt_of_lt_of_le (by norm_num : 0 < 2) hP4.two_le_xi) + have hYUpper_mem : MemLp YUpper (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hYUpper_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + have hYUpper_abs_int : Integrable (fun a => |YUpper a| ^ hP4.xi) P := by + refine hYUpper_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hYUpper_nonneg a)] + simpa [Real.norm_eq_abs] using hYUpper_abs_int + have hYLower_mem : MemLp YLower (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hYLower_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + have hYLower_abs_int : Integrable (fun a => |YLower a| ^ hP4.xi) P := by + refine hYLower_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hYLower_nonneg a)] + simpa [Real.norm_eq_abs] using hYLower_abs_int + have hY_mem : MemLp Y (hP4.xi : ENNReal) P := + hYUpper_mem.add hYLower_mem + have hY_int : Integrable (fun a => Y a ^ hP4.xi) P := by + have hint := hY_mem.integrable_norm_pow hξ_ne + refine hint.congr ?_ + filter_upwards with a + simp [Y, Real.norm_eq_abs, abs_of_nonneg (hY_nonneg a)] + have hX_abs_pow_int : + Integrable (fun a => |X a| ^ hP4.xi) P := + section54_integrable_abs_pow_of_ae_abs_le_nonneg + hX_meas (Filter.Eventually.of_forall hY_nonneg) + (by simpa [Y, YUpper, YLower, L, I] using hX_abs_le) hY_int + have hcenter_mem : + MemLp (fun a => X a - ∫ b, X b ∂P) (hP4.xi : ENNReal) P := by + have hmem_p : MemLp X (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hX_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hX_abs_pow_int + exact hmem_p.sub (memLp_const (∫ b, X b ∂P)) + have hcenter_int : + Integrable (fun a => |X a - ∫ b, X b ∂P| ^ hP4.xi) P := by + have hint := hcenter_mem.integrable_norm_pow hξ_ne + simpa [Real.norm_eq_abs] using hint + refine ⟨hcenter_int, ?_⟩ + have hcenter_root := + section54_annealedMomentRoot_abs_sub_integral_le_two_mul + (P := P) (ξ := hP4.xi) (X := X) hξ_one hX_meas hX_abs_pow_int + have hraw_to_Y : + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) ≤ + Ch04.annealedMomentRoot P hP4.xi Y := + section54_annealedMomentRoot_abs_le_of_ae_abs_le_nonneg + (P := P) (ξ := hP4.xi) (X := X) (Y := Y) + hξ_one hY_nonneg (by simpa [Y, YUpper, YLower, L, I] using hX_abs_le) + hX_abs_pow_int hY_int + have hY_root : + Ch04.annealedMomentRoot P hP4.xi Y ≤ + CUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + CLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + have hY_add : + Ch04.annealedMomentRoot P hP4.xi Y ≤ + Ch04.annealedMomentRoot P hP4.xi YUpper + + Ch04.annealedMomentRoot P hP4.xi YLower := by + simpa [Y] using + section54_annealedMomentRoot_add_le + (P := P) (ξ := hP4.xi) (X := YUpper) (Y := YLower) + hξ_one hYUpper_nonneg hYLower_nonneg hYUpper_meas hYLower_meas + hYUpper_int hYLower_int + have hUpper_eq : + Ch04.annealedMomentRoot P hP4.xi YUpper = + CUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + simpa [YUpper, L, Ch04.LambdaMomentAtScale] using + Section52.section52_annealedMomentRoot_const_mul_of_nonneg + (P := P) (ξ := hP4.xi) (c := CUpper) (X := L) + hξ_one hCUpper_nonneg hL_nonneg + have hLower_eq : + Ch04.annealedMomentRoot P hP4.xi YLower = + CLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + simpa [YLower, I, Ch04.lambdaInvMomentAtScale] using + Section52.section52_annealedMomentRoot_const_mul_of_nonneg + (P := P) (ξ := hP4.xi) (c := CLower) (X := I) + hξ_one hCLower_nonneg hI_nonneg + simpa [hUpper_eq, hLower_eq] using hY_add + calc + Ch04.annealedMomentRoot P hP4.xi (fun a => |X a - ∫ b, X b ∂P|) + ≤ 2 * Ch04.annealedMomentRoot P hP4.xi (fun a => |X a|) := hcenter_root + _ ≤ 2 * Ch04.annealedMomentRoot P hP4.xi Y := by + exact mul_le_mul_of_nonneg_left hraw_to_Y (by norm_num) + _ ≤ + 2 * + (CUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + CLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + exact mul_le_mul_of_nonneg_left hY_root (by norm_num) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeVariance.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeVariance.lean new file mode 100644 index 0000000000..bbd95b2551 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ProbeVariance.lean @@ -0,0 +1,507 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarL2 + +/-! # Probe Variance -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory + +noncomputable section + +/-! +# Scalar probe variance inputs + +This file records the internal integrability bridge for scalar quadratic +probes. It keeps the public variance-bound theorem free of extra +measurability or integrability assumptions: `(P4)` controls the full normalized +fluctuation, and the deterministic operator-norm bound controls each scalar +quadratic probe. +-/ + +private theorem fullBlockNormalizedQuadraticObservable_cubeSet_regular + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a) P := by + rcases exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q Q with ⟨Y, hY_local, hY_eq⟩ + exact (hP.aemeasurable_of_isLocalRandomVariable hY_local).congr hY_eq.symm + +private theorem fullBlockNormalizedQuadraticObservable_descendants_regular + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet R) a) P := by + intro R hR + exact + fullBlockNormalizedQuadraticObservable_cubeSet_regular + hP hStruct center q R + +private theorem fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_regular + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center n m : ℤ) (q : FullBlockVec d) : + AEMeasurable + (Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q)) P := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + let μ0 : ℝ := ∫ b, X (cubeSet (originCube d n)) b ∂P + let S : RegCoeffField d → ℝ := + fun a => ∑ R ∈ descendantsAtScale (originCube d m) n, (X (cubeSet R) a - μ0) + have hdesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, + AEMeasurable (fun a : RegCoeffField d => X (cubeSet R) a) P := by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_descendants_regular + hP hStruct center q (originCube d m) n + have hS : AEMeasurable S P := by + have hS' : + AEMeasurable + (∑ R ∈ descendantsAtScale (originCube d m) n, + fun a : RegCoeffField d => X (cubeSet R) a - μ0) P := + Finset.aemeasurable_sum _ fun R hR => + (hdesc R hR).sub aemeasurable_const + refine hS'.congr ?_ + filter_upwards with a + simp [S, Finset.sum_apply] + have hcenter : + Ch04.restrictionCenteredDescendantAverage P n m X = + fun a => ((descendantsAtScale (originCube d m) n).card : ℝ)⁻¹ * S a := by + funext a + simp [Ch04.restrictionCenteredDescendantAverage, S, μ0] + simpa [X, hcenter] using! aemeasurable_const.mul hS + +/-- `(P4)` gives the L2 integrability of a centered normalized scalar +quadratic probe on an origin cube. -/ +theorem integrable_abs_sub_dotProduct_sq_fullBlockNormalizedQuadraticObservable_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m j : ℕ) (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a - dotProduct q q| ^ (2 : ℕ)) P := by + let F : RegCoeffField d → ℝ := fun a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a + have hF_int : Integrable F P := by + simpa [F] using + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + hP hStruct hP4 (m : ℤ) j + have hR_int : Integrable + (fun a : RegCoeffField d => F a * (dotProduct q q) ^ (2 : ℕ)) P := + hF_int.mul_const _ + refine Integrable.mono' hR_int ?_ ?_ + · have hX_meas := + fullBlockNormalizedQuadraticObservable_cubeSet_regular + hP hStruct (m : ℤ) q (originCube d (j : ℤ)) + exact (((hX_meas.sub aemeasurable_const).norm.pow_const (2 : ℕ)).aestronglyMeasurable) + · filter_upwards with a + have hquad := + fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 m q (cubeSet (originCube d (j : ℤ))) a + have hbound := + fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) q + rw [hquad] + let M : FullBlockMat d := + fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a + have hleft_nonneg : 0 ≤ |fullBlockQuadratic M q| ^ (2 : ℕ) := + pow_nonneg (abs_nonneg _) (2 : ℕ) + show |(|fullBlockQuadratic M q| ^ (2 : ℕ))| ≤ + F a * (dotProduct q q) ^ (2 : ℕ) + rw [abs_of_nonneg hleft_nonneg] + calc + |fullBlockQuadratic M q| ^ (2 : ℕ) + ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) * + (dotProduct q q) ^ (2 : ℕ) := by + simpa [M] using hbound + _ = F a * (dotProduct q q) ^ (2 : ℕ) := by + rw [← fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq] + rfl + +/-- `(P4)` also gives the L1 integrability inputs for one normalized scalar +quadratic probe on an origin cube. -/ +theorem integrable_fullBlockNormalizedQuadraticObservable_and_abs_sub_dotProduct_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m j : ℕ) (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a) P ∧ + Integrable + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a - dotProduct q q|) P ∧ + Integrable + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a - dotProduct q q| ^ (2 : ℕ)) P := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := fun a => + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a + let Y : RegCoeffField d → ℝ := fun a => X a - dotProduct q q + have hSq : + Integrable (fun a : RegCoeffField d => |Y a| ^ (2 : ℕ)) P := by + simpa [X, Y] using + integrable_abs_sub_dotProduct_sq_fullBlockNormalizedQuadraticObservable_from_P4 + hP hStruct hP4 m j q + have hX_regular : AEMeasurable X P := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_cubeSet_regular + hP hStruct (m : ℤ) q (originCube d (j : ℤ)) + have hY_strong : AEStronglyMeasurable Y P := + (hX_regular.sub aemeasurable_const).aestronglyMeasurable + have hY_mem2 : MemLp Y (2 : ENNReal) P := by + rw [MeasureTheory.memLp_two_iff_integrable_sq hY_strong] + simpa [Y, sq_abs] using hSq + have hY_int : Integrable Y P := + hY_mem2.integrable (by norm_num : (1 : ENNReal) ≤ 2) + have hX_int : Integrable X P := by + have hsum : Integrable (fun a : RegCoeffField d => Y a + dotProduct q q) P := + hY_int.add (integrable_const _) + simpa [Y, X, sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using hsum + have hY_abs_int : Integrable (fun a : RegCoeffField d => |Y a|) P := by + simpa [Real.norm_eq_abs] using hY_int.norm + exact ⟨by simpa [X] using hX_int, by simpa [X, Y] using hY_abs_int, + by simpa [X, Y] using hSq⟩ + +/-- Convert the Section 5.4 Rosenthal root bound for a normalized quadratic +probe descendant average into the L1 and L2 estimates used by the scalar +variance reduction. -/ +theorem fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (q : FullBlockVec d) {K : ℝ} + (hOriginMoment_int : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P n + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi) P) + (hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K) : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ (2 : ℕ) ∂P + ≤ K ^ (2 : ℕ)) := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + let Z : RegCoeffField d → ℝ := Ch04.restrictionCenteredDescendantAverage P n m X + have hX0 : + AEMeasurable (fun a : RegCoeffField d => X (cubeSet (originCube d n)) a) P := by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_cubeSet_regular + hP hStruct center q (originCube d n) + have hXdesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, + AEMeasurable (fun a : RegCoeffField d => X (cubeSet R) a) P := by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_descendants_regular + hP hStruct center q (originCube d m) n + have hZ_regular : AEMeasurable Z P := by + simpa [Z, X] using + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_regular + hP hStruct center n m q + have hxi_one : 1 ≤ hP4.xi := + Nat.le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + have hZξ_int : Integrable (fun a => |Z a| ^ hP4.xi) P := by + simpa [Z, X] using + Ch04.integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary + (d := d) (n := n) (m := m) (P := P) (p := hP4.xi) + hn hnm hStruct.stationary X + (Ch04.isRestrictionTranslationCovariant_comp_toFun + (fullBlockNormalizedQuadraticObservable_translation_covariant hP hStruct center q)) + hX0 hXdesc hxi_one + (by simpa [X] using hOriginMoment_int) + simpa [Z, X] using + integral_abs_and_sq_le_of_annealedMomentRoot_le + (μ := P) hP4.two_le_xi hZ_regular hZξ_int + (by simpa [Z, X] using hroot) + +/-- Integrability of the L1 and L2 sizes of the normalized quadratic-probe +descendant average, derived internally from the origin `L^ξ` moment supplied by +`(P4)`. -/ +theorem fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center n m : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) (q : FullBlockVec d) + (hOriginMoment_int : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P n + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi) P) : + Integrable + (fun a => + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a|) P ∧ + Integrable + (fun a => + |Ch04.restrictionCenteredDescendantAverage P n m + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + (2 : ℕ)) P := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + let Z : RegCoeffField d → ℝ := Ch04.restrictionCenteredDescendantAverage P n m X + have hX0 : + AEMeasurable (fun a : RegCoeffField d => X (cubeSet (originCube d n)) a) P := by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_cubeSet_regular + hP hStruct center q (originCube d n) + have hXdesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, + AEMeasurable (fun a : RegCoeffField d => X (cubeSet R) a) P := by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_descendants_regular + hP hStruct center q (originCube d m) n + have hZ_regular : AEMeasurable Z P := by + simpa [Z, X] using + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_regular + hP hStruct center n m q + have hxi_one : 1 ≤ hP4.xi := + Nat.le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + have hZξ_int : Integrable (fun a => |Z a| ^ hP4.xi) P := by + simpa [Z, X] using + Ch04.integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary + (d := d) (n := n) (m := m) (P := P) (p := hP4.xi) + hn hnm hStruct.stationary X + (Ch04.isRestrictionTranslationCovariant_comp_toFun + (fullBlockNormalizedQuadraticObservable_translation_covariant hP hStruct center q)) + hX0 hXdesc hxi_one + (by simpa [X] using hOriginMoment_int) + have hZ_memξ : MemLp Z (hP4.xi : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hZ_regular.aestronglyMeasurable + (by exact_mod_cast hP4.xi_pos.ne') (by simp)] + simpa [Real.norm_eq_abs] using hZξ_int + have hZ_mem2 : MemLp Z (2 : ENNReal) P := + hZ_memξ.mono_exponent (by exact_mod_cast hP4.two_le_xi) + have hZ_int : Integrable Z P := + hZ_mem2.integrable (by norm_num : (1 : ENNReal) ≤ 2) + have hZ_sq_int : Integrable (fun a => |Z a| ^ (2 : ℕ)) P := by + simpa [Real.norm_eq_abs] using + hZ_mem2.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + exact ⟨by simpa [Z, X, Real.norm_eq_abs] using hZ_int.norm, + by simpa [Z, X] using hZ_sq_int⟩ + +/-- L1/L2 descendant-average bounds for normalized coordinate probes. -/ +theorem coordinateProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) (α : BlockCoord d) : + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + classical + dsimp only + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + have hOrigin := + coordinateProbe_centeredOrigin_momentRoot_le_factorSum hP hStruct hP4 center α + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + simpa [K] using + coordinateProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 hm α + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := center) (n := 0) (m := m) (by norm_num) hm hOrigin.1 hroot + +/-- L1/L2 descendant-average bounds for normalized plus-pair probes. -/ +theorem plusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + classical + dsimp only + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + have hOrigin := + plusProbe_centeredOrigin_momentRoot_le_factorSum hP hStruct hP4 center hαβ + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + simpa [K] using + plusProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 hm hαβ + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + hP hStruct hP4 (q := fullBlockPlusProbe α β) + (center := center) (n := 0) (m := m) (by norm_num) hm hOrigin.1 hroot + +/-- L1/L2 descendant-average bounds for normalized minus-pair probes. -/ +theorem minusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + classical + dsimp only + let K := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + have hOrigin := + minusProbe_centeredOrigin_momentRoot_le_factorSum hP hStruct hP4 center hαβ + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + simpa [K] using + minusProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 hm hαβ + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + hP hStruct hP4 (q := fullBlockMinusProbe α β) + (center := center) (n := 0) (m := m) (by norm_num) hm hOrigin.1 hroot + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/QuadraticProbeBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/QuadraticProbeBounds.lean new file mode 100644 index 0000000000..8db4bb8276 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/QuadraticProbeBounds.lean @@ -0,0 +1,857 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.PartitionAverage + +/-! # Quadratic Probe Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Pointwise bounds for normalized quadratic probes + +This file supplies the remaining Section 5.4-local bridge from the normalized +quadratic probes used in the finite-dimensional upgrade to the unit-scale +coarse-grained ellipticity factors controlled by `(P4)`. +-/ + +/-- Unit-scale sum of the two coarse-grained ellipticity observables appearing +in `(P4)`. -/ +noncomputable def unitScaleEllipticityFactorSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (a : RegCoeffField d) : ℝ := + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + +theorem unitScaleEllipticityFactorSum_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (a : RegCoeffField d) : + 0 ≤ unitScaleEllipticityFactorSum hP4 a := by + unfold unitScaleEllipticityFactorSum + exact add_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hP4.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1)) + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hP4.sLower_pos (by norm_num : (1 : ℝ) ≤ 1))) + +private theorem blockMatVecMul_sub' + {d : ℕ} (A : BlockMat d) (X Y : BlockVec d) : + blockMatVecMul A (X - Y) = blockMatVecMul A X - blockMatVecMul A Y := by + have hneg : blockMatVecMul A (-Y) = -blockMatVecMul A Y := by + simpa using blockMatVecMul_smul A (-1) Y + rw [sub_eq_add_neg, blockMatVecMul_add, hneg] + rfl + +private theorem blockVecDot_sub_left' + {d : ℕ} (X Y Z : BlockVec d) : + blockVecDot (X - Y) Z = blockVecDot X Z - blockVecDot Y Z := by + have hneg : blockVecDot (-Y) Z = -blockVecDot Y Z := by + simpa using blockVecDot_smul_left (-1) Y Z + rw [sub_eq_add_neg, blockVecDot_add_left, hneg] + rfl + +private theorem blockBasis_sub_pairing' + {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) : + blockVecDot (blockBasis α - blockBasis β) + (blockMatVecMul A (blockBasis α - blockBasis β)) = + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + rw [blockMatVecMul_sub', blockVecDot_sub_left'] + rw [blockVecDot_sub_right] + rw [blockVecDot_sub_right] + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, blockBasis_pairing] + ring + +private theorem blockBasis_add_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α + blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem blockBasis_sub_ne_zero' + {d : ℕ} {α β : BlockCoord d} (hαβ : α ≠ β) : + blockBasis α - blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +private theorem abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) {α β : BlockCoord d} (hαβ : α ≠ β) : + |blockMatEntry A α β| ≤ + (1 / 2 : ℝ) * (blockMatEntry A α α + blockMatEntry A β β) := by + have hplus_pos := + hPos (blockBasis α + blockBasis β) (blockBasis_add_ne_zero' hαβ) + have hminus_pos := + hPos (blockBasis α - blockBasis β) (blockBasis_sub_ne_zero' hαβ) + have hplus : + 0 < + blockMatEntry A α α + blockMatEntry A α β + + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sum_pairing] using hplus_pos + have hminus : + 0 < + blockMatEntry A α α - blockMatEntry A α β - + blockMatEntry A β α + blockMatEntry A β β := by + simpa [blockBasis_sub_pairing'] using hminus_pos + have hsymm : blockMatEntry A β α = blockMatEntry A α β := (hSymm α β).symm + rw [abs_le] + constructor <;> nlinarith + +/-- Entrywise domination of the unit coarse block matrix by the two unit-scale +coarse-grained ellipticity factors from `(P4)`. -/ +theorem blockMatEntry_abs_le_unitScaleEllipticityFactorSum_origin_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hP4 : QuantitativeCoarseGrainedEllipticity P) + (α β : BlockCoord d) : + (fun a : RegCoeffField d => + |blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) α β|) + ≤ᵐ[P] fun a => unitScaleEllipticityFactorSum hP4 a := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + let Q : TriadicCube d := originCube d 0 + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hPos : Ch02.BlockPosDef (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (F.coeffOn Q)).block_matrix_posDef + have hUpperEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).upperLeft i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft i j| := by + rw [hEq] + _ ≤ Ch02.coarseBMatrixNorm Q F := by + simpa [Ch02.coarseBMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).upperLeft) i j + _ ≤ Ch02.LambdaSq Q hP4.sUpper (.finite 1) F := + Ch02.oneCube_b_le_LambdaSq_finite Q F hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + _ = Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + simp [Ch04.LambdaSqCoeffField, ha, F] + have hLowerEntry : ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| ≤ + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + intro i j + calc + |(coarseBlockMatrix (cubeSet Q) a.toFun).lowerRight i j| + = |(Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight i j| := by + rw [hEq] + _ ≤ Ch02.coarseSigmaStarInvMatrixNorm Q F := by + simpa [Ch02.coarseSigmaStarInvMatrixNorm, Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + ((Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q)).lowerRight) i j + _ ≤ (Ch02.lambdaSq Q hP4.sLower (.finite 1) F)⁻¹ := + Ch02.oneCube_sigmaStarInv_le_lambdaSq_finite_inv Q F hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1) + _ = (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + simp [Ch04.lambdaSqCoeffField, ha, F] + have hX_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg Q a hP4.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hP4.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + cases α with + | inl i => + cases β with + | inl j => + exact (hUpperEntry i j).trans (by + unfold unitScaleEllipticityFactorSum Q + linarith) + | inr j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inr j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inl i) ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry i i) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr j) (Sum.inr j) ≤ + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry j j) + have htarget : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl i) (Sum.inr j)| ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + linarith + simpa [Q, unitScaleEllipticityFactorSum] using htarget + | inr i => + cases β with + | inl j => + have hcross : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inl j)| ≤ + (1 / 2 : ℝ) * + (blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) + + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j)) := + abs_cross_blockMatEntry_le_diag_sum_of_blockPosDef' hSymm hPos + (by intro h; cases h) + have hLR : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inr i) ≤ + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hLowerEntry i i) + have hUL : + blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inl j) (Sum.inl j) ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a := by + exact (le_abs_self _).trans (by simpa [blockMatEntry] using hUpperEntry j j) + have htarget : + |blockMatEntry (coarseBlockMatrix (cubeSet Q) a.toFun) (Sum.inr i) (Sum.inl j)| ≤ + Ch04.LambdaSqCoeffField Q hP4.sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField Q hP4.sLower (.finite 1) a)⁻¹ := by + linarith + simpa [Q, unitScaleEllipticityFactorSum] using htarget + | inr j => + exact (hLowerEntry i j).trans (by + unfold unitScaleEllipticityFactorSum Q + linarith) + +theorem isSymm_diagonal_mul_toFullBlockMat_mul_diagonal + {d : ℕ} (r : BlockCoord d → ℝ) {A : BlockMat d} + (hA : IsSymmetricBlockMat A) : + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r).IsSymm := by + have hM : (toFullBlockMat A).IsSymm := by + simpa using isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + rw [Matrix.IsSymm] + ext α β + simp [Matrix.transpose_apply, Matrix.mul_apply, Matrix.diagonal] + have h := hM.apply α β + rw [h] + ring + +theorem fullBlockQuadratic_diagonal_coordinateProbe + {d : ℕ} (r : BlockCoord d → ℝ) (A : BlockMat d) + (α : BlockCoord d) : + fullBlockQuadratic (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (fullBlockCoordinateProbe α) = + r α * blockMatEntry A α α * r α := by + classical + rw [fullBlockQuadratic_coordinateProbe] + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat, blockMatEntry] + +theorem fullBlockQuadratic_diagonal_plusProbe_of_ne + {d : ℕ} (r : BlockCoord d → ℝ) {A : BlockMat d} + (hA : IsSymmetricBlockMat A) {α β : BlockCoord d} (hαβ : α ≠ β) : + fullBlockQuadratic (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (fullBlockPlusProbe α β) = + r α * blockMatEntry A α α * r α + + 2 * (r α * blockMatEntry A α β * r β) + + r β * blockMatEntry A β β * r β := by + classical + have hDMD := isSymm_diagonal_mul_toFullBlockMat_mul_diagonal r hA + rw [fullBlockQuadratic_plusProbe_of_ne hDMD hαβ] + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat, blockMatEntry] + +theorem fullBlockQuadratic_diagonal_minusProbe_of_ne + {d : ℕ} (r : BlockCoord d → ℝ) {A : BlockMat d} + (hA : IsSymmetricBlockMat A) {α β : BlockCoord d} (hαβ : α ≠ β) : + fullBlockQuadratic (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (fullBlockMinusProbe α β) = + r α * blockMatEntry A α α * r α - + 2 * (r α * blockMatEntry A α β * r β) + + r β * blockMatEntry A β β * r β := by + classical + have hDMD := isSymm_diagonal_mul_toFullBlockMat_mul_diagonal r hA + rw [fullBlockQuadratic_minusProbe_of_ne hDMD hαβ] + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat, blockMatEntry] + +/-- Coefficient in the unit-scale factor bound for a normalized coordinate +probe. -/ +noncomputable def coordinateProbeFactor + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α : BlockCoord d) : ℝ := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + |r α| * |r α| + +theorem coordinateProbeFactor_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α : BlockCoord d) : + 0 ≤ coordinateProbeFactor hP hStruct center α := by + unfold coordinateProbeFactor + exact mul_nonneg (abs_nonneg _) (abs_nonneg _) + +/-- Coefficient in the unit-scale factor bound for a normalized plus/minus +pair probe. -/ +noncomputable def pairProbeFactor + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α β : BlockCoord d) : ℝ := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + |r α| * |r α| + 2 * (|r α| * |r β|) + |r β| * |r β| + +theorem pairProbeFactor_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α β : BlockCoord d) : + 0 ≤ pairProbeFactor hP hStruct center α β := by + unfold pairProbeFactor + nlinarith [abs_nonneg (Ch04.scalarFullBlockInvSqrtDiag + (hP.barSigmaAtScale hStruct center) (hP.barSigmaStarAtScale hStruct center) α), + abs_nonneg (Ch04.scalarFullBlockInvSqrtDiag + (hP.barSigmaAtScale hStruct center) (hP.barSigmaStarAtScale hStruct center) β)] + +theorem abs_mul_entry_mul_le_factor + {F x y e : ℝ} (he : |e| ≤ F) : + |x * e * y| ≤ |x| * |y| * F := by + calc + |x * e * y| = |x| * |y| * |e| := by + rw [abs_mul, abs_mul] + ring + _ ≤ |x| * |y| * F := by + exact mul_le_mul_of_nonneg_left he + (mul_nonneg (abs_nonneg x) (abs_nonneg y)) + +/-- The normalized coordinate quadratic probe is pointwise dominated, a.s., +by the `(P4)` unit-scale ellipticity factor sum. -/ +theorem fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_factorSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (α : BlockCoord d) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct center + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + coordinateProbeFactor hP hStruct center α * + unitScaleEllipticityFactorSum hP4 a := by + filter_upwards + [blockMatEntry_abs_le_unitScaleEllipticityFactorSum_origin_ae + hP hP4 α α] with a hentry + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + have hF_nonneg := unitScaleEllipticityFactorSum_nonneg hP4 a + have hquad : + fullBlockNormalizedQuadraticObservable hP hStruct center + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a = + r α * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) α α * + r α := by + simpa [fullBlockNormalizedQuadraticObservable, b, c, r] using + fullBlockQuadratic_diagonal_coordinateProbe r + (coarseBlockMatrix (cubeSet (originCube d 0)) a) α + calc + |fullBlockNormalizedQuadraticObservable hP hStruct center + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a| + = |r α * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) α α * + r α| := by rw [hquad] + _ ≤ |r α| * |r α| * unitScaleEllipticityFactorSum hP4 a := + abs_mul_entry_mul_le_factor hentry + _ = coordinateProbeFactor hP hStruct center α * + unitScaleEllipticityFactorSum hP4 a := by + simp [coordinateProbeFactor, b, c, r] + +private theorem fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_factorSum_ae_aux + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) {α β : BlockCoord d} (_hαβ : α ≠ β) + (probe : FullBlockVec d) (s : ℝ) (hs : |s| = 2) + (hexpand : + ∀ (r : BlockCoord d → ℝ) {A : BlockMat d}, + IsSymmetricBlockMat A → + fullBlockQuadratic (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + probe = + r α * blockMatEntry A α α * r α + + s * (r α * blockMatEntry A α β * r β) + + r β * blockMatEntry A β β * r β) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct center + probe (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + pairProbeFactor hP hStruct center α β * + unitScaleEllipticityFactorSum hP4 a := by + filter_upwards + [hP.ae_locallyUniformlyEllipticField, + blockMatEntry_abs_le_unitScaleEllipticityFactorSum_origin_ae hP hP4 α α, + blockMatEntry_abs_le_unitScaleEllipticityFactorSum_origin_ae hP hP4 α β, + blockMatEntry_abs_le_unitScaleEllipticityFactorSum_origin_ae hP hP4 β β] + with a ha hdiagα hoff hdiagβ + let Q : TriadicCube d := originCube d 0 + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + let Fsum := unitScaleEllipticityFactorSum hP4 a + let A := coarseBlockMatrix (cubeSet Q) a.toFun + let Tα := r α * blockMatEntry A α α * r α + let Tβ := r β * blockMatEntry A β β * r β + let Tαβ := r α * blockMatEntry A α β * r β + have hEq : + A = Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) := by + simpa [A, Q] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hSymm : IsSymmetricBlockMat A := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + have hF_nonneg : 0 ≤ Fsum := by + simpa [Fsum] using unitScaleEllipticityFactorSum_nonneg hP4 a + have hTα : |Tα| ≤ |r α| * |r α| * Fsum := by + simpa [Tα, A, Fsum, Q] using + abs_mul_entry_mul_le_factor + (x := r α) (y := r α) + (e := blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) α α) + hdiagα + have hTβ : |Tβ| ≤ |r β| * |r β| * Fsum := by + simpa [Tβ, A, Fsum, Q] using + abs_mul_entry_mul_le_factor + (x := r β) (y := r β) + (e := blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) β β) + hdiagβ + have hTαβ : |Tαβ| ≤ |r α| * |r β| * Fsum := by + simpa [Tαβ, A, Fsum, Q] using + abs_mul_entry_mul_le_factor + (x := r α) (y := r β) + (e := blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) α β) + hoff + have hquad : + fullBlockNormalizedQuadraticObservable hP hStruct center + probe (cubeSet Q) a = + Tα + s * Tαβ + Tβ := by + simpa [fullBlockNormalizedQuadraticObservable, b, c, r, A, Tα, Tαβ, Tβ] using + hexpand r hSymm + have h_abs : + |Tα + s * Tαβ + Tβ| ≤ + (|r α| * |r α| + 2 * (|r α| * |r β|) + |r β| * |r β|) * Fsum := by + calc + |Tα + s * Tαβ + Tβ| + ≤ |Tα| + |2 * Tαβ| + |Tβ| := by + simpa [hs] using abs_add_three Tα (s * Tαβ) Tβ + _ ≤ |r α| * |r α| * Fsum + + 2 * (|r α| * |r β| * Fsum) + + |r β| * |r β| * Fsum := by + have htwo : |2 * Tαβ| = 2 * |Tαβ| := by simp + rw [htwo] + nlinarith [hTα, hTβ, hTαβ] + _ = (|r α| * |r α| + 2 * (|r α| * |r β|) + + |r β| * |r β|) * Fsum := by ring + calc + |fullBlockNormalizedQuadraticObservable hP hStruct center + probe (cubeSet (originCube d 0)) a| + = |Tα + s * Tαβ + Tβ| := by + simpa [Q] using congrArg abs hquad + _ ≤ (|r α| * |r α| + 2 * (|r α| * |r β|) + + |r β| * |r β|) * Fsum := h_abs + _ = pairProbeFactor hP hStruct center α β * + unitScaleEllipticityFactorSum hP4 a := by + simp [pairProbeFactor, b, c, r, Fsum] + +/-- The normalized plus-pair quadratic probe is pointwise dominated, a.s., +by the `(P4)` unit-scale ellipticity factor sum. -/ +theorem fullBlockNormalizedQuadraticObservable_plusProbe_abs_le_factorSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) {α β : BlockCoord d} (hαβ : α ≠ β) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct center + (fullBlockPlusProbe α β) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + pairProbeFactor hP hStruct center α β * + unitScaleEllipticityFactorSum hP4 a := + fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_factorSum_ae_aux + hP hStruct hP4 center hαβ (fullBlockPlusProbe α β) 2 (by norm_num) + (fun r A hA => fullBlockQuadratic_diagonal_plusProbe_of_ne r hA hαβ) + +/-- The normalized minus-pair quadratic probe is pointwise dominated, a.s., +by the `(P4)` unit-scale ellipticity factor sum. -/ +theorem fullBlockNormalizedQuadraticObservable_minusProbe_abs_le_factorSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) {α β : BlockCoord d} (hαβ : α ≠ β) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct center + (fullBlockMinusProbe α β) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + pairProbeFactor hP hStruct center α β * + unitScaleEllipticityFactorSum hP4 a := by + refine + fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_factorSum_ae_aux + hP hStruct hP4 center hαβ (fullBlockMinusProbe α β) (-2) (by norm_num) ?_ + intro r A hA + simpa [sub_eq_add_neg] using + fullBlockQuadratic_diagonal_minusProbe_of_ne r hA hαβ + +private theorem fullBlockNormalizedQuadraticObservable_origin_regular + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d 0)) a) P := by + rcases exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q (originCube d 0) with ⟨Y, hY_local, hY_eq⟩ + exact (hP.aemeasurable_of_isLocalRandomVariable hY_local).congr hY_eq.symm + +private theorem centeredOriginMomentRoot_le_factorSum_of_probe_abs_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center : ℤ} {q : FullBlockVec d} {C : ℝ} (hC : 0 ≤ C) + (hbound : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => C * unitScaleEllipticityFactorSum hP4 a) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| ^ + hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a|) + ≤ + 2 * C * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + let X : RegCoeffField d → ℝ := + fun a => + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d 0)) a + have hX_meas : AEMeasurable X P := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_origin_regular + hP hStruct center q + have hbridge := + section54_centeredOrigin_momentRoot_le_factor_sum_of_abs_le + hP hStruct hP4 hC (X := X) hX_meas + (by simpa [X, unitScaleEllipticityFactorSum] using hbound) + simpa [X, Ch04.restrictionCenteredOriginObservable] using! hbridge + +/-- Centered origin moment input for normalized coordinate probes. -/ +theorem coordinateProbe_centeredOrigin_momentRoot_le_factorSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (α : BlockCoord d) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a|) + ≤ + 2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := + centeredOriginMomentRoot_le_factorSum_of_probe_abs_le + hP hStruct hP4 + (coordinateProbeFactor_nonneg hP hStruct center α) + (fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_factorSum_ae + hP hStruct hP4 center α) + +/-- Centered origin moment input for normalized plus-pair probes. -/ +theorem plusProbe_centeredOrigin_momentRoot_le_factorSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) {α β : BlockCoord d} (hαβ : α ≠ β) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a|) + ≤ + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := + centeredOriginMomentRoot_le_factorSum_of_probe_abs_le + hP hStruct hP4 + (pairProbeFactor_nonneg hP hStruct center α β) + (fullBlockNormalizedQuadraticObservable_plusProbe_abs_le_factorSum_ae + hP hStruct hP4 center hαβ) + +/-- Centered origin moment input for normalized minus-pair probes. -/ +theorem minusProbe_centeredOrigin_momentRoot_le_factorSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) {α β : BlockCoord d} (hαβ : α ≠ β) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a|) + ≤ + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := + centeredOriginMomentRoot_le_factorSum_of_probe_abs_le + hP hStruct hP4 + (pairProbeFactor_nonneg hP hStruct center α β) + (fullBlockNormalizedQuadraticObservable_minusProbe_abs_le_factorSum_ae + hP hStruct hP4 center hαβ) + +private theorem factorMomentSum_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := + add_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +private theorem coordinateProbe_partition_K_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (α : BlockCoord d) : + 0 ≤ + 2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + exact mul_nonneg + (mul_nonneg (by norm_num) (coordinateProbeFactor_nonneg hP hStruct center α)) + (factorMomentSum_nonneg hP4) + +private theorem pairProbe_partition_K_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (α β : BlockCoord d) : + 0 ≤ + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + exact mul_nonneg + (mul_nonneg (by norm_num) (pairProbeFactor_nonneg hP hStruct center α β)) + (factorMomentSum_nonneg hP4) + +/-- Rosenthal partition-average estimate for normalized coordinate probes, +with the origin moment supplied internally by `(P4)`. -/ +theorem coordinateProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) (α : BlockCoord d) : + let K := + 2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockCoordinateProbe α)) a| ^ hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * K) := by + classical + dsimp only + let K := + 2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + have hOrigin := + coordinateProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 center α + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := center) (n := 0) (m := m) (K := K) + (by norm_num) hm + (by simpa [K] using + coordinateProbe_partition_K_nonneg hP hStruct hP4 center α) + hOrigin.1 (by simpa [K, Ch04.annealedMomentRoot, one_div] using hOrigin.2) + +/-- Rosenthal partition-average estimate for normalized plus-pair probes, +with the origin moment supplied internally by `(P4)`. -/ +theorem plusProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockPlusProbe α β)) a| ^ hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * K) := by + classical + dsimp only + let K := + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + have hOrigin := + plusProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 center hαβ + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 (q := fullBlockPlusProbe α β) + (center := center) (n := 0) (m := m) (K := K) + (by norm_num) hm + (by simpa [K] using + pairProbe_partition_K_nonneg hP hStruct hP4 center α β) + hOrigin.1 (by simpa [K, Ch04.annealedMomentRoot, one_div] using hOrigin.2) + +/-- Rosenthal partition-average estimate for normalized minus-pair probes, +with the origin moment supplied internally by `(P4)`. -/ +theorem minusProbe_restrictionCenteredDescendantAverage_pow_rpow_inv_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {center m : ℤ} (hm : 0 ≤ m) {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 m + (fullBlockNormalizedQuadraticObservableR hP hStruct center + (fullBlockMinusProbe α β)) a| ^ hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * K) := by + classical + dsimp only + let K := + 2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + have hOrigin := + minusProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 center hαβ + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 (q := fullBlockMinusProbe α β) + (center := center) (n := 0) (m := m) (K := K) + (by norm_num) hm + (by simpa [K] using + pairProbe_partition_K_nonneg hP hStruct hP4 center α β) + hOrigin.1 (by simpa [K, Ch04.annealedMomentRoot, one_div] using hOrigin.2) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedAssembly.lean new file mode 100644 index 0000000000..203bc9b5d3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedAssembly.lean @@ -0,0 +1,276 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedScalarVariance +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.MatrixVariance + +/-! # Refined Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Refined matrix assembly + +This file plugs the refined scalar probe estimates into the finite-dimensional +matrix upgrade. The per-scale budget is now expressed in terms of `delta` and +`\widetilde\Theta_0`. +-/ + +/-- Refined coordinate-probe scalar variance budget at scale `j`. -/ +noncomputable def coordinateProbeRefinedVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) (α : BlockCoord d) : ℝ := + refinedScalarProbeVarianceBound delta (fullBlockCoordinateProbe α) + (coordinateProbeRefinedDescendantAverageK hP4 delta j) + +/-- Refined plus-pair scalar variance budget at scale `j`. -/ +noncomputable def plusProbeRefinedVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) (α β : BlockCoord d) : ℝ := + refinedScalarProbeVarianceBound delta (fullBlockPlusProbe α β) + (pairProbeRefinedDescendantAverageK hP4 delta j) + +/-- Refined minus-pair scalar variance budget at scale `j`. -/ +noncomputable def minusProbeRefinedVarianceBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) (α β : BlockCoord d) : ℝ := + refinedScalarProbeVarianceBound delta (fullBlockMinusProbe α β) + (pairProbeRefinedDescendantAverageK hP4 delta j) + +/-- Refined finite-probe matrix variance budget at one scale. -/ +noncomputable def refinedMatrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + (coordinateProbeRefinedVarianceBound hP4 delta j α + + (if α = β then + 16 * coordinateProbeRefinedVarianceBound hP4 delta j α + else + plusProbeRefinedVarianceBound hP4 delta j α β) + + (if α = β then + 0 + else + minusProbeRefinedVarianceBound hP4 delta j α β))) + +private theorem integral_plusProbe_self_sq_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m j : ℕ) (α : BlockCoord d) : + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α α)) ^ (2 : ℕ) ∂P = + 16 * + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P := by + have hpoint : + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α α)) ^ (2 : ℕ)) + = + fun a : RegCoeffField d => + 16 * + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) := by + funext a + rw [fullBlockQuadratic_plusProbe_self] + ring + rw [hpoint, integral_const_mul] + +private theorem integral_minusProbe_self_sq_eq_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m j : ℕ) (α : BlockCoord d) : + ∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α α)) ^ (2 : ℕ) ∂P = 0 := by + have hpoint : + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α α)) ^ (2 : ℕ)) + = + fun _a : RegCoeffField d => 0 := by + funext a + rw [fullBlockQuadratic_minusProbe_self] + norm_num + rw [hpoint, integral_zero] + +/-- Per-scale matrix variance bound using the refined scalar probe estimates. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_refinedMatrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P ≤ + refinedMatrixVarianceScaleBound hP4 delta j := by + let Ccoord : BlockCoord d → ℝ := + coordinateProbeRefinedVarianceBound hP4 delta j + let Cplus : BlockCoord d → BlockCoord d → ℝ := fun α β => + if α = β then 16 * Ccoord α else plusProbeRefinedVarianceBound hP4 delta j α β + let Cminus : BlockCoord d → BlockCoord d → ℝ := fun α β => + if α = β then 0 else minusProbeRefinedVarianceBound hP4 delta j α β + have hcoord_int : ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P := by + intro α + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockCoordinateProbe α) + have hplus_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ)) P := by + intro α β + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockPlusProbe α β) + have hminus_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ)) P := by + intro α β + exact integrable_fluctuationQuadratic_sq_from_P4 + hP hStruct hP4 m j (fullBlockMinusProbe α β) + have hcoord : ∀ α : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P) ≤ Ccoord α := by + intro α + rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockCoordinateProbe α)] + simpa [Ccoord, coordinateProbeRefinedVarianceBound, refinedScalarProbeVarianceBound] using + coordinateProbe_scalarVariance_good_origin_le_refined + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower α + have hplus : ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cplus α β := by + intro α β + by_cases hαβ : α = β + · subst β + rw [integral_plusProbe_self_sq_eq hP hStruct m j α] + have hc : + (∫ a, + fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a α α ^ (2 : ℕ) ∂P) ≤ + Ccoord α := by + simpa using hcoord α + simp [Cplus] + nlinarith + · rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockPlusProbe α β)] + simpa [Cplus, hαβ, plusProbeRefinedVarianceBound, + refinedScalarProbeVarianceBound] using + plusProbe_scalarVariance_good_origin_le_refined + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower hαβ + have hminus : ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (m : ℤ) + (cubeSet (originCube d (j : ℤ))) a) + (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P) ≤ Cminus α β := by + intro α β + by_cases hαβ : α = β + · subst β + rw [integral_minusProbe_self_sq_eq_zero hP hStruct m j α] + simp [Cminus] + · rw [integral_fluctuationQuadratic_sq_eq_integral_abs_sub_dotProduct_sq + hP hStruct hP4 m j (fullBlockMinusProbe α β)] + simpa [Cminus, hαβ, minusProbeRefinedVarianceBound, + refinedScalarProbeVarianceBound] using + minusProbe_scalarVariance_good_origin_le_refined + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower hαβ + simpa [refinedMatrixVarianceScaleBound, Ccoord, Cplus, Cminus] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_probeBounds + hP hStruct hP4 m j Ccoord Cplus Cminus + hcoord_int hplus_int hminus_int hcoord hplus hminus + +/-- The variance sum is bounded by the beta-weighted refined per-scale budgets. -/ +theorem varianceGoodScaleFullBlockSumAtScale_le_weighted_refinedMatrixVarianceScaleBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + refinedMatrixVarianceScaleBound hP4 delta j := by + refine varianceGoodScaleFullBlockSumAtScale_le_weighted_sum hP hStruct hP4 m ?_ + intro j hj + exact + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_refinedMatrixVarianceScaleBound + hP hStruct hP4 hdelta_nonneg m j (Finset.mem_Icc.mp hj).2 + hgood_upper hgood_lower + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedProbeMoments.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedProbeMoments.lean new file mode 100644 index 0000000000..e679715f53 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedProbeMoments.lean @@ -0,0 +1,772 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeMomentCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds + +/-! # Refined Probe Moments -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory + +noncomputable section + +/-! +# Refined probe moments at a good scale + +The coarse probe moment bounds in `QuadraticProbeBounds` dominate every probe +by one scalar times `Λ + λ⁻¹`. For the final good-scale variance estimate we +need the matched form: upper coordinates cost only the upper unit-scale factor +and lower coordinates cost only the lower inverse factor. This file supplies +that local refinement and compresses it to `\widetilde\Theta_0` using the two +good-scale scalar hypotheses. +-/ + +/-- Upper unit-scale coefficient carried by a coordinate probe after +normalization at scale `m`. It is nonzero only on the upper block. -/ +noncomputable def coordinateProbeUpperCoeffAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℕ) : BlockCoord d → ℝ + | Sum.inl _ => (hP.barSigmaAtScale hStruct (m : ℤ))⁻¹ + | Sum.inr _ => 0 + +/-- Lower unit-scale coefficient carried by a coordinate probe after +normalization at scale `m`. It is nonzero only on the lower block. -/ +noncomputable def coordinateProbeLowerCoeffAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℕ) : BlockCoord d → ℝ + | Sum.inl _ => 0 + | Sum.inr _ => hP.barSigmaStarAtScale hStruct (m : ℤ) + +theorem coordinateProbeUpperCoeffAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (α : BlockCoord d) : + 0 ≤ coordinateProbeUpperCoeffAtScale hP hStruct m α := by + cases α with + | inl i => + exact (inv_pos.mpr + (Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m)).le + | inr i => + simp [coordinateProbeUpperCoeffAtScale] + +theorem coordinateProbeLowerCoeffAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (α : BlockCoord d) : + 0 ≤ coordinateProbeLowerCoeffAtScale hP hStruct m α := by + cases α with + | inl i => + simp [coordinateProbeLowerCoeffAtScale] + | inr i => + exact (Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m).le + +private theorem scalarFullBlockInvSqrtDiag_upper_abs_mul_self + {d : ℕ} {b c : ℝ} (hb : 0 < b) (i : Fin d) : + |Ch04.scalarFullBlockInvSqrtDiag (d := d) b c (Sum.inl i)| * + |Ch04.scalarFullBlockInvSqrtDiag (d := d) b c (Sum.inl i)| = + b⁻¹ := by + have hsqrt_pos : 0 < Real.sqrt b := Real.sqrt_pos.mpr hb + have hsqrt_ne : Real.sqrt b ≠ 0 := hsqrt_pos.ne' + simp [Ch04.scalarFullBlockInvSqrtDiag, + abs_of_pos (inv_pos.mpr hsqrt_pos)] + field_simp [hsqrt_ne] + rw [Real.sq_sqrt hb.le] + +private theorem scalarFullBlockInvSqrtDiag_lower_abs_mul_self + {d : ℕ} {b c : ℝ} (hc : 0 < c) (i : Fin d) : + |Ch04.scalarFullBlockInvSqrtDiag (d := d) b c (Sum.inr i)| * + |Ch04.scalarFullBlockInvSqrtDiag (d := d) b c (Sum.inr i)| = + c := by + have hsqrt_nonneg : 0 ≤ Real.sqrt c := Real.sqrt_nonneg c + simp [Ch04.scalarFullBlockInvSqrtDiag, abs_of_nonneg hsqrt_nonneg] + rw [← sq, Real.sq_sqrt hc.le] + +/-- Matched pointwise domination for coordinate probes: upper coordinates see +only the upper unit-scale factor, lower coordinates only the lower inverse +factor. -/ +theorem fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_weighted_factors_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (α : BlockCoord d) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + coordinateProbeUpperCoeffAtScale hP hStruct m α * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + coordinateProbeLowerCoeffAtScale hP hStruct m α * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + cases α with + | inl i => + filter_upwards + [Ch04.RestrictionLawCarrier.upperLeft_abs_entry_le_LambdaSqCoeffField_ae + hP (originCube d 0) hP4.sUpper_pos i i] with a hentry + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + let L := Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + have hb : 0 < b := by + simpa [b] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hcoeff : + |r (Sum.inl i)| * |r (Sum.inl i)| = b⁻¹ := by + simpa [r] using + scalarFullBlockInvSqrtDiag_upper_abs_mul_self (d := d) (b := b) (c := c) hb i + have hquad : + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe (Sum.inl i)) (cubeSet (originCube d 0)) a = + r (Sum.inl i) * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) + (Sum.inl i) (Sum.inl i) * + r (Sum.inl i) := by + simpa [fullBlockNormalizedQuadraticObservable, b, c, r] using + fullBlockQuadratic_diagonal_coordinateProbe r + (coarseBlockMatrix (cubeSet (originCube d 0)) a) (Sum.inl i) + calc + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe (Sum.inl i)) (cubeSet (originCube d 0)) a| + = + |r (Sum.inl i) * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) + (Sum.inl i) (Sum.inl i) * + r (Sum.inl i)| := by rw [hquad] + _ ≤ |r (Sum.inl i)| * |r (Sum.inl i)| * L := by + simpa [L, blockMatEntry] using + abs_mul_entry_mul_le_factor + (x := r (Sum.inl i)) (y := r (Sum.inl i)) + (e := (coarseBlockMatrix (cubeSet (originCube d 0)) a).upperLeft i i) + hentry + _ = + coordinateProbeUpperCoeffAtScale hP hStruct m (Sum.inl i) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + coordinateProbeLowerCoeffAtScale hP hStruct m (Sum.inl i) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + simp [coordinateProbeUpperCoeffAtScale, coordinateProbeLowerCoeffAtScale, + b, L, hcoeff] + | inr i => + filter_upwards + [Ch04.RestrictionLawCarrier.lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae + hP (originCube d 0) hP4.sLower_pos i i] with a hentry + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + let I := + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + have hc : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hcoeff : + |r (Sum.inr i)| * |r (Sum.inr i)| = c := by + simpa [r] using + scalarFullBlockInvSqrtDiag_lower_abs_mul_self (d := d) (b := b) (c := c) hc i + have hquad : + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe (Sum.inr i)) (cubeSet (originCube d 0)) a = + r (Sum.inr i) * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) + (Sum.inr i) (Sum.inr i) * + r (Sum.inr i) := by + simpa [fullBlockNormalizedQuadraticObservable, b, c, r] using + fullBlockQuadratic_diagonal_coordinateProbe r + (coarseBlockMatrix (cubeSet (originCube d 0)) a) (Sum.inr i) + calc + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe (Sum.inr i)) (cubeSet (originCube d 0)) a| + = + |r (Sum.inr i) * + blockMatEntry (coarseBlockMatrix (cubeSet (originCube d 0)) a) + (Sum.inr i) (Sum.inr i) * + r (Sum.inr i)| := by rw [hquad] + _ ≤ |r (Sum.inr i)| * |r (Sum.inr i)| * I := by + simpa [I, blockMatEntry] using + abs_mul_entry_mul_le_factor + (x := r (Sum.inr i)) (y := r (Sum.inr i)) + (e := (coarseBlockMatrix (cubeSet (originCube d 0)) a).lowerRight i i) + hentry + _ = + coordinateProbeUpperCoeffAtScale hP hStruct m (Sum.inr i) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + coordinateProbeLowerCoeffAtScale hP hStruct m (Sum.inr i) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + simp [coordinateProbeUpperCoeffAtScale, coordinateProbeLowerCoeffAtScale, + c, I, hcoeff] + +private theorem isSymmetricBlockMat_coarseBlockMatrix_origin_of_ae + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) : + IsSymmetricBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a) := by + let Q : TriadicCube d := originCube d 0 + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [show originCube d 0 = Q from rfl, hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + +private theorem fullBlockNormalizedQuadraticObservable_plus_add_minus_eq_two_coord_sum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℕ) {α β : BlockCoord d} (hαβ : α ≠ β) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockPlusProbe α β) (cubeSet (originCube d 0)) a + + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockMinusProbe α β) (cubeSet (originCube d 0)) a = + 2 * + (fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a + + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe β) (cubeSet (originCube d 0)) a) := by + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let r := Ch04.scalarFullBlockInvSqrtDiag (d := d) b c + let A := coarseBlockMatrix (cubeSet (originCube d 0)) a + have hSymm : IsSymmetricBlockMat A := by + simpa [A] using isSymmetricBlockMat_coarseBlockMatrix_origin_of_ae ha + have hplus := + fullBlockQuadratic_diagonal_plusProbe_of_ne + (d := d) r (A := A) hSymm hαβ + have hminus := + fullBlockQuadratic_diagonal_minusProbe_of_ne + (d := d) r (A := A) hSymm hαβ + have hcoordα := + fullBlockQuadratic_diagonal_coordinateProbe + (d := d) r A α + have hcoordβ := + fullBlockQuadratic_diagonal_coordinateProbe + (d := d) r A β + simpa [fullBlockNormalizedQuadraticObservable, b, c, r, A, + hplus, hminus, hcoordα, hcoordβ] using + (by ring : + (r α * blockMatEntry A α α * r α + + 2 * (r α * blockMatEntry A α β * r β) + + r β * blockMatEntry A β β * r β) + + (r α * blockMatEntry A α α * r α - + 2 * (r α * blockMatEntry A α β * r β) + + r β * blockMatEntry A β β * r β) = + 2 * + ((r α * blockMatEntry A α α * r α) + + (r β * blockMatEntry A β β * r β))) + +private theorem fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_weighted_factors_ae_aux + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) {α β : BlockCoord d} (_hαβ : α ≠ β) + (probe otherProbe : FullBlockVec d) + (hsum : + ∀ {a : RegCoeffField d}, Ch04.AELocallyUniformlyEllipticField a → + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a + + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + otherProbe (cubeSet (originCube d 0)) a = + 2 * + (fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a + + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe β) (cubeSet (originCube d 0)) a)) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + have hcoordα := + fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_weighted_factors_ae + hP hStruct hP4 m α + have hcoordβ := + fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_weighted_factors_ae + hP hStruct hP4 m β + filter_upwards + [hcoordα, hcoordβ, hP.ae_locallyUniformlyEllipticField, + fullBlockNormalizedQuadraticObservable_nonneg_ae + hP hStruct (m : ℤ) probe (originCube d 0), + fullBlockNormalizedQuadraticObservable_nonneg_ae + hP hStruct (m : ℤ) otherProbe (originCube d 0)] + with a hα hβ hae hprobe_nonneg hother_nonneg + let X := + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a + let Y := + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + otherProbe (cubeSet (originCube d 0)) a + let A := + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a + let B := + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe β) (cubeSet (originCube d 0)) a + let L := Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + let I := + (Ch04.lambdaSqCoeffField (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ + let Cuα := coordinateProbeUpperCoeffAtScale hP hStruct m α + let Cuβ := coordinateProbeUpperCoeffAtScale hP hStruct m β + let Clα := coordinateProbeLowerCoeffAtScale hP hStruct m α + let Clβ := coordinateProbeLowerCoeffAtScale hP hStruct m β + have hX_nonneg : 0 ≤ X := by simpa [X] using hprobe_nonneg + have hY_nonneg : 0 ≤ Y := by simpa [Y] using hother_nonneg + have hsum_point : X + Y = 2 * (A + B) := by + simpa [X, Y, A, B] using hsum (a := a) hae + have hX_le_two : + X ≤ 2 * (A + B) := by + calc + X ≤ X + Y := by linarith + _ = 2 * (A + B) := hsum_point + have hA_le : A ≤ Cuα * L + Clα * I := by + calc + A ≤ |A| := le_abs_self A + _ ≤ Cuα * L + Clα * I := by simpa [A, L, I, Cuα, Clα] using hα + have hB_le : B ≤ Cuβ * L + Clβ * I := by + calc + B ≤ |B| := le_abs_self B + _ ≤ Cuβ * L + Clβ * I := by simpa [B, L, I, Cuβ, Clβ] using hβ + have htwo : + 2 * (A + B) ≤ + (2 * (Cuα + Cuβ)) * L + (2 * (Clα + Clβ)) * I := by + nlinarith + calc + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a| + = X := by simp [X, abs_of_nonneg hX_nonneg] + _ ≤ 2 * (A + B) := hX_le_two + _ ≤ (2 * (Cuα + Cuβ)) * L + (2 * (Clα + Clβ)) * I := htwo + _ = + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + simp [Cuα, Cuβ, Clα, Clβ, L, I] + +/-- Matched pointwise domination for plus probes. -/ +theorem fullBlockNormalizedQuadraticObservable_plusProbe_abs_le_weighted_factors_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) {α β : BlockCoord d} (hαβ : α ≠ β) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockPlusProbe α β) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + refine + fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_weighted_factors_ae_aux + hP hStruct hP4 m hαβ + (fullBlockPlusProbe α β) (fullBlockMinusProbe α β) ?_ + intro a ha + exact + fullBlockNormalizedQuadraticObservable_plus_add_minus_eq_two_coord_sum + hP hStruct m hαβ ha + +/-- Matched pointwise domination for minus probes. -/ +theorem fullBlockNormalizedQuadraticObservable_minusProbe_abs_le_weighted_factors_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) {α β : BlockCoord d} (hαβ : α ≠ β) : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockMinusProbe α β) (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹ := by + refine + fullBlockNormalizedQuadraticObservable_pairProbe_abs_le_weighted_factors_ae_aux + hP hStruct hP4 m hαβ + (fullBlockMinusProbe α β) (fullBlockPlusProbe α β) ?_ + intro a ha + have h := + fullBlockNormalizedQuadraticObservable_plus_add_minus_eq_two_coord_sum + hP hStruct m hαβ ha + linarith + +private theorem fullBlockNormalizedQuadraticObservable_origin_regular' + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d 0)) a) P := by + rcases exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q (originCube d 0) with ⟨Y, hY_local, hY_eq⟩ + exact (hP.aemeasurable_of_isLocalRandomVariable hY_local).congr hY_eq.symm + +private theorem coordinateProbe_weighted_moments_le_one_add_delta_mul_widetildeTheta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α : BlockCoord d) : + coordinateProbeUpperCoeffAtScale hP hStruct m α * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + coordinateProbeLowerCoeffAtScale hP hStruct m α * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi ≤ + (1 + delta) * widetildeThetaAtScale P 0 hP4 := by + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + have hL0_nonneg : 0 ≤ L0 := by + simpa [L0] using Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hl0_nonneg : 0 ≤ l0 := by + simpa [l0] using Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + cases α with + | inl i => + have hcoeff : + (hP.barSigmaAtScale hStruct (m : ℤ))⁻¹ ≤ (1 + delta) * l0 := by + simpa [l0] using + barSigmaAtScale_inv_le_one_add_delta_mul_lambdaInvMomentAtScale_zero_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper + calc + coordinateProbeUpperCoeffAtScale hP hStruct m (Sum.inl i) * L0 + + coordinateProbeLowerCoeffAtScale hP hStruct m (Sum.inl i) * l0 + = (hP.barSigmaAtScale hStruct (m : ℤ))⁻¹ * L0 := by + simp [coordinateProbeUpperCoeffAtScale, coordinateProbeLowerCoeffAtScale, L0, l0] + _ ≤ ((1 + delta) * l0) * L0 := + mul_le_mul_of_nonneg_right hcoeff hL0_nonneg + _ = (1 + delta) * widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + ring + | inr i => + have hcoeff : + hP.barSigmaStarAtScale hStruct (m : ℤ) ≤ (1 + delta) * L0 := by + simpa [L0] using + barSigmaStarAtScale_le_one_add_delta_mul_LambdaMomentAtScale_zero_of_good + hP hStruct hP4 hdelta_nonneg m hgood_lower + calc + coordinateProbeUpperCoeffAtScale hP hStruct m (Sum.inr i) * L0 + + coordinateProbeLowerCoeffAtScale hP hStruct m (Sum.inr i) * l0 + = hP.barSigmaStarAtScale hStruct (m : ℤ) * l0 := by + simp [coordinateProbeUpperCoeffAtScale, coordinateProbeLowerCoeffAtScale, L0, l0] + _ ≤ ((1 + delta) * L0) * l0 := + mul_le_mul_of_nonneg_right hcoeff hl0_nonneg + _ = (1 + delta) * widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + ring + +private theorem pairProbe_weighted_moments_le_four_mul_one_add_delta_mul_widetildeTheta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α β : BlockCoord d) : + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi ≤ + 4 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let Θ0 := widetildeThetaAtScale P 0 hP4 + have hα : + coordinateProbeUpperCoeffAtScale hP hStruct m α * L0 + + coordinateProbeLowerCoeffAtScale hP hStruct m α * l0 ≤ + (1 + delta) * Θ0 := by + simpa [L0, l0, Θ0] using + coordinateProbe_weighted_moments_le_one_add_delta_mul_widetildeTheta + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower α + have hβ : + coordinateProbeUpperCoeffAtScale hP hStruct m β * L0 + + coordinateProbeLowerCoeffAtScale hP hStruct m β * l0 ≤ + (1 + delta) * Θ0 := by + simpa [L0, l0, Θ0] using + coordinateProbe_weighted_moments_le_one_add_delta_mul_widetildeTheta + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower β + nlinarith + +/-- Centered origin moment for coordinate probes, compressed to +`\widetilde\Theta_0` by the good-scale hypotheses. -/ +theorem coordinateProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α : BlockCoord d) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a|) + ≤ + 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + let X : RegCoeffField d → ℝ := + fun a => + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d 0)) a + let Cu := coordinateProbeUpperCoeffAtScale hP hStruct m α + let Cl := coordinateProbeLowerCoeffAtScale hP hStruct m α + have hX_meas : AEMeasurable X P := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_origin_regular' + hP hStruct (m : ℤ) (fullBlockCoordinateProbe α) + have hbridge := + section54_centeredOrigin_momentRoot_le_weighted_factor_sum_of_abs_le + hP hStruct hP4 + (CUpper := Cu) (CLower := Cl) + (by simpa [Cu] using + coordinateProbeUpperCoeffAtScale_nonneg hP hStruct hP4 m α) + (by simpa [Cl] using + coordinateProbeLowerCoeffAtScale_nonneg hP hStruct hP4 m α) + (X := X) hX_meas + (by + simpa [X, Cu, Cl] using + fullBlockNormalizedQuadraticObservable_coordinateProbe_abs_le_weighted_factors_ae + hP hStruct hP4 m α) + refine ⟨?_, ?_⟩ + · simpa [X, Ch04.restrictionCenteredOriginObservable] using! hbridge.1 + · have hweighted := + coordinateProbe_weighted_moments_le_one_add_delta_mul_widetildeTheta + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower α + calc + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a|) + ≤ 2 * + (Cu * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Cl * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + simpa [X, Ch04.restrictionCenteredOriginObservable, Cu, Cl] using! hbridge.2 + _ ≤ 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := + mul_le_mul_of_nonneg_left hweighted (by norm_num) + +private theorem pairProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good_aux + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (_hαβ : α ≠ β) (probe : FullBlockVec d) + (hbound : + (fun a : RegCoeffField d => + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a|) + ≤ᵐ[P] + fun a => + (2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β)) * + Ch04.LambdaSqCoeffField (originCube d 0) hP4.sUpper (.finite 1) a + + (2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β)) * + (Ch04.lambdaSqCoeffField + (originCube d 0) hP4.sLower (.finite 1) a)⁻¹) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + probe) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + probe) a|) + ≤ + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + let X : RegCoeffField d → ℝ := + fun a => + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + probe (cubeSet (originCube d 0)) a + let Cu := 2 * + (coordinateProbeUpperCoeffAtScale hP hStruct m α + + coordinateProbeUpperCoeffAtScale hP hStruct m β) + let Cl := 2 * + (coordinateProbeLowerCoeffAtScale hP hStruct m α + + coordinateProbeLowerCoeffAtScale hP hStruct m β) + have hCu_nonneg : 0 ≤ Cu := by + dsimp [Cu] + nlinarith + [coordinateProbeUpperCoeffAtScale_nonneg hP hStruct hP4 m α, + coordinateProbeUpperCoeffAtScale_nonneg hP hStruct hP4 m β] + have hCl_nonneg : 0 ≤ Cl := by + dsimp [Cl] + nlinarith + [coordinateProbeLowerCoeffAtScale_nonneg hP hStruct hP4 m α, + coordinateProbeLowerCoeffAtScale_nonneg hP hStruct hP4 m β] + have hX_meas : AEMeasurable X P := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_origin_regular' + hP hStruct (m : ℤ) probe + have hbridge := + section54_centeredOrigin_momentRoot_le_weighted_factor_sum_of_abs_le + hP hStruct hP4 + (CUpper := Cu) (CLower := Cl) + hCu_nonneg hCl_nonneg + (X := X) hX_meas + (by simpa [X, Cu, Cl] using hbound) + refine ⟨?_, ?_⟩ + · simpa [X, Ch04.restrictionCenteredOriginObservable] using! hbridge.1 + · have hweighted := + pairProbe_weighted_moments_le_four_mul_one_add_delta_mul_widetildeTheta + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower α β + calc + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + probe) a|) + ≤ 2 * + (Cu * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Cl * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) := by + simpa [X, Ch04.restrictionCenteredOriginObservable, Cu, Cl] using! hbridge.2 + _ ≤ 2 * (4 * ((1 + delta) * widetildeThetaAtScale P 0 hP4)) := + mul_le_mul_of_nonneg_left hweighted (by norm_num) + _ = 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by ring + +/-- Centered origin moment for plus probes, compressed to +`\widetilde\Theta_0` by the good-scale hypotheses. -/ +theorem plusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a|) + ≤ + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := + pairProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good_aux + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ + (fullBlockPlusProbe α β) + (fullBlockNormalizedQuadraticObservable_plusProbe_abs_le_weighted_factors_ae + hP hStruct hP4 m hαβ) + +/-- Centered origin moment for minus probes, compressed to +`\widetilde\Theta_0` by the good-scale hypotheses. -/ +theorem minusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a|) + ≤ + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := + pairProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good_aux + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ + (fullBlockMinusProbe α β) + (fullBlockNormalizedQuadraticObservable_minusProbe_abs_le_weighted_factors_ae + hP hStruct hP4 m hαβ) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedScalarVariance.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedScalarVariance.lean new file mode 100644 index 0000000000..8f1a46ed65 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/RefinedScalarVariance.lean @@ -0,0 +1,391 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.RefinedProbeMoments +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScalarVariance + +/-! # Refined Scalar Variance -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Refined scalar variance estimates + +This file reuses the scalar positive-part reduction from `ScalarVariance`, but +feeds it the sharper good-scale Rosenthal inputs from `RefinedProbeMoments`. +The resulting descendant-average budgets are expressed in terms of +`\widetilde\Theta_0`. +-/ + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +private theorem coordinateProbeOriginMomentBudget_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) : + 0 ≤ 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + have hfactor : 0 ≤ 1 + delta := by linarith + exact mul_nonneg (by norm_num) + (mul_nonneg hfactor (widetildeThetaAtScale_zero_nonneg hP4)) + +private theorem pairProbeOriginMomentBudget_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) : + 0 ≤ 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) := by + have hfactor : 0 ≤ 1 + delta := by linarith + exact mul_nonneg (by norm_num) + (mul_nonneg hfactor (widetildeThetaAtScale_zero_nonneg hP4)) + +/-- Refined descendant-average budget for coordinate probes. -/ +noncomputable def coordinateProbeRefinedDescendantAverageK + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) : ℝ := + let K0 := 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) + ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K0 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) * K0) + +/-- Refined descendant-average budget for plus/minus pair probes. -/ +noncomputable def pairProbeRefinedDescendantAverageK + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (delta : ℝ) (j : ℕ) : ℝ := + let K0 := 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) + ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * K0 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d (j : ℤ)) 0).card : ℝ) * K0) + +/-- Scalar variance budget for a single probe and refined descendant-average +budget `K`. -/ +noncomputable def refinedScalarProbeVarianceBound + {d : ℕ} (delta : ℝ) (q : FullBlockVec d) (K : ℝ) : ℝ := + 4 * (delta * dotProduct q q) ^ (2 : ℕ) + 4 * K ^ (2 : ℕ) + + 2 * dotProduct q q * (delta * dotProduct q q + K) + +/-- L1/L2 descendant-average bounds for coordinate probes with the refined +good-scale moment budget. -/ +theorem coordinateProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α : BlockCoord d) : + let K := coordinateProbeRefinedDescendantAverageK hP4 delta j + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + dsimp only + let K0 := 2 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) + let K := coordinateProbeRefinedDescendantAverageK hP4 delta j + have hOrigin := + coordinateProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower α + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + have hraw := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) (K := K0) + (by norm_num) (by exact_mod_cast Nat.zero_le j) + (by simpa [K0] using + coordinateProbeOriginMomentBudget_nonneg hP4 hdelta_nonneg) + hOrigin.1 (by simpa [K0, Ch04.annealedMomentRoot, one_div] using hOrigin.2) + simpa [K, coordinateProbeRefinedDescendantAverageK, K0] using hraw + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 hroot + +private theorem pairProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined_aux + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) + (_hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (_hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (_hαβ : α ≠ β) (probe : FullBlockVec d) + (hOrigin : + Integrable + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + probe) a| ^ hP4.xi) P ∧ + Ch04.annealedMomentRoot P hP4.xi + (fun a => + |Ch04.restrictionCenteredOriginObservable P 0 + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + probe) a|) + ≤ + 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4)) : + let K := pairProbeRefinedDescendantAverageK hP4 delta j + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) probe) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) probe) a| ^ + (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + dsimp only + let K0 := 8 * ((1 + delta) * widetildeThetaAtScale P 0 hP4) + let K := pairProbeRefinedDescendantAverageK hP4 delta j + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) probe) a| ^ + hP4.xi ∂P) ^ + (1 / (hP4.xi : ℝ)) ≤ K := by + have hraw := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_pow_rpow_inv_le + hP hStruct hP4 (q := probe) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) (K := K0) + (by norm_num) (by exact_mod_cast Nat.zero_le j) + (by simpa [K0] using pairProbeOriginMomentBudget_nonneg hP4 hdelta_nonneg) + hOrigin.1 (by simpa [K0, Ch04.annealedMomentRoot, one_div] using hOrigin.2) + simpa [K, pairProbeRefinedDescendantAverageK, K0] using hraw + exact + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_le_of_root + hP hStruct hP4 (q := probe) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 hroot + +/-- L1/L2 descendant-average bounds for plus probes with the refined +good-scale moment budget. -/ +theorem plusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeRefinedDescendantAverageK hP4 delta j + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := + pairProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined_aux + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower hαβ + (fullBlockPlusProbe α β) + (plusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ) + +/-- L1/L2 descendant-average bounds for minus probes with the refined +good-scale moment budget. -/ +theorem minusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeRefinedDescendantAverageK hP4 delta j + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := + pairProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined_aux + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower hαβ + (fullBlockMinusProbe α β) + (minusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ) + +/-- Coordinate-probe scalar variance estimate using the refined descendant +average budget. -/ +theorem coordinateProbe_scalarVariance_good_origin_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α : BlockCoord d) : + let K := coordinateProbeRefinedDescendantAverageK hP4 delta j + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α)| ^ + (2 : ℕ) ∂P ≤ + refinedScalarProbeVarianceBound delta (fullBlockCoordinateProbe α) K := by + dsimp only + let K := coordinateProbeRefinedDescendantAverageK hP4 delta j + have hOrigin := + coordinateProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower α + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le := + coordinateProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower α + simpa [K, refinedScalarProbeVarianceBound] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockCoordinateProbe α) hZ_int hZ_le + +/-- Plus-probe scalar variance estimate using the refined descendant-average +budget. -/ +theorem plusProbe_scalarVariance_good_origin_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeRefinedDescendantAverageK hP4 delta j + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockPlusProbe α β) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β)| ^ + (2 : ℕ) ∂P ≤ + refinedScalarProbeVarianceBound delta (fullBlockPlusProbe α β) K := by + dsimp only + let K := pairProbeRefinedDescendantAverageK hP4 delta j + have hOrigin := + plusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockPlusProbe α β) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le := + plusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower hαβ + simpa [K, refinedScalarProbeVarianceBound] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockPlusProbe α β) hZ_int hZ_le + +/-- Minus-probe scalar variance estimate using the refined descendant-average +budget. -/ +theorem minusProbe_scalarVariance_good_origin_le_refined + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeRefinedDescendantAverageK hP4 delta j + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockMinusProbe α β) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β)| ^ + (2 : ℕ) ∂P ≤ + refinedScalarProbeVarianceBound delta (fullBlockMinusProbe α β) K := by + dsimp only + let K := pairProbeRefinedDescendantAverageK hP4 delta j + have hOrigin := + minusProbe_centeredOrigin_momentRoot_le_widetildeTheta_of_good + hP hStruct hP4 hdelta_nonneg m hgood_upper hgood_lower hαβ + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockMinusProbe α β) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le := + minusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le_refined + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower hαβ + simpa [K, refinedScalarProbeVarianceBound] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockMinusProbe α β) hZ_int hZ_le + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarL2.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarL2.lean new file mode 100644 index 0000000000..5c5c88eb2b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarL2.lean @@ -0,0 +1,318 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.QuadraticProbeBounds + +/-! # Scalar L2 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Scalar L2 reduction for good-scale probes + +This file contains the probabilistic real-variable step used after the +subadditivity positive-part estimate: if the positive excess over the annealed +base is controlled by a small deterministic error plus a centered partition +average, then the full square fluctuation is controlled by the L1 and L2 sizes +of that partition average. +-/ + +private theorem real_self_eq_posPart_sub_negPart (x : ℝ) : + x = max x 0 - max (-x) 0 := by + by_cases hx : 0 ≤ x + · have hneg : max (-x) 0 = 0 := max_eq_right (by linarith) + have hpos : max x 0 = x := max_eq_left hx + simp [hpos, hneg] + · have hxle : x ≤ 0 := le_of_not_ge hx + have hpos : max x 0 = 0 := max_eq_right hxle + have hneg : max (-x) 0 = -x := max_eq_left (by linarith) + simp [hpos, hneg] + +private theorem abs_sub_sq_le_two_pos_neg_sq {x base : ℝ} : + |x - base| ^ (2 : ℕ) ≤ + 2 * (max (x - base) 0) ^ (2 : ℕ) + + 2 * (max (base - x) 0) ^ (2 : ℕ) := by + let u := max (x - base) 0 + let v := max (base - x) 0 + have habs : |x - base| = u + v := by + by_cases h : base ≤ x + · have hx : 0 ≤ x - base := sub_nonneg.mpr h + have hb : base - x ≤ 0 := sub_nonpos.mpr h + simp [u, v, max_eq_left hx, max_eq_right hb, abs_of_nonneg hx] + · have hxb : x ≤ base := le_of_not_ge h + have hx : x - base ≤ 0 := sub_nonpos.mpr hxb + have hb : 0 ≤ base - x := sub_nonneg.mpr hxb + simp [u, v, max_eq_right hx, max_eq_left hb, abs_of_nonpos hx] + rw [habs] + nlinarith [sq_nonneg (u - v)] + +private theorem add_abs_sq_le_two {err z : ℝ} : + (err + |z|) ^ (2 : ℕ) ≤ + 2 * err ^ (2 : ℕ) + 2 * |z| ^ (2 : ℕ) := by + nlinarith [sq_nonneg (err - |z|)] + +private theorem max_sub_zero_abs_le (x base : ℝ) : + max (x - base) 0 ≤ |x - base| := + max_le (le_abs_self _) (abs_nonneg _) + +private theorem max_base_sub_zero_abs_le (x base : ℝ) : + max (base - x) 0 ≤ |x - base| := by + have h : |base - x| = |x - base| := by rw [abs_sub_comm] + rw [← h] + exact max_le (le_abs_self _) (abs_nonneg _) + +/-- Real/probability L2 reduction for one scalar probe. + +The assumptions are intentionally proof-facing and will be supplied internally +for the coordinate and pair probes; the public Section 5.4 theorem does not +expose these measurability or integrability packages. -/ +theorem integral_abs_sub_sq_le_of_positivePart_control + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {X Z : Ω → ℝ} {base err : ℝ} + (hbase_nonneg : 0 ≤ base) (_herr_nonneg : 0 ≤ err) + (hX_nonneg : ∀ᵐ ω ∂μ, 0 ≤ X ω) + (hmean_lower : base ≤ ∫ ω, X ω ∂μ) + (hX_int : Integrable X μ) + (hpos_int : Integrable (fun ω => (max (X ω - base) 0) ^ (2 : ℕ)) μ) + (hneg_int : Integrable (fun ω => (max (base - X ω) 0) ^ (2 : ℕ)) μ) + (hpos_one_int : Integrable (fun ω => max (X ω - base) 0) μ) + (hneg_one_int : Integrable (fun ω => max (base - X ω) 0) μ) + (hZ_abs_int : Integrable (fun ω => |Z ω|) μ) + (hZ_sq_int : Integrable (fun ω => |Z ω| ^ (2 : ℕ)) μ) + (hpos : (fun ω => max (X ω - base) 0) ≤ᵐ[μ] fun ω => err + |Z ω|) : + ∫ ω, |X ω - base| ^ (2 : ℕ) ∂μ ≤ + 4 * err ^ (2 : ℕ) + 4 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ + + 2 * base * (err + ∫ ω, |Z ω| ∂μ) := by + let U : Ω → ℝ := fun ω => max (X ω - base) 0 + let V : Ω → ℝ := fun ω => max (base - X ω) 0 + have hU_nonneg : ∀ ω, 0 ≤ U ω := fun ω => le_max_right _ _ + have hV_nonneg : ∀ ω, 0 ≤ V ω := fun ω => le_max_right _ _ + have hdiff : (fun ω => X ω - base) = fun ω => U ω - V ω := by + funext ω + have h := real_self_eq_posPart_sub_negPart (X ω - base) + simpa [U, V, sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using h + have hconst_int : Integrable (fun _ : Ω => base) μ := integrable_const base + have hmean_diff_nonneg : 0 ≤ ∫ ω, X ω - base ∂μ := by + rw [integral_sub hX_int hconst_int] + have hconst : (∫ _ω : Ω, base ∂μ) = base := by + rw [integral_const] + simp + rw [hconst] + linarith + have hV_le_U_integral : ∫ ω, V ω ∂μ ≤ ∫ ω, U ω ∂μ := by + have hdiff_int_eq : ∫ ω, X ω - base ∂μ = ∫ ω, U ω - V ω ∂μ := by + rw [hdiff] + rw [integral_sub hpos_one_int hneg_one_int] at hdiff_int_eq + linarith + have hU_le_err_abs : ∫ ω, U ω ∂μ ≤ err + ∫ ω, |Z ω| ∂μ := by + have hR_int : Integrable (fun ω => err + |Z ω|) μ := + (integrable_const err).add hZ_abs_int + have hle := integral_mono_ae hpos_one_int hR_int hpos + calc + ∫ ω, U ω ∂μ ≤ ∫ ω, err + |Z ω| ∂μ := hle + _ = err + ∫ ω, |Z ω| ∂μ := by + rw [integral_add (integrable_const err) hZ_abs_int, integral_const] + simp + have hU_sq_le : ∫ ω, U ω ^ (2 : ℕ) ∂μ ≤ + 2 * err ^ (2 : ℕ) + 2 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ := by + have hR_sq_int : + Integrable (fun ω => 2 * err ^ (2 : ℕ) + 2 * |Z ω| ^ (2 : ℕ)) μ := + (integrable_const (2 * err ^ (2 : ℕ))).add (hZ_sq_int.const_mul 2) + have hpoint : (fun ω => U ω ^ (2 : ℕ)) ≤ᵐ[μ] + fun ω => 2 * err ^ (2 : ℕ) + 2 * |Z ω| ^ (2 : ℕ) := by + filter_upwards [hpos] with ω hω + have hsq1 : U ω ^ (2 : ℕ) ≤ (err + |Z ω|) ^ (2 : ℕ) := + pow_le_pow_left₀ (hU_nonneg ω) hω 2 + exact hsq1.trans add_abs_sq_le_two + have hle := integral_mono_ae hpos_int hR_sq_int hpoint + calc + ∫ ω, U ω ^ (2 : ℕ) ∂μ ≤ + ∫ ω, 2 * err ^ (2 : ℕ) + 2 * |Z ω| ^ (2 : ℕ) ∂μ := hle + _ = 2 * err ^ (2 : ℕ) + 2 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ := by + rw [integral_add (integrable_const (2 * err ^ (2 : ℕ))) + (hZ_sq_int.const_mul 2), integral_const, integral_const_mul] + simp + have hV_sq_le : ∫ ω, V ω ^ (2 : ℕ) ∂μ ≤ base * ∫ ω, U ω ∂μ := by + have hbaseV_int : Integrable (fun ω => base * V ω) μ := + hneg_one_int.const_mul base + have hpoint : (fun ω => V ω ^ (2 : ℕ)) ≤ᵐ[μ] fun ω => base * V ω := by + filter_upwards [hX_nonneg] with ω hXω + have hV_le_base : V ω ≤ base := by + dsimp [V] + by_cases h : base - X ω ≤ 0 + · rw [max_eq_right h] + exact hbase_nonneg + · have hle : max (base - X ω) 0 = base - X ω := + max_eq_left (le_of_not_ge h) + rw [hle] + linarith + have hVn := hV_nonneg ω + nlinarith + have hle := integral_mono_ae hneg_int hbaseV_int hpoint + calc + ∫ ω, V ω ^ (2 : ℕ) ∂μ ≤ ∫ ω, base * V ω ∂μ := hle + _ = base * ∫ ω, V ω ∂μ := by rw [integral_const_mul] + _ ≤ base * ∫ ω, U ω ∂μ := + mul_le_mul_of_nonneg_left hV_le_U_integral hbase_nonneg + have hsquare : ∫ ω, |X ω - base| ^ (2 : ℕ) ∂μ ≤ + 2 * ∫ ω, U ω ^ (2 : ℕ) ∂μ + 2 * ∫ ω, V ω ^ (2 : ℕ) ∂μ := by + have hR_int : Integrable (fun ω => 2 * U ω ^ (2 : ℕ) + + 2 * V ω ^ (2 : ℕ)) μ := + (hpos_int.const_mul 2).add (hneg_int.const_mul 2) + have hleft_int : Integrable (fun ω => |X ω - base| ^ (2 : ℕ)) μ := by + refine Integrable.mono' hR_int ?_ ?_ + · exact (((hX_int.aemeasurable.sub aemeasurable_const).norm.pow_const + (2 : ℕ)).aestronglyMeasurable) + · filter_upwards with ω + have hle := abs_sub_sq_le_two_pos_neg_sq (x := X ω) (base := base) + simpa [U, V, Real.norm_eq_abs] using hle + have hpoint : (fun ω => |X ω - base| ^ (2 : ℕ)) ≤ᵐ[μ] + fun ω => 2 * U ω ^ (2 : ℕ) + 2 * V ω ^ (2 : ℕ) := by + filter_upwards with ω + exact abs_sub_sq_le_two_pos_neg_sq (x := X ω) (base := base) + have hle := integral_mono_ae hleft_int hR_int hpoint + calc + ∫ ω, |X ω - base| ^ (2 : ℕ) ∂μ ≤ + ∫ ω, 2 * U ω ^ (2 : ℕ) + 2 * V ω ^ (2 : ℕ) ∂μ := hle + _ = 2 * ∫ ω, U ω ^ (2 : ℕ) ∂μ + + 2 * ∫ ω, V ω ^ (2 : ℕ) ∂μ := by + rw [integral_add (hpos_int.const_mul 2) (hneg_int.const_mul 2), + integral_const_mul, integral_const_mul] + calc + ∫ ω, |X ω - base| ^ (2 : ℕ) ∂μ + ≤ 2 * ∫ ω, U ω ^ (2 : ℕ) ∂μ + + 2 * ∫ ω, V ω ^ (2 : ℕ) ∂μ := hsquare + _ ≤ 2 * (2 * err ^ (2 : ℕ) + 2 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ) + + 2 * (base * ∫ ω, U ω ∂μ) := by nlinarith [hU_sq_le, hV_sq_le] + _ ≤ 2 * (2 * err ^ (2 : ℕ) + 2 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ) + + 2 * (base * (err + ∫ ω, |Z ω| ∂μ)) := by + nlinarith [hU_le_err_abs, hbase_nonneg] + _ = 4 * err ^ (2 : ℕ) + 4 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ + + 2 * base * (err + ∫ ω, |Z ω| ∂μ) := by ring + +/-- A caller-friendly version of +`integral_abs_sub_sq_le_of_positivePart_control`, deriving the positive and +negative part integrability facts from centered L1/L2 integrability. -/ +theorem integral_abs_sub_sq_le_of_positivePart_control_of_centered_integrable + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {X Z : Ω → ℝ} {base err : ℝ} + (hbase_nonneg : 0 ≤ base) (herr_nonneg : 0 ≤ err) + (hX_nonneg : ∀ᵐ ω ∂μ, 0 ≤ X ω) + (hmean_lower : base ≤ ∫ ω, X ω ∂μ) + (hX_int : Integrable X μ) + (hcenter_abs_int : Integrable (fun ω => |X ω - base|) μ) + (hcenter_sq_int : Integrable (fun ω => |X ω - base| ^ (2 : ℕ)) μ) + (hZ_abs_int : Integrable (fun ω => |Z ω|) μ) + (hZ_sq_int : Integrable (fun ω => |Z ω| ^ (2 : ℕ)) μ) + (hpos : (fun ω => max (X ω - base) 0) ≤ᵐ[μ] fun ω => err + |Z ω|) : + ∫ ω, |X ω - base| ^ (2 : ℕ) ∂μ ≤ + 4 * err ^ (2 : ℕ) + 4 * ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ + + 2 * base * (err + ∫ ω, |Z ω| ∂μ) := by + have hX_aemeas : AEMeasurable X μ := hX_int.aemeasurable + have hpos_one_int : Integrable (fun ω => max (X ω - base) 0) μ := by + refine Integrable.mono' hcenter_abs_int ?_ ?_ + · exact + ((hX_aemeas.sub aemeasurable_const).max aemeasurable_const).aestronglyMeasurable + · filter_upwards with ω + have hle := max_sub_zero_abs_le (X ω) base + simpa [Real.norm_eq_abs, abs_of_nonneg (le_max_right (X ω - base) 0)] using hle + have hneg_one_int : Integrable (fun ω => max (base - X ω) 0) μ := by + refine Integrable.mono' hcenter_abs_int ?_ ?_ + · exact + ((aemeasurable_const.sub hX_aemeas).max aemeasurable_const).aestronglyMeasurable + · filter_upwards with ω + have hle := max_base_sub_zero_abs_le (X ω) base + simpa [Real.norm_eq_abs, abs_of_nonneg (le_max_right (base - X ω) 0)] using hle + have hpos_int : Integrable (fun ω => (max (X ω - base) 0) ^ (2 : ℕ)) μ := by + refine Integrable.mono' hcenter_sq_int ?_ ?_ + · exact + (((hX_aemeas.sub aemeasurable_const).max aemeasurable_const).pow_const + (2 : ℕ)).aestronglyMeasurable + · filter_upwards with ω + have hle := max_sub_zero_abs_le (X ω) base + have hsq := pow_le_pow_left₀ (le_max_right (X ω - base) 0) hle 2 + simpa [Real.norm_eq_abs, + abs_of_nonneg (pow_nonneg (le_max_right (X ω - base) 0) (2 : ℕ)), + abs_of_nonneg (pow_nonneg (abs_nonneg (X ω - base)) (2 : ℕ))] using hsq + have hneg_int : Integrable (fun ω => (max (base - X ω) 0) ^ (2 : ℕ)) μ := by + refine Integrable.mono' hcenter_sq_int ?_ ?_ + · exact + (((aemeasurable_const.sub hX_aemeas).max aemeasurable_const).pow_const + (2 : ℕ)).aestronglyMeasurable + · filter_upwards with ω + have hle := max_base_sub_zero_abs_le (X ω) base + have hsq := pow_le_pow_left₀ (le_max_right (base - X ω) 0) hle 2 + simpa [Real.norm_eq_abs, + abs_of_nonneg (pow_nonneg (le_max_right (base - X ω) 0) (2 : ℕ)), + abs_of_nonneg (pow_nonneg (abs_nonneg (X ω - base)) (2 : ℕ))] using hsq + exact + integral_abs_sub_sq_le_of_positivePart_control hbase_nonneg herr_nonneg hX_nonneg + hmean_lower hX_int hpos_int hneg_int hpos_one_int hneg_one_int + hZ_abs_int hZ_sq_int hpos + +/-- Convert the Rosenthal `L^ξ` root estimate, with `ξ ≥ 2`, into the L1 and +L2 estimates used by `integral_abs_sub_sq_le_of_positivePart_control`. -/ +theorem integral_abs_and_sq_le_of_annealedMomentRoot_le + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {ξ : ℕ} {Z : Ω → ℝ} {K : ℝ} + (hξ : 2 ≤ ξ) + (hZ_aemeas : AEMeasurable Z μ) + (hZξ_int : Integrable (fun ω => |Z ω| ^ ξ) μ) + (hroot : (∫ ω, |Z ω| ^ ξ ∂μ) ^ (1 / (ξ : ℝ)) ≤ K) : + (∫ ω, |Z ω| ∂μ ≤ K) ∧ + (∫ ω, |Z ω| ^ (2 : ℕ) ∂μ ≤ K ^ (2 : ℕ)) := by + have hξ_ne_zero : ξ ≠ 0 := by omega + have hmemξ : MemLp Z (ξ : ENNReal) μ := by + rw [← MeasureTheory.integrable_norm_rpow_iff hZ_aemeas.aestronglyMeasurable + (by exact_mod_cast hξ_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hZξ_int + have hmem2 : MemLp Z (2 : ENNReal) μ := + hmemξ.mono_exponent (by exact_mod_cast hξ) + have hZ2_int : Integrable (fun ω => |Z ω| ^ (2 : ℕ)) μ := by + simpa [Real.norm_eq_abs] using + hmem2.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + have hroot2 : + (∫ ω, |Z ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ K := + (Homogenization.integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv_aemeasurable + (μ := μ) (f := Z) hξ hZ_aemeas hZξ_int).trans hroot + have hL1 : ∫ ω, |Z ω| ∂μ ≤ K := + (Homogenization.integral_abs_le_integral_abs_sq_rpow_half_aemeasurable + (μ := μ) (f := Z) hZ_aemeas hZ2_int).trans hroot2 + have hI_nonneg : 0 ≤ ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ := + integral_nonneg fun ω => pow_nonneg (abs_nonneg (Z ω)) (2 : ℕ) + have hroot2_nonneg : + 0 ≤ (∫ ω, |Z ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) := by + positivity + have hsq := pow_le_pow_left₀ hroot2_nonneg hroot2 2 + have hroot_sq : + ((∫ ω, |Z ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ))) ^ (2 : ℕ) = + ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ := by + rw [← Real.sqrt_eq_rpow, Real.sq_sqrt hI_nonneg] + have hL2 : ∫ ω, |Z ω| ^ (2 : ℕ) ∂μ ≤ K ^ (2 : ℕ) := by + rw [hroot_sq] at hsq + simpa using hsq + exact ⟨hL1, hL2⟩ + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarReduction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarReduction.lean new file mode 100644 index 0000000000..71ac104b6d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarReduction.lean @@ -0,0 +1,609 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.NormalizedBlocks + +/-! # Scalar Reduction -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Scalar form of the variance-bound left-hand side + +This file packages the exact beta-weighted scalar expression appearing in the +variance bound at a good scale and records the basic order facts needed by the +later reduction steps. +-/ + +/-- The beta-weighted full-block fluctuation sum appearing in +`l.variance.bound.good.scale.homogenization.scale`. -/ +noncomputable def varianceGoodScaleFullBlockSumAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : ℝ := + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P + +/-- The variance-bound left-hand side is nonnegative. -/ +theorem varianceGoodScaleFullBlockSumAtScale_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m := by + unfold varianceGoodScaleFullBlockSumAtScale + refine sum_Icc_varianceWeight_mul_nonneg ?_ + intro j _hj + exact integral_nonneg fun a => + fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a + +/-- Sumwise comparison principle for the variance-bound left-hand side. -/ +theorem varianceGoodScaleFullBlockSumAtScale_le_weighted_sum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) + {F : ℕ → ℝ} + (hF : + ∀ j, j ∈ Finset.Icc 1 m → + (∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P) ≤ F j) : + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + ∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j * F j := by + unfold varianceGoodScaleFullBlockSumAtScale + exact sum_Icc_varianceWeight_mul_le_mul hF + +/-- Constant comparison principle for the variance-bound left-hand side. -/ +theorem varianceGoodScaleFullBlockSumAtScale_le_weighted_const + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) {C : ℝ} + (hC : + ∀ j, j ∈ Finset.Icc 1 m → + (∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P) ≤ C) : + varianceGoodScaleFullBlockSumAtScale hP hStruct hP4 m ≤ + (∑ j ∈ Finset.Icc 1 m, + varianceWeight (section54VarianceBeta hP4) m j) * C := by + unfold varianceGoodScaleFullBlockSumAtScale + exact sum_Icc_varianceWeight_mul_le_const_mul hC + +/-- Block-matrix subadditivity, after scalar normalization and testing against +a fixed full-block vector. This is the deterministic bridge from the Ch4 +Löwner comparison to the scalar partition average used in the good-scale +variance proof. -/ +theorem fullBlockNormalizedQuadraticObservable_le_restrictionDescendantAverageOnCube_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun) + ≤ᵐ[P] + fun a : RegCoeffField d => + Ch04.restrictionDescendantAverageOnCube Q k + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a := by + filter_upwards [hP.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_ae Q hk] + with a hSub + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let X : BlockVec d := ofFullBlockVec (Matrix.mulVec D q) + have hParent : + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun = + blockVecDot X (blockMatVecMul (coarseBlockMatrix (cubeSet Q) a.toFun) X) := by + dsimp [fullBlockNormalizedQuadraticObservable, fullBlockQuadratic, b, c, D, X] + simpa [D] using! + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Ch04.scalarFullBlockInvSqrtDiag (d := d) b c) + (coarseBlockMatrix (cubeSet Q) a.toFun) q + have hAvg : + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) X) = + Ch04.restrictionDescendantAverageOnCube Q k + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a := by + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + simp [Ch04.restrictionDescendantAverageOnCube, descendantsAtScale_eq_descendantsAtDepth Q hk, + fullBlockNormalizedQuadraticObservableR, + fullBlockNormalizedQuadraticObservable, b, c, D, + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot, descendantsAverage, X] + calc + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun + = blockVecDot X (blockMatVecMul (coarseBlockMatrix (cubeSet Q) a.toFun) X) := hParent + _ ≤ blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q (Int.toNat (Q.scale - k)) + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) X) := by + nlinarith [hSub X] + _ = Ch04.restrictionDescendantAverageOnCube Q k + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a := hAvg + +/-- Positive-part control for a normalized quadratic probe. Once the origin +scale-`k` annealed value is at most `1 + delta`, the pointwise positive excess +over `1` is bounded by `delta` plus the centered descendant average. -/ +theorem fullBlockNormalizedQuadraticObservable_positivePart_le_delta_add_centeredAverageOnCube_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (hmean_le : + (∫ b, + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d k)) b.toFun ∂P) ≤ 1 + delta) : + (fun a : RegCoeffField d => + max (fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun - + 1) 0) ≤ᵐ[P] + fun a : RegCoeffField d => + delta + + |Ch04.restrictionCenteredDescendantAverageOnCube P Q k + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| := by + filter_upwards + [fullBlockNormalizedQuadraticObservable_le_restrictionDescendantAverageOnCube_ae + hP hStruct center q Q hk] with a hsub + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + let f := X (cubeSet Q) a + let avg := Ch04.restrictionDescendantAverageOnCube Q k X a + let μ := ∫ b, X (cubeSet (originCube d k)) b ∂P + have hcenter : + Ch04.restrictionCenteredDescendantAverageOnCube P Q k X a = avg - μ := by + exact congrFun + (Ch04.restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + have hsub' : f ≤ avg := by simpa [X, f, avg] using! hsub + have hμ : μ ≤ 1 + delta := by simpa [X, μ] using! hmean_le + have hfirst : f - 1 ≤ delta + (avg - μ) := by linarith + have hmax : max (f - 1) 0 ≤ delta + max (avg - μ) 0 := by + refine max_le ?_ ?_ + · have hmono : delta + (avg - μ) ≤ delta + max (avg - μ) 0 := by + nlinarith [le_max_left (avg - μ) 0] + exact hfirst.trans hmono + · exact add_nonneg hdelta_nonneg (le_max_right _ _) + have hmax_abs : max (avg - μ) 0 ≤ |avg - μ| := + max_le (le_abs_self _) (abs_nonneg _) + calc + max (fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun - + 1) 0 = max (f - 1) 0 := rfl + _ ≤ delta + max (avg - μ) 0 := hmax + _ ≤ delta + |avg - μ| := by nlinarith [hmax_abs] + _ = + delta + |Ch04.restrictionCenteredDescendantAverageOnCube P Q k X a| := by + rw [hcenter] + +/-- Base-parameter version of +`fullBlockNormalizedQuadraticObservable_positivePart_le_delta_add_centeredAverageOnCube_ae`. +It is used for the non-unit plus/minus probes in the finite-dimensional +upgrade. -/ +theorem fullBlockNormalizedQuadraticObservable_positivePart_base_le_error_add_centeredAverageOnCube_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) {base err : ℝ} (herr_nonneg : 0 ≤ err) + (hmean_le : + (∫ b, + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d k)) b.toFun ∂P) ≤ base + err) : + (fun a : RegCoeffField d => + max (fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun - + base) 0) ≤ᵐ[P] + fun a : RegCoeffField d => + err + + |Ch04.restrictionCenteredDescendantAverageOnCube P Q k + (fullBlockNormalizedQuadraticObservableR hP hStruct center q) a| := by + filter_upwards + [fullBlockNormalizedQuadraticObservable_le_restrictionDescendantAverageOnCube_ae + hP hStruct center q Q hk] with a hsub + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct center q + let f := X (cubeSet Q) a + let avg := Ch04.restrictionDescendantAverageOnCube Q k X a + let μ := ∫ b, X (cubeSet (originCube d k)) b ∂P + have hcenter : + Ch04.restrictionCenteredDescendantAverageOnCube P Q k X a = avg - μ := by + exact congrFun + (Ch04.restrictionCenteredDescendantAverageOnCube_eq_restrictionDescendantAverageOnCube_sub + (P := P) (Q := Q) (n := k) hk X) a + have hsub' : f ≤ avg := by simpa [X, f, avg] using! hsub + have hμ : μ ≤ base + err := by simpa [X, μ] using! hmean_le + have hfirst : f - base ≤ err + (avg - μ) := by linarith + have hmax : max (f - base) 0 ≤ err + max (avg - μ) 0 := by + refine max_le ?_ ?_ + · have hmono : err + (avg - μ) ≤ err + max (avg - μ) 0 := by + nlinarith [le_max_left (avg - μ) 0] + exact hfirst.trans hmono + · exact add_nonneg herr_nonneg (le_max_right _ _) + have hmax_abs : max (avg - μ) 0 ≤ |avg - μ| := + max_le (le_abs_self _) (abs_nonneg _) + calc + max (fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a.toFun - + base) 0 = max (f - base) 0 := rfl + _ ≤ err + max (avg - μ) 0 := hmax + _ ≤ err + |avg - μ| := by nlinarith [hmax_abs] + _ = + err + |Ch04.restrictionCenteredDescendantAverageOnCube P Q k X a| := by + rw [hcenter] + +/-- The mean of a normalized quadratic probe on an origin cube is the same +quadratic form applied to the corresponding annealed full-block matrix. -/ +theorem integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center n : ℤ) (q : FullBlockVec d) + (hBlock : Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + (∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d n)) a.toFun ∂P) = + fullBlockQuadratic (D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P n) * D) q := by + classical + dsimp only + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let X : BlockVec d := ofFullBlockVec (Matrix.mulVec D q) + let B : RegCoeffField d → BlockMat d := + fun a => coarseBlockMatrix (cubeSet (originCube d n)) a.toFun + have hEntry : ∀ α β, + Integrable (fun a : RegCoeffField d => blockMatEntry (B a) α β) P := by + intro α β + simpa [B] using + Ch04.RestrictionLawCarrier.integrable_blockMatEntry_coarseBlockMatrix_cubeSet_of_integrable_coarseFullBlockMatrixAtCube + (Q := originCube d n) hBlock α β + have hIntEq := + Ch04.integral_blockVecDot_blockMatVecMul_eq_of_integrable_entries + (P := P) (B := B) hEntry X X + have hObs : + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d n)) a.toFun) = + fun a : RegCoeffField d => blockVecDot X (blockMatVecMul (B a) X) := by + funext a + dsimp [fullBlockNormalizedQuadraticObservable, fullBlockQuadratic, b, c, D, X, B] + simpa [D] using! + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Ch04.scalarFullBlockInvSqrtDiag (d := d) b c) + (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) q + rw [hObs] + rw [hIntEq] + have hAnnealed : + { upperLeft := fun i j => ∫ a, (B a).upperLeft i j ∂P + upperRight := fun i j => ∫ a, (B a).upperRight i j ∂P + lowerLeft := fun i j => ∫ a, (B a).lowerLeft i j ∂P + lowerRight := fun i j => ∫ a, (B a).lowerRight i j ∂P } = + Ch04.annealedBlockMatrixAtScale P n := by + rw [Ch04.annealedBlockMatrixAtScale, Ch04.annealedBlockMatrix] + rw [hAnnealed] + symm + simpa [D, X] using + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Ch04.scalarFullBlockInvSqrtDiag (d := d) b c) + (Ch04.annealedBlockMatrixAtScale P n) q + +/-- `(P4)` supplies the integrability in +`integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale` +for nonnegative origin scales. -/ +theorem integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center n : ℤ) (hn : 0 ≤ n) (q : FullBlockVec d) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + (∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct center q + (cubeSet (originCube d n)) a.toFun ∂P) = + fullBlockQuadratic (D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P n) * D) q := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P := by + have hnat := + Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 (Int.toNat n) + simpa [Int.toNat_of_nonneg hn] using hnat + exact + integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale + hP hStruct center n q hBlock + +private theorem inv_sqrt_mul_le_of_le_mul {b x A : ℝ} (hb : 0 < b) + (hx : x ≤ A * b) : + (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ ≤ A := by + have hsqrt_pos : 0 < Real.sqrt b := Real.sqrt_pos.mpr hb + have hsq : (Real.sqrt b) ^ 2 = b := Real.sq_sqrt hb.le + have hmul : x / b ≤ A := + (div_le_iff₀ hb).mpr (by simpa [mul_comm] using hx) + calc + (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ = x / b := by + calc + (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ = + x * ((Real.sqrt b) ^ 2)⁻¹ := by + field_simp [hsqrt_pos.ne'] + _ = x * b⁻¹ := by rw [hsq] + _ = x / b := by rw [div_eq_mul_inv] + _ ≤ A := hmul + +private theorem sqrt_mul_inv_le_of_mul_le {c x A : ℝ} (hc : 0 < c) + (hx : c * x ≤ A) : + Real.sqrt c * x * Real.sqrt c ≤ A := by + have hsq : (Real.sqrt c) ^ 2 = c := Real.sq_sqrt hc.le + calc + Real.sqrt c * x * Real.sqrt c = c * x := by + calc + Real.sqrt c * x * Real.sqrt c = (Real.sqrt c) ^ 2 * x := by ring + _ = c * x := by rw [hsq] + _ ≤ A := hx + +private theorem one_le_inv_sqrt_mul_of_le {b x : ℝ} (hb : 0 < b) + (hbx : b ≤ x) : + 1 ≤ (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ := by + have hxdiv : 1 ≤ x / b := + (le_div_iff₀ hb).mpr (by simpa using hbx) + have hsqrt_pos : 0 < Real.sqrt b := Real.sqrt_pos.mpr hb + have hsq : (Real.sqrt b) ^ 2 = b := Real.sq_sqrt hb.le + calc + 1 ≤ x / b := hxdiv + _ = (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ := by + symm + calc + (Real.sqrt b)⁻¹ * x * (Real.sqrt b)⁻¹ = + x * ((Real.sqrt b) ^ 2)⁻¹ := by + field_simp [hsqrt_pos.ne'] + _ = x * b⁻¹ := by rw [hsq] + _ = x / b := by rw [div_eq_mul_inv] + +private theorem one_le_sqrt_mul_inv_of_inv_le {c x : ℝ} (hc : 0 < c) + (hinv : c⁻¹ ≤ x) : + 1 ≤ Real.sqrt c * x * Real.sqrt c := by + have hmul : 1 ≤ c * x := by + calc + 1 = c * c⁻¹ := by field_simp [hc.ne'] + _ ≤ c * x := mul_le_mul_of_nonneg_left hinv hc.le + have hsq : (Real.sqrt c) ^ 2 = c := Real.sq_sqrt hc.le + calc + 1 ≤ c * x := hmul + _ = Real.sqrt c * x * Real.sqrt c := by + symm + calc + Real.sqrt c * x * Real.sqrt c = (Real.sqrt c) ^ 2 * x := by ring + _ = c * x := by rw [hsq] + +/-- At a good scale, each intermediate annealed block is at most `(1+delta)` +after normalization by the top scale. -/ +theorem normalizedAnnealedQuadratic_le_one_add_delta_mul_dotProduct_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (m k : ℕ) (_hk : k ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (q : FullBlockVec d) : + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + fullBlockQuadratic (D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (k : ℤ)) * D) q ≤ + (1 + delta) * dotProduct q q := by + classical + dsimp only + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bk := hP.barSigmaAtScale hStruct (k : ℤ) + let ck := hP.barSigmaStarAtScale hStruct (k : ℤ) + let r : BlockCoord d → ℝ := fun α => + match α with + | Sum.inl _ => (Real.sqrt bm)⁻¹ * bk * (Real.sqrt bm)⁻¹ + | Sum.inr _ => Real.sqrt cm * ck⁻¹ * Real.sqrt cm + have hbm_pos : 0 < bm := by + simpa [bm] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hchain_k0 := Pigeonhole.scalarChain_of_P4 hP hStruct hP4 (Nat.zero_le k) + have hbk_le_good : bk ≤ (1 + delta) * bm := by + have hbk_le_zero : bk ≤ hP.barSigmaAtScale hStruct 0 := by + simpa [bk] using hchain_k0.2.2 + exact hbk_le_zero.trans (by simpa [bm] using hgood_upper) + have hck_inv_le_good : ck⁻¹ ≤ (1 + delta) * cm⁻¹ := by + have hck_le_zero : ck⁻¹ ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + simpa [ck] using hchain_k0.2.1 + exact hck_le_zero.trans (by simpa [cm] using hgood_lower) + have hcm_mul_ck : cm * ck⁻¹ ≤ 1 + delta := by + calc + cm * ck⁻¹ ≤ cm * ((1 + delta) * cm⁻¹) := + mul_le_mul_of_nonneg_left hck_inv_le_good hcm_pos.le + _ = 1 + delta := by field_simp [hcm_pos.ne'] + have hmat : + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) * + toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (k : ℤ)) * + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) = + Matrix.diagonal r := by + rw [annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct (k : ℤ)] + simpa [bm, cm, bk, ck, r] using! + normalizedScalarAnnealedBlockMatrix_eq_diagonal hP hStruct (m : ℤ) (k : ℤ) + rw [hmat] + exact fullBlockQuadratic_diagonal_le_mul_dotProduct q (fun α => by + cases α with + | inl i => + simpa [r, bm, bk] using + inv_sqrt_mul_le_of_le_mul hbm_pos hbk_le_good + | inr i => + simpa [r, cm, ck] using + sqrt_mul_inv_le_of_mul_le hcm_pos hcm_mul_ck) + +/-- Scalar-chain monotonicity gives the lower normalized annealed bound. -/ +theorem dotProduct_le_normalizedAnnealedQuadratic_of_scalarChain + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m k : ℕ) (hk : k ≤ m) (q : FullBlockVec d) : + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + dotProduct q q ≤ + fullBlockQuadratic (D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (k : ℤ)) * D) q := by + classical + dsimp only + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bk := hP.barSigmaAtScale hStruct (k : ℤ) + let ck := hP.barSigmaStarAtScale hStruct (k : ℤ) + let r : BlockCoord d → ℝ := fun α => + match α with + | Sum.inl _ => (Real.sqrt bm)⁻¹ * bk * (Real.sqrt bm)⁻¹ + | Sum.inr _ => Real.sqrt cm * ck⁻¹ * Real.sqrt cm + have hbm_pos : 0 < bm := by + simpa [bm] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hchain_km := Pigeonhole.scalarChain_of_P4 hP hStruct hP4 hk + have hbm_le_bk : bm ≤ bk := by + simpa [bm, bk] using hchain_km.2.2 + have hcm_inv_le_ck_inv : cm⁻¹ ≤ ck⁻¹ := by + simpa [cm, ck] using hchain_km.2.1 + have hmat : + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) * + toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (k : ℤ)) * + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) = + Matrix.diagonal r := by + rw [annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct (k : ℤ)] + simpa [bm, cm, bk, ck, r] using! + normalizedScalarAnnealedBlockMatrix_eq_diagonal hP hStruct (m : ℤ) (k : ℤ) + rw [hmat] + calc + dotProduct q q = 1 * dotProduct q q := by ring + _ ≤ fullBlockQuadratic (Matrix.diagonal r) q := + mul_dotProduct_le_fullBlockQuadratic_diagonal q (fun α => by + cases α with + | inl i => + simpa [r, bm, bk] using + one_le_inv_sqrt_mul_of_le hbm_pos hbm_le_bk + | inr i => + simpa [r, cm, ck] using + one_le_sqrt_mul_inv_of_inv_le hcm_pos hcm_inv_le_ck_inv) + +/-- Good-scale upper bound for the mean of a normalized quadratic probe. -/ +theorem integral_origin_fullBlockNormalizedQuadraticObservable_le_base_add_delta_mul_dotProduct_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (m k : ℕ) (hk : k ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (q : FullBlockVec d) : + (∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (k : ℤ))) a.toFun ∂P) ≤ + dotProduct q q + delta * dotProduct q q := by + have hmean := + integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale_from_P4 + hP hStruct hP4 (m : ℤ) (k : ℤ) (by exact_mod_cast Nat.zero_le k) q + rw [hmean] + have hquad := + normalizedAnnealedQuadratic_le_one_add_delta_mul_dotProduct_of_good + hP hStruct hP4 (m := m) (k := k) hk hgood_upper hgood_lower q + calc + fullBlockQuadratic + ((Matrix.diagonal + (Ch04.scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct (m : ℤ)) + (hP.barSigmaStarAtScale hStruct (m : ℤ)))) * + toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (k : ℤ)) * + Matrix.diagonal + (Ch04.scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct (m : ℤ)) + (hP.barSigmaStarAtScale hStruct (m : ℤ)))) q + ≤ (1 + delta) * dotProduct q q := by + simpa using hquad + _ = dotProduct q q + delta * dotProduct q q := by ring + +/-- Scalar-chain lower bound for the mean of a normalized quadratic probe. -/ +theorem dotProduct_le_integral_origin_fullBlockNormalizedQuadraticObservable_of_scalarChain + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m k : ℕ) (hk : k ≤ m) (q : FullBlockVec d) : + dotProduct q q ≤ + ∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (k : ℤ))) a.toFun ∂P := by + have hmean := + integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale_from_P4 + hP hStruct hP4 (m : ℤ) (k : ℤ) (by exact_mod_cast Nat.zero_le k) q + rw [hmean] + exact + dotProduct_le_normalizedAnnealedQuadratic_of_scalarChain + hP hStruct hP4 m k hk q + +/-- Good-scale positive-part control for a normalized quadratic probe on an +origin cube. -/ +theorem fullBlockNormalizedQuadraticObservable_positivePart_good_origin_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (q : FullBlockVec d) : + (fun a : RegCoeffField d => + max (fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a.toFun - dotProduct q q) 0) + ≤ᵐ[P] + fun a : RegCoeffField d => + delta * dotProduct q q + + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) a| := by + have hmean_le := + integral_origin_fullBlockNormalizedQuadraticObservable_le_base_add_delta_mul_dotProduct_of_good + hP hStruct hP4 (m := m) (k := 0) (by omega) hgood_upper hgood_lower q + have herr : 0 ≤ delta * dotProduct q q := + mul_nonneg hdelta_nonneg (dotProduct_self_nonneg q) + have hpos := + fullBlockNormalizedQuadraticObservable_positivePart_base_le_error_add_centeredAverageOnCube_ae + hP hStruct (m : ℤ) q (originCube d (j : ℤ)) (k := 0) + (base := dotProduct q q) (err := delta * dotProduct q q) + (by change (0 : ℤ) ≤ (j : ℤ); exact_mod_cast Nat.zero_le j) + herr (by simpa [zero_add] using hmean_le) + simpa [Ch04.restrictionCenteredDescendantAverageOnCube, Ch04.restrictionCenteredDescendantAverage] using hpos + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarVariance.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarVariance.lean new file mode 100644 index 0000000000..2895e03143 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScalarVariance.lean @@ -0,0 +1,325 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeVariance + +/-! # Scalar Variance -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +/-! +# Scalar variance estimates for the good-scale proof + +This file combines the good-scale positive-part comparison, the P4 +integrability bridges, and the Rosenthal descendant-average bounds into the +per-probe scalar variance estimates used by the finite-dimensional upgrade. +-/ + +/-- The descendant-average bound produced by Rosenthal for a coordinate probe. -/ +noncomputable def coordinateProbeDescendantAverageK + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center m : ℤ) (α : BlockCoord d) : ℝ := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * coordinateProbeFactor hP hStruct center α * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + +/-- The descendant-average bound produced by Rosenthal for a plus/minus pair +probe. -/ +noncomputable def pairProbeDescendantAverageK + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center m : ℤ) (α β : BlockCoord d) : ℝ := + ((descendantsAtScale (originCube d m) 0).card : ℝ)⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + ((descendantsAtScale (originCube d m) 0).card : ℝ) ^ + (1 / (hP4.xi : ℝ)) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.sqrt ((descendantsAtScale (originCube d m) 0).card : ℝ) * + (2 * pairProbeFactor hP hStruct center α β * + (Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi))) + +/-- Scalar variance estimate for a single normalized quadratic probe, assuming +the descendant average has already been bounded in L1 and L2. -/ +theorem fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (q : FullBlockVec d) {K : ℝ} + (hZ_int : + Integrable + (fun a : RegCoeffField d => + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) a|) P ∧ + Integrable + (fun a : RegCoeffField d => + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) a| ^ + (2 : ℕ)) P) + (hZ_le : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) a| ^ + (2 : ℕ) ∂P ≤ K ^ (2 : ℕ))) : + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a - dotProduct q q| ^ (2 : ℕ) ∂P ≤ + 4 * (delta * dotProduct q q) ^ (2 : ℕ) + 4 * K ^ (2 : ℕ) + + 2 * dotProduct q q * (delta * dotProduct q q + K) := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := fun a => + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (j : ℤ))) a + let Z : RegCoeffField d → ℝ := + Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) q) + let base : ℝ := dotProduct q q + let err : ℝ := delta * base + have hinputs := + integrable_fullBlockNormalizedQuadraticObservable_and_abs_sub_dotProduct_from_P4 + hP hStruct hP4 m j q + have hbase_nonneg : 0 ≤ base := by + simpa [base] using dotProduct_self_nonneg q + have herr_nonneg : 0 ≤ err := by + exact mul_nonneg hdelta_nonneg hbase_nonneg + have hX_nonneg : ∀ᵐ a ∂P, 0 ≤ X a := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_nonneg_ae + hP hStruct (m : ℤ) q (originCube d (j : ℤ)) + have hmean_lower : base ≤ ∫ a, X a ∂P := by + simpa [X, base] using + dotProduct_le_integral_origin_fullBlockNormalizedQuadraticObservable_of_scalarChain + hP hStruct hP4 m j hj q + have hpos : + (fun a : RegCoeffField d => max (X a - base) 0) ≤ᵐ[P] + fun a => err + |Z a| := by + simpa [X, Z, base, err] using + fullBlockNormalizedQuadraticObservable_positivePart_good_origin_ae + hP hStruct hP4 hdelta_nonneg m j hgood_upper hgood_lower q + have hraw := + integral_abs_sub_sq_le_of_positivePart_control_of_centered_integrable + (μ := P) (X := X) (Z := Z) (base := base) (err := err) + hbase_nonneg herr_nonneg hX_nonneg hmean_lower + (by simpa [X] using hinputs.1) + (by simpa [X, base] using hinputs.2.1) + (by simpa [X, base] using hinputs.2.2) + (by simpa [Z] using hZ_int.1) + (by simpa [Z] using hZ_int.2) + hpos + calc + ∫ a, |X a - base| ^ (2 : ℕ) ∂P + ≤ 4 * err ^ (2 : ℕ) + 4 * ∫ a, |Z a| ^ (2 : ℕ) ∂P + + 2 * base * (err + ∫ a, |Z a| ∂P) := hraw + _ ≤ 4 * err ^ (2 : ℕ) + 4 * K ^ (2 : ℕ) + + 2 * base * (err + K) := by + nlinarith [hbase_nonneg, hZ_le.1, hZ_le.2] + _ = + 4 * (delta * dotProduct q q) ^ (2 : ℕ) + 4 * K ^ (2 : ℕ) + + 2 * dotProduct q q * (delta * dotProduct q q + K) := by + simp [base, err] + +/-- Coordinate-probe scalar variance estimate at a good scale. -/ +theorem coordinateProbe_scalarVariance_good_origin_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + (α : BlockCoord d) : + let K := coordinateProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α)| ^ + (2 : ℕ) ∂P ≤ + 4 * (delta * dotProduct (fullBlockCoordinateProbe α) + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + 4 * K ^ (2 : ℕ) + + 2 * dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α) * + (delta * dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α) + K) := by + dsimp only + let K := coordinateProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α + have hOrigin := + coordinateProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 (m : ℤ) α + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockCoordinateProbe α) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le : (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockCoordinateProbe α)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + simpa [K, coordinateProbeDescendantAverageK] using + coordinateProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + hP hStruct hP4 (center := (m : ℤ)) (m := (j : ℤ)) + (by exact_mod_cast Nat.zero_le j) α + simpa [K] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockCoordinateProbe α) hZ_int hZ_le + +/-- Plus-pair scalar variance estimate at a good scale. -/ +theorem plusProbe_scalarVariance_good_origin_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockPlusProbe α β) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β)| ^ + (2 : ℕ) ∂P ≤ + 4 * (delta * dotProduct (fullBlockPlusProbe α β) + (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + 4 * K ^ (2 : ℕ) + + 2 * dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) * + (delta * dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) + K) := by + dsimp only + let K := pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β + have hOrigin := + plusProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 (m : ℤ) hαβ + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockPlusProbe α β) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le : (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockPlusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + simpa [K, pairProbeDescendantAverageK] using + plusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + hP hStruct hP4 (center := (m : ℤ)) (m := (j : ℤ)) + (by exact_mod_cast Nat.zero_le j) hαβ + simpa [K] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockPlusProbe α β) hZ_int hZ_le + +/-- Minus-pair scalar variance estimate at a good scale. -/ +theorem minusProbe_scalarVariance_good_origin_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) + (m j : ℕ) (hj : j ≤ m) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + {α β : BlockCoord d} (hαβ : α ≠ β) : + let K := pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β + ∫ a, + |fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) + (fullBlockMinusProbe α β) (cubeSet (originCube d (j : ℤ))) a - + dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β)| ^ + (2 : ℕ) ∂P ≤ + 4 * (delta * dotProduct (fullBlockMinusProbe α β) + (fullBlockMinusProbe α β)) ^ (2 : ℕ) + + 4 * K ^ (2 : ℕ) + + 2 * dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) * + (delta * dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) + K) := by + dsimp only + let K := pairProbeDescendantAverageK hP hStruct hP4 (m : ℤ) (j : ℤ) α β + have hOrigin := + minusProbe_centeredOrigin_momentRoot_le_factorSum + hP hStruct hP4 (m : ℤ) hαβ + have hZ_int := + fullBlockNormalizedQuadraticObservable_restrictionCenteredDescendantAverage_abs_and_sq_integrable + hP hStruct hP4 (q := fullBlockMinusProbe α β) + (center := (m : ℤ)) (n := 0) (m := (j : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le j) hOrigin.1 + have hZ_le : (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a| ∂P ≤ K) ∧ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P 0 (j : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (m : ℤ) + (fullBlockMinusProbe α β)) a| ^ (2 : ℕ) ∂P ≤ K ^ (2 : ℕ)) := by + simpa [K, pairProbeDescendantAverageK] using + minusProbe_restrictionCenteredDescendantAverage_abs_and_sq_le + hP hStruct hP4 (center := (m : ℤ)) (m := (j : ℤ)) + (by exact_mod_cast Nat.zero_le j) hαβ + simpa [K] using + fullBlockNormalizedQuadraticObservable_scalarVariance_good_origin_le + hP hStruct hP4 hdelta_nonneg m j hj hgood_upper hgood_lower + (fullBlockMinusProbe α β) hZ_int hZ_le + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleAbsorption.lean new file mode 100644 index 0000000000..87d9956fe8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleAbsorption.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FinalAbsorption + +/-! # Scale Absorption -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +noncomputable section + +/-! +# Scale-separation absorption + +This file contains the pure real estimate converting the manuscript scale +separation into the decay needed after the refined variance-budget summation. +-/ + +/-- A separation constant large enough to turn the logarithmic scale condition +into fourth-power decay of the scale-zero moment parameter. -/ +noncomputable def varianceScaleSeparationConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 8 * (section54VarianceBeta hP4 * Real.log 3)⁻¹ + +private theorem rpow_decay_le_log_scale + {β C ξ δ T : ℝ} {m : ℕ} + (hβ : 0 < β) (hξ : 1 ≤ ξ) + (hδ : 0 < δ) (hT : 0 ≤ T) + (hC : 8 * (β * Real.log 3)⁻¹ ≤ C) + (hm : C * ξ * Real.log (2 + δ⁻¹ * ξ * T) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) (-β * (m : ℝ)) ≤ + Real.rpow (2 + δ⁻¹ * ξ * T) (-4 : ℝ) := by + let A : ℝ := 2 + δ⁻¹ * ξ * T + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβlog : 0 < β * Real.log (3 : ℝ) := mul_pos hβ hlog3 + have hξ_nonneg : 0 ≤ ξ := by linarith + have hA_ge_two : 2 ≤ A := by + have hprod : 0 ≤ δ⁻¹ * ξ * T := by + exact mul_nonneg (mul_nonneg (inv_nonneg.mpr hδ.le) hξ_nonneg) hT + dsimp [A] + linarith + have hA_pos : 0 < A := lt_of_lt_of_le (by norm_num) hA_ge_two + have hlogA_nonneg : 0 ≤ Real.log A := Real.log_nonneg (by linarith) + have hsep0 : + (4 * (β * Real.log 3)⁻¹) * Real.log A ≤ (m : ℝ) := by + have hC4 : 4 * (β * Real.log 3)⁻¹ ≤ C * ξ := by + have hstep1 : 4 * (β * Real.log 3)⁻¹ ≤ + 8 * (β * Real.log 3)⁻¹ := by + have hinv_nonneg : 0 ≤ (β * Real.log 3)⁻¹ := inv_nonneg.mpr hβlog.le + nlinarith + have hstep2 : 8 * (β * Real.log 3)⁻¹ ≤ C := hC + have hC_nonneg : 0 ≤ C := le_trans (by positivity) hC + have hC_le_Cξ : C ≤ C * ξ := by + nlinarith + exact hstep1.trans (hstep2.trans hC_le_Cξ) + calc + (4 * (β * Real.log 3)⁻¹) * Real.log A ≤ + (C * ξ) * Real.log A := + mul_le_mul_of_nonneg_right hC4 hlogA_nonneg + _ = C * ξ * Real.log A := by ring + _ ≤ (m : ℝ) := by simpa [A] using hm + have hexp_le : + Real.log (3 : ℝ) * (-β * (m : ℝ)) ≤ Real.log A * (-4 : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hsep0 hβlog.le + have hfour : β * Real.log (3 : ℝ) * + ((4 * (β * Real.log 3)⁻¹) * Real.log A) = + 4 * Real.log A := by + field_simp [hβlog.ne'] + have hmain : 4 * Real.log A ≤ β * Real.log (3 : ℝ) * (m : ℝ) := by + nlinarith + nlinarith + calc + Real.rpow (3 : ℝ) (-β * (m : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (-β * (m : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) + (y := -β * (m : ℝ)) (by norm_num : 0 < (3 : ℝ))) + _ ≤ Real.exp (Real.log A * (-4 : ℝ)) := + Real.exp_le_exp.mpr hexp_le + _ = Real.rpow A (-4 : ℝ) := by + simpa using + (Real.rpow_def_of_pos (x := A) (y := (-4 : ℝ)) hA_pos).symm + +private theorem rpow_neg_four_mul_add_sq_le_two_delta + {δ A T : ℝ} (hδ_pos : 0 < δ) (hδ_le_half : δ ≤ 1 / 2) + (hA_ge_one : 1 ≤ A) (hT_nonneg : 0 ≤ T) + (hT_le : T ≤ δ * A) : + Real.rpow A (-4 : ℝ) * (T + T ^ (2 : ℕ)) ≤ 2 * δ := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hA_inv_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr hA_pos.le + have hA_m4_le_m1 : + Real.rpow A (-4 : ℝ) ≤ Real.rpow A (-1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hA_ge_one (by norm_num) + have hA_m4_le_m2 : + Real.rpow A (-4 : ℝ) ≤ Real.rpow A (-2 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hA_ge_one (by norm_num) + have hT_over_A : A⁻¹ * T ≤ δ := by + have hmul := mul_le_mul_of_nonneg_left hT_le hA_inv_nonneg + have hcancel : A⁻¹ * (δ * A) = δ := by + field_simp [hA_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + have hA_m1 : Real.rpow A (-1 : ℝ) = A⁻¹ := by + simpa using (Real.rpow_neg hA_pos.le (1 : ℝ)) + have hA_m2 : Real.rpow A (-2 : ℝ) = A⁻¹ ^ (2 : ℕ) := by + calc + Real.rpow A (-2 : ℝ) = (Real.rpow A (2 : ℝ))⁻¹ := by + simp + _ = (A ^ (2 : ℕ))⁻¹ := by + exact congrArg Inv.inv (Real.rpow_natCast A 2) + _ = A⁻¹ ^ (2 : ℕ) := by + field_simp [hA_pos.ne'] + have hlinear : Real.rpow A (-4 : ℝ) * T ≤ δ := by + calc + Real.rpow A (-4 : ℝ) * T ≤ Real.rpow A (-1 : ℝ) * T := + mul_le_mul_of_nonneg_right hA_m4_le_m1 hT_nonneg + _ = A⁻¹ * T := by + rw [hA_m1] + _ ≤ δ := hT_over_A + have hsquare : Real.rpow A (-4 : ℝ) * T ^ (2 : ℕ) ≤ δ := by + have hT_over_A_sq : (A⁻¹ * T) ^ (2 : ℕ) ≤ δ ^ (2 : ℕ) := + pow_le_pow_left₀ (mul_nonneg hA_inv_nonneg hT_nonneg) hT_over_A 2 + have hδ_sq_le : δ ^ (2 : ℕ) ≤ δ := by nlinarith + calc + Real.rpow A (-4 : ℝ) * T ^ (2 : ℕ) ≤ + Real.rpow A (-2 : ℝ) * T ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hA_m4_le_m2 (sq_nonneg T) + _ = (A⁻¹ * T) ^ (2 : ℕ) := by + rw [hA_m2] + ring + _ ≤ δ ^ (2 : ℕ) := hT_over_A_sq + _ ≤ δ := hδ_sq_le + nlinarith + +/-- Scale separation absorbs the remaining `\widetilde\Theta_0` budget. -/ +theorem scaleSeparation_absorbs_widetildeThetaBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {C delta : ℝ} {m : ℕ} + (hC : varianceScaleSeparationConst hP4 ≤ C) + (hdelta_pos : 0 < delta) (hdelta_le_half : delta ≤ 1 / 2) + (hm : + C * (hP4.xi : ℝ) * + Real.log (2 + delta⁻¹ * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (m : ℝ)) : + Real.rpow (3 : ℝ) (-(section54VarianceBeta hP4) * (m : ℝ)) * + (widetildeThetaAtScale P 0 hP4 + + (widetildeThetaAtScale P 0 hP4) ^ (2 : ℕ)) ≤ + 2 * delta := by + let T : ℝ := widetildeThetaAtScale P 0 hP4 + let A : ℝ := 2 + delta⁻¹ * (hP4.xi : ℝ) * T + have hT_nonneg : 0 ≤ T := by + simp [T, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + have hxi_one : 1 ≤ (hP4.xi : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hP4.xi_pos) + have hdecay := + rpow_decay_le_log_scale + (β := section54VarianceBeta hP4) (C := C) (ξ := (hP4.xi : ℝ)) + (δ := delta) (T := T) (m := m) + (section54VarianceBeta_pos hP4) hxi_one hdelta_pos hT_nonneg + (by simpa [varianceScaleSeparationConst] using hC) + (by simpa [T, A, mul_assoc] using hm) + have hA_ge_one : 1 ≤ A := by + have hprod : 0 ≤ delta⁻¹ * (hP4.xi : ℝ) * T := + mul_nonneg (mul_nonneg (inv_nonneg.mpr hdelta_pos.le) (by linarith)) hT_nonneg + dsimp [A] + linarith + have hT_le : T ≤ delta * A := by + have hcore : delta⁻¹ * T ≤ A := by + have hxiT : delta⁻¹ * T ≤ delta⁻¹ * (hP4.xi : ℝ) * T := by + have hδinv_nonneg : 0 ≤ delta⁻¹ := inv_nonneg.mpr hdelta_pos.le + have hxi_mul : T ≤ (hP4.xi : ℝ) * T := by nlinarith + nlinarith + dsimp [A] + nlinarith + have hmul := mul_le_mul_of_nonneg_left hcore hdelta_pos.le + have hcancel : delta * (delta⁻¹ * T) = T := by + field_simp [hdelta_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + exact + (mul_le_mul_of_nonneg_right hdecay + (add_nonneg hT_nonneg (sq_nonneg T))).trans + (by + simpa [T, A] using + rpow_neg_four_mul_add_sq_le_two_delta hdelta_pos hdelta_le_half + hA_ge_one hT_nonneg hT_le) + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleCompression.lean new file mode 100644 index 0000000000..a64b10a9af --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section54/VarianceBoundGoodScale/ScaleCompression.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain + +/-! # Scale Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section54 +namespace VarianceBoundGoodScale + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Scalar compression at a good scale + +This file records the scale-zero scalar comparisons used to compress the +unit-cube moment factors in the variance-bound proof. These are internal +Section 5.4 bridges: they are derived from `(P4)` and the displayed good-scale +hypotheses, rather than being added to the public theorem statement. +-/ + +private theorem barSigmaAtScale_le_LambdaMomentAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + have hξ_one : 1 ≤ hP4.xi := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + simpa using + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos hξ_one + (fun n => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sUpper_pos) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hP4.sLower_pos) + (fun n => Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + (fun n => Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + 0 + +private theorem barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + have hξ_one : 1 ≤ hP4.xi := le_trans (by norm_num : 1 ≤ 2) hP4.two_le_xi + simpa using + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos hξ_one + (fun n => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 n) + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hP4.sUpper_pos) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hP4.sLower_pos) + (fun n => Section52.upperFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + (fun n => Section52.lowerFactorPowerIntegrableAtScale_from_P4 + hP hStruct hP4 n) + 0 + +/-- Under `(P4)`, the starred scalar is bounded by the upper scalar at every +nonnegative scale. -/ +theorem barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + hP.barSigmaStarAtScale hStruct (m : ℤ) ≤ + hP.barSigmaAtScale hStruct (m : ℤ) := by + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hc_pos : 0 < c := by + simpa [c] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have htheta : + 1 ≤ b * c⁻¹ := by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b, c] using + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (m : ℤ) hBlock + calc + hP.barSigmaStarAtScale hStruct (m : ℤ) = c := rfl + _ = c * 1 := by ring + _ ≤ c * (b * c⁻¹) := mul_le_mul_of_nonneg_left htheta hc_pos.le + _ = b := by field_simp [hc_pos.ne'] + _ = hP.barSigmaAtScale hStruct (m : ℤ) := rfl + +/-- Good-scale comparison: the inverse upper normalization at scale `m` is +controlled by the scale-zero lower moment factor. -/ +theorem barSigmaAtScale_inv_le_one_add_delta_mul_lambdaInvMomentAtScale_zero_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_upper : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (m : ℤ)) : + (hP.barSigmaAtScale hStruct (m : ℤ))⁻¹ ≤ + (1 + delta) * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let b0 := hP.barSigmaAtScale hStruct 0 + let c0 := hP.barSigmaStarAtScale hStruct 0 + let L0inv := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + have hfactor_nonneg : 0 ≤ 1 + delta := by linarith + have hbm_pos : 0 < bm := by + simpa [bm] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hb0_pos : 0 < b0 := by + simpa [b0] using Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0_pos : 0 < c0 := by + simpa [c0] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hbm_inv_le : + bm⁻¹ ≤ (1 + delta) * b0⁻¹ := by + have hratio : bm⁻¹ * b0 ≤ 1 + delta := by + calc + bm⁻¹ * b0 = b0 / bm := by ring + _ ≤ 1 + delta := by + exact (div_le_iff₀ hbm_pos).mpr (by simpa [bm, b0, mul_comm] using hgood_upper) + rw [← div_eq_mul_inv] + exact (le_div_iff₀ hb0_pos).mpr hratio + have hb0_inv_le_c0_inv : b0⁻¹ ≤ c0⁻¹ := by + have hc0_le_b0 : c0 ≤ b0 := by + simpa [b0, c0] using + barSigmaStarAtScale_le_barSigmaAtScale_of_P4 hP hStruct hP4 0 + exact (inv_le_inv₀ hb0_pos hc0_pos).2 hc0_le_b0 + have hc0_inv_le_L0inv : c0⁻¹ ≤ L0inv := by + simpa [c0, L0inv] using + barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_zero_of_P4 hP hStruct hP4 + have hb0_inv_le_L0inv : b0⁻¹ ≤ L0inv := + hb0_inv_le_c0_inv.trans hc0_inv_le_L0inv + calc + (hP.barSigmaAtScale hStruct (m : ℤ))⁻¹ = bm⁻¹ := rfl + _ ≤ (1 + delta) * b0⁻¹ := hbm_inv_le + _ ≤ (1 + delta) * L0inv := + mul_le_mul_of_nonneg_left hb0_inv_le_L0inv hfactor_nonneg + _ = + (1 + delta) * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := rfl + +/-- Good-scale comparison: the starred normalization at scale `m` is controlled +by the scale-zero upper moment factor. -/ +theorem barSigmaStarAtScale_le_one_add_delta_mul_LambdaMomentAtScale_zero_of_good + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} (hdelta_nonneg : 0 ≤ delta) (m : ℕ) + (hgood_lower : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + hP.barSigmaStarAtScale hStruct (m : ℤ) ≤ + (1 + delta) * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct 0 + let b0 := hP.barSigmaAtScale hStruct 0 + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + have hfactor_nonneg : 0 ≤ 1 + delta := by linarith + have hcm_pos : 0 < cm := by + simpa [cm] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hc0_pos : 0 < c0 := by + simpa [c0] using Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hcm_le : + cm ≤ (1 + delta) * c0 := by + have hratio : cm * c0⁻¹ ≤ 1 + delta := by + calc + cm * c0⁻¹ ≤ cm * ((1 + delta) * cm⁻¹) := + mul_le_mul_of_nonneg_left (by simpa [cm, c0] using hgood_lower) hcm_pos.le + _ = 1 + delta := by field_simp [hcm_pos.ne'] + have hdiv : cm / c0 ≤ 1 + delta := by + simpa [div_eq_mul_inv] using hratio + exact (div_le_iff₀ hc0_pos).mp hdiv + have hc0_le_b0 : c0 ≤ b0 := by + simpa [b0, c0] using + barSigmaStarAtScale_le_barSigmaAtScale_of_P4 hP hStruct hP4 0 + have hb0_le_L0 : b0 ≤ L0 := by + simpa [b0, L0] using + barSigmaAtScale_le_LambdaMomentAtScale_zero_of_P4 hP hStruct hP4 + have hc0_le_L0 : c0 ≤ L0 := hc0_le_b0.trans hb0_le_L0 + calc + hP.barSigmaStarAtScale hStruct (m : ℤ) = cm := rfl + _ ≤ (1 + delta) * c0 := hcm_le + _ ≤ (1 + delta) * L0 := + mul_le_mul_of_nonneg_left hc0_le_L0 hfactor_nonneg + _ = + (1 + delta) * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := rfl + +end + +end VarianceBoundGoodScale +end Section54 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55.lean new file mode 100644 index 0000000000..1db84dc4af --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedOneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedImprovement +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedConvergence + +/-! # Section55 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +/-! +# Section 5.5: iteration and annealed convergence + +This file is the scaffold for the current manuscript's Section 5.5: +shifted `widetildeTheta` control, shifted one-step contraction, the one-step +annealed improvement lemma, and the proof of the main annealed convergence +theorem. + +This section should be mostly scalar iteration once Sections 5.2--5.4 are +green. +-/ + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedConvergence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedConvergence.lean new file mode 100644 index 0000000000..74c55eb9aa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedConvergence.lean @@ -0,0 +1,703 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.AnnealedImprovement + +/-! # Annealed Convergence -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Main annealed convergence theorem + +This file contains the scalar iteration which turns the one-step annealed +improvement into the main annealed convergence theorem. +-/ + +private theorem thetaAtScale_mono_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {n m : ℕ} (hnm : n ≤ m) : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (n : ℤ) := + (Section52.scalarPreliminaries_homogenizationScale + hP hStruct hP4 n m n hnm le_rfl 0 0).2.1 + +private theorem thetaAtScale_zero_le_widetildeThetaAtScale_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := + (Section52.scalarPreliminaries_homogenizationScale + hP hStruct hP4 0 0 0 le_rfl le_rfl 0 0).2.2.1 + +private theorem widetildeThetaAtScale_nonneg + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) : + 0 ≤ widetildeThetaAtScale P m hP4 := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos) + +private theorem log_two_add_mul_le_const_mul_log_two_add + {A x : ℝ} (hA : 1 ≤ A) (hx : 0 ≤ x) : + Real.log (2 + x * A) ≤ (1 + 2 * A) * Real.log (2 + x) := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hxarg_pos : 0 < 2 + x := add_pos_of_pos_of_nonneg (by norm_num) hx + have hleft_pos : 0 < 2 + x * A := by + exact add_pos_of_pos_of_nonneg (by norm_num) (mul_nonneg hx hA_pos.le) + have harg_le : 2 + x * A ≤ A * (2 + x) := by + have htwoA : (2 : ℝ) ≤ 2 * A := by + simpa using + mul_le_mul_of_nonneg_left hA (by norm_num : (0 : ℝ) ≤ 2) + calc + 2 + x * A = x * A + 2 := by ring + _ ≤ x * A + 2 * A := add_le_add_right htwoA (x * A) + _ = 2 * A + x * A := by ring + _ = A * (2 + x) := by ring + have hlog_le : + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := + Real.log_le_log hleft_pos harg_le + have hmul_log : + Real.log (A * (2 + x)) = Real.log A + Real.log (2 + x) := by + rw [Real.log_mul hA_pos.ne' hxarg_pos.ne'] + have hlogA_le : Real.log A ≤ A := Real.log_le_self hA_pos.le + have hlog_two_le : Real.log 2 ≤ Real.log (2 + x) := by + exact Real.log_le_log (by norm_num) + (le_add_of_nonneg_right hx : (2 : ℝ) ≤ 2 + x) + have hone_le_two_log : (1 : ℝ) ≤ 2 * Real.log (2 + x) := by + have htwo : (1 : ℝ) ≤ 2 * Real.log 2 := by + nlinarith [Real.log_two_gt_d9] + exact htwo.trans (mul_le_mul_of_nonneg_left hlog_two_le (by norm_num)) + have hA_le : A ≤ 2 * A * Real.log (2 + x) := by + have hmul := mul_le_mul_of_nonneg_left hone_le_two_log hA_pos.le + calc + A = A * 1 := by ring + _ ≤ A * (2 * Real.log (2 + x)) := hmul + _ = 2 * A * Real.log (2 + x) := by ring + calc + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := hlog_le + _ = Real.log A + Real.log (2 + x) := hmul_log + _ ≤ 2 * A * Real.log (2 + x) + Real.log (2 + x) := by + calc + Real.log A + Real.log (2 + x) = + Real.log (2 + x) + Real.log A := by ring + _ ≤ Real.log (2 + x) + 2 * A * Real.log (2 + x) := + add_le_add_right (hlogA_le.trans hA_le) (Real.log (2 + x)) + _ = 2 * A * Real.log (2 + x) + Real.log (2 + x) := by ring + _ = (1 + 2 * A) * Real.log (2 + x) := by ring + +private theorem quarter_pow_natCeil_log_two_add_mul_le_one + {T : ℝ} (hT : 0 ≤ T) : + ((1 / 4 : ℝ) ^ Nat.ceil (Real.log (2 + T))) * T ≤ 1 := by + let L : ℝ := Real.log (2 + T) + let J : ℕ := Nat.ceil L + have harg_pos : 0 < 2 + T := add_pos_of_pos_of_nonneg (by norm_num) hT + have harg_ge_one : 1 ≤ 2 + T := by + calc + (1 : ℝ) ≤ 2 := by norm_num + _ ≤ 2 + T := le_add_of_nonneg_right hT + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.log_nonneg harg_ge_one + have hJ_ge_L : L ≤ (J : ℝ) := by + simpa [J] using Nat.le_ceil L + have hbase_pos : 0 < (1 / 4 : ℝ) := by norm_num + have hbase_le_one : (1 / 4 : ℝ) ≤ 1 := by norm_num + have hpow_le : + (1 / 4 : ℝ) ^ (J : ℝ) ≤ (1 / 4 : ℝ) ^ L := + Real.rpow_le_rpow_of_exponent_ge hbase_pos hbase_le_one hJ_ge_L + have hlog4_ge_one : (1 : ℝ) ≤ Real.log 4 := by + have htwo : (1 : ℝ) ≤ 2 * Real.log 2 := by + nlinarith [Real.log_two_gt_d9] + have hlog4 : Real.log (4 : ℝ) = 2 * Real.log 2 := by + rw [show (4 : ℝ) = 2 * 2 by norm_num, + Real.log_mul (by norm_num : (2 : ℝ) ≠ 0) (by norm_num : (2 : ℝ) ≠ 0)] + ring + rwa [hlog4] + have hquarter_log : + Real.log (1 / 4 : ℝ) * L ≤ -L := by + have hlog_quarter : Real.log (1 / 4 : ℝ) = -Real.log 4 := by + rw [show (1 / 4 : ℝ) = (4 : ℝ)⁻¹ by norm_num] + rw [Real.log_inv] + rw [hlog_quarter] + calc + -Real.log 4 * L ≤ (-1 : ℝ) * L := + mul_le_mul_of_nonneg_right (neg_le_neg hlog4_ge_one) hL_nonneg + _ = -L := by ring + have hquarter_le_inv : + (1 / 4 : ℝ) ^ L ≤ (2 + T)⁻¹ := by + calc + (1 / 4 : ℝ) ^ L = + Real.exp (Real.log (1 / 4 : ℝ) * L) := by + simpa using + (Real.rpow_def_of_pos (x := (1 / 4 : ℝ)) (y := L) hbase_pos) + _ ≤ Real.exp (-L) := Real.exp_le_exp.mpr hquarter_log + _ = (2 + T)⁻¹ := by + rw [Real.exp_neg, Real.exp_log harg_pos] + have hmul : + ((1 / 4 : ℝ) ^ (J : ℝ)) * T ≤ (2 + T)⁻¹ * T := + mul_le_mul_of_nonneg_right (hpow_le.trans hquarter_le_inv) hT + have hfrac : (2 + T)⁻¹ * T ≤ 1 := by + have hpos : 0 < 2 + T := harg_pos + rw [inv_mul_le_iff₀ hpos] + nlinarith + have hnat : + ((1 / 4 : ℝ) ^ Nat.ceil L) * T = + ((1 / 4 : ℝ) ^ (J : ℝ)) * T := by + simp [J, Real.rpow_natCast] + rw [show Real.log (2 + T) = L by rfl] + rw [hnat] + exact hmul.trans hfrac + +private theorem scalar_quarter_iteration_le_three + {f : ℕ → ℝ} {T : ℝ} (hT : 0 ≤ T) + {H J : ℕ} + (h0 : f 0 ≤ T) + (hstep : ∀ j : ℕ, f ((j + 1) * H) ≤ 1 + (1 / 4 : ℝ) * f (j * H)) + (hJ : J = Nat.ceil (Real.log (2 + T))) : + f (J * H) ≤ 3 := by + have hiter : ∀ j : ℕ, f (j * H) ≤ 2 + (1 / 4 : ℝ) ^ j * T := by + intro j + induction j with + | zero => + simpa using h0.trans (by nlinarith : T ≤ 2 + (1 / 4 : ℝ) ^ (0 : ℕ) * T) + | succ j ih => + calc + f ((j + 1) * H) + ≤ 1 + (1 / 4 : ℝ) * f (j * H) := hstep j + _ ≤ 1 + (1 / 4 : ℝ) * (2 + (1 / 4 : ℝ) ^ j * T) := by + have hquarter_nonneg : 0 ≤ (1 / 4 : ℝ) := by norm_num + nlinarith [mul_le_mul_of_nonneg_left ih hquarter_nonneg] + _ ≤ 2 + (1 / 4 : ℝ) ^ (j + 1) * T := by + have hpow : + (1 / 4 : ℝ) ^ (j + 1) * T = + (1 / 4 : ℝ) * ((1 / 4 : ℝ) ^ j * T) := by + rw [pow_succ] + ring + rw [hpow] + nlinarith + have htail : + ((1 / 4 : ℝ) ^ J) * T ≤ 1 := by + rw [hJ] + exact quarter_pow_natCeil_log_two_add_mul_le_one hT + have hmain := hiter J + nlinarith + +private theorem log_two_add_ge_half {T : ℝ} (hT : 0 ≤ T) : + (1 / 2 : ℝ) ≤ Real.log (2 + T) := by + have hlog_two_le : Real.log (2 : ℝ) ≤ Real.log (2 + T) := + Real.log_le_log (by norm_num) (by nlinarith) + have hhalf_le_log_two : (1 / 2 : ℝ) ≤ Real.log (2 : ℝ) := by + nlinarith [Real.log_two_gt_d9] + exact hhalf_le_log_two.trans hlog_two_le + +private theorem natCeil_le_three_mul_of_half_le {x : ℝ} + (hx : (1 / 2 : ℝ) ≤ x) : + (Nat.ceil x : ℝ) ≤ 3 * x := by + have hx_nonneg : 0 ≤ x := by nlinarith + have hceil : (Nat.ceil x : ℝ) ≤ x + 1 := + (Nat.ceil_lt_add_one hx_nonneg).le + have htail : x + 1 ≤ 3 * x := by nlinarith + exact hceil.trans htail + +private theorem natCeil_nonneg_le_add_one {x : ℝ} (hx : 0 ≤ x) : + (Nat.ceil x : ℝ) ≤ x + 1 := + (Nat.ceil_lt_add_one hx).le + +private theorem exists_burnInScaleConstant + {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) + {Cstep : ℝ} (hCstep_pos : 0 < Cstep) : + ∃ Cburn : ℝ, 0 < Cburn ∧ + ∀ T : ℝ, 0 ≤ T → + let L := Real.log (2 + T) + let J := Nat.ceil L + let S := Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * |Real.log (1 / 4 : ℝ)| * + Real.log (2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T) + let H := Nat.ceil S + ((J * H : ℕ) : ℝ) ≤ Cburn * L ^ (2 : ℕ) := by + classical + let A : ℝ := ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * (params.xi : ℝ) + let B : ℝ := Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * |Real.log (1 / 4 : ℝ)| * (1 + 2 * A) + refine ⟨3 * (B + 2), ?_, ?_⟩ + · have hB_nonneg : 0 ≤ B := by + dsimp [B, A] + positivity + nlinarith + · intro T hT + dsimp + let L : ℝ := Real.log (2 + T) + let J : ℕ := Nat.ceil L + let S : ℝ := Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * |Real.log (1 / 4 : ℝ)| * + Real.log (2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T) + let H : ℕ := Nat.ceil S + have hξ_ge_one : (1 : ℝ) ≤ (params.xi : ℝ) := by + have htwo : 2 ≤ params.xi := params.two_le_xi + exact_mod_cast (show (1 : ℕ) ≤ params.xi by omega) + have hξ_nonneg : 0 ≤ (params.xi : ℝ) := by nlinarith + have hqpow_ge_one : (1 : ℝ) ≤ ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) := by + norm_num + have hqpow_nonneg : 0 ≤ ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) := by positivity + have hA_ge_one : 1 ≤ A := by + have hmul := mul_le_mul hqpow_ge_one hξ_ge_one + (by norm_num : (0 : ℝ) ≤ 1) hqpow_nonneg + simpa [A] using hmul + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA_ge_one + have hL_half : (1 / 2 : ℝ) ≤ L := by + simpa [L] using log_two_add_ge_half hT + have hL_nonneg : 0 ≤ L := by nlinarith + have hJ_le : (J : ℝ) ≤ 3 * L := by + simpa [J] using natCeil_le_three_mul_of_half_le hL_half + have hlog_arg_ge_one : + 1 ≤ 2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T := by + have hprod : 0 ≤ ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T := by positivity + nlinarith + have hS_nonneg : 0 ≤ S := by + have hlog_nonneg : + 0 ≤ Real.log (2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T) := + Real.log_nonneg hlog_arg_ge_one + have hcoef_nonneg : + 0 ≤ Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + |Real.log (1 / 4 : ℝ)| := by positivity + dsimp [S] + exact mul_nonneg hcoef_nonneg hlog_nonneg + have hH_le_add : (H : ℝ) ≤ S + 1 := by + simpa [H] using natCeil_nonneg_le_add_one hS_nonneg + have hlog_le : + Real.log (2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T) ≤ (1 + 2 * A) * L := by + have hrewrite : + 2 + T * A = + 2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * T := by + simp [A] + ring + have h := + log_two_add_mul_le_const_mul_log_two_add + (A := A) (x := T) hA_ge_one hT + simpa [L, hrewrite] using h + have hS_le : S ≤ B * L := by + have hcoef_nonneg : + 0 ≤ Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + |Real.log (1 / 4 : ℝ)| := by positivity + calc + S ≤ (Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + |Real.log (1 / 4 : ℝ)|) * ((1 + 2 * A) * L) := by + dsimp [S] + exact mul_le_mul_of_nonneg_left hlog_le hcoef_nonneg + _ = B * L := by + simp [B] + ring + have hB_nonneg : 0 ≤ B := by + dsimp [B, A] + positivity + have hH_le : (H : ℝ) ≤ (B + 2) * L := by + calc + (H : ℝ) ≤ S + 1 := hH_le_add + _ = 1 + S := by ring + _ ≤ 1 + B * L := add_le_add_right hS_le 1 + _ = B * L + 1 := by ring + _ ≤ B * L + 2 * L := by + have hone_le_twoL : (1 : ℝ) ≤ 2 * L := by + calc + (1 : ℝ) = 2 * (1 / 2 : ℝ) := by norm_num + _ ≤ 2 * L := mul_le_mul_of_nonneg_left hL_half (by norm_num) + calc + B * L + 1 = 1 + B * L := by ring + _ ≤ 2 * L + B * L := add_le_add_left hone_le_twoL (B * L) + _ = B * L + 2 * L := by ring + _ = (B + 2) * L := by ring + have hH_nonneg : 0 ≤ (H : ℝ) := by exact_mod_cast Nat.zero_le H + have hprod := + mul_le_mul hJ_le hH_le hH_nonneg (mul_nonneg (by norm_num) hL_nonneg) + have hcast : ((J * H : ℕ) : ℝ) = (J : ℝ) * (H : ℝ) := by + norm_num + calc + ((J * H : ℕ) : ℝ) = (J : ℝ) * (H : ℝ) := hcast + _ ≤ (3 * L) * ((B + 2) * L) := hprod + _ = 3 * (B + 2) * L ^ (2 : ℕ) := by ring + +private theorem abs_log_div_four_le_four_abs_log + {sigma : ℝ} (hsigma_pos : 0 < sigma) (hsigma_le : sigma ≤ 1 / 2) : + |Real.log (sigma / 4)| ≤ 4 * |Real.log sigma| := by + have hsigma_nonneg : 0 ≤ sigma := hsigma_pos.le + have hlog_sigma_nonpos : Real.log sigma ≤ 0 := + Real.log_nonpos hsigma_nonneg (by linarith) + have habs_sigma : |Real.log sigma| = -Real.log sigma := + abs_of_nonpos hlog_sigma_nonpos + have hlog_half : Real.log sigma ≤ Real.log (1 / 2 : ℝ) := + Real.log_le_log hsigma_pos hsigma_le + have hlog_inv : Real.log (1 / 2 : ℝ) = -Real.log 2 := by + rw [show (1 / 2 : ℝ) = (2 : ℝ)⁻¹ by norm_num] + rw [Real.log_inv] + have hlog2_le_abs : Real.log 2 ≤ |Real.log sigma| := by + rw [habs_sigma] + linarith + have hlog4_le : Real.log (4 : ℝ) ≤ 2 * |Real.log sigma| := by + have hlog4 : Real.log (4 : ℝ) = 2 * Real.log 2 := by + rw [show (4 : ℝ) = 2 * 2 by norm_num, + Real.log_mul (by norm_num : (2 : ℝ) ≠ 0) (by norm_num : (2 : ℝ) ≠ 0)] + ring + rw [hlog4] + nlinarith + have hlog_div : + Real.log (sigma / 4) = Real.log sigma - Real.log (4 : ℝ) := by + rw [div_eq_mul_inv, Real.log_mul hsigma_pos.ne' (by norm_num : ((4 : ℝ)⁻¹) ≠ 0), + Real.log_inv] + ring + have hdiv_nonpos : Real.log (sigma / 4) ≤ 0 := by + rw [hlog_div] + have hlog4_nonneg : 0 ≤ Real.log (4 : ℝ) := + Real.log_nonneg (by norm_num : (1 : ℝ) ≤ 4) + nlinarith + rw [abs_of_nonpos hdiv_nonpos, hlog_div, habs_sigma] + nlinarith + +private theorem sigma_div_four_inv_pow_four_eq + {sigma : ℝ} (hsigma_pos : 0 < sigma) : + (sigma / 4)⁻¹ ^ (4 : ℕ) = + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * sigma⁻¹ ^ (4 : ℕ) := by + field_simp [hsigma_pos.ne'] + +private theorem exists_sigmaTailScaleConstant + {d : ℕ} (params : QuantitativeCoarseGrainedEllipticityParams d) + {Cstep : ℝ} (hCstep_pos : 0 < Cstep) : + ∃ Ctail : ℝ, 0 < Ctail ∧ + ∀ {T sigma : ℝ}, 0 ≤ T → 0 < sigma → sigma ≤ 1 / 2 → + Cstep * (params.xi : ℝ) * ((sigma / 4)⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) ≤ + Ctail * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) := by + classical + let A : ℝ := ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) + let Ctail : ℝ := Cstep * A * 4 * (1 + 2 * A) + refine ⟨Ctail, ?_, ?_⟩ + · dsimp [Ctail, A] + positivity + · intro T sigma hT hsigma_pos hsigma_le + have hξ_nonneg : 0 ≤ (params.xi : ℝ) := by + exact_mod_cast Nat.zero_le params.xi + have hsigInv_nonneg : 0 ≤ sigma⁻¹ ^ (4 : ℕ) := by positivity + have hlog_abs_nonneg : 0 ≤ |Real.log sigma| := abs_nonneg _ + have hbase_log_arg_ge_one : + 1 ≤ 2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T := by + have hprod : 0 ≤ sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T := by positivity + nlinarith + have hbase_log_nonneg : + 0 ≤ Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) := + Real.log_nonneg hbase_log_arg_ge_one + have hA_ge_one : 1 ≤ A := by + dsimp [A] + norm_num + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA_ge_one + have hpow_eq := sigma_div_four_inv_pow_four_eq hsigma_pos + have hlog_le : + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) ≤ + (1 + 2 * A) * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) := by + have hx_nonneg : 0 ≤ sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T := by positivity + have h := + log_two_add_mul_le_const_mul_log_two_add + (A := A) (x := sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) + hA_ge_one hx_nonneg + have hrewrite : + 2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T = + 2 + (sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) * A := by + rw [hpow_eq] + ring + calc + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) + = Real.log (2 + (sigma⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) * A) := by rw [hrewrite] + _ ≤ (1 + 2 * A) * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) := h + have habs_le := abs_log_div_four_le_four_abs_log hsigma_pos hsigma_le + calc + Cstep * (params.xi : ℝ) * ((sigma / 4)⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) + = Cstep * A * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) := by + rw [hpow_eq] + ring + _ ≤ Cstep * A * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + (4 * |Real.log sigma|) * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left habs_le (by positivity)) + (by + have hleft_arg : + 1 ≤ 2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T := by + have hprod : 0 ≤ (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T := by positivity + nlinarith + exact Real.log_nonneg hleft_arg) + _ ≤ Cstep * A * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + (4 * |Real.log sigma|) * + ((1 + 2 * A) * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T)) := by + exact mul_le_mul_of_nonneg_left hlog_le (by positivity) + _ = Ctail * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * T) := by + simp [Ctail] + ring + +/-- A quarter-sized improvement from an initial bound of three reaches the target accuracy. -/ +private theorem quarter_step_le_one_add_of_le_three + {x y sigma : ℝ} (hstep : x ≤ 1 + (sigma / 4) * y) + (hy : y ≤ 3) (hsigma : 0 ≤ sigma) : x ≤ 1 + sigma := by + have hmul := mul_le_mul_of_nonneg_left hy (by positivity : 0 ≤ sigma / 4) + nlinarith only [hstep, hmul, hsigma] + +/-- Proposition `p.annealed.convergence.homogenization.scale`. + +The constant is chosen from the parameter record before the law and the target +accuracy. The entry scale is the manuscript two-ceiling scale from +`annealedEntryScale`. -/ +theorem annealedPerturbativeEntry_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ sigma : ℝ, 0 < sigma → sigma ≤ (1 / 2 : ℝ) → + thetaAtScale hP hStruct + (annealedEntryScale P hP4 C sigma : ℤ) ≤ 1 + sigma := by + classical + obtain ⟨Cstep, hCstep_pos, hstep⟩ := + oneStepAnnealedImprovement_homogenizationScale params + obtain ⟨Cburn, hCburn_pos, hburn⟩ := + exists_burnInScaleConstant params hCstep_pos + obtain ⟨Ctail, hCtail_pos, htail⟩ := + exists_sigmaTailScaleConstant params hCstep_pos + let C : ℝ := max Cburn Ctail + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le hCburn_pos (le_max_left _ _) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams sigma hsigma_pos hsigma_le + let W : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let L : ℝ := Real.log (2 + W) + let J : ℕ := Nat.ceil L + let S : ℝ := Cstep * (params.xi : ℝ) * + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * |Real.log (1 / 4 : ℝ)| * + Real.log (2 + ((1 / 4 : ℝ)⁻¹ ^ (4 : ℕ)) * + (params.xi : ℝ) * W) + let H : ℕ := Nat.ceil S + let Nburn : ℕ := J * H + let Nentry : ℕ := annealedConvergenceEntryScaleBound P hP4 C + let Ntail : ℕ := annealedConvergenceSigmaTailScale P hP4 C sigma + let N : ℕ := annealedEntryScale P hP4 C sigma + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact widetildeThetaAtScale_nonneg P hP4 0 + have htheta0_le_W : + thetaAtScale hP hStruct (0 : ℤ) ≤ W := by + dsimp [W] + exact thetaAtScale_zero_le_widetildeThetaAtScale_zero hP hStruct hP4 + have hquarter_pos : 0 < (1 / 4 : ℝ) := by norm_num + have hquarter_le : (1 / 4 : ℝ) ≤ (1 / 2 : ℝ) := by norm_num + have hstep_quarter : + ∀ j : ℕ, + thetaAtScale hP hStruct (((j + 1) * H : ℕ) : ℤ) ≤ + 1 + (1 / 4 : ℝ) * + thetaAtScale hP hStruct ((j * H : ℕ) : ℤ) := by + intro j + have hkN : j * H ≤ (j + 1) * H := + Nat.mul_le_mul_right H (Nat.le_succ j) + have hceilS : S ≤ (H : ℝ) := by + simpa [H] using Nat.le_ceil S + have hdiff : ((j + 1) * H - j * H : ℕ) = H := by + rw [Nat.succ_mul] + omega + exact + hstep hP hStruct hP4 hparams hquarter_pos hquarter_le hkN + (by + simpa [S, W, hdiff] using hceilS) + let f : ℕ → ℝ := fun n => thetaAtScale hP hStruct (n : ℤ) + have hburn_theta : f Nburn ≤ 3 := by + have hiter := + scalar_quarter_iteration_le_three + (f := f) hW_nonneg (H := H) (J := J) + (by simpa [f] using htheta0_le_W) + (by + intro j + simpa [f] using hstep_quarter j) + (by rfl : J = Nat.ceil (Real.log (2 + W))) + simpa [Nburn] using hiter + have hCburn_le_C : Cburn ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hburn_real : + (Nburn : ℝ) ≤ C * L ^ (2 : ℕ) := by + have h0 := hburn W hW_nonneg + have hsquare_nonneg : 0 ≤ L ^ (2 : ℕ) := sq_nonneg L + calc + (Nburn : ℝ) ≤ Cburn * L ^ (2 : ℕ) := by + simpa [Nburn, J, H, L, S, W] using h0 + _ ≤ C * L ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hCburn_le_C hsquare_nonneg + have hentry_ceiling : + C * L ^ (2 : ℕ) ≤ (Nentry : ℝ) := by + simpa [Nentry, annealedConvergenceEntryScaleBound, L, W] using + Nat.le_ceil (C * (Real.log (2 + W)) ^ (2 : ℕ)) + have hNburn_le_entry : Nburn ≤ Nentry := by + exact Nat.cast_le.mp (hburn_real.trans hentry_ceiling) + have hentry_theta_le_three : + thetaAtScale hP hStruct (Nentry : ℤ) ≤ 3 := by + have hmono := + thetaAtScale_mono_of_P4 hP hStruct hP4 hNburn_le_entry + exact hmono.trans (by simpa [f, Nburn] using hburn_theta) + have hsigma4_pos : 0 < sigma / 4 := by positivity + have hsigma4_le : sigma / 4 ≤ (1 / 2 : ℝ) := by + calc + sigma / 4 ≤ (1 / 2 : ℝ) / 4 := + div_le_div_of_nonneg_right hsigma_le (by norm_num) + _ ≤ (1 / 2 : ℝ) := by norm_num + have hCtail_le_C : Ctail ≤ C := by + dsimp [C] + exact le_max_right _ _ + have hxi_eq : hP4.xi = params.xi := by + rw [← hparams] + rfl + have htail_gap_real : + Cstep * (params.xi : ℝ) * ((sigma / 4)⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * W) ≤ + (Ntail : ℝ) := by + have htail_base := + htail (T := W) (sigma := sigma) hW_nonneg hsigma_pos hsigma_le + have htail_factor_nonneg : + 0 ≤ (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W) := by + have hlog_arg_ge_one : + 1 ≤ 2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W := by + have hprod : + 0 ≤ sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W := by + positivity + calc + (1 : ℝ) ≤ 2 := by norm_num + _ ≤ 2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W := + le_add_of_nonneg_right hprod + have hlog_nonneg : + 0 ≤ Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * W) := + Real.log_nonneg hlog_arg_ge_one + positivity + have htail_C : + Ctail * ((params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W)) ≤ + C * ((params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W)) := + mul_le_mul_of_nonneg_right hCtail_le_C htail_factor_nonneg + have htail_upgraded : + Cstep * (params.xi : ℝ) * ((sigma / 4)⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * W) ≤ + C * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W) := by + calc + Cstep * (params.xi : ℝ) * ((sigma / 4)⁻¹ ^ (4 : ℕ)) * + |Real.log (sigma / 4)| * + Real.log (2 + (sigma / 4)⁻¹ ^ (4 : ℕ) * + (params.xi : ℝ) * W) + ≤ Ctail * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W) := + htail_base + _ = Ctail * ((params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W)) := by ring + _ ≤ C * ((params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W)) := + htail_C + _ = C * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W) := by ring + have hceil_tail : + C * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * + |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * W) ≤ + (Ntail : ℝ) := by + have hceil := + Nat.le_ceil + (C * (hP4.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (hP4.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4)) + simpa [Ntail, annealedConvergenceSigmaTailScale, W, hxi_eq] using hceil + exact htail_upgraded.trans hceil_tail + have hentry_le_N : Nentry ≤ N := by + dsimp [N, annealedEntryScale, Nentry, Ntail] + omega + have hdiff_tail : (N - Nentry : ℕ) = Ntail := by + dsimp [N, annealedEntryScale, Nentry, Ntail] + omega + have hfinal_step : + thetaAtScale hP hStruct (N : ℤ) ≤ + 1 + (sigma / 4) * thetaAtScale hP hStruct (Nentry : ℤ) := by + exact + hstep hP hStruct hP4 hparams hsigma4_pos hsigma4_le hentry_le_N + (by + simpa [W, hdiff_tail] using htail_gap_real) + have hfinal : + thetaAtScale hP hStruct (N : ℤ) ≤ 1 + sigma := + quarter_step_le_one_add_of_le_three hfinal_step hentry_theta_le_three hsigma_pos.le + simpa [N] using hfinal + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedImprovement.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedImprovement.lean new file mode 100644 index 0000000000..189ad0cd62 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/AnnealedImprovement.lean @@ -0,0 +1,944 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedOneStepContraction + +/-! # Annealed Improvement -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# One annealed improvement step + +This file formalizes the scalar iteration step from Section 5.5. The first +bridge below is a windowed version of the Section 5.4 pigeonhole lemma, +obtained by applying the existing result to the scale-normalized law. +-/ + +private theorem section53CoarseFluctuationBetaCoreParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaCoreParams params := by + have hgap : 0 < 1 - params.sUpper - params.sLower := by + linarith [params.sum_lt_one] + have hupper : 0 < params.sUpper := params.sUpper_pos + have hlower : 0 < params.sLower := params.sLower_pos + have hupper_gain : 0 < params.sUpper - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < params.sLower - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sLower] + unfold section53CoarseFluctuationBetaCoreParams + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +private theorem section53CoarseFluctuationBetaParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaParams params := by + unfold section53CoarseFluctuationBetaParams + nlinarith [section53CoarseFluctuationBetaCoreParams_pos params] + +/-- Pigeonhole on an arbitrary scale window `[k, k + M]`. + +Either there is a good subwindow of length `h`, or the annealed contrast has +already contracted from scale `k` to scale `k + M`. -/ +theorem windowPigeonhole_homogenizationScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta sigma : ℝ} (hdelta_pos : 0 < delta) + (hdelta_le : delta ≤ 1 / 2) + (hsigma_pos : 0 < sigma) (hsigma_le : sigma ≤ 1 / 2) + {k M h : ℕ} + (hsep : (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|)) * h ≤ M) : + (∃ n : ℕ, + k + h ≤ n ∧ n ≤ k + M ∧ + hP.barSigmaAtScale hStruct ((n - h : ℕ) : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (n : ℤ) ∧ + (hP.barSigmaStarAtScale hStruct ((n - h : ℕ) : ℤ))⁻¹ ≤ + (1 + delta) * + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹) ∨ + thetaAtScale hP hStruct ((k + M : ℕ) : ℤ) ≤ + sigma * thetaAtScale hP hStruct (k : ℤ) := by + classical + let Pk := Ch04.restrictionScaleNormalizedLaw k P + let hPk := hP.scaleNormalized k + let hStructPk := hStruct.scaleNormalized k + let hP4k := hP4.scaleNormalized hP hStruct k + have hpigeon := + Section54.pigeonhole_homogenizationScale + hPk hStructPk hP4k hdelta_pos hdelta_le hsigma_pos hsigma_le hsep + rcases hpigeon with hgood | hcontract + · left + rcases hgood with ⟨j, hhj, hjM, hupper, hlower⟩ + refine ⟨k + j, ?_, ?_, ?_, ?_⟩ + · exact Nat.add_le_add_left hhj k + · exact Nat.add_le_add_left hjM k + · have hleft : + hPk.barSigmaAtScale hStructPk ((j - h : ℕ) : ℤ) = + hP.barSigmaAtScale hStruct (((k + (j - h : ℕ)) : ℕ) : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaAtScale_restrictionScaleNormalizedLaw hStruct k (j - h) + have hright : + hPk.barSigmaAtScale hStructPk (j : ℤ) = + hP.barSigmaAtScale hStruct (((k + j) : ℕ) : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaAtScale_restrictionScaleNormalizedLaw hStruct k j + have hsub : k + (j - h) = k + j - h := by omega + simpa [hleft, hright, hsub] using hupper + · have hleft : + hPk.barSigmaStarAtScale hStructPk ((j - h : ℕ) : ℤ) = + hP.barSigmaStarAtScale hStruct (((k + (j - h : ℕ)) : ℕ) : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaStarAtScale_restrictionScaleNormalizedLaw hStruct k (j - h) + have hright : + hPk.barSigmaStarAtScale hStructPk (j : ℤ) = + hP.barSigmaStarAtScale hStruct (((k + j) : ℕ) : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaStarAtScale_restrictionScaleNormalizedLaw hStruct k j + have hsub : k + (j - h) = k + j - h := by omega + simpa [hleft, hright, hsub] using hlower + · right + have hM : + hPk.thetaAtScale hStructPk (M : ℤ) = + hP.thetaAtScale hStruct ((k + M : ℕ) : ℤ) := by + simpa [hPk, hStructPk] using + hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct k M + have h0 : + hPk.thetaAtScale hStructPk (0 : ℤ) = + hP.thetaAtScale hStruct (k : ℤ) := by + simpa [hPk, hStructPk] using + hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct k 0 + simpa [thetaAtScale_eq, hM, h0] using hcontract + +private theorem rpow_three_neg_mul_antitone_nat + {β : ℝ} (hβ : 0 < β) {h l : ℕ} (hl : h ≤ l) : + Real.rpow (3 : ℝ) (-β * (l : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (h : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hcast : (h : ℝ) ≤ (l : ℝ) := by exact_mod_cast hl + exact mul_le_mul_of_nonpos_left hcast (neg_nonpos.mpr hβ.le) + +private theorem thetaAtScale_le_of_le_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {n m : ℕ} (hnm : n ≤ m) : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (n : ℤ) := by + have hchain := Section54.Pigeonhole.scalarChain_of_P4 hP hStruct hP4 hnm + have hupper : + hP.barSigmaAtScale hStruct (m : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := hchain.2.2 + have hlower : + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ := hchain.2.1 + have hlower_nonneg : + 0 ≤ (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + (Section54.Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 hP hStruct hP4 m).le + have hupper_nonneg : + 0 ≤ hP.barSigmaAtScale hStruct (n : ℤ) := + (Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 n).le + have hprod := mul_le_mul hupper hlower hlower_nonneg hupper_nonneg + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale] using hprod + +private theorem one_le_thetaAtScale_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) := by + simpa [thetaAtScale_eq] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + +private theorem widetildeThetaAtScale_nonneg + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) : + 0 ≤ widetildeThetaAtScale P m hP4 := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos) + +private theorem log_two_add_mul_le_const_mul_log_two_add + {A x : ℝ} (hA : 1 ≤ A) (hx : 0 ≤ x) : + Real.log (2 + x * A) ≤ (1 + 2 * A) * Real.log (2 + x) := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hxarg_pos : 0 < 2 + x := + add_pos_of_pos_of_nonneg (by norm_num) hx + have hleft_pos : 0 < 2 + x * A := + add_pos_of_pos_of_nonneg (by norm_num) (mul_nonneg hx hA_pos.le) + have harg_le : 2 + x * A ≤ A * (2 + x) := by + calc + 2 + x * A ≤ 2 * A + x * A := by + have htwo_le : (2 : ℝ) ≤ 2 * A := by + simpa using + mul_le_mul_of_nonneg_left hA (by norm_num : (0 : ℝ) ≤ 2) + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right htwo_le (x * A) + _ = A * (2 + x) := by ring + have hlog_le : + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := + Real.log_le_log hleft_pos harg_le + have hmul_log : + Real.log (A * (2 + x)) = Real.log A + Real.log (2 + x) := by + rw [Real.log_mul hA_pos.ne' hxarg_pos.ne'] + have hlogA_le : Real.log A ≤ A := Real.log_le_self hA_pos.le + have hlog_two_le : Real.log 2 ≤ Real.log (2 + x) := by + exact Real.log_le_log (by norm_num) (le_add_of_nonneg_right hx) + have hone_le_two_log : (1 : ℝ) ≤ 2 * Real.log (2 + x) := by + have htwo : (1 : ℝ) ≤ 2 * Real.log 2 := by + nlinarith [Real.log_two_gt_d9] + exact htwo.trans (mul_le_mul_of_nonneg_left hlog_two_le (by norm_num)) + have hA_le : A ≤ 2 * A * Real.log (2 + x) := by + calc + A = A * 1 := by ring + _ ≤ A * (2 * Real.log (2 + x)) := + mul_le_mul_of_nonneg_left hone_le_two_log hA_pos.le + _ = 2 * A * Real.log (2 + x) := by ring + calc + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := hlog_le + _ = Real.log A + Real.log (2 + x) := hmul_log + _ ≤ 2 * A * Real.log (2 + x) + Real.log (2 + x) := by + exact add_le_add (hlogA_le.trans hA_le) le_rfl + _ = (1 + 2 * A) * Real.log (2 + x) := by ring + +private theorem natCeil_le_three_mul_of_half_le {x : ℝ} (hx : (2 : ℝ)⁻¹ ≤ x) : + (Nat.ceil x : ℝ) ≤ 3 * x := by + have hx_nonneg : 0 ≤ x := (by norm_num : (0 : ℝ) ≤ (2 : ℝ)⁻¹).trans hx + have hceil : (Nat.ceil x : ℝ) ≤ x + 1 := + (Nat.ceil_lt_add_one hx_nonneg).le + have htail : x + 1 ≤ 3 * x := by + have hone_le_two_mul : (1 : ℝ) ≤ 2 * x := by + calc + (1 : ℝ) = 2 * (2 : ℝ)⁻¹ := by norm_num + _ ≤ 2 * x := mul_le_mul_of_nonneg_left hx (by norm_num) + calc + x + 1 ≤ x + 2 * x := add_le_add le_rfl hone_le_two_mul + _ = 3 * x := by ring + exact hceil.trans htail + +private theorem rpow_three_neg_mul_le_inv_of_log_gap + {β A : ℝ} {h : ℕ} (hβ : 0 < β) (hA : 1 ≤ A) + (hh : (β * Real.log 3)⁻¹ * Real.log A ≤ (h : ℝ)) : + Real.rpow (3 : ℝ) (-β * (h : ℝ)) ≤ A⁻¹ := by + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβlog : 0 < β * Real.log 3 := mul_pos hβ hlog3 + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hlogA_nonneg : 0 ≤ Real.log A := Real.log_nonneg hA + have hmain : Real.log A ≤ β * Real.log 3 * (h : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hh hβlog.le + have hcancel : β * Real.log 3 * ((β * Real.log 3)⁻¹ * Real.log A) = + Real.log A := by + field_simp [hβlog.ne'] + rw [← hcancel] + exact hmul + have hexp : + Real.log (3 : ℝ) * (-β * (h : ℝ)) ≤ -Real.log A := by + calc + Real.log (3 : ℝ) * (-β * (h : ℝ)) = + -(β * Real.log 3 * (h : ℝ)) := by ring + _ ≤ -Real.log A := neg_le_neg hmain + calc + Real.rpow (3 : ℝ) (-β * (h : ℝ)) = + Real.exp (Real.log (3 : ℝ) * (-β * (h : ℝ))) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) + (y := -β * (h : ℝ)) (by norm_num : 0 < (3 : ℝ))) + _ ≤ Real.exp (-Real.log A) := Real.exp_le_exp.mpr hexp + _ = A⁻¹ := by + rw [Real.exp_neg, Real.exp_log hA_pos] + +/-- The core Section 5.5 improvement step with the auxiliary gap `h` and +smallness conditions left explicit. + +The final note-facing lemma will choose `δ` and `h` from `σ`; this theorem +locks down the mathematical iteration once those scalar choices are supplied. -/ +theorem oneStepAnnealedImprovement_homogenizationScale_of_auxiliary + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta sigma : ℝ}, 0 < delta → delta ≤ 1 / 2 → + 0 < sigma → sigma ≤ 1 / 2 → + ∀ {k M h : ℕ}, + (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|)) * h ≤ M → + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (h : ℝ) → + C * Real.rpow delta (1 / 4 : ℝ) ≤ sigma / 2 → + C * Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * (h : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ sigma / 2 → + thetaAtScale hP hStruct ((k + M + h : ℕ) : ℤ) ≤ + 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by + obtain ⟨Cstep, hCstep_pos, hCstep⟩ := + shiftedOneStepContraction_homogenizationScale (d := d) params + have hβpos : 0 < section53CoarseFluctuationBetaParams params := + section53CoarseFluctuationBetaParams_pos params + obtain ⟨Cshift, hCshift_nonneg, hCshift⟩ := + shiftedWidetildeThetaBound_homogenizationScale + (d := d) params.xi (section53CoarseFluctuationBetaParams params) hβpos + let C : ℝ := max Cstep Cshift + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le hCstep_pos (le_max_left _ _) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams delta sigma hdelta_pos hdelta_le + hsigma_pos hsigma_le k M h hpigeon hsep hsmall_delta hsmall_tail + have hxi : hP4.xi = params.xi := by + simp [← hparams] + have hβeq : + section53CoarseFluctuationBeta hP4 = + section53CoarseFluctuationBetaParams params := by + simpa [hparams] using (section53CoarseFluctuationBetaParams_eq_of_P4 hP4).symm + have hCstep_le_C : Cstep ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hCshift_le_C : Cshift ≤ C := by + dsimp [C] + exact le_max_right _ _ + have hW0_nonneg : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_nonneg P hP4 0 + have hlog_nonneg : + 0 ≤ Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + apply Real.log_nonneg + have harg_nonneg : + 0 ≤ delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4 := by + have hdelta_inv_nonneg : 0 ≤ delta⁻¹ := inv_nonneg.mpr hdelta_pos.le + have hxi_nonneg : 0 ≤ (params.xi : ℝ) := by positivity + positivity + nlinarith + have hsep_step : + Cstep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (h : ℝ) := by + have hxi_nonneg : 0 ≤ (params.xi : ℝ) := by positivity + exact + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hCstep_le_C hxi_nonneg) hlog_nonneg).trans hsep + have htail_at_le {l : ℕ} (hl : h ≤ l) : + Cshift * Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * (l : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ sigma / 2 := by + have hdecay := rpow_three_neg_mul_antitone_nat hβpos hl + have hcoefficient := mul_le_mul_of_nonneg_right hCshift_le_C + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) + (-(section53CoarseFluctuationBetaParams params) * (l : ℝ))) + exact (mul_le_mul_of_nonneg_right + (hcoefficient.trans (mul_le_mul_of_nonneg_left hdecay hC_pos.le)) + hW0_nonneg).trans hsmall_tail + have hdelta_at_le : + Cstep * Real.rpow delta (1 / 4 : ℝ) ≤ sigma / 2 := by + have hdelta_pow_nonneg : 0 ≤ Real.rpow delta (1 / 4 : ℝ) := + Real.rpow_nonneg hdelta_pos.le _ + exact (mul_le_mul_of_nonneg_right hCstep_le_C hdelta_pow_nonneg).trans + hsmall_delta + have hwindow := + windowPigeonhole_homogenizationScale hP hStruct hP4 hdelta_pos hdelta_le + hsigma_pos hsigma_le (k := k) (M := M) (h := h) hpigeon + let F : ℕ := k + M + h + rcases hwindow with hgood | hcontract + · rcases hgood with ⟨n, hkhn, hnM, hgood_upper, hgood_lower⟩ + have hnh_le_n : n - h ≤ n := Nat.sub_le n h + have hsep_good : + Cstep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ + ((n - (n - h) : ℕ) : ℝ) := by + have hn_sub : n - (n - h) = h := by omega + simpa [hn_sub] using hsep_step + have hlocal := + hCstep hP hStruct hP4 hparams hdelta_pos hdelta_le hnh_le_n + hsep_good hgood_upper hgood_lower + have hk_le_nh : k ≤ n - h := by omega + have htheta_nh_le_k : + thetaAtScale hP hStruct ((n - h : ℕ) : ℤ) ≤ + thetaAtScale hP hStruct (k : ℤ) := + thetaAtScale_le_of_le_P4 hP hStruct hP4 hk_le_nh + have htheta_k_nonneg : 0 ≤ thetaAtScale hP hStruct (k : ℤ) := + le_trans zero_le_one (one_le_thetaAtScale_of_P4 hP hStruct hP4 k) + have htheta_n_le : + thetaAtScale hP hStruct (n : ℤ) ≤ + 1 + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ) := by + calc + thetaAtScale hP hStruct (n : ℤ) + ≤ 1 + Cstep * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct ((n - h : ℕ) : ℤ) := hlocal + _ ≤ 1 + (sigma / 2) * + thetaAtScale hP hStruct ((n - h : ℕ) : ℤ) := by + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_right hdelta_at_le + (le_trans zero_le_one + (one_le_thetaAtScale_of_P4 hP hStruct hP4 (n - h)))) + _ ≤ 1 + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ) := by + have hsigma_half_nonneg : 0 ≤ sigma / 2 := by positivity + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_left htheta_nh_le_k hsigma_half_nonneg) + have hnF : n ≤ F := by + dsimp [F] + omega + have hshift := hCshift hP hStruct hP4 hxi hβeq (k := n) (n := F) hnF + have htail_F : + Cshift * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * + ((F - n : ℕ) : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ sigma / 2 := by + have hh_le : h ≤ F - n := by + dsimp [F] + omega + exact htail_at_le hh_le + calc + thetaAtScale hP hStruct (F : ℤ) + ≤ shiftedWidetildeThetaAtScale P (F : ℤ) hP4 + (2 * section53CoarseFluctuationBetaParams params) := by + simpa [F] using hshift.1 + _ ≤ thetaAtScale hP hStruct (n : ℤ) + + Cshift * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * + ((F - n : ℕ) : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [F] using hshift.2 + _ ≤ (1 + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ)) + + sigma / 2 := add_le_add htheta_n_le htail_F + _ ≤ 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by + have hhalf_le : + sigma / 2 ≤ (sigma / 2) * thetaAtScale hP hStruct (k : ℤ) := by + have hone := one_le_thetaAtScale_of_P4 hP hStruct hP4 k + have hsigma_half_nonneg : 0 ≤ sigma / 2 := by positivity + simpa using mul_le_mul_of_nonneg_left hone hsigma_half_nonneg + calc + (1 + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ)) + + sigma / 2 + ≤ (1 + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ)) + + (sigma / 2) * thetaAtScale hP hStruct (k : ℤ) := + add_le_add le_rfl hhalf_le + _ = 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by ring + · have hshift := hCshift hP hStruct hP4 hxi hβeq + (k := k + M) (n := F) (by dsimp [F]; omega) + have htail_F : + Cshift * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * + ((F - (k + M) : ℕ) : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ sigma / 2 := by + have hh_le : h ≤ F - (k + M) := by + dsimp [F] + omega + exact htail_at_le hh_le + calc + thetaAtScale hP hStruct (F : ℤ) + ≤ shiftedWidetildeThetaAtScale P (F : ℤ) hP4 + (2 * section53CoarseFluctuationBetaParams params) := by + simpa [F] using hshift.1 + _ ≤ thetaAtScale hP hStruct ((k + M : ℕ) : ℤ) + + Cshift * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * + ((F - (k + M) : ℕ) : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [F] using hshift.2 + _ ≤ sigma * thetaAtScale hP hStruct (k : ℤ) + sigma / 2 := + add_le_add hcontract htail_F + _ ≤ 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by + have hsigma_half_le_one : sigma / 2 ≤ 1 := by + calc + sigma / 2 ≤ (1 / 2 : ℝ) / 2 := + div_le_div_of_nonneg_right hsigma_le (by norm_num) + _ ≤ 1 := by norm_num + calc + sigma * thetaAtScale hP hStruct (k : ℤ) + sigma / 2 + ≤ sigma * thetaAtScale hP hStruct (k : ℤ) + 1 := + add_le_add le_rfl hsigma_half_le_one + _ = 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by ring + +/-- The auxiliary improvement step restated with the final endpoint `N` and +the exact discrete gap condition used in the manuscript proof. -/ +theorem oneStepAnnealedImprovement_homogenizationScale_of_discrete_gap + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta sigma : ℝ}, 0 < delta → delta ≤ 1 / 2 → + 0 < sigma → sigma ≤ 1 / 2 → + ∀ {k N h : ℕ}, k ≤ N → + (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) + 1) * h ≤ N - k → + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ (h : ℝ) → + C * Real.rpow delta (1 / 4 : ℝ) ≤ sigma / 2 → + C * Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * (h : ℝ)) * + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ sigma / 2 → + thetaAtScale hP hStruct (N : ℤ) ≤ + 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by + obtain ⟨C, hC_pos, hC⟩ := + oneStepAnnealedImprovement_homogenizationScale_of_auxiliary (d := d) params + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams delta sigma hdelta_pos hdelta_le + hsigma_pos hsigma_le k N h hkN hgap hsep hsmall_delta hsmall_tail + let r : ℕ := Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) + let M : ℕ := N - k - h + have hgap_add : r * h + h ≤ N - k := by + have hgap_one : (1 + r) * h ≤ N - k := by + simpa [r, add_comm] using hgap + have hone : (1 + r) * h = r * h + h := by + rw [Nat.add_mul, one_mul, add_comm] + simpa [hone] using hgap_one + have hh_le_Nk : h ≤ N - k := + le_trans (Nat.le_add_left h (r * h)) hgap_add + have hpigeon : r * h ≤ M := by + dsimp [M] + exact Nat.le_sub_of_add_le hgap_add + have hfinal : k + M + h = N := by + have hMh : M + h = N - k := by + dsimp [M] + exact Nat.sub_add_cancel hh_le_Nk + calc + k + M + h = k + (M + h) := by omega + _ = k + (N - k) := by rw [hMh] + _ = N := Nat.add_sub_of_le hkN + have haux := + hC hP hStruct hP4 hparams hdelta_pos hdelta_le hsigma_pos hsigma_le + (k := k) (M := M) (h := h) (by simpa [r] using hpigeon) + hsep hsmall_delta hsmall_tail + simpa [hfinal] using haux + +private theorem oneStepAnnealedImprovement_scalar_discreteInputs + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) + {C0 : ℝ} (hC0_pos : 0 < C0) : + ∃ C : ℝ, 0 < C ∧ + ∀ {sigma T : ℝ}, 0 < sigma → sigma ≤ 1 / 2 → 0 ≤ T → + ∀ {k N : ℕ}, + C * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * T) ≤ + ((N - k : ℕ) : ℝ) → + ∃ delta : ℝ, ∃ h : ℕ, + 0 < delta ∧ + delta ≤ 1 / 2 ∧ + (Nat.ceil (2 * delta⁻¹ * |Real.log sigma|) + 1) * h ≤ N - k ∧ + C0 * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * T) ≤ (h : ℝ) ∧ + C0 * Real.rpow delta (1 / 4 : ℝ) ≤ sigma / 2 ∧ + C0 * Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * (h : ℝ)) * + T ≤ sigma / 2 := by + let B : ℝ := max C0 1 + let β : ℝ := section53CoarseFluctuationBetaParams params + let D : ℝ := max B ((β * Real.log 3)⁻¹) + let Aconst : ℝ := (2 * B) ^ (4 : ℕ) + let Klog : ℝ := 1 + 2 * Aconst + let C : ℝ := max (30 * D * Aconst * Klog) 1 + have hB_pos : 0 < B := by + dsimp [B] + exact lt_of_lt_of_le zero_lt_one (le_max_right _ _) + have hB_ge_C0 : C0 ≤ B := by dsimp [B]; exact le_max_left _ _ + have hB_ge_one : 1 ≤ B := by dsimp [B]; exact le_max_right _ _ + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBetaParams_pos params + have hlog3_pos : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hβlog_pos : 0 < β * Real.log 3 := mul_pos hβ_pos hlog3_pos + have hD_ge_B : B ≤ D := by dsimp [D]; exact le_max_left _ _ + have hD_ge_inv : (β * Real.log 3)⁻¹ ≤ D := by + dsimp [D] + exact le_max_right _ _ + have hD_pos : 0 < D := lt_of_lt_of_le hB_pos hD_ge_B + have hAconst_pos : 0 < Aconst := by + dsimp [Aconst] + positivity + have hAconst_ge_one : 1 ≤ Aconst := by + dsimp [Aconst] + have htwoB : 1 ≤ 2 * B := by + calc + (1 : ℝ) ≤ 2 * 1 := by norm_num + _ ≤ 2 * B := mul_le_mul_of_nonneg_left hB_ge_one (by norm_num) + simpa using pow_le_pow_left₀ (by norm_num : (0 : ℝ) ≤ 1) htwoB 4 + have hKlog_pos : 0 < Klog := by + dsimp [Klog] + exact add_pos_of_pos_of_nonneg zero_lt_one + (mul_nonneg (by norm_num) hAconst_pos.le) + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le zero_lt_one (le_max_right _ _) + refine ⟨C, hC_pos, ?_⟩ + intro sigma T hsigma_pos hsigma_le hT_nonneg k N hgap + let ξ : ℝ := (params.xi : ℝ) + let sigInv4 : ℝ := sigma⁻¹ ^ (4 : ℕ) + let x : ℝ := sigma / (2 * B) + let delta : ℝ := x ^ (4 : ℕ) + let Aδ : ℝ := 2 + delta⁻¹ * ξ * T + let Bσ : ℝ := 2 + sigInv4 * ξ * T + let H : ℝ := D * ξ * Real.log Aδ + let h : ℕ := Nat.ceil H + change C * ξ * sigInv4 * |Real.log sigma| * Real.log Bσ ≤ + ((N - k : ℕ) : ℝ) at hgap + have hξ_ge_one : 1 ≤ ξ := by + dsimp [ξ] + exact_mod_cast (Nat.succ_le_of_lt params.xi_pos) + have hξ_nonneg : 0 ≤ ξ := le_trans zero_le_one hξ_ge_one + have hsig_nonneg : 0 ≤ sigma := hsigma_pos.le + have hsigInv4_nonneg : 0 ≤ sigInv4 := by + dsimp [sigInv4] + positivity + have hx_pos : 0 < x := by + dsimp [x] + positivity + have hx_nonneg : 0 ≤ x := hx_pos.le + have hx_le_half : x ≤ 1 / 2 := by + dsimp [x] + have hden_pos : 0 < 2 * B := by positivity + have hden_ge_two : (2 : ℝ) ≤ 2 * B := + by + simpa using + mul_le_mul_of_nonneg_left hB_ge_one (by norm_num : (0 : ℝ) ≤ 2) + have hinv_le : (2 * B)⁻¹ ≤ (2 : ℝ)⁻¹ := + inv_anti₀ (by norm_num : (0 : ℝ) < 2) hden_ge_two + calc + sigma / (2 * B) = sigma * (2 * B)⁻¹ := by ring + _ ≤ sigma * (2 : ℝ)⁻¹ := + mul_le_mul_of_nonneg_left hinv_le hsigma_pos.le + _ ≤ (1 / 2 : ℝ) * (2 : ℝ)⁻¹ := + mul_le_mul_of_nonneg_right hsigma_le (by norm_num) + _ ≤ 1 / 2 := by norm_num + have hx_le_one : x ≤ 1 := hx_le_half.trans (by norm_num : (1 / 2 : ℝ) ≤ 1) + have hdelta_pos : 0 < delta := by + dsimp [delta] + exact pow_pos hx_pos 4 + have hdelta_nonneg : 0 ≤ delta := hdelta_pos.le + have hdelta_le_x : delta ≤ x := by + have hx3_le_one : x ^ (3 : ℕ) ≤ 1 := pow_le_one₀ hx_nonneg hx_le_one + calc + delta = x * x ^ (3 : ℕ) := by + dsimp [delta] + ring + _ ≤ x * 1 := mul_le_mul_of_nonneg_left hx3_le_one hx_nonneg + _ = x := by ring + have hdelta_le : delta ≤ 1 / 2 := hdelta_le_x.trans hx_le_half + have hdelta_inv_eq : delta⁻¹ = Aconst * sigInv4 := by + dsimp [delta, x, Aconst, sigInv4] + field_simp [hsigma_pos.ne', hB_pos.ne'] + have hAδ_ge_two : 2 ≤ Aδ := by + have hprod : 0 ≤ delta⁻¹ * ξ * T := by positivity + dsimp [Aδ] + exact le_add_of_nonneg_right hprod + have hAδ_ge_one : 1 ≤ Aδ := + (by norm_num : (1 : ℝ) ≤ 2).trans hAδ_ge_two + have hAδ_pos : 0 < Aδ := lt_of_lt_of_le zero_lt_one hAδ_ge_one + have hBσ_ge_two : 2 ≤ Bσ := by + have hprod : 0 ≤ sigInv4 * ξ * T := by positivity + dsimp [Bσ] + exact le_add_of_nonneg_right hprod + have hBσ_pos : 0 < Bσ := + (by norm_num : (0 : ℝ) < 2).trans_le hBσ_ge_two + have hlogAδ_nonneg : 0 ≤ Real.log Aδ := Real.log_nonneg hAδ_ge_one + have hlogBσ_nonneg : 0 ≤ Real.log Bσ := + Real.log_nonneg ((by norm_num : (1 : ℝ) ≤ 2).trans hBσ_ge_two) + have hAδ_log_le : + Real.log Aδ ≤ Klog * Real.log Bσ := by + have hAδ_le : Aδ ≤ 2 + (sigInv4 * ξ * T) * Aconst := by + calc + Aδ = 2 + (sigInv4 * ξ * T) * Aconst := by + dsimp [Aδ] + rw [hdelta_inv_eq] + ring + _ ≤ 2 + (sigInv4 * ξ * T) * Aconst := le_rfl + have hleft := + Real.log_le_log hAδ_pos hAδ_le + have hcomp := + log_two_add_mul_le_const_mul_log_two_add + (A := Aconst) (x := sigInv4 * ξ * T) hAconst_ge_one + (by positivity) + calc + Real.log Aδ ≤ Real.log (2 + (sigInv4 * ξ * T) * Aconst) := hleft + _ ≤ (1 + 2 * Aconst) * Real.log (2 + sigInv4 * ξ * T) := hcomp + _ = Klog * Real.log Bσ := by simp [Klog, Bσ] + have hH_nonneg : 0 ≤ H := by + dsimp [H] + positivity + have hceilH : H ≤ (h : ℝ) := by + simpa [h] using Nat.le_ceil H + have hsep_aux : + C0 * ξ * Real.log Aδ ≤ (h : ℝ) := by + have hC0_le_D : C0 ≤ D := hB_ge_C0.trans hD_ge_B + calc + C0 * ξ * Real.log Aδ ≤ D * ξ * Real.log Aδ := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hC0_le_D hξ_nonneg) hlogAδ_nonneg + _ = H := by simp [H] + _ ≤ (h : ℝ) := hceilH + have hdelta_root : + Real.rpow delta (1 / 4 : ℝ) = x := by + have hroot := + Real.pow_rpow_inv_natCast hx_nonneg (by norm_num : (4 : ℕ) ≠ 0) + simpa [delta, one_div, x] using hroot + have hsmall_delta : + C0 * Real.rpow delta (1 / 4 : ℝ) ≤ sigma / 2 := by + calc + C0 * Real.rpow delta (1 / 4 : ℝ) = C0 * x := by rw [hdelta_root] + _ ≤ B * x := mul_le_mul_of_nonneg_right hB_ge_C0 hx_nonneg + _ = sigma / 2 := by + dsimp [x] + field_simp [hB_pos.ne'] + have hT_le_delta_Aδ : T ≤ delta * Aδ := by + have hcore : delta⁻¹ * T ≤ Aδ := by + have hξT : delta⁻¹ * T ≤ delta⁻¹ * ξ * T := by + have hδinv_nonneg : 0 ≤ delta⁻¹ := inv_nonneg.mpr hdelta_nonneg + have hT_le_ξT : T ≤ ξ * T := + calc + T = 1 * T := by ring + _ ≤ ξ * T := mul_le_mul_of_nonneg_right hξ_ge_one hT_nonneg + calc + delta⁻¹ * T ≤ delta⁻¹ * (ξ * T) := + mul_le_mul_of_nonneg_left hT_le_ξT hδinv_nonneg + _ = delta⁻¹ * ξ * T := by ring + dsimp [Aδ] + exact le_trans hξT (le_add_of_nonneg_left (by norm_num : (0 : ℝ) ≤ 2)) + have hmul := mul_le_mul_of_nonneg_left hcore hdelta_nonneg + have hcancel : delta * (delta⁻¹ * T) = T := by + field_simp [hdelta_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + have hdecay_le : + Real.rpow (3 : ℝ) (-(β) * (h : ℝ)) ≤ Aδ⁻¹ := by + apply rpow_three_neg_mul_le_inv_of_log_gap hβ_pos hAδ_ge_one + calc + (β * Real.log 3)⁻¹ * Real.log Aδ ≤ D * Real.log Aδ := + mul_le_mul_of_nonneg_right hD_ge_inv hlogAδ_nonneg + _ ≤ D * ξ * Real.log Aδ := by + calc + D * Real.log Aδ = 1 * (D * Real.log Aδ) := by ring + _ ≤ ξ * (D * Real.log Aδ) := by + exact mul_le_mul_of_nonneg_right hξ_ge_one + (mul_nonneg hD_pos.le hlogAδ_nonneg) + _ = D * ξ * Real.log Aδ := by ring + _ = H := by ring + _ ≤ (h : ℝ) := hceilH + have hsmall_tail : + C0 * Real.rpow (3 : ℝ) (-(β) * (h : ℝ)) * T ≤ sigma / 2 := by + have hdecay_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(β) * (h : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hAinvT_le_delta : Aδ⁻¹ * T ≤ delta := by + have hmul := mul_le_mul_of_nonneg_left hT_le_delta_Aδ (inv_nonneg.mpr hAδ_pos.le) + have hcancel : Aδ⁻¹ * (delta * Aδ) = delta := by + field_simp [hAδ_pos.ne'] + rw [hcancel] at hmul + simpa [mul_comm, mul_left_comm, mul_assoc] using hmul + calc + C0 * Real.rpow (3 : ℝ) (-(β) * (h : ℝ)) * T + ≤ B * Real.rpow (3 : ℝ) (-(β) * (h : ℝ)) * T := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hB_ge_C0 hdecay_nonneg) hT_nonneg + _ ≤ B * Aδ⁻¹ * T := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hdecay_le hB_pos.le) hT_nonneg + _ = B * (Aδ⁻¹ * T) := by ring + _ ≤ B * delta := mul_le_mul_of_nonneg_left hAinvT_le_delta hB_pos.le + _ ≤ B * x := mul_le_mul_of_nonneg_left hdelta_le_x hB_pos.le + _ = sigma / 2 := by + dsimp [x] + field_simp [hB_pos.ne'] + let R : ℝ := 2 * delta⁻¹ * |Real.log sigma| + have hlog_sigma_nonpos : Real.log sigma ≤ 0 := + Real.log_nonpos hsigma_pos.le + (hsigma_le.trans (by norm_num : (1 / 2 : ℝ) ≤ 1)) + have habs_log_ge : (2 : ℝ)⁻¹ ≤ |Real.log sigma| := by + have hlog_half : Real.log sigma ≤ Real.log (1 / 2 : ℝ) := by + exact Real.log_le_log hsigma_pos hsigma_le + have hlog_inv : Real.log (1 / 2 : ℝ) = -Real.log 2 := by + rw [show (1 / 2 : ℝ) = (2 : ℝ)⁻¹ by norm_num] + rw [Real.log_inv] + have hlog2_half : (2 : ℝ)⁻¹ ≤ Real.log 2 := + (by norm_num : (2 : ℝ)⁻¹ ≤ 0.6931471803).trans + Real.log_two_gt_d9.le + have hneg : Real.log 2 ≤ -Real.log sigma := by linarith + rw [abs_of_nonpos hlog_sigma_nonpos] + exact hlog2_half.trans hneg + have hdelta_inv_ge_two : 2 ≤ delta⁻¹ := by + have hdelta_le_one_half : delta ≤ 1 / 2 := hdelta_le + have hinv : (1 / 2 : ℝ)⁻¹ ≤ delta⁻¹ := + (inv_le_inv₀ (by norm_num : (0 : ℝ) < 1 / 2) hdelta_pos).2 + hdelta_le_one_half + norm_num at hinv ⊢ + exact hinv + have hR_ge_two : 2 ≤ R := by + have hmul_ge_one : 1 ≤ delta⁻¹ * |Real.log sigma| := by + calc + (1 : ℝ) = 2 * (2 : ℝ)⁻¹ := by norm_num + _ ≤ delta⁻¹ * |Real.log sigma| := + mul_le_mul hdelta_inv_ge_two habs_log_ge + (by norm_num : (0 : ℝ) ≤ (2 : ℝ)⁻¹) + (by linarith) + calc + (2 : ℝ) = 2 * 1 := by ring + _ ≤ 2 * (delta⁻¹ * |Real.log sigma|) := + mul_le_mul_of_nonneg_left hmul_ge_one (by norm_num) + _ = R := by + simp [R] + ring + have hR_half : (2 : ℝ)⁻¹ ≤ R := + (by norm_num : (2 : ℝ)⁻¹ ≤ 2).trans hR_ge_two + have hR_nonneg : 0 ≤ R := + (by norm_num : (0 : ℝ) ≤ 2).trans hR_ge_two + have hR_ge_one : 1 ≤ R := + (by norm_num : (1 : ℝ) ≤ 2).trans hR_ge_two + have hH_half : (2 : ℝ)⁻¹ ≤ H := by + have hlog2_le : Real.log 2 ≤ Real.log Aδ := + Real.log_le_log (by norm_num) hAδ_ge_two + have hhalf_log2 : (2 : ℝ)⁻¹ ≤ Real.log 2 := by + exact (by norm_num : (2 : ℝ)⁻¹ ≤ 0.6931471803).trans + Real.log_two_gt_d9.le + calc + (2 : ℝ)⁻¹ ≤ Real.log 2 := hhalf_log2 + _ ≤ Real.log Aδ := hlog2_le + _ ≤ D * ξ * Real.log Aδ := by + have hDξ_ge_one : 1 ≤ D * ξ := by + have hD_ge_one : 1 ≤ D := hB_ge_one.trans hD_ge_B + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ D * ξ := mul_le_mul hD_ge_one hξ_ge_one + (by norm_num) (by linarith) + exact le_mul_of_one_le_left hlogAδ_nonneg hDξ_ge_one + _ = H := by ring + have hrceil : ((Nat.ceil R + 1 : ℕ) : ℝ) ≤ 5 * R := by + have hr : (Nat.ceil R : ℝ) ≤ 3 * R := + natCeil_le_three_mul_of_half_le hR_half + have hone : (1 : ℝ) ≤ 2 * R := by + calc + (1 : ℝ) ≤ 2 * 1 := by norm_num + _ ≤ 2 * R := mul_le_mul_of_nonneg_left hR_ge_one (by norm_num) + calc + ((Nat.ceil R + 1 : ℕ) : ℝ) = (Nat.ceil R : ℝ) + 1 := by norm_num + _ ≤ 3 * R + 2 * R := add_le_add hr hone + _ = 5 * R := by ring + have hhceil : (h : ℝ) ≤ 3 * H := by + change (Nat.ceil H : ℝ) ≤ 3 * H + exact natCeil_le_three_mul_of_half_le hH_half + have hR_le : + R ≤ 2 * Aconst * sigInv4 * |Real.log sigma| := by + dsimp [R] + rw [hdelta_inv_eq] + ring_nf + exact le_rfl + have hH_le : + H ≤ D * ξ * Klog * Real.log Bσ := by + dsimp [H] + calc + D * ξ * Real.log Aδ ≤ D * ξ * (Klog * Real.log Bσ) := by + exact mul_le_mul_of_nonneg_left hAδ_log_le + (mul_nonneg hD_pos.le hξ_nonneg) + _ = D * ξ * Klog * Real.log Bσ := by ring + have hprod_cast : + (((Nat.ceil R + 1) * h : ℕ) : ℝ) ≤ + 30 * D * Aconst * Klog * ξ * sigInv4 * + |Real.log sigma| * Real.log Bσ := by + calc + (((Nat.ceil R + 1) * h : ℕ) : ℝ) + = ((Nat.ceil R + 1 : ℕ) : ℝ) * (h : ℝ) := by norm_num + _ ≤ (5 * R) * (3 * H) := by + exact mul_le_mul hrceil hhceil (by positivity) (by positivity) + _ ≤ (5 * (2 * Aconst * sigInv4 * |Real.log sigma|)) * + (3 * (D * ξ * Klog * Real.log Bσ)) := by + exact mul_le_mul + (mul_le_mul_of_nonneg_left hR_le (by norm_num)) + (mul_le_mul_of_nonneg_left hH_le (by norm_num)) + (mul_nonneg (by norm_num) hH_nonneg) + (by positivity) + _ = 30 * D * Aconst * Klog * ξ * sigInv4 * + |Real.log sigma| * Real.log Bσ := by ring + have hC_gap : + 30 * D * Aconst * Klog * ξ * sigInv4 * + |Real.log sigma| * Real.log Bσ ≤ + C * ξ * sigInv4 * |Real.log sigma| * Real.log Bσ := by + have hbase_le_C : 30 * D * Aconst * Klog ≤ C := by + dsimp [C] + exact le_max_left _ _ + have htail_nonneg : + 0 ≤ ξ * sigInv4 * |Real.log sigma| * Real.log Bσ := by positivity + calc + 30 * D * Aconst * Klog * ξ * sigInv4 * + |Real.log sigma| * Real.log Bσ + = (30 * D * Aconst * Klog) * + (ξ * sigInv4 * |Real.log sigma| * Real.log Bσ) := by ring + _ ≤ C * (ξ * sigInv4 * |Real.log sigma| * Real.log Bσ) := + mul_le_mul_of_nonneg_right hbase_le_C htail_nonneg + _ = C * ξ * sigInv4 * |Real.log sigma| * Real.log Bσ := by ring + have hgap_nat : + (Nat.ceil R + 1) * h ≤ N - k := by + have hcast : + (((Nat.ceil R + 1) * h : ℕ) : ℝ) ≤ ((N - k : ℕ) : ℝ) := + hprod_cast.trans (hC_gap.trans hgap) + exact Nat.cast_le.mp hcast + refine ⟨delta, h, hdelta_pos, hdelta_le, ?_, ?_, hsmall_delta, ?_⟩ + · simpa [R] using hgap_nat + · simpa [Aδ, ξ] using hsep_aux + · simpa [β] using hsmall_tail + +/-- One improvement step for the annealed scalar contrast. + +This is the note-facing Section 5.5 form, with the constant chosen from the +parameter record before the law, the window, and `σ`. The Lean statement uses +`(σ⁻¹)^4` for the manuscript factor `σ^{-4}`. -/ +theorem oneStepAnnealedImprovement_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {sigma : ℝ}, 0 < sigma → sigma ≤ 1 / 2 → + ∀ {k N : ℕ}, k ≤ N → + C * (params.xi : ℝ) * (sigma⁻¹ ^ (4 : ℕ)) * |Real.log sigma| * + Real.log (2 + sigma⁻¹ ^ (4 : ℕ) * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ ((N - k : ℕ) : ℝ) → + thetaAtScale hP hStruct (N : ℤ) ≤ + 1 + sigma * thetaAtScale hP hStruct (k : ℤ) := by + obtain ⟨C0, hC0_pos, hC0⟩ := + oneStepAnnealedImprovement_homogenizationScale_of_discrete_gap (d := d) params + obtain ⟨C, hC_pos, hCscalar⟩ := + oneStepAnnealedImprovement_scalar_discreteInputs (d := d) params hC0_pos + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams sigma hsigma_pos hsigma_le k N hkN hgap + have hT_nonneg : + 0 ≤ widetildeThetaAtScale P (0 : ℤ) hP4 := + widetildeThetaAtScale_nonneg P hP4 0 + obtain ⟨delta, h, hdelta_pos, hdelta_le, hgap_nat, hsep_aux, + hsmall_delta, hsmall_tail⟩ := + hCscalar (sigma := sigma) (T := widetildeThetaAtScale P (0 : ℤ) hP4) + hsigma_pos hsigma_le hT_nonneg (k := k) (N := N) hgap + exact + hC0 hP hStruct hP4 hparams hdelta_pos hdelta_le hsigma_pos hsigma_le + hkN hgap_nat hsep_aux hsmall_delta hsmall_tail + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/DilatedP4.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/DilatedP4.lean new file mode 100644 index 0000000000..b6f415c215 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/DilatedP4.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability + +/-! # Dilated P4 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace QuantitativeCoarseGrainedEllipticity + +open MeasureTheory + +noncomputable section + +private theorem upperMomentIntegrable_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k : ℕ) : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (0 : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) (Ch04.restrictionScaleNormalizedLaw k P) := by + let X : RegCoeffField d → ℝ := fun a => + (Ch04.LambdaSqCoeffField (originCube d (0 : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi + have hX : + AEStronglyMeasurable X (Ch04.restrictionScaleNormalizedLaw k P) := by + simpa [X] using + (((hP.scaleNormalized k).aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (0 : ℤ)) hP4.sUpper_pos).pow_const hP4.xi).aestronglyMeasurable + rw [Ch04.integrable_restrictionScaleNormalizedLaw_iff k hX] + have hbase := Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 k + refine hbase.congr ?_ + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← Ch04.rescaleReg_eq_dilateReg_neg_nat k] + have hshift := + Ch04.LambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k 0 hP4.sUpper (.finite 1) + simpa [X] using (congrArg (fun z : ℝ => z ^ hP4.xi) hshift).symm + +private theorem lowerInvMomentIntegrable_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k : ℕ) : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (0 : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) (Ch04.restrictionScaleNormalizedLaw k P) := by + let X : RegCoeffField d → ℝ := fun a => + ((Ch04.lambdaSqCoeffField (originCube d (0 : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi + have hX : + AEStronglyMeasurable X (Ch04.restrictionScaleNormalizedLaw k P) := by + simpa [X] using + (((hP.scaleNormalized k).aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (0 : ℤ)) hP4.sLower_pos).pow_const hP4.xi).aestronglyMeasurable + rw [Ch04.integrable_restrictionScaleNormalizedLaw_iff k hX] + have hbase := Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 k + refine hbase.congr ?_ + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + rw [← Ch04.rescaleReg_eq_dilateReg_neg_nat k] + have hshift := + Ch04.lambdaSqCoeffField_originCube_rescaleCoeffField_of_aelocallyUniformlyElliptic + ha k 0 hP4.sLower (.finite 1) + simpa [X] using + (congrArg (fun z : ℝ => z⁻¹ ^ hP4.xi) hshift).symm + +/-- The Chapter 5 quantitative coarse-grained ellipticity hypothesis is stable +under Ch4 scale normalization. The unit-scale moment assumptions for the +pushed law are exactly the arbitrary-scale moment consequences of `(P4)` for +the original law. -/ +def scaleNormalized {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (k : ℕ) : + QuantitativeCoarseGrainedEllipticity (Ch04.restrictionScaleNormalizedLaw k P) where + sUpper := hP4.sUpper + sLower := hP4.sLower + xi := hP4.xi + two_le_dim := hP4.two_le_dim + sUpper_nonneg := hP4.sUpper_nonneg + sUpper_lt_one := hP4.sUpper_lt_one + sLower_nonneg := hP4.sLower_nonneg + sLower_lt_one := hP4.sLower_lt_one + xi_gt_two_mul_dim := hP4.xi_gt_two_mul_dim + sum_lt_one := hP4.sum_lt_one + dim_div_xi_lt_min := hP4.dim_div_xi_lt_min + upper_moment_integrable := + upperMomentIntegrable_restrictionScaleNormalizedLaw hP hStruct hP4 k + lower_inv_moment_integrable := + lowerInvMomentIntegrable_restrictionScaleNormalizedLaw hP hStruct hP4 k + +end + +end QuantitativeCoarseGrainedEllipticity +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedOneStepContraction.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedOneStepContraction.lean new file mode 100644 index 0000000000..ca30ec7c52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedOneStepContraction.lean @@ -0,0 +1,602 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final + +/-! # Shifted One Step Contraction -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem section53CoarseFluctuationBetaCoreParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaCoreParams params := by + have hgap : 0 < 1 - params.sUpper - params.sLower := by + linarith [params.sum_lt_one] + have hupper : 0 < params.sUpper := params.sUpper_pos + have hlower : 0 < params.sLower := params.sLower_pos + have hupper_gain : 0 < params.sUpper - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < params.sLower - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sLower] + unfold section53CoarseFluctuationBetaCoreParams + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +private theorem section53CoarseFluctuationBetaParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaParams params := by + unfold section53CoarseFluctuationBetaParams + exact div_pos (section53CoarseFluctuationBetaCoreParams_pos params) (by norm_num) + +private theorem section53CoarseFluctuationBetaCoreParams_le_sum_gap {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + section53CoarseFluctuationBetaCoreParams params ≤ + 1 - params.sUpper - params.sLower := by + unfold section53CoarseFluctuationBetaCoreParams + exact min_le_left _ _ + +private theorem betaShiftedParams_sUpper_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + params.sUpper + section53CoarseFluctuationBetaParams params < 1 := by + have hcore_le := section53CoarseFluctuationBetaCoreParams_le_sum_gap params + have hcore_pos := section53CoarseFluctuationBetaCoreParams_pos params + have hlower_nonneg := params.sLower_nonneg + unfold section53CoarseFluctuationBetaParams + linarith + +private theorem betaShiftedParams_sLower_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + params.sLower + section53CoarseFluctuationBetaParams params < 1 := by + have hcore_le := section53CoarseFluctuationBetaCoreParams_le_sum_gap params + have hcore_pos := section53CoarseFluctuationBetaCoreParams_pos params + have hupper_nonneg := params.sUpper_nonneg + unfold section53CoarseFluctuationBetaParams + linarith + +private theorem betaShiftedParams_sum_lt_one {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (params.sUpper + section53CoarseFluctuationBetaParams params) + + (params.sLower + section53CoarseFluctuationBetaParams params) < 1 := by + have hcore_le := section53CoarseFluctuationBetaCoreParams_le_sum_gap params + have hcore_pos := section53CoarseFluctuationBetaCoreParams_pos params + unfold section53CoarseFluctuationBetaParams + linarith + +/-- Parameter-only `(P4)` data with both regularity exponents shifted by the +Section 5.3/5.5 exponent `β`. -/ +def betaShiftedParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + QuantitativeCoarseGrainedEllipticityParams d where + sUpper := params.sUpper + section53CoarseFluctuationBetaParams params + sLower := params.sLower + section53CoarseFluctuationBetaParams params + xi := params.xi + two_le_dim := params.two_le_dim + sUpper_nonneg := + add_nonneg params.sUpper_nonneg + (section53CoarseFluctuationBetaParams_pos params).le + sUpper_lt_one := betaShiftedParams_sUpper_lt_one params + sLower_nonneg := + add_nonneg params.sLower_nonneg + (section53CoarseFluctuationBetaParams_pos params).le + sLower_lt_one := betaShiftedParams_sLower_lt_one params + xi_gt_two_mul_dim := params.xi_gt_two_mul_dim + sum_lt_one := betaShiftedParams_sum_lt_one params + dim_div_xi_lt_min := by + rw [lt_min_iff] + constructor + · linarith [params.dim_div_xi_lt_sUpper, + section53CoarseFluctuationBetaParams_pos params] + · linarith [params.dim_div_xi_lt_sLower, + section53CoarseFluctuationBetaParams_pos params] + +@[simp] +theorem betaShiftedP4_params {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + (betaShiftedP4 hP hStruct hP4).params = betaShiftedParams hP4.params := rfl + +/-- Shifted one-step contraction on a window `[k,n]`, with the local shifted +moment budget at scale `k` left explicit. + +This is the direct dilation of Section 5.4 after shifting the `(P4)` +exponents by one `β`. The constant is chosen from the parameter-only data +before the law and the window. -/ +theorem shiftedOneStepContraction_homogenizationScale_of_local_shifted_budget + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta : ℝ}, 0 < delta → delta ≤ 1 / 2 → + ∀ {k n : ℕ}, k ≤ n → + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) ≤ + ((n - k : ℕ) : ℝ) → + hP.barSigmaAtScale hStruct (k : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (n : ℤ) → + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ → + thetaAtScale hP hStruct (n : ℤ) ≤ + 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := by + obtain ⟨C, hC_pos, hC⟩ := + Section54.OneStepContraction.oneStepContraction_homogenizationScale + (betaShiftedParams params) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams delta hdelta_pos hdelta_le k n hkn hsep + hgood_upper hgood_lower + let Pk := Ch04.restrictionScaleNormalizedLaw k P + let hPk := hP.scaleNormalized k + let hStructPk := hStruct.scaleNormalized k + let hP4k := hP4.scaleNormalized hP hStruct k + let hP4kβ := betaShiftedP4 hPk hStructPk hP4k + let m : ℕ := n - k + have hβeq : + section53CoarseFluctuationBeta hP4 = + section53CoarseFluctuationBetaParams params := by + simpa [hparams] using (section53CoarseFluctuationBetaParams_eq_of_P4 hP4).symm + have hparamsβ : hP4kβ.params = betaShiftedParams params := by + calc + hP4kβ.params = betaShiftedParams hP4k.params := by + simp [hP4kβ] + _ = betaShiftedParams hP4.params := rfl + _ = betaShiftedParams params := by rw [hparams] + have hW : + widetildeThetaAtScale Pk (0 : ℤ) hP4kβ = + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) := by + have hβeq_k : + section53CoarseFluctuationBeta hP4k = + section53CoarseFluctuationBetaParams params := by + simpa [hP4k, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using! hβeq + have hshift := + shiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw hP hStruct hP4 + (η := section53CoarseFluctuationBetaParams params) + (by + have hβpos : 0 < section53CoarseFluctuationBetaParams params := by + simpa [← hβeq] using section53CoarseFluctuationBeta_pos hP4 + linarith [hP4.sUpper_pos]) + (by + have hβpos : 0 < section53CoarseFluctuationBetaParams params := by + simpa [← hβeq] using section53CoarseFluctuationBeta_pos hP4 + linarith [hP4.sLower_pos]) + k 0 + simpa [Pk, hP4k, hP4kβ, betaShiftedP4, hβeq, + hβeq_k, shiftedWidetildeThetaAtScale] using hshift + have hsep_k : + C * ((betaShiftedParams params).xi : ℝ) * + Real.log (2 + delta⁻¹ * ((betaShiftedParams params).xi : ℝ) * + widetildeThetaAtScale Pk (0 : ℤ) hP4kβ) ≤ (m : ℝ) := by + rw [hW] + simpa [m, betaShiftedParams] using hsep + have hgood_upper_k : + hPk.barSigmaAtScale hStructPk (0 : ℤ) ≤ + (1 + delta) * hPk.barSigmaAtScale hStructPk (m : ℤ) := by + have h0 : + hPk.barSigmaAtScale hStructPk (0 : ℤ) = + hP.barSigmaAtScale hStruct (k : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaAtScale_restrictionScaleNormalizedLaw hStruct k 0 + have hm : + hPk.barSigmaAtScale hStructPk (m : ℤ) = + hP.barSigmaAtScale hStruct (n : ℤ) := by + simpa [hPk, hStructPk, m, Nat.add_sub_of_le hkn] using + hP.barSigmaAtScale_restrictionScaleNormalizedLaw hStruct k m + simpa [h0, hm] using hgood_upper + have hgood_lower_k : + (hPk.barSigmaStarAtScale hStructPk (0 : ℤ))⁻¹ ≤ + (1 + delta) * (hPk.barSigmaStarAtScale hStructPk (m : ℤ))⁻¹ := by + have h0 : + hPk.barSigmaStarAtScale hStructPk (0 : ℤ) = + hP.barSigmaStarAtScale hStruct (k : ℤ) := by + simpa [hPk, hStructPk] using + hP.barSigmaStarAtScale_restrictionScaleNormalizedLaw hStruct k 0 + have hm : + hPk.barSigmaStarAtScale hStructPk (m : ℤ) = + hP.barSigmaStarAtScale hStruct (n : ℤ) := by + simpa [hPk, hStructPk, m, Nat.add_sub_of_le hkn] using + hP.barSigmaStarAtScale_restrictionScaleNormalizedLaw hStruct k m + simpa [h0, hm] using hgood_lower + have hlocal := + hC hPk hStructPk hP4kβ hparamsβ hdelta_pos hdelta_le + (m := m) hsep_k hgood_upper_k hgood_lower_k + have htheta0 : + hPk.thetaAtScale hStructPk (0 : ℤ) = + hP.thetaAtScale hStruct (k : ℤ) := by + simpa [hPk, hStructPk] using + hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct k 0 + have hthetam : + hPk.thetaAtScale hStructPk (m : ℤ) = + hP.thetaAtScale hStruct (n : ℤ) := by + simpa [hPk, hStructPk, m, Nat.add_sub_of_le hkn] using + hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct k m + simpa [htheta0, hthetam] using hlocal + +private theorem widetildeThetaAtScale_nonneg + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) : + 0 ≤ widetildeThetaAtScale P m hP4 := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos) + +private theorem thetaAtScale_zero_le_widetildeThetaAtScale_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + thetaAtScale hP hStruct 0 ≤ widetildeThetaAtScale P 0 hP4 := by + have hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P := + fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l + have hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P := + fun l => Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P := + fun l => Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + simpa using + Section52.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hP hStruct hP4 hBlock hUpperPowInt hLowerPowInt 0 + +private theorem log_two_add_mul_le_const_mul_log_two_add + {A x : ℝ} (hA : 1 ≤ A) (hx : 0 ≤ x) : + Real.log (2 + x * A) ≤ (1 + 2 * A) * Real.log (2 + x) := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hxarg_pos : 0 < 2 + x := by positivity + have hleft_pos : 0 < 2 + x * A := by positivity + have harg_le : 2 + x * A ≤ A * (2 + x) := by + have htwo_le_twoA : (2 : ℝ) ≤ 2 * A := by linarith + calc + 2 + x * A = x * A + 2 := by ring + _ ≤ x * A + 2 * A := add_le_add_right htwo_le_twoA (x * A) + _ = 2 * A + x * A := by ring + _ = A * (2 + x) := by ring + have hlog_le : + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := + Real.log_le_log hleft_pos harg_le + have hmul_log : + Real.log (A * (2 + x)) = Real.log A + Real.log (2 + x) := by + rw [Real.log_mul hA_pos.ne' hxarg_pos.ne'] + have hlogA_le : Real.log A ≤ A := Real.log_le_self hA_pos.le + have hlog_two_le : Real.log 2 ≤ Real.log (2 + x) := by + have htwo_le : (2 : ℝ) ≤ 2 + x := by + simpa using add_le_add_left hx (2 : ℝ) + exact Real.log_le_log (by norm_num) htwo_le + have hone_le_two_log : (1 : ℝ) ≤ 2 * Real.log (2 + x) := by + have htwo : (1 : ℝ) ≤ 2 * Real.log 2 := by + linarith [Real.log_two_gt_d9] + exact htwo.trans (mul_le_mul_of_nonneg_left hlog_two_le (by norm_num)) + have hA_le : A ≤ 2 * A * Real.log (2 + x) := by + have hmul := mul_le_mul_of_nonneg_right hone_le_two_log hA_pos.le + calc + A = 1 * A := by ring + _ ≤ (2 * Real.log (2 + x)) * A := hmul + _ = 2 * A * Real.log (2 + x) := by ring + calc + Real.log (2 + x * A) ≤ Real.log (A * (2 + x)) := hlog_le + _ = Real.log A + Real.log (2 + x) := hmul_log + _ ≤ 2 * A * Real.log (2 + x) + Real.log (2 + x) := by + calc + Real.log A + Real.log (2 + x) = Real.log (2 + x) + Real.log A := by ring + _ ≤ Real.log (2 + x) + 2 * A * Real.log (2 + x) := + add_le_add_right (hlogA_le.trans hA_le) (Real.log (2 + x)) + _ = 2 * A * Real.log (2 + x) + Real.log (2 + x) := by ring + _ = (1 + 2 * A) * Real.log (2 + x) := by ring + +/-- Shifted one-step contraction with the global scale-zero moment budget. + +The constant is chosen from the parameter-only `(P4)` data before the law, +the scale window, and `δ`. -/ +theorem shiftedOneStepContraction_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + ∀ {delta : ℝ}, 0 < delta → delta ≤ 1 / 2 → + ∀ {k n : ℕ}, k ≤ n → + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ + ((n - k : ℕ) : ℝ) → + hP.barSigmaAtScale hStruct (k : ℤ) ≤ + (1 + delta) * hP.barSigmaAtScale hStruct (n : ℤ) → + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ ≤ + (1 + delta) * (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ → + thetaAtScale hP hStruct (n : ℤ) ≤ + 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := by + obtain ⟨Cstep, hCstep_pos, hCstep⟩ := + shiftedOneStepContraction_homogenizationScale_of_local_shifted_budget + (d := d) params + have hβpos : 0 < section53CoarseFluctuationBetaParams params := + section53CoarseFluctuationBetaParams_pos params + obtain ⟨Cshift, hCshift_nonneg, hCshift⟩ := + shiftedWidetildeThetaAtScale_shifted_bound_homogenizationScale + (d := d) params.xi (section53CoarseFluctuationBetaParams params) hβpos + let A : ℝ := 1 + Cshift + let L : ℝ := 1 + 2 * A + let C : ℝ := max (Cstep * L) Cstep + have hA_ge_one : 1 ≤ A := by + dsimp [A] + linarith + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA_ge_one + have hL_ge_one : 1 ≤ L := by + dsimp [L] + linarith + have hL_nonneg : 0 ≤ L := le_trans zero_le_one hL_ge_one + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le hCstep_pos (le_max_right _ _) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams delta hdelta_pos hdelta_le k n hkn hsep + hgood_upper hgood_lower + have hxi : hP4.xi = params.xi := by + simp [← hparams] + have hβeq : + section53CoarseFluctuationBeta hP4 = + section53CoarseFluctuationBetaParams params := by + simpa [hparams] using (section53CoarseFluctuationBetaParams_eq_of_P4 hP4).symm + have hW0_nonneg : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_nonneg P hP4 0 + have htheta0_le : + thetaAtScale hP hStruct 0 ≤ widetildeThetaAtScale P 0 hP4 := + thetaAtScale_zero_le_widetildeThetaAtScale_zero hP hStruct hP4 + have hlocal_shift := + hCshift hP hStruct hP4 hxi hβeq (k := 0) (n := k) (Nat.zero_le k) + let decay0k : ℝ := + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBetaParams params) * ((k - 0 : ℕ) : ℝ)) + have hdecay0k_nonneg : 0 ≤ decay0k := by + dsimp [decay0k] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdecay0k_le_one : decay0k ≤ 1 := by + dsimp [decay0k] + refine Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hk_nonneg : 0 ≤ ((k - 0 : ℕ) : ℝ) := by positivity + exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hβpos.le) hk_nonneg + have hSβk : + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) ≤ + A * widetildeThetaAtScale P 0 hP4 := by + have hterm_le : + Cshift * decay0k * widetildeThetaAtScale P 0 hP4 ≤ + Cshift * widetildeThetaAtScale P 0 hP4 := by + have hcoeff_le : Cshift * decay0k ≤ Cshift * 1 := + mul_le_mul_of_nonneg_left hdecay0k_le_one hCshift_nonneg + calc + Cshift * decay0k * widetildeThetaAtScale P 0 hP4 + ≤ (Cshift * 1) * widetildeThetaAtScale P 0 hP4 := + mul_le_mul_of_nonneg_right hcoeff_le hW0_nonneg + _ = Cshift * widetildeThetaAtScale P 0 hP4 := by ring + calc + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) + ≤ thetaAtScale hP hStruct (0 : ℤ) + + Cshift * decay0k * widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [decay0k] using hlocal_shift + _ ≤ widetildeThetaAtScale P 0 hP4 + + Cshift * widetildeThetaAtScale P 0 hP4 := by + exact add_le_add htheta0_le hterm_le + _ = A * widetildeThetaAtScale P 0 hP4 := by + dsimp [A] + ring + have harg_nonneg : + 0 ≤ delta⁻¹ * (params.xi : ℝ) * widetildeThetaAtScale P 0 hP4 := by + have hdelta_inv_nonneg : 0 ≤ delta⁻¹ := inv_nonneg.mpr hdelta_pos.le + have hxi_nonneg : 0 ≤ (params.xi : ℝ) := by positivity + positivity + have hlog_compare : + Real.log + (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) ≤ + L * Real.log + (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + let x : ℝ := delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4 + have hx : 0 ≤ x := by simpa [x] using harg_nonneg + have hlocal_arg_le : + 2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) ≤ + 2 + x * A := by + have hcoef_nonneg : 0 ≤ delta⁻¹ * (params.xi : ℝ) := by positivity + calc + 2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) + ≤ 2 + delta⁻¹ * (params.xi : ℝ) * + (A * widetildeThetaAtScale P 0 hP4) := by + have hmul := mul_le_mul_of_nonneg_left hSβk hcoef_nonneg + calc + 2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) + = delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) + 2 := by + ring + _ ≤ delta⁻¹ * (params.xi : ℝ) * + (A * widetildeThetaAtScale P 0 hP4) + 2 := + add_le_add_left hmul 2 + _ = 2 + delta⁻¹ * (params.xi : ℝ) * + (A * widetildeThetaAtScale P 0 hP4) := by ring + _ = 2 + x * A := by + dsimp [x] + ring + have hleft_pos : + 0 < 2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) := by + have hS_nonneg : + 0 ≤ shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) := by + unfold shiftedWidetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P (k : ℤ) hP4.xi + (by + have hβp : 0 < section53CoarseFluctuationBetaParams params := hβpos + linarith [hP4.sUpper_pos])) + (Ch04.lambdaInvMomentAtScale_nonneg P (k : ℤ) hP4.xi + (by + have hβp : 0 < section53CoarseFluctuationBetaParams params := hβpos + linarith [hP4.sLower_pos])) + have hcoef_nonneg : 0 ≤ delta⁻¹ * (params.xi : ℝ) := by positivity + have hprod_nonneg : + 0 ≤ delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params) := + mul_nonneg hcoef_nonneg hS_nonneg + exact lt_of_lt_of_le (by norm_num : (0 : ℝ) < 2) + (by simpa using add_le_add_left hprod_nonneg (2 : ℝ)) + have hmono := + Real.log_le_log hleft_pos hlocal_arg_le + have hconst := + log_two_add_mul_le_const_mul_log_two_add (A := A) (x := x) + hA_ge_one hx + calc + Real.log + (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) + ≤ Real.log (2 + x * A) := hmono + _ ≤ (1 + 2 * A) * Real.log (2 + x) := hconst + _ = L * Real.log + (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + dsimp [L, x] + have hsep_local : + Cstep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) ≤ + ((n - k : ℕ) : ℝ) := by + have hlog_nonneg : + 0 ≤ Real.log + (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + apply Real.log_nonneg + exact le_trans (by norm_num : (1 : ℝ) ≤ 2) + (by simpa using add_le_add_left harg_nonneg (2 : ℝ)) + have hxi_nonneg : 0 ≤ (params.xi : ℝ) := by positivity + have hleft_le : + Cstep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) ≤ + (Cstep * L) * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + calc + Cstep * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 + (section53CoarseFluctuationBetaParams params)) + ≤ Cstep * (params.xi : ℝ) * + (L * Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4)) := by + exact mul_le_mul_of_nonneg_left hlog_compare + (mul_nonneg hCstep_pos.le hxi_nonneg) + _ = (Cstep * L) * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by ring + have hCstepL_le_C : Cstep * L ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hright_le : + (Cstep * L) * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) ≤ + C * (params.xi : ℝ) * + Real.log (2 + delta⁻¹ * (params.xi : ℝ) * + widetildeThetaAtScale P (0 : ℤ) hP4) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hCstepL_le_C hxi_nonneg) hlog_nonneg + exact hleft_le.trans (hright_le.trans hsep) + have hresult := + hCstep hP hStruct hP4 hparams hdelta_pos hdelta_le hkn + hsep_local hgood_upper hgood_lower + have hCstep_le_C : Cstep ≤ C := by + dsimp [C] + exact le_max_right _ _ + have htheta_nonneg : 0 ≤ thetaAtScale hP hStruct (k : ℤ) := by + have hθ := + Section54.GoodScale.one_le_thetaAtScale_of_P4 + (hP.scaleNormalized k) (hStruct.scaleNormalized k) + (hP4.scaleNormalized hP hStruct k) 0 + have hrewrite := thetaAtScale_zero_restrictionScaleNormalizedLaw hP hStruct k + have : 1 ≤ thetaAtScale hP hStruct (k : ℤ) := by + rw [thetaAtScale_eq] at hθ + change + 1 ≤ (hP.scaleNormalized k).thetaAtScale + (hStruct.scaleNormalized k) (0 : ℤ) at hθ + rw [hrewrite] at hθ + simpa [thetaAtScale_eq] using hθ + exact le_trans zero_le_one this + have hdelta_pow_nonneg : 0 ≤ Real.rpow delta (1 / 4 : ℝ) := + Real.rpow_nonneg hdelta_pos.le _ + have htail_le : + Cstep * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) ≤ + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hCstep_le_C hdelta_pow_nonneg) htheta_nonneg + calc + thetaAtScale hP hStruct (n : ℤ) + ≤ 1 + Cstep * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := hresult + _ ≤ 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := by + calc + 1 + Cstep * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) + = Cstep * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) + 1 := by ring + _ ≤ C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) + 1 := + add_le_add_left htail_le 1 + _ = 1 + C * Real.rpow delta (1 / 4 : ℝ) * + thetaAtScale hP hStruct (k : ℤ) := by ring + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta.lean new file mode 100644 index 0000000000..f31bf847d2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta.lean @@ -0,0 +1,788 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.DilatedP4 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.MomentBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.WidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.EllipticityMoments + +/-! # Shifted Widetilde Theta -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open MeasureTheory +open Section53.JUpperBoundCoarseFluctuations +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Section 5.5 shifted `widetildeTheta` + +This file begins the Lean proof of the shifted localization estimate in +Section 5.5. The key point is that the decaying Section 5.2 input is used at +the shifted exponents `s_1 + beta` and `s_2 + beta`; these exponents are not +fed back into `(P4)` at the next iteration step. +-/ + +/-- The beta-decay factor at a natural scale gap is at most one. -/ +theorem rpow_three_neg_beta_nat_le_one {β : ℝ} (hβ : 0 ≤ β) + (m : ℕ) : + Real.rpow (3 : ℝ) (-β * (m : ℝ)) ≤ 1 := by + refine Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + nlinarith + +/-- The shifted high-moment quantity in Section 5.5. -/ +noncomputable def shiftedWidetildeThetaAtScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (η : ℝ) : ℝ := + Ch04.widetildeThetaAtScale P n (hP4.sUpper + η) (hP4.sLower + η) hP4.xi + +/-- The beta-specialized shifted high-moment quantity used internally in +Section 5.5. -/ +noncomputable def betaShiftedWidetildeThetaAtScale {d : ℕ} [NeZero d] + (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + shiftedWidetildeThetaAtScale P n hP4 (section53CoarseFluctuationBeta hP4) + +private theorem sUpper_add_beta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sUpper + section53CoarseFluctuationBeta hP4 := by + exact add_pos hP4.sUpper_pos (section53CoarseFluctuationBeta_pos hP4) + +private theorem sLower_add_beta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sLower + section53CoarseFluctuationBeta hP4 := by + exact add_pos hP4.sLower_pos (section53CoarseFluctuationBeta_pos hP4) + +private theorem sUpper_add_beta_lt_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hlower_pos := sLower_add_beta_pos hP4 + nlinarith + +private theorem sLower_add_beta_lt_one {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hupper_pos := sUpper_add_beta_pos hP4 + nlinarith + +theorem section52TwoExponentMomentBoundCoeff_nonneg + {d ξ m : ℕ} {C s r : ℝ} + (hC_nonneg : 0 ≤ C) (hs_pos : 0 < s) (hr_lt_one : r < 1) + (hd : 2 ≤ d) : + 0 ≤ section52TwoExponentMomentBoundCoeff d ξ C s r m := by + have hden : + 0 < ((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r := by + have hd_two : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hd + have hd_half : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hxi_nonneg : (0 : ℝ) ≤ (ξ : ℝ) := by exact_mod_cast Nat.zero_le ξ + have hdiv_nonneg : 0 ≤ (d : ℝ) / (ξ : ℝ) := div_nonneg hd_nonneg hxi_nonneg + nlinarith + have hloss_nonneg : 0 ≤ section52MomentLossCoeff d ξ s r := by + unfold section52MomentLossCoeff + have hxi_nonneg : (0 : ℝ) ≤ (ξ : ℝ) := by exact_mod_cast Nat.zero_le ξ + have hquot_nonneg : + 0 ≤ (ξ : ℝ) / (((d : ℝ) / 2) + (d : ℝ) / (ξ : ℝ) - r) := + div_nonneg hxi_nonneg hden.le + positivity + unfold section52TwoExponentMomentBoundCoeff + exact mul_nonneg (mul_nonneg hC_nonneg hloss_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + +/-- The shifted high-moment quantity is compatible with Ch4 scale +normalization. -/ +theorem betaShiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k m : ℕ) : + betaShiftedWidetildeThetaAtScale (Ch04.restrictionScaleNormalizedLaw k P) (m : ℤ) + (hP4.scaleNormalized hP hStruct k) = + betaShiftedWidetildeThetaAtScale P ((k + m : ℕ) : ℤ) hP4 := by + have hβ : + section53CoarseFluctuationBeta (hP4.scaleNormalized hP hStruct k) = + section53CoarseFluctuationBeta hP4 := rfl + have h := + Ch04.widetildeThetaAtScale_restrictionScaleNormalizedLaw hP k m + (sUpper_add_beta_pos hP4) (sLower_add_beta_pos hP4) hP4.xi + simpa [betaShiftedWidetildeThetaAtScale, hβ, + QuantitativeCoarseGrainedEllipticity.scaleNormalized] using! h + +/-- Scale normalization sends scale `0` to the original scale `k` for the +unshifted manuscript `widetildeTheta`. -/ +theorem widetildeThetaAtScale_zero_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (k : ℕ) : + widetildeThetaAtScale (Ch04.restrictionScaleNormalizedLaw k P) (0 : ℤ) + (hP4.scaleNormalized hP hStruct k) = + widetildeThetaAtScale P (k : ℤ) hP4 := by + have h := + Ch04.widetildeThetaAtScale_restrictionScaleNormalizedLaw hP k 0 + hP4.sUpper_pos hP4.sLower_pos hP4.xi + simpa [widetildeThetaAtScale, + QuantitativeCoarseGrainedEllipticity.scaleNormalized] using h + +/-- Scale normalization sends scale `0` to the original scale `k` for the +structural scalar contrast. -/ +theorem thetaAtScale_zero_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) (k : ℕ) : + (hP.scaleNormalized k).thetaAtScale (hStruct.scaleNormalized k) (0 : ℤ) = + hP.thetaAtScale hStruct (k : ℤ) := by + simpa using hP.thetaAtScale_restrictionScaleNormalizedLaw hStruct k 0 + +/-- Dilation rewrite for the shifted quantity on a window `[k,n]`. -/ +theorem betaShiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw_of_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k n : ℕ} (hkn : k ≤ n) : + betaShiftedWidetildeThetaAtScale (Ch04.restrictionScaleNormalizedLaw k P) + ((n - k : ℕ) : ℤ) (hP4.scaleNormalized hP hStruct k) = + betaShiftedWidetildeThetaAtScale P (n : ℤ) hP4 := by + simpa [Nat.add_sub_of_le hkn] using + betaShiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw + hP hStruct hP4 k (n - k) + +private theorem annealedMomentRoot_le_const_add_of_nonneg_le_of_error_pow_integrable + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} {X E : RegCoeffField d → ℝ} {A : ℝ} + (hξ : 1 ≤ ξ) (hA_nonneg : 0 ≤ A) + (hX_nonneg : ∀ a, 0 ≤ X a) + (hE_nonneg : ∀ a, 0 ≤ E a) + (hX_le : ∀ a, X a ≤ A + E a) + (hX_meas : AEMeasurable X P) + (hE_meas : AEMeasurable E P) + (hE_pow_int : Integrable (fun a => E a ^ ξ) P) : + Ch04.annealedMomentRoot P ξ X ≤ + A + Ch04.annealedMomentRoot P ξ E := by + have hξ_ne : ξ ≠ 0 := by omega + have hE_abs_pow_int : Integrable (fun a => |E a| ^ ξ) P := by + refine hE_pow_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hE_nonneg a)] + have hE_mem : MemLp E (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hE_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hE_abs_pow_int + have hY_mem : MemLp (fun a => A + E a) (ξ : ENNReal) P := + (memLp_const A).add hE_mem + have hY_abs_pow_int : Integrable (fun a => |A + E a| ^ ξ) P := by + simpa [Real.norm_eq_abs] using hY_mem.integrable_norm_pow hξ_ne + have hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P := by + refine Integrable.mono' hY_abs_pow_int + (hX_meas.norm.pow_const ξ).aestronglyMeasurable ?_ + filter_upwards with a + have hY_nonneg : 0 ≤ A + E a := add_nonneg hA_nonneg (hE_nonneg a) + have hpow : |X a| ^ ξ ≤ |A + E a| ^ ξ := by + have habs : |X a| ≤ |A + E a| := by + simpa [abs_of_nonneg (hX_nonneg a), abs_of_nonneg hY_nonneg] using hX_le a + exact pow_le_pow_left₀ (abs_nonneg (X a)) habs ξ + simpa [Real.norm_eq_abs, abs_of_nonneg (pow_nonneg (abs_nonneg (X a)) ξ), + abs_of_nonneg (pow_nonneg (abs_nonneg (A + E a)) ξ)] using hpow + exact + Ch04.annealedMomentRoot_le_const_add_of_nonneg_le + (P := P) (ξ := ξ) (X := X) (E := E) (A := A) + hξ hA_nonneg hX_nonneg hE_nonneg hX_le + hX_meas hE_meas hX_abs_pow_int hE_abs_pow_int + +private theorem LambdaMomentAtScale_le_barSigma_zero_add_positiveExcessMomentAtScale_of_excess_pow_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m : ℤ} {s : ℝ} {ξ : ℕ} + (hξ : 1 ≤ ξ) (hs : 0 < s) + (hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0) + (hExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ ξ) P) : + Ch04.LambdaMomentAtScale P m s ξ ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P m s ξ hP hStruct := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d m) s (.finite 1) a + let E : RegCoeffField d → ℝ := + fun a => max (X a - hP.barSigmaAtScale hStruct 0) 0 + have hX_meas : AEMeasurable X P := by + simpa [X] using + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d m) hs + have hE_meas : AEMeasurable E P := by + exact (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ ξ) P := by + simpa [E, X] using hExcessPowInt + simpa [Ch04.LambdaMomentAtScale, LambdaPositiveExcessMomentAtScale, X, E] using + annealedMomentRoot_le_const_add_of_nonneg_le_of_error_pow_integrable + (P := P) (ξ := ξ) (X := X) (E := E) + (A := hP.barSigmaAtScale hStruct 0) + hξ hBarSigma0_nonneg + (fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + (fun a => le_max_right (X a - hP.barSigmaAtScale hStruct 0) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) (hP.barSigmaAtScale hStruct 0)) + hX_meas hE_meas hE_pow_int + +private theorem lambdaInvMomentAtScale_le_barSigmaStar_zero_inv_add_positiveExcessMomentAtScale_of_excess_pow_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m : ℤ} {s : ℝ} {ξ : ℕ} + (hξ : 1 ≤ ξ) (hs : 0 < s) + (hBarSigmaStar0_inv_nonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹) + (hExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ ξ) P) : + Ch04.lambdaInvMomentAtScale P m s ξ ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P m s ξ hP hStruct := by + let : IsProbabilityMeasure P := hP.isProbability + let X : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d m) s (.finite 1) a)⁻¹ + let E : RegCoeffField d → ℝ := + fun a => max (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0 + have hX_meas : AEMeasurable X P := by + simpa [X] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d m) hs + have hE_meas : AEMeasurable E P := by + exact (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ ξ) P := by + simpa [E, X] using hExcessPowInt + simpa [Ch04.lambdaInvMomentAtScale, lambdaInvPositiveExcessMomentAtScale, X, E] using + annealedMomentRoot_le_const_add_of_nonneg_le_of_error_pow_integrable + (P := P) (ξ := ξ) (X := X) (E := E) + (A := (hP.barSigmaStarAtScale hStruct 0)⁻¹) + hξ hBarSigmaStar0_inv_nonneg + (fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d m) a hs + (by norm_num : (1 : ℝ) ≤ 1))) + (fun a => le_max_right (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) ((hP.barSigmaStarAtScale hStruct 0)⁻¹)) + hX_meas hE_meas hE_pow_int + +private theorem shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℤ} {rUpper rLower : ℝ} + (hrUpper_pos : 0 < rUpper) (hrLower_pos : 0 < rLower) + (hUpper : + Ch04.LambdaMomentAtScale P m rUpper hP4.xi ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct) + (hLower : + Ch04.lambdaInvMomentAtScale P m rLower hP4.xi ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct) + (hUpper0 : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLower0 : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0) : + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct := by + let Lm := Ch04.LambdaMomentAtScale P m rUpper hP4.xi + let lm := Ch04.lambdaInvMomentAtScale P m rLower hP4.xi + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let b0 := hP.barSigmaAtScale hStruct 0 + let s0 := (hP.barSigmaStarAtScale hStruct 0)⁻¹ + let UE := LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct + let LE := lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct + have hLm_nonneg : 0 ≤ Lm := by + simpa [Lm] using Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hrUpper_pos + have hlm_nonneg : 0 ≤ lm := by + simpa [lm] using Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hrLower_pos + have hUE_nonneg : 0 ≤ UE := by + simpa [UE] using + Section52.LambdaPositiveExcessMomentAtScale_nonneg + rUpper hP4.xi hP hStruct m + have hLE_nonneg : 0 ≤ LE := by + simpa [LE] using + Section52.lambdaInvPositiveExcessMomentAtScale_nonneg + rLower hP4.xi hP hStruct m + have hUpper' : Lm ≤ b0 + UE := by + simpa [Lm, b0, UE] using hUpper + have hLower' : lm ≤ s0 + LE := by + simpa [lm, s0, LE] using hLower + have hUpper0' : b0 ≤ L0 := by + simpa [b0, L0] using hUpper0 + have hLower0' : s0 ≤ l0 := by + simpa [s0, l0] using hLower0 + have hUpperRhs_nonneg : 0 ≤ b0 + UE := by + exact add_nonneg (by simpa [b0] using hBarSigma0_nonneg) hUE_nonneg + have hProd : Lm * lm ≤ (b0 + UE) * (s0 + LE) := + mul_le_mul hUpper' hLower' hlm_nonneg hUpperRhs_nonneg + have hUEs0 : UE * s0 ≤ UE * l0 := + mul_le_mul_of_nonneg_left hLower0' hUE_nonneg + have hLEb0 : LE * b0 ≤ LE * L0 := + mul_le_mul_of_nonneg_left hUpper0' hLE_nonneg + have hExpand : + (b0 + UE) * (s0 + LE) ≤ b0 * s0 + UE * l0 + LE * L0 + UE * LE := by + nlinarith + calc + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi = Lm * lm := by + simp [Ch04.widetildeThetaAtScale, Lm, lm] + _ ≤ (b0 + UE) * (s0 + LE) := hProd + _ ≤ b0 * s0 + UE * l0 + LE * L0 + UE * LE := hExpand + _ = + thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, s0] + _ = + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct := by + simp [UE, LE, L0, l0] + +private theorem shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products_of_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + {rUpper rLower : ℝ} (hrUpper_pos : 0 < rUpper) (hrLower_pos : 0 < rLower) + (m : ℕ) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) : + Ch04.widetildeThetaAtScale P (m : ℤ) rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct := by + let : IsProbabilityMeasure P := hP.isProbability + have hBarSigma0_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0 := by + rw [hP.barSigmaAtScale_eq_barBAtScale hStruct (0 : ℤ)] + simpa [Ch04.RestrictionLawCarrier.barBAtScale] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + (hBlock 0) + have hBarSigmaStar0_inv_nonneg : + 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (0 : ℤ) + rw [hstar, inv_inv] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw hP hStruct (0 : ℤ)) + (hBlock 0)).le + have hUpper0 : + hP.barSigmaAtScale hStruct 0 ≤ + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi := by + exact + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hBlock + (fun l => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + hUpperPowInt hLowerPowInt 0 + have hLower0 : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi := by + exact + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + hBlock + (fun l => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + hUpperPowInt hLowerPowInt 0 + have hUpper : + Ch04.LambdaMomentAtScale P (m : ℤ) rUpper hP4.xi ≤ + hP.barSigmaAtScale hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct := + LambdaMomentAtScale_le_barSigma_zero_add_positiveExcessMomentAtScale_of_excess_pow_integrable + hP hStruct (Nat.succ_le_of_lt hP4.xi_pos) hrUpper_pos + hBarSigma0_nonneg hUpperExcessPowInt + have hLower : + Ch04.lambdaInvMomentAtScale P (m : ℤ) rLower hP4.xi ≤ + (hP.barSigmaStarAtScale hStruct 0)⁻¹ + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi + hP hStruct := + lambdaInvMomentAtScale_le_barSigmaStar_zero_inv_add_positiveExcessMomentAtScale_of_excess_pow_integrable + hP hStruct (Nat.succ_le_of_lt hP4.xi_pos) hrLower_pos + hBarSigmaStar0_inv_nonneg hLowerExcessPowInt + exact + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products + hP hStruct hP4 hrUpper_pos hrLower_pos hUpper hLower hUpper0 hLower0 + hBarSigma0_nonneg + +private theorem shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {m : ℤ} {rUpper rLower coeffUpper coeffLower finalCoeff : ℝ} + (hProduct : + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct) + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (_hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + let L0 := Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + let l0 := Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + let UE := LambdaPositiveExcessMomentAtScale P m rUpper hP4.xi hP hStruct + let LE := lambdaInvPositiveExcessMomentAtScale P m rLower hP4.xi hP hStruct + have hL0_nonneg : 0 ≤ L0 := by + simpa [L0] using + Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos + have hl0_nonneg : 0 ≤ l0 := by + simpa [l0] using + Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos + have hUE_nonneg : 0 ≤ UE := by + simpa [UE] using + Section52.LambdaPositiveExcessMomentAtScale_nonneg + rUpper hP4.xi hP hStruct m + have hLE_nonneg : 0 ≤ LE := by + simpa [LE] using + Section52.lambdaInvPositiveExcessMomentAtScale_nonneg + rLower hP4.xi hP hStruct m + have hBase_nonneg : 0 ≤ L0 * l0 := mul_nonneg hL0_nonneg hl0_nonneg + have hProduct' : + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := by + simpa [UE, LE, L0, l0] using hProduct + have hUE_le : UE ≤ coeffUpper * L0 := by + simpa [UE, L0] using hUpperExcess + have hLE_le : LE ≤ coeffLower * l0 := by + simpa [LE, l0] using hLowerExcess + have hTermUpper : UE * l0 ≤ coeffUpper * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hUE_le hl0_nonneg + nlinarith + have hTermLower : LE * L0 ≤ coeffLower * (L0 * l0) := by + have h := mul_le_mul_of_nonneg_right hLE_le hL0_nonneg + nlinarith + have hTermMixed : UE * LE ≤ coeffUpper * coeffLower * (L0 * l0) := by + have hUpperRhs_nonneg : 0 ≤ coeffUpper * L0 := + mul_nonneg hCoeffUpper_nonneg hL0_nonneg + have h := mul_le_mul hUE_le hLE_le hLE_nonneg hUpperRhs_nonneg + nlinarith + have hError : + UE * l0 + LE * L0 + UE * LE ≤ + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by + nlinarith + have hCoeffError : + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) ≤ + finalCoeff * (L0 * l0) := + mul_le_mul_of_nonneg_right hCoeff hBase_nonneg + calc + Ch04.widetildeThetaAtScale P m rUpper rLower hP4.xi + ≤ thetaAtScale hP hStruct 0 + UE * l0 + LE * L0 + UE * LE := hProduct' + _ = thetaAtScale hP hStruct 0 + (UE * l0 + LE * L0 + UE * LE) := by ring + _ ≤ thetaAtScale hP hStruct 0 + + (coeffUpper + coeffLower + coeffUpper * coeffLower) * (L0 * l0) := by + nlinarith + _ ≤ thetaAtScale hP hStruct 0 + finalCoeff * (L0 * l0) := by + nlinarith + _ = thetaAtScale hP hStruct 0 + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale, L0, l0] + +private theorem shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_integrable_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P) + (hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P) + (hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P) + {rUpper rLower : ℝ} (hrUpper_pos : 0 < rUpper) (hrLower_pos : 0 < rLower) + (m : ℕ) + (hUpperExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) rUpper (.finite 1) a - + hP.barSigmaAtScale hStruct 0) + 0) ^ hP4.xi) P) + (hLowerExcessPowInt : + Integrable + (fun a : RegCoeffField d => + (max + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ - + (hP.barSigmaStarAtScale hStruct 0)⁻¹) + 0) ^ hP4.xi) P) + {coeffUpper coeffLower finalCoeff : ℝ} + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi + hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi + hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + Ch04.widetildeThetaAtScale P (m : ℤ) rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + have hProduct : + Ch04.widetildeThetaAtScale P (m : ℤ) rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi + + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct * + Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi + + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi hP hStruct * + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi hP hStruct := + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_positiveExcess_products_of_integrable + hP hStruct hP4 hBlock hUpperPowInt hLowerPowInt + hrUpper_pos hrLower_pos m hUpperExcessPowInt hLowerExcessPowInt + exact + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_positiveExcess_bounds + hP hStruct hP4 hProduct hCoeffUpper_nonneg hCoeffLower_nonneg + hUpperExcess hLowerExcess hCoeff + +theorem shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_P4_positiveExcess_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {rUpper rLower : ℝ} + (hrUpper_gt : hP4.sUpper < rUpper) (hrUpper_lt_one : rUpper < 1) + (hrLower_gt : hP4.sLower < rLower) (hrLower_lt_one : rLower < 1) + (m : ℕ) + {coeffUpper coeffLower finalCoeff : ℝ} + (hCoeffUpper_nonneg : 0 ≤ coeffUpper) + (hCoeffLower_nonneg : 0 ≤ coeffLower) + (hUpperExcess : + LambdaPositiveExcessMomentAtScale P (m : ℤ) rUpper hP4.xi + hP hStruct ≤ + coeffUpper * Ch04.LambdaMomentAtScale P 0 hP4.sUpper hP4.xi) + (hLowerExcess : + lambdaInvPositiveExcessMomentAtScale P (m : ℤ) rLower hP4.xi + hP hStruct ≤ + coeffLower * Ch04.lambdaInvMomentAtScale P 0 hP4.sLower hP4.xi) + (hCoeff : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ finalCoeff) : + Ch04.widetildeThetaAtScale P (m : ℤ) rUpper rLower hP4.xi ≤ + thetaAtScale hP hStruct 0 + + finalCoeff * widetildeThetaAtScale P 0 hP4 := by + have hrUpper_pos : 0 < rUpper := hP4.sUpper_pos.trans hrUpper_gt + have hrLower_pos : 0 < rLower := hP4.sLower_pos.trans hrLower_gt + exact + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_integrable_positiveExcess_bounds + hP hStruct hP4 + (fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l) + (fun l => Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l) + (fun l => Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l) + hrUpper_pos hrLower_pos m + (Section52.upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hrUpper_gt hrUpper_lt_one m) + (Section52.lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hrLower_gt hrLower_lt_one m) + hCoeffUpper_nonneg hCoeffLower_nonneg hUpperExcess hLowerExcess hCoeff + +theorem betaShiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_section52TwoExponent_error + {d : ℕ} [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ), + betaShiftedWidetildeThetaAtScale P (m : ℤ) hP4 ≤ + thetaAtScale hP hStruct 0 + + (section52TwoExponentMomentBoundCoeff d hP4.xi C + hP4.sUpper + (hP4.sUpper + section53CoarseFluctuationBeta hP4) m + + section52TwoExponentMomentBoundCoeff d hP4.xi C + hP4.sLower + (hP4.sLower + section53CoarseFluctuationBeta hP4) m + + section52TwoExponentMomentBoundCoeff d hP4.xi C + hP4.sUpper + (hP4.sUpper + section53CoarseFluctuationBeta hP4) m * + section52TwoExponentMomentBoundCoeff d hP4.xi C + hP4.sLower + (hP4.sLower + section53CoarseFluctuationBeta hP4) m) * + widetildeThetaAtScale P 0 hP4 := by + obtain ⟨C, hC_nonneg, hC⟩ := + Section52.multiscaleEllipticityMomentBounds_homogenizationScale (d := d) + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 m + let β := section53CoarseFluctuationBeta hP4 + let coeffUpper : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sUpper + (hP4.sUpper + β) m + let coeffLower : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sLower + (hP4.sLower + β) m + have hBounds := + hC hP hStruct hP4 + (hP4.sUpper + β) (hP4.sLower + β) m + (by simpa [β] using sUpper_lt_sUpper_add_beta hP4) + (by simpa [β] using sUpper_add_beta_lt_one hP4) + (by simpa [β] using sLower_lt_sLower_add_beta hP4) + (by simpa [β] using sLower_add_beta_lt_one hP4) + have hCoeffUpper_nonneg : 0 ≤ coeffUpper := by + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4.xi) (m := m) (C := C) + (s := hP4.sUpper) (r := hP4.sUpper + β) + hC_nonneg hP4.sUpper_pos (by simpa [β] using sUpper_add_beta_lt_one hP4) + hP4.two_le_dim + have hCoeffLower_nonneg : 0 ≤ coeffLower := by + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4.xi) (m := m) (C := C) + (s := hP4.sLower) (r := hP4.sLower + β) + hC_nonneg hP4.sLower_pos (by simpa [β] using sLower_add_beta_lt_one hP4) + hP4.two_le_dim + have hShifted := + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_P4_positiveExcess_bounds + hP hStruct hP4 + (by simpa [β] using sUpper_lt_sUpper_add_beta hP4) + (by simpa [β] using sUpper_add_beta_lt_one hP4) + (by simpa [β] using sLower_lt_sLower_add_beta hP4) + (by simpa [β] using sLower_add_beta_lt_one hP4) + m hCoeffUpper_nonneg hCoeffLower_nonneg hBounds.1 hBounds.2 + (le_rfl : + coeffUpper + coeffLower + coeffUpper * coeffLower ≤ + coeffUpper + coeffLower + coeffUpper * coeffLower) + simpa [betaShiftedWidetildeThetaAtScale, β, coeffUpper, coeffLower] using! hShifted + +theorem section52TwoExponentMomentBoundCoeff_upper_beta_shift_le_loss_beta_decay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} {C : ℝ} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (hC_nonneg : 0 ≤ C) + (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sUpper + (hP4.sUpper + β) m ≤ + (C * section52MomentLossCoeff d hP4.xi hP4.sUpper + (hP4.sUpper + β)) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hdecay := shiftedUpperDecay_le_betaDecay hP4 m + have hloss_nonneg : + 0 ≤ section52MomentLossCoeff d hP4.xi hP4.sUpper + (hP4.sUpper + β) := + section52MomentLossCoeff_nonneg_at_shift hP4 hP4.sUpper_pos + (by simpa [β] using sUpper_lt_sUpper_add_beta hP4) + (by simpa [β] using sUpper_add_beta_lt_one hP4) + have hpref_nonneg : + 0 ≤ C * section52MomentLossCoeff d hP4.xi hP4.sUpper + (hP4.sUpper + β) := + mul_nonneg hC_nonneg hloss_nonneg + simpa [section52TwoExponentMomentBoundCoeff, β, mul_assoc] using + mul_le_mul_of_nonneg_left hdecay hpref_nonneg + +theorem section52TwoExponentMomentBoundCoeff_lower_beta_shift_le_loss_beta_decay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} {C : ℝ} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (hC_nonneg : 0 ≤ C) + (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + section52TwoExponentMomentBoundCoeff d hP4.xi C hP4.sLower + (hP4.sLower + β) m ≤ + (C * section52MomentLossCoeff d hP4.xi hP4.sLower + (hP4.sLower + β)) * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hdecay := shiftedLowerDecay_le_betaDecay hP4 m + have hloss_nonneg : + 0 ≤ section52MomentLossCoeff d hP4.xi hP4.sLower + (hP4.sLower + β) := + section52MomentLossCoeff_nonneg_at_shift hP4 hP4.sLower_pos + (by simpa [β] using sLower_lt_sLower_add_beta hP4) + (by simpa [β] using sLower_add_beta_lt_one hP4) + have hpref_nonneg : + 0 ≤ C * section52MomentLossCoeff d hP4.xi hP4.sLower + (hP4.sLower + β) := + mul_nonneg hC_nonneg hloss_nonneg + simpa [section52TwoExponentMomentBoundCoeff, β, mul_assoc] using + mul_le_mul_of_nonneg_left hdecay hpref_nonneg + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Final.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Final.lean new file mode 100644 index 0000000000..46525ee947 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Final.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.TwoStep + +/-! # Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem thetaAtScale_zero_le_widetildeThetaAtScale_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + thetaAtScale hP hStruct 0 ≤ widetildeThetaAtScale P 0 hP4 := by + have hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P := + fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l + have hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) hP4.sUpper (.finite 1) a) ^ + hP4.xi) P := + fun l => Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) hP4.sLower (.finite 1) a)⁻¹) ^ + hP4.xi) P := + fun l => Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + simpa using + Section52.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hP hStruct hP4 hBlock hUpperPowInt hLowerPowInt 0 + +private theorem widetildeThetaAtScale_nonneg + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℤ) : + 0 ≤ widetildeThetaAtScale P m hP4 := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P m hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P m hP4.xi hP4.sLower_pos) + +/-- Section 5.5 shifted localization for the high-moment ellipticity contrast. + +The constant is chosen after the explicit manuscript parameters `xi` and `β`, +and before the law, structural hypotheses, and window `[k,n]`. -/ +theorem shiftedWidetildeThetaBound_homogenizationScale + {d : ℕ} [NeZero d] (xi : ℕ) (β : ℝ) (hβ : 0 < β) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.xi = xi → + section53CoarseFluctuationBeta hP4 = β → + ∀ {k n : ℕ}, k ≤ n → + thetaAtScale hP hStruct (n : ℤ) ≤ + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) ∧ + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) ≤ + thetaAtScale hP hStruct (k : ℤ) + + C * Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) * + widetildeThetaAtScale P 0 hP4 := by + obtain ⟨Cβ, hCβ_nonneg, hCβ⟩ := + shiftedWidetildeThetaAtScale_shifted_bound_homogenizationScale + (d := d) xi β hβ + obtain ⟨C2β, hC2β_nonneg, hC2β⟩ := + twoBetaShiftedWidetildeThetaAtScale_shifted_bound_homogenizationScale + (d := d) xi β hβ + let C : ℝ := C2β * (1 + Cβ) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + nlinarith + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 hxi hβ k n hkn + constructor + · have htheta := thetaAtScale_le_twoBetaShiftedWidetildeThetaAtScale hP hStruct hP4 n + simpa [hβ] + using htheta + · have htwo := hC2β hP hStruct hP4 hxi hβ hkn + have hone := + hCβ hP hStruct hP4 hxi hβ (k := 0) (n := k) (Nat.zero_le k) + let decay0k : ℝ := Real.rpow (3 : ℝ) (-β * ((k - 0 : ℕ) : ℝ)) + let decaykn : ℝ := Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) + have hdecay0k_nonneg : 0 ≤ decay0k := by + dsimp [decay0k] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdecay0k_le_one : decay0k ≤ 1 := by + dsimp [decay0k] + refine Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hk_nonneg : 0 ≤ ((k - 0 : ℕ) : ℝ) := by positivity + nlinarith + have hW0_nonneg : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_nonneg P hP4 0 + have htheta0 : thetaAtScale hP hStruct 0 ≤ widetildeThetaAtScale P 0 hP4 := + thetaAtScale_zero_le_widetildeThetaAtScale_zero hP hStruct hP4 + have hSβk : + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β ≤ + (1 + Cβ) * widetildeThetaAtScale P 0 hP4 := by + have hterm_le : + Cβ * decay0k * widetildeThetaAtScale P 0 hP4 ≤ + Cβ * widetildeThetaAtScale P 0 hP4 := by + have hcoeff_le : Cβ * decay0k ≤ Cβ * 1 := + mul_le_mul_of_nonneg_left hdecay0k_le_one hCβ_nonneg + calc + Cβ * decay0k * widetildeThetaAtScale P 0 hP4 + ≤ (Cβ * 1) * widetildeThetaAtScale P 0 hP4 := + mul_le_mul_of_nonneg_right hcoeff_le hW0_nonneg + _ = Cβ * widetildeThetaAtScale P 0 hP4 := by ring + calc + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β + ≤ thetaAtScale hP hStruct (0 : ℤ) + + Cβ * decay0k * widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [decay0k] using hone + _ ≤ widetildeThetaAtScale P 0 hP4 + + Cβ * widetildeThetaAtScale P 0 hP4 := by + exact add_le_add htheta0 hterm_le + _ = (1 + Cβ) * widetildeThetaAtScale P 0 hP4 := by ring + have hdecaykn_nonneg : 0 ≤ decaykn := by + dsimp [decaykn] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hcoeff_nonneg : 0 ≤ C2β * decaykn := + mul_nonneg hC2β_nonneg hdecaykn_nonneg + calc + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) + ≤ thetaAtScale hP hStruct (k : ℤ) + + C2β * decaykn * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β := by + simpa [decaykn] using htwo + _ ≤ thetaAtScale hP hStruct (k : ℤ) + + C2β * decaykn * + ((1 + Cβ) * widetildeThetaAtScale P 0 hP4) := by + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_left hSβk hcoeff_nonneg) + _ = thetaAtScale hP hStruct (k : ℤ) + + C * decaykn * widetildeThetaAtScale P 0 hP4 := by + dsimp [C] + ring + _ = thetaAtScale hP hStruct (k : ℤ) + + C * Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) * + widetildeThetaAtScale P 0 hP4 := by + simp [decaykn] + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/ScalarPreliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/ScalarPreliminaries.lean new file mode 100644 index 0000000000..f09a4554b3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/ScalarPreliminaries.lean @@ -0,0 +1,270 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Uniform + +/-! # Scalar Preliminaries -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open MeasureTheory +open Section53.JUpperBoundCoarseFluctuations +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem sUpper_add_beta_pos' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sUpper + section53CoarseFluctuationBeta hP4 := + add_pos hP4.sUpper_pos (section53CoarseFluctuationBeta_pos hP4) + +private theorem sLower_add_beta_pos' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sLower + section53CoarseFluctuationBeta hP4 := + add_pos hP4.sLower_pos (section53CoarseFluctuationBeta_pos hP4) + +private theorem sUpper_add_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hlower_beta_pos : + 0 < hP4.sLower + section53CoarseFluctuationBeta hP4 := + sLower_add_beta_pos' hP4 + nlinarith + +private theorem sLower_add_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hupper_beta_pos : + 0 < hP4.sUpper + section53CoarseFluctuationBeta hP4 := + sUpper_add_beta_pos' hP4 + nlinarith + +theorem integrable_pow_of_nonneg_le_const_add_nonneg + {d ξ : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {X E : RegCoeffField d → ℝ} {A : ℝ} + (hξ : 1 ≤ ξ) (hA_nonneg : 0 ≤ A) + (hX_nonneg : ∀ a, 0 ≤ X a) + (hE_nonneg : ∀ a, 0 ≤ E a) + (hX_le : ∀ a, X a ≤ A + E a) + (hX_meas : AEMeasurable X P) + (hE_meas : AEMeasurable E P) + (hE_pow_int : Integrable (fun a => E a ^ ξ) P) : + Integrable (fun a => X a ^ ξ) P := by + have hξ_ne : ξ ≠ 0 := by omega + have hE_abs_pow_int : Integrable (fun a => |E a| ^ ξ) P := by + refine hE_pow_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hE_nonneg a)] + have hE_mem : MemLp E (ξ : ENNReal) P := by + rw [← MeasureTheory.integrable_norm_rpow_iff hE_meas.aestronglyMeasurable + (by exact_mod_cast hξ_ne) (by simp)] + simpa [Real.norm_eq_abs] using hE_abs_pow_int + have hY_mem : MemLp (fun a => A + E a) (ξ : ENNReal) P := + (memLp_const A).add hE_mem + have hY_abs_pow_int : Integrable (fun a => |A + E a| ^ ξ) P := by + simpa [Real.norm_eq_abs] using hY_mem.integrable_norm_pow hξ_ne + have hX_abs_pow_int : Integrable (fun a => |X a| ^ ξ) P := by + refine Integrable.mono' hY_abs_pow_int + (hX_meas.norm.pow_const ξ).aestronglyMeasurable ?_ + filter_upwards with a + have hY_nonneg : 0 ≤ A + E a := add_nonneg hA_nonneg (hE_nonneg a) + have habs : |X a| ≤ |A + E a| := by + simpa [abs_of_nonneg (hX_nonneg a), abs_of_nonneg hY_nonneg] using + hX_le a + have hpow : |X a| ^ ξ ≤ |A + E a| ^ ξ := + pow_le_pow_left₀ (abs_nonneg (X a)) habs ξ + simpa [Real.norm_eq_abs, abs_of_nonneg (pow_nonneg (abs_nonneg (X a)) ξ)] + using hpow + refine hX_abs_pow_int.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hX_nonneg a)] + +theorem upperShiftedFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) + (hP4.sUpper + section53CoarseFluctuationBeta hP4) (.finite 1) a) ^ + hP4.xi) P := by + let : IsProbabilityMeasure P := hP.isProbability + let rUpper := hP4.sUpper + section53CoarseFluctuationBeta hP4 + let X : RegCoeffField d → ℝ := fun a => + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) rUpper (.finite 1) a + let E : RegCoeffField d → ℝ := fun a => + max (X a - hP.barSigmaAtScale hStruct 0) 0 + have hBarSigma_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0 := by + rw [hP.barSigmaAtScale_eq_barBAtScale hStruct (0 : ℤ)] + simpa [Ch04.RestrictionLawCarrier.barBAtScale] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (0 : ℤ)) + (Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 0) + have hX_meas : AEMeasurable X P := by + simpa [X, rUpper] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (m : ℤ)) (sUpper_add_beta_pos' hP4) + have hE_meas : AEMeasurable E P := + (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ hP4.xi) P := by + simpa [E, X, rUpper] using + Section52.upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 (sUpper_lt_sUpper_add_beta hP4) + (sUpper_add_beta_lt_one' hP4) m + simpa [X, rUpper] using + integrable_pow_of_nonneg_le_const_add_nonneg + (P := P) (ξ := hP4.xi) (X := X) (E := E) + (A := hP.barSigmaAtScale hStruct 0) + (Nat.succ_le_of_lt hP4.xi_pos) hBarSigma_nonneg + (fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a + (sUpper_add_beta_pos' hP4) (by norm_num : (1 : ℝ) ≤ 1)) + (fun a => le_max_right (X a - hP.barSigmaAtScale hStruct 0) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) (hP.barSigmaAtScale hStruct 0)) + hX_meas hE_meas hE_pow_int + +theorem lowerShiftedFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) + (hP4.sLower + section53CoarseFluctuationBeta hP4) (.finite 1) a)⁻¹) ^ + hP4.xi) P := by + let : IsProbabilityMeasure P := hP.isProbability + let rLower := hP4.sLower + section53CoarseFluctuationBeta hP4 + let X : RegCoeffField d → ℝ := fun a => + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ + let E : RegCoeffField d → ℝ := fun a => + max (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0 + have hStarInv_nonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (0 : ℤ) + rw [hstar, inv_inv] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (0 : ℤ)) + (Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 0)).le + have hX_meas : AEMeasurable X P := by + simpa [X, rLower] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (m : ℤ)) (sLower_add_beta_pos' hP4) + have hE_meas : AEMeasurable E P := + (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ hP4.xi) P := by + simpa [E, X, rLower] using + Section52.lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 (sLower_lt_sLower_add_beta hP4) + (sLower_add_beta_lt_one' hP4) m + simpa [X, rLower] using + integrable_pow_of_nonneg_le_const_add_nonneg + (P := P) (ξ := hP4.xi) (X := X) (E := E) + (A := (hP.barSigmaStarAtScale hStruct 0)⁻¹) + (Nat.succ_le_of_lt hP4.xi_pos) hStarInv_nonneg + (fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a + (sLower_add_beta_pos' hP4) (by norm_num : (1 : ℝ) ≤ 1))) + (fun a => le_max_right (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) ((hP.barSigmaStarAtScale hStruct 0)⁻¹)) + hX_meas hE_meas hE_pow_int + +/-- The quantitative ellipticity input with the Section 5.5 source exponents +shifted by one `β`. -/ +def betaShiftedP4 {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + QuantitativeCoarseGrainedEllipticity P where + sUpper := hP4.sUpper + section53CoarseFluctuationBeta hP4 + sLower := hP4.sLower + section53CoarseFluctuationBeta hP4 + xi := hP4.xi + two_le_dim := hP4.two_le_dim + sUpper_nonneg := + add_nonneg hP4.sUpper_nonneg (section53CoarseFluctuationBeta_nonneg hP4) + sUpper_lt_one := sUpper_add_beta_lt_one' hP4 + sLower_nonneg := + add_nonneg hP4.sLower_nonneg (section53CoarseFluctuationBeta_nonneg hP4) + sLower_lt_one := sLower_add_beta_lt_one' hP4 + xi_gt_two_mul_dim := hP4.xi_gt_two_mul_dim + sum_lt_one := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hbeta := section53CoarseFluctuationBeta_pos hP4 + nlinarith + dim_div_xi_lt_min := by + rw [lt_min_iff] + constructor + · linarith [hP4.dim_div_xi_lt_sUpper, + section53CoarseFluctuationBeta_pos hP4] + · linarith [hP4.dim_div_xi_lt_sLower, + section53CoarseFluctuationBeta_pos hP4] + upper_moment_integrable := + upperShiftedFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 0 + lower_inv_moment_integrable := + lowerShiftedFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 0 + +/-- Shifted scalar preliminary for Section 5.5: +`\Theta_n <= \widetilde\Theta_n^{(\beta)}`. -/ +theorem thetaAtScale_le_betaShiftedWidetildeThetaAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (n : ℕ) : + thetaAtScale hP hStruct (n : ℤ) ≤ + betaShiftedWidetildeThetaAtScale P (n : ℤ) hP4 := by + have hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P := + fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l + have hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) + (hP4.sUpper + section53CoarseFluctuationBeta hP4) (.finite 1) a) ^ + hP4.xi) P := + fun l => upperShiftedFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) + (hP4.sLower + section53CoarseFluctuationBeta hP4) (.finite 1) a)⁻¹) ^ + hP4.xi) P := + fun l => lowerShiftedFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have h := + hP.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hStruct (sUpper_add_beta_pos' hP4) (sLower_add_beta_pos' hP4) + (Nat.succ_le_of_lt hP4.xi_pos) hBlock + (fun l => + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) (sUpper_add_beta_pos' hP4)) + (fun l => + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) (sLower_add_beta_pos' hP4)) + hUpperPowInt hLowerPowInt n + simpa [thetaAtScale, betaShiftedWidetildeThetaAtScale, + shiftedWidetildeThetaAtScale] using h + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/TwoStep.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/TwoStep.lean new file mode 100644 index 0000000000..ff1cb76a4b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/TwoStep.lean @@ -0,0 +1,467 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ScalarLoss + +/-! # Two Step -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open Section53.JUpperBoundCoarseFluctuations +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +private theorem sUpper_add_two_beta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 := by + have hβ := section53CoarseFluctuationBeta_pos hP4 + linarith [hP4.sUpper_pos] + +private theorem sLower_add_two_beta_pos {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 < hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 := by + have hβ := section53CoarseFluctuationBeta_pos hP4 + linarith [hP4.sLower_pos] + +private theorem sUpper_add_two_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hlower_nonneg := hP4.sLower_nonneg + have hβ := section53CoarseFluctuationBeta_pos hP4 + nlinarith + +private theorem sLower_add_two_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_four_beta_le_one hP4 + have hupper_nonneg := hP4.sUpper_nonneg + have hβ := section53CoarseFluctuationBeta_pos hP4 + nlinarith + +private theorem twoBetaUpperDecay_le_betaDecay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + Real.rpow (3 : ℝ) + (-((hP4.sUpper + 2 * β) - (d : ℝ) / (hP4.xi : ℝ)) * (m : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hβ_le : β ≤ hP4.sUpper - (d : ℝ) / (hP4.xi : ℝ) := by + simpa [β] using section53CoarseFluctuationBeta_le_sUpper_sub_dim_div_xi hP4 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + +private theorem twoBetaLowerDecay_le_betaDecay + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + Real.rpow (3 : ℝ) + (-((hP4.sLower + 2 * β) - (d : ℝ) / (hP4.xi : ℝ)) * (m : ℝ)) ≤ + Real.rpow (3 : ℝ) (-β * (m : ℝ)) := by + intro β + have hβ_le : β ≤ hP4.sLower - (d : ℝ) / (hP4.xi : ℝ) := by + simpa [β] using section53CoarseFluctuationBeta_le_sLower_sub_dim_div_xi hP4 + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + +theorem upperTwoBetaFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) + (hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4) (.finite 1) a) ^ + hP4.xi) P := by + let : IsProbabilityMeasure P := hP.isProbability + let rUpper := hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4 + let X : RegCoeffField d → ℝ := fun a => + Ch04.LambdaSqCoeffField (originCube d (m : ℤ)) rUpper (.finite 1) a + let E : RegCoeffField d → ℝ := fun a => + max (X a - hP.barSigmaAtScale hStruct 0) 0 + have hBarSigma_nonneg : 0 ≤ hP.barSigmaAtScale hStruct 0 := by + rw [hP.barSigmaAtScale_eq_barBAtScale hStruct (0 : ℤ)] + simpa [Ch04.RestrictionLawCarrier.barBAtScale] using + Ch04.RestrictionLawCarrier.Internal.barB_nonneg_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (0 : ℤ)) + (Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 0) + have hX_meas : AEMeasurable X P := by + simpa [X, rUpper] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (m : ℤ)) (sUpper_add_two_beta_pos hP4) + have hE_meas : AEMeasurable E P := + (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ hP4.xi) P := by + have hlt : hP4.sUpper < rUpper := by + dsimp [rUpper] + have hβ := section53CoarseFluctuationBeta_pos hP4 + nlinarith + simpa [E, X, rUpper] using + Section52.upperPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hlt (sUpper_add_two_beta_lt_one' hP4) m + simpa [X, rUpper] using + integrable_pow_of_nonneg_le_const_add_nonneg + (P := P) (ξ := hP4.xi) (X := X) (E := E) + (A := hP.barSigmaAtScale hStruct 0) + (Nat.succ_le_of_lt hP4.xi_pos) hBarSigma_nonneg + (fun a => + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a + (sUpper_add_two_beta_pos hP4) (by norm_num : (1 : ℝ) ≤ 1)) + (fun a => le_max_right (X a - hP.barSigmaAtScale hStruct 0) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) (hP.barSigmaAtScale hStruct 0)) + hX_meas hE_meas hE_pow_int + +theorem lowerTwoBetaFactorPowerIntegrableAtScale_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) + (hP4.sLower + 2 * section53CoarseFluctuationBeta hP4) (.finite 1) a)⁻¹) ^ + hP4.xi) P := by + let : IsProbabilityMeasure P := hP.isProbability + let rLower := hP4.sLower + 2 * section53CoarseFluctuationBeta hP4 + let X : RegCoeffField d → ℝ := fun a => + (Ch04.lambdaSqCoeffField (originCube d (m : ℤ)) rLower (.finite 1) a)⁻¹ + let E : RegCoeffField d → ℝ := fun a => + max (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0 + have hStarInv_nonneg : 0 ≤ (hP.barSigmaStarAtScale hStruct 0)⁻¹ := by + have hstar := hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (0 : ℤ) + rw [hstar, inv_inv] + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + (Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (0 : ℤ)) + (Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 0)).le + have hX_meas : AEMeasurable X P := by + simpa [X, rLower] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (m : ℤ)) (sLower_add_two_beta_pos hP4) + have hE_meas : AEMeasurable E P := + (hX_meas.sub aemeasurable_const).max aemeasurable_const + have hE_pow_int : Integrable (fun a => E a ^ hP4.xi) P := by + have hlt : hP4.sLower < rLower := by + dsimp [rLower] + have hβ := section53CoarseFluctuationBeta_pos hP4 + nlinarith + simpa [E, X, rLower] using + Section52.lowerPositiveExcessPowIntegrableAtScale_from_P4_twoExponent + hP hStruct hP4 hlt (sLower_add_two_beta_lt_one' hP4) m + simpa [X, rLower] using + integrable_pow_of_nonneg_le_const_add_nonneg + (P := P) (ξ := hP4.xi) (X := X) (E := E) + (A := (hP.barSigmaStarAtScale hStruct 0)⁻¹) + (Nat.succ_le_of_lt hP4.xi_pos) hStarInv_nonneg + (fun a => + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d (m : ℤ)) a + (sLower_add_two_beta_pos hP4) (by norm_num : (1 : ℝ) ≤ 1))) + (fun a => le_max_right (X a - (hP.barSigmaStarAtScale hStruct 0)⁻¹) 0) + (fun a => + Section52.real_le_base_add_max_sub_base_zero + (X a) ((hP.barSigmaStarAtScale hStruct 0)⁻¹)) + hX_meas hE_meas hE_pow_int + +theorem thetaAtScale_le_twoBetaShiftedWidetildeThetaAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (n : ℕ) : + thetaAtScale hP hStruct (n : ℤ) ≤ + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 + (2 * section53CoarseFluctuationBeta hP4) := by + have hBlock : + ∀ l : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (l : ℤ))) P := + fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l + have hUpperPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (l : ℤ)) + (hP4.sUpper + 2 * section53CoarseFluctuationBeta hP4) (.finite 1) a) ^ + hP4.xi) P := + fun l => upperTwoBetaFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have hLowerPowInt : + ∀ l : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (l : ℤ)) + (hP4.sLower + 2 * section53CoarseFluctuationBeta hP4) (.finite 1) a)⁻¹) ^ + hP4.xi) P := + fun l => lowerTwoBetaFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l + have h := + hP.thetaAtScale_le_widetildeThetaAtScale_of_integrable_factor_observables + hStruct (sUpper_add_two_beta_pos hP4) (sLower_add_two_beta_pos hP4) + (Nat.succ_le_of_lt hP4.xi_pos) hBlock + (fun l => + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) (sUpper_add_two_beta_pos hP4)) + (fun l => + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) (sLower_add_two_beta_pos hP4)) + hUpperPowInt hLowerPowInt n + simpa [thetaAtScale, shiftedWidetildeThetaAtScale, mul_assoc] using h + +/-- One-window shifted localization with the source exponents already shifted +by one `β`, hence with target exponents shifted by `2β`. -/ +theorem twoBetaShiftedWidetildeThetaAtScale_zero_bound_homogenizationScale + {d : ℕ} [NeZero d] (xi : ℕ) (β : ℝ) (hβ : 0 < β) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.xi = xi → + section53CoarseFluctuationBeta hP4 = β → + ∀ m : ℕ, + shiftedWidetildeThetaAtScale P (m : ℤ) hP4 (2 * β) ≤ + thetaAtScale hP hStruct 0 + + C * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + shiftedWidetildeThetaAtScale P 0 hP4 β := by + obtain ⟨C52, hC52_nonneg, hC52⟩ := + Section52.multiscaleEllipticityMomentBounds_homogenizationScale (d := d) + let D : ℝ := 2 * C52 * (xi : ℝ) * (β ^ 3)⁻¹ + let C : ℝ := D + D + D * D + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hC_nonneg : 0 ≤ C := by + dsimp [C] + nlinarith [mul_nonneg hD_nonneg hD_nonneg] + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 hxi hβeq m + let β0 := section53CoarseFluctuationBeta hP4 + let hP4β := betaShiftedP4 hP hStruct hP4 + let decay : ℝ := Real.rpow (3 : ℝ) (-β0 * (m : ℝ)) + let upperCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 (hP4.sUpper + β0) + (hP4.sUpper + 2 * β0) m + let lowerCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4.xi C52 (hP4.sLower + β0) + (hP4.sLower + 2 * β0) m + let upperLoss : ℝ := + section52MomentLossCoeff d hP4.xi (hP4.sUpper + β0) + (hP4.sUpper + 2 * β0) + let lowerLoss : ℝ := + section52MomentLossCoeff d hP4.xi (hP4.sLower + β0) + (hP4.sLower + 2 * β0) + have hBounds := + hC52 hP hStruct hP4β + (hP4.sUpper + 2 * β0) (hP4.sLower + 2 * β0) m + (by dsimp [hP4β, betaShiftedP4, β0]; linarith [section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sUpper_add_two_beta_lt_one' hP4) + (by dsimp [hP4β, betaShiftedP4, β0]; linarith [section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sLower_add_two_beta_lt_one' hP4) + have hdecay_nonneg : 0 ≤ decay := by + dsimp [decay] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdecay_le_one : decay ≤ 1 := by + dsimp [decay, β0] + exact rpow_three_neg_beta_nat_le_one + (section53CoarseFluctuationBeta_nonneg hP4) m + have hupperLoss_le : upperLoss ≤ 2 * (xi : ℝ) * (β ^ 3)⁻¹ := by + dsimp [upperLoss] + simpa [β0, hxi, hβeq] using + section52MomentLossCoeff_upper_two_beta_shift_le_xi_beta_cubed hP4 + have hlowerLoss_le : lowerLoss ≤ 2 * (xi : ℝ) * (β ^ 3)⁻¹ := by + dsimp [lowerLoss] + simpa [β0, hxi, hβeq] using + section52MomentLossCoeff_lower_two_beta_shift_le_xi_beta_cubed hP4 + have hupperCoeff_loss : upperCoeff ≤ (C52 * upperLoss) * decay := by + have hdecay := twoBetaUpperDecay_le_betaDecay hP4 m + have hloss_nonneg : 0 ≤ upperLoss := by + dsimp [upperLoss] + exact section52MomentLossCoeff_nonneg_at_shift hP4 + (by dsimp [β0]; linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4]) + (by dsimp [β0]; linarith [section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sUpper_add_two_beta_lt_one' hP4) + have hpref_nonneg : 0 ≤ C52 * upperLoss := mul_nonneg hC52_nonneg hloss_nonneg + simpa [upperCoeff, upperLoss, decay, section52TwoExponentMomentBoundCoeff, + β0, mul_assoc] using mul_le_mul_of_nonneg_left hdecay hpref_nonneg + have hlowerCoeff_loss : lowerCoeff ≤ (C52 * lowerLoss) * decay := by + have hdecay := twoBetaLowerDecay_le_betaDecay hP4 m + have hloss_nonneg : 0 ≤ lowerLoss := by + dsimp [lowerLoss] + exact section52MomentLossCoeff_nonneg_at_shift hP4 + (by dsimp [β0]; linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4]) + (by dsimp [β0]; linarith [section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sLower_add_two_beta_lt_one' hP4) + have hpref_nonneg : 0 ≤ C52 * lowerLoss := mul_nonneg hC52_nonneg hloss_nonneg + simpa [lowerCoeff, lowerLoss, decay, section52TwoExponentMomentBoundCoeff, + β0, mul_assoc] using mul_le_mul_of_nonneg_left hdecay hpref_nonneg + have hupperCoeff_le : upperCoeff ≤ D * decay := by + calc + upperCoeff ≤ (C52 * upperLoss) * decay := hupperCoeff_loss + _ ≤ (C52 * (2 * (xi : ℝ) * (β ^ 3)⁻¹)) * decay := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hupperLoss_le hC52_nonneg) hdecay_nonneg + _ = D * decay := by ring + have hlowerCoeff_le : lowerCoeff ≤ D * decay := by + calc + lowerCoeff ≤ (C52 * lowerLoss) * decay := hlowerCoeff_loss + _ ≤ (C52 * (2 * (xi : ℝ) * (β ^ 3)⁻¹)) * decay := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hlowerLoss_le hC52_nonneg) hdecay_nonneg + _ = D * decay := by ring + have hupperCoeff_nonneg : 0 ≤ upperCoeff := by + dsimp [upperCoeff] + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4.xi) (m := m) (C := C52) + (s := hP4.sUpper + β0) (r := hP4.sUpper + 2 * β0) + hC52_nonneg + (by dsimp [β0]; linarith [hP4.sUpper_pos, section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sUpper_add_two_beta_lt_one' hP4) hP4.two_le_dim + have hlowerCoeff_nonneg : 0 ≤ lowerCoeff := by + dsimp [lowerCoeff] + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4.xi) (m := m) (C := C52) + (s := hP4.sLower + β0) (r := hP4.sLower + 2 * β0) + hC52_nonneg + (by dsimp [β0]; linarith [hP4.sLower_pos, section53CoarseFluctuationBeta_pos hP4]) + (by simpa [β0] using sLower_add_two_beta_lt_one' hP4) hP4.two_le_dim + have hProd_le : upperCoeff * lowerCoeff ≤ D * D * decay := by + have hUpper_rhs_nonneg : 0 ≤ D * decay := mul_nonneg hD_nonneg hdecay_nonneg + have hprod_step : + upperCoeff * lowerCoeff ≤ (D * decay) * (D * decay) := + mul_le_mul hupperCoeff_le hlowerCoeff_le hlowerCoeff_nonneg hUpper_rhs_nonneg + have hdecay_sq_le : decay * decay ≤ decay := by + calc + decay * decay ≤ decay * 1 := + mul_le_mul_of_nonneg_left hdecay_le_one hdecay_nonneg + _ = decay := by ring + have hDD_nonneg : 0 ≤ D * D := mul_nonneg hD_nonneg hD_nonneg + calc + upperCoeff * lowerCoeff ≤ (D * decay) * (D * decay) := hprod_step + _ = (D * D) * (decay * decay) := by ring + _ ≤ (D * D) * decay := mul_le_mul_of_nonneg_left hdecay_sq_le hDD_nonneg + _ = D * D * decay := by ring + have hCoeff_le : + upperCoeff + lowerCoeff + upperCoeff * lowerCoeff ≤ C * decay := by + dsimp [C] + nlinarith + have hupper_gt : hP4β.sUpper < hP4.sUpper + 2 * β0 := by + change hP4.sUpper + section53CoarseFluctuationBeta hP4 < + hP4.sUpper + 2 * β0 + dsimp [β0] + linarith [section53CoarseFluctuationBeta_pos hP4] + have hlower_gt : hP4β.sLower < hP4.sLower + 2 * β0 := by + change hP4.sLower + section53CoarseFluctuationBeta hP4 < + hP4.sLower + 2 * β0 + dsimp [β0] + linarith [section53CoarseFluctuationBeta_pos hP4] + have hShifted := + shiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_error_of_P4_positiveExcess_bounds + hP hStruct hP4β + hupper_gt + (by simpa [β0] using sUpper_add_two_beta_lt_one' hP4) + hlower_gt + (by simpa [β0] using sLower_add_two_beta_lt_one' hP4) + m hupperCoeff_nonneg hlowerCoeff_nonneg + (by simpa [hP4β, betaShiftedP4, β0, upperCoeff] using hBounds.1) + (by simpa [hP4β, betaShiftedP4, β0, lowerCoeff] using hBounds.2) + hCoeff_le + simpa [shiftedWidetildeThetaAtScale, hP4β, betaShiftedP4, β0, hβeq, + decay] using hShifted + +theorem shiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {η : ℝ} (hUpper : 0 < hP4.sUpper + η) + (hLower : 0 < hP4.sLower + η) (k m : ℕ) : + shiftedWidetildeThetaAtScale (Ch04.restrictionScaleNormalizedLaw k P) (m : ℤ) + (hP4.scaleNormalized hP hStruct k) η = + shiftedWidetildeThetaAtScale P ((k + m : ℕ) : ℤ) hP4 η := by + have h := + Ch04.widetildeThetaAtScale_restrictionScaleNormalizedLaw hP k m + hUpper hLower hP4.xi + simpa [shiftedWidetildeThetaAtScale, + QuantitativeCoarseGrainedEllipticity.scaleNormalized] using h + +theorem twoBetaShiftedWidetildeThetaAtScale_shifted_bound_homogenizationScale + {d : ℕ} [NeZero d] (xi : ℕ) (β : ℝ) (hβ : 0 < β) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.xi = xi → + section53CoarseFluctuationBeta hP4 = β → + ∀ {k n : ℕ}, k ≤ n → + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) ≤ + thetaAtScale hP hStruct (k : ℤ) + + C * Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β := by + obtain ⟨C, hC_nonneg, hC⟩ := + twoBetaShiftedWidetildeThetaAtScale_zero_bound_homogenizationScale + (d := d) xi β hβ + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 hxi hβeq k n hkn + let Pk := Ch04.restrictionScaleNormalizedLaw k P + let hPk := hP.scaleNormalized k + let hStructPk := hStruct.scaleNormalized k + let hP4k := hP4.scaleNormalized hP hStruct k + let m : ℕ := n - k + have hxi_k : hP4k.xi = xi := by + simpa [hP4k, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using hxi + have hβ_k : section53CoarseFluctuationBeta hP4k = β := by + simpa [hP4k, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using! hβeq + have hbound := hC hPk hStructPk hP4k hxi_k hβ_k m + have htwo : + shiftedWidetildeThetaAtScale Pk (m : ℤ) hP4k (2 * β) = + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) := by + have h := + shiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw hP hStruct hP4 + (η := 2 * β) + (by linarith [hP4.sUpper_pos, hβ]) + (by linarith [hP4.sLower_pos, hβ]) k m + simpa [Pk, hP4k, m, Nat.add_sub_of_le hkn] using h + have hone : + shiftedWidetildeThetaAtScale Pk 0 hP4k β = + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β := by + have h := + shiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw hP hStruct hP4 + (η := β) + (by linarith [hP4.sUpper_pos, hβ]) + (by linarith [hP4.sLower_pos, hβ]) k 0 + simpa [Pk, hP4k] using h + have htheta := thetaAtScale_zero_restrictionScaleNormalizedLaw hP hStruct k + calc + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 (2 * β) + = shiftedWidetildeThetaAtScale Pk (m : ℤ) hP4k (2 * β) := htwo.symm + _ ≤ thetaAtScale hPk hStructPk 0 + + C * Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + shiftedWidetildeThetaAtScale Pk 0 hP4k β := hbound + _ = thetaAtScale hP hStruct (k : ℤ) + + C * Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) * + shiftedWidetildeThetaAtScale P (k : ℤ) hP4 β := by + simp [Pk, hP4k, m, htheta, hone] + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Uniform.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Uniform.lean new file mode 100644 index 0000000000..71669a4636 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section55/ShiftedWidetildeTheta/Uniform.lean @@ -0,0 +1,214 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.ScalarLoss + +/-! # Uniform -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section55 + +open Section53.JUpperBoundCoarseFluctuations + +noncomputable section + +private theorem sUpper_add_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sUpper + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hlower_beta_pos : + 0 < hP4.sLower + section53CoarseFluctuationBeta hP4 := + add_pos hP4.sLower_pos (section53CoarseFluctuationBeta_pos hP4) + nlinarith + +private theorem sLower_add_beta_lt_one' {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP4 : QuantitativeCoarseGrainedEllipticity P) : + hP4.sLower + section53CoarseFluctuationBeta hP4 < 1 := by + have hsum := sUpper_add_sLower_add_two_beta_le_one hP4 + have hupper_beta_pos : + 0 < hP4.sUpper + section53CoarseFluctuationBeta hP4 := + add_pos hP4.sUpper_pos (section53CoarseFluctuationBeta_pos hP4) + nlinarith + +/-- Uniform shifted-window version of the Section 5.5 shifted `widetildeTheta` +bound. + +The constant is chosen after the explicit parameters `xi` and `β`, and before +the law and all scale parameters. -/ +theorem shiftedWidetildeThetaAtScale_shifted_bound_homogenizationScale + {d : ℕ} [NeZero d] (xi : ℕ) (β : ℝ) (hβ : 0 < β) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.xi = xi → + section53CoarseFluctuationBeta hP4 = β → + ∀ {k n : ℕ}, k ≤ n → + shiftedWidetildeThetaAtScale P (n : ℤ) hP4 β ≤ + thetaAtScale hP hStruct (k : ℤ) + + C * Real.rpow (3 : ℝ) (-β * ((n - k : ℕ) : ℝ)) * + widetildeThetaAtScale P (k : ℤ) hP4 := by + obtain ⟨C52, hC52_nonneg, hC52⟩ := + betaShiftedWidetildeThetaAtScale_le_thetaAtScale_zero_add_section52TwoExponent_error + (d := d) + let D : ℝ := 2 * C52 * (xi : ℝ) * (β ^ 3)⁻¹ + let C : ℝ := D + D + D * D + have hD_nonneg : 0 ≤ D := by + dsimp [D] + positivity + have hC_nonneg : 0 ≤ C := by + dsimp [C] + nlinarith [mul_nonneg hD_nonneg hD_nonneg] + refine ⟨C, hC_nonneg, ?_⟩ + intro P hP hStruct hP4 hxi hβeq k n hkn + let Pk := Ch04.restrictionScaleNormalizedLaw k P + let hPk := hP.scaleNormalized k + let hStructPk := hStruct.scaleNormalized k + let hP4k := hP4.scaleNormalized hP hStruct k + have hxi_k : hP4k.xi = xi := by + simpa [hP4k, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using hxi + have hβ_k : section53CoarseFluctuationBeta hP4k = β := by + simpa [hP4k, QuantitativeCoarseGrainedEllipticity.scaleNormalized] using! hβeq + let m : ℕ := n - k + let decay : ℝ := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let upperCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4k.xi C52 hP4k.sUpper + (hP4k.sUpper + section53CoarseFluctuationBeta hP4k) m + let lowerCoeff : ℝ := + section52TwoExponentMomentBoundCoeff d hP4k.xi C52 hP4k.sLower + (hP4k.sLower + section53CoarseFluctuationBeta hP4k) m + let upperLoss : ℝ := + section52MomentLossCoeff d hP4k.xi hP4k.sUpper + (hP4k.sUpper + section53CoarseFluctuationBeta hP4k) + let lowerLoss : ℝ := + section52MomentLossCoeff d hP4k.xi hP4k.sLower + (hP4k.sLower + section53CoarseFluctuationBeta hP4k) + have hbase := hC52 hPk hStructPk hP4k m + have hdecay_nonneg : 0 ≤ decay := by + dsimp [decay] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdecay_le_one : decay ≤ 1 := by + dsimp [decay] + exact rpow_three_neg_beta_nat_le_one hβ.le m + have hupperLoss_le : upperLoss ≤ 2 * (xi : ℝ) * (β ^ 3)⁻¹ := by + dsimp [upperLoss] + simpa [hxi_k, hβ_k] using + section52MomentLossCoeff_upper_beta_shift_le_xi_beta_cubed hP4k + have hlowerLoss_le : lowerLoss ≤ 2 * (xi : ℝ) * (β ^ 3)⁻¹ := by + dsimp [lowerLoss] + simpa [hxi_k, hβ_k] using + section52MomentLossCoeff_lower_beta_shift_le_xi_beta_cubed hP4k + have hupperCoeff_loss : + upperCoeff ≤ (C52 * upperLoss) * decay := by + dsimp [upperCoeff, upperLoss, decay] + simpa [hβ_k] using + section52TwoExponentMomentBoundCoeff_upper_beta_shift_le_loss_beta_decay + hP4k hC52_nonneg m + have hlowerCoeff_loss : + lowerCoeff ≤ (C52 * lowerLoss) * decay := by + dsimp [lowerCoeff, lowerLoss, decay] + simpa [hβ_k] using + section52TwoExponentMomentBoundCoeff_lower_beta_shift_le_loss_beta_decay + hP4k hC52_nonneg m + have hupperCoeff_le : upperCoeff ≤ D * decay := by + calc + upperCoeff ≤ (C52 * upperLoss) * decay := hupperCoeff_loss + _ ≤ (C52 * (2 * (xi : ℝ) * (β ^ 3)⁻¹)) * decay := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hupperLoss_le hC52_nonneg) hdecay_nonneg + _ = D * decay := by + dsimp [D] + ring + have hlowerCoeff_le : lowerCoeff ≤ D * decay := by + calc + lowerCoeff ≤ (C52 * lowerLoss) * decay := hlowerCoeff_loss + _ ≤ (C52 * (2 * (xi : ℝ) * (β ^ 3)⁻¹)) * decay := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hlowerLoss_le hC52_nonneg) hdecay_nonneg + _ = D * decay := by + dsimp [D] + ring + have hupperCoeff_nonneg : 0 ≤ upperCoeff := by + dsimp [upperCoeff] + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4k.xi) (m := m) (C := C52) + (s := hP4k.sUpper) + (r := hP4k.sUpper + section53CoarseFluctuationBeta hP4k) + hC52_nonneg hP4k.sUpper_pos + (by simpa using sUpper_add_beta_lt_one' hP4k) hP4k.two_le_dim + have hlowerCoeff_nonneg : 0 ≤ lowerCoeff := by + dsimp [lowerCoeff] + exact section52TwoExponentMomentBoundCoeff_nonneg + (d := d) (ξ := hP4k.xi) (m := m) (C := C52) + (s := hP4k.sLower) + (r := hP4k.sLower + section53CoarseFluctuationBeta hP4k) + hC52_nonneg hP4k.sLower_pos + (by simpa using sLower_add_beta_lt_one' hP4k) hP4k.two_le_dim + have hprod_le : upperCoeff * lowerCoeff ≤ D * D * decay := by + have hDdecay_nonneg : 0 ≤ D * decay := mul_nonneg hD_nonneg hdecay_nonneg + have hstep : upperCoeff * lowerCoeff ≤ (D * decay) * (D * decay) := + mul_le_mul hupperCoeff_le hlowerCoeff_le hlowerCoeff_nonneg hDdecay_nonneg + have hdecay_sq_le : decay * decay ≤ decay := by + calc + decay * decay ≤ decay * 1 := + mul_le_mul_of_nonneg_left hdecay_le_one hdecay_nonneg + _ = decay := by ring + have hDD_nonneg : 0 ≤ D * D := mul_nonneg hD_nonneg hD_nonneg + calc + upperCoeff * lowerCoeff ≤ (D * decay) * (D * decay) := hstep + _ = (D * D) * (decay * decay) := by ring + _ ≤ (D * D) * decay := + mul_le_mul_of_nonneg_left hdecay_sq_le hDD_nonneg + _ = D * D * decay := by ring + have hCoeff_le : + upperCoeff + lowerCoeff + upperCoeff * lowerCoeff ≤ C * decay := by + dsimp [C] + nlinarith + have hW0_nonneg : 0 ≤ widetildeThetaAtScale Pk 0 hP4k := by + unfold widetildeThetaAtScale Ch04.widetildeThetaAtScale + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg Pk 0 hP4k.xi hP4k.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg Pk 0 hP4k.xi hP4k.sLower_pos) + have hbound_pk : + betaShiftedWidetildeThetaAtScale Pk (m : ℤ) hP4k ≤ + thetaAtScale hPk hStructPk 0 + + C * decay * widetildeThetaAtScale Pk 0 hP4k := by + calc + betaShiftedWidetildeThetaAtScale Pk (m : ℤ) hP4k + ≤ thetaAtScale hPk hStructPk 0 + + (upperCoeff + lowerCoeff + upperCoeff * lowerCoeff) * + widetildeThetaAtScale Pk 0 hP4k := by + simpa [upperCoeff, lowerCoeff, m] using hbase + _ ≤ thetaAtScale hPk hStructPk 0 + + (C * decay) * widetildeThetaAtScale Pk 0 hP4k := by + have hmul := mul_le_mul_of_nonneg_right hCoeff_le hW0_nonneg + nlinarith + _ = thetaAtScale hPk hStructPk 0 + + C * decay * widetildeThetaAtScale Pk 0 hP4k := by ring + have hshift := + betaShiftedWidetildeThetaAtScale_restrictionScaleNormalizedLaw_of_le hP hStruct hP4 hkn + have htheta := thetaAtScale_zero_restrictionScaleNormalizedLaw hP hStruct k + have hw0 := widetildeThetaAtScale_zero_restrictionScaleNormalizedLaw hP hStruct hP4 k + have hbound := hbound_pk + rw [hshift] at hbound + rw [hw0] at hbound + simpa [Pk, hPk, hStructPk, hP4k, m, decay, thetaAtScale, + widetildeThetaAtScale, shiftedWidetildeThetaAtScale, + betaShiftedWidetildeThetaAtScale, htheta, hβeq] using hbound + +end + +end Section55 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56.lean new file mode 100644 index 0000000000..458ab265c2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic + +/-! # Section56 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 + +/-! +# Section 5.6 theorem surface + +This module exposes the small-contrast iteration estimate. +-/ + +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/HarmonicMean.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/HarmonicMean.lean new file mode 100644 index 0000000000..4f8d339479 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/HarmonicMean.lean @@ -0,0 +1,228 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.MatrixOrderBridge +public import Mathlib.Tactic.NoncommRing + +/-! # Harmonic Mean -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators MatrixOrder + +noncomputable section + +/-! +# A finite matrix arithmetic-harmonic mean identity + +This file records the elementary matrix identity behind the Section 5.6 +small-contrast replacement of the harmonic mean by the arithmetic mean. +-/ + +/-- The arithmetic mean of a finite sequence of square real matrices. -/ +noncomputable def matrixArithmeticMean {N d : ℕ} (b : Fin N → Mat d) : Mat d := + (N : ℝ)⁻¹ • ∑ i, b i + +/-- The harmonic mean of a finite sequence of square real matrices. -/ +noncomputable def matrixHarmonicMean {N d : ℕ} (b : Fin N → Mat d) : Mat d := + ((N : ℝ)⁻¹ • ∑ i, (b i)⁻¹)⁻¹ + +private theorem natCast_pos_of_neZero (N : ℕ) [NeZero N] : 0 < (N : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne N) + +private theorem matrixAverage_inv_posDef {N d : ℕ} [NeZero N] + {b : Fin N → Mat d} (hb : ∀ i, (b i).PosDef) : + ((N : ℝ)⁻¹ • ∑ i, (b i)⁻¹).PosDef := by + classical + have hsum : (∑ i : Fin N, (b i)⁻¹).PosDef := + Matrix.posDef_sum (s := Finset.univ) Finset.univ_nonempty + (fun i _hi => (hb i).inv) + exact hsum.smul (inv_pos.mpr (natCast_pos_of_neZero N)) + +/-- The harmonic mean of positive definite matrices is positive definite. -/ +theorem matrixHarmonicMean_posDef {N d : ℕ} [NeZero N] + {b : Fin N → Mat d} (hb : ∀ i, (b i).PosDef) : + (matrixHarmonicMean b).PosDef := by + simp [matrixHarmonicMean, (matrixAverage_inv_posDef (b := b) hb).inv] + +private theorem matrixHarmonicMean_inv_eq_average_inv {N d : ℕ} [NeZero N] + {b : Fin N → Mat d} (hb : ∀ i, (b i).PosDef) : + (matrixHarmonicMean b)⁻¹ = (N : ℝ)⁻¹ • ∑ i, (b i)⁻¹ := by + let S : Mat d := (N : ℝ)⁻¹ • ∑ i, (b i)⁻¹ + have hS : S.PosDef := by + simpa [S] using matrixAverage_inv_posDef (b := b) hb + let _ := hS.isUnit.invertible + change S⁻¹⁻¹ = S + exact Matrix.inv_inv_of_invertible S + +private theorem inv_natCast_smul_sum_const {N d : ℕ} [NeZero N] (G : Mat d) : + (N : ℝ)⁻¹ • (∑ _i : Fin N, G) = G := by + rw [Finset.sum_const, Finset.card_fin, ← Nat.cast_smul_eq_nsmul ℝ] + rw [smul_smul, inv_mul_cancel₀ (ne_of_gt (natCast_pos_of_neZero N)), one_smul] + +private theorem inv_natCast_smul_sum_mul_left_right {N d : ℕ} [NeZero N] + (G : Mat d) (A : Fin N → Mat d) : + (N : ℝ)⁻¹ • (∑ i, G * A i * G) = + G * ((N : ℝ)⁻¹ • ∑ i, A i) * G := by + calc + (N : ℝ)⁻¹ • (∑ i, G * A i * G) + = ∑ i, (N : ℝ)⁻¹ • (G * A i * G) := by + rw [Finset.smul_sum] + _ = ∑ i, G * ((N : ℝ)⁻¹ • A i) * G := by + refine Finset.sum_congr rfl ?_ + intro i _hi + simp [Matrix.mul_assoc] + _ = G * (∑ i, (N : ℝ)⁻¹ • A i) * G := by + simp [Matrix.mul_sum, Matrix.sum_mul] + _ = G * ((N : ℝ)⁻¹ • ∑ i, A i) * G := by + rw [Finset.smul_sum] + +private theorem quadratic_term_expand {d : ℕ} {B G : Mat d} (hB : B.PosDef) : + (B - G) * B⁻¹ * (B - G) = B - G - G + G * B⁻¹ * G := by + have hdet : IsUnit B.det := (Matrix.isUnit_iff_isUnit_det (A := B)).mp hB.isUnit + have hright : B * B⁻¹ = 1 := Matrix.mul_nonsing_inv B hdet + have hleft : B⁻¹ * B = 1 := Matrix.nonsing_inv_mul B hdet + noncomm_ring [hright, hleft] + +private theorem harmonic_quadratic_term_expand {d : ℕ} {H G S : Mat d} + (hH : H.PosDef) (hHinv : H⁻¹ = S) : + (H - G) * H⁻¹ * (H - G) = H - G - G + G * S * G := by + have hdet : IsUnit H.det := (Matrix.isUnit_iff_isUnit_det (A := H)).mp hH.isUnit + have hright : H * H⁻¹ = 1 := Matrix.mul_nonsing_inv H hdet + have hleft : H⁻¹ * H = 1 := Matrix.nonsing_inv_mul H hdet + have hexpand : + (H - G) * H⁻¹ * (H - G) = H - G - G + G * H⁻¹ * G := by + noncomm_ring [hright, hleft] + rw [hexpand, hHinv] + +private theorem average_quadratic_terms_expand {N d : ℕ} [NeZero N] + {b : Fin N → Mat d} (G : Mat d) (hb : ∀ i, (b i).PosDef) : + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) = + matrixArithmeticMean b - G - G + + G * ((N : ℝ)⁻¹ • ∑ i, (b i)⁻¹) * G := by + calc + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) + = (N : ℝ)⁻¹ • + (∑ i, (b i - G - G + G * (b i)⁻¹ * G)) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + exact quadratic_term_expand (G := G) (hb i) + _ = (N : ℝ)⁻¹ • + ((∑ i, b i) - (∑ _i : Fin N, G) - (∑ _i : Fin N, G) + + ∑ i, G * (b i)⁻¹ * G) := by + congr 1 + simp [Finset.sum_add_distrib, Finset.sum_sub_distrib] + _ = (N : ℝ)⁻¹ • (∑ i, b i) - + (N : ℝ)⁻¹ • (∑ _i : Fin N, G) - + (N : ℝ)⁻¹ • (∑ _i : Fin N, G) + + (N : ℝ)⁻¹ • (∑ i, G * (b i)⁻¹ * G) := by + simp [sub_eq_add_neg, smul_add] + _ = matrixArithmeticMean b - G - G + + G * ((N : ℝ)⁻¹ • ∑ i, (b i)⁻¹) * G := by + rw [matrixArithmeticMean] + rw [inv_natCast_smul_sum_const G] + rw [inv_natCast_smul_sum_mul_left_right] + +/-- Exact arithmetic-harmonic mean identity with an arbitrary comparison matrix. -/ +theorem matrixArithmeticMean_eq_matrixHarmonicMean_add_average_quadratic_sub + {N d : ℕ} [NeZero N] (b : Fin N → Mat d) (G : Mat d) + (hb : ∀ i, (b i).PosDef) : + matrixArithmeticMean b = + matrixHarmonicMean b + + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) - + (matrixHarmonicMean b - G) * (matrixHarmonicMean b)⁻¹ * + (matrixHarmonicMean b - G) := by + let H : Mat d := matrixHarmonicMean b + let S : Mat d := (N : ℝ)⁻¹ • ∑ i, (b i)⁻¹ + have hH : H.PosDef := by + simpa [H] using matrixHarmonicMean_posDef (b := b) hb + have hHinv : H⁻¹ = S := by + simpa [H, S] using matrixHarmonicMean_inv_eq_average_inv (b := b) hb + have hAvg := average_quadratic_terms_expand (b := b) G hb + have hHquad := harmonic_quadratic_term_expand (H := H) (G := G) (S := S) hH hHinv + calc + matrixArithmeticMean b = + H + (matrixArithmeticMean b - G - G + G * S * G) - + (H - G - G + G * S * G) := by + noncomm_ring + _ = H + + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) - + (H - G) * H⁻¹ * (H - G) := by + rw [← hAvg, ← hHquad] + _ = matrixHarmonicMean b + + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) - + (matrixHarmonicMean b - G) * (matrixHarmonicMean b)⁻¹ * + (matrixHarmonicMean b - G) := by + rfl + +private theorem harmonicMean_quadratic_posSemidef {N d : ℕ} [NeZero N] + {b : Fin N → Mat d} {G : Mat d} (hb : ∀ i, (b i).PosDef) (hG : G.IsSymm) : + ((matrixHarmonicMean b - G) * (matrixHarmonicMean b)⁻¹ * + (matrixHarmonicMean b - G)).PosSemidef := by + let H : Mat d := matrixHarmonicMean b + have hH : H.PosDef := by + simpa [H] using matrixHarmonicMean_posDef (b := b) hb + have hHsymm : H.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm, H] using hH.isHermitian + have hKherm : (H - G).IsHermitian := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hHsymm.sub hG + have hPSD : + (Matrix.conjTranspose (H - G) * H⁻¹ * (H - G)).PosSemidef := + hH.inv.posSemidef.conjTranspose_mul_mul_same (H - G) + change ((H - G) * H⁻¹ * (H - G)).PosSemidef + have hterm : + Matrix.conjTranspose (H - G) * H⁻¹ * (H - G) = + (H - G) * H⁻¹ * (H - G) := by + rw [hKherm.eq] + exact hterm ▸ hPSD + +/-- Dropping the nonnegative harmonic square gives the first Loewner inequality. -/ +theorem matrixArithmeticMean_le_matrixHarmonicMean_add_average_quadratic + {N d : ℕ} [NeZero N] (b : Fin N → Mat d) (G : Mat d) + (hb : ∀ i, (b i).PosDef) (hG : G.IsSymm) : + matrixArithmeticMean b ≤ + matrixHarmonicMean b + + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) := by + rw [Matrix.le_iff] + have hId := + matrixArithmeticMean_eq_matrixHarmonicMean_add_average_quadratic_sub + (b := b) G hb + have hPSD := harmonicMean_quadratic_posSemidef (b := b) (G := G) hb hG + convert hPSD using 1 + all_goals first + | rfl + | (rw [hId]; noncomm_ring) + +/-- The comparison form used to replace the harmonic mean by the arithmetic mean. -/ +theorem matrixArithmeticMean_sub_matrixHarmonicMean_le_average_quadratic + {N d : ℕ} [NeZero N] (b : Fin N → Mat d) (G : Mat d) + (hb : ∀ i, (b i).PosDef) (hG : G.IsSymm) : + matrixArithmeticMean b - matrixHarmonicMean b ≤ + (N : ℝ)⁻¹ • (∑ i, (b i - G) * (b i)⁻¹ * (b i - G)) := by + rw [Matrix.le_iff] + have hId := + matrixArithmeticMean_eq_matrixHarmonicMean_add_average_quadratic_sub + (b := b) G hb + have hPSD := harmonicMean_quadratic_posSemidef (b := b) (G := G) hb hG + convert hPSD using 1 + all_goals first + | rfl + | (rw [hId]; noncomm_ring) + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay.lean new file mode 100644 index 0000000000..a115461eb5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Recurrence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationCore +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationConstants +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Iteration +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Final + +/-! # Small Contrast Algebraic Decay -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +/-! +# Section 5.6 algebraic decay in the small-contrast regime + +This module will expose Proposition +`p.small.contrast.algebraic.decay.homogenization.scale`. +-/ + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Final.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Final.lean new file mode 100644 index 0000000000..13a643c018 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Final.lean @@ -0,0 +1,186 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Iteration + +/-! # Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +open Section53.JUpperBoundCoarseFluctuations + +/-! +# Proposition `p.small.contrast.algebraic.decay.homogenization.scale` +-/ + +/-- Proposition `p.small.contrast.algebraic.decay.homogenization.scale`. + +The constants are selected from the parameter record before the probability +law, so they are independent of the measure. -/ +theorem smallContrastAlgebraicDecay_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α δ0 C : ℝ, 0 < α ∧ 0 < δ0 ∧ 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 - 1 ≤ δ0 → + ∀ m : ℕ, ∀ e : Vec d, vecNormSq e = 1 → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + C * Real.rpow (3 : ℝ) (-α * (m : ℝ)) := by + rcases scalar_contraction_recursion_from_assembly params with + ⟨Cgap, θ, hCgap_pos, hθ_pos, hθ_lt_one, hscalar⟩ + let L : ℕ := Nat.ceil Cgap + 1 + have hceil_pos : 0 < Nat.ceil Cgap := by + have hceil_ge : Cgap ≤ (Nat.ceil Cgap : ℝ) := Nat.le_ceil Cgap + have hceil_real_pos : (0 : ℝ) < (Nat.ceil Cgap : ℝ) := + lt_of_lt_of_le hCgap_pos hceil_ge + exact_mod_cast hceil_real_pos + have hL_pos : 0 < L := by dsimp [L]; omega + have hL_ge_two : 2 ≤ L := by dsimp [L]; omega + have hCgap_le_L : Cgap ≤ (L : ℝ) := by + have hceil_ge : Cgap ≤ (Nat.ceil Cgap : ℝ) := Nat.le_ceil Cgap + have hceil_le_L : (Nat.ceil Cgap : ℝ) ≤ (L : ℝ) := by + dsimp [L] + exact_mod_cast Nat.le_succ (Nat.ceil Cgap) + exact hceil_ge.trans hceil_le_L + let βp : ℝ := section53CoarseFluctuationBetaParams params + have hβp_pos : 0 < βp := by + dsimp [βp] + exact section53CoarseFluctuationBetaParams_pos params + let α0 : ℝ := min βp (1 / 16 : ℝ) + have hα0_pos : 0 < α0 := lt_min hβp_pos (by norm_num) + have hα0_le_βp : α0 ≤ βp := min_le_left _ _ + have hα0_le_sixteen : α0 ≤ (1 / 16 : ℝ) := min_le_right _ _ + obtain ⟨α, δseq, K, hα_pos, hδseq_pos, hK_pos, hseq⟩ := + algebraic_decay_of_threeQuarter_recursion + hL_pos hθ_pos hθ_lt_one hα0_pos (by norm_num : 0 ≤ (2 : ℝ)) + let δ0 : ℝ := min 1 δseq + have hδ0_pos : 0 < δ0 := by + dsimp [δ0] + exact lt_min zero_lt_one hδseq_pos + have hδ0_le_one : δ0 ≤ 1 := by dsimp [δ0]; exact min_le_left _ _ + have hδ0_le_seq : δ0 ≤ δseq := by dsimp [δ0]; exact min_le_right _ _ + refine ⟨α, δ0, K, hα_pos, hδ0_pos, hK_pos, ?_⟩ + intro P hP hStruct hP4 hparams hsmall0 m e he + dsimp only + let F : ℕ → ℝ := fun n => thetaAtScale hP hStruct (n : ℤ) - 1 + have hsmall_two : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 := + widetildeThetaAtScale_zero_le_two_of_sub_one_le_delta + hδ0_le_one hsmall0 + have hF_nonneg : ∀ n, 0 ≤ F n := by + intro n + dsimp [F] + exact thetaAtScale_sub_one_nonneg hP hStruct hP4 n + have hF_small : ∀ n, F n ≤ δseq := by + intro n + have hleδ0 : + F n ≤ δ0 := by + dsimp [F] + exact + thetaAtScale_sub_one_le_delta_of_widetildeThetaAtScale_zero_sub_one_le_delta + hP hStruct hP4 hsmall0 n + exact hleδ0.trans hδ0_le_seq + have hrec : + ∀ n, 8 * L + 4 ≤ n → + F n ≤ θ * F (n - L) + (F (threeQuarterScale n)) ^ (2 : ℕ) + + 2 * Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) := by + intro n hnlarge + let ell : ℕ := threeQuarterScale n + let k : ℕ := n - L + have hwindow := lagged_scale_window hL_pos hnlarge + have hellk : ell < k := by simpa [ell, k] using hwindow.1 + have hkn : k < n := by simpa [k] using hwindow.2.1 + have hgap : Cgap ≤ ((n - k : ℕ) : ℝ) := by + have hL_le_gap : (L : ℝ) ≤ ((n - k : ℕ) : ℝ) := by + exact_mod_cast hwindow.2.2.1 + exact hCgap_le_L.trans hL_le_gap + have hβ_eq : section53CoarseFluctuationBeta hP4 = βp := by + rw [← section53CoarseFluctuationBetaParams_eq_of_P4 hP4, hparams] + have hscalar_n := hscalar hP hStruct hP4 hparams hsmall_two e he + (ell := ell) (k := k) (m := n) hellk hkn hgap + have htail_le : + Real.rpow (3 : ℝ) (-(section53CoarseFluctuationBeta hP4) * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) := by + rw [hβ_eq] + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by nlinarith) + have hgeom_le : + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) ≤ + Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) := by + have hd_ge_one : (1 : ℝ) ≤ (d : ℝ) := by + have hd_nat : 1 ≤ d := le_trans (by norm_num : 1 ≤ 2) params.two_le_dim + exact_mod_cast hd_nat + have hn_ge_sixteen : 16 ≤ n := by nlinarith [hL_ge_two, hnlarge] + have hfloor : + (n : ℝ) / 16 ≤ ((n / 8 : ℕ) : ℝ) := + scale_div_sixteen_le_nat_div_eight_cast hn_ge_sixteen + have hgap_floor : ((n / 8 : ℕ) : ℝ) ≤ ((k - ell : ℕ) : ℝ) := by + exact_mod_cast hwindow.2.2.2 + have hexponent : + -(d : ℝ) * ((k - ell : ℕ) : ℝ) ≤ -α0 * (n : ℝ) := by + have hmain : α0 * (n : ℝ) ≤ (d : ℝ) * ((k - ell : ℕ) : ℝ) := by + calc + α0 * (n : ℝ) ≤ (1 / 16 : ℝ) * (n : ℝ) := + mul_le_mul_of_nonneg_right hα0_le_sixteen (by positivity) + _ = (n : ℝ) / 16 := by ring + _ ≤ ((n / 8 : ℕ) : ℝ) := hfloor + _ ≤ ((k - ell : ℕ) : ℝ) := hgap_floor + _ ≤ (d : ℝ) * ((k - ell : ℕ) : ℝ) := by + exact le_mul_of_one_le_left (by positivity) hd_ge_one + nlinarith + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexponent + calc + F n ≤ θ * F k + + Real.rpow (3 : ℝ) (-(section53CoarseFluctuationBeta hP4) * (n : ℝ)) + + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + (F ell) ^ (2 : ℕ) := by + simpa [F, ell, k] using hscalar_n + _ ≤ θ * F k + Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) + + Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) + (F ell) ^ (2 : ℕ) := by + gcongr + _ = θ * F (n - L) + (F (threeQuarterScale n)) ^ (2 : ℕ) + + 2 * Real.rpow (3 : ℝ) (-α0 * (n : ℝ)) := by + dsimp [ell, k] + ring + have hF_decay := hseq F hF_nonneg hF_small hrec m + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hJ_le_F : + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ F m := by + dsimp [F, p_e, q_e] + simpa [p_e, q_e] using + expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_of_vecNormSq_eq_one + hP hStruct hP4 m e he + exact hJ_le_F.trans hF_decay + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Iteration.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Iteration.lean new file mode 100644 index 0000000000..813df8c1eb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Iteration.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationConstants + +/-! # Iteration -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +/-! +# The pure algebraic decay theorem for the Section 5.6 recurrence +-/ + +theorem algebraic_decay_of_threeQuarter_recursion + {L : ℕ} {θ α0 B : ℝ} + (hL_pos : 0 < L) (hθ_pos : 0 < θ) (hθ_lt_one : θ < 1) + (hα0_pos : 0 < α0) (hB_nonneg : 0 ≤ B) : + ∃ α δ K : ℝ, 0 < α ∧ 0 < δ ∧ 0 < K ∧ + ∀ F : ℕ → ℝ, + (∀ m, 0 ≤ F m) → + (∀ m, F m ≤ δ) → + (∀ m, 8 * L + 4 ≤ m → + F m ≤ θ * F (m - L) + (F (threeQuarterScale m)) ^ (2 : ℕ) + + B * Real.rpow (3 : ℝ) (-α0 * (m : ℝ))) → + ∀ m, F m ≤ K * Real.rpow (3 : ℝ) (-α * (m : ℝ)) := by + obtain ⟨α, hα_pos, hα_le_α0, hlam_lt_one⟩ := + exists_decay_rate_for_lag_contraction hL_pos hθ_pos hθ_lt_one hα0_pos + let lam : ℝ := θ * Real.rpow (3 : ℝ) (α * (L : ℝ)) + have hlam_lt : lam < 1 := by simpa [lam] using hlam_lt_one + have hlam_nonneg : 0 ≤ lam := by + dsimp [lam] + exact mul_nonneg hθ_pos.le (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + let ε : ℝ := (1 - lam) / 4 + have hε_pos : 0 < ε := by + dsimp [ε] + nlinarith + have hbudget : lam + ε + ε ≤ 1 := by + dsimp [ε] + nlinarith + let K : ℝ := max 1 (B / ε) + have hK_pos : 0 < K := by + dsimp [K] + exact lt_of_lt_of_le zero_lt_one (le_max_left _ _) + have hK_nonneg : 0 ≤ K := hK_pos.le + have hB_le_epsK : B ≤ ε * K := by + have hB_div_le : B / ε ≤ K := by + dsimp [K] + exact le_max_right _ _ + have hmul := mul_le_mul_of_nonneg_left hB_div_le hε_pos.le + field_simp [hε_pos.ne'] at hmul + nlinarith + let Aabs : ℝ := K / ε + have hAabs_nonneg : 0 ≤ Aabs := by + dsimp [Aabs] + positivity + obtain ⟨Cabs, hCabs_nonneg, hAbs⟩ := + exists_decay_absorption_const (β := α / 2) (A := Aabs) + (by positivity) hAabs_nonneg + let Nabs : ℕ := Nat.ceil Cabs + let N : ℕ := max (8 * L + 4) (2 * Nabs) + have hN_ge_base : 8 * L + 4 ≤ N := by + dsimp [N] + exact le_max_left _ _ + have hN_ge_abs2 : 2 * Nabs ≤ N := by + dsimp [N] + exact le_max_right _ _ + have hCabs_le_Nabs : Cabs ≤ (Nabs : ℝ) := by + simpa [Nabs] using Nat.le_ceil Cabs + let δ : ℝ := min 1 (K * Real.rpow (3 : ℝ) (-α * (N : ℝ))) + have hdecay_pos : ∀ m : ℕ, 0 < Real.rpow (3 : ℝ) (-α * (m : ℝ)) := by + intro m + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hdecay_nonneg : ∀ m : ℕ, 0 ≤ Real.rpow (3 : ℝ) (-α * (m : ℝ)) := by + intro m + exact (hdecay_pos m).le + have hδ_pos : 0 < δ := by + dsimp [δ] + exact lt_min zero_lt_one (mul_pos hK_pos (hdecay_pos N)) + refine ⟨α, δ, K, hα_pos, hδ_pos, hK_pos, ?_⟩ + intro F hF_nonneg hF_small hrec + let decay : ℕ → ℝ := fun m => Real.rpow (3 : ℝ) (-α * (m : ℝ)) + let source : ℕ → ℝ := fun m => B * Real.rpow (3 : ℝ) (-α0 * (m : ℝ)) + have hbase : ∀ m, m < N → F m ≤ K * decay m := by + intro m hmN + have hm_le_N : m ≤ N := le_of_lt hmN + have hδ_le : δ ≤ K * decay N := by + dsimp [δ] + exact min_le_right _ _ + have hdecay_N_le_m : decay N ≤ decay m := by + dsimp [decay] + have hm_le_N_real : (m : ℝ) ≤ (N : ℝ) := by exact_mod_cast hm_le_N + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by nlinarith) + calc + F m ≤ δ := hF_small m + _ ≤ K * decay N := hδ_le + _ ≤ K * decay m := + mul_le_mul_of_nonneg_left hdecay_N_le_m hK_nonneg + have hq_lt : ∀ m, N ≤ m → threeQuarterScale m < m := by + intro m hNm + have hlarge : 8 * L + 4 ≤ m := hN_ge_base.trans hNm + exact (lagged_scale_window hL_pos hlarge).1.trans + (lagged_scale_window hL_pos hlarge).2.1 + have hshift_lt : ∀ m, N ≤ m → m - L < m := by + intro m hNm + have hlarge : 8 * L + 4 ≤ m := hN_ge_base.trans hNm + exact (lagged_scale_window hL_pos hlarge).2.1 + have hrec_core : + ∀ m, N ≤ m → + F m ≤ θ * F (m - L) + (F (threeQuarterScale m)) ^ (2 : ℕ) + source m := by + intro m hNm + have hlarge : 8 * L + 4 ≤ m := hN_ge_base.trans hNm + simpa [source] using hrec m hlarge + have hshift : + ∀ m, N ≤ m → + θ * (K * decay (m - L)) ≤ lam * (K * decay m) := by + intro m hNm + have hlarge : 8 * L + 4 ≤ m := hN_ge_base.trans hNm + have hL_le_m : L ≤ m := by omega + have hcast_sub : ((m - L : ℕ) : ℝ) = (m : ℝ) - (L : ℝ) := by + simpa using (Nat.cast_sub hL_le_m : ((m - L : ℕ) : ℝ) = (m : ℝ) - (L : ℝ)) + have hdecay_shift : + decay (m - L) = + decay m * Real.rpow (3 : ℝ) (α * (L : ℝ)) := by + dsimp [decay] + rw [hcast_sub] + calc + Real.rpow (3 : ℝ) (-α * ((m : ℝ) - (L : ℝ))) = + Real.rpow (3 : ℝ) (-α * (m : ℝ) + α * (L : ℝ)) := by ring_nf + _ = Real.rpow (3 : ℝ) (-α * (m : ℝ)) * + Real.rpow (3 : ℝ) (α * (L : ℝ)) := by + exact Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-α * (m : ℝ)) (α * (L : ℝ)) + calc + θ * (K * decay (m - L)) + = θ * (K * (decay m * Real.rpow (3 : ℝ) (α * (L : ℝ)))) := by + rw [hdecay_shift] + _ = (θ * Real.rpow (3 : ℝ) (α * (L : ℝ))) * (K * decay m) := by + ring + _ = lam * (K * decay m) := by + rfl + _ ≤ lam * (K * decay m) := le_rfl + have hsource_bound : + ∀ m, N ≤ m → source m ≤ ε * (K * decay m) := by + intro m hNm + have hdecay0_le : Real.rpow (3 : ℝ) (-α0 * (m : ℝ)) ≤ decay m := by + dsimp [decay] + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by nlinarith) + calc + source m = B * Real.rpow (3 : ℝ) (-α0 * (m : ℝ)) := rfl + _ ≤ B * decay m := mul_le_mul_of_nonneg_left hdecay0_le hB_nonneg + _ ≤ (ε * K) * decay m := + mul_le_mul_of_nonneg_right hB_le_epsK (hdecay_nonneg m) + _ = ε * (K * decay m) := by ring + have hquad : + ∀ m, N ≤ m → + (K * decay (threeQuarterScale m)) ^ (2 : ℕ) ≤ ε * (K * decay m) := by + intro m hNm + have hNabs_le_half : Nabs ≤ m / 2 := by + have h2 : 2 * Nabs ≤ m := hN_ge_abs2.trans hNm + have h2' : Nabs * 2 ≤ m := by simpa [mul_comm] using h2 + exact (Nat.le_div_iff_mul_le (by norm_num : 0 < 2)).2 h2' + have hCabs_le_half : Cabs ≤ ((m / 2 : ℕ) : ℝ) := + hCabs_le_Nabs.trans (by exact_mod_cast hNabs_le_half) + have hAbs_half : + Aabs * Real.rpow (3 : ℝ) (-2 * (α / 2) * ((m / 2 : ℕ) : ℝ)) ≤ 1 / 4 := + hAbs hCabs_le_half + have hK_decay_half_le_eps : + K * decay (m / 2) ≤ ε := by + have hrewrite : + Real.rpow (3 : ℝ) (-2 * (α / 2) * ((m / 2 : ℕ) : ℝ)) = + decay (m / 2) := by + dsimp [decay] + congr 1 + ring + have hmain : (K / ε) * decay (m / 2) ≤ 1 / 4 := by + rw [hrewrite] at hAbs_half + simpa [Aabs] using hAbs_half + have hmul := mul_le_mul_of_nonneg_left hmain hε_pos.le + field_simp [hε_pos.ne'] at hmul + nlinarith + have hdecay_sq_le : + (decay (threeQuarterScale m)) ^ (2 : ℕ) ≤ decay m * decay (m / 2) := by + simpa [decay] using threeQuarterScale_decay_sq_le hα_pos.le m + have htarget_nonneg : 0 ≤ K * decay m := + mul_nonneg hK_nonneg (hdecay_nonneg m) + calc + (K * decay (threeQuarterScale m)) ^ (2 : ℕ) + = K ^ (2 : ℕ) * (decay (threeQuarterScale m)) ^ (2 : ℕ) := by + ring + _ ≤ K ^ (2 : ℕ) * (decay m * decay (m / 2)) := + mul_le_mul_of_nonneg_left hdecay_sq_le (sq_nonneg K) + _ = K * decay m * (K * decay (m / 2)) := by ring + _ ≤ K * decay m * ε := by + exact mul_le_mul_of_nonneg_left hK_decay_half_le_eps htarget_nonneg + _ = ε * (K * decay m) := by ring + exact + algebraic_decay_induction_core + (F := F) (decay := decay) (source := source) + (q := threeQuarterScale) (L := L) (N := N) + (K := K) (θ := θ) (lam := lam) (ε := ε) + hK_nonneg hθ_pos.le hdecay_nonneg hF_nonneg hbase hq_lt hshift_lt + hrec_core hshift hquad hsource_bound hbudget + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationConstants.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationConstants.lean new file mode 100644 index 0000000000..b607533573 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationConstants.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.IterationCore + +/-! # Iteration Constants -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +open Section53.JUpperBoundCoarseFluctuations + +/-! +# Constant selection for the small-contrast algebraic iteration +-/ + +/-- The lower scale used in the nonlinear iteration. -/ +def threeQuarterScale (m : ℕ) : ℕ := + m - m / 4 + +theorem threeQuarterScale_lt_self {m : ℕ} (hm : 4 ≤ m) : + threeQuarterScale m < m := by + dsimp [threeQuarterScale] + omega + +theorem half_le_two_threeQuarterScale_sub (m : ℕ) : + m / 2 ≤ 2 * threeQuarterScale m - m := by + dsimp [threeQuarterScale] + omega + +theorem threeQuarterScale_decay_sq_le + {α : ℝ} (hα_nonneg : 0 ≤ α) (m : ℕ) : + (Real.rpow (3 : ℝ) (-α * (threeQuarterScale m : ℝ))) ^ (2 : ℕ) ≤ + Real.rpow (3 : ℝ) (-α * (m : ℝ)) * + Real.rpow (3 : ℝ) (-α * ((m / 2 : ℕ) : ℝ)) := by + let q := threeQuarterScale m + have hgain_nat : m + m / 2 ≤ 2 * q := by + dsimp [q, threeQuarterScale] + omega + have hgain_real : (m : ℝ) + ((m / 2 : ℕ) : ℝ) ≤ 2 * (q : ℝ) := by + exact_mod_cast hgain_nat + have hexp_le : + -2 * α * (q : ℝ) ≤ -α * (m : ℝ) + -α * ((m / 2 : ℕ) : ℝ) := by + nlinarith + calc + (Real.rpow (3 : ℝ) (-α * (threeQuarterScale m : ℝ))) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (-2 * α * (q : ℝ)) := by + dsimp [q] + calc + (Real.rpow (3 : ℝ) (-α * (threeQuarterScale m : ℝ))) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (-α * (threeQuarterScale m : ℝ)) * + Real.rpow (3 : ℝ) (-α * (threeQuarterScale m : ℝ)) := by ring + _ = Real.rpow (3 : ℝ) + (-α * (threeQuarterScale m : ℝ) + + -α * (threeQuarterScale m : ℝ)) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-α * (threeQuarterScale m : ℝ)) + (-α * (threeQuarterScale m : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-2 * α * (threeQuarterScale m : ℝ)) := by + ring_nf + _ ≤ Real.rpow (3 : ℝ) + (-α * (m : ℝ) + -α * ((m / 2 : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hexp_le + _ = Real.rpow (3 : ℝ) (-α * (m : ℝ)) * + Real.rpow (3 : ℝ) (-α * ((m / 2 : ℕ) : ℝ)) := by + exact Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-α * (m : ℝ)) (-α * ((m / 2 : ℕ) : ℝ)) + +theorem lagged_scale_window + {L m : ℕ} (hL_pos : 0 < L) (hlarge : 8 * L + 4 ≤ m) : + threeQuarterScale m < m - L ∧ m - L < m ∧ + L ≤ m - (m - L) ∧ m / 8 ≤ (m - L) - threeQuarterScale m := by + dsimp [threeQuarterScale] + omega + +theorem scale_div_sixteen_le_nat_div_eight_cast {m : ℕ} (hm : 16 ≤ m) : + (m : ℝ) / 16 ≤ ((m / 8 : ℕ) : ℝ) := by + have hnat : m ≤ 16 * (m / 8) := by omega + have hreal : (m : ℝ) ≤ 16 * ((m / 8 : ℕ) : ℝ) := by + exact_mod_cast hnat + nlinarith + +/-- There is a positive exponential rate compatible with a fixed contraction +and lag. -/ +theorem exists_decay_rate_for_lag_contraction + {L : ℕ} {θ α0 : ℝ} + (hL_pos : 0 < L) (hθ_pos : 0 < θ) (hθ_lt_one : θ < 1) + (hα0_pos : 0 < α0) : + ∃ α : ℝ, 0 < α ∧ α ≤ α0 ∧ + θ * Real.rpow (3 : ℝ) (α * (L : ℝ)) < 1 := by + let target : ℝ := (1 + θ) / (2 * θ) + have htarget_pos : 0 < target := by + dsimp [target] + positivity + have htarget_gt_one : 1 < target := by + dsimp [target] + rw [lt_div_iff₀ (by positivity : 0 < 2 * θ)] + nlinarith + let αlag : ℝ := Real.logb 3 target / (2 * (L : ℝ)) + have hαlag_pos : 0 < αlag := by + dsimp [αlag] + have hlogb_pos : 0 < Real.logb 3 target := + Real.logb_pos (by norm_num : (1 : ℝ) < 3) htarget_gt_one + positivity + let α : ℝ := min (α0 / 2) αlag + have hα_pos : 0 < α := lt_min (by positivity) hαlag_pos + have hα_le_α0 : α ≤ α0 := by + have hhalf_le : α0 / 2 ≤ α0 := by nlinarith + exact (min_le_left _ _).trans hhalf_le + have hα_le_αlag : α ≤ αlag := min_le_right _ _ + have hL_nonneg : 0 ≤ (L : ℝ) := by positivity + have hαL_le : α * (L : ℝ) ≤ Real.logb 3 target / 2 := by + have hL_pos_real : 0 < (L : ℝ) := by exact_mod_cast hL_pos + calc + α * (L : ℝ) ≤ αlag * (L : ℝ) := + mul_le_mul_of_nonneg_right hα_le_αlag hL_nonneg + _ = Real.logb 3 target / 2 := by + dsimp [αlag] + field_simp [hL_pos_real.ne'] + have hpow_le_target : + Real.rpow (3 : ℝ) (α * (L : ℝ)) ≤ target := by + have hpow_le_sqrt : + Real.rpow (3 : ℝ) (α * (L : ℝ)) ≤ + Real.rpow (3 : ℝ) (Real.logb 3 target / 2) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hαL_le + have hsqrt_le_target : + Real.rpow (3 : ℝ) (Real.logb 3 target / 2) ≤ target := by + have hpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (Real.logb 3 target / 2) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hsq_eq : + (Real.rpow (3 : ℝ) (Real.logb 3 target / 2)) ^ (2 : ℕ) = + target := by + calc + (Real.rpow (3 : ℝ) (Real.logb 3 target / 2)) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (Real.logb 3 target / 2) * + Real.rpow (3 : ℝ) (Real.logb 3 target / 2) := by ring + _ = Real.rpow (3 : ℝ) + (Real.logb 3 target / 2 + Real.logb 3 target / 2) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (Real.logb 3 target / 2) (Real.logb 3 target / 2)).symm + _ = Real.rpow (3 : ℝ) (Real.logb 3 target) := by ring_nf + _ = target := by + exact Real.rpow_logb (by norm_num : (0 : ℝ) < 3) + (by norm_num : (3 : ℝ) ≠ 1) htarget_pos + have htarget_one : 1 ≤ target := le_of_lt htarget_gt_one + nlinarith + exact hpow_le_sqrt.trans hsqrt_le_target + refine ⟨α, hα_pos, hα_le_α0, ?_⟩ + calc + θ * Real.rpow (3 : ℝ) (α * (L : ℝ)) ≤ θ * target := + mul_le_mul_of_nonneg_left hpow_le_target hθ_pos.le + _ = (1 + θ) / 2 := by + dsimp [target] + field_simp [hθ_pos.ne'] + _ < 1 := by nlinarith + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationCore.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationCore.lean new file mode 100644 index 0000000000..8222737c0f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/IterationCore.lean @@ -0,0 +1,99 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.Recurrence + +/-! # Iteration Core -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +/-! +# Pure induction core for the small-contrast algebraic iteration + +This file contains no probability or homogenization assumptions. It is the +strong-induction step used after the scalar recurrence has been reduced to +explicit decay, shift, and quadratic absorption estimates. +-/ + +/-- Strong-induction core for a one-step contraction with a quadratic +lower-scale error. -/ +theorem algebraic_decay_induction_core + {F : ℕ → ℝ} {decay source : ℕ → ℝ} {q : ℕ → ℕ} + {L N : ℕ} {K θ lam ε : ℝ} + (hK_nonneg : 0 ≤ K) (hθ_nonneg : 0 ≤ θ) + (hdecay_nonneg : ∀ m, 0 ≤ decay m) + (hF_nonneg : ∀ m, 0 ≤ F m) + (hbase : ∀ m, m < N → F m ≤ K * decay m) + (hq_lt : ∀ m, N ≤ m → q m < m) + (hshift_lt : ∀ m, N ≤ m → m - L < m) + (hrec : + ∀ m, N ≤ m → + F m ≤ θ * F (m - L) + (F (q m)) ^ (2 : ℕ) + source m) + (hshift : + ∀ m, N ≤ m → + θ * (K * decay (m - L)) ≤ lam * (K * decay m)) + (hquad : + ∀ m, N ≤ m → + (K * decay (q m)) ^ (2 : ℕ) ≤ ε * (K * decay m)) + (hsource : + ∀ m, N ≤ m → + source m ≤ ε * (K * decay m)) + (hbudget : lam + ε + ε ≤ 1) : + ∀ m, F m ≤ K * decay m := by + intro m + induction m using Nat.strong_induction_on with + | h m ih => + by_cases hmN : m < N + · exact hbase m hmN + · have hNm : N ≤ m := Nat.le_of_not_gt hmN + have hm_shift : m - L < m := hshift_lt m hNm + have hq : q m < m := hq_lt m hNm + have hF_shift := ih (m - L) hm_shift + have hF_q := ih (q m) hq + have hshift_bound : + θ * F (m - L) ≤ lam * (K * decay m) := by + exact (mul_le_mul_of_nonneg_left hF_shift hθ_nonneg).trans (hshift m hNm) + have hquad_bound : + (F (q m)) ^ (2 : ℕ) ≤ ε * (K * decay m) := by + have hFq_nonneg : 0 ≤ F (q m) := hF_nonneg (q m) + exact + (pow_le_pow_left₀ hFq_nonneg hF_q 2).trans (hquad m hNm) + have hsource_bound := hsource m hNm + have hrec_m := hrec m hNm + have htarget_nonneg : 0 ≤ K * decay m := + mul_nonneg hK_nonneg (hdecay_nonneg m) + calc + F m ≤ θ * F (m - L) + (F (q m)) ^ (2 : ℕ) + source m := + hrec_m + _ ≤ lam * (K * decay m) + ε * (K * decay m) + + ε * (K * decay m) := by + gcongr + _ = (lam + ε + ε) * (K * decay m) := by ring + _ ≤ 1 * (K * decay m) := + mul_le_mul_of_nonneg_right hbudget htarget_nonneg + _ = K * decay m := by ring + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Recurrence.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Recurrence.lean new file mode 100644 index 0000000000..3777a5e39c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/Recurrence.lean @@ -0,0 +1,160 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAlgebraicDecay.ScalarRecursion + +/-! # Recurrence -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +open SmallContrastAssembly +open Section53.JUpperBoundCoarseFluctuations + +/-- Absorb the negative multiple of `F_m` in the manuscript scalar recursion. -/ +theorem scalar_contraction_of_drop_bound + {C Fm Fk S : ℝ} (hC : 0 < C) (hS : 0 ≤ S) + (h : (1 / 4 : ℝ) * Fm ≤ C * ((Fk - Fm) + S)) : + let θ : ℝ := (4 * C) / (1 + 4 * C) + Fm ≤ θ * Fk + S := by + dsimp only + let θ : ℝ := (4 * C) / (1 + 4 * C) + have hden_pos : 0 < 1 + 4 * C := by nlinarith + have hmul : + (1 + 4 * C) * Fm ≤ 4 * C * Fk + 4 * C * S := by + nlinarith + have hdiv : + Fm ≤ (4 * C * Fk + 4 * C * S) / (1 + 4 * C) := by + rw [le_div_iff₀ hden_pos] + nlinarith + have hdiv_eq : + (4 * C * Fk + 4 * C * S) / (1 + 4 * C) = + θ * Fk + θ * S := by + dsimp [θ] + field_simp [hden_pos.ne'] + have hθ_le_one : θ ≤ 1 := by + dsimp [θ] + rw [div_le_iff₀ hden_pos] + nlinarith + have hsource : θ * S ≤ S := by + have hmulS := mul_le_mul_of_nonneg_right hθ_le_one hS + simpa using hmulS + calc + Fm ≤ (4 * C * Fk + 4 * C * S) / (1 + 4 * C) := hdiv + _ = θ * Fk + θ * S := hdiv_eq + _ ≤ θ * Fk + S := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hsource (θ * Fk) + +/-- The scalar recurrence obtained from Lemma `l.small.contrast.assembly`. + +The constant is selected before the probability law; the only scale hypotheses +are the manuscript window `ell < k < m` and the required coarse gap. -/ +theorem scalar_contraction_recursion_from_assembly + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C θ : ℝ, 0 < C ∧ 0 < θ ∧ θ < 1 ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ell k m : ℕ}, ell < k → k < m → C ≤ ((m - k : ℕ) : ℝ) → + let β := section53CoarseFluctuationBeta hP4 + thetaAtScale hP hStruct (m : ℤ) - 1 ≤ + θ * (thetaAtScale hP hStruct (k : ℤ) - 1) + + Real.rpow (3 : ℝ) (-β * (m : ℝ)) + + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + rcases SmallContrastAssembly.smallContrastAssembly_homogenizationScale + params with + ⟨Casm, hCasm_pos, hAssembly⟩ + let θ : ℝ := (4 * Casm) / (1 + 4 * Casm) + have hθ_pos : 0 < θ := by + dsimp [θ] + exact div_pos (by nlinarith) (by nlinarith : 0 < 1 + 4 * Casm) + have hθ_lt_one : θ < 1 := by + dsimp [θ] + rw [div_lt_iff₀ (by nlinarith : 0 < 1 + 4 * Casm)] + nlinarith + refine ⟨Casm, θ, hCasm_pos, hθ_pos, hθ_lt_one, ?_⟩ + intro P hP hStruct hP4 hparams hsmall e he ell k m hellk hkm hgap + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let J := Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e + let Fm := thetaAtScale hP hStruct (m : ℤ) - 1 + let Fk := thetaAtScale hP hStruct (k : ℤ) - 1 + let FellSq := (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) + let tau := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + let tail := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let geom := Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + let S := tail + geom + FellSq + have hJlower : (1 / 4 : ℝ) * Fm ≤ J := by + simpa [J, Fm, p_e, q_e] using + expectedResponseJCubeSet_special_ge_quarter_theta_sub_one + hP hStruct hP4 hsmall m e he + have hJupper_group : J ≤ Casm * (tau + S) := by + have hJupper := hAssembly hP hStruct hP4 hparams hsmall e he hellk hkm hgap + calc + J ≤ Casm * tau + Casm * tail + Casm * geom + Casm * FellSq := by + simpa [J, tau, tail, geom, FellSq, p_e, q_e, β, + SmallContrastAssembly.smallContrastAssemblyRHSAtScale] using hJupper + _ = Casm * (tau + S) := by + dsimp [S] + ring + have htau_drop : tau ≤ Fk - Fm := by + have h := tauAtScale_special_le_thetaAtScale_sub + hP hStruct hP4 hkm.le e he + simpa [tau, Fk, Fm, p_e, q_e] using h + have hS_nonneg : 0 ≤ S := by + have htail_nonneg : 0 ≤ tail := by + dsimp [tail] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom_nonneg : 0 ≤ geom := by + dsimp [geom] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hFellSq_nonneg : 0 ≤ FellSq := by + dsimp [FellSq] + exact sq_nonneg _ + dsimp [S] + nlinarith + have hdrop_bound : (1 / 4 : ℝ) * Fm ≤ Casm * ((Fk - Fm) + S) := by + have hsum_le : tau + S ≤ (Fk - Fm) + S := by + linarith + have hmul_le : + Casm * (tau + S) ≤ Casm * ((Fk - Fm) + S) := + mul_le_mul_of_nonneg_left hsum_le hCasm_pos.le + exact hJlower.trans (hJupper_group.trans hmul_le) + have hcontract := + scalar_contraction_of_drop_bound hCasm_pos hS_nonneg hdrop_bound + dsimp [θ, Fm, Fk, S, tail, geom, FellSq, β] at hcontract ⊢ + linarith + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/ScalarRecursion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/ScalarRecursion.lean new file mode 100644 index 0000000000..a322f0cd0d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAlgebraicDecay/ScalarRecursion.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly + +/-! # Scalar Recursion -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAlgebraicDecay + +open SmallContrastAssembly + +/-! +# Scalar reductions for Proposition `p.small.contrast.algebraic.decay` + +This file extracts the manuscript scalar recursion ingredients from the +Section 5.6 assembly estimate. In particular, the additivity defect for the +special vectors at scale `m` is controlled by the drop of `Theta` from `k` to +`m`. +-/ + +/-- If `\widetilde\Theta_0 - 1` is at most a parameter not exceeding one, then +`\widetilde\Theta_0 ≤ 2`. -/ +theorem widetildeThetaAtScale_zero_le_two_of_sub_one_le_delta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {hP4 : QuantitativeCoarseGrainedEllipticity P} {delta : ℝ} + (hdelta_le_one : delta ≤ 1) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 - 1 ≤ delta) : + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 := by + linarith + +/-- Smallness at scale zero propagates to all scalar contrasts. -/ +theorem thetaAtScale_sub_one_le_delta_of_widetildeThetaAtScale_zero_sub_one_le_delta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {delta : ℝ} + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 - 1 ≤ delta) + (m : ℕ) : + thetaAtScale hP hStruct (m : ℤ) - 1 ≤ delta := by + have hmono : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have htheta0 : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := + thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 hP hStruct hP4 + linarith + +/-- A real-variable form of the special-vector `tau` drop. -/ +theorem half_sum_sub_le_product_drop + {r x y : ℝ} (hr : 1 ≤ r) (hx : r ≤ x) (hy : r ≤ y) : + (1 / 2 : ℝ) * (x - r) + (1 / 2 : ℝ) * (y - r) ≤ + x * y - r ^ (2 : ℕ) := by + have hx_nonneg : 0 ≤ x - r := by linarith + have hy_nonneg : 0 ≤ y - r := by linarith + have hprod_nonneg : 0 ≤ (x - r) * (y - r) := + mul_nonneg hx_nonneg hy_nonneg + nlinarith + +/-- The special-vector additivity defect is controlled by the scalar contrast +drop between scales `k` and `m`. -/ +theorem tauAtScale_special_le_thetaAtScale_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e ≤ + thetaAtScale hP hStruct (k : ℤ) - + thetaAtScale hP hStruct (m : ℤ) := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + let b_m := hP.barSigmaAtScale hStruct (m : ℤ) + let c_m := hP.barSigmaStarAtScale hStruct (m : ℤ) + let b_k := hP.barSigmaAtScale hStruct (k : ℤ) + let c_k := hP.barSigmaStarAtScale hStruct (k : ℤ) + let θm := thetaAtScale hP hStruct (m : ℤ) + let θk := thetaAtScale hP hStruct (k : ℤ) + let r := Real.sqrt θm + let x := σ⁻¹ * b_k + let y := σ * c_k⁻¹ + have hb_m : 0 < b_m := by + simpa [b_m] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc_m : 0 < c_m := by + simpa [c_m] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hb_k : 0 < b_k := by + simpa [b_k] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 k + have hc_k : 0 < c_k := by + simpa [c_k] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 k + have hσ_pos : 0 < σ := by + simpa [σ] using + Section54.GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hchain := + Section54.Pigeonhole.scalarChain_of_P4 hP hStruct hP4 hkm + have hb_m_le_k : b_m ≤ b_k := by + simpa [b_m, b_k] using hchain.2.2 + have hc_inv_m_le_k : c_m⁻¹ ≤ c_k⁻¹ := by + simpa [c_m, c_k] using hchain.2.1 + have hσ_eq : σ = Real.sqrt (b_m * c_m) := by rfl + have hθm_eq : θm = b_m * c_m⁻¹ := by rfl + have hθk_eq : θk = b_k * c_k⁻¹ := by rfl + have hbm_scaled : σ⁻¹ * b_m = r := by + rw [mul_comm] + simpa [r, θm, b_m, c_m, σ] using + Section54.GoodScale.barSigma_mul_inv_sigma_eq_sqrt_theta + hb_m hc_m hσ_eq hθm_eq + have hcm_scaled : σ * c_m⁻¹ = r := by + simpa [r, θm, b_m, c_m, σ] using + Section54.GoodScale.sigma_mul_inv_star_eq_sqrt_theta + hb_m hc_m hσ_eq hθm_eq + have hr_one : 1 ≤ r := by + have hθm_one : 1 ≤ θm := by + simpa [θm] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + simpa [r] using Real.one_le_sqrt.mpr hθm_one + have hx_ge : r ≤ x := by + calc + r = σ⁻¹ * b_m := hbm_scaled.symm + _ ≤ σ⁻¹ * b_k := + mul_le_mul_of_nonneg_left hb_m_le_k (inv_pos.mpr hσ_pos).le + _ = x := rfl + have hy_ge : r ≤ y := by + calc + r = σ * c_m⁻¹ := hcm_scaled.symm + _ ≤ σ * c_k⁻¹ := + mul_le_mul_of_nonneg_left hc_inv_m_le_k hσ_pos.le + _ = y := rfl + have htau_formula : + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e = + (1 / 2 : ℝ) * σ⁻¹ * (b_k - b_m) + + (1 / 2 : ℝ) * σ * (c_k⁻¹ - c_m⁻¹) := by + have hBlock_m : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlock_k : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + calc + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e = + tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) p_e q_e := by + rw [Section52.tauAtScale_eq_tauScalarFormula + hP hStruct (m : ℤ) (k : ℤ) p_e q_e hBlock_m hBlock_k] + _ = (1 / 2 : ℝ) * σ⁻¹ * (b_k - b_m) + + (1 / 2 : ℝ) * σ * (c_k⁻¹ - c_m⁻¹) := by + simpa [p_e, q_e, σ, b_k, b_m, c_k, c_m] using + Section54.GoodScale.tauScalarFormula_special_eq_of_P4 + hP hStruct hP4 m k e he + have hleft_eq : + (1 / 2 : ℝ) * σ⁻¹ * (b_k - b_m) + + (1 / 2 : ℝ) * σ * (c_k⁻¹ - c_m⁻¹) = + (1 / 2 : ℝ) * (x - r) + (1 / 2 : ℝ) * (y - r) := by + have hx_sub : x - r = σ⁻¹ * (b_k - b_m) := by + rw [← hbm_scaled] + ring + have hy_sub : y - r = σ * (c_k⁻¹ - c_m⁻¹) := by + rw [← hcm_scaled] + ring + rw [hx_sub, hy_sub] + ring + have hprod_eq : x * y - r ^ (2 : ℕ) = θk - θm := by + have hr_sq : r ^ (2 : ℕ) = θm := by + have hθm_nonneg : 0 ≤ θm := by + have hθm_one : 1 ≤ θm := by + simpa [θm] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith + simp [r, Real.sq_sqrt hθm_nonneg] + have hx_y : x * y = θk := by + have hσ_ne : σ ≠ 0 := ne_of_gt hσ_pos + calc + x * y = (σ⁻¹ * b_k) * (σ * c_k⁻¹) := rfl + _ = b_k * c_k⁻¹ := by field_simp [hσ_ne] + _ = θk := hθk_eq.symm + rw [hx_y, hr_sq] + calc + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + = (1 / 2 : ℝ) * (x - r) + (1 / 2 : ℝ) * (y - r) := by + rw [htau_formula, hleft_eq] + _ ≤ x * y - r ^ (2 : ℕ) := + half_sum_sub_le_product_drop hr_one hx_ge hy_ge + _ = θk - θm := hprod_eq + +end SmallContrastAlgebraicDecay + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly.lean new file mode 100644 index 0000000000..0be6992773 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageGeometric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceBudgetAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.WeightedGeometricSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FluctuationSumEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FinalAssembly + +/-! # Small Contrast Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +/-! +# Section 5.6: packaging for the small-contrast assembly lemma + +This module re-exports the auxiliary estimates used to assemble +Lemma `l.small.contrast.assembly`. +-/ + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FinalAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FinalAssembly.lean new file mode 100644 index 0000000000..d41b220a49 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FinalAssembly.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.WeightedGeometricSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.FluctuationSumEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound + +/-! # Final Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section53.JUpperBoundCoarseFluctuations +open Section54.VarianceBoundGoodScale + +/-! +# Final constant selection for Lemma `l.small.contrast.assembly` + +This file owns the final real-algebra assembly of the Section 5.6 +small-contrast iteration. The analytic fluctuation-sum estimate is kept as a +separate input to the pure algebra lemma so the final theorem can quantify the +constant before the law. +-/ + +/-- The right side in Lemma `l.small.contrast.assembly`. -/ +noncomputable def smallContrastAssemblyRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C : ℝ) (ell k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + C * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + + C * Real.rpow (3 : ℝ) (-β * (m : ℝ)) + + C * Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + C * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) + +/-- Pure real algebra for the last assembly step. -/ +theorem smallContrastAssembly_real_bound + {J F tau tail geom thetaM thetaEll CJ C Ktau Kgeom Ktheta : ℝ} + (hJ : + J ≤ CJ * F + CJ * tau + CJ * tail + CJ * thetaM) + (hF : + F ≤ Ktau * tau + Kgeom * geom + Ktheta * thetaEll) + (hCJ_nonneg : 0 ≤ CJ) + (htau_nonneg : 0 ≤ tau) (htail_nonneg : 0 ≤ tail) + (hgeom_nonneg : 0 ≤ geom) (hthetaEll_nonneg : 0 ≤ thetaEll) + (hthetaM_le : thetaM ≤ thetaEll) + (hC_tau : CJ * Ktau + CJ ≤ C) + (hC_tail : CJ ≤ C) + (hC_geom : CJ * Kgeom ≤ C) + (hC_theta : CJ * Ktheta + CJ ≤ C) : + J ≤ C * tau + C * tail + C * geom + C * thetaEll := by + have hF_term : + CJ * F ≤ CJ * (Ktau * tau + Kgeom * geom + Ktheta * thetaEll) := + mul_le_mul_of_nonneg_left hF hCJ_nonneg + have htau_term : (CJ * Ktau + CJ) * tau ≤ C * tau := + mul_le_mul_of_nonneg_right hC_tau htau_nonneg + have htail_term : CJ * tail ≤ C * tail := + mul_le_mul_of_nonneg_right hC_tail htail_nonneg + have hgeom_term : (CJ * Kgeom) * geom ≤ C * geom := + mul_le_mul_of_nonneg_right hC_geom hgeom_nonneg + have htheta_term : (CJ * Ktheta + CJ) * thetaEll ≤ C * thetaEll := + mul_le_mul_of_nonneg_right hC_theta hthetaEll_nonneg + nlinarith + +theorem thetaAtScale_sub_one_sq_mono_of_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {ell m : ℕ} (hellm : ell ≤ m) : + (thetaAtScale hP hStruct (m : ℤ) - 1) ^ (2 : ℕ) ≤ + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + have hmono : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (ell : ℤ) := by + simpa using + Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := ell) (m := m) hellm + have hm_one : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) := + one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hell_one : + 1 ≤ thetaAtScale hP hStruct (ell : ℤ) := + one_le_thetaAtScale_of_P4 hP hStruct hP4 ell + have hsub_nonneg : 0 ≤ thetaAtScale hP hStruct (m : ℤ) - 1 := by linarith + have hsub_le : + thetaAtScale hP hStruct (m : ℤ) - 1 ≤ + thetaAtScale hP hStruct (ell : ℤ) - 1 := by + linarith + exact pow_le_pow_left₀ hsub_nonneg hsub_le 2 + +/-- Nonnegativity of the special-direction additivity defect. -/ +theorem tauAtScale_special_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + 0 ≤ tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm_int hR hBlockK + simpa [p_e, q_e] using + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm_int p_e q_e hBlockM hDescBlock + +/-- Final constant selection, assuming a parameter-uniform estimate on the +coarse fluctuation sum. The produced constant is chosen before the law. -/ +theorem smallContrastAssembly_homogenizationScale_of_fluctuation_bound + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) + (Ktau Kgeom Ktheta : ℝ) + (hFluct : + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ell k m : ℕ}, ell < k → k < m → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m ≤ + Ktau * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + + Kgeom * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + Ktheta * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ)) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ell k m : ℕ}, ell < k → k < m → C ≤ ((m - k : ℕ) : ℝ) → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + smallContrastAssemblyRHSAtScale hP hStruct hP4 C ell k m e := by + rcases smallContrastJBound_homogenizationScale params with + ⟨CJ, hCJ_pos, hJbound⟩ + let C : ℝ := + max 1 + (max CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))) + have hC_ge_one : 1 ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hC_pos : 0 < C := lt_of_lt_of_le zero_lt_one hC_ge_one + have hCJ_nonneg : 0 ≤ CJ := hCJ_pos.le + have hC_ge_CJ : CJ ≤ C := by + dsimp [C] + exact + (le_max_left CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))).trans + (le_max_right 1 + (max CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))))) + have hC_tau : CJ * Ktau + CJ ≤ C := by + dsimp [C] + exact + (le_max_left (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))).trans + ((le_max_right CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))).trans + (le_max_right 1 + (max CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))))) + have hC_geom : CJ * Kgeom ≤ C := by + dsimp [C] + exact + (le_max_left (CJ * Kgeom) (CJ * Ktheta + CJ)).trans + ((le_max_right (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))).trans + ((le_max_right CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))).trans + (le_max_right 1 + (max CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))))))) + have hC_theta : CJ * Ktheta + CJ ≤ C := by + dsimp [C] + exact + (le_max_right (CJ * Kgeom) (CJ * Ktheta + CJ)).trans + ((le_max_right (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))).trans + ((le_max_right CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ)))).trans + (le_max_right 1 + (max CJ + (max (CJ * Ktau + CJ) + (max (CJ * Kgeom) (CJ * Ktheta + CJ))))))) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hstat hStruct hP4 hparams hsmall e he ell k m hellk hkm hgap + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let J := Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e + let F := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let tau := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + let tail := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let geom := Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + let thetaM := (thetaAtScale hP hStruct (m : ℤ) - 1) ^ (2 : ℕ) + let thetaEll := (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) + have hCJ_gap : CJ ≤ ((m - k : ℕ) : ℝ) := hC_ge_CJ.trans hgap + have hJraw : + J ≤ CJ * F + CJ * tau + CJ * tail + CJ * thetaM := by + have h := hJbound hP hstat hStruct hP4 hparams hsmall e he + (k := k) (m := m) hCJ_gap + simpa [J, F, tau, tail, thetaM, p_e, q_e, β, + smallContrastFinalRHSAtScale] using h + have hFraw : + F ≤ Ktau * tau + Kgeom * geom + Ktheta * thetaEll := by + have h := hFluct hP hstat hStruct hP4 hparams hsmall e he hellk hkm + simpa [F, tau, geom, thetaEll, p_e, q_e] using h + have hkm_le : k ≤ m := hkm.le + have hellm : ell ≤ m := by omega + have htau_nonneg : 0 ≤ tau := by + simpa [tau, p_e, q_e] using + tauAtScale_special_nonneg hP hstat hStruct hP4 hkm_le e + have htail_nonneg : 0 ≤ tail := by + dsimp [tail] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom_nonneg : 0 ≤ geom := by + dsimp [geom] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hthetaEll_nonneg : 0 ≤ thetaEll := by + dsimp [thetaEll] + exact sq_nonneg _ + have hthetaM_le : thetaM ≤ thetaEll := by + simpa [thetaM, thetaEll] using + thetaAtScale_sub_one_sq_mono_of_le hP hStruct hP4 hellm + have hreal := + smallContrastAssembly_real_bound hJraw hFraw hCJ_nonneg + htau_nonneg htail_nonneg hgeom_nonneg hthetaEll_nonneg + hthetaM_le hC_tau hC_ge_CJ hC_geom hC_theta + simpa [smallContrastAssemblyRHSAtScale, J, tau, tail, geom, thetaEll, p_e, q_e, β] + using hreal + +/-- Lemma `l.small.contrast.assembly`, with the constant chosen before the +law. -/ +theorem smallContrastAssembly_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ell k m : ℕ}, ell < k → k < m → C ≤ ((m - k : ℕ) : ℝ) → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + smallContrastAssemblyRHSAtScale hP hStruct hP4 C ell k m e := by + rcases coarseFluctuationFullBlockSumAtScale_le_assembly_fluctuation_bound + params with + ⟨Ktau, Kgeom, Ktheta, hFluct⟩ + rcases smallContrastAssembly_homogenizationScale_of_fluctuation_bound + params Ktau Kgeom Ktheta hFluct with + ⟨C, hC_pos, hC⟩ + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams hsmall e he ell k m hellk hkm hgap + exact + hC hP hStruct.stationary hStruct hP4 hparams hsmall e he hellk hkm hgap + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FluctuationSumEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FluctuationSumEstimate.lean new file mode 100644 index 0000000000..00face1d2d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/FluctuationSumEstimate.lean @@ -0,0 +1,932 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.WeightedGeometricSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.NormalizedStatements + +/-! # Fluctuation Sum Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section53.JUpperBoundCoarseFluctuations +open Section54.VarianceBoundGoodScale + +/-! +# The unconditional fluctuation-sum estimate for Section 5.6 + +This file proves the analytic estimate which feeds the final constant +selection in `FinalAssembly.lean`: the `m`-centered full-block fluctuation sum +is bounded by the bottom-scale geometric decay and the square of the +small-contrast excess at scale `ell`. +-/ + +/-- Parameter-only version of the trace-`J` geometric constant. -/ +noncomputable def normalizedTraceJAverageGeometricConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 8 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + normalizedMatrixAverageGeometricConstParams params + +@[simp] +theorem normalizedTraceJAverageGeometricConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + normalizedTraceJAverageGeometricConstParams hP4.params = + normalizedTraceJAverageGeometricConst hP4 := rfl + +theorem normalizedMatrixAverageGeometricConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ normalizedMatrixAverageGeometricConst hP4 := by + unfold normalizedMatrixAverageGeometricConst + have hcard : 0 ≤ (Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ) := + pow_nonneg (Nat.cast_nonneg _) _ + exact mul_nonneg + (mul_nonneg hcard (by norm_num)) + (normalizedQuadraticProbeAverageUniformRootSqConst_nonneg hP4) + +theorem normalizedTraceJAverageGeometricConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ normalizedTraceJAverageGeometricConst hP4 := by + unfold normalizedTraceJAverageGeometricConst + nlinarith [sq_nonneg (Fintype.card (BlockCoord d) : ℝ), + normalizedMatrixAverageGeometricConst_nonneg hP4] + +theorem normalizedTraceJAverageThetaConst_nonneg (d : ℕ) : + 0 ≤ normalizedTraceJAverageThetaConst d := by + unfold normalizedTraceJAverageThetaConst + nlinarith [sq_nonneg (Fintype.card (BlockCoord d) : ℝ)] + +private theorem fullBlock_diagonal_conj_operatorNormSq_le_sixteen + {d : ℕ} (r : BlockCoord d → ℝ) (M : FullBlockMat d) + (hr : ∀ α, |r α| ≤ (2 : ℝ)) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal r * M * Matrix.diagonal r)‖ ^ (2 : ℕ) ≤ + 16 * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ + (2 : ℕ) := by + let D : FullBlockMat d := Matrix.diagonal r + let LM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M + let LD := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) D + have hD_norm_le : ‖LD‖ ≤ (2 : ℝ) := by + have hrnorm : ‖r‖ ≤ (2 : ℝ) := by + refine (pi_norm_le_iff_of_nonneg (by norm_num : (0 : ℝ) ≤ 2)).mpr ?_ + intro α + simpa [Real.norm_eq_abs] using hr α + calc + ‖LD‖ = ‖(Matrix.diagonal r : FullBlockMat d)‖ := rfl + _ = ‖r‖ := Matrix.l2_opNorm_diagonal r + _ ≤ (2 : ℝ) := hrnorm + have hnorm : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal r * M * Matrix.diagonal r)‖ ≤ + (2 : ℝ) * ‖LM‖ * (2 : ℝ) := by + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal r * M * Matrix.diagonal r)‖ + = ‖LD * LM * LD‖ := by + dsimp [LD, LM, D] + rw [map_mul, map_mul] + _ ≤ ‖LD * LM‖ * ‖LD‖ := norm_mul_le _ _ + _ ≤ (‖LD‖ * ‖LM‖) * ‖LD‖ := by + exact mul_le_mul_of_nonneg_right (norm_mul_le _ _) (norm_nonneg _) + _ ≤ ((2 : ℝ) * ‖LM‖) * 2 := by + exact mul_le_mul + (mul_le_mul_of_nonneg_right hD_norm_le (norm_nonneg _)) + hD_norm_le (norm_nonneg _) (mul_nonneg (by norm_num) (norm_nonneg _)) + _ = (2 : ℝ) * ‖LM‖ * 2 := by ring + have hsq := + pow_le_pow_left₀ (norm_nonneg _) hnorm 2 + nlinarith [sq_nonneg ‖LM‖] + +private theorem diagonal_gap_operatorNormSq_le_thetaSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {ell j m : ℕ} (hellj : ell ≤ j) (hjm : j ≤ m) : + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let Dm : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + let Aell : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (ell : ℤ)) + let Am : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ)) + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Dm * (Aell - Am) * Dm)‖ ^ (2 : ℕ) ≤ + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + classical + dsimp only + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let Dm : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + let Aell : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (ell : ℤ)) + let Am : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ)) + let gapDiag : BlockCoord d → ℝ := fun α => + match α with + | Sum.inl _ => bell * bm⁻¹ - 1 + | Sum.inr _ => cm * cell⁻¹ - 1 + have hbm_pos : 0 < bm := by + simpa [bm] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hbell_pos : 0 < bell := by + simpa [bell] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 ell + have hcell_pos : 0 < cell := by + simpa [cell] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 ell + have hchain_ell_m := + Section54.Pigeonhole.scalarChain_of_P4 hP hStruct hP4 + (n := ell) (m := m) (hellj.trans hjm) + have hcell_le_cm : cell ≤ cm := by simpa [cell, cm] using hchain_ell_m.1 + have hbm_le_bell : bm ≤ bell := by simpa [bm, bell] using hchain_ell_m.2.2 + have hcm_le_bm : cm ≤ bm := by + simpa [bm, cm] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have htheta_two : + thetaAtScale hP hStruct (ell : ℤ) ≤ 2 := + thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + hP hStruct hP4 hsmall ell + have htheta_one : + 1 ≤ thetaAtScale hP hStruct (ell : ℤ) := + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 ell + have hupper_le_theta : + bell * bm⁻¹ ≤ thetaAtScale hP hStruct (ell : ℤ) := by + have hcell_le_bm : cell ≤ bm := hcell_le_cm.trans hcm_le_bm + have hinv : bm⁻¹ ≤ cell⁻¹ := (inv_le_inv₀ hbm_pos hcell_pos).2 hcell_le_bm + calc + bell * bm⁻¹ ≤ bell * cell⁻¹ := + mul_le_mul_of_nonneg_left hinv hbell_pos.le + _ = thetaAtScale hP hStruct (ell : ℤ) := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, bell, cell] + have hlower_le_theta : + cm * cell⁻¹ ≤ thetaAtScale hP hStruct (ell : ℤ) := by + calc + cm * cell⁻¹ ≤ bell * cell⁻¹ := + mul_le_mul_of_nonneg_right (hcm_le_bm.trans hbm_le_bell) + (inv_nonneg.mpr hcell_pos.le) + _ = thetaAtScale hP hStruct (ell : ℤ) := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, bell, cell] + have hupper_one : 1 ≤ bell * bm⁻¹ := by + calc + 1 = bm * bm⁻¹ := by field_simp [hbm_pos.ne'] + _ ≤ bell * bm⁻¹ := + mul_le_mul_of_nonneg_right hbm_le_bell (inv_nonneg.mpr hbm_pos.le) + have hlower_one : 1 ≤ cm * cell⁻¹ := by + calc + 1 = cell * cell⁻¹ := by field_simp [hcell_pos.ne'] + _ ≤ cm * cell⁻¹ := + mul_le_mul_of_nonneg_right hcell_le_cm (inv_nonneg.mpr hcell_pos.le) + have hdiag_bound : ∀ α, |gapDiag α| ≤ thetaAtScale hP hStruct (ell : ℤ) - 1 := by + intro α + cases α with + | inl i => + have hnonneg : 0 ≤ bell * bm⁻¹ - 1 := by linarith + rw [abs_of_nonneg hnonneg] + linarith + | inr i => + have hnonneg : 0 ≤ cm * cell⁻¹ - 1 := by linarith + rw [abs_of_nonneg hnonneg] + linarith + have hmat : + Dm * (Aell - Am) * Dm = Matrix.diagonal gapDiag := by + have hell_diag := + Section54.VarianceBoundGoodScale.normalizedScalarAnnealedBlockMatrix_eq_diagonal + hP hStruct (m : ℤ) (ell : ℤ) + have hm_self := + Section54.VarianceBoundGoodScale.normalizedScalarAnnealedBlockMatrix_self_eq_one + hP hStruct hP4 m + dsimp only at hell_diag hm_self + change Dm * (Aell - Am) * Dm = Matrix.diagonal gapDiag + have hsplit : Dm * (Aell - Am) * Dm = Dm * Aell * Dm - Dm * Am * Dm := by + noncomm_ring + rw [hsplit] + have hAm : Dm * Am * Dm = 1 := by + simpa [Dm, Am, bm, cm] using hm_self + have hAell : + Dm * Aell * Dm = + Matrix.diagonal (fun α : BlockCoord d => + match α with + | Sum.inl _ => (Real.sqrt bm)⁻¹ * bell * (Real.sqrt bm)⁻¹ + | Sum.inr _ => Real.sqrt cm * cell⁻¹ * Real.sqrt cm) := by + simpa [Dm, Aell, bm, cm, bell, cell] using! hell_diag + rw [hAell, hAm] + ext α β + by_cases hαβ : α = β + · subst β + cases α with + | inl i => + simp [Matrix.diagonal, gapDiag] + field_simp [hbm_pos.ne', (Real.sqrt_pos.mpr hbm_pos).ne'] + rw [Real.sq_sqrt hbm_pos.le] + | inr i => + simp [Matrix.diagonal, gapDiag] + field_simp [hcell_pos.ne', hcm_pos.ne', (Real.sqrt_pos.mpr hcm_pos).ne'] + rw [Real.sq_sqrt hcm_pos.le] + · simp [Matrix.diagonal, hαβ] + have hnorm_le : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Dm * (Aell - Am) * Dm)‖ ≤ + thetaAtScale hP hStruct (ell : ℤ) - 1 := by + rw [hmat] + have hdiag_norm : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal gapDiag : FullBlockMat d)‖ = ‖gapDiag‖ := by + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.diagonal gapDiag : FullBlockMat d)‖ = + ‖(Matrix.diagonal gapDiag : FullBlockMat d)‖ := rfl + _ = ‖gapDiag‖ := Matrix.l2_opNorm_diagonal gapDiag + rw [hdiag_norm] + exact (pi_norm_le_iff_of_nonneg (by linarith)).mpr + (fun α => by simpa [Real.norm_eq_abs] using hdiag_bound α) + exact pow_le_pow_left₀ (norm_nonneg _) hnorm_le 2 + +private theorem normalizer_ratio_abs_le_two + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {ell m : ℕ} (hellm : ell ≤ m) : + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let r : BlockCoord d → ℝ := fun α => + match α with + | Sum.inl _ => Real.sqrt bell * (Real.sqrt bm)⁻¹ + | Sum.inr _ => Real.sqrt cm * (Real.sqrt cell)⁻¹ + ∀ α, |r α| ≤ (2 : ℝ) := by + dsimp only + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let θell := thetaAtScale hP hStruct (ell : ℤ) + have hbm_pos : 0 < bm := by + simpa [bm] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hbell_pos : 0 < bell := by + simpa [bell] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 ell + have hcell_pos : 0 < cell := by + simpa [cell] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 ell + have hchain_ell_m := + Section54.Pigeonhole.scalarChain_of_P4 hP hStruct hP4 + (n := ell) (m := m) hellm + have hcell_le_cm : cell ≤ cm := by simpa [cell, cm] using hchain_ell_m.1 + have hbm_le_bell : bm ≤ bell := by simpa [bm, bell] using hchain_ell_m.2.2 + have hcm_le_bm : cm ≤ bm := by + simpa [bm, cm] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have htheta_two : θell ≤ 2 := by + simpa [θell] using + thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + hP hStruct hP4 hsmall ell + have hupper_ratio : + bell * bm⁻¹ ≤ θell := by + have hcell_le_bm : cell ≤ bm := hcell_le_cm.trans hcm_le_bm + have hinv : bm⁻¹ ≤ cell⁻¹ := (inv_le_inv₀ hbm_pos hcell_pos).2 hcell_le_bm + calc + bell * bm⁻¹ ≤ bell * cell⁻¹ := + mul_le_mul_of_nonneg_left hinv hbell_pos.le + _ = θell := by + simp [θell, Ch04.RestrictionLawCarrier.thetaAtScale, bell, cell] + have hlower_ratio : + cm * cell⁻¹ ≤ θell := by + calc + cm * cell⁻¹ ≤ bell * cell⁻¹ := + mul_le_mul_of_nonneg_right (hcm_le_bm.trans hbm_le_bell) + (inv_nonneg.mpr hcell_pos.le) + _ = θell := by + simp [θell, Ch04.RestrictionLawCarrier.thetaAtScale, bell, cell] + intro α + cases α with + | inl i => + let x : ℝ := Real.sqrt bell * (Real.sqrt bm)⁻¹ + have hx_nonneg : 0 ≤ x := by + dsimp [x] + exact mul_nonneg (Real.sqrt_nonneg _) (inv_nonneg.mpr (Real.sqrt_nonneg _)) + have hx_sq : x ^ (2 : ℕ) = bell * bm⁻¹ := by + dsimp [x] + field_simp [(Real.sqrt_pos.mpr hbm_pos).ne'] + rw [Real.sq_sqrt hbell_pos.le, Real.sq_sqrt hbm_pos.le] + ring + have hx_sq_le_four : x ^ (2 : ℕ) ≤ (2 : ℝ) ^ (2 : ℕ) := by + rw [hx_sq] + calc + bell * bm⁻¹ ≤ θell := hupper_ratio + _ ≤ (2 : ℝ) := htheta_two + _ ≤ (2 : ℝ) ^ (2 : ℕ) := by norm_num + have hx_le_two : x ≤ (2 : ℝ) := + (sq_le_sq₀ hx_nonneg (by norm_num : (0 : ℝ) ≤ 2)).1 hx_sq_le_four + have habs : |Real.sqrt bell * (Real.sqrt bm)⁻¹| ≤ (2 : ℝ) := by + rw [abs_of_nonneg hx_nonneg] + exact hx_le_two + simpa [bm, bell, x] using habs + | inr i => + let x : ℝ := Real.sqrt cm * (Real.sqrt cell)⁻¹ + have hx_nonneg : 0 ≤ x := by + dsimp [x] + exact mul_nonneg (Real.sqrt_nonneg _) (inv_nonneg.mpr (Real.sqrt_nonneg _)) + have hx_sq : x ^ (2 : ℕ) = cm * cell⁻¹ := by + dsimp [x] + field_simp [(Real.sqrt_pos.mpr hcell_pos).ne'] + rw [Real.sq_sqrt hcm_pos.le, Real.sq_sqrt hcell_pos.le] + ring + have hx_sq_le_four : x ^ (2 : ℕ) ≤ (2 : ℝ) ^ (2 : ℕ) := by + rw [hx_sq] + calc + cm * cell⁻¹ ≤ θell := hlower_ratio + _ ≤ (2 : ℝ) := htheta_two + _ ≤ (2 : ℝ) ^ (2 : ℕ) := by norm_num + have hx_le_two : x ≤ (2 : ℝ) := + (sq_le_sq₀ hx_nonneg (by norm_num : (0 : ℝ) ≤ 2)).1 hx_sq_le_four + have habs : |Real.sqrt cm * (Real.sqrt cell)⁻¹| ≤ (2 : ℝ) := by + rw [abs_of_nonneg hx_nonneg] + exact hx_le_two + simpa [cm, cell, x] using habs + +private theorem normalizer_change_operatorNormSq_le_sixteen + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {ell m : ℕ} (hellm : ell ≤ m) (M : FullBlockMat d) : + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let Dm : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + let Dell : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bell cell) + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (Dm * M * Dm)‖ ^ + (2 : ℕ) ≤ + 16 * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Dell * M * Dell)‖ ^ (2 : ℕ) := by + classical + dsimp only + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let Dm : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + let Dell : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bell cell) + let r : BlockCoord d → ℝ := fun α => + match α with + | Sum.inl _ => Real.sqrt bell * (Real.sqrt bm)⁻¹ + | Sum.inr _ => Real.sqrt cm * (Real.sqrt cell)⁻¹ + let R : FullBlockMat d := Matrix.diagonal r + have hbm_pos : 0 < bm := by + simpa [bm] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hbell_pos : 0 < bell := by + simpa [bell] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 ell + have hcell_pos : 0 < cell := by + simpa [cell] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 ell + have hdiag_left : + (fun α : BlockCoord d => + r α * Ch04.scalarFullBlockInvSqrtDiag bell cell α) = + Ch04.scalarFullBlockInvSqrtDiag bm cm := by + funext α + cases α with + | inl i => + simp [r, Ch04.scalarFullBlockInvSqrtDiag] + field_simp [(Real.sqrt_pos.mpr hbell_pos).ne', + (Real.sqrt_pos.mpr hbm_pos).ne'] + | inr i => + simp [r, Ch04.scalarFullBlockInvSqrtDiag] + field_simp [(Real.sqrt_pos.mpr hcell_pos).ne'] + have hdiag_right : + (fun α : BlockCoord d => + Ch04.scalarFullBlockInvSqrtDiag bell cell α * r α) = + Ch04.scalarFullBlockInvSqrtDiag bm cm := by + funext α + rw [mul_comm] + exact congr_fun hdiag_left α + have hDm_left : Dm = R * Dell := by + dsimp [Dm, R, Dell] + rw [Matrix.diagonal_mul_diagonal, hdiag_left] + have hDm_right : Dm = Dell * R := by + dsimp [Dm, R, Dell] + rw [Matrix.diagonal_mul_diagonal, hdiag_right] + have hrewrite : + Dm * M * Dm = R * (Dell * M * Dell) * R := by + calc + Dm * M * Dm = (R * Dell) * M * (Dell * R) := by + nth_rewrite 1 [hDm_left] + nth_rewrite 1 [hDm_right] + rfl + _ = R * (Dell * M * Dell) * R := by + noncomm_ring + rw [hrewrite] + exact fullBlock_diagonal_conj_operatorNormSq_le_sixteen + r (Dell * M * Dell) + (by + simpa [r, bm, cm, bell, cell] using + normalizer_ratio_abs_le_two hP hStruct hP4 hsmall hellm) + +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_center_ell + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {ell m : ℕ} (hellm : ell ≤ m) (Q : TriadicCube d) (a : RegCoeffField d) : + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ≤ + 32 * + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a + + 2 * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bell := hP.barSigmaAtScale hStruct (ell : ℤ) + let cell := hP.barSigmaStarAtScale hStruct (ell : ℤ) + let Dm : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bm cm) + let Dell : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag bell cell) + let A : FullBlockMat d := toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) + let Aell : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (ell : ℤ)) + let Am : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (m : ℤ)) + let X : FullBlockMat d := Dm * (A - Am) * Dm + let Y : FullBlockMat d := Dm * (A - Aell) * Dm + let Z : FullBlockMat d := Dm * (Aell - Am) * Dm + let LX := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) X + let LY := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) Y + let LZ := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) Z + have hX : X = Y + Z := by + dsimp [X, Y, Z] + noncomm_ring + have hLX : LX = LY + LZ := by + dsimp [LX, LY, LZ] + rw [hX, map_add] + have htriangle : + ‖LX‖ ^ (2 : ℕ) ≤ + 2 * ‖LY‖ ^ (2 : ℕ) + 2 * ‖LZ‖ ^ (2 : ℕ) := by + rw [hLX] + exact norm_add_sq_le_two_sq_add_two_sq LY LZ + have hY : + ‖LY‖ ^ (2 : ℕ) ≤ + 16 * + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a := by + have hcomp := + normalizer_change_operatorNormSq_le_sixteen + hP hStruct hP4 hsmall hellm (A - Aell) + simpa [LY, Y, Dell, bell, cell, Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Ch04.fullBlockNormalizedFluctuationOperatorNormSq, A, Aell] + using hcomp + have hZ : + ‖LZ‖ ^ (2 : ℕ) ≤ + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + have hgap := + diagonal_gap_operatorNormSq_le_thetaSq + hP hStruct hP4 hsmall (ell := ell) (j := ell) (m := m) + le_rfl hellm + simpa [LZ, Z, Dm, bm, cm, Aell, Am] using hgap + have hmain : + ‖LX‖ ^ (2 : ℕ) ≤ + 32 * + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a + + 2 * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + calc + ‖LX‖ ^ (2 : ℕ) ≤ 2 * ‖LY‖ ^ (2 : ℕ) + 2 * ‖LZ‖ ^ (2 : ℕ) := + htriangle + _ ≤ + 2 * + (16 * + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a) + + 2 * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hY (by norm_num : (0 : ℝ) ≤ 2)) + (mul_le_mul_of_nonneg_left hZ (by norm_num : (0 : ℝ) ≤ 2)) + _ = + 32 * + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a + + 2 * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + ring + simpa [LX, X, Dm, bm, cm, A, Am, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Ch04.fullBlockNormalizedFluctuationOperatorNormSq] using hmain + +/-- The geometric coefficient in the one-scale fluctuation estimate. -/ +noncomputable def fluctuationOneScaleGeometricConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 32 * (2 * normalizedMatrixAverageGeometricConst hP4 + + 8 * normalizedTraceJAverageGeometricConst hP4) + +/-- The contrast-square coefficient in the one-scale fluctuation estimate. -/ +noncomputable def fluctuationOneScaleThetaConst (d : ℕ) : ℝ := + 32 * (8 * normalizedTraceJAverageThetaConst d) + 2 + +theorem fluctuationOneScaleGeometricConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ fluctuationOneScaleGeometricConst hP4 := by + unfold fluctuationOneScaleGeometricConst + nlinarith [normalizedMatrixAverageGeometricConst_nonneg hP4, + normalizedTraceJAverageGeometricConst_nonneg hP4] + +theorem fluctuationOneScaleThetaConst_nonneg (d : ℕ) : + 0 ≤ fluctuationOneScaleThetaConst d := by + unfold fluctuationOneScaleThetaConst + nlinarith [normalizedTraceJAverageThetaConst_nonneg d] + +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_geometric_add_theta + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {ell j m : ℕ} (hellj : ell ≤ j) (hjm : j ≤ m) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P ≤ + fluctuationOneScaleGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + fluctuationOneScaleThetaConst d * + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (j : ℤ) + let Fm : RegCoeffField d → ℝ := + fun a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a + let Fell : RegCoeffField d → ℝ := + fun a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (ell : ℤ) Q a + let thetaSq : ℝ := (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) + let geom : ℝ := + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + have hellm : ell ≤ m := hellj.trans hjm + have hFellInt : Integrable Fell P := by + simpa [Fell, Q] using + Section54.VarianceBoundGoodScale.integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + hP hStruct hP4 (ell : ℤ) j + have hRhsInt : + Integrable (fun a : RegCoeffField d => 32 * Fell a + 2 * thetaSq) P := + (hFellInt.const_mul (32 : ℝ)).add (integrable_const (2 * thetaSq)) + have hpoint : + Fm ≤ᵐ[P] fun a : RegCoeffField d => 32 * Fell a + 2 * thetaSq := by + filter_upwards with a + simpa [Fm, Fell, Q, thetaSq] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_center_ell + hP hStruct hP4 hsmall hellm Q a + have hmono : + ∫ a, Fm a ∂P ≤ ∫ a, 32 * Fell a + 2 * thetaSq ∂P := by + refine integral_mono_of_nonneg ?_ hRhsInt hpoint + filter_upwards with a + exact + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) Q a + have hcenter_eval : + ∫ a, 32 * Fell a + 2 * thetaSq ∂P = + 32 * ∫ a, Fell a ∂P + 2 * thetaSq := by + rw [integral_add (hFellInt.const_mul (32 : ℝ)) + (integrable_const (2 * thetaSq))] + rw [integral_const_mul] + rw [integral_const] + simp [Measure.real, IsProbabilityMeasure.measure_univ] + have hvar : + ∫ a, Fell a ∂P ≤ + 2 * + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (ell : ℤ) (originCube d (j : ℤ)) (j - ell) a ∂P + + 8 * + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (ell : ℤ) + (originCube d (j : ℤ)) (j - ell) a ∂P := by + simpa [Fell, Q] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_two_descendantsAverageNormalized_add_eight_JTraceAverageSq + hP hStruct hP4 ell j ell hellj + have hdesc : + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (ell : ℤ) (originCube d (j : ℤ)) (j - ell) a ∂P ≤ + normalizedMatrixAverageGeometricConst hP4 * geom := by + simpa [geom] using + descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_geometric_of_smallContrast + hP hStruct hP4 hsmall hellj + have htrace : + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (ell : ℤ) + (originCube d (j : ℤ)) (j - ell) a ∂P ≤ + normalizedTraceJAverageGeometricConst hP4 * geom + + normalizedTraceJAverageThetaConst d * thetaSq := by + simpa [geom, thetaSq] using + normalizedBlockJTraceAverageSq_integral_le_geometric_add_thetaSq_of_smallContrast + hP hStruct hP4 hsmall hellj + have hFell_bound : + ∫ a, Fell a ∂P ≤ + (2 * normalizedMatrixAverageGeometricConst hP4 + + 8 * normalizedTraceJAverageGeometricConst hP4) * geom + + 8 * normalizedTraceJAverageThetaConst d * thetaSq := by + calc + ∫ a, Fell a ∂P ≤ + 2 * + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (ell : ℤ) (originCube d (j : ℤ)) (j - ell) a ∂P + + 8 * + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (ell : ℤ) + (originCube d (j : ℤ)) (j - ell) a ∂P := hvar + _ ≤ + 2 * (normalizedMatrixAverageGeometricConst hP4 * geom) + + 8 * + (normalizedTraceJAverageGeometricConst hP4 * geom + + normalizedTraceJAverageThetaConst d * thetaSq) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hdesc (by norm_num : (0 : ℝ) ≤ 2)) + (mul_le_mul_of_nonneg_left htrace (by norm_num : (0 : ℝ) ≤ 8)) + _ = + (2 * normalizedMatrixAverageGeometricConst hP4 + + 8 * normalizedTraceJAverageGeometricConst hP4) * geom + + 8 * normalizedTraceJAverageThetaConst d * thetaSq := by + ring + calc + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P + = ∫ a, Fm a ∂P := by rfl + _ ≤ ∫ a, 32 * Fell a + 2 * thetaSq ∂P := hmono + _ = 32 * ∫ a, Fell a ∂P + 2 * thetaSq := hcenter_eval + _ ≤ + 32 * + ((2 * normalizedMatrixAverageGeometricConst hP4 + + 8 * normalizedTraceJAverageGeometricConst hP4) * geom + + 8 * normalizedTraceJAverageThetaConst d * thetaSq) + + 2 * thetaSq := by + have h32 : 0 ≤ (32 : ℝ) := by norm_num + have hmul := + mul_le_mul_of_nonneg_left hFell_bound h32 + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hmul (2 * thetaSq) + _ = + fluctuationOneScaleGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + fluctuationOneScaleThetaConst d * + (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + simp [fluctuationOneScaleGeometricConst, fluctuationOneScaleThetaConst, + geom, thetaSq] + ring + +/-- Parameter-only version of the one-scale geometric fluctuation constant. -/ +noncomputable def fluctuationOneScaleGeometricConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 32 * (2 * normalizedMatrixAverageGeometricConstParams params + + 8 * normalizedTraceJAverageGeometricConstParams params) + +@[simp] +theorem fluctuationOneScaleGeometricConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + fluctuationOneScaleGeometricConstParams hP4.params = + fluctuationOneScaleGeometricConst hP4 := rfl + +private theorem int_toNat_nat_sub_of_le {j m : ℕ} (hjm : j ≤ m) : + Int.toNat ((m : ℤ) - (j : ℤ)) = m - j := by + have hsub : (m : ℤ) - (j : ℤ) = ((m - j : ℕ) : ℤ) := by + omega + rw [hsub] + simp + +theorem coarseFluctuationFullBlockSumAtScale_eq_nat_Icc + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) : + let β := section53CoarseFluctuationBeta hP4 + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m = + ∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P := by + classical + dsimp only + let β := section53CoarseFluctuationBeta hP4 + unfold coarseFluctuationFullBlockSumAtScale + dsimp only + rw [show ((k : ℤ) + 1) = ((k + 1 : ℕ) : ℤ) by omega] + refine + (Finset.sum_bij + (s := Finset.Icc (k + 1) m) + (t := Finset.Icc (((k + 1 : ℕ) : ℤ)) (m : ℤ)) + (f := fun j => + (varianceWeight β m j * + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P : ℝ)) + (g := fun n => + (Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d n) a ∂P : ℝ)) + (fun j _hj => (j : ℤ)) + ?hmem ?hinj ?hsurj ?hterm).symm + · intro j hj + have hjb := Finset.mem_Icc.mp hj + change (j : ℤ) ∈ Finset.Icc (((k + 1 : ℕ) : ℤ)) (m : ℤ) + exact Finset.mem_Icc.mpr ⟨by exact_mod_cast hjb.1, by exact_mod_cast hjb.2⟩ + · intro a _ha b _hb hab + have hcast : (a : ℤ) = (b : ℤ) := by simpa using hab + exact_mod_cast hcast + · intro n hn + have hn_bounds := Finset.mem_Icc.mp hn + have hn_nonneg : 0 ≤ n := by + have hk_nonneg : (0 : ℤ) ≤ (k + 1 : ℕ) := by exact_mod_cast Nat.zero_le (k + 1) + exact hk_nonneg.trans hn_bounds.1 + refine ⟨Int.toNat n, ?_, ?_⟩ + · have hcast : ((Int.toNat n : ℕ) : ℤ) = n := Int.toNat_of_nonneg hn_nonneg + apply Finset.mem_Icc.mpr + constructor + · have hlow : ((k + 1 : ℕ) : ℤ) ≤ ((Int.toNat n : ℕ) : ℤ) := by + simpa [hcast] using hn_bounds.1 + exact_mod_cast hlow + · have hhi : ((Int.toNat n : ℕ) : ℤ) ≤ (m : ℤ) := by + simpa [hcast] using hn_bounds.2 + exact_mod_cast hhi + · exact Int.toNat_of_nonneg hn_nonneg + · intro j hj + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + simp [β, varianceWeight, int_toNat_nat_sub_of_le hjm] + +/-- The unconditional parameter-uniform estimate for the coarse fluctuation +sum used in the Section 5.6 assembly lemma. -/ +theorem coarseFluctuationFullBlockSumAtScale_le_assembly_fluctuation_bound + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ktau Kgeom Ktheta : ℝ, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {ell k m : ℕ}, ell < k → k < m → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m ≤ + Ktau * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + + Kgeom * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + Ktheta * (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) := by + let Ktau : ℝ := 0 + let Kgeom : ℝ := + fluctuationOneScaleGeometricConstParams params * weightedScaleDecaySumConst d + let Ktheta : ℝ := + weightedBetaSumConstParams params * fluctuationOneScaleThetaConst d + refine ⟨Ktau, Kgeom, Ktheta, ?_⟩ + intro P hP _hstat hStruct hP4 hparams hsmall e _he ell k m hellk hkm + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let A : ℝ := fluctuationOneScaleGeometricConst hP4 + let Bconst : ℝ := fluctuationOneScaleThetaConst d + let thetaSq : ℝ := (thetaAtScale hP hStruct (ell : ℤ) - 1) ^ (2 : ℕ) + let geomBottom : ℝ := + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβeq : + β = section53CoarseFluctuationBetaParams params := by + dsimp [β] + rw [← section53CoarseFluctuationBetaParams_eq_of_P4 hP4, hparams] + have hAeq : A = fluctuationOneScaleGeometricConstParams params := by + dsimp [A] + rw [← fluctuationOneScaleGeometricConstParams_eq_of_P4 hP4, hparams] + have hellk_le : ell ≤ k := hellk.le + have hkm_le : k ≤ m := hkm.le + have hsum_eq := + coarseFluctuationFullBlockSumAtScale_eq_nat_Icc + hP hStruct hP4 k m + have hpoint : + ∀ j, j ∈ Finset.Icc (k + 1) m → + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P ≤ + A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + Bconst * thetaSq := by + intro j hj + have hj_bounds := Finset.mem_Icc.mp hj + have hellj : ell ≤ j := by omega + have hjm : j ≤ m := hj_bounds.2 + simpa [A, Bconst, thetaSq] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_geometric_add_theta + hP hStruct hP4 hsmall hellj hjm + have hsum_le : + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m ≤ + ∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + Bconst * thetaSq) := by + calc + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m = + ∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (j : ℤ)) a ∂P := by + simpa [β] using hsum_eq + _ ≤ + ∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + Bconst * thetaSq) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact mul_le_mul_of_nonneg_left (hpoint j hj) + (varianceWeight_nonneg β m j) + have hA_nonneg : 0 ≤ A := by + simpa [A] using fluctuationOneScaleGeometricConst_nonneg hP4 + have hB_nonneg : 0 ≤ Bconst * thetaSq := by + exact mul_nonneg (by simpa [Bconst] using fluctuationOneScaleThetaConst_nonneg d) + (sq_nonneg _) + have hweighted : + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + + Bconst * thetaSq)) ≤ + A * weightedScaleDecaySumConst d * geomBottom + + weightedBetaSumConst β * (Bconst * thetaSq) := by + simpa [geomBottom] using + sum_Icc_varianceWeight_mul_geometric_add_const_le + (β := β) (A := A) (B := Bconst * thetaSq) + hβ_pos hellk_le hA_nonneg hB_nonneg + have hcombined : + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m ≤ + A * weightedScaleDecaySumConst d * geomBottom + + weightedBetaSumConst β * (Bconst * thetaSq) := + hsum_le.trans hweighted + calc + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m ≤ + A * weightedScaleDecaySumConst d * geomBottom + + weightedBetaSumConst β * (Bconst * thetaSq) := hcombined + _ = + Ktau * + tauAtScale P (m : ℤ) (k : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + + Kgeom * geomBottom + Ktheta * thetaSq := by + simp [Ktau, Kgeom, Ktheta, A, Bconst, thetaSq, geomBottom, + hAeq, hβeq, weightedBetaSumConstParams] + ring + + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageCompression.lean new file mode 100644 index 0000000000..95d3c0318c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageCompression.lean @@ -0,0 +1,774 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Preliminaries + +/-! # Matrix Average Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +private theorem widetildeThetaAtScale_zero_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ widetildeThetaAtScale P 0 hP4 := by + simp [widetildeThetaAtScale, Ch04.widetildeThetaAtScale] + exact mul_nonneg + (Ch04.LambdaMomentAtScale_nonneg P 0 hP4.xi hP4.sUpper_pos) + (Ch04.lambdaInvMomentAtScale_nonneg P 0 hP4.xi hP4.sLower_pos) + +private theorem rosenthalDescendantsAtScaleLpConst_nonneg + (d : ℕ) (k : ℤ) (p : ℕ) : + 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d k p := by + unfold Ch04.rosenthalDescendantsAtScaleLpConst + positivity + +private theorem rosenthalDescendantsAtScaleSqrtConst_nonneg + (d : ℕ) (k : ℤ) (p : ℕ) : + 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d k p := by + unfold Ch04.rosenthalDescendantsAtScaleSqrtConst Ch04.rosenthalBennettIntegralConst + IndependentSums.rosenthalBennettIntegralConst + positivity + +private theorem pairPointwiseBudgetConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ pairPointwiseBudgetConst hP4 := by + have hLp := rosenthalDescendantsAtScaleLpConst_nonneg d 0 hP4.xi + have hSqrt := rosenthalDescendantsAtScaleSqrtConst_nonneg d 0 hP4.xi + unfold pairPointwiseBudgetConst + positivity + +private theorem scaleColorPeriod_natCast_eq_zero (n : ℕ) : + scaleColorPeriod (n : ℤ) = scaleColorPeriod 0 := by + have hle_one : (3 : ℝ) ^ (-(n : ℤ)) ≤ 1 := by + exact zpow_le_one_of_nonpos₀ + (show (1 : ℝ) ≤ 3 by norm_num) + (by exact neg_nonpos.mpr (Int.natCast_nonneg n)) + have hceil : + Nat.ceil ((3 : ℝ) ^ (-(n : ℤ))) = 1 := by + rw [Nat.ceil_eq_iff (by norm_num : (1 : ℕ) ≠ 0)] + constructor + · norm_num + · simpa using hle_one + unfold scaleColorPeriod + rw [hceil] + norm_num + +private theorem rosenthalDescendantsAtScaleLpConst_natCast_eq_zero + (d p n : ℕ) : + Ch04.rosenthalDescendantsAtScaleLpConst d (n : ℤ) p = + Ch04.rosenthalDescendantsAtScaleLpConst d 0 p := by + simp [Ch04.rosenthalDescendantsAtScaleLpConst, scaleColorPeriod_natCast_eq_zero n] + +private theorem rosenthalDescendantsAtScaleSqrtConst_natCast_eq_zero + (d p n : ℕ) : + Ch04.rosenthalDescendantsAtScaleSqrtConst d (n : ℤ) p = + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 p := by + simp [Ch04.rosenthalDescendantsAtScaleSqrtConst, scaleColorPeriod_natCast_eq_zero n] + +private theorem smallContrast_goodScale_upper_delta_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (m : ℕ) : + hP.barSigmaAtScale hStruct 0 ≤ + (1 + (1 : ℝ)) * hP.barSigmaAtScale hStruct (m : ℤ) := by + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hc0_pos : 0 < c0 := by + simpa [c0] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 0 + have hchain := Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have hc0_le_cm : c0 ≤ cm := by simpa [c0, cm] using hchain.1 + have hcm_le_bm : cm ≤ bm := by + simpa [bm, cm] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hθ0_two : b0 * c0⁻¹ ≤ 2 := by + have hθ0 : + thetaAtScale hP hStruct (0 : ℤ) ≤ 2 := + (thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hP4).trans hsmall + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, c0] using hθ0 + have hb0_le_two_c0 : b0 ≤ 2 * c0 := by + have hmul := mul_le_mul_of_nonneg_right hθ0_two hc0_pos.le + have hcancel : b0 * c0⁻¹ * c0 = b0 := by field_simp [ne_of_gt hc0_pos] + simpa [hcancel] using hmul + calc + hP.barSigmaAtScale hStruct 0 = b0 := rfl + _ ≤ 2 * c0 := hb0_le_two_c0 + _ ≤ 2 * bm := mul_le_mul_of_nonneg_left (hc0_le_cm.trans hcm_le_bm) (by norm_num) + _ = (1 + (1 : ℝ)) * hP.barSigmaAtScale hStruct (m : ℤ) := by ring + +private theorem smallContrast_goodScale_lower_delta_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (m : ℕ) : + (hP.barSigmaStarAtScale hStruct 0)⁻¹ ≤ + (1 + (1 : ℝ)) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hc0_pos : 0 < c0 := by + simpa [c0] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 0 + have hcm_pos : 0 < cm := by + simpa [cm] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hchain := Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have hbm_le_b0 : bm ≤ b0 := by simpa [bm, b0] using hchain.2.2 + have hcm_le_bm : cm ≤ bm := by + simpa [bm, cm] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hθ0_two : b0 * c0⁻¹ ≤ 2 := by + have hθ0 : + thetaAtScale hP hStruct (0 : ℤ) ≤ 2 := + (thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hP4).trans hsmall + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, c0] using hθ0 + have hb0_le_two_c0 : b0 ≤ 2 * c0 := by + have hmul := mul_le_mul_of_nonneg_right hθ0_two hc0_pos.le + have hcancel : b0 * c0⁻¹ * c0 = b0 := by field_simp [ne_of_gt hc0_pos] + simpa [hcancel] using hmul + have hcm_le_two_c0 : cm ≤ 2 * c0 := + hcm_le_bm.trans (hbm_le_b0.trans hb0_le_two_c0) + have hinv_le : c0⁻¹ ≤ 2 * cm⁻¹ := by + have hmul := mul_le_mul_of_nonneg_right hcm_le_two_c0 + (mul_nonneg (inv_pos.mpr hc0_pos).le (inv_pos.mpr hcm_pos).le) + have hleft : cm * (c0⁻¹ * cm⁻¹) = c0⁻¹ := by + field_simp [ne_of_gt hcm_pos] + have hright : (2 * c0) * (c0⁻¹ * cm⁻¹) = 2 * cm⁻¹ := by + field_simp [ne_of_gt hc0_pos] + simpa [hleft, hright] using hmul + calc + (hP.barSigmaStarAtScale hStruct 0)⁻¹ = c0⁻¹ := rfl + _ ≤ 2 * cm⁻¹ := hinv_le + _ = (1 + (1 : ℝ)) * (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by ring + +private theorem pairProbeRefinedDescendantAverageK_le_pointwiseConst_delta_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (j : ℕ) : + pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j ≤ + pairPointwiseBudgetConst hP4 * widetildeThetaAtScale P 0 hP4 := by + let A : ℝ := + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) + have hgeo := pairProbeRefinedDescendantAverageK_eq_geometric hP4 (1 : ℝ) j + have hpair_eq : + pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j = + 16 * widetildeThetaAtScale P 0 hP4 * A := by + have hgeo' : + pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j = + 8 * ((1 + (1 : ℝ)) * widetildeThetaAtScale P 0 hP4) * A := by + simpa [A, widetildeThetaAtScale, lpVarianceDecay, sqrtVarianceDecay, + sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using hgeo + calc + pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j = + 8 * ((1 + (1 : ℝ)) * widetildeThetaAtScale P 0 hP4) * A := hgeo' + _ = 16 * widetildeThetaAtScale P 0 hP4 * A := by ring + have hLp_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := + rosenthalDescendantsAtScaleLpConst_nonneg d 0 hP4.xi + have hSqrt_nonneg : 0 ≤ Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := + rosenthalDescendantsAtScaleSqrtConst_nonneg d 0 hP4.xi + have hLp_decay : + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) + (by + have hxi_two : (2 : ℝ) ≤ (hP4.xi : ℝ) := by + exact_mod_cast hP4.two_le_xi + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdiv_le : (d : ℝ) / (hP4.xi : ℝ) ≤ (d : ℝ) / 2 := by + exact div_le_div_of_nonneg_left hd_nonneg (by norm_num) hxi_two + have hγ : 0 ≤ lpVarianceDecay d hP4 := by + dsimp [lpVarianceDecay] + linarith + have hj : 0 ≤ (j : ℝ) := by exact_mod_cast Nat.zero_le j + exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hγ) hj) + have hSqrt_decay : + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) + (by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hγ : 0 ≤ sqrtVarianceDecay d := by + dsimp [sqrtVarianceDecay] + positivity + have hj : 0 ≤ (j : ℝ) := by exact_mod_cast Nat.zero_le j + exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hγ) hj) + have hinside : + A ≤ + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + have hLp_part : + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(lpVarianceDecay d hP4) * (j : ℝ)) ≤ + Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi := by + simpa using mul_le_mul_of_nonneg_left hLp_decay hLp_nonneg + have hSqrt_part : + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi * + Real.rpow (3 : ℝ) (-(sqrtVarianceDecay d) * (j : ℝ)) ≤ + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi := by + simpa using mul_le_mul_of_nonneg_left hSqrt_decay hSqrt_nonneg + dsimp [A] + exact add_le_add hLp_part hSqrt_part + have htheta : 0 ≤ widetildeThetaAtScale P 0 hP4 := + widetildeThetaAtScale_zero_nonneg hP4 + calc + pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j = + 16 * widetildeThetaAtScale P 0 hP4 * A := hpair_eq + _ ≤ + 16 * widetildeThetaAtScale P 0 hP4 * + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 hP4.xi + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 hP4.xi) := + mul_le_mul_of_nonneg_left hinside (mul_nonneg (by norm_num) htheta) + _ = pairPointwiseBudgetConst hP4 * widetildeThetaAtScale P 0 hP4 := by + simp [pairPointwiseBudgetConst] + ring + +noncomputable def refinedVarianceBasicBudgetSmallContrastConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 1 + 4 * pairPointwiseBudgetConst hP4 + + 8 * pairPointwiseBudgetConst hP4 ^ (2 : ℕ) + +private theorem refinedVarianceBasicBudgetSmallContrastConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ refinedVarianceBasicBudgetSmallContrastConst hP4 := by + have hM := pairPointwiseBudgetConst_nonneg hP4 + unfold refinedVarianceBasicBudgetSmallContrastConst + exact add_nonneg + (add_nonneg zero_le_one (mul_nonneg (by norm_num) hM)) + (mul_nonneg (by norm_num) (sq_nonneg (pairPointwiseBudgetConst hP4))) + +private theorem refinedVarianceBasicBudget_one_le_smallContrastConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (j : ℕ) : + refinedVarianceBasicBudget hP4 (1 : ℝ) j ≤ + refinedVarianceBasicBudgetSmallContrastConst hP4 := by + let K := pairProbeRefinedDescendantAverageK hP4 (1 : ℝ) j + let M := pairPointwiseBudgetConst hP4 + let θ := widetildeThetaAtScale P 0 hP4 + have hK_nonneg : 0 ≤ K := by + simpa [K] using pairProbeRefinedDescendantAverageK_nonneg hP4 (by norm_num) j + have hM_nonneg : 0 ≤ M := by + simpa [M] using pairPointwiseBudgetConst_nonneg hP4 + have hθ_nonneg : 0 ≤ θ := by + simpa [θ] using widetildeThetaAtScale_zero_nonneg hP4 + have hK_le_Mθ : K ≤ M * θ := by + simpa [K, M, θ] using + pairProbeRefinedDescendantAverageK_le_pointwiseConst_delta_one hP4 j + have hK_le_twoM : K ≤ 2 * M := by + calc + K ≤ M * θ := hK_le_Mθ + _ ≤ M * 2 := mul_le_mul_of_nonneg_left (by simpa [θ] using hsmall) hM_nonneg + _ = 2 * M := by ring + have hK_sq_le : K ^ (2 : ℕ) ≤ (2 * M) ^ (2 : ℕ) := + pow_le_pow_left₀ hK_nonneg hK_le_twoM 2 + have hbasic := + refinedVarianceBasicBudget_le_pairBudget hP4 (by norm_num : (0 : ℝ) ≤ 1) j + calc + refinedVarianceBasicBudget hP4 (1 : ℝ) j ≤ + 1 + 2 * K + 2 * K ^ (2 : ℕ) := by simpa [K] using hbasic + _ ≤ 1 + 4 * M + 8 * M ^ (2 : ℕ) := by + have hlinear : 2 * K ≤ 4 * M := by + calc + 2 * K ≤ 2 * (2 * M) := + mul_le_mul_of_nonneg_left hK_le_twoM (by norm_num) + _ = 4 * M := by ring + have hquad : 2 * K ^ (2 : ℕ) ≤ 8 * M ^ (2 : ℕ) := by + calc + 2 * K ^ (2 : ℕ) ≤ 2 * (2 * M) ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left hK_sq_le (by norm_num) + _ = 8 * M ^ (2 : ℕ) := by ring + exact add_le_add (add_le_add le_rfl hlinear) hquad + _ = refinedVarianceBasicBudgetSmallContrastConst hP4 := by + simp [refinedVarianceBasicBudgetSmallContrastConst, M] + +private theorem centeredOriginNormalizedQuadratic_sq_integral_le_smallContrastConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (child : ℕ) (q : FullBlockVec d) : + ∫ a, + |Ch04.restrictionCenteredOriginObservable P (child : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q) a| ^ + (2 : ℕ) ∂P ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 * + (dotProduct q q) ^ (2 : ℕ) := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q + let F : RegCoeffField d → ℝ := fun a => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (child : ℤ) (originCube d (child : ℤ)) a + let Dq : ℝ := (dotProduct q q) ^ (2 : ℕ) + have hleft_int : + Integrable + (fun a : RegCoeffField d => + |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ)) P := by + simpa [X] using + fullBlockNormalizedQuadraticObservable_centeredOrigin_sq_integrable_at_self + hP hStruct hP4 child q + have hF_int : Integrable F P := by + simpa [F] using + integrable_origin_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4 + hP hStruct hP4 (child : ℤ) child + have hright_int : Integrable (fun a : RegCoeffField d => F a * Dq) P := + hF_int.mul_const Dq + have hpoint : + (fun a : RegCoeffField d => + |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ)) + ≤ᵐ[P] fun a => F a * Dq := by + filter_upwards with a + have hmean : + (∫ b, + fullBlockNormalizedQuadraticObservable hP hStruct (child : ℤ) q + (cubeSet (originCube d (child : ℤ))) b.toFun ∂P) = + dotProduct q q := + integral_origin_fullBlockNormalizedQuadraticObservable_self_eq_dotProduct + hP hStruct hP4 child q + have hcenter : + Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a = + fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (child : ℤ) + (cubeSet (originCube d (child : ℤ))) a) q := by + simp only [Ch04.restrictionCenteredOriginObservable, X, + fullBlockNormalizedQuadraticObservableR] + rw [hmean] + exact + fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 child q (cubeSet (originCube d (child : ℤ))) a + have hquad := + fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq + (fullBlockNormalizedFluctuationMatrix hP hStruct (child : ℤ) + (cubeSet (originCube d (child : ℤ))) a) q + simpa [X, F, Dq, hcenter, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq] using hquad + have hmono : + ∫ a, |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ) ∂P ≤ + ∫ a, F a * Dq ∂P := + integral_mono_ae hleft_int hright_int hpoint + have hgood_upper := + smallContrast_goodScale_upper_delta_one hP hStruct hP4 hsmall child + have hgood_lower := + smallContrast_goodScale_lower_delta_one hP hStruct hP4 hsmall child + have hOp : + ∫ a, F a ∂P ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 := by + have hrefined : + ∫ a, F a ∂P ≤ refinedMatrixVarianceScaleBound hP4 (1 : ℝ) child := by + simpa [F] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_refinedMatrixVarianceScaleBound + hP hStruct hP4 (by norm_num : (0 : ℝ) ≤ 1) child child + (le_rfl : child ≤ child) hgood_upper hgood_lower + have hbasic : + refinedMatrixVarianceScaleBound hP4 (1 : ℝ) child ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudget hP4 (1 : ℝ) child := + refinedMatrixVarianceScaleBound_le_basicBudget + hP4 (by norm_num : (0 : ℝ) ≤ 1) (by norm_num : (1 : ℝ) ≤ 1) child + have hconst := + refinedVarianceBasicBudget_one_le_smallContrastConst hP4 hsmall child + exact hrefined.trans + (hbasic.trans + (mul_le_mul_of_nonneg_left hconst (by + unfold refinedMatrixBudgetConst + positivity))) + have hDq_nonneg : 0 ≤ Dq := by + dsimp [Dq] + exact sq_nonneg (dotProduct q q) + calc + ∫ a, + |Ch04.restrictionCenteredOriginObservable P (child : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q) a| ^ + (2 : ℕ) ∂P = + ∫ a, |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ + (2 : ℕ) ∂P := rfl + _ ≤ ∫ a, F a * Dq ∂P := hmono + _ = (∫ a, F a ∂P) * Dq := by rw [integral_mul_const] + _ ≤ (refinedMatrixBudgetConst d * + refinedVarianceBasicBudgetSmallContrastConst hP4) * Dq := + mul_le_mul_of_nonneg_right hOp hDq_nonneg + _ = refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 * + (dotProduct q q) ^ (2 : ℕ) := by + simp [Dq, mul_assoc] + +private noncomputable def normalizedQuadraticProbeAverageRootSqConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (q : FullBlockVec d) : ℝ := + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2) ^ (2 : ℕ) * + (refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 * + (dotProduct q q) ^ (2 : ℕ)) + +noncomputable def normalizedQuadraticProbeAverageUniformRootSqConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2) ^ (2 : ℕ) * + (refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 * 16) + +noncomputable def normalizedMatrixAverageGeometricConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * 9 * + normalizedQuadraticProbeAverageUniformRootSqConst hP4 + +private theorem refinedMatrixBudgetConst_nonneg (d : ℕ) : + 0 ≤ refinedMatrixBudgetConst d := by + unfold refinedMatrixBudgetConst + positivity + +theorem normalizedQuadraticProbeAverageUniformRootSqConst_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + 0 ≤ normalizedQuadraticProbeAverageUniformRootSqConst hP4 := by + have hbudget : 0 ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 := by + exact mul_nonneg (refinedMatrixBudgetConst_nonneg d) + (refinedVarianceBasicBudgetSmallContrastConst_nonneg hP4) + unfold normalizedQuadraticProbeAverageUniformRootSqConst + exact mul_nonneg + (sq_nonneg + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2)) + (mul_nonneg hbudget (by norm_num)) + +private theorem normalizedQuadraticProbeAverageRootSqConst_le_uniform_coordinate + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (α : BlockCoord d) : + normalizedQuadraticProbeAverageRootSqConst hP4 (fullBlockCoordinateProbe α) ≤ + normalizedQuadraticProbeAverageUniformRootSqConst hP4 := by + have hbudget : 0 ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 := by + exact mul_nonneg (refinedMatrixBudgetConst_nonneg d) + (refinedVarianceBasicBudgetSmallContrastConst_nonneg hP4) + have hdot : + (dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ≤ + (16 : ℝ) := by + rw [dotProduct_coordinateProbe_self] + norm_num + unfold normalizedQuadraticProbeAverageRootSqConst + normalizedQuadraticProbeAverageUniformRootSqConst + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdot hbudget) + (sq_nonneg + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2)) + +private theorem normalizedQuadraticProbeAverageRootSqConst_le_uniform_plus + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (α β : BlockCoord d) : + normalizedQuadraticProbeAverageRootSqConst hP4 (fullBlockPlusProbe α β) ≤ + normalizedQuadraticProbeAverageUniformRootSqConst hP4 := by + have hbudget : 0 ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 := by + exact mul_nonneg (refinedMatrixBudgetConst_nonneg d) + (refinedVarianceBasicBudgetSmallContrastConst_nonneg hP4) + have hdot_nonneg : + 0 ≤ dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) := + dotProduct_self_nonneg (fullBlockPlusProbe α β) + have hdot_le : + dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) ≤ 4 := + dotProduct_plusProbe_self_le_four α β + have hdot_sq : + (dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ≤ + (16 : ℝ) := by + have h := pow_le_pow_left₀ hdot_nonneg hdot_le 2 + norm_num at h ⊢ + exact h + unfold normalizedQuadraticProbeAverageRootSqConst + normalizedQuadraticProbeAverageUniformRootSqConst + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdot_sq hbudget) + (sq_nonneg + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2)) + +private theorem normalizedQuadraticProbeAverageRootSqConst_le_uniform_minus + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) (α β : BlockCoord d) : + normalizedQuadraticProbeAverageRootSqConst hP4 (fullBlockMinusProbe α β) ≤ + normalizedQuadraticProbeAverageUniformRootSqConst hP4 := by + have hbudget : 0 ≤ + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 := by + exact mul_nonneg (refinedMatrixBudgetConst_nonneg d) + (refinedVarianceBasicBudgetSmallContrastConst_nonneg hP4) + have hdot_nonneg : + 0 ≤ dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) := + dotProduct_self_nonneg (fullBlockMinusProbe α β) + have hdot_le : + dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) ≤ 4 := + dotProduct_minusProbe_self_le_four α β + have hdot_sq : + (dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ≤ + (16 : ℝ) := by + have h := pow_le_pow_left₀ hdot_nonneg hdot_le 2 + norm_num at h ⊢ + exact h + unfold normalizedQuadraticProbeAverageRootSqConst + normalizedQuadraticProbeAverageUniformRootSqConst + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdot_sq hbudget) + (sq_nonneg + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2)) + +private theorem normalizedQuadraticProbeAverageRootBound_sq_le_card_inv_mul_smallContrastConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {child parent : ℕ} (hchild_parent : child ≤ parent) (q : FullBlockVec d) : + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent q) ^ (2 : ℕ) ≤ + (((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ)⁻¹) * + normalizedQuadraticProbeAverageRootSqConst hP4 q := by + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q + let I : ℝ := + ∫ a, |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ) ∂P + let K : ℝ := I ^ (1 / (2 : ℝ)) + let N : ℝ := ((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ) + let L : ℝ := Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + let S : ℝ := Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2 + let V : ℝ := + refinedMatrixBudgetConst d * refinedVarianceBasicBudgetSmallContrastConst hP4 * + (dotProduct q q) ^ (2 : ℕ) + have hscale_le : (child : ℤ) ≤ (parent : ℤ) := by exact_mod_cast hchild_parent + have hcard_formula := + Section52.section52_descendantsAtScale_originCube_large_card + d parent (n := (child : ℤ)) hscale_le + have hN_pos : 0 < N := by + dsimp [N] + rw [hcard_formula] + exact_mod_cast + (pow_pos (pow_pos (by norm_num : 0 < 3) d) + (Int.toNat ((parent : ℤ) - (child : ℤ)))) + have hN_nonneg : 0 ≤ N := hN_pos.le + have hN_ne : N ≠ 0 := ne_of_gt hN_pos + have hI_nonneg : 0 ≤ I := by + dsimp [I, X] + exact integral_nonneg fun a => pow_nonneg (abs_nonneg _) (2 : ℕ) + have hK_sq : K ^ (2 : ℕ) = I := by + dsimp [K] + rw [← Real.sqrt_eq_rpow, Real.sq_sqrt hI_nonneg] + have hI_le : I ≤ V := by + dsimp [I, X, V] + exact centeredOriginNormalizedQuadratic_sq_integral_le_smallContrastConst + hP hStruct hP4 hsmall child q + have hK_sq_le : K ^ (2 : ℕ) ≤ V := by + rw [hK_sq] + exact hI_le + have hroot_eq : + normalizedQuadraticProbeAverageRootBound hP hStruct child parent q = + N⁻¹ * ((L + S) * Real.sqrt N * K) := by + rw [normalizedQuadraticProbeAverageRootBound] + rw [rosenthalDescendantsAtScaleLpConst_natCast_eq_zero d 2 child, + rosenthalDescendantsAtScaleSqrtConst_natCast_eq_zero d 2 child] + rw [← Real.sqrt_eq_rpow N] + simp [X, I, K, N, L, S, mul_comm, mul_assoc, add_mul] + ring_nf + left + trivial + have hroot_sq_eq : + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent q) ^ (2 : ℕ) = + N⁻¹ * ((L + S) ^ (2 : ℕ) * K ^ (2 : ℕ)) := by + rw [hroot_eq] + calc + (N⁻¹ * ((L + S) * Real.sqrt N * K)) ^ (2 : ℕ) + = N⁻¹ ^ (2 : ℕ) * + ((L + S) ^ (2 : ℕ) * (Real.sqrt N) ^ (2 : ℕ) * K ^ (2 : ℕ)) := by + ring + _ = N⁻¹ ^ (2 : ℕ) * + ((L + S) ^ (2 : ℕ) * N * K ^ (2 : ℕ)) := by + rw [Real.sq_sqrt hN_nonneg] + _ = N⁻¹ * ((L + S) ^ (2 : ℕ) * K ^ (2 : ℕ)) := by + field_simp [hN_ne] + have hfactor_nonneg : 0 ≤ N⁻¹ * (L + S) ^ (2 : ℕ) := by + exact mul_nonneg (inv_nonneg.mpr hN_nonneg) (sq_nonneg (L + S)) + calc + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent q) ^ (2 : ℕ) + = N⁻¹ * ((L + S) ^ (2 : ℕ) * K ^ (2 : ℕ)) := hroot_sq_eq + _ = (N⁻¹ * (L + S) ^ (2 : ℕ)) * K ^ (2 : ℕ) := by ring + _ ≤ (N⁻¹ * (L + S) ^ (2 : ℕ)) * V := + mul_le_mul_of_nonneg_left hK_sq_le hfactor_nonneg + _ = N⁻¹ * normalizedQuadraticProbeAverageRootSqConst hP4 q := by + simp [normalizedQuadraticProbeAverageRootSqConst, V, L, S, mul_comm, + mul_left_comm, mul_assoc] + +private theorem normalizedMatrixAverageProbeRootBudget_le_of_probe_sq_bound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (child parent : ℕ) (B : ℝ) + (hcoord : + ∀ α : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ≤ B) + (hplus : + ∀ α β : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockPlusProbe α β)) ^ (2 : ℕ) ≤ B) + (hminus : + ∀ α β : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockMinusProbe α β)) ^ (2 : ℕ) ≤ B) : + normalizedMatrixAverageProbeRootBudget hP hStruct child parent ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * 9 * B := by + classical + let c : ℝ := Fintype.card (BlockCoord d) + have hc_nonneg : 0 ≤ c := by + dsimp [c] + positivity + unfold normalizedMatrixAverageProbeRootBudget + calc + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + ((normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockMinusProbe α β)) ^ (2 : ℕ))) ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ _α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ _β : BlockCoord d, 9 * B) := by + refine mul_le_mul_of_nonneg_left ?_ (sq_nonneg _) + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + calc + 3 * + ((normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockMinusProbe α β)) ^ (2 : ℕ)) ≤ + 3 * (B + B + B) := by + exact mul_le_mul_of_nonneg_left + (add_le_add (add_le_add (hcoord α) (hplus α β)) (hminus α β)) + (by norm_num) + _ = 9 * B := by ring + _ = ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * 9 * B := by + change c ^ (2 : ℕ) * + (c * ∑ _α : BlockCoord d, + c * ∑ _β : BlockCoord d, 9 * B) = + c ^ (6 : ℕ) * 9 * B + simp [Finset.sum_const, c] + ring + +theorem normalizedMatrixAverageProbeRootBudget_le_card_inv_mul_smallContrastConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {child parent : ℕ} (hchild_parent : child ≤ parent) : + normalizedMatrixAverageProbeRootBudget hP hStruct child parent ≤ + (((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ)⁻¹) * + normalizedMatrixAverageGeometricConst hP4 := by + let Ninv : ℝ := + (((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ)⁻¹) + let R : ℝ := normalizedQuadraticProbeAverageUniformRootSqConst hP4 + have hNinv_nonneg : 0 ≤ Ninv := by + dsimp [Ninv] + exact inv_nonneg.mpr (Nat.cast_nonneg _) + have hcoord : ∀ α : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ≤ Ninv * R := by + intro α + have hroot := + normalizedQuadraticProbeAverageRootBound_sq_le_card_inv_mul_smallContrastConst + hP hStruct hP4 hsmall hchild_parent (fullBlockCoordinateProbe α) + exact hroot.trans + (mul_le_mul_of_nonneg_left + (by + simpa [R] using + normalizedQuadraticProbeAverageRootSqConst_le_uniform_coordinate hP4 α) + hNinv_nonneg) + have hplus : ∀ α β : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockPlusProbe α β)) ^ (2 : ℕ) ≤ Ninv * R := by + intro α β + have hroot := + normalizedQuadraticProbeAverageRootBound_sq_le_card_inv_mul_smallContrastConst + hP hStruct hP4 hsmall hchild_parent (fullBlockPlusProbe α β) + exact hroot.trans + (mul_le_mul_of_nonneg_left + (by + simpa [R] using + normalizedQuadraticProbeAverageRootSqConst_le_uniform_plus hP4 α β) + hNinv_nonneg) + have hminus : ∀ α β : BlockCoord d, + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockMinusProbe α β)) ^ (2 : ℕ) ≤ Ninv * R := by + intro α β + have hroot := + normalizedQuadraticProbeAverageRootBound_sq_le_card_inv_mul_smallContrastConst + hP hStruct hP4 hsmall hchild_parent (fullBlockMinusProbe α β) + exact hroot.trans + (mul_le_mul_of_nonneg_left + (by + simpa [R] using + normalizedQuadraticProbeAverageRootSqConst_le_uniform_minus hP4 α β) + hNinv_nonneg) + have hbudget := + normalizedMatrixAverageProbeRootBudget_le_of_probe_sq_bound + hP hStruct child parent (Ninv * R) hcoord hplus hminus + calc + normalizedMatrixAverageProbeRootBudget hP hStruct child parent ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * 9 * (Ninv * R) := hbudget + _ = Ninv * normalizedMatrixAverageGeometricConst hP4 := by + simp [normalizedMatrixAverageGeometricConst, Ninv, R] + ring + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageEstimate.lean new file mode 100644 index 0000000000..bc703582d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageEstimate.lean @@ -0,0 +1,658 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.PartitionAverage +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ProbeVariance + +/-! # Matrix Average Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +private theorem fullBlockQuadratic_add + {d : ℕ} (M N : FullBlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (M + N) q = + fullBlockQuadratic M q + fullBlockQuadratic N q := by + unfold fullBlockQuadratic + rw [Matrix.add_mulVec, dotProduct_add] + +private theorem fullBlockQuadratic_smul + {d : ℕ} (c : ℝ) (M : FullBlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (c • M) q = c * fullBlockQuadratic M q := by + unfold fullBlockQuadratic + rw [Matrix.smul_mulVec, dotProduct_smul] + simp [smul_eq_mul] + +private def fullBlockQuadraticLinearMap + {d : ℕ} (q : FullBlockVec d) : FullBlockMat d →ₗ[ℝ] ℝ where + toFun M := fullBlockQuadratic M q + map_add' M N := fullBlockQuadratic_add M N q + map_smul' c M := fullBlockQuadratic_smul c M q + +theorem fullBlockQuadratic_descendantsAverageFullBlockMat + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → FullBlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (descendantsAverageFullBlockMat Q j F) q = + descendantsAverage Q j (fun R => fullBlockQuadratic (F R) q) := by + classical + let L := fullBlockQuadraticLinearMap q + calc + fullBlockQuadratic (descendantsAverageFullBlockMat Q j F) q + = L (descendantsAverageFullBlockMat Q j F) := rfl + _ = + L (((descendantsAtDepth Q j).card : ℝ)⁻¹ • + (descendantsAtDepth Q j).sum F) := by + rw [descendantsAverageFullBlockMat_eq_smul_sum] + _ = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, fullBlockQuadratic (F R) q := by + simp [L, fullBlockQuadraticLinearMap] + _ = descendantsAverage Q j (fun R => fullBlockQuadratic (F R) q) := by + rfl + +theorem integral_origin_fullBlockNormalizedQuadraticObservable_self_eq_dotProduct + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (q : FullBlockVec d) : + (∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (m : ℤ))) a.toFun ∂P) = + dotProduct q q := by + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + have hInt := + integral_origin_fullBlockNormalizedQuadraticObservable_eq_annealedBlockMatrixAtScale_from_P4 + hP hStruct hP4 (m : ℤ) (m : ℤ) + (by exact_mod_cast Nat.zero_le m) q + have hAnnealed : + D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (m : ℤ)) * D = 1 := by + simpa [D, b, c] using + normalizedAnnealedBlockMatrix_self_eq_one hP hStruct hP4 m + calc + (∫ a, + fullBlockNormalizedQuadraticObservable hP hStruct (m : ℤ) q + (cubeSet (originCube d (m : ℤ))) a.toFun ∂P) + = fullBlockQuadratic + (D * toFullBlockMat (Ch04.annealedBlockMatrixAtScale P (m : ℤ)) * D) q := by + simpa [D, b, c] using hInt + _ = fullBlockQuadratic (1 : FullBlockMat d) q := by rw [hAnnealed] + _ = dotProduct q q := fullBlockQuadratic_one q + +theorem fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_eq_restrictionCenteredDescendantAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {child parent : ℕ} (hchild_parent : child ≤ parent) + (q : FullBlockVec d) (a : RegCoeffField d) : + fullBlockQuadratic + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a) q = + Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q) a := by + classical + let Q : TriadicCube d := originCube d (parent : ℤ) + let depth : ℕ := parent - child + have hscale_le : (child : ℤ) ≤ (parent : ℤ) := by exact_mod_cast hchild_parent + have hdepth_scale : + descendantsAtDepth Q depth = descendantsAtScale Q (child : ℤ) := by + simpa [Q, depth, originCube] using + (descendantsAtScale_eq_descendantsAtDepth + (originCube d (parent : ℤ)) hscale_le).symm + have hmean : + (∫ b, + fullBlockNormalizedQuadraticObservable hP hStruct (child : ℤ) q + (cubeSet (originCube d (child : ℤ))) b.toFun ∂P) = + dotProduct q q := + integral_origin_fullBlockNormalizedQuadraticObservable_self_eq_dotProduct + hP hStruct hP4 child q + calc + fullBlockQuadratic + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a) q + = + descendantsAverage Q depth + (fun R => + fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct (child : ℤ) + (cubeSet R) a) q) := by + simpa [Q, depth, descendantsAverageNormalizedFluctuationMatrix] using + fullBlockQuadratic_descendantsAverageFullBlockMat + (Q := Q) (j := depth) + (F := fun R => + fullBlockNormalizedFluctuationMatrix hP hStruct (child : ℤ) + (cubeSet R) a) q + _ = + Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q) a := by + unfold descendantsAverage Ch04.restrictionCenteredDescendantAverage + rw [hdepth_scale] + apply congrArg + (fun s : ℝ => + ((descendantsAtScale Q (child : ℤ)).card : ℝ)⁻¹ * s) + refine Finset.sum_congr rfl ?_ + intro R hR + have hquad := + fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 child q (cubeSet R) a + simp only [fullBlockNormalizedQuadraticObservableR] + rw [← hquad, hmean] + +theorem aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet Q) a) P := by + rcases + exists_isRestrictionLocalRandomVariable_ae_eq_fullBlockNormalizedQuadraticObservable_cubeSet + hP hStruct center q Q with + ⟨Y, hY_local, hY_eq⟩ + exact (hP.aemeasurable_of_isLocalRandomVariable hY_local).congr hY_eq.symm + +theorem aemeasurable_fullBlockNormalizedQuadraticObservable_descendants_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (q : FullBlockVec d) (Q : TriadicCube d) (n : ℤ) : + ∀ R ∈ descendantsAtScale Q n, + AEMeasurable + (fun a : RegCoeffField d => + fullBlockNormalizedQuadraticObservable hP hStruct center q (cubeSet R) a) P := by + intro R _hR + exact aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet_of_P4 + hP hStruct center q R + +noncomputable def normalizedQuadraticProbeAverageRootBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (child parent : ℕ) (q : FullBlockVec d) : ℝ := + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q + let K : ℝ := + (∫ a, |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ)) + let N : ℝ := ((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ) + N⁻¹ * + (Ch04.rosenthalDescendantsAtScaleLpConst d (child : ℤ) 2 * + N ^ (1 / (2 : ℝ)) * K + + Ch04.rosenthalDescendantsAtScaleSqrtConst d (child : ℤ) 2 * + Real.sqrt N * K) + +theorem fullBlockNormalizedQuadraticObservable_centeredOrigin_sq_integrable_at_self + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (child : ℕ) (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => + |Ch04.restrictionCenteredOriginObservable P (child : ℤ) + (fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q) a| ^ + (2 : ℕ)) P := by + have hsub := + integrable_abs_sub_dotProduct_sq_fullBlockNormalizedQuadraticObservable_from_P4 + hP hStruct hP4 child child q + refine hsub.congr ?_ + filter_upwards with a + rw [Ch04.restrictionCenteredOriginObservable] + simp only [fullBlockNormalizedQuadraticObservableR] + rw [ + integral_origin_fullBlockNormalizedQuadraticObservable_self_eq_dotProduct + hP hStruct hP4 child q] + +theorem fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_sq_integrable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {child parent : ℕ} (hchild_parent : child ≤ parent) + (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a) q) ^ (2 : ℕ)) P := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q + have hZ_int : + Integrable + (fun a => + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ)) P := by + refine + Ch04.integrable_abs_pow_restrictionCenteredDescendantAverage_of_stationary + (d := d) (n := (child : ℤ)) (m := (parent : ℤ)) (P := P) + (p := 2) (by exact_mod_cast Nat.zero_le child) + (by exact_mod_cast hchild_parent) hStruct.stationary X + ?_ ?_ ?_ (by norm_num) ?_ + · exact Ch04.isRestrictionTranslationCovariant_comp_toFun + (fullBlockNormalizedQuadraticObservable_translation_covariant + hP hStruct (child : ℤ) q) + · simpa [X] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet_of_P4 + hP hStruct (child : ℤ) q (originCube d (child : ℤ)) + · simpa [X] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_descendants_of_P4 + hP hStruct (child : ℤ) q (originCube d (parent : ℤ)) (child : ℤ) + · simpa [X] using + fullBlockNormalizedQuadraticObservable_centeredOrigin_sq_integrable_at_self + hP hStruct hP4 child q + refine hZ_int.congr ?_ + filter_upwards with a + have hEq := + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_eq_restrictionCenteredDescendantAverage + hP hStruct hP4 hchild_parent q a + rw [hEq] + exact + sq_abs (Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a) + +theorem fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_integral_sq_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {child parent : ℕ} (hchild_parent : child ≤ parent) + (q : FullBlockVec d) : + ∫ a, + (fullBlockQuadratic + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a) q) ^ (2 : ℕ) ∂P ≤ + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent q) ^ (2 : ℕ) := by + let : IsProbabilityMeasure P := hP.isProbability + let X : Set (Vec d) → RegCoeffField d → ℝ := + fullBlockNormalizedQuadraticObservableR hP hStruct (child : ℤ) q + let K : ℝ := + (∫ a, |Ch04.restrictionCenteredOriginObservable P (child : ℤ) X a| ^ (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ)) + let B : ℝ := normalizedQuadraticProbeAverageRootBound hP hStruct child parent q + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hroot : + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ)) ≤ B := by + have hraw := + integral_abs_restrictionCenteredDescendantAverage_pow_rpow_inv_le_of_restrictionUnitRangeDependentLaw_of_ae_eq_local + (d := d) (n := (child : ℤ)) (m := (parent : ℤ)) (P := P) + (p := 2) (K := K) hP + (by exact_mod_cast Nat.zero_le child) + (by exact_mod_cast hchild_parent) hStruct.stationary hStruct.unit_range X + (by + simpa [X] using! + fullBlockNormalizedQuadraticObservable_descendants_localRep + hP hStruct (child : ℤ) q (originCube d (parent : ℤ)) (child : ℤ)) + (Ch04.isRestrictionTranslationCovariant_comp_toFun + (fullBlockNormalizedQuadraticObservable_translation_covariant + hP hStruct (child : ℤ) q)) + (by + simpa [X] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_cubeSet_of_P4 + hP hStruct (child : ℤ) q (originCube d (child : ℤ))) + (by + simpa [X] using! + aemeasurable_fullBlockNormalizedQuadraticObservable_descendants_of_P4 + hP hStruct (child : ℤ) q (originCube d (parent : ℤ)) (child : ℤ)) + (by norm_num) hK_nonneg + (by + simpa [X] using + fullBlockNormalizedQuadraticObservable_centeredOrigin_sq_integrable_at_self + hP hStruct hP4 child q) + (by rfl) + simpa [B, normalizedQuadraticProbeAverageRootBound, X, K] using hraw + have hI_nonneg : + 0 ≤ + ∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P := + integral_nonneg fun a => pow_nonneg (abs_nonneg _) (2 : ℕ) + have hroot_nonneg : + 0 ≤ + (∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ)) := by + positivity + have hsq := pow_le_pow_left₀ hroot_nonneg hroot 2 + have hroot_sq : + ((∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P) ^ + (1 / (2 : ℝ))) ^ (2 : ℕ) = + ∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P := by + rw [← Real.sqrt_eq_rpow, Real.sq_sqrt hI_nonneg] + have hcenter_eq : + ∫ a, + (fullBlockQuadratic + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a) q) ^ (2 : ℕ) ∂P = + ∫ a, + |Ch04.restrictionCenteredDescendantAverage P (child : ℤ) (parent : ℤ) X a| ^ + (2 : ℕ) ∂P := by + apply integral_congr_ae + filter_upwards with a + have hEq := + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_eq_restrictionCenteredDescendantAverage + hP hStruct hP4 hchild_parent q a + rw [hEq] + exact (sq_abs _).symm + rw [hroot_sq] at hsq + simpa [hcenter_eq, B] using hsq + +theorem descendantsAverageNormalizedFluctuationMatrix_isSymm_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) : + ∀ᵐ a ∂P, + (descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a).IsSymm := by + have hchild : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ a ∂P, + (fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a.toFun).IsSymm := by + intro R _hR + exact fullBlockNormalizedFluctuationMatrix_isSymm_ae hP hStruct center R + have hall : + ∀ᵐ a ∂P, ∀ R, R ∈ descendantsAtDepth Q j → + (fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a.toFun).IsSymm := + Ch04.ae_forall_mem_finset (P := P) (descendantsAtDepth Q j) hchild + filter_upwards [hall] with a ha + simpa [descendantsAverageNormalizedFluctuationMatrix] using + descendantsAverageFullBlockMat_isSymm (Q := Q) (j := j) + (F := fun R => + fullBlockNormalizedFluctuationMatrix hP hStruct center (cubeSet R) a) ha + +theorem descendantsAverageNormalizedFluctuationOperatorNormSq_le_probeSqBudget_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct center Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget + (descendantsAverageNormalizedFluctuationMatrix + hP hStruct center Q j a) := by + filter_upwards + [descendantsAverageNormalizedFluctuationMatrix_isSymm_ae + hP hStruct center Q j] with a hM + simpa [descendantsAverageNormalizedFluctuationOperatorNormSq] using + fullBlock_operatorNorm_sq_le_probeSqBudget hM + +noncomputable def normalizedMatrixAverageProbeRootBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (child parent : ℕ) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + ((normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (normalizedQuadraticProbeAverageRootBound hP hStruct child parent + (fullBlockMinusProbe α β)) ^ (2 : ℕ))) + +theorem descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_probeRootBudget + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {child parent : ℕ} (hchild_parent : child ≤ parent) : + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a ∂P ≤ + normalizedMatrixAverageProbeRootBudget hP hStruct child parent := by + classical + let Q : TriadicCube d := originCube d (parent : ℤ) + let j : ℕ := parent - child + let M : RegCoeffField d → FullBlockMat d := + fun a => + descendantsAverageNormalizedFluctuationMatrix hP hStruct (child : ℤ) Q j a + let Root : FullBlockVec d → ℝ := + normalizedQuadraticProbeAverageRootBound hP hStruct child parent + have hF_int : + Integrable + (descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j) P := by + simpa [Q, j] using + integrable_descendantsAverageNormalizedFluctuationOperatorNormSq_from_P4_of_stationary + hP hStruct hP4 child parent child hchild_parent + have hcoord_int : + ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ + (2 : ℕ)) P := by + intro α + simpa [M, Q, j] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_sq_integrable + hP hStruct hP4 hchild_parent (fullBlockCoordinateProbe α) + have hplus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ + (2 : ℕ)) P := by + intro α β + simpa [M, Q, j] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_sq_integrable + hP hStruct hP4 hchild_parent (fullBlockPlusProbe α β) + have hminus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ + (2 : ℕ)) P := by + intro α β + simpa [M, Q, j] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_sq_integrable + hP hStruct hP4 hchild_parent (fullBlockMinusProbe α β) + have hcoord : + ∀ α : BlockCoord d, + (∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ + (2 : ℕ) ∂P) ≤ + (Root (fullBlockCoordinateProbe α)) ^ (2 : ℕ) := by + intro α + simpa [M, Q, j, Root] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_integral_sq_le + hP hStruct hP4 hchild_parent (fullBlockCoordinateProbe α) + have hplus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ + (2 : ℕ) ∂P) ≤ + (Root (fullBlockPlusProbe α β)) ^ (2 : ℕ) := by + intro α β + simpa [M, Q, j, Root] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_integral_sq_le + hP hStruct hP4 hchild_parent (fullBlockPlusProbe α β) + have hminus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ + (2 : ℕ) ∂P) ≤ + (Root (fullBlockMinusProbe α β)) ^ (2 : ℕ) := by + intro α β + simpa [M, Q, j, Root] using + fullBlockQuadratic_descendantsAverageNormalizedFluctuationMatrix_integral_sq_le + hP hStruct hP4 hchild_parent (fullBlockMinusProbe α β) + have hterm_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + 3 * + ((fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ))) P := by + intro α β + exact ((hcoord_int α).add (hplus_int α β) |>.add (hminus_int α β)).const_mul 3 + have hbudget_int : + Integrable + (fun a : RegCoeffField d => fullBlockProbeSqBudget (M a)) P := by + unfold fullBlockProbeSqBudget + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro α _hα + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro β _hβ + simpa [M] using hterm_int α β + have hpoint : + (fun a : RegCoeffField d => + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) := by + simpa [M, Q, j] using + descendantsAverageNormalizedFluctuationOperatorNormSq_le_probeSqBudget_ae + hP hStruct (child : ℤ) Q j + have hfirst : + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j a ∂P ≤ + ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) ∂P := + integral_mono_ae hF_int (hbudget_int.const_mul _) hpoint + have hbudget_eval : + ∫ a, fullBlockProbeSqBudget (M a) ∂P = + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + (∫ a, + (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ + (2 : ℕ) ∂P) := by + unfold fullBlockProbeSqBudget + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr + ext α + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr + ext β + let f : RegCoeffField d → ℝ := + fun a => (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + let g : RegCoeffField d → ℝ := + fun a => (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + let h : RegCoeffField d → ℝ := + fun a => (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) + have hf_int : Integrable f P := by simpa [f] using hcoord_int α + have hg_int : Integrable g P := by simpa [g] using hplus_int α β + have hh_int : Integrable h P := by simpa [h] using hminus_int α β + change + ∫ a, 3 * (f a + g a + h a) ∂P = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + rw [integral_const_mul] + change + 3 * ∫ a, (fun a => f a + g a) a + h a ∂P = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + have hfg_fun : (fun a : RegCoeffField d => f a + g a) = f + g := by + ext a + rfl + rw [hfg_fun] + rw [integral_add (hf_int.add hg_int) hh_int] + change + 3 * (∫ a, f a + g a ∂P + ∫ a, h a ∂P) = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + rw [integral_add hf_int hg_int] + · intro β _hβ + exact hterm_int α β + · intro α _hα + exact (MeasureTheory.integrable_finsetSum _ fun β _hβ => + hterm_int α β).const_mul _ + have hbudget_bound : + ∫ a, fullBlockProbeSqBudget (M a) ∂P ≤ + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + ((Root (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (Root (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (Root (fullBlockMinusProbe α β)) ^ (2 : ℕ)) := by + rw [hbudget_eval] + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + exact mul_le_mul_of_nonneg_left + (by nlinarith [hcoord α, hplus α β, hminus α β]) + (by norm_num) + calc + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a ∂P + = + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j a ∂P := by + rfl + _ ≤ + ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget (M a) ∂P := hfirst + _ = + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ∫ a, fullBlockProbeSqBudget (M a) ∂P := by + rw [integral_const_mul] + _ ≤ + normalizedMatrixAverageProbeRootBudget hP hStruct child parent := by + simpa [normalizedMatrixAverageProbeRootBudget, Root] using + mul_le_mul_of_nonneg_left hbudget_bound (sq_nonneg _) + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageGeometric.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageGeometric.lean new file mode 100644 index 0000000000..013e937e8c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAverageGeometric.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageCompression + +/-! # Matrix Average Geometric -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +/-- Parameter-only version of the small-contrast basic refined variance budget. -/ +noncomputable def refinedVarianceBasicBudgetSmallContrastConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 1 + 4 * pairPointwiseBudgetConstParams params + + 8 * pairPointwiseBudgetConstParams params ^ (2 : ℕ) + +/-- Parameter-only version of the uniform one-probe root-square constant. -/ +noncomputable def normalizedQuadraticProbeAverageUniformRootSqConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (Ch04.rosenthalDescendantsAtScaleLpConst d 0 2 + + Ch04.rosenthalDescendantsAtScaleSqrtConst d 0 2) ^ (2 : ℕ) * + (refinedMatrixBudgetConst d * + refinedVarianceBasicBudgetSmallContrastConstParams params * 16) + +/-- Parameter-only constant for the compressed matrix-average geometric estimate. -/ +noncomputable def normalizedMatrixAverageGeometricConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + ((Fintype.card (BlockCoord d) : ℝ) ^ (6 : ℕ)) * 9 * + normalizedQuadraticProbeAverageUniformRootSqConstParams params + +@[simp] +theorem refinedVarianceBasicBudgetSmallContrastConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + refinedVarianceBasicBudgetSmallContrastConstParams hP4.params = + refinedVarianceBasicBudgetSmallContrastConst hP4 := rfl + +@[simp] +theorem normalizedQuadraticProbeAverageUniformRootSqConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + normalizedQuadraticProbeAverageUniformRootSqConstParams hP4.params = + normalizedQuadraticProbeAverageUniformRootSqConst hP4 := rfl + +@[simp] +theorem normalizedMatrixAverageGeometricConstParams_eq_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + normalizedMatrixAverageGeometricConstParams hP4.params = + normalizedMatrixAverageGeometricConst hP4 := rfl + +theorem descendantsAtScale_originCube_nat_card_inv_eq_rpow + (d child parent : ℕ) (hchild_parent : child ≤ parent) : + (((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ)⁻¹) = + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := by + have hscale_le : (child : ℤ) ≤ (parent : ℤ) := by + exact_mod_cast hchild_parent + have htoNat : + Int.toNat ((parent : ℤ) - (child : ℤ)) = parent - child := by + have hsub : + (parent : ℤ) - (child : ℤ) = ((parent - child : ℕ) : ℤ) := by + omega + rw [hsub] + simp + rw [Section52.section52_descendantsAtScale_originCube_large_card d parent hscale_le] + rw [htoNat] + have hcast : + (((3 ^ d) ^ (parent - child) : ℕ) : ℝ) = + ((3 : ℝ) ^ (d * (parent - child))) := by + rw [Nat.cast_pow, Nat.cast_pow] + rw [← pow_mul] + norm_num + rw [hcast] + rw [← Real.rpow_natCast (3 : ℝ) (d * (parent - child))] + rw [show ((d * (parent - child) : ℕ) : ℝ) = + (d : ℝ) * ((parent - child : ℕ) : ℝ) by rw [Nat.cast_mul]] + simpa [neg_mul] using + (Real.rpow_neg (by norm_num : 0 ≤ (3 : ℝ)) + ((d : ℝ) * ((parent - child : ℕ) : ℝ))).symm + +theorem descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_geometric_of_smallContrast + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {child parent : ℕ} (hchild_parent : child ≤ parent) : + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a ∂P ≤ + normalizedMatrixAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := by + have hprobe := + descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_probeRootBudget + hP hStruct hP4 hchild_parent + have hbudget := + normalizedMatrixAverageProbeRootBudget_le_card_inv_mul_smallContrastConst + hP hStruct hP4 hsmall hchild_parent + have hcard := + descendantsAtScale_originCube_nat_card_inv_eq_rpow d child parent hchild_parent + calc + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a ∂P ≤ + normalizedMatrixAverageProbeRootBudget hP hStruct child parent := hprobe + _ ≤ (((descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ)).card : ℝ)⁻¹) * + normalizedMatrixAverageGeometricConst hP4 := hbudget + _ = normalizedMatrixAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := by + rw [hcard] + ring + +/-- +Manuscript-style small-contrast matrix-average estimate. + +The constant is chosen before the law `P`; it depends only on the quantitative +ellipticity parameters and the dimension. +-/ +theorem descendantsAverageNormalizedFluctuationOperatorNormSq_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ {child parent : ℕ}, child ≤ parent → + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a ∂P ≤ + C * Real.rpow (3 : ℝ) + (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := by + let C : ℝ := max 1 (normalizedMatrixAverageGeometricConstParams params) + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le zero_lt_one (le_max_left _ _) + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hP4 hparams hsmall child parent hchild_parent + have hmain := + descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_geometric_of_smallContrast + hP hStruct hP4 hsmall hchild_parent + have hconst_le : normalizedMatrixAverageGeometricConst hP4 ≤ C := by + dsimp [C] + rw [← hparams] + rw [normalizedMatrixAverageGeometricConstParams_eq_of_P4 hP4] + exact le_max_right _ _ + have hrpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) + (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + exact hmain.trans (mul_le_mul_of_nonneg_right hconst_le hrpow_nonneg) + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAveragePackaging.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAveragePackaging.lean new file mode 100644 index 0000000000..5bc72a7f77 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/MatrixAveragePackaging.lean @@ -0,0 +1,363 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet + +/-! # Matrix Average Packaging -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +theorem fullBlockFluctuationMatrixWithNormalizer_isSymm_of_isSymmetricBlockMat + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) {U : Set (Vec d)} {a : RegCoeffField d} + (hA : IsSymmetricBlockMat (coarseBlockMatrix U a)) : + (fullBlockFluctuationMatrixWithNormalizer hP hStruct center S U a).IsSymm := by + let A := coarseBlockMatrix U a + let Abar := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + have hA_full : (toFullBlockMat A).IsSymm := by + simpa [A] using isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + have hAbar_full : (toFullBlockMat Abar).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat + (isSymmetricBlockMat_scalarAnnealedBlockMatrixAtScale hP hStruct center) + have hsub : (toFullBlockMat A - toFullBlockMat Abar).IsSymm := + hA_full.sub hAbar_full + have hHerm : + (toFullBlockMat A - toFullBlockMat Abar).IsHermitian := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hsub + have hconj : + (Matrix.conjTranspose S * (toFullBlockMat A - toFullBlockMat Abar) * S).IsHermitian := + Matrix.isHermitian_conjTranspose_mul_mul S hHerm + simpa [fullBlockFluctuationMatrixWithNormalizer, A, Abar, Matrix.conjTranspose, + Matrix.IsHermitian, Matrix.IsSymm] using! hconj + +theorem fullBlockFluctuationMatrixWithNormalizer_isSymm_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) : + ∀ᵐ a ∂P, + (fullBlockFluctuationMatrixWithNormalizer + hP hStruct center S (cubeSet Q) a).IsSymm := by + filter_upwards [isSymmetricBlockMat_coarseBlockMatrix_cubeSet_ae hP Q] with a hA + exact + fullBlockFluctuationMatrixWithNormalizer_isSymm_of_isSymmetricBlockMat + hP hStruct center S hA + +theorem descendantsAverageFullBlockMat_isSymm + {d : ℕ} {Q : TriadicCube d} {j : ℕ} {F : TriadicCube d → FullBlockMat d} + (hF : ∀ R, R ∈ descendantsAtDepth Q j → (F R).IsSymm) : + (descendantsAverageFullBlockMat Q j F).IsSymm := by + ext α β + unfold descendantsAverageFullBlockMat descendantsAverage + refine congrArg (fun x => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * x) ?_ + exact Finset.sum_congr rfl fun R hR => by + exact (hF R hR).apply α β + +theorem descendantsAverageFluctuationMatrixWithNormalizer_isSymm_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + ∀ᵐ a ∂P, + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct center S Q j a).IsSymm := by + have hchild : + ∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ a ∂P, + (fullBlockFluctuationMatrixWithNormalizer + hP hStruct center S (cubeSet R) a).IsSymm := by + intro R _hR + exact fullBlockFluctuationMatrixWithNormalizer_isSymm_ae + hP hStruct center S R + have hall : + ∀ᵐ a ∂P, ∀ R, R ∈ descendantsAtDepth Q j → + (fullBlockFluctuationMatrixWithNormalizer + hP hStruct center S (cubeSet R) a).IsSymm := + Ch04.ae_forall_mem_finset (P := P) (descendantsAtDepth Q j) hchild + filter_upwards [hall] with a ha + simpa [descendantsAverageFluctuationMatrixWithNormalizer] using + descendantsAverageFullBlockMat_isSymm (Q := Q) (j := j) + (F := fun R => + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S + (cubeSet R) a) ha + +theorem descendantsAverageFluctuationOperatorNormSqWithNormalizer_le_probeSqBudget_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct center S Q j a) := by + filter_upwards + [descendantsAverageFluctuationMatrixWithNormalizer_isSymm_ae + hP hStruct center S Q j] with a hM + simpa [descendantsAverageFluctuationOperatorNormSqWithNormalizer] using + Section54.VarianceBoundGoodScale.fullBlock_operatorNorm_sq_le_probeSqBudget hM + +theorem descendantsAverageFluctuationOperatorNormSqWithNormalizer_integral_le_probeBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) (S : FullBlockMat d) + (Ccoord : BlockCoord d → ℝ) + (Cplus Cminus : BlockCoord d → BlockCoord d → ℝ) + (hcoord_int : + ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockCoordinateProbe α)) ^ (2 : ℕ)) P) + (hplus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockPlusProbe α β)) ^ (2 : ℕ)) P) + (hminus_int : + ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockMinusProbe α β)) ^ (2 : ℕ)) P) + (hcoord : + ∀ α : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockCoordinateProbe α)) ^ + (2 : ℕ) ∂P) ≤ Ccoord α) + (hplus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockPlusProbe α β)) ^ + (2 : ℕ) ∂P) ≤ Cplus α β) + (hminus : + ∀ α β : BlockCoord d, + (∫ a, + (fullBlockQuadratic + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a) + (Section54.VarianceBoundGoodScale.fullBlockMinusProbe α β)) ^ + (2 : ℕ) ∂P) ≤ Cminus α β) : + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a ∂P ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β)) := by + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + let M : RegCoeffField d → FullBlockMat d := + fun a => + descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct (m : ℤ) S Q j a + have hF_int : + Integrable + (descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j) P := by + simpa [Q, j] using + integrable_descendantsAverageFluctuationOperatorNormSqWithNormalizer_from_P4_of_stationary + hP hStruct hP4 m n k hk S + have hterm_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + 3 * + ((fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockMinusProbe α β)) ^ (2 : ℕ))) P := by + intro α β + simpa only [M, Q, j] using + (((hcoord_int α).add (hplus_int α β)).add (hminus_int α β)).const_mul 3 + have hbudget_int : + Integrable + (fun a : RegCoeffField d => + Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a)) P := by + unfold Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro α _hα + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro β _hβ + simpa [M] using hterm_int α β + have hpoint : + (fun a : RegCoeffField d => + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) := by + simpa [M, Q, j] using + descendantsAverageFluctuationOperatorNormSqWithNormalizer_le_probeSqBudget_ae + hP hStruct (m : ℤ) S Q j + have hfirst : + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j a ∂P ≤ + ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) ∂P := + integral_mono_ae hF_int (hbudget_int.const_mul _) hpoint + have hbudget_eval : + ∫ a, Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) ∂P = + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * + (∫ a, + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockCoordinateProbe α)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockPlusProbe α β)) ^ + (2 : ℕ) ∂P + + ∫ a, + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockMinusProbe α β)) ^ + (2 : ℕ) ∂P) := by + unfold Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr + ext α + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum] + · congr + ext β + let f : RegCoeffField d → ℝ := + fun a => + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockCoordinateProbe α)) ^ + (2 : ℕ) + let g : RegCoeffField d → ℝ := + fun a => + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockPlusProbe α β)) ^ + (2 : ℕ) + let h : RegCoeffField d → ℝ := + fun a => + (fullBlockQuadratic (M a) + (Section54.VarianceBoundGoodScale.fullBlockMinusProbe α β)) ^ + (2 : ℕ) + have hf_int : Integrable f P := by + simpa [f, M, Q, j] using hcoord_int α + have hg_int : Integrable g P := by + simpa [g, M, Q, j] using hplus_int α β + have hh_int : Integrable h P := by + simpa [h, M, Q, j] using hminus_int α β + change + ∫ a, 3 * (f a + g a + h a) ∂P = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + rw [integral_const_mul] + change + 3 * ∫ a, (fun a => f a + g a) a + h a ∂P = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + have hfg_fun : (fun a : RegCoeffField d => f a + g a) = f + g := by + ext a + rfl + rw [hfg_fun] + rw [integral_add (hf_int.add hg_int) hh_int] + change + 3 * (∫ a, f a + g a ∂P + ∫ a, h a ∂P) = + 3 * (∫ a, f a ∂P + ∫ a, g a ∂P + ∫ a, h a ∂P) + rw [integral_add hf_int hg_int] + · intro β _hβ + exact hterm_int α β + · intro α _hα + exact (MeasureTheory.integrable_finsetSum _ fun β _hβ => + hterm_int α β).const_mul _ + have hbudget_bound : + ∫ a, Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) ∂P ≤ + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β) := by + rw [hbudget_eval] + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + exact mul_le_mul_of_nonneg_left + (by nlinarith [hcoord α, hplus α β, hminus α β]) + (by norm_num) + calc + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a ∂P + = + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j a ∂P := by + rfl + _ ≤ + ∫ a, + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) ∂P := hfirst + _ = + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ∫ a, Section54.VarianceBoundGoodScale.fullBlockProbeSqBudget (M a) ∂P := by + rw [integral_const_mul] + _ ≤ + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, + (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, + 3 * (Ccoord α + Cplus α β + Cminus α β)) := by + exact mul_le_mul_of_nonneg_left hbudget_bound (sq_nonneg _) + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAverageEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAverageEstimate.lean new file mode 100644 index 0000000000..b4dbf4df34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAverageEstimate.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAverageGeometric +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceBudgetAlgebra + +/-! # Trace Average Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +/-- Constant multiplying the geometric matrix-average contribution in the +concrete trace-`J` square estimate. -/ +noncomputable def normalizedTraceJAverageGeometricConst + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP4 : QuantitativeCoarseGrainedEllipticity P) : ℝ := + 8 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + normalizedMatrixAverageGeometricConst hP4 + +/-- Constant multiplying `(Theta_m - 1)^2` in the concrete trace-`J` square +estimate. -/ +noncomputable def normalizedTraceJAverageThetaConst (d : ℕ) : ℝ := + 2 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + +theorem normalizedBlockJTraceAverage_eq_trace_fluctuation_add_theta_gap + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {child parent : ℕ} + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + let Q : TriadicCube d := originCube d (parent : ℤ) + let j : ℕ := parent - child + let M : FullBlockMat d := + descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) Q j a + let θ : ℝ := thetaAtScale hP hStruct (child : ℤ) + normalizedBlockJTraceAverage hP hStruct (child : ℤ) Q j a = + ((1 + θ) / 2) * Ch02.fullBlockTrace M + + ((Fintype.card (BlockCoord d) : ℝ) / 2) * (θ - 1) := by + intro Q j M θ + classical + let b := hP.barSigmaAtScale hStruct (child : ℤ) + let c := hP.barSigmaStarAtScale hStruct (child : ℤ) + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let T : FullBlockMat d := Matrix.diagonal (scalarFullBlockSqrtDiag b c) + let Aavg : BlockMat d := + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct (child : ℤ)) + have hb : 0 < b := by + simpa [b] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 child + have hc : 0 < c := by + simpa [c] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 child + have hTraceAverage : + normalizedBlockJTraceAverage hP hStruct (child : ℤ) Q j a = + blockJTraceAverageWithNormalizers D T Q j a := by + simpa [D, T, b, c] using + normalizedBlockJTraceAverage_eq_blockJTraceAverageWithNormalizers + hP hStruct (child : ℤ) Q j a + have hBudget : + blockJTraceAverageWithNormalizers D T Q j a = + fullBlockJTraceBudgetWithNormalizers D T Aavg := by + simpa [Aavg] using + blockJTraceAverageWithNormalizers_eq_traceBudget_descendantsAverageBlockMat + ha D T Q j + have hBudgetFormula : + fullBlockJTraceBudgetWithNormalizers D T Aavg = + ((1 + θ) / 2) * + Ch02.fullBlockTrace (D * toFullBlockMat Aavg * D) - + (Fintype.card (BlockCoord d) : ℝ) := by + simpa [D, T, θ, thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b, c] using + fullBlockJTraceBudgetWithNormalizers_normalized_eq_trace + (d := d) hb hc Aavg + have hFluct : + M = D * (toFullBlockMat Aavg - Abar) * D := by + simpa [M, Q, j, D, b, c, Aavg, Abar] using + descendantsAverageNormalizedFluctuationMatrix_eq_diagonal_average_sub_annealed + hP hStruct (child : ℤ) Q j a + have hAnnealed : D * Abar * D = 1 := by + simpa [D, Abar, b, c] using + normalizedScalarAnnealedBlockMatrix_self_eq_one hP hStruct hP4 child + have hAvg_eq : D * toFullBlockMat Aavg * D = M + 1 := by + calc + D * toFullBlockMat Aavg * D = + D * (toFullBlockMat Aavg - Abar) * D + D * Abar * D := by + noncomm_ring + _ = M + 1 := by rw [← hFluct, hAnnealed] + have hTrace : + Ch02.fullBlockTrace (D * toFullBlockMat Aavg * D) = + Ch02.fullBlockTrace M + (Fintype.card (BlockCoord d) : ℝ) := by + rw [hAvg_eq] + unfold Ch02.fullBlockTrace + simp [Matrix.add_apply, Finset.sum_add_distrib] + calc + normalizedBlockJTraceAverage hP hStruct (child : ℤ) Q j a + = blockJTraceAverageWithNormalizers D T Q j a := hTraceAverage + _ = fullBlockJTraceBudgetWithNormalizers D T Aavg := hBudget + _ = + ((1 + θ) / 2) * + Ch02.fullBlockTrace (D * toFullBlockMat Aavg * D) - + (Fintype.card (BlockCoord d) : ℝ) := hBudgetFormula + _ = + ((1 + θ) / 2) * + (Ch02.fullBlockTrace M + (Fintype.card (BlockCoord d) : ℝ)) - + (Fintype.card (BlockCoord d) : ℝ) := by rw [hTrace] + _ = + ((1 + θ) / 2) * Ch02.fullBlockTrace M + + ((Fintype.card (BlockCoord d) : ℝ) / 2) * (θ - 1) := by ring + +theorem normalizedBlockJTraceAverageSq_le_matrix_average_add_thetaSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {child parent : ℕ} + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) + (originCube d (parent : ℤ)) (parent - child) a ≤ + 8 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a + + normalizedTraceJAverageThetaConst d * + (thetaAtScale hP hStruct (child : ℤ) - 1) ^ (2 : ℕ) := by + classical + let Q : TriadicCube d := originCube d (parent : ℤ) + let j : ℕ := parent - child + let M : FullBlockMat d := + descendantsAverageNormalizedFluctuationMatrix + hP hStruct (child : ℤ) Q j a + let θ : ℝ := thetaAtScale hP hStruct (child : ℤ) + let card : ℝ := Fintype.card (BlockCoord d) + let opSq : ℝ := + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j a + let coeff : ℝ := (1 + θ) / 2 + let x : ℝ := coeff * Ch02.fullBlockTrace M + let y : ℝ := (card / 2) * (θ - 1) + let J : ℝ := normalizedBlockJTraceAverage hP hStruct (child : ℤ) Q j a + have hJ : J = x + y := by + simpa [J, x, y, coeff, M, θ, Q, j, card] using + normalizedBlockJTraceAverage_eq_trace_fluctuation_add_theta_gap + hP hStruct hP4 ha + have hθ_one : 1 ≤ θ := by + simpa [θ] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 child + have hθ_two : θ ≤ 2 := by + simpa [θ] using + thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + hP hStruct hP4 hsmall child + have hcoeff_nonneg : 0 ≤ coeff := by + dsimp [coeff] + nlinarith + have hcoeff_le_two : coeff ≤ 2 := by + dsimp [coeff] + nlinarith + have hcoeff_sq_le_four : coeff ^ (2 : ℕ) ≤ 4 := by + have h := pow_le_pow_left₀ hcoeff_nonneg hcoeff_le_two 2 + norm_num at h + exact h + have htrace_bound : + Ch02.fullBlockTrace M ^ (2 : ℕ) ≤ card ^ (2 : ℕ) * opSq := by + simpa [M, opSq, Q, j, card, descendantsAverageNormalizedFluctuationOperatorNormSq] using + fullBlockTrace_sq_le_card_sq_operatorNormSq M + have hx_bound : + 2 * x ^ (2 : ℕ) ≤ 8 * card ^ (2 : ℕ) * opSq := by + have htrace_sq_nonneg : 0 ≤ Ch02.fullBlockTrace M ^ (2 : ℕ) := + sq_nonneg _ + have hx_sq : + x ^ (2 : ℕ) ≤ 4 * Ch02.fullBlockTrace M ^ (2 : ℕ) := by + calc + x ^ (2 : ℕ) = + coeff ^ (2 : ℕ) * Ch02.fullBlockTrace M ^ (2 : ℕ) := by + dsimp [x] + ring + _ ≤ 4 * Ch02.fullBlockTrace M ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hcoeff_sq_le_four htrace_sq_nonneg + calc + 2 * x ^ (2 : ℕ) ≤ 2 * (4 * Ch02.fullBlockTrace M ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hx_sq (by norm_num) + _ = 8 * Ch02.fullBlockTrace M ^ (2 : ℕ) := by ring + _ ≤ 8 * (card ^ (2 : ℕ) * opSq) := + mul_le_mul_of_nonneg_left htrace_bound (by norm_num) + _ = 8 * card ^ (2 : ℕ) * opSq := by ring + have hy_bound : + 2 * y ^ (2 : ℕ) ≤ + normalizedTraceJAverageThetaConst d * (θ - 1) ^ (2 : ℕ) := by + have hnonneg : + 0 ≤ card ^ (2 : ℕ) * (θ - 1) ^ (2 : ℕ) := + mul_nonneg (sq_nonneg _) (sq_nonneg _) + dsimp [normalizedTraceJAverageThetaConst, y, card] + nlinarith + have hsplit : (x + y) ^ (2 : ℕ) ≤ 2 * x ^ (2 : ℕ) + 2 * y ^ (2 : ℕ) := by + nlinarith [sq_nonneg (x - y)] + calc + normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) Q j a + = J ^ (2 : ℕ) := by rfl + _ = (x + y) ^ (2 : ℕ) := by rw [hJ] + _ ≤ 2 * x ^ (2 : ℕ) + 2 * y ^ (2 : ℕ) := hsplit + _ ≤ + 8 * card ^ (2 : ℕ) * opSq + + normalizedTraceJAverageThetaConst d * (θ - 1) ^ (2 : ℕ) := + add_le_add hx_bound hy_bound + _ = + 8 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) (originCube d (parent : ℤ)) + (parent - child) a + + normalizedTraceJAverageThetaConst d * + (thetaAtScale hP hStruct (child : ℤ) - 1) ^ (2 : ℕ) := by + simp [Q, j, opSq, θ, card] + +theorem normalizedBlockJTraceAverageSq_integral_le_geometric_add_thetaSq_of_smallContrast + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {child parent : ℕ} (hchild_parent : child ≤ parent) : + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) + (originCube d (parent : ℤ)) (parent - child) a ∂P ≤ + normalizedTraceJAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) + + normalizedTraceJAverageThetaConst d * + (thetaAtScale hP hStruct (child : ℤ) - 1) ^ (2 : ℕ) := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (parent : ℤ) + let j : ℕ := parent - child + let opSq : RegCoeffField d → ℝ := + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (child : ℤ) Q j + let gapSq : ℝ := (thetaAtScale hP hStruct (child : ℤ) - 1) ^ (2 : ℕ) + let traceConst : ℝ := 8 * (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let thetaConst : ℝ := normalizedTraceJAverageThetaConst d + have hleft_int : + Integrable + (normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) Q j) P := by + simpa [Q, j] using + integrable_normalizedBlockJTraceAverageSq_from_P4_of_stationary + hP hStruct hP4 child parent child hchild_parent + have hop_int : Integrable opSq P := by + simpa [opSq, Q, j] using + integrable_descendantsAverageNormalizedFluctuationOperatorNormSq_from_P4_of_stationary + hP hStruct hP4 child parent child hchild_parent + have hright_int : + Integrable (fun a : RegCoeffField d => traceConst * opSq a + thetaConst * gapSq) P := + (hop_int.const_mul traceConst).add (integrable_const (thetaConst * gapSq)) + have hpoint : + (fun a : RegCoeffField d => + normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => traceConst * opSq a + thetaConst * gapSq := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + simpa [traceConst, thetaConst, gapSq, opSq, Q, j] using + normalizedBlockJTraceAverageSq_le_matrix_average_add_thetaSq + hP hStruct hP4 hsmall ha + have hmono : + ∫ a, normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) Q j a ∂P ≤ + ∫ a, traceConst * opSq a + thetaConst * gapSq ∂P := + integral_mono_ae hleft_int hright_int hpoint + have hright_eval : + ∫ a, traceConst * opSq a + thetaConst * gapSq ∂P = + traceConst * ∫ a, opSq a ∂P + thetaConst * gapSq := by + rw [integral_add (hop_int.const_mul traceConst) + (integrable_const (thetaConst * gapSq))] + rw [integral_const_mul] + rw [integral_const] + simp [Measure.real, IsProbabilityMeasure.measure_univ] + have hop_bound : + ∫ a, opSq a ∂P ≤ + normalizedMatrixAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) := by + simpa [opSq, Q, j] using + descendantsAverageNormalizedFluctuationOperatorNormSq_integral_le_geometric_of_smallContrast + hP hStruct hP4 hsmall hchild_parent + have htraceConst_nonneg : 0 ≤ traceConst := by + dsimp [traceConst] + nlinarith [sq_nonneg (Fintype.card (BlockCoord d) : ℝ)] + calc + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) + (originCube d (parent : ℤ)) (parent - child) a ∂P + = + ∫ a, normalizedBlockJTraceAverageSq hP hStruct (child : ℤ) Q j a ∂P := by + rfl + _ ≤ ∫ a, traceConst * opSq a + thetaConst * gapSq ∂P := hmono + _ = traceConst * ∫ a, opSq a ∂P + thetaConst * gapSq := hright_eval + _ ≤ + traceConst * + (normalizedMatrixAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ))) + + thetaConst * gapSq := + add_le_add + (mul_le_mul_of_nonneg_left hop_bound htraceConst_nonneg) + le_rfl + _ = + normalizedTraceJAverageGeometricConst hP4 * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((parent - child : ℕ) : ℝ)) + + normalizedTraceJAverageThetaConst d * + (thetaAtScale hP hStruct (child : ℤ) - 1) ^ (2 : ℕ) := by + simp [normalizedTraceJAverageGeometricConst, traceConst, thetaConst, gapSq] + ring + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAveragePackaging.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAveragePackaging.lean new file mode 100644 index 0000000000..9112f6f2a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceAveragePackaging.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.MatrixAveragePackaging + +/-! # Trace Average Packaging -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +theorem blockJTraceAverageWithNormalizers_eq_sum_descendantsAverage + {d : ℕ} (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : + blockJTraceAverageWithNormalizers S T Q j a = + ∑ α : BlockCoord d, + descendantsAverage Q j + (fun R => + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + unfold blockJTraceAverageWithNormalizers descendantsAverage + change + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) = + ∑ α : BlockCoord d, + (D.card : ℝ)⁻¹ * + ∑ R ∈ D, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a + calc + (D.card : ℝ)⁻¹ * + (∑ R ∈ D, + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) + = + (D.card : ℝ)⁻¹ * + (∑ α : BlockCoord d, + ∑ R ∈ D, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) := by + rw [Finset.sum_comm] + _ = + ∑ α : BlockCoord d, + (D.card : ℝ)⁻¹ * + ∑ R ∈ D, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a := by + rw [Finset.mul_sum] + +theorem integral_blockJTraceAverageWithNormalizers_eq_sum_originCube_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (child parent : ℕ) (hchild_parent : child ≤ parent) + (S T : FullBlockMat d) : + ∫ a, + blockJTraceAverageWithNormalizers S T + (originCube d (parent : ℤ)) (parent - child) a ∂P = + ∑ α : BlockCoord d, + Ch04.expectedBlockJCubeSet P (originCube d (child : ℤ)) + (fullBlockMatrixProbe S α).1 (fullBlockMatrixProbe T α).2 + (fullBlockMatrixProbe S α).2 (fullBlockMatrixProbe T α).1 := by + classical + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (parent : ℤ) + let j : ℕ := parent - child + have hscale_le : (child : ℤ) ≤ (parent : ℤ) := by + exact_mod_cast hchild_parent + have hdepth_scale : + descendantsAtDepth Q j = descendantsAtScale Q (child : ℤ) := by + simpa [Q, j, originCube] using + (descendantsAtScale_eq_descendantsAtDepth (originCube d (parent : ℤ)) + hscale_le).symm + have hdesc_int : + ∀ α : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a)) P := by + intro α + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hRscale : R ∈ descendantsAtScale Q (child : ℤ) := by + simpa [hdepth_scale] using hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale : R.scale = (child : ℤ) := scale_eq_of_mem_descendantsAtScale hRscale + rw [hscale] + exact_mod_cast Nat.zero_le child + have hmem := + memLp_two_blockJObservableCubeSetBlockVec_from_P4_of_stationary + hP hStruct hP4 R hR_nonneg + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) + exact hmem.integrable (by norm_num : (1 : ENNReal) ≤ 2) + calc + ∫ a, + blockJTraceAverageWithNormalizers S T + (originCube d (parent : ℤ)) (parent - child) a ∂P + = + ∫ a, + ∑ α : BlockCoord d, + descendantsAverage Q j + (fun R => + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) ∂P := by + apply integral_congr_ae + filter_upwards with a + simpa [Q, j] using + blockJTraceAverageWithNormalizers_eq_sum_descendantsAverage + S T Q j a + _ = + ∑ α : BlockCoord d, + ∫ a, + descendantsAverage Q j + (fun R => + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) ∂P := by + rw [MeasureTheory.integral_finsetSum] + intro α _hα + exact hdesc_int α + _ = + ∑ α : BlockCoord d, + Ch04.expectedBlockJCubeSet P (originCube d (child : ℤ)) + (fullBlockMatrixProbe S α).1 (fullBlockMatrixProbe T α).2 + (fullBlockMatrixProbe S α).2 (fullBlockMatrixProbe T α).1 := by + congr 1 + ext α + let Pα : BlockVec d := fullBlockMatrixProbe S α + let Qα : BlockVec d := fullBlockMatrixProbe T α + have hB : + ∀ R, R ∈ descendantsAtScale (originCube d (parent : ℤ)) (child : ℤ) → + Integrable + (Ch04.blockJObservableCubeSet R Pα.1 Qα.2 Pα.2 Qα.1) P := by + intro R hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale : R.scale = (child : ℤ) := + scale_eq_of_mem_descendantsAtScale hR + rw [hscale] + exact_mod_cast Nat.zero_le child + have hmem := + memLp_two_blockJObservableCubeSetBlockVec_from_P4_of_stationary + hP hStruct hP4 R hR_nonneg Pα Qα + simpa [blockJObservableCubeSetBlockVec, Pα, Qα] using + hmem.integrable (by norm_num : (1 : ENNReal) ≤ 2) + simpa [Q, j, Pα, Qα, blockJObservableCubeSetBlockVec] using + hP.integral_descendantsAverage_blockJObservableCubeSet_eq_originCube_of_stationary + hStruct.stationary hStruct.adjoint_invariant + (by exact_mod_cast Nat.zero_le child) hscale_le + Pα.1 Qα.2 Pα.2 Qα.1 hB + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceBudgetAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceBudgetAlgebra.lean new file mode 100644 index 0000000000..66714d9bd6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/TraceBudgetAlgebra.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastAssembly.TraceAveragePackaging +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.MatrixTools +public import Mathlib.Algebra.Order.Chebyshev + +/-! # Trace Budget Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.L2Operator + +noncomputable section + +namespace SmallContrastAssembly + +open Section54.VarianceBoundGoodScale + +theorem normalizedBlockJTraceAverage_eq_blockJTraceAverageWithNormalizers + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let S : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let T : FullBlockMat d := Matrix.diagonal (scalarFullBlockSqrtDiag b c) + normalizedBlockJTraceAverage hP hStruct center Q j a = + blockJTraceAverageWithNormalizers S T Q j a := by + intro b c S T + unfold normalizedBlockJTraceAverage blockJTraceAverageWithNormalizers + congr 1 + funext R + congr 1 + funext α + congr 1 <;> + simp [fullBlockMatrixProbe, normalizedInvSqrtBlockProbe, + normalizedSqrtBlockProbe, S, T, b, c] + +theorem blockJTraceAverageWithNormalizers_eq_traceBudget_descendantsAverageBlockMat + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + blockJTraceAverageWithNormalizers S T Q j a = + fullBlockJTraceBudgetWithNormalizers S T + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + have hJ : + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) = + blockJTraceAverageWithNormalizers S T Q j a := by + calc + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + = + descendantsAverage Q j + (fun R => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) := by + simpa [Pcell] using! + Ch02.descendantsDomainPartition_weightedAverage Q j + (fun R : TriadicCube d => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + _ = blockJTraceAverageWithNormalizers S T Q j a := by + unfold blockJTraceAverageWithNormalizers + congr 1 + funext R + refine Finset.sum_congr rfl ?_ + intro α _hα + rw [doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + ha R] + calc + blockJTraceAverageWithNormalizers S T Q j a + = Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) := hJ.symm + _ = + Pcell.weightedAverage + (fun i : Pcell.Cell => + fullBlockJTraceBudgetWithNormalizers S T + (Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := by + unfold Ch02.DomainPartition.weightedAverage + refine Finset.sum_congr rfl ?_ + intro i _hi + change + Pcell.weight i * + (∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) = + Pcell.weight i * + fullBlockJTraceBudgetWithNormalizers S T + (Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + have hbudget : + (∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) = + fullBlockJTraceBudgetWithNormalizers S T + (Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) := + sum_doubledResponseJ_fullBlockNormalizers_eq_traceBudget + (Pcell.cell i) (F.coeffOn i.1) S T + rw [hbudget] + _ = + fullBlockJTraceBudgetWithNormalizers S T + (Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := by + rw [fullBlockJTraceBudgetWithNormalizers_weightedBlockAverage] + _ = + fullBlockJTraceBudgetWithNormalizers S T + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + rw [hAvg] + +private theorem vecDot_indicator_self {d : ℕ} (i : Fin d) (r s : ℝ) : + vecDot (fun j => if j = i then r else 0) + (fun j => if j = i then s else 0) = + r * s := by + have h1 : + (fun j : Fin d => if j = i then r else 0) = + r • (Pi.single i 1 : Vec d) := by + funext j + by_cases h : j = i <;> simp [h, smul_eq_mul] + have h2 : + (fun j : Fin d => if j = i then s else 0) = + s • (Pi.single i 1 : Vec d) := by + funext j + by_cases h : j = i <;> simp [h, smul_eq_mul] + rw [h1, h2] + simp [vecDot_smul_left, vecDot_smul_right, vecDot_single_left] + ring + +private theorem fullBlockMatrixProbe_diagonal_dot + {d : ℕ} (r s : BlockCoord d → ℝ) (α : BlockCoord d) : + blockVecDot + (fullBlockMatrixProbe (Matrix.diagonal r) α) + (fullBlockMatrixProbe (Matrix.diagonal s) α) = + r α * s α := by + cases α with + | inl i => + simp [fullBlockMatrixProbe, ofFullBlockVec, Matrix.mulVec, Matrix.diagonal, + blockVecDot] + have hmain : + vecDot (fun j : Fin d => if j = i then r (Sum.inl j) else 0) + (fun j : Fin d => if j = i then s (Sum.inl j) else 0) = + r (Sum.inl i) * s (Sum.inl i) := by + convert vecDot_indicator_self i (r (Sum.inl i)) (s (Sum.inl i)) using 2 + · funext j + by_cases h : j = i <;> simp [h] + · funext j + by_cases h : j = i <;> simp [h] + rw [hmain] + simp [vecDot] + | inr i => + simp [fullBlockMatrixProbe, ofFullBlockVec, Matrix.mulVec, Matrix.diagonal, + blockVecDot] + have hmain : + vecDot (fun j : Fin d => if j = i then r (Sum.inr j) else 0) + (fun j : Fin d => if j = i then s (Sum.inr j) else 0) = + r (Sum.inr i) * s (Sum.inr i) := by + convert vecDot_indicator_self i (r (Sum.inr i)) (s (Sum.inr i)) using 2 + · funext j + by_cases h : j = i <;> simp [h] + · funext j + by_cases h : j = i <;> simp [h] + rw [hmain] + simp [vecDot] + +private theorem normalized_diagonal_probe_dot_eq_one + {d : ℕ} {b c : ℝ} (hb : 0 < b) (hc : 0 < c) (α : BlockCoord d) : + blockVecDot + (fullBlockMatrixProbe + (Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c)) α) + (fullBlockMatrixProbe + (Matrix.diagonal (scalarFullBlockSqrtDiag b c)) α) = + 1 := by + have hdot := + fullBlockMatrixProbe_diagonal_dot + (d := d) (Ch04.scalarFullBlockInvSqrtDiag b c) + (scalarFullBlockSqrtDiag b c) α + cases α with + | inl i => + calc + blockVecDot + (fullBlockMatrixProbe + (Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c)) (Sum.inl i)) + (fullBlockMatrixProbe + (Matrix.diagonal (scalarFullBlockSqrtDiag b c)) (Sum.inl i)) + = (√b)⁻¹ * √b := by + simpa [Ch04.scalarFullBlockInvSqrtDiag, scalarFullBlockSqrtDiag] using hdot + _ = 1 := inv_mul_cancel₀ (ne_of_gt ((Real.sqrt_pos).2 hb)) + | inr i => + calc + blockVecDot + (fullBlockMatrixProbe + (Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c)) (Sum.inr i)) + (fullBlockMatrixProbe + (Matrix.diagonal (scalarFullBlockSqrtDiag b c)) (Sum.inr i)) + = √c * (√c)⁻¹ := by + simpa [Ch04.scalarFullBlockInvSqrtDiag, scalarFullBlockSqrtDiag] using hdot + _ = 1 := mul_inv_cancel₀ (ne_of_gt ((Real.sqrt_pos).2 hc)) + +private theorem normalized_reflect_trace_eq_theta_trace + {d : ℕ} {b c : ℝ} (hb : 0 < b) (hc : 0 < c) (A : BlockMat d) : + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let T : FullBlockMat d := Matrix.diagonal (scalarFullBlockSqrtDiag b c) + let θ : ℝ := b * c⁻¹ + Ch02.fullBlockTrace (T * toFullBlockMat (blockReflect A) * T) = + θ * Ch02.fullBlockTrace (D * toFullBlockMat A * D) := by + intro D T θ + classical + unfold Ch02.fullBlockTrace + simp [D, T, θ, Ch04.scalarFullBlockInvSqrtDiag, scalarFullBlockSqrtDiag, + blockReflect, toFullBlockMat, Matrix.mul_apply, Matrix.diagonal] + have hsqrtb_sq : √b * √b = b := by simpa [sq] using Real.sq_sqrt hb.le + have hsqrtc_sq : √c * √c = c := by simpa [sq] using Real.sq_sqrt hc.le + have hsqrtb_ne : √b ≠ 0 := ne_of_gt ((Real.sqrt_pos).2 hb) + have hsqrtc_ne : √c ≠ 0 := ne_of_gt ((Real.sqrt_pos).2 hc) + have hinvb : (√b)⁻¹ * (√b)⁻¹ = b⁻¹ := by + field_simp [hsqrtb_ne] + simpa [sq] using hsqrtb_sq.symm + have hinvc : (√c)⁻¹ * (√c)⁻¹ = c⁻¹ := by + field_simp [hsqrtc_ne] + simpa [sq] using hsqrtc_sq.symm + have hL1 : (∑ x, √b * A.lowerRight x x * √b) = + ∑ x, b * A.lowerRight x x := by + refine Finset.sum_congr rfl ?_ + intro x _ + calc + √b * A.lowerRight x x * √b = (√b * √b) * A.lowerRight x x := by ring + _ = b * A.lowerRight x x := by rw [hsqrtb_sq] + have hL2 : (∑ x, (√c)⁻¹ * A.upperLeft x x * (√c)⁻¹) = + ∑ x, c⁻¹ * A.upperLeft x x := by + refine Finset.sum_congr rfl ?_ + intro x _ + calc + (√c)⁻¹ * A.upperLeft x x * (√c)⁻¹ = + ((√c)⁻¹ * (√c)⁻¹) * A.upperLeft x x := by ring + _ = c⁻¹ * A.upperLeft x x := by rw [hinvc] + have hR1 : (∑ x, (√b)⁻¹ * A.upperLeft x x * (√b)⁻¹) = + ∑ x, b⁻¹ * A.upperLeft x x := by + refine Finset.sum_congr rfl ?_ + intro x _ + calc + (√b)⁻¹ * A.upperLeft x x * (√b)⁻¹ = + ((√b)⁻¹ * (√b)⁻¹) * A.upperLeft x x := by ring + _ = b⁻¹ * A.upperLeft x x := by rw [hinvb] + have hR2 : (∑ x, √c * A.lowerRight x x * √c) = + ∑ x, c * A.lowerRight x x := by + refine Finset.sum_congr rfl ?_ + intro x _ + calc + √c * A.lowerRight x x * √c = (√c * √c) * A.lowerRight x x := by ring + _ = c * A.lowerRight x x := by rw [hsqrtc_sq] + rw [hL1, hL2, hR1, hR2] + have hbne : b ≠ 0 := ne_of_gt hb + have hcne : c ≠ 0 := ne_of_gt hc + rw [mul_add, Finset.mul_sum, Finset.mul_sum] + field_simp [hbne, hcne] + ring + +theorem fullBlockJTraceBudgetWithNormalizers_normalized_eq_trace + {d : ℕ} {b c : ℝ} (hb : 0 < b) (hc : 0 < c) (A : BlockMat d) : + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let T : FullBlockMat d := Matrix.diagonal (scalarFullBlockSqrtDiag b c) + let θ : ℝ := b * c⁻¹ + fullBlockJTraceBudgetWithNormalizers D T A = + ((1 + θ) / 2) * Ch02.fullBlockTrace (D * toFullBlockMat A * D) - + (Fintype.card (BlockCoord d) : ℝ) := by + intro D T θ + classical + have hDtrans : Matrix.transpose D = D := by + ext α β + by_cases h : α = β + · subst β + simp [D, Matrix.transpose_apply, Matrix.diagonal] + · have hba : β ≠ α := fun h' => h h'.symm + simp [D, Matrix.transpose_apply, Matrix.diagonal, h, hba] + have hTtrans : Matrix.transpose T = T := by + ext α β + by_cases h : α = β + · subst β + simp [T, Matrix.transpose_apply, Matrix.diagonal] + · have hba : β ≠ α := fun h' => h h'.symm + simp [T, Matrix.transpose_apply, Matrix.diagonal, h, hba] + have hfirst : + (∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe D α) + (blockMatVecMul A (fullBlockMatrixProbe D α))) = + Ch02.fullBlockTrace (D * toFullBlockMat A * D) := by + simpa [hDtrans] using + (fullBlockTrace_transpose_mul_mul_eq_sum_blockVecDot D (toFullBlockMat A)).symm + have hsecond : + (∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe T α) + (blockMatVecMul (blockReflect A) (fullBlockMatrixProbe T α))) = + Ch02.fullBlockTrace (T * toFullBlockMat (blockReflect A) * T) := by + simpa [hTtrans] using + (fullBlockTrace_transpose_mul_mul_eq_sum_blockVecDot T + (toFullBlockMat (blockReflect A))).symm + have hpair : + (∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe D α) (fullBlockMatrixProbe T α)) = + (Fintype.card (BlockCoord d) : ℝ) := by + calc + (∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe D α) (fullBlockMatrixProbe T α)) + = ∑ _α : BlockCoord d, (1 : ℝ) := by + refine Finset.sum_congr rfl ?_ + intro α _hα + simpa [D, T] using normalized_diagonal_probe_dot_eq_one hb hc α + _ = (Fintype.card (BlockCoord d) : ℝ) := by simp + have hreflect := + normalized_reflect_trace_eq_theta_trace (d := d) hb hc A + have hreflect' : + Ch02.fullBlockTrace (T * toFullBlockMat (blockReflect A) * T) = + θ * Ch02.fullBlockTrace (D * toFullBlockMat A * D) := by + simpa [D, T, θ] using hreflect + unfold fullBlockJTraceBudgetWithNormalizers + rw [Finset.sum_sub_distrib, Finset.sum_add_distrib] + rw [← Finset.mul_sum, ← Finset.mul_sum] + rw [hfirst, hsecond, hpair] + rw [hreflect'] + ring + +theorem descendantsAverageNormalizedFluctuationMatrix_eq_diagonal_average_sub_annealed + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a = + D * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center)) * + D := by + intro b c D + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) + let F : TriadicCube d → FullBlockMat d := + fun R => toFullBlockMat (coarseBlockMatrix (cubeSet R) a.toFun) + have hAvg : + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a = + D * (descendantsAverageFullBlockMat Q j F - Abar) * D := by + simpa [descendantsAverageNormalizedFluctuationMatrix, F, Abar, + fullBlockNormalizedFluctuationMatrix, D, b, c] using + descendantsAverageFullBlockMat_diagonal_sub_const_mul_diagonal + (Q := Q) (j := j) D Abar F + calc + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a + = D * (descendantsAverageFullBlockMat Q j F - Abar) * D := hAvg + _ = + D * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center)) * + D := by + rw [toFullBlockMat_descendantsAverageBlockMat] + +theorem fullBlockTrace_sq_le_card_sq_operatorNormSq + {d : ℕ} [NeZero d] (M : FullBlockMat d) : + Ch02.fullBlockTrace M ^ (2 : ℕ) ≤ + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + classical + let f : BlockCoord d → ℝ := fun α => + fullBlockQuadratic M (fullBlockCoordinateProbe α) + have htrace_eq : Ch02.fullBlockTrace M = ∑ α : BlockCoord d, f α := by + simp [Ch02.fullBlockTrace, f, fullBlockQuadratic_coordinateProbe] + have hsum : + (∑ α : BlockCoord d, f α) ^ (2 : ℕ) ≤ + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, f α ^ (2 : ℕ) := by + simpa using + (sq_sum_le_card_mul_sum_sq (s := (Finset.univ : Finset (BlockCoord d))) + (f := f)) + have hterm : + ∀ α : BlockCoord d, + f α ^ (2 : ℕ) ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + intro α + have hquad := + fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq + M (fullBlockCoordinateProbe α) + have habs_sq : + f α ^ (2 : ℕ) = |f α| ^ (2 : ℕ) := by + rw [sq_abs] + have hdot : + dotProduct (fullBlockCoordinateProbe α) (fullBlockCoordinateProbe α) = 1 := by + rw [← fullBlockQuadratic_one] + simp + rw [habs_sq] + simpa [f, hdot] using hquad + calc + Ch02.fullBlockTrace M ^ (2 : ℕ) + = (∑ α : BlockCoord d, f α) ^ (2 : ℕ) := by rw [htrace_eq] + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, f α ^ (2 : ℕ) := hsum + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + ∑ _α : BlockCoord d, + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + exact mul_le_mul_of_nonneg_left + (Finset.sum_le_sum fun α _hα => hterm α) (Nat.cast_nonneg _) + _ = + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + simp + ring + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/WeightedGeometricSummation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/WeightedGeometricSummation.lean new file mode 100644 index 0000000000..1d3a4051ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastAssembly/WeightedGeometricSummation.lean @@ -0,0 +1,362 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.GeometricSum +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Preliminaries + +/-! # Weighted Geometric Summation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +noncomputable section + +namespace SmallContrastAssembly + +open Section53.JUpperBoundCoarseFluctuations +open Section54.VarianceBoundGoodScale + +/-! +# Weighted geometric summations for the Section 5.6 assembly step + +These are the deterministic summation estimates used to convert the +beta-weighted scale-by-scale bounds in the small-contrast iteration into the +manuscript-style geometric tail at the bottom scale. +-/ + +/-- Constant for summing the spatial decay tail `3^{-d r}`. -/ +noncomputable def weightedScaleDecaySumConst (d : ℕ) : ℝ := + (geometricDiscount (d : ℝ) 1)⁻¹ + +/-- Constant for summing the beta weights attached to the coarse-fluctuation +iteration. -/ +noncomputable def weightedBetaSumConst (β : ℝ) : ℝ := + (geometricDiscount β 1)⁻¹ + +/-- Parameter-only beta-weight summation constant. -/ +noncomputable def weightedBetaSumConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + weightedBetaSumConst (section53CoarseFluctuationBetaParams params) + +/-- Parameter-only constant for the deterministic tau-sum compression. -/ +noncomputable def coarseFluctuationTauSumConstParams {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + 5 * (section53CoarseFluctuationBetaParams params)⁻¹ + +theorem weightedScaleDecaySumConst_pos {d : ℕ} [NeZero d] : + 0 < weightedScaleDecaySumConst d := by + dsimp [weightedScaleDecaySumConst] + have hd_nat : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hd : 0 < (d : ℝ) := by exact_mod_cast hd_nat + exact inv_pos.mpr (geometricDiscount_pos (by simpa using hd)) + +theorem weightedScaleDecaySumConst_nonneg {d : ℕ} [NeZero d] : + 0 ≤ weightedScaleDecaySumConst d := + (weightedScaleDecaySumConst_pos (d := d)).le + +theorem weightedBetaSumConst_pos {β : ℝ} (hβ : 0 < β) : + 0 < weightedBetaSumConst β := by + dsimp [weightedBetaSumConst] + exact inv_pos.mpr (geometricDiscount_pos (by simpa using hβ)) + +theorem weightedBetaSumConst_nonneg {β : ℝ} (hβ : 0 < β) : + 0 ≤ weightedBetaSumConst β := + (weightedBetaSumConst_pos hβ).le + +theorem weightedBetaSumConstParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < weightedBetaSumConstParams params := by + dsimp [weightedBetaSumConstParams] + exact weightedBetaSumConst_pos (section53CoarseFluctuationBetaParams_pos params) + +theorem coarseFluctuationTauSumConstParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < coarseFluctuationTauSumConstParams params := by + dsimp [coarseFluctuationTauSumConstParams] + exact mul_pos (by norm_num) + (inv_pos.mpr (section53CoarseFluctuationBetaParams_pos params)) + +/-- A shifted finite tail of `3^{-α r}` is bounded by the full geometric +series. -/ +theorem sum_Icc_shifted_rpow_decay_le_inv_geometricDiscount {α : ℝ} + (hα : 0 < α) (k m : ℕ) : + (∑ j ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-α * ((j - k : ℕ) : ℝ))) ≤ + (geometricDiscount α 1)⁻¹ := by + classical + let f : ℕ → ℝ := fun r => Real.rpow (3 : ℝ) (-α * (r : ℝ)) + let s : Finset ℕ := (Finset.Icc (k + 1) m).image fun j => j - k + have hinj : Set.InjOn (fun j => j - k) (Finset.Icc (k + 1) m) := by + intro a ha b hb hab + have ha' : a ∈ Finset.Icc (k + 1) m := by simpa using ha + have hb' : b ∈ Finset.Icc (k + 1) m := by simpa using hb + have ha_ge : k ≤ a := by + have h := (Finset.mem_Icc.mp ha').1 + omega + have hb_ge : k ≤ b := by + have h := (Finset.mem_Icc.mp hb').1 + omega + have hab' : a - k = b - k := by simpa using hab + calc + a = (a - k) + k := (Nat.sub_add_cancel ha_ge).symm + _ = (b - k) + k := by rw [hab'] + _ = b := Nat.sub_add_cancel hb_ge + have hsum_image : + (∑ j ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-α * ((j - k : ℕ) : ℝ))) = + ∑ r ∈ s, f r := by + calc + (∑ j ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-α * ((j - k : ℕ) : ℝ))) = + ∑ j ∈ Finset.Icc (k + 1) m, f (j - k) := by + simp [f] + _ = ∑ r ∈ s, f r := by + simpa [s] using + (Finset.sum_image (s := Finset.Icc (k + 1) m) + (g := fun j => j - k) (f := f) hinj).symm + have hsummable : Summable f := + Section52.summable_rpow_three_neg_mul_nat hα + rw [hsum_image] + calc + (∑ r ∈ s, f r) ≤ ∑' r : ℕ, f r := + hsummable.sum_le_tsum s + (fun r _hr => Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = (geometricDiscount α 1)⁻¹ := by + simpa [f] using + Section52.tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hα + +/-- The shifted beta-weight sum over `j = k + 1, ..., m` is bounded by the +full beta geometric tail. -/ +theorem sum_Icc_shifted_varianceWeight_le_inv_geometricDiscount {β : ℝ} + (hβ : 0 < β) (k m : ℕ) : + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) ≤ + weightedBetaSumConst β := by + classical + let f : ℕ → ℝ := fun r => Real.rpow (3 : ℝ) (-β * (r : ℝ)) + let s : Finset ℕ := (Finset.Icc (k + 1) m).image fun j => m - j + have hinj : Set.InjOn (fun j => m - j) (Finset.Icc (k + 1) m) := by + intro a ha b hb hab + have ha_le : a ≤ m := (Finset.mem_Icc.mp ha).2 + have hb_le : b ≤ m := (Finset.mem_Icc.mp hb).2 + exact (tsub_right_inj ha_le hb_le).1 hab + have hsum_image : + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) = + ∑ r ∈ s, f r := by + calc + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) = + ∑ j ∈ Finset.Icc (k + 1) m, f (m - j) := by + simp [f, varianceWeight] + _ = ∑ r ∈ s, f r := by + simpa [s] using + (Finset.sum_image (s := Finset.Icc (k + 1) m) + (g := fun j => m - j) (f := f) hinj).symm + have hsummable : Summable f := + Section52.summable_rpow_three_neg_mul_nat hβ + rw [hsum_image] + dsimp [weightedBetaSumConst] + calc + (∑ r ∈ s, f r) ≤ ∑' r : ℕ, f r := + hsummable.sum_le_tsum s + (fun r _hr => Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = (geometricDiscount β 1)⁻¹ := by + simpa [f] using + Section52.tsum_rpow_three_neg_mul_nat_eq_inv_geometricDiscount hβ + +/-- The spatially decaying term in the fluctuation budget sums to the bottom +scale `3^{-d(k-ell)}` up to a dimension-only constant. -/ +theorem sum_Icc_varianceWeight_mul_scaleDecay_le_const + {β : ℝ} (hβ_nonneg : 0 ≤ β) {d : ℕ} [NeZero d] + {ell k m : ℕ} (hellk : ell ≤ k) : + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) ≤ + weightedScaleDecaySumConst d * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) := by + classical + let baseDecay : ℝ := + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + let tail : ℕ → ℝ := fun r => + Real.rpow (3 : ℝ) (-(d : ℝ) * (r : ℝ)) + have hbase_nonneg : 0 ≤ baseDecay := by + dsimp [baseDecay] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hd_nat : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hd : 0 < (d : ℝ) := by exact_mod_cast hd_nat + have htail_sum : + (∑ j ∈ Finset.Icc (k + 1) m, tail (j - k)) ≤ + weightedScaleDecaySumConst d := by + simpa [tail, weightedScaleDecaySumConst] using + sum_Icc_shifted_rpow_decay_le_inv_geometricDiscount (α := (d : ℝ)) hd k m + have hpoint : + ∀ j, j ∈ Finset.Icc (k + 1) m → + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) ≤ + baseDecay * tail (j - k) := by + intro j hj + have hj_ge : k ≤ j := by + have h := (Finset.mem_Icc.mp hj).1 + omega + have hsub : j - ell = (k - ell) + (j - k) := by omega + have hexp : + -(d : ℝ) * ((j - ell : ℕ) : ℝ) = + -(d : ℝ) * ((k - ell : ℕ) : ℝ) + + (-(d : ℝ) * ((j - k : ℕ) : ℝ)) := by + rw [hsub, Nat.cast_add] + ring + have hdecay_eq : + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) = + baseDecay * tail (j - k) := by + dsimp [baseDecay, tail] + rw [hexp] + rw [Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + have hweight_le_one : varianceWeight β m j ≤ 1 := by + unfold varianceWeight + have hdist_nonneg : 0 ≤ ((m - j : ℕ) : ℝ) := by exact_mod_cast Nat.zero_le (m - j) + have hexp_nonpos : -β * ((m - j : ℕ) : ℝ) ≤ 0 := by nlinarith + exact Real.rpow_le_one_of_one_le_of_nonpos (by norm_num : (1 : ℝ) ≤ 3) hexp_nonpos + have hdecay_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + ≤ 1 * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) := + mul_le_mul_of_nonneg_right hweight_le_one hdecay_nonneg + _ = baseDecay * tail (j - k) := by rw [one_mul, hdecay_eq] + calc + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) ≤ + ∑ j ∈ Finset.Icc (k + 1) m, baseDecay * tail (j - k) := + Finset.sum_le_sum hpoint + _ = baseDecay * ∑ j ∈ Finset.Icc (k + 1) m, tail (j - k) := by + rw [Finset.mul_sum] + _ ≤ baseDecay * weightedScaleDecaySumConst d := + mul_le_mul_of_nonneg_left htail_sum hbase_nonneg + _ = weightedScaleDecaySumConst d * baseDecay := by ring + +/-- Weighted summation of a geometric contribution plus a nonnegative constant +contribution. -/ +theorem sum_Icc_varianceWeight_mul_geometric_add_const_le + {β A B : ℝ} (hβ : 0 < β) {d : ℕ} [NeZero d] + {ell k m : ℕ} (hellk : ell ≤ k) + (hA_nonneg : 0 ≤ A) (hB_nonneg : 0 ≤ B) : + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + B)) ≤ + A * weightedScaleDecaySumConst d * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) + + weightedBetaSumConst β * B := by + classical + have hscale : + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) ≤ + weightedScaleDecaySumConst d * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) := + sum_Icc_varianceWeight_mul_scaleDecay_le_const (β := β) hβ.le hellk + have hweight : + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) ≤ + weightedBetaSumConst β := + sum_Icc_shifted_varianceWeight_le_inv_geometricDiscount hβ k m + have hleft_eq : + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + B)) = + A * + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) + + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) * B := by + let D : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + have htermA : + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * (A * D j)) = + A * (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * D j) := by + calc + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * (A * D j)) = + ∑ j ∈ Finset.Icc (k + 1) m, A * (varianceWeight β m j * D j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = A * (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * D j) := by + rw [Finset.mul_sum] + have htermB : + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * B) = + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) * B := by + rw [Finset.sum_mul] + calc + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + (A * Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ)) + B)) = + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * (A * D j)) + + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j * B) := by + simp [D, mul_add, Finset.sum_add_distrib] + _ = + A * + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) + + (∑ j ∈ Finset.Icc (k + 1) m, varianceWeight β m j) * B := by + rw [htermA, htermB] + rw [hleft_eq] + exact add_le_add + (by + calc + A * + (∑ j ∈ Finset.Icc (k + 1) m, + varianceWeight β m j * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((j - ell : ℕ) : ℝ))) + ≤ A * + (weightedScaleDecaySumConst d * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ))) := + mul_le_mul_of_nonneg_left hscale hA_nonneg + _ = A * weightedScaleDecaySumConst d * + Real.rpow (3 : ℝ) (-(d : ℝ) * ((k - ell : ℕ) : ℝ)) := by ring) + (mul_le_mul_of_nonneg_right hweight hB_nonneg) + +/-- Parameter-dependent version of the deterministic tau-sum compression. The +constant depends on the quantitative ellipticity package, not on the law. -/ +theorem coarseFluctuationTauSumAtScale_le_const_tauAtScale_of_params + {d : ℕ} [NeZero d] (params : QuantitativeCoarseGrainedEllipticityParams d) + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hparams : hP4.params = params) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e ≤ + coarseFluctuationTauSumConstParams params * + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + dsimp only + have hraw := + coarseFluctuationTauSumAtScale_le_five_beta_inv_tauAtScale + hP hstat hStruct hP4 hkm e + have hβeq : + section53CoarseFluctuationBeta hP4 = + section53CoarseFluctuationBetaParams params := by + rw [← section53CoarseFluctuationBetaParams_eq_of_P4 hP4, hparams] + simpa [coarseFluctuationTauSumConstParams, hβeq] using hraw + +end SmallContrastAssembly + +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound.lean new file mode 100644 index 0000000000..a0e301eb35 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Estimate + +/-! # Small Contrast JBound -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +/-! +# Section 5.6: small-contrast coarse-fluctuation iteration + +This module re-exports the split proof of `l.small.contrast.Jbound`. +-/ + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Estimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Estimate.lean new file mode 100644 index 0000000000..052831cf52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Estimate.lean @@ -0,0 +1,578 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.SmallContrastJBound.Preliminaries + +/-! # Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +noncomputable section + +open Section53.JUpperBoundCoarseFluctuations + +theorem expectedResponseJCubeSet_special_le_two_smallContrastReducedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (C0 η : ℝ) (hC0_nonneg : 0 ≤ C0) + (hC0_eta_le_quarter : 2 * C0 * η ≤ 1 / 4) + {k m : ℕ} (hkm : k < m) (e : Vec d) (he : vecNormSq e = 1) + (hyoung : + expectedCenteredResponseJAtScale hP hStruct (m : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) ≤ + coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C0 1 η k m e) + (hlow_coeff : + 32 * C0 * (section53CoarseFluctuationBeta hP4 ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * (((m - k : ℕ) : ℝ))) ≤ + 1 / 4) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + 2 * smallContrastReducedRHSAtScale hP hStruct hP4 C0 η k m e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let J := Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e + let Jk := Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e + let tau := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + let F := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let tauSum := coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let scalar := coarseFluctuationScalarWeightAtScale hP hStruct m + let U := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let Rm := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let D1 := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let D2 := Real.rpow (3 : ℝ) (-2 * β * (((m - k : ℕ) : ℝ))) + let Center := (Real.sqrt θ - 1) ^ (2 : ℕ) + let ThetaSq := (θ - 1) ^ (2 : ℕ) + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_ne : β ≠ 0 := hβ_pos.ne' + have hkm_le : k ≤ m := hkm.le + have hraw_center : + J ≤ 2 * expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := by + simpa [J, p_e, q_e] using + expectedResponseJCubeSet_special_le_two_expectedCenteredResponseJAtScale + hP hStruct hP4 m e he + have hraw_young : + J ≤ + 2 * coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C0 1 η k m e := by + calc + J ≤ 2 * expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := + hraw_center + _ ≤ 2 * coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C0 1 η k m e := + mul_le_mul_of_nonneg_left + (by simpa [p_e, q_e] using hyoung) (by norm_num) + have hJ_nonneg : 0 ≤ J := by + dsimp [J, Ch04.expectedResponseJCubeSet] + exact integral_nonneg fun a => + Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (m : ℤ)) p_e q_e a + have htau_nonneg : 0 ≤ tau := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm_le + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm_int hR hBlockK + simpa [tau] using + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm_int p_e q_e hBlockM hDescBlock + have hF_nonneg : 0 ≤ F := by + simpa [F] using + coarseFluctuationFullBlockSumAtScale_nonneg hP hStruct hP4 k m + have htauSum_nonneg : 0 ≤ tauSum := by + simpa [tauSum] using + coarseFluctuationTauSumAtScale_nonneg hP hstat hStruct hP4 k m e + have hscalar_nonneg : 0 ≤ scalar := by + simpa [scalar] using + coarseFluctuationScalarWeightAtScale_nonneg hP hStruct hP4 m + have hD1_nonneg : 0 ≤ D1 := by + dsimp [D1] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hD2_nonneg : 0 ≤ D2 := by + dsimp [D2] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hθ_two : θ ≤ 2 := by + simpa [θ] using + thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + hP hStruct hP4 hsmall m + have hθ_minus_nonneg : 0 ≤ θ - 1 := by linarith + have hCenter_le_ThetaSq : Center ≤ ThetaSq := by + simpa [Center, ThetaSq, θ] using sqrt_sub_one_sq_le_theta_sub_one_sq hθ_one + have hscalar_le : scalar ≤ 4 := by + simpa [scalar] using + coarseFluctuationScalarWeightAtScale_le_four_of_smallContrast + hP hStruct hP4 hsmall m + have htauSum_le : tauSum ≤ 5 * β⁻¹ * tau := by + simpa [tauSum, tau, β, p_e, q_e] using + coarseFluctuationTauSumAtScale_le_five_beta_inv_tauAtScale + hP hstat hStruct hP4 hkm_le e + have hUR_le : U * Rm ≤ 16 := by + simpa [U, Rm] using + coarseFluctuationUnitMomentWeight_mul_responseMoment_le_sixteen_of_smallContrast + hP hstat hStruct hP4 hsmall hkm_le e he + have hUR_nonneg : 0 ≤ U * Rm := by + exact mul_nonneg + (coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m) + (coarseFluctuationResponseMomentAtScale_nonneg hP hStruct hP4 k m e) + have hJ_lower : + (1 / 4 : ℝ) * (θ - 1) ≤ J := by + simpa [J, θ, p_e, q_e] using + expectedResponseJCubeSet_special_ge_quarter_theta_sub_one + hP hStruct hP4 hsmall m e he + have hθ_minus_le_J : θ - 1 ≤ 4 * J := by nlinarith + have hJk_eq : Jk = J + tau := by + simpa [Jk, J, tau, p_e, q_e] using + expectedResponseJCubeSet_origin_eq_origin_add_tauAtScale + P (m : ℤ) (k : ℤ) p_e q_e + have hfirst : + 2 * (C0 * (η * Jk + η⁻¹ * tau)) ≤ + (1 / 4 : ℝ) * J + 2 * C0 * (η + η⁻¹) * tau := by + have hJpart : 2 * C0 * η * J ≤ (1 / 4 : ℝ) * J := + mul_le_mul_of_nonneg_right hC0_eta_le_quarter hJ_nonneg + rw [hJk_eq] + nlinarith + have hfluct : + 2 * (C0 * β⁻¹ * θ * F) ≤ 4 * C0 * β⁻¹ * F := by + have hcoeff_nonneg : 0 ≤ 2 * C0 * β⁻¹ * F := by + exact mul_nonneg (mul_nonneg (mul_nonneg (by positivity) hC0_nonneg) + (inv_nonneg.mpr hβ_pos.le)) hF_nonneg + calc + 2 * (C0 * β⁻¹ * θ * F) = + (2 * C0 * β⁻¹ * F) * θ := by ring + _ ≤ (2 * C0 * β⁻¹ * F) * 2 := + mul_le_mul_of_nonneg_left hθ_two hcoeff_nonneg + _ = 4 * C0 * β⁻¹ * F := by ring + have htau_sum_term : + 2 * (C0 * (β ^ 2)⁻¹ * scalar * tauSum) ≤ + 40 * C0 * (β ^ 3)⁻¹ * tau := by + have hscalar_tau : + scalar * tauSum ≤ 20 * β⁻¹ * tau := by + calc + scalar * tauSum ≤ 4 * tauSum := + mul_le_mul_of_nonneg_right hscalar_le htauSum_nonneg + _ ≤ 4 * (5 * β⁻¹ * tau) := + mul_le_mul_of_nonneg_left htauSum_le (by norm_num) + _ = 20 * β⁻¹ * tau := by ring + have hcoeff_nonneg : 0 ≤ 2 * C0 * (β ^ 2)⁻¹ := by + exact mul_nonneg (mul_nonneg (by positivity) hC0_nonneg) + (inv_nonneg.mpr (sq_nonneg β)) + calc + 2 * (C0 * (β ^ 2)⁻¹ * scalar * tauSum) = + (2 * C0 * (β ^ 2)⁻¹) * (scalar * tauSum) := by ring + _ ≤ (2 * C0 * (β ^ 2)⁻¹) * (20 * β⁻¹ * tau) := + mul_le_mul_of_nonneg_left hscalar_tau hcoeff_nonneg + _ = 40 * C0 * (β ^ 3)⁻¹ * tau := by + field_simp [hβ_ne] + ring + have hresponse_term : + 2 * (C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 * U * Rm) ≤ + 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 := by + have hcoeff_nonneg : + 0 ≤ 2 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by positivity) hC0_nonneg) + (by exact_mod_cast Nat.zero_le hP4.xi)) + (inv_nonneg.mpr (pow_nonneg hβ_pos.le 3))) + hD1_nonneg + calc + 2 * (C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 * U * Rm) = + (2 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1) * (U * Rm) := by ring + _ ≤ (2 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1) * 16 := + mul_le_mul_of_nonneg_left hUR_le hcoeff_nonneg + _ = 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 := by ring + have hlow : + 2 * (C0 * (β ^ 2)⁻¹ * D2 * scalar * (θ - 1)) ≤ + (1 / 4 : ℝ) * J := by + have hlow_coeff' : + 32 * C0 * (β ^ 2)⁻¹ * D2 ≤ 1 / 4 := by + simpa [β, D2] using hlow_coeff + have hscalar_theta : scalar * (θ - 1) ≤ 16 * J := by + calc + scalar * (θ - 1) ≤ 4 * (θ - 1) := + mul_le_mul_of_nonneg_right hscalar_le hθ_minus_nonneg + _ ≤ 4 * (4 * J) := + mul_le_mul_of_nonneg_left hθ_minus_le_J (by norm_num) + _ = 16 * J := by ring + have hcoeff_nonneg : 0 ≤ 2 * C0 * (β ^ 2)⁻¹ * D2 := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) hC0_nonneg) + (inv_nonneg.mpr (sq_nonneg β))) hD2_nonneg + calc + 2 * (C0 * (β ^ 2)⁻¹ * D2 * scalar * (θ - 1)) = + (2 * C0 * (β ^ 2)⁻¹ * D2) * (scalar * (θ - 1)) := by ring + _ ≤ (2 * C0 * (β ^ 2)⁻¹ * D2) * (16 * J) := + mul_le_mul_of_nonneg_left hscalar_theta hcoeff_nonneg + _ = (32 * C0 * (β ^ 2)⁻¹ * D2) * J := by ring + _ ≤ (1 / 4 : ℝ) * J := + mul_le_mul_of_nonneg_right hlow_coeff' hJ_nonneg + let tauTerm1 : ℝ := 2 * C0 * (η + η⁻¹) * tau + let thetaTerm : ℝ := 2 * C0 * ThetaSq + let fluctTerm : ℝ := 4 * C0 * β⁻¹ * F + let tauTerm2 : ℝ := 40 * C0 * (β ^ 3)⁻¹ * tau + let tailTerm : ℝ := 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 + let reducedBound : ℝ := + fluctTerm + (tauTerm1 + tauTerm2) + tailTerm + thetaTerm + have hJ_le_reduced : J ≤ 2 * reducedBound := by + have hcenter : + 2 * (C0 * Center) ≤ 2 * C0 * ThetaSq := by + calc + 2 * (C0 * Center) = (2 * C0) * Center := by ring + _ ≤ (2 * C0) * ThetaSq := + mul_le_mul_of_nonneg_left hCenter_le_ThetaSq + (mul_nonneg (by norm_num) hC0_nonneg) + _ = 2 * C0 * ThetaSq := by ring + have hT1 : + 2 * + (C0 * + (η * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + + η⁻¹ * + tauAtScale P (m : ℤ) (k : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e))) ≤ + (1 / 4 : ℝ) * J + tauTerm1 := by + change 2 * (C0 * (η * Jk + η⁻¹ * tau)) ≤ + (1 / 4 : ℝ) * J + 2 * C0 * (η + η⁻¹) * tau + exact hfirst + have hT2 : + 2 * + (C0 * + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ + (2 : ℕ)) ≤ thetaTerm := by + change 2 * (C0 * Center) ≤ 2 * C0 * ThetaSq + exact hcenter + have hT3 : + 2 * + (C0 * (section53CoarseFluctuationBeta hP4)⁻¹ * + thetaAtScale hP hStruct (m : ℤ) * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) ≤ + fluctTerm := by + change 2 * (C0 * β⁻¹ * θ * F) ≤ 4 * C0 * β⁻¹ * F + exact hfluct + have hT4 : + 2 * + (C0 * ((section53CoarseFluctuationBeta hP4) ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) ≤ + tauTerm2 := by + change 2 * (C0 * (β ^ 2)⁻¹ * scalar * tauSum) ≤ + 40 * C0 * (β ^ 3)⁻¹ * tau + exact htau_sum_term + have hT5 : + 2 * + (C0 * (hP4.xi : ℝ) * + ((section53CoarseFluctuationBeta hP4) ^ 3)⁻¹ * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) ≤ + tailTerm := by + change 2 * (C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 * U * Rm) ≤ + 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 + exact hresponse_term + have hT6 : + 2 * + (C0 * ((section53CoarseFluctuationBeta hP4) ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * + (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (thetaAtScale hP hStruct (m : ℤ) - 1)) ≤ + (1 / 4 : ℝ) * J := by + change 2 * (C0 * (β ^ 2)⁻¹ * D2 * scalar * (θ - 1)) ≤ + (1 / 4 : ℝ) * J + exact hlow + have hYsum : + 2 * coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C0 1 η k m e ≤ + ((1 / 4 : ℝ) * J + tauTerm1) + thetaTerm + fluctTerm + + tauTerm2 + tailTerm + (1 / 4 : ℝ) * J := by + exact + young_rhs_two_mul_le_sum_of_term_bounds hP hStruct hP4 C0 η k m e + ((1 / 4 : ℝ) * J + tauTerm1) thetaTerm fluctTerm tauTerm2 + tailTerm ((1 / 4 : ℝ) * J) hT1 hT2 hT3 hT4 hT5 hT6 + change J ≤ + 2 * (fluctTerm + (tauTerm1 + tauTerm2) + tailTerm + thetaTerm) + exact absorb_quarter_terms (hraw_young.trans hYsum) + change J ≤ + 2 * + (4 * C0 * β⁻¹ * F + + (2 * C0 * (η + η⁻¹) * tau + 40 * C0 * (β ^ 3)⁻¹ * tau) + + 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 + + 2 * C0 * ThetaSq) + exact hJ_le_reduced + +theorem two_smallContrastReducedRHSAtScale_le_smallContrastFinalRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C0 η C : ℝ) {k m : ℕ} (hkm : k ≤ m) (e : Vec d) + (hKfluct : + 8 * C0 * (section53CoarseFluctuationBeta hP4)⁻¹ ≤ C) + (hKtau : + 4 * C0 * (η + η⁻¹) + + 80 * C0 * ((section53CoarseFluctuationBeta hP4) ^ 3)⁻¹ ≤ C) + (hKtail : + 64 * C0 * (hP4.xi : ℝ) * + ((section53CoarseFluctuationBeta hP4) ^ 3)⁻¹ ≤ C) + (hKtheta : 4 * C0 ≤ C) : + 2 * smallContrastReducedRHSAtScale hP hStruct hP4 C0 η k m e ≤ + smallContrastFinalRHSAtScale hP hStruct hP4 C k m e := by + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let tau := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + let F := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let D1 := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let ThetaSq := (thetaAtScale hP hStruct (m : ℤ) - 1) ^ (2 : ℕ) + have hF_nonneg : 0 ≤ F := by + simpa [F] using + coarseFluctuationFullBlockSumAtScale_nonneg hP hStruct hP4 k m + have htau_nonneg : 0 ≤ tau := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm_int hR hBlockK + simpa [tau] using + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm_int p_e q_e hBlockM hDescBlock + have hD1_nonneg : 0 ≤ D1 := by + dsimp [D1] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hThetaSq_nonneg : 0 ≤ ThetaSq := by + dsimp [ThetaSq] + exact sq_nonneg _ + have hFterm : + 2 * (4 * C0 * β⁻¹ * F) ≤ C * F := by + calc + 2 * (4 * C0 * β⁻¹ * F) = (8 * C0 * β⁻¹) * F := by ring + _ ≤ C * F := mul_le_mul_of_nonneg_right (by simpa [β] using hKfluct) hF_nonneg + have htterm : + 2 * (2 * C0 * (η + η⁻¹) * tau + + 40 * C0 * (β ^ 3)⁻¹ * tau) ≤ C * tau := by + calc + 2 * (2 * C0 * (η + η⁻¹) * tau + + 40 * C0 * (β ^ 3)⁻¹ * tau) = + (4 * C0 * (η + η⁻¹) + 80 * C0 * (β ^ 3)⁻¹) * tau := by ring + _ ≤ C * tau := + mul_le_mul_of_nonneg_right (by simpa [β] using hKtau) htau_nonneg + have hdterm : + 2 * (32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1) ≤ C * D1 := by + calc + 2 * (32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1) = + (64 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹) * D1 := by ring + _ ≤ C * D1 := + mul_le_mul_of_nonneg_right (by simpa [β] using hKtail) hD1_nonneg + have hqterm : + 2 * (2 * C0 * ThetaSq) ≤ C * ThetaSq := by + calc + 2 * (2 * C0 * ThetaSq) = (4 * C0) * ThetaSq := by ring + _ ≤ C * ThetaSq := mul_le_mul_of_nonneg_right hKtheta hThetaSq_nonneg + change + 2 * + (4 * C0 * β⁻¹ * F + + (2 * C0 * (η + η⁻¹) * tau + 40 * C0 * (β ^ 3)⁻¹ * tau) + + 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * D1 + + 2 * C0 * ThetaSq) ≤ + C * F + C * tau + C * D1 + C * ThetaSq + nlinarith [hFterm, htterm, hdterm, hqterm] + +theorem smallContrastJBound_homogenizationScale + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (_hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P), + hP4.params = params → + widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2 → + ∀ e : Vec d, vecNormSq e = 1 → + ∀ {k m : ℕ}, C ≤ ((m - k : ℕ) : ℝ) → + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + smallContrastFinalRHSAtScale hP hStruct hP4 C k m e := by + rcases + JUpperBoundCoarseFluctuations_young_homogenizationScale params with + ⟨C0, hC0_nonneg, hC0⟩ + let βp := section53CoarseFluctuationBetaParams params + let η : ℝ := (8 * (C0 + 1))⁻¹ + let Aabs : ℝ := 32 * C0 * (βp ^ 2)⁻¹ + have hβp_pos : 0 < βp := by + simpa [βp] using section53CoarseFluctuationBetaParams_pos params + have hAabs_nonneg : 0 ≤ Aabs := by + dsimp [Aabs] + exact mul_nonneg (mul_nonneg (by positivity) hC0_nonneg) + (inv_nonneg.mpr (sq_nonneg βp)) + rcases exists_decay_absorption_const hβp_pos hAabs_nonneg with + ⟨Cgap, hCgap_nonneg, hCgap⟩ + let Kfluct : ℝ := 8 * C0 * βp⁻¹ + let Ktau : ℝ := 4 * C0 * (η + η⁻¹) + 80 * C0 * (βp ^ 3)⁻¹ + let Ktail : ℝ := 64 * C0 * (params.xi : ℝ) * (βp ^ 3)⁻¹ + let Ktheta : ℝ := 4 * C0 + let C : ℝ := max 1 (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))) + have hC_ge_one : 1 ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hC_pos : 0 < C := lt_of_lt_of_le zero_lt_one hC_ge_one + refine ⟨C, hC_pos, ?_⟩ + intro P hP hstat hStruct hP4 hparams hsmall e he k m hgap + dsimp only + let β := section53CoarseFluctuationBeta hP4 + have hβeq : β = βp := by + simpa [β, βp, hparams] using + (section53CoarseFluctuationBetaParams_eq_of_P4 hP4).symm + have hxi_eq : hP4.xi = params.xi := by + simpa using + congrArg QuantitativeCoarseGrainedEllipticityParams.xi hparams + have hη_pos : 0 < η := by + dsimp [η] + positivity + have hdiff_ge_one : (1 : ℝ) ≤ ((m - k : ℕ) : ℝ) := + hC_ge_one.trans hgap + have hdiff_pos_real : 0 < ((m - k : ℕ) : ℝ) := + lt_of_lt_of_le zero_lt_one hdiff_ge_one + have hdiff_pos_nat : 0 < m - k := by exact_mod_cast hdiff_pos_real + have hkm : k < m := by omega + have hkm_le : k ≤ m := hkm.le + have hcentered := + hC0 hP hstat hStruct hP4 hparams hkm e he + (ε := 1) (η := η) (by norm_num) (by norm_num) hη_pos + have hC0_eta_le_quarter : 2 * C0 * η ≤ 1 / 4 := by + dsimp [η] + have hden_pos : 0 < 8 * (C0 + 1) := by positivity + field_simp [hden_pos.ne'] + nlinarith [hC0_nonneg] + have hCgap_le_C : Cgap ≤ C := by + dsimp [C] + exact + (le_max_left Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))).trans + (le_max_right 1 (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta))))) + have hgap_for_abs : Cgap ≤ ((m - k : ℕ) : ℝ) := + hCgap_le_C.trans hgap + have hlow_coeff : + 32 * C0 * (section53CoarseFluctuationBeta hP4 ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * (((m - k : ℕ) : ℝ))) ≤ + 1 / 4 := by + have h := hCgap (n := m - k) hgap_for_abs + simpa [Aabs, βp, β, hβeq] using h + have hC_ge_Kfluct : Kfluct ≤ C := by + dsimp [C] + exact + (le_max_left Kfluct (max Ktau (max Ktail Ktheta))).trans + ((le_max_right Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))).trans + (le_max_right 1 (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))))) + have hC_ge_Ktau : Ktau ≤ C := by + dsimp [C] + exact + (le_max_left Ktau (max Ktail Ktheta)).trans + ((le_max_right Kfluct (max Ktau (max Ktail Ktheta))).trans + ((le_max_right Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))).trans + (le_max_right 1 (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta))))))) + have hC_ge_Ktail : Ktail ≤ C := by + dsimp [C] + exact + (le_max_left Ktail Ktheta).trans + ((le_max_right Ktau (max Ktail Ktheta)).trans + ((le_max_right Kfluct (max Ktau (max Ktail Ktheta))).trans + ((le_max_right Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))).trans + (le_max_right 1 + (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))))))) + have hC_ge_Ktheta : Ktheta ≤ C := by + dsimp [C] + exact + (le_max_right Ktail Ktheta).trans + ((le_max_right Ktau (max Ktail Ktheta)).trans + ((le_max_right Kfluct (max Ktau (max Ktail Ktheta))).trans + ((le_max_right Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))).trans + (le_max_right 1 + (max Cgap (max Kfluct (max Ktau (max Ktail Ktheta)))))))) + have hKfluct_law : + 8 * C0 * β⁻¹ ≤ C := by + simpa [Kfluct, βp, β, hβeq] using hC_ge_Kfluct + have hKtau_law : + 4 * C0 * (η + η⁻¹) + 80 * C0 * (β ^ 3)⁻¹ ≤ C := by + simpa [Ktau, βp, β, hβeq] using hC_ge_Ktau + have hKtail_law : + 64 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ ≤ C := by + simpa [Ktail, βp, β, hβeq, hxi_eq] using hC_ge_Ktail + have hKtheta_law : + 4 * C0 ≤ C := by + simpa [Ktheta] using hC_ge_Ktheta + have hreduced : + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) ≤ + 2 * smallContrastReducedRHSAtScale hP hStruct hP4 C0 η k m e := by + exact + expectedResponseJCubeSet_special_le_two_smallContrastReducedRHSAtScale + hP hstat hStruct hP4 hsmall C0 η hC0_nonneg + hC0_eta_le_quarter hkm e he hcentered hlow_coeff + calc + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + ≤ 2 * smallContrastReducedRHSAtScale hP hStruct hP4 C0 η k m e := + hreduced + _ ≤ smallContrastFinalRHSAtScale hP hStruct hP4 C k m e := + two_smallContrastReducedRHSAtScale_le_smallContrastFinalRHSAtScale + hP hstat hStruct hP4 C0 η C hkm_le e + hKfluct_law hKtau_law hKtail_law hKtheta_law +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Preliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Preliminaries.lean new file mode 100644 index 0000000000..21244d89e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/SmallContrastJBound/Preliminaries.lean @@ -0,0 +1,857 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.YoungRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.ResponseMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.OneStepContraction.RHSCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta.Final + +/-! # Preliminaries -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +noncomputable section + +open Section53.JUpperBoundCoarseFluctuations + +/-! +# Section 5.6: small-contrast coarse-fluctuation iteration + +This file formalizes the manuscript estimate +`e.J.upper.bound.coarse.fluctuations.small.contrast.final`. +-/ + +/-- The four-term right side in +`e.J.upper.bound.coarse.fluctuations.small.contrast.final`. -/ +noncomputable def smallContrastFinalRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C : ℝ) (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + C * coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + + C * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + + C * Real.rpow (3 : ℝ) (-β * (m : ℝ)) + + C * (thetaAtScale hP hStruct (m : ℤ) - 1) ^ (2 : ℕ) + +noncomputable def smallContrastReducedRHSAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C0 η : ℝ) (k m : ℕ) (e : Vec d) : ℝ := + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let tau := tauAtScale P (m : ℤ) (k : ℤ) p_e q_e + let fluctuationSum := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let decay := Real.rpow (3 : ℝ) (-β * (m : ℝ)) + let thetaSq := (thetaAtScale hP hStruct (m : ℤ) - 1) ^ (2 : ℕ) + 4 * C0 * β⁻¹ * fluctuationSum + + (2 * C0 * (η + η⁻¹) * tau + 40 * C0 * (β ^ 3)⁻¹ * tau) + + 32 * C0 * (hP4.xi : ℝ) * (β ^ 3)⁻¹ * decay + + 2 * C0 * thetaSq + +theorem vecNorm_eq_one_of_vecNormSq_eq_one + {d : ℕ} {e : Vec d} (he : vecNormSq e = 1) : + Ch02.vecNorm e = 1 := by + have hsq : Ch02.vecNorm e ^ (2 : ℕ) = (1 : ℝ) := by + simpa [he] using Ch02.vecNorm_sq_eq_vecNormSq e + have hnonneg : 0 ≤ Ch02.vecNorm e := Ch02.vecNorm_nonneg e + rcases sq_eq_one_iff.mp hsq with h | h + · exact h + · linarith + +theorem thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := + Section54.OneStepContraction.thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hP4 + +theorem thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) (m : ℕ) : + thetaAtScale hP hStruct (m : ℤ) ≤ 2 := by + have hmono : + thetaAtScale hP hStruct (m : ℤ) ≤ + thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have htheta0 : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) hP4 := + thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 hP hStruct hP4 + exact hmono.trans (htheta0.trans hsmall) + +theorem thetaAtScale_sub_one_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) (m : ℕ) : + 0 ≤ thetaAtScale hP hStruct (m : ℤ) - 1 := by + have hθ_one : + 1 ≤ thetaAtScale hP hStruct (m : ℤ) := + one_le_thetaAtScale_of_P4 hP hStruct hP4 m + linarith + +theorem sqrt_sub_one_sq_le_theta_sub_one_sq + {θ : ℝ} (hθ_one : 1 ≤ θ) : + (Real.sqrt θ - 1) ^ (2 : ℕ) ≤ (θ - 1) ^ (2 : ℕ) := by + have hsqrt_one : 1 ≤ Real.sqrt θ := Real.one_le_sqrt.mpr hθ_one + have hleft_nonneg : 0 ≤ Real.sqrt θ - 1 := by linarith + have hright_nonneg : 0 ≤ θ - 1 := by linarith + have hsqrt_le : Real.sqrt θ ≤ θ := by + rw [Real.sqrt_le_iff] + constructor + · linarith + · nlinarith + have hle : Real.sqrt θ - 1 ≤ θ - 1 := by linarith + exact pow_le_pow_left₀ hleft_nonneg hle 2 + +theorem quarter_theta_sub_one_le_sqrt_sub_one + {θ : ℝ} (hθ_one : 1 ≤ θ) (hθ_two : θ ≤ 2) : + (1 / 4 : ℝ) * (θ - 1) ≤ Real.sqrt θ - 1 := by + have hθ_nonneg : 0 ≤ θ := le_trans zero_le_one hθ_one + have hsqrt_one : 1 ≤ Real.sqrt θ := Real.one_le_sqrt.mpr hθ_one + have hsqrt_nonneg : 0 ≤ Real.sqrt θ := Real.sqrt_nonneg θ + have hsqrt_le_two : Real.sqrt θ ≤ 2 := by + have hsqrt_le : Real.sqrt θ ≤ Real.sqrt 2 := Real.sqrt_le_sqrt hθ_two + have hsqrt2_le_two : Real.sqrt (2 : ℝ) ≤ 2 := by + rw [Real.sqrt_le_iff] + constructor <;> norm_num + exact hsqrt_le.trans hsqrt2_le_two + have hfactor : Real.sqrt θ + 1 ≤ 4 := by linarith + have hgap_nonneg : 0 ≤ Real.sqrt θ - 1 := by linarith + have hprod : + θ - 1 = (Real.sqrt θ - 1) * (Real.sqrt θ + 1) := by + rw [sub_eq_iff_eq_add] + nlinarith [Real.sq_sqrt hθ_nonneg] + calc + (1 / 4 : ℝ) * (θ - 1) + = (Real.sqrt θ - 1) * ((Real.sqrt θ + 1) / 4) := by + rw [hprod] + ring + _ ≤ (Real.sqrt θ - 1) * 1 := by + exact mul_le_mul_of_nonneg_left (by nlinarith) hgap_nonneg + _ = Real.sqrt θ - 1 := by ring + +theorem expectedResponseJCubeSet_special_ge_quarter_theta_sub_one + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (m : ℕ) (e : Vec d) (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + (1 / 4 : ℝ) * (thetaAtScale hP hStruct (m : ℤ) - 1) ≤ + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e := by + dsimp only + let θ := thetaAtScale hP hStruct (m : ℤ) + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hθ_one : 1 ≤ θ := by + simpa [θ] using one_le_thetaAtScale_of_P4 hP hStruct hP4 m + have hθ_two : θ ≤ 2 := by + simpa [θ] using + thetaAtScale_le_two_of_widetildeThetaAtScale_zero_le_two + hP hStruct hP4 hsmall m + have hEq := + expectedResponseJCubeSet_special_eq_sqrtTheta_sub_one_mul_vecNormSq + hP hStruct hP4 m e + calc + (1 / 4 : ℝ) * (θ - 1) ≤ Real.sqrt θ - 1 := + quarter_theta_sub_one_le_sqrt_sub_one hθ_one hθ_two + _ = (Real.sqrt θ - 1) * vecNormSq e := by rw [he, mul_one] + _ = Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e := by + simpa [p_e, q_e, θ] using hEq.symm + +theorem expectedResponseJCubeSet_special_le_two_expectedCenteredResponseJAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (e : Vec d) (he : vecNormSq e = 1) : + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + 2 * expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := by + dsimp only + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hraw_le : + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e ≤ + thetaAtScale hP hStruct (m : ℤ) - 1 := by + simpa [p_e, q_e] using + expectedResponseJCubeSet_special_le_thetaAtScale_sub_one_of_vecNormSq_eq_one + hP hStruct hP4 m e he + have htheta_eq : + thetaAtScale hP hStruct (m : ℤ) - 1 = + 2 * expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := by + simpa [p_e, q_e] using + Section54.OneStepContraction.thetaAtScale_sub_one_eq_two_centeredResponse_special + hP hStruct hP4 m e (vecNorm_eq_one_of_vecNormSq_eq_one he) + calc + Ch04.expectedResponseJCubeSet P (originCube d (m : ℤ)) p_e q_e + ≤ thetaAtScale hP hStruct (m : ℤ) - 1 := hraw_le + _ = 2 * expectedCenteredResponseJAtScale hP hStruct (m : ℤ) p_e q_e := + htheta_eq + +theorem coarseFluctuationScalarWeightAtScale_le_four_of_smallContrast + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + (m : ℕ) : + coarseFluctuationScalarWeightAtScale hP hStruct m ≤ 4 := by + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let σ := sigmaHatAtScale hP hStruct (m : ℤ) + have hb0_pos : 0 < b0 := by + simpa [b0] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0_pos : 0 < c0 := by + simpa [c0] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hbm_pos : 0 < bm := by + simpa [bm] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hσ_pos : 0 < σ := by + simpa [σ] using Section54.GoodScale.sigmaHatAtScale_pos_of_P4 hP hStruct hP4 m + have hchain := Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 (n := 0) (m := m) (Nat.zero_le m) + have hc0_le_cm : c0 ≤ cm := by simpa [c0, cm] using hchain.1 + have hbm_le_b0 : bm ≤ b0 := by simpa [bm, b0] using hchain.2.2 + have hθ0_two : b0 * c0⁻¹ ≤ 2 := by + have hθ0 : + thetaAtScale hP hStruct (0 : ℤ) ≤ 2 := + (thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 hP hStruct hP4).trans hsmall + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, c0] using hθ0 + have hb0_le_two_c0 : b0 ≤ 2 * c0 := by + have hmul := mul_le_mul_of_nonneg_right hθ0_two hc0_pos.le + have hcancel : b0 * c0⁻¹ * c0 = b0 := by field_simp [ne_of_gt hc0_pos] + nlinarith + have hcm_le_bm : cm ≤ bm := by + simpa [bm, cm] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hcm_le_two_c0 : cm ≤ 2 * c0 := hcm_le_bm.trans (hbm_le_b0.trans hb0_le_two_c0) + have hσ_le_two_c0 : σ ≤ 2 * c0 := by + calc + σ = Real.sqrt (bm * cm) := rfl + _ ≤ Real.sqrt ((2 * c0) * (2 * c0)) := by + exact Real.sqrt_le_sqrt + (mul_le_mul (hbm_le_b0.trans hb0_le_two_c0) hcm_le_two_c0 hcm_pos.le + (mul_nonneg (by norm_num) hc0_pos.le)) + _ = 2 * c0 := by + rw [show (2 * c0) * (2 * c0) = (2 * c0) ^ (2 : ℕ) by ring, + Real.sqrt_sq_eq_abs, abs_of_pos (mul_pos (by norm_num) hc0_pos)] + have hc0_le_σ : c0 ≤ σ := by + calc + c0 ≤ cm := hc0_le_cm + _ = Real.sqrt (cm * cm) := by + rw [show cm * cm = cm ^ (2 : ℕ) by ring, Real.sqrt_sq_eq_abs, + abs_of_pos hcm_pos] + _ ≤ Real.sqrt (bm * cm) := by + exact Real.sqrt_le_sqrt + (by + have hmul := mul_le_mul_of_nonneg_right hcm_le_bm hcm_pos.le + simpa [mul_comm] using hmul) + _ = σ := rfl + have hterm1 : σ * c0⁻¹ ≤ 2 := by + have hmul := mul_le_mul_of_nonneg_right hσ_le_two_c0 (inv_pos.mpr hc0_pos).le + have hcancel : (2 * c0) * c0⁻¹ = 2 := by field_simp [ne_of_gt hc0_pos] + simpa [hcancel, mul_comm, mul_left_comm, mul_assoc] using hmul + have hterm2 : σ⁻¹ * b0 ≤ 2 := by + have hσ_inv_le : σ⁻¹ ≤ c0⁻¹ := (inv_le_inv₀ hσ_pos hc0_pos).2 hc0_le_σ + calc + σ⁻¹ * b0 ≤ c0⁻¹ * b0 := + mul_le_mul_of_nonneg_right hσ_inv_le hb0_pos.le + _ = b0 * c0⁻¹ := by ring + _ ≤ 2 := hθ0_two + have hsum : σ * c0⁻¹ + σ⁻¹ * b0 ≤ 4 := by + nlinarith + simpa [coarseFluctuationScalarWeightAtScale, σ, b0, c0] using hsum + +theorem coarseFluctuationResponseMomentAtScale_le_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (_hkm : k ≤ m) (e : Vec d) : + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e ≤ + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e := by + let ζ := section53CoarseFluctuationZeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hζ_pos : 0 < ζ := by + simpa [ζ] using section53CoarseFluctuationZeta_pos hP4 + have hζ_nonneg : 0 ≤ ζ := hζ_pos.le + have hζ_inv_nonneg : 0 ≤ ζ⁻¹ := inv_nonneg.mpr hζ_nonneg + have hk_nonneg_int : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + let unitAvg : RegCoeffField d → ℝ := + fun a => + descendantsAverage (originCube d (k : ℤ)) + (Int.toNat ((k : ℤ) - (0 : ℤ))) + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + have hparent_le_unit : + Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e ≤ᵐ[P] + unitAvg := by + simpa [unitAvg, p_e, q_e] using + hP.restrictionResponseJObservableCubeSet_le_descendantsAverage_ae + (n := (0 : ℤ)) (m := (k : ℤ)) hk_nonneg_int p_e q_e + have hparent_rpow_le_unit : + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ ∂P + ≤ ∫ a, Real.rpow (unitAvg a) ζ ∂P := by + refine integral_mono_ae ?_ ?_ ?_ + · exact + integrable_rpow_restrictionResponseJObservableCubeSet_originCube_from_P4 + hP hStruct hP4 k p_e q_e + · have hmem := + memLp_zeta_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_from_P4_of_stationary + hP hstat hStruct hP4 (by norm_num : (0 : ℤ) ≤ 0) hk_nonneg_int p_e q_e + have hζ_ne_zero : ENNReal.ofReal ζ ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le.mpr hζ_pos] + have hζ_ne_top : ENNReal.ofReal ζ ≠ ⊤ := by simp + have hint : + Integrable (fun a : RegCoeffField d => ‖unitAvg a‖ ^ (ENNReal.ofReal ζ).toReal) P := + hmem.integrable_norm_rpow hζ_ne_zero hζ_ne_top + refine hint.congr ?_ + filter_upwards with a + have hnonneg : 0 ≤ unitAvg a := by + dsimp [unitAvg] + exact descendantsAverage_nonneg _ _ + (fun R => Ch04.restrictionResponseJObservableCubeSet R p_e q_e a) + (fun R _hR => Ch04.restrictionResponseJObservableCubeSet_nonneg R p_e q_e a) + rw [ENNReal.toReal_ofReal hζ_pos.le, Real.norm_of_nonneg hnonneg, + Real.rpow_eq_pow] + · filter_upwards [hparent_le_unit] with a hle + exact Real.rpow_le_rpow + (Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a) + hle hζ_nonneg + have hunit_le_zero : + ∫ a, Real.rpow (unitAvg a) ζ ∂P ≤ + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (0 : ℤ)) p_e q_e a) ζ ∂P := by + simpa [unitAvg, ζ, p_e, q_e] using + integral_rpow_descendantsAverage_restrictionResponseJObservableCubeSet_originCube_le_originCube_of_stationary + hP hstat hStruct hP4 (k := (0 : ℤ)) (m := (k : ℤ)) + (by norm_num) (by exact_mod_cast Nat.zero_le k) p_e q_e + have hintegral_nonneg : + 0 ≤ + ∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ ∂P := by + exact integral_nonneg fun a => + Real.rpow_nonneg + (Ch04.restrictionResponseJObservableCubeSet_nonneg (originCube d (k : ℤ)) p_e q_e a) _ + calc + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e = + Real.rpow + (∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) p_e q_e a) ζ ∂P) + ζ⁻¹ := by + simp [coarseFluctuationResponseMomentAtScale, ζ, p_e, q_e] + _ ≤ + Real.rpow + (∫ a, + Real.rpow + (Ch04.restrictionResponseJObservableCubeSet (originCube d (0 : ℤ)) p_e q_e a) ζ ∂P) + ζ⁻¹ := by + exact Real.rpow_le_rpow hintegral_nonneg + (hparent_rpow_le_unit.trans hunit_le_zero) hζ_inv_nonneg + _ = + coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e := by + simp [coarseFluctuationResponseMomentAtScale, ζ, p_e, q_e] + +theorem coarseFluctuationUnitMomentWeight_mul_responseMoment_le_sixteen_of_smallContrast + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (hsmall : widetildeThetaAtScale P (0 : ℤ) hP4 ≤ 2) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) (he : vecNormSq e = 1) : + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e ≤ 16 := by + let U := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let Rk := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + let R0 := coarseFluctuationResponseMomentAtScale hP hStruct hP4 0 m e + have hU_nonneg : 0 ≤ U := by + simpa [U] using coarseFluctuationUnitMomentWeightAtScale_nonneg hP hStruct hP4 m + have hRk_le_R0 : Rk ≤ R0 := by + simpa [Rk, R0] using + coarseFluctuationResponseMomentAtScale_le_zero hP hstat hStruct hP4 hkm e + have hUR0 : + U * R0 ≤ U ^ (2 : ℕ) := by + simpa [U, R0] using + Section54.OneStepContraction.coarseFluctuationUnitMomentWeight_mul_responseMoment_zero_le_sq + hP hStruct hP4 m e (vecNorm_eq_one_of_vecNormSq_eq_one he) + have hU_le : U ≤ 4 := by + have h := + Section54.OneStepContraction.coarseFluctuationUnitMomentWeightAtScale_le_two_widetildeTheta_zero + hP hStruct hP4 m + calc + U ≤ 2 * widetildeThetaAtScale P (0 : ℤ) hP4 := by simpa [U] using h + _ ≤ 2 * 2 := mul_le_mul_of_nonneg_left hsmall (by norm_num) + _ = 4 := by norm_num + calc + U * Rk ≤ U * R0 := mul_le_mul_of_nonneg_left hRk_le_R0 hU_nonneg + _ ≤ U ^ (2 : ℕ) := hUR0 + _ ≤ 4 ^ (2 : ℕ) := pow_le_pow_left₀ hU_nonneg hU_le 2 + _ = 16 := by norm_num + +theorem sum_range_to_Icc_descending {k m : ℤ} (hkm : k ≤ m) + (F : ℕ → ℝ) : + (∑ j ∈ Finset.range (Int.toNat (m - k)), F j) = + ∑ n ∈ Finset.Icc (k + 1) m, F (Int.toNat (m - n)) := by + classical + refine Finset.sum_bij (fun j _hj => m - (j : ℤ)) ?_ ?_ ?_ ?_ + · intro j hj + have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hj_lt_nat : j < Int.toNat (m - k) := Finset.mem_range.mp hj + have hj_lt : (j : ℤ) < m - k := by + have hj_lt' : (j : ℤ) < ((Int.toNat (m - k) : ℕ) : ℤ) := by + exact_mod_cast hj_lt_nat + simpa [hL] using hj_lt' + simp only [Finset.mem_Icc] + constructor <;> omega + · intro j₁ _hj₁ j₂ _hj₂ h + have h' : m - (j₁ : ℤ) = m - (j₂ : ℤ) := by simpa using h + have hcast : (j₁ : ℤ) = (j₂ : ℤ) := by omega + exact_mod_cast hcast + · intro n hn + have hn_low : k + 1 ≤ n := (Finset.mem_Icc.mp hn).1 + have hn_high : n ≤ m := (Finset.mem_Icc.mp hn).2 + refine ⟨Int.toNat (m - n), ?_, ?_⟩ + · have hL : ((Int.toNat (m - k) : ℕ) : ℤ) = m - k := + Int.toNat_of_nonneg (sub_nonneg.mpr hkm) + have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hmn_lt : m - n < m - k := by omega + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + apply Finset.mem_range.mpr + have hcast : ((Int.toNat (m - n) : ℕ) : ℤ) < + ((Int.toNat (m - k) : ℕ) : ℤ) := by + simpa [hto, hL] using hmn_lt + exact_mod_cast hcast + · have hmn_nonneg : 0 ≤ m - n := sub_nonneg.mpr hn_high + have hto : ((Int.toNat (m - n) : ℕ) : ℤ) = m - n := + Int.toNat_of_nonneg hmn_nonneg + change m - ((Int.toNat (m - n) : ℕ) : ℤ) = n + rw [hto] + omega + · intro j _hj + have harg : Int.toNat (m - (m - (j : ℤ))) = j := by + have hsub : m - (m - (j : ℤ)) = (j : ℤ) := by ring + simp [hsub] + exact congrArg F harg.symm + +theorem sum_Icc_betaWeight_le_five_beta_inv + {k m : ℤ} (hkm : k ≤ m) {β : ℝ} (hβ : 0 < β) (hβ_le : β ≤ 1) : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) ≤ + 5 * β⁻¹ := by + let L : ℕ := Int.toNat (m - k) + have hsum_eq : + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + simpa [L] using + (sum_range_to_Icc_descending (k := k) (m := m) hkm + (fun j => Real.rpow (3 : ℝ) (-β * (j : ℝ)))).symm + have hrange_le : + (∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ))) ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro j hj + simpa only [Finset.mem_filter, and_true] using + Finset.mem_range.mpr (Nat.lt_succ_of_lt (Finset.mem_range.mp hj)) + · intro j _hj _hj_not + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hgeom := + Homogenization.sum_filter_triadicDepthWeight_le_geometric_inv + β L (fun _j => True) hβ + have hgeom_five : + (1 - Real.rpow (3 : ℝ) (-β))⁻¹ ≤ 5 * β⁻¹ := + Homogenization.Book.Ch02.inv_one_sub_rpow_three_neg_le_five_inv hβ hβ_le + calc + (∑ n ∈ Finset.Icc (k + 1) m, + Real.rpow (3 : ℝ) (-β * (Int.toNat (m - n) : ℝ))) + = + ∑ j ∈ Finset.range L, Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hsum_eq + _ ≤ + ∑ j ∈ (Finset.range (L + 1)).filter (fun _j => True), + Real.rpow (3 : ℝ) (-β * (j : ℝ)) := hrange_le + _ ≤ (1 - Real.rpow (3 : ℝ) (-β))⁻¹ := hgeom + _ ≤ 5 * β⁻¹ := hgeom_five + +theorem expectedResponseJCubeSet_origin_eq_annealedResponseJAtScale + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (n : ℤ) (p q : Vec d) : + Ch04.expectedResponseJCubeSet P (originCube d n) p q = + Ch04.annealedResponseJAtScale P n p q := by + rfl + +theorem expectedResponseJCubeSet_origin_eq_origin_add_tauAtScale + {d : ℕ} (P : Ch04.RestrictionCoeffLaw d) (m k : ℤ) (p q : Vec d) : + Ch04.expectedResponseJCubeSet P (originCube d k) p q = + Ch04.expectedResponseJCubeSet P (originCube d m) p q + + tauAtScale P m k p q := by + simp [expectedResponseJCubeSet_origin_eq_annealedResponseJAtScale, tauAtScale] + +theorem tauAtScale_le_tauAtScale_of_left_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k n m : ℤ} (hk_nonneg : 0 ≤ k) (hkn : k ≤ n) + (p q : Vec d) : + tauAtScale P m n p q ≤ tauAtScale P m k p q := by + have hn_nonneg : 0 ≤ n := hk_nonneg.trans hkn + have hBlockN : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d n)) P := by + have hn_toNat : ((Int.toNat n : ℕ) : ℤ) = n := Int.toNat_of_nonneg hn_nonneg + simpa [hn_toNat] using + Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 (Int.toNat n) + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d k)) P := by + have hk_toNat : ((Int.toNat k : ℕ) : ℤ) = k := Int.toNat_of_nonneg hk_nonneg + simpa [hk_toNat] using + Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 (Int.toNat k) + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d n) k → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkn hR hBlockK + have htau_nk : + 0 ≤ tauAtScale P n k p q := + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkn p q hBlockN hDescBlock + have hdecomp : + tauAtScale P m k p q = + tauAtScale P m n p q + tauAtScale P n k p q := by + simp [tauAtScale] + nlinarith + +theorem coarseFluctuationTauSumAtScale_le_five_beta_inv_tauAtScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hstat : Ch04.RestrictionStationaryLaw P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) (e : Vec d) : + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e ≤ + 5 * β⁻¹ * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + dsimp only + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + have hβ_pos : 0 < β := by + simpa [β] using section53CoarseFluctuationBeta_pos hP4 + have hβ_le_one : β ≤ 1 := by + have hle := section53CoarseFluctuationBeta_le_sUpper hP4 + linarith [hle, hP4.sUpper_lt_one] + have hkm_int : (k : ℤ) ≤ (m : ℤ) := by exact_mod_cast hkm + have hweights : + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ))) ≤ + 5 * β⁻¹ := + sum_Icc_betaWeight_le_five_beta_inv hkm_int hβ_pos hβ_le_one + have htau_mk_nonneg : + 0 ≤ tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + have hk_nonneg : (0 : ℤ) ≤ (k : ℤ) := by exact_mod_cast Nat.zero_le k + have hBlockM : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (m : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 m + have hBlockK : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hDescBlock : + ∀ R, R ∈ descendantsAtScale (originCube d (m : ℤ)) (k : ℤ) → + Integrable (Ch04.coarseFullBlockMatrixAtCube R) P := by + intro R hR + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hstat hk_nonneg hkm_int hR hBlockK + exact + Section52.tauAtScale_nonneg_of_integrable_coarseFullBlockMatrixAtCube + hP hstat hk_nonneg hkm_int p_e q_e hBlockM hDescBlock + have hsum_le : + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + tauAtScale P (m : ℤ) n p_e q_e) ≤ + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ))) * + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + calc + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + tauAtScale P (m : ℤ) n p_e q_e) + ≤ + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) := by + refine Finset.sum_le_sum ?_ + intro n hn + have hn_low : (k : ℤ) ≤ n := by + have h := (Finset.mem_Icc.mp hn).1 + omega + have hn_high : n ≤ (m : ℤ) := (Finset.mem_Icc.mp hn).2 + have htau_le : + tauAtScale P (m : ℤ) n p_e q_e ≤ + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := + tauAtScale_le_tauAtScale_of_left_le + hP hstat hStruct hP4 + (by exact_mod_cast Nat.zero_le k) hn_low p_e q_e + exact mul_le_mul_of_nonneg_left htau_le + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ))) * + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by + rw [Finset.sum_mul] + calc + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e = + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ)) * + tauAtScale P (m : ℤ) n p_e q_e) := by + simp [coarseFluctuationTauSumAtScale, β, p_e, q_e] + _ ≤ + (∑ n ∈ Finset.Icc ((k : ℤ) + 1) (m : ℤ), + Real.rpow (3 : ℝ) (-β * (Int.toNat ((m : ℤ) - n) : ℝ))) * + tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := hsum_le + _ ≤ (5 * β⁻¹) * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := + mul_le_mul_of_nonneg_right hweights htau_mk_nonneg + _ = 5 * β⁻¹ * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := by ring + +theorem exists_decay_absorption_const + {β A : ℝ} (hβ : 0 < β) (hA : 0 ≤ A) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {n : ℕ}, C ≤ (n : ℝ) → + A * Real.rpow (3 : ℝ) (-2 * β * (n : ℝ)) ≤ 1 / 4 := by + let r : ℝ := Real.rpow (3 : ℝ) (-2 * β) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by nlinarith) + have hA_one_pos : 0 < A + 1 := by linarith + have heps_pos : 0 < (1 / 4 : ℝ) / (A + 1) := by positivity + obtain ⟨N, hN⟩ := exists_pow_lt_of_lt_one heps_pos hr_lt_one + refine ⟨N, by exact_mod_cast Nat.zero_le N, ?_⟩ + intro n hn + have hN_le_n_nat : N ≤ n := by exact_mod_cast hn + have hN_le_n : (N : ℝ) ≤ (n : ℝ) := by exact_mod_cast hN_le_n_nat + have hpow_eq : + Real.rpow (3 : ℝ) (-2 * β * (N : ℝ)) = r ^ N := by + calc + Real.rpow (3 : ℝ) (-2 * β * (N : ℝ)) = + Real.rpow (3 : ℝ) ((-2 * β) * (N : ℝ)) := by ring + _ = Real.rpow (Real.rpow (3 : ℝ) (-2 * β)) (N : ℝ) := + Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) (-2 * β) (N : ℝ) + _ = r ^ N := by + simp [r, Real.rpow_natCast] + have hdecay_le : + Real.rpow (3 : ℝ) (-2 * β * (n : ℝ)) ≤ + Real.rpow (3 : ℝ) (-2 * β * (N : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) ?_ + nlinarith + have hA_pow_le : + A * r ^ N ≤ 1 / 4 := by + have hpow_le : r ^ N ≤ (1 / 4 : ℝ) / (A + 1) := le_of_lt hN + calc + A * r ^ N ≤ A * ((1 / 4 : ℝ) / (A + 1)) := + mul_le_mul_of_nonneg_left hpow_le hA + _ ≤ 1 / 4 := by + field_simp [hA_one_pos.ne'] + nlinarith + calc + A * Real.rpow (3 : ℝ) (-2 * β * (n : ℝ)) ≤ + A * Real.rpow (3 : ℝ) (-2 * β * (N : ℝ)) := + mul_le_mul_of_nonneg_left hdecay_le hA + _ = A * r ^ N := by rw [hpow_eq] + _ ≤ 1 / 4 := hA_pow_le + +theorem section53CoarseFluctuationBetaCoreParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaCoreParams params := by + have hgap : 0 < 1 - params.sUpper - params.sLower := by + linarith [params.sum_lt_one] + have hupper : 0 < params.sUpper := params.sUpper_pos + have hlower : 0 < params.sLower := params.sLower_pos + have hupper_gain : 0 < params.sUpper - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sUpper] + have hlower_gain : 0 < params.sLower - (d : ℝ) / (params.xi : ℝ) := by + linarith [params.dim_div_xi_lt_sLower] + unfold section53CoarseFluctuationBetaCoreParams + exact lt_min hgap + (lt_min hupper (lt_min hlower (lt_min hupper_gain hlower_gain))) + +theorem section53CoarseFluctuationBetaParams_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < section53CoarseFluctuationBetaParams params := by + unfold section53CoarseFluctuationBetaParams + nlinarith [section53CoarseFluctuationBetaCoreParams_pos params] + +theorem self_le_half_add_of_le + {x R : ℝ} (h : x ≤ (1 / 2 : ℝ) * x + R) : + x ≤ 2 * R := by + nlinarith + +theorem coarseFluctuationYoungManuscriptRHSAtScale_eq_decomp + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C ε η : ℝ) (k m : ℕ) (e : Vec d) : + coarseFluctuationYoungManuscriptRHSAtScale hP hStruct hP4 C ε η k m e = + let β := section53CoarseFluctuationBeta hP4 + let p_e := specialPAtScale hP hStruct (m : ℤ) e + let q_e := specialQAtScale hP hStruct (m : ℤ) e + let θ := thetaAtScale hP hStruct (m : ℤ) + let scalarWeight := coarseFluctuationScalarWeightAtScale hP hStruct m + let fluctuationSum := coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m + let tauSum := coarseFluctuationTauSumAtScale hP hStruct hP4 k m e + let unitMomentWeight := coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m + let responseMoment := coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e + C * + (η * Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) p_e q_e + + η⁻¹ * tauAtScale P (m : ℤ) (k : ℤ) p_e q_e) + + C * ε * (Real.sqrt θ - 1) ^ 2 + + C * ε⁻¹ * β⁻¹ * θ * fluctuationSum + + C * ε⁻¹ * (β ^ 2)⁻¹ * scalarWeight * tauSum + + C * (hP4.xi : ℝ) * ε⁻¹ * (β ^ 3)⁻¹ * + Real.rpow (3 : ℝ) (-β * (m : ℝ)) * + unitMomentWeight * responseMoment + + C * ε⁻¹ * (β ^ 2)⁻¹ * + Real.rpow (3 : ℝ) (-2 * β * ((m - k : ℕ) : ℝ)) * + scalarWeight * (θ - 1) := by + unfold coarseFluctuationYoungManuscriptRHSAtScale + simp [mul_assoc, mul_left_comm, mul_comm] + +theorem two_mul_sum_six_le + {a₁ a₂ a₃ a₄ a₅ a₆ b₁ b₂ b₃ b₄ b₅ b₆ : ℝ} + (h₁ : 2 * a₁ ≤ b₁) (h₂ : 2 * a₂ ≤ b₂) + (h₃ : 2 * a₃ ≤ b₃) (h₄ : 2 * a₄ ≤ b₄) + (h₅ : 2 * a₅ ≤ b₅) (h₆ : 2 * a₆ ≤ b₆) : + 2 * (a₁ + a₂ + a₃ + a₄ + a₅ + a₆) ≤ + b₁ + b₂ + b₃ + b₄ + b₅ + b₆ := by + nlinarith + +theorem young_rhs_two_mul_le_sum_of_term_bounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (C η : ℝ) (k m : ℕ) (e : Vec d) + (B₁ B₂ B₃ B₄ B₅ B₆ : ℝ) + (h₁ : + 2 * + (C * + (η * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e) + + η⁻¹ * + tauAtScale P (m : ℤ) (k : ℤ) + (specialPAtScale hP hStruct (m : ℤ) e) + (specialQAtScale hP hStruct (m : ℤ) e))) ≤ B₁) + (h₂ : + 2 * + (C * + (Real.sqrt (thetaAtScale hP hStruct (m : ℤ)) - 1) ^ + (2 : ℕ)) ≤ B₂) + (h₃ : + 2 * + (C * (section53CoarseFluctuationBeta hP4)⁻¹ * + thetaAtScale hP hStruct (m : ℤ) * + coarseFluctuationFullBlockSumAtScale hP hStruct hP4 k m) ≤ B₃) + (h₄ : + 2 * + (C * ((section53CoarseFluctuationBeta hP4) ^ 2)⁻¹ * + coarseFluctuationScalarWeightAtScale hP hStruct m * + coarseFluctuationTauSumAtScale hP hStruct hP4 k m e) ≤ B₄) + (h₅ : + 2 * + (C * (hP4.xi : ℝ) * + ((section53CoarseFluctuationBeta hP4) ^ 3)⁻¹ * + Real.rpow (3 : ℝ) + (-(section53CoarseFluctuationBeta hP4) * (m : ℝ)) * + coarseFluctuationUnitMomentWeightAtScale hP hStruct hP4 m * + coarseFluctuationResponseMomentAtScale hP hStruct hP4 k m e) ≤ B₅) + (h₆ : + 2 * + (C * ((section53CoarseFluctuationBeta hP4) ^ 2)⁻¹ * + Real.rpow (3 : ℝ) + (-2 * section53CoarseFluctuationBeta hP4 * + (((m - k : ℕ) : ℝ))) * + coarseFluctuationScalarWeightAtScale hP hStruct m * + (thetaAtScale hP hStruct (m : ℤ) - 1)) ≤ B₆) : + 2 * + coarseFluctuationYoungManuscriptRHSAtScale + hP hStruct hP4 C 1 η k m e ≤ + B₁ + B₂ + B₃ + B₄ + B₅ + B₆ := by + rw [coarseFluctuationYoungManuscriptRHSAtScale_eq_decomp] + simpa only [inv_one, one_mul, mul_one] using + (two_mul_sum_six_le h₁ h₂ h₃ h₄ h₅ h₆) + +theorem small_contrast_rest_sum_eq + (J tauCoeff₁ tauCoeff₂ tau thetaTerm fluctTerm tailTerm : ℝ) : + ((1 / 4 : ℝ) * J + tauCoeff₁ * tau) + + thetaTerm + fluctTerm + tauCoeff₂ * tau + tailTerm + + (1 / 4 : ℝ) * J = + (1 / 2 : ℝ) * J + + (fluctTerm + (tauCoeff₁ + tauCoeff₂) * tau + tailTerm + thetaTerm) := by + ring + +theorem small_contrast_rest_sum_terms_eq + (J tauTerm₁ tauTerm₂ thetaTerm fluctTerm tailTerm : ℝ) : + ((1 / 4 : ℝ) * J + tauTerm₁) + thetaTerm + fluctTerm + tauTerm₂ + + tailTerm + (1 / 4 : ℝ) * J = + (1 / 2 : ℝ) * J + + (fluctTerm + (tauTerm₁ + tauTerm₂) + tailTerm + thetaTerm) := by + ring + +theorem absorb_quarter_terms + {J tauTerm₁ tauTerm₂ thetaTerm fluctTerm tailTerm : ℝ} + (h : + J ≤ + ((1 / 4 : ℝ) * J + tauTerm₁) + thetaTerm + fluctTerm + tauTerm₂ + + tailTerm + (1 / 4 : ℝ) * J) : + J ≤ 2 * (fluctTerm + (tauTerm₁ + tauTerm₂) + tailTerm + thetaTerm) := by + nlinarith +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic.lean new file mode 100644 index 0000000000..6c0070b119 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.NormalizedStatements + +/-! # Variance Estimate Quadratic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +/-! +# Section 5.6: variance triangle for normalized block fluctuations + +This module re-exports the split files proving Lemma `l.variance.estimate.quadratic`. +-/ + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ArbitraryIntegrability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ArbitraryIntegrability.lean new file mode 100644 index 0000000000..0852791ec0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ArbitraryIntegrability.lean @@ -0,0 +1,591 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Triangle + +/-! # Arbitrary Integrability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +/-- Translation covariance of the arbitrary-normalizer full-block fluctuation +observable. -/ +theorem fullBlockFluctuationOperatorNormSqWithNormalizer_translation_covariant + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) : + Ch04.IsRestrictionTranslationCovariant + (fun U : Set (Vec d) => fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S U a) := by + have hraw : IsTranslationCovariant + (fun U : Set (Vec d) => fun b : CoeffField d => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.transpose S * + (toFullBlockMat (coarseBlockMatrix U b) - + toFullBlockMat + (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center)) * + S)‖ ^ (2 : ℕ)) := by + intro U z b + simp [translateByInt, coarseBlockMatrix_translateSet_eq_translateCoeffField] + exact Ch04.isRestrictionTranslationCovariant_comp_toFun hraw + +theorem section56_norm_toEuclideanCLM_le_sum_abs_entries + {ι : Type*} [Fintype ι] [DecidableEq ι] (M : Matrix ι ι ℝ) : + ‖Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M‖ ≤ + (Fintype.card ι : ℝ) * ∑ i : ι, ∑ j : ι, |M i j| := by + classical + let S : ℝ := ∑ i : ι, ∑ j : ι, |M i j| + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Finset.sum_nonneg fun i _ => + Finset.sum_nonneg fun j _ => abs_nonneg _ + refine ContinuousLinearMap.opNorm_le_bound _ + (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) ?_ + intro x + have hcoord : + ∀ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ≤ + S * ‖x‖ := by + intro i + calc + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ + = |∑ j : ι, M i j * x.ofLp j| := by + simp [Real.norm_eq_abs, Matrix.mulVec, dotProduct] + _ ≤ ∑ j : ι, |M i j * x.ofLp j| := + Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun j => M i j * x.ofLp j) + _ = ∑ j : ι, |M i j| * ‖x.ofLp j‖ := by + simp [abs_mul, Real.norm_eq_abs] + _ ≤ ∑ j : ι, |M i j| * ‖x‖ := by + exact Finset.sum_le_sum fun j _ => + mul_le_mul_of_nonneg_left (PiLp.norm_apply_le x j) (abs_nonneg _) + _ = (∑ j : ι, |M i j|) * ‖x‖ := by + rw [Finset.sum_mul] + _ ≤ S * ‖x‖ := by + exact mul_le_mul_of_nonneg_right + (Finset.single_le_sum + (fun k _ => Finset.sum_nonneg fun j _ => abs_nonneg (M k j)) + (Finset.mem_univ i)) + (norm_nonneg x) + have hnorm_sq : + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 ≤ + (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + calc + ‖(Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x‖ ^ 2 + = ∑ i : ι, + ‖((Matrix.toEuclideanCLM (n := ι) (𝕜 := ℝ) M) x).ofLp i‖ ^ 2 := by + rw [EuclideanSpace.norm_sq_eq] + _ ≤ ∑ i : ι, (S * ‖x‖) ^ 2 := by + exact Finset.sum_le_sum fun i _ => + pow_le_pow_left₀ (norm_nonneg _) (hcoord i) 2 + _ ≤ (∑ _i : ι, S * ‖x‖) ^ 2 := by + exact Finset.sum_sq_le_sq_sum_of_nonneg + (fun _ _ => mul_nonneg hS_nonneg (norm_nonneg x)) + _ = (((Fintype.card ι : ℝ) * S) * ‖x‖) ^ 2 := by + simp [Finset.sum_const] + ring + exact (sq_le_sq₀ (norm_nonneg _) + (mul_nonneg (mul_nonneg (Nat.cast_nonneg _) hS_nonneg) (norm_nonneg x))).mp hnorm_sq + +theorem section56_norm_toEuclideanCLM_sq_integrable_of_entry_memLp_two + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {Z : RegCoeffField d → FullBlockMat d} + (hZ_aemeas : AEMeasurable Z P) + (hZ_entry : ∀ α β : BlockCoord d, MemLp (fun a => Z a α β) (2 : ENNReal) P) : + Integrable + (fun a : RegCoeffField d => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (Z a)‖ ^ 2) P := by + classical + let S : RegCoeffField d → ℝ := fun a => ∑ α : BlockCoord d, ∑ β : BlockCoord d, |Z a α β| + have hS_mem : MemLp S (2 : ENNReal) P := by + dsimp [S] + refine memLp_finsetSum _ ?_ + intro α _hα + refine memLp_finsetSum _ ?_ + intro β _hβ + simpa [Real.norm_eq_abs] using (hZ_entry α β).norm + have hS_sq_int : Integrable (fun a => S a ^ 2) P := by + simpa [Real.norm_eq_abs, S] using + hS_mem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + let C : ℝ := Fintype.card (BlockCoord d) + let L : + FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (BlockCoord d) →L[ℝ] EuclideanSpace ℝ (BlockCoord d)) := { + toFun := fun M => Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M + map_add' := by + intro A B + exact map_add (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) A B + map_smul' := by + intro r A + exact map_smul (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) r A + } + have hCS_sq_int : Integrable (fun a => (C * S a) ^ 2) P := by + convert hS_sq_int.const_mul (C * C) using 1 + ext a + ring + refine Integrable.mono' hCS_sq_int ?_ ?_ + · exact ((continuous_norm.measurable.comp_aemeasurable + (L.continuous_of_finiteDimensional.measurable.comp_aemeasurable hZ_aemeas)).pow_const + 2).aestronglyMeasurable + · filter_upwards with a + have hnorm := + section56_norm_toEuclideanCLM_le_sum_abs_entries (Z a) + have hpow := pow_le_pow_left₀ (norm_nonneg _) hnorm 2 + simpa [S, C, Real.norm_eq_abs] using hpow + +theorem integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_originCube_from_P4 + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (S : FullBlockMat d) (n : ℕ) : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d (n : ℤ))) a) P := by + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (n : ℤ) + let Abar : BlockMat d := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + let Z : RegCoeffField d → FullBlockMat d := + fun a => + Matrix.transpose S * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) - toFullBlockMat Abar) * S + have hZ_entry : ∀ α β : BlockCoord d, MemLp (fun a => Z a α β) (2 : ENNReal) P := by + intro α β + dsimp [Z] + have hsum : + MemLp + (fun a : RegCoeffField d => + ∑ γ : BlockCoord d, + (∑ δ : BlockCoord d, + Matrix.transpose S α δ * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ)) * + S γ β) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (BlockCoord d))) + (p := (2 : ENNReal)) ?_ + intro γ _hγ + have hinner : + MemLp + (fun a : RegCoeffField d => + ∑ δ : BlockCoord d, + Matrix.transpose S α δ * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ)) + (2 : ENNReal) P := by + refine memLp_finsetSum (s := (Finset.univ : Finset (BlockCoord d))) + (p := (2 : ENNReal)) ?_ + intro δ _hδ + have hbase : + MemLp + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ - + toFullBlockMat Abar δ γ) + (2 : ENNReal) P := by + have hentry : + MemLp + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) δ γ) + (2 : ENNReal) P := by + simpa [Q, toFullBlockMat, blockMatEntry] using + Homogenization.Book.Ch05.Section52.memLp_two_blockMatEntry_coarseBlockMatrix_cubeSet_from_P4 + hP hStruct hP4 n δ γ + simpa using! hentry.sub + (memLp_const + (c := toFullBlockMat Abar δ γ) (μ := P) (p := (2 : ENNReal))) + exact hbase.const_mul (Matrix.transpose S α δ) + simpa [mul_comm] using hinner.const_mul (S γ β) + exact MemLp.ae_eq (Filter.Eventually.of_forall fun a => by + simp [Matrix.mul_apply]) hsum + have hZ_aemeas : AEMeasurable Z P := by + refine aemeasurable_pi_lambda Z ?_ + intro α + refine aemeasurable_pi_lambda (fun a => Z a α) ?_ + intro β + exact (hZ_entry α β).aestronglyMeasurable.aemeasurable + change + Integrable + (fun a : RegCoeffField d => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (Matrix.transpose S * + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) - toFullBlockMat Abar) * + S)‖ ^ 2) P + exact section56_norm_toEuclideanCLM_sq_integrable_of_entry_memLp_two hZ_aemeas hZ_entry + +theorem integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_originCube_from_P4_of_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (S : FullBlockMat d) (n : ℤ) (hn : 0 ≤ n) : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d n)) a) P := by + have hnat := + integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_originCube_from_P4 + hP hStruct hP4 center S (Int.toNat n) + simpa [Int.toNat_of_nonneg hn] using hnat + +theorem integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_from_P4_of_nonneg_scale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (center : ℤ) (S : FullBlockMat d) (R : TriadicCube d) + (hR_nonneg : 0 ≤ R.scale) : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet R) a) P := by + let z : Fin d → ℤ := Ch04.scaleTranslationShift R.scale R + have hset : + cubeSet R = + translateSet (intVecToRealVec z) (cubeSet (originCube d R.scale)) := by + simpa [z] using + Ch04.cubeSet_eq_translateSet_originCube_of_nonneg_scale (R := R) hR_nonneg + have hOrigin : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d R.scale)) a) P := + integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_originCube_from_P4_of_nonneg + hP hStruct hP4 center S R.scale hR_nonneg + have hcomp : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d R.scale)) (translateReg (intVecToRealVec z) a)) P := by + have hOrigin_map : + Integrable + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d R.scale)) a) + (Measure.map (translateReg (intVecToRealVec z)) P) := by + simpa [hStruct.stationary z] using hOrigin + simpa [Function.comp_def] using + hOrigin_map.comp_measurable (measurable_translateReg (intVecToRealVec z)) + have hae : + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet R) a) =ᵐ[P] + fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqWithNormalizer hP hStruct center S + (cubeSet (originCube d R.scale)) (translateReg (intVecToRealVec z) a) := by + filter_upwards with a + rw [hset] + exact + fullBlockFluctuationOperatorNormSqWithNormalizer_translation_covariant + hP hStruct center S (cubeSet (originCube d R.scale)) z a + exact hcomp.congr hae.symm + +theorem integrable_descendantsAverage_fullBlockFluctuationOperatorNormSqWithNormalizer_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (_hk : k ≤ n) (S : FullBlockMat d) : + Integrable + (fun a : RegCoeffField d => + descendantsAverage (originCube d (n : ℤ)) (n - k) + (fun R => + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (cubeSet R) a)) P := by + classical + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hR + have hQscale : Q.scale = (n : ℤ) := by simp [Q, originCube] + rw [hscale, hQscale] + have hj_le : j ≤ n := by + dsimp [j] + exact Nat.sub_le n k + exact sub_nonneg.mpr (by exact_mod_cast hj_le) + simpa [Q, j] using + integrable_fullBlockFluctuationOperatorNormSqWithNormalizer_from_P4_of_nonneg_scale + hP hStruct hP4 (m : ℤ) S R hR_nonneg + +theorem aemeasurable_fullBlockFluctuationMatrixWithNormalizer_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S + (cubeSet Q) a) P := by + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) + let g : FullBlockMat d → FullBlockMat d := fun M => Matrix.transpose S * (M - Abar) * S + have hg : Measurable g := by + have hcont : Continuous g := by + dsimp [g] + fun_prop + exact hcont.measurable + have hM : + AEMeasurable + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P := + hP.aemeasurable_coarseFullBlockMatrix_cubeSet Q + simpa [fullBlockFluctuationMatrixWithNormalizer, Abar, g] using! hg.comp_aemeasurable hM + +theorem aemeasurable_descendantsAverageFluctuationMatrixWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct center S Q j a) P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + AEMeasurable + (fun a : RegCoeffField d => + ∑ R ∈ D, + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S + (cubeSet R) a) P := by + refine (Finset.aemeasurable_sum D (fun R _hR => + aemeasurable_fullBlockFluctuationMatrixWithNormalizer_cubeSet + hP hStruct center S R)).congr ?_ + filter_upwards with a + simp + have hscaled : + AEMeasurable + (fun a : RegCoeffField d => + ((D.card : ℝ)⁻¹) • + (∑ R ∈ D, + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S + (cubeSet R) a)) P := + hsum.const_smul ((D.card : ℝ)⁻¹) + refine hscaled.congr ?_ + filter_upwards with a + rw [descendantsAverageFluctuationMatrixWithNormalizer, + descendantsAverageFullBlockMat_eq_smul_sum] + +theorem aemeasurable_descendantsAverageFluctuationOperatorNormSqWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a) P := by + let g : FullBlockMat d → ℝ := + fun M => ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) + have hg : Measurable g := by + let L : + FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (BlockCoord d) →L[ℝ] EuclideanSpace ℝ (BlockCoord d)) := { + toFun := fun M => Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M + map_add' := by + intro A B + exact map_add (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) A B + map_smul' := by + intro r A + exact map_smul (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ)) r A + } + have hcont : Continuous g := + ((continuous_norm.comp L.continuous_of_finiteDimensional).pow 2) + exact hcont.measurable + simpa [descendantsAverageFluctuationOperatorNormSqWithNormalizer, g] using! + hg.comp_aemeasurable + (aemeasurable_descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct center S Q j) + +theorem integrable_descendantsAverageFluctuationOperatorNormSqWithNormalizer_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) (S : FullBlockMat d) : + Integrable + (descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k)) P := by + classical + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + have hdomInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (cubeSet R) a)) P := by + simpa [Q, j] using + integrable_descendantsAverage_fullBlockFluctuationOperatorNormSqWithNormalizer_from_P4_of_stationary + hP hStruct hP4 m n k hk S + refine Integrable.mono' hdomInt + (aemeasurable_descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j).aestronglyMeasurable ?_ + filter_upwards with a + have hle := + descendantsAverageFluctuationOperatorNormSqWithNormalizer_le_descendantsAverage + hP hStruct (m : ℤ) S Q j a + have hleft_nonneg : + 0 ≤ descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j a := by + simp [descendantsAverageFluctuationOperatorNormSqWithNormalizer] + rw [Real.norm_of_nonneg (by simpa [Q, j] using hleft_nonneg)] + simpa [Q, j] using hle + +theorem memLp_two_blockJTraceAverageWithNormalizers_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (_m n k : ℕ) (_hk : k ≤ n) (S T : FullBlockMat d) : + MemLp + (blockJTraceAverageWithNormalizers S T + (originCube d (n : ℤ)) (n - k)) + (2 : ENNReal) P := by + classical + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + have hchild : + ∀ R, R ∈ descendantsAtDepth Q j → + MemLp + (fun a : RegCoeffField d => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) + (2 : ENNReal) P := by + intro R hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hR + have hQscale : Q.scale = (n : ℤ) := by simp [Q, originCube] + rw [hscale, hQscale] + have hj_le : j ≤ n := by + dsimp [j] + exact Nat.sub_le n k + exact sub_nonneg.mpr (by exact_mod_cast hj_le) + exact MeasureTheory.memLp_finsetSum Finset.univ + (fun α _hα => + memLp_two_blockJObservableCubeSetBlockVec_from_P4_of_stationary + hP hStruct hP4 R hR_nonneg + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + change + MemLp + (fun a : RegCoeffField d => + descendantsAverage (originCube d (n : ℤ)) (n - k) + (fun R => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a)) + (2 : ENNReal) P + simpa [Q, j, blockJTraceAverageWithNormalizers] using + Ch04.memLp_descendantsAverage (P := P) (Q := Q) (j := j) + (F := fun R a => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) + hchild + +theorem integrable_blockJTraceAverageSqWithNormalizers_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) (S T : FullBlockMat d) : + Integrable + (blockJTraceAverageSqWithNormalizers S T + (originCube d (n : ℤ)) (n - k)) P := by + have hmem := + memLp_two_blockJTraceAverageWithNormalizers_from_P4_of_stationary + hP hStruct hP4 m n k hk S T + simpa [blockJTraceAverageSqWithNormalizers, Real.norm_eq_abs, sq_abs] using! + hmem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + +/-- Integrated Section 5.6 variance estimate with quadratic `J` error and +arbitrary deterministic normalizers. The manuscript specialization is +`S = B^{-1/2}` and `T = B^{1/2}`. -/ +theorem fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_integral_le_two_descendantsAverageWithNormalizer_add_eight_blockJTraceAverageSqWithNormalizers + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) (S T : FullBlockMat d) : + ∫ a, + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) a ∂P ≤ + 2 * + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a ∂P + + 8 * + ∫ a, + blockJTraceAverageSqWithNormalizers S T + (originCube d (n : ℤ)) (n - k) a ∂P := by + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + let F : RegCoeffField d → ℝ := + fun a => + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S Q j a + let J : RegCoeffField d → ℝ := + fun a => blockJTraceAverageSqWithNormalizers S T Q j a + have hFInt : Integrable F P := by + simpa [F, Q, j] using + integrable_descendantsAverageFluctuationOperatorNormSqWithNormalizer_from_P4_of_stationary + hP hStruct hP4 m n k hk S + have hJInt : Integrable J P := by + simpa [J, Q, j] using + integrable_blockJTraceAverageSqWithNormalizers_from_P4_of_stationary + hP hStruct hP4 m n k hk S T + have hRhsInt : Integrable (fun a : RegCoeffField d => 2 * F a + 8 * J a) P := + (hFInt.const_mul (2 : ℝ)).add (hJInt.const_mul (8 : ℝ)) + have hpoint : + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct (m : ℤ) S Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => 2 * F a + 8 * J a := by + simpa [F, J, Q, j] using + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverageWithNormalizer_add_eight_blockJTraceAverageSqWithNormalizers_ae + hP hStruct (m : ℤ) S T Q j + have hmono : + ∫ a, + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct (m : ℤ) S Q a ∂P ≤ + ∫ a, 2 * F a + 8 * J a ∂P := by + refine integral_mono_of_nonneg ?_ hRhsInt hpoint + filter_upwards with a + simp [fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer, + fullBlockFluctuationOperatorNormSqWithNormalizer] + calc + ∫ a, + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) a ∂P + = ∫ a, + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct (m : ℤ) S Q a ∂P := by + rfl + _ ≤ ∫ a, 2 * F a + 8 * J a ∂P := hmono + _ = ∫ a, 2 * F a ∂P + ∫ a, 8 * J a ∂P := by + rw [integral_add (hFInt.const_mul (2 : ℝ)) (hJInt.const_mul (8 : ℝ))] + _ = 2 * ∫ a, F a ∂P + 8 * ∫ a, J a ∂P := by + rw [integral_const_mul, integral_const_mul] + _ = + 2 * + ∫ a, + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct (m : ℤ) S (originCube d (n : ℤ)) (n - k) a ∂P + + 8 * + ∫ a, + blockJTraceAverageSqWithNormalizers S T + (originCube d (n : ℤ)) (n - k) a ∂P := by + rfl +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Basic.lean new file mode 100644 index 0000000000..eb0d968749 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Basic.lean @@ -0,0 +1,516 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.WrapAround +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.FluctuationIntegrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.NormalizedBlocks +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression +public import Mathlib.Analysis.Matrix.PosDef +public import Mathlib.Tactic.NoncommRing + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +/-! +# Section 5.6: variance triangle for normalized block fluctuations + +This file records the part of Lemma `l.variance.estimate.quadratic` in which +the manuscript variance is interpreted by the Section 5.4 squared +Euclidean-operator-norm fluctuation observable. +-/ + +/-- Entrywise descendant average of full block matrices. -/ +noncomputable def descendantsAverageFullBlockMat {d : ℕ} + (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → FullBlockMat d) : FullBlockMat d := + fun α β => descendantsAverage Q j (fun R => F R α β) + +/-- The normalized fluctuation matrix of the descendant-average coarse block. -/ +noncomputable def descendantsAverageNormalizedFluctuationMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + FullBlockMat d := + descendantsAverageFullBlockMat Q j + (fun R => + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a) + +/-- Squared operator norm of the normalized descendant-average fluctuation. -/ +noncomputable def descendantsAverageNormalizedFluctuationOperatorNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : ℝ := + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a)‖ ^ + (2 : ℕ) + +/-- Normalized difference between the parent fluctuation and the descendant +average fluctuation. This is the operator-norm error term before it is +estimated by block `J`. -/ +noncomputable def normalizedCoarseAverageErrorMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + FullBlockMat d := + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet Q) a - + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a + +/-- The positive coarse-average defect, with the sign used by block +subadditivity. Its squared operator norm is the same as +`normalizedCoarseAverageErrorMatrix`. -/ +noncomputable def normalizedCoarseAveragePositiveErrorMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + FullBlockMat d := + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a - + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet Q) a + +/-- Squared operator norm of the normalized parent-minus-descendant-average +error. -/ +noncomputable def normalizedCoarseAverageErrorOperatorNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : ℝ := + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (normalizedCoarseAverageErrorMatrix hP hStruct center Q j a)‖ ^ + (2 : ℕ) + +/-- Full-block fluctuation normalized by an arbitrary deterministic matrix. +For the manuscript lemma, take `S = B^{-1/2}`; the congruence is written as +`Sᵀ M S`, which agrees with `B^{-1/2} M B^{-1/2}` for the symmetric positive +definite square root. -/ +noncomputable def fullBlockFluctuationMatrixWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (U : Set (Vec d)) + (a : RegCoeffField d) : FullBlockMat d := + let A := coarseBlockMatrix U a + let Abar := Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center + Matrix.transpose S * (toFullBlockMat A - toFullBlockMat Abar) * S + +/-- Squared operator norm of the arbitrary-normalizer full-block fluctuation. -/ +noncomputable def fullBlockFluctuationOperatorNormSqWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (U : Set (Vec d)) + (a : RegCoeffField d) : ℝ := + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (fullBlockFluctuationMatrixWithNormalizer hP hStruct center S U a)‖ ^ + (2 : ℕ) + +/-- Arbitrary-normalizer full-block fluctuation on a triadic cube. -/ +noncomputable def fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) + (a : RegCoeffField d) : ℝ := + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct center S (cubeSet Q) a + +/-- Descendant average of arbitrary-normalizer full-block fluctuation +matrices. -/ +noncomputable def descendantsAverageFluctuationMatrixWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : FullBlockMat d := + descendantsAverageFullBlockMat Q j + (fun R => + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S + (cubeSet R) a) + +/-- Squared operator norm of the descendant-average arbitrary-normalizer +fluctuation matrix. -/ +noncomputable def descendantsAverageFluctuationOperatorNormSqWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : ℝ := + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFluctuationMatrixWithNormalizer + hP hStruct center S Q j a)‖ ^ (2 : ℕ) + +/-- Parent-minus-descendant-average error for an arbitrary normalizer. -/ +noncomputable def coarseAverageErrorMatrixWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : FullBlockMat d := + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S (cubeSet Q) a - + descendantsAverageFluctuationMatrixWithNormalizer hP hStruct center S Q j a + +/-- Descendant-average-minus-parent error for an arbitrary normalizer, with the +sign used by block subadditivity. -/ +noncomputable def coarseAveragePositiveErrorMatrixWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : FullBlockMat d := + descendantsAverageFluctuationMatrixWithNormalizer hP hStruct center S Q j a - + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S (cubeSet Q) a + +/-- Squared operator norm of the arbitrary-normalizer parent-minus-descendant +average error. -/ +noncomputable def coarseAverageErrorOperatorNormSqWithNormalizer + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : ℝ := + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (coarseAverageErrorMatrixWithNormalizer hP hStruct center S Q j a)‖ ^ + (2 : ℕ) + +/-- The Ch4 block response observable, repackaged using the two block vectors +`P` and `Q`. The ordering matches the doubled formalism: +`BlockJ (p,q) (qStar,pStar)` is stored as +`blockJObservableCubeSet Q p pStar q qStar`. -/ +noncomputable def blockJObservableCubeSetBlockVec {d : ℕ} + (Q : TriadicCube d) (P Qv : BlockVec d) : RegCoeffField d → ℝ := + Ch04.blockJObservableCubeSet Q P.1 Qv.2 P.2 Qv.1 + +/-- Coordinate probe associated with an arbitrary full-block matrix. -/ +noncomputable def fullBlockMatrixProbe {d : ℕ} + (S : FullBlockMat d) (α : BlockCoord d) : BlockVec d := + ofFullBlockVec (Matrix.mulVec S (Pi.single α 1)) + +/-- The trace-type descendant-average `J` budget with arbitrary deterministic +normalizers. In the manuscript case, use `S = B^{-1/2}` and `T = B^{1/2}`. -/ +noncomputable def blockJTraceAverageWithNormalizers + {d : ℕ} (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : ℝ := + descendantsAverage Q j + (fun R => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) a) + +/-- Squared trace-type descendant-average `J` budget with arbitrary +normalizers. -/ +noncomputable def blockJTraceAverageSqWithNormalizers + {d : ℕ} (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : ℝ := + blockJTraceAverageWithNormalizers S T Q j a ^ (2 : ℕ) + +/-- Diagonal square-root multiplier dual to `Ch04.scalarFullBlockInvSqrtDiag`. +For the lower starred block the scalar block is `c⁻¹`, hence the square-root +multiplier is `(sqrt c)⁻¹`. -/ +noncomputable def scalarFullBlockSqrtDiag {d : ℕ} (b c : ℝ) : + BlockCoord d → ℝ + | Sum.inl _ => Real.sqrt b + | Sum.inr _ => (Real.sqrt c)⁻¹ + +/-- Coordinate probe `B^{-1/2} e_α` for the scalar block normalization at the +center scale. -/ +noncomputable def normalizedInvSqrtBlockProbe + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α : BlockCoord d) : BlockVec d := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + ofFullBlockVec (Pi.single α (Ch04.scalarFullBlockInvSqrtDiag b c α)) + +/-- Coordinate probe `B^{1/2} e_α` for the scalar block normalization at the +center scale. -/ +noncomputable def normalizedSqrtBlockProbe + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (α : BlockCoord d) : BlockVec d := + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + ofFullBlockVec (Pi.single α (scalarFullBlockSqrtDiag b c α)) + +/-- The manuscript trace-type descendant average +`avg_R sum_i J(R,B^{-1/2}e_i,B^{1/2}e_i)`, written for the scalar block +normalization used by the Section 5.4 fluctuation observable. -/ +noncomputable def normalizedBlockJTraceAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : ℝ := + descendantsAverage Q j + (fun R => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct center α) + (normalizedSqrtBlockProbe hP hStruct center α) a) + +/-- The upper-coordinate part of `normalizedBlockJTraceAverage`. The +wrap-around trace estimate naturally produces this half of the full block +trace budget; the lower half is nonnegative and is added back below. -/ +noncomputable def normalizedUpperBlockJTraceAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : ℝ := + descendantsAverage Q j + (fun R => + ∑ i : Fin d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct center (Sum.inl i)) + (normalizedSqrtBlockProbe hP hStruct center (Sum.inl i)) a) + +/-- Squared trace-type descendant average of the normalized block responses. -/ +noncomputable def normalizedBlockJTraceAverageSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : ℝ := + normalizedBlockJTraceAverage hP hStruct center Q j a ^ (2 : ℕ) + +theorem blockJObservableCubeSetBlockVec_nonneg {d : ℕ} + (Q : TriadicCube d) (P Qv : BlockVec d) (a : RegCoeffField d) : + 0 ≤ blockJObservableCubeSetBlockVec Q P Qv a := by + rcases P with ⟨p, q⟩ + rcases Qv with ⟨qStar, pStar⟩ + exact add_nonneg + (mul_nonneg (by norm_num) + (Ch04.restrictionResponseJObservableCubeSet_nonneg Q (p - pStar) (qStar - q) a)) + (mul_nonneg (by norm_num) + (Ch04.restrictionResponseJObservableCubeSet_nonneg Q (pStar + p) (qStar + q) + (adjointReg a))) + +theorem normalizedBlockJTraceAverage_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + 0 ≤ normalizedBlockJTraceAverage hP hStruct center Q j a := by + classical + unfold normalizedBlockJTraceAverage + exact descendantsAverage_nonneg Q j + (fun R => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct center α) + (normalizedSqrtBlockProbe hP hStruct center α) a) + (fun R _hR => + Finset.sum_nonneg fun α _hα => + blockJObservableCubeSetBlockVec_nonneg R + (normalizedInvSqrtBlockProbe hP hStruct center α) + (normalizedSqrtBlockProbe hP hStruct center α) a) + +theorem normalizedUpperBlockJTraceAverage_le_normalizedBlockJTraceAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + normalizedUpperBlockJTraceAverage hP hStruct center Q j a ≤ + normalizedBlockJTraceAverage hP hStruct center Q j a := by + classical + unfold normalizedUpperBlockJTraceAverage normalizedBlockJTraceAverage + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R _hR + rw [Fintype.sum_sum_type] + exact le_add_of_nonneg_right + (Finset.sum_nonneg fun i _hi => + blockJObservableCubeSetBlockVec_nonneg R + (normalizedInvSqrtBlockProbe hP hStruct center (Sum.inr i)) + (normalizedSqrtBlockProbe hP hStruct center (Sum.inr i)) a) + +theorem normalizedBlockJTraceAverageSq_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + 0 ≤ normalizedBlockJTraceAverageSq hP hStruct center Q j a := by + unfold normalizedBlockJTraceAverageSq + exact sq_nonneg _ + +theorem memLp_two_comp_adjointCoeffField + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {X : RegCoeffField d → ℝ} + (hAdj : Ch04.RestrictionAdjointInvariantLaw P) (hX : MemLp X (2 : ENNReal) P) : + MemLp (fun a : RegCoeffField d => X (adjointReg a)) (2 : ENNReal) P := by + have hmap : MemLp X (2 : ENNReal) (Measure.map adjointReg P) := by + exact hAdj.symm ▸ hX + exact hmap.comp_of_map measurable_adjointReg.aemeasurable + +theorem memLp_two_blockJObservableCubeSetBlockVec_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (R : TriadicCube d) (hR_nonneg : 0 ≤ R.scale) (Pvec Qvec : BlockVec d) : + MemLp (blockJObservableCubeSetBlockVec R Pvec Qvec) (2 : ENNReal) P := by + rcases Pvec with ⟨p, q⟩ + rcases Qvec with ⟨qStar, pStar⟩ + have hJ₁ : + MemLp (Ch04.restrictionResponseJObservableCubeSet R (p - pStar) (qStar - q)) + (2 : ENNReal) P := + Homogenization.Book.Ch05.Section53.JUpperBoundCoarseFluctuations.memLp_two_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hStruct.stationary hStruct hP4 R hR_nonneg (p - pStar) (qStar - q) + have hJ₂base : + MemLp (Ch04.restrictionResponseJObservableCubeSet R (pStar + p) (qStar + q)) + (2 : ENNReal) P := + Homogenization.Book.Ch05.Section53.JUpperBoundCoarseFluctuations.memLp_two_restrictionResponseJObservableCubeSet_cubeSet_from_P4_of_stationary + hP hStruct.stationary hStruct hP4 R hR_nonneg (pStar + p) (qStar + q) + have hJ₂ : + MemLp + (fun a : RegCoeffField d => + Ch04.restrictionResponseJObservableCubeSet R (pStar + p) (qStar + q) + (adjointReg a)) + (2 : ENNReal) P := + memLp_two_comp_adjointCoeffField hStruct.adjoint_invariant hJ₂base + have hsum : + MemLp + (fun a : RegCoeffField d => + (1 / 2 : ℝ) * + Ch04.restrictionResponseJObservableCubeSet R (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + Ch04.restrictionResponseJObservableCubeSet R (pStar + p) (qStar + q) + (adjointReg a)) + (2 : ENNReal) P := + (hJ₁.const_mul (1 / 2 : ℝ)).add (hJ₂.const_mul (1 / 2 : ℝ)) + change + MemLp + (fun a : RegCoeffField d => + (1 / 2 : ℝ) * + Ch04.restrictionResponseJObservableCubeSet R (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + Ch04.restrictionResponseJObservableCubeSet R (pStar + p) (qStar + q) + (adjointReg a)) + (2 : ENNReal) P + exact hsum + +theorem memLp_two_normalizedBlockJTraceAverage_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (_hk : k ≤ n) : + MemLp + (normalizedBlockJTraceAverage hP hStruct (m : ℤ) + (originCube d (n : ℤ)) (n - k)) + (2 : ENNReal) P := by + classical + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + have hchild : + ∀ R, R ∈ descendantsAtDepth Q j → + MemLp + (fun a : RegCoeffField d => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct (m : ℤ) α) + (normalizedSqrtBlockProbe hP hStruct (m : ℤ) α) a) + (2 : ENNReal) P := by + intro R hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hR + have hQscale : Q.scale = (n : ℤ) := by simp [Q, originCube] + rw [hscale, hQscale] + have hj_le : j ≤ n := by + dsimp [j] + exact Nat.sub_le n k + exact sub_nonneg.mpr (by exact_mod_cast hj_le) + exact MeasureTheory.memLp_finsetSum Finset.univ + (fun α _hα => + memLp_two_blockJObservableCubeSetBlockVec_from_P4_of_stationary + hP hStruct hP4 R hR_nonneg + (normalizedInvSqrtBlockProbe hP hStruct (m : ℤ) α) + (normalizedSqrtBlockProbe hP hStruct (m : ℤ) α)) + change + MemLp + (fun a : RegCoeffField d => + descendantsAverage (originCube d (n : ℤ)) (n - k) + (fun R => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct (m : ℤ) α) + (normalizedSqrtBlockProbe hP hStruct (m : ℤ) α) a)) + (2 : ENNReal) P + simpa [Q, j] using + Ch04.memLp_descendantsAverage (P := P) (Q := Q) (j := j) + (F := fun R a => + ∑ α : BlockCoord d, + blockJObservableCubeSetBlockVec R + (normalizedInvSqrtBlockProbe hP hStruct (m : ℤ) α) + (normalizedSqrtBlockProbe hP hStruct (m : ℤ) α) a) + hchild + +theorem integrable_normalizedBlockJTraceAverageSq_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) : + Integrable + (normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) + (originCube d (n : ℤ)) (n - k)) P := by + have hmem := + memLp_two_normalizedBlockJTraceAverage_from_P4_of_stationary + hP hStruct hP4 m n k hk + simpa [normalizedBlockJTraceAverageSq, Real.norm_eq_abs, sq_abs] using! + hmem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + +theorem doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) (Q : TriadicCube d) + (P Qv : BlockVec d) : + Ch02.doubledResponseJ (Ch02.cubeDomain Q) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn Q) + P Qv = + blockJObservableCubeSetBlockVec Q P Qv a := by + rcases P with ⟨p, q⟩ + rcases Qv with ⟨qStar, pStar⟩ + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hresp₁ : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (p - pStar) (qStar - q) = + Ch04.restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (p - pStar) (qStar - q) + = ResponseJ (openCubeSet Q) (p - pStar) (qStar - q) a.toFun := by + simpa [F, Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + Ch04.coeffOnOfAEEllipticOn_toCoeffField, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q) (p - pStar) (qStar - q) + _ = Ch04.restrictionResponseJObservableCubeSet Q (p - pStar) (qStar - q) a := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (p - pStar) (qStar - q) a.toFun] + rfl + have hresp₂ : + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) = + Ch04.restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) + (adjointReg a) := by + calc + Ch02.responseJ (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) + = ResponseJ (openCubeSet Q) (pStar + p) (qStar + q) + (adjointCoeffField a.toFun) := by + have hAdj : + ((F.coeffOn Q).transpose).toCoeffField = adjointCoeffField a.toFun := by + funext x + simp [F, Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + Ch04.coeffOnOfAEEllipticOn_toCoeffField, adjointCoeffField] + simpa [F, hAdj, Ch02.cubeDomain_coe] using + Homogenization.Internal.Ch02.book_responseJ_eq_ResponseJ + (Ch02.cubeDomain Q) (F.coeffOn Q).transpose + (pStar + p) (qStar + q) + _ = Ch04.restrictionResponseJObservableCubeSet Q (pStar + p) (qStar + q) + (adjointReg a) := by + rw [← responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (pStar + p) (qStar + q) (adjointCoeffField a.toFun)] + rfl + rw [Ch02.doubledResponseJ_eq_half_responseJ_adjoint_sum] + simp [blockJObservableCubeSetBlockVec, F, hresp₁, hresp₂] +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ErrorBounds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ErrorBounds.lean new file mode 100644 index 0000000000..bbb4e9eae7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/ErrorBounds.lean @@ -0,0 +1,641 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.MatrixTools + +/-! # Error Bounds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +theorem restrictsTo_descendantsDomainPartition_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (j : ℕ) : + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + intro F Pcell i + let k : ℤ := Q.scale - (j : ℤ) + have hk : k ≤ Q.scale := by + dsimp [k] + have hj : (0 : ℤ) ≤ (j : ℤ) := by exact_mod_cast Nat.zero_le j + linarith + have hiScale : i.1 ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simp [k, i.2] + exact F.restrictsTo_descendant hk hiScale + +theorem normalizedPositiveError_trace_le_two_upperBlockJTraceAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) : + Ch02.fullBlockTrace + (normalizedCoarseAveragePositiveErrorMatrix hP hStruct (m : ℤ) Q j a) ≤ + 2 * normalizedUpperBlockJTraceAverage hP hStruct (m : ℤ) Q j a := by + classical + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let r : BlockCoord d → ℝ := Ch04.scalarFullBlockInvSqrtDiag b c + let D : FullBlockMat d := Matrix.diagonal r + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hb : 0 < b := by + simpa [b] using Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 m + have hc : 0 < c := by + simpa [c] using Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have hcb : c ≤ b := by + simpa [b, c] using + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hP4 m + have hsqrtb_ne : Real.sqrt b ≠ 0 := ne_of_gt (Real.sqrt_pos.mpr hb) + have hcp2 : (Real.sqrt b)⁻¹ * (Real.sqrt b)⁻¹ = b⁻¹ := by + field_simp [hsqrtb_ne] + rw [Real.sq_sqrt hb.le] + have hcq2 : Real.sqrt b * Real.sqrt b = b := by + simpa [sq] using Real.sq_sqrt hb.le + have hcpq : (Real.sqrt b)⁻¹ * Real.sqrt b = 1 := + inv_mul_cancel₀ hsqrtb_ne + have hrUpper : ∀ i : Fin d, r (Sum.inl i) * r (Sum.inl i) ≤ b⁻¹ := by + intro i + dsimp [r, Ch04.scalarFullBlockInvSqrtDiag] + exact le_of_eq hcp2 + have hrLower : ∀ i : Fin d, r (Sum.inr i) * r (Sum.inr i) ≤ b := by + intro i + dsimp [r, Ch04.scalarFullBlockInvSqrtDiag] + calc + Real.sqrt c * Real.sqrt c = c := by + simpa [sq] using Real.sq_sqrt hc.le + _ ≤ b := hcb + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + simpa [F, Pcell] using + restrictsTo_descendantsDomainPartition_of_aelocallyUniformlyEllipticField + ha Q j + have hParent : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + have hD : + Matrix.diagonal r = + Matrix.diagonal + (Ch04.scalarFullBlockInvSqrtDiag + (hP.barSigmaAtScale hStruct (m : ℤ)) + (hP.barSigmaStarAtScale hStruct (m : ℤ))) := by + rfl + have hJ : + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ l : Fin d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + ((Real.sqrt b)⁻¹ • (Pi.single l 1 : Vec d), (0 : Vec d)) + (Real.sqrt b • (Pi.single l 1 : Vec d), (0 : Vec d))) = + normalizedUpperBlockJTraceAverage hP hStruct (m : ℤ) Q j a := by + calc + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ l : Fin d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + ((Real.sqrt b)⁻¹ • (Pi.single l 1 : Vec d), (0 : Vec d)) + (Real.sqrt b • (Pi.single l 1 : Vec d), (0 : Vec d))) + = + descendantsAverage Q j + (fun R => + ∑ l : Fin d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + ((Real.sqrt b)⁻¹ • (Pi.single l 1 : Vec d), (0 : Vec d)) + (Real.sqrt b • (Pi.single l 1 : Vec d), (0 : Vec d))) := by + simpa [Pcell] using! + Ch02.descendantsDomainPartition_weightedAverage Q j + (fun R : TriadicCube d => + ∑ l : Fin d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + ((Real.sqrt b)⁻¹ • (Pi.single l 1 : Vec d), (0 : Vec d)) + (Real.sqrt b • (Pi.single l 1 : Vec d), (0 : Vec d))) + _ = normalizedUpperBlockJTraceAverage hP hStruct (m : ℤ) Q j a := by + unfold normalizedUpperBlockJTraceAverage + congr 1 + funext R + refine Finset.sum_congr rfl ?_ + intro l _hl + rw [doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + ha R] + rw [normalizedInvSqrtBlockProbe_inl_eq hP hStruct (m : ℤ) l, + normalizedSqrtBlockProbe_inl_eq hP hStruct (m : ℤ) l] + have htrace := + Ch02.weightedBlockAverage_wrapAround_normalizedTrace_le_specialCoordinateDoubledResponseJ + (a := F.coeffOn Q) (Pcell := Pcell) + (aCell := fun i : Pcell.Cell => F.coeffOn i.1) hcell + (σ := b) (cp := (Real.sqrt b)⁻¹) (cq := Real.sqrt b) + hcp2 hcq2 hcpq r hrUpper hrLower + have hPositive := + normalizedCoarseAveragePositiveErrorMatrix_eq_diagonal_blockSub + hP hStruct (m : ℤ) Q j a + rw [hPositive] + simpa [b, c, r, D, F, Pcell, hParent.symm, hAvg, hD, hJ] using htrace + +theorem positiveErrorWithNormalizer_trace_le_two_blockJTraceAverageWithNormalizers + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + Ch02.fullBlockTrace + (coarseAveragePositiveErrorMatrixWithNormalizer + hP hStruct center S Q j a) ≤ + 2 * blockJTraceAverageWithNormalizers S T Q j a := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + have hcell : + ∀ i : Pcell.Cell, Ch02.CoeffOn.RestrictsTo (F.coeffOn Q) (F.coeffOn i.1) := by + simpa [F, Pcell] using + restrictsTo_descendantsDomainPartition_of_aelocallyUniformlyEllipticField + ha Q j + have hParent : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + have hJ : + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) = + blockJTraceAverageWithNormalizers S T Q j a := by + calc + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + = + descendantsAverage Q j + (fun R => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) := by + simpa [Pcell] using! + Ch02.descendantsDomainPartition_weightedAverage Q j + (fun R : TriadicCube d => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Ch02.cubeDomain R) (F.coeffOn R) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + _ = blockJTraceAverageWithNormalizers S T Q j a := by + unfold blockJTraceAverageWithNormalizers + congr 1 + funext R + refine Finset.sum_congr rfl ?_ + intro α _hα + rw [doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + ha R] + have hParentBudget_nonneg : + 0 ≤ fullBlockJTraceBudgetWithNormalizers S T (coarseBlockMatrix (cubeSet Q) a.toFun) := by + rw [hParent] + rw [← sum_doubledResponseJ_fullBlockNormalizers_eq_traceBudget + (U := Ch02.cubeDomain Q) (a := F.coeffOn Q) S T] + exact Finset.sum_nonneg fun α _hα => + Ch02.doubledResponseJ_nonneg (Ch02.cubeDomain Q) (F.coeffOn Q) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α) + have hBudgetAvg : + fullBlockJTraceBudgetWithNormalizers S T + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) = + blockJTraceAverageWithNormalizers S T Q j a := by + calc + fullBlockJTraceBudgetWithNormalizers S T + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) + = + fullBlockJTraceBudgetWithNormalizers S T + (Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := by + rw [hAvg] + _ = + Pcell.weightedAverage + (fun i : Pcell.Cell => + fullBlockJTraceBudgetWithNormalizers S T + (Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := by + rw [fullBlockJTraceBudgetWithNormalizers_weightedBlockAverage] + _ = + Pcell.weightedAverage + (fun i : Pcell.Cell => + ∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) := by + unfold Ch02.DomainPartition.weightedAverage + refine Finset.sum_congr rfl ?_ + intro i _hi + change + Pcell.weight i * + fullBlockJTraceBudgetWithNormalizers S T + (Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + Pcell.weight i * + (∑ α : BlockCoord d, + Ch02.doubledResponseJ (Pcell.cell i) (F.coeffOn i.1) + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + rw [← sum_doubledResponseJ_fullBlockNormalizers_eq_traceBudget + (U := Pcell.cell i) (a := F.coeffOn i.1) S T] + _ = blockJTraceAverageWithNormalizers S T Q j a := hJ + have hAB : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet Q) a.toFun) + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + let k : ℤ := Q.scale - (j : ℤ) + have hk : k ≤ Q.scale := by + dsimp [k] + have hj : (0 : ℤ) ≤ (j : ℤ) := by exact_mod_cast Nat.zero_le j + linarith + simpa [k] using + Ch04.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + ha Q hk + have htrace := + fullBlockTrace_transpose_blockSub_le_two_fullBlockJTraceBudgetWithNormalizers + S T hAB (BlockMatLoewnerLE.blockReflect' hAB) hParentBudget_nonneg + have hPositive := + coarseAveragePositiveErrorMatrixWithNormalizer_eq_transpose_blockSub + hP hStruct center S Q j a + rw [hPositive] + simpa [hBudgetAvg] using htrace + +theorem normalizedCoarseAveragePositiveErrorMatrix_posSemidef + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) : + (normalizedCoarseAveragePositiveErrorMatrix hP hStruct center Q j a).PosSemidef := by + classical + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let r : BlockCoord d → ℝ := Ch04.scalarFullBlockInvSqrtDiag b c + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + let k : ℤ := Q.scale - (j : ℤ) + have hk : k ≤ Q.scale := by + dsimp [k] + have hj : (0 : ℤ) ≤ (j : ℤ) := by exact_mod_cast Nat.zero_le j + linarith + have hSub : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet Q) a.toFun) + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + simpa [k] using + Ch04.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + ha Q hk + have hParentSymm : + IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + have hParent : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hParent] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + have hAvgSymm : + IsSymmetricBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + have hWeightedSymm : + IsSymmetricBlockMat + (Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := + Ch02.isSymmetricBlockMat_weightedBlockAverage Pcell + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + (fun i => Ch02.isSymmetricBlockMat_coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + simpa [hAvg] using hWeightedSymm + have hPositive := + normalizedCoarseAveragePositiveErrorMatrix_eq_diagonal_blockSub + hP hStruct center Q j a + rw [hPositive] + exact diagonal_blockSub_posSemidef_of_blockMatLoewnerLE + r hSub hParentSymm hAvgSymm + +theorem coarseAveragePositiveErrorMatrixWithNormalizer_posSemidef + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + (coarseAveragePositiveErrorMatrixWithNormalizer + hP hStruct center S Q j a).PosSemidef := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let Pcell : Ch02.DomainPartition (Ch02.cubeDomain Q) := + Ch02.descendantsDomainPartition Q j + let k : ℤ := Q.scale - (j : ℤ) + have hk : k ≤ Q.scale := by + dsimp [k] + have hj : (0 : ℤ) ≤ (j : ℤ) := by exact_mod_cast Nat.zero_le j + linarith + have hSub : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet Q) a.toFun) + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + simpa [k] using + Ch04.coarseBlockMatrix_le_descendantsAverageBlockMat_cubeSet_of_aelocallyUniformlyEllipticField + ha Q hk + have hParentSymm : + IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + have hParent : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hParent] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) + have hTerm : + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) = + fun R : TriadicCube d => coarseBlockMatrix (cubeSet R) a.toFun := by + funext R + simpa [F] using + (Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha R).symm + have hAvg : + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) = + descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + calc + Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + = + descendantsAverageBlockMat Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) := by + simpa [Pcell, Ch02.descendantsDomainPartition] using + Ch02.descendantsDomainPartition_weightedBlockAverage Q j + (fun R : TriadicCube d => + Ch02.coarseBlockMatrix (Ch02.cubeDomain R) (F.coeffOn R)) + _ = descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun) := by + rw [hTerm] + have hAvgSymm : + IsSymmetricBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) := by + have hWeightedSymm : + IsSymmetricBlockMat + (Pcell.weightedBlockAverage + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1))) := + Ch02.isSymmetricBlockMat_weightedBlockAverage Pcell + (fun i : Pcell.Cell => + Ch02.coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + (fun i => Ch02.isSymmetricBlockMat_coarseBlockMatrix (Pcell.cell i) (F.coeffOn i.1)) + simpa [hAvg] using hWeightedSymm + have hPositive := + coarseAveragePositiveErrorMatrixWithNormalizer_eq_transpose_blockSub + hP hStruct center S Q j a + rw [hPositive] + exact transpose_blockSub_posSemidef_of_blockMatLoewnerLE + S hSub hParentSymm hAvgSymm + +theorem coarseAverageErrorOperatorNormSqWithNormalizer_le_four_blockJTraceAverageSqWithNormalizers + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) : + coarseAverageErrorOperatorNormSqWithNormalizer hP hStruct center S Q j a ≤ + 4 * blockJTraceAverageSqWithNormalizers S T Q j a := by + classical + let M : FullBlockMat d := + coarseAveragePositiveErrorMatrixWithNormalizer hP hStruct center S Q j a + let J : ℝ := blockJTraceAverageWithNormalizers S T Q j a + have hErrorMatrix : + coarseAverageErrorMatrixWithNormalizer hP hStruct center S Q j a = -M := by + simp [M, coarseAverageErrorMatrixWithNormalizer, + coarseAveragePositiveErrorMatrixWithNormalizer, sub_eq_add_neg, add_comm] + have hErrorSq : + coarseAverageErrorOperatorNormSqWithNormalizer hP hStruct center S Q j a = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + simp [coarseAverageErrorOperatorNormSqWithNormalizer, hErrorMatrix] + have hPSD : M.PosSemidef := by + simpa [M] using + coarseAveragePositiveErrorMatrixWithNormalizer_posSemidef + hP hStruct center S Q j ha + have htrace : + Ch02.fullBlockTrace M ≤ 2 * J := by + simpa [M, J] using + positiveErrorWithNormalizer_trace_le_two_blockJTraceAverageWithNormalizers + hP hStruct center S T Q j ha + have htrace_nonneg : 0 ≤ Ch02.fullBlockTrace M := by + have hfull : Ch02.fullBlockTrace M = M.trace := by + simp [Ch02.fullBlockTrace, Matrix.trace] + rw [hfull] + exact hPSD.trace_nonneg + calc + coarseAverageErrorOperatorNormSqWithNormalizer hP hStruct center S Q j a + = ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := + hErrorSq + _ ≤ Ch02.fullBlockTrace M ^ (2 : ℕ) := + fullBlockOperatorNormSq_le_trace_sq_of_posSemidef M hPSD + _ ≤ (2 * J) ^ (2 : ℕ) := + pow_le_pow_left₀ htrace_nonneg htrace 2 + _ = 4 * blockJTraceAverageSqWithNormalizers S T Q j a := by + simp [blockJTraceAverageSqWithNormalizers, J] + ring + +theorem coarseAverageErrorOperatorNormSqWithNormalizer_le_four_blockJTraceAverageSqWithNormalizers_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + coarseAverageErrorOperatorNormSqWithNormalizer hP hStruct center S Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 4 * blockJTraceAverageSqWithNormalizers S T Q j a := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + exact coarseAverageErrorOperatorNormSqWithNormalizer_le_four_blockJTraceAverageSqWithNormalizers + hP hStruct center S T Q j ha + +theorem normalizedCoarseAverageErrorOperatorNormSq_le_four_normalizedBlockJTraceAverageSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) {a : RegCoeffField d} + (ha : Ch04.AELocallyUniformlyEllipticField a) : + normalizedCoarseAverageErrorOperatorNormSq hP hStruct (m : ℤ) Q j a ≤ + 4 * normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a := by + classical + let M : FullBlockMat d := + normalizedCoarseAveragePositiveErrorMatrix hP hStruct (m : ℤ) Q j a + let J : ℝ := normalizedBlockJTraceAverage hP hStruct (m : ℤ) Q j a + have hErrorMatrix : + normalizedCoarseAverageErrorMatrix hP hStruct (m : ℤ) Q j a = -M := by + simp [M, normalizedCoarseAverageErrorMatrix, + normalizedCoarseAveragePositiveErrorMatrix, sub_eq_add_neg, add_comm] + have hErrorSq : + normalizedCoarseAverageErrorOperatorNormSq hP hStruct (m : ℤ) Q j a = + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := by + simp [normalizedCoarseAverageErrorOperatorNormSq, hErrorMatrix] + have hPSD : M.PosSemidef := by + simpa [M] using + normalizedCoarseAveragePositiveErrorMatrix_posSemidef + hP hStruct (m : ℤ) Q j ha + have htraceUpper := + normalizedPositiveError_trace_le_two_upperBlockJTraceAverage + hP hStruct hP4 m Q j ha + have hupper_le : + normalizedUpperBlockJTraceAverage hP hStruct (m : ℤ) Q j a ≤ J := by + simpa [J] using + normalizedUpperBlockJTraceAverage_le_normalizedBlockJTraceAverage + hP hStruct (m : ℤ) Q j a + have htrace : Ch02.fullBlockTrace M ≤ 2 * J := by + simpa [M, J] using htraceUpper.trans (by nlinarith) + have htrace_nonneg : 0 ≤ Ch02.fullBlockTrace M := by + have hfull : Ch02.fullBlockTrace M = M.trace := by + simp [Ch02.fullBlockTrace, Matrix.trace] + rw [hfull] + exact hPSD.trace_nonneg + calc + normalizedCoarseAverageErrorOperatorNormSq hP hStruct (m : ℤ) Q j a + = ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) := + hErrorSq + _ ≤ Ch02.fullBlockTrace M ^ (2 : ℕ) := + fullBlockOperatorNormSq_le_trace_sq_of_posSemidef M hPSD + _ ≤ (2 * J) ^ (2 : ℕ) := + pow_le_pow_left₀ htrace_nonneg htrace 2 + _ = 4 * normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a := by + simp [normalizedBlockJTraceAverageSq, J] + ring + +theorem normalizedCoarseAverageErrorOperatorNormSq_le_four_normalizedBlockJTraceAverageSq_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + normalizedCoarseAverageErrorOperatorNormSq hP hStruct (m : ℤ) Q j a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 4 * normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a := by + filter_upwards [hP.ae_locallyUniformlyEllipticField] with a ha + exact normalizedCoarseAverageErrorOperatorNormSq_le_four_normalizedBlockJTraceAverageSq + hP hStruct hP4 m Q j ha +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/MatrixTools.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/MatrixTools.lean new file mode 100644 index 0000000000..6dd7f13b42 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/MatrixTools.lean @@ -0,0 +1,398 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.TraceBudget + +/-! # Matrix Tools -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +theorem normalizedInvSqrtBlockProbe_inl_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (i : Fin d) : + normalizedInvSqrtBlockProbe hP hStruct center (Sum.inl i) = + ((Real.sqrt (hP.barSigmaAtScale hStruct center))⁻¹ • Pi.single i 1, 0) := by + ext k + · by_cases hki : k = i + · subst k + simp [normalizedInvSqrtBlockProbe, Ch04.scalarFullBlockInvSqrtDiag, + ofFullBlockVec, Pi.single, smul_eq_mul] + · simp [normalizedInvSqrtBlockProbe, Ch04.scalarFullBlockInvSqrtDiag, + ofFullBlockVec, Pi.single, smul_eq_mul, hki] + · simp [normalizedInvSqrtBlockProbe, Ch04.scalarFullBlockInvSqrtDiag, + ofFullBlockVec, Pi.single] + +theorem normalizedSqrtBlockProbe_inl_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (i : Fin d) : + normalizedSqrtBlockProbe hP hStruct center (Sum.inl i) = + (Real.sqrt (hP.barSigmaAtScale hStruct center) • Pi.single i 1, 0) := by + ext k + · by_cases hki : k = i + · subst k + simp [normalizedSqrtBlockProbe, scalarFullBlockSqrtDiag, + ofFullBlockVec, Pi.single, smul_eq_mul] + · simp [normalizedSqrtBlockProbe, scalarFullBlockSqrtDiag, + ofFullBlockVec, Pi.single, smul_eq_mul, hki] + · simp [normalizedSqrtBlockProbe, scalarFullBlockSqrtDiag, + ofFullBlockVec, Pi.single] + +theorem fullBlockOperatorNorm_le_trace_of_posSemidef + {d : ℕ} (M : FullBlockMat d) (hM : M.PosSemidef) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ≤ + Ch02.fullBlockTrace M := by + classical + let hHerm : M.IsHermitian := hM.isHermitian + have heig_nonneg : ∀ α : BlockCoord d, 0 ≤ hHerm.eigenvalues α := + hM.eigenvalues_nonneg + have hsum_nonneg : 0 ≤ ∑ α : BlockCoord d, hHerm.eigenvalues α := + Finset.sum_nonneg fun α _hα => heig_nonneg α + let D : FullBlockMat d := Matrix.diagonal hHerm.eigenvalues + have hspectral : M = Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D := by + simpa [D] using hHerm.spectral_theorem + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ + = ‖M‖ := Matrix.l2_opNorm_toEuclideanCLM M + _ = ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ := + congrArg (fun N : FullBlockMat d => ‖N‖) hspectral + _ = ‖D‖ := by + calc + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ = + ‖(hHerm.eigenvectorUnitary : FullBlockMat d) * D * + star (hHerm.eigenvectorUnitary : FullBlockMat d)‖ := by + simp [Unitary.conjStarAlgAut_apply] + _ = ‖D * star (hHerm.eigenvectorUnitary : FullBlockMat d)‖ := by + rw [mul_assoc, CStarRing.norm_coe_unitary_mul] + _ = ‖D * (star hHerm.eigenvectorUnitary : unitary (FullBlockMat d))‖ := by + simp + _ = ‖D‖ := by + rw [CStarRing.norm_mul_coe_unitary] + _ = ‖hHerm.eigenvalues‖ := by + simp [D] + _ ≤ ∑ α : BlockCoord d, hHerm.eigenvalues α := by + refine (pi_norm_le_iff_of_nonneg hsum_nonneg).mpr ?_ + intro α + calc + ‖hHerm.eigenvalues α‖ = hHerm.eigenvalues α := by + simp [Real.norm_eq_abs, abs_of_nonneg (heig_nonneg α)] + _ ≤ ∑ β : BlockCoord d, hHerm.eigenvalues β := + Finset.single_le_sum (fun β _hβ => heig_nonneg β) (Finset.mem_univ α) + _ = Ch02.fullBlockTrace M := by + symm + calc + Ch02.fullBlockTrace M = M.trace := by + simp [Ch02.fullBlockTrace, Matrix.trace] + _ = ∑ α : BlockCoord d, hHerm.eigenvalues α := by + simpa using hHerm.trace_eq_sum_eigenvalues + +theorem fullBlockOperatorNormSq_le_trace_sq_of_posSemidef + {d : ℕ} (M : FullBlockMat d) (hM : M.PosSemidef) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) ≤ + Ch02.fullBlockTrace M ^ (2 : ℕ) := by + exact pow_le_pow_left₀ (norm_nonneg _) + (fullBlockOperatorNorm_le_trace_of_posSemidef M hM) 2 + +theorem blockSub_posSemidef_of_blockMatLoewnerLE + {d : ℕ} {A B : BlockMat d} + (hAB : BlockMatLoewnerLE A B) + (hA : IsSymmetricBlockMat A) (hB : IsSymmetricBlockMat B) : + (toFullBlockMat B - toFullBlockMat A).PosSemidef := by + classical + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?hHerm ?hquad + · have hA_full : (toFullBlockMat A).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + have hB_full : (toFullBlockMat B).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat hB + have hdiff : (toFullBlockMat B - toFullBlockMat A).IsSymm := hB_full.sub hA_full + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hdiff + · intro q + let X : BlockVec d := ofFullBlockVec q + have hquad_eq : + Section54.VarianceBoundGoodScale.fullBlockQuadratic + (toFullBlockMat B - toFullBlockMat A) q = + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) X) := by + unfold Section54.VarianceBoundGoodScale.fullBlockQuadratic + rw [← dotProduct_toFullBlockVec X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) X)] + rw [toFullBlockVec_blockMatVecMul] + simp [X] + have hdiff_dot : + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) X) = + blockVecDot X (blockMatVecMul B X) - + blockVecDot X (blockMatVecMul A X) := by + simpa using blockVecDot_blockMatVecMul_ofFullBlockMat_sub B A X + have horder := hAB X + change 0 ≤ + Section54.VarianceBoundGoodScale.fullBlockQuadratic + (toFullBlockMat B - toFullBlockMat A) q + rw [hquad_eq, hdiff_dot] + nlinarith + +theorem transpose_blockSub_posSemidef_of_blockMatLoewnerLE + {d : ℕ} (S : FullBlockMat d) {A B : BlockMat d} + (hAB : BlockMatLoewnerLE A B) + (hA : IsSymmetricBlockMat A) (hB : IsSymmetricBlockMat B) : + (Matrix.transpose S * (toFullBlockMat B - toFullBlockMat A) * S).PosSemidef := by + have hPSD := blockSub_posSemidef_of_blockMatLoewnerLE hAB hA hB + simpa [Matrix.conjTranspose] using! hPSD.conjTranspose_mul_mul_same S + +theorem diagonal_blockSub_posSemidef_of_blockMatLoewnerLE + {d : ℕ} {A B : BlockMat d} (r : BlockCoord d → ℝ) + (hAB : BlockMatLoewnerLE A B) + (hA : IsSymmetricBlockMat A) (hB : IsSymmetricBlockMat B) : + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r).PosSemidef := by + classical + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?hHerm ?hquad + · have hA_full : (toFullBlockMat A).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + have hB_full : (toFullBlockMat B).IsSymm := + isSymm_toFullBlockMat_of_isSymmetricBlockMat hB + have hdiff : (toFullBlockMat B - toFullBlockMat A).IsSymm := hB_full.sub hA_full + have hsymm := + Section54.VarianceBoundGoodScale.isSymm_diagonal_mul_fullBlockMat_mul_diagonal + r hdiff + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hsymm + · intro q + let X : BlockVec d := ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q) + have hquad_eq : + Section54.VarianceBoundGoodScale.fullBlockQuadratic + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) q = + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) X) := by + simpa [X] using + Section54.VarianceBoundGoodScale.fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + r (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) q + have hdiff_dot : + blockVecDot X + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) X) = + blockVecDot X (blockMatVecMul B X) - + blockVecDot X (blockMatVecMul A X) := by + simpa using blockVecDot_blockMatVecMul_ofFullBlockMat_sub B A X + have horder := hAB X + change 0 ≤ + Section54.VarianceBoundGoodScale.fullBlockQuadratic + (Matrix.diagonal r * (toFullBlockMat B - toFullBlockMat A) * + Matrix.diagonal r) q + rw [hquad_eq, hdiff_dot] + nlinarith + +theorem toFullBlockMat_descendantsAverageBlockMat + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → BlockMat d) : + toFullBlockMat (descendantsAverageBlockMat Q j F) = + descendantsAverageFullBlockMat Q j (fun R => toFullBlockMat (F R)) := by + ext α β + cases α <;> cases β <;> + simp [descendantsAverageFullBlockMat, descendantsAverageBlockMat, + descendantsAverageMat, toFullBlockMat] + +theorem descendantsAverageFullBlockMat_eq_smul_sum + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → FullBlockMat d) : + descendantsAverageFullBlockMat Q j F = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ • + (descendantsAtDepth Q j).sum F := by + ext α β + simp [descendantsAverageFullBlockMat, descendantsAverage, Matrix.sum_apply] + +theorem descendantsAverageFullBlockMat_const + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (M : FullBlockMat d) : + descendantsAverageFullBlockMat Q j (fun _ => M) = M := by + ext α β + simp [descendantsAverageFullBlockMat] + +theorem descendantsAverageFullBlockMat_sub + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F G : TriadicCube d → FullBlockMat d) : + descendantsAverageFullBlockMat Q j (fun R => F R - G R) = + descendantsAverageFullBlockMat Q j F - + descendantsAverageFullBlockMat Q j G := by + rw [descendantsAverageFullBlockMat_eq_smul_sum, + descendantsAverageFullBlockMat_eq_smul_sum, + descendantsAverageFullBlockMat_eq_smul_sum] + simp [Finset.sum_sub_distrib, smul_sub] + +private def diagonalCongrLinearMap {d : ℕ} (D : FullBlockMat d) : + FullBlockMat d →ₗ[ℝ] FullBlockMat d where + toFun M := D * M * D + map_add' M N := by + simp [mul_add, add_mul] + map_smul' c M := by + simp + +private def transposeCongrLinearMap {d : ℕ} (S : FullBlockMat d) : + FullBlockMat d →ₗ[ℝ] FullBlockMat d where + toFun M := Matrix.transpose S * M * S + map_add' M N := by + simp [mul_add, add_mul] + map_smul' c M := by + simp + +theorem descendantsAverageFullBlockMat_linearMap + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (L : FullBlockMat d →ₗ[ℝ] FullBlockMat d) + (F : TriadicCube d → FullBlockMat d) : + descendantsAverageFullBlockMat Q j (fun R => L (F R)) = + L (descendantsAverageFullBlockMat Q j F) := by + rw [descendantsAverageFullBlockMat_eq_smul_sum, + descendantsAverageFullBlockMat_eq_smul_sum] + simp + +theorem descendantsAverageFullBlockMat_diagonal_sub_const_mul_diagonal + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (D C : FullBlockMat d) (F : TriadicCube d → FullBlockMat d) : + descendantsAverageFullBlockMat Q j + (fun R => D * (F R - C) * D) = + D * (descendantsAverageFullBlockMat Q j F - C) * D := by + let L := diagonalCongrLinearMap (d := d) D + calc + descendantsAverageFullBlockMat Q j + (fun R => D * (F R - C) * D) + = descendantsAverageFullBlockMat Q j (fun R => L (F R - C)) := rfl + _ = L (descendantsAverageFullBlockMat Q j (fun R => F R - C)) := + descendantsAverageFullBlockMat_linearMap Q j L (fun R => F R - C) + _ = L (descendantsAverageFullBlockMat Q j F - + descendantsAverageFullBlockMat Q j (fun _ => C)) := by + rw [descendantsAverageFullBlockMat_sub] + _ = D * (descendantsAverageFullBlockMat Q j F - C) * D := by + simp [L, diagonalCongrLinearMap, descendantsAverageFullBlockMat_const] + +theorem descendantsAverageFullBlockMat_transpose_sub_const_mul + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (S C : FullBlockMat d) (F : TriadicCube d → FullBlockMat d) : + descendantsAverageFullBlockMat Q j + (fun R => Matrix.transpose S * (F R - C) * S) = + Matrix.transpose S * (descendantsAverageFullBlockMat Q j F - C) * S := by + let L := transposeCongrLinearMap (d := d) S + calc + descendantsAverageFullBlockMat Q j + (fun R => Matrix.transpose S * (F R - C) * S) + = descendantsAverageFullBlockMat Q j (fun R => L (F R - C)) := rfl + _ = L (descendantsAverageFullBlockMat Q j (fun R => F R - C)) := + descendantsAverageFullBlockMat_linearMap Q j L (fun R => F R - C) + _ = L (descendantsAverageFullBlockMat Q j F - + descendantsAverageFullBlockMat Q j (fun _ => C)) := by + rw [descendantsAverageFullBlockMat_sub] + _ = Matrix.transpose S * (descendantsAverageFullBlockMat Q j F - C) * S := by + simp [L, transposeCongrLinearMap, descendantsAverageFullBlockMat_const] + +theorem normalizedCoarseAveragePositiveErrorMatrix_eq_diagonal_blockSub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + normalizedCoarseAveragePositiveErrorMatrix hP hStruct center Q j a = + D * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) * + D := by + classical + intro b c D + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) + let F : TriadicCube d → FullBlockMat d := + fun R => toFullBlockMat (coarseBlockMatrix (cubeSet R) a.toFun) + have hAvg : + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a = + D * (descendantsAverageFullBlockMat Q j F - Abar) * D := by + simpa [descendantsAverageNormalizedFluctuationMatrix, F, Abar, + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix, + D, b, c] using + descendantsAverageFullBlockMat_diagonal_sub_const_mul_diagonal + (Q := Q) (j := j) D Abar F + have hParent : + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet Q) a = + D * (F Q - Abar) * D := by + simp [F, Abar, Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix, + D, b, c] + calc + normalizedCoarseAveragePositiveErrorMatrix hP hStruct center Q j a + = D * (descendantsAverageFullBlockMat Q j F - Abar) * D - + D * (F Q - Abar) * D := by + simp [normalizedCoarseAveragePositiveErrorMatrix, hAvg, hParent] + _ = D * (descendantsAverageFullBlockMat Q j F - F Q) * D := by + noncomm_ring + _ = + D * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) * + D := by + rw [toFullBlockMat_descendantsAverageBlockMat] + +theorem coarseAveragePositiveErrorMatrixWithNormalizer_eq_transpose_blockSub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : + coarseAveragePositiveErrorMatrixWithNormalizer hP hStruct center S Q j a = + Matrix.transpose S * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) * + S := by + classical + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) + let F : TriadicCube d → FullBlockMat d := + fun R => toFullBlockMat (coarseBlockMatrix (cubeSet R) a.toFun) + have hAvg : + descendantsAverageFluctuationMatrixWithNormalizer hP hStruct center S Q j a = + Matrix.transpose S * (descendantsAverageFullBlockMat Q j F - Abar) * S := by + simpa [descendantsAverageFluctuationMatrixWithNormalizer, + fullBlockFluctuationMatrixWithNormalizer, F, Abar] using + descendantsAverageFullBlockMat_transpose_sub_const_mul + (Q := Q) (j := j) S Abar F + have hParent : + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S (cubeSet Q) a = + Matrix.transpose S * (F Q - Abar) * S := by + simp [F, Abar, fullBlockFluctuationMatrixWithNormalizer] + calc + coarseAveragePositiveErrorMatrixWithNormalizer hP hStruct center S Q j a + = Matrix.transpose S * (descendantsAverageFullBlockMat Q j F - Abar) * S - + Matrix.transpose S * (F Q - Abar) * S := by + simp [coarseAveragePositiveErrorMatrixWithNormalizer, hAvg, hParent] + _ = Matrix.transpose S * (descendantsAverageFullBlockMat Q j F - F Q) * S := by + noncomm_ring + _ = + Matrix.transpose S * + (toFullBlockMat + (descendantsAverageBlockMat Q j + (fun R => coarseBlockMatrix (cubeSet R) a.toFun)) - + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) * + S := by + rw [toFullBlockMat_descendantsAverageBlockMat] +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/NormalizedStatements.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/NormalizedStatements.lean new file mode 100644 index 0000000000..fbf231a475 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/NormalizedStatements.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ArbitraryIntegrability + +/-! # Normalized Statements -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +/-- Pointwise form of the variance triangle after interpreting variance as the +Section 5.4 squared operator-norm fluctuation. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverageNormalized_add_two_error + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center Q a ≤ + 2 * descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct center Q j a + + 2 * normalizedCoarseAverageErrorOperatorNormSq + hP hStruct center Q j a := by + let parentMatrix : FullBlockMat d := + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet Q) a + let averageMatrix : FullBlockMat d := + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a + let errorMatrix : FullBlockMat d := + normalizedCoarseAverageErrorMatrix hP hStruct center Q j a + let parentCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) parentMatrix + let averageCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) averageMatrix + let errorCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) errorMatrix + have hparent : parentMatrix = averageMatrix + errorMatrix := by + simp [parentMatrix, averageMatrix, errorMatrix, normalizedCoarseAverageErrorMatrix] + have hclm : parentCLM = averageCLM + errorCLM := by + simp [parentCLM, averageCLM, errorCLM, hparent] + calc + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center Q a + = ‖parentCLM‖ ^ (2 : ℕ) := by + simp [Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq, + parentMatrix, parentCLM] + _ = ‖averageCLM + errorCLM‖ ^ (2 : ℕ) := by + rw [hclm] + _ ≤ 2 * ‖averageCLM‖ ^ (2 : ℕ) + 2 * ‖errorCLM‖ ^ (2 : ℕ) := + norm_add_sq_le_two_sq_add_two_sq averageCLM errorCLM + _ = + 2 * descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct center Q j a + + 2 * normalizedCoarseAverageErrorOperatorNormSq + hP hStruct center Q j a := by + simp [descendantsAverageNormalizedFluctuationOperatorNormSq, + normalizedCoarseAverageErrorOperatorNormSq, averageMatrix, averageCLM, + errorMatrix, errorCLM] + +/-- A version whose first term is the descendant average of the existing +Section 5.4 fluctuation observable. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverage_add_two_error + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct center Q a ≤ + 2 * descendantsAverage Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center + (cubeSet R) a) + + 2 * normalizedCoarseAverageErrorOperatorNormSq + hP hStruct center Q j a := by + have htriangle := + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverageNormalized_add_two_error + hP hStruct center Q j a + have hjensen := + descendantsAverageNormalizedFluctuationOperatorNormSq_le_descendantsAverage + hP hStruct center Q j a + nlinarith + +/-- Section 5.6 variance estimate with quadratic `J` error, retaining the +descendant-average fluctuation term. This is the pointwise form of the +manuscript variance splitting before the Jensen relaxation to the average of +child variances. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverageNormalized_add_eight_JTraceAverageSq_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 2 * descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) Q j a + + 8 * normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a := by + filter_upwards + [normalizedCoarseAverageErrorOperatorNormSq_le_four_normalizedBlockJTraceAverageSq_ae + hP hStruct hP4 m Q j] with a herror + have htriangle := + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverageNormalized_add_two_error + hP hStruct (m : ℤ) Q j a + nlinarith + +/-- Integrated Section 5.6 variance estimate with quadratic `J` error, using +the Section 5.4 squared operator-norm fluctuation observable for the variance +terms. The integrability needed to pass from the a.e. estimate to expectation +is supplied by `(P4)`. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_integral_le_two_descendantsAverageNormalized_add_eight_JTraceAverageSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (hk : k ≤ n) : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (n : ℤ)) a ∂P ≤ + 2 * + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) (originCube d (n : ℤ)) (n - k) a ∂P + + 8 * + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) + (originCube d (n : ℤ)) (n - k) a ∂P := by + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + let F : RegCoeffField d → ℝ := + fun a => + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) Q j a + let J : RegCoeffField d → ℝ := + fun a => normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a + have hFInt : Integrable F P := by + simpa [F, Q, j] using + integrable_descendantsAverageNormalizedFluctuationOperatorNormSq_from_P4_of_stationary + hP hStruct hP4 m n k hk + have hJInt : Integrable J P := by + simpa [J, Q, j] using + integrable_normalizedBlockJTraceAverageSq_from_P4_of_stationary + hP hStruct hP4 m n k hk + have hRhsInt : Integrable (fun a : RegCoeffField d => 2 * F a + 8 * J a) P := + (hFInt.const_mul (2 : ℝ)).add (hJInt.const_mul (8 : ℝ)) + have hpoint : + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => 2 * F a + 8 * J a := by + simpa [F, J, Q, j] using + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverageNormalized_add_eight_JTraceAverageSq_ae + hP hStruct hP4 m Q j + have hmono : + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ∂P ≤ + ∫ a, 2 * F a + 8 * J a ∂P := by + refine integral_mono_of_nonneg ?_ hRhsInt hpoint + filter_upwards with a + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) Q a + calc + ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) (originCube d (n : ℤ)) a ∂P + = ∫ a, + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ∂P := by + rfl + _ ≤ ∫ a, 2 * F a + 8 * J a ∂P := hmono + _ = ∫ a, 2 * F a ∂P + ∫ a, 8 * J a ∂P := by + rw [integral_add (hFInt.const_mul (2 : ℝ)) (hJInt.const_mul (8 : ℝ))] + _ = 2 * ∫ a, F a ∂P + 8 * ∫ a, J a ∂P := by + rw [integral_const_mul, integral_const_mul] + _ = + 2 * + ∫ a, + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) (originCube d (n : ℤ)) (n - k) a ∂P + + 8 * + ∫ a, + normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) + (originCube d (n : ℤ)) (n - k) a ∂P := by + rfl + +/-- Section 5.6 variance estimate with quadratic `J` error, expressed through +the Section 5.4 squared operator-norm fluctuation observable. This is the +a.s. pointwise inequality whose expectation gives the manuscript display +`e.var.a.star` for the scalar block normalization used in Section 5.4. -/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverage_add_eight_JTraceAverageSq_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 2 * descendantsAverage Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq hP hStruct (m : ℤ) + (cubeSet R) a) + + 8 * normalizedBlockJTraceAverageSq hP hStruct (m : ℤ) Q j a := by + filter_upwards + [normalizedCoarseAverageErrorOperatorNormSq_le_four_normalizedBlockJTraceAverageSq_ae + hP hStruct hP4 m Q j] with a herror + have htriangle := + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_descendantsAverage_add_two_error + hP hStruct (m : ℤ) Q j a + nlinarith +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/TraceBudget.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/TraceBudget.lean new file mode 100644 index 0000000000..749805b54e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/TraceBudget.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Basic + +/-! # Trace Budget -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +noncomputable def fullBlockJTraceBudgetWithNormalizers + {d : ℕ} (S T : FullBlockMat d) (A : BlockMat d) : ℝ := + ∑ α : BlockCoord d, + ((1 / 2 : ℝ) * + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul A (fullBlockMatrixProbe S α)) + + (1 / 2 : ℝ) * + blockVecDot (fullBlockMatrixProbe T α) + (blockMatVecMul (blockReflect A) (fullBlockMatrixProbe T α)) - + blockVecDot (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + +theorem sum_doubledResponseJ_fullBlockNormalizers_eq_traceBudget + {d : ℕ} (U : Ch02.Domain d) (a : Ch02.CoeffOn U) + (S T : FullBlockMat d) : + (∑ α : BlockCoord d, + Ch02.doubledResponseJ U a + (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) = + fullBlockJTraceBudgetWithNormalizers S T (Ch02.coarseBlockMatrix U a) := by + classical + unfold fullBlockJTraceBudgetWithNormalizers + refine Finset.sum_congr rfl ?_ + intro α _hα + rw [(Ch02.blockCoarseMatrixTheory U a).doubled_response_splitting] + rw [(Ch02.blockCoarseMatrixTheory U a).starred_inverse_formula] + +theorem weightedAverage_const_mul' + {d : ℕ} {U : Ch02.Domain d} + (Pcell : Ch02.DomainPartition U) (c : ℝ) (f : Pcell.Cell → ℝ) : + Pcell.weightedAverage (fun i => c * f i) = c * Pcell.weightedAverage f := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + unfold Ch02.DomainPartition.weightedAverage + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + +theorem vecDot_matVecMul_weightedMatAverage' + {d : ℕ} {U : Ch02.Domain d} (Pcell : Ch02.DomainPartition U) + (F : Pcell.Cell → Mat d) (x y : Vec d) : + vecDot x (matVecMul (Pcell.weightedMatAverage F) y) = + Pcell.weightedAverage fun i => vecDot x (matVecMul (F i) y) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + simp [Ch02.DomainPartition.weightedMatAverage, Ch02.DomainPartition.weightedAverage, + vecDot, matVecMul, Finset.mul_sum, mul_assoc, mul_left_comm, mul_comm] + ring_nf + let W : Pcell.Cell → Fin d → Fin d → ℝ := + fun c i j => F c i j * x i * y j * Pcell.weight c + change (∑ i : Fin d, ∑ j : Fin d, ∑ c : Pcell.Cell, W c i j) = + ∑ c : Pcell.Cell, ∑ i : Fin d, ∑ j : Fin d, W c i j + calc + (∑ i : Fin d, ∑ j : Fin d, ∑ c : Pcell.Cell, W c i j) + = ∑ i : Fin d, ∑ c : Pcell.Cell, ∑ j : Fin d, W c i j := by + congr with i + rw [Finset.sum_comm] + _ = ∑ c : Pcell.Cell, ∑ i : Fin d, ∑ j : Fin d, W c i j := by + rw [Finset.sum_comm] + +theorem blockVecDot_blockMatVecMul_weightedBlockAverage' + {d : ℕ} {U : Ch02.Domain d} (Pcell : Ch02.DomainPartition U) + (F : Pcell.Cell → BlockMat d) (X : BlockVec d) : + blockVecDot X (blockMatVecMul (Pcell.weightedBlockAverage F) X) = + Pcell.weightedAverage + (fun c => blockVecDot X (blockMatVecMul (F c) X)) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + rcases X with ⟨p, q⟩ + rw [blockMatVecMul, blockVecDot, vecDot_add_right, vecDot_add_right] + change + vecDot p (matVecMul (Pcell.weightedMatAverage fun i => (F i).upperLeft) p) + + vecDot p (matVecMul (Pcell.weightedMatAverage fun i => (F i).upperRight) q) + + (vecDot q (matVecMul (Pcell.weightedMatAverage fun i => (F i).lowerLeft) p) + + vecDot q (matVecMul (Pcell.weightedMatAverage fun i => (F i).lowerRight) q)) = + Pcell.weightedAverage fun i => blockVecDot (p, q) (blockMatVecMul (F i) (p, q)) + rw [vecDot_matVecMul_weightedMatAverage' Pcell (fun i => (F i).upperLeft)] + rw [vecDot_matVecMul_weightedMatAverage' Pcell (fun i => (F i).upperRight)] + rw [vecDot_matVecMul_weightedMatAverage' Pcell (fun i => (F i).lowerLeft)] + rw [vecDot_matVecMul_weightedMatAverage' Pcell (fun i => (F i).lowerRight)] + simp [Ch02.DomainPartition.weightedAverage, blockMatVecMul, blockVecDot, + vecDot_add_right, Finset.sum_add_distrib, mul_add, add_assoc] + +theorem blockReflect_weightedBlockAverage + {d : ℕ} {U : Ch02.Domain d} (Pcell : Ch02.DomainPartition U) + (F : Pcell.Cell → BlockMat d) : + blockReflect (Pcell.weightedBlockAverage F) = + Pcell.weightedBlockAverage (fun c => blockReflect (F c)) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + rfl + +theorem blockVecDot_blockReflect_weightedBlockAverage' + {d : ℕ} {U : Ch02.Domain d} (Pcell : Ch02.DomainPartition U) + (F : Pcell.Cell → BlockMat d) (X : BlockVec d) : + blockVecDot X + (blockMatVecMul (blockReflect (Pcell.weightedBlockAverage F)) X) = + Pcell.weightedAverage + (fun c => blockVecDot X (blockMatVecMul (blockReflect (F c)) X)) := by + rw [blockReflect_weightedBlockAverage] + exact blockVecDot_blockMatVecMul_weightedBlockAverage' Pcell + (fun c => blockReflect (F c)) X + +theorem sum_weightedAverage_two_terms_sub_const + {ι κ : Type*} [Fintype ι] [Fintype κ] + (w : κ → ℝ) (hw : ∑ c : κ, w c = 1) + (f g : ι → κ → ℝ) (h : ι → ℝ) : + ∑ α : ι, + ((1 / 2 : ℝ) * (∑ c : κ, w c * f α c) + + (1 / 2 : ℝ) * (∑ c : κ, w c * g α c) - h α) = + ∑ c : κ, + w c * ∑ α : ι, + ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + have hinner : + ∀ α : ι, + (1 / 2 : ℝ) * (∑ c : κ, w c * f α c) + + (1 / 2 : ℝ) * (∑ c : κ, w c * g α c) - h α = + ∑ c : κ, + w c * ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + intro α + calc + (1 / 2 : ℝ) * (∑ c : κ, w c * f α c) + + (1 / 2 : ℝ) * (∑ c : κ, w c * g α c) - h α + = + (∑ c : κ, (1 / 2 : ℝ) * (w c * f α c)) + + (∑ c : κ, (1 / 2 : ℝ) * (w c * g α c)) - + (∑ c : κ, w c) * h α := by + rw [Finset.mul_sum, Finset.mul_sum, hw] + ring + _ = + ∑ c : κ, + ((1 / 2 : ℝ) * (w c * f α c) + + (1 / 2 : ℝ) * (w c * g α c) - w c * h α) := by + symm + rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, Finset.sum_mul] + _ = + ∑ c : κ, + w c * ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + refine Finset.sum_congr rfl ?_ + intro c _hc + ring + calc + ∑ α : ι, + ((1 / 2 : ℝ) * (∑ c : κ, w c * f α c) + + (1 / 2 : ℝ) * (∑ c : κ, w c * g α c) - h α) + = ∑ α : ι, ∑ c : κ, + w c * ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + refine Finset.sum_congr rfl ?_ + intro α _hα + exact hinner α + _ = ∑ c : κ, ∑ α : ι, + w c * ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + rw [Finset.sum_comm] + _ = ∑ c : κ, + w c * ∑ α : ι, + ((1 / 2 : ℝ) * f α c + (1 / 2 : ℝ) * g α c - h α) := by + refine Finset.sum_congr rfl ?_ + intro c _hc + rw [Finset.mul_sum] + +theorem fullBlockJTraceBudgetWithNormalizers_weightedBlockAverage + {d : ℕ} {U : Ch02.Domain d} (Pcell : Ch02.DomainPartition U) + (S T : FullBlockMat d) (F : Pcell.Cell → BlockMat d) : + fullBlockJTraceBudgetWithNormalizers S T (Pcell.weightedBlockAverage F) = + Pcell.weightedAverage + (fun c => fullBlockJTraceBudgetWithNormalizers S T (F c)) := by + classical + let : Fintype Pcell.Cell := Pcell.instFintype + unfold fullBlockJTraceBudgetWithNormalizers + simp_rw [blockVecDot_blockMatVecMul_weightedBlockAverage', + blockVecDot_blockReflect_weightedBlockAverage'] + unfold Ch02.DomainPartition.weightedAverage + exact sum_weightedAverage_two_terms_sub_const + (w := Pcell.weight) Pcell.weight_sum_one + (f := fun α c => + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul (F c) (fullBlockMatrixProbe S α))) + (g := fun α c => + blockVecDot (fullBlockMatrixProbe T α) + (blockMatVecMul (blockReflect (F c)) (fullBlockMatrixProbe T α))) + (h := fun α => blockVecDot (fullBlockMatrixProbe S α) (fullBlockMatrixProbe T α)) + +theorem fullBlockTrace_transpose_mul_mul_eq_sum_blockVecDot + {d : ℕ} (S M : FullBlockMat d) : + Ch02.fullBlockTrace (Matrix.transpose S * M * S) = + ∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul (ofFullBlockMat M) (fullBlockMatrixProbe S α)) := by + classical + have htranspose : + ∀ x y : FullBlockVec d, + dotProduct x (Matrix.mulVec (Matrix.transpose S) y) = + dotProduct (Matrix.mulVec S x) y := by + intro x y + rw [Matrix.dotProduct_mulVec] + simp [Matrix.vecMul, Matrix.mulVec, dotProduct, Matrix.transpose_apply, + mul_comm] + have hdiag : + ∀ α : BlockCoord d, + (Matrix.transpose S * M * S) α α = + dotProduct (Matrix.mulVec S (Pi.single α 1)) + (Matrix.mulVec M (Matrix.mulVec S (Pi.single α 1))) := by + intro α + let e : FullBlockVec d := Pi.single α 1 + calc + (Matrix.transpose S * M * S) α α + = dotProduct e + (Matrix.mulVec (Matrix.transpose S * M * S) e) := by + simp [e] + _ = dotProduct e + (Matrix.mulVec (Matrix.transpose S) + (Matrix.mulVec M (Matrix.mulVec S e))) := by + rw [Matrix.mulVec_mulVec, Matrix.mulVec_mulVec] + _ = dotProduct (Matrix.mulVec S e) + (Matrix.mulVec M (Matrix.mulVec S e)) := htranspose e _ + calc + Ch02.fullBlockTrace (Matrix.transpose S * M * S) + = Matrix.trace (Matrix.transpose S * M * S) := by + simp [Ch02.fullBlockTrace, Matrix.trace] + _ = ∑ α : BlockCoord d, + dotProduct (Matrix.mulVec S (Pi.single α 1)) + (Matrix.mulVec M (Matrix.mulVec S (Pi.single α 1))) := by + unfold Matrix.trace + exact Finset.sum_congr rfl (fun α _hα => hdiag α) + _ = ∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul (ofFullBlockMat M) (fullBlockMatrixProbe S α)) := by + refine Finset.sum_congr rfl ?_ + intro α _hα + rw [← dotProduct_toFullBlockVec (fullBlockMatrixProbe S α) + (blockMatVecMul (ofFullBlockMat M) (fullBlockMatrixProbe S α))] + simp [fullBlockMatrixProbe, toFullBlockVec_blockMatVecMul] + +theorem fullBlockTrace_transpose_blockSub_le_two_fullBlockJTraceBudgetWithNormalizers + {d : ℕ} (S T : FullBlockMat d) {A B : BlockMat d} + (hAB : BlockMatLoewnerLE A B) + (hStarAB : BlockMatLoewnerLE (blockReflect A) (blockReflect B)) + (hParentBudget_nonneg : 0 ≤ fullBlockJTraceBudgetWithNormalizers S T A) : + Ch02.fullBlockTrace + (Matrix.transpose S * (toFullBlockMat B - toFullBlockMat A) * S) ≤ + 2 * fullBlockJTraceBudgetWithNormalizers S T B := by + classical + have hx_nonneg : + ∀ α : BlockCoord d, + 0 ≤ + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) + (fullBlockMatrixProbe S α)) := by + intro α + have h := hAB (fullBlockMatrixProbe S α) + have hdiff := + blockVecDot_blockMatVecMul_ofFullBlockMat_sub B A (fullBlockMatrixProbe S α) + rw [hdiff] + nlinarith + have hy_nonneg : + ∀ α : BlockCoord d, + 0 ≤ + blockVecDot (fullBlockMatrixProbe T α) + (blockMatVecMul + (ofFullBlockMat + (toFullBlockMat (blockReflect B) - toFullBlockMat (blockReflect A))) + (fullBlockMatrixProbe T α)) := by + intro α + have h := hStarAB (fullBlockMatrixProbe T α) + have hdiff := + blockVecDot_blockMatVecMul_ofFullBlockMat_sub + (blockReflect B) (blockReflect A) (fullBlockMatrixProbe T α) + rw [hdiff] + nlinarith + have htrace_eq : + Ch02.fullBlockTrace + (Matrix.transpose S * (toFullBlockMat B - toFullBlockMat A) * S) = + ∑ α : BlockCoord d, + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) + (fullBlockMatrixProbe S α)) := + fullBlockTrace_transpose_mul_mul_eq_sum_blockVecDot S + (toFullBlockMat B - toFullBlockMat A) + have hbudget_sub : + fullBlockJTraceBudgetWithNormalizers S T B - + fullBlockJTraceBudgetWithNormalizers S T A = + ∑ α : BlockCoord d, + ((1 / 2 : ℝ) * + blockVecDot (fullBlockMatrixProbe S α) + (blockMatVecMul + (ofFullBlockMat (toFullBlockMat B - toFullBlockMat A)) + (fullBlockMatrixProbe S α)) + + (1 / 2 : ℝ) * + blockVecDot (fullBlockMatrixProbe T α) + (blockMatVecMul + (ofFullBlockMat + (toFullBlockMat (blockReflect B) - toFullBlockMat (blockReflect A))) + (fullBlockMatrixProbe T α))) := by + unfold fullBlockJTraceBudgetWithNormalizers + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl ?_ + intro α _hα + rw [blockVecDot_blockMatVecMul_ofFullBlockMat_sub B A] + rw [blockVecDot_blockMatVecMul_ofFullBlockMat_sub (blockReflect B) (blockReflect A)] + ring + have htrace_le_twice_sub : + Ch02.fullBlockTrace + (Matrix.transpose S * (toFullBlockMat B - toFullBlockMat A) * S) ≤ + 2 * (fullBlockJTraceBudgetWithNormalizers S T B - + fullBlockJTraceBudgetWithNormalizers S T A) := by + rw [htrace_eq, hbudget_sub, Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro α _hα + have hx := hx_nonneg α + have hy := hy_nonneg α + ring_nf + linarith + nlinarith + +theorem BlockMatLoewnerLE.blockReflect' + {d : ℕ} {A B : BlockMat d} (hAB : BlockMatLoewnerLE A B) : + BlockMatLoewnerLE (blockReflect A) (blockReflect B) := by + intro X + simpa using hAB (X.2, X.1) +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Triangle.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Triangle.lean new file mode 100644 index 0000000000..f916c4f7a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section56/VarianceEstimateQuadratic/Triangle.lean @@ -0,0 +1,408 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.ErrorBounds + +/-! # Triangle -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section56 + +open scoped BigOperators Matrix.Norms.L2Operator +open MeasureTheory + +noncomputable section + +theorem norm_add_sq_le_two_sq_add_two_sq {E : Type*} [SeminormedAddCommGroup E] + (x y : E) : + ‖x + y‖ ^ (2 : ℕ) ≤ 2 * ‖x‖ ^ (2 : ℕ) + 2 * ‖y‖ ^ (2 : ℕ) := by + have hnorm : ‖x + y‖ ≤ ‖x‖ + ‖y‖ := norm_add_le x y + have hsq : + ‖x + y‖ ^ (2 : ℕ) ≤ (‖x‖ + ‖y‖) ^ (2 : ℕ) := + pow_le_pow_left₀ (norm_nonneg _) hnorm 2 + nlinarith [sq_nonneg (‖x‖ - ‖y‖)] + +theorem descendantsAverageFullBlockMat_operatorNormSq_le_descendantsAverage_operatorNormSq + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → FullBlockMat d) : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFullBlockMat Q j F)‖ ^ (2 : ℕ) ≤ + descendantsAverage Q j + (fun R => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (F R)‖ ^ + (2 : ℕ)) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let c : ℝ := (D.card : ℝ)⁻¹ + let T : TriadicCube d → EuclideanSpace ℝ (BlockCoord d) →L[ℝ] + EuclideanSpace ℝ (BlockCoord d) := + fun R => Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (F R) + let S : ℝ := D.sum fun R => ‖T R‖ + let S₂ : ℝ := D.sum fun R => ‖T R‖ ^ (2 : ℕ) + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hcard_ne : (D.card : ℝ) ≠ 0 := ne_of_gt hcard_pos + have hmat : + descendantsAverageFullBlockMat Q j F = c • D.sum F := by + ext α β + change descendantsAverage Q j (fun R => F R α β) = c * (D.sum F) α β + rw [Matrix.sum_apply] + simp [descendantsAverage, D, c] + have hnorm : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFullBlockMat Q j F)‖ ≤ c * S := by + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFullBlockMat Q j F)‖ + = ‖c • D.sum T‖ := by + rw [hmat] + simp [T] + _ = c * ‖D.sum T‖ := by + rw [norm_smul, Real.norm_eq_abs, abs_of_pos (inv_pos.mpr hcard_pos)] + _ ≤ c * S := by + exact mul_le_mul_of_nonneg_left + (norm_sum_le D (fun R => T R)) (inv_nonneg.mpr hcard_pos.le) + have hsq_norm : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFullBlockMat Q j F)‖ ^ (2 : ℕ) ≤ + (c * S) ^ (2 : ℕ) := + pow_le_pow_left₀ (norm_nonneg _) hnorm 2 + have hsum_sq : + S ^ (2 : ℕ) ≤ (D.card : ℝ) * S₂ := by + simpa [S, S₂] using + sq_sum_le_card_mul_sum_sq (s := D) (f := fun R => ‖T R‖) + have havg_sq : (c * S) ^ (2 : ℕ) ≤ c * S₂ := by + calc + (c * S) ^ (2 : ℕ) = c ^ (2 : ℕ) * S ^ (2 : ℕ) := by ring + _ ≤ c ^ (2 : ℕ) * ((D.card : ℝ) * S₂) := by + exact mul_le_mul_of_nonneg_left hsum_sq (sq_nonneg c) + _ = c * S₂ := by + dsimp [c] + field_simp [hcard_ne] + calc + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + (descendantsAverageFullBlockMat Q j F)‖ ^ (2 : ℕ) + ≤ (c * S) ^ (2 : ℕ) := hsq_norm + _ ≤ c * S₂ := havg_sq + _ = + descendantsAverage Q j + (fun R => + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) (F R)‖ ^ + (2 : ℕ)) := by + simp [descendantsAverage, D, c, S₂, T] + +/-- Jensen/convexity bound for the squared operator norm of the normalized +descendant-average fluctuation. -/ +theorem descendantsAverageNormalizedFluctuationOperatorNormSq_le_descendantsAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) (a : RegCoeffField d) : + descendantsAverageNormalizedFluctuationOperatorNormSq hP hStruct center Q j a ≤ + descendantsAverage Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSq hP hStruct center + (cubeSet R) a) := by + simpa [descendantsAverageNormalizedFluctuationOperatorNormSq, + descendantsAverageNormalizedFluctuationMatrix, + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSq_eq_norm_sq] + using + descendantsAverageFullBlockMat_operatorNormSq_le_descendantsAverage_operatorNormSq + (Q := Q) (j := j) + (F := fun R => + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a) + +theorem aemeasurable_fullBlockNormalizedFluctuationMatrix_cubeSet + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) : + AEMeasurable + (fun a : RegCoeffField d => + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet Q) a) P := by + let b := hP.barSigmaAtScale hStruct center + let c := hP.barSigmaStarAtScale hStruct center + let D : FullBlockMat d := Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag b c) + let Abar : FullBlockMat d := + toFullBlockMat (Ch04.scalarAnnealedBlockMatrixAtScale hP hStruct center) + let g : FullBlockMat d → FullBlockMat d := fun M => D * (M - Abar) * D + have hg : Measurable g := by + have hcont : Continuous g := by + dsimp [g] + fun_prop + exact hcont.measurable + have hM : + AEMeasurable + (fun a : RegCoeffField d => + toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) P := + hP.aemeasurable_coarseFullBlockMatrix_cubeSet Q + simpa [Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix, + b, c, D, Abar, g] using! hg.comp_aemeasurable hM + +theorem aemeasurable_descendantsAverageNormalizedFluctuationMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageNormalizedFluctuationMatrix hP hStruct center Q j a) P := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + AEMeasurable + (fun a : RegCoeffField d => + ∑ R ∈ D, + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a) P := by + refine (Finset.aemeasurable_sum D (fun R _hR => + aemeasurable_fullBlockNormalizedFluctuationMatrix_cubeSet + hP hStruct center R)).congr ?_ + filter_upwards with a + simp + have hscaled : + AEMeasurable + (fun a : RegCoeffField d => + ((D.card : ℝ)⁻¹) • + (∑ R ∈ D, + Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct center (cubeSet R) a)) P := + hsum.const_smul ((D.card : ℝ)⁻¹) + refine hscaled.congr ?_ + filter_upwards with a + rw [descendantsAverageNormalizedFluctuationMatrix, + descendantsAverageFullBlockMat_eq_smul_sum] + +theorem aemeasurable_descendantsAverageNormalizedFluctuationOperatorNormSq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (Q : TriadicCube d) (j : ℕ) : + AEMeasurable + (fun a : RegCoeffField d => + descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct center Q j a) P := by + let g : FullBlockMat d → ℝ := + fun M => ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ^ (2 : ℕ) + have hg : Measurable g := by + have hcont : Continuous g := + ((continuous_norm.comp + ((LinearEquiv.toLinearMap + (Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) + |>.toAlgEquiv |>.toLinearEquiv)).continuous_of_finiteDimensional)).pow 2) + exact hcont.measurable + simpa [descendantsAverageNormalizedFluctuationOperatorNormSq, g] using! + hg.comp_aemeasurable + (aemeasurable_descendantsAverageNormalizedFluctuationMatrix + hP hStruct center Q j) + +theorem integrable_descendantsAverageNormalizedFluctuationOperatorNormSq_from_P4_of_stationary + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hP4 : QuantitativeCoarseGrainedEllipticity P) + (m n k : ℕ) (_hk : k ≤ n) : + Integrable + (descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) (originCube d (n : ℤ)) (n - k)) P := by + classical + let Q : TriadicCube d := originCube d (n : ℤ) + let j : ℕ := n - k + have hdomInt : + Integrable + (fun a : RegCoeffField d => + descendantsAverage Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a)) P := by + refine Ch04.integrable_descendantsAverage ?_ + intro R hR + have hR_nonneg : 0 ≤ R.scale := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hR + have hQscale : Q.scale = (n : ℤ) := by simp [Q, originCube] + rw [hscale, hQscale] + have hj_le : j ≤ n := by + dsimp [j] + exact Nat.sub_le n k + exact sub_nonneg.mpr (by exact_mod_cast hj_le) + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.integrable_fullBlockNormalizedFluctuationOperatorNormSqAtScale_from_P4_of_nonneg_scale + hP hStruct hP4 (m : ℤ) R hR_nonneg + refine Integrable.mono' hdomInt + (aemeasurable_descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) Q j).aestronglyMeasurable ?_ + filter_upwards with a + have hle := + descendantsAverageNormalizedFluctuationOperatorNormSq_le_descendantsAverage + hP hStruct (m : ℤ) Q j a + have hleft_nonneg : + 0 ≤ descendantsAverageNormalizedFluctuationOperatorNormSq + hP hStruct (m : ℤ) Q j a := by + simp [descendantsAverageNormalizedFluctuationOperatorNormSq] + have hright_nonneg : + 0 ≤ + descendantsAverage Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) := by + exact descendantsAverage_nonneg Q j + (fun R => + Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) R a) + (fun R _hR => + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + hP hStruct (m : ℤ) R a) + rw [Real.norm_of_nonneg (by simpa [Q, j] using hleft_nonneg)] + simpa [Q, j, Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale] using hle + +/-- Jensen/convexity bound for the squared operator norm of the +arbitrary-normalizer descendant-average fluctuation. -/ +theorem descendantsAverageFluctuationOperatorNormSqWithNormalizer_le_descendantsAverage + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : + descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a ≤ + descendantsAverage Q j + (fun R => + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct center S (cubeSet R) a) := by + simpa [descendantsAverageFluctuationOperatorNormSqWithNormalizer, + descendantsAverageFluctuationMatrixWithNormalizer, + fullBlockFluctuationOperatorNormSqWithNormalizer] + using + descendantsAverageFullBlockMat_operatorNormSq_le_descendantsAverage_operatorNormSq + (Q := Q) (j := j) + (F := fun R => + fullBlockFluctuationMatrixWithNormalizer + hP hStruct center S (cubeSet R) a) + +/-- Pointwise variance triangle for an arbitrary deterministic normalizer. -/ +theorem fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverageWithNormalizer_add_two_error + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct center S Q a ≤ + 2 * descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a + + 2 * coarseAverageErrorOperatorNormSqWithNormalizer + hP hStruct center S Q j a := by + let parentMatrix : FullBlockMat d := + fullBlockFluctuationMatrixWithNormalizer hP hStruct center S (cubeSet Q) a + let averageMatrix : FullBlockMat d := + descendantsAverageFluctuationMatrixWithNormalizer hP hStruct center S Q j a + let errorMatrix : FullBlockMat d := + coarseAverageErrorMatrixWithNormalizer hP hStruct center S Q j a + let parentCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) parentMatrix + let averageCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) averageMatrix + let errorCLM := + Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) errorMatrix + have hparent : parentMatrix = averageMatrix + errorMatrix := by + dsimp [parentMatrix, averageMatrix, errorMatrix, coarseAverageErrorMatrixWithNormalizer] + abel + have hclm : parentCLM = averageCLM + errorCLM := by + dsimp [parentCLM, averageCLM, errorCLM] + rw [hparent, map_add] + calc + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct center S Q a + = ‖parentCLM‖ ^ (2 : ℕ) := by + rfl + _ = ‖averageCLM + errorCLM‖ ^ (2 : ℕ) := by + rw [hclm] + _ ≤ 2 * ‖averageCLM‖ ^ (2 : ℕ) + 2 * ‖errorCLM‖ ^ (2 : ℕ) := + norm_add_sq_le_two_sq_add_two_sq averageCLM errorCLM + _ = + 2 * descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a + + 2 * coarseAverageErrorOperatorNormSqWithNormalizer + hP hStruct center S Q j a := by + rfl + +/-- A version whose first term is the descendant average of the +arbitrary-normalizer fluctuation observable. -/ +theorem fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverage_add_two_error + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) + (a : RegCoeffField d) : + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct center S Q a ≤ + 2 * descendantsAverage Q j + (fun R => + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct center S (cubeSet R) a) + + 2 * coarseAverageErrorOperatorNormSqWithNormalizer + hP hStruct center S Q j a := by + have htriangle := + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverageWithNormalizer_add_two_error + hP hStruct center S Q j a + have hjensen := + descendantsAverageFluctuationOperatorNormSqWithNormalizer_le_descendantsAverage + hP hStruct center S Q j a + nlinarith + +/-- Section 5.6 variance estimate with quadratic `J` error and arbitrary +deterministic normalizers. The manuscript specialization is +`S = B^{-1/2}` and `T = B^{1/2}`. -/ +theorem fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverageWithNormalizer_add_eight_blockJTraceAverageSqWithNormalizers_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct center S Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 2 * descendantsAverageFluctuationOperatorNormSqWithNormalizer + hP hStruct center S Q j a + + 8 * blockJTraceAverageSqWithNormalizers S T Q j a := by + filter_upwards + [coarseAverageErrorOperatorNormSqWithNormalizer_le_four_blockJTraceAverageSqWithNormalizers_ae + hP hStruct center S T Q j] with a herror + have htriangle := + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverageWithNormalizer_add_two_error + hP hStruct center S Q j a + nlinarith + +/-- Jensen-relaxed version of the arbitrary-normalizer variance estimate. -/ +theorem fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverage_add_eight_blockJTraceAverageSqWithNormalizers_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (center : ℤ) (S T : FullBlockMat d) (Q : TriadicCube d) (j : ℕ) : + (fun a : RegCoeffField d => + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer + hP hStruct center S Q a) + ≤ᵐ[P] + fun a : RegCoeffField d => + 2 * descendantsAverage Q j + (fun R => + fullBlockFluctuationOperatorNormSqWithNormalizer + hP hStruct center S (cubeSet R) a) + + 8 * blockJTraceAverageSqWithNormalizers S T Q j a := by + filter_upwards + [coarseAverageErrorOperatorNormSqWithNormalizer_le_four_blockJTraceAverageSqWithNormalizers_ae + hP hStruct center S T Q j] with a herror + have htriangle := + fullBlockFluctuationOperatorNormSqAtScaleWithNormalizer_le_two_descendantsAverage_add_two_error + hP hStruct center S Q j a + nlinarith +end + +end Section56 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57.lean new file mode 100644 index 0000000000..471daa5e27 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedGammaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LimitNormalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitJTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedJLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedFiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairSelection +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentCompetition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadTailUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.MinimalScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedLocalizedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.WeightedExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteSupTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMaxTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.KernelUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentRows +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsHigh +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointSynchronized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRaw +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRawCrude +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailJoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailSelected +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGap +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionThreshold +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimateCompressed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleEntrySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomBand +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorClosed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.NormalizedResponseEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorLowerEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticityMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitEllipticityMinimalExpLogSq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EllipticityFromMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssembly +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyOptimized + +/-! # Section57 -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Section 5.7: quenched minimal scales and perturbative consequences + +This file is the scaffold for the current manuscript's Section 5.7: +the quenched coarse-grained ellipticity input, the quenched perturbative-scale +theorem, and the inhomogeneous comparison corollary. + +This section should start only after the annealed algebraic convergence theorem +is green. +-/ + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteBadScaleTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteBadScaleTail.lean new file mode 100644 index 0000000000..d20929dceb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteBadScaleTail.lean @@ -0,0 +1,773 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse + +/-! # Absolute Bad Scale Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory + +/-! +# Absolute bad-scale tail + +This file assembles the shifted tail above the annealed entry scale with the +small-bottom tail below it. The result is an absolute bad-tail estimate for +the unshifted finite-probe envelope. +-/ + +noncomputable section + +theorem exp_neg_rpow_three_div_le_exp_neg_rpow_three_div_of_den_le + {B₁ B₂ η : ℝ} {q : ℕ} + (hB₁ : 0 < B₁) (hB₂ : 0 < B₂) (hB : B₁ ≤ B₂) + (hη : 0 < η) : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / B₁) ^ η)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / B₂) ^ η)) := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have htail_le : + (((3 : ℝ) ^ (q : ℝ) / B₂) ^ η) ≤ + (((3 : ℝ) ^ (q : ℝ) / B₁) ^ η) := + rpow_div_le_rpow_div_of_den_le hpow_nonneg hB₁ hB₂ hB hη + exact Real.exp_le_exp.mpr (by linarith) + +/-- Quantitative absolute bad-tail bound. The entry scale is still explicit; +the following layer compresses the displayed scale to the manuscript +`exp(C log^2(2 + thetaHat))` envelope. -/ +theorem exists_quantitative_threshold_absoluteBadTail_quenchedProbeEnvelope_le_interpolated_tail + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct CcrudeShift Csmall Centry a : ℝ, + 0 < Cfluct ∧ 0 < CcrudeShift ∧ 0 < Csmall ∧ + 0 < Centry ∧ 0 < a ∧ + ∀ {t α : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + 0 < t → + t ≤ b → + 0 ≤ α → + α < t → + α < b → + α * (1 + b / a) < b → + α < a → + ∃ Rshift Rsmall Runion : ℕ, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + ∀ q : ℕ, Q ≤ q → + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) := by + obtain ⟨Cfluct, CcrudeShift, Centry, a, + hCfluct, hCcrudeShift, hCentry, ha, hshiftBase⟩ := + exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + obtain ⟨Csmall, hCsmall, hsmallBase⟩ := + exists_quantitative_threshold_smallBottomBadTail_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, CcrudeShift, Csmall, Centry, a, + hCfluct, hCcrudeShift, hCsmall, hCentry, ha, ?_⟩ + intro t α + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + obtain ⟨Rshift, _hRshift, hshiftLaw⟩ := + hshiftBase (t := t) (αbad := α) + ht htb hα_nonneg hαt hαb hαharm hαa + obtain ⟨Rsmall, _hRsmall, hsmallLaw⟩ := + hsmallBase (t := t) (α := α) ht hα_nonneg hαt + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hρgap_gt : 1 < ρgap := by + dsimp [ρgap] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη_pos + obtain ⟨Runion, hRunion⟩ := + linear_le_exp_linear_eventually + (C := (2 : ℝ)) (γ := Real.log ρgap / 2) + (by norm_num) (by + have hlogρ_pos : 0 < Real.log ρgap := Real.log_pos hρgap_gt + positivity) + refine ⟨Rshift, Rsmall, Runion, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => H (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + intro q hQq + have hq_shift : Qshift ≤ q := (le_max_left Qshift (max Qsmall Qunion)).trans hQq + have hq_small : Qsmall ≤ q := + (le_max_left Qsmall Qunion).trans + ((le_max_right Qshift (max Qsmall Qunion)).trans hQq) + have hq_union : Qunion ≤ q := + (le_max_right Qsmall Qunion).trans + ((le_max_right Qshift (max Qsmall Qunion)).trans hQq) + have hshift_q : + P.real (badScaleEvent Hshift t α q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) := by + simpa [K, S, b, L, ctop, τ, η, w, ρtop, ρbottom, ρcrude, + Cbottom, Ctop, Kbottom, Kcrude, W, Mshift, ρgap, N0, H, Hshift, + Dhigh, Dcrude, DenShift, Ohigh, Ocrude, BleadShift, BtailShift, + cgapShift, QprefShift, QleadShift, QcutShift, Qshift] using + hshiftLaw hP hStruct hΓ hσ_eq hparams (q := q) hq_shift + have hshift_tail : + P.real (badTailEvent (badScaleEvent Hshift t α) q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) := by + have hmono : + P.real (badTailEvent (badScaleEvent Hshift t α) q) ≤ + P.real (badScaleEvent Hshift t α q) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := α) hα_nonneg) + exact hmono.trans hshift_q + have hsmall_tail : + P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailSmall) ^ η)) := by + simpa [K, S, η, w, W, ρgap, H, scaleSmall, ρsmall, Ksmall, + prefSmall, Msmall, BleadSmall, BtailSmall, cgapSmall, QprefSmall, + QleadSmall, Qsmall] using + hsmallLaw hP hStruct hΓ hσ_eq hparams (Nentry := N0) q hq_small + have hsplit : + badTailEvent (badScaleEvent H t α) (N0 + q) ⊆ + badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q) ∪ + badTailEvent (badScaleEvent Hshift t α) q := by + have hraw := + badTailEvent_subset_smallBottom_union_shifted + (H := H) (Nentry := N0) (N := N0 + q) (t := t) (α := α) + (Nat.le_add_right N0 q) + simpa [Hshift, Nat.add_sub_cancel_left] using hraw + have hBtailShift_pos : 0 < BtailShift := by + have hDenShift_pos : 0 < DenShift := by + simpa [DenShift] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBleadShift_pos : 0 < BleadShift := by + have hleft : 0 < DenShift * (3 : ℝ) ^ Ohigh := + mul_pos hDenShift_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh) + exact hleft.trans_le (le_max_left _ _) + dsimp [BtailShift] + positivity + have hBtailSmall_pos : 0 < BtailSmall := by + have hscaleSmall_pos : 0 < scaleSmall := by + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + dsimp [scaleSmall] + exact mul_pos hK_pos (mul_pos hCsmall (pow_pos hΓ.thetaHat_pos 2)) + have hBleadSmall_pos : 0 < BleadSmall := by + simpa [BleadSmall] using + smallBottomTailDenominator_pos + (scale := scaleSmall) (η := η) (σ := σ) + dsimp [BtailSmall] + positivity + have hBleadUnion_pos : 0 < BleadUnion := by + exact hBtailShift_pos.trans_le (le_max_left _ _) + have hBtailUnion_pos : 0 < BtailUnion := by + dsimp [BtailUnion] + positivity + have hBleadUnion_lt : BleadUnion < BtailUnion := by + dsimp [BtailUnion] + nlinarith + let Alead : ℝ := ((3 : ℝ) ^ (q : ℝ) / BleadUnion) ^ η + let Atail : ℝ := ((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η + have hshift_to_union : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) ≤ + Real.exp (-Alead) := by + simpa [Alead, BleadUnion] using + exp_neg_rpow_three_div_le_exp_neg_rpow_three_div_of_den_le + (B₁ := BtailShift) (B₂ := BleadUnion) (η := η) (q := q) + hBtailShift_pos hBleadUnion_pos (le_max_left _ _) hη_pos + have hsmall_to_union : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailSmall) ^ η)) ≤ + Real.exp (-Alead) := by + simpa [Alead, BleadUnion] using + exp_neg_rpow_three_div_le_exp_neg_rpow_three_div_of_den_le + (B₁ := BtailSmall) (B₂ := BleadUnion) (η := η) (q := q) + hBtailSmall_pos hBleadUnion_pos (le_max_right _ _) hη_pos + have hcUnion_pos : 0 < cgapUnion := by + simpa [cgapUnion, BtailUnion] using + inv_rpow_sub_pos_of_lt + hBleadUnion_pos hBtailUnion_pos hη_pos hBleadUnion_lt + have hqU_M : + Nat.ceil (max 0 (Real.log (2 : ℝ))) ≤ q := + (le_max_left _ _).trans hq_union + have hqU_R : Runion ≤ q := + (le_max_left Runion + (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_union) + have hqU_c : + Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap) ≤ q := + (le_max_right Runion + (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_union) + have hpref_union_gap : + (2 : ℝ) ≤ Real.exp (Alead - Atail) := by + have hpref_linear : + (2 : ℝ) * (((q : ℝ) + 1) * (1 : ℝ) ^ q) ≤ + Real.exp (cgapUnion * ρgap ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := (2 : ℝ)) (W := (1 : ℝ)) (C₀ := (2 : ℝ)) + (c := cgapUnion) (ρ := ρgap) (R := Runion) (q := q) + (by norm_num) (by norm_num) hcUnion_pos hρgap_gt + (by simp) hRunion hqU_M hqU_R hqU_c + have hgap : + cgapUnion * ρgap ^ q ≤ Alead - Atail := by + simpa [Alead, Atail, cgapUnion, ρgap] using + geometric_gap_le_rpow_three_nat_div_gap + (Blead := BleadUnion) (Btail := BtailUnion) (η := η) + (c := cgapUnion) (ρ := ρgap) (q := q) + hBleadUnion_pos hBtailUnion_pos + (le_rfl : cgapUnion ≤ BleadUnion ^ (-η) - BtailUnion ^ (-η)) + (le_rfl : ρgap ≤ (3 : ℝ) ^ η) hcUnion_pos.le + (le_of_lt (lt_trans zero_lt_one hρgap_gt)) + have hpref_gap := hpref_linear.trans (Real.exp_le_exp.mpr hgap) + have htwo_pref : + (2 : ℝ) ≤ (2 : ℝ) * (((q : ℝ) + 1) * (1 : ℝ) ^ q) := by + have hfactor : 1 ≤ ((q : ℝ) + 1) * (1 : ℝ) ^ q := by + simp + nlinarith + exact htwo_pref.trans hpref_gap + have hunion_measure : + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-Alead) + Real.exp (-Alead) := by + calc + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) + ≤ P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q) ∪ + badTailEvent (badScaleEvent Hshift t α) q) := + measureReal_mono (μ := P) hsplit + _ ≤ P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q)) + + P.real (badTailEvent (badScaleEvent Hshift t α) q) := + measureReal_union_le _ _ + _ ≤ Real.exp (-Alead) + Real.exp (-Alead) := by + exact add_le_add + (hsmall_tail.trans hsmall_to_union) + (hshift_tail.trans hshift_to_union) + calc + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) + ≤ Real.exp (-Alead) + Real.exp (-Alead) := hunion_measure + _ = (2 : ℝ) * Real.exp (-Alead) := by ring + _ ≤ Real.exp (Alead - Atail) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hpref_union_gap (Real.exp_pos _).le + _ = Real.exp (-Atail) := by + rw [← Real.exp_add] + ring_nf + +/-- Uniform-in-`σ` version of +`exists_quantitative_threshold_absoluteBadTail_quenchedProbeEnvelope_le_interpolated_tail`. -/ +theorem exists_quantitative_threshold_absoluteBadTail_quenchedProbeEnvelope_le_interpolated_tail_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct CcrudeShift Csmall : ℝ, + 0 < Cfluct ∧ 0 < CcrudeShift ∧ 0 < Csmall ∧ + ∀ {t α : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + 0 < t → + t ≤ b → + 0 ≤ α → + α < t → + α < b → + α * (1 + b / a) < b → + α < a → + ∃ Rshift Rsmall Runion : ℕ, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + ∀ q : ℕ, Q ≤ q → + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) := by + obtain ⟨Centry, a, hCentry, ha, hshiftUniform⟩ := + exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, CcrudeShift, hCfluct, hCcrudeShift, hshiftBase⟩ := + hshiftUniform hσ_pos + obtain ⟨Csmall, hCsmall, hsmallBase⟩ := + exists_quantitative_threshold_smallBottomBadTail_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, CcrudeShift, Csmall, + hCfluct, hCcrudeShift, hCsmall, ?_⟩ + intro t α + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + obtain ⟨Rshift, _hRshift, hshiftLaw⟩ := + hshiftBase (t := t) (αbad := α) + ht htb hα_nonneg hαt hαb hαharm hαa + obtain ⟨Rsmall, _hRsmall, hsmallLaw⟩ := + hsmallBase (t := t) (α := α) ht hα_nonneg hαt + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hρgap_gt : 1 < ρgap := by + dsimp [ρgap] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη_pos + obtain ⟨Runion, hRunion⟩ := + linear_le_exp_linear_eventually + (C := (2 : ℝ)) (γ := Real.log ρgap / 2) + (by norm_num) (by + have hlogρ_pos : 0 < Real.log ρgap := Real.log_pos hρgap_gt + positivity) + refine ⟨Rshift, Rsmall, Runion, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => H (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + intro q hQq + have hq_shift : Qshift ≤ q := (le_max_left Qshift (max Qsmall Qunion)).trans hQq + have hq_small : Qsmall ≤ q := + (le_max_left Qsmall Qunion).trans + ((le_max_right Qshift (max Qsmall Qunion)).trans hQq) + have hq_union : Qunion ≤ q := + (le_max_right Qsmall Qunion).trans + ((le_max_right Qshift (max Qsmall Qunion)).trans hQq) + have hshift_q : + P.real (badScaleEvent Hshift t α q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) := by + simpa [K, S, b, L, ctop, τ, η, w, ρtop, ρbottom, ρcrude, + Cbottom, Ctop, Kbottom, Kcrude, W, Mshift, ρgap, N0, H, Hshift, + Dhigh, Dcrude, DenShift, Ohigh, Ocrude, BleadShift, BtailShift, + cgapShift, QprefShift, QleadShift, QcutShift, Qshift] using + hshiftLaw hP hStruct hΓ hσ_eq hparams (q := q) hq_shift + have hshift_tail : + P.real (badTailEvent (badScaleEvent Hshift t α) q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) := by + have hmono : + P.real (badTailEvent (badScaleEvent Hshift t α) q) ≤ + P.real (badScaleEvent Hshift t α q) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := α) hα_nonneg) + exact hmono.trans hshift_q + have hsmall_tail : + P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailSmall) ^ η)) := by + simpa [K, S, η, w, W, ρgap, H, scaleSmall, ρsmall, Ksmall, + prefSmall, Msmall, BleadSmall, BtailSmall, cgapSmall, QprefSmall, + QleadSmall, Qsmall] using + hsmallLaw hP hStruct hΓ hσ_eq hparams (Nentry := N0) q hq_small + have hsplit : + badTailEvent (badScaleEvent H t α) (N0 + q) ⊆ + badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q) ∪ + badTailEvent (badScaleEvent Hshift t α) q := by + have hraw := + badTailEvent_subset_smallBottom_union_shifted + (H := H) (Nentry := N0) (N := N0 + q) (t := t) (α := α) + (Nat.le_add_right N0 q) + simpa [Hshift, Nat.add_sub_cancel_left] using hraw + have hBtailShift_pos : 0 < BtailShift := by + have hDenShift_pos : 0 < DenShift := by + simpa [DenShift] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBleadShift_pos : 0 < BleadShift := by + have hleft : 0 < DenShift * (3 : ℝ) ^ Ohigh := + mul_pos hDenShift_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh) + exact hleft.trans_le (le_max_left _ _) + dsimp [BtailShift] + positivity + have hBtailSmall_pos : 0 < BtailSmall := by + have hscaleSmall_pos : 0 < scaleSmall := by + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + dsimp [scaleSmall] + exact mul_pos hK_pos (mul_pos hCsmall (pow_pos hΓ.thetaHat_pos 2)) + have hBleadSmall_pos : 0 < BleadSmall := by + simpa [BleadSmall] using + smallBottomTailDenominator_pos + (scale := scaleSmall) (η := η) (σ := σ) + dsimp [BtailSmall] + positivity + have hBleadUnion_pos : 0 < BleadUnion := by + exact hBtailShift_pos.trans_le (le_max_left _ _) + have hBtailUnion_pos : 0 < BtailUnion := by + dsimp [BtailUnion] + positivity + have hBleadUnion_lt : BleadUnion < BtailUnion := by + dsimp [BtailUnion] + nlinarith + let Alead : ℝ := ((3 : ℝ) ^ (q : ℝ) / BleadUnion) ^ η + let Atail : ℝ := ((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η + have hshift_to_union : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailShift) ^ η)) ≤ + Real.exp (-Alead) := by + simpa [Alead, BleadUnion] using + exp_neg_rpow_three_div_le_exp_neg_rpow_three_div_of_den_le + (B₁ := BtailShift) (B₂ := BleadUnion) (η := η) (q := q) + hBtailShift_pos hBleadUnion_pos (le_max_left _ _) hη_pos + have hsmall_to_union : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailSmall) ^ η)) ≤ + Real.exp (-Alead) := by + simpa [Alead, BleadUnion] using + exp_neg_rpow_three_div_le_exp_neg_rpow_three_div_of_den_le + (B₁ := BtailSmall) (B₂ := BleadUnion) (η := η) (q := q) + hBtailSmall_pos hBleadUnion_pos (le_max_right _ _) hη_pos + have hcUnion_pos : 0 < cgapUnion := by + simpa [cgapUnion, BtailUnion] using + inv_rpow_sub_pos_of_lt + hBleadUnion_pos hBtailUnion_pos hη_pos hBleadUnion_lt + have hqU_M : + Nat.ceil (max 0 (Real.log (2 : ℝ))) ≤ q := + (le_max_left _ _).trans hq_union + have hqU_R : Runion ≤ q := + (le_max_left Runion + (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_union) + have hqU_c : + Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap) ≤ q := + (le_max_right Runion + (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_union) + have hpref_union_gap : + (2 : ℝ) ≤ Real.exp (Alead - Atail) := by + have hpref_linear : + (2 : ℝ) * (((q : ℝ) + 1) * (1 : ℝ) ^ q) ≤ + Real.exp (cgapUnion * ρgap ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := (2 : ℝ)) (W := (1 : ℝ)) (C₀ := (2 : ℝ)) + (c := cgapUnion) (ρ := ρgap) (R := Runion) (q := q) + (by norm_num) (by norm_num) hcUnion_pos hρgap_gt + (by simp) hRunion hqU_M hqU_R hqU_c + have hgap : + cgapUnion * ρgap ^ q ≤ Alead - Atail := by + simpa [Alead, Atail, cgapUnion, ρgap] using + geometric_gap_le_rpow_three_nat_div_gap + (Blead := BleadUnion) (Btail := BtailUnion) (η := η) + (c := cgapUnion) (ρ := ρgap) (q := q) + hBleadUnion_pos hBtailUnion_pos + (le_rfl : cgapUnion ≤ BleadUnion ^ (-η) - BtailUnion ^ (-η)) + (le_rfl : ρgap ≤ (3 : ℝ) ^ η) hcUnion_pos.le + (le_of_lt (lt_trans zero_lt_one hρgap_gt)) + have hpref_gap := hpref_linear.trans (Real.exp_le_exp.mpr hgap) + have htwo_pref : + (2 : ℝ) ≤ (2 : ℝ) * (((q : ℝ) + 1) * (1 : ℝ) ^ q) := by + have hfactor : 1 ≤ ((q : ℝ) + 1) * (1 : ℝ) ^ q := by + simp + nlinarith + exact htwo_pref.trans hpref_gap + have hunion_measure : + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-Alead) + Real.exp (-Alead) := by + calc + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) + ≤ P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q) ∪ + badTailEvent (badScaleEvent Hshift t α) q) := + measureReal_mono (μ := P) hsplit + _ ≤ P.real + (badTailEvent (smallBottomBadScaleEvent H N0 t α) (N0 + q)) + + P.real (badTailEvent (badScaleEvent Hshift t α) q) := + measureReal_union_le _ _ + _ ≤ Real.exp (-Alead) + Real.exp (-Alead) := by + exact add_le_add + (hsmall_tail.trans hsmall_to_union) + (hshift_tail.trans hshift_to_union) + calc + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) + ≤ Real.exp (-Alead) + Real.exp (-Alead) := hunion_measure + _ = (2 : ℝ) * Real.exp (-Alead) := by ring + _ ≤ Real.exp (Alead - Atail) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hpref_union_gap (Real.exp_pos _).le + _ = Real.exp (-Atail) := by + rw [← Real.exp_add] + ring_nf + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteMinimalScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteMinimalScale.lean new file mode 100644 index 0000000000..598376767c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteMinimalScale.lean @@ -0,0 +1,580 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal + +/-! # Absolute Minimal Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# Absolute quantitative minimal scale + +This file converts the absolute bad-tail estimate into the corresponding +localized quenched estimate above an explicit absolute minimal scale. +-/ + +noncomputable section + +theorem exists_quantitative_absolute_quenchedLocalizedEstimate_interpolated + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct CcrudeShift Csmall Centry a : ℝ, + 0 < Cfluct ∧ 0 < CcrudeShift ∧ 0 < Csmall ∧ + 0 < Centry ∧ 0 < a ∧ + ∀ {t α : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + 0 < t → + t ≤ b → + 0 ≤ α → + α < t → + α < b → + α * (1 + b / a) < b → + α < a → + ∃ Rshift Rsmall Runion : ℕ, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Cfluct, CcrudeShift, Csmall, Centry, a, + hCfluct, hCcrudeShift, hCsmall, hCentry, ha, htailBase⟩ := + exists_quantitative_threshold_absoluteBadTail_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, CcrudeShift, Csmall, Centry, a, + hCfluct, hCcrudeShift, hCsmall, hCentry, ha, ?_⟩ + intro t α + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + obtain ⟨Rshift, Rsmall, Runion, htailLaw⟩ := + htailBase (t := t) (α := α) + ht htb hα_nonneg hαt hαb hαharm hαa + refine ⟨Rshift, Rsmall, Runion, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hBtailUnion_pos : 0 < BtailUnion := by + have hDenShift_pos : 0 < DenShift := by + simpa [DenShift] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBleadShift_pos : 0 < BleadShift := by + have hleft : 0 < DenShift * (3 : ℝ) ^ Ohigh := + mul_pos hDenShift_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtailShift_pos : 0 < BtailShift := by + dsimp [BtailShift] + positivity + have hBleadUnion_pos : 0 < BleadUnion := + hBtailShift_pos.trans_le (le_max_left _ _) + dsimp [BtailUnion] + positivity + have hB_one : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 BtailUnion + have htail_abs : + ∀ N : ℕ, N0 + Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - (N0 + Q) : ℕ) : ℝ)) / B) ^ η)) := by + intro N hN + let q : ℕ := N - N0 + have hN0q : N0 + q = N := by + dsimp [q] + exact Nat.add_sub_of_le (le_trans (Nat.le_add_right N0 Q) hN) + have hQq : Q ≤ q := by + dsimp [q] + omega + have htail_q : + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) := by + simpa [K, S, b, L, ctop, τ, η, w, ρtop, ρbottom, ρcrude, + Cbottom, Ctop, Kbottom, Kcrude, Mshift, ρgap, N0, H, Dhigh, + Dcrude, DenShift, Ohigh, Ocrude, BleadShift, BtailShift, + cgapShift, QprefShift, QleadShift, QcutShift, Qshift, + scaleSmall, ρsmall, Ksmall, prefSmall, Msmall, BleadSmall, + BtailSmall, cgapSmall, QprefSmall, QleadSmall, Qsmall, + BleadUnion, BtailUnion, cgapUnion, Qunion, Q] using + htailLaw hP hStruct hΓ hσ_eq hparams q hQq + have hcompare : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - (N0 + Q) : ℕ) : ℝ)) / B) ^ η)) := by + have hshift := + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := q) (B := BtailUnion) (η := η) + hBtailUnion_pos hη_pos + have hdiff : (q - Q : ℕ) = N - (N0 + Q) := by + dsimp [q] + omega + simpa [B, hdiff] using hshift + simpa [Bad, hN0q] using htail_q.trans hcompare + have hlocalized := + quenchedLocalizedEstimate_shifted_from_badTailBound + hP hStruct hΓ (t := t) (α := α) (η := η) (B := B) + (Nentry := 0) (Nmin := N0 + Q) + hη_pos hB_one (by simpa [H, Bad] using htail_abs) + change + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) + simpa [H, Bad, X] using hlocalized + +/-- Uniform-in-`σ` version of +`exists_quantitative_absolute_quenchedLocalizedEstimate_interpolated`. -/ +theorem exists_quantitative_absolute_quenchedLocalizedEstimate_interpolated_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct CcrudeShift Csmall : ℝ, + 0 < Cfluct ∧ 0 < CcrudeShift ∧ 0 < Csmall ∧ + ∀ {t α : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + 0 < t → + t ≤ b → + 0 ≤ α → + α < t → + α < b → + α * (1 + b / a) < b → + α < a → + ∃ Rshift Rsmall Runion : ℕ, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, a, hCentry, ha, htailBaseUniform⟩ := + exists_quantitative_threshold_absoluteBadTail_quenchedProbeEnvelope_le_interpolated_tail_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, CcrudeShift, Csmall, + hCfluct, hCcrudeShift, hCsmall, htailBase⟩ := + htailBaseUniform hσ_pos + refine ⟨Cfluct, CcrudeShift, Csmall, + hCfluct, hCcrudeShift, hCsmall, ?_⟩ + intro t α + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + obtain ⟨Rshift, Rsmall, Runion, htailLaw⟩ := + htailBase (t := t) (α := α) + ht htb hα_nonneg hαt hαb hαharm hαa + refine ⟨Rshift, Rsmall, Runion, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hBtailUnion_pos : 0 < BtailUnion := by + have hDenShift_pos : 0 < DenShift := by + simpa [DenShift] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBleadShift_pos : 0 < BleadShift := by + have hleft : 0 < DenShift * (3 : ℝ) ^ Ohigh := + mul_pos hDenShift_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtailShift_pos : 0 < BtailShift := by + dsimp [BtailShift] + positivity + have hBleadUnion_pos : 0 < BleadUnion := + hBtailShift_pos.trans_le (le_max_left _ _) + dsimp [BtailUnion] + positivity + have hB_one : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 BtailUnion + have htail_abs : + ∀ N : ℕ, N0 + Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - (N0 + Q) : ℕ) : ℝ)) / B) ^ η)) := by + intro N hN + let q : ℕ := N - N0 + have hN0q : N0 + q = N := by + dsimp [q] + exact Nat.add_sub_of_le (le_trans (Nat.le_add_right N0 Q) hN) + have hQq : Q ≤ q := by + dsimp [q] + omega + have htail_q : + P.real (badTailEvent (badScaleEvent H t α) (N0 + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) := by + simpa [K, S, b, L, ctop, τ, η, w, ρtop, ρbottom, ρcrude, + Cbottom, Ctop, Kbottom, Kcrude, Mshift, ρgap, N0, H, Dhigh, + Dcrude, DenShift, Ohigh, Ocrude, BleadShift, BtailShift, + cgapShift, QprefShift, QleadShift, QcutShift, Qshift, + scaleSmall, ρsmall, Ksmall, prefSmall, Msmall, BleadSmall, + BtailSmall, cgapSmall, QprefSmall, QleadSmall, Qsmall, + BleadUnion, BtailUnion, cgapUnion, Qunion, Q] using + htailLaw hP hStruct hΓ hσ_eq hparams q hQq + have hcompare : + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / BtailUnion) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - (N0 + Q) : ℕ) : ℝ)) / B) ^ η)) := by + have hshift := + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := q) (B := BtailUnion) (η := η) + hBtailUnion_pos hη_pos + have hdiff : (q - Q : ℕ) = N - (N0 + Q) := by + dsimp [q] + omega + simpa [B, hdiff] using hshift + simpa [Bad, hN0q] using htail_q.trans hcompare + have hlocalized := + quenchedLocalizedEstimate_shifted_from_badTailBound + hP hStruct hΓ (t := t) (α := α) (η := η) (B := B) + (Nentry := 0) (Nmin := N0 + Q) + hη_pos hB_one (by simpa [H, Bad] using htail_abs) + change + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) + simpa [H, Bad, X] using hlocalized + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompression.lean new file mode 100644 index 0000000000..a2f04afd49 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompression.lean @@ -0,0 +1,635 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression + +/-! # Absolute Scale Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Deterministic compression for the absolute quenched scale + +This file contains the deterministic estimates used to compress the explicit +absolute minimal-scale normalization to the manuscript envelope +`exp(C log^2(2 + thetaHat))`. +-/ + +noncomputable section + +/-- An entry-scale factor times a fixed polynomial in `theta` is absorbed by +the manuscript `exp(C log^2(2 + theta))` envelope. -/ +theorem const_mul_entry_rpow_mul_rpow_max_one_le_exp_logSq + {A G θ Centry r p : ℝ} + (hA : 0 < A) (hG : 1 ≤ G) (hθ : 0 ≤ θ) + (hCentry : 0 < Centry) (hr : 0 ≤ r) (hp : 0 ≤ p) + (hentry : + G ≤ Real.exp (Centry * (Real.log (2 + θ)) ^ (2 : ℕ))) : + ∃ C : ℝ, 0 < C ∧ + A * G ^ r * (max 1 θ) ^ p ≤ + Real.exp (C * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + let Cθ : ℝ := 1 + (4 * max 0 (Real.log A) + 2 * p) + let C : ℝ := r * Centry + Cθ + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hG_pos : 0 < G := lt_of_lt_of_le zero_lt_one hG + have hentry_r : + G ^ r ≤ Real.exp ((r * Centry) * L2) := by + have hpow : + G ^ r ≤ + (Real.exp (Centry * L2)) ^ r := + Real.rpow_le_rpow hG_pos.le hentry hr + have hexp_eq : + (Real.exp (Centry * L2)) ^ r = + Real.exp ((r * Centry) * L2) := by + rw [Real.rpow_def_of_pos (Real.exp_pos _)] + rw [Real.log_exp] + ring_nf + exact hpow.trans_eq hexp_eq + have hθ_poly : + A * (max 1 θ) ^ p ≤ Real.exp (Cθ * L2) := by + have hbase := + const_mul_rpow_max_one_le_exp_logSq + (A := A) (θ := θ) (p := p) hA hθ hp + have hcoef : + (4 * max 0 (Real.log A) + 2 * p) * L2 ≤ Cθ * L2 := by + dsimp [Cθ] + nlinarith + exact hbase.trans (Real.exp_le_exp.mpr hcoef) + have hC_pos : 0 < C := by + have hCθ_pos : 0 < Cθ := by + dsimp [Cθ] + have hmax_nonneg : 0 ≤ max 0 (Real.log A) := le_max_left 0 _ + nlinarith + dsimp [C] + positivity + refine ⟨C, hC_pos, ?_⟩ + calc + A * G ^ r * (max 1 θ) ^ p + = G ^ r * (A * (max 1 θ) ^ p) := by ring + _ ≤ Real.exp ((r * Centry) * L2) * Real.exp (Cθ * L2) := + mul_le_mul hentry_r hθ_poly (by positivity) (by positivity) + _ = Real.exp (C * L2) := by + rw [← Real.exp_add] + dsimp [C] + ring_nf + +/-- Natural entry scales are dominated by their base-three exponential. -/ +theorem nat_cast_le_pow_three_nat (N : ℕ) : + (N : ℝ) ≤ (3 : ℝ) ^ N := by + have h := + Nat.cast_le_pow_div_sub (α := ℝ) (a := (3 : ℝ)) + (by norm_num : (1 : ℝ) < 3) N + have htwo : (0 : ℝ) < 3 - 1 := by norm_num + have hle : (3 : ℝ) ^ N / (3 - 1) ≤ (3 : ℝ) ^ N := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ N := by positivity + nlinarith + exact h.trans hle + +/-- A logarithmic ceiling cutoff is polynomial in any positive upper bound for +the underlying quantity. -/ +theorem pow_three_natCeil_max_zero_log_le_const_mul_rpow_of_le + {M A G p : ℝ} + (hM_one : 1 ≤ M) (hA_pos : 0 < A) (hG_one : 1 ≤ G) + (hM_le : M ≤ A * G ^ p) : + (3 : ℝ) ^ Nat.ceil (max 0 (Real.log M)) ≤ + 3 * A ^ (Real.log (3 : ℝ)) * G ^ (p * Real.log (3 : ℝ)) := by + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hG_pos : 0 < G := lt_of_lt_of_le zero_lt_one hG_one + have hGp_pos : 0 < G ^ p := Real.rpow_pos_of_pos hG_pos p + have hAG_pos : 0 < A * G ^ p := mul_pos hA_pos hGp_pos + have hM_pos : 0 < M := lt_of_lt_of_le zero_lt_one hM_one + have hlogM_nonneg : 0 ≤ Real.log M := Real.log_nonneg hM_one + have hceil_raw : + (3 : ℝ) ^ Nat.ceil (max 0 (Real.log M)) ≤ + 3 * Real.exp (Real.log (3 : ℝ) * max 0 (Real.log M)) := by + simpa [Real.rpow_natCast] using + rpow_three_natCeil_le_three_mul_exp + (y := max 0 (Real.log M)) (le_max_left 0 (Real.log M)) + have hlog_le : Real.log M ≤ Real.log (A * G ^ p) := + Real.log_le_log hM_pos hM_le + have hexp_le : + Real.exp (Real.log (3 : ℝ) * max 0 (Real.log M)) ≤ + Real.exp (Real.log (3 : ℝ) * Real.log (A * G ^ p)) := by + refine Real.exp_le_exp.mpr ?_ + rw [max_eq_right hlogM_nonneg] + exact mul_le_mul_of_nonneg_left hlog_le hlog3_pos.le + have hexp_eq : + Real.exp (Real.log (3 : ℝ) * Real.log (A * G ^ p)) = + A ^ (Real.log (3 : ℝ)) * G ^ (p * Real.log (3 : ℝ)) := by + have hAG : + Real.exp (Real.log (3 : ℝ) * Real.log (A * G ^ p)) = + (A * G ^ p) ^ Real.log (3 : ℝ) := by + rw [Real.rpow_def_of_pos hAG_pos] + ring_nf + rw [hAG] + rw [Real.mul_rpow hA_pos.le hGp_pos.le] + rw [← Real.rpow_mul hG_pos.le] + calc + (3 : ℝ) ^ Nat.ceil (max 0 (Real.log M)) + ≤ 3 * Real.exp (Real.log (3 : ℝ) * max 0 (Real.log M)) := + hceil_raw + _ ≤ 3 * Real.exp (Real.log (3 : ℝ) * Real.log (A * G ^ p)) := + mul_le_mul_of_nonneg_left hexp_le (by norm_num) + _ = 3 * A ^ (Real.log (3 : ℝ)) * + G ^ (p * Real.log (3 : ℝ)) := by rw [hexp_eq]; ring + +/-- The small-bottom prefactor `Msmall` is polynomial in the entry-scale +factor `3 ^ N0`. -/ +theorem smallBottom_M_le_const_mul_entry_power + {d N0 : ℕ} {Ksmall : ℝ} + (hKsmall : 0 ≤ Ksmall) : + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let G : ℝ := (3 : ℝ) ^ N0 + let pref : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let M : ℝ := max 1 (max 0 (pref * Ksmall)) + let A : ℝ := max 1 ((S.card : ℝ) * Ksmall) + M ≤ A * G ^ ((d : ℝ) + 1) := by + classical + intro S w G pref M A + have hG_one : 1 ≤ G := by + dsimp [G] + exact one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + have hG_nonneg : 0 ≤ G := le_trans zero_le_one hG_one + have hA_one : 1 ≤ A := by + dsimp [A] + exact le_max_left 1 _ + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA_one + have hpow_one : 1 ≤ G ^ ((d : ℝ) + 1) := by + have hexp_nonneg : 0 ≤ (d : ℝ) + 1 := by positivity + have hbase : G ^ (0 : ℝ) ≤ G ^ ((d : ℝ) + 1) := + Real.rpow_le_rpow_of_exponent_le hG_one hexp_nonneg + simpa using hbase + have hone_le : 1 ≤ A * G ^ ((d : ℝ) + 1) := by + nlinarith + have hw_eq : w ^ N0 = G ^ (d : ℝ) := by + dsimp [w, G] + norm_num [Nat.cast_pow] + have hleft : + ((3 : ℝ) ^ d) ^ (N0 : ℝ) = + (3 : ℝ) ^ ((d : ℝ) * (N0 : ℝ)) := by + rw [← Real.rpow_natCast (3 : ℝ) d] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + have hright : + ((3 : ℝ) ^ N0) ^ (d : ℝ) = + (3 : ℝ) ^ ((N0 : ℝ) * (d : ℝ)) := by + rw [← Real.rpow_natCast (3 : ℝ) N0] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + calc + ((3 : ℝ) ^ d) ^ N0 + = ((3 : ℝ) ^ d) ^ (N0 : ℝ) := by + rw [Real.rpow_natCast] + _ + = (3 : ℝ) ^ ((d : ℝ) * (N0 : ℝ)) := hleft + _ = (3 : ℝ) ^ ((N0 : ℝ) * (d : ℝ)) := by ring_nf + _ = ((3 : ℝ) ^ N0) ^ (d : ℝ) := hright.symm + _ = ((3 : ℝ) ^ N0) ^ d := by + rw [Real.rpow_natCast] + have hN0_le_G : (N0 : ℝ) ≤ G := by + simpa [G] using nat_cast_le_pow_three_nat N0 + have hprefK_le : + pref * Ksmall ≤ ((S.card : ℝ) * Ksmall) * G ^ ((d : ℝ) + 1) := by + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + have hleft_nonneg : 0 ≤ (S.card : ℝ) * Ksmall := by positivity + have hGd_nonneg : 0 ≤ G ^ (d : ℝ) := + (Real.rpow_pos_of_pos (lt_of_lt_of_le zero_lt_one hG_one) _).le + have hG_pos : 0 < G := lt_of_lt_of_le zero_lt_one hG_one + calc + pref * Ksmall + = ((N0 : ℝ) * ((S.card : ℝ) * Ksmall)) * w ^ N0 := by + dsimp [pref] + ring + _ ≤ (G * ((S.card : ℝ) * Ksmall)) * w ^ N0 := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hN0_le_G hleft_nonneg) + (pow_nonneg (by dsimp [w]; positivity) N0) + _ = ((S.card : ℝ) * Ksmall) * (G * G ^ (d : ℝ)) := by + rw [hw_eq] + ring + _ = ((S.card : ℝ) * Ksmall) * G ^ ((d : ℝ) + 1) := by + have hmul : + G * G ^ (d : ℝ) = G ^ ((d : ℝ) + 1) := by + calc + G * G ^ (d : ℝ) + = G ^ (1 : ℝ) * G ^ (d : ℝ) := by + rw [Real.rpow_one] + _ = G ^ ((1 : ℝ) + (d : ℝ)) := by + rw [← Real.rpow_add hG_pos] + _ = G ^ ((d : ℝ) + 1) := by ring_nf + rw [hmul] + have hprefK_A : + pref * Ksmall ≤ A * G ^ ((d : ℝ) + 1) := by + calc + pref * Ksmall + ≤ ((S.card : ℝ) * Ksmall) * G ^ ((d : ℝ) + 1) := hprefK_le + _ ≤ A * G ^ ((d : ℝ) + 1) := + mul_le_mul_of_nonneg_right + (le_max_right 1 ((S.card : ℝ) * Ksmall)) + (Real.rpow_nonneg hG_nonneg _) + have hmax0 : + max 0 (pref * Ksmall) ≤ A * G ^ ((d : ℝ) + 1) := by + exact max_le (by linarith) hprefK_A + dsimp [M] + exact max_le hone_le hmax0 + +/-- If the selected leading denominator is polynomial in `theta`, then the +explicit prefactor-gap threshold attached to it is compressed by the manuscript +`exp(C log^2(2 + theta))` envelope. -/ +theorem explicit_threshold_prefactor_le_exp_logSq_of_Blead_le_poly + {η A p M : ℝ} {R Qcut : ℕ} + (hη : 0 < η) (hA : 0 < A) (hp : 0 ≤ p) : + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ θ : ℝ, 0 ≤ θ → + ∀ Blead : ℝ, 1 ≤ Blead → + Blead ≤ A * (max 1 θ) ^ p → + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρgap : ℝ := (3 : ℝ) ^ η + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref (max Qlead Qcut) + 3 * ((3 : ℝ) ^ Q) * max 1 Btail ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + let Cgap : ℝ := + (2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3) + let Cq : ℝ := + 18 * (3 : ℝ) ^ (Nat.ceil (max 0 (Real.log M)) + R + Qcut) * + Real.exp (Real.log 3 * Cgap) + let Aenv : ℝ := 3 * Cq * A ^ (4 : ℕ) + let penv : ℝ := 4 * p + let Cscale : ℝ := 1 + (4 * max 0 (Real.log Aenv) + 2 * penv) + have hCq_pos : 0 < Cq := by + dsimp [Cq] + positivity + have hAenv_pos : 0 < Aenv := by + dsimp [Aenv] + positivity + have hpenv_nonneg : 0 ≤ penv := by + dsimp [penv] + positivity + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hmax_nonneg : 0 ≤ max 0 (Real.log Aenv) := le_max_left 0 _ + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ hθ_nonneg Blead hBlead_one hBlead_poly Btail cgap ρgap Qpref Qlead Q + have hBlead_pos : 0 < Blead := lt_of_lt_of_le zero_lt_one hBlead_one + have hthreshold : + (3 : ℝ) ^ Q * max 1 Btail ≤ Cq * Blead ^ (4 : ℕ) := by + simpa [Btail, cgap, ρgap, Qpref, Qlead, Q, Cgap, Cq] using + pow_three_explicit_threshold_le_const_mul_Blead_four + (M := M) (η := η) (Blead := Blead) (R := R) (Qcut := Qcut) + hη hBlead_one + have hblead_pow : + Blead ^ (4 : ℕ) ≤ + (A * (max 1 θ) ^ p) ^ (4 : ℕ) := + pow_le_pow_left₀ hBlead_pos.le hBlead_poly 4 + have hpoly : + 3 * ((3 : ℝ) ^ Q) * max 1 Btail ≤ + Aenv * (max 1 θ) ^ penv := by + calc + 3 * ((3 : ℝ) ^ Q) * max 1 Btail + = 3 * (((3 : ℝ) ^ Q) * max 1 Btail) := by ring + _ ≤ 3 * (Cq * Blead ^ (4 : ℕ)) := + mul_le_mul_of_nonneg_left hthreshold (by norm_num) + _ ≤ 3 * (Cq * ((A * (max 1 θ) ^ p) ^ (4 : ℕ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hblead_pow hCq_pos.le) (by norm_num) + _ = Aenv * (max 1 θ) ^ penv := by + dsimp [Aenv, penv] + rw [mul_pow] + have hx_pos : 0 < max 1 θ := + lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + rw [show ((max 1 θ) ^ p) ^ (4 : ℕ) = + ((max 1 θ) ^ p) ^ (4 : ℝ) by + exact (Real.rpow_natCast ((max 1 θ) ^ p) 4).symm] + rw [← Real.rpow_mul hx_pos.le] + ring_nf + have henv := + const_mul_rpow_max_one_le_exp_logSq + (A := Aenv) (θ := θ) (p := penv) + hAenv_pos hθ_nonneg hpenv_nonneg + have henv2 : + Real.exp ((4 * max 0 (Real.log Aenv) + 2 * penv) * + (Real.log (2 + θ)) ^ (2 : ℕ)) ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + refine Real.exp_le_exp.mpr ?_ + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hcoef : + 4 * max 0 (Real.log Aenv) + 2 * penv ≤ Cscale := by + dsimp [Cscale] + linarith + exact mul_le_mul_of_nonneg_right hcoef hL2_nonneg + exact hpoly.trans (henv.trans henv2) + +/-- Compress the explicit small-bottom threshold once the annealed entry +factor has already been compressed. -/ +theorem explicit_smallBottom_prefactor_le_exp_logSq + {d : ℕ} [NeZero d] {σ Csmall t α CentryScale : ℝ} {Rsmall : ℕ} + (hσ : 0 < σ) (hCsmall : 0 < Csmall) (ht : 0 < t) + (hαt : α < t) (hCentryScale : 0 < CentryScale) : + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let ρgap : ℝ := (3 : ℝ) ^ η + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {θ : ℝ} {N0 : ℕ}, 0 < θ → + (3 : ℝ) ^ N0 ≤ + Real.exp (CentryScale * (Real.log (2 + θ)) ^ (2 : ℕ)) → + let scaleSmall : ℝ := K * (Csmall * θ ^ (2 : ℕ)) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + 3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + intro K S η w ρsmall Ksmall ρgap + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos (d := d) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ ht + have hρsmall_gt : 1 < ρsmall := by + have hgap : 0 < t - α := sub_pos.mpr hαt + dsimp [ρsmall] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hKsmall_pos : 0 < Ksmall := by + dsimp [Ksmall] + exact weightedGeometricExpKernelConst_pos + (w := w) (R := ρsmall ^ σ) hw_pos + (Real.one_lt_rpow hρsmall_gt hσ) + let AM : ℝ := max 1 ((S.card : ℝ) * Ksmall) + let pM : ℝ := (d : ℝ) + 1 + let rceil : ℝ := pM * Real.log (3 : ℝ) + let Acoef : ℝ := + 18 * (3 : ℝ) ^ Rsmall * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3))) * + (3 * AM ^ Real.log (3 : ℝ)) + let Ascale : ℝ := K * Csmall + let rB : ℝ := 4 * (σ / η) + let AB : ℝ := (max 1 Ascale) ^ rB + let pB : ℝ := 2 * rB + let Afinal : ℝ := 3 * Acoef * AB + let rfinal : ℝ := 1 + rceil + let pfinal : ℝ := pB + have hAM_pos : 0 < AM := by + dsimp [AM] + exact lt_of_lt_of_le zero_lt_one (le_max_left 1 _) + have hpM_nonneg : 0 ≤ pM := by dsimp [pM]; positivity + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hrceil_nonneg : 0 ≤ rceil := by dsimp [rceil]; positivity + have hAcoef_pos : 0 < Acoef := by dsimp [Acoef]; positivity + have hAscale_pos : 0 < Ascale := by dsimp [Ascale]; positivity + have hrB_nonneg : 0 ≤ rB := by dsimp [rB]; positivity + have hAB_pos : 0 < AB := by + dsimp [AB] + exact Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 Ascale)) rB + have hpB_nonneg : 0 ≤ pB := by dsimp [pB]; positivity + have hAfinal_pos : 0 < Afinal := by dsimp [Afinal]; positivity + have hrfinal_nonneg : 0 ≤ rfinal := by dsimp [rfinal]; positivity + let Cθfinal : ℝ := 1 + (4 * max 0 (Real.log Afinal) + 2 * pfinal) + let Cscale : ℝ := rfinal * CentryScale + Cθfinal + have hCθfinal_pos : 0 < Cθfinal := by + dsimp [Cθfinal] + have hmax_nonneg : 0 ≤ max 0 (Real.log Afinal) := le_max_left 0 _ + nlinarith + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + positivity + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ N0 hθ_pos hentry scaleSmall prefSmall Msmall BleadSmall + BtailSmall cgapSmall QprefSmall QleadSmall Qsmall + let G : ℝ := (3 : ℝ) ^ N0 + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hG_one : 1 ≤ G := by + dsimp [G] + exact one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + have hMsmall_one : 1 ≤ Msmall := by + dsimp [Msmall] + exact le_max_left 1 _ + have hM_bound : + Msmall ≤ AM * G ^ pM := by + simpa [S, w, G, prefSmall, Msmall, AM, pM] using + smallBottom_M_le_const_mul_entry_power + (d := d) (N0 := N0) (Ksmall := Ksmall) hKsmall_pos.le + have hceil_bound : + (3 : ℝ) ^ Nat.ceil (max 0 (Real.log Msmall)) ≤ + 3 * AM ^ Real.log (3 : ℝ) * G ^ rceil := by + simpa [rceil, pM] using + pow_three_natCeil_max_zero_log_le_const_mul_rpow_of_le + (M := Msmall) (A := AM) (G := G) (p := pM) + hMsmall_one hAM_pos hG_one hM_bound + have hBlead_one : 1 ≤ BleadSmall := by + simpa [BleadSmall] using + one_le_smallBottomTailDenominator + (scale := scaleSmall) (η := η) (σ := σ) hη_pos hσ.le + have hthreshold : + (3 : ℝ) ^ Qsmall * max 1 BtailSmall ≤ + (18 * (3 : ℝ) ^ + (Nat.ceil (max 0 (Real.log Msmall)) + Rsmall + 0) * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3)))) * + BleadSmall ^ (4 : ℕ) := by + let Qaux : ℕ := max QprefSmall (max QleadSmall 0) + have hQsmall_le : Qsmall ≤ Qaux := by + dsimp [Qaux, Qsmall] + omega + have hmono : + (3 : ℝ) ^ Qsmall * max 1 BtailSmall ≤ + (3 : ℝ) ^ Qaux * max 1 BtailSmall := by + exact mul_le_mul_of_nonneg_right + (pow_three_nat_mono hQsmall_le) (by positivity) + have haux : + (3 : ℝ) ^ Qaux * max 1 BtailSmall ≤ + (18 * (3 : ℝ) ^ + (Nat.ceil (max 0 (Real.log Msmall)) + Rsmall + 0) * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3)))) * + BleadSmall ^ (4 : ℕ) := by + simpa [BtailSmall, cgapSmall, ρgap, QprefSmall, QleadSmall, Qaux] using + pow_three_explicit_threshold_le_const_mul_Blead_four + (M := Msmall) (η := η) (Blead := BleadSmall) + (R := Rsmall) (Qcut := 0) hη_pos hBlead_one + exact hmono.trans haux + have hBlead_pow : + BleadSmall ^ (4 : ℕ) ≤ AB * (max 1 θ) ^ pB := by + have hden_eq : + BleadSmall ^ (4 : ℕ) = + (max 1 (Ascale * θ ^ (2 : ℕ))) ^ rB := by + dsimp [BleadSmall, smallBottomTailDenominator, scaleSmall, Ascale, rB] + rw [show ((max 1 (K * (Csmall * θ ^ (2 : ℕ)))) ^ (σ / η)) ^ + (4 : ℕ) = + ((max 1 (K * (Csmall * θ ^ (2 : ℕ)))) ^ (σ / η)) ^ + (4 : ℝ) by + exact (Real.rpow_natCast _ 4).symm] + rw [← Real.rpow_mul + (le_trans zero_le_one (le_max_left 1 (K * (Csmall * θ ^ (2 : ℕ)))))] + congr 1 + field_simp [hη_pos.ne'] + ring + rw [hden_eq] + simpa [AB, pB, Ascale, rB] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := Ascale) (θ := θ) (r := rB) hθ_nonneg hrB_nonneg + have hQsmall_bound : + (3 : ℝ) ^ Qsmall * max 1 BtailSmall ≤ + Acoef * G ^ rceil * (AB * (max 1 θ) ^ pB) := by + calc + (3 : ℝ) ^ Qsmall * max 1 BtailSmall + ≤ (18 * (3 : ℝ) ^ + (Nat.ceil (max 0 (Real.log Msmall)) + Rsmall + 0) * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3)))) * + BleadSmall ^ (4 : ℕ) := hthreshold + _ = + (18 * (3 : ℝ) ^ Rsmall * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3)))) * + ((3 : ℝ) ^ Nat.ceil (max 0 (Real.log Msmall))) * + BleadSmall ^ (4 : ℕ) := by + rw [show Nat.ceil (max 0 (Real.log Msmall)) + Rsmall + 0 = + Nat.ceil (max 0 (Real.log Msmall)) + Rsmall by omega] + rw [pow_add] + ring + _ ≤ + (18 * (3 : ℝ) ^ Rsmall * + Real.exp + (Real.log 3 * + ((2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3)))) * + (3 * AM ^ Real.log (3 : ℝ) * G ^ rceil) * + (AB * (max 1 θ) ^ pB) := by + gcongr + _ = Acoef * G ^ rceil * (AB * (max 1 θ) ^ pB) := by + dsimp [Acoef] + ring + have htotal_poly : + 3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall ≤ + Afinal * G ^ rfinal * (max 1 θ) ^ pfinal := by + have hpow_split : + (3 : ℝ) ^ (N0 + Qsmall) = G * (3 : ℝ) ^ Qsmall := by + dsimp [G] + rw [pow_add] + calc + 3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall + = 3 * G * ((3 : ℝ) ^ Qsmall * max 1 BtailSmall) := by + rw [hpow_split] + ring + _ ≤ 3 * G * (Acoef * G ^ rceil * (AB * (max 1 θ) ^ pB)) := by + gcongr + _ = Afinal * G ^ rfinal * (max 1 θ) ^ pfinal := by + have hG_pos : 0 < G := lt_of_lt_of_le zero_lt_one hG_one + have hmulG : G * G ^ rceil = G ^ rfinal := by + dsimp [rfinal] + calc + G * G ^ rceil = G ^ (1 : ℝ) * G ^ rceil := by + rw [Real.rpow_one] + _ = G ^ ((1 : ℝ) + rceil) := by + rw [← Real.rpow_add hG_pos] + calc + 3 * G * (Acoef * G ^ rceil * (AB * (max 1 θ) ^ pB)) + = 3 * Acoef * AB * (G * G ^ rceil) * + (max 1 θ) ^ pB := by ring + _ = 3 * Acoef * AB * G ^ rfinal * + (max 1 θ) ^ pB := by rw [hmulG] + _ = Afinal * G ^ rfinal * (max 1 θ) ^ pfinal := by + dsimp [Afinal, pfinal] + have hG_pos : 0 < G := lt_of_lt_of_le zero_lt_one hG_one + have hentry_r : + G ^ rfinal ≤ Real.exp ((rfinal * CentryScale) * L2) := by + have hpow : + G ^ rfinal ≤ + (Real.exp (CentryScale * L2)) ^ rfinal := + Real.rpow_le_rpow hG_pos.le hentry hrfinal_nonneg + have hexp_eq : + (Real.exp (CentryScale * L2)) ^ rfinal = + Real.exp ((rfinal * CentryScale) * L2) := by + rw [Real.rpow_def_of_pos (Real.exp_pos _)] + rw [Real.log_exp] + ring_nf + exact hpow.trans_eq hexp_eq + have hθ_poly : + Afinal * (max 1 θ) ^ pfinal ≤ Real.exp (Cθfinal * L2) := by + have hbase := + const_mul_rpow_max_one_le_exp_logSq + (A := Afinal) (θ := θ) (p := pfinal) + hAfinal_pos hθ_nonneg hpB_nonneg + have hcoef : + (4 * max 0 (Real.log Afinal) + 2 * pfinal) * L2 ≤ + Cθfinal * L2 := by + dsimp [Cθfinal] + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + exact mul_le_mul_of_nonneg_right (by linarith) hL2_nonneg + exact hbase.trans (Real.exp_le_exp.mpr hcoef) + have hfinal : + Afinal * G ^ rfinal * (max 1 θ) ^ pfinal ≤ + Real.exp (Cscale * L2) := by + calc + Afinal * G ^ rfinal * (max 1 θ) ^ pfinal + = G ^ rfinal * (Afinal * (max 1 θ) ^ pfinal) := by ring + _ ≤ Real.exp ((rfinal * CentryScale) * L2) * + Real.exp (Cθfinal * L2) := + mul_le_mul hentry_r hθ_poly (by positivity) (by positivity) + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add] + dsimp [Cscale] + ring_nf + simpa [L2] using htotal_poly.trans hfinal + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompressionFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompressionFinal.lean new file mode 100644 index 0000000000..1e93697fb9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AbsoluteScaleCompressionFinal.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionFinal + +/-! # Absolute Scale Compression Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Final absolute-scale compression + +This file contains the last deterministic compression steps for the absolute +minimal scale in the quenched homogenization theorem. +-/ + +noncomputable section + +/-- The union cutoff in the absolute bad-scale estimate is still polynomial in +`theta`, hence is also compressed by the manuscript `exp(C log^2)` envelope. -/ +theorem explicit_union_prefactor_le_exp_logSq + {d : ℕ} [NeZero d] {σ Cfluct CcrudeShift Csmall a t : ℝ} + {Runion : ℕ} + (hσ : 0 < σ) (ha : 0 < a) (ht : 0 < t) : + let K : ℝ := quenchedProbeEnvelopeConst d + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let ρgap : ℝ := (3 : ℝ) ^ η + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ θ : ℝ, 0 < θ → + let Dhigh : ℝ := 2 * K * Cfluct * θ ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * θ ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let scaleSmall : ℝ := K * (Csmall * θ ^ (2 : ℕ)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + 3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + intro K b L τ η ρgap + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos (d := d) + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ ht + let Ahi : ℝ := 2 * K * Cfluct + let Acr : ℝ := K * CcrudeShift + let rτ : ℝ := τ / η + let rσ : ℝ := σ / η + let pShift : ℝ := 2 * max rτ rσ + let CdenShift : ℝ := max ((max 1 Ahi) ^ rτ) ((max 1 Acr) ^ rσ) + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let U : ℝ := (3 : ℝ) ^ Ohigh + let V : ℝ := (3 : ℝ) ^ Ocrude + let CbleadShift : ℝ := CdenShift * max U V + let Ashift : ℝ := 2 * CbleadShift + let rSmall : ℝ := σ / η + let pSmall : ℝ := 2 * rSmall + let Asmall : ℝ := 2 * (max 1 (K * Csmall)) ^ rSmall + let pUnion : ℝ := max pShift pSmall + let Aunion : ℝ := max Ashift Asmall + obtain ⟨Cscale, hCscale_pos, hthreshold⟩ := + explicit_threshold_prefactor_le_exp_logSq_of_Blead_le_poly + (η := η) (A := Aunion) (p := pUnion) (M := (2 : ℝ)) + (R := Runion) (Qcut := 0) hη_pos (by + dsimp [Aunion, Ashift, CbleadShift, CdenShift, Asmall] + positivity) (by + dsimp [pUnion, pShift, pSmall, rτ, rσ, rSmall] + positivity) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ hθ_pos Dhigh Dcrude DenShift Ohigh' Ocrude' BleadShift + BtailShift scaleSmall BleadSmall BtailSmall BleadUnion BtailUnion + cgapUnion Qunion + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hpShift_nonneg : 0 ≤ pShift := by + dsimp [pShift, rτ, rσ] + positivity + have hpSmall_nonneg : 0 ≤ pSmall := by + dsimp [pSmall, rSmall] + positivity + have hAshift_nonneg : 0 ≤ Ashift := by + dsimp [Ashift, CbleadShift, CdenShift, U, V] + positivity + have hAsmall_nonneg : 0 ≤ Asmall := by + dsimp [Asmall, rSmall] + positivity + have hU_pos : 0 < U := by dsimp [U]; positivity + have hV_pos : 0 < V := by dsimp [V]; positivity + have hDenShift_ge_one : 1 ≤ DenShift := by + simpa [DenShift, Dhigh, Dcrude, η, τ, Ahi, Acr] using + one_le_mixedBottomTailDenominator + (Dhigh := Ahi * θ ^ (2 : ℕ)) (Dcrude := Acr * θ ^ (2 : ℕ)) + (η := η) (τ := τ) (σ := σ) hη_pos hτ_pos.le + have hL_nonneg : 0 ≤ L := by + dsimp [L] + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + positivity + have hOhigh_nonneg : 0 ≤ Ohigh' := by + dsimp [Ohigh', L] + positivity + have hU_ge_one : 1 ≤ (3 : ℝ) ^ Ohigh' := + one_le_rpow_of_one_le_of_nonneg (by norm_num : (1 : ℝ) ≤ 3) + hOhigh_nonneg + have hBleadShift_ge_one : 1 ≤ BleadShift := by + dsimp [BleadShift] + have hleft : 1 ≤ DenShift * (3 : ℝ) ^ Ohigh' := by + have hprod_nonneg : 0 ≤ DenShift * (3 : ℝ) ^ Ohigh' := by positivity + nlinarith + exact hleft.trans (le_max_left _ _) + have hBtailShift_ge_one : 1 ≤ BtailShift := by + dsimp [BtailShift] + nlinarith + have hBleadSmall_ge_one : 1 ≤ BleadSmall := by + simpa [BleadSmall] using + one_le_smallBottomTailDenominator + (scale := scaleSmall) (η := η) (σ := σ) hη_pos hσ.le + have hBtailSmall_ge_one : 1 ≤ BtailSmall := by + dsimp [BtailSmall] + nlinarith + have hBleadUnion_ge_one : 1 ≤ BleadUnion := + hBtailShift_ge_one.trans (le_max_left _ _) + have hshift_core : + BleadShift ≤ CbleadShift * (max 1 θ) ^ pShift := by + simpa [BleadShift, DenShift, Dhigh, Dcrude, Ahi, Acr, Ohigh', + Ocrude', Ohigh, Ocrude, U, V, CdenShift, CbleadShift, pShift, + rτ, rσ] using + selectedBlead_mul_sq_le_const_mul_rpow + (A := Ahi) (B := Acr) (θ := θ) (η := η) (τ := τ) (σ := σ) + (U := U) (V := V) hθ_nonneg hη_pos hτ_pos.le hσ.le + hU_pos.le hV_pos.le + have hshift_bound : + BtailShift ≤ Aunion * (max 1 θ) ^ pUnion := by + have hpow : + (max 1 θ) ^ pShift ≤ (max 1 θ) ^ pUnion := + rpow_max_one_le_rpow_max_one_of_exponent_le (by + dsimp [pUnion] + exact le_max_left _ _) + calc + BtailShift = 2 * BleadShift := by rfl + _ ≤ 2 * (CbleadShift * (max 1 θ) ^ pShift) := by + exact mul_le_mul_of_nonneg_left hshift_core (by norm_num) + _ = Ashift * (max 1 θ) ^ pShift := by + dsimp [Ashift] + ring + _ ≤ Ashift * (max 1 θ) ^ pUnion := + mul_le_mul_of_nonneg_left hpow hAshift_nonneg + _ ≤ Aunion * (max 1 θ) ^ pUnion := + mul_le_mul_of_nonneg_right (le_max_left _ _) (by positivity) + have hsmall_core : + BleadSmall ≤ (max 1 (K * Csmall)) ^ rSmall * + (max 1 θ) ^ pSmall := by + simpa [BleadSmall, scaleSmall, smallBottomTailDenominator, rSmall, + pSmall, mul_assoc] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := K * Csmall) (θ := θ) (r := rSmall) + hθ_nonneg (by dsimp [rSmall]; positivity) + have hsmall_bound : + BtailSmall ≤ Aunion * (max 1 θ) ^ pUnion := by + have hpow : + (max 1 θ) ^ pSmall ≤ (max 1 θ) ^ pUnion := + rpow_max_one_le_rpow_max_one_of_exponent_le (by + dsimp [pUnion] + exact le_max_right _ _) + calc + BtailSmall = 2 * BleadSmall := by rfl + _ ≤ 2 * ((max 1 (K * Csmall)) ^ rSmall * + (max 1 θ) ^ pSmall) := by + exact mul_le_mul_of_nonneg_left hsmall_core (by norm_num) + _ = Asmall * (max 1 θ) ^ pSmall := by + dsimp [Asmall] + ring + _ ≤ Asmall * (max 1 θ) ^ pUnion := + mul_le_mul_of_nonneg_left hpow hAsmall_nonneg + _ ≤ Aunion * (max 1 θ) ^ pUnion := + mul_le_mul_of_nonneg_right (le_max_right _ _) (by positivity) + have hBleadUnion_poly : + BleadUnion ≤ Aunion * (max 1 θ) ^ pUnion := by + dsimp [BleadUnion] + exact max_le hshift_bound hsmall_bound + let QleadUnion : ℕ := Nat.ceil (Real.log BleadUnion / Real.log 3) + let Qaux : ℕ := max Qunion (max QleadUnion 0) + have haux : + 3 * ((3 : ℝ) ^ Qaux) * max 1 BtailUnion ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + have hraw := + hthreshold θ hθ_nonneg BleadUnion hBleadUnion_ge_one + hBleadUnion_poly + dsimp only at hraw + simpa only using hraw + have hQunion_le_aux : Qunion ≤ Qaux := by + dsimp [Qaux] + exact le_max_left _ _ + have hleft : + 3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion ≤ + 3 * ((3 : ℝ) ^ Qaux) * max 1 BtailUnion := by + have hpow := pow_three_nat_mono hQunion_le_aux + gcongr + exact hleft.trans haux + +/-- The absolute prefactor is dominated by the product of the shifted, +small-bottom, and union prefactors. -/ +theorem absolute_prefactor_le_branch_product + {N0 Qshift Qsmall Qunion : ℕ} {Bshift Bsmall Bunion : ℝ} + (hBshift : 1 ≤ Bshift) (hBsmall : 1 ≤ Bsmall) + (hBunion : 1 ≤ Bunion) : + let Q : ℕ := max Qshift (max Qsmall Qunion) + 3 * ((3 : ℝ) ^ (N0 + Q)) * Bunion ≤ + (3 * ((3 : ℝ) ^ Qshift) * Bshift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * Bsmall) * + (3 * ((3 : ℝ) ^ Qunion) * Bunion) := by + intro Q + have hBunion_nonneg : 0 ≤ Bunion := le_trans zero_le_one hBunion + have hBprod : + Bunion ≤ Bshift * Bsmall * Bunion := by + have h12 : 1 ≤ Bshift * Bsmall := + one_le_mul_of_one_le_of_one_le hBshift hBsmall + have hmul : Bunion ≤ (Bshift * Bsmall) * Bunion := + by simpa [one_mul] using mul_le_mul_of_nonneg_right h12 hBunion_nonneg + simpa [one_mul, mul_assoc] using hmul + have hQsum : N0 + Q ≤ Qshift + (N0 + Qsmall) + Qunion := by + dsimp [Q] + omega + have hpow : + (3 : ℝ) ^ (N0 + Q) ≤ + (3 : ℝ) ^ (Qshift + (N0 + Qsmall) + Qunion) := + pow_three_nat_mono hQsum + have hrest_nonneg : + 0 ≤ (3 : ℝ) ^ (Qshift + (N0 + Qsmall) + Qunion) * + (Bshift * Bsmall * Bunion) := by + have hB_nonneg : 0 ≤ Bshift * Bsmall * Bunion := by positivity + positivity + calc + 3 * ((3 : ℝ) ^ (N0 + Q)) * Bunion + ≤ 3 * ((3 : ℝ) ^ (Qshift + (N0 + Qsmall) + Qunion)) * Bunion := by + gcongr + _ ≤ 3 * ((3 : ℝ) ^ (Qshift + (N0 + Qsmall) + Qunion)) * + (Bshift * Bsmall * Bunion) := by + gcongr + _ ≤ 27 * ((3 : ℝ) ^ (Qshift + (N0 + Qsmall) + Qunion)) * + (Bshift * Bsmall * Bunion) := by + nlinarith + _ = + (3 * ((3 : ℝ) ^ Qshift) * Bshift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * Bsmall) * + (3 * ((3 : ℝ) ^ Qunion) * Bunion) := by + rw [pow_add, pow_add] + ring + +/-- Final deterministic compression of the explicit absolute minimal-scale +normalization. -/ +theorem explicit_absoluteMinimalScale_prefactor_le_exp_logSq + {d : ℕ} [NeZero d] + {σ Cfluct CcrudeShift Csmall a t α CentryScale : ℝ} + {Rshift Rsmall Runion : ℕ} + (hσ : 0 < σ) (hCfluct : 0 < Cfluct) + (hCcrudeShift : 0 < CcrudeShift) (hCsmall : 0 < Csmall) + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) + (hCentryScale : 0 < CentryScale) : + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min ((d : ℝ) / 2 - α) + (min ((t - α) * (1 + ((d : ℝ) / 2) / a)) + ((d : ℝ) / 2 - α * (1 + ((d : ℝ) / 2) / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {θ : ℝ} {N0 : ℕ}, 0 < θ → + (3 : ℝ) ^ N0 ≤ + Real.exp (CentryScale * (Real.log (2 + θ)) ^ (2 : ℕ)) → + let Dhigh : ℝ := 2 * K * Cfluct * θ ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * θ ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * θ ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + intro K S b L ctop τ η w ρtop ρbottom ρcrude Cbottom Ctop + Kbottom Kcrude Mshift ρgap + obtain ⟨Cshift, hCshift_pos, hshiftBase⟩ := + explicit_minimalScale_prefactor_le_exp_logSq + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := CcrudeShift) + (a := a) (t := t) (αbad := α) (R := Rshift) + hσ hCfluct hCcrudeShift ha ht + obtain ⟨CsmallScale, hCsmallScale_pos, hsmallBase⟩ := + explicit_smallBottom_prefactor_le_exp_logSq + (d := d) (σ := σ) (Csmall := Csmall) (t := t) (α := α) + (CentryScale := CentryScale) (Rsmall := Rsmall) + hσ hCsmall ht hαt hCentryScale + obtain ⟨Cunion, hCunion_pos, hunionBase⟩ := + explicit_union_prefactor_le_exp_logSq + (d := d) (σ := σ) (Cfluct := Cfluct) + (CcrudeShift := CcrudeShift) (Csmall := Csmall) + (a := a) (t := t) (Runion := Runion) hσ ha ht + let Cscale : ℝ := Cshift + CsmallScale + Cunion + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + positivity + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ N0 hθ_pos hentry Dhigh Dcrude DenShift Ohigh Ocrude + BleadShift BtailShift cgapShift QprefShift QleadShift QcutShift + Qshift scaleSmall ρsmall Ksmall prefSmall Msmall BleadSmall + BtailSmall cgapSmall QprefSmall QleadSmall Qsmall BleadUnion + BtailUnion cgapUnion Qunion Q B + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hshift : + 3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift ≤ + Real.exp (Cshift * L2) := by + have hraw := hshiftBase θ hθ_pos + dsimp only at hraw + simpa only [L2] using hraw + have hsmall : + 3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall ≤ + Real.exp (CsmallScale * L2) := by + have hraw := hsmallBase (θ := θ) (N0 := N0) hθ_pos hentry + dsimp only at hraw + simpa only [L2] using hraw + have hunion : + 3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion ≤ + Real.exp (Cunion * L2) := by + have hraw := hunionBase θ hθ_pos + dsimp only at hraw + simpa only [L2] using hraw + have hBshift_one : 1 ≤ max 1 BtailShift := le_max_left 1 _ + have hBsmall_one : 1 ≤ max 1 BtailSmall := le_max_left 1 _ + have hBunion_one : 1 ≤ max 1 BtailUnion := le_max_left 1 _ + have hpref : + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + (3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall) * + (3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion) := by + simpa [Q, B] using + absolute_prefactor_le_branch_product + (N0 := N0) (Qshift := Qshift) (Qsmall := Qsmall) + (Qunion := Qunion) (Bshift := max 1 BtailShift) + (Bsmall := max 1 BtailSmall) (Bunion := max 1 BtailUnion) + hBshift_one hBsmall_one hBunion_one + have hprod : + (3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall) * + (3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion) ≤ + Real.exp (Cshift * L2) * + Real.exp (CsmallScale * L2) * + Real.exp (Cunion * L2) := by + have hleft_nonneg : + 0 ≤ 3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift := by positivity + have hmid_nonneg : + 0 ≤ 3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall := by positivity + have hright_nonneg : + 0 ≤ 3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion := by positivity + have h12 : + (3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall) ≤ + Real.exp (Cshift * L2) * Real.exp (CsmallScale * L2) := + mul_le_mul hshift hsmall hmid_nonneg (Real.exp_pos _).le + exact mul_le_mul h12 hunion hright_nonneg + (mul_nonneg (Real.exp_pos _).le (Real.exp_pos _).le) + calc + 3 * ((3 : ℝ) ^ (N0 + Q)) * B + ≤ (3 * ((3 : ℝ) ^ Qshift) * max 1 BtailShift) * + (3 * ((3 : ℝ) ^ (N0 + Qsmall)) * max 1 BtailSmall) * + (3 * ((3 : ℝ) ^ Qunion) * max 1 BtailUnion) := hpref + _ ≤ Real.exp (Cshift * L2) * + Real.exp (CsmallScale * L2) * + Real.exp (Cunion * L2) := hprod + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add, ← Real.exp_add] + congr 1 + dsimp [Cscale] + rw [← add_mul, ← add_mul] + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedJLimit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedJLimit.lean new file mode 100644 index 0000000000..6cffd23a7c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedJLimit.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitJTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries + +/-! # Annealed JLimit -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators Matrix.Norms.Elementwise + +/-! +# Annealed bound for the limiting-normalized block response + +This file supplies the deterministic annealed input in Corollary +`c.first.quenched.estimate`: after the main annealed theorem has made the +scalar contrast small, the annealed response with the limiting normalization +is small as well. +-/ + +noncomputable section + +private theorem limit_normalized_scalar_coeff_le_theta_sub_one + {b c L normSq : ℝ} (hL_pos : 0 < L) (hc_pos : 0 < c) + (hc_le_L : c ≤ L) (hL_le_b : L ≤ b) + (hnorm_le_one : normSq ≤ 1) : + (1 / 2 : ℝ) * (b * L⁻¹ + L * c⁻¹ - 2) * normSq ≤ b * c⁻¹ - 1 := by + let x : ℝ := b * L⁻¹ + let y : ℝ := L * c⁻¹ + have hx_one : 1 ≤ x := by + have hmul := mul_le_mul_of_nonneg_right hL_le_b (inv_pos.mpr hL_pos).le + calc + 1 = L * L⁻¹ := by field_simp [hL_pos.ne'] + _ ≤ b * L⁻¹ := hmul + _ = x := rfl + have hy_one : 1 ≤ y := by + have hmul := mul_le_mul_of_nonneg_right hc_le_L (inv_pos.mpr hc_pos).le + calc + 1 = c * c⁻¹ := by field_simp [hc_pos.ne'] + _ ≤ L * c⁻¹ := hmul + _ = y := rfl + have hcoeff_nonneg : 0 ≤ (1 / 2 : ℝ) * (x + y - 2) := by + nlinarith + have hxy_nonneg : 0 ≤ (x - 1) * (y - 1) := + mul_nonneg (sub_nonneg.mpr hx_one) (sub_nonneg.mpr hy_one) + have hcoeff_le : (1 / 2 : ℝ) * (x + y - 2) ≤ x * y - 1 := by + nlinarith + calc + (1 / 2 : ℝ) * (b * L⁻¹ + L * c⁻¹ - 2) * normSq = + ((1 / 2 : ℝ) * (x + y - 2)) * normSq := by + simp [x, y] + _ ≤ (1 / 2 : ℝ) * (x + y - 2) := + mul_le_of_le_one_right hcoeff_nonneg hnorm_le_one + _ ≤ x * y - 1 := hcoeff_le + _ = b * c⁻¹ - 1 := by + dsimp [x, y] + field_simp [hL_pos.ne'] + +private theorem vecDot_sub_self_add_add_self {d : ℕ} (x y : Vec d) : + vecDot (x - y) (x - y) + vecDot (x + y) (x + y) = + 2 * (vecDot x x + vecDot y y) := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, vecDot_comm] + ring + +private theorem expectedJScalarFormula_limit_pair_eq + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (m : ℤ) {L : ℝ} (hL_pos : 0 < L) (u : Vec d) : + expectedJScalarFormula hP hStruct m ((√L)⁻¹ • u) (√L • u) = + (1 / 2 : ℝ) * + (hP.barSigmaAtScale hStruct m * L⁻¹ + + L * (hP.barSigmaStarAtScale hStruct m)⁻¹ - 2) * + vecDot u u := by + have hsqrt_ne : √L ≠ 0 := ne_of_gt (Real.sqrt_pos.2 hL_pos) + simp [expectedJScalarFormula, vecDot_smul_left, vecDot_smul_right] + field_simp [hsqrt_ne, hL_pos.ne'] + rw [Real.sq_sqrt hL_pos.le] + ring + +theorem abs_fullBlockVec_coord_le_one_of_dotProduct_le_one + {d : ℕ} (e : FullBlockVec d) (he : dotProduct e e ≤ 1) + (α : BlockCoord d) : + |e α| ≤ 1 := by + have hcoord_le : + e α * e α ≤ dotProduct e e := by + have hcoord_sq : + e α ^ (2 : ℕ) ≤ ∑ β : BlockCoord d, e β ^ (2 : ℕ) := + Finset.single_le_sum + (fun β _hβ => sq_nonneg (e β)) + (Finset.mem_univ α) + simpa [dotProduct, pow_two] using hcoord_sq + have hsq : |e α| ^ (2 : ℕ) ≤ (1 : ℝ) ^ (2 : ℕ) := by + rw [sq_abs] + nlinarith + simpa using (sq_le_sq.mp hsq) + +namespace GammaSigmaCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +/-- The annealed response with limiting scalar normalizers is controlled by +the scalar contrast at the same scale. -/ +theorem integral_limitNormalizedBlockJObservable_le_thetaAtScale_sub_one + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (k : ℕ) (e : FullBlockVec d) (he_norm : dotProduct e e ≤ 1) : + (∫ a, + limitNormalizedBlockJObservable hP hStruct (originCube d (k : ℤ)) e a ∂P) ≤ + thetaAtScale hP hStruct (k : ℤ) - 1 := by + let : IsProbabilityMeasure P := hP.isProbability + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let L : ℝ := barSigmaLimit hP hStruct + let b : ℝ := hP.barSigmaAtScale hStruct (k : ℤ) + let c : ℝ := hP.barSigmaStarAtScale hStruct (k : ℤ) + let x : Vec d := fun i => e (Sum.inl i) + let y : Vec d := fun i => e (Sum.inr i) + let p : Vec d := (√L)⁻¹ • x + let q : Vec d := √L • y + let pStar : Vec d := (√L)⁻¹ • y + let qStar : Vec d := √L • x + have hL_pos : 0 < L := by simpa [L] using hΓ.barSigmaLimit_pos + have hc_pos : 0 < c := by + simpa [c] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 k + have hc_le_L : c ≤ L := by + simpa [c, L] using hΓ.barSigmaStarAtScale_le_barSigmaLimit k + have hL_le_b : L ≤ b := by + simpa [L, b] using hΓ.barSigmaLimit_le_barSigmaAtScale k + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (k : ℤ))) P := + Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 k + have hJ₁ : + Integrable + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) + (p - pStar) (qStar - q)) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d (k : ℤ)) (p - pStar) (qStar - q) hBlock + have hJ₂ : + Integrable + (Ch04.restrictionResponseJObservableCubeSet (originCube d (k : ℤ)) + (pStar + p) (qStar + q)) P := + hP.integrable_restrictionResponseJObservableCubeSet_of_integrable_coarseFullBlockMatrixAtCube + (originCube d (k : ℤ)) (pStar + p) (qStar + q) hBlock + have hPvec_eq : + scalarLimitInvSqrtBlockVec hP hStruct e = (p, q) := by + apply Prod.ext + · funext i + change (Matrix.mulVec (scalarLimitInvSqrtMatrix hP hStruct) e) (Sum.inl i) = + (√L)⁻¹ * e (Sum.inl i) + simp [scalarLimitInvSqrtMatrix, Ch04.scalarFullBlockInvSqrtDiag, + Matrix.mulVec, dotProduct, Matrix.diagonal, L] + · funext i + change (Matrix.mulVec (scalarLimitInvSqrtMatrix hP hStruct) e) (Sum.inr i) = + √L * e (Sum.inr i) + simp [scalarLimitInvSqrtMatrix, Ch04.scalarFullBlockInvSqrtDiag, + Matrix.mulVec, dotProduct, Matrix.diagonal, L] + have hQvec_eq : + scalarLimitSqrtBlockVec hP hStruct e = (qStar, pStar) := by + apply Prod.ext + · funext i + change (Matrix.mulVec (scalarLimitSqrtMatrix hP hStruct) e) (Sum.inl i) = + √L * e (Sum.inl i) + simp [scalarLimitSqrtMatrix, Section56.scalarFullBlockSqrtDiag, + Matrix.mulVec, dotProduct, Matrix.diagonal, L] + · funext i + change (Matrix.mulVec (scalarLimitSqrtMatrix hP hStruct) e) (Sum.inr i) = + (√L)⁻¹ * e (Sum.inr i) + simp [scalarLimitSqrtMatrix, Section56.scalarFullBlockSqrtDiag, + Matrix.mulVec, dotProduct, Matrix.diagonal, L] + have hIntegral_half : + (∫ a, + limitNormalizedBlockJObservable hP hStruct (originCube d (k : ℤ)) e a ∂P) = + (1 / 2 : ℝ) * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (pStar + p) (qStar + q) := by + calc + (∫ a, + limitNormalizedBlockJObservable hP hStruct (originCube d (k : ℤ)) e a ∂P) + = + ∫ a, Ch04.blockJObservableCubeSet (originCube d (k : ℤ)) + p pStar q qStar a ∂P := by + congr 1 + funext a + simp [limitNormalizedBlockJObservable, Ch04.blockJObservableCubeSetBlockVec, + hPvec_eq, hQvec_eq] + _ = + (1 / 2 : ℝ) * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (pStar + p) (qStar + q) := + Ch04.integral_blockJObservableCubeSet_eq_half_expectedResponseJCubeSet_add + hStruct.adjoint_invariant (originCube d (k : ℤ)) + p pStar q qStar hJ₁ hJ₂ + have hResp₁ : + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (p - pStar) (qStar - q) = + expectedJScalarFormula hP hStruct (k : ℤ) + (p - pStar) (qStar - q) := by + have h := + Section52.annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (k : ℤ) (p - pStar) (qStar - q) hBlock + simpa [Ch04.expectedResponseJCubeSet, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale, Ch04.restrictionResponseJObservableCubeSet] using h + have hResp₂ : + Ch04.expectedResponseJCubeSet P (originCube d (k : ℤ)) + (pStar + p) (qStar + q) = + expectedJScalarFormula hP hStruct (k : ℤ) + (pStar + p) (qStar + q) := by + have h := + Section52.annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (k : ℤ) (pStar + p) (qStar + q) hBlock + simpa [Ch04.expectedResponseJCubeSet, Ch04.annealedResponseJAtScale, + Ch04.responseJAtScale, Ch04.restrictionResponseJObservableCubeSet] using h + have hsqrt_ne : √L ≠ 0 := ne_of_gt (Real.sqrt_pos.2 hL_pos) + have hscalar : + (1 / 2 : ℝ) * expectedJScalarFormula hP hStruct (k : ℤ) + (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * expectedJScalarFormula hP hStruct (k : ℤ) + (pStar + p) (qStar + q) = + (1 / 2 : ℝ) * (b * L⁻¹ + L * c⁻¹ - 2) * dotProduct e e := by + have hsplit : dotProduct e e = vecDot x x + vecDot y y := by + unfold dotProduct + rw [Fintype.sum_sum_type] + simp [x, y, vecDot] + have hp_minus : p - pStar = (√L)⁻¹ • (x - y) := by + ext i + simp [p, pStar, sub_eq_add_neg, mul_add] + have hq_minus : qStar - q = √L • (x - y) := by + ext i + simp [qStar, q, sub_eq_add_neg, mul_add] + have hp_plus : pStar + p = (√L)⁻¹ • (x + y) := by + ext i + simp [p, pStar, add_comm, mul_add] + have hq_plus : qStar + q = √L • (x + y) := by + ext i + simp [qStar, q, mul_add] + have hminus := + expectedJScalarFormula_limit_pair_eq hP hStruct (k : ℤ) hL_pos (x - y) + have hplus := + expectedJScalarFormula_limit_pair_eq hP hStruct (k : ℤ) hL_pos (x + y) + rw [hp_minus, hq_minus, hp_plus, hq_plus, hminus, hplus, hsplit] + have hpara := vecDot_sub_self_add_add_self x y + let coeff : ℝ := b * L⁻¹ + L * c⁻¹ - 2 + change + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * coeff * vecDot (x - y) (x - y)) + + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * coeff * vecDot (x + y) (x + y)) = + (1 / 2 : ℝ) * coeff * (vecDot x x + vecDot y y) + calc + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * coeff * vecDot (x - y) (x - y)) + + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * coeff * vecDot (x + y) (x + y)) + = + (1 / 4 : ℝ) * coeff * + (vecDot (x - y) (x - y) + vecDot (x + y) (x + y)) := by + ring + _ = (1 / 4 : ℝ) * coeff * (2 * (vecDot x x + vecDot y y)) := by + rw [hpara] + _ = (1 / 2 : ℝ) * coeff * (vecDot x x + vecDot y y) := by + ring + have hIntegral_eq : + (∫ a, + limitNormalizedBlockJObservable hP hStruct (originCube d (k : ℤ)) e a ∂P) = + (1 / 2 : ℝ) * (b * L⁻¹ + L * c⁻¹ - 2) * dotProduct e e := by + rw [hIntegral_half, hResp₁, hResp₂, hscalar] + have hbound := + limit_normalized_scalar_coeff_le_theta_sub_one + (b := b) (c := c) (L := L) (normSq := dotProduct e e) + hL_pos hc_pos hc_le_L hL_le_b he_norm + calc + (∫ a, + limitNormalizedBlockJObservable hP hStruct (originCube d (k : ℤ)) e a ∂P) + = + (1 / 2 : ℝ) * (b * L⁻¹ + L * c⁻¹ - 2) * dotProduct e e := hIntegral_eq + _ ≤ b * c⁻¹ - 1 := hbound + _ = thetaAtScale hP hStruct (k : ℤ) - 1 := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b, c] + +end GammaSigmaCoarseGrainedEllipticity + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedLimit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedLimit.lean new file mode 100644 index 0000000000..86170a2203 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/AnnealedLimit.lean @@ -0,0 +1,360 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedGammaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.Pigeonhole.ScalarChain +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.ScaleCompression + +/-! # Annealed Limit -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped Topology +open Filter + +/-! +# Limiting annealed scalar coefficients + +This file starts the Lean surface for the limiting annealed matrix +`\overline{\mathbf A}` used in Section 5.7. The scalarized upper coefficient +is realized as the infimum of the decreasing `\bar σ_n`, and the starred +coefficient as the supremum of the increasing `\bar σ_{*,n}`. +-/ + +noncomputable section + +/-- Candidate limiting scalar `\bar σ = inf_n \bar σ_n`. -/ +noncomputable def barSigmaLimit {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : ℝ := + sInf (Set.range fun n : ℕ => hP.barSigmaAtScale hStruct (n : ℤ)) + +/-- Candidate limiting starred scalar `\bar σ_* = sup_n \bar σ_{*,n}`. -/ +noncomputable def barSigmaStarLimit {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : ℝ := + sSup (Set.range fun n : ℕ => hP.barSigmaStarAtScale hStruct (n : ℤ)) + +/-- Limiting scalarized annealed doubled matrix. -/ +noncomputable def scalarAnnealedBlockMatrixLimit + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : BlockMat d := + Ch02.blockDiag + (barSigmaLimit hP hStruct • (1 : Mat d)) + ((barSigmaStarLimit hP hStruct)⁻¹ • (1 : Mat d)) + +namespace GammaSigmaCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +private theorem exponentialDecay_tendsto_zero {α : ℝ} (hα : 0 < α) : + Tendsto (fun n : ℕ => Real.rpow (3 : ℝ) (-α * (n : ℝ))) + atTop (𝓝 (0 : ℝ)) := by + have hlinear : + Tendsto (fun n : ℕ => (-α) * (n : ℝ)) atTop atBot := + tendsto_natCast_atTop_atTop.const_mul_atTop_of_neg (by linarith) + have hpow : + Tendsto (fun x : ℝ => Real.rpow (3 : ℝ) x) atBot (𝓝 (0 : ℝ)) := + tendsto_rpow_atBot_of_base_gt_one (3 : ℝ) (by norm_num : (1 : ℝ) < 3) + simpa [mul_comm] using! hpow.comp hlinear + +private theorem le_of_forall_le_one_add_mul + {a b : ℝ} (hb : 0 ≤ b) + (h : ∀ ε > 0, a ≤ (1 + ε) * b) : + a ≤ b := by + by_contra hle + have hlt : b < a := lt_of_not_ge hle + by_cases hb_zero : b = 0 + · have hbound := h 1 (by norm_num : (0 : ℝ) < 1) + nlinarith [hb_zero] + · have hb_pos : 0 < b := lt_of_le_of_ne' hb hb_zero + let ε : ℝ := (a - b) / (2 * b) + have hε_pos : 0 < ε := by + dsimp [ε] + exact div_pos (sub_pos.mpr hlt) (mul_pos (by norm_num) hb_pos) + have hbound := h ε hε_pos + have hmul_eq : (1 + ε) * b = (a + b) / 2 := by + dsimp [ε] + field_simp [hb_pos.ne'] + ring + nlinarith [hbound, hmul_eq] + +private theorem barSigma_range_bddBelow + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + BddBelow (Set.range fun n : ℕ => hP.barSigmaAtScale hStruct (n : ℤ)) := by + refine ⟨0, ?_⟩ + rintro x ⟨n, rfl⟩ + exact (Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity n).le + +private theorem barSigmaStar_range_bddAbove + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + BddAbove (Set.range fun n : ℕ => hP.barSigmaStarAtScale hStruct (n : ℤ)) := by + refine ⟨hP.barSigmaAtScale hStruct (0 : ℤ), ?_⟩ + rintro x ⟨n, rfl⟩ + have hstar_le_at_n : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity n + have hb_n_le_b0 : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (0 : ℤ) := + (Section54.Pigeonhole.scalarChain_of_P4 hP hStruct + hΓ.toQuantitativeCoarseGrainedEllipticity (Nat.zero_le n)).2.2 + exact hstar_le_at_n.trans hb_n_le_b0 + +theorem barSigmaLimit_le_barSigmaAtScale + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) (m : ℕ) : + barSigmaLimit hP hStruct ≤ hP.barSigmaAtScale hStruct (m : ℤ) := by + exact csInf_le hΓ.barSigma_range_bddBelow ⟨m, rfl⟩ + +theorem barSigmaStarAtScale_le_barSigmaStarLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) (m : ℕ) : + hP.barSigmaStarAtScale hStruct (m : ℤ) ≤ + barSigmaStarLimit hP hStruct := by + exact le_csSup hΓ.barSigmaStar_range_bddAbove ⟨m, rfl⟩ + +theorem barSigmaStarAtScale_le_barSigmaLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) (n : ℕ) : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + barSigmaLimit hP hStruct := by + refine le_csInf (Set.range_nonempty _) ?_ + rintro y ⟨m, rfl⟩ + by_cases hnm : n ≤ m + · have hstar_nm : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaStarAtScale hStruct (m : ℤ) := + (Section54.Pigeonhole.scalarChain_of_P4 hP hStruct + hΓ.toQuantitativeCoarseGrainedEllipticity hnm).1 + have hstar_m_b_m : + hP.barSigmaStarAtScale hStruct (m : ℤ) ≤ + hP.barSigmaAtScale hStruct (m : ℤ) := + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity m + exact hstar_nm.trans hstar_m_b_m + · have hmn : m ≤ n := by omega + have hstar_n_b_n : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := + Section54.VarianceBoundGoodScale.barSigmaStarAtScale_le_barSigmaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity n + have hb_n_m : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (m : ℤ) := + (Section54.Pigeonhole.scalarChain_of_P4 hP hStruct + hΓ.toQuantitativeCoarseGrainedEllipticity hmn).2.2 + exact hstar_n_b_n.trans hb_n_m + +theorem barSigmaStarLimit_le_barSigmaLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + barSigmaStarLimit hP hStruct ≤ barSigmaLimit hP hStruct := by + refine csSup_le (Set.range_nonempty _) ?_ + rintro x ⟨n, rfl⟩ + exact hΓ.barSigmaStarAtScale_le_barSigmaLimit n + +theorem barSigmaStarLimit_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 < barSigmaStarLimit hP hStruct := by + have h0_pos : + 0 < hP.barSigmaStarAtScale hStruct (0 : ℤ) := + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + exact lt_of_lt_of_le h0_pos + (hΓ.barSigmaStarAtScale_le_barSigmaStarLimit 0) + +theorem barSigmaLimit_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 < barSigmaLimit hP hStruct := + lt_of_lt_of_le hΓ.barSigmaStarLimit_pos hΓ.barSigmaStarLimit_le_barSigmaLimit + +private theorem barSigmaLimit_le_one_add_mul_barSigmaStarLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {ε : ℝ} (hε : 0 < ε) : + barSigmaLimit hP hStruct ≤ + (1 + ε) * barSigmaStarLimit hP hStruct := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + obtain ⟨C, α, hC_pos, hα_pos, hconv⟩ := + Section51.annealedConvergence_homogenizationScale hΓ.params + let N : ℕ := annealedAlgebraicEntryScale P hP4 C + have hsmall_event : + ∀ᶠ n : ℕ in atTop, + Real.rpow (3 : ℝ) (-α * (n : ℝ)) < ε := by + exact (exponentialDecay_tendsto_zero hα_pos) (Iio_mem_nhds hε) + rcases eventually_atTop.1 hsmall_event with ⟨n, hn⟩ + let m : ℕ := N + n + have htheta : + thetaAtScale hP hStruct (m : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + have hparams : hP4.params = hΓ.params := by + simp [hP4, GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos, + QuantitativeCoarseGrainedEllipticity.params] + have h := hconv hP hStruct hP4 hparams n + simpa [N, m] using h + have htheta_eps : thetaAtScale hP hStruct (m : ℤ) ≤ 1 + ε := by + have hdecay_le : Real.rpow (3 : ℝ) (-α * (n : ℝ)) ≤ ε := + (hn n le_rfl).le + linarith + let bm : ℝ := hP.barSigmaAtScale hStruct (m : ℤ) + let cm : ℝ := hP.barSigmaStarAtScale hStruct (m : ℤ) + have hcm_pos : 0 < cm := by + simpa [cm, hP4] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 m + have htheta_def : bm * cm⁻¹ ≤ 1 + ε := by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, bm, cm] using htheta_eps + have hb_le : bm ≤ (1 + ε) * cm := by + have hmul := + mul_le_mul_of_nonneg_right htheta_def hcm_pos.le + calc + bm = bm * cm⁻¹ * cm := by + field_simp [hcm_pos.ne'] + _ ≤ (1 + ε) * cm := hmul + have honeps_nonneg : 0 ≤ 1 + ε := by linarith + calc + barSigmaLimit hP hStruct ≤ bm := by + simpa [bm, m] using hΓ.barSigmaLimit_le_barSigmaAtScale m + _ ≤ (1 + ε) * cm := hb_le + _ ≤ (1 + ε) * barSigmaStarLimit hP hStruct := by + exact mul_le_mul_of_nonneg_left + (by simpa [cm, m] using hΓ.barSigmaStarAtScale_le_barSigmaStarLimit m) + honeps_nonneg + +theorem barSigmaLimit_eq_barSigmaStarLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + barSigmaLimit hP hStruct = barSigmaStarLimit hP hStruct := by + refine le_antisymm ?_ hΓ.barSigmaStarLimit_le_barSigmaLimit + exact le_of_forall_le_one_add_mul hΓ.barSigmaStarLimit_pos.le + fun ε hε => hΓ.barSigmaLimit_le_one_add_mul_barSigmaStarLimit hε + +/-- The limiting annealed block matrix has the single scalar coefficient +`\bar σ` on the upper block and `\bar σ^{-1}` on the lower block. -/ +theorem scalarAnnealedBlockMatrixLimit_eq_blockDiag_barSigmaLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + scalarAnnealedBlockMatrixLimit hP hStruct = + Ch02.blockDiag + (barSigmaLimit hP hStruct • (1 : Mat d)) + ((barSigmaLimit hP hStruct)⁻¹ • (1 : Mat d)) := by + rw [scalarAnnealedBlockMatrixLimit] + rw [← hΓ.barSigmaLimit_eq_barSigmaStarLimit] + +/-- The upper unit-scale scalar is controlled by the limiting scalar times the +initial scalar contrast. -/ +theorem barSigmaAtScale_zero_le_thetaAtScale_zero_mul_barSigmaLimit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + hP.barSigmaAtScale hStruct (0 : ℤ) ≤ + thetaAtScale hP hStruct (0 : ℤ) * barSigmaLimit hP hStruct := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let L := barSigmaLimit hP hStruct + have hb0_pos : 0 < b0 := by + simpa [b0] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0_pos : 0 < c0 := by + simpa [c0] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0_le_L : c0 ≤ L := by + simpa [c0, L] using hΓ.barSigmaStarAtScale_le_barSigmaLimit 0 + have htheta_nonneg : 0 ≤ b0 * c0⁻¹ := + mul_nonneg hb0_pos.le (inv_pos.mpr hc0_pos).le + calc + b0 = (b0 * c0⁻¹) * c0 := by field_simp [hc0_pos.ne'] + _ ≤ (b0 * c0⁻¹) * L := + mul_le_mul_of_nonneg_left hc0_le_L htheta_nonneg + _ = thetaAtScale hP hStruct (0 : ℤ) * barSigmaLimit hP hStruct := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, c0, L] + +/-- The limiting inverse upper scalar is controlled by the unit-scale inverse +upper scalar times the initial scalar contrast. -/ +theorem barSigmaLimit_inv_le_thetaAtScale_zero_mul_barSigmaAtScale_zero_inv + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + (barSigmaLimit hP hStruct)⁻¹ ≤ + thetaAtScale hP hStruct (0 : ℤ) * + (hP.barSigmaAtScale hStruct (0 : ℤ))⁻¹ := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let L := barSigmaLimit hP hStruct + let θ := thetaAtScale hP hStruct (0 : ℤ) + have hb0_pos : 0 < b0 := by + simpa [b0] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hL_pos : 0 < L := by + simpa [L] using hΓ.barSigmaLimit_pos + have hle : b0 ≤ θ * L := by + simpa [b0, L, θ] using + hΓ.barSigmaAtScale_zero_le_thetaAtScale_zero_mul_barSigmaLimit + rw [← div_eq_mul_inv] + rw [le_div_iff₀ hb0_pos] + have hmain : b0 * L⁻¹ ≤ θ := by + have hmul := mul_le_mul_of_nonneg_right hle (inv_pos.mpr hL_pos).le + calc + b0 * L⁻¹ ≤ (θ * L) * L⁻¹ := hmul + _ = θ := by field_simp [hL_pos.ne'] + simpa [L, θ, mul_comm] using hmain + +/-- The unit-scale inverse starred scalar is controlled by the limiting inverse +scalar times the initial scalar contrast. -/ +theorem barSigmaStarAtScale_zero_inv_le_thetaAtScale_zero_mul_barSigmaLimit_inv + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + (hP.barSigmaStarAtScale hStruct (0 : ℤ))⁻¹ ≤ + thetaAtScale hP hStruct (0 : ℤ) * + (barSigmaLimit hP hStruct)⁻¹ := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let c0 := hP.barSigmaStarAtScale hStruct (0 : ℤ) + let L := barSigmaLimit hP hStruct + have hb0_pos : 0 < b0 := by + simpa [b0] using + Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 hP hStruct hP4 0 + have hc0_pos : 0 < c0 := by + simpa [c0] using + Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 hP hStruct hP4 0 + have hL_pos : 0 < L := by + simpa [L] using hΓ.barSigmaLimit_pos + have hL_le_b0 : L ≤ b0 := by + simpa [L, b0] using hΓ.barSigmaLimit_le_barSigmaAtScale 0 + have hinv_nonneg : 0 ≤ c0⁻¹ * L⁻¹ := + mul_nonneg (inv_pos.mpr hc0_pos).le (inv_pos.mpr hL_pos).le + calc + c0⁻¹ = (c0⁻¹ * L⁻¹) * L := by field_simp [hL_pos.ne'] + _ ≤ (c0⁻¹ * L⁻¹) * b0 := + mul_le_mul_of_nonneg_left hL_le_b0 hinv_nonneg + _ = (b0 * c0⁻¹) * L⁻¹ := by ring + _ = thetaAtScale hP hStruct (0 : ℤ) * + (barSigmaLimit hP hStruct)⁻¹ := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b0, c0, L] + +/-- The initial scalar contrast is bounded by the Γσ ellipticity scale supplied +by `(P5)`. -/ +theorem thetaAtScale_zero_le_gammaMomentScale_sq + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + thetaAtScale hP hStruct (0 : ℤ) ≤ + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat) ^ 2 := by + have htheta_wide : + thetaAtScale hP hStruct (0 : ℤ) ≤ + widetildeThetaAtScale P (0 : ℤ) + hΓ.toQuantitativeCoarseGrainedEllipticity := + Section54.OneStepContraction.thetaAtScale_zero_le_widetildeThetaAtScale_zero_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity + exact htheta_wide.trans hΓ.widetildeThetaAtScale_zero_le_gammaMomentScale_sq + +end GammaSigmaCoarseGrainedEllipticity + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadEventSummability.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadEventSummability.lean new file mode 100644 index 0000000000..8e732159c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadEventSummability.lean @@ -0,0 +1,438 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeEnvelope + +/-! # Bad Event Summability -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped BigOperators ENNReal + +/-! +# Bad-pair tail estimates + +This file contains the one-pair tail estimates used by the quantitative +minimal-scale proof. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +/-- A Γ-tail controls any event contained in the corresponding upper-tail +event. -/ +theorem measureReal_le_exp_of_subset_upperTail_gammaSigma + {μ : Measure Ω} [IsFiniteMeasure μ] + {X : Ω → ℝ} {E : Set Ω} {A σ s : ℝ} + (hX : IsBigOWith μ (gammaSigma σ) X A) + (hs : 1 ≤ s) + (hE : E ⊆ upperTailEvent X (A * s)) : + μ.real E ≤ Real.exp (-(s ^ σ)) := by + calc + μ.real E ≤ μ.real (upperTailEvent X (A * s)) := by + exact measureReal_mono hE + _ ≤ Real.exp (-(s ^ σ)) := by + simpa [gammaSigma, Real.exp_neg] using hX hs + +omit [MeasurableSpace Ω] in +/-- If the deterministic center and stochastic Γ-scale each fit into half of +the target threshold, then the threshold exceedance is a centered upper-tail +event. -/ +theorem thresholdEvent_subset_centered_upperTail + {H : Ω → ℝ} {A c T s : ℝ} + (hcenter : c ≤ T / 2) + (hscale : A * s ≤ T / 2) : + {ω | T < H ω} ⊆ upperTailEvent (fun ω => H ω - c) (A * s) := by + intro ω hω + have hsum : A * s + c ≤ T := by linarith + have hT_lt : T < H ω := hω + change A * s < H ω - c + linarith + +/-- One-pair bad-event estimate for a discounted observable. The hypothesis +`discount * T ≤ R` says that `T` is a post-discount threshold below the bad +event threshold `R`. -/ +theorem measureReal_discounted_badPair_le_exp_of_isBigOWith_gammaSigma + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : Ω → ℝ} {A c T s σ discount R : ℝ} + (hX : IsBigOWith μ (gammaSigma σ) (fun ω => H ω - c) A) + (hs : 1 ≤ s) + (hdiscount_pos : 0 < discount) + (hthreshold : discount * T ≤ R) + (hcenter : c ≤ T / 2) + (hscale : A * s ≤ T / 2) : + μ.real {ω | R < discount * H ω} ≤ Real.exp (-(s ^ σ)) := by + refine measureReal_le_exp_of_subset_upperTail_gammaSigma + (μ := μ) (X := fun ω => H ω - c) + (E := {ω | R < discount * H ω}) hX hs ?_ + intro ω hω + have hdisc_lt : discount * T < discount * H ω := + lt_of_le_of_lt hthreshold hω + have hT_lt : T < H ω := by + nlinarith + exact thresholdEvent_subset_centered_upperTail + (H := H) (A := A) (c := c) (T := T) (s := s) + hcenter hscale hT_lt + +/-- One-pair bad-event estimate from a symmetric Γ-bound, used for the crude +bottom-scale contribution. -/ +theorem measureReal_discounted_badPair_le_exp_of_isBigO_gammaSigma + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : Ω → ℝ} {A T s σ discount R : ℝ} + (hX : IsBigO μ (gammaSigma σ) H A) + (hs : 1 ≤ s) + (hdiscount_pos : 0 < discount) + (hthreshold : discount * T ≤ R) + (hscale : A * s ≤ T) : + μ.real {ω | R < discount * H ω} ≤ Real.exp (-(s ^ σ)) := by + refine measureReal_le_exp_of_subset_upperTail_gammaSigma + (μ := μ) (X := fun ω => |H ω|) + (E := {ω | R < discount * H ω}) hX hs ?_ + intro ω hω + have hdisc_lt : discount * T < discount * H ω := + lt_of_le_of_lt hthreshold hω + have hT_lt : T < H ω := by + nlinarith + change A * s < |H ω| + exact lt_of_le_of_lt hscale (lt_of_lt_of_le hT_lt (le_abs_self (H ω))) + +/-- The fixed-pair component of `badScaleEvent`. -/ +def badPairEvent {Ω : Type*} + (H : ℕ → ℕ → Ω → ℝ) (t α : ℝ) (N m n : ℕ) : Set Ω := + {ω | n < m ∧ N ≤ m ∧ + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω > + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ))} + +/-- The bad event used in the quantitative minimal-scale theorem: at scale +`N`, some larger pair `(m,n)` violates the discounted algebraic estimate. -/ +def badScaleEvent {Ω : Type*} + (H : ℕ → ℕ → Ω → ℝ) (t α : ℝ) (N : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, n < m ∧ N ≤ m ∧ + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω > + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ))} + +omit [MeasurableSpace Ω] in +theorem badScaleEvent_eq_iUnion_badPairEvent + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {N : ℕ} : + badScaleEvent H t α N = + ⋃ p : ℕ × ℕ, badPairEvent H t α N p.1 p.2 := by + ext ω + simp [badScaleEvent, badPairEvent, Prod.exists] + +/-- Localized first-quenched estimate for the concrete finite-probe envelope. + +The only change from `localizedFirstQuenchedEstimate_normalizedProbeJMax` is +the deterministic multiplication by the dimension-only envelope constant. -/ +theorem localizedFirstQuenchedEstimate_quenchedProbeEnvelope + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry α : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < α ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {ℓ n m : ℕ}, ℓ < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + IsBigOWith P (gammaSigma (min σ 2)) + (fun a => + quenchedProbeEnvelope hP hStruct (N0 + m) (N0 + n) a - + quenchedProbeEnvelopeConst d * + Real.rpow (3 : ℝ) (-α * (ℓ : ℝ))) + (quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ))))) := by + obtain ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, hprobe⟩ := + localizedFirstQuenchedEstimate_normalizedProbeJMax + (d := d) hσ_pos params + refine ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams ℓ n m hℓn hnm + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let r : ℝ := Real.rpow (3 : ℝ) (-α * (ℓ : ℝ)) + let A : ℝ := + ((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ))) + have htail : + IsBigOWith P (gammaSigma (min σ 2)) + (fun a => + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) a - r) + A := by + simpa [N0, D, S, r, A] using + hprobe hP hStruct hΓ hσ_eq hparams hℓn hnm + have hmul := + IsBigOWith.const_mul + (μ := P) (Ψ := gammaSigma (min σ 2)) + (X := fun a => + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) a - r) + (A := A) (c := K) + (by simpa [K] using quenchedProbeEnvelopeConst_nonneg d) htail + simpa [quenchedProbeEnvelope, K, N0, D, S, r, A, mul_sub] using hmul + +/-- Crude Γσ estimate for the concrete finite-probe envelope. -/ +theorem isBigO_quenchedProbeEnvelope + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {m n : ℕ}, n < m → + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + IsBigO P (gammaSigma σ) + (quenchedProbeEnvelope hP hStruct m n) + (quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))))) := by + obtain ⟨C, hC, hprobe⟩ := + isBigO_localizedNormalizedProbeJMax (d := d) hσ_pos params + refine ⟨C, hC, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams m n hnm + let K : ℝ := quenchedProbeEnvelopeConst d + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + ((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) + have htail : + IsBigO P (gammaSigma σ) + (localizedNormalizedProbeJMax hP hStruct m n) A := by + simpa [D, S, A] using + hprobe hP hStruct hΓ hσ_eq hparams hnm + have hmul := + IsBigO.const_mul + (μ := P) (Ψ := gammaSigma σ) + (X := localizedNormalizedProbeJMax hP hStruct m n) + (A := A) (c := K) + (by simpa [K] using quenchedProbeEnvelopeConst_nonneg d) htail + simpa [quenchedProbeEnvelope, K, D, S, A] using! hmul + +/-- Fixed-pair high-scale bad-event estimate, after shifting the deterministic +entry scale to zero. The three threshold hypotheses are deterministic and are +where the later interpolation choice of `ℓ` is used. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n ℓ : ℕ} {s T : ℝ}, ℓ < n → n < m → q ≤ m → 1 ≤ s → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let c : ℝ := + quenchedProbeEnvelopeConst d * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + let discount : ℝ := (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) + let R : ℝ := (3 : ℝ) ^ (-αbad * ((m - q : ℕ) : ℝ)) + discount * T ≤ R → + c ≤ T / 2 → + A * s ≤ T / 2 → + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-(s ^ (min σ 2))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hfirst⟩ := + localizedFirstQuenchedEstimate_quenchedProbeEnvelope + (d := d) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n ℓ s T hℓn hnm hqm hs + dsimp only + intro hthreshold hcenter hscale + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let c : ℝ := + quenchedProbeEnvelopeConst d * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + let discount : ℝ := (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) + let R : ℝ := (3 : ℝ) ^ (-αbad * ((m - q : ℕ) : ℝ)) + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + have htail : + IsBigOWith P (gammaSigma (min σ 2)) + (fun aω => Hshift m n aω - c) A := by + simpa [Hshift, N0, D, S, A, c] using + hfirst hP hStruct hΓ hσ_eq hparams hℓn hnm + have hdisc_pos : 0 < discount := by + dsimp [discount] + positivity + have hbad : + P.real {aω | R < discount * Hshift m n aω} ≤ + Real.exp (-(s ^ (min σ 2))) := by + exact + measureReal_discounted_badPair_le_exp_of_isBigOWith_gammaSigma + (μ := P) (H := Hshift m n) (A := A) (c := c) (T := T) + (s := s) (σ := min σ 2) (discount := discount) (R := R) + htail hs hdisc_pos hthreshold hcenter hscale + have hsubset : + badPairEvent Hshift t αbad q m n ⊆ + {aω | R < discount * Hshift m n aω} := by + intro aω haω + exact haω.2.2 + exact (measureReal_mono (μ := P) hsubset).trans hbad + +/-- Fixed-pair crude bad-event estimate for the concrete envelope. -/ +theorem measureReal_crude_badPairEvent_quenchedProbeEnvelope_le_exp + {d : ℕ} [NeZero d] {σ t αbad : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {N m n : ℕ} {s T : ℝ}, n < m → N ≤ m → 1 ≤ s → + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)))) + let discount : ℝ := (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) + let R : ℝ := (3 : ℝ) ^ (-αbad * ((m - N : ℕ) : ℝ)) + discount * T ≤ R → + A * s ≤ T → + P.real + (badPairEvent (quenchedProbeEnvelope hP hStruct) t αbad N m n) ≤ + Real.exp (-(s ^ σ)) := by + obtain ⟨C, hC, hcrude⟩ := + isBigO_quenchedProbeEnvelope (d := d) hσ_pos params + refine ⟨C, hC, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams N m n s T hnm hNm hs + dsimp only + intro hthreshold hscale + let : IsProbabilityMeasure P := hP.isProbability + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + quenchedProbeEnvelopeConst d * + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)))) + let discount : ℝ := (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) + let R : ℝ := (3 : ℝ) ^ (-αbad * ((m - N : ℕ) : ℝ)) + have htail : + IsBigO P (gammaSigma σ) + (quenchedProbeEnvelope hP hStruct m n) A := by + simpa [D, S, A] using + hcrude hP hStruct hΓ hσ_eq hparams hnm + have hdisc_pos : 0 < discount := by + dsimp [discount] + positivity + have hbad : + P.real {aω | R < discount * quenchedProbeEnvelope hP hStruct m n aω} ≤ + Real.exp (-(s ^ σ)) := by + exact + measureReal_discounted_badPair_le_exp_of_isBigO_gammaSigma + (μ := P) (H := quenchedProbeEnvelope hP hStruct m n) + (A := A) (T := T) (s := s) (σ := σ) + (discount := discount) (R := R) + htail hs hdisc_pos hthreshold hscale + have hsubset : + badPairEvent (quenchedProbeEnvelope hP hStruct) t αbad N m n ⊆ + {aω | R < discount * quenchedProbeEnvelope hP hStruct m n aω} := by + intro aω haω + exact haω.2.2 + exact (measureReal_mono (μ := P) hsubset).trans hbad + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairNoLog.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairNoLog.lean new file mode 100644 index 0000000000..52d0bcb004 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairNoLog.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMaxTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds + +/-! # Bad Pair No Log -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# No-log fixed bad-pair probability bounds + +This file restarts the bad-scale tail proof after removing the exponent-loss +route. The estimates here keep finite maxima as probability prefactors instead +of putting logarithmic factors into the stochastic scale. +-/ + +noncomputable section + +/-- High-range fixed bad-pair estimate with explicit finite-union prefactors +and no logarithmic scale inflation. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, htail⟩ := + measureReal_localizedFirstQuenchedEstimate_normalizedProbeJMax_tail_noLog + (d := d) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro helln hnm hqm hlam + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let b : ℝ := (d : ℝ) / 2 + let center : ℝ := Real.rpow (3 : ℝ) (-a * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos + (mul_pos hCfluct (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _)) + (pow_pos hΓ.thetaHat_pos 2) + have hT_pos : 0 < T := by + dsimp [T] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hcenterK : + K * center ≤ (1 / 2 : ℝ) * T := by + simpa [K, x, ell, center, T] using + prefactor_rpow_three_neg_le_half_rpow_of_natCeil_log_gap + (K := K) (a := a) (x := x) ha + have hsubset : + badPairEvent Hshift t αbad q m n ⊆ + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} := by + intro aω hbad + rcases hbad with ⟨_hnm_bad, _hqm_bad, hbad_val⟩ + have hdisc_pos : + 0 < Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hthreshold : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T = + Real.rpow (3 : ℝ) (-αbad * ((m - q : ℕ) : ℝ)) := by + simpa [T, x] using + rpow_three_discount_mul_postThreshold + (t := t) (α := αbad) (m := m) (n := n) (N := q) + have hT_lt_H : T < Hshift m n aω := by + have hdisc_lt : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T < + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Hshift m n aω := by + rw [hthreshold] + exact hbad_val + nlinarith [hdisc_lt, hdisc_pos] + have hT_div_lt : + T / K < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + have hK_mul : + T < K * + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + simpa [Hshift, quenchedProbeEnvelope, K] using hT_lt_H + exact (div_lt_iff₀ hK_pos).2 (by simpa [mul_comm] using hK_mul) + have hcenter_le : center ≤ T / (2 * K) := by + have hmul : center * (2 * K) ≤ T := by + nlinarith [hcenterK] + exact (le_div_iff₀ (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos)).2 hmul + have hscale_lam : scale * lam = T / (2 * K) := by + dsimp [lam] + field_simp [hscale_pos.ne'] + have hsum_le : center + scale * lam ≤ T / K := by + rw [hscale_lam] + calc + center + T / (2 * K) ≤ T / (2 * K) + T / (2 * K) := by + nlinarith [hcenter_le] + _ = T / K := by + field_simp [hK_pos.ne'] + ring + exact lt_of_le_of_lt hsum_le hT_div_lt + have htail_bound : + P.real + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + simpa [N0, D, S, tau, b, center, scale] using + htail hP hStruct hΓ hσ_eq hparams + (ell := ell) (n := n) (m := m) (lam := lam) + hlam helln hnm + exact (measureReal_mono (μ := P) hsubset).trans htail_bound + +/-- Uniform-in-`σ` version of +`measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog`. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + obtain ⟨Centry, a, hCentry, ha, htailBase⟩ := + measureReal_localizedFirstQuenchedEstimate_normalizedProbeJMax_tail_noLog_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, hCfluct, htail⟩ := htailBase hσ_pos + refine ⟨Cfluct, hCfluct, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro helln hnm hqm hlam + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let b : ℝ := (d : ℝ) / 2 + let center : ℝ := Real.rpow (3 : ℝ) (-a * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos + (mul_pos hCfluct (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _)) + (pow_pos hΓ.thetaHat_pos 2) + have hT_pos : 0 < T := by + dsimp [T] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hcenterK : + K * center ≤ (1 / 2 : ℝ) * T := by + simpa [K, x, ell, center, T] using + prefactor_rpow_three_neg_le_half_rpow_of_natCeil_log_gap + (K := K) (a := a) (x := x) ha + have hsubset : + badPairEvent Hshift t αbad q m n ⊆ + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} := by + intro aω hbad + rcases hbad with ⟨_hnm_bad, _hqm_bad, hbad_val⟩ + have hdisc_pos : + 0 < Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hthreshold : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T = + Real.rpow (3 : ℝ) (-αbad * ((m - q : ℕ) : ℝ)) := by + simpa [T, x] using + rpow_three_discount_mul_postThreshold + (t := t) (α := αbad) (m := m) (n := n) (N := q) + have hT_lt_H : T < Hshift m n aω := by + have hdisc_lt : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T < + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Hshift m n aω := by + rw [hthreshold] + exact hbad_val + nlinarith [hdisc_lt, hdisc_pos] + have hT_div_lt : + T / K < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + have hK_mul : + T < K * + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + simpa [Hshift, quenchedProbeEnvelope, K] using hT_lt_H + exact (div_lt_iff₀ hK_pos).2 (by simpa [mul_comm] using hK_mul) + have hcenter_le : center ≤ T / (2 * K) := by + have hmul : center * (2 * K) ≤ T := by + nlinarith [hcenterK] + exact (le_div_iff₀ (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos)).2 hmul + have hscale_lam : scale * lam = T / (2 * K) := by + dsimp [lam] + field_simp [hscale_pos.ne'] + have hsum_le : center + scale * lam ≤ T / K := by + rw [hscale_lam] + calc + center + T / (2 * K) ≤ T / (2 * K) + T / (2 * K) := by + nlinarith [hcenter_le] + _ = T / K := by + field_simp [hK_pos.ne'] + ring + exact lt_of_le_of_lt hsum_le hT_div_lt + have htail_bound : + P.real + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + simpa [N0, D, S, tau, b, center, scale] using + htail hP hStruct hΓ hσ_eq hparams + (ell := ell) (n := n) (m := m) (lam := lam) + hlam helln hnm + exact (measureReal_mono (μ := P) hsubset).trans htail_bound + +/-- Crude fixed bad-pair estimate with explicit finite-union prefactors and +no logarithmic scale inflation. -/ +theorem measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let scale : ℝ := K * (C * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + obtain ⟨C, hC, horigin⟩ := + isBigO_limitNormalizedBlockJObservable_originCube_of_scaleZero + (d := d) hσ_pos params + refine ⟨C, hC, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams N0 q m n + dsimp only + intro hnm hqm hlam + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := C * hΓ.thetaHat ^ (2 : ℕ) + let scale : ℝ := K * A + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hA_pos : 0 < A := by + dsimp [A] + exact mul_pos hC (pow_pos hΓ.thetaHat_pos 2) + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos hK_pos hA_pos + have hOrigin : + ∀ i : NormalizedProbeIndex d, + IsBigO P (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct + (originCube d (((N0 + n : ℕ) : ℤ))) (normalizedProbeVec i)) A := by + intro i + simpa [A] using + horigin hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) + (normalizedProbeVec_abs_apply_le_one i) + (n := N0 + n) + have htail_bound : + P.real + {aω | A * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + simpa [D, S, A] using + measureReal_localizedNormalizedProbeJMax_tail_le_card_mul_card_mul_exp_of_isBigO + hP hStruct hStruct.stationary + (σ := σ) (A := A) (lam := lam) + hlam (m := N0 + m) (n := N0 + n) + (Nat.add_lt_add_left hnm N0) hOrigin + have hsubset : + badPairEvent Hshift t αbad q m n ⊆ + {aω | A * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} := by + intro aω hbad + rcases hbad with ⟨_hnm_bad, _hqm_bad, hbad_val⟩ + have hdisc_pos : + 0 < Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hthreshold : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T = + Real.rpow (3 : ℝ) (-αbad * ((m - q : ℕ) : ℝ)) := by + simpa [T, x] using + rpow_three_discount_mul_postThreshold + (t := t) (α := αbad) (m := m) (n := n) (N := q) + have hT_lt_H : T < Hshift m n aω := by + have hdisc_lt : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T < + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Hshift m n aω := by + rw [hthreshold] + exact hbad_val + nlinarith [hdisc_lt, hdisc_pos] + have hT_div_lt : + T / K < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + have hK_mul : + T < K * + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + simpa [Hshift, quenchedProbeEnvelope, K] using hT_lt_H + exact (div_lt_iff₀ hK_pos).2 (by simpa [mul_comm] using hK_mul) + have hA_lam : A * lam = T / K := by + dsimp [lam, scale] + field_simp [hK_pos.ne', hA_pos.ne'] + simpa [hA_lam] using hT_div_lt + exact (measureReal_mono (μ := P) hsubset).trans htail_bound + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairSelection.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairSelection.lean new file mode 100644 index 0000000000..97c2585eec --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadPairSelection.lean @@ -0,0 +1,560 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry + +/-! # Bad Pair Selection -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Selecting the intermediate scale in high bad-pair estimates + +This file combines the deterministic ceiling choice for `ℓ` with the +fixed-pair high-scale probability estimate. +-/ + +noncomputable section + +theorem three_mul_log_descendantsAtScale_originCube_nat_card_pos + {d : ℕ} [NeZero d] {m n : ℕ} (hnm : n < m) : + 0 < + 3 * + Real.log + (((descendantsAtScale (originCube d ((m : ℕ) : ℤ)) + ((n : ℕ) : ℤ)).card : ℝ)) := by + have hcard_two : + 2 ≤ + (descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)).card := + descendantsAtScale_originCube_nat_card_two_le (d := d) hnm + have hlog_pos : + 0 < + Real.log + (((descendantsAtScale (originCube d ((m : ℕ) : ℤ)) + ((n : ℕ) : ℤ)).card : ℝ)) := by + exact Real.log_pos (by exact_mod_cast hcard_two) + positivity + +theorem shiftedHighBadPairFluctuationScale_pos + {d : ℕ} [NeZero d] {σ Cfluct : ℝ} + (hσ_pos : 0 < σ) (hCfluct : 0 < Cfluct) + {P : Ch04.RestrictionCoeffLaw d} + {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {N0 m n ℓ : ℕ} (hnm : n < m) : + 0 < + quenchedProbeEnvelopeConst d * + (((3 * + Real.log + (((Finset.univ : Finset (NormalizedProbeIndex d)).card : ℝ))) ^ + (min σ 2)⁻¹) * + (((3 * + Real.log + (((descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ))).card : ℝ))) ^ + (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) := by + have hτ_pos : 0 < min σ 2 := + lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hK_pos : 0 < quenchedProbeEnvelopeConst d := + quenchedProbeEnvelopeConst_pos d + have hS_base : + 0 < + 3 * + Real.log + (((Finset.univ : Finset (NormalizedProbeIndex d)).card : ℝ)) := + three_mul_log_normalizedProbeIndex_univ_card_pos (d := d) + have hD_base : + 0 < + 3 * + Real.log + (((descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ))).card : ℝ)) := by + exact + three_mul_log_descendantsAtScale_originCube_nat_card_pos + (d := d) (m := N0 + m) (n := N0 + n) + (Nat.add_lt_add_left hnm N0) + have hS_pow : + 0 < + (3 * + Real.log + (((Finset.univ : Finset (NormalizedProbeIndex d)).card : ℝ))) ^ + (min σ 2)⁻¹ := + Real.rpow_pos_of_pos hS_base _ + have hD_pow : + 0 < + (3 * + Real.log + (((descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ))).card : ℝ))) ^ + (min σ 2)⁻¹ := + Real.rpow_pos_of_pos hD_base _ + have htriad : + 0 < + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) := by + positivity + have htheta_sq : 0 < hΓ.thetaHat ^ (2 : ℕ) := by + exact pow_pos hΓ.thetaHat_pos 2 + exact + mul_pos hK_pos + (mul_pos hS_pow + (mul_pos hD_pow + (mul_pos (mul_pos hCfluct htriad) htheta_sq))) + +/-- High-scale fixed-pair estimate with the deterministic intermediate scale +chosen by a logarithmic ceiling. The remaining hypothesis is the genuinely +stochastic threshold-size condition for the fluctuation scale. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ} {s : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + ℓ < n → n < m → q ≤ m → 1 ≤ s → A * s ≤ T / 2 → + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-(s ^ (min σ 2))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n s + dsimp only + intro hℓn hnm hqm hs hscale + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let discount : ℝ := (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) + let R : ℝ := (3 : ℝ) ^ (-αbad * ((m - q : ℕ) : ℝ)) + let c : ℝ := K * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + have hℓn' : ℓ < n := by + simpa [K, x, ℓ] using hℓn + have hthreshold : discount * T ≤ R := by + dsimp [discount, T, R, x] + exact le_of_eq + (rpow_three_discount_mul_postThreshold + (t := t) (α := αbad) (m := m) (n := n) (N := q)) + have hcenter : c ≤ T / 2 := by + have h := + prefactor_rpow_three_neg_le_half_rpow_of_natCeil_log_gap + (K := K) (a := a) (x := x) ha + calc + c = K * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) := rfl + _ ≤ (1 / 2 : ℝ) * Real.rpow (3 : ℝ) (-x) := by + simpa [ℓ] using h + _ = T / 2 := by + dsimp [T] + ring + have hscale' : A * s ≤ T / 2 := by + simpa [K, x, ℓ, N0, D, S, A, T] using hscale + simpa [K, x, ℓ, N0, D, S, A, T, discount, R, c] using + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) (ℓ := ℓ) (s := s) (T := T) + hℓn' hnm hqm hs hthreshold hcenter hscale' + +/-- High-scale fixed-pair estimate after choosing the tail parameter +`s = T / (2A)`, where `A` is the fluctuation scale and `T` is the +post-discount threshold. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil_ratio + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + ℓ < n → n < m → q ≤ m → 1 ≤ T / (2 * A) → + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-((T / (2 * A)) ^ (min σ 2))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hℓn hnm hqm hratio + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + have hA_pos : 0 < A := by + simpa [K, x, ℓ, N0, D, S, A, T] using + shiftedHighBadPairFluctuationScale_pos + (d := d) (σ := σ) (Cfluct := Cfluct) + hσ_pos hCfluct hΓ (N0 := N0) (m := m) (n := n) (ℓ := ℓ) hnm + have hscale : A * (T / (2 * A)) ≤ T / 2 := by + have heq : A * (T / (2 * A)) = T / 2 := by + field_simp [hA_pos.ne'] + exact le_of_eq heq + simpa [K, x, ℓ, N0, D, S, A, T] using + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) (s := T / (2 * A)) + hℓn hnm hqm hratio hscale + +/-- The selected-ratio high-pair estimate with the shifted scale difference +simplified to the manuscript form `n - ℓ`. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil_ratio_natScale + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + ℓ < n → n < m → q ≤ m → 1 ≤ T / (2 * A) → + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-((T / (2 * A)) ^ (min σ 2))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil_ratio + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hℓn hnm hqm hratio + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let Araw : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + have hAraw_eq : Araw = A := by + have hℓ_le_n : ℓ ≤ n := le_of_lt hℓn + have hdiff : + Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) = n - ℓ := + int_toNat_nat_add_sub_nat_add_of_le hℓ_le_n + have hdiff' : + Int.toNat + (((N0 : ℤ) + (n : ℤ)) - ((N0 : ℤ) + (ℓ : ℤ))) = n - ℓ := by + change + Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) = n - ℓ + exact hdiff + dsimp [Araw, A] + rw [hdiff'] + have hratio_raw : 1 ≤ T / (2 * Araw) := by + have hratio_A : 1 ≤ T / (2 * A) := by + simpa [K, x, ℓ, N0, D, S, A, T] using hratio + simpa [hAraw_eq] using hratio_A + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbound := + hraw hℓn hnm hqm hratio_raw + simpa [K, x, ℓ, N0, D, S, A, Araw, T, hAraw_eq] using hbound + +/-- High-pair estimate fed by any deterministic lower bound on the selected +tail parameter. -/ +theorem measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil_natScale_of_le_ratio + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ} {B : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + ℓ < n → n < m → q ≤ m → 1 ≤ B → B ≤ T / (2 * A) → + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-(B ^ (min σ 2))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_exp_of_natCeil_ratio_natScale + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n B + dsimp only + intro hℓn hnm hqm hB_one hB_le + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let A : ℝ := + K * + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + have hratio : 1 ≤ T / (2 * A) := hB_one.trans hB_le + have hprob : + P.real + (badPairEvent + (fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω) + t αbad q m n) ≤ + Real.exp (-((T / (2 * A)) ^ (min σ 2))) := by + simpa [K, x, ℓ, N0, D, S, A, T] using + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + hℓn hnm hqm hratio + have hτ_nonneg : 0 ≤ min σ 2 := + (lt_min hσ_pos (by norm_num : (0 : ℝ) < 2)).le + have hB_nonneg : 0 ≤ B := zero_le_one.trans hB_one + have hratio_nonneg : 0 ≤ T / (2 * A) := hB_nonneg.trans hB_le + have hpow_le : + B ^ (min σ 2) ≤ (T / (2 * A)) ^ (min σ 2) := + Real.rpow_le_rpow hB_nonneg hB_le hτ_nonneg + have hexp : + Real.exp (-((T / (2 * A)) ^ (min σ 2))) ≤ + Real.exp (-(B ^ (min σ 2))) := by + exact Real.exp_le_exp.mpr (by linarith) + exact hprob.trans hexp + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsBottom.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsBottom.lean new file mode 100644 index 0000000000..50af62cdea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsBottom.lean @@ -0,0 +1,819 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentRows +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop + +/-! # Bad Scale Component Bounds Bottom -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Bottom component bad-scale bounds + +This file builds the concrete bottom row estimates used by the weighted +component summation lemmas. +-/ + +noncomputable section + +private theorem rpow_three_mul_rpow_pow_nat_eq + {x y : ℝ} {r : ℕ} : + (3 : ℝ) ^ x * ((3 : ℝ) ^ y) ^ r = + (3 : ℝ) ^ (x + y * (r : ℝ)) := by + have hpow : + ((3 : ℝ) ^ y) ^ r = (3 : ℝ) ^ (y * (r : ℝ)) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + rw [hpow] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + +/-- Deterministic lower bound on the high-bottom tail parameter. -/ +theorem highBottom_lam_lower + {d : ℕ} [NeZero d] + {K Cfluct θ a t α : ℝ} {q r : ℕ} {j : Fin (q + 1)} + (hK : 0 < K) (hCfluct : 0 < Cfluct) (hθ : 0 < θ) + (ha : 0 < a) (ht : 0 < t) + (hαt : α < t) (hαb : α < (d : ℝ) / 2) + (hαharm : α * (1 + ((d : ℝ) / 2) / a) < (d : ℝ) / 2) : + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))))) + let scale : ℝ := + Cfluct * (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ℓ : ℕ) : ℝ)) * + θ ^ (2 : ℕ) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / (2 * K * scale) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + ℓ < n → n < m → A * ρ ^ r ≤ lam := by + intro m n x ℓ b L c scale T lam A ρ hℓn hnm + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hnm_le : n ≤ m := le_of_lt hnm + have hceil : + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + have hℓ_eq : ℓ = selectedBadPairScale K a t α q m n := by + dsimp [ℓ, selectedBadPairScale, x] + rw [hℓ_eq] + simpa [L, x] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hexp_comp : + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := by + have hraw := + highNatScaleExponent_lower_bound_of_ceil_any_q + (a := a) (b := b) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) (ℓ := ℓ) + ha hb_pos ht hαt hαb hαharm hL_nonneg + (le_of_lt hℓn) hqm hnm_le + (by simpa [x] using hceil) + simpa [x, c] using hraw + have hden_pos : 0 < 2 * K * Cfluct * θ ^ (2 : ℕ) := by + exact mul_pos + (mul_pos (mul_pos (by norm_num : (0 : ℝ) < 2) hK) hCfluct) + (pow_pos hθ 2) + have hlam_eq : + lam = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + let decay : ℝ := + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ℓ : ℕ) : ℝ)) + have hdecay_pos : 0 < decay := by + dsimp [decay] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hquot : + (3 : ℝ) ^ (-x) / decay = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) := by + dsimp [decay, b] + rw [div_eq_mul_inv] + rw [← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring_nf + dsimp [lam, T, scale] + change + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + calc + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) + = + ((3 : ℝ) ^ (-x) / decay) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + field_simp [hK.ne', hCfluct.ne', hθ.ne', hdecay_pos.ne'] + _ = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + rw [hquot] + have hpow_base : + (3 : ℝ) ^ (c * ((q : ℝ) + (r : ℝ)) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + = + A * ρ ^ r := by + dsimp [A, ρ] + have hrpow := + rpow_three_mul_rpow_pow_nat_eq + (x := c * (q : ℝ) - b * (L + 1)) + (y := c) (r := r) + calc + (3 : ℝ) ^ (c * ((q : ℝ) + (r : ℝ)) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + = + ((3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) * + ((3 : ℝ) ^ c) ^ r) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + rw [hrpow] + congr 1 + ring_nf + _ = + ((3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ))) * + ((3 : ℝ) ^ c) ^ r := by + field_simp [hden_pos.ne'] + rw [hlam_eq] + rw [← hpow_base] + have hmr : ((m - q : ℕ) : ℝ) = (r : ℝ) := by + dsimp [m] + rw [Nat.add_sub_cancel_left] + have hpow_le : + (3 : ℝ) ^ (c * ((q : ℝ) + (r : ℝ)) - b * (L + 1)) ≤ + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) := by + exact + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) + (by + have hcomp := hexp_comp + rw [hmr] at hcomp + linarith) + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + +/-- Deterministic lower bound on the crude-bottom tail parameter. The +condition `n ≤ ℓ` is the complementary high-scale condition; together with +`n ≤ q` it bounds `n` by the logarithmic offset, so the discount supplies the +full `t q` gain. -/ +theorem crudeBottom_lam_lower + {d : ℕ} [NeZero d] + {K C θ a t α : ℝ} {q r : ℕ} {j : Fin (q + 1)} + (hK : 0 < K) (hC : 0 < C) (hθ : 0 < θ) + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) : + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let scale : ℝ := K * (C * θ ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * C * θ ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - α) + n ≤ ℓ → n < m → A * ρ ^ r ≤ lam := by + intro m n x ℓ L scale T lam A ρ hnℓ hnm + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hnq : n ≤ q := by + dsimp [n] + exact Nat.sub_le q j.val + have hceil : + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + have hℓ_eq : ℓ = selectedBadPairScale K a t α q m n := by + dsimp [ℓ, selectedBadPairScale, x] + rw [hℓ_eq] + simpa [L, x] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hn_bound : (n : ℝ) ≤ L + 1 := by + exact + n_le_logOffset_add_one_of_not_high_n_le_q + (a := a) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) (ℓ := ℓ) + ha ht hαt (by simpa [x] using hceil) hnℓ hnq hqm + have hj_le_q : j.val ≤ q := Nat.le_of_lt_succ j.isLt + have hmq : m - q = r := by + dsimp [m] + exact Nat.add_sub_cancel_left q r + have hmn : m - n = r + j.val := by + dsimp [m, n] + omega + have hq_decomp : + (q : ℝ) = (n : ℝ) + (j.val : ℝ) := by + have hnat : n + j.val = q := by + dsimp [n] + exact Nat.sub_add_cancel hj_le_q + exact_mod_cast hnat.symm + have hx_neg_eq : + -x = (t - α) * (r : ℝ) + t * (j.val : ℝ) := by + dsimp [x] + rw [hmq, hmn] + norm_num [Nat.cast_add] + ring + have hj_gain : + t * (q : ℝ) - t * (L + 1) ≤ t * (j.val : ℝ) := by + rw [hq_decomp] + have hn_mul : t * (n : ℝ) ≤ t * (L + 1) := + mul_le_mul_of_nonneg_left hn_bound ht.le + calc + t * ((n : ℝ) + (j.val : ℝ)) - t * (L + 1) = + t * (j.val : ℝ) + (t * (n : ℝ) - t * (L + 1)) := by ring + _ ≤ t * (j.val : ℝ) + 0 := + add_le_add le_rfl (sub_nonpos.mpr hn_mul) + _ = t * (j.val : ℝ) := by ring + have hexp_lower : + t * (q : ℝ) - t * (L + 1) + (t - α) * (r : ℝ) ≤ -x := by + rw [hx_neg_eq] + calc + t * (q : ℝ) - t * (L + 1) + (t - α) * (r : ℝ) + ≤ t * (j.val : ℝ) + (t - α) * (r : ℝ) := + add_le_add hj_gain le_rfl + _ = (t - α) * (r : ℝ) + t * (j.val : ℝ) := by ring + have hden_pos : 0 < K * C * θ ^ (2 : ℕ) := by + exact mul_pos (mul_pos hK hC) (pow_pos hθ 2) + have hlam_eq : + lam = (3 : ℝ) ^ (-x) / (K * C * θ ^ (2 : ℕ)) := by + dsimp [lam, T, scale] + ring + have hpow_base : + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1) + (t - α) * (r : ℝ)) / + (K * C * θ ^ (2 : ℕ)) + = + A * ρ ^ r := by + dsimp [A, ρ] + have hrpow := + rpow_three_mul_rpow_pow_nat_eq + (x := t * (q : ℝ) - t * (L + 1)) + (y := t - α) (r := r) + calc + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1) + (t - α) * (r : ℝ)) / + (K * C * θ ^ (2 : ℕ)) + = + ((3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) * + ((3 : ℝ) ^ (t - α)) ^ r) / + (K * C * θ ^ (2 : ℕ)) := by + rw [hrpow] + _ = + ((3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * C * θ ^ (2 : ℕ))) * + ((3 : ℝ) ^ (t - α)) ^ r := by + field_simp [hden_pos.ne'] + rw [hlam_eq, ← hpow_base] + have hpow_le : + (3 : ℝ) ^ + (t * (q : ℝ) - t * (L + 1) + (t - α) * (r : ℝ)) ≤ + (3 : ℝ) ^ (-x) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_lower + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + +/-- Concrete high-bottom row estimate from a fixed high-pair tail bound. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_of_badPair_bound + {d : ℕ} [NeZero d] {σ Cfluct Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (_hCentry : 0 < Centry) (ha : 0 < a) + (hpair : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + intro t αbad P hP hStruct hΓ hσ_eq hparams q r j K N0 Hshift S b L c τ w A ρ m n + ht_pos hαt hαb hαharm hA_one + let : IsProbabilityMeasure P := hP.isProbability + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / (2 * K * scale) + have hA_one_local : 1 ≤ A := by + exact hA_one + have hτ_pos : 0 < τ := by + dsimp [τ] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hc_pos : 0 < c := by + dsimp [c] + have hta : 0 < t - αbad := sub_pos.mpr hαt + have hba : 0 < b - αbad := sub_pos.mpr hαb + have hone_ba : 0 < 1 + b / a := by positivity + have hprod : 0 < (t - αbad) * (1 + b / a) := + mul_pos hta hone_ba + have hharm : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_pos : 0 < ρ := by + dsimp [ρ] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hρ_gt : 1 < ρ := by + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ c := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + have hA_nonneg : 0 ≤ A := by linarith [hA_one_local] + have hAρ_nonneg : 0 ≤ A * ρ ^ r := + mul_nonneg hA_nonneg (pow_nonneg hρ_pos.le r) + have htail_nonneg : + 0 ≤ ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + exact mul_nonneg + (mul_nonneg hS_nonneg (pow_nonneg hw_pos.le q)) + (mul_nonneg (pow_nonneg hw_pos.le r) (Real.exp_pos _).le) + by_cases hhigh : selectedBadPairScale K a t αbad q m n < n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hℓn : ℓ < n := by + simpa [hℓ_eq] using hhigh + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + highBottom_lam_lower + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCfluct hΓ.thetaHat_pos ha ht_pos hαt hαb hαharm + hℓn hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + simpa using + mul_le_mul hA_one_local hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ τ))) := by + exact hraw hℓn hnm hqm hlam_one + have hD : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + exact + measureReal_highBottomPairEvent_le_weighted_row_of_badPair_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + (r := r) (S := (S.card : ℝ)) (D := (D.card : ℝ)) + (A := A) (ρ := ρ) (τ := τ) (lam := lam) (w := w) + hS_nonneg hw_pos.le hD hAρ_nonneg hlam_lower hτ_pos hbad + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hhigh] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Concrete high-bottom row estimate. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + exact + ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_of_badPair_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hpair⟩ + +/-- Concrete high-bottom component estimate obtained by summing a fixed +weighted row estimate. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_row_bound + {d : ℕ} [NeZero d] {σ Cfluct Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (_hCfluct : 0 < Cfluct) (_hCentry : 0 < Centry) (_ha : 0 < a) + (hrow : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ)))) : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ τ)) * + weightedGeometricExpKernelConst w (ρ ^ τ)) := by + intro t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht_pos hαt hαb hαharm hA_one + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + have hτ_pos : 0 < τ := by + dsimp [τ] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hc_pos : 0 < c := by + dsimp [c] + have hta : 0 < t - αbad := sub_pos.mpr hαt + have hba : 0 < b - αbad := sub_pos.mpr hαb + have hone_ba : 0 < 1 + b / a := by positivity + have hprod : 0 < (t - αbad) * (1 + b / a) := + mul_pos hta hone_ba + have hharm : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + positivity + have hρ_gt : 1 < ρ := by + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ c := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hC_nonneg : 0 ≤ (S.card : ℝ) * w ^ q := by + positivity + have hA_one_local : 1 ≤ A := by + exact hA_one + exact + measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := τ) + (C := (S.card : ℝ) * w ^ q) (w := w) + hC_nonneg hw_pos hA_one_local hρ_gt hτ_pos + (by + intro r j + have hrow_inst := + hrow (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (r := r) (j := j) + ht_pos hαt hαb hαharm hA_one_local + exact hrow_inst) + +/-- Concrete high-bottom component estimate obtained by summing the weighted +row estimate. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min t + (min b + (min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))))) + let τ : ℝ := min σ 2 + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (c * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ τ)) * + weightedGeometricExpKernelConst w (ρ ^ τ)) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hrow⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + (d := d) (σ := σ) hσ_pos params + exact + ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, + measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_row_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hrow⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsCrudeBottom.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsCrudeBottom.lean new file mode 100644 index 0000000000..61c966d0a2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsCrudeBottom.lean @@ -0,0 +1,294 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsBottom + +/-! # Bad Scale Component Bounds Crude Bottom -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# The crude-bottom bad-scale component + +This file proves the concrete crude-bottom row estimate and feeds it into the +weighted constant-row summation lemma. The finite maxima remain as explicit +cardinality prefactors. +-/ + +noncomputable section + +/-- Concrete crude-bottom row estimate. -/ +theorem measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ + ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + obtain ⟨Ccrude, hCcrude, hpair⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hΓ hσ_eq hparams q r j + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hρ_pos : 0 < ρ := by + dsimp [ρ] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + have hA_nonneg : 0 ≤ A := by linarith + have hAρ_nonneg : 0 ≤ A * ρ ^ r := + mul_nonneg hA_nonneg (pow_nonneg hρ_pos.le r) + have htail_nonneg : + 0 ≤ ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + exact mul_nonneg + (mul_nonneg hS_nonneg (pow_nonneg hw_pos.le q)) + (mul_nonneg (pow_nonneg hw_pos.le r) (Real.exp_pos _).le) + by_cases hnℓ_sel : n ≤ selectedBadPairScale K a t αbad q m n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hnℓ : n ≤ ℓ := by + simpa [hℓ_eq] using hnℓ_sel + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + crudeBottom_lam_lower + (d := d) (K := K) (C := Ccrude) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCcrude hΓ.thetaHat_pos ha ht hαt + hnℓ hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul hA_one hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + simpa [K, Hshift, x, D, S, scale, T, lam] using + hraw hnm hqm hlam_one + have hD : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + exact + measureReal_crudeBottomPairEvent_le_weighted_row_of_badPair_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + (r := r) (S := (S.card : ℝ)) (D := (D.card : ℝ)) + (A := A) (ρ := ρ) (σ := σ) (lam := lam) (w := w) + hS_nonneg hw_pos.le hD hAρ_nonneg hlam_lower hσ_pos hbad + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, hnℓ_sel] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Concrete crude-bottom component estimate obtained by summing the weighted +row estimate. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + obtain ⟨Ccrude, hCcrude, hrow⟩ := + measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ha ht hαt hA_one + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hC_nonneg : 0 ≤ (S.card : ℝ) * w ^ q := by + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hA_one_local : 1 ≤ A := by + simpa [A, K, L] using hA_one + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + exact + measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := σ) + (C := (S.card : ℝ) * w ^ q) (w := w) + hC_nonneg hw_pos hA_one_local hρ_gt hσ_pos + (by + intro r j + simpa [K, N0, Hshift, S, L, w, A, ρ] using + hrow (Centry := Centry) (a := a) (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (q := q) (r := r) (j := j) + ha ht hαt hA_one_local) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsHigh.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsHigh.lean new file mode 100644 index 0000000000..5c2e67fafa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsHigh.lean @@ -0,0 +1,484 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop + +/-! # Bad Scale Component Bounds High -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# High component bad-scale bounds + +This file rebuilds the high component estimates along the no-loss route. The +finite descendant multiplicity is kept as a probability-level prefactor and is +absorbed by the weighted exponential kernel in the final summation. +-/ + +noncomputable section + +private theorem rpow_three_mul_rpow_pow_nat_eq + {x y : ℝ} {r : ℕ} : + (3 : ℝ) ^ x * ((3 : ℝ) ^ y) ^ r = + (3 : ℝ) ^ (x + y * (r : ℝ)) := by + have hpow : + ((3 : ℝ) ^ y) ^ r = (3 : ℝ) ^ (y * (r : ℝ)) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + rw [hpow] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + +private theorem exp_neg_rpow_le_exp_neg_rpow_of_le + {x y τ : ℝ} (hx : 0 ≤ x) (hxy : x ≤ y) (hτ : 0 < τ) : + Real.exp (-(y ^ τ)) ≤ Real.exp (-(x ^ τ)) := by + have hy : 0 ≤ y := hx.trans hxy + have hpow : x ^ τ ≤ y ^ τ := + Real.rpow_le_rpow hx hxy hτ.le + exact Real.exp_le_exp.mpr (by linarith) + +/-- Sharp high-top bad-scale component estimate from a fixed high-pair +tail bound. This helper exposes the constants so that the top and bottom +high branches can be assembled with the same intermediate-scale exponent. -/ +theorem measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + {d : ℕ} [NeZero d] {σ Cfluct Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (_hCentry : 0 < Centry) (ha : 0 < a) + (hpair : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := min σ 2 + let A : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ τ)) * weightedLinearExpKernelConst w (ρ ^ τ)) := by + intro t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht_pos hαt hαb hαharm hA_one + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := min σ 2 + let A : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + have hA_one_local : 1 ≤ A := by + simpa [A, K, L, b] using hA_one + have hτ_pos : 0 < τ := by + dsimp [τ] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hc_pos : 0 < c := by + dsimp [c] + have hta : 0 < t - αbad := sub_pos.mpr hαt + have hba : 0 < b - αbad := sub_pos.mpr hαb + have hone_ba : 0 < 1 + b / a := by positivity + have hprod : 0 < (t - αbad) * (1 + b / a) := + mul_pos hta hone_ba + have hharm : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + positivity + have hρ_gt : 1 < ρ := by + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ c := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + refine + measureReal_highTopBadScaleEvent_le_weighted_exp_linear_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := τ) (C := (S.card : ℝ)) (w := w) + hS_nonneg hw_pos hA_one_local hρ_gt hτ_pos ?_ + intro r j + let m : ℕ := q + r + let n : ℕ := q + j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ℓ : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / (2 * K * scale) + have htail_nonneg : + 0 ≤ (S.card : ℝ) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + positivity + by_cases hhigh : selectedBadPairScale K a t αbad q m n < n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x, m, n] + have hℓn : ℓ < n := by + simpa [hℓ_eq] using hhigh + have hqn : q ≤ n := by + dsimp [n] + exact Nat.le_add_right q j.val + have hnm_le : n ≤ m := le_of_lt hnm + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hceil : + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + rw [hℓ_eq] + simpa [K, L, x, m, n] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) ha + have hexp_comp : + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1) := by + have hraw := + highNatScaleExponent_lower_bound_of_ceil_q_le_n_sharp + (a := a) (b := b) (t := t) (α := αbad) (L := L) + (q := q) (m := m) (n := n) (ℓ := ℓ) + ha hb_pos hαt hαb hαharm hL_nonneg + (le_of_lt hℓn) hqn hnm_le + (by simpa [x] using hceil) + simpa [x, c] using hraw + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos + (mul_pos hCfluct + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _)) + (pow_pos hΓ.thetaHat_pos 2) + have hden_pos : 0 < 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) := by + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) + hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hlam_eq : + lam = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) := by + let decay : ℝ := + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ℓ : ℕ) : ℝ)) + have hdecay_pos : 0 < decay := by + dsimp [decay] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hquot : + (3 : ℝ) ^ (-x) / decay = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) := by + dsimp [decay, b] + rw [div_eq_mul_inv] + rw [← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring_nf + dsimp [lam, T, scale] + change + (3 : ℝ) ^ (-x) / + (2 * K * + (Cfluct * decay * hΓ.thetaHat ^ (2 : ℕ))) = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + calc + (3 : ℝ) ^ (-x) / + (2 * K * + (Cfluct * decay * hΓ.thetaHat ^ (2 : ℕ))) + = + ((3 : ℝ) ^ (-x) / decay) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) := by + field_simp [hK_pos.ne', hCfluct.ne', + hΓ.thetaHat_pos.ne', hdecay_pos.ne'] + _ = + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) := by + rw [hquot] + have hpow_base : + (3 : ℝ) ^ (b * (q : ℝ) + c * (r : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + = + A * ρ ^ r := by + dsimp [A, ρ] + have hrpow := + rpow_three_mul_rpow_pow_nat_eq + (x := b * (q : ℝ) - b * (L + 1)) + (y := c) (r := r) + calc + (3 : ℝ) ^ (b * (q : ℝ) + c * (r : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + = + ((3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) * + ((3 : ℝ) ^ c) ^ r) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) := by + rw [hrpow] + congr 1 + ring_nf + _ = + ((3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ))) * + ((3 : ℝ) ^ c) ^ r := by + field_simp [hden_pos.ne'] + have hlam_lower : A * ρ ^ r ≤ lam := by + rw [hlam_eq] + rw [← hpow_base] + have hmr : ((m - q : ℕ) : ℝ) = (r : ℝ) := by + dsimp [m] + rw [Nat.add_sub_cancel_left] + have hpow_le : + (3 : ℝ) ^ + (b * (q : ℝ) + c * (r : ℝ) - b * (L + 1)) ≤ + (3 : ℝ) ^ (b * ((n - ℓ : ℕ) : ℝ) - x) := by + exact + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) + (by + have hcomp := hexp_comp + rw [hmr] at hcomp + linarith) + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hAρ_one : 1 ≤ A * ρ ^ r := by + simpa using + mul_le_mul hA_one_local hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) + (by linarith : 0 ≤ A) + have hlam_one : 1 ≤ lam := hAρ_one.trans hlam_lower + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ τ))) := by + simpa [K, x, ℓ, N0, Hshift, D, S, τ, scale, T, lam] using + hraw hℓn hnm hqm hlam_one + have hmono : + P.real (highTopPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := by + exact measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hD_le_w : (D.card : ℝ) ≤ w ^ r := by + have hcard : + D.card = (3 ^ d) ^ (m - n) := by + simpa [D] using + descendantsAtScale_originCube_nat_shift_card + (d := d) (N := N0) (m := m) (n := n) hnm_le + have hgap_le : m - n ≤ r := by + dsimp [m, n] + omega + have hpow_le_nat : (3 ^ d) ^ (m - n) ≤ (3 ^ d) ^ r := + Nat.pow_le_pow_right + (by exact pow_pos (by norm_num : (0 : ℕ) < 3) d) hgap_le + dsimp [w] + rw [hcard] + exact_mod_cast hpow_le_nat + have hlam_nonneg : 0 ≤ lam := by + exact (by positivity : 0 ≤ A * ρ ^ r).trans hlam_lower + have hexp_le : + Real.exp (-(lam ^ τ)) ≤ + Real.exp (-((A * ρ ^ r) ^ τ)) := + exp_neg_rpow_le_exp_neg_rpow_of_le + (by positivity : 0 ≤ A * ρ ^ r) hlam_lower hτ_pos + have htail : + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ τ))) ≤ + (S.card : ℝ) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + have hDexp : + (D.card : ℝ) * Real.exp (-(lam ^ τ)) ≤ + w ^ r * Real.exp (-((A * ρ ^ r) ^ τ)) := + mul_le_mul hD_le_w hexp_le (by positivity) (by positivity) + exact mul_le_mul_of_nonneg_left hDexp hS_nonneg + exact hmono.trans (hbad.trans htail) + · have hempty : + highTopPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highTopPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + · have hempty : + highTopPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highTopPairEvent, hhigh] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Sharp high-top bad-scale component estimate with the finite descendant +cardinality absorbed by the weighted linear kernel. -/ +theorem measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := min σ 2 + let A : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 1 ≤ A → + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ τ)) * weightedLinearExpKernelConst w (ρ ^ τ)) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hpair⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + exact + ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hpair⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsTop.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsTop.lean new file mode 100644 index 0000000000..c47d91d329 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentBoundsTop.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentCompetition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit + +/-! # Bad Scale Component Bounds Top -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# The crude top bad-scale component + +In the top complementary range, the selected-scale inequality bounds `n` by a +deterministic logarithmic offset. Since this branch also has `q ≤ n`, it is +empty above the corresponding deterministic threshold. +-/ + +noncomputable section + +variable {Ω : Type*} + +/-- The selected bad-pair scale is bounded by the logarithmic offset plus the +positive part of the exponent correction. This deterministic cutoff estimate +is loss-free; it is kept with the crude-top branch rather than with the old +kernel bounds. -/ +theorem selectedBadPairScale_cast_le_logOffset + {K a t α : ℝ} (ha : 0 < a) {q m n : ℕ} : + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + (selectedBadPairScale K a t α q m n : ℝ) ≤ + L + max (x / a) 0 + 1 := by + intro x L + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hden_pos : 0 < a * Real.log (3 : ℝ) := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := by + exact Real.log_nonneg (le_max_right (2 * K) 1) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact mul_nonneg (inv_nonneg.mpr hden_pos.le) hlog_nonneg + have harg_eq : + (a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3) = + L + x / a := by + dsimp [L] + field_simp [ha.ne', hlog3_pos.ne'] + have hceil := + natCeil_le_add_max_zero_add_one (L := L) (y := x / a) hL_nonneg + change + (Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) : ℝ) ≤ + L + max (x / a) 0 + 1 + rw [harg_eq] + exact hceil + +theorem crudeTopBadScaleEvent_eq_empty_of_large + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hq_large : + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + L + 1 < (1 - α / a) * (q : ℝ)) : + crudeTopBadScaleEvent H K a t α q = ∅ := by + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + have hlarge : L + 1 < (1 - α / a) * (q : ℝ) := by + simpa [L] using hq_large + have hα_div_lt_one : α / a < 1 := by + have hdiv := div_lt_div_of_pos_right hαa ha + simpa [div_self (ne_of_gt ha)] using hdiv + have hbuffer_nonneg : 0 ≤ 1 - α / a := by linarith + ext ω + constructor + · intro hω + rcases hω with ⟨m, n, hqn, hnot, hpair⟩ + rcases hpair with ⟨hnm, _hqm, _hbad⟩ + have hnℓ : n ≤ selectedBadPairScale K a t α q m n := + le_of_not_gt hnot + have hceil : + (selectedBadPairScale K a t α q m n : ℝ) ≤ + L + + max + ((α * ((m - q : ℕ) : ℝ) - + t * ((m - n : ℕ) : ℝ)) / a) 0 + 1 := by + simpa [L] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hn_bound : + (1 - α / a) * (n : ℝ) ≤ L + 1 := by + simpa [L] using + scale_bound_of_not_high_q_le_n + (a := a) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) + (ℓ := selectedBadPairScale K a t α q m n) + ha hα_nonneg hαt hαa + (by simpa [L] using hceil) hnℓ hqn (le_of_lt hnm) + have hq_le_n : (q : ℝ) ≤ (n : ℝ) := by exact_mod_cast hqn + have hq_bound : + (1 - α / a) * (q : ℝ) ≤ L + 1 := + (mul_le_mul_of_nonneg_left hq_le_n hbuffer_nonneg).trans hn_bound + linarith + · intro hω + cases hω + +variable [MeasurableSpace Ω] + +theorem measureReal_crudeTopBadScaleEvent_eq_zero_of_large + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hq_large : + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + L + 1 < (1 - α / a) * (q : ℝ)) : + μ.real (crudeTopBadScaleEvent H K a t α q) = 0 := by + rw [crudeTopBadScaleEvent_eq_empty_of_large + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + ha hα_nonneg hαt hαa hq_large] + simp [Measure.real] + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentRows.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentRows.lean new file mode 100644 index 0000000000..d2fb8990d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentRows.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry + +/-! # Bad Scale Component Rows -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Row estimates for split bad-scale components + +The lemmas in this file are deliberately small. They convert a fixed-pair +tail bound, a deterministic lower bound on the tail parameter, and a +descendant-cardinality estimate into the weighted row estimates needed by the +component summation lemmas. +-/ + +noncomputable section + +private theorem exp_neg_rpow_le_exp_neg_rpow_of_le + {x y τ : ℝ} (hx : 0 ≤ x) (hxy : x ≤ y) (hτ : 0 < τ) : + Real.exp (-(y ^ τ)) ≤ Real.exp (-(x ^ τ)) := by + have hpow : x ^ τ ≤ y ^ τ := + Real.rpow_le_rpow hx hxy hτ.le + exact Real.exp_le_exp.mpr (by linarith) + +variable {Ω : Type*} [MeasurableSpace Ω] + +/-- High-bottom row estimate from a fixed-pair no-log bound and deterministic +weight estimates. -/ +theorem measureReal_highBottomPairEvent_le_weighted_row_of_badPair_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n r : ℕ} + {S D A ρ τ lam w : ℝ} + (hS : 0 ≤ S) (hw : 0 ≤ w) (hD : D ≤ w ^ q * w ^ r) + (hAρ_nonneg : 0 ≤ A * ρ ^ r) + (hlam : A * ρ ^ r ≤ lam) (hτ : 0 < τ) + (hbad : + μ.real (badPairEvent H t α q m n) ≤ + S * (D * Real.exp (-(lam ^ τ)))) : + μ.real (highBottomPairEvent H K a t α q m n) ≤ + (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + have hmono : + μ.real (highBottomPairEvent H K a t α q m n) ≤ + μ.real (badPairEvent H t α q m n) := by + exact measureReal_mono + (by + intro ω hω + exact hω.2.2) + have hexp : + Real.exp (-(lam ^ τ)) ≤ + Real.exp (-((A * ρ ^ r) ^ τ)) := + exp_neg_rpow_le_exp_neg_rpow_of_le hAρ_nonneg hlam hτ + have hDexp : + D * Real.exp (-(lam ^ τ)) ≤ + (w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ τ)) := + mul_le_mul hD hexp (by positivity) + (mul_nonneg (pow_nonneg hw q) (pow_nonneg hw r)) + have htail : + S * (D * Real.exp (-(lam ^ τ))) ≤ + (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + calc + S * (D * Real.exp (-(lam ^ τ))) + ≤ S * + ((w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ τ))) := + mul_le_mul_of_nonneg_left hDexp hS + _ = (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ τ))) := by + ring + exact hmono.trans (hbad.trans htail) + +/-- Crude-bottom row estimate from a fixed-pair crude bound and deterministic +weight estimates. -/ +theorem measureReal_crudeBottomPairEvent_le_weighted_row_of_badPair_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n r : ℕ} + {S D A ρ σ lam w : ℝ} + (hS : 0 ≤ S) (hw : 0 ≤ w) (hD : D ≤ w ^ q * w ^ r) + (hAρ_nonneg : 0 ≤ A * ρ ^ r) + (hlam : A * ρ ^ r ≤ lam) (hσ : 0 < σ) + (hbad : + μ.real (badPairEvent H t α q m n) ≤ + S * (D * Real.exp (-(lam ^ σ)))) : + μ.real (crudeBottomPairEvent H K a t α q m n) ≤ + (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + have hmono : + μ.real (crudeBottomPairEvent H K a t α q m n) ≤ + μ.real (badPairEvent H t α q m n) := by + exact measureReal_mono + (by + intro ω hω + exact hω.2.2) + have hexp : + Real.exp (-(lam ^ σ)) ≤ + Real.exp (-((A * ρ ^ r) ^ σ)) := + exp_neg_rpow_le_exp_neg_rpow_of_le hAρ_nonneg hlam hσ + have hDexp : + D * Real.exp (-(lam ^ σ)) ≤ + (w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ σ)) := + mul_le_mul hD hexp (by positivity) + (mul_nonneg (pow_nonneg hw q) (pow_nonneg hw r)) + have htail : + S * (D * Real.exp (-(lam ^ σ))) ≤ + (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + calc + S * (D * Real.exp (-(lam ^ σ))) + ≤ S * + ((w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ σ))) := + mul_le_mul_of_nonneg_left hDexp hS + _ = (S * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + ring + exact hmono.trans (hbad.trans htail) + +/-- Descendant-cardinality weight for bottom rows. In the range +`n = q - j`, `m = q + r`, the number of descendants is bounded by +`(3^d)^q (3^d)^r`. -/ +theorem descendantsAtScale_bottom_row_card_le_weight + {d : ℕ} {N q r : ℕ} {j : Fin (q + 1)} + (hnm : q - j.val ≤ q + r) : + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N + (q + r) : ℕ) : ℤ))) + (((N + (q - j.val) : ℕ) : ℤ)) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + (D.card : ℝ) ≤ w ^ q * w ^ r := by + intro D w + have hcard : + D.card = (3 ^ d) ^ ((q + r) - (q - j.val)) := by + simpa [D] using + descendantsAtScale_originCube_nat_shift_card + (d := d) (N := N) (m := q + r) (n := q - j.val) hnm + have hgap_le : (q + r) - (q - j.val) ≤ q + r := by + exact Nat.sub_le (q + r) (q - j.val) + have hpow_le_nat : (3 ^ d) ^ ((q + r) - (q - j.val)) ≤ (3 ^ d) ^ (q + r) := + Nat.pow_le_pow_right + (by exact pow_pos (by norm_num : (0 : ℕ) < 3) d) hgap_le + dsimp [w] + rw [hcard] + have hcast : + (((3 ^ d) ^ (q + r) : ℕ) : ℝ) = + (((3 ^ d : ℕ) : ℝ) ^ q) * (((3 ^ d : ℕ) : ℝ) ^ r) := by + norm_num [pow_add] + calc + (((3 ^ d) ^ ((q + r) - (q - j.val)) : ℕ) : ℝ) + ≤ (((3 ^ d) ^ (q + r) : ℕ) : ℝ) := by + exact_mod_cast hpow_le_nat + _ = (((3 ^ d : ℕ) : ℝ) ^ q) * (((3 ^ d : ℕ) : ℝ) ^ r) := hcast + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentSummation.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentSummation.lean new file mode 100644 index 0000000000..b6a31f468f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentSummation.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.KernelUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentUnion + +/-! # Bad Scale Component Summation -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Summing split bad-scale components + +This file begins the passage from fixed-pair component estimates to +bad-scale component estimates. The high-top branch has one geometric direction +and one finite row multiplicity, so it uses the linear kernel union bound. +-/ + +noncomputable section + +variable {Ω : Type*} + +theorem highTopBadScaleEvent_subset_linearRows + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + highTopBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (r + 1), + highTopPairEvent H K a t α q (q + r) (q + j.val) := by + intro ω hω + rcases hω with ⟨m, n, hqn, hhigh, hpair⟩ + rcases hpair with ⟨hnm, hqm, hbad⟩ + let r : ℕ := m - q + let j : Fin (r + 1) := + ⟨n - q, by + have hsub_le : n - q ≤ m - q := Nat.sub_le_sub_right (le_of_lt hnm) q + omega⟩ + refine Set.mem_iUnion.2 ⟨r, Set.mem_iUnion.2 ⟨j, ?_⟩⟩ + have hm : q + r = m := by + dsimp [r] + exact Nat.add_sub_of_le hqm + have hn : q + j.val = n := by + dsimp [j] + exact Nat.add_sub_of_le hqn + simpa [highTopPairEvent, hm, hn] using + (⟨hqn, hhigh, ⟨hnm, hqm, hbad⟩⟩ : + ω ∈ highTopPairEvent H K a t α q m n) + +theorem highBottomBadScaleEvent_subset_constRows + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + highBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), + highBottomPairEvent H K a t α q (q + r) (q - j.val) := by + intro ω hω + rcases hω with ⟨m, n, hnq, hhigh, hpair⟩ + rcases hpair with ⟨hnm, hqm, hbad⟩ + let r : ℕ := m - q + let j : Fin (q + 1) := ⟨q - n, by omega⟩ + refine Set.mem_iUnion.2 ⟨r, Set.mem_iUnion.2 ⟨j, ?_⟩⟩ + have hm : q + r = m := by + dsimp [r] + exact Nat.add_sub_of_le hqm + have hn : q - j.val = n := by + dsimp [j] + exact Nat.sub_sub_self hnq + simpa [highBottomPairEvent, hm, hn] using + (⟨hnq, hhigh, ⟨hnm, hqm, hbad⟩⟩ : + ω ∈ highBottomPairEvent H K a t α q m n) + +theorem crudeBottomBadScaleEvent_subset_constRows + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + crudeBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), + crudeBottomPairEvent H K a t α q (q + r) (q - j.val) := by + intro ω hω + rcases hω with ⟨m, n, hnq, hnot, hpair⟩ + rcases hpair with ⟨hnm, hqm, hbad⟩ + let r : ℕ := m - q + let j : Fin (q + 1) := ⟨q - n, by omega⟩ + refine Set.mem_iUnion.2 ⟨r, Set.mem_iUnion.2 ⟨j, ?_⟩⟩ + have hm : q + r = m := by + dsimp [r] + exact Nat.add_sub_of_le hqm + have hn : q - j.val = n := by + dsimp [j] + exact Nat.sub_sub_self hnq + have hnℓ : n ≤ selectedBadPairScale K a t α q m n := le_of_not_gt hnot + simpa [crudeBottomPairEvent, hm, hn] using + (⟨hnq, hnℓ, ⟨hnm, hqm, hbad⟩⟩ : + ω ∈ crudeBottomPairEvent H K a t α q m n) + +variable [MeasurableSpace Ω] + +theorem measureReal_highTopBadScaleEvent_le_exp_linear_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (r + 1)), + μ.real (highTopPairEvent H K a t α q (q + r) (q + j.val)) ≤ + C * Real.exp (-((A * ρ ^ r) ^ η))) : + μ.real (highTopBadScaleEvent H K a t α q) ≤ + C * (Real.exp (-(A ^ η)) * linearExpKernelConst ρ η) := by + let E : (r : ℕ) → Fin (r + 1) → Set Ω := + fun r j => highTopPairEvent H K a t α q (q + r) (q + j.val) + have hsubset : + highTopBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j := by + simpa [E] using + highTopBadScaleEvent_subset_linearRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (highTopBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ C * (Real.exp (-(A ^ η)) * linearExpKernelConst ρ η) := + measureReal_iUnion_linearRows_le_exp_linear_kernel + (μ := μ) (E := E) hC hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +/-- Weighted high-top summation. This is the no-loss version of the +linear-row component bound: the row-dependent finite-union prefactor is carried +as `w ^ r` and absorbed only by the weighted kernel. -/ +theorem measureReal_highTopBadScaleEvent_le_weighted_exp_linear_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C w : ℝ} + (hC : 0 ≤ C) (hw : 0 < w) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (r + 1)), + μ.real (highTopPairEvent H K a t α q (q + r) (q + j.val)) ≤ + C * (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + μ.real (highTopBadScaleEvent H K a t α q) ≤ + C * (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρ ^ η)) := by + let E : (r : ℕ) → Fin (r + 1) → Set Ω := + fun r j => highTopPairEvent H K a t α q (q + r) (q + j.val) + have hsubset : + highTopBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j := by + simpa [E] using + highTopBadScaleEvent_subset_linearRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (highTopBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ C * (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρ ^ η)) := + measureReal_iUnion_linearRows_le_weighted_exp_linear_kernel + (μ := μ) (E := E) hC hw hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +theorem measureReal_highBottomBadScaleEvent_le_exp_constRows_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (q + 1)), + μ.real (highBottomPairEvent H K a t α q (q + r) (q - j.val)) ≤ + C * Real.exp (-((A * ρ ^ r) ^ η))) : + μ.real (highBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := by + let E : ℕ → Fin (q + 1) → Set Ω := + fun r j => highBottomPairEvent H K a t α q (q + r) (q - j.val) + have hsubset : + highBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j := by + simpa [E] using + highBottomBadScaleEvent_subset_constRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (highBottomBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := + measureReal_iUnion_constRows_le_exp_kernel + (μ := μ) (Q := q + 1) (E := E) hC hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +/-- Weighted high-bottom summation with a fixed finite row size. -/ +theorem measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C w : ℝ} + (hC : 0 ≤ C) (hw : 0 < w) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (q + 1)), + μ.real (highBottomPairEvent H K a t α q (q + r) (q - j.val)) ≤ + C * (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + μ.real (highBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + let E : ℕ → Fin (q + 1) → Set Ω := + fun r j => highBottomPairEvent H K a t α q (q + r) (q - j.val) + have hsubset : + highBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j := by + simpa [E] using + highBottomBadScaleEvent_subset_constRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (highBottomBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := + measureReal_iUnion_constRows_le_weighted_exp_kernel + (μ := μ) (Q := q + 1) (E := E) hC hw hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +theorem measureReal_crudeBottomBadScaleEvent_le_exp_constRows_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (q + 1)), + μ.real (crudeBottomPairEvent H K a t α q (q + r) (q - j.val)) ≤ + C * Real.exp (-((A * ρ ^ r) ^ η))) : + μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := by + let E : ℕ → Fin (q + 1) → Set Ω := + fun r j => crudeBottomPairEvent H K a t α q (q + r) (q - j.val) + have hsubset : + crudeBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j := by + simpa [E] using + crudeBottomBadScaleEvent_subset_constRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (crudeBottomBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := + measureReal_iUnion_constRows_le_exp_kernel + (μ := μ) (Q := q + 1) (E := E) hC hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +/-- Weighted crude-bottom summation with a fixed finite row size. -/ +theorem measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {A ρ η C w : ℝ} + (hC : 0 ≤ C) (hw : 0 < w) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hpair : ∀ (r : ℕ) (j : Fin (q + 1)), + μ.real (crudeBottomPairEvent H K a t α q (q + r) (q - j.val)) ≤ + C * (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + let E : ℕ → Fin (q + 1) → Set Ω := + fun r j => crudeBottomPairEvent H K a t α q (q + r) (q - j.val) + have hsubset : + crudeBottomBadScaleEvent H K a t α q ⊆ + ⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j := by + simpa [E] using + crudeBottomBadScaleEvent_subset_constRows + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (crudeBottomBadScaleEvent H K a t α q) + ≤ μ.real (⋃ r : ℕ, ⋃ j : Fin (q + 1), E r j) := + measureReal_mono (μ := μ) hsubset + _ ≤ ((q + 1 : ℕ) : ℝ) * C * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := + measureReal_iUnion_constRows_le_weighted_exp_kernel + (μ := μ) (Q := q + 1) (E := E) hC hw hA hρ hη + (by + intro r j + simpa [E] using hpair r j) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentUnion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentUnion.lean new file mode 100644 index 0000000000..3071456a04 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleComponentUnion.lean @@ -0,0 +1,177 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit + +/-! # Bad Scale Component Union -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Union bounds for the split bad-scale components + +The bad-scale proof estimates each deterministic branch by summing its +fixed-pair events. This file contains only those set identities and union +bounds. +-/ + +noncomputable section + +variable {Ω : Type*} + +def highTopPairEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | q ≤ n ∧ selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +def highBottomPairEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | n ≤ q ∧ selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +def crudeBottomPairEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | n ≤ q ∧ n ≤ selectedBadPairScale K a t α q m n ∧ + ω ∈ badPairEvent H t α q m n} + +def crudeTopPairEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | q ≤ n ∧ n ≤ selectedBadPairScale K a t α q m n ∧ + ω ∈ badPairEvent H t α q m n} + +theorem highTopBadScaleEvent_eq_iUnion_unpair + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + highTopBadScaleEvent H K a t α q = + ⋃ k : ℕ, + highTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2 := by + ext ω + constructor + · rintro ⟨m, n, hqn, hhigh, hpair⟩ + refine Set.mem_iUnion.2 ⟨Nat.pair m n, ?_⟩ + simpa [highTopPairEvent, Nat.unpair_pair] using ⟨hqn, hhigh, hpair⟩ + · intro hω + rcases Set.mem_iUnion.1 hω with ⟨k, hk⟩ + rcases hk with ⟨hqn, hhigh, hpair⟩ + exact ⟨(Nat.unpair k).1, (Nat.unpair k).2, hqn, hhigh, hpair⟩ + +theorem highBottomBadScaleEvent_eq_iUnion_unpair + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + highBottomBadScaleEvent H K a t α q = + ⋃ k : ℕ, + highBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2 := by + ext ω + constructor + · rintro ⟨m, n, hnq, hhigh, hpair⟩ + refine Set.mem_iUnion.2 ⟨Nat.pair m n, ?_⟩ + simpa [highBottomPairEvent, Nat.unpair_pair] using ⟨hnq, hhigh, hpair⟩ + · intro hω + rcases Set.mem_iUnion.1 hω with ⟨k, hk⟩ + rcases hk with ⟨hnq, hhigh, hpair⟩ + exact ⟨(Nat.unpair k).1, (Nat.unpair k).2, hnq, hhigh, hpair⟩ + +theorem crudeBottomBadScaleEvent_eq_iUnion_unpair + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + crudeBottomBadScaleEvent H K a t α q = + ⋃ k : ℕ, + crudeBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2 := by + ext ω + constructor + · rintro ⟨m, n, hnq, hnot, hpair⟩ + refine Set.mem_iUnion.2 ⟨Nat.pair m n, ?_⟩ + have hnℓ : n ≤ selectedBadPairScale K a t α q m n := le_of_not_gt hnot + simpa [crudeBottomPairEvent, Nat.unpair_pair] using ⟨hnq, hnℓ, hpair⟩ + · intro hω + rcases Set.mem_iUnion.1 hω with ⟨k, hk⟩ + rcases hk with ⟨hnq, hnℓ, hpair⟩ + exact ⟨(Nat.unpair k).1, (Nat.unpair k).2, hnq, not_lt.mpr hnℓ, hpair⟩ + +theorem crudeTopBadScaleEvent_eq_iUnion_unpair + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + crudeTopBadScaleEvent H K a t α q = + ⋃ k : ℕ, + crudeTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2 := by + ext ω + constructor + · rintro ⟨m, n, hqn, hnot, hpair⟩ + refine Set.mem_iUnion.2 ⟨Nat.pair m n, ?_⟩ + have hnℓ : n ≤ selectedBadPairScale K a t α q m n := le_of_not_gt hnot + simpa [crudeTopPairEvent, Nat.unpair_pair] using ⟨hqn, hnℓ, hpair⟩ + · intro hω + rcases Set.mem_iUnion.1 hω with ⟨k, hk⟩ + rcases hk with ⟨hqn, hnℓ, hpair⟩ + exact ⟨(Nat.unpair k).1, (Nat.unpair k).2, hqn, not_lt.mpr hnℓ, hpair⟩ + +variable [MeasurableSpace Ω] + +theorem measureReal_highTopBadScaleEvent_le_tsum_unpair + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (hsum : Summable fun k : ℕ => + μ.real + (highTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2)) : + μ.real (highTopBadScaleEvent H K a t α q) ≤ + ∑' k : ℕ, + μ.real + (highTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2) := by + rw [highTopBadScaleEvent_eq_iUnion_unpair] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hsum + +theorem measureReal_highBottomBadScaleEvent_le_tsum_unpair + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (hsum : Summable fun k : ℕ => + μ.real + (highBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2)) : + μ.real (highBottomBadScaleEvent H K a t α q) ≤ + ∑' k : ℕ, + μ.real + (highBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2) := by + rw [highBottomBadScaleEvent_eq_iUnion_unpair] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hsum + +theorem measureReal_crudeBottomBadScaleEvent_le_tsum_unpair + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (hsum : Summable fun k : ℕ => + μ.real + (crudeBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2)) : + μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ + ∑' k : ℕ, + μ.real + (crudeBottomPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2) := by + rw [crudeBottomBadScaleEvent_eq_iUnion_unpair] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hsum + +theorem measureReal_crudeTopBadScaleEvent_le_tsum_unpair + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + (hsum : Summable fun k : ℕ => + μ.real + (crudeTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2)) : + μ.real (crudeTopBadScaleEvent H K a t α q) ≤ + ∑' k : ℕ, + μ.real + (crudeTopPairEvent H K a t α q (Nat.unpair k).1 (Nat.unpair k).2) := by + rw [crudeTopBadScaleEvent_eq_iUnion_unpair] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hsum + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleEntrySplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleEntrySplit.lean new file mode 100644 index 0000000000..c51268ed7f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleEntrySplit.lean @@ -0,0 +1,111 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadTailUnion + +/-! # Bad Scale Entry Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Splitting absolute bad scales at the annealed entry scale + +The quantitative bad-scale estimate is proved after shifting the annealed +entry scale to zero. The final quenched theorem also has to cover the finite +bottom band below that entry scale. This file records the deterministic +decomposition separating those two contributions. +-/ + +noncomputable section + +variable {Ω : Type*} + +/-- Bad event contributed by pairs whose bottom scale is below the entry +scale. -/ +def smallBottomBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (Nentry : ℕ) (t α : ℝ) (N : ℕ) : + Set Ω := + {ω | ∃ m n : ℕ, n < Nentry ∧ n < m ∧ N ≤ m ∧ + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω > + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ))} + +/-- The absolute bad event splits into the small-bottom band and the shifted +bad event above the entry scale. -/ +theorem badScaleEvent_subset_smallBottom_union_shifted + {H : ℕ → ℕ → Ω → ℝ} {Nentry N : ℕ} {t α : ℝ} + (hNentryN : Nentry ≤ N) : + badScaleEvent H t α N ⊆ + smallBottomBadScaleEvent H Nentry t α N ∪ + badScaleEvent + (fun M K ω => H (Nentry + M) (Nentry + K) ω) + t α (N - Nentry) := by + intro ω hω + rcases hω with ⟨m, n, hnm, hNm, hbad⟩ + by_cases hn_entry : n < Nentry + · exact Or.inl ⟨m, n, hn_entry, hnm, hNm, hbad⟩ + · have hNentryn : Nentry ≤ n := le_of_not_gt hn_entry + let M : ℕ := m - Nentry + let K : ℕ := n - Nentry + have hNentrym : Nentry ≤ m := le_trans hNentryn (le_of_lt hnm) + have hK_lt_M : K < M := by + dsimp [M, K] + omega + have hqM : N - Nentry ≤ M := by + dsimp [M] + omega + have hMN : (M - K : ℕ) = m - n := by + dsimp [M, K] + omega + have hMq : (M - (N - Nentry) : ℕ) = m - N := by + dsimp [M] + omega + have hbad_shift : + (3 : ℝ) ^ (-t * ((M - K : ℕ) : ℝ)) * + H (Nentry + M) (Nentry + K) ω > + (3 : ℝ) ^ (-α * ((M - (N - Nentry) : ℕ) : ℝ)) := by + have hM_eq : Nentry + M = m := by + dsimp [M] + exact Nat.add_sub_of_le hNentrym + have hK_eq : Nentry + K = n := by + dsimp [K] + exact Nat.add_sub_of_le hNentryn + simpa [hMN, hMq, hM_eq, hK_eq] using hbad + exact Or.inr ⟨M, K, hK_lt_M, hqM, hbad_shift⟩ + +/-- Tail-event form of `badScaleEvent_subset_smallBottom_union_shifted`. -/ +theorem badTailEvent_subset_smallBottom_union_shifted + {H : ℕ → ℕ → Ω → ℝ} {Nentry N : ℕ} {t α : ℝ} + (hNentryN : Nentry ≤ N) : + badTailEvent (badScaleEvent H t α) N ⊆ + badTailEvent (smallBottomBadScaleEvent H Nentry t α) N ∪ + badTailEvent + (badScaleEvent + (fun M K ω => H (Nentry + M) (Nentry + K) ω) t α) + (N - Nentry) := by + intro ω hω + rcases hω with ⟨K, hNK, hbadK⟩ + have hNentryK : Nentry ≤ K := hNentryN.trans hNK + have hsplit := + badScaleEvent_subset_smallBottom_union_shifted + (H := H) (Nentry := Nentry) (N := K) (t := t) (α := α) + hNentryK hbadK + rcases hsplit with hsmall | hshift + · exact Or.inl ⟨K, hNK, hsmall⟩ + · exact Or.inr ⟨K - Nentry, by omega, hshift⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimal.lean new file mode 100644 index 0000000000..5c91c20637 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimal.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedLocalizedEstimate + +/-! # Bad Scale Minimal -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Minimal scale from the interpolated bad-scale tail + +This file converts the eventual one-scale bad-scale estimate into the +quantitative triadic minimal scale used in the quenched theorem. The only +extra deterministic step is that the absolute tail at scale `N` dominates the +shifted tail at `N - Q`, with the harmless replacement of the denominator by +`max 1 B`. +-/ + +noncomputable section + +theorem rpow_three_sub_div_max_one_le_rpow_three_nat_div + {Q N : ℕ} {B η : ℝ} + (hB : 0 < B) (hη : 0 < η) : + ((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / max 1 B) ^ η ≤ + (((3 : ℝ) ^ (N : ℝ) / B) ^ η) := by + have hsub_le : ((N - Q : ℕ) : ℝ) ≤ (N : ℝ) := by + exact_mod_cast Nat.sub_le N Q + have hpow_le : + Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ) ≤ (3 : ℝ) ^ (N : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hsub_le + have hpow_sub_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hpow_N_nonneg : 0 ≤ (3 : ℝ) ^ (N : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hmax_pos : 0 < max 1 B := + lt_of_lt_of_le zero_lt_one (le_max_left 1 B) + have hB_le_max : B ≤ max 1 B := le_max_right 1 B + have hfrac_le : + Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ) / max 1 B ≤ + (3 : ℝ) ^ (N : ℝ) / B := by + calc + Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ) / max 1 B + ≤ (3 : ℝ) ^ (N : ℝ) / max 1 B := + div_le_div_of_nonneg_right hpow_le hmax_pos.le + _ ≤ (3 : ℝ) ^ (N : ℝ) / B := + div_le_div_of_nonneg_left hpow_N_nonneg hB hB_le_max + exact + Real.rpow_le_rpow + (div_nonneg hpow_sub_nonneg hmax_pos.le) hfrac_le hη.le + +theorem exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + {Q N : ℕ} {B η : ℝ} + (hB : 0 < B) (hη : 0 < η) : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / B) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / max 1 B) ^ η)) := by + have hpow := + rpow_three_sub_div_max_one_le_rpow_three_nat_div + (Q := Q) (N := N) (B := B) (η := η) hB hη + exact Real.exp_le_exp.mpr (by linarith) + +/-- The finite-`sigma` interpolated bad-scale tail yields the shifted +localized estimate above a quantitative minimal scale. The constants are +chosen before the probability law; the terminal threshold `Q` and the +normalizing denominator are allowed to depend on the law through the entry +scale and `thetaHat`, as in the manuscript proof. -/ +theorem exists_shifted_quenchedLocalizedEstimate_interpolated + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ Q : ℕ, + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hbad⟩ := + exists_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hB : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 Btail + obtain ⟨Q, hQ⟩ := + hbad (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + ht htb hα_nonneg hαt hαb hαharm hαa + refine ⟨Q, ?_⟩ + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + have htail : + ∀ N : ℕ, Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + intro N hQN + have hmono : + P.real (badTailEvent Bad N) ≤ P.real (Bad N) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := αbad) hα_nonneg) + have hscale : + P.real (Bad N) ≤ + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) := by + simpa [K, N0, Hshift, b, L, τ, η, Dhigh, Dcrude, Den, Ohigh, + Ocrude, Blead, Btail, Bad] using hQ N hQN + have hcompare : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + simpa [B] using + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := N) (B := Btail) (η := η) + hBtail_pos hη_pos + exact hmono.trans (hscale.trans hcompare) + have hlocalized := + quenchedLocalizedEstimate_shifted_from_badTailBound + hP hStruct hΓ (t := t) (α := αbad) (η := η) (B := B) + (Nentry := N0) (Nmin := Q) + hη_pos hB (by simpa [Hshift, Bad, B] using htail) + simpa [K, N0, Hshift, b, L, τ, η, Dhigh, Dcrude, Den, Ohigh, + Ocrude, Blead, Btail, B, Bad] using hlocalized + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimalQuantitative.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimalQuantitative.lean new file mode 100644 index 0000000000..283b315ad3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleMinimalQuantitative.lean @@ -0,0 +1,238 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailFinalQuantitative + +/-! # Bad Scale Minimal Quantitative -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Quantitative minimal scale from the interpolated bad-scale tail + +This file keeps the deterministic prefactor threshold selected before the +probability law. It is the quantitative replacement for the eventual +minimal-scale theorem, and is the layer used in the final compression to the +manuscript stochastic-integrability statement. +-/ + +noncomputable section + +/-- The finite-`sigma` interpolated bad-scale tail yields the shifted +localized estimate above an explicit quantitative minimal scale. The +constant `R` controlling the deterministic prefactor is selected before the +probability law. -/ +theorem exists_quantitative_shifted_quenchedLocalizedEstimate_interpolated + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hbad⟩ := + exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad K S b L ctop τ η w ρtop ρbottom ρcrude Cbottom Ctop Kbottom Kcrude + W M ρgap C₀ ht htb hα_nonneg hαt hαb hαharm hαa + classical + obtain ⟨R, hR, hbadR⟩ := + hbad (t := t) (αbad := αbad) + ht htb hα_nonneg hαt hαb hαharm hαa + refine ⟨R, ?_, ?_⟩ + · simpa [K, S, b, L, ctop, τ, η, w, ρtop, ρbottom, ρcrude, + Cbottom, Ctop, Kbottom, Kcrude, W, M, ρgap, C₀] using hR + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hB : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 Btail + have hQ : + ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + exact hbadR hP hStruct hΓ hσ_eq hparams + have htail : + ∀ N : ℕ, Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + intro N hQN + have hmono : + P.real (badTailEvent Bad N) ≤ P.real (Bad N) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := αbad) hα_nonneg) + have hscale : + P.real (Bad N) ≤ + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) := by + simpa [Bad] using hQ N hQN + have hcompare : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + simpa [B] using + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := N) (B := Btail) (η := η) + hBtail_pos hη_pos + exact hmono.trans (hscale.trans hcompare) + have hlocalized := + quenchedLocalizedEstimate_shifted_from_badTailBound + hP hStruct hΓ (t := t) (α := αbad) (η := η) (B := B) + (Nentry := N0) (Nmin := Q) + hη_pos hB (by simpa [Hshift, Bad, B] using htail) + change + IsBigO P (gammaSigma η) (quenchedMinimalScale Q Bad) + (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ quenchedMinimalScale Q Bad aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + quenchedMinimalScale Q Bad aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / quenchedMinimalScale Q Bad aω) ^ (-αbad) + simpa [Hshift, Bad] using hlocalized + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairCollapse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairCollapse.lean new file mode 100644 index 0000000000..3dabe343a1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairCollapse.lean @@ -0,0 +1,899 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentUnion +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop + +/-! # Bad Scale Pair Collapse -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Deterministic fixed-pair exponent collapse + +This file contains the deterministic lower bounds on the raw tail parameters +from `BadScalePairTwoBranch`. These are the first two manuscript-facing +collapses: the localized top range gives the `b*q` concentration scale, and the +crude bottom range gives the `t*q` discount scale. +-/ + +noncomputable section + +private theorem rpow_three_mul_rpow_pow_nat_eq + {x y : ℝ} {r : ℕ} : + (3 : ℝ) ^ x * ((3 : ℝ) ^ y) ^ r = + (3 : ℝ) ^ (x + y * (r : ℝ)) := by + have hpow : + ((3 : ℝ) ^ y) ^ r = (3 : ℝ) ^ (y * (r : ℝ)) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + rw [hpow] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + +/-- In the localized range with `q ≤ n`, the raw high-branch tail parameter +dominates the manuscript `b*q` scale, up to a summable geometric weight in +`m-q`. -/ +theorem highTop_tailParameter_lower_bound + {d : ℕ} [NeZero d] + {K Cfluct θ a t α : ℝ} {q m n : ℕ} + (hK : 0 < K) (hCfluct : 0 < Cfluct) (hθ : 0 < θ) + (ha : 0 < a) + (hαt : α < t) (hαb : α < (d : ℝ) / 2) + (hαharm : α * (1 + ((d : ℝ) / 2) / a) < (d : ℝ) / 2) + (hell : selectedBadPairScale K a t α q m n < n) + (hqn : q ≤ n) (hnm : n < m) : + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t α q m n + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let highScale : ℝ := + Cfluct * (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + θ ^ (2 : ℕ) + let T : ℝ := (3 : ℝ) ^ (-x) + let highLam : ℝ := T / (2 * K * highScale) + let A : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ c + A * ρ ^ (m - q) ≤ highLam := by + intro x ell b L c highScale T highLam A ρ + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hℓn_le : ell ≤ n := le_of_lt hell + have hnm_le : n ≤ m := le_of_lt hnm + have hceil : + (ell : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x, ell, L] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hexp_comp : + b * ((n - ell : ℕ) : ℝ) - x ≥ + b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1) := by + have hraw := + highNatScaleExponent_lower_bound_of_ceil_q_le_n_sharp + (a := a) (b := b) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) (ℓ := ell) + ha hb_pos hαt hαb hαharm hL_nonneg + hℓn_le hqn hnm_le + (by simpa [x] using hceil) + simpa [x, c] using hraw + have hden_pos : 0 < 2 * K * Cfluct * θ ^ (2 : ℕ) := by + exact mul_pos + (mul_pos (mul_pos (by norm_num : (0 : ℝ) < 2) hK) hCfluct) + (pow_pos hθ 2) + have hlam_eq : + highLam = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + let decay : ℝ := + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) + have hdecay_pos : 0 < decay := by + dsimp [decay] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hquot : + (3 : ℝ) ^ (-x) / decay = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) := by + dsimp [decay, b] + rw [div_eq_mul_inv] + rw [← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring_nf + dsimp [highLam, T, highScale] + change + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + calc + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) + = + ((3 : ℝ) ^ (-x) / decay) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + field_simp [hK.ne', hCfluct.ne', hθ.ne', hdecay_pos.ne'] + _ = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + rw [hquot] + have hpow_base : + (3 : ℝ) ^ (b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + = + A * ρ ^ (m - q) := by + dsimp [A, ρ] + have hrpow := + rpow_three_mul_rpow_pow_nat_eq + (x := b * (q : ℝ) - b * (L + 1)) + (y := c) (r := m - q) + calc + (3 : ℝ) ^ (b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + = + ((3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) * + ((3 : ℝ) ^ c) ^ (m - q)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + rw [hrpow] + congr 1 + ring_nf + _ = + ((3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ))) * + ((3 : ℝ) ^ c) ^ (m - q) := by + field_simp [hden_pos.ne'] + rw [hlam_eq, ← hpow_base] + have hpow_le : + (3 : ℝ) ^ + (b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1)) ≤ + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_comp + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + +/-- In the crude bottom range, the raw crude tail parameter dominates the +manuscript `t*q` scale, up to a summable geometric weight in `m-q`. -/ +theorem crudeBottom_tailParameter_lower_bound + {K C θ a t α : ℝ} {q m n : ℕ} + (hK : 0 < K) (hC : 0 < C) (hθ : 0 < θ) + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) + (hnell : n ≤ selectedBadPairScale K a t α q m n) + (hnq : n ≤ q) (hqm : q ≤ m) : + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let crudeScale : ℝ := K * (C * θ ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let crudeLam : ℝ := T / crudeScale + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * C * θ ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - α) + A * ρ ^ (m - q) ≤ crudeLam := by + intro x L crudeScale T crudeLam A ρ + let ell : ℕ := selectedBadPairScale K a t α q m n + have hceil : + (ell : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x, ell, L] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hn_bound : (n : ℝ) ≤ L + 1 := by + exact + n_le_logOffset_add_one_of_not_high_n_le_q + (a := a) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) (ℓ := ell) + ha ht hαt (by simpa [x] using hceil) hnell hnq hqm + have hm_sub : m - n = (m - q) + (q - n) := by omega + have hx_neg_eq : + -x = + (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have hq_decomp : + (q : ℝ) = (n : ℝ) + ((q - n : ℕ) : ℝ) := by + have hnat : n + (q - n) = q := Nat.add_sub_of_le hnq + exact_mod_cast hnat.symm + have hexp_lower : + t * (q : ℝ) - t * (L + 1) + (t - α) * ((m - q : ℕ) : ℝ) ≤ -x := by + rw [hx_neg_eq, hq_decomp] + have hn_mul : t * (n : ℝ) ≤ t * (L + 1) := + mul_le_mul_of_nonneg_left hn_bound ht.le + nlinarith + have hden_pos : 0 < K * C * θ ^ (2 : ℕ) := by + exact mul_pos (mul_pos hK hC) (pow_pos hθ 2) + have hlam_eq : + crudeLam = (3 : ℝ) ^ (-x) / (K * C * θ ^ (2 : ℕ)) := by + dsimp [crudeLam, T, crudeScale] + ring + have hpow_base : + (3 : ℝ) ^ + (t * (q : ℝ) - t * (L + 1) + + (t - α) * ((m - q : ℕ) : ℝ)) / + (K * C * θ ^ (2 : ℕ)) + = + A * ρ ^ (m - q) := by + dsimp [A, ρ] + have hrpow := + rpow_three_mul_rpow_pow_nat_eq + (x := t * (q : ℝ) - t * (L + 1)) + (y := t - α) (r := m - q) + calc + (3 : ℝ) ^ + (t * (q : ℝ) - t * (L + 1) + + (t - α) * ((m - q : ℕ) : ℝ)) / + (K * C * θ ^ (2 : ℕ)) + = + ((3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) * + ((3 : ℝ) ^ (t - α)) ^ (m - q)) / + (K * C * θ ^ (2 : ℕ)) := by + rw [hrpow] + _ = + ((3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * C * θ ^ (2 : ℕ))) * + ((3 : ℝ) ^ (t - α)) ^ (m - q) := by + field_simp [hden_pos.ne'] + rw [hlam_eq, ← hpow_base] + have hpow_le : + (3 : ℝ) ^ + (t * (q : ℝ) - t * (L + 1) + + (t - α) * ((m - q : ℕ) : ℝ)) ≤ + (3 : ℝ) ^ (-x) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_lower + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + +/-- In the mixed range `n <= q` where the localized scale is available, the +localized tail parameter has the exact interpolating exponent between the +concentration gain at scale `n` and the discount gain from `q - n`. This is +kept separate from theorem-facing tails so that no weakened leading exponent is +exposed as a public endpoint. -/ +theorem highBottom_tailParameter_interpolation_lower_bound + {d : ℕ} [NeZero d] + {K Cfluct θ a t α : ℝ} {q m n : ℕ} + (hK : 0 < K) (hCfluct : 0 < Cfluct) (hθ : 0 < θ) + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) + (hell : selectedBadPairScale K a t α q m n < n) + (hnq : n ≤ q) (hqm : q ≤ m) : + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t α q m n + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let highScale : ℝ := + Cfluct * (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + θ ^ (2 : ℕ) + let T : ℝ := (3 : ℝ) ^ (-x) + let highLam : ℝ := T / (2 * K * highScale) + let A : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + A ≤ highLam := by + intro x ell b L highScale T highLam A + have hb_pos : 0 < b := by + dsimp [b] + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hx_div_nonpos : + x / a ≤ 0 := by + simpa [x] using + highComplement_x_div_nonpos_of_n_le_q + (a := a) (t := t) (α := α) (q := q) (m := m) (n := n) + ha ht hαt hnq hqm + have hceil : + (ell : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x, ell, L] using + selectedBadPairScale_cast_le_logOffset + (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n) ha + have hell_L : (ell : ℝ) ≤ L + 1 := by + simpa [max_eq_right hx_div_nonpos] using hceil + have hℓn_le : ell ≤ n := le_of_lt hell + have hnell_cast : + ((n - ell : ℕ) : ℝ) = (n : ℝ) - (ell : ℝ) := by + exact_mod_cast (Nat.cast_sub hℓn_le : + ((n - ell : ℕ) : ℝ) = (n : ℝ) - (ell : ℝ)) + have hm_sub : m - n = (m - q) + (q - n) := by omega + have hx_neg_eq : + -x = + (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have hq_decomp : + (q : ℝ) = (n : ℝ) + ((q - n : ℕ) : ℝ) := by + have hnat : n + (q - n) = q := Nat.add_sub_of_le hnq + exact_mod_cast hnat.symm + have hexp_lower : + b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) - b * (L + 1) ≤ + b * ((n - ell : ℕ) : ℝ) - x := by + rw [hnell_cast, hq_decomp] + have hell_mul : b * (ell : ℝ) ≤ b * (L + 1) := + mul_le_mul_of_nonneg_left hell_L hb_pos.le + nlinarith [hx_neg_eq] + have hden_pos : 0 < 2 * K * Cfluct * θ ^ (2 : ℕ) := by + exact mul_pos + (mul_pos (mul_pos (by norm_num : (0 : ℝ) < 2) hK) hCfluct) + (pow_pos hθ 2) + have hlam_eq : + highLam = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + let decay : ℝ := + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) + have hdecay_pos : 0 < decay := by + dsimp [decay] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hquot : + (3 : ℝ) ^ (-x) / decay = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) := by + dsimp [decay, b] + rw [div_eq_mul_inv] + rw [← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring_nf + dsimp [highLam, T, highScale] + change + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) + calc + (3 : ℝ) ^ (-x) / + (2 * K * (Cfluct * decay * θ ^ (2 : ℕ))) + = + ((3 : ℝ) ^ (-x) / decay) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + field_simp [hK.ne', hCfluct.ne', hθ.ne', hdecay_pos.ne'] + _ = + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) / + (2 * K * Cfluct * θ ^ (2 : ℕ)) := by + rw [hquot] + rw [hlam_eq] + have hpow_le : + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) - b * (L + 1)) ≤ + (3 : ℝ) ^ (b * ((n - ell : ℕ) : ℝ) - x) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_lower + exact div_le_div_of_nonneg_right hpow_le hden_pos.le + +/-- In the bottom range `n <= q`, the crude tail parameter has the exact +discount exponent. This lemma does not require the complementary condition +`n <= ell`; it is the crude half of the mixed-branch comparison. -/ +theorem crudeBottom_tailParameter_discount_lower_bound + {K C θ t α : ℝ} {q m n : ℕ} + (hK : 0 < K) (hC : 0 < C) (hθ : 0 < θ) + (hnq : n ≤ q) (hqm : q ≤ m) : + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let crudeScale : ℝ := K * (C * θ ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let crudeLam : ℝ := T / crudeScale + let A : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ)) / + (K * C * θ ^ (2 : ℕ)) + A ≤ crudeLam := by + intro x crudeScale T crudeLam A + have hm_sub : m - n = (m - q) + (q - n) := by omega + have hx_neg_eq : + -x = + (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have hden_pos : 0 < K * C * θ ^ (2 : ℕ) := by + exact mul_pos (mul_pos hK hC) (pow_pos hθ 2) + have hlam_eq : + crudeLam = (3 : ℝ) ^ (-x) / (K * C * θ ^ (2 : ℕ)) := by + dsimp [crudeLam, T, crudeScale] + ring + rw [hlam_eq] + dsimp [A] + have hpow_eq : + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ)) = + (3 : ℝ) ^ (-x) := by + rw [hx_neg_eq] + congr 1 + ring + rw [hpow_eq] + +/-- Direct localized estimate for the mixed bottom branch. + +The conclusion keeps the exact interpolating exponent. This is stronger than +the two-branch soft estimate when the localized branch is the better one, and +it is used later only before the final endpoint collapse. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, + 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA tau := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hrawAll⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hnm hqm ht hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + by_cases hnq : n ≤ q + · by_cases hell : selectedBadPairScale K a t αbad q m n < n + · let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hHighLam : highA ≤ highLam := by + simpa [K, x, ell, b, L, highScale, T, highLam, highA] using + highBottom_tailParameter_interpolation_lower_bound + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) + hK_pos hCfluct hΓ.thetaHat_pos ha ht hαt hell hnq hqm + have htau_pos : 0 < tau := by + dsimp [tau] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highLam tau := by + by_cases hlam : 1 ≤ highLam + · have hraw := + hrawAll (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(highLam ^ tau))) := by + simpa [K, x, ell, selectedBadPairScale, N0, Hshift, D, S, tau, + highScale, T, highLam] using + hraw hell hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := highLam) (η := tau) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := highLam) (η := tau) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := highA) (lam₂ := highLam) + (η := tau) htau_pos hHighLam) + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hell] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact softPairTail_nonneg + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact softPairTail_nonneg + +/-- Direct crude estimate for the mixed bottom branch. + +This is independent of the selected localized scale: the event is a subset of +the bad-pair event, and the unit-scale crude input supplies the discount +parameter in the bottom range. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_crude + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude Centry a : ℝ, + 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeA σ := by + obtain ⟨Cfluct, Centry, a, _hCfluct, hCentry, ha, _hhighRaw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + obtain ⟨Ccrude, hCcrude, hcrudeRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, Centry, a, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hnm hqm hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + by_cases hnq : n ≤ q + · let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let crudeLam : ℝ := T / crudeScale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hCrudeLam : crudeA ≤ crudeLam := by + simpa [K, x, crudeScale, T, crudeLam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hΓ.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hΓ.thetaHat_pos hnq hqm + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeLam σ := by + by_cases hlam : 1 ≤ crudeLam + · have hraw := + hcrudeRaw (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(crudeLam ^ σ))) := by + simpa [K, Hshift, x, D, S, crudeScale, T, crudeLam] using + hraw hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := crudeA) (lam₂ := crudeLam) + (η := σ) hσ_pos hCrudeLam) + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact softPairTail_nonneg + +/-- Exact probability-level estimate for the mixed bottom localized branch. + +This is the delicate `n <= q` and `ell < n` region. The conclusion deliberately +keeps the two honest raw mechanisms visible: the localized interpolation scale +and the crude discount scale. The theorem-facing bad-scale tail must still +collapse these without turning the localized interpolation term into a leading +`c*q` estimate. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_mixed + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA tau + softPairTail pref crudeA σ := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hpair⟩ := + measureReal_shiftedBadPairEvent_quenchedProbeEnvelope_le_soft_two_branch + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hnm hqm ht hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + by_cases hnq : n ≤ q + · by_cases hell : selectedBadPairScale K a t αbad q m n < n + · let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let crudeLam : ℝ := T / crudeScale + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + softPairTail pref highLam tau + + softPairTail pref crudeLam σ := by + have hraw := + hpair (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + simpa [K, x, ell, N0, Hshift, D, S, tau, + highScale, T, highLam, crudeScale, crudeLam, pref] using + hraw hnm hqm + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hHighLam : highA ≤ highLam := by + simpa [K, x, ell, b, L, highScale, T, highLam, highA] using + highBottom_tailParameter_interpolation_lower_bound + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) + hK_pos hCfluct hΓ.thetaHat_pos ha ht hαt hell hnq hqm + have hCrudeLam : crudeA ≤ crudeLam := by + simpa [K, x, crudeScale, T, crudeLam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hΓ.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hΓ.thetaHat_pos hnq hqm + have htau_pos : 0 < tau := by + dsimp [tau] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + exact + hmono.trans + (hbad.trans + (add_le_add + (softPairTail_mono_lam + (pref := pref) (lam₁ := highA) (lam₂ := highLam) + (η := tau) htau_pos hHighLam) + (softPairTail_mono_lam + (pref := pref) (lam₁ := crudeA) (lam₂ := crudeLam) + (η := σ) hσ_pos hCrudeLam))) + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hell] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact add_nonneg softPairTail_nonneg softPairTail_nonneg + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact add_nonneg softPairTail_nonneg softPairTail_nonneg + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairTwoBranch.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairTwoBranch.lean new file mode 100644 index 0000000000..3db842c4d5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePairTwoBranch.lean @@ -0,0 +1,393 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleSplit + +/-! # Bad Scale Pair Two Branch -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Fixed-pair two-branch bad-scale estimates + +This file starts the note-facing bad-scale proof at the fixed-pair level. A +bad pair is split into the localized branch, where the selected intermediate +scale lies below `n`, and the crude branch, where it does not. The concrete +estimate at the end uses the actual Section 5.7 localized and crude tail inputs; +it does not assume the desired bad-scale tail. +-/ + +noncomputable section + +variable {Ω : Type*} + +/-- Fixed-pair localized branch: the selected intermediate scale is below `n`. -/ +def highPairBranchEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +/-- Fixed-pair crude branch: the selected intermediate scale is not below `n`. -/ +def crudePairBranchEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q m n : ℕ) : Set Ω := + {ω | n ≤ selectedBadPairScale K a t α q m n ∧ + ω ∈ badPairEvent H t α q m n} + +theorem badPairEvent_subset_pair_branch_union + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n : ℕ} : + badPairEvent H t α q m n ⊆ + highPairBranchEvent H K a t α q m n ∪ + crudePairBranchEvent H K a t α q m n := by + intro ω hω + by_cases hhigh : selectedBadPairScale K a t α q m n < n + · exact Or.inl ⟨hhigh, hω⟩ + · exact Or.inr ⟨le_of_not_gt hhigh, hω⟩ + +variable [MeasurableSpace Ω] + +/-- A softened fixed-pair tail. If the tail parameter is below one this is +just a probability-one bound; if it is at least one it is the usual exponential +tail, with a harmless factor `exp 1` folded in. -/ +def softPairTail (pref lam η : ℝ) : ℝ := + max 1 pref * Real.exp (1 - (max 1 lam) ^ η) + +theorem softPairTail_nonneg {pref lam η : ℝ} : + 0 ≤ softPairTail pref lam η := by + dsimp [softPairTail] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + +theorem one_le_softPairTail_of_not_one_le_lam + {pref lam η : ℝ} (hlam : ¬ 1 ≤ lam) : + 1 ≤ softPairTail pref lam η := by + have hlam_le : lam ≤ 1 := le_of_not_ge hlam + have hmax_lam : max 1 lam = 1 := max_eq_left hlam_le + have hpref : 1 ≤ max 1 pref := le_max_left 1 pref + simp [softPairTail, hmax_lam, hpref] + +theorem pref_mul_exp_le_softPairTail_of_one_le_lam + {pref lam η : ℝ} (_hpref : 0 ≤ pref) (hlam : 1 ≤ lam) : + pref * Real.exp (-(lam ^ η)) ≤ softPairTail pref lam η := by + have hmax_lam : max 1 lam = lam := max_eq_right hlam + have hpref_le : pref ≤ max 1 pref := le_max_right 1 pref + have hmax_pref_nonneg : 0 ≤ max 1 pref := + (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref) + have hexp : + Real.exp (-(lam ^ η)) ≤ Real.exp (1 - lam ^ η) := + Real.exp_le_exp.mpr (by linarith) + simpa [softPairTail, hmax_lam] using + mul_le_mul hpref_le hexp (Real.exp_pos _).le hmax_pref_nonneg + +theorem softPairTail_mono_lam + {pref lam₁ lam₂ η : ℝ} (hη : 0 < η) (hlam : lam₁ ≤ lam₂) : + softPairTail pref lam₂ η ≤ softPairTail pref lam₁ η := by + have hmax : max 1 lam₁ ≤ max 1 lam₂ := + max_le (le_max_left 1 lam₂) (hlam.trans (le_max_right 1 lam₂)) + have hbase : 0 ≤ max 1 lam₁ := + (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 lam₁) + have hpow : (max 1 lam₁) ^ η ≤ (max 1 lam₂) ^ η := + Real.rpow_le_rpow hbase hmax hη.le + have hexp : + Real.exp (1 - (max 1 lam₂) ^ η) ≤ + Real.exp (1 - (max 1 lam₁) ^ η) := + Real.exp_le_exp.mpr (by linarith) + exact mul_le_mul_of_nonneg_left hexp + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + +/-- Taking the better of two soft fixed-pair tails replaces the two exponents +by their maximum. -/ +theorem min_softPairTail_le_maxExponent + {pref lam₁ lam₂ η₁ η₂ : ℝ} : + min (softPairTail pref lam₁ η₁) (softPairTail pref lam₂ η₂) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂)) := by + by_cases hcmp : (max 1 lam₁) ^ η₁ ≤ (max 1 lam₂) ^ η₂ + · have hmax : + max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂) = + (max 1 lam₂) ^ η₂ := max_eq_right hcmp + calc + min (softPairTail pref lam₁ η₁) (softPairTail pref lam₂ η₂) + ≤ softPairTail pref lam₂ η₂ := min_le_right _ _ + _ = max 1 pref * + Real.exp + (1 - max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂)) := by + simp [softPairTail, hmax] + · have hmax : + max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂) = + (max 1 lam₁) ^ η₁ := max_eq_left (le_of_not_ge hcmp) + calc + min (softPairTail pref lam₁ η₁) (softPairTail pref lam₂ η₂) + ≤ softPairTail pref lam₁ η₁ := min_le_left _ _ + _ = max 1 pref * + Real.exp + (1 - max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂)) := by + simp [softPairTail, hmax] + +theorem le_maxExponent_softPairTail_of_le_both + {x pref lam₁ lam₂ η₁ η₂ : ℝ} + (h₁ : x ≤ softPairTail pref lam₁ η₁) + (h₂ : x ≤ softPairTail pref lam₂ η₂) : + x ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 lam₁) ^ η₁) ((max 1 lam₂) ^ η₂)) := by + exact (le_min h₁ h₂).trans min_softPairTail_le_maxExponent + +theorem measureReal_highPairBranchEvent_le_softTail + {μ : Measure Ω} [IsProbabilityMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n : ℕ} + {pref lam η : ℝ} + (hpref : 0 ≤ pref) + (htail : + selectedBadPairScale K a t α q m n < n → + 1 ≤ lam → + μ.real (badPairEvent H t α q m n) ≤ + pref * Real.exp (-(lam ^ η))) : + μ.real (highPairBranchEvent H K a t α q m n) ≤ + softPairTail pref lam η := by + by_cases hhigh : selectedBadPairScale K a t α q m n < n + · by_cases hlam : 1 ≤ lam + · have hmono : + μ.real (highPairBranchEvent H K a t α q m n) ≤ + μ.real (badPairEvent H t α q m n) := + measureReal_mono (μ := μ) (by + intro ω hω + exact hω.2) + exact + hmono.trans + ((htail hhigh hlam).trans + (pref_mul_exp_le_softPairTail_of_one_le_lam hpref hlam)) + · exact + (measureReal_le_one + (μ := μ) (s := highPairBranchEvent H K a t α q m n)).trans + (one_le_softPairTail_of_not_one_le_lam hlam) + · have hempty : highPairBranchEvent H K a t α q m n = ∅ := by + ext ω + simp [highPairBranchEvent, hhigh] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + dsimp [softPairTail] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + +theorem measureReal_crudePairBranchEvent_le_softTail + {μ : Measure Ω} [IsProbabilityMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n : ℕ} + {pref lam η : ℝ} + (hpref : 0 ≤ pref) + (htail : + n ≤ selectedBadPairScale K a t α q m n → + 1 ≤ lam → + μ.real (badPairEvent H t α q m n) ≤ + pref * Real.exp (-(lam ^ η))) : + μ.real (crudePairBranchEvent H K a t α q m n) ≤ + softPairTail pref lam η := by + by_cases hcrude : n ≤ selectedBadPairScale K a t α q m n + · by_cases hlam : 1 ≤ lam + · have hmono : + μ.real (crudePairBranchEvent H K a t α q m n) ≤ + μ.real (badPairEvent H t α q m n) := + measureReal_mono (μ := μ) (by + intro ω hω + exact hω.2) + exact + hmono.trans + ((htail hcrude hlam).trans + (pref_mul_exp_le_softPairTail_of_one_le_lam hpref hlam)) + · exact + (measureReal_le_one + (μ := μ) (s := crudePairBranchEvent H K a t α q m n)).trans + (one_le_softPairTail_of_not_one_le_lam hlam) + · have hempty : crudePairBranchEvent H K a t α q m n = ∅ := by + ext ω + simp [crudePairBranchEvent, hcrude] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + dsimp [softPairTail] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + +theorem measureReal_badPairEvent_le_soft_two_branch + {μ : Measure Ω} [IsProbabilityMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q m n : ℕ} + {prefHigh lamHigh ηHigh prefCrude lamCrude ηCrude : ℝ} + (hprefHigh : 0 ≤ prefHigh) (hprefCrude : 0 ≤ prefCrude) + (hhigh : + selectedBadPairScale K a t α q m n < n → + 1 ≤ lamHigh → + μ.real (badPairEvent H t α q m n) ≤ + prefHigh * Real.exp (-(lamHigh ^ ηHigh))) + (hcrude : + n ≤ selectedBadPairScale K a t α q m n → + 1 ≤ lamCrude → + μ.real (badPairEvent H t α q m n) ≤ + prefCrude * Real.exp (-(lamCrude ^ ηCrude))) : + μ.real (badPairEvent H t α q m n) ≤ + softPairTail prefHigh lamHigh ηHigh + + softPairTail prefCrude lamCrude ηCrude := by + calc + μ.real (badPairEvent H t α q m n) + ≤ μ.real + (highPairBranchEvent H K a t α q m n ∪ + crudePairBranchEvent H K a t α q m n) := + measureReal_mono (μ := μ) + (badPairEvent_subset_pair_branch_union + (H := H) (K := K) (a := a) (t := t) (α := α) + (q := q) (m := m) (n := n)) + _ ≤ μ.real (highPairBranchEvent H K a t α q m n) + + μ.real (crudePairBranchEvent H K a t α q m n) := + measureReal_union_le _ _ + _ ≤ softPairTail prefHigh lamHigh ηHigh + + softPairTail prefCrude lamCrude ηCrude := by + exact add_le_add + (measureReal_highPairBranchEvent_le_softTail + (μ := μ) (H := H) (K := K) (a := a) (t := t) + (α := α) (q := q) (m := m) (n := n) + hprefHigh hhigh) + (measureReal_crudePairBranchEvent_le_softTail + (μ := μ) (H := H) (K := K) (a := a) (t := t) + (α := α) (q := q) (m := m) (n := n) + hprefCrude hcrude) + +/-- Concrete fixed-pair two-branch estimate for the shifted finite-probe +envelope. The two branches are still expressed with their raw tail parameters; +the next deterministic step lowers these parameters to the manuscript +`3^(b*q)` and `3^(t*q)` scales before summing. -/ +theorem measureReal_shiftedBadPairEvent_quenchedProbeEnvelope_le_soft_two_branch + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let crudeLam : ℝ := T / crudeScale + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + n < m → q ≤ m → + P.real (badPairEvent Hshift t αbad q m n) ≤ + softPairTail pref highLam tau + + softPairTail pref crudeLam σ := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hhighRaw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + obtain ⟨Ccrude, hCcrude, hcrudeRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hnm hqm + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let crudeLam : ℝ := T / crudeScale + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + refine + measureReal_badPairEvent_le_soft_two_branch + (μ := P) (H := Hshift) (K := K) (a := a) (t := t) + (α := αbad) (q := q) (m := m) (n := n) + (prefHigh := pref) (lamHigh := highLam) (ηHigh := tau) + (prefCrude := pref) (lamCrude := crudeLam) (ηCrude := σ) + hpref hpref ?_ ?_ + · intro hell hlam + have hraw := + hhighRaw (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have htail : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(highLam ^ tau))) := by + simpa [K, x, ell, selectedBadPairScale, N0, Hshift, D, S, tau, + highScale, T, highLam] using + hraw hell hnm hqm hlam + simpa [pref, mul_assoc] using htail + · intro _hcrude hlam + have hraw := + hcrudeRaw (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have htail : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(crudeLam ^ σ))) := by + simpa [K, Hshift, x, D, S, crudeScale, T, crudeLam] using + hraw hnm hqm hlam + simpa [pref, mul_assoc] using htail + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGap.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGap.lean new file mode 100644 index 0000000000..97997c1ade --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGap.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailSelected + +/-! # Bad Scale Prefactor Gap -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open Filter +open scoped Topology + +/-! +# Prefactor absorption for stretched-exponential bad-scale tails + +The selected bad-scale tail still has a deterministic prefactor-gap condition. +This file proves the real-variable fact behind its eventual discharge: +linear/exponential-in-`q` prefactors are absorbed by a geometric +stretched-exponential gap. +-/ + +noncomputable section + +theorem tendsto_exp_neg_const_mul_pow + {c ρ : ℝ} (hc : 0 < c) (hρ : 1 < ρ) : + Tendsto (fun n : ℕ => Real.exp (-(c * ρ ^ n))) atTop (𝓝 0) := by + have hpow : Tendsto (fun n : ℕ => ρ ^ n) atTop atTop := + tendsto_pow_atTop_atTop_of_one_lt hρ + have hmul : Tendsto (fun n : ℕ => c * ρ ^ n) atTop atTop := + hpow.const_mul_atTop hc + have hneg : Tendsto (fun n : ℕ => -(c * ρ ^ n)) atTop atBot := + tendsto_neg_atTop_atBot.comp hmul + exact Real.tendsto_exp_atBot.comp hneg + +private theorem tendsto_linear_ratio : + Tendsto (fun n : ℕ => ((n : ℝ) + 2) / ((n : ℝ) + 1)) atTop (𝓝 1) := by + have hinv : + Tendsto (fun n : ℕ => (1 : ℝ) / ((n : ℝ) + 1)) atTop (𝓝 0) := + tendsto_one_div_add_atTop_nhds_zero_nat + have hcongr : + (fun n : ℕ => ((n : ℝ) + 2) / ((n : ℝ) + 1)) = + fun n : ℕ => 1 + (1 : ℝ) / ((n : ℝ) + 1) := by + funext n + have hden : (n : ℝ) + 1 ≠ 0 := by positivity + field_simp [hden] + ring + rw [hcongr] + simpa using (tendsto_const_nhds.add hinv) + +theorem summable_linear_pow_mul_exp_neg_const_mul_pow + {M W c ρ : ℝ} (hM : 0 < M) (hW : 0 < W) + (hc : 0 < c) (hρ : 1 < ρ) : + Summable fun n : ℕ => + M * (((n : ℝ) + 1) * W ^ n) * Real.exp (-(c * ρ ^ n)) := by + let f : ℕ → ℝ := + fun n => M * (((n : ℝ) + 1) * W ^ n) * Real.exp (-(c * ρ ^ n)) + have hf_pos : ∀ n : ℕ, 0 < f n := by + intro n + dsimp [f] + positivity + refine summable_of_ratio_test_tendsto_lt_one (f := f) (l := 0) + (by norm_num) ?_ ?_ + · filter_upwards with n + exact ne_of_gt (hf_pos n) + · have hratio_eq : + (fun n : ℕ => ‖f (n + 1)‖ / ‖f n‖) =ᶠ[atTop] + fun n : ℕ => + (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + W * Real.exp (-(c * (ρ - 1) * ρ ^ n)) := by + filter_upwards with n + have hn_pos : 0 < (n : ℝ) + 1 := by positivity + have hW_pow_pos : 0 < W ^ n := pow_pos hW n + have hρ_pow_pos : 0 < ρ ^ n := pow_pos (lt_trans zero_lt_one hρ) n + have hf_n_pos := hf_pos n + have hf_succ_pos := hf_pos (n + 1) + have hW_ne : W ≠ 0 := hW.ne' + have hW_pow_ne : W ^ n ≠ 0 := ne_of_gt hW_pow_pos + have hM_ne : M ≠ 0 := hM.ne' + calc + ‖f (n + 1)‖ / ‖f n‖ + = f (n + 1) / f n := by + rw [Real.norm_eq_abs, Real.norm_eq_abs, + abs_of_pos hf_succ_pos, abs_of_pos hf_n_pos] + _ = (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + W * Real.exp (-(c * (ρ - 1) * ρ ^ n)) := by + dsimp [f] + rw [pow_succ W n, pow_succ ρ n] + field_simp [hn_pos.ne', hM_ne, hW_ne, hW_pow_ne, Real.exp_ne_zero] + have hexp_eq : + Real.exp (-(c * ρ ^ n * ρ)) = + Real.exp (-(c * ρ ^ n)) * + Real.exp (-(c * (ρ - 1) * ρ ^ n)) := by + rw [← Real.exp_add] + congr 1 + ring + rw [hexp_eq] + simp only [Nat.cast_add, Nat.cast_one] + ring_nf + refine Tendsto.congr' hratio_eq.symm ?_ + have hfrac := tendsto_linear_ratio + have hexp := + tendsto_exp_neg_const_mul_pow + (c := c * (ρ - 1)) (ρ := ρ) + (mul_pos hc (sub_pos.mpr hρ)) hρ + have hprod : + Tendsto + (fun n : ℕ => + (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + W * Real.exp (-(c * (ρ - 1) * ρ ^ n))) + atTop (𝓝 (1 * W * 0)) := + (hfrac.mul tendsto_const_nhds).mul hexp + simpa using hprod + +theorem tendsto_linear_pow_mul_exp_neg_const_mul_pow + {M W c ρ : ℝ} (hM : 0 ≤ M) (hW : 0 < W) + (hc : 0 < c) (hρ : 1 < ρ) : + Tendsto (fun n : ℕ => + M * (((n : ℝ) + 1) * W ^ n) * Real.exp (-(c * ρ ^ n))) atTop (𝓝 0) := by + by_cases hM_zero : M = 0 + · simp [hM_zero] + · have hM_pos : 0 < M := lt_of_le_of_ne hM (Ne.symm hM_zero) + exact (summable_linear_pow_mul_exp_neg_const_mul_pow + hM_pos hW hc hρ).tendsto_atTop_zero + +/-- A linear/exponential prefactor is eventually bounded by the exponential of +a positive geometric gap. -/ +theorem exists_forall_ge_linear_pow_le_exp_const_mul_pow + {M W c ρ : ℝ} (hM : 0 ≤ M) (hW : 0 < W) + (hc : 0 < c) (hρ : 1 < ρ) : + ∃ Q : ℕ, ∀ q : ℕ, Q ≤ q → + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (c * ρ ^ q) := by + have htend := + tendsto_linear_pow_mul_exp_neg_const_mul_pow + (M := M) (W := W) (c := c) (ρ := ρ) hM hW hc hρ + have hevent : + ∀ᶠ q : ℕ in atTop, + M * (((q : ℝ) + 1) * W ^ q) * + Real.exp (-(c * ρ ^ q)) ≤ 1 := + htend.eventually (Iic_mem_nhds (by norm_num : (0 : ℝ) < 1)) + obtain ⟨Q, hQ⟩ := eventually_atTop.1 hevent + refine ⟨Q, ?_⟩ + intro q hq + have hq' := hQ q hq + have hexp_pos : 0 < Real.exp (c * ρ ^ q) := Real.exp_pos _ + have hmul := + mul_le_mul_of_nonneg_right hq' hexp_pos.le + have hcancel : + Real.exp (-(c * ρ ^ q)) * Real.exp (c * ρ ^ q) = 1 := by + rw [← Real.exp_add] + ring_nf + simp + calc + M * (((q : ℝ) + 1) * W ^ q) + = M * (((q : ℝ) + 1) * W ^ q) * + Real.exp (-(c * ρ ^ q)) * Real.exp (c * ρ ^ q) := by + rw [mul_assoc, hcancel, mul_one] + _ ≤ 1 * Real.exp (c * ρ ^ q) := hmul + _ = Real.exp (c * ρ ^ q) := by ring + +theorem exists_forall_ge_prefactor_le_exp_gap_of_linear_pow_bound + {pref gap : ℕ → ℝ} {M W c ρ : ℝ} + (hM : 0 ≤ M) (hW : 0 < W) (hc : 0 < c) (hρ : 1 < ρ) + (hpref : ∀ q : ℕ, pref q ≤ M * (((q : ℝ) + 1) * W ^ q)) + (hgap : ∀ q : ℕ, c * ρ ^ q ≤ gap q) : + ∃ Q : ℕ, ∀ q : ℕ, Q ≤ q → pref q ≤ Real.exp (gap q) := by + obtain ⟨Q, hQ⟩ := + exists_forall_ge_linear_pow_le_exp_const_mul_pow + (M := M) (W := W) (c := c) (ρ := ρ) hM hW hc hρ + refine ⟨Q, ?_⟩ + intro q hq + calc + pref q ≤ M * (((q : ℝ) + 1) * W ^ q) := hpref q + _ ≤ Real.exp (c * ρ ^ q) := hQ q hq + _ ≤ Real.exp (gap q) := Real.exp_le_exp.mpr (hgap q) + +theorem rpow_three_nat_div_eq_inv_rpow_mul + {B η : ℝ} (q : ℕ) (hB : 0 < B) : + (((3 : ℝ) ^ (q : ℝ) / B) ^ η) = + B ^ (-η) * (((3 : ℝ) ^ η) ^ q) := by + have h3 : (0 : ℝ) < 3 := by norm_num + have h3q_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos h3 _).le + calc + (((3 : ℝ) ^ (q : ℝ) / B) ^ η) + = ((3 : ℝ) ^ (q : ℝ)) ^ η / B ^ η := by + exact Real.div_rpow h3q_nonneg hB.le η + _ = (3 : ℝ) ^ ((q : ℝ) * η) / B ^ η := by + rw [← Real.rpow_mul h3.le] + _ = (3 : ℝ) ^ (η * (q : ℝ)) * B ^ (-η) := by + rw [Real.rpow_neg hB.le] + ring_nf + _ = B ^ (-η) * (((3 : ℝ) ^ η) ^ q) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul h3.le] + ring_nf + +theorem rpow_three_nat_div_gap_eq + {Btail Blead η : ℝ} (q : ℕ) (hBlead : 0 < Blead) (hBtail : 0 < Btail) : + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) = + (Blead ^ (-η) - Btail ^ (-η)) * (((3 : ℝ) ^ η) ^ q) := by + rw [rpow_three_nat_div_eq_inv_rpow_mul q hBlead, + rpow_three_nat_div_eq_inv_rpow_mul q hBtail] + ring + +theorem inv_rpow_sub_pos_of_lt + {Btail Blead η : ℝ} + (hBlead : 0 < Blead) (hBtail : 0 < Btail) + (hη : 0 < η) (hlt : Blead < Btail) : + 0 < Blead ^ (-η) - Btail ^ (-η) := by + have hpow_lt : Blead ^ η < Btail ^ η := + Real.rpow_lt_rpow hBlead.le hlt hη + have hpowB_pos : 0 < Blead ^ η := Real.rpow_pos_of_pos hBlead η + have hpowT_pos : 0 < Btail ^ η := Real.rpow_pos_of_pos hBtail η + have hinv_lt : (Btail ^ η)⁻¹ < (Blead ^ η)⁻¹ := + (inv_lt_inv₀ hpowT_pos hpowB_pos).2 hpow_lt + rw [Real.rpow_neg hBlead.le, Real.rpow_neg hBtail.le] + linarith + +theorem geometric_gap_le_rpow_three_nat_div_gap + {Btail Blead η c ρ : ℝ} {q : ℕ} + (hBlead : 0 < Blead) (hBtail : 0 < Btail) + (hc : c ≤ Blead ^ (-η) - Btail ^ (-η)) + (hρ : ρ ≤ (3 : ℝ) ^ η) + (hc_nonneg : 0 ≤ c) (hρ_nonneg : 0 ≤ ρ) : + c * ρ ^ q ≤ + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) := by + have hbase_nonneg : 0 ≤ (3 : ℝ) ^ η := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) η).le + have hpow_le : ρ ^ q ≤ ((3 : ℝ) ^ η) ^ q := + pow_le_pow_left₀ hρ_nonneg hρ q + calc + c * ρ ^ q + ≤ (Blead ^ (-η) - Btail ^ (-η)) * (((3 : ℝ) ^ η) ^ q) := by + exact mul_le_mul hc hpow_le (pow_nonneg hρ_nonneg q) + (le_trans hc_nonneg hc) + _ = + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) := by + rw [rpow_three_nat_div_gap_eq q hBlead hBtail] + +theorem max_zero_mul_le_mul_max_zero + {a c : ℝ} (ha : 0 ≤ a) : + max 0 (a * c) ≤ a * max 0 c := by + by_cases hc : c ≤ 0 + · have hac : a * c ≤ 0 := mul_nonpos_of_nonneg_of_nonpos ha hc + have hleft : max 0 (a * c) = 0 := max_eq_left hac + rw [hleft] + exact mul_nonneg ha (le_max_left 0 c) + · have hc_nonneg : 0 ≤ c := le_of_not_ge hc + have hleft : max 0 (a * c) = a * c := + max_eq_right (mul_nonneg ha hc_nonneg) + have hright : max 0 c = c := max_eq_right hc_nonneg + rw [hleft, hright] + +theorem selected_prefactor_le_linear_pow + {Ctop Cbottom S Kbottom Kcrude w W M : ℝ} {q : ℕ} + (hw_nonneg : 0 ≤ w) (hW_one : 1 ≤ W) (hwW : w ≤ W) + (hM : + max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude) ≤ M) : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + M * ((((q : ℝ) + 1) * W ^ q)) := by + let F : ℝ := ((q : ℝ) + 1) * W ^ q + have hqplus_nonneg : 0 ≤ ((q + 1 : ℕ) : ℝ) := by positivity + have hqplus_eq : ((q + 1 : ℕ) : ℝ) = (q : ℝ) + 1 := by norm_num + have hW_nonneg : 0 ≤ W := le_trans zero_le_one hW_one + have hWq_nonneg : 0 ≤ W ^ q := pow_nonneg hW_nonneg q + have hwq_nonneg : 0 ≤ w ^ q := pow_nonneg hw_nonneg q + have hwq_le : w ^ q ≤ W ^ q := pow_le_pow_left₀ hw_nonneg hwW q + have hF_nonneg : 0 ≤ F := mul_nonneg (by positivity) hWq_nonneg + have hF_one : 1 ≤ F := by + have hq_one : 1 ≤ (q : ℝ) + 1 := by + have hq_nonneg : 0 ≤ (q : ℝ) := by positivity + linarith + have hWq_one : 1 ≤ W ^ q := one_le_pow₀ hW_one + have hmul := mul_le_mul hq_one hWq_one zero_le_one + (by linarith : 0 ≤ (q : ℝ) + 1) + simpa [F] using hmul + have htop : + max 0 Ctop ≤ F * max 0 Ctop := by + have hcoef : 0 ≤ max 0 Ctop := le_max_left 0 Ctop + nlinarith + have hbottom₁ : + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) ≤ + F * max 0 (Cbottom * Kbottom) := by + have ha_nonneg : 0 ≤ ((q + 1 : ℕ) : ℝ) * w ^ q := + mul_nonneg hqplus_nonneg hwq_nonneg + have hrewrite : + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom = + (((q + 1 : ℕ) : ℝ) * w ^ q) * (Cbottom * Kbottom) := by ring + rw [hrewrite] + calc + max 0 ((((q + 1 : ℕ) : ℝ) * w ^ q) * (Cbottom * Kbottom)) + ≤ (((q + 1 : ℕ) : ℝ) * w ^ q) * + max 0 (Cbottom * Kbottom) := + max_zero_mul_le_mul_max_zero ha_nonneg + _ ≤ F * max 0 (Cbottom * Kbottom) := by + have hfactor : + ((q + 1 : ℕ) : ℝ) * w ^ q ≤ F := by + dsimp [F] + rw [hqplus_eq] + exact mul_le_mul_of_nonneg_left hwq_le (by positivity) + exact mul_le_mul_of_nonneg_right hfactor + (le_max_left 0 (Cbottom * Kbottom)) + have hbottom₂ : + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + F * max 0 (S * Kcrude) := by + have ha_nonneg : 0 ≤ ((q + 1 : ℕ) : ℝ) * w ^ q := + mul_nonneg hqplus_nonneg hwq_nonneg + have hrewrite : + ((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude = + (((q + 1 : ℕ) : ℝ) * w ^ q) * (S * Kcrude) := by ring + rw [hrewrite] + calc + max 0 ((((q + 1 : ℕ) : ℝ) * w ^ q) * (S * Kcrude)) + ≤ (((q + 1 : ℕ) : ℝ) * w ^ q) * + max 0 (S * Kcrude) := + max_zero_mul_le_mul_max_zero ha_nonneg + _ ≤ F * max 0 (S * Kcrude) := by + have hfactor : + ((q + 1 : ℕ) : ℝ) * w ^ q ≤ F := by + dsimp [F] + rw [hqplus_eq] + exact mul_le_mul_of_nonneg_left hwq_le (by positivity) + exact mul_le_mul_of_nonneg_right hfactor + (le_max_left 0 (S * Kcrude)) + calc + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) + ≤ F * max 0 Ctop + F * max 0 (Cbottom * Kbottom) + + F * max 0 (S * Kcrude) := by + linarith + _ = F * (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 (S * Kcrude)) := by ring + _ ≤ F * M := mul_le_mul_of_nonneg_left hM hF_nonneg + _ = M * (((q : ℝ) + 1) * W ^ q) := by + dsimp [F] + ring + +/-- Concrete eventual prefactor gap for the selected bad-scale component +prefactors. -/ +theorem exists_forall_ge_selected_prefactor_gap + {Ctop Cbottom S Kbottom Kcrude w Blead Btail η : ℝ} + (hBlead : 0 < Blead) (hBtail : 0 < Btail) + (hη : 0 < η) (hlt : Blead < Btail) (hw_nonneg : 0 ≤ w) : + ∃ Q : ℕ, ∀ q : ℕ, Q ≤ q → + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude)) + let c : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρ : ℝ := (3 : ℝ) ^ η + have hW_pos : 0 < W := by + dsimp [W] + exact lt_of_lt_of_le zero_lt_one (le_max_left 1 w) + have hW_one : 1 ≤ W := by + dsimp [W] + exact le_max_left 1 w + have hwW : w ≤ W := by + dsimp [W] + exact le_max_right 1 w + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact le_trans zero_le_one (le_max_left 1 _) + have hM_bound : + max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude) ≤ M := by + dsimp [M] + exact le_max_right 1 _ + have hc_pos : 0 < c := by + simpa [c] using inv_rpow_sub_pos_of_lt hBlead hBtail hη hlt + have hρ_gt : 1 < ρ := by + dsimp [ρ] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη + have hρ_nonneg : 0 ≤ ρ := le_of_lt (lt_trans zero_lt_one hρ_gt) + obtain ⟨Q, hQ⟩ := + exists_forall_ge_prefactor_le_exp_gap_of_linear_pow_bound + (pref := fun q : ℕ => + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude)) + (gap := fun q : ℕ => + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + (M := M) (W := W) (c := c) (ρ := ρ) + hM_nonneg hW_pos hc_pos hρ_gt + (by + intro q + exact selected_prefactor_le_linear_pow + (Ctop := Ctop) (Cbottom := Cbottom) (S := S) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (W := W) (M := M) (q := q) + hw_nonneg hW_one hwW hM_bound) + (by + intro q + exact geometric_gap_le_rpow_three_nat_div_gap + (Blead := Blead) (Btail := Btail) (η := η) + (c := c) (ρ := ρ) (q := q) + hBlead hBtail (le_rfl : c ≤ Blead ^ (-η) - Btail ^ (-η)) + (le_rfl : ρ ≤ (3 : ℝ) ^ η) hc_pos.le hρ_nonneg) + exact ⟨Q, hQ⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGapQuantitative.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGapQuantitative.lean new file mode 100644 index 0000000000..57ee879cc5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScalePrefactorGapQuantitative.lean @@ -0,0 +1,404 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGap + +/-! # Bad Scale Prefactor Gap Quantitative -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open Filter +open scoped Topology + +/-! +# Quantitative prefactor absorption + +The earlier prefactor absorption lemma used a `Tendsto` argument and returned +only an eventual threshold. This file keeps the same deterministic +absorption, but makes the law-dependent part of the threshold explicit through +`max 0 (-log c)`, where `c` is the geometric gap coefficient. Constants +coming from the finite probe family remain in one law-independent natural +threshold. +-/ + +noncomputable section + +theorem linear_le_exp_linear_eventually + {C γ : ℝ} (hC : 0 ≤ C) (hγ : 0 < γ) : + ∃ R : ℕ, ∀ q : ℕ, R ≤ q → C * (q : ℝ) ≤ Real.exp (γ * (q : ℝ)) := by + by_cases hC_zero : C = 0 + · refine ⟨0, ?_⟩ + intro q _ + simp [hC_zero, (Real.exp_pos (γ * (q : ℝ))).le] + · have hC_pos : 0 < C := lt_of_le_of_ne hC (Ne.symm hC_zero) + have hγ_ne : γ ≠ 0 := hγ.ne' + have hscale : + Tendsto + (fun q : ℕ => (C / γ) * ((γ * (q : ℝ)) * Real.exp (-(γ * (q : ℝ))))) + atTop (𝓝 0) := by + have harg : Tendsto (fun q : ℕ => γ * (q : ℝ)) atTop atTop := by + exact tendsto_natCast_atTop_atTop.const_mul_atTop hγ + have hbase : + Tendsto (fun x : ℝ => x ^ (1 : ℕ) * Real.exp (-x)) atTop (𝓝 0) := + Real.tendsto_pow_mul_exp_neg_atTop_nhds_zero 1 + have hcomp : + Tendsto + (fun q : ℕ => (γ * (q : ℝ)) ^ (1 : ℕ) * + Real.exp (-(γ * (q : ℝ)))) atTop (𝓝 0) := + hbase.comp harg + simpa using hcomp.const_mul (C / γ) + have hevent : + ∀ᶠ q : ℕ in atTop, + (C / γ) * ((γ * (q : ℝ)) * Real.exp (-(γ * (q : ℝ)))) ≤ 1 := + hscale.eventually (Iic_mem_nhds (by norm_num : (0 : ℝ) < 1)) + obtain ⟨R, hR⟩ := eventually_atTop.1 hevent + refine ⟨R, ?_⟩ + intro q hq + have hq' := hR q hq + have hexp_pos : 0 < Real.exp (γ * (q : ℝ)) := Real.exp_pos _ + have hmul := mul_le_mul_of_nonneg_right hq' hexp_pos.le + have hcancel : + Real.exp (-(γ * (q : ℝ))) * Real.exp (γ * (q : ℝ)) = 1 := by + rw [← Real.exp_add] + ring_nf + simp + have hrewrite : + (C / γ) * ((γ * (q : ℝ)) * Real.exp (-(γ * (q : ℝ)))) * + Real.exp (γ * (q : ℝ)) = + C * (q : ℝ) := by + calc + (C / γ) * ((γ * (q : ℝ)) * Real.exp (-(γ * (q : ℝ)))) * + Real.exp (γ * (q : ℝ)) + = (C / γ) * (γ * (q : ℝ)) * + (Real.exp (-(γ * (q : ℝ))) * Real.exp (γ * (q : ℝ))) := by + ring + _ = (C / γ) * (γ * (q : ℝ)) * 1 := by rw [hcancel] + _ = C * (q : ℝ) := by + field_simp [hγ_ne] + calc + C * (q : ℝ) + = (C / γ) * ((γ * (q : ℝ)) * Real.exp (-(γ * (q : ℝ)))) * + Real.exp (γ * (q : ℝ)) := hrewrite.symm + _ ≤ 1 * Real.exp (γ * (q : ℝ)) := hmul + _ = Real.exp (γ * (q : ℝ)) := by ring + +theorem linear_prefactor_le_exp_linear + {M W C₀ : ℝ} {q : ℕ} + (hM : 1 ≤ M) (hW : 1 ≤ W) + (hlogM : Real.log M ≤ (q : ℝ)) + (hC₀ : 2 + Real.log W ≤ C₀) : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (C₀ * (q : ℝ)) := by + have hM_pos : 0 < M := lt_of_lt_of_le zero_lt_one hM + have hW_pos : 0 < W := lt_of_lt_of_le zero_lt_one hW + have hq_nonneg : 0 ≤ (q : ℝ) := by positivity + have hM_le : M ≤ Real.exp (q : ℝ) := by + calc + M = Real.exp (Real.log M) := by rw [Real.exp_log hM_pos] + _ ≤ Real.exp (q : ℝ) := Real.exp_le_exp.mpr hlogM + have hqplus_le : (q : ℝ) + 1 ≤ Real.exp (q : ℝ) := by + simpa [add_comm] using Real.add_one_le_exp (q : ℝ) + have hWpow_eq : W ^ q = Real.exp ((q : ℝ) * Real.log W) := by + rw [← Real.rpow_natCast] + rw [Real.rpow_def_of_pos hW_pos] + ring_nf + have hprod : + M * (((q : ℝ) + 1) * W ^ q) ≤ + Real.exp (q : ℝ) * (Real.exp (q : ℝ) * + Real.exp ((q : ℝ) * Real.log W)) := by + rw [hWpow_eq] + have hinner' : + ((q : ℝ) + 1) * Real.exp ((q : ℝ) * Real.log W) ≤ + Real.exp (q : ℝ) * Real.exp ((q : ℝ) * Real.log W) := + mul_le_mul_of_nonneg_right hqplus_le (Real.exp_pos _).le + have hinner_nonneg : + 0 ≤ ((q : ℝ) + 1) * Real.exp ((q : ℝ) * Real.log W) := by + positivity + exact mul_le_mul hM_le hinner' + hinner_nonneg (Real.exp_pos _).le + calc + M * (((q : ℝ) + 1) * W ^ q) + ≤ Real.exp (q : ℝ) * (Real.exp (q : ℝ) * + Real.exp ((q : ℝ) * Real.log W)) := hprod + _ = Real.exp ((2 + Real.log W) * (q : ℝ)) := by + rw [← Real.exp_add, ← Real.exp_add] + congr 1 + ring + _ ≤ Real.exp (C₀ * (q : ℝ)) := + Real.exp_le_exp.mpr (mul_le_mul_of_nonneg_right hC₀ hq_nonneg) + +theorem exp_half_log_mul_le_const_mul_pow_of_log_gap + {c ρ : ℝ} {q : ℕ} + (hc : 0 < c) (hρ : 1 < ρ) + (hq : + (2 * max 0 (-(Real.log c))) / Real.log ρ ≤ (q : ℝ)) : + Real.exp ((Real.log ρ / 2) * (q : ℝ)) ≤ c * ρ ^ q := by + have hρ_pos : 0 < ρ := lt_trans zero_lt_one hρ + have hlogρ_pos : 0 < Real.log ρ := Real.log_pos hρ + have hU_log : -(Real.log c) ≤ max 0 (-(Real.log c)) := + le_max_right 0 (-(Real.log c)) + have hU_le : + max 0 (-(Real.log c)) ≤ (Real.log ρ / 2) * (q : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hq (hlogρ_pos.le) + have hlog_ne : Real.log ρ ≠ 0 := hlogρ_pos.ne' + field_simp [hlog_ne] at hmul + linarith + have hlogc_lower : -(max 0 (-(Real.log c))) ≤ Real.log c := by + linarith + have hmain : + (Real.log ρ / 2) * (q : ℝ) ≤ Real.log c + (q : ℝ) * Real.log ρ := by + nlinarith + calc + Real.exp ((Real.log ρ / 2) * (q : ℝ)) + ≤ Real.exp (Real.log c + (q : ℝ) * Real.log ρ) := + Real.exp_le_exp.mpr hmain + _ = c * ρ ^ q := by + rw [Real.exp_add, Real.exp_log hc] + rw [← Real.rpow_natCast, Real.rpow_def_of_pos hρ_pos] + ring_nf + +theorem linear_prefactor_le_exp_const_mul_pow_of_large + {M W C₀ c ρ : ℝ} {R q : ℕ} + (hM : 1 ≤ M) (hW : 1 ≤ W) + (hc : 0 < c) (hρ : 1 < ρ) + (hC₀ : 2 + Real.log W ≤ C₀) + (hRlin : ∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ Real.exp ((Real.log ρ / 2) * (q : ℝ))) + (hqM : Nat.ceil (max 0 (Real.log M)) ≤ q) + (hqR : R ≤ q) + (hqc : + Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ) ≤ q) : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (c * ρ ^ q) := by + have hlogM : Real.log M ≤ (q : ℝ) := by + calc + Real.log M ≤ max 0 (Real.log M) := le_max_right 0 (Real.log M) + _ ≤ (Nat.ceil (max 0 (Real.log M)) : ℝ) := Nat.le_ceil _ + _ ≤ (q : ℝ) := by exact_mod_cast hqM + have hpref_linear : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (C₀ * (q : ℝ)) := + linear_prefactor_le_exp_linear hM hW hlogM hC₀ + have hCq_le : C₀ * (q : ℝ) ≤ Real.exp ((Real.log ρ / 2) * (q : ℝ)) := + hRlin q hqR + have hthreshold : + (2 * max 0 (-(Real.log c))) / Real.log ρ ≤ (q : ℝ) := by + calc + (2 * max 0 (-(Real.log c))) / Real.log ρ + ≤ (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ) : ℝ) := + Nat.le_ceil _ + _ ≤ (q : ℝ) := by exact_mod_cast hqc + have hexp_le : + Real.exp ((Real.log ρ / 2) * (q : ℝ)) ≤ c * ρ ^ q := + exp_half_log_mul_le_const_mul_pow_of_log_gap hc hρ hthreshold + exact hpref_linear.trans + (Real.exp_le_exp.mpr (hCq_le.trans hexp_le)) + +/-- Quantitative version of `exists_forall_ge_selected_prefactor_gap`. The +integer `R` is law-independent; all law dependence in the threshold is carried +by the explicit term involving `-log c`. -/ +theorem exists_forall_ge_selected_prefactor_gap_quantitative + {Ctop Cbottom S Kbottom Kcrude w Blead Btail η : ℝ} + (hBlead : 0 < Blead) (hBtail : 0 < Btail) + (hη : 0 < η) (hlt : Blead < Btail) (hw_nonneg : 0 ≤ w) : + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude)) + let c : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρ : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ Real.exp ((Real.log ρ / 2) * (q : ℝ))) ∧ + ∀ q : ℕ, + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))) ≤ q → + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + intro W M c ρ C₀ + have hW_one : 1 ≤ W := by + dsimp [W] + exact le_max_left 1 w + have hW_pos : 0 < W := lt_of_lt_of_le zero_lt_one hW_one + have hwW : w ≤ W := by + dsimp [W] + exact le_max_right 1 w + have hM_one : 1 ≤ M := by + dsimp [M] + exact le_max_left 1 _ + have hM_bound : + max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude) ≤ M := by + dsimp [M] + exact le_max_right 1 _ + have hc_pos : 0 < c := by + simpa [c] using inv_rpow_sub_pos_of_lt hBlead hBtail hη hlt + have hρ_gt : 1 < ρ := by + dsimp [ρ] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη + have hρ_nonneg : 0 ≤ ρ := le_of_lt (lt_trans zero_lt_one hρ_gt) + have hC₀_nonneg : 0 ≤ C₀ := by + have hlogW_nonneg : 0 ≤ Real.log W := Real.log_nonneg hW_one + dsimp [C₀] + linarith + obtain ⟨R, hR⟩ := + linear_le_exp_linear_eventually + (C := C₀) (γ := Real.log ρ / 2) + hC₀_nonneg (by + have hlogρ_pos : 0 < Real.log ρ := Real.log_pos hρ_gt + positivity) + refine ⟨R, hR, ?_⟩ + intro q hq + have hqM : + Nat.ceil (max 0 (Real.log M)) ≤ q := + (le_max_left _ _).trans hq + have hqR : R ≤ q := + (le_max_left R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))).trans + ((le_max_right _ _).trans hq) + have hqc : + Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ) ≤ q := + (le_max_right R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))).trans + ((le_max_right _ _).trans hq) + have hpref_linear : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + M * (((q : ℝ) + 1) * W ^ q) := + selected_prefactor_le_linear_pow + (Ctop := Ctop) (Cbottom := Cbottom) (S := S) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (W := W) (M := M) (q := q) + hw_nonneg hW_one hwW hM_bound + have hpref_exp : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (c * ρ ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := M) (W := W) (C₀ := C₀) (c := c) (ρ := ρ) + (R := R) (q := q) + hM_one hW_one hc_pos hρ_gt + (le_rfl : 2 + Real.log W ≤ C₀) hR hqM hqR hqc + have hgap : + c * ρ ^ q ≤ + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) := + geometric_gap_le_rpow_three_nat_div_gap + (Blead := Blead) (Btail := Btail) (η := η) + (c := c) (ρ := ρ) (q := q) + hBlead hBtail (le_rfl : c ≤ Blead ^ (-η) - Btail ^ (-η)) + (le_rfl : ρ ≤ (3 : ℝ) ^ η) hc_pos.le hρ_nonneg + exact hpref_linear.trans + (hpref_exp.trans (Real.exp_le_exp.mpr hgap)) + +/-- Uniform-in-denominator version of the quantitative prefactor gap. The +integer `R` is selected before the geometric gap coefficient, hence before any +probability law in downstream applications. -/ +theorem exists_forall_ge_selected_prefactor_gap_quantitative_uniform + {Ctop Cbottom S Kbottom Kcrude w η : ℝ} + (hη : 0 < η) (hw_nonneg : 0 ≤ w) : + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude)) + let ρ : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ Real.exp ((Real.log ρ / 2) * (q : ℝ))) ∧ + ∀ {Blead Btail : ℝ}, + 0 < Blead → 0 < Btail → Blead < Btail → + let c : ℝ := Blead ^ (-η) - Btail ^ (-η) + ∀ q : ℕ, + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))) ≤ q → + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + intro W M ρ C₀ + have hW_one : 1 ≤ W := by + dsimp [W] + exact le_max_left 1 w + have hW_pos : 0 < W := lt_of_lt_of_le zero_lt_one hW_one + have hwW : w ≤ W := by + dsimp [W] + exact le_max_right 1 w + have hM_one : 1 ≤ M := by + dsimp [M] + exact le_max_left 1 _ + have hM_bound : + max 0 Ctop + max 0 (Cbottom * Kbottom) + max 0 (S * Kcrude) ≤ M := by + dsimp [M] + exact le_max_right 1 _ + have hρ_gt : 1 < ρ := by + dsimp [ρ] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη + have hρ_nonneg : 0 ≤ ρ := le_of_lt (lt_trans zero_lt_one hρ_gt) + have hC₀_nonneg : 0 ≤ C₀ := by + have hlogW_nonneg : 0 ≤ Real.log W := Real.log_nonneg hW_one + dsimp [C₀] + linarith + obtain ⟨R, hR⟩ := + linear_le_exp_linear_eventually + (C := C₀) (γ := Real.log ρ / 2) + hC₀_nonneg (by + have hlogρ_pos : 0 < Real.log ρ := Real.log_pos hρ_gt + positivity) + refine ⟨R, hR, ?_⟩ + intro Blead Btail hBlead hBtail hlt c q hq + have hc_pos : 0 < c := by + simpa [c] using inv_rpow_sub_pos_of_lt hBlead hBtail hη hlt + have hqM : + Nat.ceil (max 0 (Real.log M)) ≤ q := + (le_max_left _ _).trans hq + have hqR : R ≤ q := + (le_max_left R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))).trans + ((le_max_right _ _).trans hq) + have hqc : + Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ) ≤ q := + (le_max_right R (Nat.ceil ((2 * max 0 (-(Real.log c))) / Real.log ρ))).trans + ((le_max_right _ _).trans hq) + have hpref_linear : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * (S * w ^ q) * Kcrude) ≤ + M * (((q : ℝ) + 1) * W ^ q) := + selected_prefactor_le_linear_pow + (Ctop := Ctop) (Cbottom := Cbottom) (S := S) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (W := W) (M := M) (q := q) + hw_nonneg hW_one hwW hM_bound + have hpref_exp : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (c * ρ ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := M) (W := W) (C₀ := C₀) (c := c) (ρ := ρ) + (R := R) (q := q) + hM_one hW_one hc_pos hρ_gt + (le_rfl : 2 + Real.log W ≤ C₀) hR hqM hqR hqc + have hgap : + c * ρ ^ q ≤ + (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) := + geometric_gap_le_rpow_three_nat_div_gap + (Blead := Blead) (Btail := Btail) (η := η) + (c := c) (ρ := ρ) (q := q) + hBlead hBtail (by simp [c]) + (le_rfl : ρ ≤ (3 : ℝ) ^ η) hc_pos.le hρ_nonneg + exact hpref_linear.trans + (hpref_exp.trans (Real.exp_le_exp.mpr hgap)) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleSplit.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleSplit.lean new file mode 100644 index 0000000000..bdb90baed4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleSplit.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability + +/-! # Bad Scale Split -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory + +/-! +# Deterministic splitting of bad-scale events + +This file records the exact trichotomy used in the proof of +Theorem `t.homogenization.quenched`: the localized high range, the crude +bottom range, and the crude complementary top range. +-/ + +noncomputable section + +variable {Ω : Type*} + +/-- The intermediate scale selected for a bad pair in the high-range +argument. -/ +noncomputable def selectedBadPairScale + (K a t α : ℝ) (q m n : ℕ) : ℕ := + let x : ℝ := α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + +/-- High part of a bad-scale event: the selected intermediate scale is +strictly below `n`, so the localized first-quenched estimate applies. -/ +def highBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, + selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +/-- High part in the sharp range where the bad scale lies below the localized +scale. This branch keeps the `q`-scale concentration gain. -/ +def highTopBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, + q ≤ n ∧ + selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +/-- High part in the bottom range. The localized estimate still applies, but +the sharp `q ≤ n` concentration gain is not available. -/ +def highBottomBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, + n ≤ q ∧ + selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +/-- Crude bottom part: the selected localized scale is not available and the +localized scale is below the bad scale. -/ +def crudeBottomBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, + n ≤ q ∧ + ¬ selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +/-- Crude top complement: the bad scale is below `n`, but the selected +intermediate scale is not available below `n`. -/ +def crudeTopBadScaleEvent + (H : ℕ → ℕ → Ω → ℝ) (K a t α : ℝ) (q : ℕ) : Set Ω := + {ω | ∃ m n : ℕ, + q ≤ n ∧ + ¬ selectedBadPairScale K a t α q m n < n ∧ + ω ∈ badPairEvent H t α q m n} + +theorem badScaleEvent_subset_split + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + badScaleEvent H t α q ⊆ + highBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q ∪ + crudeTopBadScaleEvent H K a t α q := by + intro ω hω + rcases hω with ⟨m, n, hnm, hqm, hbad⟩ + have hpair : ω ∈ badPairEvent H t α q m n := by + exact ⟨hnm, hqm, hbad⟩ + by_cases hhigh : selectedBadPairScale K a t α q m n < n + · exact Or.inl (Or.inl ⟨m, n, hhigh, hpair⟩) + · by_cases hnq : n ≤ q + · exact Or.inl (Or.inr ⟨m, n, hnq, hhigh, hpair⟩) + · have hqn : q ≤ n := le_of_lt (Nat.lt_of_not_ge hnq) + exact Or.inr ⟨m, n, hqn, hhigh, hpair⟩ + +theorem badScaleEvent_subset_sharp_split + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + badScaleEvent H t α q ⊆ + highTopBadScaleEvent H K a t α q ∪ + highBottomBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q ∪ + crudeTopBadScaleEvent H K a t α q := by + intro ω hω + rcases hω with ⟨m, n, hnm, hqm, hbad⟩ + have hpair : ω ∈ badPairEvent H t α q m n := by + exact ⟨hnm, hqm, hbad⟩ + by_cases hhigh : selectedBadPairScale K a t α q m n < n + · by_cases hqn : q ≤ n + · exact Or.inl (Or.inl (Or.inl ⟨m, n, hqn, hhigh, hpair⟩)) + · have hnq : n ≤ q := le_of_lt (Nat.lt_of_not_ge hqn) + exact Or.inl (Or.inl (Or.inr ⟨m, n, hnq, hhigh, hpair⟩)) + · by_cases hnq : n ≤ q + · exact Or.inl (Or.inr ⟨m, n, hnq, hhigh, hpair⟩) + · have hqn : q ≤ n := le_of_lt (Nat.lt_of_not_ge hnq) + exact Or.inr ⟨m, n, hqn, hhigh, hpair⟩ + +theorem measureReal_badScaleEvent_le_split + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + μ.real (badScaleEvent H t α q) ≤ + μ.real (highBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + have hsubset := badScaleEvent_subset_split + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (badScaleEvent H t α q) + ≤ μ.real + (highBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q ∪ + crudeTopBadScaleEvent H K a t α q) := + measureReal_mono (μ := μ) hsubset + _ ≤ + μ.real (highBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := + measureReal_union_le _ _ + _ ≤ + (μ.real (highBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q)) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + exact add_le_add (measureReal_union_le _ _) le_rfl + _ = + μ.real (highBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + ring + +theorem measureReal_badScaleEvent_le_sharp_split + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} : + μ.real (badScaleEvent H t α q) ≤ + μ.real (highTopBadScaleEvent H K a t α q) + + μ.real (highBottomBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + have hsubset := badScaleEvent_subset_sharp_split + (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + calc + μ.real (badScaleEvent H t α q) + ≤ μ.real + (highTopBadScaleEvent H K a t α q ∪ + highBottomBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q ∪ + crudeTopBadScaleEvent H K a t α q) := + measureReal_mono (μ := μ) hsubset + _ ≤ + μ.real (highTopBadScaleEvent H K a t α q ∪ + highBottomBadScaleEvent H K a t α q ∪ + crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := + measureReal_union_le _ _ + _ ≤ + (μ.real (highTopBadScaleEvent H K a t α q ∪ + highBottomBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q)) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + exact add_le_add (measureReal_union_le _ _) le_rfl + _ ≤ + ((μ.real (highTopBadScaleEvent H K a t α q) + + μ.real (highBottomBadScaleEvent H K a t α q)) + + μ.real (crudeBottomBadScaleEvent H K a t α q)) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + exact add_le_add + (add_le_add (measureReal_union_le _ _) le_rfl) le_rfl + _ = + μ.real (highTopBadScaleEvent H K a t α q) + + μ.real (highBottomBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := by + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailAssembly.lean new file mode 100644 index 0000000000..251b2b31fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailAssembly.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsTop +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.WeightedExponentialKernel + +/-! # Bad Scale Tail Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Assembling the bad-scale tail from the split components + +This file combines the sharp bad-scale split with the component estimates. It +contains no new probabilistic input: the only ingredients are the four-way +union bound and the deterministic crude-top cutoff. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +/-- Pure assembly of the four split branches of a bad-scale event. -/ +theorem measureReal_badScaleEvent_le_of_component_bounds + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {Rht Rhb Rcb Rct : ℝ} + (hht : μ.real (highTopBadScaleEvent H K a t α q) ≤ Rht) + (hhb : μ.real (highBottomBadScaleEvent H K a t α q) ≤ Rhb) + (hcb : μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ Rcb) + (hct : μ.real (crudeTopBadScaleEvent H K a t α q) ≤ Rct) : + μ.real (badScaleEvent H t α q) ≤ Rht + Rhb + Rcb + Rct := by + calc + μ.real (badScaleEvent H t α q) + ≤ μ.real (highTopBadScaleEvent H K a t α q) + + μ.real (highBottomBadScaleEvent H K a t α q) + + μ.real (crudeBottomBadScaleEvent H K a t α q) + + μ.real (crudeTopBadScaleEvent H K a t α q) := + measureReal_badScaleEvent_le_sharp_split + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + _ ≤ Rht + Rhb + Rcb + Rct := by + linarith + +/-- Assembly of the full bad-scale event when the crude-top branch is empty. -/ +theorem measureReal_badScaleEvent_le_of_component_bounds_crudeTop_zero + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {Rht Rhb Rcb : ℝ} + (hht : μ.real (highTopBadScaleEvent H K a t α q) ≤ Rht) + (hhb : μ.real (highBottomBadScaleEvent H K a t α q) ≤ Rhb) + (hcb : μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ Rcb) + (hct : μ.real (crudeTopBadScaleEvent H K a t α q) = 0) : + μ.real (badScaleEvent H t α q) ≤ Rht + Rhb + Rcb := by + have hfull := + measureReal_badScaleEvent_le_of_component_bounds + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + (Rht := Rht) (Rhb := Rhb) (Rcb := Rcb) (Rct := 0) + hht hhb hcb (by simp [hct]) + linarith + +/-- Full bad-scale bound from the three quantitative component bounds and +the deterministic crude-top cutoff. -/ +theorem measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {Rht Rhb Rcb : ℝ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hq_large : + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + L + 1 < (1 - α / a) * (q : ℝ)) + (hht : μ.real (highTopBadScaleEvent H K a t α q) ≤ Rht) + (hhb : μ.real (highBottomBadScaleEvent H K a t α q) ≤ Rhb) + (hcb : μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ Rcb) : + μ.real (badScaleEvent H t α q) ≤ Rht + Rhb + Rcb := by + have hct : + μ.real (crudeTopBadScaleEvent H K a t α q) = 0 := + measureReal_crudeTopBadScaleEvent_eq_zero_of_large + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + ha hα_nonneg hαt hαa hq_large + exact + measureReal_badScaleEvent_le_of_component_bounds_crudeTop_zero + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + hht hhb hcb hct + +/-- Kernel-shaped assembly of the full bad-scale event. This is the +manuscript four-way split after the crude-top component has been cut off: +the right side is exactly the sum of the three surviving branch bounds. -/ +theorem measureReal_badScaleEvent_le_kernel_sum_of_component_kernels + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {Aht ρht τ Ahb ρhb Acb ρcb σ : ℝ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hq_large : + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + L + 1 < (1 - α / a) * (q : ℝ)) + (hht : + μ.real (highTopBadScaleEvent H K a t α q) ≤ + Real.exp 1 * + (Real.exp (-(Aht ^ τ)) * linearExpKernelConst ρht τ)) + (hhb : + μ.real (highBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Ahb ^ τ)) * geometricExpKernelConst ρhb τ)) + (hcb : + μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Acb ^ σ)) * geometricExpKernelConst ρcb σ)) : + μ.real (badScaleEvent H t α q) ≤ + Real.exp 1 * + (Real.exp (-(Aht ^ τ)) * linearExpKernelConst ρht τ) + + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Ahb ^ τ)) * geometricExpKernelConst ρhb τ) + + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Acb ^ σ)) * geometricExpKernelConst ρcb σ) := by + exact + measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + (Rht := + Real.exp 1 * + (Real.exp (-(Aht ^ τ)) * linearExpKernelConst ρht τ)) + (Rhb := + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Ahb ^ τ)) * geometricExpKernelConst ρhb τ)) + (Rcb := + ((q + 1 : ℕ) : ℝ) * Real.exp 1 * + (Real.exp (-(Acb ^ σ)) * geometricExpKernelConst ρcb σ)) + ha hα_nonneg hαt hαa hq_large hht hhb hcb + +/-- Weighted-kernel assembly of the full bad-scale event. This is the +no-log version used in the current proof: the finite maxima remain in the +component constants, while the row weights are absorbed by the weighted +superexponential kernels. -/ +theorem measureReal_badScaleEvent_le_weighted_kernel_sum_of_component_kernels + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {K a t α : ℝ} {q : ℕ} + {Aht ρht Ahb ρhb Acb ρcb ηhigh ηcrude Cht Chb Ccb w : ℝ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hq_large : + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + L + 1 < (1 - α / a) * (q : ℝ)) + (hht : + μ.real (highTopBadScaleEvent H K a t α q) ≤ + Cht * + (Real.exp (-(Aht ^ ηhigh)) * + weightedLinearExpKernelConst w (ρht ^ ηhigh))) + (hhb : + μ.real (highBottomBadScaleEvent H K a t α q) ≤ + Chb * + (Real.exp (-(Ahb ^ ηhigh)) * + weightedGeometricExpKernelConst w (ρhb ^ ηhigh))) + (hcb : + μ.real (crudeBottomBadScaleEvent H K a t α q) ≤ + Ccb * + (Real.exp (-(Acb ^ ηcrude)) * + weightedGeometricExpKernelConst w (ρcb ^ ηcrude))) : + μ.real (badScaleEvent H t α q) ≤ + Cht * + (Real.exp (-(Aht ^ ηhigh)) * + weightedLinearExpKernelConst w (ρht ^ ηhigh)) + + Chb * + (Real.exp (-(Ahb ^ ηhigh)) * + weightedGeometricExpKernelConst w (ρhb ^ ηhigh)) + + Ccb * + (Real.exp (-(Acb ^ ηcrude)) * + weightedGeometricExpKernelConst w (ρcb ^ ηcrude)) := by + exact + measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + (μ := μ) (H := H) (K := K) (a := a) (t := t) (α := α) (q := q) + (Rht := + Cht * + (Real.exp (-(Aht ^ ηhigh)) * + weightedLinearExpKernelConst w (ρht ^ ηhigh))) + (Rhb := + Chb * + (Real.exp (-(Ahb ^ ηhigh)) * + weightedGeometricExpKernelConst w (ρhb ^ ηhigh))) + (Rcb := + Ccb * + (Real.exp (-(Acb ^ ηcrude)) * + weightedGeometricExpKernelConst w (ρcb ^ ηcrude))) + ha hα_nonneg hαt hαa hq_large hht hhb hcb + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailCollapse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailCollapse.lean new file mode 100644 index 0000000000..3ce0bba8c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailCollapse.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailJoint + +/-! # Bad Scale Tail Collapse -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Collapse of synchronized bad-scale components to one tail + +This file contains the deterministic final step after the three bad-scale +components have been estimated with synchronized constants. The probabilistic +input is the selected-denominator component theorem from `BadScaleTailJoint`; +the remaining hypotheses are purely large-scale/prefactor inequalities. +-/ + +noncomputable section + +theorem three_exp_terms_le_exp_of_prefactor_gap + {c₁ c₂ c₃ A Ac T₀ T : ℝ} + (hc₁ : 0 ≤ c₁) (hc₂ : 0 ≤ c₂) (hc₃ : 0 ≤ c₃) + (hA : T₀ ≤ A) (hAc : T₀ ≤ Ac) + (hpref : c₁ + c₂ + c₃ ≤ Real.exp (T₀ - T)) : + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + c₃ * Real.exp (-Ac) ≤ + Real.exp (-T) := by + have hEA : Real.exp (-A) ≤ Real.exp (-T₀) := + Real.exp_le_exp.mpr (by linarith) + have hEAc : Real.exp (-Ac) ≤ Real.exp (-T₀) := + Real.exp_le_exp.mpr (by linarith) + have hsum : + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + c₃ * Real.exp (-Ac) ≤ + (c₁ + c₂ + c₃) * Real.exp (-T₀) := by + calc + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + c₃ * Real.exp (-Ac) + ≤ c₁ * Real.exp (-T₀) + c₂ * Real.exp (-T₀) + + c₃ * Real.exp (-T₀) := by + nlinarith [mul_le_mul_of_nonneg_left hEA hc₁, + mul_le_mul_of_nonneg_left hEA hc₂, + mul_le_mul_of_nonneg_left hEAc hc₃] + _ = (c₁ + c₂ + c₃) * Real.exp (-T₀) := by ring + calc + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + c₃ * Real.exp (-Ac) + ≤ (c₁ + c₂ + c₃) * Real.exp (-T₀) := hsum + _ ≤ Real.exp (T₀ - T) * Real.exp (-T₀) := + mul_le_mul_of_nonneg_right hpref (Real.exp_pos _).le + _ = Real.exp (-T) := by + rw [← Real.exp_add] + congr 1 + ring + +theorem rpow_three_sub_div_eq_div_mul_rpow + {x O Den : ℝ} (hDen : Den ≠ 0) : + ((3 : ℝ) ^ (x - O)) / Den = + (3 : ℝ) ^ x / (Den * (3 : ℝ) ^ O) := by + have h3 : (0 : ℝ) < 3 := by norm_num + have h3O : (3 : ℝ) ^ O ≠ 0 := ne_of_gt (Real.rpow_pos_of_pos h3 O) + rw [Real.rpow_sub h3] + field_simp [hDen, h3O] + +theorem rpow_div_le_rpow_div_of_den_le + {x D₁ D₂ η : ℝ} + (hx : 0 ≤ x) (hD₁ : 0 < D₁) (hD₂ : 0 < D₂) + (hD : D₁ ≤ D₂) (hη : 0 < η) : + (x / D₂) ^ η ≤ (x / D₁) ^ η := by + have hfrac₁_nonneg : 0 ≤ x / D₁ := div_nonneg hx hD₁.le + have hfrac_le : x / D₂ ≤ x / D₁ := + div_le_div_of_nonneg_left hx hD₁ hD + exact Real.rpow_le_rpow (div_nonneg hx hD₂.le) hfrac_le hη.le + +theorem selected_tail_parameter_power_le_high + {q : ℕ} {Den B η O : ℝ} + (hDen : 0 < Den) (hB : 0 < B) (hη : 0 < η) + (hden : Den * (3 : ℝ) ^ O ≤ B) : + (((3 : ℝ) ^ (q : ℝ) / B) ^ η) ≤ + ((((3 : ℝ) ^ ((q : ℝ) - O)) / Den) ^ η) := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hdenO_pos : 0 < Den * (3 : ℝ) ^ O := + mul_pos hDen (Real.rpow_pos_of_pos h3 O) + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos h3 _).le + calc + (((3 : ℝ) ^ (q : ℝ) / B) ^ η) + ≤ (((3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ O)) ^ η) := + rpow_div_le_rpow_div_of_den_le hpow_nonneg hdenO_pos hB hden hη + _ = ((((3 : ℝ) ^ ((q : ℝ) - O)) / Den) ^ η) := by + rw [rpow_three_sub_div_eq_div_mul_rpow hDen.ne'] + +/-- Deterministic component collapse in the exact algebraic shape produced by +the synchronized selected-denominator estimate. -/ +theorem measureReal_badScaleEvent_le_exp_tail_of_component_prefactor_gap + {Ω : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {q : ℕ} + {Ctop ChighBottom CcrudeBottom A Acrude Alead Atail η : ℝ} + (hcomponent : + μ.real (badScaleEvent H t α q) ≤ + Ctop * Real.exp (-(A ^ η)) + + ChighBottom * Real.exp (-(A ^ η)) + + CcrudeBottom * Real.exp (-(Acrude ^ η))) + (hAlead_A : Alead ≤ A ^ η) + (hAlead_Acrude : Alead ≤ Acrude ^ η) + (hpref : + max 0 Ctop + max 0 ChighBottom + max 0 CcrudeBottom ≤ + Real.exp (Alead - Atail)) : + μ.real (badScaleEvent H t α q) ≤ Real.exp (-Atail) := by + have hcomponent_max : + μ.real (badScaleEvent H t α q) ≤ + max 0 Ctop * Real.exp (-(A ^ η)) + + max 0 ChighBottom * Real.exp (-(A ^ η)) + + max 0 CcrudeBottom * Real.exp (-(Acrude ^ η)) := by + have htop : + Ctop * Real.exp (-(A ^ η)) ≤ + max 0 Ctop * Real.exp (-(A ^ η)) := + mul_le_mul_of_nonneg_right (le_max_right 0 Ctop) (Real.exp_pos _).le + have hhigh : + ChighBottom * Real.exp (-(A ^ η)) ≤ + max 0 ChighBottom * Real.exp (-(A ^ η)) := + mul_le_mul_of_nonneg_right + (le_max_right 0 ChighBottom) (Real.exp_pos _).le + have hcrude : + CcrudeBottom * Real.exp (-(Acrude ^ η)) ≤ + max 0 CcrudeBottom * Real.exp (-(Acrude ^ η)) := + mul_le_mul_of_nonneg_right + (le_max_right 0 CcrudeBottom) (Real.exp_pos _).le + linarith + exact hcomponent_max.trans + (three_exp_terms_le_exp_of_prefactor_gap + (c₁ := max 0 Ctop) (c₂ := max 0 ChighBottom) + (c₃ := max 0 CcrudeBottom) + (A := A ^ η) (Ac := Acrude ^ η) (T₀ := Alead) (T := Atail) + (le_max_left 0 Ctop) (le_max_left 0 ChighBottom) + (le_max_left 0 CcrudeBottom) + hAlead_A hAlead_Acrude hpref) + +/-- Same deterministic collapse, with the component sum written in the +selected-denominator theorem's native factorization. -/ +theorem measureReal_badScaleEvent_le_exp_tail_of_selected_component_sum + {Ω : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {q : ℕ} + {S qPlus Cbottom wq Ktop Kbottom Kcrude A Acrude Alead Atail η : ℝ} + (hcomponent : + μ.real (badScaleEvent H t α q) ≤ + S * (Real.exp (-(A ^ η)) * Ktop) + + qPlus * (Cbottom * wq) * + (Real.exp (-(A ^ η)) * Kbottom) + + qPlus * (S * wq) * + (Real.exp (-(Acrude ^ η)) * Kcrude)) + (hAlead_A : Alead ≤ A ^ η) + (hAlead_Acrude : Alead ≤ Acrude ^ η) + (hpref : + max 0 (S * Ktop) + + max 0 (qPlus * (Cbottom * wq) * Kbottom) + + max 0 (qPlus * (S * wq) * Kcrude) ≤ + Real.exp (Alead - Atail)) : + μ.real (badScaleEvent H t α q) ≤ Real.exp (-Atail) := by + have hcomponent_coeff : + μ.real (badScaleEvent H t α q) ≤ + (S * Ktop) * Real.exp (-(A ^ η)) + + (qPlus * (Cbottom * wq) * Kbottom) * Real.exp (-(A ^ η)) + + (qPlus * (S * wq) * Kcrude) * Real.exp (-(Acrude ^ η)) := by + calc + μ.real (badScaleEvent H t α q) + ≤ S * (Real.exp (-(A ^ η)) * Ktop) + + qPlus * (Cbottom * wq) * + (Real.exp (-(A ^ η)) * Kbottom) + + qPlus * (S * wq) * + (Real.exp (-(Acrude ^ η)) * Kcrude) := hcomponent + _ = + (S * Ktop) * Real.exp (-(A ^ η)) + + (qPlus * (Cbottom * wq) * Kbottom) * Real.exp (-(A ^ η)) + + (qPlus * (S * wq) * Kcrude) * Real.exp (-(Acrude ^ η)) := by + ring + exact + measureReal_badScaleEvent_le_exp_tail_of_component_prefactor_gap + (hcomponent := hcomponent_coeff) + hAlead_A hAlead_Acrude hpref + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailDenominator.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailDenominator.lean new file mode 100644 index 0000000000..1a0e58507e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailDenominator.lean @@ -0,0 +1,695 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailTwoBranch +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsHigh +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsCrudeBottom + +/-! # Bad Scale Tail Denominator -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Denominator selection for the interpolated bad-scale tail + +This file removes the explicit denominator-domination side conditions from the +mixed high-bottom component bound by choosing the normalizing denominator as +the maximum of the two branch denominators at the correct powers. +-/ + +noncomputable section + +/-- If the denominator for a normalized `eta`-tail dominates the branch +denominator after raising to the relevant powers, and the exponent in the +normalized tail is no larger than the branch exponent, then the normalized +tail parameter is bounded by the branch tail parameter. -/ +theorem rpow_three_div_den_rpow_le_of_exponent_le + {X Y D Den η γ : ℝ} + (hη : 0 < η) (hγ : 0 < γ) (hD : 0 < D) (hDen : 0 < Den) + (hDpow : D ^ γ ≤ Den ^ η) (hXY : X ≤ Y) : + (((3 : ℝ) ^ (X / η) / Den) ^ η) ≤ + (((3 : ℝ) ^ (Y / γ) / D) ^ γ) := by + have hthree_pos : 0 < (3 : ℝ) := by norm_num + have hthree_nonneg : 0 ≤ (3 : ℝ) := by norm_num + have hDenη_pos : 0 < Den ^ η := Real.rpow_pos_of_pos hDen η + have hDγ_pos : 0 < D ^ γ := Real.rpow_pos_of_pos hD γ + have hlhs : + (((3 : ℝ) ^ (X / η) / Den) ^ η) = + (3 : ℝ) ^ X / Den ^ η := by + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDen.le η] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hη.ne'] + have hrhs : + (((3 : ℝ) ^ (Y / γ) / D) ^ γ) = + (3 : ℝ) ^ Y / D ^ γ := by + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hD.le γ] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hγ.ne'] + rw [hlhs, hrhs] + have hpow : (3 : ℝ) ^ X ≤ (3 : ℝ) ^ Y := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hXY + calc + (3 : ℝ) ^ X / Den ^ η + ≤ (3 : ℝ) ^ Y / Den ^ η := + div_le_div_of_nonneg_right hpow hDenη_pos.le + _ ≤ (3 : ℝ) ^ Y / D ^ γ := + div_le_div_of_nonneg_left + (Real.rpow_pos_of_pos hthree_pos Y).le hDγ_pos hDpow + +/-- Recover a lower bound on a positive base from a lower bound on a positive +power of that base. -/ +theorem one_le_of_one_le_rpow + {x η : ℝ} (hx : 0 ≤ x) (hη : 0 < η) (hpow : 1 ≤ x ^ η) : + 1 ≤ x := by + have hpow' : (1 : ℝ) ^ η ≤ x ^ η := by simpa using hpow + exact (Real.rpow_le_rpow_iff zero_le_one hx hη).mp hpow' + +/-- The denominator that dominates both branch denominators after raising to +the corrected finite exponent. -/ +noncomputable def mixedBottomTailDenominator + (Dhigh Dcrude η τ σ : ℝ) : ℝ := + max ((max 1 Dhigh) ^ (τ / η)) ((max 1 Dcrude) ^ (σ / η)) + +theorem mixedBottomTailDenominator_pos + {Dhigh Dcrude η τ σ : ℝ} : + 0 < mixedBottomTailDenominator Dhigh Dcrude η τ σ := by + have hbase : 0 < max 1 Dhigh := + lt_of_lt_of_le zero_lt_one (le_max_left 1 Dhigh) + have hterm : 0 < (max 1 Dhigh) ^ (τ / η) := + Real.rpow_pos_of_pos hbase _ + exact hterm.trans_le (le_max_left _ _) + +theorem branch_denominator_le_mixedBottomTailDenominator_pow_eta + {Dhigh Dcrude η τ σ : ℝ} + (hη : 0 < η) (hτ : 0 < τ) (hσ : 0 < σ) + (hDhigh : 0 < Dhigh) (hDcrude : 0 < Dcrude) : + Dhigh ^ τ ≤ (mixedBottomTailDenominator Dhigh Dcrude η τ σ) ^ η ∧ + Dcrude ^ σ ≤ (mixedBottomTailDenominator Dhigh Dcrude η τ σ) ^ η := by + have hbaseHigh_pos : 0 < max 1 Dhigh := + lt_of_lt_of_le zero_lt_one (le_max_left 1 Dhigh) + have hbaseCrude_pos : 0 < max 1 Dcrude := + lt_of_lt_of_le zero_lt_one (le_max_left 1 Dcrude) + have htermHigh_nonneg : 0 ≤ (max 1 Dhigh) ^ (τ / η) := + (Real.rpow_pos_of_pos hbaseHigh_pos _).le + have htermCrude_nonneg : 0 ≤ (max 1 Dcrude) ^ (σ / η) := + (Real.rpow_pos_of_pos hbaseCrude_pos _).le + have hhigh_eq : + ((max 1 Dhigh) ^ (τ / η)) ^ η = (max 1 Dhigh) ^ τ := by + rw [← Real.rpow_mul hbaseHigh_pos.le] + congr 1 + field_simp [hη.ne'] + have hcrude_eq : + ((max 1 Dcrude) ^ (σ / η)) ^ η = (max 1 Dcrude) ^ σ := by + rw [← Real.rpow_mul hbaseCrude_pos.le] + congr 1 + field_simp [hη.ne'] + constructor + · have hD_le : Dhigh ≤ max 1 Dhigh := le_max_right 1 Dhigh + have hpow_le : Dhigh ^ τ ≤ (max 1 Dhigh) ^ τ := + Real.rpow_le_rpow hDhigh.le hD_le hτ.le + have hterm_le : + (max 1 Dhigh) ^ (τ / η) ≤ + mixedBottomTailDenominator Dhigh Dcrude η τ σ := by + dsimp [mixedBottomTailDenominator] + exact le_max_left _ _ + have hterm_pow_le : + ((max 1 Dhigh) ^ (τ / η)) ^ η ≤ + (mixedBottomTailDenominator Dhigh Dcrude η τ σ) ^ η := + Real.rpow_le_rpow htermHigh_nonneg hterm_le hη.le + exact hpow_le.trans (by simpa [hhigh_eq] using hterm_pow_le) + · have hD_le : Dcrude ≤ max 1 Dcrude := le_max_right 1 Dcrude + have hpow_le : Dcrude ^ σ ≤ (max 1 Dcrude) ^ σ := + Real.rpow_le_rpow hDcrude.le hD_le hσ.le + have hterm_le : + (max 1 Dcrude) ^ (σ / η) ≤ + mixedBottomTailDenominator Dhigh Dcrude η τ σ := by + dsimp [mixedBottomTailDenominator] + exact le_max_right _ _ + have hterm_pow_le : + ((max 1 Dcrude) ^ (σ / η)) ^ η ≤ + (mixedBottomTailDenominator Dhigh Dcrude η τ σ) ^ η := + Real.rpow_le_rpow htermCrude_nonneg hterm_le hη.le + exact hpow_le.trans (by simpa [hcrude_eq] using hterm_pow_le) + +/-- High-top component rewritten with the corrected finite bad-scale exponent. +The proof uses the same raw high-range estimate as the original high-top +component and only changes the deterministic tail parameter. -/ +theorem measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_badPair_bound + {d : ℕ} [NeZero d] {σ Cfluct Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (hCentry : 0 < Centry) (ha : 0 < a) + (hpair : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let c : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ c + 0 < t → + t ≤ b → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + 1 ≤ A → + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ τ)) := by + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q K N0 Hshift S b L c τ η w Dhigh A ρ + ht htb hαt hαb hαharm hDen hDen_high hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let Aold : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / Dhigh + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDen.le + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDhigh_pos.le + let X : ℝ := η * ((q : ℝ) - (τ * b * (L + 1)) / η) + let Y : ℝ := τ * (b * (q : ℝ) - b * (L + 1)) + have hXY : X ≤ Y := by + have hmain := + finiteQuenchedTailExponent_mul_nat_le_tau_mul_b_nat + (d := d) (σ := σ) (t := t) (q := q) + hσ_pos ht (by simpa [b] using htb) + have hmain' : η * (q : ℝ) ≤ τ * b * (q : ℝ) := by + simpa [η, τ, b, mul_assoc] using hmain + dsimp [X, Y] + field_simp [hη_pos.ne'] + ring_nf + nlinarith + have hA_to_old : A ^ η ≤ Aold ^ τ := by + have hgeneric := + rpow_three_div_den_rpow_le_of_exponent_le + (X := X) (Y := Y) (D := Dhigh) (Den := Den) + (η := η) (γ := τ) + hη_pos hτ_pos hDhigh_pos hDen + (by simpa [Dhigh, τ, η] using hDen_high) hXY + convert hgeneric using 1 + · dsimp [A, X] + congr 2 + field_simp [hη_pos.ne'] + · dsimp [Aold, Y] + congr 2 + field_simp [hτ_pos.ne'] + have hAold_one : 1 ≤ Aold := by + have hA_pow_one : 1 ≤ A ^ η := Real.one_le_rpow hA_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg hτ_pos (hA_pow_one.trans hA_to_old) + have htop_old : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(Aold ^ τ)) * + weightedLinearExpKernelConst w (ρ ^ τ)) := by + have htop := + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hpair + (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) + simpa [K, N0, Hshift, S, b, L, c, τ, Aold, ρ, w] using! + htop ht hαt hαb hαharm hAold_one + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hc_pos : 0 < c := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + have hbα : 0 < b - αbad := sub_pos.mpr hαb + have hfactor : 0 < 1 + b / a := by + have hba : 0 < b / a := div_pos hb_pos ha + linarith + have hthird : 0 < (t - αbad) * (1 + b / a) := + mul_pos hgap hfactor + have hfourth : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + dsimp [c] + exact lt_min hgap (lt_min hbα (lt_min hthird hfourth)) + have hρ_gt : 1 < ρ := by + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ c := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hkernel_nonneg : + 0 ≤ weightedLinearExpKernelConst w (ρ ^ τ) := + (weightedLinearExpKernelConst_pos + (w := w) (R := ρ ^ τ) hw_pos + (Real.one_lt_rpow hρ_gt hτ_pos)).le + have hexp : + Real.exp (-(Aold ^ τ)) ≤ Real.exp (-(A ^ η)) := + Real.exp_le_exp.mpr (by linarith [hA_to_old]) + have hinner : + Real.exp (-(Aold ^ τ)) * weightedLinearExpKernelConst w (ρ ^ τ) ≤ + Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ τ) := + mul_le_mul_of_nonneg_right hexp hkernel_nonneg + exact htop_old.trans + (mul_le_mul_of_nonneg_left hinner (by positivity)) + +/-- Crude-bottom component rewritten with the corrected finite bad-scale +exponent. This is the deterministic conversion of the crude +`sigma * t` endpoint into the common finite exponent. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_component_bound + {d : ℕ} [NeZero d] {σ Ccrude : ℝ} + (hσ_pos : 0 < σ) (hCcrude : 0 < Ccrude) + {params : QuantitativeCoarseGrainedEllipticityParams d} + (hcomponent : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → + hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Aold : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ Aold → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Aold ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ))) : + ∀ {Centry a t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → + hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 0 < Den → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + intro Centry a t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ha ht hαt hDen hDen_crude hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Aold : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDen.le + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDcrude_pos.le + let X : ℝ := η * ((q : ℝ) - (σ * t * (L + 1)) / η) + let Y : ℝ := σ * (t * (q : ℝ) - t * (L + 1)) + have hXY : X ≤ Y := by + have hmain := + finiteQuenchedTailExponent_mul_nat_le_sigma_mul_t_nat + (d := d) (σ := σ) (t := t) (q := q) + hσ_pos ht + have hmain' : η * (q : ℝ) ≤ σ * t * (q : ℝ) := by + simpa [η, mul_assoc] using hmain + dsimp [X, Y] + field_simp [hη_pos.ne'] + ring_nf + nlinarith + have hA_to_old : A ^ η ≤ Aold ^ σ := by + have hgeneric := + rpow_three_div_den_rpow_le_of_exponent_le + (X := X) (Y := Y) (D := Dcrude) (Den := Den) + (η := η) (γ := σ) + hη_pos hσ_pos hDcrude_pos hDen + (by simpa [Dcrude, η] using hDen_crude) hXY + convert hgeneric using 1 + · dsimp [A, X] + congr 2 + field_simp [hη_pos.ne'] + · dsimp [Aold, Y] + congr 2 + field_simp [hσ_pos.ne'] + have hAold_one : 1 ≤ Aold := by + have hA_pow_one : 1 ≤ A ^ η := Real.one_le_rpow hA_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg hσ_pos (hA_pow_one.trans hA_to_old) + have hcrude_old : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Aold ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + have hold := + hcomponent (Centry := Centry) (a := a) (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) + simpa [K, N0, Hshift, S, L, w, Aold, ρ, Dcrude, mul_assoc] using + hold ha ht hαt hAold_one + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hkernel_nonneg : + 0 ≤ weightedGeometricExpKernelConst w (ρ ^ σ) := + (weightedGeometricExpKernelConst_pos + (w := w) (R := ρ ^ σ) hw_pos + (Real.one_lt_rpow hρ_gt hσ_pos)).le + have htail_factor_nonneg : + 0 ≤ ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) := by + positivity + have hexp : + Real.exp (-(Aold ^ σ)) ≤ Real.exp (-(A ^ η)) := + Real.exp_le_exp.mpr (by linarith [hA_to_old]) + have hinner : + Real.exp (-(Aold ^ σ)) * weightedGeometricExpKernelConst w (ρ ^ σ) ≤ + Real.exp (-(A ^ η)) * weightedGeometricExpKernelConst w (ρ ^ σ) := + mul_le_mul_of_nonneg_right hexp hkernel_nonneg + exact hcrude_old.trans + (mul_le_mul_of_nonneg_left hinner htail_factor_nonneg) + +/-- Public crude-bottom component bound with its tail parameter rewritten in +terms of the corrected finite exponent. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 0 < Den → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + obtain ⟨Ccrude, hCcrude, hcomponent⟩ := + measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ha ht hαt hDen hDen_crude hA_one + exact + measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_component_bound + (d := d) (σ := σ) (Ccrude := Ccrude) hσ_pos hCcrude + (by + intro Centry a t αbad P hP hStruct hΓ hσ_eq' hparams' q + exact hcomponent (Centry := Centry) (a := a) (t := t) + (αbad := αbad) hP hStruct hΓ hσ_eq' hparams' (q := q)) + (Centry := Centry) (a := a) (t := t) (αbad := αbad) + (Den := Den) hP hStruct hΓ hσ_eq hparams (q := q) + ha ht hαt hDen hDen_crude hA_one + +/-- High-bottom component bound with the concrete mixed denominator selected. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + αbad < t → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cpref * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hcomponent⟩ := + measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel_of_denominator + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hαt hA_one + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + simpa [η] using + finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hDen_bounds := + branch_denominator_le_mixedBottomTailDenominator_pow_eta + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + hη_pos hτ_pos hσ_pos hDhigh_pos hDcrude_pos + simpa [K, N0, Hshift, S, b, L, τ, η, w, Dhigh, Dcrude, Den, A, ρ, + Cpref] using + hcomponent (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hαt hDen_pos hDen_bounds.1 hDen_bounds.2 hA_one + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailExponent.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailExponent.lean new file mode 100644 index 0000000000..673204d583 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailExponent.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairCollapse + +/-! # Bad Scale Tail Exponent -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Tail exponents for the quenched minimal scale + +This file isolates the real-variable exponent used in the corrected finite +`sigma` theorem. The mixed bottom range optimizes a `Gamma_tau` localized +tail against a `Gamma_sigma` crude tail; the resulting exponent is the +interpolated one recorded below. +-/ + +noncomputable section + +/-- The finite-sigma concentration exponent after the Chapter 4 concentration +step. -/ +def finiteQuenchedTailTau (σ : ℝ) : ℝ := + min σ 2 + +/-- The corrected finite-sigma exponent for Theorem `t.homogenization.quenched`, +written with an abstract `b = d / 2`. -/ +noncomputable def interpolatedQuenchedTailExponent (b σ t : ℝ) : ℝ := + let τ : ℝ := finiteQuenchedTailTau σ + (σ * τ * b * t) / (σ * t + τ * (b - t)) + +/-- Dimension-specialized version of `interpolatedQuenchedTailExponent`. -/ +noncomputable def finiteQuenchedTailExponent (d : ℕ) (σ t : ℝ) : ℝ := + interpolatedQuenchedTailExponent ((d : ℝ) / 2) σ t + +theorem finiteQuenchedTailTau_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < finiteQuenchedTailTau σ := by + dsimp [finiteQuenchedTailTau] + exact lt_min hσ (by norm_num : (0 : ℝ) < 2) + +theorem finiteQuenchedTailDen_pos + {b σ t : ℝ} (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) : + 0 < σ * t + finiteQuenchedTailTau σ * (b - t) := by + dsimp [finiteQuenchedTailTau] + by_cases hσ2 : σ ≤ 2 + · rw [min_eq_left hσ2] + nlinarith + · have h2σ : 2 ≤ σ := le_of_not_ge hσ2 + rw [min_eq_right h2σ] + nlinarith + +theorem interpolatedQuenchedTailExponent_pos + {b σ t : ℝ} (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) : + 0 < interpolatedQuenchedTailExponent b σ t := by + let τ : ℝ := finiteQuenchedTailTau σ + have hτ : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ + have hden : 0 < σ * t + τ * (b - t) := by + simpa [τ] using finiteQuenchedTailDen_pos hb hσ ht + dsimp [interpolatedQuenchedTailExponent, τ] + exact div_pos (by positivity) hden + +theorem finiteQuenchedTailExponent_pos + {d : ℕ} [NeZero d] {σ t : ℝ} (hσ : 0 < σ) (ht : 0 < t) : + 0 < finiteQuenchedTailExponent d σ t := by + have hb : 0 < (d : ℝ) / 2 := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + exact interpolatedQuenchedTailExponent_pos hb hσ ht + +theorem interpolatedQuenchedTailExponent_le_tau_mul_b + {b σ t : ℝ} (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) (htb : t ≤ b) : + interpolatedQuenchedTailExponent b σ t ≤ + finiteQuenchedTailTau σ * b := by + let τ : ℝ := finiteQuenchedTailTau σ + have hτ : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ + have hden : 0 < σ * t + τ * (b - t) := by + simpa [τ] using finiteQuenchedTailDen_pos hb hσ ht + have hbt : 0 ≤ b - t := sub_nonneg.mpr htb + dsimp [interpolatedQuenchedTailExponent, τ] + rw [div_le_iff₀ hden] + ring_nf + nlinarith [mul_nonneg (mul_nonneg hτ.le hb.le) hbt] + +theorem interpolatedQuenchedTailExponent_le_sigma_mul_t + {b σ t : ℝ} (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) : + interpolatedQuenchedTailExponent b σ t ≤ σ * t := by + let τ : ℝ := finiteQuenchedTailTau σ + have hτ_le_σ : τ ≤ σ := by + dsimp [τ, finiteQuenchedTailTau] + exact min_le_left σ 2 + have hden : 0 < σ * t + τ * (b - t) := by + simpa [τ] using finiteQuenchedTailDen_pos hb hσ ht + dsimp [interpolatedQuenchedTailExponent, τ] + rw [div_le_iff₀ hden] + ring_nf + nlinarith [ + mul_nonneg (mul_nonneg hσ.le (mul_nonneg ht.le ht.le)) + (sub_nonneg.mpr hτ_le_σ)] + +theorem interpolatedQuenchedTailExponent_le_mixed + {b σ t : ℝ} : + interpolatedQuenchedTailExponent b σ t ≤ + (σ * finiteQuenchedTailTau σ * b * t) / + (σ * t + finiteQuenchedTailTau σ * (b - t)) := by + rfl + +/-- The mixed bottom exponent collapse. + +In the bottom range, write `j = q - n`. The localized tail contributes +`tau * (b*q - (b-t)*j)` and the crude tail contributes `sigma*t*j`. Their +maximum dominates the corrected finite exponent times `q`. -/ +theorem interpolatedQuenchedTailExponent_mul_le_max_mixed + {b σ t q j : ℝ} + (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) (htb : t ≤ b) + (hj : 0 ≤ j) (hjq : j ≤ q) : + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := interpolatedQuenchedTailExponent b σ t + η * q ≤ max (τ * (b * q - (b - t) * j)) (σ * t * j) := by + intro τ η + have hq : 0 ≤ q := hj.trans hjq + have hτ : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ + have hden : 0 < σ * t + τ * (b - t) := by + simpa [τ] using finiteQuenchedTailDen_pos hb hσ ht + have hσt : 0 < σ * t := mul_pos hσ ht + have hη_le_tau_b : η ≤ τ * b := by + simpa [η, τ] using + interpolatedQuenchedTailExponent_le_tau_mul_b + (b := b) (σ := σ) (t := t) hb hσ ht htb + have hη_le_mixed : + η ≤ (σ * τ * b * t) / (σ * t + τ * (b - t)) := by + simpa [η, τ] using + interpolatedQuenchedTailExponent_le_mixed + (b := b) (σ := σ) (t := t) + have hbt : 0 ≤ b - t := sub_nonneg.mpr htb + by_cases hright : η * q ≤ σ * t * j + · exact le_max_of_le_right hright + · have hj_upper : j ≤ η * q / (σ * t) := by + have hright' : ¬ η * q ≤ j * (σ * t) := by + simpa [mul_comm, mul_left_comm, mul_assoc] using hright + exact (le_div_iff₀ hσt).2 (le_of_not_ge hright') + have hηD : + η * (σ * t + τ * (b - t)) ≤ σ * τ * b * t := by + exact (le_div_iff₀ hden).1 hη_le_mixed + have hcoeff : + η ≤ τ * b - τ * (b - t) * η / (σ * t) := by + rw [le_sub_iff_add_le] + have hmul : + (η + τ * (b - t) * η / (σ * t)) * (σ * t) ≤ + (τ * b) * (σ * t) := by + field_simp [hσt.ne'] + ring_nf + nlinarith [hηD] + exact le_of_mul_le_mul_right hmul hσt + have hcoeff_q : + η * q ≤ (τ * b - τ * (b - t) * η / (σ * t)) * q := + mul_le_mul_of_nonneg_right hcoeff hq + have hj_term : + τ * (b - t) * j ≤ τ * (b - t) * (η * q / (σ * t)) := by + have hfactor : 0 ≤ τ * (b - t) := mul_nonneg hτ.le hbt + simpa [mul_assoc] using + mul_le_mul_of_nonneg_left hj_upper hfactor + have hleft : + η * q ≤ τ * (b * q - (b - t) * j) := by + calc + η * q + ≤ (τ * b - τ * (b - t) * η / (σ * t)) * q := hcoeff_q + _ = τ * b * q - τ * (b - t) * (η * q / (σ * t)) := by + field_simp [hσt.ne'] + _ ≤ τ * b * q - τ * (b - t) * j := by + linarith + _ = τ * (b * q - (b - t) * j) := by ring + exact le_max_of_le_left hleft + +/-- Mixed bottom collapse with the row gain retained. The row variable `r` +is the distance above the bad scale; since both stochastic mechanisms gain +`(t - alpha) * r`, the maximum retains a positive weighted-kernel gain. -/ +theorem interpolatedQuenchedTailExponent_mul_add_row_le_max_mixed + {b σ t α q j r : ℝ} + (hb : 0 < b) (hσ : 0 < σ) (ht : 0 < t) (hαt : α < t) (htb : t ≤ b) + (hj : 0 ≤ j) (hjq : j ≤ q) (hr : 0 ≤ r) : + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := interpolatedQuenchedTailExponent b σ t + η * q + τ * (t - α) * r ≤ + max + (τ * (b * q - (b - t) * j + (t - α) * r)) + (σ * (t * j + (t - α) * r)) := by + intro τ η + have hbase : + η * q ≤ max (τ * (b * q - (b - t) * j)) (σ * t * j) := by + simpa [τ, η] using + interpolatedQuenchedTailExponent_mul_le_max_mixed + (b := b) (σ := σ) (t := t) (q := q) (j := j) + hb hσ ht htb hj hjq + have hτ_nonneg : 0 ≤ τ := (finiteQuenchedTailTau_pos hσ).le + have hτ_le_σ : τ ≤ σ := by + dsimp [τ, finiteQuenchedTailTau] + exact min_le_left σ 2 + have hgap_nonneg : 0 ≤ t - α := (sub_pos.mpr hαt).le + have hrow_le : + τ * (t - α) * r ≤ σ * (t - α) * r := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hτ_le_σ hgap_nonneg) hr + by_cases hleft : + σ * t * j ≤ τ * (b * q - (b - t) * j) + · have hmax_left : + max (τ * (b * q - (b - t) * j)) (σ * t * j) = + τ * (b * q - (b - t) * j) := max_eq_left hleft + calc + η * q + τ * (t - α) * r + ≤ τ * (b * q - (b - t) * j) + τ * (t - α) * r := by + linarith [hbase, hmax_left] + _ = τ * (b * q - (b - t) * j + (t - α) * r) := by ring + _ ≤ max + (τ * (b * q - (b - t) * j + (t - α) * r)) + (σ * (t * j + (t - α) * r)) := le_max_left _ _ + · have hmax_right : + max (τ * (b * q - (b - t) * j)) (σ * t * j) = + σ * t * j := max_eq_right (le_of_not_ge hleft) + calc + η * q + τ * (t - α) * r + ≤ σ * t * j + τ * (t - α) * r := by + linarith [hbase, hmax_right] + _ ≤ σ * t * j + σ * (t - α) * r := by linarith + _ = σ * (t * j + (t - α) * r) := by ring + _ ≤ max + (τ * (b * q - (b - t) * j + (t - α) * r)) + (σ * (t * j + (t - α) * r)) := le_max_right _ _ + +/-- Dimension-specialized high-top collapse: the finite bad-scale exponent is +no larger than the localized `tau * d/2` exponent. -/ +theorem finiteQuenchedTailExponent_mul_nat_le_tau_mul_b_nat + {d : ℕ} [NeZero d] {σ t : ℝ} {q : ℕ} + (hσ : 0 < σ) (ht : 0 < t) (htb : t ≤ (d : ℝ) / 2) : + finiteQuenchedTailExponent d σ t * (q : ℝ) ≤ + finiteQuenchedTailTau σ * ((d : ℝ) / 2) * (q : ℝ) := by + have hb : 0 < (d : ℝ) / 2 := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + exact mul_le_mul_of_nonneg_right + (by + simpa [finiteQuenchedTailExponent] using + interpolatedQuenchedTailExponent_le_tau_mul_b + (b := (d : ℝ) / 2) (σ := σ) (t := t) hb hσ ht htb) + (by positivity) + +/-- Dimension-specialized crude-bottom collapse: the finite bad-scale exponent +is no larger than the crude `sigma * t` exponent. -/ +theorem finiteQuenchedTailExponent_mul_nat_le_sigma_mul_t_nat + {d : ℕ} [NeZero d] {σ t : ℝ} {q : ℕ} + (hσ : 0 < σ) (ht : 0 < t) : + finiteQuenchedTailExponent d σ t * (q : ℝ) ≤ + σ * t * (q : ℝ) := by + have hb : 0 < (d : ℝ) / 2 := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + exact mul_le_mul_of_nonneg_right + (by + simpa [finiteQuenchedTailExponent] using + interpolatedQuenchedTailExponent_le_sigma_mul_t + (b := (d : ℝ) / 2) (σ := σ) (t := t) hb hσ ht) + (by positivity) + +/-- Dimension-specialized mixed-bottom collapse in shifted natural indices. +Here `j = q - n` is the distance from the bad scale down to the bottom scale. -/ +theorem finiteQuenchedTailExponent_mul_nat_le_max_bottom + {d q n : ℕ} [NeZero d] {σ t : ℝ} + (hσ : 0 < σ) (ht : 0 < t) (htb : t ≤ (d : ℝ) / 2) : + let b : ℝ := (d : ℝ) / 2 + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let j : ℝ := ((q - n : ℕ) : ℝ) + η * (q : ℝ) ≤ max (τ * (b * (q : ℝ) - (b - t) * j)) (σ * t * j) := by + intro b τ η j + have hb : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hj_nonneg : 0 ≤ j := by + dsimp [j] + positivity + have hj_le_q : j ≤ (q : ℝ) := by + dsimp [j] + exact_mod_cast Nat.sub_le q n + simpa [finiteQuenchedTailExponent, b, τ, η, j] using + interpolatedQuenchedTailExponent_mul_le_max_mixed + (b := b) (σ := σ) (t := t) (q := (q : ℝ)) (j := j) + hb hσ ht (by simpa [b] using htb) hj_nonneg hj_le_q + +/-- Dimension-specialized mixed-bottom collapse with the row gain retained. -/ +theorem finiteQuenchedTailExponent_mul_nat_add_row_le_max_bottom + {d q n r : ℕ} [NeZero d] {σ t α : ℝ} + (hσ : 0 < σ) (ht : 0 < t) (hαt : α < t) + (htb : t ≤ (d : ℝ) / 2) : + let b : ℝ := (d : ℝ) / 2 + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let j : ℝ := ((q - n : ℕ) : ℝ) + η * (q : ℝ) + τ * (t - α) * (r : ℝ) ≤ + max + (τ * (b * (q : ℝ) - (b - t) * j + (t - α) * (r : ℝ))) + (σ * (t * j + (t - α) * (r : ℝ))) := by + intro b τ η j + have hb : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hj_nonneg : 0 ≤ j := by + dsimp [j] + positivity + have hj_le_q : j ≤ (q : ℝ) := by + dsimp [j] + exact_mod_cast Nat.sub_le q n + have hr_nonneg : 0 ≤ (r : ℝ) := by positivity + simpa [finiteQuenchedTailExponent, b, τ, η, j] using + interpolatedQuenchedTailExponent_mul_add_row_le_max_mixed + (b := b) (σ := σ) (t := t) (α := α) + (q := (q : ℝ)) (j := j) (r := (r : ℝ)) + hb hσ ht hαt (by simpa [b] using htb) hj_nonneg hj_le_q hr_nonneg + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinal.lean new file mode 100644 index 0000000000..88272903ee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinal.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGap + +/-! # Bad Scale Tail Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Eventual shifted bad-scale tail + +This file combines the selected bad-scale tail, deterministic threshold +selection, and prefactor absorption. The output is still shifted by the +annealed entry scale; the next layer converts this eventual bad-scale bound +into a tail bound for the random minimal scale. +-/ + +noncomputable section + +theorem exists_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ Q : ℕ, ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, htail⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hw_nonneg : 0 ≤ w := by + dsimp [w] + exact_mod_cast Nat.zero_le (3 ^ d) + obtain ⟨Qpref, hQpref⟩ := + exists_forall_ge_selected_prefactor_gap + (Ctop := Ctop) (Cbottom := Cbottom) (S := (S.card : ℝ)) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (Blead := Blead) (Btail := Btail) (η := η) + hBlead_pos hBtail_pos hη_pos hBlead_lt_Btail hw_nonneg + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + refine ⟨Q, ?_⟩ + intro q hQq + have hq_pref : Qpref ≤ q := (le_max_left Qpref (max Qlead Qcut)).trans hQq + have hq_lead : Qlead ≤ q := + (le_max_left Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hq_cut : Qcut ≤ q := + (le_max_right Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hpref_q : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := + hQpref q hq_pref + have htail_q := + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hBtail_pos + (by simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead, Qlead] using hq_lead) + (by simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead, Qcut] using hq_cut) + (by + simpa [K, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, Den, Ohigh, + Ocrude, Blead, Btail, ρtop, ρbottom, ρcrude, Cbottom, Ctop, + Kbottom, Kcrude] using hpref_q) + simpa [K, N0, Hshift, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, Den, + Ohigh, Ocrude, Blead, Btail] using htail_q + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinalQuantitative.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinalQuantitative.lean new file mode 100644 index 0000000000..323ad9bb3c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailFinalQuantitative.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative + +/-! # Bad Scale Tail Final Quantitative -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Quantitative shifted bad-scale tail + +This is the theorem-facing version of the final bad-scale tail in which the +fixed prefactor threshold is selected before the law, and the law-dependent +part of the final threshold is an explicit logarithmic expression in the +geometric gap coefficient. +-/ + +noncomputable section + +theorem exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, htail⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hw_nonneg : 0 ≤ w := by + dsimp [w] + exact_mod_cast Nat.zero_le (3 ^ d) + obtain ⟨R, hR, hRtail⟩ := + exists_forall_ge_selected_prefactor_gap_quantitative_uniform + (Ctop := Ctop) (Cbottom := Cbottom) (S := (S.card : ℝ)) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (η := η) hη_pos hw_nonneg + refine ⟨R, ?_, ?_⟩ + · simpa [ρgap, W, C₀, w, η] using hR + intro P hP hStruct hΓ hσ_eq hparams + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + intro q hQq + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hq_pref : Qpref ≤ q := (le_max_left Qpref (max Qlead Qcut)).trans hQq + have hq_lead : Qlead ≤ q := + (le_max_left Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hq_cut : Qcut ≤ q := + (le_max_right Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hpref_q : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + exact + hRtail (Blead := Blead) (Btail := Btail) + hBlead_pos hBtail_pos hBlead_lt_Btail q hq_pref + have htail_q := + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hBtail_pos + (by + change Qlead ≤ q + exact hq_lead) + (by + change Qcut ≤ q + exact hq_cut) + (by + change + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + exact hpref_q) + change + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + simpa [N0, Hshift] using htail_q + +/-- Uniform-in-`σ` version of +`exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail`. -/ +theorem exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct Ccrude : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ + ∀ {t αbad : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + obtain ⟨Centry, a, hCentry, ha, htailBase⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, Ccrude, hCfluct, hCcrude, htail⟩ := + htailBase hσ_pos + refine ⟨Cfluct, Ccrude, hCfluct, hCcrude, ?_⟩ + intro t αbad K S b L ctop τ η w ρtop ρbottom ρcrude Cbottom Ctop Kbottom Kcrude + W M ρgap C₀ ht htb hα_nonneg hαt hαb hαharm hαa + classical + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hw_nonneg : 0 ≤ w := by + dsimp [w] + exact_mod_cast Nat.zero_le (3 ^ d) + obtain ⟨R, hR, hRtail⟩ := + exists_forall_ge_selected_prefactor_gap_quantitative_uniform + (Ctop := Ctop) (Cbottom := Cbottom) (S := (S.card : ℝ)) + (Kbottom := Kbottom) (Kcrude := Kcrude) + (w := w) (η := η) hη_pos hw_nonneg + refine ⟨R, ?_, ?_⟩ + · simpa [ρgap, W, C₀, w, η] using hR + intro P hP hStruct hΓ hσ_eq hparams N0 Hshift Dhigh Dcrude Den Ohigh Ocrude + Blead Btail cgap Qpref Qlead Qcut Q q hQq + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hq_pref : Qpref ≤ q := (le_max_left Qpref (max Qlead Qcut)).trans hQq + have hq_lead : Qlead ≤ q := + (le_max_left Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hq_cut : Qcut ≤ q := + (le_max_right Qlead Qcut).trans + ((le_max_right Qpref (max Qlead Qcut)).trans hQq) + have hpref_q : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + exact + hRtail (Blead := Blead) (Btail := Btail) + hBlead_pos hBtail_pos hBlead_lt_Btail q hq_pref + have htail_q := + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hBtail_pos + (by + change Qlead ≤ q + exact hq_lead) + (by + change Qcut ≤ q + exact hq_cut) + (by + change + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) + + max 0 (((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + Kcrude) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + exact hpref_q) + change + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + simpa [N0, Hshift] using htail_q + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailJoint.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailJoint.lean new file mode 100644 index 0000000000..cf853deed4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailJoint.lean @@ -0,0 +1,603 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRawCrude +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailAssembly + +/-! # Bad Scale Tail Joint -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Joint bad-scale component assembly with synchronized constants + +The estimates in this file choose the raw high and crude constants once and +then feed the top, mixed-bottom, and crude-bottom branches into the deterministic +bad-scale split. The large-scale cutoff and denominator lower bounds are still +explicit side conditions; later files discharge them by choosing a threshold. +-/ + +noncomputable section + +/-- Synchronized three-component bad-scale tail bound, before the deterministic +threshold and prefactor absorption steps. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) + + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hhighRaw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + obtain ⟨Ccrude, hCcrude, hcrudeRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hDen hDen_high hDen_crude + hA_one hAcrude_one hq_large + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have htop : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) := by + simpa [K, N0, Hshift, S, b, L, ctop, τ, η, w, Dhigh, A, ρtop] using + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_badPair_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hhighRaw + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hαt hαb hαharm hDen hDen_high hA_one + have hbottom : + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) := by + simpa [K, N0, Hshift, S, b, L, τ, η, w, Dhigh, Dcrude, A, ρbottom, + Cbottom] using + measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel_of_row_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_interpolated_weighted_row_of_soft_max_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params hCfluct hCcrude hCentry ha + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_max_mixed_of_badPair_bounds + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params hCfluct hCcrude hCentry ha hhighRaw hcrudeRaw)) + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hαt hDen hDen_high hDen_crude hA_one + have hcrude : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + simpa [K, N0, Hshift, S, L, η, w, Dcrude, Acrude, ρcrude] using + measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_component_bound + (d := d) (σ := σ) (Ccrude := Ccrude) + hσ_pos hCcrude (params := params) + (measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := σ) (Ccrude := Ccrude) + hσ_pos hCcrude params hcrudeRaw) + (Centry := Centry) (a := a) (t := t) (αbad := αbad) + (Den := Den) hP hStruct hΓ hσ_eq hparams (q := q) + ha ht hαt hDen hDen_crude hAcrude_one + exact + measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + ha hα_nonneg hαt hαa + (by simpa [K, L] using hq_large) + htop hbottom hcrude + +/-- Uniform-in-`σ` synchronized three-component bad-scale tail bound. + +The annealed entry constant and exponent are fixed before `σ`; the high and +crude fluctuation constants are still chosen after the finite moment exponent. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct Ccrude : ℝ, 0 < Cfluct ∧ 0 < Ccrude ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) + + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + obtain ⟨Centry, a, hCentry, ha, hhighBase⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, hCfluct, hhighRaw⟩ := hhighBase hσ_pos + obtain ⟨Ccrude, hCcrude, hcrudeRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, hCfluct, hCcrude, ?_⟩ + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hDen hDen_high hDen_crude + hA_one hAcrude_one hq_large + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have htop : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) := by + simpa [K, N0, Hshift, S, b, L, ctop, τ, η, w, Dhigh, A, ρtop] using + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_badPair_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Centry := Centry) (a := a) + hσ_pos params hCfluct hCentry ha hhighRaw + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hαt hαb hαharm hDen hDen_high hA_one + have hbottom : + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) := by + simpa [K, N0, Hshift, S, b, L, τ, η, w, Dhigh, Dcrude, A, ρbottom, + Cbottom] using + measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel_of_row_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_interpolated_weighted_row_of_soft_max_bound + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params hCfluct hCcrude hCentry ha + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_max_mixed_of_badPair_bounds + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + hσ_pos params hCfluct hCcrude hCentry ha hhighRaw hcrudeRaw)) + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hαt hDen hDen_high hDen_crude hA_one + have hcrude : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + simpa [K, N0, Hshift, S, L, η, w, Dcrude, Acrude, ρcrude] using + measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_kernel_of_component_bound + (d := d) (σ := σ) (Ccrude := Ccrude) + hσ_pos hCcrude (params := params) + (measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := σ) (Ccrude := Ccrude) + hσ_pos hCcrude params hcrudeRaw) + (Centry := Centry) (a := a) (t := t) (αbad := αbad) + (Den := Den) hP hStruct hΓ hσ_eq hparams (q := q) + ha ht hαt hDen hDen_crude hAcrude_one + exact + measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + ha hα_nonneg hαt hαa + (by simpa [K, L] using hq_large) + htop hbottom hcrude + +/-- Same synchronized component-sum bound after selecting the common +denominator that dominates both raw branch denominators. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_selected_denominator + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) + + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hjoint⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hA_one hAcrude_one hq_large + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hDen_bounds := + branch_denominator_le_mixedBottomTailDenominator_pow_eta + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + hη_pos hτ_pos hσ_pos hDhigh_pos hDcrude_pos + simpa [K, S, b, L, τ, η, Dhigh, Dcrude, Den] using + hjoint (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hDen_pos + hDen_bounds.1 hDen_bounds.2 hA_one hAcrude_one hq_large + +/-- Uniform-in-`σ` selected-denominator component-sum bound. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_selected_denominator_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct Ccrude : ℝ, 0 < Cfluct ∧ 0 < Ccrude ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let Acrude : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (σ * t * (L + 1)) / η) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ τ)) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) + + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(Acrude ^ η)) * + weightedGeometricExpKernelConst w (ρcrude ^ σ)) := by + obtain ⟨Centry, a, hCentry, ha, hcomponentBase⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, Ccrude, hCfluct, hCcrude, hjoint⟩ := + hcomponentBase hσ_pos + refine ⟨Cfluct, Ccrude, hCfluct, hCcrude, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hA_one hAcrude_one hq_large + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hDen_bounds := + branch_denominator_le_mixedBottomTailDenominator_pow_eta + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + hη_pos hτ_pos hσ_pos hDhigh_pos hDcrude_pos + simpa [K, S, b, L, τ, η, Dhigh, Dcrude, Den] using + hjoint (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hDen_pos + hDen_bounds.1 hDen_bounds.2 hA_one hAcrude_one hq_large + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRaw.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRaw.lean new file mode 100644 index 0000000000..647ca56515 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRaw.lean @@ -0,0 +1,792 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator + +/-! # Bad Scale Tail Raw -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Raw-constant bad-scale component inputs + +This file exposes the mixed high-bottom fixed-pair estimate with the raw high +and crude pair estimates supplied as hypotheses. This keeps the constants used +by the top, mixed-bottom, and crude-bottom branches synchronized for the final +bad-scale assembly. +-/ + +noncomputable section + +/-- Exact fixed-pair mixed-bottom estimate with the high and crude raw pair +estimates supplied externally, so downstream assembly can use one shared set +of constants. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_max_mixed_of_badPair_bounds + {d : ℕ} [NeZero d] {σ Cfluct Ccrude Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (hCcrude : 0 < Ccrude) + (_hCentry : 0 < Centry) (ha : 0 < a) + (hhighRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) + (hcrudeRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ)))) : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ tau) ((max 1 crudeA) ^ σ)) := by + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n + dsimp only + intro hnm hqm ht hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + by_cases hnq : n ≤ q + · by_cases hell : selectedBadPairScale K a t αbad q m n < n + · let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let crudeLam : ℝ := T / crudeScale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hHighLam : highA ≤ highLam := by + simpa [K, x, ell, b, L, highScale, T, highLam, highA] using + highBottom_tailParameter_interpolation_lower_bound + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) + hK_pos hCfluct hΓ.thetaHat_pos ha ht hαt hell hnq hqm + have hCrudeLam : crudeA ≤ crudeLam := by + simpa [K, x, crudeScale, T, crudeLam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hΓ.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hΓ.thetaHat_pos hnq hqm + have htau_pos : 0 < tau := by + dsimp [tau] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hhighSoft : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA tau := by + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highLam tau := by + by_cases hlam : 1 ≤ highLam + · have hraw := + hhighRaw (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(highLam ^ tau))) := by + simpa [K, x, ell, selectedBadPairScale, N0, Hshift, D, S, tau, + highScale, T, highLam] using + hraw hell hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := highLam) (η := tau) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := highLam) (η := tau) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := highA) (lam₂ := highLam) + (η := tau) htau_pos hHighLam) + have hcrudeSoft : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeA σ := by + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeLam σ := by + by_cases hlam : 1 ≤ crudeLam + · have hraw := + hcrudeRaw (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(crudeLam ^ σ))) := by + simpa [K, Hshift, x, D, S, crudeScale, T, crudeLam] using + hraw hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := crudeA) (lam₂ := crudeLam) + (η := σ) hσ_pos hCrudeLam) + exact + le_maxExponent_softPairTail_of_le_both + (x := P.real (highBottomPairEvent Hshift K a t αbad q m n)) + (pref := pref) (lam₁ := highA) (lam₂ := crudeA) + (η₁ := tau) (η₂ := σ) hhighSoft hcrudeSoft + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hell] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + +/-- Convert the synchronized mixed-bottom soft fixed-pair estimate into the +weighted row estimate with the corrected finite exponent. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_interpolated_weighted_row_of_soft_max_bound + {d : ℕ} [NeZero d] {σ Cfluct Ccrude Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (hCcrude : 0 < Ccrude) + (_hCentry : 0 < Centry) (ha : 0 < a) + (hpair : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ tau) ((max 1 crudeA) ^ σ))) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + t ≤ b → + αbad < t → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q r j + dsimp only + intro ht htb hαt hDen hDen_high hDen_crude + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + by_cases hnm : n < m + · let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + Dhigh + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + Dcrude + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hx := + hpair (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) (m := m) (n := n) + dsimp only at hx + have hfixed : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ)) := by + simpa [K, N0, Hshift, D, S, b, L, τ, pref, highA, crudeA, + Dhigh, Dcrude] using! + hx hnm hqm ht hαt + have hη_pos : 0 < η := by + simpa [η] using + finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hoff_nonneg : 0 ≤ τ * b * (L + 1) := by + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hw_one : 1 ≤ w := by + have hn : 1 ≤ 3 ^ d := + Nat.succ_le_of_lt (pow_pos (by norm_num : (0 : ℕ) < 3) d) + simpa [w] using (by exact_mod_cast hn : (1 : ℝ) ≤ ((3 ^ d : ℕ) : ℝ)) + have hwq_one : 1 ≤ w ^ q := one_le_pow₀ hw_one + have hwr_one : 1 ≤ w ^ r := one_le_pow₀ hw_one + have hDcard : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + have hpref_bound : max 1 pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hD_nonneg : 0 ≤ (D.card : ℝ) := by positivity + have hpref_le : + pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + calc + pref = (S.card : ℝ) * (D.card : ℝ) := rfl + _ ≤ max 1 (S.card : ℝ) * (w ^ q * w ^ r) := + mul_le_mul + (le_max_right 1 (S.card : ℝ)) hDcard + hD_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans + (le_max_left 1 (S.card : ℝ))) + _ = max 1 (S.card : ℝ) * w ^ q * w ^ r := by ring + have hone : + 1 ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hmaxS : 1 ≤ max 1 (S.card : ℝ) := le_max_left 1 (S.card : ℝ) + nlinarith [hmaxS, hwq_one, hwr_one] + exact max_le hone hpref_le + let row : ℝ := τ * (t - αbad) + let offset : ℝ := τ * b * (L + 1) + let X : ℝ := η * (q : ℝ) - offset + row * (r : ℝ) + let Xhigh : ℝ := + τ * + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) + let Xcrude : ℝ := + σ * + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) + have hm_sub_q : m - q = r := by + dsimp [m] + exact Nat.add_sub_cancel_left q r + have hcollapse_raw : + η * (q : ℝ) + τ * (t - αbad) * (r : ℝ) ≤ + max + (τ * + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * (r : ℝ))) + (σ * (t * ((q - n : ℕ) : ℝ) + (t - αbad) * (r : ℝ))) := by + have hmain := + finiteQuenchedTailExponent_mul_nat_add_row_le_max_bottom + (d := d) (q := q) (n := n) (r := r) + (σ := σ) (t := t) (α := αbad) hσ_pos ht hαt + (by simpa [b] using htb) + simpa [b, τ, η] using hmain + have hcollapse : + X ≤ max Xhigh Xcrude := by + have hsub := + sub_nonneg_le_max_sub_left_of_le_max + (c := offset) (by simpa [offset] using hoff_nonneg) + hcollapse_raw + have hX_eq : + X = η * (q : ℝ) + τ * (t - αbad) * (r : ℝ) - offset := by + dsimp [X, row] + ring + have hXhigh_eq : + Xhigh = + τ * + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * (r : ℝ)) - offset := by + dsimp [Xhigh, offset] + rw [hm_sub_q] + ring + have hXcrude_eq : + Xcrude = + σ * (t * ((q - n : ℕ) : ℝ) + (t - αbad) * (r : ℝ)) := by + dsimp [Xcrude] + rw [hm_sub_q] + rw [hX_eq, hXhigh_eq, hXcrude_eq] + exact hsub + have hAρ : + A * ρ ^ r = (3 : ℝ) ^ (X / η) / Den := by + simpa [A, ρ, X, row, offset] using + rpow_three_row_parameter_div_eq + (q := q) (r := r) (offset := offset) + (row := row) (Den := Den) (η := η) hη_pos + have hhigh_exp : + Xhigh / τ = + b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1) := by + dsimp [Xhigh] + field_simp [hτ_pos.ne'] + have hcrude_exp : + Xcrude / σ = + t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) := by + dsimp [Xcrude] + field_simp [hσ_pos.ne'] + have hpow : + (A * ρ ^ r) ^ η ≤ + max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ) := by + rw [hAρ] + have hgeneric := + rpow_three_div_den_le_branch_max_of_exponent_le_max + (X := X) (Xhigh := Xhigh) (Xcrude := Xcrude) + (Dhigh := Dhigh) (Dcrude := Dcrude) (Den := Den) + (η := η) (τ := τ) (σ := σ) + hη_pos hτ_pos hσ_pos hDhigh_pos hDcrude_pos hDen + (by simpa [Dhigh, τ, η] using hDen_high) + (by simpa [Dcrude, η] using hDen_crude) + hcollapse + rw [hhigh_exp, hcrude_exp] at hgeneric + simpa [highA, crudeA] using hgeneric + have hCpref_nonneg : 0 ≤ max 1 (S.card : ℝ) := by + exact (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 (S.card : ℝ)) + have hrow := + le_weighted_row_of_le_soft_maxExponent + (x := P.real (highBottomPairEvent Hshift K a t αbad q m n)) + (pref := pref) (highA := highA) (crudeA := crudeA) + (τ := τ) (σ := σ) (A := A) (ρ := ρ) (η := η) + (C := max 1 (S.card : ℝ)) (w := w) + (q := q) (r := r) + hfixed hpref_bound hCpref_nonneg hw_pos.le hpow + change + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) + calc + P.real (highBottomPairEvent Hshift K a t αbad q m n) + ≤ (Real.exp 1 * max 1 (S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := hrow + _ = (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + dsimp [Cpref] + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + positivity + +/-- Sum synchronized mixed-bottom row estimates into the high-bottom component +bound, still without choosing new constants. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel_of_row_bound + {d : ℕ} [NeZero d] {σ Cfluct Ccrude Centry a : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hrow : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → + hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + t ≤ b → + αbad < t → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → + hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + αbad < t → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cpref * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hαt hDen hDen_high hDen_crude hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + simpa [η] using + finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hexp_pos : 0 < τ * (t - αbad) / η := by + exact div_pos (mul_pos hτ_pos (sub_pos.mpr hαt)) hη_pos + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (τ * (t - αbad) / η) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hexp_pos + have hC_nonneg : 0 ≤ Cpref * w ^ q := by + dsimp [Cpref] + positivity + exact + measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := η) + (C := Cpref * w ^ q) (w := w) + hC_nonneg hw_pos hA_one hρ_gt hη_pos + (by + intro r j + simpa [K, N0, Hshift, S, b, L, τ, η, w, Dhigh, Dcrude, + A, ρ, Cpref] using + hrow (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams + (q := q) (r := r) (j := j) + ht htb hαt hDen hDen_high hDen_crude) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRawCrude.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRawCrude.lean new file mode 100644 index 0000000000..45c4b055f7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailRawCrude.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailRaw + +/-! # Bad Scale Tail Raw Crude -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Raw-constant crude-bottom component + +This file exposes the crude-bottom component estimate with the raw crude +fixed-pair estimate supplied externally. It is used to keep the crude branch +constant synchronized with the mixed high-bottom branch in the final bad-scale +assembly. +-/ + +noncomputable section + +/-- Crude-bottom component estimate using a supplied raw crude fixed-pair tail. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + {d : ℕ} [NeZero d] {σ Ccrude : ℝ} + (hσ_pos : 0 < σ) (hCcrude : 0 < Ccrude) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hcrudeRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ)))) : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + intro Centry a t αbad P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hC_nonneg : 0 ≤ (S.card : ℝ) * w ^ q := by + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hA_one_local : 1 ≤ A := by + simpa [A, K, L] using hA_one + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + exact + measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := σ) + (C := (S.card : ℝ) * w ^ q) (w := w) + hC_nonneg hw_pos hA_one_local hρ_gt hσ_pos + (by + intro r j + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := selectedBadPairScale K a t αbad q m n + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hρ_pos : 0 < ρ := by + dsimp [ρ] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hA_nonneg : 0 ≤ A := by linarith + have hAρ_nonneg : 0 ≤ A * ρ ^ r := + mul_nonneg hA_nonneg (pow_nonneg hρ_pos.le r) + have htail_nonneg : + 0 ≤ ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + exact mul_nonneg + (mul_nonneg (by positivity) (pow_nonneg hw_pos.le q)) + (mul_nonneg (pow_nonneg hw_pos.le r) (Real.exp_pos _).le) + by_cases hnℓ_sel : n ≤ selectedBadPairScale K a t αbad q m n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hnℓ : n ≤ ℓ := by + simpa [hℓ_eq] using hnℓ_sel + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + crudeBottom_lam_lower + (d := d) (K := K) (C := Ccrude) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCcrude hΓ.thetaHat_pos ha ht hαt + hnℓ hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul hA_one_local hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hraw := + hcrudeRaw (t := t) (αbad := αbad) hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + simpa [K, Hshift, x, D, S, scale, T, lam] using + hraw hnm hqm hlam_one + have hD : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + exact + measureReal_crudeBottomPairEvent_le_weighted_row_of_badPair_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + (r := r) (S := (S.card : ℝ)) (D := (D.card : ℝ)) + (A := A) (ρ := ρ) (σ := σ) (lam := lam) (w := w) + (by positivity) hw_pos.le hD hAρ_nonneg hlam_lower hσ_pos hbad + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, hnℓ_sel] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailSelected.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailSelected.lean new file mode 100644 index 0000000000..453244d318 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailSelected.lean @@ -0,0 +1,729 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds + +/-! # Bad Scale Tail Selected -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Selected-denominator bad-scale tail collapse + +This file reattaches the deterministic collapse from `BadScaleTailCollapse` to +the synchronized selected-denominator component theorem. +-/ + +noncomputable section + +/-- The selected-denominator bad-scale estimate collapsed to one finite-`sigma` +tail, up to the deterministic large-scale and prefactor-gap inequalities. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_prefactor_gap + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + let CcrudeBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + weightedGeometricExpKernelConst w (ρcrude ^ σ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Btail → + 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + max 0 Ctop + max 0 ChighBottom + max 0 CcrudeBottom ≤ + Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hselected⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_selected_denominator + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Btail P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa _hBtail hlead_one hq_large hpref + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - Ohigh) / Den + let Acrude : ℝ := (3 : ℝ) ^ ((q : ℝ) - Ocrude) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hDen_pos : 0 < Den := by + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hAlead_A : Alead ≤ A ^ η := by + have hden : Den * (3 : ℝ) ^ Ohigh ≤ Blead := by + dsimp [Blead] + exact le_max_left _ _ + simpa [Alead, A] using + selected_tail_parameter_power_le_high + (q := q) (Den := Den) (B := Blead) (η := η) (O := Ohigh) + hDen_pos hBlead_pos hη_pos hden + have hAlead_Acrude : Alead ≤ Acrude ^ η := by + have hden : Den * (3 : ℝ) ^ Ocrude ≤ Blead := by + dsimp [Blead] + exact le_max_right _ _ + simpa [Alead, Acrude] using + selected_tail_parameter_power_le_high + (q := q) (Den := Den) (B := Blead) (η := η) (O := Ocrude) + hDen_pos hBlead_pos hη_pos hden + have hA_one : 1 ≤ A := by + have hlead_A : (3 : ℝ) ^ (q : ℝ) / Blead ≤ A := by + have hden : Den * (3 : ℝ) ^ Ohigh ≤ Blead := by + dsimp [Blead] + exact le_max_left _ _ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + calc + (3 : ℝ) ^ (q : ℝ) / Blead + ≤ (3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ Ohigh) := + div_le_div_of_nonneg_left hpow_nonneg + (mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh)) + hden + _ = A := by + exact (rpow_three_sub_div_eq_div_mul_rpow + (x := (q : ℝ)) (O := Ohigh) (Den := Den) + hDen_pos.ne').symm + exact hlead_one.trans hlead_A + have hAcrude_one : 1 ≤ Acrude := by + have hlead_A : (3 : ℝ) ^ (q : ℝ) / Blead ≤ Acrude := by + have hden : Den * (3 : ℝ) ^ Ocrude ≤ Blead := by + dsimp [Blead] + exact le_max_right _ _ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + calc + (3 : ℝ) ^ (q : ℝ) / Blead + ≤ (3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ Ocrude) := + div_le_div_of_nonneg_left hpow_nonneg + (mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ocrude)) + hden + _ = Acrude := by + exact (rpow_three_sub_div_eq_div_mul_rpow + (x := (q : ℝ)) (O := Ocrude) (Den := Den) + hDen_pos.ne').symm + exact hlead_one.trans hlead_A + have hcomponent := + hselected (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa + hA_one hAcrude_one hq_large + exact + measureReal_badScaleEvent_le_exp_tail_of_selected_component_sum + (μ := P) (H := Hshift) (t := t) (α := αbad) (q := q) + (S := (S.card : ℝ)) (qPlus := ((q + 1 : ℕ) : ℝ)) + (Cbottom := Cbottom) (wq := w ^ q) + (Ktop := weightedLinearExpKernelConst w (ρtop ^ τ)) + (Kbottom := weightedGeometricExpKernelConst w (ρbottom ^ η)) + (Kcrude := weightedGeometricExpKernelConst w (ρcrude ^ σ)) + (A := A) (Acrude := Acrude) (Alead := Alead) (Atail := Atail) + (η := η) + (by + simpa [K, N0, Hshift, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, + Den, Ohigh, Ocrude, A, Acrude, ρtop, ρbottom, ρcrude, Cbottom] + using hcomponent) + hAlead_A hAlead_Acrude + (by + simpa [K, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, Den, + Ohigh, Ocrude, Blead, Alead, Atail, ρtop, ρbottom, ρcrude, + Cbottom] using hpref) + +/-- Uniform-in-`σ` version of +`measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_prefactor_gap`. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_prefactor_gap_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct Ccrude : ℝ, 0 < Cfluct ∧ 0 < Ccrude ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + let CcrudeBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + weightedGeometricExpKernelConst w (ρcrude ^ σ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Btail → + 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + max 0 Ctop + max 0 ChighBottom + max 0 CcrudeBottom ≤ + Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Centry, a, hCentry, ha, hselectedBase⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_component_sum_selected_denominator_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, Ccrude, hCfluct, hCcrude, hselected⟩ := + hselectedBase hσ_pos + refine ⟨Cfluct, Ccrude, hCfluct, hCcrude, ?_⟩ + intro t αbad Btail P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa _hBtail hlead_one hq_large hpref + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - Ohigh) / Den + let Acrude : ℝ := (3 : ℝ) ^ ((q : ℝ) - Ocrude) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hDen_pos : 0 < Den := by + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hAlead_A : Alead ≤ A ^ η := by + have hden : Den * (3 : ℝ) ^ Ohigh ≤ Blead := by + dsimp [Blead] + exact le_max_left _ _ + simpa [Alead, A] using + selected_tail_parameter_power_le_high + (q := q) (Den := Den) (B := Blead) (η := η) (O := Ohigh) + hDen_pos hBlead_pos hη_pos hden + have hAlead_Acrude : Alead ≤ Acrude ^ η := by + have hden : Den * (3 : ℝ) ^ Ocrude ≤ Blead := by + dsimp [Blead] + exact le_max_right _ _ + simpa [Alead, Acrude] using + selected_tail_parameter_power_le_high + (q := q) (Den := Den) (B := Blead) (η := η) (O := Ocrude) + hDen_pos hBlead_pos hη_pos hden + have hA_one : 1 ≤ A := by + have hlead_A : (3 : ℝ) ^ (q : ℝ) / Blead ≤ A := by + have hden : Den * (3 : ℝ) ^ Ohigh ≤ Blead := by + dsimp [Blead] + exact le_max_left _ _ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + calc + (3 : ℝ) ^ (q : ℝ) / Blead + ≤ (3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ Ohigh) := + div_le_div_of_nonneg_left hpow_nonneg + (mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ohigh)) + hden + _ = A := by + exact (rpow_three_sub_div_eq_div_mul_rpow + (x := (q : ℝ)) (O := Ohigh) (Den := Den) + hDen_pos.ne').symm + exact hlead_one.trans hlead_A + have hAcrude_one : 1 ≤ Acrude := by + have hlead_A : (3 : ℝ) ^ (q : ℝ) / Blead ≤ Acrude := by + have hden : Den * (3 : ℝ) ^ Ocrude ≤ Blead := by + dsimp [Blead] + exact le_max_right _ _ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + calc + (3 : ℝ) ^ (q : ℝ) / Blead + ≤ (3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ Ocrude) := + div_le_div_of_nonneg_left hpow_nonneg + (mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) Ocrude)) + hden + _ = Acrude := by + exact (rpow_three_sub_div_eq_div_mul_rpow + (x := (q : ℝ)) (O := Ocrude) (Den := Den) + hDen_pos.ne').symm + exact hlead_one.trans hlead_A + have hcomponent := + hselected (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa + hA_one hAcrude_one hq_large + exact + measureReal_badScaleEvent_le_exp_tail_of_selected_component_sum + (μ := P) (H := Hshift) (t := t) (α := αbad) (q := q) + (S := (S.card : ℝ)) (qPlus := ((q + 1 : ℕ) : ℝ)) + (Cbottom := Cbottom) (wq := w ^ q) + (Ktop := weightedLinearExpKernelConst w (ρtop ^ τ)) + (Kbottom := weightedGeometricExpKernelConst w (ρbottom ^ η)) + (Kcrude := weightedGeometricExpKernelConst w (ρcrude ^ σ)) + (A := A) (Acrude := Acrude) (Alead := Alead) (Atail := Atail) + (η := η) + (by + simpa [K, N0, Hshift, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, + Den, Ohigh, Ocrude, A, Acrude, ρtop, ρbottom, ρcrude, Cbottom] + using hcomponent) + hAlead_A hAlead_Acrude + (by + simpa [K, S, b, L, ctop, τ, η, w, Dhigh, Dcrude, Den, + Ohigh, Ocrude, Blead, Alead, Atail, ρtop, ρbottom, ρcrude, + Cbottom] using hpref) + +/-- The same tail collapse after discharging the deterministic lower bound on +the lead tail parameter and the crude-top cutoff by explicit ceiling +thresholds. The prefactor gap is the only remaining large-scale condition. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + let CcrudeBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + weightedGeometricExpKernelConst w (ρcrude ^ σ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Btail → + Nat.ceil (Real.log Blead / Real.log 3) ≤ q → + Nat.ceil ((L + 1) / (1 - αbad / a) + 1) ≤ q → + max 0 Ctop + max 0 ChighBottom + max 0 CcrudeBottom ≤ + Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, htail⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_prefactor_gap + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Btail P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hBtail hq_lead hq_cut hpref + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hlead_one : 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead := by + simpa [Blead] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := (1 : ℝ)) (O := (0 : ℝ)) (D := Blead) (q := q) + (by norm_num) hBlead_pos + (by + simpa [K, b, L, τ, η, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hq_lead) + have hδ : 0 < 1 - αbad / a := by + have hdiv : αbad / a < 1 := by + rw [div_lt_iff₀ ha] + nlinarith + linarith + have hcut : + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + 1 < + (1 - αbad / a) * (q : ℝ) := by + simpa [L] using + large_scale_cutoff_of_natCeil_add_one_le + (L := L) (δ := 1 - αbad / a) (q := q) hδ hq_cut + exact + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hBtail + (by simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hlead_one) + (by simpa [K] using hcut) + (by + simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hpref) + +/-- Uniform-in-`σ` version of +`measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap`. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_thresholds_and_prefactor_gap_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct Ccrude : ℝ, 0 < Cfluct ∧ 0 < Ccrude ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + let CcrudeBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + weightedGeometricExpKernelConst w (ρcrude ^ σ) + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + 0 < Btail → + Nat.ceil (Real.log Blead / Real.log 3) ≤ q → + Nat.ceil ((L + 1) / (1 - αbad / a) + 1) ≤ q → + max 0 Ctop + max 0 ChighBottom + max 0 CcrudeBottom ≤ + Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Centry, a, hCentry, ha, htailBase⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_interpolated_tail_of_prefactor_gap_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, Ccrude, hCfluct, hCcrude, htail⟩ := + htailBase hσ_pos + refine ⟨Cfluct, Ccrude, hCfluct, hCcrude, ?_⟩ + intro t αbad Btail P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa hBtail hq_lead hq_cut hpref + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + have hDen_pos : 0 < Den := by + simpa [Den] using + mixedBottomTailDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (η := η) (τ := τ) (σ := σ) + have hBlead_pos : 0 < Blead := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hleft : 0 < Den * (3 : ℝ) ^ Ohigh := + mul_pos hDen_pos (Real.rpow_pos_of_pos h3 Ohigh) + exact hleft.trans_le (le_max_left _ _) + have hlead_one : 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead := by + simpa [Blead] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := (1 : ℝ)) (O := (0 : ℝ)) (D := Blead) (q := q) + (by norm_num) hBlead_pos + (by + simpa [K, b, L, τ, η, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hq_lead) + have hδ : 0 < 1 - αbad / a := by + have hdiv : αbad / a < 1 := by + rw [div_lt_iff₀ ha] + nlinarith + linarith + have hcut : + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + 1 < + (1 - αbad / a) * (q : ℝ) := by + simpa [L] using + large_scale_cutoff_of_natCeil_add_one_le + (L := L) (δ := 1 - αbad / a) (q := q) hδ hq_cut + exact + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hΓ hσ_eq hparams (q := q) + ht htb hα_nonneg hαt hαb hαharm hαa hBtail + (by simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hlead_one) + (by simpa [K] using hcut) + (by + simpa [K, S, b, L, τ, η, w, Dhigh, Dcrude, Den, Ohigh, Ocrude, + Blead] using hpref) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailTwoBranch.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailTwoBranch.lean new file mode 100644 index 0000000000..ce141d7187 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleTailTwoBranch.lean @@ -0,0 +1,767 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailExponent +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentRows + +/-! # Bad Scale Tail Two Branch -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Two-branch bad-scale tails + +This file starts the theorem-facing bad-scale tail assembly. The first step is +still fixed-pair: in the mixed bottom range, use the localized and crude +mechanisms separately for the same selected scale and then keep the better of +the two tails by taking the maximum of their stretched-exponential exponents. +-/ + +noncomputable section + +/-- If a quantity is bounded by `max y z`, then subtracting a nonnegative +offset only from the left branch still controls the offset quantity. -/ +theorem sub_nonneg_le_max_sub_left_of_le_max + {x y z c : ℝ} (hc : 0 ≤ c) (h : x ≤ max y z) : + x - c ≤ max (y - c) z := by + by_cases hyz : y ≤ z + · have hxz : x ≤ z := by simpa [max_eq_right hyz] using h + exact le_max_of_le_right (by linarith) + · have hzy : z ≤ y := le_of_not_ge hyz + have hxy : x ≤ y := by simpa [max_eq_left hzy] using h + exact le_max_of_le_left (by linarith) + +/-- Multiplicative row parameters written as a single triadic exponent. -/ +theorem rpow_three_row_parameter_div_eq + {q r : ℕ} {offset row Den η : ℝ} (hη : 0 < η) : + ((3 : ℝ) ^ ((q : ℝ) - offset / η) / Den) * + (((3 : ℝ) ^ (row / η)) ^ r) = + (3 : ℝ) ^ ((η * (q : ℝ) - offset + row * (r : ℝ)) / η) / Den := by + have hpow : + (((3 : ℝ) ^ (row / η)) ^ r) = + (3 : ℝ) ^ ((row / η) * (r : ℝ)) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + rw [hpow] + calc + ((3 : ℝ) ^ ((q : ℝ) - offset / η) / Den) * + (3 : ℝ) ^ ((row / η) * (r : ℝ)) + = + ((3 : ℝ) ^ ((q : ℝ) - offset / η) * + (3 : ℝ) ^ ((row / η) * (r : ℝ))) / Den := by + ring + _ = + (3 : ℝ) ^ (((q : ℝ) - offset / η) + (row / η) * (r : ℝ)) / + Den := by + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + _ = + (3 : ℝ) ^ ((η * (q : ℝ) - offset + row * (r : ℝ)) / η) / Den := by + congr 2 + field_simp [hη.ne'] + +/-- Deterministic comparison turning an exponent-level maximum into a +tail-parameter maximum, with explicit denominator domination. -/ +theorem rpow_three_div_den_le_branch_max_of_exponent_le_max + {X Xhigh Xcrude Dhigh Dcrude Den η τ σ : ℝ} + (hη : 0 < η) (hτ : 0 < τ) (hσ : 0 < σ) + (hDhigh : 0 < Dhigh) (hDcrude : 0 < Dcrude) (hDen : 0 < Den) + (hDen_high : Dhigh ^ τ ≤ Den ^ η) + (hDen_crude : Dcrude ^ σ ≤ Den ^ η) + (hX : X ≤ max Xhigh Xcrude) : + ((3 : ℝ) ^ (X / η) / Den) ^ η ≤ + max + ((max 1 ((3 : ℝ) ^ (Xhigh / τ) / Dhigh)) ^ τ) + ((max 1 ((3 : ℝ) ^ (Xcrude / σ) / Dcrude)) ^ σ) := by + have hthree_pos : 0 < (3 : ℝ) := by norm_num + have hthree_nonneg : 0 ≤ (3 : ℝ) := by norm_num + have hDenη_pos : 0 < Den ^ η := Real.rpow_pos_of_pos hDen η + have hDhighτ_pos : 0 < Dhigh ^ τ := Real.rpow_pos_of_pos hDhigh τ + have hDcrudeσ_pos : 0 < Dcrude ^ σ := Real.rpow_pos_of_pos hDcrude σ + have hleft_eq : + ((3 : ℝ) ^ (X / η) / Den) ^ η = + (3 : ℝ) ^ X / Den ^ η := by + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDen.le η] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hη.ne'] + have hhigh_eq : + ((3 : ℝ) ^ (Xhigh / τ) / Dhigh) ^ τ = + (3 : ℝ) ^ Xhigh / Dhigh ^ τ := by + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDhigh.le τ] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hτ.ne'] + have hcrude_eq : + ((3 : ℝ) ^ (Xcrude / σ) / Dcrude) ^ σ = + (3 : ℝ) ^ Xcrude / Dcrude ^ σ := by + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDcrude.le σ] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hσ.ne'] + have hhigh_base_nonneg : + 0 ≤ (3 : ℝ) ^ (Xhigh / τ) / Dhigh := by + exact div_nonneg (Real.rpow_pos_of_pos hthree_pos _).le hDhigh.le + have hcrude_base_nonneg : + 0 ≤ (3 : ℝ) ^ (Xcrude / σ) / Dcrude := by + exact div_nonneg (Real.rpow_pos_of_pos hthree_pos _).le hDcrude.le + have hhigh_power_le : + ((3 : ℝ) ^ (Xhigh / τ) / Dhigh) ^ τ ≤ + (max 1 ((3 : ℝ) ^ (Xhigh / τ) / Dhigh)) ^ τ := + Real.rpow_le_rpow hhigh_base_nonneg + (le_max_right 1 ((3 : ℝ) ^ (Xhigh / τ) / Dhigh)) hτ.le + have hcrude_power_le : + ((3 : ℝ) ^ (Xcrude / σ) / Dcrude) ^ σ ≤ + (max 1 ((3 : ℝ) ^ (Xcrude / σ) / Dcrude)) ^ σ := + Real.rpow_le_rpow hcrude_base_nonneg + (le_max_right 1 ((3 : ℝ) ^ (Xcrude / σ) / Dcrude)) hσ.le + by_cases hbranch : Xhigh ≤ Xcrude + · have hXcrude : X ≤ Xcrude := by + simpa [max_eq_right hbranch] using hX + have hpow : + (3 : ℝ) ^ X ≤ (3 : ℝ) ^ Xcrude := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hXcrude + have hraw : + (3 : ℝ) ^ X / Den ^ η ≤ + (3 : ℝ) ^ Xcrude / Dcrude ^ σ := by + calc + (3 : ℝ) ^ X / Den ^ η + ≤ (3 : ℝ) ^ Xcrude / Den ^ η := + div_le_div_of_nonneg_right hpow hDenη_pos.le + _ ≤ (3 : ℝ) ^ Xcrude / Dcrude ^ σ := + div_le_div_of_nonneg_left + (Real.rpow_pos_of_pos hthree_pos Xcrude).le + hDcrudeσ_pos hDen_crude + rw [hleft_eq] + exact le_max_of_le_right (hraw.trans (by simpa [hcrude_eq] using hcrude_power_le)) + · have hcrude_le_high : Xcrude ≤ Xhigh := le_of_not_ge hbranch + have hXhigh : X ≤ Xhigh := by + simpa [max_eq_left hcrude_le_high] using hX + have hpow : + (3 : ℝ) ^ X ≤ (3 : ℝ) ^ Xhigh := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hXhigh + have hraw : + (3 : ℝ) ^ X / Den ^ η ≤ + (3 : ℝ) ^ Xhigh / Dhigh ^ τ := by + calc + (3 : ℝ) ^ X / Den ^ η + ≤ (3 : ℝ) ^ Xhigh / Den ^ η := + div_le_div_of_nonneg_right hpow hDenη_pos.le + _ ≤ (3 : ℝ) ^ Xhigh / Dhigh ^ τ := + div_le_div_of_nonneg_left + (Real.rpow_pos_of_pos hthree_pos Xhigh).le + hDhighτ_pos hDen_high + rw [hleft_eq] + exact le_max_of_le_left (hraw.trans (by simpa [hhigh_eq] using hhigh_power_le)) + +/-- Convert a max-exponent soft fixed-pair estimate into the weighted row +shape used by the bad-scale summation lemmas. -/ +theorem le_weighted_row_of_le_soft_maxExponent + {x pref highA crudeA τ σ A ρ η C w : ℝ} {q r : ℕ} + (hx : + x ≤ max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ))) + (hpref : max 1 pref ≤ C * w ^ q * w ^ r) + (hC : 0 ≤ C) (hw : 0 ≤ w) + (hpow : + (A * ρ ^ r) ^ η ≤ + max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ)) : + x ≤ + (Real.exp 1 * C * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + have hexp : + Real.exp + (1 - max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ)) ≤ + Real.exp (1 - (A * ρ ^ r) ^ η) := + Real.exp_le_exp.mpr (by linarith) + have hrow_nonneg : 0 ≤ C * w ^ q * w ^ r := by + positivity + have hexp_split : + Real.exp (1 - (A * ρ ^ r) ^ η) = + Real.exp 1 * Real.exp (-((A * ρ ^ r) ^ η)) := by + rw [← Real.exp_add] + congr 1 + calc + x ≤ max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ)) := hx + _ ≤ (C * w ^ q * w ^ r) * + Real.exp (1 - (A * ρ ^ r) ^ η) := + mul_le_mul hpref hexp (Real.exp_pos _).le hrow_nonneg + _ = + (Real.exp 1 * C * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + rw [hexp_split] + ring + +/-- Exact fixed-pair mixed-bottom estimate with the better of the localized +and crude mechanisms retained as a maximum of exponents. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_max_mixed + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let tau : ℝ := min σ 2 + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ)) + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ tau) ((max 1 crudeA) ^ σ)) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hhighRaw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + obtain ⟨Ccrude, hCcrude, hcrudeRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hΓ hσ_eq hparams q m n K N0 Hshift D S b L tau pref highA + crudeA hnm hqm ht hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + by_cases hnq : n ≤ q + · by_cases hell : selectedBadPairScale K a t αbad q m n < n + · let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + let crudeScale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let crudeLam : ℝ := T / crudeScale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hHighLam : highA ≤ highLam := by + simpa [K, x, ell, b, L, highScale, T, highLam, highA] using + highBottom_tailParameter_interpolation_lower_bound + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hΓ.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) + hK_pos hCfluct hΓ.thetaHat_pos ha ht hαt hell hnq hqm + have hCrudeLam : crudeA ≤ crudeLam := by + simpa [K, x, crudeScale, T, crudeLam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hΓ.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hΓ.thetaHat_pos hnq hqm + have htau_pos : 0 < tau := by + dsimp [tau] + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hhighSoft : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA tau := by + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highLam tau := by + by_cases hlam : 1 ≤ highLam + · have hraw := + hhighRaw (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(highLam ^ tau))) := by + simpa [K, x, ell, selectedBadPairScale, N0, Hshift, D, S, tau, + highScale, T, highLam] using + hraw hell hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := highLam) (η := tau) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := highLam) (η := tau) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := highA) (lam₂ := highLam) + (η := tau) htau_pos hHighLam) + have hcrudeSoft : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeA σ := by + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref crudeLam σ := by + by_cases hlam : 1 ≤ crudeLam + · have hraw := + hcrudeRaw (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(crudeLam ^ σ))) := by + simpa [K, Hshift, x, D, S, crudeScale, T, crudeLam] using + hraw hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := crudeLam) (η := σ) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := crudeA) (lam₂ := crudeLam) + (η := σ) hσ_pos hCrudeLam) + exact + le_maxExponent_softPairTail_of_le_both + (x := P.real (highBottomPairEvent Hshift K a t αbad q m n)) + (pref := pref) (lam₁ := highA) (lam₂ := crudeA) + (η₁ := tau) (η₂ := σ) hhighSoft hcrudeSoft + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hell] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact mul_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 pref)) + (Real.exp_pos _).le + +/-- A nonnegative counting factor bounded by two weights stays bounded after adjoining one. -/ +private theorem max_one_mul_le_weighted_product {a x u v : ℝ} + (hx0 : 0 ≤ x) (hx : x ≤ u * v) (hu : 1 ≤ u) (hv : 1 ≤ v) : + max 1 (a * x) ≤ max 1 a * u * v := by + apply max_le + · exact one_le_mul₀ (one_le_mul₀ (le_max_left 1 a) hu) hv + · calc + a * x ≤ max 1 a * (u * v) := + mul_le_mul (le_max_right 1 a) hx hx0 (zero_le_one.trans (le_max_left 1 a)) + _ = max 1 a * u * v := (mul_assoc _ _ _).symm + +/-- Concrete mixed-bottom fixed-pair estimate in the weighted row shape, with +the corrected finite bad-scale exponent. The only remaining denominator +conditions are explicit algebraic domination conditions for the chosen +normalizing denominator `Den`. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_interpolated_weighted_row_of_denominator + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + t ≤ b → + αbad < t → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hpair⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_max_mixed + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q r j K N0 Hshift S b L τ η w Dhigh + Dcrude A ρ Cpref m n ht htb hαt hDen hDen_high hDen_crude + classical + let : IsProbabilityMeasure P := hP.isProbability + by_cases hnm : n < m + · let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + Dhigh + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + Dcrude + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hx := + hpair (t := t) (αbad := αbad) + hP hStruct hΓ hσ_eq hparams (q := q) (m := m) (n := n) + dsimp only at hx + have hfixed : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + max 1 pref * + Real.exp + (1 - max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ)) := by + simpa [K, N0, Hshift, D, S, b, L, τ, pref, highA, crudeA, + Dhigh, Dcrude] using! + hx hnm hqm ht hαt + have hη_pos : 0 < η := + finiteQuenchedTailExponent_pos (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := finiteQuenchedTailTau_pos hσ_pos + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hΓ.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hΓ.thetaHat_pos 2) + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hL_nonneg : 0 ≤ L := by + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + dsimp [L] + positivity + have hoff_nonneg : 0 ≤ τ * b * (L + 1) := by + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hw_one : 1 ≤ w := by + have hn : 1 ≤ 3 ^ d := + Nat.succ_le_of_lt (pow_pos (by norm_num : (0 : ℕ) < 3) d) + simpa [w] using (by exact_mod_cast hn : (1 : ℝ) ≤ ((3 ^ d : ℕ) : ℝ)) + have hwq_one : 1 ≤ w ^ q := one_le_pow₀ hw_one + have hwr_one : 1 ≤ w ^ r := one_le_pow₀ hw_one + have hDcard : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + have hpref_bound : max 1 pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := + max_one_mul_le_weighted_product (by positivity) hDcard hwq_one hwr_one + let row : ℝ := τ * (t - αbad) + let offset : ℝ := τ * b * (L + 1) + let X : ℝ := η * (q : ℝ) - offset + row * (r : ℝ) + let Xhigh : ℝ := + τ * + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) + let Xcrude : ℝ := + σ * + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) + have hm_sub_q : m - q = r := by + dsimp [m] + exact Nat.add_sub_cancel_left q r + have hcollapse_raw := + finiteQuenchedTailExponent_mul_nat_add_row_le_max_bottom + (d := d) (q := q) (n := n) (r := r) + (σ := σ) (t := t) (α := αbad) hσ_pos ht hαt + (by simpa [b] using htb) + have hcollapse : X ≤ max Xhigh Xcrude := by + have hsub := + sub_nonneg_le_max_sub_left_of_le_max + (c := offset) (by simpa [offset] using hoff_nonneg) hcollapse_raw + convert hsub using 1 + · dsimp [X, row] + ring + · congr 1 + · dsimp [Xhigh, offset] + rw [hm_sub_q] + ring + · dsimp [Xcrude] + rw [hm_sub_q] + have hAρ : + A * ρ ^ r = (3 : ℝ) ^ (X / η) / Den := by + simpa [A, ρ, X, row, offset] using + rpow_three_row_parameter_div_eq + (q := q) (r := r) (offset := offset) + (row := row) (Den := Den) (η := η) hη_pos + have hhigh_exp : + Xhigh / τ = + b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1) := by + dsimp [Xhigh] + field_simp [hτ_pos.ne'] + have hcrude_exp : + Xcrude / σ = + t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) := by + dsimp [Xcrude] + field_simp [hσ_pos.ne'] + have hpow : + (A * ρ ^ r) ^ η ≤ + max ((max 1 highA) ^ τ) ((max 1 crudeA) ^ σ) := by + rw [hAρ] + have hgeneric := + rpow_three_div_den_le_branch_max_of_exponent_le_max + (X := X) (Xhigh := Xhigh) (Xcrude := Xcrude) + (Dhigh := Dhigh) (Dcrude := Dcrude) (Den := Den) + (η := η) (τ := τ) (σ := σ) + hη_pos hτ_pos hσ_pos hDhigh_pos hDcrude_pos hDen + (by simpa [Dhigh, τ, η] using hDen_high) + (by simpa [Dcrude, η] using hDen_crude) + hcollapse + rw [hhigh_exp, hcrude_exp] at hgeneric + simpa [highA, crudeA] using hgeneric + have hCpref_nonneg : 0 ≤ max 1 (S.card : ℝ) := by + exact (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 (S.card : ℝ)) + have hrow := + le_weighted_row_of_le_soft_maxExponent + (x := P.real (highBottomPairEvent Hshift K a t αbad q m n)) + (pref := pref) (highA := highA) (crudeA := crudeA) + (τ := τ) (σ := σ) (A := A) (ρ := ρ) (η := η) + (C := max 1 (S.card : ℝ)) (w := w) + (q := q) (r := r) + hfixed hpref_bound hCpref_nonneg hw_pos.le hpow + exact hrow + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + positivity + +/-- Summed high-bottom component estimate with the corrected finite +interpolated exponent, conditional only on the explicit denominator choice and +the deterministic lower cutoff `1 <= A`. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_interpolated_weighted_kernel_of_denominator + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + t ≤ b → + αbad < t → + 0 < Den → + Dhigh ^ τ ≤ Den ^ η → + Dcrude ^ σ ≤ Den ^ η → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cpref * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hrow⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_interpolated_weighted_row_of_denominator + (d := d) (σ := σ) hσ_pos params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hΓ hσ_eq hparams q + dsimp only + intro ht htb hαt hDen hDen_high hDen_crude hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let A : ℝ := + (3 : ℝ) ^ ((q : ℝ) - (τ * b * (L + 1)) / η) / Den + let ρ : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + simpa [η] using + finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ_pos + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hexp_pos : 0 < τ * (t - αbad) / η := by + exact div_pos (mul_pos hτ_pos (sub_pos.mpr hαt)) hη_pos + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (τ * (t - αbad) / η) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hexp_pos + have hC_nonneg : 0 ≤ Cpref * w ^ q := by + dsimp [Cpref] + positivity + exact + measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := η) + (C := Cpref * w ^ q) (w := w) + hC_nonneg hw_pos hA_one hρ_gt hη_pos + (by + intro r j + simpa [K, N0, Hshift, S, b, L, τ, η, w, Dhigh, Dcrude, + A, ρ, Cpref] using + hrow (t := t) (αbad := αbad) (Den := Den) + hP hStruct hΓ hσ_eq hparams + (q := q) (r := r) (j := j) + ht htb hαt hDen hDen_high hDen_crude) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleThresholds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleThresholds.lean new file mode 100644 index 0000000000..523d69e2bd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleThresholds.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds + +/-! # Bad Scale Thresholds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Deterministic large-scale thresholds + +These elementary real-variable lemmas discharge the side conditions in the +concrete bad-scale kernel once the bad scale is chosen above an explicit +deterministic threshold. +-/ + +noncomputable section + +/-- If `q` is above the logarithmic threshold associated with a denominator +`D`, then the base-three tail parameter is at least one. -/ +theorem one_le_rpow_three_linear_sub_div_of_log_bound + {β O D q : ℝ} + (hβ : 0 < β) (hD : 0 < D) + (hq : + (Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ)) ≤ q) : + 1 ≤ ((3 : ℝ) ^ (β * q - O)) / D := by + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hden_pos : 0 < β * Real.log (3 : ℝ) := mul_pos hβ hlog3_pos + have hmul := + mul_le_mul_of_nonneg_left hq hden_pos.le + have hcancel : + β * Real.log (3 : ℝ) * + ((Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ))) = + Real.log D + O * Real.log (3 : ℝ) := by + field_simp [hden_pos.ne'] + have hlog_le : + Real.log D ≤ (β * q - O) * Real.log (3 : ℝ) := by + rw [hcancel] at hmul + nlinarith + have hD_le_exp : + D ≤ Real.exp ((β * q - O) * Real.log (3 : ℝ)) := + (Real.log_le_iff_le_exp hD).mp hlog_le + have hrpow_eq : + ((3 : ℝ) ^ (β * q - O)) = + Real.exp ((β * q - O) * Real.log (3 : ℝ)) := by + rw [Real.rpow_def_of_pos (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring + have hD_le_pow : D ≤ ((3 : ℝ) ^ (β * q - O)) := by + simpa [hrpow_eq] using hD_le_exp + calc + (1 : ℝ) = D / D := by field_simp [hD.ne'] + _ ≤ ((3 : ℝ) ^ (β * q - O)) / D := + div_le_div_of_nonneg_right hD_le_pow hD.le + +/-- Natural-scale version of +`one_le_rpow_three_linear_sub_div_of_log_bound`. -/ +theorem one_le_rpow_three_linear_sub_nat_div_of_log_bound + {β O D : ℝ} {q : ℕ} + (hβ : 0 < β) (hD : 0 < D) + (hq : + (Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ)) ≤ (q : ℝ)) : + 1 ≤ ((3 : ℝ) ^ (β * (q : ℝ) - O)) / D := + one_le_rpow_three_linear_sub_div_of_log_bound + (β := β) (O := O) (D := D) (q := (q : ℝ)) hβ hD hq + +/-- A ceiling threshold is enough to make the base-three tail parameter at +least one. -/ +theorem one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + {β O D : ℝ} {q : ℕ} + (hβ : 0 < β) (hD : 0 < D) + (hq : + Nat.ceil + ((Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ))) ≤ q) : + 1 ≤ ((3 : ℝ) ^ (β * (q : ℝ) - O)) / D := by + have hceil : + (Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ)) ≤ + (Nat.ceil + ((Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ))) : ℝ) := + Nat.le_ceil _ + have hq_real : + (Nat.ceil + ((Real.log D + O * Real.log (3 : ℝ)) / + (β * Real.log (3 : ℝ))) : ℝ) ≤ (q : ℝ) := by + exact_mod_cast hq + exact + one_le_rpow_three_linear_sub_nat_div_of_log_bound + (β := β) (O := O) (D := D) (q := q) + hβ hD (hceil.trans hq_real) + +/-- Once the scale is above the cutoff threshold, the crude-top branch is +deterministically empty. -/ +theorem large_scale_cutoff_of_div_lt + {L δ : ℝ} {q : ℕ} + (hδ : 0 < δ) (hq : (L + 1) / δ < (q : ℝ)) : + L + 1 < δ * (q : ℝ) := by + have hmul := mul_lt_mul_of_pos_left hq hδ + have hcancel : δ * ((L + 1) / δ) = L + 1 := by + field_simp [hδ.ne'] + nlinarith + +/-- Ceiling form of the large-scale cutoff. -/ +theorem large_scale_cutoff_of_natCeil_add_one_le + {L δ : ℝ} {q : ℕ} + (hδ : 0 < δ) + (hq : Nat.ceil ((L + 1) / δ + 1) ≤ q) : + L + 1 < δ * (q : ℝ) := by + have hceil : + (L + 1) / δ + 1 ≤ + (Nat.ceil ((L + 1) / δ + 1) : ℝ) := + Nat.le_ceil _ + have hq_real : + (Nat.ceil ((L + 1) / δ + 1) : ℝ) ≤ (q : ℝ) := by + exact_mod_cast hq + have hlt : (L + 1) / δ < (q : ℝ) := by + linarith + exact large_scale_cutoff_of_div_lt (L := L) (δ := δ) (q := q) hδ hlt + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleUnion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleUnion.lean new file mode 100644 index 0000000000..f7b5570229 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadScaleUnion.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability +public import Mathlib.Data.Nat.Pairing + +/-! # Bad Scale Union -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Union bound for quantitative bad scales + +This file contains only the countable union bound which passes from the +bad-scale event to its fixed-pair components. It is part of the quantitative +tail proof and does not introduce a last-bad-scale construction. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +theorem measureReal_iUnion_nat_le_tsum + {μ : Measure Ω} [IsFiniteMeasure μ] {E : ℕ → Set Ω} + (hE : Summable fun k : ℕ => μ.real (E k)) : + μ.real (⋃ k : ℕ, E k) ≤ ∑' k : ℕ, μ.real (E k) := by + let ν : FiniteMeasure Ω := ⟨μ, inferInstance⟩ + have hE_nn : Summable fun k : ℕ => ν (E k) := by + rw [← NNReal.summable_coe] + simpa [ν, Measure.real] using! hE + have hν := MeasureTheory.FiniteMeasure.apply_iUnion_le + (μ := ν) (f := E) hE_nn + have hν_real : (ν (⋃ k : ℕ, E k) : ℝ) ≤ ∑' k : ℕ, (ν (E k) : ℝ) := by + exact_mod_cast hν + simpa [ν, Measure.real] using! hν_real + +/-- The bad-scale event is bounded by the sum of the fixed-pair bad events. -/ +theorem measureReal_badScaleEvent_le_tsum_unpair_badPairEvent + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {N : ℕ} + (hE : Summable fun k : ℕ => + μ.real (badPairEvent H t α N (Nat.unpair k).1 (Nat.unpair k).2)) : + μ.real (badScaleEvent H t α N) ≤ + ∑' k : ℕ, + μ.real (badPairEvent H t α N (Nat.unpair k).1 (Nat.unpair k).2) := by + have hbad : + badScaleEvent H t α N = + ⋃ k : ℕ, badPairEvent H t α N (Nat.unpair k).1 (Nat.unpair k).2 := by + ext ω + constructor + · rintro ⟨m, n, hnm, hNm, hbad⟩ + refine Set.mem_iUnion.2 ⟨Nat.pair m n, ?_⟩ + have hbad' : + (3 : ℝ) ^ (-(α * ((m - N : ℕ) : ℝ))) < + (3 : ℝ) ^ (-(t * ((m - n : ℕ) : ℝ))) * H m n ω := by + simpa [neg_mul] using hbad + simpa [badPairEvent, Nat.unpair_pair] using ⟨hnm, hNm, hbad'⟩ + · rintro hω + rcases Set.mem_iUnion.1 hω with ⟨k, hk⟩ + rcases hk with ⟨hnm, hNm, hbad⟩ + have hbad' : + (3 : ℝ) ^ (-t * (((Nat.unpair k).1 - (Nat.unpair k).2 : ℕ) : ℝ)) * + H (Nat.unpair k).1 (Nat.unpair k).2 ω > + (3 : ℝ) ^ (-α * (((Nat.unpair k).1 - N : ℕ) : ℝ)) := by + simpa [neg_mul] using hbad + exact ⟨(Nat.unpair k).1, (Nat.unpair k).2, hnm, hNm, hbad'⟩ + rw [hbad] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hE + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadTailUnion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadTailUnion.lean new file mode 100644 index 0000000000..4d7dccd7a2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/BadTailUnion.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion + +/-! # Bad Tail Union -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Tail union for quantitative bad scales + +This file contains the union bound over all bad scales at or above a level +`N`. It is the quantitative tail-event layer used before constructing the +random minimal scale; it deliberately does not introduce an eventual +almost-sure stopping scale. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +/-- The event that at least one bad scale occurs at or above `N`. -/ +def badTailEvent (Bad : ℕ → Set Ω) (N : ℕ) : Set Ω := + {ω | ∃ K : ℕ, N ≤ K ∧ ω ∈ Bad K} + +omit [MeasurableSpace Ω] in +theorem badScaleEvent_antitone + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} (hα : 0 ≤ α) + {N K : ℕ} (hNK : N ≤ K) : + badScaleEvent H t α K ⊆ badScaleEvent H t α N := by + intro ω hω + rcases hω with ⟨m, n, hnm, hKm, hbad⟩ + refine ⟨m, n, hnm, hNK.trans hKm, ?_⟩ + have hsub_le : m - K ≤ m - N := Nat.sub_le_sub_left hNK m + have hcast_le : ((m - K : ℕ) : ℝ) ≤ ((m - N : ℕ) : ℝ) := by + exact_mod_cast hsub_le + have hexp_le : + -α * ((m - N : ℕ) : ℝ) ≤ -α * ((m - K : ℕ) : ℝ) := by + exact mul_le_mul_of_nonpos_left hcast_le (by linarith) + have hrhs_le : + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ)) ≤ + (3 : ℝ) ^ (-α * ((m - K : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + exact lt_of_le_of_lt hrhs_le hbad + +omit [MeasurableSpace Ω] in +theorem badTailEvent_badScaleEvent_subset + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} (hα : 0 ≤ α) {N : ℕ} : + badTailEvent (badScaleEvent H t α) N ⊆ badScaleEvent H t α N := by + intro ω hω + rcases hω with ⟨K, hNK, hK⟩ + exact badScaleEvent_antitone (H := H) (t := t) (α := α) hα hNK hK + +omit [MeasurableSpace Ω] in +theorem badTailEvent_eq_iUnion_shift + {Bad : ℕ → Set Ω} {N : ℕ} : + badTailEvent Bad N = ⋃ j : ℕ, Bad (N + j) := by + ext ω + constructor + · rintro ⟨K, hNK, hK⟩ + refine Set.mem_iUnion.2 ⟨K - N, ?_⟩ + have hKN : N + (K - N) = K := Nat.add_sub_of_le hNK + simpa [hKN] using hK + · rintro hω + rcases Set.mem_iUnion.1 hω with ⟨j, hj⟩ + exact ⟨N + j, Nat.le_add_right N j, hj⟩ + +/-- Countable union bound for bad-tail events. -/ +theorem measureReal_badTailEvent_le_tsum_shift + {μ : Measure Ω} [IsFiniteMeasure μ] {Bad : ℕ → Set Ω} {N : ℕ} + (hBad : Summable fun j : ℕ => μ.real (Bad (N + j))) : + μ.real (badTailEvent Bad N) ≤ + ∑' j : ℕ, μ.real (Bad (N + j)) := by + rw [badTailEvent_eq_iUnion_shift] + exact measureReal_iUnion_nat_le_tsum (μ := μ) hBad + +/-- The concrete bad-tail event for the finite-probe bad-scale events. -/ +def probeBadTailEvent {Ω : Type*} + (H : ℕ → ℕ → Ω → ℝ) (t α : ℝ) (N : ℕ) : Set Ω := + badTailEvent (badScaleEvent H t α) N + +/-- Union bound for the concrete finite-probe bad-tail event. -/ +theorem measureReal_probeBadTailEvent_le_tsum_shift + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {N : ℕ} + (hBad : Summable fun j : ℕ => + μ.real (badScaleEvent H t α (N + j))) : + μ.real (probeBadTailEvent H t α N) ≤ + ∑' j : ℕ, μ.real (badScaleEvent H t α (N + j)) := by + exact measureReal_badTailEvent_le_tsum_shift + (μ := μ) (Bad := badScaleEvent H t α) (N := N) hBad + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/DeterministicThresholds.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/DeterministicThresholds.lean new file mode 100644 index 0000000000..a4ec4f4d9f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/DeterministicThresholds.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability + +/-! # Deterministic Thresholds -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Deterministic threshold algebra for bad scales + +This file records the real-variable estimates used when choosing the +intermediate scale `ℓ` in the proof of Theorem `t.homogenization.quenched`. +-/ + +noncomputable section + +/-- A logarithmic gap for `ℓ` makes the deterministic centered contribution +fit into half of the bad-event threshold. + +The intended substitution is +`x = α (m - N) - t (m - n)`, so that the right side is one half of the +post-discount threshold. -/ +theorem prefactor_rpow_three_neg_le_half_rpow_of_log_gap + {K a x : ℝ} {ℓ : ℕ} + (ha : 0 < a) + (hgap : + (a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3) ≤ (ℓ : ℝ)) : + K * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) ≤ + (1 / 2 : ℝ) * Real.rpow (3 : ℝ) (-x) := by + let A : ℝ := max (2 * K) 1 + have hlog3_pos : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hden_pos : 0 < a * Real.log 3 := mul_pos ha hlog3_pos + have hA_ge_twoK : 2 * K ≤ A := by + dsimp [A] + exact le_max_left _ _ + have hA_ge_one : 1 ≤ A := by + dsimp [A] + exact le_max_right _ _ + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_ge_one + have hlog_main : + Real.log A + x * Real.log 3 ≤ a * Real.log 3 * (ℓ : ℝ) := by + have hmul := mul_le_mul_of_nonneg_left hgap hden_pos.le + have hcancel : + a * Real.log 3 * + ((a * Real.log 3)⁻¹ * + (Real.log A + x * Real.log 3)) = + Real.log A + x * Real.log 3 := by + field_simp [hden_pos.ne'] + nlinarith + have hlog_le : + Real.log A ≤ (a * (ℓ : ℝ) - x) * Real.log 3 := by + nlinarith + have hA_le : + A ≤ Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) := by + have hexp : A ≤ Real.exp ((a * (ℓ : ℝ) - x) * Real.log 3) := + (Real.log_le_iff_le_exp hA_pos).mp hlog_le + have hrpow : + Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) = + Real.exp ((a * (ℓ : ℝ) - x) * Real.log 3) := by + calc + Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) + = Real.exp (Real.log (3 : ℝ) * (a * (ℓ : ℝ) - x)) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) + (y := a * (ℓ : ℝ) - x) (by norm_num : 0 < (3 : ℝ))) + _ = Real.exp ((a * (ℓ : ℝ) - x) * Real.log 3) := by + congr 1 + ring + rw [hrpow] + exact hexp + have htwoK_le : + 2 * K ≤ Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) := + hA_ge_twoK.trans hA_le + have hdecay_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) := + Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hmul : + (2 * K) * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) ≤ + Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) := + mul_le_mul_of_nonneg_right htwoK_le hdecay_nonneg + calc + K * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + = (1 / 2 : ℝ) * + ((2 * K) * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ))) := by + ring + _ ≤ (1 / 2 : ℝ) * + (Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ))) := by + exact mul_le_mul_of_nonneg_left hmul (by norm_num) + _ = (1 / 2 : ℝ) * Real.rpow (3 : ℝ) (-x) := by + have hprod : + Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) = + Real.rpow (3 : ℝ) (-x) := by + calc + Real.rpow (3 : ℝ) (a * (ℓ : ℝ) - x) * + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + = + Real.rpow (3 : ℝ) + ((a * (ℓ : ℝ) - x) + (-a * (ℓ : ℝ))) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (a * (ℓ : ℝ) - x) (-a * (ℓ : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-x) := by + congr 1 + ring + rw [hprod] + +/-- Ceiling form of `prefactor_rpow_three_neg_le_half_rpow_of_log_gap`. -/ +theorem prefactor_rpow_three_neg_le_half_rpow_of_natCeil_log_gap + {K a x : ℝ} (ha : 0 < a) : + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + K * Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) ≤ + (1 / 2 : ℝ) * Real.rpow (3 : ℝ) (-x) := by + intro ℓ + exact + prefactor_rpow_three_neg_le_half_rpow_of_log_gap + (K := K) (a := a) (x := x) (ℓ := ℓ) ha + (by + dsimp [ℓ] + exact Nat.le_ceil _) + +/-- The post-discount threshold identity used in the fixed-pair bad-event +estimate. -/ +theorem rpow_three_discount_mul_postThreshold + {t α : ℝ} {m n N : ℕ} : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) + (-(α * ((m - N : ℕ) : ℝ) - + t * ((m - n : ℕ) : ℝ))) = + Real.rpow (3 : ℝ) (-α * ((m - N : ℕ) : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) + (-(α * ((m - N : ℕ) : ℝ) - + t * ((m - n : ℕ) : ℝ))) = + Real.rpow (3 : ℝ) + (-t * ((m - n : ℕ) : ℝ) + + (-(α * ((m - N : ℕ) : ℝ) - + t * ((m - n : ℕ) : ℝ)))) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (-t * ((m - n : ℕ) : ℝ)) + (-(α * ((m - N : ℕ) : ℝ) - + t * ((m - n : ℕ) : ℝ)))).symm + _ = Real.rpow (3 : ℝ) (-α * ((m - N : ℕ) : ℝ)) := by + congr 1 + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EllipticityFromMinimalScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EllipticityFromMinimalScale.lean new file mode 100644 index 0000000000..e6fd1c4701 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EllipticityFromMinimalScale.lean @@ -0,0 +1,482 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorQuenched + +/-! # Ellipticity From Minimal Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder + +/-! +# Ellipticity control above the Section 5.7 minimal scale + +This file is the Phase 3 packaging step for the public homogenization theorem. +It combines the collapsed finite-`q` homogenization-error corollary with the +Chapter 2 lemma that controls multiscale ellipticity from `\mathcal E`. +-/ + +noncomputable section + +private theorem homogenizationErrorOnCube_infinity_two_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) {s : ℝ} (hs : 0 < s) : + 0 ≤ Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity (.finite 2) a a0 := by + unfold Ch02.HomogenizationErrorOnCube Ch02.HomogenizationError + Ch02.HomogenizationErrorFinite + refine Real.rpow_nonneg ?_ _ + refine tsum_nonneg ?_ + intro l + refine mul_nonneg ?_ ?_ + · simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := s) (q := 2) l + (by nlinarith : 0 ≤ s * (2 : ℝ)) + · exact Real.rpow_nonneg + (Ch02.scaleResponseAtScale_infinity_nonneg Q + (sub_le_self Q.scale (by exact_mod_cast Nat.zero_le l)) a a0) 2 + +/-- Deterministic Ch5-facing form of the Ch2 ellipticity-control lemma. -/ +theorem weightedEllipticity_finite_two_le_of_homogenizationError_bound + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.TriadicCoeffFamily d) {s σ B : ℝ} + (hs : 0 < s) (hσ : 0 < σ) + (hE : + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (.finite 2) a (scalarMatrix (d := d) σ) ≤ B) : + max (σ⁻¹ * Ch02.LambdaSq Q s (.finite 2) a) + (σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹) ≤ + 2 * (Fintype.card (Fin d) : ℝ) * (B ^ (2 : ℕ) + 1) := by + let E : ℝ := + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (.finite 2) a (scalarMatrix (d := d) σ) + have hE_nonneg : 0 ≤ E := by + simpa [E] using + homogenizationErrorOnCube_infinity_two_nonneg + (Q := Q) a (scalarMatrix (d := d) σ) hs + have hE_sq : E ^ (2 : ℕ) ≤ B ^ (2 : ℕ) := + pow_le_pow_left₀ hE_nonneg (by simpa [E] using hE) 2 + have hch2 := + Ch02.max_weightedEllipticity_finite_two_le_card_mul_homogenizationError_sq_add_one + Q a hs hσ + have hconst_nonneg : 0 ≤ 2 * (Fintype.card (Fin d) : ℝ) := by + positivity + calc + max (σ⁻¹ * Ch02.LambdaSq Q s (.finite 2) a) + (σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹) + ≤ 2 * (Fintype.card (Fin d) : ℝ) * (E ^ (2 : ℕ) + 1) := by + simpa [E] using hch2 + _ ≤ 2 * (Fintype.card (Fin d) : ℝ) * (B ^ (2 : ℕ) + 1) := by + exact mul_le_mul_of_nonneg_left (by nlinarith) hconst_nonneg + +theorem lambdaSq_inv_le_inv_sigma_mul_of_weightedEllipticity_le + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.TriadicCoeffFamily d) {s σ M : ℝ} + (hσ : 0 < σ) + (hM : + max (σ⁻¹ * Ch02.LambdaSq Q s (.finite 2) a) + (σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹) ≤ M) : + (Ch02.lambdaSq Q s (.finite 2) a)⁻¹ ≤ σ⁻¹ * M := by + have hlower : + σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹ ≤ M := + (le_max_right _ _).trans hM + calc + (Ch02.lambdaSq Q s (.finite 2) a)⁻¹ + = σ⁻¹ * (σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹) := by + field_simp [hσ.ne'] + _ ≤ σ⁻¹ * M := + mul_le_mul_of_nonneg_left hlower (inv_nonneg.mpr hσ.le) + +theorem sqrt_LambdaSq_mul_sqrt_lambdaSq_inv_le_of_weightedEllipticity_le + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.TriadicCoeffFamily d) {s σ M : ℝ} + (hs : 0 < s) (hσ : 0 < σ) (hM_nonneg : 0 ≤ M) + (hM : + max (σ⁻¹ * Ch02.LambdaSq Q s (.finite 2) a) + (σ * (Ch02.lambdaSq Q s (.finite 2) a)⁻¹) ≤ M) : + Real.sqrt (Ch02.LambdaSq Q s (.finite 2) a) * + Real.sqrt ((Ch02.lambdaSq Q s (.finite 2) a)⁻¹) ≤ M := by + let Lam : ℝ := Ch02.LambdaSq Q s (.finite 2) a + let linv : ℝ := (Ch02.lambdaSq Q s (.finite 2) a)⁻¹ + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact Ch02.LambdaSq_finite_nonneg Q a hs (by norm_num : (1 : ℝ) ≤ 2) + have hlambda_pos : 0 < Ch02.lambdaSq Q s (.finite 2) a := + Ch02.lambdaSq_finite_pos Q a hs (by norm_num : (1 : ℝ) ≤ 2) + have hlinv_nonneg : 0 ≤ linv := by + dsimp [linv] + exact inv_nonneg.mpr hlambda_pos.le + have hupper_norm : σ⁻¹ * Lam ≤ M := by + exact (le_max_left _ _).trans hM + have hlower_norm : σ * linv ≤ M := by + exact (le_max_right _ _).trans hM + have hLam_le : Lam ≤ σ * M := by + have h := mul_le_mul_of_nonneg_left hupper_norm hσ.le + calc + Lam = σ * (σ⁻¹ * Lam) := by field_simp [hσ.ne'] + _ ≤ σ * M := h + have hlinv_le : linv ≤ σ⁻¹ * M := by + have h := mul_le_mul_of_nonneg_left hlower_norm (inv_nonneg.mpr hσ.le) + calc + linv = σ⁻¹ * (σ * linv) := by field_simp [hσ.ne'] + _ ≤ σ⁻¹ * M := h + have hσM_nonneg : 0 ≤ σ * M := mul_nonneg hσ.le hM_nonneg + have hrhs_eq : + Real.sqrt (σ * M) * Real.sqrt (σ⁻¹ * M) = M := by + rw [← Real.sqrt_mul hσM_nonneg (σ⁻¹ * M)] + have hprod : (σ * M) * (σ⁻¹ * M) = M ^ (2 : ℕ) := by + field_simp [hσ.ne'] + rw [hprod, Real.sqrt_sq_eq_abs, abs_of_nonneg hM_nonneg] + calc + Real.sqrt Lam * Real.sqrt linv + ≤ Real.sqrt (σ * M) * Real.sqrt (σ⁻¹ * M) := + mul_le_mul (Real.sqrt_le_sqrt hLam_le) (Real.sqrt_le_sqrt hlinv_le) + (Real.sqrt_nonneg linv) (Real.sqrt_nonneg (σ * M)) + _ = M := hrhs_eq + +/-- Finite-`sigma` ellipticity control on origin cubes above the same random +minimal scale as the collapsed finite-`q` `\mathcal E` estimate. -/ +theorem exists_weightedEllipticityOnOriginCube_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + ∀ {σ τ s : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 ≤ s * (2 : ℝ) → + 0 < (s - τ / 2) * (2 : ℝ) → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField + aω ha; + let σ0 : ℝ := barSigmaLimit hP hStruct; + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount s 2 * + (Ch02.geometricDiscount (s - τ / 2) 2)⁻¹) + (1 / 2 : ℝ); + let R : ℝ := + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)); + let M : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + ((G * A * R) ^ (2 : ℕ) + 1); + max (σ0⁻¹ * Ch02.LambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F) + (σ0 * (Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹) ≤ M ∧ + (Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M ∧ + Real.sqrt (Ch02.LambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹) ≤ M := by + obtain ⟨α, hα_pos, _hαmax, hEbase⟩ := + exists_homogenizationErrorOnOriginCube_interpolated_expLogSq + (d := d) params + refine ⟨α, hα_pos, ?_⟩ + intro σ τ s hσ_pos hτ_half hατ_half hτ_le_one hs2 hδ2 + dsimp only + obtain ⟨Cscale, hCscale_pos, hlaw⟩ := + hEbase (σ := σ) (τ := τ) (r := s) (q := 2) + hσ_pos hτ_half hατ_half hτ_le_one hs2 hδ2 + (by norm_num : (0 : ℝ) < 2) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + obtain ⟨X, hXbigO, hXone, hEae⟩ := + hlaw hP hStruct hΓ hσ_eq hparams + refine ⟨X, hXbigO, hXone, ?_⟩ + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hs_pos : 0 < s := by nlinarith + have hδ_pos : 0 < s - τ / 2 := by nlinarith + filter_upwards [hEae] with aω hEpoint + intro ha m hXm + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + let σ0 : ℝ := barSigmaLimit hP hStruct + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount s 2 * + (Ch02.geometricDiscount (s - τ / 2) 2)⁻¹) + (1 / 2 : ℝ) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + let B : ℝ := G * A * R + let M : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * (B ^ (2 : ℕ) + 1) + have hσ0_pos : 0 < σ0 := by + simpa [σ0] using hΓ.barSigmaLimit_pos + have hX_pos : 0 < X aω := lt_of_lt_of_le zero_lt_one (hXone aω) + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hdisc_s_nonneg : 0 ≤ Ch02.geometricDiscount s 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (by simpa using hs2) + have hdisc_delta_pos : 0 < Ch02.geometricDiscount (s - τ / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (by simpa using hδ2) + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact Real.rpow_nonneg + (mul_nonneg hdisc_s_nonneg + (inv_nonneg.mpr hdisc_delta_pos.le)) _ + have hdisc_tau_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos + (by nlinarith : 0 < (τ / 2) * (1 : ℝ)) + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + exact mul_nonneg (inv_nonneg.mpr hdisc_tau_pos.le) (by positivity) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (hCresp_nonneg.trans (le_max_left Cresp Cneg)) (by positivity) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg (mul_nonneg hG_nonneg hA_nonneg) hR_nonneg + have hE_bound : + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (.finite 2) F (scalarMatrix (d := d) σ0) ≤ B := by + simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B] using + hEpoint ha (m := m) hXm + have hweighted : + max (σ0⁻¹ * Ch02.LambdaSq Q s (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q s (.finite 2) F)⁻¹) ≤ M := by + simpa [M, B] using + weightedEllipticity_finite_two_le_of_homogenizationError_bound + (Q := Q) (a := F) (s := s) (σ := σ0) (B := B) + hs_pos hσ0_pos hE_bound + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + refine ⟨?_, ?_, ?_⟩ + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using hweighted + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using + lambdaSq_inv_le_inv_sigma_mul_of_weightedEllipticity_le + (Q := Q) (a := F) (s := s) (σ := σ0) (M := M) + hσ0_pos hweighted + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using + sqrt_LambdaSq_mul_sqrt_lambdaSq_inv_le_of_weightedEllipticity_le + (Q := Q) (a := F) (s := s) (σ := σ0) (M := M) + hs_pos hσ0_pos hM_nonneg hweighted + +/-- Endpoint (`σ = ∞`) ellipticity control on origin cubes above the same +random minimal scale as the endpoint finite-`q` `\mathcal E` estimate. -/ +theorem exists_weightedEllipticityOnOriginCube_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + ∀ {τ s : ℝ}, + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 ≤ s * (2 : ℝ) → + 0 < (s - τ / 2) * (2 : ℝ) → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField + aω ha; + let σ0 : ℝ := barSigmaLimit hP hStruct; + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount s 2 * + (Ch02.geometricDiscount (s - τ / 2) 2)⁻¹) + (1 / 2 : ℝ); + let R : ℝ := + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)); + let M : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + ((G * A * R) ^ (2 : ℕ) + 1); + max (σ0⁻¹ * Ch02.LambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F) + (σ0 * (Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹) ≤ M ∧ + (Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M ∧ + Real.sqrt (Ch02.LambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq (originCube d ((m : ℕ) : ℤ)) + s (.finite 2) F)⁻¹) ≤ M := by + obtain ⟨α, hα_pos, _hαmax, hEbase⟩ := + exists_homogenizationErrorOnOriginCube_uniformEndpoint_expLogSq + (d := d) params + refine ⟨α, hα_pos, ?_⟩ + intro τ s hτ_half hατ_half hτ_le_one hs2 hδ2 + dsimp only + obtain ⟨Cscale, hCscale_pos, hlaw⟩ := + hEbase (τ := τ) (r := s) (q := 2) + hτ_half hατ_half hτ_le_one hs2 hδ2 + (by norm_num : (0 : ℝ) < 2) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + obtain ⟨X, hXbigO, hXone, hEae⟩ := + hlaw hP hStruct hInf hparams + refine ⟨X, hXbigO, hXone, ?_⟩ + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hs_pos : 0 < s := by nlinarith + have hδ_pos : 0 < s - τ / 2 := by nlinarith + filter_upwards [hEae] with aω hEpoint + intro ha m hXm + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + let σ0 : ℝ := barSigmaLimit hP hStruct + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount s 2 * + (Ch02.geometricDiscount (s - τ / 2) 2)⁻¹) + (1 / 2 : ℝ) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + let B : ℝ := G * A * R + let M : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * (B ^ (2 : ℕ) + 1) + let hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hInf.toGammaSigma 1 zero_lt_one + have hσ0_pos : 0 < σ0 := by + simpa [σ0] using hΓ.barSigmaLimit_pos + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hdisc_s_nonneg : 0 ≤ Ch02.geometricDiscount s 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg (by simpa using hs2) + have hdisc_delta_pos : 0 < Ch02.geometricDiscount (s - τ / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (by simpa using hδ2) + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact Real.rpow_nonneg + (mul_nonneg hdisc_s_nonneg + (inv_nonneg.mpr hdisc_delta_pos.le)) _ + have hdisc_tau_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos + (by nlinarith : 0 < (τ / 2) * (1 : ℝ)) + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + exact mul_nonneg (inv_nonneg.mpr hdisc_tau_pos.le) (by positivity) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (hCresp_nonneg.trans (le_max_left Cresp Cneg)) (by positivity) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg (mul_nonneg hG_nonneg hA_nonneg) hR_nonneg + have hE_bound : + Ch02.HomogenizationErrorOnCube Q s Ch02.MultiscaleExponent.infinity + (.finite 2) F (scalarMatrix (d := d) σ0) ≤ B := by + simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B] using + hEpoint ha (m := m) hXm + have hweighted : + max (σ0⁻¹ * Ch02.LambdaSq Q s (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q s (.finite 2) F)⁻¹) ≤ M := by + simpa [M, B] using + weightedEllipticity_finite_two_le_of_homogenizationError_bound + (Q := Q) (a := F) (s := s) (σ := σ0) (B := B) + hs_pos hσ0_pos hE_bound + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + refine ⟨?_, ?_, ?_⟩ + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using hweighted + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using + lambdaSq_inv_le_inv_sigma_mul_of_weightedEllipticity_le + (Q := Q) (a := F) (s := s) (σ := σ0) (M := M) + hσ0_pos hweighted + · simpa [Q, F, σ0, Cresp, Cneg, A, G, R, B, M] using + sqrt_LambdaSq_mul_sqrt_lambdaSq_inv_le_of_weightedEllipticity_le + (Q := Q) (a := F) (s := s) (σ := σ0) (M := M) + hs_pos hσ0_pos hM_nonneg hweighted + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EntryScaleCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EntryScaleCompression.lean new file mode 100644 index 0000000000..8f011cb438 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/EntryScaleCompression.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionFinal + +/-! # Entry Scale Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Entry-scale compression for the quenched theorem + +The shifted minimal-scale theorem controls the random scale measured from the +annealed entry scale. This file supplies the deterministic estimate needed to +put the absolute factor `3 ^ N0` back into the manuscript envelope +`exp(C log^2(2 + thetaHat))`. +-/ + +noncomputable section + +open Section51 + +theorem log_two_add_le_const_mul_log_two_add_of_le_const_mul_sq + {A T θ : ℝ} (hA : 0 ≤ A) (hT : 0 ≤ T) (hθ : 0 ≤ θ) + (hT_le : T ≤ A * θ ^ (2 : ℕ)) : + Real.log (2 + T) ≤ + (2 + 2 * max 0 (Real.log (2 + A))) * Real.log (2 + θ) := by + have hargT_pos : 0 < 2 + T := by positivity + have hargA_pos : 0 < 2 + A := by positivity + have hargθ_pos : 0 < 2 + θ := by positivity + have htarget_pos : 0 < (2 + A) * (2 + θ) ^ (2 : ℕ) := by positivity + have harg_le : 2 + T ≤ (2 + A) * (2 + θ) ^ (2 : ℕ) := by + have hslack_nonneg : + 0 ≤ 6 + 8 * θ + 2 * θ ^ (2 : ℕ) + 4 * A + 4 * A * θ := by + positivity + calc + 2 + T ≤ 2 + A * θ ^ (2 : ℕ) := by + simpa [add_comm] using add_le_add_left hT_le 2 + _ ≤ + 2 + A * θ ^ (2 : ℕ) + + (6 + 8 * θ + 2 * θ ^ (2 : ℕ) + 4 * A + 4 * A * θ) := + le_add_of_nonneg_right hslack_nonneg + _ = (2 + A) * (2 + θ) ^ (2 : ℕ) := by ring + have hlog_le : + Real.log (2 + T) ≤ + Real.log ((2 + A) * (2 + θ) ^ (2 : ℕ)) := + Real.log_le_log hargT_pos harg_le + have hprod_log : + Real.log ((2 + A) * (2 + θ) ^ (2 : ℕ)) = + Real.log (2 + A) + 2 * Real.log (2 + θ) := by + rw [Real.log_mul hargA_pos.ne' (pow_pos hargθ_pos 2).ne'] + rw [show (2 + θ) ^ (2 : ℕ) = (2 + θ) * (2 + θ) by ring] + rw [Real.log_mul hargθ_pos.ne' hargθ_pos.ne'] + ring + have hL_half : (1 / 2 : ℝ) ≤ Real.log (2 + θ) := + Section51.log_two_add_ge_half hθ + have hmax_nonneg : 0 ≤ max 0 (Real.log (2 + A)) := + le_max_left 0 _ + have hlogA_bound : + Real.log (2 + A) ≤ + 2 * max 0 (Real.log (2 + A)) * Real.log (2 + θ) := by + have hlogA_le_max : + Real.log (2 + A) ≤ max 0 (Real.log (2 + A)) := + le_max_right 0 _ + have hscaled : + max 0 (Real.log (2 + A)) ≤ + 2 * max 0 (Real.log (2 + A)) * Real.log (2 + θ) := by + have hone_le : (1 : ℝ) ≤ 2 * Real.log (2 + θ) := by + calc + (1 : ℝ) = 2 * (1 / 2 : ℝ) := by norm_num + _ ≤ 2 * Real.log (2 + θ) := + mul_le_mul_of_nonneg_left hL_half (by norm_num : 0 ≤ (2 : ℝ)) + calc + max 0 (Real.log (2 + A)) + = max 0 (Real.log (2 + A)) * 1 := by ring + _ ≤ max 0 (Real.log (2 + A)) * (2 * Real.log (2 + θ)) := + mul_le_mul_of_nonneg_left hone_le hmax_nonneg + _ = 2 * max 0 (Real.log (2 + A)) * Real.log (2 + θ) := by ring + exact hlogA_le_max.trans hscaled + calc + Real.log (2 + T) + ≤ Real.log ((2 + A) * (2 + θ) ^ (2 : ℕ)) := hlog_le + _ = Real.log (2 + A) + 2 * Real.log (2 + θ) := hprod_log + _ ≤ 2 * max 0 (Real.log (2 + A)) * Real.log (2 + θ) + + 2 * Real.log (2 + θ) := by + exact add_le_add hlogA_bound le_rfl + _ = (2 + 2 * max 0 (Real.log (2 + A))) * + Real.log (2 + θ) := by ring + +/-- The annealed algebraic entry scale is bounded by a single manuscript +`ceil(C log^2(2 + thetaHat))` scale. + +The constant is selected before the law; it depends only on the finite +`sigma`, the parameter-only `(P4)` data, and the entry constant used to define +`N0`. -/ +theorem exists_entryScale_le_natCeil_logSq + {d : ℕ} [NeZero d] {σ Centry : ℝ} + (hσ : 0 < σ) (hCentry : 0 < Centry) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ CentryScale : ℝ, 0 < CentryScale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + N0 ≤ + Nat.ceil (CentryScale * + (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + classical + let xi : ℝ := (params.xi : ℝ) + let G : ℝ := Ch04.gammaMomentConst σ * xi ^ σ⁻¹ + let A : ℝ := G ^ (2 : ℕ) + let Clog₁ : ℝ := 2 + 2 * max 0 (Real.log (2 + A)) + let A₂ : ℝ := Centry * xi * A + let Clog₂ : ℝ := 2 + 2 * max 0 (Real.log (2 + A₂)) + let Mcoef : ℝ := + Centry * Clog₁ ^ (2 : ℕ) + 2 * Centry * xi * Clog₂ + let Ncoef : ℝ := Mcoef + 8 + let CentryScale : ℝ := Ncoef + have hxi_pos_nat : 0 < params.xi := params.xi_pos + have hxi_pos : 0 < xi := by + dsimp [xi] + exact_mod_cast hxi_pos_nat + have hgamma_pos : 0 < Ch04.gammaMomentConst σ := by + simpa [Ch04.gammaMomentConst] using + IndependentSums.gammaMomentConst_pos hσ + have hG_pos : 0 < G := by + dsimp [G] + positivity + have hA_nonneg : 0 ≤ A := by dsimp [A]; positivity + have hA₂_nonneg : 0 ≤ A₂ := by dsimp [A₂]; positivity + have hClog₁_pos : 0 < Clog₁ := by + dsimp [Clog₁] + have hmax_nonneg : 0 ≤ max 0 (Real.log (2 + A)) := le_max_left 0 _ + have htwo_le : (2 : ℝ) ≤ 2 + 2 * max 0 (Real.log (2 + A)) := + le_add_of_nonneg_right (mul_nonneg (by norm_num) hmax_nonneg) + exact lt_of_lt_of_le (by norm_num : (0 : ℝ) < 2) htwo_le + have hClog₂_pos : 0 < Clog₂ := by + dsimp [Clog₂] + have hmax_nonneg : 0 ≤ max 0 (Real.log (2 + A₂)) := le_max_left 0 _ + have htwo_le : (2 : ℝ) ≤ 2 + 2 * max 0 (Real.log (2 + A₂)) := + le_add_of_nonneg_right (mul_nonneg (by norm_num) hmax_nonneg) + exact lt_of_lt_of_le (by norm_num : (0 : ℝ) < 2) htwo_le + have hNcoef_pos : 0 < Ncoef := by + dsimp [Ncoef, Mcoef] + positivity + have hCentryScale_pos : 0 < CentryScale := by + dsimp [CentryScale] + exact hNcoef_pos + refine ⟨CentryScale, hCentryScale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let T : ℝ := widetildeThetaAtScale P (0 : ℤ) hP4 + let θ : ℝ := hΓ.thetaHat + let Lθ : ℝ := Real.log (2 + θ) + let LT : ℝ := Real.log (2 + T) + let L₂ : ℝ := Real.log (2 + Centry * xi * T) + let N0 : ℕ := annealedAlgebraicEntryScale P hP4 Centry + have hP4_xi : hP4.xi = params.xi := by + dsimp [hP4, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos] + simp [hparams] + have hθ_pos : 0 < θ := by simpa [θ] using hΓ.thetaHat_pos + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hT_nonneg : 0 ≤ T := by + simpa [T, hP4] using + Section51.widetildeThetaAtScale_nonneg P hP4 (0 : ℤ) + have hwide := hΓ.widetildeThetaAtScale_zero_le_gammaMomentScale_sq + have hT_le_Aθ : + T ≤ A * θ ^ (2 : ℕ) := by + have hraw : + T ≤ (G * θ) ^ (2 : ℕ) := by + simpa [T, θ, G, xi, hσ_eq, hparams] using hwide + calc + T ≤ (G * θ) ^ (2 : ℕ) := hraw + _ = A * θ ^ (2 : ℕ) := by + dsimp [A] + ring + have hLT_bound : LT ≤ Clog₁ * Lθ := by + simpa [LT, Lθ] using + log_two_add_le_const_mul_log_two_add_of_le_const_mul_sq + (A := A) (T := T) (θ := θ) hA_nonneg hT_nonneg hθ_nonneg + hT_le_Aθ + have hT₂_nonneg : 0 ≤ Centry * xi * T := by positivity + have hT₂_le : Centry * xi * T ≤ A₂ * θ ^ (2 : ℕ) := by + calc + Centry * xi * T + ≤ Centry * xi * (A * θ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hT_le_Aθ + (mul_nonneg hCentry.le hxi_pos.le) + _ = A₂ * θ ^ (2 : ℕ) := by + dsimp [A₂] + ring + have hL₂_bound : L₂ ≤ Clog₂ * Lθ := by + simpa [L₂, Lθ] using + log_two_add_le_const_mul_log_two_add_of_le_const_mul_sq + (A := A₂) (T := Centry * xi * T) (θ := θ) + hA₂_nonneg hT₂_nonneg hθ_nonneg hT₂_le + have hLθ_half : (1 / 2 : ℝ) ≤ Lθ := by + simpa [Lθ] using Section51.log_two_add_ge_half hθ_nonneg + have hLθ_nonneg : 0 ≤ Lθ := by linarith + have hLT_nonneg : 0 ≤ LT := by + dsimp [LT] + exact Section51.log_two_add_nonneg hT_nonneg + have hL₂_nonneg : 0 ≤ L₂ := by + dsimp [L₂] + exact Section51.log_two_add_nonneg hT₂_nonneg + have hLT_sq : + LT ^ (2 : ℕ) ≤ Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) := by + calc + LT ^ (2 : ℕ) ≤ (Clog₁ * Lθ) ^ (2 : ℕ) := + pow_le_pow_left₀ hLT_nonneg hLT_bound 2 + _ = Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) := by ring + have hL₂_linear : + L₂ ≤ 2 * Clog₂ * Lθ ^ (2 : ℕ) := by + have hLθ_le : Lθ ≤ 2 * Lθ ^ (2 : ℕ) := by + simpa [Lθ] using log_two_add_le_two_mul_sq hθ_nonneg + calc + L₂ ≤ Clog₂ * Lθ := hL₂_bound + _ ≤ Clog₂ * (2 * Lθ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hLθ_le hClog₂_pos.le + _ = 2 * Clog₂ * Lθ ^ (2 : ℕ) := by ring + have hceil₁ : + (Nat.ceil (Centry * LT ^ (2 : ℕ)) : ℝ) ≤ + Centry * Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) + 1 := by + have hx_nonneg : 0 ≤ Centry * LT ^ (2 : ℕ) := by positivity + have hceil := + Section51.natCeil_le_add_one (x := Centry * LT ^ (2 : ℕ)) + hx_nonneg + have hmain : + Centry * LT ^ (2 : ℕ) ≤ + Centry * Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) := by + calc + Centry * LT ^ (2 : ℕ) + ≤ Centry * (Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hLT_sq hCentry.le + _ = Centry * Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) := by ring + exact hceil.trans (by linarith) + have hceil₂ : + (Nat.ceil (Centry * xi * L₂) : ℝ) ≤ + 2 * Centry * xi * Clog₂ * Lθ ^ (2 : ℕ) + 1 := by + have hy_nonneg : 0 ≤ Centry * xi * L₂ := by positivity + have hceil := + Section51.natCeil_le_add_one (x := Centry * xi * L₂) hy_nonneg + have hmain : + Centry * xi * L₂ ≤ + 2 * Centry * xi * Clog₂ * Lθ ^ (2 : ℕ) := by + calc + Centry * xi * L₂ + ≤ Centry * xi * (2 * Clog₂ * Lθ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hL₂_linear + (mul_nonneg hCentry.le hxi_pos.le) + _ = 2 * Centry * xi * Clog₂ * Lθ ^ (2 : ℕ) := by ring + exact hceil.trans (by linarith) + have htwo : + (2 : ℝ) ≤ 8 * Lθ ^ (2 : ℕ) := by + have hquarter : (1 / 4 : ℝ) ≤ Lθ ^ (2 : ℕ) := by + simpa [Lθ] using log_two_add_sq_ge_quarter hθ_nonneg + have hscaled := + mul_le_mul_of_nonneg_left hquarter (by norm_num : 0 ≤ (8 : ℝ)) + norm_num at hscaled + exact hscaled + have hN_real : (N0 : ℝ) ≤ Ncoef * Lθ ^ (2 : ℕ) := by + have hN_eq : + N0 = + Nat.ceil (Centry * LT ^ (2 : ℕ)) + + Nat.ceil (Centry * xi * L₂) := by + dsimp [N0, annealedAlgebraicEntryScale, T, LT, L₂, hP4, xi] + rw [hP4_xi] + calc + (N0 : ℝ) + = (Nat.ceil (Centry * LT ^ (2 : ℕ)) : ℝ) + + (Nat.ceil (Centry * xi * L₂) : ℝ) := by + rw [hN_eq] + norm_num + _ ≤ + (Centry * Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) + 1) + + (2 * Centry * xi * Clog₂ * Lθ ^ (2 : ℕ) + 1) := by + exact add_le_add hceil₁ hceil₂ + _ ≤ Ncoef * Lθ ^ (2 : ℕ) := by + calc + (Centry * Clog₁ ^ (2 : ℕ) * Lθ ^ (2 : ℕ) + 1) + + (2 * Centry * xi * Clog₂ * Lθ ^ (2 : ℕ) + 1) + = + Mcoef * Lθ ^ (2 : ℕ) + 2 := by + dsimp [Mcoef] + ring + _ ≤ Mcoef * Lθ ^ (2 : ℕ) + 8 * Lθ ^ (2 : ℕ) := by + linarith + _ = Ncoef * Lθ ^ (2 : ℕ) := by + dsimp [Ncoef] + ring + have hceil : + Ncoef * Lθ ^ (2 : ℕ) ≤ + (Nat.ceil (Ncoef * Lθ ^ (2 : ℕ)) : ℝ) := + Nat.le_ceil _ + have hN_real' : + (N0 : ℝ) ≤ (Nat.ceil (Ncoef * Lθ ^ (2 : ℕ)) : ℝ) := + hN_real.trans hceil + exact_mod_cast hN_real' + +/-- The absolute annealed entry factor is absorbed by the manuscript +`exp(C log^2(2 + thetaHat))` envelope. + +The constant is selected before the law; it depends only on the finite +`sigma`, the parameter-only `(P4)` data, and the entry constant used to define +`N0`. -/ +theorem exists_entryScale_pow_three_le_exp_logSq + {d : ℕ} [NeZero d] {σ Centry : ℝ} + (hσ : 0 < σ) (hCentry : 0 < Centry) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ CentryScale : ℝ, 0 < CentryScale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryScale * + (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + obtain ⟨CentryScale, hCentryScale_pos, hentry⟩ := + exists_entryScale_le_natCeil_logSq (d := d) hσ hCentry params + let Cpow : ℝ := Real.log (3 : ℝ) * (CentryScale + 4) + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hCpow_pos : 0 < Cpow := by + dsimp [Cpow] + positivity + refine ⟨Cpow, hCpow_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Lθ : ℝ := Real.log (2 + hΓ.thetaHat) + have hθ_nonneg : 0 ≤ hΓ.thetaHat := hΓ.thetaHat_pos.le + have hL2_nonneg : 0 ≤ Lθ ^ (2 : ℕ) := by + dsimp [Lθ] + positivity + have hceil_arg_nonneg : 0 ≤ CentryScale * Lθ ^ (2 : ℕ) := by + positivity + have hquarter : (1 / 4 : ℝ) ≤ Lθ ^ (2 : ℕ) := by + simpa [Lθ] using log_two_add_sq_ge_quarter hθ_nonneg + have hN_le : + N0 ≤ Nat.ceil (CentryScale * Lθ ^ (2 : ℕ)) := by + simpa [N0, Lθ] using hentry hP hStruct hΓ hσ_eq hparams + have hpow_mono : + (3 : ℝ) ^ N0 ≤ + (3 : ℝ) ^ Nat.ceil (CentryScale * Lθ ^ (2 : ℕ)) := + pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hN_le + have hceil_pow : + (3 : ℝ) ^ Nat.ceil (CentryScale * Lθ ^ (2 : ℕ)) ≤ + 3 * Real.exp (Real.log (3 : ℝ) * + (CentryScale * Lθ ^ (2 : ℕ))) := + pow_three_natCeil_le_three_mul_exp hceil_arg_nonneg + have hthree_exp : + 3 * Real.exp (Real.log (3 : ℝ) * + (CentryScale * Lθ ^ (2 : ℕ))) = + Real.exp (Real.log (3 : ℝ) + + Real.log (3 : ℝ) * (CentryScale * Lθ ^ (2 : ℕ))) := by + rw [Real.exp_add, Real.exp_log (by norm_num : (0 : ℝ) < 3)] + have hexp_le : + Real.exp (Real.log (3 : ℝ) + + Real.log (3 : ℝ) * (CentryScale * Lθ ^ (2 : ℕ))) ≤ + Real.exp (Cpow * Lθ ^ (2 : ℕ)) := by + refine Real.exp_le_exp.mpr ?_ + have hlog3_le : Real.log (3 : ℝ) ≤ + Real.log (3 : ℝ) * (4 * Lθ ^ (2 : ℕ)) := by + have hone_le : (1 : ℝ) ≤ 4 * Lθ ^ (2 : ℕ) := by + have hscaled := + mul_le_mul_of_nonneg_left hquarter (by norm_num : 0 ≤ (4 : ℝ)) + norm_num at hscaled + exact hscaled + calc + Real.log (3 : ℝ) = Real.log (3 : ℝ) * 1 := by ring + _ ≤ Real.log (3 : ℝ) * (4 * Lθ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hone_le hlog3_pos.le + calc + Real.log (3 : ℝ) + + Real.log (3 : ℝ) * (CentryScale * Lθ ^ (2 : ℕ)) + ≤ Real.log (3 : ℝ) * (4 * Lθ ^ (2 : ℕ)) + + Real.log (3 : ℝ) * (CentryScale * Lθ ^ (2 : ℕ)) := by + exact add_le_add hlog3_le le_rfl + _ = Cpow * Lθ ^ (2 : ℕ) := by + dsimp [Cpow] + ring + calc + (3 : ℝ) ^ N0 ≤ + (3 : ℝ) ^ Nat.ceil (CentryScale * Lθ ^ (2 : ℕ)) := hpow_mono + _ ≤ 3 * Real.exp (Real.log (3 : ℝ) * + (CentryScale * Lθ ^ (2 : ℕ))) := hceil_pow + _ = Real.exp (Real.log (3 : ℝ) + + Real.log (3 : ℝ) * (CentryScale * Lθ ^ (2 : ℕ))) := hthree_exp + _ ≤ Real.exp (Cpow * Lθ ^ (2 : ℕ)) := hexp_le + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentCompetition.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentCompetition.lean new file mode 100644 index 0000000000..4eb4943e31 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentCompetition.lean @@ -0,0 +1,920 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairSelection + +/-! # Exponent Competition -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Exponent competition for the quenched minimal scale + +This file contains the deterministic real-variable inequalities behind the +"on top of the exponent" step in Theorem `t.homogenization.quenched`. +-/ + +noncomputable section + +theorem natCeil_le_add_max_zero_add_one + {L y : ℝ} (hL : 0 ≤ L) : + (Nat.ceil (L + y) : ℝ) ≤ L + max y 0 + 1 := by + by_cases hsum : 0 ≤ L + y + · have hceil : (Nat.ceil (L + y) : ℝ) < L + y + 1 := + Nat.ceil_lt_add_one hsum + have hy : y ≤ max y 0 := le_max_left y 0 + linarith + · have hceil_zero : Nat.ceil (L + y) = 0 := + Nat.ceil_eq_zero.mpr (le_of_not_ge hsum) + have hnonneg : 0 ≤ L + max y 0 + 1 := by + have hy_nonneg : 0 ≤ max y 0 := le_max_right y 0 + linarith + simpa [hceil_zero] using hnonneg + +theorem highExponentCompetitionConst_pos + {a b t α : ℝ} + (ha : 0 < a) (hb : 0 < b) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) : + 0 < + min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a))))) := by + have htα_pos : 0 < t - α := sub_pos.mpr hαt + have hbα_pos : 0 < b - α := sub_pos.mpr hαb + have hfactor_pos : 0 < 1 + b / a := by + have hbdiv_pos : 0 < b / a := div_pos hb ha + linarith + have hc1_pos : 0 < (t - α) * (1 + b / a) := + mul_pos htα_pos hfactor_pos + have hc2_pos : 0 < b - α * (1 + b / a) := by + linarith + exact + lt_min hb + (lt_min htα_pos + (lt_min hbα_pos + (lt_min hc1_pos hc2_pos))) + +theorem highSharpExponentCompetitionConst_pos + {a b t α : ℝ} + (ha : 0 < a) (hb : 0 < b) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) : + 0 < + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) := by + have hfull := + highExponentCompetitionConst_pos + (a := a) (b := b) (t := t) (α := α) + ha hb hαt hαb hαharm + exact lt_of_lt_of_le hfull (min_le_right b _) + +theorem exists_alpha_for_highCompetition + {a b t : ℝ} (ha : 0 < a) (hb : 0 < b) (ht : 0 < t) : + ∃ α : ℝ, + 0 < α ∧ α < t ∧ α < a ∧ α < b ∧ + α * (1 + b / a) < b := by + let h : ℝ := a * b / (a + b) + let M : ℝ := min t (min a (min b h)) + let α : ℝ := M / 2 + have hab_pos : 0 < a + b := by linarith + have hh_pos : 0 < h := by + dsimp [h] + positivity + have hM_pos : 0 < M := by + dsimp [M] + exact lt_min ht (lt_min ha (lt_min hb hh_pos)) + have hα_pos : 0 < α := by + dsimp [α] + linarith + have hα_lt_M : α < M := by + dsimp [α] + linarith + have hM_le_t : M ≤ t := by + dsimp [M] + exact min_le_left _ _ + have hM_le_a : M ≤ a := by + dsimp [M] + exact (min_le_right t _).trans (min_le_left _ _) + have hM_le_b : M ≤ b := by + dsimp [M] + exact (min_le_right t _).trans + ((min_le_right a _).trans (min_le_left _ _)) + have hM_le_h : M ≤ h := by + dsimp [M, h] + exact (min_le_right t _).trans + ((min_le_right a _).trans (min_le_right _ _)) + have hα_lt_t : α < t := hα_lt_M.trans_le hM_le_t + have hα_lt_a : α < a := hα_lt_M.trans_le hM_le_a + have hα_lt_b : α < b := hα_lt_M.trans_le hM_le_b + have hα_lt_h : α < h := hα_lt_M.trans_le hM_le_h + have hfactor_pos : 0 < 1 + b / a := by + have hbdiv_pos : 0 < b / a := div_pos hb ha + linarith + have hh_eq : h = b / (1 + b / a) := by + dsimp [h] + field_simp [ha.ne', hab_pos.ne'] + have hαharm : α * (1 + b / a) < b := by + have hα_lt_div : α < b / (1 + b / a) := by + simpa [hh_eq] using hα_lt_h + exact (lt_div_iff₀ hfactor_pos).1 hα_lt_div + exact ⟨α, hα_pos, hα_lt_t, hα_lt_a, hα_lt_b, hαharm⟩ + +private theorem high_positive_branch_c2_eq + {a b t α : ℝ} (ha : 0 < a) : + b - α * (1 + b / a) = + (t - α) * (1 + b / a) + (b - t * (1 + b / a)) := by + field_simp [ha.ne'] + ring + +private theorem coefficient_switch_mul_le + {c c1 c2 e r j : ℝ} + (hc_le_c1 : c ≤ c1) (hc_le_c2 : c ≤ c2) + (hc2_eq : c2 = c1 + e) + (hr : 0 ≤ r) (hj : 0 ≤ j) (hjr : j ≤ r) : + c * r ≤ c1 * r + e * j := by + by_cases he : 0 ≤ e + · have hr_le : c * r ≤ c1 * r := + mul_le_mul_of_nonneg_right hc_le_c1 hr + have hej_nonneg : 0 ≤ e * j := mul_nonneg he hj + nlinarith + · have he_nonpos : e ≤ 0 := le_of_not_ge he + have hj_mul : e * r ≤ e * j := + mul_le_mul_of_nonpos_left hjr he_nonpos + have hr_le : c * r ≤ c2 * r := + mul_le_mul_of_nonneg_right hc_le_c2 hr + rw [hc2_eq] at hr_le + nlinarith + +/-- Core real-variable exponent competition in the high range `q ≤ n`. + +The variables are `r = m - q` and `j = n - q`, so `0 ≤ j ≤ r`. The term +`L + max (x/a) 0 + 1` is the ceiling upper bound for the intermediate scale, +where `x = α r - t (r - j) = (α - t)r + t j`. -/ +theorem highExponentCompetition_lower_bound + {a b t α L q r j : ℝ} + (ha : 0 < a) (hb : 0 < b) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) + (_hL : 0 ≤ L) (hq : 0 ≤ q) (hr : 0 ≤ r) + (hj : 0 ≤ j) (hjr : j ≤ r) : + let x : ℝ := (α - t) * r + t * j + let c : ℝ := + min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a))))) + b * (q + j) - b * (L + max (x / a) 0 + 1) - x ≥ + c * (q + r) - b * (L + 1) := by + intro x c + let c1 : ℝ := (t - α) * (1 + b / a) + let c2 : ℝ := b - α * (1 + b / a) + let c3 : ℝ := t - α + let c4 : ℝ := b - α + let cj : ℝ := b - t * (1 + b / a) + have hc_pos : 0 < c := by + simpa [c, c1, c2, c3, c4] using + highExponentCompetitionConst_pos + (a := a) (b := b) (t := t) (α := α) + ha hb hαt hαb hαharm + have hc_nonneg : 0 ≤ c := hc_pos.le + have hc_le_b : c ≤ b := by + dsimp [c] + exact min_le_left _ _ + have hc_le_c1 : c ≤ c1 := by + dsimp [c, c1] + exact (min_le_right b _).trans + ((min_le_right (t - α) _).trans + ((min_le_right (b - α) _).trans + (min_le_left _ _))) + have hc_le_c2 : c ≤ c2 := by + dsimp [c, c2] + exact (min_le_right b _).trans + ((min_le_right (t - α) _).trans + ((min_le_right (b - α) _).trans + (min_le_right _ _))) + have hc_le_c3 : c ≤ c3 := by + dsimp [c, c3] + exact (min_le_right b _).trans (min_le_left _ _) + have hc_le_c4 : c ≤ c4 := by + dsimp [c, c4] + exact (min_le_right b _).trans + ((min_le_right (t - α) _).trans (min_le_left _ _)) + by_cases hx : 0 ≤ x / a + · have hmax : max (x / a) 0 = x / a := max_eq_left hx + have heq : + b * (q + j) - b * (L + max (x / a) 0 + 1) - x = + b * q - b * (L + 1) + c1 * r + cj * j := by + dsimp [x, c1, cj] + rw [hmax] + field_simp [ha.ne'] + ring + rw [heq] + have hq_le : c * q ≤ b * q := + mul_le_mul_of_nonneg_right hc_le_b hq + have hc2_eq : c2 = c1 + cj := by + simpa [c1, c2, cj] using + high_positive_branch_c2_eq (a := a) (b := b) (t := t) (α := α) ha + have hcomb : c * r ≤ c1 * r + cj * j := + coefficient_switch_mul_le hc_le_c1 hc_le_c2 hc2_eq hr hj hjr + have hsum : c * q + c * r ≤ b * q + (c1 * r + cj * j) := + add_le_add hq_le hcomb + calc + c * (q + r) - b * (L + 1) + = (c * q + c * r) - b * (L + 1) := by ring + _ ≤ (b * q + (c1 * r + cj * j)) - b * (L + 1) := + sub_le_sub_right hsum _ + _ = b * q - b * (L + 1) + c1 * r + cj * j := by ring + · have hmax : max (x / a) 0 = 0 := max_eq_right (le_of_not_ge hx) + have heq : + b * (q + j) - b * (L + max (x / a) 0 + 1) - x = + b * q - b * (L + 1) + c3 * r + (b - t) * j := by + dsimp [x, c3] + rw [hmax] + ring + rw [heq] + have hq_le : c * q ≤ b * q := + mul_le_mul_of_nonneg_right hc_le_b hq + have hc4_eq : c4 = c3 + (b - t) := by + dsimp [c3, c4] + ring + have hcomb : c * r ≤ c3 * r + (b - t) * j := + coefficient_switch_mul_le hc_le_c3 hc_le_c4 hc4_eq hr hj hjr + have hsum : c * q + c * r ≤ b * q + (c3 * r + (b - t) * j) := + add_le_add hq_le hcomb + calc + c * (q + r) - b * (L + 1) + = (c * q + c * r) - b * (L + 1) := by ring + _ ≤ (b * q + (c3 * r + (b - t) * j)) - b * (L + 1) := + sub_le_sub_right hsum _ + _ = b * q - b * (L + 1) + c3 * r + (b - t) * j := by ring + +/-- Integer-scale version of `highExponentCompetition_lower_bound`. + +This is the form used for high bad pairs, where the bad scale `q` is below the +localized scale `n`. -/ +theorem highNatScaleExponent_lower_bound_of_ceil + {a b t α L : ℝ} {q m n ℓ : ℕ} + (ha : 0 < a) (hb : 0 < b) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) + (hL : 0 ≤ L) (hℓn : ℓ ≤ n) (hqn : q ≤ n) (hnm : n ≤ m) + (hceil : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let c : ℝ := + min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a))))) + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := by + intro x c + let r : ℝ := ((m - q : ℕ) : ℝ) + let j : ℝ := ((n - q : ℕ) : ℝ) + have hqm : q ≤ m := hqn.trans hnm + have hjr_nat : n - q ≤ m - q := Nat.sub_le_sub_right hnm q + have hq_nonneg : 0 ≤ (q : ℝ) := by positivity + have hr_nonneg : 0 ≤ r := by dsimp [r]; positivity + have hj_nonneg : 0 ≤ j := by dsimp [j]; positivity + have hjr : j ≤ r := by + dsimp [j, r] + exact_mod_cast hjr_nat + have hmn_nat : m - n = (m - q) - (n - q) := by + omega + have hmn_cast : + ((m - n : ℕ) : ℝ) = + ((m - q : ℕ) : ℝ) - ((n - q : ℕ) : ℝ) := by + rw [hmn_nat] + exact_mod_cast (Nat.cast_sub hjr_nat : + (((m - q) - (n - q) : ℕ) : ℝ) = + ((m - q : ℕ) : ℝ) - ((n - q : ℕ) : ℝ)) + have hx_eq : x = (α - t) * r + t * j := by + dsimp [x, r, j] + rw [hmn_cast] + ring + have hn_decomp : (n : ℝ) = (q : ℝ) + j := by + have hn_nat : q + (n - q) = n := Nat.add_sub_of_le hqn + dsimp [j] + exact_mod_cast hn_nat.symm + have hnℓ_cast : ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ) := by + exact_mod_cast (Nat.cast_sub hℓn : + ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ)) + have hceil' : (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x] using hceil + have hleft_ge : + b * ((q : ℝ) + j) - b * (L + max (x / a) 0 + 1) - x ≤ + b * ((n - ℓ : ℕ) : ℝ) - x := by + have hsub : + (q : ℝ) + j - (L + max (x / a) 0 + 1) ≤ + ((n - ℓ : ℕ) : ℝ) := by + rw [hnℓ_cast, hn_decomp] + linarith + have hmul := mul_le_mul_of_nonneg_left hsub hb.le + linarith + have hcore := + highExponentCompetition_lower_bound + (a := a) (b := b) (t := t) (α := α) (L := L) + (q := (q : ℝ)) (r := r) (j := j) + ha hb hαt hαb hαharm hL hq_nonneg hr_nonneg hj_nonneg hjr + dsimp only at hcore + have hcore' : + b * ((q : ℝ) + j) - b * (L + max (x / a) 0 + 1) - x ≥ + c * ((q : ℝ) + r) - b * (L + 1) := by + simpa [x, c, r, j, hx_eq] using hcore + exact hcore'.trans hleft_ge + +/-- Sharp high-range exponent competition when the bad scale is below the +localized scale. This keeps the manuscript's `b q` concentration gain. -/ +theorem highExponentCompetition_lower_bound_sharp + {a b t α L q r j : ℝ} + (ha : 0 < a) (_hb : 0 < b) + (_hαt : α < t) (_hαb : α < b) + (_hαharm : α * (1 + b / a) < b) + (_hL : 0 ≤ L) (hr : 0 ≤ r) + (hj : 0 ≤ j) (hjr : j ≤ r) : + let x : ℝ := (α - t) * r + t * j + let c : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + b * (q + j) - b * (L + max (x / a) 0 + 1) - x ≥ + b * q + c * r - b * (L + 1) := by + intro x c + let c1 : ℝ := (t - α) * (1 + b / a) + let c2 : ℝ := b - α * (1 + b / a) + let c3 : ℝ := t - α + let c4 : ℝ := b - α + let cj : ℝ := b - t * (1 + b / a) + have hc_le_c1 : c ≤ c1 := by + dsimp [c, c1] + exact (min_le_right (t - α) _).trans + ((min_le_right (b - α) _).trans (min_le_left _ _)) + have hc_le_c2 : c ≤ c2 := by + dsimp [c, c2] + exact (min_le_right (t - α) _).trans + ((min_le_right (b - α) _).trans (min_le_right _ _)) + have hc_le_c3 : c ≤ c3 := by + dsimp [c, c3] + exact min_le_left _ _ + have hc_le_c4 : c ≤ c4 := by + dsimp [c, c4] + exact (min_le_right (t - α) _).trans (min_le_left _ _) + by_cases hx : 0 ≤ x / a + · have hmax : max (x / a) 0 = x / a := max_eq_left hx + have heq : + b * (q + j) - b * (L + max (x / a) 0 + 1) - x = + b * q - b * (L + 1) + c1 * r + cj * j := by + dsimp [x, c1, cj] + rw [hmax] + field_simp [ha.ne'] + ring + rw [heq] + have hc2_eq : c2 = c1 + cj := by + simpa [c1, c2, cj] using + high_positive_branch_c2_eq (a := a) (b := b) (t := t) (α := α) ha + have hcomb : c * r ≤ c1 * r + cj * j := + coefficient_switch_mul_le hc_le_c1 hc_le_c2 hc2_eq hr hj hjr + calc + b * q + c * r - b * (L + 1) + ≤ b * q + (c1 * r + cj * j) - b * (L + 1) := + sub_le_sub_right (add_le_add le_rfl hcomb) _ + _ = b * q - b * (L + 1) + c1 * r + cj * j := by ring + · have hmax : max (x / a) 0 = 0 := max_eq_right (le_of_not_ge hx) + have heq : + b * (q + j) - b * (L + max (x / a) 0 + 1) - x = + b * q - b * (L + 1) + c3 * r + (b - t) * j := by + dsimp [x, c3] + rw [hmax] + ring + rw [heq] + have hc4_eq : c4 = c3 + (b - t) := by + dsimp [c3, c4] + ring + have hcomb : c * r ≤ c3 * r + (b - t) * j := + coefficient_switch_mul_le hc_le_c3 hc_le_c4 hc4_eq hr hj hjr + calc + b * q + c * r - b * (L + 1) + ≤ b * q + (c3 * r + (b - t) * j) - b * (L + 1) := + sub_le_sub_right (add_le_add le_rfl hcomb) _ + _ = b * q - b * (L + 1) + c3 * r + (b - t) * j := by ring + +/-- Integer-scale sharp high-range exponent competition in the case `q ≤ n`. -/ +theorem highNatScaleExponent_lower_bound_of_ceil_q_le_n_sharp + {a b t α L : ℝ} {q m n ℓ : ℕ} + (ha : 0 < a) (hb : 0 < b) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) + (hL : 0 ≤ L) (hℓn : ℓ ≤ n) (hqn : q ≤ n) (hnm : n ≤ m) + (hceil : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let c : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + b * (q : ℝ) + c * ((m - q : ℕ) : ℝ) - b * (L + 1) := by + intro x c + let r : ℝ := ((m - q : ℕ) : ℝ) + let j : ℝ := ((n - q : ℕ) : ℝ) + have hjr_nat : n - q ≤ m - q := Nat.sub_le_sub_right hnm q + have hr_nonneg : 0 ≤ r := by dsimp [r]; positivity + have hj_nonneg : 0 ≤ j := by dsimp [j]; positivity + have hjr : j ≤ r := by + dsimp [j, r] + exact_mod_cast hjr_nat + have hmn_nat : m - n = (m - q) - (n - q) := by + omega + have hmn_cast : + ((m - n : ℕ) : ℝ) = + ((m - q : ℕ) : ℝ) - ((n - q : ℕ) : ℝ) := by + rw [hmn_nat] + exact_mod_cast (Nat.cast_sub hjr_nat : + (((m - q) - (n - q) : ℕ) : ℝ) = + ((m - q : ℕ) : ℝ) - ((n - q : ℕ) : ℝ)) + have hx_eq : x = (α - t) * r + t * j := by + dsimp [x, r, j] + rw [hmn_cast] + ring + have hn_decomp : (n : ℝ) = (q : ℝ) + j := by + have hn_nat : q + (n - q) = n := Nat.add_sub_of_le hqn + dsimp [j] + exact_mod_cast hn_nat.symm + have hnℓ_cast : ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ) := by + exact_mod_cast (Nat.cast_sub hℓn : + ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ)) + have hceil' : (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x] using hceil + have hleft_ge : + b * ((q : ℝ) + j) - b * (L + max (x / a) 0 + 1) - x ≤ + b * ((n - ℓ : ℕ) : ℝ) - x := by + have hsub : + (q : ℝ) + j - (L + max (x / a) 0 + 1) ≤ + ((n - ℓ : ℕ) : ℝ) := by + rw [hnℓ_cast, hn_decomp] + linarith + have hmul := mul_le_mul_of_nonneg_left hsub hb.le + linarith + have hcore := + highExponentCompetition_lower_bound_sharp + (a := a) (b := b) (t := t) (α := α) (L := L) + (q := (q : ℝ)) (r := r) (j := j) + ha hb hαt hαb hαharm hL hr_nonneg hj_nonneg hjr + dsimp only at hcore + have hcore' : + b * ((q : ℝ) + j) - b * (L + max (x / a) 0 + 1) - x ≥ + b * (q : ℝ) + c * r - b * (L + 1) := by + simpa [x, c, r, j, hx_eq] using hcore + exact hcore'.trans hleft_ge + +/-- High-scale exponent competition without assuming that the bad scale lies +below the localized scale. If `q ≤ n`, this is the previous bridge with a +slightly smaller constant; if `n < q`, the post-discount exponent itself gives +the missing decay in `q - n`. -/ +theorem highNatScaleExponent_lower_bound_of_ceil_any_q + {a b t α L : ℝ} {q m n ℓ : ℕ} + (ha : 0 < a) (hb : 0 < b) (ht : 0 < t) + (hαt : α < t) (hαb : α < b) + (hαharm : α * (1 + b / a) < b) + (hL : 0 ≤ L) (hℓn : ℓ ≤ n) (hqm : q ≤ m) (hnm : n ≤ m) + (hceil : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let c : ℝ := + min t + (min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))))) + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := by + intro x c + let cold : ℝ := + min b + (min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a))))) + have hc_le_cold : c ≤ cold := by + dsimp [c, cold] + exact min_le_right _ _ + have hc_le_b : c ≤ b := by + exact hc_le_cold.trans (by dsimp [cold]; exact min_le_left _ _) + have hc_le_t : c ≤ t := by + dsimp [c] + exact min_le_left _ _ + have hc_le_tα : c ≤ t - α := by + exact hc_le_cold.trans + (by dsimp [cold]; exact (min_le_right b _).trans (min_le_left _ _)) + by_cases hqn : q ≤ n + · have hcore := + highNatScaleExponent_lower_bound_of_ceil + (a := a) (b := b) (t := t) (α := α) (L := L) + (q := q) (m := m) (n := n) (ℓ := ℓ) + ha hb hαt hαb hαharm hL hℓn hqn hnm hceil + dsimp only at hcore + have hqr_nonneg : + 0 ≤ ((q : ℝ) + ((m - q : ℕ) : ℝ)) := by positivity + have hcold_bound : + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) ≤ + cold * ((q : ℝ) + ((m - q : ℕ) : ℝ)) := + mul_le_mul_of_nonneg_right hc_le_cold hqr_nonneg + calc + b * ((n - ℓ : ℕ) : ℝ) - x + ≥ cold * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := hcore + _ ≥ c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := + sub_le_sub_right hcold_bound _ + · have hnq : n < q := Nat.lt_of_not_ge hqn + have hx_nonpos : x / a ≤ 0 := by + have hm_sub : m - n = (m - q) + (q - n) := by omega + have hx_eq : + x = + -(t - α) * ((m - q : ℕ) : ℝ) - + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have htα_pos : 0 < t - α := sub_pos.mpr hαt + have hr_nonneg : 0 ≤ ((m - q : ℕ) : ℝ) := by positivity + have hs_pos : 0 < ((q - n : ℕ) : ℝ) := by + exact_mod_cast Nat.sub_pos_of_lt hnq + have hx_nonpos' : x ≤ 0 := by + have hleft_nonpos : + -(t - α) * ((m - q : ℕ) : ℝ) ≤ 0 := + mul_nonpos_of_nonpos_of_nonneg + (neg_nonpos.mpr htα_pos.le) hr_nonneg + have hright_nonneg : 0 ≤ t * ((q - n : ℕ) : ℝ) := + (mul_pos ht hs_pos).le + calc + x = -(t - α) * ((m - q : ℕ) : ℝ) - + t * ((q - n : ℕ) : ℝ) := hx_eq + _ ≤ 0 - t * ((q - n : ℕ) : ℝ) := + sub_le_sub_right hleft_nonpos _ + _ ≤ 0 := sub_nonpos.mpr hright_nonneg + exact div_nonpos_of_nonpos_of_nonneg hx_nonpos' ha.le + have hceil_L : + (ℓ : ℝ) ≤ L + 1 := by + have hceil' : (ℓ : ℝ) ≤ L + max (x / a) 0 + 1 := by + simpa [x] using hceil + simpa [max_eq_right hx_nonpos] using hceil' + have hnℓ_cast : + ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ) := by + exact_mod_cast (Nat.cast_sub hℓn : + ((n - ℓ : ℕ) : ℝ) = (n : ℝ) - (ℓ : ℝ)) + have hm_sub : m - n = (m - q) + (q - n) := by omega + have hx_neg_eq : + -x = + (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have hq_decomp : + (q : ℝ) = (n : ℝ) + ((q - n : ℕ) : ℝ) := by + have hnat : n + (q - n) = q := Nat.add_sub_of_le (le_of_lt hnq) + exact_mod_cast hnat.symm + have hleft_ge : + b * ((n - ℓ : ℕ) : ℝ) - x ≥ + b * (n : ℝ) - b * (L + 1) - x := by + rw [hnℓ_cast] + have hmul := mul_le_mul_of_nonneg_left hceil_L hb.le + calc + b * ((n : ℝ) - (ℓ : ℝ)) - x + = b * (n : ℝ) - b * (ℓ : ℝ) - x := by ring + _ ≥ b * (n : ℝ) - b * (L + 1) - x := + sub_le_sub_right (sub_le_sub_left hmul (b * (n : ℝ))) x + have hmain : + b * (n : ℝ) - x ≥ + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) := by + have hn_nonneg : 0 ≤ (n : ℝ) := by positivity + have hs_nonneg : 0 ≤ ((q - n : ℕ) : ℝ) := by positivity + have hr_nonneg : 0 ≤ ((m - q : ℕ) : ℝ) := by positivity + have hn_part : c * (n : ℝ) ≤ b * (n : ℝ) := + mul_le_mul_of_nonneg_right hc_le_b hn_nonneg + have hs_part : c * ((q - n : ℕ) : ℝ) ≤ + t * ((q - n : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hc_le_t hs_nonneg + have hr_part : c * ((m - q : ℕ) : ℝ) ≤ + (t - α) * ((m - q : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hc_le_tα hr_nonneg + have hleft_eq : + b * (n : ℝ) - x = + b * (n : ℝ) + + ((t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ)) := by + rw [← hx_neg_eq] + ring + have hright_eq : + c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) = + c * ((n : ℝ) + ((q - n : ℕ) : ℝ) + + ((m - q : ℕ) : ℝ)) := by + rw [hq_decomp] + rw [hleft_eq, hright_eq] + have hsum : + c * ((n : ℝ) + ((q - n : ℕ) : ℝ) + + ((m - q : ℕ) : ℝ)) ≤ + b * (n : ℝ) + t * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) := by + calc + c * ((n : ℝ) + ((q - n : ℕ) : ℝ) + + ((m - q : ℕ) : ℝ)) + = c * (n : ℝ) + c * ((q - n : ℕ) : ℝ) + + c * ((m - q : ℕ) : ℝ) := by ring + _ ≤ b * (n : ℝ) + t * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) := + add_le_add (add_le_add hn_part hs_part) hr_part + calc + c * ((n : ℝ) + ((q - n : ℕ) : ℝ) + + ((m - q : ℕ) : ℝ)) + ≤ b * (n : ℝ) + t * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) := hsum + _ = b * (n : ℝ) + + ((t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ)) := by ring + calc + b * ((n - ℓ : ℕ) : ℝ) - x + ≥ b * (n : ℝ) - b * (L + 1) - x := hleft_ge + _ = b * (n : ℝ) - x - b * (L + 1) := by ring + _ ≥ c * ((q : ℝ) + ((m - q : ℕ) : ℝ)) - b * (L + 1) := + sub_le_sub_right hmain _ + +/-- If the selected high scale is not below `n` and the exponent correction is +nonpositive, then `n` is bounded by the deterministic logarithmic offset. -/ +theorem n_le_logOffset_add_one_of_not_high_x_nonpos + {a L x : ℝ} {n ℓ : ℕ} + (hceil : (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) + (hx : x / a ≤ 0) (hnℓ : n ≤ ℓ) : + (n : ℝ) ≤ L + 1 := by + have hn_le_ℓ : (n : ℝ) ≤ (ℓ : ℝ) := by exact_mod_cast hnℓ + have hℓ_bound : (ℓ : ℝ) ≤ L + 1 := by + simpa [max_eq_right hx] using hceil + linarith + +/-- If the selected high scale is not below `n`, and the exponent correction is +at most `α n` with `α < a`, then `n` is bounded by the deterministic logarithmic +offset with buffer `1 - α/a`. -/ +theorem scale_bound_of_not_high_x_le_alpha_mul_n + {a α L x : ℝ} {n ℓ : ℕ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (_hαa : α < a) + (hceil : (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) + (hx : x ≤ α * (n : ℝ)) (hnℓ : n ≤ ℓ) : + (1 - α / a) * (n : ℝ) ≤ L + 1 := by + have hn_le_ℓ : (n : ℝ) ≤ (ℓ : ℝ) := by exact_mod_cast hnℓ + have hxa : + x / a ≤ (α / a) * (n : ℝ) := by + have hdiv := div_le_div_of_nonneg_right hx ha.le + calc + x / a ≤ α * (n : ℝ) / a := hdiv + _ = (α / a) * (n : ℝ) := by ring + have htarget_nonneg : 0 ≤ (α / a) * (n : ℝ) := by positivity + have hmax_le : max (x / a) 0 ≤ (α / a) * (n : ℝ) := + max_le hxa htarget_nonneg + have hℓ_bound : (ℓ : ℝ) ≤ L + (α / a) * (n : ℝ) + 1 := by + linarith + have hn_bound : (n : ℝ) ≤ L + (α / a) * (n : ℝ) + 1 := + hn_le_ℓ.trans hℓ_bound + calc + (1 - α / a) * (n : ℝ) = (n : ℝ) - (α / a) * (n : ℝ) := by ring + _ ≤ (L + (α / a) * (n : ℝ) + 1) - (α / a) * (n : ℝ) := + sub_le_sub_right hn_bound _ + _ = L + 1 := by ring + +/-- In the complementary high-scale range with `n ≤ q`, the exponent correction +is nonpositive. -/ +theorem highComplement_x_div_nonpos_of_n_le_q + {a t α : ℝ} {q m n : ℕ} + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) + (hnq : n ≤ q) (hqm : q ≤ m) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + x / a ≤ 0 := by + intro x + have hm_sub : m - n = (m - q) + (q - n) := by + omega + have hx_eq : + x = + -(t - α) * ((m - q : ℕ) : ℝ) - + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + have htα_pos : 0 < t - α := sub_pos.mpr hαt + have hleft_nonneg : + 0 ≤ (t - α) * ((m - q : ℕ) : ℝ) := by + positivity + have hright_nonneg : + 0 ≤ t * ((q - n : ℕ) : ℝ) := by + positivity + have hx_nonpos : x ≤ 0 := by + have hleft_nonpos : + -(t - α) * ((m - q : ℕ) : ℝ) ≤ 0 := + mul_nonpos_of_nonpos_of_nonneg + (neg_nonpos.mpr htα_pos.le) (by positivity) + calc + x = -(t - α) * ((m - q : ℕ) : ℝ) - + t * ((q - n : ℕ) : ℝ) := hx_eq + _ ≤ 0 - t * ((q - n : ℕ) : ℝ) := + sub_le_sub_right hleft_nonpos _ + _ ≤ 0 := sub_nonpos.mpr hright_nonneg + exact div_nonpos_of_nonpos_of_nonneg hx_nonpos ha.le + +/-- In the complementary high-scale range with `q ≤ n`, the exponent correction +is at most `α n`. -/ +theorem highComplement_x_le_alpha_mul_n_of_q_le_n + {t α : ℝ} {q m n : ℕ} + (hα_nonneg : 0 ≤ α) (hαt : α < t) + (hqn : q ≤ n) (hnm : n ≤ m) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + x ≤ α * (n : ℝ) := by + intro x + have hmq_sub : m - q = (m - n) + (n - q) := by + omega + have hx_eq : + x = + (α - t) * ((m - n : ℕ) : ℝ) + + α * ((n - q : ℕ) : ℝ) := by + dsimp [x] + rw [hmq_sub] + norm_num [Nat.cast_add] + ring + have hcoeff_nonpos : α - t ≤ 0 := by + linarith + have hmn_nonneg : 0 ≤ ((m - n : ℕ) : ℝ) := by + positivity + have hfirst_nonpos : + (α - t) * ((m - n : ℕ) : ℝ) ≤ 0 := + mul_nonpos_of_nonpos_of_nonneg hcoeff_nonpos hmn_nonneg + have hnq_le_n : ((n - q : ℕ) : ℝ) ≤ (n : ℝ) := by + exact_mod_cast Nat.sub_le n q + have htail_le : α * ((n - q : ℕ) : ℝ) ≤ α * (n : ℝ) := + mul_le_mul_of_nonneg_left hnq_le_n hα_nonneg + rw [hx_eq] + linarith + +/-- If the selected high scale is not below `n` and `n ≤ q`, then `n` is +bounded by the logarithmic offset. -/ +theorem n_le_logOffset_add_one_of_not_high_n_le_q + {a t α L : ℝ} {q m n ℓ : ℕ} + (ha : 0 < a) (ht : 0 < t) (hαt : α < t) + (hceil : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) + (hnℓ : n ≤ ℓ) (hnq : n ≤ q) (hqm : q ≤ m) : + (n : ℝ) ≤ L + 1 := by + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + exact + n_le_logOffset_add_one_of_not_high_x_nonpos + (a := a) (L := L) (x := x) (n := n) (ℓ := ℓ) + (by simpa [x] using hceil) + (by + simpa [x] using + highComplement_x_div_nonpos_of_n_le_q + (a := a) (t := t) (α := α) (q := q) (m := m) (n := n) + ha ht hαt hnq hqm) + hnℓ + +/-- If the selected high scale is not below `n` and `q ≤ n`, then `n` is +bounded by the logarithmic offset with the buffer `1 - α/a`. -/ +theorem scale_bound_of_not_high_q_le_n + {a t α L : ℝ} {q m n ℓ : ℕ} + (ha : 0 < a) (hα_nonneg : 0 ≤ α) (hαt : α < t) (hαa : α < a) + (hceil : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (ℓ : ℝ) ≤ L + max (x / a) 0 + 1) + (hnℓ : n ≤ ℓ) (hqn : q ≤ n) (hnm : n ≤ m) : + (1 - α / a) * (n : ℝ) ≤ L + 1 := by + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + exact + scale_bound_of_not_high_x_le_alpha_mul_n + (a := a) (α := α) (L := L) (x := x) (n := n) (ℓ := ℓ) + ha hα_nonneg hαa + (by simpa [x] using hceil) + (by + simpa [x] using + highComplement_x_le_alpha_mul_n_of_q_le_n + (t := t) (α := α) (q := q) (m := m) (n := n) + hα_nonneg hαt hqn hnm) + hnℓ + +/-- Bottom-range exponent competition for the crude estimate. Here +`r = m - q` and `j = q - n`, so the discount gives decay in both directions. -/ +theorem crudeBottomExponent_lower_bound + {t α : ℝ} {q m n : ℕ} + (hnq : n ≤ q) (hqm : q ≤ m) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let c : ℝ := min (t - α) t + (-x) ≥ c * (((m - q : ℕ) : ℝ) + ((q - n : ℕ) : ℝ)) := by + intro x c + have hc_le_left : c ≤ t - α := by + dsimp [c] + exact min_le_left _ _ + have hc_le_right : c ≤ t := by + dsimp [c] + exact min_le_right _ _ + have hr_nonneg : 0 ≤ ((m - q : ℕ) : ℝ) := by positivity + have hj_nonneg : 0 ≤ ((q - n : ℕ) : ℝ) := by positivity + have hm_sub : + m - n = (m - q) + (q - n) := by + omega + have hx_eq : + -x = + (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := by + dsimp [x] + rw [hm_sub] + norm_num [Nat.cast_add] + ring + rw [hx_eq] + have hleft : + c * ((m - q : ℕ) : ℝ) ≤ + (t - α) * ((m - q : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hc_le_left hr_nonneg + have hright : + c * ((q - n : ℕ) : ℝ) ≤ + t * ((q - n : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hc_le_right hj_nonneg + calc + c * (((m - q : ℕ) : ℝ) + ((q - n : ℕ) : ℝ)) + = c * ((m - q : ℕ) : ℝ) + c * ((q - n : ℕ) : ℝ) := by ring + _ ≤ (t - α) * ((m - q : ℕ) : ℝ) + + t * ((q - n : ℕ) : ℝ) := + add_le_add hleft hright + +/-- Crude exponent competition in the range `q ≤ n`. The price is an +`α n` offset, which is harmless once the complementary high-scale argument has +bounded `n`. -/ +theorem crudeTopExponent_lower_bound_of_q_le_n + {t α c : ℝ} {q m n : ℕ} + (hα_nonneg : 0 ≤ α) (hc_le : c ≤ t - α) + (hqn : q ≤ n) (hnm : n ≤ m) : + let x : ℝ := + α * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + (-x) ≥ c * ((m - n : ℕ) : ℝ) - α * (n : ℝ) := by + intro x + have hmq_sub : m - q = (m - n) + (n - q) := by + omega + have hx_neg_eq : + -x = + (t - α) * ((m - n : ℕ) : ℝ) - + α * ((n - q : ℕ) : ℝ) := by + dsimp [x] + rw [hmq_sub] + norm_num [Nat.cast_add] + ring + have hmn_nonneg : 0 ≤ ((m - n : ℕ) : ℝ) := by + positivity + have hc_part : + c * ((m - n : ℕ) : ℝ) ≤ + (t - α) * ((m - n : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hc_le hmn_nonneg + have hnq_le_n : ((n - q : ℕ) : ℝ) ≤ (n : ℝ) := by + exact_mod_cast Nat.sub_le n q + have htail_le : α * ((n - q : ℕ) : ℝ) ≤ α * (n : ℝ) := + mul_le_mul_of_nonneg_left hnq_le_n hα_nonneg + rw [hx_neg_eq] + linarith + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentialKernel.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentialKernel.lean new file mode 100644 index 0000000000..aaacd36d8c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ExponentialKernel.lean @@ -0,0 +1,438 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion + +/-! # Exponential Kernel -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped BigOperators + +/-! +# Exponential kernels for the bad-scale summation + +These are pure real-variable summability facts used to sum the fixed-pair +probability kernels in the quantitative minimal-scale proof. +-/ + +noncomputable section + +noncomputable def geometricExpKernelConst (ρ η : ℝ) : ℝ := + ∑' k : ℕ, Real.exp ((k : ℝ) * (-(ρ ^ η - 1))) + +noncomputable def linearExpKernelConst (ρ η : ℝ) : ℝ := + ∑' k : ℕ, (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) + +theorem geometricExpKernelConst_pos + {ρ η : ℝ} (hρ : 1 < ρ) (hη : 0 < η) : + 0 < geometricExpKernelConst ρ η := by + dsimp [geometricExpKernelConst] + let f : ℕ → ℝ := fun k => Real.exp ((k : ℝ) * (-(ρ ^ η - 1))) + have hsum : Summable f := by + exact Real.summable_exp_nat_mul_iff.mpr + (by + have hδ_pos : 0 < ρ ^ η - 1 := + sub_pos.mpr (Real.one_lt_rpow hρ hη) + linarith) + have hzero : (0 : ℝ) < f 0 := by + positivity + simpa [f] using hsum.tsum_pos (fun k => by positivity) 0 hzero + +theorem summable_linear_exp_kernel + {ρ η : ℝ} (hρ : 1 < ρ) (hη : 0 < η) : + Summable fun k : ℕ => (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := by + let δ : ℝ := ρ ^ η - 1 + have hδ_pos : 0 < δ := by + dsimp [δ] + exact sub_pos.mpr (Real.one_lt_rpow hρ hη) + have hlinear : + Summable fun k : ℕ => (k : ℝ) * Real.exp (-δ * (k : ℝ)) := by + simpa [pow_one, mul_comm, mul_left_comm, mul_assoc] using + Real.summable_pow_mul_exp_neg_nat_mul 1 hδ_pos + have hgeom : + Summable fun k : ℕ => Real.exp (-δ * (k : ℝ)) := by + have hbase : Summable fun k : ℕ => Real.exp ((k : ℝ) * (-δ)) := + Real.summable_exp_nat_mul_iff.mpr (by linarith) + refine hbase.congr ?_ + intro k + congr 1 + ring + have hsum : + Summable fun k : ℕ => + (k : ℝ) * Real.exp (-δ * (k : ℝ)) + + Real.exp (-δ * (k : ℝ)) := + hlinear.add hgeom + refine hsum.congr ?_ + intro k + dsimp [δ] + ring_nf + +theorem linearExpKernelConst_pos + {ρ η : ℝ} (hρ : 1 < ρ) (hη : 0 < η) : + 0 < linearExpKernelConst ρ η := by + dsimp [linearExpKernelConst] + have hsum := summable_linear_exp_kernel hρ hη + have hzero : + (0 : ℝ) < + (((0 : ℕ) : ℝ) + 1) * + Real.exp (((0 : ℕ) : ℝ) * (-(ρ ^ η - 1))) := by + positivity + exact hsum.tsum_pos (fun k => by positivity) 0 hzero + +theorem exp_neg_rpow_mul_pow_le_exp_neg_mul_exp_neg_nat + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (k : ℕ) : + Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hρ_pos : 0 < ρ := lt_trans zero_lt_one hρ + have hAη_pos : 0 < A ^ η := Real.rpow_pos_of_pos hA_pos η + have hAη_ge_one : 1 ≤ A ^ η := by + exact Real.one_le_rpow hA hη.le + have hρ_pow_nonneg : 0 ≤ ρ ^ k := pow_nonneg hρ_pos.le k + let r : ℝ := ρ ^ η + have hr_gt_one : 1 < r := by + dsimp [r] + exact Real.one_lt_rpow hρ hη + have hr_nonneg : 0 ≤ r := le_of_lt (lt_trans zero_lt_one hr_gt_one) + have hbern : + 1 + (k : ℝ) * (r - 1) ≤ r ^ k := by + exact one_add_mul_sub_le_pow (by linarith : (-1 : ℝ) ≤ r) k + have hρkη : + (ρ ^ k) ^ η = r ^ k := by + dsimp [r] + exact (Real.rpow_pow_comm hρ_pos.le η k).symm + have hmain : + A ^ η + (ρ ^ η - 1) * (k : ℝ) ≤ (A * ρ ^ k) ^ η := by + have hmul_lower : + A ^ η * (1 + (k : ℝ) * (r - 1)) ≤ A ^ η * r ^ k := + mul_le_mul_of_nonneg_left hbern hAη_pos.le + have hleft_le : + A ^ η + (r - 1) * (k : ℝ) ≤ + A ^ η * (1 + (k : ℝ) * (r - 1)) := by + have hdelta_nonneg : 0 ≤ r - 1 := by linarith + have hk_nonneg : 0 ≤ (k : ℝ) := by positivity + have hterm_nonneg : 0 ≤ (k : ℝ) * (r - 1) := + mul_nonneg hk_nonneg hdelta_nonneg + nlinarith [hAη_ge_one, hterm_nonneg] + calc + A ^ η + (ρ ^ η - 1) * (k : ℝ) + = A ^ η + (r - 1) * (k : ℝ) := by simp [r] + _ ≤ A ^ η * (1 + (k : ℝ) * (r - 1)) := hleft_le + _ ≤ A ^ η * r ^ k := hmul_lower + _ = (A * ρ ^ k) ^ η := by + rw [Real.mul_rpow hA_pos.le hρ_pow_nonneg, hρkη] + calc + Real.exp (-((A * ρ ^ k) ^ η)) + ≤ Real.exp (-(A ^ η + (ρ ^ η - 1) * (k : ℝ))) := by + exact Real.exp_le_exp.mpr (by linarith) + _ = Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := by + rw [← Real.exp_add] + congr 1 + ring + +theorem summable_exp_neg_rpow_mul_pow + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) : + Summable fun k : ℕ => Real.exp (-((A * ρ ^ k) ^ η)) := by + let δ : ℝ := ρ ^ η - 1 + have hδ_pos : 0 < δ := by + dsimp [δ] + exact sub_pos.mpr (Real.one_lt_rpow hρ hη) + have hgeom : + Summable fun k : ℕ => Real.exp (-((δ) * (k : ℝ))) := by + have hbase : Summable fun k : ℕ => Real.exp ((k : ℝ) * (-δ)) := + Real.summable_exp_nat_mul_iff.mpr (by linarith) + simpa [mul_comm, mul_left_comm, mul_assoc] using hbase + have hscaled : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * Real.exp (-(δ * (k : ℝ))) := + hgeom.mul_left _ + refine Summable.of_nonneg_of_le ?_ ?_ hscaled + · intro k + positivity + · intro k + simpa [δ] using + exp_neg_rpow_mul_pow_le_exp_neg_mul_exp_neg_nat + (A := A) (ρ := ρ) (η := η) hA hρ hη k + +theorem tsum_exp_neg_rpow_mul_pow_le + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) : + (∑' k : ℕ, Real.exp (-((A * ρ ^ k) ^ η))) ≤ + ∑' k : ℕ, + Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := by + have hf := summable_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) hA hρ hη + let δ : ℝ := ρ ^ η - 1 + have hδ_pos : 0 < δ := by + dsimp [δ] + exact sub_pos.mpr (Real.one_lt_rpow hρ hη) + have hgeom : + Summable fun k : ℕ => Real.exp (-(δ * (k : ℝ))) := by + have hbase : Summable fun k : ℕ => Real.exp ((k : ℝ) * (-δ)) := + Real.summable_exp_nat_mul_iff.mpr (by linarith) + refine hbase.congr ?_ + intro k + congr 1 + ring + have hg : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := by + simpa [δ] using hgeom.mul_left (Real.exp (-(A ^ η))) + exact Summable.tsum_le_tsum + (fun k => + exp_neg_rpow_mul_pow_le_exp_neg_mul_exp_neg_nat + (A := A) (ρ := ρ) (η := η) hA hρ hη k) + hf hg + +theorem tsum_exp_neg_rpow_mul_pow_le_const + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) : + (∑' k : ℕ, Real.exp (-((A * ρ ^ k) ^ η))) ≤ + Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η := by + have hgeom : + Summable fun k : ℕ => Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := by + let δ : ℝ := ρ ^ η - 1 + have hδ_pos : 0 < δ := by + dsimp [δ] + exact sub_pos.mpr (Real.one_lt_rpow hρ hη) + have hbase : Summable fun k : ℕ => Real.exp ((k : ℝ) * (-δ)) := + Real.summable_exp_nat_mul_iff.mpr (by linarith) + refine hbase.congr ?_ + intro k + dsimp [δ] + congr 1 + ring + calc + (∑' k : ℕ, Real.exp (-((A * ρ ^ k) ^ η))) + ≤ ∑' k : ℕ, + Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ))) := + tsum_exp_neg_rpow_mul_pow_le (A := A) (ρ := ρ) (η := η) + hA hρ hη + _ = Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η := by + rw [hgeom.tsum_mul_left] + congr 1 + dsimp [geometricExpKernelConst] + apply tsum_congr + intro k + congr 1 + ring + +theorem tsum_linear_mul_exp_neg_rpow_mul_pow_le_const + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) : + (∑' k : ℕ, (((k : ℝ) + 1) * + Real.exp (-((A * ρ ^ k) ^ η)))) ≤ + Real.exp (-(A ^ η)) * linearExpKernelConst ρ η := by + have hlinear := summable_linear_exp_kernel hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := + hlinear.mul_left _ + have hpoint : + ∀ k : ℕ, + (((k : ℝ) + 1) * Real.exp (-((A * ρ ^ k) ^ η))) ≤ + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := by + intro k + have hk_nonneg : 0 ≤ (k : ℝ) + 1 := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_exp_neg_nat + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + (((k : ℝ) + 1) * Real.exp (-((A * ρ ^ k) ^ η))) + ≤ ((k : ℝ) + 1) * + (Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ)))) := + mul_le_mul_of_nonneg_left hbase hk_nonneg + _ = Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := by + ring_nf + have hlhs : + Summable fun k : ℕ => + (((k : ℝ) + 1) * Real.exp (-((A * ρ ^ k) ^ η))) := by + refine Summable.of_nonneg_of_le ?_ hpoint hmajor + intro k + positivity + calc + (∑' k : ℕ, (((k : ℝ) + 1) * + Real.exp (-((A * ρ ^ k) ^ η)))) + ≤ ∑' k : ℕ, + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := + Summable.tsum_le_tsum hpoint hlhs hmajor + _ = Real.exp (-(A ^ η)) * linearExpKernelConst ρ η := by + rw [hlinear.tsum_mul_left] + rfl + +theorem summable_linear_mul_exp_neg_rpow_mul_pow + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) : + Summable fun k : ℕ => (((k : ℝ) + 1) * + Real.exp (-((A * ρ ^ k) ^ η))) := by + have hlinear := summable_linear_exp_kernel hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := + hlinear.mul_left _ + refine Summable.of_nonneg_of_le ?_ ?_ hmajor + · intro k + positivity + · intro k + have hk_nonneg : 0 ≤ (k : ℝ) + 1 := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_exp_neg_nat + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + (((k : ℝ) + 1) * Real.exp (-((A * ρ ^ k) ^ η))) + ≤ ((k : ℝ) + 1) * + (Real.exp (-(A ^ η)) * + Real.exp (-((ρ ^ η - 1) * (k : ℝ)))) := + mul_le_mul_of_nonneg_left hbase hk_nonneg + _ = Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * + Real.exp ((k : ℝ) * (-(ρ ^ η - 1)))) := by + ring_nf + +theorem summable_exp_neg_two_rpow_mul_pow + {A ρ₁ ρ₂ η : ℝ} (hA : 1 ≤ A) (hρ₁ : 1 < ρ₁) + (hρ₂ : 1 < ρ₂) (hη : 0 < η) : + Summable fun p : ℕ × ℕ => + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η)) := by + let F : ℕ × ℕ → ℝ := fun p => + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η)) + have hrow : ∀ i : ℕ, Summable fun j : ℕ => F (i, j) := by + intro i + have hρ₁_pow : 1 ≤ ρ₁ ^ i := + one_le_pow₀ hρ₁.le + have hA_i : 1 ≤ A * ρ₁ ^ i := by + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA + have hmul := mul_le_mul hA hρ₁_pow + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + simpa using hmul + simpa [F, mul_assoc] using + summable_exp_neg_rpow_mul_pow + (A := A * ρ₁ ^ i) (ρ := ρ₂) (η := η) hA_i hρ₂ hη + have hrow_le : + ∀ i : ℕ, (∑' j : ℕ, F (i, j)) ≤ + Real.exp (-((A * ρ₁ ^ i) ^ η)) * geometricExpKernelConst ρ₂ η := by + intro i + have hρ₁_pow : 1 ≤ ρ₁ ^ i := + one_le_pow₀ hρ₁.le + have hA_i : 1 ≤ A * ρ₁ ^ i := by + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA + have hmul := mul_le_mul hA hρ₁_pow + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + simpa using hmul + simpa [F, mul_assoc] using + tsum_exp_neg_rpow_mul_pow_le_const + (A := A * ρ₁ ^ i) (ρ := ρ₂) (η := η) hA_i hρ₂ hη + have houter : + Summable fun i : ℕ => ∑' j : ℕ, F (i, j) := by + have hbase : + Summable fun i : ℕ => Real.exp (-((A * ρ₁ ^ i) ^ η)) := + summable_exp_neg_rpow_mul_pow (A := A) (ρ := ρ₁) (η := η) + hA hρ₁ hη + have hmajor : + Summable fun i : ℕ => + Real.exp (-((A * ρ₁ ^ i) ^ η)) * + geometricExpKernelConst ρ₂ η := + hbase.mul_right _ + refine Summable.of_nonneg_of_le ?_ hrow_le hmajor + intro i + exact tsum_nonneg fun j => by + dsimp [F] + positivity + exact (summable_prod_of_nonneg (f := F) (fun p => by + dsimp [F] + positivity)).2 ⟨hrow, houter⟩ + +theorem tsum_exp_neg_two_rpow_mul_pow_le_const + {A ρ₁ ρ₂ η : ℝ} (hA : 1 ≤ A) (hρ₁ : 1 < ρ₁) + (hρ₂ : 1 < ρ₂) (hη : 0 < η) : + (∑' p : ℕ × ℕ, + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η))) ≤ + Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η := by + let F : ℕ × ℕ → ℝ := fun p => + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η)) + have hF : Summable F := by + simpa [F] using + summable_exp_neg_two_rpow_mul_pow + (A := A) (ρ₁ := ρ₁) (ρ₂ := ρ₂) (η := η) hA hρ₁ hρ₂ hη + have hrow_le : + ∀ i : ℕ, (∑' j : ℕ, F (i, j)) ≤ + Real.exp (-((A * ρ₁ ^ i) ^ η)) * geometricExpKernelConst ρ₂ η := by + intro i + have hρ₁_pow : 1 ≤ ρ₁ ^ i := + one_le_pow₀ hρ₁.le + have hA_i : 1 ≤ A * ρ₁ ^ i := by + have hA_nonneg : 0 ≤ A := le_trans zero_le_one hA + have hmul := mul_le_mul hA hρ₁_pow + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + simpa using hmul + simpa [F, mul_assoc] using + tsum_exp_neg_rpow_mul_pow_le_const + (A := A * ρ₁ ^ i) (ρ := ρ₂) (η := η) hA_i hρ₂ hη + have hbase : + Summable fun i : ℕ => Real.exp (-((A * ρ₁ ^ i) ^ η)) := + summable_exp_neg_rpow_mul_pow (A := A) (ρ := ρ₁) (η := η) + hA hρ₁ hη + have hmajor : + Summable fun i : ℕ => + Real.exp (-((A * ρ₁ ^ i) ^ η)) * + geometricExpKernelConst ρ₂ η := + hbase.mul_right _ + have hrows : + Summable fun i : ℕ => ∑' j : ℕ, F (i, j) := + hF.prod + have hC₂_nonneg : 0 ≤ geometricExpKernelConst ρ₂ η := + (geometricExpKernelConst_pos hρ₂ hη).le + calc + (∑' p : ℕ × ℕ, + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η))) + = ∑' i : ℕ, ∑' j : ℕ, F (i, j) := by + simpa [F] using hF.tsum_prod + _ ≤ ∑' i : ℕ, + Real.exp (-((A * ρ₁ ^ i) ^ η)) * + geometricExpKernelConst ρ₂ η := + Summable.tsum_le_tsum hrow_le hrows hmajor + _ = (∑' i : ℕ, Real.exp (-((A * ρ₁ ^ i) ^ η))) * + geometricExpKernelConst ρ₂ η := + hbase.tsum_mul_right _ + _ ≤ (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ₁ η) * + geometricExpKernelConst ρ₂ η := + mul_le_mul_of_nonneg_right + (tsum_exp_neg_rpow_mul_pow_le_const + (A := A) (ρ := ρ₁) (η := η) hA hρ₁ hη) + hC₂_nonneg + _ = Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η := by + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteBasis.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteBasis.lean new file mode 100644 index 0000000000..aa601b7f20 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteBasis.lean @@ -0,0 +1,699 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet + +/-! # Finite Basis -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open Section54.VarianceBoundGoodScale +open scoped BigOperators + +/-! +# Finite-basis reduction for the quenched unit-vector maximum + +This file records the deterministic finite-dimensional reduction used in +Theorem `t.homogenization.quenched`: because the normalized block response is a +nonnegative quadratic form of the full-block vector, the maximum over unit +vectors is controlled by finitely many coordinate and pair probes. +-/ + +noncomputable section + +private theorem fullBlockQuadratic_add + {d : ℕ} (M N : FullBlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (M + N) q = + fullBlockQuadratic M q + fullBlockQuadratic N q := by + unfold fullBlockQuadratic + rw [Matrix.add_mulVec, dotProduct_add] + +private theorem fullBlockQuadratic_smul + {d : ℕ} (c : ℝ) (M : FullBlockMat d) (q : FullBlockVec d) : + fullBlockQuadratic (c • M) q = c * fullBlockQuadratic M q := by + unfold fullBlockQuadratic + rw [Matrix.smul_mulVec, dotProduct_smul] + simp [smul_eq_mul] + +theorem fullBlockQuadratic_vec_smul + {d : ℕ} (M : FullBlockMat d) (c : ℝ) (q : FullBlockVec d) : + fullBlockQuadratic M (c • q) = + c ^ (2 : ℕ) * fullBlockQuadratic M q := by + unfold fullBlockQuadratic + rw [Matrix.mulVec_smul, smul_dotProduct, dotProduct_smul] + simp [pow_two, smul_eq_mul, mul_assoc] + +private theorem fullBlockReflect_isSymm + {d : ℕ} {M : FullBlockMat d} (hM : M.IsSymm) : + (Ch04.fullBlockReflect M).IsSymm := by + rw [Matrix.IsSymm] + ext α β + cases α <;> cases β + all_goals + simp [Ch04.fullBlockReflect, toFullBlockMat, ofFullBlockMat, blockReflect, + Matrix.transpose_apply] + try + exact hM.apply _ _ + try + exact (hM.apply _ _).symm + +/-- The full-block matrix whose quadratic form is +`J(Q,\overline A^{-1/2}e,\overline A^{1/2}e)`. -/ +noncomputable def limitNormalizedBlockJMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) (a : RegCoeffField d) : FullBlockMat d := + let M : FullBlockMat d := toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) + let S : FullBlockMat d := scalarLimitInvSqrtMatrix hP hStruct + let T : FullBlockMat d := scalarLimitSqrtMatrix hP hStruct + (1 / 2 : ℝ) • (S * M * S) + + (1 / 2 : ℝ) • (T * Ch04.fullBlockReflect M * T) - + (1 : FullBlockMat d) + +theorem limitNormalizedBlockJMatrix_isSymm_of_isSymmetricBlockMat + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {Q : TriadicCube d} {a : RegCoeffField d} + (hA : IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) : + (limitNormalizedBlockJMatrix hP hStruct Q a).IsSymm := by + let M : FullBlockMat d := toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) + let S : FullBlockMat d := scalarLimitInvSqrtMatrix hP hStruct + let T : FullBlockMat d := scalarLimitSqrtMatrix hP hStruct + have hM : M.IsSymm := by + simpa [M] using isSymm_toFullBlockMat_of_isSymmetricBlockMat hA + have hSM : (S * M * S).IsSymm := by + simpa [S, scalarLimitInvSqrtMatrix] using + isSymm_diagonal_mul_fullBlockMat_mul_diagonal + (Ch04.scalarFullBlockInvSqrtDiag + (d := d) (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + hM + have hTM : (T * Ch04.fullBlockReflect M * T).IsSymm := by + simpa [T, scalarLimitSqrtMatrix] using + isSymm_diagonal_mul_fullBlockMat_mul_diagonal + (Section56.scalarFullBlockSqrtDiag + (d := d) (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + (fullBlockReflect_isSymm hM) + simpa [limitNormalizedBlockJMatrix, M, S, T] using + ((hSM.smul (1 / 2 : ℝ)).add (hTM.smul (1 / 2 : ℝ))).sub Matrix.isSymm_one + +theorem limitNormalizedBlockJMatrix_isSymm_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) : + ∀ᵐ a ∂P, (limitNormalizedBlockJMatrix hP hStruct Q a).IsSymm := by + filter_upwards + [isSymmetricBlockMat_coarseBlockMatrix_cubeSet_ae hP Q] with a hA + exact limitNormalizedBlockJMatrix_isSymm_of_isSymmetricBlockMat + hP hStruct hA + +theorem limitNormalizedBlockJMatrix_quadratic_eq_blockJQuadratic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (e : FullBlockVec d) (a : RegCoeffField d) : + fullBlockQuadratic (limitNormalizedBlockJMatrix hP hStruct Q a) e = + Ch04.blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) := by + let M : FullBlockMat d := toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) + let A : BlockMat d := coarseBlockMatrix (cubeSet Q) a.toFun + let S : FullBlockMat d := scalarLimitInvSqrtMatrix hP hStruct + let T : FullBlockMat d := scalarLimitSqrtMatrix hP hStruct + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hP hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hP hStruct e + have hfirst : + fullBlockQuadratic (S * M * S) e = + Ch04.fullBlockQuadraticCh04 M (toFullBlockVec Pvec) := by + have hdiag := + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Ch04.scalarFullBlockInvSqrtDiag + (d := d) (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + A e + have hch4 := + (Ch04.fullBlockQuadraticCh04_toFullBlockMat A Pvec).symm + calc + fullBlockQuadratic (S * M * S) e = + blockVecDot Pvec (blockMatVecMul A Pvec) := by + simpa [S, M, A, Pvec, scalarLimitInvSqrtMatrix, + scalarLimitInvSqrtBlockVec] using hdiag + _ = Ch04.fullBlockQuadraticCh04 M (toFullBlockVec Pvec) := by + simpa [M, A] using hch4 + have hsecond : + fullBlockQuadratic (T * Ch04.fullBlockReflect M * T) e = + Ch04.fullBlockQuadraticCh04 (Ch04.fullBlockReflect M) + (toFullBlockVec Qvec) := by + let Aref : BlockMat d := blockReflect (ofFullBlockMat M) + have href : Ch04.fullBlockReflect M = toFullBlockMat Aref := by + simp [Aref, Ch04.fullBlockReflect] + have hdiag := + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Section56.scalarFullBlockSqrtDiag + (d := d) (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + Aref e + have hch4 := + (Ch04.fullBlockQuadraticCh04_toFullBlockMat Aref Qvec).symm + calc + fullBlockQuadratic (T * Ch04.fullBlockReflect M * T) e = + fullBlockQuadratic (T * toFullBlockMat Aref * T) e := by + rw [href] + _ = blockVecDot Qvec (blockMatVecMul Aref Qvec) := by + simpa [T, Aref, Qvec, scalarLimitSqrtMatrix, + scalarLimitSqrtBlockVec] using hdiag + _ = + Ch04.fullBlockQuadraticCh04 (Ch04.fullBlockReflect M) + (toFullBlockVec Qvec) := by + simpa [href] using hch4 + have hpair : + blockVecDot Pvec Qvec = dotProduct e e := by + simpa [Pvec, Qvec] using hΓ.scalarLimit_normalizers_pairing_eq_dotProduct e + calc + fullBlockQuadratic (limitNormalizedBlockJMatrix hP hStruct Q a) e = + (1 / 2 : ℝ) * fullBlockQuadratic (S * M * S) e + + (1 / 2 : ℝ) * + fullBlockQuadratic (T * Ch04.fullBlockReflect M * T) e - + dotProduct e e := by + simp [limitNormalizedBlockJMatrix, M, S, T, + fullBlockQuadratic_add, fullBlockQuadratic_smul, + fullBlockQuadratic_sub, fullBlockQuadratic_one] + _ = + Ch04.blockJQuadraticFullBlockMat M Pvec Qvec := by + simp [Ch04.blockJQuadraticFullBlockMat, hfirst, hsecond, hpair] + _ = + Ch04.blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) := by + rfl + +theorem limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (e : FullBlockVec d) : + limitNormalizedBlockJObservable hP hStruct Q e =ᵐ[P] + fun a : RegCoeffField d => + fullBlockQuadratic (limitNormalizedBlockJMatrix hP hStruct Q a) e := by + have hJ : + limitNormalizedBlockJObservable hP hStruct Q e =ᵐ[P] + fun a : RegCoeffField d => + Ch04.blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_ae_eq_blockJQuadraticFullBlockMat + hP Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + filter_upwards [hJ] with a hJ_a + rw [hJ_a] + exact (limitNormalizedBlockJMatrix_quadratic_eq_blockJQuadratic + hP hStruct hΓ Q e a).symm + +theorem limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (e : FullBlockVec d) : + limitNormalizedBlockJObservable hP hStruct Q e a = + fullBlockQuadratic (limitNormalizedBlockJMatrix hP hStruct Q a) e := by + calc + limitNormalizedBlockJObservable hP hStruct Q e a = + Ch04.blockJQuadraticFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun)) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_eq_blockJQuadraticFullBlockMat_of_aelocallyUniformlyEllipticField + ha Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + _ = + fullBlockQuadratic (limitNormalizedBlockJMatrix hP hStruct Q a) e := + (limitNormalizedBlockJMatrix_quadratic_eq_blockJQuadratic + hP hStruct hΓ Q e a).symm + +theorem limitNormalizedBlockJObservable_smul_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (c : ℝ) (e : FullBlockVec d) : + limitNormalizedBlockJObservable hP hStruct Q (c • e) =ᵐ[P] + fun a : RegCoeffField d => + c ^ (2 : ℕ) * limitNormalizedBlockJObservable hP hStruct Q e a := by + have hEq_ce := + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q (c • e) + have hEq_e := + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q e + filter_upwards [hEq_ce, hEq_e] with a hce he + rw [hce, he] + exact fullBlockQuadratic_vec_smul + (limitNormalizedBlockJMatrix hP hStruct Q a) c e + +/-- Finite coordinate and pair probes for the limiting-normalized `J` +quadratic on one cube. -/ +noncomputable def limitNormalizedJProbeSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) : RegCoeffField d → ℝ := + fun a => + ∑ α : BlockCoord d, ∑ β : BlockCoord d, + (limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a + + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a + + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a) + +/-- The normalized finite probe sum: coordinate probes are unchanged, while +plus/minus pair probes are scaled by `1/2` so their Euclidean square norm is at +most one. -/ +noncomputable def limitNormalizedJNormalizedProbeSum + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) : RegCoeffField d → ℝ := + fun a => + ∑ α : BlockCoord d, ∑ β : BlockCoord d, + (limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a + + limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a + + limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a) + +private theorem limitNormalizedBlockJObservable_probe_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) (e : FullBlockVec d) (a : RegCoeffField d) : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q e a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) a + +/-- Pointwise finite-basis control for a sampled coefficient field carrying an +a.e.-ellipticity witness. This is the simultaneous version needed when the +unit-vector supremum is packaged into a Chapter 2 scale response. -/ +theorem limitNormalizedBlockJObservable_le_probeSum_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) (e : FullBlockVec d) + (he : dotProduct e e ≤ 1) : + limitNormalizedBlockJObservable hP hStruct Q e a ≤ + (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct Q a := by + classical + let card : ℝ := (Fintype.card (BlockCoord d) : ℝ) + let K : RegCoeffField d → FullBlockMat d := + fun a => limitNormalizedBlockJMatrix hP hStruct Q a + let M : FullBlockMat d := K a + have hA : + IsSymmetricBlockMat (coarseBlockMatrix (cubeSet Q) a.toFun) := by + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hcoarse : + coarseBlockMatrix (cubeSet Q) a.toFun = + Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa [F] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + (a := a) ha Q + rw [hcoarse] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hKsymm : M.IsSymm := by + simpa [M, K] using + limitNormalizedBlockJMatrix_isSymm_of_isSymmetricBlockMat + hP hStruct hA + have hEqe : + limitNormalizedBlockJObservable hP hStruct Q e a = + fullBlockQuadratic M e := by + simpa [M, K] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q e + have hcoord : + ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a = + fullBlockQuadratic M (fullBlockCoordinateProbe α) := by + intro α _hα + simpa [M, K] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q (fullBlockCoordinateProbe α) + have hplus : + ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + fullBlockQuadratic M (fullBlockPlusProbe α β) := by + intro α _hα β _hβ + simpa [M, K] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q (fullBlockPlusProbe α β) + have hminus : + ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + fullBlockQuadratic M (fullBlockMinusProbe α β) := by + intro α _hα β _hβ + simpa [M, K] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q (fullBlockMinusProbe α β) + have hquad_abs : + |fullBlockQuadratic M e| ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := by + have hsq := + fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq M e + have hdot_nonneg : 0 ≤ dotProduct e e := dotProduct_self_nonneg e + have hright_nonneg : + 0 ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := mul_nonneg (norm_nonneg _) hdot_nonneg + have hsq' : + |fullBlockQuadratic M e| ^ (2 : ℕ) ≤ + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e) ^ (2 : ℕ) := by + simpa [pow_two, mul_assoc, mul_left_comm, mul_comm] using hsq + exact (sq_le_sq₀ (abs_nonneg _) hright_nonneg).1 hsq' + have hop : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ≤ + card * fullBlockProbeAbsSum M := by + simpa [M, card] using fullBlock_operatorNorm_le_probeAbsSum hKsymm + have hprobe_nonneg : 0 ≤ fullBlockProbeAbsSum M := + fullBlockProbeAbsSum_nonneg M + have hcard_nonneg : 0 ≤ card := by + dsimp [card] + positivity + have hprobe_eq : + fullBlockProbeAbsSum M = + limitNormalizedJProbeSum hP hStruct Q a := by + unfold fullBlockProbeAbsSum limitNormalizedJProbeSum + refine Finset.sum_congr rfl ?_ + intro α _hα + refine Finset.sum_congr rfl ?_ + intro β _hβ + have hcoord_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockCoordinateProbe α) a + have hplus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockPlusProbe α β) a + have hminus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockMinusProbe α β) a + rw [← hcoord α (Finset.mem_univ α), + ← hplus α (Finset.mem_univ α) β (Finset.mem_univ β), + ← hminus α (Finset.mem_univ α) β (Finset.mem_univ β)] + simp [abs_of_nonneg hcoord_nonneg, abs_of_nonneg hplus_nonneg, + abs_of_nonneg hminus_nonneg] + calc + limitNormalizedBlockJObservable hP hStruct Q e a = + fullBlockQuadratic M e := hEqe + _ ≤ |fullBlockQuadratic M e| := le_abs_self _ + _ ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := hquad_abs + _ ≤ (card * fullBlockProbeAbsSum M) * dotProduct e e := + mul_le_mul_of_nonneg_right hop (dotProduct_self_nonneg e) + _ ≤ (card * fullBlockProbeAbsSum M) * 1 := by + exact mul_le_mul_of_nonneg_left he + (mul_nonneg hcard_nonneg hprobe_nonneg) + _ = card * limitNormalizedJProbeSum hP hStruct Q a := by + rw [hprobe_eq] + ring + +theorem limitNormalizedJProbeSum_le_four_normalizedProbeSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) : + (limitNormalizedJProbeSum hP hStruct Q) ≤ᵐ[P] + fun a : RegCoeffField d => + 4 * limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + classical + have hPlus : + ∀ᵐ a ∂P, ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := by + rw [Filter.eventually_all_finset] + intro α _hα + rw [Filter.eventually_all_finset] + intro β _hβ + have h := + limitNormalizedBlockJObservable_smul_ae hP hStruct hΓ Q + (2 : ℝ) ((1 / 2 : ℝ) • fullBlockPlusProbe α β) + filter_upwards [h] with a ha + calc + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + 2 * 2 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := by + simpa [smul_smul, pow_two] using ha + _ = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := by + ring + have hMinus : + ∀ᵐ a ∂P, ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := by + rw [Filter.eventually_all_finset] + intro α _hα + rw [Filter.eventually_all_finset] + intro β _hβ + have h := + limitNormalizedBlockJObservable_smul_ae hP hStruct hΓ Q + (2 : ℝ) ((1 / 2 : ℝ) • fullBlockMinusProbe α β) + filter_upwards [h] with a ha + calc + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + 2 * 2 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := by + simpa [smul_smul, pow_two] using ha + _ = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := by + ring + filter_upwards [hPlus, hMinus] with a hplus hminus + unfold limitNormalizedJProbeSum limitNormalizedJNormalizedProbeSum + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro α _hα + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro β _hβ + rw [hplus α (Finset.mem_univ α) β (Finset.mem_univ β), + hminus α (Finset.mem_univ α) β (Finset.mem_univ β)] + have hcoord_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockCoordinateProbe α) a + have hplus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a + have hminus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a + nlinarith + +theorem limitNormalizedBlockJObservable_le_probeSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (e : FullBlockVec d) + (he : dotProduct e e ≤ 1) : + (limitNormalizedBlockJObservable hP hStruct Q e) ≤ᵐ[P] + fun a : RegCoeffField d => + (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct Q a := by + classical + let card : ℝ := (Fintype.card (BlockCoord d) : ℝ) + let K : RegCoeffField d → FullBlockMat d := + fun a => limitNormalizedBlockJMatrix hP hStruct Q a + have hEq_e : + limitNormalizedBlockJObservable hP hStruct Q e =ᵐ[P] + fun a : RegCoeffField d => fullBlockQuadratic (K a) e := by + simpa [K] using + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q e + have hEq_coord : + ∀ᵐ a ∂P, ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a = + fullBlockQuadratic (K a) (fullBlockCoordinateProbe α) := by + rw [Filter.eventually_all_finset] + intro α _hα + simpa [K] using! + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q (fullBlockCoordinateProbe α) + have hEq_plus : + ∀ᵐ a ∂P, ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + fullBlockQuadratic (K a) (fullBlockPlusProbe α β) := by + rw [Filter.eventually_all_finset] + intro α _hα + rw [Filter.eventually_all_finset] + intro β _hβ + simpa [K] using! + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q (fullBlockPlusProbe α β) + have hEq_minus : + ∀ᵐ a ∂P, ∀ α ∈ (Finset.univ : Finset (BlockCoord d)), + ∀ β ∈ (Finset.univ : Finset (BlockCoord d)), + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + fullBlockQuadratic (K a) (fullBlockMinusProbe α β) := by + rw [Filter.eventually_all_finset] + intro α _hα + rw [Filter.eventually_all_finset] + intro β _hβ + simpa [K] using! + limitNormalizedBlockJObservable_ae_eq_limitNormalizedBlockJMatrix_quadratic + hP hStruct hΓ Q (fullBlockMinusProbe α β) + filter_upwards + [hEq_e, limitNormalizedBlockJMatrix_isSymm_ae hP hStruct Q, + hEq_coord, hEq_plus, hEq_minus] with + a hEqe hKsymm hcoord hplus hminus + let M : FullBlockMat d := K a + have hquad_abs : + |fullBlockQuadratic M e| ≤ + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := by + have hsq := + fullBlockQuadratic_abs_sq_le_operatorNorm_sq_mul_dotProduct_sq M e + have hdot_nonneg : 0 ≤ dotProduct e e := dotProduct_self_nonneg e + have hright_nonneg : + 0 ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := mul_nonneg (norm_nonneg _) hdot_nonneg + have hsq' : + |fullBlockQuadratic M e| ^ (2 : ℕ) ≤ + (‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e) ^ (2 : ℕ) := by + simpa [pow_two, mul_assoc, mul_left_comm, mul_comm] using hsq + exact (sq_le_sq₀ (abs_nonneg _) hright_nonneg).1 hsq' + have hop : + ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ ≤ + card * fullBlockProbeAbsSum M := by + simpa [M, card] using fullBlock_operatorNorm_le_probeAbsSum hKsymm + have hprobe_nonneg : 0 ≤ fullBlockProbeAbsSum M := + fullBlockProbeAbsSum_nonneg M + have hcard_nonneg : 0 ≤ card := by + dsimp [card] + positivity + have hprobe_eq : + fullBlockProbeAbsSum M = + limitNormalizedJProbeSum hP hStruct Q a := by + unfold fullBlockProbeAbsSum limitNormalizedJProbeSum + refine Finset.sum_congr rfl ?_ + intro α _hα + refine Finset.sum_congr rfl ?_ + intro β _hβ + have hcoord_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockCoordinateProbe α) a + have hplus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockPlusProbe α β) a + have hminus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a := + limitNormalizedBlockJObservable_probe_nonneg hP hStruct Q + (fullBlockMinusProbe α β) a + rw [← hcoord α (Finset.mem_univ α), + ← hplus α (Finset.mem_univ α) β (Finset.mem_univ β), + ← hminus α (Finset.mem_univ α) β (Finset.mem_univ β)] + simp [abs_of_nonneg hcoord_nonneg, abs_of_nonneg hplus_nonneg, + abs_of_nonneg hminus_nonneg] + calc + limitNormalizedBlockJObservable hP hStruct Q e a = + fullBlockQuadratic M e := by + simpa [M] using hEqe + _ ≤ |fullBlockQuadratic M e| := le_abs_self _ + _ ≤ ‖Matrix.toEuclideanCLM (n := BlockCoord d) (𝕜 := ℝ) M‖ * + dotProduct e e := hquad_abs + _ ≤ (card * fullBlockProbeAbsSum M) * dotProduct e e := + mul_le_mul_of_nonneg_right hop (dotProduct_self_nonneg e) + _ ≤ (card * fullBlockProbeAbsSum M) * 1 := by + exact mul_le_mul_of_nonneg_left he + (mul_nonneg hcard_nonneg hprobe_nonneg) + _ = card * limitNormalizedJProbeSum hP hStruct Q a := by + rw [hprobe_eq] + ring + +theorem limitNormalizedBlockJObservable_le_normalizedProbeSum_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (e : FullBlockVec d) + (he : dotProduct e e ≤ 1) : + (limitNormalizedBlockJObservable hP hStruct Q e) ≤ᵐ[P] + fun a : RegCoeffField d => + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + have hle := + limitNormalizedBlockJObservable_le_probeSum_ae hP hStruct hΓ Q e he + have hprobe := + limitNormalizedJProbeSum_le_four_normalizedProbeSum_ae hP hStruct hΓ Q + filter_upwards [hle, hprobe] with a hle_a hprobe_a + have hcard_nonneg : 0 ≤ (Fintype.card (BlockCoord d) : ℝ) := by + positivity + calc + limitNormalizedBlockJObservable hP hStruct Q e a + ≤ (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct Q a := hle_a + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + (4 * limitNormalizedJNormalizedProbeSum hP hStruct Q a) := by + exact mul_le_mul_of_nonneg_left hprobe_a hcard_nonneg + _ = + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteSupTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteSupTail.lean new file mode 100644 index 0000000000..39cdf878d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FiniteSupTail.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadEventSummability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleUnion + +/-! # Finite Sup Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped BigOperators ENNReal + +/-! +# Finite supremum tail bounds without logarithmic scale inflation + +The no-loss minimal-scale proof uses finite union bounds directly at the +probability level. This avoids first packaging a finite maximum as an +`O_{\Gamma}` random variable with a logarithmic scale factor, which is the +source of the non-note-facing exponent loss in the discarded route. +-/ + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] [DecidableEq ι] + +omit [MeasurableSpace Ω] [DecidableEq ι] in +/-- A finite supremum tail is contained in the union of the individual tails. -/ +theorem finiteSupTail_subset_iUnion + {s : Finset ι} (hs : s.Nonempty) {X : ι → Ω → ℝ} {T : ℝ} : + {ω | T < s.sup' hs (fun i => X i ω)} ⊆ + ⋃ i : {i // i ∈ s}, {ω | T < X i.1 ω} := by + intro ω hω + change T < s.sup' hs (fun i => X i ω) at hω + obtain ⟨i, hi, hTi⟩ := (Finset.lt_sup'_iff hs).1 hω + exact Set.mem_iUnion.2 ⟨⟨i, hi⟩, hTi⟩ + +omit [DecidableEq ι] in +/-- Union-bound tail estimate for a finite supremum. -/ +theorem measureReal_finiteSupTail_le_sum + {μ : Measure Ω} [IsFiniteMeasure μ] + {s : Finset ι} (hs : s.Nonempty) {X : ι → Ω → ℝ} {T : ℝ} : + μ.real {ω | T < s.sup' hs (fun i => X i ω)} ≤ + ∑ i : {i // i ∈ s}, μ.real {ω | T < X i.1 ω} := by + calc + μ.real {ω | T < s.sup' hs (fun i => X i ω)} + ≤ μ.real (⋃ i : {i // i ∈ s}, {ω | T < X i.1 ω}) := + measureReal_mono (μ := μ) + (finiteSupTail_subset_iUnion (Ω := Ω) hs) + _ ≤ ∑ i : {i // i ∈ s}, μ.real {ω | T < X i.1 ω} := + measureReal_iUnion_fintype_le (μ := μ) + (f := fun i : {i // i ∈ s} => {ω | T < X i.1 ω}) + +omit [DecidableEq ι] in +/-- Common-tail version of `measureReal_finiteSupTail_le_sum`. -/ +theorem measureReal_finiteSupTail_le_card_mul + {μ : Measure Ω} [IsFiniteMeasure μ] + {s : Finset ι} (hs : s.Nonempty) {X : ι → Ω → ℝ} {T R : ℝ} + (hR : + ∀ i ∈ s, μ.real {ω | T < X i ω} ≤ R) : + μ.real {ω | T < s.sup' hs (fun i => X i ω)} ≤ + (s.card : ℝ) * R := by + calc + μ.real {ω | T < s.sup' hs (fun i => X i ω)} + ≤ ∑ i : {i // i ∈ s}, μ.real {ω | T < X i.1 ω} := + measureReal_finiteSupTail_le_sum (μ := μ) hs + _ ≤ ∑ _i : {i // i ∈ s}, R := by + exact Finset.sum_le_sum fun i _hi => hR i.1 i.2 + _ = (s.card : ℝ) * R := by + simp + +omit [DecidableEq ι] in +/-- A finite supremum of centered `Γσ` variables has a probability-level union +bound with the cardinality as a prefactor. No logarithmic scale factor is +introduced. -/ +theorem measureReal_finiteSup_sub_const_tail_le_card_mul_exp + {μ : Measure Ω} [IsFiniteMeasure μ] + {s : Finset ι} (hs : s.Nonempty) {X : ι → Ω → ℝ} + {c A lam σ : ℝ} + (hlam : 1 ≤ lam) + (hX : + ∀ i ∈ s, + IsBigOWith μ (gammaSigma σ) (fun ω => X i ω - c) A) : + μ.real {ω | c + A * lam < s.sup' hs (fun i => X i ω)} ≤ + (s.card : ℝ) * Real.exp (-(lam ^ σ)) := by + refine measureReal_finiteSupTail_le_card_mul (μ := μ) hs ?_ + intro i hi + exact + measureReal_le_exp_of_subset_upperTail_gammaSigma + (μ := μ) (σ := σ) (X := fun ω => X i ω - c) + (A := A) (s := lam) (E := {ω | c + A * lam < X i ω}) + (hX i hi) hlam + (by + intro ω hω + change c + A * lam < X i ω at hω + change A * lam < X i ω - c + linarith) + +omit [DecidableEq ι] in +/-- Symmetric-tail version of `measureReal_finiteSup_sub_const_tail_le_card_mul_exp`. +It keeps the finite maximum as a probability-level cardinality prefactor. -/ +theorem measureReal_finiteSup_tail_le_card_mul_exp_of_isBigO + {μ : Measure Ω} [IsFiniteMeasure μ] + {s : Finset ι} (hs : s.Nonempty) {X : ι → Ω → ℝ} + {A lam σ : ℝ} + (hlam : 1 ≤ lam) + (hX : + ∀ i ∈ s, + IsBigO μ (gammaSigma σ) (X i) A) : + μ.real {ω | A * lam < s.sup' hs (fun i => X i ω)} ≤ + (s.card : ℝ) * Real.exp (-(lam ^ σ)) := by + refine measureReal_finiteSupTail_le_card_mul (μ := μ) hs ?_ + intro i hi + have htail : + μ.real (absTailEvent (X i) (A * lam)) ≤ + Real.exp (-(lam ^ σ)) := by + simpa using + (Ch04.isBigO_gammaSigma_iff (μ := μ) (X := X i) (A := A) + (σ := σ)).1 (hX i hi) hlam + exact + (measureReal_mono (μ := μ) + (by + intro ω hω + change A * lam < X i ω at hω + change A * lam < |X i ω| + exact lt_of_lt_of_le hω (le_abs_self (X i ω)))).trans htail + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimate.lean new file mode 100644 index 0000000000..fd4c824dd0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimate.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedJLimit + +/-! # First Quenched Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# The concentration step for the first quenched estimate + +This file records the part of Corollary `c.first.quenched.estimate` which is +already supplied by the Chapter 4 concentration lemma: a unit-scale Γσ tail for +the chosen deterministic block vectors propagates to larger scales around the +corresponding annealed response. The remaining Section 5.7 work is to produce +that unit-scale tail and the annealed bound for the limiting normalization +`\overline A`. +-/ + +noncomputable section + +/-- Concentration plus deterministic annealed domination, in the form used by +the first quenched estimate. + +The constant is chosen before the law `Pμ`, so it is independent of the +probability measure. -/ +theorem firstQuenchedEstimate_concentrationStep + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) (hσ_le_two : σ ≤ 2) : + ∃ C : ℝ, 0 < C ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure Pμ], + Ch04.RestrictionLawCarrier Pμ → Ch04.RestrictionStationaryLaw Pμ → + Ch04.RestrictionUnitRangeDependentLaw Pμ → + ∀ (P Qv : BlockVec d) {θ : ℝ}, + 0 < θ → + IsBigO Pμ (gammaSigma σ) + (Ch04.blockJObservableCubeSetBlockVec (originCube d 0) P Qv) θ → + ∀ {n m : ℤ}, 0 ≤ n → n < m → ∀ {R : ℝ}, + (∫ b, + Ch04.blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) ≤ R → + IsBigOWith Pμ (gammaSigma σ) + (fun a => + Ch04.blockJObservableCubeSetBlockVec (originCube d m) P Qv a - R) + (C * (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) * θ) := by + obtain ⟨C, hC_pos, hC⟩ := + Ch04.concentration_of_blockJObservableCubeSetBlockVec + (d := d) hσ_pos hσ_le_two + refine ⟨C, hC_pos, ?_⟩ + intro Pμ hPμ_inst hPμ hstat hunit P Qv θ hθ_pos htail n m hn hnm R hR + let : IsProbabilityMeasure Pμ := hPμ_inst + have hfluct : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + Ch04.blockJObservableCubeSetBlockVec (originCube d m) P Qv a - + ∫ b, + Ch04.blockJObservableCubeSetBlockVec (originCube d n) P Qv b ∂Pμ) + (C * (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) * θ) := + hC hθ_pos hPμ hstat hunit P Qv htail hn hnm + exact hfluct.of_le fun a => by + linarith + +/-- First quenched concentration step for the limiting normalization +`\overline A`: the unit-cube Γσ tail from `(P5)` propagates from scale `n` to +scale `m`, centered at any deterministic upper bound for the annealed response +at scale `n`, with the concentration exponent truncated to `σ ∧ 2`. + +The constant is chosen after `d, σ` and before the law, hence is independent of +the probability measure and of the Γσ scale `thetaHat`. -/ +theorem firstQuenchedEstimate_limitNormalized_concentration + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) : + ∃ C : ℝ, 0 < C ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → + ∀ (e : FullBlockVec d), + (∀ α : BlockCoord d, |e α| ≤ 1) → + ∀ {n m : ℤ}, 0 ≤ n → n < m → ∀ {R : ℝ}, + (∫ b, + limitNormalizedBlockJObservable hPμ hStruct (originCube d n) e b ∂Pμ) ≤ R → + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + limitNormalizedBlockJObservable hPμ hStruct (originCube d m) e a - R) + (C * (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) * + (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat)) := by + have hσconc_pos : 0 < min σ 2 := by + exact lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hσconc_le_two : min σ 2 ≤ 2 := min_le_right σ 2 + obtain ⟨Cconc, hCconc_pos, hconc⟩ := + firstQuenchedEstimate_concentrationStep (d := d) + hσconc_pos hσconc_le_two + let Cdim : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let C : ℝ := Cconc * Cdim + have hcard_pos : 0 < (Fintype.card (BlockCoord d) : ℝ) := by + exact_mod_cast + (Fintype.card_pos_iff.mpr (inferInstance : Nonempty (BlockCoord d))) + have hCdim_pos : 0 < Cdim := by + dsimp [Cdim] + exact pow_pos hcard_pos 2 + refine ⟨C, mul_pos hCconc_pos hCdim_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq e he n m hn hnm R hR + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hPμ hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hPμ hStruct e + let base : ℝ := thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat + let θ : ℝ := Cdim * base + have hθ0_one : + 1 ≤ thetaAtScale hPμ hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hPμ hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hθ0_pos : 0 < thetaAtScale hPμ hStruct (0 : ℤ) := + lt_of_lt_of_le zero_lt_one hθ0_one + have hbase_pos : 0 < base := by + dsimp [base] + exact mul_pos hθ0_pos hΓ.thetaHat_pos + have hθ_pos : 0 < θ := by + dsimp [θ] + exact mul_pos hCdim_pos hbase_pos + have htail : + IsBigO Pμ (gammaSigma (min σ 2)) + (Ch04.blockJObservableCubeSetBlockVec (originCube d 0) Pvec Qvec) θ := by + have htail0 := hΓ.limitNormalizedBlockJObservable_unit_isBigO e he + have htailσ : + IsBigO Pμ (gammaSigma σ) + (Ch04.blockJObservableCubeSetBlockVec (originCube d 0) Pvec Qvec) + θ := by + simpa [limitNormalizedBlockJObservable, Pvec, Qvec, θ, Cdim, base, hσ_eq] + using htail0 + exact Ch04.IsBigO.gammaSigma_mono_exponent + (μ := Pμ) (ρ := min σ 2) (σ := σ) + (min_le_left σ 2) htailσ + have hR' : + (∫ b, + Ch04.blockJObservableCubeSetBlockVec (originCube d n) Pvec Qvec b ∂Pμ) ≤ R := by + simpa [limitNormalizedBlockJObservable, Pvec, Qvec] using hR + have hstep : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + Ch04.blockJObservableCubeSetBlockVec (originCube d m) Pvec Qvec a - R) + (Cconc * (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) * θ) := + hconc hPμ hStruct.stationary hStruct.unit_range Pvec Qvec + hθ_pos htail hn hnm hR' + let decay : ℝ := + (3 : ℝ) ^ (-(d : ℝ) / 2 * (Int.toNat (m - n) : ℝ)) + have hscale : + Cconc * decay * θ = C * decay * base := by + dsimp [C, θ] + ring + rw [hscale] at hstep + simpa [limitNormalizedBlockJObservable, Pvec, Qvec, C, base, decay] using hstep + +/-- Corollary `c.first.quenched.estimate`, in the limiting scalar +normalization used by Section 5.7, with the quenched fluctuation controlled in +the `Γ_{σ ∧ 2}` class. + +The fluctuation constant, the annealed entry constant, and the algebraic +exponent are selected before the law `Pμ`. The entry scale is the deterministic +annealed scale associated to `Centry`; after that shift, the annealed theorem +controls the deterministic centering and the Γσ concentration estimate gives +the quenched fluctuation term. -/ +theorem firstQuenchedEstimate_limitNormalized + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry α : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < α ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e a - + Real.rpow (3 : ℝ) (-α * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + obtain ⟨Cconc, hCconc_pos, hconc⟩ := + firstQuenchedEstimate_limitNormalized_concentration + (d := d) hσ_pos + let G : ℝ := Ch04.gammaMomentConst σ * (params.xi : ℝ) ^ σ⁻¹ + have hGammaConst_pos : 0 < Ch04.gammaMomentConst σ := by + simpa [Ch04.gammaMomentConst] using + IndependentSums.gammaMomentConst_pos hσ_pos + have hparams_xi_pos : 0 < (params.xi : ℝ) := by + exact_mod_cast params.xi_pos + have hG_pos : 0 < G := by + dsimp [G] + exact mul_pos hGammaConst_pos (Real.rpow_pos_of_pos hparams_xi_pos _) + obtain ⟨Centry, α, hCentry_pos, hα_pos, hannealed⟩ := + Section51.annealedConvergence_homogenizationScale params + refine ⟨Cconc * G, Centry, α, mul_pos hCconc_pos hG_pos, + hCentry_pos, hα_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm n m hnm + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + have he_coord : ∀ β : BlockCoord d, |e β| ≤ 1 := + abs_fullBlockVec_coord_le_one_of_dotProduct_le_one e he_norm + have hP4_params : + hΓ.toQuantitativeCoarseGrainedEllipticity.params = params := by + have hparams_eq : + hΓ.toQuantitativeCoarseGrainedEllipticity.params = hΓ.params := by + simp [GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos, + QuantitativeCoarseGrainedEllipticity.params] + rw [hparams_eq] + exact hparams + have htheta : + thetaAtScale hPμ hStruct ((N0 + n : ℕ) : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + have h := + hannealed hPμ hStruct + hΓ.toQuantitativeCoarseGrainedEllipticity hP4_params n + simpa [N0] using h + have hcenter : + (∫ b, + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + n : ℕ) : ℤ)) e b ∂Pμ) ≤ + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + have hJ := + hΓ.integral_limitNormalizedBlockJObservable_le_thetaAtScale_sub_one + (N0 + n) e he_norm + linarith + have hn_nonneg : 0 ≤ ((N0 + n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le (N0 + n) + have hnm_int : ((N0 + n : ℕ) : ℤ) < ((N0 + m : ℕ) : ℤ) := by + exact_mod_cast Nat.add_lt_add_left hnm N0 + let decay : ℝ := + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - ((N0 + n : ℕ) : ℤ)) : ℝ)) + have hraw : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e a - + Real.rpow (3 : ℝ) (-α * (n : ℝ))) + (Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat)) := by + simpa [N0, decay] using + hconc hPμ hStruct hΓ hσ_eq e he_coord hn_nonneg hnm_int hcenter + have htheta_le : thetaAtScale hPμ hStruct (0 : ℤ) ≤ G * hΓ.thetaHat := by + have h := hΓ.thetaAtScale_zero_le_gammaMomentScale + simpa [G, hσ_eq, hparams] using h + have hdecay_nonneg : 0 ≤ decay := by + dsimp [decay] + positivity + have hscale_le : + Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) ≤ + (Cconc * G) * decay * hΓ.thetaHat ^ (2 : ℕ) := by + have htheta_mul : + thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat ≤ + (G * hΓ.thetaHat) * hΓ.thetaHat := by + exact mul_le_mul_of_nonneg_right htheta_le hΓ.thetaHat_pos.le + calc + Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) + ≤ Cconc * decay * ((G * hΓ.thetaHat) * hΓ.thetaHat) := by + exact mul_le_mul_of_nonneg_left htheta_mul + (mul_nonneg hCconc_pos.le hdecay_nonneg) + _ = (Cconc * G) * decay * hΓ.thetaHat ^ (2 : ℕ) := by + ring + exact hraw.mono_scale hscale_le + +/-- Uniform-in-`σ` version of `firstQuenchedEstimate_limitNormalized`. + +The annealed entry constant and algebraic exponent are chosen before the +finite moment exponent `σ`. Only the fluctuation constant is selected after +`σ`, reflecting that the concentration step depends on the moment class while +the annealed algebraic rate only uses the existence of a finite moment. -/ +theorem firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - + ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + obtain ⟨Centry, a, hCentry_pos, ha_pos, hannealed⟩ := + Section51.annealedConvergence_homogenizationScale params + refine ⟨Centry, a, hCentry_pos, ha_pos, ?_⟩ + intro σ hσ_pos + obtain ⟨Cconc, hCconc_pos, hconc⟩ := + firstQuenchedEstimate_limitNormalized_concentration + (d := d) hσ_pos + let G : ℝ := Ch04.gammaMomentConst σ * (params.xi : ℝ) ^ σ⁻¹ + have hGammaConst_pos : 0 < Ch04.gammaMomentConst σ := by + simpa [Ch04.gammaMomentConst] using + IndependentSums.gammaMomentConst_pos hσ_pos + have hparams_xi_pos : 0 < (params.xi : ℝ) := by + exact_mod_cast params.xi_pos + have hG_pos : 0 < G := by + dsimp [G] + exact mul_pos hGammaConst_pos (Real.rpow_pos_of_pos hparams_xi_pos _) + refine ⟨Cconc * G, mul_pos hCconc_pos hG_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm n m hnm + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + have he_coord : ∀ β : BlockCoord d, |e β| ≤ 1 := + abs_fullBlockVec_coord_le_one_of_dotProduct_le_one e he_norm + have hP4_params : + hΓ.toQuantitativeCoarseGrainedEllipticity.params = params := by + have hparams_eq : + hΓ.toQuantitativeCoarseGrainedEllipticity.params = hΓ.params := by + simp [GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos, + QuantitativeCoarseGrainedEllipticity.params] + rw [hparams_eq] + exact hparams + have htheta : + thetaAtScale hPμ hStruct ((N0 + n : ℕ) : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-a * (n : ℝ)) := by + have h := + hannealed hPμ hStruct + hΓ.toQuantitativeCoarseGrainedEllipticity hP4_params n + simpa [N0] using h + have hcenter : + (∫ b, + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + n : ℕ) : ℤ)) e b ∂Pμ) ≤ + Real.rpow (3 : ℝ) (-a * (n : ℝ)) := by + have hJ := + hΓ.integral_limitNormalizedBlockJObservable_le_thetaAtScale_sub_one + (N0 + n) e he_norm + linarith + have hn_nonneg : 0 ≤ ((N0 + n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le (N0 + n) + have hnm_int : ((N0 + n : ℕ) : ℤ) < ((N0 + m : ℕ) : ℤ) := by + exact_mod_cast Nat.add_lt_add_left hnm N0 + let decay : ℝ := + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - ((N0 + n : ℕ) : ℤ)) : ℝ)) + have hraw : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat)) := by + simpa [N0, decay] using + hconc hPμ hStruct hΓ hσ_eq e he_coord hn_nonneg hnm_int hcenter + have htheta_le : thetaAtScale hPμ hStruct (0 : ℤ) ≤ G * hΓ.thetaHat := by + have h := hΓ.thetaAtScale_zero_le_gammaMomentScale + simpa [G, hσ_eq, hparams] using h + have hdecay_nonneg : 0 ≤ decay := by + dsimp [decay] + positivity + have hscale_le : + Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) ≤ + (Cconc * G) * decay * hΓ.thetaHat ^ (2 : ℕ) := by + have htheta_mul : + thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat ≤ + (G * hΓ.thetaHat) * hΓ.thetaHat := by + exact mul_le_mul_of_nonneg_right htheta_le hΓ.thetaHat_pos.le + calc + Cconc * decay * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) + ≤ Cconc * decay * ((G * hΓ.thetaHat) * hΓ.thetaHat) := by + exact mul_le_mul_of_nonneg_left htheta_mul + (mul_nonneg hCconc_pos.le hdecay_nonneg) + _ = (Cconc * G) * decay * hΓ.thetaHat ^ (2 : ℕ) := by + ring + exact hraw.mono_scale hscale_le + +/-- Note-facing, `xi`-free version of +`firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent`. + +The proof chooses the finite moment exponent needed by the older annealed API +internally from `sUpper` and `sLower`; the resulting constants therefore depend +only on the displayed Section 5.7 parameters. -/ +theorem firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent_noXi + {d : ℕ} [NeZero d] + (params : GammaCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticityNoXi Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.withInternalXi.toQuantitativeCoarseGrainedEllipticity Centry + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - + ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + obtain ⟨Centry, a, hCentry_pos, ha_pos, hfinite⟩ := + firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + (d := d) params.toQuantitativeParams + refine ⟨Centry, a, hCentry_pos, ha_pos, ?_⟩ + intro σ hσ + obtain ⟨Cfluct, hCfluct_pos, hfluct⟩ := hfinite hσ + refine ⟨Cfluct, hCfluct_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm n m hnm + let hΓold : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct := + hΓ.withInternalXi + have hσ_old : hΓold.sigma = σ := by + simpa [hΓold] using hσ_eq + have hparams_old : hΓold.params = params.toQuantitativeParams := by + dsimp [hΓold, GammaSigmaCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + simpa [hΓold] using + hfluct hPμ hStruct hΓold hσ_old hparams_old e he_norm hnm + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimateCompressed.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimateCompressed.lean new file mode 100644 index 0000000000..99a50280d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/FirstQuenchedEstimateCompressed.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint + +/-! # First Quenched Estimate Compressed -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# Note-facing compressed entry scale for the first quenched estimate + +The core first quenched estimate is proved with the annealed algebraic entry +scale associated to the Chapter 5 iteration. This file repackages that theorem +with the manuscript-scale entry +`ceil(C log^2(2 + thetaHat))`, using the deterministic compression lemma from +`EntryScaleCompression`. +-/ + +noncomputable section + +/-- Note-facing version of Corollary `c.first.quenched.estimate` with no +exposed internal `xi` and with the entry scale compressed to one manuscript +ceiling `ceil(C log^2(2 + thetaHat))`. + +The algebraic exponent is selected before the finite moment exponent `sigma`. +For each `sigma`, the entry-scale constant and fluctuation constant are then +selected before the law. -/ +theorem firstQuenchedEstimate_limitNormalized_logSqEntry_noXi + {d : ℕ} [NeZero d] + (params : GammaCoarseGrainedEllipticityParams d) : + ∃ a : ℝ, 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ CentryScale Cfluct : ℝ, 0 < CentryScale ∧ 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticityNoXi Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let N0 : ℕ := + Nat.ceil (CentryScale * + (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - + ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + obtain ⟨Centry, a, hCentry_pos, ha_pos, hfinite⟩ := + firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent_noXi + (d := d) params + refine ⟨a, ha_pos, ?_⟩ + intro σ hσ + obtain ⟨CentryScale, hCentryScale_pos, hscale⟩ := + exists_entryScale_le_natCeil_logSq + (d := d) hσ hCentry_pos params.toQuantitativeParams + obtain ⟨Cfluct, hCfluct_pos, hfluct⟩ := hfinite hσ + refine ⟨CentryScale, Cfluct, hCentryScale_pos, hCfluct_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm n m hnm + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let hΓold : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct := + hΓ.withInternalXi + let Nold : ℕ := + annealedAlgebraicEntryScale Pμ + hΓold.toQuantitativeCoarseGrainedEllipticity Centry + let Nnew : ℕ := + Nat.ceil (CentryScale * + (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) + let Δ : ℕ := Nnew - Nold + have hσ_old : hΓold.sigma = σ := by + simpa [hΓold] using hσ_eq + have hparams_old : + hΓold.params = params.toQuantitativeParams := by + dsimp [hΓold, GammaSigmaCoarseGrainedEllipticityNoXi.withInternalXi] + rw [hparams] + have hNold_le_new : Nold ≤ Nnew := by + simpa [Nold, Nnew, hΓold] using + hscale hPμ hStruct hΓold hσ_old hparams_old + have hNold_add_delta : Nold + Δ = Nnew := + Nat.add_sub_of_le hNold_le_new + have hNm : Nold + (Δ + m) = Nnew + m := by + omega + have hNn : Nold + (Δ + n) = Nnew + n := by + omega + have hNm_comm : m + (Nold + Δ) = m + Nnew := by + omega + have hNn_comm : n + (Nold + Δ) = n + Nnew := by + omega + have hmn_shift : Δ + n < Δ + m := + Nat.add_lt_add_left hnm Δ + have hold := + hfluct hPμ hStruct hΓ hσ_eq hparams e he_norm + (n := Δ + n) (m := Δ + m) hmn_shift + have hold' : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((m + Nnew : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * ((Δ + n : ℕ) : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((m + Nnew : ℕ) : ℤ) - + ((n + Nnew : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + simpa [hΓold, Nold, Nnew, Δ, hNold_add_delta, hNm, hNn, hNm_comm, + hNn_comm, Nat.add_assoc, Nat.add_comm, Nat.add_left_comm] using hold + have hn_le_shift : (n : ℝ) ≤ ((Δ + n : ℕ) : ℝ) := by + have hn_nat : n ≤ Δ + n := by omega + exact_mod_cast hn_nat + have hcenter_le : + Real.rpow (3 : ℝ) (-a * ((Δ + n : ℕ) : ℝ)) ≤ + Real.rpow (3 : ℝ) (-a * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hmul : + a * (n : ℝ) ≤ a * ((Δ + n : ℕ) : ℝ) := + mul_le_mul_of_nonneg_left hn_le_shift ha_pos.le + nlinarith + have htarget : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((m + Nnew : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((m + Nnew : ℕ) : ℤ) - + ((n + Nnew : ℕ) : ℤ)) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + refine hold'.of_le ?_ + intro aω + dsimp + exact sub_le_sub_left hcenter_le _ + simpa [Nnew, Nat.add_assoc, Nat.add_comm, Nat.add_left_comm] using htarget + +/-- Endpoint (`sigma = infinity`) version of +`firstQuenchedEstimate_limitNormalized_logSqEntry_noXi`. + +The endpoint assumption is converted internally to the finite statement at +`sigma = 2`, so the displayed tail class is `Gamma_2`. -/ +theorem firstQuenchedEstimate_limitNormalized_logSqEntry_noXi_infinity + {d : ℕ} [NeZero d] + (params : GammaCoarseGrainedEllipticityParams d) : + ∃ a : ℝ, 0 < a ∧ + ∃ CentryScale Cfluct : ℝ, 0 < CentryScale ∧ 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hInf : GammaInfinityCoarseGrainedEllipticityNoXi Pμ hPμ hStruct), + hInf.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let N0 : ℕ := + Nat.ceil (CentryScale * + (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ)) + IsBigOWith Pμ (gammaSigma 2) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - + ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hInf.thetaHat ^ (2 : ℕ)) := by + obtain ⟨a, ha, hfinite⟩ := + firstQuenchedEstimate_limitNormalized_logSqEntry_noXi + (d := d) params + obtain ⟨CentryScale, Cfluct, hCentryScale, hCfluct, hfluct⟩ := + hfinite (σ := (2 : ℝ)) (by norm_num : (0 : ℝ) < 2) + refine ⟨a, ha, CentryScale, Cfluct, hCentryScale, hCfluct, ?_⟩ + intro Pμ hPμ hStruct hInf hparams e he_norm n m hnm + let hΓ2 : GammaSigmaCoarseGrainedEllipticityNoXi Pμ hPμ hStruct := + hInf.toGammaSigmaNoXi 2 (by norm_num : (0 : ℝ) < 2) + have hσ2 : hΓ2.sigma = (2 : ℝ) := rfl + have hparams2 : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticityNoXi.toGammaSigmaNoXi] + using hparams + have h := + hfluct hPμ hStruct hΓ2 hσ2 hparams2 e he_norm hnm + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticityNoXi.toGammaSigmaNoXi] + using h + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssembly.lean new file mode 100644 index 0000000000..c4b8956a7b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssembly.lean @@ -0,0 +1,870 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EllipticityFromMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.HomogenizationBlackBoxes + +/-! # Homogenization Assembly -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder + +/-! +# First assembly tools for the public quenched homogenization theorem + +This file begins Phase 4 of the public theorem plan. The first result upgrades +the parent-cube finite-`q` homogenization-error estimate to the Ch3 +depth-localized quantity `coarseGrainingHomogenizationErrorAtDepth`. +-/ + +noncomputable section + +/-- The scalar constant-coefficient package used by the Ch3 deterministic +homogenization theorem. -/ +def scalarConstantCoeffMatrix {d : ℕ} (σ : ℝ) (hσ : 0 < σ) : + Ch03.ConstantCoeffMatrix d where + matrix := scalarMatrix (d := d) σ + isSymm := scalarMatrix_isSymm σ + lam := σ + Lam := σ + lam_pos := hσ + lam_le_Lam := le_rfl + elliptic := isEllipticMatrix_scalarMatrix hσ + +theorem scalarConstantCoeffMatrix_matrix + {d : ℕ} {σ : ℝ} (hσ : 0 < σ) : + (scalarConstantCoeffMatrix (d := d) σ hσ).matrix = + scalarMatrix (d := d) σ := rfl + +theorem scalarConstantCoeffMatrix_isPositiveScalarMatrix + {d : ℕ} {σ : ℝ} (hσ : 0 < σ) : + IsPositiveScalarMatrix + (scalarConstantCoeffMatrix (d := d) σ hσ).matrix := by + exact ⟨σ, hσ, rfl⟩ + +theorem sqrt_rpow_neg_div_mono_of_le + {A X Y α : ℝ} (hA : 0 < A) (hX : 0 < X) (hY : 0 < Y) + (hXY : X ≤ Y) (hα : 0 < α) : + Real.sqrt ((A / X) ^ (-α)) ≤ Real.sqrt ((A / Y) ^ (-α)) := by + exact Real.sqrt_le_sqrt + (rpow_neg_div_mono_of_le hA hX hY hXY hα) + +/-- Combine two already-collapsed random scales without making the stochastic +prefactor depend on the law. -/ +theorem isBigO_gammaSigma_max_two_expLogSq + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsFiniteMeasure μ] + {η C₁ C₂ θ : ℝ} (hη : 0 < η) (hθ : 0 < θ) + {X₁ X₂ : Ω → ℝ} + (hX₁ : IsBigO μ (gammaSigma η) X₁ + (Real.exp (C₁ * (Real.log (2 + θ)) ^ (2 : ℕ)))) + (hX₂ : IsBigO μ (gammaSigma η) X₂ + (Real.exp (C₂ * (Real.log (2 + θ)) ^ (2 : ℕ)))) : + let C : ℝ := + 4 * max 0 (Real.log ((3 * Real.log (2 : ℝ)) ^ η⁻¹)) + max C₁ C₂ + IsBigO μ (gammaSigma η) (fun ω => max (X₁ ω) (X₂ ω)) + (Real.exp (C * (Real.log (2 + θ)) ^ (2 : ℕ))) := by + dsimp only + let Ksup : ℝ := (3 * Real.log (2 : ℝ)) ^ η⁻¹ + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + let Ck : ℝ := 4 * max 0 (Real.log Ksup) + let A₁ : ℝ := Real.exp (C₁ * L2) + let A₂ : ℝ := Real.exp (C₂ * L2) + have hKsup_pos : 0 < Ksup := by + dsimp [Ksup] + exact Real.rpow_pos_of_pos + (mul_pos (by norm_num : (0 : ℝ) < 3) + (Real.log_pos (by norm_num : (1 : ℝ) < 2))) _ + have hraw : + IsBigO μ (gammaSigma η) (fun ω => max (X₁ ω) (X₂ ω)) + (Ksup * max A₁ A₂) := by + simpa [Ksup, A₁, A₂, L2] using + isBigO_gammaSigma_max_two_of_scales + (μ := μ) (η := η) (AJ := A₁) (AU := A₂) + hη hX₁ hX₂ + have hscale : + Ksup * max A₁ A₂ ≤ + Real.exp ((Ck + max C₁ C₂) * L2) := by + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hA₁_le : A₁ ≤ Real.exp ((max C₁ C₂) * L2) := by + refine Real.exp_le_exp.mpr ?_ + exact mul_le_mul_of_nonneg_right (le_max_left C₁ C₂) hL2_nonneg + have hA₂_le : A₂ ≤ Real.exp ((max C₁ C₂) * L2) := by + refine Real.exp_le_exp.mpr ?_ + exact mul_le_mul_of_nonneg_right (le_max_right C₁ C₂) hL2_nonneg + have hmax_le : max A₁ A₂ ≤ Real.exp ((max C₁ C₂) * L2) := + max_le hA₁_le hA₂_le + have hK_le : Ksup ≤ Real.exp (Ck * L2) := by + have hrawK := + const_mul_rpow_max_one_le_exp_logSq + (A := Ksup) (θ := θ) (p := (0 : ℝ)) + hKsup_pos hθ.le (by norm_num) + simpa [Ksup, Ck, L2] using hrawK + calc + Ksup * max A₁ A₂ + ≤ Ksup * Real.exp ((max C₁ C₂) * L2) := + mul_le_mul_of_nonneg_left hmax_le hKsup_pos.le + _ ≤ Real.exp (Ck * L2) * Real.exp ((max C₁ C₂) * L2) := + mul_le_mul_of_nonneg_right hK_le (Real.exp_pos _).le + _ = Real.exp ((Ck + max C₁ C₂) * L2) := by + rw [← Real.exp_add] + ring_nf + exact IsBigO.mono_scale (μ := μ) (Ψ := gammaSigma η) hraw hscale + +/-- A depth-`j` Ch3 homogenization-error envelope is controlled by the parent +cube's Ch2 `q = 1` homogenization error with the expected geometric depth +weight. -/ +theorem coarseGrainingHomogenizationErrorAtDepth_le_depthWeight_mul_parent + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.TriadicCoeffFamily d) + (a0 : Ch03.ConstantCoeffMatrix d) {s : ℝ} (hs : 0 < s) (j : ℕ) : + Ch03.coarseGrainingHomogenizationErrorAtDepth Q a a0 s j ≤ + Ch03.coarseGrainingDepthWeight s j * + Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity (.finite 1) a a0.matrix := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + refine Ch02.finsetSupReal_le D hD ?_ + intro R hR + have hRdepth : R ∈ descendantsAtDepth Q j := by + simpa [D] using hR + let k : ℤ := Q.scale - (j : ℤ) + have hRscale : R ∈ descendantsAtScale Q k := by + simpa [k] using + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hRdepth + have hfactor : + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) = + Ch03.coarseGrainingDepthWeight s j := by + have htoNat : Int.toNat (Q.scale - k) = j := by + dsimp [k] + have hsub : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by ring + rw [hsub, Int.toNat_natCast] + simp [Ch03.coarseGrainingDepthWeight, htoNat] + have h := + Ch02.homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a a0.matrix hs hRscale + calc + Ch02.HomogenizationErrorOnCube R s Ch02.MultiscaleExponent.infinity + (.finite 1) a a0.matrix + ≤ Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity (.finite 1) a a0.matrix := + h + _ = Ch03.coarseGrainingDepthWeight s j * + Ch02.HomogenizationErrorOnCube Q s + Ch02.MultiscaleExponent.infinity (.finite 1) a a0.matrix := by + rw [hfactor] + +/-- Finite-`sigma` control of the Ch3 depth-localized homogenization-error +quantity above the same collapsed minimal-scale envelope. -/ +theorem exists_coarseGrainingHomogenizationErrorAtDepth_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + ∀ {σ τ r : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 ≤ r → + 0 < r - τ / 2 → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField + aω ha; + let σ0 : ℝ := barSigmaLimit hP hStruct; + let hσ0 : 0 < σ0 := hΓ.barSigmaLimit_pos; + let a0 : Ch03.ConstantCoeffMatrix d := + scalarConstantCoeffMatrix σ0 hσ0; + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount r 1 * + (Ch02.geometricDiscount (r - τ / 2) 1)⁻¹) + (1 / (1 : ℝ)); + Ch03.coarseGrainingHomogenizationErrorAtDepth + (originCube d ((m : ℕ) : ℤ)) F a0 r j ≤ + Ch03.coarseGrainingDepthWeight r j * + (G * A * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α))) := by + obtain ⟨α, hα_pos, _hαmax, hEbase⟩ := + exists_homogenizationErrorOnOriginCube_interpolated_expLogSq + (d := d) params + refine ⟨α, hα_pos, ?_⟩ + intro σ τ r hσ_pos hτ_half hατ_half hτ_le_one hr_nonneg hδ_pos + dsimp only + have hrq : 0 ≤ r * (1 : ℝ) := by simpa using hr_nonneg + have hδq : 0 < (r - τ / 2) * (1 : ℝ) := by simpa using hδ_pos + obtain ⟨Cscale, hCscale_pos, hlaw⟩ := + hEbase (σ := σ) (τ := τ) (r := r) (q := 1) + hσ_pos hτ_half hατ_half hτ_le_one hrq hδq + (by norm_num : (0 : ℝ) < 1) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + obtain ⟨X, hXbigO, hXone, hEae⟩ := + hlaw hP hStruct hΓ hσ_eq hparams + refine ⟨X, hXbigO, hXone, ?_⟩ + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hr_pos : 0 < r := by nlinarith + filter_upwards [hEae] with aω hEpoint + intro ha m j hXm + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + let σ0 : ℝ := barSigmaLimit hP hStruct + let hσ0 : 0 < σ0 := hΓ.barSigmaLimit_pos + let a0 : Ch03.ConstantCoeffMatrix d := scalarConstantCoeffMatrix σ0 hσ0 + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) + let G : ℝ := + Real.rpow + (Ch02.geometricDiscount r 1 * + (Ch02.geometricDiscount (r - τ / 2) 1)⁻¹) + (1 / (1 : ℝ)) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + have hparent : + Ch02.HomogenizationErrorOnCube Q r Ch02.MultiscaleExponent.infinity + (.finite 1) F a0.matrix ≤ G * A * R := by + simpa [Q, F, σ0, hσ0, a0, Cresp, Cneg, A, G, R, + scalarConstantCoeffMatrix_matrix] using + hEpoint ha (m := m) hXm + have hdepth := + coarseGrainingHomogenizationErrorAtDepth_le_depthWeight_mul_parent + (Q := Q) (a := F) (a0 := a0) (s := r) hr_pos j + have hweight_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r j := by + dsimp [Ch03.coarseGrainingDepthWeight] + positivity + calc + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j + ≤ Ch03.coarseGrainingDepthWeight r j * + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix := + hdepth + _ ≤ Ch03.coarseGrainingDepthWeight r j * (G * A * R) := + mul_le_mul_of_nonneg_left hparent hweight_nonneg + +/-- The random coefficient family attached to an a.e. uniformly elliptic +coefficient field. -/ +abbrev assemblyCoeffFamily {d : ℕ} (aω : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField aω) : + Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + +abbrev assemblyOriginCube (d : ℕ) (m : ℕ) : TriadicCube d := + originCube d ((m : ℕ) : ℤ) + +/-- The scalar homogenized matrix used in the Ch3 comparison datum, with the +background scalar passed explicitly. This is the sigma-agnostic Ch3 assembly +surface; finite-`sigma` and endpoint hypotheses only have to supply the scalar +and its positivity. -/ +def assemblyConstantCoeffMatrixOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) : + Ch03.ConstantCoeffMatrix d := + scalarConstantCoeffMatrix σ0 hσ0 + +abbrev assemblyComparisonDatumOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (g : Vec d → Vec d) : Type _ := + Ch03.CoarseGrainingComparisonDatum + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrixOfScalar σ0 hσ0) g + +/-- Finite-`sigma` wrapper for the scalar homogenized matrix. -/ +def assemblyConstantCoeffMatrix {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar (barSigmaLimit hP hStruct) + hΓ.barSigmaLimit_pos + +abbrev assemblyComparisonDatum {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (g : Vec d → Vec d) : Type _ := + assemblyComparisonDatumOfScalar + (barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos aω ha m g + +noncomputable def assemblyResponseConstant (d : ℕ) : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + +noncomputable def assemblyNegativeConstant (d : ℕ) (τ : ℝ) : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + +noncomputable def assemblyAmplitude (d : ℕ) (τ : ℝ) : ℝ := + max (assemblyResponseConstant d) (assemblyNegativeConstant d τ) * + Real.rpow (3 : ℝ) (τ / 2) + +noncomputable def assemblyMinimalScaleDecay {d : ℕ} + (α : ℝ) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) (m : ℕ) : ℝ := + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + +noncomputable def assemblyErrorDiscount (τ r : ℝ) : ℝ := + Real.rpow + (Ch02.geometricDiscount r 1 * + (Ch02.geometricDiscount (r - τ / 2) 1)⁻¹) + (1 / (1 : ℝ)) + +noncomputable def assemblyEllipticityDiscount (τ r : ℝ) : ℝ := + Real.rpow + (Ch02.geometricDiscount (r / 2) 2 * + (Ch02.geometricDiscount (r / 2 - τ / 2) 2)⁻¹) + (1 / 2 : ℝ) + +noncomputable def assemblyErrorEnvelope {d : ℕ} + (α τ r : ℝ) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) + (m : ℕ) : ℝ := + assemblyErrorDiscount τ r * assemblyAmplitude d τ * + assemblyMinimalScaleDecay α X aω m + +noncomputable def assemblyEllipticityErrorEnvelope {d : ℕ} + (α τ r : ℝ) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) + (m : ℕ) : ℝ := + assemblyEllipticityDiscount τ r * assemblyAmplitude d τ * + assemblyMinimalScaleDecay α X aω m + +noncomputable def assemblyEllipticityEnvelope {d : ℕ} + (α τ r : ℝ) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) + (m : ℕ) : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + ((assemblyEllipticityErrorEnvelope (d := d) α τ r X aω m) ^ (2 : ℕ) + 1) + +/-- The controlled-factor conclusion used by the Phase 4 assembly theorem, +with the scalar background passed explicitly. -/ +def assemblyControlledFactorsConclusionOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) + (Ccg α τ s r : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) : Prop := + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar σ0 hσ0 + let B₁ : ℝ := assemblyErrorEnvelope (d := d) α τ r X aω m + let M : ℝ := assemblyEllipticityEnvelope (d := d) α τ r X aω m + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS Ccg Q F a0 s r r j g w.u ∧ + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j ≤ + Ch03.coarseGrainingDepthWeight r j * B₁ ∧ + max (σ0⁻¹ * Ch02.LambdaSq Q (r / 2) (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M ∧ + (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M ∧ + Real.sqrt (Ch02.LambdaSq Q (r / 2) (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M + +/-- Finite-`sigma` wrapper for the controlled-factor conclusion. -/ +def assemblyControlledFactorsConclusion {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Ccg α τ s r : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) : Prop := + assemblyControlledFactorsConclusionOfScalar + (barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + Ccg α τ s r X aω ha m j g w + +/-- Two-exponent controlled-factor conclusion for the repaired Ch3 +coarse-graining estimate. The response quantities are still localized at +exponent `r`, while the forcing is measured at the stronger exponent `r₂`. -/ +def assemblyControlledFactorsTwoExponentConclusionOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) + (Ccg α τ s r r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) : Prop := + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar σ0 hσ0 + let B₁ : ℝ := assemblyErrorEnvelope (d := d) α τ r X aω m + let M : ℝ := assemblyEllipticityEnvelope (d := d) α τ r X aω m + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS Ccg Q F a0 s r r₂ j g w.u ∧ + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j ≤ + Ch03.coarseGrainingDepthWeight r j * B₁ ∧ + max (σ0⁻¹ * Ch02.LambdaSq Q (r / 2) (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M ∧ + (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M ∧ + Real.sqrt (Ch02.LambdaSq Q (r / 2) (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M + +/-- Finite-`sigma` wrapper for the repaired two-exponent controlled-factor +conclusion. -/ +def assemblyControlledFactorsTwoExponentConclusion {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Ccg α τ s r r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) : Prop := + assemblyControlledFactorsTwoExponentConclusionOfScalar + (barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + Ccg α τ s r r₂ X aω ha m j g w + +/-- Finite-`sigma` assembly of the Ch3 comparison theorem with the collapsed +minimal-scale controls needed to bound every random coefficient in its RHS. + +This is the internal Phase 4 handoff: one random scale `X` controls both the +depth-localized `q = 1` homogenization error and the `q = 2` ellipticity +factors appearing in the deterministic Ch3 theorem. -/ +theorem exists_homogenizationComparison_controlledFactors_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {σ τ s r : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d}, + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) → + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r g → + assemblyControlledFactorsConclusion + hP hStruct hΓ Ccg α τ s r X aω ha m j g w := by + obtain ⟨Ccg, hCcg_pos, hCcg⟩ := + (Ch03.generalCoarseGrainingL2TwoExponentTheory d).exists_constant + obtain ⟨α, hα_pos, hαmax, hEbase⟩ := + exists_homogenizationErrorOnOriginCube_interpolated_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg_pos, hα_pos, hαmax, ?_⟩ + intro σ τ s r hσ_pos hτ_half hατ_half hτ_le_one hs_pos hr_pos + hrs hs_lt_one hτr + dsimp only + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hηJ_pos : 0 < finiteQuenchedTailExponent d σ τ := + finiteQuenchedTailExponent_pos (d := d) (σ := σ) (t := τ) + hσ_pos hτ_pos + have hηU_pos : 0 < finiteQuenchedTailExponent d σ (τ / 2) := + finiteQuenchedTailExponent_pos (d := d) (σ := σ) (t := τ / 2) + hσ_pos hτ2_pos + have hη_pos : + 0 < min (finiteQuenchedTailExponent d σ τ) + (finiteQuenchedTailExponent d σ (τ / 2)) := + lt_min hηJ_pos hηU_pos + have hrq₁ : 0 ≤ r * (1 : ℝ) := by nlinarith + have hδq₁ : 0 < (r - τ / 2) * (1 : ℝ) := by nlinarith + have hrq₂ : 0 ≤ (r / 2) * (2 : ℝ) := by nlinarith + have hδq₂ : 0 < (r / 2 - τ / 2) * (2 : ℝ) := by nlinarith + obtain ⟨C₁, hC₁_pos, hLaw₁⟩ := + hEbase (σ := σ) (τ := τ) (r := r) (q := 1) + hσ_pos hτ_half hατ_half hτ_le_one hrq₁ hδq₁ + (by norm_num : (0 : ℝ) < 1) + obtain ⟨C₂, hC₂_pos, hLaw₂⟩ := + hEbase (σ := σ) (τ := τ) (r := r / 2) (q := 2) + hσ_pos hτ_half hατ_half hτ_le_one hrq₂ hδq₂ + (by norm_num : (0 : ℝ) < 2) + let Cscale : ℝ := + 4 * max 0 + (Real.log + ((3 * Real.log (2 : ℝ)) ^ + (min (finiteQuenchedTailExponent d σ τ) + (finiteQuenchedTailExponent d σ (τ / 2)))⁻¹)) + + max C₁ C₂ + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hnonneg : + 0 ≤ 4 * max 0 + (Real.log + ((3 * Real.log (2 : ℝ)) ^ + (min (finiteQuenchedTailExponent d σ τ) + (finiteQuenchedTailExponent d σ (τ / 2)))⁻¹)) := by + positivity + have hmax_pos : 0 < max C₁ C₂ := hC₁_pos.trans_le (le_max_left C₁ C₂) + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + obtain ⟨X₁, hX₁O, hX₁_one, hX₁ae⟩ := + hLaw₁ hP hStruct hΓ hσ_eq hparams + obtain ⟨X₂, hX₂O, hX₂_one, hX₂ae⟩ := + hLaw₂ hP hStruct hΓ hσ_eq hparams + let X : RegCoeffField d → ℝ := fun aω => max (X₁ aω) (X₂ aω) + have hXO : + IsBigO P + (gammaSigma + (min (finiteQuenchedTailExponent d σ τ) + (finiteQuenchedTailExponent d σ (τ / 2)))) + X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) := by + simpa [X, Cscale] using + isBigO_gammaSigma_max_two_expLogSq + (μ := P) + (η := min (finiteQuenchedTailExponent d σ τ) + (finiteQuenchedTailExponent d σ (τ / 2))) + (C₁ := C₁) (C₂ := C₂) (θ := hΓ.thetaHat) + hη_pos hΓ.thetaHat_pos hX₁O hX₂O + refine ⟨X, hXO, ?_, ?_⟩ + · intro aω + dsimp [X] + exact (hX₁_one aω).trans (le_max_left _ _) + filter_upwards [hX₁ae, hX₂ae] with aω hX₁point hX₂point + intro ha m j g + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let σ0 : ℝ := barSigmaLimit hP hStruct + let hσ0 : 0 < σ0 := hΓ.barSigmaLimit_pos + let a0 : Ch03.ConstantCoeffMatrix d := scalarConstantCoeffMatrix σ0 hσ0 + intro w hXm hg + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + let G₁ : ℝ := + Real.rpow + (Ch02.geometricDiscount r 1 * + (Ch02.geometricDiscount (r - τ / 2) 1)⁻¹) + (1 / (1 : ℝ)) + let G₂ : ℝ := + Real.rpow + (Ch02.geometricDiscount (r / 2) 2 * + (Ch02.geometricDiscount (r / 2 - τ / 2) 2)⁻¹) + (1 / 2 : ℝ) + let B₁ : ℝ := G₁ * A * R + let B₂ : ℝ := G₂ * A * R + let M : ℝ := 2 * (Fintype.card (Fin d) : ℝ) * (B₂ ^ (2 : ℕ) + 1) + have hX₁_le_X : X₁ aω ≤ X aω := by + dsimp [X] + exact le_max_left _ _ + have hX₂_le_X : X₂ aω ≤ X aω := by + dsimp [X] + exact le_max_right _ _ + have hX₁m : X₁ aω ≤ (3 : ℝ) ^ m := hX₁_le_X.trans hXm + have hX₂m : X₂ aω ≤ (3 : ℝ) ^ m := hX₂_le_X.trans hXm + have hX₁_pos : 0 < X₁ aω := + lt_of_lt_of_le zero_lt_one (hX₁_one aω) + have hX₂_pos : 0 < X₂ aω := + lt_of_lt_of_le zero_lt_one (hX₂_one aω) + have hX_pos : 0 < X aω := + lt_of_lt_of_le hX₁_pos hX₁_le_X + have hpowm_pos : 0 < (3 : ℝ) ^ m := by positivity + have hR₁_le_R : + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) ≤ R := by + dsimp [R] + exact sqrt_rpow_neg_div_mono_of_le + hpowm_pos hX₁_pos hX_pos hX₁_le_X hα_pos + have hR₂_le_R : + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) ≤ R := by + dsimp [R] + exact sqrt_rpow_neg_div_mono_of_le + hpowm_pos hX₂_pos hX_pos hX₂_le_X hα_pos + have hdisc_r_nonneg : 0 ≤ Ch02.geometricDiscount r 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq₁ + have hdisc_delta₁_pos : 0 < Ch02.geometricDiscount (r - τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hδq₁ + have hG₁_nonneg : 0 ≤ G₁ := by + dsimp [G₁] + exact Real.rpow_nonneg + (mul_nonneg hdisc_r_nonneg + (inv_nonneg.mpr hdisc_delta₁_pos.le)) _ + have hdisc_r₂_nonneg : 0 ≤ Ch02.geometricDiscount (r / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq₂ + have hdisc_delta₂_pos : + 0 < Ch02.geometricDiscount (r / 2 - τ / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hδq₂ + have hG₂_nonneg : 0 ≤ G₂ := by + dsimp [G₂] + exact Real.rpow_nonneg + (mul_nonneg hdisc_r₂_nonneg + (inv_nonneg.mpr hdisc_delta₂_pos.le)) _ + have hdisc_tau_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos + (by nlinarith : 0 < (τ / 2) * (1 : ℝ)) + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + exact mul_nonneg (inv_nonneg.mpr hdisc_tau_pos.le) (by positivity) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (hCresp_nonneg.trans (le_max_left Cresp Cneg)) + (by positivity) + have hB₁_nonneg : 0 ≤ B₁ := by + dsimp [B₁] + exact mul_nonneg (mul_nonneg hG₁_nonneg hA_nonneg) (Real.sqrt_nonneg _) + have hB₂_nonneg : 0 ≤ B₂ := by + dsimp [B₂] + exact mul_nonneg (mul_nonneg hG₂_nonneg hA_nonneg) (Real.sqrt_nonneg _) + have hcomparison : + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS + Ccg Q F a0 s r r j g w.u := by + exact + hCcg (Q := Q) (a := F) (a0 := a0) (s := s) (r := r) + (r₂ := r) (j := j) (g := g) + (scalarConstantCoeffMatrix_isPositiveScalarMatrix hσ0) w + hs_pos hr_pos hrs hs_lt_one le_rfl hg + have hparent₁ : + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix ≤ B₁ := by + have hraw := + hX₁point ha (m := m) hX₁m + have hraw' : + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix ≤ + G₁ * A * + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) := by + simpa [Q, F, σ0, hσ0, a0, Cresp, Cneg, A, G₁, + scalarConstantCoeffMatrix_matrix] using hraw + calc + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix + ≤ G₁ * A * + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) := hraw' + _ ≤ G₁ * A * R := by + exact mul_le_mul_of_nonneg_left hR₁_le_R + (mul_nonneg hG₁_nonneg hA_nonneg) + _ = B₁ := rfl + have hdepth_base := + coarseGrainingHomogenizationErrorAtDepth_le_depthWeight_mul_parent + (Q := Q) (a := F) (a0 := a0) (s := r) hr_pos j + have hdepth_weight_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r j := by + dsimp [Ch03.coarseGrainingDepthWeight] + positivity + have hdepth : + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j ≤ + Ch03.coarseGrainingDepthWeight r j * B₁ := by + calc + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j + ≤ Ch03.coarseGrainingDepthWeight r j * + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix := + hdepth_base + _ ≤ Ch03.coarseGrainingDepthWeight r j * B₁ := + mul_le_mul_of_nonneg_left hparent₁ hdepth_weight_nonneg + have hparent₂ : + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) ≤ B₂ := by + have hraw := + hX₂point ha (m := m) hX₂m + have hraw' : + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) ≤ + G₂ * A * + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) := by + simpa [Q, F, σ0, Cresp, Cneg, A, G₂] using hraw + calc + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) + ≤ G₂ * A * + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) := hraw' + _ ≤ G₂ * A * R := by + exact mul_le_mul_of_nonneg_left hR₂_le_R + (mul_nonneg hG₂_nonneg hA_nonneg) + _ = B₂ := rfl + have hr_half_pos : 0 < r / 2 := half_pos hr_pos + have hweighted : + max (σ0⁻¹ * Ch02.LambdaSq Q (r / 2) (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M := by + simpa [M, B₂] using + weightedEllipticity_finite_two_le_of_homogenizationError_bound + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (B := B₂) + hr_half_pos hσ0 hparent₂ + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hlambda_inv : + (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M := by + exact + lambdaSq_inv_le_inv_sigma_mul_of_weightedEllipticity_le + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (M := M) + hσ0 hweighted + have hsqrt_product : + Real.sqrt (Ch02.LambdaSq Q (r / 2) (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M := by + exact + sqrt_LambdaSq_mul_sqrt_lambdaSq_inv_le_of_weightedEllipticity_le + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (M := M) + hr_half_pos hσ0 hM_nonneg hweighted + exact ⟨hcomparison, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + +/-- Finite-`sigma` two-exponent assembly of the repaired Ch3 comparison +theorem. The stochastic scale and local coefficient controls are inherited +from the one-exponent controlled-factor package; only the Ch3 comparison +conjunct is replaced by the scale-separated theorem. -/ +theorem exists_homogenizationComparison_controlledFactors_twoExponent_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {σ τ s r r₂ : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + r ≤ r₂ → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d}, + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) → + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + assemblyControlledFactorsTwoExponentConclusion + hP hStruct hΓ Ccg α τ s r r₂ X aω ha m j g w := by + obtain ⟨Ccg, hCcg_pos, hCcg⟩ := + (Ch03.generalCoarseGrainingL2TwoExponentTheory d).exists_constant + obtain ⟨_, α, _, hα_pos, hαmax, hcontrolled⟩ := + exists_homogenizationComparison_controlledFactors_interpolated_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg_pos, hα_pos, hαmax, ?_⟩ + intro σ τ s r r₂ hσ_pos hτ_half hατ_half hτ_le_one hs_pos hr_pos + hrs hs_lt_one hτr hr₂ + dsimp only + obtain ⟨Cscale, hCscale, hlaw⟩ := + hcontrolled hσ_pos hτ_half hατ_half hτ_le_one hs_pos hr_pos + hrs hs_lt_one hτr + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + obtain ⟨X, hXO, hXone, hAE⟩ := + hlaw hP hStruct hΓ hσ_eq hparams + refine ⟨X, hXO, hXone, ?_⟩ + filter_upwards [hAE] with aω hpoint + intro ha m j g w hXm hg₂ + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrix hP hStruct hΓ + have hg₁ : Ch03.ForceBesovRegularity Q r g := by + dsimp [Q] + exact hg₂.of_exponent_le hr₂ + have hlegacy : + assemblyControlledFactorsConclusion + hP hStruct hΓ _ α τ s r X aω ha m j g w := + hpoint ha w hXm (by simpa [Q] using hg₁) + have hcomparison : + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS + Ccg Q F a0 s r r₂ j g w.u := by + exact + hCcg (Q := Q) (a := F) (a0 := a0) (s := s) (r := r) + (r₂ := r₂) (j := j) (g := g) + (by + dsimp [a0, assemblyConstantCoeffMatrix, + assemblyConstantCoeffMatrixOfScalar] + exact scalarConstantCoeffMatrix_isPositiveScalarMatrix + hΓ.barSigmaLimit_pos) + w hs_pos hr_pos hrs hs_lt_one hr₂ hg₂ + dsimp [assemblyControlledFactorsTwoExponentConclusion, + assemblyControlledFactorsTwoExponentConclusionOfScalar, Q, F, a0] + dsimp [assemblyControlledFactorsConclusion, + assemblyControlledFactorsConclusionOfScalar, Q, F, a0] at hlegacy + rcases hlegacy with ⟨_, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + exact ⟨hcomparison, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyEndpoint.lean new file mode 100644 index 0000000000..dd78b68703 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyEndpoint.lean @@ -0,0 +1,490 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS + +/-! # Homogenization Assembly Endpoint -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder + +/-! +# Endpoint assembly for the public quenched homogenization theorem + +This file packages the `Γ∞` endpoint controls into the same scalar-background +Ch3 assembly interface used by the finite-`sigma` branch. +-/ + +noncomputable section + +/-- Endpoint assembly of the Ch3 comparison theorem with the collapsed +minimal-scale controls needed to bound every random coefficient in its RHS. -/ +theorem exists_homogenizationComparison_controlledFactors_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {τ s r : ℝ}, + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d}, + (w : assemblyComparisonDatumOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + aω ha m g) → + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r g → + assemblyControlledFactorsConclusionOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + Ccg α τ s r X aω ha m j g w := by + obtain ⟨Ccg, hCcg_pos, hCcg⟩ := + (Ch03.generalCoarseGrainingL2TwoExponentTheory d).exists_constant + obtain ⟨α, hα_pos, hαmax, hEbase⟩ := + exists_homogenizationErrorOnOriginCube_uniformEndpoint_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg_pos, hα_pos, hαmax, ?_⟩ + intro τ s r hτ_half hατ_half hτ_le_one hs_pos hr_pos hrs hs_lt_one hτr + dsimp only + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hη_pos : 0 < ((d : ℕ) : ℝ) := by + exact_mod_cast lt_of_lt_of_le (by norm_num : (0 : ℕ) < 2) + params.two_le_dim + have hrq₁ : 0 ≤ r * (1 : ℝ) := by nlinarith + have hδq₁ : 0 < (r - τ / 2) * (1 : ℝ) := by nlinarith + have hrq₂ : 0 ≤ (r / 2) * (2 : ℝ) := by nlinarith + have hδq₂ : 0 < (r / 2 - τ / 2) * (2 : ℝ) := by nlinarith + obtain ⟨C₁, hC₁_pos, hLaw₁⟩ := + hEbase (τ := τ) (r := r) (q := 1) + hτ_half hατ_half hτ_le_one hrq₁ hδq₁ + (by norm_num : (0 : ℝ) < 1) + obtain ⟨C₂, hC₂_pos, hLaw₂⟩ := + hEbase (τ := τ) (r := r / 2) (q := 2) + hτ_half hατ_half hτ_le_one hrq₂ hδq₂ + (by norm_num : (0 : ℝ) < 2) + let η : ℝ := ((d : ℕ) : ℝ) + let Cscale : ℝ := + 4 * max 0 (Real.log ((3 * Real.log (2 : ℝ)) ^ η⁻¹)) + + max C₁ C₂ + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hnonneg : + 0 ≤ 4 * max 0 + (Real.log ((3 * Real.log (2 : ℝ)) ^ η⁻¹)) := by + positivity + have hmax_pos : 0 < max C₁ C₂ := hC₁_pos.trans_le (le_max_left C₁ C₂) + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + obtain ⟨X₁, hX₁O, hX₁_one, hX₁ae⟩ := + hLaw₁ hP hStruct hInf hparams + obtain ⟨X₂, hX₂O, hX₂_one, hX₂ae⟩ := + hLaw₂ hP hStruct hInf hparams + let X : RegCoeffField d → ℝ := fun aω => max (X₁ aω) (X₂ aω) + have hXO : + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) := by + simpa [X, Cscale, η] using + isBigO_gammaSigma_max_two_expLogSq + (μ := P) (η := η) (C₁ := C₁) (C₂ := C₂) + (θ := hInf.thetaHat) (by simpa [η] using hη_pos) + hInf.thetaHat_pos hX₁O hX₂O + refine ⟨X, hXO, ?_, ?_⟩ + · intro aω + dsimp [X] + exact (hX₁_one aω).trans (le_max_left _ _) + filter_upwards [hX₁ae, hX₂ae] with aω hX₁point hX₂point + intro ha m j g + let hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hInf.toGammaSigma 1 zero_lt_one + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField aω ha + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let σ0 : ℝ := barSigmaLimit hP hStruct + let hσ0 : 0 < σ0 := hΓ.barSigmaLimit_pos + let a0 : Ch03.ConstantCoeffMatrix d := scalarConstantCoeffMatrix σ0 hσ0 + intro w hXm hg + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) + let G₁ : ℝ := + Real.rpow + (Ch02.geometricDiscount r 1 * + (Ch02.geometricDiscount (r - τ / 2) 1)⁻¹) + (1 / (1 : ℝ)) + let G₂ : ℝ := + Real.rpow + (Ch02.geometricDiscount (r / 2) 2 * + (Ch02.geometricDiscount (r / 2 - τ / 2) 2)⁻¹) + (1 / 2 : ℝ) + let B₁ : ℝ := G₁ * A * R + let B₂ : ℝ := G₂ * A * R + let M : ℝ := 2 * (Fintype.card (Fin d) : ℝ) * (B₂ ^ (2 : ℕ) + 1) + have hX₁_le_X : X₁ aω ≤ X aω := by + dsimp [X] + exact le_max_left _ _ + have hX₂_le_X : X₂ aω ≤ X aω := by + dsimp [X] + exact le_max_right _ _ + have hX₁m : X₁ aω ≤ (3 : ℝ) ^ m := hX₁_le_X.trans hXm + have hX₂m : X₂ aω ≤ (3 : ℝ) ^ m := hX₂_le_X.trans hXm + have hX₁_pos : 0 < X₁ aω := + lt_of_lt_of_le zero_lt_one (hX₁_one aω) + have hX₂_pos : 0 < X₂ aω := + lt_of_lt_of_le zero_lt_one (hX₂_one aω) + have hX_pos : 0 < X aω := lt_of_lt_of_le hX₁_pos hX₁_le_X + have hpowm_pos : 0 < (3 : ℝ) ^ m := by positivity + have hR₁_le_R : + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) ≤ R := by + dsimp [R] + exact sqrt_rpow_neg_div_mono_of_le + hpowm_pos hX₁_pos hX_pos hX₁_le_X hα_pos + have hR₂_le_R : + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) ≤ R := by + dsimp [R] + exact sqrt_rpow_neg_div_mono_of_le + hpowm_pos hX₂_pos hX_pos hX₂_le_X hα_pos + have hdisc_r_nonneg : 0 ≤ Ch02.geometricDiscount r 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq₁ + have hdisc_delta₁_pos : 0 < Ch02.geometricDiscount (r - τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hδq₁ + have hG₁_nonneg : 0 ≤ G₁ := by + dsimp [G₁] + exact Real.rpow_nonneg + (mul_nonneg hdisc_r_nonneg + (inv_nonneg.mpr hdisc_delta₁_pos.le)) _ + have hdisc_r₂_nonneg : 0 ≤ Ch02.geometricDiscount (r / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq₂ + have hdisc_delta₂_pos : + 0 < Ch02.geometricDiscount (r / 2 - τ / 2) 2 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hδq₂ + have hG₂_nonneg : 0 ≤ G₂ := by + dsimp [G₂] + exact Real.rpow_nonneg + (mul_nonneg hdisc_r₂_nonneg + (inv_nonneg.mpr hdisc_delta₂_pos.le)) _ + have hdisc_tau_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos + (by nlinarith : 0 < (τ / 2) * (1 : ℝ)) + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + exact mul_nonneg (inv_nonneg.mpr hdisc_tau_pos.le) (by positivity) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg (hCresp_nonneg.trans (le_max_left Cresp Cneg)) + (by positivity) + have hB₁_nonneg : 0 ≤ B₁ := by + dsimp [B₁] + exact mul_nonneg (mul_nonneg hG₁_nonneg hA_nonneg) (Real.sqrt_nonneg _) + have hB₂_nonneg : 0 ≤ B₂ := by + dsimp [B₂] + exact mul_nonneg (mul_nonneg hG₂_nonneg hA_nonneg) (Real.sqrt_nonneg _) + have hcomparison : + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS + Ccg Q F a0 s r r j g w.u := by + exact + hCcg (Q := Q) (a := F) (a0 := a0) (s := s) (r := r) + (r₂ := r) (j := j) (g := g) + (scalarConstantCoeffMatrix_isPositiveScalarMatrix hσ0) w + hs_pos hr_pos hrs hs_lt_one le_rfl hg + have hparent₁ : + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix ≤ B₁ := by + have hraw := hX₁point ha (m := m) hX₁m + have hraw' : + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix ≤ + G₁ * A * + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) := by + simpa [Q, F, σ0, hσ0, a0, Cresp, Cneg, A, G₁, + scalarConstantCoeffMatrix_matrix] using hraw + calc + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix + ≤ G₁ * A * + Real.sqrt (((3 : ℝ) ^ m / X₁ aω) ^ (-α)) := hraw' + _ ≤ G₁ * A * R := + mul_le_mul_of_nonneg_left hR₁_le_R + (mul_nonneg hG₁_nonneg hA_nonneg) + _ = B₁ := rfl + have hdepth_base := + coarseGrainingHomogenizationErrorAtDepth_le_depthWeight_mul_parent + (Q := Q) (a := F) (a0 := a0) (s := r) hr_pos j + have hdepth_weight_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r j := by + dsimp [Ch03.coarseGrainingDepthWeight] + positivity + have hdepth : + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j ≤ + Ch03.coarseGrainingDepthWeight r j * B₁ := by + calc + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j + ≤ Ch03.coarseGrainingDepthWeight r j * + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite 1) F a0.matrix := + hdepth_base + _ ≤ Ch03.coarseGrainingDepthWeight r j * B₁ := + mul_le_mul_of_nonneg_left hparent₁ hdepth_weight_nonneg + have hparent₂ : + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) ≤ B₂ := by + have hraw := hX₂point ha (m := m) hX₂m + have hraw' : + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) ≤ + G₂ * A * + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) := by + simpa [Q, F, σ0, Cresp, Cneg, A, G₂] using hraw + calc + Ch02.HomogenizationErrorOnCube Q (r / 2) + Ch02.MultiscaleExponent.infinity (.finite 2) F + (scalarMatrix (d := d) σ0) + ≤ G₂ * A * + Real.sqrt (((3 : ℝ) ^ m / X₂ aω) ^ (-α)) := hraw' + _ ≤ G₂ * A * R := + mul_le_mul_of_nonneg_left hR₂_le_R + (mul_nonneg hG₂_nonneg hA_nonneg) + _ = B₂ := rfl + have hr_half_pos : 0 < r / 2 := half_pos hr_pos + have hweighted : + max (σ0⁻¹ * Ch02.LambdaSq Q (r / 2) (.finite 2) F) + (σ0 * (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M := by + simpa [M, B₂] using + weightedEllipticity_finite_two_le_of_homogenizationError_bound + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (B := B₂) + hr_half_pos hσ0 hparent₂ + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hlambda_inv : + (Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹ ≤ σ0⁻¹ * M := + lambdaSq_inv_le_inv_sigma_mul_of_weightedEllipticity_le + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (M := M) + hσ0 hweighted + have hsqrt_product : + Real.sqrt (Ch02.LambdaSq Q (r / 2) (.finite 2) F) * + Real.sqrt ((Ch02.lambdaSq Q (r / 2) (.finite 2) F)⁻¹) ≤ M := + sqrt_LambdaSq_mul_sqrt_lambdaSq_inv_le_of_weightedEllipticity_le + (Q := Q) (a := F) (s := r / 2) (σ := σ0) (M := M) + hr_half_pos hσ0 hM_nonneg hweighted + exact ⟨hcomparison, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + +/-- Endpoint two-exponent assembly of the repaired Ch3 comparison theorem. -/ +theorem exists_homogenizationComparison_controlledFactors_twoExponent_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {τ s r r₂ : ℝ}, + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + r ≤ r₂ → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d}, + (w : assemblyComparisonDatumOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + aω ha m g) → + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + assemblyControlledFactorsTwoExponentConclusionOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + Ccg α τ s r r₂ X aω ha m j g w := by + obtain ⟨Ccg, hCcg_pos, hCcg⟩ := + (Ch03.generalCoarseGrainingL2TwoExponentTheory d).exists_constant + obtain ⟨_, α, _, hα_pos, hαmax, hcontrolled⟩ := + exists_homogenizationComparison_controlledFactors_uniformEndpoint_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg_pos, hα_pos, hαmax, ?_⟩ + intro τ s r r₂ hτ_half hατ_half hτ_le_one hs_pos hr_pos + hrs hs_lt_one hτr hr₂ + dsimp only + obtain ⟨Cscale, hCscale, hlaw⟩ := + hcontrolled hτ_half hατ_half hτ_le_one hs_pos hr_pos + hrs hs_lt_one hτr + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hInf hparams + obtain ⟨X, hXO, hXone, hAE⟩ := + hlaw hP hStruct hInf hparams + refine ⟨X, hXO, hXone, ?_⟩ + filter_upwards [hAE] with aω hpoint + intro ha m j g w hXm hg₂ + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let σ0 : ℝ := barSigmaLimit hP hStruct + let hσ0 : 0 < σ0 := (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar σ0 hσ0 + have hg₁ : Ch03.ForceBesovRegularity Q r g := by + dsimp [Q] + exact hg₂.of_exponent_le hr₂ + have hlegacy : + assemblyControlledFactorsConclusionOfScalar + σ0 hσ0 _ α τ s r X aω ha m j g w := + hpoint ha w hXm (by simpa [Q, σ0, hσ0] using hg₁) + have hcomparison : + Ch03.homogenizationComparisonNegativeBesovLHS Q F a0 s w.u w.v ≤ + Ch03.generalCoarseGrainingL2TwoExponentRHS + Ccg Q F a0 s r r₂ j g w.u := by + exact + hCcg (Q := Q) (a := F) (a0 := a0) (s := s) (r := r) + (r₂ := r₂) (j := j) (g := g) + (by + dsimp [a0, assemblyConstantCoeffMatrixOfScalar] + exact scalarConstantCoeffMatrix_isPositiveScalarMatrix hσ0) + w hs_pos hr_pos hrs hs_lt_one hr₂ hg₂ + dsimp [assemblyControlledFactorsTwoExponentConclusionOfScalar, + Q, F, σ0, hσ0, a0] + dsimp [assemblyControlledFactorsConclusionOfScalar, Q, F, σ0, hσ0, a0] + at hlegacy + rcases hlegacy with ⟨_, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + exact ⟨hcomparison, hdepth, hweighted, hlambda_inv, hsqrt_product⟩ + +/-- Endpoint homogenization comparison above one collapsed minimal scale, using +the repaired scale-separated forcing exponent. -/ +theorem exists_homogenizationComparison_compressedTwoExponentRHS_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {τ s r r₂ : ℝ}, + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + r ≤ r₂ → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d} + (w : assemblyComparisonDatumOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + Ch03.homogenizationComparisonNegativeBesovLHS + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrixOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos) + s w.u w.v ≤ + assemblyCompressedTwoExponentRHSOfScalar + (barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + Ccg α τ s r r₂ X aω ha m j g w := by + obtain ⟨Ccg, α, hCcg, hα, hαmax, hcontrolled⟩ := + exists_homogenizationComparison_controlledFactors_twoExponent_uniformEndpoint_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg, hα, hαmax, ?_⟩ + intro τ s r r₂ hτ hατ hτ_one hs hr hrs hs_one hτr hr₂ + dsimp only + obtain ⟨Cscale, hCscale, hlaw⟩ := + hcontrolled hτ hατ hτ_one hs hr hrs hs_one hτr hr₂ + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hInf hparams + obtain ⟨X, hXO, hXone, hAE⟩ := + hlaw hP hStruct hInf hparams + refine ⟨X, hXO, hXone, ?_⟩ + simpa using + ae_homogenizationComparison_compressedTwoExponentRHSOfScalar_of_ae_controlledFactors + (P := P) + (σ0 := barSigmaLimit hP hStruct) + (hInf.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + (Ccg := Ccg) (α := α) (τ := τ) (s := s) (r := r) + (r₂ := r₂) (X := X) hCcg hs hr hrs hs_one hAE + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyOptimized.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyOptimized.lean new file mode 100644 index 0000000000..f715975ecc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyOptimized.lean @@ -0,0 +1,651 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssemblyRHS +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic + +/-! # Homogenization Assembly Optimized -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder + +/-! +# Depth optimization for the public quenched homogenization comparison + +This file turns the scale-separated compressed RHS of +`HomogenizationAssemblyRHS.lean` into the manuscript-shaped RHS of the public +theorem: a single constant, a single power of the minimal-scale ratio +`3^m / X`, and the two natural data norms. The localization depth `j` is +chosen as `3^{r j} ≈ ((3^m / X)^{α/2})^{1/2}`, which makes every term of the +compressed RHS decay like `(3^m / X)^{-α/8}`. + +The file also records that the finite quenched tail exponent is nondecreasing +in its discount parameter, so that the interpolated stochastic exponent +`min (η(τ)) (η(τ/2))` collapses to `η(τ/2)`. +-/ + +noncomputable section + +/-! ## Monotonicity of the finite tail exponent -/ + +theorem finiteQuenchedTailExponent_le_of_le + {d : ℕ} [NeZero d] {σ t₁ t₂ : ℝ} + (hσ : 0 < σ) (ht₁ : 0 < t₁) (h12 : t₁ ≤ t₂) : + finiteQuenchedTailExponent d σ t₁ ≤ finiteQuenchedTailExponent d σ t₂ := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hb : 0 < (d : ℝ) / 2 := by positivity + have ht₂ : 0 < t₂ := lt_of_lt_of_le ht₁ h12 + have hτ : 0 < finiteQuenchedTailTau σ := finiteQuenchedTailTau_pos hσ + have hden₁ : + 0 < σ * t₁ + finiteQuenchedTailTau σ * ((d : ℝ) / 2 - t₁) := + finiteQuenchedTailDen_pos hb hσ ht₁ + have hden₂ : + 0 < σ * t₂ + finiteQuenchedTailTau σ * ((d : ℝ) / 2 - t₂) := + finiteQuenchedTailDen_pos hb hσ ht₂ + set τ : ℝ := finiteQuenchedTailTau σ with hτ_def + set b : ℝ := (d : ℝ) / 2 with hb_def + have hkey : + σ * τ * b * t₂ * (σ * t₁ + τ * (b - t₁)) - + σ * τ * b * t₁ * (σ * t₂ + τ * (b - t₂)) = + σ * τ ^ (2 : ℕ) * b ^ (2 : ℕ) * (t₂ - t₁) := by + ring + have hgap : 0 ≤ σ * τ ^ (2 : ℕ) * b ^ (2 : ℕ) * (t₂ - t₁) := by + have h21 : 0 ≤ t₂ - t₁ := sub_nonneg.mpr h12 + positivity + dsimp [finiteQuenchedTailExponent, interpolatedQuenchedTailExponent] + rw [div_le_div_iff₀ hden₁ hden₂] + nlinarith [hkey, hgap] + +/-! ## Norms of the scalar comparison matrix -/ + +theorem assemblyConstantCoeffMatrixOfScalar_norm + {d : ℕ} [NeZero d] {σ0 : ℝ} (hσ0 : 0 < σ0) : + Ch03.constantCoeffMatrixNorm + (assemblyConstantCoeffMatrixOfScalar (d := d) σ0 hσ0) = σ0 := by + dsimp [Ch03.constantCoeffMatrixNorm, assemblyConstantCoeffMatrixOfScalar, + scalarConstantCoeffMatrix] + rw [Ch02.matrixNorm_eq_matrixOperatorNorm] + exact Ch02.matrixOperatorNorm_smul_one_eq_of_nonneg hσ0.le + +theorem assemblyConstantCoeffMatrixOfScalar_normHalf + {d : ℕ} [NeZero d] {σ0 : ℝ} (hσ0 : 0 < σ0) : + Ch03.constantCoeffMatrixNormHalf + (assemblyConstantCoeffMatrixOfScalar (d := d) σ0 hσ0) = + Real.sqrt σ0 := by + dsimp [Ch03.constantCoeffMatrixNormHalf] + rw [show Ch02.matrixNorm + (assemblyConstantCoeffMatrixOfScalar (d := d) σ0 hσ0).matrix = σ0 from + assemblyConstantCoeffMatrixOfScalar_norm hσ0] + rw [Real.sqrt_eq_rpow] + +/-! ## The optimized localization depth -/ + +/-- The depth `j ≈ (α/(4r)) log_3 (3^m / X)`, which balances the gradient and +forcing terms of the compressed two-exponent RHS. -/ +def assemblyOptimizedDepth {d : ℕ} (α r : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (m : ℕ) : ℕ := + ⌈α * Real.log ((3 : ℝ) ^ m / X aω) / (4 * r * Real.log 3)⌉₊ + +theorem rpow_le_rpow_three_of_div_le {α r Y : ℝ} {J : ℕ} + (hr : 0 < r) (hY : 1 ≤ Y) + (hJ : α * Real.log Y / (4 * r * Real.log 3) ≤ (J : ℝ)) : + Y ^ (α / 4) ≤ (3 : ℝ) ^ (r * (J : ℝ)) := by + have hY0 : (0 : ℝ) < Y := lt_of_lt_of_le one_pos hY + have hlog3 : 0 < Real.log 3 := Real.log_pos (by norm_num) + have hden : 0 < 4 * r * Real.log 3 := by positivity + have hnum : α * Real.log Y ≤ (J : ℝ) * (4 * r * Real.log 3) := + (div_le_iff₀ hden).mp hJ + have hkey : + Real.log Y * (α / 4) ≤ Real.log 3 * (r * (J : ℝ)) := by + nlinarith [hnum] + calc + Y ^ (α / 4) = Real.exp (Real.log Y * (α / 4)) := + Real.rpow_def_of_pos hY0 _ + _ ≤ Real.exp (Real.log 3 * (r * (J : ℝ))) := Real.exp_le_exp.mpr hkey + _ = (3 : ℝ) ^ (r * (J : ℝ)) := + (Real.rpow_def_of_pos (by norm_num : (0 : ℝ) < 3) _).symm + +theorem rpow_three_le_of_le_div_add_one {α r Y : ℝ} {J : ℕ} + (hα : 0 ≤ α) (hr : 0 < r) (hr1 : r ≤ 1) (hY : 1 ≤ Y) + (hJ : (J : ℝ) ≤ α * Real.log Y / (4 * r * Real.log 3) + 1) : + (3 : ℝ) ^ (r * (J : ℝ)) ≤ 3 * Y ^ (α / 4) := by + have hY0 : (0 : ℝ) < Y := lt_of_lt_of_le one_pos hY + have hlogY : 0 ≤ Real.log Y := Real.log_nonneg hY + have hlog3 : 0 < Real.log 3 := Real.log_pos (by norm_num) + have hden : 0 < 4 * r * Real.log 3 := by positivity + have hnum : (J : ℝ) * (4 * r * Real.log 3) ≤ + α * Real.log Y + 4 * r * Real.log 3 := by + have := mul_le_mul_of_nonneg_right hJ hden.le + calc + (J : ℝ) * (4 * r * Real.log 3) + ≤ (α * Real.log Y / (4 * r * Real.log 3) + 1) * + (4 * r * Real.log 3) := this + _ = α * Real.log Y + 4 * r * Real.log 3 := by + field_simp + have hkey : + Real.log 3 * (r * (J : ℝ)) ≤ + Real.log 3 + Real.log Y * (α / 4) := by + nlinarith [hnum, mul_le_mul_of_nonneg_right hr1 hlog3.le] + calc + (3 : ℝ) ^ (r * (J : ℝ)) = Real.exp (Real.log 3 * (r * (J : ℝ))) := + Real.rpow_def_of_pos (by norm_num) _ + _ ≤ Real.exp (Real.log 3 + Real.log Y * (α / 4)) := + Real.exp_le_exp.mpr hkey + _ = 3 * Y ^ (α / 4) := by + rw [Real.exp_add, Real.exp_log (by norm_num : (0 : ℝ) < 3), + Real.rpow_def_of_pos hY0] + +/-! ## The manuscript-shaped RHS -/ + +/-- Manuscript-shaped RHS of the public quenched homogenization comparison +theorem: a single constant, a single power of the minimal-scale ratio, the +energy of `u` weighted by `sqrt σ0`, and the scale-normalized positive Besov +seminorm of the force. -/ +def assemblyHomogenizationComparisonRHSOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) + (C α r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) : ℝ := + C * ((3 : ℝ) ^ m / X aω) ^ (-α) * + (Real.sqrt σ0 * + Ch03.h1EnergyNormOnCube (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) w.u + + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo + (assemblyOriginCube d m) r₂ g) + +/-- Finite-`sigma` wrapper for the manuscript-shaped RHS. -/ +def assemblyHomogenizationComparisonRHS {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (C α r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) : ℝ := + assemblyHomogenizationComparisonRHSOfScalar + (barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + C α r₂ X aω ha m g w + +/-! ## Compression of the two-exponent RHS at the optimized depth -/ + +/-- At the optimized depth, the compressed two-exponent RHS is dominated by +the manuscript-shaped RHS with exponent `α/8`. The constant is uniform in +the background scalar `σ0`, the random scale, the realization, the scale `m`, +and the data. -/ +theorem exists_compressedTwoExponentRHS_le_homogenizationComparisonRHS + (d : ℕ) [NeZero d] {Ccg α τ s r r₂ : ℝ} + (hCcg : 0 < Ccg) (hα : 0 < α) (hτ : 0 < τ) (hτr : τ < r) + (hs : 0 < s) (hr : 0 < r) (hrs : r < s / 2) (hs_one : s < 1) + (hrr₂ : 3 / 2 * r ≤ r₂) : + ∃ C : ℝ, 0 < C ∧ + ∀ {σ0 : ℝ} (hσ0 : 0 < σ0) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField aω) (m : ℕ) + (g : Vec d → Vec d) + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g), + 1 ≤ X aω → X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + assemblyCompressedTwoExponentRHSOfScalar σ0 hσ0 Ccg α τ s r r₂ X aω ha + m (assemblyOptimizedDepth α r X aω m) g w ≤ + assemblyHomogenizationComparisonRHSOfScalar σ0 hσ0 C (α / 8) r₂ + X aω ha m g w := by + have hr_half : r < 1 / 2 := by nlinarith + have hr1 : r ≤ 1 := by nlinarith + have hcard : 0 < (Fintype.card (Fin d) : ℝ) := by + rw [Fintype.card_fin] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + -- geometric discount signs + have hgeom_nonneg : ∀ {a : ℝ}, 0 ≤ a → 0 ≤ Ch02.geometricDiscount a 1 := by + intro a ha + dsimp [Ch02.geometricDiscount] + have h31 : (3 : ℝ) ^ (-a * 1) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) (by nlinarith) + linarith + have hgeom_nonneg₂ : ∀ {a : ℝ}, 0 ≤ a → 0 ≤ Ch02.geometricDiscount a 2 := by + intro a ha + dsimp [Ch02.geometricDiscount] + have h31 : (3 : ℝ) ^ (-a * 2) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) (by nlinarith) + linarith + -- the deterministic constants + set DB : ℝ := assemblyErrorDiscount τ r * assemblyAmplitude d τ with hDB_def + set KM : ℝ := + 2 * (Fintype.card (Fin d) : ℝ) * + ((assemblyEllipticityDiscount τ r * assemblyAmplitude d τ) ^ (2 : ℕ) + 1) + with hKM_def + have hamp_nonneg : 0 ≤ assemblyAmplitude d τ := by + dsimp [assemblyAmplitude] + exact mul_nonneg + (le_trans (Real.sqrt_nonneg _) + (le_max_left (assemblyResponseConstant d) (assemblyNegativeConstant d τ))) + (Real.rpow_nonneg (by norm_num) _) + have hDB_nonneg : 0 ≤ DB := by + rw [hDB_def] + refine mul_nonneg ?_ hamp_nonneg + dsimp [assemblyErrorDiscount] + refine Real.rpow_nonneg ?_ _ + exact mul_nonneg (hgeom_nonneg hr.le) + (inv_nonneg.mpr (hgeom_nonneg (by linarith))) + have hKM_pos : 0 < KM := by + rw [hKM_def] + positivity + set K₁ : ℝ := 3 * r⁻¹ * DB with hK₁_def + set K₂ : ℝ := + Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt KM * DB + + Real.rpow r (-(5 / 2 : ℝ)) * KM + Real.rpow r (-3 : ℝ) * KM + with hK₂_def + have hK₁_nonneg : 0 ≤ K₁ := by + rw [hK₁_def] + exact mul_nonneg (by positivity) hDB_nonneg + have hK₂_pos : 0 < K₂ := by + rw [hK₂_def] + have h₁ : 0 ≤ Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt KM * DB := + mul_nonneg (mul_nonneg (Real.rpow_nonneg hr.le _) (Real.sqrt_nonneg _)) + hDB_nonneg + have h₂ : 0 ≤ Real.rpow r (-(5 / 2 : ℝ)) * KM := + mul_nonneg (Real.rpow_nonneg hr.le _) hKM_pos.le + have h₃ : 0 < Real.rpow r (-3 : ℝ) * KM := + mul_pos (Real.rpow_pos_of_pos hr _) hKM_pos + linarith + have houter_pos : 0 < s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ := by + have h12 : 0 < (1 / 2 : ℝ) - r := by linarith + positivity + refine ⟨s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * Ccg * (K₁ + K₂), + by positivity, ?_⟩ + intro σ0 hσ0 X aω ha m g w hX1 hXm hg + have hX0 : 0 < X aω := lt_of_lt_of_le one_pos hX1 + set Y : ℝ := (3 : ℝ) ^ m / X aω with hY_def + have hY1 : 1 ≤ Y := (one_le_div hX0).mpr hXm + have hY0 : 0 < Y := lt_of_lt_of_le one_pos hY1 + set J : ℕ := assemblyOptimizedDepth α r X aω m with hJ_def + -- ceiling bounds for the optimized depth + have hJ_arg_nonneg : 0 ≤ α * Real.log Y / (4 * r * Real.log 3) := by + have hlogY : 0 ≤ Real.log Y := Real.log_nonneg hY1 + have hlog3 : 0 < Real.log 3 := Real.log_pos (by norm_num) + positivity + have hJ_lower : α * Real.log Y / (4 * r * Real.log 3) ≤ (J : ℝ) := by + rw [hJ_def] + dsimp [assemblyOptimizedDepth] + rw [← hY_def] + exact Nat.le_ceil _ + have hJ_upper : (J : ℝ) ≤ α * Real.log Y / (4 * r * Real.log 3) + 1 := by + rw [hJ_def] + dsimp [assemblyOptimizedDepth] + rw [← hY_def] + exact (Nat.ceil_lt_add_one hJ_arg_nonneg).le + have hDWlow : Y ^ (α / 4) ≤ (3 : ℝ) ^ (r * (J : ℝ)) := + rpow_le_rpow_three_of_div_le hr hY1 hJ_lower + have hDWup : (3 : ℝ) ^ (r * (J : ℝ)) ≤ 3 * Y ^ (α / 4) := + rpow_three_le_of_le_div_add_one hα.le hr hr1 hY1 hJ_upper + -- the minimal-scale decay + have hdec_eq : assemblyMinimalScaleDecay α X aω m = Y ^ (-(α / 2)) := by + dsimp [assemblyMinimalScaleDecay] + rw [← hY_def, Real.sqrt_eq_rpow, ← Real.rpow_mul hY0.le, + show -α * (1 / 2 : ℝ) = -(α / 2) by ring] + have hdec_nonneg : 0 ≤ assemblyMinimalScaleDecay α X aω m := + Real.sqrt_nonneg _ + have hdec_le_one : assemblyMinimalScaleDecay α X aω m ≤ 1 := by + rw [hdec_eq] + exact Real.rpow_le_one_of_one_le_of_nonpos hY1 (by linarith) + set Z : ℝ := Y ^ (-(α / 8)) with hZ_def + have hZ_nonneg : 0 ≤ Z := Real.rpow_nonneg hY0.le _ + -- product bounds for the depth weights + have hprod₁ : + Ch03.coarseGrainingDepthWeight r J * assemblyMinimalScaleDecay α X aω m + ≤ 3 * Z := by + dsimp [Ch03.coarseGrainingDepthWeight, Real.rpow_eq_pow] + rw [hdec_eq] + calc + (3 : ℝ) ^ (r * (J : ℝ)) * Y ^ (-(α / 2)) + ≤ 3 * Y ^ (α / 4) * Y ^ (-(α / 2)) := + mul_le_mul_of_nonneg_right hDWup (Real.rpow_nonneg hY0.le _) + _ = 3 * Y ^ (α / 4 + -(α / 2)) := by + rw [mul_assoc, ← Real.rpow_add hY0] + _ = 3 * Y ^ (-(α / 4)) := by + rw [show α / 4 + -(α / 2) = -(α / 4) by ring] + _ ≤ 3 * Z := by + rw [hZ_def] + exact mul_le_mul_of_nonneg_left + (Real.rpow_le_rpow_of_exponent_le hY1 (by linarith)) (by norm_num) + have hhalf_ge : + Y ^ (α / 8) ≤ (3 : ℝ) ^ (r * (J : ℝ) * (1 / 2 : ℝ)) := by + have h1 : (Y ^ (α / 4)) ^ (1 / 2 : ℝ) ≤ + ((3 : ℝ) ^ (r * (J : ℝ))) ^ (1 / 2 : ℝ) := + Real.rpow_le_rpow (Real.rpow_nonneg hY0.le _) hDWlow (by norm_num) + calc + Y ^ (α / 8) = (Y ^ (α / 4)) ^ (1 / 2 : ℝ) := by + rw [← Real.rpow_mul hY0.le, show α / 4 * (1 / 2 : ℝ) = α / 8 by ring] + _ ≤ ((3 : ℝ) ^ (r * (J : ℝ))) ^ (1 / 2 : ℝ) := h1 + _ = (3 : ℝ) ^ (r * (J : ℝ) * (1 / 2 : ℝ)) := by + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + have hprod₂ : + Ch03.coarseGrainingDepthWeight r J * + Ch03.coarseGrainingDepthInvWeight r₂ J ≤ Z := by + dsimp [Ch03.coarseGrainingDepthInvWeight, Ch03.coarseGrainingDepthWeight, + Real.rpow_eq_pow] + rw [← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3), + ← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + have hexp : r * (J : ℝ) + -(r₂ * (J : ℝ)) ≤ + -(r * (J : ℝ) * (1 / 2 : ℝ)) := by + have hJ_nonneg : (0 : ℝ) ≤ (J : ℝ) := Nat.cast_nonneg J + have hgap : 0 ≤ (r₂ - 3 / 2 * r) * (J : ℝ) := + mul_nonneg (by linarith) hJ_nonneg + have hid : r * (J : ℝ) + -(r₂ * (J : ℝ)) = + -(r * (J : ℝ) * (1 / 2 : ℝ)) - (r₂ - 3 / 2 * r) * (J : ℝ) := by + ring + linarith + calc + (3 : ℝ) ^ (r * (J : ℝ) + -(r₂ * (J : ℝ))) + ≤ (3 : ℝ) ^ (-(r * (J : ℝ) * (1 / 2 : ℝ))) := + Real.rpow_le_rpow_of_exponent_le (by norm_num) hexp + _ = ((3 : ℝ) ^ (r * (J : ℝ) * (1 / 2 : ℝ)))⁻¹ := + Real.rpow_neg (by norm_num) _ + _ ≤ (Y ^ (α / 8))⁻¹ := + inv_anti₀ (Real.rpow_pos_of_pos hY0 _) hhalf_ge + _ = Z := by + rw [hZ_def, ← Real.rpow_neg hY0.le] + have hprod₃ : + Ch03.coarseGrainingDepthHalfWeight r J * + (Ch03.coarseGrainingDepthWeight r J * + assemblyMinimalScaleDecay α X aω m) * + Ch03.coarseGrainingDepthInvWeight r₂ J ≤ Z := by + dsimp [Ch03.coarseGrainingDepthHalfWeight, + Ch03.coarseGrainingDepthWeight, Ch03.coarseGrainingDepthInvWeight, + Real.rpow_eq_pow] + rw [hdec_eq, ← Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + have hcollapse : + (3 : ℝ) ^ (r / 2 * (J : ℝ)) * + ((3 : ℝ) ^ (r * (J : ℝ)) * Y ^ (-(α / 2))) * + (3 : ℝ) ^ (-(r₂ * (J : ℝ))) = + (3 : ℝ) ^ (r / 2 * (J : ℝ) + r * (J : ℝ) + -(r₂ * (J : ℝ))) * + Y ^ (-(α / 2)) := by + rw [Real.rpow_add (by norm_num : (0 : ℝ) < 3), + Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + ring + rw [hcollapse] + have hthree_le_one : + (3 : ℝ) ^ (r / 2 * (J : ℝ) + r * (J : ℝ) + -(r₂ * (J : ℝ))) ≤ 1 := by + refine Real.rpow_le_one_of_one_le_of_nonpos (by norm_num) ?_ + have hJ_nonneg : (0 : ℝ) ≤ (J : ℝ) := Nat.cast_nonneg J + have hgap : 0 ≤ (r₂ - 3 / 2 * r) * (J : ℝ) := + mul_nonneg (by linarith) hJ_nonneg + have hid : r / 2 * (J : ℝ) + r * (J : ℝ) + -(r₂ * (J : ℝ)) = + -((r₂ - 3 / 2 * r) * (J : ℝ)) := by + ring + linarith + have hY_le : Y ^ (-(α / 2)) ≤ Z := by + rw [hZ_def] + exact Real.rpow_le_rpow_of_exponent_le hY1 (by linarith) + calc + (3 : ℝ) ^ (r / 2 * (J : ℝ) + r * (J : ℝ) + -(r₂ * (J : ℝ))) * + Y ^ (-(α / 2)) + ≤ 1 * Y ^ (-(α / 2)) := + mul_le_mul_of_nonneg_right hthree_le_one (Real.rpow_nonneg hY0.le _) + _ = Y ^ (-(α / 2)) := one_mul _ + _ ≤ Z := hY_le + -- envelope bounds + have hB₁_eq : + assemblyErrorEnvelope (d := d) α τ r X aω m = + DB * assemblyMinimalScaleDecay α X aω m := by + dsimp [assemblyErrorEnvelope] + have hM_nonneg : 0 ≤ assemblyEllipticityEnvelope (d := d) α τ r X aω m := by + dsimp [assemblyEllipticityEnvelope] + positivity + have hM_le : assemblyEllipticityEnvelope (d := d) α τ r X aω m ≤ KM := by + dsimp [assemblyEllipticityEnvelope, assemblyEllipticityErrorEnvelope] + rw [hKM_def] + have hsq : + (assemblyEllipticityDiscount τ r * assemblyAmplitude d τ * + assemblyMinimalScaleDecay α X aω m) ^ (2 : ℕ) ≤ + (assemblyEllipticityDiscount τ r * assemblyAmplitude d τ) ^ (2 : ℕ) := by + rw [mul_pow] + have hdecsq : assemblyMinimalScaleDecay α X aω m ^ (2 : ℕ) ≤ 1 := by + calc + assemblyMinimalScaleDecay α X aω m ^ (2 : ℕ) + ≤ 1 ^ (2 : ℕ) := pow_le_pow_left₀ hdec_nonneg hdec_le_one 2 + _ = 1 := one_pow 2 + exact mul_le_of_le_one_right (sq_nonneg _) hdecsq + have hcard_nonneg : 0 ≤ 2 * (Fintype.card (Fin d) : ℝ) := by positivity + exact mul_le_mul_of_nonneg_left (by linarith) hcard_nonneg + have hsqrtM_le : + Real.sqrt (assemblyEllipticityEnvelope (d := d) α τ r X aω m) ≤ + Real.sqrt KM := Real.sqrt_le_sqrt hM_le + -- the constant matrix norms + have hH_eq : + Ch03.constantCoeffMatrixNormHalf + (assemblyConstantCoeffMatrixOfScalar (d := d) σ0 hσ0) = + Real.sqrt σ0 := assemblyConstantCoeffMatrixOfScalar_normHalf hσ0 + have hN_eq : + Ch03.constantCoeffMatrixNorm + (assemblyConstantCoeffMatrixOfScalar (d := d) σ0 hσ0) = σ0 := + assemblyConstantCoeffMatrixOfScalar_norm hσ0 + -- combine sqrt σ0 with the lower ellipticity envelope + have hHL_eq : + Real.sqrt σ0 * + assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m = + Real.sqrt (assemblyEllipticityEnvelope (d := d) α τ r X aω m) := by + dsimp [assemblyLowerEllipticityEnvelopeOfScalar] + rw [← Real.sqrt_mul hσ0.le, ← mul_assoc, mul_inv_cancel₀ hσ0.ne', one_mul] + -- data signs + have hE_nonneg : + 0 ≤ Ch03.h1EnergyNormOnCube (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) w.u := by + dsimp [Ch03.h1EnergyNormOnCube] + positivity + have hG_nonneg : + 0 ≤ Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo + (assemblyOriginCube d m) r₂ g := + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + hg + have hsqrtσ0E_nonneg : + 0 ≤ Real.sqrt σ0 * + Ch03.h1EnergyNormOnCube (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) w.u := + mul_nonneg (Real.sqrt_nonneg _) hE_nonneg + have hDIW_nonneg : 0 ≤ Ch03.coarseGrainingDepthInvWeight r₂ J := by + dsimp [Ch03.coarseGrainingDepthInvWeight, Ch03.coarseGrainingDepthWeight] + positivity + have hDW_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r J := by + dsimp [Ch03.coarseGrainingDepthWeight] + positivity + have hDHW_nonneg : 0 ≤ Ch03.coarseGrainingDepthHalfWeight r J := by + dsimp [Ch03.coarseGrainingDepthHalfWeight] + positivity + -- abbreviations for the goal + set E : ℝ := + Ch03.h1EnergyNormOnCube (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) w.u with hE_def + set G : ℝ := + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo + (assemblyOriginCube d m) r₂ g with hG_def + set DW : ℝ := Ch03.coarseGrainingDepthWeight r J with hDW_def + set DHW : ℝ := Ch03.coarseGrainingDepthHalfWeight r J with hDHW_def + set DIW : ℝ := Ch03.coarseGrainingDepthInvWeight r₂ J with hDIW_def + set dec : ℝ := assemblyMinimalScaleDecay α X aω m with hdec_def + set M : ℝ := assemblyEllipticityEnvelope (d := d) α τ r X aω m with hM_def + set L : ℝ := assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m + with hL_def + -- the four summands of the compressed bracket + have hS₁ : + r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E ≤ K₁ * Z * (Real.sqrt σ0 * E) := by + have hstep : DW * (DB * dec) ≤ DB * (3 * Z) := by + calc + DW * (DB * dec) = DB * (DW * dec) := by ring + _ ≤ DB * (3 * Z) := mul_le_mul_of_nonneg_left hprod₁ hDB_nonneg + calc + r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + ≤ r⁻¹ * Real.sqrt σ0 * (DB * (3 * Z)) * E := by + refine mul_le_mul_of_nonneg_right ?_ hE_nonneg + exact mul_le_mul_of_nonneg_left hstep + (mul_nonneg (inv_nonneg.mpr hr.le) (Real.sqrt_nonneg _)) + _ = K₁ * Z * (Real.sqrt σ0 * E) := by + rw [hK₁_def]; ring + have hS₂ : + Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * (DW * (DB * dec)) * + (DIW * G) ≤ + Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt KM * DB * Z * G := by + have hfact : + Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) * (DIW * G) = + Real.rpow r (-(5 / 2 : ℝ)) * (Real.sqrt σ0 * L) * DB * + (DHW * (DW * dec) * DIW) * G := by + ring + rw [hfact, hHL_eq] + calc + Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt M * DB * + (DHW * (DW * dec) * DIW) * G + ≤ Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt M * DB * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + exact mul_le_mul_of_nonneg_left hprod₃ + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hr.le _) (Real.sqrt_nonneg _)) + hDB_nonneg) + _ ≤ Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt KM * DB * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + refine mul_le_mul_of_nonneg_right ?_ hZ_nonneg + refine mul_le_mul_of_nonneg_right ?_ hDB_nonneg + exact mul_le_mul_of_nonneg_left hsqrtM_le (Real.rpow_nonneg hr.le _) + have hS₃ : + Real.rpow r (-(5 / 2 : ℝ)) * DW * M * (DIW * G) ≤ + Real.rpow r (-(5 / 2 : ℝ)) * KM * Z * G := by + have hfact : + Real.rpow r (-(5 / 2 : ℝ)) * DW * M * (DIW * G) = + Real.rpow r (-(5 / 2 : ℝ)) * M * (DW * DIW) * G := by + ring + rw [hfact] + calc + Real.rpow r (-(5 / 2 : ℝ)) * M * (DW * DIW) * G + ≤ Real.rpow r (-(5 / 2 : ℝ)) * M * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + exact mul_le_mul_of_nonneg_left hprod₂ + (mul_nonneg (Real.rpow_nonneg hr.le _) hM_nonneg) + _ ≤ Real.rpow r (-(5 / 2 : ℝ)) * KM * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + refine mul_le_mul_of_nonneg_right ?_ hZ_nonneg + exact mul_le_mul_of_nonneg_left hM_le (Real.rpow_nonneg hr.le _) + have hS₄ : + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M) * (DIW * G) ≤ + Real.rpow r (-3 : ℝ) * KM * Z * G := by + have hfact : + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M) * (DIW * G) = + Real.rpow r (-3 : ℝ) * (σ0 * σ0⁻¹) * M * (DW * DIW) * G := by + ring + rw [hfact, mul_inv_cancel₀ hσ0.ne'] + calc + Real.rpow r (-3 : ℝ) * 1 * M * (DW * DIW) * G + ≤ Real.rpow r (-3 : ℝ) * 1 * M * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + exact mul_le_mul_of_nonneg_left hprod₂ + (mul_nonneg (mul_nonneg (Real.rpow_nonneg hr.le _) one_pos.le) + hM_nonneg) + _ ≤ Real.rpow r (-3 : ℝ) * KM * Z * G := by + refine mul_le_mul_of_nonneg_right ?_ hG_nonneg + refine mul_le_mul_of_nonneg_right ?_ hZ_nonneg + rw [mul_one] + exact mul_le_mul_of_nonneg_left hM_le (Real.rpow_nonneg hr.le _) + -- the bracket bound + have hbracket : + r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) + + Real.rpow r (-(5 / 2 : ℝ)) * DW * M + + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M)) * + (DIW * G) ≤ + (K₁ + K₂) * Z * (Real.sqrt σ0 * E + G) := by + have hsum : + r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) + + Real.rpow r (-(5 / 2 : ℝ)) * DW * M + + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M)) * + (DIW * G) = + r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) * (DIW * G) + + Real.rpow r (-(5 / 2 : ℝ)) * DW * M * (DIW * G) + + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M) * (DIW * G)) := by + ring + rw [hsum] + have hsplit : + K₁ * Z * (Real.sqrt σ0 * E) + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt KM * DB * Z * G + + Real.rpow r (-(5 / 2 : ℝ)) * KM * Z * G + + Real.rpow r (-3 : ℝ) * KM * Z * G) = + K₁ * Z * (Real.sqrt σ0 * E) + K₂ * Z * G := by + rw [hK₂_def]; ring + have hmain := add_le_add hS₁ (add_le_add (add_le_add hS₂ hS₃) hS₄) + rw [hsplit] at hmain + refine hmain.trans ?_ + have hexpand : + (K₁ + K₂) * Z * (Real.sqrt σ0 * E + G) = + K₁ * Z * (Real.sqrt σ0 * E) + K₂ * Z * G + + (K₂ * Z * (Real.sqrt σ0 * E) + K₁ * Z * G) := by + ring + rw [hexpand] + have h₁ : 0 ≤ K₂ * Z * (Real.sqrt σ0 * E) := + mul_nonneg (mul_nonneg hK₂_pos.le hZ_nonneg) hsqrtσ0E_nonneg + have h₂ : 0 ≤ K₁ * Z * G := + mul_nonneg (mul_nonneg hK₁_nonneg hZ_nonneg) hG_nonneg + linarith + -- assemble + have hgoal : + assemblyCompressedTwoExponentRHSOfScalar σ0 hσ0 Ccg α τ s r r₂ X aω ha + m J g w = + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (Ccg * + (r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) + + Real.rpow r (-(5 / 2 : ℝ)) * DW * M + + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M)) * + (DIW * G))) := by + dsimp [assemblyCompressedTwoExponentRHSOfScalar] + rw [hH_eq, hN_eq, hB₁_eq] + have htarget : + assemblyHomogenizationComparisonRHSOfScalar σ0 hσ0 + (s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * Ccg * (K₁ + K₂)) + (α / 8) r₂ X aω ha m g w = + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * Ccg * + ((K₁ + K₂) * Z * (Real.sqrt σ0 * E + G)) := by + dsimp [assemblyHomogenizationComparisonRHSOfScalar] + rw [hE_def, hG_def, hZ_def, hY_def] + ring + rw [hgoal, htarget] + calc + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (Ccg * + (r⁻¹ * Real.sqrt σ0 * (DW * (DB * dec)) * E + + (Real.rpow r (-(5 / 2 : ℝ)) * Real.sqrt σ0 * DHW * L * + (DW * (DB * dec)) + + Real.rpow r (-(5 / 2 : ℝ)) * DW * M + + Real.rpow r (-3 : ℝ) * DW * σ0 * (σ0⁻¹ * M)) * + (DIW * G))) + ≤ s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (Ccg * ((K₁ + K₂) * Z * (Real.sqrt σ0 * E + G))) := by + refine mul_le_mul_of_nonneg_left ?_ houter_pos.le + exact mul_le_mul_of_nonneg_left hbracket hCcg.le + _ = s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * Ccg * + ((K₁ + K₂) * Z * (Real.sqrt σ0 * E + G)) := by + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyRHS.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyRHS.lean new file mode 100644 index 0000000000..3da52a1dca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssemblyRHS.lean @@ -0,0 +1,564 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationAssembly + +/-! # Homogenization Assembly RHS -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder + +/-! +# Deterministic RHS compression for the Section 5.7 assembly + +This file takes the controlled factors supplied by +`HomogenizationAssembly.lean` and substitutes them into the deterministic Ch3 +coarse-graining RHS. +-/ + +noncomputable section + +noncomputable def assemblyLowerEllipticityEnvelopeOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (α τ r : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (m : ℕ) : ℝ := + Real.sqrt + (σ0⁻¹ * assemblyEllipticityEnvelope (d := d) α τ r X aω m) + +noncomputable def assemblyLowerEllipticityEnvelope {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (_hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (α τ r : ℝ) (X : RegCoeffField d → ℝ) (aω : RegCoeffField d) + (m : ℕ) : ℝ := + assemblyLowerEllipticityEnvelopeOfScalar + (barSigmaLimit hP hStruct) α τ r X aω m + +/-- Scale-separated Ch3 RHS after substituting the collapsed minimal-scale +bounds. The local coefficient/ellipticity factors are controlled at exponent +`r`, while the forcing is measured at exponent `r₂` and carries the inverse +depth weight from the repaired Ch3 estimate. -/ +noncomputable def assemblyCompressedTwoExponentRHSOfScalar {d : ℕ} [NeZero d] + (σ0 : ℝ) (hσ0 : 0 < σ0) + (Ccg α τ s r r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) : ℝ := + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar σ0 hσ0 + let B₁ : ℝ := assemblyErrorEnvelope (d := d) α τ r X aω m + let M : ℝ := assemblyEllipticityEnvelope (d := d) α τ r X aω m + let L : ℝ := assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m + s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ * + (Ccg * + (r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 * + (Ch03.coarseGrainingDepthWeight r j * B₁) * + Ch03.h1EnergyNormOnCube Q F w.u + + (Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + L * + (Ch03.coarseGrainingDepthWeight r j * B₁) + + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j * + M + + Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 * + (σ0⁻¹ * M)) * + (Ch03.coarseGrainingDepthInvWeight r₂ j * + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g))) + +/-- Finite-`sigma` wrapper for the scale-separated compressed Ch3 RHS. -/ +noncomputable def assemblyCompressedTwoExponentRHS {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Ccg α τ s r r₂ : ℝ) (X : RegCoeffField d → ℝ) + (aω : RegCoeffField d) (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m j : ℕ) (g : Vec d → Vec d) + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) : ℝ := + assemblyCompressedTwoExponentRHSOfScalar + (barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + Ccg α τ s r r₂ X aω ha m j g w + +theorem poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) {s : ℝ} (_hs : 0 < s) : + Ch03.poincareLowerEllipticityFactor Q a s (.finite 2) = + Real.sqrt ((Ch02.lambdaSq Q s (.finite 2) a)⁻¹) := by + have hleft : + Real.sqrt ((Ch02.lambdaSq Q s (.finite 2) a)⁻¹) = + Real.rpow (Ch02.lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_neg_eq_inv_rpow] + rw [← Real.rpow_eq_pow] + ring_nf + have hExp : (-1 / 2 : ℝ) = (-(1 / 2 : ℝ)) := by ring + simpa [Ch03.poincareLowerEllipticityFactor, hExp] using hleft.symm + +theorem poincareUpperEllipticityFactor_finite_two_eq_sqrt + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) {s : ℝ} (_hs : 0 < s) : + Ch03.poincareUpperEllipticityFactor Q a s (.finite 2) = + Real.sqrt (Ch02.LambdaSq Q s (.finite 2) a) := by + simp [Ch03.poincareUpperEllipticityFactor, Real.sqrt_eq_rpow] + +theorem lambdaSq_finite_two_rpow_neg_one_eq_inv + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) {s : ℝ} (hs : 0 < s) : + Real.rpow (Ch02.lambdaSq Q s (.finite 2) a) (-1 : ℝ) = + (Ch02.lambdaSq Q s (.finite 2) a)⁻¹ := by + have hlam : 0 < Ch02.lambdaSq Q s (.finite 2) a := + Ch02.lambdaSq_finite_pos Q a hs (by norm_num : (1 : ℝ) ≤ 2) + simpa using (Real.rpow_neg hlam.le (1 : ℝ)) + +theorem coarseGrainingHomogenizationErrorAtDepth_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Ch03.ConstantCoeffMatrix d) + {s : ℝ} (hs : 0 < s) (j : ℕ) : + 0 ≤ Ch03.coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := by + unfold Ch03.coarseGrainingHomogenizationErrorAtDepth + exact Ch02.finsetSupReal_nonneg (descendantsAtDepth Q j) _ + (fun R _hR => Ch02.HomogenizationErrorOnCube_infinity_one_nonneg + R a a0.matrix hs) + +theorem assemblyLowerEllipticityFactor_le_ofScalar + {d : ℕ} [NeZero d] {σ0 : ℝ} (hσ0 : 0 < σ0) + {α τ r : ℝ} {X : RegCoeffField d → ℝ} {aω : RegCoeffField d} + {m : ℕ} (ha : Ch04.AELocallyUniformlyEllipticField aω) + (hr : 0 < r) + (hlambda : + (Ch02.lambdaSq (assemblyOriginCube d m) (r / 2) (.finite 2) + (assemblyCoeffFamily aω ha))⁻¹ ≤ + σ0⁻¹ * + assemblyEllipticityEnvelope (d := d) α τ r X aω m) : + Ch03.poincareLowerEllipticityFactor (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) (r / 2) (.finite 2) ≤ + assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m := by + have hr2 : 0 < r / 2 := half_pos hr + have hM_nonneg : + 0 ≤ assemblyEllipticityEnvelope (d := d) α τ r X aω m := by + dsimp [assemblyEllipticityEnvelope] + positivity + have htarget_nonneg : + 0 ≤ σ0⁻¹ * + assemblyEllipticityEnvelope (d := d) α τ r X aω m := + mul_nonneg (inv_nonneg.mpr hσ0.le) hM_nonneg + calc + Ch03.poincareLowerEllipticityFactor (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) (r / 2) (.finite 2) + = Real.sqrt + ((Ch02.lambdaSq (assemblyOriginCube d m) (r / 2) + (.finite 2) (assemblyCoeffFamily aω ha))⁻¹) := + poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) hr2 + _ ≤ Real.sqrt + (σ0⁻¹ * + assemblyEllipticityEnvelope (d := d) α τ r X aω m) := + Real.sqrt_le_sqrt hlambda + _ = assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m := rfl + +theorem assemblyLowerEllipticityFactor_le + {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {α τ r : ℝ} {X : RegCoeffField d → ℝ} {aω : RegCoeffField d} + {m : ℕ} (ha : Ch04.AELocallyUniformlyEllipticField aω) + (hr : 0 < r) + (hlambda : + (Ch02.lambdaSq (assemblyOriginCube d m) (r / 2) (.finite 2) + (assemblyCoeffFamily aω ha))⁻¹ ≤ + (barSigmaLimit hP hStruct)⁻¹ * + assemblyEllipticityEnvelope (d := d) α τ r X aω m) : + Ch03.poincareLowerEllipticityFactor (assemblyOriginCube d m) + (assemblyCoeffFamily aω ha) (r / 2) (.finite 2) ≤ + assemblyLowerEllipticityEnvelope hP hStruct hΓ α τ r X aω m := by + simpa [assemblyLowerEllipticityEnvelope] using + assemblyLowerEllipticityFactor_le_ofScalar + (σ0 := barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + (α := α) (τ := τ) (r := r) (X := X) (aω := aω) + (m := m) ha hr hlambda + +/-- Substitute the controlled factors into the repaired scale-separated Ch3 +deterministic RHS. -/ +theorem assemblyControlledFactors_lhs_le_compressedTwoExponentRHS_ofScalar + {d : ℕ} [NeZero d] {σ0 : ℝ} (hσ0 : 0 < σ0) + {Ccg α τ s r r₂ : ℝ} {X : RegCoeffField d → ℝ} + {aω : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d} + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) + (hCcg : 0 < Ccg) (hs : 0 < s) (hr : 0 < r) + (hrs : r < s / 2) (hs_lt_one : s < 1) + (hg : Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g) + (hctrl : + assemblyControlledFactorsTwoExponentConclusionOfScalar + σ0 hσ0 Ccg α τ s r r₂ X aω ha m j g w) : + Ch03.homogenizationComparisonNegativeBesovLHS + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrixOfScalar σ0 hσ0) s w.u w.v ≤ + assemblyCompressedTwoExponentRHSOfScalar + σ0 hσ0 Ccg α τ s r r₂ X aω ha m j g w := by + let Q : TriadicCube d := assemblyOriginCube d m + let F : Ch02.TriadicCoeffFamily d := assemblyCoeffFamily aω ha + let a0 : Ch03.ConstantCoeffMatrix d := + assemblyConstantCoeffMatrixOfScalar σ0 hσ0 + let B₁ : ℝ := assemblyErrorEnvelope (d := d) α τ r X aω m + let M : ℝ := assemblyEllipticityEnvelope (d := d) α τ r X aω m + let Lenv : ℝ := assemblyLowerEllipticityEnvelopeOfScalar σ0 α τ r X aω m + dsimp [assemblyControlledFactorsTwoExponentConclusionOfScalar, Q, F, a0, + B₁, M] at hctrl + rcases hctrl with ⟨hcomparison, hH, _hweighted, hlambdaInv, hsqrtProd⟩ + have hr_half : 0 < r / 2 := half_pos hr + have hLamRpow : + Real.rpow (Ch02.lambdaSq Q (r / 2) (.finite 2) F) (-1 : ℝ) ≤ + σ0⁻¹ * M := by + simpa [Q, F, M] using + (lambdaSq_finite_two_rpow_neg_one_eq_inv Q F hr_half).trans_le + hlambdaInv + have hLower : + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) ≤ + Lenv := by + simpa [Q, F, M, Lenv] using + assemblyLowerEllipticityFactor_le_ofScalar (σ0 := σ0) hσ0 + (α := α) (τ := τ) (r := r) (X := X) (aω := aω) + (m := m) ha hr hlambdaInv + have hProd : + Ch03.poincareUpperEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) ≤ + M := by + rw [poincareUpperEllipticityFactor_finite_two_eq_sqrt Q F hr_half, + poincareLowerEllipticityFactor_finite_two_eq_sqrt_inv Q F hr_half] + exact hsqrtProd + have hH_nonneg : + 0 ≤ Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j := + coarseGrainingHomogenizationErrorAtDepth_nonneg Q F a0 hr j + have hHbd_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r j * B₁ := + hH_nonneg.trans hH + have hLenv_nonneg : 0 ≤ Lenv := by + dsimp [Lenv, assemblyLowerEllipticityEnvelopeOfScalar] + exact Real.sqrt_nonneg _ + have hM_nonneg : 0 ≤ M := by + dsimp [M, assemblyEllipticityEnvelope] + positivity + have hBsemi_nonneg : + 0 ≤ Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g := by + simpa [Q] using + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo_nonneg_of_forceBesovRegularity + (Q := assemblyOriginCube d m) (s := r₂) (g := g) hg + have hforceWeight_nonneg : + 0 ≤ Ch03.coarseGrainingDepthInvWeight r₂ j * + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g := by + exact mul_nonneg (by + dsimp [Ch03.coarseGrainingDepthInvWeight, Ch03.coarseGrainingDepthWeight] + positivity) hBsemi_nonneg + have hEnergy_nonneg : 0 ≤ Ch03.h1EnergyNormOnCube Q F w.u := by + dsimp [Ch03.h1EnergyNormOnCube] + positivity + have hMhalf_nonneg : 0 ≤ Ch03.constantCoeffMatrixNormHalf a0 := by + dsimp [Ch03.constantCoeffMatrixNormHalf] + exact Real.rpow_nonneg (Ch02.matrixNorm_nonneg a0.matrix) _ + have hMnorm_nonneg : 0 ≤ Ch03.constantCoeffMatrixNorm a0 := by + dsimp [Ch03.constantCoeffMatrixNorm] + exact Ch02.matrixNorm_nonneg a0.matrix + have hdepth_nonneg : 0 ≤ Ch03.coarseGrainingDepthWeight r j := by + dsimp [Ch03.coarseGrainingDepthWeight] + positivity + have hdepthHalf_nonneg : 0 ≤ Ch03.coarseGrainingDepthHalfWeight r j := by + dsimp [Ch03.coarseGrainingDepthHalfWeight] + positivity + have houter_nonneg : + 0 ≤ s⁻¹ * (r⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - r)⁻¹ := by + have hr_lt_half : r < (1 / 2 : ℝ) := by nlinarith + exact mul_nonneg + (mul_nonneg (inv_nonneg.mpr hs.le) (sq_nonneg r⁻¹)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_half.le)) + have hCcg_nonneg : 0 ≤ Ccg := hCcg.le + have hterm₁ : + r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j * + Ch03.h1EnergyNormOnCube Q F w.u ≤ + r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 * + (Ch03.coarseGrainingDepthWeight r j * B₁) * + Ch03.h1EnergyNormOnCube Q F w.u := by + have hcoeff : + 0 ≤ r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 := + mul_nonneg (inv_nonneg.mpr hr.le) hMhalf_nonneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hH hcoeff) hEnergy_nonneg + have hterm₂a : + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j ≤ + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Lenv * + (Ch03.coarseGrainingDepthWeight r j * B₁) := by + have hcoeff : + 0 ≤ Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j := by + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hr.le _) hMhalf_nonneg) + hdepthHalf_nonneg + calc + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j + ≤ + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Lenv * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hLower hcoeff) hH_nonneg + _ ≤ + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Lenv * + (Ch03.coarseGrainingDepthWeight r j * B₁) := by + have hcoeff₂ : + 0 ≤ Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Lenv := mul_nonneg hcoeff hLenv_nonneg + exact mul_le_mul_of_nonneg_left hH hcoeff₂ + have hterm₂b : + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.poincareUpperEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) ≤ + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j * + M := by + have hcoeff : + 0 ≤ Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j := + mul_nonneg (Real.rpow_nonneg hr.le _) hdepth_nonneg + simpa [mul_assoc] using mul_le_mul_of_nonneg_left hProd hcoeff + have hterm₂c : + Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 * + Real.rpow (Ch02.lambdaSq Q (r / 2) (.finite 2) F) (-1 : ℝ) ≤ + Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 * + (σ0⁻¹ * M) := by + have hcoeff : + 0 ≤ Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 := by + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hr.le _) hdepth_nonneg) + hMnorm_nonneg + exact mul_le_mul_of_nonneg_left hLamRpow hcoeff + have hbracket : + r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j * + Ch03.h1EnergyNormOnCube Q F w.u + + (Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.coarseGrainingHomogenizationErrorAtDepth Q F a0 r j + + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.poincareUpperEllipticityFactor Q F (r / 2) (.finite 2) * + Ch03.poincareLowerEllipticityFactor Q F (r / 2) (.finite 2) + + Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 * + Real.rpow (Ch02.lambdaSq Q (r / 2) (.finite 2) F) (-1 : ℝ)) * + (Ch03.coarseGrainingDepthInvWeight r₂ j * + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g) + ≤ + r⁻¹ * Ch03.constantCoeffMatrixNormHalf a0 * + (Ch03.coarseGrainingDepthWeight r j * B₁) * + Ch03.h1EnergyNormOnCube Q F w.u + + (Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.constantCoeffMatrixNormHalf a0 * + Ch03.coarseGrainingDepthHalfWeight r j * + Lenv * + (Ch03.coarseGrainingDepthWeight r j * B₁) + + Real.rpow r (-(5 / 2 : ℝ)) * + Ch03.coarseGrainingDepthWeight r j * + M + + Real.rpow r (-3 : ℝ) * + Ch03.coarseGrainingDepthWeight r j * + Ch03.constantCoeffMatrixNorm a0 * + (σ0⁻¹ * M)) * + (Ch03.coarseGrainingDepthInvWeight r₂ j * + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo Q r₂ g) := by + exact add_le_add hterm₁ + (mul_le_mul_of_nonneg_right + (add_le_add (add_le_add hterm₂a hterm₂b) hterm₂c) + hforceWeight_nonneg) + have hgeneral_le : + Ch03.generalCoarseGrainingL2TwoExponentRHS Ccg Q F a0 s r r₂ j g w.u ≤ + assemblyCompressedTwoExponentRHSOfScalar + σ0 hσ0 Ccg α τ s r r₂ X aω ha m j g w := by + dsimp [Ch03.generalCoarseGrainingL2TwoExponentRHS, + Ch03.generalCoarseGrainingL2TwoExponentFluxDefectRHS, + assemblyCompressedTwoExponentRHSOfScalar, Q, F, a0, B₁, M, Lenv] + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hbracket hCcg_nonneg) houter_nonneg + exact hcomparison.trans hgeneral_le + +/-- Finite-`sigma` wrapper for the scale-separated deterministic RHS +substitution. -/ +theorem assemblyControlledFactors_lhs_le_compressedTwoExponentRHS + {d : ℕ} [NeZero d] + {P : Ch04.RestrictionCoeffLaw d} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {Ccg α τ s r r₂ : ℝ} {X : RegCoeffField d → ℝ} + {aω : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d} + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g) + (hCcg : 0 < Ccg) (hs : 0 < s) (hr : 0 < r) + (hrs : r < s / 2) (hs_lt_one : s < 1) + (hg : Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g) + (hctrl : + assemblyControlledFactorsTwoExponentConclusion + hP hStruct hΓ Ccg α τ s r r₂ X aω ha m j g w) : + Ch03.homogenizationComparisonNegativeBesovLHS + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrix hP hStruct hΓ) s w.u w.v ≤ + assemblyCompressedTwoExponentRHS + hP hStruct hΓ Ccg α τ s r r₂ X aω ha m j g w := by + simpa [assemblyConstantCoeffMatrix, assemblyCompressedTwoExponentRHS, + assemblyControlledFactorsTwoExponentConclusion] using + assemblyControlledFactors_lhs_le_compressedTwoExponentRHS_ofScalar + (σ0 := barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + (Ccg := Ccg) (α := α) (τ := τ) (s := s) (r := r) + (r₂ := r₂) (X := X) (aω := aω) ha (m := m) (j := j) + (g := g) w hCcg hs hr hrs hs_lt_one hg hctrl + +/-- Sigma-agnostic a.e. handoff for the repaired two-exponent Ch3 assembly. -/ +theorem ae_homogenizationComparison_compressedTwoExponentRHSOfScalar_of_ae_controlledFactors + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {σ0 : ℝ} (hσ0 : 0 < σ0) + {Ccg α τ s r r₂ : ℝ} {X : RegCoeffField d → ℝ} + (hCcg : 0 < Ccg) (hs : 0 < s) (hr : 0 < r) + (hrs : r < s / 2) (hs_lt_one : s < 1) + (hctrl : + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d}, + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g) → + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + assemblyControlledFactorsTwoExponentConclusionOfScalar + σ0 hσ0 Ccg α τ s r r₂ X aω ha m j g w) : + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d} + (w : assemblyComparisonDatumOfScalar σ0 hσ0 aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + Ch03.homogenizationComparisonNegativeBesovLHS + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrixOfScalar σ0 hσ0) s w.u w.v ≤ + assemblyCompressedTwoExponentRHSOfScalar + σ0 hσ0 Ccg α τ s r r₂ X aω ha m j g w := by + filter_upwards [hctrl] with aω hpoint + intro ha m j g w hXm hg + exact + assemblyControlledFactors_lhs_le_compressedTwoExponentRHS_ofScalar + (σ0 := σ0) hσ0 (Ccg := Ccg) (α := α) (τ := τ) + (s := s) (r := r) (r₂ := r₂) (X := X) (aω := aω) ha + (m := m) (j := j) (g := g) w hCcg hs hr hrs hs_lt_one hg + (hpoint ha w hXm hg) + +/-- Finite-`sigma` homogenization comparison above one collapsed minimal scale, +using the repaired scale-separated forcing exponent. -/ +theorem exists_homogenizationComparison_compressedTwoExponentRHS_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccg α : ℝ, 0 < Ccg ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {σ τ s r r₂ : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 < s → + 0 < r → + r < s / 2 → + s < 1 → + τ < r → + r ≤ r₂ → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m j : ℕ} {g : Vec d → Vec d} + (w : assemblyComparisonDatum hP hStruct hΓ aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.ForceBesovRegularity (assemblyOriginCube d m) r₂ g → + Ch03.homogenizationComparisonNegativeBesovLHS + (assemblyOriginCube d m) (assemblyCoeffFamily aω ha) + (assemblyConstantCoeffMatrix hP hStruct hΓ) + s w.u w.v ≤ + assemblyCompressedTwoExponentRHS + hP hStruct hΓ Ccg α τ s r r₂ X aω ha m j g w := by + obtain ⟨Ccg, α, hCcg, hα, hαmax, hcontrolled⟩ := + exists_homogenizationComparison_controlledFactors_twoExponent_interpolated_expLogSq + (d := d) params + refine ⟨Ccg, α, hCcg, hα, hαmax, ?_⟩ + intro σ τ s r r₂ hσ hτ hατ hτ_one hs hr hrs hs_one hτr hr₂ + dsimp only + obtain ⟨Cscale, hCscale, hlaw⟩ := + hcontrolled hσ hτ hατ hτ_one hs hr hrs hs_one hτr hr₂ + refine ⟨Cscale, hCscale, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + obtain ⟨X, hXO, hXone, hAE⟩ := + hlaw hP hStruct hΓ hσ_eq hparams + refine ⟨X, hXO, hXone, ?_⟩ + simpa [assemblyComparisonDatum, assemblyConstantCoeffMatrix, + assemblyControlledFactorsTwoExponentConclusion, + assemblyCompressedTwoExponentRHS] using + ae_homogenizationComparison_compressedTwoExponentRHSOfScalar_of_ae_controlledFactors + (P := P) (σ0 := barSigmaLimit hP hStruct) hΓ.barSigmaLimit_pos + (Ccg := Ccg) (α := α) (τ := τ) (s := s) (r := r) + (r₂ := r₂) (X := X) hCcg hs hr hrs hs_one hAE + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorClosed.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorClosed.lean new file mode 100644 index 0000000000..31e3987850 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorClosed.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorFiniteQ + +/-! # Homogenization Error Closed -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped ENNReal MatrixOrder BigOperators + +/-! +# Closed finite-q homogenization-error bounds + +This file packages the deterministic summation step in the form used by the +Section 5.7 minimal-scale corollary: once every scale response is controlled by +one algebraic envelope, the whole finite-`q` multiscale error is controlled by +the same envelope. +-/ + +noncomputable section + +/-- Closed finite-`q` `\mathcal E` control from one scale-by-scale envelope. + +The displayed right-hand side is the geometric summation constant times the +`q`-power of the single envelope. In applications `R` is the collapsed +minimal-scale factor, for instance `sqrt ((3^m / X)^(-alpha))`. -/ +theorem homogenizationErrorFinite_le_of_scaleResponseEnvelope + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + Ch02.HomogenizationError Q n r + Ch02.MultiscaleExponent.infinity (.finite q) a a0 ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) + (1 / q) := by + simpa [Ch02.HomogenizationError] using + homogenizationErrorFinite_infinity_le_of_scaleResponse_le + (Q := Q) (n := n) hn a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := R) + hdelta hrq hdeltaq hq hA hR hscale + +/-- Same as `homogenizationErrorFinite_le_of_scaleResponseEnvelope`, with the +geometric constant pulled out of the `q`-root. -/ +theorem homogenizationErrorFinite_le_const_mul_of_scaleResponseEnvelope + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + let Cgeom : ℝ := + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹) + (1 / q); + Ch02.HomogenizationError Q n r + Ch02.MultiscaleExponent.infinity (.finite q) a a0 ≤ + Cgeom * A * R := by + let G : ℝ := + Ch02.geometricDiscount r q * (Ch02.geometricDiscount delta q)⁻¹ + let Cgeom : ℝ := Real.rpow G (1 / q) + have hG_nonneg : 0 ≤ G := by + have hdisc_r_nonneg : 0 ≤ Ch02.geometricDiscount r q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq + have hdisc_delta_pos : 0 < Ch02.geometricDiscount delta q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hdeltaq + dsimp [G] + positivity + have hmain := + homogenizationErrorFinite_le_of_scaleResponseEnvelope + (Q := Q) (n := n) hn a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := R) + hdelta hrq hdeltaq hq hA hR hscale + have hAq_nonneg : 0 ≤ Real.rpow A q := Real.rpow_nonneg hA q + have hRq_nonneg : 0 ≤ Real.rpow R q := Real.rpow_nonneg hR q + have hq_ne : q ≠ 0 := ne_of_gt hq + have hA_root : Real.rpow (Real.rpow A q) (1 / q) = A := by + rw [one_div] + exact Real.rpow_rpow_inv hA hq_ne + have hR_root : Real.rpow (Real.rpow R q) (1 / q) = R := by + rw [one_div] + exact Real.rpow_rpow_inv hR hq_ne + have hroot : + Real.rpow (G * Real.rpow A q * Real.rpow R q) (1 / q) = + Cgeom * A * R := by + have hmul₁ : + Real.rpow (G * Real.rpow A q * Real.rpow R q) (1 / q) = + Real.rpow (G * Real.rpow A q) (1 / q) * + Real.rpow (Real.rpow R q) (1 / q) := by + simpa [mul_assoc] using + Real.mul_rpow + (x := G * Real.rpow A q) (y := Real.rpow R q) (z := 1 / q) + (mul_nonneg hG_nonneg hAq_nonneg) hRq_nonneg + have hmul₂ : + Real.rpow (G * Real.rpow A q) (1 / q) = + Real.rpow G (1 / q) * + Real.rpow (Real.rpow A q) (1 / q) := by + simpa using + Real.mul_rpow + (x := G) (y := Real.rpow A q) (z := 1 / q) + hG_nonneg hAq_nonneg + rw [hmul₁, hmul₂, hA_root, hR_root] + exact hmain.trans (by simpa [G, Cgeom] using le_of_eq hroot) + +/-- Closed finite-`q` control on a whole cube. -/ +theorem homogenizationErrorOnCube_le_of_scaleResponseEnvelope + {d : ℕ} [NeZero d] + (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale Q (Q.scale - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite q) a a0 ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) + (1 / q) := by + simpa [Ch02.HomogenizationErrorOnCube] using + homogenizationErrorFinite_le_of_scaleResponseEnvelope + (Q := Q) (n := Q.scale) le_rfl a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := R) + hdelta hrq hdeltaq hq hA hR hscale + +/-- Whole-cube version with the geometric constant pulled out. -/ +theorem homogenizationErrorOnCube_le_const_mul_of_scaleResponseEnvelope + {d : ℕ} [NeZero d] + (Q : TriadicCube d) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale Q (Q.scale - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + let Cgeom : ℝ := + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹) + (1 / q); + Ch02.HomogenizationErrorOnCube Q r + Ch02.MultiscaleExponent.infinity (.finite q) a a0 ≤ + Cgeom * A * R := by + simpa [Ch02.HomogenizationErrorOnCube] using + homogenizationErrorFinite_le_const_mul_of_scaleResponseEnvelope + (Q := Q) (n := Q.scale) le_rfl a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := R) + hdelta hrq hdeltaq hq hA hR hscale + +/-- Origin-cube version with the minimal-scale factor already collapsed into +`X`. This is the deterministic target shape for the Section 5.7 stochastic +corollary. -/ +theorem homogenizationErrorOnOriginCube_le_of_scaleResponseMinimalEnvelope + {d : ℕ} [NeZero d] {m : ℕ} + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A X alpha : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hX : 0 < X) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-alpha))) : + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) a a0 ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-alpha)) := by + have hbase_pos : 0 < (3 : ℝ) ^ m / X := + div_pos (by positivity) hX + have hR : 0 ≤ Real.sqrt (((3 : ℝ) ^ m / X) ^ (-alpha)) := by + positivity + exact + homogenizationErrorOnCube_le_const_mul_of_scaleResponseEnvelope + (Q := originCube d ((m : ℕ) : ℤ)) a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-alpha))) + hdelta hrq hdeltaq hq hA hR hscale + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorControl.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorControl.lean new file mode 100644 index 0000000000..bea863b5aa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorControl.lean @@ -0,0 +1,877 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.EllipticityControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.HomogenizationError.Finite + +/-! # Homogenization Error Control -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open Section54.VarianceBoundGoodScale +open scoped ENNReal MatrixOrder + +/-! +# Finite-q homogenization-error control above the minimal scale + +This file begins the Section 5.7 corollary converting the localized +minimal-scale `J` estimate into finite-`q` control of +`\mathcal E_{r,\infty,q}`. The first lemma is the deterministic geometric +summation step: after each weighted scale response term is bounded by a +summable geometric row, the finite-`q` homogenization error is bounded by the +corresponding `q`-root. +-/ + +noncomputable section + +/-- For a scalar reference coefficient, the Chapter 2 full block matrix is the +diagonal matrix with entries `σ` and `σ⁻¹`. -/ +theorem constantFullBlockMatrix_scalarMatrix_eq_diagonal + {d : ℕ} [NeZero d] {σ : ℝ} (hσ : 0 < σ) : + Ch02.constantFullBlockMatrix (scalarMatrix (d := d) σ) = + Matrix.diagonal (fun α : BlockCoord d => + match α with + | Sum.inl _ => σ + | Sum.inr _ => σ⁻¹) := by + change toFullBlockMat (Ch02.constantBlockMatrix (scalarMatrix (d := d) σ)) = _ + rw [Ch02.constantBlockMatrix_scalarMatrix hσ] + ext α β + cases α with + | inl i => + cases β with + | inl j => + by_cases hij : i = j + · subst j + simp [toFullBlockMat, scalarMatrix, Matrix.diagonal] + · simp [toFullBlockMat, scalarMatrix, Matrix.diagonal, hij] + | inr j => + simp [toFullBlockMat, Matrix.diagonal] + | inr i => + cases β with + | inl j => + simp [toFullBlockMat, Matrix.diagonal] + | inr j => + by_cases hij : i = j + · subst j + simp [toFullBlockMat, scalarMatrix, Matrix.diagonal] + · simp [toFullBlockMat, scalarMatrix, Matrix.diagonal, hij] + +/-- The Chapter 2 square-root normalizer agrees with the Section 5.7 scalar +normalizer for a scalar reference coefficient. -/ +theorem constantFullBlockMatrixSqrt_scalarMatrix_eq_scalarFullBlockSqrt + {d : ℕ} [NeZero d] {σ : ℝ} (hσ : 0 < σ) : + Ch02.constantFullBlockMatrixSqrt (scalarMatrix (d := d) σ) = + Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) σ σ) := by + let D : FullBlockMat d := + Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) σ σ) + have hD_nonneg : 0 ≤ D := by + have hentries : 0 ≤ Section56.scalarFullBlockSqrtDiag (d := d) σ σ := by + intro α + cases α <;> simp [Section56.scalarFullBlockSqrtDiag] + exact (Matrix.PosSemidef.diagonal hentries).nonneg + have hsq : D * D = Ch02.constantFullBlockMatrix (scalarMatrix (d := d) σ) := by + rw [constantFullBlockMatrix_scalarMatrix_eq_diagonal hσ] + dsimp [D] + rw [Matrix.diagonal_mul_diagonal] + ext α β + cases α with + | inl i => + cases β with + | inl j => + by_cases hij : i = j + · subst j + simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal] + rw [Real.mul_self_sqrt hσ.le] + · simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal, hij] + | inr j => + simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal] + | inr i => + cases β with + | inl j => + simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal] + | inr j => + by_cases hij : i = j + · subst j + simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal] + rw [← mul_inv] + rw [Real.mul_self_sqrt hσ.le] + · simp [Section56.scalarFullBlockSqrtDiag, Matrix.diagonal, hij] + dsimp [Ch02.constantFullBlockMatrixSqrt] + exact CFC.sqrt_unique hsq hD_nonneg + +/-- Coordinatewise inverse of the scalar square-root diagonal used in Section +5.7. -/ +theorem ringInverse_scalarFullBlockSqrtDiag_eq_scalarFullBlockInvSqrtDiag + {d : ℕ} [NeZero d] {σ : ℝ} (hσ : 0 < σ) : + Ring.inverse (Section56.scalarFullBlockSqrtDiag (d := d) σ σ) = + Ch04.scalarFullBlockInvSqrtDiag (d := d) σ σ := by + let v : BlockCoord d → ℝ := Section56.scalarFullBlockSqrtDiag (d := d) σ σ + let w : BlockCoord d → ℝ := Ch04.scalarFullBlockInvSqrtDiag (d := d) σ σ + have hvw : v * w = 1 := by + funext α + cases α + · simp [v, w, Section56.scalarFullBlockSqrtDiag, + Ch04.scalarFullBlockInvSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + · simp [v, w, Section56.scalarFullBlockSqrtDiag, + Ch04.scalarFullBlockInvSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + have hwv : w * v = 1 := by + funext α + cases α + · simp [v, w, Section56.scalarFullBlockSqrtDiag, + Ch04.scalarFullBlockInvSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + · simp [v, w, Section56.scalarFullBlockSqrtDiag, + Ch04.scalarFullBlockInvSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + let u : (BlockCoord d → ℝ)ˣ := ⟨v, w, hvw, hwv⟩ + simpa [u, v, w] using Ring.inverse_unit u + +/-- The Chapter 2 inverse square-root normalizer agrees with the Section 5.7 +scalar inverse normalizer for a scalar reference coefficient. -/ +theorem constantFullBlockMatrixInvSqrt_scalarMatrix_eq_scalarFullBlockInvSqrt + {d : ℕ} [NeZero d] {σ : ℝ} (hσ : 0 < σ) : + Ch02.constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) σ) = + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) σ σ) := by + dsimp [Ch02.constantFullBlockMatrixInvSqrt] + rw [constantFullBlockMatrixSqrt_scalarMatrix_eq_scalarFullBlockSqrt hσ] + rw [Matrix.inv_diagonal] + rw [ringInverse_scalarFullBlockSqrtDiag_eq_scalarFullBlockInvSqrtDiag hσ] + +/-- Pointwise version of the finite-basis normalization step for sampled +coefficient fields. -/ +theorem limitNormalizedJProbeSum_le_four_normalizedProbeSum_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) : + limitNormalizedJProbeSum hP hStruct Q a ≤ + 4 * limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + classical + have hplus : + ∀ α β : BlockCoord d, + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := by + intro α β + let M : FullBlockMat d := limitNormalizedBlockJMatrix hP hStruct Q a + have hraw : + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockPlusProbe α β) a = + fullBlockQuadratic M (fullBlockPlusProbe α β) := by + simpa [M] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q (fullBlockPlusProbe α β) + have hscaled : + limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a = + fullBlockQuadratic M ((1 / 2 : ℝ) • fullBlockPlusProbe α β) := by + simpa [M] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q ((1 / 2 : ℝ) • fullBlockPlusProbe α β) + rw [hraw, hscaled, fullBlockQuadratic_vec_smul] + ring + have hminus : + ∀ α β : BlockCoord d, + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + 4 * limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := by + intro α β + let M : FullBlockMat d := limitNormalizedBlockJMatrix hP hStruct Q a + have hraw : + limitNormalizedBlockJObservable hP hStruct Q + (fullBlockMinusProbe α β) a = + fullBlockQuadratic M (fullBlockMinusProbe α β) := by + simpa [M] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q (fullBlockMinusProbe α β) + have hscaled : + limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a = + fullBlockQuadratic M ((1 / 2 : ℝ) • fullBlockMinusProbe α β) := by + simpa [M] using + limitNormalizedBlockJObservable_eq_limitNormalizedBlockJMatrix_quadratic_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q ((1 / 2 : ℝ) • fullBlockMinusProbe α β) + rw [hraw, hscaled, fullBlockQuadratic_vec_smul] + ring + unfold limitNormalizedJProbeSum limitNormalizedJNormalizedProbeSum + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro α _hα + rw [Finset.mul_sum] + refine Finset.sum_le_sum ?_ + intro β _hβ + rw [hplus α β, hminus α β] + have hcoord_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + (fullBlockCoordinateProbe α) a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg Q + (scalarLimitInvSqrtBlockVec hP hStruct (fullBlockCoordinateProbe α)) + (scalarLimitSqrtBlockVec hP hStruct (fullBlockCoordinateProbe α)) a + have hplus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg Q + (scalarLimitInvSqrtBlockVec hP hStruct + ((1 / 2 : ℝ) • fullBlockPlusProbe α β)) + (scalarLimitSqrtBlockVec hP hStruct + ((1 / 2 : ℝ) • fullBlockPlusProbe α β)) a + have hminus_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg Q + (scalarLimitInvSqrtBlockVec hP hStruct + ((1 / 2 : ℝ) • fullBlockMinusProbe α β)) + (scalarLimitSqrtBlockVec hP hStruct + ((1 / 2 : ℝ) • fullBlockMinusProbe α β)) a + nlinarith + +/-- One-cube bridge from the Chapter 2 normalized block-response maximum to the +Section 5.7 finite normalized probe sum. -/ +theorem normalizedBlockResponseMax_scalarMatrix_le_limitNormalizedJNormalizedProbeSum_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + (Q : TriadicCube d) : + Ch02.normalizedBlockResponseMax Q + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let σ : ℝ := barSigmaLimit hP hStruct + have hσ : 0 < σ := by + simpa [σ] using hΓ.barSigmaLimit_pos + unfold Ch02.normalizedBlockResponseMax + refine csSup_le (Ch02.normalizedBlockResponseValueSet_nonempty Q F + (scalarMatrix (d := d) σ)) ?_ + rintro x ⟨e, he, rfl⟩ + have he_dot : dotProduct e e ≤ 1 := by + have hdot_eq : dotProduct e e = 1 := by + simpa [Ch02.fullBlockVecNormSq, dotProduct, pow_two] using he + exact le_of_eq hdot_eq + have hJ : + Ch02.doubledResponseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixInvSqrt + (scalarMatrix (d := d) σ)) e)) + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixSqrt + (scalarMatrix (d := d) σ)) e)) = + limitNormalizedBlockJObservable hP hStruct Q e a := by + have hInv := + constantFullBlockMatrixInvSqrt_scalarMatrix_eq_scalarFullBlockInvSqrt + (d := d) hσ + have hSqrt := + constantFullBlockMatrixSqrt_scalarMatrix_eq_scalarFullBlockSqrt + (d := d) hσ + rw [hInv, hSqrt] + simpa [F, σ, limitNormalizedBlockJObservable, + scalarLimitInvSqrtBlockVec, scalarLimitSqrtBlockVec, + scalarLimitInvSqrtMatrix, scalarLimitSqrtMatrix] using + Ch04.doubledResponseJ_eq_blockJObservableCubeSetBlockVec_of_aelocallyUniformlyEllipticField + (a := a) ha Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + have hunit := + limitNormalizedBlockJObservable_le_probeSum_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q e he_dot + have hprobe := + limitNormalizedJProbeSum_le_four_normalizedProbeSum_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha Q + have hcard_nonneg : 0 ≤ (Fintype.card (BlockCoord d) : ℝ) := by + positivity + calc + Ch02.doubledResponseJ (Ch02.cubeDomain Q) (F.coeffOn Q) + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixInvSqrt + (scalarMatrix (d := d) σ)) e)) + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixSqrt + (scalarMatrix (d := d) σ)) e)) + = limitNormalizedBlockJObservable hP hStruct Q e a := hJ + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct Q a := hunit + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + (4 * limitNormalizedJNormalizedProbeSum hP hStruct Q a) := by + exact mul_le_mul_of_nonneg_left hprobe hcard_nonneg + _ = + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct Q a := by + ring + +/-- A descendant's normalized finite-probe sum is bounded by the localized +maximum over all descendants at the same scale. -/ +theorem limitNormalizedJNormalizedProbeSum_le_localizedLimitNormalizedJNormalizedProbeSumMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)) + (a : RegCoeffField d) : + limitNormalizedJNormalizedProbeSum hP hStruct R a ≤ + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := ⟨R, by simpa [D] using hR⟩ + dsimp [localizedLimitNormalizedJNormalizedProbeSumMax] + simp only [D, hD, dite_true] + exact Finset.le_sup' (s := D) + (f := fun S => limitNormalizedJNormalizedProbeSum hP hStruct S a) + (b := R) (by simpa [D] using hR) + +/-- Localized bridge from the Chapter 2 descendant response maximum to the +Section 5.7 finite normalized-probe maximum. -/ +theorem maxDescendantNormalizedBlockResponseAtScale_originCube_scalarMatrix_le_localizedNormalizedProbeJMax_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n : ℕ} (hnm : n ≤ m) : + Ch02.maxDescendantNormalizedBlockResponseAtScale + (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a := by + classical + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let σ : ℝ := barSigmaLimit hP hStruct + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + unfold Ch02.maxDescendantNormalizedBlockResponseAtScale Ch02.finsetSupReal + refine csSup_le ?_ ?_ + · rcases hD with ⟨R, hR⟩ + exact ⟨Ch02.normalizedBlockResponseMax R F (scalarMatrix (d := d) σ), + ⟨R, by simpa [D] using hR, rfl⟩⟩ + · rintro x ⟨R, hR, rfl⟩ + have hRmem : + R ∈ descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) := by + simpa [D] using hR + have hone := + normalizedBlockResponseMax_scalarMatrix_le_limitNormalizedJNormalizedProbeSum_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha R + have hloc := + limitNormalizedJNormalizedProbeSum_le_localizedLimitNormalizedJNormalizedProbeSumMax + hP hStruct hRmem a + have hprobe := + localizedLimitNormalizedJNormalizedProbeSumMax_le_probeJMax + hP hStruct hnm a + calc + Ch02.normalizedBlockResponseMax R F (scalarMatrix (d := d) σ) + ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct R a := hone + _ ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a := by + exact mul_le_mul_of_nonneg_left hloc (by positivity) + _ ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + ((Fintype.card (NormalizedProbeIndex d) : ℝ) * + localizedNormalizedProbeJMax hP hStruct m n a) := by + exact mul_le_mul_of_nonneg_left hprobe (by positivity) + _ = + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a := by + ring + +/-- If every normalized finite probe satisfies a weighted localized estimate, +then the finite-probe maximum satisfies the same weighted estimate. -/ +theorem weighted_localizedNormalizedProbeJMax_le_of_forall_probe + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} (a : RegCoeffField d) {W R : ℝ} + (hW : 0 < W) + (hprobe : ∀ i : NormalizedProbeIndex d, + W * localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) a ≤ R) : + W * localizedNormalizedProbeJMax hP hStruct m n a ≤ R := by + classical + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + have hsup_le : + localizedNormalizedProbeJMax hP hStruct m n a ≤ R / W := by + dsimp [localizedNormalizedProbeJMax] + change S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) ≤ R / W + refine Finset.sup'_le hS _ ?_ + intro i _hi + exact (le_div_iff₀ hW).2 (by simpa [mul_comm] using hprobe i) + calc + W * localizedNormalizedProbeJMax hP hStruct m n a ≤ W * (R / W) := + mul_le_mul_of_nonneg_left hsup_le hW.le + _ = R := by + field_simp [hW.ne'] + +/-- The limiting-normalized block response is nonnegative. -/ +theorem limitNormalizedBlockJObservable_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) (e : FullBlockVec d) (a : RegCoeffField d) : + 0 ≤ limitNormalizedBlockJObservable hP hStruct Q e a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) a + +/-- Localized limiting-normalized maxima are nonnegative. -/ +theorem localizedLimitNormalizedJMax_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} (hnm : n ≤ m) (e : FullBlockVec d) (a : RegCoeffField d) : + 0 ≤ localizedLimitNormalizedJMax hP hStruct m n e a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + rcases hD with ⟨R, hR⟩ + have hR_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct R e a := + limitNormalizedBlockJObservable_nonneg hP hStruct R e a + have hR_le : + limitNormalizedBlockJObservable hP hStruct R e a ≤ + localizedLimitNormalizedJMax hP hStruct m n e a := + limitNormalizedBlockJObservable_le_localizedLimitNormalizedJMax + hP hStruct e (by simpa [D] using hR) a + exact hR_nonneg.trans hR_le + +/-- The finite normalized-probe maximum is nonnegative. -/ +theorem localizedNormalizedProbeJMax_nonneg + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} (hnm : n ≤ m) (a : RegCoeffField d) : + 0 ≤ localizedNormalizedProbeJMax hP hStruct m n a := by + classical + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + rcases hS with ⟨i, hi⟩ + have hi_nonneg : + 0 ≤ localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) a := + localizedLimitNormalizedJMax_nonneg hP hStruct hnm (normalizedProbeVec i) a + have hi_le : + localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) a ≤ + localizedNormalizedProbeJMax hP hStruct m n a := by + dsimp [localizedNormalizedProbeJMax] + exact Finset.le_sup' (s := S) + (f := fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a) + hi + exact hi_nonneg.trans hi_le + +/-- Natural-scale response control from the localized finite normalized-probe +maximum. -/ +theorem scaleResponseAtScale_originCube_nat_le_sqrt_const_mul_localizedNormalizedProbeJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n : ℕ} (hnm : n ≤ m) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + ((4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a) := by + let Cprobe : ℝ := + 4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ) + have hk : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast hnm + have hmax := + maxDescendantNormalizedBlockResponseAtScale_originCube_scalarMatrix_le_localizedNormalizedProbeJMax_of_aelocallyUniformlyEllipticField + hP hStruct hΓ ha hnm + have hsqrt : + Real.sqrt + (Ch02.maxDescendantNormalizedBlockResponseAtScale + (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct))) ≤ + Real.sqrt (Cprobe * localizedNormalizedProbeJMax hP hStruct m n a) := by + simpa [Cprobe] using Real.sqrt_le_sqrt hmax + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) + = + Real.sqrt + (Ch02.maxDescendantNormalizedBlockResponseAtScale + (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct))) := by + rw [Ch02.scaleResponseAtScale_infinity_eq] + simp [Real.sqrt_eq_rpow] + _ ≤ Real.sqrt (Cprobe * localizedNormalizedProbeJMax hP hStruct m n a) := + hsqrt + _ = + Real.sqrt + ((4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a) := by + rfl + +/-- A deterministic finite-`q` summation principle for the Chapter 2 +homogenization error. + +The hypothesis `hterm` is exactly the pointwise weighted scale-row estimate +which comes from the localized `J` minimal-scale bound after choosing +`delta = r - tau / 2`. The conclusion is the finite-`q` `\ell^q` norm bound +in the definition of `HomogenizationErrorFinite`. -/ +theorem homogenizationErrorFinite_infinity_le_rpow_of_weighted_geometric_bound + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r delta q B : ℝ} + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hB : 0 ≤ B) + (hterm : ∀ l : ℕ, + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0) q ≤ + Ch02.geometricWeight delta q l * B) : + Ch02.HomogenizationErrorFinite Q n r + Ch02.MultiscaleExponent.infinity q a a0 ≤ + Real.rpow B (1 / q) := by + let f : ℕ → ℝ := fun l => + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0) q + let g : ℕ → ℝ := fun l => Ch02.geometricWeight delta q l * B + have hf_nonneg : ∀ l : ℕ, 0 ≤ f l := by + intro l + have hk : n - (l : ℤ) ≤ Q.scale := + (sub_le_self n (by exact_mod_cast Nat.zero_le l)).trans hn + exact mul_nonneg + (by + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := r) (q := q) l hrq) + (Real.rpow_nonneg + (Ch02.scaleResponseAtScale_infinity_nonneg Q hk a a0) q) + have hg_nonneg : ∀ l : ℕ, 0 ≤ g l := by + intro l + exact mul_nonneg + (by + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg + (s := delta) (q := q) l hdeltaq.le) + hB + have hg_summable : Summable g := by + have hbase : + Summable (fun l : ℕ => Homogenization.geometricWeight delta q l) := + Homogenization.summable_geometricWeight hdeltaq + have hscaled : + Summable (fun l : ℕ => + B * Homogenization.geometricWeight delta q l) := + hbase.mul_left B + simpa [g, Ch02.geometricWeight_eq_old, mul_comm, mul_left_comm, mul_assoc] + using hscaled + have hf_summable : Summable f := + Summable.of_nonneg_of_le hf_nonneg + (by + intro l + simpa [f, g] using hterm l) + hg_summable + have hsum_le : (∑' l : ℕ, f l) ≤ ∑' l : ℕ, g l := + Summable.tsum_le_tsum + (by + intro l + simpa [f, g] using hterm l) + hf_summable hg_summable + have hg_tsum : (∑' l : ℕ, g l) = B := by + have hbase : + Summable (fun l : ℕ => Homogenization.geometricWeight delta q l) := + Homogenization.summable_geometricWeight hdeltaq + calc + (∑' l : ℕ, g l) + = ∑' l : ℕ, B * Homogenization.geometricWeight delta q l := by + simp [g, Ch02.geometricWeight_eq_old, mul_comm] + _ = B * ∑' l : ℕ, Homogenization.geometricWeight delta q l := by + simpa using hbase.tsum_mul_left B + _ = B := by + rw [Homogenization.tsum_geometricWeight_eq_one hdeltaq] + ring + have hf_tsum_nonneg : 0 ≤ ∑' l : ℕ, f l := + tsum_nonneg hf_nonneg + have hf_tsum_le_B : (∑' l : ℕ, f l) ≤ B := by + simpa [hg_tsum] using hsum_le + unfold Ch02.HomogenizationErrorFinite + change Real.rpow (∑' l : ℕ, f l) (1 / q) ≤ Real.rpow B (1 / q) + exact Real.rpow_le_rpow hf_tsum_nonneg hf_tsum_le_B + (by positivity) + +/-- Convert a pointwise response bound with discount `tau / 2` into the +weighted geometric row bound used by +`homogenizationErrorFinite_infinity_le_rpow_of_weighted_geometric_bound`. + +This is the deterministic algebra behind the phrase "give up some `t` to get +finite `q`": if `delta = r - tau / 2` is positive, the extra +`3^{tau l / 2}` from taking the square root of a `J`-bound is absorbed by the +`r`-geometric weight. -/ +theorem weighted_scaleResponse_term_le_of_scaleResponse_le + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} {l : ℕ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : + Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0) q ≤ + Ch02.geometricWeight delta q l * + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) := by + have hk : n - (l : ℤ) ≤ Q.scale := + (sub_le_self n (by exact_mod_cast Nat.zero_le l)).trans hn + have hresp_nonneg : + 0 ≤ Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 := + Ch02.scaleResponseAtScale_infinity_nonneg Q hk a a0 + have hpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) := by + exact Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have hscale_rhs_nonneg : + 0 ≤ A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R := by + exact mul_nonneg (mul_nonneg hA hpow_nonneg) hR + have hresp_pow_le : + Real.rpow + (Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0) q ≤ + Real.rpow + (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) q := + Real.rpow_le_rpow hresp_nonneg hscale hq.le + have hweight_r_nonneg : 0 ≤ Ch02.geometricWeight r q l := by + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg (s := r) (q := q) l hrq + have hdisc_delta_pos : 0 < Ch02.geometricDiscount delta q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hdeltaq + have hpow_expand : + Real.rpow + (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) q = + Real.rpow A q * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) * + Real.rpow R q := by + have hmul₁ : + Real.rpow (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) q = + Real.rpow (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) q * + Real.rpow R q := by + simpa using + (Real.mul_rpow + (x := A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) + (y := R) (z := q) (mul_nonneg hA hpow_nonneg) hR) + have hmul₂ : + Real.rpow (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) q = + Real.rpow A q * + Real.rpow (Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) q := by + simpa using + (Real.mul_rpow + (x := A) (y := Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) + (z := q) hA hpow_nonneg) + have hpow : + Real.rpow (Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ))) q = + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) := by + simpa using + (Real.rpow_mul (x := (3 : ℝ)) (by norm_num : (0 : ℝ) ≤ 3) + ((tau / 2) * (l : ℝ)) q).symm + rw [hmul₁, hmul₂, hpow] + have hweight_identity : + Ch02.geometricWeight r q l * + (Real.rpow A q * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) * + Real.rpow R q) = + Ch02.geometricWeight delta q l * + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) := by + have hpow_exp : + Real.rpow (3 : ℝ) (-r * q * (l : ℝ)) * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) = + Real.rpow (3 : ℝ) (-delta * q * (l : ℝ)) := by + have hadd : + Real.rpow (3 : ℝ) + ((-r * q * (l : ℝ)) + (((tau / 2) * (l : ℝ)) * q)) = + Real.rpow (3 : ℝ) (-r * q * (l : ℝ)) * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) := by + simpa using + Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-r * q * (l : ℝ)) (((tau / 2) * (l : ℝ)) * q) + rw [← hadd] + congr 1 + rw [hdelta] + ring + unfold Ch02.geometricWeight + calc + Ch02.geometricDiscount r q * + Real.rpow (3 : ℝ) (-r * q * (l : ℝ)) * + (Real.rpow A q * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q) * + Real.rpow R q) + = + Ch02.geometricDiscount r q * + (Real.rpow (3 : ℝ) (-r * q * (l : ℝ)) * + Real.rpow (3 : ℝ) (((tau / 2) * (l : ℝ)) * q)) * + Real.rpow A q * Real.rpow R q := by + ring + _ = + Ch02.geometricDiscount r q * + Real.rpow (3 : ℝ) (-delta * q * (l : ℝ)) * + Real.rpow A q * Real.rpow R q := by + rw [hpow_exp] + _ = + (Ch02.geometricDiscount delta q * + Real.rpow (3 : ℝ) (-delta * q * (l : ℝ))) * + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) := by + field_simp [hdisc_delta_pos.ne'] + calc + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0) q + ≤ Ch02.geometricWeight r q l * + Real.rpow + (A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) q := by + exact mul_le_mul_of_nonneg_left hresp_pow_le hweight_r_nonneg + _ = + Ch02.geometricWeight delta q l * + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) := by + rw [hpow_expand, hweight_identity] + +/-- Finite-`q` deterministic `\mathcal E` control from a scale-by-scale +response estimate. + +This is the packaged geometric summation step used by the Section 5.7 +minimal-scale corollary. The constant is explicit: it is only the ratio of +the two geometric normalizations, multiplied by the `q`-power of the +scale-response prefactor. -/ +theorem homogenizationErrorFinite_infinity_le_of_scaleResponse_le + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {n : ℤ} (hn : n ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {r tau delta q A R : ℝ} + (hdelta : delta = r - tau / 2) + (hrq : 0 ≤ r * q) (hdeltaq : 0 < delta * q) (hq : 0 < q) + (hA : 0 ≤ A) (hR : 0 ≤ R) + (hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale Q (n - (l : ℤ)) + Ch02.MultiscaleExponent.infinity a a0 ≤ + A * Real.rpow (3 : ℝ) ((tau / 2) * (l : ℝ)) * R) : + Ch02.HomogenizationErrorFinite Q n r + Ch02.MultiscaleExponent.infinity q a a0 ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q) + (1 / q) := by + let B : ℝ := + Ch02.geometricDiscount r q * + (Ch02.geometricDiscount delta q)⁻¹ * + Real.rpow A q * Real.rpow R q + have hdisc_r_nonneg : 0 ≤ Ch02.geometricDiscount r q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq + have hdisc_delta_pos : 0 < Ch02.geometricDiscount delta q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hdeltaq + have hB : 0 ≤ B := by + dsimp [B] + positivity + exact + homogenizationErrorFinite_infinity_le_rpow_of_weighted_geometric_bound + (Q := Q) (n := n) hn a a0 hrq hdeltaq hq hB + (by + intro l + simpa [B] using + weighted_scaleResponse_term_le_of_scaleResponse_le + (Q := Q) (n := n) hn a a0 + (r := r) (tau := tau) (delta := delta) (q := q) + (A := A) (R := R) (l := l) + hdelta hrq hdeltaq hq hA hR (hscale l)) + +/-- Square-root form of the `p = infinity` scale response: a bound on the +underlying descendant maximum by `B^2` gives a bound on the scale response by +`B`. -/ +theorem scaleResponseAtScale_infinity_le_of_maxDescendant_le_sq + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (_hk : k ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) (a0 : Mat d) + {B : ℝ} (hB : 0 ≤ B) + (hmax : + Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a a0 ≤ + B ^ (2 : ℕ)) : + Ch02.scaleResponseAtScale Q k + Ch02.MultiscaleExponent.infinity a a0 ≤ B := by + have hsqrt : + Real.sqrt + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a a0) ≤ + Real.sqrt (B ^ (2 : ℕ)) := + Real.sqrt_le_sqrt hmax + calc + Ch02.scaleResponseAtScale Q k Ch02.MultiscaleExponent.infinity a a0 + = + Real.sqrt + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a a0) := by + rw [Ch02.scaleResponseAtScale_infinity_eq] + simp [Real.sqrt_eq_rpow] + _ ≤ Real.sqrt (B ^ (2 : ℕ)) := hsqrt + _ = B := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hB] + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorFiniteQ.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorFiniteQ.lean new file mode 100644 index 0000000000..9306c81e1c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorFiniteQ.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorControl + +/-! # Homogenization Error Finite Q -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open Section54.VarianceBoundGoodScale +open scoped ENNReal MatrixOrder BigOperators + +/-! +# Finite-q homogenization-error control + +This file continues the Section 5.7 conversion from the localized quenched +`J` estimate to finite-`q` homogenization-error bounds. The lemmas below are +the deterministic square-root step: a weighted `J` estimate at one scale gives +the corresponding `p = infinity` scale-response estimate with half the +discount exponent. +-/ + +noncomputable section + +/-- If `3^{-τL} Y` is bounded by `R²`, then the square-root response gains the +factor `3^{τL/2}`. -/ +theorem sqrt_mul_le_sqrt_mul_rpow_half_of_weighted_le + {C Y R τ L : ℝ} + (hC : 0 ≤ C) (hR : 0 ≤ R) + (hweighted : + Real.rpow (3 : ℝ) (-τ * L) * Y ≤ R ^ (2 : ℕ)) : + Real.sqrt (C * Y) ≤ + Real.sqrt C * Real.rpow (3 : ℝ) ((τ / 2) * L) * R := by + let W : ℝ := Real.rpow (3 : ℝ) (-τ * L) + let P : ℝ := Real.rpow (3 : ℝ) ((τ / 2) * L) + have hW_pos : 0 < W := by + dsimp [W] + positivity + have hW_inv : W⁻¹ = Real.rpow (3 : ℝ) (τ * L) := by + dsimp [W] + rw [show -τ * L = -(τ * L) by ring] + rw [Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3) (τ * L)] + rw [inv_inv] + have hY_le : Y ≤ W⁻¹ * R ^ (2 : ℕ) := + (le_inv_mul_iff₀ hW_pos).mpr (by simpa [W] using hweighted) + have hP_sq : P ^ (2 : ℕ) = Real.rpow (3 : ℝ) (τ * L) := by + dsimp [P] + have hpow₀ : + Real.rpow (3 : ℝ) (((τ / 2) * L) * (2 : ℝ)) = + Real.rpow (Real.rpow (3 : ℝ) ((τ / 2) * L)) (2 : ℝ) := by + exact Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) ((τ / 2) * L) (2 : ℝ) + have hpow : + Real.rpow (3 : ℝ) (((τ / 2) * L) * (2 : ℝ)) = + Real.rpow (3 : ℝ) ((τ / 2) * L) ^ (2 : ℕ) := by + simpa [Real.rpow_two] using hpow₀ + calc + Real.rpow (3 : ℝ) ((τ / 2) * L) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (((τ / 2) * L) * (2 : ℝ)) := hpow.symm + _ = Real.rpow (3 : ℝ) (τ * L) := by + congr 1 + ring + have hP_nonneg : 0 ≤ P := by + dsimp [P] + positivity + have hrhs_nonneg : + 0 ≤ Real.sqrt C * P * R := + mul_nonneg (mul_nonneg (Real.sqrt_nonneg C) hP_nonneg) hR + refine (Real.sqrt_le_iff).2 ⟨hrhs_nonneg, ?_⟩ + calc + C * Y ≤ C * (W⁻¹ * R ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hY_le hC + _ = C * (Real.rpow (3 : ℝ) (τ * L) * R ^ (2 : ℕ)) := by + rw [hW_inv] + _ = (Real.sqrt C * P * R) ^ (2 : ℕ) := by + rw [← hP_sq] + have hCeq : (Real.sqrt C) ^ (2 : ℕ) = C := Real.sq_sqrt hC + calc + C * (P ^ (2 : ℕ) * R ^ (2 : ℕ)) + = (Real.sqrt C) ^ (2 : ℕ) * (P ^ (2 : ℕ) * R ^ (2 : ℕ)) := by + rw [hCeq] + _ = (Real.sqrt C * P * R) ^ (2 : ℕ) := by + ring + +/-- One-scale response control from the localized finite-probe maximum, after +using the weighted Section 5.7 estimate. -/ +theorem scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedNormalizedProbeJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n : ℕ} (hnm : n ≤ m) {τ R : ℝ} (hR : 0 ≤ R) + (hweighted : + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a ≤ + R ^ (2 : ℕ)) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)) * R := by + let Cprobe : ℝ := + 4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ) + let Y : ℝ := localizedNormalizedProbeJMax hP hStruct m n a + have hCprobe : 0 ≤ Cprobe := by + dsimp [Cprobe] + positivity + have hscale := + scaleResponseAtScale_originCube_nat_le_sqrt_const_mul_localizedNormalizedProbeJMax + hP hStruct hΓ ha hnm + have hsqrt : + Real.sqrt (Cprobe * Y) ≤ + Real.sqrt Cprobe * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)) * R := by + exact + sqrt_mul_le_sqrt_mul_rpow_half_of_weighted_le + (C := Cprobe) (Y := Y) (R := R) (τ := τ) + (L := ((m - n : ℕ) : ℝ)) hCprobe hR + (by simpa [Y] using hweighted) + exact hscale.trans (by simpa [Cprobe, Y] using hsqrt) + +/-- The same one-scale response control, using the unit-vector form supplied by +the minimal-scale theorem. -/ +theorem scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedUnitJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n : ℕ} (hnm : n ≤ m) {τ R : ℝ} (hR : 0 ≤ R) + (hunit : ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e a ≤ + R ^ (2 : ℕ)) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)) * R := by + let W : ℝ := Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) + have hW : 0 < W := by + dsimp [W] + positivity + have hprobe : + W * localizedNormalizedProbeJMax hP hStruct m n a ≤ R ^ (2 : ℕ) := by + exact + weighted_localizedNormalizedProbeJMax_le_of_forall_probe + hP hStruct a hW + (by + intro i + exact hunit (normalizedProbeVec i) + (normalizedProbeVec_dotProduct_self_le_one i)) + exact + scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedNormalizedProbeJMax + hP hStruct hΓ ha hnm hR (by simpa [W] using hprobe) + +/-- Natural lower-scale version of +`scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedUnitJMax`. +This is the form used in the finite-`q` row summation: the `l`-th term in +`\mathcal E(Q,n)` samples the scale `n-l`. -/ +theorem scaleResponseAtScale_originCube_nat_sub_le_rpow_of_weighted_localizedUnitJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n l : ℕ} (hln : l ≤ n) (hnm : n ≤ m) {τ R : ℝ} (hR : 0 ≤ R) + (hunit : ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m (n - l) e a ≤ + R ^ (2 : ℕ)) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - (n - l) : ℕ) : ℝ)) * R := by + have hcast : (((n - l : ℕ) : ℤ)) = (n : ℤ) - (l : ℤ) := by + omega + have hle : n - l ≤ m := by + omega + have hresp := + scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedUnitJMax + hP hStruct hΓ ha hle hR hunit + simpa [hcast] using hresp + +/-- One natural lower-scale response estimate obtained by inserting the +minimal-scale envelope and taking a square root. -/ +theorem scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleUnitJ + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n l : ℕ} (hln : l ≤ n) (hnm : n ≤ m) + {τ X α : ℝ} (hX : 0 < X) + (hunit : ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m (n - l) e a ≤ + ((3 : ℝ) ^ m / X) ^ (-α)) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - (n - l) : ℕ) : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) + have hbase_pos : 0 < (3 : ℝ) ^ m / X := by + exact div_pos (by positivity) hX + have hD_nonneg : 0 ≤ ((3 : ℝ) ^ m / X) ^ (-α) := + (Real.rpow_pos_of_pos hbase_pos (-α)).le + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hunit_sq : + ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m (n - l) e a ≤ + R ^ (2 : ℕ) := by + intro e he + have h := hunit e he + simpa [R, Real.sq_sqrt hD_nonneg] using h + exact + scaleResponseAtScale_originCube_nat_sub_le_rpow_of_weighted_localizedUnitJMax + hP hStruct hΓ ha hln hnm hR_nonneg hunit_sq + +/-- Natural-scale finite-row summation from the minimal-scale `J` estimate. + +This controls the part of the finite-`q` homogenization-error series with +`l ≤ n`, i.e. the scales which are still nonnegative. The closed +`\mathcal E` corollary absorbs the lower scales into the same minimal-scale +envelope before exposing a theorem statement. -/ +theorem finset_sum_nat_scaleResponse_terms_le_of_minimalScaleUnitJ + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n : ℕ} (hnm : n ≤ m) + {r τ δ q X α : ℝ} + (hδ : δ = r - τ / 2) + (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hX : 0 < X) + (hunit : ∀ l : ℕ, l ≤ n → + ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m (n - l) e a ≤ + ((3 : ℝ) ^ m / X) ^ (-α)) : + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let A : ℝ := + Cresp * Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)); + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)); + Finset.sum (Finset.range (n + 1)) (fun l => + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale + (originCube d ((m : ℕ) : ℤ)) ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct))) q) ≤ + Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹ * + Real.rpow A q * Real.rpow R q := by + classical + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let a0 : Mat d := scalarMatrix (d := d) (barSigmaLimit hP hStruct) + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) + let A : ℝ := + Cresp * Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)) + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) + let B : ℝ := + Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹ * + Real.rpow A q * Real.rpow R q + let f : ℕ → ℝ := fun l => + Ch02.geometricWeight r q l * + Real.rpow + (Ch02.scaleResponseAtScale Q ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F a0) q + let g : ℕ → ℝ := fun l => Ch02.geometricWeight δ q l * B + have hnQ : ((n : ℕ) : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + exact_mod_cast hnm + have hbase_pos : 0 < (3 : ℝ) ^ m / X := by + exact div_pos (by positivity) hX + have hD_nonneg : 0 ≤ ((3 : ℝ) ^ m / X) ^ (-α) := + (Real.rpow_pos_of_pos hbase_pos (-α)).le + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hdisc_r_nonneg : 0 ≤ Ch02.geometricDiscount r q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_nonneg hrq + have hdisc_δ_pos : 0 < Ch02.geometricDiscount δ q := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos hδq + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + have hterm : ∀ l ∈ Finset.range (n + 1), f l ≤ g l := by + intro l hl + have hln : l ≤ n := by + exact Nat.lt_succ_iff.mp (Finset.mem_range.mp hl) + have hdiff : + ((m - (n - l) : ℕ) : ℝ) = + ((m - n : ℕ) : ℝ) + (l : ℝ) := by + have hnat : m - (n - l) = (m - n) + l := by + omega + exact_mod_cast hnat + have hpow_split : + Real.rpow (3 : ℝ) ((τ / 2) * ((m - (n - l) : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) ((τ / 2) * ((m - n : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) := by + rw [hdiff] + rw [show (τ / 2) * (((m - n : ℕ) : ℝ) + (l : ℝ)) = + (τ / 2) * ((m - n : ℕ) : ℝ) + (τ / 2) * (l : ℝ) by ring] + exact Real.rpow_add (by norm_num : (0 : ℝ) < 3) + ((τ / 2) * ((m - n : ℕ) : ℝ)) ((τ / 2) * (l : ℝ)) + have hscale_raw := + scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleUnitJ + hP hStruct hΓ ha hln hnm hX (hunit l hln) + have hscale : + Ch02.scaleResponseAtScale Q ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F a0 ≤ + A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + calc + Ch02.scaleResponseAtScale Q ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F a0 + ≤ Cresp * + Real.rpow (3 : ℝ) + ((τ / 2) * ((m - (n - l) : ℕ) : ℝ)) * R := by + simpa [Q, F, a0, Cresp, R] using hscale_raw + _ = A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + rw [hpow_split] + dsimp [A] + ring + simpa [f, g, Q, F, a0, B] using + weighted_scaleResponse_term_le_of_scaleResponse_le + (Q := Q) (n := ((n : ℕ) : ℤ)) hnQ F a0 + (r := r) (tau := τ) (delta := δ) (q := q) + (A := A) (R := R) (l := l) + hδ hrq hδq hq hA_nonneg hR_nonneg hscale + have hg_nonneg : ∀ l : ℕ, 0 ≤ g l := by + intro l + exact mul_nonneg + (by + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg + (s := δ) (q := q) l hδq.le) + hB_nonneg + have hg_summable : Summable g := by + have hbase : + Summable (fun l : ℕ => Homogenization.geometricWeight δ q l) := + Homogenization.summable_geometricWeight hδq + have hscaled : + Summable (fun l : ℕ => + B * Homogenization.geometricWeight δ q l) := + hbase.mul_left B + simpa [g, Ch02.geometricWeight_eq_old, mul_comm, mul_left_comm, mul_assoc] + using hscaled + have hsum_g_le_tsum : + Finset.sum (Finset.range (n + 1)) (fun l => g l) ≤ ∑' l : ℕ, g l := + hg_summable.sum_le_tsum (Finset.range (n + 1)) + (fun l _hl => hg_nonneg l) + have htsum_g : (∑' l : ℕ, g l) = B := by + have hbase : + Summable (fun l : ℕ => Homogenization.geometricWeight δ q l) := + Homogenization.summable_geometricWeight hδq + calc + (∑' l : ℕ, g l) + = ∑' l : ℕ, B * Homogenization.geometricWeight δ q l := by + simp [g, Ch02.geometricWeight_eq_old, mul_comm] + _ = B * ∑' l : ℕ, Homogenization.geometricWeight δ q l := by + simpa using hbase.tsum_mul_left B + _ = B := by + rw [Homogenization.tsum_geometricWeight_eq_one hδq] + ring + calc + Finset.sum (Finset.range (n + 1)) (fun l => f l) + ≤ Finset.sum (Finset.range (n + 1)) (fun l => g l) := + Finset.sum_le_sum hterm + _ ≤ ∑' l : ℕ, g l := hsum_g_le_tsum + _ = B := htsum_g + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorLowerEnvelope.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorLowerEnvelope.lean new file mode 100644 index 0000000000..1232e9f0a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorLowerEnvelope.lean @@ -0,0 +1,317 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.NormalizedResponseEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.CoarsePoincare.Finite + +/-! # Homogenization Error Lower Envelope -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped MatrixOrder BigOperators + +/-! +# Lower-scale response envelope + +This file supplies the deterministic lower-scale input for the closed +`\mathcal E` estimate. The results here keep the lower-scale contribution in +the same algebraic envelope used by the main finite-`q` summation. +-/ + +noncomputable section + +/-- A negative-scale response row is controlled by the scale-zero Ch2 +ellipticity suprema, with the same weight as in the homogenization-error +series. -/ +theorem weighted_negative_scaleResponse_le_scaleZero_ellipticity_roots + {d : ℕ} [NeZero d] + (m j : ℕ) {s σ : ℝ} (hs : 0 < s) (hσ : 0 < σ) + (a : Ch02.TriadicCoeffFamily d) : + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ); + let D : Finset (TriadicCube d) := descendantsAtScale Q 0; + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]); + Ch02.geometricWeight s 1 (j + m) * + Ch02.scaleResponseAtScale Q (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + (Real.sqrt σ⁻¹ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (D.sup' hD (fun U => Ch02.LambdaSq U s (.finite 1) a)) + (1 / 2 : ℝ)) + + Real.sqrt σ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow + (D.sup' hD (fun U => (Ch02.lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ))) := by + classical + intro Q D hD + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let upperRow : ℝ := + Ch02.geometricWeight s 1 (j + m) * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + let lowerRow : ℝ := + Ch02.geometricWeight s 1 (j + m) * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a) + (1 / 2 : ℝ) + let upperRoot : ℝ := + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (D.sup' hD (fun U => Ch02.LambdaSq U s (.finite 1) a)) + (1 / 2 : ℝ) + let lowerRoot : ℝ := + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow (D.sup' hD (fun U => (Ch02.lambdaSq U s (.finite 1) a)⁻¹)) + (1 / 2 : ℝ) + have hrow := + weighted_scaleResponseAtScale_originCube_neg_nat_scalarMatrix_le_ellipticityRows + (d := d) m j (s := s) (σ := σ) hs.le hσ a + have hupper : upperRow ≤ upperRoot := by + simpa [Q, D, hD, upperRow, upperRoot] using + Ch02.upperSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_LambdaSq_sup'_rpow_half + (d := d) m j hs a + have hlower : lowerRow ≤ lowerRoot := by + simpa [Q, D, hD, lowerRow, lowerRoot] using + Ch02.lowerSmallSqrtTailTerm_le_scale_factor_mul_scale_zero_lambdaSq_inv_sup'_rpow_half + (d := d) m j hs a + have hsqrt_inv_nonneg : 0 ≤ Real.sqrt σ⁻¹ := Real.sqrt_nonneg σ⁻¹ + have hsqrt_nonneg : 0 ≤ Real.sqrt σ := Real.sqrt_nonneg σ + have hinside : + Real.sqrt σ⁻¹ * upperRow + Real.sqrt σ * lowerRow ≤ + Real.sqrt σ⁻¹ * upperRoot + Real.sqrt σ * lowerRoot := by + exact add_le_add + (mul_le_mul_of_nonneg_left hupper hsqrt_inv_nonneg) + (mul_le_mul_of_nonneg_left hlower hsqrt_nonneg) + have hC_nonneg : 0 ≤ Real.sqrt C := by + exact Real.sqrt_nonneg C + exact hrow.trans (by + exact mul_le_mul_of_nonneg_left hinside hC_nonneg) + +/-- If the scale-zero ellipticity suprema are already in the collapsed +minimal-scale envelope, then every negative response row is in the same +weighted envelope. -/ +theorem weighted_negative_scaleResponse_le_of_scaleZero_collapsed + {d : ℕ} [NeZero d] + (m j : ℕ) {s σ R : ℝ} (hs : 0 < s) (hσ : 0 < σ) (hR : 0 ≤ R) + (a : Ch02.TriadicCoeffFamily d) + (hupper : + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ); + let D : Finset (TriadicCube d) := descendantsAtScale Q 0; + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]); + σ⁻¹ * D.sup' hD (fun U => Ch02.LambdaSq U s (.finite 1) a) ≤ + (Real.rpow (3 : ℝ) (s * (m : ℝ)) * R) ^ (2 : ℕ)) + (hlower : + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ); + let D : Finset (TriadicCube d) := descendantsAtScale Q 0; + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]); + σ * D.sup' hD (fun U => (Ch02.lambdaSq U s (.finite 1) a)⁻¹) ≤ + (Real.rpow (3 : ℝ) (s * (m : ℝ)) * R) ^ (2 : ℕ)) : + Ch02.geometricWeight s 1 (j + m) * + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) * R := by + classical + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]) + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let M : ℝ := Real.rpow (3 : ℝ) (s * (m : ℝ)) * R + let upperSup : ℝ := D.sup' hD (fun U => Ch02.LambdaSq U s (.finite 1) a) + let lowerSup : ℝ := D.sup' hD (fun U => (Ch02.lambdaSq U s (.finite 1) a)⁻¹) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hupperSup_nonneg : 0 ≤ upperSup := by + rcases hD with ⟨U, hU⟩ + exact (Ch02.LambdaSq_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1)).trans + (Finset.le_sup' (s := D) + (f := fun U => Ch02.LambdaSq U s (.finite 1) a) hU) + have hlowerSup_nonneg : 0 ≤ lowerSup := by + rcases hD with ⟨U, hU⟩ + exact (inv_nonneg.mpr + (Ch02.lambdaSq_finite_nonneg U a hs + (by norm_num : (1 : ℝ) ≤ 1))).trans + (Finset.le_sup' (s := D) + (f := fun U => (Ch02.lambdaSq U s (.finite 1) a)⁻¹) hU) + have hupperRoot : + Real.sqrt σ⁻¹ * Real.rpow upperSup (1 / 2 : ℝ) ≤ M := by + have hmul_nonneg : 0 ≤ σ⁻¹ * upperSup := + mul_nonneg (inv_pos.mpr hσ).le hupperSup_nonneg + have hroot_le : + Real.sqrt (σ⁻¹ * upperSup) ≤ Real.sqrt (M ^ (2 : ℕ)) := + Real.sqrt_le_sqrt (by simpa [Q, D, hD, M, upperSup] using hupper) + have hroot_eq : + Real.sqrt (σ⁻¹ * upperSup) = + Real.sqrt σ⁻¹ * Real.rpow upperSup (1 / 2 : ℝ) := by + rw [Real.sqrt_mul (inv_pos.mpr hσ).le] + simp [Real.sqrt_eq_rpow] + rw [hroot_eq] at hroot_le + simpa [Real.sqrt_sq hM_nonneg] using hroot_le + have hlowerRoot : + Real.sqrt σ * Real.rpow lowerSup (1 / 2 : ℝ) ≤ M := by + have hmul_nonneg : 0 ≤ σ * lowerSup := + mul_nonneg hσ.le hlowerSup_nonneg + have hroot_le : + Real.sqrt (σ * lowerSup) ≤ Real.sqrt (M ^ (2 : ℕ)) := + Real.sqrt_le_sqrt (by simpa [Q, D, hD, M, lowerSup] using hlower) + have hroot_eq : + Real.sqrt (σ * lowerSup) = + Real.sqrt σ * Real.rpow lowerSup (1 / 2 : ℝ) := by + rw [Real.sqrt_mul hσ.le] + simp [Real.sqrt_eq_rpow] + rw [hroot_eq] at hroot_le + simpa [Real.sqrt_sq hM_nonneg] using hroot_le + have hweighted := + weighted_negative_scaleResponse_le_scaleZero_ellipticity_roots + (d := d) m j (s := s) (σ := σ) hs hσ a + have hinside : + Real.sqrt σ⁻¹ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * Real.rpow upperSup (1 / 2 : ℝ)) + + Real.sqrt σ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * Real.rpow lowerSup (1 / 2 : ℝ)) + ≤ 2 * R := by + have hfactor_pos : 0 < Real.rpow (3 : ℝ) (-s * (m : ℝ)) := by + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hfactor_mul_M : + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * M = R := by + dsimp [M] + have hp : 0 < Real.rpow (3 : ℝ) (s * (m : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + rw [show -s * (m : ℝ) = -(s * (m : ℝ)) by ring] + rw [Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + field_simp [hp.ne'] + calc + Real.sqrt σ⁻¹ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * Real.rpow upperSup (1 / 2 : ℝ)) + + Real.sqrt σ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * Real.rpow lowerSup (1 / 2 : ℝ)) + = + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + (Real.sqrt σ⁻¹ * Real.rpow upperSup (1 / 2 : ℝ) + + Real.sqrt σ * Real.rpow lowerSup (1 / 2 : ℝ)) := by + ring + _ ≤ Real.rpow (3 : ℝ) (-s * (m : ℝ)) * (M + M) := by + exact mul_le_mul_of_nonneg_left + (add_le_add hupperRoot hlowerRoot) hfactor_pos.le + _ = 2 * R := by + rw [show M + M = 2 * M by ring] + calc + Real.rpow (3 : ℝ) (-s * (m : ℝ)) * (2 * M) + = 2 * (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * M) := by + ring + _ = 2 * R := by rw [hfactor_mul_M] + have hC_nonneg : 0 ≤ Real.sqrt C := Real.sqrt_nonneg C + calc + Ch02.geometricWeight s 1 (j + m) * + Ch02.scaleResponseAtScale Q (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) + ≤ Real.sqrt C * + (Real.sqrt σ⁻¹ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow upperSup (1 / 2 : ℝ)) + + Real.sqrt σ * + (Real.rpow (3 : ℝ) (-s * (m : ℝ)) * + Real.rpow lowerSup (1 / 2 : ℝ))) := by + simpa [Q, D, hD, C, upperSup, lowerSup] using hweighted + _ ≤ Real.sqrt C * (2 * R) := + mul_le_mul_of_nonneg_left hinside hC_nonneg + _ = (2 * Real.sqrt C) * R := by ring + +/-- Weighted negative-scale response control gives the unweighted algebraic +scale envelope, paying only the fixed geometric-discount constant. -/ +theorem negative_scaleResponse_le_of_weighted_envelope + {d : ℕ} [NeZero d] + (m j : ℕ) {s σ A R : ℝ} (hs : 0 < s) (hA : 0 ≤ A) (hR : 0 ≤ R) + (a : Ch02.TriadicCoeffFamily d) + (hweighted : + Ch02.geometricWeight s 1 (j + m) * + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + A * R) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + (Ch02.geometricDiscount s 1)⁻¹ * A * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) * R := by + let resp : ℝ := + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) + let w : ℝ := Ch02.geometricWeight s 1 (j + m) + let Env : ℝ := + (Ch02.geometricDiscount s 1)⁻¹ * A * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) * R + have hw_pos : 0 < w := by + dsimp [w] + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_pos (s := s) (q := 1) (j + m) + (by simpa using hs) + have hdisc_pos : 0 < Ch02.geometricDiscount s 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (s := s) (q := 1) + (by simpa using hs) + have hEnv_nonneg : 0 ≤ Env := by + dsimp [Env] + positivity + have hwEnv : w * Env = A * R := by + dsimp [w, Env] + unfold Ch02.geometricWeight + have hpow_mul : + Real.rpow (3 : ℝ) (-s * 1 * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) = 1 := by + have hp : 0 < Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + calc + Real.rpow (3 : ℝ) (-s * 1 * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) + = + Real.rpow (3 : ℝ) (-(s * ((j + m : ℕ) : ℝ))) * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) := by + congr 1 + ring_nf + _ = (Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)))⁻¹ * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) := by + have hneg : + Real.rpow (3 : ℝ) (-(s * ((j + m : ℕ) : ℝ))) = + (Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)))⁻¹ := + Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3) + (s * ((j + m : ℕ) : ℝ)) + simpa using congrArg + (fun z => z * Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ))) hneg + _ = 1 := inv_mul_cancel₀ hp.ne' + calc + (Ch02.geometricDiscount s 1 * + Real.rpow (3 : ℝ) (-s * 1 * ((j + m : ℕ) : ℝ))) * + ((Ch02.geometricDiscount s 1)⁻¹ * A * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ)) * R) + = + (Ch02.geometricDiscount s 1 * (Ch02.geometricDiscount s 1)⁻¹) * + (Real.rpow (3 : ℝ) (-s * 1 * ((j + m : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (s * ((j + m : ℕ) : ℝ))) * A * R := by + ring + _ = A * R := by + rw [mul_inv_cancel₀ hdisc_pos.ne', hpow_mul] + ring + have hmul : w * resp ≤ w * Env := by + calc + w * resp ≤ A * R := by + simpa [resp, w] using hweighted + _ = w * Env := hwEnv.symm + exact le_of_mul_le_mul_left hmul hw_pos + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorMinimalScale.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorMinimalScale.lean new file mode 100644 index 0000000000..b22719316e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorMinimalScale.lean @@ -0,0 +1,870 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorClosed +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorLowerEnvelope +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity + +/-! # Homogenization Error Minimal Scale -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal MatrixOrder BigOperators + +/-! +# Minimal-scale finite-q homogenization-error assembly + +This file contains the deterministic bridge used in the Section 5.7 corollary: +pointwise localized `J` control and pointwise unit-ellipticity control imply a +single collapsed bound on `\mathcal E_{r,\infty,q}`. +-/ + +noncomputable section + +/-- Increasing the random scale weakens the collapsed algebraic factor. -/ +private theorem collapsed_algebraic_factor_le_of_le + {m : ℕ} {X Y α : ℝ} + (hX : 0 < X) (hXY : X ≤ Y) (hα : 0 ≤ α) : + ((3 : ℝ) ^ m / X) ^ (-α) ≤ ((3 : ℝ) ^ m / Y) ^ (-α) := by + have hY : 0 < Y := hX.trans_le hXY + have hbaseX_pos : 0 < (3 : ℝ) ^ m / X := div_pos (by positivity) hX + have hbaseY_pos : 0 < (3 : ℝ) ^ m / Y := div_pos (by positivity) hY + have hbase_le : (3 : ℝ) ^ m / Y ≤ (3 : ℝ) ^ m / X := by + rw [div_eq_mul_inv, div_eq_mul_inv] + have hinv : Y⁻¹ ≤ X⁻¹ := by + simpa [one_div] using one_div_le_one_div_of_le hX hXY + exact mul_le_mul_of_nonneg_left + hinv (by positivity) + by_cases hα0 : α = 0 + · simp [hα0] + · have hαpos : 0 < α := lt_of_le_of_ne hα (Ne.symm hα0) + exact + (Real.rpow_le_rpow_iff_of_neg hbaseX_pos hbaseY_pos + (by linarith : (-α : ℝ) < 0)).2 hbase_le + +/-- Increasing the random scale weakens the square-root envelope used in the +unit-ellipticity rows. -/ +private theorem collapsed_square_envelope_le_of_le + {m : ℕ} {X Y α s : ℝ} + (hX : 0 < X) (hXY : X ≤ Y) (hα : 0 ≤ α) : + (Real.rpow (3 : ℝ) (s * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ) ≤ + (Real.rpow (3 : ℝ) (s * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / Y) ^ (-α))) ^ (2 : ℕ) := by + have hfactor := + collapsed_algebraic_factor_le_of_le + (m := m) (X := X) (Y := Y) (α := α) hX hXY hα + have hleft_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + exact mul_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + (Real.sqrt_nonneg _) + have hmul : + Real.rpow (3 : ℝ) (s * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) ≤ + Real.rpow (3 : ℝ) (s * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / Y) ^ (-α)) := by + exact mul_le_mul_of_nonneg_left + (Real.sqrt_le_sqrt hfactor) + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + exact pow_le_pow_left₀ hleft_nonneg hmul 2 + +/-- Whole-cube finite-`q` homogenization-error control from one random scale +which controls both the positive-scale `J` rows and the negative-scale +unit-ellipticity rows. -/ +theorem homogenizationErrorOnOriginCube_le_of_minimalScaleUnitJ_and_unitEllipticity + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {r τ δ q X α : ℝ} + (hδ : δ = r - τ / 2) + (hτ : 0 < τ) (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hUpper : hΓ.params.sUpper < τ / 2) + (hLower : hΓ.params.sLower < τ / 2) + (hX : 0 < X) + (hJ : ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + ∀ {n : ℕ}, + X ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e a ≤ + ((3 : ℝ) ^ m / X) ^ (-α)) + (hUnit : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ)) + (hScale : X ≤ (3 : ℝ) ^ m) : + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + classical + intro Cresp Cneg A + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let σbar : ℝ := barSigmaLimit hP hStruct + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) + have hτ2_pos : 0 < τ / 2 := by positivity + have hσbar_pos : 0 < σbar := by + simpa [σbar] using hΓ.barSigmaLimit_pos + have hbase_pos : 0 < (3 : ℝ) ^ m / X := + div_pos (by positivity) hX + have hD_nonneg : 0 ≤ ((3 : ℝ) ^ m / X) ^ (-α) := + (Real.rpow_pos_of_pos hbase_pos (-α)).le + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hdiscτ_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (s := τ / 2) (q := 1) + (by simpa using hτ2_pos) + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + positivity + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hA_ge_resp : Cresp ≤ A := by + dsimp [A] + have hpow_one : 1 ≤ Real.rpow (3 : ℝ) (τ / 2) := + Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) hτ2_pos.le + calc + Cresp ≤ max Cresp Cneg := le_max_left _ _ + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := by + have hmax_nonneg : 0 ≤ max Cresp Cneg := + le_max_of_le_left hCresp_nonneg + calc + max Cresp Cneg = max Cresp Cneg * 1 := by ring + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := + mul_le_mul_of_nonneg_left hpow_one hmax_nonneg + have hA_ge_neg : Cneg ≤ A := by + dsimp [A] + have hpow_one : 1 ≤ Real.rpow (3 : ℝ) (τ / 2) := + Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) hτ2_pos.le + calc + Cneg ≤ max Cresp Cneg := le_max_right _ _ + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := by + have hmax_nonneg : 0 ≤ max Cresp Cneg := + le_max_of_le_right hCneg_nonneg + calc + max Cresp Cneg = max Cresp Cneg * 1 := by ring + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := + mul_le_mul_of_nonneg_left hpow_one hmax_nonneg + have hA_ge_resp_step : + Cresp * Real.rpow (3 : ℝ) (τ / 2) ≤ A := by + dsimp [A] + exact mul_le_mul_of_nonneg_right (le_max_left Cresp Cneg) + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hA_ge_neg_step : + Cneg * Real.rpow (3 : ℝ) (τ / 2) ≤ A := by + dsimp [A] + exact mul_le_mul_of_nonneg_right (le_max_right Cresp Cneg) + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hell := + scaleZero_ellipticity_sup_bounds_of_localizedLimitWeightedUnitEllipticitySup_le + hP hStruct hΓ ha (m := m) (t := τ / 2) + (M := Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * R) + hUpper hLower (by simpa [R] using hUnit) + have hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + intro l + by_cases hl0 : l = 0 + · subst l + by_cases hm0 : m = 0 + · subst m + have hself : + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (0 : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (-(1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + exact + Ch02.scaleResponseAtScale_infinity_self_le + (Q := originCube d (0 : ℤ)) (k := -(1 : ℤ)) + (by simp [originCube]) F (scalarMatrix (d := d) σbar) + have hneg_weighted := + weighted_negative_scaleResponse_le_of_scaleZero_collapsed + (d := d) 0 1 (s := τ / 2) (σ := σbar) (R := R) + hτ2_pos hσbar_pos hR_nonneg F + (by simpa [F, σbar] using hell.1) + (by simpa [F, σbar] using hell.2) + have hneg := + negative_scaleResponse_le_of_weighted_envelope + (d := d) 0 1 (s := τ / 2) (σ := σbar) + (A := 2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + (R := R) hτ2_pos (by positivity) hR_nonneg F hneg_weighted + calc + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (0 : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (-(1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := + hself + _ ≤ Cneg * Real.rpow (3 : ℝ) (τ / 2) * R := by + simpa [Cneg, Nat.cast_one] using hneg + _ ≤ A * R := by + exact mul_le_mul_of_nonneg_right hA_ge_neg_step hR_nonneg + _ = A * Real.rpow (3 : ℝ) ((τ / 2) * (((0 : ℕ) : ℝ))) * R := by + norm_num + · have hm_pos : 1 ≤ m := Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero hm0) + have hself : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((m : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + exact + Ch02.scaleResponseAtScale_infinity_self_le + (Q := originCube d ((m : ℕ) : ℤ)) + (k := ((m : ℕ) : ℤ) - (1 : ℤ)) + (by simp [originCube]) F (scalarMatrix (d := d) σbar) + have hresp := + scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleUnitJ + hP hStruct hΓ ha (m := m) (n := m) (l := 1) + hm_pos le_rfl hX + (by + intro e he + exact hJ e he hScale (by omega)) + have hdiff : ((m - (m - 1) : ℕ) : ℝ) = (1 : ℝ) := by + exact_mod_cast (by omega : m - (m - 1) = 1) + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((m : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := + hself + _ ≤ Cresp * Real.rpow (3 : ℝ) (τ / 2) * R := by + simpa [F, σbar, Cresp, R, hdiff, Nat.cast_one] using hresp + _ ≤ A * R := by + exact mul_le_mul_of_nonneg_right hA_ge_resp_step hR_nonneg + _ = A * Real.rpow (3 : ℝ) ((τ / 2) * (((0 : ℕ) : ℝ))) * R := by + norm_num + · by_cases hlm : l ≤ m + · have hl_pos : 1 ≤ l := Nat.succ_le_of_lt (Nat.pos_of_ne_zero hl0) + have hresp := + scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleUnitJ + hP hStruct hΓ ha (m := m) (n := m) (l := l) + hlm le_rfl hX + (by + intro e he + exact hJ e he hScale (by omega)) + have hdiff : ((m - (m - l) : ℕ) : ℝ) = (l : ℝ) := by + exact_mod_cast (by omega : m - (m - l) = l) + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Cresp * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + simpa [F, σbar, Cresp, R, hdiff] using hresp + _ ≤ A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hA_ge_resp + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le) + hR_nonneg + · let j : ℕ := l - m + have hj_pos : 0 < j := by + dsimp [j] + omega + have hl_eq : l = j + m := by + dsimp [j] + omega + have hk_eq : ((m : ℕ) : ℤ) - (l : ℤ) = -((j : ℕ) : ℤ) := by + dsimp [j] + omega + have hneg_weighted := + weighted_negative_scaleResponse_le_of_scaleZero_collapsed + (d := d) m j (s := τ / 2) (σ := σbar) (R := R) + hτ2_pos hσbar_pos hR_nonneg F + (by simpa [F, σbar] using hell.1) + (by simpa [F, σbar] using hell.2) + have hneg := + negative_scaleResponse_le_of_weighted_envelope + (d := d) m j (s := τ / 2) (σ := σbar) + (A := 2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + (R := R) hτ2_pos (by positivity) hR_nonneg F hneg_weighted + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + = + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + rw [hk_eq] + _ ≤ Cneg * Real.rpow (3 : ℝ) ((τ / 2) * ((j + m : ℕ) : ℝ)) * R := by + simpa [Cneg] using hneg + _ = Cneg * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + rw [hl_eq] + _ ≤ A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hA_ge_neg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le) + hR_nonneg + exact + homogenizationErrorOnOriginCube_le_of_scaleResponseMinimalEnvelope + (d := d) (m := m) F (scalarMatrix (d := d) σbar) + (r := r) (tau := τ) (delta := δ) (q := q) + (A := A) (X := X) (alpha := α) + hδ hrq hδq hq hA_nonneg hX hscale + +/-- Natural lower-scale response estimate obtained from the finite normalized +probe maximum and the minimal-scale envelope. -/ +theorem scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleProbeJ + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m n l : ℕ} (hln : l ≤ n) (hnm : n ≤ m) + {τ X α : ℝ} (hX : 0 < X) + (hprobe : + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m (n - l) a ≤ + ((3 : ℝ) ^ m / X) ^ (-α)) : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + ((n : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * ((m - (n - l) : ℕ) : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) + have hbase_pos : 0 < (3 : ℝ) ^ m / X := by + exact div_pos (by positivity) hX + have hD_nonneg : 0 ≤ ((3 : ℝ) ^ m / X) ^ (-α) := + (Real.rpow_pos_of_pos hbase_pos (-α)).le + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hprobe_sq : + Real.rpow (3 : ℝ) (-τ * ((m - (n - l) : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m (n - l) a ≤ + R ^ (2 : ℕ) := by + simpa [R, Real.sq_sqrt hD_nonneg] using hprobe + have hcast : (((n - l : ℕ) : ℤ)) = (n : ℤ) - (l : ℤ) := by + omega + have hle : n - l ≤ m := by + omega + have hresp := + scaleResponseAtScale_originCube_nat_le_rpow_of_weighted_localizedNormalizedProbeJMax + hP hStruct hΓ ha hle hR_nonneg hprobe_sq + simpa [hcast] using hresp + +/-- Whole-cube finite-`q` homogenization-error control from positive-scale +response rows and the negative-scale unit-ellipticity envelope. -/ +theorem homogenizationErrorOnOriginCube_le_of_positiveScaleResponses_and_unitEllipticity + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {r τ δ q X α : ℝ} + (hδ : δ = r - τ / 2) + (hτ : 0 < τ) (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hUpper : hΓ.params.sUpper < τ / 2) + (hLower : hΓ.params.sLower < τ / 2) + (hX : 0 < X) + (hPos : + ∀ {l : ℕ}, 1 ≤ l → l ≤ m → + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) + (hUnit : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ)) : + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + classical + intro Cresp Cneg A + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + let σbar : ℝ := barSigmaLimit hP hStruct + let R : ℝ := Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) + have hτ2_pos : 0 < τ / 2 := by positivity + have hσbar_pos : 0 < σbar := by + simpa [σbar] using hΓ.barSigmaLimit_pos + have hbase_pos : 0 < (3 : ℝ) ^ m / X := + div_pos (by positivity) hX + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hCresp_nonneg : 0 ≤ Cresp := by + dsimp [Cresp] + positivity + have hdiscτ_pos : 0 < Ch02.geometricDiscount (τ / 2) 1 := by + simpa [Ch02.geometricDiscount_eq_old] using + Homogenization.geometricDiscount_pos (s := τ / 2) (q := 1) + (by simpa using hτ2_pos) + have hCneg_nonneg : 0 ≤ Cneg := by + dsimp [Cneg] + positivity + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hA_ge_resp : Cresp ≤ A := by + dsimp [A] + have hpow_one : 1 ≤ Real.rpow (3 : ℝ) (τ / 2) := + Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) hτ2_pos.le + calc + Cresp ≤ max Cresp Cneg := le_max_left _ _ + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := by + have hmax_nonneg : 0 ≤ max Cresp Cneg := + le_max_of_le_left hCresp_nonneg + calc + max Cresp Cneg = max Cresp Cneg * 1 := by ring + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := + mul_le_mul_of_nonneg_left hpow_one hmax_nonneg + have hA_ge_neg : Cneg ≤ A := by + dsimp [A] + have hpow_one : 1 ≤ Real.rpow (3 : ℝ) (τ / 2) := + Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) hτ2_pos.le + calc + Cneg ≤ max Cresp Cneg := le_max_right _ _ + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := by + have hmax_nonneg : 0 ≤ max Cresp Cneg := + le_max_of_le_right hCneg_nonneg + calc + max Cresp Cneg = max Cresp Cneg * 1 := by ring + _ ≤ max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2) := + mul_le_mul_of_nonneg_left hpow_one hmax_nonneg + have hA_ge_resp_step : + Cresp * Real.rpow (3 : ℝ) (τ / 2) ≤ A := by + dsimp [A] + exact mul_le_mul_of_nonneg_right (le_max_left Cresp Cneg) + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hA_ge_neg_step : + Cneg * Real.rpow (3 : ℝ) (τ / 2) ≤ A := by + dsimp [A] + exact mul_le_mul_of_nonneg_right (le_max_right Cresp Cneg) + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hell := + scaleZero_ellipticity_sup_bounds_of_localizedLimitWeightedUnitEllipticitySup_le + hP hStruct hΓ ha (m := m) (t := τ / 2) + (M := Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * R) + hUpper hLower (by simpa [R] using hUnit) + have hscale : ∀ l : ℕ, + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + intro l + by_cases hl0 : l = 0 + · subst l + by_cases hm0 : m = 0 + · subst m + have hself : + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (0 : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (-(1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + exact + Ch02.scaleResponseAtScale_infinity_self_le + (Q := originCube d (0 : ℤ)) (k := -(1 : ℤ)) + (by simp [originCube]) F (scalarMatrix (d := d) σbar) + have hneg_weighted := + weighted_negative_scaleResponse_le_of_scaleZero_collapsed + (d := d) 0 1 (s := τ / 2) (σ := σbar) (R := R) + hτ2_pos hσbar_pos hR_nonneg F + (by simpa [F, σbar] using hell.1) + (by simpa [F, σbar] using hell.2) + have hneg := + negative_scaleResponse_le_of_weighted_envelope + (d := d) 0 1 (s := τ / 2) (σ := σbar) + (A := 2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + (R := R) hτ2_pos (by positivity) hR_nonneg F hneg_weighted + calc + Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (0 : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Ch02.scaleResponseAtScale (originCube d (0 : ℤ)) (-(1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := + hself + _ ≤ Cneg * Real.rpow (3 : ℝ) (τ / 2) * R := by + simpa [Cneg, Nat.cast_one] using hneg + _ ≤ A * R := by + exact mul_le_mul_of_nonneg_right hA_ge_neg_step hR_nonneg + _ = A * Real.rpow (3 : ℝ) ((τ / 2) * (((0 : ℕ) : ℝ))) * R := by + norm_num + · have hm_pos : 1 ≤ m := Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero hm0) + have hself : + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((m : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) ≤ + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + exact + Ch02.scaleResponseAtScale_infinity_self_le + (Q := originCube d ((m : ℕ) : ℤ)) + (k := ((m : ℕ) : ℤ) - (1 : ℤ)) + (by simp [originCube]) F (scalarMatrix (d := d) σbar) + have hresp := hPos (l := 1) (by omega) hm_pos + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) ((m : ℕ) : ℤ) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (1 : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := + hself + _ ≤ Cresp * Real.rpow (3 : ℝ) (τ / 2) * R := by + simpa [F, σbar, Cresp, R, Nat.cast_one] using hresp + _ ≤ A * R := by + exact mul_le_mul_of_nonneg_right hA_ge_resp_step hR_nonneg + _ = A * Real.rpow (3 : ℝ) ((τ / 2) * (((0 : ℕ) : ℝ))) * R := by + norm_num + · by_cases hlm : l ≤ m + · have hl_pos : 1 ≤ l := Nat.succ_le_of_lt (Nat.pos_of_ne_zero hl0) + have hresp := hPos (l := l) hl_pos hlm + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + ≤ Cresp * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + simpa [F, σbar, Cresp, R] using hresp + _ ≤ A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hA_ge_resp + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le) + hR_nonneg + · let j : ℕ := l - m + have hj_pos : 0 < j := by + dsimp [j] + omega + have hl_eq : l = j + m := by + dsimp [j] + omega + have hk_eq : ((m : ℕ) : ℤ) - (l : ℤ) = -((j : ℕ) : ℤ) := by + dsimp [j] + omega + have hneg_weighted := + weighted_negative_scaleResponse_le_of_scaleZero_collapsed + (d := d) m j (s := τ / 2) (σ := σbar) (R := R) + hτ2_pos hσbar_pos hR_nonneg F + (by simpa [F, σbar] using hell.1) + (by simpa [F, σbar] using hell.2) + have hneg := + negative_scaleResponse_le_of_weighted_envelope + (d := d) m j (s := τ / 2) (σ := σbar) + (A := 2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))) + (R := R) hτ2_pos (by positivity) hR_nonneg F hneg_weighted + calc + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) + = + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity F (scalarMatrix (d := d) σbar) := by + rw [hk_eq] + _ ≤ Cneg * Real.rpow (3 : ℝ) ((τ / 2) * ((j + m : ℕ) : ℝ)) * R := by + simpa [Cneg] using hneg + _ = Cneg * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + rw [hl_eq] + _ ≤ A * Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * R := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hA_ge_neg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le) + hR_nonneg + exact + homogenizationErrorOnOriginCube_le_of_scaleResponseMinimalEnvelope + (d := d) (m := m) F (scalarMatrix (d := d) σbar) + (r := r) (tau := τ) (delta := δ) (q := q) + (A := A) (X := X) (alpha := α) + hδ hrq hδq hq hA_nonneg hX hscale + +/-- Whole-cube finite-`q` homogenization-error control from one random scale +which controls the positive finite-probe `J` rows and the negative-scale +unit-ellipticity rows. -/ +theorem homogenizationErrorOnOriginCube_le_of_minimalScaleProbeJ_and_unitEllipticity + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {r τ δ q X α : ℝ} + (hδ : δ = r - τ / 2) + (hτ : 0 < τ) (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hUpper : hΓ.params.sUpper < τ / 2) + (hLower : hΓ.params.sLower < τ / 2) + (hX : 0 < X) + (hProbe : + ∀ {n : ℕ}, + X ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a ≤ + ((3 : ℝ) ^ m / X) ^ (-α)) + (hUnit : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ)) + (hScale : X ≤ (3 : ℝ) ^ m) : + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + intro Cresp Cneg A + have hPos : + ∀ {l : ℕ}, 1 ≤ l → l ≤ m → + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) + (((m : ℕ) : ℤ) - (l : ℤ)) + Ch02.MultiscaleExponent.infinity + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + Real.rpow (3 : ℝ) ((τ / 2) * (l : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + intro l hl_pos hlm + have hprobe : + Real.rpow (3 : ℝ) (-τ * ((m - (m - l) : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m (m - l) a ≤ + ((3 : ℝ) ^ m / X) ^ (-α) := by + exact hProbe hScale (by omega) + have hresp := + scaleResponseAtScale_originCube_nat_sub_le_of_minimalScaleProbeJ + hP hStruct hΓ ha (m := m) (n := m) (l := l) + hlm le_rfl hX hprobe + have hdiff : ((m - (m - l) : ℕ) : ℝ) = (l : ℝ) := by + exact_mod_cast (by omega : m - (m - l) = l) + simpa [Cresp, hdiff] using hresp + simpa [Cresp, Cneg, A] using + homogenizationErrorOnOriginCube_le_of_positiveScaleResponses_and_unitEllipticity + hP hStruct hΓ ha (m := m) (r := r) (τ := τ) (δ := δ) + (q := q) (X := X) (α := α) + hδ hτ hrq hδq hq hUpper hLower hX hPos hUnit + +/-- Same deterministic assembly with separate pointwise scales for the finite +probe `J` rows and the unit-ellipticity rows. The exposed bound uses the +single collapsed scale `max XJ XU`. -/ +theorem homogenizationErrorOnOriginCube_le_of_two_minimalScales_probeJ + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {r τ δ q XJ XU α : ℝ} + (hδ : δ = r - τ / 2) + (hτ : 0 < τ) (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hUpper : hΓ.params.sUpper < τ / 2) + (hLower : hΓ.params.sLower < τ / 2) + (hα : 0 ≤ α) + (hXJ : 0 < XJ) (hXU : 0 < XU) + (hProbe : + ∀ {n : ℕ}, + XJ ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a ≤ + ((3 : ℝ) ^ m / XJ) ^ (-α)) + (hUnit : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / XU) ^ (-α))) ^ (2 : ℕ)) + (hScale : max XJ XU ≤ (3 : ℝ) ^ m) : + let X : ℝ := max XJ XU; + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + intro X Cresp Cneg A + have hX : 0 < X := by + dsimp [X] + exact hXJ.trans_le (le_max_left XJ XU) + have hProbe_lift : + ∀ {n : ℕ}, + X ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a ≤ + ((3 : ℝ) ^ m / X) ^ (-α) := by + intro n hXm hnm + have hraw := hProbe (le_trans (le_max_left XJ XU) hXm) hnm + exact hraw.trans + (by + simpa [X] using + collapsed_algebraic_factor_le_of_le + (m := m) (X := XJ) (Y := X) (α := α) + hXJ (by dsimp [X]; exact le_max_left XJ XU) hα) + have hUnit_lift : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ) := by + exact hUnit.trans + (by + simpa [X] using + collapsed_square_envelope_le_of_le + (m := m) (X := XU) (Y := X) (α := α) (s := τ / 2) + hXU (by dsimp [X]; exact le_max_right XJ XU) hα) + simpa [X, Cresp, Cneg, A] using + homogenizationErrorOnOriginCube_le_of_minimalScaleProbeJ_and_unitEllipticity + hP hStruct hΓ ha (m := m) (r := r) (τ := τ) (δ := δ) + (q := q) (X := X) (α := α) + hδ hτ hrq hδq hq hUpper hLower hX hProbe_lift hUnit_lift + (by simpa [X] using hScale) + +/-- Same deterministic assembly with separate pointwise scales for the `J` +rows and the unit-ellipticity rows. The exposed bound uses the single +collapsed scale `max XJ XU`. -/ +theorem homogenizationErrorOnOriginCube_le_of_two_minimalScales + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {r τ δ q XJ XU α : ℝ} + (hδ : δ = r - τ / 2) + (hτ : 0 < τ) (hrq : 0 ≤ r * q) (hδq : 0 < δ * q) (hq : 0 < q) + (hUpper : hΓ.params.sUpper < τ / 2) + (hLower : hΓ.params.sLower < τ / 2) + (hα : 0 ≤ α) + (hXJ : 0 < XJ) (hXU : 0 < XU) + (hJ : ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + ∀ {n : ℕ}, + XJ ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e a ≤ + ((3 : ℝ) ^ m / XJ) ^ (-α)) + (hUnit : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / XU) ^ (-α))) ^ (2 : ℕ)) + (hScale : max XJ XU ≤ (3 : ℝ) ^ m) : + let X : ℝ := max XJ XU; + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount δ q)⁻¹) + (1 / q) * + A * Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α)) := by + intro X Cresp Cneg A + have hX : 0 < X := by + dsimp [X] + exact hXJ.trans_le (le_max_left XJ XU) + have hJ_lift : + ∀ e : FullBlockVec d, dotProduct e e ≤ 1 → + ∀ {n : ℕ}, + X ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e a ≤ + ((3 : ℝ) ^ m / X) ^ (-α) := by + intro e he n hXm hnm + have hraw := + hJ e he (le_trans (le_max_left XJ XU) hXm) hnm + exact hraw.trans + (by + simpa [X] using + collapsed_algebraic_factor_le_of_le + (m := m) (X := XJ) (Y := X) (α := α) + hXJ (by dsimp [X]; exact le_max_left XJ XU) hα) + have hUnit_lift : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X) ^ (-α))) ^ (2 : ℕ) := by + exact hUnit.trans + (by + simpa [X] using + collapsed_square_envelope_le_of_le + (m := m) (X := XU) (Y := X) (α := α) (s := τ / 2) + hXU (by dsimp [X]; exact le_max_right XJ XU) hα) + simpa [X, Cresp, Cneg, A] using + homogenizationErrorOnOriginCube_le_of_minimalScaleUnitJ_and_unitEllipticity + hP hStruct hΓ ha (m := m) (r := r) (τ := τ) (δ := δ) + (q := q) (X := X) (α := α) + hδ hτ hrq hδq hq hUpper hLower hX hJ_lift hUnit_lift + (by simpa [X] using hScale) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorQuenched.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorQuenched.lean new file mode 100644 index 0000000000..783e58d697 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationErrorQuenched.lean @@ -0,0 +1,710 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitEllipticityMinimalExpLogSq +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorMinimalScale +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHomogenizationQuenched + +/-! # Homogenization Error Quenched -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal MatrixOrder BigOperators + +/-! +# Quenched finite-q homogenization-error corollary + +This file converts the Section 5.7 minimal-scale theorem into a finite-`q` +bound on `\mathcal E_{r,\infty,q}` above a single random scale. +-/ + +noncomputable section + +theorem deterministic_unitEllipticity_bound_le_squareEnvelope + {K θ D τ α : ℝ} {m : ℕ} + (hKD : K * θ ^ (2 : ℕ) ≤ D ^ α) + (hD : 0 < D) (hατ : α ≤ τ) : + K * θ ^ (2 : ℕ) ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) := by + have hDα_pos : 0 < D ^ α := Real.rpow_pos_of_pos hD α + have hfactor_ge_one : + 1 ≤ Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) := by + exact Real.one_le_rpow + (by norm_num : (1 : ℝ) ≤ 3) + (mul_nonneg (sub_nonneg.mpr hατ) (by positivity)) + have hnum_pos : 0 < (3 : ℝ) ^ m := by positivity + have hB_nonneg : 0 ≤ (((3 : ℝ) ^ m / D) ^ (-α)) := by + positivity + have hA_sq : + Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (τ * (m : ℝ)) := by + let x : ℝ := (τ / 2) * (m : ℝ) + have hpow₀ : + Real.rpow (3 : ℝ) (x * (2 : ℝ)) = + Real.rpow (Real.rpow (3 : ℝ) x) (2 : ℝ) := by + exact Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) x (2 : ℝ) + have hpow : + Real.rpow (3 : ℝ) (x * (2 : ℝ)) = + Real.rpow (3 : ℝ) x ^ (2 : ℕ) := by + simpa [Real.rpow_two] using hpow₀ + calc + Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (x * (2 : ℝ)) := by + simpa [x] using hpow.symm + _ = Real.rpow (3 : ℝ) (τ * (m : ℝ)) := by + congr 1 + ring + have hB_eq : + (((3 : ℝ) ^ m / D) ^ (-α)) = + Real.rpow (3 : ℝ) (-α * (m : ℝ)) * D ^ α := by + have hpowm_eq : ((3 : ℝ) ^ m : ℝ) = Real.rpow (3 : ℝ) (m : ℝ) := by + simp + have hpow_mul : + Real.rpow (Real.rpow (3 : ℝ) (m : ℝ)) (-α) = + Real.rpow (3 : ℝ) ((m : ℝ) * (-α)) := by + exact (Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) (m : ℝ) (-α)).symm + rw [Real.div_rpow hnum_pos.le hD.le (-α)] + rw [Real.rpow_neg hD.le α] + rw [hpowm_eq] + change + Real.rpow (Real.rpow (3 : ℝ) (m : ℝ)) (-α) / + (D ^ α)⁻¹ = + Real.rpow (3 : ℝ) (-α * (m : ℝ)) * D ^ α + rw [hpow_mul] + field_simp [Real.rpow_pos_of_pos hD α |>.ne'] + have henv_eq : + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) = + Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) * D ^ α := by + calc + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) + = + Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) ^ (2 : ℕ) * + (((3 : ℝ) ^ m / D) ^ (-α)) := by + rw [mul_pow, Real.sq_sqrt hB_nonneg] + _ = + Real.rpow (3 : ℝ) (τ * (m : ℝ)) * + (Real.rpow (3 : ℝ) (-α * (m : ℝ)) * D ^ α) := by + rw [hA_sq, hB_eq] + _ = + Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) * D ^ α := by + have hcombine : + Real.rpow (3 : ℝ) (τ * (m : ℝ)) * + Real.rpow (3 : ℝ) (-α * (m : ℝ)) = + Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) := by + calc + Real.rpow (3 : ℝ) (τ * (m : ℝ)) * + Real.rpow (3 : ℝ) (-α * (m : ℝ)) + = + Real.rpow (3 : ℝ) (τ * (m : ℝ) + -α * (m : ℝ)) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (τ * (m : ℝ)) (-α * (m : ℝ))).symm + _ = Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) := by + congr 1 + ring + rw [← mul_assoc, hcombine] + calc + K * θ ^ (2 : ℕ) ≤ D ^ α := hKD + _ = 1 * D ^ α := by ring + _ ≤ Real.rpow (3 : ℝ) ((τ - α) * (m : ℝ)) * D ^ α := + mul_le_mul_of_nonneg_right hfactor_ge_one hDα_pos.le + _ = + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) := henv_eq.symm + +theorem finset_univ_fin_two_sup'_if_eq_max + {Ω : Type*} (X Y : Ω → ℝ) (ω : Ω) : + (Finset.univ : Finset (Fin 2)).sup' + (by exact ⟨0, by simp⟩) + (fun i => if i = 0 then X ω else Y ω) = + max (X ω) (Y ω) := by + classical + apply le_antisymm + · refine Finset.sup'_le _ _ ?_ + intro i _hi + fin_cases i <;> simp + · refine max_le ?_ ?_ + · have hmem : (0 : Fin 2) ∈ (Finset.univ : Finset (Fin 2)) := by simp + exact (Finset.le_sup' (fun i => if i = 0 then X ω else Y ω) hmem).trans_eq + (by simp) + · have hmem : (1 : Fin 2) ∈ (Finset.univ : Finset (Fin 2)) := by simp + exact (Finset.le_sup' (fun i => if i = 0 then X ω else Y ω) hmem).trans_eq + (by simp) + +theorem isBigO_gammaSigma_max_two_of_scales + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsFiniteMeasure μ] + {η AJ AU : ℝ} (hη : 0 < η) + {XJ XU : Ω → ℝ} + (hJ : IsBigO μ (gammaSigma η) XJ AJ) + (hU : IsBigO μ (gammaSigma η) XU AU) : + IsBigO μ (gammaSigma η) (fun ω => max (XJ ω) (XU ω)) + (((3 * Real.log (2 : ℝ)) ^ η⁻¹) * max AJ AU) := by + classical + let S : Finset (Fin 2) := Finset.univ + have hS : S.Nonempty := by + exact ⟨0, by simp [S]⟩ + let Z : Fin 2 → Ω → ℝ := fun i ω => + if i = 0 then XJ ω else XU ω + let A : Fin 2 → ℝ := fun i => if i = 0 then AJ else AU + have hcard : 2 ≤ S.card := by + simp [S] + have hZA : ∀ i ∈ S, IsBigO μ (gammaSigma η) (Z i) (A i) := by + intro i _hi + fin_cases i <;> simp [Z, A, hJ, hU] + have hsup := + IndependentSums.isBigO_gammaSigma_finset_sup'_of_scales + (μ := μ) (s := S) (hs := hS) (X := Z) (a := A) (σ := η) + hη hcard hZA + have hfun : + (fun ω => S.sup' hS (fun i => Z i ω)) = + fun ω => max (XJ ω) (XU ω) := by + funext ω + simpa [S, Z] using finset_univ_fin_two_sup'_if_eq_max XJ XU ω + have hA : S.sup' hS A = max AJ AU := by + simpa [S, A] using + finset_univ_fin_two_sup'_if_eq_max + (fun _ : Unit => AJ) (fun _ : Unit => AU) () + have hcard_real : (S.card : ℝ) = (2 : ℝ) := by + simp [S] + simpa [hfun, hA, hcard_real] using hsup + +/-- Finite-`sigma` minimal-scale control of the full finite-`q` +homogenization error on origin cubes. + +The random scale is the maximum of the `J` minimal scale and the localized +unit-ellipticity minimal scale; all deterministic terms are collapsed into +the single factor `(3^m / X)^(-alpha/2)`. -/ +theorem exists_homogenizationErrorOnOriginCube_interpolated_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {σ τ r q : ℝ}, 0 < σ → + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 ≤ r * q → + 0 < (r - τ / 2) * q → + 0 < q → + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube + (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField + aω ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount (r - τ / 2) q)⁻¹) + (1 / q) * + A * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) := by + obtain ⟨α, hα_pos, hαmax, hJbase⟩ := + exists_quenchedLocalizedEstimate_interpolated_expLogSq_uniformAnnealedExponent + (d := d) params + refine ⟨α, hα_pos, hαmax, ?_⟩ + intro σ τ r q hσ_pos hτ_half hατ_half hτ_le_one hrq hδq hq + dsimp only + let ηJ : ℝ := finiteQuenchedTailExponent d σ τ + let ηU : ℝ := finiteQuenchedTailExponent d σ (τ / 2) + let η : ℝ := min ηJ ηU + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hmaxτ : max params.sUpper params.sLower < τ := by + have hhalf_lt : τ / 2 < τ := by linarith + exact hτ_half.trans hhalf_lt + have hηJ_pos : 0 < ηJ := by + simpa [ηJ] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := τ) hσ_pos hτ_pos + have hηU_pos : 0 < ηU := by + simpa [ηU] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := τ / 2) hσ_pos hτ2_pos + have hη_pos : 0 < η := by + dsimp [η] + exact lt_min hηJ_pos hηU_pos + obtain ⟨CJ, hCJ_pos, hJlaw⟩ := + hJbase (σ := σ) hσ_pos (t := τ) hmaxτ hτ_le_one + obtain ⟨CU, hCU_pos, hUlaw⟩ := + exists_unitEllipticityMinimalScale_interpolated_expLogSq + (d := d) (σ := σ) hσ_pos params + (t := τ / 2) (α := α) + hτ2_pos hα_pos.le hατ_half + let Ksup : ℝ := (3 * Real.log (2 : ℝ)) ^ η⁻¹ + let Cscale : ℝ := 4 * max 0 (Real.log Ksup) + CJ + CU + have hKsup_pos : 0 < Ksup := by + dsimp [Ksup] + exact Real.rpow_pos_of_pos + (mul_pos (by norm_num : (0 : ℝ) < 3) + (Real.log_pos (by norm_num : (1 : ℝ) < 2))) _ + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hmax_nonneg : 0 ≤ max 0 (Real.log Ksup) := le_max_left 0 _ + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + obtain ⟨XJ, hOJ_raw, hXJ_one, hJpoint⟩ := + hJlaw hP hStruct hΓ hσ_eq hparams + obtain ⟨XU, hOU_raw, hXU_one, hUpoint⟩ := + hUlaw hP hStruct hΓ hσ_eq hparams + let X : RegCoeffField d → ℝ := fun aω => max (XJ aω) (XU aω) + let AJ : ℝ := + Real.exp (CJ * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) + let AU : ℝ := + Real.exp (CU * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) + have hOJ : + IsBigO P (gammaSigma η) XJ AJ := by + exact Ch04.IsBigO.gammaSigma_mono_exponent + (μ := P) (ρ := η) (σ := ηJ) + (by dsimp [η]; exact min_le_left _ _) (by simpa [ηJ, AJ] using hOJ_raw) + have hOU : + IsBigO P (gammaSigma η) XU AU := by + exact Ch04.IsBigO.gammaSigma_mono_exponent + (μ := P) (ρ := η) (σ := ηU) + (by dsimp [η]; exact min_le_right _ _) (by simpa [ηU, AU] using hOU_raw) + have hOmax_raw : + IsBigO P (gammaSigma η) X + (Ksup * max AJ AU) := by + simpa [X, Ksup] using + isBigO_gammaSigma_max_two_of_scales + (μ := P) (η := η) (AJ := AJ) (AU := AU) + hη_pos hOJ hOU + have hscale_final : + Ksup * max AJ AU ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ) + let Ck : ℝ := 4 * max 0 (Real.log Ksup) + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hAJ_le : AJ ≤ Real.exp ((CJ + CU) * L2) := by + refine Real.exp_le_exp.mpr ?_ + dsimp [AJ, L2] + nlinarith [mul_nonneg hCU_pos.le hL2_nonneg] + have hAU_le : AU ≤ Real.exp ((CJ + CU) * L2) := by + refine Real.exp_le_exp.mpr ?_ + dsimp [AU, L2] + nlinarith [mul_nonneg hCJ_pos.le hL2_nonneg] + have hmax_le : max AJ AU ≤ Real.exp ((CJ + CU) * L2) := + max_le hAJ_le hAU_le + have hK_le : Ksup ≤ Real.exp (Ck * L2) := by + have hraw := + const_mul_rpow_max_one_le_exp_logSq + (A := Ksup) (θ := hΓ.thetaHat) (p := (0 : ℝ)) + hKsup_pos hΓ.thetaHat_pos.le (by norm_num) + simpa [Ksup, Ck, L2] using hraw + calc + Ksup * max AJ AU + ≤ Ksup * Real.exp ((CJ + CU) * L2) := + mul_le_mul_of_nonneg_left hmax_le hKsup_pos.le + _ ≤ Real.exp (Ck * L2) * Real.exp ((CJ + CU) * L2) := + mul_le_mul_of_nonneg_right hK_le (Real.exp_pos _).le + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add] + dsimp [Cscale, Ck] + ring_nf + have hO : + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hOmax_raw hscale_final + refine ⟨X, hO, ?_, ?_⟩ + · intro aω + dsimp [X] + exact hXJ_one aω |>.trans (le_max_left _ _) + have hJprobeAE : + ∀ᵐ aω ∂P, + ∀ i : NormalizedProbeIndex d, + ∀ {m n : ℕ}, + XJ aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) aω ≤ + ((3 : ℝ) ^ m / XJ aω) ^ (-α) := by + rw [MeasureTheory.ae_all_iff] + intro i + exact hJpoint (normalizedProbeVec i) + (normalizedProbeVec_dotProduct_self_le_one i) + filter_upwards [hJprobeAE, hUpoint] with aω hJprobe hUnit + intro ha m hXm + have hXJ_pos : 0 < XJ aω := + lt_of_lt_of_le zero_lt_one (hXJ_one aω) + have hXU_pos : 0 < XU aω := + lt_of_lt_of_le zero_lt_one (hXU_one aω) + have hScale : max (XJ aω) (XU aω) ≤ (3 : ℝ) ^ m := by + simpa [X] using hXm + have hUpper : hΓ.params.sUpper < τ / 2 := by + have hs : params.sUpper ≤ max params.sUpper params.sLower := le_max_left _ _ + exact by simpa [hparams] using hs.trans_lt hτ_half + have hLower : hΓ.params.sLower < τ / 2 := by + have hs : params.sLower ≤ max params.sUpper params.sLower := le_max_right _ _ + exact by simpa [hparams] using hs.trans_lt hτ_half + have hProbe : + ∀ {n : ℕ}, + XJ aω ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n aω ≤ + ((3 : ℝ) ^ m / XJ aω) ^ (-α) := by + intro n hXJn hnm + let W : ℝ := Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) + have hW_pos : 0 < W := by + dsimp [W] + positivity + exact + weighted_localizedNormalizedProbeJMax_le_of_forall_probe + hP hStruct (m := m) (n := n) aω (W := W) + (R := ((3 : ℝ) ^ m / XJ aω) ^ (-α)) + hW_pos + (by + intro i + simpa [W] using hJprobe i hXJn hnm) + have hUnit_m : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / XU aω) ^ (-α))) ^ (2 : ℕ) := by + exact hUnit (by exact (le_max_right _ _).trans hScale) + simpa [X] using + homogenizationErrorOnOriginCube_le_of_two_minimalScales_probeJ + hP hStruct hΓ ha (m := m) (r := r) (τ := τ) + (δ := r - τ / 2) (q := q) (XJ := XJ aω) (XU := XU aω) + (α := α) rfl hτ_pos hrq hδq hq hUpper hLower hα_pos.le + hXJ_pos hXU_pos hProbe hUnit_m hScale + +/-- Endpoint (`σ = ∞`) minimal-scale control of the full finite-`q` +homogenization error on origin cubes. + +The random scale is the maximum of the endpoint `J` minimal scale and a +deterministic unit-ellipticity scale depending on `thetaHat`; the latter is +absorbed into the same `exp(C log^2(2 + thetaHat))` prefactor. -/ +theorem exists_homogenizationErrorOnOriginCube_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {τ r q : ℝ}, + max params.sUpper params.sLower < τ / 2 → + α < τ / 2 → + τ ≤ 1 → + 0 ≤ r * q → + 0 < (r - τ / 2) * q → + 0 < q → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + let Cresp : ℝ := + Real.sqrt + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)); + let Cneg : ℝ := + (Ch02.geometricDiscount (τ / 2) 1)⁻¹ * + (2 * Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ))); + let A : ℝ := max Cresp Cneg * Real.rpow (3 : ℝ) (τ / 2); + Ch02.HomogenizationErrorOnCube + (originCube d ((m : ℕ) : ℤ)) r + Ch02.MultiscaleExponent.infinity (.finite q) + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField + aω ha) + (scalarMatrix (d := d) (barSigmaLimit hP hStruct)) ≤ + Real.rpow + (Ch02.geometricDiscount r q * + (Ch02.geometricDiscount (r - τ / 2) q)⁻¹) + (1 / q) * + A * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α)) := by + obtain ⟨α, hα_pos, hαmax, hJbase⟩ := + exists_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + (d := d) params + refine ⟨α, hα_pos, hαmax, ?_⟩ + intro τ r q hτ_half hατ_half hτ_le_one hrq hδq hq + dsimp only + have hτ2_pos : 0 < τ / 2 := + (max_sUpper_sLower_pos params).trans hτ_half + have hτ_pos : 0 < τ := by linarith + have hmaxτ : max params.sUpper params.sLower < τ := by + have hhalf_lt : τ / 2 < τ := by linarith + exact hτ_half.trans hhalf_lt + have hτ_dim : τ ≤ (d : ℝ) / 2 := by + have hd : (2 : ℝ) ≤ (d : ℝ) := by exact_mod_cast params.two_le_dim + have hone : (1 : ℝ) ≤ (d : ℝ) / 2 := by nlinarith + exact hτ_le_one.trans hone + let η : ℝ := ((d : ℕ) : ℝ) + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast lt_of_lt_of_le (by norm_num : (0 : ℕ) < 2) + params.two_le_dim + obtain ⟨CJ, hCJ_pos, hJlaw⟩ := + hJbase (t := τ) hmaxτ hτ_dim + let Kunit : ℝ := Ch04.gammaMomentConst (1 : ℝ) * (params.xi : ℝ) + let Aextra : ℝ := (max 1 Kunit) ^ α⁻¹ + let pextra : ℝ := 2 * α⁻¹ + let CD : ℝ := 4 * max 0 (Real.log Aextra) + 2 * pextra + let Ksup : ℝ := (3 * Real.log (2 : ℝ)) ^ η⁻¹ + let Cscale : ℝ := 4 * max 0 (Real.log Ksup) + CJ + CD + have hKunit_pos : 0 < Kunit := by + dsimp [Kunit] + exact mul_pos (IndependentSums.gammaMomentConst_pos zero_lt_one) + (by exact_mod_cast params.xi_pos) + have hAextra_pos : 0 < Aextra := by + dsimp [Aextra] + exact Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 Kunit)) α⁻¹ + have hpextra_nonneg : 0 ≤ pextra := by + dsimp [pextra] + positivity + have hCD_nonneg : 0 ≤ CD := by + dsimp [CD] + have hlog_nonneg : 0 ≤ max 0 (Real.log Aextra) := le_max_left 0 _ + nlinarith + have hKsup_pos : 0 < Ksup := by + dsimp [Ksup] + exact Real.rpow_pos_of_pos + (mul_pos (by norm_num : (0 : ℝ) < 3) + (Real.log_pos (by norm_num : (1 : ℝ) < 2))) _ + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hlog_nonneg : 0 ≤ max 0 (Real.log Ksup) := le_max_left 0 _ + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + obtain ⟨XJ, hOJ, hXJ_one, hJpoint⟩ := + hJlaw hP hStruct hInf hparams + let θ : ℝ := hInf.thetaHat + let D : ℝ := (max 1 (Kunit * θ ^ (2 : ℕ))) ^ α⁻¹ + let X : RegCoeffField d → ℝ := fun aω => max (XJ aω) D + have hD_one : 1 ≤ D := by + dsimp [D] + exact Real.one_le_rpow (le_max_left 1 (Kunit * θ ^ (2 : ℕ))) + (inv_nonneg.mpr hα_pos.le) + have hD_pos : 0 < D := lt_of_lt_of_le zero_lt_one hD_one + have hDpow_eq : D ^ α = max 1 (Kunit * θ ^ (2 : ℕ)) := by + dsimp [D] + exact Real.rpow_inv_rpow + (le_trans zero_le_one (le_max_left 1 (Kunit * θ ^ (2 : ℕ)))) + hα_pos.ne' + have hKD_le : Kunit * θ ^ (2 : ℕ) ≤ D ^ α := by + calc + Kunit * θ ^ (2 : ℕ) ≤ max 1 (Kunit * θ ^ (2 : ℕ)) := + le_max_right 1 _ + _ = D ^ α := hDpow_eq.symm + let AJ : ℝ := Real.exp (CJ * (Real.log (2 + θ)) ^ (2 : ℕ)) + have hOD_raw : + IsBigO P (gammaSigma η) (fun _ : RegCoeffField d => D) D := by + exact Ch04.isBigO_gammaSigma_const_of_abs_le + (μ := P) (σ := η) (A := D) (c := D) + hD_pos.le (by rw [abs_of_pos hD_pos]) + have hOmax_raw : + IsBigO P (gammaSigma η) X (Ksup * max AJ D) := by + simpa [X, Ksup, AJ, η] using + isBigO_gammaSigma_max_two_of_scales + (μ := P) (η := η) (AJ := AJ) (AU := D) + hη_pos (by simpa [η, AJ, θ] using hOJ) hOD_raw + have hD_poly : D ≤ Aextra * (max 1 θ) ^ pextra := by + simpa [D, Kunit, Aextra, pextra, θ] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := Kunit) (θ := θ) (r := α⁻¹) + hInf.thetaHat_pos.le (inv_nonneg.mpr hα_pos.le) + have hD_exp : + D ≤ Real.exp (CD * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + calc + D ≤ Aextra * (max 1 θ) ^ pextra := hD_poly + _ ≤ Real.exp (CD * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + simpa [CD, θ] using + const_mul_rpow_max_one_le_exp_logSq + (A := Aextra) (θ := θ) (p := pextra) + hAextra_pos hInf.thetaHat_pos.le hpextra_nonneg + have hscale_final : + Ksup * max AJ D ≤ + Real.exp + (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + let Ck : ℝ := 4 * max 0 (Real.log Ksup) + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hAJ_le : AJ ≤ Real.exp ((CJ + CD) * L2) := by + refine Real.exp_le_exp.mpr ?_ + dsimp [AJ, L2] + nlinarith [mul_nonneg hCD_nonneg hL2_nonneg] + have hD_le : D ≤ Real.exp ((CJ + CD) * L2) := by + calc + D ≤ Real.exp (CD * L2) := by simpa [L2] using hD_exp + _ ≤ Real.exp ((CJ + CD) * L2) := by + refine Real.exp_le_exp.mpr ?_ + nlinarith [mul_nonneg hCJ_pos.le hL2_nonneg] + have hmax_le : max AJ D ≤ Real.exp ((CJ + CD) * L2) := + max_le hAJ_le hD_le + have hK_le : Ksup ≤ Real.exp (Ck * L2) := by + have hraw := + const_mul_rpow_max_one_le_exp_logSq + (A := Ksup) (θ := θ) (p := (0 : ℝ)) + hKsup_pos hInf.thetaHat_pos.le (by norm_num) + simpa [Ksup, Ck, L2, θ] using hraw + calc + Ksup * max AJ D + ≤ Ksup * Real.exp ((CJ + CD) * L2) := + mul_le_mul_of_nonneg_left hmax_le hKsup_pos.le + _ ≤ Real.exp (Ck * L2) * Real.exp ((CJ + CD) * L2) := + mul_le_mul_of_nonneg_right hK_le (Real.exp_pos _).le + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add] + dsimp [Cscale, Ck] + ring_nf + have hO : + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hOmax_raw + (by simpa [θ] using hscale_final) + refine ⟨X, hO, ?_, ?_⟩ + · intro aω + dsimp [X] + exact (hXJ_one aω).trans (le_max_left _ _) + have hJprobeAE : + ∀ᵐ aω ∂P, + ∀ i : NormalizedProbeIndex d, + ∀ {m n : ℕ}, + XJ aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-τ * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) aω ≤ + ((3 : ℝ) ^ m / XJ aω) ^ (-α) := by + rw [MeasureTheory.ae_all_iff] + intro i + exact hJpoint (normalizedProbeVec i) + (normalizedProbeVec_dotProduct_self_le_one i) + have hUnitAE : + ∀ᵐ aω ∂P, ∀ m : ℕ, + localizedLimitWeightedUnitEllipticitySup hP hStruct hInf.params m aω ≤ + Kunit * θ ^ (2 : ℕ) := by + rw [MeasureTheory.ae_all_iff] + intro m + simpa [Kunit, θ, hparams] using! + hInf.localizedLimitWeightedUnitEllipticitySup_le_thetaHat_sq_ae + (m := m) + filter_upwards [hJprobeAE, hUnitAE] with aω hJprobe hUnit + intro ha m hXm + let hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hInf.toGammaSigma 1 zero_lt_one + have hXJ_pos : 0 < XJ aω := + lt_of_lt_of_le zero_lt_one (hXJ_one aω) + have hScale : max (XJ aω) D ≤ (3 : ℝ) ^ m := by + simpa [X] using hXm + have hUpper : hΓ.params.sUpper < τ / 2 := by + have hs : params.sUpper ≤ max params.sUpper params.sLower := le_max_left _ _ + simpa [hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma, hparams] + using hs.trans_lt hτ_half + have hLower : hΓ.params.sLower < τ / 2 := by + have hs : params.sLower ≤ max params.sUpper params.sLower := le_max_right _ _ + simpa [hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma, hparams] + using hs.trans_lt hτ_half + have hProbe : + ∀ {n : ℕ}, + XJ aω ≤ (3 : ℝ) ^ m → + n < m → + Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n aω ≤ + ((3 : ℝ) ^ m / XJ aω) ^ (-α) := by + intro n hXJn hnm + let W : ℝ := Real.rpow (3 : ℝ) (-τ * ((m - n : ℕ) : ℝ)) + have hW_pos : 0 < W := by + dsimp [W] + positivity + exact + weighted_localizedNormalizedProbeJMax_le_of_forall_probe + hP hStruct (m := m) (n := n) aω (W := W) + (R := ((3 : ℝ) ^ m / XJ aω) ^ (-α)) + hW_pos + (by + intro i + simpa [W] using hJprobe i hXJn hnm) + have hα_le_τ : α ≤ τ := by nlinarith + have hUnit_m : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) := by + have hunit' : + localizedLimitWeightedUnitEllipticitySup hP hStruct hInf.params m aω ≤ + Kunit * θ ^ (2 : ℕ) := by + exact hUnit m + calc + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m aω + = + localizedLimitWeightedUnitEllipticitySup hP hStruct hInf.params m aω := by + simp [hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] + _ ≤ Kunit * θ ^ (2 : ℕ) := hunit' + _ ≤ + (Real.rpow (3 : ℝ) ((τ / 2) * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / D) ^ (-α))) ^ (2 : ℕ) := + deterministic_unitEllipticity_bound_le_squareEnvelope + (K := Kunit) (θ := θ) (D := D) (τ := τ) (α := α) + (m := m) hKD_le hD_pos hα_le_τ + simpa [X, hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using + homogenizationErrorOnOriginCube_le_of_two_minimalScales_probeJ + hP hStruct hΓ ha (m := m) (r := r) (τ := τ) + (δ := r - τ / 2) (q := q) (XJ := XJ aω) (XU := D) + (α := α) rfl hτ_pos hrq hδq hq hUpper hLower hα_pos.le + hXJ_pos hD_pos hProbe hUnit_m hScale + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationQuenched.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationQuenched.lean new file mode 100644 index 0000000000..ab5cd867fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/HomogenizationQuenched.lean @@ -0,0 +1,767 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.EntryScaleCompression +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompressionFinal + +/-! # Homogenization Quenched -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Quenched homogenization above the quantitative minimal scale + +This file applies the deterministic scale compression to the quantitative +minimal-scale theorem. The result is still written with the shifted entry +scale `N0`; the final public wrapper only has to choose the admissible +exponent `alpha` and undo the harmless shift. +-/ + +noncomputable section + +theorem exists_shifted_quenchedLocalizedEstimate_interpolated_expLogSq + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let b : ℝ := (d : ℝ) / 2 + 0 < t → + t ≤ b → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hmin⟩ := + exists_quantitative_shifted_quenchedLocalizedEstimate_interpolated + (d := d) (σ := σ) hσ_pos params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro t αbad + dsimp only + intro ht htb hα_nonneg hαt hαb hαharm hαa + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let W : ℝ := max 1 w + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + obtain ⟨R, _hR, hminR⟩ := + hmin (t := t) (αbad := αbad) + ht htb hα_nonneg hαt hαb hαharm hαa + let QcutConst : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + obtain ⟨Cscale, hCscale_pos, hscale⟩ := + explicit_minimalScale_prefactor_le_exp_logSq + (d := d) (σ := σ) (Cfluct := Cfluct) (Ccrude := Ccrude) + (a := a) (t := t) (αbad := αbad) (R := R) + hσ_pos hCfluct hCcrude ha ht + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hΓ.thetaHat ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead Qcut) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + have hpack := + hminR hP hStruct hΓ hσ_eq hparams + dsimp only at hpack + change + IsBigO P (gammaSigma η) X (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) at hpack + rcases hpack with ⟨hO, hXone, hpoint⟩ + have hscaleθ : + 3 * ((3 : ℝ) ^ Q) * B ≤ + Real.exp (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + exact hscale hΓ.thetaHat hΓ.thetaHat_pos + refine ⟨X, ?_, hXone, hpoint⟩ + exact IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hO hscaleθ + +/-- The larger regularity exponent in the parameter-only `(P4)` data is +positive. -/ +theorem max_sUpper_sLower_pos {d : ℕ} + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < max params.sUpper params.sLower := + lt_of_lt_of_le params.sUpper_pos (le_max_left _ _) + +/-- The shifted quenched estimate with a single exponent selected from the +moment parameters. + +The exponent `alpha` is chosen before the law. For every decay exponent +`t > max sUpper sLower` with `t ≤ d / 2`, the stochastic scale has the manuscript +`exp(C log^2(2 + thetaHat))` size and the interpolated tail exponent +`finiteQuenchedTailExponent d sigma t`. -/ +theorem exists_shifted_quenchedLocalizedEstimate_interpolated_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry α : ℝ, 0 < Centry ∧ 0 < α ∧ + ∀ {t : ℝ}, max params.sUpper params.sLower < t → + t ≤ (d : ℝ) / 2 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, a, hCentry, ha, hbase⟩ := + exists_shifted_quenchedLocalizedEstimate_interpolated_expLogSq + (d := d) (σ := σ) hσ_pos params + let b : ℝ := (d : ℝ) / 2 + let s0 : ℝ := max params.sUpper params.sLower + have hb : 0 < b := by + have hd_nat : 0 < d := + lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_nat + dsimp [b] + linarith + have hs0 : 0 < s0 := by + dsimp [s0] + exact max_sUpper_sLower_pos params + obtain ⟨α, hα_pos, hαs0, hαa, hαb, hαharm⟩ := + exists_alpha_for_highCompetition (a := a) (b := b) (t := s0) + ha hb hs0 + refine ⟨Centry, α, hCentry, hα_pos, ?_⟩ + intro t ht htb + have ht_pos : 0 < t := hs0.trans ht + have hαt : α < t := hαs0.trans ht + obtain ⟨Cscale, hCscale_pos, hlaw⟩ := + hbase (t := t) (αbad := α) + ht_pos (by simpa [b] using htb) hα_pos.le hαt hαb hαharm hαa + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + exact hlaw hP hStruct hΓ hσ_eq hparams + +/-- Absolute-scale version of the shifted quenched estimate, valid once the +bottom scale has passed the annealed entry scale. + +Compared with +`exists_shifted_quenchedLocalizedEstimate_interpolated_expLogSq_parameterAlpha`, +the random scale is multiplied by `3 ^ N0`; the deterministic entry-scale +compression from `EntryScaleCompression` keeps the same manuscript +`exp(C log^2(2 + thetaHat))` envelope. -/ +theorem exists_aboveEntry_quenchedLocalizedEstimate_interpolated_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry α : ℝ, 0 < Centry ∧ 0 < α ∧ + ∀ {t : ℝ}, max params.sUpper params.sLower < t → + t ≤ (d : ℝ) / 2 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + N0 ≤ n → + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, α, hCentry, hα_pos, hshifted⟩ := + exists_shifted_quenchedLocalizedEstimate_interpolated_expLogSq_parameterAlpha + (d := d) (σ := σ) hσ_pos params + obtain ⟨CentryEntry, hCentryEntry_pos, hentry⟩ := + exists_entryScale_pow_three_le_exp_logSq + (d := d) (σ := σ) (Centry := Centry) hσ_pos hCentry params + refine ⟨Centry, α, hCentry, hα_pos, ?_⟩ + intro t ht htb + obtain ⟨Cshift, hCshift_pos, hlaw⟩ := hshifted (t := t) ht htb + let Ctotal : ℝ := CentryEntry + Cshift + have hCtotal_pos : 0 < Ctotal := by + dsimp [Ctotal] + positivity + refine ⟨Ctotal, hCtotal_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := finiteQuenchedTailExponent d σ t + obtain ⟨Xshift, hOshift, hXshift_one, hpoint_shift⟩ := + hlaw hP hStruct hΓ hσ_eq hparams + let Xabs : RegCoeffField d → ℝ := fun aω => (3 : ℝ) ^ N0 * Xshift aω + have hentry_bound : + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryEntry * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + simpa [N0] using hentry hP hStruct hΓ hσ_eq hparams + have hOabs_raw : + IsBigO P (gammaSigma η) Xabs + ((3 : ℝ) ^ N0 * + Real.exp (Cshift * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) := by + simpa [Xabs, η] using + IndependentSums.IsBigO.const_mul + (μ := P) (Ψ := gammaSigma η) (X := Xshift) + (A := Real.exp (Cshift * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) + (c := (3 : ℝ) ^ N0) + (by positivity : 0 ≤ (3 : ℝ) ^ N0) hOshift + have hscale_abs : + (3 : ℝ) ^ N0 * + Real.exp (Cshift * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) ≤ + Real.exp (Ctotal * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ) + calc + (3 : ℝ) ^ N0 * Real.exp (Cshift * L2) + ≤ Real.exp (CentryEntry * L2) * Real.exp (Cshift * L2) := + mul_le_mul_of_nonneg_right hentry_bound (Real.exp_pos _).le + _ = Real.exp (Ctotal * L2) := by + rw [← Real.exp_add] + dsimp [Ctotal] + ring_nf + have hOabs : + IsBigO P (gammaSigma η) Xabs + (Real.exp + (Ctotal * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hOabs_raw hscale_abs + refine ⟨Xabs, hOabs, ?_, ?_⟩ + · intro aω + have hpow_one : 1 ≤ (3 : ℝ) ^ N0 := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + exact one_le_mul_of_one_le_of_one_le hpow_one (hXshift_one aω) + · intro e he + have hshift_e := hpoint_shift e he + filter_upwards [hshift_e] with aω hshift_a + intro m n hN0n hXabs_le hnm + let m' : ℕ := m - N0 + let n' : ℕ := n - N0 + have hN0m : N0 ≤ m := le_trans hN0n (le_of_lt hnm) + have hm_eq : N0 + m' = m := by + dsimp [m'] + exact Nat.add_sub_of_le hN0m + have hn_eq : N0 + n' = n := by + dsimp [n'] + exact Nat.add_sub_of_le hN0n + have hn'm' : n' < m' := by + dsimp [m', n'] + omega + have hpowm : + (3 : ℝ) ^ m = (3 : ℝ) ^ N0 * (3 : ℝ) ^ m' := by + rw [← pow_add] + rw [hm_eq] + have hXshift_le : Xshift aω ≤ (3 : ℝ) ^ m' := by + have hpow_pos : 0 < (3 : ℝ) ^ N0 := by positivity + have htarget : + (3 : ℝ) ^ N0 * Xshift aω ≤ + (3 : ℝ) ^ N0 * (3 : ℝ) ^ m' := by + simpa [Xabs, hpowm] using hXabs_le + nlinarith + have hdiff : (m' - n' : ℕ) = m - n := by + dsimp [m', n'] + omega + have hXshift_pos : 0 < Xshift aω := + lt_of_lt_of_le zero_lt_one (hXshift_one aω) + have hquot : + (3 : ℝ) ^ m' / Xshift aω = + (3 : ℝ) ^ m / Xabs aω := by + dsimp [Xabs] + rw [hpowm] + field_simp [hXshift_pos.ne', pow_ne_zero N0 (by norm_num : (3 : ℝ) ≠ 0)] + have hresult := + hshift_a (m := m') (n := n') hXshift_le hn'm' + simpa [N0, hm_eq, hn_eq, hdiff, hquot] using hresult + +/-- Note-facing quenched homogenization estimate above a random minimal scale. + +The exponent `alpha` is selected before the law and depends only on the +dimension and the moment parameters. For each admissible `t`, the scale +constant is selected before the probability law; the stochastic integrability +exponent is the corrected finite-`sigma` exponent +`finiteQuenchedTailExponent d sigma t`. -/ +theorem exists_quenchedLocalizedEstimate_interpolated_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + ∀ {t : ℝ}, max params.sUpper params.sLower < t → t ≤ 1 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let η : ℝ := finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Cfluct, CcrudeShift, Csmall, Centry, a, + hCfluct, hCcrudeShift, hCsmall, hCentry, ha, habsBase⟩ := + exists_quantitative_absolute_quenchedLocalizedEstimate_interpolated + (d := d) (σ := σ) hσ_pos params + obtain ⟨CentryEntry, hCentryEntry_pos, hentry⟩ := + exists_entryScale_pow_three_le_exp_logSq + (d := d) (σ := σ) (Centry := Centry) hσ_pos hCentry params + let b : ℝ := (d : ℝ) / 2 + let s0 : ℝ := max params.sUpper params.sLower + have hb : 0 < b := by + have hd_nat : 0 < d := + lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_nat + dsimp [b] + linarith + have hs0 : 0 < s0 := by + dsimp [s0] + exact max_sUpper_sLower_pos params + obtain ⟨α, hα_pos, hαs0, hαa, hαb, hαharm⟩ := + exists_alpha_for_highCompetition (a := a) (b := b) (t := s0) + ha hb hs0 + refine ⟨α, hα_pos, ?_⟩ + intro t ht ht_le_one + have ht_pos : 0 < t := hs0.trans ht + have htb : t ≤ b := by + have hone_le_b : (1 : ℝ) ≤ b := by + have hd : (2 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast params.two_le_dim + dsimp [b] + nlinarith + exact ht_le_one.trans hone_le_b + have hαt : α < t := hαs0.trans ht + obtain ⟨Rshift, Rsmall, Runion, habsLaw⟩ := + habsBase (t := t) (α := α) + ht_pos htb hα_pos.le hαt (by simpa [b] using hαb) + (by simpa [b] using hαharm) hαa + obtain ⟨Cscale, hCscale_pos, hscale⟩ := + explicit_absoluteMinimalScale_prefactor_le_exp_logSq + (d := d) (σ := σ) (Cfluct := Cfluct) + (CcrudeShift := CcrudeShift) (Csmall := Csmall) + (a := a) (t := t) (α := α) (CentryScale := CentryEntry) + (Rshift := Rshift) (Rsmall := Rsmall) (Runion := Runion) + hσ_pos hCfluct hCcrudeShift hCsmall ha ht_pos hαt + hCentryEntry_pos + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + have hpack := + habsLaw hP hStruct hΓ hσ_eq hparams + dsimp only at hpack + change + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) at hpack + rcases hpack with ⟨hO, hXone, hpoint⟩ + have hentry_bound : + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryEntry * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + simpa [N0] using hentry hP hStruct hΓ hσ_eq hparams + have hscaleθ : + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + have hraw := + hscale (θ := hΓ.thetaHat) (N0 := N0) hΓ.thetaHat_pos hentry_bound + dsimp only at hraw + change + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) at hraw + exact hraw + refine ⟨X, ?_, hXone, hpoint⟩ + exact IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hO hscaleθ + +/-- Note-facing finite-`sigma` quenched estimate with the public exponent +chosen before `sigma`. + +The annealed entry constant and the final algebraic exponent depend only on +the dimension and the deterministic moment parameters. For each finite +moment exponent `sigma`, the fluctuation constants and scale constant may +depend on `sigma`, as in the manuscript. -/ +theorem exists_quenchedLocalizedEstimate_interpolated_expLogSq_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {σ : ℝ}, 0 < σ → + ∀ {t : ℝ}, max params.sUpper params.sLower < t → t ≤ 1 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + let η : ℝ := finiteQuenchedTailExponent d σ t + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, a, hCentry, ha, habsBaseUniform⟩ := + exists_quantitative_absolute_quenchedLocalizedEstimate_interpolated_uniformAnnealedExponent + (d := d) params + let b : ℝ := (d : ℝ) / 2 + let s0 : ℝ := max params.sUpper params.sLower + have hb : 0 < b := by + have hd_nat : 0 < d := + lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_nat + dsimp [b] + linarith + have hs0 : 0 < s0 := by + dsimp [s0] + exact max_sUpper_sLower_pos params + obtain ⟨α, hα_pos, hαs0, hαa, hαb, hαharm⟩ := + exists_alpha_for_highCompetition (a := a) (b := b) (t := s0) + ha hb hs0 + refine ⟨α, hα_pos, by simpa [s0] using hαs0, ?_⟩ + intro σ hσ_pos t ht ht_le_one + obtain ⟨Cfluct, CcrudeShift, Csmall, + hCfluct, hCcrudeShift, hCsmall, habsBase⟩ := + habsBaseUniform hσ_pos + obtain ⟨CentryEntry, hCentryEntry_pos, hentry⟩ := + exists_entryScale_pow_three_le_exp_logSq + (d := d) (σ := σ) (Centry := Centry) hσ_pos hCentry params + have ht_pos : 0 < t := hs0.trans ht + have htb : t ≤ b := by + have hone_le_b : (1 : ℝ) ≤ b := by + have hd : (2 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast params.two_le_dim + dsimp [b] + nlinarith + exact ht_le_one.trans hone_le_b + have hαt : α < t := hαs0.trans ht + obtain ⟨Rshift, Rsmall, Runion, habsLaw⟩ := + habsBase (t := t) (α := α) + ht_pos htb hα_pos.le hαt (by simpa [b] using hαb) + (by simpa [b] using hαharm) hαa + obtain ⟨Cscale, hCscale_pos, hscale⟩ := + explicit_absoluteMinimalScale_prefactor_le_exp_logSq + (d := d) (σ := σ) (Cfluct := Cfluct) + (CcrudeShift := CcrudeShift) (Csmall := Csmall) + (a := a) (t := t) (α := α) (CentryScale := CentryEntry) + (Rshift := Rshift) (Rsmall := Rsmall) (Runion := Runion) + hσ_pos hCfluct hCcrudeShift hCsmall ha ht_pos hαt + hCentryEntry_pos + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - α) + (min (b - α) + (min ((t - α) * (1 + b / a)) + (b - α * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - α) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - α) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let Mshift : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let ρgap : ℝ := (3 : ℝ) ^ η + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let Dhigh : ℝ := 2 * K * Cfluct * hΓ.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * CcrudeShift * hΓ.thetaHat ^ (2 : ℕ) + let DenShift : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let BleadShift : ℝ := + max (DenShift * (3 : ℝ) ^ Ohigh) + (DenShift * (3 : ℝ) ^ Ocrude) + let BtailShift : ℝ := 2 * BleadShift + let cgapShift : ℝ := BleadShift ^ (-η) - BtailShift ^ (-η) + let QprefShift : ℕ := + max (Nat.ceil (max 0 (Real.log Mshift))) + (max Rshift (Nat.ceil ((2 * max 0 (-(Real.log cgapShift))) / + Real.log ρgap))) + let QleadShift : ℕ := Nat.ceil (Real.log BleadShift / Real.log 3) + let QcutShift : ℕ := Nat.ceil ((L + 1) / (1 - α / a) + 1) + let Qshift : ℕ := max QprefShift (max QleadShift QcutShift) + let scaleSmall : ℝ := K * (Csmall * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let prefSmall : ℝ := (N0 : ℝ) * (S.card : ℝ) * w ^ N0 + let Msmall : ℝ := max 1 (max 0 (prefSmall * Ksmall)) + let BleadSmall : ℝ := smallBottomTailDenominator scaleSmall η σ + let BtailSmall : ℝ := 2 * BleadSmall + let cgapSmall : ℝ := BleadSmall ^ (-η) - BtailSmall ^ (-η) + let QprefSmall : ℕ := + max (Nat.ceil (max 0 (Real.log Msmall))) + (max Rsmall (Nat.ceil ((2 * max 0 (-(Real.log cgapSmall))) / + Real.log ρgap))) + let QleadSmall : ℕ := Nat.ceil (Real.log BleadSmall / Real.log 3) + let Qsmall : ℕ := max QprefSmall QleadSmall + let BleadUnion : ℝ := max BtailShift BtailSmall + let BtailUnion : ℝ := 2 * BleadUnion + let cgapUnion : ℝ := BleadUnion ^ (-η) - BtailUnion ^ (-η) + let Qunion : ℕ := + max (Nat.ceil (max 0 (Real.log (2 : ℝ)))) + (max Runion (Nat.ceil ((2 * max 0 (-(Real.log cgapUnion))) / + Real.log ρgap))) + let Q : ℕ := max Qshift (max Qsmall Qunion) + let B : ℝ := max 1 BtailUnion + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent H t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale (N0 + Q) Bad + have hpack := + habsLaw hP hStruct hΓ hσ_eq hparams + dsimp only at hpack + change + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ (N0 + Q)) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) at hpack + rcases hpack with ⟨hO, hXone, hpoint⟩ + have hentry_bound : + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryEntry * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + simpa [N0] using hentry hP hStruct hΓ hσ_eq hparams + have hscaleθ : + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + have hraw := + hscale (θ := hΓ.thetaHat) (N0 := N0) hΓ.thetaHat_pos hentry_bound + dsimp only at hraw + change + 3 * ((3 : ℝ) ^ (N0 + Q)) * B ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) at hraw + exact hraw + refine ⟨X, ?_, hXone, hpoint⟩ + exact IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hO hscaleθ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/KernelUnion.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/KernelUnion.lean new file mode 100644 index 0000000000..08b2dfd2dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/KernelUnion.lean @@ -0,0 +1,371 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentialKernel +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.WeightedExponentialKernel + +/-! # Kernel Union -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Kernel union bounds for fixed-pair events + +This file turns two-parameter stretched-exponential fixed-pair bounds into +countable union bounds over the paired natural indices. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +theorem measureReal_iUnion_unpair_le_exp_two_kernel + {μ : Measure Ω} [IsFiniteMeasure μ] + {E : ℕ → ℕ → Set Ω} + {A ρ₁ ρ₂ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) + (hρ₁ : 1 < ρ₁) (hρ₂ : 1 < ρ₂) (hη : 0 < η) + (hE : ∀ i j : ℕ, + μ.real (E i j) ≤ + C * Real.exp (-((A * ρ₁ ^ i * ρ₂ ^ j) ^ η))) : + μ.real (⋃ k : ℕ, E (Nat.unpair k).1 (Nat.unpair k).2) ≤ + C * + (Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η) := by + let kernel : ℕ × ℕ → ℝ := fun p => + Real.exp (-((A * ρ₁ ^ p.1 * ρ₂ ^ p.2) ^ η)) + let f : ℕ → ℝ := fun k => + μ.real (E (Nat.unpair k).1 (Nat.unpair k).2) + let g : ℕ → ℝ := fun k => C * kernel (Nat.unpair k) + have hkernel_prod : Summable kernel := by + simpa [kernel] using + summable_exp_neg_two_rpow_mul_pow + (A := A) (ρ₁ := ρ₁) (ρ₂ := ρ₂) (η := η) hA hρ₁ hρ₂ hη + have hunpair_inj : Function.Injective (Nat.unpair : ℕ → ℕ × ℕ) := + Nat.pairEquiv.symm.injective + have hkernel_unpair : Summable fun k : ℕ => kernel (Nat.unpair k) := by + simpa [Function.comp] using! hkernel_prod.comp_injective hunpair_inj + have hg : Summable g := by + simpa [g] using hkernel_unpair.mul_left C + have hf : Summable f := by + refine Summable.of_nonneg_of_le ?_ ?_ hg + · intro k + dsimp [f] + positivity + · intro k + dsimp [f, g, kernel] + exact hE (Nat.unpair k).1 (Nat.unpair k).2 + have hkernel_unpair_tsum_le : + (∑' k : ℕ, kernel (Nat.unpair k)) ≤ + Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η := by + calc + (∑' k : ℕ, kernel (Nat.unpair k)) + = ∑' p : ℕ × ℕ, kernel p := by + simpa [kernel, Nat.pairEquiv] using! + (Nat.pairEquiv.symm.tsum_eq kernel) + _ ≤ Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η := by + simpa [kernel] using + tsum_exp_neg_two_rpow_mul_pow_le_const + (A := A) (ρ₁ := ρ₁) (ρ₂ := ρ₂) (η := η) + hA hρ₁ hρ₂ hη + calc + μ.real (⋃ k : ℕ, E (Nat.unpair k).1 (Nat.unpair k).2) + ≤ ∑' k : ℕ, f k := by + simpa [f] using + measureReal_iUnion_nat_le_tsum + (μ := μ) + (E := fun k : ℕ => E (Nat.unpair k).1 (Nat.unpair k).2) hf + _ ≤ ∑' k : ℕ, g k := + Summable.tsum_le_tsum + (fun k => by + dsimp [f, g, kernel] + exact hE (Nat.unpair k).1 (Nat.unpair k).2) + hf hg + _ = C * (∑' k : ℕ, kernel (Nat.unpair k)) := by + simpa [g] using hkernel_unpair.tsum_mul_left C + _ ≤ C * + (Real.exp (-(A ^ η)) * + geometricExpKernelConst ρ₁ η * geometricExpKernelConst ρ₂ η) := + mul_le_mul_of_nonneg_left hkernel_unpair_tsum_le hC + +theorem measureReal_iUnion_linearRows_le_exp_linear_kernel + {μ : Measure Ω} [IsFiniteMeasure μ] + {E : (r : ℕ) → Fin (r + 1) → Set Ω} + {A ρ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hE : ∀ (r : ℕ) (j : Fin (r + 1)), + μ.real (E r j) ≤ C * Real.exp (-((A * ρ ^ r) ^ η))) : + μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) ≤ + C * (Real.exp (-(A ^ η)) * linearExpKernelConst ρ η) := by + let Row : ℕ → Set Ω := fun r => ⋃ j : Fin (r + 1), E r j + let kernel : ℕ → ℝ := fun r => Real.exp (-((A * ρ ^ r) ^ η)) + let rowMajor : ℕ → ℝ := fun r => C * (((r : ℝ) + 1) * kernel r) + have hrow_le : ∀ r : ℕ, μ.real (Row r) ≤ rowMajor r := by + intro r + have hfinite : + μ.real (Row r) ≤ ∑ j : Fin (r + 1), μ.real (E r j) := by + simpa [Row] using + measureReal_iUnion_fintype_le (μ := μ) (f := fun j : Fin (r + 1) => E r j) + have hsum : + (∑ j : Fin (r + 1), μ.real (E r j)) ≤ + ∑ _j : Fin (r + 1), C * kernel r := by + exact Finset.sum_le_sum fun j _hj => by + simpa [kernel] using hE r j + calc + μ.real (Row r) ≤ ∑ j : Fin (r + 1), μ.real (E r j) := hfinite + _ ≤ ∑ _j : Fin (r + 1), C * kernel r := hsum + _ = rowMajor r := by + simp [rowMajor] + ring + have hmajor : Summable rowMajor := by + have hbase : + Summable fun r : ℕ => (((r : ℝ) + 1) * kernel r) := by + simpa [kernel] using + summable_linear_mul_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) hA hρ hη + simpa [rowMajor, mul_assoc] using hbase.mul_left C + have hrow : Summable fun r : ℕ => μ.real (Row r) := by + refine Summable.of_nonneg_of_le ?_ hrow_le hmajor + intro r + dsimp [Row] + positivity + calc + μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) + = μ.real (⋃ r : ℕ, Row r) := by simp [Row] + _ ≤ ∑' r : ℕ, μ.real (Row r) := + measureReal_iUnion_nat_le_tsum (μ := μ) (E := Row) hrow + _ ≤ ∑' r : ℕ, rowMajor r := + Summable.tsum_le_tsum hrow_le hrow hmajor + _ = C * (∑' r : ℕ, (((r : ℝ) + 1) * kernel r)) := by + have hbase : + Summable fun r : ℕ => (((r : ℝ) + 1) * kernel r) := by + simpa [kernel] using + summable_linear_mul_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) hA hρ hη + simpa [rowMajor, mul_assoc] using hbase.tsum_mul_left C + _ ≤ C * (Real.exp (-(A ^ η)) * linearExpKernelConst ρ η) := + mul_le_mul_of_nonneg_left + (by + simpa [kernel] using + tsum_linear_mul_exp_neg_rpow_mul_pow_le_const + (A := A) (ρ := ρ) (η := η) hA hρ hη) + hC + +theorem measureReal_iUnion_constRows_le_exp_kernel + {μ : Measure Ω} [IsFiniteMeasure μ] + {Q : ℕ} {E : ℕ → Fin Q → Set Ω} + {A ρ η C : ℝ} + (hC : 0 ≤ C) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hE : ∀ (r : ℕ) (j : Fin Q), + μ.real (E r j) ≤ C * Real.exp (-((A * ρ ^ r) ^ η))) : + μ.real (⋃ r : ℕ, ⋃ j : Fin Q, E r j) ≤ + (Q : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := by + let Row : ℕ → Set Ω := fun r => ⋃ j : Fin Q, E r j + let kernel : ℕ → ℝ := fun r => Real.exp (-((A * ρ ^ r) ^ η)) + let rowMajor : ℕ → ℝ := fun r => (Q : ℝ) * C * kernel r + have hrow_le : ∀ r : ℕ, μ.real (Row r) ≤ rowMajor r := by + intro r + have hfinite : + μ.real (Row r) ≤ ∑ j : Fin Q, μ.real (E r j) := by + simpa [Row] using + measureReal_iUnion_fintype_le (μ := μ) (f := fun j : Fin Q => E r j) + have hsum : + (∑ j : Fin Q, μ.real (E r j)) ≤ + ∑ _j : Fin Q, C * kernel r := by + exact Finset.sum_le_sum fun j _hj => by + simpa [kernel] using hE r j + calc + μ.real (Row r) ≤ ∑ j : Fin Q, μ.real (E r j) := hfinite + _ ≤ ∑ _j : Fin Q, C * kernel r := hsum + _ = rowMajor r := by + simp [rowMajor] + ring + have hmajor : Summable rowMajor := by + have hbase : Summable kernel := by + simpa [kernel] using + summable_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) hA hρ hη + simpa [rowMajor, mul_assoc] using hbase.mul_left ((Q : ℝ) * C) + have hrow : Summable fun r : ℕ => μ.real (Row r) := by + refine Summable.of_nonneg_of_le ?_ hrow_le hmajor + intro r + dsimp [Row] + positivity + calc + μ.real (⋃ r : ℕ, ⋃ j : Fin Q, E r j) + = μ.real (⋃ r : ℕ, Row r) := by simp [Row] + _ ≤ ∑' r : ℕ, μ.real (Row r) := + measureReal_iUnion_nat_le_tsum (μ := μ) (E := Row) hrow + _ ≤ ∑' r : ℕ, rowMajor r := + Summable.tsum_le_tsum hrow_le hrow hmajor + _ = (Q : ℝ) * C * (∑' r : ℕ, kernel r) := by + have hbase : Summable kernel := by + simpa [kernel] using + summable_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) hA hρ hη + simpa [rowMajor, mul_assoc] using hbase.tsum_mul_left ((Q : ℝ) * C) + _ ≤ (Q : ℝ) * C * + (Real.exp (-(A ^ η)) * geometricExpKernelConst ρ η) := by + have hQC_nonneg : 0 ≤ (Q : ℝ) * C := by positivity + exact mul_le_mul_of_nonneg_left + (by + simpa [kernel] using + tsum_exp_neg_rpow_mul_pow_le_const + (A := A) (ρ := ρ) (η := η) hA hρ hη) + hQC_nonneg + +/-- Linear-row union bound with an exponential finite-union prefactor kept +outside the stochastic scale. The weighted superexponential kernel absorbs +the prefactor without weakening the leading `A` exponent. -/ +theorem measureReal_iUnion_linearRows_le_weighted_exp_linear_kernel + {μ : Measure Ω} [IsFiniteMeasure μ] + {E : (r : ℕ) → Fin (r + 1) → Set Ω} + {A ρ η C w : ℝ} + (hC : 0 ≤ C) (hw : 0 < w) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hE : ∀ (r : ℕ) (j : Fin (r + 1)), + μ.real (E r j) ≤ C * (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) ≤ + C * (Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ η)) := by + let Row : ℕ → Set Ω := fun r => ⋃ j : Fin (r + 1), E r j + let kernel : ℕ → ℝ := fun r => Real.exp (-((A * ρ ^ r) ^ η)) + let rowMajor : ℕ → ℝ := fun r => C * (((r : ℝ) + 1) * w ^ r * kernel r) + have hrow_le : ∀ r : ℕ, μ.real (Row r) ≤ rowMajor r := by + intro r + have hfinite : + μ.real (Row r) ≤ ∑ j : Fin (r + 1), μ.real (E r j) := by + simpa [Row] using + measureReal_iUnion_fintype_le (μ := μ) (f := fun j : Fin (r + 1) => E r j) + have hsum : + (∑ j : Fin (r + 1), μ.real (E r j)) ≤ + ∑ _j : Fin (r + 1), C * (w ^ r * kernel r) := by + exact Finset.sum_le_sum fun j _hj => by + simpa [kernel] using hE r j + calc + μ.real (Row r) ≤ ∑ j : Fin (r + 1), μ.real (E r j) := hfinite + _ ≤ ∑ _j : Fin (r + 1), C * (w ^ r * kernel r) := hsum + _ = rowMajor r := by + simp [rowMajor] + ring + have hmajor : Summable rowMajor := by + have hbase : + Summable fun r : ℕ => (((r : ℝ) + 1) * w ^ r * kernel r) := by + simpa [kernel] using + summable_weighted_linear_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) (w := w) hA hρ hη hw + simpa [rowMajor, mul_assoc] using hbase.mul_left C + have hrow : Summable fun r : ℕ => μ.real (Row r) := by + refine Summable.of_nonneg_of_le ?_ hrow_le hmajor + intro r + dsimp [Row] + positivity + calc + μ.real (⋃ r : ℕ, ⋃ j : Fin (r + 1), E r j) + = μ.real (⋃ r : ℕ, Row r) := by simp [Row] + _ ≤ ∑' r : ℕ, μ.real (Row r) := + measureReal_iUnion_nat_le_tsum (μ := μ) (E := Row) hrow + _ ≤ ∑' r : ℕ, rowMajor r := + Summable.tsum_le_tsum hrow_le hrow hmajor + _ = C * (∑' r : ℕ, (((r : ℝ) + 1) * w ^ r * kernel r)) := by + have hbase : + Summable fun r : ℕ => (((r : ℝ) + 1) * w ^ r * kernel r) := by + simpa [kernel] using + summable_weighted_linear_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) (w := w) hA hρ hη hw + simpa [rowMajor, mul_assoc] using hbase.tsum_mul_left C + _ ≤ C * (Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ η)) := + mul_le_mul_of_nonneg_left + (by + simpa [kernel] using + tsum_weighted_linear_exp_neg_rpow_mul_pow_le_const + (A := A) (ρ := ρ) (η := η) (w := w) + hA hρ hη hw) + hC + +/-- Constant-row version of the weighted finite-union kernel bound. -/ +theorem measureReal_iUnion_constRows_le_weighted_exp_kernel + {μ : Measure Ω} [IsFiniteMeasure μ] + {Q : ℕ} {E : ℕ → Fin Q → Set Ω} + {A ρ η C w : ℝ} + (hC : 0 ≤ C) (hw : 0 < w) (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) + (hE : ∀ (r : ℕ) (j : Fin Q), + μ.real (E r j) ≤ C * (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + μ.real (⋃ r : ℕ, ⋃ j : Fin Q, E r j) ≤ + (Q : ℝ) * C * + (Real.exp (-(A ^ η)) * weightedGeometricExpKernelConst w (ρ ^ η)) := by + let Row : ℕ → Set Ω := fun r => ⋃ j : Fin Q, E r j + let kernel : ℕ → ℝ := fun r => Real.exp (-((A * ρ ^ r) ^ η)) + let rowMajor : ℕ → ℝ := fun r => (Q : ℝ) * C * (w ^ r * kernel r) + have hrow_le : ∀ r : ℕ, μ.real (Row r) ≤ rowMajor r := by + intro r + have hfinite : + μ.real (Row r) ≤ ∑ j : Fin Q, μ.real (E r j) := by + simpa [Row] using + measureReal_iUnion_fintype_le (μ := μ) (f := fun j : Fin Q => E r j) + have hsum : + (∑ j : Fin Q, μ.real (E r j)) ≤ + ∑ _j : Fin Q, C * (w ^ r * kernel r) := by + exact Finset.sum_le_sum fun j _hj => by + simpa [kernel] using hE r j + calc + μ.real (Row r) ≤ ∑ j : Fin Q, μ.real (E r j) := hfinite + _ ≤ ∑ _j : Fin Q, C * (w ^ r * kernel r) := hsum + _ = rowMajor r := by + simp [rowMajor] + ring + have hmajor : Summable rowMajor := by + have hbase : Summable fun r : ℕ => w ^ r * kernel r := by + simpa [kernel] using + summable_weighted_geometric_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) (w := w) hA hρ hη hw + simpa [rowMajor, mul_assoc] using hbase.mul_left ((Q : ℝ) * C) + have hrow : Summable fun r : ℕ => μ.real (Row r) := by + refine Summable.of_nonneg_of_le ?_ hrow_le hmajor + intro r + dsimp [Row] + positivity + calc + μ.real (⋃ r : ℕ, ⋃ j : Fin Q, E r j) + = μ.real (⋃ r : ℕ, Row r) := by simp [Row] + _ ≤ ∑' r : ℕ, μ.real (Row r) := + measureReal_iUnion_nat_le_tsum (μ := μ) (E := Row) hrow + _ ≤ ∑' r : ℕ, rowMajor r := + Summable.tsum_le_tsum hrow_le hrow hmajor + _ = (Q : ℝ) * C * (∑' r : ℕ, w ^ r * kernel r) := by + have hbase : Summable fun r : ℕ => w ^ r * kernel r := by + simpa [kernel] using + summable_weighted_geometric_exp_neg_rpow_mul_pow + (A := A) (ρ := ρ) (η := η) (w := w) hA hρ hη hw + simpa [rowMajor, mul_assoc] using hbase.tsum_mul_left ((Q : ℝ) * C) + _ ≤ (Q : ℝ) * C * + (Real.exp (-(A ^ η)) * weightedGeometricExpKernelConst w (ρ ^ η)) := by + have hQC_nonneg : 0 ≤ (Q : ℝ) * C := by positivity + exact mul_le_mul_of_nonneg_left + (by + simpa [kernel] using + tsum_weighted_geometric_exp_neg_rpow_mul_pow_le_const + (A := A) (ρ := ρ) (η := η) (w := w) + hA hρ hη hw) + hQC_nonneg + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LimitNormalization.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LimitNormalization.lean new file mode 100644 index 0000000000..56325e2ab1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LimitNormalization.lean @@ -0,0 +1,306 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AnnealedLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Basic + +/-! # Limit Normalization -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# Limiting full-block normalization + +This file packages the full-block diagonal normalizers associated with the +limiting scalar annealed matrix `\overline A`. These are the Lean objects +appearing in the first quenched estimate as +`\overline A^{-1/2} e` and `\overline A^{1/2} e`. +-/ + +noncomputable section + +/-- Diagonal full-block matrix representing `\overline A^{-1/2}` in the +scalarized limiting normalization. -/ +noncomputable def scalarLimitInvSqrtMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : + FullBlockMat d := + Matrix.diagonal + (Ch04.scalarFullBlockInvSqrtDiag + (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + +/-- Diagonal full-block matrix representing `\overline A^{1/2}` in the +scalarized limiting normalization. -/ +noncomputable def scalarLimitSqrtMatrix + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : + FullBlockMat d := + Matrix.diagonal + (Section56.scalarFullBlockSqrtDiag + (barSigmaLimit hP hStruct) (barSigmaLimit hP hStruct)) + +/-- The first block vector in +`J(Q,\overline A^{-1/2}e,\overline A^{1/2}e)`. -/ +noncomputable def scalarLimitInvSqrtBlockVec + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (e : FullBlockVec d) : BlockVec d := + ofFullBlockVec (Matrix.mulVec (scalarLimitInvSqrtMatrix hP hStruct) e) + +/-- The second block vector in +`J(Q,\overline A^{-1/2}e,\overline A^{1/2}e)`. -/ +noncomputable def scalarLimitSqrtBlockVec + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (e : FullBlockVec d) : BlockVec d := + ofFullBlockVec (Matrix.mulVec (scalarLimitSqrtMatrix hP hStruct) e) + +/-- The Section 5.7 normalized block-response observable with the limiting +annealed normalization. -/ +noncomputable def limitNormalizedBlockJObservable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) (e : FullBlockVec d) : RegCoeffField d → ℝ := + Ch04.blockJObservableCubeSetBlockVec Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + +/-- Unit-cube ellipticity observable with the limiting scalar normalization. +This is the pointwise factor produced after replacing +`\overline A_0` by `\overline A`. -/ +noncomputable def limitWeightedUnitEllipticityObservable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (sUpper sLower : ℝ) : RegCoeffField d → ℝ := + fun a => + (barSigmaLimit hP hStruct)⁻¹ * + Ch04.LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) a + + barSigmaLimit hP hStruct * + (Ch04.lambdaSqCoeffField (originCube d 0) sLower (.finite 1) a)⁻¹ + +/-- Unit-cube ellipticity observable on an arbitrary cube, with the limiting +scalar normalization. The origin version above is the special case used by +the Γσ assumption; this localized version is the one needed for descendant +unit cubes inside a larger cube. -/ +noncomputable def limitWeightedUnitEllipticityObservableOnCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) (sUpper sLower : ℝ) : RegCoeffField d → ℝ := + fun a => + (barSigmaLimit hP hStruct)⁻¹ * + Ch04.LambdaSqCoeffField Q sUpper (.finite 1) a + + barSigmaLimit hP hStruct * + (Ch04.lambdaSqCoeffField Q sLower (.finite 1) a)⁻¹ + +@[simp] theorem limitWeightedUnitEllipticityObservableOnCube_originCube_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (sUpper sLower : ℝ) : + limitWeightedUnitEllipticityObservableOnCube hP hStruct + (originCube d 0) sUpper sLower = + limitWeightedUnitEllipticityObservable hP hStruct sUpper sLower := + rfl + +namespace GammaSigmaCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +/-- The two limiting scalar normalizers are dual: their pairing preserves the +Euclidean square norm of the full-block vector. -/ +theorem scalarLimit_normalizers_pairing_eq_dotProduct + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) : + blockVecDot + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) = + dotProduct e e := by + classical + let L : ℝ := barSigmaLimit hP hStruct + have hL_pos : 0 < L := by + simpa [L] using hΓ.barSigmaLimit_pos + have hsqrtL_ne : √(barSigmaLimit hP hStruct) ≠ 0 := by + simpa [L] using ne_of_gt (Real.sqrt_pos.2 hL_pos) + rw [← dotProduct_toFullBlockVec] + simp only [scalarLimitInvSqrtBlockVec, scalarLimitSqrtBlockVec, + toFullBlockVec_ofFullBlockVec] + unfold dotProduct + simp only [Matrix.mulVec] + refine Finset.sum_congr rfl ?_ + intro α _hα + cases α with + | inl i => + simp [scalarLimitInvSqrtMatrix, scalarLimitSqrtMatrix, + Ch04.scalarFullBlockInvSqrtDiag, Section56.scalarFullBlockSqrtDiag] + field_simp [hsqrtL_ne] + | inr i => + simp [scalarLimitInvSqrtMatrix, scalarLimitSqrtMatrix, + Ch04.scalarFullBlockInvSqrtDiag, Section56.scalarFullBlockSqrtDiag] + field_simp [hsqrtL_ne] + +/-- Replacing the unit-scale scalar normalizer by the limiting scalar normalizer +costs at most the initial scalar contrast. -/ +theorem limitWeightedUnitEllipticityObservable_le_thetaAtScale_zero_mul_unit + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (a : RegCoeffField d) : + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a ≤ + thetaAtScale hP hStruct (0 : ℤ) * + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b0 := hP.barSigmaAtScale hStruct (0 : ℤ) + let L := barSigmaLimit hP hStruct + let θ := thetaAtScale hP hStruct (0 : ℤ) + let Λ := + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let I := + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + have hb0_nonneg : 0 ≤ b0 := by + exact (Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 0).le + have hθ_one : 1 ≤ θ := by + simpa [θ] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 0 + have hΛ_nonneg : 0 ≤ Λ := by + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : 0 ≤ I := by + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hL_inv : + L⁻¹ ≤ θ * b0⁻¹ := by + simpa [L, θ, b0] using + hΓ.barSigmaLimit_inv_le_thetaAtScale_zero_mul_barSigmaAtScale_zero_inv + have hL_le_b0 : L ≤ b0 := by + simpa [L, b0] using hΓ.barSigmaLimit_le_barSigmaAtScale 0 + have hb0_le_theta_b0 : b0 ≤ θ * b0 := by + calc + b0 = 1 * b0 := by ring + _ ≤ θ * b0 := mul_le_mul_of_nonneg_right hθ_one hb0_nonneg + have hL_le_theta_b0 : L ≤ θ * b0 := hL_le_b0.trans hb0_le_theta_b0 + have hupper : L⁻¹ * Λ ≤ (θ * b0⁻¹) * Λ := + mul_le_mul_of_nonneg_right hL_inv hΛ_nonneg + have hlower : L * I ≤ (θ * b0) * I := + mul_le_mul_of_nonneg_right hL_le_theta_b0 hI_nonneg + calc + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a + = L⁻¹ * Λ + L * I := by + simp [limitWeightedUnitEllipticityObservable, L, Λ, I] + _ ≤ (θ * b0⁻¹) * Λ + (θ * b0) * I := add_le_add hupper hlower + _ = + θ * + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + have hbar : 0 < hP.barSigmaAtScale hStruct (0 : ℤ) := + hΓ.barSigmaAtScale_zero_pos + simp [gammaSigmaUnitEllipticityObservable, θ, b0, Λ, I, hbar] + ring + +/-- Pointwise nonnegativity of the localized limiting-normalized unit +ellipticity observable. -/ +theorem limitWeightedUnitEllipticityObservableOnCube_nonneg + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (Q : TriadicCube d) (a : RegCoeffField d) : + 0 ≤ limitWeightedUnitEllipticityObservableOnCube hP hStruct Q + hΓ.params.sUpper hΓ.params.sLower a := by + have hL_pos : 0 < barSigmaLimit hP hStruct := hΓ.barSigmaLimit_pos + have hΛ_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField Q hΓ.params.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg Q a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField Q hΓ.params.sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + dsimp [limitWeightedUnitEllipticityObservableOnCube] + exact add_nonneg + (mul_nonneg (inv_pos.mpr hL_pos).le hΛ_nonneg) + (mul_nonneg hL_pos.le hI_nonneg) + +/-- The limiting-normalized unit ellipticity observable inherits the Γσ tail +from the unit-scale Γσ assumption. -/ +theorem limitWeightedUnitEllipticityObservable_isBigO + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + IsBigO P (gammaSigma hΓ.sigma) + (limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower) + (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) := by + let : IsProbabilityMeasure P := hP.isProbability + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let θ := thetaAtScale hP hStruct (0 : ℤ) + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hθ_nonneg : 0 ≤ θ := by + exact le_trans zero_le_one + (by + simpa [θ] using + Section54.GoodScale.one_le_thetaAtScale_of_P4 hP hStruct hP4 0) + have hY_nonneg : ∀ a, 0 ≤ Y a := by + intro a + have hL_pos : 0 < barSigmaLimit hP hStruct := hΓ.barSigmaLimit_pos + have hΛ_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + dsimp [Y, limitWeightedUnitEllipticityObservable] + exact add_nonneg + (mul_nonneg (inv_pos.mpr hL_pos).le hΛ_nonneg) + (mul_nonneg hL_pos.le hI_nonneg) + have hθX_nonneg : ∀ a, 0 ≤ θ * X a := by + intro a + exact mul_nonneg hθ_nonneg (by + simpa [X] using hΓ.unitEllipticityObservable_nonneg a) + have htail : IsBigO P (gammaSigma hΓ.sigma) (fun a => θ * X a) + (θ * hΓ.thetaHat) := by + simpa [X, θ] using + IndependentSums.IsBigO.const_mul + (μ := P) (Ψ := gammaSigma hΓ.sigma) + (X := gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower) + (A := hΓ.thetaHat) hθ_nonneg hΓ.tail + exact htail.of_abs_le fun a => by + have hle : + Y a ≤ θ * X a := by + simpa [Y, X, θ] using + hΓ.limitWeightedUnitEllipticityObservable_le_thetaAtScale_zero_mul_unit a + rw [abs_of_nonneg (hY_nonneg a), abs_of_nonneg (hθX_nonneg a)] + exact hle + +end GammaSigmaCoarseGrainedEllipticity + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedFiniteBasis.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedFiniteBasis.lean new file mode 100644 index 0000000000..1d1b75675f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedFiniteBasis.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteBasis + +/-! # Localized Finite Basis -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open Section54.VarianceBoundGoodScale + +/-! +# Localized finite-basis reduction + +This file upgrades the one-cube finite-basis reduction to the finite maximum +over the scale-`n` descendants of the scale-`m` origin cube. +-/ + +noncomputable section + +/-- The finite maximum, over descendants, of the coordinate/pair probe sum +controlling the limiting-normalized quadratic form. -/ +noncomputable def localizedLimitNormalizedJProbeSumMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (m n : ℕ) : RegCoeffField d → ℝ := + fun a => + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + if hD : D.Nonempty then + D.sup' hD (fun R => limitNormalizedJProbeSum hP hStruct R a) + else + 0 + +/-- The localized maximum of the normalized coordinate/pair probe sum. -/ +noncomputable def localizedLimitNormalizedJNormalizedProbeSumMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (m n : ℕ) : RegCoeffField d → ℝ := + fun a => + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + if hD : D.Nonempty then + D.sup' hD (fun R => limitNormalizedJNormalizedProbeSum hP hStruct R a) + else + 0 + +theorem limitNormalizedJProbeSum_le_localizedLimitNormalizedJProbeSumMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)) + (a : RegCoeffField d) : + limitNormalizedJProbeSum hP hStruct R a ≤ + localizedLimitNormalizedJProbeSumMax hP hStruct m n a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := ⟨R, by simpa [D] using hR⟩ + dsimp [localizedLimitNormalizedJProbeSumMax] + simp only [D, hD, dite_true] + exact Finset.le_sup' (s := D) + (f := fun S => limitNormalizedJProbeSum hP hStruct S a) + (b := R) (by simpa [D] using hR) + +/-- The localized maximum over any fixed unit vector is a.s. controlled by the +localized finite-probe maximum. This is the Lean form of the finite-basis +reduction used in Theorem `t.homogenization.quenched`. -/ +theorem localizedLimitNormalizedJMax_le_probeSumMax_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) + (e : FullBlockVec d) (he : dotProduct e e ≤ 1) : + (localizedLimitNormalizedJMax hP hStruct m n e) ≤ᵐ[P] + fun a : RegCoeffField d => + (Fintype.card (BlockCoord d) : ℝ) * + localizedLimitNormalizedJProbeSumMax hP hStruct m n a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + have hAll : + ∀ᵐ a ∂P, ∀ R ∈ D, + limitNormalizedBlockJObservable hP hStruct R e a ≤ + (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct R a := by + rw [Filter.eventually_all_finset] + intro R _hR + simpa using! + limitNormalizedBlockJObservable_le_probeSum_ae hP hStruct hΓ R e he + filter_upwards [hAll] with a hAll_a + have hloc_eq : + localizedLimitNormalizedJMax hP hStruct m n e a = + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a) := by + dsimp [localizedLimitNormalizedJMax] + simp [D, hD] + have hprobe_eq : + localizedLimitNormalizedJProbeSumMax hP hStruct m n a = + D.sup' hD (fun R => limitNormalizedJProbeSum hP hStruct R a) := by + dsimp [localizedLimitNormalizedJProbeSumMax] + simp [D, hD] + rw [hloc_eq, hprobe_eq] + refine Finset.sup'_le hD _ ?_ + intro R hR + calc + limitNormalizedBlockJObservable hP hStruct R e a + ≤ (Fintype.card (BlockCoord d) : ℝ) * + limitNormalizedJProbeSum hP hStruct R a := hAll_a R hR + _ ≤ (Fintype.card (BlockCoord d) : ℝ) * + D.sup' hD (fun S => limitNormalizedJProbeSum hP hStruct S a) := by + exact mul_le_mul_of_nonneg_left + (Finset.le_sup' (s := D) + (f := fun S => limitNormalizedJProbeSum hP hStruct S a) hR) + (by positivity) + +theorem localizedLimitNormalizedJMax_le_normalizedProbeSumMax_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) + (e : FullBlockVec d) (he : dotProduct e e ≤ 1) : + (localizedLimitNormalizedJMax hP hStruct m n e) ≤ᵐ[P] + fun a : RegCoeffField d => + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + have hAll : + ∀ᵐ a ∂P, ∀ R ∈ D, + limitNormalizedBlockJObservable hP hStruct R e a ≤ + (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct R a := by + rw [Filter.eventually_all_finset] + intro R _hR + simpa using! + limitNormalizedBlockJObservable_le_normalizedProbeSum_ae + hP hStruct hΓ R e he + filter_upwards [hAll] with a hAll_a + have hloc_eq : + localizedLimitNormalizedJMax hP hStruct m n e a = + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a) := by + dsimp [localizedLimitNormalizedJMax] + simp [D, hD] + have hprobe_eq : + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a = + D.sup' hD (fun R => limitNormalizedJNormalizedProbeSum hP hStruct R a) := by + dsimp [localizedLimitNormalizedJNormalizedProbeSumMax] + simp [D, hD] + rw [hloc_eq, hprobe_eq] + refine Finset.sup'_le hD _ ?_ + intro R hR + calc + limitNormalizedBlockJObservable hP hStruct R e a + ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + limitNormalizedJNormalizedProbeSum hP hStruct R a := hAll_a R hR + _ ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + D.sup' hD + (fun S => limitNormalizedJNormalizedProbeSum hP hStruct S a) := by + exact mul_le_mul_of_nonneg_left + (Finset.le_sup' (s := D) + (f := fun S => limitNormalizedJNormalizedProbeSum hP hStruct S a) hR) + (by positivity) + +theorem localizedLimitNormalizedJMax_smul_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) + (c : ℝ) (hc : c ≠ 0) (e : FullBlockVec d) : + localizedLimitNormalizedJMax hP hStruct m n (c • e) =ᵐ[P] + fun a : RegCoeffField d => + c ^ (2 : ℕ) * localizedLimitNormalizedJMax hP hStruct m n e a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + have hAll : + ∀ᵐ a ∂P, ∀ R ∈ D, + limitNormalizedBlockJObservable hP hStruct R (c • e) a = + c ^ (2 : ℕ) * + limitNormalizedBlockJObservable hP hStruct R e a := by + rw [Filter.eventually_all_finset] + intro R _hR + simpa using! + limitNormalizedBlockJObservable_smul_ae hP hStruct hΓ R c e + filter_upwards [hAll] with a hAll_a + have hloc_ce : + localizedLimitNormalizedJMax hP hStruct m n (c • e) a = + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R (c • e) a) := by + dsimp [localizedLimitNormalizedJMax] + simp [D, hD] + have hloc_e : + localizedLimitNormalizedJMax hP hStruct m n e a = + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a) := by + dsimp [localizedLimitNormalizedJMax] + simp [D, hD] + rw [hloc_ce, hloc_e] + have hcongr : + D.sup' hD + (fun R => limitNormalizedBlockJObservable hP hStruct R (c • e) a) = + D.sup' hD + (fun R => + c ^ (2 : ℕ) * + limitNormalizedBlockJObservable hP hStruct R e a) := + Finset.sup'_congr (s := D) (H := hD) (t := D) rfl + (fun R hR => hAll_a R hR) + rw [hcongr] + exact + (Finset.mul₀_sup' + (a := c ^ (2 : ℕ)) + (f := fun R => limitNormalizedBlockJObservable hP hStruct R e a) + (s := D) (hs := hD) (sq_pos_of_ne_zero hc).le).symm + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMax.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMax.lean new file mode 100644 index 0000000000..ffaa697e30 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMax.lean @@ -0,0 +1,702 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FirstQuenchedEstimate + +/-! # Localized Max -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# Localized block-response maxima + +This file packages the finite maximum over subcubes appearing in +Theorem `t.homogenization.quenched`. The maximum is first defined for a fixed +full-block vector `e`; the finite-basis reduction for the maximum over unit +vectors is kept as a later deterministic step. +-/ + +noncomputable section + +/-- The finite maximum of the limiting-normalized block response over all +scale-`n` descendants of the scale-`m` origin cube. -/ +noncomputable def localizedLimitNormalizedJMax + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (m n : ℕ) (e : FullBlockVec d) : RegCoeffField d → ℝ := + fun a => + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + if hD : D.Nonempty then + D.sup' hD (fun R => limitNormalizedBlockJObservable hP hStruct R e a) + else + 0 + +theorem descendantsAtScale_originCube_nat_nonempty + {d : ℕ} [NeZero d] {m n : ℕ} (hnm : n ≤ m) : + (descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)).Nonempty := by + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast hnm + simpa using + descendantsAtScale_nonempty (originCube d ((m : ℕ) : ℤ)) hnm_int + +theorem limitNormalizedBlockJObservable_le_localizedLimitNormalizedJMax + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + {m n : ℕ} (e : FullBlockVec d) {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)) + (a : RegCoeffField d) : + limitNormalizedBlockJObservable hP hStruct R e a ≤ + localizedLimitNormalizedJMax hP hStruct m n e a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := ⟨R, by simpa [D] using hR⟩ + dsimp [localizedLimitNormalizedJMax] + simp only [D, hD, dite_true] + exact Finset.le_sup' (s := D) + (f := fun S => limitNormalizedBlockJObservable hP hStruct S e a) + (b := R) (by simpa [D] using hR) + +/-- Discounted localized response, the left side of the bad-event predicate. -/ +noncomputable def discountedLocalizedLimitNormalizedJMax + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (t : ℝ) (m n : ℕ) (e : FullBlockVec d) : RegCoeffField d → ℝ := + fun a => + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e a + +theorem aemeasurable_limitNormalizedBlockJObservable + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (Q : TriadicCube d) (e : FullBlockVec d) : + AEMeasurable (limitNormalizedBlockJObservable hP hStruct Q e) Pμ := by + simpa [limitNormalizedBlockJObservable] using + Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hP Q + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + +theorem map_limitNormalizedBlockJObservable_eq_origin_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {m n : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d m) n) + (e : FullBlockVec d) : + Measure.map (limitNormalizedBlockJObservable hP hStruct R e) Pμ = + Measure.map (limitNormalizedBlockJObservable hP hStruct (originCube d n) e) Pμ := by + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hP hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hP hStruct e + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => Ch04.blockJSetObservableBlockVec Pvec Qvec U a.toFun + have hshift : + cubeSet R = + translateSet (intVecToRealVec (Ch04.scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + exact Ch04.cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) (n := n) (m := m) (R := R) hn hnm hR + have hX_cov : Ch04.IsRestrictionTranslationCovariant X := + Ch04.blockJSetObservableBlockVec_restrictionTranslationCovariant Pvec Qvec + have hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) Pμ := by + simpa [X] using + Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hP + (originCube d n) Pvec Qvec + calc + Measure.map (limitNormalizedBlockJObservable hP hStruct R e) Pμ = + Measure.map (X (cubeSet R)) Pμ := by + rfl + _ = + Measure.map + (X + (translateSet (intVecToRealVec (Ch04.scaleTranslationShift n R)) + (cubeSet (originCube d n)))) Pμ := by + rw [hshift] + _ = Measure.map (X (cubeSet (originCube d n))) Pμ := by + exact Ch04.map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := Pμ) hstat (U := cubeSet (originCube d n)) + hX0_aemeas hX_cov (Ch04.scaleTranslationShift n R) + _ = Measure.map + (limitNormalizedBlockJObservable hP hStruct (originCube d n) e) Pμ := by + rfl + +theorem isBigOWith_limitNormalizedBlockJObservable_sub_const_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A c : ℝ} + {m n : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d m) n) + (e : FullBlockVec d) + (hOrigin : + IsBigOWith Pμ (gammaSigma σ) + (fun a => limitNormalizedBlockJObservable hP hStruct (originCube d n) e a - c) A) : + IsBigOWith Pμ (gammaSigma σ) + (fun a => limitNormalizedBlockJObservable hP hStruct R e a - c) A := by + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hP hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hP hStruct e + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => Ch04.blockJSetObservableBlockVec Pvec Qvec U a.toFun - c + let : IsProbabilityMeasure Pμ := hP.isProbability + have hshift : + cubeSet R = + translateSet (intVecToRealVec (Ch04.scaleTranslationShift n R)) + (cubeSet (originCube d n)) := by + exact Ch04.cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) (n := n) (m := m) (R := R) hn hnm hR + have hX_cov : Ch04.IsRestrictionTranslationCovariant X := by + intro U z a + simp [X, Ch04.blockJSetObservableBlockVec_restrictionTranslationCovariant Pvec Qvec U z a] + have hXR_aemeas : AEMeasurable (X (cubeSet R)) Pμ := by + exact (Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hP R Pvec Qvec).sub + aemeasurable_const + have hX0_aemeas : AEMeasurable (X (cubeSet (originCube d n))) Pμ := by + exact + (Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hP + (originCube d n) Pvec Qvec).sub aemeasurable_const + have hmap : + Measure.map (X (cubeSet R)) Pμ = + Measure.map (X (cubeSet (originCube d n))) Pμ := by + calc + Measure.map (X (cubeSet R)) Pμ = + Measure.map + (X + (translateSet (intVecToRealVec (Ch04.scaleTranslationShift n R)) + (cubeSet (originCube d n)))) Pμ := by + rw [hshift] + _ = Measure.map (X (cubeSet (originCube d n))) Pμ := by + exact Ch04.map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := Pμ) hstat (U := cubeSet (originCube d n)) + hX0_aemeas hX_cov (Ch04.scaleTranslationShift n R) + have htransfer := + Ch04.isBigOWith_gammaSigma_iff_of_map_eq_map_aemeasurable + (μ := Pμ) (σ := σ) (A := A) + hXR_aemeas hX0_aemeas hmap + exact htransfer.2 (by simpa [X, limitNormalizedBlockJObservable, Pvec, Qvec] using hOrigin) + +theorem isBigO_limitNormalizedBlockJObservable_of_mem_descendantsAtScale + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A : ℝ} + {m n : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d m) n) + (e : FullBlockVec d) + (hOrigin : + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct (originCube d n) e) A) : + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct R e) A := by + let : IsProbabilityMeasure Pμ := hP.isProbability + have hmap := + map_limitNormalizedBlockJObservable_eq_origin_of_mem_descendantsAtScale + hP hStruct hstat hn hnm hR e + have hXR_aemeas : + AEMeasurable (limitNormalizedBlockJObservable hP hStruct R e) Pμ := + aemeasurable_limitNormalizedBlockJObservable hP hStruct R e + have hX0_aemeas : + AEMeasurable + (limitNormalizedBlockJObservable hP hStruct (originCube d n) e) Pμ := + aemeasurable_limitNormalizedBlockJObservable hP hStruct (originCube d n) e + exact + (Ch04.isBigO_gammaSigma_iff_of_map_eq_map_aemeasurable + (μ := Pμ) (σ := σ) (A := A) + hXR_aemeas hX0_aemeas hmap).2 hOrigin + +theorem isBigO_limitNormalizedBlockJObservable_originCube_of_scaleZero + {d : ℕ} [NeZero d] {σ : ℝ} + (_hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), + (∀ α : BlockCoord d, |e α| ≤ 1) → + ∀ {n : ℕ}, + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((n : ℕ) : ℤ)) e) + (C * hΓ.thetaHat ^ (2 : ℕ)) := by + let Cdim : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let G : ℝ := + Ch04.gammaTriangleConst σ * Cdim * + (Ch04.gammaMomentConst σ * (params.xi : ℝ) ^ σ⁻¹) + let C : ℝ := max 1 G + have hC_pos : 0 < C := by + dsimp [C] + exact lt_of_lt_of_le zero_lt_one (le_max_left 1 G) + refine ⟨C, hC_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he n + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hPμ hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hPμ hStruct e + let θ : ℝ := + Cdim * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) + have hCdim_nonneg : 0 ≤ Cdim := by + dsimp [Cdim] + positivity + have hCdim_pos : 0 < Cdim := by + dsimp [Cdim] + positivity + have hθ0_one : 1 ≤ thetaAtScale hPμ hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hPμ hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hθ0_pos : 0 < thetaAtScale hPμ hStruct (0 : ℤ) := + lt_of_lt_of_le zero_lt_one hθ0_one + have hθ_pos : 0 < θ := by + dsimp [θ] + exact mul_pos hCdim_pos (mul_pos hθ0_pos hΓ.thetaHat_pos) + have hunit : + IsBigO Pμ (gammaSigma hΓ.sigma) + (Ch04.blockJObservableCubeSetBlockVec (originCube d 0) Pvec Qvec) + θ := by + have htail0 := hΓ.limitNormalizedBlockJObservable_unit_isBigO e he + simpa [limitNormalizedBlockJObservable, Pvec, Qvec, θ, Cdim] using htail0 + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hraw : + IsBigO Pμ (gammaSigma hΓ.sigma) + (Ch04.blockJObservableCubeSetBlockVec + (originCube d ((n : ℕ) : ℤ)) Pvec Qvec) + (Ch04.gammaTriangleConst hΓ.sigma * θ) := + Ch04.isBigO_gammaSigma_blockJObservableCubeSetBlockVec_originCube_of_scaleZero + hPμ hStruct.stationary hΓ.sigma_pos hθ_pos Pvec Qvec hunit hn_nonneg + have hscale : + Ch04.gammaTriangleConst hΓ.sigma * θ ≤ + C * hΓ.thetaHat ^ (2 : ℕ) := by + have htheta_le : + thetaAtScale hPμ hStruct (0 : ℤ) ≤ + Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat := + hΓ.thetaAtScale_zero_le_gammaMomentScale + have htri_nonneg : 0 ≤ Ch04.gammaTriangleConst hΓ.sigma := + (IndependentSums.gammaTriangleConst_pos (σ := hΓ.sigma)).le + have hthetaHat_nonneg : 0 ≤ hΓ.thetaHat := hΓ.thetaHat_pos.le + have hleft_le : + Ch04.gammaTriangleConst hΓ.sigma * θ ≤ + (Ch04.gammaTriangleConst hΓ.sigma * Cdim * + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹)) * + hΓ.thetaHat ^ (2 : ℕ) := by + dsimp [θ] + calc + Ch04.gammaTriangleConst hΓ.sigma * + (Cdim * (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat)) + = + (Ch04.gammaTriangleConst hΓ.sigma * Cdim) * + (thetaAtScale hPμ hStruct (0 : ℤ) * hΓ.thetaHat) := by + ring + _ ≤ + (Ch04.gammaTriangleConst hΓ.sigma * Cdim) * + ((Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat) * + hΓ.thetaHat) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right htheta_le hthetaHat_nonneg) + (mul_nonneg htri_nonneg hCdim_nonneg) + _ = + (Ch04.gammaTriangleConst hΓ.sigma * Cdim * + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹)) * + hΓ.thetaHat ^ (2 : ℕ) := by + ring + have hG_le_C : + Ch04.gammaTriangleConst hΓ.sigma * Cdim * + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹) ≤ C := by + have hG_eq : + Ch04.gammaTriangleConst hΓ.sigma * Cdim * + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹) = G := by + simp [G, hσ_eq, hparams] + rw [hG_eq] + exact le_max_right 1 G + exact hleft_le.trans + (mul_le_mul_of_nonneg_right hG_le_C (sq_nonneg hΓ.thetaHat)) + have hmono := hraw.mono_scale hscale + simpa [limitNormalizedBlockJObservable, Pvec, Qvec, hσ_eq] using hmono + +theorem localizedLimitNormalizedJMax_sub_const_le_sup_sub + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + {m n : ℕ} (e : FullBlockVec d) (c : ℝ) + (a : RegCoeffField d) : + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + ∀ hD : D.Nonempty, + localizedLimitNormalizedJMax hP hStruct m n e a - c ≤ + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a - c) := by + intro D hD + dsimp [localizedLimitNormalizedJMax] + simp only [D, hD, dite_true] + have hle : + D.sup' hD (fun R => limitNormalizedBlockJObservable hP hStruct R e a) ≤ + c + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a - c) := by + refine Finset.sup'_le hD _ ?_ + intro R hR + have hR_le : + limitNormalizedBlockJObservable hP hStruct R e a - c ≤ + D.sup' hD (fun S => + limitNormalizedBlockJObservable hP hStruct S e a - c) := + Finset.le_sup' (s := D) + (f := fun S => limitNormalizedBlockJObservable hP hStruct S e a - c) + hR + linarith + linarith + +theorem descendantsAtScale_originCube_nat_card_two_le + {d : ℕ} [NeZero d] {m n : ℕ} (hnm : n < m) : + 2 ≤ + (descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)).card := by + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let j : ℕ := Int.toNat (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) + have hnm_le_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast (le_of_lt hnm) + have hcard : D.card = (3 ^ d) ^ j := by + dsimp [D, j] + rw [descendantsAtScale_eq_descendantsAtDepth (originCube d ((m : ℕ) : ℤ)) hnm_le_int] + exact descendantsAtDepth_card (originCube d ((m : ℕ) : ℤ)) + (Int.toNat (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ))) + have hj_pos : 0 < j := by + dsimp [j] + have hdiff_pos : 0 < (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) := + sub_pos.mpr (by exact_mod_cast hnm) + have hdiff_nonneg : 0 ≤ (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) := + le_of_lt hdiff_pos + have hj_cast : + (Int.toNat (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) : ℤ) = + (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) := + Int.toNat_of_nonneg hdiff_nonneg + have hj_int_pos : + (0 : ℤ) < + (Int.toNat (((m : ℕ) : ℤ) - ((n : ℕ) : ℤ)) : ℤ) := by + simpa [hj_cast] using hdiff_pos + exact_mod_cast hj_int_pos + have hd_pos : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hbase_ge_two : 2 ≤ 3 ^ d := by + have hpow : 3 ^ (1 : ℕ) ≤ 3 ^ d := + Nat.pow_le_pow_right (by norm_num : 1 ≤ 3) (by omega : 1 ≤ d) + norm_num at hpow ⊢ + omega + have hpow_ge_base : 3 ^ d ≤ (3 ^ d) ^ j := by + simpa using + Nat.pow_le_pow_right (by omega : 1 ≤ 3 ^ d) (by omega : 1 ≤ j) + rw [hcard] + exact hbase_ge_two.trans hpow_ge_base + +theorem isBigO_localizedLimitNormalizedJMax + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {m n : ℕ}, n < m → + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + IsBigO Pμ (gammaSigma σ) + (localizedLimitNormalizedJMax hPμ hStruct m n e) + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) := by + obtain ⟨C, hC_pos, hOrigin⟩ := + isBigO_limitNormalizedBlockJObservable_originCube_of_scaleZero + (d := d) hσ_pos params + refine ⟨C, hC_pos, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm m n hnm + classical + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) + (le_of_lt hnm) + have hcard : 2 ≤ D.card := by + simpa [D] using descendantsAtScale_originCube_nat_card_two_le + (d := d) (m := m) (n := n) hnm + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast le_of_lt hnm + have he_coord : ∀ β : BlockCoord d, |e β| ≤ 1 := + abs_fullBlockVec_coord_le_one_of_dotProduct_le_one e he_norm + have hOriginTail : + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((n : ℕ) : ℤ)) e) + (C * hΓ.thetaHat ^ (2 : ℕ)) := + hOrigin hPμ hStruct hΓ hσ_eq hparams e he_coord + have htailR : + ∀ R ∈ D, + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hPμ hStruct R e) + (C * hΓ.thetaHat ^ (2 : ℕ)) := by + intro R hR + exact + isBigO_limitNormalizedBlockJObservable_of_mem_descendantsAtScale + hPμ hStruct hStruct.stationary hn_nonneg hnm_int + (R := R) (by simpa [D] using hR) e hOriginTail + have hsup : + IsBigO Pμ (gammaSigma σ) + (fun a => + D.sup' hD (fun R => + limitNormalizedBlockJObservable hPμ hStruct R e a)) + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + D.sup' hD (fun _R => C * hΓ.thetaHat ^ (2 : ℕ))) := by + exact Ch04.isBigO_gammaSigma_finset_sup'_of_scales + (μ := Pμ) (s := D) (hs := hD) + (X := fun R a => limitNormalizedBlockJObservable hPμ hStruct R e a) + (a := fun _R => C * hΓ.thetaHat ^ (2 : ℕ)) + (σ := σ) hσ_pos hcard htailR + have hsup' : + IsBigO Pμ (gammaSigma σ) + (fun a => + D.sup' hD (fun R => + limitNormalizedBlockJObservable hPμ hStruct R e a)) + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) := by + simpa using hsup + refine hsup'.of_abs_le ?_ + intro a + have heq : + localizedLimitNormalizedJMax hPμ hStruct m n e a = + D.sup' hD (fun R => + limitNormalizedBlockJObservable hPμ hStruct R e a) := by + dsimp [localizedLimitNormalizedJMax] + simp [D, hD] + rw [heq] + +theorem isBigOWith_localizedLimitNormalizedJMax_sub_const + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A c : ℝ} (hσ : 0 < σ) + {m n : ℕ} (hnm : n < m) + (e : FullBlockVec d) + (hOrigin : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) e a - c) A) : + IsBigOWith Pμ (gammaSigma σ) + (fun a => localizedLimitNormalizedJMax hP hStruct m n e a - c) + (((3 * Real.log + ((descendantsAtScale + (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ)).card : ℝ)) ^ σ⁻¹) * A) := by + classical + let : IsProbabilityMeasure Pμ := hP.isProbability + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) + (le_of_lt hnm) + have hcard : 2 ≤ D.card := by + simpa [D] using descendantsAtScale_originCube_nat_card_two_le + (d := d) (m := m) (n := n) hnm + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast le_of_lt hnm + have htailR : + ∀ R ∈ D, + IsBigOWith Pμ (gammaSigma σ) + (fun a => limitNormalizedBlockJObservable hP hStruct R e a - c) A := by + intro R hR + exact + isBigOWith_limitNormalizedBlockJObservable_sub_const_of_mem_descendantsAtScale + hP hStruct hstat hn_nonneg hnm_int + (R := R) (by simpa [D] using hR) e hOrigin + have hsup : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + D.sup' hD (fun R => + limitNormalizedBlockJObservable hP hStruct R e a - c)) + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * A) := by + exact Ch04.isBigOWith_gammaSigma_finset_sup' + (μ := Pμ) (s := D) (hs := hD) + (X := fun R a => limitNormalizedBlockJObservable hP hStruct R e a - c) + (A := A) (σ := σ) hσ hcard htailR + refine hsup.of_le ?_ + intro a + exact localizedLimitNormalizedJMax_sub_const_le_sup_sub + hP hStruct (m := m) (n := n) e c a hD + +/-- Localized version of Corollary `c.first.quenched.estimate` for a fixed +unit vector. The finite maximum over descendants costs only the standard +`(log #D)^{1/(σ∧2)}` factor. -/ +theorem localizedFirstQuenchedEstimate_limitNormalized + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry α : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < α ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {ℓ n m : ℕ}, ℓ < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + localizedLimitNormalizedJMax hPμ hStruct (N0 + m) (N0 + n) e a - + Real.rpow (3 : ℝ) (-α * (ℓ : ℝ))) + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ))) := by + obtain ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, hfirst⟩ := + firstQuenchedEstimate_limitNormalized (d := d) hσ_pos params + refine ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm ℓ n m hℓn hnm + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + have hσconc_pos : 0 < min σ 2 := + lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hOrigin : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun a => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + n : ℕ) : ℤ)) e a - + Real.rpow (3 : ℝ) (-α * (ℓ : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + simpa [N0] using + hfirst hPμ hStruct hΓ hσ_eq hparams e he_norm hℓn + have hnm_abs : N0 + n < N0 + m := Nat.add_lt_add_left hnm N0 + simpa [N0, D] using + isBigOWith_localizedLimitNormalizedJMax_sub_const + hPμ hStruct hStruct.stationary hσconc_pos hnm_abs e hOrigin + +/-- Uniform-in-`σ` version of +`localizedFirstQuenchedEstimate_limitNormalized`. + +The entry constant and annealed algebraic exponent are fixed before the finite +moment exponent; the localized fluctuation constant remains allowed to depend +on `σ`. -/ +theorem localizedFirstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hΓ : GammaSigmaCoarseGrainedEllipticity Pμ hPμ hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {ℓ n m : ℕ}, ℓ < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + localizedLimitNormalizedJMax hPμ hStruct + (N0 + m) (N0 + n) e aω - + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ))) + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ))) := by + obtain ⟨Centry, a, hCentry, ha, hfirstBase⟩ := + firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, hCfluct, hfirst⟩ := hfirstBase hσ_pos + refine ⟨Cfluct, hCfluct, ?_⟩ + intro Pμ hPμ hStruct hΓ hσ_eq hparams e he_norm ℓ n m hℓn hnm + let : IsProbabilityMeasure Pμ := hPμ.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + have hσconc_pos : 0 < min σ 2 := + lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hOrigin : + IsBigOWith Pμ (gammaSigma (min σ 2)) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + n : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) := by + simpa [N0] using + hfirst hPμ hStruct hΓ hσ_eq hparams e he_norm hℓn + have hnm_abs : N0 + n < N0 + m := Nat.add_lt_add_left hnm N0 + simpa [N0, D] using + isBigOWith_localizedLimitNormalizedJMax_sub_const + hPμ hStruct hStruct.stationary hσconc_pos hnm_abs e hOrigin + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMaxTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMaxTail.lean new file mode 100644 index 0000000000..28b55f053f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedMaxTail.lean @@ -0,0 +1,394 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteSupTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax + +/-! # Localized Max Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Probability-level localized maximum tails + +These lemmas are the no-loss replacements for the logarithmically inflated +`O_{\Gamma}` maximum packaging. The cardinality of the finite family remains +as an explicit probability prefactor. +-/ + +noncomputable section + +/-- Direct finite-union tail for the localized descendant maximum, for one +fixed probe vector. -/ +theorem measureReal_localizedLimitNormalizedJMax_sub_const_tail_le_card_mul_exp + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A c lam : ℝ} (hlam : 1 ≤ lam) + {m n : ℕ} (hnm : n < m) (e : FullBlockVec d) + (hOrigin : + IsBigOWith Pμ (gammaSigma σ) + (fun a => + limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) e a - c) A) : + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Pμ.real + {a | c + A * lam < + localizedLimitNormalizedJMax hP hStruct m n e a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ σ)) := by + intro D + classical + let : IsProbabilityMeasure Pμ := hP.isProbability + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty + (d := d) (m := m) (n := n) (le_of_lt hnm) + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast le_of_lt hnm + have htailR : + ∀ R ∈ D, + IsBigOWith Pμ (gammaSigma σ) + (fun a => limitNormalizedBlockJObservable hP hStruct R e a - c) A := by + intro R hR + exact + isBigOWith_limitNormalizedBlockJObservable_sub_const_of_mem_descendantsAtScale + hP hStruct hstat hn_nonneg hnm_int + (R := R) (by simpa [D] using hR) e hOrigin + have htail := + measureReal_finiteSup_sub_const_tail_le_card_mul_exp + (μ := Pμ) (s := D) (X := fun R a => + limitNormalizedBlockJObservable hP hStruct R e a) + (c := c) (A := A) (lam := lam) (σ := σ) hD hlam htailR + simpa [localizedLimitNormalizedJMax, D, hD] using htail + +/-- Direct finite-union tail for the normalized finite-probe maximum. -/ +theorem measureReal_localizedNormalizedProbeJMax_sub_const_tail_le_card_mul_card_mul_exp + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A c lam : ℝ} (hlam : 1 ≤ lam) + {m n : ℕ} (hnm : n < m) + (hOrigin : + ∀ i : NormalizedProbeIndex d, + IsBigOWith Pμ (gammaSigma σ) + (fun a => + limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) (normalizedProbeVec i) a - c) A) : + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + Pμ.real + {a | c + A * lam < + localizedNormalizedProbeJMax hP hStruct m n a} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + intro D S + classical + let : IsProbabilityMeasure Pμ := hP.isProbability + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + have htailS : + ∀ i ∈ S, + Pμ.real + {a | c + A * lam < + localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ σ)) := by + intro i _hi + simpa [D] using + measureReal_localizedLimitNormalizedJMax_sub_const_tail_le_card_mul_exp + hP hStruct hstat (σ := σ) (A := A) (c := c) (lam := lam) + hlam hnm (normalizedProbeVec i) (hOrigin i) + have htail := + measureReal_finiteSupTail_le_card_mul + (μ := Pμ) (s := S) + (X := fun i a => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) + (T := c + A * lam) + (R := (D.card : ℝ) * Real.exp (-(lam ^ σ))) hS htailS + simpa only [localizedNormalizedProbeJMax, S, hS, Finset.sup'_apply, Finset.sup'_eq_sup, + Finset.sup_apply, Pi.sup_apply] using! htail + +/-- Direct finite-union tail for the localized descendant maximum, using +symmetric `Γσ` tails. -/ +theorem measureReal_localizedLimitNormalizedJMax_tail_le_card_mul_exp_of_isBigO + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A lam : ℝ} (hlam : 1 ≤ lam) + {m n : ℕ} (hnm : n < m) (e : FullBlockVec d) + (hOrigin : + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) e) A) : + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + Pμ.real + {a | A * lam < + localizedLimitNormalizedJMax hP hStruct m n e a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ σ)) := by + intro D + classical + let : IsProbabilityMeasure Pμ := hP.isProbability + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty + (d := d) (m := m) (n := n) (le_of_lt hnm) + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast le_of_lt hnm + have htailR : + ∀ R ∈ D, + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct R e) A := by + intro R hR + exact + isBigO_limitNormalizedBlockJObservable_of_mem_descendantsAtScale + hP hStruct hstat hn_nonneg hnm_int + (R := R) (by simpa [D] using hR) e hOrigin + have htail := + measureReal_finiteSup_tail_le_card_mul_exp_of_isBigO + (μ := Pμ) (s := D) (X := fun R a => + limitNormalizedBlockJObservable hP hStruct R e a) + (A := A) (lam := lam) (σ := σ) hD hlam htailR + simpa [localizedLimitNormalizedJMax, D, hD] using htail + +/-- Direct finite-union tail for the normalized finite-probe maximum, using +symmetric `Γσ` tails and no logarithmic maximum packaging. -/ +theorem measureReal_localizedNormalizedProbeJMax_tail_le_card_mul_card_mul_exp_of_isBigO + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {σ A lam : ℝ} (hlam : 1 ≤ lam) + {m n : ℕ} (hnm : n < m) + (hOrigin : + ∀ i : NormalizedProbeIndex d, + IsBigO Pμ (gammaSigma σ) + (limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) (normalizedProbeVec i)) A) : + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + Pμ.real + {a | A * lam < + localizedNormalizedProbeJMax hP hStruct m n a} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + intro D S + classical + let : IsProbabilityMeasure Pμ := hP.isProbability + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + have htailS : + ∀ i ∈ S, + Pμ.real + {a | A * lam < + localizedLimitNormalizedJMax hP hStruct m n + (normalizedProbeVec i) a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ σ)) := by + intro i _hi + simpa [D] using + measureReal_localizedLimitNormalizedJMax_tail_le_card_mul_exp_of_isBigO + hP hStruct hstat (σ := σ) (A := A) (lam := lam) + hlam hnm (normalizedProbeVec i) (hOrigin i) + have htail := + measureReal_finiteSupTail_le_card_mul + (μ := Pμ) (s := S) + (X := fun i a => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) + (T := A * lam) + (R := (D.card : ℝ) * Real.exp (-(lam ^ σ))) hS htailS + simpa only [localizedNormalizedProbeJMax, S, hS, Finset.sup'_apply, Finset.sup'_eq_sup, + Finset.sup_apply, Pi.sup_apply] using! htail + +/-- Localized first-quenched estimate for the finite-probe maximum, kept as a +probability-level finite union bound rather than a logarithmically inflated +`O_{\Gamma}` estimate. -/ +theorem measureReal_localizedFirstQuenchedEstimate_normalizedProbeJMax_tail_noLog + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry alpha : ℝ, + 0 < Cfluct ∧ 0 < Centry ∧ 0 < alpha ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {ell n m : ℕ} {lam : ℝ}, 1 ≤ lam → ell < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let center : ℝ := Real.rpow (3 : ℝ) (-alpha * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ell : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + P.real + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + obtain ⟨Cfluct, Centry, alpha, hCfluct, hCentry, halpha, hfirst⟩ := + firstQuenchedEstimate_limitNormalized (d := d) hσ_pos params + refine ⟨Cfluct, Centry, alpha, hCfluct, hCentry, halpha, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams ell n m lam hlam helln hnm + classical + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let center : ℝ := Real.rpow (3 : ℝ) (-alpha * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ell : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + have hOrigin : + ∀ i : NormalizedProbeIndex d, + IsBigOWith P (gammaSigma tau) + (fun aω => + limitNormalizedBlockJObservable hP hStruct + (originCube d (((N0 + n : ℕ) : ℤ))) + (normalizedProbeVec i) aω - center) + scale := by + intro i + have hi_norm : dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := + normalizedProbeVec_dotProduct_self_le_one i + simpa [N0, tau, center, scale] using + hfirst hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) hi_norm (n := ell) (m := n) helln + simpa [N0, D, S, tau, center, scale] using + measureReal_localizedNormalizedProbeJMax_sub_const_tail_le_card_mul_card_mul_exp + hP hStruct hStruct.stationary + (σ := tau) (A := scale) (c := center) (lam := lam) + hlam (m := N0 + m) (n := N0 + n) + (Nat.add_lt_add_left hnm N0) hOrigin + +/-- Uniform-in-`σ` version of +`measureReal_localizedFirstQuenchedEstimate_normalizedProbeJMax_tail_noLog`. -/ +theorem measureReal_localizedFirstQuenchedEstimate_normalizedProbeJMax_tail_noLog_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {ell n m : ℕ} {lam : ℝ}, 1 ≤ lam → ell < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let center : ℝ := Real.rpow (3 : ℝ) (-a * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ell : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + P.real + {aω | center + scale * lam < + localizedNormalizedProbeJMax hP hStruct + (N0 + m) (N0 + n) aω} ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau))) := by + obtain ⟨Centry, a, hCentry, ha, hfirstBase⟩ := + firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, hCfluct, hfirst⟩ := hfirstBase hσ_pos + refine ⟨Cfluct, hCfluct, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams ell n m lam hlam helln hnm + classical + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min σ 2 + let center : ℝ := Real.rpow (3 : ℝ) (-a * (ell : ℝ)) + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ell : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + have hOrigin : + ∀ i : NormalizedProbeIndex d, + IsBigOWith P (gammaSigma tau) + (fun aω => + limitNormalizedBlockJObservable hP hStruct + (originCube d (((N0 + n : ℕ) : ℤ))) + (normalizedProbeVec i) aω - center) + scale := by + intro i + have hi_norm : dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := + normalizedProbeVec_dotProduct_self_le_one i + simpa [N0, tau, center, scale] using + hfirst hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) hi_norm (n := ell) (m := n) helln + simpa [N0, D, S, tau, center, scale] using + measureReal_localizedNormalizedProbeJMax_sub_const_tail_le_card_mul_card_mul_exp + hP hStruct hStruct.stationary + (σ := tau) (A := scale) (c := center) (lam := lam) + hlam (m := N0 + m) (n := N0 + n) + (Nat.add_lt_add_left hnm N0) hOrigin + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticity.lean new file mode 100644 index 0000000000..ac39db71a0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticity.lean @@ -0,0 +1,327 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.FiniteSupTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LimitNormalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality + +/-! # Localized Unit Ellipticity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums + +/-! +# Localized limiting-normalized unit ellipticity + +This file gives the stationarity transfer and finite-sup tail bound for the +unit-cube ellipticity observable normalized by the limiting scalar matrix. +-/ + +noncomputable section + +theorem aemeasurable_limitWeightedUnitEllipticityObservableOnCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (Q : TriadicCube d) {sUpper sLower : ℝ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) : + AEMeasurable + (limitWeightedUnitEllipticityObservableOnCube hP hStruct + Q sUpper sLower) P := by + exact + ((hP.aemeasurable_LambdaSqCoeffField_finite_one Q hsUpper).const_mul + (barSigmaLimit hP hStruct)⁻¹).add + ((hP.aemeasurable_lambdaSqCoeffField_finite_one_inv Q hsLower).const_mul + (barSigmaLimit hP hStruct)) + +/-- The localized limiting-normalized unit ellipticity observable has the same +law as the origin observable on every scale-zero cube. -/ +theorem map_limitWeightedUnitEllipticityObservableOnCube_eq_origin_of_scale_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {U : TriadicCube d} (hUscale : U.scale = 0) + {sUpper sLower : ℝ} (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) : + Measure.map + (limitWeightedUnitEllipticityObservableOnCube hP hStruct U + sUpper sLower) P = + Measure.map + (limitWeightedUnitEllipticityObservable hP hStruct sUpper sLower) P := by + classical + let L : ℝ := barSigmaLimit hP hStruct + let X0 : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct sUpper sLower + let XU : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservableOnCube hP hStruct U sUpper sLower + have hX0_aemeas : AEMeasurable X0 P := by + simpa [X0] using + aemeasurable_limitWeightedUnitEllipticityObservableOnCube + hP hStruct (originCube d 0) hsUpper hsLower + let z : Fin d → ℤ := Ch04.scaleTranslationShift 0 U + have hUeq : U = translateCube z (originCube d 0) := by + simpa [z] using + (Section52.translateCube_originCube_zero_eq_of_scale_zero U hUscale).symm + have hΛae : + (fun a : RegCoeffField d => Ch04.LambdaSqCoeffField U sUpper (.finite 1) a) + =ᵐ[P] + fun a => Ch04.LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) + (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.LambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z sUpper (.finite 1) + simpa [hUeq] using hcov + have hlambdaAe : + (fun a : RegCoeffField d => Ch04.lambdaSqCoeffField U sLower (.finite 1) a) + =ᵐ[P] + fun a => Ch04.lambdaSqCoeffField (originCube d 0) sLower (.finite 1) + (translateReg (intVecToRealVec z) a) := by + have hcov := + Ch04.lambdaSqCoeffField_originCube_zero_translateByInt_ae + hP hStruct.stationary z sLower (.finite 1) + simpa [hUeq] using hcov + have hae : + XU =ᵐ[P] fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a) := by + filter_upwards [hΛae, hlambdaAe] with a hΛ hlambda + dsimp [XU, X0, limitWeightedUnitEllipticityObservableOnCube, + limitWeightedUnitEllipticityObservable, L] + rw [hΛ, hlambda] + calc + Measure.map XU P = + Measure.map (fun a : RegCoeffField d => X0 (translateReg (intVecToRealVec z) a)) P := + Measure.map_congr hae + _ = Measure.map X0 (Measure.map (translateReg (intVecToRealVec z)) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hStruct.stationary z] using hX0_aemeas) + (measurable_translateReg (intVecToRealVec z)).aemeasurable + _ = Measure.map X0 P := by + rw [hStruct.stationary z] + _ = Measure.map + (limitWeightedUnitEllipticityObservable hP hStruct sUpper sLower) P := by + rfl + +/-- The Γσ tail of the limiting-normalized unit ellipticity observable +transfers to every scale-zero cube. -/ +theorem isBigO_limitWeightedUnitEllipticityObservableOnCube_of_scale_zero + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {U : TriadicCube d} (hUscale : U.scale = 0) : + IsBigO P (gammaSigma hΓ.sigma) + (limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hΓ.params.sUpper hΓ.params.sLower) + (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) := by + let : IsProbabilityMeasure P := hP.isProbability + have hmap := + map_limitWeightedUnitEllipticityObservableOnCube_eq_origin_of_scale_zero + hP hStruct hUscale hΓ.sUpper_pos hΓ.sLower_pos + have hXU_aemeas : + AEMeasurable + (limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hΓ.params.sUpper hΓ.params.sLower) P := + aemeasurable_limitWeightedUnitEllipticityObservableOnCube + hP hStruct U hΓ.sUpper_pos hΓ.sLower_pos + have hX0_aemeas : + AEMeasurable + (limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower) P := by + simpa using + aemeasurable_limitWeightedUnitEllipticityObservableOnCube + hP hStruct (originCube d 0) hΓ.sUpper_pos hΓ.sLower_pos + exact + (Ch04.isBigO_gammaSigma_iff_of_map_eq_map_aemeasurable + (μ := P) (σ := hΓ.sigma) + (A := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) + hXU_aemeas hX0_aemeas hmap).2 + (by simpa using hΓ.limitWeightedUnitEllipticityObservable_isBigO) + +/-- Scale-zero descendant supremum of the limiting-normalized unit ellipticity +inside `\cu_m`. -/ +noncomputable def localizedLimitWeightedUnitEllipticitySup + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) (m : ℕ) : + RegCoeffField d → ℝ := + fun a => + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]) + D.sup' hD (fun U => + limitWeightedUnitEllipticityObservableOnCube hP hStruct U + params.sUpper params.sLower a) + +/-- A collapsed bound on the localized limiting-normalized unit ellipticity +supremum controls the Ch2 upper and lower unit-ellipticity suprema at any +larger exponent. -/ +theorem scaleZero_ellipticity_sup_bounds_of_localizedLimitWeightedUnitEllipticitySup_le + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {a : RegCoeffField d} (ha : Ch04.AELocallyUniformlyEllipticField a) + {m : ℕ} {t M : ℝ} + (hUpper_t : hΓ.params.sUpper < t) + (hLower_t : hΓ.params.sLower < t) + (hsup : + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a ≤ + M ^ (2 : ℕ)) : + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ); + let D : Finset (TriadicCube d) := descendantsAtScale Q 0; + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]); + let F : Ch02.TriadicCoeffFamily d := + Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha; + (barSigmaLimit hP hStruct)⁻¹ * + D.sup' hD (fun U => Ch02.LambdaSq U t (.finite 1) F) ≤ + M ^ (2 : ℕ) ∧ + barSigmaLimit hP hStruct * + D.sup' hD (fun U => (Ch02.lambdaSq U t (.finite 1) F)⁻¹) ≤ + M ^ (2 : ℕ) := by + classical + intro Q D hD F + let L : ℝ := barSigmaLimit hP hStruct + let Obs : TriadicCube d → ℝ := fun U => + limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hΓ.params.sUpper hΓ.params.sLower a + have hL_pos : 0 < L := by + simpa [L] using hΓ.barSigmaLimit_pos + have hL_inv_pos : 0 < L⁻¹ := inv_pos.mpr hL_pos + have hloc : + D.sup' hD Obs ≤ M ^ (2 : ℕ) := by + simpa [localizedLimitWeightedUnitEllipticitySup, Q, D, hD, Obs] using hsup + have hupperPoint : + ∀ U ∈ D, L⁻¹ * Ch02.LambdaSq U t (.finite 1) F ≤ Obs U := by + intro U hU + have hΛ_eq : + Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a = + Ch02.LambdaSq U hΓ.params.sUpper (.finite 1) F := by + simp [Ch04.LambdaSqCoeffField, F, ha] + have hΛ_mono : + Ch02.LambdaSq U t (.finite 1) F ≤ + Ch02.LambdaSq U hΓ.params.sUpper (.finite 1) F := + Ch02.LambdaSq_finite_antitone U F hΓ.sUpper_pos hUpper_t + (by norm_num : (1 : ℝ) ≤ 1) + have hupper_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg U a hΓ.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hlower_nonneg : + 0 ≤ + (Ch04.lambdaSqCoeffField U hΓ.params.sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg U a hΓ.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1)) + calc + L⁻¹ * Ch02.LambdaSq U t (.finite 1) F + ≤ L⁻¹ * Ch02.LambdaSq U hΓ.params.sUpper (.finite 1) F := + mul_le_mul_of_nonneg_left hΛ_mono hL_inv_pos.le + _ = + L⁻¹ * Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a := by + rw [hΛ_eq] + _ ≤ + L⁻¹ * Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a + + L * (Ch04.lambdaSqCoeffField U hΓ.params.sLower (.finite 1) a)⁻¹ := by + exact le_add_of_nonneg_right (mul_nonneg hL_pos.le hlower_nonneg) + _ = Obs U := by + simp [Obs, limitWeightedUnitEllipticityObservableOnCube, L] + have hlowerPoint : + ∀ U ∈ D, L * (Ch02.lambdaSq U t (.finite 1) F)⁻¹ ≤ Obs U := by + intro U hU + have hlambda_eq : + Ch04.lambdaSqCoeffField U hΓ.params.sLower (.finite 1) a = + Ch02.lambdaSq U hΓ.params.sLower (.finite 1) F := by + simp [Ch04.lambdaSqCoeffField, F, ha] + have hlambda_mono : + Ch02.lambdaSq U hΓ.params.sLower (.finite 1) F ≤ + Ch02.lambdaSq U t (.finite 1) F := + Ch02.lambdaSq_finite_mono U F hΓ.sLower_pos hLower_t + (by norm_num : (1 : ℝ) ≤ 1) + have hlambda_lower_pos : + 0 < Ch02.lambdaSq U hΓ.params.sLower (.finite 1) F := + Ch02.lambdaSq_finite_pos U F hΓ.sLower_pos + (by norm_num : (1 : ℝ) ≤ 1) + have hinv_le : + (Ch02.lambdaSq U t (.finite 1) F)⁻¹ ≤ + (Ch02.lambdaSq U hΓ.params.sLower (.finite 1) F)⁻¹ := by + simpa [one_div] using one_div_le_one_div_of_le hlambda_lower_pos hlambda_mono + have hupper_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg U a hΓ.sUpper_pos + (by norm_num : (1 : ℝ) ≤ 1) + calc + L * (Ch02.lambdaSq U t (.finite 1) F)⁻¹ + ≤ L * (Ch02.lambdaSq U hΓ.params.sLower (.finite 1) F)⁻¹ := + mul_le_mul_of_nonneg_left hinv_le hL_pos.le + _ = + L * (Ch04.lambdaSqCoeffField U hΓ.params.sLower (.finite 1) a)⁻¹ := by + rw [hlambda_eq] + _ ≤ + L⁻¹ * Ch04.LambdaSqCoeffField U hΓ.params.sUpper (.finite 1) a + + L * (Ch04.lambdaSqCoeffField U hΓ.params.sLower (.finite 1) a)⁻¹ := by + exact le_add_of_nonneg_left + (mul_nonneg hL_inv_pos.le hupper_nonneg) + _ = Obs U := by + simp [Obs, limitWeightedUnitEllipticityObservableOnCube, L] + have hupperScaled : + L⁻¹ * D.sup' hD (fun U => Ch02.LambdaSq U t (.finite 1) F) ≤ + D.sup' hD Obs := by + rw [Finset.mul₀_sup' hL_inv_pos.le + (fun U => Ch02.LambdaSq U t (.finite 1) F) D hD] + exact Finset.sup'_le hD _ fun U hU => + (hupperPoint U hU).trans (Finset.le_sup' (f := Obs) hU) + have hlowerScaled : + L * D.sup' hD (fun U => (Ch02.lambdaSq U t (.finite 1) F)⁻¹) ≤ + D.sup' hD Obs := by + rw [Finset.mul₀_sup' hL_pos.le + (fun U => (Ch02.lambdaSq U t (.finite 1) F)⁻¹) D hD] + exact Finset.sup'_le hD _ fun U hU => + (hlowerPoint U hU).trans (Finset.le_sup' (f := Obs) hU) + exact ⟨hupperScaled.trans hloc, hlowerScaled.trans hloc⟩ + +theorem measureReal_localizedLimitWeightedUnitEllipticitySup_tail_le_card_mul_exp + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (m : ℕ) {lam : ℝ} (hlam : 1 ≤ lam) : + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ); + let D : Finset (TriadicCube d) := descendantsAtScale Q 0; + P.real + {a : RegCoeffField d | + (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) * lam < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params m a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ hΓ.sigma)) := by + classical + intro Q D + let : IsProbabilityMeasure P := hP.isProbability + let A : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let X : TriadicCube d → RegCoeffField d → ℝ := + fun U => + limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hΓ.params.sUpper hΓ.params.sLower + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]) + have hX : + ∀ U ∈ D, IsBigO P (gammaSigma hΓ.sigma) (X U) A := by + intro U hU + have hUscale : U.scale = 0 := descendant_scale_eq_of_mem_descendantsAtScale hU + simpa [X, A] using + isBigO_limitWeightedUnitEllipticityObservableOnCube_of_scale_zero + hP hStruct hΓ hUscale + simpa [localizedLimitWeightedUnitEllipticitySup, Q, D, hD, A, X] using + measureReal_finiteSup_tail_le_card_mul_exp_of_isBigO + (μ := P) (s := D) (hs := hD) (X := X) + (A := A) (lam := lam) (σ := hΓ.sigma) hlam hX + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticityMinimal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticityMinimal.lean new file mode 100644 index 0000000000..febd69a073 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/LocalizedUnitEllipticityMinimal.lean @@ -0,0 +1,955 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.MinimalScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedLocalizedEstimate +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomTail + +/-! # Localized Unit Ellipticity Minimal -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Minimal-scale envelope for localized unit ellipticity + +This file packages the deterministic stopping-scale logic for the localized +unit-ellipticity supremum. The stochastic tail estimate for the stopping +scale is added after this deterministic layer. +-/ + +noncomputable section + +/-- The clean collapsed square envelope at scale `m`, based at integer scale +`N`. -/ +noncomputable def unitEllipticityEnvelopeThreshold + (t α : ℝ) (m N : ℕ) : ℝ := + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / (3 : ℝ) ^ N) ^ (-α))) ^ (2 : ℕ) + +theorem unitEllipticityEnvelopeThreshold_eq_shift + {t α : ℝ} {N r : ℕ} : + unitEllipticityEnvelopeThreshold t α (N + r) N = + Real.rpow (3 : ℝ) + (2 * t * (N : ℝ) + (2 * t - α) * (r : ℝ)) := by + let A : ℝ := Real.rpow (3 : ℝ) (t * ((N + r : ℕ) : ℝ)) + let B : ℝ := (((3 : ℝ) ^ (N + r) / (3 : ℝ) ^ N) ^ (-α)) + have hratio : + (3 : ℝ) ^ (N + r) / (3 : ℝ) ^ N = (3 : ℝ) ^ r := by + rw [pow_add] + field_simp [pow_ne_zero N (by norm_num : (3 : ℝ) ≠ 0)] + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + have hA_sq : + A ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (2 * t * ((N + r : ℕ) : ℝ)) := by + dsimp [A] + let x : ℝ := t * ((N + r : ℕ) : ℝ) + have hpow₀ : + Real.rpow (3 : ℝ) (x * (2 : ℝ)) = + Real.rpow (Real.rpow (3 : ℝ) x) (2 : ℝ) := by + exact Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) x (2 : ℝ) + have hpow : + Real.rpow (3 : ℝ) (x * (2 : ℝ)) = + Real.rpow (3 : ℝ) x ^ (2 : ℕ) := by + simpa [Real.rpow_two] using hpow₀ + calc + Real.rpow (3 : ℝ) (t * ((N + r : ℕ) : ℝ)) ^ (2 : ℕ) + = Real.rpow (3 : ℝ) (x * (2 : ℝ)) := by + simpa [x] using hpow.symm + _ = Real.rpow (3 : ℝ) (2 * t * ((N + r : ℕ) : ℝ)) := by + congr 1 + ring + have hB_eq : + B = Real.rpow (3 : ℝ) (-α * (r : ℝ)) := by + dsimp [B] + rw [hratio] + rw [← Real.rpow_natCast (3 : ℝ) r] + calc + Real.rpow (Real.rpow (3 : ℝ) (r : ℝ)) (-α) + = Real.rpow (3 : ℝ) ((r : ℝ) * (-α)) := by + exact (Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) (r : ℝ) (-α)).symm + _ = Real.rpow (3 : ℝ) (-α * (r : ℝ)) := by + congr 1 + ring + calc + unitEllipticityEnvelopeThreshold t α (N + r) N + = (A * Real.sqrt B) ^ (2 : ℕ) := by + simp [unitEllipticityEnvelopeThreshold, A, B] + _ = A ^ (2 : ℕ) * B := by + rw [mul_pow, Real.sq_sqrt hB_nonneg] + _ = + Real.rpow (3 : ℝ) (2 * t * ((N + r : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-α * (r : ℝ)) := by + rw [hA_sq, hB_eq] + _ = Real.rpow (3 : ℝ) + (2 * t * (N : ℝ) + (2 * t - α) * (r : ℝ)) := by + have hcombine : + Real.rpow (3 : ℝ) (2 * t * ((N + r : ℕ) : ℝ)) * + Real.rpow (3 : ℝ) (-α * (r : ℝ)) = + Real.rpow (3 : ℝ) + (2 * t * ((N + r : ℕ) : ℝ) + -α * (r : ℝ)) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (2 * t * ((N + r : ℕ) : ℝ)) (-α * (r : ℝ))).symm + rw [hcombine] + congr 1 + norm_num [Nat.cast_add] + ring + +theorem unitEllipticity_tail_parameter_le_threshold_div + {t α scale : ℝ} {N r : ℕ} : + ((3 : ℝ) ^ (2 * t * (N : ℝ)) / scale) * + ((3 : ℝ) ^ (2 * t - α)) ^ r ≤ + unitEllipticityEnvelopeThreshold t α (N + r) N / scale := by + have hρpow : + ((3 : ℝ) ^ (2 * t - α)) ^ r = + Real.rpow (3 : ℝ) ((2 * t - α) * (r : ℝ)) := by + rw [← Real.rpow_natCast] + exact (Real.rpow_mul (x := (3 : ℝ)) + (by norm_num : (0 : ℝ) ≤ 3) (2 * t - α) (r : ℝ)).symm + rw [unitEllipticityEnvelopeThreshold_eq_shift (t := t) (α := α) (N := N) (r := r)] + rw [hρpow] + have hprod : + (3 : ℝ) ^ (2 * t * (N : ℝ)) * + Real.rpow (3 : ℝ) ((2 * t - α) * (r : ℝ)) = + Real.rpow (3 : ℝ) + (2 * t * (N : ℝ) + (2 * t - α) * (r : ℝ)) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (2 * t * (N : ℝ)) ((2 * t - α) * (r : ℝ))).symm + calc + ((3 : ℝ) ^ (2 * t * (N : ℝ)) / scale) * + Real.rpow (3 : ℝ) ((2 * t - α) * (r : ℝ)) + = + ((3 : ℝ) ^ (2 * t * (N : ℝ)) * + Real.rpow (3 : ℝ) ((2 * t - α) * (r : ℝ))) / scale := by + ring + _ = + Real.rpow (3 : ℝ) + (2 * t * (N : ℝ) + (2 * t - α) * (r : ℝ)) / scale := by + rw [hprod] + _ ≤ + Real.rpow (3 : ℝ) + (2 * t * (N : ℝ) + (2 * t - α) * (r : ℝ)) / scale := le_rfl + +/-- Bad scale for the localized limiting-normalized unit ellipticity supremum: +above the base scale `N`, the supremum exceeds the collapsed envelope. -/ +def unitEllipticityBadScaleEvent + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + (t α : ℝ) (N : ℕ) : Set (RegCoeffField d) := + {a | ∃ m : ℕ, N ≤ m ∧ + unitEllipticityEnvelopeThreshold t α m N < + localizedLimitWeightedUnitEllipticitySup hP hStruct params m a} + +theorem unitEllipticityBadScaleEvent_antitone + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + {t α : ℝ} (hα : 0 ≤ α) {N K : ℕ} (hNK : N ≤ K) : + unitEllipticityBadScaleEvent hP hStruct params t α K ⊆ + unitEllipticityBadScaleEvent hP hStruct params t α N := by + intro a hbad + rcases hbad with ⟨m, hKm, hbad⟩ + refine ⟨m, hNK.trans hKm, ?_⟩ + let rK : ℕ := m - K + let rN : ℕ := m - N + have hmK : K + rK = m := by + dsimp [rK] + exact Nat.add_sub_of_le hKm + have hmN : N + rN = m := by + dsimp [rN] + exact Nat.add_sub_of_le (hNK.trans hKm) + have hsub_le : rK ≤ rN := by + dsimp [rK, rN] + exact Nat.sub_le_sub_left hNK m + have hcast_le : (rK : ℝ) ≤ (rN : ℝ) := by exact_mod_cast hsub_le + have hpow_le : + ((3 : ℝ) ^ (rN : ℝ)) ^ (-α) ≤ + ((3 : ℝ) ^ (rK : ℝ)) ^ (-α) := by + have hbaseK_pos : 0 < (3 : ℝ) ^ (rK : ℝ) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hbaseN_pos : 0 < (3 : ℝ) ^ (rN : ℝ) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hbase_le : + (3 : ℝ) ^ (rK : ℝ) ≤ (3 : ℝ) ^ (rN : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hcast_le + by_cases hα_zero : α = 0 + · simp [hα_zero] + · have hα_pos : 0 < α := lt_of_le_of_ne hα (Ne.symm hα_zero) + exact + (Real.rpow_le_rpow_iff_of_neg hbaseN_pos hbaseK_pos + (by linarith : (-α : ℝ) < 0)).2 hbase_le + have hthreshold_le : + unitEllipticityEnvelopeThreshold t α m N ≤ + unitEllipticityEnvelopeThreshold t α m K := by + have hleft : + unitEllipticityEnvelopeThreshold t α m N = + unitEllipticityEnvelopeThreshold t α (N + rN) N := by + rw [hmN] + have hright : + unitEllipticityEnvelopeThreshold t α m K = + unitEllipticityEnvelopeThreshold t α (K + rK) K := by + rw [hmK] + rw [hleft, hright] + simp only [unitEllipticityEnvelopeThreshold] + have hA_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (t * ((N + rN : ℕ) : ℝ)) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + have hB_nonneg : + 0 ≤ Real.sqrt (((3 : ℝ) ^ (N + rN) / (3 : ℝ) ^ N) ^ (-α)) := by + positivity + have hAK_eq : + Real.rpow (3 : ℝ) (t * ((N + rN : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (t * ((K + rK : ℕ) : ℝ)) := by + rw [hmN, hmK] + have hratioN : + (3 : ℝ) ^ (N + rN) / (3 : ℝ) ^ N = (3 : ℝ) ^ rN := by + rw [pow_add] + field_simp [pow_ne_zero N (by norm_num : (3 : ℝ) ≠ 0)] + have hratioK : + (3 : ℝ) ^ (K + rK) / (3 : ℝ) ^ K = (3 : ℝ) ^ rK := by + rw [pow_add] + field_simp [pow_ne_zero K (by norm_num : (3 : ℝ) ≠ 0)] + have hsqrt_le : + Real.sqrt (((3 : ℝ) ^ (N + rN) / (3 : ℝ) ^ N) ^ (-α)) ≤ + Real.sqrt (((3 : ℝ) ^ (K + rK) / (3 : ℝ) ^ K) ^ (-α)) := by + rw [hratioN, hratioK] + exact Real.sqrt_le_sqrt (by simpa [Real.rpow_natCast] using hpow_le) + have hmul_le : + Real.rpow (3 : ℝ) (t * ((N + rN : ℕ) : ℝ)) * + Real.sqrt (((3 : ℝ) ^ (N + rN) / (3 : ℝ) ^ N) ^ (-α)) ≤ + Real.rpow (3 : ℝ) (t * ((K + rK : ℕ) : ℝ)) * + Real.sqrt (((3 : ℝ) ^ (K + rK) / (3 : ℝ) ^ K) ^ (-α)) := by + rw [hAK_eq] + exact mul_le_mul_of_nonneg_left hsqrt_le + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + exact pow_le_pow_left₀ (mul_nonneg hA_nonneg hB_nonneg) hmul_le 2 + exact lt_of_le_of_lt hthreshold_le hbad + +theorem badTailEvent_unitEllipticityBadScaleEvent_subset + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + {t α : ℝ} (hα : 0 ≤ α) {N : ℕ} : + badTailEvent (unitEllipticityBadScaleEvent hP hStruct params t α) N ⊆ + unitEllipticityBadScaleEvent hP hStruct params t α N := by + intro a htail + rcases htail with ⟨K, hNK, hK⟩ + exact unitEllipticityBadScaleEvent_antitone + hP hStruct params hα hNK hK + +theorem unitEllipticityBadScaleEvent_subset_rows + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + {t α : ℝ} {N : ℕ} : + unitEllipticityBadScaleEvent hP hStruct params t α N ⊆ + ⋃ r : ℕ, + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct params (N + r) a} := by + intro a hbad + rcases hbad with ⟨m, hNm, hbad⟩ + let r : ℕ := m - N + refine Set.mem_iUnion.2 ⟨r, ?_⟩ + have hm : N + r = m := by + dsimp [r] + exact Nat.add_sub_of_le hNm + simpa [hm] + using hbad + +theorem measureReal_unitEllipticityBadScaleRow_le_weighted + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α : ℝ} {N r : ℕ} : + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := (3 : ℝ) ^ (2 * t * (N : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (2 * t - α) + 0 < t → + α < t → + 1 ≤ A → + P.real + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} ≤ + w ^ N * (w ^ r * Real.exp (-((A * ρ ^ r) ^ hΓ.sigma))) := by + classical + intro scale w A ρ ht hαt hA_one + let : IsProbabilityMeasure P := hP.isProbability + let Q : TriadicCube d := originCube d (((N + r : ℕ) : ℤ)) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let lam : ℝ := unitEllipticityEnvelopeThreshold t α (N + r) N / scale + have hθ_one : 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos (lt_of_lt_of_le zero_lt_one hθ_one) hΓ.thetaHat_pos + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_one + have hρ_gt : 1 < ρ := by + have hgap : 0 < 2 * t - α := by linarith + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (2 * t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hAρ_nonneg : 0 ≤ A * ρ ^ r := by positivity + have hlam_lower : A * ρ ^ r ≤ lam := by + simpa [A, ρ, lam, scale] using + unitEllipticity_tail_parameter_le_threshold_div + (t := t) (α := α) (scale := scale) (N := N) (r := r) + have hlam_one : 1 ≤ lam := by + have hρ_pow_one : 1 ≤ ρ ^ r := one_le_pow₀ hρ_gt.le + have hA_le_Aρ : A ≤ A * ρ ^ r := by + calc + A = A * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul_of_nonneg_left hρ_pow_one hA_pos.le + exact hA_one.trans (hA_le_Aρ.trans hlam_lower) + have hcard : + D.card = (3 ^ d) ^ (N + r) := by + simpa [Q, D] using + descendantsAtScale_originCube_nat_card + (d := d) (m := N + r) (n := 0) (Nat.zero_le _) + have hmeasure : + P.real + {a : RegCoeffField d | + scale * lam < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ hΓ.sigma)) := by + simpa [Q, D, scale, lam] using + measureReal_localizedLimitWeightedUnitEllipticitySup_tail_le_card_mul_exp + hP hStruct hΓ (N + r) hlam_one + have hrow_subset : + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} ⊆ + {a : RegCoeffField d | + scale * lam < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} := by + intro a ha + have hscale_lam : + scale * lam = unitEllipticityEnvelopeThreshold t α (N + r) N := by + dsimp [lam] + field_simp [hscale_pos.ne'] + simpa [hscale_lam] using ha + have hrow_measure : + P.real + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} ≤ + (D.card : ℝ) * Real.exp (-(lam ^ hΓ.sigma)) := + (measureReal_mono (μ := P) hrow_subset).trans hmeasure + have hD_weight : (D.card : ℝ) ≤ w ^ N * w ^ r := by + have hw_eq : w = ((3 ^ d : ℕ) : ℝ) := rfl + have hD_eq : (D.card : ℝ) = w ^ N * w ^ r := by + calc + (D.card : ℝ) = w ^ (N + r) := by + rw [hcard] + norm_num [w] + _ = w ^ N * w ^ r := by + rw [pow_add] + exact le_of_eq hD_eq + have hexp : + Real.exp (-(lam ^ hΓ.sigma)) ≤ + Real.exp (-((A * ρ ^ r) ^ hΓ.sigma)) := by + have hpow : (A * ρ ^ r) ^ hΓ.sigma ≤ lam ^ hΓ.sigma := + Real.rpow_le_rpow hAρ_nonneg hlam_lower hΓ.sigma_pos.le + exact Real.exp_le_exp.mpr (by linarith) + calc + P.real + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} + ≤ (D.card : ℝ) * Real.exp (-(lam ^ hΓ.sigma)) := hrow_measure + _ ≤ (w ^ N * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ hΓ.sigma)) := + mul_le_mul hD_weight hexp (by positivity) (by positivity) + _ = w ^ N * (w ^ r * Real.exp (-((A * ρ ^ r) ^ hΓ.sigma))) := by + ring + +theorem measureReal_unitEllipticityBadScaleEvent_le_weighted_kernel + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α : ℝ} {N : ℕ} : + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := (3 : ℝ) ^ (2 * t * (N : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (2 * t - α) + 0 < t → + α < t → + 1 ≤ A → + P.real (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α N) ≤ + w ^ N * + (Real.exp (-(A ^ hΓ.sigma)) * + weightedGeometricExpKernelConst w (ρ ^ hΓ.sigma)) := by + classical + intro scale w A ρ ht hαt hA_one + let : IsProbabilityMeasure P := hP.isProbability + let E : ℕ → Fin 1 → Set (RegCoeffField d) := + fun r _ => + {a : RegCoeffField d | + unitEllipticityEnvelopeThreshold t α (N + r) N < + localizedLimitWeightedUnitEllipticitySup hP hStruct hΓ.params (N + r) a} + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hC_nonneg : 0 ≤ w ^ N := pow_nonneg hw_pos.le N + have hρ_gt : 1 < ρ := by + have hgap : 0 < 2 * t - α := by linarith + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (2 * t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hsubset : + unitEllipticityBadScaleEvent hP hStruct hΓ.params t α N ⊆ + ⋃ r : ℕ, ⋃ j : Fin 1, E r j := by + intro a ha + have hrows := + unitEllipticityBadScaleEvent_subset_rows + hP hStruct hΓ.params (t := t) (α := α) (N := N) ha + rcases Set.mem_iUnion.1 hrows with ⟨r, hr⟩ + exact Set.mem_iUnion.2 ⟨r, Set.mem_iUnion.2 ⟨0, by simpa [E] using hr⟩⟩ + calc + P.real (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α N) + ≤ P.real (⋃ r : ℕ, ⋃ j : Fin 1, E r j) := + measureReal_mono (μ := P) hsubset + _ ≤ ((1 : ℕ) : ℝ) * w ^ N * + (Real.exp (-(A ^ hΓ.sigma)) * + weightedGeometricExpKernelConst w (ρ ^ hΓ.sigma)) := + measureReal_iUnion_constRows_le_weighted_exp_kernel + (μ := P) (Q := 1) (E := E) + hC_nonneg hw_pos hA_one hρ_gt hΓ.sigma_pos + (by + intro r j + simpa [E, scale, w, A, ρ] using + measureReal_unitEllipticityBadScaleRow_le_weighted + hP hStruct hΓ (t := t) (α := α) (N := N) (r := r) + ht hαt hA_one) + _ = + w ^ N * + (Real.exp (-(A ^ hΓ.sigma)) * + weightedGeometricExpKernelConst w (ρ ^ hΓ.sigma)) := by + ring + +theorem measureReal_badTailEvent_unitEllipticityBadScaleEvent_le_weighted_kernel + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α : ℝ} {N : ℕ} : + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := (3 : ℝ) ^ (2 * t * (N : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (2 * t - α) + 0 < t → + 0 ≤ α → + α < t → + 1 ≤ A → + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) N) ≤ + w ^ N * + (Real.exp (-(A ^ hΓ.sigma)) * + weightedGeometricExpKernelConst w (ρ ^ hΓ.sigma)) := by + intro scale w A ρ ht hα hαt hA_one + let : IsProbabilityMeasure P := hP.isProbability + have hmono : + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) N) ≤ + P.real (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α N) := + measureReal_mono (μ := P) + (badTailEvent_unitEllipticityBadScaleEvent_subset + hP hStruct hΓ.params (t := t) (α := α) hα) + exact hmono.trans + (by + simpa [scale, w, A, ρ] using + measureReal_unitEllipticityBadScaleEvent_le_weighted_kernel + hP hStruct hΓ (t := t) (α := α) (N := N) + ht hαt hA_one) + +theorem exists_quantitative_threshold_unitEllipticityBadTail_le_interpolated_tail + {d : ℕ} [NeZero d] {σ : ℝ} (hσ_pos : 0 < σ) : + ∀ {t α : ℝ}, + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρunit : ℝ := (3 : ℝ) ^ (2 * t - α) + let Kunit : ℝ := weightedGeometricExpKernelConst w (ρunit ^ σ) + let M : ℝ := max 1 (max 0 Kunit) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + 0 ≤ α → + α < t → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + ∀ q : ℕ, Q ≤ q → + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) + q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + intro t α + dsimp only + intro ht hα_nonneg hαt + classical + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρunit : ℝ := (3 : ℝ) ^ (2 * t - α) + let Kunit : ℝ := weightedGeometricExpKernelConst w (ρunit ^ σ) + let M : ℝ := max 1 (max 0 Kunit) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hρgap_gt : 1 < ρgap := by + dsimp [ρgap] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη_pos + have hW_one : 1 ≤ W := by + dsimp [W] + exact le_max_left 1 w + have hC₀_nonneg : 0 ≤ C₀ := by + have hlogW_nonneg : 0 ≤ Real.log W := Real.log_nonneg hW_one + dsimp [C₀] + linarith + obtain ⟨R, hR⟩ := + linear_le_exp_linear_eventually + (C := C₀) (γ := Real.log ρgap / 2) + hC₀_nonneg (by + have hlogρ_pos : 0 < Real.log ρgap := Real.log_pos hρgap_gt + positivity) + refine ⟨R, ?_, ?_⟩ + · simpa [η, w, W, ρunit, Kunit, M, ρgap, C₀] using hR + intro P hP hStruct hΓ hσ_eq + let : IsProbabilityMeasure P := hP.isProbability + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + intro q hQq + have hθ_one : 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos (lt_of_lt_of_le zero_lt_one hθ_one) hΓ.thetaHat_pos + have hBlead_pos : 0 < Blead := by + simpa [Blead] using + smallBottomTailDenominator_pos + (scale := scale) (η := η) (σ := σ) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hρunit_gt : 1 < ρunit := by + have hgap : 0 < 2 * t - α := by linarith + dsimp [ρunit] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (2 * t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hKunit_pos : 0 < Kunit := by + dsimp [Kunit] + exact weightedGeometricExpKernelConst_pos + (w := w) (R := ρunit ^ σ) hw_pos + (Real.one_lt_rpow hρunit_gt hσ_pos) + have hM_one : 1 ≤ M := by + dsimp [M] + exact le_max_left 1 _ + have hq_pref : Qpref ≤ q := (le_max_left Qpref Qlead).trans hQq + have hq_lead : Qlead ≤ q := (le_max_right Qpref Qlead).trans hQq + have hqM : + Nat.ceil (max 0 (Real.log M)) ≤ q := + (le_max_left _ _).trans hq_pref + have hqR : R ≤ q := + (le_max_left R + (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_pref) + have hqc : + Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap) ≤ q := + (le_max_right R + (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_pref) + have hlead_one : 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead := by + simpa [Blead] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := (1 : ℝ)) (O := (0 : ℝ)) (D := Blead) (q := q) + (by norm_num) hBlead_pos + (by simpa [Qlead] using hq_lead) + have hη_le_t : η ≤ σ * t := by + have hb_pos : 0 < (d : ℝ) / 2 := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + simpa [η, finiteQuenchedTailExponent] using + interpolatedQuenchedTailExponent_le_sigma_mul_t + (b := (d : ℝ) / 2) (σ := σ) (t := t) + hb_pos hσ_pos ht + have hη_le : η ≤ σ * (2 * t) := by + have hσt_nonneg : 0 ≤ σ * t := mul_nonneg hσ_pos.le ht.le + nlinarith + let Aold : ℝ := (3 : ℝ) ^ (2 * t * (q : ℝ)) / scale + let Alead : ℝ := ((3 : ℝ) ^ (q : ℝ) / Blead) ^ η + let Atail : ℝ := ((3 : ℝ) ^ (q : ℝ) / Btail) ^ η + have hAlead_to_old : Alead ≤ Aold ^ σ := by + simpa [Aold, Alead, Blead] using + smallBottomTailDenominator_rpow_le_crude_scale + (scale := scale) (η := η) (σ := σ) (t := 2 * t) (q := q) + hscale_pos hη_pos hσ_pos hη_le + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + hscale_pos.le + have hAold_one : 1 ≤ Aold := by + have hAlead_one : 1 ≤ Alead := by + dsimp [Alead] + exact Real.one_le_rpow hlead_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg hσ_pos + (hAlead_one.trans hAlead_to_old) + have hkernel_q : + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) q) ≤ + w ^ q * (Real.exp (-(Aold ^ σ)) * Kunit) := by + simpa [scale, w, Aold, ρunit, Kunit, hσ_eq] using + measureReal_badTailEvent_unitEllipticityBadScaleEvent_le_weighted_kernel + hP hStruct hΓ (t := t) (α := α) (N := q) + ht hα_nonneg hαt hAold_one + have hprefix_le : + Kunit * w ^ q ≤ M * (((q : ℝ) + 1) * W ^ q) := by + have hK_le_M : Kunit ≤ M := by + calc + Kunit ≤ max 0 Kunit := le_max_right 0 Kunit + _ ≤ M := by + dsimp [M] + exact le_max_right 1 _ + have hwW : w ≤ W := by + dsimp [W] + exact le_max_right 1 w + have hwq_le : w ^ q ≤ W ^ q := + pow_le_pow_left₀ hw_pos.le hwW q + have hWq_nonneg : 0 ≤ W ^ q := by positivity + have hleft : + Kunit * w ^ q ≤ M * W ^ q := + mul_le_mul hK_le_M hwq_le + (pow_nonneg hw_pos.le q) (zero_le_one.trans hM_one) + have hqplus_one : 1 ≤ (q : ℝ) + 1 := by + have hq_nonneg : 0 ≤ (q : ℝ) := by positivity + linarith + have hright : + M * W ^ q ≤ M * (((q : ℝ) + 1) * W ^ q) := by + have hfactor : W ^ q ≤ ((q : ℝ) + 1) * W ^ q := by + calc + W ^ q = 1 * W ^ q := by ring + _ ≤ ((q : ℝ) + 1) * W ^ q := + mul_le_mul_of_nonneg_right hqplus_one hWq_nonneg + exact mul_le_mul_of_nonneg_left hfactor (zero_le_one.trans hM_one) + exact hleft.trans hright + have hc_pos : 0 < cgap := by + simpa [cgap, Btail] using + inv_rpow_sub_pos_of_lt hBlead_pos hBtail_pos hη_pos hBlead_lt_Btail + have hpref_gap : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (Alead - Atail) := by + have hpref_exp : + M * (((q : ℝ) + 1) * W ^ q) ≤ + Real.exp (cgap * ρgap ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := M) (W := W) (C₀ := C₀) (c := cgap) + (ρ := ρgap) (R := R) (q := q) + hM_one hW_one hc_pos hρgap_gt + (le_rfl : 2 + Real.log W ≤ C₀) hR hqM hqR hqc + have hgap : + cgap * ρgap ^ q ≤ Alead - Atail := by + simpa [Alead, Atail, cgap, ρgap] using + geometric_gap_le_rpow_three_nat_div_gap + (Blead := Blead) (Btail := Btail) (η := η) + (c := cgap) (ρ := ρgap) (q := q) + hBlead_pos hBtail_pos + (le_rfl : cgap ≤ Blead ^ (-η) - Btail ^ (-η)) + (le_rfl : ρgap ≤ (3 : ℝ) ^ η) hc_pos.le + (le_of_lt (lt_trans zero_lt_one hρgap_gt)) + exact hpref_exp.trans (Real.exp_le_exp.mpr hgap) + have hexp_old : + Real.exp (-(Aold ^ σ)) ≤ Real.exp (-Alead) := + Real.exp_le_exp.mpr (by linarith) + have hmeasure_tail : + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) q) ≤ + M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := by + calc + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) q) + ≤ w ^ q * (Real.exp (-(Aold ^ σ)) * Kunit) := hkernel_q + _ = Kunit * w ^ q * Real.exp (-(Aold ^ σ)) := by ring + _ ≤ Kunit * w ^ q * Real.exp (-Alead) := + mul_le_mul_of_nonneg_left hexp_old + (by positivity : 0 ≤ Kunit * w ^ q) + _ ≤ M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hprefix_le (Real.exp_pos _).le + calc + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) q) + ≤ M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := + hmeasure_tail + _ ≤ Real.exp (Alead - Atail) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hpref_gap (Real.exp_pos _).le + _ = Real.exp (-Atail) := by + rw [← Real.exp_add] + ring_nf + +theorem localizedLimitWeightedUnitEllipticitySup_le_of_not_mem_unitEllipticityBadScaleEvent + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + {t α : ℝ} {N m : ℕ} {a : RegCoeffField d} + (hnot : a ∉ unitEllipticityBadScaleEvent hP hStruct params t α N) + (hNm : N ≤ m) : + localizedLimitWeightedUnitEllipticitySup hP hStruct params m a ≤ + unitEllipticityEnvelopeThreshold t α m N := by + exact le_of_not_gt fun hbad => hnot ⟨m, hNm, hbad⟩ + +/-- Above the constructed stopping scale, absence of unit-ellipticity bad +scales gives exactly the collapsed envelope with the random scale `X`. -/ +theorem localizedLimitWeightedUnitEllipticitySup_le_above_quenchedMinimalScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) + {N0 m : ℕ} {t α : ℝ} {a : RegCoeffField d} + (hgood : + hasGoodTailFrom N0 + (unitEllipticityBadScaleEvent hP hStruct params t α) a) + (hscale : + quenchedMinimalScale N0 + (unitEllipticityBadScaleEvent hP hStruct params t α) a ≤ + (3 : ℝ) ^ m) : + localizedLimitWeightedUnitEllipticitySup hP hStruct params m a ≤ + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt + (((3 : ℝ) ^ m / + quenchedMinimalScale N0 + (unitEllipticityBadScaleEvent hP hStruct params t α) a) ^ + (-α))) ^ (2 : ℕ) := by + let Bad : ℕ → Set (RegCoeffField d) := + unitEllipticityBadScaleEvent hP hStruct params t α + let L : ℕ := quenchedMinimalScaleIndex N0 Bad a + have hLm : L ≤ m := by + simpa [L, Bad] using + quenchedMinimalScaleIndex_le_of_scale_le_pow + (N0 := N0) (Bad := Bad) (ω := a) hscale + have hnot : a ∉ Bad L := by + exact not_mem_bad_of_quenchedMinimalScaleIndex_le + (N0 := N0) (Bad := Bad) (ω := a) + hgood (N := L) (K := L) le_rfl le_rfl + have hraw := + localizedLimitWeightedUnitEllipticitySup_le_of_not_mem_unitEllipticityBadScaleEvent + hP hStruct params (t := t) (α := α) (N := L) (m := m) + (a := a) (by simpa [Bad] using hnot) hLm + simpa [unitEllipticityEnvelopeThreshold, quenchedMinimalScale, Bad, L] + using hraw + +theorem exists_unitEllipticityMinimalScale_interpolated + {d : ℕ} [NeZero d] {σ : ℝ} (hσ_pos : 0 < σ) + {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (hσ_eq : hΓ.sigma = σ) + {t α : ℝ} : + let η : ℝ := finiteQuenchedTailExponent d σ t + 0 < t → + 0 ≤ α → + α < t → + ∃ X : RegCoeffField d → ℝ, ∃ C : ℝ, 0 < C ∧ + IsBigO P (gammaSigma η) X C ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + localizedLimitWeightedUnitEllipticitySup + hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α))) ^ (2 : ℕ) := by + intro η ht hα_nonneg hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρunit : ℝ := (3 : ℝ) ^ (2 * t - α) + let Kunit : ℝ := weightedGeometricExpKernelConst w (ρunit ^ σ) + let M : ℝ := max 1 (max 0 Kunit) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + obtain ⟨R, _hR, htail_abs⟩ := + exists_quantitative_threshold_unitEllipticityBadTail_le_interpolated_tail + (d := d) (σ := σ) hσ_pos + (t := t) (α := α) ht hα_nonneg hαt + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + let Bad : ℕ → Set (RegCoeffField d) := + unitEllipticityBadScaleEvent hP hStruct hΓ.params t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + let C : ℝ := 3 * ((3 : ℝ) ^ Q) * B + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hθ_one : 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos (lt_of_lt_of_le zero_lt_one hθ_one) hΓ.thetaHat_pos + have hBlead_pos : 0 < Blead := by + simpa [Blead] using + smallBottomTailDenominator_pos + (scale := scale) (η := η) (σ := σ) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hB : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 Btail + have hB_pos : 0 < B := lt_of_lt_of_le zero_lt_one hB + have hC_pos : 0 < C := by + dsimp [C] + positivity + have htail : + ∀ N : ℕ, Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + intro N hQN + have hN_abs : + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) + N) ≤ + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) := by + simpa [η, w, W, ρunit, Kunit, M, ρgap, C₀, + scale, Blead, Btail, cgap, Qpref, Qlead, Q] using + htail_abs hP hStruct hΓ hσ_eq N hQN + have hcompare : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + simpa [B] using + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := N) (B := Btail) (η := η) + hBtail_pos hη_pos + exact hN_abs.trans hcompare + have hsmall : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Q ≤ N ∧ P.real (badTailEvent Bad N) ≤ ε := by + intro ε hε + obtain ⟨j, hj⟩ := + exists_exp_neg_rpow_three_div_le + (B := B) (η := η) (ε := ε) hB_pos hη_pos hε + refine ⟨Q + j, Nat.le_add_right Q j, ?_⟩ + have htail_j := htail (Q + j) (Nat.le_add_right Q j) + exact htail_j.trans (by simpa [Nat.add_sub_cancel_left] using hj) + have hgoodAE : ∀ᵐ aω ∂P, hasGoodTailFrom Q Bad aω := by + exact ae_hasGoodTailFrom + (μ := P) (N0 := Q) (Bad := Bad) hsmall + have hO : + IsBigO P (gammaSigma η) X C := by + simpa [X, C] using + isBigO_quenchedMinimalScale_of_badTailEvent_bound + (μ := P) (N0 := Q) (Bad := Bad) (B := B) (η := η) + hη_pos hB htail + have hXone : ∀ aω, 1 ≤ X aω := by + intro aω + simpa [X] using one_le_quenchedMinimalScale Q Bad aω + have hpoint : + ∀ᵐ aω ∂P, + ∀ {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + localizedLimitWeightedUnitEllipticitySup + hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α))) ^ (2 : ℕ) := by + filter_upwards [hgoodAE] with aω hgood + intro m hm + simpa [Bad, X] using + localizedLimitWeightedUnitEllipticitySup_le_above_quenchedMinimalScale + hP hStruct hΓ.params (N0 := Q) (m := m) (t := t) (α := α) + (a := aω) hgood (by simpa [Bad, X] using hm) + exact ⟨X, C, hC_pos, hO, hXone, hpoint⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/MinimalScaleTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/MinimalScaleTail.lean new file mode 100644 index 0000000000..659a2fbc14 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/MinimalScaleTail.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadTailUnion + +/-! # Minimal Scale Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Quantitative minimal scale from bad-tail events + +This file contains the abstract minimal-scale construction used by +Theorem `t.homogenization.quenched`. The construction is paired with a +tail-event inclusion, so the stochastic integrability of the scale is proved +from quantitative bounds on `badTailEvent`. +-/ + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] + +/-- Above-scale good event for an abstract family of bad events. -/ +def goodTailFrom (Bad : ℕ → Set Ω) (M : ℕ) (ω : Ω) : Prop := + ∀ K : ℕ, M ≤ K → ω ∉ Bad K + +/-- The sample has a deterministic scale, not below `N0`, above which all bad +events are absent. -/ +def hasGoodTailFrom (N0 : ℕ) (Bad : ℕ → Set Ω) (ω : Ω) : Prop := + ∃ M : ℕ, N0 ≤ M ∧ goodTailFrom Bad M ω + +/-- The first scale not below `N0` above which all bad events are absent. +On the exceptional set where no such scale exists, the value is `N0`; the +pointwise estimate is only used on `hasGoodTailFrom`, while the tail estimate +below remains valid for the total function. -/ +noncomputable def quenchedMinimalScaleIndex + (N0 : ℕ) (Bad : ℕ → Set Ω) (ω : Ω) : ℕ := + by + classical + exact if h : hasGoodTailFrom N0 Bad ω then Nat.find h else N0 + +/-- The triadic random minimal scale associated with +`quenchedMinimalScaleIndex`. -/ +noncomputable def quenchedMinimalScale + (N0 : ℕ) (Bad : ℕ → Set Ω) (ω : Ω) : ℝ := + (3 : ℝ) ^ quenchedMinimalScaleIndex N0 Bad ω + +omit [MeasurableSpace Ω] in +theorem one_le_quenchedMinimalScale + (N0 : ℕ) (Bad : ℕ → Set Ω) (ω : Ω) : + 1 ≤ quenchedMinimalScale N0 Bad ω := by + dsimp [quenchedMinimalScale] + exact one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + +omit [MeasurableSpace Ω] in +theorem quenchedMinimalScaleIndex_spec + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} + (hgood : hasGoodTailFrom N0 Bad ω) : + N0 ≤ quenchedMinimalScaleIndex N0 Bad ω ∧ + goodTailFrom Bad (quenchedMinimalScaleIndex N0 Bad ω) ω := by + classical + have hfind := Nat.find_spec hgood + simpa [quenchedMinimalScaleIndex, hgood] using hfind + +omit [MeasurableSpace Ω] in +theorem quenchedMinimalScaleIndex_le_of_goodTail + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} {M : ℕ} + (hN0M : N0 ≤ M) (hM : goodTailFrom Bad M ω) : + quenchedMinimalScaleIndex N0 Bad ω ≤ M := by + classical + let hgood : hasGoodTailFrom N0 Bad ω := ⟨M, hN0M, hM⟩ + have hidx_eq : quenchedMinimalScaleIndex N0 Bad ω = Nat.find hgood := by + unfold quenchedMinimalScaleIndex + rw [dif_pos hgood] + rw [hidx_eq] + exact Nat.find_min' hgood ⟨hN0M, hM⟩ + +omit [MeasurableSpace Ω] in +theorem mem_badTailEvent_of_lt_quenchedMinimalScaleIndex + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} {N : ℕ} + (hN0N : N0 ≤ N) + (hN : N < quenchedMinimalScaleIndex N0 Bad ω) : + ω ∈ badTailEvent Bad N := by + classical + by_cases htail : ω ∈ badTailEvent Bad N + · exact htail + · have hN_good : goodTailFrom Bad N ω := by + intro K hNK hbad + exact htail ⟨K, hNK, hbad⟩ + have hidx_le_N : + quenchedMinimalScaleIndex N0 Bad ω ≤ N := + quenchedMinimalScaleIndex_le_of_goodTail + (N0 := N0) (Bad := Bad) (ω := ω) hN0N hN_good + omega + +omit [MeasurableSpace Ω] in +theorem quenchedMinimalScaleIndex_tail_subset_badTailEvent + {N0 : ℕ} {Bad : ℕ → Set Ω} {N : ℕ} + (hN0N : N0 ≤ N) : + {ω | N < quenchedMinimalScaleIndex N0 Bad ω} ⊆ badTailEvent Bad N := by + intro ω hω + exact mem_badTailEvent_of_lt_quenchedMinimalScaleIndex + (N0 := N0) (Bad := Bad) hN0N hω + +omit [MeasurableSpace Ω] in +theorem not_hasGoodTailFrom_subset_badTailEvent + {N0 : ℕ} {Bad : ℕ → Set Ω} {N : ℕ} + (hN0N : N0 ≤ N) : + {ω | ¬ hasGoodTailFrom N0 Bad ω} ⊆ badTailEvent Bad N := by + intro ω hω + by_contra htail + have hgoodN : goodTailFrom Bad N ω := by + intro K hNK hbad + exact htail ⟨K, hNK, hbad⟩ + exact hω ⟨N, hN0N, hgoodN⟩ + +/-- Quantitative bad-tail bounds imply that the exceptional set with no good +tail has measure zero. The hypothesis is deliberately an epsilon formulation: +downstream files can supply it from any explicit geometric or +stretched-exponential bad-tail estimate. -/ +theorem measureReal_not_hasGoodTailFrom_eq_zero + {μ : Measure Ω} [IsFiniteMeasure μ] {N0 : ℕ} {Bad : ℕ → Set Ω} + (hsmall : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, N0 ≤ N ∧ μ.real (badTailEvent Bad N) ≤ ε) : + μ.real {ω | ¬ hasGoodTailFrom N0 Bad ω} = 0 := by + let E : Set Ω := {ω | ¬ hasGoodTailFrom N0 Bad ω} + have hnonneg : 0 ≤ μ.real E := by positivity + by_contra hne + have hpos : 0 < μ.real E := lt_of_le_of_ne hnonneg (Ne.symm hne) + obtain ⟨N, hN0N, hN⟩ := hsmall (μ.real E / 2) (by linarith) + have hsubset : E ⊆ badTailEvent Bad N := + not_hasGoodTailFrom_subset_badTailEvent + (N0 := N0) (Bad := Bad) hN0N + have hmono : μ.real E ≤ μ.real (badTailEvent Bad N) := + measureReal_mono (μ := μ) hsubset + nlinarith + +theorem ae_hasGoodTailFrom + {μ : Measure Ω} [IsFiniteMeasure μ] {N0 : ℕ} {Bad : ℕ → Set Ω} + (hsmall : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, N0 ≤ N ∧ μ.real (badTailEvent Bad N) ≤ ε) : + ∀ᵐ ω ∂μ, hasGoodTailFrom N0 Bad ω := by + have hzero : + μ.real {ω | ¬ hasGoodTailFrom N0 Bad ω} = 0 := + measureReal_not_hasGoodTailFrom_eq_zero + (μ := μ) (N0 := N0) (Bad := Bad) hsmall + have hnull : + μ {ω | ¬ hasGoodTailFrom N0 Bad ω} = 0 := + (measureReal_eq_zero_iff).1 hzero + exact ae_iff.mpr hnull + +theorem rpow_three_log_div_log_eq + {x : ℝ} (hx : 0 < x) : + Real.rpow (3 : ℝ) (Real.log x / Real.log 3) = x := by + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + calc + Real.rpow (3 : ℝ) (Real.log x / Real.log 3) + = Real.exp (Real.log (3 : ℝ) * (Real.log x / Real.log 3)) := by + simpa using + Real.rpow_def_of_pos + (x := (3 : ℝ)) (y := Real.log x / Real.log 3) + (by norm_num : (0 : ℝ) < 3) + _ = Real.exp (Real.log x) := by + congr 1 + field_simp [hlog3_pos.ne'] + _ = x := Real.exp_log hx + +theorem rpow_three_natCeil_log_div_log_le_three_mul + {x : ℝ} (hx : 1 ≤ x) : + Real.rpow (3 : ℝ) + ((Nat.ceil (Real.log x / Real.log 3) : ℕ) : ℝ) ≤ + 3 * x := by + let y : ℝ := Real.log x / Real.log 3 + have hx_pos : 0 < x := lt_of_lt_of_le zero_lt_one hx + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hy_nonneg : 0 ≤ y := by + dsimp [y] + exact div_nonneg (Real.log_nonneg hx) hlog3_pos.le + have hceil_lt : ((Nat.ceil y : ℕ) : ℝ) < y + 1 := + Nat.ceil_lt_add_one hy_nonneg + have hpow_le : + Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) ≤ + Real.rpow (3 : ℝ) (y + 1) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hceil_lt.le + calc + Real.rpow (3 : ℝ) + ((Nat.ceil (Real.log x / Real.log 3) : ℕ) : ℝ) + = Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) := by simp [y] + _ ≤ Real.rpow (3 : ℝ) (y + 1) := hpow_le + _ = Real.rpow (3 : ℝ) y * Real.rpow (3 : ℝ) (1 : ℝ) := by + exact Real.rpow_add (by norm_num : (0 : ℝ) < 3) y 1 + _ = x * 3 := by + rw [rpow_three_log_div_log_eq hx_pos] + norm_num + _ = 3 * x := by ring + +theorem le_rpow_three_natCeil_log_div_log + {x : ℝ} (hx : 1 ≤ x) : + x ≤ + Real.rpow (3 : ℝ) + ((Nat.ceil (Real.log x / Real.log 3) : ℕ) : ℝ) := by + let y : ℝ := Real.log x / Real.log 3 + have hx_pos : 0 < x := lt_of_lt_of_le zero_lt_one hx + have hceil : y ≤ ((Nat.ceil y : ℕ) : ℝ) := Nat.le_ceil y + calc + x = Real.rpow (3 : ℝ) y := by + rw [rpow_three_log_div_log_eq hx_pos] + _ ≤ Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hceil + _ = + Real.rpow (3 : ℝ) + ((Nat.ceil (Real.log x / Real.log 3) : ℕ) : ℝ) := by simp [y] + +/-- Discrete bad-tail bounds imply the continuous `Γ_η` tail of the triadic +minimal scale. The factor `3` is the triadic rounding loss. -/ +theorem isBigOWith_quenchedMinimalScale_of_badTailEvent_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {N0 : ℕ} {Bad : ℕ → Set Ω} {B η : ℝ} + (hη_pos : 0 < η) (hB : 1 ≤ B) + (htail : + ∀ N : ℕ, N0 ≤ N → + μ.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - N0 : ℕ) : ℝ)) / B) ^ η))) : + IsBigOWith μ (gammaSigma η) (quenchedMinimalScale N0 Bad) + (3 * ((3 : ℝ) ^ N0) * B) := by + rw [IndependentSums.isBigOWith_gammaSigma_iff] + intro s hs + let x : ℝ := B * s + let j : ℕ := Nat.ceil (Real.log x / Real.log 3) + let N : ℕ := N0 + j + have hs_nonneg : 0 ≤ s := le_trans zero_le_one hs + have hB_pos : 0 < B := lt_of_lt_of_le zero_lt_one hB + have hx_one : 1 ≤ x := by + dsimp [x] + nlinarith + have hx_pos : 0 < x := lt_of_lt_of_le zero_lt_one hx_one + have hj_upper : + Real.rpow (3 : ℝ) (j : ℝ) ≤ 3 * x := by + simpa [j] using + rpow_three_natCeil_log_div_log_le_three_mul (x := x) hx_one + have hj_lower : + x ≤ Real.rpow (3 : ℝ) (j : ℝ) := by + simpa [j] using + le_rpow_three_natCeil_log_div_log (x := x) hx_one + have hN0N : N0 ≤ N := by + dsimp [N] + exact Nat.le_add_right N0 j + have hsubset : + upperTailEvent (quenchedMinimalScale N0 Bad) + ((3 * ((3 : ℝ) ^ N0) * B) * s) ⊆ + badTailEvent Bad N := by + intro ω hω + have hpowN_le : + (3 : ℝ) ^ N ≤ (3 * ((3 : ℝ) ^ N0) * B) * s := by + have hpow_add : + (3 : ℝ) ^ N = (3 : ℝ) ^ N0 * (3 : ℝ) ^ j := by + dsimp [N] + rw [pow_add] + have hpowj_eq : + (3 : ℝ) ^ j = Real.rpow (3 : ℝ) (j : ℝ) := by + exact (Real.rpow_natCast (3 : ℝ) j).symm + rw [hpow_add, hpowj_eq] + calc + (3 : ℝ) ^ N0 * Real.rpow (3 : ℝ) (j : ℝ) + ≤ (3 : ℝ) ^ N0 * (3 * x) := by + exact mul_le_mul_of_nonneg_left hj_upper (by positivity) + _ = (3 * ((3 : ℝ) ^ N0) * B) * s := by + dsimp [x] + ring + have hpowN_lt_idx : + (3 : ℝ) ^ N < (3 : ℝ) ^ quenchedMinimalScaleIndex N0 Bad ω := by + dsimp [upperTailEvent, quenchedMinimalScale] at hω + exact lt_of_le_of_lt hpowN_le hω + have hN_lt_idx : N < quenchedMinimalScaleIndex N0 Bad ω := + (pow_lt_pow_iff_right₀ (by norm_num : (1 : ℝ) < 3)).1 hpowN_lt_idx + exact mem_badTailEvent_of_lt_quenchedMinimalScaleIndex + (N0 := N0) (Bad := Bad) hN0N hN_lt_idx + have hmeasure : + μ.real + (upperTailEvent (quenchedMinimalScale N0 Bad) + ((3 * ((3 : ℝ) ^ N0) * B) * s)) ≤ + μ.real (badTailEvent Bad N) := + measureReal_mono (μ := μ) hsubset + have hN_sub : N - N0 = j := by + dsimp [N] + omega + have hratio_lower : s ≤ Real.rpow (3 : ℝ) (j : ℝ) / B := by + have hmul : s * B ≤ Real.rpow (3 : ℝ) (j : ℝ) := by + simpa [x, mul_comm, mul_left_comm, mul_assoc] using hj_lower + exact (le_div_iff₀ hB_pos).2 hmul + have hratio_nonneg : 0 ≤ Real.rpow (3 : ℝ) (j : ℝ) / B := + div_nonneg (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _) hB_pos.le + have hpow : + s ^ η ≤ (Real.rpow (3 : ℝ) (j : ℝ) / B) ^ η := + Real.rpow_le_rpow hs_nonneg hratio_lower hη_pos.le + calc + μ.real + (upperTailEvent (quenchedMinimalScale N0 Bad) + ((3 * ((3 : ℝ) ^ N0) * B) * s)) + ≤ μ.real (badTailEvent Bad N) := hmeasure + _ ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - N0 : ℕ) : ℝ)) / B) ^ η)) := + htail N hN0N + _ = + Real.exp (-( (Real.rpow (3 : ℝ) (j : ℝ) / B) ^ η)) := by + rw [hN_sub] + _ ≤ Real.exp (-(s ^ η)) := by + exact Real.exp_le_exp.mpr (by linarith) + +theorem isBigO_quenchedMinimalScale_of_badTailEvent_bound + {μ : Measure Ω} [IsFiniteMeasure μ] + {N0 : ℕ} {Bad : ℕ → Set Ω} {B η : ℝ} + (hη_pos : 0 < η) (hB : 1 ≤ B) + (htail : + ∀ N : ℕ, N0 ≤ N → + μ.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - N0 : ℕ) : ℝ)) / B) ^ η))) : + IsBigO μ (gammaSigma η) (quenchedMinimalScale N0 Bad) + (3 * ((3 : ℝ) ^ N0) * B) := by + have hwith := + isBigOWith_quenchedMinimalScale_of_badTailEvent_bound + (μ := μ) (N0 := N0) (Bad := Bad) (B := B) (η := η) + hη_pos hB htail + rw [IsBigO] + exact hwith.of_le fun ω => by + dsimp [quenchedMinimalScale] + rw [abs_of_nonneg] + positivity + +omit [MeasurableSpace Ω] in +theorem not_mem_bad_of_quenchedMinimalScaleIndex_le + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} + (hgood : hasGoodTailFrom N0 Bad ω) + {N K : ℕ} + (hidxN : quenchedMinimalScaleIndex N0 Bad ω ≤ N) (hNK : N ≤ K) : + ω ∉ Bad K := by + have hspec := quenchedMinimalScaleIndex_spec + (N0 := N0) (Bad := Bad) (ω := ω) hgood + exact hspec.2 K (hidxN.trans hNK) + +omit [MeasurableSpace Ω] in +theorem quenchedMinimalScaleIndex_le_of_scale_le_pow + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} {m : ℕ} + (hscale : quenchedMinimalScale N0 Bad ω ≤ (3 : ℝ) ^ m) : + quenchedMinimalScaleIndex N0 Bad ω ≤ m := by + dsimp [quenchedMinimalScale] at hscale + exact (pow_le_pow_iff_right₀ (by norm_num : (1 : ℝ) < 3)).1 hscale + +omit [MeasurableSpace Ω] in +theorem rpow_three_div_quenchedMinimalScale_eq_index + {N0 : ℕ} {Bad : ℕ → Set Ω} {ω : Ω} {m : ℕ} {α : ℝ} + (hscale : quenchedMinimalScale N0 Bad ω ≤ (3 : ℝ) ^ m) : + ((3 : ℝ) ^ m / quenchedMinimalScale N0 Bad ω) ^ (-α) = + (3 : ℝ) ^ + (-α * ((m - quenchedMinimalScaleIndex N0 Bad ω : ℕ) : ℝ)) := by + let L : ℕ := quenchedMinimalScaleIndex N0 Bad ω + have hLm : L ≤ m := by + simpa [L] using + quenchedMinimalScaleIndex_le_of_scale_le_pow + (N0 := N0) (Bad := Bad) (ω := ω) hscale + have hratio : + (3 : ℝ) ^ m / quenchedMinimalScale N0 Bad ω = + (3 : ℝ) ^ (m - L) := by + dsimp [quenchedMinimalScale, L] + rw [div_eq_mul_inv] + exact (pow_sub₀ (3 : ℝ) (by norm_num) hLm).symm + rw [hratio] + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + congr 1 + ring + +omit [MeasurableSpace Ω] in +theorem le_of_not_mem_badScaleEvent + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {N m n : ℕ} {ω : Ω} + (hnot : ω ∉ badScaleEvent H t α N) + (hnm : n < m) (hNm : N ≤ m) : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω ≤ + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ)) := by + exact le_of_not_gt fun hgt => hnot ⟨m, n, hnm, hNm, hgt⟩ + +omit [MeasurableSpace Ω] in +/-- Above the constructed scale, absence of the corresponding bad-scale event +gives the discounted estimate for the abstract observable `H`. -/ +theorem badScaleEvent_estimate_above_quenchedMinimalScale + {N0 : ℕ} {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {ω : Ω} + (hgood : hasGoodTailFrom N0 (badScaleEvent H t α) ω) + {m n : ℕ} + (hscale : + quenchedMinimalScale N0 (badScaleEvent H t α) ω ≤ (3 : ℝ) ^ m) + (hnm : n < m) : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω ≤ + ((3 : ℝ) ^ m / + quenchedMinimalScale N0 (badScaleEvent H t α) ω) ^ (-α) := by + let L : ℕ := + quenchedMinimalScaleIndex N0 (badScaleEvent H t α) ω + have hLm : L ≤ m := by + simpa [L] using + quenchedMinimalScaleIndex_le_of_scale_le_pow + (N0 := N0) (Bad := badScaleEvent H t α) (ω := ω) hscale + have hnot : ω ∉ badScaleEvent H t α L := by + exact not_mem_bad_of_quenchedMinimalScaleIndex_le + (N0 := N0) (Bad := badScaleEvent H t α) (ω := ω) + hgood (N := L) (K := L) le_rfl le_rfl + have hmain : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * H m n ω ≤ + (3 : ℝ) ^ (-α * ((m - L : ℕ) : ℝ)) := + le_of_not_mem_badScaleEvent + (H := H) (t := t) (α := α) (N := L) (m := m) (n := n) + hnot hnm hLm + simpa [L, rpow_three_div_quenchedMinimalScale_eq_index + (N0 := N0) (Bad := badScaleEvent H t α) (ω := ω) + (m := m) (α := α) hscale] using hmain + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/NormalizedResponseEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/NormalizedResponseEllipticity.lean new file mode 100644 index 0000000000..f3ea867272 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/NormalizedResponseEllipticity.lean @@ -0,0 +1,397 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UnitJTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationErrorControl +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Finite.SmallTail + +/-! # Normalized Response Ellipticity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped BigOperators MatrixOrder + +/-! +# Normalized response from coarse ellipticity + +This file supplies the deterministic estimate used to control negative-scale sampled +responses in the finite-`q` homogenization-error corollary. The estimate is +pointwise and contains no stochastic input. +-/ + +noncomputable section + +/-- The two scalar normalizers used in the normalized response are dual. -/ +theorem blockVecDot_scalarConstantNormalizers_eq_fullBlockVecNormSq + {d : ℕ} [NeZero d] {σ : ℝ} (hσ : 0 < σ) (e : FullBlockVec d) : + blockVecDot + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) σ)) e)) + (ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixSqrt (scalarMatrix (d := d) σ)) e)) = + Ch02.fullBlockVecNormSq e := by + rw [← dotProduct_toFullBlockVec] + rw [toFullBlockVec_ofFullBlockVec, toFullBlockVec_ofFullBlockVec] + rw [constantFullBlockMatrixInvSqrt_scalarMatrix_eq_scalarFullBlockInvSqrt hσ] + rw [constantFullBlockMatrixSqrt_scalarMatrix_eq_scalarFullBlockSqrt hσ] + unfold dotProduct Ch02.fullBlockVecNormSq + refine Finset.sum_congr rfl ?_ + intro α _hα + cases α with + | inl i => + simp [Matrix.mulVec, Ch04.scalarFullBlockInvSqrtDiag, + Section56.scalarFullBlockSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + | inr i => + simp [Matrix.mulVec, Ch04.scalarFullBlockInvSqrtDiag, + Section56.scalarFullBlockSqrtDiag] + field_simp [ne_of_gt (Real.sqrt_pos.2 hσ)] + +/-- One-cube normalized response is bounded by the scalar-weighted coarse +ellipticity of that cube. -/ +theorem normalizedBlockResponseMax_scalarMatrix_le_weightedCoarseEllipticity + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : Ch02.TriadicCoeffFamily d) + {σ : ℝ} (hσ : 0 < σ) : + Ch02.normalizedBlockResponseMax Q a (scalarMatrix (d := d) σ) ≤ + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (σ⁻¹ * Ch02.coarseBMatrixNorm Q a + + σ * Ch02.coarseSigmaStarInvMatrixNorm Q a) := by + classical + let A : BlockMat d := Ch02.coarseBlockMatrix (Ch02.cubeDomain Q) (a.coeffOn Q) + let W : ℝ := + σ⁻¹ * Ch02.coarseBMatrixNorm Q a + + σ * Ch02.coarseSigmaStarInvMatrixNorm Q a + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + have hB_nonneg : 0 ≤ Ch02.coarseBMatrixNorm Q a := + Ch02.coarseBMatrixNorm_nonneg Q a + have hS_nonneg : 0 ≤ Ch02.coarseSigmaStarInvMatrixNorm Q a := + Ch02.coarseSigmaStarInvMatrixNorm_nonneg Q a + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact add_nonneg + (mul_nonneg (inv_pos.mpr hσ).le hB_nonneg) + (mul_nonneg hσ.le hS_nonneg) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hSymm : IsSymmetricBlockMat A := by + dsimp [A] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain Q) (a.coeffOn Q) + have hPos : Ch02.BlockPosDef A := by + dsimp [A] + exact (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) + (a.coeffOn Q)).block_matrix_posDef + have hUL : + ∀ i j : Fin d, |A.upperLeft i j| ≤ Ch02.coarseBMatrixNorm Q a := by + intro i j + dsimp [A, Ch02.coarseBMatrixNorm] + simpa [Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + (Ch02.bCoarse (Ch02.cubeDomain Q) (a.coeffOn Q)) i j + have hLR : + ∀ i j : Fin d, + |A.lowerRight i j| ≤ Ch02.coarseSigmaStarInvMatrixNorm Q a := by + intro i j + dsimp [A, Ch02.coarseSigmaStarInvMatrixNorm] + simpa [Ch02.matrixNorm_eq_matrixOperatorNorm] using + Ch02.abs_entry_le_matrixOperatorNorm + (Ch02.sigmaStarInvCoarse (Ch02.cubeDomain Q) (a.coeffOn Q)) i j + unfold Ch02.normalizedBlockResponseMax + refine csSup_le + (Ch02.normalizedBlockResponseValueSet_nonempty Q a (scalarMatrix (d := d) σ)) ?_ + rintro y ⟨e, he, rfl⟩ + let D : FullBlockMat d := + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) σ σ) + let T : FullBlockMat d := + Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) σ σ) + let Pvec : BlockVec d := + ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixInvSqrt (scalarMatrix (d := d) σ)) e) + let Qvec : BlockVec d := + ofFullBlockVec + (Matrix.mulVec + (Ch02.constantFullBlockMatrixSqrt (scalarMatrix (d := d) σ)) e) + have he_dot : dotProduct e e ≤ 1 := by + have heq : dotProduct e e = Ch02.fullBlockVecNormSq e := by + simp [dotProduct, Ch02.fullBlockVecNormSq, pow_two] + rw [heq, he] + have hcoord : ∀ α : BlockCoord d, |e α| ≤ 1 := + abs_fullBlockVec_coord_le_one_of_dotProduct_le_one e he_dot + have hentryD : + ∀ α β : BlockCoord d, |(D * toFullBlockMat A * D) α β| ≤ W := by + intro α β + simpa [D, W] using + abs_invSqrtConj_toFullBlockMat_entry_le_weighted + (A := A) (L := σ) + (Λ := Ch02.coarseBMatrixNorm Q a) + (I := Ch02.coarseSigmaStarInvMatrixNorm Q a) + hSymm hPos hσ hB_nonneg hS_nonneg hUL hLR α β + have hentryT : + ∀ α β : BlockCoord d, + |(T * toFullBlockMat (blockReflect A) * T) α β| ≤ W := by + intro α β + simpa [T, W] using + abs_sqrtConj_reflect_toFullBlockMat_entry_le_weighted + (A := A) (L := σ) + (Λ := Ch02.coarseBMatrixNorm Q a) + (I := Ch02.coarseSigmaStarInvMatrixNorm Q a) + hSymm hPos hσ hB_nonneg hS_nonneg hUL hLR α β + have hquadD_abs : + |Ch04.fullBlockQuadraticCh04 (D * toFullBlockMat A * D) e| ≤ C * W := by + simpa [C] using + abs_fullBlockQuadraticCh04_le_card_sq_mul_of_entry_abs_le + (D * toFullBlockMat A * D) e hW_nonneg hentryD hcoord + have hquadT_abs : + |Ch04.fullBlockQuadraticCh04 (T * toFullBlockMat (blockReflect A) * T) e| + ≤ C * W := by + simpa [C] using + abs_fullBlockQuadraticCh04_le_card_sq_mul_of_entry_abs_le + (T * toFullBlockMat (blockReflect A) * T) e hW_nonneg hentryT hcoord + have hPquad : + blockVecDot Pvec (blockMatVecMul A Pvec) ≤ C * W := by + have hq := + fullBlockQuadraticCh04_diagonal_toFullBlockMat + (Ch04.scalarFullBlockInvSqrtDiag (d := d) σ σ) A e + have hEq : + blockVecDot Pvec (blockMatVecMul A Pvec) = + Ch04.fullBlockQuadraticCh04 (D * toFullBlockMat A * D) e := by + rw [← Ch04.fullBlockQuadraticCh04_toFullBlockMat A Pvec] + simpa [Pvec, D, + constantFullBlockMatrixInvSqrt_scalarMatrix_eq_scalarFullBlockInvSqrt hσ] + using hq + rw [hEq] + exact (le_abs_self _).trans hquadD_abs + have hQquad : + blockVecDot Qvec (blockMatVecMul (blockReflect A) Qvec) ≤ C * W := by + have hq := + fullBlockQuadraticCh04_diagonal_toFullBlockMat + (Section56.scalarFullBlockSqrtDiag (d := d) σ σ) (blockReflect A) e + have hEq : + blockVecDot Qvec (blockMatVecMul (blockReflect A) Qvec) = + Ch04.fullBlockQuadraticCh04 + (T * toFullBlockMat (blockReflect A) * T) e := by + rw [← Ch04.fullBlockQuadraticCh04_toFullBlockMat (blockReflect A) Qvec] + simpa [Qvec, T, + constantFullBlockMatrixSqrt_scalarMatrix_eq_scalarFullBlockSqrt hσ] + using hq + rw [hEq] + exact (le_abs_self _).trans hquadT_abs + have hpair_nonneg : 0 ≤ blockVecDot Pvec Qvec := by + have hpair := + blockVecDot_scalarConstantNormalizers_eq_fullBlockVecNormSq + (d := d) hσ e + rw [show blockVecDot Pvec Qvec = Ch02.fullBlockVecNormSq e by + simpa [Pvec, Qvec] using hpair] + rw [he] + norm_num + have hsplit := + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) (a.coeffOn Q)).doubled_response_splitting + Pvec Qvec + have hreflect := + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain Q) (a.coeffOn Q)).starred_inverse_formula + calc + Ch02.doubledResponseJ (Ch02.cubeDomain Q) (a.coeffOn Q) Pvec Qvec + = + (1 / 2 : ℝ) * blockVecDot Pvec (blockMatVecMul A Pvec) + + (1 / 2 : ℝ) * blockVecDot Qvec (blockMatVecMul (blockReflect A) Qvec) - + blockVecDot Pvec Qvec := by + rw [hsplit] + rw [hreflect] + _ ≤ C * W := by + nlinarith + +/-- Descendant-scale normalized response is bounded by the corresponding +weighted descendant ellipticity maxima. -/ +theorem maxDescendantNormalizedBlockResponseAtScale_scalarMatrix_le_weightedEllipticity + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ) ≤ + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (σ⁻¹ * Ch02.maxDescendantBMatrixNormAtScale Q k a + + σ * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k a) := by + classical + let W : ℝ := + σ⁻¹ * Ch02.maxDescendantBMatrixNormAtScale Q k a + + σ * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k a + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hD : (descendantsAtScale Q k).Nonempty := + descendantsAtScale_nonempty Q hk + unfold Ch02.maxDescendantNormalizedBlockResponseAtScale Ch02.finsetSupReal + have hne : + ((fun R => Ch02.normalizedBlockResponseMax R a (scalarMatrix (d := d) σ)) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases hD with ⟨R, hR⟩ + exact ⟨Ch02.normalizedBlockResponseMax R a (scalarMatrix (d := d) σ), + ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro y ⟨R, hR, rfl⟩ + have hRone := + normalizedBlockResponseMax_scalarMatrix_le_weightedCoarseEllipticity + R a hσ + have hB : + Ch02.coarseBMatrixNorm R a ≤ + Ch02.maxDescendantBMatrixNormAtScale Q k a := + Ch02.coarseBMatrixNorm_le_maxDescendantBMatrixNormAtScale_of_mem_descendantsAtScale + a hR + have hS : + Ch02.coarseSigmaStarInvMatrixNorm R a ≤ + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k a := + Ch02.coarseSigmaStarInvMatrixNorm_le_maxDescendantSigmaStarInvMatrixNormAtScale_of_mem_descendantsAtScale + a hR + have hweighted : + σ⁻¹ * Ch02.coarseBMatrixNorm R a + + σ * Ch02.coarseSigmaStarInvMatrixNorm R a ≤ W := by + dsimp [W] + exact add_le_add + (mul_le_mul_of_nonneg_left hB (inv_pos.mpr hσ).le) + (mul_le_mul_of_nonneg_left hS hσ.le) + exact hRone.trans (mul_le_mul_of_nonneg_left hweighted hC_nonneg) + +/-- Square-root scale-response form of +`maxDescendantNormalizedBlockResponseAtScale_scalarMatrix_le_weightedEllipticity`. -/ +theorem scaleResponseAtScale_scalarMatrix_le_sqrt_weightedEllipticity + {d : ℕ} [NeZero d] + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : Ch02.TriadicCoeffFamily d) {σ : ℝ} (hσ : 0 < σ) : + Ch02.scaleResponseAtScale Q k Ch02.MultiscaleExponent.infinity a + (scalarMatrix (d := d) σ) ≤ + Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (σ⁻¹ * Ch02.maxDescendantBMatrixNormAtScale Q k a + + σ * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k a)) := by + have hmax := + maxDescendantNormalizedBlockResponseAtScale_scalarMatrix_le_weightedEllipticity + Q hk a hσ + calc + Ch02.scaleResponseAtScale Q k Ch02.MultiscaleExponent.infinity a + (scalarMatrix (d := d) σ) + = + Real.sqrt + (Ch02.maxDescendantNormalizedBlockResponseAtScale Q k a + (scalarMatrix (d := d) σ)) := by + rw [Ch02.scaleResponseAtScale_infinity_eq] + simp [Real.sqrt_eq_rpow] + _ ≤ + Real.sqrt + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (σ⁻¹ * Ch02.maxDescendantBMatrixNormAtScale Q k a + + σ * Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q k a)) := + Real.sqrt_le_sqrt hmax + +/-- One negative-scale row of the scalar-normalized response is controlled by +the two Ch2 unit-ellipticity square-root rows. -/ +theorem weighted_scaleResponseAtScale_originCube_neg_nat_scalarMatrix_le_ellipticityRows + {d : ℕ} [NeZero d] + (m j : ℕ) {s σ : ℝ} (hs : 0 ≤ s) (hσ : 0 < σ) + (a : Ch02.TriadicCoeffFamily d) : + Ch02.geometricWeight s 1 (j + m) * + Ch02.scaleResponseAtScale (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + Real.sqrt ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + (Real.sqrt σ⁻¹ * + (Ch02.geometricWeight s 1 (j + m) * + Real.rpow + (Ch02.maxDescendantBMatrixNormAtScale + (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ)) + + Real.sqrt σ * + (Ch02.geometricWeight s 1 (j + m) * + Real.rpow + (Ch02.maxDescendantSigmaStarInvMatrixNormAtScale + (originCube d ((m : ℕ) : ℤ)) (-(j : ℤ)) a) + (1 / 2 : ℝ))) := by + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let B : ℝ := Ch02.maxDescendantBMatrixNormAtScale Q (-(j : ℤ)) a + let I : ℝ := Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (-(j : ℤ)) a + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let w : ℝ := Ch02.geometricWeight s 1 (j + m) + have hk : -(j : ℤ) ≤ Q.scale := by + dsimp [Q, originCube] + omega + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact Ch02.maxDescendantBMatrixNormAtScale_nonneg Q hk a + have hI_nonneg : 0 ≤ I := by + dsimp [I] + exact Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q hk a + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hw_nonneg : 0 ≤ w := by + dsimp [w] + simpa [Ch02.geometricWeight_eq_old] using + Homogenization.geometricWeight_nonneg + (s := s) (q := 1) (j + m) (by simpa using hs) + have hinv_nonneg : 0 ≤ σ⁻¹ := (inv_pos.mpr hσ).le + have hσ_nonneg : 0 ≤ σ := hσ.le + have htermB_nonneg : 0 ≤ σ⁻¹ * B := mul_nonneg hinv_nonneg hB_nonneg + have htermI_nonneg : 0 ≤ σ * I := mul_nonneg hσ_nonneg hI_nonneg + have hscale : + Ch02.scaleResponseAtScale Q (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) ≤ + Real.sqrt (C * (σ⁻¹ * B + σ * I)) := by + simpa [Q, B, I, C] using + scaleResponseAtScale_scalarMatrix_le_sqrt_weightedEllipticity + Q hk a hσ + have hsqrt_split : + Real.sqrt (C * (σ⁻¹ * B + σ * I)) ≤ + Real.sqrt C * + (Real.sqrt σ⁻¹ * Real.rpow B (1 / 2 : ℝ) + + Real.sqrt σ * Real.rpow I (1 / 2 : ℝ)) := by + calc + Real.sqrt (C * (σ⁻¹ * B + σ * I)) + = Real.sqrt C * Real.sqrt (σ⁻¹ * B + σ * I) := by + exact Real.sqrt_mul hC_nonneg _ + _ ≤ Real.sqrt C * + (Real.sqrt (σ⁻¹ * B) + Real.sqrt (σ * I)) := by + exact mul_le_mul_of_nonneg_left + (sqrt_add_le_add_sqrt_of_nonneg htermB_nonneg htermI_nonneg) + (Real.sqrt_nonneg C) + _ = + Real.sqrt C * + (Real.sqrt σ⁻¹ * Real.rpow B (1 / 2 : ℝ) + + Real.sqrt σ * Real.rpow I (1 / 2 : ℝ)) := by + rw [Real.sqrt_mul hinv_nonneg, Real.sqrt_mul hσ_nonneg] + simp [Real.sqrt_eq_rpow] + calc + w * Ch02.scaleResponseAtScale Q (-(j : ℤ)) + Ch02.MultiscaleExponent.infinity a (scalarMatrix (d := d) σ) + ≤ w * + (Real.sqrt C * + (Real.sqrt σ⁻¹ * Real.rpow B (1 / 2 : ℝ) + + Real.sqrt σ * Real.rpow I (1 / 2 : ℝ))) := by + exact mul_le_mul_of_nonneg_left (hscale.trans hsqrt_split) hw_nonneg + _ = + Real.sqrt C * + (Real.sqrt σ⁻¹ * + (w * Real.rpow B (1 / 2 : ℝ)) + + Real.sqrt σ * + (w * Real.rpow I (1 / 2 : ℝ))) := by + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeEnvelope.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeEnvelope.lean new file mode 100644 index 0000000000..bfea33a935 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeEnvelope.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax + +/-! # Probe Envelope -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped BigOperators ENNReal + +/-! +# Concrete finite-probe envelope + +This file packages the deterministic finite-basis envelope used by the +quenched bad-pair estimates. +-/ + +noncomputable section + +/-- Dimension-only finite-probe constant in the quenched envelope. -/ +noncomputable def quenchedProbeEnvelopeConst (d : ℕ) : ℝ := + 4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ) + +theorem quenchedProbeEnvelopeConst_nonneg (d : ℕ) : + 0 ≤ quenchedProbeEnvelopeConst d := by + unfold quenchedProbeEnvelopeConst + positivity + +theorem quenchedProbeEnvelopeConst_pos (d : ℕ) [NeZero d] : + 0 < quenchedProbeEnvelopeConst d := by + classical + unfold quenchedProbeEnvelopeConst + have hcoord : 0 < (Fintype.card (BlockCoord d) : ℝ) := by + exact_mod_cast + (Fintype.card_pos_iff.mpr (inferInstance : Nonempty (BlockCoord d))) + have hprobe : 0 < (Fintype.card (NormalizedProbeIndex d) : ℝ) := by + let α : BlockCoord d := Classical.choice (inferInstance : Nonempty (BlockCoord d)) + exact_mod_cast + (Fintype.card_pos_iff.mpr + (show Nonempty (NormalizedProbeIndex d) from + ⟨(α, α, NormalizedProbeKind.coord)⟩)) + positivity + +/-- The finite-probe envelope controlling all localized unit-vector responses. -/ +noncomputable def quenchedProbeEnvelope + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (m n : ℕ) : RegCoeffField d → ℝ := + fun a => + quenchedProbeEnvelopeConst d * + localizedNormalizedProbeJMax hP hStruct m n a + +theorem localizedLimitNormalizedJMax_le_quenchedProbeEnvelope_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) + (e : FullBlockVec d) (he : dotProduct e e ≤ 1) : + (localizedLimitNormalizedJMax hP hStruct m n e) ≤ᵐ[P] + quenchedProbeEnvelope hP hStruct m n := by + have hraw := + localizedLimitNormalizedJMax_le_normalizedProbeJMax_ae + hP hStruct hΓ hnm e he + filter_upwards [hraw] with a hraw_a + calc + localizedLimitNormalizedJMax hP hStruct m n e a + ≤ (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a := hraw_a + _ = quenchedProbeEnvelope hP hStruct m n a := by + simp [quenchedProbeEnvelope, quenchedProbeEnvelopeConst] + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeMax.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeMax.lean new file mode 100644 index 0000000000..df2d098d59 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ProbeMax.lean @@ -0,0 +1,583 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedFiniteBasis +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.BudgetAbsorption + +/-! # Probe Max -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open Section54.VarianceBoundGoodScale + +/-! +# Normalized finite-probe maxima + +The quenched minimal-scale theorem needs one random observable which controls +the localized response for every unit vector. The finite-basis reduction +allows this observable to be a finite maximum over normalized coordinate and +pair probes. +-/ + +noncomputable section + +inductive NormalizedProbeKind where + | coord + | plus + | minus + deriving DecidableEq + +instance : Fintype NormalizedProbeKind where + elems := {NormalizedProbeKind.coord, NormalizedProbeKind.plus, NormalizedProbeKind.minus} + complete := by intro x; cases x <;> decide + +@[simp] +theorem fintype_card_normalizedProbeKind : + Fintype.card NormalizedProbeKind = 3 := by + decide + +/-- The finite probe index set used to eliminate the continuum of unit +vectors. -/ +abbrev NormalizedProbeIndex (d : ℕ) := BlockCoord d × BlockCoord d × NormalizedProbeKind + +/-- Coordinate probes are already normalized; plus/minus probes are divided by +two. -/ +def normalizedProbeVec {d : ℕ} : NormalizedProbeIndex d → FullBlockVec d + | (α, _β, .coord) => fullBlockCoordinateProbe α + | (α, β, .plus) => (1 / 2 : ℝ) • fullBlockPlusProbe α β + | (α, β, .minus) => (1 / 2 : ℝ) • fullBlockMinusProbe α β + +private theorem dotProduct_smul_self + {d : ℕ} (c : ℝ) (q : FullBlockVec d) : + dotProduct (c • q) (c • q) = c ^ (2 : ℕ) * dotProduct q q := by + rw [smul_dotProduct, dotProduct_smul] + simp [smul_eq_mul, pow_two, mul_assoc] + +theorem normalizedProbeVec_dotProduct_self_le_one + {d : ℕ} (i : NormalizedProbeIndex d) : + dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := by + rcases i with ⟨α, β, kind⟩ + cases kind + · simp [normalizedProbeVec, dotProduct_coordinateProbe_self] + · calc + dotProduct (normalizedProbeVec (α, β, NormalizedProbeKind.plus)) + (normalizedProbeVec (α, β, NormalizedProbeKind.plus)) + = + (1 / 2 : ℝ) ^ (2 : ℕ) * + dotProduct (fullBlockPlusProbe α β) (fullBlockPlusProbe α β) := by + exact dotProduct_smul_self (1 / 2 : ℝ) (fullBlockPlusProbe α β) + _ ≤ 1 := by + nlinarith [dotProduct_plusProbe_self_le_four α β] + · calc + dotProduct (normalizedProbeVec (α, β, NormalizedProbeKind.minus)) + (normalizedProbeVec (α, β, NormalizedProbeKind.minus)) + = + (1 / 2 : ℝ) ^ (2 : ℕ) * + dotProduct (fullBlockMinusProbe α β) (fullBlockMinusProbe α β) := by + exact dotProduct_smul_self (1 / 2 : ℝ) (fullBlockMinusProbe α β) + _ ≤ 1 := by + nlinarith [dotProduct_minusProbe_self_le_four α β] + +theorem normalizedProbeVec_abs_apply_le_one + {d : ℕ} (i : NormalizedProbeIndex d) (α : BlockCoord d) : + |normalizedProbeVec i α| ≤ 1 := by + exact + abs_fullBlockVec_coord_le_one_of_dotProduct_le_one + (normalizedProbeVec i) (normalizedProbeVec_dotProduct_self_le_one i) α + +/-- Localized maximum over the normalized finite probe family. -/ +noncomputable def localizedNormalizedProbeJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (m n : ℕ) : RegCoeffField d → ℝ := + fun a => + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + classical + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) + +theorem localizedLimitNormalizedJNormalizedProbeSumMax_le_probeJMax + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} (hnm : n ≤ m) (a : RegCoeffField d) : + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a ≤ + (Fintype.card (NormalizedProbeIndex d) : ℝ) * + localizedNormalizedProbeJMax hP hStruct m n a := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + have hprobe_eq : + localizedNormalizedProbeJMax hP hStruct m n a = + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) := by + rfl + have hsum_le : + ∀ R ∈ D, + limitNormalizedJNormalizedProbeSum hP hStruct R a ≤ + (Fintype.card (NormalizedProbeIndex d) : ℝ) * + localizedNormalizedProbeJMax hP hStruct m n a := by + intro R hR + rw [hprobe_eq] + unfold limitNormalizedJNormalizedProbeSum + let M : ℝ := + S.sup' hS (fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a) + have hterm : + ∀ α β : BlockCoord d, + limitNormalizedBlockJObservable hP hStruct R + (fullBlockCoordinateProbe α) a + + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a + + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a ≤ + 3 * M := by + intro α β + have hcoord : + limitNormalizedBlockJObservable hP hStruct R + (fullBlockCoordinateProbe α) a ≤ M := by + exact + (limitNormalizedBlockJObservable_le_localizedLimitNormalizedJMax + hP hStruct (m := m) (n := n) + (fullBlockCoordinateProbe α) hR a).trans + (Finset.le_sup' (s := S) + (f := fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a) + (show (α, β, NormalizedProbeKind.coord) ∈ S by simp [S])) + have hplus : + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a ≤ M := by + exact + (limitNormalizedBlockJObservable_le_localizedLimitNormalizedJMax + hP hStruct (m := m) (n := n) + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) hR a).trans + (Finset.le_sup' (s := S) + (f := fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a) + (show (α, β, NormalizedProbeKind.plus) ∈ S by simp [S])) + have hminus : + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a ≤ M := by + exact + (limitNormalizedBlockJObservable_le_localizedLimitNormalizedJMax + hP hStruct (m := m) (n := n) + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) hR a).trans + (Finset.le_sup' (s := S) + (f := fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a) + (show (α, β, NormalizedProbeKind.minus) ∈ S by simp [S])) + linarith + calc + (∑ α : BlockCoord d, ∑ β : BlockCoord d, + (limitNormalizedBlockJObservable hP hStruct R + (fullBlockCoordinateProbe α) a + + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockPlusProbe α β) a + + limitNormalizedBlockJObservable hP hStruct R + ((1 / 2 : ℝ) • fullBlockMinusProbe α β) a)) + ≤ ∑ α : BlockCoord d, ∑ β : BlockCoord d, (3 * M) := by + exact Finset.sum_le_sum fun α _ => + Finset.sum_le_sum fun β _ => hterm α β + _ = (Fintype.card (NormalizedProbeIndex d) : ℝ) * M := by + simp [NormalizedProbeIndex, Fintype.card_prod] + ring_nf + have hmax_eq : + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a = + D.sup' hD (fun R => limitNormalizedJNormalizedProbeSum hP hStruct R a) := by + dsimp [localizedLimitNormalizedJNormalizedProbeSumMax] + simp [D, hD] + rw [hmax_eq] + exact Finset.sup'_le hD _ hsum_le + +theorem localizedLimitNormalizedJMax_le_normalizedProbeJMax_ae + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) + (e : FullBlockVec d) (he : dotProduct e e ≤ 1) : + (localizedLimitNormalizedJMax hP hStruct m n e) ≤ᵐ[P] + fun a : RegCoeffField d => + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a := by + have hfinite := + localizedLimitNormalizedJMax_le_normalizedProbeSumMax_ae + hP hStruct hΓ hnm e he + filter_upwards [hfinite] with a hfinite_a + have hsum := + localizedLimitNormalizedJNormalizedProbeSumMax_le_probeJMax + hP hStruct hnm a + calc + localizedLimitNormalizedJMax hP hStruct m n e a + ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + localizedLimitNormalizedJNormalizedProbeSumMax hP hStruct m n a := hfinite_a + _ ≤ (4 * (Fintype.card (BlockCoord d) : ℝ)) * + ((Fintype.card (NormalizedProbeIndex d) : ℝ) * + localizedNormalizedProbeJMax hP hStruct m n a) := by + exact mul_le_mul_of_nonneg_left hsum (by positivity) + _ = + (4 * (Fintype.card (BlockCoord d) : ℝ) * + (Fintype.card (NormalizedProbeIndex d) : ℝ)) * + localizedNormalizedProbeJMax hP hStruct m n a := by + ring + +theorem localizedNormalizedProbeJMax_sub_const_le_sup_sub + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + {m n : ℕ} (c : ℝ) (a : RegCoeffField d) : + let S : Finset (NormalizedProbeIndex d) := Finset.univ + ∀ hS : S.Nonempty, + localizedNormalizedProbeJMax hP hStruct m n a - c ≤ + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a - c) := by + intro S hS + dsimp [localizedNormalizedProbeJMax] + have hle : + S.sup' hS + (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) ≤ + c + + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a - c) := by + refine Finset.sup'_le hS _ ?_ + intro i hi + have hi_le : + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a - c ≤ + S.sup' hS (fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a - c) := + Finset.le_sup' (s := S) + (f := fun j => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec j) a - c) + hi + linarith + linarith + +private theorem normalizedProbeIndex_univ_card_two_le + {d : ℕ} [NeZero d] : + 2 ≤ (Finset.univ : Finset (NormalizedProbeIndex d)).card := by + classical + let α : BlockCoord d := Classical.choice inferInstance + let i₁ : NormalizedProbeIndex d := (α, α, NormalizedProbeKind.coord) + let i₂ : NormalizedProbeIndex d := (α, α, NormalizedProbeKind.plus) + have hne : i₁ ≠ i₂ := by + simp [i₁, i₂] + have hpair : ({i₁, i₂} : Finset (NormalizedProbeIndex d)).card = 2 := + Finset.card_pair hne + have hle : + ({i₁, i₂} : Finset (NormalizedProbeIndex d)).card ≤ + (Finset.univ : Finset (NormalizedProbeIndex d)).card := + Finset.card_le_card (by intro x hx; simp) + omega + +/-- Localized first-quenched estimate for the normalized finite-probe maximum. + +This is the fixed-vector localized estimate, applied to the finite normalized +probe family and combined by the Chapter 4 finite-maximum rule. -/ +theorem localizedFirstQuenchedEstimate_normalizedProbeJMax + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry α : ℝ, 0 < Cfluct ∧ 0 < Centry ∧ 0 < α ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {ℓ n m : ℕ}, ℓ < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + IsBigOWith P (gammaSigma (min σ 2)) + (fun a => + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) a - + Real.rpow (3 : ℝ) (-α * (ℓ : ℝ))) + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) := by + obtain ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, hloc⟩ := + localizedFirstQuenchedEstimate_limitNormalized (d := d) hσ_pos params + refine ⟨Cfluct, Centry, α, hCfluct, hCentry, hα, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams ℓ n m hℓn hnm + classical + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α0 : BlockCoord d := Classical.choice inferInstance + exact ⟨(α0, α0, NormalizedProbeKind.coord), by simp [S]⟩ + have hτ_pos : 0 < min σ 2 := + lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hS_card : 2 ≤ S.card := by + simpa [S] using normalizedProbeIndex_univ_card_two_le (d := d) + let r : ℝ := Real.rpow (3 : ℝ) (-α * (ℓ : ℝ)) + let A : ℝ := + ((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) + have htail : + ∀ i ∈ S, + IsBigOWith P (gammaSigma (min σ 2)) + (fun a => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) a - r) + A := by + intro i _hi + have hi_norm : dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := + normalizedProbeVec_dotProduct_self_le_one i + simpa [N0, D, r, A] using + hloc hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) hi_norm hℓn hnm + have hsup : + IsBigOWith P (gammaSigma (min σ 2)) + (fun a => + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) a - r)) + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * A) := by + exact Ch04.isBigOWith_gammaSigma_finset_sup' + (μ := P) (s := S) (hs := hS) + (X := fun i a => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) a - r) + (A := A) (σ := min σ 2) hτ_pos hS_card htail + refine hsup.of_le ?_ + intro a + simpa [N0, S, r] using + localizedNormalizedProbeJMax_sub_const_le_sup_sub + hP hStruct (m := N0 + m) (n := N0 + n) r a hS + +/-- Uniform-in-`σ` version of +`localizedFirstQuenchedEstimate_normalizedProbeJMax`. -/ +theorem localizedFirstQuenchedEstimate_normalizedProbeJMax_uniformAnnealedExponent + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {σ : ℝ}, 0 < σ → + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {ℓ n m : ℕ}, ℓ < n → n < m → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + IsBigOWith P (gammaSigma (min σ 2)) + (fun aω => + localizedNormalizedProbeJMax hP hStruct + (N0 + m) (N0 + n) aω - + Real.rpow (3 : ℝ) (-a * (ℓ : ℝ))) + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)))) := by + obtain ⟨Centry, a, hCentry, ha, hlocBase⟩ := + localizedFirstQuenchedEstimate_limitNormalized_uniformAnnealedExponent + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro σ hσ_pos + obtain ⟨Cfluct, hCfluct, hloc⟩ := hlocBase hσ_pos + refine ⟨Cfluct, hCfluct, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams ℓ n m hℓn hnm + classical + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α0 : BlockCoord d := Classical.choice inferInstance + exact ⟨(α0, α0, NormalizedProbeKind.coord), by simp [S]⟩ + have hτ_pos : 0 < min σ 2 := + lt_min hσ_pos (by norm_num : (0 : ℝ) < 2) + have hS_card : 2 ≤ S.card := by + simpa [S] using normalizedProbeIndex_univ_card_two_le (d := d) + let r : ℝ := Real.rpow (3 : ℝ) (-a * (ℓ : ℝ)) + let A : ℝ := + ((3 * Real.log (D.card : ℝ)) ^ (min σ 2)⁻¹) * + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + ((((N0 + n : ℕ) : ℤ) - + ((N0 + ℓ : ℕ) : ℤ))) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ)) + have htail : + ∀ i ∈ S, + IsBigOWith P (gammaSigma (min σ 2)) + (fun aω => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) aω - r) + A := by + intro i _hi + have hi_norm : dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := + normalizedProbeVec_dotProduct_self_le_one i + simpa [N0, D, r, A] using + hloc hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) hi_norm hℓn hnm + have hsup : + IsBigOWith P (gammaSigma (min σ 2)) + (fun aω => + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) aω - r)) + (((3 * Real.log (S.card : ℝ)) ^ (min σ 2)⁻¹) * A) := by + exact Ch04.isBigOWith_gammaSigma_finset_sup' + (μ := P) (s := S) (hs := hS) + (X := fun i aω => + localizedLimitNormalizedJMax hP hStruct (N0 + m) (N0 + n) + (normalizedProbeVec i) aω - r) + (A := A) (σ := min σ 2) hτ_pos hS_card htail + refine hsup.of_le ?_ + intro aω + simpa [N0, S, r] using + localizedNormalizedProbeJMax_sub_const_le_sup_sub + hP hStruct (m := N0 + m) (n := N0 + n) r aω hS + +/-- Crude Γσ estimate for the localized normalized finite-probe maximum. -/ +theorem isBigO_localizedNormalizedProbeJMax + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {m n : ℕ}, n < m → + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + IsBigO P (gammaSigma σ) + (localizedNormalizedProbeJMax hP hStruct m n) + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)))) := by + obtain ⟨C, hC_pos, hloc⟩ := + isBigO_localizedLimitNormalizedJMax (d := d) hσ_pos params + refine ⟨C, hC_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams m n hnm + classical + let : IsProbabilityMeasure P := hP.isProbability + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α0 : BlockCoord d := Classical.choice inferInstance + exact ⟨(α0, α0, NormalizedProbeKind.coord), by simp [S]⟩ + have hS_card : 2 ≤ S.card := by + simpa [S] using normalizedProbeIndex_univ_card_two_le (d := d) + have htail : + ∀ i ∈ S, + IsBigO P (gammaSigma σ) + (localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i)) + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) := by + intro i _hi + have hi_norm : dotProduct (normalizedProbeVec i) (normalizedProbeVec i) ≤ 1 := + normalizedProbeVec_dotProduct_self_le_one i + simpa [D] using + hloc hP hStruct hΓ hσ_eq hparams + (normalizedProbeVec i) hi_norm hnm + have hsup : + IsBigO P (gammaSigma σ) + (fun a => + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a)) + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + S.sup' hS + (fun _i => + ((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)))) := by + exact Ch04.isBigO_gammaSigma_finset_sup'_of_scales + (μ := P) (s := S) (hs := hS) + (X := fun i a => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a) + (a := fun _i => + ((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) + (σ := σ) hσ_pos hS_card htail + have hscale : + S.sup' hS + (fun _i => + ((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ))) = + ((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)) := by + simp + have hsup' : + IsBigO P (gammaSigma σ) + (fun a => + S.sup' hS (fun i => + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a)) + (((3 * Real.log (S.card : ℝ)) ^ σ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ σ⁻¹) * + (C * hΓ.thetaHat ^ (2 : ℕ)))) := by + simpa [hscale, mul_assoc] using hsup + simpa [localizedNormalizedProbeJMax, S, hS, D] using! hsup' + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedGammaEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedGammaEllipticity.lean new file mode 100644 index 0000000000..279e369a14 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedGammaEllipticity.lean @@ -0,0 +1,883 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Definitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.P4Integrability +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.BlockResponseConcentration + +/-! # Quenched Gamma Ellipticity -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped Matrix.Norms.Elementwise + +/-! +# Quenched Γσ coarse-grained ellipticity + +This file formalizes the strengthened unit-cube ellipticity assumption from +Section 5.7. The assumption is intentionally kept separate from `(P4)`: the +manuscript says this Γσ condition implies the moment hypothesis, so later files +must prove that implication rather than assume it. +-/ + +noncomputable section + +/-- The parameter-only part of the strengthened Section 5.7 `(P5)` input. + +Unlike the Chapter 5 `(P4)` parameter bundle, this record carries no moment +exponent `xi`: a finite `xi` can be chosen internally from the positivity of +`sUpper` and `sLower` whenever the older moment-based API is needed. -/ +structure GammaCoarseGrainedEllipticityParams (d : ℕ) : Type where + sUpper : ℝ + sLower : ℝ + two_le_dim : 2 ≤ d + sUpper_pos : 0 < sUpper + sUpper_lt_one : sUpper < 1 + sLower_pos : 0 < sLower + sLower_lt_one : sLower < 1 + sum_lt_one : sUpper + sLower < 1 + +namespace GammaCoarseGrainedEllipticityParams + +theorem sUpper_nonneg {d : ℕ} (params : GammaCoarseGrainedEllipticityParams d) : + 0 ≤ params.sUpper := + params.sUpper_pos.le + +theorem sLower_nonneg {d : ℕ} (params : GammaCoarseGrainedEllipticityParams d) : + 0 ≤ params.sLower := + params.sLower_pos.le + +theorem min_pos {d : ℕ} (params : GammaCoarseGrainedEllipticityParams d) : + 0 < min params.sUpper params.sLower := + lt_min params.sUpper_pos params.sLower_pos + +/-- Choose an internal finite moment exponent compatible with the older `(P4)` +parameter API. -/ +theorem exists_internal_xi {d : ℕ} + (params : GammaCoarseGrainedEllipticityParams d) : + ∃ ξ : ℕ, + (2 * d : ℝ) < (ξ : ℝ) ∧ + (d : ℝ) / (ξ : ℝ) < min params.sUpper params.sLower := by + let smin : ℝ := min params.sUpper params.sLower + have hsmin_pos : 0 < smin := by + simpa [smin] using params.min_pos + obtain ⟨ξ, hξ⟩ := + exists_nat_gt (max (2 * (d : ℝ)) ((d : ℝ) / smin + 1)) + refine ⟨ξ, ?_, ?_⟩ + · exact lt_of_le_of_lt (le_max_left _ _) hξ + · have hξ_gt_div_plus : + (d : ℝ) / smin + 1 < (ξ : ℝ) := + lt_of_le_of_lt (le_max_right _ _) hξ + have hξ_gt_div : (d : ℝ) / smin < (ξ : ℝ) := by + linarith + have hξ_pos : 0 < (ξ : ℝ) := by + have htwo_d_nonneg : (0 : ℝ) ≤ 2 * (d : ℝ) := by positivity + have htwo_d_lt : 2 * (d : ℝ) < (ξ : ℝ) := + lt_of_le_of_lt (le_max_left _ _) hξ + linarith + have hd_lt : (d : ℝ) < (ξ : ℝ) * smin := + (div_lt_iff₀ hsmin_pos).mp hξ_gt_div + have : (d : ℝ) < smin * (ξ : ℝ) := by + nlinarith + simpa [smin] using (div_lt_iff₀ hξ_pos).mpr this + +/-- Convert the Section 5.7 `(P5)` parameters to the older `(P4)` parameter +bundle by choosing an internal finite moment exponent. -/ +noncomputable def toQuantitativeParams {d : ℕ} + (params : GammaCoarseGrainedEllipticityParams d) : + QuantitativeCoarseGrainedEllipticityParams d where + sUpper := params.sUpper + sLower := params.sLower + xi := Classical.choose params.exists_internal_xi + two_le_dim := params.two_le_dim + sUpper_nonneg := params.sUpper_nonneg + sUpper_lt_one := params.sUpper_lt_one + sLower_nonneg := params.sLower_nonneg + sLower_lt_one := params.sLower_lt_one + xi_gt_two_mul_dim := (Classical.choose_spec params.exists_internal_xi).1 + sum_lt_one := params.sum_lt_one + dim_div_xi_lt_min := (Classical.choose_spec params.exists_internal_xi).2 + +@[simp] +theorem toQuantitativeParams_sUpper {d : ℕ} + (params : GammaCoarseGrainedEllipticityParams d) : + params.toQuantitativeParams.sUpper = params.sUpper := rfl + +@[simp] +theorem toQuantitativeParams_sLower {d : ℕ} + (params : GammaCoarseGrainedEllipticityParams d) : + params.toQuantitativeParams.sLower = params.sLower := rfl + +end GammaCoarseGrainedEllipticityParams + +/-- The unit-cube Γσ ellipticity observable from +`(a.cg.ellipticity.Gamma.sigma)`. + +In the manuscript notation this is +`barσ_0^{-1} Λ_{s_1,1}(□_0) + barσ_0 λ_{s_2,1}^{-1}(□_0)`. +-/ +noncomputable def gammaSigmaUnitEllipticityObservable + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (sUpper sLower : ℝ) : RegCoeffField d → ℝ := + if 0 < hP.barSigmaAtScale hStruct (0 : ℤ) then + fun a => + (hP.barSigmaAtScale hStruct (0 : ℤ))⁻¹ * + Ch04.LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) a + + hP.barSigmaAtScale hStruct (0 : ℤ) * + (Ch04.lambdaSqCoeffField (originCube d 0) sLower (.finite 1) a)⁻¹ + else + fun a => + Ch04.LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) a + + (Ch04.lambdaSqCoeffField (originCube d 0) sLower (.finite 1) a)⁻¹ + +/-- The strengthened quenched ellipticity assumption `(P5)` in Section 5.7. + +The constant `thetaHat` is the manuscript's `\hat Θ_0`. No probability law +appears in the choice of the exponents or constants beyond the tail statement +itself; later estimates should quantify their constants before the law. +-/ +structure GammaSigmaCoarseGrainedEllipticity + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : Type where + sigma : ℝ + sigma_pos : 0 < sigma + params : QuantitativeCoarseGrainedEllipticityParams d + thetaHat : ℝ + thetaHat_pos : 0 < thetaHat + tail : + IsBigO P (gammaSigma sigma) + (gammaSigmaUnitEllipticityObservable hP hStruct + params.sUpper params.sLower) + thetaHat + +/-- The manuscript-facing finite-`σ` Section 5.7 `(P5)` input, with no exposed +moment exponent `xi`. -/ +structure GammaSigmaCoarseGrainedEllipticityNoXi + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : Type where + sigma : ℝ + sigma_pos : 0 < sigma + params : GammaCoarseGrainedEllipticityParams d + thetaHat : ℝ + thetaHat_pos : 0 < thetaHat + tail : + IsBigO P (gammaSigma sigma) + (gammaSigmaUnitEllipticityObservable hP hStruct + params.sUpper params.sLower) + thetaHat + +namespace GammaSigmaCoarseGrainedEllipticityNoXi + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +/-- Add the internal finite moment exponent used by the existing Section 5.7 +proof infrastructure. -/ +noncomputable def withInternalXi + (hΓ : GammaSigmaCoarseGrainedEllipticityNoXi P hP hStruct) : + GammaSigmaCoarseGrainedEllipticity P hP hStruct where + sigma := hΓ.sigma + sigma_pos := hΓ.sigma_pos + params := hΓ.params.toQuantitativeParams + thetaHat := hΓ.thetaHat + thetaHat_pos := hΓ.thetaHat_pos + tail := by + simpa using hΓ.tail + +@[simp] +theorem withInternalXi_sigma + (hΓ : GammaSigmaCoarseGrainedEllipticityNoXi P hP hStruct) : + hΓ.withInternalXi.sigma = hΓ.sigma := rfl + +@[simp] +theorem withInternalXi_thetaHat + (hΓ : GammaSigmaCoarseGrainedEllipticityNoXi P hP hStruct) : + hΓ.withInternalXi.thetaHat = hΓ.thetaHat := rfl + +end GammaSigmaCoarseGrainedEllipticityNoXi + +namespace GammaSigmaCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +theorem sUpper_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 < hΓ.params.sUpper := + hΓ.params.sUpper_pos + +theorem sLower_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 < hΓ.params.sLower := + hΓ.params.sLower_pos + +theorem two_le_xi + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 2 ≤ hΓ.params.xi := + hΓ.params.two_le_xi + +theorem aemeasurable_unitEllipticityObservable + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + AEMeasurable + (gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower) P := by + have hUpper : + AEMeasurable + (fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a) P := by + simpa using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hΓ.sUpper_pos + have hLower : + AEMeasurable + (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹) P := by + simpa using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hΓ.sLower_pos + exact + if hbar : 0 < hP.barSigmaAtScale hStruct (0 : ℤ) then + by + simp [gammaSigmaUnitEllipticityObservable, hbar] + exact + (hUpper.const_mul (hP.barSigmaAtScale hStruct (0 : ℤ))⁻¹).add + (hLower.const_mul (hP.barSigmaAtScale hStruct (0 : ℤ))) + else + by + simp [gammaSigmaUnitEllipticityObservable, hbar] + exact hUpper.add hLower + +/-- The Γσ tail assumption gives finite moments of the normalized unit-cube +ellipticity observable itself. Splitting this into separate `Λ` and +`λ^{-1}` moments is the next deterministic normalization step. -/ +theorem integrable_abs_unitEllipticityObservable_rpow_xi + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + Integrable + (fun a : RegCoeffField d => + |gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a| ^ (hΓ.params.xi : ℝ)) P := by + let : IsProbabilityMeasure P := hP.isProbability + have hxi_one : 1 ≤ (hΓ.params.xi : ℝ) := by + exact_mod_cast + (le_trans (by norm_num : 1 ≤ 2) hΓ.two_le_xi) + exact + integrable_rpow_of_isBigOWith_gammaSigma + (μ := P) + (Y := fun a : RegCoeffField d => + |gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a|) + (K := hΓ.thetaHat) (σ := hΓ.sigma) (p := (hΓ.params.xi : ℝ)) + hΓ.sigma_pos hΓ.thetaHat_pos hxi_one + (fun a => abs_nonneg _) + (continuous_abs.measurable.comp_aemeasurable + hΓ.aemeasurable_unitEllipticityObservable) + hΓ.tail + +/-- The Γσ tail makes the unit-scale normalization well-formed: the scalar +`\bar σ_0` is strictly positive. + +The guarded definition of `gammaSigmaUnitEllipticityObservable` agrees with the +manuscript expression when this theorem is used. In the contradictory branch +`\bar σ_0 ≤ 0`, the guard asks for Γσ control of the unnormalized factor sum; +that gives the unit-scale factor integrability needed to recover +`\bar σ_0 > 0` from the Chapter 4 positivity theorem. -/ +theorem barSigmaAtScale_zero_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 < hP.barSigmaAtScale hStruct (0 : ℤ) := by + by_cases hbar : 0 < hP.barSigmaAtScale hStruct (0 : ℤ) + · exact hbar + · let : IsProbabilityMeasure P := hP.isProbability + let ξ : ℕ := hΓ.params.xi + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let I : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hX_abs_rpow_int : + Integrable (fun a : RegCoeffField d => |X a| ^ (ξ : ℝ)) P := by + simpa [X, ξ] using + hΓ.integrable_abs_unitEllipticityObservable_rpow_xi + have hX_abs_pow_int : + Integrable (fun a : RegCoeffField d => |X a| ^ ξ) P := by + refine hX_abs_rpow_int.congr ?_ + filter_upwards with a + rw [Real.rpow_natCast] + have hsum_abs_pow_int : + Integrable (fun a : RegCoeffField d => |L a + I a| ^ ξ) P := by + simpa [X, L, I, gammaSigmaUnitEllipticityObservable, hbar] using + hX_abs_pow_int + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hΓ.sUpper_pos + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hΓ.sLower_pos + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => by + dsimp [L] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => by + dsimp [I] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hsum_nonneg : ∀ a, 0 ≤ |L a + I a| := fun a => abs_nonneg _ + have hUpperDom : + (fun a : RegCoeffField d => |L a|) ≤ᵐ[P] + fun a => |L a + I a| := by + filter_upwards with a + rw [abs_of_nonneg (hL_nonneg a), + abs_of_nonneg (add_nonneg (hL_nonneg a) (hI_nonneg a))] + exact le_add_of_nonneg_right (hI_nonneg a) + have hLowerDom : + (fun a : RegCoeffField d => |I a|) ≤ᵐ[P] + fun a => |L a + I a| := by + filter_upwards with a + rw [abs_of_nonneg (hI_nonneg a), + abs_of_nonneg (add_nonneg (hL_nonneg a) (hI_nonneg a))] + exact le_add_of_nonneg_left (hL_nonneg a) + have hUpperAbsPowInt : + Integrable (fun a : RegCoeffField d => |L a| ^ ξ) P := + Ch04.RestrictionLawCarrier.integrable_abs_pow_of_ae_abs_le_nonneg hL_meas + (Filter.Eventually.of_forall hsum_nonneg) + hUpperDom hsum_abs_pow_int + have hLowerAbsPowInt : + Integrable (fun a : RegCoeffField d => |I a| ^ ξ) P := + Ch04.RestrictionLawCarrier.integrable_abs_pow_of_ae_abs_le_nonneg hI_meas + (Filter.Eventually.of_forall hsum_nonneg) + hLowerDom hsum_abs_pow_int + have hUpperPowInt : + Integrable (fun a : RegCoeffField d => L a ^ ξ) P := by + refine hUpperAbsPowInt.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hL_nonneg a)] + have hLowerPowInt : + Integrable (fun a : RegCoeffField d => I a ^ ξ) P := by + refine hLowerAbsPowInt.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hI_nonneg a)] + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (0 : ℤ))) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_factor_observables + (originCube d (0 : ℤ)) + hΓ.sUpper_pos hΓ.sLower_pos + (Nat.succ_le_of_lt hΓ.params.xi_pos) + (by simpa [L, ξ] using hUpperPowInt) + (by simpa [I, ξ] using hLowerPowInt) + exact + Ch04.RestrictionLawCarrier.barSigmaAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct hBlock + +theorem barSigmaAtScale_zero_nonneg + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 ≤ hP.barSigmaAtScale hStruct (0 : ℤ) := + hΓ.barSigmaAtScale_zero_pos.le + +/-- Conditional bridge from the Γσ unit-cube assumption to the old `(P4)` +moment hypothesis. + +The extra input is exactly the positivity of the normalizing scalar +`\bar σ_0`. Mathematically this is implicit in the displayed Γσ assumption; +Lean's inverse is total, so the positivity must be supplied or proved before +the two normalized summands can be split. -/ +def toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (hbar : 0 < hP.barSigmaAtScale hStruct (0 : ℤ)) : + QuantitativeCoarseGrainedEllipticity P := by + letI : IsProbabilityMeasure P := hP.isProbability + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + let ξ : ℕ := hΓ.params.xi + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let I : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hb : 0 < b := by simpa [b] using hbar + have hb_nonneg : 0 ≤ b := hb.le + have hb_inv_nonneg : 0 ≤ b⁻¹ := (inv_pos.mpr hb).le + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => by + dsimp [L] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => by + dsimp [I] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hX_abs_rpow_int : + Integrable (fun a : RegCoeffField d => |X a| ^ (ξ : ℝ)) P := by + simpa [X, ξ] using + hΓ.integrable_abs_unitEllipticityObservable_rpow_xi + have hX_abs_pow_int : + Integrable (fun a : RegCoeffField d => |X a| ^ ξ) P := by + refine hX_abs_rpow_int.congr ?_ + filter_upwards with a + rw [Real.rpow_natCast] + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hΓ.sUpper_pos + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hΓ.sLower_pos + have hUpperDom : + (fun a : RegCoeffField d => |L a|) ≤ᵐ[P] + fun a => b * |X a| := by + filter_upwards with a + have hterm : b⁻¹ * L a ≤ X a := by + simpa [X, gammaSigmaUnitEllipticityObservable, b, L, I, hb] using + (show b⁻¹ * L a ≤ b⁻¹ * L a + b * I a from + le_add_of_nonneg_right (mul_nonneg hb_nonneg (hI_nonneg a))) + have hmul : b * (b⁻¹ * L a) ≤ b * X a := + mul_le_mul_of_nonneg_left hterm hb_nonneg + have hleft : b * (b⁻¹ * L a) = L a := by + field_simp [hb.ne'] + have hLX : L a ≤ b * |X a| := by + calc + L a = b * (b⁻¹ * L a) := hleft.symm + _ ≤ b * X a := hmul + _ ≤ b * |X a| := mul_le_mul_of_nonneg_left (le_abs_self (X a)) hb_nonneg + simpa [abs_of_nonneg (hL_nonneg a)] using hLX + have hLowerDom : + (fun a : RegCoeffField d => |I a|) ≤ᵐ[P] + fun a => b⁻¹ * |X a| := by + filter_upwards with a + have hterm : b * I a ≤ X a := by + simpa [X, gammaSigmaUnitEllipticityObservable, b, L, I, hb] using + (show b * I a ≤ b⁻¹ * L a + b * I a from + le_add_of_nonneg_left (mul_nonneg hb_inv_nonneg (hL_nonneg a))) + have hmul : b⁻¹ * (b * I a) ≤ b⁻¹ * X a := + mul_le_mul_of_nonneg_left hterm hb_inv_nonneg + have hleft : b⁻¹ * (b * I a) = I a := by + field_simp [hb.ne'] + have hIX : I a ≤ b⁻¹ * |X a| := by + calc + I a = b⁻¹ * (b * I a) := hleft.symm + _ ≤ b⁻¹ * X a := hmul + _ ≤ b⁻¹ * |X a| := mul_le_mul_of_nonneg_left (le_abs_self (X a)) hb_inv_nonneg + simpa [abs_of_nonneg (hI_nonneg a)] using hIX + have hUpperY_pow_int : + Integrable (fun a : RegCoeffField d => (b * |X a|) ^ ξ) P := by + refine (hX_abs_pow_int.const_mul (b ^ ξ)).congr ?_ + filter_upwards with a + rw [mul_pow] + have hLowerY_pow_int : + Integrable (fun a : RegCoeffField d => (b⁻¹ * |X a|) ^ ξ) P := by + refine (hX_abs_pow_int.const_mul (b⁻¹ ^ ξ)).congr ?_ + filter_upwards with a + rw [mul_pow] + have hUpperAbsPowInt : + Integrable (fun a : RegCoeffField d => |L a| ^ ξ) P := + Ch04.RestrictionLawCarrier.integrable_abs_pow_of_ae_abs_le_nonneg hL_meas + (Filter.Eventually.of_forall fun a => + mul_nonneg hb_nonneg (abs_nonneg (X a))) + hUpperDom hUpperY_pow_int + have hLowerAbsPowInt : + Integrable (fun a : RegCoeffField d => |I a| ^ ξ) P := + Ch04.RestrictionLawCarrier.integrable_abs_pow_of_ae_abs_le_nonneg hI_meas + (Filter.Eventually.of_forall fun a => + mul_nonneg hb_inv_nonneg (abs_nonneg (X a))) + hLowerDom hLowerY_pow_int + have hUpperPowInt : + Integrable (fun a : RegCoeffField d => L a ^ ξ) P := by + refine hUpperAbsPowInt.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hL_nonneg a)] + have hLowerPowInt : + Integrable (fun a : RegCoeffField d => I a ^ ξ) P := by + refine hLowerAbsPowInt.congr ?_ + filter_upwards with a + simp [abs_of_nonneg (hI_nonneg a)] + exact + { sUpper := hΓ.params.sUpper + sLower := hΓ.params.sLower + xi := hΓ.params.xi + two_le_dim := hΓ.params.two_le_dim + sUpper_nonneg := hΓ.params.sUpper_nonneg + sUpper_lt_one := hΓ.params.sUpper_lt_one + sLower_nonneg := hΓ.params.sLower_nonneg + sLower_lt_one := hΓ.params.sLower_lt_one + xi_gt_two_mul_dim := hΓ.params.xi_gt_two_mul_dim + sum_lt_one := hΓ.params.sum_lt_one + dim_div_xi_lt_min := hΓ.params.dim_div_xi_lt_min + upper_moment_integrable := by + simpa [L, ξ] using hUpperPowInt + lower_inv_moment_integrable := by + simpa [I, ξ] using hLowerPowInt } + +/-- The Γσ unit-cube assumption implies the old `(P4)` moment hypothesis. -/ +def toQuantitativeCoarseGrainedEllipticity + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + QuantitativeCoarseGrainedEllipticity P := + hΓ.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos + hΓ.barSigmaAtScale_zero_pos + +theorem unitEllipticityObservable_nonneg + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (a : RegCoeffField d) : + 0 ≤ gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + have hbar := hΓ.barSigmaAtScale_zero_pos + simpa [gammaSigmaUnitEllipticityObservable, hbar] using add_nonneg + (mul_nonneg (inv_nonneg.mpr hΓ.barSigmaAtScale_zero_nonneg) + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1))) + (mul_nonneg hΓ.barSigmaAtScale_zero_nonneg + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)))) + +/-- The `L^ξ` root of the normalized unit-cube Γσ ellipticity observable. -/ +noncomputable def unitEllipticityMomentRoot + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : ℝ := + Ch04.annealedMomentRoot P hΓ.params.xi + (gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower) + +theorem unitEllipticityMomentRoot_nonneg + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + 0 ≤ hΓ.unitEllipticityMomentRoot := by + refine Ch04.annealedMomentRoot_nonneg_of_nonneg P hΓ.params.xi ?_ + exact hΓ.unitEllipticityObservable_nonneg + +theorem unitEllipticityMomentRoot_le_gammaMomentScale + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + hΓ.unitEllipticityMomentRoot ≤ + Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat := by + let : IsProbabilityMeasure P := hP.isProbability + let ξ : ℕ := hΓ.params.xi + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + let M : ℝ := Ch04.gammaMomentConst hΓ.sigma * + (ξ : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat + have hξ_one_nat : 1 ≤ ξ := by + simpa [ξ] using le_trans (by norm_num : 1 ≤ 2) hΓ.two_le_xi + have hξ_one : 1 ≤ (ξ : ℝ) := by exact_mod_cast hξ_one_nat + have hξ_ne : ξ ≠ 0 := by omega + have hExp_nonneg : 0 ≤ 1 / (ξ : ℝ) := by positivity + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + simpa [X] using hΓ.unitEllipticityObservable_nonneg a + have hX_meas : AEMeasurable X P := by + simpa [X] using hΓ.aemeasurable_unitEllipticityObservable + have hIntegral_nonneg : + 0 ≤ ∫ a, |X a| ^ (ξ : ℝ) ∂P := by + exact MeasureTheory.integral_nonneg fun a => + Real.rpow_nonneg (abs_nonneg (X a)) _ + have hMomentConst_pos : 0 < Ch04.gammaMomentConst hΓ.sigma := by + simpa [Ch04.gammaMomentConst] using + IndependentSums.gammaMomentConst_pos hΓ.sigma_pos + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (mul_nonneg hMomentConst_pos.le + (Real.rpow_nonneg (by exact_mod_cast Nat.zero_le ξ) _)) + hΓ.thetaHat_pos.le + have hmoment : + ∫ a, |X a| ^ (ξ : ℝ) ∂P ≤ M ^ (ξ : ℝ) := by + simpa [M, ξ] using + Ch04.integral_abs_rpow_le_of_isBigO_gammaSigma + (μ := P) (X := X) (K := hΓ.thetaHat) (σ := hΓ.sigma) + (p := (ξ : ℝ)) + hΓ.sigma_pos hΓ.thetaHat_pos hξ_one hX_meas hΓ.tail + calc + hΓ.unitEllipticityMomentRoot = + (∫ a, |X a| ^ (ξ : ℝ) ∂P) ^ (1 / (ξ : ℝ)) := by + dsimp [unitEllipticityMomentRoot, Ch04.annealedMomentRoot, X, ξ] + congr 1 + exact integral_congr_ae (by + filter_upwards with a + rw [abs_of_nonneg (hX_nonneg a), Real.rpow_natCast]) + _ ≤ (M ^ (ξ : ℝ)) ^ (1 / (ξ : ℝ)) := by + exact Real.rpow_le_rpow hIntegral_nonneg hmoment hExp_nonneg + _ = M := by + rw [Real.rpow_natCast, one_div] + exact Real.pow_rpow_inv_natCast hM_nonneg hξ_ne + _ = + Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat := by + simp [M, ξ] + +theorem LambdaMomentAtScale_zero_le_barSigma_mul_unitEllipticityMomentRoot + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + Ch04.LambdaMomentAtScale P (0 : ℤ) hΓ.params.sUpper hΓ.params.xi ≤ + hP.barSigmaAtScale hStruct (0 : ℤ) * hΓ.unitEllipticityMomentRoot := by + let ξ : ℕ := hΓ.params.xi + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + let L : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hξ_one : 1 ≤ ξ := by + simpa [ξ] using le_trans (by norm_num : 1 ≤ 2) hΓ.two_le_xi + have hb_pos : 0 < b := by simpa [b] using hΓ.barSigmaAtScale_zero_pos + have hb_ne : b ≠ 0 := hb_pos.ne' + have hb_nonneg : 0 ≤ b := by simpa [b] using hΓ.barSigmaAtScale_zero_nonneg + have hL_nonneg : ∀ a, 0 ≤ L a := fun a => by + dsimp [L] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hX_nonneg : ∀ a, 0 ≤ X a := fun a => by + simpa [X, gammaSigmaUnitEllipticityObservable, b, hb_pos] using add_nonneg + (mul_nonneg (inv_nonneg.mpr hb_nonneg) (hL_nonneg a)) + (mul_nonneg hb_nonneg + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)))) + have hL_meas : AEMeasurable L P := by + simpa [L] using + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d 0) hΓ.sUpper_pos + have hX_abs_int : Integrable (fun a : RegCoeffField d => |X a| ^ ξ) P := by + have h := hΓ.integrable_abs_unitEllipticityObservable_rpow_xi + refine h.congr ?_ + filter_upwards with a + simp [X, ξ, Real.rpow_natCast, gammaSigmaUnitEllipticityObservable, b, hb_pos] + have hdom : L ≤ᵐ[P] fun a => b * X a := by + filter_upwards with a + have hterm : b⁻¹ * L a ≤ X a := by + simpa [X, gammaSigmaUnitEllipticityObservable, b, L, hb_pos] using + (show b⁻¹ * L a ≤ + b⁻¹ * L a + + b * (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ from + le_add_of_nonneg_right + (mul_nonneg hb_nonneg + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1))))) + have hmul : b * (b⁻¹ * L a) ≤ b * X a := + mul_le_mul_of_nonneg_left hterm hb_nonneg + have hleft : b * (b⁻¹ * L a) = L a := by + field_simp [hb_ne] + calc + L a = b * (b⁻¹ * L a) := hleft.symm + _ ≤ b * X a := hmul + have hroot := + Section52.section52_annealedMomentRoot_le_const_mul_of_ae_le + (P := P) (ξ := ξ) (c := b) (X := L) (Y := X) + hξ_one hb_nonneg hL_nonneg hX_nonneg hL_meas hX_abs_int hdom + simpa [Ch04.LambdaMomentAtScale, unitEllipticityMomentRoot, L, X, b, ξ] + using hroot + +theorem lambdaInvMomentAtScale_zero_le_inv_barSigma_mul_unitEllipticityMomentRoot + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + Ch04.lambdaInvMomentAtScale P (0 : ℤ) hΓ.params.sLower hΓ.params.xi ≤ + (hP.barSigmaAtScale hStruct (0 : ℤ))⁻¹ * hΓ.unitEllipticityMomentRoot := by + let ξ : ℕ := hΓ.params.xi + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + let I : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hξ_one : 1 ≤ ξ := by + simpa [ξ] using le_trans (by norm_num : 1 ≤ 2) hΓ.two_le_xi + have hb_pos : 0 < b := by simpa [b] using hΓ.barSigmaAtScale_zero_pos + have hb_ne : b ≠ 0 := hb_pos.ne' + have hb_nonneg : 0 ≤ b := by simpa [b] using hΓ.barSigmaAtScale_zero_nonneg + have hb_inv_nonneg : 0 ≤ b⁻¹ := inv_nonneg.mpr hb_nonneg + have hI_nonneg : ∀ a, 0 ≤ I a := fun a => by + dsimp [I] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hX_nonneg : ∀ a, 0 ≤ X a := fun a => by + simpa [X, gammaSigmaUnitEllipticityObservable, b, I, hb_pos] using add_nonneg + (mul_nonneg hb_inv_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1))) + (mul_nonneg hb_nonneg (hI_nonneg a)) + have hI_meas : AEMeasurable I P := by + simpa [I] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d 0) hΓ.sLower_pos + have hX_abs_int : Integrable (fun a : RegCoeffField d => |X a| ^ ξ) P := by + have h := hΓ.integrable_abs_unitEllipticityObservable_rpow_xi + refine h.congr ?_ + filter_upwards with a + simp [X, ξ, Real.rpow_natCast, gammaSigmaUnitEllipticityObservable, b, hb_pos] + have hdom : I ≤ᵐ[P] fun a => b⁻¹ * X a := by + filter_upwards with a + have hterm : b * I a ≤ X a := by + simpa [X, gammaSigmaUnitEllipticityObservable, b, I, hb_pos] using + (show b * I a ≤ + b⁻¹ * + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + + b * I a from + le_add_of_nonneg_left + (mul_nonneg hb_inv_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1)))) + have hmul : b⁻¹ * (b * I a) ≤ b⁻¹ * X a := + mul_le_mul_of_nonneg_left hterm hb_inv_nonneg + have hleft : b⁻¹ * (b * I a) = I a := by + field_simp [hb_ne] + calc + I a = b⁻¹ * (b * I a) := hleft.symm + _ ≤ b⁻¹ * X a := hmul + have hroot := + Section52.section52_annealedMomentRoot_le_const_mul_of_ae_le + (P := P) (ξ := ξ) (c := b⁻¹) (X := I) (Y := X) + hξ_one hb_inv_nonneg hI_nonneg hX_nonneg hI_meas hX_abs_int hdom + simpa [Ch04.lambdaInvMomentAtScale, unitEllipticityMomentRoot, I, X, b, ξ] + using hroot + +/-- The unit-scale annealed scalar contrast is controlled linearly by the +Γσ moment root. -/ +theorem thetaAtScale_zero_le_unitEllipticityMomentRoot + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + thetaAtScale hP hStruct (0 : ℤ) ≤ hΓ.unitEllipticityMomentRoot := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + let R : ℝ := hΓ.unitEllipticityMomentRoot + have hb_pos : 0 < b := by simpa [b] using hΓ.barSigmaAtScale_zero_pos + have hb_ne : b ≠ 0 := hb_pos.ne' + have hb_nonneg : 0 ≤ b := hb_pos.le + have hLowerCompare : + (hP.barSigmaStarAtScale hStruct (0 : ℤ))⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P (0 : ℤ) hP4.sLower hP4.xi := by + exact + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hP4.sUpper_pos hP4.sLower_pos (Nat.succ_le_of_lt hP4.xi_pos) + (fun l => Section52.originBlockIntegrableAtScale_from_P4 hP hStruct hP4 l) + (fun l => + hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (l : ℤ)) hP4.sUpper_pos) + (fun l => + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (l : ℤ)) hP4.sLower_pos) + (fun l => Section52.upperFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l) + (fun l => Section52.lowerFactorPowerIntegrableAtScale_from_P4 hP hStruct hP4 l) + 0 + have hLowerRoot : + Ch04.lambdaInvMomentAtScale P (0 : ℤ) hP4.sLower hP4.xi ≤ b⁻¹ * R := by + simpa [hP4, b, R, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos] + using + hΓ.lambdaInvMomentAtScale_zero_le_inv_barSigma_mul_unitEllipticityMomentRoot + have hStarInv_le : (hP.barSigmaStarAtScale hStruct (0 : ℤ))⁻¹ ≤ b⁻¹ * R := + hLowerCompare.trans hLowerRoot + calc + thetaAtScale hP hStruct (0 : ℤ) = + b * (hP.barSigmaStarAtScale hStruct (0 : ℤ))⁻¹ := by + simp [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b] + _ ≤ b * (b⁻¹ * R) := + mul_le_mul_of_nonneg_left hStarInv_le hb_nonneg + _ = R := by + field_simp [hb_ne] + +/-- The unit-scale annealed scalar contrast is controlled by the deterministic +Γσ moment scale. -/ +theorem thetaAtScale_zero_le_gammaMomentScale + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + thetaAtScale hP hStruct (0 : ℤ) ≤ + Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat := + hΓ.thetaAtScale_zero_le_unitEllipticityMomentRoot.trans + hΓ.unitEllipticityMomentRoot_le_gammaMomentScale + +theorem widetildeThetaAtScale_zero_le_unitEllipticityMomentRoot_sq + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + widetildeThetaAtScale P (0 : ℤ) hΓ.toQuantitativeCoarseGrainedEllipticity ≤ + hΓ.unitEllipticityMomentRoot ^ 2 := by + let hP4 := hΓ.toQuantitativeCoarseGrainedEllipticity + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + let R : ℝ := hΓ.unitEllipticityMomentRoot + have hb_pos : 0 < b := by simpa [b] using hΓ.barSigmaAtScale_zero_pos + have hb_ne : b ≠ 0 := hb_pos.ne' + have hΛ : + Ch04.LambdaMomentAtScale P (0 : ℤ) hP4.sUpper hP4.xi ≤ b * R := by + simpa [hP4, b, R, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos] + using + hΓ.LambdaMomentAtScale_zero_le_barSigma_mul_unitEllipticityMomentRoot + have hI : + Ch04.lambdaInvMomentAtScale P (0 : ℤ) hP4.sLower hP4.xi ≤ b⁻¹ * R := by + simpa [hP4, b, R, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos] + using + hΓ.lambdaInvMomentAtScale_zero_le_inv_barSigma_mul_unitEllipticityMomentRoot + have hI_nonneg : + 0 ≤ Ch04.lambdaInvMomentAtScale P (0 : ℤ) hP4.sLower hP4.xi := by + simpa [hP4, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity, + GammaSigmaCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity_of_barSigmaAtScale_zero_pos] + using + Ch04.lambdaInvMomentAtScale_nonneg P (0 : ℤ) + (ξ := hΓ.params.xi) hΓ.sLower_pos + have hUpper_nonneg : 0 ≤ b * R := by + exact mul_nonneg hΓ.barSigmaAtScale_zero_nonneg hΓ.unitEllipticityMomentRoot_nonneg + calc + widetildeThetaAtScale P (0 : ℤ) hP4 = + Ch04.LambdaMomentAtScale P (0 : ℤ) hP4.sUpper hP4.xi * + Ch04.lambdaInvMomentAtScale P (0 : ℤ) hP4.sLower hP4.xi := by + rfl + _ ≤ (b * R) * (b⁻¹ * R) := by + exact mul_le_mul hΛ hI hI_nonneg hUpper_nonneg + _ = R ^ 2 := by + field_simp [hb_ne] + +/-- Quantitative ordering of the old unit-scale moment contrast by the Γσ +scale. This is the Lean form of the `\widetilde Θ_0` consequence; with the +current definitions the direct bound is quadratic in the Γσ scale. -/ +theorem widetildeThetaAtScale_zero_le_gammaMomentScale_sq + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) : + widetildeThetaAtScale P (0 : ℤ) hΓ.toQuantitativeCoarseGrainedEllipticity ≤ + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat) ^ 2 := by + have hroot := hΓ.unitEllipticityMomentRoot_le_gammaMomentScale + have hroot_nonneg := hΓ.unitEllipticityMomentRoot_nonneg + calc + widetildeThetaAtScale P (0 : ℤ) hΓ.toQuantitativeCoarseGrainedEllipticity ≤ + hΓ.unitEllipticityMomentRoot ^ 2 := + hΓ.widetildeThetaAtScale_zero_le_unitEllipticityMomentRoot_sq + _ ≤ + (Ch04.gammaMomentConst hΓ.sigma * + (hΓ.params.xi : ℝ) ^ hΓ.sigma⁻¹ * hΓ.thetaHat) ^ 2 := + pow_le_pow_left₀ hroot_nonneg hroot 2 + +end GammaSigmaCoarseGrainedEllipticity + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedLocalizedEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedLocalizedEstimate.lean new file mode 100644 index 0000000000..d804fdded7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/QuenchedLocalizedEstimate.lean @@ -0,0 +1,342 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.MinimalScaleTail + +/-! # Quenched Localized Estimate -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open Filter +open scoped ENNReal +open scoped Topology + +/-! +# Localized estimate above the quantitative minimal scale + +This file connects the abstract bad-tail minimal scale to the concrete +finite-probe envelope. The stochastic input is the almost-sure good-tail +event for the bad scales; the tail estimate for the same scale is supplied in +`MinimalScaleTail`. +-/ + +noncomputable section + +/-- Shifted localized quenched estimate above the tail-based minimal scale. -/ +theorem quenchedLocalizedEstimate_shifted_above_quenchedMinimalScale + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α : ℝ} {Nentry Nmin : ℕ} + (hgoodAE : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + ∀ᵐ aω ∂P, hasGoodTailFrom Nmin (badScaleEvent Hshift t α) aω) : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Nmin Bad + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + intro Hshift Bad X + refine ⟨?_, ?_⟩ + · intro aω + simpa [X] using one_le_quenchedMinimalScale Nmin Bad aω + · intro e he + have hgoodAE' : ∀ᵐ aω ∂P, hasGoodTailFrom Nmin Bad aω := by + simpa [Hshift, Bad] using hgoodAE + have hfinite : + ∀ᵐ aω ∂P, ∀ m n : ℕ, n ≤ m → + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + Hshift m n aω := by + rw [MeasureTheory.ae_all_iff] + intro m + rw [MeasureTheory.ae_all_iff] + intro n + by_cases hnm : n ≤ m + · have habs : Nentry + n ≤ Nentry + m := + Nat.add_le_add_left hnm Nentry + exact + (localizedLimitNormalizedJMax_le_quenchedProbeEnvelope_ae + hP hStruct hΓ habs e he).mono fun aω hle _ => by + simpa [Hshift, Nat.add_comm, Nat.add_left_comm, Nat.add_assoc] using hle + · exact Filter.Eventually.of_forall fun _ hnm' => False.elim (hnm hnm') + filter_upwards [hgoodAE', hfinite] with aω hgood hfinite_a + intro m n hscale hnm + have henv : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * Hshift m n aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + simpa [Bad, X] using + badScaleEvent_estimate_above_quenchedMinimalScale + (N0 := Nmin) (H := Hshift) (t := t) (α := α) + (ω := aω) hgood (m := m) (n := n) + (by simpa [Bad, X] using hscale) hnm + have hpoint : + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + Hshift m n aω := + hfinite_a m n (le_of_lt hnm) + exact (mul_le_mul_of_nonneg_left hpoint + (by positivity : 0 ≤ (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)))).trans henv + +/-- Tail-bound form of the shifted localized estimate. The two hypotheses on +`badTailEvent` are the exact quantitative inputs produced by the bad-scale +summation step: one gives the stochastic integrability of `X`, the other +removes the null exceptional set with no good tail. -/ +theorem quenchedLocalizedEstimate_shifted_from_badTailBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α η B : ℝ} {Nentry Nmin : ℕ} + (hη_pos : 0 < η) (hB : 1 ≤ B) + (hsmall : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Nmin ≤ N ∧ P.real (badTailEvent Bad N) ≤ ε) + (htail : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + ∀ N : ℕ, Nmin ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Nmin : ℕ) : ℝ)) / B) ^ η))) : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Nmin Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Nmin) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + intro Hshift Bad X + let : IsProbabilityMeasure P := hP.isProbability + have hgoodAE : ∀ᵐ aω ∂P, hasGoodTailFrom Nmin Bad aω := by + exact ae_hasGoodTailFrom + (μ := P) (N0 := Nmin) (Bad := Bad) (by simpa [Hshift, Bad] using hsmall) + have hlocalized := + quenchedLocalizedEstimate_shifted_above_quenchedMinimalScale + hP hStruct hΓ (t := t) (α := α) + (Nentry := Nentry) (Nmin := Nmin) + (by simpa [Hshift, Bad] using hgoodAE) + have htailX : + IsBigO P (gammaSigma η) X (3 * ((3 : ℝ) ^ Nmin) * B) := by + simpa [X] using + isBigO_quenchedMinimalScale_of_badTailEvent_bound + (μ := P) (N0 := Nmin) (Bad := Bad) (B := B) (η := η) + hη_pos hB (by simpa [Hshift, Bad] using htail) + exact ⟨htailX, by simpa [Hshift, Bad, X] using hlocalized⟩ + +/-- Version of `quenchedLocalizedEstimate_shifted_from_badTailBounds` whose +quantitative input is stated directly for the manuscript bad-scale events. +Since `badScaleEvent H t α` is antitone in the bad scale for `0 ≤ α`, the +tail event over all later bad scales is contained in the bad-scale event at +the first level. -/ +theorem quenchedLocalizedEstimate_shifted_from_badScaleBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α η B : ℝ} {Nentry Nmin : ℕ} + (hα_nonneg : 0 ≤ α) (hη_pos : 0 < η) (hB : 1 ≤ B) + (hsmall : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Nmin ≤ N ∧ P.real (Bad N) ≤ ε) + (htail : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + ∀ N : ℕ, Nmin ≤ N → + P.real (Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Nmin : ℕ) : ℝ)) / B) ^ η))) : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Nmin Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Nmin) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + intro Hshift Bad X + let : IsProbabilityMeasure P := hP.isProbability + have hsmall_tail : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Nmin ≤ N ∧ P.real (badTailEvent Bad N) ≤ ε := by + intro ε hε + obtain ⟨N, hNmin, hN⟩ := by + simpa [Hshift, Bad] using hsmall ε hε + refine ⟨N, hNmin, ?_⟩ + have hmono : + P.real (badTailEvent Bad N) ≤ P.real (Bad N) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := α) hα_nonneg) + exact hmono.trans hN + have htail_tail : + ∀ N : ℕ, Nmin ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Nmin : ℕ) : ℝ)) / B) ^ η)) := by + intro N hNmin + have hmono : + P.real (badTailEvent Bad N) ≤ P.real (Bad N) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := α) hα_nonneg) + exact hmono.trans (by simpa [Hshift, Bad] using htail N hNmin) + simpa [Hshift, Bad, X] using + quenchedLocalizedEstimate_shifted_from_badTailBounds + hP hStruct hΓ (t := t) (α := α) (η := η) (B := B) + (Nentry := Nentry) (Nmin := Nmin) + hη_pos hB hsmall_tail htail_tail + +theorem exists_exp_neg_rpow_three_div_le + {B η ε : ℝ} (hB : 0 < B) (hη : 0 < η) (hε : 0 < ε) : + ∃ j : ℕ, + Real.exp (-(((Real.rpow (3 : ℝ) (j : ℝ)) / B) ^ η)) ≤ ε := by + have hpow : + Tendsto (fun j : ℕ => Real.rpow (3 : ℝ) (j : ℝ)) atTop atTop := by + simpa [Real.rpow_natCast] using + (tendsto_pow_atTop_atTop_of_one_lt (by norm_num : (1 : ℝ) < 3) : + Tendsto (fun j : ℕ => (3 : ℝ) ^ j) atTop atTop) + have hdiv : + Tendsto (fun j : ℕ => Real.rpow (3 : ℝ) (j : ℝ) / B) atTop atTop := + hpow.atTop_div_const hB + have hrpow : + Tendsto + (fun j : ℕ => (Real.rpow (3 : ℝ) (j : ℝ) / B) ^ η) + atTop atTop := + (tendsto_rpow_atTop hη).comp hdiv + have hneg : + Tendsto + (fun j : ℕ => -((Real.rpow (3 : ℝ) (j : ℝ) / B) ^ η)) + atTop atBot := + tendsto_neg_atTop_atBot.comp hrpow + have hexp : + Tendsto + (fun j : ℕ => + Real.exp (-(((Real.rpow (3 : ℝ) (j : ℝ)) / B) ^ η))) + atTop (𝓝 0) := + Real.tendsto_exp_atBot.comp hneg + have hevent : + ∀ᶠ j : ℕ in atTop, + Real.exp (-(((Real.rpow (3 : ℝ) (j : ℝ)) / B) ^ η)) ≤ ε := + hexp.eventually (Iic_mem_nhds hε) + exact hevent.exists + +/-- Tail-bound-only version of +`quenchedLocalizedEstimate_shifted_from_badTailBounds`. The epsilon-smallness +input needed to remove the exceptional no-good-tail set follows from the same +stretched-exponential tail bound. -/ +theorem quenchedLocalizedEstimate_shifted_from_badTailBound + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + {t α η B : ℝ} {Nentry Nmin : ℕ} + (hη_pos : 0 < η) (hB : 1 ≤ B) + (htail : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + ∀ N : ℕ, Nmin ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Nmin : ℕ) : ℝ)) / B) ^ η))) : + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (Nentry + M) (Nentry + N) aω + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Nmin Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Nmin) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (Nentry + m) (Nentry + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + intro Hshift Bad X + have hB_pos : 0 < B := lt_of_lt_of_le zero_lt_one hB + have hsmall : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Nmin ≤ N ∧ P.real (badTailEvent Bad N) ≤ ε := by + intro ε hε + obtain ⟨j, hj⟩ := + exists_exp_neg_rpow_three_div_le + (B := B) (η := η) (ε := ε) hB_pos hη_pos hε + refine ⟨Nmin + j, Nat.le_add_right Nmin j, ?_⟩ + have htail_j : + P.real (badTailEvent Bad (Nmin + j)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) (((Nmin + j) - Nmin : ℕ) : ℝ)) / B) ^ η)) := by + simpa [Hshift, Bad] using + htail (Nmin + j) (Nat.le_add_right Nmin j) + exact htail_j.trans (by simpa [Nat.add_sub_cancel_left] using hj) + simpa [Hshift, Bad, X] using + quenchedLocalizedEstimate_shifted_from_badTailBounds + hP hStruct hΓ (t := t) (α := α) (η := η) (B := B) + (Nentry := Nentry) (Nmin := Nmin) + hη_pos hB (by simpa [Hshift, Bad] using hsmall) + (by simpa [Hshift, Bad] using htail) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompression.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompression.lean new file mode 100644 index 0000000000..320fa1c145 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompression.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.EntryScale + +/-! # Scale Compression -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Deterministic scale compression + +This file contains scalar estimates used to compress the explicit quantitative +minimal-scale threshold to the manuscript `exp(C log^2(2 + thetaHat))` form. +-/ + +noncomputable section + +open Section51 + +theorem log_max_one_le_log_two_add {θ : ℝ} (hθ : 0 ≤ θ) : + Real.log (max 1 θ) ≤ Real.log (2 + θ) := by + have hmax_pos : 0 < max 1 θ := lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + have hle : max 1 θ ≤ 2 + θ := by + exact max_le (by linarith) (by linarith) + exact Real.log_le_log hmax_pos hle + +theorem log_two_add_sq_ge_quarter {θ : ℝ} (hθ : 0 ≤ θ) : + (1 / 4 : ℝ) ≤ (Real.log (2 + θ)) ^ (2 : ℕ) := by + have hhalf : (1 / 2 : ℝ) ≤ Real.log (2 + θ) := + Section51.log_two_add_ge_half hθ + nlinarith [sq_nonneg (Real.log (2 + θ) - 1 / 2)] + +theorem log_two_add_le_two_mul_sq {θ : ℝ} (hθ : 0 ≤ θ) : + Real.log (2 + θ) ≤ 2 * (Real.log (2 + θ)) ^ (2 : ℕ) := by + let L : ℝ := Real.log (2 + θ) + have hhalf : (1 / 2 : ℝ) ≤ L := by + simpa [L] using Section51.log_two_add_ge_half hθ + have hnonneg : 0 ≤ L := by linarith + nlinarith [sq_nonneg (L - 1 / 2)] + +theorem rpow_max_one_le_exp_logSq {θ p : ℝ} + (hθ : 0 ≤ θ) (hp : 0 ≤ p) : + (max 1 θ) ^ p ≤ + Real.exp ((2 * p) * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + have hmax_pos : 0 < max 1 θ := lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + have hlogmax_nonneg : 0 ≤ Real.log (max 1 θ) := + Real.log_nonneg (le_max_left 1 θ) + have hlog_le_sq : + p * Real.log (max 1 θ) ≤ + (2 * p) * (Real.log (2 + θ)) ^ (2 : ℕ) := by + have hlog_le : Real.log (max 1 θ) ≤ Real.log (2 + θ) := + log_max_one_le_log_two_add hθ + have hL_le : Real.log (2 + θ) ≤ + 2 * (Real.log (2 + θ)) ^ (2 : ℕ) := + log_two_add_le_two_mul_sq hθ + calc + p * Real.log (max 1 θ) ≤ p * Real.log (2 + θ) := + mul_le_mul_of_nonneg_left hlog_le hp + _ ≤ p * (2 * (Real.log (2 + θ)) ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hL_le hp + _ = (2 * p) * (Real.log (2 + θ)) ^ (2 : ℕ) := by ring + calc + (max 1 θ) ^ p = + Real.exp (Real.log (max 1 θ) * p) := by + simpa [mul_comm] using + (Real.rpow_def_of_pos (x := max 1 θ) (y := p) hmax_pos) + _ = Real.exp (p * Real.log (max 1 θ)) := by rw [mul_comm] + _ ≤ Real.exp ((2 * p) * (Real.log (2 + θ)) ^ (2 : ℕ)) := + Real.exp_le_exp.mpr hlog_le_sq + +theorem const_mul_rpow_max_one_le_exp_logSq {A θ p : ℝ} + (hA : 0 < A) (hθ : 0 ≤ θ) (hp : 0 ≤ p) : + A * (max 1 θ) ^ p ≤ + Real.exp + ((4 * max 0 (Real.log A) + 2 * p) * + (Real.log (2 + θ)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hlogA_le : + Real.log A ≤ 4 * max 0 (Real.log A) * L2 := by + have hlogA_le_max : Real.log A ≤ max 0 (Real.log A) := + le_max_right 0 (Real.log A) + have hmax_nonneg : 0 ≤ max 0 (Real.log A) := le_max_left 0 (Real.log A) + have hquarter : (1 / 4 : ℝ) ≤ L2 := by + simpa [L2] using log_two_add_sq_ge_quarter hθ + have hscale : max 0 (Real.log A) ≤ + 4 * max 0 (Real.log A) * L2 := by + nlinarith [mul_le_mul_of_nonneg_left hquarter hmax_nonneg] + exact hlogA_le_max.trans hscale + have hrpow := + rpow_max_one_le_exp_logSq (θ := θ) (p := p) hθ hp + calc + A * (max 1 θ) ^ p + ≤ A * Real.exp ((2 * p) * L2) := + mul_le_mul_of_nonneg_left (by simpa [L2] using hrpow) hA.le + _ = Real.exp (Real.log A + (2 * p) * L2) := by + rw [Real.exp_add, Real.exp_log hA] + _ ≤ Real.exp ((4 * max 0 (Real.log A) + 2 * p) * L2) := by + refine Real.exp_le_exp.mpr ?_ + nlinarith + +theorem max_one_mul_sq_le_const_mul_max_one_sq {A θ : ℝ} + (hθ : 0 ≤ θ) : + max 1 (A * θ ^ (2 : ℕ)) ≤ + max 1 A * (max 1 θ) ^ (2 : ℕ) := by + have hmaxA_one : 1 ≤ max 1 A := le_max_left 1 A + have hmaxθ_one : 1 ≤ max 1 θ := le_max_left 1 θ + have hmaxθ_sq_one : 1 ≤ (max 1 θ) ^ (2 : ℕ) := by nlinarith + refine max_le ?_ ?_ + · have hprod_nonneg : + 0 ≤ max 1 A * (max 1 θ) ^ (2 : ℕ) := by positivity + nlinarith + · have hA_le : A ≤ max 1 A := le_max_right 1 A + have hθ_le : θ ≤ max 1 θ := le_max_right 1 θ + have hθ_sq_le : θ ^ (2 : ℕ) ≤ (max 1 θ) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hθ hθ_le 2 + exact mul_le_mul hA_le hθ_sq_le (sq_nonneg θ) (le_trans (by norm_num) hmaxA_one) + +theorem rpow_max_one_mul_sq_le_const_mul_rpow {A θ r : ℝ} + (hθ : 0 ≤ θ) (hr : 0 ≤ r) : + (max 1 (A * θ ^ (2 : ℕ))) ^ r ≤ + (max 1 A) ^ r * (max 1 θ) ^ (2 * r) := by + have hleft_nonneg : 0 ≤ max 1 (A * θ ^ (2 : ℕ)) := + le_trans zero_le_one (le_max_left 1 _) + have hmaxA_pos : 0 < max 1 A := + lt_of_lt_of_le zero_lt_one (le_max_left 1 A) + have hmaxθ_pos : 0 < max 1 θ := + lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + have hprod_nonneg : + 0 ≤ max 1 A * (max 1 θ) ^ (2 : ℕ) := by positivity + have hbase_le : + max 1 (A * θ ^ (2 : ℕ)) ≤ + max 1 A * (max 1 θ) ^ (2 : ℕ) := + max_one_mul_sq_le_const_mul_max_one_sq hθ + calc + (max 1 (A * θ ^ (2 : ℕ))) ^ r + ≤ (max 1 A * (max 1 θ) ^ (2 : ℕ)) ^ r := + Real.rpow_le_rpow hleft_nonneg hbase_le hr + _ = (max 1 A) ^ r * ((max 1 θ) ^ (2 : ℕ)) ^ r := by + rw [Real.mul_rpow hmaxA_pos.le (sq_nonneg (max 1 θ))] + _ = (max 1 A) ^ r * (max 1 θ) ^ (2 * r) := by + rw [← Real.rpow_natCast (max 1 θ) 2] + rw [← Real.rpow_mul hmaxθ_pos.le] + ring_nf + +theorem rpow_max_one_le_rpow_max_one_of_exponent_le {θ p q : ℝ} + (hpq : p ≤ q) : + (max 1 θ) ^ p ≤ (max 1 θ) ^ q := by + exact Real.rpow_le_rpow_of_exponent_le (le_max_left 1 θ) hpq + +theorem mixedBottomTailDenominator_mul_sq_le_const_mul_rpow + {A B θ η τ σ : ℝ} + (hθ : 0 ≤ θ) (hη : 0 < η) (hτ : 0 ≤ τ) (hσ : 0 ≤ σ) : + let rτ : ℝ := τ / η + let rσ : ℝ := σ / η + let C : ℝ := max ((max 1 A) ^ rτ) ((max 1 B) ^ rσ) + mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ ≤ + C * (max 1 θ) ^ (2 * max rτ rσ) := by + intro rτ rσ C + have hrτ_nonneg : 0 ≤ rτ := by dsimp [rτ]; positivity + have hrσ_nonneg : 0 ≤ rσ := by dsimp [rσ]; positivity + have hmaxθ_pos : 0 < max 1 θ := + lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + have hxτ_nonneg : 0 ≤ (max 1 θ) ^ (2 * rτ) := + (Real.rpow_pos_of_pos hmaxθ_pos _).le + have hxσ_nonneg : 0 ≤ (max 1 θ) ^ (2 * rσ) := + (Real.rpow_pos_of_pos hmaxθ_pos _).le + have hCτ_nonneg : 0 ≤ (max 1 A) ^ rτ := + (Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 A)) _).le + have hCσ_nonneg : 0 ≤ (max 1 B) ^ rσ := + (Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 B)) _).le + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact le_trans hCτ_nonneg (le_max_left _ _) + have hxmax_nonneg : 0 ≤ (max 1 θ) ^ (2 * max rτ rσ) := + (Real.rpow_pos_of_pos hmaxθ_pos _).le + have hCτ_le_C : (max 1 A) ^ rτ ≤ C := by + dsimp [C] + exact le_max_left _ _ + have hCσ_le_C : (max 1 B) ^ rσ ≤ C := by + dsimp [C] + exact le_max_right _ _ + have hpowτ : + (max 1 (A * θ ^ (2 : ℕ))) ^ rτ ≤ + C * (max 1 θ) ^ (2 * max rτ rσ) := by + have hterm := + rpow_max_one_mul_sq_le_const_mul_rpow + (A := A) (θ := θ) (r := rτ) hθ hrτ_nonneg + have hpow_mono : + (max 1 θ) ^ (2 * rτ) ≤ + (max 1 θ) ^ (2 * max rτ rσ) := by + refine rpow_max_one_le_rpow_max_one_of_exponent_le ?_ + nlinarith [le_max_left rτ rσ] + calc + (max 1 (A * θ ^ (2 : ℕ))) ^ rτ + ≤ (max 1 A) ^ rτ * (max 1 θ) ^ (2 * rτ) := hterm + _ ≤ (max 1 A) ^ rτ * (max 1 θ) ^ (2 * max rτ rσ) := + mul_le_mul_of_nonneg_left hpow_mono hCτ_nonneg + _ ≤ C * (max 1 θ) ^ (2 * max rτ rσ) := + mul_le_mul_of_nonneg_right hCτ_le_C hxmax_nonneg + have hpowσ : + (max 1 (B * θ ^ (2 : ℕ))) ^ rσ ≤ + C * (max 1 θ) ^ (2 * max rτ rσ) := by + have hterm := + rpow_max_one_mul_sq_le_const_mul_rpow + (A := B) (θ := θ) (r := rσ) hθ hrσ_nonneg + have hpow_mono : + (max 1 θ) ^ (2 * rσ) ≤ + (max 1 θ) ^ (2 * max rτ rσ) := by + refine rpow_max_one_le_rpow_max_one_of_exponent_le ?_ + nlinarith [le_max_right rτ rσ] + calc + (max 1 (B * θ ^ (2 : ℕ))) ^ rσ + ≤ (max 1 B) ^ rσ * (max 1 θ) ^ (2 * rσ) := hterm + _ ≤ (max 1 B) ^ rσ * (max 1 θ) ^ (2 * max rτ rσ) := + mul_le_mul_of_nonneg_left hpow_mono hCσ_nonneg + _ ≤ C * (max 1 θ) ^ (2 * max rτ rσ) := + mul_le_mul_of_nonneg_right hCσ_le_C hxmax_nonneg + simpa [mixedBottomTailDenominator, rτ, rσ, C] using max_le hpowτ hpowσ + +theorem selectedBlead_mul_sq_le_const_mul_rpow + {A B θ η τ σ U V : ℝ} + (hθ : 0 ≤ θ) (hη : 0 < η) (hτ : 0 ≤ τ) (hσ : 0 ≤ σ) + (hU : 0 ≤ U) (hV : 0 ≤ V) : + let rτ : ℝ := τ / η + let rσ : ℝ := σ / η + let Cden : ℝ := max ((max 1 A) ^ rτ) ((max 1 B) ^ rσ) + let p : ℝ := 2 * max rτ rσ + let C : ℝ := Cden * max U V + max + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * U) + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * V) ≤ + C * (max 1 θ) ^ p := by + intro rτ rσ Cden p C + have hDen_pos : + 0 < mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ := + mixedBottomTailDenominator_pos + have hDen_nonneg : + 0 ≤ mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ := hDen_pos.le + have hUV_nonneg : 0 ≤ max U V := by + by_cases hUV : U ≤ V + · simpa [max_eq_right hUV] using hV + · simpa [max_eq_left (le_of_not_ge hUV)] using hU + have hDen_to_max : + max + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * U) + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * V) ≤ + mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * max U V := by + refine max_le ?_ ?_ + · exact mul_le_mul_of_nonneg_left (le_max_left U V) hDen_nonneg + · exact mul_le_mul_of_nonneg_left (le_max_right U V) hDen_nonneg + have hDen_bound : + mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ ≤ + Cden * (max 1 θ) ^ p := by + simpa [rτ, rσ, Cden, p] using + mixedBottomTailDenominator_mul_sq_le_const_mul_rpow + (A := A) (B := B) (θ := θ) (η := η) (τ := τ) (σ := σ) + hθ hη hτ hσ + calc + max + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * U) + (mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * V) + ≤ mixedBottomTailDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) + η τ σ * max U V := hDen_to_max + _ ≤ (Cden * (max 1 θ) ^ p) * max U V := + mul_le_mul_of_nonneg_right hDen_bound hUV_nonneg + _ = C * (max 1 θ) ^ p := by ring + +theorem two_rpow_neg_lt_one {η : ℝ} (hη : 0 < η) : + (2 : ℝ) ^ (-η) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 2) (by linarith) + +theorem gap_two_mul_rpow_eq {B η : ℝ} (hB : 0 < B) : + B ^ (-η) - (2 * B) ^ (-η) = + B ^ (-η) * (1 - (2 : ℝ) ^ (-η)) := by + have htwo_nonneg : (0 : ℝ) ≤ 2 := by norm_num + have hB_nonneg : 0 ≤ B := hB.le + have hmul : + (2 * B) ^ (-η) = (2 : ℝ) ^ (-η) * B ^ (-η) := by + rw [Real.mul_rpow htwo_nonneg hB_nonneg] + rw [hmul] + ring + +theorem gap_two_mul_rpow_pos {B η : ℝ} (hB : 0 < B) (hη : 0 < η) : + 0 < B ^ (-η) - (2 * B) ^ (-η) := by + rw [gap_two_mul_rpow_eq hB] + exact mul_pos (Real.rpow_pos_of_pos hB _) + (sub_pos.mpr (two_rpow_neg_lt_one hη)) + +theorem max_zero_neg_log_gap_two_mul_le {B η : ℝ} + (hB : 1 ≤ B) (hη : 0 < η) : + max 0 (-(Real.log (B ^ (-η) - (2 * B) ^ (-η)))) ≤ + η * Real.log B + max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η)))) := by + have hB_pos : 0 < B := lt_of_lt_of_le zero_lt_one hB + let c : ℝ := 1 - (2 : ℝ) ^ (-η) + have hc_pos : 0 < c := by + dsimp [c] + exact sub_pos.mpr (two_rpow_neg_lt_one hη) + have hBpow_pos : 0 < B ^ (-η) := Real.rpow_pos_of_pos hB_pos _ + have hlogB_nonneg : 0 ≤ Real.log B := Real.log_nonneg hB + have hmain : + -(Real.log (B ^ (-η) - (2 * B) ^ (-η))) = + η * Real.log B - Real.log c := by + rw [gap_two_mul_rpow_eq hB_pos] + rw [Real.log_mul hBpow_pos.ne' hc_pos.ne'] + rw [Real.log_rpow hB_pos] + dsimp [c] + ring + rw [hmain] + refine max_le ?_ ?_ + · have hηlog_nonneg : 0 ≤ η * Real.log B := mul_nonneg hη.le hlogB_nonneg + have hmax_nonneg : 0 ≤ max 0 (-(Real.log c)) := le_max_left 0 _ + nlinarith + · have hneglog_le : -(Real.log c) ≤ max 0 (-(Real.log c)) := le_max_right 0 _ + nlinarith [mul_nonneg hη.le hlogB_nonneg] + +theorem rpow_three_natCeil_le_three_mul_exp {y : ℝ} (hy : 0 ≤ y) : + Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) ≤ + 3 * Real.exp (Real.log (3 : ℝ) * y) := by + have hceil : ((Nat.ceil y : ℕ) : ℝ) < y + 1 := + Nat.ceil_lt_add_one hy + have hpow_le : + Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) ≤ + Real.rpow (3 : ℝ) (y + 1) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hceil.le + calc + Real.rpow (3 : ℝ) ((Nat.ceil y : ℕ) : ℝ) + ≤ Real.rpow (3 : ℝ) (y + 1) := hpow_le + _ = Real.exp (Real.log (3 : ℝ) * (y + 1)) := by + simpa using + (Real.rpow_def_of_pos (x := (3 : ℝ)) (y := y + 1) + (by norm_num : (0 : ℝ) < 3)) + _ = 3 * Real.exp (Real.log (3 : ℝ) * y) := by + rw [show Real.log (3 : ℝ) * (y + 1) = + Real.log (3 : ℝ) + Real.log (3 : ℝ) * y by ring] + rw [Real.exp_add, Real.exp_log (by norm_num : (0 : ℝ) < 3)] + +theorem pow_three_natCeil_le_three_mul_exp {y : ℝ} (hy : 0 ≤ y) : + (3 : ℝ) ^ (Nat.ceil y) ≤ + 3 * Real.exp (Real.log (3 : ℝ) * y) := by + simpa [Real.rpow_natCast] using rpow_three_natCeil_le_three_mul_exp hy + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionFinal.lean new file mode 100644 index 0000000000..04db98dab6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionFinal.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompressionThreshold + +/-! # Scale Compression Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Final deterministic scale compression + +This file compresses the explicit quantitative minimal-scale normalization +`3 * 3^Q * B` to the manuscript envelope `exp(C log^2(2 + thetaHat))`. +-/ + +noncomputable section + +theorem one_le_rpow_of_one_le_of_nonneg {x r : ℝ} + (hx : 1 ≤ x) (hr : 0 ≤ r) : + 1 ≤ x ^ r := by + have hbase : x ^ (0 : ℝ) ≤ x ^ r := + Real.rpow_le_rpow_of_exponent_le hx hr + simpa using hbase + +theorem one_le_mixedBottomTailDenominator + {Dhigh Dcrude η τ σ : ℝ} + (hη : 0 < η) (hτ : 0 ≤ τ) : + 1 ≤ mixedBottomTailDenominator Dhigh Dcrude η τ σ := by + have hbase : 1 ≤ max 1 Dhigh := le_max_left 1 Dhigh + have hr : 0 ≤ τ / η := by positivity + have hterm : 1 ≤ (max 1 Dhigh) ^ (τ / η) := + one_le_rpow_of_one_le_of_nonneg hbase hr + exact hterm.trans (le_max_left _ _) + +theorem explicit_minimalScale_prefactor_le_exp_logSq + {d : ℕ} [NeZero d] {σ Cfluct Ccrude a t αbad : ℝ} {R : ℕ} + (hσ : 0 < σ) (hCfluct : 0 < Cfluct) (hCcrude : 0 < Ccrude) + (ha : 0 < a) (ht : 0 < t) : + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let τ : ℝ := finiteQuenchedTailTau σ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (τ * (t - αbad) / η) + let ρcrude : ℝ := (3 : ℝ) ^ (t - αbad) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ τ) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let Kcrude : ℝ := weightedGeometricExpKernelConst w (ρcrude ^ σ) + let M : ℝ := + max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom) + + max 0 ((S.card : ℝ) * Kcrude)) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ θ : ℝ, 0 < θ → + let Dhigh : ℝ := 2 * K * Cfluct * θ ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * θ ^ (2 : ℕ) + let Den : ℝ := mixedBottomTailDenominator Dhigh Dcrude η τ σ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let Blead : ℝ := + max (Den * (3 : ℝ) ^ Ohigh) (Den * (3 : ℝ) ^ Ocrude) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρgap : ℝ := (3 : ℝ) ^ η + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref (max Qlead Qcut) + 3 * ((3 : ℝ) ^ Q) * B ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + intro K S b L ctop τ η w ρtop ρbottom ρcrude Cbottom Ctop Kbottom Kcrude M Qcut + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos (d := d) + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hτ_pos : 0 < τ := by + simpa [τ] using finiteQuenchedTailTau_pos hσ + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ ht + let Ahi : ℝ := 2 * K * Cfluct + let Acr : ℝ := K * Ccrude + let rτ : ℝ := τ / η + let rσ : ℝ := σ / η + let Cden : ℝ := max ((max 1 Ahi) ^ rτ) ((max 1 Acr) ^ rσ) + let pDen : ℝ := 2 * max rτ rσ + let Ohigh : ℝ := (τ * b * (L + 1)) / η + let Ocrude : ℝ := (σ * t * (L + 1)) / η + let U : ℝ := (3 : ℝ) ^ Ohigh + let V : ℝ := (3 : ℝ) ^ Ocrude + let Cblead : ℝ := Cden * max U V + let Cgap : ℝ := + (2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3) + let Cq : ℝ := + 18 * (3 : ℝ) ^ (Nat.ceil (max 0 (Real.log M)) + R + Qcut) * + Real.exp (Real.log 3 * Cgap) + let Aenv : ℝ := 3 * Cq * Cblead ^ (4 : ℕ) + let penv : ℝ := 4 * pDen + let Cscale : ℝ := 1 + (4 * max 0 (Real.log Aenv) + 2 * penv) + have hAhi_pos : 0 < Ahi := by dsimp [Ahi]; positivity + have hAcr_pos : 0 < Acr := by dsimp [Acr]; positivity + have hrτ_nonneg : 0 ≤ rτ := by dsimp [rτ]; positivity + have hrσ_nonneg : 0 ≤ rσ := by dsimp [rσ]; positivity + have hpDen_nonneg : 0 ≤ pDen := by + dsimp [pDen] + nlinarith [le_max_left rτ rσ, hrτ_nonneg] + have hU_pos : 0 < U := by dsimp [U]; positivity + have hV_pos : 0 < V := by dsimp [V]; positivity + have hCden_pos : 0 < Cden := by + dsimp [Cden] + exact (Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 Ahi)) _).trans_le + (le_max_left _ _) + have hCblead_pos : 0 < Cblead := by + dsimp [Cblead] + exact mul_pos hCden_pos (by + by_cases hUV : U ≤ V + · simpa [max_eq_right hUV] using hV_pos + · simpa [max_eq_left (le_of_not_ge hUV)] using hU_pos) + have hCgap_exp_pos : 0 < Real.exp (Real.log 3 * Cgap) := Real.exp_pos _ + have hCq_pos : 0 < Cq := by + dsimp [Cq] + positivity + have hAenv_pos : 0 < Aenv := by dsimp [Aenv]; positivity + have hpenv_nonneg : 0 ≤ penv := by dsimp [penv]; positivity + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + have hmax_nonneg : 0 ≤ max 0 (Real.log Aenv) := le_max_left 0 _ + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ hθ_pos Dhigh Dcrude Den Ohigh' Ocrude' Blead Btail B cgap ρgap + Qpref Qlead Q + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hDen_ge_one : 1 ≤ Den := by + simpa [Den, Dhigh, Dcrude, η, τ] using + one_le_mixedBottomTailDenominator + (Dhigh := Ahi * θ ^ (2 : ℕ)) (Dcrude := Acr * θ ^ (2 : ℕ)) + (η := η) (τ := τ) (σ := σ) hη_pos hτ_pos.le + have hOhigh_eq : Ohigh' = Ohigh := by rfl + have hOcrude_eq : Ocrude' = Ocrude := by rfl + have hU_ge_one : 1 ≤ (3 : ℝ) ^ Ohigh' := by + rw [hOhigh_eq] + have hL_nonneg : 0 ≤ L := by + dsimp [L] + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + positivity + have hO_nonneg : 0 ≤ Ohigh := by + dsimp [Ohigh] + positivity + exact one_le_rpow_of_one_le_of_nonneg (by norm_num : (1 : ℝ) ≤ 3) hO_nonneg + have hBlead_ge_one : 1 ≤ Blead := by + dsimp [Blead] + have hleft : 1 ≤ Den * (3 : ℝ) ^ Ohigh' := by + have hprod_nonneg : 0 ≤ Den * (3 : ℝ) ^ Ohigh' := by positivity + nlinarith + exact hleft.trans (le_max_left _ _) + have hBlead_pos : 0 < Blead := lt_of_lt_of_le zero_lt_one hBlead_ge_one + have hblead_bound : + Blead ≤ Cblead * (max 1 θ) ^ pDen := by + simpa [Blead, Den, Dhigh, Dcrude, Ahi, Acr, Ohigh', Ocrude', + Ohigh, Ocrude, U, V, Cden, Cblead, pDen, rτ, rσ] using + selectedBlead_mul_sq_le_const_mul_rpow + (A := Ahi) (B := Acr) (θ := θ) (η := η) (τ := τ) (σ := σ) + (U := U) (V := V) hθ_nonneg hη_pos hτ_pos.le hσ.le + hU_pos.le hV_pos.le + have hthreshold : + (3 : ℝ) ^ Q * B ≤ Cq * Blead ^ (4 : ℕ) := by + simpa [Btail, B, cgap, ρgap, Qpref, Qlead, Q, Cgap, Cq] using + pow_three_explicit_threshold_le_const_mul_Blead_four + (M := M) (η := η) (Blead := Blead) (R := R) (Qcut := Qcut) + hη_pos hBlead_ge_one + have hblead_pow : + Blead ^ (4 : ℕ) ≤ + (Cblead * (max 1 θ) ^ pDen) ^ (4 : ℕ) := by + exact pow_le_pow_left₀ hBlead_pos.le hblead_bound 4 + have hpoly : + 3 * ((3 : ℝ) ^ Q) * B ≤ + Aenv * (max 1 θ) ^ penv := by + calc + 3 * ((3 : ℝ) ^ Q) * B + = 3 * (((3 : ℝ) ^ Q) * B) := by ring + _ ≤ 3 * (Cq * Blead ^ (4 : ℕ)) := + mul_le_mul_of_nonneg_left hthreshold (by norm_num) + _ ≤ 3 * (Cq * ((Cblead * (max 1 θ) ^ pDen) ^ (4 : ℕ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hblead_pow hCq_pos.le) (by norm_num) + _ = Aenv * (max 1 θ) ^ penv := by + dsimp [Aenv, penv] + rw [mul_pow] + have hx_nonneg : 0 ≤ max 1 θ := le_trans zero_le_one (le_max_left 1 θ) + rw [show ((max 1 θ) ^ pDen) ^ (4 : ℕ) = + ((max 1 θ) ^ pDen) ^ (4 : ℝ) by + exact (Real.rpow_natCast ((max 1 θ) ^ pDen) 4).symm] + rw [← Real.rpow_mul hx_nonneg] + ring_nf + have henv := + const_mul_rpow_max_one_le_exp_logSq + (A := Aenv) (θ := θ) (p := penv) + hAenv_pos hθ_nonneg hpenv_nonneg + have henv2 : + Real.exp ((4 * max 0 (Real.log Aenv) + 2 * penv) * + (Real.log (2 + θ)) ^ (2 : ℕ)) ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + refine Real.exp_le_exp.mpr ?_ + let A0 : ℝ := 4 * max 0 (Real.log Aenv) + 2 * penv + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hA0_le : A0 ≤ Cscale := by + dsimp [A0, Cscale] + linarith + exact mul_le_mul_of_nonneg_right hA0_le hL2_nonneg + exact hpoly.trans (henv.trans henv2) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionThreshold.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionThreshold.lean new file mode 100644 index 0000000000..134fb8f1cf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleCompressionThreshold.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleCompression + +/-! # Scale Compression Threshold -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Compression of the explicit bad-scale threshold + +The quantitative tail theorem exposes three deterministic cutoffs. This file +collapses them to a fixed polynomial in the selected denominator `Blead`, after +the final tail denominator is chosen as `2 * Blead`. +-/ + +noncomputable section + +theorem pow_three_nat_mono {m n : ℕ} (hmn : m ≤ n) : + (3 : ℝ) ^ m ≤ (3 : ℝ) ^ n := + pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hmn + +theorem pow_three_natCeil_log_div_log_le_three_mul_self + {x : ℝ} (hx : 1 ≤ x) : + (3 : ℝ) ^ Nat.ceil (Real.log x / Real.log 3) ≤ 3 * x := by + simpa [Real.rpow_natCast] using + rpow_three_natCeil_log_div_log_le_three_mul (x := x) hx + +theorem pow_three_nat_add (a b : ℕ) : + (3 : ℝ) ^ (a + b) = (3 : ℝ) ^ a * (3 : ℝ) ^ b := by + exact pow_add (3 : ℝ) a b + +theorem pow_three_nat_add_five (a b c d e : ℕ) : + (3 : ℝ) ^ (a + b + c + d + e) = + (3 : ℝ) ^ a * (3 : ℝ) ^ b * (3 : ℝ) ^ c * + (3 : ℝ) ^ d * (3 : ℝ) ^ e := by + rw [show a + b + c + d + e = (((a + b) + c) + d) + e by omega] + simp [pow_add, mul_assoc] + +theorem pow_three_explicit_threshold_le_const_mul_Blead_four + {M η Blead : ℝ} {R Qcut : ℕ} + (hη : 0 < η) (hBlead : 1 ≤ Blead) : + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρgap : ℝ := (3 : ℝ) ^ η + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref (max Qlead Qcut) + let Cgap : ℝ := + (2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log 3) + let C : ℝ := + 18 * (3 : ℝ) ^ (Nat.ceil (max 0 (Real.log M)) + R + Qcut) * + Real.exp (Real.log 3 * Cgap) + (3 : ℝ) ^ Q * max 1 Btail ≤ C * Blead ^ (4 : ℕ) := by + intro Btail cgap ρgap Qpref Qlead Q Cgap C + have hlog3 : 0 < Real.log (3 : ℝ) := Real.log_pos (by norm_num) + have hBlead_pos : 0 < Blead := lt_of_lt_of_le zero_lt_one hBlead + have hBtail_eq : Btail = 2 * Blead := rfl + have hBtail_ge_one : 1 ≤ Btail := by + dsimp [Btail] + nlinarith + have hmaxBtail : max 1 Btail = Btail := max_eq_right hBtail_ge_one + have hcgap_pos : 0 < cgap := by + simpa [Btail, cgap] using + gap_two_mul_rpow_pos (B := Blead) (η := η) hBlead_pos hη + have hρgap_pos : 0 < ρgap := by + dsimp [ρgap] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) η + have hlogρ : Real.log ρgap = η * Real.log (3 : ℝ) := by + dsimp [ρgap] + rw [Real.log_rpow (by norm_num : (0 : ℝ) < 3)] + have hlogρ_pos : 0 < Real.log ρgap := by + rw [hlogρ] + exact mul_pos hη hlog3 + let A : ℕ := Nat.ceil (max 0 (Real.log M)) + let G : ℕ := + Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap) + have hQ_le : Q ≤ A + R + G + Qlead + Qcut := by + dsimp [Q, Qpref, A, G] + omega + have hpowQ : + (3 : ℝ) ^ Q ≤ (3 : ℝ) ^ (A + R + G + Qlead + Qcut) := + pow_three_nat_mono hQ_le + have hlead : + (3 : ℝ) ^ Qlead ≤ 3 * Blead := by + simpa [Qlead] using + pow_three_natCeil_log_div_log_le_three_mul_self hBlead + have hgap_log : + max 0 (-(Real.log cgap)) ≤ + η * Real.log Blead + + max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η)))) := by + simpa [Btail, cgap] using + max_zero_neg_log_gap_two_mul_le (B := Blead) (η := η) hBlead hη + have hGarg_nonneg : + 0 ≤ (2 * max 0 (-(Real.log cgap))) / Real.log ρgap := by + positivity + have hGpow_raw : + (3 : ℝ) ^ G ≤ + 3 * Real.exp + (Real.log (3 : ℝ) * + ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap)) := by + simpa [G, Real.rpow_natCast] using + rpow_three_natCeil_le_three_mul_exp hGarg_nonneg + have hGarg_bound : + (2 * max 0 (-(Real.log cgap))) / Real.log ρgap ≤ + 2 * Real.log Blead / Real.log (3 : ℝ) + Cgap := by + have hmul := mul_le_mul_of_nonneg_left hgap_log (by norm_num : (0 : ℝ) ≤ 2) + rw [hlogρ] + dsimp [Cgap] + have hden_pos : 0 < η * Real.log (3 : ℝ) := mul_pos hη hlog3 + calc + (2 * max 0 (-(Real.log cgap))) / (η * Real.log (3 : ℝ)) + ≤ (2 * (η * Real.log Blead + + max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η)))))) / + (η * Real.log (3 : ℝ)) := + div_le_div_of_nonneg_right hmul hden_pos.le + _ = 2 * Real.log Blead / Real.log (3 : ℝ) + + (2 * max 0 (-(Real.log (1 - (2 : ℝ) ^ (-η))))) / + (η * Real.log (3 : ℝ)) := by + field_simp [hη.ne', hlog3.ne'] + have hGexp : + Real.exp + (Real.log (3 : ℝ) * + ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap)) ≤ + Real.exp (2 * Real.log Blead + Real.log (3 : ℝ) * Cgap) := by + refine Real.exp_le_exp.mpr ?_ + calc + Real.log (3 : ℝ) * + ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap) + ≤ Real.log (3 : ℝ) * + (2 * Real.log Blead / Real.log (3 : ℝ) + Cgap) := + mul_le_mul_of_nonneg_left hGarg_bound hlog3.le + _ = 2 * Real.log Blead + Real.log (3 : ℝ) * Cgap := by + field_simp [hlog3.ne'] + have hGpow : + (3 : ℝ) ^ G ≤ + 3 * Real.exp (Real.log (3 : ℝ) * Cgap) * Blead ^ (2 : ℕ) := by + calc + (3 : ℝ) ^ G + ≤ 3 * Real.exp + (Real.log (3 : ℝ) * + ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap)) := + hGpow_raw + _ ≤ 3 * Real.exp (2 * Real.log Blead + Real.log (3 : ℝ) * Cgap) := + mul_le_mul_of_nonneg_left hGexp (by norm_num) + _ = 3 * Real.exp (Real.log (3 : ℝ) * Cgap) * Blead ^ (2 : ℕ) := by + rw [Real.exp_add] + have hsq : Real.exp (2 * Real.log Blead) = Blead ^ (2 : ℕ) := by + have hlogpow : + Real.log (Blead ^ (2 : ℝ)) = 2 * Real.log Blead := + Real.log_rpow hBlead_pos 2 + calc + Real.exp (2 * Real.log Blead) + = Real.exp (Real.log (Blead ^ (2 : ℝ))) := by rw [hlogpow] + _ = Blead ^ (2 : ℝ) := + Real.exp_log (Real.rpow_pos_of_pos hBlead_pos 2) + _ = Blead ^ (2 : ℕ) := Real.rpow_natCast Blead 2 + rw [hsq] + ring + have hconst_nonneg : 0 ≤ (3 : ℝ) ^ (A + R + Qcut) := by positivity + have hG_nonneg : 0 ≤ (3 : ℝ) ^ G := by positivity + have hlead_nonneg : 0 ≤ (3 : ℝ) ^ Qlead := by positivity + have hpow_decomp : + (3 : ℝ) ^ (A + R + G + Qlead + Qcut) = + (3 : ℝ) ^ (A + R + Qcut) * (3 : ℝ) ^ G * (3 : ℝ) ^ Qlead := by + rw [show A + R + G + Qlead + Qcut = (A + R + Qcut) + G + Qlead by omega] + simp [pow_add, mul_assoc, mul_left_comm, mul_comm] + calc + (3 : ℝ) ^ Q * max 1 Btail + ≤ (3 : ℝ) ^ (A + R + G + Qlead + Qcut) * max 1 Btail := + mul_le_mul_of_nonneg_right hpowQ (by positivity) + _ = (3 : ℝ) ^ (A + R + Qcut) * (3 : ℝ) ^ G * + (3 : ℝ) ^ Qlead * Btail := by rw [hpow_decomp, hmaxBtail] + _ ≤ (3 : ℝ) ^ (A + R + Qcut) * + (3 * Real.exp (Real.log (3 : ℝ) * Cgap) * Blead ^ (2 : ℕ)) * + (3 * Blead) * Btail := by + gcongr + _ = C * Blead ^ (4 : ℕ) := by + dsimp [C, Btail] + ring + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleGeometry.lean new file mode 100644 index 0000000000..12d2389b62 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/ScaleGeometry.lean @@ -0,0 +1,304 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.DeterministicThresholds + +/-! # Scale Geometry -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Scale geometry for Section 5.7 bad-pair estimates + +This file records the elementary arithmetic facts used to simplify the +deterministic scales after shifting by the annealed entry scale. +-/ + +noncomputable section + +theorem nat_cast_add_sub_of_le + {q m : ℕ} (hqm : q ≤ m) : + (q : ℝ) + ((m - q : ℕ) : ℝ) = (m : ℝ) := by + have hnat : q + (m - q) = m := Nat.add_sub_of_le hqm + exact_mod_cast hnat + +theorem nat_cast_sub_add_sub_of_le + {n q m : ℕ} (hnq : n ≤ q) (hqm : q ≤ m) : + ((m - q : ℕ) : ℝ) + ((q - n : ℕ) : ℝ) = + ((m - n : ℕ) : ℝ) := by + have hnat : (m - q) + (q - n) = m - n := by omega + exact_mod_cast hnat + +theorem int_toNat_nat_add_sub_nat_add_of_le + {N n ℓ : ℕ} (hℓn : ℓ ≤ n) : + Int.toNat ((((N + n : ℕ) : ℤ) - ((N + ℓ : ℕ) : ℤ))) = n - ℓ := by + let z : ℤ := ((N + n : ℕ) : ℤ) - ((N + ℓ : ℕ) : ℤ) + have hdiff_nonneg : + 0 ≤ z := by + dsimp [z] + exact sub_nonneg.mpr (by exact_mod_cast Nat.add_le_add_left hℓn N) + have hsub_cast : + (((N + n - (N + ℓ) : ℕ) : ℤ) = + ((N + n : ℕ) : ℤ) - ((N + ℓ : ℕ) : ℤ)) := by + exact_mod_cast + (Nat.cast_sub (Nat.add_le_add_left hℓn N) : + ((N + n - (N + ℓ) : ℕ) : ℤ) = + ((N + n : ℕ) : ℤ) - ((N + ℓ : ℕ) : ℤ)) + have hnat_sub : N + n - (N + ℓ) = n - ℓ := by + omega + have htoNat_cast : + ((Int.toNat z : ℤ) : ℤ) = ((N + n - (N + ℓ) : ℕ) : ℤ) := by + calc + ((Int.toNat z : ℤ) : ℤ) = z := Int.toNat_of_nonneg hdiff_nonneg + _ = ((N + n - (N + ℓ) : ℕ) : ℤ) := by + dsimp [z] + rw [hsub_cast] + simp [Nat.cast_add] + have htoNat : Int.toNat z = N + n - (N + ℓ) := by + exact_mod_cast htoNat_cast + change Int.toNat z = n - ℓ + exact htoNat.trans hnat_sub + +theorem descendantsAtScale_originCube_nat_shift_card + {d : ℕ} {N m n : ℕ} (hnm : n ≤ m) : + (descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ))).card = + (3 ^ d) ^ (m - n) := by + have hnm_int : ((N + n : ℕ) : ℤ) ≤ ((N + m : ℕ) : ℤ) := by + exact_mod_cast Nat.add_le_add_left hnm N + rw [descendantsAtScale_eq_descendantsAtDepth + (originCube d (((N + m : ℕ) : ℤ))) hnm_int] + rw [descendantsAtDepth_card] + congr 1 + exact int_toNat_nat_add_sub_nat_add_of_le hnm + +theorem descendantsAtScale_originCube_nat_card + {d : ℕ} {m n : ℕ} (hnm : n ≤ m) : + (descendantsAtScale + (originCube d ((m : ℕ) : ℤ)) + ((n : ℕ) : ℤ)).card = + (3 ^ d) ^ (m - n) := by + simpa using + descendantsAtScale_originCube_nat_shift_card + (d := d) (N := 0) (m := m) (n := n) hnm + +theorem log_descendantsAtScale_originCube_nat_shift_card + {d : ℕ} {N m n : ℕ} (hnm : n ≤ m) : + Real.log + (((descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ))).card : ℝ)) = + ((m - n : ℕ) : ℝ) * Real.log ((3 ^ d : ℕ) : ℝ) := by + rw [descendantsAtScale_originCube_nat_shift_card + (d := d) (N := N) (m := m) (n := n) hnm] + norm_num [Nat.cast_pow, Real.log_pow] + +theorem log_descendantsAtScale_originCube_nat_card + {d : ℕ} {m n : ℕ} (hnm : n ≤ m) : + Real.log + (((descendantsAtScale + (originCube d ((m : ℕ) : ℤ)) + ((n : ℕ) : ℤ)).card : ℝ)) = + ((m - n : ℕ) : ℝ) * Real.log ((3 ^ d : ℕ) : ℝ) := by + simpa using + log_descendantsAtScale_originCube_nat_shift_card + (d := d) (N := 0) (m := m) (n := n) hnm + +theorem three_mul_log_three_pow_dim_pos + {d : ℕ} [NeZero d] : + 0 < 3 * Real.log (((3 ^ d : ℕ) : ℝ)) := by + have hd_ne : d ≠ 0 := NeZero.ne d + have hpow_gt : (1 : ℝ) < ((3 ^ d : ℕ) : ℝ) := by + exact_mod_cast + (one_lt_pow₀ (by norm_num : (1 : ℕ) < 3) hd_ne : + (1 : ℕ) < 3 ^ d) + have hlog_pos : 0 < Real.log (((3 ^ d : ℕ) : ℝ)) := + Real.log_pos hpow_gt + positivity + +theorem three_mul_log_normalizedProbeIndex_univ_card_pos + {d : ℕ} [NeZero d] : + 0 < + 3 * Real.log (((Finset.univ : Finset (NormalizedProbeIndex d)).card : ℝ)) := by + classical + let α : BlockCoord d := Classical.choice (inferInstance : Nonempty (BlockCoord d)) + let i₁ : NormalizedProbeIndex d := (α, α, NormalizedProbeKind.coord) + let i₂ : NormalizedProbeIndex d := (α, α, NormalizedProbeKind.plus) + have hne : i₁ ≠ i₂ := by + simp [i₁, i₂] + have hpair : ({i₁, i₂} : Finset (NormalizedProbeIndex d)).card = 2 := + Finset.card_pair hne + have hcard_two : + 2 ≤ (Finset.univ : Finset (NormalizedProbeIndex d)).card := by + have hle : + ({i₁, i₂} : Finset (NormalizedProbeIndex d)).card ≤ + (Finset.univ : Finset (NormalizedProbeIndex d)).card := + Finset.card_le_card (by intro x hx; simp) + omega + have hlog_pos : + 0 < Real.log (((Finset.univ : Finset (NormalizedProbeIndex d)).card : ℝ)) := by + exact Real.log_pos (by exact_mod_cast hcard_two) + positivity + +theorem three_mul_log_descendantsAtScale_originCube_nat_shift_card_eq + {d : ℕ} [NeZero d] {N m n : ℕ} (hnm : n ≤ m) : + 3 * + Real.log + (((descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ))).card : ℝ)) = + ((m - n : ℕ) : ℝ) * + (3 * Real.log (((3 ^ d : ℕ) : ℝ))) := by + rw [log_descendantsAtScale_originCube_nat_shift_card + (d := d) (N := N) (m := m) (n := n) hnm] + ring + +theorem rpow_three_mul_log_descendantsAtScale_originCube_nat_shift_card + {d : ℕ} [NeZero d] {τ : ℝ} {N m n : ℕ} + (hnm : n < m) : + (3 * + Real.log + (((descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ))).card : ℝ))) ^ τ⁻¹ = + (((m - n : ℕ) : ℝ) ^ τ⁻¹) * + ((3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹) := by + have hgap_nonneg : 0 ≤ ((m - n : ℕ) : ℝ) := by + positivity + have hconst_nonneg : + 0 ≤ 3 * Real.log (((3 ^ d : ℕ) : ℝ)) := + (three_mul_log_three_pow_dim_pos (d := d)).le + rw [three_mul_log_descendantsAtScale_originCube_nat_shift_card_eq + (d := d) (N := N) (m := m) (n := n) (le_of_lt hnm)] + rw [Real.mul_rpow hgap_nonneg hconst_nonneg] + +theorem rpow_three_mul_log_descendantsAtScale_originCube_nat_shift_card_le_parent + {d : ℕ} [NeZero d] {τ : ℝ} (hτ : 0 < τ) + {N m n : ℕ} (hnm : n < m) : + (3 * + Real.log + (((descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ))).card : ℝ))) ^ τ⁻¹ ≤ + ((m : ℝ) ^ τ⁻¹) * + ((3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹) := by + rw [rpow_three_mul_log_descendantsAtScale_originCube_nat_shift_card + (d := d) (τ := τ) (N := N) (m := m) (n := n) hnm] + have hgap_nonneg : 0 ≤ ((m - n : ℕ) : ℝ) := by + positivity + have hgap_le_m : ((m - n : ℕ) : ℝ) ≤ (m : ℝ) := by + exact_mod_cast Nat.sub_le m n + have hexp_nonneg : 0 ≤ τ⁻¹ := inv_nonneg.mpr hτ.le + have hgap_pow_le : + ((m - n : ℕ) : ℝ) ^ τ⁻¹ ≤ (m : ℝ) ^ τ⁻¹ := + Real.rpow_le_rpow hgap_nonneg hgap_le_m hexp_nonneg + exact mul_le_mul_of_nonneg_right hgap_pow_le + (Real.rpow_pos_of_pos + (three_mul_log_three_pow_dim_pos (d := d)) τ⁻¹).le + +theorem shiftedEnvelopeDenominator_le_parentPower + {d : ℕ} [NeZero d] {τ R K C θ : ℝ} + (hτ : 0 < τ) (hR : 0 ≤ R) (hK : 0 ≤ K) + (hC : 0 ≤ C) + {N m n : ℕ} (hnm : n < m) : + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + R * (K * + (((3 * Real.log (S.card : ℝ)) ^ τ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ τ⁻¹) * + (C * θ ^ (2 : ℕ))))) ≤ + (R * (K * + (((3 * Real.log (S.card : ℝ)) ^ τ⁻¹) * + (((3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹) * + (C * θ ^ (2 : ℕ)))))) * + ((m : ℝ) ^ τ⁻¹) := by + intro D S + let Sfac : ℝ := (3 * Real.log (S.card : ℝ)) ^ τ⁻¹ + let Dfac : ℝ := (3 * Real.log (D.card : ℝ)) ^ τ⁻¹ + let Gfac : ℝ := (3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹ + let Mfac : ℝ := (m : ℝ) ^ τ⁻¹ + have hSbase : 0 < 3 * Real.log (S.card : ℝ) := by + simpa [S] using three_mul_log_normalizedProbeIndex_univ_card_pos (d := d) + have hSfac_nonneg : 0 ≤ Sfac := by + dsimp [Sfac] + exact (Real.rpow_pos_of_pos hSbase _).le + have htheta_sq_nonneg : 0 ≤ θ ^ (2 : ℕ) := by positivity + have hconst_nonneg : + 0 ≤ R * K * Sfac * (C * θ ^ (2 : ℕ)) := by positivity + have hDfac_le : Dfac ≤ Mfac * Gfac := by + simpa [D, Dfac, Mfac, Gfac] using + rpow_three_mul_log_descendantsAtScale_originCube_nat_shift_card_le_parent + (d := d) (τ := τ) hτ (N := N) (m := m) (n := n) hnm + calc + R * (K * (Sfac * (Dfac * (C * θ ^ (2 : ℕ))))) + = R * K * Sfac * (C * θ ^ (2 : ℕ)) * Dfac := by ring + _ ≤ R * K * Sfac * (C * θ ^ (2 : ℕ)) * (Mfac * Gfac) := by + exact mul_le_mul_of_nonneg_left hDfac_le hconst_nonneg + _ = + (R * (K * (Sfac * (Gfac * (C * θ ^ (2 : ℕ)))))) * Mfac := by + ring + +theorem shiftedEnvelopeDenominator_le_parentAddOnePower + {d : ℕ} [NeZero d] {τ R K C θ : ℝ} + (hτ : 0 < τ) (hR : 0 ≤ R) (hK : 0 ≤ K) + (hC : 0 ≤ C) + {N m n : ℕ} (hnm : n < m) : + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N + m : ℕ) : ℤ))) + (((N + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + R * (K * + (((3 * Real.log (S.card : ℝ)) ^ τ⁻¹) * + (((3 * Real.log (D.card : ℝ)) ^ τ⁻¹) * + (C * θ ^ (2 : ℕ))))) ≤ + (R * (K * + (((3 * Real.log (S.card : ℝ)) ^ τ⁻¹) * + (((3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹) * + (C * θ ^ (2 : ℕ)))))) * + (((m : ℝ) + 1) ^ τ⁻¹) := by + intro D S + have hparent := + shiftedEnvelopeDenominator_le_parentPower + (d := d) (τ := τ) (R := R) (K := K) (C := C) (θ := θ) + hτ hR hK hC (N := N) (m := m) (n := n) hnm + dsimp only at hparent ⊢ + have hm_nonneg : 0 ≤ (m : ℝ) := by positivity + have hm_le : (m : ℝ) ≤ (m : ℝ) + 1 := by linarith + have hinv_nonneg : 0 ≤ τ⁻¹ := inv_nonneg.mpr hτ.le + have hpow_le : (m : ℝ) ^ τ⁻¹ ≤ ((m : ℝ) + 1) ^ τ⁻¹ := + Real.rpow_le_rpow hm_nonneg hm_le hinv_nonneg + have hconst_nonneg : + 0 ≤ + R * + (K * + (((3 * Real.log (S.card : ℝ)) ^ τ⁻¹) * + (((3 * Real.log (((3 ^ d : ℕ) : ℝ))) ^ τ⁻¹) * + (C * θ ^ (2 : ℕ))))) := by + have hSbase : 0 < 3 * Real.log (S.card : ℝ) := by + simpa [S] using three_mul_log_normalizedProbeIndex_univ_card_pos (d := d) + have hGbase : 0 < 3 * Real.log (((3 ^ d : ℕ) : ℝ)) := + three_mul_log_three_pow_dim_pos (d := d) + positivity + exact hparent.trans (mul_le_mul_of_nonneg_left hpow_le hconst_nonneg) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomBand.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomBand.lean new file mode 100644 index 0000000000..9cfea18139 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomBand.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ScaleGeometry +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleEntrySplit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadPairNoLog +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentSummation + +/-! # Small Bottom Band -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory + +/-! +# The small-bottom band below the annealed entry scale + +This file starts the quantitative treatment of the finite band `n < N0` in +the final quenched theorem. The first lemma is the concrete crude fixed-pair +row estimate in absolute variables. +-/ + +noncomputable section + +private theorem pow_le_pow_add_of_one_le {a : ℝ} (ha : 1 ≤ a) (m n : ℕ) : + a ^ m ≤ a ^ (m + n) := by + exact pow_le_pow_right₀ ha (Nat.le_add_right m n) + +/-- Reindex the small-bottom event into rows above the bad scale and the +finite set of bottom levels below `Nentry`. -/ +theorem smallBottomBadScaleEvent_subset_rows + {Ω : Type*} {H : ℕ → ℕ → Ω → ℝ} {Nentry q : ℕ} {t α : ℝ} : + smallBottomBadScaleEvent H Nentry t α (Nentry + q) ⊆ + ⋃ r : ℕ, ⋃ j : Fin Nentry, + badPairEvent H t α (Nentry + q) (Nentry + q + r) j.val := by + intro ω hω + rcases hω with ⟨m, n, hn_entry, hnm, hNm, hbad⟩ + let r : ℕ := m - (Nentry + q) + let j : Fin Nentry := ⟨n, hn_entry⟩ + refine Set.mem_iUnion.2 ⟨r, Set.mem_iUnion.2 ⟨j, ?_⟩⟩ + have hm : Nentry + q + r = m := by + dsimp [r] + exact Nat.add_sub_of_le hNm + simpa [badPairEvent, hm, j] using + (⟨hnm, hNm, hbad⟩ : + ω ∈ badPairEvent H t α (Nentry + q) m n) + +/-- Concrete crude fixed-pair row estimate for pairs whose bottom scale is +below the entry scale. Here `q` is the distance from the entry scale to the +bad scale and `r` is the distance above the bad scale. -/ +theorem measureReal_smallBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {t α : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {Nentry q r n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let A : ℝ := (3 : ℝ) ^ (t * (q : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (t - α) + let N : ℕ := Nentry + q + let m : ℕ := N + r + 0 < t → + α < t → + n < Nentry → + 1 ≤ A → + P.real (badPairEvent H t α N m n) ≤ + ((S.card : ℝ) * w ^ Nentry * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + obtain ⟨Ccrude, hCcrude, hpair⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro t α P hP hStruct hΓ hσ_eq hparams Nentry q r n + dsimp only + intro ht hαt hn_entry hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let H : ℕ → ℕ → RegCoeffField d → ℝ := quenchedProbeEnvelope hP hStruct + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let A : ℝ := (3 : ℝ) ^ (t * (q : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (t - α) + let N : ℕ := Nentry + q + let m : ℕ := N + r + let x : ℝ := α * ((m - N : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos (d := d) + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos hK_pos (mul_pos hCcrude (pow_pos hΓ.thetaHat_pos 2)) + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - α := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hρ_pos : 0 < ρ := lt_trans zero_lt_one hρ_gt + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA_one + have hAρ_nonneg : 0 ≤ A * ρ ^ r := by positivity + have hN_le_m : N ≤ m := by + dsimp [m] + exact Nat.le_add_right N r + have hn_m : n < m := by + have hNentry_le_m : Nentry ≤ m := by + dsimp [m, N] + omega + exact lt_of_lt_of_le hn_entry hNentry_le_m + have hcard_eq : D.card = (3 ^ d) ^ (m - n) := by + simpa [D] using + descendantsAtScale_originCube_nat_card + (d := d) (m := m) (n := n) (le_of_lt hn_m) + have hmn_le : m - n ≤ Nentry + q + r := by + dsimp [m, N] + omega + have hw_ge_one : 1 ≤ w := by + dsimp [w] + have hpow : 0 < 3 ^ d := pow_pos (by norm_num : (0 : ℕ) < 3) d + exact_mod_cast (Nat.succ_le_of_lt hpow) + have hD_weight : (D.card : ℝ) ≤ w ^ Nentry * w ^ q * w ^ r := by + have hpow_le : w ^ (m - n) ≤ w ^ (Nentry + q + r) := + pow_le_pow_right₀ hw_ge_one hmn_le + have hsplit : w ^ (Nentry + q + r) = w ^ Nentry * w ^ q * w ^ r := by + rw [pow_add, pow_add] + calc + (D.card : ℝ) = w ^ (m - n) := by + rw [hcard_eq] + norm_num [w] + _ ≤ w ^ (Nentry + q + r) := hpow_le + _ = w ^ Nentry * w ^ q * w ^ r := hsplit + have hlam_lower : A * ρ ^ r ≤ lam := by + have hmN : (m - N : ℕ) = r := by + dsimp [m] + rw [Nat.add_sub_cancel_left] + have hmn_decomp : + (m - n : ℕ) = q + r + (Nentry - n) := by + dsimp [m, N] + omega + have hentry_gap_nonneg : 0 ≤ t * ((Nentry - n : ℕ) : ℝ) := by + positivity + have hpow_le : + (3 : ℝ) ^ (t * (q : ℝ) + (t - α) * (r : ℝ)) ≤ T := by + dsimp [T, x] + rw [hmN, hmn_decomp] + refine Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) ?_ + have hexp : + -(α * (r : ℝ) - + t * ((q + r + (Nentry - n) : ℕ) : ℝ)) = + t * (q : ℝ) + (t - α) * (r : ℝ) + + t * ((Nentry - n : ℕ) : ℝ) := by + norm_num [Nat.cast_add] + ring + rw [hexp] + linarith + have hAρ_eq : + A * ρ ^ r = + (3 : ℝ) ^ (t * (q : ℝ) + (t - α) * (r : ℝ)) / scale := by + have hρpow : + ρ ^ r = (3 : ℝ) ^ ((t - α) * (r : ℝ)) := by + dsimp [ρ] + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + dsimp [A] + rw [hρpow] + calc + (3 : ℝ) ^ (t * (q : ℝ)) / scale * + (3 : ℝ) ^ ((t - α) * (r : ℝ)) + = + ((3 : ℝ) ^ (t * (q : ℝ)) * + (3 : ℝ) ^ ((t - α) * (r : ℝ))) / scale := by + ring + _ = (3 : ℝ) ^ (t * (q : ℝ) + (t - α) * (r : ℝ)) / scale := by + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + dsimp [lam] + rw [hAρ_eq] + exact div_le_div_of_nonneg_right hpow_le hscale_pos.le + have hlam_one : 1 ≤ lam := + hA_one.trans (by + have hρ_pow_one : 1 ≤ ρ ^ r := one_le_pow₀ hρ_gt.le + have hA_le_Aρ : A ≤ A * ρ ^ r := by + calc + A = A * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul_of_nonneg_left hρ_pow_one hA_pos.le + exact hA_le_Aρ.trans hlam_lower) + have hbad : + P.real (badPairEvent H t α N m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) := by + simpa [H, K, S, scale, T, lam, x, D, N, m] using + hpair (t := t) (αbad := α) hP hStruct hΓ hσ_eq hparams + (N0 := 0) (q := N) (m := m) (n := n) + hn_m hN_le_m hlam_one + have hexp : + Real.exp (-(lam ^ σ)) ≤ Real.exp (-((A * ρ ^ r) ^ σ)) := by + have hpow : (A * ρ ^ r) ^ σ ≤ lam ^ σ := + Real.rpow_le_rpow hAρ_nonneg hlam_lower hσ_pos.le + exact Real.exp_le_exp.mpr (by linarith) + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + have htail : + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) ≤ + ((S.card : ℝ) * w ^ Nentry * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by + have hDexp : + (D.card : ℝ) * Real.exp (-(lam ^ σ)) ≤ + (w ^ Nentry * w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ σ)) := + mul_le_mul hD_weight hexp (by positivity) (by positivity) + calc + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ σ))) + ≤ (S.card : ℝ) * + ((w ^ Nentry * w ^ q * w ^ r) * + Real.exp (-((A * ρ ^ r) ^ σ))) := + mul_le_mul_of_nonneg_left hDexp hS_nonneg + _ = + ((S.card : ℝ) * w ^ Nentry * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ σ))) := by ring + exact hbad.trans htail + +/-- Sum the small-bottom fixed-pair row estimate over the rows and the finite +bottom band. -/ +theorem measureReal_smallBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {t α : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {Nentry q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let A : ℝ := (3 : ℝ) ^ (t * (q : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (t - α) + let N : ℕ := Nentry + q + 0 < t → + α < t → + 1 ≤ A → + P.real (smallBottomBadScaleEvent H Nentry t α N) ≤ + ((Nentry : ℝ) * ((S.card : ℝ) * w ^ Nentry * w ^ q)) * + (Real.exp (-(A ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + obtain ⟨Ccrude, hCcrude, hrow⟩ := + measureReal_smallBottomPairEvent_quenchedProbeEnvelope_le_weighted_row + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro t α P hP hStruct hΓ hσ_eq hparams Nentry q + dsimp only + intro ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let H : ℕ → ℕ → RegCoeffField d → ℝ := quenchedProbeEnvelope hP hStruct + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let A : ℝ := (3 : ℝ) ^ (t * (q : ℝ)) / scale + let ρ : ℝ := (3 : ℝ) ^ (t - α) + let N : ℕ := Nentry + q + let C : ℝ := (S.card : ℝ) * w ^ Nentry * w ^ q + let E : ℕ → Fin Nentry → Set (RegCoeffField d) := + fun r j => badPairEvent H t α N (N + r) j.val + have hC_nonneg : 0 ≤ C := by dsimp [C]; positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - α := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hsubset : + smallBottomBadScaleEvent H Nentry t α N ⊆ + ⋃ r : ℕ, ⋃ j : Fin Nentry, E r j := by + simpa [E, N] using + smallBottomBadScaleEvent_subset_rows + (H := H) (Nentry := Nentry) (q := q) (t := t) (α := α) + calc + P.real (smallBottomBadScaleEvent H Nentry t α N) + ≤ P.real (⋃ r : ℕ, ⋃ j : Fin Nentry, E r j) := + measureReal_mono (μ := P) hsubset + _ ≤ ((Nentry : ℝ) * C) * + (Real.exp (-(A ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := + measureReal_iUnion_constRows_le_weighted_exp_kernel + (μ := P) (Q := Nentry) (E := E) + hC_nonneg hw_pos hA_one hρ_gt hσ_pos + (by + intro r j + simpa [E, H, K, S, w, scale, A, ρ, N, C] using + hrow (t := t) (α := α) hP hStruct hΓ hσ_eq hparams + (Nentry := Nentry) (q := q) (r := r) (n := j.val) + ht hαt j.isLt hA_one) + _ = + ((Nentry : ℝ) * ((S.card : ℝ) * w ^ Nentry * w ^ q)) * + (Real.exp (-(A ^ σ)) * + weightedGeometricExpKernelConst w (ρ ^ σ)) := by + dsimp [C] + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomTail.lean new file mode 100644 index 0000000000..ed97a2d313 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/SmallBottomTail.lean @@ -0,0 +1,455 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.SmallBottomBand +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds + +/-! # Small Bottom Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory + +/-! +# Tail collapse for the small-bottom band + +This file converts the weighted kernel bound for the finite band +`n < Nentry` into the same stretched-exponential bad-scale tail used by the +shifted large-scale branch. +-/ + +noncomputable section + +variable {Ω : Type*} + +/-- The small-bottom bad-scale events are antitone in the bad scale. -/ +theorem smallBottomBadScaleEvent_antitone + {H : ℕ → ℕ → Ω → ℝ} {Nentry : ℕ} {t α : ℝ} + (hα : 0 ≤ α) {N K : ℕ} (hNK : N ≤ K) : + smallBottomBadScaleEvent H Nentry t α K ⊆ + smallBottomBadScaleEvent H Nentry t α N := by + intro ω hω + rcases hω with ⟨m, n, hn_entry, hnm, hKm, hbad⟩ + refine ⟨m, n, hn_entry, hnm, hNK.trans hKm, ?_⟩ + have hsub_le : m - K ≤ m - N := Nat.sub_le_sub_left hNK m + have hcast_le : ((m - K : ℕ) : ℝ) ≤ ((m - N : ℕ) : ℝ) := by + exact_mod_cast hsub_le + have hexp_le : + -α * ((m - N : ℕ) : ℝ) ≤ -α * ((m - K : ℕ) : ℝ) := by + exact mul_le_mul_of_nonpos_left hcast_le (by linarith) + have hrhs_le : + (3 : ℝ) ^ (-α * ((m - N : ℕ) : ℝ)) ≤ + (3 : ℝ) ^ (-α * ((m - K : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + exact lt_of_le_of_lt hrhs_le hbad + +/-- Tail form of small-bottom monotonicity. -/ +theorem badTailEvent_smallBottomBadScaleEvent_subset + [MeasurableSpace Ω] + {H : ℕ → ℕ → Ω → ℝ} {Nentry : ℕ} {t α : ℝ} + (hα : 0 ≤ α) {N : ℕ} : + badTailEvent (smallBottomBadScaleEvent H Nentry t α) N ⊆ + smallBottomBadScaleEvent H Nentry t α N := by + intro ω hω + rcases hω with ⟨K, hNK, hK⟩ + exact smallBottomBadScaleEvent_antitone + (H := H) (Nentry := Nentry) (t := t) (α := α) hα hNK hK + +/-- Denominator which rewrites the crude small-bottom `sigma * t` tail in the +common interpolated exponent. -/ +noncomputable def smallBottomTailDenominator (scale η σ : ℝ) : ℝ := + (max 1 scale) ^ (σ / η) + +theorem smallBottomTailDenominator_pos {scale η σ : ℝ} : + 0 < smallBottomTailDenominator scale η σ := by + have hbase : 0 < max 1 scale := + lt_of_lt_of_le zero_lt_one (le_max_left 1 scale) + exact Real.rpow_pos_of_pos hbase _ + +theorem one_le_smallBottomTailDenominator + {scale η σ : ℝ} (hη : 0 < η) (hσ : 0 ≤ σ) : + 1 ≤ smallBottomTailDenominator scale η σ := by + have hbase : 1 ≤ max 1 scale := le_max_left 1 scale + have hexp : 0 ≤ σ / η := div_nonneg hσ hη.le + have hpow : + (max 1 scale) ^ (0 : ℝ) ≤ (max 1 scale) ^ (σ / η) := + Real.rpow_le_rpow_of_exponent_le hbase hexp + simpa [smallBottomTailDenominator] using hpow + +theorem scale_rpow_le_smallBottomTailDenominator_pow_eta + {scale η σ : ℝ} (hscale : 0 < scale) (hη : 0 < η) + (hσ : 0 < σ) : + scale ^ σ ≤ (smallBottomTailDenominator scale η σ) ^ η := by + have hbase : 0 < max 1 scale := + lt_of_lt_of_le zero_lt_one (le_max_left 1 scale) + have hterm_nonneg : 0 ≤ (max 1 scale) ^ (σ / η) := + (Real.rpow_pos_of_pos hbase _).le + have hpow_eq : + ((max 1 scale) ^ (σ / η)) ^ η = (max 1 scale) ^ σ := by + rw [← Real.rpow_mul hbase.le] + congr 1 + field_simp [hη.ne'] + have hscale_le : scale ≤ max 1 scale := le_max_right 1 scale + have hscale_pow : scale ^ σ ≤ (max 1 scale) ^ σ := + Real.rpow_le_rpow hscale.le hscale_le hσ.le + simpa [smallBottomTailDenominator, hpow_eq] using hscale_pow + +/-- The small-bottom denominator converts the crude `sigma * t` scale into +the common interpolated exponent. -/ +theorem smallBottomTailDenominator_rpow_le_crude_scale + {scale η σ t : ℝ} {q : ℕ} + (hscale : 0 < scale) (hη : 0 < η) (hσ : 0 < σ) + (hη_le : η ≤ σ * t) : + (((3 : ℝ) ^ (q : ℝ) / smallBottomTailDenominator scale η σ) ^ η) ≤ + (((3 : ℝ) ^ (t * (q : ℝ)) / scale) ^ σ) := by + let Den : ℝ := smallBottomTailDenominator scale η σ + let X : ℝ := η * (q : ℝ) + let Y : ℝ := σ * t * (q : ℝ) + have hDen_pos : 0 < Den := by + simpa [Den] using + smallBottomTailDenominator_pos (scale := scale) (η := η) (σ := σ) + have hDen_pow : + scale ^ σ ≤ Den ^ η := by + simpa [Den] using + scale_rpow_le_smallBottomTailDenominator_pow_eta + (scale := scale) (η := η) (σ := σ) hscale hη hσ + have hXY : X ≤ Y := by + have hq : 0 ≤ (q : ℝ) := by positivity + have hmul := mul_le_mul_of_nonneg_right hη_le hq + dsimp [X, Y] + nlinarith + have hgeneric := + rpow_three_div_den_rpow_le_of_exponent_le + (X := X) (Y := Y) (D := scale) (Den := Den) + (η := η) (γ := σ) + hη hσ hscale hDen_pos hDen_pow hXY + convert hgeneric using 1 + · dsimp [Den, X] + congr 2 + field_simp [hη.ne'] + · dsimp [Y] + congr 2 + field_simp [hσ.ne'] + +/-- Quantitative small-bottom bad-tail bound with the fixed prefactor-growth +threshold chosen before the law. -/ +theorem exists_quantitative_threshold_smallBottomBadTail_quenchedProbeEnvelope_le_interpolated_tail + {d : ℕ} [NeZero d] {σ : ℝ} + (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {t α : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + 0 ≤ α → + α < t → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∀ {Nentry : ℕ}, + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := + weightedGeometricExpKernelConst w (ρsmall ^ σ) + let pref : ℝ := (Nentry : ℝ) * (S.card : ℝ) * w ^ Nentry + let M : ℝ := max 1 (max 0 (pref * Ksmall)) + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + ∀ q : ℕ, Q ≤ q → + P.real + (badTailEvent + (smallBottomBadScaleEvent H Nentry t α) + (Nentry + q)) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + obtain ⟨Ccrude, hCcrude, hkernel⟩ := + measureReal_smallBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel + (d := d) (σ := σ) hσ_pos params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro t α + dsimp only + intro ht hα_nonneg hαt + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let η : ℝ := finiteQuenchedTailExponent d σ t + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + have hρgap_gt : 1 < ρgap := by + dsimp [ρgap] + exact Real.one_lt_rpow (by norm_num : (1 : ℝ) < 3) hη_pos + have hW_one : 1 ≤ W := by + dsimp [W] + exact le_max_left 1 w + have hC₀_nonneg : 0 ≤ C₀ := by + have hlogW_nonneg : 0 ≤ Real.log W := Real.log_nonneg hW_one + dsimp [C₀] + linarith + obtain ⟨R, hR⟩ := + linear_le_exp_linear_eventually + (C := C₀) (γ := Real.log ρgap / 2) + hC₀_nonneg (by + have hlogρ_pos : 0 < Real.log ρgap := Real.log_pos hρgap_gt + positivity) + refine ⟨R, ?_, ?_⟩ + · simpa [K, S, η, w, W, ρgap, C₀] using hR + intro P hP hStruct hΓ hσ_eq hparams Nentry + let : IsProbabilityMeasure P := hP.isProbability + let H : ℕ → ℕ → RegCoeffField d → ℝ := + quenchedProbeEnvelope hP hStruct + let scale : ℝ := K * (Ccrude * hΓ.thetaHat ^ (2 : ℕ)) + let ρsmall : ℝ := (3 : ℝ) ^ (t - α) + let Ksmall : ℝ := weightedGeometricExpKernelConst w (ρsmall ^ σ) + let pref : ℝ := (Nentry : ℝ) * (S.card : ℝ) * w ^ Nentry + let M : ℝ := max 1 (max 0 (pref * Ksmall)) + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + intro q hQq + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos hK_pos (mul_pos hCcrude (pow_pos hΓ.thetaHat_pos 2)) + have hBlead_pos : 0 < Blead := by + simpa [Blead] using + smallBottomTailDenominator_pos + (scale := scale) (η := η) (σ := σ) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hρsmall_gt : 1 < ρsmall := by + have hgap : 0 < t - α := sub_pos.mpr hαt + dsimp [ρsmall] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - α) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hKsmall_pos : 0 < Ksmall := by + dsimp [Ksmall] + exact weightedGeometricExpKernelConst_pos + (w := w) (R := ρsmall ^ σ) hw_pos + (Real.one_lt_rpow hρsmall_gt hσ_pos) + have hpref_nonneg : 0 ≤ pref := by + dsimp [pref] + positivity + have hM_one : 1 ≤ M := by + dsimp [M] + exact le_max_left 1 _ + have hq_pref : Qpref ≤ q := (le_max_left Qpref Qlead).trans hQq + have hq_lead : Qlead ≤ q := (le_max_right Qpref Qlead).trans hQq + have hqM : + Nat.ceil (max 0 (Real.log M)) ≤ q := + (le_max_left _ _).trans hq_pref + have hqR : R ≤ q := + (le_max_left R + (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_pref) + have hqc : + Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap) ≤ q := + (le_max_right R + (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))).trans + ((le_max_right _ _).trans hq_pref) + have hlead_one : 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead := by + simpa [Blead] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := (1 : ℝ)) (O := (0 : ℝ)) (D := Blead) (q := q) + (by norm_num) hBlead_pos + (by simpa [Qlead] using hq_lead) + have hη_le : η ≤ σ * t := by + have hb_pos : 0 < (d : ℝ) / 2 := by + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + simpa [η, finiteQuenchedTailExponent] using + interpolatedQuenchedTailExponent_le_sigma_mul_t + (b := (d : ℝ) / 2) (σ := σ) (t := t) + hb_pos hσ_pos ht + let Aold : ℝ := (3 : ℝ) ^ (t * (q : ℝ)) / scale + let Alead : ℝ := ((3 : ℝ) ^ (q : ℝ) / Blead) ^ η + let Atail : ℝ := ((3 : ℝ) ^ (q : ℝ) / Btail) ^ η + have hAlead_to_old : Alead ≤ Aold ^ σ := by + simpa [Aold, Alead, Blead] using + smallBottomTailDenominator_rpow_le_crude_scale + (scale := scale) (η := η) (σ := σ) (t := t) (q := q) + hscale_pos hη_pos hσ_pos hη_le + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + hscale_pos.le + have hAold_one : 1 ≤ Aold := by + have hAlead_one : 1 ≤ Alead := by + dsimp [Alead] + exact Real.one_le_rpow hlead_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg hσ_pos + (hAlead_one.trans hAlead_to_old) + have hkernel_q : + P.real (smallBottomBadScaleEvent H Nentry t α (Nentry + q)) ≤ + ((Nentry : ℝ) * ((S.card : ℝ) * w ^ Nentry * w ^ q)) * + (Real.exp (-(Aold ^ σ)) * Ksmall) := by + simpa [K, H, S, w, scale, Aold, ρsmall, Ksmall] using + hkernel (t := t) (α := α) hP hStruct hΓ hσ_eq hparams + (Nentry := Nentry) (q := q) ht hαt hAold_one + have htail_subset : + badTailEvent (smallBottomBadScaleEvent H Nentry t α) (Nentry + q) ⊆ + smallBottomBadScaleEvent H Nentry t α (Nentry + q) := + badTailEvent_smallBottomBadScaleEvent_subset + (H := H) (Nentry := Nentry) (t := t) (α := α) hα_nonneg + have htail_mono : + P.real + (badTailEvent + (smallBottomBadScaleEvent H Nentry t α) (Nentry + q)) ≤ + P.real (smallBottomBadScaleEvent H Nentry t α (Nentry + q)) := + measureReal_mono (μ := P) htail_subset + have hprefix_le : + pref * Ksmall * w ^ q ≤ M * (((q : ℝ) + 1) * W ^ q) := by + have hprefK_nonneg : 0 ≤ pref * Ksmall := + mul_nonneg hpref_nonneg hKsmall_pos.le + have hprefK_le_M : pref * Ksmall ≤ M := by + calc + pref * Ksmall ≤ max 0 (pref * Ksmall) := + le_max_right 0 (pref * Ksmall) + _ ≤ M := by + dsimp [M] + exact le_max_right 1 _ + have hwW : w ≤ W := by + dsimp [W] + exact le_max_right 1 w + have hwq_le : w ^ q ≤ W ^ q := + pow_le_pow_left₀ hw_pos.le hwW q + have hWq_nonneg : 0 ≤ W ^ q := by positivity + have hleft : + pref * Ksmall * w ^ q ≤ M * W ^ q := + mul_le_mul hprefK_le_M hwq_le + (pow_nonneg hw_pos.le q) (zero_le_one.trans hM_one) + have hqplus_one : 1 ≤ (q : ℝ) + 1 := by + have hq_nonneg : 0 ≤ (q : ℝ) := by positivity + linarith + have hright : + M * W ^ q ≤ M * (((q : ℝ) + 1) * W ^ q) := by + have hfactor : W ^ q ≤ ((q : ℝ) + 1) * W ^ q := by + calc + W ^ q = 1 * W ^ q := by ring + _ ≤ ((q : ℝ) + 1) * W ^ q := + mul_le_mul_of_nonneg_right hqplus_one hWq_nonneg + exact mul_le_mul_of_nonneg_left hfactor (zero_le_one.trans hM_one) + exact hleft.trans hright + have hc_pos : 0 < cgap := by + simpa [cgap, Btail] using + inv_rpow_sub_pos_of_lt hBlead_pos hBtail_pos hη_pos hBlead_lt_Btail + have hpref_gap : + M * (((q : ℝ) + 1) * W ^ q) ≤ Real.exp (Alead - Atail) := by + have hpref_exp : + M * (((q : ℝ) + 1) * W ^ q) ≤ + Real.exp (cgap * ρgap ^ q) := + linear_prefactor_le_exp_const_mul_pow_of_large + (M := M) (W := W) (C₀ := C₀) (c := cgap) + (ρ := ρgap) (R := R) (q := q) + hM_one hW_one hc_pos hρgap_gt + (le_rfl : 2 + Real.log W ≤ C₀) hR hqM hqR hqc + have hgap : + cgap * ρgap ^ q ≤ Alead - Atail := by + simpa [Alead, Atail, cgap, ρgap] using + geometric_gap_le_rpow_three_nat_div_gap + (Blead := Blead) (Btail := Btail) (η := η) + (c := cgap) (ρ := ρgap) (q := q) + hBlead_pos hBtail_pos + (le_rfl : cgap ≤ Blead ^ (-η) - Btail ^ (-η)) + (le_rfl : ρgap ≤ (3 : ℝ) ^ η) hc_pos.le + (le_of_lt (lt_trans zero_lt_one hρgap_gt)) + exact hpref_exp.trans (Real.exp_le_exp.mpr hgap) + have hexp_old : + Real.exp (-(Aold ^ σ)) ≤ Real.exp (-Alead) := + Real.exp_le_exp.mpr (by linarith) + have hmeasure_tail : + P.real + (badTailEvent + (smallBottomBadScaleEvent H Nentry t α) (Nentry + q)) ≤ + M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := by + calc + P.real + (badTailEvent + (smallBottomBadScaleEvent H Nentry t α) (Nentry + q)) + ≤ P.real (smallBottomBadScaleEvent H Nentry t α (Nentry + q)) := + htail_mono + _ ≤ ((Nentry : ℝ) * ((S.card : ℝ) * w ^ Nentry * w ^ q)) * + (Real.exp (-(Aold ^ σ)) * Ksmall) := + hkernel_q + _ = pref * Ksmall * w ^ q * Real.exp (-(Aold ^ σ)) := by + dsimp [pref] + ring + _ ≤ pref * Ksmall * w ^ q * Real.exp (-Alead) := + mul_le_mul_of_nonneg_left hexp_old + (by positivity : 0 ≤ pref * Ksmall * w ^ q) + _ ≤ M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hprefix_le (Real.exp_pos _).le + calc + P.real + (badTailEvent + (smallBottomBadScaleEvent H Nentry t α) (Nentry + q)) + ≤ M * (((q : ℝ) + 1) * W ^ q) * Real.exp (-Alead) := + hmeasure_tail + _ ≤ Real.exp (Alead - Atail) * Real.exp (-Alead) := + mul_le_mul_of_nonneg_right hpref_gap (Real.exp_pos _).le + _ = Real.exp (-Atail) := by + rw [← Real.exp_add] + ring_nf + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleMinimalQuantitative.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleMinimalQuantitative.lean new file mode 100644 index 0000000000..f757ac3a1c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleMinimalQuantitative.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailFinal + +/-! # Uniform Bad Scale Minimal Quantitative -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Quantitative minimal scale from the uniform-endpoint bad-scale tail + +This is the `Γ∞` endpoint analogue of the finite-`σ` quantitative minimal +scale. The bad-scale tail has exponent `d`, so the resulting random scale is +`O_{Γ_d}`. +-/ + +noncomputable section + +/-- The uniform-endpoint bad-scale tail yields the shifted localized estimate +above an explicit quantitative minimal scale. The deterministic prefactor +threshold is selected before the probability law. -/ +theorem exists_quantitative_shifted_quenchedLocalizedEstimate_uniformEndpoint + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let W : ℝ := max 1 w + let M : ℝ := max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + IsBigO P (gammaSigma η) X + (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hbad⟩ := + exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad K S b L ctop η w ρtop ρbottom Cbottom Ctop Kbottom W M ρgap C₀ + ht hα_nonneg hαt hαb hαharm hαa htb + classical + obtain ⟨R, hR, hbadR⟩ := + hbad (t := t) (αbad := αbad) + ht hα_nonneg hαt hαb hαharm hαa htb + refine ⟨R, ?_, ?_⟩ + · simpa [K, S, b, L, ctop, η, w, ρtop, ρbottom, + Cbottom, Ctop, Kbottom, W, M, ρgap, C₀] using hR + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hDen_pos : 0 < Den := by + simpa [Den] using + uniformEndpointHighDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hBlead_pos : 0 < Blead := by + dsimp [Blead] + exact mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (L + 1)) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hB : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 Btail + have hQ : + ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + exact hbadR hP hStruct hInf hparams + have htail : + ∀ N : ℕ, Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + intro N hQN + have hmono : + P.real (badTailEvent Bad N) ≤ P.real (Bad N) := + measureReal_mono (μ := P) + (badTailEvent_badScaleEvent_subset + (H := Hshift) (t := t) (α := αbad) hα_nonneg) + have hscale : + P.real (Bad N) ≤ + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) := by + simpa [Bad] using hQ N hQN + have hcompare : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + simpa [B] using + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := N) (B := Btail) (η := η) + hBtail_pos hη_pos + exact hmono.trans (hscale.trans hcompare) + have hlocalized := + quenchedLocalizedEstimate_shifted_from_badTailBound + hP hStruct (hInf.toGammaSigma 1 zero_lt_one) + (t := t) (α := αbad) (η := η) (B := B) + (Nentry := N0) (Nmin := Q) + hη_pos hB (by simpa [Hshift, Bad, B] using htail) + change + IsBigO P (gammaSigma η) (quenchedMinimalScale Q Bad) + (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ quenchedMinimalScale Q Bad aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + quenchedMinimalScale Q Bad aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / quenchedMinimalScale Q Bad aω) ^ (-αbad) + simpa [Hshift, Bad] using hlocalized + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTail.lean new file mode 100644 index 0000000000..410222824f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTail.lean @@ -0,0 +1,517 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointSynchronized +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailAssembly + +/-! # Uniform Bad Scale Tail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Uniform endpoint bad-scale tail + +This file assembles the `Γ∞` endpoint bad-scale estimate with synchronized +constants. The endpoint exponent is `d`, not the finite-`σ` interpolation. +-/ + +noncomputable section + +/-- Endpoint high-top component estimate with the raw high bad-pair bound +supplied externally. -/ +theorem measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity_of_badPair_bound + {d : ℕ} [NeZero d] {Cfluct Centry a : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (_hCentry : 0 < Centry) (ha : 0 < a) + (hraw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = (2 : ℝ) → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min (2 : ℝ) 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 0 < Den → + Dhigh ^ (2 : ℝ) ≤ Den ^ η → + 1 ≤ A → + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) := by + intro t αbad Den P hP hStruct hInf hparams q + dsimp only + intro ht hαt hαb hαharm hDen hDen_high hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let hΓ2 := hInf.toGammaSigma 2 (by norm_num : (0 : ℝ) < 2) + have hΓ2_params : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using hparams + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Aold : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / Dhigh + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hInf.thetaHat_pos 2) + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDhigh_pos.le + let X : ℝ := η * ((q : ℝ) - (L + 1)) + let Y : ℝ := (2 : ℝ) * (b * (q : ℝ) - b * (L + 1)) + have hXY : X ≤ Y := by + dsimp [X, Y, η, b] + ring_nf + exact le_rfl + have hA_to_old : A ^ η ≤ Aold ^ (2 : ℝ) := by + have hgeneric := + rpow_three_div_den_rpow_le_of_exponent_le + (X := X) (Y := Y) (D := Dhigh) (Den := Den) + (η := η) (γ := (2 : ℝ)) + hη_pos (by norm_num : (0 : ℝ) < (2 : ℝ)) + hDhigh_pos hDen + (by simpa [Dhigh, η] using hDen_high) hXY + have hX_div : X / η = (q : ℝ) - (L + 1) := by + dsimp [X] + field_simp [hη_pos.ne'] + have hY_div : Y / (2 : ℝ) = b * (q : ℝ) - b * (L + 1) := by + dsimp [Y] + norm_num + have hA_eq : A = (3 : ℝ) ^ (X / η) / Den := by + dsimp [A] + rw [hX_div] + have hAold_eq : Aold = (3 : ℝ) ^ (Y / (2 : ℝ)) / Dhigh := by + dsimp [Aold] + rw [hY_div] + simpa [hA_eq, hAold_eq] using hgeneric + have hAold_one : 1 ≤ Aold := by + have hA_pow_one : 1 ≤ A ^ η := Real.one_le_rpow hA_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg + (by norm_num : (0 : ℝ) < (2 : ℝ)) (hA_pow_one.trans hA_to_old) + have htop_old : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(Aold ^ (2 : ℝ))) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) := by + have htop := + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := (2 : ℝ)) (Cfluct := Cfluct) + (Centry := Centry) (a := a) + (by norm_num : (0 : ℝ) < (2 : ℝ)) + params hCfluct _hCentry ha hraw + (t := t) (αbad := αbad) + hP hStruct hΓ2 rfl hΓ2_params (q := q) + simpa [K, N0, Hshift, S, b, L, ctop, η, w, Dhigh, Aold, ρtop, + hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using! + htop ht hαt hαb hαharm hAold_one + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hc_pos : 0 < ctop := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + have hbα : 0 < b - αbad := sub_pos.mpr hαb + have hfactor : 0 < 1 + b / a := by positivity + have hthird : 0 < (t - αbad) * (1 + b / a) := + mul_pos hgap hfactor + have hfourth : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + dsimp [ctop] + exact lt_min hgap (lt_min hbα (lt_min hthird hfourth)) + have hρ_gt : 1 < ρtop := by + dsimp [ρtop] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ ctop := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hkernel_nonneg : + 0 ≤ weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) := + (weightedLinearExpKernelConst_pos + (w := w) (R := ρtop ^ (2 : ℝ)) hw_pos + (Real.one_lt_rpow hρ_gt (by norm_num : (0 : ℝ) < (2 : ℝ)))).le + have hexp : + Real.exp (-(Aold ^ (2 : ℝ))) ≤ Real.exp (-(A ^ η)) := + Real.exp_le_exp.mpr (by linarith [hA_to_old]) + have hinner : + Real.exp (-(Aold ^ (2 : ℝ))) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) ≤ + Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) := + mul_le_mul_of_nonneg_right hexp hkernel_nonneg + exact htop_old.trans + (mul_le_mul_of_nonneg_left hinner (by positivity)) + +/-- Synchronized endpoint bad-scale component sum before deterministic +threshold selection. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_component_sum + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let Acrude : ℝ := (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) ≤ Den ^ η → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hhighRaw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := (2 : ℝ)) (by norm_num) params + obtain ⟨Ccrude, hCcrude, hzeroRaw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_eq_zero_of_gammaInfinity + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hInf hparams q + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb hDen + hDen_top hDen_bottom hA_one hAcrude_one hq_large + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let Acrude : ℝ := (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have htop : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) := by + simpa [K, N0, Hshift, S, b, L, ctop, η, w, Dhigh, A, ρtop] using + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity_of_badPair_bound + (d := d) (Cfluct := Cfluct) (Centry := Centry) (a := a) + params hCfluct hCentry ha hhighRaw + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hInf hparams (q := q) + ht hαt hαb hαharm hDen hDen_top hA_one + have hbottom : + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) := by + simpa [K, N0, Hshift, S, b, L, η, w, Dhigh, Dcrude, A, ρbottom, + Cbottom] using + measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity_of_row_bound + (d := d) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) params + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity_of_bounds + (d := d) (Cfluct := Cfluct) (Ccrude := Ccrude) + (Centry := Centry) (a := a) + params hCfluct hCcrude hCentry ha + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high_gammaInfinity_of_badPair_bound + (d := d) (Cfluct := Cfluct) (Centry := Centry) (a := a) + params hCfluct hCentry ha hhighRaw) + (measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_eq_zero_of_crudeA_one_gammaInfinity_of_badPair_zero + (d := d) (Ccrude := Ccrude) params hCcrude hzeroRaw)) + (t := t) (αbad := αbad) (Den := Den) + hP hStruct hInf hparams (q := q) + ht hαt htb hDen hDen_bottom hA_one + have hcrude : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ 0 := by + have hz : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) = 0 := by + simpa [K, N0, Hshift, L, Acrude, Dcrude] using + (measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity_of_pair_zero + (d := d) (Ccrude := Ccrude) params + (measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity_of_badPair_zero + (d := d) (Ccrude := Ccrude) params hCcrude hzeroRaw)) + hP hStruct hInf hparams (q := q) ha ht hαt hAcrude_one + rw [hz] + have hsum := + measureReal_badScaleEvent_le_of_component_kernels_and_crudeTop_cutoff + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (Rht := + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)))) + (Rhb := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η))) + (Rcb := 0) + ha hα_nonneg hαt hαa + (by simpa [K, L] using hq_large) + htop hbottom hcrude + linarith + +/-- Endpoint component sum after selecting the common high denominator. The +crude-bottom cutoff remains an explicit deterministic side condition. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_selected_denominator + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let Acrude : ℝ := (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + 1 ≤ A → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + P.real (badScaleEvent Hshift t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) + + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρbottom ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hcomp⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_component_sum + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hInf hparams q + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb hA_one hAcrude_one hq_large + let K : ℝ := quenchedProbeEnvelopeConst d + let b : ℝ := (d : ℝ) / 2 + let η : ℝ := ((d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hInf.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hInf.thetaHat_pos 2) + have hDen_pos : 0 < Den := by + simpa [Den] using + uniformEndpointHighDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hη_one : 1 ≤ η := by + dsimp [η] + exact_mod_cast Nat.succ_le_of_lt (Nat.pos_of_ne_zero (NeZero.ne d)) + have hDen_top : + Dhigh ^ (2 : ℝ) ≤ Den ^ η := by + simpa [Den, η] using + uniformEndpointHighDenominator_dom_top + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + hDhigh_pos.le ht (by simpa [b, η] using htb) hη_one + have hDen_bottom : + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η := by + simpa [Den, η] using + uniformEndpointHighDenominator_dom_bottom + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) hη_one + simpa [K, b, η, Dhigh, Dcrude, Den] using + hcomp (t := t) (αbad := αbad) (Den := Den) + hP hStruct hInf hparams (q := q) + ht hα_nonneg hαt hαb hαharm hαa htb hDen_pos + hDen_top hDen_bottom hA_one hAcrude_one hq_large + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailCollapse.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailCollapse.lean new file mode 100644 index 0000000000..635b64bed8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailCollapse.lean @@ -0,0 +1,395 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTail +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleThresholds + +/-! # Uniform Bad Scale Tail Collapse -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Collapse of the uniform endpoint bad-scale tail + +This file turns the synchronized endpoint component estimate into one +stretched-exponential bad-scale tail with exponent `d`, up to explicit +deterministic threshold and prefactor-gap conditions. +-/ + +noncomputable section + +theorem two_exp_terms_le_exp_of_prefactor_gap + {c₁ c₂ A T₀ T : ℝ} + (hc₁ : 0 ≤ c₁) (hc₂ : 0 ≤ c₂) + (hA : T₀ ≤ A) + (hpref : c₁ + c₂ ≤ Real.exp (T₀ - T)) : + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) ≤ Real.exp (-T) := by + have hEA : Real.exp (-A) ≤ Real.exp (-T₀) := + Real.exp_le_exp.mpr (by linarith) + have hsum : + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) ≤ + (c₁ + c₂) * Real.exp (-T₀) := by + calc + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + ≤ c₁ * Real.exp (-T₀) + c₂ * Real.exp (-T₀) := by + nlinarith [mul_le_mul_of_nonneg_left hEA hc₁, + mul_le_mul_of_nonneg_left hEA hc₂] + _ = (c₁ + c₂) * Real.exp (-T₀) := by ring + calc + c₁ * Real.exp (-A) + c₂ * Real.exp (-A) + ≤ (c₁ + c₂) * Real.exp (-T₀) := hsum + _ ≤ Real.exp (T₀ - T) * Real.exp (-T₀) := + mul_le_mul_of_nonneg_right hpref (Real.exp_pos _).le + _ = Real.exp (-T) := by + rw [← Real.exp_add] + congr 1 + ring + +theorem measureReal_badScaleEvent_le_exp_tail_of_uniformEndpoint_component_sum + {Ω : Type*} [MeasurableSpace Ω] + {μ : Measure Ω} [IsFiniteMeasure μ] + {H : ℕ → ℕ → Ω → ℝ} {t α : ℝ} {q : ℕ} + {S qPlus Cbottom wq Ktop Kbottom A Alead Atail η : ℝ} + (hcomponent : + μ.real (badScaleEvent H t α q) ≤ + S * (Real.exp (-(A ^ η)) * Ktop) + + qPlus * (Cbottom * wq) * + (Real.exp (-(A ^ η)) * Kbottom)) + (hAlead_A : Alead ≤ A ^ η) + (hpref : + max 0 (S * Ktop) + + max 0 (qPlus * (Cbottom * wq) * Kbottom) ≤ + Real.exp (Alead - Atail)) : + μ.real (badScaleEvent H t α q) ≤ Real.exp (-Atail) := by + have hcomponent_coeff : + μ.real (badScaleEvent H t α q) ≤ + (S * Ktop) * Real.exp (-(A ^ η)) + + (qPlus * (Cbottom * wq) * Kbottom) * Real.exp (-(A ^ η)) := by + calc + μ.real (badScaleEvent H t α q) + ≤ S * (Real.exp (-(A ^ η)) * Ktop) + + qPlus * (Cbottom * wq) * + (Real.exp (-(A ^ η)) * Kbottom) := hcomponent + _ = + (S * Ktop) * Real.exp (-(A ^ η)) + + (qPlus * (Cbottom * wq) * Kbottom) * Real.exp (-(A ^ η)) := by + ring + have hcomponent_max : + μ.real (badScaleEvent H t α q) ≤ + max 0 (S * Ktop) * Real.exp (-(A ^ η)) + + max 0 (qPlus * (Cbottom * wq) * Kbottom) * + Real.exp (-(A ^ η)) := by + have htop : + (S * Ktop) * Real.exp (-(A ^ η)) ≤ + max 0 (S * Ktop) * Real.exp (-(A ^ η)) := + mul_le_mul_of_nonneg_right + (le_max_right 0 (S * Ktop)) (Real.exp_pos _).le + have hbottom : + (qPlus * (Cbottom * wq) * Kbottom) * Real.exp (-(A ^ η)) ≤ + max 0 (qPlus * (Cbottom * wq) * Kbottom) * + Real.exp (-(A ^ η)) := + mul_le_mul_of_nonneg_right + (le_max_right 0 (qPlus * (Cbottom * wq) * Kbottom)) + (Real.exp_pos _).le + linarith + exact hcomponent_max.trans + (two_exp_terms_le_exp_of_prefactor_gap + (c₁ := max 0 (S * Ktop)) + (c₂ := max 0 (qPlus * (Cbottom * wq) * Kbottom)) + (A := A ^ η) (T₀ := Alead) (T := Atail) + (le_max_left 0 (S * Ktop)) + (le_max_left 0 (qPlus * (Cbottom * wq) * Kbottom)) + hAlead_A hpref) + +/-- Uniform endpoint bad-scale tail after selected denominator, with the +deterministic prefactor gap still explicit. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail_of_prefactor_gap + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Acrude : ℝ := (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + 0 < Btail → + 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead → + 1 ≤ Acrude → + (let Lcut : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1); + Lcut + 1 < (1 - αbad / a) * (q : ℝ)) → + max 0 Ctop + max 0 ChighBottom ≤ Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hselected⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_selected_denominator + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Btail P hP hStruct hInf hparams q + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb hBtail hlead_one + hAcrude_one hq_large hpref + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let Acrude : ℝ := (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hDen_pos : 0 < Den := by + simpa [Den] using + uniformEndpointHighDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hBlead_pos : 0 < Blead := by + dsimp [Blead] + exact mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (L + 1)) + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hAlead_A : Alead ≤ A ^ η := by + have hden : Den * (3 : ℝ) ^ (L + 1) ≤ Blead := by rfl + simpa [Alead, A, Blead] using + selected_tail_parameter_power_le_high + (q := q) (Den := Den) (B := Blead) (η := η) (O := L + 1) + hDen_pos hBlead_pos hη_pos hden + have hA_one : 1 ≤ A := by + have hlead_A : (3 : ℝ) ^ (q : ℝ) / Blead ≤ A := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ (q : ℝ) := + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le + calc + (3 : ℝ) ^ (q : ℝ) / Blead + ≤ (3 : ℝ) ^ (q : ℝ) / (Den * (3 : ℝ) ^ (L + 1)) := + div_le_div_of_nonneg_left hpow_nonneg + (mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (L + 1))) + (by rfl) + _ = A := by + exact (rpow_three_sub_div_eq_div_mul_rpow + (x := (q : ℝ)) (O := L + 1) (Den := Den) + hDen_pos.ne').symm + exact hlead_one.trans hlead_A + have hcomponent := + hselected (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) + ht hα_nonneg hαt hαb hαharm hαa htb + hA_one hAcrude_one hq_large + exact + measureReal_badScaleEvent_le_exp_tail_of_uniformEndpoint_component_sum + (μ := P) (H := Hshift) (t := t) (α := αbad) (q := q) + (S := (S.card : ℝ)) (qPlus := ((q + 1 : ℕ) : ℝ)) + (Cbottom := Cbottom) (wq := w ^ q) + (Ktop := weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) + (Kbottom := weightedGeometricExpKernelConst w (ρbottom ^ η)) + (A := A) (Alead := Alead) (Atail := Atail) (η := η) + (by + simpa [K, N0, Hshift, S, b, L, ctop, η, w, Dhigh, Dcrude, + Den, A, Acrude, ρtop, ρbottom, Cbottom] using hcomponent) + hAlead_A + (by + simpa [K, S, b, L, ctop, η, w, Dhigh, Dcrude, Den, Blead, + A, Acrude, Alead, Atail, ρtop, ρbottom, Cbottom] using hpref) + +/-- Endpoint tail after discharging the lead, crude-bottom, and crude-top +threshold side conditions by explicit ceilings. -/ +theorem measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail_of_thresholds_and_prefactor_gap + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Btail : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Alead : ℝ := (((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) + let Atail : ℝ := (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let ChighBottom : ℝ := + ((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * + weightedGeometricExpKernelConst w (ρbottom ^ η) + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + 0 < Btail → + Nat.ceil (Real.log Blead / Real.log 3) ≤ q → + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) ≤ q → + Nat.ceil ((L + 1) / (1 - αbad / a) + 1) ≤ q → + max 0 Ctop + max 0 ChighBottom ≤ Real.exp (Alead - Atail) → + P.real (badScaleEvent Hshift t αbad q) ≤ Real.exp (-Atail) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, htail⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail_of_prefactor_gap + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Btail P hP hStruct hInf hparams q + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb hBtail hq_lead + hq_crude hq_cut hpref + let K : ℝ := quenchedProbeEnvelopeConst d + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hInf.thetaHat_pos 2) + have hDen_pos : 0 < Den := by + simpa [Den] using + uniformEndpointHighDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hBlead_pos : 0 < Blead := by + dsimp [Blead] + exact mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (L + 1)) + have hlead_one : 1 ≤ (3 : ℝ) ^ (q : ℝ) / Blead := by + simpa [Blead] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := (1 : ℝ)) (O := (0 : ℝ)) (D := Blead) (q := q) + (by norm_num) hBlead_pos + (by simpa [Blead, L] using hq_lead) + have hcrude_one : + 1 ≤ (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / Dcrude := by + simpa [mul_assoc] using + one_le_rpow_three_linear_sub_nat_div_of_natCeil_le + (β := t) (O := t * (L + 1)) (D := Dcrude) (q := q) + ht hDcrude_pos hq_crude + have hδ : 0 < 1 - αbad / a := by + have hdiv : αbad / a < 1 := by + rw [div_lt_iff₀ ha] + nlinarith + linarith + have hcut : + L + 1 < (1 - αbad / a) * (q : ℝ) := by + exact + large_scale_cutoff_of_natCeil_add_one_le + (L := L) (δ := 1 - αbad / a) (q := q) hδ hq_cut + simpa [K, b, L, η, Dhigh, Dcrude, Den, Blead] using + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hInf hparams (q := q) + ht hα_nonneg hαt hαb hαharm hαa htb hBtail + hlead_one hcrude_one (by simpa [K, L] using hcut) hpref + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailFinal.lean new file mode 100644 index 0000000000..769c9d6a29 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformBadScaleTailFinal.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleTailCollapse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePrefactorGapQuantitative + +/-! # Uniform Bad Scale Tail Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Quantitative uniform-endpoint bad-scale tail + +This is the `Γ∞` endpoint analogue of the finite-`σ` quantitative bad-scale +tail. The exponent is `d`; the crude-bottom deterministic cutoff contributes +an additional explicit threshold but no stochastic branch. +-/ + +noncomputable section + +theorem exists_quantitative_threshold_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let W : ℝ := max 1 w + let M : ℝ := max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + ∃ R : ℕ, + (∀ q : ℕ, R ≤ q → + C₀ * (q : ℝ) ≤ + Real.exp ((Real.log ρgap / 2) * (q : ℝ))) ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + ∀ q : ℕ, Q ≤ q → + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, htail⟩ := + measureReal_shiftedBadScaleEvent_quenchedProbeEnvelope_le_uniformEndpoint_tail_of_thresholds_and_prefactor_gap + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let W : ℝ := max 1 w + let M : ℝ := max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hw_nonneg : 0 ≤ w := by + dsimp [w] + exact_mod_cast Nat.zero_le (3 ^ d) + obtain ⟨R, hR, hRtail⟩ := + exists_forall_ge_selected_prefactor_gap_quantitative_uniform + (Ctop := Ctop) (Cbottom := Cbottom) (S := (S.card : ℝ)) + (Kbottom := Kbottom) (Kcrude := (0 : ℝ)) + (w := w) (η := η) hη_pos hw_nonneg + refine ⟨R, ?_, ?_⟩ + · simpa [ρgap, W, C₀, w, η] using hR + intro P hP hStruct hInf hparams + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + intro q hQq + have hDen_pos : 0 < Den := by + simpa [Den] using + uniformEndpointHighDenominator_pos + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hBlead_pos : 0 < Blead := by + dsimp [Blead] + exact mul_pos hDen_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (L + 1)) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hBlead_lt_Btail : Blead < Btail := by + dsimp [Btail] + nlinarith + have hq_pref : Qpref ≤ q := (le_max_left Qpref (max Qlead (max Qcrude Qcut))).trans hQq + have hq_lead : Qlead ≤ q := + (le_max_left Qlead (max Qcrude Qcut)).trans + ((le_max_right Qpref (max Qlead (max Qcrude Qcut))).trans hQq) + have hq_crude : Qcrude ≤ q := + (le_max_left Qcrude Qcut).trans + ((le_max_right Qlead (max Qcrude Qcut)).trans + ((le_max_right Qpref (max Qlead (max Qcrude Qcut))).trans hQq)) + have hq_cut : Qcut ≤ q := + (le_max_right Qcrude Qcut).trans + ((le_max_right Qlead (max Qcrude Qcut)).trans + ((le_max_right Qpref (max Qlead (max Qcrude Qcut))).trans hQq)) + have hpref_q : + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) := by + have hthree := + hRtail (Blead := Blead) (Btail := Btail) + hBlead_pos hBtail_pos hBlead_lt_Btail q + (by + simpa only [M, cgap, ρgap, mul_zero, max_self, add_zero] using + hq_pref) + simpa only [mul_zero, max_self, add_zero] using hthree + have htail_q := + htail (t := t) (αbad := αbad) (Btail := Btail) + hP hStruct hInf hparams (q := q) + ht hα_nonneg hαt hαb hαharm hαa htb hBtail_pos + (by + change Qlead ≤ q + exact hq_lead) + (by + change Qcrude ≤ q + exact hq_crude) + (by + change Qcut ≤ q + exact hq_cut) + (by + change + max 0 Ctop + + max 0 (((q + 1 : ℕ) : ℝ) * (Cbottom * w ^ q) * Kbottom) ≤ + Real.exp + ((((3 : ℝ) ^ (q : ℝ) / Blead) ^ η) - + (((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + exact hpref_q) + change + P.real (badScaleEvent Hshift t αbad q) ≤ + Real.exp (-(((3 : ℝ) ^ (q : ℝ) / Btail) ^ η)) + simpa [N0, Hshift, η] using htail_q + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformCrudeBottom.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformCrudeBottom.lean new file mode 100644 index 0000000000..8176ffe42a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformCrudeBottom.lean @@ -0,0 +1,628 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleComponentBoundsCrudeBottom + +/-! # Uniform Crude Bottom -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# The crude bottom-scale branch at the uniform endpoint + +Under `Γ_∞`, the crude branch is deterministic: the localized normalized +probe maximum is almost surely bounded by a constant multiple of +`thetaHat^2`. Consequently the corresponding bad-pair event is empty modulo +null sets once the crude threshold is at least this deterministic scale. +-/ + +noncomputable section + +/-- Endpoint crude fixed bad-pair estimate. The right side is exactly zero: +the endpoint replaces the finite-`σ` crude tail by deterministic boundedness. -/ +theorem measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_eq_zero_of_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ C : ℝ, 0 < C ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let scale : ℝ := K * (C * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + let C : ℝ := GammaInfinityCoarseGrainedEllipticity.unitJConst d params + have hC_pos : 0 < C := by + simpa [C] using + GammaInfinityCoarseGrainedEllipticity.unitJConst_pos + (d := d) params + refine ⟨C, hC_pos, ?_⟩ + intro t αbad P hP hStruct hInf hparams N0 q m n + dsimp only + intro hnm hqm hlam + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let A : ℝ := C * hInf.thetaHat ^ (2 : ℕ) + let scale : ℝ := K * A + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hA_pos : 0 < A := by + dsimp [A] + exact mul_pos hC_pos (pow_pos hInf.thetaHat_pos 2) + have hA_nonneg : 0 ≤ A := hA_pos.le + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos hK_pos hA_pos + have hA_le_A_lam : A ≤ A * lam := by + calc + A = A * 1 := by ring + _ ≤ A * lam := mul_le_mul_of_nonneg_left hlam hA_nonneg + have hmax_ae : + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) + ≤ᵐ[P] fun _ => A := by + have hbound := + hInf.localizedNormalizedProbeJMax_le_thetaHat_sq_ae + (m := N0 + m) (n := N0 + n) + (Nat.add_le_add_left (le_of_lt hnm) N0) + simpa [A, C, hparams] using hbound + let tailSet : Set (RegCoeffField d) := + {aω | A * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω} + have htail_empty_ae : tailSet =ᵐ[P] (∅ : Set (RegCoeffField d)) := by + filter_upwards [hmax_ae] with aω hmax + apply propext + change (A * lam < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω) ↔ False + exact iff_false_intro (not_lt_of_ge (hmax.trans hA_le_A_lam)) + have htail_measure : P.real tailSet = 0 := by + have hmeasure := MeasureTheory.measure_congr htail_empty_ae + exact by + simpa [tailSet] using! congrArg ENNReal.toReal hmeasure + have hsubset : + badPairEvent Hshift t αbad q m n ⊆ tailSet := by + intro aω hbad + rcases hbad with ⟨_hnm_bad, _hqm_bad, hbad_val⟩ + have hdisc_pos : + 0 < Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) := + Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hthreshold : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T = + Real.rpow (3 : ℝ) (-αbad * ((m - q : ℕ) : ℝ)) := by + simpa [T, x] using + rpow_three_discount_mul_postThreshold + (t := t) (α := αbad) (m := m) (n := n) (N := q) + have hT_lt_H : T < Hshift m n aω := by + have hdisc_lt : + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * T < + Real.rpow (3 : ℝ) (-t * ((m - n : ℕ) : ℝ)) * + Hshift m n aω := by + rw [hthreshold] + exact hbad_val + nlinarith [hdisc_lt, hdisc_pos] + have hT_div_lt : + T / K < + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + have hK_mul : + T < K * + localizedNormalizedProbeJMax hP hStruct (N0 + m) (N0 + n) aω := by + simpa [Hshift, quenchedProbeEnvelope, K] using hT_lt_H + exact (div_lt_iff₀ hK_pos).2 (by simpa [mul_comm] using hK_mul) + have hA_lam : A * lam = T / K := by + dsimp [lam, scale] + field_simp [hK_pos.ne', hA_pos.ne'] + exact by + simpa [tailSet, hA_lam] using hT_div_lt + have hle_zero : + P.real (badPairEvent Hshift t αbad q m n) ≤ 0 := by + exact (measureReal_mono (μ := P) hsubset).trans_eq htail_measure + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + +/-- Endpoint concrete crude-bottom row estimate. -/ +theorem measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ + ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ ((d : ℕ) : ℝ)))) := by + obtain ⟨Ccrude, hCcrude, hpair⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_eq_zero_of_gammaInfinity + (d := d) params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hInf hparams q r j + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hρ_pos : 0 < ρ := by + dsimp [ρ] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _ + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hS_nonneg : 0 ≤ (S.card : ℝ) := by positivity + have hA_nonneg : 0 ≤ A := by linarith + have htail_nonneg : + 0 ≤ ((S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ ((d : ℕ) : ℝ)))) := by + exact mul_nonneg + (mul_nonneg hS_nonneg (pow_nonneg hw_pos.le q)) + (mul_nonneg (pow_nonneg hw_pos.le r) (Real.exp_pos _).le) + by_cases hnℓ_sel : n ≤ selectedBadPairScale K a t αbad q m n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hnℓ : n ≤ ℓ := by + simpa [hℓ_eq] using hnℓ_sel + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + crudeBottom_lam_lower + (d := d) (K := K) (C := Ccrude) + (θ := hInf.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCcrude hInf.thetaHat_pos ha ht hαt + hnℓ hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul hA_one hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hInf hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad_zero : + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + simpa [K, Hshift, x, scale, T, lam] using + hraw hnm hqm hlam_one + have hcrude_zero : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ 0 := by + have hmono : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono + (by + intro ω hω + exact hω.2.2) + exact hmono.trans_eq hbad_zero + exact hcrude_zero.trans htail_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, hnℓ_sel] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Endpoint concrete crude-bottom row cutoff. Once the crude row parameter is +at least one, every fixed crude-bottom pair has zero probability. -/ +theorem measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) = 0 := by + obtain ⟨Ccrude, hCcrude, hpair⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_eq_zero_of_gammaInfinity + (d := d) params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hInf hparams q r j + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hA_nonneg : 0 ≤ A := by linarith + by_cases hnℓ_sel : n ≤ selectedBadPairScale K a t αbad q m n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hnℓ : n ≤ ℓ := by + simpa [hℓ_eq] using hnℓ_sel + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + crudeBottom_lam_lower + (d := d) (K := K) (C := Ccrude) + (θ := hInf.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCcrude hInf.thetaHat_pos ha ht hαt + hnℓ hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul hA_one hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hraw := + hpair (t := t) (αbad := αbad) hP hStruct hInf hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad_zero : + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + simpa [K, Hshift, x, scale, T, lam] using + hraw hnm hqm hlam_one + have hle_zero : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ 0 := by + have hmono : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono + (by + intro ω hω + exact hω.2.2) + exact hmono.trans_eq hbad_zero + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, hnℓ_sel] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + +/-- Endpoint crude-bottom component cutoff. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) = 0 := by + obtain ⟨Ccrude, hCcrude, hrow⟩ := + measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity + (d := d) params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hInf hparams q + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hd_pos : 0 < ((d : ℕ) : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hle_zero : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ 0 := by + simpa using + measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := (1 : ℝ)) (ρ := ρ) (η := ((d : ℕ) : ℝ)) + (C := (0 : ℝ)) (w := w) + (by norm_num : (0 : ℝ) ≤ 0) hw_pos + (by norm_num : (1 : ℝ) ≤ 1) hρ_gt hd_pos + (by + intro r j + have hz := + hrow (Centry := Centry) (a := a) (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (r := r) (j := j) + ha ht hαt hA_one + simpa [K, N0, Hshift, L, A, ρ] using + (by + rw [hz] + simp : P.real + (crudeBottomPairEvent Hshift K a t αbad q (q + r) (q - j.val)) + ≤ 0 * (w ^ r * Real.exp (-(((1 : ℝ) * ρ ^ r) ^ ((d : ℕ) : ℝ))))) + ) + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + +/-- Endpoint crude-bottom component estimate after summing the weighted rows. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * ((S.card : ℝ) * w ^ q) * + (Real.exp (-(A ^ ((d : ℕ) : ℝ))) * + weightedGeometricExpKernelConst w (ρ ^ ((d : ℕ) : ℝ))) := by + obtain ⟨Ccrude, hCcrude, hrow⟩ := + measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity + (d := d) params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hInf hparams q + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hC_nonneg : 0 ≤ (S.card : ℝ) * w ^ q := by + positivity + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hA_one_local : 1 ≤ A := by + simpa [A, K, L] using hA_one + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hd_pos : 0 < ((d : ℕ) : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + exact + measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := ((d : ℕ) : ℝ)) + (C := (S.card : ℝ) * w ^ q) (w := w) + hC_nonneg hw_pos hA_one_local hρ_gt hd_pos + (by + intro r j + simpa [K, Hshift, S, L, w, A, ρ] using + hrow (Centry := Centry) (a := a) (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (r := r) (j := j) + ha ht hαt hA_one_local) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityBridge.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityBridge.lean new file mode 100644 index 0000000000..8dd270d88d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityBridge.lean @@ -0,0 +1,910 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityEndpoint +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.PositiveExcessLowerAndIntegrability.UnitDescendantSup +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarAlgebra +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.Apex +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Representatives +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds + +/-! # Uniform Ellipticity Bridge -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-! +# Uniform ellipticity bridge for the Section 5.7 endpoint + +This file turns a law-level almost-sure uniform ellipticity support condition +into the `Γ_∞` endpoint used by the public quenched theorem. +-/ + +/-- A law is supported on coefficient fields with one uniform ellipticity +window on every triadic cube. -/ +structure UniformEllipticityBounds {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (lam Lam : ℝ) : Prop where + lam_pos : 0 < lam + lam_le_Lam : lam ≤ Lam + aee_elliptic : + ∀ᵐ a ∂P, + ∀ Q : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet Q) a + +namespace UniformEllipticityBounds + +variable {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {lam Lam : ℝ} + +/-- The uniform support hypothesis implies the Chapter 4 local ellipticity +support condition. -/ +theorem ae_locallyUniformlyEllipticField + (hUE : UniformEllipticityBounds P lam Lam) : + ∀ᵐ a ∂P, Ch04.AELocallyUniformlyEllipticField a := by + filter_upwards [hUE.aee_elliptic] with a ha Q + exact ⟨lam, Lam, hUE.lam_pos, hUE.lam_le_Lam, ha Q⟩ + +/-- Forget the fixed constants in the uniform support hypothesis. -/ +theorem toAELocallyUniformlyEllipticLaw + (hUE : UniformEllipticityBounds P lam Lam) : + Ch04.AELocallyUniformlyEllipticLaw P := + hUE.ae_locallyUniformlyEllipticField + +end UniformEllipticityBounds + +/-- A one-cube Chapter 2 coefficient object using prescribed ellipticity +constants. This avoids losing the displayed constants to `Classical.choose` +inside the generic Chapter 4 bridge. -/ +noncomputable def coeffOnOfUniformAEEllipticOn {d : ℕ} + (a : RegCoeffField d) (Q : TriadicCube d) + {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (hQ : Ch04.AEEllipticOn lam Lam (openCubeSet Q) a) : + Ch02.CoeffOn (Ch02.cubeDomain Q) where + toCoeffField := a + lam := lam + Lam := Lam + lam_pos := hlam + lam_le_Lam := hle + aeStronglyMeasurable := by + intro i j + simpa [Ch02.cubeDomain_coe] using + IsAEEllipticFieldOn.aestronglyMeasurable_restrictCoeffField_apply + hQ i j + aeElliptic := by + simpa [Ch02.cubeDomain_coe] using + IsAEEllipticFieldOn.ae_isEllipticMatrix hQ + +@[simp] +theorem coeffOnOfUniformAEEllipticOn_toCoeffField {d : ℕ} + (a : RegCoeffField d) (Q : TriadicCube d) + {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (hQ : Ch04.AEEllipticOn lam Lam (openCubeSet Q) a) : + (coeffOnOfUniformAEEllipticOn a Q hlam hle hQ).toCoeffField = a := + rfl + +/-- The Chapter 2 family associated to fixed law-level uniform ellipticity +constants. -/ +noncomputable def triadicCoeffFamilyOfUniformEllipticity {d : ℕ} + (a : RegCoeffField d) {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ Q : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet Q) a) : + Ch02.TriadicCoeffFamily d where + coeffOn := fun Q => coeffOnOfUniformAEEllipticOn a Q hlam hle (ha Q) + restrictsTo_of_subset := by + intro Q R _hsub + change a =ᵐ[volumeMeasureOn (Ch02.cubeDomain R : Set (Vec d))] a + exact Filter.EventuallyEq.rfl + +theorem triadicCoeffFamilyOfAELocallyUniformlyEllipticField_aeeq_uniform + {d : ℕ} {a : RegCoeffField d} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ Q : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet Q) a) + (hlocal : Ch04.AELocallyUniformlyEllipticField a) : + Ch02.TriadicCoeffFamily.AEEq + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a hlocal) + (triadicCoeffFamilyOfUniformEllipticity a hlam hle ha) := by + intro Q + change a =ᵐ[volumeMeasureOn (Ch02.cubeDomain Q : Set (Vec d))] a + exact Filter.EventuallyEq.rfl + +/-- Deterministic upper-block constant coming from pointwise uniform +ellipticity. -/ +noncomputable def uniformUpperBlockConst (d : ℕ) (lam Lam : ℝ) : ℝ := + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ (2 : ℕ) + +/-- Deterministic lower-inverse block constant coming from pointwise uniform +ellipticity. -/ +noncomputable def uniformLowerInvBlockConst (d : ℕ) (lam : ℝ) : ℝ := + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ + +theorem uniformUpperBlockConst_nonneg {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) : + 0 ≤ uniformUpperBlockConst d lam Lam := by + have hLam_nonneg : 0 ≤ Lam := hlam.le.trans hle + unfold uniformUpperBlockConst + positivity + +theorem uniformLowerInvBlockConst_nonneg {d : ℕ} {lam : ℝ} + (hlam : 0 < lam) : + 0 ≤ uniformLowerInvBlockConst d lam := by + unfold uniformLowerInvBlockConst + positivity + +private theorem maxDescendantBMatrixNormAtScale_le_uniform_of_uniformEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ T : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet T) a) + (n : ℕ) : + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) + (triadicCoeffFamilyOfUniformEllipticity a hlam hle ha) ≤ + uniformUpperBlockConst d lam Lam := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfUniformEllipticity a hlam hle ha + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (F.coeffOn Q) + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) A := by + simpa [A, F, triadicCoeffFamilyOfUniformEllipticity, + coeffOnOfUniformAEEllipticOn] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using Ch02.pointwiseCoeffField_openCube_descendant_data Q (F.coeffOn Q) + calc + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) F + ≤ Homogenization.maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) A := by + exact Ch02.maxDescendantBMatrixNormAtScale_le_maxDescendantBBlockNormAtScale + F Q hk + _ ≤ uniformUpperBlockConst d lam Lam := by + simpa [uniformUpperBlockConst, A] using + maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + Q A hEll hData n + +private theorem maxDescendantSigmaStarInvMatrixNormAtScale_le_uniform_of_uniformEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ T : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet T) a) + (n : ℕ) : + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) + (triadicCoeffFamilyOfUniformEllipticity a hlam hle ha) ≤ + uniformLowerInvBlockConst d lam := by + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfUniformEllipticity a hlam hle ha + let A : CoeffField d := + Internal.Ch02.BookCh02.pointwiseCoeffField (Ch02.cubeDomain Q) (F.coeffOn Q) + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) A := by + simpa [A, F, triadicCoeffFamilyOfUniformEllipticity, + coeffOnOfUniformAEEllipticOn] using + Internal.Ch02.BookCh02.pointwiseCoeffField_isEllipticFieldOn + (Ch02.cubeDomain Q) (F.coeffOn Q) + have hData : OpenCubeDescendantDeterministicCoarseData Q A := by + simpa [A] using Ch02.pointwiseCoeffField_openCube_descendant_data Q (F.coeffOn Q) + calc + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale Q (Q.scale - (n : ℤ)) F + ≤ Homogenization.maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) A := by + exact Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_le_maxDescendantSigmaStarInvNormAtScale + F Q hk + _ ≤ uniformLowerInvBlockConst d lam := by + simpa [uniformLowerInvBlockConst, A] using + maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + Q A hEll hData n + +private theorem tsum_geometricWeight_one_mul_le_const + {H : ℕ → ℝ} {s C : ℝ} (hs : 0 < s) + (hH_nonneg : ∀ n : ℕ, 0 ≤ H n) + (hH_le : ∀ n : ℕ, H n ≤ C) : + (∑' n : ℕ, geometricWeight s 1 n * H n) ≤ C := by + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hsumH : + Summable (fun n : ℕ => geometricWeight s 1 n * H n) := + Homogenization.summable_geometricWeight_mul_of_nonneg_of_le + (s := s) (q := 1) (C := C) hs1 hH_nonneg hH_le + have hsumC : + Summable (fun n : ℕ => geometricWeight s 1 n * C) := + (Homogenization.summable_geometricWeight (s := s) (q := 1) hs1).mul_right C + have hterm : + ∀ n : ℕ, geometricWeight s 1 n * H n ≤ geometricWeight s 1 n * C := by + intro n + exact mul_le_mul_of_nonneg_left (hH_le n) + (geometricWeight_nonneg n hs1.le) + calc + (∑' n : ℕ, geometricWeight s 1 n * H n) + ≤ ∑' n : ℕ, geometricWeight s 1 n * C := + Summable.tsum_le_tsum hterm hsumH hsumC + _ = C := by + rw [tsum_mul_right, Homogenization.tsum_geometricWeight_eq_one hs1] + ring + +/-- A sample satisfying fixed uniform ellipticity bounds has bounded upper +multiscale ellipticity on every cube. -/ +theorem LambdaSqCoeffField_finite_one_le_of_uniformEllipticitySample + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {lam Lam s : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ T : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet T) a) + (hs : 0 < s) : + Ch04.LambdaSqCoeffField Q s (.finite 1) a ≤ + uniformUpperBlockConst d lam Lam := by + classical + let hlocal : Ch04.AELocallyUniformlyEllipticField a := + fun T => ⟨lam, Lam, hlam, hle, ha T⟩ + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfUniformEllipticity a hlam hle ha + have hAEEq : + Ch02.TriadicCoeffFamily.AEEq + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a hlocal) + F := by + simpa [F] using + triadicCoeffFamilyOfAELocallyUniformlyEllipticField_aeeq_uniform + (a := a) hlam hle ha hlocal + have hEq : + Ch04.LambdaSqCoeffField Q s (.finite 1) a = + Ch02.LambdaSq Q s (.finite 1) F := by + simpa [Ch04.LambdaSqCoeffField, hlocal, F] using + Ch02.LambdaSq_eq_ofAEEq hAEEq Q s (.finite 1) + have hsplit : + Ch02.LambdaSq Q s (.finite 1) F ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) F := + Ch02.LambdaSq_finite_one_le_tsum_weighted_maxDescendantBMatrixNormAtScale + Q F hs + have hsum_le : + (∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) F) ≤ + uniformUpperBlockConst d lam Lam := by + exact + tsum_geometricWeight_one_mul_le_const + (H := fun n : ℕ => + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) F) + hs + (fun n => + Ch02.maxDescendantBMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) F) + (fun n => + maxDescendantBMatrixNormAtScale_le_uniform_of_uniformEllipticity + Q a hlam hle ha n) + calc + Ch04.LambdaSqCoeffField Q s (.finite 1) a = + Ch02.LambdaSq Q s (.finite 1) F := hEq + _ ≤ ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantBMatrixNormAtScale Q (Q.scale - (n : ℤ)) F := hsplit + _ ≤ uniformUpperBlockConst d lam Lam := hsum_le + +/-- A sample satisfying fixed uniform ellipticity bounds has bounded inverse +lower multiscale ellipticity on every cube. -/ +theorem lambdaSqCoeffField_finite_one_inv_le_of_uniformEllipticitySample + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : RegCoeffField d) + {lam Lam s : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (ha : ∀ T : TriadicCube d, + Ch04.AEEllipticOn lam Lam (openCubeSet T) a) + (hs : 0 < s) : + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ ≤ + uniformLowerInvBlockConst d lam := by + classical + let hlocal : Ch04.AELocallyUniformlyEllipticField a := + fun T => ⟨lam, Lam, hlam, hle, ha T⟩ + let F : Ch02.TriadicCoeffFamily d := + triadicCoeffFamilyOfUniformEllipticity a hlam hle ha + have hAEEq : + Ch02.TriadicCoeffFamily.AEEq + (Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a hlocal) + F := by + simpa [F] using + triadicCoeffFamilyOfAELocallyUniformlyEllipticField_aeeq_uniform + (a := a) hlam hle ha hlocal + have hEq : + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ = + (Ch02.lambdaSq Q s (.finite 1) F)⁻¹ := by + simpa [Ch04.lambdaSqCoeffField, hlocal, F] using + congrArg Inv.inv (Ch02.lambdaSq_eq_ofAEEq hAEEq Q s (.finite 1)) + have hsplit : + (Ch02.lambdaSq Q s (.finite 1) F)⁻¹ ≤ + ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale + Q (Q.scale - (n : ℤ)) F := + Ch02.lambdaSq_finite_one_inv_le_tsum_weighted_maxDescendantSigmaStarInvMatrixNormAtScale + Q F hs + have hsum_le : + (∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale + Q (Q.scale - (n : ℤ)) F) ≤ + uniformLowerInvBlockConst d lam := by + exact + tsum_geometricWeight_one_mul_le_const + (H := fun n : ℕ => + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale + Q (Q.scale - (n : ℤ)) F) + hs + (fun n => + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) F) + (fun n => + maxDescendantSigmaStarInvMatrixNormAtScale_le_uniform_of_uniformEllipticity + Q a hlam hle ha n) + calc + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ = + (Ch02.lambdaSq Q s (.finite 1) F)⁻¹ := hEq + _ ≤ ∑' n : ℕ, + Ch02.geometricWeight s 1 n * + Ch02.maxDescendantSigmaStarInvMatrixNormAtScale + Q (Q.scale - (n : ℤ)) F := hsplit + _ ≤ uniformLowerInvBlockConst d lam := hsum_le + +private theorem integrable_pow_of_ae_nonneg_le_const + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} {X : RegCoeffField d → ℝ} + [IsFiniteMeasure P] + {C : ℝ} (ξ : ℕ) + (hC : 0 ≤ C) (hX_nonneg : ∀ a, 0 ≤ X a) + (hX_aemeas : AEMeasurable X P) + (hX_le : X ≤ᵐ[P] fun _ => C) : + Integrable (fun a : RegCoeffField d => X a ^ ξ) P := by + refine Integrable.mono' (integrable_const (C ^ ξ)) + (hX_aemeas.pow_const ξ).aestronglyMeasurable ?_ + filter_upwards [hX_le] with a ha + have hCpow_nonneg : 0 ≤ C ^ ξ := pow_nonneg hC ξ + have hpow_le : X a ^ ξ ≤ C ^ ξ := + pow_le_pow_left₀ (hX_nonneg a) ha ξ + simpa [Real.norm_eq_abs, abs_of_nonneg (hX_nonneg a), + abs_of_nonneg hCpow_nonneg] using hpow_le + +theorem LambdaSqCoeffField_pow_integrable_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam s : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hUE : UniformEllipticityBounds P lam Lam) + (Q : TriadicCube d) (hs : 0 < s) (ξ : ℕ) : + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField Q s (.finite 1) a) ^ ξ) P := by + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := uniformUpperBlockConst d lam Lam + have hC : 0 ≤ C := by + simpa [C] using uniformUpperBlockConst_nonneg hUE.lam_pos hUE.lam_le_Lam + have hX_nonneg : + ∀ a : RegCoeffField d, 0 ≤ Ch04.LambdaSqCoeffField Q s (.finite 1) a := + fun a => Ch04.LambdaSqCoeffField_finite_nonneg Q a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hX_aemeas : + AEMeasurable + (fun a : RegCoeffField d => + Ch04.LambdaSqCoeffField Q s (.finite 1) a) P := + hP.aemeasurable_LambdaSqCoeffField_finite_one Q hs + have hX_le : + (fun a : RegCoeffField d => Ch04.LambdaSqCoeffField Q s (.finite 1) a) + ≤ᵐ[P] fun _ => C := by + filter_upwards [hUE.aee_elliptic] with a ha + simpa [C] using + LambdaSqCoeffField_finite_one_le_of_uniformEllipticitySample + Q a hUE.lam_pos hUE.lam_le_Lam ha hs + exact integrable_pow_of_ae_nonneg_le_const ξ hC hX_nonneg hX_aemeas hX_le + +theorem lambdaSqCoeffField_inv_pow_integrable_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam s : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hUE : UniformEllipticityBounds P lam Lam) + (Q : TriadicCube d) (hs : 0 < s) (ξ : ℕ) : + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹) ^ ξ) P := by + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := uniformLowerInvBlockConst d lam + have hC : 0 ≤ C := by + simpa [C] using uniformLowerInvBlockConst_nonneg hUE.lam_pos + have hX_nonneg : + ∀ a : RegCoeffField d, 0 ≤ (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹ := + fun a => inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg Q a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hX_aemeas : + AEMeasurable + (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹) P := + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv Q hs + have hX_le : + (fun a : RegCoeffField d => + (Ch04.lambdaSqCoeffField Q s (.finite 1) a)⁻¹) + ≤ᵐ[P] fun _ => C := by + filter_upwards [hUE.aee_elliptic] with a ha + simpa [C] using + lambdaSqCoeffField_finite_one_inv_le_of_uniformEllipticitySample + Q a hUE.lam_pos hUE.lam_le_Lam ha hs + exact integrable_pow_of_ae_nonneg_le_const ξ hC hX_nonneg hX_aemeas hX_le + +private theorem annealedMomentRoot_const_one + {d : ℕ} {P : Ch04.RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {ξ : ℕ} (_hξ : 1 ≤ ξ) : + Ch04.annealedMomentRoot P ξ (fun _ : RegCoeffField d => 1) = 1 := by + simp [Ch04.annealedMomentRoot] + +theorem LambdaMomentAtScale_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam s : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hUE : UniformEllipticityBounds P lam Lam) + (n : ℤ) (hs : 0 < s) {ξ : ℕ} (hξ : 1 ≤ ξ) : + Ch04.LambdaMomentAtScale P n s ξ ≤ + uniformUpperBlockConst d lam Lam := by + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := uniformUpperBlockConst d lam Lam + have hC : 0 ≤ C := by + simpa [C] using uniformUpperBlockConst_nonneg hUE.lam_pos hUE.lam_le_Lam + let X : RegCoeffField d → ℝ := + fun a => Ch04.LambdaSqCoeffField (originCube d n) s (.finite 1) a + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d n) a hs + (by norm_num : (1 : ℝ) ≤ 1) + have hY_nonneg : ∀ a : RegCoeffField d, 0 ≤ (1 : ℝ) := fun _ => by norm_num + have hX_aemeas : AEMeasurable X P := by + simpa [X] using + hP.aemeasurable_LambdaSqCoeffField_finite_one (originCube d n) hs + have hY_abs_int : + Integrable (fun a : RegCoeffField d => |(1 : ℝ)| ^ ξ) P := by + simpa only [abs_of_nonneg (by norm_num : (0 : ℝ) ≤ 1), one_pow] using + (integrable_const (1 : ℝ) : + Integrable (fun _ : RegCoeffField d => (1 : ℝ)) P) + have hXY : X ≤ᵐ[P] fun _ : RegCoeffField d => C * (1 : ℝ) := by + filter_upwards [hUE.aee_elliptic] with a ha + simpa [X, C] using + LambdaSqCoeffField_finite_one_le_of_uniformEllipticitySample + (originCube d n) a hUE.lam_pos hUE.lam_le_Lam ha hs + have hroot := + Section52.section52_annealedMomentRoot_le_const_mul_of_ae_le + (P := P) (ξ := ξ) (c := C) (X := X) + (Y := fun _ : RegCoeffField d => 1) + hξ hC hX_nonneg hY_nonneg hX_aemeas hY_abs_int hXY + calc + Ch04.LambdaMomentAtScale P n s ξ = + Ch04.annealedMomentRoot P ξ X := by rfl + _ ≤ C * Ch04.annealedMomentRoot P ξ (fun _ : RegCoeffField d => 1) := hroot + _ = C := by rw [annealedMomentRoot_const_one (P := P) hξ]; ring + +theorem lambdaInvMomentAtScale_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam s : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hUE : UniformEllipticityBounds P lam Lam) + (n : ℤ) (hs : 0 < s) {ξ : ℕ} (hξ : 1 ≤ ξ) : + Ch04.lambdaInvMomentAtScale P n s ξ ≤ + uniformLowerInvBlockConst d lam := by + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := uniformLowerInvBlockConst d lam + have hC : 0 ≤ C := by + simpa [C] using uniformLowerInvBlockConst_nonneg hUE.lam_pos + let X : RegCoeffField d → ℝ := + fun a => (Ch04.lambdaSqCoeffField (originCube d n) s (.finite 1) a)⁻¹ + have hX_nonneg : ∀ a, 0 ≤ X a := by + intro a + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d n) a hs + (by norm_num : (1 : ℝ) ≤ 1)) + have hY_nonneg : ∀ a : RegCoeffField d, 0 ≤ (1 : ℝ) := fun _ => by norm_num + have hX_aemeas : AEMeasurable X P := by + simpa [X] using + hP.aemeasurable_lambdaSqCoeffField_finite_one_inv (originCube d n) hs + have hY_abs_int : + Integrable (fun a : RegCoeffField d => |(1 : ℝ)| ^ ξ) P := by + simpa only [abs_of_nonneg (by norm_num : (0 : ℝ) ≤ 1), one_pow] using + (integrable_const (1 : ℝ) : + Integrable (fun _ : RegCoeffField d => (1 : ℝ)) P) + have hXY : X ≤ᵐ[P] fun _ : RegCoeffField d => C * (1 : ℝ) := by + filter_upwards [hUE.aee_elliptic] with a ha + simpa [X, C] using + lambdaSqCoeffField_finite_one_inv_le_of_uniformEllipticitySample + (originCube d n) a hUE.lam_pos hUE.lam_le_Lam ha hs + have hroot := + Section52.section52_annealedMomentRoot_le_const_mul_of_ae_le + (P := P) (ξ := ξ) (c := C) (X := X) + (Y := fun _ : RegCoeffField d => 1) + hξ hC hX_nonneg hY_nonneg hX_aemeas hY_abs_int hXY + calc + Ch04.lambdaInvMomentAtScale P n s ξ = + Ch04.annealedMomentRoot P ξ X := by rfl + _ ≤ C * Ch04.annealedMomentRoot P ξ (fun _ : RegCoeffField d => 1) := hroot + _ = C := by rw [annealedMomentRoot_const_one (P := P) hξ]; ring + +theorem originBlockIntegrableAtScale_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam sUpper sLower : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hUE : UniformEllipticityBounds P lam Lam) + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + {ξ : ℕ} (hξ : 1 ≤ ξ) (n : ℕ) : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := by + exact + hP.integrable_coarseFullBlockMatrixAtCube_of_integrable_factor_observables + (originCube d (n : ℤ)) hsUpper hsLower hξ + (LambdaSqCoeffField_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsUpper ξ) + (lambdaSqCoeffField_inv_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsLower ξ) + +theorem barSigmaAtScale_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam sUpper sLower : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hUE : UniformEllipticityBounds P lam Lam) + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + {ξ : ℕ} (hξ : 1 ≤ ξ) (n : ℕ) : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + uniformUpperBlockConst d lam Lam := by + have hBlock : + ∀ n : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + originBlockIntegrableAtScale_of_uniformEllipticityBounds + hP hUE hsUpper hsLower hξ + have hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ + ξ) P := + fun n => + LambdaSqCoeffField_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsUpper ξ + have hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ + ξ) P := + fun n => + lambdaSqCoeffField_inv_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsLower ξ + have hbar : + hP.barSigmaAtScale hStruct (n : ℤ) ≤ + Ch04.LambdaMomentAtScale P (n : ℤ) sUpper ξ := + hP.barSigmaAtScale_le_LambdaMomentAtScale_of_integrable_factor_observables + hStruct hsUpper hsLower hξ hBlock + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hsUpper) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hsLower) + hUpperPowInt hLowerPowInt n + exact hbar.trans + (LambdaMomentAtScale_le_of_uniformEllipticityBounds + hP hUE (n : ℤ) hsUpper hξ) + +theorem barSigmaStarAtScale_inv_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam sUpper sLower : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hUE : UniformEllipticityBounds P lam Lam) + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + {ξ : ℕ} (hξ : 1 ≤ ξ) (n : ℕ) : + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ ≤ + uniformLowerInvBlockConst d lam := by + have hBlock : + ∀ n : ℕ, + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + originBlockIntegrableAtScale_of_uniformEllipticityBounds + hP hUE hsUpper hsLower hξ + have hUpperPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + (Ch04.LambdaSqCoeffField (originCube d (n : ℤ)) sUpper (.finite 1) a) ^ + ξ) P := + fun n => + LambdaSqCoeffField_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsUpper ξ + have hLowerPowInt : + ∀ n : ℕ, + Integrable + (fun a : RegCoeffField d => + ((Ch04.lambdaSqCoeffField (originCube d (n : ℤ)) sLower (.finite 1) a)⁻¹) ^ + ξ) P := + fun n => + lambdaSqCoeffField_inv_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (n : ℤ)) hsLower ξ + have hstar : + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ ≤ + Ch04.lambdaInvMomentAtScale P (n : ℤ) sLower ξ := + hP.barSigmaStarAtScale_inv_le_lambdaInvMomentAtScale_of_integrable_factor_observables + hStruct hsUpper hsLower hξ hBlock + (fun n => hP.aemeasurable_LambdaSqCoeffField_finite_one + (originCube d (n : ℤ)) hsUpper) + (fun n => hP.aemeasurable_lambdaSqCoeffField_finite_one_inv + (originCube d (n : ℤ)) hsLower) + hUpperPowInt hLowerPowInt n + exact hstar.trans + (lambdaInvMomentAtScale_le_of_uniformEllipticityBounds + hP hUE (n : ℤ) hsLower hξ) + +theorem barSigmaAtScale_pos_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam sUpper sLower : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hUE : UniformEllipticityBounds P lam Lam) + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + {ξ : ℕ} (hξ : 1 ≤ ξ) (n : ℕ) : + 0 < hP.barSigmaAtScale hStruct (n : ℤ) := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + originBlockIntegrableAtScale_of_uniformEllipticityBounds + hP hUE hsUpper hsLower hξ n + exact hP.barSigmaAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + hStruct hBlock + +private theorem barSigmaStarAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (n : ℕ) + (hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) : + 0 < hP.barSigmaStarAtScale hStruct (n : ℤ) := by + have hInv : 0 < hP.barSigmaStarInvAtScale hStruct (n : ℤ) := by + simpa [Ch04.RestrictionLawCarrier.barSigmaStarInvAtScale] using + Ch04.RestrictionLawCarrier.Internal.barSigmaStarInv_pos_of_integrable_coarseFullBlockMatrixAtCube + hP + (Ch04.Internal.annealedPrimitiveScalarizationData_of_structuralLaw + hP hStruct (n : ℤ)) + hBlock + rw [hP.barSigmaStarAtScale_eq_inv_barSigmaStarInvAtScale hStruct (n : ℤ)] + exact inv_pos.mpr hInv + +private theorem barSigmaStarAtScale_le_barSigmaAtScale_of_integrable_coarseFullBlockMatrixAtCube + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (n : ℕ) + (hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P) : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := by + let b := hP.barSigmaAtScale hStruct (n : ℤ) + let c := hP.barSigmaStarAtScale hStruct (n : ℤ) + have hc_pos : 0 < c := by + simpa [c] using + barSigmaStarAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct n hBlock + have htheta : 1 ≤ b * c⁻¹ := by + simpa [thetaAtScale, Ch04.RestrictionLawCarrier.thetaAtScale, b, c] using + Section52.one_le_thetaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct (n : ℤ) hBlock + calc + hP.barSigmaStarAtScale hStruct (n : ℤ) = c := rfl + _ = c * 1 := by ring + _ ≤ c * (b * c⁻¹) := mul_le_mul_of_nonneg_left htheta hc_pos.le + _ = b := by field_simp [hc_pos.ne'] + _ = hP.barSigmaAtScale hStruct (n : ℤ) := rfl + +theorem barSigmaAtScale_inv_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam sUpper sLower : ℝ} (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hUE : UniformEllipticityBounds P lam Lam) + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) + {ξ : ℕ} (hξ : 1 ≤ ξ) (n : ℕ) : + (hP.barSigmaAtScale hStruct (n : ℤ))⁻¹ ≤ + uniformLowerInvBlockConst d lam := by + have hBlock : + Integrable (Ch04.coarseFullBlockMatrixAtCube (originCube d (n : ℤ))) P := + originBlockIntegrableAtScale_of_uniformEllipticityBounds + hP hUE hsUpper hsLower hξ n + have hb_pos : + 0 < hP.barSigmaAtScale hStruct (n : ℤ) := + hP.barSigmaAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + hStruct hBlock + have hc_pos : + 0 < hP.barSigmaStarAtScale hStruct (n : ℤ) := + barSigmaStarAtScale_pos_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct n hBlock + have hc_le_b : + hP.barSigmaStarAtScale hStruct (n : ℤ) ≤ + hP.barSigmaAtScale hStruct (n : ℤ) := + barSigmaStarAtScale_le_barSigmaAtScale_of_integrable_coarseFullBlockMatrixAtCube + hP hStruct n hBlock + have hb_inv_le_hc_inv : + (hP.barSigmaAtScale hStruct (n : ℤ))⁻¹ ≤ + (hP.barSigmaStarAtScale hStruct (n : ℤ))⁻¹ := + (inv_le_inv₀ hb_pos hc_pos).2 hc_le_b + exact hb_inv_le_hc_inv.trans + (barSigmaStarAtScale_inv_le_of_uniformEllipticityBounds + hP hStruct hUE hsUpper hsLower hξ n) + +/-- Deterministic endpoint size produced by uniform ellipticity. -/ +noncomputable def mainResultsThetaHat (d : ℕ) (lam Lam : ℝ) : ℝ := + 1 + + uniformLowerInvBlockConst d lam * uniformUpperBlockConst d lam Lam + + uniformUpperBlockConst d lam Lam * uniformLowerInvBlockConst d lam + +theorem mainResultsThetaHat_pos {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) : + 0 < mainResultsThetaHat d lam Lam := by + have hUpper : 0 ≤ uniformUpperBlockConst d lam Lam := + uniformUpperBlockConst_nonneg hlam hle + have hLower : 0 ≤ uniformLowerInvBlockConst d lam := + uniformLowerInvBlockConst_nonneg hlam + have hprod₁ : + 0 ≤ uniformLowerInvBlockConst d lam * uniformUpperBlockConst d lam Lam := + mul_nonneg hLower hUpper + have hprod₂ : + 0 ≤ uniformUpperBlockConst d lam Lam * uniformLowerInvBlockConst d lam := + mul_nonneg hUpper hLower + unfold mainResultsThetaHat + linarith + +/-- Uniform ellipticity bounds the normalized unit-cube `Γ_∞` observable +almost surely. -/ +theorem gammaSigmaUnitEllipticityObservable_le_of_uniformEllipticityBounds + {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} + {lam Lam : ℝ} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hUE : UniformEllipticityBounds P lam Lam) + {sUpper sLower : ℝ} + (hsUpper : 0 < sUpper) (hsLower : 0 < sLower) : + gammaSigmaUnitEllipticityObservable hP hStruct sUpper sLower + ≤ᵐ[P] fun _ => mainResultsThetaHat d lam Lam := by + let CU : ℝ := uniformUpperBlockConst d lam Lam + let CI : ℝ := uniformLowerInvBlockConst d lam + let b : ℝ := hP.barSigmaAtScale hStruct (0 : ℤ) + have hCU : 0 ≤ CU := by + simpa [CU] using uniformUpperBlockConst_nonneg hUE.lam_pos hUE.lam_le_Lam + have hCI : 0 ≤ CI := by + simpa [CI] using uniformLowerInvBlockConst_nonneg hUE.lam_pos + have hb_pos : 0 < b := by + simpa [b] using + barSigmaAtScale_pos_of_uniformEllipticityBounds + hP hStruct hUE hsUpper hsLower (by norm_num : 1 ≤ (1 : ℕ)) 0 + have hb_le : b ≤ CU := by + simpa [b, CU] using + barSigmaAtScale_le_of_uniformEllipticityBounds + hP hStruct hUE hsUpper hsLower (by norm_num : 1 ≤ (1 : ℕ)) 0 + have hb_inv_le : b⁻¹ ≤ CI := by + simpa [b, CI] using + barSigmaAtScale_inv_le_of_uniformEllipticityBounds + hP hStruct hUE hsUpper hsLower (by norm_num : 1 ≤ (1 : ℕ)) 0 + filter_upwards [hUE.aee_elliptic] with a ha + let L : ℝ := Ch04.LambdaSqCoeffField (originCube d 0) sUpper (.finite 1) a + let Linv : ℝ := (Ch04.lambdaSqCoeffField (originCube d 0) sLower (.finite 1) a)⁻¹ + have hL_nonneg : 0 ≤ L := by + simpa [L] using + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a hsUpper + (by norm_num : (1 : ℝ) ≤ 1) + have hLinv_nonneg : 0 ≤ Linv := by + simpa [Linv] using + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a hsLower + (by norm_num : (1 : ℝ) ≤ 1)) + have hL_le : L ≤ CU := by + simpa [L, CU] using + LambdaSqCoeffField_finite_one_le_of_uniformEllipticitySample + (originCube d 0) a hUE.lam_pos hUE.lam_le_Lam ha hsUpper + have hLinv_le : Linv ≤ CI := by + simpa [Linv, CI] using + lambdaSqCoeffField_finite_one_inv_le_of_uniformEllipticitySample + (originCube d 0) a hUE.lam_pos hUE.lam_le_Lam ha hsLower + have hUpperTerm : b⁻¹ * L ≤ CI * CU := + mul_le_mul hb_inv_le hL_le hL_nonneg hCI + have hLowerTerm : b * Linv ≤ CU * CI := + mul_le_mul hb_le hLinv_le hLinv_nonneg hCU + have hsum : b⁻¹ * L + b * Linv ≤ CI * CU + CU * CI := + add_le_add hUpperTerm hLowerTerm + have htheta : + CI * CU + CU * CI ≤ mainResultsThetaHat d lam Lam := by + unfold mainResultsThetaHat + dsimp [CU, CI] + linarith + calc + gammaSigmaUnitEllipticityObservable hP hStruct sUpper sLower a = + b⁻¹ * L + b * Linv := by + simp [gammaSigmaUnitEllipticityObservable, b, L, Linv, hb_pos] + _ ≤ CI * CU + CU * CI := hsum + _ ≤ mainResultsThetaHat d lam Lam := htheta + +namespace UniformEllipticityBounds + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {lam Lam : ℝ} + +/-- Uniform ellipticity supplies the older Chapter 5 `(P4)` package for any +admissible parameter record. -/ +noncomputable def toQuantitativeCoarseGrainedEllipticity + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + QuantitativeCoarseGrainedEllipticity P where + sUpper := params.sUpper + sLower := params.sLower + xi := params.xi + two_le_dim := params.two_le_dim + sUpper_nonneg := params.sUpper_nonneg + sUpper_lt_one := params.sUpper_lt_one + sLower_nonneg := params.sLower_nonneg + sLower_lt_one := params.sLower_lt_one + xi_gt_two_mul_dim := params.xi_gt_two_mul_dim + sum_lt_one := params.sum_lt_one + dim_div_xi_lt_min := params.dim_div_xi_lt_min + upper_moment_integrable := by + simpa using + LambdaSqCoeffField_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (0 : ℤ)) params.sUpper_pos params.xi + lower_inv_moment_integrable := by + simpa using + lambdaSqCoeffField_inv_pow_integrable_of_uniformEllipticityBounds + hP hUE (originCube d (0 : ℤ)) params.sLower_pos params.xi + +@[simp] +theorem toQuantitativeCoarseGrainedEllipticity_params + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (hUE.toQuantitativeCoarseGrainedEllipticity hP params).params = params := by + rfl + +/-- Uniform ellipticity gives the `σ = ∞` endpoint with the older quantitative +parameter record. -/ +noncomputable def toGammaInfinityCoarseGrainedEllipticity + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + GammaInfinityCoarseGrainedEllipticity P hP hStruct where + params := params + thetaHat := mainResultsThetaHat d lam Lam + thetaHat_pos := mainResultsThetaHat_pos hUE.lam_pos hUE.lam_le_Lam + bound := by + simpa using + gammaSigmaUnitEllipticityObservable_le_of_uniformEllipticityBounds + hP hStruct hUE params.sUpper_pos params.sLower_pos + +@[simp] +theorem toGammaInfinityCoarseGrainedEllipticity_params + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + (hUE.toGammaInfinityCoarseGrainedEllipticity hP hStruct params).params = + params := rfl + +/-- Uniform ellipticity gives the manuscript-facing `σ = ∞` endpoint with no +exposed finite moment exponent. -/ +noncomputable def toGammaInfinityCoarseGrainedEllipticityNoXi + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : GammaCoarseGrainedEllipticityParams d) : + GammaInfinityCoarseGrainedEllipticityNoXi P hP hStruct where + params := params + thetaHat := mainResultsThetaHat d lam Lam + thetaHat_pos := mainResultsThetaHat_pos hUE.lam_pos hUE.lam_le_Lam + bound := by + simpa using + gammaSigmaUnitEllipticityObservable_le_of_uniformEllipticityBounds + hP hStruct hUE params.sUpper_pos params.sLower_pos + +@[simp] +theorem toGammaInfinityCoarseGrainedEllipticityNoXi_params + (hUE : UniformEllipticityBounds P lam Lam) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) + (params : GammaCoarseGrainedEllipticityParams d) : + (hUE.toGammaInfinityCoarseGrainedEllipticityNoXi hP hStruct params).params = + params := rfl + +end UniformEllipticityBounds + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityEndpoint.lean new file mode 100644 index 0000000000..7465b1cf02 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityEndpoint.lean @@ -0,0 +1,686 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ProbeMax +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.QuenchedGammaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ConcentrationAEMeasurable + +/-! # Uniform Ellipticity Endpoint -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped Matrix.Norms.Elementwise + +/-! +# The uniform ellipticity endpoint in Section 5.7 + +This file records the `σ = ∞` endpoint of the quenched coarse-grained +ellipticity assumption. The endpoint is deliberately kept as a separate API: +it gives an a.s. unit-scale bound, and from that bound we may recover every +finite `Γσ` input needed by the existing concentration arguments. +-/ + +noncomputable section + +/-- The `σ = ∞` endpoint of the quenched coarse-grained ellipticity +assumption. + +The field `bound` is the Lean version of the uniform estimate +`Γ_∞`: the unit-cube ellipticity observable is bounded by `thetaHat` +almost surely. -/ +structure GammaInfinityCoarseGrainedEllipticity + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : Type where + params : QuantitativeCoarseGrainedEllipticityParams d + thetaHat : ℝ + thetaHat_pos : 0 < thetaHat + bound : + gammaSigmaUnitEllipticityObservable hP hStruct + params.sUpper params.sLower ≤ᵐ[P] fun _ => thetaHat + +/-- Manuscript-facing `σ = ∞` endpoint of `(P5)`, with no exposed moment +exponent `xi`. -/ +structure GammaInfinityCoarseGrainedEllipticityNoXi + {d : ℕ} [NeZero d] (P : Ch04.RestrictionCoeffLaw d) + (hP : Ch04.RestrictionLawCarrier P) (hStruct : Ch04.RestrictionStructuralLaw P) : Type where + params : GammaCoarseGrainedEllipticityParams d + thetaHat : ℝ + thetaHat_pos : 0 < thetaHat + bound : + gammaSigmaUnitEllipticityObservable hP hStruct + params.sUpper params.sLower ≤ᵐ[P] fun _ => thetaHat + +namespace GammaInfinityCoarseGrainedEllipticityNoXi + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +/-- Add the internal finite moment exponent used by the existing endpoint +proof infrastructure. -/ +noncomputable def withInternalXi + (hInf : GammaInfinityCoarseGrainedEllipticityNoXi P hP hStruct) : + GammaInfinityCoarseGrainedEllipticity P hP hStruct where + params := hInf.params.toQuantitativeParams + thetaHat := hInf.thetaHat + thetaHat_pos := hInf.thetaHat_pos + bound := by + simpa using hInf.bound + +@[simp] +theorem withInternalXi_thetaHat + (hInf : GammaInfinityCoarseGrainedEllipticityNoXi P hP hStruct) : + hInf.withInternalXi.thetaHat = hInf.thetaHat := rfl + +end GammaInfinityCoarseGrainedEllipticityNoXi + +/-- Transfer an a.s. upper bound across equality in law. -/ +theorem ae_le_of_map_eq_map_aemeasurable + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + {X Y : Ω → ℝ} {A : ℝ} + (hYm : AEMeasurable Y μ) (hXm : AEMeasurable X μ) + (hmap : Measure.map Y μ = Measure.map X μ) + (hX : X ≤ᵐ[μ] fun _ => A) : + Y ≤ᵐ[μ] fun _ => A := by + have hXmap : ∀ᵐ y ∂Measure.map X μ, y ≤ A := + (MeasureTheory.ae_map_iff hXm measurableSet_Iic).2 hX + have hYmap : ∀ᵐ y ∂Measure.map Y μ, y ≤ A := by + simpa [hmap] using hXmap + exact (MeasureTheory.ae_map_iff hYm measurableSet_Iic).1 hYmap + +/-- A deterministic counterpart of the finite-`Γσ` scale-zero propagation: +an a.s. bound at the unit origin cube propagates to every larger origin cube. -/ +theorem blockJObservableCubeSetBlockVec_originCube_le_of_scaleZero_ae + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) (hstat : Ch04.RestrictionStationaryLaw Pμ) + {θ : ℝ} (Pvec Qvec : BlockVec d) + (h0 : + Ch04.blockJObservableCubeSetBlockVec (originCube d 0) Pvec Qvec + ≤ᵐ[Pμ] fun _ => θ) + {n : ℤ} (hn : 0 ≤ n) : + Ch04.blockJObservableCubeSetBlockVec (originCube d n) Pvec Qvec + ≤ᵐ[Pμ] fun _ => θ := by + classical + let X : Set (Vec d) → RegCoeffField d → ℝ := + fun U a => Ch04.blockJSetObservableBlockVec Pvec Qvec U a.toFun + let D : Finset (TriadicCube d) := descendantsAtScale (originCube d n) 0 + let Avg : RegCoeffField d → ℝ := + fun a => ((D.card : ℝ)⁻¹) * + D.sum (fun R => Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec a) + have hn0 : (0 : ℤ) ≤ (originCube d n).scale := by + simpa [originCube] using hn + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtScale_nonempty (originCube d n) hn0 + have hX_cov : Ch04.IsRestrictionTranslationCovariant X := + Ch04.blockJSetObservableBlockVec_restrictionTranslationCovariant Pvec Qvec + have hX0_aemeas : + AEMeasurable (X (cubeSet (originCube d 0))) Pμ := by + simpa [X] using + Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ + (originCube d 0) Pvec Qvec + have hDesc_aemeas : + ∀ R, AEMeasurable (Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec) Pμ := by + intro R + simpa [X] using + Ch04.aemeasurable_blockJSetObservableBlockVec_cubeSet hPμ R Pvec Qvec + have hDesc_le : + ∀ R ∈ D, + Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec + ≤ᵐ[Pμ] fun _ => θ := by + intro R hR + have hshift : + cubeSet R = + translateSet (intVecToRealVec (Ch04.scaleTranslationShift 0 R)) + (cubeSet (originCube d 0)) := by + exact Ch04.cubeSet_eq_translateSet_originCube_of_mem_descendantsAtScale_originCube + (d := d) (n := 0) (m := n) (R := R) + (by norm_num) hn (by simpa [D] using hR) + have hXR_aemeas : AEMeasurable (X (cubeSet R)) Pμ := by + simpa [X] using hDesc_aemeas R + have hmap : + Measure.map (X (cubeSet R)) Pμ = + Measure.map (X (cubeSet (originCube d 0))) Pμ := by + calc + Measure.map (X (cubeSet R)) Pμ = + Measure.map + (X + (translateSet (intVecToRealVec (Ch04.scaleTranslationShift 0 R)) + (cubeSet (originCube d 0)))) Pμ := by + rw [hshift] + _ = Measure.map (X (cubeSet (originCube d 0))) Pμ := by + exact Ch04.map_eq_map_translateReg_of_isRestrictionTranslationCovariant_aemeasurable + (P := Pμ) hstat (U := cubeSet (originCube d 0)) + hX0_aemeas hX_cov (Ch04.scaleTranslationShift 0 R) + have h0X : X (cubeSet (originCube d 0)) ≤ᵐ[Pμ] fun _ => θ := by + simpa [X] using h0 + simpa [X] using + ae_le_of_map_eq_map_aemeasurable hXR_aemeas hX0_aemeas hmap h0X + have hAvg_le : Avg ≤ᵐ[Pμ] fun _ => θ := by + have hAll : ∀ᵐ a ∂Pμ, + ∀ R ∈ D, Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec a ≤ θ := by + rw [Filter.eventually_all_finset] + intro R hR + exact hDesc_le R hR + filter_upwards [hAll] with a ha + have hD_card_ne : (D.card : ℝ) ≠ 0 := by + exact_mod_cast hD_nonempty.card_ne_zero + have hsum_le : + D.sum (fun R => Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec a) ≤ + D.sum (fun _R => θ) := + Finset.sum_le_sum fun R hR => ha R hR + calc + Avg a = + ((D.card : ℝ)⁻¹) * + D.sum (fun R => Ch04.blockJObservableCubeSetBlockVec R Pvec Qvec a) := by + rfl + _ ≤ ((D.card : ℝ)⁻¹) * D.sum (fun _R => θ) := by + exact mul_le_mul_of_nonneg_left hsum_le (by positivity) + _ = θ := by + rw [Finset.sum_const, nsmul_eq_mul] + field_simp [hD_card_ne] + have hsub_ae : + ∀ᵐ a ∂Pμ, + Ch04.blockJObservableCubeSetBlockVec (originCube d n) Pvec Qvec a ≤ Avg a := by + filter_upwards [hPμ.ae_locallyUniformlyEllipticField] with a ha + have hsub := + Ch04.blockJObservableCubeSetBlockVec_le_descendantsAverage_cubeSet_of_aelocallyUniformlyEllipticField + (a := a) ha (originCube d n) (k := 0) hn0 Pvec Qvec + simpa [Avg, D, descendantsAverage, + descendantsAtScale_eq_descendantsAtDepth (originCube d n) hn0] using hsub + filter_upwards [hsub_ae, hAvg_le] with a hsub hAvg + exact hsub.trans hAvg + +/-- Transfer an a.s. bound from the origin cube at scale `n` to a descendant +cube at the same scale, using stationarity. -/ +theorem limitNormalizedBlockJObservable_of_mem_descendantsAtScale_le_ae + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {θ : ℝ} {m n : ℤ} (hn : 0 ≤ n) (hnm : n ≤ m) + {R : TriadicCube d} + (hR : R ∈ descendantsAtScale (originCube d m) n) + (e : FullBlockVec d) + (hOrigin : + limitNormalizedBlockJObservable hPμ hStruct (originCube d n) e + ≤ᵐ[Pμ] fun _ => θ) : + limitNormalizedBlockJObservable hPμ hStruct R e + ≤ᵐ[Pμ] fun _ => θ := by + have hmap := + map_limitNormalizedBlockJObservable_eq_origin_of_mem_descendantsAtScale + hPμ hStruct hstat hn hnm hR e + have hXR_aemeas : + AEMeasurable (limitNormalizedBlockJObservable hPμ hStruct R e) Pμ := + aemeasurable_limitNormalizedBlockJObservable hPμ hStruct R e + have hX0_aemeas : + AEMeasurable + (limitNormalizedBlockJObservable hPμ hStruct (originCube d n) e) Pμ := + aemeasurable_limitNormalizedBlockJObservable hPμ hStruct (originCube d n) e + exact + ae_le_of_map_eq_map_aemeasurable hXR_aemeas hX0_aemeas hmap hOrigin + +/-- An a.s. origin-cube bound controls the localized maximum over descendants. -/ +theorem localizedLimitNormalizedJMax_le_of_originCube_ae + {d : ℕ} [NeZero d] {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hstat : Ch04.RestrictionStationaryLaw Pμ) + {θ : ℝ} {m n : ℕ} (hnm : n ≤ m) (e : FullBlockVec d) + (hOrigin : + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((n : ℕ) : ℤ)) e + ≤ᵐ[Pμ] fun _ => θ) : + localizedLimitNormalizedJMax hPμ hStruct m n e + ≤ᵐ[Pμ] fun _ => θ := by + classical + let D : Finset (TriadicCube d) := + descendantsAtScale (originCube d ((m : ℕ) : ℤ)) ((n : ℕ) : ℤ) + have hD : D.Nonempty := + descendantsAtScale_originCube_nat_nonempty (d := d) (m := m) (n := n) hnm + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hnm_int : ((n : ℕ) : ℤ) ≤ ((m : ℕ) : ℤ) := by + exact_mod_cast hnm + have hEach : + ∀ R ∈ D, + limitNormalizedBlockJObservable hPμ hStruct R e + ≤ᵐ[Pμ] fun _ => θ := by + intro R hR + exact + limitNormalizedBlockJObservable_of_mem_descendantsAtScale_le_ae + hPμ hStruct hstat hn_nonneg hnm_int + (R := R) (by simpa [D] using hR) e hOrigin + have hAll : ∀ᵐ a ∂Pμ, + ∀ R ∈ D, limitNormalizedBlockJObservable hPμ hStruct R e a ≤ θ := by + rw [Filter.eventually_all_finset] + intro R hR + exact hEach R hR + filter_upwards [hAll] with a ha + dsimp [localizedLimitNormalizedJMax] + simp only [D, hD, dite_true] + exact Finset.sup'_le hD _ (fun R hR => ha R hR) + +namespace GammaInfinityCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +theorem sUpper_pos + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) : + 0 < hInf.params.sUpper := + hInf.params.sUpper_pos + +theorem sLower_pos + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) : + 0 < hInf.params.sLower := + hInf.params.sLower_pos + +/-- The guarded unit-cube observable is nonnegative even before proving that +the normalizing scalar `barσ_0` is positive. -/ +theorem unitEllipticityObservable_nonneg + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + (a : RegCoeffField d) : + 0 ≤ gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower a := by + by_cases hbar : 0 < hP.barSigmaAtScale hStruct (0 : ℤ) + · have hbar_nonneg : 0 ≤ hP.barSigmaAtScale hStruct (0 : ℤ) := hbar.le + have hbar_inv_nonneg : + 0 ≤ (hP.barSigmaAtScale hStruct (0 : ℤ))⁻¹ := + (inv_pos.mpr hbar).le + simpa [gammaSigmaUnitEllipticityObservable, hbar] using add_nonneg + (mul_nonneg hbar_inv_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hInf.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1))) + (mul_nonneg hbar_nonneg + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hInf.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)))) + · simpa [gammaSigmaUnitEllipticityObservable, hbar] using add_nonneg + (Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hInf.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1)) + (inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hInf.sLower_pos (by norm_num : (1 : ℝ) ≤ 1))) + +theorem abs_unitEllipticityObservable_le_thetaHat_ae + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) : + (fun a : RegCoeffField d => + |gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower a|) + ≤ᵐ[P] fun _ => hInf.thetaHat := by + filter_upwards [hInf.bound] with a ha + rwa [abs_of_nonneg (hInf.unitEllipticityObservable_nonneg a)] + +/-- A uniform unit-scale bound is, in particular, a finite `Γσ` tail for every +positive finite exponent `σ`. -/ +theorem unitEllipticityObservable_isBigO + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + {σ : ℝ} (_hσ : 0 < σ) : + IsBigO P (gammaSigma σ) + (gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower) + hInf.thetaHat := by + let : IsProbabilityMeasure P := hP.isProbability + change IsBigOWith P (gammaSigma σ) + (fun a : RegCoeffField d => + |gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower a|) + hInf.thetaHat + have hconst : + IsBigOWith P (gammaSigma σ) + (fun _ : RegCoeffField d => hInf.thetaHat) hInf.thetaHat := by + have hconstAbs : + IsBigO P (gammaSigma σ) + (fun _ : RegCoeffField d => hInf.thetaHat) hInf.thetaHat := + Ch04.isBigO_gammaSigma_const_of_abs_le (μ := P) (σ := σ) + (A := hInf.thetaHat) (c := hInf.thetaHat) + hInf.thetaHat_pos.le + (by rw [abs_of_pos hInf.thetaHat_pos]) + change IsBigOWith P (gammaSigma σ) + (fun _ : RegCoeffField d => |hInf.thetaHat|) hInf.thetaHat at hconstAbs + simpa [abs_of_pos hInf.thetaHat_pos] using hconstAbs + exact + Ch04.isBigOWith_of_ae_le (μ := P) (Ψ := gammaSigma σ) + hconst hInf.abs_unitEllipticityObservable_le_thetaHat_ae + +/-- Forget the endpoint input to any finite positive `Γσ` input. -/ +def toGammaSigma + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + (σ : ℝ) (hσ : 0 < σ) : + GammaSigmaCoarseGrainedEllipticity P hP hStruct where + sigma := σ + sigma_pos := hσ + params := hInf.params + thetaHat := hInf.thetaHat + thetaHat_pos := hInf.thetaHat_pos + tail := hInf.unitEllipticityObservable_isBigO hσ + +/-- The endpoint implies the Chapter 5 quantitative coarse-grained +ellipticity package, via any finite exponent. -/ +def toQuantitativeCoarseGrainedEllipticity + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) : + QuantitativeCoarseGrainedEllipticity P := + (hInf.toGammaSigma 1 zero_lt_one).toQuantitativeCoarseGrainedEllipticity + +theorem barSigmaAtScale_zero_pos + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) : + 0 < hP.barSigmaAtScale hStruct (0 : ℤ) := + (hInf.toGammaSigma 1 zero_lt_one).barSigmaAtScale_zero_pos + +/-- The deterministic unit-scale constant for the endpoint normalized +`J` bound. -/ +noncomputable def unitJConst (d : ℕ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : ℝ := + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (Ch04.gammaMomentConst 1 * (params.xi : ℝ)) + +theorem unitJConst_pos + (params : QuantitativeCoarseGrainedEllipticityParams d) : + 0 < unitJConst d params := by + unfold unitJConst + have hcard_pos : 0 < (Fintype.card (BlockCoord d) : ℝ) := by + exact_mod_cast + (Fintype.card_pos_iff.mpr (inferInstance : Nonempty (BlockCoord d))) + have hxi_pos : 0 < (params.xi : ℝ) := by + exact_mod_cast params.xi_pos + have hgamma_pos : 0 < Ch04.gammaMomentConst (1 : ℝ) := by + exact IndependentSums.gammaMomentConst_pos zero_lt_one + positivity + +/-- Under the endpoint assumption, the limiting-normalized unit-cube `J` +observable is almost surely bounded by a deterministic multiple of +`thetaHat^2`. -/ +theorem limitNormalizedBlockJObservable_unit_le_thetaHat_sq_ae + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) : + limitNormalizedBlockJObservable hP hStruct (originCube d 0) e + ≤ᵐ[P] fun _ => + unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) := by + let hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hInf.toGammaSigma 1 zero_lt_one + let Cdim : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let G : ℝ := Ch04.gammaMomentConst (1 : ℝ) * (hInf.params.xi : ℝ) + let X : RegCoeffField d → ℝ := + gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower + have hJ_ae := hΓ.limitNormalizedBlockJObservable_le_card_sq_mul_weighted_ae e he + have htheta_le : + thetaAtScale hP hStruct (0 : ℤ) ≤ G * hInf.thetaHat := by + have h := hΓ.thetaAtScale_zero_le_gammaMomentScale + simpa [hΓ, G, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using h + have htheta_nonneg : 0 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + exact le_trans zero_le_one + (by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0) + have hthetaHat_nonneg : 0 ≤ hInf.thetaHat := hInf.thetaHat_pos.le + filter_upwards [hJ_ae, hInf.bound] with a hJ hX_le + have hY_le : Y a ≤ thetaAtScale hP hStruct (0 : ℤ) * X a := by + simpa [Y, X, hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using + hΓ.limitWeightedUnitEllipticityObservable_le_thetaAtScale_zero_mul_unit a + have hX_nonneg : 0 ≤ X a := by + simpa [X] using hInf.unitEllipticityObservable_nonneg a + have hY_scale : + Y a ≤ G * hInf.thetaHat ^ (2 : ℕ) := by + calc + Y a ≤ thetaAtScale hP hStruct (0 : ℤ) * X a := hY_le + _ ≤ thetaAtScale hP hStruct (0 : ℤ) * hInf.thetaHat := + mul_le_mul_of_nonneg_left hX_le htheta_nonneg + _ ≤ (G * hInf.thetaHat) * hInf.thetaHat := + mul_le_mul_of_nonneg_right htheta_le hthetaHat_nonneg + _ = G * hInf.thetaHat ^ (2 : ℕ) := by ring + calc + limitNormalizedBlockJObservable hP hStruct (originCube d 0) e a + ≤ Cdim * Y a := by + simpa [Cdim, Y, hΓ, + GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using hJ + _ ≤ Cdim * (G * hInf.thetaHat ^ (2 : ℕ)) := by + exact mul_le_mul_of_nonneg_left hY_scale (by dsimp [Cdim]; positivity) + _ = unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) := by + simp [unitJConst, Cdim, G] + ring + +/-- The endpoint unit `J` bound propagates to every origin scale. -/ +theorem limitNormalizedBlockJObservable_originCube_le_thetaHat_sq_ae + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) + {n : ℕ} : + limitNormalizedBlockJObservable hP hStruct + (originCube d ((n : ℕ) : ℤ)) e + ≤ᵐ[P] fun _ => + unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) := by + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hP hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hP hStruct e + have h0 := + hInf.limitNormalizedBlockJObservable_unit_le_thetaHat_sq_ae e he + have h0_raw : + Ch04.blockJObservableCubeSetBlockVec (originCube d 0) Pvec Qvec + ≤ᵐ[P] fun _ => + unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) := by + simpa [limitNormalizedBlockJObservable, Pvec, Qvec] using h0 + have hn_nonneg : 0 ≤ ((n : ℕ) : ℤ) := by + exact_mod_cast Nat.zero_le n + have hraw := + blockJObservableCubeSetBlockVec_originCube_le_of_scaleZero_ae + hP hStruct.stationary Pvec Qvec h0_raw hn_nonneg + simpa [limitNormalizedBlockJObservable, Pvec, Qvec] using hraw + +/-- The endpoint controls every localized normalized finite-probe maximum by a +deterministic multiple of `thetaHat^2`. -/ +theorem localizedNormalizedProbeJMax_le_thetaHat_sq_ae + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + {m n : ℕ} (hnm : n ≤ m) : + localizedNormalizedProbeJMax hP hStruct m n + ≤ᵐ[P] fun _ => + unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) := by + classical + let A : ℝ := unitJConst d hInf.params * hInf.thetaHat ^ (2 : ℕ) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + have hS : S.Nonempty := by + let α : BlockCoord d := Classical.choice inferInstance + exact ⟨(α, α, NormalizedProbeKind.coord), by simp [S]⟩ + have hEach : + ∀ i ∈ S, + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) + ≤ᵐ[P] fun _ => A := by + intro i _hi + have hOrigin := + hInf.limitNormalizedBlockJObservable_originCube_le_thetaHat_sq_ae + (normalizedProbeVec i) (normalizedProbeVec_abs_apply_le_one i) (n := n) + exact + localizedLimitNormalizedJMax_le_of_originCube_ae + hP hStruct hStruct.stationary hnm (normalizedProbeVec i) + (by simpa [A] using hOrigin) + have hAll : ∀ᵐ a ∂P, + ∀ i ∈ S, + localizedLimitNormalizedJMax hP hStruct m n (normalizedProbeVec i) a ≤ A := by + rw [Filter.eventually_all_finset] + intro i hi + exact hEach i hi + filter_upwards [hAll] with a ha + dsimp [localizedNormalizedProbeJMax] + exact Finset.sup'_le hS _ (fun i hi => ha i (by simp [S] at hi ⊢)) + +/-- The endpoint controls the localized scale-zero unit-ellipticity supremum +by a deterministic multiple of `thetaHat^2`. -/ +theorem localizedLimitWeightedUnitEllipticitySup_le_thetaHat_sq_ae + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct) + {m : ℕ} : + localizedLimitWeightedUnitEllipticitySup hP hStruct hInf.params m + ≤ᵐ[P] fun _ => + (Ch04.gammaMomentConst (1 : ℝ) * (hInf.params.xi : ℝ)) * + hInf.thetaHat ^ (2 : ℕ) := by + classical + let hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct := + hInf.toGammaSigma 1 zero_lt_one + let G : ℝ := Ch04.gammaMomentConst (1 : ℝ) * (hInf.params.xi : ℝ) + let A : ℝ := G * hInf.thetaHat ^ (2 : ℕ) + have htheta_le : + thetaAtScale hP hStruct (0 : ℤ) ≤ G * hInf.thetaHat := by + have h := hΓ.thetaAtScale_zero_le_gammaMomentScale + simpa [hΓ, G, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using h + have htheta_nonneg : 0 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + exact le_trans zero_le_one + (by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0) + have hthetaHat_nonneg : 0 ≤ hInf.thetaHat := hInf.thetaHat_pos.le + have hOrigin : + limitWeightedUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower + ≤ᵐ[P] fun _ => A := by + filter_upwards [hInf.bound] with a hunit + have hlim := + hΓ.limitWeightedUnitEllipticityObservable_le_thetaAtScale_zero_mul_unit a + calc + limitWeightedUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower a + ≤ thetaAtScale hP hStruct (0 : ℤ) * + gammaSigmaUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower a := by + simpa [hΓ, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] + using hlim + _ ≤ thetaAtScale hP hStruct (0 : ℤ) * hInf.thetaHat := + mul_le_mul_of_nonneg_left hunit htheta_nonneg + _ ≤ (G * hInf.thetaHat) * hInf.thetaHat := + mul_le_mul_of_nonneg_right htheta_le hthetaHat_nonneg + _ = A := by + simp [A] + ring + let Q : TriadicCube d := originCube d ((m : ℕ) : ℤ) + let D : Finset (TriadicCube d) := descendantsAtScale Q 0 + let hD : D.Nonempty := descendantsAtScale_nonempty Q (by simp [Q, originCube]) + have hEach : + ∀ U ∈ D, + (fun a : RegCoeffField d => + limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hInf.params.sUpper hInf.params.sLower a) + ≤ᵐ[P] fun _ => A := by + intro U hU + have hUscale : U.scale = 0 := + descendant_scale_eq_of_mem_descendantsAtScale (by simpa [D] using hU) + have hmap := + map_limitWeightedUnitEllipticityObservableOnCube_eq_origin_of_scale_zero + hP hStruct hUscale hInf.sUpper_pos hInf.sLower_pos + have hU_aem : + AEMeasurable + (limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hInf.params.sUpper hInf.params.sLower) P := + aemeasurable_limitWeightedUnitEllipticityObservableOnCube + hP hStruct U hInf.sUpper_pos hInf.sLower_pos + have h0_aem : + AEMeasurable + (limitWeightedUnitEllipticityObservable hP hStruct + hInf.params.sUpper hInf.params.sLower) P := by + simpa using + aemeasurable_limitWeightedUnitEllipticityObservableOnCube + hP hStruct (originCube d 0) hInf.sUpper_pos hInf.sLower_pos + exact ae_le_of_map_eq_map_aemeasurable hU_aem h0_aem hmap hOrigin + have hAll : ∀ᵐ a ∂P, + ∀ U ∈ D, + limitWeightedUnitEllipticityObservableOnCube hP hStruct U + hInf.params.sUpper hInf.params.sLower a ≤ A := by + rw [Filter.eventually_all_finset] + intro U hU + exact hEach U hU + filter_upwards [hAll] with a ha + dsimp [localizedLimitWeightedUnitEllipticitySup, Q, D] + exact Finset.sup'_le hD _ (fun U hU => ha U hU) + +end GammaInfinityCoarseGrainedEllipticity + +namespace GammaInfinityCoarseGrainedEllipticityNoXi + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +/-- Forget the endpoint input to any finite positive `Γσ` input, in the +manuscript-facing parameter package with no exposed moment exponent. -/ +noncomputable def toGammaSigmaNoXi + (hInf : GammaInfinityCoarseGrainedEllipticityNoXi P hP hStruct) + (σ : ℝ) (hσ : 0 < σ) : + GammaSigmaCoarseGrainedEllipticityNoXi P hP hStruct where + sigma := σ + sigma_pos := hσ + params := hInf.params + thetaHat := hInf.thetaHat + thetaHat_pos := hInf.thetaHat_pos + tail := by + simpa [GammaInfinityCoarseGrainedEllipticityNoXi.withInternalXi] using + hInf.withInternalXi.unitEllipticityObservable_isBigO hσ + +end GammaInfinityCoarseGrainedEllipticityNoXi + +/-- Endpoint (`σ = ∞`) version of Corollary `c.first.quenched.estimate`. + +In Lean the endpoint assumption is a separate structure. The conclusion is +obtained by applying the finite-`σ` corollary at `σ = 2`, which is exactly the +`Γ_{σ ∧ 2}` exponent when `σ = ∞`. -/ +theorem firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent_noXi_infinity + {d : ℕ} [NeZero d] + (params : GammaCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∃ Cfluct : ℝ, 0 < Cfluct ∧ + ∀ {Pμ : Ch04.RestrictionCoeffLaw d} + (hPμ : Ch04.RestrictionLawCarrier Pμ) + (hStruct : Ch04.RestrictionStructuralLaw Pμ) + (hInf : GammaInfinityCoarseGrainedEllipticityNoXi Pμ hPμ hStruct), + hInf.params = params → + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ {n m : ℕ}, n < m → + let hΓ2 : GammaSigmaCoarseGrainedEllipticityNoXi Pμ hPμ hStruct := + hInf.toGammaSigmaNoXi 2 (by norm_num : (0 : ℝ) < 2) + let N0 : ℕ := + annealedAlgebraicEntryScale Pμ + hΓ2.withInternalXi.toQuantitativeCoarseGrainedEllipticity Centry + IsBigOWith Pμ (gammaSigma 2) + (fun aω => + limitNormalizedBlockJObservable hPμ hStruct + (originCube d ((N0 + m : ℕ) : ℤ)) e aω - + Real.rpow (3 : ℝ) (-a * (n : ℝ))) + (Cfluct * + (3 : ℝ) ^ + (-(d : ℝ) / 2 * + (Int.toNat + (((N0 + m : ℕ) : ℤ) - + ((N0 + n : ℕ) : ℤ)) : ℝ)) * + hInf.thetaHat ^ (2 : ℕ)) := by + obtain ⟨Centry, a, hCentry, ha, hfinite⟩ := + firstQuenchedEstimate_limitNormalized_uniformAnnealedExponent_noXi + (d := d) params + obtain ⟨Cfluct, hCfluct, hfluct⟩ := + hfinite (σ := (2 : ℝ)) (by norm_num : (0 : ℝ) < 2) + refine ⟨Centry, a, hCentry, ha, Cfluct, hCfluct, ?_⟩ + intro Pμ hPμ hStruct hInf hparams e he_norm n m hnm + let hΓ2 : GammaSigmaCoarseGrainedEllipticityNoXi Pμ hPμ hStruct := + hInf.toGammaSigmaNoXi 2 (by norm_num : (0 : ℝ) < 2) + have hσ2 : hΓ2.sigma = (2 : ℝ) := rfl + have hparams2 : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticityNoXi.toGammaSigmaNoXi] + using hparams + have h := + hfluct hPμ hStruct hΓ2 hσ2 hparams2 e he_norm hnm + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticityNoXi.toGammaSigmaNoXi] + using h + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointDenominator.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointDenominator.lean new file mode 100644 index 0000000000..b005fe6402 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointDenominator.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighTop + +/-! # Uniform Endpoint Denominator -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Denominator selection at the uniform endpoint + +The endpoint high-bottom branch needs the high denominator squared and the +crude cutoff denominator to the power `(d - 2t) / t`. We deliberately choose a +slightly oversized denominator, avoiding roots; the later scale-compression +step absorbs this polynomial dependence into the `exp(C log^2)` envelope. +-/ + +noncomputable section + +/-- Common high-branch denominator for the `Γ∞` endpoint. -/ +noncomputable def uniformEndpointHighDenominator + (Dhigh Dcrude t d : ℝ) : ℝ := + max 1 (Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ ((d - 2 * t) / t)) + +theorem uniformEndpointHighDenominator_pos + {Dhigh Dcrude t d : ℝ} : + 0 < uniformEndpointHighDenominator Dhigh Dcrude t d := by + dsimp [uniformEndpointHighDenominator] + exact lt_of_lt_of_le zero_lt_one (le_max_left 1 _) + +theorem one_le_uniformEndpointHighDenominator + {Dhigh Dcrude t d : ℝ} : + 1 ≤ uniformEndpointHighDenominator Dhigh Dcrude t d := by + dsimp [uniformEndpointHighDenominator] + exact le_max_left 1 _ + +theorem uniformEndpointHighDenominator_dom_bottom + {Dhigh Dcrude t d : ℝ} (hd : 1 ≤ d) : + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ ((d - 2 * t) / t) ≤ + (uniformEndpointHighDenominator Dhigh Dcrude t d) ^ d := by + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t d + have hprod_le : Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ ((d - 2 * t) / t) ≤ Den := by + dsimp [Den, uniformEndpointHighDenominator] + exact le_max_right 1 _ + have hDen_one : 1 ≤ Den := by + dsimp [Den] + exact one_le_uniformEndpointHighDenominator + have hDen_le_pow : Den ≤ Den ^ d := + Real.self_le_rpow_of_one_le hDen_one hd + exact hprod_le.trans hDen_le_pow + +theorem uniformEndpointHighDenominator_dom_top + {Dhigh Dcrude t d : ℝ} (hDhigh : 0 ≤ Dhigh) + (ht : 0 < t) (htb : t ≤ d / 2) (hd : 1 ≤ d) : + Dhigh ^ (2 : ℝ) ≤ + (uniformEndpointHighDenominator Dhigh Dcrude t d) ^ d := by + have hκ_nonneg : 0 ≤ (d - 2 * t) / t := by + have hnum : 0 ≤ d - 2 * t := by linarith + positivity + have hfactor_one : + 1 ≤ (max 1 Dcrude) ^ ((d - 2 * t) / t) := + Real.one_le_rpow (le_max_left 1 Dcrude) hκ_nonneg + have hDhigh_sq_nonneg : 0 ≤ Dhigh ^ (2 : ℝ) := by + exact Real.rpow_nonneg hDhigh _ + have htop_to_product : + Dhigh ^ (2 : ℝ) ≤ + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ ((d - 2 * t) / t) := by + calc + Dhigh ^ (2 : ℝ) = Dhigh ^ (2 : ℝ) * 1 := by ring + _ ≤ Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ ((d - 2 * t) / t) := + mul_le_mul_of_nonneg_left hfactor_one hDhigh_sq_nonneg + exact htop_to_product.trans + (uniformEndpointHighDenominator_dom_bottom + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := d) hd) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointSynchronized.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointSynchronized.lean new file mode 100644 index 0000000000..ea9e15dcf0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformEndpointSynchronized.lean @@ -0,0 +1,957 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEndpointDenominator + +/-! # Uniform Endpoint Synchronized -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# Synchronized uniform-endpoint bad-scale inputs + +The endpoint bad-scale assembly must choose the high-branch constants, the +deterministic crude cutoff constant, and the annealed entry scale only once. +The lemmas in this file expose the endpoint high-bottom branch with those +constants supplied externally. +-/ + +noncomputable section + +/-- Localized high-bottom fixed-pair estimate at the uniform endpoint, with the +raw localized bad-pair estimate supplied externally. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high_gammaInfinity_of_badPair_bound + {d : ℕ} [NeZero d] {Cfluct Centry a : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (_hCentry : 0 < Centry) (ha : 0 < a) + (hhighRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = (2 : ℝ) → hΓ.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let N0 : ℕ := + annealedAlgebraicEntryScale P + hΓ.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let tau : ℝ := min (2 : ℝ) 2 + let scale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hΓ.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / (2 * K * scale) + ell < n → n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * ((D.card : ℝ) * Real.exp (-(lam ^ tau)))) : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA 2 := by + intro t αbad P hP hStruct hInf hparams q m n + dsimp only + intro hnm hqm ht hαt + classical + let : IsProbabilityMeasure P := hP.isProbability + let hΓ2 := hInf.toGammaSigma 2 (by norm_num : (0 : ℝ) < 2) + have hΓ2_params : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using hparams + let K : ℝ := quenchedProbeEnvelopeConst d + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ell : ℕ := selectedBadPairScale K a t αbad q m n + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ)) + by_cases hnq : n ≤ q + · by_cases hell : selectedBadPairScale K a t αbad q m n < n + · let highScale : ℝ := + Cfluct * + (3 : ℝ) ^ + ((-(d : ℝ) / 2) * ((n - ell : ℕ) : ℝ)) * + hInf.thetaHat ^ (2 : ℕ) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let highLam : ℝ := T / (2 * K * highScale) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hHighLam : highA ≤ highLam := by + simpa [K, x, ell, b, L, highScale, T, highLam, highA] using + highBottom_tailParameter_interpolation_lower_bound + (d := d) (K := K) (Cfluct := Cfluct) + (θ := hInf.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (m := m) (n := n) + hK_pos hCfluct hInf.thetaHat_pos ha ht hαt hell hnq hqm + have hsoft_raw : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highLam 2 := by + by_cases hlam : 1 ≤ highLam + · have hraw := + hhighRaw (t := t) (αbad := αbad) + hP hStruct hΓ2 rfl hΓ2_params + (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad : + P.real (badPairEvent Hshift t αbad q m n) ≤ + (S.card : ℝ) * + ((D.card : ℝ) * Real.exp (-(highLam ^ (2 : ℝ)))) := by + simpa [K, x, ell, selectedBadPairScale, N0, Hshift, D, S, + highScale, T, highLam, hΓ2, + GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using! + hraw hell hnm hqm hlam + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + have hpref : 0 ≤ pref := by + dsimp [pref] + positivity + exact + hmono.trans + (hbad.trans + (by + simpa [pref, mul_assoc] using + pref_mul_exp_le_softPairTail_of_one_le_lam + (pref := pref) (lam := highLam) (η := (2 : ℝ)) + hpref hlam)) + · exact + (measureReal_le_one + (μ := P) + (s := highBottomPairEvent Hshift K a t αbad q m n)).trans + (one_le_softPairTail_of_not_one_le_lam + (pref := pref) (lam := highLam) (η := (2 : ℝ)) hlam) + exact + hsoft_raw.trans + (softPairTail_mono_lam + (pref := pref) (lam₁ := highA) (lam₂ := highLam) + (η := (2 : ℝ)) (by norm_num) hHighLam) + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hell] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact softPairTail_nonneg + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, hnq] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact softPairTail_nonneg + +/-- Deterministic high-bottom fixed-pair cutoff at the uniform endpoint, with +the raw endpoint crude bad-pair cutoff supplied externally. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_eq_zero_of_crudeA_one_gammaInfinity_of_badPair_zero + {d : ℕ} [NeZero d] {Ccrude : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCcrude : 0 < Ccrude) + (hzeroRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) = 0) : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → n ≤ q → αbad < t → 1 ≤ crudeA → + P.real (highBottomPairEvent Hshift K a t αbad q m n) = 0 := by + intro Centry a t αbad P hP hStruct hInf hparams q m n + dsimp only + intro hnm hqm hnq hαt hcrudeA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hlam_lower : crudeA ≤ lam := by + simpa [K, x, scale, T, lam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hInf.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hInf.thetaHat_pos hnq hqm + have hlam_one : 1 ≤ lam := hcrudeA_one.trans hlam_lower + have hbad_zero : + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + have h := hzeroRaw (t := t) (αbad := αbad) + hP hStruct hInf hparams (N0 := N0) (q := q) (m := m) (n := n) + simpa [K, Hshift, x, scale, T, lam] using h hnm hqm hlam_one + have hle_zero : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ 0 := by + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + exact hmono.trans_eq hbad_zero + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + +/-- Endpoint high-bottom fixed row estimate with all constants supplied +externally. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity_of_bounds + {d : ℕ} [NeZero d] {Cfluct Ccrude Centry a : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCfluct : 0 < Cfluct) (hCcrude : 0 < Ccrude) + (_hCentry : 0 < Centry) (_ha : 0 < a) + (hhigh : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA 2) + (hzero : + ∀ {Centry' a' t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry' + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → n ≤ q → αbad < t → 1 ≤ crudeA → + P.real (highBottomPairEvent Hshift K a' t αbad q m n) = 0) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + intro t αbad Den P hP hStruct hInf hparams q r j + dsimp only + intro ht hαt htb hDen hDen_dom + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + Dhigh + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + Dcrude + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hInf.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hInf.thetaHat_pos 2) + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hnq : n ≤ q := by + dsimp [n] + exact Nat.sub_le q j.val + have htail_nonneg : + 0 ≤ (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + positivity + by_cases hnm : n < m + · by_cases hcrude_one : 1 ≤ crudeA + · have hzero_pair : + P.real (highBottomPairEvent Hshift K a t αbad q m n) = 0 := by + have hz := + hzero (Centry' := Centry) (a' := a) (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (m := m) (n := n) + simpa [K, N0, Hshift, crudeA, Dcrude] using + hz hnm hqm hnq hαt hcrude_one + rw [hzero_pair] + exact htail_nonneg + · have hcrude_lt : crudeA < 1 := lt_of_not_ge hcrude_one + have hfixed : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA 2 := by + have hx := + hhigh (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (m := m) (n := n) + dsimp only at hx + simpa [K, N0, Hshift, D, S, b, L, pref, highA, Dhigh] using + hx hnm hqm ht hαt + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hw_one : 1 ≤ w := by + have hn : 1 ≤ 3 ^ d := + Nat.succ_le_of_lt (pow_pos (by norm_num : (0 : ℕ) < 3) d) + simpa [w] using (by exact_mod_cast hn : (1 : ℝ) ≤ ((3 ^ d : ℕ) : ℝ)) + have hwq_one : 1 ≤ w ^ q := one_le_pow₀ hw_one + have hwr_one : 1 ≤ w ^ r := one_le_pow₀ hw_one + have hDcard : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + have hpref_bound : + max 1 pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hD_nonneg : 0 ≤ (D.card : ℝ) := by positivity + have hpref_le : + pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + calc + pref = (S.card : ℝ) * (D.card : ℝ) := rfl + _ ≤ max 1 (S.card : ℝ) * (w ^ q * w ^ r) := + mul_le_mul + (le_max_right 1 (S.card : ℝ)) hDcard + hD_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans + (le_max_left 1 (S.card : ℝ))) + _ = max 1 (S.card : ℝ) * w ^ q * w ^ r := by ring + have hone : + 1 ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hmaxS : 1 ≤ max 1 (S.card : ℝ) := + le_max_left 1 (S.card : ℝ) + nlinarith [hmaxS, hwq_one, hwr_one] + exact max_le hone hpref_le + have hpow : + (A * ρ ^ r) ^ η ≤ (max 1 highA) ^ (2 : ℝ) := by + simpa [b, m, n, highA, A, ρ, η, Dhigh, Dcrude, crudeA] using + uniformEndpoint_highBottom_tailParameter_rpow_le_high + (d := d) (q := q) (r := r) (j := j) + (t := t) (α := αbad) (L := L) + (Dhigh := Dhigh) (Dcrude := Dcrude) (Den := Den) + ht hαt (by simpa [b] using htb) + hDhigh_pos hDcrude_pos hDen + (by simpa [Dhigh, Dcrude, η] using hDen_dom) + (by simpa [m, n, Dcrude, crudeA] using hcrude_lt) + have hCpref_nonneg : 0 ≤ max 1 (S.card : ℝ) := by + exact (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 (S.card : ℝ)) + have hrow := + le_weighted_row_of_le_soft_single + (x := P.real (highBottomPairEvent Hshift K a t αbad q m n)) + (pref := pref) (highA := highA) (A := A) (ρ := ρ) (η := η) + (C := max 1 (S.card : ℝ)) (w := w) (q := q) (r := r) + hfixed hpref_bound hCpref_nonneg hw_pos.le hpow + change + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) + calc + P.real (highBottomPairEvent Hshift K a t αbad q m n) + ≤ (Real.exp 1 * max 1 (S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := hrow + _ = (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + dsimp [Cpref] + · have hempty : + highBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Endpoint high-bottom component estimate from synchronized row bounds. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity_of_row_bound + {d : ℕ} [NeZero d] {Cfluct Ccrude Centry a : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hrow : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η)))) : + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + αbad < t → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cpref * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + intro t αbad Den P hP hStruct hInf hparams q + dsimp only + intro ht hαt htb hDen hDen_dom hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hexp_pos : 0 < 2 * (t - αbad) / η := by + exact div_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) (sub_pos.mpr hαt)) hη_pos + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (2 * (t - αbad) / η) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hexp_pos + have hC_nonneg : 0 ≤ Cpref * w ^ q := by + dsimp [Cpref] + positivity + exact + measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := η) + (C := Cpref * w ^ q) (w := w) + hC_nonneg hw_pos hA_one hρ_gt hη_pos + (by + intro r j + simpa [K, N0, Hshift, S, b, L, η, w, Dhigh, Dcrude, + A, ρ, Cpref] using + hrow (t := t) (αbad := αbad) (Den := Den) + hP hStruct hInf hparams + (q := q) (r := r) (j := j) + ht hαt htb hDen hDen_dom) + +/-- Endpoint crude-bottom fixed-pair cutoff with the raw endpoint crude +bad-pair cutoff supplied externally. -/ +theorem measureReal_shiftedCrudeBottomPairEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity_of_badPair_zero + {d : ℕ} [NeZero d] {Ccrude : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hCcrude : 0 < Ccrude) + (hzeroRaw : + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {N0 q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := Real.rpow (3 : ℝ) (-x) + let lam : ℝ := T / scale + n < m → q ≤ m → 1 ≤ lam → + P.real (badPairEvent Hshift t αbad q m n) = 0) : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) = 0 := by + intro Centry a t αbad P hP hStruct hInf hparams q r j + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + let m : ℕ := q + r + let n : ℕ := q - j.val + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let ℓ : ℕ := + Nat.ceil + ((a * Real.log 3)⁻¹ * + (Real.log (max (2 * K) 1) + x * Real.log 3)) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hA_nonneg : 0 ≤ A := by linarith + by_cases hnℓ_sel : n ≤ selectedBadPairScale K a t αbad q m n + · by_cases hnm : n < m + · have hℓ_eq : ℓ = selectedBadPairScale K a t αbad q m n := by + dsimp [ℓ, selectedBadPairScale, x] + have hnℓ : n ≤ ℓ := by + simpa [hℓ_eq] using hnℓ_sel + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hlam_lower : A * ρ ^ r ≤ lam := by + exact + crudeBottom_lam_lower + (d := d) (K := K) (C := Ccrude) + (θ := hInf.thetaHat) (a := a) (t := t) (α := αbad) + (q := q) (r := r) (j := j) + hK_pos hCcrude hInf.thetaHat_pos ha ht hαt + hnℓ hnm + have hρ_pow_one : 1 ≤ ρ ^ r := + one_le_pow₀ (le_of_lt hρ_gt) + have hlam_one : 1 ≤ lam := by + have hAρ_one : 1 ≤ A * ρ ^ r := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ A * ρ ^ r := + mul_le_mul hA_one hρ_pow_one + (by norm_num : (0 : ℝ) ≤ 1) hA_nonneg + exact hAρ_one.trans hlam_lower + have hraw := + hzeroRaw (t := t) (αbad := αbad) hP hStruct hInf hparams + (N0 := N0) (q := q) (m := m) (n := n) + dsimp only at hraw + have hbad_zero : + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + simpa [K, Hshift, x, scale, T, lam] using + hraw hnm hqm hlam_one + have hle_zero : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ 0 := by + have hmono : + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono + (by + intro ω hω + exact hω.2.2) + exact hmono.trans_eq hbad_zero + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + · have hempty : + crudeBottomPairEvent Hshift K a t αbad q m n = ∅ := by + ext ω + simp [crudeBottomPairEvent, hnℓ_sel] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + +/-- Endpoint crude-bottom component cutoff from synchronized fixed-pair +cutoffs. -/ +theorem measureReal_shiftedCrudeBottomBadScaleEvent_quenchedProbeEnvelope_eq_zero_gammaInfinity_of_pair_zero + {d : ℕ} [NeZero d] {Ccrude : ℝ} + (params : QuantitativeCoarseGrainedEllipticityParams d) + (hpair : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomPairEvent Hshift K a t αbad q m n) = 0) : + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := + (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + 0 < a → + 0 < t → + αbad < t → + 1 ≤ A → + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) = 0 := by + intro Centry a t αbad P hP hStruct hInf hparams q + dsimp only + intro ha ht hαt hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let A : ℝ := + (3 : ℝ) ^ (t * (q : ℝ) - t * (L + 1)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρ : ℝ := (3 : ℝ) ^ (t - αbad) + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (t - αbad) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hgap + have hd_pos : 0 < ((d : ℕ) : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hle_zero : + P.real (crudeBottomBadScaleEvent Hshift K a t αbad q) ≤ 0 := by + simpa using + measureReal_crudeBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := (1 : ℝ)) (ρ := ρ) (η := ((d : ℕ) : ℝ)) + (C := (0 : ℝ)) (w := w) + (by norm_num : (0 : ℝ) ≤ 0) hw_pos + (by norm_num : (1 : ℝ) ≤ 1) hρ_gt hd_pos + (by + intro r j + have hz := + hpair (Centry := Centry) (a := a) (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (r := r) (j := j) + ha ht hαt hA_one + simpa [K, N0, Hshift, L, A, ρ] using + (by + rw [hz] + simp : P.real + (crudeBottomPairEvent Hshift K a t αbad q (q + r) (q - j.val)) + ≤ 0 * (w ^ r * Real.exp (-(((1 : ℝ) * ρ ^ r) ^ ((d : ℕ) : ℝ))))) + ) + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighBottom.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighBottom.lean new file mode 100644 index 0000000000..506ae1acec --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighBottom.lean @@ -0,0 +1,708 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformCrudeBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScalePairCollapse + +/-! # Uniform High Bottom -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# The mixed high-bottom branch at the uniform endpoint + +The endpoint high-bottom branch keeps the localized `Γ_2` concentration +mechanism and adds the deterministic `Γ_∞` crude cutoff. The final row +collapse is built on these two separate inputs. +-/ + +noncomputable section + +/-- The localized high estimate in the high-bottom branch, specialized to +the uniform endpoint by forgetting `Γ_∞` to finite `Γ_2`. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, + 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + (2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → 0 < t → αbad < t → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + softPairTail pref highA 2 := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hhigh⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high + (d := d) (σ := (2 : ℝ)) (by norm_num) params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad P hP hStruct hInf hparams q m n + dsimp only + intro hnm hqm ht hαt + let hΓ2 := hInf.toGammaSigma 2 (by norm_num : (0 : ℝ) < 2) + have hΓ2_params : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using hparams + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using! + hhigh (t := t) (αbad := αbad) hP hStruct hΓ2 rfl hΓ2_params + (q := q) (m := m) (n := n) hnm hqm ht hαt + +/-- The deterministic crude cutoff in the high-bottom branch. If the crude +tail parameter is at least one, the bad-pair event, hence the high-bottom +subevent, has zero probability. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_eq_zero_of_crudeA_one_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Ccrude : ℝ, 0 < Ccrude ∧ + ∀ {Centry a t αbad : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q m n : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + n < m → q ≤ m → n ≤ q → αbad < t → 1 ≤ crudeA → + P.real (highBottomPairEvent Hshift K a t αbad q m n) = 0 := by + obtain ⟨Ccrude, hCcrude, hraw⟩ := + measureReal_shiftedCrude_badPairEvent_quenchedProbeEnvelope_eq_zero_of_gammaInfinity + (d := d) params + refine ⟨Ccrude, hCcrude, ?_⟩ + intro Centry a t αbad P hP hStruct hInf hparams q m n + dsimp only + intro hnm hqm hnq hαt hcrudeA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let x : ℝ := + αbad * ((m - q : ℕ) : ℝ) - t * ((m - n : ℕ) : ℝ) + let scale : ℝ := K * (Ccrude * hInf.thetaHat ^ (2 : ℕ)) + let T : ℝ := (3 : ℝ) ^ (-x) + let lam : ℝ := T / scale + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + (K * Ccrude * hInf.thetaHat ^ (2 : ℕ)) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hlam_lower : crudeA ≤ lam := by + simpa [K, x, scale, T, lam, crudeA] using + crudeBottom_tailParameter_discount_lower_bound + (K := K) (C := Ccrude) (θ := hInf.thetaHat) + (t := t) (α := αbad) (q := q) (m := m) (n := n) + hK_pos hCcrude hInf.thetaHat_pos hnq hqm + have hlam_one : 1 ≤ lam := hcrudeA_one.trans hlam_lower + have hbad_zero : + P.real (badPairEvent Hshift t αbad q m n) = 0 := by + have h := hraw (t := t) (αbad := αbad) hP hStruct hInf hparams + (N0 := N0) (q := q) (m := m) (n := n) + simpa [K, Hshift, x, scale, T, lam] using h hnm hqm hlam_one + have hle_zero : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ 0 := by + have hmono : + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + P.real (badPairEvent Hshift t αbad q m n) := + measureReal_mono (μ := P) (by + intro ω hω + exact hω.2.2) + exact hmono.trans_eq hbad_zero + exact le_antisymm hle_zero MeasureTheory.measureReal_nonneg + +/-- Convert a one-branch softened fixed-pair estimate into the weighted row +shape used by the endpoint bottom summation. -/ +theorem le_weighted_row_of_le_soft_single + {x pref highA A ρ η C w : ℝ} {q r : ℕ} + (hx : x ≤ softPairTail pref highA 2) + (hpref : max 1 pref ≤ C * w ^ q * w ^ r) + (hC : 0 ≤ C) (hw : 0 ≤ w) + (hpow : (A * ρ ^ r) ^ η ≤ (max 1 highA) ^ (2 : ℝ)) : + x ≤ + (Real.exp 1 * C * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + have hexp : + Real.exp (1 - (max 1 highA) ^ (2 : ℝ)) ≤ + Real.exp (1 - (A * ρ ^ r) ^ η) := + Real.exp_le_exp.mpr (by linarith) + have hrow_nonneg : 0 ≤ C * w ^ q * w ^ r := by + positivity + have hexp_split : + Real.exp (1 - (A * ρ ^ r) ^ η) = + Real.exp 1 * Real.exp (-((A * ρ ^ r) ^ η)) := by + rw [← Real.exp_add] + congr 1 + calc + x ≤ softPairTail pref highA 2 := hx + _ = max 1 pref * Real.exp (1 - (max 1 highA) ^ (2 : ℝ)) := by + rfl + _ ≤ (C * w ^ q * w ^ r) * + Real.exp (1 - (A * ρ ^ r) ^ η) := + mul_le_mul hpref hexp (Real.exp_pos _).le hrow_nonneg + _ = + (Real.exp 1 * C * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + rw [hexp_split] + ring + +/-- Endpoint high-bottom deterministic tail-parameter comparison. + +When the crude cutoff has not fired, the crude denominator pays for the +missing high-branch factor `3 ^ ((d - 2t) * (q - n))`. -/ +theorem uniformEndpoint_highBottom_tailParameter_rpow_le_high + {d q r : ℕ} [NeZero d] {j : Fin (q + 1)} + {t α L Dhigh Dcrude Den : ℝ} + (ht : 0 < t) (hαt : α < t) (htb : t ≤ (d : ℝ) / 2) + (hDhigh : 0 < Dhigh) (hDcrude : 0 < Dcrude) (hDen : 0 < Den) + (hDen_dom : + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ + Den ^ ((d : ℕ) : ℝ)) + (hcrude : + (3 : ℝ) ^ + (t * ((q - (q - j.val) : ℕ) : ℝ) + + (t - α) * ((q + r - q : ℕ) : ℝ)) / + Dcrude < 1) : + let b : ℝ := (d : ℝ) / 2 + let m : ℕ := q + r + let n : ℕ := q - j.val + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + Dhigh + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - α) / ((d : ℕ) : ℝ)) + (A * ρ ^ r) ^ ((d : ℕ) : ℝ) ≤ (max 1 highA) ^ (2 : ℝ) := by + intro b m n highA A ρ + have hd_pos : 0 < ((d : ℕ) : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hthree_pos : 0 < (3 : ℝ) := by norm_num + have hthree_nonneg : 0 ≤ (3 : ℝ) := by norm_num + have hκ_nonneg : 0 ≤ ((d : ℝ) - 2 * t) / t := by + have hnum : 0 ≤ (d : ℝ) - 2 * t := by linarith + positivity + let κ : ℝ := ((d : ℝ) - 2 * t) / t + let Z : ℝ := + t * ((q - (q - j.val) : ℕ) : ℝ) + + (t - α) * ((q + r - q : ℕ) : ℝ) + let M : ℝ := ((d : ℝ) - 2 * t) * (j.val : ℝ) + let X : ℝ := + (d : ℝ) * (q : ℝ) - (d : ℝ) * (L + 1) + + 2 * (t - α) * (r : ℝ) + let Y : ℝ := + 2 * + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - α) * ((m - q : ℕ) : ℝ) - b * (L + 1)) + have hm_sub_q : ((m - q : ℕ) : ℝ) = (r : ℝ) := by + dsimp [m] + rw [Nat.add_sub_cancel_left] + have hq_sub_n : ((q - n : ℕ) : ℝ) = (j.val : ℝ) := by + dsimp [n] + have hj : j.val ≤ q := Nat.lt_succ_iff.mp j.isLt + norm_num [Nat.sub_sub_self hj] + have hY_eq : Y = X - M := by + dsimp [X, Y, M, b] + rw [hm_sub_q, hq_sub_n] + ring + have hZ_eq : + Z = t * (j.val : ℝ) + (t - α) * (r : ℝ) := by + dsimp [Z] + have hj : j.val ≤ q := Nat.lt_succ_iff.mp j.isLt + rw [Nat.sub_sub_self hj, Nat.add_sub_cancel_left] + have hM_le : M ≤ κ * Z := by + have hgap_nonneg : 0 ≤ t - α := (sub_pos.mpr hαt).le + have hj_nonneg : 0 ≤ (j.val : ℝ) := by positivity + have hr_nonneg : 0 ≤ (r : ℝ) := by positivity + have htj_nonneg : 0 ≤ t * (j.val : ℝ) := mul_nonneg ht.le hj_nonneg + have hrow_nonneg : 0 ≤ (t - α) * (r : ℝ) := + mul_nonneg hgap_nonneg hr_nonneg + have hterm_le : + t * (j.val : ℝ) ≤ + t * (j.val : ℝ) + (t - α) * (r : ℝ) := by + linarith + calc + M = κ * (t * (j.val : ℝ)) := by + dsimp [M, κ] + field_simp [ht.ne'] + _ ≤ κ * (t * (j.val : ℝ) + (t - α) * (r : ℝ)) := + mul_le_mul_of_nonneg_left hterm_le hκ_nonneg + _ = κ * Z := by + rw [hZ_eq] + have hcrude_num : (3 : ℝ) ^ Z < Dcrude := by + have hcrude' : (3 : ℝ) ^ Z / Dcrude < 1 := by + simpa [Z] using hcrude + exact (div_lt_one hDcrude).mp hcrude' + have hthreeM_le : + (3 : ℝ) ^ M ≤ (max 1 Dcrude) ^ κ := by + have hpowMκ : + (3 : ℝ) ^ M ≤ (3 : ℝ) ^ (κ * Z) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hM_le + have hpow_mul : + (3 : ℝ) ^ (κ * Z) = ((3 : ℝ) ^ Z) ^ κ := by + rw [← Real.rpow_mul hthree_nonneg] + ring_nf + have hmaxD : (3 : ℝ) ^ Z ≤ max 1 Dcrude := + (le_of_lt hcrude_num).trans (le_max_right 1 Dcrude) + have hmono : + ((3 : ℝ) ^ Z) ^ κ ≤ (max 1 Dcrude) ^ κ := + Real.rpow_le_rpow + (Real.rpow_pos_of_pos hthree_pos Z).le hmaxD hκ_nonneg + exact hpowMκ.trans (by simpa [hpow_mul] using hmono) + have hAρ_eq : + (A * ρ ^ r) ^ ((d : ℕ) : ℝ) = + (3 : ℝ) ^ X / Den ^ ((d : ℕ) : ℝ) := by + have hρ_pow : + ρ ^ r = (3 : ℝ) ^ ((2 * (t - α) / ((d : ℕ) : ℝ)) * (r : ℝ)) := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul hthree_nonneg] + have hbase : + A * ρ ^ r = + (3 : ℝ) ^ (X / ((d : ℕ) : ℝ)) / Den := by + dsimp [A, ρ, X] + rw [hρ_pow] + calc + ((3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den) * + (3 : ℝ) ^ ((2 * (t - α) / ((d : ℕ) : ℝ)) * (r : ℝ)) + = + ((3 : ℝ) ^ ((q : ℝ) - (L + 1)) * + (3 : ℝ) ^ ((2 * (t - α) / ((d : ℕ) : ℝ)) * (r : ℝ))) / + Den := by ring + _ = + (3 : ℝ) ^ + (((q : ℝ) - (L + 1)) + + (2 * (t - α) / ((d : ℕ) : ℝ)) * (r : ℝ)) / + Den := by + rw [← Real.rpow_add hthree_pos] + _ = (3 : ℝ) ^ (X / ((d : ℕ) : ℝ)) / Den := by + congr 2 + field_simp [hd_pos.ne'] + ring + rw [hbase] + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDen.le] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + field_simp [hd_pos.ne'] + have hhigh_sq_le : + (3 : ℝ) ^ Y / Dhigh ^ (2 : ℝ) ≤ (max 1 highA) ^ (2 : ℝ) := by + have hhigh_nonneg : 0 ≤ highA := by + dsimp [highA] + exact div_nonneg (Real.rpow_pos_of_pos hthree_pos _).le hDhigh.le + have hhigh_sq : + highA ^ (2 : ℝ) = + (3 : ℝ) ^ Y / Dhigh ^ (2 : ℝ) := by + dsimp [highA, Y] + rw [Real.div_rpow (Real.rpow_nonneg hthree_nonneg _) hDhigh.le] + congr 1 + rw [← Real.rpow_mul hthree_nonneg] + congr 1 + ring + have hmono : + highA ^ (2 : ℝ) ≤ (max 1 highA) ^ (2 : ℝ) := + Real.rpow_le_rpow hhigh_nonneg + (le_max_right 1 highA) (by norm_num : (0 : ℝ) ≤ (2 : ℝ)) + simpa [hhigh_sq] using hmono + have hnum : + (3 : ℝ) ^ X ≤ (3 : ℝ) ^ Y * (max 1 Dcrude) ^ κ := by + calc + (3 : ℝ) ^ X + = (3 : ℝ) ^ (Y + M) := by + rw [hY_eq] + ring_nf + _ = (3 : ℝ) ^ Y * (3 : ℝ) ^ M := by + rw [Real.rpow_add hthree_pos] + _ ≤ (3 : ℝ) ^ Y * (max 1 Dcrude) ^ κ := + mul_le_mul_of_nonneg_left hthreeM_le + (Real.rpow_pos_of_pos hthree_pos Y).le + have hMpos : 0 < (max 1 Dcrude) ^ κ := by + exact Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 Dcrude)) κ + have hDhigh_sq_pos : 0 < Dhigh ^ (2 : ℝ) := + Real.rpow_pos_of_pos hDhigh 2 + rw [hAρ_eq] + calc + (3 : ℝ) ^ X / Den ^ ((d : ℕ) : ℝ) + ≤ ((3 : ℝ) ^ Y * (max 1 Dcrude) ^ κ) / + Den ^ ((d : ℕ) : ℝ) := + div_le_div_of_nonneg_right hnum + (Real.rpow_pos_of_pos hDen ((d : ℕ) : ℝ)).le + _ ≤ ((3 : ℝ) ^ Y * (max 1 Dcrude) ^ κ) / + (Dhigh ^ (2 : ℝ) * (max 1 Dcrude) ^ κ) := + div_le_div_of_nonneg_left + (mul_nonneg (Real.rpow_pos_of_pos hthree_pos Y).le hMpos.le) + (mul_pos hDhigh_sq_pos hMpos) hDen_dom + _ = (3 : ℝ) ^ Y / Dhigh ^ (2 : ℝ) := by + field_simp [hDhigh_sq_pos.ne', hMpos.ne'] + _ ≤ (max 1 highA) ^ (2 : ℝ) := hhigh_sq_le + +/-- Endpoint high-bottom fixed row estimate. The only side condition is the +explicit domination of the high denominator and the crude cutoff denominator by +the selected endpoint denominator. -/ +theorem measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q r : ℕ} {j : Fin (q + 1)}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + 0 < t → + αbad < t → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + P.real (highBottomPairEvent Hshift K a t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + obtain ⟨Cfluct, CentryHigh, aHigh, hCfluct, hCentryHigh, haHigh, hhigh⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_soft_high_gammaInfinity + (d := d) params + obtain ⟨Ccrude, hCcrude, hzero⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_eq_zero_of_crudeA_one_gammaInfinity + (d := d) params + refine ⟨Cfluct, Ccrude, CentryHigh, aHigh, + hCfluct, hCcrude, hCentryHigh, haHigh, ?_⟩ + intro t αbad Den P hP hStruct hInf hparams q r j + dsimp only + intro ht hαt htb hDen hDen_dom + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity CentryHigh + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (aHigh * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let m : ℕ := q + r + let n : ℕ := q - j.val + let D : Finset (TriadicCube d) := + descendantsAtScale + (originCube d (((N0 + m : ℕ) : ℤ))) + (((N0 + n : ℕ) : ℤ)) + let pref : ℝ := (S.card : ℝ) * (D.card : ℝ) + let highA : ℝ := + (3 : ℝ) ^ + (b * (q : ℝ) - (b - t) * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ) - b * (L + 1)) / + Dhigh + let crudeA : ℝ := + (3 : ℝ) ^ + (t * ((q - n : ℕ) : ℝ) + + (t - αbad) * ((m - q : ℕ) : ℝ)) / + Dcrude + have hd_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hInf.thetaHat_pos 2) + have hDcrude_pos : 0 < Dcrude := by + dsimp [Dcrude] + exact mul_pos (mul_pos hK_pos hCcrude) (pow_pos hInf.thetaHat_pos 2) + have hqm : q ≤ m := by + dsimp [m] + exact Nat.le_add_right q r + have hnq : n ≤ q := by + dsimp [n] + exact Nat.sub_le q j.val + have htail_nonneg : + 0 ≤ (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + positivity + by_cases hnm : n < m + · by_cases hcrude_one : 1 ≤ crudeA + · have hzero_pair : + P.real (highBottomPairEvent Hshift K aHigh t αbad q m n) = 0 := by + have hz := + hzero (Centry := CentryHigh) (a := aHigh) (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (m := m) (n := n) + simpa [K, N0, Hshift, crudeA, Dcrude] using + hz hnm hqm hnq hαt hcrude_one + rw [hzero_pair] + exact htail_nonneg + · have hcrude_lt : crudeA < 1 := lt_of_not_ge hcrude_one + have hfixed : + P.real (highBottomPairEvent Hshift K aHigh t αbad q m n) ≤ + softPairTail pref highA 2 := by + have hx := + hhigh (t := t) (αbad := αbad) + hP hStruct hInf hparams (q := q) (m := m) (n := n) + dsimp only at hx + simpa [K, N0, Hshift, D, S, b, L, pref, highA, Dhigh] using + hx hnm hqm ht hαt + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hw_one : 1 ≤ w := by + have hn : 1 ≤ 3 ^ d := + Nat.succ_le_of_lt (pow_pos (by norm_num : (0 : ℕ) < 3) d) + simpa [w] using (by exact_mod_cast hn : (1 : ℝ) ≤ ((3 ^ d : ℕ) : ℝ)) + have hwq_one : 1 ≤ w ^ q := one_le_pow₀ hw_one + have hwr_one : 1 ≤ w ^ r := one_le_pow₀ hw_one + have hDcard : + (D.card : ℝ) ≤ w ^ q * w ^ r := by + have hnm_le : n ≤ m := le_of_lt hnm + simpa [D, w, m, n] using + descendantsAtScale_bottom_row_card_le_weight + (d := d) (N := N0) (q := q) (r := r) (j := j) hnm_le + have hpref_bound : + max 1 pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hD_nonneg : 0 ≤ (D.card : ℝ) := by positivity + have hpref_le : + pref ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + calc + pref = (S.card : ℝ) * (D.card : ℝ) := rfl + _ ≤ max 1 (S.card : ℝ) * (w ^ q * w ^ r) := + mul_le_mul + (le_max_right 1 (S.card : ℝ)) hDcard + hD_nonneg + ((by norm_num : (0 : ℝ) ≤ 1).trans + (le_max_left 1 (S.card : ℝ))) + _ = max 1 (S.card : ℝ) * w ^ q * w ^ r := by ring + have hone : + 1 ≤ max 1 (S.card : ℝ) * w ^ q * w ^ r := by + have hmaxS : 1 ≤ max 1 (S.card : ℝ) := + le_max_left 1 (S.card : ℝ) + nlinarith [hmaxS, hwq_one, hwr_one] + exact max_le hone hpref_le + have hpow : + (A * ρ ^ r) ^ η ≤ (max 1 highA) ^ (2 : ℝ) := by + simpa [b, m, n, highA, A, ρ, η, Dhigh, Dcrude, crudeA] using + uniformEndpoint_highBottom_tailParameter_rpow_le_high + (d := d) (q := q) (r := r) (j := j) + (t := t) (α := αbad) (L := L) + (Dhigh := Dhigh) (Dcrude := Dcrude) (Den := Den) + ht hαt (by simpa [b] using htb) + hDhigh_pos hDcrude_pos hDen + (by simpa [Dhigh, Dcrude, η] using hDen_dom) + (by simpa [m, n, Dcrude, crudeA] using hcrude_lt) + have hCpref_nonneg : 0 ≤ max 1 (S.card : ℝ) := by + exact (by norm_num : (0 : ℝ) ≤ 1).trans (le_max_left 1 (S.card : ℝ)) + have hrow := + le_weighted_row_of_le_soft_single + (x := P.real (highBottomPairEvent Hshift K aHigh t αbad q m n)) + (pref := pref) (highA := highA) (A := A) (ρ := ρ) (η := η) + (C := max 1 (S.card : ℝ)) (w := w) (q := q) (r := r) + hfixed hpref_bound hCpref_nonneg hw_pos.le hpow + change + P.real (highBottomPairEvent Hshift K aHigh t αbad q m n) ≤ + (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) + calc + P.real (highBottomPairEvent Hshift K aHigh t αbad q m n) + ≤ (Real.exp 1 * max 1 (S.card : ℝ) * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := hrow + _ = (Cpref * w ^ q) * + (w ^ r * Real.exp (-((A * ρ ^ r) ^ η))) := by + dsimp [Cpref] + · have hempty : + highBottomPairEvent Hshift K aHigh t αbad q m n = ∅ := by + ext ω + simp [highBottomPairEvent, badPairEvent, hnm] + rw [hempty] + simp only [Measure.real, measure_empty, ENNReal.toReal_zero] + exact htail_nonneg + +/-- Endpoint high-bottom component estimate after summing the fixed rows. -/ +theorem measureReal_shiftedHighBottomBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Ccrude Centry a : ℝ, + 0 < Cfluct ∧ 0 < Ccrude ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + 0 < t → + αbad < t → + t ≤ b → + 0 < Den → + Dhigh ^ (2 : ℝ) * + (max 1 Dcrude) ^ (((d : ℝ) - 2 * t) / t) ≤ Den ^ η → + 1 ≤ A → + P.real (highBottomBadScaleEvent Hshift K a t αbad q) ≤ + ((q + 1 : ℕ) : ℝ) * (Cpref * w ^ q) * + (Real.exp (-(A ^ η)) * + weightedGeometricExpKernelConst w (ρ ^ η)) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hrow⟩ := + measureReal_shiftedHighBottomPairEvent_quenchedProbeEnvelope_le_weighted_row_gammaInfinity + (d := d) params + refine ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hInf hparams q + dsimp only + intro ht hαt htb hDen hDen_dom hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρ : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cpref : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hρ_gt : 1 < ρ := by + have hexp_pos : 0 < 2 * (t - αbad) / η := by + exact div_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) (sub_pos.mpr hαt)) hη_pos + dsimp [ρ] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ (2 * (t - αbad) / η) := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hexp_pos + have hC_nonneg : 0 ≤ Cpref * w ^ q := by + dsimp [Cpref] + positivity + exact + measureReal_highBottomBadScaleEvent_le_weighted_exp_constRows_kernel_of_reindexed_bound + (μ := P) (H := Hshift) (K := K) (a := a) + (t := t) (α := αbad) (q := q) + (A := A) (ρ := ρ) (η := η) + (C := Cpref * w ^ q) (w := w) + hC_nonneg hw_pos hA_one hρ_gt hη_pos + (by + intro r j + simpa [K, N0, Hshift, S, b, L, η, w, Dhigh, Dcrude, + A, ρ, Cpref] using + hrow (t := t) (αbad := αbad) (Den := Den) + hP hStruct hInf hparams + (q := q) (r := r) (j := j) + ht hαt htb hDen hDen_dom) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighTop.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighTop.lean new file mode 100644 index 0000000000..fd812efaa1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHighTop.lean @@ -0,0 +1,226 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformHighBottom +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.BadScaleTailDenominator + +/-! # Uniform High Top -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open scoped ENNReal + +/-! +# The localized high-top branch at the uniform endpoint + +The high-top branch uses the finite `Γ_2` consequence of the uniform endpoint. +Since the localized top exponent is `2 * d / 2`, this branch already has the +endpoint `Γ_d` exponent after a deterministic denominator rewrite. +-/ + +noncomputable section + +/-- Endpoint high-top component estimate after rewriting the localized +`Γ_2` branch with the endpoint exponent `d`. -/ +theorem measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_gammaInfinity + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Cfluct Centry a : ℝ, + 0 < Cfluct ∧ 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad Den : ℝ}, + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + ∀ {q : ℕ}, + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + 0 < t → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + 0 < Den → + Dhigh ^ (2 : ℝ) ≤ Den ^ η → + 1 ≤ A → + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) := by + obtain ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, hraw⟩ := + measureReal_shiftedHigh_badPairEvent_quenchedProbeEnvelope_le_card_mul_card_mul_exp_noLog + (d := d) (σ := (2 : ℝ)) (by norm_num) params + refine ⟨Cfluct, Centry, a, hCfluct, hCentry, ha, ?_⟩ + intro t αbad Den P hP hStruct hInf hparams q + dsimp only + intro ht hαt hαb hαharm hDen hDen_high hA_one + classical + let : IsProbabilityMeasure P := hP.isProbability + let hΓ2 := hInf.toGammaSigma 2 (by norm_num : (0 : ℝ) < 2) + have hΓ2_params : hΓ2.params = params := by + simpa [hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using hparams + let K : ℝ := quenchedProbeEnvelopeConst d + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Aold : ℝ := + (3 : ℝ) ^ (b * (q : ℝ) - b * (L + 1)) / Dhigh + let A : ℝ := (3 : ℝ) ^ ((q : ℝ) - (L + 1)) / Den + let ρtop : ℝ := (3 : ℝ) ^ ctop + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos d + have hDhigh_pos : 0 < Dhigh := by + dsimp [Dhigh] + exact mul_pos + (mul_pos + (mul_pos (by norm_num : (0 : ℝ) < 2) hK_pos) hCfluct) + (pow_pos hInf.thetaHat_pos 2) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDen.le + have hAold_nonneg : 0 ≤ Aold := by + dsimp [Aold] + exact div_nonneg + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _).le hDhigh_pos.le + let X : ℝ := η * ((q : ℝ) - (L + 1)) + let Y : ℝ := (2 : ℝ) * (b * (q : ℝ) - b * (L + 1)) + have hXY : X ≤ Y := by + dsimp [X, Y, η, b] + ring_nf + exact le_rfl + have hA_to_old : A ^ η ≤ Aold ^ (2 : ℝ) := by + have hgeneric := + rpow_three_div_den_rpow_le_of_exponent_le + (X := X) (Y := Y) (D := Dhigh) (Den := Den) + (η := η) (γ := (2 : ℝ)) + hη_pos (by norm_num : (0 : ℝ) < (2 : ℝ)) + hDhigh_pos hDen + (by simpa [Dhigh, η] using hDen_high) hXY + have hX_div : X / η = (q : ℝ) - (L + 1) := by + dsimp [X] + field_simp [hη_pos.ne'] + have hY_div : Y / (2 : ℝ) = b * (q : ℝ) - b * (L + 1) := by + dsimp [Y] + norm_num + have hA_eq : A = (3 : ℝ) ^ (X / η) / Den := by + dsimp [A] + rw [hX_div] + have hAold_eq : Aold = (3 : ℝ) ^ (Y / (2 : ℝ)) / Dhigh := by + dsimp [Aold] + rw [hY_div] + simpa [hA_eq, hAold_eq] using hgeneric + have hAold_one : 1 ≤ Aold := by + have hA_pow_one : 1 ≤ A ^ η := Real.one_le_rpow hA_one hη_pos.le + exact one_le_of_one_le_rpow hAold_nonneg + (by norm_num : (0 : ℝ) < (2 : ℝ)) (hA_pow_one.trans hA_to_old) + have htop_old : + P.real (highTopBadScaleEvent Hshift K a t αbad q) ≤ + (S.card : ℝ) * + (Real.exp (-(Aold ^ (2 : ℝ))) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ))) := by + have htop := + measureReal_shiftedHighTopBadScaleEvent_quenchedProbeEnvelope_le_weighted_kernel_of_badPair_bound + (d := d) (σ := (2 : ℝ)) (Cfluct := Cfluct) + (Centry := Centry) (a := a) + (by norm_num : (0 : ℝ) < (2 : ℝ)) + params hCfluct hCentry ha hraw + (t := t) (αbad := αbad) + hP hStruct hΓ2 rfl hΓ2_params (q := q) + simpa [K, N0, Hshift, S, b, L, ctop, η, w, Dhigh, Aold, ρtop, + hΓ2, GammaInfinityCoarseGrainedEllipticity.toGammaSigma] using! + htop ht hαt hαb hαharm hAold_one + have hw_pos : 0 < w := by + dsimp [w] + exact_mod_cast pow_pos (by norm_num : (0 : ℕ) < 3) d + have hb_pos : 0 < b := by + dsimp [b] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + positivity + have hc_pos : 0 < ctop := by + have hgap : 0 < t - αbad := sub_pos.mpr hαt + have hbα : 0 < b - αbad := sub_pos.mpr hαb + have hfactor : 0 < 1 + b / a := by positivity + have hthird : 0 < (t - αbad) * (1 + b / a) := + mul_pos hgap hfactor + have hfourth : 0 < b - αbad * (1 + b / a) := + sub_pos.mpr hαharm + dsimp [ctop] + exact lt_min hgap (lt_min hbα (lt_min hthird hfourth)) + have hρ_gt : 1 < ρtop := by + dsimp [ρtop] + calc + (1 : ℝ) = (3 : ℝ) ^ (0 : ℝ) := by simp + _ < (3 : ℝ) ^ ctop := + Real.rpow_lt_rpow_of_exponent_lt + (by norm_num : (1 : ℝ) < 3) hc_pos + have hkernel_nonneg : + 0 ≤ weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) := + (weightedLinearExpKernelConst_pos + (w := w) (R := ρtop ^ (2 : ℝ)) hw_pos + (Real.one_lt_rpow hρ_gt (by norm_num : (0 : ℝ) < (2 : ℝ)))).le + have hexp : + Real.exp (-(Aold ^ (2 : ℝ))) ≤ Real.exp (-(A ^ η)) := + Real.exp_le_exp.mpr (by linarith [hA_to_old]) + have hinner : + Real.exp (-(Aold ^ (2 : ℝ))) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) ≤ + Real.exp (-(A ^ η)) * + weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) := + mul_le_mul_of_nonneg_right hexp hkernel_nonneg + exact htop_old.trans + (mul_le_mul_of_nonneg_left hinner (by positivity)) + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHomogenizationQuenched.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHomogenizationQuenched.lean new file mode 100644 index 0000000000..ae33da99f4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformHomogenizationQuenched.lean @@ -0,0 +1,760 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformScaleCompressionFinal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.HomogenizationQuenched + +/-! # Uniform Homogenization Quenched -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Quenched homogenization at the uniform endpoint + +This file assembles the `Γ∞` endpoint bad-scale proof into the shifted +quenched estimate with stochastic integrability exponent `d`. +-/ + +noncomputable section + +/-- If the normalizing random scale is enlarged, the negative-power right hand +side in the quenched estimate becomes larger. -/ +theorem rpow_neg_div_mono_of_le + {A X Y α : ℝ} (hA : 0 < A) (hX : 0 < X) (hY : 0 < Y) + (hXY : X ≤ Y) (hα : 0 < α) : + (A / X) ^ (-α) ≤ (A / Y) ^ (-α) := by + have hbaseX : 0 < A / X := div_pos hA hX + have hbaseY : 0 < A / Y := div_pos hA hY + have hbaseYX : A / Y ≤ A / X := + div_le_div_of_nonneg_left hA.le hX hXY + exact + (Real.rpow_le_rpow_iff_of_neg hbaseX hbaseY + (neg_neg_of_pos hα)).2 hbaseYX + +/-- Algebraic form of a discounted deterministic bound. -/ +theorem discount_mul_rpow_eq_div_rpow_neg + {D t α : ℝ} {m n : ℕ} + (hD : 0 < D) (hα : 0 < α) : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * D ^ α = + ((3 : ℝ) ^ ((t / α) * ((m - n : ℕ) : ℝ)) / D) ^ (-α) := by + let s : ℝ := ((m - n : ℕ) : ℝ) + let R : ℝ := (t / α) * s + have h3_nonneg : (0 : ℝ) ≤ 3 := by norm_num + have h3_pos : (0 : ℝ) < 3 := by norm_num + have hnum_nonneg : 0 ≤ (3 : ℝ) ^ R := + (Real.rpow_pos_of_pos h3_pos R).le + have hRα : R * (-α) = -t * s := by + dsimp [R] + field_simp [hα.ne'] + calc + (3 : ℝ) ^ (-t * s) * D ^ α + = ((3 : ℝ) ^ R) ^ (-α) * D ^ α := by + rw [← Real.rpow_mul h3_nonneg, hRα] + _ = ((3 : ℝ) ^ R) ^ (-α) / D ^ (-α) := by + rw [Real.rpow_neg hD.le α] + field_simp [Real.rpow_pos_of_pos hD α |>.ne'] + _ = ((3 : ℝ) ^ R / D) ^ (-α) := by + rw [Real.div_rpow hnum_nonneg hD.le (-α)] + +/-- Deterministic control of the finite band below the entry scale. The +factor `3 ^ N0 * D` built into `X` pays for all bottoms `n < N0`. -/ +theorem small_bottom_deterministic_estimate + {J D X t α : ℝ} {m n N0 : ℕ} + (hD : 1 ≤ D) (hJ : J ≤ D ^ α) + (hXlower : (3 : ℝ) ^ N0 * D ≤ X) + (hXupper : X ≤ (3 : ℝ) ^ m) + (hnN0 : n < N0) (_hnm : n < m) + (hα : 0 < α) (hαt : α < t) : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * J ≤ + ((3 : ℝ) ^ m / X) ^ (-α) := by + have hD_pos : 0 < D := lt_of_lt_of_le zero_lt_one hD + have hX_pos : 0 < X := by + have hpow_pos : 0 < (3 : ℝ) ^ N0 := by positivity + have hlower_pos : 0 < (3 : ℝ) ^ N0 * D := mul_pos hpow_pos hD_pos + exact hlower_pos.trans_le hXlower + have hpowm_pos : 0 < (3 : ℝ) ^ m := by positivity + have hpowN0_le_powm : (3 : ℝ) ^ N0 ≤ (3 : ℝ) ^ m := by + calc + (3 : ℝ) ^ N0 ≤ (3 : ℝ) ^ N0 * D := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ N0 := by positivity + nlinarith + _ ≤ (3 : ℝ) ^ m := hXlower.trans hXupper + have hN0m_real : (N0 : ℝ) ≤ (m : ℝ) := by + have hpow_rpow : + (3 : ℝ) ^ ((N0 : ℕ) : ℝ) ≤ (3 : ℝ) ^ ((m : ℕ) : ℝ) := by + simpa [Real.rpow_natCast] using hpowN0_le_powm + exact (Real.rpow_le_rpow_left_iff (by norm_num : (1 : ℝ) < 3)).1 hpow_rpow + have hN0m : N0 ≤ m := by exact_mod_cast hN0m_real + have hmn_le : ((m - N0 : ℕ) : ℝ) ≤ ((m - n : ℕ) : ℝ) := by + exact_mod_cast Nat.sub_le_sub_left (le_of_lt hnN0) m + have hratio_one : 1 ≤ t / α := by + have hle : α / α ≤ t / α := + div_le_div_of_nonneg_right hαt.le hα.le + simpa [hα.ne'] using hle + have hexp_le : + ((m - N0 : ℕ) : ℝ) ≤ (t / α) * ((m - n : ℕ) : ℝ) := by + have hs_nonneg : 0 ≤ ((m - n : ℕ) : ℝ) := by positivity + calc + ((m - N0 : ℕ) : ℝ) ≤ ((m - n : ℕ) : ℝ) := hmn_le + _ = 1 * ((m - n : ℕ) : ℝ) := by ring + _ ≤ (t / α) * ((m - n : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hratio_one hs_nonneg + let Bsmall : ℝ := + (3 : ℝ) ^ ((t / α) * ((m - n : ℕ) : ℝ)) / D + have hbase_bound : + (3 : ℝ) ^ m / X ≤ Bsmall := by + have hden_pos : 0 < (3 : ℝ) ^ N0 * D := by positivity + have hdiv_lower : + (3 : ℝ) ^ m / X ≤ (3 : ℝ) ^ m / ((3 : ℝ) ^ N0 * D) := + div_le_div_of_nonneg_left hpowm_pos.le hden_pos hXlower + have hpow_split : (3 : ℝ) ^ m = (3 : ℝ) ^ N0 * (3 : ℝ) ^ (m - N0) := by + rw [← pow_add] + rw [Nat.add_sub_of_le hN0m] + have hdiv_eq : + (3 : ℝ) ^ m / ((3 : ℝ) ^ N0 * D) = + (3 : ℝ) ^ (m - N0) / D := by + rw [hpow_split] + field_simp [pow_ne_zero N0 (by norm_num : (3 : ℝ) ≠ 0)] + have hpow_exp : + (3 : ℝ) ^ (m - N0) ≤ + (3 : ℝ) ^ ((t / α) * ((m - n : ℕ) : ℝ)) := by + have hpow_rpow : + (3 : ℝ) ^ ((m - N0 : ℕ) : ℝ) ≤ + (3 : ℝ) ^ ((t / α) * ((m - n : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + simpa [Real.rpow_natCast] using hpow_rpow + calc + (3 : ℝ) ^ m / X + ≤ (3 : ℝ) ^ m / ((3 : ℝ) ^ N0 * D) := hdiv_lower + _ = (3 : ℝ) ^ (m - N0) / D := hdiv_eq + _ ≤ (3 : ℝ) ^ ((t / α) * ((m - n : ℕ) : ℝ)) / D := + div_le_div_of_nonneg_right hpow_exp hD_pos.le + have hBsmall_pos : 0 < Bsmall := by + dsimp [Bsmall] + exact div_pos (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _) hD_pos + have hdiscount_D : + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * D ^ α = + Bsmall ^ (-α) := by + simpa [Bsmall] using + discount_mul_rpow_eq_div_rpow_neg + (D := D) (t := t) (α := α) (m := m) (n := n) + hD_pos hα + calc + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * J + ≤ (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * D ^ α := + mul_le_mul_of_nonneg_left hJ (by positivity) + _ = Bsmall ^ (-α) := hdiscount_D + _ ≤ ((3 : ℝ) ^ m / X) ^ (-α) := by + exact + (Real.rpow_le_rpow_iff_of_neg hBsmall_pos + (div_pos hpowm_pos hX_pos) (neg_neg_of_pos hα)).2 hbase_bound + +theorem exists_shifted_quenchedLocalizedEstimate_uniformEndpoint_expLogSq + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry a : ℝ, 0 < Centry ∧ 0 < a ∧ + ∀ {t αbad : ℝ}, + let b : ℝ := (d : ℝ) / 2 + 0 < t → + 0 ≤ αbad → + αbad < t → + αbad < b → + αbad * (1 + b / a) < b → + αbad < a → + t ≤ b → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := ((d : ℕ) : ℝ) + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) := by + obtain ⟨Cfluct, Ccrude, Centry, a, + hCfluct, hCcrude, hCentry, ha, hmin⟩ := + exists_quantitative_shifted_quenchedLocalizedEstimate_uniformEndpoint + (d := d) params + refine ⟨Centry, a, hCentry, ha, ?_⟩ + intro t αbad + dsimp only + intro ht hα_nonneg hαt hαb hαharm hαa htb + classical + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let W : ℝ := max 1 w + let M : ℝ := max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom)) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + obtain ⟨R, _hR, hminR⟩ := + hmin (t := t) (αbad := αbad) + ht hα_nonneg hαt hαb hαharm hαa htb + obtain ⟨Cscale, hCscale_pos, hscale⟩ := + explicit_uniformEndpoint_minimalScale_prefactor_le_exp_logSq + (d := d) (Cfluct := Cfluct) (Ccrude := Ccrude) + (a := a) (t := t) (αbad := αbad) (R := R) + hCfluct hCcrude ha ht (by simpa [b] using htb) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let Hshift : ℕ → ℕ → RegCoeffField d → ℝ := + fun M N aω => + quenchedProbeEnvelope hP hStruct (N0 + M) (N0 + N) aω + let Dhigh : ℝ := 2 * K * Cfluct * hInf.thetaHat ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * hInf.thetaHat ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + let Bad : ℕ → Set (RegCoeffField d) := badScaleEvent Hshift t αbad + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + have hpack := + hminR hP hStruct hInf hparams + dsimp only at hpack + change + IsBigO P (gammaSigma η) X (3 * ((3 : ℝ) ^ Q) * B) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-αbad) at hpack + rcases hpack with ⟨hO, hXone, hpoint⟩ + have hscaleθ : + 3 * ((3 : ℝ) ^ Q) * B ≤ + Real.exp (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ)) := + hscale hInf.thetaHat hInf.thetaHat_pos + refine ⟨X, ?_, hXone, hpoint⟩ + exact IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hO hscaleθ + +theorem exists_shifted_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry α : ℝ, 0 < Centry ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {t : ℝ}, + max params.sUpper params.sLower < t → + t ≤ (d : ℝ) / 2 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := ((d : ℕ) : ℝ) + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct + (N0 + m) (N0 + n) e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, a, hCentry, ha, hbase⟩ := + exists_shifted_quenchedLocalizedEstimate_uniformEndpoint_expLogSq + (d := d) params + let b : ℝ := (d : ℝ) / 2 + let s0 : ℝ := max params.sUpper params.sLower + have hb : 0 < b := by + have hd_nat : 0 < d := + lt_of_lt_of_le (by norm_num : 0 < 2) params.two_le_dim + have hd : (0 : ℝ) < (d : ℝ) := by exact_mod_cast hd_nat + dsimp [b] + linarith + have hs0 : 0 < s0 := by + dsimp [s0] + exact max_sUpper_sLower_pos params + obtain ⟨α, hα_pos, hαs0, hαa, hαb, hαharm⟩ := + exists_alpha_for_highCompetition (a := a) (b := b) (t := s0) + ha hb hs0 + refine ⟨Centry, α, hCentry, hα_pos, by simpa [s0] using hαs0, ?_⟩ + intro t ht htb + have ht_pos : 0 < t := hs0.trans ht + have hαt : α < t := hαs0.trans ht + obtain ⟨Cscale, hCscale_pos, hlaw⟩ := + hbase (t := t) (αbad := α) + ht_pos hα_pos.le hαt hαb hαharm hαa (by simpa [b] using htb) + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + exact hlaw hP hStruct hInf hparams + +theorem exists_aboveEntry_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ Centry α : ℝ, 0 < Centry ∧ 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {t : ℝ}, + max params.sUpper params.sLower < t → + t ≤ (d : ℝ) / 2 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := ((d : ℕ) : ℝ) + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + N0 ≤ n → + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, α, hCentry, hα_pos, hαs0, hshifted⟩ := + exists_shifted_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + (d := d) params + obtain ⟨CentryEntry, hCentryEntry_pos, hentry⟩ := + exists_entryScale_pow_three_le_exp_logSq + (d := d) (σ := (1 : ℝ)) (Centry := Centry) + zero_lt_one hCentry params + refine ⟨Centry, α, hCentry, hα_pos, hαs0, ?_⟩ + intro t ht htb + obtain ⟨Cshift, hCshift_pos, hlaw⟩ := hshifted (t := t) ht htb + let Ctotal : ℝ := CentryEntry + Cshift + have hCtotal_pos : 0 < Ctotal := by + dsimp [Ctotal] + positivity + refine ⟨Ctotal, hCtotal_pos, ?_⟩ + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := ((d : ℕ) : ℝ) + obtain ⟨Xshift, hOshift, hXshift_one, hpoint_shift⟩ := + hlaw hP hStruct hInf hparams + let Xabs : RegCoeffField d → ℝ := fun aω => (3 : ℝ) ^ N0 * Xshift aω + have hentry_bound : + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryEntry * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ)) := by + simpa [N0, GammaInfinityCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity] + using! + hentry hP hStruct (hInf.toGammaSigma 1 zero_lt_one) + rfl hparams + have hOabs_raw : + IsBigO P (gammaSigma η) Xabs + ((3 : ℝ) ^ N0 * + Real.exp (Cshift * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) := by + simpa [Xabs, η] using + IndependentSums.IsBigO.const_mul + (μ := P) (Ψ := gammaSigma η) (X := Xshift) + (A := Real.exp (Cshift * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) + (c := (3 : ℝ) ^ N0) + (by positivity : 0 ≤ (3 : ℝ) ^ N0) hOshift + have hscale_abs : + (3 : ℝ) ^ N0 * + Real.exp (Cshift * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ)) ≤ + Real.exp (Ctotal * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ) + calc + (3 : ℝ) ^ N0 * Real.exp (Cshift * L2) + ≤ Real.exp (CentryEntry * L2) * Real.exp (Cshift * L2) := + mul_le_mul_of_nonneg_right hentry_bound (Real.exp_pos _).le + _ = Real.exp (Ctotal * L2) := by + rw [← Real.exp_add] + dsimp [Ctotal] + ring_nf + have hOabs : + IsBigO P (gammaSigma η) Xabs + (Real.exp + (Ctotal * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hOabs_raw hscale_abs + refine ⟨Xabs, hOabs, ?_, ?_⟩ + · intro aω + have hpow_one : 1 ≤ (3 : ℝ) ^ N0 := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + exact one_le_mul_of_one_le_of_one_le hpow_one (hXshift_one aω) + · intro e he + have hshift_e := hpoint_shift e he + filter_upwards [hshift_e] with aω hshift_a + intro m n hN0n hXabs_le hnm + let m' : ℕ := m - N0 + let n' : ℕ := n - N0 + have hN0m : N0 ≤ m := le_trans hN0n (le_of_lt hnm) + have hm_eq : N0 + m' = m := by + dsimp [m'] + exact Nat.add_sub_of_le hN0m + have hn_eq : N0 + n' = n := by + dsimp [n'] + exact Nat.add_sub_of_le hN0n + have hn'm' : n' < m' := by + dsimp [m', n'] + omega + have hpowm : + (3 : ℝ) ^ m = (3 : ℝ) ^ N0 * (3 : ℝ) ^ m' := by + rw [← pow_add] + rw [hm_eq] + have hXshift_le : Xshift aω ≤ (3 : ℝ) ^ m' := by + have htarget : + (3 : ℝ) ^ N0 * Xshift aω ≤ + (3 : ℝ) ^ N0 * (3 : ℝ) ^ m' := by + simpa [Xabs, hpowm] using hXabs_le + have hpow_pos : 0 < (3 : ℝ) ^ N0 := by positivity + nlinarith + have hdiff : (m' - n' : ℕ) = m - n := by + dsimp [m', n'] + omega + have hXshift_pos : 0 < Xshift aω := + lt_of_lt_of_le zero_lt_one (hXshift_one aω) + have hquot : + (3 : ℝ) ^ m' / Xshift aω = + (3 : ℝ) ^ m / Xabs aω := by + dsimp [Xabs] + rw [hpowm] + field_simp [hXshift_pos.ne', pow_ne_zero N0 (by norm_num : (3 : ℝ) ≠ 0)] + have hresult := + hshift_a (m := m') (n := n') hXshift_le hn'm' + simpa [N0, hm_eq, hn_eq, hdiff, hquot] using hresult + +/-- Note-facing quenched homogenization estimate at the uniform ellipticity +endpoint. + +The stochastic scale has `Γ_d` integrability. The constant `Cscale` is chosen +before the law; the law only contributes the endpoint datum `thetaHat`. -/ +theorem exists_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + {d : ℕ} [NeZero d] + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∃ α : ℝ, 0 < α ∧ + α < max params.sUpper params.sLower ∧ + ∀ {t : ℝ}, + max params.sUpper params.sLower < t → + t ≤ (d : ℝ) / 2 → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hInf : GammaInfinityCoarseGrainedEllipticity P hP hStruct), + hInf.params = params → + let η : ℝ := ((d : ℕ) : ℝ) + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hInf.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ (e : FullBlockVec d), dotProduct e e ≤ 1 → + ∀ᵐ aω ∂P, + ∀ {m n : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + n < m → + (3 : ℝ) ^ (-t * ((m - n : ℕ) : ℝ)) * + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + obtain ⟨Centry, α, hCentry, hα_pos, hαs0, habove⟩ := + exists_aboveEntry_quenchedLocalizedEstimate_uniformEndpoint_expLogSq_parameterAlpha + (d := d) params + obtain ⟨CentryEntry, hCentryEntry_pos, hentry⟩ := + exists_entryScale_pow_three_le_exp_logSq + (d := d) (σ := (1 : ℝ)) (Centry := Centry) + zero_lt_one hCentry params + classical + let Kdet : ℝ := + quenchedProbeEnvelopeConst d * + GammaInfinityCoarseGrainedEllipticity.unitJConst d params + let Aextra : ℝ := (max 1 Kdet) ^ α⁻¹ + let pextra : ℝ := 2 * α⁻¹ + let Cextra : ℝ := 4 * max 0 (Real.log Aextra) + 2 * pextra + have hKdet_pos : 0 < Kdet := by + dsimp [Kdet] + exact mul_pos (quenchedProbeEnvelopeConst_pos d) + (GammaInfinityCoarseGrainedEllipticity.unitJConst_pos + (d := d) params) + have hAextra_pos : 0 < Aextra := by + dsimp [Aextra] + exact Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 Kdet)) α⁻¹ + have hpextra_nonneg : 0 ≤ pextra := by + dsimp [pextra] + positivity + have hCextra_nonneg : 0 ≤ Cextra := by + dsimp [Cextra] + have hlog_nonneg : 0 ≤ max 0 (Real.log Aextra) := le_max_left 0 _ + nlinarith + refine ⟨α, hα_pos, hαs0, ?_⟩ + intro t ht htb + have hαt : α < t := hαs0.trans ht + obtain ⟨Cabove, hCabove_pos, habove_law⟩ := + habove (t := t) ht htb + let Cscale : ℝ := CentryEntry + Cextra + Cabove + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + nlinarith + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hInf hparams + let : IsProbabilityMeasure P := hP.isProbability + let N0 : ℕ := + annealedAlgebraicEntryScale P + hInf.toQuantitativeCoarseGrainedEllipticity Centry + let η : ℝ := ((d : ℕ) : ℝ) + obtain ⟨Xabove, hOabove, hXabove_one, hpoint_above⟩ := + habove_law hP hStruct hInf hparams + let θ : ℝ := hInf.thetaHat + let Jscale : ℝ := Kdet * θ ^ (2 : ℕ) + let Dsmall : ℝ := (max 1 Jscale) ^ α⁻¹ + let G : ℝ := (3 : ℝ) ^ N0 * Dsmall + let X : RegCoeffField d → ℝ := fun aω => G * Xabove aω + have hentry_bound : + (3 : ℝ) ^ N0 ≤ + Real.exp + (CentryEntry * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + simpa [N0, θ, + GammaInfinityCoarseGrainedEllipticity.toQuantitativeCoarseGrainedEllipticity] + using! + hentry hP hStruct (hInf.toGammaSigma 1 zero_lt_one) + rfl hparams + have hDsmall_one : 1 ≤ Dsmall := by + dsimp [Dsmall] + exact Real.one_le_rpow (le_max_left 1 Jscale) + (inv_nonneg.mpr hα_pos.le) + have hDsmall_pos : 0 < Dsmall := + lt_of_lt_of_le zero_lt_one hDsmall_one + have hDpow_eq : Dsmall ^ α = max 1 Jscale := by + dsimp [Dsmall] + exact Real.rpow_inv_rpow + (le_trans zero_le_one (le_max_left 1 Jscale)) hα_pos.ne' + have hJscale_le_D : Jscale ≤ Dsmall ^ α := by + calc + Jscale ≤ max 1 Jscale := le_max_right 1 Jscale + _ = Dsmall ^ α := hDpow_eq.symm + have hDsmall_poly : + Dsmall ≤ Aextra * (max 1 θ) ^ pextra := by + simpa [Dsmall, Jscale, Kdet, Aextra, pextra, θ] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := Kdet) (θ := θ) (r := α⁻¹) + hInf.thetaHat_pos.le (inv_nonneg.mpr hα_pos.le) + have hDsmall_exp : + Dsmall ≤ + Real.exp (Cextra * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + calc + Dsmall ≤ Aextra * (max 1 θ) ^ pextra := hDsmall_poly + _ ≤ Real.exp + (Cextra * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + simpa [Cextra, θ] using + const_mul_rpow_max_one_le_exp_logSq + (A := Aextra) (θ := θ) (p := pextra) + hAextra_pos hInf.thetaHat_pos.le hpextra_nonneg + have hG_nonneg : 0 ≤ G := by + dsimp [G] + positivity + have hG_one : 1 ≤ G := by + dsimp [G] + exact one_le_mul_of_one_le_of_one_le + (one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3)) hDsmall_one + have hG_bound : + G ≤ + Real.exp + ((CentryEntry + Cextra) * + (Real.log (2 + θ)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + calc + G = (3 : ℝ) ^ N0 * Dsmall := rfl + _ ≤ Real.exp (CentryEntry * L2) * + Real.exp (Cextra * L2) := + mul_le_mul hentry_bound hDsmall_exp + (by positivity) (by positivity) + _ = Real.exp ((CentryEntry + Cextra) * L2) := by + rw [← Real.exp_add] + ring_nf + have hOraw : + IsBigO P (gammaSigma η) X + (G * Real.exp (Cabove * (Real.log (2 + θ)) ^ (2 : ℕ))) := by + simpa [X, η, θ] using + IndependentSums.IsBigO.const_mul + (μ := P) (Ψ := gammaSigma η) (X := Xabove) + (A := Real.exp (Cabove * (Real.log (2 + θ)) ^ (2 : ℕ))) + (c := G) hG_nonneg hOabove + have hscale_final : + G * Real.exp (Cabove * (Real.log (2 + θ)) ^ (2 : ℕ)) ≤ + Real.exp + (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + calc + G * Real.exp (Cabove * L2) + ≤ Real.exp ((CentryEntry + Cextra) * L2) * + Real.exp (Cabove * L2) := + mul_le_mul_of_nonneg_right hG_bound (Real.exp_pos _).le + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add] + dsimp [Cscale] + ring_nf + have hOfinal : + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hOraw hscale_final + refine ⟨X, hOfinal, ?_, ?_⟩ + · intro aω + dsimp [X] + exact one_le_mul_of_one_le_of_one_le hG_one (hXabove_one aω) + · intro e he + have habove_e := hpoint_above e he + have hdet_e : + ∀ᵐ aω ∂P, ∀ m n : ℕ, n ≤ m → + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ Jscale := by + rw [MeasureTheory.ae_all_iff] + intro m + rw [MeasureTheory.ae_all_iff] + intro n + by_cases hnm_le : n ≤ m + · have hprobe := + localizedLimitNormalizedJMax_le_quenchedProbeEnvelope_ae + hP hStruct (hInf.toGammaSigma 1 zero_lt_one) + hnm_le e he + have hmax := + hInf.localizedNormalizedProbeJMax_le_thetaHat_sq_ae + (m := m) (n := n) hnm_le + filter_upwards [hprobe, hmax] with aω hprobe_a hmax_a _ + calc + localizedLimitNormalizedJMax hP hStruct m n e aω + ≤ quenchedProbeEnvelope hP hStruct m n aω := hprobe_a + _ ≤ Jscale := by + have hK_nonneg : 0 ≤ quenchedProbeEnvelopeConst d := + quenchedProbeEnvelopeConst_nonneg d + calc + quenchedProbeEnvelope hP hStruct m n aω + = quenchedProbeEnvelopeConst d * + localizedNormalizedProbeJMax hP hStruct m n aω := by + simp [quenchedProbeEnvelope] + _ ≤ quenchedProbeEnvelopeConst d * + (GammaInfinityCoarseGrainedEllipticity.unitJConst d params * + θ ^ (2 : ℕ)) := by + simpa [θ, hparams] using + mul_le_mul_of_nonneg_left hmax_a hK_nonneg + _ = Jscale := by + simp [Jscale, Kdet] + ring + · exact Filter.Eventually.of_forall fun _ hnm' => + False.elim (hnm_le hnm') + filter_upwards [habove_e, hdet_e] with aω habove_a hdet_a + intro m n hX_le hnm + by_cases hN0n : N0 ≤ n + · have hXabove_le_X : Xabove aω ≤ X aω := by + dsimp [X] + calc + Xabove aω = 1 * Xabove aω := by ring + _ ≤ G * Xabove aω := + mul_le_mul_of_nonneg_right hG_one (by + exact le_trans zero_le_one (hXabove_one aω)) + have hXabove_le_pow : Xabove aω ≤ (3 : ℝ) ^ m := + hXabove_le_X.trans hX_le + have hres := + habove_a (m := m) (n := n) hN0n hXabove_le_pow hnm + have hmono : + ((3 : ℝ) ^ m / Xabove aω) ^ (-α) ≤ + ((3 : ℝ) ^ m / X aω) ^ (-α) := by + exact rpow_neg_div_mono_of_le + (A := (3 : ℝ) ^ m) (X := Xabove aω) (Y := X aω) + (by positivity) + (lt_of_lt_of_le zero_lt_one (hXabove_one aω)) + (lt_of_lt_of_le zero_lt_one + (by simpa [X] using + one_le_mul_of_one_le_of_one_le hG_one (hXabove_one aω))) + hXabove_le_X hα_pos + exact hres.trans hmono + · have hnN0 : n < N0 := Nat.lt_of_not_ge hN0n + have hloc_le : + localizedLimitNormalizedJMax hP hStruct m n e aω ≤ Dsmall ^ α := + (hdet_a m n (le_of_lt hnm)).trans hJscale_le_D + have hXlower : (3 : ℝ) ^ N0 * Dsmall ≤ X aω := by + dsimp [X, G] + calc + (3 : ℝ) ^ N0 * Dsmall + = ((3 : ℝ) ^ N0 * Dsmall) * 1 := by ring + _ ≤ ((3 : ℝ) ^ N0 * Dsmall) * Xabove aω := + mul_le_mul_of_nonneg_left (hXabove_one aω) + (by positivity) + exact + small_bottom_deterministic_estimate + (J := localizedLimitNormalizedJMax hP hStruct m n e aω) + (D := Dsmall) (X := X aω) (t := t) (α := α) + (m := m) (n := n) (N0 := N0) + hDsmall_one hloc_le hXlower hX_le hnN0 hnm hα_pos hαt + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformScaleCompressionFinal.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformScaleCompressionFinal.lean new file mode 100644 index 0000000000..00237e4cba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UniformScaleCompressionFinal.lean @@ -0,0 +1,466 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformBadScaleMinimalQuantitative +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression + +/-! # Uniform Scale Compression Final -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +/-! +# Scale compression at the uniform endpoint + +This file compresses the explicit `Γ∞` endpoint minimal-scale normalization to +the manuscript `exp(C log^2(2 + thetaHat))` envelope. +-/ + +noncomputable section + +theorem uniformEndpointHighDenominator_mul_sq_le_const_mul_rpow + {A B θ t η : ℝ} + (hA : 0 ≤ A) (hθ : 0 ≤ θ) + (ht : 0 < t) (htη : t ≤ η / 2) : + let κ : ℝ := (η - 2 * t) / t + let C : ℝ := max 1 (((max 1 A) ^ (2 : ℝ)) * ((max 1 B) ^ κ)) + let p : ℝ := 4 + 2 * κ + uniformEndpointHighDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) t η ≤ + C * (max 1 θ) ^ p := by + intro κ C p + have hκ_nonneg : 0 ≤ κ := by + dsimp [κ] + have hnum : 0 ≤ η - 2 * t := by linarith + positivity + have hp_nonneg : 0 ≤ p := by + dsimp [p] + nlinarith + have hx_pos : 0 < max 1 θ := + lt_of_lt_of_le zero_lt_one (le_max_left 1 θ) + have hxpow_one : 1 ≤ (max 1 θ) ^ p := + Real.one_le_rpow (le_max_left 1 θ) hp_nonneg + have hDhi_nonneg : 0 ≤ A * θ ^ (2 : ℕ) := by positivity + have hDhi_sq_le_max : + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) ≤ + (max 1 (A * θ ^ (2 : ℕ))) ^ (2 : ℝ) := + Real.rpow_le_rpow hDhi_nonneg (le_max_right 1 _) (by norm_num) + have hDhi_poly : + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) ≤ + (max 1 A) ^ (2 : ℝ) * (max 1 θ) ^ (4 : ℝ) := by + have h := + rpow_max_one_mul_sq_le_const_mul_rpow + (A := A) (θ := θ) (r := (2 : ℝ)) hθ (by norm_num) + calc + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) + ≤ (max 1 (A * θ ^ (2 : ℕ))) ^ (2 : ℝ) := hDhi_sq_le_max + _ ≤ (max 1 A) ^ (2 : ℝ) * (max 1 θ) ^ (2 * (2 : ℝ)) := h + _ = (max 1 A) ^ (2 : ℝ) * (max 1 θ) ^ (4 : ℝ) := by ring_nf + have hDcr_poly : + (max 1 (B * θ ^ (2 : ℕ))) ^ κ ≤ + (max 1 B) ^ κ * (max 1 θ) ^ (2 * κ) := + rpow_max_one_mul_sq_le_const_mul_rpow + (A := B) (θ := θ) (r := κ) hθ hκ_nonneg + have hDhi_poly_nonneg : + 0 ≤ (max 1 A) ^ (2 : ℝ) * (max 1 θ) ^ (4 : ℝ) := by + positivity + have hDcr_nonneg : + 0 ≤ (max 1 (B * θ ^ (2 : ℕ))) ^ κ := by + exact (Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 _)) κ).le + have hconst_nonneg : + 0 ≤ (max 1 A) ^ (2 : ℝ) * (max 1 B) ^ κ := by + positivity + have hprod_poly : + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) * + (max 1 (B * θ ^ (2 : ℕ))) ^ κ ≤ + ((max 1 A) ^ (2 : ℝ) * (max 1 B) ^ κ) * + (max 1 θ) ^ p := by + calc + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) * + (max 1 (B * θ ^ (2 : ℕ))) ^ κ + ≤ ((max 1 A) ^ (2 : ℝ) * (max 1 θ) ^ (4 : ℝ)) * + ((max 1 B) ^ κ * (max 1 θ) ^ (2 * κ)) := + mul_le_mul hDhi_poly hDcr_poly hDcr_nonneg hDhi_poly_nonneg + _ = ((max 1 A) ^ (2 : ℝ) * (max 1 B) ^ κ) * + ((max 1 θ) ^ (4 : ℝ) * (max 1 θ) ^ (2 * κ)) := by ring + _ = ((max 1 A) ^ (2 : ℝ) * (max 1 B) ^ κ) * + (max 1 θ) ^ p := by + dsimp [p] + rw [← Real.rpow_add hx_pos] + have hC_one : 1 ≤ C := by + dsimp [C] + exact le_max_left 1 _ + have hconst_le_C : + (max 1 A) ^ (2 : ℝ) * (max 1 B) ^ κ ≤ C := by + dsimp [C] + exact le_max_right 1 _ + have hprod_le : + (A * θ ^ (2 : ℕ)) ^ (2 : ℝ) * + (max 1 (B * θ ^ (2 : ℕ))) ^ κ ≤ + C * (max 1 θ) ^ p := + hprod_poly.trans + (mul_le_mul_of_nonneg_right hconst_le_C + (Real.rpow_pos_of_pos hx_pos p).le) + have hone_le : 1 ≤ C * (max 1 θ) ^ p := by + nlinarith [hC_one, hxpow_one] + simpa [uniformEndpointHighDenominator, κ, C, p] using + max_le hone_le hprod_le + +theorem uniformEndpointBlead_le_const_mul_rpow + {A B θ t η U : ℝ} + (hA : 0 ≤ A) (hθ : 0 ≤ θ) + (ht : 0 < t) (htη : t ≤ η / 2) (hU : 0 ≤ U) : + let κ : ℝ := (η - 2 * t) / t + let Cden : ℝ := + max 1 (((max 1 A) ^ (2 : ℝ)) * ((max 1 B) ^ κ)) + let p : ℝ := 4 + 2 * κ + let C : ℝ := Cden * U + uniformEndpointHighDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) t η * + U ≤ + C * (max 1 θ) ^ p := by + intro κ Cden p C + have hden := + uniformEndpointHighDenominator_mul_sq_le_const_mul_rpow + (A := A) (B := B) (θ := θ) (t := t) (η := η) + hA hθ ht htη + calc + uniformEndpointHighDenominator (A * θ ^ (2 : ℕ)) (B * θ ^ (2 : ℕ)) t η * U + ≤ (Cden * (max 1 θ) ^ p) * U := + mul_le_mul_of_nonneg_right (by simpa [κ, Cden, p] using hden) hU + _ = C * (max 1 θ) ^ p := by + dsimp [C] + ring + +theorem max_zero_log_le_log_max_one_of_nonneg {x : ℝ} (hx : 0 ≤ x) : + max 0 (Real.log x) ≤ Real.log (max 1 x) := by + by_cases hxzero : x = 0 + · simp [hxzero] + have hx_pos : 0 < x := lt_of_le_of_ne hx (fun h => hxzero h.symm) + by_cases h1x : 1 ≤ x + · have hlog_nonneg : 0 ≤ Real.log x := Real.log_nonneg h1x + rw [max_eq_right hlog_nonneg, max_eq_right h1x] + · have hx1 : x ≤ 1 := le_of_not_ge h1x + have hlog_nonpos : Real.log x ≤ 0 := by + simpa using Real.log_le_log hx_pos hx1 + rw [max_eq_left hlog_nonpos, max_eq_left hx1] + simp + +theorem max_zero_div_nonneg_le {x c : ℝ} (hc : 0 < c) : + max 0 (x / c) ≤ max 0 x / c := by + by_cases hx : 0 ≤ x + · have hxdiv : 0 ≤ x / c := by positivity + rw [max_eq_right hxdiv, max_eq_right hx] + · have hxle : x ≤ 0 := le_of_not_ge hx + have hxdivle : x / c ≤ 0 := by + exact div_nonpos_of_nonpos_of_nonneg hxle hc.le + rw [max_eq_left hxdivle, max_eq_left hxle] + simp + +theorem pow_three_uniformEndpoint_crudeCutoff_le_const_mul_rpow + {A θ t L : ℝ} + (hA : 0 < A) (hθ : 0 ≤ θ) (ht : 0 < t) (hL : 0 ≤ L) : + let D : ℝ := A * θ ^ (2 : ℕ) + let Qcrude : ℕ := + Nat.ceil + ((Real.log D + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let C : ℝ := 3 * (3 : ℝ) ^ (L + 1) * (max 1 A) ^ t⁻¹ + (3 : ℝ) ^ Qcrude ≤ C * (max 1 θ) ^ (2 * t⁻¹) := by + intro D Qcrude C + let y : ℝ := + (Real.log D + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ)) + have hlog3_pos : 0 < Real.log (3 : ℝ) := + Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hden_pos : 0 < t * Real.log (3 : ℝ) := mul_pos ht hlog3_pos + have hL1_nonneg : 0 ≤ L + 1 := by linarith + have hD_nonneg : 0 ≤ D := by dsimp [D]; positivity + have hy_eq : y = L + 1 + Real.log D / (t * Real.log (3 : ℝ)) := by + dsimp [y] + field_simp [hden_pos.ne'] + ring + have hmax_y : + max 0 y ≤ L + 1 + max 0 (Real.log D) / (t * Real.log (3 : ℝ)) := by + refine (max_le ?_ ?_) + · exact add_nonneg hL1_nonneg (div_nonneg (le_max_left 0 _) hden_pos.le) + · rw [hy_eq] + calc + L + 1 + Real.log D / (t * Real.log (3 : ℝ)) + ≤ L + 1 + max 0 (Real.log D / (t * Real.log (3 : ℝ))) := + by + have h := le_max_right 0 + (Real.log D / (t * Real.log (3 : ℝ))) + linarith + _ ≤ L + 1 + max 0 (Real.log D) / (t * Real.log (3 : ℝ)) := + by + have h := + max_zero_div_nonneg_le (x := Real.log D) + (c := t * Real.log (3 : ℝ)) hden_pos + linarith + have hceil_mono : Qcrude ≤ Nat.ceil (max 0 y) := by + dsimp [Qcrude, y] + exact Nat.ceil_mono (le_max_right 0 y) + have hpow_ceil : + (3 : ℝ) ^ Qcrude ≤ + 3 * Real.exp (Real.log (3 : ℝ) * max 0 y) := by + calc + (3 : ℝ) ^ Qcrude + ≤ (3 : ℝ) ^ Nat.ceil (max 0 y) := + pow_three_nat_mono hceil_mono + _ ≤ 3 * Real.exp (Real.log (3 : ℝ) * max 0 y) := + pow_three_natCeil_le_three_mul_exp (le_max_left 0 y) + have hexp_y : + Real.exp (Real.log (3 : ℝ) * max 0 y) ≤ + (3 : ℝ) ^ (L + 1) * (max 1 D) ^ t⁻¹ := by + have hlogD_bound : + max 0 (Real.log D) / t ≤ Real.log (max 1 D) / t := + div_le_div_of_nonneg_right + (max_zero_log_le_log_max_one_of_nonneg hD_nonneg) ht.le + calc + Real.exp (Real.log (3 : ℝ) * max 0 y) + ≤ Real.exp + (Real.log (3 : ℝ) * + (L + 1 + max 0 (Real.log D) / + (t * Real.log (3 : ℝ)))) := + Real.exp_le_exp.mpr + (mul_le_mul_of_nonneg_left hmax_y hlog3_pos.le) + _ = (3 : ℝ) ^ (L + 1) * + Real.exp (max 0 (Real.log D) / t) := by + have harg : + Real.log (3 : ℝ) * + (L + 1 + max 0 (Real.log D) / + (t * Real.log (3 : ℝ))) = + Real.log (3 : ℝ) * (L + 1) + + max 0 (Real.log D) / t := by + field_simp [ht.ne', hlog3_pos.ne'] + rw [harg, Real.exp_add] + have h3 : + Real.exp (Real.log (3 : ℝ) * (L + 1)) = + (3 : ℝ) ^ (L + 1) := by + rw [Real.rpow_def_of_pos (by norm_num : (0 : ℝ) < 3)] + rw [h3] + _ ≤ (3 : ℝ) ^ (L + 1) * (max 1 D) ^ t⁻¹ := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + calc + Real.exp (max 0 (Real.log D) / t) + ≤ Real.exp (Real.log (max 1 D) / t) := + Real.exp_le_exp.mpr hlogD_bound + _ = (max 1 D) ^ t⁻¹ := by + have hmax_pos : 0 < max 1 D := + lt_of_lt_of_le zero_lt_one (le_max_left 1 D) + rw [Real.rpow_def_of_pos hmax_pos] + ring_nf + have hD_poly : + (max 1 D) ^ t⁻¹ ≤ + (max 1 A) ^ t⁻¹ * (max 1 θ) ^ (2 * t⁻¹) := by + simpa [D] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := A) (θ := θ) (r := t⁻¹) hθ (inv_nonneg.mpr ht.le) + calc + (3 : ℝ) ^ Qcrude + ≤ 3 * Real.exp (Real.log (3 : ℝ) * max 0 y) := hpow_ceil + _ ≤ 3 * ((3 : ℝ) ^ (L + 1) * (max 1 D) ^ t⁻¹) := + mul_le_mul_of_nonneg_left hexp_y (by norm_num) + _ ≤ 3 * ((3 : ℝ) ^ (L + 1) * + ((max 1 A) ^ t⁻¹ * (max 1 θ) ^ (2 * t⁻¹))) := by + gcongr + _ = C * (max 1 θ) ^ (2 * t⁻¹) := by + dsimp [C] + ring + +theorem explicit_uniformEndpoint_minimalScale_prefactor_le_exp_logSq + {d : ℕ} [NeZero d] {Cfluct Ccrude a t αbad : ℝ} {R : ℕ} + (hCfluct : 0 < Cfluct) (hCcrude : 0 < Ccrude) + (ha : 0 < a) (ht : 0 < t) (htb : t ≤ (d : ℝ) / 2) : + let K : ℝ := quenchedProbeEnvelopeConst d + let S : Finset (NormalizedProbeIndex d) := Finset.univ + let b : ℝ := (d : ℝ) / 2 + let L : ℝ := (a * Real.log 3)⁻¹ * Real.log (max (2 * K) 1) + let ctop : ℝ := + min (t - αbad) + (min (b - αbad) + (min ((t - αbad) * (1 + b / a)) + (b - αbad * (1 + b / a)))) + let η : ℝ := ((d : ℕ) : ℝ) + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let ρtop : ℝ := (3 : ℝ) ^ ctop + let ρbottom : ℝ := (3 : ℝ) ^ (2 * (t - αbad) / η) + let Cbottom : ℝ := Real.exp 1 * max 1 (S.card : ℝ) + let Ctop : ℝ := + (S.card : ℝ) * weightedLinearExpKernelConst w (ρtop ^ (2 : ℝ)) + let Kbottom : ℝ := weightedGeometricExpKernelConst w (ρbottom ^ η) + let M : ℝ := max 1 (max 0 Ctop + max 0 (Cbottom * Kbottom)) + let Qcut : ℕ := Nat.ceil ((L + 1) / (1 - αbad / a) + 1) + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ θ : ℝ, 0 < θ → + let Dhigh : ℝ := 2 * K * Cfluct * θ ^ (2 : ℕ) + let Dcrude : ℝ := K * Ccrude * θ ^ (2 : ℕ) + let Den : ℝ := uniformEndpointHighDenominator Dhigh Dcrude t η + let Blead : ℝ := Den * (3 : ℝ) ^ (L + 1) + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let ρgap : ℝ := (3 : ℝ) ^ η + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Qcrude : ℕ := + Nat.ceil + ((Real.log Dcrude + (t * (L + 1)) * Real.log (3 : ℝ)) / + (t * Real.log (3 : ℝ))) + let Q : ℕ := max Qpref (max Qlead (max Qcrude Qcut)) + 3 * ((3 : ℝ) ^ Q) * B ≤ + Real.exp (Cscale * (Real.log (2 + θ)) ^ (2 : ℕ)) := by + classical + intro K S b L ctop η w ρtop ρbottom Cbottom Ctop Kbottom M Qcut + have hK_pos : 0 < K := by + simpa [K] using quenchedProbeEnvelopeConst_pos (d := d) + have hη_pos : 0 < η := by + dsimp [η] + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + have hlog_nonneg : 0 ≤ Real.log (max (2 * K) 1) := + Real.log_nonneg (le_max_right (2 * K) 1) + positivity + let Ahi : ℝ := 2 * K * Cfluct + let Acr : ℝ := K * Ccrude + let U : ℝ := (3 : ℝ) ^ (L + 1) + let κ : ℝ := (η - 2 * t) / t + let Cden : ℝ := + max 1 (((max 1 Ahi) ^ (2 : ℝ)) * ((max 1 Acr) ^ κ)) + let pDen : ℝ := 4 + 2 * κ + let Ablead : ℝ := Cden * U + have hAhi_pos : 0 < Ahi := by dsimp [Ahi]; positivity + have hAcr_pos : 0 < Acr := by dsimp [Acr]; positivity + have hU_pos : 0 < U := by dsimp [U]; positivity + have hU_one : 1 ≤ U := by + dsimp [U] + exact Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hκ_nonneg : 0 ≤ κ := by + dsimp [κ, η] + have hnum : 0 ≤ ((d : ℕ) : ℝ) - 2 * t := by linarith + positivity + have hpDen_nonneg : 0 ≤ pDen := by + dsimp [pDen] + nlinarith + have hCden_pos : 0 < Cden := by + dsimp [Cden] + exact lt_of_lt_of_le zero_lt_one (le_max_left 1 _) + have hAlead_pos : 0 < Ablead := by + dsimp [Ablead] + exact mul_pos hCden_pos hU_pos + obtain ⟨Cbase, hCbase_pos, hbase⟩ := + explicit_threshold_prefactor_le_exp_logSq_of_Blead_le_poly + (η := η) (A := Ablead) (p := pDen) (M := M) + (R := R) (Qcut := Qcut) hη_pos hAlead_pos hpDen_nonneg + let CcrudePoly : ℝ := 3 * U * (max 1 Acr) ^ t⁻¹ + let pcrude : ℝ := 2 * t⁻¹ + let CcrudeScale : ℝ := + 1 + (4 * max 0 (Real.log CcrudePoly) + 2 * pcrude) + let Cscale : ℝ := Cbase + CcrudeScale + have hCcrudePoly_pos : 0 < CcrudePoly := by + dsimp [CcrudePoly, U] + positivity + have hpcrude_nonneg : 0 ≤ pcrude := by + dsimp [pcrude] + positivity + have hCcrudeScale_pos : 0 < CcrudeScale := by + dsimp [CcrudeScale] + have hmax_nonneg : 0 ≤ max 0 (Real.log CcrudePoly) := le_max_left 0 _ + nlinarith + have hCscale_pos : 0 < Cscale := by + dsimp [Cscale] + positivity + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro θ hθ_pos Dhigh Dcrude Den Blead Btail B cgap ρgap Qpref Qlead Qcrude Q + let Qbase : ℕ := max Qpref (max Qlead Qcut) + let L2 : ℝ := (Real.log (2 + θ)) ^ (2 : ℕ) + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hDen_one : 1 ≤ Den := by + simpa [Den] using + one_le_uniformEndpointHighDenominator + (Dhigh := Dhigh) (Dcrude := Dcrude) (t := t) (d := η) + have hBlead_one : 1 ≤ Blead := by + dsimp [Blead] + nlinarith + have hBlead_poly : + Blead ≤ Ablead * (max 1 θ) ^ pDen := by + simpa [Dhigh, Dcrude, Den, Blead, Ahi, Acr, U, κ, Cden, pDen, Ablead] using + uniformEndpointBlead_le_const_mul_rpow + (A := Ahi) (B := Acr) (θ := θ) (t := t) (η := η) (U := U) + hAhi_pos.le hθ_nonneg ht (by simpa [η, b] using htb) hU_pos.le + have hbaseθ : + 3 * ((3 : ℝ) ^ Qbase) * B ≤ Real.exp (Cbase * L2) := by + simpa [Btail, B, cgap, ρgap, Qpref, Qlead, Qbase, L2] using + hbase θ hθ_nonneg Blead hBlead_one hBlead_poly + have hqcrude_poly : + (3 : ℝ) ^ Qcrude ≤ CcrudePoly * (max 1 θ) ^ pcrude := by + simpa [Dcrude, Qcrude, CcrudePoly, pcrude, Acr, U] using + pow_three_uniformEndpoint_crudeCutoff_le_const_mul_rpow + (A := Acr) (θ := θ) (t := t) (L := L) + hAcr_pos hθ_nonneg ht hL_nonneg + have hqcrude_exp : + (3 : ℝ) ^ Qcrude ≤ Real.exp (CcrudeScale * L2) := by + have hraw := + const_mul_rpow_max_one_le_exp_logSq + (A := CcrudePoly) (θ := θ) (p := pcrude) + hCcrudePoly_pos hθ_nonneg hpcrude_nonneg + have hraw' : + CcrudePoly * (max 1 θ) ^ pcrude ≤ + Real.exp ((4 * max 0 (Real.log CcrudePoly) + 2 * pcrude) * L2) := by + simpa [L2] using hraw + have hscale : + Real.exp ((4 * max 0 (Real.log CcrudePoly) + 2 * pcrude) * L2) ≤ + Real.exp (CcrudeScale * L2) := by + refine Real.exp_le_exp.mpr ?_ + have hL2_nonneg : 0 ≤ L2 := by dsimp [L2]; positivity + have hcoef : + 4 * max 0 (Real.log CcrudePoly) + 2 * pcrude ≤ CcrudeScale := by + dsimp [CcrudeScale] + linarith + exact mul_le_mul_of_nonneg_right hcoef hL2_nonneg + exact hqcrude_poly.trans (hraw'.trans hscale) + have hQ_le : Q ≤ Qbase + Qcrude := by + dsimp [Q, Qbase] + omega + have hpowQ : + (3 : ℝ) ^ Q ≤ (3 : ℝ) ^ (Qbase + Qcrude) := + pow_three_nat_mono hQ_le + have hcombine : + 3 * ((3 : ℝ) ^ Q) * B ≤ + (3 * ((3 : ℝ) ^ Qbase) * B) * (3 : ℝ) ^ Qcrude := by + calc + 3 * ((3 : ℝ) ^ Q) * B + ≤ 3 * ((3 : ℝ) ^ (Qbase + Qcrude)) * B := by + gcongr + _ = (3 * ((3 : ℝ) ^ Qbase) * B) * (3 : ℝ) ^ Qcrude := by + rw [pow_add] + ring + calc + 3 * ((3 : ℝ) ^ Q) * B + ≤ (3 * ((3 : ℝ) ^ Qbase) * B) * (3 : ℝ) ^ Qcrude := hcombine + _ ≤ Real.exp (Cbase * L2) * Real.exp (CcrudeScale * L2) := by + exact mul_le_mul hbaseθ hqcrude_exp (by positivity) (by positivity) + _ = Real.exp (Cscale * L2) := by + rw [← Real.exp_add] + dsimp [Cscale] + ring_nf + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitEllipticityMinimalExpLogSq.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitEllipticityMinimalExpLogSq.lean new file mode 100644 index 0000000000..62b3121fae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitEllipticityMinimalExpLogSq.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LocalizedUnitEllipticityMinimal +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.AbsoluteScaleCompression + +/-! # Unit Ellipticity Minimal Exp Log Sq -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped ENNReal + +/-! +# Compressed unit-ellipticity minimal scale + +This file gives the localized unit-ellipticity stopping scale the same +manuscript-scale stochastic envelope as the quenched `J` stopping scale: +`exp(C log^2(2 + thetaHat))`. +-/ + +noncomputable section + +/-- The localized unit-ellipticity minimal scale with the note-facing +`exp(C log^2(2 + thetaHat))` stochastic size. -/ +theorem exists_unitEllipticityMinimalScale_interpolated_expLogSq + {d : ℕ} [NeZero d] {σ : ℝ} (hσ_pos : 0 < σ) + (params : QuantitativeCoarseGrainedEllipticityParams d) : + ∀ {t α : ℝ}, + let η : ℝ := finiteQuenchedTailExponent d σ t + 0 < t → + 0 ≤ α → + α < t → + ∃ Cscale : ℝ, 0 < Cscale ∧ + ∀ {P : Ch04.RestrictionCoeffLaw d} + (hP : Ch04.RestrictionLawCarrier P) + (hStruct : Ch04.RestrictionStructuralLaw P) + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct), + hΓ.sigma = σ → hΓ.params = params → + ∃ X : RegCoeffField d → ℝ, + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) ∧ + (∀ aω, 1 ≤ X aω) ∧ + ∀ᵐ aω ∂P, + ∀ {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + localizedLimitWeightedUnitEllipticitySup + hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α))) ^ (2 : ℕ) := by + intro t α η ht hα_nonneg hαt + classical + let w : ℝ := ((3 ^ d : ℕ) : ℝ) + let W : ℝ := max 1 w + let ρunit : ℝ := (3 : ℝ) ^ (2 * t - α) + let Kunit : ℝ := weightedGeometricExpKernelConst w (ρunit ^ σ) + let M : ℝ := max 1 (max 0 Kunit) + let ρgap : ℝ := (3 : ℝ) ^ η + let C₀ : ℝ := 2 + Real.log W + let G : ℝ := + Ch04.gammaMomentConst σ * (params.xi : ℝ) ^ σ⁻¹ + let A : ℝ := (max 1 G) ^ (σ / η) + let p : ℝ := 2 * (σ / η) + have hη_pos : 0 < η := by + simpa [η] using finiteQuenchedTailExponent_pos + (d := d) (σ := σ) (t := t) hσ_pos ht + obtain ⟨R, _hR, htail_abs⟩ := + exists_quantitative_threshold_unitEllipticityBadTail_le_interpolated_tail + (d := d) (σ := σ) hσ_pos + (t := t) (α := α) ht hα_nonneg hαt + have hA_pos : 0 < A := by + dsimp [A] + exact Real.rpow_pos_of_pos + (lt_of_lt_of_le zero_lt_one (le_max_left 1 G)) _ + have hp_nonneg : 0 ≤ p := by + dsimp [p] + positivity + obtain ⟨Cscale, hCscale_pos, hcompress⟩ := + explicit_threshold_prefactor_le_exp_logSq_of_Blead_le_poly + (η := η) (A := A) (p := p) (M := M) (R := R) (Qcut := 0) + hη_pos hA_pos hp_nonneg + refine ⟨Cscale, hCscale_pos, ?_⟩ + intro P hP hStruct hΓ hσ_eq hparams + let : IsProbabilityMeasure P := hP.isProbability + let scale : ℝ := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + let Blead : ℝ := smallBottomTailDenominator scale η σ + let Btail : ℝ := 2 * Blead + let B : ℝ := max 1 Btail + let cgap : ℝ := Blead ^ (-η) - Btail ^ (-η) + let Qpref : ℕ := + max (Nat.ceil (max 0 (Real.log M))) + (max R (Nat.ceil ((2 * max 0 (-(Real.log cgap))) / + Real.log ρgap))) + let Qlead : ℕ := Nat.ceil (Real.log Blead / Real.log 3) + let Q : ℕ := max Qpref Qlead + let Bad : ℕ → Set (RegCoeffField d) := + unitEllipticityBadScaleEvent hP hStruct hΓ.params t α + let X : RegCoeffField d → ℝ := quenchedMinimalScale Q Bad + let C : ℝ := 3 * ((3 : ℝ) ^ Q) * B + have hθ_one : 1 ≤ thetaAtScale hP hStruct (0 : ℤ) := by + simpa using + Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hΓ.toQuantitativeCoarseGrainedEllipticity 0 + have hscale_pos : 0 < scale := by + dsimp [scale] + exact mul_pos (lt_of_lt_of_le zero_lt_one hθ_one) hΓ.thetaHat_pos + have hBlead_pos : 0 < Blead := by + simpa [Blead] using + smallBottomTailDenominator_pos + (scale := scale) (η := η) (σ := σ) + have hBtail_pos : 0 < Btail := by + dsimp [Btail] + positivity + have hB : 1 ≤ B := by + dsimp [B] + exact le_max_left 1 Btail + have hB_pos : 0 < B := lt_of_lt_of_le zero_lt_one hB + have hC_pos : 0 < C := by + dsimp [C] + positivity + have htail : + ∀ N : ℕ, Q ≤ N → + P.real (badTailEvent Bad N) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + intro N hQN + have hN_abs : + P.real + (badTailEvent + (unitEllipticityBadScaleEvent hP hStruct hΓ.params t α) + N) ≤ + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) := by + simpa [η, w, W, ρunit, Kunit, M, ρgap, C₀, + scale, Blead, Btail, cgap, Qpref, Qlead, Q] using + htail_abs hP hStruct hΓ hσ_eq N hQN + have hcompare : + Real.exp (-(((3 : ℝ) ^ (N : ℝ) / Btail) ^ η)) ≤ + Real.exp + (-(((Real.rpow (3 : ℝ) ((N - Q : ℕ) : ℝ)) / B) ^ η)) := by + simpa [B] using + exp_neg_rpow_three_nat_div_le_exp_neg_shifted_max_one + (Q := Q) (N := N) (B := Btail) (η := η) + hBtail_pos hη_pos + exact hN_abs.trans hcompare + have hsmall : + ∀ ε : ℝ, 0 < ε → + ∃ N : ℕ, Q ≤ N ∧ P.real (badTailEvent Bad N) ≤ ε := by + intro ε hε + obtain ⟨j, hj⟩ := + exists_exp_neg_rpow_three_div_le + (B := B) (η := η) (ε := ε) hB_pos hη_pos hε + refine ⟨Q + j, Nat.le_add_right Q j, ?_⟩ + have htail_j := htail (Q + j) (Nat.le_add_right Q j) + exact htail_j.trans (by simpa [Nat.add_sub_cancel_left] using hj) + have hgoodAE : ∀ᵐ aω ∂P, hasGoodTailFrom Q Bad aω := by + exact ae_hasGoodTailFrom + (μ := P) (N0 := Q) (Bad := Bad) hsmall + have hO_raw : + IsBigO P (gammaSigma η) X C := by + simpa [X, C] using + isBigO_quenchedMinimalScale_of_badTailEvent_bound + (μ := P) (N0 := Q) (Bad := Bad) (B := B) (η := η) + hη_pos hB htail + have hG_pos : 0 < G := by + dsimp [G] + exact mul_pos + (IndependentSums.gammaMomentConst_pos hσ_pos) + (Real.rpow_pos_of_pos (by exact_mod_cast params.xi_pos) _) + have htheta0_le : + thetaAtScale hP hStruct (0 : ℤ) ≤ G * hΓ.thetaHat := by + have h := hΓ.thetaAtScale_zero_le_gammaMomentScale + simpa [G, hσ_eq, hparams] using h + have hscale_le : + scale ≤ G * hΓ.thetaHat ^ (2 : ℕ) := by + dsimp [scale] + calc + thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat + ≤ (G * hΓ.thetaHat) * hΓ.thetaHat := + mul_le_mul_of_nonneg_right htheta0_le hΓ.thetaHat_pos.le + _ = G * hΓ.thetaHat ^ (2 : ℕ) := by ring + have hBlead_one : 1 ≤ Blead := by + simpa [Blead] using + one_le_smallBottomTailDenominator + (scale := scale) (η := η) (σ := σ) hη_pos hσ_pos.le + have hBlead_poly : + Blead ≤ A * (max 1 hΓ.thetaHat) ^ p := by + have hmax_scale : + max 1 scale ≤ max 1 (G * hΓ.thetaHat ^ (2 : ℕ)) := by + refine max_le ?_ ?_ + · exact le_max_left 1 (G * hΓ.thetaHat ^ (2 : ℕ)) + · exact hscale_le.trans + (le_max_right 1 (G * hΓ.thetaHat ^ (2 : ℕ))) + have hraw : + (max 1 scale) ^ (σ / η) ≤ + (max 1 (G * hΓ.thetaHat ^ (2 : ℕ))) ^ (σ / η) := by + exact Real.rpow_le_rpow + (le_trans zero_le_one (le_max_left 1 scale)) hmax_scale + (by positivity) + have hpoly : + (max 1 (G * hΓ.thetaHat ^ (2 : ℕ))) ^ (σ / η) ≤ + A * (max 1 hΓ.thetaHat) ^ p := by + simpa [A, p] using + rpow_max_one_mul_sq_le_const_mul_rpow + (A := G) (θ := hΓ.thetaHat) (r := σ / η) + hΓ.thetaHat_pos.le (by positivity) + simpa [Blead, smallBottomTailDenominator] using hraw.trans hpoly + have hscaleC : + C ≤ + Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ)) := by + have h := + hcompress hΓ.thetaHat hΓ.thetaHat_pos.le Blead hBlead_one + hBlead_poly + simpa [C, B, Btail, cgap, ρgap, Qpref, Qlead, Q] using h + have hO : + IsBigO P (gammaSigma η) X + (Real.exp + (Cscale * (Real.log (2 + hΓ.thetaHat)) ^ (2 : ℕ))) := + IsBigO.mono_scale (μ := P) (Ψ := gammaSigma η) hO_raw hscaleC + have hXone : ∀ aω, 1 ≤ X aω := by + intro aω + simpa [X] using one_le_quenchedMinimalScale Q Bad aω + have hpoint : + ∀ᵐ aω ∂P, + ∀ {m : ℕ}, + X aω ≤ (3 : ℝ) ^ m → + localizedLimitWeightedUnitEllipticitySup + hP hStruct hΓ.params m aω ≤ + (Real.rpow (3 : ℝ) (t * (m : ℝ)) * + Real.sqrt (((3 : ℝ) ^ m / X aω) ^ (-α))) ^ (2 : ℕ) := by + filter_upwards [hgoodAE] with aω hgood + intro m hm + simpa [Bad, X] using + localizedLimitWeightedUnitEllipticitySup_le_above_quenchedMinimalScale + hP hStruct hΓ.params (N0 := Q) (m := m) (t := t) (α := α) + (a := aω) hgood (by simpa [Bad, X] using hm) + exact ⟨X, hO, hXone, hpoint⟩ + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitJTail.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitJTail.lean new file mode 100644 index 0000000000..b2adf934e6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/UnitJTail.lean @@ -0,0 +1,860 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.LimitNormalization +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.ConcentrationAEMeasurable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.MomentFactorBounds.FactorBounds + +/-! # Unit JTail -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open MeasureTheory +open IndependentSums +open scoped BigOperators + +/-! +# Unit-scale tail for the limiting-normalized block response + +This file begins the deterministic unit-scale input for Corollary +`c.first.quenched.estimate`: a Γσ tail for +`J(□_0,\overline A^{-1/2}e,\overline A^{1/2}e)`. +-/ + +noncomputable section + +/-- A full-block quadratic form whose entries are uniformly bounded is +controlled by a dimension-only constant on coordinatewise unit vectors. -/ +theorem abs_fullBlockQuadraticCh04_le_card_sq_mul_of_entry_abs_le + {d : ℕ} (M : FullBlockMat d) (x : FullBlockVec d) {F : ℝ} + (hF : 0 ≤ F) (hentry : ∀ α β : BlockCoord d, |M α β| ≤ F) + (hx : ∀ α : BlockCoord d, |x α| ≤ 1) : + |Ch04.fullBlockQuadraticCh04 M x| ≤ + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * F := by + classical + have hrow : + ∀ α : BlockCoord d, + |Matrix.mulVec M x α| ≤ ∑ _β : BlockCoord d, F := by + intro α + calc + |Matrix.mulVec M x α| = |∑ β : BlockCoord d, M α β * x β| := by + simp [Matrix.mulVec, dotProduct] + _ ≤ ∑ β : BlockCoord d, |M α β * x β| := + Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun β : BlockCoord d => M α β * x β) + _ ≤ ∑ _β : BlockCoord d, F := + Finset.sum_le_sum fun β _hβ => by + calc + |M α β * x β| = |M α β| * |x β| := by rw [abs_mul] + _ ≤ F * 1 := + mul_le_mul (hentry α β) (hx β) (abs_nonneg _) hF + _ = F := by ring + have hcoord : + ∀ α : BlockCoord d, + |x α * Matrix.mulVec M x α| ≤ ∑ _β : BlockCoord d, F := by + intro α + calc + |x α * Matrix.mulVec M x α| = |x α| * |Matrix.mulVec M x α| := by + rw [abs_mul] + _ ≤ 1 * (∑ _β : BlockCoord d, F) := + mul_le_mul (hx α) (hrow α) (abs_nonneg _) (by norm_num) + _ = ∑ _β : BlockCoord d, F := by ring + calc + |Ch04.fullBlockQuadraticCh04 M x| + = |∑ α : BlockCoord d, x α * Matrix.mulVec M x α| := by + simp [Ch04.fullBlockQuadraticCh04, dotProduct] + _ ≤ ∑ α : BlockCoord d, |x α * Matrix.mulVec M x α| := + Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun α : BlockCoord d => x α * Matrix.mulVec M x α) + _ ≤ ∑ _α : BlockCoord d, ∑ _β : BlockCoord d, F := + Finset.sum_le_sum fun α _ => + hcoord α + _ = (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * F := by + simp + ring + +/-- A weighted two-coordinate block vector is nonzero if its two coordinates +are distinct. -/ +private theorem blockBasis_add_smul_ne_zero_of_ne + {d : ℕ} {α β : BlockCoord d} (c : ℝ) (hαβ : α ≠ β) : + blockBasis α + c • blockBasis β ≠ (0 : BlockVec d) := by + intro hzero + have hcoord := congrArg (fun X : BlockVec d => toFullBlockVec X α) hzero + cases α with + | inl i => + cases β with + | inl j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + | inr j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr i => + cases β with + | inl j => + simp [blockBasis, toFullBlockVec] at hcoord + | inr j => + have hij : i ≠ j := by + intro h + exact hαβ (by simp [h]) + simp [blockBasis, toFullBlockVec, Pi.single_eq_of_ne hij] at hcoord + +/-- Expansion of a two-coordinate weighted block quadratic. -/ +private theorem blockBasis_add_smul_pairing + {d : ℕ} (A : BlockMat d) (α β : BlockCoord d) (c : ℝ) : + blockVecDot (blockBasis α + c • blockBasis β) + (blockMatVecMul A (blockBasis α + c • blockBasis β)) = + blockMatEntry A α α + c * blockMatEntry A α β + + c * blockMatEntry A β α + c ^ (2 : ℕ) * blockMatEntry A β β := by + calc + blockVecDot (blockBasis α + c • blockBasis β) + (blockMatVecMul A (blockBasis α + c • blockBasis β)) + = + blockVecDot (blockBasis α + c • blockBasis β) + (blockMatVecMul A (blockBasis α) + + c • blockMatVecMul A (blockBasis β)) := by + rw [blockMatVecMul_add, blockMatVecMul_smul] + _ = + blockVecDot (blockBasis α + c • blockBasis β) + (blockMatVecMul A (blockBasis α)) + + blockVecDot (blockBasis α + c • blockBasis β) + (c • blockMatVecMul A (blockBasis β)) := by + rw [blockVecDot_add_right] + _ = + (blockVecDot (blockBasis α) (blockMatVecMul A (blockBasis α)) + + c * blockVecDot (blockBasis β) (blockMatVecMul A (blockBasis α))) + + c * + (blockVecDot (blockBasis α) (blockMatVecMul A (blockBasis β)) + + c * blockVecDot (blockBasis β) (blockMatVecMul A (blockBasis β))) := by + rw [blockVecDot_add_left, blockVecDot_add_left, + blockVecDot_smul_left, blockVecDot_smul_left, + blockVecDot_smul_right] + simp [blockVecDot_smul_right] + ring + _ = + blockMatEntry A α α + c * blockMatEntry A α β + + c * blockMatEntry A β α + c ^ (2 : ℕ) * blockMatEntry A β β := by + rw [blockBasis_pairing, blockBasis_pairing, blockBasis_pairing, + blockBasis_pairing] + ring + +/-- Weighted cross-entry control for a symmetric positive doubled block +matrix. -/ +private theorem abs_blockMatEntry_le_weighted_diag_sum_of_symm_blockPosDef + {d : ℕ} {A : BlockMat d} (hSymm : IsSymmetricBlockMat A) + (hPos : Ch02.BlockPosDef A) {α β : BlockCoord d} (hαβ : α ≠ β) + {b : ℝ} (hb : 0 < b) : + |blockMatEntry A α β| ≤ + (blockMatEntry A α α + b ^ (2 : ℕ) * blockMatEntry A β β) / + (2 * b) := by + have hplus_pos : + 0 < + blockVecDot (blockBasis α + b • blockBasis β) + (blockMatVecMul A (blockBasis α + b • blockBasis β)) := + hPos (blockBasis α + b • blockBasis β) + (blockBasis_add_smul_ne_zero_of_ne b hαβ) + have hminus_pos : + 0 < + blockVecDot (blockBasis α + (-b) • blockBasis β) + (blockMatVecMul A (blockBasis α + (-b) • blockBasis β)) := + hPos (blockBasis α + (-b) • blockBasis β) + (blockBasis_add_smul_ne_zero_of_ne (-b) hαβ) + have hsymm : blockMatEntry A β α = blockMatEntry A α β := (hSymm α β).symm + have hplus : + 0 < + blockMatEntry A α α + b * blockMatEntry A α β + + b * blockMatEntry A β α + + b ^ (2 : ℕ) * blockMatEntry A β β := by + have hpair := blockBasis_add_smul_pairing A α β b + rwa [hpair] at hplus_pos + have hminus : + 0 < + blockMatEntry A α α + (-b) * blockMatEntry A α β + + (-b) * blockMatEntry A β α + + (-b) ^ (2 : ℕ) * blockMatEntry A β β := by + have hpair := blockBasis_add_smul_pairing A α β (-b) + rwa [hpair] at hminus_pos + rw [hsymm] at hplus hminus + have hden_pos : 0 < 2 * b := by positivity + let x : ℝ := blockMatEntry A α β + let S : ℝ := blockMatEntry A α α + b ^ (2 : ℕ) * blockMatEntry A β β + have hupper_mul : x * (2 * b) ≤ S := by + dsimp [x, S] + nlinarith + have hlower_mul : -S ≤ x * (2 * b) := by + dsimp [x, S] + nlinarith + have hupper : x ≤ S / (2 * b) := + (le_div_iff₀ hden_pos).2 hupper_mul + have hlower : -(S / (2 * b)) ≤ x := by + have hdiv : (-S) / (2 * b) ≤ x := + (div_le_iff₀ hden_pos).2 hlower_mul + simpa [neg_div] using hdiv + exact abs_le.2 ⟨by simpa [x, S] using hlower, by simpa [x, S] using hupper⟩ + +private theorem diagonal_toFullBlockMat_diagonal_apply + {d : ℕ} (r : BlockCoord d → ℝ) (A : BlockMat d) + (α β : BlockCoord d) : + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) α β = + r α * blockMatEntry A α β * r β := by + simp [Matrix.mul_apply, Matrix.diagonal, toFullBlockMat, blockMatEntry] + +private theorem scalarFullBlockInvSqrtDiag_upper_abs_mul_self + {d : ℕ} {L : ℝ} (hL : 0 < L) (i j : Fin d) : + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inl i)| * + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inl j)| = + L⁻¹ := by + have hs : 0 < √L := Real.sqrt_pos.2 hL + simp [Ch04.scalarFullBlockInvSqrtDiag, abs_of_pos (inv_pos.mpr hs)] + field_simp [hs.ne', hL.ne'] + rw [Real.sq_sqrt hL.le] + +private theorem scalarFullBlockInvSqrtDiag_lower_abs_mul_self + {d : ℕ} {L : ℝ} (hL : 0 < L) (i j : Fin d) : + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inr i)| * + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inr j)| = + L := by + simp [Ch04.scalarFullBlockInvSqrtDiag, abs_of_nonneg (Real.sqrt_nonneg L)] + rw [← pow_two, Real.sq_sqrt hL.le] + +private theorem scalarFullBlockInvSqrtDiag_cross_abs_mul + {d : ℕ} {L : ℝ} (hL : 0 < L) (i j : Fin d) : + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inl i)| * + |Ch04.scalarFullBlockInvSqrtDiag (d := d) L L (Sum.inr j)| = + 1 := by + have hs : 0 < √L := Real.sqrt_pos.2 hL + simp [Ch04.scalarFullBlockInvSqrtDiag, abs_of_pos hs, + abs_of_pos (inv_pos.mpr hs), hs.ne'] + +/-- Entrywise control of a scalar-normalized doubled block matrix by the +weighted upper/lower ellipticity factors. -/ +theorem abs_invSqrtConj_toFullBlockMat_entry_le_weighted + {d : ℕ} {A : BlockMat d} {L Λ I : ℝ} + (hSymm : IsSymmetricBlockMat A) (hPos : Ch02.BlockPosDef A) + (hL : 0 < L) (hΛ : 0 ≤ Λ) (hI : 0 ≤ I) + (hUL : ∀ i j : Fin d, |A.upperLeft i j| ≤ Λ) + (hLR : ∀ i j : Fin d, |A.lowerRight i j| ≤ I) + (α β : BlockCoord d) : + |(Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) L L) * + toFullBlockMat A * + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) L L)) + α β| ≤ + L⁻¹ * Λ + L * I := by + let r : BlockCoord d → ℝ := Ch04.scalarFullBlockInvSqrtDiag (d := d) L L + have hW_nonneg : 0 ≤ L⁻¹ * Λ + L * I := by + exact add_nonneg (mul_nonneg (inv_pos.mpr hL).le hΛ) + (mul_nonneg hL.le hI) + have hentry : + ∀ α β : BlockCoord d, + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) α β = + r α * blockMatEntry A α β * r β := + diagonal_toFullBlockMat_diagonal_apply r A + have hcross_bound : + ∀ i j : Fin d, + |A.upperRight i j| ≤ L⁻¹ * Λ + L * I := by + intro i j + have hcross := + abs_blockMatEntry_le_weighted_diag_sum_of_symm_blockPosDef + (A := A) hSymm hPos + (α := Sum.inl i) (β := Sum.inr j) + (by intro h; cases h) hL + have hdiag_upper : A.upperLeft i i ≤ Λ := + (le_abs_self (A.upperLeft i i)).trans (hUL i i) + have hdiag_lower : A.lowerRight j j ≤ I := + (le_abs_self (A.lowerRight j j)).trans (hLR j j) + have hS_le : + A.upperLeft i i + L ^ (2 : ℕ) * A.lowerRight j j ≤ + Λ + L ^ (2 : ℕ) * I := + add_le_add hdiag_upper + (mul_le_mul_of_nonneg_left hdiag_lower (sq_nonneg L)) + have hden_nonneg : 0 ≤ 2 * L := by positivity + have hhalf : + (A.upperLeft i i + L ^ (2 : ℕ) * A.lowerRight j j) / (2 * L) ≤ + (Λ + L ^ (2 : ℕ) * I) / (2 * L) := + div_le_div_of_nonneg_right hS_le hden_nonneg + have hrewrite : + (Λ + L ^ (2 : ℕ) * I) / (2 * L) = + (1 / 2 : ℝ) * (L⁻¹ * Λ + L * I) := by + field_simp [hL.ne'] + have hhalf_le_weight : + (1 / 2 : ℝ) * (L⁻¹ * Λ + L * I) ≤ L⁻¹ * Λ + L * I := by + nlinarith + calc + |A.upperRight i j| ≤ + (A.upperLeft i i + L ^ (2 : ℕ) * A.lowerRight j j) / (2 * L) := by + simpa [blockMatEntry] using hcross + _ ≤ (Λ + L ^ (2 : ℕ) * I) / (2 * L) := hhalf + _ = (1 / 2 : ℝ) * (L⁻¹ * Λ + L * I) := hrewrite + _ ≤ L⁻¹ * Λ + L * I := hhalf_le_weight + cases α with + | inl i => + cases β with + | inl j => + calc + |(Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (Sum.inl i) (Sum.inl j)| + = L⁻¹ * |A.upperLeft i j| := by + rw [hentry] + simp only [r, blockMatEntry] + rw [abs_mul, abs_mul] + calc + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl i)| * + |A.upperLeft i j| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl j)| = + (|Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl i)| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl j)|) * + |A.upperLeft i j| := by ring + _ = L⁻¹ * |A.upperLeft i j| := by + rw [scalarFullBlockInvSqrtDiag_upper_abs_mul_self hL i j] + _ ≤ L⁻¹ * Λ := + mul_le_mul_of_nonneg_left (hUL i j) (inv_pos.mpr hL).le + _ ≤ L⁻¹ * Λ + L * I := + le_add_of_nonneg_right (mul_nonneg hL.le hI) + | inr j => + calc + |(Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (Sum.inl i) (Sum.inr j)| + = |A.upperRight i j| := by + rw [hentry] + simp only [r, blockMatEntry] + rw [abs_mul, abs_mul] + calc + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl i)| * + |A.upperRight i j| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr j)| = + (|Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl i)| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr j)|) * + |A.upperRight i j| := by ring + _ = |A.upperRight i j| := by + rw [scalarFullBlockInvSqrtDiag_cross_abs_mul hL i j] + ring + _ ≤ L⁻¹ * Λ + L * I := hcross_bound i j + | inr i => + cases β with + | inl j => + calc + |(Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (Sum.inr i) (Sum.inl j)| + = |A.lowerLeft i j| := by + rw [hentry] + have hcross := scalarFullBlockInvSqrtDiag_cross_abs_mul (d := d) + (L := L) hL j i + simp only [r, blockMatEntry] + rw [abs_mul, abs_mul] + calc + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr i)| * + |A.lowerLeft i j| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl j)| = + (|Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inl j)| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr i)|) * + |A.lowerLeft i j| := by ring + _ = |A.lowerLeft i j| := by + rw [hcross] + ring + _ = |A.upperRight j i| := by + rw [abs_eq_abs] + exact Or.inl (by simpa [blockMatEntry] using (hSymm (Sum.inr i) (Sum.inl j))) + _ ≤ L⁻¹ * Λ + L * I := hcross_bound j i + | inr j => + calc + |(Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) + (Sum.inr i) (Sum.inr j)| + = L * |A.lowerRight i j| := by + rw [hentry] + simp only [r, blockMatEntry] + rw [abs_mul, abs_mul] + calc + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr i)| * + |A.lowerRight i j| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr j)| = + (|Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr i)| * + |Ch04.scalarFullBlockInvSqrtDiag L L (Sum.inr j)|) * + |A.lowerRight i j| := by ring + _ = L * |A.lowerRight i j| := by + rw [scalarFullBlockInvSqrtDiag_lower_abs_mul_self hL i j] + _ ≤ L * I := + mul_le_mul_of_nonneg_left (hLR i j) hL.le + _ ≤ L⁻¹ * Λ + L * I := + le_add_of_nonneg_left (mul_nonneg (inv_pos.mpr hL).le hΛ) + +/-- Diagonal conjugation of a block matrix is the same quadratic form as +evaluating the original block matrix on the diagonally normalized vector. -/ +theorem fullBlockQuadraticCh04_diagonal_toFullBlockMat + {d : ℕ} (r : BlockCoord d → ℝ) (A : BlockMat d) (q : FullBlockVec d) : + Ch04.fullBlockQuadraticCh04 (toFullBlockMat A) + (Matrix.mulVec (Matrix.diagonal r) q) = + Ch04.fullBlockQuadraticCh04 + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) q := by + have hleft := + Ch04.fullBlockQuadraticCh04_toFullBlockMat A + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q)) + have hright := + Section54.VarianceBoundGoodScale.fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + r A q + rw [toFullBlockVec_ofFullBlockVec] at hleft + calc + Ch04.fullBlockQuadraticCh04 (toFullBlockMat A) + (Matrix.mulVec (Matrix.diagonal r) q) + = + blockVecDot (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q)) + (blockMatVecMul A (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal r) q))) := + hleft + _ = + Section54.VarianceBoundGoodScale.fullBlockQuadratic + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) q := + hright.symm + _ = + Ch04.fullBlockQuadraticCh04 + (Matrix.diagonal r * toFullBlockMat A * Matrix.diagonal r) q := by + rfl + +/-- Reflection preserves doubled-block positive definiteness. -/ +theorem blockPosDef_blockReflect {d : ℕ} {A : BlockMat d} + (hA : Ch02.BlockPosDef A) : + Ch02.BlockPosDef (blockReflect A) := by + intro X hX + have hswap : (X.2, X.1) ≠ (0 : BlockVec d) := by + intro hzero + exact hX (Prod.ext (congrArg Prod.snd hzero) (congrArg Prod.fst hzero)) + simpa using hA (X.2, X.1) hswap + +/-- The square-root scalar diagonal is the inverse-square-root diagonal with +the reciprocal scalar. -/ +private theorem scalarFullBlockSqrtDiag_eq_invSqrtDiag_inv + {d : ℕ} (L : ℝ) : + Section56.scalarFullBlockSqrtDiag (d := d) L L = + Ch04.scalarFullBlockInvSqrtDiag (d := d) L⁻¹ L⁻¹ := by + funext α + cases α <;> simp [Section56.scalarFullBlockSqrtDiag, + Ch04.scalarFullBlockInvSqrtDiag, Real.sqrt_inv] + +/-- Entrywise control for the reflected scalar square-root normalization. -/ +theorem abs_sqrtConj_reflect_toFullBlockMat_entry_le_weighted + {d : ℕ} {A : BlockMat d} {L Λ I : ℝ} + (hSymm : IsSymmetricBlockMat A) (hPos : Ch02.BlockPosDef A) + (hL : 0 < L) (hΛ : 0 ≤ Λ) (hI : 0 ≤ I) + (hUL : ∀ i j : Fin d, |A.upperLeft i j| ≤ Λ) + (hLR : ∀ i j : Fin d, |A.lowerRight i j| ≤ I) + (α β : BlockCoord d) : + |(Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) L L) * + toFullBlockMat (blockReflect A) * + Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) L L)) + α β| ≤ + L⁻¹ * Λ + L * I := by + have h := + abs_invSqrtConj_toFullBlockMat_entry_le_weighted + (A := blockReflect A) (L := L⁻¹) (Λ := I) (I := Λ) + (isSymmetricBlockMat_blockReflect hSymm) + (blockPosDef_blockReflect hPos) + (inv_pos.mpr hL) hI hΛ + (by intro i j; simpa [blockReflect] using hLR i j) + (by intro i j; simpa [blockReflect] using hUL i j) α β + have hsqrt := scalarFullBlockSqrtDiag_eq_invSqrtDiag_inv (d := d) L + calc + |(Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) L L) * + toFullBlockMat (blockReflect A) * + Matrix.diagonal (Section56.scalarFullBlockSqrtDiag (d := d) L L)) + α β| + = + |(Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) L⁻¹ L⁻¹) * + toFullBlockMat (blockReflect A) * + Matrix.diagonal (Ch04.scalarFullBlockInvSqrtDiag (d := d) L⁻¹ L⁻¹)) + α β| := by + rw [hsqrt] + _ ≤ (L⁻¹)⁻¹ * I + L⁻¹ * Λ := h + _ = L⁻¹ * Λ + L * I := by + field_simp [hL.ne'] + ring + +namespace GammaSigmaCoarseGrainedEllipticity + +variable {d : ℕ} [NeZero d] {P : Ch04.RestrictionCoeffLaw d} +variable {hP : Ch04.RestrictionLawCarrier P} {hStruct : Ch04.RestrictionStructuralLaw P} + +private theorem limitWeightedUnitEllipticityObservable_nonneg + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (a : RegCoeffField d) : + 0 ≤ limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + have hL_pos : 0 < barSigmaLimit hP hStruct := hΓ.barSigmaLimit_pos + have hΛ_nonneg : + 0 ≤ Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a := + Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : + 0 ≤ (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ := + inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + dsimp [limitWeightedUnitEllipticityObservable] + exact add_nonneg + (mul_nonneg (inv_pos.mpr hL_pos).le hΛ_nonneg) + (mul_nonneg hL_pos.le hI_nonneg) + +/-- The first normalized quadratic term in the unit-scale `J` observable is +controlled by the limiting weighted unit ellipticity observable. -/ +private theorem abs_limitInvSqrt_quadratic_le_card_sq_mul_weighted_ae + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) : + (fun a : RegCoeffField d => + |Ch04.fullBlockQuadraticCh04 + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a)) + (toFullBlockVec (scalarLimitInvSqrtBlockVec hP hStruct e))|) ≤ᵐ[P] + fun a => + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + let L : ℝ := barSigmaLimit hP hStruct + let r : BlockCoord d → ℝ := Ch04.scalarFullBlockInvSqrtDiag (d := d) L L + let D : FullBlockMat d := Matrix.diagonal r + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hL_pos : 0 < L := by simpa [L] using hΓ.barSigmaLimit_pos + have hUL_ae : + ∀ᵐ a ∂P, ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet (originCube d 0)) a.toFun).upperLeft i j| ≤ + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a := by + filter_upwards + [Ch04.ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => + Ch04.RestrictionLawCarrier.upperLeft_abs_entry_le_LambdaSqCoeffField_ae + hP (originCube d 0) hΓ.sUpper_pos i j)] with a h i j + exact h i (by simp) j (by simp) + have hLR_ae : + ∀ᵐ a ∂P, ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet (originCube d 0)) a.toFun).lowerRight i j| ≤ + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ := by + filter_upwards + [Ch04.ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => + Ch04.RestrictionLawCarrier.lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae + hP (originCube d 0) hΓ.sLower_pos i j)] with a h i j + exact h i (by simp) j (by simp) + filter_upwards [hP.ae_locallyUniformlyEllipticField, hUL_ae, hLR_ae] + with a ha hUL hLR + let A : BlockMat d := coarseBlockMatrix (cubeSet (originCube d 0)) a + let Λ : ℝ := + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let I : ℝ := + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + have hΛ_nonneg : 0 ≤ Λ := by + dsimp [Λ] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : 0 ≤ I := by + dsimp [I] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hEq : + A = Ch02.coarseBlockMatrix (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0)) := by + simpa [A] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha (originCube d 0) + have hSymm : IsSymmetricBlockMat A := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0)) + have hPos : Ch02.BlockPosDef A := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0))).block_matrix_posDef + have hentry_bound : + ∀ α β : BlockCoord d, |(D * toFullBlockMat A * D) α β| ≤ Y a := by + intro α β + have h := abs_invSqrtConj_toFullBlockMat_entry_le_weighted + (A := A) (L := L) (Λ := Λ) (I := I) + hSymm hPos hL_pos hΛ_nonneg hI_nonneg + (by intro i j; simpa [A, Λ] using hUL i j) + (by intro i j; simpa [A, I] using hLR i j) α β + simpa [Y, limitWeightedUnitEllipticityObservable, L, Λ, I, D, r] using h + have hquad : + Ch04.fullBlockQuadraticCh04 (toFullBlockMat A) + (toFullBlockVec (scalarLimitInvSqrtBlockVec hP hStruct e)) = + Ch04.fullBlockQuadraticCh04 (D * toFullBlockMat A * D) e := by + simp only [scalarLimitInvSqrtBlockVec, toFullBlockVec_ofFullBlockVec, + scalarLimitInvSqrtMatrix] + simpa [D, r, L] using + fullBlockQuadraticCh04_diagonal_toFullBlockMat r A e + calc + |Ch04.fullBlockQuadraticCh04 + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a)) + (toFullBlockVec (scalarLimitInvSqrtBlockVec hP hStruct e))| + = |Ch04.fullBlockQuadraticCh04 (D * toFullBlockMat A * D) e| := by + simpa [A] using congrArg abs hquad + _ ≤ (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * Y a := + abs_fullBlockQuadraticCh04_le_card_sq_mul_of_entry_abs_le + (D * toFullBlockMat A * D) e + (hΓ.limitWeightedUnitEllipticityObservable_nonneg a) + hentry_bound he + _ = + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + rfl + +/-- The reflected square-root quadratic term in the unit-scale `J` observable +is controlled by the same limiting weighted unit ellipticity observable. -/ +private theorem abs_limitSqrt_reflect_quadratic_le_card_sq_mul_weighted_ae + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) : + (fun a : RegCoeffField d => + |Ch04.fullBlockQuadraticCh04 + (Ch04.fullBlockReflect + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a))) + (toFullBlockVec (scalarLimitSqrtBlockVec hP hStruct e))|) ≤ᵐ[P] + fun a => + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + let L : ℝ := barSigmaLimit hP hStruct + let r : BlockCoord d → ℝ := Section56.scalarFullBlockSqrtDiag (d := d) L L + let T : FullBlockMat d := Matrix.diagonal r + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hL_pos : 0 < L := by simpa [L] using hΓ.barSigmaLimit_pos + have hUL_ae : + ∀ᵐ a ∂P, ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet (originCube d 0)) a.toFun).upperLeft i j| ≤ + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a := by + filter_upwards + [Ch04.ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => + Ch04.RestrictionLawCarrier.upperLeft_abs_entry_le_LambdaSqCoeffField_ae + hP (originCube d 0) hΓ.sUpper_pos i j)] with a h i j + exact h i (by simp) j (by simp) + have hLR_ae : + ∀ᵐ a ∂P, ∀ i j : Fin d, + |(coarseBlockMatrix (cubeSet (originCube d 0)) a.toFun).lowerRight i j| ≤ + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ := by + filter_upwards + [Ch04.ae_forall_mem_finset_nested (P := P) Finset.univ + (fun _ : Fin d => Finset.univ) + (fun i _hi j _hj => + Ch04.RestrictionLawCarrier.lowerRight_abs_entry_le_lambdaSqCoeffField_inv_ae + hP (originCube d 0) hΓ.sLower_pos i j)] with a h i j + exact h i (by simp) j (by simp) + filter_upwards [hP.ae_locallyUniformlyEllipticField, hUL_ae, hLR_ae] + with a ha hUL hLR + let A : BlockMat d := coarseBlockMatrix (cubeSet (originCube d 0)) a + let Λ : ℝ := + Ch04.LambdaSqCoeffField (originCube d 0) + hΓ.params.sUpper (.finite 1) a + let I : ℝ := + (Ch04.lambdaSqCoeffField (originCube d 0) + hΓ.params.sLower (.finite 1) a)⁻¹ + have hΛ_nonneg : 0 ≤ Λ := by + dsimp [Λ] + exact Ch04.LambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sUpper_pos (by norm_num : (1 : ℝ) ≤ 1) + have hI_nonneg : 0 ≤ I := by + dsimp [I] + exact inv_nonneg.mpr + (Ch04.lambdaSqCoeffField_finite_nonneg (originCube d 0) a + hΓ.sLower_pos (by norm_num : (1 : ℝ) ≤ 1)) + have hEq : + A = Ch02.coarseBlockMatrix (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0)) := by + simpa [A] using + Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha (originCube d 0) + have hSymm : IsSymmetricBlockMat A := by + rw [hEq] + exact Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0)) + have hPos : Ch02.BlockPosDef A := by + rw [hEq] + exact + (Ch02.blockCoarseMatrixTheory (Ch02.cubeDomain (originCube d 0)) + ((Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha).coeffOn + (originCube d 0))).block_matrix_posDef + have hentry_bound : + ∀ α β : BlockCoord d, |(T * toFullBlockMat (blockReflect A) * T) α β| ≤ Y a := by + intro α β + have h := abs_sqrtConj_reflect_toFullBlockMat_entry_le_weighted + (A := A) (L := L) (Λ := Λ) (I := I) + hSymm hPos hL_pos hΛ_nonneg hI_nonneg + (by intro i j; simpa [A, Λ] using hUL i j) + (by intro i j; simpa [A, I] using hLR i j) α β + simpa [Y, limitWeightedUnitEllipticityObservable, L, Λ, I, T, r] using h + have hquad : + Ch04.fullBlockQuadraticCh04 (Ch04.fullBlockReflect (toFullBlockMat A)) + (toFullBlockVec (scalarLimitSqrtBlockVec hP hStruct e)) = + Ch04.fullBlockQuadraticCh04 (T * toFullBlockMat (blockReflect A) * T) e := by + rw [Ch04.fullBlockReflect_toFullBlockMat A] + simp only [scalarLimitSqrtBlockVec, toFullBlockVec_ofFullBlockVec, + scalarLimitSqrtMatrix] + simpa [T, r, L] using + fullBlockQuadraticCh04_diagonal_toFullBlockMat r (blockReflect A) e + calc + |Ch04.fullBlockQuadraticCh04 + (Ch04.fullBlockReflect + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a))) + (toFullBlockVec (scalarLimitSqrtBlockVec hP hStruct e))| + = |Ch04.fullBlockQuadraticCh04 (T * toFullBlockMat (blockReflect A) * T) e| := by + simpa [A] using congrArg abs hquad + _ ≤ (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * Y a := + abs_fullBlockQuadraticCh04_le_card_sq_mul_of_entry_abs_le + (T * toFullBlockMat (blockReflect A) * T) e + (hΓ.limitWeightedUnitEllipticityObservable_nonneg a) + hentry_bound he + _ = + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + rfl + +/-- Unit-scale limiting-normalized `J` is pointwise dominated, a.e., by the +limiting weighted unit ellipticity observable. -/ +theorem limitNormalizedBlockJObservable_le_card_sq_mul_weighted_ae + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) : + (limitNormalizedBlockJObservable hP hStruct (originCube d 0) e) ≤ᵐ[P] + fun a => + (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower a := by + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hInv := + hΓ.abs_limitInvSqrt_quadratic_le_card_sq_mul_weighted_ae e he + have hSqrt := + hΓ.abs_limitSqrt_reflect_quadratic_le_card_sq_mul_weighted_ae e he + have hJae : + limitNormalizedBlockJObservable hP hStruct (originCube d 0) e =ᵐ[P] + fun a : RegCoeffField d => + Ch04.blockJQuadraticFullBlockMat + (toFullBlockMat + (coarseBlockMatrix (cubeSet (originCube d 0)) a)) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_ae_eq_blockJQuadraticFullBlockMat + hP (originCube d 0) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) + filter_upwards [hJae, hInv, hSqrt] with a hJ hInv_a hSqrt_a + let M : FullBlockMat d := + toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d 0)) a) + let Pvec : BlockVec d := scalarLimitInvSqrtBlockVec hP hStruct e + let Qvec : BlockVec d := scalarLimitSqrtBlockVec hP hStruct e + let q₁ : ℝ := Ch04.fullBlockQuadraticCh04 M (toFullBlockVec Pvec) + let q₂ : ℝ := Ch04.fullBlockQuadraticCh04 (Ch04.fullBlockReflect M) + (toFullBlockVec Qvec) + let pairing : ℝ := blockVecDot Pvec Qvec + have hq₁_le : q₁ ≤ C * Y a := by + exact (le_abs_self q₁).trans (by + simpa [q₁, M, Pvec, C, Y] using hInv_a) + have hq₂_le : q₂ ≤ C * Y a := by + exact (le_abs_self q₂).trans (by + simpa [q₂, M, Qvec, C, Y] using hSqrt_a) + have hpair_nonneg : 0 ≤ pairing := by + dsimp [pairing, Pvec, Qvec] + rw [hΓ.scalarLimit_normalizers_pairing_eq_dotProduct] + exact Section54.VarianceBoundGoodScale.dotProduct_self_nonneg e + calc + limitNormalizedBlockJObservable hP hStruct (originCube d 0) e a + = + Ch04.blockJQuadraticFullBlockMat M Pvec Qvec := by + simpa [M, Pvec, Qvec] using hJ + _ ≤ C * Y a := by + change (1 / 2 : ℝ) * q₁ + (1 / 2 : ℝ) * q₂ - pairing ≤ C * Y a + linarith + +/-- The unit-cube limiting-normalized `J` observable inherits the Γσ tail from +the strengthened unit ellipticity assumption. -/ +theorem limitNormalizedBlockJObservable_unit_isBigO + (hΓ : GammaSigmaCoarseGrainedEllipticity P hP hStruct) + (e : FullBlockVec d) (he : ∀ α : BlockCoord d, |e α| ≤ 1) : + IsBigO P (gammaSigma hΓ.sigma) + (limitNormalizedBlockJObservable hP hStruct (originCube d 0) e) + ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) * + (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat)) := by + let : IsProbabilityMeasure P := hP.isProbability + let C : ℝ := (Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ) + let Y : RegCoeffField d → ℝ := + limitWeightedUnitEllipticityObservable hP hStruct + hΓ.params.sUpper hΓ.params.sLower + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have htailY : + IsBigO P (gammaSigma hΓ.sigma) Y + (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) := by + simpa [Y] using hΓ.limitWeightedUnitEllipticityObservable_isBigO + have htailCY : + IsBigO P (gammaSigma hΓ.sigma) (fun a => C * Y a) + (C * (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat)) := by + exact IndependentSums.IsBigO.const_mul + (μ := P) (Ψ := gammaSigma hΓ.sigma) + (X := Y) + (A := thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat) + hC_nonneg htailY + have hle_ae := + hΓ.limitNormalizedBlockJObservable_le_card_sq_mul_weighted_ae e he + change IsBigOWith P (gammaSigma hΓ.sigma) + (fun a : RegCoeffField d => + |limitNormalizedBlockJObservable hP hStruct (originCube d 0) e a|) + (C * (thetaAtScale hP hStruct (0 : ℤ) * hΓ.thetaHat)) + refine Ch04.isBigOWith_of_ae_le + (μ := P) (Ψ := gammaSigma hΓ.sigma) + (X := fun a : RegCoeffField d => |C * Y a|) + (Y := fun a : RegCoeffField d => + |limitNormalizedBlockJObservable hP hStruct (originCube d 0) e a|) + htailCY ?_ + filter_upwards [hle_ae] with a hle + have hJ_nonneg : + 0 ≤ limitNormalizedBlockJObservable hP hStruct (originCube d 0) e a := by + simpa [limitNormalizedBlockJObservable] using + Ch04.blockJObservableCubeSetBlockVec_nonneg (originCube d 0) + (scalarLimitInvSqrtBlockVec hP hStruct e) + (scalarLimitSqrtBlockVec hP hStruct e) a + have hCY_nonneg : 0 ≤ C * Y a := by + exact mul_nonneg hC_nonneg + (by simpa [Y] using hΓ.limitWeightedUnitEllipticityObservable_nonneg a) + rw [abs_of_nonneg hJ_nonneg, abs_of_nonneg hCY_nonneg] + simpa [C, Y] using hle + +end GammaSigmaCoarseGrainedEllipticity + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/WeightedExponentialKernel.lean b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/WeightedExponentialKernel.lean new file mode 100644 index 0000000000..f2b0bf858f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/Ch05/Theorems/Section57/WeightedExponentialKernel.lean @@ -0,0 +1,373 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.ExponentialKernel + +/-! # Weighted Exponential Kernel -/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch05 +namespace Section57 + +open scoped BigOperators +open Filter +open scoped Topology + +/-! +# Weighted superexponential kernels + +The no-loss bad-scale proof keeps finite maxima as probability-level union +prefactors. These prefactors are exponential in the summation variables, but +the tail parameter is superexponential in the same variables. The kernels in +this file absorb those finite-union weights without spending any power of the +main bad scale. +-/ + +noncomputable section + +noncomputable def weightedGeometricExpKernelConst (w R : ℝ) : ℝ := + ∑' k : ℕ, w ^ k * Real.exp (-(R ^ k - 1)) + +noncomputable def weightedLinearExpKernelConst (w R : ℝ) : ℝ := + ∑' k : ℕ, (((k : ℝ) + 1) * w ^ k * Real.exp (-(R ^ k - 1))) + +private theorem tendsto_linear_ratio : + Tendsto (fun n : ℕ => ((n : ℝ) + 2) / ((n : ℝ) + 1)) atTop (𝓝 1) := by + have hinv : + Tendsto (fun n : ℕ => (1 : ℝ) / ((n : ℝ) + 1)) atTop (𝓝 0) := + tendsto_one_div_add_atTop_nhds_zero_nat + have hcongr : + (fun n : ℕ => ((n : ℝ) + 2) / ((n : ℝ) + 1)) = + fun n : ℕ => 1 + (1 : ℝ) / ((n : ℝ) + 1) := by + funext n + have hden : (n : ℝ) + 1 ≠ 0 := by positivity + field_simp [hden] + ring + rw [hcongr] + simpa using (tendsto_const_nhds.add hinv) + +private theorem tendsto_exp_neg_mul_pow + {w R : ℝ} (_hw : 0 < w) (hR : 1 < R) : + Tendsto (fun n : ℕ => Real.exp (-(R ^ n * (R - 1)))) atTop (𝓝 0) := by + have hdelta : 0 < R - 1 := sub_pos.mpr hR + have hpow : Tendsto (fun n : ℕ => R ^ n) atTop atTop := + tendsto_pow_atTop_atTop_of_one_lt hR + have hprod : + Tendsto (fun n : ℕ => (R - 1) * R ^ n) atTop atTop := + hpow.const_mul_atTop hdelta + have hneg : + Tendsto (fun n : ℕ => -((R - 1) * R ^ n)) atTop atBot := + tendsto_neg_atTop_atBot.comp hprod + have hexp : + Tendsto (fun n : ℕ => Real.exp (-((R - 1) * R ^ n))) atTop (𝓝 0) := + Real.tendsto_exp_atBot.comp hneg + simpa [mul_comm, mul_left_comm, mul_assoc] using hexp + +theorem summable_weightedLinearExpKernel + {w R : ℝ} (hw : 0 < w) (hR : 1 < R) : + Summable fun k : ℕ => + (((k : ℝ) + 1) * w ^ k * Real.exp (-(R ^ k - 1))) := by + let f : ℕ → ℝ := + fun k => (((k : ℝ) + 1) * w ^ k * Real.exp (-(R ^ k - 1))) + have hf_pos : ∀ k : ℕ, 0 < f k := by + intro k + dsimp [f] + positivity + refine summable_of_ratio_test_tendsto_lt_one (f := f) (l := 0) + (by norm_num) ?_ ?_ + · filter_upwards with k + exact ne_of_gt (hf_pos k) + · have hratio_eq : + (fun n : ℕ => ‖f (n + 1)‖ / ‖f n‖) =ᶠ[atTop] + fun n : ℕ => + (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + w * Real.exp (-(R ^ n * (R - 1))) := by + filter_upwards with n + have hn_pos : 0 < (n : ℝ) + 1 := by positivity + have hw_pow_pos : 0 < w ^ n := pow_pos hw n + have hR_pow_pos : 0 < R ^ n := pow_pos (lt_trans zero_lt_one hR) n + have hf_n_pos := hf_pos n + have hf_succ_pos := hf_pos (n + 1) + have hw_ne : w ≠ 0 := hw.ne' + have hw_pow_ne : w ^ n ≠ 0 := ne_of_gt hw_pow_pos + calc + ‖f (n + 1)‖ / ‖f n‖ + = f (n + 1) / f n := by + rw [Real.norm_eq_abs, Real.norm_eq_abs, + abs_of_pos hf_succ_pos, abs_of_pos hf_n_pos] + _ = (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + w * Real.exp (-(R ^ n * (R - 1))) := by + dsimp [f] + rw [pow_succ w n, pow_succ R n] + field_simp [hn_pos.ne', hw_ne, hw_pow_ne, Real.exp_ne_zero] + have hexp_eq : + Real.exp (-(R ^ n * R - 1)) = + Real.exp (-(R ^ n - 1)) * + Real.exp (-(R ^ n * (R - 1))) := by + rw [← Real.exp_add] + congr 1 + ring + rw [hexp_eq] + simp only [Nat.cast_add, Nat.cast_one] + ring_nf + refine Tendsto.congr' hratio_eq.symm ?_ + have hfrac := tendsto_linear_ratio + have hexp := tendsto_exp_neg_mul_pow (w := w) (R := R) hw hR + have hprod : + Tendsto + (fun n : ℕ => + (((n : ℝ) + 2) / ((n : ℝ) + 1)) * + w * Real.exp (-(R ^ n * (R - 1)))) + atTop (𝓝 (1 * w * 0)) := + (hfrac.mul tendsto_const_nhds).mul hexp + simpa using hprod + +theorem summable_weightedGeometricExpKernel + {w R : ℝ} (hw : 0 < w) (hR : 1 < R) : + Summable fun k : ℕ => w ^ k * Real.exp (-(R ^ k - 1)) := by + have hlinear := summable_weightedLinearExpKernel (w := w) (R := R) hw hR + refine Summable.of_nonneg_of_le ?_ ?_ hlinear + · intro k + positivity + · intro k + have hk : 1 ≤ (k : ℝ) + 1 := by + have hk0 : 0 ≤ (k : ℝ) := by positivity + linarith + have hterm_nonneg : 0 ≤ w ^ k * Real.exp (-(R ^ k - 1)) := by positivity + calc + w ^ k * Real.exp (-(R ^ k - 1)) + ≤ ((k : ℝ) + 1) * (w ^ k * Real.exp (-(R ^ k - 1))) := + by nlinarith + _ = ((k : ℝ) + 1) * w ^ k * Real.exp (-(R ^ k - 1)) := by ring + +theorem weightedGeometricExpKernelConst_pos + {w R : ℝ} (hw : 0 < w) (hR : 1 < R) : + 0 < weightedGeometricExpKernelConst w R := by + dsimp [weightedGeometricExpKernelConst] + have hsum := summable_weightedGeometricExpKernel (w := w) (R := R) hw hR + have hzero : (0 : ℝ) < w ^ (0 : ℕ) * Real.exp (-(R ^ (0 : ℕ) - 1)) := by + positivity + exact hsum.tsum_pos (fun k => by positivity) 0 hzero + +theorem weightedLinearExpKernelConst_pos + {w R : ℝ} (hw : 0 < w) (hR : 1 < R) : + 0 < weightedLinearExpKernelConst w R := by + dsimp [weightedLinearExpKernelConst] + have hsum := summable_weightedLinearExpKernel (w := w) (R := R) hw hR + have hzero : + (0 : ℝ) < + (((0 : ℕ) : ℝ) + 1) * w ^ (0 : ℕ) * + Real.exp (-(R ^ (0 : ℕ) - 1)) := by + positivity + exact hsum.tsum_pos (fun k => by positivity) 0 hzero + +theorem exp_neg_rpow_mul_pow_le_exp_neg_mul_weighted_kernel + {A ρ η : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (k : ℕ) : + Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1)) := by + have hA_pos : 0 < A := lt_of_lt_of_le zero_lt_one hA + have hρ_pos : 0 < ρ := lt_trans zero_lt_one hρ + have hAη_pos : 0 < A ^ η := Real.rpow_pos_of_pos hA_pos η + have hAη_ge_one : 1 ≤ A ^ η := + Real.one_le_rpow hA hη.le + have hR_gt_one : 1 < ρ ^ η := Real.one_lt_rpow hρ hη + have hR_pos : 0 < ρ ^ η := lt_trans zero_lt_one hR_gt_one + have hRk_ge_one : 1 ≤ (ρ ^ η) ^ k := one_le_pow₀ hR_gt_one.le + have hρ_pow_nonneg : 0 ≤ ρ ^ k := pow_nonneg hρ_pos.le k + have hρkη : + (ρ ^ k) ^ η = (ρ ^ η) ^ k := by + exact (Real.rpow_pow_comm hρ_pos.le η k).symm + have hmain : + A ^ η + ((ρ ^ η) ^ k - 1) ≤ (A * ρ ^ k) ^ η := by + have hprod : + A ^ η + ((ρ ^ η) ^ k - 1) ≤ A ^ η * (ρ ^ η) ^ k := by + nlinarith [hAη_ge_one, hRk_ge_one] + calc + A ^ η + ((ρ ^ η) ^ k - 1) + ≤ A ^ η * (ρ ^ η) ^ k := hprod + _ = (A * ρ ^ k) ^ η := by + rw [Real.mul_rpow hA_pos.le hρ_pow_nonneg, hρkη] + calc + Real.exp (-((A * ρ ^ k) ^ η)) + ≤ Real.exp (-(A ^ η + ((ρ ^ η) ^ k - 1))) := by + exact Real.exp_le_exp.mpr (by linarith) + _ = Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1)) := by + rw [← Real.exp_add] + congr 1 + ring + +theorem summable_weighted_geometric_exp_neg_rpow_mul_pow + {A ρ η w : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (hw : 0 < w) : + Summable fun k : ℕ => w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) := by + have hR : 1 < ρ ^ η := Real.one_lt_rpow hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := + (summable_weightedGeometricExpKernel (w := w) (R := ρ ^ η) hw hR).mul_left _ + have hpoint : + ∀ k : ℕ, + w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + intro k + have hwk_nonneg : 0 ≤ w ^ k := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_weighted_kernel + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) + ≤ w ^ k * + (Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + mul_le_mul_of_nonneg_left hbase hwk_nonneg + _ = Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := by ring + refine Summable.of_nonneg_of_le ?_ hpoint hmajor + intro k + positivity + +theorem summable_weighted_linear_exp_neg_rpow_mul_pow + {A ρ η w : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (hw : 0 < w) : + Summable fun k : ℕ => + (((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η))) := by + have hR : 1 < ρ ^ η := Real.one_lt_rpow hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + (summable_weightedLinearExpKernel (w := w) (R := ρ ^ η) hw hR).mul_left _ + have hpoint : + ∀ k : ℕ, + ((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + intro k + have hfactor_nonneg : 0 ≤ ((k : ℝ) + 1) * w ^ k := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_weighted_kernel + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + ((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) + ≤ ((k : ℝ) + 1) * w ^ k * + (Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + mul_le_mul_of_nonneg_left hbase hfactor_nonneg + _ = Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := by ring + refine Summable.of_nonneg_of_le ?_ hpoint hmajor + intro k + positivity + +theorem tsum_weighted_geometric_exp_neg_rpow_mul_pow_le_const + {A ρ η w : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (hw : 0 < w) : + (∑' k : ℕ, w ^ k * Real.exp (-((A * ρ ^ k) ^ η))) ≤ + Real.exp (-(A ^ η)) * weightedGeometricExpKernelConst w (ρ ^ η) := by + have hR : 1 < ρ ^ η := Real.one_lt_rpow hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + exact (summable_weightedGeometricExpKernel (w := w) (R := ρ ^ η) hw hR).mul_left _ + have hpoint : + ∀ k : ℕ, + w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + intro k + have hwk_nonneg : 0 ≤ w ^ k := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_weighted_kernel + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) + ≤ w ^ k * + (Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + mul_le_mul_of_nonneg_left hbase hwk_nonneg + _ = Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := by ring + have hlhs : + Summable fun k : ℕ => w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) := by + refine Summable.of_nonneg_of_le ?_ hpoint hmajor + intro k + positivity + calc + (∑' k : ℕ, w ^ k * Real.exp (-((A * ρ ^ k) ^ η))) + ≤ ∑' k : ℕ, + Real.exp (-(A ^ η)) * + (w ^ k * Real.exp (-(((ρ ^ η) ^ k) - 1))) := + Summable.tsum_le_tsum hpoint hlhs hmajor + _ = Real.exp (-(A ^ η)) * weightedGeometricExpKernelConst w (ρ ^ η) := by + rw [(summable_weightedGeometricExpKernel (w := w) (R := ρ ^ η) hw hR).tsum_mul_left] + rfl + +theorem tsum_weighted_linear_exp_neg_rpow_mul_pow_le_const + {A ρ η w : ℝ} (hA : 1 ≤ A) (hρ : 1 < ρ) (hη : 0 < η) (hw : 0 < w) : + (∑' k : ℕ, (((k : ℝ) + 1) * w ^ k * + Real.exp (-((A * ρ ^ k) ^ η)))) ≤ + Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ η) := by + have hR : 1 < ρ ^ η := Real.one_lt_rpow hρ hη + have hmajor : + Summable fun k : ℕ => + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + exact (summable_weightedLinearExpKernel (w := w) (R := ρ ^ η) hw hR).mul_left _ + have hpoint : + ∀ k : ℕ, + ((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) ≤ + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := by + intro k + have hfactor_nonneg : 0 ≤ ((k : ℝ) + 1) * w ^ k := by positivity + have hbase := + exp_neg_rpow_mul_pow_le_exp_neg_mul_weighted_kernel + (A := A) (ρ := ρ) (η := η) hA hρ hη k + calc + ((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) + ≤ ((k : ℝ) + 1) * w ^ k * + (Real.exp (-(A ^ η)) * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + mul_le_mul_of_nonneg_left hbase hfactor_nonneg + _ = Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := by ring + have hlhs : + Summable fun k : ℕ => + ((k : ℝ) + 1) * w ^ k * Real.exp (-((A * ρ ^ k) ^ η)) := by + refine Summable.of_nonneg_of_le ?_ hpoint hmajor + intro k + positivity + calc + (∑' k : ℕ, (((k : ℝ) + 1) * w ^ k * + Real.exp (-((A * ρ ^ k) ^ η)))) + ≤ ∑' k : ℕ, + Real.exp (-(A ^ η)) * + (((k : ℝ) + 1) * w ^ k * + Real.exp (-(((ρ ^ η) ^ k) - 1))) := + Summable.tsum_le_tsum hpoint hlhs hmajor + _ = Real.exp (-(A ^ η)) * weightedLinearExpKernelConst w (ρ ^ η) := by + rw [(summable_weightedLinearExpKernel (w := w) (R := ρ ^ η) hw hR).tsum_mul_left] + rfl + +end + +end Section57 +end Ch05 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Book/MainResults.lean b/LeanPool/CoarseGraining/Homogenization/Book/MainResults.lean new file mode 100644 index 0000000000..2245eede69 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Book/MainResults.lean @@ -0,0 +1,631 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section51.AnnealedConvergence +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Public +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section57.UniformEllipticityBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.SobolevPublic + +/-! +# Main results: elliptic homogenization in the uniformly elliptic case + +This file states the two main theorems of the manuscript, specialized to a +random coefficient field that is **uniformly elliptic**. + +The ambient object is a `Setup`: a probability law `P` on `d × d` +divergence-form coefficient fields that is + +* stationary, of unit range, isotropic, and adjoint-invariant (`hStruct`), +* equipped with the standard measurability/ellipticity data (`hP`), and +* **uniformly elliptic**: almost surely `lam I ≤ a ≤ Lam I` on every triadic + cube, with deterministic constants `0 < lam ≤ Lam` (`hUE`). + +The two results are: + +* `annealedConvergence_uniformEllipticity` — the annealed contrast `Θ` converges + to `1` at an algebraic rate beyond an explicit entry scale. +* `homogenizationComparison_uniformEllipticity` — above a random minimal scale + `𝒳`, the legacy dual-Besov compatibility defect between the heterogeneous and + homogenized solutions decays at algebraic rate `(3ᵐ / 𝒳)^(-α)`, with fixed + public exponents and constants chosen before the law. + +Both are proved in full, with no remaining proof obligations, from the general +theorems `Ch05.Section51.annealedConvergence_homogenizationScale` and +`Ch05.homogenization_quenched_homogenization_comparison`. + +## Where the definitions live + +The local wrappers `Setup`, `ComparisonPair`, `comparisonDefect`, +`comparisonData`, `IsMinimalScale`, and `originCube` are all defined **in this +file**, each with a docstring giving its mathematical meaning. They are thin +views on objects defined elsewhere (paths relative to the repository root; in an +editor every name is clickable and hovers its own docstring): + +* ambient hypotheses `Ch04.RestrictionLawCarrier` (probability/measurability/local + ellipticity) and `Ch04.RestrictionStructuralLaw` (stationarity, unit-range dependence, + isotropy, adjoint invariance), and `Ch04.AELocallyUniformlyEllipticField`: + `Homogenization/Book/Ch04/Law.lean`; +* `UniformEllipticityBounds`, the bridge to the coarse-grained inputs, and + `mainResultsThetaHat`: + `Homogenization/Book/Ch05/Theorems/Section57/UniformEllipticityBridge.lean`; +* the legacy dual-Besov comparison + `Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS`, legacy + fractional-Sobolev force seminorm + `Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo`, and + `Ch03.Legacy.ForceSobolevRegularity`, together with the bridges to the + internal Besov theorem: + `Homogenization/Book/Ch03/Theorems/SobolevPublic.lean`; + the energy norm `h1EnergyNormOnCube`: + `Homogenization/Book/Ch03/Definitions.lean`; +* `assemblyComparisonDatumOfScalar`, `assemblyConstantCoeffMatrixOfScalar`, and + `assemblyOriginCube`: + `Homogenization/Book/Ch05/Theorems/Section57/HomogenizationAssembly.lean`; + the homogenized scalar `barSigmaLimit`: + `Homogenization/Book/Ch05/Theorems/Section57/AnnealedLimit.lean`; +* the general (non-uniform) theorems specialized here: + `Homogenization/Book/Ch05/Theorems/Section51/AnnealedConvergence.lean` and + `Homogenization/Book/Ch05/Theorems/Public.lean`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace MainResults + +open MeasureTheory +open IndependentSums +open scoped Matrix.Norms.Elementwise + +noncomputable section + +/-- Almost-sure uniform ellipticity of the law `P` with deterministic constants +`lam`, `Lam` (`lam I ≤ a ≤ Lam I` a.s. on every triadic cube). -/ +abbrev UniformEllipticityBounds {d : ℕ} + (P : Ch04.RestrictionCoeffLaw d) (lam Lam : ℝ) : Prop := + Ch05.Section57.UniformEllipticityBounds P lam Lam + +/-- The triadic cube `□ₘ` of side `3ᵐ` at the origin, on which the comparison is +stated. -/ +abbrev originCube (d : ℕ) [NeZero d] (m : ℕ) : TriadicCube d := + Ch05.Section57.assemblyOriginCube d m + +/-- Fixed public stochastic exponent for the law-independent comparison theorem. + +The value is chosen only for a clean manuscript-facing corollary with no +remaining exponent parameters. -/ +noncomputable abbrev fixedComparisonT : ℝ := 1 / 8 + +/-- Fixed exponent used by the legacy fractional-Sobolev compatibility lane of +the law-independent comparison theorem. + +It satisfies `4 * fixedComparisonT < fixedComparisonS < 1`. -/ +noncomputable abbrev fixedComparisonS : ℝ := 3 / 4 + +/-- Internal moment parameters used for the fixed-exponent comparison theorem. + +These are strictly below `fixedComparisonT`; they are not exposed in the public +statement. -/ +noncomputable def fixedQuenchedParams (d : ℕ) (hd : 2 ≤ d) : + Ch05.Section57.GammaCoarseGrainedEllipticityParams d where + sUpper := 1 / 16 + sLower := 1 / 16 + two_le_dim := hd + sUpper_pos := by norm_num + sUpper_lt_one := by norm_num + sLower_pos := by norm_num + sLower_lt_one := by norm_num + sum_lt_one := by norm_num + +/-- The ambient data for the main results: a stationary, unit-range, isotropic, +adjoint-invariant, uniformly elliptic random coefficient field in dimension +`d ≥ 2`. -/ +structure Setup (d : ℕ) [NeZero d] where + /-- The dimension is at least two. -/ + two_le_dim : 2 ≤ d + /-- The probability law on coefficient fields. -/ + P : Ch04.RestrictionCoeffLaw d + /-- Probability/measurability/local-ellipticity data carried by the law. -/ + hP : Ch04.RestrictionLawCarrier P + /-- Stationarity, unit-range dependence, isotropy, and adjoint invariance of + the law. -/ + hStruct : Ch04.RestrictionStructuralLaw P + /-- Lower ellipticity constant. -/ + lam : ℝ + /-- Upper ellipticity constant. -/ + Lam : ℝ + /-- Almost-sure uniform ellipticity with constants `lam`, `Lam`. -/ + hUE : UniformEllipticityBounds P lam Lam + +namespace Setup + +variable {d : ℕ} [NeZero d] (S : Setup d) + +/-- The deterministic endpoint size `θ̂`, a function of the ellipticity ratio +`Lam / lam`. -/ +noncomputable def thetaHat : ℝ := + Ch05.Section57.mainResultsThetaHat d S.lam S.Lam + +/-- A fixed admissible coarse-grained ellipticity parameter bundle +(`s₁ = s₂ = 1/8`). It is used only internally, to recover the `(P4)`/`(P5)` +inputs from uniform ellipticity; none of its exponents appear in the public +statements. -/ +noncomputable def gammaParams : + Ch05.Section57.GammaCoarseGrainedEllipticityParams d where + sUpper := 1 / 8 + sLower := 1 / 8 + two_le_dim := S.two_le_dim + sUpper_pos := by norm_num + sUpper_lt_one := by norm_num + sLower_pos := by norm_num + sLower_lt_one := by norm_num + sum_lt_one := by norm_num + +/-- The `(P4)` quantitative coarse-grained ellipticity input recovered from +uniform ellipticity. -/ +noncomputable def p4 : Ch05.QuantitativeCoarseGrainedEllipticity S.P := + Ch05.Section57.UniformEllipticityBounds.toQuantitativeCoarseGrainedEllipticity + S.hUE S.hP S.gammaParams.toQuantitativeParams + +/-- The `σ = ∞` endpoint input recovered from uniform ellipticity (built from the +fixed parameters, hence independent of the exponents `t`, `s`). -/ +noncomputable def endpoint : + Ch05.Section57.GammaInfinityCoarseGrainedEllipticityNoXi S.P S.hP S.hStruct := + S.hUE.toGammaInfinityCoarseGrainedEllipticityNoXi S.hP S.hStruct S.gammaParams + +/-- Positivity of the homogenized scalar `σ̄`, independent of the exponents. -/ +theorem barSigmaLimit_pos : + 0 < Ch05.Section57.barSigmaLimit S.hP S.hStruct := + (S.endpoint.withInternalXi.toGammaSigma 1 zero_lt_one).barSigmaLimit_pos + +/-- The homogenized constant coefficient matrix `ā = σ̄ I`. -/ +noncomputable def homogenizedMatrix : Ch03.ConstantCoeffMatrix d := + Ch05.Section57.assemblyConstantCoeffMatrixOfScalar + (Ch05.Section57.barSigmaLimit S.hP S.hStruct) S.barSigmaLimit_pos + +/-- A comparison pair on the triadic cube `□ₘ`: weak solutions `u, v ∈ H¹(□ₘ)` +with the same right-hand side `∇·g` and the same boundary data, where `u` solves +the heterogeneous equation `-∇·a∇u = ∇·g`, `v` solves the homogenized equation +`-∇·ā∇v = ∇·g`, and `u - v ∈ H¹₀(□ₘ)`. Wraps +`Ch05.Section57.assemblyComparisonDatumOfScalar`; `pair.u` and `pair.v` are the +two solutions. -/ +abbrev ComparisonPair (aω : RegCoeffField d) + (ha : Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (g : Vec d → Vec d) : Type := + Ch05.Section57.assemblyComparisonDatumOfScalar + (Ch05.Section57.barSigmaLimit S.hP S.hStruct) S.barSigmaLimit_pos aω ha m g + +/-- The legacy dual-Besov compatibility defect at exponent `s`. + +This wraps `Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS`; it is not +an identification with either Chapter 1 negative-Sobolev primitive. -/ +noncomputable def comparisonDefect (s : ℝ) + {aω : RegCoeffField d} {ha : Ch04.AELocallyUniformlyEllipticField aω} + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g) : ℝ := + Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix s pair.u pair.v + +/-- The data norm controlling the compatibility defect. + +Its force term is the componentwise legacy fractional-Sobolev seminorm; it +wraps `Ch03.h1EnergyNormOnCube` and +`Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo`. -/ +noncomputable def comparisonData (s : ℝ) + {aω : RegCoeffField d} {ha : Ch04.AELocallyUniformlyEllipticField aω} + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g) : ℝ := + Real.sqrt (Ch05.Section57.barSigmaLimit S.hP S.hStruct) * + Ch03.h1EnergyNormOnCube (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) pair.u + + Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo + (originCube d m) s g + +/-- `𝒳` is a minimal scale: it is bounded below by `1` and has `Γ_d` +(stretched-exponential, exponent `d`) upper tails of size +`exp ( Cscale · log²(2 + θ̂) )`. -/ +def IsMinimalScale (𝒳 : RegCoeffField d → ℝ) (Cscale : ℝ) : Prop := + (∀ aω, 1 ≤ 𝒳 aω) ∧ + Ch04.IsBigO S.P (gammaSigma ((d : ℕ) : ℝ)) 𝒳 + (Real.exp (Cscale * (Real.log (2 + S.thetaHat)) ^ (2 : ℕ))) + +/-- The entry scale `N₀` past which the annealed contrast decays algebraically. -/ +noncomputable def annealedEntryScale (C : ℝ) : ℕ := + Ch05.annealedAlgebraicEntryScale S.P S.p4 C + +/-- The internal `σ = ∞` endpoint parameters for the quenched theorem +(`s₁ = s₂ = t/2`), chosen below the public exponent `t`. -/ +noncomputable def quenchedParams {t s : ℝ} + (ht : 0 < t) (hts : 4 * t < s) (hs : s < 1) : + Ch05.Section57.GammaCoarseGrainedEllipticityParams d where + sUpper := t / 2 + sLower := t / 2 + two_le_dim := S.two_le_dim + sUpper_pos := by linarith + sUpper_lt_one := by linarith + sLower_pos := by linarith + sLower_lt_one := by linarith + sum_lt_one := by + have : t < 1 := by linarith + linarith + +end Setup + +/-- **Convergence of the annealed contrast (uniformly elliptic case).** + +For a stationary, unit-range, isotropic, adjoint-invariant, uniformly elliptic +law `S`, the annealed contrast `Θ` converges to `1` at an algebraic rate: there +are constants `C, α > 0` such that for every `n`, the contrast at scale +`S.annealedEntryScale C + n` is at most `1 + 3^(-α n)`. -/ +theorem annealedConvergence_uniformEllipticity + {d : ℕ} [NeZero d] (S : Setup d) : + ∃ C α : ℝ, 0 < C ∧ 0 < α ∧ + ∀ n : ℕ, + Ch05.thetaAtScale S.hP S.hStruct ((S.annealedEntryScale C + n : ℕ) : ℤ) ≤ + 1 + Real.rpow (3 : ℝ) (-α * (n : ℝ)) := by + obtain ⟨C, α, hC, hα, hmain⟩ := + Ch05.Section51.annealedConvergence_homogenizationScale + S.gammaParams.toQuantitativeParams + refine ⟨C, α, hC, hα, fun n => ?_⟩ + have hparams : S.p4.params = S.gammaParams.toQuantitativeParams := rfl + have h := hmain S.hP S.hStruct S.p4 hparams n + simpa [Setup.annealedEntryScale, Setup.p4] using h + +/-- Auxiliary variable-exponent quenched comparison corollary. + +For a stationary, unit-range, isotropic, adjoint-invariant, uniformly elliptic +law `S`, and exponents `t, s` with `0 < t`, `4t < s`, `s < 1`, there is a +random minimal scale `𝒳` (with `Γ_d` tails) such that, almost surely, on every +triadic cube `□ₘ` with `𝒳 ≤ 3ᵐ`, for every comparison pair `u, v` and every +force satisfying the legacy fractional-Sobolev compatibility condition, the +legacy dual-Besov compatibility defect is controlled by the corresponding data +norm at the algebraic rate `(3ᵐ / 𝒳)^(-α)`. + +This theorem keeps the exponents variable, so its constants are selected after +`S`, `t`, and `s`. The public compatibility theorem below fixes the +exponents and chooses the constants before the law. -/ +theorem homogenizationComparison_uniformEllipticity_variableExponents + {d : ℕ} [NeZero d] (S : Setup d) : + ∀ {t s : ℝ}, 0 < t → 4 * t < s → s < 1 → + ∃ C α Cscale : ℝ, + 0 < C ∧ 0 < α ∧ 0 < Cscale ∧ + ∃ 𝒳 : RegCoeffField d → ℝ, + S.IsMinimalScale 𝒳 Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g), + 𝒳 aω ≤ (3 : ℝ) ^ m → + Ch03.Legacy.ForceSobolevRegularity (originCube d m) s g → + S.comparisonDefect s pair ≤ + C * ((3 : ℝ) ^ m / 𝒳 aω) ^ (-α) * S.comparisonData s pair := by + intro t s ht hts hs + let params : Ch05.Section57.GammaCoarseGrainedEllipticityParams d := + S.quenchedParams ht hts hs + obtain ⟨α, hα, hendpoint⟩ := + (Ch05.homogenization_quenched_homogenization_comparison params).2 + have hmax : max params.sUpper params.sLower < t := by + simp only [params, Setup.quenchedParams, max_self] + linarith + obtain ⟨C0, Cscale, hC0, hCscale, hlaw⟩ := hendpoint hmax hts hs + let Kneg : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + s) + let Kpos : ℝ := (3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d + let Kdata : ℝ := 1 + Kpos + let C : ℝ := Kneg * Kdata * C0 + have hd_pos_nat : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hd_pos : 0 < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hKneg_pos : 0 < Kneg := by + exact mul_pos hd_pos (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _) + have hKpos_nonneg : 0 ≤ Kpos := by + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (le_of_lt (Ch01.Legacy.wspVsBsppConstant_pos d)) + have hKdata_pos : 0 < Kdata := by + dsimp [Kdata] + nlinarith + have hKdata_ge_one : 1 ≤ Kdata := by + dsimp [Kdata] + nlinarith + have hKpos_le_Kdata : Kpos ≤ Kdata := by + dsimp [Kdata] + nlinarith + have hC : 0 < C := by + dsimp [C] + exact mul_pos (mul_pos hKneg_pos hKdata_pos) hC0 + let hInf : + Ch05.Section57.GammaInfinityCoarseGrainedEllipticityNoXi S.P S.hP S.hStruct := + S.hUE.toGammaInfinityCoarseGrainedEllipticityNoXi S.hP S.hStruct params + have hparams : hInf.params = params := rfl + obtain ⟨X, hX, hX_one, hmain⟩ := hlaw S.hP S.hStruct hInf hparams + refine ⟨C, α, Cscale, hC, hα, hCscale, X, ⟨hX_one, ?_⟩, ?_⟩ + · simpa [Setup.thetaHat, hInf, Setup.endpoint, + Ch05.Section57.UniformEllipticityBounds.toGammaInfinityCoarseGrainedEllipticityNoXi] + using hX + · filter_upwards [hmain] with aω haω + intro ha m g pair hXm hg + have hs_pos : 0 < s := by linarith + have hs_le_one : s ≤ 1 := le_of_lt hs + have hgBesov : Ch03.ForceBesovRegularity (originCube d m) s g := + hg.toForceBesovRegularity hs_pos hs_le_one + have hstep := haω ha (m := m) (g := g) pair hXm hgBesov + let rate : ℝ := ((3 : ℝ) ^ m / X aω) ^ (-α) + let E : ℝ := + Real.sqrt (Ch05.Section57.barSigmaLimit S.hP S.hStruct) * + Ch03.h1EnergyNormOnCube (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) pair.u + let B : ℝ := + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo + (originCube d m) s g + let H : ℝ := + Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo + (originCube d m) s g + have hrate_nonneg : 0 ≤ rate := by + have hX_pos : 0 < X aω := lt_of_lt_of_le zero_lt_one (hX_one aω) + have hbase_nonneg : 0 ≤ (3 : ℝ) ^ m / X aω := by + exact div_nonneg (le_of_lt (pow_pos (by norm_num : 0 < (3 : ℝ)) m)) + (le_of_lt hX_pos) + exact Real.rpow_nonneg hbase_nonneg _ + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact mul_nonneg (Real.sqrt_nonneg _) + (by + unfold Ch03.h1EnergyNormOnCube + exact Real.sqrt_nonneg _) + have hH_nonneg : 0 ≤ H := by + dsimp [H] + exact Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo_nonneg + (originCube d m) s g + have hB_le_H : B ≤ Kpos * H := by + dsimp [B, H, Kpos] + exact Ch03.Legacy.scaleNormalizedPositiveBesovVectorSeminormTwo_le_const_mul_sobolev + (originCube d m) (s := s) g hs_pos hs_le_one hg + have hdata : E + B ≤ Kdata * (E + H) := by + have hE_le : E ≤ Kdata * E := by + calc + E = 1 * E := by ring + _ ≤ Kdata * E := + mul_le_mul_of_nonneg_right hKdata_ge_one hE_nonneg + have hB_le_Kdata : B ≤ Kdata * H := by + exact hB_le_H.trans + (mul_le_mul_of_nonneg_right hKpos_le_Kdata hH_nonneg) + calc + E + B ≤ Kdata * E + Kdata * H := add_le_add hE_le hB_le_Kdata + _ = Kdata * (E + H) := by ring + have hold : + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix s pair.u pair.v ≤ + C0 * rate * (E + B) := by + simpa [rate, E, B, Setup.homogenizedMatrix, + Setup.ComparisonPair, Setup.barSigmaLimit_pos, hInf, Setup.endpoint] + using! hstep + have hneg : + S.comparisonDefect s pair ≤ + Kneg * + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix s pair.u pair.v := by + simpa [Setup.comparisonDefect, Kneg, Setup.homogenizedMatrix, + Setup.ComparisonPair, Setup.barSigmaLimit_pos] + using + Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS_le_const_mul_negativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix s pair.u pair.v hs_pos + calc + S.comparisonDefect s pair + ≤ + Kneg * + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix s pair.u pair.v := hneg + _ ≤ Kneg * (C0 * rate * (E + B)) := by + exact mul_le_mul_of_nonneg_left hold (le_of_lt hKneg_pos) + _ ≤ Kneg * (C0 * rate * (Kdata * (E + H))) := by + have hcoef_nonneg : 0 ≤ C0 * rate := + mul_nonneg (le_of_lt hC0) hrate_nonneg + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdata hcoef_nonneg) + (le_of_lt hKneg_pos) + _ = C * rate * (E + H) := by + dsimp [C] + ring + _ = C * ((3 : ℝ) ^ m / X aω) ^ (-α) * S.comparisonData s pair := by + dsimp [rate, E, H] + simp [Setup.comparisonData] + +/-- **Quenched homogenization above the minimal scale, fixed-exponent form.** + +This is the law-independent-constant public compatibility corollary used by the +comparator audit. The compatibility exponents are fixed to `t = 1/8` and +`s = 3/4`; consequently the constants `C`, `α`, and `Cscale` are chosen before the probability law +`S : Setup d`. In particular they do not depend on the law, on the ellipticity +constants, on the realization, or on any solution data. -/ +theorem homogenizationComparison_uniformEllipticity + {d : ℕ} [NeZero d] : + ∃ C α Cscale : ℝ, + 0 < C ∧ 0 < α ∧ 0 < Cscale ∧ + ∀ S : Setup d, + ∃ sigmaBar : ℝ, + 0 < sigmaBar ∧ + ∃ X : RegCoeffField d → ℝ, + S.IsMinimalScale X Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (ha : Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Ch03.Legacy.ForceSobolevRegularity (originCube d m) fixedComparisonS g → + S.comparisonDefect fixedComparisonS pair ≤ + C * ((3 : ℝ) ^ m / X aω) ^ (-α) * + S.comparisonData fixedComparisonS pair := by + classical + by_cases hdim : 2 ≤ d + · let params : Ch05.Section57.GammaCoarseGrainedEllipticityParams d := + fixedQuenchedParams d hdim + obtain ⟨α, hα, hendpoint⟩ := + (Ch05.homogenization_quenched_homogenization_comparison params).2 + have hmax : max params.sUpper params.sLower < fixedComparisonT := by + norm_num [params, fixedQuenchedParams, fixedComparisonT] + have hts : 4 * fixedComparisonT < fixedComparisonS := by + norm_num [fixedComparisonT, fixedComparisonS] + have hs : fixedComparisonS < 1 := by + norm_num [fixedComparisonS] + obtain ⟨C0, Cscale, hC0, hCscale, hlaw⟩ := hendpoint hmax hts hs + let Kneg : ℝ := (d : ℝ) * Real.rpow (3 : ℝ) ((d : ℝ) + fixedComparisonS) + let Kpos : ℝ := (3 : ℝ) ^ ((d : ℝ) / 2) * Ch01.Legacy.wspVsBsppConstant d + let Kdata : ℝ := 1 + Kpos + let C : ℝ := Kneg * Kdata * C0 + have hd_pos_nat : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + have hd_pos : 0 < (d : ℝ) := by exact_mod_cast hd_pos_nat + have hKneg_pos : 0 < Kneg := by + exact mul_pos hd_pos (Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _) + have hKpos_nonneg : 0 ≤ Kpos := by + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (le_of_lt (Ch01.Legacy.wspVsBsppConstant_pos d)) + have hKdata_pos : 0 < Kdata := by + dsimp [Kdata] + nlinarith + have hKdata_ge_one : 1 ≤ Kdata := by + dsimp [Kdata] + nlinarith + have hKpos_le_Kdata : Kpos ≤ Kdata := by + dsimp [Kdata] + nlinarith + have hC : 0 < C := by + dsimp [C] + exact mul_pos (mul_pos hKneg_pos hKdata_pos) hC0 + refine ⟨C, α, Cscale, hC, hα, hCscale, ?_⟩ + intro S + let sigmaBar : ℝ := + Ch05.Section57.barSigmaLimit S.hP S.hStruct + have hsigma : 0 < sigmaBar := by + dsimp [sigmaBar] + exact S.barSigmaLimit_pos + let hInf : + Ch05.Section57.GammaInfinityCoarseGrainedEllipticityNoXi S.P S.hP S.hStruct := + S.hUE.toGammaInfinityCoarseGrainedEllipticityNoXi S.hP S.hStruct params + have hparams : hInf.params = params := rfl + obtain ⟨X, hX, hX_one, hmain⟩ := hlaw S.hP S.hStruct hInf hparams + refine ⟨sigmaBar, hsigma, X, ⟨hX_one, ?_⟩, ?_⟩ + · simpa [Setup.thetaHat, hInf, + Ch05.Section57.UniformEllipticityBounds.toGammaInfinityCoarseGrainedEllipticityNoXi] + using hX + · filter_upwards [hmain] with aω haω + intro ha m g pair hXm hg + have hs_pos : 0 < fixedComparisonS := by + norm_num [fixedComparisonS] + have hs_le_one : fixedComparisonS ≤ 1 := by + norm_num [fixedComparisonS] + have hgBesov : Ch03.ForceBesovRegularity (originCube d m) fixedComparisonS g := + hg.toForceBesovRegularity hs_pos hs_le_one + have hstep := haω ha (m := m) (g := g) pair hXm hgBesov + let rate : ℝ := ((3 : ℝ) ^ m / X aω) ^ (-α) + let E : ℝ := + Real.sqrt (Ch05.Section57.barSigmaLimit S.hP S.hStruct) * + Ch03.h1EnergyNormOnCube (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) pair.u + let B : ℝ := + Ch03.scaleNormalizedPositiveBesovVectorSeminormTwo + (originCube d m) fixedComparisonS g + let H : ℝ := + Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo + (originCube d m) fixedComparisonS g + have hrate_nonneg : 0 ≤ rate := by + have hX_pos : 0 < X aω := lt_of_lt_of_le zero_lt_one (hX_one aω) + have hbase_nonneg : 0 ≤ (3 : ℝ) ^ m / X aω := by + exact div_nonneg (le_of_lt (pow_pos (by norm_num : 0 < (3 : ℝ)) m)) + (le_of_lt hX_pos) + exact Real.rpow_nonneg hbase_nonneg _ + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact mul_nonneg (Real.sqrt_nonneg _) + (by + unfold Ch03.h1EnergyNormOnCube + exact Real.sqrt_nonneg _) + have hH_nonneg : 0 ≤ H := by + dsimp [H] + exact Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo_nonneg + (originCube d m) fixedComparisonS g + have hB_le_H : B ≤ Kpos * H := by + dsimp [B, H, Kpos] + exact Ch03.Legacy.scaleNormalizedPositiveBesovVectorSeminormTwo_le_const_mul_sobolev + (originCube d m) (s := fixedComparisonS) g hs_pos hs_le_one hg + have hdata : E + B ≤ Kdata * (E + H) := by + have hE_le : E ≤ Kdata * E := by + calc + E = 1 * E := by ring + _ ≤ Kdata * E := + mul_le_mul_of_nonneg_right hKdata_ge_one hE_nonneg + have hB_le_Kdata : B ≤ Kdata * H := by + exact hB_le_H.trans + (mul_le_mul_of_nonneg_right hKpos_le_Kdata hH_nonneg) + calc + E + B ≤ Kdata * E + Kdata * H := add_le_add hE_le hB_le_Kdata + _ = Kdata * (E + H) := by ring + have hold : + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix fixedComparisonS pair.u pair.v ≤ + C0 * rate * (E + B) := by + simpa [rate, E, B, Setup.homogenizedMatrix, + Setup.ComparisonPair, Setup.barSigmaLimit_pos, hInf] + using! hstep + have hneg : + S.comparisonDefect fixedComparisonS pair ≤ + Kneg * + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix fixedComparisonS pair.u pair.v := by + simpa [Setup.comparisonDefect, Kneg, Setup.homogenizedMatrix, + Setup.ComparisonPair, Setup.barSigmaLimit_pos] + using + Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS_le_const_mul_negativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix fixedComparisonS pair.u pair.v hs_pos + calc + S.comparisonDefect fixedComparisonS pair + ≤ + Kneg * + Ch03.homogenizationComparisonNegativeBesovLHS + (originCube d m) + (Ch05.Section57.assemblyCoeffFamily aω ha) + S.homogenizedMatrix fixedComparisonS pair.u pair.v := hneg + _ ≤ Kneg * (C0 * rate * (E + B)) := by + exact mul_le_mul_of_nonneg_left hold (le_of_lt hKneg_pos) + _ ≤ Kneg * (C0 * rate * (Kdata * (E + H))) := by + have hcoef_nonneg : 0 ≤ C0 * rate := + mul_nonneg (le_of_lt hC0) hrate_nonneg + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdata hcoef_nonneg) + (le_of_lt hKneg_pos) + _ = C * rate * (E + H) := by + dsimp [C] + ring + _ = C * ((3 : ℝ) ^ m / X aω) ^ (-α) * + S.comparisonData fixedComparisonS pair := by + dsimp [rate, E, H] + simp [Setup.comparisonData] + · refine ⟨1, 1, 1, by norm_num, by norm_num, by norm_num, ?_⟩ + intro S + exact False.elim (hdim S.two_le_dim) + +end + +end MainResults +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining.lean new file mode 100644 index 0000000000..7c81d12dbb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining.lean @@ -0,0 +1,38 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuWellPosedness +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry.lean new file mode 100644 index 0000000000..fb8b5ea28a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint + +/-! +# Adjoint symmetry (aggregate re-export) + +Previously a 1074-line monolithic module; now split along thematic +boundaries into the two files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/BasicAdjoint.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/BasicAdjoint.lean new file mode 100644 index 0000000000..2ba29e337a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/BasicAdjoint.lean @@ -0,0 +1,565 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal + +/-! # Basic Adjoint -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Adjoint symmetry -- basic adjoint-coefficient-field equalities + +blockVecFlipFlux / blockMatFlipFlux, muValueSet_adjointCoeffField_flipFlux, +Mu_adjointCoeffField_flipFlux, and the coarseBlockMatrix / +coarseStarredBlockMatrixInv adjointCoeffField equalities (including the +component variants for upperLeft / upperRight / lowerLeft / lowerRight). +-/ + +/-- +Flip the flux component of a doubled block vector. +-/ +def blockVecFlipFlux {d : ℕ} (P : BlockVec d) : BlockVec d := + (P.1, -P.2) + +/-- +Flip the off-diagonal flux signs of a doubled block matrix. +-/ +def blockMatFlipFlux {d : ℕ} (A : BlockMat d) : BlockMat d := + { upperLeft := A.upperLeft + upperRight := -A.upperRight + lowerLeft := -A.lowerLeft + lowerRight := A.lowerRight } + +@[simp] theorem blockVecFlipFlux_flipFlux {d : ℕ} (P : BlockVec d) : + blockVecFlipFlux (blockVecFlipFlux P) = P := by + rcases P with ⟨p, q⟩ + simp [blockVecFlipFlux] + +@[simp] theorem blockState_flipFlux_flipFlux {d : ℕ} (X : BlockState d) : + X.flipFlux.flipFlux = X := by + cases X + apply BlockState.ext + · rfl + · funext x + simp [BlockState.flipFlux] + +@[simp] theorem adjointCoeffField_adjointCoeffField {d : ℕ} (a : CoeffField d) : + adjointCoeffField (adjointCoeffField a) = a := by + funext x + simp [adjointCoeffField, matTranspose] + +@[simp] theorem blockMatVecMul_blockMatFlipFlux {d : ℕ} + (A : BlockMat d) (P : BlockVec d) : + blockMatVecMul (blockMatFlipFlux A) P = + blockVecFlipFlux (blockMatVecMul A (blockVecFlipFlux P)) := by + rcases A with ⟨ul, ur, ll, lr⟩ + rcases P with ⟨p, q⟩ + apply Prod.ext + · simp [blockMatFlipFlux, blockVecFlipFlux, blockMatVecMul, neg_matVecMul, matVecMul_neg] + · simp [blockMatFlipFlux, blockVecFlipFlux, blockMatVecMul, neg_matVecMul, matVecMul_neg, + add_comm] + +theorem blockVecDot_blockVecFlipFlux_right {d : ℕ} (P Q : BlockVec d) : + blockVecDot P (blockVecFlipFlux Q) = blockVecDot (blockVecFlipFlux P) Q := by + rcases P with ⟨p, q⟩ + rcases Q with ⟨u, v⟩ + simp [blockVecFlipFlux, blockVecDot, vecDot_neg_left, vecDot_neg_right] + +private theorem isSymmetricBlockMat_blockMatFlipFlux {d : ℕ} {Abar : BlockMat d} + (hA : IsSymmetricBlockMat Abar) : + IsSymmetricBlockMat (blockMatFlipFlux Abar) := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatFlipFlux, blockMatEntry] using hA (Sum.inl i) (Sum.inl j) + | inr j => + simpa [blockMatFlipFlux, blockMatEntry] using congrArg Neg.neg (hA (Sum.inl i) (Sum.inr j)) + | inr i => + cases β with + | inl j => + simpa [blockMatFlipFlux, blockMatEntry] using congrArg Neg.neg (hA (Sum.inr i) (Sum.inl j)) + | inr j => + simpa [blockMatFlipFlux, blockMatEntry] using hA (Sum.inr i) (Sum.inr j) + +@[simp] theorem blockReflect_blockMatFlipFlux {d : ℕ} (A : BlockMat d) : + blockReflect (blockMatFlipFlux A) = blockMatFlipFlux (blockReflect A) := + rfl + +theorem isBlockMuAdmissible_flipFlux {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible U P X) : + IsBlockMuAdmissible U (blockVecFlipFlux P) X.flipFlux := by + rcases hX with ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [BlockState.flipFlux] using! hpotL2 + · simpa [IsBlockMuAdmissible, blockVecFlipFlux, BlockState.flipFlux] using hpot + · convert hsolL2.neg using 1 + funext x + simp [BlockState.flipFlux, blockVecFlipFlux, sub_eq_add_neg, add_comm] + · convert isSolenoidalZeroNormalTraceOn_smul hsol (-1 : ℝ) using 1 + funext x + simp [blockVecFlipFlux, BlockState.flipFlux, sub_eq_add_neg, add_comm] + +theorem blockEnergyDensity_adjointCoeffField_flipFlux {d : ℕ} + (a : CoeffField d) (X : BlockState d) (x : Vec d) : + blockEnergyDensity (adjointCoeffField a) X.flipFlux x = + blockEnergyDensity a X x := by + simpa [adjointCoeffField] using! + blockEnergyDensity_matTranspose_flipFlux (a := a) (X := X) (x := x) + +theorem volumeAverage_blockEnergyDensity_adjointCoeffField_flipFlux {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (X : BlockState d) : + volumeAverage U (blockEnergyDensity (adjointCoeffField a) X.flipFlux) = + volumeAverage U (blockEnergyDensity a X) := by + unfold volumeAverage + rw [show (∫ x in U, blockEnergyDensity (adjointCoeffField a) X.flipFlux x ∂MeasureTheory.volume) = + ∫ x in U, blockEnergyDensity a X x ∂MeasureTheory.volume by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + exact blockEnergyDensity_adjointCoeffField_flipFlux a X x] + +theorem muValueSet_adjointCoeffField_flipFlux {d : ℕ} + (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : + muValueSet U (blockVecFlipFlux P) (adjointCoeffField a) = muValueSet U P a := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X.flipFlux, ?_, ?_⟩ + · simpa using isBlockMuAdmissible_flipFlux + (U := U) (P := blockVecFlipFlux P) (X := X) hX + · calc + m = volumeAverage U (blockEnergyDensity (adjointCoeffField a) X) := hm + _ = volumeAverage U + (blockEnergyDensity (adjointCoeffField (adjointCoeffField a)) X.flipFlux) := by + symm + exact volumeAverage_blockEnergyDensity_adjointCoeffField_flipFlux + U (adjointCoeffField a) X + _ = volumeAverage U (blockEnergyDensity a X.flipFlux) := by simp + · rintro ⟨X, hX, hm⟩ + refine ⟨X.flipFlux, isBlockMuAdmissible_flipFlux (U := U) (P := P) (X := X) hX, ?_⟩ + calc + m = volumeAverage U (blockEnergyDensity a X) := hm + _ = volumeAverage U (blockEnergyDensity (adjointCoeffField a) X.flipFlux) := by + symm + exact volumeAverage_blockEnergyDensity_adjointCoeffField_flipFlux U a X + +theorem Mu_adjointCoeffField_flipFlux {d : ℕ} + (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : + Mu U (blockVecFlipFlux P) (adjointCoeffField a) = Mu U P a := by + rw [Mu, Mu, muValueSet_adjointCoeffField_flipFlux U P a] + +/-- The full-coordinate linear map flipping the flux half of a block vector. -/ +def fullBlockVecFlipFluxLinearMap {d : ℕ} : + FullBlockVec d →ₗ[ℝ] FullBlockVec d where + toFun x + | Sum.inl i => x (Sum.inl i) + | Sum.inr i => -x (Sum.inr i) + map_add' x y := by + funext α + cases α <;> simp [add_comm] + map_smul' c x := by + funext α + cases α <;> simp + +@[simp] theorem fullBlockVecFlipFluxLinearMap_toFullBlockVec {d : ℕ} (P : BlockVec d) : + fullBlockVecFlipFluxLinearMap (d := d) (toFullBlockVec P) = + toFullBlockVec (blockVecFlipFlux P) := by + funext α + cases α <;> rfl + +theorem hasQuadraticMu_adjointCoeffField {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hquad : HasQuadraticMu U a) : + HasQuadraticMu U (adjointCoeffField a) := by + rcases hquad with ⟨Q, hQ⟩ + refine ⟨Q.comp (fullBlockVecFlipFluxLinearMap (d := d)), ?_⟩ + intro P + calc + Mu U P (adjointCoeffField a) + = Mu U (blockVecFlipFlux P) a := by + simpa using Mu_adjointCoeffField_flipFlux U (blockVecFlipFlux P) a + _ = (1 / 2 : ℝ) * Q (toFullBlockVec (blockVecFlipFlux P)) := hQ (blockVecFlipFlux P) + _ = (1 / 2 : ℝ) * + (Q.comp (fullBlockVecFlipFluxLinearMap (d := d))) (toFullBlockVec P) := by + simp + +namespace IsCoarseBlockMatrix + +theorem adjointCoeffField_symm {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {Abar : BlockMat d} + (hA : IsCoarseBlockMatrix U a Abar) : + IsCoarseBlockMatrix U (Homogenization.adjointCoeffField a) (blockMatFlipFlux Abar) := by + rcases hA with ⟨hsymm, hmu⟩ + refine ⟨isSymmetricBlockMat_blockMatFlipFlux hsymm, ?_⟩ + intro P + have hMuP : + Mu U P (Homogenization.adjointCoeffField a) = Mu U (blockVecFlipFlux P) a := by + simpa using (Mu_adjointCoeffField_flipFlux U (blockVecFlipFlux P) a) + have hdot : + blockVecDot P (blockMatVecMul (blockMatFlipFlux Abar) P) = + blockVecDot (blockVecFlipFlux P) (blockMatVecMul Abar (blockVecFlipFlux P)) := by + rw [blockMatVecMul_blockMatFlipFlux] + exact blockVecDot_blockVecFlipFlux_right P (blockMatVecMul Abar (blockVecFlipFlux P)) + calc + Mu U P (Homogenization.adjointCoeffField a) + = Mu U (blockVecFlipFlux P) a := hMuP + _ = (1 / 2 : ℝ) * blockVecDot (blockVecFlipFlux P) + (blockMatVecMul Abar (blockVecFlipFlux P)) := hmu _ + _ = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (blockMatFlipFlux Abar) P) := by + rw [hdot] + +end IsCoarseBlockMatrix + +theorem coarseBlockMatrix_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + coarseBlockMatrix U (Homogenization.adjointCoeffField a) = + blockMatFlipFlux (coarseBlockMatrix U a) := by + rcases hex with ⟨Abar, hA⟩ + have hAadj := IsCoarseBlockMatrix.adjointCoeffField_symm (U := U) hA + calc + coarseBlockMatrix U (Homogenization.adjointCoeffField a) = blockMatFlipFlux Abar := by + symm + exact eq_coarseBlockMatrix_of_isCoarseBlockMatrix hAadj + _ = blockMatFlipFlux (coarseBlockMatrix U a) := by + rw [eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA] + +theorem coarseBlockMatrix_lowerLeft_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((coarseBlockMatrix U a).lowerLeft) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerLeft (coarseBlockMatrix_adjointCoeffField_of_exists (U := U) hex) + +theorem coarseBlockMatrix_upperLeft_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (coarseBlockMatrix U a).upperLeft := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperLeft (coarseBlockMatrix_adjointCoeffField_of_exists (U := U) hex) + +theorem coarseBlockMatrix_upperRight_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((coarseBlockMatrix U a).upperRight) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperRight (coarseBlockMatrix_adjointCoeffField_of_exists (U := U) hex) + +theorem coarseBlockMatrix_lowerRight_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (coarseBlockMatrix U a).lowerRight := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerRight (coarseBlockMatrix_adjointCoeffField_of_exists (U := U) hex) + +theorem coarseStarredBlockMatrixInv_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + coarseStarredBlockMatrixInv U (adjointCoeffField a) = + blockMatFlipFlux (coarseStarredBlockMatrixInv U a) := by + rw [coarseStarredBlockMatrixInv_eq_blockReflect, + coarseBlockMatrix_adjointCoeffField_of_exists (U := U) (a := a) hex, + blockReflect_blockMatFlipFlux, coarseStarredBlockMatrixInv_eq_blockReflect] + +theorem coarseStarredBlockMatrixInv_upperLeft_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).upperLeft = + (coarseStarredBlockMatrixInv U a).upperLeft := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperLeft + (coarseStarredBlockMatrixInv_adjointCoeffField_of_exists (U := U) (a := a) hex) + +theorem coarseStarredBlockMatrixInv_upperRight_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).upperRight = + -((coarseStarredBlockMatrixInv U a).upperRight) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperRight + (coarseStarredBlockMatrixInv_adjointCoeffField_of_exists (U := U) (a := a) hex) + +theorem coarseStarredBlockMatrixInv_lowerLeft_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).lowerLeft = + -((coarseStarredBlockMatrixInv U a).lowerLeft) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerLeft + (coarseStarredBlockMatrixInv_adjointCoeffField_of_exists (U := U) (a := a) hex) + +theorem coarseStarredBlockMatrixInv_lowerRight_adjointCoeffField_of_exists {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).lowerRight = + (coarseStarredBlockMatrixInv U a).lowerRight := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerRight + (coarseStarredBlockMatrixInv_adjointCoeffField_of_exists (U := U) (a := a) hex) + +/-- Generic-domain note-facing transpose compatibility for the canonical coarse +block matrix `\mathbf A(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + coarseBlockMatrix U (Homogenization.adjointCoeffField a) = + blockMatFlipFlux (coarseBlockMatrix U a) := by + exact coarseBlockMatrix_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the upper-left block +of `\mathbf A(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_upperLeft_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (coarseBlockMatrix U a).upperLeft := by + exact coarseBlockMatrix_upperLeft_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the upper-right block +of `\mathbf A(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_upperRight_adjointCoeffField_of_exists_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((coarseBlockMatrix U a).upperRight) := by + exact coarseBlockMatrix_upperRight_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the lower-left block +of `\mathbf A(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_lowerLeft_adjointCoeffField_of_exists_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((coarseBlockMatrix U a).lowerLeft) := by + exact coarseBlockMatrix_lowerLeft_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the lower-right block +of `\mathbf A(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_lowerRight_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (coarseBlockMatrix U a).lowerRight := by + exact coarseBlockMatrix_lowerRight_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the canonical +starred inverse block matrix `\mathbf A_*^{-1}(U; a)` packaged from recovery +data and ellipticity. -/ +theorem coarseStarredBlockMatrixInv_adjointCoeffField_of_exists_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + coarseStarredBlockMatrixInv U (adjointCoeffField a) = + blockMatFlipFlux (coarseStarredBlockMatrixInv U a) := by + exact coarseStarredBlockMatrixInv_adjointCoeffField_of_exists + (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the upper-left block +of `\mathbf A_*^{-1}(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseStarredBlockMatrixInv_upperLeft_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).upperLeft = + (coarseStarredBlockMatrixInv U a).upperLeft := by + exact coarseStarredBlockMatrixInv_upperLeft_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the upper-right +block of `\mathbf A_*^{-1}(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseStarredBlockMatrixInv_upperRight_adjointCoeffField_of_exists_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).upperRight = + -((coarseStarredBlockMatrixInv U a).upperRight) := by + exact coarseStarredBlockMatrixInv_upperRight_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the lower-left block +of `\mathbf A_*^{-1}(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseStarredBlockMatrixInv_lowerLeft_adjointCoeffField_of_exists_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).lowerLeft = + -((coarseStarredBlockMatrixInv U a).lowerLeft) := by + exact coarseStarredBlockMatrixInv_lowerLeft_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +/-- Generic-domain note-facing transpose compatibility for the lower-right +block of `\mathbf A_*^{-1}(U; a)` packaged from recovery data and ellipticity. -/ +theorem coarseStarredBlockMatrixInv_lowerRight_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (coarseStarredBlockMatrixInv U (adjointCoeffField a)).lowerRight = + (coarseStarredBlockMatrixInv U a).lowerRight := by + exact coarseStarredBlockMatrixInv_lowerRight_adjointCoeffField_of_exists (U := U) (a := a) + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) hEll hvol compat) + +theorem sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) : + sigmaStarInvCoarse U (adjointCoeffField a) = sigmaStarInvCoarse U a := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSAdj, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + +/-- Note-facing transpose compatibility for `\sigma_*^{-1}(U; a)` from primal +and adjoint `\sigma_*` witness data. -/ +theorem sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) : + sigmaStarInvCoarse U (adjointCoeffField a) = sigmaStarInvCoarse U a := + sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + (U := U) (a := a) hS hSAdj + +theorem sigmaStarCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hdet : IsUnit sigmaStar.det) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := by + rw [eq_sigmaStarCoarse_of_isSigmaStarCoarse hSAdj hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] + +/-- If the coefficient field is self-adjoint, then the lower-left block of the +canonical coarse block matrix vanishes. -/ +theorem coarseBlockMatrix_lowerLeft_eq_zero_of_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (hAdj : adjointCoeffField a = a) : + (coarseBlockMatrix U a).lowerLeft = 0 := by + have hLower : + (coarseBlockMatrix U a).lowerLeft = -((coarseBlockMatrix U a).lowerLeft) := by + simpa [hAdj] using + coarseBlockMatrix_lowerLeft_adjointCoeffField_of_exists_of_isEllipticFieldOn + (U := U) (a := a) R hEll hvol compat + ext i j + have hij : (coarseBlockMatrix U a).lowerLeft i j = -((coarseBlockMatrix U a).lowerLeft i j) := by + exact congrFun (congrFun hLower i) j + simpa using (CharZero.eq_neg_self_iff.mp hij) + +/-- If the coefficient field is self-adjoint, then the upper-right block of the +canonical coarse block matrix vanishes. -/ +theorem coarseBlockMatrix_upperRight_eq_zero_of_adjointCoeffField_eq_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (hAdj : adjointCoeffField a = a) : + (coarseBlockMatrix U a).upperRight = 0 := by + have hUpper : + (coarseBlockMatrix U a).upperRight = -((coarseBlockMatrix U a).upperRight) := by + simpa [hAdj] using + coarseBlockMatrix_upperRight_adjointCoeffField_of_exists_of_isEllipticFieldOn + (U := U) (a := a) R hEll hvol compat + ext i j + have hij : (coarseBlockMatrix U a).upperRight i j = -((coarseBlockMatrix U a).upperRight i j) := by + exact congrFun (congrFun hUpper i) j + simpa using (CharZero.eq_neg_self_iff.mp hij) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/EllipticWrappers.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/EllipticWrappers.lean new file mode 100644 index 0000000000..0ab5b00a92 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/EllipticWrappers.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences + +/-! # Elliptic Wrappers -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Adjoint symmetry -- elliptic no-`hdet` wrappers + +This file packages the witness-data adjoint-symmetry theorems under +recovery-plus-ellipticity hypotheses, so downstream users do not need to +thread `IsUnit sigmaStar.det` by hand. +-/ + +private theorem hdet_of_recovery_hodge + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + +theorem sigmaStarCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact sigmaStarCoarse_adjointCoeffField_eq_of_isSigmaStarData + (U := U) (a := a) hS hSAdj hdet + +theorem sigmaStarCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := + sigmaStarCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hSAdj + +theorem kappaCoarse_adjointCoeffField_eq_neg_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact kappaCoarse_adjointCoeffField_eq_neg_of_isKappaData + (U := U) (a := a) hS hK hSAdj hKAdj hdet + +theorem kappaCoarse_adjointCoeffField_eq_neg_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := + kappaCoarse_adjointCoeffField_eq_neg_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSAdj hKAdj + +theorem sigmaCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact sigmaCoarse_adjointCoeffField_eq_of_isSigmaData + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem sigmaCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := + sigmaCoarse_adjointCoeffField_eq_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma hSAdj hKAdj hSigmaAdj + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/SigmaAdjoint.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/SigmaAdjoint.lean new file mode 100644 index 0000000000..6bc5c7ed1e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/AdjointSymmetry/SigmaAdjoint.lean @@ -0,0 +1,582 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint + +/-! # Sigma Adjoint -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Adjoint symmetry -- sigma / kappa / deterministic coarse block adjoint + +sigmaStarCoarse / sigmaStarInvKappaCoarse / kappaCoarse / sigmaCoarse / +deterministicCoarseBlockMatrix / sigmaStarInvCoarse / sigmaStarInvKappaCoarse +equalities under adjointCoeffField, from isSigma / isKappa / isCoarseBlockMatrix +hypotheses and their witness-data variants. +-/ + +/-- Note-facing transpose compatibility for `\sigma_*(U; a)` from primal and +adjoint `\sigma_*` witness data. -/ +theorem sigmaStarCoarse_adjointCoeffField_eq_of_isSigmaStarData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hdet : IsUnit sigmaStar.det) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := + sigmaStarCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + (U := U) (a := a) hS hSAdj hdet + +theorem sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) : + sigmaStarInvKappaCoarse U (adjointCoeffField a) = -(sigmaStarInvKappaCoarse U a) := by + rw [sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hKAdj, + sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + simp + +/-- Note-facing transpose compatibility for `\sigma_*^{-1}(U; a)\kappa(U; a)` +from primal and adjoint `\kappa` witness data. -/ +theorem sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isKappaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) : + sigmaStarInvKappaCoarse U (adjointCoeffField a) = -(sigmaStarInvKappaCoarse U a) := + sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + (U := U) (a := a) hK hKAdj + +theorem kappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := by + rw [eq_kappaCoarse_of_isKappaCoarse hSAdj hKAdj hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + +/-- Note-facing transpose compatibility for `\kappa(U; a)` from primal and +adjoint `\sigma_*`/`\kappa` witness data. -/ +theorem kappaCoarse_adjointCoeffField_eq_neg_of_isKappaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := + kappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + (U := U) (a := a) hS hK hSAdj hKAdj hdet + +theorem sigmaCoarse_adjointCoeffField_eq_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hSAdj hKAdj hSigmaAdj hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] + +/-- Note-facing transpose compatibility for `\sigma(U; a)` from primal and +adjoint deterministic coarse-data witnesses. -/ +theorem sigmaCoarse_adjointCoeffField_eq_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := + sigmaCoarse_adjointCoeffField_eq_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + deterministicCoarseBlockMatrix U (adjointCoeffField a) = + blockMatFlipFlux (deterministicCoarseBlockMatrix U a) := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · ext i j + simp [deterministicCoarseBlockMatrix, blockMatFlipFlux, + sigmaCoarse_adjointCoeffField_eq_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet, + kappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + (U := U) (a := a) hS hK hSAdj hKAdj hdet, + sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + (U := U) (a := a) hS hSAdj, + Matrix.transpose_neg, matTranspose, Matrix.mul_assoc] + · ext i j + simp [deterministicCoarseBlockMatrix, blockMatFlipFlux, + kappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + (U := U) (a := a) hS hK hSAdj hKAdj hdet, + sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + (U := U) (a := a) hS hSAdj, + Matrix.transpose_neg, matTranspose, Matrix.mul_assoc] + · ext i j + simp [deterministicCoarseBlockMatrix, blockMatFlipFlux, + sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isKappaCoarse + (U := U) (a := a) hK hKAdj] + · ext i j + simp [deterministicCoarseBlockMatrix, blockMatFlipFlux, + sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarCoarse + (U := U) (a := a) hS hSAdj] + +/-- Note-facing transpose compatibility for the deterministic coarse block +matrix built from primal and adjoint scalar coarse-data witnesses. -/ +theorem deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + deterministicCoarseBlockMatrix U (adjointCoeffField a) = + blockMatFlipFlux (deterministicCoarseBlockMatrix U a) := + deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_eq_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (deterministicCoarseBlockMatrix U a).upperLeft := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperLeft + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet) + +/-- Note-facing transpose compatibility for the upper-left block of the +deterministic coarse block matrix from primal and adjoint scalar coarse-data +witnesses. -/ +theorem deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_eq_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (deterministicCoarseBlockMatrix U a).upperLeft := + deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_eq_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_eq_neg_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((deterministicCoarseBlockMatrix U a).upperRight) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperRight + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet) + +/-- Note-facing transpose compatibility for the upper-right block of the +deterministic coarse block matrix from primal and adjoint scalar coarse-data +witnesses. -/ +theorem deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_eq_neg_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((deterministicCoarseBlockMatrix U a).upperRight) := + deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_eq_neg_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_eq_neg_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((deterministicCoarseBlockMatrix U a).lowerLeft) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerLeft + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet) + +/-- Note-facing transpose compatibility for the lower-left block of the +deterministic coarse block matrix from primal and adjoint scalar coarse-data +witnesses. -/ +theorem deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_eq_neg_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((deterministicCoarseBlockMatrix U a).lowerLeft) := + deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_eq_neg_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_eq_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (deterministicCoarseBlockMatrix U a).lowerRight := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerRight + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet) + +/-- Note-facing transpose compatibility for the lower-right block of the +deterministic coarse block matrix from primal and adjoint scalar coarse-data +witnesses. -/ +theorem deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_eq_of_isSigmaData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (deterministicCoarseBlockMatrix U a).lowerRight := + deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_eq_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + deterministicCoarseBlockMatrix U (adjointCoeffField a) = + blockMatFlipFlux (deterministicCoarseBlockMatrix U a) := by + calc + deterministicCoarseBlockMatrix U (adjointCoeffField a) = + coarseBlockMatrix U (adjointCoeffField a) := by + symm + exact coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hAadj + _ = blockMatFlipFlux (coarseBlockMatrix U a) := by + exact coarseBlockMatrix_adjointCoeffField_of_exists + (U := U) (a := a) ⟨deterministicCoarseBlockMatrix U a, hA⟩ + _ = blockMatFlipFlux (deterministicCoarseBlockMatrix U a) := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + +/-- Note-facing transpose compatibility for the deterministic coarse block +matrix built from the canonical coarse data. -/ +theorem deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + deterministicCoarseBlockMatrix U (adjointCoeffField a) = + blockMatFlipFlux (deterministicCoarseBlockMatrix U a) := + deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +theorem deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (deterministicCoarseBlockMatrix U a).upperLeft := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperLeft + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj) + +/-- Note-facing transpose compatibility for the upper-left block of the +deterministic coarse block matrix. -/ +theorem deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_eq {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperLeft = + (deterministicCoarseBlockMatrix U a).upperLeft := + deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +theorem deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((deterministicCoarseBlockMatrix U a).upperRight) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.upperRight + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj) + +/-- Note-facing transpose compatibility for the upper-right block of the +deterministic coarse block matrix. -/ +theorem deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_eq_neg {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).upperRight = + -((deterministicCoarseBlockMatrix U a).upperRight) := + deterministicCoarseBlockMatrix_upperRight_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +theorem deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((deterministicCoarseBlockMatrix U a).lowerLeft) := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerLeft + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj) + +/-- Note-facing transpose compatibility for the lower-left block of the +deterministic coarse block matrix. -/ +theorem deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_eq_neg {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerLeft = + -((deterministicCoarseBlockMatrix U a).lowerLeft) := + deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +theorem deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (deterministicCoarseBlockMatrix U a).lowerRight := by + simpa [blockMatFlipFlux] using + congrArg BlockMat.lowerRight + (deterministicCoarseBlockMatrix_adjointCoeffField_eq_blockMatFlipFlux_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj) + +/-- Note-facing transpose compatibility for the lower-right block of the +deterministic coarse block matrix. -/ +theorem deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_eq {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + (deterministicCoarseBlockMatrix U (adjointCoeffField a)).lowerRight = + (deterministicCoarseBlockMatrix U a).lowerRight := + deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +theorem sigmaStarInvCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + sigmaStarInvCoarse U (adjointCoeffField a) = sigmaStarInvCoarse U a := by + simpa using + deterministicCoarseBlockMatrix_lowerRight_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +/-- Note-facing transpose compatibility for `\sigma_*^{-1}(U; a)`. -/ +theorem sigmaStarInvCoarse_adjointCoeffField_eq {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) : + sigmaStarInvCoarse U (adjointCoeffField a) = sigmaStarInvCoarse U a := + sigmaStarInvCoarse_adjointCoeffField_eq_of_isSigmaStarData + (U := U) (a := a) hS hSAdj + +theorem sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + sigmaStarInvKappaCoarse U (adjointCoeffField a) = -(sigmaStarInvKappaCoarse U a) := by + have hlower : + -(sigmaStarInvKappaCoarse U (adjointCoeffField a)) = + sigmaStarInvKappaCoarse U a := by + simpa using + deterministicCoarseBlockMatrix_lowerLeft_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + have hneg := congrArg Neg.neg hlower + simpa using hneg + +/-- Note-facing transpose compatibility for `\sigma_*^{-1}(U; a)\kappa(U; a)`. -/ +theorem sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + sigmaStarInvKappaCoarse U (adjointCoeffField a) = -(sigmaStarInvKappaCoarse U a) := + sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + +/-- If the coefficient field is self-adjoint, then the canonical +`\sigma_*^{-1}(U; a)\kappa(U; a)` vanishes once the deterministic coarse block +matrix is identified as coarse. -/ +theorem sigmaStarInvKappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAdj : adjointCoeffField a = a) : + sigmaStarInvKappaCoarse U a = 0 := by + have hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a)) := by + simpa [hAdj] using hA + have hneg : + sigmaStarInvKappaCoarse U a = -(sigmaStarInvKappaCoarse U a) := by + simpa [hAdj] using + sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + ext i j + have hij : sigmaStarInvKappaCoarse U a i j = -(sigmaStarInvKappaCoarse U a i j) := by + exact congrFun (congrFun hneg i) j + simpa using (CharZero.eq_neg_self_iff.mp hij) + +theorem sigmaStarCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := by + unfold sigmaStarCoarse + simpa using + congrArg Inv.inv + (sigmaStarInvCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj) + +/-- Note-facing transpose compatibility for `\sigma_*(U; a)`. -/ +theorem sigmaStarCoarse_adjointCoeffField_eq {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hdet : IsUnit sigmaStar.det) : + sigmaStarCoarse U (adjointCoeffField a) = sigmaStarCoarse U a := + sigmaStarCoarse_adjointCoeffField_eq_of_isSigmaStarData + (U := U) (a := a) hS hSAdj hdet + +theorem kappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := by + unfold kappaCoarse + rw [sigmaStarCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix (U := U) (a := a) hA hAadj, + sigmaStarInvKappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj] + simp [mul_neg] + +/-- Note-facing transpose compatibility for `\kappa(U; a)`. -/ +theorem kappaCoarse_adjointCoeffField_eq_neg {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + kappaCoarse U (adjointCoeffField a) = -(kappaCoarse U a) := + kappaCoarse_adjointCoeffField_eq_neg_of_isKappaData + (U := U) (a := a) hS hK hSAdj hKAdj hdet + +/-- If the coefficient field is self-adjoint, then the canonical +`\kappa(U; a)` vanishes once the deterministic coarse block matrix is +identified as coarse. -/ +theorem kappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAdj : adjointCoeffField a = a) : + kappaCoarse U a = 0 := by + unfold kappaCoarse + simp [sigmaStarInvKappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAdj] + +theorem sigmaCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hAadj : IsCoarseBlockMatrix U (adjointCoeffField a) + (deterministicCoarseBlockMatrix U (adjointCoeffField a))) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := by + have hupper : + sigmaCoarse U (adjointCoeffField a) + + (matTranspose (kappaCoarse U (adjointCoeffField a))) * + sigmaStarInvCoarse U (adjointCoeffField a) * + kappaCoarse U (adjointCoeffField a) = + sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a := by + simpa using + deterministicCoarseBlockMatrix_upperLeft_adjointCoeffField_of_isCoarseBlockMatrix + (U := U) (a := a) hA hAadj + rw [kappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix (U := U) (a := a) hA hAadj, + sigmaStarInvCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix (U := U) (a := a) hA hAadj] at hupper + simp [Matrix.transpose_neg, matTranspose, Matrix.mul_assoc] at hupper + exact hupper + +/-- Note-facing transpose compatibility for `\sigma(U; a)`. -/ +theorem sigmaCoarse_adjointCoeffField_eq {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + sigmaCoarse U (adjointCoeffField a) = sigmaCoarse U a := + sigmaCoarse_adjointCoeffField_eq_of_isSigmaData + (U := U) (a := a) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism.lean new file mode 100644 index 0000000000..41d1a50c38 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Structures +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.MatrixIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Properties + +/-! +# Block formalism (aggregate re-export) + +Previously a 1298-line monolithic module; now split along thematic +boundaries into the four files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/EllipticBounds.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/EllipticBounds.lean new file mode 100644 index 0000000000..c454a4bc4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/EllipticBounds.lean @@ -0,0 +1,666 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.MatrixIdentities + +/-! # Elliptic Bounds -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Block formalism -- symmetric and elliptic matrix bounds + +Symmetric block-matrix identities, symmPartInv lower / upper bound and +positivity under IsEllipticMatrix, blockMatrixOfCoeff_half_quadratic_ge_vecDot, +blockMatrixOfCoeff_quadratic positivity / lower / upper / plainUpperBound, +coercivity, and the image bounds used by the response functional. +-/ + +theorem blockMatrixOfCoeff_upperLeft_isSymm {d : ℕ} (A : Mat d) : + matTranspose (blockMatrixOfCoeff A).upperLeft = (blockMatrixOfCoeff A).upperLeft := by + change + Matrix.transpose + (symmPart A + matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A) = + symmPart A + matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A + rw [Matrix.transpose_add, Matrix.transpose_mul, Matrix.transpose_mul, + Matrix.transpose_nonsing_inv] + rw [show Matrix.transpose (symmPart A) = symmPart A by + simpa [matTranspose] using (matTranspose_symmPart A)] + simp [matTranspose, Matrix.mul_assoc] + +theorem blockMatrixOfCoeff_upperRight_transpose {d : ℕ} (A : Mat d) : + matTranspose (blockMatrixOfCoeff A).upperRight = (blockMatrixOfCoeff A).lowerLeft := by + change Matrix.transpose (-((matTranspose (skewPart A)) * (symmPart A)⁻¹)) = + -((symmPart A)⁻¹ * skewPart A) + rw [Matrix.transpose_neg, Matrix.transpose_mul, Matrix.transpose_nonsing_inv] + rw [show Matrix.transpose (symmPart A) = symmPart A by + simpa [matTranspose] using (matTranspose_symmPart A)] + simp [matTranspose] + +theorem blockMatrixOfCoeff_lowerRight_isSymm {d : ℕ} (A : Mat d) : + matTranspose (blockMatrixOfCoeff A).lowerRight = (blockMatrixOfCoeff A).lowerRight := by + change Matrix.transpose ((symmPart A)⁻¹) = (symmPart A)⁻¹ + rw [Matrix.transpose_nonsing_inv] + rw [show Matrix.transpose (symmPart A) = symmPart A by + simpa [matTranspose] using (matTranspose_symmPart A)] + +theorem isSymm_toFullBlockMat_of_isSymmetricBlockMat {d : ℕ} {B : BlockMat d} + (hB : IsSymmetricBlockMat B) : (toFullBlockMat B).IsSymm := by + refine Matrix.IsSymm.ext ?_ + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [toFullBlockMat, blockMatEntry] using (hB (Sum.inl i) (Sum.inl j)).symm + | inr j => + simpa [toFullBlockMat, blockMatEntry] using (hB (Sum.inl i) (Sum.inr j)).symm + | inr i => + cases β with + | inl j => + simpa [toFullBlockMat, blockMatEntry] using (hB (Sum.inr i) (Sum.inl j)).symm + | inr j => + simpa [toFullBlockMat, blockMatEntry] using (hB (Sum.inr i) (Sum.inr j)).symm + +theorem blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat {d : ℕ} {B : BlockMat d} + (hB : IsSymmetricBlockMat B) (X Y : BlockVec d) : + blockVecDot X (blockMatVecMul B Y) = blockVecDot Y (blockMatVecMul B X) := by + let M := toFullBlockMat B + have hM : M.IsSymm := by + simpa [M] using isSymm_toFullBlockMat_of_isSymmetricBlockMat hB + calc + blockVecDot X (blockMatVecMul B Y) + = dotProduct (toFullBlockVec X) (Matrix.mulVec M (toFullBlockVec Y)) := by + rw [← dotProduct_toFullBlockVec X (blockMatVecMul B Y)] + simp [M, toFullBlockVec_blockMatVecMul] + _ = dotProduct (Matrix.vecMul (toFullBlockVec X) M) (toFullBlockVec Y) := by + rw [Matrix.dotProduct_mulVec] + _ = dotProduct (Matrix.vecMul (toFullBlockVec X) (Matrix.transpose M)) (toFullBlockVec Y) := by + rw [hM.eq] + _ = dotProduct (Matrix.mulVec M (toFullBlockVec X)) (toFullBlockVec Y) := by + have hvecT : + Matrix.vecMul (toFullBlockVec X) (Matrix.transpose M) = + Matrix.mulVec M (toFullBlockVec X) := by + simpa using (Matrix.vecMul_transpose M (toFullBlockVec X)) + rw [hvecT] + _ = dotProduct (toFullBlockVec Y) (Matrix.mulVec M (toFullBlockVec X)) := by + rw [dotProduct_comm] + _ = blockVecDot Y (blockMatVecMul B X) := by + rw [← toFullBlockVec_blockMatVecMul B X, dotProduct_toFullBlockVec] + +theorem isSymmetricBlockMat_blockMatrixOfCoeff {d : ℕ} (A : Mat d) : + IsSymmetricBlockMat (blockMatrixOfCoeff A) := by + intro α β + cases α with + | inl i => + cases β with + | inl j => + have h := congrArg (fun M => M i j) (blockMatrixOfCoeff_upperLeft_isSymm A) + simpa [matTranspose, blockMatEntry, blockMatrixOfCoeff] using h.symm + | inr j => + have h := congrArg (fun M => M j i) (blockMatrixOfCoeff_upperRight_transpose A) + simpa [matTranspose, blockMatEntry, blockMatrixOfCoeff] using h + | inr i => + cases β with + | inl j => + have h := congrArg (fun M => M i j) (blockMatrixOfCoeff_upperRight_transpose A) + simpa [matTranspose, blockMatEntry, blockMatrixOfCoeff] using h.symm + | inr j => + have h := congrArg (fun M => M i j) (blockMatrixOfCoeff_lowerRight_isSymm A) + simpa [matTranspose, blockMatEntry, blockMatrixOfCoeff] using h.symm + +theorem blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm {d : ℕ} (A : Mat d) + (X Y : BlockVec d) : + blockVecDot X (blockMatVecMul (blockMatrixOfCoeff A) Y) = + blockVecDot Y (blockMatVecMul (blockMatrixOfCoeff A) X) := + blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat + (isSymmetricBlockMat_blockMatrixOfCoeff A) X Y + +theorem isUnit_symmPart_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : IsUnit (symmPart A) := by + exact ((symmPart A).isUnit_iff_isUnit_det).mpr + (isUnit_det_symmPart_of_isEllipticMatrix hA) + +theorem symmPart_inv_nonneg_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + 0 ≤ vecDot ξ (matVecMul ((symmPart A)⁻¹) ξ) := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hηnonneg : 0 ≤ vecNormSq η := vecNormSq_nonneg η + have hξη_nonneg : 0 ≤ vecDot ξ η := by + exact (mul_nonneg hlam_pos.le hηnonneg).trans hmain + simpa [η] using hξη_nonneg + +theorem lowerBound_symmPartInv_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + (lam * (Lam⁻¹ * Lam⁻¹)) * vecNormSq ξ ≤ + vecDot ξ (matVecMul ((symmPart A)⁻¹) ξ) := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hηupper : vecNormSq ξ ≤ Lam ^ 2 * vecNormSq η := by + simpa [s, η, hsη] using vecNormSq_matVecMul_symmPart_le_of_isEllipticMatrix hA η + have hηlower : (Lam⁻¹ * Lam⁻¹) * vecNormSq ξ ≤ vecNormSq η := by + rcases hA with ⟨hlam_pos, hlamLam, -, -⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hLamInvSq_nonneg : 0 ≤ Lam⁻¹ * Lam⁻¹ := by + positivity + have hmul : + (Lam⁻¹ * Lam⁻¹) * vecNormSq ξ ≤ + (Lam⁻¹ * Lam⁻¹) * (Lam ^ 2 * vecNormSq η) := by + exact mul_le_mul_of_nonneg_left hηupper hLamInvSq_nonneg + have hcancel : (Lam⁻¹ * Lam⁻¹) * (Lam ^ 2 * vecNormSq η) = vecNormSq η := by + field_simp [hLam_pos.ne'] + calc + (Lam⁻¹ * Lam⁻¹) * vecNormSq ξ ≤ (Lam⁻¹ * Lam⁻¹) * (Lam ^ 2 * vecNormSq η) := hmul + _ = vecNormSq η := hcancel + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hscaled : + lam * ((Lam⁻¹ * Lam⁻¹) * vecNormSq ξ) ≤ lam * vecNormSq η := by + exact mul_le_mul_of_nonneg_left hηlower (le_of_lt hlam_pos) + have hfinal : (lam * (Lam⁻¹ * Lam⁻¹)) * vecNormSq ξ ≤ vecDot ξ η := by + calc + (lam * (Lam⁻¹ * Lam⁻¹)) * vecNormSq ξ + = lam * ((Lam⁻¹ * Lam⁻¹) * vecNormSq ξ) := by ring + _ ≤ lam * vecNormSq η := hscaled + _ ≤ vecDot ξ η := hmain + simpa [η] using hfinal + +theorem vecNormSq_matVecMul_symmPartInv_le_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecNormSq (matVecMul ((symmPart A)⁻¹) ξ) ≤ + (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + have hCS : + vecDot ξ η ^ 2 ≤ vecNormSq ξ * vecNormSq η := + sq_vecDot_le_vecNormSq_mul_vecNormSq ξ η + have hξη_nonneg : 0 ≤ vecDot ξ η := symmPart_inv_nonneg_of_isEllipticMatrix hA ξ + rcases hA with ⟨hlam_pos, -, -, -⟩ + by_cases hη0 : vecNormSq η = 0 + · rw [hη0] + have hlam_inv_sq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := by + positivity + nlinarith [hlam_inv_sq_nonneg, vecNormSq_nonneg ξ] + · have hηpos : 0 < vecNormSq η := by + exact lt_of_le_of_ne (vecNormSq_nonneg η) (by simpa [eq_comm] using hη0) + have hsq : (lam * vecNormSq η) ^ 2 ≤ vecNormSq ξ * vecNormSq η := by + have hsq' : (lam * vecNormSq η) ^ 2 ≤ vecDot ξ η ^ 2 := by + have hlam_nonneg : 0 ≤ lam := le_of_lt hlam_pos + have hlamη_nonneg : 0 ≤ lam * vecNormSq η := mul_nonneg hlam_nonneg (vecNormSq_nonneg η) + nlinarith [hmain, hξη_nonneg, hlamη_nonneg] + exact le_trans hsq' hCS + have hlam_sq_bound : lam ^ 2 * vecNormSq η ≤ vecNormSq ξ := by + nlinarith [hsq, hηpos, le_of_lt hlam_pos] + have hlam_inv_sq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := by + positivity + have hmul : + (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) ≤ + (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + exact mul_le_mul_of_nonneg_left hlam_sq_bound hlam_inv_sq_nonneg + have hcancel : (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) = vecNormSq η := by + field_simp [hlam_pos.ne'] + calc + vecNormSq (matVecMul ((symmPart A)⁻¹) ξ) = vecNormSq η := by + rfl + _ = (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) := by + exact hcancel.symm + _ ≤ (lam⁻¹ * lam⁻¹) * vecNormSq ξ := hmul + +theorem symmPart_inv_upperBound_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + vecDot ξ (matVecMul ((symmPart A)⁻¹) ξ) ≤ lam⁻¹ * vecNormSq ξ := by + let s := symmPart A + let η := matVecMul s⁻¹ ξ + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = ξ := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot ξ η := by + simpa [s, η, hsη, vecDot_comm] using hlower + have hCS : + vecDot ξ η ^ 2 ≤ vecNormSq ξ * vecNormSq η := + sq_vecDot_le_vecNormSq_mul_vecNormSq ξ η + have hξη_nonneg : 0 ≤ vecDot ξ η := symmPart_inv_nonneg_of_isEllipticMatrix hA ξ + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hηbound : vecNormSq η ≤ (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + by_cases hη0 : vecNormSq η = 0 + · rw [hη0] + have hlam_inv_nonneg : 0 ≤ lam⁻¹ := by positivity + nlinarith [hlam_inv_nonneg, vecNormSq_nonneg ξ] + · have hηpos : 0 < vecNormSq η := by + exact lt_of_le_of_ne (vecNormSq_nonneg η) (by simpa [eq_comm] using hη0) + have hsq : (lam * vecNormSq η) ^ 2 ≤ vecNormSq ξ * vecNormSq η := by + have hsq' : (lam * vecNormSq η) ^ 2 ≤ vecDot ξ η ^ 2 := by + have hlam_nonneg : 0 ≤ lam := le_of_lt hlam_pos + have hlamη_nonneg : 0 ≤ lam * vecNormSq η := mul_nonneg hlam_nonneg (vecNormSq_nonneg η) + nlinarith [hmain, hξη_nonneg, hlamη_nonneg] + exact le_trans hsq' hCS + have hξnonneg : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + have hlam_sq_bound : lam ^ 2 * vecNormSq η ≤ vecNormSq ξ := by + nlinarith [hsq, hηpos, le_of_lt hlam_pos] + have hlam_inv_sq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := by + positivity + have hmul : + (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) ≤ + (lam⁻¹ * lam⁻¹) * vecNormSq ξ := by + exact mul_le_mul_of_nonneg_left hlam_sq_bound hlam_inv_sq_nonneg + have hcancel : (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) = vecNormSq η := by + field_simp [hlam_pos.ne'] + calc + vecNormSq η = (lam⁻¹ * lam⁻¹) * (lam ^ 2 * vecNormSq η) := by + exact hcancel.symm + _ ≤ (lam⁻¹ * lam⁻¹) * vecNormSq ξ := hmul + have hmainSq : vecDot ξ η ^ 2 ≤ (lam⁻¹ * vecNormSq ξ) ^ 2 := by + have hmul : + vecNormSq ξ * vecNormSq η ≤ vecNormSq ξ * (((lam⁻¹ * lam⁻¹) * vecNormSq ξ)) := by + exact mul_le_mul_of_nonneg_left hηbound (vecNormSq_nonneg ξ) + have hsq := le_trans hCS hmul + nlinarith + have hright_nonneg : 0 ≤ lam⁻¹ * vecNormSq ξ := by + have hlam_inv_nonneg : 0 ≤ lam⁻¹ := by positivity + exact mul_nonneg hlam_inv_nonneg (vecNormSq_nonneg ξ) + have habs : |vecDot ξ η| ≤ |lam⁻¹ * vecNormSq ξ| := by + exact sq_le_sq.mp hmainSq + have hleft_abs : |vecDot ξ η| = vecDot ξ η := abs_of_nonneg hξη_nonneg + have hright_abs : |lam⁻¹ * vecNormSq ξ| = lam⁻¹ * vecNormSq ξ := + abs_of_nonneg hright_nonneg + simpa [η] using (show vecDot ξ η ≤ lam⁻¹ * vecNormSq ξ by nlinarith [habs, hleft_abs, hright_abs]) + +theorem vecDot_matVecMul_skewPart_self_eq_zero {d : ℕ} (A : Mat d) (p : Vec d) : + vecDot p (matVecMul (skewPart A) p) = 0 := by + have htranspose : + vecDot p (matVecMul (matTranspose (skewPart A)) p) = + vecDot p (matVecMul (skewPart A) p) := by + rw [vecDot_matVecMul_transpose] + rw [vecDot_comm] + have hneg : + vecDot p (matVecMul (skewPart A) p) = + -vecDot p (matVecMul (skewPart A) p) := by + calc + vecDot p (matVecMul (skewPart A) p) + = vecDot p (matVecMul (matTranspose (skewPart A)) p) := by + exact htranspose.symm + _ = vecDot p (matVecMul (-skewPart A) p) := by + rw [matTranspose_skewPart] + _ = -vecDot p (matVecMul (skewPart A) p) := by + rw [neg_matVecMul, vecDot_neg_right] + linarith + +theorem blockMatrixOfCoeff_half_quadratic_ge_vecDot_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + vecDot p q ≤ + (1 / 2 : ℝ) * blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + let s := symmPart A + let r := q - matVecMul (skewPart A) p + let η := matVecMul s⁻¹ r + have hs : IsUnit s := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit s.det := (Matrix.isUnit_iff_isUnit_det (A := s)).mp hs + have hsη : matVecMul s η = r := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv s hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hp_nonneg : 0 ≤ vecDot p (matVecMul s p) := by + have hp_lower := lowerBound_symmPart_of_isEllipticMatrix hA p + rcases hA with ⟨hlam_pos, -, -, -⟩ + exact (mul_nonneg hlam_pos.le (vecNormSq_nonneg p)).trans hp_lower + have hr_nonneg : 0 ≤ vecDot r (matVecMul s⁻¹ r) := by + simpa [s] using symmPart_inv_nonneg_of_isEllipticMatrix hA r + have hsq : + vecDot p r ^ 2 ≤ + vecDot p (matVecMul s p) * vecDot r (matVecMul s⁻¹ r) := by + have hsymm : + vecDot p (matVecMul s η) ^ 2 ≤ + vecDot p (matVecMul s p) * vecDot η (matVecMul s η) := by + simpa [s] using sq_vecDot_matVecMul_symmPart_le_of_isEllipticMatrix hA p η + simpa [η, hsη, vecDot_comm] using hsymm + have hyoung : + 2 * vecDot p r ≤ vecDot p (matVecMul s p) + vecDot r (matVecMul s⁻¹ r) := by + have hsq_nonneg : + 0 ≤ (vecDot p (matVecMul s p) - vecDot r (matVecMul s⁻¹ r)) ^ 2 := by + positivity + nlinarith + have hpair : vecDot p q = vecDot p r := by + dsimp [r] + rw [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, + vecDot_matVecMul_skewPart_self_eq_zero] + ring + calc + vecDot p q = vecDot p r := hpair + _ ≤ (1 / 2 : ℝ) * (vecDot p (matVecMul s p) + vecDot r (matVecMul s⁻¹ r)) := by + nlinarith + _ = + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + rw [blockMatrixOfCoeff_quadratic_eq] + +theorem blockMatrixOfCoeff_quadratic_pos_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} {p q : Vec d} (hA : IsEllipticMatrix lam Lam A) (hpq : (p, q) ≠ 0) : + 0 < blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + let r := q - matVecMul (skewPart A) p + rw [blockMatrixOfCoeff_quadratic_eq] + by_cases hp : p = 0 + · have hq : q ≠ 0 := by + intro hq0 + apply hpq + ext <;> simp [hp, hq0] + have hr : r = q := by + simp [r, hp, matVecMul_zero] + have hqnorm : 0 < vecNormSq q := by + have hqnorm_ne : vecNormSq q ≠ 0 := by + intro hqnorm0 + apply hq + exact vecNormSq_eq_zero hqnorm0 + exact lt_of_le_of_ne (vecNormSq_nonneg q) (by simpa [eq_comm] using hqnorm_ne) + have hterm_pos : + 0 < vecDot q (matVecMul ((symmPart A)⁻¹) q) := by + have hlam_pos : 0 < lam := hA.1 + let η := matVecMul ((symmPart A)⁻¹) q + have hs : IsUnit (symmPart A) := isUnit_symmPart_of_isEllipticMatrix hA + have hsdet : IsUnit (symmPart A).det := + (Matrix.isUnit_iff_isUnit_det (A := symmPart A)).mp hs + have hsη : matVecMul (symmPart A) η = q := by + dsimp [η] + rw [matVecMul_mul, Matrix.mul_nonsing_inv (symmPart A) hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hηne : η ≠ 0 := by + intro hη0 + apply hq + simpa [η, hη0, matVecMul_zero] using hsη.symm + have hηnorm_pos : 0 < vecNormSq η := by + have hηnorm_ne : vecNormSq η ≠ 0 := by + intro hηnorm0 + apply hηne + exact vecNormSq_eq_zero hηnorm0 + exact lt_of_le_of_ne (vecNormSq_nonneg η) (by simpa [eq_comm] using hηnorm_ne) + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hmain : lam * vecNormSq η ≤ vecDot q η := by + simpa [η, hsη, vecDot_comm] using hlower + exact lt_of_lt_of_le (mul_pos hlam_pos hηnorm_pos) hmain + simpa [hp, hr, matVecMul_zero, vecDot_zero_left] using hterm_pos + · have hpnorm : 0 < vecNormSq p := by + have hpnorm_ne : vecNormSq p ≠ 0 := by + intro hpnorm0 + apply hp + exact vecNormSq_eq_zero hpnorm0 + exact lt_of_le_of_ne (vecNormSq_nonneg p) (by simpa [eq_comm] using hpnorm_ne) + have hpterm := + lowerBound_symmPart_of_isEllipticMatrix hA p + have hrterm_nonneg := + symmPart_inv_nonneg_of_isEllipticMatrix hA r + rcases hA with ⟨hlam_pos, -, -, -⟩ + have hpterm_pos : 0 < vecDot p (matVecMul (symmPart A) p) := by + exact lt_of_lt_of_le (mul_pos hlam_pos hpnorm) hpterm + nlinarith [blockMatrixOfCoeff_quadratic_eq (A := A) (p := p) (q := q), hpterm_pos, + hrterm_nonneg] + +theorem blockMatrixOfCoeff_quadratic_lowerBound_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (p, q) (p, q) ≤ + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + let r := q - matVecMul (skewPart A) p + let kp := matVecMul (skewPart A) p + have hpterm := lowerBound_symmPart_of_isEllipticMatrix hA p + have hrterm := lowerBound_symmPartInv_of_isEllipticMatrix hA r + have hqbound : + vecNormSq q ≤ 2 * vecNormSq r + 2 * Lam ^ 2 * vecNormSq p := by + have hqeq : q = r + kp := by + simp [r, kp, sub_eq_add_neg, add_assoc] + have hsub : vecNormSq q ≤ 2 * (vecNormSq r + vecNormSq kp) := by + rw [hqeq] + exact vecNormSq_add_le r kp + have hskew := vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix hA p + nlinarith + have hnorm : + blockVecDot (p, q) (p, q) ≤ (1 + 2 * Lam ^ 2) * vecNormSq p + 2 * vecNormSq r := by + change vecNormSq p + vecNormSq q ≤ (1 + 2 * Lam ^ 2) * vecNormSq p + 2 * vecNormSq r + nlinarith + let c : ℝ := lam / (1 + 2 * Lam ^ 2) + have hc_nonneg : 0 ≤ c := by + rcases hA with ⟨hlam_pos, -, -, -⟩ + dsimp [c] + positivity + have hc_p : c * ((1 + 2 * Lam ^ 2) * vecNormSq p) = lam * vecNormSq p := by + rcases hA with ⟨hlam_pos, hlamLam, -, -⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hden_ne : 1 + 2 * Lam ^ 2 ≠ 0 := by + nlinarith [sq_nonneg Lam] + dsimp [c] + field_simp [hden_ne] + have hc_r : 2 * c ≤ lam * (Lam⁻¹ * Lam⁻¹) := by + rcases hA with ⟨hlam_pos, hlamLam, -, -⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + have hden_ne : 1 + 2 * Lam ^ 2 ≠ 0 := by + nlinarith [sq_nonneg Lam] + dsimp [c] + field_simp [hLam_pos.ne', hden_ne] + nlinarith [sq_nonneg Lam] + have hscaled : + c * blockVecDot (p, q) (p, q) ≤ + c * ((1 + 2 * Lam ^ 2) * vecNormSq p + 2 * vecNormSq r) := by + exact mul_le_mul_of_nonneg_left hnorm hc_nonneg + calc + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (p, q) (p, q) + = c * blockVecDot (p, q) (p, q) := by rfl + _ ≤ c * ((1 + 2 * Lam ^ 2) * vecNormSq p + 2 * vecNormSq r) := hscaled + _ = lam * vecNormSq p + 2 * c * vecNormSq r := by + rw [mul_add, hc_p] + ring + _ ≤ lam * vecNormSq p + (lam * (Lam⁻¹ * Lam⁻¹)) * vecNormSq r := by + have hr_nonneg : 0 ≤ vecNormSq r := vecNormSq_nonneg r + nlinarith + _ ≤ blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + rw [blockMatrixOfCoeff_quadratic_eq] + nlinarith + +theorem blockMatrixOfCoeff_coercive_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (X : BlockVec d) : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot X X ≤ + blockVecDot X (blockMatVecMul (blockMatrixOfCoeff A) X) := by + rcases X with ⟨p, q⟩ + simpa using blockMatrixOfCoeff_quadratic_lowerBound_of_isEllipticMatrix hA p q + +theorem blockMatrixOfCoeff_quadratic_upperBound_of_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} + {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) ≤ + Lam * vecNormSq p + lam⁻¹ * vecNormSq (q - matVecMul (skewPart A) p) := by + rw [blockMatrixOfCoeff_quadratic_eq] + have hpterm := upperBound_symmPart_of_isEllipticMatrix hA p + have hqterm := + symmPart_inv_upperBound_of_isEllipticMatrix hA + (q - matVecMul (skewPart A) p) + linarith + +theorem blockMatrixOfCoeff_quadratic_plainUpperBound_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) ≤ + (Lam + 2 * lam⁻¹ * Lam ^ 2) * vecNormSq p + 2 * lam⁻¹ * vecNormSq q := by + have hupper := blockMatrixOfCoeff_quadratic_upperBound_of_isEllipticMatrix hA p q + have hsub : + vecNormSq (q - matVecMul (skewPart A) p) ≤ + 2 * (vecNormSq q + vecNormSq (matVecMul (skewPart A) p)) := + vecNormSq_sub_le q (matVecMul (skewPart A) p) + have hskew := + vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix hA p + have hshift : + lam⁻¹ * vecNormSq (q - matVecMul (skewPart A) p) ≤ + lam⁻¹ * (2 * (vecNormSq q + vecNormSq (matVecMul (skewPart A) p))) := by + have hlam_pos : 0 < lam := hA.1 + have hlam_nonneg : 0 ≤ lam⁻¹ := by + positivity + exact mul_le_mul_of_nonneg_left hsub hlam_nonneg + have hshift' : + lam⁻¹ * vecNormSq (q - matVecMul (skewPart A) p) ≤ + 2 * lam⁻¹ * vecNormSq q + 2 * lam⁻¹ * Lam ^ 2 * vecNormSq p := by + have hlam_pos : 0 < lam := hA.1 + have hlam_nonneg : 0 ≤ lam⁻¹ := by + positivity + nlinarith [hskew, vecNormSq_nonneg q, vecNormSq_nonneg p, hlam_nonneg] + linarith + +theorem blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + q = + matVecMul (symmPart A) ((blockMatVecMul (blockMatrixOfCoeff A) (p, q)).2) + + matVecMul (skewPart A) p := by + rw [blockMatVecMul_blockMatrixOfCoeff_snd] + have hsInvMul : + matVecMul (symmPart A) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) = + q - matVecMul (skewPart A) p := by + rw [matVecMul_mul] + rw [Matrix.mul_nonsing_inv _ (isUnit_det_symmPart_of_isEllipticMatrix hA)] + funext i + simp [matVecMul, Matrix.one_apply] + calc + q = (q - matVecMul (skewPart A) p) + matVecMul (skewPart A) p := by + ext i + simp [sub_eq_add_neg] + _ = matVecMul (symmPart A) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) + + matVecMul (skewPart A) p := by + rw [hsInvMul] + +theorem blockMatrixOfCoeff_image_plainUpperBound_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (p q : Vec d) : + blockVecDot (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) ≤ + (2 * Lam ^ 2 + 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * Lam ^ 2) * vecNormSq p + + (2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹)) * vecNormSq q := by + let Y := blockMatVecMul (blockMatrixOfCoeff A) (p, q) + let lower := matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p) + have hY2 : Y.2 = lower := by + simpa [Y, lower] using blockMatVecMul_blockMatrixOfCoeff_snd A p q + have hY1 : Y.1 = matVecMul (symmPart A) p + matVecMul (skewPart A) lower := by + simpa [Y, lower] using blockMatVecMul_blockMatrixOfCoeff_fst A p q + have hlower : + vecNormSq lower ≤ + 2 * (lam⁻¹ * lam⁻¹) * vecNormSq q + + 2 * (lam⁻¹ * lam⁻¹) * Lam ^ 2 * vecNormSq p := by + have hsInv := + vecNormSq_matVecMul_symmPartInv_le_of_isEllipticMatrix hA + (q - matVecMul (skewPart A) p) + have hsub : + vecNormSq (q - matVecMul (skewPart A) p) ≤ + 2 * (vecNormSq q + vecNormSq (matVecMul (skewPart A) p)) := + vecNormSq_sub_le q (matVecMul (skewPart A) p) + have hskew := vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix hA p + nlinarith + have hupper : + vecNormSq Y.1 ≤ 2 * Lam ^ 2 * vecNormSq p + 2 * Lam ^ 2 * vecNormSq lower := by + rw [hY1] + have hsymm := vecNormSq_matVecMul_symmPart_le_of_isEllipticMatrix hA p + have hskew := vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix hA lower + have hadd := vecNormSq_add_le (matVecMul (symmPart A) p) (matVecMul (skewPart A) lower) + nlinarith + calc + blockVecDot Y Y = vecNormSq Y.1 + vecNormSq Y.2 := by + rfl + _ = vecNormSq Y.1 + vecNormSq lower := by rw [hY2] + _ ≤ (2 * Lam ^ 2 * vecNormSq p + 2 * Lam ^ 2 * vecNormSq lower) + vecNormSq lower := by + linarith + _ ≤ (2 * Lam ^ 2 * vecNormSq p + + 2 * Lam ^ 2 * + (2 * (lam⁻¹ * lam⁻¹) * vecNormSq q + + 2 * (lam⁻¹ * lam⁻¹) * Lam ^ 2 * vecNormSq p)) + + (2 * (lam⁻¹ * lam⁻¹) * vecNormSq q + + 2 * (lam⁻¹ * lam⁻¹) * Lam ^ 2 * vecNormSq p) := by + gcongr + _ ≤ (2 * Lam ^ 2 + 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * Lam ^ 2) * vecNormSq p + + (2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹)) * vecNormSq q := by + nlinarith + +noncomputable def blockMatrixOfCoeffNormSqBound (lam Lam : ℝ) : ℝ := + 2 * Lam ^ 2 + 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * (Lam ^ 2 + 1) + +theorem blockMatrixOfCoeff_image_bound_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (X : BlockVec d) : + blockVecDot (blockMatVecMul (blockMatrixOfCoeff A) X) + (blockMatVecMul (blockMatrixOfCoeff A) X) ≤ + blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot X X := by + rcases X with ⟨p, q⟩ + have hplain := blockMatrixOfCoeff_image_plainUpperBound_of_isEllipticMatrix hA p q + let α : ℝ := 2 * Lam ^ 2 + 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * Lam ^ 2 + let β : ℝ := 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) + have hlamInvSq_nonneg : 0 ≤ lam⁻¹ * lam⁻¹ := mul_self_nonneg _ + have hLamSq_nonneg : 0 ≤ Lam ^ 2 := by positivity + have hTwo_nonneg : 0 ≤ (2 : ℝ) := by positivity + have hLamTerm_nonneg : 0 ≤ 2 * Lam ^ 2 := by positivity + have hFactor_nonneg : 0 ≤ 2 * Lam ^ 2 + 1 := by positivity + have hMixed_nonneg : 0 ≤ 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * Lam ^ 2 := by + exact mul_nonneg (mul_nonneg (mul_nonneg hTwo_nonneg hFactor_nonneg) hlamInvSq_nonneg) + hLamSq_nonneg + have hα_nonneg : 0 ≤ α := by + dsimp [α] + exact add_nonneg hLamTerm_nonneg hMixed_nonneg + have hβ_nonneg : 0 ≤ β := by + dsimp [β] + exact mul_nonneg (mul_nonneg hTwo_nonneg hFactor_nonneg) hlamInvSq_nonneg + have hp_le : α * vecNormSq p ≤ α * (vecNormSq p + vecNormSq q) := by + refine mul_le_mul_of_nonneg_left ?_ hα_nonneg + exact le_add_of_nonneg_right (vecNormSq_nonneg q) + have hq_le : β * vecNormSq q ≤ β * (vecNormSq p + vecNormSq q) := by + refine mul_le_mul_of_nonneg_left ?_ hβ_nonneg + exact le_add_of_nonneg_left (vecNormSq_nonneg p) + have hαβ : + α + β = blockMatrixOfCoeffNormSqBound lam Lam := by + unfold blockMatrixOfCoeffNormSqBound + dsimp [α, β] + ring_nf + simp only [blockVecDot] at hplain ⊢ + calc + blockVecDot (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) + ≤ α * vecNormSq p + β * vecNormSq q := hplain + _ ≤ α * (vecNormSq p + vecNormSq q) + β * (vecNormSq p + vecNormSq q) := by + linarith + _ = (α + β) * (vecNormSq p + vecNormSq q) := by ring + _ = blockMatrixOfCoeffNormSqBound lam Lam * (vecNormSq p + vecNormSq q) := by + rw [hαβ] + _ = blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot (p, q) (p, q) := by + rw [show blockVecDot (p, q) (p, q) = vecNormSq p + vecNormSq q by rfl] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/MatrixIdentities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/MatrixIdentities.lean new file mode 100644 index 0000000000..d008f2be2a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/MatrixIdentities.lean @@ -0,0 +1,354 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.Structures + +/-! # Matrix Identities -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Block formalism -- matrix identities and conjugation + +blockMatrixOfCoeff matTranspose / primal / adjoint identities, +blockVecDot / blockMatVecMul conj-by-involution lemmas, signFlip and swap +conjugation identities, and the blockMatrixOfCoeff_quadratic_eq / +matTranspose_flipFlux identities. +-/ + +@[simp] theorem blockMatrixOfCoeff_matTranspose_lowerRight {d : ℕ} (A : Mat d) : + (blockMatrixOfCoeff (matTranspose A)).lowerRight = (blockMatrixOfCoeff A).lowerRight := by + simp [blockMatrixOfCoeff, symmPart_matTranspose, skewPart_matTranspose] + +theorem blockMatrixOfCoeff_matTranspose {d : ℕ} (A : Mat d) : + blockMatrixOfCoeff (matTranspose A) = + { upperLeft := (blockMatrixOfCoeff A).upperLeft + upperRight := -(blockMatrixOfCoeff A).upperRight + lowerLeft := -(blockMatrixOfCoeff A).lowerLeft + lowerRight := (blockMatrixOfCoeff A).lowerRight } := by + apply blockMat_ext <;> simp + +theorem blockMatVecMul_blockMatrixOfCoeff_snd {d : ℕ} (A : Mat d) (p q : Vec d) : + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)).2 = + matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p) := by + rw [blockMatVecMul, blockMatrixOfCoeff] + simp [sub_eq_add_neg, matVecMul_add, add_comm] + rw [neg_matVecMul, matVecMul_neg, matVecMul_mul] + +theorem blockMatVecMul_blockMatrixOfCoeff_fst {d : ℕ} (A : Mat d) (p q : Vec d) : + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)).1 = + matVecMul (symmPart A) p + + matVecMul (skewPart A) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) := by + let lower := matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p) + have hsnd : (blockMatVecMul (blockMatrixOfCoeff A) (p, q)).2 = lower := by + simpa [lower] using blockMatVecMul_blockMatrixOfCoeff_snd A p q + have hfst : + (blockMatVecMul (blockMatrixOfCoeff A) (p, q)).1 = + matVecMul (symmPart A) p + matVecMul (skewPart A) lower := by + rw [← hsnd] + rw [blockMatVecMul, blockMatrixOfCoeff] + simp [matTranspose_skewPart] + rw [add_matVecMul, matVecMul_add] + have hneg : + matVecMul (skewPart A) (matVecMul (-((symmPart A)⁻¹ * skewPart A)) p) = + -matVecMul (skewPart A * ((symmPart A)⁻¹ * skewPart A)) p := by + rw [neg_matVecMul, matVecMul_neg, matVecMul_mul] + have hpos : + matVecMul (skewPart A) (matVecMul (symmPart A)⁻¹ q) = + matVecMul (skewPart A * (symmPart A)⁻¹) q := by + rw [matVecMul_mul] + rw [hneg, hpos] + rw [neg_matVecMul] + simp [Matrix.mul_assoc, add_left_comm, add_comm] + simpa [lower] using hfst + +theorem blockMatVecMul_blockMatrixOfCoeff_primal_of_isUnit_det_symmPart {d : ℕ} + (A : Mat d) (hdet : IsUnit (symmPart A).det) (ξ : Vec d) : + blockMatVecMul (blockMatrixOfCoeff A) (ξ, matVecMul A ξ) = + (matVecMul A ξ, ξ) := by + let s := symmPart A + let k := skewPart A + have hA : A = s + k := by + ext i j + simp [s, k, symmPart, skewPart, sub_eq_add_neg] + ring + have hsInvMul : matVecMul s⁻¹ (matVecMul s ξ) = ξ := by + rw [matVecMul_mul, Matrix.nonsing_inv_mul s hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hkT : matTranspose k = -k := by + ext i j + simp [k, skewPart, matTranspose] + ring + apply Prod.ext + · calc + (blockMatVecMul (blockMatrixOfCoeff A) (ξ, matVecMul A ξ)).1 = + matVecMul s ξ + + matVecMul (matTranspose k) (matVecMul s⁻¹ (matVecMul k ξ)) - + matVecMul (matTranspose k) (matVecMul s⁻¹ (matVecMul A ξ)) := by + simp [blockMatVecMul, blockMatrixOfCoeff, s, k, hkT, add_matVecMul, matVecMul_mul, + sub_eq_add_neg, neg_matVecMul, Matrix.mul_assoc] + _ = matVecMul s ξ + + matVecMul (matTranspose k) (matVecMul s⁻¹ (matVecMul k ξ)) - + matVecMul (matTranspose k) (ξ + matVecMul s⁻¹ (matVecMul k ξ)) := by + rw [hA, add_matVecMul, matVecMul_add, hsInvMul] + _ = matVecMul s ξ - matVecMul (matTranspose k) ξ := by + rw [matVecMul_add] + simp [sub_eq_add_neg, add_assoc, add_comm] + _ = matVecMul s ξ + matVecMul k ξ := by + rw [hkT, neg_matVecMul] + simp [sub_eq_add_neg] + _ = matVecMul A ξ := by + rw [hA, add_matVecMul] + · calc + (blockMatVecMul (blockMatrixOfCoeff A) (ξ, matVecMul A ξ)).2 = + -(matVecMul s⁻¹ (matVecMul k ξ)) + matVecMul s⁻¹ (matVecMul A ξ) := by + simp [blockMatVecMul, blockMatrixOfCoeff, s, k, matVecMul_mul, neg_matVecMul] + _ = -(matVecMul s⁻¹ (matVecMul k ξ)) + (ξ + matVecMul s⁻¹ (matVecMul k ξ)) := by + rw [hA, add_matVecMul, matVecMul_add, hsInvMul] + _ = ξ := by + simp [add_assoc, add_comm] + +theorem blockMatVecMul_blockMatrixOfCoeff_adjoint_of_isUnit_det_symmPart {d : ℕ} + (A : Mat d) (hdet : IsUnit (symmPart A).det) (η : Vec d) : + blockMatVecMul (blockMatrixOfCoeff A) (η, -matVecMul (matTranspose A) η) = + (matVecMul (matTranspose A) η, -η) := by + have hdetT : IsUnit (symmPart (matTranspose A)).det := by + simpa [symmPart_matTranspose] using hdet + have hprimal := + blockMatVecMul_blockMatrixOfCoeff_primal_of_isUnit_det_symmPart + (A := matTranspose A) hdetT η + apply Prod.ext + · simpa [blockMatrixOfCoeff_matTranspose, blockMatVecMul, matVecMul_neg, neg_matVecMul] using + congrArg Prod.fst hprimal + · have hsnd : + -matVecMul (blockMatrixOfCoeff A).lowerRight (matVecMul (matTranspose A) η) + + matVecMul (blockMatrixOfCoeff A).lowerLeft η = + -η := by + simpa [blockMatrixOfCoeff_matTranspose, blockMatVecMul, matVecMul_neg, neg_matVecMul] using + congrArg Neg.neg (congrArg Prod.snd hprimal) + calc + (blockMatVecMul (blockMatrixOfCoeff A) (η, -matVecMul (matTranspose A) η)).2 = + matVecMul (blockMatrixOfCoeff A).lowerLeft η + + -matVecMul (blockMatrixOfCoeff A).lowerRight (matVecMul (matTranspose A) η) := by + simp [blockMatVecMul, matVecMul_neg] + _ = -matVecMul (blockMatrixOfCoeff A).lowerRight (matVecMul (matTranspose A) η) + + matVecMul (blockMatrixOfCoeff A).lowerLeft η := by + simp [add_comm] + _ = -η := hsnd + +theorem blockMatVecMul_blockMatrixOfCoeff_primal_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (ξ : Vec d) : + blockMatVecMul (blockMatrixOfCoeff A) (ξ, matVecMul A ξ) = + (matVecMul A ξ, ξ) := + blockMatVecMul_blockMatrixOfCoeff_primal_of_isUnit_det_symmPart A + (isUnit_det_symmPart_of_isEllipticMatrix hA) ξ + +theorem blockMatVecMul_blockMatrixOfCoeff_adjoint_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (η : Vec d) : + blockMatVecMul (blockMatrixOfCoeff A) (η, -matVecMul (matTranspose A) η) = + (matVecMul (matTranspose A) η, -η) := + blockMatVecMul_blockMatrixOfCoeff_adjoint_of_isUnit_det_symmPart A + (isUnit_det_symmPart_of_isEllipticMatrix hA) η + +theorem blockVecDot_blockVecConj_of_transpose_eq_self_of_mul_self_eq_one {d : ℕ} + {R : Mat d} (hR : matTranspose R = R) (hR2 : R * R = 1) (X Y : BlockVec d) : + blockVecDot (blockVecConj R X) (blockVecConj R Y) = blockVecDot X Y := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨u, v⟩ + simp [blockVecConj, blockVecDot, + vecDot_matVecMul_conj_of_transpose_eq_self_of_mul_self_eq_one (hR := hR) (hR2 := hR2)] + +theorem blockMatVecMul_blockMatConj_of_mul_self_eq_one {d : ℕ} {R : Mat d} + (hR2 : R * R = 1) (B : BlockMat d) (X : BlockVec d) : + blockMatVecMul (blockMatConj R B) (blockVecConj R X) = + blockVecConj R (blockMatVecMul B X) := by + rcases X with ⟨p, q⟩ + apply Prod.ext + · calc + (blockMatVecMul (blockMatConj R B) (blockVecConj R (p, q))).1 + = matVecMul (R * B.upperLeft * R) (matVecMul R p) + + matVecMul (R * B.upperRight * R) (matVecMul R q) := by + rfl + _ = matVecMul R (matVecMul B.upperLeft p) + + matVecMul R (matVecMul B.upperRight q) := by + rw [matVecMul_mul_mul_cancel_of_mul_self_eq_one (R := R) (A := B.upperLeft) + (x := p) hR2, + matVecMul_mul_mul_cancel_of_mul_self_eq_one (R := R) (A := B.upperRight) + (x := q) hR2] + _ = matVecMul R (matVecMul B.upperLeft p + matVecMul B.upperRight q) := by + rw [matVecMul_add] + _ = (blockVecConj R (blockMatVecMul B (p, q))).1 := by + rfl + · calc + (blockMatVecMul (blockMatConj R B) (blockVecConj R (p, q))).2 + = matVecMul (R * B.lowerLeft * R) (matVecMul R p) + + matVecMul (R * B.lowerRight * R) (matVecMul R q) := by + rfl + _ = matVecMul R (matVecMul B.lowerLeft p) + + matVecMul R (matVecMul B.lowerRight q) := by + rw [matVecMul_mul_mul_cancel_of_mul_self_eq_one (R := R) (A := B.lowerLeft) + (x := p) hR2, + matVecMul_mul_mul_cancel_of_mul_self_eq_one (R := R) (A := B.lowerRight) + (x := q) hR2] + _ = matVecMul R (matVecMul B.lowerLeft p + matVecMul B.lowerRight q) := by + rw [matVecMul_add] + _ = (blockVecConj R (blockMatVecMul B (p, q))).2 := by + rfl + +theorem blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one {d : ℕ} + {R A : Mat d} (hR : matTranspose R = R) (hR2 : R * R = 1) : + blockMatrixOfCoeff (R * A * R) = blockMatConj R (blockMatrixOfCoeff A) := by + apply blockMat_ext + · calc + (blockMatrixOfCoeff (R * A * R)).upperLeft + = R * symmPart A * R + + (R * matTranspose (skewPart A) * R) * (R * (symmPart A)⁻¹ * R) * + (R * skewPart A * R) := by + simp [blockMatrixOfCoeff, symmPart_mul_mul_of_transpose_eq_self hR, + skewPart_mul_mul_of_transpose_eq_self hR, + matTranspose_mul_mul_of_transpose_eq_self hR, + nonsing_inv_mul_mul_of_mul_self_eq_one (R := R) (A := symmPart A) hR2] + _ = R * symmPart A * R + + (R * (matTranspose (skewPart A) * (symmPart A)⁻¹) * R) * + (R * skewPart A * R) := by + rw [mul_mul_mul_conj_of_mul_self_eq_one (R := R) + (B := matTranspose (skewPart A)) (C := (symmPart A)⁻¹) hR2] + _ = R * symmPart A * R + + R * (matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A) * R := by + rw [mul_mul_mul_conj_of_mul_self_eq_one (R := R) + (B := matTranspose (skewPart A) * (symmPart A)⁻¹) (C := skewPart A) hR2] + _ = (blockMatConj R (blockMatrixOfCoeff A)).upperLeft := by + simp [blockMatConj, blockMatrixOfCoeff, Matrix.mul_assoc, Matrix.mul_add, add_mul] + · calc + (blockMatrixOfCoeff (R * A * R)).upperRight + = -((R * matTranspose (skewPart A) * R) * (R * (symmPart A)⁻¹ * R)) := by + simp [blockMatrixOfCoeff, symmPart_mul_mul_of_transpose_eq_self hR, + skewPart_mul_mul_of_transpose_eq_self hR, + matTranspose_mul_mul_of_transpose_eq_self hR, + nonsing_inv_mul_mul_of_mul_self_eq_one (R := R) (A := symmPart A) hR2] + _ = -(R * (matTranspose (skewPart A) * (symmPart A)⁻¹) * R) := by + rw [mul_mul_mul_conj_of_mul_self_eq_one (R := R) + (B := matTranspose (skewPart A)) (C := (symmPart A)⁻¹) hR2] + _ = (blockMatConj R (blockMatrixOfCoeff A)).upperRight := by + simp [blockMatConj, blockMatrixOfCoeff, Matrix.mul_assoc] + · calc + (blockMatrixOfCoeff (R * A * R)).lowerLeft + = -((R * (symmPart A)⁻¹ * R) * (R * skewPart A * R)) := by + simp [blockMatrixOfCoeff, symmPart_mul_mul_of_transpose_eq_self hR, + skewPart_mul_mul_of_transpose_eq_self hR, + nonsing_inv_mul_mul_of_mul_self_eq_one (R := R) (A := symmPart A) hR2] + _ = -(R * ((symmPart A)⁻¹ * skewPart A) * R) := by + rw [mul_mul_mul_conj_of_mul_self_eq_one (R := R) + (B := (symmPart A)⁻¹) (C := skewPart A) hR2] + _ = (blockMatConj R (blockMatrixOfCoeff A)).lowerLeft := by + simp [blockMatConj, blockMatrixOfCoeff, Matrix.mul_assoc] + · simp [blockMatConj, blockMatrixOfCoeff, symmPart_mul_mul_of_transpose_eq_self hR, + nonsing_inv_mul_mul_of_mul_self_eq_one (R := R) (A := symmPart A) hR2] + +theorem matTranspose_signFlipMatrix {d : ℕ} (i : Fin d) : + matTranspose (signFlipMatrix i) = signFlipMatrix i := by + ext r c + by_cases h : r = c + · subst c + simp [signFlipMatrix, matTranspose] + · simp [signFlipMatrix, matTranspose, h, eq_comm] + +theorem signFlipMatrix_mul_self {d : ℕ} (i : Fin d) : + signFlipMatrix i * signFlipMatrix i = 1 := by + ext r c + by_cases h : r = c + · subst c + by_cases hr : r = i <;> simp [signFlipMatrix, hr] + · simp [signFlipMatrix, h] + +theorem blockMatrixOfCoeff_signFlipMatrix_conj {d : ℕ} (i : Fin d) (A : Mat d) : + blockMatrixOfCoeff (signFlipMatrix i * A * signFlipMatrix i) = + blockMatConj (signFlipMatrix i) (blockMatrixOfCoeff A) := by + exact blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one + (R := signFlipMatrix i) (A := A) + (matTranspose_signFlipMatrix i) (signFlipMatrix_mul_self i) + +theorem blockMatrixOfCoeff_swap_conj {d : ℕ} (i j : Fin d) (A : Mat d) : + blockMatrixOfCoeff (Matrix.swap ℝ i j * A * Matrix.swap ℝ i j) = + blockMatConj (Matrix.swap ℝ i j) (blockMatrixOfCoeff A) := by + exact blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one + (R := Matrix.swap ℝ i j) (A := A) + (by simp [matTranspose]) + (Matrix.swap_mul_self (R := ℝ) i j) + +theorem blockMatrixOfCoeff_quadratic_eq {d : ℕ} (A : Mat d) (p q : Vec d) : + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) = + vecDot p (matVecMul (symmPart A) p) + + vecDot (q - matVecMul (skewPart A) p) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) := by + let s := symmPart A + let k := skewPart A + let sInv := s⁻¹ + let kp := matVecMul k p + calc + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) + = vecDot p (matVecMul s p) + + vecDot p (matVecMul (matTranspose k) (matVecMul sInv kp)) + - vecDot p (matVecMul (matTranspose k) (matVecMul sInv q)) + - vecDot q (matVecMul sInv kp) + + vecDot q (matVecMul sInv q) := by + simp [blockVecDot, blockMatVecMul, blockMatrixOfCoeff, s, k, sInv, kp, + add_matVecMul, matVecMul_mul, vecDot_add_right, sub_eq_add_neg, Matrix.mul_assoc] + rw [neg_matVecMul, neg_matVecMul, neg_matVecMul, + vecDot_neg_right, vecDot_neg_right, vecDot_neg_right] + simp + ring + _ = vecDot p (matVecMul s p) + + vecDot kp (matVecMul sInv kp) + - vecDot kp (matVecMul sInv q) + - vecDot q (matVecMul sInv kp) + + vecDot q (matVecMul sInv q) := by + rw [vecDot_matVecMul_transpose p (matVecMul sInv kp) k, + vecDot_matVecMul_transpose p (matVecMul sInv q) k] + _ = vecDot p (matVecMul s p) + + vecDot (q - kp) (matVecMul sInv (q - kp)) := by + simp [kp, sub_eq_add_neg, matVecMul_add, matVecMul_neg, + vecDot_add_left, vecDot_add_right, + vecDot_neg_left, vecDot_neg_right] + ring + _ = vecDot p (matVecMul (symmPart A) p) + + vecDot (q - matVecMul (skewPart A) p) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) := by + simp [s, k, sInv, kp] + +theorem blockMatrixOfCoeff_quadratic_matTranspose_flipFlux {d : ℕ} (A : Mat d) (p q : Vec d) : + blockVecDot (p, -q) (blockMatVecMul (blockMatrixOfCoeff (matTranspose A)) (p, -q)) = + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) := by + let r := q - matVecMul (skewPart A) p + rw [blockMatrixOfCoeff_quadratic_eq, blockMatrixOfCoeff_quadratic_eq, symmPart_matTranspose] + have hr : -q - matVecMul (skewPart (matTranspose A)) p = -r := by + funext i + rw [skewPart_matTranspose, neg_matVecMul] + simp [r, sub_eq_add_neg] + ring + rw [hr] + have hneg : + vecDot (-r) (matVecMul ((symmPart A)⁻¹) (-r)) = + vecDot r (matVecMul ((symmPart A)⁻¹) r) := by + simp [matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + simpa [r] using hneg + +theorem blockVecDot_blockMatVecMul_blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one + {d : ℕ} {R A : Mat d} (hR : matTranspose R = R) (hR2 : R * R = 1) (X : BlockVec d) : + blockVecDot (blockVecConj R X) + (blockMatVecMul (blockMatrixOfCoeff (R * A * R)) (blockVecConj R X)) = + blockVecDot X (blockMatVecMul (blockMatrixOfCoeff A) X) := by + rw [blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one hR hR2, + blockMatVecMul_blockMatConj_of_mul_self_eq_one hR2, + blockVecDot_blockVecConj_of_transpose_eq_self_of_mul_self_eq_one hR hR2] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Properties.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Properties.lean new file mode 100644 index 0000000000..fb3e984d0f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Properties.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds + +/-! # Properties -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Block formalism -- block-state properties and admissibility + +IsBlockPotentialOn / IsBlockPotentialZeroTraceOn / IsBlockSolenoidalOn / +IsBlockSolenoidalZeroNormalTraceOn / IsBlockTestOn / BlockResponseSpace and +IsBlockMuAdmissible definitions plus the IsBlockMuAdmissible namespace with +its potentialCorrection / isPotentialZeroTrace bridges. +-/ + +def IsBlockPotentialOn {d : ℕ} (U : Set (Vec d)) (X : BlockState d) : Prop := + IsPotentialOn U X.potential + +def IsBlockPotentialZeroTraceOn {d : ℕ} (U : Set (Vec d)) (X : BlockState d) : Prop := + IsPotentialZeroTraceOn U X.potential + +def IsBlockSolenoidalOn {d : ℕ} (U : Set (Vec d)) (X : BlockState d) : Prop := + IsSolenoidalOn U X.flux + +def IsBlockSolenoidalZeroNormalTraceOn {d : ℕ} (U : Set (Vec d)) (X : BlockState d) : Prop := + IsSolenoidalZeroNormalTraceOn U X.flux + +def IsBlockTestOn {d : ℕ} (U : Set (Vec d)) (Y : BlockState d) : Prop := + IsBlockPotentialZeroTraceOn U Y ∧ IsBlockSolenoidalZeroNormalTraceOn U Y + +def BlockResponseSpace {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) (X : BlockState d) : Prop := + IsBlockPotentialOn U X ∧ + IsBlockSolenoidalOn U X ∧ + ∀ Y : BlockState d, IsBlockTestOn U Y → + ∫ x in U, + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = 0 + +def IsBlockMuAdmissible {d : ℕ} (U : Set (Vec d)) (P : BlockVec d) (X : BlockState d) : Prop := + MemVectorL2 U (fun x => X.potential x - P.1) ∧ + IsPotentialZeroTraceOn U (fun x => X.potential x - P.1) ∧ + MemVectorL2 U (fun x => X.flux x - P.2) ∧ + IsSolenoidalZeroNormalTraceOn U (fun x => X.flux x - P.2) + +namespace IsBlockMuAdmissible + +theorem potentialCorrection_memL2 {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) : + MemVectorL2 U (fun x => X.potential x - P.1) := + hX.1 + +theorem isPotentialZeroTrace {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) : + IsPotentialZeroTraceOn U (fun x => X.potential x - P.1) := + hX.2.1 + +theorem fluxCorrection_memL2 {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) : + MemVectorL2 U (fun x => X.flux x - P.2) := + hX.2.2.1 + +theorem isSolenoidalZeroNormalTrace {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) : + IsSolenoidalZeroNormalTraceOn U (fun x => X.flux x - P.2) := + hX.2.2.2 + +end IsBlockMuAdmissible + +noncomputable def blockEnergyDensity {d : ℕ} (a : CoeffField d) (X : BlockState d) (x : Vec d) : ℝ := + (1 / 2 : ℝ) * blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + +theorem blockEnergyDensity_ge_vecDot_of_isEllipticFieldOn {d : ℕ} + {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) (X : BlockState d) {x : Vec d} (hx : x ∈ U) : + vecDot (X.potential x) (X.flux x) ≤ blockEnergyDensity a X x := by + unfold blockEnergyDensity + simpa [BlockState.eval] using! + blockMatrixOfCoeff_half_quadratic_ge_vecDot_of_isEllipticMatrix + (hEll.2 x hx) (X.potential x) (X.flux x) + +theorem blockEnergyDensity_matTranspose_flipFlux {d : ℕ} + (a : CoeffField d) (X : BlockState d) (x : Vec d) : + blockEnergyDensity (fun y => matTranspose (a y)) X.flipFlux x = + blockEnergyDensity a X x := by + unfold blockEnergyDensity blockCoeffField + simpa [BlockState.eval_flipFlux] using! + congrArg (fun t => (1 / 2 : ℝ) * t) + (blockMatrixOfCoeff_quadratic_matTranspose_flipFlux + (A := a x) (p := X.potential x) (q := X.flux x)) + +theorem blockEnergyDensity_mapMatrix_conj_of_transpose_eq_self_of_mul_self_eq_one {d : ℕ} + (a : CoeffField d) (X : BlockState d) (R : Mat d) + (hR : matTranspose R = R) (hR2 : R * R = 1) (x : Vec d) : + blockEnergyDensity (fun y => R * a y * R) (X.mapMatrix R) x = + blockEnergyDensity a X x := by + unfold blockEnergyDensity blockCoeffField + simpa [BlockState.eval_mapMatrix, blockVecConj] using! + congrArg (fun t => (1 / 2 : ℝ) * t) + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_conj_of_transpose_eq_self_of_mul_self_eq_one + (R := R) (A := a x) hR hR2 (X := X.eval x)) + +theorem blockEnergyDensity_mapMatrix_signFlipMatrix_conj {d : ℕ} + (a : CoeffField d) (X : BlockState d) (i : Fin d) (x : Vec d) : + blockEnergyDensity (fun y => signFlipMatrix i * a y * signFlipMatrix i) + (X.mapMatrix (signFlipMatrix i)) x = + blockEnergyDensity a X x := by + exact blockEnergyDensity_mapMatrix_conj_of_transpose_eq_self_of_mul_self_eq_one + (a := a) (X := X) (R := signFlipMatrix i) + (matTranspose_signFlipMatrix i) (signFlipMatrix_mul_self i) x + +theorem blockEnergyDensity_mapMatrix_swap_conj {d : ℕ} + (a : CoeffField d) (X : BlockState d) (i j : Fin d) (x : Vec d) : + blockEnergyDensity (fun y => Matrix.swap ℝ i j * a y * Matrix.swap ℝ i j) + (X.mapMatrix (Matrix.swap ℝ i j)) x = + blockEnergyDensity a X x := by + exact blockEnergyDensity_mapMatrix_conj_of_transpose_eq_self_of_mul_self_eq_one + (a := a) (X := X) (R := Matrix.swap ℝ i j) + (by simp [matTranspose]) + (Matrix.swap_mul_self (R := ℝ) i j) x + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Structures.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Structures.lean new file mode 100644 index 0000000000..b363d04c10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockFormalism/Structures.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import Mathlib.LinearAlgebra.Matrix.NonsingularInverse + +/-! # Structures -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Block formalism -- structures and private matrix helpers + +BlockState structure, constVecField, blockMatrixOfCoeff / +blockCoeffField definitions, plus symmPart / skewPart / inverse / conjugation +helpers used throughout. +-/ + +structure BlockState (d : ℕ) where + potential : Vec d → Vec d + flux : Vec d → Vec d + +@[ext] theorem BlockState.ext {d : ℕ} {X Y : BlockState d} + (hpot : X.potential = Y.potential) (hflux : X.flux = Y.flux) : X = Y := by + cases X + cases Y + cases hpot + cases hflux + rfl + +instance {d : ℕ} : Add (BlockState d) where + add X Y := + { potential := X.potential + Y.potential + flux := X.flux + Y.flux } + +instance {d : ℕ} : SMul ℝ (BlockState d) where + smul c X := + { potential := c • X.potential + flux := c • X.flux } + +def BlockState.eval {d : ℕ} (X : BlockState d) (x : Vec d) : BlockVec d := + (X.potential x, X.flux x) + +@[simp] theorem BlockState.eval_add {d : ℕ} (X Y : BlockState d) (x : Vec d) : + (X + Y).eval x = X.eval x + Y.eval x := by + rfl + +@[simp] theorem BlockState.eval_smul {d : ℕ} (c : ℝ) (X : BlockState d) (x : Vec d) : + (c • X).eval x = c • X.eval x := by + rfl + +def BlockState.mapMatrix {d : ℕ} (R : Mat d) (X : BlockState d) : BlockState d := + { potential := fun x => matVecMul R (X.potential x) + flux := fun x => matVecMul R (X.flux x) } + +@[simp] theorem BlockState.eval_mapMatrix {d : ℕ} (R : Mat d) (X : BlockState d) (x : Vec d) : + (X.mapMatrix R).eval x = (matVecMul R (X.potential x), matVecMul R (X.flux x)) := by + rfl + +def BlockState.flipFlux {d : ℕ} (X : BlockState d) : BlockState d := + { potential := X.potential + flux := fun x => -X.flux x } + +@[simp] theorem BlockState.eval_flipFlux {d : ℕ} (X : BlockState d) (x : Vec d) : + X.flipFlux.eval x = (X.potential x, -X.flux x) := by + rfl + +def constVecField {d : ℕ} (p : Vec d) : Vec d → Vec d := + fun _ => p + +noncomputable def blockMatrixOfCoeff {d : ℕ} (A : Mat d) : BlockMat d := + let s := symmPart A + let k := skewPart A + let sInv := s⁻¹ + { upperLeft := s + (matTranspose k) * sInv * k + upperRight := -((matTranspose k) * sInv) + lowerLeft := -(sInv * k) + lowerRight := sInv } + +noncomputable def blockCoeffField {d : ℕ} (a : CoeffField d) : Vec d → BlockMat d := + fun x => blockMatrixOfCoeff (a x) + +def blockVecConj {d : ℕ} (R : Mat d) (X : BlockVec d) : BlockVec d := + (matVecMul R X.1, matVecMul R X.2) + +def blockMatConj {d : ℕ} (R : Mat d) (B : BlockMat d) : BlockMat d := + { upperLeft := R * B.upperLeft * R + upperRight := R * B.upperRight * R + lowerLeft := R * B.lowerLeft * R + lowerRight := R * B.lowerRight * R } + +theorem symmPart_matTranspose {d : ℕ} (A : Mat d) : + symmPart (matTranspose A) = symmPart A := by + ext i j + simp [symmPart, matTranspose, add_comm] + +theorem skewPart_matTranspose {d : ℕ} (A : Mat d) : + skewPart (matTranspose A) = -skewPart A := by + ext i j + simp [skewPart, matTranspose] + ring + +theorem matTranspose_mul_mul_of_transpose_eq_self {d : ℕ} {R A : Mat d} + (hR : matTranspose R = R) : + matTranspose (R * A * R) = R * matTranspose A * R := by + have hR' : Matrix.transpose R = R := by + simpa [matTranspose] using hR + change Matrix.transpose (R * A * R) = R * Matrix.transpose A * R + rw [Matrix.transpose_mul, Matrix.transpose_mul, hR'] + simp [Matrix.mul_assoc] + +theorem symmPart_mul_mul_of_transpose_eq_self {d : ℕ} {R A : Mat d} + (hR : matTranspose R = R) : + symmPart (R * A * R) = R * symmPart A * R := by + rw [symmPart_eq_smul_add_transpose, symmPart_eq_smul_add_transpose, + matTranspose_mul_mul_of_transpose_eq_self hR] + simp [Matrix.mul_add, add_mul, Matrix.mul_assoc] + +theorem skewPart_mul_mul_of_transpose_eq_self {d : ℕ} {R A : Mat d} + (hR : matTranspose R = R) : + skewPart (R * A * R) = R * skewPart A * R := by + rw [skewPart_eq_smul_sub_transpose, skewPart_eq_smul_sub_transpose, + matTranspose_mul_mul_of_transpose_eq_self hR] + simp [Matrix.mul_sub, sub_mul, Matrix.mul_assoc] + +theorem isUnit_det_mul_mul_iff_of_mul_self_eq_one {d : ℕ} {R A : Mat d} + (hR2 : R * R = 1) : + IsUnit (R * A * R).det ↔ IsUnit A.det := by + have hRdetSq : R.det * R.det = 1 := by + simpa [Matrix.det_mul, Matrix.det_one, mul_assoc] using congrArg Matrix.det hR2 + have hRdetUnit : IsUnit R.det := IsUnit.of_mul_eq_one _ hRdetSq + constructor + · intro h + have hmul : IsUnit (R.det * (R * A * R).det * R.det) := by + simpa [mul_assoc] using hRdetUnit.mul (h.mul hRdetUnit) + have hEq : R.det * (R * A * R).det * R.det = A.det := by + calc + R.det * (R * A * R).det * R.det + = R.det * (R.det * A.det * R.det) * R.det := by + simp [Matrix.det_mul, mul_assoc] + _ = (R.det * R.det) * A.det * (R.det * R.det) := by ring + _ = A.det := by simp [hRdetSq] + rwa [hEq] at hmul + · intro h + have hmul : IsUnit (R.det * A.det * R.det) := by + simpa [mul_assoc] using hRdetUnit.mul (h.mul hRdetUnit) + simpa [Matrix.det_mul, mul_assoc] using hmul + +theorem nonsing_inv_mul_mul_of_mul_self_eq_one {d : ℕ} {R A : Mat d} + (hR2 : R * R = 1) : + (R * A * R)⁻¹ = R * A⁻¹ * R := by + by_cases hA : IsUnit A.det + · apply Matrix.inv_eq_right_inv + calc + (R * A * R) * (R * A⁻¹ * R) + = R * A * (R * R) * A⁻¹ * R := by + simp [Matrix.mul_assoc] + _ = R * A * A⁻¹ * R := by + simp [hR2, Matrix.mul_assoc] + _ = R * 1 * R := by + simpa [Matrix.mul_assoc] using + congrArg (fun M => R * M * R) (Matrix.mul_nonsing_inv A hA) + _ = 1 := by rw [Matrix.mul_one, hR2] + · have hconj : ¬ IsUnit (R * A * R).det := by + intro hconj + exact hA ((isUnit_det_mul_mul_iff_of_mul_self_eq_one (R := R) (A := A) hR2).1 hconj) + rw [Matrix.nonsing_inv_apply_not_isUnit _ hconj, Matrix.nonsing_inv_apply_not_isUnit _ hA] + simp + +theorem mul_mul_mul_conj_of_mul_self_eq_one {d : ℕ} {R B C : Mat d} + (hR2 : R * R = 1) : + (R * B * R) * (R * C * R) = R * (B * C) * R := by + calc + (R * B * R) * (R * C * R) = R * B * (R * R) * C * R := by + simp [Matrix.mul_assoc] + _ = R * B * C * R := by + simp [hR2, Matrix.mul_assoc] + _ = R * (B * C) * R := by + simp [Matrix.mul_assoc] + +theorem matVecMul_mul_mul_cancel_of_mul_self_eq_one {d : ℕ} {R A : Mat d} {x : Vec d} + (hR2 : R * R = 1) : + matVecMul (R * A * R) (matVecMul R x) = matVecMul R (matVecMul A x) := by + calc + matVecMul (R * A * R) (matVecMul R x) = matVecMul ((R * A * R) * R) x := by + rw [matVecMul_mul] + _ = matVecMul (R * A) x := by + simp [Matrix.mul_assoc, hR2] + _ = matVecMul R (matVecMul A x) := by + rw [matVecMul_mul] + +theorem vecDot_matVecMul_conj_of_transpose_eq_self_of_mul_self_eq_one {d : ℕ} + {R : Mat d} (hR : matTranspose R = R) (hR2 : R * R = 1) (x y : Vec d) : + vecDot (matVecMul R x) (matVecMul R y) = vecDot x y := by + calc + vecDot (matVecMul R x) (matVecMul R y) + = vecDot x (matVecMul (matTranspose R) (matVecMul R y)) := by + rw [← vecDot_matVecMul_transpose x (matVecMul R y) R] + _ = vecDot x (matVecMul (R * R) y) := by + rw [hR, matVecMul_mul] + _ = vecDot x y := by + rw [hR2] + unfold matVecMul vecDot + simp [Matrix.one_apply] + +@[simp] theorem blockMatrixOfCoeff_matTranspose_upperLeft {d : ℕ} (A : Mat d) : + (blockMatrixOfCoeff (matTranspose A)).upperLeft = (blockMatrixOfCoeff A).upperLeft := by + change + symmPart (matTranspose A) + + matTranspose (skewPart (matTranspose A)) * (symmPart (matTranspose A))⁻¹ * + skewPart (matTranspose A) = + symmPart A + matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A + rw [symmPart_matTranspose, skewPart_matTranspose] + simp [Matrix.transpose_neg, matTranspose, Matrix.mul_assoc] + +@[simp] theorem blockMatrixOfCoeff_matTranspose_upperRight {d : ℕ} (A : Mat d) : + (blockMatrixOfCoeff (matTranspose A)).upperRight = -(blockMatrixOfCoeff A).upperRight := by + change + -((matTranspose (skewPart (matTranspose A))) * (symmPart (matTranspose A))⁻¹) = + -(-((matTranspose (skewPart A)) * (symmPart A)⁻¹)) + rw [symmPart_matTranspose, skewPart_matTranspose] + simp [Matrix.transpose_neg, matTranspose] + +@[simp] theorem blockMatrixOfCoeff_matTranspose_lowerLeft {d : ℕ} (A : Mat d) : + (blockMatrixOfCoeff (matTranspose A)).lowerLeft = -(blockMatrixOfCoeff A).lowerLeft := by + change + -((symmPart (matTranspose A))⁻¹ * skewPart (matTranspose A)) = + -(-((symmPart A)⁻¹ * skewPart A)) + rw [symmPart_matTranspose, skewPart_matTranspose] + simp + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockMatrixProperties.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockMatrixProperties.lean new file mode 100644 index 0000000000..1ff2b73e94 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockMatrixProperties.lean @@ -0,0 +1,881 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions + +/-! # Block Matrix Properties -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Phase-1 structural bookkeeping for the canonical coarse block matrices. + +This file implements the first deterministic slice from +internal planning notes. +It focuses on the algebraic bookkeeping around the Chapter-2 note label +`l.block.coarse.matrices.basic.definitions`: + +- expose the blocks of `coarseBlockMatrix U a`; +- record the reflection identity defining `coarseStarredBlockMatrixInv U a`; +- package the canonical deterministic block candidates built from + `sigmaStarInvCoarse`, `sigmaStarInvKappaCoarse`, `kappaCoarse`, and + `sigmaCoarse`; +- relate those canonical candidates to arbitrary deterministic witness data + once the defining hypotheses are available. + +This file deliberately avoids the heavier variational proofs reserved for later +deterministic modules. +-/ + +/-- Phase-1 bookkeeping for the upper-left block of the canonical coarse +matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperLeft_apply {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : + (coarseBlockMatrix U a).upperLeft i j = + if i = j then + 2 * Mu U (Pi.single i 1, 0) a + else + Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a + - Mu U (Pi.single i 1, 0) a + - Mu U (Pi.single j 1, 0) a := by + by_cases h : i = j + · subst j + show + (if (Sum.inl i : BlockCoord d) = Sum.inl i then + 2 * Mu U (blockBasis (Sum.inl i)) a + else + Mu U (blockBasis (Sum.inl i) + blockBasis (Sum.inl i)) a + - Mu U (blockBasis (Sum.inl i)) a + - Mu U (blockBasis (Sum.inl i)) a) = + if i = i then + 2 * Mu U (Pi.single i 1, 0) a + else + Mu U ((Pi.single i 1, 0) + (Pi.single i 1, 0)) a + - Mu U (Pi.single i 1, 0) a + - Mu U (Pi.single i 1, 0) a + simp [blockBasis] + · have hsum : (Sum.inl i : BlockCoord d) ≠ Sum.inl j := by + simpa using h + show + (if (Sum.inl i : BlockCoord d) = Sum.inl j then + 2 * Mu U (blockBasis (Sum.inl i)) a + else + Mu U (blockBasis (Sum.inl i) + blockBasis (Sum.inl j)) a + - Mu U (blockBasis (Sum.inl i)) a + - Mu U (blockBasis (Sum.inl j)) a) = + if i = j then + 2 * Mu U (Pi.single i 1, 0) a + else + Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a + - Mu U (Pi.single i 1, 0) a + - Mu U (Pi.single j 1, 0) a + simp [blockBasis, h, hsum] + +/-- Phase-1 bookkeeping for the upper-right block of the canonical coarse +matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperRight_apply {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : + (coarseBlockMatrix U a).upperRight i j = + Mu U ((Pi.single i 1, 0) + (0, Pi.single j 1)) a + - Mu U (Pi.single i 1, 0) a + - Mu U (0, Pi.single j 1) a := by + rfl + +/-- Phase-1 bookkeeping for the lower-left block of the canonical coarse +matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerLeft_apply {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : + (coarseBlockMatrix U a).lowerLeft i j = + Mu U ((0, Pi.single i 1) + (Pi.single j 1, 0)) a + - Mu U (0, Pi.single i 1) a + - Mu U (Pi.single j 1, 0) a := by + rfl + +/-- Phase-1 bookkeeping for the lower-right block of the canonical coarse +matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerRight_apply {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : + (coarseBlockMatrix U a).lowerRight i j = + if i = j then + 2 * Mu U (0, Pi.single i 1) a + else + Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a + - Mu U (0, Pi.single i 1) a + - Mu U (0, Pi.single j 1) a := by + by_cases h : i = j + · subst j + show + (if (Sum.inr i : BlockCoord d) = Sum.inr i then + 2 * Mu U (blockBasis (Sum.inr i)) a + else + Mu U (blockBasis (Sum.inr i) + blockBasis (Sum.inr i)) a + - Mu U (blockBasis (Sum.inr i)) a + - Mu U (blockBasis (Sum.inr i)) a) = + if i = i then + 2 * Mu U (0, Pi.single i 1) a + else + Mu U ((0, Pi.single i 1) + (0, Pi.single i 1)) a + - Mu U (0, Pi.single i 1) a + - Mu U (0, Pi.single i 1) a + simp [blockBasis] + · have hsum : (Sum.inr i : BlockCoord d) ≠ Sum.inr j := by + simpa using h + show + (if (Sum.inr i : BlockCoord d) = Sum.inr j then + 2 * Mu U (blockBasis (Sum.inr i)) a + else + Mu U (blockBasis (Sum.inr i) + blockBasis (Sum.inr j)) a + - Mu U (blockBasis (Sum.inr i)) a + - Mu U (blockBasis (Sum.inr j)) a) = + if i = j then + 2 * Mu U (0, Pi.single i 1) a + else + Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a + - Mu U (0, Pi.single i 1) a + - Mu U (0, Pi.single j 1) a + simp [blockBasis, h, hsum] + +/-- Phase-1 bookkeeping for the diagonal entries of the upper-left block of the +canonical coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperLeft_apply_diag {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i : Fin d) : + (coarseBlockMatrix U a).upperLeft i i = 2 * Mu U (Pi.single i 1, 0) a := by + simpa using coarseBlockMatrix_upperLeft_apply U a i i + +/-- Phase-1 bookkeeping for the off-diagonal entries of the upper-left block of +the canonical coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperLeft_apply_offDiag {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {i j : Fin d} (hij : i ≠ j) : + (coarseBlockMatrix U a).upperLeft i j = + Mu U ((Pi.single i 1, 0) + (Pi.single j 1, 0)) a + - Mu U (Pi.single i 1, 0) a + - Mu U (Pi.single j 1, 0) a := by + simpa [hij] using coarseBlockMatrix_upperLeft_apply U a i j + +/-- Phase-1 bookkeeping for the diagonal entries of the lower-right block of +the canonical coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerRight_apply_diag {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (i : Fin d) : + (coarseBlockMatrix U a).lowerRight i i = 2 * Mu U (0, Pi.single i 1) a := by + simpa using coarseBlockMatrix_lowerRight_apply U a i i + +/-- Phase-1 bookkeeping for the off-diagonal entries of the lower-right block +of the canonical coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerRight_apply_offDiag {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {i j : Fin d} (hij : i ≠ j) : + (coarseBlockMatrix U a).lowerRight i j = + Mu U ((0, Pi.single i 1) + (0, Pi.single j 1)) a + - Mu U (0, Pi.single i 1) a + - Mu U (0, Pi.single j 1) a := by + simpa [hij] using coarseBlockMatrix_lowerRight_apply U a i j + +@[simp] theorem coarseStarredBlockMatrixInv_eq_blockReflect {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + coarseStarredBlockMatrixInv U a = blockReflect (coarseBlockMatrix U a) := + rfl + +/-! +Deterministic bookkeeping lemmas for the canonical coarse matrices. + +This theorem layer packages the note-facing block matrices built from the +current canonical deterministic quantities and records the equalities they +satisfy once the relevant witness hypotheses are available. +-/ + +/-- The note-faithful coarse block matrix attached to deterministic data +`(sigma, sigmaStar, kappa)`. -/ +noncomputable def blockMatrixOfDeterministicData {d : ℕ} + (sigma sigmaStar kappa : Mat d) : BlockMat d := + { upperLeft := bCoarse sigma sigmaStar kappa + upperRight := -((matTranspose kappa) * sigmaStar⁻¹) + lowerLeft := -(sigmaStar⁻¹ * kappa) + lowerRight := sigmaStar⁻¹ } + +@[simp] theorem blockMatrixOfDeterministicData_upperLeft {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperLeft = + bCoarse sigma sigmaStar kappa := + rfl + +@[simp] theorem blockMatrixOfDeterministicData_upperRight {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperRight = + -((matTranspose kappa) * sigmaStar⁻¹) := + rfl + +@[simp] theorem blockMatrixOfDeterministicData_lowerLeft {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerLeft = + -(sigmaStar⁻¹ * kappa) := + rfl + +@[simp] theorem blockMatrixOfDeterministicData_lowerRight {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerRight = + sigmaStar⁻¹ := + rfl + +theorem blockMatrixOfDeterministicData_upperLeft_smul {d : ℕ} + {sigma sigmaStar kappa : Mat d} (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (blockMatrixOfDeterministicData (lam • sigma) (lam • sigmaStar) (lam • kappa)).upperLeft = + lam • (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperLeft := by + simp [blockMatrixOfDeterministicData, bCoarse_smul hdet hlam] + +theorem blockMatrixOfDeterministicData_upperRight_smul {d : ℕ} + {sigma sigmaStar kappa : Mat d} (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (blockMatrixOfDeterministicData (lam • sigma) (lam • sigmaStar) (lam • kappa)).upperRight = + (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperRight := by + rw [blockMatrixOfDeterministicData_upperRight, blockMatrixOfDeterministicData_upperRight] + congr 1 + have htranspose : matTranspose (lam • kappa) = lam • matTranspose kappa := by + simp [matTranspose] + rw [htranspose, nonsing_inv_smul lam hlam.ne' hdet] + simp [smul_smul, inv_mul_cancel₀ hlam.ne'] + +theorem blockMatrixOfDeterministicData_lowerLeft_smul {d : ℕ} + {sigma sigmaStar kappa : Mat d} (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (blockMatrixOfDeterministicData (lam • sigma) (lam • sigmaStar) (lam • kappa)).lowerLeft = + (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerLeft := by + rw [blockMatrixOfDeterministicData_lowerLeft, blockMatrixOfDeterministicData_lowerLeft] + congr 1 + rw [nonsing_inv_smul lam hlam.ne' hdet, smul_mul_assoc] + simp [smul_smul, inv_mul_cancel₀ hlam.ne'] + +theorem blockMatrixOfDeterministicData_lowerRight_smul {d : ℕ} + {sigma sigmaStar kappa : Mat d} (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (blockMatrixOfDeterministicData (lam • sigma) (lam • sigmaStar) (lam • kappa)).lowerRight = + lam⁻¹ • (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerRight := by + simp [blockMatrixOfDeterministicData, nonsing_inv_smul lam hlam.ne' hdet] + +/-- The reflected note-faithful starred inverse block matrix attached to +deterministic data `(sigma, sigmaStar, kappa)`. -/ +noncomputable def starredBlockMatrixInvOfDeterministicData {d : ℕ} + (sigma sigmaStar kappa : Mat d) : BlockMat d := + blockReflect (blockMatrixOfDeterministicData sigma sigmaStar kappa) + +@[simp] theorem starredBlockMatrixInvOfDeterministicData_eq_blockReflect {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa = + blockReflect (blockMatrixOfDeterministicData sigma sigmaStar kappa) := + rfl + +@[simp] theorem starredBlockMatrixInvOfDeterministicData_upperLeft {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa).upperLeft = + sigmaStar⁻¹ := + rfl + +@[simp] theorem starredBlockMatrixInvOfDeterministicData_upperRight {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa).upperRight = + -(sigmaStar⁻¹ * kappa) := + rfl + +@[simp] theorem starredBlockMatrixInvOfDeterministicData_lowerLeft {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa).lowerLeft = + -((matTranspose kappa) * sigmaStar⁻¹) := + rfl + +@[simp] theorem starredBlockMatrixInvOfDeterministicData_lowerRight {d : ℕ} + (sigma sigmaStar kappa : Mat d) : + (starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa).lowerRight = + bCoarse sigma sigmaStar kappa := + rfl + +/-- The coarse block candidate built from the canonical deterministic coarse +pieces already defined in `Definitions.lean`. -/ +noncomputable def deterministicCoarseBlockMatrix {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : BlockMat d := + { upperLeft := sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a + upperRight := -((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a) + lowerLeft := -(sigmaStarInvKappaCoarse U a) + lowerRight := sigmaStarInvCoarse U a } + +@[simp] theorem deterministicCoarseBlockMatrix_upperLeft {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicCoarseBlockMatrix U a).upperLeft = + sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a := + rfl + +@[simp] theorem deterministicCoarseBlockMatrix_upperRight {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicCoarseBlockMatrix U a).upperRight = + -((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a) := + rfl + +@[simp] theorem deterministicCoarseBlockMatrix_lowerLeft {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicCoarseBlockMatrix U a).lowerLeft = + -(sigmaStarInvKappaCoarse U a) := + rfl + +@[simp] theorem deterministicCoarseBlockMatrix_lowerRight {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicCoarseBlockMatrix U a).lowerRight = + sigmaStarInvCoarse U a := + rfl + +/-- The reflected starred inverse block candidate built from the canonical +deterministic coarse pieces. -/ +noncomputable def deterministicStarredBlockMatrixInv {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : BlockMat d := + blockReflect (deterministicCoarseBlockMatrix U a) + +@[simp] theorem deterministicStarredBlockMatrixInv_eq_blockReflect {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + deterministicStarredBlockMatrixInv U a = + blockReflect (deterministicCoarseBlockMatrix U a) := + rfl + +@[simp] theorem deterministicStarredBlockMatrixInv_upperLeft {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicStarredBlockMatrixInv U a).upperLeft = sigmaStarInvCoarse U a := + rfl + +@[simp] theorem deterministicStarredBlockMatrixInv_upperRight {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicStarredBlockMatrixInv U a).upperRight = + -(sigmaStarInvKappaCoarse U a) := + rfl + +@[simp] theorem deterministicStarredBlockMatrixInv_lowerLeft {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicStarredBlockMatrixInv U a).lowerLeft = + -((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a) := + rfl + +@[simp] theorem deterministicStarredBlockMatrixInv_lowerRight {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) : + (deterministicStarredBlockMatrixInv U a).lowerRight = + sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a := + rfl + +theorem deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + deterministicCoarseBlockMatrix U a = + blockMatrixOfDeterministicData sigma sigmaStar kappa := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · simp [deterministicCoarseBlockMatrix, blockMatrixOfDeterministicData, bCoarse, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + · simp [deterministicCoarseBlockMatrix, blockMatrixOfDeterministicData, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + · simp [deterministicCoarseBlockMatrix, blockMatrixOfDeterministicData, + sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + · simp [deterministicCoarseBlockMatrix, blockMatrixOfDeterministicData, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + +theorem deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + deterministicCoarseBlockMatrix U a = + blockMatrixOfDeterministicData sigma sigmaStar kappa := + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet + +theorem deterministicStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + deterministicStarredBlockMatrixInv U a = + starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa := by + rw [deterministicStarredBlockMatrixInv, starredBlockMatrixInvOfDeterministicData, + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + +theorem deterministicStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + deterministicStarredBlockMatrixInv U a = + starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa := + deterministicStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet + +theorem coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + coarseBlockMatrix U a = deterministicCoarseBlockMatrix U a := by + symm + exact eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA + +theorem coarseBlockMatrix_eq_deterministicCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + coarseBlockMatrix U a = deterministicCoarseBlockMatrix U a := + coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA + +theorem coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + coarseBlockMatrix U a = blockMatrixOfDeterministicData sigma sigmaStar kappa := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA, + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + +/-- Canonical upper-left block formula for `\mathbf A(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseBlockMatrix_upperLeft_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).upperLeft = + sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a := by + simpa using + congrArg BlockMat.upperLeft + (coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA) + +/-- Canonical upper-right block formula for `\mathbf A(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseBlockMatrix_upperRight_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).upperRight = + -((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a) := by + simpa using + congrArg BlockMat.upperRight + (coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA) + +/-- Canonical lower-left block formula for `\mathbf A(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseBlockMatrix_lowerLeft_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).lowerLeft = -(sigmaStarInvKappaCoarse U a) := by + simpa using + congrArg BlockMat.lowerLeft + (coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA) + +/-- Canonical lower-right block formula for `\mathbf A(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseBlockMatrix_lowerRight_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := by + simpa using + congrArg BlockMat.lowerRight + (coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA) + +/-- Public upper-left block formula for the coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseBlockMatrix U a).upperLeft = bCoarse sigma sigmaStar kappa := by + simpa using + congrArg BlockMat.upperLeft + (coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public upper-right block formula for the coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_upperRight_eq_neg_transpose_kappa_mul_sigmaStar_inv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseBlockMatrix U a).upperRight = -((matTranspose kappa) * sigmaStar⁻¹) := by + simpa using + congrArg BlockMat.upperRight + (coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public lower-left block formula for the coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerLeft_eq_neg_sigmaStar_inv_mul_kappa_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseBlockMatrix U a).lowerLeft = -(sigmaStar⁻¹ * kappa) := by + simpa using + congrArg BlockMat.lowerLeft + (coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public lower-right block formula for the coarse matrix `\mathbf A(U; a)`. -/ +theorem coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseBlockMatrix U a).lowerRight = sigmaStar⁻¹ := by + simpa using + congrArg BlockMat.lowerRight + (coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public formula for the first component of `\mathbf A(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseBlockMatrix_fst_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (blockMatVecMul (coarseBlockMatrix U a) (p, q)).1 = + matVecMul sigma p - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + calc + (blockMatVecMul (coarseBlockMatrix U a) (p, q)).1 = + matVecMul (bCoarse sigma sigmaStar kappa) p + + matVecMul (-((matTranspose kappa) * sigmaStar⁻¹)) q := by + rw [blockMatVecMul_fst] + rw [coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hA hS hK hSigma hdet, + coarseBlockMatrix_upperRight_eq_neg_transpose_kappa_mul_sigmaStar_inv_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + _ = matVecMul sigma p - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + unfold bCoarse + rw [add_matVecMul] + ext i + simp [sub_eq_add_neg, matVecMul_add, matVecMul_mul, neg_matVecMul, + matVecMul_neg, Matrix.mul_assoc] + ring + +/-- Public formula for the second component of `\mathbf A(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseBlockMatrix_snd_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (blockMatVecMul (coarseBlockMatrix U a) (p, q)).2 = + matVecMul sigmaStar⁻¹ (q - matVecMul kappa p) := by + rw [blockMatVecMul_snd] + rw [coarseBlockMatrix_lowerLeft_eq_neg_sigmaStar_inv_mul_kappa_of_isCoarseBlockMatrix + hA hS hK hSigma hdet, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + ext i + simp [sub_eq_add_neg, matVecMul_add, matVecMul_mul, neg_matVecMul, matVecMul_neg] + ring + +/-- Public formula for `\mathbf A(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseBlockMatrix_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + blockMatVecMul (coarseBlockMatrix U a) (p, q) = + (matVecMul sigma p - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)), + matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + ext i + · simpa using congrFun + (blockMatVecMul_coarseBlockMatrix_fst_of_isCoarseBlockMatrix + hA hS hK hSigma hdet p q) i + · simpa using congrFun + (blockMatVecMul_coarseBlockMatrix_snd_of_isCoarseBlockMatrix + hA hS hK hSigma hdet p q) i + +theorem coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + coarseStarredBlockMatrixInv U a = deterministicStarredBlockMatrixInv U a := by + rw [coarseStarredBlockMatrixInv, deterministicStarredBlockMatrixInv, + coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + +theorem coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + coarseStarredBlockMatrixInv U a = deterministicStarredBlockMatrixInv U a := + coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA + +theorem coarseStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + coarseStarredBlockMatrixInv U a = + starredBlockMatrixInvOfDeterministicData sigma sigmaStar kappa := by + rw [coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA, + deterministicStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + +/-- If the pure-flux slice of `\mu` matches the pure-flux slice of +`\mathcal J`, then the lower-right block of the canonical coarse block matrix +realizes the canonical `\sigma_*^{-1}(U; a)` data. -/ +theorem isSigmaStarInvCoarse_coarseBlockMatrix_lowerRight_of_mu_zero_right_eq_responseJ_zero + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) : + IsSigmaStarInvCoarse U a (coarseBlockMatrix U a).lowerRight := by + have hA : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix hex + refine ⟨?_, ?_⟩ + · ext i j + simpa [Matrix.transpose, blockMatEntry] using (hA.1 (Sum.inr i) (Sum.inr j)).symm + · intro q + calc + ResponseJ U 0 q a = Mu U (0, q) a := (hMuResp q).symm + _ = (1 / 2 : ℝ) * blockVecDot (0, q) (blockMatVecMul (coarseBlockMatrix U a) (0, q)) := by + simpa using hA.2 (0, q) + _ = (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + +/-- If the pure-flux slice of `\mu` matches the pure-flux slice of +`\mathcal J`, then the lower-right block of the canonical coarse block matrix +is the canonical `\sigma_*^{-1}(U; a)`. -/ +theorem coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := + eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse + (isSigmaStarInvCoarse_coarseBlockMatrix_lowerRight_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuResp) + +/-- If the pure-flux slice of `\mu` matches the pure-flux slice of +`\mathcal J`, then the upper-left block of `\mathbf A_*^{-1}(U; a)` is the +canonical `\sigma_*^{-1}(U; a)`. -/ +theorem coarseStarredBlockMatrixInv_upperLeft_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) : + (coarseStarredBlockMatrixInv U a).upperLeft = sigmaStarInvCoarse U a := by + rw [coarseStarredBlockMatrixInv_eq_blockReflect] + simpa using + coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuResp + +/-- Canonical upper-left block formula for `\mathbf A_*^{-1}(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseStarredBlockMatrixInv_upperLeft_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseStarredBlockMatrixInv U a).upperLeft = sigmaStarInvCoarse U a := by + simpa using + congrArg BlockMat.upperLeft + (coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA) + +/-- Canonical upper-right block formula for `\mathbf A_*^{-1}(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseStarredBlockMatrixInv_upperRight_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseStarredBlockMatrixInv U a).upperRight = -(sigmaStarInvKappaCoarse U a) := by + simpa using + congrArg BlockMat.upperRight + (coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA) + +/-- Canonical lower-left block formula for `\mathbf A_*^{-1}(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseStarredBlockMatrixInv_lowerLeft_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseStarredBlockMatrixInv U a).lowerLeft = + -((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a) := by + simpa using + congrArg BlockMat.lowerLeft + (coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA) + +/-- Canonical lower-right block formula for `\mathbf A_*^{-1}(U; a)` once the +deterministic coarse candidate is identified as coarse. -/ +theorem coarseStarredBlockMatrixInv_lowerRight_eq_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseStarredBlockMatrixInv U a).lowerRight = + sigmaCoarse U a + + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a := by + simpa using + congrArg BlockMat.lowerRight + (coarseStarredBlockMatrixInv_eq_deterministicStarredBlockMatrixInv_of_isCoarseBlockMatrix hA) + +/-- Public upper-left block formula for the reflected coarse matrix +`\mathbf A_*^{-1}(U; a)`. -/ +theorem coarseStarredBlockMatrixInv_upperLeft_eq_sigmaStar_inv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseStarredBlockMatrixInv U a).upperLeft = sigmaStar⁻¹ := by + simpa using + congrArg BlockMat.upperLeft + (coarseStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public upper-right block formula for the reflected coarse matrix +`\mathbf A_*^{-1}(U; a)`. -/ +theorem coarseStarredBlockMatrixInv_upperRight_eq_neg_sigmaStar_inv_mul_kappa_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseStarredBlockMatrixInv U a).upperRight = -(sigmaStar⁻¹ * kappa) := by + simpa using + congrArg BlockMat.upperRight + (coarseStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public lower-left block formula for the reflected coarse matrix +`\mathbf A_*^{-1}(U; a)`. -/ +theorem coarseStarredBlockMatrixInv_lowerLeft_eq_neg_transpose_kappa_mul_sigmaStar_inv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseStarredBlockMatrixInv U a).lowerLeft = + -((matTranspose kappa) * sigmaStar⁻¹) := by + simpa using + congrArg BlockMat.lowerLeft + (coarseStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public lower-right block formula for the reflected coarse matrix +`\mathbf A_*^{-1}(U; a)`. -/ +theorem coarseStarredBlockMatrixInv_lowerRight_eq_bCoarse_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (coarseStarredBlockMatrixInv U a).lowerRight = bCoarse sigma sigmaStar kappa := by + simpa using + congrArg BlockMat.lowerRight + (coarseStarredBlockMatrixInv_eq_starredBlockMatrixInvOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet) + +/-- Public formula for the first component of `\mathbf A_*^{-1}(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseStarredBlockMatrixInv_fst_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (blockMatVecMul (coarseStarredBlockMatrixInv U a) (p, q)).1 = + matVecMul sigmaStar⁻¹ (p - matVecMul kappa q) := by + rw [blockMatVecMul_fst] + rw [coarseStarredBlockMatrixInv_upperLeft_eq_sigmaStar_inv_of_isCoarseBlockMatrix + hA hS hK hSigma hdet, + coarseStarredBlockMatrixInv_upperRight_eq_neg_sigmaStar_inv_mul_kappa_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + ext i + simp [sub_eq_add_neg, matVecMul_add, matVecMul_mul, neg_matVecMul, matVecMul_neg] + +/-- Public formula for the second component of `\mathbf A_*^{-1}(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseStarredBlockMatrixInv_snd_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (blockMatVecMul (coarseStarredBlockMatrixInv U a) (p, q)).2 = + matVecMul sigma q - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (p - matVecMul kappa q)) := by + calc + (blockMatVecMul (coarseStarredBlockMatrixInv U a) (p, q)).2 = + matVecMul (-((matTranspose kappa) * sigmaStar⁻¹)) p + + matVecMul (bCoarse sigma sigmaStar kappa) q := by + rw [blockMatVecMul_snd] + rw [coarseStarredBlockMatrixInv_lowerLeft_eq_neg_transpose_kappa_mul_sigmaStar_inv_of_isCoarseBlockMatrix + hA hS hK hSigma hdet, + coarseStarredBlockMatrixInv_lowerRight_eq_bCoarse_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + _ = matVecMul sigma q - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (p - matVecMul kappa q)) := by + unfold bCoarse + rw [add_matVecMul] + ext i + simp [sub_eq_add_neg, matVecMul_add, matVecMul_mul, neg_matVecMul, + matVecMul_neg, Matrix.mul_assoc] + ring + +/-- Public formula for `\mathbf A_*^{-1}(U; a) (p, q)`. -/ +theorem blockMatVecMul_coarseStarredBlockMatrixInv_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + blockMatVecMul (coarseStarredBlockMatrixInv U a) (p, q) = + (matVecMul sigmaStar⁻¹ (p - matVecMul kappa q), + matVecMul sigma q - + matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (p - matVecMul kappa q))) := by + ext i + · simpa using congrFun + (blockMatVecMul_coarseStarredBlockMatrixInv_fst_of_isCoarseBlockMatrix + hA hS hK hSigma hdet p q) i + · simpa using congrFun + (blockMatVecMul_coarseStarredBlockMatrixInv_snd_of_isCoarseBlockMatrix + hA hS hK hSigma hdet p q) i + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse.lean new file mode 100644 index 0000000000..9d5ee6d146 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities + +/-! # Block Response -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities.lean new file mode 100644 index 0000000000..f6a153f989 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.Helpers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.MainEqualities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.LowerImageNamespace + +/-! +# BlockResponse Equalities (aggregate re-export) + +Previously a 1490-line monolithic module; now split along thematic +boundaries into the three files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/Helpers.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/Helpers.lean new file mode 100644 index 0000000000..75a9b1d8c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/Helpers.lean @@ -0,0 +1,658 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation + +/-! # Helpers -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Equalities -- helpers and existence / volumeAverage + +Private blockResponse_upper-add / upper-sub-flux equalities, the big +exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential +theorem, and the matching volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum +theorem. +-/ + +private theorem blockResponse_upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {X : BlockState d} + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} (hx : x ∈ U) : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + X.flux x = + matVecMul (a x) + (X.potential x + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + let lower := + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hsnd : + lower = + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) (p := X.potential x) (q := X.flux x) + have hfst : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 = + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower := by + simpa [lower, hsnd] using! + blockMatVecMul_blockMatrixOfCoeff_fst + (A := a x) (p := X.potential x) (q := X.flux x) + have hflux : + X.flux x = + matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x) := by + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (p := X.potential x) (q := X.flux x) + have hsplit : a x = symmPart (a x) + skewPart (a x) := by + ext i j + simp [symmPart, skewPart, sub_eq_add_neg] + ring + calc + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + X.flux x = + (matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower) + + (matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x)) := by + rw [hfst, hflux] + _ = matVecMul (symmPart (a x)) (X.potential x + lower) + + matVecMul (skewPart (a x)) (X.potential x + lower) := by + rw [matVecMul_add, matVecMul_add] + abel + _ = matVecMul ((symmPart (a x)) + skewPart (a x)) (X.potential x + lower) := by + rw [add_matVecMul] + _ = matVecMul (a x) (X.potential x + lower) := by + rw [← hsplit] + _ = matVecMul (a x) + (X.potential x + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + rfl + +private theorem blockResponse_upper_sub_flux_eq_matVecMul_adjoint_potential_sub_lowerImage_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {X : BlockState d} + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} (hx : x ∈ U) : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 - X.flux x = + matVecMul (matTranspose (a x)) + (X.potential x - (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + let lower := + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hsnd : + lower = + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) (p := X.potential x) (q := X.flux x) + have hfst : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 = + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower := by + simpa [lower, hsnd] using! + blockMatVecMul_blockMatrixOfCoeff_fst + (A := a x) (p := X.potential x) (q := X.flux x) + have hflux : + X.flux x = + matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x) := by + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (p := X.potential x) (q := X.flux x) + have hsplit : + matTranspose (a x) = symmPart (a x) - skewPart (a x) := by + ext i j + simp [symmPart, skewPart, matTranspose, sub_eq_add_neg] + ring + calc + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 - X.flux x = + (matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower) - + (matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x)) := by + rw [hfst, hflux] + _ = matVecMul (symmPart (a x)) (X.potential x - lower) + + matVecMul (-(skewPart (a x))) (X.potential x - lower) := by + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, neg_matVecMul] + abel + _ = matVecMul (symmPart (a x) + -(skewPart (a x))) (X.potential x - lower) := by + rw [add_matVecMul] + _ = matVecMul (matTranspose (a x)) (X.potential x - lower) := by + simpa [sub_eq_add_neg] using + congrArg (fun A => matVecMul A (X.potential x - lower)) hsplit.symm + _ = matVecMul (matTranspose (a x)) + (X.potential x - (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + rfl + +theorem exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {X : BlockState d} {lam Lam : ℝ} (hU : MeasurableSet U) + (hX : BlockResponseSpace a U X) + (hLower : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] X.eval := by + rcases hX.1 with ⟨φ, hφ⟩ + rcases hLower with ⟨ψ, hψ⟩ + let upper : Vec d → Vec d := fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + let lower : Vec d → Vec d := fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + let ξ : Vec d → Vec d := fun x => φ.grad x + ψ.grad x + let η : Vec d → Vec d := fun x => φ.grad x - ψ.grad x + have hLowerPot : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := ⟨ψ, hψ⟩ + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have hφL2 : MemVectorL2 U φ.grad := φ.grad_memVectorL2 + have hψL2 : MemVectorL2 U ψ.grad := ψ.grad_memVectorL2 + have hξL2 : MemVectorL2 U ξ := by + simpa [ξ] using! hφL2.add hψL2 + have hηL2 : MemVectorL2 U η := by + simpa [η, sub_eq_add_neg] using! hφL2.sub hψL2 + have hξPot : IsPotentialOn U ξ := by + simpa [ξ, hφ, hψ] using! isPotentialOn_add hX.1 hLowerPot + have hηPot : IsPotentialOn U η := by + simpa [η, sub_eq_add_neg, hφ, hψ] using! + isPotentialOn_add hX.1 (isPotentialOn_smul hLowerPot (-1 : ℝ)) + have hFluxL2 : MemVectorL2 U X.flux := + blockResponse_flux_memL2_of_lowerImage_isPotential_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerPot hEll + have hAξL2 : MemVectorL2 U (fun x => matVecMul (a x) (ξ x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hξL2 + have hATηL2 : + MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) (η x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj hηL2 + have hUpperEq : + upper =ᵐ[volumeMeasureOn U] fun x => matVecMul (a x) (ξ x) - X.flux x := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + apply (eq_sub_iff_add_eq).2 + simpa [upper, ξ, lower, hφx, hψx, sub_eq_add_neg] using + blockResponse_upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + have hUpperL2 : MemVectorL2 U upper := by + have hUpper' : MemVectorL2 U (fun x => matVecMul (a x) (ξ x) - X.flux x) := by + simpa [sub_eq_add_neg] using! hAξL2.sub hFluxL2 + have hUpperMeas : + MeasureTheory.AEStronglyMeasurable upper (volumeMeasureOn U) := + hUpper'.aestronglyMeasurable.congr hUpperEq.symm + refine hUpper'.congr_norm hUpperMeas ?_ + filter_upwards [hUpperEq] with x hx + simpa using congrArg norm hx.symm + have hFluxInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (X.flux x) (θ.toH1Function.grad x)) U := by + intro θ + exact integrableOn_vecDot_of_memVectorL2 hFluxL2 θ.toH1Function.grad_memVectorL2 + have hUpperInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (upper x) (θ.toH1Function.grad x)) U := by + intro θ + exact integrableOn_vecDot_of_memVectorL2 hUpperL2 θ.toH1Function.grad_memVectorL2 + have hATηEq : + (fun x => matVecMul (matTranspose (a x)) (η x)) =ᵐ[volumeMeasureOn U] + (fun x => upper x - X.flux x) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + simpa [η, hφx, hψx, lower, upper, sub_eq_add_neg] using + (blockResponse_upper_sub_flux_eq_matVecMul_adjoint_potential_sub_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + ).symm + have hξSol : IsSolenoidalOn U (fun x => matVecMul (a x) (ξ x)) := by + intro θ + have hsum : + IsSolenoidalOn U (fun x => upper x + X.flux x) := + isSolenoidalOn_add + (blockResponse_upperImage_isSolenoidalOn_of_mem_responseSpace (hX := hX)) + hX.2.1 hUpperInt hFluxInt + have hEqInt : + ∫ x in U, vecDot (matVecMul (a x) (ξ x)) (θ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot ((upper x + X.flux x)) (θ.toH1Function.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + have hx' := + blockResponse_upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + simpa [ξ, hφx, hψx, lower, upper, vecDot_add_left] using + congrArg (fun z => vecDot z (θ.toH1Function.grad x)) hx'.symm + rw [hEqInt] + exact hsum θ + have hηSol : IsSolenoidalOn U (fun x => matVecMul (matTranspose (a x)) (η x)) := by + have hNegFluxInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot ((-1 : ℝ) • X.flux x) (θ.toH1Function.grad x)) U := by + intro θ + have hneg : + MeasureTheory.IntegrableOn + (fun x => -(vecDot (X.flux x) (θ.toH1Function.grad x))) U := by + exact (hFluxInt θ).neg + simpa [Pi.smul_apply, vecDot_neg_left] using hneg + intro θ + have hsum : + IsSolenoidalOn U (fun x => upper x + (-1 : ℝ) • X.flux x) := + isSolenoidalOn_add + (blockResponse_upperImage_isSolenoidalOn_of_mem_responseSpace (hX := hX)) + (isSolenoidalOn_smul hX.2.1 (-1 : ℝ)) hUpperInt hNegFluxInt + have hEqInt : + ∫ x in U, vecDot (matVecMul (matTranspose (a x)) (η x)) (θ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (upper x + (-1 : ℝ) • X.flux x) (θ.toH1Function.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU, hATηEq] with x hx hEq + simpa [upper, vecDot_add_left, vecDot_smul_left, sub_eq_add_neg] using + congrArg (fun z => vecDot z (θ.toH1Function.grad x)) hEq + rw [hEqInt] + simpa [Pi.smul_apply, vecDot_add_left, vecDot_smul_left] using hsum θ + let u : AHarmonicFunction a U := + { toH1 := φ + ψ + isHarmonic := by + simpa [ξ] using! And.intro hξPot hξSol } + let v : AHarmonicFunction (Homogenization.adjointCoeffField a) U := + { toH1 := φ + (-1 : ℝ) • ψ + isHarmonic := by + have hηPot' : + IsPotentialOn U ((φ + (-1 : ℝ) • ψ).grad) := by + change IsPotentialOn U (fun x => φ.grad x + (-1 : ℝ) • ψ.grad x) + simpa [η, sub_eq_add_neg, Pi.smul_apply] using hηPot + have hηSol' : + IsSolenoidalOn U + (fun x => + matVecMul ((Homogenization.adjointCoeffField a) x) + ((φ + (-1 : ℝ) • ψ).grad x)) := by + change IsSolenoidalOn U + (fun x => matVecMul (matTranspose (a x)) (φ.grad x + (-1 : ℝ) • ψ.grad x)) + simpa [Homogenization.adjointCoeffField, η, sub_eq_add_neg, Pi.smul_apply] using hηSol + exact ⟨hηPot', hηSol'⟩ } + have hPairPotEqAt : + ∀ x, (blockResponsePairHalfState a u v).potential x = X.potential x := by + intro x + ext i + have hφxi : φ.grad x i = X.potential x i := congrArg (fun z => z i) (congrFun hφ x) + change + (1 / 2 : ℝ) * + ((φ.grad x i + ψ.grad x i) + (φ.grad x i + (-1 : ℝ) * ψ.grad x i)) = + X.potential x i + ring_nf + exact hφxi + have hHalfGradDiffEq : + (fun x => (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x)) = ψ.grad := by + funext x + ext i + change + (1 / 2 : ℝ) * + ((φ.grad x i + ψ.grad x i) - (φ.grad x i + (-1 : ℝ) * ψ.grad x i)) = + ψ.grad x i + ring + have hLowerPair : + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) =ᵐ[volumeMeasureOn U] + ψ.grad := by + exact + (blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + (a := a) hEll u v).trans (Filter.EventuallyEq.of_eq hHalfGradDiffEq) + have hPairFluxEq : + (blockResponsePairHalfState a u v).flux =ᵐ[volumeMeasureOn U] X.flux := by + filter_upwards [MeasureTheory.ae_restrict_mem hU, hLowerPair] with x hx hLowerX + have hψx : ψ.grad x = lower x := congrFun hψ x + have hRecoverPair : + (blockResponsePairHalfState a u v).flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) + + matVecMul (skewPart (a x)) ((blockResponsePairHalfState a u v).potential x) := by + simpa [BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) + (p := (blockResponsePairHalfState a u v).potential x) + (q := (blockResponsePairHalfState a u v).flux x) + have hRecoverX : + X.flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + + matVecMul (skewPart (a x)) (X.potential x) := by + simpa [BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (p := X.potential x) (q := X.flux x) + calc + (blockResponsePairHalfState a u v).flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) + + matVecMul (skewPart (a x)) ((blockResponsePairHalfState a u v).potential x) := hRecoverPair + _ = matVecMul (symmPart (a x)) (ψ.grad x) + matVecMul (skewPart (a x)) (X.potential x) := by + rw [hLowerX, hPairPotEqAt x] + _ = X.flux x := by + symm + simpa [hψx, lower] using hRecoverX + have hPairPotEq : + (blockResponsePairHalfState a u v).potential = X.potential := by + funext x + exact hPairPotEqAt x + have hPairEvalEq : + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] X.eval := by + filter_upwards [hPairFluxEq] with x hflux + exact Prod.ext (congrFun hPairPotEq x) hflux + exact ⟨u, v, hPairEvalEq⟩ + +/-- Preferred convex-domain reverse-inclusion wrapper for response states whose +lower image is known to be `L²`. This is the note-facing way to reconstruct the +primal/adjoint harmonic half-pair from a block-response state without manually +supplying a lower-image potential representative. -/ +theorem exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_memVectorL2_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {X : BlockState d} (hConv : IsOpenBoundedConvexDomain U) + (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] X.eval := by + have hLower : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := + blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_isOpenBoundedConvexDomain + (U := U) hConv hX hLowerL2 + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hConv.isOpen.measurableSet hX hLower hEll + +/-- Preferred convex-domain reverse-inclusion wrapper for integrable response +states. Since `BlockResponseIntegrabilityData` supplies the flux `L²` control, +this packages the lower-image promotion and half-pair reconstruction into one +standalone theorem. -/ +theorem exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {X : BlockState d} (hConv : IsOpenBoundedConvexDomain U) + (hX : BlockResponseSpace a U X) + (hInt : BlockResponseIntegrabilityData U a X) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] X.eval := by + have hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := + blockResponse_lowerImage_memVectorL2_of_flux_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX hInt.flux_memL2 hEll + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_memVectorL2_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hX hLowerL2 hEll + +theorem volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {X : BlockState d} {lam Lam : ℝ} (hU : MeasurableSet U) + (hX : BlockResponseSpace a U X) + (hLower : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + volumeAverage U (blockResponseIntegrand a (p, q) (qStar, pStar) X) = + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + rcases hX.1 with ⟨φ, hφ⟩ + rcases hLower with ⟨ψ, hψ⟩ + let upper : Vec d → Vec d := fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + let lower : Vec d → Vec d := fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + let ξ : Vec d → Vec d := fun x => φ.grad x + ψ.grad x + let η : Vec d → Vec d := fun x => φ.grad x - ψ.grad x + have hLowerPot : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := ⟨ψ, hψ⟩ + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have hφL2 : MemVectorL2 U φ.grad := φ.grad_memVectorL2 + have hψL2 : MemVectorL2 U ψ.grad := ψ.grad_memVectorL2 + have hξL2 : MemVectorL2 U ξ := by + simpa [ξ] using! hφL2.add hψL2 + have hηL2 : MemVectorL2 U η := by + simpa [η, sub_eq_add_neg] using! hφL2.sub hψL2 + have hξPot : IsPotentialOn U ξ := by + simpa [ξ, hφ, hψ] using! isPotentialOn_add hX.1 hLowerPot + have hηPot : IsPotentialOn U η := by + simpa [η, sub_eq_add_neg, hφ, hψ] using! + isPotentialOn_add hX.1 (isPotentialOn_smul hLowerPot (-1 : ℝ)) + have hFluxL2 : MemVectorL2 U X.flux := + blockResponse_flux_memL2_of_lowerImage_isPotential_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerPot hEll + have hAξL2 : MemVectorL2 U (fun x => matVecMul (a x) (ξ x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hξL2 + have hATηL2 : + MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) (η x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj hηL2 + have hUpperEq : + upper =ᵐ[volumeMeasureOn U] fun x => matVecMul (a x) (ξ x) - X.flux x := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + apply (eq_sub_iff_add_eq).2 + simpa [upper, ξ, lower, hφx, hψx, sub_eq_add_neg] using + blockResponse_upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + have hUpperL2 : MemVectorL2 U upper := by + have hUpper' : MemVectorL2 U (fun x => matVecMul (a x) (ξ x) - X.flux x) := by + simpa [sub_eq_add_neg] using! hAξL2.sub hFluxL2 + have hUpperMeas : + MeasureTheory.AEStronglyMeasurable upper (volumeMeasureOn U) := + hUpper'.aestronglyMeasurable.congr hUpperEq.symm + refine hUpper'.congr_norm hUpperMeas ?_ + filter_upwards [hUpperEq] with x hx + simpa using congrArg norm hx.symm + have hFluxInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (X.flux x) (θ.toH1Function.grad x)) U := by + intro θ + exact integrableOn_vecDot_of_memVectorL2 hFluxL2 θ.toH1Function.grad_memVectorL2 + have hUpperInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (upper x) (θ.toH1Function.grad x)) U := by + intro θ + exact integrableOn_vecDot_of_memVectorL2 hUpperL2 θ.toH1Function.grad_memVectorL2 + have hATηEq : + (fun x => matVecMul (matTranspose (a x)) (η x)) =ᵐ[volumeMeasureOn U] + (fun x => upper x - X.flux x) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + simpa [η, hφx, hψx, lower, upper, sub_eq_add_neg] using + (blockResponse_upper_sub_flux_eq_matVecMul_adjoint_potential_sub_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + ).symm + have hξSol : IsSolenoidalOn U (fun x => matVecMul (a x) (ξ x)) := by + intro θ + have hsum : + IsSolenoidalOn U (fun x => upper x + X.flux x) := + isSolenoidalOn_add + (blockResponse_upperImage_isSolenoidalOn_of_mem_responseSpace (hX := hX)) + hX.2.1 hUpperInt hFluxInt + have hEqInt : + ∫ x in U, vecDot (matVecMul (a x) (ξ x)) (θ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot ((upper x + X.flux x)) (θ.toH1Function.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + have hφx : φ.grad x = X.potential x := congrFun hφ x + have hψx : ψ.grad x = lower x := congrFun hψ x + have hx' := + blockResponse_upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (X := X) hEll hx + simpa [ξ, hφx, hψx, lower, upper, vecDot_add_left] using + congrArg (fun z => vecDot z (θ.toH1Function.grad x)) hx'.symm + rw [hEqInt] + exact hsum θ + have hηSol : IsSolenoidalOn U (fun x => matVecMul (matTranspose (a x)) (η x)) := by + have hNegFluxInt : + ∀ θ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot ((-1 : ℝ) • X.flux x) (θ.toH1Function.grad x)) U := by + intro θ + have hneg : + MeasureTheory.IntegrableOn + (fun x => -(vecDot (X.flux x) (θ.toH1Function.grad x))) U := by + exact (hFluxInt θ).neg + simpa [Pi.smul_apply, vecDot_neg_left] using hneg + intro θ + have hsum : + IsSolenoidalOn U (fun x => upper x + (-1 : ℝ) • X.flux x) := + isSolenoidalOn_add + (blockResponse_upperImage_isSolenoidalOn_of_mem_responseSpace (hX := hX)) + (isSolenoidalOn_smul hX.2.1 (-1 : ℝ)) hUpperInt hNegFluxInt + have hEqInt : + ∫ x in U, vecDot (matVecMul (matTranspose (a x)) (η x)) (θ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (upper x + (-1 : ℝ) • X.flux x) (θ.toH1Function.grad x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU, hATηEq] with x hx hEq + simpa [upper, vecDot_add_left, vecDot_smul_left, sub_eq_add_neg] using + congrArg (fun z => vecDot z (θ.toH1Function.grad x)) hEq + rw [hEqInt] + simpa [Pi.smul_apply, vecDot_add_left, vecDot_smul_left] using hsum θ + let u : AHarmonicFunction a U := + { toH1 := φ + ψ + isHarmonic := by + simpa [ξ] using! And.intro hξPot hξSol } + let v : AHarmonicFunction (Homogenization.adjointCoeffField a) U := + { toH1 := φ + (-1 : ℝ) • ψ + isHarmonic := by + have hηPot' : + IsPotentialOn U ((φ + (-1 : ℝ) • ψ).grad) := by + change IsPotentialOn U (fun x => φ.grad x + (-1 : ℝ) • ψ.grad x) + simpa [η, sub_eq_add_neg, Pi.smul_apply] using hηPot + have hηSol' : + IsSolenoidalOn U + (fun x => + matVecMul ((Homogenization.adjointCoeffField a) x) + ((φ + (-1 : ℝ) • ψ).grad x)) := by + change IsSolenoidalOn U + (fun x => matVecMul (matTranspose (a x)) (φ.grad x + (-1 : ℝ) • ψ.grad x)) + simpa [Homogenization.adjointCoeffField, η, sub_eq_add_neg, Pi.smul_apply] using hηSol + exact ⟨hηPot', hηSol'⟩ } + have hPairPotEqAt : + ∀ x, (blockResponsePairHalfState a u v).potential x = X.potential x := by + intro x + ext i + have hφxi : φ.grad x i = X.potential x i := congrArg (fun z => z i) (congrFun hφ x) + change + (1 / 2 : ℝ) * + ((φ.grad x i + ψ.grad x i) + (φ.grad x i + (-1 : ℝ) * ψ.grad x i)) = + X.potential x i + ring_nf + exact hφxi + have hHalfGradDiffEq : + (fun x => (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x)) = ψ.grad := by + funext x + ext i + change + (1 / 2 : ℝ) * + ((φ.grad x i + ψ.grad x i) - (φ.grad x i + (-1 : ℝ) * ψ.grad x i)) = + ψ.grad x i + ring + have hLowerPair : + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) =ᵐ[volumeMeasureOn U] + ψ.grad := by + exact + (blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + (a := a) hEll u v).trans (Filter.EventuallyEq.of_eq hHalfGradDiffEq) + have hPairFluxEq : + (blockResponsePairHalfState a u v).flux =ᵐ[volumeMeasureOn U] X.flux := by + filter_upwards [MeasureTheory.ae_restrict_mem hU, hLowerPair] with x hx hLowerX + have hψx : ψ.grad x = lower x := congrFun hψ x + have hRecoverPair : + (blockResponsePairHalfState a u v).flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) + + matVecMul (skewPart (a x)) ((blockResponsePairHalfState a u v).potential x) := by + simpa [BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) + (p := (blockResponsePairHalfState a u v).potential x) + (q := (blockResponsePairHalfState a u v).flux x) + have hRecoverX : + X.flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + + matVecMul (skewPart (a x)) (X.potential x) := by + simpa [BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (p := X.potential x) (q := X.flux x) + calc + (blockResponsePairHalfState a u v).flux x = + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) + + matVecMul (skewPart (a x)) ((blockResponsePairHalfState a u v).potential x) := hRecoverPair + _ = matVecMul (symmPart (a x)) (ψ.grad x) + matVecMul (skewPart (a x)) (X.potential x) := by + rw [hLowerX, hPairPotEqAt x] + _ = X.flux x := by + symm + simpa [hψx, lower] using hRecoverX + have hPairPotEq : + (blockResponsePairHalfState a u v).potential = X.potential := by + funext x + exact hPairPotEqAt x + have hPairEvalEq : + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] X.eval := by + filter_upwards [hPairFluxEq] with x hflux + exact Prod.ext (congrFun hPairPotEq x) hflux + have hIntegrandEq : + blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v) =ᵐ[volumeMeasureOn U] + blockResponseIntegrand a (p, q) (qStar, pStar) X := by + filter_upwards [hPairEvalEq] with x hx + simpa [blockResponseIntegrand, blockEnergyDensity] using congrArg + (fun z => -(1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z) + - blockVecDot (p, q) (blockMatVecMul (blockCoeffField a x) z) + + blockVecDot (qStar, pStar) z) hx + refine ⟨u, v, ?_⟩ + have hAvgEq : + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v)) = + volumeAverage U (blockResponseIntegrand a (p, q) (qStar, pStar) X) := by + unfold volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae hIntegrandEq + rw [← hAvgEq] + exact + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/LowerImageNamespace.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/LowerImageNamespace.lean new file mode 100644 index 0000000000..b66e022e7a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/LowerImageNamespace.lean @@ -0,0 +1,627 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.MainEqualities + +/-! # Lower Image Namespace -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Equalities -- BlockResponseLowerImageMemVectorL2Data namespace + +blockJ le / eq half responseJ adjoint sum in the +BlockResponseLowerImageMemVectorL2Data namespace (with and without +hodgeConverseCriterion / IsOpenBoundedConvexDomain), the blockJ eq +half scalarResponse sum for scalarCanonicalMaximizers, plus the trailing +blockResponse integrand_add / blockJValueSet membership and blockJ_nonneg +lemmas. +-/ + +namespace BlockResponseLowerImageMemVectorL2Data + +/-- Lower-level Hodge-packaged upper bound for the doubled response functional. +For note-facing Chapter 2 statements on bounded open convex domains, prefer +`blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain`. +-/ +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) hU hEll hvol p pStar q qStar + +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge p pStar q qStar + +/-- Preferred note-facing lower-image-packaged upper bound for the doubled +response functional on bounded open convex domains. -/ +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol p pStar q qStar + +theorem blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a ≤ + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol (HasHodgeConverse.hodgeConverseCriterion (U := U)) p q h + +theorem blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a ≤ + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge p q h + +theorem blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a ≤ + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol p q h + +theorem half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, q) (qStar, pStar) a := + Homogenization.half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + (a := a) hU hEll hvol p pStar q qStar + +theorem half_responseJ_adjoint_sum_note_form_le_blockJ_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, h) (q, 0) a := + Homogenization.half_responseJ_adjoint_sum_note_form_le_blockJ_of_isEllipticFieldOn + (a := a) hU hEll hvol p q h + +/-- Lower-level Hodge-packaged equality +`BlockJ = (1/2)(ResponseJ + ResponseJ^*)`. For note-facing Chapter 2 +statements on bounded open convex domains, prefer +`blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain`. +-/ +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) hU hEll hvol p pStar q qStar + +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge p pStar q qStar + +/-- Preferred note-facing lower-image-packaged equality +`BlockJ = (1/2)(ResponseJ + ResponseJ^*)` on bounded open convex domains. -/ +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol p pStar q qStar + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) hU hEll hvol p q h + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge p q h + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := + Homogenization.blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol p q h + +theorem blockJ_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) + (u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a) + (v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + rw [blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + hU hEll hvol p pStar q qStar] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +theorem blockJ_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p pStar q qStar : Vec d) + (u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a) + (v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := +by + rw [blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + hU hEll hvol hHodge p pStar q qStar] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +/-- Preferred note-facing scalar-canonical lower-image-packaged equality on +bounded open convex domains. -/ +theorem blockJ_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) + (u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a) + (v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + rw [blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p pStar q qStar] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +/-- Witness-free convex-domain scalar-response equality: the maximizing scalar +states are chosen internally from the direct-method existence theorem. This is +the preferred Chapter-2-facing surface when one wants the scalar-response +decomposition without threading explicit maximizer data through the statement. +-/ +theorem blockJ_eq_half_scalarResponse_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + ∃ u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a, + ∃ v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a), + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) + (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + classical + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll (p - pStar) (qStar - q) with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj + (pStar + p) (qStar + q) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockJ_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p pStar q qStar u v + +/-- Explicitly named existential version of the previous theorem. -/ +theorem exists_scalarCanonicalMaximizers_blockJ_eq_half_scalarResponse_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + ∃ u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a, + ∃ v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a), + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) + (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + classical + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll (p - pStar) (qStar - q) with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj + (pStar + p) (qStar + q) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockJ_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p pStar q qStar u v + +theorem blockJ_note_form_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) + (u : ScalarCanonicalMaximizer U p (q - h) a) + (v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * + volumeAverage U (scalarResponseIntegrand U a p (q - h) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + p (q + h) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + rw [blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + hU hEll hvol p q h] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +theorem blockJ_note_form_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p q h : Vec d) + (u : ScalarCanonicalMaximizer U p (q - h) a) + (v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * + volumeAverage U (scalarResponseIntegrand U a p (q - h) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + p (q + h) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := +by + rw [blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + hU hEll hvol hHodge p q h] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +/-- Preferred note-facing scalar-canonical lower-image-packaged equality in +the note form on bounded open convex domains. -/ +theorem blockJ_note_form_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) + (u : ScalarCanonicalMaximizer U p (q - h) a) + (v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a)) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * + volumeAverage U (scalarResponseIntegrand U a p (q - h) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + p (q + h) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + rw [blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p q h] + rw [ScalarCanonicalMaximizer.responseJ_eq u, ScalarCanonicalMaximizer.responseJ_eq v] + +/-- Witness-free convex-domain note-form scalar-response equality. The scalar +canonical maximizers are obtained internally, so downstream arguments can +consume the decomposition without packaging explicit maximizer witnesses. -/ +theorem blockJ_note_form_eq_half_scalarResponse_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + ∃ u : ScalarCanonicalMaximizer U p (q - h) a, + ∃ v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a), + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a p (q - h) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + p (q + h) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + classical + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll p (q - h) with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj p (q + h) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockJ_note_form_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p q h u v + +/-- Explicitly named existential version of the previous theorem. -/ +theorem exists_scalarCanonicalMaximizers_blockJ_note_form_eq_half_scalarResponse_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + ∃ u : ScalarCanonicalMaximizer U p (q - h) a, + ∃ v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a), + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U a p (q - h) (u : AHarmonicFunction a U)) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + p (q + h) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) := by + classical + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll p (q - h) with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj p (q + h) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockJ_note_form_eq_half_scalarResponse_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol p q h u v + +end BlockResponseLowerImageMemVectorL2Data + +theorem blockResponse_integrand_add {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (X Y : BlockState d) : + blockResponseIntegrand a P Q (X + Y) = + fun x => + blockResponseIntegrand a P Q X x + + blockResponseIntegrand a P Q Y x + - blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + funext x + have hcomm : + blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (Y.eval x)) = + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + simpa [blockCoeffField] using + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm + (A := a x) (X := X.eval x) (Y := Y.eval x)) + simp [blockResponseIntegrand, blockEnergyDensity, blockMatVecMul_add, blockVecDot_add_left, + blockVecDot_add_right] + rw [hcomm] + ring + +theorem blockResponse_integrand_add_smul {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (X Y : BlockState d) (c : ℝ) : + blockResponseIntegrand a P Q (X + c • Y) = + fun x => + blockResponseIntegrand a P Q X x + - (c ^ 2) * blockEnergyDensity a Y x + - c * blockVecDot P (blockMatVecMul (blockCoeffField a x) (Y.eval x)) + + c * blockVecDot Q (Y.eval x) + - c * blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + rw [blockResponse_integrand_add, blockResponse_integrand_smul] + funext x + simp [blockVecDot_smul_left] + ring + +theorem blockResponse_mem_blockJValueSet {d : ℕ} {U : Set (Vec d)} {P Q : BlockVec d} + {a : CoeffField d} {X : BlockState d} (hX : BlockResponseSpace a U X) + (hInt : BlockResponseIntegrabilityData U a X) : + volumeAverage U (blockResponseIntegrand a P Q X) ∈ blockJValueSet U P Q a := by + exact ⟨X, hX, hInt, rfl⟩ + +theorem blockResponse_blockJValueSet_smul_mem {d : ℕ} {U : Set (Vec d)} {P Q : BlockVec d} + {a : CoeffField d} {m : ℝ} (hm : m ∈ blockJValueSet U P Q a) (c : ℝ) : + c ^ 2 * m ∈ blockJValueSet U (c • P) (c • Q) a := by + rcases hm with ⟨X, hX, hIntX, rfl⟩ + refine ⟨c • X, blockResponse_mem_responseSpace_smul hX c, hIntX.smul c, ?_⟩ + rw [blockResponse_integrand_smul_data_state] + unfold volumeAverage + rw [show (fun x => c ^ 2 * blockResponseIntegrand a P Q X x) = + fun x => (c ^ 2 : ℝ) • blockResponseIntegrand a P Q X x by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +theorem blockResponse_zero_mem_blockJValueSet {d : ℕ} (U : Set (Vec d)) + (P Q : BlockVec d) (a : CoeffField d) : + (0 : ℝ) ∈ blockJValueSet U P Q a := by + refine ⟨({ potential := 0, flux := 0 } : BlockState d), + blockResponse_zero_mem_responseSpace a U, blockResponseIntegrabilityData_zero U a, ?_⟩ + rw [blockResponse_integrand_zero] + simp [volumeAverage] + +theorem blockResponse_blockJValueSet_nonempty {d : ℕ} (U : Set (Vec d)) + (P Q : BlockVec d) (a : CoeffField d) : + (blockJValueSet U P Q a).Nonempty := by + exact ⟨0, blockResponse_zero_mem_blockJValueSet U P Q a⟩ + +theorem blockJ_nonneg {d : ℕ} (U : Set (Vec d)) (P Q : BlockVec d) (a : CoeffField d) : + 0 ≤ BlockJ U P Q a := by + unfold BlockJ + exact Real.sSup_nonneg' ⟨0, blockResponse_zero_mem_blockJValueSet U P Q a, le_rfl⟩ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/MainEqualities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/MainEqualities.lean new file mode 100644 index 0000000000..ec1c87b1bd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Equalities/MainEqualities.lean @@ -0,0 +1,334 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities.Helpers + +/-! # Main Equalities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Equalities -- blockJ equals half-responseJ-adjoint-sum + +blockJ le / eq half responseJ adjoint sum under IsEllipticFieldOn with +hodgeConverseCriterion or IsOpenBoundedConvexDomain, together with the +note-form variants. +-/ + +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + unfold BlockJ + refine csSup_le ?_ ?_ + · refine ⟨0, ?_⟩ + refine ⟨({ potential := 0, flux := 0 } : BlockState d), + blockResponse_zero_mem_responseSpace a U, blockResponseIntegrabilityData_zero U a, ?_⟩ + rw [blockResponse_integrand_zero] + simp [volumeAverage] + · intro m hm + rcases hm with ⟨X, hX, hIntX, rfl⟩ + have hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := + blockResponse_lowerImage_memVectorL2_of_flux_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX hIntX.flux_memL2 hEll + have hLowerPot : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := + blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_hodgeConverseCriterion + (hHodge := hHodge) hX hLowerL2 + rcases + volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU hX hLowerPot hEll p pStar q qStar with + ⟨u, v, hsplit⟩ + have hu : + volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) ≤ + ResponseJ U (p - pStar) (qStar - q) a := + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEll hvol (p - pStar) (qStar - q) + (responseJValueSet_mem U (p - pStar) (qStar - q) a u) + have hv : + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) ≤ + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEllAdj hvol (pStar + p) (qStar + q) + (responseJValueSet_mem U (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a) v) + linarith [hsplit, hu, hv] + +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + exact + blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol + (HasHodgeConverse.hodgeConverseCriterion (U := U)) p pStar q qStar + +theorem blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a ≤ + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := by + simpa using + blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge (p := p) (pStar := 0) (q := h) (qStar := q) + +theorem blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a ≤ + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + exact + blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) + (hU := hConv.isOpen.measurableSet) + hEll + hvol + (hHodge := hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + p + pStar + q + qStar + +theorem blockJ_note_form_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a ≤ + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := by + simpa using + blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol (p := p) (pStar := 0) (q := h) (qStar := q) + +theorem half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, q) (qStar, pStar) a := by + let J := BlockJ U (p, q) (qStar, pStar) a + let A := responseJValueSet U (p - pStar) (qStar - q) a + let B := responseJValueSet U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have hpair : + ∀ m ∈ A, ∀ n ∈ B, (1 / 2 : ℝ) * m + (1 / 2 : ℝ) * n ≤ J := by + intro m hm n hn + rcases hm with ⟨u, rfl⟩ + rcases hn with ⟨v, rfl⟩ + dsimp [A, B, J] + exact blockResponse_half_scalarResponse_sum_le_blockJ_of_isEllipticFieldOn + (a := a) hU hEll hvol (p := p) (pStar := pStar) (q := q) (qStar := qStar) + (u := u) (v := v) + have hresp1 : + ResponseJ U (p - pStar) (qStar - q) a ≤ + 2 * J - ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + unfold ResponseJ + refine csSup_le (responseJValueSet_nonempty U (p - pStar) (qStar - q) a) ?_ + intro m hm + have hresp2 : + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + 2 * J - m := by + unfold ResponseJ + refine csSup_le + (responseJValueSet_nonempty U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) ?_ + intro n hn + have hmn := hpair m hm n hn + linarith + have hm_le : + m ≤ 2 * J - ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + have hsum_le : + m + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + 2 * J := by + have hsum_le' := (le_sub_iff_add_le).mp hresp2 + simpa [add_comm, add_left_comm, add_assoc] using hsum_le' + exact (le_sub_iff_add_le).mpr hsum_le + exact hm_le + have hsum : + ResponseJ U (p - pStar) (qStar - q) a + + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + 2 * J := by + have hsum' := (le_sub_iff_add_le).mp hresp1 + simpa [add_comm, add_left_comm, add_assoc] using hsum' + nlinarith [hsum] + +theorem half_responseJ_adjoint_sum_note_form_le_blockJ_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, h) (q, 0) a := by + simpa using + half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + (a := a) hU hEll hvol (p := p) (pStar := 0) (q := h) (qStar := q) + +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + apply le_antisymm + · exact + blockJ_le_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge p pStar q qStar + · exact + half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + (a := a) hU hEll hvol p pStar q qStar + +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + exact + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol (HasHodgeConverse.hodgeConverseCriterion (U := U)) + p pStar q qStar + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := by + simpa using + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) hU hEll hvol (p := p) (pStar := 0) (q := h) (qStar := q) + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hHodge : HodgeConverseCriterion U) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := by + simpa using + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) hU hEll hvol hHodge (p := p) (pStar := 0) (q := h) (qStar := q) + +theorem blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) : + BlockJ U (p, q) (qStar, pStar) a = + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) := by + exact + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_hodgeConverseCriterion + (a := a) + (hU := hConv.isOpen.measurableSet) + hEll + hvol + (hHodge := hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + p + pStar + q + qStar + +theorem blockJ_note_form_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) : + BlockJ U (p, h) (q, 0) a = + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) := by + simpa using + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) hConv hEll hvol (p := p) (pStar := 0) (q := h) (qStar := q) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations.lean new file mode 100644 index 0000000000..3214ea976c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.BasicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.IntegrabilityFamily +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairStates +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairHalfAdmissible + +/-! +# BlockResponse Foundations (aggregate re-export) + +Previously a 1502-line monolithic module; now split along thematic +boundaries into the four files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/BasicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/BasicIdentities.lean new file mode 100644 index 0000000000..dc959b7c27 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/BasicIdentities.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField + +/-! # Basic Identities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Foundations -- basic deterministic identities + +blockResponse_zero membership in responseSpace, isEllipticFieldOn for +adjointCoeffField, blockMatVecMul_blockCoeffField_pair identities, +symmPart algebra and pointwiseBlockEnergy_pair_eq_symmPart_sum plus +the lowerImage / upperImage orthogonality and responseSpace_smul lemmas. +-/ + +theorem blockResponse_zero_mem_responseSpace {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) : + BlockResponseSpace a U ({ potential := 0, flux := 0 } : BlockState d) := by + refine ⟨?_, ?_, ?_⟩ + · unfold IsBlockPotentialOn + exact ⟨0, rfl⟩ + · unfold IsBlockSolenoidalOn IsSolenoidalOn + intro φ + rw [show (fun x => vecDot ((0 : Vec d → Vec d) x) (φ.toH1Function.grad x)) = 0 by + funext x + change vecDot (0 : Vec d) (φ.toH1Function.grad x) = 0 + simpa using vecDot_zero_left (φ.toH1Function.grad x)] + simp + intro Y hY + rw [show + (fun x => + blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a x) + (({ potential := 0, flux := 0 } : BlockState d).eval x))) = 0 by + funext x + simp [BlockState.eval, blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_right]] + simp + +theorem isEllipticFieldOn_adjointCoeffField {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := by + refine ⟨?_, ?_⟩ + · refine (measurable_pi_iff).2 ?_ + intro i + refine (measurable_pi_iff).2 ?_ + intro j + simpa [Homogenization.adjointCoeffField, matTranspose] using + (measurable_pi_iff.mp (measurable_pi_iff.mp hEll.1 j) i) + · intro x hx + simpa [Homogenization.adjointCoeffField, matTranspose] using + isEllipticMatrix_transpose (hEll.2 x hx) + +theorem blockMatVecMul_blockCoeffField_pair_of_isUnit_det_symmPart {d : ℕ} + (a : CoeffField d) (x : Vec d) (hdet : IsUnit (symmPart (a x)).det) + (ξ η : Vec d) : + blockMatVecMul (blockCoeffField a x) + (ξ + η, matVecMul (a x) ξ - matVecMul (matTranspose (a x)) η) = + (matVecMul (a x) ξ + matVecMul (matTranspose (a x)) η, ξ - η) := by + have hprimal := + blockMatVecMul_blockMatrixOfCoeff_primal_of_isUnit_det_symmPart (a x) hdet ξ + have hadjoint := + blockMatVecMul_blockMatrixOfCoeff_adjoint_of_isUnit_det_symmPart (a x) hdet η + calc + blockMatVecMul (blockCoeffField a x) + (ξ + η, matVecMul (a x) ξ - matVecMul (matTranspose (a x)) η) = + blockMatVecMul (blockCoeffField a x) + ((ξ, matVecMul (a x) ξ) + (η, -matVecMul (matTranspose (a x)) η)) := by + simp [sub_eq_add_neg] + _ = blockMatVecMul (blockCoeffField a x) (ξ, matVecMul (a x) ξ) + + blockMatVecMul (blockCoeffField a x) (η, -matVecMul (matTranspose (a x)) η) := by + rw [blockMatVecMul_add] + _ = (matVecMul (a x) ξ, ξ) + (matVecMul (matTranspose (a x)) η, -η) := by + simp [blockCoeffField, hprimal, hadjoint] + _ = (matVecMul (a x) ξ + matVecMul (matTranspose (a x)) η, ξ - η) := by + simp [sub_eq_add_neg] + +theorem blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn {d : ℕ} + (a : CoeffField d) {lam Lam : ℝ} {U : Set (Vec d)} (hEll : IsEllipticFieldOn lam Lam U a) + {x : Vec d} (hx : x ∈ U) (ξ η : Vec d) : + blockMatVecMul (blockCoeffField a x) + (ξ + η, matVecMul (a x) ξ - matVecMul (matTranspose (a x)) η) = + (matVecMul (a x) ξ + matVecMul (matTranspose (a x)) η, ξ - η) := by + exact blockMatVecMul_blockCoeffField_pair_of_isUnit_det_symmPart a x + (isUnit_det_symmPart_of_isEllipticMatrix (hEll.2 x hx)) ξ η + +def pointwiseScalarResponseIntegrand {d : ℕ} (A : Mat d) + (p q ξ : Vec d) : ℝ := + -((1 / 2 : ℝ) * vecDot ξ (matVecMul (symmPart A) ξ)) + - vecDot p (matVecMul A ξ) + + vecDot q ξ + +theorem vecDot_matVecMul_self_eq_symmPart {d : ℕ} (A : Mat d) (ξ : Vec d) : + vecDot ξ (matVecMul A ξ) = vecDot ξ (matVecMul (symmPart A) ξ) := by + have htranspose : + vecDot ξ (matVecMul (matTranspose A) ξ) = vecDot ξ (matVecMul A ξ) := by + calc + vecDot ξ (matVecMul (matTranspose A) ξ) = vecDot (matVecMul A ξ) ξ := by + rw [vecDot_matVecMul_transpose] + _ = vecDot ξ (matVecMul A ξ) := by + rw [vecDot_comm] + rw [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, vecDot_smul_right, + vecDot_add_right, htranspose] + ring + +theorem pointwiseBlockEnergy_pair_eq_symmPart_sum_of_isUnit_det_symmPart {d : ℕ} + (A : Mat d) (hdet : IsUnit (symmPart A).det) (ξ η : Vec d) : + (1 / 2 : ℝ) * blockVecDot + (ξ + η, matVecMul A ξ - matVecMul (matTranspose A) η) + (blockMatVecMul (blockMatrixOfCoeff A) + (ξ + η, matVecMul A ξ - matVecMul (matTranspose A) η)) = + vecDot ξ (matVecMul (symmPart A) ξ) + + vecDot η (matVecMul (symmPart A) η) := by + have himage : + blockMatVecMul (blockMatrixOfCoeff A) + (ξ + η, matVecMul A ξ - matVecMul (matTranspose A) η) = + (matVecMul A ξ + matVecMul (matTranspose A) η, ξ - η) := by + calc + blockMatVecMul (blockMatrixOfCoeff A) + (ξ + η, matVecMul A ξ - matVecMul (matTranspose A) η) = + blockMatVecMul (blockMatrixOfCoeff A) + ((ξ, matVecMul A ξ) + (η, -matVecMul (matTranspose A) η)) := by + simp [sub_eq_add_neg] + _ = blockMatVecMul (blockMatrixOfCoeff A) (ξ, matVecMul A ξ) + + blockMatVecMul (blockMatrixOfCoeff A) (η, -matVecMul (matTranspose A) η) := by + rw [blockMatVecMul_add] + _ = (matVecMul A ξ, ξ) + (matVecMul (matTranspose A) η, -η) := by + rw [blockMatVecMul_blockMatrixOfCoeff_primal_of_isUnit_det_symmPart A hdet ξ, + blockMatVecMul_blockMatrixOfCoeff_adjoint_of_isUnit_det_symmPart A hdet η] + _ = (matVecMul A ξ + matVecMul (matTranspose A) η, ξ - η) := by + simp [sub_eq_add_neg] + have hcross : + vecDot ξ (matVecMul (matTranspose A) η) = vecDot η (matVecMul A ξ) := by + calc + vecDot ξ (matVecMul (matTranspose A) η) = vecDot (matVecMul A ξ) η := by + rw [vecDot_matVecMul_transpose] + _ = vecDot η (matVecMul A ξ) := by + rw [vecDot_comm] + rw [himage] + have hquadξ : vecDot ξ (matVecMul A ξ) = vecDot ξ (matVecMul (symmPart A) ξ) := + vecDot_matVecMul_self_eq_symmPart A ξ + have hquadη : + vecDot η (matVecMul (matTranspose A) η) = vecDot η (matVecMul (symmPart A) η) := by + rw [vecDot_matVecMul_self_eq_symmPart (matTranspose A) η, symmPart_matTranspose] + have hdiagξ' : vecDot (matVecMul A ξ) ξ = vecDot ξ (matVecMul (symmPart A) ξ) := by + rw [vecDot_comm, hquadξ] + have hdiagη' : + vecDot (matVecMul (matTranspose A) η) η = vecDot η (matVecMul (symmPart A) η) := by + rw [vecDot_comm, hquadη] + have hcross_left : vecDot (matVecMul A ξ) η = vecDot η (matVecMul A ξ) := by + rw [vecDot_comm] + have hcross_right : + vecDot (matVecMul (matTranspose A) η) ξ = vecDot η (matVecMul A ξ) := by + rw [vecDot_comm, hcross] + have hfirst : + vecDot (ξ + η) (matVecMul A ξ + matVecMul (matTranspose A) η) = + vecDot ξ (matVecMul (symmPart A) ξ) + + 2 * vecDot η (matVecMul A ξ) + + vecDot η (matVecMul (symmPart A) η) := by + simp [vecDot_add_left, vecDot_add_right, hcross, hquadξ, hquadη] + ring + have hlast : + vecDot (matVecMul A ξ - matVecMul (matTranspose A) η) (ξ - η) = + vecDot ξ (matVecMul (symmPart A) ξ) + + vecDot η (matVecMul (symmPart A) η) - + 2 * vecDot η (matVecMul A ξ) := by + calc + vecDot (matVecMul A ξ - matVecMul (matTranspose A) η) (ξ - η) = + vecDot (matVecMul A ξ) ξ - vecDot (matVecMul A ξ) η - + vecDot (matVecMul (matTranspose A) η) ξ + + vecDot (matVecMul (matTranspose A) η) η := by + simp [sub_eq_add_neg, vecDot_add_left, vecDot_add_right, vecDot_neg_left, + vecDot_neg_right] + ring + _ = vecDot ξ (matVecMul (symmPart A) ξ) - vecDot η (matVecMul A ξ) - + vecDot η (matVecMul A ξ) + + vecDot η (matVecMul (symmPart A) η) := by + rw [hdiagξ', hcross_left, hcross_right, hdiagη'] + _ = vecDot ξ (matVecMul (symmPart A) ξ) + + vecDot η (matVecMul (symmPart A) η) - + 2 * vecDot η (matVecMul A ξ) := by + ring + rw [show + blockVecDot (ξ + η, matVecMul A ξ - matVecMul (matTranspose A) η) + (matVecMul A ξ + matVecMul (matTranspose A) η, ξ - η) = + vecDot (ξ + η) (matVecMul A ξ + matVecMul (matTranspose A) η) + + vecDot (matVecMul A ξ - matVecMul (matTranspose A) η) (ξ - η) by + rfl] + rw [hfirst, hlast] + ring + +theorem blockResponse_mem_responseSpace_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {X : BlockState d} (hX : BlockResponseSpace a U X) (c : ℝ) : + BlockResponseSpace a U (c • X) := by + rcases hX with ⟨hpot, hsol, horth⟩ + refine ⟨?_, ?_, ?_⟩ + · exact isPotentialOn_smul hpot c + · exact isSolenoidalOn_smul hsol c + · intro Y hY + rw [show + (fun x => + blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a x) ((c • X).eval x))) = + fun x => + c * blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a x) (X.eval x)) by + funext x + rw [BlockState.eval_smul, blockMatVecMul_smul, blockVecDot_smul_right]] + rw [MeasureTheory.integral_const_mul, horth Y hY] + simp + +theorem blockResponse_upperImage_orthogonal_of_mem_responseSpace {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + (hX : BlockResponseSpace a U X) {Y : Vec d → Vec d} + (hY : IsPotentialZeroTraceOn U Y) : + ∫ x in U, vecDot (Y x) ((blockMatVecMul (blockCoeffField a x) (X.eval x)).1) + ∂MeasureTheory.volume = 0 := by + rcases hX with ⟨_, _, horth⟩ + let Z : BlockState d := { potential := Y, flux := 0 } + have hZ : IsBlockTestOn U Z := by + refine ⟨hY, ?_⟩ + simpa [Z] using! (isSolenoidalZeroNormalTraceOn_zero (U := U)) + have hzero := horth Z hZ + have hrewrite : + ∫ x in U, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (Y x) ((blockMatVecMul (blockCoeffField a x) (X.eval x)).1) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Z, BlockState.eval, blockVecDot, vecDot_zero_left] + rw [hrewrite] at hzero + exact hzero + +theorem blockResponse_lowerImage_orthogonal_of_mem_responseSpace {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + (hX : BlockResponseSpace a U X) {Y : Vec d → Vec d} + (hY : IsSolenoidalZeroNormalTraceOn U Y) : + ∫ x in U, vecDot (Y x) ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + ∂MeasureTheory.volume = 0 := by + rcases hX with ⟨_, _, horth⟩ + let Z : BlockState d := { potential := 0, flux := Y } + have hZ : IsBlockTestOn U Z := by + refine ⟨?_, hY⟩ + simpa [Z] using! (isPotentialZeroTraceOn_zero (U := U)) + have hzero := horth Z hZ + have hrewrite : + ∫ x in U, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (Y x) ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Z, BlockState.eval, blockVecDot, vecDot_zero_left] + rw [hrewrite] at hzero + exact hzero + +structure BlockJIntegrabilityData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (P Q : BlockVec d) : Prop where + response : + ∀ X : BlockState d, BlockResponseSpace a U X → + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U + +structure BlockResponseLowerImageMemVectorL2Data {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : Prop where + lowerImage_memVectorL2 : + ∀ X : BlockState d, BlockResponseSpace a U X → + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + +theorem blockResponse_potential_memL2_of_mem_responseSpace {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + (hX : BlockResponseSpace a U X) : + MemVectorL2 U X.potential := by + rcases hX.1 with ⟨u, hu⟩ + simpa [hu] using u.grad_memVectorL2 + +theorem blockResponse_upperImage_isSolenoidalOn_of_mem_responseSpace {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + (hX : BlockResponseSpace a U X) : + IsSolenoidalOn U (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) := by + intro φ + have hzero := + blockResponse_upperImage_orthogonal_of_mem_responseSpace + (hX := hX) (Y := φ.toH1Function.grad) φ.isPotentialZeroTraceOn + simpa [vecDot_comm] using hzero + +theorem blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_hodgeConverseCriterion {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hHodge : HodgeConverseCriterion U) + (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + refine + IsPotentialOn.of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + hHodge hLowerL2 ?_ + intro g hg hsol + exact blockResponse_lowerImage_orthogonal_of_mem_responseSpace (hX := hX) (Y := g) hsol + +theorem blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2 + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + exact + blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_hodgeConverseCriterion + (U := U) + (hHodge := HasHodgeConverse.hodgeConverseCriterion (U := U)) + hX hLowerL2 + +/-- Preferred convex-domain wrapper for promoting the lower image of a response +state to a potential field. This is the Chapter-2-facing surface to use when +the domain is a bounded open convex set. -/ +theorem blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_isOpenBoundedConvexDomain + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + exact + blockResponse_lowerImage_isPotential_of_mem_responseSpace_of_memVectorL2_of_hodgeConverseCriterion + (U := U) + (hHodge := hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hX hLowerL2 + +theorem blockResponse_memBlockL2_of_mem_responseSpace_of_integrabilityData {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : BlockResponseSpace a U X) (hInt : BlockResponseIntegrabilityData U a X) : + MemBlockL2 U X.eval := by + simpa [BlockState.eval, blockField] using! + memBlockL2_blockField + (blockResponse_potential_memL2_of_mem_responseSpace hX) + hInt.flux_memL2 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/IntegrabilityFamily.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/IntegrabilityFamily.lean new file mode 100644 index 0000000000..d25815f8e8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/IntegrabilityFamily.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.BasicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator + +/-! # Integrability Family -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Foundations -- integrability data family + +BlockJIntegrabilityData and BlockResponseLowerImageMemVectorL2Data structures, +blockResponseIntegrabilityData smul / zero, the flux_memL2 / lowerImage +variants from IsEllipticFieldOn, the blockResponseIntegrand_integrableOn +theorems, and the BlockJIntegrabilityData.of_lowerImageMemVectorL2Data bridge. +-/ + +theorem blockEnergyDensity_smul_state {d : ℕ} (a : CoeffField d) (c : ℝ) + (X : BlockState d) : + blockEnergyDensity a (c • X) = fun x => c ^ 2 * blockEnergyDensity a X x := by + funext x + simp [blockEnergyDensity, pow_two, blockMatVecMul_smul, blockVecDot_smul_left, + blockVecDot_smul_right] + ring + +theorem BlockResponseIntegrabilityData.smul {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + (hInt : BlockResponseIntegrabilityData U a X) (c : ℝ) : + BlockResponseIntegrabilityData U a (c • X) := by + refine ⟨?_, ?_⟩ + · simpa [Pi.smul_apply] using! hInt.flux_memL2.const_smul c + · rw [blockEnergyDensity_smul_state] + simpa [MeasureTheory.IntegrableOn, smul_eq_mul] using! + hInt.energyIntegrable.integrable.smul (c ^ 2) + +theorem blockResponseIntegrabilityData_zero {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : + BlockResponseIntegrabilityData U a ({ potential := 0, flux := 0 } : BlockState d) := by + refine ⟨?_, ?_⟩ + · change MemVectorL2 U (0 : Vec d → Vec d) + exact MeasureTheory.MemLp.zero + · rw [show blockEnergyDensity a ({ potential := 0, flux := 0 } : BlockState d) = 0 by + funext x + simp [blockEnergyDensity, BlockState.eval, blockMatVecMul, blockVecDot, + matVecMul_zero, vecDot_zero_right]] + exact MeasureTheory.integrableOn_zero + +theorem blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hFlux : MemVectorL2 U X.flux) (hEll : IsEllipticFieldOn lam Lam U a) : + BlockResponseIntegrabilityData U a X := by + have hBlock : MemBlockL2 U X.eval := by + simpa [BlockState.eval, blockField] using! + memBlockL2_blockField + (blockResponse_potential_memL2_of_mem_responseSpace hX) + hFlux + refine ⟨hFlux, ?_⟩ + exact + blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := U) (a := a) hBlock hEll + +theorem blockResponse_lowerImage_memVectorL2_of_flux_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hFlux : MemVectorL2 U X.flux) (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + have hPot : MemVectorL2 U X.potential := + blockResponse_potential_memL2_of_mem_responseSpace hX + have hSkewPot : + MemVectorL2 U (fun x => matVecMul (skewPart (a x)) (X.potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hPot + have hShift : + MemVectorL2 U + (fun x => X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [sub_eq_add_neg] using! hFlux.sub hSkewPot + have hInv : + MemVectorL2 U + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hShift + have hEq : + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) = + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := by + funext x + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd (A := a x) (p := X.potential x) (q := X.flux x)) + simpa [hEq] using hInv + +theorem blockResponse_flux_memL2_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U X.flux := by + have hPot : MemVectorL2 U X.potential := + blockResponse_potential_memL2_of_mem_responseSpace hX + have hSymmLower : + MemVectorL2 U + (fun x => + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hLowerL2 + have hSkewPot : + MemVectorL2 U (fun x => matVecMul (skewPart (a x)) (X.potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hPot + have hrepr : + (fun x => X.flux x) =ᵐ[volumeMeasureOn U] + (fun x => + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + + matVecMul (skewPart (a x)) (X.potential x)) := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with + x hx + simpa [BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (X.potential x) (X.flux x) + have hFlux' : + MemVectorL2 U + (fun x => + matVecMul (symmPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + + matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [Pi.add_apply] using! hSymmLower.add hSkewPot + have hFluxMeas : + MeasureTheory.AEStronglyMeasurable (fun x => X.flux x) (volumeMeasureOn U) := + hFlux'.aestronglyMeasurable.congr hrepr.symm + refine hFlux'.congr_norm hFluxMeas ?_ + filter_upwards [hrepr] with x hx + simpa using congrArg norm hx.symm + +theorem blockResponse_flux_memL2_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + {f : Vec d → Vec d} + (hLowerPot : IsPotentialOn U f) + (hLowerEq : + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) =ᵐ[volumeMeasureOn U] f) + (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U X.flux := by + have hLowerPotL2 : MemVectorL2 U f := by + rcases hLowerPot with ⟨u, hu⟩ + simpa [hu] using u.grad_memVectorL2 + have hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + have hLowerMeas : + MeasureTheory.AEStronglyMeasurable + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) + (volumeMeasureOn U) := + hLowerPotL2.aestronglyMeasurable.congr hLowerEq.symm + refine hLowerPotL2.congr_norm hLowerMeas ?_ + filter_upwards [hLowerEq] with x hx + simpa using congrArg norm hx.symm + exact + blockResponse_flux_memL2_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerL2 hEll + +theorem blockResponse_flux_memL2_of_lowerImage_isPotential_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hLower : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U X.flux := by + exact + blockResponse_flux_memL2_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + hX hLower Filter.EventuallyEq.rfl hEll + +theorem blockResponseIntegrabilityData_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + {f : Vec d → Vec d} + (hLowerPot : IsPotentialOn U f) + (hLowerEq : + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) =ᵐ[volumeMeasureOn U] f) + (hEll : IsEllipticFieldOn lam Lam U a) : + BlockResponseIntegrabilityData U a X := by + exact + blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + hX + (blockResponse_flux_memL2_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerPot hLowerEq hEll) + hEll + +theorem blockResponseIntegrabilityData_of_lowerImage_isPotential_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hLower : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + BlockResponseIntegrabilityData U a X := by + exact + blockResponseIntegrabilityData_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + hX hLower Filter.EventuallyEq.rfl hEll + +theorem blockResponseIntegrabilityData_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + BlockResponseIntegrabilityData U a X := by + exact + blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + hX + (blockResponse_flux_memL2_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerL2 hEll) + hEll + +theorem blockResponseIntegrand_integrableOn_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hInt : BlockResponseIntegrabilityData U a X) + (hEll : IsEllipticFieldOn lam Lam U a) (P Q : BlockVec d) : + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U := by + have hBlock : MemBlockL2 U X.eval := + blockResponse_memBlockL2_of_mem_responseSpace_of_integrabilityData hX hInt + let YP : BlockState d := { potential := fun _ => P.1, flux := fun _ => P.2 } + have hYPL2 : MemBlockL2 U YP.eval := by + simpa [YP, BlockState.eval, blockField] using! + memBlockL2_blockField + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.1)) + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.2)) + have hPInt : + MeasureTheory.IntegrableOn + (fun x => blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x))) U := by + simpa [YP, blockPairingIntegrand, BlockState.eval] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := U) (a := a) (X := YP) (Y := X) hYPL2 hBlock hEll + have hQPotInt : + MeasureTheory.IntegrableOn (fun x => vecDot Q.1 (X.potential x)) U := + CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 + (U := U) Q.1 (blockResponse_potential_memL2_of_mem_responseSpace hX) + have hQFluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot Q.2 (X.flux x)) U := + CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 + (U := U) Q.2 hInt.flux_memL2 + have hQInt : + MeasureTheory.IntegrableOn (fun x => blockVecDot Q (X.eval x)) U := by + simpa [MeasureTheory.IntegrableOn, BlockState.eval, blockVecDot] using! + hQPotInt.integrable.add hQFluxInt.integrable + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => + -blockEnergyDensity a X x - + blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x))) U := by + simpa [sub_eq_add_neg, MeasureTheory.IntegrableOn] using! + hInt.energyIntegrable.integrable.neg.add hPInt.integrable.neg + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => + (-blockEnergyDensity a X x - + blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x))) + + blockVecDot Q (X.eval x)) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hQInt.integrable + have hrewrite : + (fun x => + (-blockEnergyDensity a X x - + blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x))) + + blockVecDot Q (X.eval x)) = + blockResponseIntegrand a P Q X := by + funext x + simp [blockResponseIntegrand] + rw [hrewrite] at hsum123 + exact hsum123 + +theorem blockResponseIntegrand_integrableOn_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : BlockResponseSpace a U X) + (hLowerL2 : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) (P Q : BlockVec d) : + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U := by + exact + blockResponseIntegrand_integrableOn_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn + hX + (blockResponseIntegrabilityData_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX hLowerL2 hEll) + hEll P Q + +theorem BlockJIntegrabilityData.of_lowerImageMemVectorL2Data_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hLower : BlockResponseLowerImageMemVectorL2Data U a) + (hEll : IsEllipticFieldOn lam Lam U a) (P Q : BlockVec d) : + BlockJIntegrabilityData U a P Q := by + refine ⟨?_⟩ + intro X hX + exact + blockResponseIntegrand_integrableOn_of_lowerImage_memVectorL2_of_mem_responseSpace_of_isEllipticFieldOn + hX (hLower.lowerImage_memVectorL2 X hX) hEll P Q + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairHalfAdmissible.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairHalfAdmissible.lean new file mode 100644 index 0000000000..564071ade3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairHalfAdmissible.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.PairStates +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence + +/-! # Pair Half Admissible -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Foundations -- pair-half admissibility + +blockResponse_pair_half isBlockMuAdmissible and averagePotential / +averageFlux identities: from the basic average-eq hypothesis, under +scalarCanonicalMaximizers data (with or without basis data) and under +the IsOpenBoundedConvexDomain assumption. +-/ + +/-- The half-pair witness built from a primal maximizer at `(0,q)` and an +adjoint maximizer at `(0,-q)` has zero average potential. -/ +theorem blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} {q : Vec d} + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a)) + (uGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) + (Homogenization.adjointCoeffField a)) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i)) = 0 := by + ext i + have hu_int : + MeasureTheory.IntegrableOn (fun x => (u : AHarmonicFunction a U).toH1.grad x i) U := by + simpa [MeasureTheory.IntegrableOn] using + ((u : AHarmonicFunction a U).toH1.grad_memL2 i).integrable + (by norm_num : (1 : ENNReal) ≤ 2) + have hv_int : + MeasureTheory.IntegrableOn + (fun x => (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x i) U := by + simpa [MeasureTheory.IntegrableOn] using + ((v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad_memL2 i).integrable + (by norm_num : (1 : ENNReal) ≤ 2) + have hu_avg : + volumeAverage U (fun x => (u : AHarmonicFunction a U).toH1.grad x i) = + (matVecMul (sigmaStarInvCoarse U a) q) i := by + simpa [matVecMul_zero] using congrFun + (ScalarCanonicalMaximizer.averageGradientFormulaCanonical + (v := u) (hS := hS) (hK := hK) (hdet := hdet) + (hInt := hInt) (vGrad := uGrad)) i + have hv_avg_adj : + volumeAverage U + (fun x => (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x i) = + (matVecMul (sigmaStarInvCoarse U (Homogenization.adjointCoeffField a)) (-q)) i := by + simpa [matVecMul_zero] using congrFun + (ScalarCanonicalMaximizer.averageGradientFormulaCanonical + (v := v) (a := Homogenization.adjointCoeffField a) + (hS := hSAdj) (hK := hKAdj) (hdet := hdet) + (hInt := hIntAdj) (vGrad := vGrad)) i + have hv_avg : + volumeAverage U + (fun x => (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x i) = + -(matVecMul (sigmaStarInvCoarse U a) q) i := by + rw [sigmaStarInvCoarse_adjointCoeffField_eq hS hSAdj] at hv_avg_adj + simpa [matVecMul_neg] using hv_avg_adj + change volumeAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i) = 0 + have hsplit : + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i) = + (1 / 2 : ℝ) • + ((fun x => (u : AHarmonicFunction a U).toH1.grad x i) + + fun x => (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x i) := by + funext x + rfl + rw [hsplit, volumeAverage_smul U (1 / 2 : ℝ), volumeAverage_add hu_int hv_int, hu_avg, hv_avg] + ring + +/-- Bundled basis-data wrapper for the previous zero-average-potential identity. -/ +theorem + blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right_of_basisData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} {q : Vec d} + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a)) + (basisGrad : Homogenization.ScalarCanonicalMaximizer.GradientBasisData U a) + (basisGradAdj : + Homogenization.ScalarCanonicalMaximizer.GradientBasisData U + (Homogenization.adjointCoeffField a)) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i)) = 0 := by + exact + blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right + (u := u) (v := v) hS hK hSAdj hKAdj hdet hInt hIntAdj basisGrad.grad basisGradAdj.grad + +/-- The half-pair witness built from a primal maximizer at `(0,q)` and an +adjoint maximizer at `(0,-q)` has average flux equal to `q`. -/ +theorem blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} {q : Vec d} + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (Homogenization.adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a)) + (uFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 + (Homogenization.adjointCoeffField a)) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i)) = q := by + ext i + have hu_int : + MeasureTheory.IntegrableOn + (fun x => matVecMul (a x) ((u : AHarmonicFunction a U).toH1.grad x) i) U := by + simpa [vecDot_single_left] using + hInt.flux (Pi.single i 1) (u : AHarmonicFunction a U) + have hv_int : + MeasureTheory.IntegrableOn + (fun x => + matVecMul (matTranspose (a x)) + ((v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x) i) U := by + simpa [Homogenization.adjointCoeffField, vecDot_single_left] using + hIntAdj.flux (Pi.single i 1) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + have hu_avg : + volumeAverage U + (fun x => matVecMul (a x) ((u : AHarmonicFunction a U).toH1.grad x) i) = + (q - matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) q)) i := by + simpa [matVecMul_zero] using congrFun + (ScalarCanonicalMaximizer.averageFluxFormulaCanonical + (v := u) (hS := hS) (hK := hK) (hSigma := hSigma) (hdet := hdet) + (hInt := hInt) (vFlux := uFlux)) i + have hv_avg_adj : + volumeAverage U + (fun x => + matVecMul (matTranspose (a x)) + ((v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x) i) = + ((-q) - matVecMul (matTranspose (kappaCoarse U (Homogenization.adjointCoeffField a))) + (matVecMul (sigmaStarInvCoarse U (Homogenization.adjointCoeffField a)) (-q))) i := by + simpa [Homogenization.adjointCoeffField, matVecMul_zero] using congrFun + (ScalarCanonicalMaximizer.averageFluxFormulaCanonical + (v := v) (a := Homogenization.adjointCoeffField a) + (hS := hSAdj) (hK := hKAdj) (hSigma := hSigmaAdj) (hdet := hdet) + (hInt := hIntAdj) (vFlux := vFlux)) i + have hv_avg : + volumeAverage U + (fun x => + matVecMul (matTranspose (a x)) + ((v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x) i) = + (-q - matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) q)) i := by + rw [sigmaStarInvCoarse_adjointCoeffField_eq hS hSAdj, + kappaCoarse_adjointCoeffField_eq_neg hS hK hSAdj hKAdj hdet] at hv_avg_adj + simpa [matVecMul_neg, neg_matVecMul, Matrix.transpose_neg, matTranspose, sub_eq_add_neg] using + hv_avg_adj + change volumeAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i) = q i + have hsplit : + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i) = + (1 / 2 : ℝ) • + ((fun x => matVecMul (a x) ((u : AHarmonicFunction a U).toH1.grad x) i) - + fun x => + matVecMul (matTranspose (a x)) + ((v : AHarmonicFunction (Homogenization.adjointCoeffField a) U).toH1.grad x) i) := by + funext x + rfl + rw [hsplit, volumeAverage_smul U (1 / 2 : ℝ), volumeAverage_sub hu_int hv_int, hu_avg, hv_avg] + simp [Pi.sub_apply, sub_eq_add_neg] + ring + +/-- Bundled basis-data wrapper for the previous average-flux identity. -/ +theorem blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right_of_basisData + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} {q : Vec d} + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (Homogenization.adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a)) + (basisFlux : Homogenization.ScalarCanonicalMaximizer.FluxBasisData U a) + (basisFluxAdj : + Homogenization.ScalarCanonicalMaximizer.FluxBasisData U + (Homogenization.adjointCoeffField a)) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i)) = q := by + exact + blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right + (u := u) (v := v) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet hInt hIntAdj + basisFlux.flux basisFluxAdj.flux + +/-- Convex-domain wrapper for the zero-average-potential identity. The gradient +basis-data packages are produced automatically from the Stage-6 canonical +maximizer existence theorem. -/ +theorem blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} {sigmaStar kappa : Mat d} {q : Vec d} + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i)) = 0 := by + classical + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hConv.isFiniteMeasure_restrict_volume + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let basisGrad : ScalarCanonicalMaximizer.GradientBasisData U a := + Classical.choice + (ScalarCanonicalMaximizer.GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll) + let basisGradAdj : + ScalarCanonicalMaximizer.GradientBasisData U (Homogenization.adjointCoeffField a) := + Classical.choice + (ScalarCanonicalMaximizer.GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj) + exact + blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right_of_basisData + (u := u) (v := v) hS hK hSAdj hKAdj hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj) + basisGrad basisGradAdj + +/-- Explicitly named existential convex-domain version of the previous +average-potential identity. The scalar canonical maximizers are chosen +internally from the bounded-open-convex existence theorem. -/ +theorem + exists_scalarCanonicalMaximizers_blockResponse_pair_half_averagePotential_eq_zero_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} {sigmaStar kappa : Mat d} {q : Vec d} + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + ∃ u : ScalarCanonicalMaximizer U 0 q a, + ∃ v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a), + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).potential x i)) = 0 := by + classical + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hConv.isFiniteMeasure_restrict_volume + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll 0 q with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj 0 (-q) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockResponse_pair_half_averagePotential_eq_zero_of_scalarCanonicalMaximizers_zero_right_of_isOpenBoundedConvexDomain + hConv hEll hvol u v hS hK hSAdj hKAdj hdet + +/-- Convex-domain wrapper for the average-flux identity. The flux basis-data +packages are produced automatically from the Stage-6 canonical maximizer +existence theorem. -/ +theorem blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} {sigma sigmaStar kappa : Mat d} {q : Vec d} + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (u : ScalarCanonicalMaximizer U 0 q a) + (v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (Homogenization.adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i)) = q := by + classical + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hConv.isFiniteMeasure_restrict_volume + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let basisFlux : ScalarCanonicalMaximizer.FluxBasisData U a := + Classical.choice + (ScalarCanonicalMaximizer.FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll) + let basisFluxAdj : + ScalarCanonicalMaximizer.FluxBasisData U (Homogenization.adjointCoeffField a) := + Classical.choice + (ScalarCanonicalMaximizer.FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj) + exact + blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right_of_basisData + (u := u) (v := v) hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj) + basisFlux basisFluxAdj + +/-- Explicitly named existential convex-domain version of the previous +average-flux identity. The scalar canonical maximizers are chosen internally +from bounded-open-convex existence. -/ +theorem + exists_scalarCanonicalMaximizers_blockResponse_pair_half_averageFlux_eq_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} {sigma sigmaStar kappa : Mat d} {q : Vec d} + (hConv : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (Homogenization.adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (Homogenization.adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (Homogenization.adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) : + ∃ u : ScalarCanonicalMaximizer U 0 q a, + ∃ v : ScalarCanonicalMaximizer U 0 (-q) (Homogenization.adjointCoeffField a), + (fun i => + integralAverage U + (fun x => + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)).flux x i)) = q := by + classical + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hConv.isFiniteMeasure_restrict_volume + have hne : Set.Nonempty U := by + by_contra hne + have hEmpty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + exact hvol (by simp [hEmpty]) + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hConv hEll 0 q with + ⟨u⟩ + rcases + ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := Homogenization.adjointCoeffField a) hne hConv hEllAdj 0 (-q) with + ⟨v⟩ + refine ⟨u, v, ?_⟩ + exact + blockResponse_pair_half_averageFlux_eq_of_scalarCanonicalMaximizers_zero_right_of_isOpenBoundedConvexDomain + hConv hEll hvol u v hS hK hSigma hSAdj hKAdj hSigmaAdj hdet + +theorem blockResponseIntegrand_integrableOn_pair_half_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (P Q : BlockVec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + MeasureTheory.IntegrableOn + (blockResponseIntegrand a P Q (blockResponsePairHalfState a u v)) U := by + exact + blockResponseIntegrand_integrableOn_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn + (hX := by + simpa [blockResponsePairHalfState] using! + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn (a := a) hEll u v)) + (hInt := blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn hEll u v) + hEll P Q + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairStates.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairStates.lean new file mode 100644 index 0000000000..d7ed5737ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Foundations/PairStates.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations.IntegrabilityFamily + +/-! # Pair States -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse Foundations -- pair and pair-half state witnesses + +blockResponsePairState and blockResponsePairHalfState definitions plus +their mem_responseSpace / lowerImage_ae_eq / integrability data theorems +under IsEllipticFieldOn. +-/ + +def blockResponsePairState {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + BlockState d := + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) } + +def blockResponsePairHalfState {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + BlockState d := + (1 / 2 : ℝ) • blockResponsePairState a u v + +theorem blockResponse_pair_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + BlockResponseSpace a U + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) } := by + let X : BlockState d := + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) } + let fluxPlus : Vec d → Vec d := + fun x => + matVecMul (a x) (u.toH1.grad x) + + matVecMul (matTranspose (a x)) (v.toH1.grad x) + let gradDiff : Vec d → Vec d := fun x => u.toH1.grad x - v.toH1.grad x + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have huFluxL2 : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + have hvFluxAdjL2 : + MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) (v.toH1.grad x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj v.toH1.grad_memVectorL2 + have huWeakInt : + ∀ φ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.toH1.grad x)) (φ.toH1Function.grad x)) U := by + intro φ + exact integrableOn_vecDot_of_memVectorL2 huFluxL2 φ.toH1Function.grad_memVectorL2 + have hvWeakInt : + ∀ φ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (matTranspose (a x)) (v.toH1.grad x)) + (φ.toH1Function.grad x)) U := by + intro φ + exact integrableOn_vecDot_of_memVectorL2 hvFluxAdjL2 φ.toH1Function.grad_memVectorL2 + have hfluxSol : + IsBlockSolenoidalOn U X := by + have huSol : + IsSolenoidalOn U (fun x => matVecMul (a x) (u.toH1.grad x)) := u.isHarmonic.2 + have hvSol : + IsSolenoidalOn U (fun x => matVecMul (matTranspose (a x)) (v.toH1.grad x)) := by + simpa [Homogenization.adjointCoeffField] using v.isHarmonic.2 + have hvNegSol : + IsSolenoidalOn U + (fun x => -matVecMul (matTranspose (a x)) (v.toH1.grad x)) := by + simpa [Pi.smul_apply] using! isSolenoidalOn_smul hvSol (-1 : ℝ) + have hvNegInt : + ∀ φ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (-matVecMul (matTranspose (a x)) (v.toH1.grad x)) + (φ.toH1Function.grad x)) U := by + intro φ + have hneg : + MeasureTheory.IntegrableOn + (fun x => + -(vecDot (matVecMul (matTranspose (a x)) (v.toH1.grad x)) + (φ.toH1Function.grad x))) U := by + exact (hvWeakInt φ).neg + simpa [vecDot_neg_left] using hneg + refine isSolenoidalOn_add huSol hvNegSol huWeakInt hvNegInt + refine ⟨?_, hfluxSol, ?_⟩ + · exact isPotentialOn_add u.toH1.isPotentialOn v.toH1.isPotentialOn + · intro Y hY + rcases hY with ⟨hYpot, hYflux⟩ + rcases hYpot with ⟨φ, hφ⟩ + have hYpotL2 : MemVectorL2 U Y.potential := by + simpa [hφ] using φ.toH1Function.grad_memVectorL2 + have hFluxPlusL2 : MemVectorL2 U fluxPlus := by + simpa [fluxPlus, Pi.add_apply] using! huFluxL2.add hvFluxAdjL2 + have hTerm1Int : + MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (fluxPlus x)) U := + integrableOn_vecDot_of_memVectorL2 hYpotL2 hFluxPlusL2 + have hFluxPlusSol : + IsSolenoidalOn U fluxPlus := by + have huSol : + IsSolenoidalOn U (fun x => matVecMul (a x) (u.toH1.grad x)) := u.isHarmonic.2 + have hvSol : + IsSolenoidalOn U (fun x => matVecMul (matTranspose (a x)) (v.toH1.grad x)) := by + simpa [Homogenization.adjointCoeffField] using v.isHarmonic.2 + exact isSolenoidalOn_add huSol hvSol huWeakInt hvWeakInt + have hTerm1Zero : + ∫ x in U, vecDot (Y.potential x) (fluxPlus x) ∂MeasureTheory.volume = 0 := by + have hzero := hFluxPlusSol φ + simpa [fluxPlus, hφ, vecDot_comm] using hzero + have hTerm2Zero : + ∫ x in U, vecDot (Y.flux x) (gradDiff x) ∂MeasureTheory.volume = 0 := by + have hzero := hYflux (u.toH1 + (-1 : ℝ) • v.toH1) + have hgradDiff : + gradDiff = fun x => (u.toH1 + (-1 : ℝ) • v.toH1).grad x := by + funext x + ext i + change u.toH1.grad x i - v.toH1.grad x i = u.toH1.grad x i + (-1 : ℝ) * v.toH1.grad x i + ring + simpa [hgradDiff] using hzero + have hrewrite : + ∫ x in U, + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (Y.potential x) (fluxPlus x) + vecDot (Y.flux x) (gradDiff x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with + x hx + have himage := + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (u.toH1.grad x) (v.toH1.grad x) + simpa [X, fluxPlus, gradDiff, BlockState.eval, blockVecDot] using + congrArg (fun Z => blockVecDot (Y.eval x) Z) himage + rw [hrewrite] + by_cases hTerm2Int : + MeasureTheory.IntegrableOn (fun x => vecDot (Y.flux x) (gradDiff x)) U + · rw [MeasureTheory.integral_add hTerm1Int hTerm2Int, hTerm1Zero, hTerm2Zero] + simp + · have hSumNotInt : + ¬MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (fluxPlus x) + vecDot (Y.flux x) (gradDiff x)) U := by + intro hSumInt + exact hTerm2Int + ((MeasureTheory.integrable_add_iff_integrable_right' + (μ := MeasureTheory.volume.restrict U) hTerm1Int).mp hSumInt) + rw [MeasureTheory.integral_undef hSumNotInt] + +theorem blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + BlockResponseSpace a U + ((1 / 2 : ℝ) • + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) }) := by + exact blockResponse_mem_responseSpace_smul + (blockResponse_pair_mem_responseSpace_of_isEllipticFieldOn (a := a) hEll u v) (1 / 2 : ℝ) + +theorem blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((blockResponsePairHalfState a u v).eval x)).2) + =ᵐ[volumeMeasureOn U] + fun x => (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x) := by + let Y : BlockState d := blockResponsePairState a u v + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with + x hx + have himage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (u.toH1.grad x) + matVecMul (matTranspose (a x)) (v.toH1.grad x), + u.toH1.grad x - v.toH1.grad x) := by + simpa [Y, blockResponsePairState, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (u.toH1.grad x) (v.toH1.grad x) + change (blockMatVecMul (blockCoeffField a x) (((1 / 2 : ℝ) • Y).eval x)).2 = + (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x) + rw [BlockState.eval_smul, blockMatVecMul_smul] + simpa using congrArg Prod.snd (congrArg ((1 / 2 : ℝ) • ·) himage) + +theorem blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + BlockResponseIntegrabilityData U a (blockResponsePairHalfState a u v) := by + have hGradDiffPot : + IsPotentialOn U (fun x => (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x)) := by + have hGradDiff : + IsPotentialOn U (fun x => u.toH1.grad x - v.toH1.grad x) := by + simpa [sub_eq_add_neg, Pi.add_apply, Pi.smul_apply] using! + isPotentialOn_add u.toH1.isPotentialOn (isPotentialOn_smul v.toH1.isPotentialOn (-1 : ℝ)) + exact isPotentialOn_smul hGradDiff (1 / 2 : ℝ) + exact + blockResponseIntegrabilityData_of_lowerImage_ae_eq_potential_of_mem_responseSpace_of_isEllipticFieldOn + (hX := by + simpa [blockResponsePairHalfState] using! + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn (a := a) hEll u v)) + hGradDiffPot + (blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn (a := a) hEll u v) + hEll + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation.lean new file mode 100644 index 0000000000..439a1c5a13 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.Integrand +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.PairHalfScalar +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.VolumeAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.BlockEnergyFirstVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.ResponseJMuAdjoint + +/-! +# BlockResponse perturbation, first-variation, and witness identities +(aggregate re-export) + +Previously a 2169-line monolithic module; now split along thematic +boundaries into the five files imported above. Shim for backward compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/BlockEnergyFirstVariation.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/BlockEnergyFirstVariation.lean new file mode 100644 index 0000000000..7c3bdd0d2d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/BlockEnergyFirstVariation.lean @@ -0,0 +1,586 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.VolumeAverage + +/-! # Block Energy First Variation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse perturbation -- blockEnergyAverage and scalarFirstVariation + +blockEnergyAverage_blockResponsePairHalfState = quarter scalarVariationEnergySum +under IsEllipticFieldOn, together with the three scalarFirstVariation-zero +theorems (zero_right, neg_left_zero, neg_left_right) for ae-equal pair-half +states under IsBlockMuAdmissible. +-/ + +/-- The half-pair witness has block energy equal to one quarter of the sum of +the primal and adjoint scalar variation energies. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_quarter_scalarVariationEnergySum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + (1 / 4 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) + + (1 / 4 : ℝ) * + volumeAverage U + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := by + have hsplit := + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn_of_finiteMeasure + (a := a) hU hEll (p := 0) (pStar := 0) (q := 0) (qStar := 0) u v + have hleft : + volumeAverage U + (blockResponseIntegrand a (0, 0) (0, 0) (blockResponsePairHalfState a u v)) = + -(blockEnergyAverage U a (blockResponsePairHalfState a u v)) := by + have hfun : + blockResponseIntegrand a (0, 0) (0, 0) (blockResponsePairHalfState a u v) = + fun x => -blockEnergyDensity a (blockResponsePairHalfState a u v) x := by + funext x + simp [blockResponseIntegrand, blockVecDot, vecDot_zero_left] + calc + volumeAverage U + (blockResponseIntegrand a (0, 0) (0, 0) (blockResponsePairHalfState a u v)) = + volumeAverage U (fun x => -blockEnergyDensity a (blockResponsePairHalfState a u v) x) := by + rw [hfun] + _ = volumeAverage U ((-1 : ℝ) • blockEnergyDensity a (blockResponsePairHalfState a u v)) := by + congr 1 + funext x + simp [smul_eq_mul] + _ = -(blockEnergyAverage U a (blockResponsePairHalfState a u v)) := by + simpa [blockEnergyAverage, smul_eq_mul] using + (volumeAverage_smul U (-1 : ℝ) + (blockEnergyDensity a (blockResponsePairHalfState a u v))) + have hu : + volumeAverage U (scalarResponseIntegrand U a 0 0 u) = + (-(1 / 2 : ℝ)) * volumeAverage U (scalarVariationEnergyIntegrand a u) := by + have hfun : + scalarResponseIntegrand U a 0 0 u = + (-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a u := by + funext x + simp [scalarResponseIntegrand, scalarVariationEnergyIntegrand, smul_eq_mul, + vecDot_zero_left] + calc + volumeAverage U (scalarResponseIntegrand U a 0 0 u) = + volumeAverage U ((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a u) := by + rw [hfun] + _ = (-(1 / 2 : ℝ)) * volumeAverage U (scalarVariationEnergyIntegrand a u) := by + simpa [smul_eq_mul] using + (volumeAverage_smul U (-(1 / 2 : ℝ)) (scalarVariationEnergyIntegrand a u)) + have hv : + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) 0 0 v) = + (-(1 / 2 : ℝ)) * + volumeAverage U + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := by + have hfun : + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) 0 0 v = + (-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v := by + funext x + simp [scalarResponseIntegrand, scalarVariationEnergyIntegrand, smul_eq_mul, + vecDot_zero_left] + calc + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) 0 0 v) = + volumeAverage U + ((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := by + rw [hfun] + _ = (-(1 / 2 : ℝ)) * + volumeAverage U + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := by + simpa [smul_eq_mul] using + (volumeAverage_smul U (-(1 / 2 : ℝ)) + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v)) + linarith [hleft, hsplit, hu, hv] + +/-- +Decoupling lemma for the pure-flux slice. + +If a recovered `\mu`-admissible state at coarse data `(0,q)` is a.e. a +primal/adjoint half-pair, then the primal member of the half-pair satisfies the +scalar Euler-Lagrange identity for `ResponseJ U 0 q a`. +-/ +theorem scalarFirstVariation_zero_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (q : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (X : BlockState d) + (hEq : + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + X.eval) + (hAdm : IsBlockMuAdmissible U (0, q) X) : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a 0 q u w) = 0 := by + intro w + let zeroAdj : AHarmonicFunction (Homogenization.adjointCoeffField a) U := 0 + let Xpair : BlockState d := blockResponsePairHalfState a u v + let T : BlockState d := blockResponsePairHalfState a w zeroAdj + let Ycorr : BlockState d := + { potential := fun x => X.potential x - (0 : Vec d) + flux := fun x => X.flux x - q } + have hT : BlockResponseSpace a U T := by + simpa [T, zeroAdj, blockResponsePairHalfState, blockResponsePairState] using + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a) hEll w zeroAdj) + have hYtest : IsBlockTestOn U Ycorr := by + refine ⟨?_, ?_⟩ + · simpa [Ycorr] using! hAdm.isPotentialZeroTrace + · simpa [Ycorr] using! hAdm.isSolenoidalZeroNormalTrace + have horth : + ∫ x in U, + blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume = 0 := + hT.2.2 Ycorr hYtest + have hLowerT : + (fun x => + (blockMatVecMul (blockCoeffField a x) (T.eval x)).2) + =ᵐ[volumeMeasureOn U] fun x => T.potential x := by + have h := + blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + (a := a) hEll w zeroAdj + filter_upwards [h] with x hx + simpa [T, zeroAdj, blockResponsePairHalfState, blockResponsePairState] using! hx + have hBlock : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, (0 : Vec d)) Xpair T) = 0 := by + unfold volumeAverage + have hInt : + ∫ x in U, + blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, (0 : Vec d)) Xpair T x + ∂MeasureTheory.volume = + ∫ x in U, + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq, hLowerT] with x hxEq hxLower + have hcomm : + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) = + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hxEq] + simpa [blockCoeffField] using + blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) (T.eval x) (X.eval x) + have hQ : + blockVecDot (q, (0 : Vec d)) (T.eval x) = + blockVecDot ((0 : Vec d), q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + calc + blockVecDot (q, (0 : Vec d)) (T.eval x) = vecDot q (T.potential x) := by + simp [BlockState.eval, blockVecDot, vecDot_zero_left] + _ = + vecDot q ((blockMatVecMul (blockCoeffField a x) (T.eval x)).2) := by + rw [hxLower] + _ = + blockVecDot ((0 : Vec d), q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [blockVecDot, vecDot_zero_left] + calc + blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, (0 : Vec d)) Xpair T x + = + blockVecDot (q, (0 : Vec d)) (T.eval x) - + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) := by + simp [blockFirstVariationIntegrand, blockVecDot, vecDot_zero_left] + _ = + blockVecDot ((0 : Vec d), q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) - + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hQ, hcomm] + _ = + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [Ycorr, BlockState.eval, blockVecDot, sub_eq_add_neg, vecDot_add_left, + vecDot_neg_left, vecDot_zero_left] + ring_nf + rw [hInt, MeasureTheory.integral_neg, horth, neg_zero, mul_zero] + have hsplit := + volumeAverage_blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_of_isEllipticFieldOn + (a := a) hU hEll (0 : Vec d) (0 : Vec d) (0 : Vec d) q u w v zeroAdj + have hsplit' : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, (0 : Vec d)) Xpair T) = + (1 / 2 : ℝ) * + volumeAverage U (scalarFirstVariationIntegrand U a 0 q u w) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + 0 q v zeroAdj) := by + simpa [Xpair, T] using hsplit + have hAdjZero : + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) 0 q v zeroAdj) = 0 := by + have hfun : + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) 0 q v zeroAdj = + fun _ => 0 := by + funext x + simp [scalarFirstVariationIntegrand, zeroAdj, vecDot_zero_left, vecDot_zero_right] + rw [hfun] + simp [volumeAverage] + linarith [hBlock, hsplit', hAdjZero] + +/-- +Decoupling lemma for the pure-gradient slice. + +The sign is forced by the block convention: a recovered `\mu`-admissible state +at coarse data `(p,0)` yields the primal scalar Euler-Lagrange identity for +`ResponseJ U (-p) 0 a`. The final energy statement removes this sign using the +quadratic homogeneity of `ResponseJ`. +-/ +theorem scalarFirstVariation_neg_left_zero_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (X : BlockState d) + (hEq : + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + X.eval) + (hAdm : IsBlockMuAdmissible U (p, 0) X) : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a (-p) 0 u w) = 0 := by + intro w + let zeroAdj : AHarmonicFunction (Homogenization.adjointCoeffField a) U := 0 + let Xpair : BlockState d := blockResponsePairHalfState a u v + let T : BlockState d := blockResponsePairHalfState a w zeroAdj + let Ycorr : BlockState d := + { potential := fun x => X.potential x - p + flux := fun x => X.flux x - (0 : Vec d) } + have hT : BlockResponseSpace a U T := by + simpa [T, zeroAdj, blockResponsePairHalfState, blockResponsePairState] using + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a) hEll w zeroAdj) + have hYtest : IsBlockTestOn U Ycorr := by + refine ⟨?_, ?_⟩ + · simpa [Ycorr] using! hAdm.isPotentialZeroTrace + · simpa [Ycorr] using! hAdm.isSolenoidalZeroNormalTrace + have horth : + ∫ x in U, + blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume = 0 := + hT.2.2 Ycorr hYtest + have hUpperT : + (fun x => + (blockMatVecMul (blockCoeffField a x) (T.eval x)).1) + =ᵐ[volumeMeasureOn U] fun x => T.flux x := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + let Y : BlockState d := blockResponsePairState a w zeroAdj + have hYimage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) := by + simpa [Y, blockResponsePairState, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (w.toH1.grad x) (zeroAdj.toH1.grad x) + have hThalf : + blockMatVecMul (blockCoeffField a x) (T.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) := by + change + blockMatVecMul (blockCoeffField a x) ((1 / 2 : ℝ) • Y.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) + rw [blockMatVecMul_smul, hYimage] + calc + (blockMatVecMul (blockCoeffField a x) (T.eval x)).1 = + ((1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x)).1 := by + rw [hThalf] + _ = T.flux x := by + change + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x)) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) - + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x)) + simp [zeroAdj, matVecMul_zero] + have hBlock : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (0, p) Xpair T) = 0 := by + unfold volumeAverage + have hInt : + ∫ x in U, + blockFirstVariationIntegrand a (0, (0 : Vec d)) (0, p) Xpair T x + ∂MeasureTheory.volume = + ∫ x in U, + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq, hUpperT] with x hxEq hxUpper + have hcomm : + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) = + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hxEq] + simpa [blockCoeffField] using + blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) (T.eval x) (X.eval x) + have hP : + blockVecDot (0, p) (T.eval x) = + blockVecDot (p, (0 : Vec d)) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + calc + blockVecDot (0, p) (T.eval x) = vecDot p (T.flux x) := by + simp [BlockState.eval, blockVecDot, vecDot_zero_left] + _ = + vecDot p ((blockMatVecMul (blockCoeffField a x) (T.eval x)).1) := by + rw [hxUpper] + _ = + blockVecDot (p, (0 : Vec d)) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [blockVecDot, vecDot_zero_left] + calc + blockFirstVariationIntegrand a (0, (0 : Vec d)) (0, p) Xpair T x + = + blockVecDot (0, p) (T.eval x) - + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) := by + simp [blockFirstVariationIntegrand, blockVecDot, vecDot_zero_left] + _ = + blockVecDot (p, (0 : Vec d)) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) - + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hP, hcomm] + _ = + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [Ycorr, BlockState.eval, blockVecDot, sub_eq_add_neg, vecDot_add_left, + vecDot_neg_left, vecDot_zero_left] + ring_nf + rw [hInt, MeasureTheory.integral_neg, horth, neg_zero, mul_zero] + have hsplit := + volumeAverage_blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_of_isEllipticFieldOn + (a := a) hU hEll (0 : Vec d) p (0 : Vec d) (0 : Vec d) u w v zeroAdj + have hsplit' : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (0, p) Xpair T) = + (1 / 2 : ℝ) * + volumeAverage U (scalarFirstVariationIntegrand U a (-p) 0 u w) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + p 0 v zeroAdj) := by + simpa [Xpair, T] using hsplit + have hAdjZero : + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) p 0 v zeroAdj) = 0 := by + have hfun : + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) p 0 v zeroAdj = + fun _ => 0 := by + funext x + simp [scalarFirstVariationIntegrand, zeroAdj, vecDot_zero_left, vecDot_zero_right, + matVecMul_zero] + rw [hfun] + simp [volumeAverage] + linarith [hBlock, hsplit', hAdjZero] + +/-- +Decoupling lemma for arbitrary block data. + +The sign in the primal scalar first variation is dictated by the block +convention: a recovered `\mu`-admissible state at coarse datum `(p,q)` yields +the Euler-Lagrange identity for `ResponseJ U (-p) q a`. +-/ +theorem scalarFirstVariation_neg_left_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (X : BlockState d) + (hEq : + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + X.eval) + (hAdm : IsBlockMuAdmissible U (p, q) X) : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a (-p) q u w) = 0 := by + intro w + let zeroAdj : AHarmonicFunction (Homogenization.adjointCoeffField a) U := 0 + let Xpair : BlockState d := blockResponsePairHalfState a u v + let T : BlockState d := blockResponsePairHalfState a w zeroAdj + let Ycorr : BlockState d := + { potential := fun x => X.potential x - p + flux := fun x => X.flux x - q } + have hT : BlockResponseSpace a U T := by + simpa [T, zeroAdj, blockResponsePairHalfState, blockResponsePairState] using + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a) hEll w zeroAdj) + have hYtest : IsBlockTestOn U Ycorr := by + refine ⟨?_, ?_⟩ + · simpa [Ycorr] using! hAdm.isPotentialZeroTrace + · simpa [Ycorr] using! hAdm.isSolenoidalZeroNormalTrace + have horth : + ∫ x in U, + blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume = 0 := + hT.2.2 Ycorr hYtest + have hLowerT : + (fun x => + (blockMatVecMul (blockCoeffField a x) (T.eval x)).2) + =ᵐ[volumeMeasureOn U] fun x => T.potential x := by + have h := + blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + (a := a) hEll w zeroAdj + filter_upwards [h] with x hx + simpa [T, zeroAdj, blockResponsePairHalfState, blockResponsePairState] using! hx + have hUpperT : + (fun x => + (blockMatVecMul (blockCoeffField a x) (T.eval x)).1) + =ᵐ[volumeMeasureOn U] fun x => T.flux x := by + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + let Y : BlockState d := blockResponsePairState a w zeroAdj + have hYimage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) := by + simpa [Y, blockResponsePairState, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (w.toH1.grad x) (zeroAdj.toH1.grad x) + have hThalf : + blockMatVecMul (blockCoeffField a x) (T.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) := by + change + blockMatVecMul (blockCoeffField a x) ((1 / 2 : ℝ) • Y.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x) + rw [blockMatVecMul_smul, hYimage] + calc + (blockMatVecMul (blockCoeffField a x) (T.eval x)).1 = + ((1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x), + w.toH1.grad x - zeroAdj.toH1.grad x)).1 := by + rw [hThalf] + _ = T.flux x := by + change + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x)) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) - + matVecMul (matTranspose (a x)) (zeroAdj.toH1.grad x)) + simp [zeroAdj, matVecMul_zero] + have hBlock : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, p) Xpair T) = 0 := by + unfold volumeAverage + have hInt : + ∫ x in U, + blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, p) Xpair T x + ∂MeasureTheory.volume = + ∫ x in U, + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq, hLowerT, hUpperT] with x hxEq hxLower hxUpper + have hcomm : + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) = + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hxEq] + simpa [blockCoeffField] using + blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) (T.eval x) (X.eval x) + have hPQ : + blockVecDot (q, p) (T.eval x) = + blockVecDot (p, q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + calc + blockVecDot (q, p) (T.eval x) = + vecDot q (T.potential x) + vecDot p (T.flux x) := by + simp [BlockState.eval, blockVecDot] + _ = + vecDot q ((blockMatVecMul (blockCoeffField a x) (T.eval x)).2) + + vecDot p ((blockMatVecMul (blockCoeffField a x) (T.eval x)).1) := by + rw [hxLower, hxUpper] + _ = + blockVecDot (p, q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [blockVecDot, add_comm] + calc + blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, p) Xpair T x + = + blockVecDot (q, p) (T.eval x) - + blockVecDot (T.eval x) + (blockMatVecMul (blockCoeffField a x) (Xpair.eval x)) := by + simp [blockFirstVariationIntegrand, blockVecDot, vecDot_zero_left] + _ = + blockVecDot (p, q) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) - + blockVecDot (X.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + rw [hPQ, hcomm] + _ = + -blockVecDot (Ycorr.eval x) + (blockMatVecMul (blockCoeffField a x) (T.eval x)) := by + simp [Ycorr, BlockState.eval, blockVecDot, sub_eq_add_neg, vecDot_add_left, + vecDot_neg_left] + ring_nf + rw [hInt, MeasureTheory.integral_neg, horth, neg_zero, mul_zero] + have hsplit := + volumeAverage_blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_of_isEllipticFieldOn + (a := a) hU hEll (0 : Vec d) p (0 : Vec d) q u w v zeroAdj + have hsplit' : + volumeAverage U + (blockFirstVariationIntegrand a (0, (0 : Vec d)) (q, p) Xpair T) = + (1 / 2 : ℝ) * + volumeAverage U (scalarFirstVariationIntegrand U a (-p) q u w) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + p q v zeroAdj) := by + simpa [Xpair, T] using hsplit + have hAdjZero : + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) p q v zeroAdj) = 0 := by + have hfun : + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) p q v zeroAdj = + fun _ => 0 := by + funext x + simp [scalarFirstVariationIntegrand, zeroAdj, vecDot_zero_left, vecDot_zero_right, + matVecMul_zero] + rw [hfun] + simp [volumeAverage] + linarith [hBlock, hsplit', hAdjZero] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/Integrand.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/Integrand.lean new file mode 100644 index 0000000000..95a9cd3001 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/Integrand.lean @@ -0,0 +1,462 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility + +/-! # Integrand -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse perturbation -- integrand algebra and plain upper bound + +Integrand basics (zero / smul / add), the first-variation and variation- +energy integrands, the plainUpperBound upper bound under IsEllipticFieldOn, +and the resulting blockJValueSet / blockJ upper bounds. +-/ + +theorem blockResponse_integrand_zero {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) : + blockResponseIntegrand a P Q ({ potential := 0, flux := 0 } : BlockState d) = 0 := by + funext x + simp [blockResponseIntegrand, blockEnergyDensity, BlockState.eval, blockMatVecMul, blockVecDot, + matVecMul_zero, vecDot_zero_right] + +theorem blockResponse_integrand_smul {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (c : ℝ) (X : BlockState d) : + blockResponseIntegrand a P Q (c • X) = + fun x => + -(c ^ 2) * blockEnergyDensity a X x + - c * blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x)) + + c * blockVecDot Q (X.eval x) := by + funext x + simp [blockResponseIntegrand, blockEnergyDensity, pow_two, blockMatVecMul_smul, + blockVecDot_smul_left, blockVecDot_smul_right] + ring + +theorem blockResponse_integrand_smul_data_state {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (c : ℝ) (X : BlockState d) : + blockResponseIntegrand a (c • P) (c • Q) (c • X) = + fun x => c ^ 2 * blockResponseIntegrand a P Q X x := by + rw [blockResponse_integrand_smul] + funext x + simp [blockResponseIntegrand, blockEnergyDensity, blockVecDot_smul_left] + ring + +/-- The linear term in the doubled response functional at base state `X` +in the direction `Y`. -/ +noncomputable def blockFirstVariationIntegrand {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (X Y : BlockState d) : Vec d → ℝ := + fun x => + -blockVecDot P (blockMatVecMul (blockCoeffField a x) (Y.eval x)) + + blockVecDot Q (Y.eval x) + - blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + +/-- The quadratic energy term governing the second variation of the doubled +response functional. -/ +noncomputable def blockVariationEnergyIntegrand {d : ℕ} (a : CoeffField d) + (Y : BlockState d) : Vec d → ℝ := + blockEnergyDensity a Y + +@[simp] theorem blockVariationEnergyIntegrand_eq_blockEnergyDensity {d : ℕ} + (a : CoeffField d) (Y : BlockState d) : + blockVariationEnergyIntegrand a Y = blockEnergyDensity a Y := + rfl + +theorem blockFirstVariationIntegrand_add_direction {d : ℕ} (a : CoeffField d) + (P Q : BlockVec d) (X Y Z : BlockState d) : + blockFirstVariationIntegrand a P Q X (Y + Z) = + fun x => + blockFirstVariationIntegrand a P Q X Y x + + blockFirstVariationIntegrand a P Q X Z x := by + funext x + simp [blockFirstVariationIntegrand, blockMatVecMul_add, blockVecDot_add_left, + blockVecDot_add_right] + ring + +theorem blockFirstVariationIntegrand_smul_direction {d : ℕ} (a : CoeffField d) + (P Q : BlockVec d) (X Y : BlockState d) (c : ℝ) : + blockFirstVariationIntegrand a P Q X (c • Y) = + fun x => c * blockFirstVariationIntegrand a P Q X Y x := by + funext x + simp [blockFirstVariationIntegrand, blockMatVecMul_smul, blockVecDot_smul_left, + blockVecDot_smul_right] + ring + +theorem blockResponse_integrand_add_smul_eq_firstVariation_sub_energy {d : ℕ} + (a : CoeffField d) (P Q : BlockVec d) (X Y : BlockState d) (c : ℝ) : + blockResponseIntegrand a P Q (X + c • Y) = + fun x => + blockResponseIntegrand a P Q X x + + c * blockFirstVariationIntegrand a P Q X Y x - + c ^ 2 * blockVariationEnergyIntegrand a Y x := by + funext x + have hcomm : + blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (Y.eval x)) = + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + simpa [blockCoeffField] using + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm + (A := a x) (X := X.eval x) (Y := Y.eval x)) + simp [blockResponseIntegrand, blockFirstVariationIntegrand, blockVariationEnergyIntegrand, + blockEnergyDensity, blockMatVecMul_add, blockMatVecMul_smul, blockVecDot_add_left, + blockVecDot_add_right, blockVecDot_smul_left, blockVecDot_smul_right, pow_two] + rw [hcomm] + ring + +theorem blockResponse_integrand_add_eq_firstVariation_sub_energy {d : ℕ} + (a : CoeffField d) (P Q : BlockVec d) (X Y : BlockState d) : + blockResponseIntegrand a P Q (X + Y) = + fun x => + blockResponseIntegrand a P Q X x + + blockFirstVariationIntegrand a P Q X Y x - + blockVariationEnergyIntegrand a Y x := by + funext x + have hcomm : + blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (Y.eval x)) = + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + simpa [blockCoeffField] using + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm + (A := a x) (X := X.eval x) (Y := Y.eval x)) + simp [blockResponseIntegrand, blockFirstVariationIntegrand, blockVariationEnergyIntegrand, + blockEnergyDensity, blockMatVecMul_add, blockVecDot_add_left, blockVecDot_add_right] + rw [hcomm] + ring + +theorem volumeAverage_blockResponse_integrand_add_smul_eq_firstVariation_sub_energy + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) (P Q : BlockVec d) + (X Y : BlockState d) (c : ℝ) + (hresp : MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) + (hlin : MeasureTheory.IntegrableOn (blockFirstVariationIntegrand a P Q X Y) U) + (henergy : MeasureTheory.IntegrableOn (blockVariationEnergyIntegrand a Y) U) : + volumeAverage U (blockResponseIntegrand a P Q (X + c • Y)) = + volumeAverage U (blockResponseIntegrand a P Q X) + + c * volumeAverage U (blockFirstVariationIntegrand a P Q X Y) - + c ^ 2 * volumeAverage U (blockVariationEnergyIntegrand a Y) := by + rw [blockResponse_integrand_add_smul_eq_firstVariation_sub_energy] + have hlin_smul : MeasureTheory.IntegrableOn (c • blockFirstVariationIntegrand a P Q X Y) U := by + simpa [MeasureTheory.IntegrableOn] using hlin.integrable.smul c + have henergy_smul : + MeasureTheory.IntegrableOn ((c ^ 2) • blockVariationEnergyIntegrand a Y) U := by + simpa [MeasureTheory.IntegrableOn] using henergy.integrable.smul (c ^ 2) + have hadd : + MeasureTheory.IntegrableOn + (blockResponseIntegrand a P Q X + c • blockFirstVariationIntegrand a P Q X Y) U := by + simpa [MeasureTheory.IntegrableOn] using hresp.integrable.add hlin_smul.integrable + have hfun : + (fun x => + blockResponseIntegrand a P Q X x + + c * blockFirstVariationIntegrand a P Q X Y x - + c ^ 2 * blockVariationEnergyIntegrand a Y x) = + (blockResponseIntegrand a P Q X + c • blockFirstVariationIntegrand a P Q X Y) - + (c ^ 2) • blockVariationEnergyIntegrand a Y := by + funext x + simp [sub_eq_add_neg, smul_eq_mul] + rw [hfun] + rw [volumeAverage_sub hadd henergy_smul, volumeAverage_add hresp hlin_smul, volumeAverage_smul, + volumeAverage_smul] + +theorem volumeAverage_blockResponse_integrand_add_eq_firstVariation_sub_energy + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) (P Q : BlockVec d) + (X Y : BlockState d) + (hresp : MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) + (hlin : MeasureTheory.IntegrableOn (blockFirstVariationIntegrand a P Q X Y) U) + (henergy : MeasureTheory.IntegrableOn (blockVariationEnergyIntegrand a Y) U) : + volumeAverage U (blockResponseIntegrand a P Q (X + Y)) = + volumeAverage U (blockResponseIntegrand a P Q X) + + volumeAverage U (blockFirstVariationIntegrand a P Q X Y) - + volumeAverage U (blockVariationEnergyIntegrand a Y) := by + rw [blockResponse_integrand_add_eq_firstVariation_sub_energy] + have hadd : + MeasureTheory.IntegrableOn + (blockResponseIntegrand a P Q X + blockFirstVariationIntegrand a P Q X Y) U := by + simpa [MeasureTheory.IntegrableOn] using hresp.integrable.add hlin.integrable + have hfun : + (fun x => + blockResponseIntegrand a P Q X x + + blockFirstVariationIntegrand a P Q X Y x - + blockVariationEnergyIntegrand a Y x) = + (blockResponseIntegrand a P Q X + blockFirstVariationIntegrand a P Q X Y) - + blockVariationEnergyIntegrand a Y := by + funext x + simp [sub_eq_add_neg] + rw [hfun] + rw [volumeAverage_sub hadd henergy, volumeAverage_add hresp hlin] + +theorem volumeAverage_blockFirstVariationIntegrand_zero_data_eq_zero_of_mem_responseSpace + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {X Y : BlockState d} + (hX : BlockResponseSpace a U X) (hY : IsBlockTestOn U Y) : + volumeAverage U (blockFirstVariationIntegrand a 0 0 X Y) = 0 := by + apply volumeAverage_eq_zero_of_integral_eq_zero + have horth := hX.2.2 Y hY + have hfun : + blockFirstVariationIntegrand a (0 : BlockVec d) 0 X Y = + fun x => + -blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) := by + funext x + simp [blockFirstVariationIntegrand, blockVecDot, vecDot_zero_left] + rw [hfun] + rw [MeasureTheory.integral_neg] + simpa using horth + +noncomputable def blockResponsePlainUpperBound {d : ℕ} (lam Lam : ℝ) + (P Q : BlockVec d) : ℝ := + (lam / (1 + 2 * Lam ^ 2))⁻¹ * blockVecDot Q Q + + (lam / (1 + 2 * Lam ^ 2))⁻¹ * + blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot P P + +theorem blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (P Q : BlockVec d) (X : BlockState d) : + ∀ x ∈ U, + blockResponseIntegrand a P Q X x ≤ blockResponsePlainUpperBound lam Lam P Q := by + intro x hx + let B : BlockMat d := blockCoeffField a x + let Z : BlockVec d := X.eval x + let R : BlockVec d := Q - blockMatVecMul B P + let c : ℝ := lam / (1 + 2 * Lam ^ 2) + have hA : IsEllipticMatrix lam Lam (a x) := hEll.2 x hx + have hc_pos : 0 < c := by + have hden_pos : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + exact div_pos hA.1 hden_pos + have hcoercive : + c * blockVecDot Z Z ≤ blockVecDot Z (blockMatVecMul B Z) := by + simpa [c, B, Z, blockCoeffField] using + blockMatrixOfCoeff_coercive_of_isEllipticMatrix hA Z + have himageP : + blockVecDot (blockMatVecMul B P) (blockMatVecMul B P) ≤ + blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot P P := by + simpa [B, blockCoeffField] using + blockMatrixOfCoeff_image_bound_of_isEllipticMatrix hA P + have hrewrite : + blockResponseIntegrand a P Q X x = + -((1 / 2 : ℝ) * blockVecDot Z (blockMatVecMul B Z)) + blockVecDot R Z := by + have hcomm : + blockVecDot P (blockMatVecMul B Z) = blockVecDot Z (blockMatVecMul B P) := by + simpa [B, blockCoeffField] using + blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm (a x) P Z + have hsub : + blockVecDot (X.eval x) (Q - blockMatVecMul (blockCoeffField a x) P) = + blockVecDot (X.eval x) Q - + blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) P) := by + have hsubVec : + Q - blockMatVecMul (blockCoeffField a x) P = + Q + (-1 : ℝ) • blockMatVecMul (blockCoeffField a x) P := by + ext i <;> simp [sub_eq_add_neg] + rw [hsubVec] + rw [blockVecDot_add_right, blockVecDot_smul_right] + ring + unfold blockResponseIntegrand blockEnergyDensity + dsimp [Z, B, R] + rw [hcomm, blockVecDot_comm Q (X.eval x)] + rw [show blockVecDot (Q - blockMatVecMul (blockCoeffField a x) P) (X.eval x) = + blockVecDot (X.eval x) (Q - blockMatVecMul (blockCoeffField a x) P) by + rw [blockVecDot_comm]] + rw [hsub] + ring + have hCS : + blockVecDot R Z ^ 2 ≤ blockVecDot R R * blockVecDot Z Z := + sq_blockVecDot_le_blockVecDot_mul_blockVecDot R Z + have hR_nonneg : 0 ≤ blockVecDot R R := blockVecDot_nonneg R + have hZ_nonneg : 0 ≤ blockVecDot Z Z := blockVecDot_nonneg Z + have hYoungAbs : + |blockVecDot R Z| ≤ + (1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z := by + have hA_nonneg : + 0 ≤ (1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z := by + positivity + have hA_sq : + blockVecDot R R * blockVecDot Z Z ≤ + ((1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z) ^ 2 := by + let r : ℝ := blockVecDot R R + let z : ℝ := blockVecDot Z Z + have hcoeff_nonneg : 0 ≤ (1 / (4 * c ^ 2) : ℝ) := by + positivity + have hsq_nonneg : + 0 ≤ (r - c ^ 2 * z) ^ 2 := by + positivity + have hidentity : + ((1 / (2 * c)) * r + (c / 2) * z) ^ 2 - r * z = + (1 / (4 * c ^ 2)) * (r - c ^ 2 * z) ^ 2 := by + field_simp [hc_pos.ne'] + ring + have hmain : + r * z ≤ ((1 / (2 * c)) * r + (c / 2) * z) ^ 2 := by + nlinarith [hidentity, hsq_nonneg, hcoeff_nonneg] + simpa [r, z] using hmain + have hAbs_sq : + |blockVecDot R Z| ^ 2 ≤ + ((1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z) ^ 2 := by + calc + |blockVecDot R Z| ^ 2 = blockVecDot R Z ^ 2 := by + rw [sq_abs] + _ ≤ blockVecDot R R * blockVecDot Z Z := hCS + _ ≤ ((1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z) ^ 2 := hA_sq + exact le_of_sq_le_sq hAbs_sq hA_nonneg + have hYoung : + blockVecDot R Z ≤ + (1 / (2 * c)) * blockVecDot R R + (c / 2) * blockVecDot Z Z := by + exact le_trans (le_abs_self _) hYoungAbs + have hmain : + blockResponseIntegrand a P Q X x ≤ (1 / (2 * c)) * blockVecDot R R := by + rw [hrewrite] + nlinarith [hYoung, hcoercive] + have hR_bound : + blockVecDot R R ≤ + 2 * (blockVecDot Q Q + blockVecDot (blockMatVecMul B P) (blockMatVecMul B P)) := by + simpa [R] using blockVecDot_sub_self_le Q (blockMatVecMul B P) + have hhalf_nonneg : 0 ≤ 1 / (2 * c) := by + positivity + have hsplit : + (1 / (2 * c)) * + (2 * (blockVecDot Q Q + blockVecDot (blockMatVecMul B P) (blockMatVecMul B P))) = + c⁻¹ * blockVecDot Q Q + + c⁻¹ * blockVecDot (blockMatVecMul B P) (blockMatVecMul B P) := by + field_simp [hc_pos.ne'] + have hcInv_nonneg : 0 ≤ c⁻¹ := by + positivity + calc + blockResponseIntegrand a P Q X x ≤ (1 / (2 * c)) * blockVecDot R R := hmain + _ ≤ (1 / (2 * c)) * + (2 * (blockVecDot Q Q + blockVecDot (blockMatVecMul B P) (blockMatVecMul B P))) := by + gcongr + _ = c⁻¹ * blockVecDot Q Q + + c⁻¹ * blockVecDot (blockMatVecMul B P) (blockMatVecMul B P) := hsplit + _ ≤ c⁻¹ * blockVecDot Q Q + + c⁻¹ * (blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot P P) := by + gcongr + _ = blockResponsePlainUpperBound lam Lam P Q := by + simp [blockResponsePlainUpperBound, c, mul_assoc, mul_left_comm, mul_comm] + +theorem volumeAverage_blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (P Q : BlockVec d) (X : BlockState d) + (hInt : MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + volumeAverage U (blockResponseIntegrand a P Q X) ≤ + blockResponsePlainUpperBound lam Lam P Q := by + apply volumeAverage_le_of_le_on hU hInt hvol + exact blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn hEll P Q X + +theorem blockJValueSet_bddAbove_of_isEllipticFieldOn_of_integrableOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) + (hInt : + ∀ X : BlockState d, BlockResponseSpace a U X → + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) : + BddAbove (blockJValueSet U P Q a) := by + refine ⟨blockResponsePlainUpperBound lam Lam P Q, ?_⟩ + rintro m ⟨X, hX, _, rfl⟩ + exact volumeAverage_blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + hU hEll P Q X (hInt X hX) hvol + +theorem le_blockJ_of_mem_blockJValueSet_of_isEllipticFieldOn_of_integrableOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) + (hInt : + ∀ X : BlockState d, BlockResponseSpace a U X → + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) + {m : ℝ} (hm : m ∈ blockJValueSet U P Q a) : + m ≤ BlockJ U P Q a := by + unfold BlockJ + exact + le_csSup + (blockJValueSet_bddAbove_of_isEllipticFieldOn_of_integrableOn hU hEll hvol P Q hInt) + hm + +theorem blockJValueSet_bddAbove_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) : + BddAbove (blockJValueSet U P Q a) := by + refine ⟨blockResponsePlainUpperBound lam Lam P Q, ?_⟩ + rintro m ⟨X, hX, hIntX, rfl⟩ + exact volumeAverage_blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + hU hEll P Q X + (blockResponseIntegrand_integrableOn_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn + hX hIntX hEll P Q) + hvol + +theorem le_blockJ_of_mem_blockJValueSet_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) {m : ℝ} (hm : m ∈ blockJValueSet U P Q a) : + m ≤ BlockJ U P Q a := by + unfold BlockJ + exact le_csSup (blockJValueSet_bddAbove_of_isEllipticFieldOn hU hEll hvol P Q) hm + +theorem blockJ_le_plainUpperBound_of_isEllipticFieldOn_of_integrableOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) + (hInt : + ∀ X : BlockState d, BlockResponseSpace a U X → + MeasureTheory.IntegrableOn (blockResponseIntegrand a P Q X) U) : + BlockJ U P Q a ≤ blockResponsePlainUpperBound lam Lam P Q := by + unfold BlockJ + refine csSup_le ?_ ?_ + refine ⟨0, ?_⟩ + have hZeroInt : + BlockResponseIntegrabilityData U a ({ potential := 0, flux := 0 } : BlockState d) := + blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + (blockResponse_zero_mem_responseSpace a U) + (by + change MemVectorL2 U (0 : Vec d → Vec d) + exact MeasureTheory.MemLp.zero) + hEll + refine ⟨({ potential := 0, flux := 0 } : BlockState d), + blockResponse_zero_mem_responseSpace a U, hZeroInt, ?_⟩ + rw [blockResponse_integrand_zero] + simp [volumeAverage] + rintro m ⟨X, hX, _, rfl⟩ + exact volumeAverage_blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + hU hEll P Q X (hInt X hX) hvol + +theorem blockJ_le_plainUpperBound_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P Q : BlockVec d) : + BlockJ U P Q a ≤ blockResponsePlainUpperBound lam Lam P Q := by + unfold BlockJ + refine csSup_le ?_ ?_ + · refine ⟨0, ?_⟩ + refine ⟨({ potential := 0, flux := 0 } : BlockState d), + blockResponse_zero_mem_responseSpace a U, blockResponseIntegrabilityData_zero U a, ?_⟩ + rw [blockResponse_integrand_zero] + simp [volumeAverage] + · rintro m ⟨X, hX, hIntX, rfl⟩ + exact volumeAverage_blockResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn + hU hEll P Q X + (blockResponseIntegrand_integrableOn_of_mem_responseSpace_of_integrabilityData_of_isEllipticFieldOn + hX hIntX hEll P Q) + hvol + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/PairHalfScalar.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/PairHalfScalar.lean new file mode 100644 index 0000000000..6941904347 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/PairHalfScalar.lean @@ -0,0 +1,323 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.Integrand + +/-! # Pair Half Scalar -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse perturbation -- pair-half scalar decomposition + +Pointwise decomposition of blockResponse_integrand on pair-half states into +the scalarResponse sum, and the resulting blockJValueSet membership lemmas +including the responseJ-adjoint-sum and note-form witness theorems. +-/ + +private theorem blockResponse_integrand_pair_half_eq_pointwise_scalar_split_of_pointwise_det {d : ℕ} + (a : CoeffField d) (p pStar q qStar : Vec d) (ξ η : Vec d → Vec d) + (hdet : ∀ x : Vec d, IsUnit (symmPart (a x)).det) : + blockResponseIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • + { potential := fun x => ξ x + η x + flux := fun x => matVecMul (a x) (ξ x) - matVecMul (matTranspose (a x)) (η x) }) = + fun x => + (1 / 2 : ℝ) * pointwiseScalarResponseIntegrand (a x) (p - pStar) (qStar - q) (ξ x) + + (1 / 2 : ℝ) * pointwiseScalarResponseIntegrand (matTranspose (a x)) + (pStar + p) (qStar + q) (η x) := by + let Y : BlockState d := + { potential := fun x => ξ x + η x + flux := fun x => matVecMul (a x) (ξ x) - matVecMul (matTranspose (a x)) (η x) } + funext x + have hsmul := + congrFun (blockResponse_integrand_smul a (p, q) (qStar, pStar) (1 / 2 : ℝ) Y) x + have himage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (ξ x) + matVecMul (matTranspose (a x)) (η x), ξ x - η x) := by + simpa [Y, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isUnit_det_symmPart a x (hdet x) (ξ x) (η x) + have henergy : + blockEnergyDensity a Y x = + vecDot (ξ x) (matVecMul (symmPart (a x)) (ξ x)) + + vecDot (η x) (matVecMul (symmPart (a x)) (η x)) := by + unfold blockEnergyDensity + simpa [Y, BlockState.eval] using! + pointwiseBlockEnergy_pair_eq_symmPart_sum_of_isUnit_det_symmPart + (a x) (hdet x) (ξ x) (η x) + rw [hsmul] + rw [henergy, himage] + simp [Y, BlockState.eval, pointwiseScalarResponseIntegrand, symmPart_matTranspose, blockVecDot, + vecDot_add_left, vecDot_add_right, vecDot_neg_left, vecDot_neg_right, sub_eq_add_neg] + ring_nf + +theorem blockResponse_integrand_pair_half_eq_pointwise_split_of_pointwise_det {d : ℕ} + (a : CoeffField d) (p pStar q qStar : Vec d) (ξ η : Vec d → Vec d) + (hdet : ∀ x : Vec d, IsUnit (symmPart (a x)).det) : + blockResponseIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • + { potential := fun x => ξ x + η x + flux := fun x => matVecMul (a x) (ξ x) - matVecMul (matTranspose (a x)) (η x) }) = + fun x => + (1 / 2 : ℝ) * + (-((1 / 2 : ℝ) * vecDot (ξ x) (matVecMul (symmPart (a x)) (ξ x))) - + vecDot (p - pStar) (matVecMul (a x) (ξ x)) + + vecDot (qStar - q) (ξ x)) + + (1 / 2 : ℝ) * + (-((1 / 2 : ℝ) * vecDot (η x) + (matVecMul (symmPart (matTranspose (a x))) (η x))) - + vecDot (pStar + p) (matVecMul (matTranspose (a x)) (η x)) + + vecDot (qStar + q) (η x)) := by + simpa [pointwiseScalarResponseIntegrand] using + blockResponse_integrand_pair_half_eq_pointwise_scalar_split_of_pointwise_det + (a := a) (p := p) (pStar := pStar) (q := q) (qStar := qStar) + (ξ := ξ) (η := η) hdet + +theorem blockResponse_integrand_pair_half_eq_scalarResponse_sum_on_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + ∀ x ∈ U, + blockResponseIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • + { potential := fun y => u.toH1.grad y + v.toH1.grad y + flux := fun y => + matVecMul (a y) (u.toH1.grad y) - + matVecMul (matTranspose (a y)) (v.toH1.grad y) }) x = + (1 / 2 : ℝ) * + scalarResponseIntegrand U a (p - pStar) (qStar - q) u x + + (1 / 2 : ℝ) * + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v x := by + intro x hx + let Y : BlockState d := + { potential := fun y => u.toH1.grad y + v.toH1.grad y + flux := fun y => + matVecMul (a y) (u.toH1.grad y) - + matVecMul (matTranspose (a y)) (v.toH1.grad y) } + have hsmul := + congrFun (blockResponse_integrand_smul a (p, q) (qStar, pStar) (1 / 2 : ℝ) Y) x + have himage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (u.toH1.grad x) + + matVecMul (matTranspose (a x)) (v.toH1.grad x), + u.toH1.grad x - v.toH1.grad x) := by + simpa [Y, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (u.toH1.grad x) (v.toH1.grad x) + have henergy : + blockEnergyDensity a Y x = + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) + + vecDot (v.toH1.grad x) (matVecMul (symmPart (a x)) (v.toH1.grad x)) := by + unfold blockEnergyDensity + simpa [Y, BlockState.eval] using! + pointwiseBlockEnergy_pair_eq_symmPart_sum_of_isUnit_det_symmPart + (a x) (isUnit_det_symmPart_of_isEllipticMatrix (hEll.2 x hx)) + (u.toH1.grad x) (v.toH1.grad x) + rw [hsmul, henergy, himage] + simp [Y, BlockState.eval, scalarResponseIntegrand, Homogenization.adjointCoeffField, + symmPart_matTranspose, + blockVecDot, vecDot_add_left, vecDot_add_right, vecDot_neg_left, vecDot_neg_right, + sub_eq_add_neg] + ring_nf + +theorem volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) })) = + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a) := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj + have hu_resp := hInt.response (p - pStar) (qStar - q) u + have hv_resp := hIntAdj.response (pStar + p) (qStar + q) v + have hu_half : + MeasureTheory.IntegrableOn + (fun x => (1 / 2 : ℝ) * scalarResponseIntegrand U a (p - pStar) (qStar - q) u x) U := by + simpa [MeasureTheory.IntegrableOn, smul_eq_mul] using! + hu_resp.integrable.smul (1 / 2 : ℝ) + have hv_half : + MeasureTheory.IntegrableOn + (fun x => + (1 / 2 : ℝ) * + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v x) U := by + simpa [MeasureTheory.IntegrableOn, smul_eq_mul] using! + hv_resp.integrable.smul (1 / 2 : ℝ) + have hbridge : + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) })) = + volumeAverage U + (fun x => + (1 / 2 : ℝ) * scalarResponseIntegrand U a (p - pStar) (qStar - q) u x + + (1 / 2 : ℝ) * + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v x) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + exact blockResponse_integrand_pair_half_eq_scalarResponse_sum_on_of_isEllipticFieldOn + (a := a) hEll p pStar q qStar u v x hx + rw [hbridge] + change volumeAverage U + ((fun x => (1 / 2 : ℝ) * scalarResponseIntegrand U a (p - pStar) (qStar - q) u x) + + fun x => + (1 / 2 : ℝ) * + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v x) = + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) + rw [volumeAverage_add hu_half hv_half] + have hu_avg : + volumeAverage U + (fun x => (1 / 2 : ℝ) * scalarResponseIntegrand U a (p - pStar) (qStar - q) u x) = + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) := by + simpa [smul_eq_mul] using! + (volumeAverage_smul U (1 / 2 : ℝ) + (scalarResponseIntegrand U a (p - pStar) (qStar - q) u)) + have hv_avg : + volumeAverage U + (fun x => + (1 / 2 : ℝ) * + scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v x) = + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + simpa [smul_eq_mul] using! + (volumeAverage_smul U (1 / 2 : ℝ) + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v)) + rw [hu_avg, hv_avg] + +theorem blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_responseSpace_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hX : + BlockResponseSpace a U + ((1 / 2 : ℝ) • + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) })) : + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) ∈ + blockJValueSet U (p, q) (qStar, pStar) a := by + refine ⟨((1 / 2 : ℝ) • + { potential := fun x => u.toH1.grad x + v.toH1.grad x + flux := fun x => + matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x) }), hX, + blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn hEll u v, ?_⟩ + symm + exact volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + +theorem blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) ∈ + blockJValueSet U (p, q) (qStar, pStar) a := by + exact blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_responseSpace_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + (blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn (a := a) hEll u v) + +theorem blockResponse_half_responseJ_adjoint_sum_mem_blockJValueSet_of_isResponseMaximizer + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U (p - pStar) (qStar - q) a u) + (hmaxAdj : + IsResponseMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) v) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ∈ + blockJValueSet U (p, q) (qStar, pStar) a := by + simpa [responseJ_eq_of_isResponseMaximizer U (p - pStar) (qStar - q) a hmax, + responseJ_eq_of_isResponseMaximizer U (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a) hmaxAdj] using + blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + +theorem blockResponse_half_responseJ_adjoint_sum_note_form_mem_blockJValueSet_of_isResponseMaximizer + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q h : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U p (q - h) a u) + (hmaxAdj : + IsResponseMaximizer U p (q + h) (Homogenization.adjointCoeffField a) v) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ∈ + blockJValueSet U (p, h) (q, 0) a := by + have hmax' : IsResponseMaximizer U (p - 0) (q - h) a u := by + simpa using hmax + have hmaxAdj' : + IsResponseMaximizer U (0 + p) (q + h) (Homogenization.adjointCoeffField a) v := by + simpa using hmaxAdj + simpa using + blockResponse_half_responseJ_adjoint_sum_mem_blockJValueSet_of_isResponseMaximizer + (a := a) hU hEll (p := p) (pStar := 0) (q := h) (qStar := q) u v + hmax' hmaxAdj' + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/ResponseJMuAdjoint.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/ResponseJMuAdjoint.lean new file mode 100644 index 0000000000..04f9d83cf3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/ResponseJMuAdjoint.lean @@ -0,0 +1,453 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.BlockEnergyFirstVariation + +/-! # Response JMu Adjoint -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse perturbation -- responseJ and mu-adjoint-sum family + +blockEnergyAverage = responseJ identities under pairingAverage and +firstVariation hypotheses, the half-responseJ-sum reduction for +isResponseMaximizer / scalarCanonicalMaximizer data, the upper bound on +mu_zero_right against the half responseJ adjoint sum, and the corresponding +blockJValueSet / blockJ membership / bound theorems. +-/ + +/-- Coupling lemma with arbitrary scalar response data. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_of_pairingAverage_eq_zero_of_firstVariation_eq_zero + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hpair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + ResponseJ U p q a := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let Eu : ℝ := volumeAverage U (scalarVariationEnergyIntegrand a u) + let Ev : ℝ := + volumeAverage U (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) + have hEnergy : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + (1 / 4 : ℝ) * Eu + (1 / 4 : ℝ) * Ev := by + simpa [Eu, Ev] using + blockEnergyAverage_blockResponsePairHalfState_eq_quarter_scalarVariationEnergySum_of_isEllipticFieldOn + (a := a) (measurableSet_of_isEllipticFieldOn hEll) hEll u v + have hPairSplit : + (1 / 4 : ℝ) * Eu - (1 / 4 : ℝ) * Ev = 0 := by + have hsplit := + volumeAverage_statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub + (a := a) hEll u v + linarith [hpair, hsplit] + have hmax : IsResponseMaximizer U p q a u := + isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + U a hEll p q u hfirst + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hJ : ResponseJ U p q a = (1 / 2 : ℝ) * Eu := by + simpa [Eu] using + responseJ_energy_of_isResponseMaximizer U a p q u hmax + (hInt.weakFlux u) (hInt.response p q u) (hInt.firstVariation p q u u) + (hInt.energy u) + linarith [hEnergy, hPairSplit, hJ] + +/-- Coupling lemma with arbitrary scalar response data and nonzero average +state-pairing. The pairing is exactly the correction term between the block +half-pair energy and the scalar response value. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_sub_pairing_of_pairingAverage_eq_of_firstVariation_eq_zero + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (pairing : ℝ) + (hpair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = pairing) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + ResponseJ U p q a - pairing := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let Eu : ℝ := volumeAverage U (scalarVariationEnergyIntegrand a u) + let Ev : ℝ := + volumeAverage U (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) + have hEnergy : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + (1 / 4 : ℝ) * Eu + (1 / 4 : ℝ) * Ev := by + simpa [Eu, Ev] using + blockEnergyAverage_blockResponsePairHalfState_eq_quarter_scalarVariationEnergySum_of_isEllipticFieldOn + (a := a) (measurableSet_of_isEllipticFieldOn hEll) hEll u v + have hPairSplit : + (1 / 4 : ℝ) * Eu - (1 / 4 : ℝ) * Ev = pairing := by + have hsplit := + volumeAverage_statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub + (a := a) hEll u v + linarith [hpair, hsplit] + have hmax : IsResponseMaximizer U p q a u := + isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + U a hEll p q u hfirst + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hJ : ResponseJ U p q a = (1 / 2 : ℝ) * Eu := by + simpa [Eu] using + responseJ_energy_of_isResponseMaximizer U a p q u hmax + (hInt.weakFlux u) (hInt.response p q u) (hInt.firstVariation p q u u) + (hInt.energy u) + linarith [hEnergy, hPairSplit, hJ] + +/-- +Pure-gradient coupling: the recovered first variation appears at `(-p,0)`, +and the final statement uses the quadratic evenness of `ResponseJ` in the +pure-gradient slice. +-/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_left_zero_of_pairingAverage_eq_zero_of_firstVariation_neg_left_zero + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hpair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a (-p) 0 u w) = 0) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + ResponseJ U p 0 a := by + have hneg : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + ResponseJ U (-p) 0 a := + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_of_pairingAverage_eq_zero_of_firstVariation_eq_zero + (a := a) hEll (-p) 0 u v hpair hfirst + have heven : ResponseJ U (-p) 0 a = ResponseJ U p 0 a := by + simpa using + responseJ_homogeneous_zero_right U p a + (c := (-1 : ℝ)) (by norm_num) + exact hneg.trans heven + +/-- Coupling lemma for the pure-flux slice: if the half-pair has zero average +state-pairing and its primal scalar component satisfies the Euler-Lagrange +identity for `ResponseJ U 0 q a`, then the block half-pair energy is exactly +that scalar response value. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_zero_of_pairingAverage_eq_zero_of_firstVariation_eq_zero + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (q : Vec d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hpair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a 0 q u w) = 0) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + ResponseJ U 0 q a := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let Eu : ℝ := volumeAverage U (scalarVariationEnergyIntegrand a u) + let Ev : ℝ := + volumeAverage U (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) + have hEnergy : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + (1 / 4 : ℝ) * Eu + (1 / 4 : ℝ) * Ev := by + simpa [Eu, Ev] using + blockEnergyAverage_blockResponsePairHalfState_eq_quarter_scalarVariationEnergySum_of_isEllipticFieldOn + (a := a) hU hEll u v + have hPairSplit : + (1 / 4 : ℝ) * Eu - (1 / 4 : ℝ) * Ev = 0 := by + have hsplit := + volumeAverage_statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub + (a := a) hEll u v + linarith [hpair, hsplit] + have hmax : IsResponseMaximizer U 0 q a u := + isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + U a hEll 0 q u hfirst + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hJ : ResponseJ U 0 q a = (1 / 2 : ℝ) * Eu := by + simpa [Eu] using + responseJ_energy_of_isResponseMaximizer U a 0 q u hmax + (hInt.weakFlux u) (hInt.response 0 q u) (hInt.firstVariation 0 q u u) + (hInt.energy u) + linarith [hEnergy, hPairSplit, hJ] + +/-- If the two scalar inputs are response maximizers, the half-pair witness has +block energy equal to one half of the sum of the corresponding response +values. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_half_responseJ_sum_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q p' q' : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U p q a u) + (hmaxAdj : + IsResponseMaximizer U p' q' (Homogenization.adjointCoeffField a) v) : + blockEnergyAverage U a (blockResponsePairHalfState a u v) = + (1 / 2 : ℝ) * ResponseJ U p q a + + (1 / 2 : ℝ) * ResponseJ U p' q' (Homogenization.adjointCoeffField a) := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + have hInt := ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hIntAdj := ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj + have henergy := + blockEnergyAverage_blockResponsePairHalfState_eq_quarter_scalarVariationEnergySum_of_isEllipticFieldOn + (a := a) hU hEll u v + have hu : + ResponseJ U p q a = (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) := + responseJ_energy_of_isResponseMaximizer U a p q u hmax + (hInt.weakFlux u) (hInt.response p q u) (hInt.firstVariation p q u u) (hInt.energy u) + have hv : + ResponseJ U p' q' (Homogenization.adjointCoeffField a) = + (1 / 2 : ℝ) * + volumeAverage U + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := + responseJ_energy_of_isResponseMaximizer + U (Homogenization.adjointCoeffField a) p' q' v hmaxAdj + (hIntAdj.weakFlux v) (hIntAdj.response p' q' v) (hIntAdj.firstVariation p' q' v v) + (hIntAdj.energy v) + linarith [henergy, hu, hv] + +/-- Scalar canonical maximizers feed the previous half-pair energy identity +without extra bookkeeping. -/ +theorem blockEnergyAverage_blockResponsePairHalfState_eq_half_responseJ_sum_of_scalarCanonicalMaximizers_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q p' q' : Vec d) + (u : ScalarCanonicalMaximizer U p q a) + (v : ScalarCanonicalMaximizer U p' q' (Homogenization.adjointCoeffField a)) : + blockEnergyAverage U a + (blockResponsePairHalfState a + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) = + (1 / 2 : ℝ) * ResponseJ U p q a + + (1 / 2 : ℝ) * ResponseJ U p' q' (Homogenization.adjointCoeffField a) := by + exact + blockEnergyAverage_blockResponsePairHalfState_eq_half_responseJ_sum_of_isResponseMaximizer_of_isEllipticFieldOn + (a := a) hU hEll p q p' q' + (u := (u : AHarmonicFunction a U)) + (v := (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) + u.isResponseMaximizer v.isResponseMaximizer + +theorem blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_isEllipticFieldOn_of_finiteMeasure + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) ∈ + blockJValueSet U (p, q) (qStar, pStar) a := by + exact + blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + +theorem blockResponse_half_scalarResponse_sum_le_blockJ_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) ≤ + BlockJ U (p, q) (qStar, pStar) a := by + exact + le_blockJ_of_mem_blockJValueSet_of_isEllipticFieldOn + hU hEll hvol (p, q) (qStar, pStar) + (blockResponse_half_scalarResponse_sum_mem_blockJValueSet_of_isEllipticFieldOn_of_finiteMeasure + (a := a) hU hEll p pStar q qStar u v) + +theorem blockResponse_half_responseJ_adjoint_sum_note_form_mem_blockJValueSet_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q h : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U p (q - h) a u) + (hmaxAdj : + IsResponseMaximizer U p (q + h) (Homogenization.adjointCoeffField a) v) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ∈ + blockJValueSet U (p, h) (q, 0) a := by + exact + blockResponse_half_responseJ_adjoint_sum_note_form_mem_blockJValueSet_of_isResponseMaximizer + (a := a) hU hEll p q h u v hmax hmaxAdj + +theorem blockResponse_half_responseJ_adjoint_sum_le_blockJ_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U (p - pStar) (qStar - q) a u) + (hmaxAdj : + IsResponseMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) v) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, q) (qStar, pStar) a := by + exact + le_blockJ_of_mem_blockJValueSet_of_isEllipticFieldOn + hU hEll hvol (p, q) (qStar, pStar) + (blockResponse_half_responseJ_adjoint_sum_mem_blockJValueSet_of_isResponseMaximizer + (a := a) hU hEll p pStar q qStar u v hmax hmaxAdj) + +theorem blockResponse_half_responseJ_adjoint_sum_note_form_le_blockJ_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) + (hmax : IsResponseMaximizer U p (q - h) a u) + (hmaxAdj : + IsResponseMaximizer U p (q + h) (Homogenization.adjointCoeffField a) v) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, h) (q, 0) a := by + have hmax' : IsResponseMaximizer U (p - 0) (q - h) a u := by + simpa using hmax + have hmaxAdj' : + IsResponseMaximizer U (0 + p) (q + h) (Homogenization.adjointCoeffField a) v := by + simpa using hmaxAdj + simpa using + blockResponse_half_responseJ_adjoint_sum_le_blockJ_of_isResponseMaximizer_of_isEllipticFieldOn + (a := a) hU hEll hvol (p := p) (pStar := 0) (q := h) (qStar := q) u v + hmax' hmaxAdj' + +theorem blockResponse_half_responseJ_adjoint_sum_mem_blockJValueSet_of_scalarCanonicalMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a) + (v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ∈ + blockJValueSet U (p, q) (qStar, pStar) a := by + exact + blockResponse_half_responseJ_adjoint_sum_mem_blockJValueSet_of_isResponseMaximizer + (a := a) hU hEll p pStar q qStar + (u := (u : AHarmonicFunction a U)) + (v := (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) + u.isResponseMaximizer v.isResponseMaximizer + +theorem blockResponse_half_responseJ_adjoint_sum_note_form_mem_blockJValueSet_of_scalarCanonicalMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p q h : Vec d) + (u : ScalarCanonicalMaximizer U p (q - h) a) + (v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a)) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ∈ + blockJValueSet U (p, h) (q, 0) a := by + exact + blockResponse_half_responseJ_adjoint_sum_note_form_mem_blockJValueSet_of_isResponseMaximizer_of_isEllipticFieldOn + (a := a) hU hEll p q h + (u := (u : AHarmonicFunction a U)) + (v := (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) + u.isResponseMaximizer v.isResponseMaximizer + +theorem blockResponse_half_responseJ_adjoint_sum_le_blockJ_of_scalarCanonicalMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p pStar q qStar : Vec d) + (u : ScalarCanonicalMaximizer U (p - pStar) (qStar - q) a) + (v : ScalarCanonicalMaximizer U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a)) : + (1 / 2 : ℝ) * ResponseJ U (p - pStar) (qStar - q) a + + (1 / 2 : ℝ) * + ResponseJ U (pStar + p) (qStar + q) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, q) (qStar, pStar) a := by + exact + blockResponse_half_responseJ_adjoint_sum_le_blockJ_of_isResponseMaximizer_of_isEllipticFieldOn + (a := a) hU hEll hvol p pStar q qStar + (u := (u : AHarmonicFunction a U)) + (v := (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) + u.isResponseMaximizer v.isResponseMaximizer + +theorem blockResponse_half_responseJ_adjoint_sum_note_form_le_blockJ_of_scalarCanonicalMaximizer_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q h : Vec d) + (u : ScalarCanonicalMaximizer U p (q - h) a) + (v : ScalarCanonicalMaximizer U p (q + h) (Homogenization.adjointCoeffField a)) : + (1 / 2 : ℝ) * ResponseJ U p (q - h) a + + (1 / 2 : ℝ) * + ResponseJ U p (q + h) (Homogenization.adjointCoeffField a) ≤ + BlockJ U (p, h) (q, 0) a := by + exact + blockResponse_half_responseJ_adjoint_sum_note_form_le_blockJ_of_isResponseMaximizer_of_isEllipticFieldOn + (a := a) hU hEll hvol p q h + (u := (u : AHarmonicFunction a U)) + (v := (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U)) + u.isResponseMaximizer v.isResponseMaximizer + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/VolumeAverage.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/VolumeAverage.lean new file mode 100644 index 0000000000..6ec322a759 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/BlockResponse/Perturbation/VolumeAverage.lean @@ -0,0 +1,321 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Perturbation.PairHalfScalar + +/-! # Volume Average -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# BlockResponse perturbation -- volume-averaged identities + +Volume-average versions of the pair-half scalar decomposition (with and +without the finite-measure assumption), the first-variation pair-half +identity, and the statePairing = quarter scalarVariationEnergy equality. +-/ + +theorem volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn_of_finiteMeasure + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u : AHarmonicFunction a U) (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v)) = + (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + simpa [blockResponsePairHalfState] using! + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a) hU hEll p pStar q qStar u v + +/-- The block first variation around a primal/adjoint half-pair splits into the +corresponding primal and adjoint scalar first variations. -/ +theorem blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_on_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u w : AHarmonicFunction a U) + (v z : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + ∀ x ∈ U, + blockFirstVariationIntegrand a (p, q) (qStar, pStar) + (blockResponsePairHalfState a u v) + (blockResponsePairHalfState a w z) x = + (1 / 2 : ℝ) * + scalarFirstVariationIntegrand U a (p - pStar) (qStar - q) u w x + + (1 / 2 : ℝ) * + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v z x := by + intro x hx + let X : BlockState d := blockResponsePairState a u v + let Y : BlockState d := blockResponsePairState a w z + have hXimage : + blockMatVecMul (blockCoeffField a x) (X.eval x) = + (matVecMul (a x) (u.toH1.grad x) + + matVecMul (matTranspose (a x)) (v.toH1.grad x), + u.toH1.grad x - v.toH1.grad x) := by + simpa [X, blockResponsePairState, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (u.toH1.grad x) (v.toH1.grad x) + have hYimage : + blockMatVecMul (blockCoeffField a x) (Y.eval x) = + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (z.toH1.grad x), + w.toH1.grad x - z.toH1.grad x) := by + simpa [Y, blockResponsePairState, BlockState.eval] using + blockMatVecMul_blockCoeffField_pair_of_isEllipticFieldOn + (a := a) hEll hx (w.toH1.grad x) (z.toH1.grad x) + have hcross_u : + vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) = + (1 / 2 : ℝ) * + (vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) + + vecDot (matVecMul (a x) (w.toH1.grad x)) (u.toH1.grad x)) := by + simp [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, + vecDot_add_right, vecDot_smul_right, vecDot_matVecMul_transpose] + ring_nf + have hcross_v : + vecDot (z.toH1.grad x) (matVecMul (symmPart (matTranspose (a x))) (v.toH1.grad x)) = + (1 / 2 : ℝ) * + (vecDot (z.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) + + vecDot (matVecMul (matTranspose (a x)) (z.toH1.grad x)) (v.toH1.grad x)) := by + simp [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, + vecDot_add_right, vecDot_smul_right, matTranspose] + rw [show + vecDot (z.toH1.grad x) (matVecMul (a x) (v.toH1.grad x)) = + vecDot (matVecMul (matTranspose (a x)) (z.toH1.grad x)) (v.toH1.grad x) by + simpa [matTranspose] using + (vecDot_matVecMul_transpose (z.toH1.grad x) (v.toH1.grad x) + (matTranspose (a x)))] + simp [matTranspose] + ring_nf + have hcross_v_symm : + vecDot (z.toH1.grad x) (matVecMul (symmPart (a x)) (v.toH1.grad x)) = + (1 / 2 : ℝ) * + (vecDot (z.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) + + vecDot (matVecMul (matTranspose (a x)) (z.toH1.grad x)) (v.toH1.grad x)) := by + simpa [symmPart_matTranspose] using hcross_v + change + blockFirstVariationIntegrand a (p, q) (qStar, pStar) + ((1 / 2 : ℝ) • X) ((1 / 2 : ℝ) • Y) x = + (1 / 2 : ℝ) * + scalarFirstVariationIntegrand U a (p - pStar) (qStar - q) u w x + + (1 / 2 : ℝ) * + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v z x + have hXhalf : + blockMatVecMul (blockCoeffField a x) (((1 / 2 : ℝ) • X).eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (u.toH1.grad x) + + matVecMul (matTranspose (a x)) (v.toH1.grad x), + u.toH1.grad x - v.toH1.grad x) := by + change + blockMatVecMul (blockCoeffField a x) ((1 / 2 : ℝ) • X.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (u.toH1.grad x) + + matVecMul (matTranspose (a x)) (v.toH1.grad x), + u.toH1.grad x - v.toH1.grad x) + rw [blockMatVecMul_smul, hXimage] + have hYhalf : + blockMatVecMul (blockCoeffField a x) (((1 / 2 : ℝ) • Y).eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (z.toH1.grad x), + w.toH1.grad x - z.toH1.grad x) := by + change + blockMatVecMul (blockCoeffField a x) ((1 / 2 : ℝ) • Y.eval x) = + (1 / 2 : ℝ) • + (matVecMul (a x) (w.toH1.grad x) + + matVecMul (matTranspose (a x)) (z.toH1.grad x), + w.toH1.grad x - z.toH1.grad x) + rw [blockMatVecMul_smul, hYimage] + have hYeval : + (((1 / 2 : ℝ) • Y).eval x) = + (1 / 2 : ℝ) • + (w.toH1.grad x + z.toH1.grad x, + matVecMul (a x) (w.toH1.grad x) - + matVecMul (matTranspose (a x)) (z.toH1.grad x)) := by + change ((1 / 2 : ℝ) • Y.eval x) = + (1 / 2 : ℝ) • + (w.toH1.grad x + z.toH1.grad x, + matVecMul (a x) (w.toH1.grad x) - + matVecMul (matTranspose (a x)) (z.toH1.grad x)) + rfl + have hcross_wv : + vecDot (matVecMul (a x) (w.toH1.grad x)) (v.toH1.grad x) = + vecDot (w.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) := by + exact (vecDot_matVecMul_transpose (w.toH1.grad x) (v.toH1.grad x) (a x)).symm + have hcross_zu : + vecDot (matVecMul (matTranspose (a x)) (z.toH1.grad x)) (u.toH1.grad x) = + vecDot (z.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) := by + simpa [matTranspose] using + (vecDot_matVecMul_transpose (z.toH1.grad x) (u.toH1.grad x) (matTranspose (a x))).symm + unfold blockFirstVariationIntegrand scalarFirstVariationIntegrand + rw [hYhalf, hXhalf, hYeval] + simp [blockVecDot, + Homogenization.adjointCoeffField, symmPart_matTranspose, vecDot_add_left, vecDot_add_right, + vecDot_neg_left, vecDot_neg_right, vecDot_smul_left, vecDot_smul_right, + sub_eq_add_neg, hcross_u, hcross_v_symm, hcross_wv, hcross_zu] + ring_nf + +/-- Averaged form of +`blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_on_of_isEllipticFieldOn`. -/ +theorem volumeAverage_blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) + (hEll : IsEllipticFieldOn lam Lam U a) + (p pStar q qStar : Vec d) + (u w : AHarmonicFunction a U) + (v z : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + volumeAverage U + (blockFirstVariationIntegrand a (p, q) (qStar, pStar) + (blockResponsePairHalfState a u v) + (blockResponsePairHalfState a w z)) = + (1 / 2 : ℝ) * + volumeAverage U + (scalarFirstVariationIntegrand U a (p - pStar) (qStar - q) u w) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v z) := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let f : Vec d → ℝ := + scalarFirstVariationIntegrand U a (p - pStar) (qStar - q) u w + let g : Vec d → ℝ := + scalarFirstVariationIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v z + have hAvg : + volumeAverage U + (blockFirstVariationIntegrand a (p, q) (qStar, pStar) + (blockResponsePairHalfState a u v) + (blockResponsePairHalfState a w z)) = + volumeAverage U (fun x => (1 / 2 : ℝ) * f x + (1 / 2 : ℝ) * g x) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + simpa [f, g] using + blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_on_of_isEllipticFieldOn + (a := a) hEll p pStar q qStar u w v z x hx + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a) := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj + have hf : MeasureTheory.IntegrableOn f U := + hInt.firstVariation (p - pStar) (qStar - q) u w + have hg : MeasureTheory.IntegrableOn g U := + hIntAdj.firstVariation (pStar + p) (qStar + q) v z + have hf_half : MeasureTheory.IntegrableOn (((1 / 2 : ℝ) • f)) U := by + simpa [MeasureTheory.IntegrableOn] using hf.integrable.smul (1 / 2 : ℝ) + have hg_half : MeasureTheory.IntegrableOn (((1 / 2 : ℝ) • g)) U := by + simpa [MeasureTheory.IntegrableOn] using hg.integrable.smul (1 / 2 : ℝ) + have hfun : + (fun x => (1 / 2 : ℝ) * f x + (1 / 2 : ℝ) * g x) = + ((1 / 2 : ℝ) • f) + ((1 / 2 : ℝ) • g) := by + funext x + simp [smul_eq_mul] + rw [hAvg, hfun, volumeAverage_add hf_half hg_half, volumeAverage_smul, + volumeAverage_smul] + +/-- The pointwise state pairing of a primal/adjoint half-pair is the +quarter-difference of the primal and adjoint scalar energies. -/ +theorem statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = + fun x => + (1 / 4 : ℝ) * scalarVariationEnergyIntegrand a u x - + (1 / 4 : ℝ) * + scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v x := by + funext x + have hself_u : + vecDot (u.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) = + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) := + vecDot_matVecMul_self_eq_symmPart (a x) (u.toH1.grad x) + have hself_v : + vecDot (v.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) = + vecDot (v.toH1.grad x) + (matVecMul (symmPart (Homogenization.adjointCoeffField a x)) (v.toH1.grad x)) := by + simpa [Homogenization.adjointCoeffField] using + vecDot_matVecMul_self_eq_symmPart (matTranspose (a x)) (v.toH1.grad x) + have hcross : + vecDot (u.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) = + vecDot (v.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) := by + calc + vecDot (u.toH1.grad x) (matVecMul (matTranspose (a x)) (v.toH1.grad x)) + = vecDot (matVecMul (a x) (u.toH1.grad x)) (v.toH1.grad x) := by + rw [vecDot_matVecMul_transpose] + _ = vecDot (v.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) := by + rw [vecDot_comm] + have hpot : + (blockResponsePairHalfState a u v).potential x = + (1 / 2 : ℝ) • (u.toH1.grad x + v.toH1.grad x) := rfl + have hflux : + (blockResponsePairHalfState a u v).flux x = + (1 / 2 : ℝ) • + (matVecMul (a x) (u.toH1.grad x) - + matVecMul (matTranspose (a x)) (v.toH1.grad x)) := rfl + rw [hpot, hflux] + simp [scalarVariationEnergyIntegrand, Homogenization.adjointCoeffField, + vecDot_add_left, vecDot_add_right, vecDot_neg_right, vecDot_smul_left, + vecDot_smul_right, sub_eq_add_neg, hself_u, hself_v, hcross] + ring_nf + +/-- Averaged state-pairing form for a primal/adjoint half-pair. -/ +theorem volumeAverage_statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub + {d : ℕ} {U : Set (Vec d)} (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (Homogenization.adjointCoeffField a) U) : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = + (1 / 4 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) - + (1 / 4 : ℝ) * + volumeAverage U + (scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v) := by + have hEllAdj : IsEllipticFieldOn lam Lam U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEll + let f : Vec d → ℝ := scalarVariationEnergyIntegrand a u + let g : Vec d → ℝ := scalarVariationEnergyIntegrand (Homogenization.adjointCoeffField a) v + rw [statePairing_blockResponsePairHalfState_eq_quarter_scalarVariationEnergy_sub] + have hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hIntAdj : ResponseLinearIntegrabilityData U (Homogenization.adjointCoeffField a) := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEllAdj + have hf : MeasureTheory.IntegrableOn f U := hInt.energy u + have hg : MeasureTheory.IntegrableOn g U := hIntAdj.energy v + have hf_quarter : MeasureTheory.IntegrableOn (((1 / 4 : ℝ) • f)) U := by + simpa [MeasureTheory.IntegrableOn] using hf.integrable.smul (1 / 4 : ℝ) + have hg_quarter : MeasureTheory.IntegrableOn (((1 / 4 : ℝ) • g)) U := by + simpa [MeasureTheory.IntegrableOn] using hg.integrable.smul (1 / 4 : ℝ) + have hfun : + (fun x => (1 / 4 : ℝ) * f x - (1 / 4 : ℝ) * g x) = + ((1 / 4 : ℝ) • f) - ((1 / 4 : ℝ) • g) := by + funext x + simp [smul_eq_mul] + rw [hfun, volumeAverage_sub hf_quarter hg_quarter, volumeAverage_smul, + volumeAverage_smul] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds.lean new file mode 100644 index 0000000000..027cf132ef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.LawObservable + +/-! +# Coarse sandwich, a.e. bridge, and law-level measurability + +Root facade for the remaining parts of Proposition 2.2 of the high-moment paper +(Armstrong–Kuusi–Loher, to appear). + +Submodules: + +* `CoarseBounds.Sandwich` — item **C1** (the coarse diagonal block-Loewner + sandwich `blockDiag (½•1) ((2Θ)⁻¹•1) ≤ 𝐀(U;a) ≤ blockDiag ((2Θ)•1) (2•1)`) + and **C1′** (its scalar corollaries), together with the mean-zero + average-recovery identities for admissible corrections. +* `CoarseBounds.AeBridge` — item **C2**: the `Mu`/`coarseBlockMatrix` + a.e.-congruence (C2 i), the measurability of the elliptic locus via the + inverse-free closed-set reformulation (C2 ii), the elliptic truncation + (C2 iii), and the consumer-facing bridge packaging (C2 iv). +* `CoarseBounds.LawObservable` — item **C3**: a.e.-strong measurability of the + scalar coarse observable under a `RestrictionLawCarrier`, plus its a.s. bounds and + integrability under an a.s.-elliptic law. + +All matrix/vector work is on `Vec d = Fin d → ℝ` / `Mat d`; no `EuclideanSpace`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/AeBridge.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/AeBridge.lean new file mode 100644 index 0000000000..2a9897ebc5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/AeBridge.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Basic + +/-! # Ae Bridge -/ + +@[expose] public section + +namespace Homogenization + +/-! +# A.e.-ellipticity bridge (item C2) + +The bridge that lets us replace an almost-everywhere-elliptic coefficient field +by an everywhere-elliptic one without changing the coarse block matrix. + +* **C2(i)** — `Mu` and hence `coarseBlockMatrix` only see `a` up to a.e. + equality on the (measurable) averaging set. +* **C2(ii)** — the elliptic locus `{x | IsEllipticMatrix 1 Θ (a x)}`, intersected + with the averaging set, is measurable. The proof avoids the matrix inverse: + we replace the fourth ellipticity inequality `Θ⁻¹|ξ|² ≤ ξ·A⁻¹ξ` by the + inverse-free image bound `|Aη|² ≤ Θ (η·Aη)` (equivalent, given coercivity), + which makes the whole ellipticity locus a **closed** subset of the matrix-entry + space — no countable dense reduction is needed. +* **C2(iii)** — the elliptic truncation `ellipticTruncate Θ a`, which agrees with + `a` on the a.e.-elliptic set and is everywhere `(1, Θ)`-elliptic. +* **C2(iv)** — the consumer-facing packaging. + +Vectors are `Vec d = Fin d → ℝ`; matrices `Mat d = Matrix (Fin d) (Fin d) ℝ`, +which is definitionally the entry space `Fin d → Fin d → ℝ`. No `EuclideanSpace`. +-/ + +open MeasureTheory +open scoped Classical + +variable {d : ℕ} {Θ : ℝ} {a a' : CoeffField d} + +/-! ## C2(i) — `Mu` / `coarseBlockMatrix` a.e.-congruence -/ + +/-- The block energy density only depends on the coefficient field pointwise, so +it is insensitive to changing `a` on a null set. -/ +theorem Mu_congr_of_ae_eq {U : Set (Vec d)} + (hae : a =ᵐ[volume.restrict U] a') (P : BlockVec d) : + Mu U P a = Mu U P a' := by + have hset : muValueSet U P a = muValueSet U P a' := by + have hvol : ∀ X : BlockState d, + volumeAverage U (blockEnergyDensity a X) = + volumeAverage U (blockEnergyDensity a' X) := by + intro X + unfold volumeAverage + congr 1 + refine integral_congr_ae ?_ + filter_upwards [hae] with x hx + simp [blockEnergyDensity, blockCoeffField, hx] + ext s + constructor + · rintro ⟨X, hX, rfl⟩; exact ⟨X, hX, hvol X⟩ + · rintro ⟨X, hX, rfl⟩; exact ⟨X, hX, (hvol X).symm⟩ + unfold Mu; rw [hset] + +/-- Corollary of C2(i): the coarse block matrix is insensitive to a null-set +change of the coefficient field. -/ +theorem coarseBlockMatrix_congr_of_ae_eq {U : Set (Vec d)} + (hae : a =ᵐ[volume.restrict U] a') : + coarseBlockMatrix U a = coarseBlockMatrix U a' := + coarseBlockMatrix_eq_of_mu_eq (fun P => Mu_congr_of_ae_eq hae P) + +/-! ## C2(ii) — measurability of the elliptic locus + +The inverse-free reformulation of the `(1, Θ)` ellipticity class. -/ + +/-- The two inverse-free ellipticity inequalities, as a predicate on the +matrix-entry space `Mat d = Fin d → Fin d → ℝ`. -/ +def IsEllipticEntry (Θ : ℝ) (v : Mat d) : Prop := + (∀ ξ : Vec d, vecNormSq ξ ≤ vecDot ξ (matVecMul v ξ)) ∧ + (∀ η : Vec d, vecNormSq (matVecMul v η) ≤ Θ * vecDot η (matVecMul v η)) + +/-- **Inverse-free characterization.** For the base constant `lam = 1`, the +`A⁻¹` inequality is equivalent to the image bound `|Aη|² ≤ Θ (η·Aη)`. -/ +theorem isEllipticMatrix_one_iff (A : Mat d) : + IsEllipticMatrix 1 Θ A ↔ 1 ≤ Θ ∧ IsEllipticEntry Θ A := by + constructor + · intro hA + refine ⟨hA.2.1, fun ξ => ?_, fun η => ?_⟩ + · simpa using hA.2.2.1 ξ + · have h := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hA η + rwa [vecDot_matVecMul_symmPart] at h + · rintro ⟨hΘ, hc, himg⟩ + have hΘpos : 0 < Θ := lt_of_lt_of_le one_pos hΘ + -- coercivity forces `matVecMul A` to be injective, hence `A` invertible + have hlin : ∀ x y : Vec d, matVecMul A (x - y) = matVecMul A x - matVecMul A y := by + intro x y; funext i + simp [matVecMul, mul_sub, Finset.sum_sub_distrib, Pi.sub_apply] + have hinj : Function.Injective (matVecMul A) := by + intro x y hxy + have hz : matVecMul A (x - y) = 0 := by rw [hlin, hxy]; simp + have hcz := hc (x - y) + rw [hz, vecDot_zero_right] at hcz + have hzero : vecNormSq (x - y) = 0 := le_antisymm hcz (vecNormSq_nonneg _) + exact sub_eq_zero.mp (vecNormSq_eq_zero hzero) + have hunit : IsUnit A := Matrix.mulVec_injective_iff_isUnit.mp hinj + have hdet : IsUnit A.det := (Matrix.isUnit_iff_isUnit_det A).mp hunit + refine ⟨one_pos, hΘ, fun ξ => by simpa using hc ξ, fun ξ => ?_⟩ + -- reconstruct the `A⁻¹` inequality at `η = A⁻¹ ξ` + set η := matVecMul A⁻¹ ξ with hη + have hAη : matVecMul A η = ξ := by + rw [hη, matVecMul_mul, Matrix.mul_nonsing_inv A hdet, matVecMul_one] + have himgη := himg η + rw [hAη] at himgη + -- `himgη : vecNormSq ξ ≤ Θ * vecDot η ξ` + have hdot : vecDot η ξ = vecDot ξ (matVecMul A⁻¹ ξ) := by rw [hη, vecDot_comm] + rw [hdot] at himgη + -- divide by `Θ` + have hthis := mul_le_mul_of_nonneg_left himgη (le_of_lt (inv_pos.mpr hΘpos)) + rw [← mul_assoc, inv_mul_cancel₀ hΘpos.ne', one_mul] at hthis + simpa using hthis + +/-- The inverse-free ellipticity locus is closed in the matrix-entry space +`Fin d → Fin d → ℝ` (definitionally `Mat d`), which carries the product Borel +structure. -/ +theorem isClosed_isEllipticEntry : + IsClosed {v : Fin d → Fin d → ℝ | IsEllipticEntry Θ v} := by + have h1 : IsClosed + {v : Fin d → Fin d → ℝ | ∀ ξ : Vec d, vecNormSq ξ ≤ vecDot ξ (matVecMul v ξ)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter (fun ξ => ?_) + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le continuous_const (by fun_prop) + have h2 : IsClosed + {v : Fin d → Fin d → ℝ | + ∀ η : Vec d, vecNormSq (matVecMul v η) ≤ Θ * vecDot η (matVecMul v η)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter (fun η => ?_) + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le (by fun_prop) (by fun_prop) + exact h1.inter h2 + +/-- **C2(ii).** Given the `IsEllipticFieldOn`-style entrywise measurability of the +`U`-truncated coefficient field, the elliptic locus intersected with `U` is +measurable. -/ +theorem measurableSet_isEllipticMatrix_inter {U : Set (Vec d)} + (hU : MeasurableSet U) + (hmeasA : Measurable (fun x => fun i j => if x ∈ U then a x i j else 0)) : + MeasurableSet (U ∩ {x | IsEllipticMatrix 1 Θ (a x)}) := by + classical + by_cases hΘ : 1 ≤ Θ + · -- on `U`, the truncated field agrees with `a`, and membership reduces to a + -- closed condition on the entries + set ê : Vec d → (Fin d → Fin d → ℝ) := + fun x => fun i j => if x ∈ U then a x i j else 0 with hê + have hpre : MeasurableSet (ê ⁻¹' {v : Fin d → Fin d → ℝ | IsEllipticEntry Θ v}) := + (isClosed_isEllipticEntry (Θ := Θ)).measurableSet.preimage hmeasA + have hset : + U ∩ {x | IsEllipticMatrix 1 Θ (a x)} = + U ∩ (ê ⁻¹' {v : Fin d → Fin d → ℝ | IsEllipticEntry Θ v}) := by + ext x + simp only [Set.mem_inter_iff, Set.mem_ofPred_eq, Set.mem_preimage] + constructor + · rintro ⟨hxU, hell⟩ + refine ⟨hxU, ?_⟩ + have haê : ê x = a x := by funext i j; simp [hê, hxU] + rw [haê] + exact ((isEllipticMatrix_one_iff (a x)).mp hell).2 + · rintro ⟨hxU, hentry⟩ + refine ⟨hxU, ?_⟩ + have haê : ê x = a x := by funext i j; simp [hê, hxU] + rw [haê] at hentry + exact (isEllipticMatrix_one_iff (a x)).mpr ⟨hΘ, hentry⟩ + rw [hset] + exact hU.inter hpre + · -- when `Θ < 1` the locus is empty + have hempty : U ∩ {x | IsEllipticMatrix 1 Θ (a x)} = ∅ := by + ext x + simp only [Set.mem_inter_iff, Set.mem_ofPred_eq, Set.mem_empty_iff_false, iff_false, + not_and] + intro _ hell + exact hΘ hell.2.1 + rw [hempty] + exact MeasurableSet.empty + +/-! ## C2(iii) — the elliptic truncation -/ + +/-- The elliptic truncation: keep `a x` where it is `(1, Θ)`-elliptic, otherwise +replace it by the identity (which is `(1, Θ)`-elliptic whenever `1 ≤ Θ`). -/ +noncomputable def ellipticTruncate (Θ : ℝ) (a : CoeffField d) : CoeffField d := + fun x => by classical exact if IsEllipticMatrix 1 Θ (a x) then a x else 1 + +theorem ellipticTruncate_of_elliptic {x : Vec d} (h : IsEllipticMatrix 1 Θ (a x)) : + ellipticTruncate Θ a x = a x := by + classical simp [ellipticTruncate, h] + +theorem ellipticTruncate_of_not_elliptic {x : Vec d} (h : ¬ IsEllipticMatrix 1 Θ (a x)) : + ellipticTruncate Θ a x = 1 := by + classical simp [ellipticTruncate, h] + +/-- The identity matrix is `(1, Θ)`-elliptic whenever `1 ≤ Θ`. -/ +theorem isEllipticMatrix_one_one (hΘ : 1 ≤ Θ) : + IsEllipticMatrix 1 Θ (1 : Mat d) := by + have hΘpos : 0 < Θ := lt_of_lt_of_le one_pos hΘ + refine ⟨one_pos, hΘ, fun ξ => ?_, fun ξ => ?_⟩ + · simp [matVecMul_one, vecNormSq] + · rw [inv_one, matVecMul_one] + have hle : Θ⁻¹ ≤ 1 := by + rw [inv_le_one₀ hΘpos]; exact hΘ + have : Θ⁻¹ * vecNormSq ξ ≤ 1 * vecNormSq ξ := + mul_le_mul_of_nonneg_right hle (vecNormSq_nonneg ξ) + simpa [vecNormSq] using this + +/-- Every truncated matrix is `(1, Θ)`-elliptic, given `1 ≤ Θ`. -/ +theorem isEllipticMatrix_ellipticTruncate (hΘ : 1 ≤ Θ) (x : Vec d) : + IsEllipticMatrix 1 Θ (ellipticTruncate Θ a x) := by + classical + by_cases h : IsEllipticMatrix 1 Θ (a x) + · rw [ellipticTruncate_of_elliptic h]; exact h + · rw [ellipticTruncate_of_not_elliptic h]; exact isEllipticMatrix_one_one hΘ + +/-- **C2(iii)(a).** The elliptic truncation is an everywhere-`(1, Θ)`-elliptic +field on `U`, given `1 ≤ Θ` and the entrywise measurability of the `U`-truncated +coefficient field. -/ +theorem isEllipticFieldOn_ellipticTruncate {U : Set (Vec d)} (hU : MeasurableSet U) + (hΘ : 1 ≤ Θ) + (hmeasA : Measurable (fun x => fun i j => if x ∈ U then a x i j else 0)) : + IsEllipticFieldOn 1 Θ U (ellipticTruncate Θ a) := by + classical + refine ⟨?_, fun x _ => isEllipticMatrix_ellipticTruncate hΘ x⟩ + -- measurability of the truncated truncation field + have hUE : MeasurableSet (U ∩ {x | IsEllipticMatrix 1 Θ (a x)}) := + measurableSet_isEllipticMatrix_inter hU hmeasA + refine measurable_pi_iff.2 (fun i => measurable_pi_iff.2 (fun j => ?_)) + have hê : Measurable (fun x => (if x ∈ U then a x i j else 0)) := by + have := (measurable_pi_iff.mp (measurable_pi_iff.mp hmeasA i)) j + simpa using this + -- rewrite the field entrywise as a nested piecewise + have hfun : + (fun x => if x ∈ U then (ellipticTruncate Θ a x) i j else 0) = + (U ∩ {x | IsEllipticMatrix 1 Θ (a x)}).piecewise + (fun x => if x ∈ U then a x i j else 0) + (U.piecewise (fun _ => (1 : Mat d) i j) (fun _ => 0)) := by + funext x + by_cases hxU : x ∈ U + · by_cases hell : IsEllipticMatrix 1 Θ (a x) + · simp [Set.piecewise, hxU, hell, ellipticTruncate_of_elliptic hell] + · simp [Set.piecewise, hxU, hell, ellipticTruncate_of_not_elliptic hell] + · simp [Set.piecewise, hxU] + rw [hfun] + exact Measurable.piecewise hUE hê (Measurable.piecewise hU measurable_const measurable_const) + +/-- **C2(iii)(b).** On the a.e.-elliptic set, the truncation equals `a`. -/ +theorem ellipticTruncate_ae_eq {U : Set (Vec d)} + (hae : ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix 1 Θ (a x)) : + ellipticTruncate Θ a =ᵐ[volume.restrict U] a := by + filter_upwards [hae] with x hx + exact ellipticTruncate_of_elliptic hx + +/-! ## C2(iv) — bridge packaging -/ + +/-- **C2(iv).** From a.e. ellipticity on the (measurable) averaging set plus the +entrywise measurability of the `U`-truncated field (and `1 ≤ Θ`), produce a +genuinely `(1, Θ)`-elliptic field `a'` that agrees with `a` a.e. on `U`, gives +the same coarse block matrix, and the same block coefficient field a.e. -/ +theorem exists_ellipticFieldOn_ae_eq {U : Set (Vec d)} (hU : MeasurableSet U) + (hΘ : 1 ≤ Θ) + (hmeasA : Measurable (fun x => fun i j => if x ∈ U then a x i j else 0)) + (hae : ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix 1 Θ (a x)) : + ∃ a' : CoeffField d, + IsEllipticFieldOn 1 Θ U a' ∧ + a' =ᵐ[volume.restrict U] a ∧ + coarseBlockMatrix U a' = coarseBlockMatrix U a ∧ + (∀ᵐ x ∂(volume.restrict U), blockCoeffField a' x = blockCoeffField a x) := by + refine ⟨ellipticTruncate Θ a, isEllipticFieldOn_ellipticTruncate hU hΘ hmeasA, + ellipticTruncate_ae_eq hae, ?_, ?_⟩ + · exact coarseBlockMatrix_congr_of_ae_eq (ellipticTruncate_ae_eq hae) + · filter_upwards [ellipticTruncate_ae_eq (Θ := Θ) (a := a) hae] with x hx + simp [blockCoeffField, hx] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/LawObservable.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/LawObservable.lean new file mode 100644 index 0000000000..b89c65f36f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/LawObservable.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.CoarseObservables + +/-! # Law Observable -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Law-level measurability and integrability of the coarse observable (item C3) + +The scalar coarse observable +`a ↦ P · 𝐀(cubeSet (originCube d n); a) P` +is almost-everywhere-strongly-measurable under any Chapter 4 `RestrictionLawCarrier`, and — +under a `ThetaEllipticLaw` — almost surely lands in `[0, 2(Θ|p|² + |q|²)]` and is +integrable. + +The `RestrictionLawCarrier` a.e.-measurability of every coarse block-matrix entry is +already available +(`RestrictionLawCarrier.aemeasurable_coarseBlockMatrix_{upperLeft,upperRight,lowerLeft, +lowerRight}_apply_cubeSet`, all polarizations of `aemeasurable_Mu_cubeSet`); we +wrap those into the scalar quadratic observable. The a.s. deterministic bound +comes from feeding the a.e.-elliptic realizations through the C2 bridge to an +everywhere-elliptic representative and applying the C1′ scalar sandwich. +-/ + +open Homogenization.Book.Ch04 +open MeasureTheory + +variable {d : ℕ} + +/-! ## Measurability -/ + +/-- Bilinear scalar observable of a block-entry-measurable matrix family is +a.e.-measurable. -/ +private theorem aemeasurable_vecDot_matVecMul {L : RestrictionCoeffLaw d} {Bfield : RegCoeffField d → Mat d} + (u v : Vec d) (hB : ∀ i j, AEMeasurable (fun a => Bfield a i j) L) : + AEMeasurable (fun a => vecDot u (matVecMul (Bfield a) v)) L := by + have heq : + (fun a => vecDot u (matVecMul (Bfield a) v)) = + ∑ i : Fin d, ∑ j : Fin d, fun a => u i * (Bfield a i j * v j) := by + funext a + simp only [vecDot, matVecMul, Finset.mul_sum, Finset.sum_apply] + rw [heq] + apply Finset.aemeasurable_sum + intro i _ + apply Finset.aemeasurable_sum + intro j _ + exact ((hB i j).mul_const (v j)).const_mul (u i) + +/-- The scalar quadratic observable of a block matrix family is a.e.-measurable +whenever all four block entries are. -/ +private theorem aemeasurable_blockQuadratic {L : RestrictionCoeffLaw d} + {Mfield : RegCoeffField d → BlockMat d} (P : BlockVec d) + (hUL : ∀ i j, AEMeasurable (fun a => (Mfield a).upperLeft i j) L) + (hUR : ∀ i j, AEMeasurable (fun a => (Mfield a).upperRight i j) L) + (hLL : ∀ i j, AEMeasurable (fun a => (Mfield a).lowerLeft i j) L) + (hLR : ∀ i j, AEMeasurable (fun a => (Mfield a).lowerRight i j) L) : + AEMeasurable (fun a => blockVecDot P (blockMatVecMul (Mfield a) P)) L := by + obtain ⟨p, q⟩ := P + have heq : + (fun a => blockVecDot (p, q) (blockMatVecMul (Mfield a) (p, q))) = + fun a => + vecDot p (matVecMul (Mfield a).upperLeft p) + + vecDot p (matVecMul (Mfield a).upperRight q) + + (vecDot q (matVecMul (Mfield a).lowerLeft p) + + vecDot q (matVecMul (Mfield a).lowerRight q)) := by + funext a + simp only [blockVecDot, blockMatVecMul_fst, blockMatVecMul_snd, vecDot_add_right] + rw [heq] + exact + ((aemeasurable_vecDot_matVecMul p p hUL).add + (aemeasurable_vecDot_matVecMul p q hUR)).add + ((aemeasurable_vecDot_matVecMul q p hLL).add + (aemeasurable_vecDot_matVecMul q q hLR)) + +/-- **C3 (measurability).** The scalar coarse observable +`a ↦ P · 𝐀(cubeSet (originCube d n); a) P` is a.e.-strongly-measurable under any +`RestrictionLawCarrier`. -/ +theorem aestronglyMeasurable_coarseBlockQuadratic_cubeSet + {L : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier L) (n : ℤ) (P : BlockVec d) : + AEStronglyMeasurable + (fun a => + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) P)) L := by + refine (aemeasurable_blockQuadratic P ?_ ?_ ?_ ?_).aestronglyMeasurable + · exact fun i j => hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet _ i j + · exact fun i j => hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet _ i j + · exact fun i j => hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet _ i j + · exact fun i j => hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet _ i j + +/-! ## A.s. bounds and integrability + +The `ThetaEllipticLaw` hypothesis provides only a.e.-in-`x` ellipticity of the +realizations, with no spatial measurability, so it cannot be turned into a +per-realization `IsEllipticFieldOn` without an additional +measurable-representative construction (which would descend through +`IsAEEllipticFieldOn` and the C2 truncation with a chosen strongly-measurable +representative). We therefore deliver the bounds/integrability against the +pointwise substitute +`∀ᵐ a ∂L, IsEllipticFieldOn 1 Θ (cubeSet (originCube d n)) a`, from which the +deterministic C1′ sandwich transfers realization-by-realization. -/ + +variable [NeZero d] + +/-- **C3 (a.s. bounds).** Under an a.s.-`(1, Θ)`-elliptic law, the coarse +observable a.s. lands in `[0, 2(Θ|p|² + |q|²)]`. -/ +theorem coarseBlockQuadratic_ae_bounds_of_ae_isEllipticFieldOn + {L : RestrictionCoeffLaw d} {Θ : ℝ} (n : ℤ) (P : BlockVec d) + (hell : ∀ᵐ a ∂L, IsEllipticFieldOn 1 Θ (cubeSet (originCube d n)) a.toFun) : + ∀ᵐ a ∂L, + 0 ≤ blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) P) ∧ + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) P) ≤ + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + filter_upwards [hell] with a ha + exact ⟨zero_le_blockVecDot_coarseBlockMatrix_cube ha P, + blockVecDot_coarseBlockMatrix_cube_le ha P⟩ + +/-- **C3 (integrability).** Under a `RestrictionLawCarrier` (for measurability) and an +a.s.-`(1, Θ)`-elliptic law (for the deterministic bound), the coarse observable +is integrable. -/ +theorem integrable_coarseBlockQuadratic_of_ae_isEllipticFieldOn + {L : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier L) {Θ : ℝ} (n : ℤ) (P : BlockVec d) + (hell : ∀ᵐ a ∂L, IsEllipticFieldOn 1 Θ (cubeSet (originCube d n)) a.toFun) : + Integrable + (fun a => + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a.toFun) P)) L := by + have : IsProbabilityMeasure L := hP.isProbability + set C : ℝ := 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) with hC + refine (integrable_const C).mono' + (aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP n P) ?_ + filter_upwards [coarseBlockQuadratic_ae_bounds_of_ae_isEllipticFieldOn (Θ := Θ) n P hell] + with a ha + rw [Real.norm_eq_abs, abs_of_nonneg ha.1] + exact ha.2 + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/Sandwich.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/Sandwich.lean new file mode 100644 index 0000000000..2a5db35401 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CoarseBounds/Sandwich.lean @@ -0,0 +1,425 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages + +/-! # Sandwich -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coarse diagonal sandwich (items C1, C1′) + +The coarse block matrix `𝐀(U; a) = coarseBlockMatrix U a` on the half-open +triadic cube `U = cubeSet (originCube d m)` is sandwiched between the two +scalar-diagonal block matrices `blockDiag (½•1) ((2Θ)⁻¹•1)` and +`blockDiag ((2Θ)•1) (2•1)` in the block Loewner order, for every coefficient +field that is `(1, Θ)`-elliptic on `U`. This is Proposition 2.2's coarse +ellipticity statement `e.coarse.block.ellipticity` in the high-moment paper +(Armstrong–Kuusi–Loher, to appear). + +* **C1 upper** — the constant competitor `X ≡ P` is `Mu`-admissible, and the + pointwise A8 upper bound `bfA ≤ blockDiag ((2Θ)•1) (2•1)` gives + `Mu ≤ Θ|p|² + |q|²`. +* **C1 lower** — for any admissible `X`, the pointwise A8 lower bound + `blockDiag (½•1) ((2Θ)⁻¹•1) ≤ bfA`, followed by componentwise Jensen + (`vecNormSq_volumeAverage_le_volumeAverage_vecNormSq`) and the mean-zero + identities `⨍ X.potential = p`, `⨍ X.flux = q` (from the a.e. zero-trace + averages `IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube` and + `IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube`), gives + `¼|p|² + (4Θ)⁻¹|q|² ≤ Mu`. + +Everything is rewritten through `mu_eq_half_coarseBlockMatrix_cube` +(`Mu = ½ P·𝐀 P`). Vectors are `Vec d = Fin d → ℝ`; no `EuclideanSpace`. +-/ + +open Homogenization.Book.Ch02 +open MeasureTheory + +noncomputable section + +variable {d : ℕ} {m : ℤ} {Θ : ℝ} {a : CoeffField d} + +/-! ## Shared cube data -/ + +private theorem cube_volume_pos : + 0 < (volume (cubeSet (originCube d m))).toReal := + volume_cubeSet_originCube_toReal_pos_recovery (d := d) m + +private theorem measurableSet_cube : + MeasurableSet (cubeSet (originCube d m)) := + measurableSet_cubeSet (originCube d m) + +/-- The origin belongs to every centered triadic cube, so ellipticity on the +cube forces `1 ≤ Θ`, in particular `0 < Θ`. -/ +private theorem theta_pos (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) : + 0 < Θ := by + have h0 : (0 : Vec d) ∈ cubeSet (originCube d m) := by + rw [mem_cubeSet_originCube_iff] + intro i + have hpow : (0 : ℝ) < (3 : ℝ) ^ m := by positivity + simp only [Pi.zero_apply] + constructor + · nlinarith [hpow] + · nlinarith [hpow] + exact lt_of_lt_of_le one_pos (hEll.2 (0 : Vec d) h0).2.1 + +/-- Coordinate integrability from `L²` membership on the (finite-measure) cube. -/ +private theorem coord_integrableOn_of_memVectorL2 + {f : Vec d → Vec d} (hf : MemVectorL2 (cubeSet (originCube d m)) f) (i : Fin d) : + IntegrableOn (fun x => f x i) (cubeSet (originCube d m)) := by + have h := integrableOn_vecDot_of_memVectorL2 hf + (memVectorL2_const (U := cubeSet (originCube d m)) (basisVec i)) + simpa [vecDot_basisVec_right] using h + +/-- `X.potential ∈ L²(U)` from admissibility. -/ +private theorem memVectorL2_potential_of_admissible + {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (cubeSet (originCube d m)) P X) : + MemVectorL2 (cubeSet (originCube d m)) X.potential := by + have h := (memVectorL2_const (U := cubeSet (originCube d m)) P.1).add + hX.potentialCorrection_memL2 + have heq : ((fun _ : Vec d => P.1) + fun x => X.potential x - P.1) = X.potential := by + funext x; simp only [Pi.add_apply]; abel + rwa [heq] at h + +/-- `X.flux ∈ L²(U)` from admissibility. -/ +private theorem memVectorL2_flux_of_admissible + {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (cubeSet (originCube d m)) P X) : + MemVectorL2 (cubeSet (originCube d m)) X.flux := by + have h := (memVectorL2_const (U := cubeSet (originCube d m)) P.2).add + hX.fluxCorrection_memL2 + have heq : ((fun _ : Vec d => P.2) + fun x => X.flux x - P.2) = X.flux := by + funext x; simp only [Pi.add_apply]; abel + rwa [heq] at h + +section + +variable [NeZero d] + +/-- The average of an admissible potential field recovers `p`. This is C0(i) +turned into a `volumeAverage` identity. -/ +private theorem volumeAverage_potential_eq + {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (cubeSet (originCube d m)) P X) : + (fun i => volumeAverage (cubeSet (originCube d m)) (fun x => X.potential x i)) = P.1 := by + funext i + have hcorr := + congrFun (IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube (d := d) (n := m) + hX.isPotentialZeroTrace) i + have hcorrfun : + ∫ x in cubeSet (originCube d m), (X.potential x i - P.1 i) ∂volume = 0 := by + simpa using hcorr + have hcorrInt : IntegrableOn (fun x => X.potential x i - P.1 i) + (cubeSet (originCube d m)) := by + have := coord_integrableOn_of_memVectorL2 (m := m) + (f := fun x => X.potential x - P.1) hX.potentialCorrection_memL2 i + simpa using this + have hconstInt : IntegrableOn (fun _ : Vec d => P.1 i) (cubeSet (originCube d m)) := + integrable_const _ + have hsplit : + (fun x => X.potential x i) = + (fun x => X.potential x i - P.1 i) + (fun _ : Vec d => P.1 i) := by + funext x; simp only [Pi.add_apply]; ring + rw [hsplit, volumeAverage_add hcorrInt hconstInt, + volumeAverage_eq_zero_of_integral_eq_zero hcorrfun, + volumeAverage_const cube_volume_pos.ne'] + ring + +/-- The average of an admissible flux field recovers `q`. C0(ii) as a +`volumeAverage` identity. -/ +private theorem volumeAverage_flux_eq + {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (cubeSet (originCube d m)) P X) : + (fun i => volumeAverage (cubeSet (originCube d m)) (fun x => X.flux x i)) = P.2 := by + funext i + have hcorr := + congrFun (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube (d := d) (n := m) + hX.isSolenoidalZeroNormalTrace) i + have hcorrfun : + ∫ x in cubeSet (originCube d m), (X.flux x i - P.2 i) ∂volume = 0 := by + simpa using hcorr + have hcorrInt : IntegrableOn (fun x => X.flux x i - P.2 i) + (cubeSet (originCube d m)) := by + have := coord_integrableOn_of_memVectorL2 (m := m) + (f := fun x => X.flux x - P.2) hX.fluxCorrection_memL2 i + simpa using this + have hconstInt : IntegrableOn (fun _ : Vec d => P.2 i) (cubeSet (originCube d m)) := + integrable_const _ + have hsplit : + (fun x => X.flux x i) = + (fun x => X.flux x i - P.2 i) + (fun _ : Vec d => P.2 i) := by + funext x; simp only [Pi.add_apply]; ring + rw [hsplit, volumeAverage_add hcorrInt hconstInt, + volumeAverage_eq_zero_of_integral_eq_zero hcorrfun, + volumeAverage_const cube_volume_pos.ne'] + ring + +end + +/-! ## The pointwise A8 bounds on the block energy density -/ + +/-- Pointwise A8 lower bound on the block energy density. -/ +private theorem quarter_add_le_blockEnergyDensity + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (X : BlockState d) + {x : Vec d} (hx : x ∈ cubeSet (originCube d m)) : + (1 / 4 : ℝ) * vecNormSq (X.potential x) + + (4 * Θ)⁻¹ * vecNormSq (X.flux x) ≤ blockEnergyDensity a X x := by + have hlo := blockDiag_blockMatLoewnerLE_blockMatrixOfCoeff_of_isThetaElliptic + (hEll.2 x hx) (X.potential x, X.flux x) + have hdiag := blockVecDot_blockMatVecMul_blockDiag_smul_one (1 / 2 : ℝ) ((2 * Θ)⁻¹) + (X.potential x) (X.flux x) + have hΘ : 0 < Θ := theta_pos hEll + have hne : (2 * Θ) ≠ 0 := by positivity + -- `blockEnergyDensity a X x = ½ (X.eval x)·bfA(a x)(X.eval x)` + have hEnergy : + blockEnergyDensity a X x = + (1 / 2 : ℝ) * + blockVecDot (X.potential x, X.flux x) + (blockMatVecMul (blockMatrixOfCoeff (a x)) (X.potential x, X.flux x)) := by + rfl + rw [hEnergy] + rw [hdiag] at hlo + have harith : (1 / 2 : ℝ) * ((1 / 2) * vecNormSq (X.potential x) + + (2 * Θ)⁻¹ * vecNormSq (X.flux x)) = + (1 / 4 : ℝ) * vecNormSq (X.potential x) + (4 * Θ)⁻¹ * vecNormSq (X.flux x) := by + rw [show (4 * Θ)⁻¹ = (1 / 2 : ℝ) * (2 * Θ)⁻¹ by + rw [mul_inv]; ring] + ring + linarith [hlo, harith.symm.le, harith.le] + +/-- Pointwise A8 upper bound on the block energy density of the constant +competitor `X ≡ P`. -/ +private theorem blockEnergyDensity_const_le + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) + {x : Vec d} (hx : x ∈ cubeSet (originCube d m)) : + blockEnergyDensity a { potential := fun _ => P.1, flux := fun _ => P.2 } x ≤ + Θ * vecNormSq P.1 + vecNormSq P.2 := by + have hup := blockMatrixOfCoeff_blockMatLoewnerLE_blockDiag_of_isThetaElliptic + (hEll.2 x hx) (P.1, P.2) + have hdiag := blockVecDot_blockMatVecMul_blockDiag_smul_one (2 * Θ) (2 : ℝ) P.1 P.2 + have hEnergy : + blockEnergyDensity a { potential := fun _ => P.1, flux := fun _ => P.2 } x = + (1 / 2 : ℝ) * + blockVecDot (P.1, P.2) + (blockMatVecMul (blockMatrixOfCoeff (a x)) (P.1, P.2)) := by + rfl + rw [hEnergy] + rw [hdiag] at hup + have harith : (1 / 2 : ℝ) * ((2 * Θ) * vecNormSq P.1 + 2 * vecNormSq P.2) = + Θ * vecNormSq P.1 + vecNormSq P.2 := by ring + linarith [hup, harith.le, harith.symm.le] + +/-! ## C1 as `Mu` bounds -/ + +variable [NeZero d] + +/-- **C1 lower** as a `Mu` bound: +`¼|p|² + (4Θ)⁻¹|q|² ≤ Mu (U; P, a)`. -/ +theorem diag_lower_le_mu_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + (1 / 4 : ℝ) * vecNormSq P.1 + (4 * Θ)⁻¹ * vecNormSq P.2 ≤ + Mu (cubeSet (originCube d m)) P a := by + have hΘ : 0 < Θ := theta_pos hEll + refine le_Mu_of_forall_isBlockMuAdmissible ?_ + intro X hX + -- L² memberships and energy integrability + have hPotL2 : MemVectorL2 (cubeSet (originCube d m)) X.potential := + memVectorL2_potential_of_admissible hX + have hFluxL2 : MemVectorL2 (cubeSet (originCube d m)) X.flux := + memVectorL2_flux_of_admissible hX + have hEnergyInt : IntegrableOn (blockEnergyDensity a X) (cubeSet (originCube d m)) := + (hX.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll).energyIntegrable + have hf1Int : IntegrableOn (fun x => vecNormSq (X.potential x)) + (cubeSet (originCube d m)) := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hPotL2 hPotL2 + have hf2Int : IntegrableOn (fun x => vecNormSq (X.flux x)) + (cubeSet (originCube d m)) := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hFluxL2 hFluxL2 + -- lower comparison function is integrable + have hgInt : IntegrableOn + (fun x => (1 / 4 : ℝ) * vecNormSq (X.potential x) + + (4 * Θ)⁻¹ * vecNormSq (X.flux x)) (cubeSet (originCube d m)) := + (hf1Int.const_mul (1 / 4 : ℝ)).add (hf2Int.const_mul ((4 * Θ)⁻¹)) + -- Step 1: pointwise A8 lower + volumeAverage monotonicity + have hstep1 : + volumeAverage (cubeSet (originCube d m)) + (fun x => (1 / 4 : ℝ) * vecNormSq (X.potential x) + + (4 * Θ)⁻¹ * vecNormSq (X.flux x)) ≤ + volumeAverage (cubeSet (originCube d m)) (blockEnergyDensity a X) := + volumeAverage_le_volumeAverage_of_le_on measurableSet_cube hgInt hEnergyInt + (fun x hx => quarter_add_le_blockEnergyDensity hEll X hx) + -- Step 2: split the average + have hsplit : + volumeAverage (cubeSet (originCube d m)) + (fun x => (1 / 4 : ℝ) * vecNormSq (X.potential x) + + (4 * Θ)⁻¹ * vecNormSq (X.flux x)) = + (1 / 4 : ℝ) * + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.potential x)) + + (4 * Θ)⁻¹ * + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.flux x)) := by + unfold volumeAverage + rw [integral_add (hf1Int.const_mul (1 / 4 : ℝ)) (hf2Int.const_mul ((4 * Θ)⁻¹)), + integral_const_mul, integral_const_mul] + ring + -- Step 3: componentwise Jensen + have hJensenPot : + vecNormSq P.1 ≤ + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.potential x)) := by + have hJ := vecNormSq_volumeAverage_le_volumeAverage_vecNormSq + measurableSet_cube cube_volume_pos.ne' hPotL2 + rwa [volumeAverage_potential_eq hX] at hJ + have hJensenFlux : + vecNormSq P.2 ≤ + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.flux x)) := by + have hJ := vecNormSq_volumeAverage_le_volumeAverage_vecNormSq + measurableSet_cube cube_volume_pos.ne' hFluxL2 + rwa [volumeAverage_flux_eq hX] at hJ + -- assemble + have hquarter : (0 : ℝ) ≤ 1 / 4 := by norm_num + have hcoef : (0 : ℝ) ≤ (4 * Θ)⁻¹ := by positivity + calc + (1 / 4 : ℝ) * vecNormSq P.1 + (4 * Θ)⁻¹ * vecNormSq P.2 + ≤ (1 / 4 : ℝ) * + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.potential x)) + + (4 * Θ)⁻¹ * + volumeAverage (cubeSet (originCube d m)) (fun x => vecNormSq (X.flux x)) := by + have h1 := mul_le_mul_of_nonneg_left hJensenPot hquarter + have h2 := mul_le_mul_of_nonneg_left hJensenFlux hcoef + linarith + _ = volumeAverage (cubeSet (originCube d m)) + (fun x => (1 / 4 : ℝ) * vecNormSq (X.potential x) + + (4 * Θ)⁻¹ * vecNormSq (X.flux x)) := hsplit.symm + _ ≤ volumeAverage (cubeSet (originCube d m)) (blockEnergyDensity a X) := hstep1 + +omit [NeZero d] in +/-- **C1 upper** as a `Mu` bound: +`Mu (U; P, a) ≤ Θ|p|² + |q|²`. -/ +theorem mu_le_diag_upper_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + Mu (cubeSet (originCube d m)) P a ≤ Θ * vecNormSq P.1 + vecNormSq P.2 := by + classical + set U := cubeSet (originCube d m) with hU + -- the constant competitor + set X₀ : BlockState d := { potential := fun _ => P.1, flux := fun _ => P.2 } with hX₀ + have hAdm : IsBlockMuAdmissible U P X₀ := by + refine ⟨?_, ?_, ?_, ?_⟩ + · have hz : (fun x => X₀.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x; simp [hX₀] + rw [hz]; exact MemLp.zero + · have hz : (fun x => X₀.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x; simp [hX₀] + rw [hz]; exact isPotentialZeroTraceOn_zero (U := U) + · have hz : (fun x => X₀.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x; simp [hX₀] + rw [hz]; exact MemLp.zero + · have hz : (fun x => X₀.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x; simp [hX₀] + rw [hz]; exact isSolenoidalZeroNormalTraceOn_zero (U := U) + -- muValueSet is bounded below by 0 (block energy density is p.s.d.) + have hBddBelow : BddBelow (muValueSet U P a) := by + refine ⟨0, ?_⟩ + intro s hs + rcases hs with ⟨Y, _hY, rfl⟩ + refine volumeAverage_nonneg_of_nonneg_on measurableSet_cube ?_ + intro x hx + have hpsd := blockMatrixOfCoeff_quadratic_nonneg (hEll.2 x hx) (Y.eval x) + have : blockEnergyDensity a Y x = + (1 / 2 : ℝ) * + blockVecDot (Y.eval x) (blockMatVecMul (blockMatrixOfCoeff (a x)) (Y.eval x)) := rfl + rw [this]; positivity + -- Mu ≤ average of the competitor's energy + have hMuLe : Mu U P a ≤ volumeAverage U (blockEnergyDensity a X₀) := by + unfold Mu + exact csInf_le hBddBelow (muValueSet_mem hAdm) + -- competitor's energy average ≤ Θ|p|² + |q|² + have hEnergyInt : IntegrableOn (blockEnergyDensity a X₀) U := + (hAdm.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll).energyIntegrable + have hAvgLe : + volumeAverage U (blockEnergyDensity a X₀) ≤ Θ * vecNormSq P.1 + vecNormSq P.2 := + volumeAverage_le_of_le_on measurableSet_cube hEnergyInt cube_volume_pos.ne' + (fun x hx => by + have := blockEnergyDensity_const_le hEll P hx + simpa [hX₀] using this) + exact le_trans hMuLe hAvgLe + +/-! ## C1 — the block Loewner sandwich -/ + +/-- **C1 (lower).** `blockDiag (½•1) ((2Θ)⁻¹•1) ≤ 𝐀(U; a)` in the block Loewner +order, on the half-open triadic cube. -/ +theorem blockDiag_blockMatLoewnerLE_coarseBlockMatrix_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) : + BlockMatLoewnerLE + (blockDiag ((1 / 2 : ℝ) • (1 : Mat d)) ((2 * Θ)⁻¹ • (1 : Mat d))) + (coarseBlockMatrix (cubeSet (originCube d m)) a) := by + intro X + obtain ⟨p, q⟩ := X + rw [← mu_eq_half_coarseBlockMatrix_cube hEll (p, q)] + rw [blockVecDot_blockMatVecMul_blockDiag_smul_one (1 / 2 : ℝ) ((2 * Θ)⁻¹) p q] + have hlow := diag_lower_le_mu_cube hEll (p, q) + have hval : (1 / 2 : ℝ) * ((1 / 2 : ℝ) * vecNormSq p + (2 * Θ)⁻¹ * vecNormSq q) = + (1 / 4 : ℝ) * vecNormSq p + (4 * Θ)⁻¹ * vecNormSq q := by + rw [show (4 * Θ)⁻¹ = (1 / 2 : ℝ) * (2 * Θ)⁻¹ by rw [mul_inv]; ring] + ring + rw [hval] + simpa using hlow + +/-- **C1 (upper).** `𝐀(U; a) ≤ blockDiag ((2Θ)•1) (2•1)` in the block Loewner +order, on the half-open triadic cube. -/ +theorem coarseBlockMatrix_blockMatLoewnerLE_blockDiag_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) : + BlockMatLoewnerLE + (coarseBlockMatrix (cubeSet (originCube d m)) a) + (blockDiag ((2 * Θ) • (1 : Mat d)) ((2 : ℝ) • (1 : Mat d))) := by + intro X + obtain ⟨p, q⟩ := X + rw [← mu_eq_half_coarseBlockMatrix_cube hEll (p, q)] + rw [blockVecDot_blockMatVecMul_blockDiag_smul_one (2 * Θ) (2 : ℝ) p q] + have hup := mu_le_diag_upper_cube hEll (p, q) + have hval : (1 / 2 : ℝ) * ((2 * Θ) * vecNormSq p + 2 * vecNormSq q) = + Θ * vecNormSq p + vecNormSq q := by ring + rw [hval] + simpa using hup + +/-! ## C1′ — scalar corollaries -/ + +/-- **C1′ (nonnegativity).** `0 ≤ P·𝐀(U; a) P`. -/ +theorem zero_le_blockVecDot_coarseBlockMatrix_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + 0 ≤ blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P) := by + have hlow := blockDiag_blockMatLoewnerLE_coarseBlockMatrix_cube hEll P + obtain ⟨p, q⟩ := P + rw [blockVecDot_blockMatVecMul_blockDiag_smul_one (1 / 2 : ℝ) ((2 * Θ)⁻¹) p q] at hlow + have hΘ : 0 < Θ := theta_pos hEll + have hnn : (0 : ℝ) ≤ (1 / 2 : ℝ) * ((1 / 2 : ℝ) * vecNormSq p + (2 * Θ)⁻¹ * vecNormSq q) := by + have h1 : (0 : ℝ) ≤ vecNormSq p := vecNormSq_nonneg p + have h2 : (0 : ℝ) ≤ vecNormSq q := vecNormSq_nonneg q + have h3 : (0 : ℝ) ≤ (2 * Θ)⁻¹ := by positivity + positivity + linarith [hlow, hnn] + +/-- **C1′ (upper).** `P·𝐀(U; a) P ≤ 2 (Θ|p|² + |q|²)`. -/ +theorem blockVecDot_coarseBlockMatrix_cube_le + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P) ≤ + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + have hup := coarseBlockMatrix_blockMatLoewnerLE_blockDiag_cube hEll P + obtain ⟨p, q⟩ := P + rw [blockVecDot_blockMatVecMul_blockDiag_smul_one (2 * Θ) (2 : ℝ) p q] at hup + simp only at hup ⊢ + linarith [hup] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CubeMinimizer.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CubeMinimizer.lean new file mode 100644 index 0000000000..1a71233ab7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/CubeMinimizer.lean @@ -0,0 +1,371 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Cube Minimizer -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Cube minimizer well-posedness (Proposition 2.2, part) + +Formalization of the coarse block minimizer well-posedness on a triadic cube +`originCube d m` against the coarse-graining surface of this development. + +The half-open observable and the open-cube variational problem coincide, since +`Mu (cubeSet Q) P a = Mu (openCubeSet Q) P a` holds unconditionally +(`Mu_cubeSet_eq_openCubeSet_of_triadicCube`). We therefore work against the +pointwise hypothesis `IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a` and +transport every open-cube recovery fact to the half-open cube. + +Public deliverables (all on `U = cubeSet (originCube d m)`): + +* `exists_cubeBlockMinimizer` — a `Mu`-admissible minimizer `Z_P` realizing the + energy and lying in the block response space (item (a); the response-space + conjunct carries the Euler orthogonality (c)); +* `cubeBlockMinimizer_euler_orthogonality` — the Euler orthogonality integral + (item (c)); +* `cubeBlockMinimizer_ae_unique` — a.e. uniqueness of the minimizer (item (b)); +* `hasQuadraticMu_cube` — quadraticity of `Mu` (item (d)); +* `mu_eq_half_coarseBlockMatrix_cube` — `Mu = ½ P·A P` (item (e)); +* `isBlockTestOn_sub_of_isBlockMuAdmissible` — the componentwise difference of + two `Mu`-admissible states for the same `P` is a block test state (load-bearing + for the `Y = Z̃ − Z` composition used downstream). + +All fields are `Vec d = Fin d → ℝ` valued; no `EuclideanSpace`. +-/ + +noncomputable section + +variable {d : ℕ} [NeZero d] {m : ℤ} {Θ : ℝ} {a : CoeffField d} + +/-! ## Difference of two admissible states is a block test state -/ + +omit [NeZero d] in +/-- The componentwise difference `X − X'` of two `Mu`-admissible block states +for the same parameter `P` is a block test state: its potential part is +zero-trace and its flux part is zero-normal-trace. This is the algebraic +closure the downstream stability lemmas need in order to feed `Y = Z̃ − Z` into +the Euler orthogonality of a minimizer. -/ +theorem isBlockTestOn_sub_of_isBlockMuAdmissible + {U : Set (Vec d)} {P : BlockVec d} {X X' : BlockState d} + (hX : IsBlockMuAdmissible U P X) (hX' : IsBlockMuAdmissible U P X') : + IsBlockTestOn U + { potential := fun x => X.potential x - X'.potential x + flux := fun x => X.flux x - X'.flux x } := by + refine ⟨?_, ?_⟩ + · -- potential part: (X.pot − P.1) + (−1)·(X'.pot − P.1) = X.pot − X'.pot + have hpot : + IsPotentialZeroTraceOn U + ((fun x => X.potential x - P.1) + (-1 : ℝ) • (fun x => X'.potential x - P.1)) := + isPotentialZeroTraceOn_add hX.isPotentialZeroTrace + (isPotentialZeroTraceOn_smul hX'.isPotentialZeroTrace (-1)) + have hfun : + ((fun x => X.potential x - P.1) + (-1 : ℝ) • (fun x => X'.potential x - P.1)) = + (fun x => X.potential x - X'.potential x) := by + funext x + simp [Pi.add_apply, sub_eq_add_neg] + rw [hfun] at hpot + exact hpot + · -- flux part: same combination, with L² integrability for the normal-trace add + have hmem₁ : MemVectorL2 U (fun x => X.flux x - P.2) := hX.fluxCorrection_memL2 + have hmem₂ : MemVectorL2 U ((-1 : ℝ) • fun x => X'.flux x - P.2) := + hX'.fluxCorrection_memL2.const_smul (-1) + have hsol : + IsSolenoidalZeroNormalTraceOn U + ((fun x => X.flux x - P.2) + (-1 : ℝ) • (fun x => X'.flux x - P.2)) := + isSolenoidalZeroNormalTraceOn_add_of_memVectorL2 hmem₁ hmem₂ + hX.isSolenoidalZeroNormalTrace + (isSolenoidalZeroNormalTraceOn_smul hX'.isSolenoidalZeroNormalTrace (-1)) + have hfun : + ((fun x => X.flux x - P.2) + (-1 : ℝ) • (fun x => X'.flux x - P.2)) = + (fun x => X.flux x - X'.flux x) := by + funext x + simp [Pi.add_apply, sub_eq_add_neg] + rw [hfun] at hsol + exact hsol + +/-! ## Open-cube recovery core -/ + +omit [NeZero d] in +/-- Finite-measure instance for the centered open cube. -/ +private theorem isFiniteMeasure_volumeMeasureOn_openCubeSet_originCube (m : ℤ) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := by + let : Fact (MeasureTheory.volume (openCubeSet (originCube d m)) < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) m⟩ + change MeasureTheory.IsFiniteMeasure + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) + infer_instance + +/-- Existence of a `Mu`-admissible energy-realizing minimizer in the block +response space, on the centered **open** cube, from pointwise ellipticity. This +is the analytic heart; the half-open version is a transport of this. -/ +private theorem exists_openCube_minimizer + (hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a) (P : BlockVec d) : + ∃ Z : BlockState d, + IsBlockMuAdmissible (openCubeSet (originCube d m)) P Z ∧ + Mu (openCubeSet (originCube d m)) P a = + blockEnergyAverage (openCubeSet (originCube d m)) a Z ∧ + BlockResponseSpace a (openCubeSet (originCube d m)) Z := by + classical + let := isFiniteMeasure_volumeMeasureOn_openCubeSet_originCube (d := d) m + obtain ⟨R, hData⟩ := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := 1) (Lam := Θ) m a hEllO + obtain ⟨hEllR, hCompat⟩ := hData + set hvol := volume_openCubeSet_originCube_toReal_pos (d := d) m with hvoldef + set system := R.toMuOperatorSystemDataOfIsEllipticFieldOn hEllR hvol with hsystem + let family := R.toLinearMuMinimizerFamily system hCompat + refine ⟨family.field P, family.admissible P, family.realizes P, ?_⟩ + have hConv : IsOpenBoundedConvexDomain (openCubeSet (originCube d m)) := + isOpenBoundedConvexDomain_openCubeSet (originCube d m) + exact + R.toMuCorrectionSpaceRecoveryData.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEllR hvol.ne' P + +/-! ## Public deliverables on the half-open cube -/ + +/-- **(a)** Existence of a `Mu`-admissible minimizer `Z_P` on the half-open +triadic cube, realizing the energy and lying in the block response space. The +`BlockResponseSpace` conjunct is exactly the Euler orthogonality (c). -/ +theorem exists_cubeBlockMinimizer + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + ∃ Z : BlockState d, + IsBlockMuAdmissible (cubeSet (originCube d m)) P Z ∧ + Mu (cubeSet (originCube d m)) P a = + blockEnergyAverage (cubeSet (originCube d m)) a Z ∧ + BlockResponseSpace a (cubeSet (originCube d m)) Z := by + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a := + hEll.mono (measurableSet_openCubeSet (originCube d m)) + (openCubeSet_subset_cubeSet (originCube d m)) + obtain ⟨Z, hAdm, hEnergy, hResp⟩ := exists_openCube_minimizer (d := d) hEllO P + refine ⟨Z, ?_, ?_, ?_⟩ + · exact (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).2 hAdm + · rw [Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P a, hEnergy] + unfold blockEnergyAverage + exact + (volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) m + (blockEnergyDensity a Z)).symm + · exact (blockResponseSpace_cubeSet_originCube_iff_openCubeSet).2 hResp + +omit [NeZero d] in +/-- **(c)** Euler orthogonality of the coarse block minimizer: for every +admissible block test perturbation `Y`, the pairing of `Y` against +`𝐁 Z = blockCoeffField a · Z` integrates to zero. -/ +theorem cubeBlockMinimizer_euler_orthogonality + {Z : BlockState d} (hResp : BlockResponseSpace a (cubeSet (originCube d m)) Z) + {Y : BlockState d} (hY : IsBlockTestOn (cubeSet (originCube d m)) Y) : + ∫ x in cubeSet (originCube d m), + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) + ∂MeasureTheory.volume = 0 := + hResp.2.2 Y hY + +omit [NeZero d] in +/-- The `Y = Z̃ − Z` instantiation of Euler orthogonality used downstream: +the difference of two admissible states for the same `P` is a valid test +perturbation, so it pairs to zero against `𝐁 Z` for a minimizer `Z`. -/ +theorem cubeBlockMinimizer_euler_orthogonality_sub + {P : BlockVec d} {Z X X' : BlockState d} + (hResp : BlockResponseSpace a (cubeSet (originCube d m)) Z) + (hX : IsBlockMuAdmissible (cubeSet (originCube d m)) P X) + (hX' : IsBlockMuAdmissible (cubeSet (originCube d m)) P X') : + ∫ x in cubeSet (originCube d m), + blockVecDot ((X.eval x) - (X'.eval x)) + (blockMatVecMul (blockCoeffField a x) (Z.eval x)) + ∂MeasureTheory.volume = 0 := by + have hY : + IsBlockTestOn (cubeSet (originCube d m)) + { potential := fun x => X.potential x - X'.potential x + flux := fun x => X.flux x - X'.flux x } := + isBlockTestOn_sub_of_isBlockMuAdmissible hX hX' + have h := cubeBlockMinimizer_euler_orthogonality (Z := Z) hResp hY + refine Eq.trans ?_ h + apply MeasureTheory.setIntegral_congr_fun (measurableSet_cubeSet _) + intro x _ + rfl + +/-- **(d)** Quadraticity of `Mu` on the half-open triadic cube. -/ +theorem hasQuadraticMu_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) : + HasQuadraticMu (cubeSet (originCube d m)) a := by + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a := + hEll.mono (measurableSet_openCubeSet (originCube d m)) + (openCubeSet_subset_cubeSet (originCube d m)) + obtain ⟨R, hData⟩ := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := 1) (Lam := Θ) m a hEllO + have hQuadO : HasQuadraticMu (openCubeSet (originCube d m)) a := + hasQuadraticMu_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData R hData + exact (hasQuadraticMu_cubeSet_iff_openCubeSet_of_triadicCube (originCube d m)).2 hQuadO + +/-- **(e)** The note-faithful quadratic representation +`Mu (U; P, a) = ½ P·𝐀(U; a) P` on the half-open triadic cube. -/ +theorem mu_eq_half_coarseBlockMatrix_cube + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + Mu (cubeSet (originCube d m)) P a = + (1 / 2 : ℝ) * + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu (hasQuadraticMu_cube hEll) P + +/-! ## Uniqueness -/ + +omit [NeZero d] in +/-- Any admissible block state that realizes the energy minimum on the centered +open cube maps to the canonical Hilbert minimizer. This is the strict-convexity +core of a.e. uniqueness: the recovery data identifies `Mu` with the Hilbert +minimizer value, and the affine minimizer is unique in `L²`. -/ +private theorem toHilbert_eq_minimizerMap_of_admissible_energy_eq + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d m))) + {lam Lam : ℝ} (hEllR : IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a) + (hCompat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEllR + (volume_openCubeSet_originCube_toReal_pos (d := d) m))) + {P : BlockVec d} {W : BlockState d} + (hW : IsBlockMuAdmissible (openCubeSet (originCube d m)) P W) + (hWmin : + blockEnergyAverage (openCubeSet (originCube d m)) a W = + Mu (openCubeSet (originCube d m)) P a) : + letI := isFiniteMeasure_volumeMeasureOn_openCubeSet_originCube (d := d) m + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hW.memBlockL2_eval = + (R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEllR + (volume_openCubeSet_originCube_toReal_pos (d := d) m))).minimizerMap P := by + let := isFiniteMeasure_volumeMeasureOn_openCubeSet_originCube (d := d) m + set hvol := volume_openCubeSet_originCube_toReal_pos (d := d) m with hvoldef + set system := R.toMuOperatorSystemDataOfIsEllipticFieldOn hEllR hvol with hsystem + set H := R.toMuHilbertRealization system with hH + have hWmemBlock : MemBlockL2 (openCubeSet (originCube d m)) W.eval := hW.memBlockL2_eval + -- the admissible correction lands in the correction subspace + have hcorr : + (hW.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 ∈ + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.correctionSpace := + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.mem_correctionSpace + (hW.toCorrectionFieldDataOfAdmissible).potential_memL2 + (hW.toCorrectionFieldDataOfAdmissible).flux_memL2 + (hW.toCorrectionFieldDataOfAdmissible).isPotentialZeroTrace + (hW.toCorrectionFieldDataOfAdmissible).isSolenoidalZeroNormalTrace + have hconst_add : + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hWmemBlock = + blockVecToHilbertBlockL2Const (U := openCubeSet (originCube d m)) P + + (hW.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 := + hW.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + have hcorr_mem : + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hWmemBlock - + H.constantField P ∈ H.correctionSpace.correctionSpace := by + rw [hconst_add] + simpa [H, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hcorr + -- the energy of the competitor equals the minimizer value + have hqe : + quadraticEnergy (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hWmemBlock) = + blockEnergyAverage (openCubeSet (originCube d m)) a W := + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState hWmemBlock + have hEB : + H.energyBilin = energyBilinOfOperator system.toMuOperatorRealization.operator := by + simp [H, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] + have hle : + quadraticEnergy H.energyBilin + (toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hWmemBlock) ≤ + H.muCandidate P := by + rw [hEB, hqe, hWmin, hCompat.mu_eq_muCandidate P] + exact + H.eq_minimizerMap_of_quadraticEnergy_le_muCandidate P + (toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hWmemBlock) + hcorr_mem hle + +/-- **(b)** A.e. uniqueness of the coarse block minimizer: any two `Mu`-admissible +states that both realize the minimum energy for the same parameter `P` agree +almost everywhere (as evaluations) on the half-open triadic cube. -/ +theorem cubeBlockMinimizer_ae_unique + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) {P : BlockVec d} + {Z Z' : BlockState d} + (hZ : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z) + (hZ' : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z') + (hZe : Mu (cubeSet (originCube d m)) P a = + blockEnergyAverage (cubeSet (originCube d m)) a Z) + (hZ'e : Mu (cubeSet (originCube d m)) P a = + blockEnergyAverage (cubeSet (originCube d m)) a Z') : + (fun x => Z.eval x) =ᵐ[volumeMeasureOn (cubeSet (originCube d m))] + (fun x => Z'.eval x) := by + classical + let := isFiniteMeasure_volumeMeasureOn_openCubeSet_originCube (d := d) m + -- transport hypotheses to the open cube + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a := + hEll.mono (measurableSet_openCubeSet (originCube d m)) + (openCubeSet_subset_cubeSet (originCube d m)) + have hZO : IsBlockMuAdmissible (openCubeSet (originCube d m)) P Z := + (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).1 hZ + have hZ'O : IsBlockMuAdmissible (openCubeSet (originCube d m)) P Z' := + (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).1 hZ' + have henergyTransport : + ∀ W : BlockState d, + blockEnergyAverage (cubeSet (originCube d m)) a W = + blockEnergyAverage (openCubeSet (originCube d m)) a W := by + intro W + unfold blockEnergyAverage + exact volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) m (blockEnergyDensity a W) + have hZminO : + blockEnergyAverage (openCubeSet (originCube d m)) a Z = + Mu (openCubeSet (originCube d m)) P a := by + rw [← henergyTransport Z, ← hZe, Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P a] + have hZ'minO : + blockEnergyAverage (openCubeSet (originCube d m)) a Z' = + Mu (openCubeSet (originCube d m)) P a := by + rw [← henergyTransport Z', ← hZ'e, Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P a] + -- recovery data + obtain ⟨R, hData⟩ := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := 1) (Lam := Θ) m a hEllO + obtain ⟨hEllR, hCompat⟩ := hData + -- both minimizers map to the canonical Hilbert minimizer + have hZmap : + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZO.memBlockL2_eval = + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZ'O.memBlockL2_eval := by + rw [toHilbert_eq_minimizerMap_of_admissible_energy_eq (d := d) R hEllR hCompat hZO hZminO, + toHilbert_eq_minimizerMap_of_admissible_energy_eq (d := d) R hEllR hCompat hZ'O hZ'minO] + -- unfold Lp equality to a.e. equality of evaluations + have hcoeZ : + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZO.memBlockL2_eval =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + hilbertifyBlockField Z.eval := + coeFn_toHilbertBlockL2OfBlockField hZO.memBlockL2_eval + have hcoeZ' : + toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZ'O.memBlockL2_eval =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + hilbertifyBlockField Z'.eval := + coeFn_toHilbertBlockL2OfBlockField hZ'O.memBlockL2_eval + have hcoeEq : + (⇑(toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZO.memBlockL2_eval)) =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + (⇑(toHilbertBlockL2OfBlockField (U := openCubeSet (originCube d m)) hZ'O.memBlockL2_eval)) := by + rw [hZmap] + have hHilEq : + hilbertifyBlockField Z.eval =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + hilbertifyBlockField Z'.eval := + (hcoeZ.symm.trans hcoeEq).trans hcoeZ' + have hOpen : + (fun x => Z.eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + (fun x => Z'.eval x) := by + filter_upwards [hHilEq] with x hx + have := congrArg HilbertBlockVec.toBlockVec hx + simpa [hilbertifyBlockField, HilbertBlockVec.toBlockVec_ofBlockVec] using this + -- transfer the a.e. statement across the null cube boundary + rw [show volumeMeasureOn (cubeSet (originCube d m)) = + volumeMeasureOn (openCubeSet (originCube d m)) from + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) m] + exact hOpen + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Definitions.lean new file mode 100644 index 0000000000..e9d2fab6fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Definitions.lean @@ -0,0 +1,688 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism +public import Mathlib.LinearAlgebra.QuadraticForm.Basic +public import Mathlib.Tactic.Linarith + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +noncomputable def volumeAverage {d : ℕ} (U : Set (Vec d)) (f : Vec d → ℝ) : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, f x ∂MeasureTheory.volume + +noncomputable def volumeAverageVec {d : ℕ} (U : Set (Vec d)) (f : Vec d → Vec d) : Vec d := + fun i => volumeAverage U (fun x => f x i) + +noncomputable def volumeAverageMat {d : ℕ} (U : Set (Vec d)) (f : Vec d → Mat d) : Mat d := + fun i j => volumeAverage U (fun x => f x i j) + +theorem volumeAverage_eq_zero_of_integral_eq_zero {d : ℕ} {U : Set (Vec d)} + {f : Vec d → ℝ} + (h : ∫ x in U, f x ∂MeasureTheory.volume = 0) : + volumeAverage U f = 0 := by + unfold volumeAverage + rw [h] + simp + +noncomputable def muValueSet {d : ℕ} (U : Set (Vec d)) (P : BlockVec d) + (a : CoeffField d) : Set ℝ := + { m | ∃ X : BlockState d, IsBlockMuAdmissible U P X ∧ m = volumeAverage U (blockEnergyDensity a X) } + +noncomputable def Mu {d : ℕ} (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : ℝ := + sInf (muValueSet U P a) + +theorem muValueSet_mem {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} {a : CoeffField d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) : + volumeAverage U (blockEnergyDensity a X) ∈ muValueSet U P a := + ⟨X, hX, rfl⟩ + +theorem muValueSet_nonempty {d : ℕ} (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : + (muValueSet U P a).Nonempty := by + let X : BlockState d := + { potential := fun _ => P.1 + flux := fun _ => P.2 } + refine ⟨volumeAverage U (blockEnergyDensity a X), ?_⟩ + refine muValueSet_mem ?_ + refine ⟨?_, ?_, ?_, ?_⟩ + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X] + rw [hzero] + exact + (MeasureTheory.MemLp.zero : MeasureTheory.MemLp (0 : Vec d → Vec d) 2 (volumeMeasureOn U)) + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X] + rw [hzero] + exact isPotentialZeroTraceOn_zero (U := U) + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X] + rw [hzero] + exact + (MeasureTheory.MemLp.zero : MeasureTheory.MemLp (0 : Vec d → Vec d) 2 (volumeMeasureOn U)) + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X] + rw [hzero] + exact isSolenoidalZeroNormalTraceOn_zero (U := U) + +theorem le_Mu_of_forall_mem_muValueSet {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {a : CoeffField d} {c : ℝ} + (hc : ∀ m ∈ muValueSet U P a, c ≤ m) : + c ≤ Mu U P a := by + unfold Mu + exact le_csInf (muValueSet_nonempty U P a) hc + +theorem le_Mu_of_forall_isBlockMuAdmissible {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {a : CoeffField d} {c : ℝ} + (hc : ∀ X : BlockState d, IsBlockMuAdmissible U P X → + c ≤ volumeAverage U (blockEnergyDensity a X)) : + c ≤ Mu U P a := by + apply le_Mu_of_forall_mem_muValueSet + intro m hm + rcases hm with ⟨X, hX, rfl⟩ + exact hc X hX + +noncomputable def blockResponseIntegrand {d : ℕ} (a : CoeffField d) (P Q : BlockVec d) + (X : BlockState d) : Vec d → ℝ := + fun x => + -blockEnergyDensity a X x + - blockVecDot P (blockMatVecMul (blockCoeffField a x) (X.eval x)) + + blockVecDot Q (X.eval x) + +structure BlockResponseIntegrabilityData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X : BlockState d) : Prop where + flux_memL2 : MemVectorL2 U X.flux + energyIntegrable : MeasureTheory.IntegrableOn (blockEnergyDensity a X) U + +noncomputable def blockJValueSet {d : ℕ} (U : Set (Vec d)) (P Q : BlockVec d) + (a : CoeffField d) : Set ℝ := + { m | + ∃ X : BlockState d, BlockResponseSpace a U X ∧ + BlockResponseIntegrabilityData U a X ∧ + m = volumeAverage U (blockResponseIntegrand a P Q X) } + +noncomputable def BlockJ {d : ℕ} (U : Set (Vec d)) (P Q : BlockVec d) (a : CoeffField d) : ℝ := + sSup (blockJValueSet U P Q a) + +noncomputable def scalarResponseIntegrand {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (u : AHarmonicFunction a U) : Vec d → ℝ := + fun x => + -((1 / 2 : ℝ) * vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) + - vecDot p (matVecMul (a x) (u.toH1.grad x)) + + vecDot q (u.toH1.grad x) + +noncomputable def responseJValueSet {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) : Set ℝ := + { m | + ∃ u : AHarmonicFunction a U, + m = volumeAverage U (scalarResponseIntegrand U a p q u) } + +noncomputable def ResponseJ {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : ℝ := + sSup (responseJValueSet U p q a) + +def IsCoarseBlockMatrix {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (Abar : BlockMat d) : Prop := + IsSymmetricBlockMat Abar ∧ + ∀ P : BlockVec d, Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul Abar P) + +/-- +`Mu` is quadratic in the note-faithful sense: after passing to the full `2d`-dimensional +coordinate space, it is one half of a quadratic form. +-/ +def HasQuadraticMu {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Prop := + ∃ Q : QuadraticForm ℝ (FullBlockVec d), + ∀ P : BlockVec d, Mu U P a = (1 / 2 : ℝ) * Q (toFullBlockVec P) + +private noncomputable def coarseBlockEntry {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (α β : BlockCoord d) : ℝ := + if _h : α = β then + 2 * Mu U (blockBasis α) a + else + Mu U (blockBasis α + blockBasis β) a - Mu U (blockBasis α) a - Mu U (blockBasis β) a + +noncomputable def coarseBlockMatrix {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : BlockMat d := + { upperLeft := fun i j => coarseBlockEntry U a (Sum.inl i) (Sum.inl j) + upperRight := fun i j => coarseBlockEntry U a (Sum.inl i) (Sum.inr j) + lowerLeft := fun i j => coarseBlockEntry U a (Sum.inr i) (Sum.inl j) + lowerRight := fun i j => coarseBlockEntry U a (Sum.inr i) (Sum.inr j) } + +theorem blockEnergyDensity_restrictCoeffField_eq_of_mem {d : ℕ} {U : Set (Vec d)} + (a : CoeffField d) (X : BlockState d) {x : Vec d} (hx : x ∈ U) : + blockEnergyDensity (restrictCoeffField U a) X x = blockEnergyDensity a X x := by + simp [blockEnergyDensity, blockCoeffField, restrictCoeffField, hx] + +theorem volumeAverage_blockEnergyDensity_restrictCoeffField_eq {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (a : CoeffField d) (X : BlockState d) : + volumeAverage U (blockEnergyDensity (restrictCoeffField U a) X) = + volumeAverage U (blockEnergyDensity a X) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU] with x hx + exact blockEnergyDensity_restrictCoeffField_eq_of_mem a X hx + +theorem muValueSet_restrictCoeffField_eq {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (P : BlockVec d) (a : CoeffField d) : + muValueSet U P (restrictCoeffField U a) = muValueSet U P a := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X, hX, ?_⟩ + calc + m = volumeAverage U (blockEnergyDensity (restrictCoeffField U a) X) := hm + _ = volumeAverage U (blockEnergyDensity a X) := + volumeAverage_blockEnergyDensity_restrictCoeffField_eq hU a X + · rintro ⟨X, hX, hm⟩ + refine ⟨X, hX, ?_⟩ + calc + m = volumeAverage U (blockEnergyDensity a X) := hm + _ = volumeAverage U (blockEnergyDensity (restrictCoeffField U a) X) := + (volumeAverage_blockEnergyDensity_restrictCoeffField_eq hU a X).symm + +theorem Mu_restrictCoeffField_eq {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (P : BlockVec d) (a : CoeffField d) : + Mu U P (restrictCoeffField U a) = Mu U P a := by + unfold Mu + rw [muValueSet_restrictCoeffField_eq hU P a] + +theorem coarseBlockMatrix_eq_of_mu_eq {d : ℕ} {U V : Set (Vec d)} + {a b : CoeffField d} (hmu : ∀ P : BlockVec d, Mu U P a = Mu V P b) : + coarseBlockMatrix U a = coarseBlockMatrix V b := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · funext i j + by_cases h : (Sum.inl i : BlockCoord d) = Sum.inl j + · have hij : i = j := Sum.inl.inj h + subst hij + simp [coarseBlockMatrix, coarseBlockEntry, hmu] + · simp [coarseBlockMatrix, coarseBlockEntry, hmu] + · funext i j + by_cases h : (Sum.inl i : BlockCoord d) = Sum.inr j + · cases h + · simp [coarseBlockMatrix, coarseBlockEntry, hmu] + · funext i j + by_cases h : (Sum.inr i : BlockCoord d) = Sum.inl j + · cases h + · simp [coarseBlockMatrix, coarseBlockEntry, hmu] + · funext i j + by_cases h : (Sum.inr i : BlockCoord d) = Sum.inr j + · have hij : i = j := Sum.inr.inj h + subst hij + simp [coarseBlockMatrix, coarseBlockEntry, hmu] + · simp [coarseBlockMatrix, coarseBlockEntry, hmu] + +theorem coarseBlockMatrix_restrictCoeffField_eq {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (a : CoeffField d) : + coarseBlockMatrix U (restrictCoeffField U a) = coarseBlockMatrix U a := + coarseBlockMatrix_eq_of_mu_eq (U := U) (V := U) + (a := restrictCoeffField U a) + (b := a) + (fun P => Mu_restrictCoeffField_eq hU P a) + +private theorem coarseBlockEntry_eq_of_isCoarseBlockMatrix {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {Abar : BlockMat d} (hA : IsCoarseBlockMatrix U a Abar) + (α β : BlockCoord d) : + coarseBlockEntry U a α β = blockMatEntry Abar α β := by + rcases hA with ⟨hsymm, hmu⟩ + by_cases h : α = β + · subst β + have hdiag := hmu (blockBasis α) + simp [coarseBlockEntry] + rw [blockBasis_pairing] at hdiag + linarith + · simp [coarseBlockEntry, h] + have hsum := hmu (blockBasis α + blockBasis β) + have hdiagα := hmu (blockBasis α) + have hdiagβ := hmu (blockBasis β) + rw [blockBasis_sum_pairing] at hsum + rw [blockBasis_pairing] at hdiagα + rw [blockBasis_pairing] at hdiagβ + have hsymm' := hsymm α β + linarith + +theorem eq_coarseBlockMatrix_of_isCoarseBlockMatrix {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {Abar : BlockMat d} (hA : IsCoarseBlockMatrix U a Abar) : + Abar = coarseBlockMatrix U a := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · funext i j + symm + exact coarseBlockEntry_eq_of_isCoarseBlockMatrix hA (Sum.inl i) (Sum.inl j) + · funext i j + symm + exact coarseBlockEntry_eq_of_isCoarseBlockMatrix hA (Sum.inl i) (Sum.inr j) + · funext i j + symm + exact coarseBlockEntry_eq_of_isCoarseBlockMatrix hA (Sum.inr i) (Sum.inl j) + · funext i j + symm + exact coarseBlockEntry_eq_of_isCoarseBlockMatrix hA (Sum.inr i) (Sum.inr j) + +theorem isCoarseBlockMatrix_coarseBlockMatrix {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := by + rcases hex with ⟨Abar, hA⟩ + rw [← eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact hA + +theorem Mu_eq_half_blockVecDot_coarseBlockMatrix {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + (isCoarseBlockMatrix_coarseBlockMatrix hex).2 P + +theorem existsUnique_coarseBlockMatrix {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := by + rcases hex with ⟨Abar, hA⟩ + refine ⟨Abar, hA, ?_⟩ + intro Bbar hB + rw [eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA, + eq_coarseBlockMatrix_of_isCoarseBlockMatrix hB] + +theorem isCoarseBlockMatrix_of_mu_eq_half_quadraticForm {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {Q : QuadraticForm ℝ (FullBlockVec d)} + (hmu : ∀ P : BlockVec d, Mu U P a = (1 / 2 : ℝ) * Q (toFullBlockVec P)) : + IsCoarseBlockMatrix U a (ofFullBlockMat Q.toMatrix') := by + refine ⟨isSymmetricBlockMat_of_isSymm (QuadraticForm.isSymm_toMatrix' Q), ?_⟩ + intro P + rw [hmu P] + congr 1 + calc + Q (toFullBlockVec P) + = Q.associated (toFullBlockVec P) (toFullBlockVec P) := by + symm + exact QuadraticMap.associated_eq_self_apply (S := ℝ) (Q := Q) (toFullBlockVec P) + _ = Matrix.toLinearMap₂' ℝ Q.toMatrix' (toFullBlockVec P) (toFullBlockVec P) := by + rw [QuadraticForm.toMatrix', Matrix.toLinearMap₂'_toMatrix'] + _ = blockVecDot P (blockMatVecMul (ofFullBlockMat Q.toMatrix') P) := by + symm + simpa using + (blockVecDot_blockMatVecMul_eq_toLinearMap₂' + (A := ofFullBlockMat Q.toMatrix') (X := P) (Y := P)) + +theorem eq_coarseBlockMatrix_of_mu_eq_half_quadraticForm {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {Q : QuadraticForm ℝ (FullBlockVec d)} + (hmu : ∀ P : BlockVec d, Mu U P a = (1 / 2 : ℝ) * Q (toFullBlockVec P)) : + ofFullBlockMat Q.toMatrix' = coarseBlockMatrix U a := by + exact eq_coarseBlockMatrix_of_isCoarseBlockMatrix + (isCoarseBlockMatrix_of_mu_eq_half_quadraticForm hmu) + +theorem exists_coarseBlockMatrix_of_hasQuadraticMu {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hquad : HasQuadraticMu U a) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := by + rcases hquad with ⟨Q, hmu⟩ + exact ⟨ofFullBlockMat Q.toMatrix', isCoarseBlockMatrix_of_mu_eq_half_quadraticForm hmu⟩ + +theorem existsUnique_coarseBlockMatrix_of_hasQuadraticMu {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} (hquad : HasQuadraticMu U a) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + existsUnique_coarseBlockMatrix (exists_coarseBlockMatrix_of_hasQuadraticMu hquad) + +theorem Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} (hquad : HasQuadraticMu U a) (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix + (exists_coarseBlockMatrix_of_hasQuadraticMu hquad) P + +/-- The note-faithful `\mathbf A_*^{-1}(U; a)` obtained from `\mathbf A(U; a)` by reflection. -/ +noncomputable def coarseStarredBlockMatrixInv {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : + BlockMat d := + blockReflect (coarseBlockMatrix U a) + +def IsSigmaStarCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (sigmaStar : Mat d) : Prop := + sigmaStar.IsSymm ∧ + ∀ q : Vec d, ResponseJ U 0 q a = (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) + +def IsKappaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (sigmaStar kappa : Mat d) : Prop := + ∀ p q : Vec d, + ResponseJ U p q a - ResponseJ U p 0 a - ResponseJ U 0 q a + vecDot p q = + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + +def IsSigmaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (sigma sigmaStar kappa : Mat d) : Prop := + sigma.IsSymm ∧ + ∀ p : Vec d, + ResponseJ U p 0 a + - (1 / 2 : ℝ) * vecDot p (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ + (matVecMul kappa p))) + = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + +def IsSigmaStarInvCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (sigmaStarInv : Mat d) : Prop := + sigmaStarInv.IsSymm ∧ + ∀ q : Vec d, ResponseJ U 0 q a = (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStarInv q) + +private noncomputable def sigmaStarInvEntry {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : ℝ := + if _h : i = j then + 2 * ResponseJ U 0 (Pi.single i 1) a + else + ResponseJ U 0 (Pi.single i 1 + Pi.single j 1) a + - ResponseJ U 0 (Pi.single i 1) a + - ResponseJ U 0 (Pi.single j 1) a + +noncomputable def sigmaStarInvCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + fun i j => sigmaStarInvEntry U a i j + +@[simp] theorem sigmaStarInvCoarse_apply_same {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i : Fin d) : + sigmaStarInvCoarse U a i i = 2 * ResponseJ U 0 (Pi.single i 1) a := by + simp [sigmaStarInvCoarse, sigmaStarInvEntry] + +@[simp] theorem sigmaStarInvCoarse_apply_of_ne {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + {i j : Fin d} (hij : i ≠ j) : + sigmaStarInvCoarse U a i j = + ResponseJ U 0 (Pi.single i 1 + Pi.single j 1) a + - ResponseJ U 0 (Pi.single i 1) a + - ResponseJ U 0 (Pi.single j 1) a := by + simp [sigmaStarInvCoarse, sigmaStarInvEntry, hij] + +private theorem sigmaStarInvEntry_eq_of_isSigmaStarInvCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigmaStarInv : Mat d} (hS : IsSigmaStarInvCoarse U a sigmaStarInv) + (i j : Fin d) : + sigmaStarInvEntry U a i j = sigmaStarInv i j := by + rcases hS with ⟨hsymm, hresp⟩ + by_cases h : i = j + · subst j + have hdiag := hresp (Pi.single i 1) + simp [sigmaStarInvEntry, vecDot_single_left, matVecMul_single] at hdiag ⊢ + linarith + · simp [sigmaStarInvEntry, h] + have hsum := hresp (Pi.single i 1 + Pi.single j 1) + have hdiag_i := hresp (Pi.single i 1) + have hdiag_j := hresp (Pi.single j 1) + rw [basis_sum_pairing] at hsum + simp [vecDot_single_left, matVecMul_single] at hdiag_i hdiag_j + have hsymm' := hsymm.apply i j + linarith + +theorem eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigmaStarInv : Mat d} (hS : IsSigmaStarInvCoarse U a sigmaStarInv) : + sigmaStarInv = sigmaStarInvCoarse U a := by + funext i j + symm + exact sigmaStarInvEntry_eq_of_isSigmaStarInvCoarse hS i j + +theorem isSigmaStarInvCoarse_sigmaStarInvCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ sigmaStarInv : Mat d, IsSigmaStarInvCoarse U a sigmaStarInv) : + IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) := by + rcases hex with ⟨sigmaStarInv, hS⟩ + rw [← eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse hS] + exact hS + +theorem existsUnique_sigmaStarInvCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ sigmaStarInv : Mat d, IsSigmaStarInvCoarse U a sigmaStarInv) : + ∃! sigmaStarInv : Mat d, IsSigmaStarInvCoarse U a sigmaStarInv := by + rcases hex with ⟨sigmaStarInv, hS⟩ + refine ⟨sigmaStarInv, hS, ?_⟩ + intro sigmaStarInv' hS' + rw [eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse hS, + eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse hS'] + +theorem isSigmaStarInvCoarse_of_isSigmaStarCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + IsSigmaStarInvCoarse U a sigmaStar⁻¹ := by + rcases hS with ⟨hsymm, hresp⟩ + refine ⟨?_, ?_⟩ + · rw [Matrix.IsSymm.ext_iff] + intro i j + have hT := Matrix.transpose_nonsing_inv (A := sigmaStar) + simpa [hsymm.eq] using congrFun (congrFun hT i) j + · simpa using hresp + +theorem sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + sigmaStarInvCoarse U a = sigmaStar⁻¹ := by + symm + exact eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS) + +noncomputable def sigmaStarCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + (sigmaStarInvCoarse U a)⁻¹ + +theorem eq_sigmaStarCoarse_of_isSigmaStarCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) : + sigmaStarCoarse U a = sigmaStar := by + unfold sigmaStarCoarse + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, Matrix.nonsing_inv_nonsing_inv _ hdet] + +theorem sigmaStarCoarse_isSymm_of_isSigmaStarCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hdet : IsUnit sigmaStar.det) : + (sigmaStarCoarse U a).IsSymm := by + rw [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] + exact hS.1 + +def IsSigmaStarInvKappaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (M : Mat d) : Prop := + ∀ p q : Vec d, + ResponseJ U p q a - ResponseJ U p 0 a - ResponseJ U 0 q a + vecDot p q = + vecDot q (matVecMul M p) + +noncomputable def sigmaStarInvKappaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + fun i j => + ResponseJ U (Pi.single j 1) (Pi.single i 1) a + - ResponseJ U (Pi.single j 1) 0 a + - ResponseJ U 0 (Pi.single i 1) a + + vecDot (Pi.single j 1) (Pi.single i 1) + +private theorem sigmaStarInvKappaEntry_eq_of_isSigmaStarInvKappaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {M : Mat d} + (hM : IsSigmaStarInvKappaCoarse U a M) (i j : Fin d) : + sigmaStarInvKappaCoarse U a i j = M i j := by + have hij := hM (Pi.single j 1) (Pi.single i 1) + simp [sigmaStarInvKappaCoarse, vecDot_single_left, matVecMul_single, vecDot_single_right] at hij ⊢ + exact hij + +theorem eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {M : Mat d} + (hM : IsSigmaStarInvKappaCoarse U a M) : + M = sigmaStarInvKappaCoarse U a := by + funext i j + symm + exact sigmaStarInvKappaEntry_eq_of_isSigmaStarInvKappaCoarse hM i j + +theorem isSigmaStarInvKappaCoarse_sigmaStarInvKappaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ M : Mat d, IsSigmaStarInvKappaCoarse U a M) : + IsSigmaStarInvKappaCoarse U a (sigmaStarInvKappaCoarse U a) := by + rcases hex with ⟨M, hM⟩ + rw [← eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse hM] + exact hM + +theorem existsUnique_sigmaStarInvKappaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ M : Mat d, IsSigmaStarInvKappaCoarse U a M) : + ∃! M : Mat d, IsSigmaStarInvKappaCoarse U a M := by + rcases hex with ⟨M, hM⟩ + refine ⟨M, hM, ?_⟩ + intro M' hM' + rw [eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse hM, + eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse hM'] + +theorem isSigmaStarInvKappaCoarse_of_isKappaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigmaStar kappa : Mat d} (hK : IsKappaCoarse U a sigmaStar kappa) : + IsSigmaStarInvKappaCoarse U a (sigmaStar⁻¹ * kappa) := by + intro p q + rw [hK p q] + rw [matVecMul_mul] + +theorem sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigmaStar kappa : Mat d} (hK : IsKappaCoarse U a sigmaStar kappa) : + sigmaStarInvKappaCoarse U a = sigmaStar⁻¹ * kappa := by + symm + exact eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse + (isSigmaStarInvKappaCoarse_of_isKappaCoarse hK) + +noncomputable def kappaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + sigmaStarCoarse U a * sigmaStarInvKappaCoarse U a + +theorem eq_kappaCoarse_of_isKappaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigmaStar kappa : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) (hdet : IsUnit sigmaStar.det) : + kappaCoarse U a = kappa := by + unfold kappaCoarse + rw [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + simpa [Matrix.mul_assoc] using Matrix.mul_nonsing_inv_cancel_left (A := sigmaStar) kappa hdet + +noncomputable def sigmaCorrectedResponse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p : Vec d) : ℝ := + ResponseJ U p 0 a + - (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p))) + +def IsSigmaCanonicalCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (sigma : Mat d) : Prop := + sigma.IsSymm ∧ + ∀ p : Vec d, + sigmaCorrectedResponse U a p = (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + +private noncomputable def sigmaEntry {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i j : Fin d) : ℝ := + if _h : i = j then + 2 * sigmaCorrectedResponse U a (Pi.single i 1) + else + sigmaCorrectedResponse U a (Pi.single i 1 + Pi.single j 1) + - sigmaCorrectedResponse U a (Pi.single i 1) + - sigmaCorrectedResponse U a (Pi.single j 1) + +noncomputable def sigmaCoarse {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + fun i j => sigmaEntry U a i j + +@[simp] theorem sigmaCoarse_apply_same {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (i : Fin d) : + sigmaCoarse U a i i = 2 * sigmaCorrectedResponse U a (Pi.single i 1) := by + simp [sigmaCoarse, sigmaEntry] + +@[simp] theorem sigmaCoarse_apply_of_ne {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + {i j : Fin d} (hij : i ≠ j) : + sigmaCoarse U a i j = + sigmaCorrectedResponse U a (Pi.single i 1 + Pi.single j 1) + - sigmaCorrectedResponse U a (Pi.single i 1) + - sigmaCorrectedResponse U a (Pi.single j 1) := by + simp [sigmaCoarse, sigmaEntry, hij] + +private theorem sigmaEntry_eq_of_isSigmaCanonicalCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigma : Mat d} (hSigma : IsSigmaCanonicalCoarse U a sigma) + (i j : Fin d) : + sigmaEntry U a i j = sigma i j := by + rcases hSigma with ⟨hsymm, hresp⟩ + by_cases h : i = j + · subst j + have hdiag := hresp (Pi.single i 1) + simp [sigmaEntry, vecDot_single_left, matVecMul_single] at hdiag ⊢ + linarith + · simp [sigmaEntry, h] + have hsum := hresp (Pi.single i 1 + Pi.single j 1) + have hdiag_i := hresp (Pi.single i 1) + have hdiag_j := hresp (Pi.single j 1) + rw [basis_sum_pairing] at hsum + simp [vecDot_single_left, matVecMul_single] at hdiag_i hdiag_j + have hsymm' := hsymm.apply i j + linarith + +theorem eq_sigmaCoarse_of_isSigmaCanonicalCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigma : Mat d} (hSigma : IsSigmaCanonicalCoarse U a sigma) : + sigma = sigmaCoarse U a := by + funext i j + symm + exact sigmaEntry_eq_of_isSigmaCanonicalCoarse hSigma i j + +theorem isSigmaCanonicalCoarse_sigmaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ sigma : Mat d, IsSigmaCanonicalCoarse U a sigma) : + IsSigmaCanonicalCoarse U a (sigmaCoarse U a) := by + rcases hex with ⟨sigma, hSigma⟩ + rw [← eq_sigmaCoarse_of_isSigmaCanonicalCoarse hSigma] + exact hSigma + +theorem existsUnique_sigmaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ sigma : Mat d, IsSigmaCanonicalCoarse U a sigma) : + ∃! sigma : Mat d, IsSigmaCanonicalCoarse U a sigma := by + rcases hex with ⟨sigma, hSigma⟩ + refine ⟨sigma, hSigma, ?_⟩ + intro sigma' hSigma' + rw [eq_sigmaCoarse_of_isSigmaCanonicalCoarse hSigma, + eq_sigmaCoarse_of_isSigmaCanonicalCoarse hSigma'] + +theorem isSigmaCanonicalCoarse_of_isSigmaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) : + IsSigmaCanonicalCoarse U a sigma := by + rcases hSigma with ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro p + rw [sigmaCorrectedResponse, eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + exact hresp p + +theorem sigmaCoarse_eq_of_isSigmaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) : + sigmaCoarse U a = sigma := by + symm + exact eq_sigmaCoarse_of_isSigmaCanonicalCoarse + (isSigmaCanonicalCoarse_of_isSigmaCoarse hS hK hSigma hdet) + +theorem sigmaCoarse_isSymm_of_isSigmaCoarse {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) : + (sigmaCoarse U a).IsSymm := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] + exact hSigma.1 + +noncomputable def bCoarse {d : ℕ} (sigma sigmaStar kappa : Mat d) : Mat d := + sigma + (matTranspose kappa) * sigmaStar⁻¹ * kappa + +theorem bCoarse_smul {d : ℕ} {sigma sigmaStar kappa : Mat d} + (hdet : IsUnit sigmaStar.det) {lam : ℝ} (hlam : 0 < lam) : + bCoarse (lam • sigma) (lam • sigmaStar) (lam • kappa) = lam • bCoarse sigma sigmaStar kappa := by + unfold bCoarse + rw [nonsing_inv_smul lam hlam.ne' hdet] + calc + lam • sigma + (matTranspose (lam • kappa)) * (lam⁻¹ • sigmaStar⁻¹) * (lam • kappa) = + lam • sigma + (matTranspose (lam • kappa)) * (sigmaStar⁻¹ * kappa) := by + rw [mul_assoc] + congr 1 + rw [smul_mul_assoc, mul_smul_comm] + simp [smul_smul, inv_mul_cancel₀ hlam.ne'] + _ = lam • sigma + lam • ((matTranspose kappa) * (sigmaStar⁻¹ * kappa)) := by + have htranspose : matTranspose (lam • kappa) = lam • matTranspose kappa := by + simp [matTranspose] + rw [htranspose, smul_mul_assoc] + _ = lam • bCoarse sigma sigmaStar kappa := by + simp [bCoarse, smul_add, mul_assoc] + +theorem bCoarse_isSymm_of_isSigmaCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (bCoarse sigma sigmaStar kappa).IsSymm := by + rcases hSigma with ⟨hSigmaSymm, _⟩ + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hCorrSymm : (((matTranspose kappa) * sigmaStar⁻¹ * kappa)).IsSymm := + transpose_mul_symm_mul_isSymm kappa sigmaStar⁻¹ hSInvSymm + rw [Matrix.IsSymm.ext_iff] + intro i j + simp [bCoarse, hSigmaSymm.apply i j, hCorrSymm.apply i j] + +noncomputable def aCoarse {d : ℕ} (sigma kappa : Mat d) : Mat d := + sigma - matTranspose kappa + +noncomputable def aStarCoarse {d : ℕ} (sigmaStar kappa : Mat d) : Mat d := + sigmaStar - matTranspose kappa + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimization.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimization.lean new file mode 100644 index 0000000000..8aae565554 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimization.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.InnerProductSpace.LaxMilgram +public import Mathlib.Analysis.Normed.Operator.BoundedLinearMaps +public import Mathlib.Topology.Algebra.Module.ClosedSubmodule + +/-! # Hilbert Minimization -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file records the abstract Hilbert-space minimization step behind the +construction of the doubled `\mu`-minimizers in the coarse-graining notes. + +The setup is a real Hilbert space `V`, a coercive continuous bilinear form +`B : V →L[ℝ] V →L[ℝ] ℝ`, and a closed subspace `K`. For each affine shift +`x : V`, we build the unique correction `k(x) ∈ K` such that +`x + k(x)` is stationary against variations in `K`. Under symmetry of `B`, this +stationary point minimizes the quadratic energy on the affine space `x + K`. +-/ + +noncomputable section + +open ContinuousLinearMap +open Filter +open scoped RealInnerProductSpace +open scoped Topology + +section Abstract + +variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [CompleteSpace V] + +instance closedSubmodule_completeSpace (K : ClosedSubmodule ℝ V) : CompleteSpace K.toSubmodule := + K.isClosed.completeSpace_coe + +/-- The quadratic energy attached to a continuous bilinear form. -/ +def quadraticEnergy (B : V →L[ℝ] V →L[ℝ] ℝ) (u : V) : ℝ := + (1 / 2 : ℝ) * B u u + +omit [CompleteSpace V] in +theorem quadraticEnergy_nonneg {B : V →L[ℝ] V →L[ℝ] ℝ} (hB : IsCoercive B) (u : V) : + 0 ≤ quadraticEnergy B u := by + rcases hB with ⟨C, hC_pos, hcoer⟩ + have h_nonneg : 0 ≤ B u u := by + calc + 0 ≤ C * ‖u‖ * ‖u‖ := by positivity + _ ≤ B u u := hcoer u + unfold quadraticEnergy + nlinarith + +omit [CompleteSpace V] in +theorem quadraticEnergy_add {B : V →L[ℝ] V →L[ℝ] ℝ} + (h_symm : ∀ u v : V, B u v = B v u) (u v : V) : + quadraticEnergy B (u + v) = quadraticEnergy B u + B u v + quadraticEnergy B v := by + unfold quadraticEnergy + have h_expand : B (u + v) (u + v) = B u u + B u v + B v u + B v v := by + rw [B.map_add₂ u v (u + v), (B u).map_add, (B v).map_add] + ring + rw [h_expand, h_symm v u] + ring + +omit [CompleteSpace V] in +theorem quadraticEnergy_continuous (B : V →L[ℝ] V →L[ℝ] ℝ) : + Continuous (quadraticEnergy B) := by + have h_apply : Continuous fun u : V => B u u := + Continuous.clm_apply B.continuous continuous_id + unfold quadraticEnergy + exact continuous_const.mul h_apply + +/-- The concave quadratic response `ℓ(u) - 1 / 2 B(u,u)` attached to a +continuous linear functional and a coercive bilinear form. -/ +def linearQuadraticResponse (B : V →L[ℝ] V →L[ℝ] ℝ) (ℓ : V →L[ℝ] ℝ) + (u : V) : ℝ := + ℓ u - quadraticEnergy B u + +omit [CompleteSpace V] in +theorem linearQuadraticResponse_le_of_firstVariation {B : V →L[ℝ] V →L[ℝ] ℝ} + {ℓ : V →L[ℝ] ℝ} (hB : IsCoercive B) + (h_symm : ∀ u v : V, B u v = B v u) {u v : V} + (hfirst : ∀ w : V, B u w = ℓ w) : + linearQuadraticResponse B ℓ v ≤ linearQuadraticResponse B ℓ u := by + let w : V := v - u + have hv : v = u + w := by + simp [w] + have hlin : ℓ w = B u w := (hfirst w).symm + have hresp : + linearQuadraticResponse B ℓ v = + linearQuadraticResponse B ℓ u - quadraticEnergy B w := by + rw [hv] + rw [linearQuadraticResponse, linearQuadraticResponse, quadraticEnergy_add h_symm] + rw [map_add] + rw [hlin] + ring + rw [hresp] + exact sub_le_self _ (quadraticEnergy_nonneg hB w) + +/-- The Riesz representative of a continuous linear functional. -/ +noncomputable def rieszRep (ℓ : V →L[ℝ] ℝ) : V := + (InnerProductSpace.toDual ℝ V).symm ℓ + +@[simp] theorem inner_rieszRep_apply (ℓ : V →L[ℝ] ℝ) (w : V) : + inner ℝ (rieszRep ℓ) w = ℓ w := by + change inner ℝ (((InnerProductSpace.toDual ℝ V).symm) ℓ) w = ℓ w + exact + InnerProductSpace.toDual_symm_apply + (𝕜 := ℝ) + (E := V) + (x := w) + (y := (ℓ : StrongDual ℝ V)) + +/-- The unique stationary point for the concave quadratic response associated +to a coercive bilinear form. -/ +noncomputable def linearQuadraticResponseMaximizer + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ℓ : V →L[ℝ] ℝ) : V := + hB.continuousLinearEquivOfBilin.symm (rieszRep ℓ) + +theorem linearQuadraticResponseMaximizer_firstVariation + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ℓ : V →L[ℝ] ℝ) (w : V) : + B (linearQuadraticResponseMaximizer B hB ℓ) w = ℓ w := by + let e : V ≃L[ℝ] V := hB.continuousLinearEquivOfBilin + calc + B (linearQuadraticResponseMaximizer B hB ℓ) w + = inner ℝ (e (linearQuadraticResponseMaximizer B hB ℓ)) w := by + symm + exact hB.continuousLinearEquivOfBilin_apply + (linearQuadraticResponseMaximizer B hB ℓ) w + _ = inner ℝ (rieszRep ℓ) w := by + simp [linearQuadraticResponseMaximizer, e] + _ = ℓ w := by + exact inner_rieszRep_apply ℓ w + +theorem linearQuadraticResponse_le_maximizer {B : V →L[ℝ] V →L[ℝ] ℝ} + (hB : IsCoercive B) (h_symm : ∀ u v : V, B u v = B v u) + (ℓ : V →L[ℝ] ℝ) (v : V) : + linearQuadraticResponse B ℓ v ≤ + linearQuadraticResponse B ℓ (linearQuadraticResponseMaximizer B hB ℓ) := + linearQuadraticResponse_le_of_firstVariation hB h_symm + (fun w => linearQuadraticResponseMaximizer_firstVariation B hB ℓ w) + +omit [CompleteSpace V] in +theorem isBoundedBilinearMap_restrict {B : V →L[ℝ] V →L[ℝ] ℝ} + (K : ClosedSubmodule ℝ V) : + IsBoundedBilinearMap ℝ (fun p : K.toSubmodule × K.toSubmodule => B p.1 p.2) where + add_left x₁ x₂ y := by + exact B.map_add₂ x₁ x₂ y + smul_left c x y := by + exact B.map_smul₂ c x y + add_right x y₁ y₂ := by + exact (B x).map_add y₁ y₂ + smul_right c x y := by + exact (B x).map_smul c y + bound := by + refine ⟨max ‖B‖ 1, zero_lt_one.trans_le (le_max_right _ _), ?_⟩ + intro x y + calc + ‖B x y‖ ≤ ‖B‖ * ‖x‖ * ‖y‖ := B.le_opNorm₂ x y + _ ≤ max ‖B‖ 1 * ‖x‖ * ‖y‖ := by + gcongr + exact le_max_left _ _ + +/-- Restrict a continuous bilinear form to a closed subspace. -/ +noncomputable def restrictBilin (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) : + K.toSubmodule →L[ℝ] K.toSubmodule →L[ℝ] ℝ := + IsBoundedBilinearMap.toContinuousLinearMap + (f := fun p : K.toSubmodule × K.toSubmodule => B p.1 p.2) + (isBoundedBilinearMap_restrict (B := B) K) + +omit [CompleteSpace V] in +@[simp] theorem restrictBilin_apply (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (u w : K.toSubmodule) : + restrictBilin K B u w = B u w := by + simp [restrictBilin] + +omit [CompleteSpace V] in +theorem isCoercive_restrictBilin {B : V →L[ℝ] V →L[ℝ] ℝ} + (K : ClosedSubmodule ℝ V) (hB : IsCoercive B) : + IsCoercive (restrictBilin K B) := by + rcases hB with ⟨C, hC_pos, hcoer⟩ + refine ⟨C, hC_pos, ?_⟩ + intro u + simpa [restrictBilin_apply] using hcoer (u : V) + +omit [CompleteSpace V] in +theorem isBoundedBilinearMap_subspaceRhs {B : V →L[ℝ] V →L[ℝ] ℝ} + (K : ClosedSubmodule ℝ V) : + IsBoundedBilinearMap ℝ (fun p : V × K.toSubmodule => -B p.1 p.2) where + add_left x₁ x₂ y := by + change -(B (x₁ + x₂) y) = -B x₁ y + -B x₂ y + rw [B.map_add₂] + ring + smul_left c x y := by + change -(B (c • x) y) = c • -B x y + rw [B.map_smul₂] + simp + add_right x y₁ y₂ := by + change -(B x (y₁ + y₂)) = -B x y₁ + -B x y₂ + rw [(B x).map_add] + ring + smul_right c x y := by + change -(B x (c • y)) = c • -B x y + rw [(B x).map_smul] + simp + bound := by + refine ⟨max ‖B‖ 1, zero_lt_one.trans_le (le_max_right _ _), ?_⟩ + intro x y + calc + ‖-B x y‖ = ‖B x y‖ := by simp + _ ≤ ‖B‖ * ‖x‖ * ‖y‖ := B.le_opNorm₂ x y + _ ≤ max ‖B‖ 1 * ‖x‖ * ‖y‖ := by + gcongr + exact le_max_left _ _ + +/-- The continuous family of linear functionals `w ↦ -B x w` on the closed subspace `K`. -/ +noncomputable def subspaceRhsBilin (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) : + V →L[ℝ] K.toSubmodule →L[ℝ] ℝ := + IsBoundedBilinearMap.toContinuousLinearMap + (f := fun p : V × K.toSubmodule => -B p.1 p.2) + (isBoundedBilinearMap_subspaceRhs (B := B) K) + +omit [CompleteSpace V] in +@[simp] theorem subspaceRhsBilin_apply (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (x : V) (w : K.toSubmodule) : + subspaceRhsBilin K B x w = -B x w := by + rfl + +/-- Riesz representation on the closed subspace `K`. -/ +noncomputable def subspaceRieszMap (K : ClosedSubmodule ℝ V) : + (K.toSubmodule →L[ℝ] ℝ) →L[ℝ] K.toSubmodule := + (InnerProductSpace.toDual ℝ K.toSubmodule).symm.toContinuousLinearEquiv.toContinuousLinearMap + +@[simp] theorem inner_subspaceRieszMap_apply (K : ClosedSubmodule ℝ V) + (ℓ : K.toSubmodule →L[ℝ] ℝ) (w : K.toSubmodule) : + inner ℝ (subspaceRieszMap K ℓ) w = ℓ w := by + change inner ℝ (((InnerProductSpace.toDual ℝ K.toSubmodule).symm) ℓ) w = ℓ w + exact + (InnerProductSpace.toDual_symm_apply (𝕜 := ℝ) (E := K.toSubmodule) (x := w) (y := ℓ)) + +/-- The Riesz representatives of the functionals `w ↦ -B x w` on `K`. -/ +noncomputable def subspaceRhs (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) : + V →L[ℝ] K.toSubmodule := + (subspaceRieszMap K).comp (subspaceRhsBilin K B) + +@[simp] theorem inner_subspaceRhs_apply (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (x : V) (w : K.toSubmodule) : + inner ℝ (subspaceRhs K B x) w = -B x w := by + change inner ℝ (subspaceRieszMap K (subspaceRhsBilin K B x)) w = -B x w + rw [inner_subspaceRieszMap_apply] + simp [subspaceRhsBilin_apply] + +/-- The unique correction in `K` solving the affine first-variation equation. -/ +noncomputable def correctionMap (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (hB : IsCoercive B) : + V →L[ℝ] K.toSubmodule := + ((isCoercive_restrictBilin K hB).continuousLinearEquivOfBilin).symm.toContinuousLinearMap.comp + (subspaceRhs K B) + +theorem restrictBilin_correctionMap_apply (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (x : V) (w : K.toSubmodule) : + restrictBilin K B (correctionMap K B hB x) w = -B x w := by + let hK : IsCoercive (restrictBilin K B) := isCoercive_restrictBilin K hB + calc + restrictBilin K B (correctionMap K B hB x) w + = inner ℝ (hK.continuousLinearEquivOfBilin (correctionMap K B hB x)) w := by + symm + exact hK.continuousLinearEquivOfBilin_apply (correctionMap K B hB x) w + _ = inner ℝ (subspaceRhs K B x) w := by + simp [correctionMap] + _ = -B x w := by + exact inner_subspaceRhs_apply K B x w + +/-- The affine stationary point `x + k(x)` in the affine space `x + K`. -/ +noncomputable def affineMinimizerMap (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (hB : IsCoercive B) : + V →L[ℝ] V := + ContinuousLinearMap.id ℝ V + (K.toSubmodule.subtypeL.comp (correctionMap K B hB)) + +@[simp] theorem affineMinimizerMap_apply (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (x : V) : + affineMinimizerMap K B hB x = x + correctionMap K B hB x := + rfl + +theorem sub_affineMinimizerMap_apply_mem (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (x : V) : + affineMinimizerMap K B hB x - x ∈ K := by + change affineMinimizerMap K B hB x - x ∈ K.toSubmodule + have h_eq : affineMinimizerMap K B hB x - x = (correctionMap K B hB x : V) := by + simp [affineMinimizerMap] + rw [h_eq] + exact (correctionMap K B hB x).2 + +theorem affineMinimizerMap_firstVariation (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (x : V) (w : K.toSubmodule) : + B (affineMinimizerMap K B hB x) w = 0 := by + calc + B (affineMinimizerMap K B hB x) w + = B x w + B (correctionMap K B hB x) w := by + simp [affineMinimizerMap, map_add] + _ = B x w + restrictBilin K B (correctionMap K B hB x) w := by + rw [restrictBilin_apply] + _ = B x w + (-B x w) := by + rw [restrictBilin_correctionMap_apply K B hB x w] + _ = 0 := by ring + +theorem affineMinimizerMap_minimizes_quadraticEnergy (K : ClosedSubmodule ℝ V) + {B : V →L[ℝ] V →L[ℝ] ℝ} (hB : IsCoercive B) + (h_symm : ∀ u v : V, B u v = B v u) (x y : V) + (hy : y - x ∈ K) : + quadraticEnergy B (affineMinimizerMap K B hB x) ≤ quadraticEnergy B y := by + let m := affineMinimizerMap K B hB x + have hm : m - x ∈ K := sub_affineMinimizerMap_apply_mem K B hB x + have hdiff : y - m ∈ K := by + have : y - m = (y - x) - (m - x) := by abel + rw [this] + exact K.toSubmodule.sub_mem hy hm + let w : K.toSubmodule := ⟨y - m, hdiff⟩ + have hy_eq : y = m + w := by + change y = m + (y - m) + abel + rw [hy_eq, quadraticEnergy_add h_symm] + have hfirst : B m w = 0 := by + change B (affineMinimizerMap K B hB x) w = 0 + exact affineMinimizerMap_firstVariation K B hB x w + rw [hfirst, add_zero] + exact le_add_of_nonneg_right (quadraticEnergy_nonneg hB w) + +/-- The affine minimizer is the unique point in the affine subspace whose +quadratic energy is no larger than the canonical minimized energy. -/ +theorem eq_affineMinimizerMap_of_quadraticEnergy_le (K : ClosedSubmodule ℝ V) + {B : V →L[ℝ] V →L[ℝ] ℝ} (hB : IsCoercive B) + (h_symm : ∀ u v : V, B u v = B v u) (x y : V) + (hy : y - x ∈ K) + (hle : quadraticEnergy B y ≤ quadraticEnergy B (affineMinimizerMap K B hB x)) : + y = affineMinimizerMap K B hB x := by + let m := affineMinimizerMap K B hB x + have hm : m - x ∈ K := sub_affineMinimizerMap_apply_mem K B hB x + have hdiff : y - m ∈ K := by + have : y - m = (y - x) - (m - x) := by abel + rw [this] + exact K.toSubmodule.sub_mem hy hm + let w : K.toSubmodule := ⟨y - m, hdiff⟩ + have hy_eq : y = m + w := by + change y = m + (y - m) + abel + have hfirst : B m w = 0 := by + change B (affineMinimizerMap K B hB x) w = 0 + exact affineMinimizerMap_firstVariation K B hB x w + have henergy : + quadraticEnergy B y = quadraticEnergy B m + quadraticEnergy B (w : V) := by + rw [hy_eq, quadraticEnergy_add h_symm, hfirst] + ring + have hnonneg : 0 ≤ quadraticEnergy B (w : V) := + quadraticEnergy_nonneg hB (w : V) + have hle_zero : quadraticEnergy B (w : V) ≤ 0 := by + nlinarith + have hqzero : quadraticEnergy B (w : V) = 0 := + le_antisymm hle_zero hnonneg + have hBww : B (w : V) (w : V) = 0 := by + unfold quadraticEnergy at hqzero + nlinarith + rcases hB with ⟨C, hC_pos, hcoer⟩ + have hnorm_nonneg : 0 ≤ ‖(w : V)‖ := norm_nonneg _ + have hnorm_zero : ‖(w : V)‖ = 0 := by + have hcoer_w := hcoer (w : V) + rw [hBww] at hcoer_w + by_contra hne + have hnorm_pos : 0 < ‖(w : V)‖ := by + exact lt_of_le_of_ne (norm_nonneg _) (fun hzero => hne hzero.symm) + have hprod_pos : 0 < C * ‖(w : V)‖ * ‖(w : V)‖ := by positivity + linarith + have hw_zero : (w : V) = 0 := norm_eq_zero.mp hnorm_zero + calc + y = m + w := hy_eq + _ = m := by rw [hw_zero, add_zero] + +/-- The quadratic energy splits into the minimized affine energy plus the +energy of the displacement from the affine minimizer. -/ +theorem quadraticEnergy_eq_affineMinimizerMap_add_diff (K : ClosedSubmodule ℝ V) + {B : V →L[ℝ] V →L[ℝ] ℝ} (hB : IsCoercive B) + (h_symm : ∀ u v : V, B u v = B v u) (x y : V) (hy : y - x ∈ K) : + quadraticEnergy B y = + quadraticEnergy B (affineMinimizerMap K B hB x) + + quadraticEnergy B (y - affineMinimizerMap K B hB x) := by + let m := affineMinimizerMap K B hB x + have hm : m - x ∈ K := sub_affineMinimizerMap_apply_mem K B hB x + have hdiff : y - m ∈ K := by + have : y - m = (y - x) - (m - x) := by abel + rw [this] + exact K.toSubmodule.sub_mem hy hm + let w : K.toSubmodule := ⟨y - m, hdiff⟩ + have hy_eq : y = m + w := by + change y = m + (y - m) + abel + have hfirst : B m w = 0 := by + change B (affineMinimizerMap K B hB x) w = 0 + exact affineMinimizerMap_firstVariation K B hB x w + calc + quadraticEnergy B y = quadraticEnergy B (m + w) := by rw [hy_eq] + _ = quadraticEnergy B m + B m w + quadraticEnergy B (w : V) := by + rw [quadraticEnergy_add h_symm] + _ = quadraticEnergy B m + quadraticEnergy B (w : V) := by + rw [hfirst] + ring + +/-- Deterministic Galerkin/Cea convergence: if approximate minimizers in the +affine space have energy no larger than admissible comparison points converging +to the true Hilbert minimizer, then the approximate minimizers converge to the +true minimizer. -/ +theorem tendsto_galerkin_of_quadraticEnergy_le_approximants + (K : ClosedSubmodule ℝ V) {B : V →L[ℝ] V →L[ℝ] ℝ} + (hB : IsCoercive B) (h_symm : ∀ u v : V, B u v = B v u) + (x : V) {u v : ℕ → V} + (hu_mem : ∀ n, u n - x ∈ K) (hv_mem : ∀ n, v n - x ∈ K) + (hEnergy : ∀ n, quadraticEnergy B (u n) ≤ quadraticEnergy B (v n)) + (hv : Tendsto v atTop (𝓝 (affineMinimizerMap K B hB x))) : + Tendsto u atTop (𝓝 (affineMinimizerMap K B hB x)) := by + let m := affineMinimizerMap K B hB x + let hBcopy := hB + rcases hBcopy with ⟨C, hC_pos, hcoer⟩ + rw [tendsto_iff_norm_sub_tendsto_zero] + have hvdiff : Tendsto (fun n : ℕ => v n - m) atTop (𝓝 0) := by + have hconst : Tendsto (fun _ : ℕ => m) atTop (𝓝 m) := tendsto_const_nhds + simpa [m] using hv.sub hconst + have hqv : + Tendsto (fun n : ℕ => quadraticEnergy B (v n - m)) atTop (𝓝 0) := by + have hcont := (quadraticEnergy_continuous B).tendsto (0 : V) + simpa [Function.comp_def, quadraticEnergy] using hcont.comp hvdiff + have hupper : + Tendsto + (fun n : ℕ => Real.sqrt ((2 / C) * quadraticEnergy B (v n - m))) + atTop (𝓝 0) := by + have hmul : Tendsto (fun n : ℕ => (2 / C) * quadraticEnergy B (v n - m)) + atTop (𝓝 ((2 / C) * 0)) := + hqv.const_mul (2 / C) + have hsqrt := hmul.sqrt + simpa using hsqrt + refine squeeze_zero (fun n : ℕ => norm_nonneg (u n - m)) ?_ hupper + intro n + have hu_split := + quadraticEnergy_eq_affineMinimizerMap_add_diff K hB h_symm x (u n) (hu_mem n) + have hv_split := + quadraticEnergy_eq_affineMinimizerMap_add_diff K hB h_symm x (v n) (hv_mem n) + have hqle_raw : + quadraticEnergy B (u n - affineMinimizerMap K B hB x) ≤ + quadraticEnergy B (v n - affineMinimizerMap K B hB x) := by + nlinarith [hEnergy n, hu_split, hv_split] + have hqle : quadraticEnergy B (u n - m) ≤ quadraticEnergy B (v n - m) := by + change + quadraticEnergy B (u n - affineMinimizerMap K B hB x) ≤ + quadraticEnergy B (v n - affineMinimizerMap K B hB x) + exact hqle_raw + have hcoer_u := hcoer (u n - m) + have hsq : ‖u n - m‖ ^ 2 ≤ (2 / C) * quadraticEnergy B (v n - m) := by + unfold quadraticEnergy at hqle + have hpow : ‖u n - m‖ ^ 2 = ‖u n - m‖ * ‖u n - m‖ := by ring + unfold quadraticEnergy + rw [hpow] + field_simp [ne_of_gt hC_pos] + nlinarith [hcoer_u, hqle, hC_pos] + exact Real.le_sqrt_of_sq_le hsq + +/-- Deterministic convergence from near-minimal energy. If points in the +affine correction space have quadratic energy within `ε n` of the selected +Hilbert minimizer and `ε n → 0`, then the points converge to that minimizer. -/ +theorem tendsto_of_quadraticEnergy_le_min_add_eps + (K : ClosedSubmodule ℝ V) {B : V →L[ℝ] V →L[ℝ] ℝ} + (hB : IsCoercive B) (h_symm : ∀ u v : V, B u v = B v u) + (x : V) {u : ℕ → V} {ε : ℕ → ℝ} + (hu_mem : ∀ n, u n - x ∈ K) + (hε_tendsto : Tendsto ε atTop (𝓝 0)) + (hEnergy : + ∀ n, + quadraticEnergy B (u n) ≤ + quadraticEnergy B (affineMinimizerMap K B hB x) + ε n) : + Tendsto u atTop (𝓝 (affineMinimizerMap K B hB x)) := by + let m := affineMinimizerMap K B hB x + let hBcopy := hB + rcases hBcopy with ⟨C, hC_pos, hcoer⟩ + rw [tendsto_iff_norm_sub_tendsto_zero] + have hupper : + Tendsto (fun n : ℕ => Real.sqrt ((2 / C) * ε n)) atTop (𝓝 0) := by + have hmul : Tendsto (fun n : ℕ => (2 / C) * ε n) atTop (𝓝 ((2 / C) * 0)) := + hε_tendsto.const_mul (2 / C) + simpa using hmul.sqrt + refine squeeze_zero (fun n : ℕ => norm_nonneg (u n - m)) ?_ hupper + intro n + have hu_split := + quadraticEnergy_eq_affineMinimizerMap_add_diff K hB h_symm x (u n) (hu_mem n) + have hqle_raw : quadraticEnergy B (u n - affineMinimizerMap K B hB x) ≤ ε n := by + nlinarith [hEnergy n, hu_split] + have hqle : quadraticEnergy B (u n - m) ≤ ε n := by + change quadraticEnergy B (u n - affineMinimizerMap K B hB x) ≤ ε n + exact hqle_raw + have hcoer_u := hcoer (u n - m) + have hsq : ‖u n - m‖ ^ 2 ≤ (2 / C) * ε n := by + unfold quadraticEnergy at hqle + have hpow : ‖u n - m‖ ^ 2 = ‖u n - m‖ * ‖u n - m‖ := by ring + rw [hpow] + field_simp [ne_of_gt hC_pos] + nlinarith [hcoer_u, hqle, hC_pos] + exact Real.le_sqrt_of_sq_le hsq + +section Parameterized + +variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + +/-- The affine minimizer map pulled back along a continuous linear parameter map. -/ +noncomputable def parameterAffineMinimizerMap (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ι : E →L[ℝ] V) : + E →L[ℝ] V := + (affineMinimizerMap K B hB).comp ι + +@[simp] theorem parameterAffineMinimizerMap_apply (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ι : E →L[ℝ] V) (p : E) : + parameterAffineMinimizerMap K B hB ι p = affineMinimizerMap K B hB (ι p) := + rfl + +theorem sub_parameterAffineMinimizerMap_apply_mem (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ι : E →L[ℝ] V) (p : E) : + parameterAffineMinimizerMap K B hB ι p - ι p ∈ K := by + change affineMinimizerMap K B hB (ι p) - ι p ∈ K + exact sub_affineMinimizerMap_apply_mem K B hB (ι p) + +theorem parameterAffineMinimizerMap_firstVariation (K : ClosedSubmodule ℝ V) + (B : V →L[ℝ] V →L[ℝ] ℝ) (hB : IsCoercive B) (ι : E →L[ℝ] V) + (p : E) (w : K.toSubmodule) : + B (parameterAffineMinimizerMap K B hB ι p) w = 0 := by + simpa [parameterAffineMinimizerMap] using + affineMinimizerMap_firstVariation K B hB (ι p) w + +theorem parameterAffineMinimizerMap_minimizes_quadraticEnergy (K : ClosedSubmodule ℝ V) + {B : V →L[ℝ] V →L[ℝ] ℝ} (hB : IsCoercive B) + (h_symm : ∀ u v : V, B u v = B v u) (ι : E →L[ℝ] V) (p : E) (y : V) + (hy : y - ι p ∈ K) : + quadraticEnergy B (parameterAffineMinimizerMap K B hB ι p) ≤ quadraticEnergy B y := by + simpa [parameterAffineMinimizerMap] using + affineMinimizerMap_minimizes_quadraticEnergy K hB h_symm (ι p) y hy + +end Parameterized + +end Abstract + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimizationMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimizationMeasurability.lean new file mode 100644 index 0000000000..c988d8f167 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/HilbertMinimizationMeasurability.lean @@ -0,0 +1,493 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.MeasureTheory.Function.StronglyMeasurable.AEStronglyMeasurable +public import Mathlib.MeasureTheory.Function.StronglyMeasurable.Basic +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.MeasureTheory.Constructions.BorelSpace.ContinuousLinearMap +public import Mathlib.Topology.Instances.Matrix + +/-! # Hilbert Minimization Measurability -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open ContinuousLinearMap +open Filter +open MeasureTheory +open TopologicalSpace +open scoped Topology + +/-! +# Measurability primitives for Hilbert minimizers + +This file contains generic measurable-operator facts needed to prove +measurable dependence of the Hilbert minimizer maps used in the doubled `Mu` +problem. These are upstream primitives, not Chapter 5 wrappers. +-/ + +section Inverse + +variable {Ω E F : Type*} [MeasurableSpace Ω] +variable [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] +variable [NormedAddCommGroup F] [NormedSpace ℝ F] + +/-- Inversion of continuous linear maps is continuous on the subtype of +invertible maps. -/ +theorem continuous_clm_inverse_isInvertible : + Continuous fun T : {T : E →L[ℝ] F // T.IsInvertible} => + ContinuousLinearMap.inverse T.1 := by + rw [continuous_iff_continuousAt] + intro T + exact + (T.2.contDiffAt_map_inverse (𝕜 := ℝ) (n := 0)).continuousAt.comp + continuous_subtype_val.continuousAt + +/-- A measurable family of invertible continuous linear maps has a measurable +family of inverses. -/ +theorem _root_.Measurable.clm_inverse_of_isInvertible + {L : Ω → E →L[ℝ] F} (hL : Measurable L) + (hInv : ∀ ω, (L ω).IsInvertible) : + Measurable fun ω => ContinuousLinearMap.inverse (L ω) := by + let Lsub : Ω → {T : E →L[ℝ] F // T.IsInvertible} := fun ω => ⟨L ω, hInv ω⟩ + have hLsub : Measurable Lsub := hL.subtype_mk + exact continuous_clm_inverse_isInvertible.measurable.comp hLsub + +end Inverse + +section Apply + +variable {Ω E F : Type*} [MeasurableSpace Ω] +variable [NormedAddCommGroup E] [NormedSpace ℝ E] [MeasurableSpace E] +variable [NormedAddCommGroup F] [NormedSpace ℝ F] +variable [MeasurableSpace F] [BorelSpace F] + +/-- Joint measurability of applying a measurable family of continuous linear +maps to a measurable family of vectors. -/ +theorem _root_.Measurable.clm_apply {L : Ω → E →L[ℝ] F} {x : Ω → E} + [OpensMeasurableSpace ((E →L[ℝ] F) × E)] + (hL : Measurable L) (hx : Measurable x) : + Measurable fun ω => L ω (x ω) := by + have hEval : Measurable fun p : (E →L[ℝ] F) × E => p.1 p.2 := + (Continuous.clm_apply continuous_fst continuous_snd).measurable + exact hEval.comp (hL.prodMk hx) + +end Apply + +section Matrix + +/-- Entries of the total matrix inverse are measurable functions of the matrix +entries. This is a finite-dimensional primitive used by Galerkin +approximations; invertibility is not needed for measurability because Lean's +matrix inverse is total. -/ +theorem measurable_matrix_inv_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable fun x => + (((A x : Matrix (Fin d) (Fin d) ℝ)⁻¹ : Matrix (Fin d) (Fin d) ℝ) i j) := by + have hdetMap : Measurable fun M : Fin d → Fin d → ℝ => Matrix.det M := by + let f : (Fin d → Fin d → ℝ) → ℝ := fun M => Matrix.det M + have hf : Continuous f := by + simpa [f] using! (continuous_id.matrix_det : Continuous f) + exact hf.measurable + have hdet : Measurable fun x => Matrix.det (A x) := hdetMap.comp hA + have hadjMap : Measurable fun M : Fin d → Fin d → ℝ => Matrix.adjugate M i j := by + let g : (Fin d → Fin d → ℝ) → ℝ := fun M => Matrix.adjugate M i j + have hg : Continuous g := by + simpa [g] using! (((continuous_id.matrix_adjugate).matrix_elem i j) : Continuous g) + exact hg.measurable + have hadj : Measurable fun x => Matrix.adjugate (A x) i j := hadjMap.comp hA + have hEq : ∀ x, (((A x : Matrix (Fin d) (Fin d) ℝ)⁻¹ : Matrix (Fin d) (Fin d) ℝ) i j) + = (Matrix.det (A x))⁻¹ * Matrix.adjugate (A x) i j := fun x => by + have := congrFun (congrFun (Matrix.inv_def (A x : Matrix (Fin d) (Fin d) ℝ)) i) j + simpa [Matrix.smul_apply, smul_eq_mul, Ring.inverse_eq_inv'] using this + simp only [hEq] + exact hdet.inv.mul hadj + +end Matrix + +section Galerkin + +variable {Ω V : Type*} [MeasurableSpace Ω] +variable [NormedAddCommGroup V] [NormedSpace ℝ V] +variable {n : ℕ} + +/-- The finite Galerkin Gram matrix for the bilinear form `B` on a selected +finite family of correction vectors. -/ +noncomputable def galerkinMatrix (B : V →L[ℝ] V →L[ℝ] ℝ) (e : Fin n → V) : + Fin n → Fin n → ℝ := + fun i j => B (e j) (e i) + +/-- The finite Galerkin right-hand side for the affine shift `x`. -/ +noncomputable def galerkinRhs (B : V →L[ℝ] V →L[ℝ] ℝ) (x : V) (e : Fin n → V) : + Fin n → ℝ := + fun i => -B x (e i) + +/-- The coordinate vector obtained from the total inverse of the finite +Galerkin Gram matrix. Coercivity later identifies this total inverse with the +honest finite-dimensional inverse. -/ +noncomputable def galerkinCoeff (B : V →L[ℝ] V →L[ℝ] ℝ) (x : V) (e : Fin n → V) : + Fin n → ℝ := + fun j => ∑ i : Fin n, + (((galerkinMatrix B e : Matrix (Fin n) (Fin n) ℝ)⁻¹ : + Matrix (Fin n) (Fin n) ℝ) j i) * + galerkinRhs B x e i + +/-- The finite Galerkin correction vector assembled from its measurable +coordinate vector. -/ +noncomputable def galerkinCorrection (B : V →L[ℝ] V →L[ℝ] ℝ) (x : V) + (e : Fin n → V) : V := + ∑ j : Fin n, galerkinCoeff B x e j • e j + +/-- The finite Galerkin affine minimizer. -/ +noncomputable def galerkinAffineMinimizer (B : V →L[ℝ] V →L[ℝ] ℝ) (x : V) + (e : Fin n → V) : V := + x + galerkinCorrection B x e + +/-- Measurability of the finite Galerkin Gram matrix from scalar probe +measurability of the bilinear form. -/ +theorem measurable_galerkinMatrix + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {e : Fin n → V} + (hB : ∀ i j, Measurable fun ω => B ω (e j) (e i)) : + Measurable fun ω => galerkinMatrix (B ω) e := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [galerkinMatrix] using hB i j + +/-- Measurability of the finite Galerkin right-hand side from scalar probe +measurability. -/ +theorem measurable_galerkinRhs + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} {e : Fin n → V} + (hBx : ∀ i, Measurable fun ω => B ω (x ω) (e i)) : + Measurable fun ω => galerkinRhs (B ω) (x ω) e := by + refine measurable_pi_iff.2 ?_ + intro i + have hEq : ∀ ω, galerkinRhs (B ω) (x ω) e i = -(B ω (x ω) (e i)) := + fun ω => neg_apply (B ω (x ω)) (e i) + simp only [hEq] + exact (hBx i).neg + +/-- Measurability of the finite Galerkin coefficient vector. -/ +theorem measurable_galerkinCoeff + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} {e : Fin n → V} + (hB : ∀ i j, Measurable fun ω => B ω (e j) (e i)) + (hBx : ∀ i, Measurable fun ω => B ω (x ω) (e i)) : + Measurable fun ω => galerkinCoeff (B ω) (x ω) e := by + classical + have hMat : Measurable fun ω => galerkinMatrix (B ω) e := + measurable_galerkinMatrix hB + have hRhs : Measurable fun ω => galerkinRhs (B ω) (x ω) e := + measurable_galerkinRhs hBx + refine measurable_pi_iff.2 ?_ + intro j + refine Finset.measurable_sum Finset.univ ?_ + intro i _hi + have hInvEntry : + Measurable fun ω => + (((galerkinMatrix (B ω) e : Matrix (Fin n) (Fin n) ℝ)⁻¹ : + Matrix (Fin n) (Fin n) ℝ) j i) := + measurable_matrix_inv_entry hMat j i + have hRhsEntry : Measurable fun ω => galerkinRhs (B ω) (x ω) e i := + measurable_pi_iff.1 hRhs i + simpa [galerkinCoeff] using! hInvEntry.mul hRhsEntry + +/-- Measurability of each finite Galerkin correction. -/ +theorem measurable_galerkinCorrection + [MeasurableSpace V] [MeasurableAdd₂ V] [MeasurableSMul ℝ V] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} {e : Fin n → V} + (hB : ∀ i j, Measurable fun ω => B ω (e j) (e i)) + (hBx : ∀ i, Measurable fun ω => B ω (x ω) (e i)) : + Measurable fun ω => galerkinCorrection (B ω) (x ω) e := by + classical + have hCoeff : Measurable fun ω => galerkinCoeff (B ω) (x ω) e := + measurable_galerkinCoeff hB hBx + unfold galerkinCorrection + refine Finset.measurable_sum Finset.univ ?_ + intro j _hj + have hj : Measurable fun ω => galerkinCoeff (B ω) (x ω) e j := + measurable_pi_iff.1 hCoeff j + exact hj.smul_const (e j) + +/-- Measurability of each finite Galerkin affine minimizer. -/ +theorem measurable_galerkinAffineMinimizer + [MeasurableSpace V] [MeasurableAdd₂ V] [MeasurableSMul ℝ V] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} {e : Fin n → V} + (hx : Measurable x) + (hB : ∀ i j, Measurable fun ω => B ω (e j) (e i)) + (hBx : ∀ i, Measurable fun ω => B ω (x ω) (e i)) : + Measurable fun ω => galerkinAffineMinimizer (B ω) (x ω) e := by + have hCorr : Measurable fun ω => galerkinCorrection (B ω) (x ω) e := + measurable_galerkinCorrection hB hBx + simpa [galerkinAffineMinimizer] using! hx.add hCorr + +/-- Strong measurability of each finite Galerkin affine minimizer from scalar +Gram/RHS probe measurability. Unlike `measurable_galerkinAffineMinimizer`, +this theorem does not require a second-countable target space; it assembles the +finite-dimensional correction from strongly measurable real coordinates. -/ +theorem stronglyMeasurable_galerkinAffineMinimizer_of_scalar_probes + [MeasurableSpace V] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} {e : Fin n → V} + (hx : StronglyMeasurable x) + (hB : ∀ i j, Measurable fun ω => B ω (e j) (e i)) + (hBx : ∀ i, Measurable fun ω => B ω (x ω) (e i)) : + StronglyMeasurable fun ω => galerkinAffineMinimizer (B ω) (x ω) e := by + classical + have hCoeff : Measurable fun ω => galerkinCoeff (B ω) (x ω) e := + measurable_galerkinCoeff hB hBx + have hCorr : StronglyMeasurable fun ω => galerkinCorrection (B ω) (x ω) e := by + unfold galerkinCorrection + have hsum : StronglyMeasurable + (∑ j : Fin n, fun ω => galerkinCoeff (B ω) (x ω) e j • e j) := by + refine Finset.stronglyMeasurable_sum Finset.univ ?_ + intro j _hj + have hj : Measurable fun ω => galerkinCoeff (B ω) (x ω) e j := + measurable_pi_iff.1 hCoeff j + exact hj.stronglyMeasurable.smul_const (e j) + convert hsum using 1 + ext ω + simp [Finset.sum_apply] + simpa [galerkinAffineMinimizer] using! hx.add hCorr + +/-- A pointwise limit of finite Galerkin affine minimizers is strongly +measurable. This is the generic measurability bridge for selected Hilbert +solutions once convergence of the Galerkin scheme has been proved. -/ +theorem stronglyMeasurable_of_tendsto_galerkinAffineMinimizer + [MeasurableSpace V] [SecondCountableTopology V] [OpensMeasurableSpace V] + [MeasurableAdd₂ V] [MeasurableSMul ℝ V] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} + {e : (m : ℕ) → Fin m → V} {u : Ω → V} + (hx : Measurable x) + (hB : ∀ m, ∀ i j : Fin m, Measurable fun ω => B ω (e m j) (e m i)) + (hBx : ∀ m, ∀ i : Fin m, Measurable fun ω => B ω (x ω) (e m i)) + (hlim : + Tendsto + (fun m : ℕ => fun ω => galerkinAffineMinimizer (B ω) (x ω) (e m)) + atTop (𝓝 u)) : + StronglyMeasurable u := by + refine stronglyMeasurable_of_tendsto atTop ?_ hlim + intro m + exact (measurable_galerkinAffineMinimizer hx (hB m) (hBx m)).stronglyMeasurable + +/-- A pointwise limit of finite Galerkin affine minimizers is strongly +measurable, using the finite-dimensional strong-measurability theorem and +therefore avoiding any second-countability assumption on the Hilbert target. -/ +theorem stronglyMeasurable_of_tendsto_galerkinAffineMinimizer_of_scalar_probes + [MeasurableSpace V] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} + {e : (m : ℕ) → Fin m → V} {u : Ω → V} + (hx : StronglyMeasurable x) + (hB : ∀ m, ∀ i j : Fin m, Measurable fun ω => B ω (e m j) (e m i)) + (hBx : ∀ m, ∀ i : Fin m, Measurable fun ω => B ω (x ω) (e m i)) + (hlim : + Tendsto + (fun m : ℕ => fun ω => galerkinAffineMinimizer (B ω) (x ω) (e m)) + atTop (𝓝 u)) : + StronglyMeasurable u := by + refine stronglyMeasurable_of_tendsto atTop ?_ hlim + intro m + exact stronglyMeasurable_galerkinAffineMinimizer_of_scalar_probes + hx (hB m) (hBx m) + +/-- An a.e. pointwise limit of finite Galerkin affine minimizers is +a.e.-strongly measurable. -/ +theorem aestronglyMeasurable_of_tendsto_ae_galerkinAffineMinimizer + [MeasurableSpace V] [SecondCountableTopology V] [OpensMeasurableSpace V] + [MeasurableAdd₂ V] [MeasurableSMul ℝ V] + {μ : Measure Ω} {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {x : Ω → V} + {e : (m : ℕ) → Fin m → V} {u : Ω → V} + (hx : Measurable x) + (hB : ∀ m, ∀ i j : Fin m, Measurable fun ω => B ω (e m j) (e m i)) + (hBx : ∀ m, ∀ i : Fin m, Measurable fun ω => B ω (x ω) (e m i)) + (hlim : + ∀ᵐ ω ∂μ, + Tendsto (fun m : ℕ => galerkinAffineMinimizer (B ω) (x ω) (e m)) + atTop (𝓝 (u ω))) : + AEStronglyMeasurable u μ := by + refine aestronglyMeasurable_of_tendsto_ae atTop ?_ hlim + intro m + exact (measurable_galerkinAffineMinimizer hx (hB m) (hBx m)).stronglyMeasurable.aestronglyMeasurable + +end Galerkin + +section HilbertGalerkinLimit + +variable {Ω V : Type*} [MeasurableSpace Ω] +variable [NormedAddCommGroup V] [InnerProductSpace ℝ V] [CompleteSpace V] + +/-- The selected affine Hilbert minimizer is strongly measurable once finite +Galerkin minimizers satisfy the deterministic energy-comparison convergence +hypotheses. This is the generic "finite Galerkin convergence implies +measurable maximizer/minimizer" bridge. -/ +theorem stronglyMeasurable_of_galerkin_energy_approximants + [MeasurableSpace V] (K : ClosedSubmodule ℝ V) + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {hB : ∀ ω, IsCoercive (B ω)} + (h_symm : ∀ ω, ∀ u v : V, B ω u v = B ω v u) + {x : Ω → V} {e : (m : ℕ) → Fin m → V} {v : Ω → ℕ → V} + (hx : StronglyMeasurable x) + (hB_meas : ∀ m, ∀ i j : Fin m, Measurable fun ω => B ω (e m j) (e m i)) + (hBx_meas : ∀ m, ∀ i : Fin m, Measurable fun ω => B ω (x ω) (e m i)) + (hGalerkin_mem : + ∀ ω m, galerkinAffineMinimizer (B ω) (x ω) (e m) - x ω ∈ K) + (hv_mem : ∀ ω m, v ω m - x ω ∈ K) + (hEnergy : + ∀ ω m, + quadraticEnergy (B ω) (galerkinAffineMinimizer (B ω) (x ω) (e m)) ≤ + quadraticEnergy (B ω) (v ω m)) + (hv_tendsto : + ∀ ω, + Tendsto (fun m : ℕ => v ω m) atTop + (𝓝 (affineMinimizerMap K (B ω) (hB ω) (x ω)))) : + StronglyMeasurable fun ω => affineMinimizerMap K (B ω) (hB ω) (x ω) := by + have hlim : + Tendsto + (fun m : ℕ => fun ω => + galerkinAffineMinimizer (B ω) (x ω) (e m)) + atTop + (𝓝 fun ω => affineMinimizerMap K (B ω) (hB ω) (x ω)) := by + rw [tendsto_pi_nhds] + intro ω + exact tendsto_galerkin_of_quadraticEnergy_le_approximants + K (hB ω) (h_symm ω) (x ω) + (fun m => hGalerkin_mem ω m) + (fun m => hv_mem ω m) + (fun m => hEnergy ω m) + (hv_tendsto ω) + exact stronglyMeasurable_of_tendsto_galerkinAffineMinimizer_of_scalar_probes + hx hB_meas hBx_meas hlim + +/-- A.e.-strong measurability version of +`stronglyMeasurable_of_galerkin_energy_approximants`. -/ +theorem aestronglyMeasurable_of_galerkin_energy_approximants + [MeasurableSpace V] {μ : Measure Ω} (K : ClosedSubmodule ℝ V) + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {hB : ∀ ω, IsCoercive (B ω)} + (h_symm : ∀ ω, ∀ u v : V, B ω u v = B ω v u) + {x : Ω → V} {e : (m : ℕ) → Fin m → V} {v : Ω → ℕ → V} + (hx : StronglyMeasurable x) + (hB_meas : ∀ m, ∀ i j : Fin m, Measurable fun ω => B ω (e m j) (e m i)) + (hBx_meas : ∀ m, ∀ i : Fin m, Measurable fun ω => B ω (x ω) (e m i)) + (hGalerkin_mem : + ∀ ω m, galerkinAffineMinimizer (B ω) (x ω) (e m) - x ω ∈ K) + (hv_mem : ∀ ω m, v ω m - x ω ∈ K) + (hEnergy : + ∀ ω m, + quadraticEnergy (B ω) (galerkinAffineMinimizer (B ω) (x ω) (e m)) ≤ + quadraticEnergy (B ω) (v ω m)) + (hv_tendsto : + ∀ ω, + Tendsto (fun m : ℕ => v ω m) atTop + (𝓝 (affineMinimizerMap K (B ω) (hB ω) (x ω)))) : + AEStronglyMeasurable (fun ω => affineMinimizerMap K (B ω) (hB ω) (x ω)) μ := + (stronglyMeasurable_of_galerkin_energy_approximants + K h_symm hx hB_meas hBx_meas hGalerkin_mem hv_mem hEnergy + hv_tendsto).aestronglyMeasurable + +end HilbertGalerkinLimit + +section CorrectionMap + +variable {Ω V : Type*} [MeasurableSpace Ω] +variable [NormedAddCommGroup V] [InnerProductSpace ℝ V] [CompleteSpace V] + +/-- The Hilbert correction map is the inverse of the Lax-Milgram operator on +the restricted correction subspace, applied to the affine right-hand side. -/ +theorem correctionMap_eq_clm_inverse_restrictBilin + (K : ClosedSubmodule ℝ V) (B : V →L[ℝ] V →L[ℝ] ℝ) + (hB : IsCoercive B) (x : V) : + correctionMap K B hB x = + ContinuousLinearMap.inverse + (InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K B)) + (subspaceRhs K B x) := by + rw [correctionMap] + rw [← ContinuousLinearMap.inverse_equiv + ((isCoercive_restrictBilin K hB).continuousLinearEquivOfBilin)] + rfl + +/-- Measurability of the Hilbert correction map follows from measurability of +the restricted Lax-Milgram operator and the affine right-hand side. -/ +theorem _root_.Measurable.correctionMap_apply + [MeasurableSpace V] + (K : ClosedSubmodule ℝ V) + [BorelSpace K.toSubmodule] + [OpensMeasurableSpace ((K.toSubmodule →L[ℝ] K.toSubmodule) × K.toSubmodule)] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {hB : ∀ ω, IsCoercive (B ω)} + {x : Ω → V} + (hSharp : + Measurable fun ω => + InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))) + (hRhs : Measurable fun ω => subspaceRhs K (B ω) (x ω)) : + Measurable fun ω => correctionMap K (B ω) (hB ω) (x ω) := by + have hInv : + ∀ ω, + (InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))).IsInvertible := by + intro ω + exact ⟨(isCoercive_restrictBilin K (hB ω)).continuousLinearEquivOfBilin, rfl⟩ + have hInverse : + Measurable fun ω => + ContinuousLinearMap.inverse + (InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))) := + hSharp.clm_inverse_of_isInvertible hInv + have hApply : + Measurable fun ω => + ContinuousLinearMap.inverse + (InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))) + (subspaceRhs K (B ω) (x ω)) := + hInverse.clm_apply hRhs + simpa [correctionMap_eq_clm_inverse_restrictBilin] using hApply + +/-- Measurability of the affine Hilbert minimizer follows from measurability +of the affine shift, the restricted Lax-Milgram operator, and the affine +right-hand side. -/ +theorem _root_.Measurable.affineMinimizerMap_apply + [MeasurableSpace V] [BorelSpace V] [MeasurableAdd₂ V] + (K : ClosedSubmodule ℝ V) + [BorelSpace K.toSubmodule] + [OpensMeasurableSpace ((K.toSubmodule →L[ℝ] K.toSubmodule) × K.toSubmodule)] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {hB : ∀ ω, IsCoercive (B ω)} + {x : Ω → V} (hx : Measurable x) + (hSharp : + Measurable fun ω => + InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))) + (hRhs : Measurable fun ω => subspaceRhs K (B ω) (x ω)) : + Measurable fun ω => affineMinimizerMap K (B ω) (hB ω) (x ω) := by + have hCorr : Measurable fun ω => correctionMap K (B ω) (hB ω) (x ω) := + Measurable.correctionMap_apply K hSharp hRhs + have hCorrV : Measurable fun ω => (correctionMap K (B ω) (hB ω) (x ω) : V) := + measurable_subtype_coe.comp hCorr + simpa [affineMinimizerMap] using! hx.add hCorrV + +/-- Measurability of the parameterized affine Hilbert minimizer. -/ +theorem _root_.Measurable.parameterAffineMinimizerMap_apply + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [MeasurableSpace E] [OpensMeasurableSpace E] + [MeasurableSpace V] [BorelSpace V] [MeasurableAdd₂ V] + (K : ClosedSubmodule ℝ V) + [BorelSpace K.toSubmodule] + [OpensMeasurableSpace ((K.toSubmodule →L[ℝ] K.toSubmodule) × K.toSubmodule)] + {B : Ω → V →L[ℝ] V →L[ℝ] ℝ} {hB : ∀ ω, IsCoercive (B ω)} + (ι : E →L[ℝ] V) {p : Ω → E} (hp : Measurable p) + (hSharp : + Measurable fun ω => + InnerProductSpace.continuousLinearMapOfBilin (restrictBilin K (B ω))) + (hRhs : Measurable fun ω => subspaceRhs K (B ω) (ι (p ω))) : + Measurable fun ω => parameterAffineMinimizerMap K (B ω) (hB ω) ι (p ω) := by + have hx : Measurable fun ω => ι (p ω) := + ι.measurable_comp hp + simpa [parameterAffineMinimizerMap] using + (Measurable.affineMinimizerMap_apply K hx hSharp hRhs) + +end CorrectionMap + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities.lean new file mode 100644 index 0000000000..a56697a05b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.BlockSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering + +/-! # Magic Identities -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/Basics.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/Basics.lean new file mode 100644 index 0000000000..8de2c8df35 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/Basics.lean @@ -0,0 +1,1022 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge + +/-! # Basics -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Foundational completed-square identities and ordering consequences. +-/ + +theorem magic_vecDot_matVecMul_comm_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + vecDot ξ (matVecMul A η) = vecDot η (matVecMul A ξ) := by + calc + vecDot ξ (matVecMul A η) = vecDot ξ (matVecMul (matTranspose A) η) := by + rw [show matTranspose A = A by simpa [matTranspose] using hA.eq] + _ = vecDot (matVecMul A ξ) η := by + rw [vecDot_matVecMul_transpose] + _ = vecDot η (matVecMul A ξ) := by + rw [vecDot_comm] + +theorem magic_half_vecDot_add_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + (1 / 2 : ℝ) * vecDot (ξ + η) (matVecMul A (ξ + η)) = + (1 / 2 : ℝ) * vecDot ξ (matVecMul A ξ) + + vecDot ξ (matVecMul A η) + + (1 / 2 : ℝ) * vecDot η (matVecMul A η) := by + have hcomm := magic_vecDot_matVecMul_comm_of_isSymm hA ξ η + simp [matVecMul_add, vecDot_add_left, vecDot_add_right, hcomm] + ring + +theorem magic_half_vecDot_sub_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + (1 / 2 : ℝ) * vecDot (ξ - η) (matVecMul A (ξ - η)) = + (1 / 2 : ℝ) * vecDot ξ (matVecMul A ξ) - + vecDot ξ (matVecMul A η) + + (1 / 2 : ℝ) * vecDot η (matVecMul A η) := by + simpa [sub_eq_add_neg, matVecMul_neg, vecDot_neg_left, vecDot_neg_right] using + magic_half_vecDot_add_of_isSymm hA ξ (-η) + +theorem magic_adjoint_shifted_square_eq_completed_square {d : ℕ} + {sigma sigmaStar kappa : Mat d} (hSInvSymm : (sigmaStar⁻¹).IsSymm) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + have hSub : + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simpa using magic_half_vecDot_sub_of_isSymm hSInvSymm q (matVecMul kappa p) + have hShift : + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p)) + + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p)) := by + simpa using + magic_half_vecDot_sub_of_isSymm hSInvSymm q (matVecMul (sigmaStar + kappa) p) + have hInvMul : matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p) = p := by + rw [matVecMul_mul, Matrix.nonsing_inv_mul sigmaStar hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hInvShift : + matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p) = + p + matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + calc + matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p) + = matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p) + + matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + rw [add_matVecMul, matVecMul_add] + _ = p + matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + rw [hInvMul] + have hCross : + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p)) = + vecDot p q + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + rw [hInvShift] + simp [vecDot_add_right, vecDot_comm] + have hKsym : + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) = + vecDot p (matVecMul kappa p) := by + have ht : + vecDot p (matVecMul (matTranspose kappa) p) = + vecDot p (matVecMul kappa p) := by + calc + vecDot p (matVecMul (matTranspose kappa) p) = + vecDot (matVecMul kappa p) p := by + rw [vecDot_matVecMul_transpose] + _ = vecDot p (matVecMul kappa p) := by + rw [vecDot_comm] + rw [add_matVecMul, vecDot_add_right, ht] + ring + have hKpair : + vecDot p (matVecMul (kappa + matTranspose kappa) p) = + 2 * vecDot p (matVecMul kappa p) := by + linarith [hKsym] + have hTailSigma : + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) = + vecDot p (matVecMul sigmaStar p) := by + rw [hInvMul, vecDot_comm] + have hTailCross : + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot p (matVecMul kappa p) := by + calc + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) := by + rw [magic_vecDot_matVecMul_comm_of_isSymm hSInvSymm + (matVecMul sigmaStar p) (matVecMul kappa p)] + _ = vecDot (matVecMul kappa p) p := by + rw [hInvMul] + _ = vecDot p (matVecMul kappa p) := by + rw [vecDot_comm] + have hTailCorr : + vecDot (matVecMul kappa p) (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + symm + exact vecDot_matVecMul_transpose p + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) kappa + have hTail : + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigmaStar p) + + vecDot p (matVecMul kappa p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + calc + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar + kappa) p)) = + (1 / 2 : ℝ) * vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) + + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simpa [add_matVecMul] using + magic_half_vecDot_add_of_isSymm hSInvSymm + (matVecMul sigmaStar p) (matVecMul kappa p) + _ = (1 / 2 : ℝ) * vecDot p (matVecMul sigmaStar p) + + vecDot p (matVecMul kappa p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + rw [hTailSigma, hTailCross, hTailCorr] + have hMagic : + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + rw [hSub, hShift, hCross, hTail, ← hTailCorr, hKpair] + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, vecDot_neg_right] + ring_nf + exact hMagic.symm + +theorem magic_half_vecDot_sub_add_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + (1 / 2 : ℝ) * vecDot (ξ - η) (matVecMul A (ξ - η)) + + (1 / 2 : ℝ) * vecDot (ξ + η) (matVecMul A (ξ + η)) = + vecDot ξ (matVecMul A ξ) + + vecDot η (matVecMul A η) := by + have hsub := magic_half_vecDot_sub_of_isSymm hA ξ η + have hadd := magic_half_vecDot_add_of_isSymm hA ξ η + linarith + +theorem magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat {d : ℕ} + {B : BlockMat d} (hB : IsSymmetricBlockMat B) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (-p, q) (blockMatVecMul B (-p, q)) = + (1 / 2 : ℝ) * vecDot q (matVecMul B.lowerRight q) - + vecDot q (matVecMul B.lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul B.upperLeft p) := by + have hur : + matTranspose B.upperRight = B.lowerLeft := by + ext i j + simpa [matTranspose, blockMatEntry] using (hB (Sum.inr i) (Sum.inl j)).symm + have hcross : + vecDot p (matVecMul B.upperRight q) = + vecDot q (matVecMul B.lowerLeft p) := by + calc + vecDot p (matVecMul B.upperRight q) = + vecDot (matVecMul B.upperRight q) p := by + rw [vecDot_comm] + _ = vecDot q (matVecMul (matTranspose B.upperRight) p) := by + symm + exact vecDot_matVecMul_transpose q p B.upperRight + _ = vecDot q (matVecMul B.lowerLeft p) := by + rw [hur] + simp [blockVecDot, blockMatVecMul, matVecMul_neg, + vecDot_add_right, vecDot_neg_left, vecDot_neg_right, hcross] + ring + +theorem magic_half_blockVecDot_pos_left_of_isSymmetricBlockMat {d : ℕ} + {B : BlockMat d} (hB : IsSymmetricBlockMat B) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) (blockMatVecMul B (p, q)) = + (1 / 2 : ℝ) * vecDot q (matVecMul B.lowerRight q) + + vecDot q (matVecMul B.lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul B.upperLeft p) := by + simpa [matVecMul_neg, vecDot_neg_left, vecDot_neg_right] using + magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat hB (-p) q + +theorem magic_identity_sigmaCorrectedResponse_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + sigmaCorrectedResponse U a p = (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) := by + exact (isSigmaCanonicalCoarse_of_isSigmaCoarse hS hK hSigma hdet).2 p + +theorem magic_identity_responseJ_completed_square_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + sigmaCorrectedResponse U a p - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p)) := by + have hResp := + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p q + have hZero := + basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p + have hSymm : (sigmaStarInvCoarse U a).IsSymm := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + exact (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hShift : + (1 / 2 : ℝ) * vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + + (1 / 2 : ℝ) * vecDot (matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) := by + simpa using + magic_half_vecDot_add_of_isSymm hSymm q (matVecMul (kappaCoarse U a) p) + have hCorr : + vecDot (matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) = + vecDot p + (matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p))) := by + symm + exact vecDot_matVecMul_transpose p + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + (kappaCoarse U a) + have hResp' : + ResponseJ U p q a = + ResponseJ U p 0 a - vecDot p q + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) := by + linarith + calc + ResponseJ U p q a = + ResponseJ U p 0 a - vecDot p q + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) := hResp' + _ = sigmaCorrectedResponse U a p - vecDot p q + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose (kappaCoarse U a)) + (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p))) := by + rw [sigmaCorrectedResponse] + ring + _ = sigmaCorrectedResponse U a p - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p)) := by + rw [hShift, hCorr] + ring + +theorem magic_identity_responseJ_completed_square_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + magic_identity_sigmaCorrectedResponse_of_isSigmaCoarse U a hS hK hSigma hdet p] using + magic_identity_responseJ_completed_square_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem magic_identity_responseJ_shifted_square_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar - kappa) p)) := by + have hResp := + magic_identity_responseJ_completed_square_of_isSigmaCoarse + U a hS hK hSigma hdet p q + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hAdd : + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) + + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simpa using magic_half_vecDot_add_of_isSymm hSInvSymm q (matVecMul kappa p) + have hShift : + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar - kappa) p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p)) + + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p)) := by + simpa using + magic_half_vecDot_sub_of_isSymm hSInvSymm q (matVecMul (sigmaStar - kappa) p) + have hInvMul : matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p) = p := by + rw [matVecMul_mul, Matrix.nonsing_inv_mul sigmaStar hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hNegK : matVecMul (-kappa) p = -matVecMul kappa p := by + rw [neg_matVecMul] + have hInvShift : + matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p) = + p - matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + calc + matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p) + = matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p) - + matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + rw [sub_eq_add_neg, add_matVecMul, hNegK] + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg] + _ = p - matVecMul sigmaStar⁻¹ (matVecMul kappa p) := by + simpa [sub_eq_add_neg] using congrArg (fun v => v - matVecMul sigmaStar⁻¹ (matVecMul kappa p)) hInvMul + have hCross : + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p)) = + vecDot p q - vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + rw [hInvShift] + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, vecDot_comm] + have hKsym : + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) = + vecDot p (matVecMul kappa p) := by + have ht : + vecDot p (matVecMul (matTranspose kappa) p) = + vecDot p (matVecMul kappa p) := by + calc + vecDot p (matVecMul (matTranspose kappa) p) = + vecDot (matVecMul kappa p) p := by + rw [vecDot_matVecMul_transpose] + _ = vecDot p (matVecMul kappa p) := by + rw [vecDot_comm] + rw [add_matVecMul, vecDot_add_right, ht] + ring + have hTailSigma : + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) = + vecDot p (matVecMul sigmaStar p) := by + rw [hInvMul, vecDot_comm] + have hTailCross : + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot p (matVecMul kappa p) := by + calc + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) := by + rw [magic_vecDot_matVecMul_comm_of_isSymm hSInvSymm + (matVecMul sigmaStar p) (matVecMul kappa p)] + _ = vecDot (matVecMul kappa p) p := by + rw [hInvMul] + _ = vecDot p (matVecMul kappa p) := by + rw [vecDot_comm] + have hTailCorr : + vecDot (matVecMul kappa p) (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + symm + exact vecDot_matVecMul_transpose p + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) kappa + have hTail : + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigmaStar p) - + vecDot p (matVecMul kappa p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + calc + (1 / 2 : ℝ) * vecDot (matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (matVecMul (sigmaStar - kappa) p)) = + (1 / 2 : ℝ) * vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar p)) - + vecDot (matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simpa [sub_eq_add_neg, add_matVecMul, hNegK] using + magic_half_vecDot_sub_of_isSymm hSInvSymm + (matVecMul sigmaStar p) (matVecMul kappa p) + _ = (1 / 2 : ℝ) * vecDot p (matVecMul sigmaStar p) - + vecDot p (matVecMul kappa p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + rw [hTailSigma, hTailCross, hTailCorr] + have hMagic : + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar - kappa) p)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) := by + have hNegSigma : + vecDot p (matVecMul (-sigmaStar) p) = -vecDot p (matVecMul sigmaStar p) := by + rw [neg_matVecMul, vecDot_neg_right] + rw [hAdd, hShift, hCross, hKsym, hTail, ← hTailCorr] + rw [sub_eq_add_neg, add_matVecMul, vecDot_add_right, hNegSigma] + ring_nf + calc + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) := hResp + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar - kappa) p)) := by + symm + exact hMagic + +theorem magic_identity_responseJ_shifted_square_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_shifted_square_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem magic_identity_responseJ_adjoint_completed_square_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hK : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigma : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q (adjointCoeffField a) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + simpa [sub_eq_add_neg, neg_matVecMul] using + magic_identity_responseJ_completed_square_of_isSigmaCoarse + U (adjointCoeffField a) hS hK hSigma hdet p q + +theorem magic_identity_responseJ_adjoint_shifted_square_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hK : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigma : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q (adjointCoeffField a) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + calc + ResponseJ U p q (adjointCoeffField a) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + exact magic_identity_responseJ_adjoint_completed_square_of_isSigmaCoarse + U a hS hK hSigma hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (magic_adjoint_shifted_square_eq_completed_square + (sigma := sigma) (sigmaStar := sigmaStar) (kappa := kappa) hSInvSymm hdet p q) + +theorem magic_identity_responseJ_adjoint_sum_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p q h : Vec d) : + ResponseJ U p (q - h) a + ResponseJ U p (q + h) (adjointCoeffField a) = + vecDot p (matVecMul (sigma - sigmaStar) p) + + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) + + vecDot (h - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (h - matVecMul kappa p)) := by + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hResp := + magic_identity_responseJ_shifted_square_of_isSigmaCoarse + U a hS hK hSigma hdet p (q - h) + have hAdj := + magic_identity_responseJ_adjoint_shifted_square_of_isSigmaCoarse + U a hSAdj hKAdj hSigmaAdj hdet p (q + h) + have hSquare : + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p))) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p))) = + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) + + vecDot (h - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (h - matVecMul kappa p)) := by + simpa using magic_half_vecDot_sub_add_of_isSymm hSInvSymm + (q - matVecMul sigmaStar p) (h - matVecMul kappa p) + have hSub : + q - h - matVecMul (sigmaStar - kappa) p = + (q - matVecMul sigmaStar p) - (h - matVecMul kappa p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, add_assoc, add_left_comm, add_comm] + have hAdd : + q + h - matVecMul (sigmaStar + kappa) p = + (q - matVecMul sigmaStar p) + (h - matVecMul kappa p) := by + simp [sub_eq_add_neg, add_matVecMul, add_assoc, add_left_comm, add_comm] + have hResp' : + ResponseJ U p (q - h) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p))) := by + simpa [hSub] using hResp + have hAdj' : + ResponseJ U p (q + h) (adjointCoeffField a) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p))) := by + simpa [hAdd] using hAdj + linarith [hResp', hAdj', hSquare] + +theorem magic_identity_responseJ_adjoint_sum_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p q h : Vec d) : + ResponseJ U p (q - h) a + ResponseJ U p (q + h) (adjointCoeffField a) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (h - matVecMul (kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_adjoint_sum_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p q h + +theorem magic_identity_responseJ_adjoint_diagonal_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStar - kappa) p) a + + ResponseJ U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) = + vecDot p (matVecMul (sigma - sigmaStar) p) := by + simpa [sub_eq_add_neg, add_matVecMul, neg_matVecMul, matVecMul_neg, + vecDot_zero_left, vecDot_zero_right, matVecMul_zero, add_assoc] using + magic_identity_responseJ_adjoint_sum_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p (matVecMul sigmaStar p) + (matVecMul kappa p) + +theorem magic_identity_responseJ_adjoint_diagonal_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a + + ResponseJ U p + (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (adjointCoeffField a) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_adjoint_diagonal_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + +theorem magic_identity_responseJ_sigmaStar_sub_kappa_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStar - kappa) p) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) := by + simpa [sub_eq_add_neg, add_matVecMul, neg_matVecMul, matVecMul_neg, + vecDot_zero_left, vecDot_zero_right, matVecMul_zero, add_assoc] using + magic_identity_responseJ_shifted_square_of_isSigmaCoarse + U a hS hK hSigma hdet p (matVecMul (sigmaStar - kappa) p) + +theorem magic_identity_responseJ_sigmaStar_sub_kappa_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_sigmaStar_sub_kappa_of_isSigmaCoarse + U a hS hK hSigma hdet p + +theorem magic_identity_responseJ_adjoint_sigmaStar_add_kappa_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) := by + simpa [sub_eq_add_neg, add_matVecMul, neg_matVecMul, matVecMul_neg, + vecDot_zero_left, vecDot_zero_right, matVecMul_zero, add_assoc] using + magic_identity_responseJ_adjoint_shifted_square_of_isSigmaCoarse + U a hSAdj hKAdj hSigmaAdj hdet p (matVecMul (sigmaStar + kappa) p) + +theorem sigmaStar_le_sigma_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul sigmaStar p) ≤ vecDot p (matVecMul sigma p) := by + have hdiag := + magic_identity_responseJ_adjoint_diagonal_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + have hResp : + 0 ≤ ResponseJ U p (matVecMul (sigmaStar - kappa) p) a := + responseJ_nonneg U p (matVecMul (sigmaStar - kappa) p) a + have hAdj : + 0 ≤ ResponseJ U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) := + responseJ_nonneg U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) + have hDef : + vecDot p (matVecMul (sigma - sigmaStar) p) = + vecDot p (matVecMul sigma p) - vecDot p (matVecMul sigmaStar p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, vecDot_neg_right] + linarith + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + sigmaStar_le_sigma_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + +theorem kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := by + have hResp : + 0 ≤ ResponseJ U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) := + responseJ_nonneg U p (matVecMul (sigmaStar + kappa) p) (adjointCoeffField a) + have hSpecial := + magic_identity_responseJ_adjoint_sigmaStar_add_kappa_of_isSigmaCoarse + U a hSAdj hKAdj hSigmaAdj hdet p + linarith + +theorem neg_kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + -vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := by + have hResp : + 0 ≤ ResponseJ U p (matVecMul (sigmaStar - kappa) p) a := + responseJ_nonneg U p (matVecMul (sigmaStar - kappa) p) a + have hSpecial := + magic_identity_responseJ_sigmaStar_sub_kappa_of_isSigmaCoarse + U a hS hK hSigma hdet p + linarith + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse + U a hSAdj hKAdj hSigmaAdj hdet p + +theorem neg_kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + -vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + neg_kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse + U a hS hK hSigma hdet p + +theorem basic_cg_identities_coarse_graining_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |volumeAverage U + (fun x => vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := by + have hlin := + basic_cg_identities_linear_response_of_isResponseMaximizer + U a hEll p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) hInt u hmax w + have hJspecial := + magic_identity_responseJ_sigmaStar_sub_kappa_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p + have hkappa := + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse + U a hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + have hbound : + ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + linarith + have hsqrt : + Real.sqrt (2 * ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a) ≤ + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := by + apply Real.sqrt_le_sqrt + nlinarith + have hmul : + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt + (2 * ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a) ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := by + exact mul_le_mul_of_nonneg_left hsqrt (Real.sqrt_nonneg _) + exact le_trans hlin hmul + +theorem basic_cg_identities_coarse_graining_canonical_of_isSigmaCoarse_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |volumeAverage U + (fun x => vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := + basic_cg_identities_coarse_graining_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u hmax w + +theorem basic_cg_identities_coarse_graining_average_pairing_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) - + vecDot p + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := by + let avgGrad : Vec d := fun i => volumeAverage U (fun x => w.toH1.grad x i) + let avgFlux : Vec d := fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i) + have hcg := + basic_cg_identities_coarse_graining_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p hInt u hmax w + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + U a p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) hInt w + have hStarSymm : (sigmaStarCoarse U a).IsSymm := by + have hInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + unfold sigmaStarCoarse + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + exact isSymm_nonsingInv hInvSymm + have hStarEq : matTranspose (sigmaStarCoarse U a) = sigmaStarCoarse U a := by + simpa [matTranspose] using hStarSymm.eq + have hgradEq : + vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) avgGrad = + vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) avgGrad) := by + unfold avgGrad aStarCoarse + calc + vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) avgGrad = + vecDot p (matVecMul (matTranspose (sigmaStarCoarse U a - kappaCoarse U a)) avgGrad) := by + rw [vecDot_matVecMul_transpose] + _ = vecDot p + (matVecMul (matTranspose (sigmaStarCoarse U a) - matTranspose (kappaCoarse U a)) avgGrad) := by + simp [matTranspose, Matrix.transpose_sub] + _ = vecDot p + (matVecMul (sigmaStarCoarse U a - matTranspose (kappaCoarse U a)) avgGrad) := by + rw [hStarEq] + _ = vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) avgGrad) := by + rfl + have hrewrite : + volumeAverage U + (fun x => vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) avgGrad) - + vecDot p avgFlux := by + calc + volumeAverage U + (fun x => vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + vecDot (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) avgGrad - + vecDot p avgFlux := by + simpa [avgGrad, avgFlux] using hpair + _ = vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) avgGrad) - + vecDot p avgFlux := by + rw [hgradEq] + rw [hrewrite] at hcg + simpa [avgGrad, avgFlux] using hcg + +theorem + basic_cg_identities_coarse_graining_average_pairing_canonical_of_isSigmaCoarse_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) - + vecDot p + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := + basic_cg_identities_coarse_graining_average_pairing_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u hmax w + +theorem basic_cg_identities_coarse_graining_average_difference_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) + (fun i => volumeAverage U (fun x => w.toH1.grad x i)) - + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := by + simpa [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] using + basic_cg_identities_coarse_graining_average_pairing_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p hInt u hmax w + +theorem + basic_cg_identities_coarse_graining_average_difference_canonical_of_isSigmaCoarse_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hSAdj : IsSigmaStarCoarse U (adjointCoeffField a) sigmaStar) + (hKAdj : IsKappaCoarse U (adjointCoeffField a) sigmaStar (-kappa)) + (hSigmaAdj : IsSigmaCoarse U (adjointCoeffField a) sigma sigmaStar (-kappa)) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p + (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a u) + (w : AHarmonicFunction a U) : + |vecDot p + (matVecMul (aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a)) + (fun i => volumeAverage U (fun x => w.toH1.grad x i)) - + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p)) := + basic_cg_identities_coarse_graining_average_difference_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hSAdj hKAdj hSigmaAdj hdet p + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u hmax w + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/BlockSubadditivity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/BlockSubadditivity.lean new file mode 100644 index 0000000000..44f5a71765 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/BlockSubadditivity.lean @@ -0,0 +1,711 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics + +/-! # Block Subadditivity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Block-matrix and response-side subadditivity packages. +-/ + +theorem magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_slice_formulas {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hRespUpper : + ∀ p : Vec d, + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix U a).upperLeft p)) + (hRespMixed : + ∀ p q : Vec d, + ResponseJ U p q a - ResponseJ U p 0 a - ResponseJ U 0 q a + vecDot p q = + -vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p)) + (hRespLower : + ∀ q : Vec d, + ResponseJ U 0 q a = + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix U a).lowerRight q)) + (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix hex + calc + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + linarith [hRespUpper p, hRespMixed p q, hRespLower q] + _ = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + linarith [magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat hAc.1 p q] + +theorem magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix + ⟨deterministicCoarseBlockMatrix U a, hA⟩ + calc + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + exact basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + _ = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + linarith [magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat hAc.1 p q] + +private theorem coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) : + coarseBlockMatrix (cubeSet Q) a = coarseBlockMatrix (openCubeSet Q) a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using! cubeSet_eq_translateSet_originCube_of_triadicCube Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using! openCubeSet_eq_translateSet_originCube_of_triadicCube Q + calc + coarseBlockMatrix (cubeSet Q) a + = coarseBlockMatrix (translateSet z (cubeSet (originCube d Q.scale))) a := by + rw [hcube] + _ = coarseBlockMatrix (cubeSet (originCube d Q.scale)) (translateCoeffField z a) := by + exact coarseBlockMatrix_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) a + _ = coarseBlockMatrix (openCubeSet (originCube d Q.scale)) (translateCoeffField z a) := by + exact coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) (a := translateCoeffField z a) + _ = coarseBlockMatrix (translateSet z (openCubeSet (originCube d Q.scale))) a := by + symm + exact coarseBlockMatrix_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) a + _ = coarseBlockMatrix (openCubeSet Q) a := by + rw [hopen] + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_pair_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q))) := by + refine + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_pair_of_responseJ_blockQuadratic + j Q a hEll ?_ ?_ p q + · intro p q + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet Q) a hAQ hSQ hKQ hSigmaQ hdetQ p q + · intro R hR p q + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet R) a hAR hSR hKR hSigmaR hdetR p q + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) X) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + refine + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll ?_ ?_ X + · intro p q + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet Q) a hAQ hSQ hKQ hSigmaQ hdetQ p q + · intro R hR p q + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet R) a hAR hSR hKR hSigmaR hdetR p q + +theorem coarseBlockMatrix_upperLeft_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet Q) a).upperLeft p) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet R) a).upperLeft p)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (p, 0) + +theorem coarseBlockMatrix_lowerRight_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet Q) a).lowerRight q) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet R) a).lowerRight q)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (0, q) + +theorem coarseBlockMatrix_subadditive_openCubeSet_originCube_descendantsAtDepth_pair_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a) (-p, q)) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q))) := by + simpa using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_pair_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc p q + +theorem coarseBlockMatrix_subadditive_openCubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a) X) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + simpa using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + BlockMatLoewnerLE (coarseBlockMatrix (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) X) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + exact + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + _ = (1 / 2 : ℝ) * + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) X) := by + rw [descendantsAverage_smul] + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + +theorem coarseBlockMatrix_subadditive_cubeSet_originCube_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + BlockMatLoewnerLE (coarseBlockMatrix (cubeSet (originCube d n)) a) + (descendantsAverageBlockMat (originCube d n) j (fun R => coarseBlockMatrix (cubeSet R) a)) := by + intro X + simpa [descendantsAverageBlockMat, descendantsAverageMat, + coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube] using + (coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X) + +theorem coarseBlockMatrix_upperLeft_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a).upperLeft p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet R) a).upperLeft p)) := by + simpa using + coarseBlockMatrix_upperLeft_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc p + +theorem coarseBlockMatrix_lowerRight_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a).lowerRight q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet R) a).lowerRight q)) := by + simpa using + coarseBlockMatrix_lowerRight_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc q + +theorem coarseBlockMatrix_subadditive_cubeSet_originCube_descendantsAtDepth_pair_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a) (-p, q)) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (cubeSet R) a) (-p, q))) := by + calc + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a) (-p, q)) + = (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a) (-p, q)) := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube (Q := originCube d n) a] + _ ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q))) := by + exact + coarseBlockMatrix_subadditive_openCubeSet_originCube_descendantsAtDepth_pair_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc p q + _ = descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (cubeSet R) a) (-p, q))) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth (originCube d n) j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [← coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube (Q := R) a] + +theorem coarseBlockMatrix_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a) X) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (cubeSet R) a) X)) := by + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a) X) + = (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d n)) a) X) := by + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube (Q := originCube d n) a] + _ ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + exact + coarseBlockMatrix_subadditive_openCubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + _ = descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (cubeSet R) a) X)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth (originCube d n) j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [← coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube (Q := R) a] + +theorem coarseBlockMatrix_upperLeft_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a).upperLeft p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (cubeSet R) a).upperLeft p)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseBlockMatrix_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (p, 0) + +theorem coarseBlockMatrix_lowerRight_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (cubeSet (originCube d n)) a).lowerRight q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (cubeSet R) a).lowerRight q)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseBlockMatrix_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (0, q) + +theorem coarseStarredBlockMatrixInv_cubeSet_eq_openCubeSet_of_triadicCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) : + coarseStarredBlockMatrixInv (cubeSet Q) a = + coarseStarredBlockMatrixInv (openCubeSet Q) a := by + simp [coarseStarredBlockMatrixInv_eq_blockReflect, + coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) a] + +theorem ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (p q : Vec d) (a : CoeffField d) : + ResponseJ (cubeSet Q) p q a = ResponseJ (openCubeSet Q) p q a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using! cubeSet_eq_translateSet_originCube_of_triadicCube Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using! openCubeSet_eq_translateSet_originCube_of_triadicCube Q + calc + ResponseJ (cubeSet Q) p q a + = ResponseJ (translateSet z (cubeSet (originCube d Q.scale))) p q a := by + rw [hcube] + _ = ResponseJ (cubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) p q (translateCoeffField z a) + _ = ResponseJ (translateSet z (openCubeSet (originCube d Q.scale))) p q a := by + symm + exact ResponseJ_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet Q) p q a := by + rw [hopen] + +theorem isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) {a : CoeffField d} {sigmaStar : Mat d} : + IsSigmaStarCoarse (cubeSet Q) a sigmaStar ↔ + IsSigmaStarCoarse (openCubeSet Q) a sigmaStar := by + constructor + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro q + rw [← ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := 0) (q := q) a] + exact hresp q + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro q + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := 0) (q := q) a] + exact hresp q + +theorem isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) {a : CoeffField d} {sigmaStar kappa : Mat d} : + IsKappaCoarse (cubeSet Q) a sigmaStar kappa ↔ + IsKappaCoarse (openCubeSet Q) a sigmaStar kappa := by + constructor + · intro hK p q + rw [← ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := q) a, + ← ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := 0) a, + ← ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := 0) (q := q) a] + exact hK p q + · intro hK p q + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := q) a, + ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := 0) a, + ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := 0) (q := q) a] + exact hK p q + +theorem isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube {d : ℕ} + [NeZero d] (Q : TriadicCube d) {a : CoeffField d} {sigma sigmaStar kappa : Mat d} : + IsSigmaCoarse (cubeSet Q) a sigma sigmaStar kappa ↔ + IsSigmaCoarse (openCubeSet Q) a sigma sigmaStar kappa := by + constructor + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro p + rw [← ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := 0) a] + exact hresp p + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro p + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (p := p) (q := 0) a] + exact hresp p + +theorem sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse (openCubeSet Q) a sigmaStar) : + sigmaStarInvCoarse (cubeSet Q) a = sigmaStarInvCoarse (openCubeSet Q) a := by + have hSCube : IsSigmaStarCoarse (cubeSet Q) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := Q)).2 hS + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCube, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + +theorem bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (openCubeSet Q) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet Q) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet Q) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a) = + bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a) := by + have hSCube : IsSigmaStarCoarse (cubeSet Q) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := Q)).2 hS + have hKCube : IsKappaCoarse (cubeSet Q) a sigmaStar kappa := + (isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := Q)).2 hK + have hSigmaCube : IsSigmaCoarse (cubeSet Q) a sigma sigmaStar kappa := + (isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := Q)).2 hSigma + rw [sigmaCoarse_eq_of_isSigmaCoarse hSCube hKCube hSigmaCube hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSCube hdet, + eq_kappaCoarse_of_isKappaCoarse hSCube hKCube hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering.lean new file mode 100644 index 0000000000..8c0d9efc2f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.Identities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticWrappers + +/-! +# MuOrdering (aggregate re-export) + +Previously a monolithic module; now split along thematic boundaries into the +files imported above. Shim for backward compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences.lean new file mode 100644 index 0000000000..c16fe121d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.MagicIdentities + +/-! # Elliptic Consequences -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseAveraged.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseAveraged.lean new file mode 100644 index 0000000000..a0ac38d9ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseAveraged.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaLeBCoarse + +/-! # BCoarse Averaged -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- bCoarse averaged-blockmatrix bounds + +`bCoarse_le_average_blockMatrixOfCoeff_upperLeft_…` plus the three +`bCoarse_le_averaged_symmPart_plus_correction_…` wrappers. These reach back to +the Mu/blockEnergy variational lower bound and show the canonical `bCoarse` +matrix is dominated by the volume-average of `(blockMatrixOfCoeff (a x)).upperLeft`, +i.e., the symmetric part plus the (skew⊤ · symm⁻¹ · skew) Schur correction. +-/ + +theorem bCoarse_le_average_blockMatrixOfCoeff_upperLeft_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) : + vecDot p (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) ≤ + volumeAverage U + (fun x => vecDot p (matVecMul ((blockMatrixOfCoeff (a x)).upperLeft) p)) := by + let P : BlockVec d := (p, 0) + let X : BlockState d := + { potential := fun _ => p + flux := fun _ => 0 } + have hX : IsBlockMuAdmissible U P X := by + refine ⟨?_, ?_, ?_, ?_⟩ + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact MeasureTheory.MemLp.zero + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact isPotentialZeroTraceOn_zero (U := U) + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact MeasureTheory.MemLp.zero + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact isSolenoidalZeroNormalTraceOn_zero (U := U) + have hBddBelow : BddBelow (muValueSet U P a) := by + refine ⟨0, ?_⟩ + intro m hm + rcases hm with ⟨Y, hY, rfl⟩ + have hLower : + vecDot P.1 P.2 ≤ blockEnergyAverage U a Y := by + exact + hY.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) + (hY.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll) + hEll + (by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hY.isPotentialZeroTrace)) + (by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU hY.isSolenoidalZeroNormalTrace)) + hvol + have hLower' : 0 ≤ blockEnergyAverage U a Y := by + simpa [P, vecDot_zero_right] using hLower + simpa [blockEnergyAverage] using hLower' + have hMuLe : + Mu U P a ≤ volumeAverage U (blockEnergyDensity a X) := by + unfold Mu + exact csInf_le hBddBelow (muValueSet_mem hX) + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix + ⟨deterministicCoarseBlockMatrix U a, hA⟩ + have hMuEq : + Mu U P a = + (1 / 2 : ℝ) * + vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + calc + Mu U P a = + (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := by + rw [hAc.2 P] + _ = + (1 / 2 : ℝ) * + vecDot p (matVecMul ((coarseBlockMatrix U a).upperLeft) p) := by + simp [P, blockVecDot, matVecMul_zero, vecDot_zero_left] + _ = + (1 / 2 : ℝ) * + vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + rw [coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + simp [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] + have hEnergy : + blockEnergyDensity a X = + fun x => + (1 / 2 : ℝ) * vecDot p (matVecMul ((blockMatrixOfCoeff (a x)).upperLeft) p) := by + funext x + simp [X, blockEnergyDensity, BlockState.eval, blockCoeffField, blockVecDot, blockMatVecMul, + matVecMul_zero, vecDot_zero_left] + rw [hMuEq, hEnergy] at hMuLe + have hAvgHalf : + volumeAverage U (fun x => (1 / 2 : ℝ) * vecDot p (matVecMul ((blockMatrixOfCoeff (a x)).upperLeft) p)) = + (1 / 2 : ℝ) * + volumeAverage U (fun x => vecDot p (matVecMul ((blockMatrixOfCoeff (a x)).upperLeft) p)) := by + simpa [smul_eq_mul] using! + (volumeAverage_smul U (1 / 2 : ℝ) + (fun x => vecDot p (matVecMul ((blockMatrixOfCoeff (a x)).upperLeft) p))) + rw [hAvgHalf] at hMuLe + nlinarith + +theorem bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) : + vecDot p (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) ≤ + volumeAverage U + (fun x => + vecDot p + (matVecMul + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) + p)) := by + simpa [blockMatrixOfCoeff] using + bCoarse_le_average_blockMatrixOfCoeff_upperLeft_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol hA hS hK hSigma hdet p + +theorem bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) ≤ + volumeAverage U + (fun x => + vecDot p + (matVecMul + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) + p)) := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol.ne' hA hS hK hSigma hdet p + +theorem bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) ≤ + volumeAverage U + (fun x => + vecDot p + (matVecMul + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) + p)) := by + exact + bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseCanonical.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseCanonical.lean new file mode 100644 index 0000000000..7b3522b265 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/BCoarseCanonical.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarInvAveraged + +/-! # BCoarse Canonical -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- bCoarse canonical positive-definiteness and `IsUnit` + +The three `bCoarse_canonical_posDef_of_…` wrappers (Sobolev-regular, +`HodgeConverseCriterion`, `IsOpenBoundedConvexDomain`) and the matching +`isUnit_det_bCoarse_canonical_…` wrappers obtained from the positive-definite +plus determinant correspondence. +-/ + +theorem bCoarse_canonical_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).PosDef := by + have hSigmaPos : + (sigmaCoarse U a).PosDef := + sigmaCoarse_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol hA hS hK hSigma hdet + have hCorrPos : + ((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a).PosSemidef := + kappaTranspose_sigmaStarInvCoarse_kappa_posSemidef (U := U) (a := a) hS + simpa [bCoarse, sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] using + hSigmaPos.add_posSemidef hCorrPos + +theorem bCoarse_canonical_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).PosDef := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + bCoarse_canonical_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol.ne' hA hS hK hSigma hdet + +theorem bCoarse_canonical_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).PosDef := by + exact + bCoarse_canonical_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma + +theorem isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + IsUnit + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).det := by + exact + (Matrix.isUnit_iff_isUnit_det + (A := bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))).mp + ((bCoarse_canonical_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol hA hS hK hSigma hdet).isUnit) + +theorem isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + IsUnit + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).det := by + exact + (Matrix.isUnit_iff_isUnit_det + (A := bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))).mp + ((bCoarse_canonical_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hA hS hK hSigma).isUnit) + +theorem isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + IsUnit + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).det := by + exact + isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/MagicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/MagicIdentities.lean new file mode 100644 index 0000000000..9095500b44 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/MagicIdentities.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.OriginCube + +/-! # Magic Identities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- adjoint flipFlux magic identity wrappers + +`Mu (p, -q) (adjointCoeffField a) - vecDot p q` rewritten in +sigma, sigmaStar, kappa form, plus the shifted-square completion and the +canonical-coarse versions. +-/ + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + calc + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + Mu U (p, q) a - vecDot p q := by + simpa [blockVecFlipFlux] using + congrArg (fun m : ℝ => m - vecDot p q) + (Mu_adjointCoeffField_flipFlux U (p, q) a) + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + exact magic_identity_mu_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + calc + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + exact magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + ring + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (magic_adjoint_shifted_square_eq_completed_square + (sigma := sigma) (sigmaStar := sigmaStar) (kappa := kappa) hSInvSymm hdet p q) + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_canonical_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + calc + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + Mu U (p, q) a - vecDot p q := by + simpa [blockVecFlipFlux] using + congrArg (fun m : ℝ => m - vecDot p q) + (Mu_adjointCoeffField_flipFlux U (p, q) a) + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + exact magic_identity_mu_sub_vecDot_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_canonical_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/OriginCube.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/OriginCube.lean new file mode 100644 index 0000000000..412e257747 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/OriginCube.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseCanonical + +/-! # Origin Cube -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- origin-cube specializations + +Origin-cube `openCubeSet` and `cubeSet` specializations of the +`sigmaStarCoarse_le_sigmaCoarse`, `sigmaCoarse_le_bCoarse`, and +`kappaCoarse_add_transpose ≤ sigmaCoarse - sigmaStarCoarse` orderings. +-/ + +theorem sigmaStarCoarse_le_sigmaCoarse_openCubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse (openCubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul (sigmaCoarse (openCubeSet (originCube d n)) a) p) := by + have hvol : 0 < (MeasureTheory.volume (openCubeSet (originCube d n))).toReal := by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n) + have hdet : IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isSobolevRegularDomain + hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d n))) + hvol compat hS + have hMuGe : + ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + intro P + exact + PotentialSolenoidalL2RecoveryData.mu_ge_vecDot_openCubeSet_originCubeOfIsEllipticFieldOn + (R := R) hEll compat P + exact sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := openCubeSet (originCube d n)) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem sigmaStarCoarse_le_sigmaCoarse_cubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (cubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_cubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (cubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (cubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse (cubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul (sigmaCoarse (cubeSet (originCube d n)) a) p) := by + have hdet : IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := cubeSet (originCube d n)) (a := a) R + (isSobolevRegularDomain_cubeSet_originCube_recovery (d := d) n) + hEll + (hodgeConverseCriterion_cubeSet_originCube (d := d) (n := n)) + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n) + compat hS + have hMuGe : + ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu (cubeSet (originCube d n)) P a := by + intro P + exact + PotentialSolenoidalL2RecoveryData.mu_ge_vecDot_cubeSet_originCubeOfIsEllipticFieldOn + (R := R) hEll compat P + exact sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := cubeSet (originCube d n)) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem sigmaCoarse_le_bCoarse_openCubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (sigmaCoarse (openCubeSet (originCube d n)) a) + (bCoarse + (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) := by + exact + sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n)) + compat hS hK hSigma + +theorem sigmaCoarse_le_bCoarse_cubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (cubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_cubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (sigmaCoarse (cubeSet (originCube d n)) a) + (bCoarse + (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a)) := by + exact + sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := cubeSet (originCube d n)) (a := a) R + (isSobolevRegularDomain_cubeSet_originCube_recovery (d := d) n) + hEll + (hodgeConverseCriterion_cubeSet_originCube (d := d) (n := n)) + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n) + compat hS hK hSigma + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_openCubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p + (matVecMul + (kappaCoarse (openCubeSet (originCube d n)) a + + matTranspose (kappaCoarse (openCubeSet (originCube d n)) a)) p) ≤ + vecDot p + (matVecMul + (sigmaCoarse (openCubeSet (originCube d n)) a - + sigmaStarCoarse (openCubeSet (originCube d n)) a) p) := by + have hvol : 0 < (MeasureTheory.volume (openCubeSet (originCube d n))).toReal := by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n) + have hdet : IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isSobolevRegularDomain + hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d n))) + hvol compat hS + have hMuGe : + ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + intro P + exact + PotentialSolenoidalL2RecoveryData.mu_ge_vecDot_openCubeSet_originCubeOfIsEllipticFieldOn + (R := R) hEll compat P + exact + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := openCubeSet (originCube d n)) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_cubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : PotentialSolenoidalL2RecoveryData (cubeSet (originCube d n))) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll (by + rw [volume_cubeSet_toReal] + exact cubeVolume_pos (originCube d n))) + ) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (cubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (cubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p + (matVecMul + (kappaCoarse (cubeSet (originCube d n)) a + + matTranspose (kappaCoarse (cubeSet (originCube d n)) a)) p) ≤ + vecDot p + (matVecMul + (sigmaCoarse (cubeSet (originCube d n)) a - + sigmaStarCoarse (cubeSet (originCube d n)) a) p) := by + have hdet : IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := cubeSet (originCube d n)) (a := a) R + (isSobolevRegularDomain_cubeSet_originCube_recovery (d := d) n) + hEll + (hodgeConverseCriterion_cubeSet_originCube (d := d) (n := n)) + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n) + compat hS + have hMuGe : + ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu (cubeSet (originCube d n)) P a := by + intro P + exact + PotentialSolenoidalL2RecoveryData.mu_ge_vecDot_cubeSet_originCubeOfIsEllipticFieldOn + (R := R) hEll compat P + exact + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := cubeSet (originCube d n)) (a := a) hA hS hK hSigma hdet hMuGe p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaCoarsePosDef.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaCoarsePosDef.lean new file mode 100644 index 0000000000..a767ff3046 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaCoarsePosDef.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarLeSigma + +/-! # Sigma Coarse Pos Def -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- sigmaCoarse positive-definiteness bridges + +The three elliptic-bridge wrappers establishing `(sigmaCoarse U a).PosDef` from +`IsEllipticFieldOn` plus a domain regularity hypothesis +(`IsSobolevRegularDomain`, `HodgeConverseCriterion`, or +`IsOpenBoundedConvexDomain`). +-/ + +theorem sigmaCoarse_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (sigmaCoarse U a).PosDef := by + have hSigmaStarPos : + (sigmaStarCoarse U a).PosDef := + sigmaStarCoarse_posDef_of_isSigmaStarCoarse (U := U) (a := a) hS hdet + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using + (sigmaCoarse_isSymm_of_isSigmaCoarse (U := U) (a := a) hS hK hSigma hdet) + · intro p hp + have hStarPos : + 0 < vecDot p (matVecMul (sigmaStarCoarse U a) p) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + hSigmaStarPos.dotProduct_mulVec_pos hp + have hle := + sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol hA hS hK hSigma hdet p + have hle' : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := hle + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using lt_of_lt_of_le hStarPos hle' + +theorem sigmaCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (sigmaCoarse U a).PosDef := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + sigmaCoarse_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (a := a) hU hEll hvol.ne' hA hS hK hSigma hdet + +theorem sigmaCoarse_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (sigmaCoarse U a).PosDef := by + exact + sigmaCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaLeBCoarse.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaLeBCoarse.lean new file mode 100644 index 0000000000..32b33c1b05 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaLeBCoarse.lean @@ -0,0 +1,134 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaCoarsePosDef + +/-! # Sigma Le BCoarse -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- sigma ≤ bCoarse and Loewner orderings + +`kappaTranspose_sigmaStarInvCoarse_kappa_posSemidef`, the abstract +`sigma_le_bCoarse_of_isSigmaStarCoarse` Loewner ordering, and the canonical +`sigmaCoarse ≤ bCoarse` bridges via `IsSigmaCoarse`, `IsEllipticFieldOn` plus +`HodgeConverseCriterion`, and `IsOpenBoundedConvexDomain`. +-/ + +theorem kappaTranspose_sigmaStarInvCoarse_kappa_posSemidef {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + ((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a).PosSemidef := by + have hSigmaStarInv : + (sigmaStarInvCoarse U a).PosSemidef := + sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse_local (U := U) (a := a) hS + simpa [matTranspose] using + hSigmaStarInv.conjTranspose_mul_mul_same (kappaCoarse U a) + +theorem sigma_le_bCoarse_of_isSigmaStarCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + MatLoewnerLE sigma (bCoarse sigma sigmaStar kappa) := by + have hSigmaStarInv : + sigmaStar⁻¹.PosSemidef := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using + sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse_local (U := U) (a := a) hS + have hCorr : + ((matTranspose kappa) * sigmaStar⁻¹ * kappa).PosSemidef := by + simpa [matTranspose] using hSigmaStarInv.conjTranspose_mul_mul_same kappa + intro p + have hCorrNonneg : + 0 ≤ vecDot p (matVecMul (((matTranspose kappa) * sigmaStar⁻¹ * kappa)) p) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hCorr.dotProduct_mulVec_nonneg p + have hExpand : + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (((matTranspose kappa) * sigmaStar⁻¹ * kappa)) p) := by + calc + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) + = + (1 / 2 : ℝ) * + (vecDot p (matVecMul sigma p) + + vecDot p (matVecMul (((matTranspose kappa) * sigmaStar⁻¹ * kappa)) p)) := by + simp [bCoarse, add_matVecMul, vecDot_add_right] + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (((matTranspose kappa) * sigmaStar⁻¹ * kappa)) p) := by + ring + rw [hExpand] + nlinarith + +theorem sigmaCoarse_le_bCoarse_of_isSigmaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + MatLoewnerLE (sigmaCoarse U a) + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using + sigma_le_bCoarse_of_isSigmaStarCoarse + (U := U) (a := a) (sigma := sigma) (sigmaStar := sigmaStar) (kappa := kappa) hS + +theorem sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE (sigmaCoarse U a) + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact sigmaCoarse_le_bCoarse_of_isSigmaCoarse + (U := U) (a := a) hS hK hSigma hdet + +theorem sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE (sigmaCoarse U a) + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) := by + exact + sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarInvAveraged.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarInvAveraged.lean new file mode 100644 index 0000000000..4e21883947 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarInvAveraged.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.BCoarseAveraged + +/-! # Sigma Star Inv Averaged -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- sigmaStarInvCoarse averaged-blockmatrix bounds + +`sigmaStarInvCoarse_le_average_blockMatrixOfCoeff_lowerRight_…` and the two +elliptic-bridge wrappers establishing the harmonic-mean-style upper bound +`sigmaStarInvCoarse U a ≤ volumeAverage U (symmPart (a x))⁻¹` under +`HodgeConverseCriterion` / `IsOpenBoundedConvexDomain`. +-/ + +theorem sigmaStarInvCoarse_le_average_blockMatrixOfCoeff_lowerRight_of_mu_zero_right_eq_responseJ_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) + (q : Vec d) : + vecDot q (matVecMul (sigmaStarInvCoarse U a) q) ≤ + volumeAverage U + (fun x => vecDot q (matVecMul ((blockMatrixOfCoeff (a x)).lowerRight) q)) := by + let P : BlockVec d := (0, q) + let X : BlockState d := + { potential := fun _ => 0 + flux := fun _ => q } + have hX : IsBlockMuAdmissible U P X := by + refine ⟨?_, ?_, ?_, ?_⟩ + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact MeasureTheory.MemLp.zero + · have hzero : (fun x => X.potential x - P.1) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact isPotentialZeroTraceOn_zero (U := U) + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact MeasureTheory.MemLp.zero + · have hzero : (fun x => X.flux x - P.2) = (0 : Vec d → Vec d) := by + funext x + simp [X, P] + rw [hzero] + exact isSolenoidalZeroNormalTraceOn_zero (U := U) + have hBddBelow : BddBelow (muValueSet U P a) := by + refine ⟨0, ?_⟩ + intro m hm + rcases hm with ⟨Y, hY, rfl⟩ + have hLower : + vecDot P.1 P.2 ≤ blockEnergyAverage U a Y := by + exact + hY.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) + (hY.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll) + hEll + (by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hY.isPotentialZeroTrace)) + (by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU hY.isSolenoidalZeroNormalTrace)) + hvol + have hLower' : 0 ≤ blockEnergyAverage U a Y := by + simpa [P, vecDot_zero_left] using hLower + simpa [blockEnergyAverage] using hLower' + have hMuLe : + Mu U P a ≤ volumeAverage U (blockEnergyDensity a X) := by + unfold Mu + exact csInf_le hBddBelow (muValueSet_mem hX) + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix hex + have hMuEq : + Mu U P a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + calc + Mu U P a = + (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := by + rw [hAc.2 P] + _ = + (1 / 2 : ℝ) * + vecDot q (matVecMul ((coarseBlockMatrix U a).lowerRight) q) := by + simp [P, blockVecDot, matVecMul_zero, vecDot_zero_left] + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + rw [coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuResp] + have hEnergy : + blockEnergyDensity a X = + fun x => + (1 / 2 : ℝ) * vecDot q (matVecMul ((blockMatrixOfCoeff (a x)).lowerRight) q) := by + funext x + simp [X, blockEnergyDensity, BlockState.eval, blockCoeffField, blockVecDot, blockMatVecMul, + matVecMul_zero, vecDot_zero_left] + rw [hMuEq, hEnergy] at hMuLe + have hAvgHalf : + volumeAverage U (fun x => (1 / 2 : ℝ) * vecDot q (matVecMul ((blockMatrixOfCoeff (a x)).lowerRight) q)) = + (1 / 2 : ℝ) * + volumeAverage U (fun x => vecDot q (matVecMul ((blockMatrixOfCoeff (a x)).lowerRight) q)) := by + simpa [smul_eq_mul] using! + (volumeAverage_smul U (1 / 2 : ℝ) + (fun x => vecDot q (matVecMul ((blockMatrixOfCoeff (a x)).lowerRight) q))) + rw [hAvgHalf] at hMuLe + nlinarith + +theorem sigmaStarInvCoarse_le_averaged_symmPart_inv_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (q : Vec d) : + vecDot q (matVecMul (sigmaStarInvCoarse U a) q) ≤ + volumeAverage U + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) := by + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + let Rc : MuCorrectionSpaceRecoveryData U := R.toMuCorrectionSpaceRecoveryData + have hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + R.exists_coarseBlockMatrixOfIsEllipticFieldOn hEll hvol compat + have hMuResp : + ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a := by + intro q + exact + Rc.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol.ne' compat.mu_eq_muCandidate q + simpa [blockMatrixOfCoeff] using + sigmaStarInvCoarse_le_average_blockMatrixOfCoeff_lowerRight_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hU hEll hex hvol.ne' hMuResp q + +theorem sigmaStarInvCoarse_le_averaged_symmPart_inv_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (q : Vec d) : + vecDot q (matVecMul (sigmaStarInvCoarse U a) q) ≤ + volumeAverage U + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) := by + exact + sigmaStarInvCoarse_le_averaged_symmPart_inv_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat q + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarLeSigma.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarLeSigma.lean new file mode 100644 index 0000000000..09a04d783e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarLeSigma.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarPosDef + +/-! # Sigma Star Le Sigma -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- sigmaStarCoarse ≤ sigmaCoarse bridges + +The three elliptic-bridge wrappers establishing `sigmaStarCoarse U a ≤ +sigmaCoarse U a` from `IsEllipticFieldOn` plus a domain regularity hypothesis +(`HodgeConverseCriterion`, `IsOpenBoundedConvexDomain`, or +`IsSobolevRegularDomain`). +-/ + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact + IsBlockMuAdmissible.mu_ge_vecDot_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (P := P) (a := a) hU hEll hvol.ne' + exact sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + exact + sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact + IsBlockMuAdmissible.mu_ge_vecDot_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := U) (P := P) (a := a) hU hEll hvol + exact sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarPosDef.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarPosDef.lean new file mode 100644 index 0000000000..bcd8be716a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticConsequences/SigmaStarPosDef.lean @@ -0,0 +1,469 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.Identities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge + +/-! # Sigma Star Pos Def -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +private theorem volumeAverage_le_volumeAverage_of_le_on_local + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f g : Vec d → ℝ} + (hU : MeasurableSet U) + (hf : MeasureTheory.IntegrableOn f U) + (hg : MeasureTheory.IntegrableOn g U) + (hfg : ∀ x ∈ U, f x ≤ g x) : + volumeAverage U f ≤ volumeAverage U g := by + have hnonneg : + 0 ≤ volumeAverage U (fun x => g x - f x) := by + apply volumeAverage_nonneg_of_nonneg_on hU + intro x hx + exact sub_nonneg.mpr (hfg x hx) + have hsub : + volumeAverage U (fun x => g x - f x) = + volumeAverage U g - volumeAverage U f := by + simpa using! (volumeAverage_sub hg hf : volumeAverage U (g - f) = _) + linarith + +private theorem vecNormSq_volumeAverage_le_volumeAverage_vecNormSq_local + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + vecNormSq (fun i => volumeAverage U (fun x => f x i)) ≤ + volumeAverage U (fun x => vecNormSq (f x)) := by + let avg : Vec d := fun i => volumeAverage U (fun x => f x i) + have hcoord : ∀ i, MeasureTheory.IntegrableOn (fun x => f x i) U := by + intro i + simpa [vecDot, Pi.single_apply] using + (integrableOn_vecDot_of_memVectorL2 hf + (memVectorL2_const (U := U) (Pi.single i 1))) + have hdotInt : MeasureTheory.IntegrableOn (fun x => vecDot (f x) avg) U := by + exact integrableOn_vecDot_of_memVectorL2 hf (memVectorL2_const (U := U) avg) + have hsqInt : MeasureTheory.IntegrableOn (fun x => vecNormSq (f x)) U := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hf hf + have hhalfInt : + MeasureTheory.IntegrableOn ((1 / 2 : ℝ) • fun x => vecNormSq (f x)) U := by + simpa [smul_eq_mul] using! hsqInt.integrable.smul (1 / 2 : ℝ) + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) U := by + exact MeasureTheory.integrable_const _ + have havgDot : + volumeAverage U (fun x => vecDot (f x) avg) = vecNormSq avg := by + calc + volumeAverage U (fun x => vecDot (f x) avg) + = vecDot (fun i => volumeAverage U (fun x => f x i)) avg := by + exact volumeAverage_vecDot_right f avg hcoord + _ = vecNormSq avg := by + simp [avg, vecNormSq] + have hnonneg : + ∀ x ∈ U, + 0 ≤ (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + (1 / 2 : ℝ) * vecNormSq avg := by + intro x hx + have hsq : 0 ≤ vecNormSq (f x - avg) := vecNormSq_nonneg (f x - avg) + have hident : + (1 / 2 : ℝ) * vecNormSq (f x - avg) = + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + (1 / 2 : ℝ) * vecNormSq avg := by + rw [show f x - avg = f x + (-avg) by simp [sub_eq_add_neg]] + simp [vecNormSq, vecDot_add_right, vecDot_neg_right, vecDot_comm] + ring_nf + nlinarith [hsq, hident] + have havgNonneg : + 0 ≤ + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) := by + exact volumeAverage_nonneg_of_nonneg_on hU hnonneg + have havgExpand : + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) = + (1 / 2 : ℝ) * volumeAverage U (fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + (1 / 2 : ℝ) * vecNormSq avg := by + have hsubInt : + MeasureTheory.IntegrableOn + (((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) U := by + exact hhalfInt.sub hdotInt + have hfun : + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) = + ((((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + funext x + simp [smul_eq_mul, sub_eq_add_neg, add_assoc] + calc + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) + = + volumeAverage U + ((((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [hfun] + _ = + volumeAverage U + (((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + volumeAverage U (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [volumeAverage_add hsubInt hconstInt] + _ = + volumeAverage U ((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + volumeAverage U (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [volumeAverage_sub hhalfInt hdotInt] + _ = + (1 / 2 : ℝ) * volumeAverage U (fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + (1 / 2 : ℝ) * vecNormSq avg := by + rw [volumeAverage_smul, volumeAverage_const hvol] + nlinarith [havgNonneg, havgExpand, havgDot] + +/-! +# MuOrdering -- sigmaStar / sigmaStarInv positive-definiteness wrappers + +Positive-definiteness lemmas for `sigmaStarInvCoarse` and `sigmaStarCoarse` +under `IsSigmaStarCoarse`, the elliptic field plus `HodgeConverseCriterion` / +`IsOpenBoundedConvexDomain` bridges, and the corresponding `IsUnit` / +determinant wrappers. +-/ + +theorem sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (sigmaStarInvCoarse U a).PosDef := by + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + let Rc : MuCorrectionSpaceRecoveryData U := R.toMuCorrectionSpaceRecoveryData + have hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + R.exists_coarseBlockMatrixOfIsEllipticFieldOn hEll hvol compat + have hMuResp : + ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a := by + intro q + exact + Rc.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol.ne' compat.mu_eq_muCandidate q + have hSInvLower : + IsSigmaStarInvCoarse U a (coarseBlockMatrix U a).lowerRight := by + exact + isSigmaStarInvCoarse_coarseBlockMatrix_lowerRight_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuResp + have hSInv : + IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) := by + exact isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨(coarseBlockMatrix U a).lowerRight, hSInvLower⟩ + have hlam_pos : 0 < lam := + MuCoeffOperatorData.lam_pos_of_isEllipticFieldOn (U := U) (a := a) hEll hvol + have hden_pos : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + have hcoeff_half_pos : 0 < lam / (2 * (1 + 2 * Lam ^ 2)) := by + have hden2_pos : 0 < 2 * (1 + 2 * Lam ^ 2) := by positivity + exact div_pos hlam_pos hden2_pos + have hcoeff_half_nonneg : 0 ≤ lam / (2 * (1 + 2 * Lam ^ 2)) := by + positivity + have hquad_pos : + ∀ q : Vec d, q ≠ 0 → 0 < vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + intro q hq + let Xq : BlockState d := Rc.recoveredField system (0, q) + have hAdm : IsBlockMuAdmissible U (0, q) Xq := by + simpa [Xq] using Rc.recoveredField_admissible system (0, q) + have hFluxDiff : MemVectorL2 U (fun x => Xq.flux x - q) := + hAdm.fluxCorrection_memL2 + have hFlux : MemVectorL2 U Xq.flux := by + have hconst : MemVectorL2 U (fun _ : Vec d => q) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := q) + have hsum : + MemVectorL2 U ((fun x => Xq.flux x - q) + fun _ : Vec d => q) := + hFluxDiff.add hconst + have hEq : ((fun x => Xq.flux x - q) + fun _ : Vec d => q) = Xq.flux := by + funext x + simp [Xq, sub_eq_add_neg, add_comm] + rw [hEq] at hsum + exact hsum + have hFluxSqInt : MeasureTheory.IntegrableOn (fun x => vecNormSq (Xq.flux x)) U := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hFlux hFlux + have hEnergyInt : + MeasureTheory.IntegrableOn (blockEnergyDensity a Xq) U := by + exact blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (Rc.recoveredField_memBlockL2 system (0, q)) hEll + have hFluxAvg : + (fun i => volumeAverage U (fun x => Xq.flux x i)) = q := by + simpa [Xq] using + congrArg Prod.snd + (Rc.recoveredField_average_state_of_isSobolevRegularDomain system hU hvol.ne' (0, q)) + have hJensen : + vecNormSq q ≤ volumeAverage U (fun x => vecNormSq (Xq.flux x)) := by + have hraw := + vecNormSq_volumeAverage_le_volumeAverage_vecNormSq_local + (U := U) + (hU := measurableSet_of_isEllipticFieldOn hEll) + (hvol := hvol.ne') + hFlux + rw [hFluxAvg] at hraw + exact hraw + have hpoint : + ∀ x ∈ U, + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x) ≤ + blockEnergyDensity a Xq x := by + intro x hx + have hcoer := + blockMatrixOfCoeff_coercive_of_isEllipticMatrix (hEll.2 x hx) (Xq.eval x) + have hcoeff_nonneg : 0 ≤ lam / (1 + 2 * Lam ^ 2) := by positivity + have hflux_le_block : + vecNormSq (Xq.flux x) ≤ blockVecDot (Xq.eval x) (Xq.eval x) := by + change vecNormSq (Xq.flux x) ≤ vecNormSq (Xq.potential x) + vecNormSq (Xq.flux x) + exact le_add_of_nonneg_left (vecNormSq_nonneg (Xq.potential x)) + have hflux_scaled : + (lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x) ≤ + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (Xq.eval x) (Xq.eval x) := by + exact mul_le_mul_of_nonneg_left hflux_le_block hcoeff_nonneg + have hcoer' : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (Xq.eval x) (Xq.eval x) ≤ + 2 * blockEnergyDensity a Xq x := by + simpa [blockEnergyDensity, Xq] using! hcoer + have hchain : + (lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x) ≤ + 2 * blockEnergyDensity a Xq x := le_trans hflux_scaled hcoer' + have hhalf := + mul_le_mul_of_nonneg_left hchain (show (0 : ℝ) ≤ 1 / 2 by norm_num) + have hleft : + (1 / 2 : ℝ) * ((lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x)) = + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x) := by + field_simp [hden_pos.ne'] + have hright : + (1 / 2 : ℝ) * (2 * blockEnergyDensity a Xq x) = blockEnergyDensity a Xq x := by + ring + rw [hleft, hright] at hhalf + exact hhalf + have hEnergyLower : + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U (fun x => vecNormSq (Xq.flux x)) ≤ + blockEnergyAverage U a Xq := by + calc + (lam / (2 * (1 + 2 * Lam ^ 2))) * volumeAverage U (fun x => vecNormSq (Xq.flux x)) = + volumeAverage U + (fun x => (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x)) := by + symm + simpa [smul_eq_mul] using! + (volumeAverage_smul U (lam / (2 * (1 + 2 * Lam ^ 2))) + (fun x => vecNormSq (Xq.flux x))) + _ ≤ volumeAverage U (blockEnergyDensity a Xq) := by + exact volumeAverage_le_volumeAverage_of_le_on_local + (U := U) + (hU := measurableSet_of_isEllipticFieldOn hEll) + (hf := by + simpa [smul_eq_mul] using! + hFluxSqInt.smul (lam / (2 * (1 + 2 * Lam ^ 2)))) + (hg := hEnergyInt) + hpoint + _ = blockEnergyAverage U a Xq := rfl + have hEnergyRec : + blockEnergyAverage U a Xq = Mu U (0, q) a := by + simpa [Xq] using + Rc.recoveredField_blockEnergyAverage_eq_mu system compat.mu_eq_muCandidate (0, q) + have hMain : + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q ≤ + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + have hscaledJensen : + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q ≤ + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U (fun x => vecNormSq (Xq.flux x)) := by + exact mul_le_mul_of_nonneg_left hJensen hcoeff_half_nonneg + calc + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q ≤ + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U (fun x => vecNormSq (Xq.flux x)) := hscaledJensen + _ ≤ blockEnergyAverage U a Xq := hEnergyLower + _ = Mu U (0, q) a := hEnergyRec + _ = ResponseJ U 0 q a := hMuResp q + _ = (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := hSInv.2 q + have hqnorm_ne : vecNormSq q ≠ 0 := by + intro hqnorm + exact hq (vecNormSq_eq_zero hqnorm) + have hqnorm_pos : 0 < vecNormSq q := by + exact lt_of_le_of_ne (vecNormSq_nonneg q) (by simpa [eq_comm] using hqnorm_ne) + have hhalf_pos : + 0 < (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := + lt_of_lt_of_le (mul_pos hcoeff_half_pos hqnorm_pos) hMain + nlinarith + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hSInv.1 + · intro q hq + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hquad_pos q hq + +theorem isUnit_det_sigmaStarInvCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + IsUnit (sigmaStarInvCoarse U a).det := by + exact + (Matrix.isUnit_iff_isUnit_det (A := sigmaStarInvCoarse U a)).mp + ((sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat).isUnit) + +theorem isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + IsUnit sigmaStar.det := by + have hInvPos : + (sigmaStarInvCoarse U a).PosDef := + sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat + have hSigmaInvPos : sigmaStar⁻¹.PosDef := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using hInvPos + have hSigmaPos : sigmaStar.PosDef := + (Matrix.posDef_inv_iff (M := sigmaStar)).mp hSigmaInvPos + exact (Matrix.isUnit_iff_isUnit_det (A := sigmaStar)).mp hSigmaPos.isUnit + +theorem sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + (sigmaStarInvCoarse U a).PosDef := + sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat + +theorem isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS + +theorem sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse_local {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + (sigmaStarInvCoarse U a).PosSemidef := by + have hInv : + IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) := + isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨sigmaStar⁻¹, isSigmaStarInvCoarse_of_isSigmaStarCoarse hS⟩ + rcases hInv with ⟨hSymm, hResp⟩ + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hSymm + · intro q + have hRespNonneg : 0 ≤ ResponseJ U 0 q a := responseJ_nonneg U 0 q a + have hQuad : + 0 ≤ vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + nlinarith [hRespNonneg, hResp q] + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hQuad + +theorem sigmaStarInvCoarse_posDef_of_isSigmaStarCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hdet : IsUnit sigmaStar.det) : + (sigmaStarInvCoarse U a).PosDef := by + have hSemidef : + (sigmaStarInvCoarse U a).PosSemidef := + sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse_local (U := U) (a := a) hS + have hInvDet : IsUnit (sigmaStarInvCoarse U a).det := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using + (Matrix.isUnit_nonsing_inv_det (A := sigmaStar) hdet) + have hInvUnit : IsUnit (sigmaStarInvCoarse U a) := + (Matrix.isUnit_iff_isUnit_det (A := sigmaStarInvCoarse U a)).2 hInvDet + exact (Matrix.PosSemidef.posDef_iff_isUnit hSemidef).2 hInvUnit + +theorem sigmaStarCoarse_posDef_of_isSigmaStarCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hdet : IsUnit sigmaStar.det) : + (sigmaStarCoarse U a).PosDef := by + have hInvPos : + (sigmaStarInvCoarse U a).PosDef := + sigmaStarInvCoarse_posDef_of_isSigmaStarCoarse (U := U) (a := a) hS hdet + have hSigmaInvPos : sigmaStar⁻¹.PosDef := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using hInvPos + have hSigmaPos : sigmaStar.PosDef := + (Matrix.posDef_inv_iff (M := sigmaStar)).mp hSigmaInvPos + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] using hSigmaPos + +theorem sigmaStarCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + (sigmaStarCoarse U a).PosDef := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact sigmaStarCoarse_posDef_of_isSigmaStarCoarse (U := U) (a := a) hS hdet + +theorem sigmaStarCoarse_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + (sigmaStarCoarse U a).PosDef := by + exact + sigmaStarCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticWrappers.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticWrappers.lean new file mode 100644 index 0000000000..796c6d2ab6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/EllipticWrappers.lean @@ -0,0 +1,983 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences + +/-! # Elliptic Wrappers -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- elliptic no-`hdet` wrappers for core magic identities + +This file packages the most-used `ResponseJ` and block-quadratic magic +identities, `Mu - p · q` formulas, and canonical ordering consequences under +recovery-plus-ellipticity hypotheses, so downstream users do not need to +thread `IsUnit sigmaStar.det` by hand. +-/ + +private theorem hdet_of_recovery_hodge + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hS + +theorem basic_cg_identities_responseJ_zero_formula_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p + +theorem basic_cg_identities_responseJ_zero_formula_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := + basic_cg_identities_responseJ_zero_formula_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma p + +theorem basic_cg_identities_responseJ_formula_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) - vecDot p q + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem basic_cg_identities_responseJ_formula_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) - vecDot p q + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := + basic_cg_identities_responseJ_formula_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma p q + +theorem magic_identity_responseJ_completed_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + sigmaCorrectedResponse U a p - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_responseJ_completed_square_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem magic_identity_responseJ_completed_square_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + sigmaCorrectedResponse U a p - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p)) := + magic_identity_responseJ_completed_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma p q + +theorem magic_identity_responseJ_completed_square_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_responseJ_completed_square_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem magic_identity_responseJ_completed_square_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q + matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) := + magic_identity_responseJ_completed_square_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hS hK hSigma p q + +theorem basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := + basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) - + vecDot p q := + magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_block_quadratic_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_block_quadratic_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_block_quadratic_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) := + magic_identity_block_quadratic_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_sub_vecDot_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := + magic_identity_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_mu_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_sub_vecDot_shifted_square_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := + magic_identity_mu_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_responseJ_add_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q h : Vec d) : + ResponseJ U p (q - h) a + (Mu U (p, q + h) a - vecDot p (q + h)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (h - matVecMul (kappaCoarse U a) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_responseJ_add_mu_sub_vecDot_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q h + +theorem magic_identity_responseJ_add_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q h : Vec d) : + ResponseJ U p (q - h) a + (Mu U (p, q + h) a - vecDot p (q + h)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (h - matVecMul (kappaCoarse U a) p)) := + magic_identity_responseJ_add_mu_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q h + +theorem magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a + + (Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + +theorem magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a + + (Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + +theorem magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) := + magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isEllipticFieldOn + (U := U) (a := a) R hU hEll hvol compat hA hS hK hSigma hdet p + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem kappa_add_transpose_le_sigma_sub_sigmaStar_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + kappa_add_transpose_le_sigma_sub_sigmaStar_of_isEllipticFieldOn + (U := U) (a := a) R hU hEll hvol compat hA hS hK hSigma hdet p + +theorem kappa_add_transpose_le_sigma_sub_sigmaStar_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := + kappa_add_transpose_le_sigma_sub_sigmaStar_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem sigmaStar_le_sigma_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul sigmaStar p) ≤ vecDot p (matVecMul sigma p) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + sigmaStar_le_sigma_of_isEllipticFieldOn + (U := U) (a := a) R hU hEll hvol compat hA hS hK hSigma hdet p + +theorem sigmaStar_le_sigma_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul sigmaStar p) ≤ vecDot p (matVecMul sigma p) := + sigmaStar_le_sigma_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +theorem + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := by + have hdet : + IsUnit sigmaStar.det := + hdet_of_recovery_hodge (U := U) (a := a) R hU hEll hHodge hvol compat hS + exact + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + Mu U (p, -q) (adjointCoeffField a) - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := + magic_identity_mu_adjointCoeffField_flipFlux_sub_vecDot_shifted_square_canonical_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma p q + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/HarmonicMean.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/HarmonicMean.lean new file mode 100644 index 0000000000..4259c80906 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/HarmonicMean.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.MatrixOrderBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator + +/-! # Harmonic Mean -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped MatrixOrder + +/-! +# Harmonic-mean matrix bounds + +This file upgrades the inverse-side scalar quadratic estimate +`σ_*^{-1} ≤ average(symmPart(a)^{-1})` to an honest matrix-order statement, +and then inverts it to obtain the note-facing harmonic-mean lower bound for +`σ_*`. +-/ + +/-- Entrywise volume-average of the pointwise inverse symmetric part. -/ +noncomputable def averagedSymmPartInv {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Mat d := + volumeAverageMat U (fun x => (symmPart (a x))⁻¹) + +private theorem integrableOn_symmPartInv_entry_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (i j : Fin d) : + MeasureTheory.IntegrableOn (fun x => (((symmPart (a x))⁻¹ : Mat d) i j)) U := by + classical + let aExt : Vec d → Fin d → Fin d → ℝ := fun x => if x ∈ U then a x else 0 + have haExt : Measurable aExt := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hmeas : Measurable (fun x => if x ∈ U then a x i j else 0) := + (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have hEq : (fun x => aExt x i j) = fun x => if x ∈ U then a x i j else 0 := by + funext x + by_cases hx : x ∈ U <;> simp [aExt, hx] + rw [hEq] + exact hmeas + let sExt : Vec d → Fin d → Fin d → ℝ := fun x => symmPart (aExt x) + have hsExt : Measurable sExt := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [sExt] using measurable_symmPart_entry haExt i j + let coeffExt : Vec d → ℝ := fun x => (((sExt x : Mat d)⁻¹ : Mat d) i j) + have hcoeffExt : Measurable coeffExt := by + simpa [coeffExt] using measurable_matrix_inv_entry hsExt i j + have hfinite : MeasureTheory.volume U ≠ ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ).ne + have hIntExt : MeasureTheory.IntegrableOn coeffExt U := by + refine + MeasureTheory.Measure.integrableOn_of_bounded + (μ := MeasureTheory.volume) (M := lam⁻¹) hfinite hcoeffExt.aestronglyMeasurable ?_ + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [hmem] with x hx + have hbound : + |(((symmPart (a x))⁻¹ : Mat d) i j)| ≤ lam⁻¹ := + abs_apply_symmPartInv_le_of_isEllipticFieldOn hEll hx i j + simpa [coeffExt, sExt, aExt, hx, Real.norm_eq_abs] using hbound + refine hIntExt.congr_fun ?_ (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + simp [coeffExt, sExt, aExt, hx] + +theorem vecDot_matVecMul_averagedSymmPartInv_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (q : Vec d) : + vecDot q (matVecMul (averagedSymmPartInv U a) q) = + volumeAverage U (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) := by + exact + vecDot_matVecMul_volumeAverageMat + (fun i j => integrableOn_symmPartInv_entry_of_isEllipticFieldOn hEll i j) q q + +theorem averagedSymmPartInv_posDef_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + (averagedSymmPartInv U a).PosDef := by + have hSymm : (averagedSymmPartInv U a).IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + apply congrArg (volumeAverage U) + funext x + have hS : Matrix.transpose (symmPart (a x)) = symmPart (a x) := by + simpa [matTranspose] using (matTranspose_symmPart (a x)) + have hT : Matrix.transpose ((symmPart (a x))⁻¹ : Mat d) = ((symmPart (a x))⁻¹ : Mat d) := by + simpa [hS] using (Matrix.transpose_nonsing_inv (A := symmPart (a x))) + simpa [averagedSymmPartInv, volumeAverageMat] using congrArg (fun M => M i j) hT + have hHerm : (averagedSymmPartInv U a).IsHermitian := by + unfold Matrix.IsHermitian + rw [Matrix.conjTranspose_eq_transpose_of_trivial] + exact hSymm + refine Matrix.PosDef.of_dotProduct_mulVec_pos hHerm ?_ + intro q hq + have hvol_ne_zero : MeasureTheory.volume U ≠ 0 := by + intro hzero + have : (MeasureTheory.volume U).toReal = 0 := by simp [hzero] + linarith + obtain ⟨x0, hx0⟩ : + U.Nonempty := MeasureTheory.nonempty_of_measure_ne_zero hvol_ne_zero + rcases hEll.2 x0 hx0 with ⟨hlam_pos, hlamLam, -, -⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam_pos hlamLam + let c : ℝ := lam * (Lam⁻¹ * Lam⁻¹) + have hc_pos : 0 < c := by + dsimp [c] + positivity + have hqNorm_pos : 0 < vecNormSq q := by + have hqNorm_ne : vecNormSq q ≠ 0 := by + simpa [vecNormSq_eq_zero_iff] using hq + exact lt_of_le_of_ne (vecNormSq_nonneg q) (by simpa [eq_comm] using hqNorm_ne) + have hscalarInt : + MeasureTheory.IntegrableOn + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) U := by + exact + integrableOn_vecDot_matVecMul_of_integrableOn_entries + (fun i j => integrableOn_symmPartInv_entry_of_isEllipticFieldOn hEll i j) q q + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => c * vecNormSq q) U := by + exact MeasureTheory.integrable_const _ + have hnonneg : + 0 ≤ + volumeAverage U + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q) - c * vecNormSq q) := by + apply volumeAverage_nonneg_of_nonneg_on (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + have hpoint := lowerBound_symmPartInv_of_isEllipticMatrix (hEll.2 x hx) q + linarith + have hsub : + volumeAverage U + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q) - c * vecNormSq q) = + volumeAverage U (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) - + c * vecNormSq q := by + rw [show + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q) - c * vecNormSq q) = + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) - + fun _ : Vec d => c * vecNormSq q by + funext x + rfl] + rw [volumeAverage_sub hscalarInt hconstInt, volumeAverage_const hvol.ne'] + have hLower : + c * vecNormSq q ≤ + vecDot q (matVecMul (averagedSymmPartInv U a) q) := by + rw [vecDot_matVecMul_averagedSymmPartInv_of_isEllipticFieldOn hEll q] + linarith + have hPos : + 0 < vecDot q (matVecMul (averagedSymmPartInv U a) q) := by + nlinarith + simpa [vecDot, matVecMul] using! hPos + +theorem sigmaStarInvCoarse_le_averagedSymmPartInv_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MatLoewnerLE (sigmaStarInvCoarse U a) (averagedSymmPartInv U a) := by + intro q + rw [vecDot_matVecMul_averagedSymmPartInv_of_isEllipticFieldOn hEll q] + have h := + sigmaStarInvCoarse_le_averaged_symmPart_inv_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat q + nlinarith + +theorem sigmaStarInvCoarse_le_averagedSymmPartInv_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MatLoewnerLE (sigmaStarInvCoarse U a) (averagedSymmPartInv U a) := by + exact + sigmaStarInvCoarse_le_averagedSymmPartInv_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat + +/-- +Note-facing harmonic-mean lower bound +`(average(symmPart(a)^{-1}))^{-1} ≤ σ_*(U; a)`. +-/ +theorem harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MatLoewnerLE ((averagedSymmPartInv U a)⁻¹) (sigmaStarCoarse U a) := by + have hSigmaInvPos : + (sigmaStarInvCoarse U a).PosDef := + sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat + have hAvgPos : + (averagedSymmPartInv U a).PosDef := + averagedSymmPartInv_posDef_of_isEllipticFieldOn (U := U) (a := a) hEll hvol + have hOrder : + MatLoewnerLE (sigmaStarInvCoarse U a) (averagedSymmPartInv U a) := + sigmaStarInvCoarse_le_averagedSymmPartInv_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat + simpa [sigmaStarCoarse] using matLoewnerLE_inv_of_posDef hSigmaInvPos hAvgPos hOrder + +theorem harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MatLoewnerLE ((averagedSymmPartInv U a)⁻¹) (sigmaStarCoarse U a) := by + exact + harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat + +end diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/Identities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/Identities.lean new file mode 100644 index 0000000000..cac8fb7826 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/Identities.lean @@ -0,0 +1,679 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Matrix.Order +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity + +/-! # Identities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# MuOrdering -- magic identities and sigmaStar <= sigma + +The magic-identity theorems (block_quadratic, mu_sub_vecDot, +responseJ_add_mu_sub_vecDot and their shifted-square / canonical / +deterministic variants), sigmaStarCoarse <= sigmaCoarse on origin cubes, +and the kappa_add_transpose / sigmaStar <= sigma / sigmaStarCoarse <= +sigmaCoarse general orderings under isSigmaCoarse + mu_ge_vecDot or +IsEllipticFieldOn. +-/ + +theorem magic_identity_block_quadratic_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix + ⟨deterministicCoarseBlockMatrix U a, hA⟩ + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hShift : + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot (matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simpa using magic_half_vecDot_sub_of_isSymm hSInvSymm q (matVecMul kappa p) + have hCorr : + vecDot (matVecMul kappa p) (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot p + (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + symm + exact vecDot_matVecMul_transpose p + (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) kappa + calc + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa) (p, q)) := by + rw [coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) + + vecDot q (matVecMul (-(sigmaStar⁻¹ * kappa)) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + have hBlock0 : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) + + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := + magic_half_blockVecDot_pos_left_of_isSymmetricBlockMat hAc.1 p q + rw [coarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isCoarseBlockMatrix + hA hS hK hSigma hdet] at hBlock0 + have hBlock : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa) (p, q)) = + (1 / 2 : ℝ) * vecDot q + (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerRight q) + + vecDot q (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperLeft p) := + hBlock0 + simpa [blockMatrixOfDeterministicData] using hBlock + _ = (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + simp [sub_eq_add_neg, matVecMul_mul, neg_matVecMul, vecDot_neg_right] + _ = (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + rw [hShift, hCorr] + unfold bCoarse + rw [add_matVecMul, vecDot_add_right, matVecMul_mul, matVecMul_mul] + ring_nf + simp [Matrix.mul_assoc] + +theorem magic_identity_block_quadratic_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_block_quadratic_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_block_quadratic_deterministicCoarseBlockMatrix_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (deterministicCoarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + rw [← coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact magic_identity_block_quadratic_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_mu_sub_vecDot_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + calc + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (deterministicCoarseBlockMatrix U a) (p, q)) - vecDot p q := by + rw [hA.2 (p, q)] + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + rw [magic_identity_block_quadratic_deterministicCoarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q] + +theorem magic_identity_mu_sub_vecDot_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + have hAc : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix + ⟨deterministicCoarseBlockMatrix U a, hA⟩ + calc + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * blockVecDot (p, q) + (blockMatVecMul (coarseBlockMatrix U a) (p, q)) - vecDot p q := by + rw [hAc.2 (p, q)] + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + rw [magic_identity_block_quadratic_canonical_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q] + +theorem magic_identity_mu_sub_vecDot_shifted_square_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + calc + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) - vecDot p q := by + exact magic_identity_mu_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) - vecDot p q + + (1 / 2 : ℝ) * vecDot (q - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (q - matVecMul kappa p)) := by + ring + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar + kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar + kappa) p)) := by + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (magic_adjoint_shifted_square_eq_completed_square + (sigma := sigma) (sigmaStar := sigmaStar) (kappa := kappa) hSInvSymm hdet p q) + +theorem magic_identity_mu_sub_vecDot_shifted_square_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + Mu U (p, q) a - vecDot p q = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_mu_sub_vecDot_shifted_square_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q + +theorem magic_identity_responseJ_add_mu_sub_vecDot_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q h : Vec d) : + ResponseJ U p (q - h) a + (Mu U (p, q + h) a - vecDot p (q + h)) = + vecDot p (matVecMul (sigma - sigmaStar) p) + + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) + + vecDot (h - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (h - matVecMul kappa p)) := by + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hResp := + magic_identity_responseJ_shifted_square_of_isSigmaCoarse + U a hS hK hSigma hdet p (q - h) + have hMu := + magic_identity_mu_sub_vecDot_shifted_square_of_isSigmaCoarse + U a hA hS hK hSigma hdet p (q + h) + have hSquare : + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p))) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p))) = + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) + + vecDot (h - matVecMul kappa p) + (matVecMul sigmaStar⁻¹ (h - matVecMul kappa p)) := by + simpa using magic_half_vecDot_sub_add_of_isSymm hSInvSymm + (q - matVecMul sigmaStar p) (h - matVecMul kappa p) + have hSub : + q - h - matVecMul (sigmaStar - kappa) p = + (q - matVecMul sigmaStar p) - (h - matVecMul kappa p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, add_assoc, add_left_comm, add_comm] + have hAdd : + q + h - matVecMul (sigmaStar + kappa) p = + (q - matVecMul sigmaStar p) + (h - matVecMul kappa p) := by + simp [sub_eq_add_neg, add_matVecMul, add_assoc, add_left_comm, add_comm] + have hResp' : + ResponseJ U p (q - h) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) - (h - matVecMul kappa p))) := by + simpa [hSub] using hResp + have hMu' : + Mu U (p, q + h) a - vecDot p (q + h) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p)) + (matVecMul sigmaStar⁻¹ + ((q - matVecMul sigmaStar p) + (h - matVecMul kappa p))) := by + simpa [hAdd] using hMu + linarith [hResp', hMu', hSquare] + +theorem magic_identity_responseJ_add_mu_sub_vecDot_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q h : Vec d) : + ResponseJ U p (q - h) a + (Mu U (p, q + h) a - vecDot p (q + h)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) (h - matVecMul (kappaCoarse U a) p)) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_add_mu_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p q h + +theorem magic_identity_responseJ_add_mu_sub_vecDot_diagonal_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStar - kappa) p) a + + (Mu U (p, matVecMul (sigmaStar + kappa) p) a - + vecDot p (matVecMul (sigmaStar + kappa) p)) = + vecDot p (matVecMul (sigma - sigmaStar) p) := by + simpa [sub_eq_add_neg, add_matVecMul, neg_matVecMul, matVecMul_neg, + vecDot_zero_left, vecDot_zero_right, matVecMul_zero, add_assoc] using + magic_identity_responseJ_add_mu_sub_vecDot_of_isSigmaCoarse + U a hA hS hK hSigma hdet p (matVecMul sigmaStar p) (matVecMul kappa p) + +theorem magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) a + + (Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p)) = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + +theorem sigmaStarCoarse_le_sigmaCoarse_openCubeSet_originCube_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (openCubeSet (originCube d n))) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse (openCubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul (sigmaCoarse (openCubeSet (originCube d n)) a) p) := by + have hdiag := + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isSigmaCoarse + (U := openCubeSet (originCube d n)) a hA hS hK hSigma hdet p + have hResp : + 0 ≤ ResponseJ (openCubeSet (originCube d n)) p + (matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a - + kappaCoarse (openCubeSet (originCube d n)) a) p) a := + responseJ_nonneg (openCubeSet (originCube d n)) p + (matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a - + kappaCoarse (openCubeSet (originCube d n)) a) p) a + have hMuGe := + R.mu_ge_vecDot_openCubeSet_originCube system hEll pairingIntegrable mu_eq_muCandidate + (p, matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a + + kappaCoarse (openCubeSet (originCube d n)) a) p) + have hMu : + 0 ≤ Mu (openCubeSet (originCube d n)) + (p, matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a + + kappaCoarse (openCubeSet (originCube d n)) a) p) a - + vecDot p + (matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a + + kappaCoarse (openCubeSet (originCube d n)) a) p) := by + linarith + have hDef : + vecDot p + (matVecMul + (sigmaCoarse (openCubeSet (originCube d n)) a - + sigmaStarCoarse (openCubeSet (originCube d n)) a) p) = + vecDot p (matVecMul (sigmaCoarse (openCubeSet (originCube d n)) a) p) - + vecDot p (matVecMul (sigmaStarCoarse (openCubeSet (originCube d n)) a) p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, vecDot_neg_right] + linarith + +theorem sigmaStarCoarse_le_sigmaCoarse_cubeSet_originCube_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} (a : CoeffField d) {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (cubeSet (originCube d n))) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu (cubeSet (originCube d n)) P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (cubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (cubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse (cubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul (sigmaCoarse (cubeSet (originCube d n)) a) p) := by + have hdiag := + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_canonical_of_isSigmaCoarse + (U := cubeSet (originCube d n)) a hA hS hK hSigma hdet p + have hResp : + 0 ≤ ResponseJ (cubeSet (originCube d n)) p + (matVecMul + (sigmaStarCoarse (cubeSet (originCube d n)) a - + kappaCoarse (cubeSet (originCube d n)) a) p) a := + responseJ_nonneg (cubeSet (originCube d n)) p + (matVecMul + (sigmaStarCoarse (cubeSet (originCube d n)) a - + kappaCoarse (cubeSet (originCube d n)) a) p) a + have hMuGe := + R.mu_ge_vecDot_cubeSet_originCube system hEll pairingIntegrable mu_eq_muCandidate + (p, matVecMul + (sigmaStarCoarse (cubeSet (originCube d n)) a + + kappaCoarse (cubeSet (originCube d n)) a) p) + have hMu : + 0 ≤ Mu (cubeSet (originCube d n)) + (p, matVecMul + (sigmaStarCoarse (cubeSet (originCube d n)) a + + kappaCoarse (cubeSet (originCube d n)) a) p) a - + vecDot p + (matVecMul + (sigmaStarCoarse (cubeSet (originCube d n)) a + + kappaCoarse (cubeSet (originCube d n)) a) p) := by + linarith + have hDef : + vecDot p + (matVecMul + (sigmaCoarse (cubeSet (originCube d n)) a - + sigmaStarCoarse (cubeSet (originCube d n)) a) p) = + vecDot p (matVecMul (sigmaCoarse (cubeSet (originCube d n)) a) p) - + vecDot p (matVecMul (sigmaStarCoarse (cubeSet (originCube d n)) a) p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, vecDot_neg_right] + linarith + +theorem magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + Mu U (p, matVecMul (sigmaStar + kappa) p) a - + vecDot p (matVecMul (sigmaStar + kappa) p) = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) - + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) := by + simpa [sub_eq_add_neg, add_matVecMul, neg_matVecMul, matVecMul_neg, + vecDot_zero_left, vecDot_zero_right, matVecMul_zero, add_assoc] using + magic_identity_mu_sub_vecDot_shifted_square_of_isSigmaCoarse + U a hA hS hK hSigma hdet p (matVecMul (sigmaStar + kappa) p) + +theorem magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + Mu U (p, matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) a - + vecDot p (matVecMul (sigmaStarCoarse U a + kappaCoarse U a) p) = + (1 / 2 : ℝ) * vecDot p + (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) - + (1 / 2 : ℝ) * vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + +theorem kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse_of_mu_ge_vecDot {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a) + (p : Vec d) : + vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := by + have hMuGeP := hMuGe (p, matVecMul (sigmaStar + kappa) p) + have hMu : + 0 ≤ Mu U (p, matVecMul (sigmaStar + kappa) p) a - + vecDot p (matVecMul (sigmaStar + kappa) p) := by + linarith + have hSpecial := + magic_identity_mu_sub_vecDot_sigmaStar_add_kappa_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + linarith + +theorem kappa_add_transpose_le_sigma_sub_sigmaStar_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (kappa + matTranspose kappa) p) ≤ + vecDot p (matVecMul (sigma - sigmaStar) p) := by + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact R.mu_ge_vecDot_of_isEllipticFieldOn hU hEll hvol compat P + exact kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a) + (p : Vec d) : + vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + simpa [eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + kappa_add_transpose_le_sigma_sub_sigmaStar_of_isSigmaCoarse_of_mu_ge_vecDot + U a hA hS hK hSigma hdet hMuGe p + +theorem kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact R.mu_ge_vecDot_of_isEllipticFieldOn hU hEll hvol compat P + exact kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem sigmaStar_le_sigma_of_isSigmaCoarse_of_mu_ge_vecDot {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a) + (p : Vec d) : + vecDot p (matVecMul sigmaStar p) ≤ vecDot p (matVecMul sigma p) := by + have hdiag := + magic_identity_responseJ_add_mu_sub_vecDot_diagonal_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + have hResp : + 0 ≤ ResponseJ U p (matVecMul (sigmaStar - kappa) p) a := + responseJ_nonneg U p (matVecMul (sigmaStar - kappa) p) a + have hMuGeP := hMuGe (p, matVecMul (sigmaStar + kappa) p) + have hMu : + 0 ≤ Mu U (p, matVecMul (sigmaStar + kappa) p) a - + vecDot p (matVecMul (sigmaStar + kappa) p) := by + linarith + have hDef : + vecDot p (matVecMul (sigma - sigmaStar) p) = + vecDot p (matVecMul sigma p) - vecDot p (matVecMul sigmaStar p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, vecDot_neg_right] + linarith + +theorem sigmaStar_le_sigma_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul sigmaStar p) ≤ vecDot p (matVecMul sigma p) := by + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact R.mu_ge_vecDot_of_isEllipticFieldOn hU hEll hvol compat P + exact sigmaStar_le_sigma_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + sigmaStar_le_sigma_of_isSigmaCoarse_of_mu_ge_vecDot + U a hA hS hK hSigma hdet hMuGe p + +theorem sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := by + have hMuGe : ∀ P : BlockVec d, vecDot P.1 P.2 ≤ Mu U P a := by + intro P + exact R.mu_ge_vecDot_of_isEllipticFieldOn hU hEll hvol compat P + exact sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse_of_mu_ge_vecDot + (U := U) (a := a) hA hS hK hSigma hdet hMuGe p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/UpperLeftAverage.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/UpperLeftAverage.lean new file mode 100644 index 0000000000..fe41e4a6c2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/MuOrdering/UpperLeftAverage.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator + +/-! # Upper Left Average -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Upper-left averaged matrix bounds + +This file upgrades the scalar quadratic upper-left estimate +`b(U; a) ≤ average(symmPart(a) + k(a)ᵀ symmPart(a)⁻¹ k(a))` +to an honest matrix-order theorem. +-/ + +/-- Entrywise volume-average of the pointwise upper-left block coefficient. -/ +noncomputable def averagedSymmPartPlusCorrection {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) : Mat d := + volumeAverageMat U (fun x => + symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) + +private theorem abs_blockMatrixOfCoeff_upperLeft_entry_le_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} (hx : x ∈ U) (i j : Fin d) : + |((blockMatrixOfCoeff (a x)).upperLeft i j)| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + let B : BlockMat d := blockMatrixOfCoeff (a x) + let α : BlockCoord d := Sum.inl i + let β : BlockCoord d := Sum.inl j + let eα : BlockVec d := blockBasis α + let eβ : BlockVec d := blockBasis β + have hentry : + blockVecDot eα (blockMatVecMul B eβ) = + ((blockMatrixOfCoeff (a x)).upperLeft i j) := by + simpa [B, α, β, eα, eβ, blockMatEntry] using blockBasis_pairing B α β + have hsingle_i : vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro k _ hki + simp [Pi.single_eq_of_ne hki] + · simp + have hsingle_j : vecNormSq (Pi.single j 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single j] + · simp + · intro k _ hkj + simp [Pi.single_eq_of_ne hkj] + · simp + have hbasisα : blockVecDot eα eα = 1 := by + change vecNormSq (Pi.single i 1 : Vec d) + vecNormSq (0 : Vec d) = 1 + rw [hsingle_i] + simp [vecNormSq, vecDot] + have hbasisβ : blockVecDot eβ eβ = 1 := by + change vecNormSq (Pi.single j 1 : Vec d) + vecNormSq (0 : Vec d) = 1 + rw [hsingle_j] + simp [vecNormSq, vecDot] + have hsq : + (((blockMatrixOfCoeff (a x)).upperLeft i j)) ^ 2 ≤ + blockVecDot eα eα * blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) := by + calc + (((blockMatrixOfCoeff (a x)).upperLeft i j)) ^ 2 + = (blockVecDot eα (blockMatVecMul B eβ)) ^ 2 := by rw [hentry] + _ ≤ blockVecDot eα eα * blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) := + sq_blockVecDot_le_blockVecDot_mul_blockVecDot eα (blockMatVecMul B eβ) + have himage : + blockVecDot (blockMatVecMul B eβ) (blockMatVecMul B eβ) ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + have h := + blockMatrixOfCoeff_image_bound_of_isEllipticMatrix (hEll.2 x hx) eβ + simpa [B, hbasisβ] using h + have hsq' : + (((blockMatrixOfCoeff (a x)).upperLeft i j)) ^ 2 ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + rw [hbasisα] at hsq + nlinarith + have hbound_nonneg : 0 ≤ blockMatrixOfCoeffNormSqBound lam Lam := + blockMatrixOfCoeffNormSqBound_nonneg lam Lam + have habs_sq : + |((blockMatrixOfCoeff (a x)).upperLeft i j)| ^ 2 ≤ + blockMatrixOfCoeffNormSqBound lam Lam := by + simpa [sq_abs] using hsq' + have hsqrt_nonneg : 0 ≤ Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + exact Real.sqrt_nonneg _ + have habs_nonneg : 0 ≤ |((blockMatrixOfCoeff (a x)).upperLeft i j)| := by + exact abs_nonneg _ + nlinarith [habs_sq, Real.sq_sqrt hbound_nonneg, + hsqrt_nonneg, habs_nonneg, + sq_nonneg (Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) - + |((blockMatrixOfCoeff (a x)).upperLeft i j)|)] + +private theorem integrableOn_blockMatrixOfCoeff_upperLeft_entry_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (i j : Fin d) : + MeasureTheory.IntegrableOn (fun x => ((blockMatrixOfCoeff (a x)).upperLeft i j)) U := by + classical + let aExt : Vec d → Fin d → Fin d → ℝ := fun x => if x ∈ U then a x else 0 + have haExt : Measurable aExt := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hmeas : Measurable (fun x => if x ∈ U then a x i j else 0) := + (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have hEq : (fun x => aExt x i j) = fun x => if x ∈ U then a x i j else 0 := by + funext x + by_cases hx : x ∈ U <;> simp [aExt, hx] + rw [hEq] + exact hmeas + let coeffExt : Vec d → ℝ := fun x => ((blockMatrixOfCoeff (aExt x)).upperLeft i j) + have hcoeffExt : Measurable coeffExt := by + have hblock : + Measurable (fun x α β => + toFullBlockMat (blockMatrixOfCoeff (aExt x)) α β) := + measurable_toFullBlockMat_blockCoeffField haExt + simpa [coeffExt] using! + (measurable_pi_iff.1 (measurable_pi_iff.1 hblock (Sum.inl i)) (Sum.inl j)) + have hfinite : MeasureTheory.volume U ≠ ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ).ne + have hIntExt : MeasureTheory.IntegrableOn coeffExt U := by + refine + MeasureTheory.Measure.integrableOn_of_bounded + (μ := MeasureTheory.volume) + (M := Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam)) + hfinite hcoeffExt.aestronglyMeasurable ?_ + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + filter_upwards [hmem] with x hx + have hbound : + |((blockMatrixOfCoeff (a x)).upperLeft i j)| ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := + abs_blockMatrixOfCoeff_upperLeft_entry_le_of_isEllipticFieldOn hEll hx i j + simpa [coeffExt, aExt, hx, Real.norm_eq_abs] using hbound + refine hIntExt.congr_fun ?_ (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + simp [coeffExt, aExt, hx] + +private theorem integrableOn_symmPartPlusCorrection_entry_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (i j : Fin d) : + MeasureTheory.IntegrableOn + (fun x => + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) i j) U := by + refine + (integrableOn_blockMatrixOfCoeff_upperLeft_entry_of_isEllipticFieldOn hEll i j).congr_fun + ?_ (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + simp [blockMatrixOfCoeff] + +theorem vecDot_matVecMul_averagedSymmPartPlusCorrection_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (p : Vec d) : + vecDot p (matVecMul (averagedSymmPartPlusCorrection U a) p) = + volumeAverage U + (fun x => + vecDot p + (matVecMul + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) p)) := by + exact + vecDot_matVecMul_volumeAverageMat + (fun i j => integrableOn_symmPartPlusCorrection_entry_of_isEllipticFieldOn hEll i j) + p p + +/-- +Note-facing upper-left matrix-order bound +`b(U; a) ≤ average(symmPart(a) + k(a)ᵀ symmPart(a)⁻¹ k(a))`. +-/ +theorem bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hU : IsSobolevRegularDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) + (averagedSymmPartPlusCorrection U a) := by + intro p + rw [vecDot_matVecMul_averagedSymmPartPlusCorrection_of_isEllipticFieldOn hEll p] + have h := + bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hU hEll hHodge hvol compat hA hS hK hSigma p + nlinarith + +theorem bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) + (averagedSymmPartPlusCorrection U a) := by + exact + bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_hodgeConverseCriterion + (U := U) (a := a) R hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat hA hS hK hSigma + +end diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/StarredSubadditivity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/StarredSubadditivity.lean new file mode 100644 index 0000000000..683487243c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MagicIdentities/StarredSubadditivity.lean @@ -0,0 +1,878 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.BlockSubadditivity + +/-! # Starred Subadditivity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Starred-block and `b`-matrix subadditivity consequences. +-/ + +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a) X) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + refine + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll ?_ ?_ X + · intro p q + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet Q) a hAQ hSQ hKQ hSigmaQ hdetQ p q + · intro R hR p q + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + exact magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet R) a hAR hSR hKR hSigmaR hdetR p q + +theorem coarseStarredBlockMatrixInv_upperLeft_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a).upperLeft p) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).upperLeft p)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (p, 0) + +theorem coarseStarredBlockMatrixInv_lowerRight_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a).lowerRight q) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).lowerRight q)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (0, q) + +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet (originCube d n)) a) X) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + simpa using + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + +theorem coarseStarredBlockMatrixInv_upperLeft_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet (originCube d n)) a).upperLeft p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).upperLeft p)) := by + simpa using + coarseStarredBlockMatrixInv_upperLeft_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc p + +theorem coarseStarredBlockMatrixInv_lowerRight_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet (originCube d n)) a).lowerRight q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).lowerRight q)) := by + simpa using + coarseStarredBlockMatrixInv_lowerRight_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc q + +theorem coarseStarredBlockMatrixInv_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a) X) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet R) a) X)) := by + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a) X) + = (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet (originCube d n)) a) X) := by + rw [coarseStarredBlockMatrixInv_cubeSet_eq_openCubeSet_of_triadicCube + (Q := originCube d n) a] + _ ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + exact + coarseStarredBlockMatrixInv_subadditive_openCubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + _ = descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet R) a) X)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth (originCube d n) j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [← coarseStarredBlockMatrixInv_cubeSet_eq_openCubeSet_of_triadicCube (Q := R) a] + +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + BlockMatLoewnerLE (coarseStarredBlockMatrixInv (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a) X) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + exact + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + _ = (1 / 2 : ℝ) * + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q j + (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) X) := by + rw [descendantsAverage_smul] + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + +theorem coarseStarredBlockMatrixInv_subadditive_cubeSet_originCube_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + BlockMatLoewnerLE (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a) + (descendantsAverageBlockMat (originCube d n) j + (fun R => coarseStarredBlockMatrixInv (cubeSet R) a)) := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a) X) + ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (cubeSet R) a) X)) := by + exact + coarseStarredBlockMatrixInv_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc X + _ = (1 / 2 : ℝ) * + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat (originCube d n) j + (fun R => coarseStarredBlockMatrixInv (cubeSet R) a)) X) := by + rw [descendantsAverage_smul] + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + +theorem coarseStarredBlockMatrixInv_upperLeft_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a).upperLeft p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (cubeSet R) a).upperLeft p)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (p, 0) + +theorem coarseStarredBlockMatrixInv_lowerRight_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hAQ : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (cubeSet (originCube d n)) a).lowerRight q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (cubeSet R) a).lowerRight q)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_cubeSet_originCube_descendantsAtDepth_blockQuadratic_of_isSigmaCoarse + j n a hEll hAQ hSQ hKQ hSigmaQ hdetQ hDesc (0, q) + +theorem sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet R) a) q)) := by + have hscalar : + ResponseJ (openCubeSet Q) 0 q a ≤ + descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) 0 q a) := + responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q a hEll 0 q + calc + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) + = ResponseJ (openCubeSet Q) 0 q a := by + symm + simpa [matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + (U := openCubeSet Q) a hSQ hKQ hSigmaQ hdetQ (0 : Vec d) q + _ ≤ descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) 0 q a) := hscalar + _ = descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet R) a) q)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + simpa [matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + (U := openCubeSet R) a hSR hKR hSigmaR hdetR (0 : Vec d) q + +theorem sigmaStarInvCoarse_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet (originCube d n)) a) q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet R) a) q)) := by + simpa using + sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hSQ hKQ hSigmaQ hdetQ hDesc q + +theorem sigmaStarInvCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (cubeSet (originCube d n)) a) q) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (cubeSet R) a) q)) := by + calc + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (cubeSet (originCube d n)) a) q) + = (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet (originCube d n)) a) q) := by + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := originCube d n) (a := a) hSQ] + _ ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet R) a) q)) := by + exact + sigmaStarInvCoarse_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + j n a hEll hSQ hKQ hSigmaQ hdetQ hDesc q + _ = descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (cubeSet R) a) q)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth (originCube d n) j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + rw [← sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := a) hSR] + +theorem sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + MatLoewnerLE (sigmaStarInvCoarse (openCubeSet Q) a) + (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (openCubeSet R) a)) := by + intro q + calc + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet R) a) q)) := by + exact + sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ hDesc q + _ = (1 / 2 : ℝ) * + vecDot q + (matVecMul + (descendantsAverageMat Q j + (fun R => sigmaStarInvCoarse (openCubeSet R) a)) q) := by + rw [descendantsAverage_smul] + rw [vecDot_matVecMul_descendantsAverageMat] + +theorem sigmaStarInvCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + MatLoewnerLE (sigmaStarInvCoarse (cubeSet (originCube d n)) a) + (descendantsAverageMat (originCube d n) j + (fun R => sigmaStarInvCoarse (cubeSet R) a)) := by + intro q + calc + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (cubeSet (originCube d n)) a) q) + ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (sigmaStarInvCoarse (cubeSet R) a) q)) := by + exact + sigmaStarInvCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + j n a hEll hSQ hKQ hSigmaQ hdetQ hDesc q + _ = (1 / 2 : ℝ) * + vecDot q + (matVecMul + (descendantsAverageMat (originCube d n) j + (fun R => sigmaStarInvCoarse (cubeSet R) a)) q) := by + rw [descendantsAverage_smul] + rw [vecDot_matVecMul_descendantsAverageMat] + +theorem bCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) p)) := by + have hscalar : + ResponseJ (openCubeSet Q) p 0 a ≤ + descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p 0 a) := + responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q a hEll p 0 + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) + = ResponseJ (openCubeSet Q) p 0 a := by + symm + exact basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + (U := openCubeSet Q) a hSQ hKQ hSigmaQ hdetQ p + _ ≤ descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p 0 a) := hscalar + _ = descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) p)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + exact + basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + (U := openCubeSet R) a hSR hKR hSigmaR hdetR p + +theorem bCoarse_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) p)) := by + simpa using + bCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + (j := j) (Q := originCube d n) (a := a) hEll hSQ hKQ hSigmaQ hdetQ hDesc p + +theorem bCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a)) p) ≤ + descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) p)) := by + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a)) p) + = (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) p) := by + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := originCube d n) (a := a) hSQ hKQ hSigmaQ hdetQ] + _ ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) p)) := by + exact + bCoarse_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + j n a hEll hSQ hKQ hSigmaQ hdetQ hDesc p + _ = descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) p)) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth (originCube d n) j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + rw [← bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := a) hSR hKR hSigmaR hdetR] + +theorem bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet Q) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet Q) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet Q) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + MatLoewnerLE + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a))) := by + intro p + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) p)) := by + exact + bCoarse_subadditive_openCubeSet_descendantsAtDepth_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ hDesc p + _ = (1 / 2 : ℝ) * + vecDot p + (matVecMul + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a))) p) := by + rw [descendantsAverage_smul] + rw [vecDot_matVecMul_descendantsAverageMat] + +theorem bCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + {sigmaQ sigmaStarQ kappaQ : Mat d} + (hSQ : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStarQ) + (hKQ : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStarQ kappaQ) + (hSigmaQ : IsSigmaCoarse (openCubeSet (originCube d n)) a sigmaQ sigmaStarQ kappaQ) + (hdetQ : IsUnit sigmaStarQ.det) + (hDesc : + ∀ R ∈ descendantsAtDepth (originCube d n) j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) : + MatLoewnerLE + (bCoarse (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a)) + (descendantsAverageMat (originCube d n) j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) := by + intro p + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a)) p) + ≤ descendantsAverage (originCube d n) j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) p)) := by + exact + bCoarse_subadditive_cubeSet_originCube_descendantsAtDepth_of_isSigmaCoarse + j n a hEll hSQ hKQ hSigmaQ hdetQ hDesc p + _ = (1 / 2 : ℝ) * + vecDot p + (matVecMul + (descendantsAverageMat (originCube d n) j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) p) := by + rw [descendantsAverage_smul] + rw [vecDot_matVecMul_descendantsAverageMat] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuAdmissibility.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuAdmissibility.lean new file mode 100644 index 0000000000..c0196bbd3d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuAdmissibility.lean @@ -0,0 +1,476 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2OriginCubeBridge + +/-! # Mu Admissibility -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Admissibility-plus-integrability bridge lemmas for the doubled `Mu` problem. + +`IsBlockMuAdmissible U P X` now packages the correction-field `L²` membership +and the zero-trace / zero-normal-trace conditions. On finite-measure domains, +this is enough to reconstruct the affine state as an ambient `L²` block field. +Ellipticity then upgrades admissible states to the energy-integrability package +needed for the quantitative averaged identities below. +-/ + +structure BlockMuIntegrabilityData {d : ℕ} (U : Set (Vec d)) (P : BlockVec d) + (a : CoeffField d) (X : BlockState d) : Prop where + potentialCorrection_memL2 : + MemVectorL2 U (fun x => X.potential x - P.1) + fluxCorrection_memL2 : + MemVectorL2 U (fun x => X.flux x - P.2) + energyIntegrable : + MeasureTheory.IntegrableOn (blockEnergyDensity a X) U + +/-- Ambient block `L²` control plus ellipticity is enough to build the +integrability package used by the doubled `Mu` bridge. -/ +theorem blockMuIntegrabilityData_of_memBlockL2_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} {a : CoeffField d} {X : BlockState d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} + (hX : MemBlockL2 U X.eval) (hEll : IsEllipticFieldOn lam Lam U a) : + BlockMuIntegrabilityData U P a X := by + refine ⟨?_, ?_, ?_⟩ + · have hPot : MemVectorL2 U X.potential := by + simpa [BlockState.eval] using memVectorL2_fst_of_memBlockL2 (U := U) hX + simpa [sub_eq_add_neg] using! + hPot.sub (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.1)) + · have hFlux : MemVectorL2 U X.flux := by + simpa [BlockState.eval] using memVectorL2_snd_of_memBlockL2 (U := U) hX + simpa [sub_eq_add_neg] using! + hFlux.sub (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.2)) + · exact + blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := U) (a := a) hX hEll + +namespace IsBlockMuAdmissible + +section Generic + +variable {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} {a : CoeffField d} {X : BlockState d} + +/-- The correction field attached to an admissible block state depends only on +the affine constraints packaged by `IsBlockMuAdmissible`. -/ +noncomputable def toCorrectionFieldDataOfAdmissible + (hX : IsBlockMuAdmissible U P X) : + CorrectionFieldData U where + potential := fun x => X.potential x - P.1 + flux := fun x => X.flux x - P.2 + potential_memL2 := hX.potentialCorrection_memL2 + flux_memL2 := hX.fluxCorrection_memL2 + isPotentialZeroTrace := hX.isPotentialZeroTrace + isSolenoidalZeroNormalTrace := hX.isSolenoidalZeroNormalTrace + +noncomputable def toCorrectionFieldData + (hX : IsBlockMuAdmissible U P X) + (hInt : BlockMuIntegrabilityData U P a X) : + CorrectionFieldData U where + potential := (hX.toCorrectionFieldDataOfAdmissible).potential + flux := (hX.toCorrectionFieldDataOfAdmissible).flux + potential_memL2 := hInt.potentialCorrection_memL2 + flux_memL2 := hInt.fluxCorrection_memL2 + isPotentialZeroTrace := (hX.toCorrectionFieldDataOfAdmissible).isPotentialZeroTrace + isSolenoidalZeroNormalTrace := (hX.toCorrectionFieldDataOfAdmissible).isSolenoidalZeroNormalTrace + +@[simp] theorem toCorrectionFieldData_potential + (hX : IsBlockMuAdmissible U P X) + (hInt : BlockMuIntegrabilityData U P a X) : + (hX.toCorrectionFieldData (a := a) hInt).potential = fun x => X.potential x - P.1 := + rfl + +@[simp] theorem toCorrectionFieldData_flux + (hX : IsBlockMuAdmissible U P X) + (hInt : BlockMuIntegrabilityData U P a X) : + (hX.toCorrectionFieldData (a := a) hInt).flux = fun x => X.flux x - P.2 := + rfl + +/-- Reconstruct the ambient block `L²` field carried by an admissible state. -/ +theorem memBlockL2_eval + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : IsBlockMuAdmissible U P X) : + MemBlockL2 U X.eval := by + have hPot : MemVectorL2 U X.potential := by + have hPot' : MemVectorL2 U (fun x => P.1 + (X.potential x - P.1)) := + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.1)).add + hX.potentialCorrection_memL2 + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hPot' + have hFlux : MemVectorL2 U X.flux := by + have hFlux' : MemVectorL2 U (fun x => P.2 + (X.flux x - P.2)) := + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.2)).add + hX.fluxCorrection_memL2 + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hFlux' + simpa [BlockState.eval, blockField] using! memBlockL2_blockField hPot hFlux + +/-- The admissible correction carried by `X` lands in the canonical closed +correction space `\Lpoto(U) × \Lsolo(U)`. -/ +theorem toCorrectionFieldData_mem_correctionSpace + (hX : IsBlockMuAdmissible U P X) : + (hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 ∈ + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).toMuCorrectionSpaceData.correctionSpace := by + exact + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).toMuCorrectionSpaceData.mem_correctionSpace + hX.potentialCorrection_memL2 + hX.fluxCorrection_memL2 + hX.isPotentialZeroTrace + hX.isSolenoidalZeroNormalTrace + +/-- The Hilbert image of an admissible block state splits into the constant +datum `P` plus its correction component. -/ +theorem toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : IsBlockMuAdmissible U P X) : + toHilbertBlockL2OfBlockField (U := U) hX.memBlockL2_eval = + blockVecToHilbertBlockL2Const (U := U) P + + (hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfBlockField (U := U) (F := X.eval) hX.memBlockL2_eval, + coeFn_toHilbertBlockL2OfComponents (U := U) + (f := fun x => X.potential x - P.1) + (g := fun x => X.flux x - P.2) + hX.potentialCorrection_memL2 + hX.fluxCorrection_memL2, + coeFn_blockVecToHilbertBlockL2Const (U := U) (P := P), + MeasureTheory.Lp.coeFn_add + (blockVecToHilbertBlockL2Const (U := U) P) + (hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2] + with x hfield hcorr hconst hsum + have hpoint : + hilbertifyBlockField X.eval x = + Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField + (fun y => X.potential y - P.1) + (fun y => X.flux y - P.2) x := by + apply HilbertBlockVec.ext + · ext i + simp [BlockState.eval, hilbertifyBlockField, hilbertBlockField, blockField] + · ext i + simp [BlockState.eval, hilbertifyBlockField, hilbertBlockField, blockField] + calc + (toHilbertBlockL2OfBlockField (U := U) hX.memBlockL2_eval) x + = hilbertifyBlockField X.eval x := hfield + _ = Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField + (fun y => X.potential y - P.1) + (fun y => X.flux y - P.2) x := hpoint + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + + hilbertBlockField + (fun y => X.potential y - P.1) + (fun y => X.flux y - P.2) x := by + rw [← hconst] + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + + ((hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2) x := by + rw [← hcorr] + rfl + _ = ((⇑(blockVecToHilbertBlockL2Const (U := U) P) : Vec d → HilbertBlockVec d) + + (⇑(hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 : Vec d → HilbertBlockVec d)) x := by + rfl + _ = + (blockVecToHilbertBlockL2Const (U := U) P + + (hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2) x := by + simpa [Pi.add_apply] using hsum.symm + +/-- Package the correction component of an admissible state as an element of +the canonical closed correction space. -/ +noncomputable def toCorrectionSpaceElement + (hX : IsBlockMuAdmissible U P X) : + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).toMuCorrectionSpaceData.correctionSpace.toSubmodule := + ⟨(hX.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2, + hX.toCorrectionFieldData_mem_correctionSpace⟩ + +theorem toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add_correctionSpace + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : IsBlockMuAdmissible U P X) : + toHilbertBlockL2OfBlockField (U := U) hX.memBlockL2_eval = + blockVecToHilbertBlockL2Const (U := U) P + hX.toCorrectionSpaceElement := by + exact hX.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + +theorem toBlockMuIntegrabilityDataOfIsEllipticFieldOn + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : IsBlockMuAdmissible U P X) + (hEll : IsEllipticFieldOn lam Lam U a) : + BlockMuIntegrabilityData U P a X := by + have hPot : MemVectorL2 U X.potential := by + have hPot' : MemVectorL2 U (fun x => P.1 + (X.potential x - P.1)) := + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.1)).add + hX.potentialCorrection_memL2 + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hPot' + have hFlux : MemVectorL2 U X.flux := by + have hFlux' : MemVectorL2 U (fun x => P.2 + (X.flux x - P.2)) := + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := P.2)).add + hX.fluxCorrection_memL2 + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hFlux' + have hBlock : MemBlockL2 U X.eval := by + simpa [BlockState.eval, blockField] using! memBlockL2_blockField hPot hFlux + exact blockMuIntegrabilityData_of_memBlockL2_of_isEllipticFieldOn + (U := U) (P := P) (a := a) hBlock hEll + +theorem pairingIntegrable + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : IsBlockMuAdmissible U P X) : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := by + let Y := hX.toCorrectionFieldDataOfAdmissible + have hpair : + (fun x => vecDot (P.1 + Y.potential x) (P.2 + Y.flux x)) = + fun x => vecDot (X.potential x) (X.flux x) := by + funext x + congr <;> ext i <;> simp [Y, IsBlockMuAdmissible.toCorrectionFieldDataOfAdmissible, + sub_eq_add_neg] + rw [← hpair] + simpa [Y] using (CorrectionFieldData.integrableOn_pairing_affine (U := U) Y P.1 P.2) + +theorem average_pairing_of_integral_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hX : IsBlockMuAdmissible U P X) + (hpotZero : + (fun i => ∫ x in U, (X.potential x - P.1) i ∂MeasureTheory.volume) = 0) + (hfluxZero : + (fun i => ∫ x in U, (X.flux x - P.2) i ∂MeasureTheory.volume) = 0) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + volumeAverage U (fun x => vecDot (X.potential x) (X.flux x)) = vecDot P.1 P.2 := by + let Y := hX.toCorrectionFieldDataOfAdmissible + have hpair : + (fun x => vecDot (P.1 + Y.potential x) (P.2 + Y.flux x)) = + fun x => vecDot (X.potential x) (X.flux x) := by + funext x + congr <;> ext i <;> simp [Y, IsBlockMuAdmissible.toCorrectionFieldDataOfAdmissible, + sub_eq_add_neg] + have hint : + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * vecDot P.1 P.2 := by + rw [← hpair] + simpa [Y] using + (CorrectionFieldData.integral_pairing_affine_eq_volume_mul_vecDot_of_integral_eq_zero + (U := U) Y P.1 P.2 hpotZero hfluxZero) + unfold volumeAverage + rw [hint] + calc + (MeasureTheory.volume U).toReal⁻¹ * ((MeasureTheory.volume U).toReal * vecDot P.1 P.2) + = ((MeasureTheory.volume U).toReal⁻¹ * (MeasureTheory.volume U).toReal) * + vecDot P.1 P.2 := by ring + _ = vecDot P.1 P.2 := by + rw [inv_mul_cancel₀ hvol, one_mul] + +theorem blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hX : IsBlockMuAdmissible U P X) + (hInt : BlockMuIntegrabilityData U P a X) + (hEll : IsEllipticFieldOn lam Lam U a) + (hpotZero : + (fun i => ∫ x in U, (X.potential x - P.1) i ∂MeasureTheory.volume) = 0) + (hfluxZero : + (fun i => ∫ x in U, (X.flux x - P.2) i ∂MeasureTheory.volume) = 0) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + vecDot P.1 P.2 ≤ blockEnergyAverage U a X := by + have hPairInt := hX.pairingIntegrable + have hPairAvg := + hX.average_pairing_of_integral_eq_zero hpotZero hfluxZero hvol + have hnonneg : + 0 ≤ volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) := by + unfold volumeAverage + refine mul_nonneg ?_ ?_ + · exact inv_nonneg.mpr ENNReal.toReal_nonneg + · apply MeasureTheory.integral_nonneg_of_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => + sub_nonneg.mpr (blockEnergyDensity_ge_vecDot_of_isEllipticFieldOn hEll X hx)) + have hdiff : + volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) = + blockEnergyAverage U a X - vecDot P.1 P.2 := by + calc + volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) = + volumeAverage U (blockEnergyDensity a X) - + volumeAverage U (fun x => vecDot (X.potential x) (X.flux x)) := by + unfold volumeAverage + rw [MeasureTheory.integral_sub hInt.energyIntegrable hPairInt] + ring + _ = blockEnergyAverage U a X - vecDot P.1 P.2 := by + rw [hPairAvg] + simp [blockEnergyAverage] + rw [hdiff] at hnonneg + linarith + +theorem mu_ge_vecDot_of_isEllipticFieldOn_of_integrabilityBridge + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (bridge : + ∀ X : BlockState d, IsBlockMuAdmissible U P X -> BlockMuIntegrabilityData U P a X) + (hpotZero : + ∀ X : BlockState d, ∀ _hX : IsBlockMuAdmissible U P X, + (fun i => ∫ x in U, (X.potential x - P.1) i ∂MeasureTheory.volume) = 0) + (hfluxZero : + ∀ X : BlockState d, ∀ _hX : IsBlockMuAdmissible U P X, + (fun i => ∫ x in U, (X.flux x - P.2) i ∂MeasureTheory.volume) = 0) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + vecDot P.1 P.2 ≤ Mu U P a := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro Y hY + exact hY.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) (bridge Y hY) hEll (hpotZero Y hY) (hfluxZero Y hY) hvol + +theorem mu_ge_vecDot_of_isEllipticFieldOn_of_isSobolevRegularDomain + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + vecDot P.1 P.2 ≤ Mu U P a := by + apply mu_ge_vecDot_of_isEllipticFieldOn_of_integrabilityBridge + (U := U) (P := P) (a := a) hEll + · intro X hX + exact hX.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll + · intro X hX + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hX.isPotentialZeroTrace) + · intro X hX + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU hX.isSolenoidalZeroNormalTrace) + · exact hvol + +end Generic + +section OriginCube + +variable {d : ℕ} [NeZero d] {n : ℤ} {P : BlockVec d} {a : CoeffField d} {X : BlockState d} + +theorem average_pairing_openCubeSet_originCube + (hX : IsBlockMuAdmissible (openCubeSet (originCube d n)) P X) : + volumeAverage (openCubeSet (originCube d n)) + (fun x => vecDot (X.potential x) (X.flux x)) = vecDot P.1 P.2 := by + have hpotZero : + (fun i => + ∫ x in openCubeSet (originCube d n), (X.potential x - P.1) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (f := fun x => X.potential x - P.1) hX.isPotentialZeroTrace) + have hfluxZero : + (fun i => + ∫ x in openCubeSet (originCube d n), (X.flux x - P.2) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (g := fun x => X.flux x - P.2) hX.isSolenoidalZeroNormalTrace) + have hvol : (MeasureTheory.volume (openCubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + exact hX.average_pairing_of_integral_eq_zero hpotZero hfluxZero hvol + +theorem average_pairing_cubeSet_originCube + (hX : IsBlockMuAdmissible (cubeSet (originCube d n)) P X) : + volumeAverage (cubeSet (originCube d n)) + (fun x => vecDot (X.potential x) (X.flux x)) = vecDot P.1 P.2 := by + have hpotZero : + (fun i => + ∫ x in cubeSet (originCube d n), (X.potential x - P.1) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (f := fun x => X.potential x - P.1) hX.isPotentialZeroTrace) + have hfluxZero : + (fun i => + ∫ x in cubeSet (originCube d n), (X.flux x - P.2) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (g := fun x => X.flux x - P.2) hX.isSolenoidalZeroNormalTrace) + have hvol : (MeasureTheory.volume (cubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + exact hX.average_pairing_of_integral_eq_zero hpotZero hfluxZero hvol + +theorem blockEnergyAverage_ge_vecDot_openCubeSet_originCube_of_isEllipticFieldOn + {lam Lam : ℝ} + (hX : IsBlockMuAdmissible (openCubeSet (originCube d n)) P X) + (hInt : BlockMuIntegrabilityData (openCubeSet (originCube d n)) P a X) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) : + vecDot P.1 P.2 ≤ blockEnergyAverage (openCubeSet (originCube d n)) a X := by + have hpotZero : + (fun i => + ∫ x in openCubeSet (originCube d n), (X.potential x - P.1) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (f := fun x => X.potential x - P.1) hX.isPotentialZeroTrace) + have hfluxZero : + (fun i => + ∫ x in openCubeSet (originCube d n), (X.flux x - P.2) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (g := fun x => X.flux x - P.2) hX.isSolenoidalZeroNormalTrace) + have hvol : (MeasureTheory.volume (openCubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + exact + hX.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) hInt hEll hpotZero hfluxZero hvol + +theorem blockEnergyAverage_ge_vecDot_cubeSet_originCube_of_isEllipticFieldOn + {lam Lam : ℝ} + (hX : IsBlockMuAdmissible (cubeSet (originCube d n)) P X) + (hInt : BlockMuIntegrabilityData (cubeSet (originCube d n)) P a X) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) : + vecDot P.1 P.2 ≤ blockEnergyAverage (cubeSet (originCube d n)) a X := by + have hpotZero : + (fun i => + ∫ x in cubeSet (originCube d n), (X.potential x - P.1) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (f := fun x => X.potential x - P.1) hX.isPotentialZeroTrace) + have hfluxZero : + (fun i => + ∫ x in cubeSet (originCube d n), (X.flux x - P.2) i ∂MeasureTheory.volume) = 0 := by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (g := fun x => X.flux x - P.2) hX.isSolenoidalZeroNormalTrace) + have hvol : (MeasureTheory.volume (cubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + exact + hX.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) hInt hEll hpotZero hfluxZero hvol + +theorem mu_ge_vecDot_openCubeSet_originCube_of_isEllipticFieldOn_of_integrabilityBridge + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (bridge : + ∀ Y : BlockState d, + IsBlockMuAdmissible (openCubeSet (originCube d n)) P Y -> + BlockMuIntegrabilityData (openCubeSet (originCube d n)) P a Y) : + vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro Y hY + exact hY.blockEnergyAverage_ge_vecDot_openCubeSet_originCube_of_isEllipticFieldOn + (a := a) (bridge Y hY) hEll + +theorem mu_ge_vecDot_cubeSet_originCube_of_isEllipticFieldOn_of_integrabilityBridge + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (bridge : + ∀ Y : BlockState d, + IsBlockMuAdmissible (cubeSet (originCube d n)) P Y -> + BlockMuIntegrabilityData (cubeSet (originCube d n)) P a Y) : + vecDot P.1 P.2 ≤ Mu (cubeSet (originCube d n)) P a := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro Y hY + exact hY.blockEnergyAverage_ge_vecDot_cubeSet_originCube_of_isEllipticFieldOn + (a := a) (bridge Y hY) hEll + +end OriginCube + +end IsBlockMuAdmissible + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator.lean new file mode 100644 index 0000000000..175e0eb871 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator + +/-! +# Mu operator (aggregate re-export) + +Previously a 1072-line monolithic module; now split along thematic +boundaries into the files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator.lean new file mode 100644 index 0000000000..9b81d98d0e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CoeffOperatorData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CanonicalCubeSet + +/-! # AEEOperator -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CanonicalCubeSet.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CanonicalCubeSet.lean new file mode 100644 index 0000000000..db37757d10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CanonicalCubeSet.lean @@ -0,0 +1,518 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CoeffOperatorData +public import Mathlib.Topology.Order.IsLUB + +/-! # Canonical Cube Set -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + + +namespace PotentialSolenoidalL2Data + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Build the AEE doubled operator system from a packaged correction space and +a.e.-representative coefficient-operator data. -/ +noncomputable def toAEEMuOperatorSystemData (M : PotentialSolenoidalL2Data U) + (coeffOperatorData : AEEMuCoeffOperatorData U a) : + AEEMuOperatorSystemData U a where + correctionSpace := M.toMuCorrectionSpaceData + coeffOperatorData := coeffOperatorData + +/-- Build the AEE doubled operator system from the old pointwise elliptic +constructor. This is a compatibility bridge; the genuinely new Phase 3 +constructor will start from spatial-a.e. ellipticity instead. -/ +noncomputable def toAEEMuOperatorSystemDataOfIsEllipticFieldOn + (M : PotentialSolenoidalL2Data U) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + AEEMuOperatorSystemData U a := + let coeffOperatorData : MuCoeffOperatorData U a := + MuCoeffOperatorData.ofIsEllipticFieldOn (U := U) (a := a) hEll + M.toAEEMuOperatorSystemData + (AEEMuCoeffOperatorData.ofMuCoeffOperatorDataOfIsEllipticFieldOn + coeffOperatorData hEll hvol) + +@[simp] theorem correctionSpace_toAEEMuOperatorSystemData + (M : PotentialSolenoidalL2Data U) + (coeffOperatorData : AEEMuCoeffOperatorData U a) : + (M.toAEEMuOperatorSystemData coeffOperatorData).correctionSpace = + M.toMuCorrectionSpaceData := + rfl + +end PotentialSolenoidalL2Data + +section CanonicalCubeSet + +/-- Half-open triadic cubes carry finite restricted volume measure. -/ +instance (priority := 900) instIsFiniteMeasureVolumeMeasureOnCubeSetAEEOperator + {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + let : Fact (MeasureTheory.volume (cubeSet Q) < ⊤) := ⟨volume_cubeSet_lt_top Q⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet Q)) + infer_instance + +/-- Half-open triadic cubes have positive volume in `toReal` form. -/ +theorem volume_cubeSet_toReal_pos {d : ℕ} (Q : TriadicCube d) : + 0 < (MeasureTheory.volume (cubeSet Q)).toReal := by + rw [volume_cubeSet_toReal] + exact cubeVolume_pos Q + +/-- Canonical potential/solenoidal `L²` data used by the AEE cube-set operator +system. -/ +noncomputable def canonicalAEEPotentialSolenoidalL2Data {d : ℕ} (Q : TriadicCube d) : + PotentialSolenoidalL2Data (cubeSet Q) := + PotentialSolenoidalL2Data.ofSubmoduleClosures (cubeSet Q) + +/-- Canonical Hilbert correction space for the AEE doubled `\mu` problem on a +half-open triadic cube. -/ +noncomputable def canonicalAEEMuCorrectionSpaceData {d : ℕ} (Q : TriadicCube d) : + MuCorrectionSpaceData (cubeSet Q) := + (canonicalAEEPotentialSolenoidalL2Data Q).toMuCorrectionSpaceData + +instance canonicalAEEMuCorrectionSpaceData_separable {d : ℕ} (Q : TriadicCube d) : + TopologicalSpace.SeparableSpace + ↥(canonicalAEEMuCorrectionSpaceData Q).correctionSpace := by + let : Fact ((1 : ENNReal) ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + let : Fact ((2 : ENNReal) ≠ ⊤) := ⟨by norm_num⟩ + infer_instance + +/-- Canonical AEE coefficient-operator data on one quantitative AEE cube +slice. -/ +noncomputable def canonicalAEEMuCoeffOperatorData + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) : + AEEMuCoeffOperatorData (cubeSet Q) a.1 := + AEEMuCoeffOperatorData.ofIsAEEllipticFieldOn + (U := cubeSet Q) (a := a.1) a.2 (volume_cubeSet_toReal_pos Q) + +/-- Canonical AEE doubled operator system on one quantitative AEE cube slice. -/ +noncomputable def canonicalAEEMuOperatorSystemData + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) : + AEEMuOperatorSystemData (cubeSet Q) a.1 where + correctionSpace := canonicalAEEMuCorrectionSpaceData Q + coeffOperatorData := canonicalAEEMuCoeffOperatorData Q k a + +@[simp] theorem correctionSpace_canonicalAEEMuOperatorSystemData + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) : + (canonicalAEEMuOperatorSystemData Q k a).correctionSpace = + canonicalAEEMuCorrectionSpaceData Q := + rfl + +@[simp] theorem coeffOperatorData_canonicalAEEMuOperatorSystemData + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) : + (canonicalAEEMuOperatorSystemData Q k a).coeffOperatorData = + canonicalAEEMuCoeffOperatorData Q k a := + rfl + +/-- The canonical AEE Hilbert bilinear form on dense generator corrections is +the fixed block-pairing average of their chosen pointwise representatives. -/ +theorem canonicalAEEMuOperatorSystemData_energyBilin_generator_eq_blockPairingAverage + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (Y Z : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z) = + blockPairingAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Z) + (canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Y) := by + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + let HY : MemBlockL2 U + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y).eval := + canonicalMuGeneratorAffineField_memBlockL2 (U := U) (0 : BlockVec d) Y + let HZ : MemBlockL2 U + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Z).eval := + canonicalMuGeneratorAffineField_memBlockL2 (U := U) (0 : BlockVec d) Z + have hY : + toHilbertBlockL2OfBlockField (U := U) HY = + canonicalMuCorrectionGeneratorEmbedding U Y := + canonicalMuGeneratorAffineField_zero_hilbert_eq (U := U) Y + have hZ : + toHilbertBlockL2OfBlockField (U := U) HZ = + canonicalMuCorrectionGeneratorEmbedding U Z := + canonicalMuGeneratorAffineField_zero_hilbert_eq (U := U) Z + calc + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Z) + = + energyBilinOfOperator system.toMuOperatorRealization.operator + (toHilbertBlockL2OfBlockField (U := U) HY) + (toHilbertBlockL2OfBlockField (U := U) HZ) := by + simp [U, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + hY, hZ] + _ = blockPairingAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Z) + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y) := by + exact + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Z) + (Y := canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y) + HZ HY + +/-- The canonical AEE Hilbert bilinear form on a constant affine shift and a +dense-generator correction is the fixed block-pairing average of their chosen +pointwise representatives. -/ +theorem canonicalAEEMuOperatorSystemData_energyBilin_const_generator_eq_blockPairingAverage + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P : BlockVec d) + (Y : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) = + blockPairingAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) (0 : BlockVec d) Y) + (canonicalMuGeneratorAffineField + (U := cubeSet Q) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q))) := by + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + let HP : MemBlockL2 U + (canonicalMuGeneratorAffineField + (U := U) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule U)).eval := + canonicalMuGeneratorAffineField_memBlockL2 + (U := U) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule U) + let HY : MemBlockL2 U + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y).eval := + canonicalMuGeneratorAffineField_memBlockL2 (U := U) (0 : BlockVec d) Y + have hP : + toHilbertBlockL2OfBlockField (U := U) HP = + blockVecToHilbertBlockL2Const (U := U) P := + canonicalMuGeneratorAffineField_zeroCorrection_hilbert_eq_const (U := U) P + have hY : + toHilbertBlockL2OfBlockField (U := U) HY = + canonicalMuCorrectionGeneratorEmbedding U Y := + canonicalMuGeneratorAffineField_zero_hilbert_eq (U := U) Y + calc + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).energyBilin + (((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).constantField P) + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y) + = + energyBilinOfOperator system.toMuOperatorRealization.operator + (toHilbertBlockL2OfBlockField (U := U) HP) + (toHilbertBlockL2OfBlockField (U := U) HY) := by + simp [U, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + hP, hY] + _ = blockPairingAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y) + (canonicalMuGeneratorAffineField + (U := U) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule U)) := by + exact + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := canonicalMuGeneratorAffineField (U := U) (0 : BlockVec d) Y) + (Y := canonicalMuGeneratorAffineField + (U := U) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule U)) + HY HP + +/-- The variational `Mu` on a quantitative AEE cube slice agrees with the +canonical AEE Hilbert-operator candidate. -/ +theorem mu_eq_canonicalAEEMuCandidate + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P0 : BlockVec d) : + Mu (cubeSet Q) P0 a.1 = + ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization).muCandidate P0 := by + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + let H : MuHilbertRealization U a.1 := system.toMuHilbertRealization + let gen : canonicalMuBlockCorrectionGeneratorSubmodule U → + H.correctionSpace.correctionSpace.toSubmodule := by + intro Y + exact canonicalMuCorrectionGeneratorEmbedding U Y + let s : Set ℝ := Set.range fun Y : canonicalMuBlockCorrectionGeneratorSubmodule U => + quadraticEnergy H.energyBilin (H.constantField P0 + (gen Y : HilbertBlockL2 U)) + have hgen_dense : DenseRange gen := by + dsimp [gen, H, system, U] + simpa [canonicalAEEMuOperatorSystemData, canonicalAEEMuCorrectionSpaceData, + canonicalAEEPotentialSolenoidalL2Data, MuCorrectionSpaceData.ofSubmoduleClosures, + AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using! + denseRange_canonicalMuCorrectionGeneratorEmbedding U + have hCandidate_sInf : H.muCandidate P0 = sInf s := by + simpa [s] using + H.muCandidate_eq_sInf_quadraticEnergy_denseRange P0 gen hgen_dense + have hCandidateLe : + ∀ X : BlockState d, IsBlockMuAdmissible U P0 X → + H.muCandidate P0 ≤ blockEnergyAverage U a.1 X := by + intro X hX + have hXmem : MemBlockL2 U X.eval := hX.memBlockL2_eval + have hcorr_mem : + toHilbertBlockL2OfBlockField (U := U) hXmem - H.constantField P0 ∈ + H.correctionSpace.correctionSpace := by + have hsplit := hX.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + rw [hsplit] + have hcorr := hX.toCorrectionFieldData_mem_correctionSpace + simpa [H, system, U, canonicalAEEMuOperatorSystemData, canonicalAEEMuCorrectionSpaceData, + canonicalAEEPotentialSolenoidalL2Data, MuCorrectionSpaceData.ofSubmoduleClosures, + AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + sub_eq_add_neg, add_assoc, add_comm] using hcorr + have hmin : + H.muCandidate P0 ≤ + quadraticEnergy H.energyBilin (toHilbertBlockL2OfBlockField (U := U) hXmem) := + H.muCandidate_le_quadraticEnergy P0 + (toHilbertBlockL2OfBlockField (U := U) hXmem) hcorr_mem + calc + H.muCandidate P0 ≤ + quadraticEnergy H.energyBilin (toHilbertBlockL2OfBlockField (U := U) hXmem) := hmin + _ = blockEnergyAverage U a.1 X := by + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := X) hXmem + have hBddBelow : BddBelow (muValueSet U P0 a.1) := by + refine ⟨H.muCandidate P0, ?_⟩ + intro m hm + rcases hm with ⟨X, hX, rfl⟩ + simpa [blockEnergyAverage] using hCandidateLe X hX + have hCandidate_le_Mu : H.muCandidate P0 ≤ Mu U P0 a.1 := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro X hX + simpa [blockEnergyAverage] using hCandidateLe X hX + have hs_subset_mu : s ⊆ muValueSet U P0 a.1 := by + intro m hm + rcases hm with ⟨Y, rfl⟩ + rcases Y.property with ⟨f, g, hf, hg, hY, hpot, hsol⟩ + let X : BlockState d := + { potential := fun x => P0.1 + f x + flux := fun x => P0.2 + g x } + have hAdm : IsBlockMuAdmissible U P0 X := by + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [X, sub_eq_add_neg, add_assoc, add_comm] using hf + · simpa [X, sub_eq_add_neg, add_assoc, add_comm] using hpot + · simpa [X, sub_eq_add_neg, add_assoc, add_comm] using hg + · simpa [X, sub_eq_add_neg, add_assoc, add_comm] using hsol + have hGen_comp : + (gen Y : HilbertBlockL2 U) = toHilbertBlockL2OfComponents hf hg := by + have hblock_to_hilbert : + blockL2ToHilbertBlockL2 (U := U) (Y : BlockL2 U) = + toHilbertBlockL2OfComponents hf hg := by + rw [← hY] + simpa [toBlockL2OfComponents, toHilbertBlockL2OfComponents] using! + (blockL2ToHilbertBlockL2_toBlockL2 + (U := U) + (F := blockField f g) + (memBlockL2_blockField hf hg)) + dsimp [gen, canonicalMuCorrectionGeneratorEmbedding, + PotentialSolenoidalL2Data.submoduleClosureToMuCorrectionSpace] + exact hblock_to_hilbert + have hAdmCorr : + (hAdm.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 = + toHilbertBlockL2OfComponents hf hg := by + change toHilbertBlockL2OfComponents + hAdm.potentialCorrection_memL2 hAdm.fluxCorrection_memL2 = + toHilbertBlockL2OfComponents hf hg + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfComponents (U := U) + (f := fun x => X.potential x - P0.1) + (g := fun x => X.flux x - P0.2) + hAdm.potentialCorrection_memL2 hAdm.fluxCorrection_memL2, + coeFn_toHilbertBlockL2OfComponents (U := U) (f := f) (g := g) hf hg] + with x hleft hright + rw [hleft, hright] + apply HilbertBlockVec.ext + · ext i + simp [X, hilbertBlockField] + · ext i + simp [X, hilbertBlockField] + have hsplit : + toHilbertBlockL2OfBlockField (U := U) hAdm.memBlockL2_eval = + H.constantField P0 + (gen Y : HilbertBlockL2 U) := by + calc + toHilbertBlockL2OfBlockField (U := U) hAdm.memBlockL2_eval + = blockVecToHilbertBlockL2Const (U := U) P0 + + (hAdm.toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 := + hAdm.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + _ = H.constantField P0 + (gen Y : HilbertBlockL2 U) := by + rw [hAdmCorr, ← hGen_comp] + simp [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] + have hEnergy : + quadraticEnergy H.energyBilin (H.constantField P0 + (gen Y : HilbertBlockL2 U)) = + blockEnergyAverage U a.1 X := by + rw [← hsplit] + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := X) hAdm.memBlockL2_eval + refine ⟨X, hAdm, ?_⟩ + simpa [blockEnergyAverage] using hEnergy + have hs_nonempty : s.Nonempty := by + refine ⟨quadraticEnergy H.energyBilin (H.constantField P0 + (gen 0 : HilbertBlockL2 U)), ?_⟩ + exact ⟨0, rfl⟩ + have hMu_le_sInf : Mu U P0 a.1 ≤ sInf s := by + apply le_csInf hs_nonempty + intro m hm + exact csInf_le hBddBelow (hs_subset_mu hm) + have hMu_le_candidate : Mu U P0 a.1 ≤ H.muCandidate P0 := by + calc + Mu U P0 a.1 ≤ sInf s := hMu_le_sInf + _ = H.muCandidate P0 := hCandidate_sInf.symm + have hEq : Mu U P0 a.1 = H.muCandidate P0 := + le_antisymm hMu_le_candidate hCandidate_le_Mu + simpa [H, system, U] using hEq + +/-- On a quantitative AEE cube slice, the variational `Mu` is the infimum of +the fixed-competitor block energies along any dense sequence in the canonical +predicate-generated correction submodule. This is the canonical Ch4 bridge +for Ch5 measurability: the competitors are pointwise block states and no +external recovery witness is part of the interface. -/ +theorem mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator_denseSeq + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P0 : BlockVec d) + (ξ : ℕ → canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) + (hξ : DenseRange ξ) : + Mu (cubeSet Q) P0 a.1 = + ⨅ n : ℕ, + blockEnergyAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) P0 (ξ n)) := by + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + let H : MuHilbertRealization U a.1 := system.toMuHilbertRealization + let gen : ℕ → H.correctionSpace.correctionSpace.toSubmodule := fun n => + canonicalMuCorrectionGeneratorEmbedding U (ξ n) + have hgen_dense : DenseRange gen := by + have hEmbDense : + DenseRange (canonicalMuCorrectionGeneratorEmbedding U) := + denseRange_canonicalMuCorrectionGeneratorEmbedding U + have hEmbCont : + Continuous (canonicalMuCorrectionGeneratorEmbedding U) := + continuous_canonicalMuCorrectionGeneratorEmbedding U + have hcomp : DenseRange ((canonicalMuCorrectionGeneratorEmbedding U) ∘ ξ) := + DenseRange.comp hEmbDense hξ hEmbCont + dsimp [gen, H, system, U] + simpa [canonicalAEEMuOperatorSystemData, canonicalAEEMuCorrectionSpaceData, + canonicalAEEPotentialSolenoidalL2Data, MuCorrectionSpaceData.ofSubmoduleClosures, + AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + Function.comp_def] using! hcomp + have hCandidate : + H.muCandidate P0 = + sInf (Set.range fun n : ℕ => + quadraticEnergy H.energyBilin (H.constantField P0 + (gen n : HilbertBlockL2 U))) := by + simpa using H.muCandidate_eq_sInf_quadraticEnergy_denseRange P0 gen hgen_dense + have hEnergy : + ∀ n : ℕ, + quadraticEnergy H.energyBilin (H.constantField P0 + (gen n : HilbertBlockL2 U)) = + blockEnergyAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) P0 (ξ n)) := by + intro n + have hsplit : + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 (ξ n)) = + H.constantField P0 + (gen n : HilbertBlockL2 U) := by + simpa [gen, H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + canonicalMuGeneratorAffineField_hilbert_eq_const_add (U := U) P0 (ξ n) + calc + quadraticEnergy H.energyBilin (H.constantField P0 + (gen n : HilbertBlockL2 U)) + = quadraticEnergy H.energyBilin + (toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 (ξ n))) := by + rw [hsplit] + _ = blockEnergyAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) P0 (ξ n)) := by + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := canonicalMuGeneratorAffineField (U := U) P0 (ξ n)) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 (ξ n)) + calc + Mu (cubeSet Q) P0 a.1 = H.muCandidate P0 := by + simpa [H, system, U] using mu_eq_canonicalAEEMuCandidate Q k a P0 + _ = ⨅ n : ℕ, + quadraticEnergy H.energyBilin (H.constantField P0 + (gen n : HilbertBlockL2 U)) := by + rw [hCandidate, sInf_range] + _ = ⨅ n : ℕ, + blockEnergyAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) P0 (ξ n)) := + iInf_congr hEnergy + +/-- The Hilbert quadratic energy of a canonical dense-generator affine +competitor is exactly its doubled block-energy average. This is the pointwise +energy identity used by countable near-minimizer selections. -/ +theorem canonicalAEEMuOperatorSystemData_quadraticEnergy_generatorAffine_eq_blockEnergyAverage + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P0 : BlockVec d) + (Y : canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) : + let H := ((canonicalAEEMuOperatorSystemData Q k a).toMuHilbertRealization) + quadraticEnergy H.energyBilin + (H.constantField P0 + + (canonicalMuCorrectionGeneratorEmbedding (cubeSet Q) Y : + HilbertBlockL2 (cubeSet Q))) = + blockEnergyAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) P0 Y) := by + let U : Set (Vec d) := cubeSet Q + let system : AEEMuOperatorSystemData U a.1 := canonicalAEEMuOperatorSystemData Q k a + let H : MuHilbertRealization U a.1 := system.toMuHilbertRealization + have hsplit : + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 Y) = + H.constantField P0 + + (canonicalMuCorrectionGeneratorEmbedding U Y : HilbertBlockL2 U) := by + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + canonicalMuGeneratorAffineField_hilbert_eq_const_add (U := U) P0 Y + calc + quadraticEnergy H.energyBilin + (H.constantField P0 + + (canonicalMuCorrectionGeneratorEmbedding U Y : HilbertBlockL2 U)) + = quadraticEnergy H.energyBilin + (toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 Y)) := by + rw [hsplit] + _ = blockEnergyAverage U a.1 + (canonicalMuGeneratorAffineField (U := U) P0 Y) := by + simpa [H, system, AEEMuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := canonicalMuGeneratorAffineField (U := U) P0 Y) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P0 Y) + +/-- Canonical dense-sequence form of +`mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator_denseSeq`, using +`TopologicalSpace.denseSeq` on the canonical generator submodule. -/ +theorem mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator + {d : ℕ} (Q : TriadicCube d) (k : ℕ) + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice (cubeSet Q) k a}) + (P0 : BlockVec d) : + Mu (cubeSet Q) P0 a.1 = + ⨅ n : ℕ, + blockEnergyAverage (cubeSet Q) a.1 + (canonicalMuGeneratorAffineField (U := cubeSet Q) P0 + (TopologicalSpace.denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n)) := by + exact mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator_denseSeq Q k a P0 + (TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q))) + (TopologicalSpace.denseRange_denseSeq + (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q))) + +end CanonicalCubeSet + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CoeffOperatorData.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CoeffOperatorData.lean new file mode 100644 index 0000000000..5878bc2159 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/AEEOperator/CoeffOperatorData.lean @@ -0,0 +1,844 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuAdmissibility +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import Mathlib.Topology.Order.IsLUB + +/-! # Coeff Operator Data -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# A.e.-elliptic coefficient-operator realization data + +This file begins the Chapter 4 Phase 3 replacement for the pointwise +`MuOperatorSystemData` handoff. The old deterministic package is built from +pointwise `IsEllipticFieldOn`; the manuscript-facing support data is only +spatial-a.e. elliptic. The structures below therefore store a measurable +operator representative together with its a.e. agreement with the raw +normalized coefficient operator. +-/ + +/-- +Measurable representative data for the normalized doubled coefficient operator +when the coefficient field is controlled only up to spatial null sets. + +The pointwise `field` is the object used to build the `L²` operator. The +`ae_eq_normalizedBlockCoeffOperator` field records that this representative is +the same as the raw Ch4 coefficient operator on the observation set, modulo the +restricted volume measure. +-/ +structure AEEMuCoeffOperatorData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- Measurability of the underlying domain. -/ + measurableSet_domain : MeasurableSet U + /-- A measurable representative of the normalized coefficient operator. -/ + field : Vec d → HilbertBlockVec d →L[ℝ] HilbertBlockVec d + /-- Measurability of the representative operator field. -/ + measurable_field : Measurable field + /-- The representative agrees a.e. with the raw normalized coefficient operator. -/ + ae_eq_normalizedBlockCoeffOperator : + field =ᵐ[volumeMeasureOn U] normalizedBlockCoeffOperator U a + /-- A uniform operator-norm bound for the representative. -/ + opNormBound : ℝ + /-- Nonnegativity of the bound. -/ + opNormBound_nonneg : 0 ≤ opNormBound + /-- The representative operators are bounded by `opNormBound`. -/ + le_opNormBound : ∀ x : Vec d, ‖field x‖ ≤ opNormBound + /-- Coercivity constant for the induced `L²` operator. -/ + coercivityConstant : ℝ + /-- Positivity of the coercivity constant. -/ + coercivityConstant_pos : 0 < coercivityConstant + /-- A.e. symmetry of the pointwise representative. -/ + ae_field_inner_comm : + ∀ᵐ x ∂ volumeMeasureOn U, + ∀ X Y : HilbertBlockVec d, inner ℝ (field x X) Y = inner ℝ X (field x Y) + /-- A.e. pointwise coercivity of the representative. -/ + ae_field_self_inner_lowerBound : + ∀ᵐ x ∂ volumeMeasureOn U, + ∀ X : HilbertBlockVec d, + coercivityConstant * inner ℝ X X ≤ inner ℝ (field x X) X + +namespace AEEMuCoeffOperatorData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Forget the a.e. identification data and keep the measurable bounded +representative as a pointwise operator field. -/ +def toPointwiseField (M : AEEMuCoeffOperatorData U a) : + PointwiseHilbertBlockOperatorField U where + field := M.field + measurable_field := M.measurable_field + opNormBound := M.opNormBound + opNormBound_nonneg := M.opNormBound_nonneg + le_opNormBound := M.le_opNormBound + +/-- The bounded `L²` operator induced by the measurable representative. -/ +noncomputable def operator (M : AEEMuCoeffOperatorData U a) : + HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U := + M.toPointwiseField.toContinuousLinearMap + +/-- Pointwise a.e. description of the representative-induced `L²` operator. -/ +theorem ae_apply_operator (M : AEEMuCoeffOperatorData U a) + (F : HilbertBlockL2 U) : + M.operator F =ᵐ[volumeMeasureOn U] fun x => M.field x (F x) := + M.toPointwiseField.coeFn_toContinuousLinearMap F + +/-- The representative-induced `L²` operator agrees a.e. with the raw +normalized coefficient operator applied to `F`. -/ +theorem ae_apply_operator_normalizedBlockCoeffOperator + (M : AEEMuCoeffOperatorData U a) (F : HilbertBlockL2 U) : + M.operator F =ᵐ[volumeMeasureOn U] + fun x => normalizedBlockCoeffOperator U a x (F x) := by + filter_upwards [M.ae_apply_operator F, M.ae_eq_normalizedBlockCoeffOperator] + with x hOp hEq + rw [hOp, hEq] + +/-- Symmetry of the `L²` operator induced by the a.e.-symmetric representative. -/ +theorem operatorSymm (M : AEEMuCoeffOperatorData U a) : + LinearMap.IsSymmetric (M.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U) := by + intro F G + rw [MeasureTheory.L2.inner_def, MeasureTheory.L2.inner_def] + apply MeasureTheory.integral_congr_ae + filter_upwards [M.ae_apply_operator F, M.ae_apply_operator G, M.ae_field_inner_comm] + with x hF hG hsymm + simpa [hF, hG] using hsymm (F x) (G x) + +/-- Coercivity of the `L²` operator induced by the a.e.-coercive representative. -/ +theorem operatorCoercive (M : AEEMuCoeffOperatorData U a) : + IsCoercive (energyBilinOfOperator M.operator) := by + refine ⟨M.coercivityConstant, M.coercivityConstant_pos, ?_⟩ + intro F + have hleftInt : + MeasureTheory.Integrable (fun x => + M.coercivityConstant * inner ℝ (F x) (F x)) (volumeMeasureOn U) := by + exact (MeasureTheory.L2.integrable_inner F F).const_mul M.coercivityConstant + have hrightInt : + MeasureTheory.Integrable (fun x => + inner ℝ ((M.operator F) x) (F x)) (volumeMeasureOn U) := by + exact MeasureTheory.L2.integrable_inner (M.operator F) F + have hmono : + ∀ᵐ x ∂ volumeMeasureOn U, + M.coercivityConstant * inner ℝ (F x) (F x) ≤ + inner ℝ ((M.operator F) x) (F x) := by + filter_upwards [M.ae_apply_operator F, M.ae_field_self_inner_lowerBound] + with x hOp hpoint + rw [hOp] + exact hpoint (F x) + calc + M.coercivityConstant * ‖F‖ * ‖F‖ + = ∫ x, M.coercivityConstant * inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + have hnorm : + ‖F‖ * ‖F‖ = + ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + calc + ‖F‖ * ‖F‖ = ‖F‖ ^ 2 := by ring + _ = inner ℝ F F := by + symm + exact real_inner_self_eq_norm_sq F + _ = ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + rw [MeasureTheory.L2.inner_def] + calc + M.coercivityConstant * ‖F‖ * ‖F‖ = + M.coercivityConstant * (‖F‖ * ‖F‖) := by ring + _ = M.coercivityConstant * + ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + rw [hnorm] + _ = ∫ x, M.coercivityConstant * inner ℝ (F x) (F x) + ∂ volumeMeasureOn U := by + rw [← MeasureTheory.integral_const_mul] + _ ≤ ∫ x, inner ℝ ((M.operator F) x) (F x) ∂ volumeMeasureOn U := by + exact MeasureTheory.integral_mono_ae hleftInt hrightInt hmono + _ = energyBilinOfOperator M.operator F F := by + rw [energyBilinOfOperator_apply, MeasureTheory.L2.inner_def] + +/-- Package the a.e.-representative data as the concrete `Mu` operator +realization expected by the Hilbert minimization layer. -/ +noncomputable def toMuOperatorRealization (M : AEEMuCoeffOperatorData U a) : + MuOperatorRealization U a where + operator := M.operator + ae_apply := by + intro F + filter_upwards + [M.ae_apply_operator_normalizedBlockCoeffOperator F, + MeasureTheory.ae_restrict_of_forall_mem M.measurableSet_domain + (fun x hx => normalizedBlockCoeffOperator_apply_of_mem a hx (F x))] + with x hOp hEq + rw [hOp, hEq] + operatorSymm := M.operatorSymm + operatorCoercive := M.operatorCoercive + +private theorem le_normalizedBlockCoeffOperatorNormBound_of_isEllipticMatrix_of_mem + {lam Lam : ℝ} {x : Vec d} (hx : x ∈ U) + (hmat : IsEllipticMatrix lam Lam (a x)) : + ‖normalizedBlockCoeffOperator U a x‖ ≤ + MuCoeffOperatorData.normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam := by + have hA : + ‖HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + apply HilbertBlockVec.opNorm_applyBlockMat_le_of_block_bound + · exact Real.sqrt_nonneg _ + · intro X + have hbound := blockMatrixOfCoeff_image_bound_of_isEllipticMatrix hmat X + calc + blockVecDot (blockMatVecMul (blockCoeffField a x) X) + (blockMatVecMul (blockCoeffField a x) X) + ≤ blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot X X := hbound + _ = (Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam)) ^ 2 * blockVecDot X X := by + rw [Real.sq_sqrt (blockMatrixOfCoeffNormSqBound_nonneg lam Lam)] + rw [MuCoeffOperatorData.normalizedBlockCoeffOperator_eq_of_mem (U := U) a hx] + calc + ‖(MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ + ≤ ‖(MeasureTheory.volume U).toReal⁻¹‖ * + ‖HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ := by + exact + norm_smul_le + (MeasureTheory.volume U).toReal⁻¹ + (HilbertBlockVec.applyBlockMat (blockCoeffField a x)) + _ ≤ ‖(MeasureTheory.volume U).toReal⁻¹‖ * + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + exact mul_le_mul_of_nonneg_left hA (norm_nonneg _) + _ = MuCoeffOperatorData.normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam := by + simp [MuCoeffOperatorData.normalizedBlockCoeffOperatorNormBound] + +private theorem normalizedBlockCoeffOperator_self_inner_lowerBound_of_isEllipticMatrix_of_mem + {lam Lam : ℝ} {x : Vec d} (hx : x ∈ U) + (hmat : IsEllipticMatrix lam Lam (a x)) (X : HilbertBlockVec d) : + ((MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2))) * inner ℝ X X ≤ + inner ℝ (normalizedBlockCoeffOperator U a x X) X := by + have hcoer : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot X.toBlockVec X.toBlockVec ≤ + blockVecDot X.toBlockVec + (blockMatVecMul (blockCoeffField a x) X.toBlockVec) := by + simpa [blockCoeffField] using + (blockMatrixOfCoeff_coercive_of_isEllipticMatrix hmat X.toBlockVec) + have hvol_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have htoBlock : + (((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.ofBlockVec (blockMatVecMul (blockCoeffField a x) X.toBlockVec)).toBlockVec) = + (MeasureTheory.volume U).toReal⁻¹ • + blockMatVecMul (blockCoeffField a x) X.toBlockVec := by + ext i <;> simp [HilbertVec.toVec, mul_add] + rw [normalizedBlockCoeffOperator_apply_of_mem a hx X] + calc + ((MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2))) * inner ℝ X X + = (MeasureTheory.volume U).toReal⁻¹ * + ((lam / (1 + 2 * Lam ^ 2)) * blockVecDot X.toBlockVec X.toBlockVec) := by + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + blockVecDot X.toBlockVec + (blockMatVecMul (blockCoeffField a x) X.toBlockVec) := by + exact mul_le_mul_of_nonneg_left hcoer hvol_nonneg + _ = inner ℝ X ((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) X) := by + rw [HilbertBlockVec.inner_def, HilbertBlockVec.applyBlockMat_apply, htoBlock, + blockVecDot_smul_right] + _ = inner ℝ ((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) X) X := by + rw [real_inner_comm] + +/-- Build a.e.-representative coefficient-operator data from spatial-a.e. +ellipticity on `U`. The representative is obtained coordinatewise from +`AEStronglyMeasurable.mk`, then clamped to the deterministic ellipticity norm +bound; the clamping is invisible a.e. on the elliptic support. -/ +noncomputable def ofIsAEEllipticFieldOn {lam Lam : ℝ} + (hEll : IsAEEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + AEEMuCoeffOperatorData U a := by + classical + let A : Vec d → Mat d := fun x i j => + (hEll.aestronglyMeasurable_restrictCoeffField_apply i j).mk + (fun x : Vec d => restrictCoeffField U a x i j) x + have hA_meas : Measurable A := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + exact (hEll.aestronglyMeasurable_restrictCoeffField_apply i j).measurable_mk + have hentries : ∀ᵐ x ∂ volumeMeasureOn U, + ∀ i j : Fin d, A x i j = restrictCoeffField U a x i j := by + exact eventually_countable_forall.mpr fun i : Fin d => + eventually_countable_forall.mpr fun j : Fin d => + (hEll.aestronglyMeasurable_restrictCoeffField_apply i j).ae_eq_mk.symm + have hA_eq : A =ᵐ[volumeMeasureOn U] fun x => restrictCoeffField U a x := by + filter_upwards [hentries] with x hx + funext i j + exact hx i j + let op0 : Vec d → HilbertBlockVec d →L[ℝ] HilbertBlockVec d := fun x => + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockMatrixOfCoeff (A x)) + have hop0_meas : Measurable op0 := by + have hfull : Measurable (fun x : Vec d => fun α β => + toFullBlockMat (blockMatrixOfCoeff (A x)) α β) := by + exact measurable_toFullBlockMat_blockCoeffField hA_meas + have hmeas : Measurable (fun x : Vec d => + fullEntriesToHilbertOperator d (toFullBlockMat (blockMatrixOfCoeff (A x)))) := by + exact measurable_fullEntriesToHilbertOperator hfull + have hsmul : Measurable (fun x : Vec d => + (MeasureTheory.volume U).toReal⁻¹ • + fullEntriesToHilbertOperator d (toFullBlockMat (blockMatrixOfCoeff (A x)))) := + hmeas.const_smul ((MeasureTheory.volume U).toReal⁻¹) + simpa [op0, fullEntriesToHilbertOperator_toFullBlockMat] using hsmul + have hop0_eq_raw : op0 =ᵐ[volumeMeasureOn U] normalizedBlockCoeffOperator U a := by + filter_upwards [hA_eq] with x hx + apply ContinuousLinearMap.ext + intro X + ext i <;> simp [op0, normalizedBlockCoeffOperator, blockCoeffField, hx, + HilbertBlockVec.applyBlockMat_apply] + let K : ℝ := MuCoeffOperatorData.normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam + let field : Vec d → HilbertBlockVec d →L[ℝ] HilbertBlockVec d := fun x => + if ‖op0 x‖ ≤ K then op0 x else (0 : HilbertBlockVec d →L[ℝ] HilbertBlockVec d) + have hfield_meas : Measurable field := by + have hset : MeasurableSet {x : Vec d | ‖op0 x‖ ≤ K} := by + exact measurableSet_le (continuous_norm.measurable.comp hop0_meas) measurable_const + exact Measurable.ite hset hop0_meas measurable_const + have hK_nonneg : 0 ≤ K := + MuCoeffOperatorData.normalizedBlockCoeffOperatorNormBound_nonneg (d := d) U lam Lam + have hraw_bound : ∀ᵐ x ∂ volumeMeasureOn U, + ‖normalizedBlockCoeffOperator U a x‖ ≤ K := by + filter_upwards [MeasureTheory.ae_restrict_mem hEll.measurableSet, + hEll.ae_isEllipticMatrix] with x hxU hxEll + exact le_normalizedBlockCoeffOperatorNormBound_of_isEllipticMatrix_of_mem + (U := U) (a := a) hxU hxEll + have hfield_eq_raw : field =ᵐ[volumeMeasureOn U] normalizedBlockCoeffOperator U a := by + filter_upwards [hop0_eq_raw, hraw_bound] with x hop0_eq hbound + have hop0_bound : ‖op0 x‖ ≤ K := by + rwa [hop0_eq] + have hfield_x : field x = op0 x := by + change (if ‖op0 x‖ ≤ K then op0 x + else (0 : HilbertBlockVec d →L[ℝ] HilbertBlockVec d)) = op0 x + exact if_pos hop0_bound + rw [hfield_x, hop0_eq] + have hvol_ne_zero : MeasureTheory.volume U ≠ 0 := by + intro hzero + rw [hzero] at hvol + simp at hvol + have hlam_pos : 0 < lam := by + obtain ⟨x, _hxU, hxEll⟩ := + MeasureTheory.Measure.exists_mem_of_measure_ne_zero_of_ae + (μ := MeasureTheory.volume) (s := U) hvol_ne_zero hEll.ae_isEllipticMatrix + exact hxEll.1 + let C : ℝ := (MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2)) + have hC_pos : 0 < C := by + have hvolInv : 0 < (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have hden : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + exact mul_pos hvolInv (div_pos hlam_pos hden) + exact + { measurableSet_domain := hEll.measurableSet + field := field + measurable_field := hfield_meas + ae_eq_normalizedBlockCoeffOperator := hfield_eq_raw + opNormBound := K + opNormBound_nonneg := hK_nonneg + le_opNormBound := by + intro x + by_cases hx : ‖op0 x‖ ≤ K + · have hfield_x : field x = op0 x := by + change (if ‖op0 x‖ ≤ K then op0 x + else (0 : HilbertBlockVec d →L[ℝ] HilbertBlockVec d)) = op0 x + exact if_pos hx + rw [hfield_x] + exact hx + · have hfield_x : field x = 0 := by + change (if ‖op0 x‖ ≤ K then op0 x + else (0 : HilbertBlockVec d →L[ℝ] HilbertBlockVec d)) = + (0 : HilbertBlockVec d →L[ℝ] HilbertBlockVec d) + exact if_neg hx + rw [hfield_x] + rw [norm_zero] + exact hK_nonneg + coercivityConstant := C + coercivityConstant_pos := hC_pos + ae_field_inner_comm := by + filter_upwards [hfield_eq_raw] with x hEq X Y + rw [hEq] + exact MuCoeffOperatorData.normalizedBlockCoeffOperator_inner_comm + (U := U) (a := a) x X Y + ae_field_self_inner_lowerBound := by + filter_upwards [hfield_eq_raw, MeasureTheory.ae_restrict_mem hEll.measurableSet, + hEll.ae_isEllipticMatrix] with x hEq hxU hxEll X + rw [hEq] + exact normalizedBlockCoeffOperator_self_inner_lowerBound_of_isEllipticMatrix_of_mem + (U := U) (a := a) hxU hxEll X } + +/-- The old pointwise deterministic coefficient-operator data embeds in the new +a.e.-representative package. -/ +noncomputable def ofMuCoeffOperatorDataOfIsEllipticFieldOn + (M : MuCoeffOperatorData U a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + AEEMuCoeffOperatorData U a where + measurableSet_domain := M.measurableSet_domain + field := normalizedBlockCoeffOperator U a + measurable_field := M.measurable_normalizedBlockCoeffOperator + ae_eq_normalizedBlockCoeffOperator := Filter.EventuallyEq.rfl + opNormBound := M.opNormBound + opNormBound_nonneg := M.opNormBound_nonneg + le_opNormBound := M.le_opNormBound + coercivityConstant := + (MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2)) + coercivityConstant_pos := by + have hlam : 0 < lam := + MuCoeffOperatorData.lam_pos_of_isEllipticFieldOn + (U := U) (a := a) hEll hvol + have hvolInv : 0 < (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have hden : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + exact mul_pos hvolInv (div_pos hlam hden) + ae_field_inner_comm := + Filter.Eventually.of_forall + (fun x => MuCoeffOperatorData.normalizedBlockCoeffOperator_inner_comm + (U := U) (a := a) x) + ae_field_self_inner_lowerBound := + MeasureTheory.ae_restrict_of_forall_mem M.measurableSet_domain + (fun x hx => + MuCoeffOperatorData.normalizedBlockCoeffOperator_self_inner_lowerBound_of_mem + (U := U) (a := a) hEll hx) + +end AEEMuCoeffOperatorData + +/-- +A.e.-representative operator-system data for the doubled `\mu` problem on `U`. + +This is the Phase 3 target API: it has the same Hilbert-minimization output as +`MuOperatorSystemData`, but its coefficient operator is allowed to be a +measurable representative of the raw coefficient field. +-/ +structure AEEMuOperatorSystemData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- The closed correction space `\Lpoto(U) × \Lsolo(U)`. -/ + correctionSpace : MuCorrectionSpaceData U + /-- A.e.-representative coefficient-operator data. -/ + coeffOperatorData : AEEMuCoeffOperatorData U a + +namespace AEEMuOperatorSystemData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- The concrete doubled operator realization extracted from the AEE system +package. -/ +noncomputable def toMuOperatorRealization (M : AEEMuOperatorSystemData U a) : + MuOperatorRealization U a := + M.coeffOperatorData.toMuOperatorRealization + +/-- The concrete Hilbert-space realization of the doubled `\mu` problem +extracted from the AEE system package. -/ +noncomputable def toMuHilbertRealization + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (M : AEEMuOperatorSystemData U a) : + MuHilbertRealization U a := + M.toMuOperatorRealization.toMuHilbertRealization M.correctionSpace + +end AEEMuOperatorSystemData + +namespace MuHilbertRealization + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- The Hilbert minimizer value is the infimum of the quadratic energy over the +whole affine correction space. -/ +theorem muCandidate_eq_sInf_quadraticEnergy_correctionSpace + (H : MuHilbertRealization U a) (P : BlockVec d) : + H.muCandidate P = + sInf (Set.range fun Y : H.correctionSpace.correctionSpace.toSubmodule => + quadraticEnergy H.energyBilin (H.constantField P + (Y : HilbertBlockL2 U))) := by + let f : H.correctionSpace.correctionSpace.toSubmodule → ℝ := fun Y => + quadraticEnergy H.energyBilin (H.constantField P + (Y : HilbertBlockL2 U)) + let s : Set ℝ := Set.range f + have hs_nonempty : s.Nonempty := by + refine ⟨f ⟨H.minimizerMap P - H.constantField P, H.sub_minimizerMap_apply_mem P⟩, ?_⟩ + exact ⟨⟨H.minimizerMap P - H.constantField P, H.sub_minimizerMap_apply_mem P⟩, rfl⟩ + have h_lower : ∀ m ∈ s, H.muCandidate P ≤ m := by + intro m hm + rcases hm with ⟨Y, rfl⟩ + have hcorr : + H.constantField P + (Y : HilbertBlockL2 U) - H.constantField P ∈ + H.correctionSpace.correctionSpace := by + have hsub : + H.constantField P + (Y : HilbertBlockL2 U) - H.constantField P = + (Y : HilbertBlockL2 U) := by + abel + rw [hsub] + exact Y.property + simpa [f] using H.muCandidate_le_quadraticEnergy P + (H.constantField P + (Y : HilbertBlockL2 U)) hcorr + have hs_bddBelow : BddBelow s := ⟨H.muCandidate P, h_lower⟩ + apply le_antisymm + · exact le_csInf hs_nonempty h_lower + · have hmem : + f ⟨H.minimizerMap P - H.constantField P, + H.sub_minimizerMap_apply_mem P⟩ ∈ s := by + exact ⟨⟨H.minimizerMap P - H.constantField P, H.sub_minimizerMap_apply_mem P⟩, rfl⟩ + calc + sInf s ≤ + f ⟨H.minimizerMap P - H.constantField P, + H.sub_minimizerMap_apply_mem P⟩ := csInf_le hs_bddBelow hmem + _ = H.muCandidate P := by + have hadd : + H.constantField P + (H.minimizerMap P - H.constantField P) = + H.minimizerMap P := by + abel + change quadraticEnergy H.energyBilin + (H.constantField P + (H.minimizerMap P - H.constantField P)) = + H.muCandidate P + rw [hadd] + rfl + +/-- Dense correction-space subsets may be used to compute the Hilbert minimizer +value. -/ +theorem muCandidate_eq_sInf_quadraticEnergy_denseRange + (H : MuHilbertRealization U a) (P : BlockVec d) + {β : Type*} [TopologicalSpace β] [Nonempty β] + (g : β → H.correctionSpace.correctionSpace.toSubmodule) + (hg : DenseRange g) : + H.muCandidate P = + sInf (Set.range fun Y : β => + quadraticEnergy H.energyBilin (H.constantField P + (g Y : HilbertBlockL2 U))) := by + let f : H.correctionSpace.correctionSpace.toSubmodule → ℝ := fun Y => + quadraticEnergy H.energyBilin (H.constantField P + (Y : HilbertBlockL2 U)) + let s : Set ℝ := Set.range fun Y : β => f (g Y) + let t : Set ℝ := Set.range f + have hs_nonempty : s.Nonempty := by + refine ⟨f (g (Classical.arbitrary β)), ?_⟩ + exact ⟨Classical.arbitrary β, rfl⟩ + have hs_subset : s ⊆ t := by + rintro x ⟨Y, rfl⟩ + exact ⟨g Y, rfl⟩ + have h_dense : Dense (Set.range g) := hg + have h_image_eq : f '' Set.range g = s := by + ext x + constructor + · rintro ⟨Y, ⟨Z, rfl⟩, rfl⟩ + exact ⟨Z, rfl⟩ + · rintro ⟨Y, rfl⟩ + exact ⟨g Y, ⟨Y, rfl⟩, rfl⟩ + have hf : Continuous f := by + apply (quadraticEnergy_continuous H.energyBilin).comp + have h : Continuous (fun Y : H.correctionSpace.correctionSpace.toSubmodule => + H.constantField P + (Y : HilbertBlockL2 U)) := + continuous_const.add continuous_subtype_val + simpa [f] using h + have ht_subset_closure : t ⊆ closure s := by + rw [← h_image_eq] + simpa [f, t] using hf.range_subset_closure_image_dense h_dense + have ht_nonempty : t.Nonempty := by + refine ⟨f ⟨H.minimizerMap P - H.constantField P, H.sub_minimizerMap_apply_mem P⟩, ?_⟩ + exact ⟨⟨H.minimizerMap P - H.constantField P, H.sub_minimizerMap_apply_mem P⟩, rfl⟩ + have h_lower : ∀ m ∈ t, H.muCandidate P ≤ m := by + intro m hm + rcases hm with ⟨Y, rfl⟩ + have hcorr : + H.constantField P + (Y : HilbertBlockL2 U) - H.constantField P ∈ + H.correctionSpace.correctionSpace := by + have hsub : + H.constantField P + (Y : HilbertBlockL2 U) - H.constantField P = + (Y : HilbertBlockL2 U) := by + abel + rw [hsub] + exact Y.property + simpa [f] using H.muCandidate_le_quadraticEnergy P + (H.constantField P + (Y : HilbertBlockL2 U)) hcorr + have ht_bddBelow : BddBelow t := ⟨H.muCandidate P, h_lower⟩ + have ht_isGLB : IsGLB t (H.muCandidate P) := by + rw [H.muCandidate_eq_sInf_quadraticEnergy_correctionSpace P] + exact isGLB_csInf ht_nonempty ht_bddBelow + have hs_isGLB : IsGLB s (H.muCandidate P) := + (isGLB_iff_of_subset_of_subset_closure hs_subset ht_subset_closure).2 ht_isGLB + symm + exact hs_isGLB.csInf_eq hs_nonempty + +end MuHilbertRealization + +namespace PotentialSolenoidalL2Data + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Transport an element of the closed block correction space into the Hilbert +correction space. -/ +noncomputable def submoduleClosureToMuCorrectionSpace + (M : PotentialSolenoidalL2Data U) : + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule → + M.toMuCorrectionSpaceData.correctionSpace.toSubmodule := + fun X => ⟨blockL2ToHilbertBlockL2 (U := U) X, by + show + hilbertBlockL2ToBlockL2 (U := U) + (blockL2ToHilbertBlockL2 (U := U) X) ∈ + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace + rw [hilbertBlockL2ToBlockL2_blockL2ToHilbertBlockL2] + exact X.property⟩ + +theorem continuous_submoduleClosureToMuCorrectionSpace + (M : PotentialSolenoidalL2Data U) : + Continuous (M.submoduleClosureToMuCorrectionSpace) := by + apply Continuous.subtype_mk + exact (blockL2ToHilbertBlockL2 (U := U)).continuous.comp continuous_subtype_val + +theorem surjective_submoduleClosureToMuCorrectionSpace + (M : PotentialSolenoidalL2Data U) : + Function.Surjective M.submoduleClosureToMuCorrectionSpace := by + intro Y + refine ⟨⟨hilbertBlockL2ToBlockL2 (U := U) Y, Y.property⟩, ?_⟩ + apply Subtype.ext + change + blockL2ToHilbertBlockL2 (U := U) + (hilbertBlockL2ToBlockL2 (U := U) (Y : HilbertBlockL2 U)) = + Y + exact blockL2ToHilbertBlockL2_hilbertBlockL2ToBlockL2 (U := U) Y + +end PotentialSolenoidalL2Data + +section CanonicalClosureGenerator + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The predicate-generated block correction submodule before topological +closure. -/ +abbrev canonicalMuBlockCorrectionGeneratorSubmodule (U : Set (Vec d)) : + Submodule ℝ (BlockL2 U) := + PotentialSolenoidalL2Data.blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U + +/-- Embed predicate-generated block corrections into the canonical Hilbert +correction space. -/ +noncomputable def canonicalMuCorrectionGeneratorEmbedding (U : Set (Vec d)) : + canonicalMuBlockCorrectionGeneratorSubmodule U → + (MuCorrectionSpaceData.ofSubmoduleClosures U).correctionSpace.toSubmodule := + by + intro Y + exact + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).submoduleClosureToMuCorrectionSpace + ⟨Y, by + change (Y : BlockL2 U) ∈ + (PotentialSolenoidalL2Data.blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U).closure + exact subset_closure Y.property⟩ + +theorem denseRange_canonicalMuCorrectionGeneratorEmbedding (U : Set (Vec d)) : + DenseRange (canonicalMuCorrectionGeneratorEmbedding U) := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let S : Set (BlockL2 U) := + (PotentialSolenoidalL2Data.blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U : + Set (BlockL2 U)) + let T : Set (BlockL2 U) := + ((PotentialSolenoidalL2Data.blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U).closure : + Set (BlockL2 U)) + let incl : S → T := Set.inclusion (by + intro x hx + exact subset_closure hx) + let post : T → (MuCorrectionSpaceData.ofSubmoduleClosures U).correctionSpace.toSubmodule := + fun X => M.submoduleClosureToMuCorrectionSpace X + have hincl : DenseRange incl := by + rw [denseRange_inclusion_iff] + all_goals + first + | (intro x hx; exact hx) + | (intro x hx; exact subset_closure hx) + have hpost : DenseRange post := by + have hsurj : Function.Surjective post := by + intro Y + rcases M.surjective_submoduleClosureToMuCorrectionSpace Y with ⟨X, hX⟩ + refine ⟨⟨X, X.property⟩, ?_⟩ + exact hX + exact hsurj.denseRange + have hpost_cont : Continuous post := by + exact M.continuous_submoduleClosureToMuCorrectionSpace + have hcomp : DenseRange (post ∘ incl) := DenseRange.comp hpost hincl hpost_cont + have hfun : (post ∘ incl) = fun Y => canonicalMuCorrectionGeneratorEmbedding U Y := by + funext Y + rfl + rw [hfun] at hcomp + exact hcomp + +/-- A pointwise representative for one predicate-generated canonical block +correction. This is intentionally weaker than full recovery data: it only +chooses representatives for the dense generating submodule, not for every +element of the closed correction space. -/ +structure CanonicalMuGeneratorRepresentativeData + (U : Set (Vec d)) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) where + correction : CorrectionFieldData U + toBlockL2_eq : correction.toBlockL2 = (Y : BlockL2 U) + +/-- Choose a pointwise representative for a canonical dense-generator +correction. -/ +noncomputable def canonicalMuGeneratorRepresentative + (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + CanonicalMuGeneratorRepresentativeData U Y := by + classical + let f : Vec d → Vec d := Classical.choose Y.property + let hf_tail := Classical.choose_spec Y.property + let g : Vec d → Vec d := Classical.choose hf_tail + let hg_tail := Classical.choose_spec hf_tail + let hf : MemVectorL2 U f := Classical.choose hg_tail + let hrest_f := Classical.choose_spec hg_tail + let hg : MemVectorL2 U g := Classical.choose hrest_f + let hrest := Classical.choose_spec hrest_f + have hY : toBlockL2OfComponents hf hg = (Y : BlockL2 U) := hrest.1 + have hpot : IsPotentialZeroTraceOn U f := hrest.2.1 + have hsol : IsSolenoidalZeroNormalTraceOn U g := hrest.2.2 + refine + { correction := + { potential := f + flux := g + potential_memL2 := hf + flux_memL2 := hg + isPotentialZeroTrace := hpot + isSolenoidalZeroNormalTrace := hsol } + toBlockL2_eq := ?_ } + simpa [CorrectionFieldData.toBlockL2, CorrectionFieldData.toBlockField, + toBlockL2OfComponents] using hY + +/-- The chosen generator representative as correction-field data. -/ +noncomputable def canonicalMuGeneratorCorrectionFieldData + (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + CorrectionFieldData U := + (canonicalMuGeneratorRepresentative (U := U) Y).correction + +theorem canonicalMuGeneratorCorrectionFieldData_toBlockL2 + (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toBlockL2 = (Y : BlockL2 U) := + (canonicalMuGeneratorRepresentative (U := U) Y).toBlockL2_eq + +theorem canonicalMuCorrectionGeneratorEmbedding_eq_toHilbertBlockL2 + (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + (canonicalMuCorrectionGeneratorEmbedding U Y : HilbertBlockL2 U) = + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toHilbertBlockL2 := by + calc + (canonicalMuCorrectionGeneratorEmbedding U Y : HilbertBlockL2 U) + = blockL2ToHilbertBlockL2 (U := U) (Y : BlockL2 U) := rfl + _ = blockL2ToHilbertBlockL2 (U := U) + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toBlockL2 := by + rw [canonicalMuGeneratorCorrectionFieldData_toBlockL2 (U := U) Y] + _ = (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toHilbertBlockL2 := + CorrectionFieldData.blockL2ToHilbertBlockL2_toBlockL2 + (canonicalMuGeneratorCorrectionFieldData (U := U) Y) + +@[simp] theorem canonicalMuCorrectionGeneratorEmbedding_zero : + canonicalMuCorrectionGeneratorEmbedding U + (0 : canonicalMuBlockCorrectionGeneratorSubmodule U) = 0 := by + apply Subtype.ext + change blockL2ToHilbertBlockL2 (U := U) (0 : BlockL2 U) = 0 + simp + +/-- The affine block state associated to a dense-generator correction. -/ +noncomputable def canonicalMuGeneratorAffineField + (P : BlockVec d) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + BlockState d := + let Z := canonicalMuGeneratorCorrectionFieldData (U := U) Y + { potential := fun x => P.1 + Z.potential x + flux := fun x => P.2 + Z.flux x } + +theorem canonicalMuGeneratorAffineField_admissible + (P : BlockVec d) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + IsBlockMuAdmissible U P (canonicalMuGeneratorAffineField (U := U) P Y) := by + let Z := canonicalMuGeneratorCorrectionFieldData (U := U) Y + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [canonicalMuGeneratorAffineField, Z, sub_eq_add_neg, add_assoc, add_comm] using + Z.potential_memL2 + · simpa [canonicalMuGeneratorAffineField, Z, sub_eq_add_neg, add_assoc, add_comm] using + Z.isPotentialZeroTrace + · simpa [canonicalMuGeneratorAffineField, Z, sub_eq_add_neg, add_assoc, add_comm] using + Z.flux_memL2 + · simpa [canonicalMuGeneratorAffineField, Z, sub_eq_add_neg, add_assoc, add_comm] using + Z.isSolenoidalZeroNormalTrace + +theorem canonicalMuGeneratorAffineField_memBlockL2 + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (P : BlockVec d) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + MemBlockL2 U (canonicalMuGeneratorAffineField (U := U) P Y).eval := + (canonicalMuGeneratorAffineField_admissible (U := U) P Y).memBlockL2_eval + +theorem canonicalMuGeneratorAffineField_correction_eq + (P : BlockVec d) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + ((canonicalMuGeneratorAffineField_admissible (U := U) P Y).toCorrectionFieldDataOfAdmissible).toHilbertBlockL2 = + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toHilbertBlockL2 := by + let Z := canonicalMuGeneratorCorrectionFieldData (U := U) Y + change + toHilbertBlockL2OfComponents + (canonicalMuGeneratorAffineField_admissible (U := U) P Y).potentialCorrection_memL2 + (canonicalMuGeneratorAffineField_admissible (U := U) P Y).fluxCorrection_memL2 = + Z.toHilbertBlockL2 + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfComponents (U := U) + (f := fun x => (canonicalMuGeneratorAffineField (U := U) P Y).potential x - P.1) + (g := fun x => (canonicalMuGeneratorAffineField (U := U) P Y).flux x - P.2) + (canonicalMuGeneratorAffineField_admissible (U := U) P Y).potentialCorrection_memL2 + (canonicalMuGeneratorAffineField_admissible (U := U) P Y).fluxCorrection_memL2, + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).coeFn_toHilbertBlockL2] + with x hleft hright + rw [hleft, hright] + apply HilbertBlockVec.ext + · ext i + simp [canonicalMuGeneratorAffineField, hilbertBlockField] + · ext i + simp [canonicalMuGeneratorAffineField, hilbertBlockField] + +theorem canonicalMuGeneratorAffineField_hilbert_eq_const_add + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (P : BlockVec d) (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P Y) = + blockVecToHilbertBlockL2Const (U := U) P + + canonicalMuCorrectionGeneratorEmbedding U Y := by + have hAdm := canonicalMuGeneratorAffineField_admissible (U := U) P Y + calc + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) P Y) + = blockVecToHilbertBlockL2Const (U := U) P + + hAdm.toCorrectionFieldDataOfAdmissible.toHilbertBlockL2 := by + exact hAdm.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + _ = blockVecToHilbertBlockL2Const (U := U) P + + (canonicalMuGeneratorCorrectionFieldData (U := U) Y).toHilbertBlockL2 := by + rw [canonicalMuGeneratorAffineField_correction_eq (U := U) P Y] + _ = blockVecToHilbertBlockL2Const (U := U) P + + canonicalMuCorrectionGeneratorEmbedding U Y := by + rw [canonicalMuCorrectionGeneratorEmbedding_eq_toHilbertBlockL2 (U := U) Y] + +theorem canonicalMuGeneratorAffineField_zero_hilbert_eq + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (Y : canonicalMuBlockCorrectionGeneratorSubmodule U) : + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 (U := U) (0 : BlockVec d) Y) = + canonicalMuCorrectionGeneratorEmbedding U Y := by + simpa using + canonicalMuGeneratorAffineField_hilbert_eq_const_add + (U := U) (P := (0 : BlockVec d)) Y + +theorem canonicalMuGeneratorAffineField_zeroCorrection_hilbert_eq_const + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (P : BlockVec d) : + toHilbertBlockL2OfBlockField (U := U) + (canonicalMuGeneratorAffineField_memBlockL2 + (U := U) P (0 : canonicalMuBlockCorrectionGeneratorSubmodule U)) = + blockVecToHilbertBlockL2Const (U := U) P := by + simpa using + canonicalMuGeneratorAffineField_hilbert_eq_const_add + (U := U) (P := P) (0 : canonicalMuBlockCorrectionGeneratorSubmodule U) + +theorem continuous_canonicalMuCorrectionGeneratorEmbedding (U : Set (Vec d)) : + Continuous (canonicalMuCorrectionGeneratorEmbedding U) := by + apply Continuous.subtype_mk + exact (blockL2ToHilbertBlockL2 (U := U)).continuous.comp continuous_subtype_val + +instance canonicalMuBlockCorrectionGeneratorSubmodule_separable (U : Set (Vec d)) : + TopologicalSpace.SeparableSpace (canonicalMuBlockCorrectionGeneratorSubmodule U) := by + let : Fact ((1 : ENNReal) ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + let : Fact ((2 : ENNReal) ≠ ⊤) := ⟨by norm_num⟩ + infer_instance + +end CanonicalClosureGenerator +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/CoeffOperator.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/CoeffOperator.lean new file mode 100644 index 0000000000..0295295c25 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/CoeffOperator.lean @@ -0,0 +1,698 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.HilbertOperator + +/-! # Coeff Operator -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu operator -- coefficient-operator realization and system APIs + +MuCoeffOperatorData structure and namespace with measurability, +uniform-bound, operator / operatorSymm / operatorCoercive constructors +under IsEllipticFieldOn, the blockPairing / blockEnergy integrability +lemmas, and the MuOperatorRealization / MuOperatorSystemData / +PotentialSolenoidalL2Data namespaces that feed into the Mu-recovery +layer. +-/ + +/-- +Measurability and uniform boundedness package for the normalized doubled +coefficient operator attached to `a`. + +This is the remaining analytic input needed to turn `x ↦ \mathbf A(a,x)` into a +concrete `MuOperatorRealization U a`. +-/ +structure MuCoeffOperatorData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- Measurability of the underlying domain. -/ + measurableSet_domain : MeasurableSet U + /-- Measurability of the normalized pointwise coefficient operator. -/ + measurable_normalizedBlockCoeffOperator : + Measurable (normalizedBlockCoeffOperator U a) + /-- A uniform operator-norm bound. -/ + opNormBound : ℝ + /-- Nonnegativity of the bound. -/ + opNormBound_nonneg : 0 ≤ opNormBound + /-- The normalized coefficient operators are bounded by `opNormBound`. -/ + le_opNormBound : + ∀ x : Vec d, ‖normalizedBlockCoeffOperator U a x‖ ≤ opNormBound + +namespace MuCoeffOperatorData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +noncomputable def normalizedBlockCoeffOperatorNormBound + (U : Set (Vec d)) (lam Lam : ℝ) : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) + +theorem normalizedBlockCoeffOperatorNormBound_nonneg + (U : Set (Vec d)) (lam Lam : ℝ) : + 0 ≤ normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam := by + unfold normalizedBlockCoeffOperatorNormBound + positivity + +theorem normalizedBlockCoeffOperator_eq_of_mem (a : CoeffField d) {x : Vec d} + (hx : x ∈ U) : + normalizedBlockCoeffOperator U a x = + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) := by + apply ContinuousLinearMap.ext + intro X + exact normalizedBlockCoeffOperator_apply_of_mem a hx X + +@[simp] private theorem normalizedBlockCoeffOperator_eq_zero_of_not_mem (a : CoeffField d) + {x : Vec d} (hx : x ∉ U) : + normalizedBlockCoeffOperator U a x = 0 := by + apply ContinuousLinearMap.ext + intro X + ext <;> simp [normalizedBlockCoeffOperator, blockCoeffField, restrictCoeffField, hx, + HilbertBlockVec.applyBlockMat_apply, blockMatrixOfCoeff, blockMatVecMul, matVecMul, + matTranspose, Matrix.inv_zero] + +theorem measurable_normalizedBlockCoeffOperator_of_isEllipticFieldOn + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + Measurable (normalizedBlockCoeffOperator U a) := by + classical + have hrestrict : Measurable (fun x i j => restrictCoeffField U a x i j) := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + convert (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) using 1 + funext x + by_cases hx : x ∈ U <;> simp [restrictCoeffField, hx] + have hfull : + Measurable (fun x α β => + toFullBlockMat (blockCoeffField (restrictCoeffField U a) x) α β) := by + simpa [blockCoeffField] using + measurable_toFullBlockMat_blockCoeffField (d := d) hrestrict + have hop : + Measurable (fun x => + fullEntriesToHilbertOperator d + (toFullBlockMat (blockCoeffField (restrictCoeffField U a) x))) := by + exact measurable_fullEntriesToHilbertOperator hfull + simpa [normalizedBlockCoeffOperator, fullEntriesToHilbertOperator_toFullBlockMat] using! + (measurable_const : Measurable (fun _ : Vec d => (MeasureTheory.volume U).toReal⁻¹)).smul hop + +theorem le_normalizedBlockCoeffOperatorNormBound_of_isEllipticFieldOn + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) (x : Vec d) : + ‖normalizedBlockCoeffOperator U a x‖ ≤ + normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam := by + by_cases hx : x ∈ U + · have hA : + ‖HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + apply HilbertBlockVec.opNorm_applyBlockMat_le_of_block_bound + · exact Real.sqrt_nonneg _ + · intro X + have hbound := + blockMatrixOfCoeff_image_bound_of_isEllipticMatrix (hEll.2 x hx) X + calc + blockVecDot (blockMatVecMul (blockCoeffField a x) X) + (blockMatVecMul (blockCoeffField a x) X) + ≤ blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot X X := hbound + _ = (Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam)) ^ 2 * blockVecDot X X := by + rw [Real.sq_sqrt (blockMatrixOfCoeffNormSqBound_nonneg lam Lam)] + rw [normalizedBlockCoeffOperator_eq_of_mem (U := U) a hx] + calc + ‖(MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ + ≤ ‖(MeasureTheory.volume U).toReal⁻¹‖ * + ‖HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ := by + exact + norm_smul_le + (MeasureTheory.volume U).toReal⁻¹ + (HilbertBlockVec.applyBlockMat (blockCoeffField a x)) + _ ≤ ‖(MeasureTheory.volume U).toReal⁻¹‖ * + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + exact mul_le_mul_of_nonneg_left hA (norm_nonneg _) + _ = normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam := by + simp [normalizedBlockCoeffOperatorNormBound] + · rw [normalizedBlockCoeffOperator_eq_zero_of_not_mem (U := U) a hx] + rw [norm_zero] + exact normalizedBlockCoeffOperatorNormBound_nonneg (d := d) U lam Lam + +/-- Concrete measurable/bounded coefficient-operator data built directly from the +ellipticity assumptions recorded in `IsEllipticFieldOn`. -/ +noncomputable def ofIsEllipticFieldOn {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) : + MuCoeffOperatorData U a where + measurableSet_domain := measurableSet_of_isEllipticFieldOn hEll + measurable_normalizedBlockCoeffOperator := + measurable_normalizedBlockCoeffOperator_of_isEllipticFieldOn hEll + opNormBound := normalizedBlockCoeffOperatorNormBound (d := d) U lam Lam + opNormBound_nonneg := normalizedBlockCoeffOperatorNormBound_nonneg (d := d) U lam Lam + le_opNormBound := le_normalizedBlockCoeffOperatorNormBound_of_isEllipticFieldOn hEll + +/-- View the normalized coefficient operator as a uniformly bounded measurable +pointwise `L²` operator field. -/ +noncomputable def toPointwiseField (M : MuCoeffOperatorData U a) : + PointwiseHilbertBlockOperatorField U where + field := normalizedBlockCoeffOperator U a + measurable_field := M.measurable_normalizedBlockCoeffOperator + opNormBound := M.opNormBound + opNormBound_nonneg := M.opNormBound_nonneg + le_opNormBound := M.le_opNormBound + +/-- The bounded `L²` operator induced by the normalized coefficient field. -/ +noncomputable def operator (M : MuCoeffOperatorData U a) : + HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U := + M.toPointwiseField.toContinuousLinearMap + +theorem ae_apply_operator (M : MuCoeffOperatorData U a) + (F : HilbertBlockL2 U) : + M.operator F =ᵐ[volumeMeasureOn U] + fun x => normalizedBlockCoeffOperator U a x (F x) := + M.toPointwiseField.coeFn_toContinuousLinearMap F + +theorem normalizedBlockCoeffOperator_inner_comm (x : Vec d) + (X Y : HilbertBlockVec d) : + inner ℝ (normalizedBlockCoeffOperator U a x X) Y = + inner ℝ X (normalizedBlockCoeffOperator U a x Y) := by + let B : BlockMat d := blockCoeffField (restrictCoeffField U a) x + let c : ℝ := (MeasureTheory.volume U).toReal⁻¹ + have hcomm : + blockVecDot Y.toBlockVec (blockMatVecMul B X.toBlockVec) = + blockVecDot X.toBlockVec (blockMatVecMul B Y.toBlockVec) := by + simpa [B, blockCoeffField] using! + (blockVecDot_blockMatVecMul_blockMatrixOfCoeff_comm ((restrictCoeffField U a) x) + Y.toBlockVec X.toBlockVec) + have htoBlockX : + ((c • HilbertBlockVec.ofBlockVec (blockMatVecMul B X.toBlockVec)).toBlockVec) = + c • blockMatVecMul B X.toBlockVec := by + ext i <;> simp [c, B, HilbertVec.toVec, mul_add] + have htoBlockY : + ((c • HilbertBlockVec.ofBlockVec (blockMatVecMul B Y.toBlockVec)).toBlockVec) = + c • blockMatVecMul B Y.toBlockVec := by + ext i <;> simp [c, B, HilbertVec.toVec, mul_add] + rw [real_inner_comm, normalizedBlockCoeffOperator_apply, normalizedBlockCoeffOperator_apply, + HilbertBlockVec.inner_def, HilbertBlockVec.inner_def, + HilbertBlockVec.applyBlockMat_apply, HilbertBlockVec.applyBlockMat_apply, + htoBlockX, htoBlockY, blockVecDot_smul_right, blockVecDot_smul_right] + exact congrArg (fun t => c * t) hcomm + +theorem normalizedBlockCoeffOperator_self_inner_lowerBound_of_mem + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} (hx : x ∈ U) + (X : HilbertBlockVec d) : + ((MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2))) * inner ℝ X X ≤ + inner ℝ (normalizedBlockCoeffOperator U a x X) X := by + have hcoer : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot X.toBlockVec X.toBlockVec ≤ + blockVecDot X.toBlockVec + (blockMatVecMul (blockCoeffField a x) X.toBlockVec) := by + simpa [blockCoeffField] using + (blockMatrixOfCoeff_coercive_of_isEllipticMatrix (hEll.2 x hx) X.toBlockVec) + have hvol_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have htoBlock : + (((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.ofBlockVec (blockMatVecMul (blockCoeffField a x) X.toBlockVec)).toBlockVec) = + (MeasureTheory.volume U).toReal⁻¹ • + blockMatVecMul (blockCoeffField a x) X.toBlockVec := by + ext i <;> simp [HilbertVec.toVec, mul_add] + rw [normalizedBlockCoeffOperator_apply_of_mem a hx X] + calc + ((MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2))) * inner ℝ X X + = (MeasureTheory.volume U).toReal⁻¹ * + ((lam / (1 + 2 * Lam ^ 2)) * blockVecDot X.toBlockVec X.toBlockVec) := by + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + blockVecDot X.toBlockVec + (blockMatVecMul (blockCoeffField a x) X.toBlockVec) := by + exact mul_le_mul_of_nonneg_left hcoer hvol_nonneg + _ = inner ℝ X ((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) X) := by + rw [HilbertBlockVec.inner_def, HilbertBlockVec.applyBlockMat_apply, htoBlock, + blockVecDot_smul_right] + _ = inner ℝ ((MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) X) X := by + rw [real_inner_comm] + +theorem nonempty_of_volume_toReal_pos + (hvol : 0 < (MeasureTheory.volume U).toReal) : U.Nonempty := by + by_contra hEmpty + have hU : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hEmpty + simp [hU] at hvol + +theorem lam_pos_of_isEllipticFieldOn {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : 0 < lam := by + rcases nonempty_of_volume_toReal_pos (U := U) hvol with ⟨x, hx⟩ + exact (hEll.2 x hx).1 + +theorem operatorSymm (M : MuCoeffOperatorData U a) : + LinearMap.IsSymmetric (M.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U) := by + intro F G + rw [MeasureTheory.L2.inner_def, MeasureTheory.L2.inner_def] + apply MeasureTheory.integral_congr_ae + filter_upwards [M.ae_apply_operator F, M.ae_apply_operator G, Filter.Eventually.of_forall + (fun x => normalizedBlockCoeffOperator_inner_comm (U := U) (a := a) x (F x) (G x))] + with x hF hG hsymm + simpa [hF, hG] using hsymm + +theorem operatorCoercive_of_isEllipticFieldOn (M : MuCoeffOperatorData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + IsCoercive (energyBilinOfOperator M.operator) := by + let C : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * (lam / (1 + 2 * Lam ^ 2)) + refine ⟨C, ?_, ?_⟩ + · have hlam : 0 < lam := lam_pos_of_isEllipticFieldOn (U := U) (a := a) hEll hvol + have hvolInv : 0 < (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have hden : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + dsimp [C] + exact mul_pos hvolInv (div_pos hlam hden) + · intro F + have hleftInt : + MeasureTheory.Integrable (fun x => + C * inner ℝ (F x) (F x)) (volumeMeasureOn U) := by + exact (MeasureTheory.L2.integrable_inner F F).const_mul C + have hrightInt : + MeasureTheory.Integrable (fun x => + inner ℝ ((M.operator F) x) (F x)) (volumeMeasureOn U) := by + exact MeasureTheory.L2.integrable_inner (M.operator F) F + have hmono : + ∀ᵐ x ∂ volumeMeasureOn U, + C * inner ℝ (F x) (F x) ≤ + inner ℝ ((M.operator F) x) (F x) := by + filter_upwards + [M.ae_apply_operator F, + MeasureTheory.ae_restrict_of_forall_mem M.measurableSet_domain + (fun x hx => + normalizedBlockCoeffOperator_self_inner_lowerBound_of_mem + (U := U) (a := a) hEll hx (F x))] + with x hOp hpoint + rw [hOp] + simpa [C] using hpoint + calc + C * ‖F‖ * ‖F‖ + = ∫ x, C * inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + have hnorm : + ‖F‖ * ‖F‖ = + ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + calc + ‖F‖ * ‖F‖ = ‖F‖ ^ 2 := by ring + _ = inner ℝ F F := by + symm + exact real_inner_self_eq_norm_sq F + _ = ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + rw [MeasureTheory.L2.inner_def] + calc + C * ‖F‖ * ‖F‖ = C * (‖F‖ * ‖F‖) := by ring + _ = C * ∫ x, inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by rw [hnorm] + _ = ∫ x, C * inner ℝ (F x) (F x) ∂ volumeMeasureOn U := by + rw [← MeasureTheory.integral_const_mul] + _ ≤ ∫ x, inner ℝ ((M.operator F) x) (F x) ∂ volumeMeasureOn U := by + exact MeasureTheory.integral_mono_ae hleftInt hrightInt hmono + _ = energyBilinOfOperator M.operator F F := by + rw [energyBilinOfOperator_apply, MeasureTheory.L2.inner_def] + +end MuCoeffOperatorData + +/-- +The unnormalized pointwise doubled coefficient operator attached to `a`, +viewed as a bounded measurable operator field on the Hilbert block carrier. + +This auxiliary field is used only to prove integrability of the raw pairing +`X · A(a,x) Y` from block `L²` control and ellipticity. +-/ +noncomputable def rawBlockCoeffOperatorField {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + PointwiseHilbertBlockOperatorField U where + field := fun x => HilbertBlockVec.applyBlockMat (blockCoeffField (restrictCoeffField U a) x) + measurable_field := by + have hrestrict : Measurable (fun x i j => restrictCoeffField U a x i j) := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + convert (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) using 1 + funext x + by_cases hx : x ∈ U <;> simp [restrictCoeffField, hx] + have hfull : + Measurable (fun x α β => + toFullBlockMat (blockCoeffField (restrictCoeffField U a) x) α β) := by + simpa [blockCoeffField] using + measurable_toFullBlockMat_blockCoeffField (d := d) hrestrict + have hop : + Measurable (fun x => + fullEntriesToHilbertOperator d + (toFullBlockMat (blockCoeffField (restrictCoeffField U a) x))) := by + exact measurable_fullEntriesToHilbertOperator hfull + simpa [fullEntriesToHilbertOperator_toFullBlockMat] using hop + opNormBound := Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) + opNormBound_nonneg := Real.sqrt_nonneg _ + le_opNormBound := by + intro x + by_cases hx : x ∈ U + · have hbound : + ‖HilbertBlockVec.applyBlockMat (blockCoeffField a x)‖ ≤ + Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam) := by + apply HilbertBlockVec.opNorm_applyBlockMat_le_of_block_bound + · exact Real.sqrt_nonneg _ + · intro X + have himage := + blockMatrixOfCoeff_image_bound_of_isEllipticMatrix (hEll.2 x hx) X + calc + blockVecDot (blockMatVecMul (blockCoeffField a x) X) + (blockMatVecMul (blockCoeffField a x) X) + ≤ blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot X X := himage + _ = (Real.sqrt (blockMatrixOfCoeffNormSqBound lam Lam)) ^ 2 * blockVecDot X X := by + rw [Real.sq_sqrt (blockMatrixOfCoeffNormSqBound_nonneg lam Lam)] + have hcoeff : + blockCoeffField (restrictCoeffField U a) x = blockCoeffField a x := by + simp [blockCoeffField, restrictCoeffField, hx] + rw [hcoeff] + exact hbound + · have hzero : + HilbertBlockVec.applyBlockMat (blockCoeffField (restrictCoeffField U a) x) = 0 := by + apply ContinuousLinearMap.ext + intro X + ext i <;> simp [blockCoeffField, restrictCoeffField, hx, + HilbertBlockVec.applyBlockMat_apply, blockMatrixOfCoeff, blockMatVecMul, matVecMul, + matTranspose, Matrix.inv_zero] + rw [hzero, norm_zero] + exact Real.sqrt_nonneg _ + +/-- Ellipticity plus block `L²` control makes the raw doubled pairing +integrable on `U`. -/ +theorem blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} {X Y : BlockState d} + (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) + (hEll : IsEllipticFieldOn lam Lam U a) : + MeasureTheory.IntegrableOn (blockPairingIntegrand a X Y) U := by + let M := rawBlockCoeffOperatorField (U := U) (a := a) hEll + let FX : HilbertBlockL2 U := toHilbertBlockL2OfBlockField (U := U) hX + let FY : HilbertBlockL2 U := toHilbertBlockL2OfBlockField (U := U) hY + have hInner : + MeasureTheory.Integrable + (fun x => inner ℝ (FX x) ((M.toContinuousLinearMap FY) x)) + (volumeMeasureOn U) := by + exact MeasureTheory.L2.integrable_inner FX (M.toContinuousLinearMap FY) + have hAE : + (fun x => inner ℝ (FX x) ((M.toContinuousLinearMap FY) x)) =ᵐ[volumeMeasureOn U] + blockPairingIntegrand a X Y := by + filter_upwards + [M.coeFn_toContinuousLinearMap FY, + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := X.eval) hX, + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := Y.eval) hY, + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx)] + with x hOp hXae hYae hx + have hFX : FX x = hilbertifyBlockField X.eval x := by + simpa [FX] using hXae + have hFY : FY x = hilbertifyBlockField Y.eval x := by + simpa [FY] using hYae + rw [hFX, hOp] + have hcoeff : + blockCoeffField (restrictCoeffField U a) x = blockCoeffField a x := by + simp [blockCoeffField, restrictCoeffField, hx] + simp [M, rawBlockCoeffOperatorField, PointwiseHilbertBlockOperatorField.applyFn, + blockPairingIntegrand, HilbertBlockVec.inner_def, hilbertifyBlockField, hcoeff, hFY] + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using hInner.congr hAE + +/-- Ellipticity plus block `L²` control makes the raw doubled energy density +integrable on `U`. -/ +theorem blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {lam Lam : ℝ} {X : BlockState d} + (hX : MemBlockL2 U X.eval) (hEll : IsEllipticFieldOn lam Lam U a) : + MeasureTheory.IntegrableOn (blockEnergyDensity a X) U := by + have hPair : + MeasureTheory.IntegrableOn (blockPairingIntegrand a X X) U := + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := U) (a := a) hX hX hEll + rw [show blockEnergyDensity a X = + fun x => (1 / 2 : ℝ) • blockPairingIntegrand a X X x by + funext x + simp [blockEnergyDensity, blockPairingIntegrand]] + simpa [MeasureTheory.IntegrableOn] using! hPair.smul (1 / 2 : ℝ) + +/-- +Concrete `L²(U; \R^{2d})` data for the note's averaged doubled coefficient +operator. + +The field `ae_apply` says that the operator acts pointwise by the doubled block +matrix `\mathbf A(a,x)`, multiplied by the normalizing factor appearing in +`\fint_U`. +-/ +structure MuOperatorRealization {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- The ambient `L²` operator. -/ + operator : HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U + /-- Almost-everywhere pointwise description of the averaged operator. -/ + ae_apply : + ∀ F : HilbertBlockL2 U, + operator F =ᵐ[volumeMeasureOn U] + fun x => + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) (F x) + /-- Symmetry of the induced bilinear form. -/ + operatorSymm : + LinearMap.IsSymmetric (operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U) + /-- Coercivity of the induced bilinear form. -/ + operatorCoercive : IsCoercive (energyBilinOfOperator operator) + +namespace MuOperatorRealization + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Forget the pointwise description and feed the operator package into the +Hilbert-space `\mu` problem. -/ +noncomputable def toMuHilbertRealization + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (M : MuOperatorRealization U a) + (correctionSpace : MuCorrectionSpaceData U) : + MuHilbertRealization U a := + MuHilbertRealization.ofOperator correctionSpace + M.operator M.operatorSymm M.operatorCoercive + +/-- +For typed block `L²` fields, the Hilbert-space bilinear form of a concrete +`MuOperatorRealization` reproduces the note's averaged doubled pairing. + +The arguments appear in the order dictated by `energyBilinOfOperator`: +the operator acts on the first entry. Writing the theorem with the fields +swapped makes the right-hand side match the note's convention +`X \cdot \mathbf A(a,x) Y`. +-/ +theorem energyBilin_eq_volumeAverage_swap_of_memBlockL2 + (M : MuOperatorRealization U a) + {X Y : Vec d → BlockVec d} (hX : MemBlockL2 U X) (hY : MemBlockL2 U Y) : + energyBilinOfOperator M.operator + (toHilbertBlockL2OfBlockField (U := U) hY) + (toHilbertBlockL2OfBlockField (U := U) hX) = + volumeAverage U + (fun x => blockVecDot (X x) (blockMatVecMul (blockCoeffField a x) (Y x))) := by + rw [energyBilinOfOperator_apply, MeasureTheory.L2.inner_def] + calc + ∫ x, inner ℝ (M.operator (toHilbertBlockL2OfBlockField (U := U) hY) x) + (toHilbertBlockL2OfBlockField (U := U) hX x) ∂ volumeMeasureOn U + = + ∫ x, (MeasureTheory.volume U).toReal⁻¹ * + blockVecDot (X x) (blockMatVecMul (blockCoeffField a x) (Y x)) + ∂ volumeMeasureOn U := by + apply MeasureTheory.integral_congr_ae + filter_upwards + [M.ae_apply (toHilbertBlockL2OfBlockField (U := U) hY), + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := X) hX, + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := Y) hY] + with x hOp hXae hYae + let Z := blockMatVecMul (blockCoeffField a x) (Y x) + rw [hOp, hXae, hYae] + simp [hilbertifyBlockField, real_inner_comm, + HilbertBlockVec.applyBlockMat_apply, HilbertBlockVec.inner_def] + have htoBlock : + (((MeasureTheory.volume U).toReal⁻¹ • HilbertBlockVec.ofBlockVec Z).toBlockVec) = + (MeasureTheory.volume U).toReal⁻¹ • Z := by + ext i <;> simp [Z, HilbertVec.toVec] + rw [htoBlock, blockVecDot_smul_right, mul_comm] + _ = + (MeasureTheory.volume U).toReal⁻¹ * + ∫ x, blockVecDot (X x) (blockMatVecMul (blockCoeffField a x) (Y x)) + ∂ volumeMeasureOn U := by + rw [MeasureTheory.integral_const_mul] + _ = + (MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (X x) (blockMatVecMul (blockCoeffField a x) (Y x)) + ∂ MeasureTheory.volume := by + simp [volumeMeasureOn] + _ = volumeAverage U + (fun x => blockVecDot (X x) (blockMatVecMul (blockCoeffField a x) (Y x))) := by + rfl + +theorem energyBilin_eq_blockPairingAverage_of_blockState + (M : MuOperatorRealization U a) + {X Y : BlockState d} (hX : MemBlockL2 U X.eval) (hY : MemBlockL2 U Y.eval) : + energyBilinOfOperator M.operator + (toHilbertBlockL2OfBlockField (U := U) hY) + (toHilbertBlockL2OfBlockField (U := U) hX) = + blockPairingAverage U a X Y := by + simpa [energyBilinOfOperator, blockPairingAverage, blockPairingIntegrand] using! + M.energyBilin_eq_volumeAverage_swap_of_memBlockL2 + (X := X.eval) (Y := Y.eval) hX hY + +theorem quadraticEnergy_eq_blockEnergyAverage_of_blockState + (M : MuOperatorRealization U a) + {X : BlockState d} (hX : MemBlockL2 U X.eval) : + quadraticEnergy (energyBilinOfOperator M.operator) + (toHilbertBlockL2OfBlockField (U := U) hX) = + blockEnergyAverage U a X := by + rw [quadraticEnergy, M.energyBilin_eq_blockPairingAverage_of_blockState hX hX] + exact (blockEnergyAverage_eq_half_blockPairingAverage_self U a X).symm + +end MuOperatorRealization + +namespace MuCoeffOperatorData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Package measurable bounded coefficient-operator data together with the +symmetry and coercivity hypotheses needed by the doubled `\mu` problem. -/ +noncomputable def toMuOperatorRealization + (M : MuCoeffOperatorData U a) + (operatorSymm : + LinearMap.IsSymmetric (M.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U)) + (operatorCoercive : IsCoercive (energyBilinOfOperator M.operator)) : + MuOperatorRealization U a where + operator := M.operator + ae_apply := by + intro F + filter_upwards + [M.ae_apply_operator F, + MeasureTheory.ae_restrict_of_forall_mem M.measurableSet_domain + (fun x hx => normalizedBlockCoeffOperator_apply_of_mem a hx (F x))] + with x hOp hEq + rw [hOp, hEq] + operatorSymm := operatorSymm + operatorCoercive := operatorCoercive + +/-- Package measurable bounded coefficient-operator data into a concrete doubled +operator realization using the symmetry and coercivity consequences of the +ellipticity hypotheses. -/ +noncomputable def toMuOperatorRealizationOfIsEllipticFieldOn (M : MuCoeffOperatorData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + MuOperatorRealization U a := + M.toMuOperatorRealization M.operatorSymm + (M.operatorCoercive_of_isEllipticFieldOn hEll hvol) + +end MuCoeffOperatorData + +/-- +Deterministic input data for the doubled `\mu` problem on `U`. + +This bundles exactly the concrete operator-theoretic witnesses currently needed +to pass from a coefficient field to the Hilbert-space minimization engine. The +package is intentionally samplewise, so a future random-field layer can assign +one such package to each realization `\omega` without changing the deterministic +API. +-/ +structure MuOperatorSystemData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- The closed correction space `\Lpoto(U) × \Lsolo(U)`. -/ + correctionSpace : MuCorrectionSpaceData U + /-- Measurable bounded coefficient-operator data. -/ + coeffOperatorData : MuCoeffOperatorData U a + /-- Symmetry of the concrete doubled `L²` operator. -/ + operatorSymm : + LinearMap.IsSymmetric + (coeffOperatorData.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U) + /-- Coercivity of the concrete doubled energy form. -/ + operatorCoercive : + IsCoercive (energyBilinOfOperator coeffOperatorData.operator) + +namespace MuOperatorSystemData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Replace the correction-space package while keeping the same coefficient +operator data, symmetry, and coercivity witnesses. -/ +noncomputable def withCorrectionSpace (M : MuOperatorSystemData U a) + (correctionSpace : MuCorrectionSpaceData U) : + MuOperatorSystemData U a where + correctionSpace := correctionSpace + coeffOperatorData := M.coeffOperatorData + operatorSymm := M.operatorSymm + operatorCoercive := M.operatorCoercive + +/-- The concrete doubled operator realization extracted from the deterministic +system package. -/ +noncomputable def toMuOperatorRealization (M : MuOperatorSystemData U a) : + MuOperatorRealization U a := + M.coeffOperatorData.toMuOperatorRealization M.operatorSymm M.operatorCoercive + +/-- The concrete Hilbert-space realization of the doubled `\mu` problem +extracted from the deterministic system package. -/ +noncomputable def toMuHilbertRealization + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (M : MuOperatorSystemData U a) : + MuHilbertRealization U a := + (M.toMuOperatorRealization).toMuHilbertRealization M.correctionSpace + +end MuOperatorSystemData + +namespace PotentialSolenoidalL2Data + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Build the deterministic doubled operator package directly from the packaged +block correction space `\Lpoto(U) × \Lsolo(U)` together with the concrete +coefficient-operator data. -/ +noncomputable def toMuOperatorSystemData (M : PotentialSolenoidalL2Data U) + (coeffOperatorData : MuCoeffOperatorData U a) + (operatorSymm : + LinearMap.IsSymmetric + (coeffOperatorData.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U)) + (operatorCoercive : + IsCoercive (energyBilinOfOperator coeffOperatorData.operator)) : + MuOperatorSystemData U a where + correctionSpace := M.toMuCorrectionSpaceData + coeffOperatorData := coeffOperatorData + operatorSymm := operatorSymm + operatorCoercive := operatorCoercive + +/-- Build the deterministic doubled operator system directly from a packaged +potential/solenoidal correction space and raw ellipticity assumptions. -/ +noncomputable def toMuOperatorSystemDataOfIsEllipticFieldOn + (M : PotentialSolenoidalL2Data U) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + MuOperatorSystemData U a := by + let coeffOperatorData : MuCoeffOperatorData U a := + MuCoeffOperatorData.ofIsEllipticFieldOn (U := U) (a := a) hEll + exact M.toMuOperatorSystemData coeffOperatorData + coeffOperatorData.operatorSymm + (coeffOperatorData.operatorCoercive_of_isEllipticFieldOn hEll hvol) + +@[simp] theorem correctionSpace_toMuOperatorSystemData (M : PotentialSolenoidalL2Data U) + (coeffOperatorData : MuCoeffOperatorData U a) + (operatorSymm : + LinearMap.IsSymmetric + (coeffOperatorData.operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U)) + (operatorCoercive : + IsCoercive (energyBilinOfOperator coeffOperatorData.operator)) : + (M.toMuOperatorSystemData coeffOperatorData operatorSymm operatorCoercive).correctionSpace = + M.toMuCorrectionSpaceData := + rfl + +end PotentialSolenoidalL2Data + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/HilbertOperator.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/HilbertOperator.lean new file mode 100644 index 0000000000..ae796da07b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuOperator/HilbertOperator.lean @@ -0,0 +1,402 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuWellPosedness +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimizationMeasurability +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.Topology.Instances.Matrix + +/-! # Hilbert Operator -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +This file packages the concrete doubled `L²(U; \R^{2d})` operator expected by +the coarse-graining notes. + +The key point is fidelity to the text: the Hilbert-space bilinear form used by +the minimization engine should coincide with the averaged pairing + +`\fint_U X \cdot \mathbf A(a,x) Y`. + +Since the `L²` inner product uses the raw integral, the operator recorded here +already includes the normalization factor `|U|^{-1}`. +-/ + +/-- +Measurable uniformly bounded pointwise operator fields on the Hilbert block +carrier over `U`. + +This is the analytic input needed to turn a pointwise doubled operator field +into an actual bounded operator on `L²(U; \R^{2d})`. +-/ +structure PointwiseHilbertBlockOperatorField {d : ℕ} (U : Set (Vec d)) where + /-- The pointwise operator field. -/ + field : Vec d → HilbertBlockVec d →L[ℝ] HilbertBlockVec d + /-- Measurability of the operator field. -/ + measurable_field : Measurable field + /-- A uniform operator-norm bound. -/ + opNormBound : ℝ + /-- Nonnegativity of the bound. -/ + opNormBound_nonneg : 0 ≤ opNormBound + /-- The pointwise operators are bounded by `opNormBound`. -/ + le_opNormBound : ∀ x : Vec d, ‖field x‖ ≤ opNormBound + +namespace PointwiseHilbertBlockOperatorField + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Pointwise action of the operator field on a typed `L²` block field. -/ +def applyFn (M : PointwiseHilbertBlockOperatorField U) (F : HilbertBlockL2 U) : + Vec d → HilbertBlockVec d := + fun x => M.field x (F x) + +theorem aestronglyMeasurable_applyFn (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + MeasureTheory.AEStronglyMeasurable (M.applyFn F) (volumeMeasureOn U) := by + let evalCLM : + (HilbertBlockVec d →L[ℝ] HilbertBlockVec d) →L[ℝ] + HilbertBlockVec d →L[ℝ] HilbertBlockVec d := + ContinuousLinearMap.flip (ContinuousLinearMap.apply ℝ (HilbertBlockVec d)) + have hfield := M.measurable_field.aestronglyMeasurable (μ := volumeMeasureOn U) + have hF := MeasureTheory.Lp.aestronglyMeasurable (μ := volumeMeasureOn U) F + simpa [applyFn, evalCLM] using! + ContinuousLinearMap.aestronglyMeasurable_comp₂ (L := evalCLM) hfield hF + +theorem memHilbertBlockL2_applyFn (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + MemHilbertBlockL2 U (M.applyFn F) := by + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖M.applyFn F x‖ ≤ M.opNormBound * ‖F x‖ := by + refine Filter.Eventually.of_forall ?_ + intro x + calc + ‖M.applyFn F x‖ = ‖M.field x (F x)‖ := rfl + _ ≤ ‖M.field x‖ * ‖F x‖ := (M.field x).le_opNorm (F x) + _ ≤ M.opNormBound * ‖F x‖ := by + exact mul_le_mul_of_nonneg_right (M.le_opNormBound x) (norm_nonneg _) + exact + MeasureTheory.MemLp.of_le_mul + (MeasureTheory.Lp.memLp F) + (M.aestronglyMeasurable_applyFn F) + hbound + +/-- The typed `L²` field obtained by applying the operator field pointwise. -/ +noncomputable def apply (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : HilbertBlockL2 U := + toHilbertBlockL2 (M.memHilbertBlockL2_applyFn F) + +theorem coeFn_apply (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + M.apply F =ᵐ[volumeMeasureOn U] M.applyFn F := + coeFn_toHilbertBlockL2 (M.memHilbertBlockL2_applyFn F) + +theorem apply_add (M : PointwiseHilbertBlockOperatorField U) + (F G : HilbertBlockL2 U) : + M.apply (F + G) = M.apply F + M.apply G := by + apply MeasureTheory.Lp.ext + filter_upwards + [M.coeFn_apply (F + G), M.coeFn_apply F, M.coeFn_apply G, + MeasureTheory.Lp.coeFn_add F G, MeasureTheory.Lp.coeFn_add (M.apply F) (M.apply G)] + with x hFG hF hG hdom hcod + have hdom' : (F + G) x = F x + G x := by + simpa using hdom + have hcod' : (M.apply F + M.apply G) x = M.apply F x + M.apply G x := by + simpa using hcod + rw [hFG] + calc + M.applyFn (F + G) x = M.field x ((F + G) x) := rfl + _ = M.field x (F x + G x) := by rw [hdom'] + _ = M.field x (F x) + M.field x (G x) := map_add (M.field x) (F x) (G x) + _ = M.applyFn F x + M.applyFn G x := rfl + _ = M.apply F x + M.apply G x := by rw [← hF, ← hG] + _ = (M.apply F + M.apply G) x := by rw [hcod'] + +theorem apply_smul (M : PointwiseHilbertBlockOperatorField U) + (c : ℝ) (F : HilbertBlockL2 U) : + M.apply (c • F) = c • M.apply F := by + apply MeasureTheory.Lp.ext + filter_upwards + [M.coeFn_apply (c • F), M.coeFn_apply F, + MeasureTheory.Lp.coeFn_smul c F, MeasureTheory.Lp.coeFn_smul c (M.apply F)] + with x hCF hF hdom hcod + have hdom' : (c • F) x = c • F x := by + simpa using hdom + have hcod' : (c • M.apply F) x = c • M.apply F x := by + simpa using hcod + rw [hCF] + calc + M.applyFn (c • F) x = M.field x ((c • F) x) := rfl + _ = M.field x (c • F x) := by rw [hdom'] + _ = c • M.field x (F x) := map_smul (M.field x) c (F x) + _ = c • M.applyFn F x := rfl + _ = c • M.apply F x := by rw [← hF] + _ = (c • M.apply F) x := by rw [hcod'] + +theorem norm_apply_le (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + ‖M.apply F‖ ≤ M.opNormBound * ‖F‖ := by + apply MeasureTheory.Lp.norm_le_mul_norm_of_ae_le_mul + filter_upwards [M.coeFn_apply F] with x hF + calc + ‖M.apply F x‖ = ‖M.field x (F x)‖ := by + rw [hF] + simp [applyFn] + _ ≤ ‖M.field x‖ * ‖F x‖ := (M.field x).le_opNorm (F x) + _ ≤ M.opNormBound * ‖F x‖ := by + exact mul_le_mul_of_nonneg_right (M.le_opNormBound x) (norm_nonneg _) + +/-- The bounded operator on `L²(U; \R^{2d})` induced by the pointwise operator +field. -/ +noncomputable def toContinuousLinearMap (M : PointwiseHilbertBlockOperatorField U) : + HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U := by + let L : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U := + { toFun := M.apply + map_add' := M.apply_add + map_smul' := M.apply_smul } + exact L.mkContinuous M.opNormBound (M.norm_apply_le) + +@[simp] theorem toContinuousLinearMap_apply (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + M.toContinuousLinearMap F = M.apply F := by + simp [toContinuousLinearMap] + +theorem coeFn_toContinuousLinearMap (M : PointwiseHilbertBlockOperatorField U) + (F : HilbertBlockL2 U) : + M.toContinuousLinearMap F =ᵐ[volumeMeasureOn U] M.applyFn F := + (M.toContinuousLinearMap_apply F).symm ▸ M.coeFn_apply F + +end PointwiseHilbertBlockOperatorField + +/-! +The operator-valued measurability step for the doubled coefficient field is +handled through the full `2d × 2d` matrix entries. Since `BlockMat d` does not +carry a measurable/topological structure, we pass through the raw function type +`BlockCoord d → BlockCoord d → ℝ`, which does. +-/ + +noncomputable def fullEntriesToHilbertOperatorLinear (d : ℕ) : + (BlockCoord d → BlockCoord d → ℝ) →ₗ[ℝ] + (HilbertBlockVec d →L[ℝ] HilbertBlockVec d) where + toFun := fun M => HilbertBlockVec.applyBlockMat (ofFullBlockMat M) + map_add' := by + intro M N + apply ContinuousLinearMap.ext + intro X + simp [HilbertBlockVec.applyBlockMat_apply] + apply HilbertBlockVec.ext + · apply HilbertVec.ext + intro i + simp [ofFullBlockMat, blockMatVecMul, matVecMul, Finset.sum_add_distrib, add_mul, + add_left_comm, add_assoc] + · apply HilbertVec.ext + intro i + simp [ofFullBlockMat, blockMatVecMul, matVecMul, Finset.sum_add_distrib, add_mul, + add_left_comm, add_assoc] + map_smul' := by + intro c M + apply ContinuousLinearMap.ext + intro X + simp [HilbertBlockVec.applyBlockMat_apply] + apply HilbertBlockVec.ext + · apply HilbertVec.ext + intro i + simp [ofFullBlockMat, blockMatVecMul, matVecMul, Finset.mul_sum, mul_assoc] + · apply HilbertVec.ext + intro i + simp [ofFullBlockMat, blockMatVecMul, matVecMul, Finset.mul_sum, mul_assoc] + +noncomputable def fullEntriesToHilbertOperator (d : ℕ) : + (BlockCoord d → BlockCoord d → ℝ) →L[ℝ] + (HilbertBlockVec d →L[ℝ] HilbertBlockVec d) := + ⟨fullEntriesToHilbertOperatorLinear d, + (fullEntriesToHilbertOperatorLinear d).continuous_of_finiteDimensional⟩ + +theorem measurable_fullEntriesToHilbertOperator {d : ℕ} {α : Type*} + [MeasurableSpace α] {b : α → BlockCoord d → BlockCoord d → ℝ} + (hb : Measurable b) : + Measurable (fun x => fullEntriesToHilbertOperator d (b x)) := by + exact (fullEntriesToHilbertOperator d).continuous.measurable.comp hb + +@[simp] theorem fullEntriesToHilbertOperator_toFullBlockMat {d : ℕ} (B : BlockMat d) : + fullEntriesToHilbertOperator d (toFullBlockMat B) = HilbertBlockVec.applyBlockMat B := by + simp [fullEntriesToHilbertOperator, fullEntriesToHilbertOperatorLinear] + +@[simp] theorem symmPart_zero {d : ℕ} : + symmPart (0 : Mat d) = 0 := by + ext i j + simp [symmPart] + +@[simp] theorem skewPart_zero {d : ℕ} : + skewPart (0 : Mat d) = 0 := by + ext i j + simp [skewPart] + +theorem measurable_matrix_transpose_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable (fun x => matTranspose (A x) i j) := by + simpa [matTranspose] using! (measurable_pi_iff.1 (measurable_pi_iff.1 hA j) i) + +theorem measurable_symmPart_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable (fun x => symmPart (A x) i j) := by + have hij : Measurable (fun x => A x i j) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA i) j + have hji : Measurable (fun x => A x j i) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA j) i + simpa [symmPart, div_eq_mul_inv] using (hij.add hji).mul_const ((2 : ℝ)⁻¹) + +theorem measurable_skewPart_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) (i j : Fin d) : + Measurable (fun x => skewPart (A x) i j) := by + have hij : Measurable (fun x => A x i j) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA i) j + have hji : Measurable (fun x => A x j i) := + measurable_pi_iff.1 (measurable_pi_iff.1 hA j) i + simpa [skewPart, div_eq_mul_inv] using (hij.sub hji).mul_const ((2 : ℝ)⁻¹) + +theorem measurable_matrix_mul_entry {d : ℕ} {α : Type*} [MeasurableSpace α] + {A B : α → Fin d → Fin d → ℝ} (hA : Measurable A) (hB : Measurable B) (i j : Fin d) : + Measurable (fun x => ∑ k, A x i k * B x k j) := by + classical + exact Finset.measurable_sum Finset.univ (fun k _ => + (measurable_pi_iff.1 (measurable_pi_iff.1 hA i) k).mul + (measurable_pi_iff.1 (measurable_pi_iff.1 hB k) j)) + +theorem measurable_toFullBlockMat_blockCoeffField {d : ℕ} {α : Type*} + [MeasurableSpace α] {A : α → Fin d → Fin d → ℝ} (hA : Measurable A) : + Measurable (fun x α β => + toFullBlockMat (blockMatrixOfCoeff (A x)) α β) := by + let s : α → Fin d → Fin d → ℝ := fun x i j => symmPart (A x) i j + let sInv : α → Fin d → Fin d → ℝ := fun x i j => (((symmPart (A x))⁻¹ : Mat d) i j) + let k : α → Fin d → Fin d → ℝ := fun x i j => skewPart (A x) i j + let kT : α → Fin d → Fin d → ℝ := fun x i j => matTranspose (skewPart (A x)) i j + let kTsInv : α → Fin d → Fin d → ℝ := fun x i j => ∑ l, kT x i l * sInv x l j + let kTsInvk : α → Fin d → Fin d → ℝ := fun x i j => ∑ l, kTsInv x i l * k x l j + let sInvk : α → Fin d → Fin d → ℝ := fun x i j => ∑ l, sInv x i l * k x l j + have hs : Measurable s := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [s] using measurable_symmPart_entry hA i j + have hk : Measurable k := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [k] using measurable_skewPart_entry hA i j + have hsInv : Measurable sInv := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [sInv] using measurable_matrix_inv_entry hs i j + have hkT : Measurable kT := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [kT, matTranspose] using (measurable_pi_iff.1 (measurable_pi_iff.1 hk j) i) + have hkTsInv : Measurable kTsInv := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [kTsInv] using measurable_matrix_mul_entry hkT hsInv i j + have hkTsInvk : Measurable kTsInvk := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [kTsInvk] using measurable_matrix_mul_entry hkTsInv hk i j + have hsInvk : Measurable sInvk := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + simpa [sInvk] using measurable_matrix_mul_entry hsInv hk i j + refine measurable_pi_iff.2 ?_ + intro α + refine measurable_pi_iff.2 ?_ + intro β + cases α with + | inl i => + cases β with + | inl j => + simpa [blockMatrixOfCoeff, toFullBlockMat, s, k, kT, sInv, kTsInv, kTsInvk, + Matrix.mul_apply] using + (measurable_pi_iff.1 (measurable_pi_iff.1 (hs.add hkTsInvk) i) j) + | inr j => + simpa [blockMatrixOfCoeff, toFullBlockMat, kT, sInv, kTsInv, Matrix.mul_apply] using + (measurable_pi_iff.1 (measurable_pi_iff.1 hkTsInv.neg i) j) + | inr i => + cases β with + | inl j => + simpa [blockMatrixOfCoeff, toFullBlockMat, sInv, k, sInvk, Matrix.mul_apply] using + (measurable_pi_iff.1 (measurable_pi_iff.1 hsInvk.neg i) j) + | inr j => + simpa [blockMatrixOfCoeff, toFullBlockMat, sInv] using + (measurable_pi_iff.1 (measurable_pi_iff.1 hsInv i) j) + +theorem blockMatrixOfCoeffNormSqBound_nonneg (lam Lam : ℝ) : + 0 ≤ blockMatrixOfCoeffNormSqBound lam Lam := by + unfold blockMatrixOfCoeffNormSqBound + have hFirst : 0 ≤ 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + have hFactor : 0 ≤ 2 * Lam ^ 2 + 1 := by + nlinarith [sq_nonneg Lam] + have hInvSq : 0 ≤ lam⁻¹ * lam⁻¹ := by + nlinarith [sq_nonneg (lam⁻¹)] + have hLast : 0 ≤ Lam ^ 2 + 1 := by + nlinarith [sq_nonneg Lam] + have hSecond : 0 ≤ 2 * (2 * Lam ^ 2 + 1) * (lam⁻¹ * lam⁻¹) * (Lam ^ 2 + 1) := by + refine mul_nonneg ?_ hLast + refine mul_nonneg ?_ hInvSq + refine mul_nonneg ?_ hFactor + positivity + exact add_nonneg hFirst hSecond + +/-- +The normalized doubled coefficient operator at a single point `x`. + +The operator is built from the coefficient field restricted to `U` and extended +by zero off `U`. This matches the note-faithful situation that all analytic +statements are made on `U`, while keeping a genuinely global measurable field +for the ambient `L²(volume.restrict U)` construction. +-/ +noncomputable def normalizedBlockCoeffOperator {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (x : Vec d) : HilbertBlockVec d →L[ℝ] HilbertBlockVec d := + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField (restrictCoeffField U a) x) + +@[simp] theorem normalizedBlockCoeffOperator_apply {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (x : Vec d) (X : HilbertBlockVec d) : + normalizedBlockCoeffOperator U a x X = + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField (restrictCoeffField U a) x) X := by + simp [normalizedBlockCoeffOperator] + +theorem normalizedBlockCoeffOperator_apply_of_mem {d : ℕ} {U : Set (Vec d)} + (a : CoeffField d) {x : Vec d} (hx : x ∈ U) (X : HilbertBlockVec d) : + normalizedBlockCoeffOperator U a x X = + (MeasureTheory.volume U).toReal⁻¹ • + HilbertBlockVec.applyBlockMat (blockCoeffField a x) X := by + have hcoeff : + blockCoeffField (restrictCoeffField U a) x = blockCoeffField a x := by + simp [blockCoeffField, restrictCoeffField, hx] + simp [normalizedBlockCoeffOperator, hcoeff] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuQuadratic.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuQuadratic.lean new file mode 100644 index 0000000000..eba21a0a1c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuQuadratic.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions + +/-! # Mu Quadratic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable def blockPairingIntegrand {d : ℕ} (a : CoeffField d) + (X Y : BlockState d) : Vec d → ℝ := + fun x => blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (Y.eval x)) + +noncomputable def blockEnergyAverage {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X : BlockState d) : ℝ := + volumeAverage U (blockEnergyDensity a X) + +noncomputable def blockPairingAverage {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X Y : BlockState d) : ℝ := + volumeAverage U (blockPairingIntegrand a X Y) + +theorem blockPairingIntegrand_eq_hilbertInner {d : ℕ} (a : CoeffField d) + (X Y : BlockState d) : + blockPairingIntegrand a X Y = + fun x => + inner ℝ (HilbertBlockVec.ofBlockVec (X.eval x)) + (HilbertBlockVec.applyBlockMat (blockCoeffField a x) + (HilbertBlockVec.ofBlockVec (Y.eval x))) := by + funext x + simp [blockPairingIntegrand] + +theorem blockEnergyAverage_eq_half_blockPairingAverage_self {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (X : BlockState d) : + blockEnergyAverage U a X = (1 / 2 : ℝ) * blockPairingAverage U a X X := by + unfold blockEnergyAverage blockPairingAverage volumeAverage blockEnergyDensity blockPairingIntegrand + rw [show (fun x => (1 / 2 : ℝ) * blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x))) = + fun x => (1 / 2 : ℝ) • blockVecDot (X.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +theorem blockEnergyDensity_eq_hilbertQuadratic {d : ℕ} (a : CoeffField d) + (X : BlockState d) : + blockEnergyDensity a X = + fun x => + (1 / 2 : ℝ) * + inner ℝ (HilbertBlockVec.ofBlockVec (X.eval x)) + (HilbertBlockVec.applyBlockMat (blockCoeffField a x) + (HilbertBlockVec.ofBlockVec (X.eval x))) := by + funext x + rw [show blockEnergyDensity a X x = + (1 / 2 : ℝ) * blockPairingIntegrand a X X x by + simp [blockEnergyDensity, blockPairingIntegrand]] + rw [blockPairingIntegrand_eq_hilbertInner] + +theorem blockPairingIntegrand_add_left {d : ℕ} (a : CoeffField d) + (X Y Z : BlockState d) : + blockPairingIntegrand a (X + Y) Z = + fun x => blockPairingIntegrand a X Z x + blockPairingIntegrand a Y Z x := by + funext x + simp [blockPairingIntegrand, blockVecDot_add_left] + +theorem blockPairingIntegrand_add_right {d : ℕ} (a : CoeffField d) + (X Y Z : BlockState d) : + blockPairingIntegrand a X (Y + Z) = + fun x => blockPairingIntegrand a X Y x + blockPairingIntegrand a X Z x := by + funext x + simp [blockPairingIntegrand, blockMatVecMul_add, blockVecDot_add_right] + +theorem blockPairingIntegrand_smul_left {d : ℕ} (a : CoeffField d) + (c : ℝ) (X Y : BlockState d) : + blockPairingIntegrand a (c • X) Y = + fun x => c * blockPairingIntegrand a X Y x := by + funext x + simp [blockPairingIntegrand, blockVecDot_smul_left] + +theorem blockPairingIntegrand_smul_right {d : ℕ} (a : CoeffField d) + (X Y : BlockState d) (c : ℝ) : + blockPairingIntegrand a X (c • Y) = + fun x => c * blockPairingIntegrand a X Y x := by + funext x + simp [blockPairingIntegrand, blockMatVecMul_smul, blockVecDot_smul_right] + +theorem blockPairingAverage_add_left {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X Y Z : BlockState d) + (hXZ : MeasureTheory.IntegrableOn (blockPairingIntegrand a X Z) U) + (hYZ : MeasureTheory.IntegrableOn (blockPairingIntegrand a Y Z) U) : + blockPairingAverage U a (X + Y) Z = + blockPairingAverage U a X Z + blockPairingAverage U a Y Z := by + unfold blockPairingAverage volumeAverage + rw [blockPairingIntegrand_add_left] + rw [MeasureTheory.integral_add hXZ hYZ] + simp [mul_add] + +theorem blockPairingAverage_add_right {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X Y Z : BlockState d) + (hXY : MeasureTheory.IntegrableOn (blockPairingIntegrand a X Y) U) + (hXZ : MeasureTheory.IntegrableOn (blockPairingIntegrand a X Z) U) : + blockPairingAverage U a X (Y + Z) = + blockPairingAverage U a X Y + blockPairingAverage U a X Z := by + unfold blockPairingAverage volumeAverage + rw [blockPairingIntegrand_add_right] + rw [MeasureTheory.integral_add hXY hXZ] + simp [mul_add] + +theorem blockPairingAverage_smul_left {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (c : ℝ) (X Y : BlockState d) : + blockPairingAverage U a (c • X) Y = c * blockPairingAverage U a X Y := by + unfold blockPairingAverage volumeAverage + rw [blockPairingIntegrand_smul_left] + rw [show (fun x => c * blockPairingIntegrand a X Y x) = + fun x => c • blockPairingIntegrand a X Y x by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +theorem blockPairingAverage_smul_right {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (X Y : BlockState d) (c : ℝ) : + blockPairingAverage U a X (c • Y) = c * blockPairingAverage U a X Y := by + unfold blockPairingAverage volumeAverage + rw [blockPairingIntegrand_smul_right] + rw [show (fun x => c * blockPairingIntegrand a X Y x) = + fun x => c • blockPairingIntegrand a X Y x by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +/-- +A linear family of minimizers for the doubled `μ`-problem. This isolates the +analytic content of the notes: once such a family is available, `μ(U,·;a)` is +automatically quadratic, hence the coarse block matrix exists canonically. +-/ +structure LinearMuMinimizerFamily {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + field : BlockVec d → BlockState d + map_add : ∀ P Q : BlockVec d, field (P + Q) = field P + field Q + map_smul : ∀ (c : ℝ) (P : BlockVec d), field (c • P) = c • field P + admissible : ∀ P : BlockVec d, IsBlockMuAdmissible U P (field P) + pairingIntegrable : + ∀ P Q : BlockVec d, MeasureTheory.IntegrableOn (blockPairingIntegrand a (field P) (field Q)) U + realizes : ∀ P : BlockVec d, Mu U P a = blockEnergyAverage U a (field P) + +namespace LinearMuMinimizerFamily + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +noncomputable def toBilin (F : LinearMuMinimizerFamily U a) : + FullBlockVec d →ₗ[ℝ] FullBlockVec d →ₗ[ℝ] ℝ where + toFun x := + { toFun := fun y => blockPairingAverage U a (F.field (ofFullBlockVec x)) (F.field (ofFullBlockVec y)) + map_add' := by + intro y z + simpa [ofFullBlockVec_add, F.map_add] using + (blockPairingAverage_add_right U a + (F.field (ofFullBlockVec x)) + (F.field (ofFullBlockVec y)) + (F.field (ofFullBlockVec z)) + (F.pairingIntegrable (ofFullBlockVec x) (ofFullBlockVec y)) + (F.pairingIntegrable (ofFullBlockVec x) (ofFullBlockVec z))) + map_smul' := by + intro c y + simpa [ofFullBlockVec_smul, F.map_smul] using + (blockPairingAverage_smul_right U a + (F.field (ofFullBlockVec x)) + (F.field (ofFullBlockVec y)) + c) } + map_add' := by + intro x y + apply LinearMap.ext + intro z + simpa [ofFullBlockVec_add, F.map_add] using + (blockPairingAverage_add_left U a + (F.field (ofFullBlockVec x)) + (F.field (ofFullBlockVec y)) + (F.field (ofFullBlockVec z)) + (F.pairingIntegrable (ofFullBlockVec x) (ofFullBlockVec z)) + (F.pairingIntegrable (ofFullBlockVec y) (ofFullBlockVec z))) + map_smul' := by + intro c x + apply LinearMap.ext + intro z + simpa [ofFullBlockVec_smul, F.map_smul] using + (blockPairingAverage_smul_left U a + c + (F.field (ofFullBlockVec x)) + (F.field (ofFullBlockVec z))) + +noncomputable def quadraticForm (F : LinearMuMinimizerFamily U a) : + QuadraticForm ℝ (FullBlockVec d) := + LinearMap.BilinMap.toQuadraticMap F.toBilin + +theorem quadraticForm_apply (F : LinearMuMinimizerFamily U a) (P : BlockVec d) : + F.quadraticForm (toFullBlockVec P) = + blockPairingAverage U a (F.field P) (F.field P) := by + simp [quadraticForm, toBilin] + +theorem hasQuadraticMu (F : LinearMuMinimizerFamily U a) : + HasQuadraticMu U a := by + refine ⟨F.quadraticForm, ?_⟩ + intro P + rw [F.realizes P, blockEnergyAverage_eq_half_blockPairingAverage_self] + rw [F.quadraticForm_apply] + +theorem exists_coarseBlockMatrix (F : LinearMuMinimizerFamily U a) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + exists_coarseBlockMatrix_of_hasQuadraticMu F.hasQuadraticMu + +theorem existsUnique_coarseBlockMatrix (F : LinearMuMinimizerFamily U a) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + existsUnique_coarseBlockMatrix_of_hasQuadraticMu F.hasQuadraticMu + +theorem mu_eq_half_blockVecDot_coarseBlockMatrix + (F : LinearMuMinimizerFamily U a) (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu F.hasQuadraticMu P + +end LinearMuMinimizerFamily + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery.lean new file mode 100644 index 0000000000..498c641fc6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.RecoveryPackages + +/-! +# Mu recovery (aggregate re-export) + +Previously a 2111-line monolithic module whose MuCorrectionSpaceRecoveryData +namespace alone spanned ~1560 lines; now split along namespace / theme +boundaries into the five files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceBasic.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceBasic.lean new file mode 100644 index 0000000000..1ae5b2b5a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceBasic.lean @@ -0,0 +1,762 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.Setup + +/-! # Correction Space Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu correction-space recovery -- definitions and pairing identities + +Basic defs: correctionPart, recoveredCorrectionField, recoveredField; the +linearity (add, smul) and memBlockL2 / admissible witnesses; pairing +integrability / averages on openCubeSet and cubeSet; the minimizer_eq +identity, and the blockPairingAverage / integral_blockPairing = 0 lemmas +for repr_recoveredField and correction. +-/ + +namespace MuCorrectionSpaceRecoveryData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The correction part of the Hilbert minimizer, viewed inside the recovered +correction subspace. -/ +noncomputable def correctionPart + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : R.correctionSpace.toSubmodule := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + exact + ⟨H.minimizerMap P - H.constantField P, + H.sub_minimizerMap_apply_mem P⟩ + +theorem correctionPart_add + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P Q : BlockVec d) : + R.correctionPart system (P + Q) = + R.correctionPart system P + R.correctionPart system Q := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + apply Subtype.ext + change + H.minimizerMap (P + Q) - H.constantField (P + Q) = + (H.minimizerMap P - H.constantField P) + (H.minimizerMap Q - H.constantField Q) + rw [map_add, map_add] + abel_nf + +theorem correctionPart_smul + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (c : ℝ) (P : BlockVec d) : + R.correctionPart system (c • P) = c • R.correctionPart system P := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + apply Subtype.ext + change + H.minimizerMap (c • P) - H.constantField (c • P) = + c • (H.minimizerMap P - H.constantField P) + rw [map_smul, map_smul, smul_sub] + +/-- The recovered correction field realizing the correction part of the Hilbert +minimizer. -/ +noncomputable def recoveredCorrectionField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : CorrectionFieldData U := + R.repr (R.correctionPart system P) + +/-- The affine block state built from a fixed datum `P` and an arbitrary +recovered correction-space element. -/ +noncomputable def affineField + (R : MuCorrectionSpaceRecoveryData U) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : BlockState d := by + let Z := R.repr Y + exact + { potential := (fun _ : Vec d => P.1) + Z.potential + flux := (fun _ : Vec d => P.2) + Z.flux } + +/-- The recovered pointwise minimizer field obtained from the recovered +correction part and the constant datum `P`. -/ +noncomputable def recoveredField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : BlockState d := by + let Y := R.recoveredCorrectionField system P + exact + { potential := (fun _ : Vec d => P.1) + Y.potential + flux := (fun _ : Vec d => P.2) + Y.flux } + +/-- The generic affine field specializes to the minimizer-built recovered +field when the correction is chosen to be `correctionPart`. -/ +theorem affineField_correctionPart + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + R.affineField P (R.correctionPart system P) = R.recoveredField system P := by + rfl + +theorem affineField_memBlockL2 + (R : MuCorrectionSpaceRecoveryData U) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + MemBlockL2 U (R.affineField P Y).eval := by + let Z := R.repr Y + have hpot : MemVectorL2 U ((fun _ : Vec d => P.1) + Z.potential) := + (memVectorL2_const (U := U) P.1).add Z.potential_memL2 + have hflux : MemVectorL2 U ((fun _ : Vec d => P.2) + Z.flux) := + (memVectorL2_const (U := U) P.2).add Z.flux_memL2 + simpa [MuCorrectionSpaceRecoveryData.affineField, blockField] using! + memBlockL2_blockField hpot hflux + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem affineField_admissible + (R : MuCorrectionSpaceRecoveryData U) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + IsBlockMuAdmissible U P (R.affineField P Y) := by + let Z := R.repr Y + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MuCorrectionSpaceRecoveryData.affineField, constVecField] using + Z.potential_memL2 + · simpa [MuCorrectionSpaceRecoveryData.affineField, constVecField] using + Z.isPotentialZeroTrace + · simpa [MuCorrectionSpaceRecoveryData.affineField, constVecField] using + Z.flux_memL2 + · simpa [MuCorrectionSpaceRecoveryData.affineField, constVecField] using + Z.isSolenoidalZeroNormalTrace + +theorem affineField_hilbert_eq_const_add + (R : MuCorrectionSpaceRecoveryData U) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + toHilbertBlockL2OfBlockField (U := U) (R.affineField_memBlockL2 P Y) = + blockVecToHilbertBlockL2Const (U := U) P + Y := by + let Z := R.repr Y + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfBlockField (U := U) + (F := (R.affineField P Y).eval) + (R.affineField_memBlockL2 P Y), + coeFn_toHilbertBlockL2OfComponents (U := U) (f := Z.potential) (g := Z.flux) + Z.potential_memL2 Z.flux_memL2, + coeFn_blockVecToHilbertBlockL2Const (U := U) (P := P), + MeasureTheory.Lp.coeFn_add + (blockVecToHilbertBlockL2Const (U := U) P) + (Y : HilbertBlockL2 U)] + with x hfield hcorr hconst hsum + have hpoint : + hilbertifyBlockField (R.affineField P Y).eval x = + Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField Z.potential Z.flux x := by + apply HilbertBlockVec.ext + · ext i + simp [MuCorrectionSpaceRecoveryData.affineField, Z, + BlockState.eval, hilbertifyBlockField, hilbertBlockField, blockField] + · ext i + simp [MuCorrectionSpaceRecoveryData.affineField, Z, + BlockState.eval, hilbertifyBlockField, hilbertBlockField, blockField] + calc + (toHilbertBlockL2OfBlockField (U := U) (R.affineField_memBlockL2 P Y)) x + = hilbertifyBlockField (R.affineField P Y).eval x := hfield + _ = Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField Z.potential Z.flux x := hpoint + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + + hilbertBlockField Z.potential Z.flux x := by + rw [← hconst] + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + Z.toHilbertBlockL2 x := by + rw [← hcorr] + rfl + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + (Y : HilbertBlockL2 U) x := by + rw [show Z.toHilbertBlockL2 = Y by exact R.repr_eq Y] + _ = ((⇑(blockVecToHilbertBlockL2Const (U := U) P) : Vec d → HilbertBlockVec d) + + (⇑(Y : HilbertBlockL2 U) : Vec d → HilbertBlockVec d)) x := by + rfl + _ = (blockVecToHilbertBlockL2Const (U := U) P + Y) x := by + simpa [Pi.add_apply] using hsum.symm + +theorem recoveredField_add + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P Q : BlockVec d) : + R.recoveredField system (P + Q) = + R.recoveredField system P + R.recoveredField system Q := by + ext x i + · have hrepr_fun := + show + (R.repr (R.correctionPart system (P + Q))).toBlockField = + (R.repr (R.correctionPart system P)).toBlockField + + (R.repr (R.correctionPart system Q)).toBlockField from + by + simpa [MuCorrectionSpaceRecoveryData.correctionPart_add R system P Q] using + (MuCorrectionSpaceRecoveryData.repr_add R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + (MuCorrectionSpaceRecoveryData.correctionPart R system Q)) + have hrepr_vec := + congrArg Prod.fst <| congrFun hrepr_fun x + have hrepr : + (R.recoveredCorrectionField system (P + Q)).potential x i = + (R.repr (R.correctionPart system P)).potential x i + + (R.repr (R.correctionPart system Q)).potential x i := by + simpa [MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + CorrectionFieldData.toBlockField, blockField] using congrFun hrepr_vec i + calc + (R.recoveredField system (P + Q)).potential x i + = (P.1 i + Q.1 i) + + ((R.repr (R.correctionPart system P)).potential x i + + (R.repr (R.correctionPart system Q)).potential x i) := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, hrepr, add_assoc] + _ = (P.1 i + (R.repr (R.correctionPart system P)).potential x i) + + (Q.1 i + (R.repr (R.correctionPart system Q)).potential x i) := by + abel_nf + _ = ((R.recoveredField system P).potential + (R.recoveredField system Q).potential) x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, + MuCorrectionSpaceRecoveryData.recoveredCorrectionField] + _ = (R.recoveredField system P + R.recoveredField system Q).potential x i := by + rfl + · have hrepr_fun := + show + (R.repr (R.correctionPart system (P + Q))).toBlockField = + (R.repr (R.correctionPart system P)).toBlockField + + (R.repr (R.correctionPart system Q)).toBlockField from + by + simpa [MuCorrectionSpaceRecoveryData.correctionPart_add R system P Q] using + (MuCorrectionSpaceRecoveryData.repr_add R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + (MuCorrectionSpaceRecoveryData.correctionPart R system Q)) + have hrepr_vec := + congrArg Prod.snd <| congrFun hrepr_fun x + have hrepr : + (R.recoveredCorrectionField system (P + Q)).flux x i = + (R.repr (R.correctionPart system P)).flux x i + + (R.repr (R.correctionPart system Q)).flux x i := by + simpa [MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + CorrectionFieldData.toBlockField, blockField] using congrFun hrepr_vec i + calc + (R.recoveredField system (P + Q)).flux x i + = (P.2 i + Q.2 i) + + ((R.repr (R.correctionPart system P)).flux x i + + (R.repr (R.correctionPart system Q)).flux x i) := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, hrepr, add_assoc] + _ = (P.2 i + (R.repr (R.correctionPart system P)).flux x i) + + (Q.2 i + (R.repr (R.correctionPart system Q)).flux x i) := by + abel_nf + _ = ((R.recoveredField system P).flux + (R.recoveredField system Q).flux) x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, + MuCorrectionSpaceRecoveryData.recoveredCorrectionField] + _ = (R.recoveredField system P + R.recoveredField system Q).flux x i := by + rfl + +theorem recoveredField_smul + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (c : ℝ) (P : BlockVec d) : + R.recoveredField system (c • P) = c • R.recoveredField system P := by + ext x i + · have hrepr_fun := + show + (R.repr (R.correctionPart system (c • P))).toBlockField = + c • (R.repr (R.correctionPart system P)).toBlockField from + by + simpa [MuCorrectionSpaceRecoveryData.correctionPart_smul R system c P] using + (MuCorrectionSpaceRecoveryData.repr_smul R c + (MuCorrectionSpaceRecoveryData.correctionPart R system P)) + have hrepr_vec := congrArg Prod.fst <| congrFun hrepr_fun x + have hrepr : + (R.recoveredCorrectionField system (c • P)).potential x i = + c * (R.repr (R.correctionPart system P)).potential x i := by + simpa [MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + CorrectionFieldData.toBlockField, blockField] using congrFun hrepr_vec i + calc + (R.recoveredField system (c • P)).potential x i + = c * P.1 i + c * (R.repr (R.correctionPart system P)).potential x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, hrepr] + _ = c * (P.1 i + (R.repr (R.correctionPart system P)).potential x i) := by + rw [← mul_add] + _ = (c • (R.recoveredField system P).potential) x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, + MuCorrectionSpaceRecoveryData.recoveredCorrectionField] + _ = (c • R.recoveredField system P).potential x i := by + rfl + · have hrepr_fun := + show + (R.repr (R.correctionPart system (c • P))).toBlockField = + c • (R.repr (R.correctionPart system P)).toBlockField from + by + simpa [MuCorrectionSpaceRecoveryData.correctionPart_smul R system c P] using + (MuCorrectionSpaceRecoveryData.repr_smul R c + (MuCorrectionSpaceRecoveryData.correctionPart R system P)) + have hrepr_vec := congrArg Prod.snd <| congrFun hrepr_fun x + have hrepr : + (R.recoveredCorrectionField system (c • P)).flux x i = + c * (R.repr (R.correctionPart system P)).flux x i := by + simpa [MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + CorrectionFieldData.toBlockField, blockField] using congrFun hrepr_vec i + calc + (R.recoveredField system (c • P)).flux x i + = c * P.2 i + c * (R.repr (R.correctionPart system P)).flux x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, hrepr] + _ = c * (P.2 i + (R.repr (R.correctionPart system P)).flux x i) := by + rw [← mul_add] + _ = (c • (R.recoveredField system P).flux) x i := by + simp [MuCorrectionSpaceRecoveryData.recoveredField, + MuCorrectionSpaceRecoveryData.recoveredCorrectionField] + _ = (c • R.recoveredField system P).flux x i := by + rfl + +theorem recoveredField_memBlockL2 + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + MemBlockL2 U (R.recoveredField system P).eval := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + have hpot : MemVectorL2 U ((fun _ : Vec d => P.1) + Y.potential) := + (memVectorL2_const (U := U) P.1).add Y.potential_memL2 + have hflux : MemVectorL2 U ((fun _ : Vec d => P.2) + Y.flux) := + (memVectorL2_const (U := U) P.2).add Y.flux_memL2 + simpa [MuCorrectionSpaceRecoveryData.recoveredField, blockField] using! + memBlockL2_blockField hpot hflux + +theorem recoveredField_admissible + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + IsBlockMuAdmissible U P (R.recoveredField system P) := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MuCorrectionSpaceRecoveryData.recoveredField, constVecField] using! + Y.potential_memL2 + · simpa [MuCorrectionSpaceRecoveryData.recoveredField, constVecField] using! + Y.isPotentialZeroTrace + · simpa [MuCorrectionSpaceRecoveryData.recoveredField, constVecField] using! + Y.flux_memL2 + · simpa [MuCorrectionSpaceRecoveryData.recoveredField, constVecField] using! + Y.isSolenoidalZeroNormalTrace + +theorem recoveredField_integral_pairing_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (P : BlockVec d) : + ∫ x in openCubeSet (originCube d n), + vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal * vecDot P.1 P.2 := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y] using! + (CorrectionFieldData.integral_pairing_affine_eq_volume_mul_vecDot + (U := openCubeSet (originCube d n)) + (hU := isSobolevRegularDomain_openCubeSet_originCube_recovery (d := d) n) + (X := Y) (p := P.1) (q := P.2)) + +theorem recoveredField_integral_pairing_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (P : BlockVec d) : + ∫ x in cubeSet (originCube d n), + vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume (cubeSet (originCube d n))).toReal * vecDot P.1 P.2 := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y] using! + (CorrectionFieldData.integral_pairing_affine_eq_volume_mul_vecDot + (U := cubeSet (originCube d n)) + (hU := isSobolevRegularDomain_cubeSet_originCube_recovery (d := d) n) + (X := Y) (p := P.1) (q := P.2)) + +theorem recoveredField_integrableOn_pairing_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (P : BlockVec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) + (openCubeSet (originCube d n)) := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y] using! + Y.integrableOn_pairing_affine P.1 P.2 + +theorem recoveredField_integrableOn_pairing_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (P : BlockVec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) + (cubeSet (originCube d n)) := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y] using! + Y.integrableOn_pairing_affine P.1 P.2 + +theorem recoveredField_average_pairing_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (P : BlockVec d) : + volumeAverage (openCubeSet (originCube d n)) + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) = + vecDot P.1 P.2 := by + have hvol : + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + unfold volumeAverage + rw [recoveredField_integral_pairing_openCubeSet_originCube] + field_simp [hvol] + +theorem recoveredField_average_pairing_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (P : BlockVec d) : + volumeAverage (cubeSet (originCube d n)) + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) = + vecDot P.1 P.2 := by + have hvol : + (MeasureTheory.volume (cubeSet (originCube d n))).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos (originCube d n)).ne' + unfold volumeAverage + rw [recoveredField_integral_pairing_cubeSet_originCube] + field_simp [hvol] + +theorem recoveredField_average_state_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (P : BlockVec d) : + ((fun i => + volumeAverage (openCubeSet (originCube d n)) + (fun x => (R.recoveredField system P).potential x i)), + (fun i => + volumeAverage (openCubeSet (originCube d n)) + (fun x => (R.recoveredField system P).flux x i))) = P := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + have hvol : + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal ≠ 0 := + (volume_openCubeSet_originCube_toReal_pos_recovery (d := d) n).ne' + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y, volumeAverage, integralAverage] using! + (CorrectionFieldData.average_state_affine + (U := openCubeSet (originCube d n)) + (hU := isSobolevRegularDomain_openCubeSet_originCube_recovery (d := d) n) + (hvol := hvol) (X := Y) (P := P)) + +theorem recoveredField_average_state_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (P : BlockVec d) : + ((fun i => + volumeAverage (cubeSet (originCube d n)) + (fun x => (R.recoveredField system P).potential x i)), + (fun i => + volumeAverage (cubeSet (originCube d n)) + (fun x => (R.recoveredField system P).flux x i))) = P := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + have hvol : + (MeasureTheory.volume (cubeSet (originCube d n))).toReal ≠ 0 := + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n).ne' + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y, volumeAverage, integralAverage] using! + (CorrectionFieldData.average_state_affine + (U := cubeSet (originCube d n)) + (hU := isSobolevRegularDomain_cubeSet_originCube_recovery (d := d) n) + (hvol := hvol) (X := Y) (P := P)) + +theorem recoveredField_average_state_of_isSobolevRegularDomain + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + ((fun i => volumeAverage U + (fun x => (R.recoveredField system P).potential x i)), + (fun i => volumeAverage U + (fun x => (R.recoveredField system P).flux x i))) = P := by + let Y := MuCorrectionSpaceRecoveryData.repr R + (MuCorrectionSpaceRecoveryData.correctionPart R system P) + simpa [MuCorrectionSpaceRecoveryData.recoveredField, Y, volumeAverage, integralAverage] using! + (CorrectionFieldData.average_state_affine + (U := U) + (hU := hU) + (hvol := hvol) + (X := Y) + (P := P)) + +theorem recoveredField_integrableOn_pairing_of_integral_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) U := by + let Y := R.recoveredCorrectionField system P + simpa [MuCorrectionSpaceRecoveryData.recoveredField, MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + Y] using Y.integrableOn_pairing_affine P.1 P.2 + +theorem recoveredField_average_pairing_of_integral_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0) + (hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + volumeAverage U + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) = + vecDot P.1 P.2 := by + let Y := R.recoveredCorrectionField system P + have hpair : + ∫ x in U, vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * vecDot P.1 P.2 := by + simpa [MuCorrectionSpaceRecoveryData.recoveredField, MuCorrectionSpaceRecoveryData.recoveredCorrectionField, + Y] using + Y.integral_pairing_affine_eq_volume_mul_vecDot_of_integral_eq_zero + P.1 P.2 (hpotZero P) (hfluxZero P) + unfold volumeAverage + rw [hpair] + field_simp [hvol] + +theorem recoveredField_minimizer_eq + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + toHilbertBlockL2OfBlockField (R.recoveredField_memBlockL2 system P) = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).minimizerMap P := by + let H := system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + let Y := R.recoveredCorrectionField system P + have hpot : MemVectorL2 U ((fun _ : Vec d => P.1) + Y.potential) := + (memVectorL2_const (U := U) P.1).add Y.potential_memL2 + have hflux : MemVectorL2 U ((fun _ : Vec d => P.2) + Y.flux) := + (memVectorL2_const (U := U) P.2).add Y.flux_memL2 + have hconst_add : + toHilbertBlockL2OfBlockField (R.recoveredField_memBlockL2 system P) = + blockVecToHilbertBlockL2Const (U := U) P + Y.toHilbertBlockL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfBlockField (U := U) + (F := (R.recoveredField system P).eval) + (R.recoveredField_memBlockL2 system P), + coeFn_toHilbertBlockL2OfComponents (U := U) (f := Y.potential) (g := Y.flux) + Y.potential_memL2 Y.flux_memL2, + coeFn_blockVecToHilbertBlockL2Const (U := U) (P := P), + MeasureTheory.Lp.coeFn_add + (blockVecToHilbertBlockL2Const (U := U) P) + Y.toHilbertBlockL2] + with x hfield hcorr hconst hsum + have hpoint : + hilbertifyBlockField (R.recoveredField system P).eval x = + Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField Y.potential Y.flux x := by + apply HilbertBlockVec.ext + · ext i + simp [Y, BlockState.eval, MuCorrectionSpaceRecoveryData.recoveredField, hilbertifyBlockField, + hilbertBlockField, blockField] + · ext i + simp [Y, BlockState.eval, MuCorrectionSpaceRecoveryData.recoveredField, hilbertifyBlockField, + hilbertBlockField, blockField] + calc + (toHilbertBlockL2OfBlockField (R.recoveredField_memBlockL2 system P)) x + = hilbertifyBlockField (R.recoveredField system P).eval x := hfield + _ = Function.const (Vec d) (HilbertBlockVec.ofBlockVec P) x + + hilbertBlockField Y.potential Y.flux x := hpoint + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + + hilbertBlockField Y.potential Y.flux x := by + rw [← hconst] + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + + (toHilbertBlockL2OfComponents Y.potential_memL2 Y.flux_memL2) x := by + rw [← hcorr] + _ = (blockVecToHilbertBlockL2Const (U := U) P) x + Y.toHilbertBlockL2 x := by + simp [Y, CorrectionFieldData.toHilbertBlockL2] + _ = ((⇑(blockVecToHilbertBlockL2Const (U := U) P) : Vec d → HilbertBlockVec d) + + (⇑Y.toHilbertBlockL2 : Vec d → HilbertBlockVec d)) x := by + rfl + _ = (blockVecToHilbertBlockL2Const (U := U) P + Y.toHilbertBlockL2) x := by + simpa [Y, CorrectionFieldData.toHilbertBlockL2, Pi.add_apply] using hsum.symm + calc + toHilbertBlockL2OfBlockField (R.recoveredField_memBlockL2 system P) + = blockVecToHilbertBlockL2Const (U := U) P + Y.toHilbertBlockL2 := hconst_add + _ = blockVecToHilbertBlockL2Const (U := U) P + + MuCorrectionSpaceRecoveryData.correctionPart R system P := by + rw [show Y.toHilbertBlockL2 = MuCorrectionSpaceRecoveryData.correctionPart R system P by + simpa [Y, MuCorrectionSpaceRecoveryData.recoveredCorrectionField] using + (MuCorrectionSpaceRecoveryData.repr_eq R + (MuCorrectionSpaceRecoveryData.correctionPart R system P))] + _ = H.minimizerMap P := by + change + H.constantField P + (H.minimizerMap P - H.constantField P) = + H.minimizerMap P + rw [add_comm, sub_add_cancel] + +theorem blockPairingAverage_repr_recoveredField_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + blockPairingAverage U a + { potential := (R.repr Y).potential + flux := (R.repr Y).flux } + (R.recoveredField system P) = 0 := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + let Z : BlockState d := + { potential := (R.repr Y).potential + flux := (R.repr Y).flux } + have hZ : + MemBlockL2 U Z.eval := by + simpa [Z, CorrectionFieldData.toBlockField, blockField] using! + (R.repr Y).memBlockL2_toBlockField + have hrepr : + toHilbertBlockL2OfBlockField (U := U) hZ = Y := by + calc + toHilbertBlockL2OfBlockField (U := U) hZ + = blockL2ToHilbertBlockL2 (U := U) (R.repr Y).toBlockL2 := by + symm + simpa [CorrectionFieldData.toBlockL2, Z, CorrectionFieldData.toBlockField] using! + (Homogenization.blockL2ToHilbertBlockL2_toBlockL2 + (U := U) + (F := (R.repr Y).toBlockField) + (R.repr Y).memBlockL2_toBlockField) + _ = (R.repr Y).toHilbertBlockL2 := by + exact (R.repr Y).blockL2ToHilbertBlockL2_toBlockL2 + _ = Y := by + exact R.repr_eq Y + calc + blockPairingAverage U a Z (R.recoveredField system P) + = H.energyBilin + (toHilbertBlockL2OfBlockField (U := U) (R.recoveredField_memBlockL2 system P)) + (toHilbertBlockL2OfBlockField (U := U) hZ) := by + symm + simpa [H] using! + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Z) + (Y := R.recoveredField system P) + hZ + (R.recoveredField_memBlockL2 system P) + _ = H.energyBilin (H.minimizerMap P) Y := by + rw [← R.recoveredField_minimizer_eq system P, hrepr] + _ = 0 := by + exact H.minimizerMap_firstVariation P Y + +theorem integral_blockPairingIntegrand_repr_recoveredField_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + ∫ x in U, + blockPairingIntegrand a + { potential := (R.repr Y).potential + flux := (R.repr Y).flux } + (R.recoveredField system P) x ∂MeasureTheory.volume = 0 := by + have hzero := R.blockPairingAverage_repr_recoveredField_eq_zero system P Y + unfold blockPairingAverage volumeAverage at hzero + exact (mul_eq_zero.mp hzero).resolve_left (inv_ne_zero hvol) + +theorem blockPairingAverage_correction_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) + (hg : MemVectorL2 U g) + (hpot : IsPotentialZeroTraceOn U f) + (hsol : IsSolenoidalZeroNormalTraceOn U g) : + blockPairingAverage U a + { potential := f + flux := g } + (R.recoveredField system P) = 0 := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + let Y : R.correctionSpace.toSubmodule := + ⟨toHilbertBlockL2OfComponents hf hg, + R.mem_correctionSpace hf hg hpot hsol⟩ + let Z : BlockState d := + { potential := f + flux := g } + have hZ : + MemBlockL2 U Z.eval := by + simpa [Z, BlockState.eval, blockField] using! memBlockL2_blockField hf hg + have hY : + toHilbertBlockL2OfBlockField (U := U) hZ = Y := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfBlockField (U := U) (F := Z.eval) hZ, + coeFn_toHilbertBlockL2OfComponents (U := U) (f := f) (g := g) hf hg] + with x hblock hfg + rw [hblock, hfg] + simp [Z, BlockState.eval, hilbertifyBlockField, hilbertBlockField, blockField] + calc + blockPairingAverage U a Z (R.recoveredField system P) + = H.energyBilin + (toHilbertBlockL2OfBlockField (U := U) (R.recoveredField_memBlockL2 system P)) + (toHilbertBlockL2OfBlockField (U := U) hZ) := by + symm + simpa [H] using! + system.toMuOperatorRealization.energyBilin_eq_blockPairingAverage_of_blockState + (X := Z) + (Y := R.recoveredField system P) + hZ + (R.recoveredField_memBlockL2 system P) + _ = H.energyBilin (H.minimizerMap P) Y := by + rw [← R.recoveredField_minimizer_eq system P, hY] + _ = 0 := by + exact H.minimizerMap_firstVariation P Y + +theorem integral_blockPairingIntegrand_correction_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) + (hg : MemVectorL2 U g) + (hpot : IsPotentialZeroTraceOn U f) + (hsol : IsSolenoidalZeroNormalTraceOn U g) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + ∫ x in U, + blockPairingIntegrand a + { potential := f + flux := g } + (R.recoveredField system P) x ∂MeasureTheory.volume = 0 := by + have hzero := R.blockPairingAverage_correction_eq_zero system P hf hg hpot hsol + unfold blockPairingAverage volumeAverage at hzero + exact (mul_eq_zero.mp hzero).resolve_left (inv_ne_zero hvol) + +end MuCorrectionSpaceRecoveryData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceEnergy.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceEnergy.lean new file mode 100644 index 0000000000..14a987d939 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceEnergy.lean @@ -0,0 +1,541 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceSolenoidal +public import Mathlib.Topology.Bases + +/-! # Correction Space Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu correction-space recovery -- block-energy and mu lower bound + +recoveredField_blockEnergyAverage_eq_mu plus its >= vecDot variants +(general, openCubeSet, cubeSet) and the mu_ge_vecDot theorems on origin +cubes. +-/ + +namespace MuCorrectionSpaceRecoveryData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +theorem quadraticEnergy_const_add_eq_blockEnergyAverage_affineField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (blockVecToHilbertBlockL2Const (U := U) P + Y) = + blockEnergyAverage U a (R.affineField P Y) := by + rw [← R.affineField_hilbert_eq_const_add P Y] + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := R.affineField P Y) + (hX := R.affineField_memBlockL2 P Y) + +theorem muCandidate_le_blockEnergyAverage_affineField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) + (Y : R.correctionSpace.toSubmodule) : + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate P ≤ + blockEnergyAverage U a (R.affineField P Y) := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + have hY : + blockVecToHilbertBlockL2Const (U := U) P + Y - H.constantField P ∈ + H.correctionSpace.correctionSpace := by + have hY' : (Y : HilbertBlockL2 U) ∈ H.correctionSpace.correctionSpace := Y.property + have hconst : H.constantField P = blockVecToHilbertBlockL2Const (U := U) P := rfl + have hsum : + blockVecToHilbertBlockL2Const (U := U) P + (Y : HilbertBlockL2 U) - H.constantField P = + (Y : HilbertBlockL2 U) := by + rw [hconst] + abel + rw [hsum] + exact hY' + have hMin : + H.muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (blockVecToHilbertBlockL2Const (U := U) P + Y) := by + simpa [H] using! H.muCandidate_le_quadraticEnergy P + (blockVecToHilbertBlockL2Const (U := U) P + Y) hY + calc + H.muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (blockVecToHilbertBlockL2Const (U := U) P + Y) := hMin + _ = blockEnergyAverage U a (R.affineField P Y) := + R.quadraticEnergy_const_add_eq_blockEnergyAverage_affineField system P Y + +theorem blockEnergyAverage_affineField_correctionPart_eq_muCandidate + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + blockEnergyAverage U a (R.affineField P (R.correctionPart system P)) = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate P := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + rw [R.affineField_correctionPart system P] + calc + blockEnergyAverage U a (R.recoveredField system P) + = + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) (R.recoveredField_memBlockL2 system P)) := by + symm + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := R.recoveredField system P) + (hX := R.recoveredField_memBlockL2 system P) + _ = quadraticEnergy H.energyBilin (H.minimizerMap P) := by + rw [R.recoveredField_minimizer_eq system P] + rfl + _ = H.muCandidate P := by + rfl + +theorem muCandidate_eq_sInf_blockEnergyAverage_affineField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate P = + sInf (Set.range + (fun Y : R.correctionSpace.toSubmodule => blockEnergyAverage U a (R.affineField P Y))) := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + let s : Set ℝ := Set.range + (fun Y : R.correctionSpace.toSubmodule => blockEnergyAverage U a (R.affineField P Y)) + have hs_nonempty : s.Nonempty := by + refine ⟨blockEnergyAverage U a (R.affineField P (R.correctionPart system P)), ?_⟩ + exact ⟨R.correctionPart system P, rfl⟩ + have h_lower : ∀ m ∈ s, H.muCandidate P ≤ m := by + intro m hm + rcases hm with ⟨Y, rfl⟩ + simpa [H] using R.muCandidate_le_blockEnergyAverage_affineField system P Y + have hs_bddBelow : BddBelow s := ⟨H.muCandidate P, h_lower⟩ + apply le_antisymm + · exact le_csInf hs_nonempty h_lower + · calc + sInf s ≤ blockEnergyAverage U a (R.affineField P (R.correctionPart system P)) := by + exact csInf_le hs_bddBelow ⟨R.correctionPart system P, rfl⟩ + _ = H.muCandidate P := by + simpa [H] using R.blockEnergyAverage_affineField_correctionPart_eq_muCandidate system P + +theorem continuous_blockEnergyAverage_affineField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + Continuous fun Y : R.correctionSpace.toSubmodule => + blockEnergyAverage U a (R.affineField P Y) := by + let f : R.correctionSpace.toSubmodule → ℝ := fun Y => + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (blockVecToHilbertBlockL2Const (U := U) P + Y) + have hf : Continuous f := by + apply (quadraticEnergy_continuous + (energyBilinOfOperator system.toMuOperatorRealization.operator)).comp + simpa [f] using! (continuous_const.add continuous_subtype_val) + convert hf using 1 + funext Y + exact (R.quadraticEnergy_const_add_eq_blockEnergyAverage_affineField system P Y).symm + +theorem muCandidate_eq_sInf_blockEnergyAverage_affineField_denseSeq + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate P = + sInf (Set.range + (fun n : ℕ => + blockEnergyAverage U a + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)))) := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + let f : ↥R.correctionSpace → ℝ := fun Y => + blockEnergyAverage U a (R.affineField P Y) + let s : Set ℝ := Set.range + (fun n : ℕ => f (TopologicalSpace.denseSeq ↥R.correctionSpace n)) + let t : Set ℝ := Set.range f + have hs_nonempty : s.Nonempty := by + refine ⟨f (TopologicalSpace.denseSeq ↥R.correctionSpace 0), ?_⟩ + exact ⟨0, rfl⟩ + have hs_subset : s ⊆ t := by + rintro x ⟨n, rfl⟩ + exact ⟨TopologicalSpace.denseSeq ↥R.correctionSpace n, rfl⟩ + have h_dense : + Dense (Set.range (TopologicalSpace.denseSeq ↥R.correctionSpace)) := by + rw [dense_iff_closure_eq] + exact (TopologicalSpace.denseRange_denseSeq ↥R.correctionSpace).closure_range + have h_image_eq : + f '' Set.range (TopologicalSpace.denseSeq ↥R.correctionSpace) = s := by + ext x + constructor + · rintro ⟨Y, ⟨n, rfl⟩, rfl⟩ + exact ⟨n, rfl⟩ + · rintro ⟨n, rfl⟩ + exact ⟨TopologicalSpace.denseSeq ↥R.correctionSpace n, ⟨n, rfl⟩, rfl⟩ + have ht_subset_closure : t ⊆ closure s := by + rw [← h_image_eq] + simpa [f, t] using! + (R.continuous_blockEnergyAverage_affineField system P).range_subset_closure_image_dense h_dense + have ht_nonempty : t.Nonempty := by + refine ⟨f (R.correctionPart system P), ?_⟩ + exact ⟨R.correctionPart system P, rfl⟩ + have h_lower : ∀ m ∈ t, H.muCandidate P ≤ m := by + intro m hm + rcases hm with ⟨Y, rfl⟩ + simpa [H, f] using R.muCandidate_le_blockEnergyAverage_affineField system P Y + have ht_bddBelow : BddBelow t := ⟨H.muCandidate P, h_lower⟩ + have ht_isGLB : IsGLB t (H.muCandidate P) := by + rw [R.muCandidate_eq_sInf_blockEnergyAverage_affineField system P] + exact isGLB_csInf ht_nonempty ht_bddBelow + have hs_isGLB : IsGLB s (H.muCandidate P) := + (isGLB_iff_of_subset_of_subset_closure hs_subset ht_subset_closure).2 ht_isGLB + symm + exact hs_isGLB.csInf_eq hs_nonempty + +theorem muCandidate_eq_iInf_blockEnergyAverage_affineField_denseSeq + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : MuOperatorSystemData U a) + (P : BlockVec d) : + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate P = + ⨅ n : ℕ, + blockEnergyAverage U a + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) := by + rw [R.muCandidate_eq_sInf_blockEnergyAverage_affineField_denseSeq system P, sInf_range] + +theorem Mu_eq_sInf_blockEnergyAverage_affineField_denseSeq + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + Mu U P a = + sInf (Set.range + (fun n : ℕ => + blockEnergyAverage U a + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)))) := by + rw [mu_eq_muCandidate P] + exact R.muCandidate_eq_sInf_blockEnergyAverage_affineField_denseSeq system P + +theorem Mu_eq_iInf_blockEnergyAverage_affineField_denseSeq + (R : MuCorrectionSpaceRecoveryData U) + [TopologicalSpace.SeparableSpace ↥R.correctionSpace] + (system : MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + Mu U P a = + ⨅ n : ℕ, + blockEnergyAverage U a + (R.affineField P (TopologicalSpace.denseSeq ↥R.correctionSpace n)) := by + rw [R.Mu_eq_sInf_blockEnergyAverage_affineField_denseSeq system mu_eq_muCandidate P, sInf_range] + +theorem Mu_eq_sInf_blockEnergyAverage_affineField + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + Mu U P a = + sInf (Set.range + (fun Y : R.correctionSpace.toSubmodule => blockEnergyAverage U a (R.affineField P Y))) := by + rw [mu_eq_muCandidate P] + exact R.muCandidate_eq_sInf_blockEnergyAverage_affineField system P + +theorem recoveredField_blockEnergyAverage_eq_mu + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + blockEnergyAverage U a (R.recoveredField system P) = Mu U P a := by + let H : MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData + symm + calc + Mu U P a = H.muCandidate P := + mu_eq_muCandidate P + _ = quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (H.minimizerMap P) := by + rfl + _ = quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (R.recoveredField_memBlockL2 system P)) := by + rw [← R.recoveredField_minimizer_eq system P] + _ = blockEnergyAverage U a (R.recoveredField system P) := by + exact system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := R.recoveredField system P) + (hX := R.recoveredField_memBlockL2 system P) + +theorem recoveredField_blockEnergyAverage_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) U) + (pairingDiagIntegrable : + ∀ P : BlockVec d, + MeasureTheory.IntegrableOn + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) U) + (pairingAverage : + ∀ P : BlockVec d, + volumeAverage U + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) = + vecDot P.1 P.2) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ blockEnergyAverage U a (R.recoveredField system P) := by + let X : BlockState d := R.recoveredField system P + have hEnergyInt : MeasureTheory.IntegrableOn (blockEnergyDensity a X) U := by + have hself := pairingIntegrable P P + have hEq : + blockEnergyDensity a X = + fun x => (1 / 2 : ℝ) * blockPairingIntegrand a X X x := by + funext x + simp [blockEnergyDensity, blockPairingIntegrand] + rw [hEq] + simpa [MeasureTheory.IntegrableOn, smul_eq_mul] using hself.integrable.const_mul (1 / 2 : ℝ) + have hPairInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (X.potential x) (X.flux x)) U := + pairingDiagIntegrable P + have hnonneg : + 0 ≤ volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) := by + unfold volumeAverage + refine mul_nonneg ?_ ?_ + · exact inv_nonneg.mpr ENNReal.toReal_nonneg + · apply MeasureTheory.integral_nonneg_of_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => + sub_nonneg.mpr (blockEnergyDensity_ge_vecDot_of_isEllipticFieldOn hEll X hx)) + have hdiff : + volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) = + blockEnergyAverage U a X - vecDot P.1 P.2 := by + calc + volumeAverage U + (fun x => blockEnergyDensity a X x - vecDot (X.potential x) (X.flux x)) = + volumeAverage U (blockEnergyDensity a X) - + volumeAverage U (fun x => vecDot (X.potential x) (X.flux x)) := by + unfold volumeAverage + rw [MeasureTheory.integral_sub hEnergyInt hPairInt] + ring + _ = blockEnergyAverage U a X - vecDot P.1 P.2 := by + rw [pairingAverage P] + simp [blockEnergyAverage] + rw [hdiff] at hnonneg + linarith + +theorem mu_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) U) + (pairingDiagIntegrable : + ∀ P : BlockVec d, + MeasureTheory.IntegrableOn + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) U) + (pairingAverage : + ∀ P : BlockVec d, + volumeAverage U + (fun x => vecDot ((R.recoveredField system P).potential x) + ((R.recoveredField system P).flux x)) = + vecDot P.1 P.2) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu U P a := by + calc + vecDot P.1 P.2 ≤ blockEnergyAverage U a (R.recoveredField system P) := + R.recoveredField_blockEnergyAverage_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable pairingDiagIntegrable pairingAverage P + _ = Mu U P a := + R.recoveredField_blockEnergyAverage_eq_mu system mu_eq_muCandidate P + +theorem mu_ge_vecDot_of_isEllipticFieldOn_of_integral_eq_zero + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) U) + (hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0) + (hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu U P a := by + simpa using + R.mu_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable + (R.recoveredField_integrableOn_pairing_of_integral_eq_zero system) + (R.recoveredField_average_pairing_of_integral_eq_zero system hpotZero hfluxZero hvol) + mu_eq_muCandidate P + +theorem recoveredField_blockEnergyAverage_ge_vecDot_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (openCubeSet (originCube d n))) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ + blockEnergyAverage (openCubeSet (originCube d n)) a (R.recoveredField system P) := by + simpa using + R.recoveredField_blockEnergyAverage_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable + (fun P => + R.recoveredField_integrableOn_pairing_openCubeSet_originCube system P) + (fun P => + R.recoveredField_average_pairing_openCubeSet_originCube system P) + P + +theorem recoveredField_blockEnergyAverage_ge_vecDot_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (cubeSet (originCube d n))) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ + blockEnergyAverage (cubeSet (originCube d n)) a (R.recoveredField system P) := by + simpa using + R.recoveredField_blockEnergyAverage_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable + (fun P => + R.recoveredField_integrableOn_pairing_cubeSet_originCube system P) + (fun P => + R.recoveredField_average_pairing_cubeSet_originCube system P) + P + +theorem mu_ge_vecDot_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (openCubeSet (originCube d n))) + (system : MuOperatorSystemData (openCubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (openCubeSet (originCube d n))) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + simpa using + R.mu_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable + (fun P => + R.recoveredField_integrableOn_pairing_openCubeSet_originCube system P) + (fun P => + R.recoveredField_average_pairing_openCubeSet_originCube system P) + mu_eq_muCandidate P + +theorem mu_ge_vecDot_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {lam Lam : ℝ} + (R : MuCorrectionSpaceRecoveryData (cubeSet (originCube d n))) + (system : MuOperatorSystemData (cubeSet (originCube d n)) a) + (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) + (cubeSet (originCube d n))) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu (cubeSet (originCube d n)) P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu (cubeSet (originCube d n)) P a := by + simpa using + R.mu_ge_vecDot_of_isEllipticFieldOn_of_pairingAverage + system hEll pairingIntegrable + (fun P => + R.recoveredField_integrableOn_pairing_cubeSet_originCube system P) + (fun P => + R.recoveredField_average_pairing_cubeSet_originCube system P) + mu_eq_muCandidate P + + +end MuCorrectionSpaceRecoveryData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceSolenoidal.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceSolenoidal.lean new file mode 100644 index 0000000000..75d6763d99 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/CorrectionSpaceSolenoidal.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceBasic + +/-! # Correction Space Solenoidal -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu correction-space recovery -- solenoidal / potential / responseSpace + +upperImage isSolenoidalOn plus the lowerImage / upperImage memVectorL2, +isPotential, and responseSpace membership theorems, both for the +zero_right slice and in full form, under IsEllipticFieldOn. +-/ + +namespace MuCorrectionSpaceRecoveryData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +theorem recoveredField_upperImage_isSolenoidalOn_zero_right + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + IsSolenoidalOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).1) := by + intro φ + have hzero := + R.integral_blockPairingIntegrand_correction_eq_zero + system + (P := (0, q)) + (f := φ.toH1Function.grad) + (g := 0) + φ.toH1Function.grad_memVectorL2 + (MeasureTheory.MemLp.zero : MemVectorL2 U (0 : Vec d → Vec d)) + φ.isPotentialZeroTraceOn + (isSolenoidalZeroNormalTraceOn_zero (U := U)) + hvol + simpa [blockPairingIntegrand, BlockState.eval, blockVecDot, vecDot_comm, + vecDot_zero_left, vecDot_zero_right] using hzero + +theorem recoveredField_lowerImage_memVectorL2_zero_right_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (q : Vec d) : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := by + have hAdm := R.recoveredField_admissible system (0, q) + have hPot : + MemVectorL2 U (R.recoveredField system (0, q)).potential := by + simpa using hAdm.1 + have hFluxDiff : + MemVectorL2 U (fun x => (R.recoveredField system (0, q)).flux x - q) := + hAdm.2.2.1 + have hFlux : + MemVectorL2 U (R.recoveredField system (0, q)).flux := by + have hconst : MemVectorL2 U (fun _ : Vec d => q) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := q) + have hsum : + MemVectorL2 U + ((fun x => (R.recoveredField system (0, q)).flux x - q) + fun _ : Vec d => q) := + hFluxDiff.add hconst + have hEq : + ((fun x => (R.recoveredField system (0, q)).flux x - q) + fun _ : Vec d => q) = + (R.recoveredField system (0, q)).flux := by + funext x + simp [sub_eq_add_neg, add_comm] + rw [hEq] at hsum + exact hsum + have hSkewPot : + MemVectorL2 U + (fun x => matVecMul (skewPart (a x)) ((R.recoveredField system (0, q)).potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hPot + have hShift : + MemVectorL2 U + (fun x => + (R.recoveredField system (0, q)).flux x - + matVecMul (skewPart (a x)) ((R.recoveredField system (0, q)).potential x)) := by + simpa [sub_eq_add_neg] using! hFlux.sub hSkewPot + have hInv : + MemVectorL2 U + (fun x => + matVecMul ((symmPart (a x))⁻¹) + ((R.recoveredField system (0, q)).flux x - + matVecMul (skewPart (a x)) ((R.recoveredField system (0, q)).potential x))) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hShift + have hEq : + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) = + (fun x => + matVecMul ((symmPart (a x))⁻¹) + ((R.recoveredField system (0, q)).flux x - + matVecMul (skewPart (a x)) ((R.recoveredField system (0, q)).potential x))) := by + funext x + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) + (p := (R.recoveredField system (0, q)).potential x) + (q := (R.recoveredField system (0, q)).flux x)) + simpa [hEq] using hInv + +theorem recoveredField_upperImage_memVectorL2_zero_right_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (q : Vec d) : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).1) := by + have hAdm := R.recoveredField_admissible system (0, q) + have hPot : + MemVectorL2 U (R.recoveredField system (0, q)).potential := by + simpa using hAdm.1 + have hLower : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := + R.recoveredField_lowerImage_memVectorL2_zero_right_of_isEllipticFieldOn system hEll q + have hSymmPot : + MemVectorL2 U + (fun x => + matVecMul (symmPart (a x)) ((R.recoveredField system (0, q)).potential x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hPot + have hSkewLower : + MemVectorL2 U + (fun x => + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hLower + have hUpper' : + MemVectorL2 U + (fun x => + matVecMul (symmPart (a x)) ((R.recoveredField system (0, q)).potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2)) := by + simpa [Pi.add_apply] using! hSymmPot.add hSkewLower + have hEq : + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).1) = + (fun x => + matVecMul (symmPart (a x)) ((R.recoveredField system (0, q)).potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2)) := by + funext x + have hsnd : + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2 = + matVecMul ((symmPart (a x))⁻¹) + ((R.recoveredField system (0, q)).flux x - + matVecMul (skewPart (a x)) + ((R.recoveredField system (0, q)).potential x)) := by + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) + (p := (R.recoveredField system (0, q)).potential x) + (q := (R.recoveredField system (0, q)).flux x)) + calc + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).1 = + matVecMul (symmPart (a x)) ((R.recoveredField system (0, q)).potential x) + + matVecMul (skewPart (a x)) + (matVecMul ((symmPart (a x))⁻¹) + ((R.recoveredField system (0, q)).flux x - + matVecMul (skewPart (a x)) + ((R.recoveredField system (0, q)).potential x))) := by + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_fst + (A := a x) + (p := (R.recoveredField system (0, q)).potential x) + (q := (R.recoveredField system (0, q)).flux x)) + _ = matVecMul (symmPart (a x)) ((R.recoveredField system (0, q)).potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := by + rw [hsnd] + simpa [hEq] using hUpper' + +theorem recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := by + refine + IsPotentialOn.of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + hHodge + (R.recoveredField_lowerImage_memVectorL2_zero_right_of_isEllipticFieldOn system hEll q) + ?_ + intro g hg hsol + have hzero := + R.integral_blockPairingIntegrand_correction_eq_zero + system + (P := (0, q)) + (f := 0) + (g := g) + (MeasureTheory.MemLp.zero : MemVectorL2 U (0 : Vec d → Vec d)) + hg + (isPotentialZeroTraceOn_zero (U := U)) + hsol + hvol + simpa [blockPairingIntegrand, BlockState.eval, blockVecDot, vecDot_zero_left] using hzero + +/-- Convex-domain version of the zero-right lower-image potential recovery. -/ +theorem recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := + R.recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) hvol q + +theorem recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + BlockResponseSpace a U (R.recoveredField system (0, q)) := by + let X : BlockState d := R.recoveredField system (0, q) + have hAdm : IsBlockMuAdmissible U (0, q) X := + R.recoveredField_admissible system (0, q) + have hUpperSol : + IsSolenoidalOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) := + R.recoveredField_upperImage_isSolenoidalOn_zero_right system hvol q + have hLowerPot : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := + R.recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll hHodge hvol q + have hFluxSol : + IsSolenoidalOn U X.flux := by + have hdiffMem : + MemVectorL2 U (fun x => X.flux x - q) := hAdm.2.2.1 + have hconstMem : MemVectorL2 U (fun _ : Vec d => q) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := q) + have hsum : + IsSolenoidalOn U ((fun x => X.flux x - q) + fun _ : Vec d => q) := + isSolenoidalOn_add_of_memVectorL2 + hdiffMem + hconstMem + hAdm.2.2.2.isSolenoidalOn + (IsSolenoidalOn.const_isSolenoidalOn_of_isSobolevRegularDomain hU hvol q) + have hEq : ((fun x => X.flux x - q) + fun _ : Vec d => q) = X.flux := by + funext x + simp [X, sub_eq_add_neg, add_comm] + rw [hEq] at hsum + exact hsum + refine ⟨?_, hFluxSol, ?_⟩ + · show IsBlockPotentialOn U X + unfold IsBlockPotentialOn + simpa using hAdm.2.1.isPotentialOn + intro Y hY + rcases hY with ⟨hYpot, hYflux⟩ + rcases hYpot with ⟨φ, hφ⟩ + let upper : Vec d → Vec d := fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + let lower : Vec d → Vec d := fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hYpotL2 : MemVectorL2 U Y.potential := by + simpa [hφ] using φ.toH1Function.grad_memVectorL2 + have hUpperL2 : MemVectorL2 U upper := by + simpa [upper, X] using + R.recoveredField_upperImage_memVectorL2_zero_right_of_isEllipticFieldOn system hEll q + have hTerm1Int : + MeasureTheory.IntegrableOn (fun x => vecDot (Y.potential x) (upper x)) U := + integrableOn_vecDot_of_memVectorL2 hYpotL2 hUpperL2 + have hTerm1Zero : + ∫ x in U, vecDot (Y.potential x) (upper x) ∂MeasureTheory.volume = 0 := by + have hzero := hUpperSol φ + simpa [upper, hφ, vecDot_comm] using hzero + have hTerm2Zero : + ∫ x in U, vecDot (Y.flux x) (lower x) ∂MeasureTheory.volume = 0 := by + rcases hLowerPot with ⟨u, hu⟩ + have hzero := hYflux u + simpa [lower, hu] using hzero + have hrewrite : + ∫ x in U, + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [upper, lower, BlockState.eval, blockVecDot] + rw [hrewrite] + by_cases hTerm2Int : + MeasureTheory.IntegrableOn (fun x => vecDot (Y.flux x) (lower x)) U + · rw [MeasureTheory.integral_add hTerm1Int hTerm2Int, hTerm1Zero, hTerm2Zero] + simp + · have hSumNotInt : + ¬MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x)) U := by + intro hSumInt + exact hTerm2Int + ((MeasureTheory.integrable_add_iff_integrable_right' + (μ := MeasureTheory.volume.restrict U) hTerm1Int).mp hSumInt) + rw [MeasureTheory.integral_undef hSumNotInt] + +theorem recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + [HasHodgeConverse U] + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + BlockResponseSpace a U (R.recoveredField system (0, q)) := + R.recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll (HasHodgeConverse.hodgeConverseCriterion (U := U)) hvol q + +/-- Convex-domain recovery wrapper for the zero-right response-space witness. +This is the preferred Chapter-2-facing surface when the domain is known to be +bounded open convex: no abstract `HasHodgeConverse` package is required. -/ +theorem recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + BlockResponseSpace a U (R.recoveredField system (0, q)) := + R.recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) hvol q + +theorem recoveredField_upperImage_isSolenoidalOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + IsSolenoidalOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).1) := by + intro φ + have hzero := + R.integral_blockPairingIntegrand_correction_eq_zero + system + (P := P) + (f := φ.toH1Function.grad) + (g := 0) + φ.toH1Function.grad_memVectorL2 + (MeasureTheory.MemLp.zero : MemVectorL2 U (0 : Vec d → Vec d)) + φ.isPotentialZeroTraceOn + (isSolenoidalZeroNormalTraceOn_zero (U := U)) + hvol + simpa [blockPairingIntegrand, BlockState.eval, blockVecDot, vecDot_comm, + vecDot_zero_left, vecDot_zero_right] using hzero + +theorem recoveredField_lowerImage_memVectorL2_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (P : BlockVec d) : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := by + let X : BlockState d := R.recoveredField system P + have hAdm : IsBlockMuAdmissible U P X := by + simpa [X] using R.recoveredField_admissible system P + have hPotDiff : MemVectorL2 U (fun x => X.potential x - P.1) := + hAdm.1 + have hPotConst : MemVectorL2 U (fun _ : Vec d => P.1) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := P.1) + have hPotSum : + MemVectorL2 U ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) := + hPotDiff.add hPotConst + have hPotEq : + ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) = X.potential := by + funext x + ext i + simp [sub_eq_add_neg, add_assoc] + have hPot : MemVectorL2 U X.potential := by + simpa [hPotEq] using hPotSum + have hFluxDiff : MemVectorL2 U (fun x => X.flux x - P.2) := + hAdm.2.2.1 + have hFluxConst : MemVectorL2 U (fun _ : Vec d => P.2) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := P.2) + have hFluxSum : + MemVectorL2 U ((fun x => X.flux x - P.2) + fun _ : Vec d => P.2) := + hFluxDiff.add hFluxConst + have hFluxEq : + ((fun x => X.flux x - P.2) + fun _ : Vec d => P.2) = X.flux := by + funext x + ext i + simp [sub_eq_add_neg, add_assoc] + have hFlux : MemVectorL2 U X.flux := by + simpa [hFluxEq] using hFluxSum + have hSkewPot : + MemVectorL2 U + (fun x => matVecMul (skewPart (a x)) (X.potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hPot + have hShift : + MemVectorL2 U + (fun x => X.flux x - + matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [sub_eq_add_neg] using! hFlux.sub hSkewPot + have hInv : + MemVectorL2 U + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hShift + have hEq : + (fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) = + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := by + funext x + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) + (p := X.potential x) + (q := X.flux x)) + simpa [X, hEq] using hInv + +theorem recoveredField_upperImage_memVectorL2_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (P : BlockVec d) : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).1) := by + let X : BlockState d := R.recoveredField system P + have hAdm : IsBlockMuAdmissible U P X := by + simpa [X] using R.recoveredField_admissible system P + have hPotDiff : MemVectorL2 U (fun x => X.potential x - P.1) := + hAdm.1 + have hPotConst : MemVectorL2 U (fun _ : Vec d => P.1) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := P.1) + have hPotSum : + MemVectorL2 U ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) := + hPotDiff.add hPotConst + have hPotEq : + ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) = X.potential := by + funext x + ext i + simp [sub_eq_add_neg, add_assoc] + have hPot : MemVectorL2 U X.potential := by + simpa [hPotEq] using hPotSum + have hLower : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := + R.recoveredField_lowerImage_memVectorL2_of_isEllipticFieldOn system hEll P + have hLowerX : + MemVectorL2 U + (fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + simpa [X] using hLower + have hSymmPot : + MemVectorL2 U + (fun x => matVecMul (symmPart (a x)) (X.potential x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hPot + have hSkewLower : + MemVectorL2 U + (fun x => + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hLowerX + have hUpper' : + MemVectorL2 U + (fun x => + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) := by + simpa [Pi.add_apply] using! hSymmPot.add hSkewLower + have hEq : + (fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) = + (fun x => + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) := by + funext x + have hsnd : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 = + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) + (p := X.potential x) + (q := X.flux x)) + calc + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 = + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) + (matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := by + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_fst + (A := a x) + (p := X.potential x) + (q := X.flux x)) + _ = matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) + ((blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + rw [hsnd] + simpa [X, hEq] using hUpper' + +theorem recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_hodgeConverseCriterion + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := by + refine + IsPotentialOn.of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + hHodge + (R.recoveredField_lowerImage_memVectorL2_of_isEllipticFieldOn system hEll P) + ?_ + intro g hg hsol + have hzero := + R.integral_blockPairingIntegrand_correction_eq_zero + system + (P := P) + (f := 0) + (g := g) + (MeasureTheory.MemLp.zero : MemVectorL2 U (0 : Vec d → Vec d)) + hg + (isPotentialZeroTraceOn_zero (U := U)) + hsol + hvol + simpa [blockPairingIntegrand, BlockState.eval, blockVecDot, vecDot_zero_left] using hzero + +/-- Convex-domain version of the lower-image potential recovery. -/ +theorem recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := + R.recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) hvol P + +theorem recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_hodgeConverseCriterion + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + BlockResponseSpace a U (R.recoveredField system P) := by + let X : BlockState d := R.recoveredField system P + have hAdm : IsBlockMuAdmissible U P X := by + simpa [X] using R.recoveredField_admissible system P + have hUpperSol : + IsSolenoidalOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) := by + simpa [X] using R.recoveredField_upperImage_isSolenoidalOn system hvol P + have hLowerPot : + IsPotentialOn U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + simpa [X] using + R.recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll hHodge hvol P + have hFluxSol : IsSolenoidalOn U X.flux := by + have hdiffMem : MemVectorL2 U (fun x => X.flux x - P.2) := + hAdm.2.2.1 + have hconstMem : MemVectorL2 U (fun _ : Vec d => P.2) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := P.2) + have hsum : + IsSolenoidalOn U ((fun x => X.flux x - P.2) + fun _ : Vec d => P.2) := + isSolenoidalOn_add_of_memVectorL2 + hdiffMem + hconstMem + hAdm.2.2.2.isSolenoidalOn + (IsSolenoidalOn.const_isSolenoidalOn_of_isSobolevRegularDomain hU hvol P.2) + have hEq : ((fun x => X.flux x - P.2) + fun _ : Vec d => P.2) = X.flux := by + funext x + ext i + simp [sub_eq_add_neg, add_assoc] + rw [hEq] at hsum + exact hsum + refine ⟨?_, hFluxSol, ?_⟩ + · have hCorrPot : IsPotentialOn U (fun x => X.potential x - P.1) := + hAdm.2.1.isPotentialOn + have hConstPot : IsPotentialOn U (fun _ : Vec d => P.1) := + (H1Function.affineOnIsSobolevRegularDomain hU P.1).isPotentialOn + have hsum : + IsPotentialOn U ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) := + isPotentialOn_add hCorrPot hConstPot + have hEq : ((fun x => X.potential x - P.1) + fun _ : Vec d => P.1) = X.potential := by + funext x + ext i + simp [sub_eq_add_neg, add_assoc] + simpa [IsBlockPotentialOn, hEq] using hsum + intro Y hY + rcases hY with ⟨hYpot, hYflux⟩ + rcases hYpot with ⟨φ, hφ⟩ + let upper : Vec d → Vec d := fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + let lower : Vec d → Vec d := fun x => + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hYpotL2 : MemVectorL2 U Y.potential := by + simpa [hφ] using φ.toH1Function.grad_memVectorL2 + have hUpperL2 : MemVectorL2 U upper := by + simpa [upper, X] using + R.recoveredField_upperImage_memVectorL2_of_isEllipticFieldOn system hEll P + have hTerm1Int : + MeasureTheory.IntegrableOn (fun x => vecDot (Y.potential x) (upper x)) U := + integrableOn_vecDot_of_memVectorL2 hYpotL2 hUpperL2 + have hTerm1Zero : + ∫ x in U, vecDot (Y.potential x) (upper x) ∂MeasureTheory.volume = 0 := by + have hzero := hUpperSol φ + simpa [upper, hφ, vecDot_comm] using hzero + have hTerm2Zero : + ∫ x in U, vecDot (Y.flux x) (lower x) ∂MeasureTheory.volume = 0 := by + rcases hLowerPot with ⟨u, hu⟩ + have hzero := hYflux u + simpa [lower, hu] using hzero + have hrewrite : + ∫ x in U, + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [upper, lower, BlockState.eval, blockVecDot] + rw [hrewrite] + by_cases hTerm2Int : + MeasureTheory.IntegrableOn (fun x => vecDot (Y.flux x) (lower x)) U + · rw [MeasureTheory.integral_add hTerm1Int hTerm2Int, hTerm1Zero, hTerm2Zero] + simp + · have hSumNotInt : + ¬MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x)) U := by + intro hSumInt + exact hTerm2Int + ((MeasureTheory.integrable_add_iff_integrable_right' + (μ := MeasureTheory.volume.restrict U) hTerm1Int).mp hSumInt) + rw [MeasureTheory.integral_undef hSumNotInt] + +theorem recoveredField_mem_responseSpace_of_isEllipticFieldOn + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + [HasHodgeConverse U] + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + BlockResponseSpace a U (R.recoveredField system P) := + R.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll (HasHodgeConverse.hodgeConverseCriterion (U := U)) hvol P + +/-- Convex-domain recovery wrapper for the full block response-space witness. +This keeps the concrete bounded-open-convex Hodge theorem visible at the +public recovery surface. -/ +theorem recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + BlockResponseSpace a U (R.recoveredField system P) := + R.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) hvol P + +end MuCorrectionSpaceRecoveryData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/RecoveryPackages.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/RecoveryPackages.lean new file mode 100644 index 0000000000..879dd4116d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/RecoveryPackages.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.CorrectionSpaceEnergy + +/-! # Recovery Packages -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu recovery -- Minimizer and PotentialSolenoidalL2 package APIs + +MuMinimizerRecoveryData namespace (ofCorrectionSpaceRecovery and the +hasQuadraticMu / exists_coarseBlockMatrix / mu_eq_half_blockVecDot +bridges) plus the PotentialSolenoidalL2RecoveryData API used by the +origin-cube recovery layer. +-/ + +namespace MuMinimizerRecoveryData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- Convert recovery data for Hilbert minimizers into the note-faithful linear +family of pointwise doubled minimizers. -/ +noncomputable def toLinearMuMinimizerFamily (M : MuMinimizerRecoveryData U a) : + LinearMuMinimizerFamily U a where + field := M.field + map_add := M.map_add + map_smul := M.map_smul + admissible := M.admissible + pairingIntegrable := M.pairingIntegrable + realizes := by + intro P + have hquad : + quadraticEnergy + (energyBilinOfOperator M.system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (M.mem_blockL2 P)) = + blockEnergyAverage U a (M.field P) := + M.system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := M.field P) + (hX := M.mem_blockL2 P) + rw [M.mu_eq_muCandidate P] + show + quadraticEnergy + (energyBilinOfOperator M.system.toMuOperatorRealization.operator) + (M.system.toMuHilbertRealization.minimizerMap P) = + blockEnergyAverage U a (M.field P) + rw [← M.minimizer_eq P] + exact hquad + +theorem hasQuadraticMu (M : MuMinimizerRecoveryData U a) : + HasQuadraticMu U a := + M.toLinearMuMinimizerFamily.hasQuadraticMu + +theorem exists_coarseBlockMatrix (M : MuMinimizerRecoveryData U a) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + M.toLinearMuMinimizerFamily.exists_coarseBlockMatrix + +theorem existsUnique_coarseBlockMatrix (M : MuMinimizerRecoveryData U a) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + M.toLinearMuMinimizerFamily.existsUnique_coarseBlockMatrix + +theorem mu_eq_half_blockVecDot_coarseBlockMatrix + (M : MuMinimizerRecoveryData U a) (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu M.hasQuadraticMu P + +/-- Build minimizer recovery data from a recovered correction space, leaving +pairing integrability as the only remaining auxiliary input. -/ +noncomputable def ofCorrectionSpaceRecovery + (system : MuOperatorSystemData U a) + (R : MuCorrectionSpaceRecoveryData U) + (pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + (R.recoveredField system P) + (R.recoveredField system Q)) U) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) : + MuMinimizerRecoveryData U a where + system := system.withCorrectionSpace R.toMuCorrectionSpaceData + field := R.recoveredField system + map_add := R.recoveredField_add system + map_smul := R.recoveredField_smul system + mem_blockL2 := R.recoveredField_memBlockL2 system + minimizer_eq := R.recoveredField_minimizer_eq system + admissible := R.recoveredField_admissible system + pairingIntegrable := pairingIntegrable + mu_eq_muCandidate := mu_eq_muCandidate + +end MuMinimizerRecoveryData + +namespace PotentialSolenoidalL2RecoveryData + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The Hilbert-space realization associated with the block-side recovery data +and a concrete doubled operator system. -/ +noncomputable def toMuHilbertRealization + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) : + MuHilbertRealization U a := + system.toMuOperatorRealization.toMuHilbertRealization + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData + +/-- The remaining recovery-side hypotheses needed to convert the Hilbert +minimization package into the note-faithful pointwise minimizer family. -/ +structure MuRecoveryCompatibilityData + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) where + pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn + (blockPairingIntegrand a + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system Q)) U + mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = (R.toMuHilbertRealization system).muCandidate P + +/-- Under ellipticity, the only non-formal field of +`MuRecoveryCompatibilityData` is the identification of `Mu` with the Hilbert +minimizer value. Pairing integrability follows automatically from the `L²` +control of recovered fields. -/ +theorem muRecoveryCompatibilityData_of_isEllipticFieldOn_of_mu_eq_muCandidate + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + ((R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)).muCandidate P)) : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol) := by + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + refine ⟨?_, ?_⟩ + · intro P Q + exact + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system Q) + hEll + · simpa [system] using mu_eq_muCandidate + +/-- The linear minimizer family produced directly from block-side recovery data +and a concrete doubled operator system. -/ +noncomputable def toLinearMuMinimizerFamily + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) : + LinearMuMinimizerFamily U a := + (MuMinimizerRecoveryData.ofCorrectionSpaceRecovery + (system := system) + (R := R.toMuCorrectionSpaceRecoveryData) + compat.pairingIntegrable + compat.mu_eq_muCandidate).toLinearMuMinimizerFamily + +/-- Build minimizer recovery data directly from block-side recovery data +`\Lpoto(U) × \Lsolo(U)` and a concrete doubled operator system. -/ +noncomputable def toMuMinimizerRecoveryData + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) : + MuMinimizerRecoveryData U a := + MuMinimizerRecoveryData.ofCorrectionSpaceRecovery + (system := system) + (R := R.toMuCorrectionSpaceRecoveryData) + compat.pairingIntegrable + compat.mu_eq_muCandidate + +theorem hasQuadraticMu + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) : + HasQuadraticMu U a := + (R.toLinearMuMinimizerFamily system compat).hasQuadraticMu + +theorem exists_coarseBlockMatrix + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + (R.toLinearMuMinimizerFamily system compat).exists_coarseBlockMatrix + +theorem existsUnique_coarseBlockMatrix + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + (R.toLinearMuMinimizerFamily system compat).existsUnique_coarseBlockMatrix + +theorem mu_eq_half_blockVecDot_coarseBlockMatrix + (R : PotentialSolenoidalL2RecoveryData U) + (system : MuOperatorSystemData U a) + (compat : MuRecoveryCompatibilityData (a := a) R system) + (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + (R.toLinearMuMinimizerFamily system compat).mu_eq_half_blockVecDot_coarseBlockMatrix P + +/-- The deterministic doubled operator system built from raw ellipticity and +the packaged block-side correction space. -/ +noncomputable def toMuOperatorSystemDataOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + MuOperatorSystemData U a := + R.toPotentialSolenoidalL2Data.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + +/-- Build minimizer recovery data directly from block-side recovery data and +raw ellipticity assumptions. -/ +noncomputable def toMuMinimizerRecoveryDataOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MuMinimizerRecoveryData U a := + R.toMuMinimizerRecoveryData + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol) compat + +theorem hasQuadraticMuOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + HasQuadraticMu U a := + (R.toMuMinimizerRecoveryDataOfIsEllipticFieldOn hEll hvol compat).hasQuadraticMu + +theorem exists_coarseBlockMatrixOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + (R.toMuMinimizerRecoveryDataOfIsEllipticFieldOn hEll hvol compat).exists_coarseBlockMatrix + +theorem existsUnique_coarseBlockMatrixOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + ∃! Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + (R.toMuMinimizerRecoveryDataOfIsEllipticFieldOn hEll hvol compat).existsUnique_coarseBlockMatrix + +theorem mu_eq_half_blockVecDot_coarseBlockMatrixOfIsEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (P : BlockVec d) : + Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + MuMinimizerRecoveryData.mu_eq_half_blockVecDot_coarseBlockMatrix + (R.toMuMinimizerRecoveryDataOfIsEllipticFieldOn hEll hvol compat) P + +/-- Under the deterministic coarse-data package, the recovery-side quadratic +representation of `\mu` identifies its pure-flux slice with the scalar +response slice `\mathcal J(U; 0, q, a)`. -/ +theorem mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_isSigmaCoarse + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (q : Vec d) : + Mu U (0, q) a = ResponseJ U 0 q a := by + have hMu := + R.mu_eq_half_blockVecDot_coarseBlockMatrixOfIsEllipticFieldOn + (a := a) hEll hvol compat (0, q) + have hResp := + basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet 0 q + calc + Mu U (0, q) a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) := by + simpa [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] using hMu + _ = ResponseJ U 0 q a := by + symm + simpa [vecDot_zero_left, vecDot_zero_right, matVecMul_zero] using hResp + +/-- Under the deterministic coarse-data package, the recovery-side quadratic +representation of `\mu` identifies its pure-gradient slice with the scalar +response slice `\mathcal J(U; p, 0, a)`. -/ +theorem mu_left_zero_eq_responseJ_zero_of_isEllipticFieldOn_of_isSigmaCoarse + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p : Vec d) : + Mu U (p, 0) a = ResponseJ U p 0 a := by + have hMu := + R.mu_eq_half_blockVecDot_coarseBlockMatrixOfIsEllipticFieldOn + (a := a) hEll hvol compat (p, 0) + have hResp := + basic_cg_identities_responseJ_zero_formula_coarseBlockMatrix_of_isSigmaCoarse + U a hA hS hK hSigma hdet p + calc + Mu U (p, 0) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + simpa [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] using hMu + _ = ResponseJ U p 0 a := by + symm + simpa using hResp + +/-- If the pure-flux slice of `\mu` matches the pure-flux slice of +`\mathcal J`, then the lower-right block of `\mathbf A(U; a)` is the canonical +`\sigma_*^{-1}(U; a)`, packaged directly from recovery data and ellipticity. -/ +theorem coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := + coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) + (R.exists_coarseBlockMatrixOfIsEllipticFieldOn hEll hvol compat) hMuResp + +/-- If the pure-flux slice of `\mu` matches the pure-flux slice of +`\mathcal J`, then the upper-left block of `\mathbf A_*^{-1}(U; a)` is the +canonical `\sigma_*^{-1}(U; a)`, packaged directly from recovery data and +ellipticity. -/ +theorem coarseStarredBlockMatrixInv_upperLeft_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (hMuResp : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) : + (coarseStarredBlockMatrixInv U a).upperLeft = sigmaStarInvCoarse U a := + coarseStarredBlockMatrixInv_upperLeft_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) + (R.exists_coarseBlockMatrixOfIsEllipticFieldOn hEll hvol compat) hMuResp + +theorem mu_ge_vecDot_of_isEllipticFieldOn + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu U P a := by + let system := R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + have hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, + ((R.toMuCorrectionSpaceRecoveryData).recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := (R.toMuCorrectionSpaceRecoveryData).recoveredCorrectionField system P + simpa [Y] using IsPotentialZeroTraceOn.integral_eq_zero Y.isPotentialZeroTrace + have hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, + ((R.toMuCorrectionSpaceRecoveryData).recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := (R.toMuCorrectionSpaceRecoveryData).recoveredCorrectionField system P + simpa [Y] using + IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU Y.isSolenoidalZeroNormalTrace + have hvol_ne : (MeasureTheory.volume U).toReal ≠ 0 := hvol.ne' + simpa [system] using + ((R.toMuCorrectionSpaceRecoveryData).mu_ge_vecDot_of_isEllipticFieldOn_of_integral_eq_zero + system hEll compat.pairingIntegrable hpotZero hfluxZero hvol_ne compat.mu_eq_muCandidate P) + +theorem mu_ge_vecDot_openCubeSet_originCubeOfIsEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {a : CoeffField d} + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos_recovery (d := d) n))) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos_recovery (d := d) n) + simpa [system] using + (R.toMuCorrectionSpaceRecoveryData.mu_ge_vecDot_openCubeSet_originCube + system hEll compat.pairingIntegrable compat.mu_eq_muCandidate P) + +theorem mu_ge_vecDot_cubeSet_originCubeOfIsEllipticFieldOn + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (cubeSet (originCube d n))) + {a : CoeffField d} + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam (cubeSet (originCube d n)) a) + (compat : + MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n))) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu (cubeSet (originCube d n)) P a := by + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_cubeSet_originCube_toReal_pos_recovery (d := d) n) + simpa [system] using + (R.toMuCorrectionSpaceRecoveryData.mu_ge_vecDot_cubeSet_originCube + system hEll compat.pairingIntegrable compat.mu_eq_muCandidate P) + +end PotentialSolenoidalL2RecoveryData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/Setup.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/Setup.lean new file mode 100644 index 0000000000..33c59b5bf5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecovery/Setup.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AffineAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Setup -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mu recovery -- private volume / bounded-domain helpers and data package + +Volume positivity / finite lemmas on origin cubes and the MuMinimizerRecoveryData +structure used as the interface between the Hilbert minimizer map and the +note-faithful linear family. +-/ + +theorem volume_cubeSet_originCube_lt_top_recovery {d : ℕ} (n : ℤ) : + MeasureTheory.volume (cubeSet (originCube d n)) < ⊤ := by + rw [lt_top_iff_ne_top] + intro htop + have hzero : (MeasureTheory.volume (cubeSet (originCube d n))).toReal = 0 := by + simp [htop] + rw [volume_cubeSet_toReal] at hzero + exact (ne_of_gt (cubeVolume_pos (originCube d n))) hzero + +theorem volume_openCubeSet_originCube_lt_top_recovery {d : ℕ} (n : ℤ) : + MeasureTheory.volume (openCubeSet (originCube d n)) < ⊤ := by + exact lt_of_le_of_lt + (MeasureTheory.measure_mono (openCubeSet_subset_cubeSet (originCube d n))) + (volume_cubeSet_originCube_lt_top_recovery (d := d) n) + +theorem volume_cubeSet_originCube_toReal_pos_recovery {d : ℕ} (n : ℤ) : + 0 < (MeasureTheory.volume (cubeSet (originCube d n))).toReal := by + rw [volume_cubeSet_toReal] + exact cubeVolume_pos (originCube d n) + +theorem volume_openCubeSet_originCube_toReal_pos_recovery {d : ℕ} (n : ℤ) : + 0 < (MeasureTheory.volume (openCubeSet (originCube d n))).toReal := by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n) + +theorem isBoundedDomain_openCubeSet_originCube_recovery {d : ℕ} (n : ℤ) : + IsBoundedDomain (openCubeSet (originCube d n)) := by + refine ⟨(1 / 2 : ℝ) * (3 : ℝ) ^ n, ?_, ?_⟩ + · have hpow : 0 < (3 : ℝ) ^ n := by + exact zpow_pos (by norm_num) _ + nlinarith + · intro x hx i + rcases (mem_openCubeSet_originCube_iff.mp hx) i with ⟨hlo, hhi⟩ + refine abs_le.2 ?_ + constructor + · exact le_of_lt (by simpa [neg_mul] using hlo) + · exact le_of_lt hhi + +theorem isBoundedDomain_cubeSet_originCube_recovery {d : ℕ} (n : ℤ) : + IsBoundedDomain (cubeSet (originCube d n)) := by + refine ⟨(1 / 2 : ℝ) * (3 : ℝ) ^ n, ?_, ?_⟩ + · have hpow : 0 < (3 : ℝ) ^ n := by + exact zpow_pos (by norm_num) _ + nlinarith + · intro x hx i + rcases (mem_cubeSet_originCube_iff.mp hx) i with ⟨hlo, hhi⟩ + refine abs_le.2 ?_ + constructor + · simpa [neg_mul] using hlo + · exact le_of_lt hhi + +theorem isSobolevRegularDomain_openCubeSet_originCube_recovery {d : ℕ} (n : ℤ) : + IsSobolevRegularDomain (openCubeSet (originCube d n)) := + ⟨measurableSet_openCubeSet (originCube d n), + isBoundedDomain_openCubeSet_originCube_recovery (d := d) n⟩ + +theorem isSobolevRegularDomain_cubeSet_originCube_recovery {d : ℕ} (n : ℤ) : + IsSobolevRegularDomain (cubeSet (originCube d n)) := + ⟨measurableSet_cubeSet (originCube d n), + isBoundedDomain_cubeSet_originCube_recovery (d := d) n⟩ + +/-! +This file isolates the remaining bridge from the Hilbert-space doubled `\mu` +problem back to the note-faithful pointwise minimizer family. + +The analytic minimization engine already produces a canonical linear map +`P ↦ X_P` in the ambient Hilbert space `L²(U; \R^{2d})`. To recover the +coarse-grained block matrix `\mathbf A(U; a)` from `\mu(U, \cdot; a)`, the +remaining missing input is a representative-level package asserting that these +Hilbert minimizers come from actual block states with the expected admissibility +and energy identities. +-/ + +section Recovery + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} +/-- +Representative-level recovery data for the Hilbert minimizers of the doubled +`\mu` problem. + +This package is intentionally theorem-surface only: it records the exact +pointwise witnesses still needed to convert the Hilbert minimizer map into the +note-faithful linear minimizer family used to prove `\exists \mathbf A(U; a)`. +-/ +structure MuMinimizerRecoveryData (U : Set (Vec d)) (a : CoeffField d) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] where + /-- The deterministic doubled operator package. -/ + system : MuOperatorSystemData U a + /-- A pointwise block-state representative of the Hilbert minimizer. -/ + field : BlockVec d → BlockState d + /-- Linearity in the coarse datum. -/ + map_add : ∀ P Q : BlockVec d, field (P + Q) = field P + field Q + /-- Homogeneity in the coarse datum. -/ + map_smul : ∀ (c : ℝ) (P : BlockVec d), field (c • P) = c • field P + /-- Each representative is an actual block `L²` field. -/ + mem_blockL2 : ∀ P : BlockVec d, MemBlockL2 U (field P).eval + /-- The chosen representative agrees with the Hilbert minimizer in `L²`. -/ + minimizer_eq : + ∀ P : BlockVec d, + toHilbertBlockL2OfBlockField (mem_blockL2 P) = + system.toMuHilbertRealization.minimizerMap P + /-- The representative is admissible for the note's definition of `\mu`. -/ + admissible : ∀ P : BlockVec d, IsBlockMuAdmissible U P (field P) + /-- Pairing integrability needed for the quadratic-family API. -/ + pairingIntegrable : + ∀ P Q : BlockVec d, + MeasureTheory.IntegrableOn (blockPairingIntegrand a (field P) (field Q)) U + /-- The note's `\mu` agrees with the Hilbert-space minimized energy. -/ + mu_eq_muCandidate : + ∀ P : BlockVec d, Mu U P a = system.toMuHilbertRealization.muCandidate P + +end Recovery + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecoveryBlockResponse.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecoveryBlockResponse.lean new file mode 100644 index 0000000000..1edc8d4d36 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuRecoveryBlockResponse.lean @@ -0,0 +1,602 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery + +/-! # Mu Recovery Block Response -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Direct convex-domain bridges from recovered fields to block-response pair-half +representations and scalar-response splitting identities. +-/ + +/-- Hodge-packaged direct recovery-to-half-pair bridge for the pure-flux +slice. This is the generic form of the convex-domain wrapper below. -/ +theorem MuCorrectionSpaceRecoveryData.exists_blockResponsePairHalfState_ae_eq_recoveredField_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + fun x => (R.recoveredField system (0, q)).eval x := by + have hResp : + BlockResponseSpace a U (R.recoveredField system (0, q)) := + R.recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol q + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := + R.recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll hHodge hvol q + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll + +/-- Hodge-packaged direct recovery-to-half-pair bridge for a general block +datum. This is the generic form of the convex-domain wrapper below. -/ +theorem MuCorrectionSpaceRecoveryData.exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + fun x => (R.recoveredField system P).eval x := by + have hResp : + BlockResponseSpace a U (R.recoveredField system P) := + R.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol P + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := + R.recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hEll hHodge hvol P + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll + +/-- Recovery-to-response bridge for the pure-flux slice, proved without any +coarse-matrix package. This is the sigma-free theorem needed before the +canonical `sigma_*^{-1}` positivity layer. -/ +theorem MuCorrectionSpaceRecoveryData.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (q0 : Vec d) : + Mu U (0, q0) a = ResponseJ U 0 q0 a := by + let Xrec : BlockState d := R.recoveredField system (0, q0) + rcases + R.exists_blockResponsePairHalfState_ae_eq_recoveredField_zero_right_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol q0 with + ⟨u, v, hEq⟩ + have hAdm : IsBlockMuAdmissible U (0, q0) Xrec := by + simpa [Xrec] using R.recoveredField_admissible system (0, q0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a 0 q0 u w) = 0 := by + simpa [Xrec] using + scalarFirstVariation_zero_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := hU.1) hEll q0 u v Xrec hEq hAdm + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (0, q0) a := by + simpa [Xrec] using + R.recoveredField_blockEnergyAverage_eq_mu system mu_eq_muCandidate (0, q0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsPotentialZeroTraceOn.integral_eq_zero + Y.isPotentialZeroTrace + have hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU + Y.isSolenoidalZeroNormalTrace + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = 0 := by + simpa [Xrec, vecDot_zero_left] using + R.recoveredField_average_pairing_of_integral_eq_zero + system hpotZero hfluxZero hvol (0, q0) + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U 0 q0 a := by + simpa [Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_zero_of_pairingAverage_eq_zero_of_firstVariation_eq_zero + (a := a) hU.1 hEll q0 u v hPair hfirst + calc + Mu U (0, q0) a = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U 0 q0 a := hCouple + +/-- Packaged pure-flux recovery/response bridge on a Hodge domain. -/ +theorem PotentialSolenoidalL2RecoveryData.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hU : IsSobolevRegularDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hHodge : HodgeConverseCriterion U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (q0 : Vec d) : + Mu U (0, q0) a = ResponseJ U 0 q0 a := by + let Rc : MuCorrectionSpaceRecoveryData U := R.toMuCorrectionSpaceRecoveryData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + exact + Rc.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + system hU hEll hHodge hvol.ne' compat.mu_eq_muCandidate q0 + +/-- Preferred convex-domain wrapper for the packaged pure-flux +recovery/response bridge. -/ +theorem PotentialSolenoidalL2RecoveryData.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (q0 : Vec d) : + Mu U (0, q0) a = ResponseJ U 0 q0 a := + R.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_hodgeConverseCriterion + hConv.isSobolevRegularDomain hEll + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hConv) + hvol compat q0 + +/-- Convex-domain direct recovery-to-half-pair bridge for the pure-flux slice. +This packages the response-space and lower-image-potential promotion into a +single theorem, so downstream users can recover the scalar primal/adjoint pair +without mentioning any Hodge or response-space intermediate hypotheses. -/ +theorem MuCorrectionSpaceRecoveryData.exists_blockResponsePairHalfState_ae_eq_recoveredField_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + fun x => (R.recoveredField system (0, q)).eval x := by + have hU : IsSobolevRegularDomain U := hConv.isSobolevRegularDomain + have hResp : + BlockResponseSpace a U (R.recoveredField system (0, q)) := + R.recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol q + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q)).eval x)).2) := + R.recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol q + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll + +/-- Convex-domain direct recovery-to-half-pair bridge for a general block +datum. -/ +theorem MuCorrectionSpaceRecoveryData.exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + (fun x => (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn U] + fun x => (R.recoveredField system P).eval x := by + have hU : IsSobolevRegularDomain U := hConv.isSobolevRegularDomain + have hResp : + BlockResponseSpace a U (R.recoveredField system P) := + R.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol P + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := + R.recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol P + exact + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll + +/-- Recovery-to-response bridge for the pure-gradient slice, proved without any +coarse-matrix package. -/ +theorem MuCorrectionSpaceRecoveryData.mu_left_zero_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (p0 : Vec d) : + Mu U (p0, 0) a = ResponseJ U p0 0 a := by + let Xrec : BlockState d := R.recoveredField system (p0, 0) + rcases + R.exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol (p0, 0) with + ⟨u, v, hEq⟩ + have hAdm : IsBlockMuAdmissible U (p0, 0) Xrec := by + simpa [Xrec] using R.recoveredField_admissible system (p0, 0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a (-p0) 0 u w) = 0 := by + simpa [Xrec] using + scalarFirstVariation_neg_left_zero_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := hConv.isOpen.measurableSet) hEll p0 u v Xrec hEq hAdm + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (p0, 0) a := by + simpa [Xrec] using + R.recoveredField_blockEnergyAverage_eq_mu system mu_eq_muCandidate (p0, 0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsPotentialZeroTraceOn.integral_eq_zero + Y.isPotentialZeroTrace + have hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsSolenoidalZeroNormalTraceOn.integral_eq_zero hConv.isSobolevRegularDomain + Y.isSolenoidalZeroNormalTrace + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = 0 := by + simpa [Xrec, vecDot_zero_right] using + R.recoveredField_average_pairing_of_integral_eq_zero + system hpotZero hfluxZero hvol (p0, 0) + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U p0 0 a := by + simpa [Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_left_zero_of_pairingAverage_eq_zero_of_firstVariation_neg_left_zero + (a := a) hEll p0 u v hPair hfirst + calc + Mu U (p0, 0) a = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U p0 0 a := hCouple + +/-- Packaged pure-gradient recovery/response bridge on a bounded open convex +domain. -/ +theorem PotentialSolenoidalL2RecoveryData.mu_left_zero_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (p0 : Vec d) : + Mu U (p0, 0) a = ResponseJ U p0 0 a := by + let Rc : MuCorrectionSpaceRecoveryData U := R.toMuCorrectionSpaceRecoveryData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + exact + Rc.mu_left_zero_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol.ne' compat.mu_eq_muCandidate p0 + +/-- Recovery-to-response bridge for the full mixed slice, proved without any +coarse-matrix package. -/ +theorem MuCorrectionSpaceRecoveryData.responseJ_eq_mu_neg_left_sub_vecDot_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu U P a = + (system.toMuOperatorRealization.toMuHilbertRealization R.toMuCorrectionSpaceData).muCandidate + P) + (p0 q0 : Vec d) : + ResponseJ U p0 q0 a = Mu U (-p0, q0) a - vecDot p0 q0 := by + let Xrec : BlockState d := R.recoveredField system (-p0, q0) + rcases + R.exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol (-p0, q0) with + ⟨u, v, hEq⟩ + have hAdm : IsBlockMuAdmissible U (-p0, q0) Xrec := by + simpa [Xrec] using R.recoveredField_admissible system (-p0, q0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p0 q0 u w) = 0 := by + simpa [Xrec] using + scalarFirstVariation_neg_left_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := hConv.isOpen.measurableSet) hEll (-p0) q0 u v Xrec hEq hAdm + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (-p0, q0) a := by + simpa [Xrec] using + R.recoveredField_blockEnergyAverage_eq_mu system mu_eq_muCandidate (-p0, q0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hpotZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).potential x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsPotentialZeroTraceOn.integral_eq_zero + Y.isPotentialZeroTrace + have hfluxZero : + ∀ P : BlockVec d, + (fun i => ∫ x in U, (R.recoveredCorrectionField system P).flux x i + ∂MeasureTheory.volume) = 0 := by + intro P + let Y := R.recoveredCorrectionField system P + exact IsSolenoidalZeroNormalTraceOn.integral_eq_zero hConv.isSobolevRegularDomain + Y.isSolenoidalZeroNormalTrace + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = -vecDot p0 q0 := by + simpa [Xrec, vecDot_neg_left] using + R.recoveredField_average_pairing_of_integral_eq_zero + system hpotZero hfluxZero hvol (-p0, q0) + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = -vecDot p0 q0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U p0 q0 a - (-vecDot p0 q0) := by + simpa [Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_sub_pairing_of_pairingAverage_eq_of_firstVariation_eq_zero + (a := a) hEll p0 q0 u v (-vecDot p0 q0) hPair hfirst + have hMu : + Mu U (-p0, q0) a = ResponseJ U p0 q0 a + vecDot p0 q0 := by + calc + Mu U (-p0, q0) a = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U p0 q0 a - (-vecDot p0 q0) := hCouple + _ = ResponseJ U p0 q0 a + vecDot p0 q0 := by ring + linarith + +/-- Packaged full mixed recovery/response bridge on a bounded open convex +domain. -/ +theorem PotentialSolenoidalL2RecoveryData.responseJ_eq_mu_neg_left_sub_vecDot_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + (p0 q0 : Vec d) : + ResponseJ U p0 q0 a = Mu U (-p0, q0) a - vecDot p0 q0 := by + let Rc : MuCorrectionSpaceRecoveryData U := R.toMuCorrectionSpaceRecoveryData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + exact + Rc.responseJ_eq_mu_neg_left_sub_vecDot_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol.ne' compat.mu_eq_muCandidate p0 q0 + +/-- Convex-domain direct scalar-response splitting for the pure-flux recovered +field. This is the note-facing form of the previous bridge. -/ +theorem MuCorrectionSpaceRecoveryData.volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_recoveredField_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q0 p pStar q qStar : Vec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + (R.recoveredField system (0, q0))) = + (1 / 2 : ℝ) * volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + have hU : IsSobolevRegularDomain U := hConv.isSobolevRegularDomain + have hResp : + BlockResponseSpace a U (R.recoveredField system (0, q0)) := + R.recoveredField_mem_responseSpace_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol q0 + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system (0, q0)).eval x)).2) := + R.recoveredField_lowerImage_isPotential_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol q0 + exact + volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll p pStar q qStar + +/-- Convex-domain direct scalar-response splitting for a general recovered +block datum. -/ +theorem MuCorrectionSpaceRecoveryData.volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : MuCorrectionSpaceRecoveryData U) + (system : MuOperatorSystemData U a) + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (P : BlockVec d) (p pStar q qStar : Vec d) : + ∃ u : AHarmonicFunction a U, + ∃ v : AHarmonicFunction (Homogenization.adjointCoeffField a) U, + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + (R.recoveredField system P)) = + (1 / 2 : ℝ) * volumeAverage U + (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + have hU : IsSobolevRegularDomain U := hConv.isSobolevRegularDomain + have hResp : + BlockResponseSpace a U (R.recoveredField system P) := + R.recoveredField_mem_responseSpace_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol P + have hLower : + IsPotentialOn U + (fun x => + (blockMatVecMul (blockCoeffField a x) + ((R.recoveredField system P).eval x)).2) := + R.recoveredField_lowerImage_isPotential_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system hConv hEll hvol P + exact + volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_of_mem_responseSpace_of_lowerImage_isPotential_of_isEllipticFieldOn + (a := a) hU.1 hResp hLower hEll p pStar q qStar + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuWellPosedness.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuWellPosedness.lean new file mode 100644 index 0000000000..c92d32ecdb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/MuWellPosedness.lean @@ -0,0 +1,285 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import Mathlib.Analysis.InnerProductSpace.LinearMap +public import Mathlib.Analysis.InnerProductSpace.Symmetric + +/-! # Mu Well Posedness -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file records the Hilbert-space well-posedness package behind the doubled +`\mu` problem. + +The notes minimize a uniformly convex quadratic energy over the affine space +`P + \Lpoto(U) × \Lsolo(U)` inside the Hilbert space `L²(U; \R^{2d})`. At the +current stage of the formalization, we package that setup abstractly: an +ambient real Hilbert space, a closed subspace modeling `\mathcal{H}(U)`, a +linear embedding of the parameter `P ∈ \R^{2d}`, and a coercive symmetric +bilinear form. + +This does not replace the note's definition of `\mu(U,P;\a)`. It isolates the +analytic theorem surface needed to turn the doubled minimization problem into a +canonical linear minimizer map `P ↦ X_P`. +-/ + +noncomputable section + +section OperatorEnergy + +variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℝ H] + +/-- The bilinear form induced by a continuous operator on a real Hilbert +space. -/ +noncomputable def energyBilinOfOperator (T : H →L[ℝ] H) : + H →L[ℝ] H →L[ℝ] ℝ := + (innerSL ℝ).comp T + +@[simp] theorem energyBilinOfOperator_apply (T : H →L[ℝ] H) (X Y : H) : + energyBilinOfOperator T X Y = inner ℝ (T X) Y := by + simp [energyBilinOfOperator, innerSL_apply_apply] + +theorem energyBilinOfOperator_symm (T : H →L[ℝ] H) + (hT : LinearMap.IsSymmetric (T : H →ₗ[ℝ] H)) : + ∀ X Y : H, energyBilinOfOperator T X Y = energyBilinOfOperator T Y X := by + intro X Y + calc + energyBilinOfOperator T X Y = inner ℝ (T X) Y := by + simp + _ = inner ℝ X (T Y) := by + simpa using hT.apply_clm X Y + _ = inner ℝ (T Y) X := by + rw [real_inner_comm] + _ = energyBilinOfOperator T Y X := by + simp + +end OperatorEnergy + +/-- +Black-box Hilbert-space data for the doubled `\mu` problem on `U`. + +The intended future instantiation is: +- `ambient = L²(U; \R^{2d})` or an equivalent Hilbert realization; +- `hilbertSubspace = \Lpoto(U) × \Lsolo(U)`; +- `constantField P =` the constant field with value `P`; +- `energyBilin X Y = \fint_U X \cdot \mathbf{A}(\a) Y`. +-/ +structure MuHilbertProblem {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- The ambient Hilbert space modeling `L²(U; \R^{2d})`. -/ + ambient : Type* + instNormedAddCommGroup : NormedAddCommGroup ambient + instInnerProductSpace : InnerProductSpace ℝ ambient + instCompleteSpace : CompleteSpace ambient + /-- The closed subspace modeling `\mathcal{H}(U) = \Lpoto(U) × \Lsolo(U)`. -/ + hilbertSubspace : ClosedSubmodule ℝ ambient + /-- The embedding of the parameter `P ∈ \R^{2d}` as a constant ambient field. -/ + constantField : BlockVec d →L[ℝ] ambient + /-- The averaged doubled energy bilinear form. -/ + energyBilin : ambient →L[ℝ] ambient →L[ℝ] ℝ + /-- Symmetry of the energy bilinear form. -/ + energySymm : ∀ X Y : ambient, energyBilin X Y = energyBilin Y X + /-- Coercivity of the energy bilinear form. -/ + energyCoercive : IsCoercive energyBilin + +attribute [instance] MuHilbertProblem.instNormedAddCommGroup +attribute [instance] MuHilbertProblem.instInnerProductSpace +attribute [instance] MuHilbertProblem.instCompleteSpace + +namespace MuHilbertProblem + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- The canonical minimizer in the affine space `P + \mathcal{H}(U)`. -/ +noncomputable def minimizerMap (M : MuHilbertProblem U a) : + BlockVec d →L[ℝ] M.ambient := + parameterAffineMinimizerMap + (K := M.hilbertSubspace) + (B := M.energyBilin) + (hB := M.energyCoercive) + (ι := M.constantField) + +@[simp] theorem minimizerMap_apply (M : MuHilbertProblem U a) (P : BlockVec d) : + M.minimizerMap P = + affineMinimizerMap M.hilbertSubspace M.energyBilin M.energyCoercive (M.constantField P) := + rfl + +/-- The correction from `P` to the minimizer lies in `\mathcal{H}(U)`. -/ +theorem sub_minimizerMap_apply_mem (M : MuHilbertProblem U a) (P : BlockVec d) : + M.minimizerMap P - M.constantField P ∈ M.hilbertSubspace := by + change affineMinimizerMap M.hilbertSubspace M.energyBilin M.energyCoercive (M.constantField P) - + M.constantField P ∈ M.hilbertSubspace + exact + sub_affineMinimizerMap_apply_mem M.hilbertSubspace M.energyBilin M.energyCoercive + (M.constantField P) + +/-- First variation of the minimized energy against all directions in +`\mathcal{H}(U)`. -/ +theorem minimizerMap_firstVariation (M : MuHilbertProblem U a) (P : BlockVec d) + (Y : M.hilbertSubspace.toSubmodule) : + M.energyBilin (M.minimizerMap P) Y = 0 := by + simpa [minimizerMap] using + parameterAffineMinimizerMap_firstVariation + (K := M.hilbertSubspace) + (B := M.energyBilin) + (hB := M.energyCoercive) + (ι := M.constantField) + (p := P) + (w := Y) + +/-- The minimized quadratic energy attached to the Hilbert-space package. -/ +noncomputable def muCandidate (M : MuHilbertProblem U a) (P : BlockVec d) : ℝ := + quadraticEnergy M.energyBilin (M.minimizerMap P) + +/-- The canonical minimizer minimizes the quadratic energy over the whole affine +space `P + \mathcal{H}(U)`. -/ +theorem muCandidate_le_quadraticEnergy (M : MuHilbertProblem U a) (P : BlockVec d) + (X : M.ambient) (hX : X - M.constantField P ∈ M.hilbertSubspace) : + M.muCandidate P ≤ quadraticEnergy M.energyBilin X := by + simpa [muCandidate, minimizerMap] using + parameterAffineMinimizerMap_minimizes_quadraticEnergy + (K := M.hilbertSubspace) + (hB := M.energyCoercive) + (h_symm := M.energySymm) + (ι := M.constantField) + (p := P) + (y := X) + hX + +/-- Uniqueness of the Hilbert minimizer in the affine correction space. -/ +theorem eq_minimizerMap_of_quadraticEnergy_le_muCandidate + (M : MuHilbertProblem U a) (P : BlockVec d) + (X : M.ambient) (hX : X - M.constantField P ∈ M.hilbertSubspace) + (hle : quadraticEnergy M.energyBilin X ≤ M.muCandidate P) : + X = M.minimizerMap P := by + simpa [muCandidate, minimizerMap] using + eq_affineMinimizerMap_of_quadraticEnergy_le + (K := M.hilbertSubspace) + (hB := M.energyCoercive) + (h_symm := M.energySymm) + (x := M.constantField P) + (y := X) + hX + hle + +end MuHilbertProblem + +/-- +A realization of the doubled `\mu` problem in the actual ambient Hilbert space +`L²(U; \R^{2d})`. + +This keeps the abstract minimization engine of `MuHilbertProblem`, but now the +ambient type is fixed to the concrete Hilbert-valued `L²` space built in the +Sobolev layer. +-/ +structure MuHilbertRealization {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + /-- The closed correction space `\Lpoto(U) × \Lsolo(U)` inside the concrete + Hilbert ambient space. -/ + correctionSpace : MuCorrectionSpaceData U + /-- The constant field embedding of `P ∈ \R^{2d}` into `L²(U; \R^{2d})`. -/ + constantField : BlockVec d →L[ℝ] HilbertBlockL2 U + /-- The averaged doubled energy bilinear form on the concrete ambient space. -/ + energyBilin : HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U →L[ℝ] ℝ + /-- Symmetry of the energy bilinear form. -/ + energySymm : ∀ X Y : HilbertBlockL2 U, energyBilin X Y = energyBilin Y X + /-- Coercivity of the energy bilinear form. -/ + energyCoercive : IsCoercive energyBilin + +namespace MuHilbertRealization + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + +/-- Package the doubled `\mu` problem from a symmetric coercive operator on +the concrete Hilbert ambient space `L²(U; \R^{2d})`. -/ +noncomputable def ofOperator + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (correctionSpace : MuCorrectionSpaceData U) + (operator : HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U) + (operatorSymm : LinearMap.IsSymmetric (operator : HilbertBlockL2 U →ₗ[ℝ] HilbertBlockL2 U)) + (operatorCoercive : IsCoercive (energyBilinOfOperator operator)) : + MuHilbertRealization U a where + correctionSpace := correctionSpace + constantField := blockVecToHilbertBlockL2Const (U := U) + energyBilin := energyBilinOfOperator operator + energySymm := energyBilinOfOperator_symm operator operatorSymm + energyCoercive := operatorCoercive + +/-- Forget the concrete ambient realization and view it as an abstract +`MuHilbertProblem`. -/ +noncomputable def toProblem (M : MuHilbertRealization U a) : MuHilbertProblem U a where + ambient := HilbertBlockL2 U + instNormedAddCommGroup := inferInstance + instInnerProductSpace := inferInstance + instCompleteSpace := inferInstance + hilbertSubspace := M.correctionSpace.correctionSpace + constantField := M.constantField + energyBilin := M.energyBilin + energySymm := M.energySymm + energyCoercive := M.energyCoercive + +/-- The canonical minimizer map in the actual ambient Hilbert space +`L²(U; \R^{2d})`. -/ +noncomputable def minimizerMap (M : MuHilbertRealization U a) : + BlockVec d →L[ℝ] HilbertBlockL2 U := + MuHilbertProblem.minimizerMap M.toProblem + +@[simp] theorem minimizerMap_apply (M : MuHilbertRealization U a) (P : BlockVec d) : + M.minimizerMap P = MuHilbertProblem.minimizerMap M.toProblem P := + rfl + +/-- The minimizer correction lies in the concrete correction space +`\Lpoto(U) × \Lsolo(U)`. -/ +theorem sub_minimizerMap_apply_mem (M : MuHilbertRealization U a) (P : BlockVec d) : + M.minimizerMap P - M.constantField P ∈ M.correctionSpace.correctionSpace := by + exact MuHilbertProblem.sub_minimizerMap_apply_mem M.toProblem P + +/-- First variation of the minimized energy against all concrete correction +directions. -/ +theorem minimizerMap_firstVariation (M : MuHilbertRealization U a) (P : BlockVec d) + (Y : M.correctionSpace.correctionSpace.toSubmodule) : + M.energyBilin (M.minimizerMap P) Y = 0 := by + change M.toProblem.energyBilin (MuHilbertProblem.minimizerMap M.toProblem P) + (Y : HilbertBlockL2 U) = 0 + exact MuHilbertProblem.minimizerMap_firstVariation M.toProblem P Y + +/-- The minimized quadratic energy attached to the concrete Hilbert +realization. -/ +noncomputable def muCandidate (M : MuHilbertRealization U a) (P : BlockVec d) : ℝ := + MuHilbertProblem.muCandidate M.toProblem P + +/-- The canonical minimizer minimizes the quadratic energy over the concrete +affine space `P + \Lpoto(U) × \Lsolo(U)`. -/ +theorem muCandidate_le_quadraticEnergy (M : MuHilbertRealization U a) (P : BlockVec d) + (X : HilbertBlockL2 U) + (hX : X - M.constantField P ∈ M.correctionSpace.correctionSpace) : + M.muCandidate P ≤ quadraticEnergy M.energyBilin X := by + exact MuHilbertProblem.muCandidate_le_quadraticEnergy M.toProblem P X hX + +/-- Uniqueness of the concrete Hilbert minimizer in the affine correction +space. -/ +theorem eq_minimizerMap_of_quadraticEnergy_le_muCandidate + (M : MuHilbertRealization U a) (P : BlockVec d) + (X : HilbertBlockL2 U) + (hX : X - M.constantField P ∈ M.correctionSpace.correctionSpace) + (hle : quadraticEnergy M.energyBilin X ≤ M.muCandidate P) : + X = M.minimizerMap P := by + change X = M.toProblem.minimizerMap P + exact + MuHilbertProblem.eq_minimizerMap_of_quadraticEnergy_le_muCandidate + M.toProblem P X hX hle + +end MuHilbertRealization + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery.lean new file mode 100644 index 0000000000..6cdd91a53c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Translate +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.MuGeVecDot +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.DeterministicCoarseData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Subadditivity + +/-! +# Origin-cube elliptic recovery (aggregate re-export) + +Previously a 2296-line monolithic module; now split along thematic boundaries +into the files imported above. This shim re-exports everything so +existing consumers keep working unchanged. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/DeterministicCoarseData.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/DeterministicCoarseData.lean new file mode 100644 index 0000000000..1f40e99eb8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/DeterministicCoarseData.lean @@ -0,0 +1,629 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.MuGeVecDot + +/-! +# Origin-cube elliptic recovery -- deterministic coarse data output + +Adjoint-free sigma_* <= sigma and sigma <= b orderings on the centered open +cube, the packaged openCubeDeterministicCoarseData_of_triadicCube and its +descendant-family variant. These are the outputs consumed by the Chapter-3 +coarse Poincare wrappers. +-/ + +@[expose] public section + +namespace Homogenization + + +/-- +Adjoint-free deterministic ordering `σ_*(U; a) ≤ σ(U; a)` on the centered +open cube, packaged directly from deterministic recovery-plus-ellipticity +data. +-/ +theorem sigmaStarCoarse_le_sigmaCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p (matVecMul (sigmaStarCoarse (openCubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul (sigmaCoarse (openCubeSet (originCube d n)) a) p) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) + hCompat hA hS hK hSigma p + +/-- +Deterministic ordering `σ(U; a) ≤ b(U; a)` on the centered open cube, +packaged directly from deterministic recovery-plus-ellipticity data. +-/ +theorem sigmaCoarse_le_bCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (sigmaCoarse (openCubeSet (originCube d n)) a) + (bCoarse + (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) + hCompat hS hK hSigma + +/-- +Deterministic upper bound +`b(U; a) ≤ average(symmPart(a) + k(a)ᵀ symmPart(a)⁻¹ k(a))` +on the centered open cube, packaged directly from deterministic +recovery-plus-ellipticity data. +-/ +theorem bCoarse_le_averaged_symmPart_plus_correction_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + vecDot p + (matVecMul + (bCoarse + (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) p) ≤ + volumeAverage (openCubeSet (originCube d n)) + (fun x => + vecDot p + (matVecMul + (symmPart (a x) + + matTranspose (skewPart (a x)) * (symmPart (a x))⁻¹ * skewPart (a x)) p)) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + bCoarse_le_averaged_symmPart_plus_correction_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) + hCompat hA hS hK hSigma p + +/-- +Deterministic upper-left matrix-order bound +`b(U; a) ≤ average(symmPart(a) + k(a)ᵀ symmPart(a)⁻¹ k(a))` +on the centered open cube, packaged directly from deterministic +recovery-plus-ellipticity data. +-/ +theorem bCoarse_le_averagedSymmPartPlusCorrection_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (bCoarse + (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a)) + (averagedSymmPartPlusCorrection (openCubeSet (originCube d n)) a) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) + hCompat hA hS hK hSigma + +/-- +Deterministic inverse-side harmonic-mean upper bound +`σ_*^{-1}(U; a) ≤ average(symmPart(a)⁻¹)` +on the centered open cube, packaged directly from deterministic +recovery-plus-ellipticity data. +-/ +theorem sigmaStarInvCoarse_le_averaged_symmPart_inv_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q : Vec d) : + vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet (originCube d n)) a) q) ≤ + volumeAverage (openCubeSet (originCube d n)) + (fun x => vecDot q (matVecMul ((symmPart (a x))⁻¹) q)) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + sigmaStarInvCoarse_le_averaged_symmPart_inv_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) + hCompat q + +/-- +Deterministic inverse-side harmonic-mean matrix bound +`σ_*^{-1}(U; a) ≤ average(symmPart(a)^{-1})` +on the centered open cube, packaged directly from deterministic +recovery-plus-ellipticity data. +-/ +theorem sigmaStarInvCoarse_le_averagedSymmPartInv_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) : + MatLoewnerLE + (sigmaStarInvCoarse (openCubeSet (originCube d n)) a) + (averagedSymmPartInv (openCubeSet (originCube d n)) a) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + sigmaStarInvCoarse_le_averagedSymmPartInv_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) hCompat + +/-- +Deterministic harmonic-mean lower bound +`(average(symmPart(a)^{-1}))^{-1} ≤ σ_*(U; a)` on the centered open cube, +packaged directly from deterministic recovery-plus-ellipticity data. +-/ +theorem harmonicMeanSymmPart_le_sigmaStarCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) : + MatLoewnerLE + ((averagedSymmPartInv (openCubeSet (originCube d n)) a)⁻¹) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) := by + rcases hData with ⟨hEll, hCompat⟩ + exact + harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) (a := a) R + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) hCompat + +/-- +Minimal one-cube deterministic coarse-data constructor from translated +origin-cube recovery data. + +This is the exact upstream theorem needed to start removing the remaining +`OpenCubeDescendantDeterministicCoarseData` burden from the note-facing Chapter +3 coarse Poincare wrappers. +-/ +theorem openCubeDeterministicCoarseData_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hRec : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + OpenCubeDeterministicCoarseData Q a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + let U0 : Set (Vec d) := openCubeSet (originCube d Q.scale) + let a0 : CoeffField d := translateCoeffField z a + let : Fact (MeasureTheory.volume U0 < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) Q.scale⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U0) := by + simpa [volumeMeasureOn, U0] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d Q.scale)).isFiniteMeasure_restrict_volume + have hEll : IsEllipticFieldOn lam Lam U0 a0 := Classical.choose hRec + let system : MuOperatorSystemData U0 a0 := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) Q.scale) + have hCompat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData + (a := a0) R system := by + simpa [U0, a0, system] using Classical.choose_spec hRec + have hex0 : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix U0 a0 Abar := by + simpa [U0, a0] using + exists_coarseBlockMatrix_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a0) hRec + have hA0coarse : IsCoarseBlockMatrix U0 a0 (coarseBlockMatrix U0 a0) := + isCoarseBlockMatrix_coarseBlockMatrix hex0 + have hMuRespQ0 : + ∀ q : Vec d, Mu U0 (0, q) a0 = ResponseJ U0 0 q a0 := by + intro q + simpa [U0, a0] using + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a0) hRec q + have hMuRespP0 : + ∀ p : Vec d, Mu U0 (p, 0) a0 = ResponseJ U0 p 0 a0 := by + intro p + simpa [U0, a0] using + mu_left_zero_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a0) hRec p + have hResp0 : + ∀ p q : Vec d, + ResponseJ U0 p q a0 = Mu U0 (-p, q) a0 - vecDot p q := by + intro p q + simpa [U0, a0] using + responseJ_eq_mu_neg_left_sub_vecDot_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a0) hRec p q + have hSInvLower : + IsSigmaStarInvCoarse U0 a0 (coarseBlockMatrix U0 a0).lowerRight := by + exact + isSigmaStarInvCoarse_coarseBlockMatrix_lowerRight_of_mu_zero_right_eq_responseJ_zero + (U := U0) (a := a0) hex0 hMuRespQ0 + have hSInv0 : IsSigmaStarInvCoarse U0 a0 (sigmaStarInvCoarse U0 a0) := by + exact isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨(coarseBlockMatrix U0 a0).lowerRight, hSInvLower⟩ + have hMlower : + IsSigmaStarInvKappaCoarse U0 a0 (-(coarseBlockMatrix U0 a0).lowerLeft) := by + exact + isSigmaStarInvKappaCoarse_neg_coarseBlockMatrix_lowerLeft_of_exact_slices + (U := U0) (a := a0) hex0 hMuRespQ0 hMuRespP0 hResp0 + have hM0 : IsSigmaStarInvKappaCoarse U0 a0 (sigmaStarInvKappaCoarse U0 a0) := by + exact isSigmaStarInvKappaCoarse_sigmaStarInvKappaCoarse + ⟨-(coarseBlockMatrix U0 a0).lowerLeft, hMlower⟩ + have hdetInv0 : IsUnit (sigmaStarInvCoarse U0 a0).det := by + have hzeroMem : (0 : Vec d) ∈ U0 := by + have hpow : 0 < (3 : ℝ) ^ Q.scale := by + positivity + change (0 : Vec d) ∈ openCubeSet (originCube d Q.scale) + rw [mem_openCubeSet_originCube_iff] + intro i + have hhalfpow : 0 < (1 / 2 : ℝ) * (3 : ℝ) ^ Q.scale := by + positivity + constructor + · have hneg : -((1 / 2 : ℝ) * (3 : ℝ) ^ Q.scale) < 0 := by + linarith + simpa [neg_mul] using hneg + · simpa using hhalfpow + have hlam_pos : 0 < lam := (hEll.2 0 hzeroMem).1 + have hden_pos : 0 < 1 + 2 * Lam ^ 2 := by + nlinarith [sq_nonneg Lam] + have hcoeff_pos : 0 < lam / (1 + 2 * Lam ^ 2) := by + exact div_pos hlam_pos hden_pos + have hcoeff_half_pos : 0 < lam / (2 * (1 + 2 * Lam ^ 2)) := by + have hden2_pos : 0 < 2 * (1 + 2 * Lam ^ 2) := by + positivity + exact div_pos hlam_pos hden2_pos + have hcoeff_half_nonneg : 0 ≤ lam / (2 * (1 + 2 * Lam ^ 2)) := by + positivity + have hquad_pos : + ∀ q : Vec d, q ≠ 0 → 0 < vecDot q (matVecMul (sigmaStarInvCoarse U0 a0) q) := by + intro q hq + let Xq : BlockState d := (R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q) + have hAdm : IsBlockMuAdmissible U0 (0, q) Xq := by + simpa [U0, system, Xq] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system (0, q) + have hFluxDiff : MemVectorL2 U0 (fun x => Xq.flux x - q) := + hAdm.fluxCorrection_memL2 + have hFlux : MemVectorL2 U0 Xq.flux := by + have hconst : MemVectorL2 U0 (fun _ : Vec d => q) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U0) (p := (2 : ENNReal)) (c := q) + have hsum : + MemVectorL2 U0 ((fun x => Xq.flux x - q) + fun _ : Vec d => q) := + hFluxDiff.add hconst + have hEq : + ((fun x => Xq.flux x - q) + fun _ : Vec d => q) = Xq.flux := by + funext x + simp [Xq, sub_eq_add_neg, add_comm] + rw [hEq] at hsum + exact hsum + have hFluxSqInt : MeasureTheory.IntegrableOn (fun x => vecNormSq (Xq.flux x)) U0 := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hFlux hFlux + have hEnergyInt : + MeasureTheory.IntegrableOn (blockEnergyDensity a0 Xq) U0 := by + exact blockEnergyDensity_integrableOn_of_memBlockL2_of_isEllipticFieldOn + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system (0, q)) hEll + have hFluxAvg : + (fun i => volumeAverage U0 (fun x => Xq.flux x i)) = q := by + simpa [U0, Xq] using + congrArg Prod.snd + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_average_state_openCubeSet_originCube + system (0, q)) + have hJensen : + vecNormSq q ≤ volumeAverage U0 (fun x => vecNormSq (Xq.flux x)) := by + have hraw := + vecNormSq_volumeAverage_le_volumeAverage_vecNormSq + (U := U0) + (hU := measurableSet_openCubeSet (originCube d Q.scale)) + (hvol := (volume_openCubeSet_originCube_toReal_pos (d := d) Q.scale).ne') + hFlux + rw [hFluxAvg] at hraw + exact hraw + have hpoint : + ∀ x ∈ U0, + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x) ≤ + blockEnergyDensity a0 Xq x := by + intro x hx + have hcoer := + blockMatrixOfCoeff_coercive_of_isEllipticMatrix (hEll.2 x hx) (Xq.eval x) + have hcoeff_nonneg : 0 ≤ lam / (1 + 2 * Lam ^ 2) := by + positivity + have hflux_le_block : + vecNormSq (Xq.flux x) ≤ blockVecDot (Xq.eval x) (Xq.eval x) := by + change vecNormSq (Xq.flux x) ≤ + vecNormSq (Xq.potential x) + vecNormSq (Xq.flux x) + exact le_add_of_nonneg_left (vecNormSq_nonneg (Xq.potential x)) + have hflux_scaled : + (lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x) ≤ + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (Xq.eval x) (Xq.eval x) := by + exact mul_le_mul_of_nonneg_left hflux_le_block hcoeff_nonneg + have hcoer' : + (lam / (1 + 2 * Lam ^ 2)) * blockVecDot (Xq.eval x) (Xq.eval x) ≤ + 2 * blockEnergyDensity a0 Xq x := by + simpa [blockEnergyDensity, Xq] using! hcoer + have hchain : + (lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x) ≤ + 2 * blockEnergyDensity a0 Xq x := le_trans hflux_scaled hcoer' + have hhalf := + mul_le_mul_of_nonneg_left hchain (show (0 : ℝ) ≤ 1 / 2 by norm_num) + have hleft : + (1 / 2 : ℝ) * ((lam / (1 + 2 * Lam ^ 2)) * vecNormSq (Xq.flux x)) = + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x) := by + field_simp [hden_pos.ne'] + have hright : + (1 / 2 : ℝ) * (2 * blockEnergyDensity a0 Xq x) = blockEnergyDensity a0 Xq x := by + ring + rw [hleft, hright] at hhalf + exact hhalf + have hEnergyLower : + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U0 (fun x => vecNormSq (Xq.flux x)) ≤ + blockEnergyAverage U0 a0 Xq := by + calc + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U0 (fun x => vecNormSq (Xq.flux x)) + = + volumeAverage U0 (fun x => + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq (Xq.flux x)) := by + symm + simpa [smul_eq_mul] using! + (volumeAverage_smul U0 (lam / (2 * (1 + 2 * Lam ^ 2))) + (fun x => vecNormSq (Xq.flux x))) + _ ≤ volumeAverage U0 (blockEnergyDensity a0 Xq) := by + exact volumeAverage_le_volumeAverage_of_le_on + (U := U0) + (hU := measurableSet_openCubeSet (originCube d Q.scale)) + (hf := by + simpa [smul_eq_mul] using! + hFluxSqInt.smul (lam / (2 * (1 + 2 * Lam ^ 2)))) + (hg := hEnergyInt) + hpoint + _ = blockEnergyAverage U0 a0 Xq := rfl + have hEnergyRec : + blockEnergyAverage U0 a0 Xq = Mu U0 (0, q) a0 := by + simpa [U0, system, Xq] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_blockEnergyAverage_eq_mu + system hCompat.mu_eq_muCandidate (0, q) + have hMain : + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q ≤ + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U0 a0) q) := by + have hscaledJensen : + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q ≤ + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U0 (fun x => vecNormSq (Xq.flux x)) := by + exact mul_le_mul_of_nonneg_left hJensen hcoeff_half_nonneg + calc + (lam / (2 * (1 + 2 * Lam ^ 2))) * vecNormSq q + ≤ + (lam / (2 * (1 + 2 * Lam ^ 2))) * + volumeAverage U0 (fun x => vecNormSq (Xq.flux x)) := hscaledJensen + _ ≤ blockEnergyAverage U0 a0 Xq := hEnergyLower + _ = Mu U0 (0, q) a0 := hEnergyRec + _ = ResponseJ U0 0 q a0 := hMuRespQ0 q + _ = (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U0 a0) q) := hSInv0.2 q + have hqnorm_ne : vecNormSq q ≠ 0 := by + intro hqnorm + exact hq (vecNormSq_eq_zero hqnorm) + have hqnorm_pos : 0 < vecNormSq q := by + exact lt_of_le_of_ne (vecNormSq_nonneg q) (by simpa [eq_comm] using hqnorm_ne) + have hhalf_pos : + 0 < (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U0 a0) q) := + lt_of_lt_of_le (mul_pos hcoeff_half_pos hqnorm_pos) hMain + nlinarith + have hPosDef : (sigmaStarInvCoarse U0 a0).PosDef := by + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hSInv0.1 + · intro q hq + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hquad_pos q hq + exact (Matrix.isUnit_iff_isUnit_det (A := sigmaStarInvCoarse U0 a0)).mp hPosDef.isUnit + have hS0 : IsSigmaStarCoarse U0 a0 (sigmaStarCoarse U0 a0) := by + exact isSigmaStarCoarse_sigmaStarCoarse_of_isSigmaStarInvCoarse hSInv0 hdetInv0 + have hK0 : + IsKappaCoarse U0 a0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0) := by + exact + isKappaCoarse_kappaCoarse_of_isSigmaStarInvKappaCoarse_of_isUnit_det_sigmaStarInvCoarse + hM0 hdetInv0 + let sigma0 : Mat d := + (coarseBlockMatrix U0 a0).upperLeft - + (matTranspose (kappaCoarse U0 a0)) * sigmaStarInvCoarse U0 a0 * kappaCoarse U0 a0 + have hSigma0 : + IsSigmaCoarse U0 a0 sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0) := by + refine ⟨?_, ?_⟩ + · have hUpperSymm : ((coarseBlockMatrix U0 a0).upperLeft).IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + simpa [blockMatEntry] using (hA0coarse.1 (Sum.inl i) (Sum.inl j)).symm + have hCorrSymm : + (((matTranspose (kappaCoarse U0 a0)) * sigmaStarInvCoarse U0 a0 * + kappaCoarse U0 a0)).IsSymm := + transpose_mul_symm_mul_isSymm (kappaCoarse U0 a0) (sigmaStarInvCoarse U0 a0) hSInv0.1 + rw [Matrix.IsSymm.ext_iff] + intro i j + simp [sigma0, hUpperSymm.apply i j, hCorrSymm.apply i j] + · intro p + have hRespP : + ResponseJ U0 p 0 a0 = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U0 a0).upperLeft p) := by + calc + ResponseJ U0 p 0 a0 = Mu U0 (p, 0) a0 := (hMuRespP0 p).symm + _ = + (1 / 2 : ℝ) * blockVecDot (p, 0) + (blockMatVecMul (coarseBlockMatrix U0 a0) (p, 0)) := by + simpa using hA0coarse.2 (p, 0) + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U0 a0).upperLeft p) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + have hInvEq : (sigmaStarCoarse U0 a0)⁻¹ = sigmaStarInvCoarse U0 a0 := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS0] + rw [hRespP, hInvEq] + simp [sigma0, sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, + vecDot_neg_right, matVecMul_mul, Matrix.mul_assoc] + ring_nf + have hdet0 : IsUnit (sigmaStarCoarse U0 a0).det := by + unfold sigmaStarCoarse + exact Matrix.isUnit_nonsing_inv_det (A := sigmaStarInvCoarse U0 a0) hdetInv0 + have hLower0 : + (coarseBlockMatrix U0 a0).lowerLeft = + -((sigmaStarCoarse U0 a0)⁻¹ * kappaCoarse U0 a0) := by + calc + (coarseBlockMatrix U0 a0).lowerLeft = -(sigmaStarInvKappaCoarse U0 a0) := by + have hEq : + -(coarseBlockMatrix U0 a0).lowerLeft = sigmaStarInvKappaCoarse U0 a0 := + eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse hMlower + simpa using congrArg Neg.neg hEq + _ = -((sigmaStarCoarse U0 a0)⁻¹ * kappaCoarse U0 a0) := by + rw [sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK0] + have hUpper0 : + (coarseBlockMatrix U0 a0).upperRight = + -((matTranspose (kappaCoarse U0 a0)) * (sigmaStarCoarse U0 a0)⁻¹) := by + have hUpperSymm : + (coarseBlockMatrix U0 a0).upperRight = + matTranspose (coarseBlockMatrix U0 a0).lowerLeft := by + ext i j + simpa [blockMatEntry, matTranspose] using hA0coarse.1 (Sum.inl i) (Sum.inr j) + calc + (coarseBlockMatrix U0 a0).upperRight = + matTranspose (coarseBlockMatrix U0 a0).lowerLeft := hUpperSymm + _ = matTranspose (-((sigmaStarCoarse U0 a0)⁻¹ * kappaCoarse U0 a0)) := by + rw [hLower0] + _ = -((matTranspose (kappaCoarse U0 a0)) * (sigmaStarCoarse U0 a0)⁻¹) := by + change Matrix.transpose (-((sigmaStarCoarse U0 a0)⁻¹ * kappaCoarse U0 a0)) = + -((matTranspose (kappaCoarse U0 a0)) * (sigmaStarCoarse U0 a0)⁻¹) + rw [Matrix.transpose_neg, Matrix.transpose_mul, Matrix.transpose_nonsing_inv] + rw [show Matrix.transpose (sigmaStarCoarse U0 a0) = sigmaStarCoarse U0 a0 by + simpa [matTranspose] using hS0.1.eq] + simp [matTranspose] + have hLowerRight0 : + (coarseBlockMatrix U0 a0).lowerRight = sigmaStarInvCoarse U0 a0 := by + exact + coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U0) (a := a0) hex0 hMuRespQ0 + have hBlockEq0 : + blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0) = + coarseBlockMatrix U0 a0 := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · simp [blockMatrixOfDeterministicData, bCoarse, sigma0, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS0] + · simpa [blockMatrixOfDeterministicData] using hUpper0.symm + · simpa [blockMatrixOfDeterministicData] using hLower0.symm + · calc + (sigmaStarCoarse U0 a0)⁻¹ = sigmaStarInvCoarse U0 a0 := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS0] + _ = (coarseBlockMatrix U0 a0).lowerRight := hLowerRight0.symm + have hAblock0 : + IsCoarseBlockMatrix U0 a0 + (blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0)) := by + rw [hBlockEq0] + exact hA0coarse + have hSQ : + IsSigmaStarCoarse (openCubeSet Q) a (sigmaStarCoarse U0 a0) := by + have htrans := + (isSigmaStarCoarse_translateSet_iff z U0 a (sigmaStarCoarse U0 a0)).2 hS0 + simpa [z, U0, a0, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! htrans + have hKQ : + IsKappaCoarse (openCubeSet Q) a (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0) := by + have htrans := + (isKappaCoarse_translateSet_iff z U0 a (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0)).2 hK0 + simpa [z, U0, a0, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! htrans + have hSigmaQ : + IsSigmaCoarse (openCubeSet Q) a sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0) := by + have htrans := + (isSigmaCoarse_translateSet_iff z U0 a sigma0 + (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0)).2 hSigma0 + simpa [z, U0, a0, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! htrans + have hAblockQ : + IsCoarseBlockMatrix (openCubeSet Q) a + (blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0)) := by + have htrans := + (isCoarseBlockMatrix_translateSet_iff z U0 a + (blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U0 a0) (kappaCoarse U0 a0))).2 + hAblock0 + simpa [z, U0, a0, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! htrans + have hAQ : + IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a) := by + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hSQ hKQ hSigmaQ hdet0] + exact hAblockQ + exact + ⟨sigma0, sigmaStarCoarse U0 a0, kappaCoarse U0 a0, + hAQ, hSQ, hKQ, hSigmaQ, hdet0⟩ + +/-- +If the coefficient field is self-adjoint, then the canonical coarse +`\kappa(openCubeSet Q; a)` vanishes on any triadic open cube once translated +origin-cube elliptic recovery data is available. +-/ +theorem kappaCoarse_eq_zero_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData_of_adjointCoeffField_eq + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hRec : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (hAdj : adjointCoeffField a = a) : + kappaCoarse (openCubeSet Q) a = 0 := by + rcases + openCubeDeterministicCoarseData_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hRec with + ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + kappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := openCubeSet Q) (a := a) hA hAdj + +/-- +Descendant deterministic coarse data from a descendant family of translated +origin-cube recovery witnesses. + +This is the packaged upstream theorem that would directly discharge the last +honest Chapter-2 burden still visible in the top harmonic Chapter-3 +coarse-Poincare wrappers. +-/ +theorem openCubeDescendantDeterministicCoarseData_of_recoveryFamily + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} {lam Lam : ℝ} + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + OpenCubeDescendantDeterministicCoarseData Q a := by + intro l hl R hR + rcases hRec l hl R hR with ⟨RR, hRR⟩ + exact openCubeDeterministicCoarseData_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + (Q := R) RR hRR + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Existence.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Existence.lean new file mode 100644 index 0000000000..3d887b23b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Existence.lean @@ -0,0 +1,370 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Setup +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization + +/-! +# Origin-cube elliptic recovery -- uniform existence hypothesis + +Formulates OpenCubeOriginEllipticRecoveryExistence, carries the long translate- +coefficient-field ellipticity helper, and derives origin-cube recovery data +from a potentialZeroTraceClosureRealization input under IsEllipticFieldOn. +-/ + +@[expose] public section + +namespace Homogenization + + +/-- +Uniform origin-cube recovery existence for elliptic coefficient fields. + +This is the remaining upstream existence hypothesis needed to remove the +explicit descendant-family burden from the public deterministic coarse +Poincare theorems. Once this is available, the descendant family is produced +automatically by translation. +-/ +def OpenCubeOriginEllipticRecoveryExistence {d : ℕ} (lam Lam : ℝ) : Prop := + ∀ (n : ℤ) (a : CoeffField d), + IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a → + ∃ R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n)), + HasOpenCubeEllipticRecoveryData (d := d) n R + (lam := lam) (Lam := Lam) a + +/-- +Reduce origin-cube recovery existence to the single hard compatibility field +`Mu = muCandidate`. + +After `muRecoveryCompatibilityData_of_isEllipticFieldOn_of_mu_eq_muCandidate`, +the pairing-integrability side of `HasOpenCubeEllipticRecoveryData` is +automatic. So the genuine remaining upstream task is exactly to produce a +representative-level recovery package whose Hilbert minimizer value agrees +with `Mu`. +-/ +theorem + openCubeOriginEllipticRecoveryExistence_of_exists_recoveryData_of_mu_eq_muCandidate + {d : ℕ} {lam Lam : ℝ} + (hMu : + ∀ (n : ℤ) (a : CoeffField d), + ∀ hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a, + ∃ R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n)), + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a = + ((R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n))).muCandidate P)) : + OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := by + intro n a hEll + rcases hMu n a hEll with ⟨R, hmu⟩ + refine ⟨R, ?_⟩ + exact + hasOpenCubeEllipticRecoveryData_of_isEllipticFieldOn_of_mu_eq_muCandidate + (d := d) n R hEll hmu + +private theorem isEllipticFieldOn_translateCoeffField_of_translateSet + {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} (z : Vec d) + (hEll : IsEllipticFieldOn lam Lam (translateSet z U) a) : + IsEllipticFieldOn lam Lam U (translateCoeffField z a) := by + classical + refine ⟨?_, ?_⟩ + · have hshift : Measurable (fun x : Vec d => x + z) := + (continuous_id.add continuous_const).measurable + have hcomp : + Measurable (fun x i j => if x + z ∈ translateSet z U then a (x + z) i j else 0) := + hEll.1.comp hshift + have hEq : + (fun x i j => if x + z ∈ translateSet z U then a (x + z) i j else 0) = + (fun x i j => if x ∈ U then translateCoeffField z a x i j else 0) := by + funext x i j + have hadd_sub : x + z - z = x := by + ext k + simp [sub_eq_add_neg, add_assoc] + by_cases hx : x ∈ U + · have hxt : x + z ∈ translateSet z U := by + rw [mem_translateSet_iff_sub_mem, hadd_sub] + exact hx + simp [hx, hxt] + rfl + · have hxt : x + z ∉ translateSet z U := by + intro hmem + rw [mem_translateSet_iff_sub_mem] at hmem + rw [hadd_sub] at hmem + exact hx hmem + simp [hx, hxt] + simpa [hEq] using hcomp + · intro x hx + have hxt : x + z ∈ translateSet z U := by + have hadd_sub : x + z - z = x := by + ext k + simp [sub_eq_add_neg, add_assoc] + rw [mem_translateSet_iff_sub_mem, hadd_sub] + exact hx + exact hEll.2 (x + z) hxt + +/-- +Reduce the descendant recovery-family burden for coarse Poincare to one +origin-cube existence theorem. + +This is the first cleanup bridge toward removing +`OpenCubeDescendantEllipticRecoveryFamily` from the public cube-level +Poincare theorems: once recovery existence is proved on each origin open cube, +this theorem automatically produces the descendant family needed downstream. +-/ +theorem + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := by + intro l hl R hR + let z : Vec d := fun i => (R.index i : ℝ) * cubeScaleFactor R + have hsub : openCubeSet R ⊆ cubeSet Q := by + intro x hx + exact cubeSet_subset_of_mem_descendantsAtScale hl hR (openCubeSet_subset_cubeSet _ hx) + have hEllR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (isOpen_openCubeSet R).measurableSet hsub + have hEllOrigin : + IsEllipticFieldOn lam Lam (openCubeSet (originCube d R.scale)) + (translateCoeffField z a) := by + have htranslate : + IsEllipticFieldOn lam Lam + (translateSet z (openCubeSet (originCube d R.scale))) a := by + simpa [z, openCubeSet_eq_translateSet_originCube_of_triadicCube R] using! hEllR + exact isEllipticFieldOn_translateCoeffField_of_translateSet + (U := openCubeSet (originCube d R.scale)) (a := a) z htranslate + simpa [z] using hOrigin R.scale (translateCoeffField z a) hEllOrigin + +/-- +Open-cube variant of the descendant recovery-family constructor. + +This is the a.e.-ellipticity-facing form used downstream in Chapter 5: the law +data gives ellipticity on the open target cube almost surely, and every open +descendant lies inside that open target cube. +-/ +theorem + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_openCubeSet_of_originCubeRecoveryExistence + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := by + intro l hl R hR + let z : Vec d := fun i => (R.index i : ℝ) * cubeScaleFactor R + have hsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtScale hl hR + have hEllR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (isOpen_openCubeSet R).measurableSet hsub + have hEllOrigin : + IsEllipticFieldOn lam Lam (openCubeSet (originCube d R.scale)) + (translateCoeffField z a) := by + have htranslate : + IsEllipticFieldOn lam Lam + (translateSet z (openCubeSet (originCube d R.scale))) a := by + simpa [z, openCubeSet_eq_translateSet_originCube_of_triadicCube R] using! hEllR + exact isEllipticFieldOn_translateCoeffField_of_translateSet + (U := openCubeSet (originCube d R.scale)) (a := a) z htranslate + simpa [z] using hOrigin R.scale (translateCoeffField z a) hEllOrigin + +/-- +On the centered open cube, the canonical closure-based recovery package +realizes the Hilbert minimizer value `muCandidate`, provided we can upgrade +closed potential-zero-trace membership to honest zero-trace representatives. + +This isolates the remaining upstream Sobolev burden behind the exact closed +zero-trace potential realization needed by the recovery construction, rather +than the more opaque packaged assumption `OpenCubeOriginEllipticRecoveryExistence`. +-/ +theorem + exists_recoveryData_of_mu_eq_muCandidate_openCubeSet_originCube_of_isEllipticFieldOn_of_potentialZeroTraceClosureRealization + {d : ℕ} (n : ℤ) {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization + (openCubeSet (originCube d n))) : + ∃ R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n)), + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a = + ((R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n))).muCandidate P) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + have hCube : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_openCubeSet (originCube d n) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using hCube.isFiniteMeasure_restrict_volume + let R : PotentialSolenoidalL2RecoveryData U := + potentialSolenoidalL2RecoveryData_ofSubmoduleClosures_of_potentialZeroTraceClosureRealization + (U := U) hRealize + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := + (volume_openCubeSet_originCube_toReal_pos (d := d) n).ne' + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + refine ⟨R, ?_⟩ + intro P + have hCandidateLe : + ∀ X : BlockState d, IsBlockMuAdmissible U P X → + (R.toMuHilbertRealization system).muCandidate P ≤ blockEnergyAverage U a X := by + intro X hX + let Y : CorrectionFieldData U := hX.toCorrectionFieldDataOfAdmissible + have hXmemBlock : MemBlockL2 U X.eval := hX.memBlockL2_eval + have hpot : MemVectorL2 U X.potential := by + simpa [BlockState.eval] using memVectorL2_fst_of_memBlockL2 (U := U) hXmemBlock + have hflux : MemVectorL2 U X.flux := by + simpa [BlockState.eval] using memVectorL2_snd_of_memBlockL2 (U := U) hXmemBlock + have hcorr : + Y.toHilbertBlockL2 ∈ R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.correctionSpace := by + exact + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.mem_correctionSpace + Y.potential_memL2 Y.flux_memL2 Y.isPotentialZeroTrace Y.isSolenoidalZeroNormalTrace + have hconst_add : + toHilbertBlockL2OfBlockField (U := U) hXmemBlock = + blockVecToHilbertBlockL2Const (U := U) P + Y.toHilbertBlockL2 := by + simpa [Y] using hX.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + have hcorr_mem : + toHilbertBlockL2OfBlockField (U := U) hXmemBlock - + (R.toMuHilbertRealization system).constantField P ∈ + (R.toMuHilbertRealization system).correctionSpace.correctionSpace := by + rw [hconst_add] + simpa [R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hcorr + have hMin : + (R.toMuHilbertRealization system).muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) := by + simpa [R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + (R.toMuHilbertRealization system).muCandidate_le_quadraticEnergy P + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) hcorr_mem + calc + (R.toMuHilbertRealization system).muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) := hMin + _ = blockEnergyAverage U a X := by + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := X) hXmemBlock + have hrecEnergy : + blockEnergyAverage U a ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) = + (R.toMuHilbertRealization system).muCandidate P := by + let H : MuHilbertRealization U a := R.toMuHilbertRealization system + have hminim : + toHilbertBlockL2OfBlockField (U := U) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P) = + H.minimizerMap P := by + simpa [H, R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization] using! + (R.toMuCorrectionSpaceRecoveryData).recoveredField_minimizer_eq system P + calc + blockEnergyAverage U a ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + = quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P)) := by + symm + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := (R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P) + _ = quadraticEnergy H.energyBilin (H.minimizerMap P) := by + rw [hminim] + rfl + _ = H.muCandidate P := by + rfl + _ = (R.toMuHilbertRealization system).muCandidate P := by + rfl + have hBddBelow : BddBelow (muValueSet U P a) := by + refine ⟨vecDot P.1 P.2, ?_⟩ + intro m hm + rcases hm with ⟨X, hX, rfl⟩ + exact + hX.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) + (hX.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll) + hEll + (by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hX.isPotentialZeroTrace)) + (by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hCube.isSobolevRegularDomain + hX.isSolenoidalZeroNormalTrace)) + hvol + have hUpper : + Mu U P a ≤ (R.toMuHilbertRealization system).muCandidate P := by + let Xrec : BlockState d := (R.toMuCorrectionSpaceRecoveryData).recoveredField system P + have hAdm : IsBlockMuAdmissible U P Xrec := by + simpa [Xrec] using (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system P + calc + Mu U P a ≤ blockEnergyAverage U a Xrec := by + exact csInf_le hBddBelow (muValueSet_mem hAdm) + _ = (R.toMuHilbertRealization system).muCandidate P := hrecEnergy + have hLower : + (R.toMuHilbertRealization system).muCandidate P ≤ Mu U P a := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro X hX + exact hCandidateLe X hX + exact le_antisymm hUpper hLower + +/-- +Origin-cube zero-trace potential closure realization. + +This is the remaining Sobolev/closed-range input needed by the origin-cube +elliptic recovery theorem: every vector field in the closed zero-trace +potential subspace on a centered open cube has an actual `H¹₀` potential. +-/ +def OpenCubePotentialZeroTraceClosureRealization (d : ℕ) : Prop := + ∀ n : ℤ, + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization + (openCubeSet (originCube d n)) + +/-- +The packaged origin-cube recovery existence hypothesis follows from the +explicit zero-trace potential closure-realization theorem on each centered +open cube. + +This re-expresses the remaining Chapter 3 cleanup burden in the precise +Sobolev language: once the canonical closed zero-trace potential space is known +to have actual `H¹₀` representatives on origin cubes, the public coarse +Poincare theorem surface no longer needs to mention +`OpenCubeOriginEllipticRecoveryExistence` as an independent package. +-/ +theorem openCubeOriginEllipticRecoveryExistence_of_potentialZeroTraceClosureRealization + {d : ℕ} {lam Lam : ℝ} + (hRealize : OpenCubePotentialZeroTraceClosureRealization d) : + OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := by + apply openCubeOriginEllipticRecoveryExistence_of_exists_recoveryData_of_mu_eq_muCandidate + intro n a hEll + exact + exists_recoveryData_of_mu_eq_muCandidate_openCubeSet_originCube_of_isEllipticFieldOn_of_potentialZeroTraceClosureRealization + (d := d) n hEll (hRealize n) + +/-- +The origin-cube zero-trace potential closure realization hypothesis is a +theorem on every positive dimension, discharged by +`PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain`. +-/ +theorem openCubePotentialZeroTraceClosureRealization + {d : ℕ} [NeZero d] : OpenCubePotentialZeroTraceClosureRealization d := + fun n => + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + +/-- Unconditional origin-cube elliptic recovery existence on every positive +dimension. -/ +theorem openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] {lam Lam : ℝ} : + OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence_of_potentialZeroTraceClosureRealization + openCubePotentialZeroTraceClosureRealization + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/MuGeVecDot.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/MuGeVecDot.lean new file mode 100644 index 0000000000..cb8117757f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/MuGeVecDot.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Translate + +/-! +# Origin-cube elliptic recovery -- lower bound and exact slice equalities + +The long mu_ge_vecDot_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData +packaging, together with the pure-flux and pure-gradient slice equalities +feeding DeterministicCoarseData. +-/ + +@[expose] public section + +namespace Homogenization + +/-- +Lower bound `Mu` against the scalar product on the centered open cube, +packaged directly from deterministic recovery-plus-ellipticity data. +-/ +theorem mu_ge_vecDot_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (P : BlockVec d) : + vecDot P.1 P.2 ≤ Mu (openCubeSet (originCube d n)) P a := by + rcases hData with ⟨hEll, hCompat⟩ + exact + PotentialSolenoidalL2RecoveryData.mu_ge_vecDot_openCubeSet_originCubeOfIsEllipticFieldOn + (R := R) (a := a) (hEll := hEll) (compat := hCompat) P + +/-- +On the centered open cube, the zero-right recovered response-space witness can +be split into a primal/adjoint scalar half-pair at the level of averaged block +response integrands. + +This exposes the existing deterministic pair-half reconstruction directly from +`HasOpenCubeEllipticRecoveryData`, without yet claiming the sharper exact slice +identity `Mu(U; (0,q), a) = ResponseJ(U; 0, q, a)`. +-/ +theorem + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (q0 : Vec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + (fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0)).eval x := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let hCube : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_openCubeSet (originCube d n) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using hCube.isFiniteMeasure_restrict_volume + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := + (volume_openCubeSet_originCube_toReal_pos (d := d) n).ne' + simpa [U, system] using + (R.toMuCorrectionSpaceRecoveryData).exists_blockResponsePairHalfState_ae_eq_recoveredField_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) system hCube hEll hvol q0 + +theorem + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_isEllipticFieldOn_of_blockVec + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (P : BlockVec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + (fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P).eval x := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let hCube : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_openCubeSet (originCube d n) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using hCube.isFiniteMeasure_restrict_volume + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := + (volume_openCubeSet_originCube_toReal_pos (d := d) n).ne' + simpa [U, system] using + (R.toMuCorrectionSpaceRecoveryData).exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) system hCube hEll hvol P + +theorem + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q0 : Vec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + (Classical.choose hData) + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + (fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0)).eval x := by + rcases hData with ⟨hEll, _hCompat⟩ + simpa using + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_isEllipticFieldOn + (R := R) (a := a) hEll q0 + +theorem + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_blockVec + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (P : BlockVec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + (Classical.choose hData) + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + (fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P).eval x := by + rcases hData with ⟨hEll, _hCompat⟩ + simpa using + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_isEllipticFieldOn_of_blockVec + (R := R) (a := a) hEll P + +theorem + exists_recoveredField_scalarHalfPair_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q0 : Vec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + (Classical.choose hData) + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + ((fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0)).eval x) ∧ + ∀ p pStar q qStar : Vec d, + volumeAverage (openCubeSet (originCube d n)) + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + rcases hData with ⟨hEll, _hCompat⟩ + let U : Set (Vec d) := openCubeSet (originCube d n) + let hCube : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_openCubeSet (originCube d n) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using hCube.isFiniteMeasure_restrict_volume + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + rcases + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_isEllipticFieldOn + (R := R) (a := a) hEll q0 with + ⟨u, v, hEq⟩ + have hSplit : + ∀ p pStar q qStar : Vec d, + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + (1 / 2 : ℝ) * + volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + intro p pStar q qStar + have hIntegrandEq : + blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v) =ᵐ[volumeMeasureOn U] + blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0)) := by + filter_upwards [hEq] with x hx + simpa [blockResponseIntegrand, blockEnergyDensity] using congrArg + (fun z => -(1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z) + - blockVecDot (p, q) (blockMatVecMul (blockCoeffField a x) z) + + blockVecDot (qStar, pStar) z) hx + have hAvgEq : + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v)) := by + unfold volumeAverage + congr 1 + exact MeasureTheory.integral_congr_ae hIntegrandEq.symm + calc + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + volumeAverage U + (blockResponseIntegrand a (p, q) (qStar, pStar) (blockResponsePairHalfState a u v)) := hAvgEq + _ = (1 / 2 : ℝ) * volumeAverage U (scalarResponseIntegrand U a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage U + (scalarResponseIntegrand U (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + exact + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a) hCube.1.measurableSet hEll p pStar q qStar u v + exact ⟨u, v, hEq, by simpa [U, system] using hSplit⟩ + +/-- +Sigma-free pure-flux coupling handoff on the centered open cube. + +Once a recovered primal/adjoint half-pair is known to satisfy the primal scalar +Euler-Lagrange identity for `ResponseJ(U; 0, q0, a)`, the recovery energy and +zero state-pairing identities identify the pure-flux slice of `Mu` with the +scalar response value. The remaining bridge is therefore exactly the derivation +of the `hPairFirst` first-variation clause from recovery data. +-/ +theorem + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_exists_recovered_pair_firstVariation_eq_zero + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q0 : Vec d) + (hPairFirst : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + (Classical.choose hData) + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + ((fun x => + (blockResponsePairHalfState a u v).eval x) =ᵐ[volumeMeasureOn (openCubeSet (originCube d n))] + fun x => ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0)).eval x) ∧ + ∀ w : AHarmonicFunction a (openCubeSet (originCube d n)), + volumeAverage (openCubeSet (originCube d n)) + (scalarFirstVariationIntegrand + (openCubeSet (originCube d n)) a 0 q0 u w) = 0) : + Mu (openCubeSet (originCube d n)) (0, q0) a = + ResponseJ (openCubeSet (originCube d n)) 0 q0 a := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + rcases hData with ⟨hEll, hCompat⟩ + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + rcases hPairFirst with ⟨u, v, hEq, hfirst⟩ + let Xrec : BlockState d := + (R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (0, q0) a := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_blockEnergyAverage_eq_mu + system hCompat.mu_eq_muCandidate (0, q0) + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = 0 := by + have h := + (R.toMuCorrectionSpaceRecoveryData).recoveredField_average_pairing_openCubeSet_originCube + system (0, q0) + simpa [U, Xrec, vecDot_zero_left] using h + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U 0 q0 a := by + simpa [U, Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_zero_of_pairingAverage_eq_zero_of_firstVariation_eq_zero + (a := a) (measurableSet_openCubeSet (originCube d n)) hEll q0 u v hPair hfirst + calc + Mu (openCubeSet (originCube d n)) (0, q0) a = Mu U (0, q0) a := by rfl + _ = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U 0 q0 a := hCouple + _ = ResponseJ (openCubeSet (originCube d n)) 0 q0 a := by rfl + +/-- +Pure-flux exact slice on the centered open cube from recovery data alone. + +This removes the temporary explicit first-variation hypothesis from the +sigma-free coupling handoff: recovery admissibility of the `\mu` minimizer and +the recovered half-pair reconstruction imply the primal scalar Euler-Lagrange +identity needed by the deterministic coupling lemma. +-/ +theorem + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q0 : Vec d) : + Mu (openCubeSet (originCube d n)) (0, q0) a = + ResponseJ (openCubeSet (originCube d n)) 0 q0 a := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + let hEll : IsEllipticFieldOn lam Lam U a := Classical.choose hData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + rcases + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a) hData q0 with + ⟨u, v, hEq⟩ + let Xrec : BlockState d := + (R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0) + have hAdm : IsBlockMuAdmissible U (0, q0) Xrec := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system (0, q0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a 0 q0 u w) = 0 := by + simpa [U, Xrec] using + scalarFirstVariation_zero_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := measurableSet_openCubeSet (originCube d n)) + hEll q0 u v Xrec hEq hAdm + refine + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_exists_recovered_pair_firstVariation_eq_zero + (R := R) (a := a) hData q0 ?_ + exact ⟨u, v, hEq, hfirst⟩ + +/-- +Pure-gradient exact slice on the centered open cube from recovery data alone. + +The recovered half-pair gives the scalar first variation at `(-p0,0)`; the +deterministic coupling lemma then uses quadratic homogeneity of `ResponseJ` to +return the note-facing slice `ResponseJ(U; p0, 0, a)`. +-/ +theorem + mu_left_zero_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (p0 : Vec d) : + Mu (openCubeSet (originCube d n)) (p0, 0) a = + ResponseJ (openCubeSet (originCube d n)) p0 0 a := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + let hEll : IsEllipticFieldOn lam Lam U a := Classical.choose hData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + rcases + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_blockVec + (R := R) (a := a) hData (p0, 0) with + ⟨u, v, hEq⟩ + let Xrec : BlockState d := + (R.toMuCorrectionSpaceRecoveryData).recoveredField system (p0, 0) + have hAdm : IsBlockMuAdmissible U (p0, 0) Xrec := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system (p0, 0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a (-p0) 0 u w) = 0 := by + simpa [U, Xrec] using + scalarFirstVariation_neg_left_zero_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := measurableSet_openCubeSet (originCube d n)) + hEll p0 u v Xrec hEq hAdm + rcases hData with ⟨_hEllData, hCompat⟩ + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (p0, 0) a := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_blockEnergyAverage_eq_mu + system hCompat.mu_eq_muCandidate (p0, 0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = 0 := by + have h := + (R.toMuCorrectionSpaceRecoveryData).recoveredField_average_pairing_openCubeSet_originCube + system (p0, 0) + simpa [U, Xrec, vecDot_zero_right] using h + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = 0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U p0 0 a := by + simpa [U, Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_left_zero_of_pairingAverage_eq_zero_of_firstVariation_neg_left_zero + (a := a) hEll p0 u v hPair hfirst + calc + Mu (openCubeSet (originCube d n)) (p0, 0) a = Mu U (p0, 0) a := by rfl + _ = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U p0 0 a := hCouple + _ = ResponseJ (openCubeSet (originCube d n)) p0 0 a := by rfl + +/-- +Full mixed response slice on the centered open cube from recovery data alone. + +For the recovered field at block datum `(-p,q)`, the average state-pairing is +`-p·q`. The deterministic half-pair coupling therefore identifies the block +energy with `ResponseJ(U;p,q,a) + p·q`, which is exactly the mixed-term +identity needed for the full response-side block-quadratic package. +-/ +theorem + responseJ_eq_mu_neg_left_sub_vecDot_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (p0 q0 : Vec d) : + ResponseJ (openCubeSet (originCube d n)) p0 q0 a = + Mu (openCubeSet (originCube d n)) (-p0, q0) a - vecDot p0 q0 := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + let hEll : IsEllipticFieldOn lam Lam U a := Classical.choose hData + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + rcases + exists_blockResponsePairHalfState_ae_eq_recoveredField_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_blockVec + (R := R) (a := a) hData (-p0, q0) with + ⟨u, v, hEq⟩ + let Xrec : BlockState d := + (R.toMuCorrectionSpaceRecoveryData).recoveredField system (-p0, q0) + have hAdm : IsBlockMuAdmissible U (-p0, q0) Xrec := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system (-p0, q0) + have hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p0 q0 u w) = 0 := by + simpa [U, Xrec] using + scalarFirstVariation_neg_left_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a) (U := U) (hU := measurableSet_openCubeSet (originCube d n)) + hEll (-p0) q0 u v Xrec hEq hAdm + rcases hData with ⟨_hEllData, hCompat⟩ + have hEnergyRec : + blockEnergyAverage U a Xrec = Mu U (-p0, q0) a := by + simpa [U, system, Xrec] using + (R.toMuCorrectionSpaceRecoveryData).recoveredField_blockEnergyAverage_eq_mu + system hCompat.mu_eq_muCandidate (-p0, q0) + let Xpair : BlockState d := blockResponsePairHalfState a u v + have hEnergyEq : + blockEnergyAverage U a Xpair = blockEnergyAverage U a Xrec := by + unfold blockEnergyAverage volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, blockEnergyDensity] using + congrArg + (fun z => + (1 / 2 : ℝ) * blockVecDot z (blockMatVecMul (blockCoeffField a x) z)) + hx + have hPairEq : + volumeAverage U + (fun x => vecDot (Xpair.potential x) (Xpair.flux x)) = + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) := by + unfold volumeAverage + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hEq] with x hx + simpa [Xpair, Xrec, BlockState.eval] using + congrArg (fun z : BlockVec d => vecDot z.1 z.2) hx + have hPairRec : + volumeAverage U + (fun x => vecDot (Xrec.potential x) (Xrec.flux x)) = -vecDot p0 q0 := by + have h := + (R.toMuCorrectionSpaceRecoveryData).recoveredField_average_pairing_openCubeSet_originCube + system (-p0, q0) + simpa [U, Xrec, vecDot_neg_left] using h + have hPair : + volumeAverage U + (fun x => + vecDot ((blockResponsePairHalfState a u v).potential x) + ((blockResponsePairHalfState a u v).flux x)) = -vecDot p0 q0 := by + simpa [Xpair] using hPairEq.trans hPairRec + have hCouple : + blockEnergyAverage U a Xpair = ResponseJ U p0 q0 a - (-vecDot p0 q0) := by + simpa [U, Xpair] using + blockEnergyAverage_blockResponsePairHalfState_eq_responseJ_sub_pairing_of_pairingAverage_eq_of_firstVariation_eq_zero + (a := a) hEll p0 q0 u v (-vecDot p0 q0) hPair hfirst + have hMu : + Mu U (-p0, q0) a = ResponseJ U p0 q0 a + vecDot p0 q0 := by + calc + Mu U (-p0, q0) a = blockEnergyAverage U a Xrec := hEnergyRec.symm + _ = blockEnergyAverage U a Xpair := hEnergyEq.symm + _ = ResponseJ U p0 q0 a - (-vecDot p0 q0) := hCouple + _ = ResponseJ U p0 q0 a + vecDot p0 q0 := by ring + calc + ResponseJ (openCubeSet (originCube d n)) p0 q0 a = ResponseJ U p0 q0 a := by rfl + _ = Mu U (-p0, q0) a - vecDot p0 q0 := by linarith + _ = Mu (openCubeSet (originCube d n)) (-p0, q0) a - vecDot p0 q0 := by rfl + +theorem + recoveredField_volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_openCubeSet_originCube_of_isEllipticFieldOn + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (q0 p pStar q qStar : Vec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + volumeAverage (openCubeSet (originCube d n)) + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let hCube : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_openCubeSet (originCube d n) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn, U] using hCube.isFiniteMeasure_restrict_volume + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := + (volume_openCubeSet_originCube_toReal_pos (d := d) n).ne' + simpa [U, system] using + (R.toMuCorrectionSpaceRecoveryData).volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_recoveredField_zero_right_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a) system hCube hEll hvol q0 p pStar q qStar + +theorem + recoveredField_volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (q0 p pStar q qStar : Vec d) : + let system := + R.toMuOperatorSystemDataOfIsEllipticFieldOn + (Classical.choose hData) + (volume_openCubeSet_originCube_toReal_pos (d := d) n) + ∃ u : AHarmonicFunction a (openCubeSet (originCube d n)), + ∃ v : + AHarmonicFunction (Homogenization.adjointCoeffField a) + (openCubeSet (originCube d n)), + volumeAverage (openCubeSet (originCube d n)) + (blockResponseIntegrand a (p, q) (qStar, pStar) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system (0, q0))) = + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) a (p - pStar) (qStar - q) u) + + (1 / 2 : ℝ) * + volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand + (openCubeSet (originCube d n)) (Homogenization.adjointCoeffField a) + (pStar + p) (qStar + q) v) := by + rcases hData with ⟨hEll, _hCompat⟩ + simpa using + recoveredField_volumeAverage_blockResponseIntegrand_eq_scalarResponse_sum_openCubeSet_originCube_of_isEllipticFieldOn + (R := R) (a := a) hEll q0 p pStar q qStar + +/-- +Exact pure-flux slice equality on the centered open cube, packaged from +deterministic recovery-plus-ellipticity data together with the current +deterministic coarse block/sigma data. +-/ +theorem + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (q : Vec d) : + Mu (openCubeSet (originCube d n)) (0, q) a = + ResponseJ (openCubeSet (originCube d n)) 0 q a := by + let _ := hA + let _ := hS + let _ := hK + let _ := hSigma + exact + mu_zero_right_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a) hData q + +/-- +Exact pure-gradient slice equality on the centered open cube, packaged from +deterministic recovery-plus-ellipticity data together with the current +deterministic coarse block/sigma data. +-/ +theorem + mu_left_zero_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) + (p : Vec d) : + Mu (openCubeSet (originCube d n)) (p, 0) a = + ResponseJ (openCubeSet (originCube d n)) p 0 a := by + let _ := hA + let _ := hS + let _ := hK + let _ := hSigma + exact + mu_left_zero_eq_responseJ_zero_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (a := a) hData p + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/QuadraticMu.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/QuadraticMu.lean new file mode 100644 index 0000000000..c6bcda81ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/QuadraticMu.lean @@ -0,0 +1,475 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.Existence + +/-! +# Origin-cube elliptic recovery -- quadraticity of Mu on the centered cube + +Private sigmaStarCoarse / volumeAverage helpers, quadraticity of Mu on the +centered open cube packaged from recovery data, existence of coarse block +matrices, and the HasOriginCubeResponseJ\{Block,PureFlux,PureGradient\}QuadraticDataAtScale +structures and their construction from hasQuadraticMu. +-/ + +@[expose] public section + +namespace Homogenization + + +theorem isSigmaStarCoarse_sigmaStarCoarse_of_isSigmaStarInvCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hSInv : IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a)) + (hdetInv : IsUnit (sigmaStarInvCoarse U a).det) : + IsSigmaStarCoarse U a (sigmaStarCoarse U a) := by + refine ⟨?_, ?_⟩ + · unfold sigmaStarCoarse + rw [Matrix.IsSymm.ext_iff] + intro i j + have hT := Matrix.transpose_nonsing_inv (A := sigmaStarInvCoarse U a) + simpa [hSInv.1.eq] using congrFun (congrFun hT i) j + · intro q + have hresp := hSInv.2 q + unfold sigmaStarCoarse + rw [Matrix.nonsing_inv_nonsing_inv _ hdetInv] + simpa using hresp + +theorem + isKappaCoarse_kappaCoarse_of_isSigmaStarInvKappaCoarse_of_isUnit_det_sigmaStarInvCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hM : IsSigmaStarInvKappaCoarse U a (sigmaStarInvKappaCoarse U a)) + (hdetInv : IsUnit (sigmaStarInvCoarse U a).det) : + IsKappaCoarse U a (sigmaStarCoarse U a) (kappaCoarse U a) := by + intro p q + rw [hM p q] + unfold kappaCoarse sigmaStarCoarse + rw [show ((sigmaStarInvCoarse U a)⁻¹)⁻¹ = sigmaStarInvCoarse U a by + exact Matrix.nonsing_inv_nonsing_inv _ hdetInv] + let A : Mat d := sigmaStarInvCoarse U a + let M : Mat d := sigmaStarInvKappaCoarse U a + have hprod : + matVecMul (A * (A⁻¹ * M)) p = matVecMul M p := by + calc + matVecMul (A * (A⁻¹ * M)) p = matVecMul ((A * A⁻¹) * M) p := by + rw [Matrix.mul_assoc] + _ = matVecMul M p := by + rw [Matrix.mul_nonsing_inv A (by simpa [A] using hdetInv)] + simp + simpa [A, M, matVecMul_mul] using congrArg (fun w => vecDot q w) hprod.symm + +theorem + isSigmaStarInvKappaCoarse_neg_coarseBlockMatrix_lowerLeft_of_exact_slices + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar) + (hMuRespQ : ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a) + (hMuRespP : ∀ p : Vec d, Mu U (p, 0) a = ResponseJ U p 0 a) + (hResp : + ∀ p q : Vec d, + ResponseJ U p q a = Mu U (-p, q) a - vecDot p q) : + IsSigmaStarInvKappaCoarse U a (-(coarseBlockMatrix U a).lowerLeft) := by + have hA : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix hex + intro p q + have hMuPQ : + Mu U (-p, q) a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + have hraw := hA.2 (-p, q) + calc + Mu U (-p, q) a + = (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U a) (-p, q)) := hraw + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + simpa using + magic_half_blockVecDot_neg_left_of_isSymmetricBlockMat hA.1 p q + have hMuP0 : + Mu U (p, 0) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + calc + Mu U (p, 0) a + = (1 / 2 : ℝ) * blockVecDot (p, 0) + (blockMatVecMul (coarseBlockMatrix U a) (p, 0)) := hA.2 (p, 0) + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + have hMu0Q : + Mu U (0, q) a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) := by + calc + Mu U (0, q) a + = (1 / 2 : ℝ) * blockVecDot (0, q) + (blockMatVecMul (coarseBlockMatrix U a) (0, q)) := hA.2 (0, q) + _ = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + have hmain : + ResponseJ U p q a - ResponseJ U p 0 a - ResponseJ U 0 q a + vecDot p q = + -vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) := by + rw [hResp p q, ← hMuRespP p, ← hMuRespQ q, hMuPQ, hMuP0, hMu0Q] + ring + simpa [neg_matVecMul, vecDot_neg_right] using hmain + +theorem volumeAverage_le_volumeAverage_of_le_on + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f g : Vec d → ℝ} + (hU : MeasurableSet U) + (hf : MeasureTheory.IntegrableOn f U) + (hg : MeasureTheory.IntegrableOn g U) + (hfg : ∀ x ∈ U, f x ≤ g x) : + volumeAverage U f ≤ volumeAverage U g := by + have hnonneg : + 0 ≤ volumeAverage U (fun x => g x - f x) := by + apply volumeAverage_nonneg_of_nonneg_on hU + intro x hx + exact sub_nonneg.mpr (hfg x hx) + have hsub : + volumeAverage U (fun x => g x - f x) = + volumeAverage U g - volumeAverage U f := by + simpa using! (volumeAverage_sub hg hf : volumeAverage U (g - f) = _) + linarith + +theorem vecNormSq_volumeAverage_le_volumeAverage_vecNormSq + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hvol : (MeasureTheory.volume U).toReal ≠ 0) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + vecNormSq (fun i => volumeAverage U (fun x => f x i)) ≤ + volumeAverage U (fun x => vecNormSq (f x)) := by + let avg : Vec d := fun i => volumeAverage U (fun x => f x i) + have hcoord : ∀ i, MeasureTheory.IntegrableOn (fun x => f x i) U := by + intro i + simpa [vecDot, Pi.single_apply] using + (integrableOn_vecDot_of_memVectorL2 hf + (memVectorL2_const (U := U) (Pi.single i 1))) + have hdotInt : MeasureTheory.IntegrableOn (fun x => vecDot (f x) avg) U := by + exact integrableOn_vecDot_of_memVectorL2 hf (memVectorL2_const (U := U) avg) + have hsqInt : MeasureTheory.IntegrableOn (fun x => vecNormSq (f x)) U := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hf hf + have hhalfInt : + MeasureTheory.IntegrableOn ((1 / 2 : ℝ) • fun x => vecNormSq (f x)) U := by + simpa [smul_eq_mul] using! hsqInt.integrable.smul (1 / 2 : ℝ) + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) U := by + exact MeasureTheory.integrable_const _ + have havgDot : + volumeAverage U (fun x => vecDot (f x) avg) = vecNormSq avg := by + calc + volumeAverage U (fun x => vecDot (f x) avg) + = vecDot (fun i => volumeAverage U (fun x => f x i)) avg := by + exact volumeAverage_vecDot_right f avg hcoord + _ = vecNormSq avg := by + simp [avg, vecNormSq] + have hnonneg : + ∀ x ∈ U, + 0 ≤ (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + (1 / 2 : ℝ) * vecNormSq avg := by + intro x hx + have hsq : 0 ≤ vecNormSq (f x - avg) := vecNormSq_nonneg (f x - avg) + have hident : + (1 / 2 : ℝ) * vecNormSq (f x - avg) = + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + (1 / 2 : ℝ) * vecNormSq avg := by + rw [show f x - avg = f x + (-avg) by simp [sub_eq_add_neg]] + simp [vecNormSq, vecDot_add_right, vecDot_neg_right, vecDot_comm] + ring_nf + nlinarith [hsq, hident] + have havgNonneg : + 0 ≤ + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) := by + exact volumeAverage_nonneg_of_nonneg_on hU hnonneg + have havgExpand : + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) = + (1 / 2 : ℝ) * volumeAverage U (fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + (1 / 2 : ℝ) * vecNormSq avg := by + have hsubInt : + MeasureTheory.IntegrableOn + (((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) U := by + exact hhalfInt.sub hdotInt + have hfun : + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) = + ((((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + funext x + simp [smul_eq_mul, sub_eq_add_neg, add_assoc] + calc + volumeAverage U + (fun x => + (1 / 2 : ℝ) * vecNormSq (f x) - vecDot (f x) avg + + (1 / 2 : ℝ) * vecNormSq avg) + = + volumeAverage U + ((((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [hfun] + _ = + volumeAverage U + (((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - fun x => vecDot (f x) avg) + + volumeAverage U (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [volumeAverage_add hsubInt hconstInt] + _ = + volumeAverage U ((1 / 2 : ℝ) • fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + volumeAverage U (fun _ : Vec d => (1 / 2 : ℝ) * vecNormSq avg) := by + rw [volumeAverage_sub hhalfInt hdotInt] + _ = + (1 / 2 : ℝ) * volumeAverage U (fun x => vecNormSq (f x)) - + volumeAverage U (fun x => vecDot (f x) avg) + + (1 / 2 : ℝ) * vecNormSq avg := by + rw [volumeAverage_smul, volumeAverage_const hvol] + nlinarith [havgNonneg, havgExpand, havgDot] + +/-- +Deterministic quadratic well-posedness of `Mu` on the centered open cube, +obtained from the packaged recovery-plus-ellipticity data. +-/ +theorem hasQuadraticMu_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) : + HasQuadraticMu (openCubeSet (originCube d n)) a := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + rcases hData with ⟨hEll, hCompat⟩ + simpa [U] using + (PotentialSolenoidalL2RecoveryData.hasQuadraticMuOfIsEllipticFieldOn + (R := R) (a := a) hEll + (hvol := volume_openCubeSet_originCube_toReal_pos (d := d) n) hCompat) + +/-- +Deterministic existence of the coarse block matrix on the centered open cube, +obtained from the packaged recovery-plus-ellipticity data. +-/ +theorem exists_coarseBlockMatrix_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + rcases hData with ⟨hEll, hCompat⟩ + simpa [U] using + (PotentialSolenoidalL2RecoveryData.exists_coarseBlockMatrixOfIsEllipticFieldOn + (R := R) (a := a) hEll + (hvol := volume_openCubeSet_originCube_toReal_pos (d := d) n) hCompat) + +/-- +Minimal deterministic input for the response-side block-quadratic lane on the +origin cube at scale `m` and all of its scale-`n` descendants. + +This is the weakest bundled package currently needed to feed the deterministic +`responseJ_blockQuadratic` subadditivity machinery behind the annealed +block/starred monotonicity theorem family. +-/ +structure HasOriginCubeResponseJBlockQuadraticDataAtScale + {d : ℕ} (n m : ℤ) (lam Lam : ℝ) (a : CoeffField d) : Prop where + hEll : + IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a + hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet (originCube d m)) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a) (-p, q)) - + vecDot p q + hRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q + +/-- +If `Mu` is quadratic on the coarse open cube and its scale-`n` descendants, +then the full mixed response identity +`ResponseJ(U;p,q,a) = Mu(U;(-p,q),a) - p·q` upgrades directly to the public +response-side block-quadratic package. +-/ +theorem hasOriginCubeResponseJBlockQuadraticDataAtScale_of_hasQuadraticMu_of_responseJ_eq_mu_neg_left_sub_vecDot + {d : ℕ} {n m : ℤ} {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a) + (hQuadQ : HasQuadraticMu (openCubeSet (originCube d m)) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet (originCube d m)) p q a = + Mu (openCubeSet (originCube d m)) (-p, q) a - vecDot p q) + (hQuadDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, HasQuadraticMu (openCubeSet R) a) + (hRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = Mu (openCubeSet R) (-p, q) a - vecDot p q) : + HasOriginCubeResponseJBlockQuadraticDataAtScale (d := d) n m lam Lam a := by + refine ⟨hEll, ?_, ?_⟩ + · intro p q + calc + ResponseJ (openCubeSet (originCube d m)) p q a + = Mu (openCubeSet (originCube d m)) (-p, q) a - vecDot p q := hRespQ p q + _ = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a) (-p, q)) - + vecDot p q := by + rw [Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu hQuadQ (-p, q)] + · intro R hR p q + calc + ResponseJ (openCubeSet R) p q a + = Mu (openCubeSet R) (-p, q) a - vecDot p q := hRespDesc R hR p q + _ = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q := by + rw [Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu (hQuadDesc R hR) (-p, q)] + +/-- +Minimal deterministic input for the scalar `\sigma_*^{-1}` monotonicity lane +on the origin cube at scale `m` and all of its scale-`n` descendants. + +Unlike `HasOriginCubeResponseJBlockQuadraticDataAtScale`, this package only +asks for the pure-flux slice `ResponseJ(U; 0, q)` to match the lower-right +quadratic form of the coarse block matrix. +-/ +structure HasOriginCubeResponseJPureFluxQuadraticDataAtScale + {d : ℕ} (n m : ℤ) (lam Lam : ℝ) (a : CoeffField d) : Prop where + hEll : + IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a + hRespQ : + ∀ q : Vec d, + ResponseJ (openCubeSet (originCube d m)) 0 q a = + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a).lowerRight q) + hRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ q : Vec d, + ResponseJ (openCubeSet R) 0 q a = + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet R) a).lowerRight q) + +/-- +Minimal deterministic input for the scalar `B` monotonicity lane on the origin +cube at scale `m` and all of its scale-`n` descendants. + +This keeps only the pure-gradient slice `ResponseJ(U; p, 0)`, which is enough +for the upper-left scalar observable but does not carry the full block +quadratic response package. +-/ +structure HasOriginCubeResponseJPureGradientQuadraticDataAtScale + {d : ℕ} (n m : ℤ) (lam Lam : ℝ) (a : CoeffField d) : Prop where + hEll : + IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a + hRespP : + ∀ p : Vec d, + ResponseJ (openCubeSet (originCube d m)) p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a).upperLeft p) + hRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ p : Vec d, + ResponseJ (openCubeSet R) p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet R) a).upperLeft p) + +/-- +If `Mu` is already known to be quadratic on the coarse open cube and its +scale-`n` descendants, then the exact pure-flux identities +`Mu(U; (0, q), a) = ResponseJ(U; 0, q, a)` upgrade directly to the public +response-side `\sigma_*^{-1}` slice package. +-/ +theorem hasOriginCubeResponseJPureFluxQuadraticDataAtScale_of_hasQuadraticMu_of_mu_zero_right_eq_responseJ_zero + {d : ℕ} {n m : ℤ} {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a) + (hQuadQ : HasQuadraticMu (openCubeSet (originCube d m)) a) + (hMuRespQ : + ∀ q : Vec d, + Mu (openCubeSet (originCube d m)) (0, q) a = + ResponseJ (openCubeSet (originCube d m)) 0 q a) + (hQuadDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, HasQuadraticMu (openCubeSet R) a) + (hMuRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ q : Vec d, + Mu (openCubeSet R) (0, q) a = ResponseJ (openCubeSet R) 0 q a) : + HasOriginCubeResponseJPureFluxQuadraticDataAtScale (d := d) n m lam Lam a := by + refine ⟨hEll, ?_, ?_⟩ + · intro q + calc + ResponseJ (openCubeSet (originCube d m)) 0 q a + = Mu (openCubeSet (originCube d m)) (0, q) a := (hMuRespQ q).symm + _ = (1 / 2 : ℝ) * + blockVecDot (0, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a) (0, q)) := by + simpa using Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu hQuadQ (0, q) + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a).lowerRight q) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + · intro R hR q + calc + ResponseJ (openCubeSet R) 0 q a + = Mu (openCubeSet R) (0, q) a := (hMuRespDesc R hR q).symm + _ = (1 / 2 : ℝ) * + blockVecDot (0, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (0, q)) := by + simpa using Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu (hQuadDesc R hR) + (0, q) + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseBlockMatrix (openCubeSet R) a).lowerRight q) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + +/-- +If `Mu` is already known to be quadratic on the coarse open cube and its +scale-`n` descendants, then the exact pure-gradient identities +`Mu(U; (p, 0), a) = ResponseJ(U; p, 0, a)` upgrade directly to the public +response-side `B` slice package. +-/ +theorem hasOriginCubeResponseJPureGradientQuadraticDataAtScale_of_hasQuadraticMu_of_mu_left_zero_eq_responseJ_zero + {d : ℕ} {n m : ℤ} {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d m)) a) + (hQuadQ : HasQuadraticMu (openCubeSet (originCube d m)) a) + (hMuRespQ : + ∀ p : Vec d, + Mu (openCubeSet (originCube d m)) (p, 0) a = + ResponseJ (openCubeSet (originCube d m)) p 0 a) + (hQuadDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, HasQuadraticMu (openCubeSet R) a) + (hMuRespDesc : + ∀ R ∈ descendantsAtScale (originCube d m) n, ∀ p : Vec d, + Mu (openCubeSet R) (p, 0) a = ResponseJ (openCubeSet R) p 0 a) : + HasOriginCubeResponseJPureGradientQuadraticDataAtScale (d := d) n m lam Lam a := by + refine ⟨hEll, ?_, ?_⟩ + · intro p + calc + ResponseJ (openCubeSet (originCube d m)) p 0 a + = Mu (openCubeSet (originCube d m)) (p, 0) a := (hMuRespQ p).symm + _ = (1 / 2 : ℝ) * + blockVecDot (p, 0) + (blockMatVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a) (p, 0)) := by + simpa using Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu hQuadQ (p, 0) + _ = (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet (originCube d m)) a).upperLeft p) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + · intro R hR p + calc + ResponseJ (openCubeSet R) p 0 a + = Mu (openCubeSet R) (p, 0) a := (hMuRespDesc R hR p).symm + _ = (1 / 2 : ℝ) * + blockVecDot (p, 0) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (p, 0)) := by + simpa using Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu (hQuadDesc R hR) + (p, 0) + _ = (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet R) a).upperLeft p) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Setup.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Setup.lean new file mode 100644 index 0000000000..f86e5f0812 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Setup.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse.Equalities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure + +/-! +# Origin-cube elliptic recovery -- volume lemmas, data package, descendant family + +Basic volume-of-centered-cube lemmas, the HasOpenCubeEllipticRecoveryData +package, the canonical instance from an elliptic field, and the descendant +recovery family used downstream. +-/ + +@[expose] public section + +namespace Homogenization + +/-- +The centered open cube has finite Lebesgue measure. + +This is the finite-volume input needed to instantiate the `L²` and recovery +machinery on `openCubeSet (originCube d n)`. +-/ +theorem volume_openCubeSet_originCube_lt_top {d : ℕ} (n : ℤ) : + MeasureTheory.volume (openCubeSet (originCube d n)) < ⊤ := by + rw [lt_top_iff_ne_top] + intro htop + have hzero : (MeasureTheory.volume (openCubeSet (originCube d n))).toReal = 0 := by + simp [htop] + rw [volume_openCubeSet_toReal] at hzero + exact (ne_of_gt (cubeVolume_pos (originCube d n))) hzero + +/-- +The centered open cube has strictly positive Lebesgue volume. + +This is the normalization hypothesis required by the deterministic doubled +operator construction from ellipticity. +-/ +theorem volume_openCubeSet_originCube_toReal_pos {d : ℕ} (n : ℤ) : + 0 < (MeasureTheory.volume (openCubeSet (originCube d n))).toReal := by + rw [volume_openCubeSet_toReal] + exact cubeVolume_pos (originCube d n) + +/-- Integer translation shift identifying a nonnegative-scale triadic cube +with the corresponding translated origin cube. -/ +def originCubeScaleTranslationShift {d : ℕ} (k : ℤ) (Q : TriadicCube d) : Fin d → ℤ := + fun i => Int.ofNat (3 ^ Int.toNat k) * Q.index i + +/-- +Package the deterministic hypotheses that upgrade raw ellipticity on the +centered open cube to the compatibility data needed by the `Mu` recovery +machinery. + +The recovery space `R` is fixed once and for all on the domain +`openCubeSet (originCube d n)`. For a given coefficient field `a`, this +predicate asks for: +1. an ellipticity witness for `a` on that domain; +2. the compatibility data identifying the note's `Mu` with the Hilbert-space + minimization problem built from that ellipticity witness. +-/ +def HasOpenCubeEllipticRecoveryData {d : ℕ} (n : ℤ) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} (a : CoeffField d) : Prop := by + let U : Set (Vec d) := openCubeSet (originCube d n) + letI : Fact (MeasureTheory.volume U < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + exact + ∃ hEll : IsEllipticFieldOn lam Lam U a, + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n)) + +/-- Build the origin-cube recovery package from ellipticity and the single +remaining hard compatibility field `Mu = muCandidate`. + +The pairing-integrability part of `HasOpenCubeEllipticRecoveryData` is already +automatic from ellipticity and the `L²` control of recovered fields. -/ +theorem hasOpenCubeEllipticRecoveryData_of_isEllipticFieldOn_of_mu_eq_muCandidate + {d : ℕ} (n : ℤ) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) + (mu_eq_muCandidate : + ∀ P : BlockVec d, + Mu (openCubeSet (originCube d n)) P a = + ((R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll + (volume_openCubeSet_originCube_toReal_pos (d := d) n))).muCandidate P)) : + HasOpenCubeEllipticRecoveryData (d := d) n R + (lam := lam) (Lam := Lam) a := by + exact ⟨hEll, + R.muRecoveryCompatibilityData_of_isEllipticFieldOn_of_mu_eq_muCandidate + hEll (volume_openCubeSet_originCube_toReal_pos (d := d) n) mu_eq_muCandidate⟩ + +/-- +Descendant-family version of `HasOpenCubeEllipticRecoveryData`. + +This packages the translated origin-cube recovery input on every descendant of +the parent cube `Q`. It is the natural upstream hypothesis for producing the +deterministic Chapter-2 coarse data needed by the top Chapter-3 coarse +Poincare wrappers. +-/ +def OpenCubeDescendantEllipticRecoveryFamily {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} : Prop := + ∀ l ≤ Q.scale, ∀ R ∈ descendantsAtScale Q l, + ∃ RR : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d R.scale)), + HasOpenCubeEllipticRecoveryData (d := d) R.scale RR + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (R.index i : ℝ) * cubeScaleFactor R) a) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Subadditivity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Subadditivity.lean new file mode 100644 index 0000000000..8b73758942 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Subadditivity.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.DeterministicCoarseData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity + +/-! # Subadditivity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Origin-cube elliptic recovery -- subadditivity wrappers + +These wrappers package the descendant deterministic-coarse-data burden behind +either `OpenCubeDescendantDeterministicCoarseData` or the stronger recovery- +family hypothesis. This is the note-facing surface downstream Chapter-3 +consumers should use, rather than unpacking the individual coarse witnesses by +hand. +-/ + +private theorem descendantWitnesses_of_deterministicCoarseData + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDescendantDeterministicCoarseData Q a) (j : ℕ) : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det := by + intro R hR + have hk : Q.scale - (j : ℤ) ≤ Q.scale := by + omega + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [mem_descendantsAtScale_iff hk] + have hcast : + Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + rw [show Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) by omega] + simp + simpa [hcast] using hR + exact hData (Q.scale - (j : ℤ)) hk R hRscale + +/-- Subadditivity of the coarse block matrix in Loewner order, packaged from +deterministic coarse data on all descendants. -/ +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + BlockMatLoewnerLE (coarseBlockMatrix (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) := by + rcases hData.self with ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + exact + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ + (descendantWitnesses_of_deterministicCoarseData hData j) + +/-- Subadditivity of the inverse starred block matrix in Loewner order, +packaged from deterministic coarse data on all descendants. -/ +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + BlockMatLoewnerLE (coarseStarredBlockMatrixInv (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) := by + rcases hData.self with ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + exact + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hAQ hSQ hKQ hSigmaQ hdetQ + (descendantWitnesses_of_deterministicCoarseData hData j) + +/-- Subadditivity of `σ_*^{-1}` in Loewner order, packaged from deterministic +coarse data on all descendants. -/ +theorem sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + MatLoewnerLE (sigmaStarInvCoarse (openCubeSet Q) a) + (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (openCubeSet R) a)) := by + rcases hData.self with ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + exact + sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ + (descendantWitnesses_of_deterministicCoarseData hData j) + +/-- Subadditivity of the canonical `b`-matrix in Loewner order, packaged from +deterministic coarse data on all descendants. -/ +theorem bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + MatLoewnerLE + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a))) := by + rcases hData.self with ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + exact + bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ + (descendantWitnesses_of_deterministicCoarseData hData j) + +/-- Recovery-family wrapper for coarse-block-matrix subadditivity in Loewner +order. -/ +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_recoveryFamily + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + BlockMatLoewnerLE (coarseBlockMatrix (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) := + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + j Q a hEll (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +/-- Recovery-family wrapper for inverse-starred-block-matrix subadditivity in +Loewner order. -/ +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_recoveryFamily + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + BlockMatLoewnerLE (coarseStarredBlockMatrixInv (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) := + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + j Q a hEll (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +/-- Recovery-family wrapper for `σ_*^{-1}` subadditivity in Loewner order. -/ +theorem sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_recoveryFamily + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + MatLoewnerLE (sigmaStarInvCoarse (openCubeSet Q) a) + (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (openCubeSet R) a)) := + sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + j Q a hEll (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +/-- Recovery-family wrapper for canonical `b`-matrix subadditivity in Loewner +order. -/ +theorem bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_recoveryFamily + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + MatLoewnerLE + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a))) := + bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_deterministicCoarseData + j Q a hEll (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Translate.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Translate.lean new file mode 100644 index 0000000000..49cd7edc10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeEllipticRecovery/Translate.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu + +/-! +# Origin-cube elliptic recovery -- translated and descendant variants + +Quadraticity / coarse-block-matrix existence on translateSet variants of the +centered open cube and on openCubeSet / cubeSet of an arbitrary TriadicCube, +produced by transporting recovery data through translations. +-/ + +@[expose] public section + +namespace Homogenization + + +/-- +Translate origin-cube elliptic recovery data for the shifted field +`translateCoeffField z a` into quadraticity of `Mu` on the translated open +cube. +-/ +theorem hasQuadraticMu_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} (z : Vec d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) n R + (lam := lam) (Lam := Lam) (translateCoeffField z a)) : + HasQuadraticMu (translateSet z (openCubeSet (originCube d n))) a := by + exact + (hasQuadraticMu_translateSet_iff z (openCubeSet (originCube d n)) a).2 + (hasQuadraticMu_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (lam := lam) (Lam := Lam) + (a := translateCoeffField z a) hData) + +/-- +Translate origin-cube elliptic recovery data for the shifted field +`translateCoeffField z a` into existence of the coarse block matrix on the +translated open cube. +-/ +theorem exists_coarseBlockMatrix_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} {n : ℤ} (z : Vec d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) n R + (lam := lam) (Lam := Lam) (translateCoeffField z a)) : + ∃ Abar : BlockMat d, + IsCoarseBlockMatrix (translateSet z (openCubeSet (originCube d n))) a Abar := by + rcases + exists_coarseBlockMatrix_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (R := R) (lam := lam) (Lam := Lam) + (a := translateCoeffField z a) hData with + ⟨Abar, hA⟩ + refine ⟨Abar, ?_⟩ + exact (isCoarseBlockMatrix_translateSet_iff z (openCubeSet (originCube d n)) a Abar).2 hA + +/-- A nonnegative-scale triadic open cube is an integer translate of the +origin open cube at the same scale. -/ +theorem openCubeSet_eq_translateSet_originCube_of_nonneg_scale {d : ℕ} + {Q : TriadicCube d} (hQ : 0 ≤ Q.scale) : + openCubeSet Q = + translateSet (intVecToRealVec (originCubeScaleTranslationShift Q.scale Q)) + (openCubeSet (originCube d Q.scale)) := by + calc + openCubeSet Q = + translateSet (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) + (openCubeSet (originCube d Q.scale)) := by + exact openCubeSet_eq_translateSet_originCube_of_triadicCube Q + _ = + translateSet (intVecToRealVec (originCubeScaleTranslationShift Q.scale Q)) + (openCubeSet (originCube d Q.scale)) := by + congr 1 + funext i + have hpow : + (((Int.ofNat (3 ^ Int.toNat Q.scale) : ℤ) : ℝ)) = cubeScaleFactor Q := by + calc + (((Int.ofNat (3 ^ Int.toNat Q.scale) : ℤ) : ℝ)) + = (((3 ^ Int.toNat Q.scale : ℕ) : ℝ)) := by + simp + _ = (3 : ℝ) ^ Int.toNat Q.scale := by + simp [Nat.cast_pow] + _ = (3 : ℝ) ^ Q.scale := by + symm + calc + (3 : ℝ) ^ Q.scale = (3 : ℝ) ^ ((Int.toNat Q.scale : ℤ)) := by + rw [Int.toNat_of_nonneg hQ] + _ = (3 : ℝ) ^ Int.toNat Q.scale := by + rw [zpow_natCast] + calc + (Q.index i : ℝ) * cubeScaleFactor Q + = (Q.index i : ℝ) * (((Int.ofNat (3 ^ Int.toNat Q.scale) : ℤ) : ℝ)) := by + rw [hpow] + _ = intVecToRealVec (originCubeScaleTranslationShift Q.scale Q) i := by + simp [intVecToRealVec, originCubeScaleTranslationShift, mul_comm] + +/-- +Triadic-cube version of +`hasQuadraticMu_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData`. +-/ +theorem hasQuadraticMu_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + HasQuadraticMu (openCubeSet Q) a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + simpa [z, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! + hasQuadraticMu_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (n := Q.scale) (z := z) (R := R) (a := a) hData + +/-- +Triadic-cube version of +`exists_coarseBlockMatrix_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData`. +-/ +theorem exists_coarseBlockMatrix_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet Q) a Abar := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + simpa [z, openCubeSet_eq_translateSet_originCube_of_triadicCube Q] using! + exists_coarseBlockMatrix_translateSet_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + (n := Q.scale) (z := z) (R := R) (a := a) hData + +/-- +Canonical coarse block matrix witness on an arbitrary triadic open cube, +packaged from translated origin-cube recovery data. +-/ +theorem + isCoarseBlockMatrix_coarseBlockMatrix_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + IsCoarseBlockMatrix (openCubeSet Q) a (coarseBlockMatrix (openCubeSet Q) a) := + isCoarseBlockMatrix_coarseBlockMatrix + (exists_coarseBlockMatrix_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) + +/-- +Quadratic formula for `Mu` on an arbitrary triadic open cube, packaged from +translated origin-cube recovery data. +-/ +theorem + Mu_eq_half_blockVecDot_coarseBlockMatrix_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (P : BlockVec d) : + Mu (openCubeSet Q) P a = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu + (hasQuadraticMu_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) P + +/-- +Quadraticity of `Mu` on an arbitrary triadic half-open cube, transported from +the open-cube recovery data across the null boundary. +-/ +theorem hasQuadraticMu_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + HasQuadraticMu (cubeSet Q) a := + (hasQuadraticMu_cubeSet_iff_openCubeSet_of_triadicCube Q).2 + (hasQuadraticMu_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) + +/-- +Coarse block matrix existence on an arbitrary triadic half-open cube, +transported from translated origin-cube recovery data. +-/ +theorem exists_coarseBlockMatrix_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + ∃ Abar : BlockMat d, IsCoarseBlockMatrix (cubeSet Q) a Abar := + exists_coarseBlockMatrix_of_hasQuadraticMu + (hasQuadraticMu_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) + +/-- +Canonical coarse block matrix witness on an arbitrary triadic half-open cube, +transported from translated origin-cube recovery data. +-/ +theorem + isCoarseBlockMatrix_coarseBlockMatrix_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) : + IsCoarseBlockMatrix (cubeSet Q) a (coarseBlockMatrix (cubeSet Q) a) := + isCoarseBlockMatrix_coarseBlockMatrix + (exists_coarseBlockMatrix_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) + +/-- +Quadratic formula for `Mu` on an arbitrary triadic half-open cube, transported +from translated origin-cube recovery data. +-/ +theorem + Mu_eq_half_blockVecDot_coarseBlockMatrix_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (P : BlockVec d) : + Mu (cubeSet Q) P a = + (1 / 2 : ℝ) * blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet Q) a) P) := + Mu_eq_half_blockVecDot_coarseBlockMatrix_of_hasQuadraticMu + (hasQuadraticMu_cubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hData) P + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeOpenBridge.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeOpenBridge.lean new file mode 100644 index 0000000000..678cf544ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeOpenBridge.lean @@ -0,0 +1,549 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge + +/-! # Origin Cube Open Bridge -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Deterministic origin-cube open/closed bridge + +This file keeps the deterministic cube/open-cube equivalences needed by Chapter +2 and coarse-graining. The old probability-facing annealed wrappers around +these facts live only in the legacy probability archive. +-/ +private theorem cubeSet_eq_translateSet_originCube_of_triadicCube_bridge {d : ℕ} + (Q : TriadicCube d) : + cubeSet Q = + translateSet (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) + (cubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + +private theorem openCubeSet_eq_translateSet_originCube_of_triadicCube_bridge {d : ℕ} + (Q : TriadicCube d) : + openCubeSet Q = + translateSet (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) + (openCubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + +/-- +Deterministic bridge data from the half-open origin cube to the corresponding +open cube at scale `n`. + +This isolates the only genuinely domain-sensitive missing theorem needed to +transport the Chapter-4 symmetry argument from the literally invariant open cube +back to the currently defined half-open at-scale objects. +-/ +structure OriginCubeOpenBridge {d : ℕ} (n : ℤ) where + coarseBlockMatrix_eq : + ∀ a : CoeffField d, + coarseBlockMatrix (cubeSet (originCube d n)) a = + coarseBlockMatrix (openCubeSet (originCube d n)) a + +theorem volumeAverage_cubeSet_originCube_eq_openCubeSet {d : ℕ} (n : ℤ) (f : Vec d → ℝ) : + volumeAverage (cubeSet (originCube d n)) f = + volumeAverage (openCubeSet (originCube d n)) f := by + simp [volumeAverage, + volume_openCubeSet_eq_volume_cubeSet, + setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube] + +theorem responseJValueSet_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (p q : Vec d) (a : CoeffField d) : + responseJValueSet (cubeSet (originCube d n)) p q a = + responseJValueSet (openCubeSet (originCube d n)) p q a := by + ext m + constructor + · rintro ⟨u, hm⟩ + refine ⟨u.toOpenCubeSetOriginCube (n := n), ?_⟩ + calc + m = volumeAverage (cubeSet (originCube d n)) + (scalarResponseIntegrand (cubeSet (originCube d n)) a p q u) := hm + _ = volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand (cubeSet (originCube d n)) a p q u) := + volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n + (scalarResponseIntegrand (cubeSet (originCube d n)) a p q u) + _ = volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand (openCubeSet (originCube d n)) a p q + (u.toOpenCubeSetOriginCube (n := n))) := by + congr with x + · rintro ⟨u, hm⟩ + refine ⟨u.toCubeSetOriginCube (n := n), ?_⟩ + calc + m = volumeAverage (openCubeSet (originCube d n)) + (scalarResponseIntegrand (openCubeSet (originCube d n)) a p q u) := hm + _ = volumeAverage (cubeSet (originCube d n)) + (scalarResponseIntegrand (openCubeSet (originCube d n)) a p q u) := by + symm + exact volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n + (scalarResponseIntegrand (openCubeSet (originCube d n)) a p q u) + _ = volumeAverage (cubeSet (originCube d n)) + (scalarResponseIntegrand (cubeSet (originCube d n)) a p q + (u.toCubeSetOriginCube (n := n))) := by + congr with x + +theorem ResponseJ_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (p q : Vec d) (a : CoeffField d) : + ResponseJ (cubeSet (originCube d n)) p q a = + ResponseJ (openCubeSet (originCube d n)) p q a := by + rw [ResponseJ, ResponseJ, responseJValueSet_cubeSet_originCube_eq_openCubeSet (d := d) n p q a] + +theorem responseJ_cubeSet_eq_openCubeSet_of_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) (p q : Vec d) (a : CoeffField d) : + ResponseJ (cubeSet Q) p q a = ResponseJ (openCubeSet Q) p q a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using cubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using openCubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + calc + ResponseJ (cubeSet Q) p q a + = ResponseJ (translateSet z (cubeSet (originCube d Q.scale))) p q a := by + rw [hcube] + _ = ResponseJ (cubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) p q (translateCoeffField z a) + _ = ResponseJ (translateSet z (openCubeSet (originCube d Q.scale))) p q a := by + symm + exact ResponseJ_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet Q) p q a := by + rw [hopen] + +theorem isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {P : BlockVec d} {X : BlockState d} : + IsBlockMuAdmissible (cubeSet (originCube d n)) P X ↔ + IsBlockMuAdmissible (openCubeSet (originCube d n)) P X := by + constructor + · rintro ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using hpotL2 + · exact isPotentialZeroTraceOn_openCubeSet_originCube_of_cubeSet hpot + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using hsolL2 + · exact isSolenoidalZeroNormalTraceOn_openCubeSet_originCube_of_cubeSet hsol + · rintro ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using hpotL2 + · exact isPotentialZeroTraceOn_cubeSet_originCube_of_openCubeSet hpot + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using hsolL2 + · exact isSolenoidalZeroNormalTraceOn_cubeSet_originCube_of_openCubeSet hsol + +/-- Arbitrary-triadic-cube version of the open/half-open admissibility bridge +for the doubled `Mu` problem. -/ +theorem isBlockMuAdmissible_cubeSet_triadicCube_iff_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {P : BlockVec d} {X : BlockState d} : + IsBlockMuAdmissible (cubeSet Q) P X ↔ + IsBlockMuAdmissible (openCubeSet Q) P X := by + constructor + · rintro ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet (Q := Q)] + using hpotL2 + · exact isPotentialZeroTraceOn_openCubeSet_triadicCube_of_cubeSet hpot + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet (Q := Q)] + using hsolL2 + · exact isSolenoidalZeroNormalTraceOn_openCubeSet_triadicCube_of_cubeSet hsol + · rintro ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet (Q := Q)] + using hpotL2 + · exact isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet hpot + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet (Q := Q)] + using hsolL2 + · exact isSolenoidalZeroNormalTraceOn_cubeSet_triadicCube_of_openCubeSet hsol + +theorem muValueSet_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (P : BlockVec d) (a : CoeffField d) : + muValueSet (cubeSet (originCube d n)) P a = + muValueSet (openCubeSet (originCube d n)) P a := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X, (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet (n := n)).1 hX, ?_⟩ + calc + m = volumeAverage (cubeSet (originCube d n)) (blockEnergyDensity a X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := + volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n (blockEnergyDensity a X) + · rintro ⟨X, hX, hm⟩ + refine ⟨X, (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet (n := n)).2 hX, ?_⟩ + calc + m = volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := hm + _ = volumeAverage (cubeSet (originCube d n)) (blockEnergyDensity a X) := by + symm + exact volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n (blockEnergyDensity a X) + +theorem Mu_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (P : BlockVec d) (a : CoeffField d) : + Mu (cubeSet (originCube d n)) P a = Mu (openCubeSet (originCube d n)) P a := by + rw [Mu, Mu, muValueSet_cubeSet_originCube_eq_openCubeSet (d := d) n P a] + +theorem blockResponseSpace_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {X : BlockState d} : + BlockResponseSpace a (cubeSet (originCube d n)) X ↔ + BlockResponseSpace a (openCubeSet (originCube d n)) X := by + constructor + · rintro ⟨hpot, hsol, horth⟩ + refine ⟨?_, ?_, ?_⟩ + · exact isPotentialOn_openCubeSet_originCube_of_cubeSet hpot + · exact isSolenoidalOn_openCubeSet_originCube_of_cubeSet hsol + · intro Y hY + have hYcube : IsBlockTestOn (cubeSet (originCube d n)) Y := by + exact + ⟨isPotentialZeroTraceOn_cubeSet_originCube_of_openCubeSet hY.1, + isSolenoidalZeroNormalTraceOn_cubeSet_originCube_of_openCubeSet hY.2⟩ + have hcube := horth Y hYcube + have hset : + ∫ x in cubeSet (originCube d n), + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume := by + exact setIntegral_cubeSet_eq_setIntegral_openCubeSet (Q := originCube d n) + rw [hset] at hcube + exact hcube + · rintro ⟨hpot, hsol, horth⟩ + refine ⟨?_, ?_, ?_⟩ + · exact isPotentialOn_cubeSet_originCube_of_openCubeSet hpot + · exact isSolenoidalOn_cubeSet_originCube_of_openCubeSet hsol + · intro Y hY + have hYopen : IsBlockTestOn (openCubeSet (originCube d n)) Y := by + exact + ⟨isPotentialZeroTraceOn_openCubeSet_originCube_of_cubeSet hY.1, + isSolenoidalZeroNormalTraceOn_openCubeSet_originCube_of_cubeSet hY.2⟩ + have hopen := horth Y hYopen + have hset : + ∫ x in cubeSet (originCube d n), + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), + blockVecDot (Y.eval x) (blockMatVecMul (blockCoeffField a x) (X.eval x)) + ∂MeasureTheory.volume := by + exact setIntegral_cubeSet_eq_setIntegral_openCubeSet (Q := originCube d n) + rw [hset] + exact hopen + +theorem blockResponseIntegrabilityData_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {X : BlockState d} : + BlockResponseIntegrabilityData (cubeSet (originCube d n)) a X ↔ + BlockResponseIntegrabilityData (openCubeSet (originCube d n)) a X := by + constructor + · rintro ⟨hflux, henergy⟩ + refine ⟨?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube + (d := d) n] using hflux + · exact (integrableOn_cubeSet_originCube_iff_integrableOn_openCubeSet_originCube).1 + henergy + · rintro ⟨hflux, henergy⟩ + refine ⟨?_, ?_⟩ + · simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube + (d := d) n] using hflux + · exact (integrableOn_cubeSet_originCube_iff_integrableOn_openCubeSet_originCube).2 + henergy + +theorem blockJValueSet_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (P Q : BlockVec d) (a : CoeffField d) : + blockJValueSet (cubeSet (originCube d n)) P Q a = + blockJValueSet (openCubeSet (originCube d n)) P Q a := by + ext m + constructor + · rintro ⟨X, hX, hInt, hm⟩ + refine ⟨X, (blockResponseSpace_cubeSet_originCube_iff_openCubeSet (n := n)).1 hX, + (blockResponseIntegrabilityData_cubeSet_originCube_iff_openCubeSet (n := n)).1 hInt, ?_⟩ + calc + m = volumeAverage (cubeSet (originCube d n)) (blockResponseIntegrand a P Q X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) (blockResponseIntegrand a P Q X) := + volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n + (blockResponseIntegrand a P Q X) + · rintro ⟨X, hX, hInt, hm⟩ + refine ⟨X, (blockResponseSpace_cubeSet_originCube_iff_openCubeSet (n := n)).2 hX, + (blockResponseIntegrabilityData_cubeSet_originCube_iff_openCubeSet (n := n)).2 hInt, ?_⟩ + calc + m = volumeAverage (openCubeSet (originCube d n)) (blockResponseIntegrand a P Q X) := hm + _ = volumeAverage (cubeSet (originCube d n)) (blockResponseIntegrand a P Q X) := by + symm + exact volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) n + (blockResponseIntegrand a P Q X) + +theorem BlockJ_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (P Q : BlockVec d) (a : CoeffField d) : + BlockJ (cubeSet (originCube d n)) P Q a = + BlockJ (openCubeSet (originCube d n)) P Q a := by + rw [BlockJ, BlockJ, blockJValueSet_cubeSet_originCube_eq_openCubeSet (d := d) n P Q a] + +theorem Mu_cubeSet_eq_openCubeSet_of_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) (P : BlockVec d) (a : CoeffField d) : + Mu (cubeSet Q) P a = Mu (openCubeSet Q) P a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using cubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using openCubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + calc + Mu (cubeSet Q) P a + = Mu (translateSet z (cubeSet (originCube d Q.scale))) P a := by + rw [hcube] + _ = Mu (cubeSet (originCube d Q.scale)) P (translateCoeffField z a) := by + exact Mu_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) P a + _ = Mu (openCubeSet (originCube d Q.scale)) P (translateCoeffField z a) := by + exact Mu_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) P (translateCoeffField z a) + _ = Mu (translateSet z (openCubeSet (originCube d Q.scale))) P a := by + symm + exact Mu_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) P a + _ = Mu (openCubeSet Q) P a := by + rw [hopen] + +theorem BlockJ_cubeSet_eq_openCubeSet_of_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) (P Q' : BlockVec d) (a : CoeffField d) : + BlockJ (cubeSet Q) P Q' a = BlockJ (openCubeSet Q) P Q' a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using cubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using openCubeSet_eq_translateSet_originCube_of_triadicCube_bridge Q + calc + BlockJ (cubeSet Q) P Q' a + = BlockJ (translateSet z (cubeSet (originCube d Q.scale))) P Q' a := by + rw [hcube] + _ = BlockJ (cubeSet (originCube d Q.scale)) P Q' (translateCoeffField z a) := by + exact BlockJ_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) P Q' a + _ = BlockJ (openCubeSet (originCube d Q.scale)) P Q' (translateCoeffField z a) := by + exact BlockJ_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) P Q' (translateCoeffField z a) + _ = BlockJ (translateSet z (openCubeSet (originCube d Q.scale))) P Q' a := by + symm + exact BlockJ_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) P Q' a + _ = BlockJ (openCubeSet Q) P Q' a := by + rw [hopen] + +theorem hasQuadraticMu_cubeSet_iff_openCubeSet_of_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) {a : CoeffField d} : + HasQuadraticMu (cubeSet Q) a ↔ HasQuadraticMu (openCubeSet Q) a := by + constructor + · rintro ⟨Qform, hQ⟩ + refine ⟨Qform, ?_⟩ + intro P + rw [← Mu_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (P := P) a] + exact hQ P + · rintro ⟨Qform, hQ⟩ + refine ⟨Qform, ?_⟩ + intro P + rw [Mu_cubeSet_eq_openCubeSet_of_triadicCube (Q := Q) (P := P) a] + exact hQ P + +theorem coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet + {d : ℕ} [NeZero d] (n : ℤ) (a : CoeffField d) : + coarseBlockMatrix (cubeSet (originCube d n)) a = + coarseBlockMatrix (openCubeSet (originCube d n)) a := by + exact coarseBlockMatrix_eq_of_mu_eq (U := cubeSet (originCube d n)) + (V := openCubeSet (originCube d n)) (a := a) + (fun P => Mu_cubeSet_originCube_eq_openCubeSet (d := d) n P a) + +theorem isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar : Mat d} : + IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar ↔ + IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar := by + constructor + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro q + rw [← ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n 0 q a] + exact hresp q + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro q + rw [ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n 0 q a] + exact hresp q + +theorem isKappaCoarse_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar kappa : Mat d} : + IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa ↔ + IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa := by + constructor + · intro hK p q + rw [← ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p q a, + ← ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p 0 a, + ← ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n 0 q a] + exact hK p q + · intro hK p q + rw [ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p q a, + ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p 0 a, + ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n 0 q a] + exact hK p q + +theorem isSigmaCoarse_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} : + IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa ↔ + IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa := by + constructor + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro p + rw [← ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p 0 a] + exact hresp p + · rintro ⟨hsymm, hresp⟩ + refine ⟨hsymm, ?_⟩ + intro p + rw [ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p 0 a] + exact hresp p + +theorem sigmaStarInvCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) : + sigmaStarInvCoarse (cubeSet (originCube d n)) a = + sigmaStarInvCoarse (openCubeSet (originCube d n)) a := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS)] + +theorem sigmaStarCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hdet : IsUnit sigmaStar.det) : + sigmaStarCoarse (cubeSet (originCube d n)) a = + sigmaStarCoarse (openCubeSet (originCube d n)) a := by + rw [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) hdet] + +theorem sigmaStarInvKappaCoarse_cubeSet_originCube_eq_openCubeSet_of_isKappaCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) : + sigmaStarInvKappaCoarse (cubeSet (originCube d n)) a = + sigmaStarInvKappaCoarse (openCubeSet (originCube d n)) a := by + rw [sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK, + sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse + ((isKappaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hK)] + +theorem kappaCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse_and_isKappaCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + kappaCoarse (cubeSet (originCube d n)) a = + kappaCoarse (openCubeSet (originCube d n)) a := by + rw [eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + eq_kappaCoarse_of_isKappaCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) + ((isKappaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hK) hdet] + +theorem sigmaCorrectedResponse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse_and_isKappaCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + sigmaCorrectedResponse (cubeSet (originCube d n)) a p = + sigmaCorrectedResponse (openCubeSet (originCube d n)) a p := by + rw [sigmaCorrectedResponse, sigmaCorrectedResponse, + ResponseJ_cubeSet_originCube_eq_openCubeSet (d := d) n p 0 a, + kappaCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse_and_isKappaCoarse + (n := n) hS hK hdet, + sigmaStarInvCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaStarCoarse (n := n) hS] + +theorem sigmaCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + sigmaCoarse (cubeSet (originCube d n)) a = + sigmaCoarse (openCubeSet (originCube d n)) a := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + sigmaCoarse_eq_of_isSigmaCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) + ((isKappaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hK) + ((isSigmaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hSigma) hdet] + +theorem bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_originCube_eq_openCubeSet_of_isSigmaCoarse + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse (cubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (cubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (cubeSet (originCube d n)) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + bCoarse (sigmaCoarse (cubeSet (originCube d n)) a) + (sigmaStarCoarse (cubeSet (originCube d n)) a) + (kappaCoarse (cubeSet (originCube d n)) a) = + bCoarse (sigmaCoarse (openCubeSet (originCube d n)) a) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (kappaCoarse (openCubeSet (originCube d n)) a) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) + ((isKappaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hK) + ((isSigmaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hSigma) hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) hdet, + eq_kappaCoarse_of_isKappaCoarse + ((isSigmaStarCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hS) + ((isKappaCoarse_cubeSet_originCube_iff_openCubeSet (n := n)).1 hK) hdet] + +theorem originCubeOpenBridge {d : ℕ} [NeZero d] (n : ℤ) : + OriginCubeOpenBridge (d := d) n where + coarseBlockMatrix_eq := coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet (d := d) n + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeSymmetry.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeSymmetry.lean new file mode 100644 index 0000000000..b51c96b0f2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/OriginCubeSymmetry.lean @@ -0,0 +1,675 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeSymmetry +public import Mathlib.LinearAlgebra.Matrix.Swap + +/-! # Origin Cube Symmetry -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace BlockState + +/-- +Coordinate sign-flip transport of a doubled state field. +-/ +def signFlip {d : ℕ} (X : BlockState d) (i : Fin d) : BlockState d := + { potential := fun x => + signFlipVecContinuousLinearEquiv i (X.potential (signFlipVecContinuousLinearEquiv i x)) + flux := fun x => + signFlipVecContinuousLinearEquiv i (X.flux (signFlipVecContinuousLinearEquiv i x)) } + +/-- +Coordinate swap transport of a doubled state field. +-/ +def swap {d : ℕ} (X : BlockState d) (i j : Fin d) : BlockState d := + { potential := fun x => + swapVecContinuousLinearEquiv i j (X.potential (swapVecContinuousLinearEquiv i j x)) + flux := fun x => + swapVecContinuousLinearEquiv i j (X.flux (swapVecContinuousLinearEquiv i j x)) } + +@[simp] theorem signFlip_signFlip {d : ℕ} (X : BlockState d) (i : Fin d) : + (X.signFlip i).signFlip i = X := by + cases X + case mk potential flux => + apply BlockState.ext + · funext x + have hxx : + signFlipVecContinuousLinearEquiv i (signFlipVecContinuousLinearEquiv i x) = x := + signFlipVecContinuousLinearEquiv_self_apply (i := i) x + calc + signFlipVecContinuousLinearEquiv i + (signFlipVecContinuousLinearEquiv i + (potential (signFlipVecContinuousLinearEquiv i (signFlipVecContinuousLinearEquiv i x)))) + = signFlipVecContinuousLinearEquiv i + (signFlipVecContinuousLinearEquiv i (potential x)) := by + rw [hxx] + _ = potential x := by + simpa using + (signFlipVecContinuousLinearEquiv_self_apply (i := i) (potential x)) + · funext x + have hxx : + signFlipVecContinuousLinearEquiv i (signFlipVecContinuousLinearEquiv i x) = x := + signFlipVecContinuousLinearEquiv_self_apply (i := i) x + calc + signFlipVecContinuousLinearEquiv i + (signFlipVecContinuousLinearEquiv i + (flux (signFlipVecContinuousLinearEquiv i (signFlipVecContinuousLinearEquiv i x)))) + = signFlipVecContinuousLinearEquiv i + (signFlipVecContinuousLinearEquiv i (flux x)) := by + rw [hxx] + _ = flux x := by + simpa using + (signFlipVecContinuousLinearEquiv_self_apply (i := i) (flux x)) + +@[simp] theorem swap_swap {d : ℕ} (X : BlockState d) (i j : Fin d) : + (X.swap i j).swap i j = X := by + cases X + case mk potential flux => + apply BlockState.ext + · funext x + have hxx : + swapVecContinuousLinearEquiv i j (swapVecContinuousLinearEquiv i j x) = x := + swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) x + calc + swapVecContinuousLinearEquiv i j + (swapVecContinuousLinearEquiv i j + (potential (swapVecContinuousLinearEquiv i j (swapVecContinuousLinearEquiv i j x)))) + = swapVecContinuousLinearEquiv i j + (swapVecContinuousLinearEquiv i j (potential x)) := by + rw [hxx] + _ = potential x := by + simpa using + (swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) (potential x)) + · funext x + have hxx : + swapVecContinuousLinearEquiv i j (swapVecContinuousLinearEquiv i j x) = x := + swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) x + calc + swapVecContinuousLinearEquiv i j + (swapVecContinuousLinearEquiv i j + (flux (swapVecContinuousLinearEquiv i j (swapVecContinuousLinearEquiv i j x)))) + = swapVecContinuousLinearEquiv i j + (swapVecContinuousLinearEquiv i j (flux x)) := by + rw [hxx] + _ = flux x := by + simpa using + (swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) (flux x)) + +end BlockState + +@[simp] theorem blockVecConj_signFlipMatrix_signFlipMatrix {d : ℕ} + (P : BlockVec d) (i : Fin d) : + blockVecConj (signFlipMatrix i) (blockVecConj (signFlipMatrix i) P) = P := by + rcases P with ⟨p, q⟩ + apply Prod.ext + · simpa [blockVecConj, signFlipVecContinuousLinearEquiv_apply] using + (signFlipVecContinuousLinearEquiv_self_apply (i := i) p) + · simpa [blockVecConj, signFlipVecContinuousLinearEquiv_apply] using + (signFlipVecContinuousLinearEquiv_self_apply (i := i) q) + +@[simp] theorem blockVecConj_swap_swap {d : ℕ} + (P : BlockVec d) (i j : Fin d) : + blockVecConj (Matrix.swap ℝ i j) (blockVecConj (Matrix.swap ℝ i j) P) = P := by + rcases P with ⟨p, q⟩ + apply Prod.ext + · simpa [blockVecConj, swapVecContinuousLinearEquiv_apply] using + (swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) p) + · simpa [blockVecConj, swapVecContinuousLinearEquiv_apply] using + (swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) q) + +@[simp] theorem rotateCoeffField_signFlipMatrix_signFlipMatrix {d : ℕ} + (a : CoeffField d) (i : Fin d) : + rotateCoeffField (signFlipMatrix i) (rotateCoeffField (signFlipMatrix i) a) = a := by + funext x + have hx : + matVecMul (signFlipMatrix i) (matVecMul (signFlipMatrix i) x) = x := by + simpa [signFlipVecContinuousLinearEquiv_apply] using + (signFlipVecContinuousLinearEquiv_self_apply (i := i) x) + calc + rotateCoeffField (signFlipMatrix i) (rotateCoeffField (signFlipMatrix i) a) x + = matTranspose (signFlipMatrix i) * + (matTranspose (signFlipMatrix i) * a (matVecMul (signFlipMatrix i) + (matVecMul (signFlipMatrix i) x)) * signFlipMatrix i) * + signFlipMatrix i := by + rfl + _ = signFlipMatrix i * (signFlipMatrix i * a x * signFlipMatrix i) * signFlipMatrix i := by + simp [matTranspose_signFlipMatrix, hx] + _ = (signFlipMatrix i * signFlipMatrix i) * a x * (signFlipMatrix i * signFlipMatrix i) := by + simp [Matrix.mul_assoc] + _ = a x := by + simp [signFlipMatrix_mul_self] + +@[simp] theorem rotateCoeffField_swap_swap {d : ℕ} + (a : CoeffField d) (i j : Fin d) : + rotateCoeffField (Matrix.swap ℝ i j) (rotateCoeffField (Matrix.swap ℝ i j) a) = a := by + funext x + have hx : + matVecMul (Matrix.swap ℝ i j) (matVecMul (Matrix.swap ℝ i j) x) = x := by + simpa [swapVecContinuousLinearEquiv_apply] using + (swapVecContinuousLinearEquiv_self_apply (i := i) (j := j) x) + calc + rotateCoeffField (Matrix.swap ℝ i j) (rotateCoeffField (Matrix.swap ℝ i j) a) x + = matTranspose (Matrix.swap ℝ i j) * + (matTranspose (Matrix.swap ℝ i j) * a (matVecMul (Matrix.swap ℝ i j) + (matVecMul (Matrix.swap ℝ i j) x)) * Matrix.swap ℝ i j) * + Matrix.swap ℝ i j := by + rfl + _ = Matrix.swap ℝ i j * (Matrix.swap ℝ i j * a x * Matrix.swap ℝ i j) * Matrix.swap ℝ i j := by + simp [matTranspose, hx] + _ = (Matrix.swap ℝ i j * Matrix.swap ℝ i j) * a x * + (Matrix.swap ℝ i j * Matrix.swap ℝ i j) := by + simp [Matrix.mul_assoc] + _ = a x := by + simp [Matrix.swap_mul_self (R := ℝ) i j] + +private theorem measurePreserving_signFlipVecContinuousLinearEquiv {d : ℕ} (i : Fin d) : + MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) MeasureTheory.volume + MeasureTheory.volume := by + classical + simpa [signFlipVecContinuousLinearEquiv_apply] using! + (MeasureTheory.volume_preserving_pi fun j : Fin d => + by + by_cases h : j = i + · subst h + simpa using! + (MeasureTheory.Measure.measurePreserving_neg + (MeasureTheory.volume : MeasureTheory.Measure ℝ)) + · simpa [h] using + (MeasureTheory.MeasurePreserving.id + (μ := (MeasureTheory.volume : MeasureTheory.Measure ℝ)))) + +private theorem measurePreserving_swapVecContinuousLinearEquiv {d : ℕ} (i j : Fin d) : + MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) MeasureTheory.volume + MeasureTheory.volume := by + simpa [swapVecContinuousLinearEquiv] using! + (MeasureTheory.volume_measurePreserving_piCongrLeft + (fun _ : Fin d => ℝ) (Equiv.swap i j)) + +private theorem measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube + {d : ℕ} (i : Fin d) (n : ℤ) : + MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + let U := openCubeSet (originCube d n) + have hpre : (signFlipVecContinuousLinearEquiv i) ⁻¹' U = U := by + ext x + simpa [U] using (mem_openCubeSet_originCube_signFlipMatrix_iff (m := n) (i := i) (x := x)) + simpa [U, hpre] using + (measurePreserving_signFlipVecContinuousLinearEquiv i).restrict_preimage_emb + (signFlipVecContinuousLinearEquiv i).toHomeomorph.measurableEmbedding U + +private theorem measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube + {d : ℕ} (i j : Fin d) (n : ℤ) : + MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + let U := openCubeSet (originCube d n) + have hpre : (swapVecContinuousLinearEquiv i j) ⁻¹' U = U := by + ext x + simpa [U] using (mem_openCubeSet_originCube_swap_iff (m := n) (i := i) (j := j) (x := x)) + simpa [U, hpre] using + (measurePreserving_swapVecContinuousLinearEquiv i j).restrict_preimage_emb + (swapVecContinuousLinearEquiv i j).toHomeomorph.measurableEmbedding U + +theorem isBlockMuAdmissible_signFlip_openCubeSet_originCube + {d : ℕ} {n : ℤ} {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (openCubeSet (originCube d n)) P X) (i : Fin d) : + IsBlockMuAdmissible (openCubeSet (originCube d n)) + (blockVecConj (signFlipMatrix i) P) (X.signFlip i) := by + rcases hX with ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · convert + ((signFlipVecContinuousLinearEquiv i).toContinuousLinearMap.comp_memLp' + (hpotL2.comp_measurePreserving + (measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube + i n))) using 1 + funext x + simp [BlockState.signFlip, blockVecConj, signFlipVecContinuousLinearEquiv_apply, map_sub] + · convert + isPotentialZeroTraceOn_signFlip_openCubeSet_originCube + (f := fun x => X.potential x - P.1) hpot i using 1 + funext x + simp [BlockState.signFlip, blockVecConj, signFlipVecContinuousLinearEquiv_apply, + sub_eq_add_neg, matVecMul_add, matVecMul_neg] + · convert + ((signFlipVecContinuousLinearEquiv i).toContinuousLinearMap.comp_memLp' + (hsolL2.comp_measurePreserving + (measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube + i n))) using 1 + funext x + simp [BlockState.signFlip, blockVecConj, signFlipVecContinuousLinearEquiv_apply, map_sub] + · convert + isSolenoidalZeroNormalTraceOn_signFlip_openCubeSet_originCube + (g := fun x => X.flux x - P.2) hsol i using 1 + funext x + simp [BlockState.signFlip, blockVecConj, signFlipVecContinuousLinearEquiv_apply, + sub_eq_add_neg, matVecMul_add, matVecMul_neg] + +theorem isBlockMuAdmissible_swap_openCubeSet_originCube + {d : ℕ} {n : ℤ} {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (openCubeSet (originCube d n)) P X) (i j : Fin d) : + IsBlockMuAdmissible (openCubeSet (originCube d n)) + (blockVecConj (Matrix.swap ℝ i j) P) (X.swap i j) := by + rcases hX with ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · convert + ((swapVecContinuousLinearEquiv i j).toContinuousLinearMap.comp_memLp' + (hpotL2.comp_measurePreserving + (measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube i j n))) + using 1 + funext x + simp [BlockState.swap, blockVecConj, swapVecContinuousLinearEquiv_apply, map_sub] + · convert + isPotentialZeroTraceOn_swap_openCubeSet_originCube + (f := fun x => X.potential x - P.1) hpot i j using 1 + funext x + simp [BlockState.swap, blockVecConj, swapVecContinuousLinearEquiv_apply, + sub_eq_add_neg, matVecMul_add, matVecMul_neg] + · convert + ((swapVecContinuousLinearEquiv i j).toContinuousLinearMap.comp_memLp' + (hsolL2.comp_measurePreserving + (measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube i j n))) + using 1 + funext x + simp [BlockState.swap, blockVecConj, swapVecContinuousLinearEquiv_apply, map_sub] + · convert + isSolenoidalZeroNormalTraceOn_swap_openCubeSet_originCube + (g := fun x => X.flux x - P.2) hsol i j using 1 + funext x + simp [BlockState.swap, blockVecConj, swapVecContinuousLinearEquiv_apply, + sub_eq_add_neg, matVecMul_add, matVecMul_neg] + +theorem blockEnergyDensity_rotateCoeffField_signFlip + {d : ℕ} (a : CoeffField d) (X : BlockState d) (i : Fin d) (x : Vec d) : + blockEnergyDensity (rotateCoeffField (signFlipMatrix i) a) (X.signFlip i) x = + blockEnergyDensity a X (signFlipVecContinuousLinearEquiv i x) := by + let Y : BlockState d := + { potential := fun y => X.potential (signFlipVecContinuousLinearEquiv i y) + flux := fun y => X.flux (signFlipVecContinuousLinearEquiv i y) } + have h := + blockEnergyDensity_mapMatrix_signFlipMatrix_conj + (a := fun y => a (signFlipVecContinuousLinearEquiv i y)) (X := Y) (i := i) (x := x) + simpa [rotateCoeffField, blockEnergyDensity, blockCoeffField, BlockState.signFlip, + BlockState.eval, Y, signFlipVecContinuousLinearEquiv_apply, matTranspose_signFlipMatrix] + using! h + +theorem blockEnergyDensity_rotateCoeffField_swap + {d : ℕ} (a : CoeffField d) (X : BlockState d) (i j : Fin d) (x : Vec d) : + blockEnergyDensity (rotateCoeffField (Matrix.swap ℝ i j) a) (X.swap i j) x = + blockEnergyDensity a X (swapVecContinuousLinearEquiv i j x) := by + let Y : BlockState d := + { potential := fun y => X.potential (swapVecContinuousLinearEquiv i j y) + flux := fun y => X.flux (swapVecContinuousLinearEquiv i j y) } + have h := + blockEnergyDensity_mapMatrix_swap_conj + (a := fun y => a (swapVecContinuousLinearEquiv i j y)) (X := Y) (i := i) (j := j) (x := x) + simpa [rotateCoeffField, blockEnergyDensity, blockCoeffField, BlockState.swap, + BlockState.eval, Y, swapVecContinuousLinearEquiv_apply, matTranspose] using! h + +theorem volumeAverage_blockEnergyDensity_signFlip_openCubeSet_originCube + {d : ℕ} (n : ℤ) (a : CoeffField d) (X : BlockState d) (i : Fin d) : + volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (signFlipMatrix i) a) (X.signFlip i)) = + volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := by + unfold volumeAverage + have hfun : + (fun x => + blockEnergyDensity (rotateCoeffField (signFlipMatrix i) a) (X.signFlip i) x) = + fun x => blockEnergyDensity a X (signFlipVecContinuousLinearEquiv i x) := by + funext x + exact blockEnergyDensity_rotateCoeffField_signFlip a X i x + rw [hfun, setIntegral_comp_signFlipVecContinuousLinearEquiv_openCubeSet_originCube] + +theorem volumeAverage_blockEnergyDensity_swap_openCubeSet_originCube + {d : ℕ} (n : ℤ) (a : CoeffField d) (X : BlockState d) (i j : Fin d) : + volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (Matrix.swap ℝ i j) a) (X.swap i j)) = + volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := by + unfold volumeAverage + have hfun : + (fun x => + blockEnergyDensity (rotateCoeffField (Matrix.swap ℝ i j) a) (X.swap i j) x) = + fun x => blockEnergyDensity a X (swapVecContinuousLinearEquiv i j x) := by + funext x + exact blockEnergyDensity_rotateCoeffField_swap a X i j x + rw [hfun, setIntegral_comp_swapVecContinuousLinearEquiv_openCubeSet_originCube] + +theorem muValueSet_signFlip_openCubeSet_originCube + {d : ℕ} (n : ℤ) (P : BlockVec d) (a : CoeffField d) (i : Fin d) : + muValueSet (openCubeSet (originCube d n)) + (blockVecConj (signFlipMatrix i) P) (rotateCoeffField (signFlipMatrix i) a) = + muValueSet (openCubeSet (originCube d n)) P a := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X.signFlip i, ?_, ?_⟩ + · simpa using + isBlockMuAdmissible_signFlip_openCubeSet_originCube + (n := n) (P := blockVecConj (signFlipMatrix i) P) (X := X) hX i + · calc + m = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (signFlipMatrix i) a) X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity + (rotateCoeffField (signFlipMatrix i) + (rotateCoeffField (signFlipMatrix i) a)) (X.signFlip i)) := by + symm + exact volumeAverage_blockEnergyDensity_signFlip_openCubeSet_originCube + (n := n) (a := rotateCoeffField (signFlipMatrix i) a) (X := X) i + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity a (X.signFlip i)) := by + simp + · rintro ⟨X, hX, hm⟩ + refine ⟨X.signFlip i, ?_, ?_⟩ + · exact isBlockMuAdmissible_signFlip_openCubeSet_originCube + (n := n) (P := P) (X := X) hX i + · calc + m = volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (signFlipMatrix i) a) (X.signFlip i)) := + (volumeAverage_blockEnergyDensity_signFlip_openCubeSet_originCube + (n := n) (a := a) (X := X) i).symm + +theorem muValueSet_swap_openCubeSet_originCube + {d : ℕ} (n : ℤ) (P : BlockVec d) (a : CoeffField d) (i j : Fin d) : + muValueSet (openCubeSet (originCube d n)) + (blockVecConj (Matrix.swap ℝ i j) P) (rotateCoeffField (Matrix.swap ℝ i j) a) = + muValueSet (openCubeSet (originCube d n)) P a := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X.swap i j, ?_, ?_⟩ + · simpa using + isBlockMuAdmissible_swap_openCubeSet_originCube + (n := n) (P := blockVecConj (Matrix.swap ℝ i j) P) (X := X) hX i j + · calc + m = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (Matrix.swap ℝ i j) a) X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity + (rotateCoeffField (Matrix.swap ℝ i j) + (rotateCoeffField (Matrix.swap ℝ i j) a)) (X.swap i j)) := by + symm + exact volumeAverage_blockEnergyDensity_swap_openCubeSet_originCube + (n := n) (a := rotateCoeffField (Matrix.swap ℝ i j) a) (X := X) i j + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity a (X.swap i j)) := by + simp + · rintro ⟨X, hX, hm⟩ + refine ⟨X.swap i j, ?_, ?_⟩ + · exact isBlockMuAdmissible_swap_openCubeSet_originCube + (n := n) (P := P) (X := X) hX i j + · calc + m = volumeAverage (openCubeSet (originCube d n)) (blockEnergyDensity a X) := hm + _ = volumeAverage (openCubeSet (originCube d n)) + (blockEnergyDensity (rotateCoeffField (Matrix.swap ℝ i j) a) (X.swap i j)) := + (volumeAverage_blockEnergyDensity_swap_openCubeSet_originCube + (n := n) (a := a) (X := X) i j).symm + +theorem Mu_signFlip_openCubeSet_originCube + {d : ℕ} (n : ℤ) (P : BlockVec d) (a : CoeffField d) (i : Fin d) : + Mu (openCubeSet (originCube d n)) + (blockVecConj (signFlipMatrix i) P) (rotateCoeffField (signFlipMatrix i) a) = + Mu (openCubeSet (originCube d n)) P a := by + rw [Mu, Mu, muValueSet_signFlip_openCubeSet_originCube (d := d) n P a i] + +theorem Mu_swap_openCubeSet_originCube + {d : ℕ} (n : ℤ) (P : BlockVec d) (a : CoeffField d) (i j : Fin d) : + Mu (openCubeSet (originCube d n)) + (blockVecConj (Matrix.swap ℝ i j) P) (rotateCoeffField (Matrix.swap ℝ i j) a) = + Mu (openCubeSet (originCube d n)) P a := by + rw [Mu, Mu, muValueSet_swap_openCubeSet_originCube (d := d) n P a i j] + +private theorem isSymmetricBlockMat_blockMatConj_of_transpose_eq_self {d : ℕ} + {Abar : BlockMat d} {R : Mat d} (hA : IsSymmetricBlockMat Abar) + (hR : matTranspose R = R) : + IsSymmetricBlockMat (blockMatConj R Abar) := by + have hul : matTranspose Abar.upperLeft = Abar.upperLeft := by + ext i j + simpa [matTranspose] using! hA (Sum.inl j) (Sum.inl i) + have hur : matTranspose Abar.upperRight = Abar.lowerLeft := by + ext i j + simpa [matTranspose] using! hA (Sum.inl j) (Sum.inr i) + have hll : matTranspose Abar.lowerLeft = Abar.upperRight := by + ext i j + simpa [matTranspose] using! hA (Sum.inr j) (Sum.inl i) + have hlr : matTranspose Abar.lowerRight = Abar.lowerRight := by + ext i j + simpa [matTranspose] using! hA (Sum.inr j) (Sum.inr i) + intro α β + cases α with + | inl i => + cases β with + | inl j => + have hconj : + matTranspose (R * Abar.upperLeft * R) = R * Abar.upperLeft * R := by + rw [matTranspose_mul_mul_of_transpose_eq_self hR, hul] + have h := congrArg (fun M => M j i) hconj + simpa [blockMatConj, blockMatEntry, matTranspose] using h + | inr j => + have hconj : + matTranspose (R * Abar.upperRight * R) = R * Abar.lowerLeft * R := by + rw [matTranspose_mul_mul_of_transpose_eq_self hR, hur] + have h := congrArg (fun M => M j i) hconj + simpa [blockMatConj, blockMatEntry, matTranspose] using h + | inr i => + cases β with + | inl j => + have hconj : + matTranspose (R * Abar.lowerLeft * R) = R * Abar.upperRight * R := by + rw [matTranspose_mul_mul_of_transpose_eq_self hR, hll] + have h := congrArg (fun M => M j i) hconj + simpa [blockMatConj, blockMatEntry, matTranspose] using h + | inr j => + have hconj : + matTranspose (R * Abar.lowerRight * R) = R * Abar.lowerRight * R := by + rw [matTranspose_mul_mul_of_transpose_eq_self hR, hlr] + have h := congrArg (fun M => M j i) hconj + simpa [blockMatConj, blockMatEntry, matTranspose] using h + +namespace IsCoarseBlockMatrix + +theorem signFlip_openCubeSet_originCube + {d : ℕ} {n : ℤ} {a : CoeffField d} {Abar : BlockMat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) (i : Fin d) : + IsCoarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a) (blockMatConj (signFlipMatrix i) Abar) := by + rcases hA with ⟨hsymm, hmu⟩ + refine ⟨isSymmetricBlockMat_blockMatConj_of_transpose_eq_self hsymm + (matTranspose_signFlipMatrix i), ?_⟩ + intro P + have hMuP : + Mu (openCubeSet (originCube d n)) P (rotateCoeffField (signFlipMatrix i) a) = + Mu (openCubeSet (originCube d n)) (blockVecConj (signFlipMatrix i) P) a := by + simpa using + (Mu_signFlip_openCubeSet_originCube (d := d) (n := n) + (P := blockVecConj (signFlipMatrix i) P) (a := a) i) + have hmv : + blockMatVecMul (blockMatConj (signFlipMatrix i) Abar) P = + blockVecConj (signFlipMatrix i) + (blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P)) := by + simpa using + (blockMatVecMul_blockMatConj_of_mul_self_eq_one + (R := signFlipMatrix i) (B := Abar) (X := blockVecConj (signFlipMatrix i) P) + (hR2 := signFlipMatrix_mul_self i)) + have hdot : + blockVecDot P (blockMatVecMul (blockMatConj (signFlipMatrix i) Abar) P) = + blockVecDot (blockVecConj (signFlipMatrix i) P) + (blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P)) := by + calc + blockVecDot P (blockMatVecMul (blockMatConj (signFlipMatrix i) Abar) P) + = blockVecDot (blockVecConj (signFlipMatrix i) (blockVecConj (signFlipMatrix i) P)) + (blockVecConj (signFlipMatrix i) + (blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P))) := by + simp [hmv] + _ = blockVecDot (blockVecConj (signFlipMatrix i) P) + (blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P)) := by + simpa using + (blockVecDot_blockVecConj_of_transpose_eq_self_of_mul_self_eq_one + (R := signFlipMatrix i) + (X := blockVecConj (signFlipMatrix i) P) + (Y := blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P)) + (hR := matTranspose_signFlipMatrix i) + (hR2 := signFlipMatrix_mul_self i)) + calc + Mu (openCubeSet (originCube d n)) P (rotateCoeffField (signFlipMatrix i) a) + = Mu (openCubeSet (originCube d n)) (blockVecConj (signFlipMatrix i) P) a := hMuP + _ = (1 / 2 : ℝ) * + blockVecDot (blockVecConj (signFlipMatrix i) P) + (blockMatVecMul Abar (blockVecConj (signFlipMatrix i) P)) := hmu _ + _ = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (blockMatConj (signFlipMatrix i) Abar) P) := by + rw [hdot] + +theorem swap_openCubeSet_originCube + {d : ℕ} {n : ℤ} {a : CoeffField d} {Abar : BlockMat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) (i j : Fin d) : + IsCoarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a) (blockMatConj (Matrix.swap ℝ i j) Abar) := by + rcases hA with ⟨hsymm, hmu⟩ + refine ⟨isSymmetricBlockMat_blockMatConj_of_transpose_eq_self hsymm + (by simp [matTranspose]), ?_⟩ + intro P + have hMuP : + Mu (openCubeSet (originCube d n)) P (rotateCoeffField (Matrix.swap ℝ i j) a) = + Mu (openCubeSet (originCube d n)) (blockVecConj (Matrix.swap ℝ i j) P) a := by + simpa using + (Mu_swap_openCubeSet_originCube (d := d) (n := n) + (P := blockVecConj (Matrix.swap ℝ i j) P) (a := a) i j) + have hmv : + blockMatVecMul (blockMatConj (Matrix.swap ℝ i j) Abar) P = + blockVecConj (Matrix.swap ℝ i j) + (blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P)) := by + simpa using + (blockMatVecMul_blockMatConj_of_mul_self_eq_one + (R := Matrix.swap ℝ i j) (B := Abar) (X := blockVecConj (Matrix.swap ℝ i j) P) + (hR2 := Matrix.swap_mul_self (R := ℝ) i j)) + have hdot : + blockVecDot P (blockMatVecMul (blockMatConj (Matrix.swap ℝ i j) Abar) P) = + blockVecDot (blockVecConj (Matrix.swap ℝ i j) P) + (blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P)) := by + calc + blockVecDot P (blockMatVecMul (blockMatConj (Matrix.swap ℝ i j) Abar) P) + = blockVecDot (blockVecConj (Matrix.swap ℝ i j) (blockVecConj (Matrix.swap ℝ i j) P)) + (blockVecConj (Matrix.swap ℝ i j) + (blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P))) := by + simp [hmv] + _ = blockVecDot (blockVecConj (Matrix.swap ℝ i j) P) + (blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P)) := by + simpa using + (blockVecDot_blockVecConj_of_transpose_eq_self_of_mul_self_eq_one + (R := Matrix.swap ℝ i j) + (X := blockVecConj (Matrix.swap ℝ i j) P) + (Y := blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P)) + (hR := by simp [matTranspose]) + (hR2 := Matrix.swap_mul_self (R := ℝ) i j)) + calc + Mu (openCubeSet (originCube d n)) P (rotateCoeffField (Matrix.swap ℝ i j) a) + = Mu (openCubeSet (originCube d n)) (blockVecConj (Matrix.swap ℝ i j) P) a := hMuP + _ = (1 / 2 : ℝ) * + blockVecDot (blockVecConj (Matrix.swap ℝ i j) P) + (blockMatVecMul Abar (blockVecConj (Matrix.swap ℝ i j) P)) := hmu _ + _ = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (blockMatConj (Matrix.swap ℝ i j) Abar) P) := by + rw [hdot] + +end IsCoarseBlockMatrix + +theorem coarseBlockMatrix_signFlip_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i : Fin d) : + coarseBlockMatrix (openCubeSet (originCube d n)) (rotateCoeffField (signFlipMatrix i) a) = + blockMatConj (signFlipMatrix i) (coarseBlockMatrix (openCubeSet (originCube d n)) a) := by + rcases hex with ⟨Abar, hA⟩ + have hArot := IsCoarseBlockMatrix.signFlip_openCubeSet_originCube (n := n) hA i + calc + coarseBlockMatrix (openCubeSet (originCube d n)) (rotateCoeffField (signFlipMatrix i) a) + = blockMatConj (signFlipMatrix i) Abar := by + symm + exact eq_coarseBlockMatrix_of_isCoarseBlockMatrix hArot + _ = blockMatConj (signFlipMatrix i) (coarseBlockMatrix (openCubeSet (originCube d n)) a) := by + rw [eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA] + +theorem coarseBlockMatrix_swap_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i j : Fin d) : + coarseBlockMatrix (openCubeSet (originCube d n)) (rotateCoeffField (Matrix.swap ℝ i j) a) = + blockMatConj (Matrix.swap ℝ i j) (coarseBlockMatrix (openCubeSet (originCube d n)) a) := by + rcases hex with ⟨Abar, hA⟩ + have hArot := IsCoarseBlockMatrix.swap_openCubeSet_originCube (n := n) hA i j + calc + coarseBlockMatrix (openCubeSet (originCube d n)) (rotateCoeffField (Matrix.swap ℝ i j) a) + = blockMatConj (Matrix.swap ℝ i j) Abar := by + symm + exact eq_coarseBlockMatrix_of_isCoarseBlockMatrix hArot + _ = blockMatConj (Matrix.swap ℝ i j) (coarseBlockMatrix (openCubeSet (originCube d n)) a) := by + rw [eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA] + +theorem coarseBlockMatrix_upperLeft_signFlip_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i : Fin d) : + (coarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a)).upperLeft = + signFlipMatrix i * + (coarseBlockMatrix (openCubeSet (originCube d n)) a).upperLeft * + signFlipMatrix i := by + simpa [blockMatConj] using + congrArg BlockMat.upperLeft + (coarseBlockMatrix_signFlip_openCubeSet_originCube_of_exists (n := n) hex i) + +theorem coarseBlockMatrix_lowerRight_signFlip_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i : Fin d) : + (coarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (signFlipMatrix i) a)).lowerRight = + signFlipMatrix i * + (coarseBlockMatrix (openCubeSet (originCube d n)) a).lowerRight * + signFlipMatrix i := by + simpa [blockMatConj] using + congrArg BlockMat.lowerRight + (coarseBlockMatrix_signFlip_openCubeSet_originCube_of_exists (n := n) hex i) + +theorem coarseBlockMatrix_upperLeft_swap_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i j : Fin d) : + (coarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a)).upperLeft = + Matrix.swap ℝ i j * + (coarseBlockMatrix (openCubeSet (originCube d n)) a).upperLeft * + Matrix.swap ℝ i j := by + simpa [blockMatConj] using + congrArg BlockMat.upperLeft + (coarseBlockMatrix_swap_openCubeSet_originCube_of_exists (n := n) hex i j) + +theorem coarseBlockMatrix_lowerRight_swap_openCubeSet_originCube_of_exists + {d : ℕ} {n : ℤ} {a : CoeffField d} + (hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix (openCubeSet (originCube d n)) a Abar) + (i j : Fin d) : + (coarseBlockMatrix (openCubeSet (originCube d n)) + (rotateCoeffField (Matrix.swap ℝ i j) a)).lowerRight = + Matrix.swap ℝ i j * + (coarseBlockMatrix (openCubeSet (originCube d n)) a).lowerRight * + Matrix.swap ℝ i j := by + simpa [blockMatConj] using + congrArg BlockMat.lowerRight + (coarseBlockMatrix_swap_openCubeSet_originCube_of_exists (n := n) hex i j) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability.lean new file mode 100644 index 0000000000..de52515718 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability.lean @@ -0,0 +1,28 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.CauchySchwarz +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.Integral + +/-! +# Quadratic stability (Lemma 4.1) + +Facade re-exporting the three items of the Lean form of Lemma 4.1 +(`l.quadratic.stability`) of the high-moment paper (Armstrong–Kuusi–Loher, in +preparation): + +* **B′1** `abs_blockVecDot_blockMatVecMul_le_of_isSymmetricBlockMat` + (Cauchy–Schwarz for a symmetric positive semidefinite block form) and +* **B′2** `abs_blockVecDot_sub_le_of_blockMatLoewnerLE` + (the mixed-metric inequality) — see `QuadraticStability/CauchySchwarz.lean`; +* **B′3** `abs_setIntegral_energy_sub_le` + (integral stability of the two quadratic minima, constant `6K`) — see + `QuadraticStability/Integral.lean`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/CauchySchwarz.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/CauchySchwarz.lean new file mode 100644 index 0000000000..c2faf9a073 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/CauchySchwarz.lean @@ -0,0 +1,159 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.QuadraticDiscriminant +public import Mathlib.Analysis.SpecialFunctions.Sqrt +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich + +/-! # Cauchy Schwarz -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Quadratic stability, items B′1 and B′2 + +Pure-algebra half of Lemma 4.1 (`l.quadratic.stability`) of the high-moment +paper (Armstrong–Kuusi–Loher, to appear). This file proves the two +pointwise (matrix-level) inequalities, phrased entirely through +`blockVecDot`/`blockMatVecMul` on `BlockVec d`/`BlockMat d`: + +* **B′1** (`abs_blockVecDot_blockMatVecMul_le_of_isSymmetricBlockMat`): Cauchy– + Schwarz for a symmetric positive semidefinite block form, proved by the + discriminant argument on `t ↦ (X + t•Y)·B(X + t•Y)` — no matrix square roots. +* **B′2** (`abs_blockVecDot_sub_le_of_blockMatLoewnerLE`): the mixed-metric + inequality, from the triangle inequality, B′1 on each of the two forms, and + the two Loewner hypotheses. + +No `EuclideanSpace`. +-/ + +variable {d : ℕ} + +/-! ## B′1 — Cauchy–Schwarz for a positive semidefinite block form -/ + +/-- The `t`-expansion of the quadratic form `(X + t•Y)·B(X + t•Y)` for a +symmetric block matrix `B`. -/ +theorem blockVecDot_blockMatVecMul_add_smul_of_isSymmetricBlockMat + {B : BlockMat d} (hB : IsSymmetricBlockMat B) (X Y : BlockVec d) (t : ℝ) : + blockVecDot (X + t • Y) (blockMatVecMul B (X + t • Y)) = + blockVecDot Y (blockMatVecMul B Y) * (t * t) + + 2 * blockVecDot X (blockMatVecMul B Y) * t + + blockVecDot X (blockMatVecMul B X) := by + have hcomm : blockVecDot Y (blockMatVecMul B X) = blockVecDot X (blockMatVecMul B Y) := + blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hB Y X + simp only [blockMatVecMul_add, blockMatVecMul_smul, blockVecDot_add_left, + blockVecDot_add_right, blockVecDot_smul_left, blockVecDot_smul_right, hcomm] + ring + +/-- **B′1.** Cauchy–Schwarz for a symmetric positive semidefinite block form: +`|X·BY| ≤ √(X·BX) · √(Y·BY)`. Proved by the discriminant of the nonnegative +quadratic `t ↦ (X + t•Y)·B(X + t•Y)`. -/ +theorem abs_blockVecDot_blockMatVecMul_le_of_isSymmetricBlockMat + {B : BlockMat d} (hB : IsSymmetricBlockMat B) + (hpsd : ∀ Z : BlockVec d, 0 ≤ blockVecDot Z (blockMatVecMul B Z)) + (X Y : BlockVec d) : + |blockVecDot X (blockMatVecMul B Y)| ≤ + Real.sqrt (blockVecDot X (blockMatVecMul B X)) * + Real.sqrt (blockVecDot Y (blockMatVecMul B Y)) := by + set a := blockVecDot X (blockMatVecMul B X) with ha + set b := blockVecDot Y (blockMatVecMul B Y) with hb + set c := blockVecDot X (blockMatVecMul B Y) with hc + have ha0 : 0 ≤ a := hpsd X + have hb0 : 0 ≤ b := hpsd Y + -- discriminant of the nonnegative quadratic `b t² + 2c t + a` + have hquad : ∀ t : ℝ, 0 ≤ b * (t * t) + 2 * c * t + a := by + intro t + have := hpsd (X + t • Y) + rwa [blockVecDot_blockMatVecMul_add_smul_of_isSymmetricBlockMat hB X Y t] at this + have hdiscrim : discrim b (2 * c) a ≤ 0 := discrim_le_zero hquad + have hc2 : c ^ 2 ≤ a * b := by + have : (2 * c) ^ 2 - 4 * b * a ≤ 0 := hdiscrim + nlinarith [this] + -- pass to square roots + have hab : Real.sqrt (a * b) = Real.sqrt a * Real.sqrt b := Real.sqrt_mul ha0 b + calc + |c| = Real.sqrt (c ^ 2) := (Real.sqrt_sq_eq_abs c).symm + _ ≤ Real.sqrt (a * b) := Real.sqrt_le_sqrt hc2 + _ = Real.sqrt a * Real.sqrt b := hab + +/-! ## B′2 — the mixed-metric inequality -/ + +/-- Unfold `BlockMatLoewnerLE B̃ (K • B)` to the plain quadratic-form comparison +`X·B̃X ≤ K·(X·BX)`. -/ +theorem blockVecDot_le_smul_of_blockMatLoewnerLE {B C : BlockMat d} {K : ℝ} + (h : BlockMatLoewnerLE B (K • C)) (X : BlockVec d) : + blockVecDot X (blockMatVecMul B X) ≤ K * blockVecDot X (blockMatVecMul C X) := by + have hx := h X + rw [blockMatVecMul_blockSMul, blockVecDot_smul_right] at hx + linarith + +/-- **B′2.** The mixed-metric inequality. For symmetric positive semidefinite +`B`, `B̃` with `1 ≤ K`, `B̃ ≤ K•B` and `B ≤ K•B̃` in the block Loewner order, +`|X·B̃Y − X·BY| ≤ 2·√K·√(X·BX)·√(Y·B̃Y)`. -/ +theorem abs_blockVecDot_sub_le_of_blockMatLoewnerLE + {B Bt : BlockMat d} {K : ℝ} + (hBsymm : IsSymmetricBlockMat B) (hBtsymm : IsSymmetricBlockMat Bt) + (hBpsd : ∀ Z : BlockVec d, 0 ≤ blockVecDot Z (blockMatVecMul B Z)) + (hBtpsd : ∀ Z : BlockVec d, 0 ≤ blockVecDot Z (blockMatVecMul Bt Z)) + (hK : 1 ≤ K) + (hBt_le : BlockMatLoewnerLE Bt (K • B)) (hB_le : BlockMatLoewnerLE B (K • Bt)) + (X Y : BlockVec d) : + |blockVecDot X (blockMatVecMul Bt Y) - blockVecDot X (blockMatVecMul B Y)| ≤ + 2 * Real.sqrt K * Real.sqrt (blockVecDot X (blockMatVecMul B X)) * + Real.sqrt (blockVecDot Y (blockMatVecMul Bt Y)) := by + have hK0 : (0 : ℝ) ≤ K := le_trans zero_le_one hK + set aB := blockVecDot X (blockMatVecMul B X) with haB + set aBt := blockVecDot X (blockMatVecMul Bt X) with haBt + set bB := blockVecDot Y (blockMatVecMul B Y) with hbB + set bBt := blockVecDot Y (blockMatVecMul Bt Y) with hbBt + have haB0 : 0 ≤ aB := hBpsd X + have haBt0 : 0 ≤ aBt := hBtpsd X + have hbB0 : 0 ≤ bB := hBpsd Y + have hbBt0 : 0 ≤ bBt := hBtpsd Y + -- B′1 on each form + have hcsB : |blockVecDot X (blockMatVecMul B Y)| ≤ Real.sqrt aB * Real.sqrt bB := + abs_blockVecDot_blockMatVecMul_le_of_isSymmetricBlockMat hBsymm hBpsd X Y + have hcsBt : |blockVecDot X (blockMatVecMul Bt Y)| ≤ Real.sqrt aBt * Real.sqrt bBt := + abs_blockVecDot_blockMatVecMul_le_of_isSymmetricBlockMat hBtsymm hBtpsd X Y + -- Loewner comparisons on the diagonal forms + have hloBt : aBt ≤ K * aB := blockVecDot_le_smul_of_blockMatLoewnerLE hBt_le X + have hloB : bB ≤ K * bBt := blockVecDot_le_smul_of_blockMatLoewnerLE hB_le Y + -- √aBt ≤ √K·√aB, √bB ≤ √K·√bBt + have hsqrtaBt : Real.sqrt aBt ≤ Real.sqrt K * Real.sqrt aB := by + calc Real.sqrt aBt ≤ Real.sqrt (K * aB) := Real.sqrt_le_sqrt hloBt + _ = Real.sqrt K * Real.sqrt aB := Real.sqrt_mul hK0 aB + have hsqrtbB : Real.sqrt bB ≤ Real.sqrt K * Real.sqrt bBt := by + calc Real.sqrt bB ≤ Real.sqrt (K * bBt) := Real.sqrt_le_sqrt hloB + _ = Real.sqrt K * Real.sqrt bBt := Real.sqrt_mul hK0 bBt + -- nonnegativity of the square roots + have hsaB : 0 ≤ Real.sqrt aB := Real.sqrt_nonneg _ + have hsbBt : 0 ≤ Real.sqrt bBt := Real.sqrt_nonneg _ + have hsK : 0 ≤ Real.sqrt K := Real.sqrt_nonneg _ + -- bound each term by √K·√aB·√bBt + have htermBt : |blockVecDot X (blockMatVecMul Bt Y)| ≤ + Real.sqrt K * Real.sqrt aB * Real.sqrt bBt := by + refine le_trans hcsBt ?_ + have := mul_le_mul_of_nonneg_right hsqrtaBt hsbBt + nlinarith [this] + have htermB : |blockVecDot X (blockMatVecMul B Y)| ≤ + Real.sqrt K * Real.sqrt aB * Real.sqrt bBt := by + refine le_trans hcsB ?_ + have := mul_le_mul_of_nonneg_left hsqrtbB hsaB + nlinarith [this] + -- triangle inequality + calc + |blockVecDot X (blockMatVecMul Bt Y) - blockVecDot X (blockMatVecMul B Y)| + ≤ |blockVecDot X (blockMatVecMul Bt Y)| + |blockVecDot X (blockMatVecMul B Y)| := + abs_sub _ _ + _ ≤ (Real.sqrt K * Real.sqrt aB * Real.sqrt bBt) + + (Real.sqrt K * Real.sqrt aB * Real.sqrt bBt) := add_le_add htermBt htermB + _ = 2 * Real.sqrt K * Real.sqrt aB * Real.sqrt bBt := by ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/Integral.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/Integral.lean new file mode 100644 index 0000000000..37ef9e082e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/QuadraticStability/Integral.lean @@ -0,0 +1,362 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Function.L2Space +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.CauchySchwarz + +/-! # Integral -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Quadratic stability, item B′3 (integral form) + +The integral half of Lemma 4.1 (`l.quadratic.stability`) of the high-moment +paper (Armstrong–Kuusi–Loher, to appear): stability of the two quadratic +minima under an `L∞`-comparable perturbation of the coefficient field supported +on `S`. + +We assume only the two scalar Euler identities at the single test field +`Y := Zt − Z` (no subspace, no minimization, no existence), and derive the +sharpened bound with constant `6K`. + +## Chosen integrability package for `(h4)` + +We assume `IntegrableOn` over `U` of the five real-valued pairing integrands +that actually appear in the proof: + +* `x ↦ Z·BZ`, `x ↦ Z·BtZ`, `x ↦ Y·BtY` (three diagonal energies), and +* `x ↦ Z·BtY`, `x ↦ Z·BY` (the two cross pairings with the test field `Y`). + +This is the minimal explicit list sufficient for every integral split, the +Cauchy–Schwarz step, and the localization; each hypothesis is a concrete +`ℝ`-valued `IntegrableOn`, directly dischargeable by a consumer holding +`L²` minimizers. (The energy `Zt·BtZt` needs no separate hypothesis: it equals +`Z·BtZ + 2 Z·BtY + Y·BtY` a.e. by symmetry.) + +No `EuclideanSpace`. +-/ + +open MeasureTheory +open scoped ENNReal + +variable {d : ℕ} + +/-! ## Two elementary analytic helpers -/ + +/-- Integral Cauchy–Schwarz for two nonnegative integrable functions: +`∫ √f·√g ≤ √(∫f)·√(∫g)`. -/ +theorem integral_sqrt_mul_sqrt_le + {α : Type*} {m : MeasurableSpace α} {μ : Measure α} {f g : α → ℝ} + (hf : Integrable f μ) (hg : Integrable g μ) + (hf0 : 0 ≤ᵐ[μ] f) (hg0 : 0 ≤ᵐ[μ] g) : + ∫ x, Real.sqrt (f x) * Real.sqrt (g x) ∂μ ≤ + Real.sqrt (∫ x, f x ∂μ) * Real.sqrt (∫ x, g x ∂μ) := by + have hsf_meas : AEStronglyMeasurable (fun x => Real.sqrt (f x)) μ := + Real.continuous_sqrt.comp_aestronglyMeasurable hf.1 + have hsg_meas : AEStronglyMeasurable (fun x => Real.sqrt (g x)) μ := + Real.continuous_sqrt.comp_aestronglyMeasurable hg.1 + have hsqf : (fun x => Real.sqrt (f x) ^ 2) =ᵐ[μ] f := by + filter_upwards [hf0] with x hx; rw [Real.sq_sqrt hx] + have hsqg : (fun x => Real.sqrt (g x) ^ 2) =ᵐ[μ] g := by + filter_upwards [hg0] with x hx; rw [Real.sq_sqrt hx] + have hmemf : MemLp (fun x => Real.sqrt (f x)) 2 μ := + (memLp_two_iff_integrable_sq hsf_meas).2 (hf.congr hsqf.symm) + have hmemg : MemLp (fun x => Real.sqrt (g x)) 2 μ := + (memLp_two_iff_integrable_sq hsg_meas).2 (hg.congr hsqg.symm) + have hsf0 : 0 ≤ᵐ[μ] fun x => Real.sqrt (f x) := + Filter.Eventually.of_forall fun x => Real.sqrt_nonneg _ + have hsg0 : 0 ≤ᵐ[μ] fun x => Real.sqrt (g x) := + Filter.Eventually.of_forall fun x => Real.sqrt_nonneg _ + have key := integral_mul_le_Lp_mul_Lq_of_nonneg (μ := μ) Real.HolderConjugate.two_two + hsf0 hsg0 (by simpa using hmemf) (by simpa using hmemg) + have hrf : ∫ x, Real.sqrt (f x) ^ (2 : ℝ) ∂μ = ∫ x, f x ∂μ := + integral_congr_ae (by filter_upwards [hf0] with x hx; rw [Real.rpow_two, Real.sq_sqrt hx]) + have hrg : ∫ x, Real.sqrt (g x) ^ (2 : ℝ) ∂μ = ∫ x, g x ∂μ := + integral_congr_ae (by filter_upwards [hg0] with x hx; rw [Real.rpow_two, Real.sq_sqrt hx]) + rw [hrf, hrg] at key + rw [Real.sqrt_eq_rpow (∫ x, f x ∂μ), Real.sqrt_eq_rpow (∫ x, g x ∂μ)] + convert key using 2 + +/-- AM–GM in the form `√a·√b ≤ (a+b)/2` for nonnegative reals. -/ +theorem sqrt_mul_sqrt_le_half_add {a b : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) : + Real.sqrt a * Real.sqrt b ≤ (a + b) / 2 := by + nlinarith [sq_nonneg (Real.sqrt a - Real.sqrt b), Real.sq_sqrt ha, Real.sq_sqrt hb, + Real.sqrt_nonneg a, Real.sqrt_nonneg b] + +/-- If `0 ≤ G` and `G ≤ C·√G` with `0 ≤ C`, then `G ≤ C²`. -/ +theorem le_sq_of_le_mul_sqrt {G C : ℝ} (hG : 0 ≤ G) (hC : 0 ≤ C) + (h : G ≤ C * Real.sqrt G) : G ≤ C ^ 2 := by + have hsG : Real.sqrt G ≤ C := by + rcases eq_or_lt_of_le (Real.sqrt_nonneg G) with h0 | hpos + · exact h0 ▸ hC + · have hGsq : Real.sqrt G * Real.sqrt G ≤ C * Real.sqrt G := by + rw [Real.mul_self_sqrt hG]; exact h + exact le_of_mul_le_mul_right hGsq hpos + calc G = Real.sqrt G ^ 2 := (Real.sq_sqrt hG).symm + _ ≤ C ^ 2 := by gcongr + +/-! ## Data and hypotheses for B′3 -/ + +/-- **B′3.** Stability of the two quadratic minima under an `L∞`-comparable, +`S`-supported perturbation. Constant `6K`. -/ +theorem abs_setIntegral_energy_sub_le + {U S : Set (Vec d)} {B Bt : Vec d → BlockMat d} {Z Zt : Vec d → BlockVec d} {K : ℝ} + (hU : MeasurableSet U) (hS : MeasurableSet S) (hSU : S ⊆ U) + (hK : 1 ≤ K) + -- (h1)+(h2, a.e. part) bundled: pointwise matrix facts a.e. on `U`. + (hae : ∀ᵐ x ∂(volume.restrict U), + IsSymmetricBlockMat (B x) ∧ IsSymmetricBlockMat (Bt x) ∧ + (∀ W : BlockVec d, 0 ≤ blockVecDot W (blockMatVecMul (B x) W)) ∧ + (∀ W : BlockVec d, 0 ≤ blockVecDot W (blockMatVecMul (Bt x) W)) ∧ + BlockMatLoewnerLE (Bt x) (K • B x) ∧ BlockMatLoewnerLE (B x) (K • Bt x)) + -- (h3) coefficient agreement off `S`. + (hagree : ∀ᵐ x ∂(volume.restrict (U \ S)), B x = Bt x) + -- (h4) integrability package (see module docstring). + (hIntBZZ : IntegrableOn (fun x => blockVecDot (Z x) (blockMatVecMul (B x) (Z x))) U) + (hIntBtZZ : IntegrableOn (fun x => blockVecDot (Z x) (blockMatVecMul (Bt x) (Z x))) U) + (hIntBtYY : IntegrableOn + (fun x => blockVecDot (Zt x - Z x) (blockMatVecMul (Bt x) (Zt x - Z x))) U) + (hIntBtZY : IntegrableOn + (fun x => blockVecDot (Z x) (blockMatVecMul (Bt x) (Zt x - Z x))) U) + (hIntBZY : IntegrableOn + (fun x => blockVecDot (Z x) (blockMatVecMul (B x) (Zt x - Z x))) U) + -- (h5) the two scalar Euler identities at the single test field `Y`. + (hEulerB : ∫ x in U, blockVecDot (Zt x - Z x) (blockMatVecMul (B x) (Z x)) = 0) + (hEulerBt : ∫ x in U, blockVecDot (Zt x - Z x) (blockMatVecMul (Bt x) (Zt x)) = 0) : + |(∫ x in U, blockVecDot (Zt x) (blockMatVecMul (Bt x) (Zt x))) - + (∫ x in U, blockVecDot (Z x) (blockMatVecMul (B x) (Z x)))| ≤ + 6 * K * ∫ x in S, blockVecDot (Z x) (blockMatVecMul (B x) (Z x)) := by + classical + have hK0 : (0 : ℝ) ≤ K := le_trans zero_le_one hK + set Y : Vec d → BlockVec d := fun x => Zt x - Z x with hY + -- integrand abbreviations + set eB : Vec d → ℝ := fun x => blockVecDot (Z x) (blockMatVecMul (B x) (Z x)) with heB + set eBtZ : Vec d → ℝ := fun x => blockVecDot (Z x) (blockMatVecMul (Bt x) (Z x)) with heBtZ + set eBtY : Vec d → ℝ := fun x => blockVecDot (Y x) (blockMatVecMul (Bt x) (Y x)) with heBtY + set pBtZY : Vec d → ℝ := fun x => blockVecDot (Z x) (blockMatVecMul (Bt x) (Y x)) with hpBtZY + set pBZY : Vec d → ℝ := fun x => blockVecDot (Z x) (blockMatVecMul (B x) (Y x)) with hpBZY + set eBtZt : Vec d → ℝ := fun x => blockVecDot (Zt x) (blockMatVecMul (Bt x) (Zt x)) with heBtZt + -- rename integrability hypotheses to the abbreviations + have hIA : IntegrableOn eB U := hIntBZZ + have hIC : IntegrableOn eBtZ U := hIntBtZZ + have hID : IntegrableOn eBtY U := hIntBtYY + have hIE : IntegrableOn pBtZY U := hIntBtZY + have hIF : IntegrableOn pBZY U := hIntBZY + -- abbreviations for the energy integrals + set G : ℝ := ∫ x in U, eBtY x with hG + set ES : ℝ := ∫ x in S, eB x with hES + set Etot : ℝ := ∫ x in U, eB x with hEtot + set Ettot : ℝ := ∫ x in U, eBtZt x with hEttot + -- a.e. facts restricted to `S` + have haeS : ∀ᵐ x ∂(volume.restrict S), _ := + hae.filter_mono (ae_mono (Measure.restrict_mono hSU le_rfl)) + -- `Zt x = Z x + Y x` + have hZt : ∀ x, Zt x = Z x + Y x := by intro x; simp only [hY]; abel + ------------------------------------------------------------------ + -- Nonnegativity of the two `S`-energies and of `G`. + ------------------------------------------------------------------ + have heB0U : 0 ≤ᵐ[volume.restrict U] eB := by + filter_upwards [hae] with x hx using hx.2.2.1 (Z x) + have heB0S : 0 ≤ᵐ[volume.restrict S] eB := by + filter_upwards [haeS] with x hx using hx.2.2.1 (Z x) + have heBtY0U : 0 ≤ᵐ[volume.restrict U] eBtY := by + filter_upwards [hae] with x hx using hx.2.2.2.1 (Y x) + have hES0 : 0 ≤ ES := setIntegral_nonneg_of_ae_restrict heB0S + have hG0 : 0 ≤ G := setIntegral_nonneg_of_ae_restrict heBtY0U + ------------------------------------------------------------------ + -- Euler-derived integral identities. + ------------------------------------------------------------------ + -- `∫_U Z·BY = 0` (first Euler + a.e. symmetry of `B`). + have hpBZY0 : (∫ x in U, pBZY x) = 0 := by + have hsym : pBZY =ᵐ[volume.restrict U] + fun x => blockVecDot (Y x) (blockMatVecMul (B x) (Z x)) := by + filter_upwards [hae] with x hx + exact blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hx.1 (Z x) (Y x) + rw [integral_congr_ae hsym]; exact hEulerB + -- `∫_U Z·BtY = -G` (second Euler + a.e. symmetry of `Bt`). + have hpBtZY_eq : (∫ x in U, pBtZY x) = -G := by + have hsplit : (fun x => blockVecDot (Y x) (blockMatVecMul (Bt x) (Zt x))) + =ᵐ[volume.restrict U] fun x => pBtZY x + eBtY x := by + filter_upwards [hae] with x hx + have hcomm : blockVecDot (Y x) (blockMatVecMul (Bt x) (Z x)) = + blockVecDot (Z x) (blockMatVecMul (Bt x) (Y x)) := + blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hx.2.1 (Y x) (Z x) + simp only [hpBtZY, heBtY, hZt x, blockMatVecMul_add, blockVecDot_add_right, hcomm] + have := hEulerBt + rw [integral_congr_ae hsplit, integral_add hIE hID] at this + linarith [this] + ------------------------------------------------------------------ + -- Step (ii): `G ≤ 4K·ES`. + ------------------------------------------------------------------ + -- defect field `δ1 = Z·(Bt−B)Y`, vanishing a.e. off `S`. + set δ1 : Vec d → ℝ := fun x => pBtZY x - pBZY x with hδ1 + have hID1 : IntegrableOn δ1 U := hIE.sub hIF + have hδ1_off : ∀ᵐ x ∂volume, x ∈ U \ S → δ1 x = 0 := by + rw [← ae_restrict_iff' (hU.diff hS)] + filter_upwards [hagree] with x hx + simp only [hδ1, hpBtZY, hpBZY, hx, sub_self] + -- `∫_U δ1 = -G` + have hδ1U : (∫ x in U, δ1 x) = -G := by + rw [show (fun x => δ1 x) = fun x => pBtZY x - pBZY x from rfl, + integral_sub hIE hIF, hpBtZY_eq, hpBZY0]; ring + -- localize to `S` + have hδ1S : (∫ x in S, δ1 x) = -G := by + rw [← setIntegral_eq_of_subset_of_ae_sdiff_eq_zero hU.nullMeasurableSet hSU hδ1_off]; exact hδ1U + -- pointwise bound on `S`: `|δ1| ≤ 2√K·√eB·√eBtY` + set h1 : Vec d → ℝ := fun x => 2 * Real.sqrt K * Real.sqrt (eB x) * Real.sqrt (eBtY x) with hh1 + have hbound1 : ∀ᵐ x ∂(volume.restrict S), |δ1 x| ≤ h1 x := by + filter_upwards [haeS] with x hx + have hb2 := abs_blockVecDot_sub_le_of_blockMatLoewnerLE + hx.1 hx.2.1 hx.2.2.1 hx.2.2.2.1 hK hx.2.2.2.2.1 hx.2.2.2.2.2 (Z x) (Y x) + simpa only [hδ1, hpBtZY, hpBZY, heB, heBtY, hh1, mul_assoc] using hb2 + -- `h1` is integrable on `S` (dominated by `√K·(eB+eBtY)`) + have hIA_S : IntegrableOn eB S := hIA.mono_set hSU + have hIC_S : IntegrableOn eBtZ S := hIC.mono_set hSU + have hID_S : IntegrableOn eBtY S := hID.mono_set hSU + have hID1_S : IntegrableOn δ1 S := hID1.mono_set hSU + have hh1_meas : AEStronglyMeasurable h1 (volume.restrict S) := by + apply AEStronglyMeasurable.mul + apply AEStronglyMeasurable.mul + · exact aestronglyMeasurable_const + · exact Real.continuous_sqrt.comp_aestronglyMeasurable hIA_S.1 + · exact Real.continuous_sqrt.comp_aestronglyMeasurable hID_S.1 + have hIh1_S : IntegrableOn h1 S := by + refine Integrable.mono' (g := fun x => Real.sqrt K * (eB x + eBtY x)) + ((hIA_S.add hID_S).const_mul (Real.sqrt K)) hh1_meas ?_ + filter_upwards [heB0S, (ae_mono (Measure.restrict_mono hSU le_rfl) heBtY0U)] + with x hxB hxD + have hle := sqrt_mul_sqrt_le_half_add hxB hxD + rw [Real.norm_eq_abs, abs_of_nonneg (by positivity)] + have hK' : (0 : ℝ) ≤ Real.sqrt K := Real.sqrt_nonneg _ + nlinarith [hle, hK', mul_le_mul_of_nonneg_left hle (by positivity : (0:ℝ) ≤ 2 * Real.sqrt K)] + -- integrate the pointwise bound and apply Cauchy–Schwarz + have hStep : G ≤ 2 * Real.sqrt K * Real.sqrt ES * Real.sqrt G := by + have habs : G = |∫ x in S, δ1 x| := by rw [hδ1S, abs_neg, abs_of_nonneg hG0] + have hle1 : |∫ x in S, δ1 x| ≤ ∫ x in S, |δ1 x| := by + simpa [Real.norm_eq_abs] using norm_integral_le_integral_norm (μ := volume.restrict S) δ1 + have hle2 : (∫ x in S, |δ1 x|) ≤ ∫ x in S, h1 x := + setIntegral_mono_ae_restrict hID1_S.abs hIh1_S hbound1 + -- `∫_S h1 = 2√K · ∫_S √eB·√eBtY` + have hh1_int : (∫ x in S, h1 x) = + 2 * Real.sqrt K * ∫ x in S, Real.sqrt (eB x) * Real.sqrt (eBtY x) := by + rw [← integral_const_mul] + refine integral_congr_ae (Filter.Eventually.of_forall fun x => ?_) + simp only [hh1]; ring + have hcs : (∫ x in S, Real.sqrt (eB x) * Real.sqrt (eBtY x)) ≤ + Real.sqrt ES * Real.sqrt (∫ x in S, eBtY x) := by + rw [hES] + exact integral_sqrt_mul_sqrt_le hIA_S hID_S heB0S + (ae_mono (Measure.restrict_mono hSU le_rfl) heBtY0U) + -- monotonicity: `∫_S eBtY ≤ G` + have hmono : (∫ x in S, eBtY x) ≤ G := by + rw [hG]; exact setIntegral_mono_set hID heBtY0U (LE.le.eventuallyLE hSU) + have hsqrtES : (0 : ℝ) ≤ Real.sqrt ES := Real.sqrt_nonneg _ + have hmono' : Real.sqrt (∫ x in S, eBtY x) ≤ Real.sqrt G := Real.sqrt_le_sqrt hmono + calc G = |∫ x in S, δ1 x| := habs + _ ≤ ∫ x in S, |δ1 x| := hle1 + _ ≤ ∫ x in S, h1 x := hle2 + _ = 2 * Real.sqrt K * ∫ x in S, Real.sqrt (eB x) * Real.sqrt (eBtY x) := hh1_int + _ ≤ 2 * Real.sqrt K * (Real.sqrt ES * Real.sqrt (∫ x in S, eBtY x)) := + mul_le_mul_of_nonneg_left hcs (by positivity) + _ ≤ 2 * Real.sqrt K * (Real.sqrt ES * Real.sqrt G) := by gcongr + _ = 2 * Real.sqrt K * Real.sqrt ES * Real.sqrt G := by ring + have hG4 : G ≤ 4 * K * ES := by + have := le_sq_of_le_mul_sqrt hG0 (by positivity) hStep + have hsq : (2 * Real.sqrt K * Real.sqrt ES) ^ 2 = 4 * K * ES := by + have hKe : Real.sqrt K ^ 2 = K := Real.sq_sqrt hK0 + have hEe : Real.sqrt ES ^ 2 = ES := Real.sq_sqrt hES0 + nlinarith [hKe, hEe] + rwa [hsq] at this + ------------------------------------------------------------------ + -- Step (iii): the exact identity `Ettot − Etot = ∫_S δ2 − G`. + ------------------------------------------------------------------ + set δ2 : Vec d → ℝ := fun x => eBtZ x - eB x with hδ2 + have hID2 : IntegrableOn δ2 U := hIC.sub hIA + have hID2_S : IntegrableOn δ2 S := hID2.mono_set hSU + have hδ2_off : ∀ᵐ x ∂volume, x ∈ U \ S → δ2 x = 0 := by + rw [← ae_restrict_iff' (hU.diff hS)] + filter_upwards [hagree] with x hx + simp only [hδ2, heBtZ, heB, hx, sub_self] + -- `Ettot = ∫_U eBtZ − G` + have hEttot_eq : Ettot = (∫ x in U, eBtZ x) - G := by + have hexp : eBtZt =ᵐ[volume.restrict U] fun x => eBtZ x + 2 * pBtZY x + eBtY x := by + filter_upwards [hae] with x hx + have hcomm : blockVecDot (Y x) (blockMatVecMul (Bt x) (Z x)) = + blockVecDot (Z x) (blockMatVecMul (Bt x) (Y x)) := + blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hx.2.1 (Y x) (Z x) + simp only [heBtZt, heBtZ, hpBtZY, heBtY, hZt x, blockMatVecMul_add, + blockVecDot_add_left, blockVecDot_add_right, hcomm] + ring + have hstep1 : (∫ x in U, eBtZt x) = + (∫ x in U, (eBtZ x + 2 * pBtZY x)) + ∫ x in U, eBtY x := by + rw [integral_congr_ae hexp] + exact integral_add (hIC.add (hIE.const_mul 2)) hID + have hstep2 : (∫ x in U, (eBtZ x + 2 * pBtZY x)) = + (∫ x in U, eBtZ x) + 2 * ∫ x in U, pBtZY x := by + rw [integral_add hIC (hIE.const_mul 2), integral_const_mul] + rw [hEttot, hstep1, hstep2, hpBtZY_eq]; ring + -- `Ettot − Etot = ∫_S δ2 − G` + have hIdentity : Ettot - Etot = (∫ x in S, δ2 x) - G := by + have hδ2U : (∫ x in U, δ2 x) = (∫ x in U, eBtZ x) - Etot := by + rw [hEtot]; exact integral_sub hIC hIA + have hδ2S : (∫ x in S, δ2 x) = (∫ x in U, δ2 x) := + (setIntegral_eq_of_subset_of_ae_sdiff_eq_zero hU.nullMeasurableSet hSU hδ2_off).symm + rw [hEttot_eq, hδ2S, hδ2U]; ring + ------------------------------------------------------------------ + -- Step (iv): `|∫_S δ2| ≤ 2K·ES`. + ------------------------------------------------------------------ + have hbound2 : ∀ᵐ x ∂(volume.restrict S), |δ2 x| ≤ 2 * K * eB x := by + filter_upwards [haeS] with x hx + have hb2 := abs_blockVecDot_sub_le_of_blockMatLoewnerLE + hx.1 hx.2.1 hx.2.2.1 hx.2.2.2.1 hK hx.2.2.2.2.1 hx.2.2.2.2.2 (Z x) (Z x) + -- `eBtZ x ≤ K·eB x` + have hloew : eBtZ x ≤ K * eB x := + blockVecDot_le_smul_of_blockMatLoewnerLE hx.2.2.2.2.1 (Z x) + have heBx : 0 ≤ eB x := hx.2.2.1 (Z x) + -- turn the B′2 sqrt-bound into `2K·eB` + have hsqrtle : Real.sqrt (eBtZ x) ≤ Real.sqrt K * Real.sqrt (eB x) := by + calc Real.sqrt (eBtZ x) ≤ Real.sqrt (K * eB x) := Real.sqrt_le_sqrt hloew + _ = Real.sqrt K * Real.sqrt (eB x) := Real.sqrt_mul hK0 _ + have hchain : 2 * Real.sqrt K * Real.sqrt (eB x) * Real.sqrt (eBtZ x) ≤ 2 * K * eB x := by + have hKe : Real.sqrt K * Real.sqrt K = K := Real.mul_self_sqrt hK0 + have hEe : Real.sqrt (eB x) * Real.sqrt (eB x) = eB x := Real.mul_self_sqrt heBx + have hMnn : (0 : ℝ) ≤ 2 * Real.sqrt K * Real.sqrt (eB x) := by positivity + calc 2 * Real.sqrt K * Real.sqrt (eB x) * Real.sqrt (eBtZ x) + ≤ 2 * Real.sqrt K * Real.sqrt (eB x) * (Real.sqrt K * Real.sqrt (eB x)) := + mul_le_mul_of_nonneg_left hsqrtle hMnn + _ = 2 * (Real.sqrt K * Real.sqrt K) * (Real.sqrt (eB x) * Real.sqrt (eB x)) := by ring + _ = 2 * K * eB x := by rw [hKe, hEe] + calc |δ2 x| = |blockVecDot (Z x) (blockMatVecMul (Bt x) (Z x)) - + blockVecDot (Z x) (blockMatVecMul (B x) (Z x))| := by rw [hδ2, heBtZ, heB] + _ ≤ 2 * Real.sqrt K * Real.sqrt (eB x) * Real.sqrt (eBtZ x) := by + simpa only [heB, heBtZ, mul_assoc] using hb2 + _ ≤ 2 * K * eB x := hchain + have hδ2_bound : |∫ x in S, δ2 x| ≤ 2 * K * ES := by + have hle1 : |∫ x in S, δ2 x| ≤ ∫ x in S, |δ2 x| := by + simpa [Real.norm_eq_abs] using norm_integral_le_integral_norm (μ := volume.restrict S) δ2 + have hle2 : (∫ x in S, |δ2 x|) ≤ ∫ x in S, 2 * K * eB x := + setIntegral_mono_ae_restrict hID2_S.abs (hIA_S.const_mul _) hbound2 + have hrw : (∫ x in S, 2 * K * eB x) = 2 * K * ES := by + rw [hES]; exact integral_const_mul _ _ + linarith [hle1, hle2, hrw.le, hrw.ge] + ------------------------------------------------------------------ + -- Step (v): combine. `|Ettot − Etot| ≤ 2K·ES + 4K·ES = 6K·ES`. + ------------------------------------------------------------------ + have hfinal : |Ettot - Etot| ≤ 6 * K * ES := by + rw [hIdentity] + calc |(∫ x in S, δ2 x) - G| ≤ |∫ x in S, δ2 x| + |G| := abs_sub _ _ + _ = |∫ x in S, δ2 x| + G := by rw [abs_of_nonneg hG0] + _ ≤ 2 * K * ES + 4 * K * ES := add_le_add hδ2_bound hG4 + _ = 6 * K * ES := by ring + simpa only [hEttot, hEtot, hES] using hfinal + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities.lean new file mode 100644 index 0000000000..c6c3f19097 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.ConvexAverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Homogeneity + +/-! # Response Identities -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas.lean new file mode 100644 index 0000000000..941f4add11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.BasicVariation +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalBasic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalFormulas + +/-! +# ResponseIdentities average formulas (aggregate re-export) + +Previously a 1758-line monolithic module; now split along thematic +boundaries into the four files imported above. Shim for backward +compatibility. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/BasicVariation.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/BasicVariation.lean new file mode 100644 index 0000000000..4da4d82dc2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/BasicVariation.lean @@ -0,0 +1,472 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations + +/-! # Basic Variation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Average formulas (part 1) -- basic variation and pairing identities + +basic_cg_identities_linear_response (sq and linear form), average-pairing +and polarization identities, and the average-gradient / average-flux +coordinate / vector identities for IsResponseMaximizer data. +-/ + +theorem basic_cg_identities_linear_response_sq_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (w : AHarmonicFunction a U) : + (volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * (2 * ResponseJ U p q a) := by + let cross : ℝ := + volumeAverage U + (fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) + let energyW : ℝ := volumeAverage U (scalarVariationEnergyIntegrand a w) + let energyU : ℝ := volumeAverage U (scalarVariationEnergyIntegrand a u) + have hfirst : + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + cross := by + unfold cross + exact basic_cg_identities_first_variation_eq_of_isResponseMaximizer + U a p q hInt u hmax w + have henergyW_nonneg : + 0 ≤ energyW := by + unfold energyW + exact volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + U a hEll w + have hquad : + ∀ t : ℝ, 0 ≤ energyU - 2 * t * cross + t ^ 2 * energyW := by + intro t + let udiff := + AHarmonicFunction.subOfIntegrable u (t • w) (hInt.weakFlux u) (hInt.weakFlux (t • w)) + have hnonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a udiff) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + U a hEll udiff + have hsplit := + volumeAverage_scalarVariationEnergyIntegrand_subOfIntegrable U a hInt u (t • w) + have hsmul_energy : + volumeAverage U (scalarVariationEnergyIntegrand a (t • w)) = t ^ 2 * energyW := by + unfold energyW + simpa using volumeAverage_scalarVariationEnergyIntegrand_smul U a t w + have hsmul_cross : + volumeAverage U + (fun x => vecDot ((t • w).toH1.grad x) + (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + t * cross := by + unfold cross + have hfun : + (fun x => vecDot ((t • w).toH1.grad x) + (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + t • fun x => vecDot (w.toH1.grad x) + (matVecMul (symmPart (a x)) (u.toH1.grad x)) := by + funext x + change + vecDot (t • w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) = + t * vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) + rw [vecDot_smul_left] + rw [hfun, volumeAverage_smul] + have hnonneg' : 0 ≤ energyU + t ^ 2 * energyW - 2 * (t * cross) := by + unfold energyU energyW cross + linarith [hnonneg, hsplit, hsmul_energy, hsmul_cross] + nlinarith [hnonneg'] + have hcross_sq : + cross ^ 2 ≤ energyU * energyW := by + exact sq_le_mul_of_quadratic_nonneg henergyW_nonneg hquad + have hu_energy : + ResponseJ U p q a = (1 / 2 : ℝ) * energyU := by + unfold energyU + exact responseJ_energy_of_isResponseMaximizer + U a p q u hmax + (hInt.weakFlux u) (hInt.response p q u) (hInt.firstVariation p q u u) (hInt.energy u) + rw [hfirst] + nlinarith + +theorem basic_cg_identities_linear_response_sq_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (w : AHarmonicFunction a U) : + (volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * (2 * ResponseJ U p q a) := + basic_cg_identities_linear_response_sq_of_isResponseMaximizer + U a hEll p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax w + +theorem basic_cg_identities_linear_response_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (w : AHarmonicFunction a U) : + |volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * ResponseJ U p q a) := by + have hsq := basic_cg_identities_linear_response_sq_of_isResponseMaximizer + U a hEll p q hInt u hmax w + have henergy_nonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a w) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + U a hEll w + have hresp_nonneg : 0 ≤ 2 * ResponseJ U p q a := by + nlinarith [responseJ_nonneg U p q a] + have hroot := + Real.abs_le_sqrt hsq + rw [Real.sqrt_mul henergy_nonneg] at hroot + simpa [mul_assoc, mul_left_comm, mul_comm] using hroot + +theorem basic_cg_identities_linear_response_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (w : AHarmonicFunction a U) : + |volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * ResponseJ U p q a) := + basic_cg_identities_linear_response_of_isResponseMaximizer + U a hEll p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax w + +theorem basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) (w : AHarmonicFunction a U) : + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + vecDot q (fun i => volumeAverage U (fun x => w.toH1.grad x i)) - + vecDot p (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) := by + have hgrad : + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) = + vecDot q (fun i => volumeAverage U (fun x => w.toH1.grad x i)) := by + calc + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) + = volumeAverage U (fun x => ∑ i, q i * w.toH1.grad x i) := by + simp [vecDot] + _ = ∑ i, volumeAverage U (fun x => q i * w.toH1.grad x i) := by + rw [volumeAverage_sum (U := U) (s := Finset.univ) + (f := fun i x => q i * w.toH1.grad x i)] + intro i hi + have hsingle : + (fun x => q i * w.toH1.grad x i) = + fun x => vecDot (Pi.single i (q i)) (w.toH1.grad x) := by + funext x + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j hj hji + simp [Pi.single_eq_of_ne hji] + · simp + rw [hsingle] + exact hInt.grad (Pi.single i (q i)) w + _ = ∑ i, q i * volumeAverage U (fun x => w.toH1.grad x i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + simpa using! (volumeAverage_smul U (q i) (fun x => w.toH1.grad x i)) + _ = vecDot q (fun i => volumeAverage U (fun x => w.toH1.grad x i)) := by + simp [vecDot] + have hflux : + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + vecDot p (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) := by + calc + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + volumeAverage U (fun x => ∑ i, p i * matVecMul (a x) (w.toH1.grad x) i) := by + simp [vecDot] + _ = ∑ i, volumeAverage U (fun x => p i * matVecMul (a x) (w.toH1.grad x) i) := by + rw [volumeAverage_sum (U := U) (s := Finset.univ) + (f := fun i x => p i * matVecMul (a x) (w.toH1.grad x) i)] + intro i hi + have hsingle : + (fun x => p i * matVecMul (a x) (w.toH1.grad x) i) = + fun x => vecDot (Pi.single i (p i)) (matVecMul (a x) (w.toH1.grad x)) := by + funext x + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j hj hji + simp [Pi.single_eq_of_ne hji] + · simp + rw [hsingle] + exact hInt.flux (Pi.single i (p i)) w + _ = ∑ i, p i * volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + simpa using! + (volumeAverage_smul U (p i) (fun x => matVecMul (a x) (w.toH1.grad x) i)) + _ = vecDot p (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) := by + simp [vecDot] + rw [hgrad, hflux] + +theorem + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux_of_isEllipticFieldOn + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (w : AHarmonicFunction a U) : + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + vecDot q (fun i => volumeAverage U (fun x => w.toH1.grad x i)) - + vecDot p (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + U a p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w + +theorem basic_cg_identities_polarization_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q p' q' : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u u' : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hmax' : IsResponseMaximizer U p' q' a u') : + volumeAverage U + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := by + let udiff := AHarmonicFunction.subOfIntegrable u u' (hInt.weakFlux u) (hInt.weakFlux u') + have hmax_diff := + basic_cg_identities_sub_isResponseMaximizer_of_isResponseMaximizer + U a p q p' q' hInt u u' hmax hmax' + have hu_energy := + responseJ_energy_of_isResponseMaximizer U a p q u hmax + (hInt.weakFlux u) (hInt.response p q u) (hInt.firstVariation p q u u) (hInt.energy u) + have hu'_energy := + responseJ_energy_of_isResponseMaximizer U a p' q' u' hmax' + (hInt.weakFlux u') (hInt.response p' q' u') (hInt.firstVariation p' q' u' u') + (hInt.energy u') + have hdiff_energy := + responseJ_energy_of_isResponseMaximizer U a (p - p') (q - q') udiff hmax_diff + (hInt.weakFlux udiff) (hInt.response (p - p') (q - q') udiff) + (hInt.firstVariation (p - p') (q - q') udiff udiff) (hInt.energy udiff) + have hsplit := volumeAverage_scalarVariationEnergyIntegrand_subOfIntegrable U a hInt u u' + linarith [hu_energy, hu'_energy, hdiff_energy, hsplit] + +theorem basic_cg_identities_polarization_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q p' q' : Vec d) + (u u' : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hmax' : IsResponseMaximizer U p' q' a u') : + volumeAverage U + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := + basic_cg_identities_polarization_of_isResponseMaximizer + U a p q p' q' (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u u' hmax hmax' + +theorem basic_cg_identities_average_pairing_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q p' q' : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u u' : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hmax' : IsResponseMaximizer U p' q' a u') : + volumeAverage U (fun x => vecDot q' (u.toH1.grad x)) - + volumeAverage U (fun x => vecDot p' (matVecMul (a x) (u.toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := by + have hfirst := + basic_cg_identities_first_variation_eq_of_isResponseMaximizer + U a p' q' hInt u' hmax' u + have hsymm : + volumeAverage U + (fun x => vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u'.toH1.grad x))) = + volumeAverage U + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + refine congrArg (volumeAverage U) ?_ + funext x + exact vecDot_matVecMul_symmPart_comm (a x) (u.toH1.grad x) (u'.toH1.grad x) + calc + volumeAverage U (fun x => vecDot q' (u.toH1.grad x)) - + volumeAverage U (fun x => vecDot p' (matVecMul (a x) (u.toH1.grad x))) = + volumeAverage U + (fun x => vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u'.toH1.grad x))) := hfirst + _ = volumeAverage U + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := hsymm + _ = ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := + basic_cg_identities_polarization_of_isResponseMaximizer + U a p q p' q' hInt u u' hmax hmax' + +theorem basic_cg_identities_average_pairing_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q p' q' : Vec d) + (u u' : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hmax' : IsResponseMaximizer U p' q' a u') : + volumeAverage U (fun x => vecDot q' (u.toH1.grad x)) - + volumeAverage U (fun x => vecDot p' (matVecMul (a x) (u.toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := + basic_cg_identities_average_pairing_of_isResponseMaximizer + U a p q p' q' (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u u' hmax hmax' + +theorem basic_cg_identities_average_gradient_coordinate_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (i : Fin d) (u' : AHarmonicFunction a U) + (hmax' : IsResponseMaximizer U 0 (Pi.single i 1) a u') : + volumeAverage U (fun x => u.toH1.grad x i) = + ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + have hpair : + volumeAverage U (fun x => u.toH1.grad x i) - + volumeAverage U (fun x => (0 : ℝ)) = + ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + simpa [vecDot_single_left, vecDot_zero_left, sub_eq_add_neg] using + basic_cg_identities_average_pairing_of_isResponseMaximizer + U a p q 0 (Pi.single i 1) hInt u u' hmax hmax' + have hzero : volumeAverage U (fun x => (0 : ℝ)) = 0 := by + unfold volumeAverage + simp + simpa [hzero, sub_eq_add_neg] using hpair + +theorem basic_cg_identities_average_gradient_coordinate_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (i : Fin d) (u' : AHarmonicFunction a U) + (hmax' : IsResponseMaximizer U 0 (Pi.single i 1) a u') : + volumeAverage U (fun x => u.toH1.grad x i) = + ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := + basic_cg_identities_average_gradient_coordinate_of_isResponseMaximizer + U a p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax i u' hmax' + +theorem basic_cg_identities_average_flux_coordinate_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (i : Fin d) (u' : AHarmonicFunction a U) + (hmax' : IsResponseMaximizer U (Pi.single i 1) 0 a u') : + volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i) = + ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := by + have hpair := + basic_cg_identities_average_pairing_of_isResponseMaximizer + U a p q (Pi.single i 1) 0 hInt u u' hmax hmax' + have hpair' : + volumeAverage U (fun x => (0 : ℝ)) - + volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i) = + ResponseJ U p q a + ResponseJ U (Pi.single i 1) 0 a - + ResponseJ U (p - Pi.single i 1) q a := by + simpa [vecDot_single_left, vecDot_zero_left, sub_eq_add_neg] using hpair + have hzero : volumeAverage U (fun x => (0 : ℝ)) = 0 := by + unfold volumeAverage + simp + have hpair'' : + -volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i) = + ResponseJ U p q a + ResponseJ U (Pi.single i 1) 0 a - + ResponseJ U (p - Pi.single i 1) q a := by + simpa [hzero, sub_eq_add_neg] using hpair' + linarith + +theorem basic_cg_identities_average_flux_coordinate_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (i : Fin d) (u' : AHarmonicFunction a U) + (hmax' : IsResponseMaximizer U (Pi.single i 1) 0 a u') : + volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i) = + ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := + basic_cg_identities_average_flux_coordinate_of_isResponseMaximizer + U a p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax i u' hmax' + +theorem basic_cg_identities_average_gradient_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + funext i + exact basic_cg_identities_average_gradient_coordinate_of_isResponseMaximizer + U a p q hInt u hmax i (uGrad i) (hmaxGrad i) + +theorem basic_cg_identities_average_gradient_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := + basic_cg_identities_average_gradient_of_isResponseMaximizer + U a p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax uGrad hmaxGrad + +theorem basic_cg_identities_average_flux_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := by + funext i + exact basic_cg_identities_average_flux_coordinate_of_isResponseMaximizer + U a p q hInt u hmax i (uFlux i) (hmaxFlux i) + +theorem basic_cg_identities_average_flux_of_isResponseMaximizer_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := + basic_cg_identities_average_flux_of_isResponseMaximizer + U a p q (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + u hmax uFlux hmaxFlux + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalBasic.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalBasic.lean new file mode 100644 index 0000000000..1735c17a9a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalBasic.lean @@ -0,0 +1,296 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas + +/-! # Canonical Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Average formulas (part 3) -- ScalarCanonicalMaximizer basic API + +ScalarCanonicalMaximizer namespace: responseJ_eq, first/second variation, +energy, linear response, polarization, averagePairing, together with the +GradientBasisData and FluxBasisData structures and their nonempty +constructors. +-/ + +namespace ScalarCanonicalMaximizer + +theorem responseJ_eq {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) : + ResponseJ U p q a = volumeAverage U (scalarResponseIntegrand U a p q (v : AHarmonicFunction a U)) := by + exact responseJ_eq_of_isResponseMaximizer U p q a v.isResponseMaximizer + +theorem firstVariation {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a (v : AHarmonicFunction a U)) + (hw_int : weakFluxIntegrable U a w) + (hresp_v : MeasureTheory.IntegrableOn + (scalarResponseIntegrand U a p q (v : AHarmonicFunction a U)) U) + (hlin : MeasureTheory.IntegrableOn + (scalarFirstVariationIntegrand U a p q (v : AHarmonicFunction a U) w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarFirstVariationIntegrand U a p q (v : AHarmonicFunction a U) w) = 0 := by + exact responseJ_first_variation_of_isResponseMaximizer + U a p q (v : AHarmonicFunction a U) v.isResponseMaximizer w + hu_int hw_int hresp_v hlin henergy + +theorem secondVariationLine {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a (v : AHarmonicFunction a U)) + (hw_int : weakFluxIntegrable U a w) + (hresp_v : MeasureTheory.IntegrableOn + (scalarResponseIntegrand U a p q (v : AHarmonicFunction a U)) U) + (hlin : MeasureTheory.IntegrableOn + (scalarFirstVariationIntegrand U a p q (v : AHarmonicFunction a U) w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U + (scalarResponseIntegrand U a p q + (scalarPerturbation (v : AHarmonicFunction a U) w t hu_int hw_int)) = + ResponseJ U p q a - ((t ^ 2) / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + exact responseJ_second_variation_line_of_isResponseMaximizer + U a p q (v : AHarmonicFunction a U) v.isResponseMaximizer w t + hu_int hw_int hresp_v hlin henergy + +theorem secondVariation {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a (v : AHarmonicFunction a U)) + (hw_int : weakFluxIntegrable U a w) + (hresp_v : MeasureTheory.IntegrableOn + (scalarResponseIntegrand U a p q (v : AHarmonicFunction a U)) U) + (hlin : MeasureTheory.IntegrableOn + (scalarFirstVariationIntegrand U a p q (v : AHarmonicFunction a U) w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U + (scalarResponseIntegrand U a p q + (scalarPerturbation (v : AHarmonicFunction a U) w 1 hu_int hw_int)) = + ResponseJ U p q a - (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + exact responseJ_second_variation_of_isResponseMaximizer + U a p q (v : AHarmonicFunction a U) v.isResponseMaximizer w + hu_int hw_int hresp_v hlin henergy + +theorem energy {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) + (hu_int : ∀ φ : H10Function U, + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x)) + (φ.toH1Function.grad x)) U) + (hresp_v : MeasureTheory.IntegrableOn + (scalarResponseIntegrand U a p q (v : AHarmonicFunction a U)) U) + (hlin_self : MeasureTheory.IntegrableOn + (scalarFirstVariationIntegrand U a p q + (v : AHarmonicFunction a U) (v : AHarmonicFunction a U)) U) + (henergy : MeasureTheory.IntegrableOn + (scalarVariationEnergyIntegrand a (v : AHarmonicFunction a U)) U) : + ResponseJ U p q a = + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a (v : AHarmonicFunction a U)) := by + exact responseJ_energy_of_isResponseMaximizer + U a p q (v : AHarmonicFunction a U) v.isResponseMaximizer + hu_int hresp_v hlin_self henergy + +theorem linearResponseSq {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {lam Lam : ℝ} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) (hInt : ResponseLinearIntegrabilityData U a) + (w : AHarmonicFunction a U) : + (volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * (2 * ResponseJ U p q a) := by + exact basic_cg_identities_linear_response_sq_of_isResponseMaximizer + U a hEll p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer w + +theorem linearResponseSqOfIsEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (w : AHarmonicFunction a U) : + (volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * (2 * ResponseJ U p q a) := + linearResponseSq v hEll (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w + +theorem linearResponse {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {lam Lam : ℝ} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) (hInt : ResponseLinearIntegrabilityData U a) + (w : AHarmonicFunction a U) : + |volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * ResponseJ U p q a) := by + exact basic_cg_identities_linear_response_of_isResponseMaximizer + U a hEll p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer w + +theorem linearResponseOfIsEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (w : AHarmonicFunction a U) : + |volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (2 * ResponseJ U p q a) := + linearResponse v hEll (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w + +theorem polarization {d : ℕ} {U : Set (Vec d)} {p q p' q' : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) + (v' : ScalarCanonicalMaximizer U p' q' a) + (hInt : ResponseLinearIntegrabilityData U a) : + volumeAverage U + (fun x => vecDot ((v' : AHarmonicFunction a U).toH1.grad x) + (matVecMul (symmPart (a x)) ((v : AHarmonicFunction a U).toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := by + exact basic_cg_identities_polarization_of_isResponseMaximizer + U a p q p' q' hInt + (v : AHarmonicFunction a U) (v' : AHarmonicFunction a U) + v.isResponseMaximizer v'.isResponseMaximizer + +theorem polarizationOfIsEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + {p q p' q' : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) + (v' : ScalarCanonicalMaximizer U p' q' a) + (hEll : IsEllipticFieldOn lam Lam U a) : + volumeAverage U + (fun x => vecDot ((v' : AHarmonicFunction a U).toH1.grad x) + (matVecMul (symmPart (a x)) ((v : AHarmonicFunction a U).toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := + polarization v v' (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + +theorem averagePairing {d : ℕ} {U : Set (Vec d)} {p q p' q' : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) + (v' : ScalarCanonicalMaximizer U p' q' a) + (hInt : ResponseLinearIntegrabilityData U a) : + volumeAverage U (fun x => vecDot q' ((v : AHarmonicFunction a U).toH1.grad x)) - + volumeAverage U + (fun x => vecDot p' (matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := by + exact basic_cg_identities_average_pairing_of_isResponseMaximizer + U a p q p' q' hInt + (v : AHarmonicFunction a U) (v' : AHarmonicFunction a U) + v.isResponseMaximizer v'.isResponseMaximizer + +theorem averagePairingOfIsEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + {p q p' q' : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) + (v' : ScalarCanonicalMaximizer U p' q' a) + (hEll : IsEllipticFieldOn lam Lam U a) : + volumeAverage U (fun x => vecDot q' ((v : AHarmonicFunction a U).toH1.grad x)) - + volumeAverage U + (fun x => vecDot p' (matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x))) = + ResponseJ U p q a + ResponseJ U p' q' a - ResponseJ U (p - p') (q - q') a := + averagePairing v v' (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + +structure GradientBasisData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + grad : + ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a + +structure FluxBasisData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) where + flux : + ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a + +namespace GradientBasisData + +noncomputable def ofNonempty {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (h : ∀ i : Fin d, Nonempty (ScalarCanonicalMaximizer U 0 (Pi.single i 1) a)) : + GradientBasisData U a where + grad i := Classical.choice (h i) + +theorem nonempty_of_forall_nonempty {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (h : ∀ i : Fin d, Nonempty (ScalarCanonicalMaximizer U 0 (Pi.single i 1) a)) : + Nonempty (GradientBasisData U a) := + ⟨ofNonempty h⟩ + +theorem nonempty_of_forall_exists_firstVariation_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hex : + ∀ i : Fin d, + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + volumeAverage U + (scalarFirstVariationIntegrand U a 0 (Pi.single i 1) u w) = 0) : + Nonempty (GradientBasisData U a) := + nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_exists_firstVariation_eq_zero_of_isEllipticFieldOn + hEll 0 (Pi.single i 1) (hex i) + +theorem nonempty_of_forall_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hex : + ∀ i : Fin d, + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + ∫ x in U, scalarFirstVariationIntegrand U a 0 (Pi.single i 1) u w x + ∂MeasureTheory.volume = 0) : + Nonempty (GradientBasisData U a) := + nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn + hEll 0 (Pi.single i 1) (hex i) + +end GradientBasisData + +namespace FluxBasisData + +noncomputable def ofNonempty {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (h : ∀ i : Fin d, Nonempty (ScalarCanonicalMaximizer U (Pi.single i 1) 0 a)) : + FluxBasisData U a where + flux i := Classical.choice (h i) + +theorem nonempty_of_forall_nonempty {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (h : ∀ i : Fin d, Nonempty (ScalarCanonicalMaximizer U (Pi.single i 1) 0 a)) : + Nonempty (FluxBasisData U a) := + ⟨ofNonempty h⟩ + +theorem nonempty_of_forall_exists_firstVariation_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hex : + ∀ i : Fin d, + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + volumeAverage U + (scalarFirstVariationIntegrand U a (Pi.single i 1) 0 u w) = 0) : + Nonempty (FluxBasisData U a) := + nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_exists_firstVariation_eq_zero_of_isEllipticFieldOn + hEll (Pi.single i 1) 0 (hex i) + +theorem nonempty_of_forall_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hex : + ∀ i : Fin d, + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + ∫ x in U, scalarFirstVariationIntegrand U a (Pi.single i 1) 0 u w x + ∂MeasureTheory.volume = 0) : + Nonempty (FluxBasisData U a) := + nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn + hEll (Pi.single i 1) 0 (hex i) + +end FluxBasisData + +end ScalarCanonicalMaximizer + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalFormulas.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalFormulas.lean new file mode 100644 index 0000000000..c56a5a4903 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CanonicalFormulas.lean @@ -0,0 +1,629 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalBasic + +/-! # Canonical Formulas -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +namespace ScalarCanonicalMaximizer + +/-! +# Average formulas (part 4) -- ScalarCanonicalMaximizer average formulas + +averageGradient / averageFlux (plain and canonical) and their formula +variants (generic, canonical, deterministicCoarseBlockMatrix, +coarseBlockMatrix) inside the ScalarCanonicalMaximizer namespace. +-/ + +theorem averageGradient {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + exact basic_cg_identities_average_gradient_of_isResponseMaximizer + U a p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vGrad i : AHarmonicFunction a U)) + (fun i => (vGrad i).isResponseMaximizer) + +theorem averageGradientOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := + averageGradient v (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vGrad + +theorem averageGradientOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (hInt : ResponseLinearIntegrabilityData U a) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + exact averageGradient v hInt basis.grad + +theorem averageGradientOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := + averageGradientOfBasisData v (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFlux {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := by + exact basic_cg_identities_average_flux_of_isResponseMaximizer + U a p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vFlux i : AHarmonicFunction a U)) + (fun i => (vFlux i).isResponseMaximizer) + +theorem averageFluxOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := + averageFlux v (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vFlux + +theorem averageFluxOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) (hInt : ResponseLinearIntegrabilityData U a) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := by + exact averageFlux v hInt basis.flux + +theorem averageFluxOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (v : ScalarCanonicalMaximizer U p q a) (hEll : IsEllipticFieldOn lam Lam U a) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := + averageFluxOfBasisData v (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormula {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := by + exact basic_cg_identities_average_gradient_formula_of_isResponseMaximizer + U a hS hK p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vGrad i : AHarmonicFunction a U)) + (fun i => (vGrad i).isResponseMaximizer) + +theorem averageGradientFormulaOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := + averageGradientFormula v hS hK + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vGrad + +theorem averageGradientFormulaOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hInt : ResponseLinearIntegrabilityData U a) (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := by + exact averageGradientFormula v hS hK hInt basis.grad + +theorem averageGradientFormulaOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := + averageGradientFormulaOfBasisData v hS hK + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormula {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := by + exact basic_cg_identities_average_flux_formula_of_isResponseMaximizer + U a hS hK hSigma p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vFlux i : AHarmonicFunction a U)) + (fun i => (vFlux i).isResponseMaximizer) + +theorem averageFluxFormulaOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := + averageFluxFormula v hS hK hSigma + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vFlux + +theorem averageFluxFormulaOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hInt : ResponseLinearIntegrabilityData U a) (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := by + exact averageFluxFormula v hS hK hSigma hInt basis.flux + +theorem averageFluxFormulaOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := + averageFluxFormulaOfBasisData v hS hK hSigma + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormulaCanonical {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := by + exact basic_cg_identities_average_gradient_formula_canonical_of_isResponseMaximizer + U a hS hK hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vGrad i : AHarmonicFunction a U)) + (fun i => (vGrad i).isResponseMaximizer) + +theorem averageGradientFormulaCanonicalOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := + averageGradientFormulaCanonical v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vGrad + +theorem averageGradientFormulaCanonicalOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := by + exact averageGradientFormulaCanonical v hS hK hdet hInt basis.grad + +theorem averageGradientFormulaCanonicalOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := + averageGradientFormulaCanonicalOfBasisData v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormulaCanonical {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := by + exact basic_cg_identities_average_flux_formula_canonical_of_isResponseMaximizer + U a hS hK hSigma hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vFlux i : AHarmonicFunction a U)) + (fun i => (vFlux i).isResponseMaximizer) + +theorem averageFluxFormulaCanonicalOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := + averageFluxFormulaCanonical v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vFlux + +theorem averageFluxFormulaCanonicalOfBasisData {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := by + exact averageFluxFormulaCanonical v hS hK hSigma hdet hInt basis.flux + +theorem averageFluxFormulaCanonicalOfBasisDataOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := + averageFluxFormulaCanonicalOfBasisData v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormulaDeterministicCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := by + exact basic_cg_identities_average_gradient_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + U a hS hK hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vGrad i : AHarmonicFunction a U)) + (fun i => (vGrad i).isResponseMaximizer) + +theorem averageGradientFormulaDeterministicCoarseBlockMatrixOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := + averageGradientFormulaDeterministicCoarseBlockMatrix v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vGrad + +theorem averageGradientFormulaDeterministicCoarseBlockMatrixOfBasisData + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := by + exact averageGradientFormulaDeterministicCoarseBlockMatrix v hS hK hdet hInt basis.grad + +theorem averageGradientFormulaDeterministicCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := + averageGradientFormulaDeterministicCoarseBlockMatrixOfBasisData v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormulaDeterministicCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := by + exact basic_cg_identities_average_flux_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + U a hS hK hSigma hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vFlux i : AHarmonicFunction a U)) + (fun i => (vFlux i).isResponseMaximizer) + +theorem averageFluxFormulaDeterministicCoarseBlockMatrixOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := + averageFluxFormulaDeterministicCoarseBlockMatrix v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vFlux + +theorem averageFluxFormulaDeterministicCoarseBlockMatrixOfBasisData + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := by + exact averageFluxFormulaDeterministicCoarseBlockMatrix v hS hK hSigma hdet hInt basis.flux + +theorem averageFluxFormulaDeterministicCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := + averageFluxFormulaDeterministicCoarseBlockMatrixOfBasisData v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormulaCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := by + exact basic_cg_identities_average_gradient_formula_coarseBlockMatrix_of_isResponseMaximizer + U a hA hS hK hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vGrad i : AHarmonicFunction a U)) + (fun i => (vGrad i).isResponseMaximizer) + +theorem averageGradientFormulaCoarseBlockMatrixOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := + averageGradientFormulaCoarseBlockMatrix v hA hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vGrad + +theorem averageGradientFormulaCoarseBlockMatrixOfBasisData + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := by + exact averageGradientFormulaCoarseBlockMatrix v hA hS hK hdet hInt basis.grad + +theorem averageGradientFormulaCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : GradientBasisData U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := + averageGradientFormulaCoarseBlockMatrixOfBasisData + v hA hS hK hdet (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormulaCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := by + exact basic_cg_identities_average_flux_formula_coarseBlockMatrix_of_isResponseMaximizer + U a hA hS hK hSigma hdet p q hInt (v : AHarmonicFunction a U) v.isResponseMaximizer + (fun i => (vFlux i : AHarmonicFunction a U)) + (fun i => (vFlux i).isResponseMaximizer) + +theorem averageFluxFormulaCoarseBlockMatrixOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := + averageFluxFormulaCoarseBlockMatrix v hA hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) vFlux + +theorem averageFluxFormulaCoarseBlockMatrixOfBasisData + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := by + exact averageFluxFormulaCoarseBlockMatrix v hA hS hK hSigma hdet hInt basis.flux + +theorem averageFluxFormulaCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (basis : FluxBasisData U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := + averageFluxFormulaCoarseBlockMatrixOfBasisData + v hA hS hK hSigma hdet (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem energyAverageGradientCanonicalOfIsSigmaStarCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + {sigmaStar : Mat d} (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) (w : AHarmonicFunction a U) + (v : ScalarCanonicalMaximizer U 0 + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) a) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => w.toH1.grad x i)) + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + exact basic_cg_identities_energy_average_gradient_canonical_of_isSigmaStarCoarse + U a hEll hS hdet hInt w (v : AHarmonicFunction a U) v.isResponseMaximizer + +theorem energyAverageGradientCanonicalOfIsSigmaStarCoarseOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigmaStar : Mat d} (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a U) + (v : ScalarCanonicalMaximizer U 0 + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) a) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => w.toH1.grad x i)) + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := + energyAverageGradientCanonicalOfIsSigmaStarCoarse hEll hS hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w v + +theorem energyAverageFluxCanonicalOfIsSigmaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + {sigma sigmaStar kappa : Mat d} (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (hInt : ResponseLinearIntegrabilityData U a) + (w : AHarmonicFunction a U) + (v : ScalarCanonicalMaximizer U + (-matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + exact basic_cg_identities_energy_average_flux_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hdet hInt w (v : AHarmonicFunction a U) v.isResponseMaximizer + +theorem energyAverageFluxCanonicalOfIsSigmaCoarseOfIsEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {sigma sigmaStar kappa : Mat d} (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a U) + (v : ScalarCanonicalMaximizer U + (-matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := + energyAverageFluxCanonicalOfIsSigmaCoarse hEll hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w v + + +end ScalarCanonicalMaximizer + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CoarseFormulas.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CoarseFormulas.lean new file mode 100644 index 0000000000..4983008ba0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/AverageFormulas/CoarseFormulas.lean @@ -0,0 +1,642 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.BasicVariation + +/-! # Coarse Formulas -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Average formulas (part 2) -- sigma-coarse formulas + +energy-average / responseJ-zero formulas under IsSigmaStarCoarse and +IsSigmaCoarse, their deterministicCoarseBlockMatrix / coarseBlockMatrix +variants, and the corresponding average-gradient / average-flux formula +theorems for IsResponseMaximizer data. +-/ + +theorem basic_cg_identities_energy_average_gradient_canonical_of_isSigmaStarCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (w : AHarmonicFunction a U) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U 0 + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) a u) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => w.toH1.grad x i)) + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + let avgGrad : Vec d := fun i => volumeAverage U (fun x => w.toH1.grad x i) + let qbar : Vec d := matVecMul (sigmaStarCoarse U a) avgGrad + have hzero : volumeAverage U (fun _ => (0 : ℝ)) = 0 := volumeAverage_zero U + have havg : + volumeAverage U (fun x => vecDot qbar (w.toH1.grad x)) = vecDot qbar avgGrad := by + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + U a 0 qbar hInt w + have hpair' : + volumeAverage U (fun x => vecDot qbar (w.toH1.grad x)) - + volumeAverage U (fun _ => (0 : ℝ)) = + vecDot qbar avgGrad := by + simpa [avgGrad, qbar, vecDot] using hpair + linarith + have hlin := + basic_cg_identities_linear_response_of_isResponseMaximizer + U a hEll 0 qbar hInt u hmax w + have hSigmaEq : sigmaStarCoarse U a = sigmaStar := + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet + have hresp : + ResponseJ U 0 qbar a = + (1 / 2 : ℝ) * vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) := by + rcases hS with ⟨_, hSresp⟩ + have hInvMul : matVecMul sigmaStar⁻¹ (matVecMul sigmaStar avgGrad) = avgGrad := by + rw [matVecMul_mul, Matrix.nonsing_inv_mul sigmaStar hdet] + funext i + simp [matVecMul, Matrix.one_apply] + unfold qbar + rw [hSigmaEq, hSresp] + calc + (1 / 2 : ℝ) * vecDot (matVecMul sigmaStar avgGrad) + (matVecMul sigmaStar⁻¹ (matVecMul sigmaStar avgGrad)) = + (1 / 2 : ℝ) * vecDot (matVecMul sigmaStar avgGrad) avgGrad := by + rw [hInvMul] + _ = (1 / 2 : ℝ) * vecDot avgGrad (matVecMul sigmaStar avgGrad) := by + rw [vecDot_comm] + have hlin' : + |vecDot qbar avgGrad| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt + (vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad)) := by + have hlin0 : + |volumeAverage U (fun x => vecDot qbar (w.toH1.grad x)) - + volumeAverage U (fun _ => (0 : ℝ))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad)) := by + simpa [hresp, avgGrad, qbar, vecDot, mul_assoc, mul_left_comm, mul_comm] using hlin + rw [havg, hzero] at hlin0 + simpa using hlin0 + have hquad_nonneg : + 0 ≤ vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) := by + have hresp_nonneg : 0 ≤ ResponseJ U 0 qbar a := responseJ_nonneg U 0 qbar a + rw [hresp] at hresp_nonneg + nlinarith + have hqbarEq : + vecDot qbar avgGrad = + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) := by + unfold qbar + rw [vecDot_comm] + have henergy_nonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a w) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn U a hEll w + have hsq : + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) := by + have hlin'' : + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad)) := by + have hlinAbs := hlin' + rw [hqbarEq] at hlinAbs + rw [abs_of_nonneg hquad_nonneg] at hlinAbs + exact hlinAbs + nlinarith [hlin'', Real.sq_sqrt henergy_nonneg, Real.sq_sqrt hquad_nonneg] + have hmain : + vecDot avgGrad (matVecMul (sigmaStarCoarse U a) avgGrad) ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) := by + nlinarith [hsq, hquad_nonneg] + nlinarith [hmain] + +theorem + basic_cg_identities_energy_average_gradient_canonical_of_isSigmaStarCoarse_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) + (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a U) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U 0 + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) a u) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => w.toH1.grad x i)) + (matVecMul (sigmaStarCoarse U a) + (fun i => volumeAverage U (fun x => w.toH1.grad x i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := + basic_cg_identities_energy_average_gradient_canonical_of_isSigmaStarCoarse + U a hEll hS hdet (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) + w u hmax + +theorem responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p 0 a = (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + rcases hSigma with ⟨_, hSigmaResp⟩ + have hp := hSigmaResp p + have hb : + vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) = + vecDot p (matVecMul sigma p) + + vecDot p (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + unfold bCoarse + calc + vecDot p (matVecMul (sigma + matTranspose kappa * sigmaStar⁻¹ * kappa) p) + = vecDot p (matVecMul sigma p + matVecMul (matTranspose kappa * sigmaStar⁻¹ * kappa) p) := by + rw [add_matVecMul] + _ = vecDot p (matVecMul sigma p) + + vecDot p (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ (matVecMul kappa p))) := by + rw [vecDot_add_right, matVecMul_mul, matVecMul_mul] + rw [hb] + linarith + +theorem basic_cg_identities_responseJ_zero_formula_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p : Vec d) : + ResponseJ U p 0 a = (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := + responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse hSigma p + +theorem basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + simpa [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + basic_cg_identities_responseJ_zero_formula_of_isSigmaCoarse U a hSigma p + +theorem basic_cg_identities_energy_average_flux_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (w : AHarmonicFunction a U) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U + (-matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a u) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + let avgFlux : Vec d := fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i) + let B : Mat d := bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a) + let pbar : Vec d := -matVecMul B⁻¹ avgFlux + by_cases hBdet : IsUnit B.det + · have hzero : volumeAverage U (fun _ => (0 : ℝ)) = 0 := volumeAverage_zero U + have havg : + volumeAverage U (fun x => vecDot pbar (matVecMul (a x) (w.toH1.grad x))) = + vecDot pbar avgFlux := by + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + U a pbar 0 hInt w + have hpair' : + volumeAverage U (fun _ => (0 : ℝ)) - + volumeAverage U (fun x => vecDot pbar (matVecMul (a x) (w.toH1.grad x))) = + -vecDot pbar avgFlux := by + simpa [avgFlux, pbar, vecDot] using hpair + linarith + have hlin := + basic_cg_identities_linear_response_of_isResponseMaximizer + U a hEll pbar 0 hInt u hmax w + have hBmul : matVecMul B pbar = -avgFlux := by + unfold pbar + rw [matVecMul_neg, matVecMul_mul, Matrix.mul_nonsing_inv B hBdet] + funext i + simp [matVecMul, Matrix.one_apply, avgFlux] + have hresp : + ResponseJ U pbar 0 a = + (1 / 2 : ℝ) * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + rw [basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet] + calc + (1 / 2 : ℝ) * vecDot pbar (matVecMul B pbar) = + (1 / 2 : ℝ) * vecDot pbar (-avgFlux) := by + rw [hBmul] + _ = (1 / 2 : ℝ) * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + unfold pbar + rw [vecDot_neg_right, vecDot_neg_left, neg_neg, vecDot_comm] + have hlin' : + |vecDot pbar avgFlux| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (vecDot avgFlux (matVecMul B⁻¹ avgFlux)) := by + have hlin0 : + |volumeAverage U (fun _ => (0 : ℝ)) - + volumeAverage U (fun x => vecDot pbar (matVecMul (a x) (w.toH1.grad x)))| ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (vecDot avgFlux (matVecMul B⁻¹ avgFlux)) := by + simpa [hresp, avgFlux, B, pbar, vecDot, mul_assoc, mul_left_comm, mul_comm] using hlin + rw [hzero, havg, sub_eq_add_neg] at hlin0 + simpa using hlin0 + have hquad_nonneg : + 0 ≤ vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + have hresp_nonneg : 0 ≤ ResponseJ U pbar 0 a := responseJ_nonneg U pbar 0 a + rw [hresp] at hresp_nonneg + nlinarith + have hpbarEq : + vecDot pbar avgFlux = -vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + unfold pbar + rw [vecDot_neg_left, vecDot_comm] + have henergy_nonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a w) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn U a hEll w + have hsq : + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ^ 2 ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) * + vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + have hlin'' : + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + Real.sqrt (volumeAverage U (scalarVariationEnergyIntegrand a w)) * + Real.sqrt (vecDot avgFlux (matVecMul B⁻¹ avgFlux)) := by + have hlinAbs := hlin' + rw [hpbarEq] at hlinAbs + rw [abs_neg, abs_of_nonneg hquad_nonneg] at hlinAbs + exact hlinAbs + nlinarith [hlin'', Real.sq_sqrt henergy_nonneg, Real.sq_sqrt hquad_nonneg] + have hmain : + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + volumeAverage U (scalarVariationEnergyIntegrand a w) := by + nlinarith [hsq, hquad_nonneg] + nlinarith [hmain] + · have hBinv : B⁻¹ = 0 := Matrix.nonsing_inv_apply_not_isUnit B hBdet + have henergy_nonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a w) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn U a hEll w + rw [hBinv] + simp [matVecMul, vecDot] + nlinarith + +theorem basic_cg_identities_energy_average_flux_canonical_of_isSigmaCoarse_of_isEllipticFieldOn + {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a U) + (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U + (-matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a u) : + (1 / 2 : ℝ) * + vecDot (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i)) + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a))⁻¹ + (fun i => volumeAverage U (fun x => matVecMul (a x) (w.toH1.grad x) i))) ≤ + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := + basic_cg_identities_energy_average_flux_canonical_of_isSigmaCoarse + U a hEll hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w u hmax + +theorem basic_cg_identities_responseJ_zero_formula_deterministicCoarseBlockMatrix_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p) := by + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + simpa [blockMatrixOfDeterministicData] using + basic_cg_identities_responseJ_zero_formula_of_isSigmaCoarse U a hSigma p + +theorem basic_cg_identities_responseJ_zero_formula_coarseBlockMatrix_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact basic_cg_identities_responseJ_zero_formula_deterministicCoarseBlockMatrix_of_isSigmaCoarse + U a hS hK hSigma hdet p + +theorem basic_cg_identities_responseJ_formula_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - vecDot p q + + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + rcases hS with ⟨_, hSresp⟩ + have hq := hSresp q + have hk := hK p q + have hp := basic_cg_identities_responseJ_zero_formula_of_isSigmaCoarse U a hSigma p + linarith + +theorem basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) - vecDot p q + + vecDot q (matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p)) + + (1 / 2 : ℝ) * vecDot p + (matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + basic_cg_identities_responseJ_formula_of_isSigmaCoarse U a hS hK hSigma p q + +theorem basic_cg_identities_responseJ_formula_deterministicCoarseBlockMatrix_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p) := by + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + calc + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - vecDot p q + + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) + + (1 / 2 : ℝ) * vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + exact basic_cg_identities_responseJ_formula_of_isSigmaCoarse U a hS hK hSigma p q + _ = (1 / 2 : ℝ) * vecDot q (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperLeft p) := by + simp [blockMatrixOfDeterministicData, sub_eq_add_neg, matVecMul_mul, + neg_matVecMul, vecDot_neg_right, add_assoc] + +theorem basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix U a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix U a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact basic_cg_identities_responseJ_formula_deterministicCoarseBlockMatrix_of_isSigmaCoarse + U a hS hK hSigma hdet p q + +theorem basic_cg_identities_average_gradient_formula_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := by + funext i + let e : Vec d := Pi.single i 1 + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + rcases hS with ⟨_, hSresp⟩ + have hcoord := + basic_cg_identities_average_gradient_coordinate_of_isResponseMaximizer + U a p q hInt u hmax i (uGrad i) (hmaxGrad i) + have hq : + ResponseJ U 0 q a + ResponseJ U 0 e a - ResponseJ U 0 (q - e) a = + vecDot e (matVecMul sigmaStar⁻¹ q) := by + rw [hSresp q, hSresp e, hSresp (q - e)] + simpa [e] using half_vecDot_sub_polarization_of_isSymm hSInvSymm q e + have hdot_p : vecDot p (q - e) = vecDot p q - vecDot p e := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] + have hdot_k : + vecDot (q - e) (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) = + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) - + vecDot e (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hmain : + ResponseJ U p q a + ResponseJ U 0 e a - ResponseJ U p (q - e) a = + -vecDot p e + vecDot e (matVecMul sigmaStar⁻¹ q) + + vecDot e (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := by + linarith [hq, hK p q, hK p (q - e), hdot_p, hdot_k] + calc + volumeAverage U (fun x => u.toH1.grad x i) = + ResponseJ U p q a + ResponseJ U 0 e a - ResponseJ U p (q - e) a := hcoord + _ = -vecDot p e + vecDot e (matVecMul sigmaStar⁻¹ q) + + vecDot e (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) := hmain + _ = (-p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p)) i := by + simp [e, matVecMul_add, vecDot_single_left, vecDot_single_right] + ring + +theorem basic_cg_identities_average_flux_formula_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := by + funext i + let e : Vec d := Pi.single i 1 + have hSInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + have hBsymm := bCoarse_isSymm_of_isSigmaCoarse hS hSigma + have hcoord := + basic_cg_identities_average_flux_coordinate_of_isResponseMaximizer + U a p q hInt u hmax i (uFlux i) (hmaxFlux i) + have hB : + ResponseJ U (p - e) 0 a - ResponseJ U p 0 a - ResponseJ U e 0 a = + -vecDot e (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + have hp := responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse hSigma p + have he := responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse hSigma e + have hpe := responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse hSigma (p - e) + have hquad := half_vecDot_sub_sub_of_isSymm hBsymm p e + linarith + have hdot_q : vecDot (p - e) q = vecDot p q - vecDot e q := by + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hdot_k : + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa (p - e))) = + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa p)) - + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa e)) := by + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_right, vecDot_neg_right] + have hmain : + ResponseJ U (p - e) q a - ResponseJ U p q a - ResponseJ U e 0 a = + vecDot e q - vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa e)) - + vecDot e (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + linarith [hB, hK (p - e) q, hK p q, hdot_q, hdot_k] + have hmiddle : + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa e)) = + vecDot e (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q)) := by + calc + vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa e)) = + vecDot (matVecMul kappa e) (matVecMul sigmaStar⁻¹ q) := by + rw [vecDot_matVecMul_comm_of_isSymm hSInvSymm q (matVecMul kappa e)] + _ = vecDot e (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q)) := by + rw [vecDot_matVecMul_transpose] + calc + volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i) = + ResponseJ U (p - e) q a - ResponseJ U p q a - ResponseJ U e 0 a := hcoord + _ = vecDot e q - vecDot q (matVecMul sigmaStar⁻¹ (matVecMul kappa e)) - + vecDot e (matVecMul (bCoarse sigma sigmaStar kappa) p) := hmain + _ = vecDot e q - vecDot e (matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q)) - + vecDot e (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + rw [hmiddle] + _ = (q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p) i := by + simp [e, sub_eq_add_neg, vecDot_single_left] + +theorem basic_cg_identities_average_gradient_formula_canonical_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] using + basic_cg_identities_average_gradient_formula_of_isResponseMaximizer + U a hS hK p q hInt u hmax uGrad hmaxGrad + +theorem basic_cg_identities_average_flux_formula_canonical_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := by + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using + basic_cg_identities_average_flux_formula_of_isResponseMaximizer + U a hS hK hSigma p q hInt u hmax uFlux hmaxFlux + +theorem basic_cg_identities_average_gradient_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := by + calc + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := by + exact basic_cg_identities_average_gradient_formula_canonical_of_isResponseMaximizer + U a hS hK hdet p q hInt u hmax uGrad hmaxGrad + _ = -p + matVecMul (sigmaStarInvCoarse U a) q + + matVecMul (sigmaStarInvCoarse U a) (matVecMul (kappaCoarse U a) p) := by + simp [matVecMul_add, add_assoc] + _ = -p + matVecMul (sigmaStarInvCoarse U a) q + + matVecMul ((sigmaStarInvCoarse U a) * (kappaCoarse U a)) p := by + rw [matVecMul_mul] + _ = -p + matVecMul (sigmaStarInvCoarse U a) q + + matVecMul (sigmaStarInvKappaCoarse U a) p := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet, + ← sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + _ = -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := by + simp [deterministicCoarseBlockMatrix, sub_eq_add_neg, neg_matVecMul, add_assoc] + +theorem basic_cg_identities_average_flux_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := by + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + calc + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := by + exact basic_cg_identities_average_flux_formula_of_isResponseMaximizer + U a hS hK hSigma p q hInt u hmax uFlux hmaxFlux + _ = q + matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperRight q - + matVecMul (blockMatrixOfDeterministicData sigma sigmaStar kappa).upperLeft p := by + simp [blockMatrixOfDeterministicData, sub_eq_add_neg, matVecMul_mul, + neg_matVecMul, add_assoc] + +theorem basic_cg_identities_average_gradient_formula_coarseBlockMatrix_of_isResponseMaximizer + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uGrad : Fin d → AHarmonicFunction a U) + (hmaxGrad : ∀ i : Fin d, IsResponseMaximizer U 0 (Pi.single i 1) a (uGrad i)) : + (fun i => volumeAverage U (fun x => u.toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact basic_cg_identities_average_gradient_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + U a hS hK hdet p q hInt u hmax uGrad hmaxGrad + +theorem basic_cg_identities_average_flux_formula_coarseBlockMatrix_of_isResponseMaximizer + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (p q : Vec d) (hInt : ResponseLinearIntegrabilityData U a) + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (uFlux : Fin d → AHarmonicFunction a U) + (hmaxFlux : ∀ i : Fin d, IsResponseMaximizer U (Pi.single i 1) 0 a (uFlux i)) : + (fun i => volumeAverage U (fun x => matVecMul (a x) (u.toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := by + rw [coarseBlockMatrix_eq_deterministicCoarseBlockMatrix_of_isCoarseBlockMatrix hA] + exact basic_cg_identities_average_flux_formula_deterministicCoarseBlockMatrix_of_isResponseMaximizer + U a hS hK hSigma hdet p q hInt u hmax uFlux hmaxFlux + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/ConvexAverageFormulas.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/ConvexAverageFormulas.lean new file mode 100644 index 0000000000..fd63034c19 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/ConvexAverageFormulas.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence + +/-! # Convex Average Formulas -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Convex-domain wrappers for average formulas that discharge basis-data packages +using the bounded-open-convex existence theorems. +-/ + +namespace ScalarCanonicalMaximizer + +theorem averageGradientOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + (v : ScalarCanonicalMaximizer U p q a) (hne : Set.Nonempty U) + (hU : IsOpenBoundedConvexDomain U) (hEll : IsEllipticFieldOn lam Lam U a) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + fun i => ResponseJ U p q a + ResponseJ U 0 (Pi.single i 1) a - + ResponseJ U p (q - Pi.single i 1) a := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageGradientOfBasisDataOfIsEllipticFieldOn v hEll basis + +theorem averageFluxOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + (v : ScalarCanonicalMaximizer U p q a) (hne : Set.Nonempty U) + (hU : IsOpenBoundedConvexDomain U) (hEll : IsEllipticFieldOn lam Lam U a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + fun i => ResponseJ U (p - Pi.single i 1) q a - + ResponseJ U p q a - ResponseJ U (Pi.single i 1) 0 a := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageFluxOfBasisDataOfIsEllipticFieldOn v hEll basis + +theorem averageGradientFormulaOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul sigmaStar⁻¹ (q + matVecMul kappa p) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageGradientFormulaOfBasisData v hS hK + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormulaOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose kappa) (matVecMul sigmaStar⁻¹ q) - + matVecMul (bCoarse sigma sigmaStar kappa) p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageFluxFormulaOfBasisData v hS hK hSigma + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormulaCanonicalOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (sigmaStarInvCoarse U a) (q + matVecMul (kappaCoarse U a) p) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageGradientFormulaCanonicalOfBasisData v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageFluxFormulaCanonicalOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q - matVecMul (matTranspose (kappaCoarse U a)) (matVecMul (sigmaStarInvCoarse U a) q) - + matVecMul (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)) p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageFluxFormulaCanonicalOfBasisData v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem + averageGradientFormulaDeterministicCoarseBlockMatrixOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (deterministicCoarseBlockMatrix U a).lowerRight q - + matVecMul (deterministicCoarseBlockMatrix U a).lowerLeft p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageGradientFormulaDeterministicCoarseBlockMatrixOfBasisData v hS hK hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem + averageFluxFormulaDeterministicCoarseBlockMatrixOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (deterministicCoarseBlockMatrix U a).upperRight q - + matVecMul (deterministicCoarseBlockMatrix U a).upperLeft p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageFluxFormulaDeterministicCoarseBlockMatrixOfBasisData v hS hK hSigma hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) basis + +theorem averageGradientFormulaCoarseBlockMatrixOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + -p + matVecMul (coarseBlockMatrix U a).lowerRight q - + matVecMul (coarseBlockMatrix U a).lowerLeft p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageGradientFormulaCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + v hEll hA hS hK hdet basis + +theorem averageFluxFormulaCoarseBlockMatrixOfIsEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} {lam Lam : ℝ} + {sigma sigmaStar kappa : Mat d} (v : ScalarCanonicalMaximizer U p q a) + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + q + matVecMul (coarseBlockMatrix U a).upperRight q - + matVecMul (coarseBlockMatrix U a).upperLeft p := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + rcases FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := U) (a := a) hne hU hEll with ⟨basis⟩ + exact averageFluxFormulaCoarseBlockMatrixOfBasisDataOfIsEllipticFieldOn + v hEll hA hS hK hSigma hdet basis + +end ScalarCanonicalMaximizer + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Existence.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Existence.lean new file mode 100644 index 0000000000..d5200288f1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Existence.lean @@ -0,0 +1,439 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.HilbertMinimization +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicHilbert + +/-! # Existence -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace AHarmonicGradientHilbert + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + +private theorem memVectorL2_const [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (p : Vec d) : MemVectorL2 U (fun _ : Vec d => p) := by + simpa using + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := p)) + +/-- The linear response functional +`F ↦ ∫_U q·F - p·aF` on the closed `A`-harmonic-gradient Hilbert space. -/ +noncomputable def responseFunctionalCLM + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (M : PotentialSolenoidalL2Data U) (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) : + Space (U := U) (a := a) M hEll →L[ℝ] ℝ := + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField (memVectorL2_const (U := U) q))).comp + (fieldCLM (U := U) (a := a) M hEll)) - + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField (memVectorL2_const (U := U) p))).comp + ((hilbertCoeffOperator hEll).comp (fieldCLM (U := U) (a := a) M hEll))) + +theorem responseFunctionalCLM_apply_eq_integral + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {M : PotentialSolenoidalL2Data U} {hEll : IsEllipticFieldOn lam Lam U a} + (p q : Vec d) (z : Space (U := U) (a := a) M hEll) : + responseFunctionalCLM (U := U) (a := a) M hEll p q z = + ∫ x in U, + (vecDot q (vectorField z x) - + vecDot p (matVecMul (a x) (vectorField z x))) ∂MeasureTheory.volume := by + let hqMem : MemVectorL2 U (fun _ : Vec d => q) := memVectorL2_const (U := U) q + let hpMem : MemVectorL2 U (fun _ : Vec d => p) := memVectorL2_const (U := U) p + have hqInt : + MeasureTheory.IntegrableOn (fun x => vecDot q (vectorField z x)) U := by + simpa using + integrableOn_vecDot_of_memVectorL2 hqMem (MeasureTheory.Lp.memLp (vectorField z)) + have hpInt : + MeasureTheory.IntegrableOn + (fun x => vecDot p (matVecMul (a x) (vectorField z x))) U := by + simpa using + integrableOn_vecDot_of_memVectorL2 hpMem + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + have hq : + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hqMem)).comp + (fieldCLM (U := U) (a := a) M hEll)) z = + ∫ x in U, vecDot q (vectorField z x) ∂MeasureTheory.volume := by + calc + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hqMem)).comp + (fieldCLM (U := U) (a := a) M hEll)) z + = inner ℝ (toHilbertVectorL2OfVecField hqMem) (field z) := by + simp [field] + _ = + inner ℝ + (toHilbertVectorL2OfVecField hqMem) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [field_eq_toHilbertVectorL2OfVecField z] + _ = ∫ x in U, vecDot q (vectorField z x) ∂MeasureTheory.volume := by + simpa using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hqMem (MeasureTheory.Lp.memLp (vectorField z)) + have hA : + hilbertCoeffOperator hEll (field z) = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [field_eq_toHilbertVectorL2OfVecField z] + exact + hilbertCoeffOperator_toHilbertVectorL2OfVecField + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll + (MeasureTheory.Lp.memLp (vectorField z)) + have hp : + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hpMem)).comp + ((hilbertCoeffOperator hEll).comp (fieldCLM (U := U) (a := a) M hEll))) z = + ∫ x in U, vecDot p (matVecMul (a x) (vectorField z x)) + ∂MeasureTheory.volume := by + calc + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hpMem)).comp + ((hilbertCoeffOperator hEll).comp (fieldCLM (U := U) (a := a) M hEll))) z + = inner ℝ + (toHilbertVectorL2OfVecField hpMem) + (hilbertCoeffOperator hEll (field z)) := by + simp [field] + _ = + inner ℝ + (toHilbertVectorL2OfVecField hpMem) + (toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z)))) := by + rw [hA] + _ = + ∫ x in U, vecDot p (matVecMul (a x) (vectorField z x)) + ∂MeasureTheory.volume := by + simpa using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hpMem + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + calc + responseFunctionalCLM (U := U) (a := a) M hEll p q z + = + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hqMem)).comp + (fieldCLM (U := U) (a := a) M hEll)) z - + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hpMem)).comp + ((hilbertCoeffOperator hEll).comp (fieldCLM (U := U) (a := a) M hEll))) z := by + rfl + _ = + (∫ x in U, vecDot q (vectorField z x) ∂MeasureTheory.volume) - + ∫ x in U, vecDot p (matVecMul (a x) (vectorField z x)) + ∂MeasureTheory.volume := by + rw [hq, hp] + _ = + ∫ x in U, + (vecDot q (vectorField z x) - + vecDot p (matVecMul (a x) (vectorField z x))) ∂MeasureTheory.volume := by + symm + exact MeasureTheory.integral_sub hqInt hpInt + +/-- The Hilbert-space stationary point for the scalar response functional. -/ +noncomputable def responseStationaryGradient + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (M : PotentialSolenoidalL2Data U) (hne : Set.Nonempty U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) : + Space (U := U) (a := a) M hEll := + linearQuadraticResponseMaximizer + (symmCoeffBilin (U := U) (a := a) M hEll) + (isCoercive_symmCoeffBilin (U := U) (a := a) (M := M) hne hEll) + (responseFunctionalCLM (U := U) (a := a) M hEll p q) + +theorem responseStationaryGradient_firstVariation + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {M : PotentialSolenoidalL2Data U} (hne : Set.Nonempty U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (w : Space (U := U) (a := a) M hEll) : + symmCoeffBilin (U := U) (a := a) M hEll + (responseStationaryGradient (U := U) (a := a) M hne hEll p q) w = + responseFunctionalCLM (U := U) (a := a) M hEll p q w := by + exact + linearQuadraticResponseMaximizer_firstVariation + (symmCoeffBilin (U := U) (a := a) M hEll) + (isCoercive_symmCoeffBilin (U := U) (a := a) (M := M) hne hEll) + (responseFunctionalCLM (U := U) (a := a) M hEll p q) w + +/-- Recover the Hilbert stationary point as a concrete `A`-harmonic function +using the Hodge converse. -/ +noncomputable def responseStationaryAHarmonicFunction + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hne : Set.Nonempty U) (hHodge : HodgeConverseCriterion U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) : + AHarmonicFunction a U := + toAHarmonicFunction (U := U) (a := a) hHodge + (responseStationaryGradient + (U := U) (a := a) + (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hne hEll p q) + +theorem responseStationaryAHarmonicFunction_firstVariation_integral_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hne : Set.Nonempty U) (hHodge : HodgeConverseCriterion U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (w : AHarmonicFunction a U) : + ∫ x in U, + scalarFirstVariationIntegrand U a p q + (responseStationaryAHarmonicFunction + (U := U) (a := a) hne hHodge hEll p q) w x + ∂MeasureTheory.volume = 0 := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let z : Space (U := U) (a := a) M hEll := + responseStationaryGradient (U := U) (a := a) M hne hEll p q + let u : AHarmonicFunction a U := + responseStationaryAHarmonicFunction (U := U) (a := a) hne hHodge hEll p q + let W : Space (U := U) (a := a) M hEll := + ofAHarmonicFunction (U := U) (a := a) M hEll w + have hstationary : + symmCoeffBilin (U := U) (a := a) M hEll z W = + responseFunctionalCLM (U := U) (a := a) M hEll p q W := + responseStationaryGradient_firstVariation (U := U) (a := a) + (M := M) hne hEll p q W + rw [symmCoeffBilin_apply_eq_integral_comm, responseFunctionalCLM_apply_eq_integral] at hstationary + have hWae : vectorField W =ᵐ[volumeMeasureOn U] w.toH1.grad := by + rw [vectorField_ofAHarmonicFunction] + exact H1Function.coeFn_gradToVectorL2 w.toH1 + have hgrad_u : + u.toH1.grad = + vectorField + (responseStationaryGradient + (U := U) (a := a) + (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hne hEll p q) := by + dsimp [u, responseStationaryAHarmonicFunction] + exact + grad_toAHarmonicFunction (U := U) (a := a) hHodge + (responseStationaryGradient + (U := U) (a := a) + (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hne hEll p q) + have hgrad_uz : u.toH1.grad = vectorField z := by + simpa [M, z] using hgrad_u + have hlinInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot q (vectorField W x) - + vecDot p (matVecMul (a x) (vectorField W x))) U := by + simpa [sub_eq_add_neg, MeasureTheory.IntegrableOn] using! + (integrableOn_vecDot_of_memVectorL2 + (memVectorL2_const (U := U) q) (MeasureTheory.Lp.memLp (vectorField W))).integrable.sub + (integrableOn_vecDot_of_memVectorL2 + (memVectorL2_const (U := U) p) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField W)))).integrable + have hcrossInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (vectorField W x) (matVecMul (symmPart (a x)) (vectorField z x))) U := by + exact + integrableOn_vecDot_of_memVectorL2 + (MeasureTheory.Lp.memLp (vectorField W)) + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + have hrewrite : + ∫ x in U, + scalarFirstVariationIntegrand U a p q u w x ∂MeasureTheory.volume = + ∫ x in U, + (vecDot q (vectorField W x) - + vecDot p (matVecMul (a x) (vectorField W x)) - + vecDot (vectorField W x) + (matVecMul (symmPart (a x)) (vectorField z x))) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hWae] with x hxW + have hgrad_ux : u.toH1.grad x = vectorField z x := by + exact congrFun hgrad_uz x + simp [scalarFirstVariationIntegrand, hxW, hgrad_ux] + rw [hrewrite] + have hsplit : + ∫ x in U, + (vecDot q (vectorField W x) - + vecDot p (matVecMul (a x) (vectorField W x)) - + vecDot (vectorField W x) + (matVecMul (symmPart (a x)) (vectorField z x))) + ∂MeasureTheory.volume = + ∫ x in U, + (vecDot q (vectorField W x) - + vecDot p (matVecMul (a x) (vectorField W x))) ∂MeasureTheory.volume - + ∫ x in U, + vecDot (vectorField W x) + (matVecMul (symmPart (a x)) (vectorField z x)) ∂MeasureTheory.volume := by + exact MeasureTheory.integral_sub hlinInt hcrossInt + rw [hsplit] + rw [← hstationary] + ring + +end AHarmonicGradientHilbert + +namespace ScalarCanonicalMaximizer + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + +theorem nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hne : Set.Nonempty U) (hHodge : HodgeConverseCriterion U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) : + Nonempty (ScalarCanonicalMaximizer U p q a) := by + refine nonempty_of_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn hEll p q ?_ + refine ⟨AHarmonicGradientHilbert.responseStationaryAHarmonicFunction + (U := U) (a := a) hne hHodge hEll p q, ?_⟩ + intro w + exact AHarmonicGradientHilbert.responseStationaryAHarmonicFunction_firstVariation_integral_eq_zero + (U := U) (a := a) hne hHodge hEll p q w + +theorem nonempty_of_isOpenBoundedConvexDomain + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) : + Nonempty (ScalarCanonicalMaximizer U p q a) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + exact nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := U) (a := a) hne + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hU) + hEll p q + +theorem volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube + {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + volumeAverage (cubeSet Q) f = volumeAverage (openCubeSet Q) f := by + simp only [volumeAverage, volume_openCubeSet_eq_volume_cubeSet, + setIntegral_cubeSet_eq_setIntegral_openCubeSet] + +theorem isResponseMaximizer_toCubeSet_of_openCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffField d} {p q : Vec d} + (v : ScalarCanonicalMaximizer (openCubeSet Q) p q a) : + IsResponseMaximizer (cubeSet Q) p q a + ((v : AHarmonicFunction a (openCubeSet Q)).toCubeSet) := by + intro w + have hmax := v.isResponseMaximizer w.toOpenCubeSet + have hresp_w : + scalarResponseIntegrand (cubeSet Q) a p q w = + scalarResponseIntegrand (openCubeSet Q) a p q w.toOpenCubeSet := by + funext x + simp only [scalarResponseIntegrand, AHarmonicFunction.grad_toOpenCubeSet] + have hresp_v : + scalarResponseIntegrand (cubeSet Q) a p q + ((v : AHarmonicFunction a (openCubeSet Q)).toCubeSet) = + scalarResponseIntegrand (openCubeSet Q) a p q + (v : AHarmonicFunction a (openCubeSet Q)) := by + funext x + simp only [scalarResponseIntegrand, AHarmonicFunction.grad_toCubeSet] + calc + volumeAverage (cubeSet Q) (scalarResponseIntegrand (cubeSet Q) a p q w) + = volumeAverage (openCubeSet Q) (scalarResponseIntegrand (cubeSet Q) a p q w) := by + exact volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q _ + _ = volumeAverage (openCubeSet Q) + (scalarResponseIntegrand (openCubeSet Q) a p q w.toOpenCubeSet) := by + rw [hresp_w] + _ ≤ volumeAverage (openCubeSet Q) + (scalarResponseIntegrand (openCubeSet Q) a p q + (v : AHarmonicFunction a (openCubeSet Q))) := hmax + _ = volumeAverage (openCubeSet Q) + (scalarResponseIntegrand (cubeSet Q) a p q + ((v : AHarmonicFunction a (openCubeSet Q)).toCubeSet)) := by + rw [hresp_v] + _ = volumeAverage (cubeSet Q) + (scalarResponseIntegrand (cubeSet Q) a p q + ((v : AHarmonicFunction a (openCubeSet Q)).toCubeSet)) := by + exact (volumeAverage_cubeSet_eq_openCubeSet_of_triadicCube Q _).symm + +noncomputable def toCubeSetOfOpenCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffField d} {p q : Vec d} + (v : ScalarCanonicalMaximizer (openCubeSet Q) p q a) : + ScalarCanonicalMaximizer (cubeSet Q) p q a := by + letI : Fact (MeasureTheory.volume (cubeSet Q) < ⊤) := ⟨volume_cubeSet_lt_top Q⟩ + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet Q)) + infer_instance + exact + ofIsResponseMaximizer + ((v : AHarmonicFunction a (openCubeSet Q)).toCubeSet) + (isResponseMaximizer_toCubeSet_of_openCubeSet v) + +theorem nonempty_cubeSet_of_isEllipticFieldOn_openCubeSet {d : ℕ} [NeZero d] + {Q : TriadicCube d} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) (p q : Vec d) : + Nonempty (ScalarCanonicalMaximizer (cubeSet Q) p q a) := by + have hne : Set.Nonempty (openCubeSet Q) := by + refine ⟨cubeCenter Q, ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + exact Metric.mem_ball_self (cubeRadius_pos Q) + rcases nonempty_of_isOpenBoundedConvexDomain + (U := openCubeSet Q) (a := a) hne + (isOpenBoundedConvexDomain_openCubeSet Q) hEll p q with + ⟨v⟩ + exact ⟨toCubeSetOfOpenCubeSet v⟩ + +end ScalarCanonicalMaximizer + +namespace ScalarCanonicalMaximizer + +namespace GradientBasisData + +theorem nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hne : Set.Nonempty U) (hHodge : HodgeConverseCriterion U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Nonempty (GradientBasisData U a) := + GradientBasisData.nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := U) (a := a) hne hHodge hEll 0 (Pi.single i 1) + +theorem nonempty_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Nonempty (GradientBasisData U a) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + exact nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := U) (a := a) hne + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hU) + hEll + +end GradientBasisData + +namespace FluxBasisData + +theorem nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hne : Set.Nonempty U) (hHodge : HodgeConverseCriterion U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Nonempty (FluxBasisData U a) := + FluxBasisData.nonempty_of_forall_nonempty fun i => + ScalarCanonicalMaximizer.nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := U) (a := a) hne hHodge hEll (Pi.single i 1) 0 + +theorem nonempty_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hne : Set.Nonempty U) (hU : IsOpenBoundedConvexDomain U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Nonempty (FluxBasisData U a) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + exact nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := U) (a := a) hne + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hU) + hEll + +end FluxBasisData + +end ScalarCanonicalMaximizer + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations.lean new file mode 100644 index 0000000000..f1f03dfa09 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Algebra +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Maximizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Ellipticity + +/-! +# Foundational scalar deterministic identities for `ResponseJ` (aggregate) + +Historically a single monolithic file; now split along namespace/section +boundaries into the three modules imported above. This shim re-exports +everything so downstream consumers keep working unchanged. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Algebra.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Algebra.lean new file mode 100644 index 0000000000..1afaf5ba6c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Algebra.lean @@ -0,0 +1,480 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import Mathlib.Data.Real.Pointwise + +/-! # Algebra -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Scalar response-integrand algebra + +Volume-average linearity, symmetric-matrix polarization lemmas, +`AHarmonicFunction` rescale/unscale/sub helpers, and basic algebraic +identities for `scalarResponseIntegrand` and `scalarVariationEnergyIntegrand`. +-/ + +@[simp] theorem volumeAverage_zero {d : ℕ} (U : Set (Vec d)) : + volumeAverage U (0 : Vec d → ℝ) = 0 := by + unfold volumeAverage + simp + +theorem volumeAverage_smul {d : ℕ} (U : Set (Vec d)) (c : ℝ) (f : Vec d → ℝ) : + volumeAverage U (c • f) = c * volumeAverage U f := by + unfold volumeAverage + rw [show (fun x => (c • f) x) = fun x => c • f x by + funext x + simp] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul] + ring + +theorem volumeAverage_add {d : ℕ} {U : Set (Vec d)} {f g : Vec d → ℝ} + (hf : MeasureTheory.IntegrableOn f U) (hg : MeasureTheory.IntegrableOn g U) : + volumeAverage U (f + g) = volumeAverage U f + volumeAverage U g := by + unfold volumeAverage + rw [show (fun x => (f + g) x) = fun x => f x + g x by + funext x + simp] + rw [MeasureTheory.integral_add hf hg] + ring + +theorem volumeAverage_sub {d : ℕ} {U : Set (Vec d)} {f g : Vec d → ℝ} + (hf : MeasureTheory.IntegrableOn f U) (hg : MeasureTheory.IntegrableOn g U) : + volumeAverage U (f - g) = volumeAverage U f - volumeAverage U g := by + have hneg : MeasureTheory.IntegrableOn ((-1 : ℝ) • g) U := by + simpa [MeasureTheory.IntegrableOn] using hg.integrable.smul (-1 : ℝ) + rw [show f - g = f + (-1 : ℝ) • g by + funext x + simp [sub_eq_add_neg]] + rw [volumeAverage_add hf hneg, volumeAverage_smul] + ring + +theorem volumeAverage_sum {d : ℕ} {α : Type*} {U : Set (Vec d)} + (s : Finset α) (f : α → Vec d → ℝ) + (hf : ∀ a ∈ s, MeasureTheory.IntegrableOn (f a) U) : + volumeAverage U (fun x => s.sum (fun a => f a x)) = s.sum (fun a => volumeAverage U (f a)) := by + classical + revert hf + refine Finset.induction_on s ?_ ?_ + · intro hf + change volumeAverage U (0 : Vec d → ℝ) = 0 + exact volumeAverage_zero U + · intro a s ha ih hf + have haInt : MeasureTheory.IntegrableOn (f a) U := hf a (Finset.mem_insert_self a s) + have hsInt : ∀ b ∈ s, MeasureTheory.IntegrableOn (f b) U := by + intro b hb + exact hf b (Finset.mem_insert_of_mem hb) + have hsumInt : MeasureTheory.IntegrableOn (fun x => s.sum (fun b => f b x)) U := by + simpa [MeasureTheory.IntegrableOn] using + (MeasureTheory.integrable_finsetSum + (μ := MeasureTheory.Measure.restrict MeasureTheory.volume U) s + (fun b hb => (hsInt b hb).integrable)) + calc + volumeAverage U (fun x => (insert a s).sum (fun b => f b x)) + = volumeAverage U (fun x => f a x + s.sum (fun b => f b x)) := by + simp [Finset.sum_insert, ha] + _ = volumeAverage U (f a + fun x => s.sum (fun b => f b x)) := by + rfl + _ = volumeAverage U (f a) + volumeAverage U (fun x => s.sum (fun b => f b x)) := by + rw [volumeAverage_add haInt hsumInt] + _ = volumeAverage U (f a) + s.sum (fun b => volumeAverage U (f b)) := by + rw [ih hsInt] + _ = (insert a s).sum (fun b => volumeAverage U (f b)) := by + simp [Finset.sum_insert, ha] + +theorem volumeAverage_const {d : ℕ} {U : Set (Vec d)} {c : ℝ} + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + volumeAverage U (fun _ => c) = c := by + unfold volumeAverage + rw [MeasureTheory.setIntegral_const, smul_eq_mul, MeasureTheory.measureReal_def] + calc + (MeasureTheory.volume U).toReal⁻¹ * ((MeasureTheory.volume U).toReal * c) + = ((MeasureTheory.volume U).toReal⁻¹ * (MeasureTheory.volume U).toReal) * c := by ring + _ = c := by rw [inv_mul_cancel₀ hvol, one_mul] + +theorem volumeAverage_vecDot_left {d : ℕ} {U : Set (Vec d)} (v : Vec d) (f : Vec d → Vec d) + (hf : ∀ i, MeasureTheory.IntegrableOn (fun x => f x i) U) : + volumeAverage U (fun x => vecDot v (f x)) = + vecDot v (fun i => volumeAverage U (fun x => f x i)) := by + have hsum : + ∀ i ∈ (Finset.univ : Finset (Fin d)), MeasureTheory.IntegrableOn (fun x => v i * f x i) U := by + intro i hi + simpa [MeasureTheory.IntegrableOn, smul_eq_mul] using! (hf i).integrable.smul (v i) + calc + volumeAverage U (fun x => vecDot v (f x)) + = volumeAverage U (fun x => ∑ i, v i * f x i) := by + simp [vecDot] + _ = ∑ i, volumeAverage U (fun x => v i * f x i) := by + rw [volumeAverage_sum (U := U) (s := Finset.univ) (f := fun i x => v i * f x i) hsum] + _ = ∑ i, v i * volumeAverage U (fun x => f x i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + simpa [smul_eq_mul] using! (volumeAverage_smul U (v i) (fun x => f x i)) + _ = vecDot v (fun i => volumeAverage U (fun x => f x i)) := by + simp [vecDot] + +theorem volumeAverage_vecDot_right {d : ℕ} {U : Set (Vec d)} (f : Vec d → Vec d) (v : Vec d) + (hf : ∀ i, MeasureTheory.IntegrableOn (fun x => f x i) U) : + volumeAverage U (fun x => vecDot (f x) v) = + vecDot (fun i => volumeAverage U (fun x => f x i)) v := by + calc + volumeAverage U (fun x => vecDot (f x) v) + = volumeAverage U (fun x => vecDot v (f x)) := by + congr with x + rw [vecDot_comm] + _ = vecDot v (fun i => volumeAverage U (fun x => f x i)) := + volumeAverage_vecDot_left (U := U) v f hf + _ = vecDot (fun i => volumeAverage U (fun x => f x i)) v := by + rw [vecDot_comm] + +theorem integrableOn_matVecMul_of_integrableOn_entries {d : ℕ} {U : Set (Vec d)} + {f : Vec d → Mat d} + (hf : ∀ i j, MeasureTheory.IntegrableOn (fun x => f x i j) U) (y : Vec d) : + ∀ i, MeasureTheory.IntegrableOn (fun x => matVecMul (f x) y i) U := by + intro i + simpa [MeasureTheory.IntegrableOn, matVecMul, mul_comm, mul_left_comm, mul_assoc] using + (MeasureTheory.integrable_finsetSum + (μ := MeasureTheory.Measure.restrict MeasureTheory.volume U) Finset.univ + (fun j _ => (hf i j).integrable.const_mul (y j))) + +theorem integrableOn_vecDot_matVecMul_of_integrableOn_entries {d : ℕ} {U : Set (Vec d)} + {f : Vec d → Mat d} + (hf : ∀ i j, MeasureTheory.IntegrableOn (fun x => f x i j) U) (x y : Vec d) : + MeasureTheory.IntegrableOn (fun z => vecDot x (matVecMul (f z) y)) U := by + simpa [MeasureTheory.IntegrableOn, vecDot] using + (MeasureTheory.integrable_finsetSum + (μ := MeasureTheory.Measure.restrict MeasureTheory.volume U) Finset.univ + (fun i _ => + ((integrableOn_matVecMul_of_integrableOn_entries hf y i).integrable).const_mul (x i))) + +theorem matVecMul_volumeAverageMat {d : ℕ} {U : Set (Vec d)} {f : Vec d → Mat d} + (hf : ∀ i j, MeasureTheory.IntegrableOn (fun x => f x i j) U) (y : Vec d) : + matVecMul (volumeAverageMat U f) y = + fun i => volumeAverage U (fun x => matVecMul (f x) y i) := by + funext i + calc + matVecMul (volumeAverageMat U f) y i + = ∑ j, volumeAverage U (fun x => f x i j) * y j := by + simp [volumeAverageMat, matVecMul] + _ = ∑ j, volumeAverage U (fun x => f x i j * y j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + calc + volumeAverage U (fun x => f x i j) * y j = + y j * volumeAverage U (fun x => f x i j) := by ring + _ = volumeAverage U (fun x => f x i j * y j) := by + rw [← show (y j • fun x => f x i j) = + (fun x => f x i j * y j) by + funext x + simp [Pi.smul_apply, smul_eq_mul, mul_comm]] + exact (volumeAverage_smul U (y j) (fun x => f x i j)).symm + _ = volumeAverage U (fun x => ∑ j, f x i j * y j) := by + symm + refine volumeAverage_sum (U := U) (s := Finset.univ) + (f := fun j x => f x i j * y j) ?_ + intro j hj + simpa [MeasureTheory.IntegrableOn, smul_eq_mul, mul_comm, mul_left_comm, mul_assoc] + using (hf i j).integrable.const_mul (y j) + _ = volumeAverage U (fun x => matVecMul (f x) y i) := by + simp [matVecMul] + +theorem vecDot_matVecMul_volumeAverageMat {d : ℕ} {U : Set (Vec d)} {f : Vec d → Mat d} + (hf : ∀ i j, MeasureTheory.IntegrableOn (fun x => f x i j) U) (x y : Vec d) : + vecDot x (matVecMul (volumeAverageMat U f) y) = + volumeAverage U (fun z => vecDot x (matVecMul (f z) y)) := by + rw [matVecMul_volumeAverageMat hf y] + symm + exact + volumeAverage_vecDot_left (U := U) x (fun z => matVecMul (f z) y) + (integrableOn_matVecMul_of_integrableOn_entries hf y) + +theorem volumeAverage_nonneg_of_nonneg_on {d : ℕ} {U : Set (Vec d)} {f : Vec d → ℝ} + (hU : MeasurableSet U) + (h_nonneg : ∀ x ∈ U, 0 ≤ f x) : + 0 ≤ volumeAverage U f := by + unfold volumeAverage + refine mul_nonneg ?_ ?_ + · exact inv_nonneg.mpr ENNReal.toReal_nonneg + · apply MeasureTheory.integral_nonneg_of_ae + exact (MeasureTheory.ae_restrict_iff' hU).2 (Filter.Eventually.of_forall h_nonneg) + +theorem volumeAverage_le_of_le_on {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {f : Vec d → ℝ} {c : ℝ} + (hU : MeasurableSet U) (hf : MeasureTheory.IntegrableOn f U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (h_le : ∀ x ∈ U, f x ≤ c) : + volumeAverage U f ≤ c := by + have hconst : MeasureTheory.IntegrableOn (fun _ : Vec d => c) U := by + exact MeasureTheory.integrable_const c + have hnonneg : + 0 ≤ volumeAverage U (fun x => c - f x) := by + apply volumeAverage_nonneg_of_nonneg_on hU + intro x hx + exact sub_nonneg.mpr (h_le x hx) + have hsub : + volumeAverage U (fun x => c - f x) = c - volumeAverage U f := by + rw [show (fun x => c - f x) = (fun _ : Vec d => c) - f by + funext x + simp] + rw [volumeAverage_sub hconst hf, volumeAverage_const hvol] + nlinarith [hnonneg, hsub] + +theorem symmPart_smul {d : ℕ} (c : ℝ) (A : Mat d) : + symmPart (c • A) = c • symmPart A := by + ext i j + simp [symmPart] + ring + +theorem vecDot_matVecMul_symmPart_comm {d : ℕ} (A : Mat d) (ξ η : Vec d) : + vecDot ξ (matVecMul (symmPart A) η) = vecDot η (matVecMul (symmPart A) ξ) := by + calc + vecDot ξ (matVecMul (symmPart A) η) + = vecDot ξ (matVecMul (matTranspose (symmPart A)) η) := by + simp + _ = vecDot (matVecMul (symmPart A) ξ) η := by + rw [vecDot_matVecMul_transpose] + _ = vecDot η (matVecMul (symmPart A) ξ) := by + rw [vecDot_comm] + +theorem half_vecDot_sub_polarization_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + (1 / 2 : ℝ) * vecDot ξ (matVecMul A ξ) + + (1 / 2 : ℝ) * vecDot η (matVecMul A η) - + (1 / 2 : ℝ) * vecDot (ξ - η) (matVecMul A (ξ - η)) = + vecDot η (matVecMul A ξ) := by + have hcomm := vecDot_matVecMul_comm_of_isSymm hA ξ η + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, vecDot_add_right, + vecDot_neg_left, vecDot_neg_right, hcomm] + ring + +theorem half_vecDot_sub_sub_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) (ξ η : Vec d) : + (1 / 2 : ℝ) * vecDot (ξ - η) (matVecMul A (ξ - η)) - + (1 / 2 : ℝ) * vecDot ξ (matVecMul A ξ) - + (1 / 2 : ℝ) * vecDot η (matVecMul A η) = + -vecDot η (matVecMul A ξ) := by + have h := half_vecDot_sub_polarization_of_isSymm hA ξ η + linarith + +namespace AHarmonicFunction + +instance {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : Zero (AHarmonicFunction a U) where + zero := + { toH1 := 0 + isHarmonic := isAHarmonicGradient_zero } + +instance {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : SMul ℝ (AHarmonicFunction a U) where + smul c u := + { toH1 := c • u.toH1 + isHarmonic := isAHarmonicGradient_smul u.isHarmonic c } + +@[simp] theorem toH1_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + (0 : AHarmonicFunction a U).toH1 = 0 := + rfl + +@[simp] theorem toH1_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (u : AHarmonicFunction a U) : + (c • u).toH1 = c • u.toH1 := + rfl + +@[simp] theorem grad_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + (0 : AHarmonicFunction a U).toH1.grad = 0 := + rfl + +@[simp] theorem grad_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (u : AHarmonicFunction a U) : + (c • u).toH1.grad = c • u.toH1.grad := + rfl + +def rescaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) (c : ℝ) : + AHarmonicFunction (c • a) U := + { toH1 := u.toH1 + isHarmonic := by + rcases u.isHarmonic with ⟨hpot, hsol⟩ + refine ⟨hpot, ?_⟩ + simpa [Pi.smul_apply, smul_matVecMul] using! isSolenoidalOn_smul hsol c } + +@[simp] theorem toH1_rescaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) (c : ℝ) : + (u.rescaleCoeff c).toH1 = u.toH1 := + rfl + +@[simp] theorem grad_rescaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) (c : ℝ) : + (u.rescaleCoeff c).toH1.grad = u.toH1.grad := + rfl + +def unscaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (hc : c ≠ 0) (u : AHarmonicFunction (c • a) U) : + AHarmonicFunction a U := + { toH1 := u.toH1 + isHarmonic := by + rcases u.isHarmonic with ⟨hpot, hsol⟩ + refine ⟨hpot, ?_⟩ + have hscaled := isSolenoidalOn_smul hsol c⁻¹ + have hscaled' : + IsSolenoidalOn U (fun x => c⁻¹ • matVecMul ((c • a) x) (u.toH1.grad x)) := by + simpa [Pi.smul_apply] using! hscaled + have hflux : + (fun x => c⁻¹ • matVecMul ((c • a) x) (u.toH1.grad x)) = + fun x => matVecMul (a x) (u.toH1.grad x) := by + funext x + simp [Pi.smul_apply, smul_matVecMul, smul_smul, hc] + rw [hflux] at hscaled' + exact hscaled' } + +@[simp] theorem toH1_unscaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (hc : c ≠ 0) (u : AHarmonicFunction (c • a) U) : + (u.unscaleCoeff c hc).toH1 = u.toH1 := + rfl + +@[simp] theorem grad_unscaleCoeff {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (hc : c ≠ 0) (u : AHarmonicFunction (c • a) U) : + (u.unscaleCoeff c hc).toH1.grad = u.toH1.grad := + rfl + +def subOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + AHarmonicFunction a U := + addSMulOfIntegrable u v hu_int hv_int (-1) + +@[simp] theorem toH1_subOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + (subOfIntegrable u v hu_int hv_int).toH1 = u.toH1 - v.toH1 := by + calc + (subOfIntegrable u v hu_int hv_int).toH1 = u.toH1 + (-1 : ℝ) • v.toH1 := by + simp [subOfIntegrable] + _ = u.toH1 - v.toH1 := by + rfl + +@[simp] theorem grad_subOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + (subOfIntegrable u v hu_int hv_int).toH1.grad = u.toH1.grad - v.toH1.grad := by + calc + (subOfIntegrable u v hu_int hv_int).toH1.grad = u.toH1.grad + (-1 : ℝ) • v.toH1.grad := by + rfl + _ = u.toH1.grad - v.toH1.grad := by + funext x + simp [sub_eq_add_neg] + +end AHarmonicFunction + +theorem scalarResponseIntegrand_eq_of_grad_eq {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {p q : Vec d} {u v : AHarmonicFunction a U} (hgrad : u.toH1.grad = v.toH1.grad) : + scalarResponseIntegrand U a p q u = scalarResponseIntegrand U a p q v := by + funext x + simp [scalarResponseIntegrand, hgrad] + +@[simp] theorem scalarResponseIntegrand_addConst {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (p q : Vec d) (u : AHarmonicFunction a U) (c : ℝ) : + scalarResponseIntegrand U a p q (u.addConst c) = scalarResponseIntegrand U a p q u := by + apply scalarResponseIntegrand_eq_of_grad_eq + funext x + simp + +@[simp] theorem scalarResponseIntegrand_normalizeMeanZero {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (p q : Vec d) (u : AHarmonicFunction a U) : + scalarResponseIntegrand U a p q u.normalizeMeanZero = scalarResponseIntegrand U a p q u := by + apply scalarResponseIntegrand_eq_of_grad_eq + funext x + simp + +@[simp] theorem scalarResponseIntegrand_zero {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) : + scalarResponseIntegrand U a p q (0 : AHarmonicFunction a U) = 0 := by + funext x + change + -((1 / 2 : ℝ) * vecDot (0 : Vec d) (matVecMul (symmPart (a x)) (0 : Vec d))) - + vecDot p (matVecMul (a x) (0 : Vec d)) + + vecDot q (0 : Vec d) = 0 + simp [vecDot_zero_right, matVecMul_zero] + +theorem scalarResponseIntegrand_smul {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (c : ℝ) (p q : Vec d) (u : AHarmonicFunction a U) : + scalarResponseIntegrand U a (c • p) (c • q) (c • u) = + fun x => c ^ 2 * scalarResponseIntegrand U a p q u x := by + funext x + change + -((1 / 2 : ℝ) * vecDot (c • u.toH1.grad x) + (matVecMul (symmPart (a x)) (c • u.toH1.grad x))) - + vecDot (c • p) (matVecMul (a x) (c • u.toH1.grad x)) + + vecDot (c • q) (c • u.toH1.grad x) = + c ^ 2 * + (-((1 / 2 : ℝ) * vecDot (u.toH1.grad x) + (matVecMul (symmPart (a x)) (u.toH1.grad x))) - + vecDot p (matVecMul (a x) (u.toH1.grad x)) + + vecDot q (u.toH1.grad x)) + simp [matVecMul_smul, vecDot_smul_left, vecDot_smul_right, pow_two] + ring + +theorem volumeAverage_scalarResponseIntegrand_smul {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (c : ℝ) (p q : Vec d) (u : AHarmonicFunction a U) : + volumeAverage U (scalarResponseIntegrand U a (c • p) (c • q) (c • u)) = + c ^ 2 * volumeAverage U (scalarResponseIntegrand U a p q u) := by + unfold volumeAverage + rw [scalarResponseIntegrand_smul] + rw [show (fun x => c ^ 2 * scalarResponseIntegrand U a p q u x) = + fun x => c ^ 2 • scalarResponseIntegrand U a p q u x by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +noncomputable def scalarFirstVariationIntegrand {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (u w : AHarmonicFunction a U) : Vec d → ℝ := + fun x => + vecDot q (w.toH1.grad x) + - vecDot p (matVecMul (a x) (w.toH1.grad x)) + - vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) + +noncomputable def scalarVariationEnergyIntegrand {d : ℕ} (a : CoeffField d) + {U : Set (Vec d)} (w : AHarmonicFunction a U) : Vec d → ℝ := + fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (w.toH1.grad x)) + +theorem scalarVariationEnergyIntegrand_smul {d : ℕ} (a : CoeffField d) + {U : Set (Vec d)} (c : ℝ) (w : AHarmonicFunction a U) : + scalarVariationEnergyIntegrand a (c • w) = + fun x => c ^ 2 * scalarVariationEnergyIntegrand a w x := by + funext x + change + vecDot (c • w.toH1.grad x) (matVecMul (symmPart (a x)) (c • w.toH1.grad x)) = + c ^ 2 * vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (w.toH1.grad x)) + rw [matVecMul_smul, vecDot_smul_left, vecDot_smul_right] + ring + +theorem volumeAverage_scalarVariationEnergyIntegrand_smul {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (c : ℝ) (w : AHarmonicFunction a U) : + volumeAverage U (scalarVariationEnergyIntegrand a (c • w)) = + c ^ 2 * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + unfold volumeAverage + rw [scalarVariationEnergyIntegrand_smul] + rw [show (fun x => c ^ 2 * scalarVariationEnergyIntegrand a w x) = + fun x => c ^ 2 • scalarVariationEnergyIntegrand a w x by + funext x + simp [smul_eq_mul]] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul, mul_assoc, mul_comm] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Ellipticity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Ellipticity.lean new file mode 100644 index 0000000000..14697b4be1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Ellipticity.lean @@ -0,0 +1,531 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Maximizer + +/-! # Ellipticity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Ellipticity-driven response bounds + +Variation-energy arithmetic on `subOfIntegrable`, +`scalarResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn` (the main +Young-inequality estimate), and the `responseJ` supremum structure under +ellipticity assumptions. +-/ + +/-- Young's inequality in the form `u^2 ≤ A*B ⇒ |u| ≤ A/2 + B/2` for non-negative +`A, B`. Used twice inside the plain upper-bound proof to avoid repeating the +same nlinarith chain. -/ +private theorem young_abs_of_sq_le {u A B : ℝ} + (hu_sq : u ^ 2 ≤ A * B) (hA : 0 ≤ A) (hB : 0 ≤ B) : + |u| ≤ A / 2 + B / 2 := by + have habsSq : |u| ^ 2 ≤ A * B := by simpa [sq_abs] using hu_sq + have hsumSq : (2 * |u|) ^ 2 ≤ (A + B) ^ 2 := by + have h0 : 0 ≤ (A - B) ^ 2 := sq_nonneg _ + nlinarith [habsSq, h0] + have hsum_nonneg : 0 ≤ A + B := add_nonneg hA hB + have habs2u : 2 * |u| ≤ A + B := le_of_sq_le_sq hsumSq hsum_nonneg + linarith + +theorem scalarVariationEnergyIntegrand_subOfIntegrable {d : ℕ} (a : CoeffField d) + {U : Set (Vec d)} (u u' : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hu'_int : weakFluxIntegrable U a u') : + scalarVariationEnergyIntegrand a (AHarmonicFunction.subOfIntegrable u u' hu_int hu'_int) = + scalarVariationEnergyIntegrand a u + scalarVariationEnergyIntegrand a u' + - (2 : ℝ) • + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + funext x + have hsymm : + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u'.toH1.grad x)) = + vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) := by + simpa using vecDot_matVecMul_symmPart_comm (a x) (u.toH1.grad x) (u'.toH1.grad x) + unfold scalarVariationEnergyIntegrand + rw [AHarmonicFunction.grad_subOfIntegrable] + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, vecDot_add_right, + vecDot_neg_left, vecDot_neg_right, smul_eq_mul, hsymm] + ring + +theorem volumeAverage_scalarVariationEnergyIntegrand_subOfIntegrable {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (hInt : ResponseLinearIntegrabilityData U a) + (u u' : AHarmonicFunction a U) : + volumeAverage U (scalarVariationEnergyIntegrand a + (AHarmonicFunction.subOfIntegrable u u' (hInt.weakFlux u) (hInt.weakFlux u'))) = + volumeAverage U (scalarVariationEnergyIntegrand a u) + + volumeAverage U (scalarVariationEnergyIntegrand a u') - + 2 * volumeAverage U + (fun x => vecDot (u'.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + rw [scalarVariationEnergyIntegrand_subOfIntegrable a u u' (hInt.weakFlux u) (hInt.weakFlux u')] + have hsum : + MeasureTheory.IntegrableOn + (scalarVariationEnergyIntegrand a u + scalarVariationEnergyIntegrand a u') U := by + simpa [MeasureTheory.IntegrableOn] using + (hInt.energy u).integrable.add (hInt.energy u').integrable + rw [volumeAverage_sub hsum] + · rw [volumeAverage_add (hInt.energy u) (hInt.energy u')] + rw [volumeAverage_smul] + · simpa [MeasureTheory.IntegrableOn] using (hInt.cross u u').integrable.smul (2 : ℝ) + +theorem basic_cg_identities_second_variation_line_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarResponseIntegrand U a p q (scalarPerturbation u w t hu_int hw_int)) = + volumeAverage U (scalarResponseIntegrand U a p q u) + - ((t ^ 2) / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + rw [volumeAverage_scalarResponseIntegrand_scalarPerturbation U a p q u w t + hu_int hw_int hresp_u hlin henergy] + rw [basic_cg_identities_first_variation_of_isResponseMaximizer U a p q u hmax w + hu_int hw_int hresp_u hlin henergy] + ring + +theorem basic_cg_identities_second_variation_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarResponseIntegrand U a p q (scalarPerturbation u w 1 hu_int hw_int)) = + volumeAverage U (scalarResponseIntegrand U a p q u) + - (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + simpa using basic_cg_identities_second_variation_line_of_isResponseMaximizer + U a p q u hmax w 1 hu_int hw_int hresp_u hlin henergy + +theorem scalarResponseIntegrand_eq_firstVariation_self_add_half_energy {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) : + scalarResponseIntegrand U a p q u = + scalarFirstVariationIntegrand U a p q u u + + ((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u) := by + funext x + simp [scalarResponseIntegrand, scalarFirstVariationIntegrand, scalarVariationEnergyIntegrand, + smul_eq_mul] + ring + +theorem volumeAverage_scalarResponseIntegrand_eq_firstVariation_self_add_half_energy {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hlin_self : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u u) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) U) : + volumeAverage U (scalarResponseIntegrand U a p q u) = + volumeAverage U (scalarFirstVariationIntegrand U a p q u u) + + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) := by + unfold volumeAverage + rw [scalarResponseIntegrand_eq_firstVariation_self_add_half_energy] + have hhalf_energy : + MeasureTheory.IntegrableOn (((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u)) U := by + simpa [MeasureTheory.IntegrableOn] using (henergy.integrable.smul (1 / 2 : ℝ)) + rw [show + (fun x => + (scalarFirstVariationIntegrand U a p q u u + ((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u)) + x) = + fun x => + scalarFirstVariationIntegrand U a p q u u x + + (((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u) x) by + funext x + simp] + rw [MeasureTheory.integral_add hlin_self hhalf_energy] + rw [show + (fun x => (((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u) x)) = + fun x => (1 / 2 : ℝ) • scalarVariationEnergyIntegrand a u x by + funext x + simp] + rw [MeasureTheory.integral_smul] + simp [smul_eq_mul] + ring + +theorem basic_cg_identities_energy_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hu_int : weakFluxIntegrable U a u) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin_self : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u u) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) U) : + volumeAverage U (scalarResponseIntegrand U a p q u) = + (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) := by + have hfirst := + basic_cg_identities_first_variation_of_isResponseMaximizer + U a p q u hmax u hu_int hu_int hresp_u hlin_self henergy + rw [volumeAverage_scalarResponseIntegrand_eq_firstVariation_self_add_half_energy + U a p q u hlin_self henergy] + rw [hfirst] + ring + +theorem responseJValueSet_mem {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) + (u : AHarmonicFunction a U) : + volumeAverage U (scalarResponseIntegrand U a p q u) ∈ responseJValueSet U p q a := + ⟨u, rfl⟩ + +theorem responseJValueSet_zero_mem {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + 0 ∈ responseJValueSet U p q a := by + refine ⟨0, ?_⟩ + simp + +theorem responseJValueSet_nonempty {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + (responseJValueSet U p q a).Nonempty := + ⟨0, responseJValueSet_zero_mem U p q a⟩ + +def responseJValueSetMeanZero {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + Set ℝ := + {m | ∃ u : AHarmonicFunctionMeanZero a U, + volumeAverage U (scalarResponseIntegrand U a p q (u : AHarmonicFunction a U)) = m} + +theorem responseJValueSetMeanZero_mem {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} (u : AHarmonicFunctionMeanZero a U) : + volumeAverage U (scalarResponseIntegrand U a p q (u : AHarmonicFunction a U)) ∈ + responseJValueSetMeanZero U p q a := + ⟨u, rfl⟩ + +theorem responseJValueSet_eq_responseJValueSetMeanZero {d : ℕ} {U : Set (Vec d)} + {p q : Vec d} {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + responseJValueSet U p q a = responseJValueSetMeanZero U p q a := by + ext m + constructor + · rintro ⟨u, rfl⟩ + refine ⟨u.toMeanZero, ?_⟩ + simp + · rintro ⟨u, rfl⟩ + exact responseJValueSet_mem U p q a (u : AHarmonicFunction a U) + +theorem responseJ_eq_sSup_responseJValueSetMeanZero {d : ℕ} {U : Set (Vec d)} + {p q : Vec d} {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + ResponseJ U p q a = sSup (responseJValueSetMeanZero U p q a) := by + rw [ResponseJ, responseJValueSet_eq_responseJValueSetMeanZero] + +theorem responseJ_nonneg {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + 0 ≤ ResponseJ U p q a := by + unfold ResponseJ + exact Real.sSup_nonneg' ⟨0, responseJValueSet_zero_mem U p q a, le_rfl⟩ + +theorem responseJValueSet_smul_mem {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} {m : ℝ} (hm : m ∈ responseJValueSet U p q a) (c : ℝ) : + c ^ 2 * m ∈ responseJValueSet U (c • p) (c • q) a := by + rcases hm with ⟨u, rfl⟩ + refine ⟨c • u, ?_⟩ + exact (volumeAverage_scalarResponseIntegrand_smul U a c p q u).symm + +theorem responseJValueSet_homogeneous {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + responseJValueSet U (c • p) (c • q) a = (c ^ 2 : ℝ) • responseJValueSet U p q a := by + ext m + constructor + · intro hm + change ∃ y, y ∈ responseJValueSet U p q a ∧ (c ^ 2 : ℝ) * y = m + have hm' : + (c⁻¹ : ℝ) ^ 2 * m ∈ responseJValueSet U p q a := by + simpa [smul_smul, hc, pow_two] using + (responseJValueSet_smul_mem (p := c • p) (q := c • q) hm c⁻¹) + refine ⟨(c⁻¹ : ℝ) ^ 2 * m, hm', ?_⟩ + field_simp [hc] + · rintro ⟨m', hm', rfl⟩ + simpa [smul_eq_mul] using responseJValueSet_smul_mem hm' c + +theorem responseJ_homogeneous {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + ResponseJ U (c • p) (c • q) a = c ^ 2 * ResponseJ U p q a := by + rw [ResponseJ, responseJValueSet_homogeneous U p q a hc] + simpa [smul_eq_mul] using! + (Real.sSup_smul_of_nonneg (show 0 ≤ (c ^ 2 : ℝ) by positivity) (responseJValueSet U p q a)) + +theorem responseJ_homogeneous_zero_left {d : ℕ} (U : Set (Vec d)) (q : Vec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + ResponseJ U 0 (c • q) a = c ^ 2 * ResponseJ U 0 q a := by + simpa using responseJ_homogeneous U 0 q a hc + +theorem responseJ_homogeneous_zero_right {d : ℕ} (U : Set (Vec d)) (p : Vec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + ResponseJ U (c • p) 0 a = c ^ 2 * ResponseJ U p 0 a := by + simpa using responseJ_homogeneous U p 0 a hc + +theorem scalarResponseIntegrand_rescaleCoeff_sq {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (c : ℝ) (hc : c ≠ 0) (u : AHarmonicFunction a U) : + scalarResponseIntegrand U ((c ^ 2) • a) p q + (((c⁻¹) • u).rescaleCoeff (c ^ 2)) = + scalarResponseIntegrand U a (c • p) (c⁻¹ • q) u := by + funext x + change + -((1 / 2 : ℝ) * vecDot ((c⁻¹) • u.toH1.grad x) + (matVecMul (symmPart (((c ^ 2) • a) x)) ((c⁻¹) • u.toH1.grad x))) - + vecDot p (matVecMul (((c ^ 2) • a) x) ((c⁻¹) • u.toH1.grad x)) + + vecDot q ((c⁻¹) • u.toH1.grad x) = + -((1 / 2 : ℝ) * vecDot (u.toH1.grad x) + (matVecMul (symmPart (a x)) (u.toH1.grad x))) - + vecDot (c • p) (matVecMul (a x) (u.toH1.grad x)) + + vecDot (c⁻¹ • q) (u.toH1.grad x) + simp [Pi.smul_apply, symmPart_smul, smul_matVecMul, matVecMul_smul, vecDot_smul_left, + vecDot_smul_right] + field_simp [hc] + +theorem scalarResponseIntegrand_unscaleCoeff_sq {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (c : ℝ) (hc : c ≠ 0) (u : AHarmonicFunction ((c ^ 2) • a) U) : + scalarResponseIntegrand U ((c ^ 2) • a) p q u = + scalarResponseIntegrand U a (c • p) (c⁻¹ • q) + (c • (u.unscaleCoeff (c ^ 2) (pow_ne_zero 2 hc))) := by + funext x + change + -((1 / 2 : ℝ) * vecDot (u.toH1.grad x) + (matVecMul (symmPart (((c ^ 2) • a) x)) (u.toH1.grad x))) - + vecDot p (matVecMul (((c ^ 2) • a) x) (u.toH1.grad x)) + + vecDot q (u.toH1.grad x) = + -((1 / 2 : ℝ) * vecDot (c • u.toH1.grad x) + (matVecMul (symmPart (a x)) (c • u.toH1.grad x))) - + vecDot (c • p) (matVecMul (a x) (c • u.toH1.grad x)) + + vecDot (c⁻¹ • q) (c • u.toH1.grad x) + simp [Pi.smul_apply, symmPart_smul, smul_matVecMul, matVecMul_smul, vecDot_smul_left, + vecDot_smul_right, hc] + ring_nf + +theorem responseJValueSet_rescaleCoeff_sq_eq {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) (c : ℝ) (hc : c ≠ 0) : + responseJValueSet U p q ((c ^ 2) • a) = + responseJValueSet U (c • p) (c⁻¹ • q) a := by + ext m + constructor + · rintro ⟨u, rfl⟩ + refine ⟨c • (u.unscaleCoeff (c ^ 2) (pow_ne_zero 2 hc)), ?_⟩ + exact congrArg (volumeAverage U) (scalarResponseIntegrand_unscaleCoeff_sq U a p q c hc u) + · rintro ⟨u, rfl⟩ + refine ⟨((c⁻¹) • u).rescaleCoeff (c ^ 2), ?_⟩ + exact (congrArg (volumeAverage U) (scalarResponseIntegrand_rescaleCoeff_sq U a p q c hc u)).symm + +theorem responseJ_homogeneous_coeffField_sq {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) (c : ℝ) (hc : c ≠ 0) : + ResponseJ U p q ((c ^ 2) • a) = ResponseJ U (c • p) (c⁻¹ • q) a := by + simp [ResponseJ, responseJValueSet_rescaleCoeff_sq_eq U p q a c hc] + +theorem responseJ_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) {lam : ℝ} (hlam : 0 < lam) : + ResponseJ U p q (lam • a) = ResponseJ U (Real.sqrt lam • p) ((Real.sqrt lam)⁻¹ • q) a := by + have hsqrt : Real.sqrt lam ≠ 0 := Real.sqrt_ne_zero'.mpr hlam + simpa [Real.sq_sqrt (le_of_lt hlam)] using + responseJ_homogeneous_coeffField_sq U p q a (Real.sqrt lam) hsqrt + +theorem scalarResponseIntegrand_integrableOn_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) (u : AHarmonicFunction a U) : + MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U := + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll).response p q u + +theorem scalarResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) (u : AHarmonicFunction a U) : + ∀ x ∈ U, + scalarResponseIntegrand U a p q u x ≤ + lam⁻¹ * (Lam ^ 2 * vecNormSq p + vecNormSq q) := by + intro x hx + let ξ : Vec d := u.toH1.grad x + have hgrad_nonneg : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + have hlam_pos : 0 < lam := (hEll.2 x hx).1 + have hlam_nonneg : 0 ≤ lam := le_of_lt hlam_pos + have hlamInv_nonneg : 0 ≤ lam⁻¹ := by positivity + have henergy : + lam * vecNormSq ξ ≤ vecDot ξ (matVecMul (symmPart (a x)) ξ) := + lowerBound_symmPart_of_isEllipticMatrix (hEll.2 x hx) ξ + have hpSq : + vecDot p (matVecMul (a x) ξ) ^ 2 ≤ Lam ^ 2 * vecNormSq p * vecNormSq ξ := by + have hcs : + vecDot p (matVecMul (a x) ξ) ^ 2 ≤ + vecNormSq p * vecNormSq (matVecMul (a x) ξ) := + sq_vecDot_le_vecNormSq_mul_vecNormSq p (matVecMul (a x) ξ) + have hnorm : + vecNormSq (matVecMul (a x) ξ) ≤ Lam ^ 2 * vecNormSq ξ := + vecNormSq_matVecMul_le_of_isEllipticMatrix (hEll.2 x hx) ξ + have hmul : + vecNormSq p * vecNormSq (matVecMul (a x) ξ) ≤ + vecNormSq p * (Lam ^ 2 * vecNormSq ξ) := by + exact mul_le_mul_of_nonneg_left hnorm (vecNormSq_nonneg p) + exact le_trans hcs (by simpa [mul_assoc, mul_left_comm, mul_comm] using hmul) + have hpYoung : + |vecDot p (matVecMul (a x) ξ)| ≤ + lam⁻¹ * Lam ^ 2 * vecNormSq p + (lam / 4 : ℝ) * vecNormSq ξ := by + let A : ℝ := 2 * lam⁻¹ * Lam ^ 2 * vecNormSq p + let B : ℝ := (lam / 2 : ℝ) * vecNormSq ξ + have hAB_rhs : A / 2 + B / 2 = + lam⁻¹ * Lam ^ 2 * vecNormSq p + (lam / 4 : ℝ) * vecNormSq ξ := by + show (2 * lam⁻¹ * Lam ^ 2 * vecNormSq p) / 2 + + ((lam / 2 : ℝ) * vecNormSq ξ) / 2 = _ + ring + have hAB_eq : A * B = Lam ^ 2 * vecNormSq p * vecNormSq ξ := by + show (2 * lam⁻¹ * Lam ^ 2 * vecNormSq p) * ((lam / 2 : ℝ) * vecNormSq ξ) = + Lam ^ 2 * vecNormSq p * vecNormSq ξ + field_simp [hlam_pos.ne'] + have hsq : vecDot p (matVecMul (a x) ξ) ^ 2 ≤ A * B := hpSq.trans_eq hAB_eq.symm + have hA_nonneg : 0 ≤ A := + mul_nonneg (by positivity) (vecNormSq_nonneg p) + have hB_nonneg : 0 ≤ B := + mul_nonneg (by positivity) hgrad_nonneg + exact (young_abs_of_sq_le hsq hA_nonneg hB_nonneg).trans_eq hAB_rhs + have hqSq : + vecDot q ξ ^ 2 ≤ vecNormSq q * vecNormSq ξ := + sq_vecDot_le_vecNormSq_mul_vecNormSq q ξ + have hqYoung : + |vecDot q ξ| ≤ + lam⁻¹ * vecNormSq q + (lam / 4 : ℝ) * vecNormSq ξ := by + let A : ℝ := 2 * lam⁻¹ * vecNormSq q + let B : ℝ := (lam / 2 : ℝ) * vecNormSq ξ + have hAB_rhs : A / 2 + B / 2 = + lam⁻¹ * vecNormSq q + (lam / 4 : ℝ) * vecNormSq ξ := by + show (2 * lam⁻¹ * vecNormSq q) / 2 + + ((lam / 2 : ℝ) * vecNormSq ξ) / 2 = _ + ring + have hAB_eq : A * B = vecNormSq q * vecNormSq ξ := by + show (2 * lam⁻¹ * vecNormSq q) * ((lam / 2 : ℝ) * vecNormSq ξ) = + vecNormSq q * vecNormSq ξ + field_simp [hlam_pos.ne'] + have hsq : vecDot q ξ ^ 2 ≤ A * B := hqSq.trans_eq hAB_eq.symm + have hA_nonneg : 0 ≤ A := + mul_nonneg (by positivity) (vecNormSq_nonneg q) + have hB_nonneg : 0 ≤ B := + mul_nonneg (by positivity) hgrad_nonneg + exact (young_abs_of_sq_le hsq hA_nonneg hB_nonneg).trans_eq hAB_rhs + have hpAbs : + -vecDot p (matVecMul (a x) ξ) ≤ + lam⁻¹ * Lam ^ 2 * vecNormSq p + (lam / 4 : ℝ) * vecNormSq ξ := by + calc + -vecDot p (matVecMul (a x) ξ) ≤ |vecDot p (matVecMul (a x) ξ)| := by + exact neg_le_abs _ + _ ≤ lam⁻¹ * Lam ^ 2 * vecNormSq p + (lam / 4 : ℝ) * vecNormSq ξ := hpYoung + have hqAbs : + vecDot q ξ ≤ lam⁻¹ * vecNormSq q + (lam / 4 : ℝ) * vecNormSq ξ := by + calc + vecDot q ξ ≤ |vecDot q ξ| := le_abs_self _ + _ ≤ lam⁻¹ * vecNormSq q + (lam / 4 : ℝ) * vecNormSq ξ := hqYoung + unfold scalarResponseIntegrand + nlinarith + +theorem responseJValueSet_bddAbove_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q : Vec d) : + BddAbove (responseJValueSet U p q a) := by + refine ⟨lam⁻¹ * (Lam ^ 2 * vecNormSq p + vecNormSq q), ?_⟩ + rintro m ⟨u, rfl⟩ + refine volumeAverage_le_of_le_on (measurableSet_of_isEllipticFieldOn hEll) + (scalarResponseIntegrand_integrableOn_of_isEllipticFieldOn hEll p q u) hvol ?_ + exact scalarResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn hEll p q u + +theorem le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q : Vec d) {m : ℝ} (hm : m ∈ responseJValueSet U p q a) : + m ≤ ResponseJ U p q a := by + unfold ResponseJ + exact le_csSup (responseJValueSet_bddAbove_of_isEllipticFieldOn hEll hvol p q) hm + +theorem responseJValueSet_bddAbove_of_isResponseMaximizer {d : ℕ} (U : Set (Vec d)) + (p q : Vec d) (a : CoeffField d) {u : AHarmonicFunction a U} + (hmax : IsResponseMaximizer U p q a u) : + BddAbove (responseJValueSet U p q a) := by + refine ⟨volumeAverage U (scalarResponseIntegrand U a p q u), ?_⟩ + rintro m ⟨w, rfl⟩ + exact hmax w + +theorem responseJValueSet_isGreatest_of_isResponseMaximizer {d : ℕ} (U : Set (Vec d)) + (p q : Vec d) (a : CoeffField d) {u : AHarmonicFunction a U} + (hmax : IsResponseMaximizer U p q a u) : + IsGreatest (responseJValueSet U p q a) + (volumeAverage U (scalarResponseIntegrand U a p q u)) := by + refine ⟨responseJValueSet_mem U p q a u, ?_⟩ + intro m hm + rcases hm with ⟨w, rfl⟩ + exact hmax w + +theorem responseJ_eq_of_isResponseMaximizer {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) {u : AHarmonicFunction a U} (hmax : IsResponseMaximizer U p q a u) : + ResponseJ U p q a = volumeAverage U (scalarResponseIntegrand U a p q u) := by + simpa [ResponseJ] using + (responseJValueSet_isGreatest_of_isResponseMaximizer U p q a hmax).csSup_eq + +theorem responseJ_first_variation_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0 := by + exact basic_cg_identities_first_variation_of_isResponseMaximizer + U a p q u hmax w hu_int hw_int hresp_u hlin henergy + +theorem responseJ_second_variation_line_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarResponseIntegrand U a p q (scalarPerturbation u w t hu_int hw_int)) = + ResponseJ U p q a - ((t ^ 2) / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + rw [responseJ_eq_of_isResponseMaximizer U p q a hmax] + exact basic_cg_identities_second_variation_line_of_isResponseMaximizer + U a p q u hmax w t hu_int hw_int hresp_u hlin henergy + +theorem responseJ_second_variation_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarResponseIntegrand U a p q (scalarPerturbation u w 1 hu_int hw_int)) = + ResponseJ U p q a - (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + rw [responseJ_eq_of_isResponseMaximizer U p q a hmax] + exact basic_cg_identities_second_variation_of_isResponseMaximizer + U a p q u hmax w hu_int hw_int hresp_u hlin henergy + +theorem responseJ_energy_of_isResponseMaximizer {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) + (hu_int : weakFluxIntegrable U a u) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin_self : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u u) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) U) : + ResponseJ U p q a = (1 / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a u) := by + rw [responseJ_eq_of_isResponseMaximizer U p q a hmax] + exact basic_cg_identities_energy_of_isResponseMaximizer + U a p q u hmax hu_int hresp_u hlin_self henergy + +theorem scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (w : AHarmonicFunction a U) : + ∀ x ∈ U, 0 ≤ scalarVariationEnergyIntegrand a w x := by + intro x hx + unfold scalarVariationEnergyIntegrand + rcases hEll with ⟨_, hEllPt⟩ + have hlower := lowerBound_symmPart_of_isEllipticMatrix (hEllPt x hx) (w.toH1.grad x) + have hnorm_nonneg : 0 ≤ vecNormSq (w.toH1.grad x) := vecNormSq_nonneg (w.toH1.grad x) + have hlam_nonneg : 0 ≤ lam := le_of_lt (hEllPt x hx).1 + nlinarith + +theorem volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (w : AHarmonicFunction a U) : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a w) := by + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + exact scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn U a hEll w + + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Maximizer.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Maximizer.lean new file mode 100644 index 0000000000..1930b72d11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Foundations/Maximizer.lean @@ -0,0 +1,634 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Algebra + +/-! # Maximizer -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +# Response maximizer identities + +`ResponseLinearIntegrabilityData`, `IsResponseMaximizer`, +`ScalarCanonicalMaximizer`, and the basic coarse-graining identities +(`basic_cg_identities_first_variation_*`, `basic_cg_identities_sub_*`). +-/ + +structure ResponseLinearIntegrabilityData {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) : Prop where + weakFlux : ∀ u : AHarmonicFunction a U, weakFluxIntegrable U a u + grad : + ∀ (q : Vec d) (u : AHarmonicFunction a U), + MeasureTheory.IntegrableOn (fun x => vecDot q (u.toH1.grad x)) U + flux : + ∀ (p : Vec d) (u : AHarmonicFunction a U), + MeasureTheory.IntegrableOn (fun x => vecDot p (matVecMul (a x) (u.toH1.grad x))) U + cross : + ∀ (u w : AHarmonicFunction a U), + MeasureTheory.IntegrableOn + (fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) U + +namespace ResponseLinearIntegrabilityData + +theorem of_isEllipticFieldOn {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) : + ResponseLinearIntegrabilityData U a := by + refine ⟨?_, ?_, ?_, ?_⟩ + · intro u φ + have hflux : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + exact CorrectionFieldData.integrableOn_vecDot_of_memVectorL2 hflux + φ.toH1Function.grad_memVectorL2 + · intro q u + exact CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 q + u.toH1.grad_memVectorL2 + · intro p u + have hflux : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + exact CorrectionFieldData.integrableOn_vecDot_const_left_of_memVectorL2 p hflux + · intro u w + have huFlux : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + have hwFlux : + MemVectorL2 U (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have hterm1 : + MeasureTheory.IntegrableOn + (fun x => vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x))) U := + CorrectionFieldData.integrableOn_vecDot_of_memVectorL2 w.toH1.grad_memVectorL2 huFlux + have hterm2 : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x))) U := + CorrectionFieldData.integrableOn_vecDot_of_memVectorL2 u.toH1.grad_memVectorL2 hwFlux + have hsum : + MeasureTheory.IntegrableOn + ((fun x => vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x))) + + fun x => vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x))) U := by + simpa [MeasureTheory.IntegrableOn] using hterm1.integrable.add hterm2.integrable + have hhalf : + MeasureTheory.IntegrableOn + ((1 / 2 : ℝ) • + ((fun x => vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x))) + + fun x => vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x)))) U := by + simpa [MeasureTheory.IntegrableOn] using hsum.integrable.smul (1 / 2 : ℝ) + have hdecomp : + (fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + ((1 / 2 : ℝ) • + ((fun x => vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x))) + + fun x => vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x)))) := by + funext x + calc + vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) = + (1 / 2 : ℝ) * + (vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) + + vecDot (w.toH1.grad x) (matVecMul (matTranspose (a x)) (u.toH1.grad x))) := by + rw [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, + vecDot_smul_right, vecDot_add_right] + _ = (1 / 2 : ℝ) * + (vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x)) + + vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x))) := by + have htranspose : + vecDot (w.toH1.grad x) (matVecMul (matTranspose (a x)) (u.toH1.grad x)) = + vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x)) := by + calc + vecDot (w.toH1.grad x) (matVecMul (matTranspose (a x)) (u.toH1.grad x)) = + vecDot (matVecMul (a x) (w.toH1.grad x)) (u.toH1.grad x) := by + rw [vecDot_matVecMul_transpose] + _ = vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x)) := by + rw [vecDot_comm] + rw [htranspose] + _ = ((1 / 2 : ℝ) • + ((fun x => vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1.grad x))) + + fun x => vecDot (u.toH1.grad x) (matVecMul (a x) (w.toH1.grad x)))) x := by + rfl + rw [hdecomp] + exact hhalf + +theorem energy {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hInt : ResponseLinearIntegrabilityData U a) (w : AHarmonicFunction a U) : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U := by + simpa [scalarVariationEnergyIntegrand] using! hInt.cross w w + +theorem firstVariation {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hInt : ResponseLinearIntegrabilityData U a) (p q : Vec d) + (u w : AHarmonicFunction a U) : + MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U := by + have hgrad := hInt.grad q w + have hflux := hInt.flux p w + have hcross := hInt.cross u w + have hsub : + MeasureTheory.IntegrableOn + (fun x => vecDot q (w.toH1.grad x) - vecDot p (matVecMul (a x) (w.toH1.grad x))) U := by + simpa [sub_eq_add_neg, MeasureTheory.IntegrableOn] using! + hgrad.integrable.sub hflux.integrable + simpa [scalarFirstVariationIntegrand, sub_eq_add_neg, MeasureTheory.IntegrableOn] using! + hsub.integrable.sub hcross.integrable + +theorem response {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (hInt : ResponseLinearIntegrabilityData U a) (p q : Vec d) (u : AHarmonicFunction a U) : + MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U := by + have henergy := hInt.energy u + have hflux := hInt.flux p u + have hgrad := hInt.grad q u + have hhalf_energy : + MeasureTheory.IntegrableOn (((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a u)) U := by + simpa [MeasureTheory.IntegrableOn] using henergy.integrable.smul (-(1 / 2 : ℝ)) + have hsub : + MeasureTheory.IntegrableOn + (((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a u) - + fun x => vecDot p (matVecMul (a x) (u.toH1.grad x))) U := by + simpa [MeasureTheory.IntegrableOn] using hhalf_energy.integrable.sub hflux.integrable + have hdecomp : + scalarResponseIntegrand U a p q u = + (((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a u) - + fun x => vecDot p (matVecMul (a x) (u.toH1.grad x))) + + fun x => vecDot q (u.toH1.grad x) := by + funext x + simp [scalarResponseIntegrand, scalarVariationEnergyIntegrand, sub_eq_add_neg, smul_eq_mul] + rw [hdecomp] + simpa [MeasureTheory.IntegrableOn] using + hsub.integrable.add hgrad.integrable + +end ResponseLinearIntegrabilityData + +def IsResponseMaximizer {d : ℕ} (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) + (u : AHarmonicFunction a U) : Prop := + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarResponseIntegrand U a p q w) ≤ + volumeAverage U (scalarResponseIntegrand U a p q u) + +namespace IsResponseMaximizer + +theorem addConst {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : AHarmonicFunction a U} (hmax : IsResponseMaximizer U p q a u) (c : ℝ) : + IsResponseMaximizer U p q a (u.addConst c) := by + intro w + simpa using hmax w + +theorem normalizeMeanZero {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : AHarmonicFunction a U} (hmax : IsResponseMaximizer U p q a u) : + IsResponseMaximizer U p q a u.normalizeMeanZero := by + intro w + simpa using hmax w + +end IsResponseMaximizer + +structure ScalarCanonicalMaximizer {d : ℕ} (U : Set (Vec d)) (p q : Vec d) + (a : CoeffField d) where + toAHarmonicFunctionMeanZero : AHarmonicFunctionMeanZero a U + isMaximizer : IsResponseMaximizer U p q a toAHarmonicFunctionMeanZero + +namespace ScalarCanonicalMaximizer + +instance {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} : + CoeOut (ScalarCanonicalMaximizer U p q a) (AHarmonicFunctionMeanZero a U) where + coe v := v.toAHarmonicFunctionMeanZero + +instance {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} : + CoeOut (ScalarCanonicalMaximizer U p q a) (AHarmonicFunction a U) where + coe v := v.toAHarmonicFunctionMeanZero.toAHarmonicFunction + +theorem meanZero {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) : + MeanZeroOn U v.toAHarmonicFunctionMeanZero.toAHarmonicFunction.toH1.toFun := + v.toAHarmonicFunctionMeanZero.meanZero + +theorem isResponseMaximizer {d : ℕ} {U : Set (Vec d)} {p q : Vec d} {a : CoeffField d} + (v : ScalarCanonicalMaximizer U p q a) : + IsResponseMaximizer U p q a (v : AHarmonicFunction a U) := + v.isMaximizer + +noncomputable def ofIsResponseMaximizer {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) : + ScalarCanonicalMaximizer U p q a where + toAHarmonicFunctionMeanZero := u.toMeanZero + isMaximizer := hmax.normalizeMeanZero + +@[simp] theorem coe_ofIsResponseMaximizer {d : ℕ} {U : Set (Vec d)} {p q : Vec d} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (hmax : IsResponseMaximizer U p q a u) : + ((ofIsResponseMaximizer u hmax : ScalarCanonicalMaximizer U p q a) : AHarmonicFunction a U) = + u.normalizeMeanZero := + rfl + +end ScalarCanonicalMaximizer + +noncomputable def scalarPerturbation {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) : + AHarmonicFunction a U := + AHarmonicFunction.addSMulOfIntegrable u w hu_int hw_int t + +@[simp] theorem scalarPerturbation_grad {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) : + (scalarPerturbation u w t hu_int hw_int).toH1.grad = u.toH1.grad + t • w.toH1.grad := by + simpa [scalarPerturbation] using AHarmonicFunction.grad_addSMulOfIntegrable u w hu_int hw_int t + +theorem scalarResponseIntegrand_scalarPerturbation {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q : Vec d) (u w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) : + scalarResponseIntegrand U a p q (scalarPerturbation u w t hu_int hw_int) = + scalarResponseIntegrand U a p q u + + t • scalarFirstVariationIntegrand U a p q u w + - (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w) := by + funext x + have hsymm : + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (w.toH1.grad x)) = + vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) := by + calc + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (w.toH1.grad x)) + = vecDot (u.toH1.grad x) (matVecMul (matTranspose (symmPart (a x))) (w.toH1.grad x)) := by + simp + _ = vecDot (matVecMul (symmPart (a x)) (u.toH1.grad x)) (w.toH1.grad x) := by + rw [vecDot_matVecMul_transpose] + _ = vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) := by + rw [vecDot_comm] + simp [scalarResponseIntegrand, scalarFirstVariationIntegrand, scalarVariationEnergyIntegrand, + scalarPerturbation_grad, matVecMul_add, matVecMul_smul, vecDot_add_left, vecDot_add_right, + vecDot_smul_left, vecDot_smul_right, hsymm, smul_eq_mul, sub_eq_add_neg] + ring + +theorem volumeAverage_scalarResponseIntegrand_scalarPerturbation {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (p q : Vec d) (u w : AHarmonicFunction a U) (t : ℝ) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarResponseIntegrand U a p q (scalarPerturbation u w t hu_int hw_int)) = + volumeAverage U (scalarResponseIntegrand U a p q u) + + t * volumeAverage U (scalarFirstVariationIntegrand U a p q u w) + - ((t ^ 2) / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a w) := by + unfold volumeAverage + rw [scalarResponseIntegrand_scalarPerturbation] + have hlin_t : + MeasureTheory.IntegrableOn (t • scalarFirstVariationIntegrand U a p q u w) U := + by + simpa [MeasureTheory.IntegrableOn] using (hlin.integrable.smul t) + have henergy_t : + MeasureTheory.IntegrableOn ((((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) U := + by + simpa [MeasureTheory.IntegrableOn] using (henergy.integrable.smul ((t ^ 2) / 2 : ℝ)) + have hsub : + MeasureTheory.IntegrableOn + (t • scalarFirstVariationIntegrand U a p q u w - + (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) U := + by + simpa [MeasureTheory.IntegrableOn] using (hlin_t.integrable.sub henergy_t.integrable) + have hsplit_add : + (fun x => + (scalarResponseIntegrand U a p q u + t • scalarFirstVariationIntegrand U a p q u w - + (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) x) = + fun x => + scalarResponseIntegrand U a p q u x + + (t • scalarFirstVariationIntegrand U a p q u w - + (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) x := by + funext x + simp [sub_eq_add_neg, add_assoc] + rw [hsplit_add] + rw [MeasureTheory.integral_add hresp_u hsub] + have hsplit_sub : + (fun x => + (t • scalarFirstVariationIntegrand U a p q u w - + (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) x) = + fun x => + (t • scalarFirstVariationIntegrand U a p q u w) x - + ((((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w) x) := by + funext x + simp + rw [hsplit_sub] + rw [MeasureTheory.integral_sub hlin_t henergy_t] + rw [show (fun x => (t • scalarFirstVariationIntegrand U a p q u w) x) = + fun x => t • scalarFirstVariationIntegrand U a p q u w x by + funext x + simp] + rw [show (fun x => ((((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w)) x) = + fun x => (((t ^ 2) / 2 : ℝ) • scalarVariationEnergyIntegrand a w x) by + funext x + simp] + rw [MeasureTheory.integral_smul, MeasureTheory.integral_smul] + simp [smul_eq_mul] + ring_nf + +theorem scalarFirstVariationIntegrand_split {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (p q p' q' : Vec d) (u w : AHarmonicFunction a U) : + scalarFirstVariationIntegrand U a p q u w = + scalarFirstVariationIntegrand U a p' q' u w + + scalarResponseIntegrand U a (p - p') (q - q') w + + ((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a w) := by + funext x + have hq : + vecDot q (w.toH1.grad x) = + vecDot q' (w.toH1.grad x) + vecDot (q - q') (w.toH1.grad x) := by + rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + ring + have hp : + vecDot p (matVecMul (a x) (w.toH1.grad x)) = + vecDot p' (matVecMul (a x) (w.toH1.grad x)) + + vecDot (p - p') (matVecMul (a x) (w.toH1.grad x)) := by + rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + ring + unfold scalarFirstVariationIntegrand scalarResponseIntegrand scalarVariationEnergyIntegrand + rw [hq, hp] + simp [sub_eq_add_neg, smul_eq_mul] + ring + +theorem scalarResponseIntegrand_scalarPerturbation_one_split {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (p q p' q' : Vec d) (u w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) : + scalarResponseIntegrand U a p q (scalarPerturbation u w 1 hu_int hw_int) = + scalarResponseIntegrand U a p q u + + scalarResponseIntegrand U a (p - p') (q - q') w + + scalarFirstVariationIntegrand U a p' q' u w := by + rw [scalarResponseIntegrand_scalarPerturbation U a p q u w 1 hu_int hw_int] + rw [scalarFirstVariationIntegrand_split U a p q p' q' u w] + funext x + simp [sub_eq_add_neg, smul_eq_mul] + ring + +theorem linearCoeff_eq_zero_of_quadratic_nonpos (L Q : ℝ) + (h : ∀ t : ℝ, t * L - ((t ^ 2) / 2 : ℝ) * Q ≤ 0) : L = 0 := by + by_contra hL + have hLsq : 0 < L ^ 2 := by + exact sq_pos_of_ne_zero hL + by_cases hQ : 0 < Q + · have htest := h (L / Q) + have hpos : 0 < (L / Q) * L - (((L / Q) ^ 2) / 2 : ℝ) * Q := by + field_simp [hQ.ne'] + nlinarith + linarith + · have hQ_nonpos : Q ≤ 0 := le_of_not_gt hQ + have htest := h L + have hpos : 0 < L * L - ((L ^ 2) / 2 : ℝ) * Q := by + nlinarith + linarith + +theorem basic_cg_identities_first_variation_of_isResponseMaximizer {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (p q : Vec d) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) + (hresp_u : MeasureTheory.IntegrableOn (scalarResponseIntegrand U a p q u) U) + (hlin : MeasureTheory.IntegrableOn (scalarFirstVariationIntegrand U a p q u w) U) + (henergy : MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) U) : + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0 := by + let L := volumeAverage U (scalarFirstVariationIntegrand U a p q u w) + let Q := volumeAverage U (scalarVariationEnergyIntegrand a w) + have hquad : ∀ t : ℝ, t * L - ((t ^ 2) / 2 : ℝ) * Q ≤ 0 := by + intro t + have hopt := hmax (scalarPerturbation u w t hu_int hw_int) + rw [volumeAverage_scalarResponseIntegrand_scalarPerturbation U a p q u w t + hu_int hw_int hresp_u hlin henergy] at hopt + simpa [L, Q] using hopt + exact linearCoeff_eq_zero_of_quadratic_nonpos L Q hquad + +theorem basic_cg_identities_first_variation_eq_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) (w : AHarmonicFunction a U) : + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) = + volumeAverage U + (fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + have hfirst := + basic_cg_identities_first_variation_of_isResponseMaximizer + U a p q u hmax w (hInt.weakFlux u) (hInt.weakFlux w) + (hInt.response p q u) (hInt.firstVariation p q u w) (hInt.energy w) + have hsub_qp : + MeasureTheory.IntegrableOn + (fun x => vecDot q (w.toH1.grad x) - vecDot p (matVecMul (a x) (w.toH1.grad x))) U := by + simpa [MeasureTheory.IntegrableOn] using! + (hInt.grad q w).integrable.sub (hInt.flux p w).integrable + have havg : + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = + (volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x)))) - + volumeAverage U + (fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + unfold scalarFirstVariationIntegrand + have hrewrite : + volumeAverage U + (fun x => + vecDot q (w.toH1.grad x) - vecDot p (matVecMul (a x) (w.toH1.grad x)) - + vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) = + volumeAverage U + ((fun x => vecDot q (w.toH1.grad x) - vecDot p (matVecMul (a x) (w.toH1.grad x))) - + fun x => vecDot (w.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + rfl + have hrewrite_qp : + volumeAverage U (fun x => vecDot q (w.toH1.grad x) - vecDot p (matVecMul (a x) (w.toH1.grad x))) = + volumeAverage U (fun x => vecDot q (w.toH1.grad x)) - + volumeAverage U (fun x => vecDot p (matVecMul (a x) (w.toH1.grad x))) := + volumeAverage_sub (hInt.grad q w) (hInt.flux p w) + rw [hrewrite] + rw [volumeAverage_sub hsub_qp (hInt.cross u w)] + rw [hrewrite_qp] + rw [havg] at hfirst + linarith + +theorem isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (p q : Vec d) (u : AHarmonicFunction a U) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + IsResponseMaximizer U p q a u := by + let hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + intro w + let wdiff := + AHarmonicFunction.subOfIntegrable w u (hInt.weakFlux w) (hInt.weakFlux u) + have hgrad_w : + (scalarPerturbation u wdiff 1 (hInt.weakFlux u) (hInt.weakFlux wdiff)).toH1.grad = + w.toH1.grad := by + dsimp [wdiff] + rw [scalarPerturbation_grad, AHarmonicFunction.grad_subOfIntegrable] + funext x + simp [sub_eq_add_neg] + have hresp_w : + volumeAverage U + (scalarResponseIntegrand U a p q + (scalarPerturbation u wdiff 1 (hInt.weakFlux u) (hInt.weakFlux wdiff))) = + volumeAverage U (scalarResponseIntegrand U a p q w) := by + exact congrArg (volumeAverage U) (scalarResponseIntegrand_eq_of_grad_eq hgrad_w) + have hsplit := + volumeAverage_scalarResponseIntegrand_scalarPerturbation U a p q u wdiff 1 + (hInt.weakFlux u) (hInt.weakFlux wdiff) + (hInt.response p q u) (hInt.firstVariation p q u wdiff) (hInt.energy wdiff) + rw [hresp_w] at hsplit + have hfirst_zero : + volumeAverage U (scalarFirstVariationIntegrand U a p q u wdiff) = 0 := + hfirst wdiff + have henergy_nonneg : + 0 ≤ volumeAverage U (scalarVariationEnergyIntegrand a wdiff) := + by + have hpointwise : + ∀ x ∈ U, 0 ≤ scalarVariationEnergyIntegrand a wdiff x := by + intro x hx + unfold scalarVariationEnergyIntegrand + rcases hEll with ⟨_, hEllPt⟩ + have hlower := + lowerBound_symmPart_of_isEllipticMatrix (hEllPt x hx) (wdiff.toH1.grad x) + have hnorm_nonneg : 0 ≤ vecNormSq (wdiff.toH1.grad x) := + vecNormSq_nonneg (wdiff.toH1.grad x) + have hlam_nonneg : 0 ≤ lam := le_of_lt (hEllPt x hx).1 + nlinarith + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + exact hpointwise + rw [hfirst_zero] at hsplit + have hrewrite : + volumeAverage U (scalarResponseIntegrand U a p q w) = + volumeAverage U (scalarResponseIntegrand U a p q u) - + ((1 ^ 2) / 2 : ℝ) * volumeAverage U (scalarVariationEnergyIntegrand a wdiff) := by + simpa using hsplit + linarith + +namespace ScalarCanonicalMaximizer + +theorem firstVariation_eq_zero_of_integral_eq_zero {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {p q : Vec d} + {u : AHarmonicFunction a U} + (hfirst : + ∀ w : AHarmonicFunction a U, + ∫ x in U, scalarFirstVariationIntegrand U a p q u w x ∂MeasureTheory.volume = 0) : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0 := by + intro w + exact volumeAverage_eq_zero_of_integral_eq_zero (hfirst w) + +noncomputable def ofFirstVariationEqZeroOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (u : AHarmonicFunction a U) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + ScalarCanonicalMaximizer U p q a := + ofIsResponseMaximizer u + (isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + U a hEll p q u hfirst) + +@[simp] theorem coe_ofFirstVariationEqZeroOfIsEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (u : AHarmonicFunction a U) + (hfirst : + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + ((ofFirstVariationEqZeroOfIsEllipticFieldOn hEll p q u hfirst : + ScalarCanonicalMaximizer U p q a) : AHarmonicFunction a U) = + u.normalizeMeanZero := + rfl + +theorem nonempty_of_exists_firstVariation_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (hex : + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + volumeAverage U (scalarFirstVariationIntegrand U a p q u w) = 0) : + Nonempty (ScalarCanonicalMaximizer U p q a) := by + rcases hex with ⟨u, hfirst⟩ + exact ⟨ofFirstVariationEqZeroOfIsEllipticFieldOn hEll p q u hfirst⟩ + +theorem nonempty_of_exists_firstVariation_integral_eq_zero_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) (p q : Vec d) + (hex : + ∃ u : AHarmonicFunction a U, + ∀ w : AHarmonicFunction a U, + ∫ x in U, scalarFirstVariationIntegrand U a p q u w x ∂MeasureTheory.volume = 0) : + Nonempty (ScalarCanonicalMaximizer U p q a) := by + rcases hex with ⟨u, hfirst⟩ + exact nonempty_of_exists_firstVariation_eq_zero_of_isEllipticFieldOn hEll p q + ⟨u, firstVariation_eq_zero_of_integral_eq_zero hfirst⟩ + +end ScalarCanonicalMaximizer + +theorem volumeAverage_scalarResponseIntegrand_scalarPerturbation_one_split_of_isResponseMaximizer + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) (p q p' q' : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) (u : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p' q' a u) (w : AHarmonicFunction a U) : + volumeAverage U + (scalarResponseIntegrand U a p q + (scalarPerturbation u w 1 (hInt.weakFlux u) (hInt.weakFlux w))) = + volumeAverage U (scalarResponseIntegrand U a p q u) + + volumeAverage U (scalarResponseIntegrand U a (p - p') (q - q') w) := by + have hfirst := + basic_cg_identities_first_variation_of_isResponseMaximizer + U a p' q' u hmax w (hInt.weakFlux u) (hInt.weakFlux w) + (hInt.response p' q' u) (hInt.firstVariation p' q' u w) (hInt.energy w) + rw [scalarResponseIntegrand_scalarPerturbation_one_split U a p q p' q' u w + (hInt.weakFlux u) (hInt.weakFlux w)] + have hresp_sum : + MeasureTheory.IntegrableOn + (scalarResponseIntegrand U a p q u + + scalarResponseIntegrand U a (p - p') (q - q') w) U := by + simpa [MeasureTheory.IntegrableOn] using + (hInt.response p q u).integrable.add (hInt.response (p - p') (q - q') w).integrable + rw [volumeAverage_add hresp_sum (hInt.firstVariation p' q' u w)] + rw [volumeAverage_add (hInt.response p q u) (hInt.response (p - p') (q - q') w)] + rw [hfirst] + ring + +theorem basic_cg_identities_sub_isResponseMaximizer_of_isResponseMaximizer {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (p q p' q' : Vec d) + (hInt : ResponseLinearIntegrabilityData U a) + (u u' : AHarmonicFunction a U) + (hmax : IsResponseMaximizer U p q a u) + (hmax' : IsResponseMaximizer U p' q' a u') : + IsResponseMaximizer U (p - p') (q - q') a + (AHarmonicFunction.subOfIntegrable u u' (hInt.weakFlux u) (hInt.weakFlux u')) := by + intro w + let udiff := AHarmonicFunction.subOfIntegrable u u' (hInt.weakFlux u) (hInt.weakFlux u') + have hopt := hmax (scalarPerturbation u' w 1 (hInt.weakFlux u') (hInt.weakFlux w)) + have hsplit_w := + volumeAverage_scalarResponseIntegrand_scalarPerturbation_one_split_of_isResponseMaximizer + U a p q p' q' hInt u' hmax' w + have hsplit_u := + volumeAverage_scalarResponseIntegrand_scalarPerturbation_one_split_of_isResponseMaximizer + U a p q p' q' hInt u' hmax' udiff + have hgrad_u : + (scalarPerturbation u' udiff 1 (hInt.weakFlux u') (hInt.weakFlux udiff)).toH1.grad = + u.toH1.grad := by + dsimp [udiff] + rw [scalarPerturbation_grad, AHarmonicFunction.grad_subOfIntegrable] + funext x + simp [sub_eq_add_neg] + have hresp_u : + volumeAverage U + (scalarResponseIntegrand U a p q + (scalarPerturbation u' udiff 1 (hInt.weakFlux u') (hInt.weakFlux udiff))) = + volumeAverage U (scalarResponseIntegrand U a p q u) := by + exact congrArg (volumeAverage U) (scalarResponseIntegrand_eq_of_grad_eq hgrad_u) + rw [hresp_u] at hsplit_u + rw [hsplit_w, hsplit_u] at hopt + linarith + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Homogeneity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Homogeneity.lean new file mode 100644 index 0000000000..48cdb7d43b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ResponseIdentities/Homogeneity.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas + +/-! # Homogeneity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open Pointwise + +/-! +Homogeneity statements for deterministic coarse scalar objects. +-/ + +theorem isSigmaStarInvCoarse_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) {lam : ℝ} (hlam : 0 < lam) : + IsSigmaStarInvCoarse U (lam • a) (lam⁻¹ • sigmaStar⁻¹) := by + have hInvSymm : (sigmaStar⁻¹).IsSymm := + (isSigmaStarInvCoarse_of_isSigmaStarCoarse hS).1 + rcases hS with ⟨_, hresp⟩ + have hsqrt : (Real.sqrt lam) ≠ 0 := Real.sqrt_ne_zero'.mpr hlam + have hsqInv : ((Real.sqrt lam)⁻¹ : ℝ) ^ 2 = lam⁻¹ := by + rw [inv_pow, Real.sq_sqrt (le_of_lt hlam)] + refine ⟨?_, ?_⟩ + · rw [Matrix.IsSymm.ext_iff] + intro i j + show lam⁻¹ * sigmaStar⁻¹ j i = lam⁻¹ * sigmaStar⁻¹ i j + rw [hInvSymm.apply j i] + · intro q + calc + ResponseJ U 0 q (lam • a) = + ResponseJ U 0 ((Real.sqrt lam)⁻¹ • q) a := by + simpa [Real.sq_sqrt (le_of_lt hlam)] using + responseJ_homogeneous_coeffField_sq U 0 q a (Real.sqrt lam) hsqrt + _ = (1 / 2 : ℝ) * + vecDot (((Real.sqrt lam)⁻¹ : ℝ) • q) + (matVecMul sigmaStar⁻¹ (((Real.sqrt lam)⁻¹ : ℝ) • q)) := by + simpa using hresp (((Real.sqrt lam)⁻¹ : ℝ) • q) + _ = (1 / 2 : ℝ) * (((Real.sqrt lam)⁻¹ : ℝ) ^ 2) * + vecDot q (matVecMul sigmaStar⁻¹ q) := by + rw [matVecMul_smul, vecDot_smul_left, vecDot_smul_right] + ring + _ = (1 / 2 : ℝ) * lam⁻¹ * vecDot q (matVecMul sigmaStar⁻¹ q) := by + rw [hsqInv] + _ = (1 / 2 : ℝ) * vecDot q (matVecMul (lam⁻¹ • sigmaStar⁻¹) q) := by + rw [smul_matVecMul, vecDot_smul_right] + ring + +theorem sigmaStarInvCoarse_homogeneous_coeffField_of_isSigmaStarCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) {lam : ℝ} (hlam : 0 < lam) : + sigmaStarInvCoarse U (lam • a) = lam⁻¹ • sigmaStarInvCoarse U a := by + calc + sigmaStarInvCoarse U (lam • a) = lam⁻¹ • sigmaStar⁻¹ := by + symm + exact eq_sigmaStarInvCoarse_of_isSigmaStarInvCoarse + (isSigmaStarInvCoarse_homogeneous_coeffField U a hS hlam) + _ = lam⁻¹ • sigmaStarInvCoarse U a := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + +/-- Note-facing homogeneity for `\sigma_*^{-1}(U; a)` under coefficient +rescaling. -/ +theorem sigmaStarInvCoarse_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) {lam : ℝ} (hlam : 0 < lam) : + sigmaStarInvCoarse U (lam • a) = lam⁻¹ • sigmaStarInvCoarse U a := + sigmaStarInvCoarse_homogeneous_coeffField_of_isSigmaStarCoarse U a hS hlam + +theorem isSigmaStarInvKappaCoarse_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) {lam : ℝ} (hlam : 0 < lam) : + IsSigmaStarInvKappaCoarse U (lam • a) (sigmaStar⁻¹ * kappa) := by + have hsqrt : (Real.sqrt lam) ≠ 0 := Real.sqrt_ne_zero'.mpr hlam + intro p q + have hpq : + ResponseJ U p q (lam • a) = + ResponseJ U (Real.sqrt lam • p) (((Real.sqrt lam)⁻¹ : ℝ) • q) a := by + simpa [Real.sq_sqrt (le_of_lt hlam)] using + responseJ_homogeneous_coeffField_sq U p q a (Real.sqrt lam) hsqrt + have hp0 : + ResponseJ U p 0 (lam • a) = ResponseJ U (Real.sqrt lam • p) 0 a := by + simpa [Real.sq_sqrt (le_of_lt hlam)] using + responseJ_homogeneous_coeffField_sq U p 0 a (Real.sqrt lam) hsqrt + have h0q : + ResponseJ U 0 q (lam • a) = ResponseJ U 0 (((Real.sqrt lam)⁻¹ : ℝ) • q) a := by + simpa [Real.sq_sqrt (le_of_lt hlam)] using + responseJ_homogeneous_coeffField_sq U 0 q a (Real.sqrt lam) hsqrt + calc + ResponseJ U p q (lam • a) - ResponseJ U p 0 (lam • a) - ResponseJ U 0 q (lam • a) + + vecDot p q = + ResponseJ U (Real.sqrt lam • p) (((Real.sqrt lam)⁻¹ : ℝ) • q) a - + ResponseJ U (Real.sqrt lam • p) 0 a - + ResponseJ U 0 (((Real.sqrt lam)⁻¹ : ℝ) • q) a + + vecDot (Real.sqrt lam • p) (((Real.sqrt lam)⁻¹ : ℝ) • q) := by + rw [hpq, hp0, h0q] + congr 1 + simp [vecDot_smul_left, vecDot_smul_right, hsqrt] + _ = vecDot (((Real.sqrt lam)⁻¹ : ℝ) • q) + (matVecMul sigmaStar⁻¹ (matVecMul kappa (Real.sqrt lam • p))) := by + exact hK (Real.sqrt lam • p) (((Real.sqrt lam)⁻¹ : ℝ) • q) + _ = vecDot q (matVecMul (sigmaStar⁻¹ * kappa) p) := by + rw [matVecMul_smul, matVecMul_smul, matVecMul_mul, vecDot_smul_left, vecDot_smul_right] + field_simp [hsqrt] + +theorem sigmaStarInvKappaCoarse_homogeneous_coeffField_of_isKappaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) {lam : ℝ} (hlam : 0 < lam) : + sigmaStarInvKappaCoarse U (lam • a) = sigmaStarInvKappaCoarse U a := by + calc + sigmaStarInvKappaCoarse U (lam • a) = sigmaStar⁻¹ * kappa := by + symm + exact eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse + (isSigmaStarInvKappaCoarse_homogeneous_coeffField U a hK hlam) + _ = sigmaStarInvKappaCoarse U a := by + rw [sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + +/-- Note-facing homogeneity for `\sigma_*^{-1}(U; a)\kappa(U; a)` under +coefficient rescaling. -/ +theorem sigmaStarInvKappaCoarse_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) {lam : ℝ} (hlam : 0 < lam) : + sigmaStarInvKappaCoarse U (lam • a) = sigmaStarInvKappaCoarse U a := + sigmaStarInvKappaCoarse_homogeneous_coeffField_of_isKappaCoarse U a hK hlam + +theorem isSigmaStarCoarse_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + IsSigmaStarCoarse U (lam • a) (lam • sigmaStar) := by + have hInv := + isSigmaStarInvCoarse_homogeneous_coeffField U a hS hlam + have hsymm : sigmaStar.IsSymm := hS.1 + refine ⟨?_, ?_⟩ + · rw [Matrix.IsSymm.ext_iff] at hsymm ⊢ + intro i j + show lam * sigmaStar j i = lam * sigmaStar i j + rw [hsymm j i] + · intro q + calc + ResponseJ U 0 q (lam • a) = + (1 / 2 : ℝ) * vecDot q (matVecMul (lam⁻¹ • sigmaStar⁻¹) q) := by + exact hInv.2 q + _ = (1 / 2 : ℝ) * vecDot q (matVecMul ((lam • sigmaStar)⁻¹) q) := by + rw [nonsing_inv_smul lam hlam.ne' hdet] + +theorem sigmaStarCoarse_homogeneous_coeffField_of_isSigmaStarCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + sigmaStarCoarse U (lam • a) = lam • sigmaStarCoarse U a := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [eq_sigmaStarCoarse_of_isSigmaStarCoarse hS' hdet', + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] + +/-- Note-facing homogeneity for `\sigma_*(U; a)` under coefficient +rescaling. -/ +theorem sigmaStarCoarse_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + sigmaStarCoarse U (lam • a) = lam • sigmaStarCoarse U a := + sigmaStarCoarse_homogeneous_coeffField_of_isSigmaStarCoarse U a hS hdet hlam + +theorem isKappaCoarse_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + IsKappaCoarse U (lam • a) (lam • sigmaStar) (lam • kappa) := by + intro p q + calc + ResponseJ U p q (lam • a) - ResponseJ U p 0 (lam • a) - ResponseJ U 0 q (lam • a) + + vecDot p q = + vecDot q (matVecMul (sigmaStar⁻¹ * kappa) p) := by + exact (isSigmaStarInvKappaCoarse_homogeneous_coeffField U a hK hlam) p q + _ = vecDot q (matVecMul ((lam • sigmaStar)⁻¹) (matVecMul (lam • kappa) p)) := by + rw [nonsing_inv_smul lam hlam.ne' hdet, matVecMul_mul] + congr 1 + rw [smul_mul_assoc, mul_smul_comm] + simp [smul_smul, inv_mul_cancel₀ hlam.ne'] + +theorem kappaCoarse_homogeneous_coeffField_of_isKappaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) {lam : ℝ} (hlam : 0 < lam) : + kappaCoarse U (lam • a) = lam • kappaCoarse U a := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [eq_kappaCoarse_of_isKappaCoarse hS' hK' hdet', + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + +/-- Note-facing homogeneity for `\kappa(U; a)` under coefficient rescaling. -/ +theorem kappaCoarse_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) {lam : ℝ} (hlam : 0 < lam) : + kappaCoarse U (lam • a) = lam • kappaCoarse U a := + kappaCoarse_homogeneous_coeffField_of_isKappaCoarse U a hS hK hdet hlam + +theorem isSigmaCoarse_homogeneous_coeffField {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + IsSigmaCoarse U (lam • a) (lam • sigma) (lam • sigmaStar) (lam • kappa) := by + rcases hSigma with ⟨hsymm, hresp⟩ + have hsqrt : (Real.sqrt lam) ≠ 0 := Real.sqrt_ne_zero'.mpr hlam + refine ⟨?_, ?_⟩ + · rw [Matrix.IsSymm.ext_iff] at hsymm ⊢ + intro i j + show lam * sigma j i = lam * sigma i j + rw [hsymm j i] + · intro p + have hp0 : + ResponseJ U p 0 (lam • a) = ResponseJ U (Real.sqrt lam • p) 0 a := by + simpa using responseJ_homogeneous_coeffField U p 0 a hlam + have hsq : Real.sqrt lam * Real.sqrt lam = lam := by + nlinarith [Real.sq_sqrt (le_of_lt hlam)] + have hcorr : + vecDot p + (matVecMul (matTranspose (lam • kappa)) + (matVecMul ((lam • sigmaStar)⁻¹) (matVecMul (lam • kappa) p))) = + vecDot (Real.sqrt lam • p) + (matVecMul (matTranspose kappa) + (matVecMul sigmaStar⁻¹ (matVecMul kappa (Real.sqrt lam • p)))) := by + rw [vecDot_matVecMul_transpose, vecDot_matVecMul_transpose, + nonsing_inv_smul lam hlam.ne' hdet] + simp [smul_matVecMul, matVecMul_smul, vecDot_smul_left, vecDot_smul_right, + hsq, hlam.ne', mul_left_comm, mul_comm] + calc + ResponseJ U p 0 (lam • a) - + (1 / 2 : ℝ) * + vecDot p + (matVecMul (matTranspose (lam • kappa)) + (matVecMul ((lam • sigmaStar)⁻¹) (matVecMul (lam • kappa) p))) = + ResponseJ U (Real.sqrt lam • p) 0 a - + (1 / 2 : ℝ) * + vecDot (Real.sqrt lam • p) + (matVecMul (matTranspose kappa) + (matVecMul sigmaStar⁻¹ (matVecMul kappa (Real.sqrt lam • p)))) := by + rw [hp0, hcorr] + _ = (1 / 2 : ℝ) * vecDot (Real.sqrt lam • p) (matVecMul sigma (Real.sqrt lam • p)) := by + exact hresp (Real.sqrt lam • p) + _ = (1 / 2 : ℝ) * vecDot p (matVecMul (lam • sigma) p) := by + calc + (1 / 2 : ℝ) * vecDot (Real.sqrt lam • p) (matVecMul sigma (Real.sqrt lam • p)) = + (1 / 2 : ℝ) * (Real.sqrt lam * (Real.sqrt lam * vecDot p (matVecMul sigma p))) := by + rw [matVecMul_smul, vecDot_smul_left, vecDot_smul_right] + _ = (1 / 2 : ℝ) * (lam * vecDot p (matVecMul sigma p)) := by + congr 1 + rw [← mul_assoc, hsq] + _ = (1 / 2 : ℝ) * vecDot p (matVecMul (lam • sigma) p) := by + rw [smul_matVecMul, vecDot_smul_right] + +theorem sigmaCoarse_homogeneous_coeffField_of_isSigmaCoarse {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + sigmaCoarse U (lam • a) = lam • sigmaCoarse U a := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hSigma' := isSigmaCoarse_homogeneous_coeffField U a hSigma hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [sigmaCoarse_eq_of_isSigmaCoarse hS' hK' hSigma' hdet', + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] + +/-- Note-facing homogeneity for `\sigma(U; a)` under coefficient rescaling. -/ +theorem sigmaCoarse_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + sigmaCoarse U (lam • a) = lam • sigmaCoarse U a := + sigmaCoarse_homogeneous_coeffField_of_isSigmaCoarse U a hS hK hSigma hdet hlam + +/-- Bundled note-facing homogeneity for the deterministic coarse matrices +`σ(U; a)`, `σ_*(U; a)`, and `κ(U; a)` under coefficient rescaling. -/ +theorem cg_matrices_homogeneous_coeffField {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + sigmaCoarse U (lam • a) = lam • sigmaCoarse U a ∧ + sigmaStarCoarse U (lam • a) = lam • sigmaStarCoarse U a ∧ + kappaCoarse U (lam • a) = lam • kappaCoarse U a := by + refine ⟨?_, ?_, ?_⟩ + · exact sigmaCoarse_homogeneous_coeffField U a hS hK hSigma hdet hlam + · exact sigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + · exact kappaCoarse_homogeneous_coeffField U a hS hK hdet hlam + +theorem deterministicCoarseBlockMatrix_upperLeft_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicCoarseBlockMatrix U (lam • a)).upperLeft = + lam • (deterministicCoarseBlockMatrix U a).upperLeft := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hSigma' := isSigmaCoarse_homogeneous_coeffField U a hSigma hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS' hK' hSigma' hdet', + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + exact blockMatrixOfDeterministicData_upperLeft_smul hdet hlam + +theorem deterministicCoarseBlockMatrix_upperRight_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicCoarseBlockMatrix U (lam • a)).upperRight = + (deterministicCoarseBlockMatrix U a).upperRight := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hSigma' := isSigmaCoarse_homogeneous_coeffField U a hSigma hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS' hK' hSigma' hdet', + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + exact blockMatrixOfDeterministicData_upperRight_smul hdet hlam + +theorem deterministicCoarseBlockMatrix_lowerLeft_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicCoarseBlockMatrix U (lam • a)).lowerLeft = + (deterministicCoarseBlockMatrix U a).lowerLeft := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hSigma' := isSigmaCoarse_homogeneous_coeffField U a hSigma hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS' hK' hSigma' hdet', + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + exact blockMatrixOfDeterministicData_lowerLeft_smul hdet hlam + +theorem deterministicCoarseBlockMatrix_lowerRight_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicCoarseBlockMatrix U (lam • a)).lowerRight = + lam⁻¹ • (deterministicCoarseBlockMatrix U a).lowerRight := by + have hS' := isSigmaStarCoarse_homogeneous_coeffField U a hS hdet hlam + have hK' := isKappaCoarse_homogeneous_coeffField U a hK hdet hlam + have hSigma' := isSigmaCoarse_homogeneous_coeffField U a hSigma hdet hlam + have hdet' : IsUnit (lam • sigmaStar).det := isUnit_det_smul hdet hlam.ne' + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS' hK' hSigma' hdet', + deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma hdet] + exact blockMatrixOfDeterministicData_lowerRight_smul hdet hlam + +theorem deterministicStarredBlockMatrixInv_upperLeft_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicStarredBlockMatrixInv U (lam • a)).upperLeft = + lam⁻¹ • (deterministicStarredBlockMatrixInv U a).upperLeft := by + simpa [deterministicStarredBlockMatrixInv] using + deterministicCoarseBlockMatrix_lowerRight_homogeneous_coeffField_of_isSigmaCoarse + U a hS hK hSigma hdet hlam + +theorem deterministicStarredBlockMatrixInv_upperRight_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicStarredBlockMatrixInv U (lam • a)).upperRight = + (deterministicStarredBlockMatrixInv U a).upperRight := by + simpa [deterministicStarredBlockMatrixInv] using + deterministicCoarseBlockMatrix_lowerLeft_homogeneous_coeffField_of_isSigmaCoarse + U a hS hK hSigma hdet hlam + +theorem deterministicStarredBlockMatrixInv_lowerLeft_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicStarredBlockMatrixInv U (lam • a)).lowerLeft = + (deterministicStarredBlockMatrixInv U a).lowerLeft := by + simpa [deterministicStarredBlockMatrixInv] using + deterministicCoarseBlockMatrix_upperRight_homogeneous_coeffField_of_isSigmaCoarse + U a hS hK hSigma hdet hlam + +theorem deterministicStarredBlockMatrixInv_lowerRight_homogeneous_coeffField_of_isSigmaCoarse + {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) (hdet : IsUnit sigmaStar.det) + {lam : ℝ} (hlam : 0 < lam) : + (deterministicStarredBlockMatrixInv U (lam • a)).lowerRight = + lam • (deterministicStarredBlockMatrixInv U a).lowerRight := by + simpa [deterministicStarredBlockMatrixInv] using + deterministicCoarseBlockMatrix_upperLeft_homogeneous_coeffField_of_isSigmaCoarse + U a hS hK hSigma hdet hlam + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds.lean new file mode 100644 index 0000000000..4cc686bdae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich + +/-! +# Sharp-constant pointwise block bounds (Proposition 2.1) + +Facade for the sharp-constant pointwise block-matrix algebra of Proposition 2.1 +of the high-moment paper (Armstrong–Kuusi–Loher, to appear): + +* `SharpBlockBounds.Basic` — the ellipticity-class quadratic identities and the + upper diagonal sandwich (items A4–A8-upper); +* `SharpBlockBounds.DiagonalSandwich` — the block Fenchel/reflection inverse, + the lower diagonal sandwich (A8-lower), and the two-field comparison (A9). + +All matrix/vector work is on `Vec d = Fin d → ℝ` / `Mat d`; no `EuclideanSpace`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/Basic.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/Basic.lean new file mode 100644 index 0000000000..e113d7a58b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/Basic.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Pointwise block algebra (items A4–A9) + +Sharp-constant pointwise block-matrix algebra of Proposition 2.1 of the +high-moment paper (Armstrong–Kuusi–Loher, to appear). Items A4–A8-upper +live here; the diagonal-sandwich lower bound A8 and the two-field comparison A9 +(which need the block Fenchel/inverse machinery) live in +`SharpBlockBounds/DiagonalSandwich.lean`. + +Notation throughout: `A : Mat d`, `s := symmPart A`, `k := skewPart A`, and +`bfA := blockMatrixOfCoeff A` is the doubled block matrix +`[[s + kᵀ s⁻¹ k, −kᵀ s⁻¹], [−s⁻¹ k, s⁻¹]]`. +-/ + +open Homogenization.Book.Ch02 + +variable {d : ℕ} + +/-! ## Elementary matrix/vector helpers -/ + +/-- The zero matrix annihilates every vector. -/ +theorem zero_matVecMul (x : Vec d) : matVecMul (0 : Mat d) x = 0 := by + funext i; simp [matVecMul] + +/-- `A = symmPart A + skewPart A` at the level of the vector action. -/ +theorem matVecMul_eq_symmPart_add_skewPart (A : Mat d) (w : Vec d) : + matVecMul A w = matVecMul (symmPart A) w + matVecMul (skewPart A) w := by + have hAsk : (symmPart A + skewPart A : Mat d) = A := by + ext i j; simp [symmPart, skewPart]; ring + rw [← add_matVecMul, hAsk] + +/-! ## A7 — the block quadratic identity + +`(p,q) · bfA (p,q) = p · s p + (q − k p) · s⁻¹ (q − k p)`. This is the +identity `blockMatrixOfCoeff_quadratic_eq`, re-exported under the item-A7 name. -/ + +/-- **A7.** The doubled quadratic form of `bfA` in Schur-complement form. -/ +theorem blockMatrixOfCoeff_quadratic (A : Mat d) (p q : Vec d) : + blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) = + vecDot p (matVecMul (symmPart A) p) + + vecDot (q - matVecMul (skewPart A) p) + (matVecMul ((symmPart A)⁻¹) (q - matVecMul (skewPart A) p)) := + blockMatrixOfCoeff_quadratic_eq A p q + +/-! ## The image identity and the sharp flux/coercivity bound + +`s + kᵀ s⁻¹ k` is the quadratic form `w ↦ (A w) · s⁻¹ (A w)`; combined with the +flux inequality `(★)` this gives the sharp nonsymmetric coercivity `A4`. -/ + +/-- Quadratic-form identity `w · s w + (k w) · s⁻¹ (k w) = (A w) · s⁻¹ (A w)`. -/ +theorem image_symmPartInv_quadratic_eq {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (w : Vec d) : + vecDot w (matVecMul (symmPart A) w) + + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) = + vecDot (matVecMul A w) (matVecMul ((symmPart A)⁻¹) (matVecMul A w)) := by + have hsdet : IsUnit (symmPart A).det := + (Matrix.isUnit_iff_isUnit_det (A := symmPart A)).mp + (isUnit_symmPart_of_isEllipticMatrix hA) + have hsInv : symmPart A * (symmPart A)⁻¹ = 1 := Matrix.mul_nonsing_inv _ hsdet + have hInvs : (symmPart A)⁻¹ * symmPart A = 1 := Matrix.nonsing_inv_mul _ hsdet + have hsSymm : matTranspose (symmPart A) = symmPart A := by + simpa [matTranspose] using matTranspose_symmPart A + have hAw : matVecMul A w = matVecMul (symmPart A) w + matVecMul (skewPart A) w := + matVecMul_eq_symmPart_add_skewPart A w + have key : + vecDot (matVecMul A w) (matVecMul ((symmPart A)⁻¹) (matVecMul A w)) = + vecDot (matVecMul (symmPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (symmPart A) w)) + + vecDot (matVecMul (symmPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) + + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (symmPart A) w)) + + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) := by + rw [hAw, matVecMul_add, vecDot_add_left, vecDot_add_right, vecDot_add_right] + ring + have e1 : + vecDot (matVecMul (symmPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (symmPart A) w)) = + vecDot w (matVecMul (symmPart A) w) := by + rw [matVecMul_mul, hInvs, matVecMul_one, vecDot_comm] + have e2 : + vecDot (matVecMul (symmPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) = 0 := by + rw [← vecDot_matVecMul_transpose w + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) (symmPart A), + hsSymm, matVecMul_mul, hsInv, matVecMul_one] + exact vecDot_matVecMul_skewPart_self_eq_zero A w + have e3 : + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (symmPart A) w)) = 0 := by + rw [matVecMul_mul, hInvs, matVecMul_one, vecDot_comm] + exact vecDot_matVecMul_skewPart_self_eq_zero A w + rw [key, e1, e2, e3]; ring + +/-- The sharp flux/coercivity bound `(A w) · s⁻¹ (A w) ≤ Lam · ‖w‖²`, proved by +Cauchy–Schwarz against the flux inequality `(★)` for `Aᵀ`. -/ +theorem image_symmPartInv_le {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (w : Vec d) : + vecDot (matVecMul A w) (matVecMul ((symmPart A)⁻¹) (matVecMul A w)) ≤ + Lam * vecNormSq w := by + set u := matVecMul A w with hu + set z := matVecMul ((symmPart A)⁻¹) u with hz + have hLam_pos : 0 < Lam := lt_of_lt_of_le hA.1 hA.2.1 + have hsdet : IsUnit (symmPart A).det := + (Matrix.isUnit_iff_isUnit_det (A := symmPart A)).mp + (isUnit_symmPart_of_isEllipticMatrix hA) + -- s z = u, hence T = u·z = z·s z + have hsz : matVecMul (symmPart A) z = u := by + rw [hz, matVecMul_mul, Matrix.mul_nonsing_inv _ hsdet, matVecMul_one] + set T := vecDot u z with hT + have hT_nonneg : 0 ≤ T := by + rw [hT, hz]; exact symmPart_inv_nonneg_of_isEllipticMatrix hA u + have hTeq : T = vecDot z (matVecMul (symmPart A) z) := by + rw [hsz, hT, vecDot_comm] + -- T = w · Aᵀ z + have hTw : T = vecDot w (matVecMul (matTranspose A) z) := by + rw [vecDot_matVecMul_transpose, ← hu, hT] + -- Cauchy–Schwarz + have hCS : T ^ 2 ≤ vecNormSq w * vecNormSq (matVecMul (matTranspose A) z) := by + rw [hTw]; exact sq_vecDot_le_vecNormSq_mul_vecNormSq w (matVecMul (matTranspose A) z) + -- (★) for Aᵀ + have hAT : IsEllipticMatrix lam Lam (matTranspose A) := isEllipticMatrix_transpose hA + have hstar : + vecNormSq (matVecMul (matTranspose A) z) ≤ + Lam * vecDot z (matVecMul (symmPart (matTranspose A)) z) := + vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hAT z + rw [symmPart_matTranspose, ← hTeq] at hstar + -- combine: T² ≤ ‖w‖² · Lam · T + have hcomb : T ^ 2 ≤ vecNormSq w * (Lam * T) := + le_trans hCS (mul_le_mul_of_nonneg_left hstar (vecNormSq_nonneg w)) + by_cases hT0 : T = 0 + · rw [hT0]; exact mul_nonneg hLam_pos.le (vecNormSq_nonneg w) + · have hTpos : 0 < T := lt_of_le_of_ne hT_nonneg (Ne.symm hT0) + nlinarith [hcomb, hTpos] + +/-- The skew Schur term is controlled by `A4`'s budget: +`(k w) · s⁻¹ (k w) ≤ Lam ‖w‖² − w · s w`. -/ +theorem skew_symmPartInv_le {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (w : Vec d) : + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) ≤ + Lam * vecNormSq w - vecDot w (matVecMul (symmPart A) w) := by + have hid := image_symmPartInv_quadratic_eq hA w + have hle := image_symmPartInv_le hA w + linarith [hid, hle] + +/-! ## A4 — nonsymmetric coercivity -/ + +/-- **A4.** `s + kᵀ s⁻¹ k ≤ Θ • 1` in the Loewner order. -/ +theorem upperLeft_matLoewnerLE_smul_one_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + MatLoewnerLE + (symmPart A + matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A) + (Θ • (1 : Mat d)) := by + refine matLoewnerLE_of_forall (fun w => ?_) + rw [vecDot_matVecMul_smul_one] + -- expand the quadratic form of `s + kᵀ s⁻¹ k` + have hexp : + vecDot w + (matVecMul + (symmPart A + matTranspose (skewPart A) * (symmPart A)⁻¹ * skewPart A) w) = + vecDot w (matVecMul (symmPart A) w) + + vecDot (matVecMul (skewPart A) w) + (matVecMul ((symmPart A)⁻¹) (matVecMul (skewPart A) w)) := by + rw [add_matVecMul, vecDot_add_right] + congr 1 + rw [← matVecMul_mul, ← matVecMul_mul, vecDot_matVecMul_transpose] + rw [hexp, image_symmPartInv_quadratic_eq hA w] + exact image_symmPartInv_le hA w + +/-! ## A5 — sharp flux bounds -/ + +/-- Quadratic form of `Aᵀ A` is the squared image norm `‖A x‖²`. -/ +theorem vecDot_matVecMul_transpose_mul_self (A : Mat d) (x : Vec d) : + vecDot x (matVecMul (matTranspose A * A) x) = vecNormSq (matVecMul A x) := by + rw [← matVecMul_mul, vecDot_matVecMul_transpose]; rfl + +/-- Quadratic form of `A Aᵀ` is the squared adjoint image norm `‖Aᵀ x‖²`. -/ +theorem vecDot_matVecMul_self_mul_transpose (A : Mat d) (x : Vec d) : + vecDot x (matVecMul (A * matTranspose A) x) = + vecNormSq (matVecMul (matTranspose A) x) := by + rw [← matVecMul_mul, vecDot_comm] + exact (vecDot_matVecMul_transpose (matVecMul (matTranspose A) x) x A).symm + +/-- **A5a.** `Aᵀ A ≤ Θ • s` in the Loewner order. -/ +theorem transpose_mul_self_matLoewnerLE_smul_symmPart_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + MatLoewnerLE (matTranspose A * A) (Θ • symmPart A) := by + refine matLoewnerLE_of_forall (fun x => ?_) + rw [vecDot_matVecMul_transpose_mul_self, smul_matVecMul, vecDot_smul_right] + exact vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hA x + +/-- **A5b.** `A Aᵀ ≤ Θ • s` in the Loewner order. -/ +theorem self_mul_transpose_matLoewnerLE_smul_symmPart_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + MatLoewnerLE (A * matTranspose A) (Θ • symmPart A) := by + refine matLoewnerLE_of_forall (fun x => ?_) + rw [vecDot_matVecMul_self_mul_transpose, smul_matVecMul, vecDot_smul_right] + have hAT : IsThetaElliptic Θ (matTranspose A) := isEllipticMatrix_transpose hA + have := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hAT x + rwa [symmPart_matTranspose] at this + +/-- **A5 (corollary).** `‖A e‖² + ‖Aᵀ e‖² ≤ 2 Θ (e · s e)`. -/ +theorem vecNormSq_image_add_transpose_le_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) (e : Vec d) : + vecNormSq (matVecMul A e) + vecNormSq (matVecMul (matTranspose A) e) ≤ + 2 * Θ * vecDot e (matVecMul (symmPart A) e) := by + have h1 := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hA e + have hAT : IsThetaElliptic Θ (matTranspose A) := isEllipticMatrix_transpose hA + have h2 := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hAT e + rw [symmPart_matTranspose] at h2 + linarith + +/-! ## A6 — skew bound -/ + +/-- **A6.** `‖k e‖² ≤ Θ² ‖e‖²`. -/ +theorem vecNormSq_matVecMul_skewPart_le_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) (e : Vec d) : + vecNormSq (matVecMul (skewPart A) e) ≤ Θ ^ 2 * vecNormSq e := + vecNormSq_matVecMul_skewPart_le_of_isEllipticMatrix hA e + +/-! ## A8 (upper) — diagonal sandwich, upper half -/ + +/-- A block-diagonal matrix with scalar-multiple-of-identity blocks acts +diagonally on doubled vectors. -/ +theorem blockVecDot_blockMatVecMul_blockDiag_smul_one (a b : ℝ) (p q : Vec d) : + blockVecDot (p, q) + (blockMatVecMul (blockDiag (a • (1 : Mat d)) (b • (1 : Mat d))) (p, q)) = + a * vecNormSq p + b * vecNormSq q := by + simp only [blockVecDot, blockMatVecMul_fst, blockMatVecMul_snd, blockDiag, + zero_matVecMul, matVecMul_smul_one, add_zero, zero_add, vecDot_smul_right] + rfl + +/-- Cauchy-type parallelogram bound for a p.s.d. quadratic form: +`(a − b) · N (a − b) ≤ 2 (a · N a + b · N b)`. -/ +theorem vecDot_matVecMul_sub_le_two {N : Mat d} + (hN : ∀ x : Vec d, 0 ≤ vecDot x (matVecMul N x)) (a b : Vec d) : + vecDot (a - b) (matVecMul N (a - b)) ≤ + 2 * (vecDot a (matVecMul N a) + vecDot b (matVecMul N b)) := by + have key : + vecDot (a - b) (matVecMul N (a - b)) + + vecDot (a + b) (matVecMul N (a + b)) = + 2 * (vecDot a (matVecMul N a) + vecDot b (matVecMul N b)) := by + simp only [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, + vecDot_add_right, vecDot_neg_left, vecDot_neg_right] + ring + have hpos := hN (a + b) + linarith + +/-- **A8 (upper).** `bfA ≤ blockDiag (2Θ • 1) (2 • 1)` in the block Loewner +order. -/ +theorem blockMatrixOfCoeff_blockMatLoewnerLE_blockDiag_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + BlockMatLoewnerLE (blockMatrixOfCoeff A) + (blockDiag ((2 * Θ) • (1 : Mat d)) ((2 : ℝ) • (1 : Mat d))) := by + intro X + rcases X with ⟨p, q⟩ + have hquad := blockMatrixOfCoeff_quadratic A p q + have hdiag := blockVecDot_blockMatVecMul_blockDiag_smul_one (2 * Θ) 2 p q + have hp := upperBound_symmPart_of_isEllipticMatrix hA p + have hp0 : 0 ≤ vecDot p (matVecMul (symmPart A) p) := by + have := lowerBound_symmPart_of_isEllipticMatrix hA p + nlinarith [vecNormSq_nonneg p, this] + have hNpsd : ∀ x : Vec d, 0 ≤ vecDot x (matVecMul ((symmPart A)⁻¹) x) := + fun x => symmPart_inv_nonneg_of_isEllipticMatrix hA x + have hsub := vecDot_matVecMul_sub_le_two hNpsd q (matVecMul (skewPart A) p) + have hq := symmPart_inv_upperBound_of_isEllipticMatrix hA q + have hkp := skew_symmPartInv_le hA p + rw [hquad, hdiag] + simp only [inv_one, one_mul] at hq + nlinarith [hp, hp0, hsub, hq, hkp] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/DiagonalSandwich.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/DiagonalSandwich.lean new file mode 100644 index 0000000000..e95c4c11c9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/SharpBlockBounds/DiagonalSandwich.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.Basic + +/-! # Diagonal Sandwich -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Diagonal sandwich (A8 lower) and two-field comparison (A9) + +The lower half of the diagonal sandwich A8 and the two-field comparison A9 of +Proposition 2.1 of the high-moment paper (Armstrong–Kuusi–Loher, in +preparation). These require the block Fenchel duality: `bfA` is symmetric, +positive definite, and its inverse is the block reflection `blockReflect bfA`. +We establish that inverse identity by an explicit block-matrix computation and +feed it through a pointwise Young/Fenchel inequality. + +Continuation of `SharpBlockBounds/Basic.lean`. +-/ + +open Homogenization.Book.Ch02 + +variable {d : ℕ} + +/-! ## Block composition and the reflection inverse -/ + +/-- `blockMatMul` composes with the doubled action. -/ +theorem blockMatVecMul_blockMatMul (A B : BlockMat d) (X : BlockVec d) : + blockMatVecMul (blockMatMul A B) X = blockMatVecMul A (blockMatVecMul B X) := by + rcases X with ⟨p, q⟩ + refine Prod.ext ?_ ?_ + · show matVecMul (blockMatMul A B).upperLeft p + matVecMul (blockMatMul A B).upperRight q = + matVecMul A.upperLeft (matVecMul B.upperLeft p + matVecMul B.upperRight q) + + matVecMul A.upperRight (matVecMul B.lowerLeft p + matVecMul B.lowerRight q) + simp only [blockMatMul, add_matVecMul, matVecMul_add, ← matVecMul_mul]; abel + · show matVecMul (blockMatMul A B).lowerLeft p + matVecMul (blockMatMul A B).lowerRight q = + matVecMul A.lowerLeft (matVecMul B.upperLeft p + matVecMul B.upperRight q) + + matVecMul A.lowerRight (matVecMul B.lowerLeft p + matVecMul B.lowerRight q) + simp only [blockMatMul, add_matVecMul, matVecMul_add, ← matVecMul_mul]; abel + +/-- The doubled block identity acts trivially. -/ +theorem blockMatVecMul_blockIdentity (X : BlockVec d) : + blockMatVecMul (blockIdentity d) X = X := by + rcases X with ⟨p, q⟩ + refine Prod.ext ?_ ?_ <;> + simp [blockIdentity, blockDiag, blockMatVecMul, matVecMul_one, zero_matVecMul] + +/-- The block reflection is a right inverse of `bfA` at the matrix level. -/ +theorem blockMatMul_blockReflect_blockMatrixOfCoeff_eq_id {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) : + blockMatMul (blockMatrixOfCoeff A) (blockReflect (blockMatrixOfCoeff A)) = + blockIdentity d := by + have hsdet : IsUnit (symmPart A).det := + (Matrix.isUnit_iff_isUnit_det (A := symmPart A)).mp + (isUnit_symmPart_of_isEllipticMatrix hA) + have hss : symmPart A * (symmPart A)⁻¹ = 1 := Matrix.mul_nonsing_inv _ hsdet + have hss' : (symmPart A)⁻¹ * symmPart A = 1 := Matrix.nonsing_inv_mul _ hsdet + have hkt : matTranspose (skewPart A) = -(skewPart A) := matTranspose_skewPart A + refine blockMat_ext ?_ ?_ ?_ ?_ + · simp only [blockMatMul, blockReflect_upperLeft, blockReflect_lowerLeft, + blockMatrixOfCoeff, blockIdentity, blockDiag] + rw [hkt] + have h : (symmPart A + -skewPart A * (symmPart A)⁻¹ * skewPart A) * (symmPart A)⁻¹ + + -(-skewPart A * (symmPart A)⁻¹) * -(-skewPart A * (symmPart A)⁻¹) = + symmPart A * (symmPart A)⁻¹ := by noncomm_ring + rw [h, hss] + · simp only [blockMatMul, blockReflect_upperRight, blockReflect_lowerRight, + blockMatrixOfCoeff, blockIdentity, blockDiag] + rw [hkt] + have h : (symmPart A + -skewPart A * (symmPart A)⁻¹ * skewPart A) * + -((symmPart A)⁻¹ * skewPart A) + + -(-skewPart A * (symmPart A)⁻¹) * + (symmPart A + -skewPart A * (symmPart A)⁻¹ * skewPart A) = + -(symmPart A * (symmPart A)⁻¹ * skewPart A) + + skewPart A * ((symmPart A)⁻¹ * symmPart A) := by noncomm_ring + rw [h, hss, hss']; simp + · simp only [blockMatMul, blockReflect_upperLeft, blockReflect_lowerLeft, + blockMatrixOfCoeff, blockIdentity, blockDiag] + rw [hkt]; noncomm_ring + · simp only [blockMatMul, blockReflect_upperRight, blockReflect_lowerRight, + blockMatrixOfCoeff, blockIdentity, blockDiag] + rw [hkt] + have h : -((symmPart A)⁻¹ * skewPart A) * -((symmPart A)⁻¹ * skewPart A) + + (symmPart A)⁻¹ * (symmPart A + -skewPart A * (symmPart A)⁻¹ * skewPart A) = + (symmPart A)⁻¹ * symmPart A := by noncomm_ring + rw [h, hss'] + +/-- The reflection is a right inverse of `bfA` at the level of the doubled +action. -/ +theorem blockMatVecMul_blockReflect_inv {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (Y : BlockVec d) : + blockMatVecMul (blockMatrixOfCoeff A) + (blockMatVecMul (blockReflect (blockMatrixOfCoeff A)) Y) = Y := by + rw [← blockMatVecMul_blockMatMul, + blockMatMul_blockReflect_blockMatrixOfCoeff_eq_id hA, blockMatVecMul_blockIdentity] + +/-! ## Positive semidefiniteness and the block Fenchel inequality -/ + +/-- `bfA` is positive semidefinite. -/ +theorem blockMatrixOfCoeff_quadratic_nonneg {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (Z : BlockVec d) : + 0 ≤ blockVecDot Z (blockMatVecMul (blockMatrixOfCoeff A) Z) := by + have hco := blockMatrixOfCoeff_coercive_of_isEllipticMatrix hA Z + have hden : (0 : ℝ) < 1 + 2 * Lam ^ 2 := by positivity + have hc : 0 ≤ (lam / (1 + 2 * Lam ^ 2)) * blockVecDot Z Z := + mul_nonneg (div_nonneg hA.1.le hden.le) (blockVecDot_nonneg Z) + linarith + +/-- **Block Fenchel/Young inequality.** For the symmetric p.s.d. `bfA` with +inverse `blockReflect bfA`: +`2 X·Y − Y·(reflect bfA)Y ≤ X·(bfA)X`. -/ +theorem block_fenchel {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (X Y : BlockVec d) : + 2 * blockVecDot X Y - + blockVecDot Y (blockMatVecMul (blockReflect (blockMatrixOfCoeff A)) Y) ≤ + blockVecDot X (blockMatVecMul (blockMatrixOfCoeff A) X) := by + set P := blockMatrixOfCoeff A with hP + set R := blockReflect P with hR + have hPsymm : IsSymmetricBlockMat P := isSymmetricBlockMat_blockMatrixOfCoeff A + set W := blockMatVecMul R Y with hWdef + have hPW : blockMatVecMul P W = Y := blockMatVecMul_blockReflect_inv hA Y + have hpsd : + 0 ≤ blockVecDot (X + (-1 : ℝ) • W) (blockMatVecMul P (X + (-1 : ℝ) • W)) := + blockMatrixOfCoeff_quadratic_nonneg hA _ + have hPZ : blockMatVecMul P (X + (-1 : ℝ) • W) = blockMatVecMul P X + (-1 : ℝ) • Y := by + rw [blockMatVecMul_add, blockMatVecMul_smul, hPW] + rw [hPZ] at hpsd + simp only [blockVecDot_add_left, blockVecDot_add_right, blockVecDot_smul_left, + blockVecDot_smul_right] at hpsd + have hcomm : blockVecDot W (blockMatVecMul P X) = blockVecDot X Y := by + rw [blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hPsymm, hPW] + have hWY : blockVecDot W Y = blockVecDot Y (blockMatVecMul R Y) := by + rw [hWdef, blockVecDot_comm] + linarith [hpsd, hcomm, hWY] + +/-! ## A8 (lower) — diagonal sandwich, lower half -/ + +/-- A block-diagonal matrix with scalar-multiple-of-identity blocks acts by +scaling each block. -/ +theorem blockMatVecMul_blockDiag_smul_one (a b : ℝ) (p q : Vec d) : + blockMatVecMul (blockDiag (a • (1 : Mat d)) (b • (1 : Mat d))) (p, q) = + (a • p, b • q) := by + refine Prod.ext ?_ ?_ <;> + simp [blockDiag, blockMatVecMul, matVecMul_smul_one, zero_matVecMul] + +/-- **A8 (lower).** `blockDiag (½ • 1) ((2Θ)⁻¹ • 1) ≤ bfA` in the block Loewner +order. -/ +theorem blockDiag_blockMatLoewnerLE_blockMatrixOfCoeff_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + BlockMatLoewnerLE + (blockDiag ((1 / 2 : ℝ) • (1 : Mat d)) ((2 * Θ)⁻¹ • (1 : Mat d))) + (blockMatrixOfCoeff A) := by + have hΘ : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hA.2.1 + intro X + rcases X with ⟨p, q⟩ + -- the Fenchel test vector Y = D_lo (p,q) = (½ p, (2Θ)⁻¹ q) + set Ylo := blockMatVecMul + (blockDiag ((1 / 2 : ℝ) • (1 : Mat d)) ((2 * Θ)⁻¹ • (1 : Mat d))) (p, q) with hYlo + have hYval : Ylo = ((1 / 2 : ℝ) • p, (2 * Θ)⁻¹ • q) := by + rw [hYlo]; exact blockMatVecMul_blockDiag_smul_one _ _ p q + -- value of X·(D_lo X) + have hDlo : + blockVecDot (p, q) Ylo = (1 / 2 : ℝ) * vecNormSq p + (2 * Θ)⁻¹ * vecNormSq q := by + rw [hYlo] + exact blockVecDot_blockMatVecMul_blockDiag_smul_one (1 / 2) ((2 * Θ)⁻¹) p q + -- Fenchel at Y = Ylo + have hfen := block_fenchel hA (p, q) Ylo + -- bound the dual term Y·(reflect bfA)Y + have hswap : + blockVecDot Ylo (blockMatVecMul (blockReflect (blockMatrixOfCoeff A)) Ylo) = + blockVecDot (Ylo.2, Ylo.1) + (blockMatVecMul (blockMatrixOfCoeff A) (Ylo.2, Ylo.1)) := + blockVecDot_blockMatVecMul_blockReflect (blockMatrixOfCoeff A) Ylo + have hZ : (Ylo.2, Ylo.1) = ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p) := by + rw [hYval] + -- A8 upper applied at the swapped vector + have hup := blockMatrixOfCoeff_blockMatLoewnerLE_blockDiag_of_isThetaElliptic hA + ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p) + have hdhi := blockVecDot_blockMatVecMul_blockDiag_smul_one (2 * Θ) 2 + ((2 * Θ)⁻¹ • q) ((1 / 2 : ℝ) • p) + rw [vecNormSq_smul, vecNormSq_smul] at hdhi + -- simplify the diagonal upper value using Θ > 0 + have harith : + (2 * Θ) * ((2 * Θ)⁻¹ ^ 2 * vecNormSq q) + 2 * ((1 / 2 : ℝ) ^ 2 * vecNormSq p) = + (2 * Θ)⁻¹ * vecNormSq q + (1 / 2 : ℝ) * vecNormSq p := by + have hne : (2 * Θ) ≠ 0 := by positivity + field_simp + rw [harith] at hdhi + -- assemble + have hYRY : + blockVecDot Ylo (blockMatVecMul (blockReflect (blockMatrixOfCoeff A)) Ylo) ≤ + (2 * Θ)⁻¹ * vecNormSq q + (1 / 2 : ℝ) * vecNormSq p := by + rw [hswap, hZ] + have hup' : + blockVecDot ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p) + (blockMatVecMul (blockMatrixOfCoeff A) ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p)) ≤ + blockVecDot ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p) + (blockMatVecMul + (blockDiag ((2 * Θ) • (1 : Mat d)) ((2 : ℝ) • (1 : Mat d))) + ((2 * Θ)⁻¹ • q, (1 / 2 : ℝ) • p)) := by + have := hup; linarith [this] + rw [hdhi] at hup' + exact hup' + -- reduce the block Loewner goal and finish + show (1 / 2 : ℝ) * blockVecDot (p, q) Ylo ≤ + (1 / 2 : ℝ) * blockVecDot (p, q) (blockMatVecMul (blockMatrixOfCoeff A) (p, q)) + rw [hDlo] + rw [hDlo] at hfen + linarith [hfen, hYRY] + +/-! ## A9 — two-field comparison + +The verified scalar action on `BlockMat d` (componentwise), and the comparison +`bfB ≤ 4Θ • bfA` for two matrices in the same `(1, Θ)` ellipticity class. -/ + +/-- Componentwise scalar action on doubled block matrices. -/ +-- Candidate for relocation to `Homogenization/Ambient/BlockMatrix.lean`. +instance : SMul ℝ (BlockMat d) where + smul c P := + { upperLeft := c • P.upperLeft + upperRight := c • P.upperRight + lowerLeft := c • P.lowerLeft + lowerRight := c • P.lowerRight } + +@[simp] theorem blockSMul_upperLeft (c : ℝ) (P : BlockMat d) : + (c • P).upperLeft = c • P.upperLeft := rfl +@[simp] theorem blockSMul_upperRight (c : ℝ) (P : BlockMat d) : + (c • P).upperRight = c • P.upperRight := rfl +@[simp] theorem blockSMul_lowerLeft (c : ℝ) (P : BlockMat d) : + (c • P).lowerLeft = c • P.lowerLeft := rfl +@[simp] theorem blockSMul_lowerRight (c : ℝ) (P : BlockMat d) : + (c • P).lowerRight = c • P.lowerRight := rfl + +/-- The scalar action commutes with the doubled action. -/ +theorem blockMatVecMul_blockSMul (c : ℝ) (P : BlockMat d) (X : BlockVec d) : + blockMatVecMul (c • P) X = c • blockMatVecMul P X := by + rcases X with ⟨p, q⟩ + refine Prod.ext ?_ ?_ <;> + simp [blockMatVecMul, smul_matVecMul, smul_add] + +/-- `blockSMul` on block-diagonal scalar matrices. -/ +theorem blockSMul_blockDiag_smul_one (c a b : ℝ) : + (c • blockDiag (a • (1 : Mat d)) (b • (1 : Mat d))) = + blockDiag ((c * a) • (1 : Mat d)) ((c * b) • (1 : Mat d)) := by + refine blockMat_ext ?_ ?_ ?_ ?_ <;> + simp [blockDiag, mul_smul] + +/-- The block Loewner order is preserved by nonnegative scaling. -/ +theorem blockMatLoewnerLE_smul {c : ℝ} (hc : 0 ≤ c) {P Q : BlockMat d} + (h : BlockMatLoewnerLE P Q) : BlockMatLoewnerLE (c • P) (c • Q) := by + intro X + have hx := h X + rw [blockMatVecMul_blockSMul, blockMatVecMul_blockSMul, blockVecDot_smul_right, + blockVecDot_smul_right] + nlinarith [hx, hc] + +/-- **A9.** For `A`, `B` in the same `(1, Θ)` ellipticity class, +`bfB ≤ (4Θ) • bfA` in the block Loewner order. -/ +theorem blockMatrixOfCoeff_blockMatLoewnerLE_smul_of_isThetaElliptic + {Θ : ℝ} {A B : Mat d} (hA : IsThetaElliptic Θ A) (hB : IsThetaElliptic Θ B) : + BlockMatLoewnerLE (blockMatrixOfCoeff B) ((4 * Θ) • blockMatrixOfCoeff A) := by + have hΘ : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hA.2.1 + have hne : (2 * Θ) ≠ 0 := by positivity + -- bfB ≤ blockDiag (2Θ • 1) (2 • 1) + have hupB := blockMatrixOfCoeff_blockMatLoewnerLE_blockDiag_of_isThetaElliptic hB + -- blockDiag (½ • 1) ((2Θ)⁻¹ • 1) ≤ bfA + have hloA := blockDiag_blockMatLoewnerLE_blockMatrixOfCoeff_of_isThetaElliptic hA + -- scale the lower bound by 4Θ ≥ 0 + have hscaled := blockMatLoewnerLE_smul (c := 4 * Θ) (by positivity) hloA + -- 4Θ • blockDiag (½ • 1) ((2Θ)⁻¹ • 1) = blockDiag (2Θ • 1) (2 • 1) + have hdiageq : + (4 * Θ) • blockDiag ((1 / 2 : ℝ) • (1 : Mat d)) ((2 * Θ)⁻¹ • (1 : Mat d)) = + blockDiag ((2 * Θ) • (1 : Mat d)) ((2 : ℝ) • (1 : Mat d)) := by + rw [blockSMul_blockDiag_smul_one] + have e1 : (4 * Θ) * (1 / 2 : ℝ) = 2 * Θ := by ring + have e2 : (4 * Θ) * (2 * Θ)⁻¹ = (2 : ℝ) := by + rw [show (4 : ℝ) * Θ = 2 * (2 * Θ) by ring, mul_assoc, mul_inv_cancel₀ hne, mul_one] + rw [e1, e2] + rw [hdiageq] at hscaled + exact BlockMatLoewnerLE.trans hupB hscaled + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Subadditivity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Subadditivity.lean new file mode 100644 index 0000000000..a7f552fd1a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Subadditivity.lean @@ -0,0 +1,575 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockMatrixProperties +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush + +/-! # Subadditivity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +Subadditivity and scaling results for the deterministic coarse objects. + +This file is reserved for the theorem families implementing the Chapter-2 note +label `l.cg.subadditivity.basic.definitions` together with the downstream +block-matrix subadditivity consequences. + +Planned theorem-family prefixes: + +- `responseJ_subadditive_*` +- `coarseBlockMatrix_subadditive_*` +- `coarseStarredBlockMatrixInv_subadditive_*` +-/ + +private theorem volumeAverage_openCubeSet_eq_cubeAverage {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) : + volumeAverage (openCubeSet Q) f = cubeAverage Q f := by + calc + volumeAverage (openCubeSet Q) f + = (cubeVolume Q)⁻¹ * ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume := by + unfold volumeAverage + rw [volume_openCubeSet_toReal] + _ = (cubeVolume Q)⁻¹ * ∫ x in cubeSet Q, f x ∂MeasureTheory.volume := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = cubeAverage Q f := rfl + +private theorem volumeAverage_openCubeSet_eq_descendantsAverage_volumeAverage_openCubeSet_of_integrableOn + {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.IntegrableOn f (openCubeSet Q) MeasureTheory.volume) : + volumeAverage (openCubeSet Q) f = + descendantsAverage Q 1 (fun R => volumeAverage (openCubeSet R) f) := by + have hCube : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume := + (integrableOn_cubeSet_iff_integrableOn_openCubeSet).2 hf + rw [volumeAverage_openCubeSet_eq_cubeAverage] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn Q 1 f hCube] + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q 1).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + exact (volumeAverage_openCubeSet_eq_cubeAverage R f).symm + +private theorem descendantsAverage_add_const {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℝ) (c : ℝ) : + descendantsAverage Q j (fun R => F R + c) = descendantsAverage Q j F + c := by + classical + let D := descendantsAtDepth Q j + change (↑D.card)⁻¹ * D.sum (fun R => F R + c) = (↑D.card)⁻¹ * D.sum F + c + rw [Finset.sum_add_distrib, Finset.sum_const, nsmul_eq_mul, left_distrib] + have hD : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hcard : ((D.card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr hD) + calc + (↑D.card)⁻¹ * D.sum F + (↑D.card)⁻¹ * (↑D.card * c) + = (↑D.card)⁻¹ * D.sum F + ((↑D.card)⁻¹ * ↑D.card) * c := by ring + _ = (↑D.card)⁻¹ * D.sum F + c := by + rw [inv_mul_cancel₀ hcard, one_mul] + +theorem descendantsAverage_add {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F G : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => F R + G R) = + descendantsAverage Q j F + descendantsAverage Q j G := by + classical + let D := descendantsAtDepth Q j + change (↑D.card)⁻¹ * D.sum (fun R => F R + G R) = + (↑D.card)⁻¹ * D.sum F + (↑D.card)⁻¹ * D.sum G + rw [Finset.sum_add_distrib, left_distrib] + +theorem descendantsAverage_smul {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (c : ℝ) (F : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => c * F R) = c * descendantsAverage Q j F := by + simpa using descendantsAverage_mul_left Q j c F + +/-- +Entrywise descendants average of a matrix-valued observable on the depth-`j` +descendants of `Q`. +-/ +noncomputable def descendantsAverageMat {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → Mat d) : Mat d := + fun i k => descendantsAverage Q j (fun R => F R i k) + +/-- +Entrywise descendants average of a block-matrix-valued observable on the +depth-`j` descendants of `Q`. +-/ +noncomputable def descendantsAverageBlockMat {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → BlockMat d) : BlockMat d := + { upperLeft := descendantsAverageMat Q j (fun R => (F R).upperLeft) + upperRight := descendantsAverageMat Q j (fun R => (F R).upperRight) + lowerLeft := descendantsAverageMat Q j (fun R => (F R).lowerLeft) + lowerRight := descendantsAverageMat Q j (fun R => (F R).lowerRight) } + +theorem matVecMul_descendantsAverageMat {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → Mat d) (x : Vec d) : + matVecMul (descendantsAverageMat Q j F) x = + fun i => descendantsAverage Q j (fun R => matVecMul (F R) x i) := by + classical + funext i + let D := descendantsAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + calc + matVecMul (descendantsAverageMat Q j F) x i + = ∑ k, (c * D.sum (fun R => F R i k)) * x k := by + simp [descendantsAverageMat, descendantsAverage, matVecMul, D, c] + _ = ∑ k, c * (D.sum (fun R => F R i k) * x k) := by + refine Finset.sum_congr rfl ?_ + intro k hk + ring + _ = c * ∑ k, D.sum (fun R => F R i k) * x k := by + rw [← Finset.mul_sum] + _ = c * ∑ k, D.sum (fun R => F R i k * x k) := by + simp_rw [Finset.sum_mul] + _ = c * D.sum (fun R => ∑ k, F R i k * x k) := by + rw [Finset.sum_comm] + _ = descendantsAverage Q j (fun R => matVecMul (F R) x i) := by + simp [descendantsAverage, matVecMul, D, c] + +theorem vecDot_matVecMul_descendantsAverageMat {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → Mat d) (x y : Vec d) : + vecDot x (matVecMul (descendantsAverageMat Q j F) y) = + descendantsAverage Q j (fun R => vecDot x (matVecMul (F R) y)) := by + classical + rw [matVecMul_descendantsAverageMat] + let D := descendantsAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + calc + vecDot x (fun i => descendantsAverage Q j (fun R => matVecMul (F R) y i)) + = ∑ i, x i * (c * D.sum (fun R => matVecMul (F R) y i)) := by + simp [vecDot, descendantsAverage, D, c] + _ = ∑ i, c * (x i * D.sum (fun R => matVecMul (F R) y i)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = c * ∑ i, x i * D.sum (fun R => matVecMul (F R) y i) := by + rw [← Finset.mul_sum] + _ = c * ∑ i, D.sum (fun R => x i * matVecMul (F R) y i) := by + simp_rw [Finset.mul_sum] + _ = c * D.sum (fun R => ∑ i, x i * matVecMul (F R) y i) := by + rw [Finset.sum_comm] + _ = descendantsAverage Q j (fun R => vecDot x (matVecMul (F R) y)) := by + simp [vecDot, descendantsAverage, D, c] + +theorem blockVecDot_blockMatVecMul_descendantsAverageBlockMat {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → BlockMat d) + (X Y : BlockVec d) : + blockVecDot X (blockMatVecMul (descendantsAverageBlockMat Q j F) Y) = + descendantsAverage Q j (fun R => blockVecDot X (blockMatVecMul (F R) Y)) := by + rcases X with ⟨p, q⟩ + rcases Y with ⟨r, s⟩ + simp [descendantsAverageBlockMat, blockVecDot, blockMatVecMul, + vecDot_add_right, vecDot_matVecMul_descendantsAverageMat, descendantsAverage_add, + add_assoc] + +theorem responseJ_subadditive_openCubeSet_childCubes_of_isEllipticFieldOn {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) (p q : Vec d) : + ResponseJ (openCubeSet Q) p q a ≤ + descendantsAverage Q 1 (fun R => ResponseJ (openCubeSet R) p q a) := by + let : Fact (MeasureTheory.volume (openCubeSet Q) < ⊤) := ⟨volume_openCubeSet_lt_top Q⟩ + have hQvol : (MeasureTheory.volume (openCubeSet Q)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hQopen : IsOpen (openCubeSet Q) := isOpen_openCubeSet Q + unfold ResponseJ + refine csSup_le (responseJValueSet_nonempty (openCubeSet Q) p q a) ?_ + rintro m ⟨u, rfl⟩ + have hrespInt : + MeasureTheory.IntegrableOn + (scalarResponseIntegrand (openCubeSet Q) a p q u) (openCubeSet Q) := by + exact scalarResponseIntegrand_integrableOn_of_isEllipticFieldOn hEll p q u + calc + volumeAverage (openCubeSet Q) (scalarResponseIntegrand (openCubeSet Q) a p q u) + = descendantsAverage Q 1 + (fun R => volumeAverage (openCubeSet R) + (scalarResponseIntegrand (openCubeSet Q) a p q u)) := by + exact + volumeAverage_openCubeSet_eq_descendantsAverage_volumeAverage_openCubeSet_of_integrableOn + Q (scalarResponseIntegrand (openCubeSet Q) a p q u) hrespInt + _ ≤ descendantsAverage Q 1 (fun R => ResponseJ (openCubeSet R) p q a) := by + unfold descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · refine Finset.sum_le_sum ?_ + intro R hR + have hRchild : R ∈ childCubes Q := by + simpa [descendantsAtDepth_one] using hR + have hRsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_childCubes hRchild + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) hRsub + let : Fact (MeasureTheory.volume (openCubeSet R) < ⊤) := + ⟨volume_openCubeSet_lt_top R⟩ + have hRvol : (MeasureTheory.volume (openCubeSet R)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos R).ne' + let uR : AHarmonicFunction a (openCubeSet R) := + u.restrictOfIsEllipticFieldOn hQopen (isOpen_openCubeSet R) hRsub hEllR + have hcongr : + scalarResponseIntegrand (openCubeSet Q) a p q u = + scalarResponseIntegrand (openCubeSet R) a p q uR := by + funext x + simp [uR, scalarResponseIntegrand, H1Function.restrict] + have hmem : + volumeAverage (openCubeSet R) + (scalarResponseIntegrand (openCubeSet R) a p q uR) ∈ + responseJValueSet (openCubeSet R) p q a := + responseJValueSet_mem (openCubeSet R) p q a uR + calc + volumeAverage (openCubeSet R) + (scalarResponseIntegrand (openCubeSet Q) a p q u) + = volumeAverage (openCubeSet R) + (scalarResponseIntegrand (openCubeSet R) a p q uR) := by + exact congrArg (volumeAverage (openCubeSet R)) hcongr + _ ≤ ResponseJ (openCubeSet R) p q a := by + exact le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEllR hRvol p q hmem + · positivity + +theorem responseJ_subadditive_openCubeSet_originCube_childCubes_of_isEllipticFieldOn + {d : ℕ} (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) (p q : Vec d) : + ResponseJ (openCubeSet (originCube d n)) p q a ≤ + descendantsAverage (originCube d n) 1 (fun R => ResponseJ (openCubeSet R) p q a) := by + simpa using responseJ_subadditive_openCubeSet_childCubes_of_isEllipticFieldOn + (Q := originCube d n) a hEll p q + +theorem responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn {d : ℕ} + (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) (p q : Vec d) : + ResponseJ (openCubeSet Q) p q a ≤ + descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p q a) := by + induction j generalizing Q with + | zero => + unfold descendantsAverage + simp + | succ j ih => + calc + ResponseJ (openCubeSet Q) p q a + ≤ descendantsAverage Q 1 (fun R => ResponseJ (openCubeSet R) p q a) := by + exact responseJ_subadditive_openCubeSet_childCubes_of_isEllipticFieldOn + Q a hEll p q + _ ≤ descendantsAverage Q 1 + (fun R => descendantsAverage R j (fun S => ResponseJ (openCubeSet S) p q a)) := by + unfold descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · refine Finset.sum_le_sum ?_ + intro R hR + have hRchild : R ∈ childCubes Q := by + simpa [descendantsAtDepth_one] using hR + have hRsub : openCubeSet R ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_childCubes hRchild + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) hRsub + exact ih (Q := R) hEllR + · positivity + _ = descendantsAverage Q (j + 1) + (fun R => ResponseJ (openCubeSet R) p q a) := by + have havg := + descendantsAverage_add_eq_descendantsAverage_descendantsAverage Q 1 j + (fun R => ResponseJ (openCubeSet R) p q a) + simpa [Nat.add_comm] using havg.symm + +theorem responseJ_subadditive_cubeSet_childCubes_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) (p q : Vec d) : + ResponseJ (cubeSet Q) p q a ≤ + descendantsAverage Q 1 (fun R => ResponseJ (cubeSet R) p q a) := by + calc + ResponseJ (cubeSet Q) p q a = ResponseJ (openCubeSet Q) p q a := by + exact responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a + _ ≤ descendantsAverage Q 1 (fun R => ResponseJ (openCubeSet R) p q a) := by + exact responseJ_subadditive_openCubeSet_childCubes_of_isEllipticFieldOn Q a hEll p q + _ = descendantsAverage Q 1 (fun R => ResponseJ (cubeSet R) p q a) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q 1).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [responseJ_cubeSet_eq_openCubeSet_of_triadicCube R p q a] + +theorem responseJ_subadditive_cubeSet_descendantsAtDepth_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) (p q : Vec d) : + ResponseJ (cubeSet Q) p q a ≤ + descendantsAverage Q j (fun R => ResponseJ (cubeSet R) p q a) := by + calc + ResponseJ (cubeSet Q) p q a = ResponseJ (openCubeSet Q) p q a := by + exact responseJ_cubeSet_eq_openCubeSet_of_triadicCube Q p q a + _ ≤ descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p q a) := by + exact responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q a hEll p q + _ = descendantsAverage Q j (fun R => ResponseJ (cubeSet R) p q a) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [responseJ_cubeSet_eq_openCubeSet_of_triadicCube R p q a] + +theorem responseJ_subadditive_openCubeSet_originCube_descendantsAtDepth_of_isEllipticFieldOn + {d : ℕ} (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) (p q : Vec d) : + ResponseJ (openCubeSet (originCube d n)) p q a ≤ + descendantsAverage (originCube d n) j (fun R => ResponseJ (openCubeSet R) p q a) := by + simpa using responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + (Q := originCube d n) j a hEll p q + +theorem responseJ_subadditive_cubeSet_originCube_childCubes_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) (p q : Vec d) : + ResponseJ (cubeSet (originCube d n)) p q a ≤ + descendantsAverage (originCube d n) 1 (fun R => ResponseJ (cubeSet R) p q a) := by + simpa using + responseJ_subadditive_cubeSet_childCubes_of_isEllipticFieldOn + (Q := originCube d n) a hEll p q + +theorem responseJ_subadditive_cubeSet_originCube_descendantsAtDepth_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (j : ℕ) (n : ℤ) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) (p q : Vec d) : + ResponseJ (cubeSet (originCube d n)) p q a ≤ + descendantsAverage (originCube d n) j (fun R => ResponseJ (cubeSet R) p q a) := by + simpa using + responseJ_subadditive_cubeSet_descendantsAtDepth_of_isEllipticFieldOn + (Q := originCube d n) j a hEll p q + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_pair_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) + (p q : Vec d) : + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q))) := by + have hscalar : + ResponseJ (openCubeSet Q) p q a ≤ + descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p q a) := + responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q a hEll p q + calc + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) + = ResponseJ (openCubeSet Q) p q a + vecDot p q := by + linarith [hRespQ p q] + _ ≤ descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p q a) + vecDot p q := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hscalar (vecDot p q) + _ = descendantsAverage Q j (fun R => ResponseJ (openCubeSet R) p q a + vecDot p q) := by + symm + exact descendantsAverage_add_const Q j + (fun R => ResponseJ (openCubeSet R) p q a) (vecDot p q) + _ = descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q))) := by + unfold descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + linarith [hRespDesc R hR p q] + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) X) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + simpa using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_pair_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc (-X.1) X.2 + +theorem coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) : + BlockMatLoewnerLE (coarseBlockMatrix (openCubeSet Q) a) + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) X) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) X)) := by + exact + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc X + _ = (1 / 2 : ℝ) * + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q j (fun R => coarseBlockMatrix (openCubeSet R) a)) X) := by + rw [descendantsAverage_smul] + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) + (X : BlockVec d) : + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a) X) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + simpa [coarseStarredBlockMatrixInv_eq_blockReflect] using + coarseBlockMatrix_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc (X.2, X.1) + +theorem coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) : + BlockMatLoewnerLE (coarseStarredBlockMatrixInv (openCubeSet Q) a) + (descendantsAverageBlockMat Q j + (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) := by + intro X + calc + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a) X) + ≤ descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * blockVecDot X + (blockMatVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a) X)) := by + exact + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc X + _ = (1 / 2 : ℝ) * + blockVecDot X + (blockMatVecMul + (descendantsAverageBlockMat Q j + (fun R => coarseStarredBlockMatrixInv (openCubeSet R) a)) X) := by + rw [descendantsAverage_smul] + rw [blockVecDot_blockMatVecMul_descendantsAverageBlockMat] + +theorem coarseStarredBlockMatrixInv_upperLeft_subadditive_openCubeSet_descendantsAtDepth_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) + (p : Vec d) : + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a).upperLeft p) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).upperLeft p)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc (p, 0) + +theorem coarseStarredBlockMatrixInv_lowerRight_subadditive_openCubeSet_descendantsAtDepth_of_responseJ_blockQuadratic + {d : ℕ} (j : ℕ) (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRespQ : + ∀ p q : Vec d, + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet Q) a) (-p, q)) - + vecDot p q) + (hRespDesc : + ∀ R ∈ descendantsAtDepth Q j, ∀ p q : Vec d, + ResponseJ (openCubeSet R) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (openCubeSet R) a) (-p, q)) - + vecDot p q) + (q : Vec d) : + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet Q) a).lowerRight q) ≤ + descendantsAverage Q j + (fun R => + (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseStarredBlockMatrixInv (openCubeSet R) a).lowerRight q)) := by + simpa [blockVecDot, blockMatVecMul, matVecMul_zero, vecDot_zero_left, vecDot_zero_right] using + coarseStarredBlockMatrixInv_subadditive_openCubeSet_descendantsAtDepth_blockQuadratic_of_responseJ_blockQuadratic + j Q a hEll hRespQ hRespDesc (0, q) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric.lean new file mode 100644 index 0000000000..f83b08d071 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Basic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CoarseMatrices +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Response +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CompletedSquare +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Bracketing +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OpenBoundedConvex +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.VariationalProblems +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OriginCube + +/-! # Symmetric -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/AverageFormulas.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/AverageFormulas.lean new file mode 100644 index 0000000000..e8a438173e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/AverageFormulas.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CanonicalFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Response + +/-! # Average Formulas -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Average formulas for symmetric coefficient fields + +For symmetric coefficient fields, the canonical average-gradient and +average-flux formulas split into pure Dirichlet and Neumann response pieces. +The scalar maximizer for `(p, 0)` corresponds to the negative of the affine +Dirichlet solution, which accounts for the signs in the pure-gradient formulas. +-/ + +namespace ScalarCanonicalMaximizer + +private theorem zero_matVecMul {d : ℕ} (x : Vec d) : + matVecMul (0 : Mat d) x = 0 := by + funext i + simp [matVecMul] + +theorem averageGradientFormulaCanonical_p_zero_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {p : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U p 0 a) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U + (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = -p := by + have hAvg := + ScalarCanonicalMaximizer.averageGradientFormulaCanonical + (v := v) hS hK hdet hInt vGrad + have hk : kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + rw [hAvg, hk] + simp [zero_matVecMul, matVecMul_zero] + +theorem averageFluxFormulaCanonical_p_zero_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {p : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U p 0 a) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = + -matVecMul (sigmaCoarse U a) p := by + have hAvg := + ScalarCanonicalMaximizer.averageFluxFormulaCanonical + (v := v) hS hK hSigma hdet hInt vFlux + have hk : kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + have hb : + bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a) = + sigmaCoarse U a := + bCoarse_canonical_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + ha hA + rw [hAvg, hb, hk] + simp [matTranspose, matVecMul_zero] + +theorem averageGradientFormulaCanonical_zero_q_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {q : Vec d} {a : CoeffField d} + {sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U 0 q a) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + (fun i => volumeAverage U + (fun x => (v : AHarmonicFunction a U).toH1.grad x i)) = + matVecMul (sigmaStarInvCoarse U a) q := by + have hAvg := + ScalarCanonicalMaximizer.averageGradientFormulaCanonical + (v := v) hS hK hdet hInt vGrad + have hk : kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + rw [hAvg, hk] + simp [zero_matVecMul] + +theorem averageFluxFormulaCanonical_zero_q_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {q : Vec d} {a : CoeffField d} + {sigma sigmaStar kappa : Mat d} + (v : ScalarCanonicalMaximizer U 0 q a) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + (fun i => volumeAverage U + (fun x => matVecMul (a x) ((v : AHarmonicFunction a U).toH1.grad x) i)) = q := by + have hAvg := + ScalarCanonicalMaximizer.averageFluxFormulaCanonical + (v := v) hS hK hSigma hdet hInt vFlux + have hk : kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + rw [hAvg, hk] + simp [matTranspose, zero_matVecMul, matVecMul_zero] + +end ScalarCanonicalMaximizer + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Basic.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Basic.lean new file mode 100644 index 0000000000..53ef9a4973 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Basic.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Symmetric coefficient fields + +This file contains the lightweight pointwise symmetry API used to specialize the +general nonsymmetric coarse-graining definitions to symmetric coefficient +fields. +-/ + +/-- A coefficient field is symmetric if each pointwise coefficient matrix is +symmetric. -/ +def IsSymmetricCoeffField {d : ℕ} (a : CoeffField d) : Prop := + ∀ x, (a x).IsSymm + +namespace IsSymmetricCoeffField + +theorem apply {d : ℕ} {a : CoeffField d} (ha : IsSymmetricCoeffField a) + (x : Vec d) : + (a x).IsSymm := + ha x + +theorem translateCoeffField {d : ℕ} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) (z : Vec d) : + IsSymmetricCoeffField (Homogenization.translateCoeffField z a) := by + intro x + exact ha (fun i => x i + z i) + +end IsSymmetricCoeffField + +theorem isSymmetricCoeffField_iff_matTranspose_eq {d : ℕ} {a : CoeffField d} : + IsSymmetricCoeffField a ↔ ∀ x, matTranspose (a x) = a x := by + constructor + · intro ha x + simpa [matTranspose] using (ha x).eq + · intro h x + rw [Matrix.IsSymm] + simpa [matTranspose] using h x + +theorem adjointCoeffField_eq_self_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} (ha : IsSymmetricCoeffField a) : + adjointCoeffField a = a := by + funext x + simpa [adjointCoeffField] using + (isSymmetricCoeffField_iff_matTranspose_eq.mp ha x) + +theorem symmPart_eq_self_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} (ha : IsSymmetricCoeffField a) (x : Vec d) : + symmPart (a x) = a x := by + ext i j + simp [symmPart, (ha x).apply i j] + +theorem skewPart_eq_zero_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} (ha : IsSymmetricCoeffField a) (x : Vec d) : + skewPart (a x) = 0 := by + ext i j + simp [skewPart, (ha x).apply i j] + +theorem symmCoeffField_eq_self_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} (ha : IsSymmetricCoeffField a) : + symmCoeffField a = a := by + funext x + exact symmPart_eq_self_of_isSymmetricCoeffField ha x + +theorem skewCoeffField_eq_zero_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} (ha : IsSymmetricCoeffField a) : + skewCoeffField a = 0 := by + funext x + exact skewPart_eq_zero_of_isSymmetricCoeffField ha x + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Bracketing.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Bracketing.lean new file mode 100644 index 0000000000..6ad5db0516 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Bracketing.lean @@ -0,0 +1,127 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarLeSigma +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CoarseMatrices + +/-! # Bracketing -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Dirichlet--Neumann bracketing for symmetric coefficient fields + +This file records the symmetric specializations of the deterministic +harmonic-mean and arithmetic-mean bounds for the canonical coarse matrices. +-/ + +/-- For symmetric coefficient fields, the averaged inverse symmetric part is +the average of the pointwise inverse coefficient matrices. -/ +theorem averagedSymmPartInv_eq_volumeAverageMat_inv_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) : + averagedSymmPartInv U a = volumeAverageMat U (fun x : Vec d => (a x)⁻¹) := by + ext i j + simp [averagedSymmPartInv, volumeAverageMat, + symmPart_eq_self_of_isSymmetricCoeffField ha] + +/-- For symmetric coefficient fields, the upper-left averaged correction is +just the arithmetic average of the coefficient field. -/ +theorem averagedSymmPartPlusCorrection_eq_volumeAverageMat_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) : + averagedSymmPartPlusCorrection U a = volumeAverageMat U a := by + ext i j + simp [averagedSymmPartPlusCorrection, volumeAverageMat, + symmPart_eq_self_of_isSymmetricCoeffField ha, + skewPart_eq_zero_of_isSymmetricCoeffField ha] + +/-- +Symmetric harmonic-mean lower bound: +`(average_U a^{-1})^{-1} ≤ sigmaStarCoarse(U; a)`. +-/ +theorem harmonicMeanCoeffField_le_sigmaStarCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) : + MatLoewnerLE + ((volumeAverageMat U (fun x : Vec d => (a x)⁻¹))⁻¹) + (sigmaStarCoarse U a) := by + have h := + harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat + rw [averagedSymmPartInv_eq_volumeAverageMat_inv_of_isSymmetricCoeffField ha] at h + exact h + +/-- +The middle Dirichlet--Neumann ordering `sigmaStarCoarse(U; a) ≤ +sigmaCoarse(U; a)`, repackaged on the symmetric theorem surface. +-/ +theorem sigmaStarCoarse_le_sigmaCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (_ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE (sigmaStarCoarse U a) (sigmaCoarse U a) := by + intro p + have hbase : + vecDot p (matVecMul (sigmaStarCoarse U a) p) ≤ + vecDot p (matVecMul (sigmaCoarse U a) p) := + sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat hA hS hK hSigma p + nlinarith + +/-- +Symmetric arithmetic-mean upper bound: +`sigmaCoarse(U; a) ≤ average_U a`. +-/ +theorem sigmaCoarse_le_volumeAverageMat_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + MatLoewnerLE (sigmaCoarse U a) (volumeAverageMat U a) := by + have h := + bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat hA hS hK hSigma + rw [bCoarse_canonical_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA, + averagedSymmPartPlusCorrection_eq_volumeAverageMat_of_isSymmetricCoeffField ha] at h + exact h + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CoarseMatrices.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CoarseMatrices.lean new file mode 100644 index 0000000000..1d06bdb19d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CoarseMatrices.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Basic + +/-! # Coarse Matrices -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Symmetric coefficient fields and coarse matrices + +This file specializes the deterministic coarse-matrix API to pointwise +symmetric coefficient fields. The main structural consequence is that the +canonical coupling matrix `kappaCoarse` vanishes. +-/ + +@[simp] theorem bCoarse_zero_right {d : ℕ} (sigma sigmaStar : Mat d) : + bCoarse sigma sigmaStar (0 : Mat d) = sigma := by + simp [bCoarse] + +@[simp] theorem aCoarse_zero_right {d : ℕ} (sigma : Mat d) : + aCoarse sigma (0 : Mat d) = sigma := by + simp [aCoarse, matTranspose] + +@[simp] theorem aStarCoarse_zero_right {d : ℕ} (sigmaStar : Mat d) : + aStarCoarse sigmaStar (0 : Mat d) = sigmaStar := by + simp [aStarCoarse, matTranspose] + +theorem sigmaStarInvKappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + sigmaStarInvKappaCoarse U a = 0 := + sigmaStarInvKappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := U) (a := a) hA + (adjointCoeffField_eq_self_of_isSymmetricCoeffField ha) + +theorem kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := U) (a := a) hA + (adjointCoeffField_eq_self_of_isSymmetricCoeffField ha) + +theorem coarseBlockMatrix_lowerLeft_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).lowerLeft = 0 := by + rw [coarseBlockMatrix_lowerLeft_eq_of_isCoarseBlockMatrix hA, + sigmaStarInvKappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp + +theorem coarseBlockMatrix_upperRight_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).upperRight = 0 := by + rw [coarseBlockMatrix_upperRight_eq_of_isCoarseBlockMatrix hA, + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp [matTranspose] + +theorem coarseBlockMatrix_upperLeft_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).upperLeft = sigmaCoarse U a := by + rw [coarseBlockMatrix_upperLeft_eq_of_isCoarseBlockMatrix hA, + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp + +theorem coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (_ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := + coarseBlockMatrix_lowerRight_eq_of_isCoarseBlockMatrix hA + +theorem bCoarse_canonical_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a) = + sigmaCoarse U a := by + rw [kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp + +theorem aCoarse_canonical_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + aCoarse (sigmaCoarse U a) (kappaCoarse U a) = sigmaCoarse U a := by + rw [kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp + +theorem aStarCoarse_canonical_eq_sigmaStarCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) : + aStarCoarse (sigmaStarCoarse U a) (kappaCoarse U a) = sigmaStarCoarse U a := by + rw [kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA] + simp + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CompletedSquare.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CompletedSquare.lean new file mode 100644 index 0000000000..113102d51f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/CompletedSquare.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Response + +/-! # Completed Square -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Completed squares for symmetric coefficient fields + +This file specializes the nonsymmetric magic identities to the symmetric case, +where `kappa` vanishes and the completed square is centered at +`q = sigmaStar * p`. +-/ + +private theorem zero_matVecMul {d : ℕ} (x : Vec d) : + matVecMul (0 : Mat d) x = 0 := by + funext i + simp [matVecMul] + +theorem responseJ_completedSquare_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) := by + have hk : kappa = 0 := + kappa_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix_of_isKappaCoarse + ha hA hS hK hdet + calc + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (kappa + matTranspose kappa) p) + + (1 / 2 : ℝ) * vecDot (q - matVecMul (sigmaStar - kappa) p) + (matVecMul sigmaStar⁻¹ (q - matVecMul (sigmaStar - kappa) p)) := by + exact magic_identity_responseJ_shifted_square_of_isSigmaCoarse + U a hS hK hSigma hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) := by + rw [hk] + simp [matTranspose, zero_matVecMul, vecDot_zero_right] + +theorem responseJ_sigmaStar_mul_eq_half_gap_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul sigmaStar p) a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) := by + rw [responseJ_completedSquare_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p (matVecMul sigmaStar p)] + simp [vecDot_zero_left, matVecMul_zero] + +theorem responseJ_sigmaStarCoarse_mul_eq_half_gap_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a) p) a = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet] + exact responseJ_sigmaStar_mul_eq_half_gap_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OpenBoundedConvex.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OpenBoundedConvex.lean new file mode 100644 index 0000000000..15e2abe1c0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OpenBoundedConvex.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarPosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CompletedSquare + +/-! # Open Bounded Convex -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Symmetric response wrappers on open bounded convex domains + +The core symmetric response identities require the determinant guard +`IsUnit sigmaStar.det`. On open bounded convex domains, elliptic recovery data +supplies this guard from the usual deterministic hypotheses. +-/ + +/-- +Open-bounded-convex wrapper for the symmetric split quadratic response formula. +-/ +theorem responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) - + vecDot p q := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat hS + exact + responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p q + +/-- +Open-bounded-convex wrapper for the symmetric completed-square identity. +-/ +theorem responseJ_completedSquare_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigma - sigmaStar) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul sigmaStar p) + (matVecMul sigmaStar⁻¹ (q - matVecMul sigmaStar p)) := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat hS + exact responseJ_completedSquare_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p q + +/-- +Open-bounded-convex wrapper for the canonical symmetric gap identity at +`q = sigmaStarCoarse p`. +-/ +theorem responseJ_sigmaStarCoarse_mul_eq_half_gap_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (R : PotentialSolenoidalL2RecoveryData U) (hConv : IsOpenBoundedConvexDomain U) + {a : CoeffField d} {lam Lam : ℝ} + (ha : IsSymmetricCoeffField a) (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (p : Vec d) : + ResponseJ U p (matVecMul (sigmaStarCoarse U a) p) a = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) := by + have hdet : + IsUnit sigmaStar.det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := U) (a := a) R hConv hEll hvol compat hS + exact responseJ_sigmaStarCoarse_mul_eq_half_gap_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OriginCube.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OriginCube.lean new file mode 100644 index 0000000000..35686a5ce9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/OriginCube.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.DeterministicCoarseData +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Bracketing +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CompletedSquare + +/-! # Origin Cube -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Symmetric formulas on triadic open cubes + +This file repackages the symmetric coarse-graining identities on triadic open +cubes, using the translated origin-cube recovery data which supplies the +deterministic coarse data hypotheses. +-/ + +/-- +If the coefficient field is symmetric, then the canonical coarse coupling +matrix `kappaCoarse` vanishes on any triadic open cube once translated +origin-cube elliptic recovery data is available. +-/ +theorem kappaCoarse_eq_zero_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hRec : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (ha : IsSymmetricCoeffField a) : + kappaCoarse (openCubeSet Q) a = 0 := by + exact + kappaCoarse_eq_zero_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData_of_adjointCoeffField_eq + Q R hRec (adjointCoeffField_eq_self_of_isSymmetricCoeffField ha) + +/-- +On a triadic open cube with translated origin-cube recovery data, a symmetric +coefficient field splits the two response variables: +`ResponseJ p q = 1/2 p * sigmaCoarse * p + + 1/2 q * sigmaStarInvCoarse * q - p·q`. +-/ +theorem responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hRec : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (ha : IsSymmetricCoeffField a) (p q : Vec d) : + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse (openCubeSet Q) a) p) + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) - + vecDot p q := by + rcases + openCubeDeterministicCoarseData_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hRec with + ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p q + +/-- +At the canonical symmetric coupling `q = sigmaStarCoarse p`, the response is +one half of the gap between the two canonical coarse matrices. +-/ +theorem responseJ_sigmaStarCoarse_mul_eq_half_gap_openCubeSet_of_triadicCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d Q.scale))) + {lam Lam : ℝ} {a : CoeffField d} + (hRec : + HasOpenCubeEllipticRecoveryData (d := d) Q.scale R + (lam := lam) (Lam := Lam) + (translateCoeffField (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) a)) + (ha : IsSymmetricCoeffField a) (p : Vec d) : + ResponseJ (openCubeSet Q) p + (matVecMul (sigmaStarCoarse (openCubeSet Q) a) p) a = + (1 / 2 : ℝ) * + vecDot p (matVecMul + (sigmaCoarse (openCubeSet Q) a - sigmaStarCoarse (openCubeSet Q) a) p) := by + rcases + openCubeDeterministicCoarseData_of_triadicCube_of_hasOpenCubeEllipticRecoveryData + Q R hRec with + ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + responseJ_sigmaStarCoarse_mul_eq_half_gap_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p + +/-- +Centered origin-cube symmetric harmonic-mean lower bound: +`(average_Q a^{-1})^{-1} ≤ sigmaStarCoarse(Q; a)`. +-/ +theorem harmonicMeanCoeffField_le_sigmaStarCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (ha : IsSymmetricCoeffField a) : + MatLoewnerLE + ((volumeAverageMat (openCubeSet (originCube d n)) + (fun x : Vec d => (a x)⁻¹))⁻¹) + (sigmaStarCoarse (openCubeSet (originCube d n)) a) := by + have h := + harmonicMeanSymmPart_le_sigmaStarCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + R hData + rw [averagedSymmPartInv_eq_volumeAverageMat_inv_of_isSymmetricCoeffField ha] at h + exact h + +/-- +Centered origin-cube symmetric middle ordering: +`sigmaStarCoarse(Q; a) ≤ sigmaCoarse(Q; a)`. +-/ +theorem sigmaStarCoarse_le_sigmaCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (_ha : IsSymmetricCoeffField a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (sigmaStarCoarse (openCubeSet (originCube d n)) a) + (sigmaCoarse (openCubeSet (originCube d n)) a) := by + intro p + have hbase : + vecDot p (matVecMul + (sigmaStarCoarse (openCubeSet (originCube d n)) a) p) ≤ + vecDot p (matVecMul + (sigmaCoarse (openCubeSet (originCube d n)) a) p) := + sigmaStarCoarse_le_sigmaCoarse_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + R hData hA hS hK hSigma p + nlinarith + +/-- +Centered origin-cube symmetric arithmetic-mean upper bound: +`sigmaCoarse(Q; a) ≤ average_Q a`. +-/ +theorem sigmaCoarse_le_volumeAverageMat_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData_of_isSymmetricCoeffField + {d : ℕ} [NeZero d] {n : ℤ} + (R : PotentialSolenoidalL2RecoveryData (openCubeSet (originCube d n))) + {lam Lam : ℝ} {a : CoeffField d} + (hData : HasOpenCubeEllipticRecoveryData (d := d) n R (lam := lam) (Lam := Lam) a) + (ha : IsSymmetricCoeffField a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet (originCube d n)) a + (deterministicCoarseBlockMatrix (openCubeSet (originCube d n)) a)) + (hS : IsSigmaStarCoarse (openCubeSet (originCube d n)) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet (originCube d n)) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet (originCube d n)) a sigma sigmaStar kappa) : + MatLoewnerLE + (sigmaCoarse (openCubeSet (originCube d n)) a) + (volumeAverageMat (openCubeSet (originCube d n)) a) := by + have h := + bCoarse_le_averagedSymmPartPlusCorrection_openCubeSet_originCube_of_hasOpenCubeEllipticRecoveryData + R hData hA hS hK hSigma + rw [bCoarse_canonical_eq_sigmaCoarse_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA, + averagedSymmPartPlusCorrection_eq_volumeAverageMat_of_isSymmetricCoeffField ha] at h + exact h + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Response.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Response.lean new file mode 100644 index 0000000000..f374a0269a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/Response.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.CoarseMatrices + +/-! # Response -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Symmetric response identities + +This file records the response-level consequences of the vanishing coupling +matrix in the symmetric case. +-/ + +private theorem zero_matVecMul {d : ℕ} (x : Vec d) : + matVecMul (0 : Mat d) x = 0 := by + funext i + simp [matVecMul] + +theorem kappa_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix_of_isKappaCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + kappa = 0 := by + have hkCoarse : kappaCoarse U a = 0 := + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + have hkEq : kappaCoarse U a = kappa := + eq_kappaCoarse_of_isKappaCoarse hS hK hdet + rw [← hkEq] + exact hkCoarse + +theorem responseJ_eq_add_p_zero_zero_q_sub_dot_of_isKappaCoarse_of_kappa_eq_zero + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (hK : IsKappaCoarse U a sigmaStar kappa) + (hk : kappa = 0) (p q : Vec d) : + ResponseJ U p q a = + ResponseJ U p 0 a + ResponseJ U 0 q a - vecDot p q := by + have h := hK p q + rw [hk] at h + simp [zero_matVecMul, matVecMul_zero, vecDot_zero_right] at h + linarith + +theorem responseJ_eq_add_p_zero_zero_q_sub_dot_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + ResponseJ U p 0 a + ResponseJ U 0 q a - vecDot p q := + responseJ_eq_add_p_zero_zero_q_sub_dot_of_isKappaCoarse_of_kappa_eq_zero hK + (kappa_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix_of_isKappaCoarse + ha hA hS hK hdet) + p q + +theorem responseJ_p_zero_eq_half_vecDot_sigma_of_isSigmaCoarse_of_kappa_eq_zero + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hk : kappa = 0) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) := by + have h := hSigma.2 p + rw [hk] at h + simp [matTranspose, zero_matVecMul, matVecMul_zero, vecDot_zero_right] at h + linarith + +theorem responseJ_p_zero_eq_half_vecDot_sigma_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) := + responseJ_p_zero_eq_half_vecDot_sigma_of_isSigmaCoarse_of_kappa_eq_zero hSigma + (kappa_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix_of_isKappaCoarse + ha hA hS hK hdet) + p + +theorem responseJ_p_zero_eq_half_vecDot_sigmaCoarse_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p : Vec d) : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] + exact responseJ_p_zero_eq_half_vecDot_sigma_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p + +theorem responseJ_zero_q_eq_half_vecDot_sigmaStar_inv_of_isSigmaStarCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (q : Vec d) : + ResponseJ U 0 q a = + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) := + hS.2 q + +theorem responseJ_zero_q_eq_half_vecDot_sigmaStarInvCoarse_of_isSigmaStarCoarse + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) (q : Vec d) : + ResponseJ U 0 q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + exact hS.2 q + +theorem responseJ_eq_half_vecDot_sigma_add_half_vecDot_sigmaStar_inv_sub_dot_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot p q := by + calc + ResponseJ U p q a = + ResponseJ U p 0 a + ResponseJ U 0 q a - vecDot p q := + responseJ_eq_add_p_zero_zero_q_sub_dot_of_isSymmetricCoeffField + ha hA hS hK hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul sigma p) + + (1 / 2 : ℝ) * vecDot q (matVecMul sigmaStar⁻¹ q) - + vecDot p q := by + rw [responseJ_p_zero_eq_half_vecDot_sigma_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p, hS.2 q] + +theorem responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_of_isSymmetricCoeffField + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (p q : Vec d) : + ResponseJ U p q a = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse U a) q) - + vecDot p q := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + exact + responseJ_eq_half_vecDot_sigma_add_half_vecDot_sigmaStar_inv_sub_dot_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet p q + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/VariationalProblems.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/VariationalProblems.lean new file mode 100644 index 0000000000..d3d33c0287 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Symmetric/VariationalProblems.lean @@ -0,0 +1,513 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages + +/-! # Variational Problems -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Dirichlet and Neumann predicates for the symmetric split + +This file introduces the PDE-facing predicates used to state the +Dirichlet-Neumann interpretation of the symmetric coarse-graining identities. +Existence and variational minimality are intentionally left to later files; the +predicates here record the boundary conditions and harmonicity in the existing +Sobolev/solenoidal language. +-/ + +private theorem volumeAverageVec_eq_const_of_integral_sub_const_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f : Vec d → Vec d} (hf : MemVectorL2 U f) (p : Vec d) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (hzero : + (fun i => ∫ x in U, (f x - p) i ∂MeasureTheory.volume) = 0) : + volumeAverageVec U f = p := by + ext i + have hzero_i : + ∫ x in U, (f x - p) i ∂MeasureTheory.volume = 0 := by + simpa using congrFun hzero i + have hf_int : MeasureTheory.IntegrableOn (fun x => f x i) U := + CorrectionFieldData.integrableOn_coord_of_memVectorL2 (U := U) hf i + have hconst_int : MeasureTheory.IntegrableOn (fun _ : Vec d => p i) U := by + simp [MeasureTheory.IntegrableOn] + have hsub : + ∫ x in U, (f x - p) i ∂MeasureTheory.volume = + ∫ x in U, f x i ∂MeasureTheory.volume - + ∫ x in U, p i ∂MeasureTheory.volume := by + rw [show (fun x => (f x - p) i) = fun x => f x i - p i by + funext x + rfl] + exact MeasureTheory.integral_sub hf_int hconst_int + have hconst : + ∫ x in U, p i ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * p i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + have hf_integral : + ∫ x in U, f x i ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * p i := by + linarith + unfold volumeAverageVec volumeAverage + rw [hf_integral] + field_simp [hvol] + +/-- Affine Dirichlet solution with slope `p`: the gradient is `a`-harmonic and +differs from the constant gradient `p` by a zero-trace potential gradient. -/ +def IsAffineDirichletSolution {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) + (p : Vec d) (u : H1Function U) : Prop := + IsAHarmonicGradient a U u.grad ∧ + IsPotentialZeroTraceOn U (fun x => u.grad x - p) + +namespace IsAffineDirichletSolution + +theorem isAHarmonicGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {p : Vec d} {u : H1Function U} + (hu : IsAffineDirichletSolution a U p u) : + IsAHarmonicGradient a U u.grad := + hu.1 + +theorem isPotentialZeroTraceOn_grad_sub_const {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {p : Vec d} {u : H1Function U} + (hu : IsAffineDirichletSolution a U p u) : + IsPotentialZeroTraceOn U (fun x => u.grad x - p) := + hu.2 + +theorem averageGradient_eq {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + volumeAverageVec U u.grad = p := by + exact + volumeAverageVec_eq_const_of_integral_sub_const_eq_zero + (f := u.grad) u.grad_memVectorL2 p hvol + (IsPotentialZeroTraceOn.integral_eq_zero + hu.isPotentialZeroTraceOn_grad_sub_const) + +/-- Forget the affine boundary condition and retain the associated +`a`-harmonic function. -/ +def toAHarmonicFunction {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {p : Vec d} {u : H1Function U} + (hu : IsAffineDirichletSolution a U p u) : + AHarmonicFunction a U where + toH1 := u + isHarmonic := hu.isAHarmonicGradient + +@[simp] theorem toAHarmonicFunction_toH1 {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {p : Vec d} {u : H1Function U} + (hu : IsAffineDirichletSolution a U p u) : + hu.toAHarmonicFunction.toH1 = u := + rfl + +@[simp] theorem toAHarmonicFunction_grad {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {p : Vec d} {u : H1Function U} + (hu : IsAffineDirichletSolution a U p u) : + hu.toAHarmonicFunction.toH1.grad = u.grad := + rfl + +theorem firstVariation_integral_eq_zero_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (ha : IsSymmetricCoeffField a) (w : AHarmonicFunction a U) : + ∫ x in U, + scalarFirstVariationIntegrand U a (-p) 0 hu.toAHarmonicFunction w x + ∂MeasureTheory.volume = 0 := by + rcases hu.isPotentialZeroTraceOn_grad_sub_const with ⟨φ, hφ⟩ + have hzero : + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = 0 := + w.isHarmonic.2 φ + have hfun : + scalarFirstVariationIntegrand U a (-p) 0 hu.toAHarmonicFunction w = + fun x => + -vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x) := by + funext x + have hsymm : + vecDot (w.toH1.grad x) (matVecMul (a x) (u.grad x)) = + vecDot (matVecMul (a x) (w.toH1.grad x)) (u.grad x) := by + calc + vecDot (w.toH1.grad x) (matVecMul (a x) (u.grad x)) = + vecDot (u.grad x) (matVecMul (a x) (w.toH1.grad x)) := + vecDot_matVecMul_comm_of_isSymm (ha x) (w.toH1.grad x) (u.grad x) + _ = vecDot (matVecMul (a x) (w.toH1.grad x)) (u.grad x) := by + rw [vecDot_comm] + have hsymmPart : symmPart (a x) = a x := + symmPart_eq_self_of_isSymmetricCoeffField ha x + calc + scalarFirstVariationIntegrand U a (-p) 0 hu.toAHarmonicFunction w x = + vecDot p (matVecMul (a x) (w.toH1.grad x)) - + vecDot (w.toH1.grad x) (matVecMul (a x) (u.grad x)) := by + simp [scalarFirstVariationIntegrand, hsymmPart, vecDot_zero_left, + vecDot_neg_left] + _ = + vecDot (matVecMul (a x) (w.toH1.grad x)) p - + vecDot (matVecMul (a x) (w.toH1.grad x)) (u.grad x) := by + rw [vecDot_comm p, hsymm] + _ = -vecDot (matVecMul (a x) (w.toH1.grad x)) (u.grad x - p) := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] + _ = -vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x) := by + rw [hφ] + have hzero_neg : + ∫ x in U, + -vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = 0 := by + rw [MeasureTheory.integral_neg, hzero] + simp + simpa [hfun] using hzero_neg + +theorem isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) : + IsResponseMaximizer U (-p) 0 a hu.toAHarmonicFunction := by + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn U a hEll + intro w + exact + volumeAverage_eq_zero_of_integral_eq_zero + (hu.firstVariation_integral_eq_zero_of_isSymmetricCoeffField ha w) + +theorem averageFlux_eq_sigmaCoarse_mul_of_isResponseMaximizer {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (hmax : IsResponseMaximizer U (-p) 0 a hu.toAHarmonicFunction) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + volumeAverageVec U (fun x => matVecMul (a x) (u.grad x)) = + matVecMul (sigmaCoarse U a) p := by + let v : ScalarCanonicalMaximizer U (-p) 0 a := + ScalarCanonicalMaximizer.ofIsResponseMaximizer hu.toAHarmonicFunction hmax + have hAvg := + ScalarCanonicalMaximizer.averageFluxFormulaCanonical_p_zero_of_isSymmetricCoeffField + (v := v) (ha := ha) (hA := hA) (hS := hS) (hK := hK) + (hSigma := hSigma) (hdet := hdet) (hInt := hInt) vFlux + simpa [v, volumeAverageVec, matVecMul_neg, neg_matVecMul] using! hAvg + +theorem averageFlux_eq_sigmaCoarse_mul_of_isSymmetricCoeffField_of_isEllipticFieldOn {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vFlux : ∀ i : Fin d, ScalarCanonicalMaximizer U (Pi.single i 1) 0 a) : + volumeAverageVec U (fun x => matVecMul (a x) (u.grad x)) = + matVecMul (sigmaCoarse U a) p := by + exact + hu.averageFlux_eq_sigmaCoarse_mul_of_isResponseMaximizer + (hu.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll) + ha hA hS hK hSigma hdet hInt vFlux + +theorem energy_eq_vecDot_sigmaCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {p : Vec d} + {u : H1Function U} (hu : IsAffineDirichletSolution a U p u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + volumeAverage U (scalarVariationEnergyIntegrand a hu.toAHarmonicFunction) = + vecDot p (matVecMul (sigmaCoarse U a) p) := by + let hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hmax : + IsResponseMaximizer U (-p) 0 a hu.toAHarmonicFunction := + hu.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll + have hEnergy := + responseJ_energy_of_isResponseMaximizer U a (-p) 0 hu.toAHarmonicFunction hmax + (hInt.weakFlux hu.toAHarmonicFunction) + (hInt.response (-p) 0 hu.toAHarmonicFunction) + (hInt.firstVariation (-p) 0 hu.toAHarmonicFunction hu.toAHarmonicFunction) + (hInt.energy hu.toAHarmonicFunction) + have hResp := + responseJ_p_zero_eq_half_vecDot_sigmaCoarse_of_isSymmetricCoeffField + ha hA hS hK hSigma hdet (-p) + rw [hResp] at hEnergy + have hquad : + vecDot (-p) (matVecMul (sigmaCoarse U a) (-p)) = + vecDot p (matVecMul (sigmaCoarse U a) p) := by + simp [matVecMul_neg, vecDot_neg_left, vecDot_neg_right] + rw [hquad] at hEnergy + linarith + +end IsAffineDirichletSolution + +/-- Mean-zero Neumann solution with constant flux `q`: the function is +`a`-harmonic and its excess flux `a ∇u - q` has zero normal trace. -/ +def IsConstantFluxNeumannSolution {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) + (q : Vec d) (u : H1MeanZeroFunction U) : Prop := + IsAHarmonicGradient a U u.toH1Function.grad ∧ + IsSolenoidalZeroNormalTraceOn U + (fun x => matVecMul (a x) (u.toH1Function.grad x) - q) + +namespace IsConstantFluxNeumannSolution + +theorem isAHarmonicGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {q : Vec d} {u : H1MeanZeroFunction U} + (hu : IsConstantFluxNeumannSolution a U q u) : + IsAHarmonicGradient a U u.toH1Function.grad := + hu.1 + +theorem isSolenoidalZeroNormalTraceOn_flux_sub_const {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {q : Vec d} + {u : H1MeanZeroFunction U} + (hu : IsConstantFluxNeumannSolution a U q u) : + IsSolenoidalZeroNormalTraceOn U + (fun x => matVecMul (a x) (u.toH1Function.grad x) - q) := + hu.2 + +theorem averageFlux_eq {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (hU : IsSobolevRegularDomain U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) : + volumeAverageVec U (fun x => matVecMul (a x) (u.toH1Function.grad x)) = q := by + exact + volumeAverageVec_eq_const_of_integral_sub_const_eq_zero + (f := fun x => matVecMul (a x) (u.toH1Function.grad x)) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2) + q hvol + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU + hu.isSolenoidalZeroNormalTraceOn_flux_sub_const) + +/-- Forget the constant-flux boundary condition and retain the associated +`a`-harmonic function. -/ +def toAHarmonicFunction {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {q : Vec d} {u : H1MeanZeroFunction U} + (hu : IsConstantFluxNeumannSolution a U q u) : + AHarmonicFunction a U where + toH1 := u.toH1Function + isHarmonic := hu.isAHarmonicGradient + +@[simp] theorem toAHarmonicFunction_toH1 {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {q : Vec d} {u : H1MeanZeroFunction U} + (hu : IsConstantFluxNeumannSolution a U q u) : + hu.toAHarmonicFunction.toH1 = u.toH1Function := + rfl + +@[simp] theorem toAHarmonicFunction_grad {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {q : Vec d} {u : H1MeanZeroFunction U} + (hu : IsConstantFluxNeumannSolution a U q u) : + hu.toAHarmonicFunction.toH1.grad = u.toH1Function.grad := + rfl + +theorem firstVariation_integral_eq_zero_of_isSymmetricCoeffField {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + (ha : IsSymmetricCoeffField a) (w : AHarmonicFunction a U) : + ∫ x in U, + scalarFirstVariationIntegrand U a 0 q hu.toAHarmonicFunction w x + ∂MeasureTheory.volume = 0 := by + have hzero : + ∫ x in U, + vecDot (matVecMul (a x) (u.toH1Function.grad x) - q) (w.toH1.grad x) + ∂MeasureTheory.volume = 0 := + hu.isSolenoidalZeroNormalTraceOn_flux_sub_const w.toH1 + have hfun : + scalarFirstVariationIntegrand U a 0 q hu.toAHarmonicFunction w = + fun x => + -vecDot (matVecMul (a x) (u.toH1Function.grad x) - q) (w.toH1.grad x) := by + funext x + have hsymmPart : symmPart (a x) = a x := + symmPart_eq_self_of_isSymmetricCoeffField ha x + calc + scalarFirstVariationIntegrand U a 0 q hu.toAHarmonicFunction w x = + vecDot q (w.toH1.grad x) - + vecDot (w.toH1.grad x) (matVecMul (a x) (u.toH1Function.grad x)) := by + simp [scalarFirstVariationIntegrand, hsymmPart, vecDot_zero_left] + _ = + vecDot q (w.toH1.grad x) - + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (w.toH1.grad x) := by + rw [vecDot_comm (w.toH1.grad x)] + _ = + -vecDot (matVecMul (a x) (u.toH1Function.grad x) - q) (w.toH1.grad x) := by + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hzero_neg : + ∫ x in U, + -vecDot (matVecMul (a x) (u.toH1Function.grad x) - q) (w.toH1.grad x) + ∂MeasureTheory.volume = 0 := by + rw [MeasureTheory.integral_neg, hzero] + simp + simpa [hfun] using hzero_neg + +theorem isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) : + IsResponseMaximizer U 0 q a hu.toAHarmonicFunction := by + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn U a hEll + intro w + exact + volumeAverage_eq_zero_of_integral_eq_zero + (hu.firstVariation_integral_eq_zero_of_isSymmetricCoeffField ha w) + +theorem averageGradient_eq_sigmaStarInvCoarse_mul_of_isResponseMaximizer {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + (hmax : IsResponseMaximizer U 0 q a hu.toAHarmonicFunction) + (ha : IsSymmetricCoeffField a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + volumeAverageVec U u.toH1Function.grad = + matVecMul (sigmaStarInvCoarse U a) q := by + let v : ScalarCanonicalMaximizer U 0 q a := + ScalarCanonicalMaximizer.ofIsResponseMaximizer hu.toAHarmonicFunction hmax + have hAvg := + ScalarCanonicalMaximizer.averageGradientFormulaCanonical_zero_q_of_isSymmetricCoeffField + (v := v) (ha := ha) (hA := hA) (hS := hS) (hK := hK) + (hdet := hdet) (hInt := hInt) vGrad + simpa [v, volumeAverageVec] using! hAvg + +theorem averageGradient_eq_sigmaStarInvCoarse_mul_of_isSymmetricCoeffField_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + {sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (hInt : ResponseLinearIntegrabilityData U a) + (vGrad : ∀ i : Fin d, ScalarCanonicalMaximizer U 0 (Pi.single i 1) a) : + volumeAverageVec U u.toH1Function.grad = + matVecMul (sigmaStarInvCoarse U a) q := by + exact + hu.averageGradient_eq_sigmaStarInvCoarse_mul_of_isResponseMaximizer + (hu.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll) + ha hA hS hK hdet hInt vGrad + +theorem energy_eq_vecDot_sigmaStarInvCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {q : Vec d} + {u : H1MeanZeroFunction U} (hu : IsConstantFluxNeumannSolution a U q u) + (ha : IsSymmetricCoeffField a) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + {sigmaStar : Mat d} (hS : IsSigmaStarCoarse U a sigmaStar) : + volumeAverage U (scalarVariationEnergyIntegrand a hu.toAHarmonicFunction) = + vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + let hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hmax : + IsResponseMaximizer U 0 q a hu.toAHarmonicFunction := + hu.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll + have hEnergy := + responseJ_energy_of_isResponseMaximizer U a 0 q hu.toAHarmonicFunction hmax + (hInt.weakFlux hu.toAHarmonicFunction) + (hInt.response 0 q hu.toAHarmonicFunction) + (hInt.firstVariation 0 q hu.toAHarmonicFunction hu.toAHarmonicFunction) + (hInt.energy hu.toAHarmonicFunction) + have hResp := + responseJ_zero_q_eq_half_vecDot_sigmaStarInvCoarse_of_isSigmaStarCoarse hS q + rw [hResp] at hEnergy + linarith + +end IsConstantFluxNeumannSolution + +section DirichletNeumannSplit + +/-- The harmonic response obtained by subtracting the affine Dirichlet solution +from the constant-flux Neumann solution. This is the Lean object behind the +informal formula `v(p,q) = u_q^N - u_p^D` in the symmetric case. -/ +noncomputable def dirichletNeumannSplitOfIsEllipticFieldOn {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) {p q : Vec d} + {uD : H1Function U} {uN : H1MeanZeroFunction U} + (huD : IsAffineDirichletSolution a U p uD) + (huN : IsConstantFluxNeumannSolution a U q uN) : + AHarmonicFunction a U := by + let hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + exact + AHarmonicFunction.subOfIntegrable huN.toAHarmonicFunction huD.toAHarmonicFunction + (hInt.weakFlux huN.toAHarmonicFunction) + (hInt.weakFlux huD.toAHarmonicFunction) + +@[simp] theorem dirichletNeumannSplitOfIsEllipticFieldOn_grad {d : ℕ} + {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) {p q : Vec d} + {uD : H1Function U} {uN : H1MeanZeroFunction U} + (huD : IsAffineDirichletSolution a U p uD) + (huN : IsConstantFluxNeumannSolution a U q uN) : + (dirichletNeumannSplitOfIsEllipticFieldOn hEll huD huN).toH1.grad = + uN.toH1Function.grad - uD.grad := by + funext x + simp [dirichletNeumannSplitOfIsEllipticFieldOn] + +theorem isResponseMaximizer_dirichletNeumannSplitOfIsEllipticFieldOn_of_isSymmetricCoeffField + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) {p q : Vec d} + {uD : H1Function U} {uN : H1MeanZeroFunction U} + (huD : IsAffineDirichletSolution a U p uD) + (huN : IsConstantFluxNeumannSolution a U q uN) + (ha : IsSymmetricCoeffField a) : + IsResponseMaximizer U p q a + (dirichletNeumannSplitOfIsEllipticFieldOn hEll huD huN) := by + let hInt : ResponseLinearIntegrabilityData U a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hmaxN : + IsResponseMaximizer U 0 q a huN.toAHarmonicFunction := + huN.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll + have hmaxD : + IsResponseMaximizer U (-p) 0 a huD.toAHarmonicFunction := + huD.isResponseMaximizer_of_isSymmetricCoeffField_of_isEllipticFieldOn ha hEll + have hsplit := + basic_cg_identities_sub_isResponseMaximizer_of_isResponseMaximizer + U a 0 q (-p) 0 hInt huN.toAHarmonicFunction huD.toAHarmonicFunction + hmaxN hmaxD + simpa [dirichletNeumannSplitOfIsEllipticFieldOn, hInt, sub_eq_add_neg] using hsplit + +end DirichletNeumannSplit + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ThetaEllipticity.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ThetaEllipticity.lean new file mode 100644 index 0000000000..089e3c8c79 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/ThetaEllipticity.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Block +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Law + +/-! # Theta Ellipticity -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Ellipticity class and shared matrix infrastructure + +Formalization of the sharp-constant pointwise ellipticity vocabulary of +Proposition 2.1 of the high-moment paper (Armstrong–Kuusi–Loher, in +preparation), against the coarse-graining surface of this development. Items +A1–A3, together with a handful of shared `MatLoewnerLE` helpers and the key +nonsymmetric flux inequality `(★)` reused by the sharp block bounds. + +All matrix work is on `Vec d = Fin d → ℝ` / `Mat d`; no `EuclideanSpace`. +-/ + +open Homogenization.Book.Ch02 +open Homogenization.Book.Ch04 (RestrictionCoeffLaw) + +variable {d : ℕ} + +/-! ## Scalar-multiple-of-identity quadratic forms and `MatLoewnerLE` helpers -/ + +/-- The identity matrix acts as the identity on vectors. -/ +theorem matVecMul_one (x : Vec d) : matVecMul (1 : Mat d) x = x := by + funext i + simp [matVecMul, Matrix.one_apply, Finset.sum_ite_eq] + +/-- A scalar multiple of the identity acts by scaling. -/ +theorem matVecMul_smul_one (c : ℝ) (x : Vec d) : + matVecMul (c • (1 : Mat d)) x = c • x := by + rw [smul_matVecMul, matVecMul_one] + +/-- Quadratic form of a scalar multiple of the identity. -/ +theorem vecDot_matVecMul_smul_one (c : ℝ) (x : Vec d) : + vecDot x (matVecMul (c • (1 : Mat d)) x) = c * vecNormSq x := by + rw [matVecMul_smul_one, vecDot_smul_right] + rfl + +/-- Quadratic form of the identity matrix. -/ +theorem vecDot_matVecMul_one (x : Vec d) : + vecDot x (matVecMul (1 : Mat d) x) = vecNormSq x := by + rw [matVecMul_one]; rfl + +/-- `MatLoewnerLE` unwound to a plain quadratic-form comparison (the `½` +factors cancel). -/ +theorem matLoewnerLE_iff (A B : Mat d) : + MatLoewnerLE A B ↔ + ∀ x : Vec d, vecDot x (matVecMul A x) ≤ vecDot x (matVecMul B x) := by + constructor + · intro h x; have := h x; linarith + · intro h x; have := h x; linarith + +/-- Build `MatLoewnerLE` from a plain quadratic-form comparison. -/ +theorem matLoewnerLE_of_forall {A B : Mat d} + (h : ∀ x : Vec d, vecDot x (matVecMul A x) ≤ vecDot x (matVecMul B x)) : + MatLoewnerLE A B := (matLoewnerLE_iff A B).2 h + +/-! ## A1 — the `(1, Θ)` ellipticity class -/ + +/-- **A1.** Membership in the uniform ellipticity class with constants `(1, Θ)`: +`ξ · A ξ ≥ |ξ|²` and `ξ · A⁻¹ ξ ≥ Θ⁻¹ |ξ|²`. -/ +abbrev IsThetaElliptic (Θ : ℝ) (A : Mat d) : Prop := IsEllipticMatrix 1 Θ A + +/-! ## A2 — the law-level ellipticity predicate -/ + +open MeasureTheory in +/-- **A2.** A carrier coefficient law is `Θ`-elliptic when almost every +realization lies, almost everywhere in space, in the `(1, Θ)` ellipticity class. +Following the carrier redesign (Packet P3, decision E-2), the entrywise +measurability conjunct of the paper's class `Ω_Θ` is now **free by type**: every +element of the honest-fields carrier `RegCoeffField d` carries a proof that each +of its scalar entries is Borel measurable (`RegCoeffField.entry_measurable`), so +the a.e.-modification bridge (`CoarseBounds/AeBridge.lean`) recovers the +pointwise-elliptic representative from `a.entry_measurable` rather than a bundled +conjunct. The statement is therefore the paper's clean `Ω_Θ` membership. -/ +def ThetaEllipticLaw (Θ : ℝ) (P : RestrictionCoeffLaw d) : Prop := + ∀ᵐ a ∂P, ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (a x) + +/-! ## The key nonsymmetric flux inequality `(★)` + +For an elliptic matrix `B`, `|B η|² ≤ Lam · (η · sᴮ η)` where `sᴮ = symmPart B`. +This is the second ellipticity inequality read backwards, and is the workhorse +behind the sharp flux bounds A5 and the nonsymmetric coercivity A4. -/ + +/-- The flux inequality `(★)`: `‖B η‖² ≤ Lam · η · (symmPart B) η`. -/ +theorem vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix + {lam Lam : ℝ} {B : Mat d} (hB : IsEllipticMatrix lam Lam B) (η : Vec d) : + vecNormSq (matVecMul B η) ≤ Lam * vecDot η (matVecMul (symmPart B) η) := by + have hdet : IsUnit B.det := isUnit_det_of_isEllipticMatrix hB + set ξ := matVecMul B η with hξ + have hBinv : matVecMul B⁻¹ ξ = η := by + rw [hξ, matVecMul_mul, Matrix.nonsing_inv_mul B hdet, matVecMul_one] + have hident : + vecDot ξ (matVecMul B⁻¹ ξ) = vecDot η (matVecMul (symmPart B) η) := by + rw [hBinv, vecDot_comm, vecDot_matVecMul_symmPart, hξ] + have hLam_pos : 0 < Lam := lt_of_lt_of_le hB.1 hB.2.1 + have hsecond : Lam⁻¹ * vecNormSq ξ ≤ vecDot ξ (matVecMul B⁻¹ ξ) := hB.2.2.2 ξ + rw [hident] at hsecond + have := mul_le_mul_of_nonneg_left hsecond hLam_pos.le + have hcancel : Lam * (Lam⁻¹ * vecNormSq ξ) = vecNormSq ξ := by + field_simp [hLam_pos.ne'] + rw [hcancel] at this + exact this + +/-! ## A3 — symmetric part Loewner bounds -/ + +/-- **A3 (upper).** `s ≤ Θ • 1` in the Loewner order, `s = symmPart A`. -/ +theorem symmPart_matLoewnerLE_smul_one_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + MatLoewnerLE (symmPart A) (Θ • (1 : Mat d)) := by + refine matLoewnerLE_of_forall (fun x => ?_) + rw [vecDot_matVecMul_smul_one] + simpa using upperBound_symmPart_of_isEllipticMatrix hA x + +/-- **A3 (lower).** `1 ≤ s` in the Loewner order, `s = symmPart A`. -/ +theorem one_matLoewnerLE_symmPart_of_isThetaElliptic + {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) : + MatLoewnerLE (1 : Mat d) (symmPart A) := by + refine matLoewnerLE_of_forall (fun x => ?_) + rw [vecDot_matVecMul_one] + simpa using lowerBound_symmPart_of_isEllipticMatrix hA x + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Translation.lean b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Translation.lean new file mode 100644 index 0000000000..78f13d77df --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/CoarseGraining/Translation.lean @@ -0,0 +1,515 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient + +/-! # Translation -/ + +@[expose] public section + +namespace Homogenization + +namespace BlockState + +/-- Translate a block state by precomposing both components with `x ↦ x - z`. -/ +def translate {d : ℕ} (X : BlockState d) (z : Vec d) : BlockState d := + { potential := fun x => X.potential (x - z) + flux := fun x => X.flux (x - z) } + +@[simp] theorem potential_translate {d : ℕ} (X : BlockState d) (z x : Vec d) : + (X.translate z).potential x = X.potential (x - z) := rfl + +@[simp] theorem flux_translate {d : ℕ} (X : BlockState d) (z x : Vec d) : + (X.translate z).flux x = X.flux (x - z) := rfl + +@[simp] theorem eval_translate {d : ℕ} (X : BlockState d) (z x : Vec d) : + (X.translate z).eval x = X.eval (x - z) := rfl + +end BlockState + +theorem isBlockMuAdmissible_translateSet {d : ℕ} {U : Set (Vec d)} {P : BlockVec d} + {X : BlockState d} (hX : IsBlockMuAdmissible U P X) (z : Vec d) : + IsBlockMuAdmissible (translateSet z U) P (X.translate z) := by + rcases hX with ⟨hpotL2, hpot, hsolL2, hsol⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · simpa [BlockState.translate] using! + hpotL2.comp_measurePreserving + (measurePreserving_subRight_restrict_translateSet (d := d) z U) + · simpa [BlockState.translate, sub_eq_add_neg, add_assoc] using + isPotentialZeroTraceOn_translateSet (f := fun x => X.potential x - P.1) hpot z + · simpa [BlockState.translate] using! + hsolL2.comp_measurePreserving + (measurePreserving_subRight_restrict_translateSet (d := d) z U) + · simpa [BlockState.translate, sub_eq_add_neg, add_assoc] using + isSolenoidalZeroNormalTraceOn_translateSet (g := fun x => X.flux x - P.2) hsol z + +theorem blockEnergyDensity_translate_forward {d : ℕ} + (a : CoeffField d) (X : BlockState d) (z x : Vec d) : + blockEnergyDensity a (X.translate z) (x + z) = + blockEnergyDensity (translateCoeffField z a) X x := by + have harg : (fun i => x i + z i) = x + z := rfl + simp [BlockState.translate, BlockState.eval, blockEnergyDensity, blockCoeffField, translateCoeffField, + sub_eq_add_neg, harg] + +theorem blockEnergyDensity_translate_backward {d : ℕ} + (a : CoeffField d) (X : BlockState d) (z x : Vec d) : + blockEnergyDensity (translateCoeffField z a) (X.translate (-z)) x = + blockEnergyDensity a X (x + z) := by + have harg : (fun i => x i + z i) = x + z := rfl + simp [BlockState.translate, BlockState.eval, blockEnergyDensity, blockCoeffField, translateCoeffField, + sub_eq_add_neg, harg] + +theorem volumeAverage_blockEnergyDensity_translate_forward {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (X : BlockState d) : + volumeAverage (translateSet z U) (blockEnergyDensity a (X.translate z)) = + volumeAverage U (blockEnergyDensity (translateCoeffField z a) X) := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + calc + ∫ x in translateSet z U, blockEnergyDensity a (X.translate z) x ∂MeasureTheory.volume + = ∫ y in U, blockEnergyDensity a (X.translate z) (y + z) ∂MeasureTheory.volume := by + symm + exact setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (blockEnergyDensity a (X.translate z)) + _ = ∫ y in U, blockEnergyDensity (translateCoeffField z a) X y + ∂MeasureTheory.volume := by + congr with y + simpa using blockEnergyDensity_translate_forward a X z y + +theorem volumeAverage_blockEnergyDensity_translate_backward {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (X : BlockState d) : + volumeAverage U (blockEnergyDensity (translateCoeffField z a) (X.translate (-z))) = + volumeAverage (translateSet z U) (blockEnergyDensity a X) := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + calc + ∫ x in U, blockEnergyDensity (translateCoeffField z a) (X.translate (-z)) x + ∂MeasureTheory.volume + = ∫ x in U, blockEnergyDensity a X (x + z) ∂MeasureTheory.volume := by + congr with x + simpa using blockEnergyDensity_translate_backward a X z x + _ = ∫ y in translateSet z U, blockEnergyDensity a X y ∂MeasureTheory.volume := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (blockEnergyDensity a X) + +theorem muValueSet_translateSet {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : + muValueSet (translateSet z U) P a = muValueSet U P (translateCoeffField z a) := by + ext m + constructor + · rintro ⟨X, hX, hm⟩ + refine ⟨X.translate (-z), ?_, ?_⟩ + · have hX' : + IsBlockMuAdmissible (translateSet (-z) (translateSet z U)) P (X.translate (-z)) := + isBlockMuAdmissible_translateSet (U := translateSet z U) (P := P) (X := X) hX (-z) + simpa [translateSet_translateSet, BlockState.translate] using hX' + · calc + m = volumeAverage (translateSet z U) (blockEnergyDensity a X) := hm + _ = volumeAverage U (blockEnergyDensity (translateCoeffField z a) (X.translate (-z))) := by + symm + exact volumeAverage_blockEnergyDensity_translate_backward z U a X + · rintro ⟨X, hX, hm⟩ + refine ⟨X.translate z, isBlockMuAdmissible_translateSet (P := P) (X := X) hX z, ?_⟩ + calc + m = volumeAverage U (blockEnergyDensity (translateCoeffField z a) X) := hm + _ = volumeAverage (translateSet z U) (blockEnergyDensity a (X.translate z)) := by + symm + exact volumeAverage_blockEnergyDensity_translate_forward z U a X + +theorem Mu_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (P : BlockVec d) (a : CoeffField d) : + Mu (translateSet z U) P a = Mu U P (translateCoeffField z a) := by + unfold Mu + rw [muValueSet_translateSet z U P a] + +theorem coarseBlockMatrix_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + coarseBlockMatrix (translateSet z U) a = + coarseBlockMatrix U (translateCoeffField z a) := by + apply coarseBlockMatrix_eq_of_mu_eq + intro P + exact Mu_translateSet_eq_translateCoeffField z U P a + +theorem isCoarseBlockMatrix_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (Abar : BlockMat d) : + IsCoarseBlockMatrix (translateSet z U) a Abar ↔ + IsCoarseBlockMatrix U (translateCoeffField z a) Abar := by + constructor + · rintro ⟨hSymm, hMu⟩ + refine ⟨hSymm, ?_⟩ + intro P + simpa [Mu_translateSet_eq_translateCoeffField z U P a] using hMu P + · rintro ⟨hSymm, hMu⟩ + refine ⟨hSymm, ?_⟩ + intro P + simpa [Mu_translateSet_eq_translateCoeffField z U P a] using hMu P + +theorem hasQuadraticMu_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + HasQuadraticMu (translateSet z U) a ↔ + HasQuadraticMu U (translateCoeffField z a) := by + constructor + · rintro ⟨Q, hQ⟩ + refine ⟨Q, ?_⟩ + intro P + simpa [Mu_translateSet_eq_translateCoeffField z U P a] using hQ P + · rintro ⟨Q, hQ⟩ + refine ⟨Q, ?_⟩ + intro P + simpa [Mu_translateSet_eq_translateCoeffField z U P a] using hQ P + +theorem isBlockPotentialOn_translateSet {d : ℕ} {U : Set (Vec d)} + {X : BlockState d} (hX : IsBlockPotentialOn U X) (z : Vec d) : + IsBlockPotentialOn (translateSet z U) (X.translate z) := + isPotentialOn_translateSet hX z + +theorem isBlockSolenoidalOn_translateSet {d : ℕ} {U : Set (Vec d)} + {X : BlockState d} (hX : IsBlockSolenoidalOn U X) (z : Vec d) : + IsBlockSolenoidalOn (translateSet z U) (X.translate z) := + isSolenoidalOn_translateSet hX z + +theorem isBlockTestOn_translateSet {d : ℕ} {U : Set (Vec d)} + {X : BlockState d} (hX : IsBlockTestOn U X) (z : Vec d) : + IsBlockTestOn (translateSet z U) (X.translate z) := + ⟨isPotentialZeroTraceOn_translateSet hX.1 z, + isSolenoidalZeroNormalTraceOn_translateSet hX.2 z⟩ + +theorem blockResponseIntegrand_translate_forward {d : ℕ} + (a : CoeffField d) (P Q : BlockVec d) (X : BlockState d) (z x : Vec d) : + blockResponseIntegrand a P Q (X.translate z) (x + z) = + blockResponseIntegrand (translateCoeffField z a) P Q X x := by + have harg : (fun i => x i + z i) = x + z := rfl + simp [blockResponseIntegrand, blockEnergyDensity, BlockState.translate, BlockState.eval, + blockCoeffField, translateCoeffField, sub_eq_add_neg, harg] + +theorem volumeAverage_blockResponseIntegrand_translate_forward {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (P Q : BlockVec d) + (X : BlockState d) : + volumeAverage (translateSet z U) (blockResponseIntegrand a P Q (X.translate z)) = + volumeAverage U (blockResponseIntegrand (translateCoeffField z a) P Q X) := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + calc + ∫ x in translateSet z U, blockResponseIntegrand a P Q (X.translate z) x + ∂MeasureTheory.volume + = ∫ y in U, blockResponseIntegrand a P Q (X.translate z) (y + z) + ∂MeasureTheory.volume := by + symm + exact setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (blockResponseIntegrand a P Q (X.translate z)) + _ = ∫ y in U, blockResponseIntegrand (translateCoeffField z a) P Q X y + ∂MeasureTheory.volume := by + congr with y + simpa using blockResponseIntegrand_translate_forward a P Q X z y + +theorem blockResponseSpace_translateSet {d : ℕ} (z : Vec d) {U : Set (Vec d)} + {a : CoeffField d} {X : BlockState d} + (hX : BlockResponseSpace (translateCoeffField z a) U X) : + BlockResponseSpace a (translateSet z U) (X.translate z) := by + refine ⟨isBlockPotentialOn_translateSet hX.1 z, + isBlockSolenoidalOn_translateSet hX.2.1 z, ?_⟩ + intro Y hY + have hY' : IsBlockTestOn U (Y.translate (-z)) := by + have hYtranslate : + IsBlockTestOn (translateSet (-z) (translateSet z U)) (Y.translate (-z)) := + isBlockTestOn_translateSet hY (-z) + simpa [translateSet_translateSet, BlockState.translate] using hYtranslate + have htest := hX.2.2 (Y.translate (-z)) hY' + let F : Vec d → ℝ := fun x => + blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a x) ((X.translate z).eval x)) + have hchange : + ∫ y in U, F (y + z) ∂MeasureTheory.volume = + ∫ x in translateSet z U, F x ∂MeasureTheory.volume := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U F + have hpoint : + (fun y : Vec d => F (y + z)) = + fun y : Vec d => + blockVecDot ((Y.translate (-z)).eval y) + (blockMatVecMul (blockCoeffField (translateCoeffField z a) y) (X.eval y)) := by + funext y + have harg : (fun i => y i + z i) = y + z := rfl + simp [F, BlockState.translate, BlockState.eval, blockCoeffField, translateCoeffField, + sub_eq_add_neg, harg] + calc + ∫ x in translateSet z U, + blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a x) ((X.translate z).eval x)) + ∂MeasureTheory.volume + = ∫ x in translateSet z U, F x ∂MeasureTheory.volume := rfl + _ = ∫ y in U, F (y + z) ∂MeasureTheory.volume := hchange.symm + _ = ∫ y in U, + blockVecDot ((Y.translate (-z)).eval y) + (blockMatVecMul (blockCoeffField (translateCoeffField z a) y) (X.eval y)) + ∂MeasureTheory.volume := by rw [hpoint] + _ = 0 := htest + +theorem blockResponseIntegrabilityData_translateSet {d : ℕ} (z : Vec d) {U : Set (Vec d)} + {a : CoeffField d} {X : BlockState d} + (hX : BlockResponseIntegrabilityData U (translateCoeffField z a) X) : + BlockResponseIntegrabilityData (translateSet z U) a (X.translate z) := by + refine ⟨?_, ?_⟩ + · simpa [BlockState.translate] using! + hX.flux_memL2.comp_measurePreserving + (measurePreserving_subRight_restrict_translateSet (d := d) z U) + · have hInt : + MeasureTheory.Integrable + (fun x : Vec d => blockEnergyDensity (translateCoeffField z a) X (x - z)) + (volumeMeasureOn (translateSet z U)) := by + have hBase : + MeasureTheory.MemLp (blockEnergyDensity (translateCoeffField z a) X) 1 + (volumeMeasureOn U) := by + rw [MeasureTheory.memLp_one_iff_integrable] + simpa [MeasureTheory.IntegrableOn] using hX.energyIntegrable + exact MeasureTheory.memLp_one_iff_integrable.mp + (hBase.comp_measurePreserving + (measurePreserving_subRight_restrict_translateSet (d := d) z U)) + have hEq : + (fun x : Vec d => blockEnergyDensity (translateCoeffField z a) X (x - z)) = + blockEnergyDensity a (X.translate z) := by + funext x + simp [blockEnergyDensity, BlockState.translate, BlockState.eval, blockCoeffField, + translateCoeffField, sub_eq_add_neg] + simpa [MeasureTheory.IntegrableOn, hEq] using hInt + +theorem blockJValueSet_subset_translateSet {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (P Q : BlockVec d) (a : CoeffField d) : + blockJValueSet U P Q (translateCoeffField z a) ⊆ + blockJValueSet (translateSet z U) P Q a := by + rintro m ⟨X, hX, hInt, hm⟩ + refine ⟨X.translate z, blockResponseSpace_translateSet z hX, + blockResponseIntegrabilityData_translateSet z hInt, ?_⟩ + calc + m = volumeAverage U (blockResponseIntegrand (translateCoeffField z a) P Q X) := hm + _ = volumeAverage (translateSet z U) (blockResponseIntegrand a P Q (X.translate z)) := by + symm + exact volumeAverage_blockResponseIntegrand_translate_forward z U a P Q X + +theorem blockJValueSet_translateSet {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (P Q : BlockVec d) (a : CoeffField d) : + blockJValueSet (translateSet z U) P Q a = + blockJValueSet U P Q (translateCoeffField z a) := by + ext m + constructor + · intro hm + have hsub := + blockJValueSet_subset_translateSet (-z) (translateSet z U) P Q (translateCoeffField z a) + have hm' : + m ∈ blockJValueSet (translateSet z U) P Q + (translateCoeffField (-z) (translateCoeffField z a)) := by + simpa using hm + simpa [translateSet_translateSet] using hsub hm' + · intro hm + exact blockJValueSet_subset_translateSet z U P Q a hm + +theorem BlockJ_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (P Q : BlockVec d) (a : CoeffField d) : + BlockJ (translateSet z U) P Q a = + BlockJ U P Q (translateCoeffField z a) := by + rw [BlockJ, BlockJ, blockJValueSet_translateSet z U P Q a] + +theorem scalarResponseIntegrand_translate_forward {d : ℕ} + (a : CoeffField d) (p q : Vec d) {U : Set (Vec d)} + (z : Vec d) (u : AHarmonicFunction (translateCoeffField z a) U) (x : Vec d) : + scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u) (x + z) = + scalarResponseIntegrand U (translateCoeffField z a) p q u x := by + have harg : (fun i => x i + z i) = x + z := rfl + simp [scalarResponseIntegrand, AHarmonicFunction.translate, H1Function.translate, + translateCoeffField, sub_eq_add_neg, add_assoc, harg] + +theorem volumeAverage_scalarResponseIntegrand_translate_forward {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (p q : Vec d) + (u : AHarmonicFunction (translateCoeffField z a) U) : + volumeAverage (translateSet z U) + (scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u)) = + volumeAverage U (scalarResponseIntegrand U (translateCoeffField z a) p q u) := by + unfold volumeAverage + rw [volume_translateSet_eq] + congr 1 + calc + ∫ x in translateSet z U, + scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u) x + ∂MeasureTheory.volume + = ∫ y in U, + scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u) (y + z) + ∂MeasureTheory.volume := by + symm + exact setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u)) + _ = ∫ y in U, scalarResponseIntegrand U (translateCoeffField z a) p q u y + ∂MeasureTheory.volume := by + congr with y + simpa using scalarResponseIntegrand_translate_forward a p q z u y + +theorem responseJValueSet_subset_translateSet {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + responseJValueSet U p q (translateCoeffField z a) ⊆ + responseJValueSet (translateSet z U) p q a := by + rintro m ⟨u, hm⟩ + refine ⟨AHarmonicFunction.translate z u, ?_⟩ + calc + m = volumeAverage U (scalarResponseIntegrand U (translateCoeffField z a) p q u) := hm + _ = volumeAverage (translateSet z U) + (scalarResponseIntegrand (translateSet z U) a p q (AHarmonicFunction.translate z u)) := by + symm + exact volumeAverage_scalarResponseIntegrand_translate_forward z U a p q u + +theorem responseJValueSet_translateSet {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + responseJValueSet (translateSet z U) p q a = + responseJValueSet U p q (translateCoeffField z a) := by + ext m + constructor + · intro hm + have hsub := + responseJValueSet_subset_translateSet (-z) (translateSet z U) p q (translateCoeffField z a) + have hm' : + m ∈ responseJValueSet (translateSet z U) p q + (translateCoeffField (-z) (translateCoeffField z a)) := by + simpa using hm + simpa [translateSet_translateSet] using hsub hm' + · intro hm + exact responseJValueSet_subset_translateSet z U p q a hm + +theorem ResponseJ_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (p q : Vec d) (a : CoeffField d) : + ResponseJ (translateSet z U) p q a = + ResponseJ U p q (translateCoeffField z a) := by + rw [ResponseJ, ResponseJ, responseJValueSet_translateSet z U p q a] + +theorem sigmaStarInvCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + sigmaStarInvCoarse (translateSet z U) a = + sigmaStarInvCoarse U (translateCoeffField z a) := by + funext i j + by_cases hij : i = j + · subst j + simp [ResponseJ_translateSet_eq_translateCoeffField] + · simp [sigmaStarInvCoarse_apply_of_ne, hij, ResponseJ_translateSet_eq_translateCoeffField] + +theorem sigmaStarCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + sigmaStarCoarse (translateSet z U) a = + sigmaStarCoarse U (translateCoeffField z a) := by + simp [sigmaStarCoarse, sigmaStarInvCoarse_translateSet_eq_translateCoeffField] + +theorem sigmaStarInvKappaCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + sigmaStarInvKappaCoarse (translateSet z U) a = + sigmaStarInvKappaCoarse U (translateCoeffField z a) := by + funext i j + simp [sigmaStarInvKappaCoarse, ResponseJ_translateSet_eq_translateCoeffField] + +theorem kappaCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + kappaCoarse (translateSet z U) a = + kappaCoarse U (translateCoeffField z a) := by + simp [kappaCoarse, sigmaStarCoarse_translateSet_eq_translateCoeffField, + sigmaStarInvKappaCoarse_translateSet_eq_translateCoeffField] + +theorem sigmaCorrectedResponse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (p : Vec d) : + sigmaCorrectedResponse (translateSet z U) a p = + sigmaCorrectedResponse U (translateCoeffField z a) p := by + simp [sigmaCorrectedResponse, ResponseJ_translateSet_eq_translateCoeffField, + sigmaStarInvCoarse_translateSet_eq_translateCoeffField, + kappaCoarse_translateSet_eq_translateCoeffField] + +theorem sigmaCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + sigmaCoarse (translateSet z U) a = + sigmaCoarse U (translateCoeffField z a) := by + funext i j + by_cases hij : i = j + · subst j + simp [sigmaCorrectedResponse_translateSet_eq_translateCoeffField] + · simp [sigmaCoarse_apply_of_ne, hij, + sigmaCorrectedResponse_translateSet_eq_translateCoeffField] + +theorem bCoarse_translateSet_eq_translateCoeffField {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + bCoarse (sigmaCoarse (translateSet z U) a) + (sigmaStarCoarse (translateSet z U) a) + (kappaCoarse (translateSet z U) a) = + bCoarse (sigmaCoarse U (translateCoeffField z a)) + (sigmaStarCoarse U (translateCoeffField z a)) + (kappaCoarse U (translateCoeffField z a)) := by + simp [sigmaCoarse_translateSet_eq_translateCoeffField, + sigmaStarCoarse_translateSet_eq_translateCoeffField, + kappaCoarse_translateSet_eq_translateCoeffField] + +theorem isSigmaStarCoarse_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (sigmaStar : Mat d) : + IsSigmaStarCoarse (translateSet z U) a sigmaStar ↔ + IsSigmaStarCoarse U (translateCoeffField z a) sigmaStar := by + constructor + · rintro ⟨hSymm, hResp⟩ + refine ⟨hSymm, ?_⟩ + intro q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U 0 q a] using hResp q + · rintro ⟨hSymm, hResp⟩ + refine ⟨hSymm, ?_⟩ + intro q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U 0 q a] using hResp q + +theorem isKappaCoarse_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (sigmaStar kappa : Mat d) : + IsKappaCoarse (translateSet z U) a sigmaStar kappa ↔ + IsKappaCoarse U (translateCoeffField z a) sigmaStar kappa := by + constructor + · intro hK p q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p q a, + ResponseJ_translateSet_eq_translateCoeffField z U p 0 a, + ResponseJ_translateSet_eq_translateCoeffField z U 0 q a] using hK p q + · intro hK p q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p q a, + ResponseJ_translateSet_eq_translateCoeffField z U p 0 a, + ResponseJ_translateSet_eq_translateCoeffField z U 0 q a] using hK p q + +theorem isSigmaCoarse_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) (sigma sigmaStar kappa : Mat d) : + IsSigmaCoarse (translateSet z U) a sigma sigmaStar kappa ↔ + IsSigmaCoarse U (translateCoeffField z a) sigma sigmaStar kappa := by + constructor + · rintro ⟨hSymm, hResp⟩ + refine ⟨hSymm, ?_⟩ + intro p + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p 0 a, + ResponseJ_translateSet_eq_translateCoeffField z U 0 (matVecMul kappa p) a] using hResp p + · rintro ⟨hSymm, hResp⟩ + refine ⟨hSymm, ?_⟩ + intro p + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p 0 a, + ResponseJ_translateSet_eq_translateCoeffField z U 0 (matVecMul kappa p) a] using hResp p + +theorem responseJ_blockQuadratic_translateSet_iff {d : ℕ} + (z : Vec d) (U : Set (Vec d)) (a : CoeffField d) : + (∀ p q : Vec d, + ResponseJ (translateSet z U) p q a = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix (translateSet z U) a) (-p, q)) - + vecDot p q) ↔ + (∀ p q : Vec d, + ResponseJ U p q (translateCoeffField z a) = + (1 / 2 : ℝ) * blockVecDot (-p, q) + (blockMatVecMul (coarseBlockMatrix U (translateCoeffField z a)) (-p, q)) - + vecDot p q) := by + constructor + · intro hResp p q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p q a, + coarseBlockMatrix_translateSet_eq_translateCoeffField z U a] using hResp p q + · intro hResp p q + simpa [ResponseJ_translateSet_eq_translateCoeffField z U p q a, + coarseBlockMatrix_translateSet_eq_translateCoeffField z U a] using hResp p q + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic.lean new file mode 100644 index 0000000000..9d2feee7c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliCutoffProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliEnergyBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalGradientBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliSingleCubeToRaw +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHSLocalRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantities +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli.lean new file mode 100644 index 0000000000..683e10c604 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Interior + +/-! +# Deterministic coarse-grained Caccioppoli backbones + +Compatibility wrapper for the coarse Caccioppoli subdirectory. The development +now lives in `Homogenization.Deterministic.CoarseCaccioppoli.*`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Basic.lean new file mode 100644 index 0000000000..b161fa8850 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Basic.lean @@ -0,0 +1,500 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import Mathlib.Analysis.SpecialFunctions.Log.Basic +public import Mathlib.Analysis.SpecificLimits.Normed + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-! +# Deterministic coarse-grained Caccioppoli backbones + +This file isolates the radius-iteration backbone of the Chapter-3 coarse +Caccioppoli estimate. + +At the current checkpoint the cutoff/Besov argument producing the local +recursive inequality is still upstream work. The theorems here therefore keep +that step as an explicit hypothesis and package the quantitative iteration and +multiscale prefactors that consume it. +-/ + +/-- Small real-arithmetic helper: `s * (1 - s) ≥ 0` whenever `0 ≤ s ≤ 1`. +Used in several coarse-Caccioppoli non-negativity chains. -/ +theorem mul_one_sub_nonneg {s : ℝ} (h0 : 0 ≤ s) (h1 : s ≤ 1) : + 0 ≤ s * (1 - s) := + mul_nonneg h0 (by linarith) + +/-- The Chapter-3 gap parameter `σ = 1 - s - t`. -/ +def coarseCaccioppoliSigma (s t : ℝ) : ℝ := + 1 - s - t + +/-- The recursion exponent `β = 2 (1 - t) / (1 - s - t)` appearing in the +radius-iteration step of the coarse Caccioppoli proof. -/ +def coarseCaccioppoliBeta (s t : ℝ) : ℝ := + 2 * (1 - t) / coarseCaccioppoliSigma s t + +/-- The note exponent `2s / (1 - s - t)` attached to the recursive error +prefactor. -/ +def coarseCaccioppoliPower (s t : ℝ) : ℝ := + 2 * s / coarseCaccioppoliSigma s t + +/-- Upper boundedness on the radius interval used in the Chapter-3 +radius-iteration argument. -/ +def CoarseCaccioppoliRadiusBoundedAbove (F : ℝ → ℝ) : Prop := + ∃ B, ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → F ρ ≤ B + +/-- The one-step recursive inequality produced by the local cutoff/Besov part +of the coarse Caccioppoli proof. -/ +def CoarseCaccioppoliRadiusRecurrence (F : ℝ → ℝ) (A β : ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ (1 / 2 : ℝ) * F ρ₂ + A * Real.rpow (ρ₂ - ρ₁) (-β) + +/-- The deterministic radius sequence `ρ_n = 1 - 2 / (3 (n + 1))`, +starting at `1/3` and increasing to `1`. -/ +def coarseCaccioppoliRadiusSequence (n : ℕ) : ℝ := + 1 - 2 / (3 * (n + 1)) + +/-- The same recursive inequality specialized to the deterministic Chapter-3 +radius sequence `ρ_n`. This is the concrete iteration interface needed when a +local cutoff construction only supplies the consecutive pairs +`(ρ_n, ρ_{n+1})`. -/ +def CoarseCaccioppoliRadiusSequenceRecurrence (F : ℝ → ℝ) (A β : ℝ) : Prop := + ∀ n : ℕ, + F (coarseCaccioppoliRadiusSequence n) ≤ + (1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1)) + + A * Real.rpow + (coarseCaccioppoliRadiusSequence (n + 1) - + coarseCaccioppoliRadiusSequence n) + (-β) + +/-- The `n`th weighted error term in the deterministic radius-iteration +argument. -/ +def coarseCaccioppoliRadiusIterationTerm (β : ℝ) (n : ℕ) : ℝ := + (1 / 2 : ℝ) ^ n * + Real.rpow + (coarseCaccioppoliRadiusSequence (n + 1) - coarseCaccioppoliRadiusSequence n) + (-β) + +/-- The deterministic radius-iteration constant obtained by summing the +geometric error terms coming from `coarseCaccioppoliRadiusIterationTerm`. -/ +def coarseCaccioppoliRadiusIterationConst (β : ℝ) : ℝ := + ∑' n : ℕ, coarseCaccioppoliRadiusIterationTerm β n + +/-- Midpoint radius used by the buffered cutoff version of the coarse +Caccioppoli single-step estimate. -/ +def coarseCaccioppoliBufferedCutoffRadius (ρ₁ ρ₂ : ℝ) : ℝ := + (ρ₁ + ρ₂) / 2 + +theorem coarseCaccioppoliBufferedCutoffRadius_between {ρ₁ ρ₂ : ℝ} + (hlt : ρ₁ < ρ₂) : + ρ₁ < coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ ∧ + coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ < ρ₂ := by + unfold coarseCaccioppoliBufferedCutoffRadius + constructor <;> linarith + +theorem coarseCaccioppoliBufferedCutoffRadius_outer_gap (ρ₁ ρ₂ : ℝ) : + ρ₂ - coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ = + (ρ₂ - ρ₁) / 2 := by + unfold coarseCaccioppoliBufferedCutoffRadius + ring + +theorem coarseCaccioppoliBufferedCutoffRadius_inner_gap (ρ₁ ρ₂ : ℝ) : + coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ - ρ₁ = + (ρ₂ - ρ₁) / 2 := by + unfold coarseCaccioppoliBufferedCutoffRadius + ring + +/-- The note-facing recursive right-hand side in the boundary coarse +Caccioppoli proof, after the local cutoff/Besov step has produced the +radius-recursion with exponent `coarseCaccioppoliBeta s t`. -/ +def coarseCaccioppoliBoundaryRecursionRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + C * + Real.rpow + (C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + LambdaSq Q s (.finite 1) a * + uL2Sq + +/-- Split version of the note-facing recursive right-hand side. `Calpha` +controls the height/absorption branch, while `Ccross` controls the local +cross coefficient. Keeping these separate prevents a centered-gradient budget +from drifting into the purely local quadratic branch. -/ +def coarseCaccioppoliBoundaryRecursionRhsSplit {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t Calpha Ccross uL2Sq : ℝ) : ℝ := + Ccross * + Real.rpow + (Calpha / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + LambdaSq Q s (.finite 1) a * + uL2Sq + +theorem coarseCaccioppoliBoundaryRecursionRhsSplit_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryRecursionRhsSplit Q a s t C C uL2Sq = + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + rfl + +/-- The first note-facing boundary coarse Caccioppoli prefactor obtained from +the radius-iteration lemma under an explicit recursive hypothesis. -/ +def coarseCaccioppoliBoundaryBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + coarseCaccioppoliRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq + +/-- Literal normalized `m = 0` right-hand side from the note's boundary +coarse Caccioppoli proposition. + +Here `C` represents the dimension-dependent constant in the note statement, +not the intermediate projected-Poincare constant used by some lower-level +single-cube wrappers. -/ +def coarseCaccioppoliBoundaryNoteRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + Real.rpow (C / coarseCaccioppoliSigma s t) + (2 + 4 * s / coarseCaccioppoliSigma s t) * + Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) * + Real.rpow (ThetaRatio Q s t a) (s / coarseCaccioppoliSigma s t) * + LambdaSq Q s (.finite 1) a * + uL2Sq + +/-- The current interior wrapper reuses the same radius-iteration constant and +recursive prefactor as the boundary version once an interior recursive +estimate has been supplied. -/ +def coarseCaccioppoliInteriorBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + coarseCaccioppoliBoundaryBound Q a s t C uL2Sq + +/-- Literal normalized `m = 0` right-hand side from the note's interior +coarse Caccioppoli corollary. -/ +def coarseCaccioppoliInteriorNoteRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + coarseCaccioppoliBoundaryNoteRhs Q a s t C uL2Sq + +/-- The honest pre-Besov recursive right-hand side obtained from the note's +explicit height choice `h = max {k + 4, ceil(...)}`. The first summand records +the `k + 4` branch; the second records the logarithmic branch. -/ +def coarseCaccioppoliBoundaryExplicitHeightRecursionRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + (6561 : ℝ) * 6561 * C ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a * uL2Sq + + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * + C * coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq + +/-- Split explicit-height recursive right-hand side. The left branch only +uses the cross/local constant `Ccross`; the logarithmic-height branch uses +`Calpha` through the height choice and `Ccross` through the cross coefficient. -/ +def coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) : ℝ := + (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq + + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit Q a s t Calpha Ccross uL2Sq + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit Q a s t C C uL2Sq = + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq := by + rfl + +/-- The boundary radius-iteration bound driven by the explicit-height recursive +right-hand side above. This is the final pre-Besov boundary surface with no +remaining extra cross-scale hypothesis. -/ +def coarseCaccioppoliBoundaryExplicitHeightBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + coarseCaccioppoliRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq + +/-- Split boundary radius-iteration bound driven by +`coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit`. -/ +def coarseCaccioppoliBoundaryExplicitHeightBoundSplit {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t Calpha Ccross uL2Sq : ℝ) : ℝ := + coarseCaccioppoliRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq + +theorem coarseCaccioppoliBoundaryExplicitHeightBoundSplit_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightBoundSplit Q a s t C C uL2Sq = + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + rw [coarseCaccioppoliBoundaryExplicitHeightBoundSplit, + coarseCaccioppoliBoundaryExplicitHeightBound, + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_self] + +/-- The interior pre-Besov explicit-height bound reuses the same recursive +prefactor as the boundary version, once the centered local estimate has been +transported into the iteration backbone. -/ +def coarseCaccioppoliInteriorExplicitHeightBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) : ℝ := + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq + +theorem coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_boundary + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (h : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq) : + coarseCaccioppoliInteriorExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote uL2Sq := by + simpa [coarseCaccioppoliInteriorExplicitHeightBound, coarseCaccioppoliInteriorNoteRhs] using h + +/-- Agreement of two radius-dependent quantities on the interval used by the +deterministic iteration. In the interior proof this packages the fact that +centering `v := u - (u)_Q` does not change the gradient quantity being iterated. +-/ +def CoarseCaccioppoliRadiusAgreement (F G : ℝ → ℝ) : Prop := + ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → F ρ = G ρ + +/-- Pre-absorption local input for the boundary coarse Caccioppoli proof: after +the cutoff/Besov step and coefficient bookkeeping, the local estimate has an +absorbable `sqrt (F ρ₂)` cross term whose square is controlled by the final +note-facing recursion right-hand side. -/ +def CoarseCaccioppoliBoundaryPreRecurrence {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (F : ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ α B : ℝ, + 0 ≤ α ∧ α ≤ (1 / 4 : ℝ) ∧ 0 ≤ B ∧ + F ρ₁ ≤ α * F ρ₂ + B * Real.sqrt (F ρ₂) ∧ + B ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) + +/-- Pre-recurrence surface with the enlarged explicit-height recursion +prefactor. This is the natural middle layer for localized height choices, +whose cross term is controlled by `coarseCaccioppoliBoundaryExplicitHeightRecursionRhs` +rather than by the smaller raw note prefactor. -/ +def CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (F : ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ α B : ℝ, + 0 ≤ α ∧ α ≤ (1 / 4 : ℝ) ∧ 0 ≤ B ∧ + F ρ₁ ≤ α * F ρ₂ + B * Real.sqrt (F ρ₂) ∧ + B ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) + +/-- The current interior middle layer reuses the same pre-recurrence surface as +the boundary version; the eventual difference is only in how the local estimate +is produced. -/ +def CoarseCaccioppoliInteriorPreRecurrence {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F + +/-- Interior version of the explicit-height pre-recurrence surface. -/ +def CoarseCaccioppoliInteriorExplicitHeightPreRecurrence {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F + +/-- Abstract local single-cube estimate before coefficient bookkeeping and +Young absorption. The note's estimate +`e.cg.Caccioppoli.single.cube.boundary.deterministic.theory` +has exactly this shape. -/ +def CoarseCaccioppoliBoundaryRawEstimate (F : ℝ → ℝ) (α B : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ α ρ₁ ρ₂ * F ρ₂ + B ρ₁ ρ₂ * Real.sqrt (F ρ₂) + +/-- Abstract coefficient bookkeeping for the local single-cube estimate. This +packages the note's choice of `h` and the conversion of localized coefficient +factors into the final note-facing recursion right-hand side. -/ +def CoarseCaccioppoliBoundaryCoefficientControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (α B : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ α ρ₁ ρ₂ ∧ α ρ₁ ρ₂ ≤ (1 / 4 : ℝ) ∧ 0 ≤ B ρ₁ ρ₂ ∧ + (B ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) + +/-- The current interior middle layer uses the same abstract local single-cube +surface as the boundary version. -/ +def CoarseCaccioppoliInteriorRawEstimate (F : ℝ → ℝ) (α B : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryRawEstimate F α B + +/-- The current interior coefficient bookkeeping surface also matches the +boundary one. -/ +def CoarseCaccioppoliInteriorCoefficientControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (α B : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryCoefficientControl Q a s t C uL2Sq α B + +/-- The inverse gap factor appearing in the radius-recursion estimates. -/ +def coarseCaccioppoliGapInv (ρ₁ ρ₂ : ℝ) : ℝ := + Real.rpow (ρ₂ - ρ₁) (-1 : ℝ) + +/-- The note's triadic scale choice for the gap `ρ₂ - ρ₁`: a natural scale +`k` satisfying `3⁻⁴ (ρ₂ - ρ₁) ≤ 3⁻ᵏ ≤ 3⁻³ (ρ₂ - ρ₁)`. -/ +def CoarseCaccioppoliTriadicGapScaleChoice (k : ℕ) (ρ₁ ρ₂ : ℝ) : Prop := + (1 / 81 : ℝ) * (ρ₂ - ρ₁) ≤ ((3 : ℝ) ^ k)⁻¹ ∧ + ((3 : ℝ) ^ k)⁻¹ ≤ (1 / 27 : ℝ) * (ρ₂ - ρ₁) + +/-- Note-shaped boundary coefficient in front of `F ρ₂` after replacing the +dyadic-scale factor by an inverse gap and keeping the auxiliary height choice +`h`. -/ +def coarseCaccioppoliBoundaryAlphaOfHeight {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) (ρ₁ ρ₂ : ℝ) : ℝ := + C / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + +/-- Note-shaped boundary cross coefficient in front of `sqrt (F ρ₂)` after +replacing the dyadic-scale factor by an inverse gap and keeping the auxiliary +height choice `h`. -/ +def coarseCaccioppoliBoundaryCrossCoeffOfHeight {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) (ρ₁ ρ₂ : ℝ) : ℝ := + C * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq + +/-- The current note-shaped raw boundary estimate: the local single-cube input +has the note's coefficient structure, parameterized by the auxiliary height +choice `h`. -/ +def CoarseCaccioppoliBoundaryNoteRawEstimate {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryRawEstimate F + (coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h) + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h) + +/-- Split version of the note-shaped raw boundary estimate. The absorption +coefficient uses `Calpha`, while the cross coefficient uses the independent +local budget `Ccross`. -/ +def CoarseCaccioppoliBoundaryNoteRawEstimateSplit {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t Calpha Ccross uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryRawEstimate F + (coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Calpha h) + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq h) + +/-- The current note-shaped boundary coefficient-control surface: the remaining +task is to verify the note's explicit height choice implies this property. -/ +def CoarseCaccioppoliBoundaryNoteCoefficientControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryCoefficientControl Q a s t C uL2Sq + (coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h) + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h) + +/-- The note-specific absorption obligation: the chosen auxiliary height makes +the coefficient in front of `F ρ₂` absorbable by the Young step. -/ +def CoarseCaccioppoliBoundaryNoteAbsorptionCondition {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ ≤ (1 / 4 : ℝ) + +/-- The note-specific cross-term bookkeeping obligation: after choosing the +auxiliary height, the square of the remaining cross coefficient is controlled +by the final recursion right-hand side. -/ +def CoarseCaccioppoliBoundaryNoteCrossTermBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) + +/-- Note-facing explicit height bookkeeping for the boundary proof: for each +gap `ρ₂ - ρ₁`, choose the triadic scale `k` from the note together with an +auxiliary height `h` that is at least `k + 4` and already makes the absorbable +coefficient small. This isolates the first half of the note's `h = max {…}` +construction without yet forcing the later `3^{s h}` estimate. -/ +def CoarseCaccioppoliBoundaryHeightChoice {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + (k : ℝ) + 4 ≤ h ρ₁ ρ₂ ∧ + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) ≤ (1 / 4 : ℝ) + +/-- The logarithmic argument in the note's explicit `h = max {k+4, ceil(...)}` choice. -/ +def coarseCaccioppoliBoundaryHeightLogArg {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (k : ℕ) : ℝ := + 4 * + (C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + +/-- The explicit height chosen in the note at a fixed triadic scale `k`. This +packages the `max {k + 4, ceil(...)}` formula using a natural ceiling. -/ +noncomputable def coarseCaccioppoliBoundaryExplicitHeightAtScale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : ℝ := + max ((k : ℝ) + 4) + ((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ))) : ℕ) : ℝ) + +/-- The note's explicit `h`-choice obtained after selecting a triadic scale +`k = k(ρ₁, ρ₂)` for each radius gap. -/ +noncomputable def coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) : ℝ → ℝ → ℝ := + fun ρ₁ ρ₂ => coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C (k ρ₁ ρ₂) + +/-- A localized variant of the explicit height which keeps the note's height +choice but also enforces the scale-localization lower bound `h >= 4 / s`. +For `t > 0`, this also implies `h >= 4 / (s + t)`. -/ +noncomputable def coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : ℝ := + max (coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k) (4 / s) + +/-- Radius-indexed localized explicit height obtained from a scale choice. -/ +noncomputable def coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) : ℝ → ℝ → ℝ := + fun ρ₁ ρ₂ => + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C (k ρ₁ ρ₂) + +/-- The interior note-shaped raw estimate currently reuses the same coefficient +structure as the boundary version. -/ +def CoarseCaccioppoliInteriorNoteRawEstimate {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F + +/-- Split version of the interior note-shaped raw estimate. -/ +def CoarseCaccioppoliInteriorNoteRawEstimateSplit {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t Calpha Ccross uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteRawEstimateSplit Q a s t Calpha Ccross uL2Sq h F + +/-- The interior note-shaped coefficient-control surface currently reuses the +boundary one. -/ +def CoarseCaccioppoliInteriorNoteCoefficientControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteCoefficientControl Q a s t C uL2Sq h + +/-- The interior note-specific absorption condition currently matches the +boundary one. -/ +def CoarseCaccioppoliInteriorNoteAbsorptionCondition {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h + +/-- The interior note-specific cross-term bookkeeping condition currently +matches the boundary one. -/ +def CoarseCaccioppoliInteriorNoteCrossTermBound {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h + +/-- The interior note-facing explicit height choice currently reuses the +boundary bookkeeping surface; the later distinction is only in how the local +estimate is centered. -/ +def CoarseCaccioppoliInteriorHeightChoice {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundaryHeightChoice Q a s t C h + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary.lean new file mode 100644 index 0000000000..d79754e046 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.ExplicitHeight + +/-! # Boundary -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/ExplicitHeight.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/ExplicitHeight.lean new file mode 100644 index 0000000000..6c2e7fe161 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/ExplicitHeight.lean @@ -0,0 +1,749 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration + +/-! # Explicit Height -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-- Boundary coarse Caccioppoli from the already-absorbed pre-recurrence +surface. This is the current next-safe theorem interface before the upstream +Besov cutoff/pairing step is formalized. -/ +theorem coarseCaccioppoli_boundary_qone_of_preRecurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hpre : CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_boundary_qone_of_radius_recurrence + Q a s t C uL2Sq hC hs ht hst hu hbounded + exact coarseCaccioppoli_boundary_radius_recurrence_of_preRecurrence + Q a s t C uL2Sq hnonneg hpre + +/-- Boundary coarse Caccioppoli from the explicit-height pre-recurrence middle +layer. -/ +theorem coarseCaccioppoli_boundary_qone_of_explicitHeightPreRecurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hpre : + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightBound + have h := + coarseCaccioppoli_radius_iteration + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_nonneg + Q a s t C uL2Sq hC hs ht hst hu) + hbounded + (coarseCaccioppoli_boundary_radius_recurrence_of_explicitHeightPreRecurrence + Q a s t C uL2Sq hnonneg hpre) + simpa [mul_comm] using h + +/-- Boundary coarse Caccioppoli from the raw local single-cube estimate and the +separate coefficient bookkeeping surface. -/ +theorem coarseCaccioppoli_boundary_qone_of_rawEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} {α B : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliBoundaryRawEstimate F α B) + (hctrl : CoarseCaccioppoliBoundaryCoefficientControl Q a s t C uL2Sq α B) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_boundary_qone_of_preRecurrence + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded + exact coarseCaccioppoli_boundary_preRecurrence_of_rawEstimate + Q a s t C uL2Sq hraw hctrl + +/-- Boundary coarse Caccioppoli from the note-shaped raw estimate and the +note-shaped coefficient-control surface. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (hctrl : CoarseCaccioppoliBoundaryNoteCoefficientControl Q a s t C uL2Sq h) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + exact coarseCaccioppoli_boundary_qone_of_rawEstimate + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded hraw hctrl + +/-- The split note-specific bookkeeping conditions imply the packaged +note-shaped coefficient-control surface. -/ +theorem coarseCaccioppoli_boundary_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryNoteCoefficientControl Q a s t C uL2Sq h := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨?_, ?_, ?_, ?_⟩ + · exact coarseCaccioppoliBoundaryAlphaOfHeight_nonneg + Q a s t C h hC hs ht hst hlt + · exact habs hρ₁ hlt hρ₂ + · exact coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s C uL2Sq h hC hs hlt + · exact hcross hρ₁ hlt hρ₂ + +/-- The note-facing explicit `h` choice plus the stronger triadic-scale +cross-term estimate recover the packaged boundary coefficient-control surface. +-/ +theorem coarseCaccioppoli_boundary_noteCoefficientControl_of_heightChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hheight : CoarseCaccioppoliBoundaryHeightChoice Q a s t C h) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + CoarseCaccioppoliBoundaryNoteCoefficientControl Q a s t C uL2Sq h := by + apply coarseCaccioppoli_boundary_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst + · exact coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C h hC hs ht hst hheight + · exact coarseCaccioppoli_boundary_noteCrossTermBound_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu hcrossscale + +/-- Boundary coarse Caccioppoli from the note-shaped raw estimate plus the two +remaining note-specific bookkeeping obligations. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_boundary_qone_of_noteEstimate + Q a s t C uL2Sq h hC hs ht hst hu hnonneg hbounded hraw + exact + coarseCaccioppoli_boundary_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst habs hcross + +/-- Boundary coarse Caccioppoli with the explicit-height recursion RHS, for any +height whose absorption and cross-term square bound have already been proved. +This factors out the final radius-iteration step so localized height choices +can reuse the same bound. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_absorptionCondition_of_explicitCrossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ + (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hden_nonneg : 0 ≤ s * (1 - s) := by nlinarith + have hM_nonneg : + 0 ≤ C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hp_nonneg : 0 ≤ coarseCaccioppoliPower s t := + coarseCaccioppoli_power_nonneg hs hst + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhs + exact mul_nonneg + (mul_nonneg (mul_nonneg hC (Real.rpow_nonneg hM_nonneg _)) hLambda_nonneg) + hu + have hexplicit_nonneg : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + refine add_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg C)) hLambda_nonneg) + hu + · refine mul_nonneg ?_ hrec_nonneg + refine mul_nonneg ?_ hC + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + have hrec : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + have hF₂_nonneg : 0 ≤ F ρ₂ := hnonneg hρ₂_lower hρ₂ + calc + F ρ₁ ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ * F ρ₂ + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ * + Real.sqrt (F ρ₂) := hraw hρ₁ hlt hρ₂ + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ + (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg (habs hρ₁ hlt hρ₂) + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (hcross hρ₁ hlt hρ₂) ((1 / 2 : ℝ) * F ρ₂) + unfold coarseCaccioppoliBoundaryExplicitHeightBound + have hiter := + coarseCaccioppoli_radius_iteration + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := hexplicit_nonneg) + hbounded hrec + simpa [mul_comm] using hiter + +/-- Boundary coarse Caccioppoli from the note-shaped local estimate, the +explicit note-facing `h` choice, and the remaining stronger triadic-scale +cross-term inequality. This is the current closest pre-Besov theorem surface +to the note's coefficient-bookkeeping step. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_heightChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (hheight : CoarseCaccioppoliBoundaryHeightChoice Q a s t C h) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_boundary_qone_of_noteEstimate + Q a s t C uL2Sq h hC hs ht hst hu hnonneg hbounded hraw + exact + coarseCaccioppoli_boundary_noteCoefficientControl_of_heightChoice_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu hheight hcrossscale + +/-- Boundary coarse Caccioppoli with the note's actual explicit +`h = max {k + 4, ceil(...)}` height formula, once the caller supplies a triadic +scale choice `k(ρ₁, ρ₂)` and the remaining stronger triadic-scale cross-term +estimate. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_explicitHeightOfScaleChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ j : ℕ, CoarseCaccioppoliTriadicGapScaleChoice j ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) + (2 * s * + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ j) / 81) (coarseCaccioppoliPower s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_boundary_qone_of_noteEstimate_of_heightChoice_of_triadicGapScaleChoice + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hu hnonneg hbounded hraw + · exact coarseCaccioppoli_boundary_heightChoice_of_explicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + · exact hcrossscale + +/-- Boundary coarse Caccioppoli in the completed pre-Besov form: once the +caller supplies the note-shaped local estimate and the actual explicit height +formula `h = max {k + 4, ceil(...)}`, the remaining coefficient arithmetic is +fully internal to this file and no extra cross-scale hypothesis remains. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_heightChoice_of_explicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hheight + have hcross := + coarseCaccioppoli_boundary_noteCrossTermBound_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hden_nonneg : 0 ≤ s * (1 - s) := by nlinarith + have hM_nonneg : + 0 ≤ C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hp_nonneg : 0 ≤ coarseCaccioppoliPower s t := + coarseCaccioppoli_power_nonneg hs hst + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhs + exact mul_nonneg + (mul_nonneg (mul_nonneg hC (Real.rpow_nonneg hM_nonneg _)) hLambda_nonneg) + hu + have hexplicit_nonneg : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + refine add_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg C)) hLambda_nonneg) + hu + · refine mul_nonneg ?_ hrec_nonneg + refine mul_nonneg ?_ hC + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + have hrec : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + have hF₂_nonneg : 0 ≤ F ρ₂ := hnonneg hρ₂_lower hρ₂ + calc + F ρ₁ ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂ * F ρ₂ + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂ * + Real.sqrt (F ρ₂) := hraw hρ₁ hlt hρ₂ + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂) ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg (habs hρ₁ hlt hρ₂) + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (hcross hρ₁ hlt hρ₂) ((1 / 2 : ℝ) * F ρ₂) + unfold coarseCaccioppoliBoundaryExplicitHeightBound + have h := + coarseCaccioppoli_radius_iteration + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := hexplicit_nonneg) + hbounded hrec + simpa [mul_comm] using h + +/-- Boundary coarse Caccioppoli with the localized explicit height. This keeps +the same final explicit-height bound while adding the scale-localization lower +bound `h >= 4 / s` to the local height. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hheight + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_of_absorptionCondition_of_explicitCrossTermBound + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hu hnonneg hbounded hraw habs + (coarseCaccioppoli_boundary_noteCrossTermBound_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale) + +/-- Boundary coarse Caccioppoli from the localized explicit-height note estimate +only on the deterministic Chapter-3 radius sequence. This is the concrete +iteration surface used when the local cutoff construction is only available for +the consecutive pairs `(ρ_n, ρ_{n+1})`. -/ +theorem coarseCaccioppoli_boundary_qone_of_noteEstimate_on_radiusSequence_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + ∀ n : ℕ, + F (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt (F (coarseCaccioppoliRadiusSequence (n + 1)))) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hheight + have hcross := + coarseCaccioppoli_boundary_noteCrossTermBound_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale + have hrec : + CoarseCaccioppoliRadiusSequenceRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro n + have hρ₁ := (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₂ := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hρ₂_lower := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hF₂_nonneg : 0 ≤ F (coarseCaccioppoliRadiusSequence (n + 1)) := + hnonneg hρ₂_lower hρ₂ + calc + F (coarseCaccioppoliRadiusSequence n) + ≤ coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt (F (coarseCaccioppoliRadiusSequence (n + 1))) := hraw n + _ ≤ (1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1)) + + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg (habs hρ₁ hlt hρ₂) + _ ≤ (1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow + (coarseCaccioppoliRadiusSequence (n + 1) - + coarseCaccioppoliRadiusSequence n) + (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (hcross hρ₁ hlt hρ₂) + ((1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1))) + unfold coarseCaccioppoliBoundaryExplicitHeightBound + have h := + coarseCaccioppoli_radius_iteration_of_sequenceRecurrence + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_nonneg + Q a s t C uL2Sq hC hs ht hst hu) + hbounded hrec + simpa [mul_comm] using h + +theorem + coarseCaccioppoli_boundary_qone_of_noteEstimate_on_radiusSequence_of_localizedExplicitHeightOfScaleChoice_split + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + ∀ n : ℕ, + F (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt (F (coarseCaccioppoliRadiusSequence (n + 1)))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBoundSplit + Q a s t Calpha Ccross uL2Sq := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t Calpha k hCalpha.le hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + hCalpha.le hs ht hst hheight + have hcross := + coarseCaccioppoli_boundary_noteCrossTermBoundSplit_of_localizedExplicitHeightOfScaleChoice + Q a s t Calpha Ccross uL2Sq k hCalpha hCcross hs ht hst hu hscale + have hrec : + CoarseCaccioppoliRadiusSequenceRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro n + have hρ₁ := (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₂ := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hρ₂_lower := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hF₂_nonneg : 0 ≤ F (coarseCaccioppoliRadiusSequence (n + 1)) := + hnonneg hρ₂_lower hρ₂ + calc + F (coarseCaccioppoliRadiusSequence n) + ≤ coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt (F (coarseCaccioppoliRadiusSequence (n + 1))) := hraw n + _ ≤ (1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1)) + + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg + (habs hρ₁ hlt hρ₂) + _ ≤ (1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow + (coarseCaccioppoliRadiusSequence (n + 1) - + coarseCaccioppoliRadiusSequence n) + (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (hcross hρ₁ hlt hρ₂) + ((1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (n + 1))) + unfold coarseCaccioppoliBoundaryExplicitHeightBoundSplit + have h := + coarseCaccioppoli_radius_iteration_of_sequenceRecurrence + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_nonneg + Q a s t Calpha Ccross uL2Sq hCalpha.le hCcross hs ht hst hu) + hbounded hrec + simpa [mul_comm] using h + +/-- Boundary coarse Caccioppoli from an all-radii split note-shaped raw estimate, +using the standard beta-dependent radius iteration. This is the note-facing +iteration endpoint needed to keep the explicit `s,t` exponents under control. -/ +theorem + coarseCaccioppoli_boundary_qone_standard_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice_split + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimateSplit Q a s t Calpha Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) F) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t Calpha k hCalpha.le hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + hCalpha.le hs ht hst hheight + have hcross := + coarseCaccioppoli_boundary_noteCrossTermBoundSplit_of_localizedExplicitHeightOfScaleChoice + Q a s t Calpha Ccross uL2Sq k hCalpha hCcross hs ht hst hu hscale + have hrec : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + have hF₂_nonneg : 0 ≤ F ρ₂ := hnonneg hρ₂_lower hρ₂ + calc + F ρ₁ ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Calpha + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂ * F ρ₂ + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂ * Real.sqrt (F ρ₂) := hraw hρ₁ hlt hρ₂ + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂) ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg + (habs hρ₁ hlt hρ₂) + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (hcross hρ₁ hlt hρ₂) ((1 / 2 : ℝ) * F ρ₂) + exact + coarseCaccioppoli_standard_radius_iteration + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_nonneg + Q a s t Calpha Ccross uL2Sq hCalpha.le hCcross hs ht hst hu) + hbounded hrec + +theorem + coarseCaccioppoli_boundary_qone_standard_le_noteRhs_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice_split + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) (hTheta : 0 < ThetaRatio Q s t a) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimateSplit Q a s t Calpha Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) F) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross) + uL2Sq := by + have hqone : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit + Q a s t Calpha Ccross uL2Sq := by + have h := + coarseCaccioppoli_boundary_qone_standard_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice_split + (Q := Q) (a := a) (s := s) (t := t) (Calpha := Calpha) + (Ccross := Ccross) (uL2Sq := uL2Sq) (k := k) + hCalpha hCcross hs ht hst hu hnonneg hbounded hscale hraw + simpa [coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit, + mul_comm, mul_left_comm, mul_assoc] using h + exact hqone.trans + (coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit_le_noteRhs_standardExplicitNoteConstantSplit + Q a s t Calpha Ccross uL2Sq hs ht hst hu hTheta) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs.lean new file mode 100644 index 0000000000..326b6c98ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs.lean @@ -0,0 +1,352 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.StandardSplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration + +/-! # Note Rhs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoliInteriorNoteRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliInteriorNoteRhs Q a s t C uL2Sq := by + simpa [coarseCaccioppoliInteriorNoteRhs] using + coarseCaccioppoliBoundaryNoteRhs_nonneg Q a s t C uL2Sq hC hs ht hst hu + +theorem coarseCaccioppoliInteriorNoteRhs_mono_C {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C₁ C₂ uL2Sq : ℝ) + (hC₁ : 0 ≤ C₁) (hC₁C₂ : C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliInteriorNoteRhs Q a s t C₁ uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t C₂ uL2Sq := by + simpa [coarseCaccioppoliInteriorNoteRhs] using + coarseCaccioppoliBoundaryNoteRhs_mono_C + Q a s t C₁ C₂ uL2Sq hC₁ hC₁C₂ hs ht hst hu + +theorem coarseCaccioppoliInteriorNoteRhs_mul_const_le_of_mul_constant_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t M C₁ C₂ uL2Sq : ℝ) + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + M * coarseCaccioppoliInteriorNoteRhs Q a s t C₁ uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t C₂ uL2Sq := by + simpa [coarseCaccioppoliInteriorNoteRhs] using + coarseCaccioppoliBoundaryNoteRhs_mul_const_le_of_mul_constant_le + Q a s t M C₁ C₂ uL2Sq hM hC₁ hMC₁C₂ hs ht hst hu + +theorem coarseCaccioppoliBoundaryRecursionRhs_eq_zero_of_uL2Sq_eq_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq = 0 := by + simp [coarseCaccioppoliBoundaryRecursionRhs, hu] + +theorem + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_eq_zero_of_uL2Sq_eq_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq = 0 := by + subst uL2Sq + simp [coarseCaccioppoliBoundaryExplicitHeightRecursionRhs, + coarseCaccioppoliBoundaryRecursionRhs] + +theorem coarseCaccioppoliBoundaryExplicitHeightBound_eq_zero_of_uL2Sq_eq_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq = 0 := by + simp [coarseCaccioppoliBoundaryExplicitHeightBound, + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_eq_zero_of_uL2Sq_eq_zero + Q a s t C uL2Sq hu] + +theorem coarseCaccioppoliBoundaryNoteRhs_eq_zero_of_uL2Sq_eq_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliBoundaryNoteRhs Q a s t C uL2Sq = 0 := by + simp [coarseCaccioppoliBoundaryNoteRhs, hu] + +theorem + coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_uL2Sq_eq_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq := by + rw [coarseCaccioppoliBoundaryExplicitHeightBound_eq_zero_of_uL2Sq_eq_zero + Q a s t Cinternal uL2Sq hu, + coarseCaccioppoliBoundaryNoteRhs_eq_zero_of_uL2Sq_eq_zero + Q a s t Cnote uL2Sq hu] + +theorem + coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_uL2Sq_eq_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (hu : uL2Sq = 0) : + coarseCaccioppoliInteriorExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote uL2Sq := by + exact + coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_boundary Q a s t + Cinternal Cnote uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_uL2Sq_eq_zero + Q a s t Cinternal Cnote uL2Sq hu) + +theorem coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (hcoeff : + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq := by + rw [coarseCaccioppoliBoundaryExplicitHeightBound_eq_coeff_mul_uL2Sq, + coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] + exact mul_le_mul_of_nonneg_right hcoeff hu + +theorem coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_coeff_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (hcoeff : + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliInteriorExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote uL2Sq := + coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_boundary Q a s t + Cinternal Cnote uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le + Q a s t Cinternal Cnote uL2Sq hcoeff hu) + +theorem + coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le_noteCoeff_of_noteConstant_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cadequate Cnote uL2Sq : ℝ) + (hcoeff : + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cadequate) + (hCadequate : 0 ≤ Cadequate) (hCadequateCnote : Cadequate ≤ Cnote) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq := by + exact + coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le + Q a s t Cinternal Cnote uL2Sq + (le_trans hcoeff + (coarseCaccioppoliBoundaryNoteCoeff_mono_C + Q a s t Cadequate Cnote hCadequate hCadequateCnote hs ht hst)) + hu + +theorem + coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_coeff_le_noteCoeff_of_noteConstant_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cadequate Cnote uL2Sq : ℝ) + (hcoeff : + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cadequate) + (hCadequate : 0 ≤ Cadequate) (hCadequateCnote : Cadequate ≤ Cnote) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliInteriorExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote uL2Sq := + coarseCaccioppoliInteriorExplicitHeightBound_le_noteRhs_of_boundary Q a s t + Cinternal Cnote uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le_noteCoeff_of_noteConstant_le + Q a s t Cinternal Cadequate Cnote uL2Sq hcoeff + hCadequate hCadequateCnote hs ht hst hu) + +theorem coarseCaccioppoliBoundaryCoeff_le_of_explicitHeightBound_le_noteRhs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) + (hu : 0 < uL2Sq) + (h : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq) : + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote := by + rw [coarseCaccioppoliBoundaryExplicitHeightBound_eq_coeff_mul_uL2Sq, + coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] at h + exact (mul_le_mul_iff_of_pos_right hu).1 h + +theorem coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_iff_coeff_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Cinternal Cnote uL2Sq : ℝ) (hu : 0 < uL2Sq) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t Cinternal uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote uL2Sq ↔ + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t Cinternal ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote := by + constructor + · exact + coarseCaccioppoliBoundaryCoeff_le_of_explicitHeightBound_le_noteRhs + Q a s t Cinternal Cnote uL2Sq hu + · intro hcoeff + exact + coarseCaccioppoliBoundaryExplicitHeightBound_le_noteRhs_of_coeff_le + Q a s t Cinternal Cnote uL2Sq hcoeff hu.le + +/-- Boundary coarse Caccioppoli in the current honest Chapter-3 form: once the +local cutoff/Besov step has produced the radius-recursion with the note-facing +multiscale prefactor, the deterministic radius iteration yields the final +boundary bound. -/ +theorem coarseCaccioppoli_boundary_qone_of_radius_recurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryBound + have h := + coarseCaccioppoli_radius_iteration + (hβ := coarseCaccioppoli_beta_nonneg hs hst) + (hA := coarseCaccioppoliBoundaryRecursionRhs_nonneg Q a s t C uL2Sq hC hs ht hst hu) + hbounded hrec + simpa [mul_comm] using h + +/-- The local single-cube estimate plus coefficient bookkeeping imply the +already-absorbed pre-recurrence surface. This is the current pre-Besov bridge +between the note's local estimate and the iteration backbone. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_rawEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} {α B : ℝ → ℝ → ℝ} + (hraw : CoarseCaccioppoliBoundaryRawEstimate F α B) + (hctrl : CoarseCaccioppoliBoundaryCoefficientControl Q a s t C uL2Sq α B) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨α ρ₁ ρ₂, B ρ₁ ρ₂, ?_, ?_, ?_, ?_, ?_⟩ + · exact (hctrl hρ₁ hlt hρ₂).1 + · exact (hctrl hρ₁ hlt hρ₂).2.1 + · exact (hctrl hρ₁ hlt hρ₂).2.2.1 + · exact hraw hρ₁ hlt hρ₂ + · exact (hctrl hρ₁ hlt hρ₂).2.2.2 + +/-- Boundary pre-recurrence from the note-shaped raw estimate and note-shaped +coefficient-control surface. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (hctrl : CoarseCaccioppoliBoundaryNoteCoefficientControl Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + exact coarseCaccioppoli_boundary_preRecurrence_of_rawEstimate + Q a s t C uL2Sq hraw hctrl + +/-- Boundary pre-recurrence from the note-shaped raw estimate plus the two +remaining note-specific bookkeeping obligations. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + apply coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate + Q a s t C uL2Sq h hraw + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨?_, ?_, ?_, ?_⟩ + · exact coarseCaccioppoliBoundaryAlphaOfHeight_nonneg + Q a s t C h hC hs ht hst hlt + · exact habs hρ₁ hlt hρ₂ + · exact coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s C uL2Sq h hC hs hlt + · exact hcross hρ₁ hlt hρ₂ + +/-- Explicit-height pre-recurrence from a note-shaped raw estimate, absorption, +and the enlarged explicit-height cross-term square bound. -/ +theorem coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_noteEstimate_of_absorptionCondition_of_explicitCrossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ + (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t)) : + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine + ⟨coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂, + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂, + ?_, ?_, ?_, ?_, ?_⟩ + · exact coarseCaccioppoliBoundaryAlphaOfHeight_nonneg + Q a s t C h hC hs ht hst hlt + · exact habs hρ₁ hlt hρ₂ + · exact coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s C uL2Sq h hC hs hlt + · exact hraw hρ₁ hlt hρ₂ + · exact hcross hρ₁ hlt hρ₂ + +/-- The pre-recurrence middle layer of the boundary proof implies the abstract +radius-recursion used by the deterministic iteration backbone. -/ +theorem coarseCaccioppoli_boundary_radius_recurrence_of_preRecurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hpre : CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F) : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hpre hρ₁ hlt hρ₂ with ⟨α, B, -, hα_le, -, hstep, hBsq⟩ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + have hF₂_nonneg : 0 ≤ F ρ₂ := hnonneg hρ₂_lower hρ₂ + calc + F ρ₁ ≤ α * F ρ₂ + B * Real.sqrt (F ρ₂) := hstep + _ ≤ (1 / 2 : ℝ) * F ρ₂ + B ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg hα_le + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hBsq ((1 / 2 : ℝ) * F ρ₂) + +/-- Explicit-height pre-recurrence implies the radius recurrence with the +enlarged explicit-height prefactor. -/ +theorem coarseCaccioppoli_boundary_radius_recurrence_of_explicitHeightPreRecurrence + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hpre : + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F) : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hpre hρ₁ hlt hρ₂ with ⟨α, B, -, hα_le, -, hstep, hBsq⟩ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + have hF₂_nonneg : 0 ≤ F ρ₂ := hnonneg hρ₂_lower hρ₂ + calc + F ρ₁ ≤ α * F ρ₂ + B * Real.sqrt (F ρ₂) := hstep + _ ≤ (1 / 2 : ℝ) * F ρ₂ + B ^ (2 : ℕ) := by + exact coarseCaccioppoli_absorb_cross_term hF₂_nonneg hα_le + _ ≤ (1 / 2 : ℝ) * F ρ₂ + + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hBsq ((1 / 2 : ℝ) * F ρ₂) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/Basic.lean new file mode 100644 index 0000000000..ea108d3c32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/Basic.lean @@ -0,0 +1,540 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-- Boundary recursion prefactor with the public `uL2Sq` factor removed. -/ +def coarseCaccioppoliBoundaryRecursionCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) : ℝ := + C * + Real.rpow + (C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + LambdaSq Q s (.finite 1) a + +/-- Split recursion prefactor with the public `uL2Sq` factor removed. -/ +def coarseCaccioppoliBoundaryRecursionCoeffSplit {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t Calpha Ccross : ℝ) : ℝ := + Ccross * + Real.rpow + (Calpha / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + LambdaSq Q s (.finite 1) a + +theorem coarseCaccioppoliBoundaryRecursionCoeffSplit_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) : + coarseCaccioppoliBoundaryRecursionCoeffSplit Q a s t C C = + coarseCaccioppoliBoundaryRecursionCoeff Q a s t C := by + rfl + +/-- Explicit-height recursion prefactor with the public `uL2Sq` factor removed. -/ +def coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) : ℝ := + (6561 : ℝ) * 6561 * C ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a + + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * + C * coarseCaccioppoliBoundaryRecursionCoeff Q a s t C + +/-- Split explicit-height recursion prefactor with the public `uL2Sq` factor +removed. The left branch depends only on `Ccross`; the logarithmic branch +depends on `Calpha` through the height and on `Ccross` through the cross term. -/ +def coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t Calpha Ccross : ℝ) : ℝ := + (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a + + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * + Ccross * + coarseCaccioppoliBoundaryRecursionCoeffSplit Q a s t Calpha Ccross + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit Q a s t C C = + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff Q a s t C := by + rfl + +/-- Explicit-height radius-iteration prefactor with `uL2Sq` removed. -/ +def coarseCaccioppoliBoundaryExplicitHeightCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) : ℝ := + coarseCaccioppoliRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff Q a s t C + +/-- Split explicit-height prefactor using the standard beta-dependent radius +iteration. This is the coefficient surface for the note-facing route, carrying +the standard `(C beta)^beta` iteration loss. -/ +def coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t Calpha Ccross : ℝ) : ℝ := + coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit Q a s t Calpha Ccross + +/-- Standard-radius split explicit-height bound, before conversion to the +public note RHS. -/ +def coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) : ℝ := + coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) * + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq + +/-- Literal note RHS prefactor with the public `uL2Sq` factor removed. -/ +def coarseCaccioppoliBoundaryNoteCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s t C : ℝ) : ℝ := + Real.rpow (C / coarseCaccioppoliSigma s t) + (2 + 4 * s / coarseCaccioppoliSigma s t) * + Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) * + Real.rpow (ThetaRatio Q s t a) (s / coarseCaccioppoliSigma s t) * + LambdaSq Q s (.finite 1) a + +theorem coarseCaccioppoliBoundaryRecursionRhs_eq_coeff_mul_uL2Sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq = + coarseCaccioppoliBoundaryRecursionCoeff Q a s t C * uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhs + coarseCaccioppoliBoundaryRecursionCoeff + ring + +theorem coarseCaccioppoliBoundaryRecursionRhsSplit_eq_coeff_mul_uL2Sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) : + coarseCaccioppoliBoundaryRecursionRhsSplit Q a s t Calpha Ccross uL2Sq = + coarseCaccioppoliBoundaryRecursionCoeffSplit Q a s t Calpha Ccross * + uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhsSplit + coarseCaccioppoliBoundaryRecursionCoeffSplit + ring + +theorem + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_eq_coeff_mul_uL2Sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq = + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff Q a s t C * uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff + coarseCaccioppoliBoundaryRecursionRhs + coarseCaccioppoliBoundaryRecursionCoeff + ring + +theorem + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_eq_coeff_mul_uL2Sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq = + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + Q a s t Calpha Ccross * uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + coarseCaccioppoliBoundaryRecursionRhsSplit + coarseCaccioppoliBoundaryRecursionCoeffSplit + ring + +theorem coarseCaccioppoliBoundaryExplicitHeightBound_eq_coeff_mul_uL2Sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq = + coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t C * uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightBound + coarseCaccioppoliBoundaryExplicitHeightCoeff + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff + coarseCaccioppoliBoundaryRecursionRhs + coarseCaccioppoliBoundaryRecursionCoeff + ring + +theorem + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit_eq_coeff_mul_uL2Sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) : + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit + Q a s t Calpha Ccross uL2Sq = + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross * + uL2Sq := by + unfold coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + coarseCaccioppoliBoundaryRecursionRhsSplit + coarseCaccioppoliBoundaryRecursionCoeffSplit + ring + +theorem coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) : + coarseCaccioppoliBoundaryNoteRhs Q a s t C uL2Sq = + coarseCaccioppoliBoundaryNoteCoeff Q a s t C * uL2Sq := by + unfold coarseCaccioppoliBoundaryNoteRhs coarseCaccioppoliBoundaryNoteCoeff + ring + +theorem coarseCaccioppoliBoundaryRecursionRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + have hs1 : s < 1 := by linarith + have hden_nonneg : 0 ≤ s * (1 - s) := by + nlinarith + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hpow_nonneg : + 0 ≤ + Real.rpow + (C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) := by + refine Real.rpow_nonneg ?_ _ + refine mul_nonneg ?_ ?_ + · exact div_nonneg hC hden_nonneg + · exact Real.rpow_nonneg htheta_nonneg _ + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryRecursionRhs + positivity + +theorem coarseCaccioppoliBoundaryRecursionRhsSplit_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + have hs1 : s < 1 := by + linarith + have hden_nonneg : 0 ≤ s * (1 - s) := by + nlinarith + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hpow_nonneg : + 0 ≤ + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) := by + refine Real.rpow_nonneg ?_ _ + refine mul_nonneg ?_ ?_ + · exact div_nonneg hCalpha hden_nonneg + · exact Real.rpow_nonneg htheta_nonneg _ + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryRecursionRhsSplit + positivity + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq := by + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := + coarseCaccioppoliBoundaryRecursionRhs_nonneg Q a s t C uL2Sq hC hs ht hst hu + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + refine add_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg C)) hLambda_nonneg) + hu + · refine mul_nonneg ?_ hrec_nonneg + refine mul_nonneg ?_ hC + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := + coarseCaccioppoliBoundaryRecursionRhsSplit_nonneg + Q a s t Calpha Ccross uL2Sq hCalpha hCcross hs ht hst hu + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + refine add_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg Ccross)) hLambda_nonneg) + hu + · refine mul_nonneg ?_ hrec_nonneg + refine mul_nonneg ?_ hCcross + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + +theorem coarseCaccioppoliBoundaryBound_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryBound + exact mul_nonneg + (coarseCaccioppoliRadiusIterationConst_nonneg (coarseCaccioppoliBeta s t)) + (coarseCaccioppoliBoundaryRecursionRhs_nonneg Q a s t C uL2Sq hC hs ht hst hu) + +theorem coarseCaccioppoliBoundaryExplicitHeightBound_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryExplicitHeightBound + exact mul_nonneg + (coarseCaccioppoliRadiusIterationConst_nonneg (coarseCaccioppoliBeta s t)) + (coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_nonneg + Q a s t C uL2Sq hC hs ht hst hu) + +theorem coarseCaccioppoliBoundaryRecursionCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryRecursionCoeff Q a s t C := by + have h := + coarseCaccioppoliBoundaryRecursionRhs_nonneg Q a s t C (1 : ℝ) + hC hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryRecursionRhs_eq_coeff_mul_uL2Sq] using h + +theorem coarseCaccioppoliBoundaryRecursionCoeffSplit_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t Calpha Ccross : ℝ) + (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross := by + have h := + coarseCaccioppoliBoundaryRecursionRhsSplit_nonneg + Q a s t Calpha Ccross (1 : ℝ) + hCalpha hCcross hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryRecursionRhsSplit_eq_coeff_mul_uL2Sq] using h + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionCoeff Q a s t C := by + have h := + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_nonneg Q a s t C (1 : ℝ) + hC hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryExplicitHeightRecursionRhs_eq_coeff_mul_uL2Sq] using h + +theorem coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + Q a s t Calpha Ccross := by + have h := + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_nonneg + Q a s t Calpha Ccross (1 : ℝ) + hCalpha hCcross hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit_eq_coeff_mul_uL2Sq] + using h + +theorem coarseCaccioppoliBoundaryExplicitHeightCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryExplicitHeightCoeff Q a s t C := by + have h := + coarseCaccioppoliBoundaryExplicitHeightBound_nonneg Q a s t C (1 : ℝ) + hC hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryExplicitHeightBound_eq_coeff_mul_uL2Sq] using h + +theorem coarseCaccioppoliBoundaryNoteRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + 0 ≤ coarseCaccioppoliBoundaryNoteRhs Q a s t C uL2Sq := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryNoteRhs + exact mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg (div_nonneg hC hσ_pos.le) _) + (Real.rpow_nonneg hs.le _)) + (Real.rpow_nonneg htheta_nonneg _)) + hLambda_nonneg) + hu + +theorem coarseCaccioppoliBoundaryNoteCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBoundaryNoteCoeff Q a s t C := by + have h := + coarseCaccioppoliBoundaryNoteRhs_nonneg Q a s t C (1 : ℝ) + hC hs ht hst (by norm_num) + simpa [coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] using h + +theorem coarseCaccioppoliBoundaryNoteCoeff_mono_C {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C₁ C₂ : ℝ) + (hC₁ : 0 ≤ C₁) (hC₁C₂ : C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliBoundaryNoteCoeff Q a s t C₁ ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t C₂ := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_nonneg : + 0 ≤ 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hnum_nonneg : 0 ≤ 4 * s := by positivity + have hdiv_nonneg : 0 ≤ 4 * s / coarseCaccioppoliSigma s t := + div_nonneg hnum_nonneg hσ_pos.le + linarith + have hbase_nonneg : 0 ≤ C₁ / coarseCaccioppoliSigma s t := + div_nonneg hC₁ hσ_pos.le + have hbase_le : + C₁ / coarseCaccioppoliSigma s t ≤ + C₂ / coarseCaccioppoliSigma s t := + div_le_div_of_nonneg_right hC₁C₂ hσ_pos.le + have hpow_le : + Real.rpow (C₁ / coarseCaccioppoliSigma s t) + (2 + 4 * s / coarseCaccioppoliSigma s t) ≤ + Real.rpow (C₂ / coarseCaccioppoliSigma s t) + (2 + 4 * s / coarseCaccioppoliSigma s t) := + Real.rpow_le_rpow hbase_nonneg hbase_le hexp_nonneg + have hs_factor_nonneg : + 0 ≤ Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) := + Real.rpow_nonneg hs.le _ + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have htheta_factor_nonneg : + 0 ≤ + Real.rpow (ThetaRatio Q s t a) + (s / coarseCaccioppoliSigma s t) := + Real.rpow_nonneg htheta_nonneg _ + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryNoteCoeff + exact + mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right hpow_le hs_factor_nonneg) + htheta_factor_nonneg) + hLambda_nonneg + +theorem coarseCaccioppoliBoundaryNoteRhs_mono_C {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C₁ C₂ uL2Sq : ℝ) + (hC₁ : 0 ≤ C₁) (hC₁C₂ : C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + coarseCaccioppoliBoundaryNoteRhs Q a s t C₁ uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t C₂ uL2Sq := by + rw [coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq, + coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] + exact mul_le_mul_of_nonneg_right + (coarseCaccioppoliBoundaryNoteCoeff_mono_C + Q a s t C₁ C₂ hC₁ hC₁C₂ hs ht hst) + hu + +private theorem const_mul_rpow_le_rpow_of_mul_le {M x y p : ℝ} + (hM : 1 ≤ M) (hx : 0 ≤ x) (hMxy : M * x ≤ y) (hp : 1 ≤ p) : + M * Real.rpow x p ≤ Real.rpow y p := by + have hM_nonneg : 0 ≤ M := le_trans (by norm_num) hM + have hMx_nonneg : 0 ≤ M * x := mul_nonneg hM_nonneg hx + have hM_le_Mp : M ≤ Real.rpow M p := by + simpa using Real.self_le_rpow_of_one_le hM hp + have hxpow_nonneg : 0 ≤ Real.rpow x p := Real.rpow_nonneg hx p + have hleft : M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := + mul_le_mul_of_nonneg_right hM_le_Mp hxpow_nonneg + have hmul_rpow : Real.rpow M p * Real.rpow x p = Real.rpow (M * x) p := + (Real.mul_rpow hM_nonneg hx).symm + calc + M * Real.rpow x p ≤ Real.rpow M p * Real.rpow x p := hleft + _ = Real.rpow (M * x) p := hmul_rpow + _ ≤ Real.rpow y p := + Real.rpow_le_rpow hMx_nonneg hMxy (by linarith) + +theorem coarseCaccioppoliBoundaryNoteCoeff_mul_const_le_of_mul_constant_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t M C₁ C₂ : ℝ) + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + M * coarseCaccioppoliBoundaryNoteCoeff Q a s t C₁ ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t C₂ := by + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let F : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hp_ge_one : 1 ≤ p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hbase_nonneg : 0 ≤ C₁ / σ := div_nonneg hC₁ hσ_pos.le + have hbase_le : M * (C₁ / σ) ≤ C₂ / σ := by + calc + M * (C₁ / σ) = (M * C₁) / σ := by ring + _ ≤ C₂ / σ := div_le_div_of_nonneg_right hMC₁C₂ hσ_pos.le + have hpow : + M * Real.rpow (C₁ / σ) p ≤ Real.rpow (C₂ / σ) p := + const_mul_rpow_le_rpow_of_mul_le hM hbase_nonneg hbase_le hp_ge_one + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hF_nonneg : 0 ≤ F := by + dsimp [F] + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg htheta_nonneg _)) + hLambda_nonneg + calc + M * coarseCaccioppoliBoundaryNoteCoeff Q a s t C₁ = + (M * Real.rpow (C₁ / σ) p) * F := by + dsimp [F, p, σ] + unfold coarseCaccioppoliBoundaryNoteCoeff + ring_nf + simp [LambdaSq] + _ ≤ Real.rpow (C₂ / σ) p * F := + mul_le_mul_of_nonneg_right hpow hF_nonneg + _ = coarseCaccioppoliBoundaryNoteCoeff Q a s t C₂ := by + dsimp [F, p, σ] + unfold coarseCaccioppoliBoundaryNoteCoeff + ring_nf + simp [LambdaSq] + +theorem coarseCaccioppoliBoundaryNoteRhs_mul_const_le_of_mul_constant_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t M C₁ C₂ uL2Sq : ℝ) + (hM : 1 ≤ M) (hC₁ : 0 ≤ C₁) (hMC₁C₂ : M * C₁ ≤ C₂) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) : + M * coarseCaccioppoliBoundaryNoteRhs Q a s t C₁ uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t C₂ uL2Sq := by + rw [coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq, + coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] + calc + M * (coarseCaccioppoliBoundaryNoteCoeff Q a s t C₁ * uL2Sq) = + (M * coarseCaccioppoliBoundaryNoteCoeff Q a s t C₁) * uL2Sq := by + ring + _ ≤ coarseCaccioppoliBoundaryNoteCoeff Q a s t C₂ * uL2Sq := + mul_le_mul_of_nonneg_right + (coarseCaccioppoliBoundaryNoteCoeff_mul_const_le_of_mul_constant_le + Q a s t M C₁ C₂ hM hC₁ hMC₁C₂ hs ht hst) + hu + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/StandardSplit.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/StandardSplit.lean new file mode 100644 index 0000000000..bd74026be6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Boundary/NoteRhs/StandardSplit.lean @@ -0,0 +1,673 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.NoteRhs.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration + +/-! # Standard Split -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +noncomputable def coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) : ℝ := + if LambdaSq Q s (.finite 1) a = 0 then + 0 + else + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + σ * Real.rpow (max (A / K) 0 + 1) p⁻¹ + +theorem + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_eq_zero_of_LambdaSq_eq_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hΛ : LambdaSq Q s (.finite 1) a = 0) : + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross = 0 := by + unfold coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + coarseCaccioppoliBoundaryRecursionCoeffSplit + simp [hΛ] + +theorem + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_nonneg_of_thetaRatio_pos + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 0 < ThetaRatio Q s t a) : + 0 ≤ coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross := by + unfold coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + by_cases hΛ : LambdaSq Q s (.finite 1) a = 0 + · rw [if_pos hΛ] + · rw [if_neg hΛ] + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + have hΛ_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hΛ_pos : 0 < LambdaSq Q s (.finite 1) a := + lt_of_le_of_ne' hΛ_nonneg hΛ + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hK_pos : 0 < K := by + have hs_factor_pos : + 0 < Real.rpow s (-2 * s / σ) := + Real.rpow_pos_of_pos hs _ + have hTheta_factor_pos : + 0 < Real.rpow (ThetaRatio Q s t a) (s / σ) := + Real.rpow_pos_of_pos hTheta _ + dsimp [K] + positivity + have hX_nonneg : 0 ≤ max (A / K) 0 + 1 := by + linarith [le_max_right (A / K) 0] + simpa [σ, p, K, A] using + mul_nonneg hσ_pos.le (Real.rpow_nonneg hX_nonneg p⁻¹) + +private theorem coarseCaccioppoliBoundaryNoteKernelFactor_ge_one {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 1 ≤ ThetaRatio Q s t a) : + 1 ≤ + Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) * + Real.rpow (ThetaRatio Q s t a) + (s / coarseCaccioppoliSigma s t) := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hs_le_one : s ≤ 1 := by + linarith + have hexp_s_nonpos : -2 * s / coarseCaccioppoliSigma s t ≤ 0 := by + have hnum_nonpos : -2 * s ≤ 0 := by nlinarith + exact div_nonpos_of_nonpos_of_nonneg hnum_nonpos hσ_pos.le + have hs_factor : + 1 ≤ Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) := + Real.one_le_rpow_of_pos_of_le_one_of_nonpos hs hs_le_one hexp_s_nonpos + have hexp_theta_nonneg : + 0 ≤ s / coarseCaccioppoliSigma s t := + div_nonneg hs.le hσ_pos.le + have htheta_factor : + 1 ≤ Real.rpow (ThetaRatio Q s t a) + (s / coarseCaccioppoliSigma s t) := + Real.one_le_rpow hTheta hexp_theta_nonneg + nlinarith [mul_le_mul hs_factor htheta_factor zero_le_one + (le_trans zero_le_one hs_factor)] + +private theorem coarseCaccioppoliBoundaryHeightFirstTerm_div_kernel_le {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 1 ≤ ThetaRatio Q s t a) : + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a) / + (Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) * + Real.rpow (ThetaRatio Q s t a) + (s / coarseCaccioppoliSigma s t) * + LambdaSq Q s (.finite 1) a) ≤ + (6561 : ℝ) * 6561 * C ^ (2 : ℕ) := by + let D : ℝ := + Real.rpow s (-2 * s / coarseCaccioppoliSigma s t) * + Real.rpow (ThetaRatio Q s t a) + (s / coarseCaccioppoliSigma s t) + let Λ : ℝ := LambdaSq Q s (.finite 1) a + have hD_ge_one : 1 ≤ D := by + dsimp [D] + exact coarseCaccioppoliBoundaryNoteKernelFactor_ge_one + Q a s t hs ht hst hTheta + have hD_pos : 0 < D := lt_of_lt_of_le zero_lt_one hD_ge_one + have hconst_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * C ^ (2 : ℕ) := by positivity + by_cases hΛ_zero : Λ = 0 + · simp [Λ, hΛ_zero, hconst_nonneg] + · have hΛ_nonneg : 0 ≤ Λ := by + dsimp [Λ] + exact multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hΛ_pos : 0 < Λ := lt_of_le_of_ne' hΛ_nonneg hΛ_zero + change + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * Λ) / (D * Λ) ≤ + (6561 : ℝ) * 6561 * C ^ (2 : ℕ) + calc + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * Λ) / (D * Λ) + = ((6561 : ℝ) * 6561 * C ^ (2 : ℕ)) / D := by + field_simp [hD_pos.ne', hΛ_pos.ne'] + _ ≤ (6561 : ℝ) * 6561 * C ^ (2 : ℕ) := by + rw [div_le_iff₀ hD_pos] + nlinarith + +private theorem coarseCaccioppoliBoundaryRecursionCoeffSplit_div_kernel_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t Calpha Ccross : ℝ) + (hCalpha : 0 < Calpha) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 0 < ThetaRatio Q s t a) + (hΛ : 0 < LambdaSq Q s (.finite 1) a) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + coarseCaccioppoliBoundaryRecursionCoeffSplit Q a s t Calpha Ccross / + (Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a) = + Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let Θ : ℝ := ThetaRatio Q s t a + let Λ : ℝ := LambdaSq Q s (.finite 1) a + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hs1_pos : 0 < 1 - s := by + linarith + have hden_pos : 0 < s * (1 - s) := mul_pos hs hs1_pos + have hTheta_half_nonneg : 0 ≤ Real.rpow Θ (1 / 2 : ℝ) := + Real.rpow_nonneg hTheta.le _ + have hCdiv_nonneg : 0 ≤ Calpha / (s * (1 - s)) := + div_nonneg hCalpha.le hden_pos.le + have hhalf_q : (1 / 2 : ℝ) * q = s / σ := by + dsimp [q, σ, coarseCaccioppoliPower] + field_simp [hσ_pos.ne'] + have hneg_q : -2 * s / σ = -q := by + dsimp [q, σ, coarseCaccioppoliPower] + ring + have htheta_pow : + Real.rpow (Real.rpow Θ (1 / 2 : ℝ)) q = + Real.rpow Θ (s / σ) := by + calc + Real.rpow (Real.rpow Θ (1 / 2 : ℝ)) q = + Real.rpow Θ ((1 / 2 : ℝ) * q) := + (Real.rpow_mul hTheta.le (1 / 2 : ℝ) q).symm + _ = Real.rpow Θ (s / σ) := by rw [hhalf_q] + have hCdiv_pow : + Real.rpow (Calpha / (s * (1 - s))) q = + Real.rpow Calpha q / Real.rpow (s * (1 - s)) q := + Real.div_rpow hCalpha.le hden_pos.le q + have hsden_pow : + Real.rpow (s * (1 - s)) q = + Real.rpow s q * Real.rpow (1 - s) q := + Real.mul_rpow hs.le hs1_pos.le + have hspow_neg : + Real.rpow s (-2 * s / σ) = (Real.rpow s q)⁻¹ := by + rw [hneg_q] + exact Real.rpow_neg hs.le q + have hbase_pow : + Real.rpow (Calpha / (s * (1 - s)) * Real.rpow Θ (1 / 2 : ℝ)) q = + Real.rpow (Calpha / (s * (1 - s))) q * + Real.rpow (Real.rpow Θ (1 / 2 : ℝ)) q := + Real.mul_rpow hCdiv_nonneg hTheta_half_nonneg + have hs1pow_neg : + Real.rpow (1 - s) (-q) = (Real.rpow (1 - s) q)⁻¹ := + Real.rpow_neg hs1_pos.le q + change + (Ccross * + Real.rpow (Calpha / (s * (1 - s)) * Real.rpow Θ (1 / 2 : ℝ)) q * Λ) / + (Real.rpow s (-2 * s / σ) * Real.rpow Θ (s / σ) * Λ) = + Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + rw [hbase_pow, hCdiv_pow, + hsden_pow, htheta_pow, hspow_neg, hs1pow_neg] + have hThetaPow_div_ne : Real.rpow Θ (s / σ) ≠ 0 := + (Real.rpow_pos_of_pos hTheta (s / σ)).ne' + have hThetaPow_mul_ne : Real.rpow Θ (s * σ⁻¹) ≠ 0 := + (Real.rpow_pos_of_pos hTheta (s * σ⁻¹)).ne' + have hΛ_ne : Λ ≠ 0 := by + dsimp [Λ] + exact hΛ.ne' + field_simp [(Real.rpow_pos_of_pos hs q).ne', + (Real.rpow_pos_of_pos hs1_pos q).ne', + hThetaPow_div_ne, hThetaPow_mul_ne, hΛ_ne] + +private theorem coarseCaccioppoliBoundaryHeightSecondTermSplit_div_kernel_le {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t Calpha Ccross : ℝ) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 1 ≤ ThetaRatio Q s t a) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let L : ℝ := (9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q + have hTheta_pos : 0 < ThetaRatio Q s t a := lt_of_lt_of_le zero_lt_one hTheta + have hs1_pos : 0 < 1 - s := by linarith + have hRhs_nonneg : + 0 ≤ L * Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) := by + dsimp [L] + positivity + change + L * Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K ≤ + L * Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + by_cases hCcross_zero : Ccross = 0 + · simp [coarseCaccioppoliBoundaryRecursionCoeffSplit, hCcross_zero] + · by_cases hΛ_zero : LambdaSq Q s (.finite 1) a = 0 + · have hleft_zero : + L * Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K = 0 := by + simp [K, L, coarseCaccioppoliBoundaryRecursionCoeffSplit, hΛ_zero] + rw [hleft_zero] + exact hRhs_nonneg + · have hΛ_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hΛ_pos : 0 < LambdaSq Q s (.finite 1) a := + lt_of_le_of_ne' hΛ_nonneg hΛ_zero + have hK_pos : 0 < K := by + dsimp [K] + positivity + have hrec : + coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K = + Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) := by + simpa [σ, q, K] using + coarseCaccioppoliBoundaryRecursionCoeffSplit_div_kernel_eq + Q a s t Calpha Ccross hCalpha hs ht hst hTheta_pos hΛ_pos + have hleft_eq : + L * Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K = + L * Ccross * Ccross * Real.rpow Calpha q * + Real.rpow (1 - s) (-q) := by + calc + L * Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K + = L * Ccross * + (coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross / K) := by + field_simp [hK_pos.ne'] + _ = L * Ccross * + (Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q)) := by + rw [hrec] + _ = L * Ccross * Ccross * Real.rpow Calpha q * + Real.rpow (1 - s) (-q) := by + ring + rw [hleft_eq] + +theorem coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_div_kernel_le_explicit + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 1 ≤ ThetaRatio Q s t a) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross / K ≤ + R * (B₁ + B₂) := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let Λ : ℝ := LambdaSq Q s (.finite 1) a + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + Λ + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let L : ℝ := (9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q + let first : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * Λ + let second : ℝ := + L * Ccross * coarseCaccioppoliBoundaryRecursionCoeffSplit + Q a s t Calpha Ccross + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + L * Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + have hs1_pos : 0 < 1 - s := by linarith + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact + coarseCaccioppoliStandardRadiusIterationConst_nonneg + (coarseCaccioppoli_beta_nonneg hs hst) + have hB_nonneg : 0 ≤ R * (B₁ + B₂) := by + refine mul_nonneg hR_nonneg (add_nonneg ?_ ?_) + · dsimp [B₁] + positivity + · dsimp [B₂, L] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by positivity : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _)) + hCcross) + hCcross) + (Real.rpow_nonneg hCalpha.le _)) + (Real.rpow_nonneg hs1_pos.le _) + unfold coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + coarseCaccioppoliBoundaryExplicitHeightRecursionCoeffSplit + change (R * (first + second)) / K ≤ R * (B₁ + B₂) + by_cases hΛ_zero : Λ = 0 + · have hleft_zero : (R * (first + second)) / K = 0 := by + simp [K, first, second, Λ, coarseCaccioppoliBoundaryRecursionCoeffSplit, hΛ_zero] + rw [hleft_zero] + exact hB_nonneg + · have hΛ_nonneg : 0 ≤ Λ := by + dsimp [Λ] + exact multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hΛ_pos : 0 < Λ := lt_of_le_of_ne' hΛ_nonneg hΛ_zero + have hTheta_pos : 0 < ThetaRatio Q s t a := lt_of_lt_of_le zero_lt_one hTheta + have hK_pos : 0 < K := by + dsimp [K] + positivity + have hfirst : + first / K ≤ B₁ := by + simpa [σ, Λ, K, first, B₁] using + coarseCaccioppoliBoundaryHeightFirstTerm_div_kernel_le + Q a s t Ccross hs ht hst hTheta + have hsecond : + second / K ≤ B₂ := by + simpa [σ, q, Λ, K, L, second, B₂] using + coarseCaccioppoliBoundaryHeightSecondTermSplit_div_kernel_le + Q a s t Calpha Ccross hCalpha hCcross hs ht hst hTheta + calc + (R * (first + second)) / K + = R * (first / K + second / K) := by + field_simp [hK_pos.ne'] + _ ≤ R * (B₁ + B₂) := + mul_le_mul_of_nonneg_left (add_le_add hfirst hsecond) hR_nonneg + +/-- +Scalar extraction lemma for the exposed explicit note constant. + +Once the height coefficient divided by the note kernel is bounded by a scalar +`B`, the explicit note constant is bounded by the displayed note-scale root. +This is the coefficient-cancellation step needed before choosing a uniform +dimension-only public constant. +-/ +theorem coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_le_of_heightCoeff_div_kernel_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross B Ctarget : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hB : 0 ≤ B) + (hdiv : + let σ : ℝ := coarseCaccioppoliSigma s t + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + A / K ≤ B) + (hCtarget : + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + σ * Real.rpow (B + 1) p⁻¹ ≤ Ctarget) : + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross ≤ Ctarget := by + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hp_pos : 0 < p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hB1_nonneg : 0 ≤ B + 1 := by linarith + have hCtarget_nonneg : 0 ≤ Ctarget := by + exact + (mul_nonneg hσ_pos.le (Real.rpow_nonneg hB1_nonneg p⁻¹)).trans + (by simpa [σ, p] using hCtarget) + unfold coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + by_cases hΛ : LambdaSq Q s (.finite 1) a = 0 + · rw [if_pos hΛ] + exact hCtarget_nonneg + · rw [if_neg hΛ] + have hdiv' : A / K ≤ B := by + simpa [σ, K, A] using hdiv + have hmax_le : max (A / K) 0 ≤ B := max_le hdiv' hB + have hX_le : max (A / K) 0 + 1 ≤ B + 1 := by + linarith + have hX_nonneg : 0 ≤ max (A / K) 0 + 1 := by + linarith [le_max_right (A / K) 0] + have hrpow_le : + Real.rpow (max (A / K) 0 + 1) p⁻¹ ≤ Real.rpow (B + 1) p⁻¹ := + Real.rpow_le_rpow hX_nonneg hX_le hp_inv_nonneg + exact + (mul_le_mul_of_nonneg_left hrpow_le hσ_pos.le).trans + (by simpa [σ, p, K, A] using hCtarget) + +theorem coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_le_explicitBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 1 ≤ ThetaRatio Q s t a) : + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let q : ℝ := coarseCaccioppoliPower s t + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + let B : ℝ := R * (B₁ + B₂) + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross ≤ + σ * Real.rpow (B + 1) p⁻¹ := by + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let q : ℝ := coarseCaccioppoliPower s t + let R : ℝ := coarseCaccioppoliStandardRadiusIterationConst (coarseCaccioppoliBeta s t) + let B₁ : ℝ := (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) + let B₂ : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) q * Real.rpow (81 : ℝ) q) * + Ccross * Ccross * Real.rpow Calpha q * Real.rpow (1 - s) (-q) + let B : ℝ := R * (B₁ + B₂) + have hs1_pos : 0 < 1 - s := by linarith + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact + coarseCaccioppoliStandardRadiusIterationConst_nonneg + (coarseCaccioppoli_beta_nonneg hs hst) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + refine mul_nonneg hR_nonneg (add_nonneg ?_ ?_) + · dsimp [B₁] + positivity + · dsimp [B₂] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by positivity : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _)) + hCcross) + hCcross) + (Real.rpow_nonneg hCalpha.le _)) + (Real.rpow_nonneg hs1_pos.le _) + have hdiv : + let σ : ℝ := coarseCaccioppoliSigma s t + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + A / K ≤ B := by + simpa [σ, q, R, B₁, B₂, B] using + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_div_kernel_le_explicit + Q a s t Calpha Ccross hCalpha hCcross hs ht hst hTheta + have htarget : + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + σ * Real.rpow (B + 1) p⁻¹ ≤ σ * Real.rpow (B + 1) p⁻¹ := by + simp + simpa [σ, p, q, R, B₁, B₂, B] using + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_le_of_heightCoeff_div_kernel_le + Q a s t Calpha Ccross B (σ * Real.rpow (B + 1) p⁻¹) + hs ht hst hB_nonneg hdiv htarget + +theorem + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_le_noteCoeff_standardExplicitNoteConstantSplit + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hTheta : 0 < ThetaRatio Q s t a) : + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross) := by + have hΛ_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + by_cases hΛ : LambdaSq Q s (.finite 1) a = 0 + · rw [if_pos hΛ] + rw [coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_eq_zero_of_LambdaSq_eq_zero + Q a s t Calpha Ccross hΛ] + exact coarseCaccioppoliBoundaryNoteCoeff_nonneg Q a s t 0 + (by norm_num) hs ht hst + · rw [if_neg hΛ] + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + let K : ℝ := + Real.rpow s (-2 * s / σ) * + Real.rpow (ThetaRatio Q s t a) (s / σ) * + LambdaSq Q s (.finite 1) a + let A : ℝ := + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross + have hΛ_pos : 0 < LambdaSq Q s (.finite 1) a := + lt_of_le_of_ne' hΛ_nonneg hΛ + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hp_pos : 0 < p := by + have hdiv_nonneg : 0 ≤ 4 * s / σ := by positivity + dsimp [p] + linarith + have hK_pos : 0 < K := by + have hs_factor_pos : + 0 < Real.rpow s (-2 * s / σ) := + Real.rpow_pos_of_pos hs _ + have hTheta_factor_pos : + 0 < Real.rpow (ThetaRatio Q s t a) (s / σ) := + Real.rpow_pos_of_pos hTheta _ + dsimp [K] + positivity + let X : ℝ := max (A / K) 0 + 1 + let Cnote : ℝ := σ * Real.rpow X p⁻¹ + have hA_div_le_X : A / K ≤ X := by + dsimp [X] + linarith [le_max_left (A / K) 0] + have hA_le_XK : A ≤ X * K := by + have hmul := mul_le_mul_of_nonneg_right hA_div_le_X hK_pos.le + have hdiv_mul : A / K * K = A := by + field_simp [hK_pos.ne'] + simpa [hdiv_mul] using hmul + have hX_pos : 0 < X := by + dsimp [X] + linarith [le_max_right (A / K) 0] + have hCnote_div : Cnote / σ = Real.rpow X p⁻¹ := by + dsimp [Cnote] + field_simp [hσ_pos.ne'] + have hpow : Real.rpow (Cnote / σ) p = X := by + rw [hCnote_div] + simpa using (Real.rpow_inv_rpow hX_pos.le hp_pos.ne') + have hnote : + Real.rpow (Cnote / σ) p * K = + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote := by + dsimp [K, p, σ] + unfold coarseCaccioppoliBoundaryNoteCoeff + simp [LambdaSq] + ring_nf + have hCnote_eq : + σ * Real.rpow (max (A / K) 0 + 1) p⁻¹ = Cnote := by + rfl + have hmain : + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote := by + calc + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross = A := rfl + _ ≤ X * K := hA_le_XK + _ = Real.rpow (Cnote / σ) p * K := by rw [hpow] + _ = coarseCaccioppoliBoundaryNoteCoeff Q a s t Cnote := hnote + change + coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit + Q a s t Calpha Ccross ≤ + coarseCaccioppoliBoundaryNoteCoeff Q a s t + (σ * Real.rpow (max (A / K) 0 + 1) p⁻¹) + rw [hCnote_eq] + exact hmain + +/-- +Standard split coefficient-level note-RHS comparison after the non-degenerate +multiscale factor `ThetaRatio` has been identified as positive. +-/ +theorem + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit_le_noteRhs_standardExplicitNoteConstantSplit + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) (hTheta : 0 < ThetaRatio Q s t a) : + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit + Q a s t Calpha Ccross uL2Sq ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit + Q a s t Calpha Ccross) + uL2Sq := by + rw [ + coarseCaccioppoliBoundaryStandardExplicitHeightBoundSplit_eq_coeff_mul_uL2Sq, + coarseCaccioppoliBoundaryNoteRhs_eq_coeff_mul_uL2Sq] + exact mul_le_mul_of_nonneg_right + (coarseCaccioppoliBoundaryStandardExplicitHeightCoeffSplit_le_noteCoeff_standardExplicitNoteConstantSplit + Q a s t Calpha Ccross hs ht hst hTheta) + hu + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm.lean new file mode 100644 index 0000000000..e9c415384a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Localized + +/-! # Cross Term -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/ExplicitHeight.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/ExplicitHeight.lean new file mode 100644 index 0000000000..62e575dbe3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/ExplicitHeight.lean @@ -0,0 +1,489 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.Scalar + +/-! # Explicit Height -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coarse Caccioppoli cross term: explicit height +-/ + +noncomputable section + +open scoped BigOperators + +/-- The interior note-specific cross-term bound currently follows from the same +stronger triadic-scale estimate as the boundary version. -/ +theorem coarseCaccioppoli_interior_noteCrossTermBound_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h := by + exact coarseCaccioppoli_boundary_noteCrossTermBound_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu hscale + +/-- The note's actual explicit height choice `h = max {k + 4, ceil(...)}` gives +an honest pre-Besov cross-term square bound with a split recursive prefactor: +one branch comes from `k + 4`, the other from the logarithmic ceiling. -/ +theorem coarseCaccioppoli_boundary_noteCrossTermBound_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let k0 : ℕ := k ρ₁ ρ₂ + let h0 : ℝ := coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ + let p : ℝ := coarseCaccioppoliPower s t + let M : ℝ := C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + have hs1 : s < 1 := by linarith + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hkchoice : CoarseCaccioppoliTriadicGapScaleChoice k0 ρ₁ ρ₂ := + hscale hρ₁ hlt hρ₂ + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hgap_pos : 0 < coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + exact inv_pos.mpr (sub_pos.mpr hlt) + have hgap_ge_one : 1 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hthree_halves : (3 / 2 : ℝ) ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_ge_three_halves hρ₁ hlt hρ₂ + linarith + have hcross_sq : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂) ^ (2 : ℕ) = + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using + (coarseCaccioppoliBoundaryCrossCoeffOfHeight_sq + (Q := Q) (a := a) (s := s) (C := C) (uL2Sq := uL2Sq) + (h := coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) hs.le hu) + have hprefix_nonneg : + 0 ≤ C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + refine mul_nonneg (mul_nonneg ?_ hLambda_nonneg) hu + exact mul_nonneg hC (sq_nonneg _) + have hgap_sq : + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhs + exact mul_nonneg + (mul_nonneg (mul_nonneg hC (Real.rpow_nonneg hM_nonneg _)) hLambda_nonneg) + hu + have hfirst_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * C ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a * uL2Sq := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg C)) hLambda_nonneg) + hu + have hsecond_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + C * coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + have hcoeff_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) := by + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + exact mul_nonneg (mul_nonneg hcoeff_nonneg hC) hrec_nonneg + by_cases hbranch : + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) ≤ (k0 : ℝ) + 4 + · have hh0 : + h0 = (k0 : ℝ) + 4 := by + dsimp [h0, k0, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryExplicitHeightAtScale] + rw [max_eq_left hbranch] + have hscalar : + C * Real.rpow (3 : ℝ) (2 * s * h0) ≤ + (6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + rw [hh0] + exact coarseCaccioppoli_boundary_explicitHeight_leftBranch_scalar + hC hs hs1 hkchoice hlt + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) (2 * s)).symm + have hgap_beta : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) ≤ + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact Real.rpow_le_rpow_of_exponent_le hgap_ge_one + (coarseCaccioppoli_beta_ge_two_add_two_mul_s hs ht hst) + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂) ^ (2 : ℕ) + = (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using hcross_sq + _ ≤ (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + ring + _ = ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + rw [hgap_sq, hgap_exp] + _ ≤ ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact mul_le_mul_of_nonneg_left hgap_beta hfirst_nonneg + _ = ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_right hsecond_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + · have hbranch' : + (k0 : ℝ) + 4 < + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) := by + exact lt_of_not_ge hbranch + have hh0 : + h0 = + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) := by + dsimp [h0, k0, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryExplicitHeightAtScale] + rw [max_eq_right hbranch'.le] + have hscalar : + C * Real.rpow (3 : ℝ) (2 * s * h0) ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * C * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + rw [hh0] + simpa [k0, p, M] using + coarseCaccioppoli_boundary_explicitHeight_rightBranch_scalar + Q a hC hs ht hst hkchoice hlt hbranch' + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) p).symm + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) ρ₁ ρ₂) ^ (2 : ℕ) + = (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using hcross_sq + _ ≤ (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * C * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * C * + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + unfold coarseCaccioppoliBoundaryRecursionRhs + ring + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * C * + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + rw [hgap_sq, hgap_exp] + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * C * + coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_left hfirst_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + +theorem coarseCaccioppoli_boundary_noteCrossTermBoundSplit_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (k : ℝ → ℝ → ℕ) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let k0 : ℕ := k ρ₁ ρ₂ + let h0 : ℝ := + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t Calpha k ρ₁ ρ₂ + let p : ℝ := coarseCaccioppoliPower s t + let M : ℝ := + Calpha / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + have hs1 : s < 1 := by linarith + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hCalpha.le hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hkchoice : CoarseCaccioppoliTriadicGapScaleChoice k0 ρ₁ ρ₂ := + hscale hρ₁ hlt hρ₂ + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hgap_pos : 0 < coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + exact inv_pos.mpr (sub_pos.mpr hlt) + have hgap_ge_one : 1 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hthree_halves : (3 / 2 : ℝ) ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_ge_three_halves hρ₁ hlt hρ₂ + linarith + have hcross_sq : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂) ^ (2 : ℕ) = + (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Ccross * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using + (coarseCaccioppoliBoundaryCrossCoeffOfHeight_sq + (Q := Q) (a := a) (s := s) (C := Ccross) (uL2Sq := uL2Sq) + (h := coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) hs.le hu) + have hprefix_nonneg : + 0 ≤ Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + refine mul_nonneg (mul_nonneg ?_ hLambda_nonneg) hu + exact mul_nonneg hCcross (sq_nonneg _) + have hgap_sq : + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhsSplit + exact mul_nonneg + (mul_nonneg (mul_nonneg hCcross (Real.rpow_nonneg hM_nonneg _)) + hLambda_nonneg) + hu + have hfirst_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg Ccross)) hLambda_nonneg) + hu + have hsecond_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + have hcoeff_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) := by + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + exact mul_nonneg (mul_nonneg hcoeff_nonneg hCcross) hrec_nonneg + by_cases hbranch : + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) ≤ + (k0 : ℝ) + 4 + · have hh0 : + h0 = (k0 : ℝ) + 4 := by + dsimp [h0, k0, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryExplicitHeightAtScale] + rw [max_eq_left hbranch] + have hscalar : + Ccross * Real.rpow (3 : ℝ) (2 * s * h0) ≤ + (6561 : ℝ) * 6561 * Ccross * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + rw [hh0] + exact coarseCaccioppoli_boundary_explicitHeight_leftBranch_scalar + hCcross hs hs1 hkchoice hlt + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) (2 * s)).symm + have hgap_beta : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) ≤ + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact Real.rpow_le_rpow_of_exponent_le hgap_ge_one + (coarseCaccioppoli_beta_ge_two_add_two_mul_s hs ht hst) + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂) ^ (2 : ℕ) + = (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Ccross * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using hcross_sq + _ ≤ (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((6561 : ℝ) * 6561 * Ccross * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + ring + _ = ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + rw [hgap_sq, hgap_exp] + _ ≤ ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact mul_le_mul_of_nonneg_left hgap_beta hfirst_nonneg + _ = ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_right hsecond_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + · have hbranch' : + (k0 : ℝ) + 4 < + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) := by + exact lt_of_not_ge hbranch + have hh0 : + h0 = + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k0) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ) := by + dsimp [h0, k0, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryExplicitHeightAtScale] + rw [max_eq_right hbranch'.le] + have hscalar : + Ccross * Real.rpow (3 : ℝ) (2 * s * h0) ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + rw [hh0] + simpa [k0, p, M] using + coarseCaccioppoli_boundary_explicitHeight_rightBranch_scalar_with_front + Q a hCalpha hCcross hs ht hst hkchoice hlt hbranch' + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) p).symm + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k) ρ₁ ρ₂) ^ (2 : ℕ) + = (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Ccross * Real.rpow (3 : ℝ) (2 * s * h0)) := by + simpa [h0] using hcross_sq + _ ≤ (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + unfold coarseCaccioppoliBoundaryRecursionRhsSplit + ring + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + rw [hgap_sq, hgap_exp] + _ = (((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_left hfirst_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Localized.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Localized.lean new file mode 100644 index 0000000000..eaffcfed36 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Localized.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm.ExplicitHeight + +/-! # Localized -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coarse Caccioppoli cross term: localized explicit height +-/ + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoli_boundary_noteCrossTermBound_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let hOld : ℝ := coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ + let hNew : ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ + by_cases hbranch : (4 : ℝ) / s ≤ hOld + · have hNew_eq : hNew = hOld := by + have hbranch' : + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C (k ρ₁ ρ₂) := by + simpa [hOld, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using hbranch + dsimp [hNew, hOld, coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale, + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] + rw [max_eq_left hbranch'] + have hheight_eval : + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ = + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ := by + simpa [hNew, hOld] using hNew_eq + simpa [coarseCaccioppoliBoundaryCrossCoeffOfHeight, hheight_eval] using + (coarseCaccioppoli_boundary_noteCrossTermBound_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale hρ₁ hlt hρ₂) + · have hOld_lt : hOld < (4 : ℝ) / s := lt_of_not_ge hbranch + have hNew_eq : hNew = (4 : ℝ) / s := by + have hOld_lt' : + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C (k ρ₁ ρ₂) < + (4 : ℝ) / s := by + simpa [hOld, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using hOld_lt + dsimp [hNew, hOld, coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale, + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] + rw [max_eq_right hOld_lt'.le] + let p : ℝ := coarseCaccioppoliPower s t + let M : ℝ := C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hgap_pos : 0 < coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + exact inv_pos.mpr (sub_pos.mpr hlt) + have hgap_ge_one : 1 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hthree_halves : (3 / 2 : ℝ) ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_ge_three_halves hρ₁ hlt hρ₂ + linarith + have h2s_nonneg : 0 ≤ 2 * s := by positivity + have hgap_pow_ge_one : + 1 ≤ Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + simpa using + Real.rpow_le_rpow (by norm_num : 0 ≤ (1 : ℝ)) hgap_ge_one h2s_nonneg + have hgap_sq : + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) (2 * s)).symm + have hgap_beta : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) ≤ + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact Real.rpow_le_rpow_of_exponent_le hgap_ge_one + (coarseCaccioppoli_beta_ge_two_add_two_mul_s hs ht hst) + have hprefix_nonneg : + 0 ≤ C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + refine mul_nonneg (mul_nonneg ?_ hLambda_nonneg) hu + exact mul_nonneg hC (sq_nonneg _) + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_one_sub_nonneg hs.le (by linarith) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhs + exact mul_nonneg + (mul_nonneg (mul_nonneg hC (Real.rpow_nonneg hM_nonneg _)) hLambda_nonneg) + hu + have hfirst_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * C ^ (2 : ℕ) * LambdaSq Q s (.finite 1) a * + uL2Sq := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg C)) hLambda_nonneg) + hu + have hsecond_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + C * coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq := by + have hcoeff_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) := by + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + exact mul_nonneg (mul_nonneg hcoeff_nonneg hC) hrec_nonneg + have hcross_sq : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + ρ₁ ρ₂) ^ (2 : ℕ) = + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * hNew)) := by + simpa [hNew] using + (coarseCaccioppoliBoundaryCrossCoeffOfHeight_sq + (Q := Q) (a := a) (s := s) (C := C) (uL2Sq := uL2Sq) + (h := coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) hs.le hu) + have hpow_height : + Real.rpow (3 : ℝ) (2 * s * hNew) = (6561 : ℝ) := by + rw [hNew_eq] + calc + Real.rpow (3 : ℝ) (2 * s * (4 / s)) + = Real.rpow (3 : ℝ) (8 : ℝ) := by + congr 1 + field_simp [hs.ne'] + ring + _ = (6561 : ℝ) := by + norm_num [Real.rpow_natCast] + have hscalar : + C * Real.rpow (3 : ℝ) (2 * s * hNew) ≤ + (6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + rw [hpow_height] + nlinarith + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + ρ₁ ρ₂) ^ (2 : ℕ) + = + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * hNew)) := hcross_sq + _ ≤ + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + ring + _ = + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + rw [hgap_sq, hgap_exp] + _ ≤ + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact mul_le_mul_of_nonneg_left hgap_beta hfirst_nonneg + _ = + ((6561 : ℝ) * 6561 * C ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhs + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_right hsecond_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + +theorem coarseCaccioppoli_boundary_noteCrossTermBoundSplit_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (k : ℝ → ℝ → ℕ) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + ρ₁ ρ₂) ^ (2 : ℕ) ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let hOld : ℝ := + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t Calpha k ρ₁ ρ₂ + let hNew : ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t Calpha k + ρ₁ ρ₂ + by_cases hbranch : (4 : ℝ) / s ≤ hOld + · have hNew_eq : hNew = hOld := by + have hbranch' : + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryExplicitHeightAtScale + Q a s t Calpha (k ρ₁ ρ₂) := by + simpa [hOld, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using hbranch + dsimp [hNew, hOld, coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale, + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] + rw [max_eq_left hbranch'] + have hheight_eval : + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k ρ₁ ρ₂ = + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice + Q a s t Calpha k ρ₁ ρ₂ := by + simpa [hNew, hOld] using hNew_eq + simpa [coarseCaccioppoliBoundaryCrossCoeffOfHeight, hheight_eval] using + (coarseCaccioppoli_boundary_noteCrossTermBoundSplit_of_explicitHeightOfScaleChoice + Q a s t Calpha Ccross uL2Sq k hCalpha hCcross hs ht hst hu hscale + hρ₁ hlt hρ₂) + · have hOld_lt : hOld < (4 : ℝ) / s := lt_of_not_ge hbranch + have hNew_eq : hNew = (4 : ℝ) / s := by + have hOld_lt' : + coarseCaccioppoliBoundaryExplicitHeightAtScale + Q a s t Calpha (k ρ₁ ρ₂) < + (4 : ℝ) / s := by + simpa [hOld, coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using hOld_lt + dsimp [hNew, hOld, coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale, + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] + rw [max_eq_right hOld_lt'.le] + let p : ℝ := coarseCaccioppoliPower s t + let M : ℝ := + Calpha / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hgap_pos : 0 < coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + exact inv_pos.mpr (sub_pos.mpr hlt) + have hgap_ge_one : 1 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hthree_halves : (3 / 2 : ℝ) ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_ge_three_halves hρ₁ hlt hρ₂ + linarith + have h2s_nonneg : 0 ≤ 2 * s := by positivity + have hgap_pow_ge_one : + 1 ≤ Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + simpa using + Real.rpow_le_rpow (by norm_num : 0 ≤ (1 : ℝ)) hgap_ge_one h2s_nonneg + have hgap_sq : + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + have hgap_exp : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 : ℝ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) = + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + simpa using + (Real.rpow_add hgap_pos (2 : ℝ) (2 * s)).symm + have hgap_beta : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) ≤ + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact Real.rpow_le_rpow_of_exponent_le hgap_ge_one + (coarseCaccioppoli_beta_ge_two_add_two_mul_s hs ht hst) + have hprefix_nonneg : + 0 ≤ Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + refine mul_nonneg (mul_nonneg ?_ hLambda_nonneg) hu + exact mul_nonneg hCcross (sq_nonneg _) + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_one_sub_nonneg hs.le (by linarith) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hCalpha.le hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hrec_nonneg : + 0 ≤ coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + unfold coarseCaccioppoliBoundaryRecursionRhsSplit + exact mul_nonneg + (mul_nonneg (mul_nonneg hCcross (Real.rpow_nonneg hM_nonneg _)) + hLambda_nonneg) + hu + have hfirst_nonneg : + 0 ≤ (6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) (sq_nonneg Ccross)) hLambda_nonneg) + hu + have hsecond_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) * + Ccross * + coarseCaccioppoliBoundaryRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq := by + have hcoeff_nonneg : + 0 ≤ ((9 : ℝ) * Real.rpow (4 : ℝ) p * Real.rpow (81 : ℝ) p) := by + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (9 : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (4 : ℝ)) _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (81 : ℝ)) _) + exact mul_nonneg (mul_nonneg hcoeff_nonneg hCcross) hrec_nonneg + have hcross_sq : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + ρ₁ ρ₂) ^ (2 : ℕ) = + (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Ccross * Real.rpow (3 : ℝ) (2 * s * hNew)) := by + simpa [hNew] using + (coarseCaccioppoliBoundaryCrossCoeffOfHeight_sq + (Q := Q) (a := a) (s := s) (C := Ccross) (uL2Sq := uL2Sq) + (h := coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) hs.le hu) + have hpow_height : + Real.rpow (3 : ℝ) (2 * s * hNew) = (6561 : ℝ) := by + rw [hNew_eq] + calc + Real.rpow (3 : ℝ) (2 * s * (4 / s)) + = Real.rpow (3 : ℝ) (8 : ℝ) := by + congr 1 + field_simp [hs.ne'] + ring + _ = (6561 : ℝ) := by + norm_num [Real.rpow_natCast] + have hscalar : + Ccross * Real.rpow (3 : ℝ) (2 * s * hNew) ≤ + (6561 : ℝ) * 6561 * Ccross * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + rw [hpow_height] + nlinarith + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ccross uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice + Q a s t Calpha k) + ρ₁ ρ₂) ^ (2 : ℕ) + = + (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Ccross * Real.rpow (3 : ℝ) (2 * s * hNew)) := hcross_sq + _ ≤ + (Ccross * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((6561 : ℝ) * 6561 * Ccross * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + exact mul_le_mul_of_nonneg_left hscalar hprefix_nonneg + _ = + ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + ((coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) := by + ring + _ = + ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 + 2 * s) := by + rw [hgap_sq, hgap_exp] + _ ≤ + ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliBeta s t) := by + exact mul_le_mul_of_nonneg_left hgap_beta hfirst_nonneg + _ = + ((6561 : ℝ) * 6561 * Ccross ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + rw [coarseCaccioppoli_gapInv_rpow_eq] + _ ≤ + coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + Q a s t Calpha Ccross uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + unfold coarseCaccioppoliBoundaryExplicitHeightRecursionRhsSplit + exact mul_le_mul_of_nonneg_right + (le_add_of_nonneg_right hsecond_nonneg) + (Real.rpow_nonneg (sub_nonneg.mpr hlt.le) _) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Scalar.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Scalar.lean new file mode 100644 index 0000000000..5525a1cf7b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CrossTerm/Scalar.lean @@ -0,0 +1,576 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import Mathlib.Analysis.SpecialFunctions.Log.Base + +/-! # Scalar -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coarse Caccioppoli cross term: scalar bounds +-/ + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoli_gapInv_rpow_eq {ρ₁ ρ₂ q : ℝ} : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) q = + Real.rpow (ρ₂ - ρ₁) (-q) := by + rw [coarseCaccioppoliGapInv_eq_inv] + symm + simpa using (Real.rpow_neg_eq_inv_rpow (ρ₂ - ρ₁) q) + +theorem coarseCaccioppoliBoundaryCrossCoeffOfHeight_sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) + {ρ₁ ρ₂ : ℝ} (hs : 0 ≤ s) (hu : 0 ≤ uL2Sq) : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ (2 : ℕ) = + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂)) := by + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs + have h3sq : + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) := by + calc + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) = + Real.rpow (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) ((s * h ρ₁ ρ₂) * 2) := by + simpa using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (s * h ρ₁ ρ₂) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) := by ring_nf + have hLambda_sq : + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ (2 : ℕ) = + LambdaSq Q s (.finite 1) a := by + exact sq_rpow_half_eq_self_of_nonneg hLambda_nonneg + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + calc + (C * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq) ^ (2 : ℕ) + = + C ^ (2 : ℕ) * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ (2 : ℕ) * + (Real.sqrt uL2Sq) ^ (2 : ℕ) := by + ring + _ = C ^ (2 : ℕ) * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) * + LambdaSq Q s (.finite 1) a * + uL2Sq := by + rw [h3sq, hLambda_sq, Real.sq_sqrt hu] + _ = (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂)) := by + ring + +theorem coarseCaccioppoli_boundary_explicitHeight_leftBranch_scalar + {ρ₁ ρ₂ s C : ℝ} {k : ℕ} + (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) (hlt : ρ₁ < ρ₂) : + C * Real.rpow (3 : ℝ) (2 * s * ((k : ℝ) + 4)) ≤ + (6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + have h2s_nonneg : 0 ≤ 2 * s := by positivity + have hpow_base_le : (3 : ℝ) ^ k ≤ 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice hchoice hlt + have hk_rpow : + Real.rpow (3 : ℝ) (2 * s * (k : ℝ)) = + Real.rpow ((3 : ℝ) ^ k) (2 * s) := by + calc + Real.rpow (3 : ℝ) (2 * s * (k : ℝ)) + = Real.rpow (3 : ℝ) ((k : ℝ) * (2 * s)) := by congr 1; ring + _ = Real.rpow ((3 : ℝ) ^ k) (2 * s) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (k : ℝ) (2 * s)) + have hk_le : + Real.rpow (3 : ℝ) (2 * s * (k : ℝ)) ≤ + Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + rw [hk_rpow] + exact Real.rpow_le_rpow (by positivity) hpow_base_le h2s_nonneg + have h81_le : + Real.rpow (81 : ℝ) (2 * s) ≤ (6561 : ℝ) := by + have h2s_le : 2 * s ≤ (2 : ℝ) := by + simpa using mul_le_mul_of_nonneg_left hs1.le (by norm_num : 0 ≤ (2 : ℝ)) + have htmp : + Real.rpow (81 : ℝ) (2 * s) ≤ Real.rpow (81 : ℝ) (2 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (81 : ℝ)) h2s_le + norm_num [Real.rpow_natCast] at htmp ⊢ + exact htmp + have h3_le : + Real.rpow (3 : ℝ) (8 * s) ≤ (6561 : ℝ) := by + have h8s_le : 8 * s ≤ (8 : ℝ) := by + simpa using mul_le_mul_of_nonneg_left hs1.le (by norm_num : 0 ≤ (8 : ℝ)) + have htmp : + Real.rpow (3 : ℝ) (8 * s) ≤ Real.rpow (3 : ℝ) (8 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) h8s_le + norm_num [Real.rpow_natCast] at htmp ⊢ + exact htmp + have hmul : + Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) = + Real.rpow (81 : ℝ) (2 * s) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + exact Real.mul_rpow (by positivity) (coarseCaccioppoliGapInv_nonneg hlt) + have hsplit : + Real.rpow (3 : ℝ) (2 * s * ((k : ℝ) + 4)) = + Real.rpow (3 : ℝ) (2 * s * (k : ℝ)) * Real.rpow (3 : ℝ) (8 * s) := by + rw [show 2 * s * ((k : ℝ) + 4) = 2 * s * (k : ℝ) + 8 * s by ring] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + calc + C * Real.rpow (3 : ℝ) (2 * s * ((k : ℝ) + 4)) + = C * (Real.rpow (3 : ℝ) (2 * s * (k : ℝ)) * Real.rpow (3 : ℝ) (8 * s)) := by + rw [hsplit] + _ ≤ C * (Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) * + Real.rpow (3 : ℝ) (8 * s)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hk_le + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hC + _ = C * ((Real.rpow (81 : ℝ) (2 * s) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) * + Real.rpow (3 : ℝ) (8 * s)) := by + rw [hmul] + _ ≤ C * ((6561 * Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s)) * 6561) := by + refine mul_le_mul_of_nonneg_left ?_ hC + refine mul_le_mul ?_ h3_le ?_ ?_ + · exact mul_le_mul_of_nonneg_right h81_le + (Real.rpow_nonneg (coarseCaccioppoliGapInv_nonneg hlt) _) + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact mul_nonneg (by positivity) + (Real.rpow_nonneg (coarseCaccioppoliGapInv_nonneg hlt) _) + _ = (6561 : ℝ) * 6561 * C * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (2 * s) := by + ring + +theorem coarseCaccioppoli_boundary_explicitHeight_rightBranch_scalar + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {ρ₁ ρ₂ s t C : ℝ} {k : ℕ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) (hlt : ρ₁ < ρ₂) + (hbranch : + (k : ℝ) + 4 < + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) : + C * Real.rpow (3 : ℝ) + (2 * s * + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * C * + Real.rpow + (C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) := by + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := coarseCaccioppoliPower s t + let A : ℝ := coarseCaccioppoliBoundaryHeightLogArg Q a s t C k + let M : ℝ := C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let x : ℝ := Real.log A / (σ * Real.log (3 : ℝ)) + let n : ℝ := (((Nat.ceil x) : ℕ) : ℝ) + have hσ_pos : 0 < σ := coarseCaccioppoli_sigma_pos hst + have h2s_pos : 0 < 2 * s := by positivity + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have hs1 : s < 1 := by linarith + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hA_nonneg : 0 ≤ A := by + dsimp [A, coarseCaccioppoliBoundaryHeightLogArg] + refine mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) ?_ + refine mul_nonneg ?_ (Real.rpow_nonneg htheta_nonneg _) + exact mul_nonneg (div_nonneg hC hden_nonneg) (by positivity) + have hkchoice : + (3 : ℝ) ^ k ≤ 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice hchoice hlt + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hceil_one_real : (1 : ℝ) ≤ n := by + dsimp [n] + linarith + have hceil_one_nat : 1 ≤ Nat.ceil x := by + dsimp [n] at hceil_one_real + exact_mod_cast hceil_one_real + have hx_pos : 0 < x := (Nat.one_le_ceil_iff).1 hceil_one_nat + have hden_pos : 0 < σ * Real.log (3 : ℝ) := by + exact mul_pos hσ_pos (Real.log_pos (by norm_num)) + have hlogA_pos : 0 < Real.log A := by + have hx' : 0 < Real.log A / (σ * Real.log (3 : ℝ)) := by simpa [x] using hx_pos + have hden_not_neg : ¬ σ * Real.log (3 : ℝ) < 0 := by linarith + exact (div_pos_iff.mp hx').elim (fun h => h.1) (fun h => (hden_not_neg h.2).elim) + have hA_pos : 0 < A := by + have hA_gt_one : 1 < A := (Real.log_pos_iff hA_nonneg).1 hlogA_pos + linarith + have hceil_lt : n < x + 1 := by + dsimp [n] + simpa [x] using (Nat.ceil_lt_add_one hx_pos.le) + have hmain_exp : + 2 * s * n ≤ 2 * s * (x + 1) := by + exact mul_le_mul_of_nonneg_left hceil_lt.le h2s_pos.le + have hpow_le : + Real.rpow (3 : ℝ) (2 * s * n) ≤ + Real.rpow (3 : ℝ) (2 * s * (x + 1)) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) hmain_exp + have hx_factor : + 2 * s * x = p * Real.logb (3 : ℝ) A := by + have hσ_ne : σ ≠ 0 := hσ_pos.ne' + have hlog3_ne : Real.log (3 : ℝ) ≠ 0 := (Real.log_pos (by norm_num)).ne' + calc + 2 * s * x = 2 * s * (Real.log A / (σ * Real.log (3 : ℝ))) := by rfl + _ = (2 * s / σ) * (Real.log A / Real.log (3 : ℝ)) := by + field_simp [hσ_ne, hlog3_ne] + _ = p * Real.logb (3 : ℝ) A := by + rw [Real.log_div_log] + change (2 * s / σ) * Real.logb (3 : ℝ) A = + (2 * s / σ) * Real.logb (3 : ℝ) A + rfl + have hpow_logb : + Real.rpow (3 : ℝ) (p * Real.logb (3 : ℝ) A) = Real.rpow A p := by + calc + Real.rpow (3 : ℝ) (p * Real.logb (3 : ℝ) A) + = (Real.rpow (3 : ℝ) (Real.logb (3 : ℝ) A)) ^ p := by + simpa [mul_comm] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (Real.logb (3 : ℝ) A) p) + _ = Real.rpow A p := by + simpa using + congrArg (fun y : ℝ => Real.rpow y p) + (Real.rpow_logb (by norm_num : 0 < (3 : ℝ)) + (by norm_num : (3 : ℝ) ≠ 1) hA_pos) + have hthree_le : + Real.rpow (3 : ℝ) (2 * s) ≤ (9 : ℝ) := by + have h2s_le : 2 * s ≤ (2 : ℝ) := by + simpa using mul_le_mul_of_nonneg_left hs1.le (by norm_num : 0 ≤ (2 : ℝ)) + have htmp : + Real.rpow (3 : ℝ) (2 * s) ≤ Real.rpow (3 : ℝ) (2 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) h2s_le + norm_num [Real.rpow_natCast] at htmp ⊢ + exact htmp + have hA_pow_le : + Real.rpow A p ≤ + Real.rpow (4 : ℝ) p * + Real.rpow (81 : ℝ) p * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + have hkpow_le : + Real.rpow ((3 : ℝ) ^ k) p ≤ + Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + exact Real.rpow_le_rpow (by positivity) hkchoice hp_nonneg + have hmul : + Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) p = + Real.rpow (81 : ℝ) p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + exact Real.mul_rpow (by positivity) hgap_nonneg + calc + Real.rpow A p = Real.rpow (4 * M * ((3 : ℝ) ^ k)) p := by + congr 1 + dsimp [A, M, coarseCaccioppoliBoundaryHeightLogArg] + ring + _ = Real.rpow (4 * M) p * Real.rpow ((3 : ℝ) ^ k) p := by + have htmp : 0 ≤ 4 * M := by positivity + simpa [mul_assoc] using + (Real.mul_rpow htmp (by positivity : 0 ≤ ((3 : ℝ) ^ k)) (z := p)) + _ = (Real.rpow (4 : ℝ) p * Real.rpow M p) * Real.rpow ((3 : ℝ) ^ k) p := by + have htmp : + Real.rpow (4 * M) p = Real.rpow (4 : ℝ) p * Real.rpow M p := by + exact Real.mul_rpow (by positivity) hM_nonneg + rw [htmp] + _ ≤ (Real.rpow (4 : ℝ) p * Real.rpow M p) * + Real.rpow (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + exact mul_le_mul_of_nonneg_left hkpow_le + (mul_nonneg (Real.rpow_nonneg (by positivity) _) + (Real.rpow_nonneg hM_nonneg _)) + _ = (Real.rpow (4 : ℝ) p * Real.rpow M p) * + (Real.rpow (81 : ℝ) p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + rw [hmul] + _ = Real.rpow (4 : ℝ) p * + Real.rpow (81 : ℝ) p * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + ring + calc + C * Real.rpow (3 : ℝ) + (2 * s * + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) + = C * Real.rpow (3 : ℝ) (2 * s * n) := by + rfl + _ ≤ C * Real.rpow (3 : ℝ) (2 * s * (x + 1)) := by + exact mul_le_mul_of_nonneg_left hpow_le hC + _ = C * (Real.rpow (3 : ℝ) (2 * s * x) * Real.rpow (3 : ℝ) (2 * s)) := by + congr 1 + rw [show 2 * s * (x + 1) = 2 * s * x + 2 * s by ring] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + _ = C * (Real.rpow A p * Real.rpow (3 : ℝ) (2 * s)) := by + rw [hx_factor, hpow_logb] + _ ≤ C * (Real.rpow A p * 9) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hthree_le (Real.rpow_nonneg hA_nonneg _)) + hC + _ = 9 * C * Real.rpow A p := by ring + _ ≤ 9 * (C * (Real.rpow (4 : ℝ) p * + Real.rpow (81 : ℝ) p * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p)) := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hA_pow_le hC) + (by norm_num : 0 ≤ (9 : ℝ))) + _ = ((9 : ℝ) * Real.rpow (4 : ℝ) p * + Real.rpow (81 : ℝ) p) * C * + Real.rpow M p * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + ring + +theorem coarseCaccioppoli_boundary_explicitHeight_rightBranch_scalar_with_front + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {ρ₁ ρ₂ s t Calpha Ccross : ℝ} {k : ℕ} + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) (hlt : ρ₁ < ρ₂) + (hbranch : + (k : ℝ) + 4 < + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) : + Ccross * Real.rpow (3 : ℝ) + (2 * s * + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * Ccross * + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) := by + let X : ℝ := + Real.rpow (3 : ℝ) + (2 * s * + (((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t Calpha k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)))) : ℕ) : ℝ)) + let Y : ℝ := + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) + have hmain : + Calpha * X ≤ Calpha * Y := by + have hraw : + Calpha * X ≤ + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * Calpha * + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) := by + exact + coarseCaccioppoli_boundary_explicitHeight_rightBranch_scalar + Q a hCalpha.le hs ht hst hchoice hlt hbranch + have hY : + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * Calpha * + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) = + Calpha * Y := by + ring + exact hraw.trans_eq hY + have hXY : X ≤ Y := + (mul_le_mul_iff_of_pos_left hCalpha).1 hmain + have hfront : Ccross * X ≤ Ccross * Y := + mul_le_mul_of_nonneg_left hXY hCcross + have hfront_rhs : + Ccross * Y = + ((9 : ℝ) * Real.rpow (4 : ℝ) (coarseCaccioppoliPower s t) * + Real.rpow (81 : ℝ) (coarseCaccioppoliPower s t)) * Ccross * + Real.rpow + (Calpha / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) (coarseCaccioppoliPower s t) := by + ring + exact hfront.trans_eq hfront_rhs + +/-- A stronger triadic-scale cross-term estimate, stated using the note's +auxiliary scale `k`, implies the actual cross-term square bound appearing in +the boundary coefficient bookkeeping. -/ +theorem coarseCaccioppoli_boundary_noteCrossTermBound_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hscale hρ₁ hlt hρ₂ with ⟨k, hkchoice, hkbound⟩ + let M : ℝ := + C / (s * (1 - s)) * Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let p : ℝ := coarseCaccioppoliPower s t + have hs1 : s < 1 := by + linarith + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg htheta_nonneg _) + have hp_nonneg : 0 ≤ p := coarseCaccioppoli_power_nonneg hs hst + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hbase_le : ((3 : ℝ) ^ k) / 81 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + exact (div_le_iff₀ (show (0 : ℝ) < 81 by norm_num)).2 <| by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice hkchoice hlt) + have hbase_nonneg : 0 ≤ ((3 : ℝ) ^ k) / 81 := by positivity + have hgap_pow : + Real.rpow (((3 : ℝ) ^ k) / 81) p ≤ + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + exact Real.rpow_le_rpow hbase_nonneg hbase_le hp_nonneg + have hfactor : + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow M p * Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p := by + refine le_trans hkbound ?_ + exact mul_le_mul_of_nonneg_left hgap_pow (Real.rpow_nonneg hM_nonneg _) + have hprefix_nonneg : + 0 ≤ C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq := by + refine mul_nonneg (mul_nonneg ?_ hLambda_nonneg) hu + exact mul_nonneg hC (sq_nonneg _) + have h3sq : + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) = + Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) := by + calc + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) = + Real.rpow (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) ((s * h ρ₁ ρ₂) * 2) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (s * h ρ₁ ρ₂) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) := by ring_nf + have hLambda_sq : + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ (2 : ℕ) = + LambdaSq Q s (.finite 1) a := by + simpa using sq_rpow_half_eq_self_of_nonneg hLambda_nonneg + have hcross_sq : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ (2 : ℕ) = + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂)) := by + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + calc + (C * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq) ^ (2 : ℕ) + = + C ^ (2 : ℕ) * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + (Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) ^ (2 : ℕ) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ (2 : ℕ) * + (Real.sqrt uL2Sq) ^ (2 : ℕ) := by + ring + _ = C ^ (2 : ℕ) * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) * + LambdaSq Q s (.finite 1) a * + uL2Sq := by + rw [h3sq, hLambda_sq, Real.sq_sqrt hu] + _ = (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂)) := by + ring + have hbound' : + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ (2 : ℕ) ≤ + (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Real.rpow M p * Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := by + rw [hcross_sq] + exact mul_le_mul_of_nonneg_left hfactor hprefix_nonneg + have hgapSqEq : + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) = Real.rpow (ρ₂ - ρ₁) (-2 : ℝ) := by + rw [coarseCaccioppoliGapInv_eq_inv] + calc + ((ρ₂ - ρ₁)⁻¹) ^ (2 : ℕ) = Real.rpow ((ρ₂ - ρ₁)⁻¹) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (ρ₂ - ρ₁) (-(2 : ℝ)) := by + simp + _ = Real.rpow (ρ₂ - ρ₁) (-2 : ℝ) := by ring + have hgapPowEq : + Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p = Real.rpow (ρ₂ - ρ₁) (-p) := by + rw [coarseCaccioppoliGapInv_eq_inv] + symm + simpa using (Real.rpow_neg_eq_inv_rpow (ρ₂ - ρ₁) p) + calc + (coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) ^ (2 : ℕ) + ≤ (C * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) * + LambdaSq Q s (.finite 1) a * uL2Sq) * + (Real.rpow M p * Real.rpow (coarseCaccioppoliGapInv ρ₁ ρ₂) p) := hbound' + _ = C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq * + (Real.rpow (ρ₂ - ρ₁) (-2 : ℝ) * Real.rpow (ρ₂ - ρ₁) (-p)) := by + rw [hgapSqEq, hgapPowEq] + ring + _ = C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-(2 : ℝ) + (-p)) := by + congr 1 + symm + exact Real.rpow_add (sub_pos.mpr hlt) (-2 : ℝ) (-p) + _ = C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-(coarseCaccioppoliBeta s t)) := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + dsimp [p] + congr 2 + ring + _ = (C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + ring + _ = coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) := by + change + (C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) = + (C * Real.rpow M p * LambdaSq Q s (.finite 1) a * uL2Sq) * + Real.rpow (ρ₂ - ρ₁) (-coarseCaccioppoliBeta s t) + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct.lean new file mode 100644 index 0000000000..9a93bff305 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProductFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.LocalPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.OneCube +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProduct.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProduct.lean new file mode 100644 index 0000000000..5bbec284ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProduct.lean @@ -0,0 +1,1005 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.LocalPairing + +/-! # Centered Product -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeL2ScalarPartialSeminormTwo_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v g : Vec d → ℝ) {C : ℝ} + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C v g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q v = 0) (hs : s < 1) (hC : 0 ≤ C) : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N v ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) := by + have hs_neg : s - 1 < 0 := by linarith + have hfactor_nonneg : + 0 ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) := by + exact Real.sqrt_nonneg _ + calc + cubeL2ScalarPartialSeminormTwo Q (s - 1) N v + ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) v := by + exact cubeL2ScalarPartialSeminormTwo_le_geometric_mul_cubeLpNorm_two_of_neg + Q (s - 1) N v hv hs_neg + _ ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) := by + exact mul_le_mul_of_nonneg_left + (cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + Q N v g hv hproj hg havg hC) hfactor_nonneg + +theorem cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_projectedDualMeanZeroPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u g : Vec d → ℝ) {C : ℝ} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : s < 1) (hC : 0 ≤ C) : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) := by + exact + cubeL2ScalarPartialSeminormTwo_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + Q s N (cubeFluctuation Q u) g + (hu.sub (MeasureTheory.memLp_const (cubeAverage Q u))) + hproj hg (cubeAverage_cubeFluctuation Q u) hs hC + +theorem cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (N : ℕ) (v : Vec d → ℝ) (G : Vec d → Vec d) + {C Bcirc : ℝ} + (hproj : CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C v G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q v = 0) (hC : 0 ≤ C) + (hGcirc : ∀ i : Fin d, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc) : + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + have hlocal := hproj.to_localEstimate hG hC + have hQ : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hosc := hlocal 0 (by simp) Q hQ + have hsum : + ∑ i : Fin d, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ + (Fintype.card (Fin d) : ℝ) * Bcirc := by + calc + ∑ i : Fin d, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) + ≤ ∑ _i : Fin d, Bcirc := by + refine Finset.sum_le_sum ?_ + intro i hi + exact hGcirc i + _ = (Fintype.card (Fin d) : ℝ) * Bcirc := by + simp [Finset.sum_const, nsmul_eq_mul] + have hK_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hosc_bound : + cubeBesovOscillation Q (2 : ℝ≥0∞) v ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + exact le_trans hosc (mul_le_mul_of_nonneg_left hsum hK_nonneg) + calc + cubeLpNorm Q (2 : ℝ≥0∞) v + = cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + have hfluct_eq : cubeFluctuation Q v = v := by + funext x + simp [cubeFluctuation, havg] + simp [cubeBesovOscillation, hfluct_eq] + _ ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc) := hosc_bound + +/-- Full-dual replacement for +`cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroVectorPoincareEstimate`. + +The corrected full-dual Poincare estimate controls constant gradient modes. +Uniform finite-depth circ bounds turn the full circ norm into the same +note-shaped component budget used by the projected corridor. -/ +theorem cubeLpNorm_two_le_note_rhs_of_meanZero_dualFullVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (N : ℕ) (v : Vec d → ℝ) (G : Vec d → Vec d) + {C Bcirc : ℝ} + (hfull : CubeDescendantDualFullVectorPoincareEstimate Q C v G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q v = 0) (hC : 0 ≤ C) (hBcirc : 0 ≤ Bcirc) + (hGcirc : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc) : + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + have hQ : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hosc := hfull 0 (by simp) Q hQ + have hnote_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) := + Real.rpow_nonneg (by positivity) _ + have hcoord : + ∀ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + (3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := by + intro i + have hdual_le_circ : + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + simpa using + cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (q := (1 : ℝ≥0∞)) + (u := fun x => G x i) + (by norm_num) (hG i) (by norm_num) (by norm_num) + (by + have hconj_eq : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + simp [hconj_eq]) + (by norm_num) + have hcirc_le : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ Bcirc := + cubeBesovCircNorm_le_of_forall_partialNorm_le + Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by norm_num) (hGcirc i) + have hmain : + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := by + exact hdual_le_circ.trans + (mul_le_mul_of_nonneg_left hcirc_le hnote_nonneg) + have hraw_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := + mul_nonneg hnote_nonneg hBcirc + calc + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + ≤ (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := hmain + _ ≤ (3 / 2 : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc) := by + exact le_mul_of_one_le_left hraw_nonneg (by norm_num) + _ = (3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := by ring + have hsum : + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + ∑ _i : Fin d, + (3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc := by + exact Finset.sum_le_sum (fun i _ => hcoord i) + have hsum_eq : + ∑ _i : Fin d, + (3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc = + (Fintype.card (Fin d) : ℝ) * + ((3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc) := by + simp [Finset.sum_const, nsmul_eq_mul] + have hK_nonneg : 0 ≤ C := hC + have hosc_bound : + cubeBesovOscillation Q (2 : ℝ≥0∞) v ≤ + C * ((Fintype.card (Fin d) : ℝ) * + ((3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc)) := by + exact hosc.trans + (mul_le_mul_of_nonneg_left (hsum.trans (le_of_eq hsum_eq)) hK_nonneg) + calc + cubeLpNorm Q (2 : ℝ≥0∞) v + = cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + have hfluct_eq : cubeFluctuation Q v = v := by + funext x + simp [cubeFluctuation, havg] + simp [cubeBesovOscillation, hfluct_eq] + _ ≤ C * ((Fintype.card (Fin d) : ℝ) * + ((3 / 2 : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * Bcirc)) := hosc_bound + _ = ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc) := by ring + +theorem cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_projectedDualMeanZeroVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) {C Bcirc : ℝ} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : s < 1) (hC : 0 ≤ C) + (hGcirc : ∀ i : Fin d, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc) : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + have hs_neg : s - 1 < 0 := by linarith + have hfactor_nonneg : + 0 ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) := by + exact Real.sqrt_nonneg _ + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + calc + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + exact cubeL2ScalarPartialSeminormTwo_le_geometric_mul_cubeLpNorm_two_of_neg + Q (s - 1) N (cubeFluctuation Q u) huFluct hs_neg + _ ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + exact mul_le_mul_of_nonneg_left + (cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroVectorPoincareEstimate + Q N (cubeFluctuation Q u) G hproj hG + (cubeAverage_cubeFluctuation Q u) hC hGcirc) hfactor_nonneg + +/-- Full-dual replacement for the `L²` partial-seminorm estimate used in the +centered cutoff-product term. -/ +theorem cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_dualFullVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) {C Bcirc : ℝ} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfull : + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : s < 1) (hC : 0 ≤ C) (hBcirc : 0 ≤ Bcirc) + (hGcirc : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc) : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + have hs_neg : s - 1 < 0 := by linarith + have hfactor_nonneg : + 0 ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) := by + exact Real.sqrt_nonneg _ + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + calc + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) := by + exact cubeL2ScalarPartialSeminormTwo_le_geometric_mul_cubeLpNorm_two_of_neg + Q (s - 1) N (cubeFluctuation Q u) huFluct hs_neg + _ ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + exact mul_le_mul_of_nonneg_left + (cubeLpNorm_two_le_note_rhs_of_meanZero_dualFullVectorPoincareEstimate + Q N (cubeFluctuation Q u) G hfull hG + (cubeAverage_cubeFluctuation Q u) hC hBcirc hGcirc) hfactor_nonneg + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_average_note_terms_of_partialBounds_of_projectedDualMeanZeroPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hneg1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hnote1_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1 := by + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 g := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + Q 0 (cubeFluctuation Q u) g huFluct (hproj 0) hg + (cubeAverage_cubeFluctuation Q u) hC + _ ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1 := by + exact mul_le_mul_of_nonneg_left (hneg1 0) hnote1_nonneg + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_projectedDualMeanZeroPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hneg1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hnote1_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1 := by + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) + ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) 0 g := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + Q 0 (cubeFluctuation Q u) g huFluct (hproj 0) hg + (cubeAverage_cubeFluctuation Q u) hC + _ ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1 := by + exact mul_le_mul_of_nonneg_left (hneg1 0) hnote1_nonneg + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_average_note_terms_of_partialBounds_of_projectedDualMeanZeroVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1) := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroVectorPoincareEstimate + Q 0 (cubeFluctuation Q u) G (hproj 0) hG + (cubeAverage_cubeFluctuation Q u) hC (fun i => hGcirc1 i 0) + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_projectedDualMeanZeroVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1) := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroVectorPoincareEstimate + Q 0 (cubeFluctuation Q u) G (hproj 0) hG + (cubeAverage_cubeFluctuation Q u) hC (fun i => hGcirc1 i 0) + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs : s < 1) (hC : 0 ≤ C) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + have hraw : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) := + cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_projectedDualMeanZeroPoincareEstimate + Q s N u g hu hproj hg hs hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ + 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + simpa [cubeFluctuation] using! + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N u ξ hB hu hξLp hξ hderiv + _ ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + refine mul_le_mul_of_nonneg_left ?_ (by norm_num) + exact add_le_add + (mul_le_mul_of_nonneg_left hraw hcoeff_nonneg) le_rfl + +theorem cubeBesovPositiveVectorSeminormTwo_centered_scalar_smul_le_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C Bcirc Bpos : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs : s < 1) (hC : 0 ≤ C) + (hneg : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc) + (hpos : ∀ N : ℕ, + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ Bpos) : + cubeBesovPositiveVectorSeminormTwo Q s (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc)) + + cubeLpNorm Q ∞ ξ * Bpos) := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound (Q := Q) (s := s) + (u := fun x => (u x - cubeAverage Q u) • ξ x) ?_ + intro N + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_poincare_cutoff_terms + Q s N u g ξ hB hu (hproj N) hg hξLp hξ hderiv hs hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc)) := by + refine mul_le_mul_of_nonneg_left ?_ hcoeff_nonneg + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + refine mul_le_mul_of_nonneg_left (hneg N) ?_ + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hterm2 : + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * Bpos := by + exact mul_le_mul_of_nonneg_left (hpos N) (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := hpartial + _ ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc)) + + cubeLpNorm Q ∞ ξ * Bpos) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + +theorem cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := by + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_poincare_cutoff_terms + Q s N u g ξ hB hu hproj hg hξLp hξ hderiv hs1 hC + have hpos := + hproj.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs + (u := u) (hg := hg) hs0 hC + have hterm2 : + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) := by + exact mul_le_mul_of_nonneg_left hpos (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := hpartial + _ ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := by + exact mul_le_mul_of_nonneg_left (add_le_add le_rfl hterm2) (by norm_num) + +theorem cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_vector_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (ξ : Vec d → Vec d) {B C Bcirc1 BcircS : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) + (hBcircS : 0 ≤ BcircS) + (hGcirc1 : ∀ i : Fin d, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) := by + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N u ξ hB hu hξLp hξ hderiv + have hraw : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := + cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_projectedDualMeanZeroVectorPoincareEstimate + Q s N u G hu hproj hG hs1 hC hGcirc1 + have hpos := + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs_of_component_bound + (Q := Q) (s := s) (C := C) (Bcirc := BcircS) (u := u) (G := G) + (M := N) hproj hG hs0 hC hBcircS hGcircS + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := + mul_le_mul_of_nonneg_left hraw hcoeff_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) + ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS))) := + mul_le_mul_of_nonneg_left hpos (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ + 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + simpa [cubeFluctuation] using! hpartial + _ ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + +theorem cubeBesovPositiveVectorSeminormTwo_centered_scalar_smul_le_note_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C Bcirc1 BcircS : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) + (hneg1 : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) + (hnegS : ∀ N : ℕ, cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) : + cubeBesovPositiveVectorSeminormTwo Q s (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound (Q := Q) (s := s) + (u := fun x => (u x - cubeAverage Q u) • ξ x) ?_ + intro N + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_poincare_cutoff_terms + Q s N u g ξ hB hu (hproj N) hg hξLp hξ hderiv hs0 hs1 hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) := by + refine mul_le_mul_of_nonneg_left ?_ hcoeff_nonneg + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + refine mul_le_mul_of_nonneg_left (hneg1 N) ?_ + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hnoteS_nonneg : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2inner : + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) + ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS) := by + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovScaleWeight_nonneg (-s) Q) + exact mul_le_mul_of_nonneg_left (hnegS N) hnoteS_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS)) := by + exact mul_le_mul_of_nonneg_left hterm2inner (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := hpartial + _ ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProductFullDual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProductFullDual.lean new file mode 100644 index 0000000000..c5a472d2a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/CenteredProductFullDual.lean @@ -0,0 +1,817 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Bounds + +/-! # Centered Product Full Dual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +# Full-dual centered cutoff-product estimates + +This sidecar keeps `CenteredProduct.lean` under the preferred size ceiling while +recording the corrected full-dual replacement for the `L²` half of the centered +cutoff-product estimate. The local-multiscale theorem below also discharges +the positive-Besov scalar tail from the matching finite-depth Poincare estimate, +which is the analytic input needed by the Section 3.1 small-cube bridge. +-/ + +theorem + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDualL2_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (ξ : Vec d → Vec d) {B C Bcirc1 Bpos : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfull : + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs1 : s < 1) (hC : 0 ≤ C) (hBcirc1 : 0 ≤ Bcirc1) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) + (hpos : + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ Bpos) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * Bpos) := by + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N u ξ hB hu hξLp hξ hderiv + have hraw : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := + cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_dualFullVectorPoincareEstimate + Q s N u G hu hfull hG hs1 hC hBcirc1 hGcirc1 + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := + mul_le_mul_of_nonneg_left hraw hcoeff_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) + ≤ + cubeLpNorm Q ∞ ξ * Bpos := + mul_le_mul_of_nonneg_left hpos (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ + 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (cubeFluctuation Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u)) := by + simpa [cubeFluctuation] using! hpartial + _ ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * Bpos) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + +theorem + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDual_localMultiscale_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (ξ : Vec d → Vec d) {B C Bcirc1 BcircS : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfull : + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) := by + have hnoteC_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) + (Real.rpow_nonneg (by positivity) _) + have hpos : + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)) := by + simpa [mul_assoc] using + CubeLocalMultiscalePoincareVectorEstimate.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs_of_component_bound + (Q := Q) + (s := s) + (C := ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (Bcirc := BcircS) (u := u) (G := G) (M := N) + hlocal hs0 hnoteC_nonneg hBcircS hGcircS + exact + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDualL2_cutoff_terms + (Q := Q) (s := s) (N := N) (u := u) (G := G) (ξ := ξ) + (B := B) (C := C) (Bcirc1 := Bcirc1) + (Bpos := + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS))) + hB hu hfull hG hξLp hξ hderiv hs1 hC hBcirc1 hGcirc1 hpos + +/-- Componentwise dual-test bound for the centered cutoff product, using the +full-dual Poincare estimate and the full-circ infinite-depth positive +Poincare route. -/ +theorem + cubeBesovDualTestNorm_two_one_component_centered_scalar_smul_le_fullDual_fullCirc_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (ξ : Vec d → Vec d) (i : Fin d) {B C Bcirc1 BcircS : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfull : ∀ M : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G M) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ BcircS) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q (fun y => (u y - cubeAverage Q u) • ξ y) x i) ≤ + cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS))))) := by + classical + let v : Vec d → ℝ := cubeFluctuation Q u + let prod : Vec d → Vec d := fun x => v x • ξ x + let L2B : ℝ := + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) + let PosB : ℝ := + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)) + have hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hprodMem : + MeasureTheory.MemLp prod (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + simpa [prod] using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hv + have hconj : + cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have havg : + cubeAverage Q (fun x => cubeFluctuationVec Q prod x i) = 0 := by + simpa [cubeFluctuation_component_eq_cubeFluctuationVec_component Q prod i] using + cubeAverage_cubeFluctuation Q (fun x => prod x i) + have hL2partial : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N v ≤ L2B := by + simpa [v, L2B] using + cubeL2ScalarPartialSeminormTwo_fluctuation_le_note_rhs_of_dualFullVectorPoincareEstimate + Q s N u G hu (hfull N) hG hs1 hC hBcirc1 hGcirc1 + have hCfull_nonneg : 0 ≤ C * (3 : ℝ) ^ ((d : ℝ) + 1) := by + exact mul_nonneg hC (Real.rpow_nonneg (by positivity) _) + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hgeom_nonneg : 0 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hgeom_large : 1 ≤ (3 / 2 : ℝ) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hr_nonneg : 0 ≤ (3 : ℝ) ^ (-s) := + Real.rpow_nonneg (by positivity) _ + have hden_pos : 0 < 1 - (3 : ℝ) ^ (-s) := by linarith + have hinv_ge_one : 1 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + exact (one_le_inv₀ hden_pos).mpr (by linarith) + calc + (1 : ℝ) ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := hinv_ge_one + _ ≤ (3 / 2 : ℝ) * (1 - (3 : ℝ) ^ (-s))⁻¹ := by + exact le_mul_of_one_le_left hgeom_nonneg (by norm_num) + have hposDepth : ∀ j ∈ Finset.range (N + 1), + cubeBesovPositiveScalarDepthSeminorm Q s v j ≤ PosB := by + intro j hj + have hlocalFull : + CubeLocalFullCircPoincareVectorEstimate Q + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) v G N := + (hfull N).to_localFullCircEstimate hG hC + have hdepth : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j ≤ + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + exact + cubeBesovDepthSeminorm_two_le_sum_circNorm_of_vector_local_full_circ_bound + Q s (C * (3 : ℝ) ^ ((d : ℝ) + 1)) v G j hs0.le hs1 hCfull_nonneg hG + (by + intro R hR + exact hlocalFull j hj R hR) + have hcircNorm : ∀ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) ≤ + BcircS := by + intro i + exact + cubeBesovCircNorm_le_of_forall_partialNorm_le + Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) + (by norm_num) (hGcircS i) + have hsum : + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) ≤ + (Fintype.card (Fin d) : ℝ) * BcircS := by + calc + ∑ i : Fin d, + cubeBesovCircNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + ≤ ∑ _i : Fin d, BcircS := by + exact Finset.sum_le_sum fun i _ => hcircNorm i + _ = (Fintype.card (Fin d) : ℝ) * BcircS := by + simp + have hdepth_bound : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j ≤ + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * BcircS) := + hdepth.trans (mul_le_mul_of_nonneg_left hsum hCfull_nonneg) + have hlarge : + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * BcircS) ≤ + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS) := by + have htail_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) * BcircS := + mul_nonneg hcard_nonneg hBcircS + have hfront : + C * (3 : ℝ) ^ ((d : ℝ) + 1) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹ := by + calc + C * (3 : ℝ) ^ ((d : ℝ) + 1) + = 1 * (C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by ring + _ ≤ ((3 / 2 : ℝ) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + (C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_le_mul_of_nonneg_right hgeom_large hCfull_nonneg + _ = ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹ := by ring + exact mul_le_mul_of_nonneg_right hfront htail_nonneg + calc + cubeBesovPositiveScalarDepthSeminorm Q s v j + = cubeBesovScaleWeight (-s) Q * + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j := by + rw [cubeBesovPositiveScalarDepthSeminorm_eq_scaleWeight_neg_mul_cubeBesovDepthSeminorm_two] + _ ≤ cubeBesovScaleWeight (-s) Q * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)) := by + exact mul_le_mul_of_nonneg_left (hdepth_bound.trans hlarge) + (cubeBesovScaleWeight_nonneg (-s) Q) + _ = PosB := by + simp [PosB, mul_assoc, mul_left_comm, mul_comm] + have hcomponentTop : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q prod x i) ≤ + cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * L2B + cubeLpNorm Q ∞ ξ * PosB)) := by + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le + (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) + (fun x => cubeFluctuationVec Q prod x i) j) ?_ + intro j hj + have hprodDepthEq : + cubeBesovPositiveVectorDepthSeminorm Q s (cubeFluctuationVec Q prod) j = + cubeBesovPositiveVectorDepthSeminorm Q s prod j := by + simpa [cubeFluctuationVec] using! + cubeBesovPositiveVectorDepthSeminorm_sub_const + Q s prod (cubeAverageVec Q prod) j + (by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hprodMem) + have hdepthProd : + cubeBesovPositiveVectorDepthSeminorm Q s prod j ≤ + 2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j) := by + simpa [prod, v] using + cubeBesovPositiveVectorDepthSeminorm_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s j v ξ hB hv hξLp hξ hderiv + have hL2depth : + cubeL2ScalarDepthSeminorm Q (s - 1) v j ≤ + cubeL2ScalarPartialSeminormTwo Q (s - 1) N v := by + have hsq : + (cubeL2ScalarDepthSeminorm Q (s - 1) v j) ^ (2 : ℕ) ≤ + (cubeL2ScalarPartialSeminormTwo Q (s - 1) N v) ^ (2 : ℕ) := by + rw [sq_cubeL2ScalarPartialSeminormTwo] + exact Finset.single_le_sum + (fun k _ => sq_nonneg (cubeL2ScalarDepthSeminorm Q (s - 1) v k)) hj + have hleft_nonneg : 0 ≤ cubeL2ScalarDepthSeminorm Q (s - 1) v j := + cubeL2ScalarDepthSeminorm_nonneg Q (s - 1) v j + have hright_nonneg : 0 ≤ cubeL2ScalarPartialSeminormTwo Q (s - 1) N v := + Real.sqrt_nonneg _ + nlinarith + have hinner : + cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j ≤ + cubeScaleFactor Q * B * L2B + cubeLpNorm Q ∞ ξ * PosB := by + exact add_le_add + (mul_le_mul_of_nonneg_left (hL2depth.trans hL2partial) + (mul_nonneg (cubeScaleFactor_nonneg Q) hB)) + (mul_le_mul_of_nonneg_left (hposDepth j hj) (cubeLpNorm_nonneg Q ∞ ξ)) + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) + (fun x => cubeFluctuationVec Q prod x i) j + ≤ cubeBesovScaleWeight s Q * + cubeBesovPositiveVectorDepthSeminorm Q s (cubeFluctuationVec Q prod) j := by + exact cubeBesovDepthSeminorm_two_component_le_scaleWeight_mul_positiveVectorDepthSeminorm + Q s (cubeFluctuationVec Q prod) i j + (memLp_cubeFluctuationVec Q prod hprodMem) + _ = cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s prod j := by + rw [hprodDepthEq] + _ ≤ cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j)) := by + exact mul_le_mul_of_nonneg_left hdepthProd (cubeBesovScaleWeight_nonneg s Q) + _ ≤ cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * L2B + cubeLpNorm Q ∞ ξ * PosB)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hinner (by norm_num)) + (cubeBesovScaleWeight_nonneg s Q) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + N (fun x => cubeFluctuationVec Q (fun y => (u y - cubeAverage Q u) • ξ y) x i) hconj] + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + Q s (cubeBesovConjExponent (2 : ℝ≥0∞)) N + (fun x => cubeFluctuationVec Q (fun y => (u y - cubeAverage Q u) • ξ y) x i) + (by + simpa [prod, v, cubeFluctuation] using havg)] + rw [hpConj] + change + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q prod x i) ≤ + cubeBesovScaleWeight s Q * + (2 * (cubeScaleFactor Q * B * L2B + cubeLpNorm Q ∞ ξ * PosB)) + exact hcomponentTop + +theorem + cubeBesovPositiveVectorSeminormTwo_centered_scalar_smul_le_fullDualL2_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → ℝ) + (G : Vec d → Vec d) (ξ : Vec d → Vec d) {B C Bcirc1 Bpos : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs1 : s < 1) (hC : 0 ≤ C) (hBcirc1 : 0 ≤ Bcirc1) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) + (hpos : ∀ N : ℕ, + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) ≤ Bpos) : + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * Bpos) := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound (Q := Q) (s := s) + (u := fun x => (u x - cubeAverage Q u) • ξ x) ?_ + intro N + exact + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDualL2_cutoff_terms + Q s N u G ξ hB hu (hfull N) hG hξLp hξ hderiv hs1 hC hBcirc1 + hGcirc1 (hpos N) + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_average_note_terms_of_partialBounds_of_dualFullVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcirc1 : 0 ≤ Bcirc1) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1) := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_dualFullVectorPoincareEstimate + Q 0 (cubeFluctuation Q u) G (hfull 0) hG + (cubeAverage_cubeFluctuation Q u) hC hBcirc1 hGcirc1 + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_dualFullVectorPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bg Bavg Bcirc1 C : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcirc1 : 0 ≤ Bcirc1) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ M : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc1) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds + Q s flux (cubeFluctuation Q u) ξ hs hflux huFluct hξLp hBg hBavg havg hneg + (by + intro N + simpa [cubeFluctuation] using hpos N) + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1) := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_dualFullVectorPoincareEstimate + Q 0 (cubeFluctuation Q u) G (hfull 0) hG + (cubeAverage_cubeFluctuation Q u) hC hBcirc1 hGcirc1 + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := by + exact mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := by + exact mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_dualFull_fullCirc + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bg Bavg Bcirc1 BcircS B C : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hdual : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => + cubeFluctuationVec Q + (fun y => cubeFluctuation Q u y • ξ y) x i) ≤ + cubeBesovScaleWeight s Q * Bg := by + intro i N + exact le_trans + (cubeBesovDualTestNorm_two_one_component_centered_scalar_smul_le_fullDual_fullCirc_cutoff_terms + Q s N u G ξ i hB hu hfull hG hξLp hξ hderiv hs0 hs1 hC hBcirc1 hBcircS + hGcirc1 hGcircS) + (mul_le_mul_of_nonneg_left hBg_bound (cubeBesovScaleWeight_nonneg s Q)) + have hmain := + abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_dualTestBounds + Q s flux (cubeFluctuation Q u) ξ hs0 hflux huFluct hξLp hBg hBavg havg hneg hdual + have hfluctL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1) := by + exact + cubeLpNorm_two_le_note_rhs_of_meanZero_dualFullVectorPoincareEstimate + Q 0 (cubeFluctuation Q u) G (hfull 0) hG + (cubeAverage_cubeFluctuation Q u) hC hBcirc1 hGcirc1 + have havgInner : + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u) ≤ + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)) := + mul_le_mul_of_nonneg_left hfluctL2 (cubeLpNorm_nonneg Q ∞ ξ) + have havgTerm : + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) := by + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hinner : + Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u)) + ≤ + Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) := + mul_le_mul_of_nonneg_left havgInner hBavg + exact mul_le_mul_of_nonneg_left hinner hd_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| + ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q u))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + simpa [cubeFluctuation] using hmain + _ ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havgTerm le_rfl + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_dualFull_localMultiscale + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bavg Bcirc1 BcircS B C Bg : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg := by + intro N + exact le_trans + (cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDual_localMultiscale_cutoff_terms + Q s N u G ξ hB hu (hfull N) (hlocal N) hG hξLp hξ hderiv + hs0 hs1 hC hBcirc1 hBcircS hGcirc1 (fun i => hGcircS i N)) + hBg_bound + exact + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_dualFullVectorPoincareEstimate + Q s flux u G ξ hs0 hflux hu hG hξLp hBg hBavg hC hBcirc1 + havg hneg hpos hfull hGcirc1 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/Geometry.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/Geometry.lean new file mode 100644 index 0000000000..98aeda8126 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/Geometry.lean @@ -0,0 +1,735 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality + +/-! # Geometry -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeScaleFactor_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (le_of_lt (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + +theorem cubeLpNorm_infty_le_of_bound_on_cubeSet {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (f : Vec d → E) {C : ℝ} + (hC : 0 ≤ C) + (hbound : ∀ x ∈ cubeSet Q, ‖f x‖ ≤ C) : + cubeLpNorm Q ∞ f ≤ C := by + have hbound_ae_cube : ∀ᵐ x ∂ cubeMeasure Q, ‖f x‖ ≤ C := by + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall hbound + have hbound_ae : ∀ᵐ x ∂ normalizedCubeMeasure Q, ‖f x‖ ≤ C := by + simpa [normalizedCubeMeasure] using + (ae_smul_measure hbound_ae_cube (ENNReal.ofReal ((cubeVolume Q)⁻¹))) + have hle : + MeasureTheory.eLpNorm f ∞ (normalizedCubeMeasure Q) ≤ ENNReal.ofReal C := by + simpa [MeasureTheory.eLpNorm_exponent_top] using + MeasureTheory.eLpNormEssSup_le_of_ae_bound hbound_ae + have htoReal := ENNReal.toReal_mono ENNReal.ofReal_ne_top hle + simpa [cubeLpNorm, ENNReal.toReal_ofReal, hC] using htoReal + +theorem convex_cubeSet {d : ℕ} (Q : TriadicCube d) : + Convex ℝ (cubeSet Q) := by + rw [cubeSet_eq_pi_Ico] + refine convex_pi ?_ + intro i hi + exact convex_Ico _ _ + +theorem norm_sub_le_cubeScaleFactor_of_mem_cubeSet {d : ℕ} (Q : TriadicCube d) + {x y : Vec d} (hx : x ∈ cubeSet Q) (hy : y ∈ cubeSet Q) : + ‖x - y‖ ≤ cubeScaleFactor Q := by + have hxball : x ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hx + have hyball : y ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hy + have hxnorm : ‖x - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hxball + have hynorm : ‖y - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm, norm_sub_rev] using hyball + have hycnorm : ‖cubeCenter Q - y‖ ≤ cubeRadius Q := by + simpa [norm_sub_rev] using hynorm + calc + ‖x - y‖ = ‖(x - cubeCenter Q) + (cubeCenter Q - y)‖ := by + congr + abel_nf + _ ≤ ‖x - cubeCenter Q‖ + ‖cubeCenter Q - y‖ := norm_add_le _ _ + _ ≤ cubeRadius Q + cubeRadius Q := add_le_add hxnorm hycnorm + _ = cubeScaleFactor Q := by + unfold cubeRadius + ring + +theorem norm_sub_le_cubeScaleFactor_mul_of_contDiff_bound {d : ℕ} (Q : TriadicCube d) + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) {B : ℝ} (hB : 0 ≤ B) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) + {x y : Vec d} (hx : x ∈ cubeSet Q) (hy : y ∈ cubeSet Q) : + ‖u x - u y‖ ≤ cubeScaleFactor Q * B := by + let γ : ℝ → Vec d := fun t => segmentBlend x t y + have hγ_cont : Continuous γ := by + simpa [γ, segmentBlend] using (AffineMap.lineMap_continuous (p := y) (q := x)) + have hfderiv_cont : Continuous (fderiv ℝ u) := by + exact hu.continuous_fderiv (by simp) + have hint : + IntervalIntegrable (fun t => ‖fderiv ℝ u (γ t)‖ * ‖x - y‖) + MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => ‖fderiv ℝ u (γ t)‖ * ‖x - y‖) := + (continuous_norm.comp (hfderiv_cont.comp hγ_cont)).mul continuous_const + exact hcont.intervalIntegrable _ _ + have hconst_int : + IntervalIntegrable (fun _ : ℝ => B * ‖x - y‖) MeasureTheory.volume 0 1 := + intervalIntegrable_const + have hpoint : + ∀ t ∈ Set.Icc (0 : ℝ) 1, ‖fderiv ℝ u (γ t)‖ * ‖x - y‖ ≤ B * ‖x - y‖ := by + intro t ht + have hγ_mem : γ t ∈ cubeSet Q := by + exact segmentBlend_mem (convex_cubeSet Q) hx hy ht.1 ht.2 + exact mul_le_mul_of_nonneg_right (hderiv (γ t) hγ_mem) (norm_nonneg _) + have hdist : ‖x - y‖ ≤ cubeScaleFactor Q := + norm_sub_le_cubeScaleFactor_of_mem_cubeSet Q hx hy + calc + ‖u x - u y‖ + ≤ ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ := by + simpa [γ] using + norm_sub_le_integral_norm_fderiv_mul_norm_sub_along_segment hu x y + _ ≤ ∫ t in (0 : ℝ)..1, B * ‖x - y‖ := by + exact intervalIntegral.integral_mono_on zero_le_one hint hconst_int hpoint + _ = B * ‖x - y‖ := by simp + _ ≤ B * cubeScaleFactor Q := by + exact mul_le_mul_of_nonneg_left hdist hB + _ = cubeScaleFactor Q * B := by ring + +theorem norm_sub_le_cubeScaleFactor_mul_of_contDiff_component_bound {d : ℕ} + (Q : TriadicCube d) {ξ : Vec d → Vec d} {B : ℝ} (hB : 0 ≤ B) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + {x y : Vec d} (hx : x ∈ cubeSet Q) (hy : y ∈ cubeSet Q) : + ‖ξ x - ξ y‖ ≤ cubeScaleFactor Q * B := by + refine (pi_norm_le_iff_of_nonneg (mul_nonneg (cubeScaleFactor_nonneg Q) hB)).2 ?_ + intro i + simpa using + norm_sub_le_cubeScaleFactor_mul_of_contDiff_bound Q (u := fun z => ξ z i) (hξ i) hB + (fun z hz => hderiv i z hz) hx hy + +theorem cubeLpNorm_component_le_cubeLpNorm {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u p (normalizedCubeMeasure Q)) : + cubeLpNorm Q p (fun x => u x i) ≤ cubeLpNorm Q p u := by + have hui : MeasureTheory.MemLp (fun x => u x i) p (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hpoint : + ∀ᵐ x ∂ normalizedCubeMeasure Q, ‖u x i‖ ≤ (1 : ℝ) * ‖u x‖ := by + exact Filter.Eventually.of_forall fun x => by + simpa using (norm_le_pi_norm (u x) i) + have hle : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal (1 : ℝ) * + MeasureTheory.eLpNorm u p (normalizedCubeMeasure Q) := + MeasureTheory.eLpNorm_le_mul_eLpNorm_of_ae_le_mul hpoint p + have htop_u : + MeasureTheory.eLpNorm u p (normalizedCubeMeasure Q) ≠ ∞ := ne_of_lt hu.2 + have htop_ui : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedCubeMeasure Q) ≠ ∞ := + ne_of_lt hui.2 + have htoReal : + (MeasureTheory.eLpNorm (fun x => u x i) p (normalizedCubeMeasure Q)).toReal ≤ + (MeasureTheory.eLpNorm u p (normalizedCubeMeasure Q)).toReal := by + have hle' : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm u p (normalizedCubeMeasure Q) := by + simpa using hle + exact ENNReal.toReal_mono htop_u hle' + simpa [cubeLpNorm] using htoReal + +theorem norm_cubeAverageVec_le_cubeLpNorm_two {d : ℕ} (Q : TriadicCube d) + (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ‖cubeAverageVec Q u‖ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hconj_two : ENNReal.conjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + refine (pi_norm_le_iff_of_nonneg (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u)).2 ?_ + intro i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (ENNReal.conjExponent (2 : ℝ≥0∞)) (normalizedCubeMeasure Q) := by + simpa [hconj_two] using + (MeasureTheory.memLp_const (1 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + have havg : + ‖cubeAverage Q (fun x => u x i)‖ ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x i) * + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) := by + simpa [hconj_two] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + (Q := Q) (p := (2 : ℝ≥0∞)) (f := fun x => u x i) (g := fun _ => (1 : ℝ)) + hui hconst (by norm_num) + have hnorm_one : cubeLpNorm Q (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) = 1 := by + simpa using cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) (c := (1 : ℝ)) (by norm_num) + have havg' : + ‖cubeAverage Q (fun x => u x i)‖ ≤ cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x i) := by + simpa [hnorm_one] using havg + calc + ‖cubeAverageVec Q u i‖ = ‖cubeAverage Q (fun x => u x i)‖ := by + simp [cubeAverageVec] + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x i) := havg' + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := + cubeLpNorm_component_le_cubeLpNorm Q (2 : ℝ≥0∞) u i hu + +theorem norm_cubeAverageVec_le_cubeLpNorm_infty {d : ℕ} (Q : TriadicCube d) + (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) : + ‖cubeAverageVec Q u‖ ≤ cubeLpNorm Q ∞ u := by + have hconj_top : ENNReal.conjExponent (∞ : ℝ≥0∞) = (1 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (∞ : ℝ≥0∞)) (q := (1 : ℝ≥0∞))) + refine (pi_norm_le_iff_of_nonneg (cubeLpNorm_nonneg Q ∞ u)).2 ?_ + intro i + have hui : MeasureTheory.MemLp (fun x => u x i) ∞ (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (ENNReal.conjExponent (∞ : ℝ≥0∞)) (normalizedCubeMeasure Q) := by + simpa [hconj_top] using + (MeasureTheory.memLp_const (1 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (1 : ℝ≥0∞) (normalizedCubeMeasure Q)) + have havg : + ‖cubeAverage Q (fun x => u x i)‖ ≤ + cubeLpNorm Q ∞ (fun x => u x i) * cubeLpNorm Q (1 : ℝ≥0∞) (fun _ => (1 : ℝ)) := by + simpa [hconj_top] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + (Q := Q) (p := (∞ : ℝ≥0∞)) (f := fun x => u x i) (g := fun _ => (1 : ℝ)) + hui hconst (by norm_num) + have hnorm_one : cubeLpNorm Q (1 : ℝ≥0∞) (fun _ => (1 : ℝ)) = 1 := by + simpa using cubeLpNorm_const (Q := Q) (p := (1 : ℝ≥0∞)) (c := (1 : ℝ)) (by norm_num) + have havg' : + ‖cubeAverage Q (fun x => u x i)‖ ≤ cubeLpNorm Q ∞ (fun x => u x i) := by + simpa [hnorm_one] using havg + calc + ‖cubeAverageVec Q u i‖ = ‖cubeAverage Q (fun x => u x i)‖ := by + simp [cubeAverageVec] + _ ≤ cubeLpNorm Q ∞ (fun x => u x i) := havg' + _ ≤ cubeLpNorm Q ∞ u := + cubeLpNorm_component_le_cubeLpNorm Q ∞ u i hu + +theorem cubeAverage_sub_const {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (c : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage Q (fun x => u x - c) = cubeAverage Q u - c := by + have hu_int : MeasureTheory.Integrable u (normalizedCubeMeasure Q) := + hu.integrable (by norm_num) + have hc_int : MeasureTheory.Integrable (fun _ : Vec d => c) (normalizedCubeMeasure Q) := + MeasureTheory.integrable_const _ + calc + cubeAverage Q (fun x => u x - c) + = ∫ x, (u x - c) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, u x ∂ normalizedCubeMeasure Q - ∫ x, c ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_sub hu_int hc_int] + _ = cubeAverage Q u - cubeAverage Q (fun _ => c) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + _ = cubeAverage Q u - c := by rw [cubeAverage_const] + +@[simp] theorem cubeFluctuation_sub_const {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (c : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeFluctuation Q (fun x => u x - c) = cubeFluctuation Q u := by + funext x + simp [cubeFluctuation, cubeAverage_sub_const, hu] + +theorem norm_sub_cubeAverageVec_le_cubeLpNorm_infty_sub_const {d : ℕ} + (Q : TriadicCube d) (ξ : Vec d → Vec d) (x : Vec d) + (hξ : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + ‖ξ x - cubeAverageVec Q ξ‖ ≤ cubeLpNorm Q ∞ (fun y => ξ y - ξ x) := by + have hξ_sub : + MeasureTheory.MemLp (fun y => ξ y - ξ x) ∞ (normalizedCubeMeasure Q) := + hξ.sub (MeasureTheory.memLp_const (ξ x)) + have hξ_two : MeasureTheory.MemLp ξ (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hξ.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + calc + ‖ξ x - cubeAverageVec Q ξ‖ = ‖cubeAverageVec Q ξ - ξ x‖ := by + simpa using (norm_sub_rev (ξ x) (cubeAverageVec Q ξ)) + _ = ‖cubeAverageVec Q (fun y => ξ y - ξ x)‖ := by + rw [cubeAverageVec_sub_const Q ξ (ξ x) hξ_two] + _ ≤ cubeLpNorm Q ∞ (fun y => ξ y - ξ x) := + norm_cubeAverageVec_le_cubeLpNorm_infty Q (fun y => ξ y - ξ x) hξ_sub + +theorem norm_sub_cubeAverageVec_le_cubeScaleFactor_mul_of_contDiff_component_bound {d : ℕ} + (Q : TriadicCube d) {ξ : Vec d → Vec d} {B : ℝ} (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + {x : Vec d} (hx : x ∈ cubeSet Q) : + ‖ξ x - cubeAverageVec Q ξ‖ ≤ cubeScaleFactor Q * B := by + have havg : + ‖ξ x - cubeAverageVec Q ξ‖ ≤ cubeLpNorm Q ∞ (fun y => ξ y - ξ x) := + norm_sub_cubeAverageVec_le_cubeLpNorm_infty_sub_const Q ξ x hξLp + have hlinfty : + cubeLpNorm Q ∞ (fun y => ξ y - ξ x) ≤ cubeScaleFactor Q * B := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet Q (hC := mul_nonneg (cubeScaleFactor_nonneg Q) hB) + intro y hy + simpa [norm_sub_rev] using + norm_sub_le_cubeScaleFactor_mul_of_contDiff_component_bound + Q hB hξ hderiv hy hx + exact le_trans havg hlinfty + +theorem cubeLpNorm_infty_sub_cubeAverageVec_le_cubeScaleFactor_mul_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) {ξ : Vec d → Vec d} {B : ℝ} (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) ≤ cubeScaleFactor Q * B := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet Q (hC := mul_nonneg (cubeScaleFactor_nonneg Q) hB) + intro x hx + exact norm_sub_cubeAverageVec_le_cubeScaleFactor_mul_of_contDiff_component_bound + Q hB hξLp hξ hderiv hx + +theorem norm_cubeAverage_le_cubeLpNorm_infty {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) : + ‖cubeAverage Q u‖ ≤ cubeLpNorm Q ∞ u := by + have hconj_top : ENNReal.conjExponent (∞ : ℝ≥0∞) = (1 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (∞ : ℝ≥0∞)) (q := (1 : ℝ≥0∞))) + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (ENNReal.conjExponent (∞ : ℝ≥0∞)) (normalizedCubeMeasure Q) := by + simpa [hconj_top] using + (MeasureTheory.memLp_const (1 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (1 : ℝ≥0∞) (normalizedCubeMeasure Q)) + have havg : + ‖cubeAverage Q u‖ ≤ + cubeLpNorm Q ∞ u * cubeLpNorm Q (1 : ℝ≥0∞) (fun _ => (1 : ℝ)) := by + simpa [hconj_top] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + (Q := Q) (p := (∞ : ℝ≥0∞)) (f := u) (g := fun _ => (1 : ℝ)) + hu hconst (by norm_num) + have hnorm_one : cubeLpNorm Q (1 : ℝ≥0∞) (fun _ => (1 : ℝ)) = 1 := by + simpa using cubeLpNorm_const (Q := Q) (p := (1 : ℝ≥0∞)) (c := (1 : ℝ)) (by norm_num) + simpa [hnorm_one] using havg + +theorem norm_cubeAverage_le_cubeLpNorm_two {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ‖cubeAverage Q u‖ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hconj_two : ENNReal.conjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (ENNReal.conjExponent (2 : ℝ≥0∞)) (normalizedCubeMeasure Q) := by + simpa [hconj_two] using + (MeasureTheory.memLp_const (1 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + have havg : + ‖cubeAverage Q u‖ ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * cubeLpNorm Q (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) := by + simpa [hconj_two] using + abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent + (Q := Q) (p := (2 : ℝ≥0∞)) (f := u) (g := fun _ => (1 : ℝ)) + hu hconst (by norm_num) + have hnorm_one : cubeLpNorm Q (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) = 1 := by + simpa using cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) (c := (1 : ℝ)) (by norm_num) + simpa [hnorm_one] using havg + +theorem norm_sub_cubeAverage_le_cubeLpNorm_infty_sub_const {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (x : Vec d) + (hu : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) : + ‖u x - cubeAverage Q u‖ ≤ cubeLpNorm Q ∞ (fun y => u y - u x) := by + have hu_sub : + MeasureTheory.MemLp (fun y => u y - u x) ∞ (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (u x)) + have hu_two : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + calc + ‖u x - cubeAverage Q u‖ = ‖cubeAverage Q u - u x‖ := by + simpa using (norm_sub_rev (u x) (cubeAverage Q u)) + _ = ‖cubeAverage Q (fun y => u y - u x)‖ := by + rw [cubeAverage_sub_const Q u (u x) hu_two] + _ ≤ cubeLpNorm Q ∞ (fun y => u y - u x) := + norm_cubeAverage_le_cubeLpNorm_infty Q (fun y => u y - u x) hu_sub + +theorem cubeLpNorm_infty_sub_cubeAverage_le_cubeScaleFactor_mul_of_contDiff_bound + {d : ℕ} (Q : TriadicCube d) {u : Vec d → ℝ} {B : ℝ} (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeLpNorm Q ∞ (fun x => u x - cubeAverage Q u) ≤ cubeScaleFactor Q * B := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet Q (hC := mul_nonneg (cubeScaleFactor_nonneg Q) hB) + intro x hx + have havg : + ‖u x - cubeAverage Q u‖ ≤ cubeLpNorm Q ∞ (fun y => u y - u x) := + norm_sub_cubeAverage_le_cubeLpNorm_infty_sub_const Q u x huLp + have hlinfty : + cubeLpNorm Q ∞ (fun y => u y - u x) ≤ cubeScaleFactor Q * B := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet Q (hC := mul_nonneg (cubeScaleFactor_nonneg Q) hB) + intro y hy + simpa [norm_sub_rev] using + norm_sub_le_cubeScaleFactor_mul_of_contDiff_bound Q hu hB + (fun z hz => hderiv z hz) hy hx + exact le_trans havg hlinfty + +theorem cubeLpNorm_two_le_cubeLpNorm_infty_of_memLp_infty {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) u ≤ cubeLpNorm Q ∞ u := by + let : MeasureTheory.IsProbabilityMeasure (normalizedCubeMeasure Q) := by + refine ⟨?_⟩ + simp [normalizedCubeMeasure_apply_univ Q] + have hle : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm u ∞ (normalizedCubeMeasure Q) := by + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le (by norm_num) hu.1 + have htoReal := ENNReal.toReal_mono (ne_of_lt hu.2) hle + simpa [cubeLpNorm] using htoReal + +theorem cubeBesovOscillation_two_le_cubeScaleFactor_mul_of_contDiff_bound {d : ℕ} + (Q : TriadicCube d) {u : Vec d → ℝ} {B : ℝ} (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovOscillation Q (2 : ℝ≥0∞) u ≤ cubeScaleFactor Q * B := by + have hfluctLp : + MeasureTheory.MemLp (fun x => u x - cubeAverage Q u) ∞ (normalizedCubeMeasure Q) := + huLp.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + calc + cubeBesovOscillation Q (2 : ℝ≥0∞) u + = cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u) := by + rfl + _ ≤ cubeLpNorm Q ∞ (fun x => u x - cubeAverage Q u) := by + exact cubeLpNorm_two_le_cubeLpNorm_infty_of_memLp_infty Q + (fun x => u x - cubeAverage Q u) hfluctLp + _ ≤ cubeScaleFactor Q * B := by + exact cubeLpNorm_infty_sub_cubeAverage_le_cubeScaleFactor_mul_of_contDiff_bound + Q hB huLp hu hderiv + +theorem cubeBesovDepthSeminorm_one_two_le_of_contDiff_bound {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (j : ℕ) {B : ℝ} + (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) u j ≤ B := by + let A : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg (cubeScaleFactor_nonneg Q) (by positivity) + have hA_pos : 0 < A := by + dsimp [A] + exact div_pos + (by simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hbound : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j ≤ (A * B) ^ (2 : ℝ) := by + unfold cubeBesovDepthAverage + calc + descendantsAverage Q j (fun R => cubeBesovOscillation R (2 : ℝ≥0∞) u ^ ENNReal.toReal 2) + ≤ descendantsAverage Q j (fun _ : TriadicCube d => (A * B) ^ (2 : ℝ)) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have huR : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := ℝ) hR huLp + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ cubeScaleFactor R * B := by + exact cubeBesovOscillation_two_le_cubeScaleFactor_mul_of_contDiff_bound + R hB huR hu (fun z hz => hderiv z (cubeSet_subset_of_mem_descendantsAtDepth hR hz)) + have hRB_eq : cubeScaleFactor R * B = A * B := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hAB_nonneg : 0 ≤ A * B := mul_nonneg hA_nonneg hB + have hsq : + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℝ) ≤ (A * B) ^ (2 : ℝ) := by + rw [← hRB_eq] + exact Real.rpow_le_rpow hosc_nonneg hosc (by norm_num) + simpa using hsq + _ = (A * B) ^ (2 : ℝ) := by + simp [descendantsAverage_const] + have hsqrt : + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ≤ A * B := by + have hAB_nonneg : 0 ≤ A * B := mul_nonneg hA_nonneg hB + calc + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) + ≤ Real.sqrt ((A * B) ^ (2 : ℝ)) := by + exact Real.sqrt_le_sqrt hbound + _ = A * B := by + rw [show (A * B) ^ (2 : ℝ) = (A * B) ^ (2 : ℕ) by norm_num] + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hAB_nonneg] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q 1 j := + cubeBesovDepthWeight_nonneg Q 1 j + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q 1 j * Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) := by + simp [cubeBesovDepthSeminorm, Real.sqrt_eq_rpow] + _ ≤ cubeBesovDepthWeight Q 1 j * (A * B) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = B := by + dsimp [A] + have hinv : + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-1 : ℝ) * + ((cubeScaleFactor Q / (3 : ℝ) ^ j) * B) = + B := by + calc + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-1 : ℝ) * + ((cubeScaleFactor Q / (3 : ℝ) ^ j) * B) + = + ((cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-1 : ℝ) * + (cubeScaleFactor Q / (3 : ℝ) ^ j)) * B := by + ring + _ = B := by + rw [Real.rpow_neg_one, inv_mul_cancel₀ hA_pos.ne', one_mul] + simpa [cubeBesovDepthWeight] using hinv + +theorem cubeBesovPartialSeminormTop_one_two_le_of_contDiff_bound {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {B : ℝ} + (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovPartialSeminormTop Q 1 (2 : ℝ≥0∞) N u ≤ B := by + classical + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le + (s := Finset.range (N + 1)) + (H := ⟨0, by simp⟩) + (f := fun j : ℕ => cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) u j) ?_ + intro j hj + exact cubeBesovDepthSeminorm_one_two_le_of_contDiff_bound Q u j hB huLp hu hderiv + +theorem cubeBesovPartialNormTop_one_two_le_of_contDiff_bound {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {B : ℝ} + (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovPartialNormTop Q 1 (2 : ℝ≥0∞) N u ≤ + B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ u := by + unfold cubeBesovPartialNormTop + exact add_le_add + (cubeBesovPartialSeminormTop_one_two_le_of_contDiff_bound Q u N hB huLp hu hderiv) + (mul_le_mul_of_nonneg_left + (norm_cubeAverage_le_cubeLpNorm_infty Q u huLp) + (cubeBesovScaleWeight_nonneg 1 Q)) + +theorem cubeBesovDualTestNorm_one_two_le_of_contDiff_bound {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {B : ℝ} + (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N u ≤ + B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ u := by + have hq : cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N u hq] + rw [hpConj] + exact cubeBesovPartialNormTop_one_two_le_of_contDiff_bound Q u N hB huLp hu hderiv + +theorem cubeBesovDepthSeminorm_two_le_scaleWeight_mul_scaleFactor_mul_of_contDiff_bound_of_le_one + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (j : ℕ) {s B : ℝ} + (hs1 : s ≤ 1) (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + cubeBesovScaleWeight s Q * cubeScaleFactor Q * B := by + let A : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact div_nonneg (cubeScaleFactor_nonneg Q) (by positivity) + have hA_pos : 0 < A := by + dsimp [A] + exact div_pos + (by simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hbound : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j ≤ (A * B) ^ (2 : ℝ) := by + unfold cubeBesovDepthAverage + calc + descendantsAverage Q j + (fun R => cubeBesovOscillation R (2 : ℝ≥0∞) u ^ ENNReal.toReal 2) + ≤ descendantsAverage Q j (fun _ : TriadicCube d => (A * B) ^ (2 : ℝ)) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have huR : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := ℝ) hR huLp + have hosc : + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ cubeScaleFactor R * B := by + exact cubeBesovOscillation_two_le_cubeScaleFactor_mul_of_contDiff_bound + R hB huR hu + (fun z hz => hderiv z (cubeSet_subset_of_mem_descendantsAtDepth hR hz)) + have hRB_eq : cubeScaleFactor R * B = A * B := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hsq : + (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ (2 : ℝ) ≤ + (A * B) ^ (2 : ℝ) := by + rw [← hRB_eq] + exact Real.rpow_le_rpow hosc_nonneg hosc (by norm_num) + simpa using hsq + _ = (A * B) ^ (2 : ℝ) := by + simp [descendantsAverage_const] + have hsqrt : + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) ≤ A * B := by + have hAB_nonneg : 0 ≤ A * B := mul_nonneg hA_nonneg hB + calc + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) + ≤ Real.sqrt ((A * B) ^ (2 : ℝ)) := by + exact Real.sqrt_le_sqrt hbound + _ = A * B := by + rw [show (A * B) ^ (2 : ℝ) = (A * B) ^ (2 : ℕ) by norm_num] + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hAB_nonneg] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + have hA_le_scale : A ≤ cubeScaleFactor Q := by + dsimp [A] + have hden : (1 : ℝ) ≤ (3 : ℝ) ^ j := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + have hscale_nonneg : 0 ≤ cubeScaleFactor Q := cubeScaleFactor_nonneg Q + calc + cubeScaleFactor Q / (3 : ℝ) ^ j ≤ cubeScaleFactor Q / 1 := by + exact div_le_div_of_nonneg_left hscale_nonneg (by positivity) hden + _ = cubeScaleFactor Q := by ring + have hpow_le : A ^ (1 - s) ≤ (cubeScaleFactor Q) ^ (1 - s) := by + exact Real.rpow_le_rpow hA_nonneg hA_le_scale (sub_nonneg.mpr hs1) + have hweightA : cubeBesovDepthWeight Q s j * A = A ^ (1 - s) := by + dsimp [cubeBesovDepthWeight, A] + calc + A ^ (-s) * A = A ^ (-s) * A ^ (1 : ℝ) := by rw [Real.rpow_one] + _ = A ^ ((-s) + 1) := by rw [← Real.rpow_add hA_pos] + _ = A ^ (1 - s) := by ring_nf + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hscale_eq : + cubeBesovScaleWeight s Q * cubeScaleFactor Q = + (cubeScaleFactor Q) ^ (1 - s) := by + unfold cubeBesovScaleWeight + calc + (cubeScaleFactor Q) ^ (-s) * cubeScaleFactor Q = + (cubeScaleFactor Q) ^ (-s) * (cubeScaleFactor Q) ^ (1 : ℝ) := by + rw [Real.rpow_one] + _ = (cubeScaleFactor Q) ^ ((-s) + 1) := by rw [← Real.rpow_add hscale_pos] + _ = (cubeScaleFactor Q) ^ (1 - s) := by ring_nf + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q s j * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) u j) := by + simp [cubeBesovDepthSeminorm, Real.sqrt_eq_rpow] + _ ≤ cubeBesovDepthWeight Q s j * (A * B) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = (cubeBesovDepthWeight Q s j * A) * B := by ring + _ = A ^ (1 - s) * B := by rw [hweightA] + _ ≤ (cubeScaleFactor Q) ^ (1 - s) * B := by + exact mul_le_mul_of_nonneg_right hpow_le hB + _ = cubeBesovScaleWeight s Q * cubeScaleFactor Q * B := by rw [← hscale_eq] + +theorem cubeBesovPartialSeminormTop_two_le_scaleWeight_mul_scaleFactor_mul_of_contDiff_bound_of_le_one + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {s B : ℝ} + (hs1 : s ≤ 1) (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N u ≤ + cubeBesovScaleWeight s Q * cubeScaleFactor Q * B := by + classical + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le + (s := Finset.range (N + 1)) + (H := ⟨0, by simp⟩) + (f := fun j : ℕ => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ?_ + intro j hj + exact + cubeBesovDepthSeminorm_two_le_scaleWeight_mul_scaleFactor_mul_of_contDiff_bound_of_le_one + Q u j hs1 hB huLp hu hderiv + +theorem cubeBesovPartialNormTop_two_le_scaleWeight_mul_of_contDiff_bound_of_le_one + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {s B : ℝ} + (hs1 : s ≤ 1) (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovPartialNormTop Q s (2 : ℝ≥0∞) N u ≤ + cubeBesovScaleWeight s Q * (cubeScaleFactor Q * B + cubeLpNorm Q ∞ u) := by + unfold cubeBesovPartialNormTop + calc + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q u‖ + ≤ cubeBesovScaleWeight s Q * cubeScaleFactor Q * B + + cubeBesovScaleWeight s Q * cubeLpNorm Q ∞ u := by + exact add_le_add + (cubeBesovPartialSeminormTop_two_le_scaleWeight_mul_scaleFactor_mul_of_contDiff_bound_of_le_one + Q u N hs1 hB huLp hu hderiv) + (mul_le_mul_of_nonneg_left + (norm_cubeAverage_le_cubeLpNorm_infty Q u huLp) + (cubeBesovScaleWeight_nonneg s Q)) + _ = cubeBesovScaleWeight s Q * (cubeScaleFactor Q * B + cubeLpNorm Q ∞ u) := by + ring + +theorem cubeBesovDualTestNorm_two_one_le_scaleWeight_mul_of_contDiff_bound_of_le_one + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (N : ℕ) {s B : ℝ} + (hs1 : s ≤ 1) (hB : 0 ≤ B) + (huLp : MeasureTheory.MemLp u ∞ (normalizedCubeMeasure Q)) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ u z‖ ≤ B) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N u ≤ + cubeBesovScaleWeight s Q * (cubeScaleFactor Q * B + cubeLpNorm Q ∞ u) := by + have hq : cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N u hq] + rw [hpConj] + exact cubeBesovPartialNormTop_two_le_scaleWeight_mul_of_contDiff_bound_of_le_one + Q u N hs1 hB huLp hu hderiv + +theorem cubeBesovDualTestNorm_one_two_component_le_of_contDiff_component_bound {d : ℕ} + (Q : TriadicCube d) (ξ : Vec d → Vec d) (i : Fin d) (N : ℕ) {B : ℝ} + (hB : 0 ≤ B) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => ξ x i) ≤ + B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := by + have hcompLp : MeasureTheory.MemLp (fun x => ξ x i) ∞ (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hξLp + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => ξ x i) + ≤ B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ (fun x => ξ x i) := by + exact cubeBesovDualTestNorm_one_two_le_of_contDiff_bound + Q (fun x => ξ x i) N hB hcompLp (hξ i) (fun z hz => hderiv i z hz) + _ ≤ B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := by + exact add_le_add le_rfl <| + mul_le_mul_of_nonneg_left + (cubeLpNorm_component_le_cubeLpNorm Q ∞ ξ i hξLp) + (cubeBesovScaleWeight_nonneg 1 Q) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/LocalPairing.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/LocalPairing.lean new file mode 100644 index 0000000000..9881c74c9c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/LocalPairing.lean @@ -0,0 +1,620 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct + +/-! # Local Pairing -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem abs_cubeAverage_vecDot_scalar_smul_le_collapsed_average_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bg Bavg : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x • ξ x) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + have hprod : + MeasureTheory.MemLp (fun x => u x • ξ x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hu + have hmain := + abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds + Q s flux (fun x => u x • ξ x) hs hflux hprod hBg hneg hpos + have hprod_bound : + ‖cubeAverageVec Q (fun x => u x • ξ x)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := + norm_cubeAverageVec_scalar_smul_le_cubeLpNorm_infty_mul_cubeLpNorm_two Q u ξ hu hξLp + have hprod_bound_nonneg : + 0 ≤ cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + exact mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + have hflux_comp : + ∀ i : Fin d, ‖cubeAverage Q (fun x => flux x i)‖ ≤ Bavg := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hBavg).mp havg i + have hprod_comp : + ∀ i : Fin d, + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hprod_bound_nonneg).mp hprod_bound i + have havg_term : + ∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ + ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + calc + ∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ + ≤ ∑ i : Fin d, Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact mul_le_mul (hflux_comp i) (hprod_comp i) (norm_nonneg _) hBavg + _ = (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + simp + have hweight_nonneg : 0 ≤ cubeBesovScaleWeight s Q := cubeBesovScaleWeight_nonneg s Q + have hnote_scale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := by + exact mul_nonneg hweight_nonneg hBg + have hnote_term : + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => flux x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) + ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + calc + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => flux x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) + ≤ + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hinner : + (3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => flux x i)‖ + ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg := by + exact add_le_add + le_rfl + (mul_le_mul_of_nonneg_left (hflux_comp i) hweight_nonneg) + exact mul_le_mul_of_nonneg_right hinner hnote_scale_nonneg + _ = (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + simp + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + ≤ + (∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => flux x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := hmain + _ ≤ (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havg_term hnote_term + +/-- Sharp local pairing estimate. This is the same average/fluctuation split +as `abs_cubeAverage_vecDot_scalar_smul_le_collapsed_average_note_terms_of_partialBounds`, +but the fluctuation piece uses the circ-only negative Besov duality bound, so +no positive-average tail is present in the Besov term. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bg Bavg : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x • ξ x) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + have hprod : + MeasureTheory.MemLp (fun x => u x • ξ x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hu + have hmain := + abs_cubeAverage_vecDot_le_sum_average_terms_add_sharp_note_terms_of_partialBounds + Q s flux (fun x => u x • ξ x) hs hflux hprod hBg hneg hpos + have hprod_bound : + ‖cubeAverageVec Q (fun x => u x • ξ x)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := + norm_cubeAverageVec_scalar_smul_le_cubeLpNorm_infty_mul_cubeLpNorm_two Q u ξ hu hξLp + have hprod_bound_nonneg : + 0 ≤ cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + exact mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + have hflux_comp : + ∀ i : Fin d, ‖cubeAverage Q (fun x => flux x i)‖ ≤ Bavg := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hBavg).mp havg i + have hprod_comp : + ∀ i : Fin d, + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hprod_bound_nonneg).mp hprod_bound i + have havg_term : + ∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ + ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + calc + ∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖ + ≤ ∑ i : Fin d, Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact mul_le_mul (hflux_comp i) (hprod_comp i) (norm_nonneg _) hBavg + _ = (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + simp + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + ≤ + (∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => (u x • ξ x) i)‖) + + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := hmain + _ ≤ (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havg_term le_rfl + +/-- Sharp local pairing estimate with the positive cutoff-product control +stated directly as componentwise dual-test bounds. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_collapsed_sharp_average_note_terms_of_dualTestBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bg Bavg : ℝ} + (hs : 0 < s) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hdual : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q (fun y => u y • ξ y) x i) ≤ + cubeBesovScaleWeight s Q * Bg) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + let prod : Vec d → Vec d := fun x => u x • ξ x + have hprod : + MeasureTheory.MemLp prod (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [prod] using! hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hu + have hdecomp : + cubeAverage Q (fun x => vecDot (flux x) (prod x)) = + vecDot (cubeAverageVec Q flux) (cubeAverageVec Q prod) + + cubeAverage Q (fun x => vecDot (flux x) (cubeFluctuationVec Q prod x)) := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q flux prod hflux hprod + have hfluct : + |cubeAverage Q (fun x => vecDot (flux x) (cubeFluctuationVec Q prod x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_dualTestBounds + Q s flux prod hs hflux hprod hBg hneg (by + intro i N + simpa [prod] using hdual i N) + have hprod_bound : + ‖cubeAverageVec Q prod‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + simpa [prod] using + norm_cubeAverageVec_scalar_smul_le_cubeLpNorm_infty_mul_cubeLpNorm_two Q u ξ hu hξLp + have hprod_bound_nonneg : + 0 ≤ cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + exact mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + have hflux_comp : + ∀ i : Fin d, ‖cubeAverage Q (fun x => flux x i)‖ ≤ Bavg := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hBavg).mp havg i + have hprod_comp : + ∀ i : Fin d, + ‖cubeAverage Q (fun x => prod x i)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hprod_bound_nonneg).mp hprod_bound i + have havg_term : + |vecDot (cubeAverageVec Q flux) (cubeAverageVec Q prod)| ≤ + (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + calc + |vecDot (cubeAverageVec Q flux) (cubeAverageVec Q prod)| + ≤ ∑ i, ‖cubeAverage Q (fun x => flux x i)‖ * + ‖cubeAverage Q (fun x => prod x i)‖ := by + exact abs_vecDot_cubeAverageVec_le_sum_norm_mul_norm Q flux prod + _ ≤ ∑ i : Fin d, Bavg * + (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact mul_le_mul (hflux_comp i) (hprod_comp i) (norm_nonneg _) hBavg + _ = (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) := by + simp + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = |cubeAverage Q (fun x => vecDot (flux x) (prod x))| := by rfl + _ = |vecDot (cubeAverageVec Q flux) (cubeAverageVec Q prod) + + cubeAverage Q (fun x => vecDot (flux x) (cubeFluctuationVec Q prod x))| := by + rw [hdecomp] + _ ≤ |vecDot (cubeAverageVec Q flux) (cubeAverageVec Q prod)| + + |cubeAverage Q (fun x => vecDot (flux x) (cubeFluctuationVec Q prod x))| := + abs_add_le _ _ + _ ≤ (d : ℝ) * (Bavg * (cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u)) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + exact add_le_add havg_term hfluct + +theorem abs_cubeAverage_vecDot_const_scalar_smul_le_collapsed_note_terms_of_componentDualBounds + {d : ℕ} (Q : TriadicCube d) (flux ξ : Vec d → Vec d) (c : ℝ) {Bu Bg Bavg : ℝ} + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu) + (hnorm : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => c * ξ x i) ≤ Bg) + (hmem : ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => c * ξ x i)) : + |cubeAverage Q (fun x => vecDot (flux x) (c • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg)) := by + have hflux_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hmain := + abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_one_of_nonneg + Q 1 flux (fun x => c • ξ x) (fun _ => Bg) (by norm_num) hflux_comp (fun _ => hBg) + (by + intro i N + simpa [Pi.smul_apply, smul_eq_mul] using hnorm i N) + (by + intro i + simpa [Pi.smul_apply, smul_eq_mul] using hmem i) + have hflux_comp_avg : + ∀ i : Fin d, ‖cubeAverage Q (fun x => flux x i)‖ ≤ Bavg := by + intro i + simpa [cubeAverageVec] using + (pi_norm_le_iff_of_nonneg hBavg).mp havg i + have hBg_nonneg : 0 ≤ Bg := hBg + have hweight_nonneg : 0 ≤ cubeBesovScaleWeight 1 Q := cubeBesovScaleWeight_nonneg 1 Q + have hnote_term : + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) + + cubeBesovScaleWeight 1 Q * ‖cubeAverage Q (fun x => flux x i)‖) * Bg) + ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg)) := by + calc + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) + + cubeBesovScaleWeight 1 Q * ‖cubeAverage Q (fun x => flux x i)‖) * Bg) + ≤ + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) ≤ + cubeBesovScaleWeight (-1) Q * Bu := by + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q 1 flux i hneg + have hinner : + (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) + + cubeBesovScaleWeight 1 Q * ‖cubeAverage Q (fun x => flux x i)‖ + ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg := by + exact add_le_add + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by positivity : 0 ≤ (3 : ℝ)) _)) + (mul_le_mul_of_nonneg_left (hflux_comp_avg i) hweight_nonneg) + exact mul_le_mul_of_nonneg_right hinner hBg_nonneg + _ = (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg)) := by + simp + calc + |cubeAverage Q (fun x => vecDot (flux x) (c • ξ x))| + ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) + + cubeBesovScaleWeight 1 Q * ‖cubeAverage Q (fun x => flux x i)‖) * Bg) := by + simpa using hmain + _ ≤ (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg)) := hnote_term + +/-- Sharp constant-piece pairing estimate. This is the LaTeX +`[a∇u]_{B^{-1}}` line: the full negative Besov dual norm is controlled by the +negative circ norm alone, so the flux side contributes only the +`cubeBesovScaleWeight (-1)` factor. -/ +theorem abs_cubeAverage_vecDot_const_scalar_smul_le_collapsed_sharp_note_terms_of_componentDualBounds + {d : ℕ} (Q : TriadicCube d) (flux ξ : Vec d → Vec d) (c : ℝ) {Bu Bg : ℝ} + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu) + (hnorm : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => c * ξ x i) ≤ Bg) + (hmem : ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => c * ξ x i)) : + |cubeAverage Q (fun x => vecDot (flux x) (c • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu)) * + Bg) := by + have hflux_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hmain := + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_one_of_nonneg + Q 1 flux (fun x => c • ξ x) (fun _ => Bg) (by norm_num) hflux_comp + (fun _ => hBg) + (by + intro i N + simpa [Pi.smul_apply, smul_eq_mul] using hnorm i N) + (by + intro i + simpa [Pi.smul_apply, smul_eq_mul] using hmem i) + have hBg_nonneg : 0 ≤ Bg := hBg + have hnote_term : + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i)) * + Bg) + ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu)) * + Bg) := by + calc + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i)) * + Bg) + ≤ + ∑ i : Fin d, + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu)) * + Bg) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) ≤ + cubeBesovScaleWeight (-1) Q * Bu := by + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q 1 flux i hneg + have hinner : + (3 : ℝ) ^ ((d : ℝ) + 1) * + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => flux x i) + ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) := by + exact mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by positivity : 0 ≤ (3 : ℝ)) _) + exact mul_le_mul_of_nonneg_right hinner hBg_nonneg + _ = (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu)) * + Bg) := by + simp + exact le_trans hmain hnote_term + +theorem abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bavg B Bg : ℝ} + (hB : 0 ≤ B) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hBg_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu) + + cubeBesovScaleWeight 1 Q * Bavg) * Bg)) := by + have hξScaled_infty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hξScaled_two : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hξScaled_infty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => cubeAverage Q u * ξ x i) := by + intro i + simpa [Pi.smul_apply, smul_eq_mul] using + cubeBesovDualLocalMemLpGlobal_component_of_memLp + Q (fun x => (cubeAverage Q u) • ξ x) i hξScaled_two + have huavg : + ‖cubeAverage Q u‖ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := + norm_cubeAverage_le_cubeLpNorm_two Q u hu + have hcoeff_nonneg : 0 ≤ B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := by + exact add_nonneg hB + (mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) (cubeLpNorm_nonneg Q ∞ ξ)) + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeAverage Q u * ξ x i) ≤ Bg := by + intro i N + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeAverage Q u * ξ x i) + ≤ ‖cubeAverage Q u‖ * + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => ξ x i) := by + simpa [smul_eq_mul] using + cubeBesovDualTestNorm_two_one_const_mul_le + Q 1 N (cubeAverage Q u) (fun x => ξ x i) + _ ≤ ‖cubeAverage Q u‖ * (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) := by + exact mul_le_mul_of_nonneg_left + (cubeBesovDualTestNorm_one_two_component_le_of_contDiff_component_bound + Q ξ i N hB hξLp hξ hderiv) + (norm_nonneg _) + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u * (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) := by + exact mul_le_mul_of_nonneg_right huavg hcoeff_nonneg + _ ≤ Bg := hBg_bound + simpa using + abs_cubeAverage_vecDot_const_scalar_smul_le_collapsed_note_terms_of_componentDualBounds + Q flux ξ (cubeAverage Q u) hflux hBg hBavg havg hneg hnorm hmem + +/-- Sharp constant-piece estimate after bounding the cutoff dual-test norm by +the quantitative derivative bound. This is the direct Lean counterpart of +the LaTeX bound +`C 3^k Λ_1(R)^{1/2} |u_R| E_R`, before the local mean is bounded by the +local `L²` norm. -/ +theorem abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu B Bg : ℝ} + (hB : 0 ≤ B) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hBg_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu)) * + Bg) := by + have hξScaled_infty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hξScaled_two : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hξScaled_infty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => cubeAverage Q u * ξ x i) := by + intro i + simpa [Pi.smul_apply, smul_eq_mul] using + cubeBesovDualLocalMemLpGlobal_component_of_memLp + Q (fun x => (cubeAverage Q u) • ξ x) i hξScaled_two + have huavg : + ‖cubeAverage Q u‖ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := + norm_cubeAverage_le_cubeLpNorm_two Q u hu + have hcoeff_nonneg : 0 ≤ B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := by + exact add_nonneg hB + (mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) (cubeLpNorm_nonneg Q ∞ ξ)) + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeAverage Q u * ξ x i) ≤ Bg := by + intro i N + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeAverage Q u * ξ x i) + ≤ ‖cubeAverage Q u‖ * + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => ξ x i) := by + simpa [smul_eq_mul] using + cubeBesovDualTestNorm_two_one_const_mul_le + Q 1 N (cubeAverage Q u) (fun x => ξ x i) + _ ≤ ‖cubeAverage Q u‖ * (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) := by + exact mul_le_mul_of_nonneg_left + (cubeBesovDualTestNorm_one_two_component_le_of_contDiff_component_bound + Q ξ i N hB hξLp hξ hderiv) + (norm_nonneg _) + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u * (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) := by + exact mul_le_mul_of_nonneg_right huavg hcoeff_nonneg + _ ≤ Bg := hBg_bound + simpa using + abs_cubeAverage_vecDot_const_scalar_smul_le_collapsed_sharp_note_terms_of_componentDualBounds + Q flux ξ (cubeAverage Q u) hflux hBg hneg hnorm hmem + +theorem cubeLpNorm_two_le_note_rhs_of_meanZero_projectedDualMeanZeroPoincareEstimate + {d : ℕ} (Q : TriadicCube d) (N : ℕ) (v g : Vec d → ℝ) {C : ℝ} + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C v g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (havg : cubeAverage Q v = 0) (hC : 0 ≤ C) : + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g := by + calc + cubeLpNorm Q (2 : ℝ≥0∞) v + ≤ cubeBesovPartialNormTop Q 0 (2 : ℝ≥0∞) 0 v := + cubeLpNorm_two_le_cubeBesovPartialNormTop_zero Q v hv + _ ≤ cubeBesovPartialNormTop Q 0 (2 : ℝ≥0∞) N v := + cubeBesovPartialNormTop_zero_le Q 0 (2 : ℝ≥0∞) N v + _ ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g := by + simpa using + hproj.partialNormTop_two_le_cubeBesovCircPartialNorm (s := 0) hg havg + (by norm_num) hC + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/OneCube.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/OneCube.lean new file mode 100644 index 0000000000..e12c8a90fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/OneCube.lean @@ -0,0 +1,335 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry + +/-! # One Cube -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeLpNorm_infty_descendant_le {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (f : Vec d → Vec d) + (hf : MeasureTheory.MemLp f ∞ (normalizedCubeMeasure Q)) : + cubeLpNorm R ∞ f ≤ cubeLpNorm Q ∞ f := by + have hsmul_ne_zero : + ENNReal.ofReal (cubeVolume Q / cubeVolume R) ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.2 <| + div_pos (cubeVolume_pos Q) (cubeVolume_pos R) + have hle : + MeasureTheory.eLpNorm f ∞ (normalizedCubeMeasure R) ≤ + MeasureTheory.eLpNorm f ∞ (normalizedCubeMeasure Q) := by + calc + MeasureTheory.eLpNorm f ∞ (normalizedCubeMeasure R) + = MeasureTheory.eLpNorm f ∞ + ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + rw [normalizedCubeMeasure_descendant_eq_smul_restrict hR] + simpa using + (MeasureTheory.eLpNorm_smul_measure_of_ne_zero hsmul_ne_zero f ∞ + ((normalizedCubeMeasure Q).restrict (cubeSet R))) + _ ≤ MeasureTheory.eLpNorm f ∞ (normalizedCubeMeasure Q) := by + exact MeasureTheory.eLpNorm_mono_measure f MeasureTheory.Measure.restrict_le_self + have htoReal := ENNReal.toReal_mono (ne_of_lt hf.2) hle + simpa [cubeLpNorm] using htoReal + +theorem cubeLpNorm_add_le {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → E) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g p (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + cubeLpNorm Q p (fun x => f x + g x) ≤ cubeLpNorm Q p f + cubeLpNorm Q p g := by + have hsum : + MeasureTheory.eLpNorm (fun x => f x + g x) p (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm g p (normalizedCubeMeasure Q) := by + simpa using! MeasureTheory.eLpNorm_add_le hf.1 hg.1 hp + have hsum_top : + MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm g p (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.add_ne_top.2 ⟨ne_of_lt hf.2, ne_of_lt hg.2⟩ + have htoReal := + ENNReal.toReal_mono hsum_top hsum + rw [ENNReal.toReal_add (ne_of_lt hf.2) (ne_of_lt hg.2)] at htoReal + simpa [cubeLpNorm, ne_of_lt hf.2, ne_of_lt hg.2] using htoReal + +theorem cubeLpNorm_two_cubeFluctuationVec_le_two_mul_cubeLpNorm_two {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) ≤ + 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => -cubeAverageVec Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (-cubeAverageVec Q u) + have hadd : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => -cubeAverageVec Q u) := by + have hfun : + cubeFluctuationVec Q u = fun x => u x + (fun _ : Vec d => -cubeAverageVec Q u) x := by + funext x + simp [cubeFluctuationVec, sub_eq_add_neg] + rw [hfun] + exact cubeLpNorm_add_le Q (2 : ℝ≥0∞) u (fun _ : Vec d => -cubeAverageVec Q u) + hu hconst (by norm_num) + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) + ≤ cubeLpNorm Q (2 : ℝ≥0∞) u + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => -cubeAverageVec Q u) := hadd + _ = cubeLpNorm Q (2 : ℝ≥0∞) u + ‖cubeAverageVec Q u‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) (c := -cubeAverageVec Q u) (by norm_num)] + simp + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) u + cubeLpNorm Q (2 : ℝ≥0∞) u := by + gcongr + exact norm_cubeAverageVec_le_cubeLpNorm_two Q u hu + _ = 2 * cubeLpNorm Q (2 : ℝ≥0∞) u := by ring + +theorem cubeLpNorm_two_cubeFluctuationVec_le_two_mul_cubeLpNorm_two_sub_const {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (c : Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) ≤ + 2 * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - c) := by + have hu_sub : + MeasureTheory.MemLp (fun x => u x - c) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const c) + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) + = cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q (fun x => u x - c)) := by + rw [cubeFluctuationVec_sub_const Q u c hu] + _ ≤ 2 * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - c) := + cubeLpNorm_two_cubeFluctuationVec_le_two_mul_cubeLpNorm_two Q (fun x => u x - c) hu_sub + +theorem cubeLpNorm_two_smul_le_mul_cubeLpNorm_infty {d : ℕ} (Q : TriadicCube d) + (v : Vec d → ℝ) (ξ : Vec d → Vec d) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξ : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => v x • ξ x) ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) v := by + have hmul : + MeasureTheory.eLpNorm (fun x => v x • ξ x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm v (2 : ℝ≥0∞) (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm ξ ∞ (normalizedCubeMeasure Q) := by + simpa using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_mul_eLpNorm_top + (p := (2 : ℝ≥0∞)) (f := ξ) hv.1) + have hmul_top : + MeasureTheory.eLpNorm v (2 : ℝ≥0∞) (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm ξ ∞ (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top (ne_of_lt hv.2) (ne_of_lt hξ.2) + have htoReal := ENNReal.toReal_mono hmul_top hmul + simpa [cubeLpNorm, ne_of_lt hv.2, ne_of_lt hξ.2, mul_comm, mul_left_comm, mul_assoc] using htoReal + +theorem norm_cubeAverageVec_scalar_smul_le_cubeLpNorm_infty_mul_cubeLpNorm_two {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξ : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + ‖cubeAverageVec Q (fun x => u x • ξ x)‖ ≤ + cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + calc + ‖cubeAverageVec Q (fun x => u x • ξ x)‖ + ≤ cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x • ξ x) := by + exact norm_cubeAverageVec_le_cubeLpNorm_two Q (fun x => u x • ξ x) <| + by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + simpa using! hξ.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hu + _ ≤ cubeLpNorm Q ∞ ξ * cubeLpNorm Q (2 : ℝ≥0∞) u := by + exact cubeLpNorm_two_smul_le_mul_cubeLpNorm_infty Q u ξ hu hξ + +theorem cubeLpNorm_two_scalarFluctuation_smul_const_le {d : ℕ} (Q : TriadicCube d) + (v : Vec d → ℝ) (c : Vec d) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => cubeFluctuation Q v x • c) ≤ + ‖c‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + have hv_fluct : + MeasureTheory.MemLp (cubeFluctuation Q v) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hv.sub (MeasureTheory.memLp_const (cubeAverage Q v)) + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => c) ∞ (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const c + have hmul : + MeasureTheory.eLpNorm (fun x => cubeFluctuation Q v x • c) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm (cubeFluctuation Q v) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm (fun _ : Vec d => c) ∞ (normalizedCubeMeasure Q) := by + simpa using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_mul_eLpNorm_top + (p := (2 : ℝ≥0∞)) (f := fun _ : Vec d => c) hv_fluct.1) + have hmul_top : + MeasureTheory.eLpNorm (cubeFluctuation Q v) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm (fun _ : Vec d => c) ∞ (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top (ne_of_lt hv_fluct.2) (ne_of_lt hconst.2) + have htoReal := ENNReal.toReal_mono hmul_top hmul + calc + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => cubeFluctuation Q v x • c) + ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) * + cubeLpNorm Q ∞ (fun _ : Vec d => c) := by + simpa [cubeLpNorm, ne_of_lt hv_fluct.2, ne_of_lt hconst.2, + mul_comm, mul_left_comm, mul_assoc] using htoReal + _ = cubeBesovOscillation Q (2 : ℝ≥0∞) v * ‖c‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (∞ : ℝ≥0∞)) (c := c) (by norm_num)] + simp [cubeBesovOscillation] + _ = ‖c‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) v := by ring + +theorem cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_note_terms {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (ξ : Vec d → Vec d) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξ : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q (fun x => v x • ξ x)) ≤ + 2 * (cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + let : ENNReal.HolderTriple (2 : ℝ≥0∞) ∞ (2 : ℝ≥0∞) := by infer_instance + have hprod : + MeasureTheory.MemLp (fun x => v x • ξ x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! hξ.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hv + have hξ_sub : + MeasureTheory.MemLp (fun x => ξ x - cubeAverageVec Q ξ) ∞ (normalizedCubeMeasure Q) := + hξ.sub (MeasureTheory.memLp_const (cubeAverageVec Q ξ)) + have hfirst : + MeasureTheory.MemLp (fun x => v x • (ξ x - cubeAverageVec Q ξ)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! hξ_sub.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hv + have hv_fluct : + MeasureTheory.MemLp (cubeFluctuation Q v) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hv.sub (MeasureTheory.memLp_const (cubeAverage Q v)) + have hsecond : + MeasureTheory.MemLp (fun x => cubeFluctuation Q v x • cubeAverageVec Q ξ) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! + (MeasureTheory.memLp_const (cubeAverageVec Q ξ)).smul + (p := (2 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) hv_fluct + have hsplit : + (fun x => v x • ξ x - cubeAverage Q v • cubeAverageVec Q ξ) = + fun x => v x • (ξ x - cubeAverageVec Q ξ) + + cubeFluctuation Q v x • cubeAverageVec Q ξ := by + funext x + ext i + simp [cubeFluctuation, sub_eq_add_neg] + ring + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q (fun x => v x • ξ x)) + ≤ 2 * cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => v x • ξ x - cubeAverage Q v • cubeAverageVec Q ξ) := by + exact cubeLpNorm_two_cubeFluctuationVec_le_two_mul_cubeLpNorm_two_sub_const + Q (fun x => v x • ξ x) (cubeAverage Q v • cubeAverageVec Q ξ) hprod + _ = 2 * cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => v x • (ξ x - cubeAverageVec Q ξ) + + cubeFluctuation Q v x • cubeAverageVec Q ξ) := by + rw [hsplit] + _ ≤ 2 * (cubeLpNorm Q (2 : ℝ≥0∞) (fun x => v x • (ξ x - cubeAverageVec Q ξ)) + + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => cubeFluctuation Q v x • cubeAverageVec Q ξ)) := by + gcongr + exact cubeLpNorm_add_le Q (2 : ℝ≥0∞) + (fun x => v x • (ξ x - cubeAverageVec Q ξ)) + (fun x => cubeFluctuation Q v x • cubeAverageVec Q ξ) + hfirst hsecond (by norm_num) + _ ≤ 2 * (cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * cubeLpNorm Q (2 : ℝ≥0∞) v + + ‖cubeAverageVec Q ξ‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + gcongr + · exact cubeLpNorm_two_smul_le_mul_cubeLpNorm_infty Q v + (fun x => ξ x - cubeAverageVec Q ξ) hv hξ_sub + · exact cubeLpNorm_two_scalarFluctuation_smul_const_le Q v (cubeAverageVec Q ξ) hv + _ ≤ 2 * (cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + have hosc_nonneg : 0 ≤ cubeBesovOscillation Q (2 : ℝ≥0∞) v := + cubeBesovOscillation_nonneg Q (2 : ℝ≥0∞) v + have hmul : + ‖cubeAverageVec Q ξ‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) v ≤ + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + exact mul_le_mul_of_nonneg_right + (norm_cubeAverageVec_le_cubeLpNorm_infty Q ξ hξ) hosc_nonneg + have hadd : + cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * + cubeLpNorm Q (2 : ℝ≥0∞) v + + ‖cubeAverageVec Q ξ‖ * cubeBesovOscillation Q (2 : ℝ≥0∞) v ≤ + cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * + cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + exact add_le_add le_rfl hmul + exact mul_le_mul_of_nonneg_left hadd (by norm_num) + +theorem cubeLpNorm_two_cubeFluctuationVec_centered_scalar_smul_le_note_terms {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξ : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) + (cubeFluctuationVec Q (fun x => (u x - cubeAverage Q u) • ξ x)) ≤ + 2 * (cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u)) := by + have hu_centered : + MeasureTheory.MemLp (fun x => u x - cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + simpa using + cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_note_terms + Q (fun x => u x - cubeAverage Q u) ξ hu_centered hξ + +theorem cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (v : Vec d → ℝ) (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q (fun x => v x • ξ x)) ≤ + 2 * ((cubeScaleFactor Q * B) * cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + have hoscξ : + cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) ≤ cubeScaleFactor Q * B := + cubeLpNorm_infty_sub_cubeAverageVec_le_cubeScaleFactor_mul_of_contDiff_component_bound + Q hB hξLp hξ hderiv + calc + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q (fun x => v x • ξ x)) + ≤ 2 * (cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * + cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + exact cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_note_terms + Q v ξ hv hξLp + _ ≤ 2 * ((cubeScaleFactor Q * B) * cubeLpNorm Q (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation Q (2 : ℝ≥0∞) v) := by + have hv_nonneg : 0 ≤ cubeLpNorm Q (2 : ℝ≥0∞) v := + cubeLpNorm_nonneg Q (2 : ℝ≥0∞) v + have hmul : + cubeLpNorm Q ∞ (fun x => ξ x - cubeAverageVec Q ξ) * + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ + (cubeScaleFactor Q * B) * cubeLpNorm Q (2 : ℝ≥0∞) v := by + exact mul_le_mul_of_nonneg_right hoscξ hv_nonneg + exact mul_le_mul_of_nonneg_left (add_le_add hmul le_rfl) (by norm_num) + +theorem cubeLpNorm_two_cubeFluctuationVec_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) {B : ℝ} + (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeLpNorm Q (2 : ℝ≥0∞) + (cubeFluctuationVec Q (fun x => (u x - cubeAverage Q u) • ξ x)) ≤ + 2 * ((cubeScaleFactor Q * B) * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u x - cubeAverage Q u)) := by + have hu_centered : + MeasureTheory.MemLp (fun x => u x - cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + simpa using + cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q (fun x => u x - cubeAverage Q u) ξ hB hu_centered hξLp hξ hderiv + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms.lean new file mode 100644 index 0000000000..ce2cda9a7c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Bounds + +/-! # Positive Seminorms -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Bounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Bounds.lean new file mode 100644 index 0000000000..80e2b654e5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Bounds.lean @@ -0,0 +1,727 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms.Definitions + +/-! # Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeBesovScaleWeight_neg_mul_cubeBesovDepthWeight_eq_rpow_three_weight {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovScaleWeight (-s) Q * cubeBesovDepthWeight Q s j = + Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + have hQ : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow : 0 < (3 : ℝ) ^ j := by positivity + calc + cubeBesovScaleWeight (-s) Q * cubeBesovDepthWeight Q s j + = (cubeScaleFactor Q) ^ s * ((cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹) ^ s := by + simp [cubeBesovScaleWeight, cubeBesovDepthWeight, Real.rpow_neg_eq_inv_rpow] + _ = (cubeScaleFactor Q) ^ s * (((3 : ℝ) ^ j / cubeScaleFactor Q) ^ s) := by + congr 1 + field_simp [hQ.ne', hpow.ne'] + _ = (cubeScaleFactor Q * ((3 : ℝ) ^ j / cubeScaleFactor Q)) ^ s := by + symm + exact Real.mul_rpow hQ.le (div_nonneg (by positivity) hQ.le) + _ = ((3 : ℝ) ^ j) ^ s := by + congr 1 + field_simp [hQ.ne'] + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + simpa [mul_comm] using + (Real.rpow_natCast_mul (by positivity : 0 ≤ (3 : ℝ)) j s).symm + +theorem cubeBesovPositiveScalarDepthSeminorm_eq_scaleWeight_neg_mul_cubeBesovDepthSeminorm_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + cubeBesovPositiveScalarDepthSeminorm Q s v j = + cubeBesovScaleWeight (-s) Q * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j := by + have havg : + cubeBesovPositiveScalarDepthAverage Q v j = + cubeBesovDepthAverage Q (2 : ℝ≥0∞) v j := by + simp [cubeBesovPositiveScalarDepthAverage, cubeBesovDepthAverage] + have havg_nonneg : + 0 ≤ cubeBesovDepthAverage Q (2 : ℝ≥0∞) v j := + cubeBesovDepthAverage_nonneg Q (2 : ℝ≥0∞) v j + calc + cubeBesovPositiveScalarDepthSeminorm Q s v j + = Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) v j) := by + rw [cubeBesovPositiveScalarDepthSeminorm, havg] + _ = cubeBesovScaleWeight (-s) Q * + (cubeBesovDepthWeight Q s j * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) v j)) := by + rw [← cubeBesovScaleWeight_neg_mul_cubeBesovDepthWeight_eq_rpow_three_weight Q s j] + ring + _ = cubeBesovScaleWeight (-s) Q * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j := by + congr 1 + simp [cubeBesovDepthSeminorm, Real.sqrt_eq_rpow] + +theorem cubeBesovPositiveScalarPartialSeminormTwo_eq_scaleWeight_neg_mul_cubeBesovPartialSeminorm_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) : + cubeBesovPositiveScalarPartialSeminormTwo Q s N v = + cubeBesovScaleWeight (-s) Q * cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N v := by + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + calc + cubeBesovPositiveScalarPartialSeminormTwo Q s N v + = Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovPositiveScalarDepthSeminorm Q s v j) ^ 2) := by + rfl + _ = Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovScaleWeight (-s) Q * cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j) ^ 2) := by + refine congrArg Real.sqrt ?_ + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovPositiveScalarDepthSeminorm_eq_scaleWeight_neg_mul_cubeBesovDepthSeminorm_two] + _ = cubeBesovScaleWeight (-s) Q * + Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j) ^ 2) := by + exact sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) + (cubeBesovScaleWeight (-s) Q) + (fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) v j) + hscale_nonneg + _ = cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N v := by + rw [cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq] + +theorem CubeMultiscalePoincareInput.partialSeminorm_two_two_le_geometric_mul_cubeBesovCircPartialNorm + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hinput : CubeMultiscalePoincareInput Q C u g M) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + let r : ℝ := (3 : ℝ) ^ (-s) + let a : ℕ → ℝ := fun k => cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) g k + let A : ℕ → ℕ → ℝ := fun j n => if j + n ≤ M then r ^ n * a (j + n) else 0 + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hsum_r : + ∑ n ∈ Finset.range (M + 1), r ^ n ≤ (1 - r)⁻¹ := by + exact geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one + have hA_nonneg : + ∀ j ∈ Finset.range (M + 1), ∀ n ∈ Finset.range (M + 1), 0 ≤ A j n := by + intro j hj n hn + by_cases hjn : j + n ≤ M + · simp [A, hjn] + exact mul_nonneg (pow_nonneg hr_nonneg n) + (cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) g (j + n)) + · simp [A, hjn] + have hinner : + ∀ j ∈ Finset.range (M + 1), + ∑ n ∈ Finset.range (M + 1), A j n = + ∑ n ∈ Finset.range (M - j + 1), r ^ n * a (j + n) := by + intro j hj + have hsubset : Finset.range (M - j + 1) ⊆ Finset.range (M + 1) := by + intro n hn + have hnlt : n < M - j + 1 := Finset.mem_range.mp hn + exact Finset.mem_range.mpr (by omega) + calc + ∑ n ∈ Finset.range (M + 1), A j n + = ∑ n ∈ Finset.range (M - j + 1), A j n := by + symm + refine Finset.sum_subset hsubset ?_ + intro n hn hnot + have hnlt : n < M + 1 := Finset.mem_range.mp hn + have hnotlt : ¬ n < M - j + 1 := by + simpa [Finset.mem_range] using hnot + have hjn : ¬ j + n ≤ M := by + omega + simp [A, hjn] + _ = ∑ n ∈ Finset.range (M - j + 1), r ^ n * a (j + n) := by + refine Finset.sum_congr rfl ?_ + intro n hn + have hnlt : n < M - j + 1 := Finset.mem_range.mp hn + have hjle : j ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + have hjn : j + n ≤ M := by + omega + simp [A, hjn] + have hdepth : + ∀ j ∈ Finset.range (M + 1), + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ n ∈ Finset.range (M + 1), A j n := by + intro j hj + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * ∑ n ∈ Finset.range (M - j + 1), r ^ n * a (j + n) := by + simpa [r, a] using + cubeBesovDepthSeminorm_two_le_weighted_shifted_of_local_circ_bound + Q s C u g j (M - j) hC (hinput.bound j hj) + _ = C * ∑ n ∈ Finset.range (M + 1), A j n := by + rw [hinner j hj] + have hsq_bound : + ∑ j ∈ Finset.range (M + 1), (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 ≤ + ∑ j ∈ Finset.range (M + 1), (C * ∑ n ∈ Finset.range (M + 1), A j n) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro j hj + have hleft_nonneg : 0 ≤ cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j := + cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) u j + have hright_nonneg : 0 ≤ C * ∑ n ∈ Finset.range (M + 1), A j n := by + exact mul_nonneg hC (Finset.sum_nonneg fun n hn => hA_nonneg j hj n hn) + nlinarith [hdepth j hj, hleft_nonneg, hright_nonneg] + have hcolumns : + ∀ n ∈ Finset.range (M + 1), + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j n) ^ 2) ≤ + r ^ n * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + intro n hn + have hcol_nonneg : ∀ j ∈ Finset.range (M + 1), 0 ≤ A j n := by + intro j hj + exact hA_nonneg j hj n hn + have hsum_col : + ∑ j ∈ Finset.range (M + 1), A j n = + ∑ j ∈ Finset.range (M - n + 1), r ^ n * a (j + n) := by + have hsubset : Finset.range (M - n + 1) ⊆ Finset.range (M + 1) := by + intro j hj + have hjlt : j < M - n + 1 := Finset.mem_range.mp hj + exact Finset.mem_range.mpr (by omega) + calc + ∑ j ∈ Finset.range (M + 1), A j n + = ∑ j ∈ Finset.range (M - n + 1), A j n := by + symm + refine Finset.sum_subset hsubset ?_ + intro j hj hnot + have hjlt : j < M + 1 := Finset.mem_range.mp hj + have hnotlt : ¬ j < M - n + 1 := by + simpa [Finset.mem_range] using hnot + have hjn : ¬ j + n ≤ M := by + omega + simp [A, hjn] + _ = ∑ j ∈ Finset.range (M - n + 1), r ^ n * a (j + n) := by + refine Finset.sum_congr rfl ?_ + intro j hj + have hjlt : j < M - n + 1 := Finset.mem_range.mp hj + have hnle : n ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hjn : j + n ≤ M := by + omega + simp [A, hjn] + calc + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j n) ^ 2) + ≤ ∑ j ∈ Finset.range (M + 1), A j n := + sqrt_sum_sq_le_sum (Finset.range (M + 1)) (fun j => A j n) hcol_nonneg + _ = ∑ j ∈ Finset.range (M - n + 1), r ^ n * a (j + n) := hsum_col + _ = r ^ n * ∑ j ∈ Finset.range (M - n + 1), a (j + n) := by + rw [Finset.mul_sum] + _ ≤ r ^ n * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + refine mul_le_mul_of_nonneg_left ?_ (pow_nonneg hr_nonneg n) + have hnle : n ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + simpa [a, Nat.add_comm, Nat.add_sub_of_le hnle] using + shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) n (M - n) g + have hcolsum : + ∑ n ∈ Finset.range (M + 1), + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j n) ^ 2) ≤ + ∑ n ∈ Finset.range (M + 1), + r ^ n * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + refine Finset.sum_le_sum ?_ + intro n hn + exact hcolumns n hn + have hcircnonneg : + 0 ≤ cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := + cubeBesovCircPartialNorm_nonneg Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g + calc + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M u + = Real.sqrt (∑ j ∈ Finset.range (M + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) := by + rw [cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq] + _ ≤ Real.sqrt (∑ j ∈ Finset.range (M + 1), + (C * ∑ n ∈ Finset.range (M + 1), A j n) ^ 2) := by + exact Real.sqrt_le_sqrt hsq_bound + _ = C * Real.sqrt (∑ j ∈ Finset.range (M + 1), + (∑ n ∈ Finset.range (M + 1), A j n) ^ 2) := by + exact sqrt_sum_sq_const_mul_eq (Finset.range (M + 1)) C + (fun j => ∑ n ∈ Finset.range (M + 1), A j n) hC + _ ≤ C * ∑ n ∈ Finset.range (M + 1), + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j n) ^ 2) := by + refine mul_le_mul_of_nonneg_left ?_ hC + exact sqrt_sum_sq_sum_le_sum_sqrt_sum_sq + (Finset.range (M + 1)) (Finset.range (M + 1)) A hA_nonneg + _ ≤ C * ∑ n ∈ Finset.range (M + 1), + r ^ n * cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact mul_le_mul_of_nonneg_left hcolsum hC + _ = C * ((∑ n ∈ Finset.range (M + 1), r ^ n) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g) := by + rw [Finset.sum_mul] + _ ≤ C * ((1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hsum_r hcircnonneg) hC + _ = C * (1 - r)⁻¹ * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + ring + +theorem cubeBesovDepthSeminorm_two_le_weighted_shifted_sum_components_of_vector_local_circ_bound + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (u : Vec d → ℝ) (G : Vec d → Vec d) + (j N : ℕ) (hC : 0 ≤ C) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ + C * ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + classical + let I : Finset (Fin d × ℕ) := + (Finset.univ : Finset (Fin d)).product (Finset.range (N + 1)) + let S : TriadicCube d → ℝ := fun R => + ∑ p ∈ I, + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2 + have hlocalS : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u ≤ C * S R := by + intro R hR + calc + cubeBesovOscillation R (2 : ℝ≥0∞) u + ≤ C * ∑ i : Fin d, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) := hlocal R hR + _ = C * S R := by + congr 1 + simp [S, I, cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm, + Finset.sum_product] + have hS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ S R := by + intro R hR + exact Finset.sum_nonneg fun p hp => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2 + have hsq_bound : + descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) ≤ + descendantsAverage Q j (fun R => (C * S R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) u := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) u + have hCS_nonneg : 0 ≤ C * S R := mul_nonneg hC (hS_nonneg R hR) + nlinarith [hlocalS R hR, hosc_nonneg, hCS_nonneg] + have hleft_nonneg : + 0 ≤ descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_bound : + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) ≤ + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft_nonneg hsq_bound (by positivity) + have hfactor : + descendantsAverage Q j (fun R => (C * S R) ^ 2) = + C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (C * S R) ^ 2) + = descendantsAverage Q j (fun R => C ^ 2 * (S R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = C ^ 2 * descendantsAverage Q j (fun R => (S R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (C ^ 2) (fun R => (S R) ^ 2)] + have hSsq_nonneg : 0 ≤ descendantsAverage Q j (fun R => (S R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_factor : + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) = + C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [hfactor, Real.mul_rpow (sq_nonneg C) hSsq_nonneg] + congr 1 + rw [sq_rpow_half_eq_of_nonneg hC] + have hM : + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) := by + exact descendantsAverage_L2_sum_le_sum_descendantsAverage_L2 Q j I + (fun R p => + cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + (fun R hR p hp => + cubeBesovCircDepthSeminorm_nonneg R 1 (2 : ℝ≥0∞) (fun x => G x p.1) p.2) + have hshift : + ∀ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) = + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + intro p hp + have hnonneg : + 0 ≤ cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => G x p.1) (j + p.2) := + cubeBesovCircDepthSeminorm_nonneg Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + rw [descendantsAverage_sq_cubeBesovCircDepthSeminorm_eq_shifted] + exact sq_rpow_half_eq_of_nonneg hnonneg + have hsum_reindex : + ∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ) + = + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + refine Finset.sum_congr rfl ?_ + intro p hp + exact hshift p hp + have hweighted : + ∑ p ∈ I, + cubeBesovDepthWeight Q s j * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) + = + ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + simp [I, Finset.sum_product, + cubeBesovDepthWeight_mul_cubeBesovCircDepthSeminorm_shift_eq_geom_mul] + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + have hCweight_nonneg : 0 ≤ C * cubeBesovDepthWeight Q s j := + mul_nonneg hC hweight_nonneg + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + = cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) u) ^ 2)) ^ + (1 / 2 : ℝ) := by + simp [cubeBesovDepthSeminorm, cubeBesovDepthAverage] + _ ≤ cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (C * S R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hroot_bound hweight_nonneg + _ = cubeBesovDepthWeight Q s j * + (C * (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ)) := by + rw [hroot_factor] + _ = C * cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (S R) ^ 2)) ^ (1 / 2 : ℝ) := by + ring + _ ≤ C * cubeBesovDepthWeight Q s j * + (∑ p ∈ I, + (descendantsAverage Q j + (fun R => + (cubeBesovCircDepthSeminorm R 1 (2 : ℝ≥0∞) + (fun x => G x p.1) p.2) ^ 2)) ^ (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hM hCweight_nonneg + _ = C * cubeBesovDepthWeight Q s j * + ∑ p ∈ I, + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + rw [hsum_reindex] + _ = C * ∑ p ∈ I, + cubeBesovDepthWeight Q s j * + cubeBesovCircDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => G x p.1) (j + p.2) := by + rw [mul_assoc, Finset.mul_sum] + _ = C * ∑ i : Fin d, ∑ n ∈ Finset.range (N + 1), + ((3 : ℝ) ^ (-s)) ^ n * + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x i) (j + n) := by + rw [hweighted] + +theorem CubeLocalMultiscalePoincareVectorEstimate.partialSeminorm_two_two_le_geometric_mul_card_mul_of_component_bound + {d : ℕ} {Q : TriadicCube d} {s C Bcirc : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareVectorEstimate Q C u G M) + (hs : 0 < s) (hC : 0 ≤ C) (hBcirc : 0 ≤ Bcirc) + (hcirc : ∀ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M u ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + classical + let r : ℝ := (3 : ℝ) ^ (-s) + let a : Fin d → ℕ → ℝ := fun i k => + cubeBesovCircDepthSeminorm Q (1 - s) (2 : ℝ≥0∞) (fun x => G x i) k + let I : Finset (Fin d × ℕ) := + (Finset.univ : Finset (Fin d)).product (Finset.range (M + 1)) + let A : ℕ → Fin d × ℕ → ℝ := fun j p => + if j + p.2 ≤ M then r ^ p.2 * a p.1 (j + p.2) else 0 + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hsum_r : + ∑ n ∈ Finset.range (M + 1), r ^ n ≤ (1 - r)⁻¹ := by + exact geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one + have hA_nonneg : + ∀ j ∈ Finset.range (M + 1), ∀ p ∈ I, 0 ≤ A j p := by + intro j hj p hp + by_cases hjp : j + p.2 ≤ M + · simp [A, hjp] + exact mul_nonneg (pow_nonneg hr_nonneg p.2) + (cubeBesovCircDepthSeminorm_nonneg Q (1 - s) (2 : ℝ≥0∞) + (fun x => G x p.1) (j + p.2)) + · simp [A, hjp] + have hinner : + ∀ j ∈ Finset.range (M + 1), + ∑ p ∈ I, A j p = + ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), r ^ n * a i (j + n) := by + intro j hj + have hsubset : Finset.range (M - j + 1) ⊆ Finset.range (M + 1) := by + intro n hn + have hnlt : n < M - j + 1 := Finset.mem_range.mp hn + exact Finset.mem_range.mpr (by omega) + calc + ∑ p ∈ I, A j p + = ∑ i : Fin d, ∑ n ∈ Finset.range (M + 1), A j (i, n) := by + simp [I, Finset.sum_product] + _ = ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), A j (i, n) := by + refine Finset.sum_congr rfl ?_ + intro i hi + symm + refine Finset.sum_subset hsubset ?_ + intro n hn hnot + have hnlt : n < M + 1 := Finset.mem_range.mp hn + have hnotlt : ¬ n < M - j + 1 := by + simpa [Finset.mem_range] using hnot + have hjn : ¬ j + n ≤ M := by + omega + simp [A, hjn] + _ = ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), r ^ n * a i (j + n) := by + refine Finset.sum_congr rfl ?_ + intro i hi + refine Finset.sum_congr rfl ?_ + intro n hn + have hnlt : n < M - j + 1 := Finset.mem_range.mp hn + have hjle : j ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj) + have hjn : j + n ≤ M := by + omega + simp [A, hjn] + have hdepth : + ∀ j ∈ Finset.range (M + 1), + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j ≤ + C * ∑ p ∈ I, A j p := by + intro j hj + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j + ≤ C * ∑ i : Fin d, ∑ n ∈ Finset.range (M - j + 1), + r ^ n * a i (j + n) := by + simpa [r, a] using + cubeBesovDepthSeminorm_two_le_weighted_shifted_sum_components_of_vector_local_circ_bound + Q s C u G j (M - j) hC (by + intro R hR + exact hlocal j hj R hR) + _ = C * ∑ p ∈ I, A j p := by + rw [hinner j hj] + have hsq_bound : + ∑ j ∈ Finset.range (M + 1), (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2 ≤ + ∑ j ∈ Finset.range (M + 1), (C * ∑ p ∈ I, A j p) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro j hj + have hleft_nonneg : 0 ≤ cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j := + cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) u j + have hright_nonneg : 0 ≤ C * ∑ p ∈ I, A j p := by + exact mul_nonneg hC (Finset.sum_nonneg fun p hp => hA_nonneg j hj p hp) + nlinarith [hdepth j hj, hleft_nonneg, hright_nonneg] + have hcolumns : + ∀ p ∈ I, + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j p) ^ 2) ≤ + r ^ p.2 * Bcirc := by + intro p hp + have hp_range : p.2 ∈ Finset.range (M + 1) := (Finset.mem_product.mp hp).2 + have hcol_nonneg : ∀ j ∈ Finset.range (M + 1), 0 ≤ A j p := by + intro j hj + exact hA_nonneg j hj p hp + have hsum_col : + ∑ j ∈ Finset.range (M + 1), A j p = + ∑ j ∈ Finset.range (M - p.2 + 1), r ^ p.2 * a p.1 (j + p.2) := by + have hsubset : Finset.range (M - p.2 + 1) ⊆ Finset.range (M + 1) := by + intro j hj + have hjlt : j < M - p.2 + 1 := Finset.mem_range.mp hj + exact Finset.mem_range.mpr (by omega) + calc + ∑ j ∈ Finset.range (M + 1), A j p + = ∑ j ∈ Finset.range (M - p.2 + 1), A j p := by + symm + refine Finset.sum_subset hsubset ?_ + intro j hj hnot + have hjlt : j < M + 1 := Finset.mem_range.mp hj + have hnotlt : ¬ j < M - p.2 + 1 := by + simpa [Finset.mem_range] using hnot + have hjp : ¬ j + p.2 ≤ M := by + omega + simp [A, hjp] + _ = ∑ j ∈ Finset.range (M - p.2 + 1), r ^ p.2 * a p.1 (j + p.2) := by + refine Finset.sum_congr rfl ?_ + intro j hj + have hjlt : j < M - p.2 + 1 := Finset.mem_range.mp hj + have hple : p.2 ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hp_range) + have hjp : j + p.2 ≤ M := by + omega + simp [A, hjp] + calc + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j p) ^ 2) + ≤ ∑ j ∈ Finset.range (M + 1), A j p := + sqrt_sum_sq_le_sum (Finset.range (M + 1)) (fun j => A j p) hcol_nonneg + _ = ∑ j ∈ Finset.range (M - p.2 + 1), r ^ p.2 * a p.1 (j + p.2) := hsum_col + _ = r ^ p.2 * ∑ j ∈ Finset.range (M - p.2 + 1), a p.1 (j + p.2) := by + rw [Finset.mul_sum] + _ ≤ r ^ p.2 * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x p.1) := by + refine mul_le_mul_of_nonneg_left ?_ (pow_nonneg hr_nonneg p.2) + have hple : p.2 ≤ M := Nat.lt_succ_iff.mp (Finset.mem_range.mp hp_range) + simpa [a, Nat.add_comm, Nat.add_sub_of_le hple] using + shifted_cubeBesovCircDepthSum_le_cubeBesovCircPartialNorm_one + Q (1 - s) (2 : ℝ≥0∞) p.2 (M - p.2) (fun x => G x p.1) + _ ≤ r ^ p.2 * Bcirc := by + exact mul_le_mul_of_nonneg_left (hcirc p.1) (pow_nonneg hr_nonneg p.2) + have hcolsum : + ∑ p ∈ I, + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j p) ^ 2) ≤ + ∑ p ∈ I, r ^ p.2 * Bcirc := by + refine Finset.sum_le_sum ?_ + intro p hp + exact hcolumns p hp + have hpairsum : + ∑ p ∈ I, r ^ p.2 * Bcirc = + (Fintype.card (Fin d) : ℝ) * + ((∑ n ∈ Finset.range (M + 1), r ^ n) * Bcirc) := by + simp [I, Finset.sum_product, Finset.sum_mul, Finset.sum_const, nsmul_eq_mul] + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hpairsum_bound : + ∑ p ∈ I, r ^ p.2 * Bcirc ≤ + (Fintype.card (Fin d) : ℝ) * ((1 - r)⁻¹ * Bcirc) := by + rw [hpairsum] + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hsum_r hBcirc) hcard_nonneg + calc + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M u + = Real.sqrt (∑ j ∈ Finset.range (M + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) := by + rw [cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq] + _ ≤ Real.sqrt (∑ j ∈ Finset.range (M + 1), + (C * ∑ p ∈ I, A j p) ^ 2) := by + exact Real.sqrt_le_sqrt hsq_bound + _ = C * Real.sqrt (∑ j ∈ Finset.range (M + 1), + (∑ p ∈ I, A j p) ^ 2) := by + exact sqrt_sum_sq_const_mul_eq (Finset.range (M + 1)) C + (fun j => ∑ p ∈ I, A j p) hC + _ ≤ C * ∑ p ∈ I, + Real.sqrt (∑ j ∈ Finset.range (M + 1), (A j p) ^ 2) := by + refine mul_le_mul_of_nonneg_left ?_ hC + exact sqrt_sum_sq_sum_le_sum_sqrt_sum_sq + (Finset.range (M + 1)) I A hA_nonneg + _ ≤ C * ∑ p ∈ I, r ^ p.2 * Bcirc := by + exact mul_le_mul_of_nonneg_left hcolsum hC + _ ≤ C * ((Fintype.card (Fin d) : ℝ) * ((1 - r)⁻¹ * Bcirc)) := by + exact mul_le_mul_of_nonneg_left hpairsum_bound hC + _ = C * (1 - r)⁻¹ * ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + ring + +theorem CubeLocalMultiscalePoincareVectorEstimate.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs_of_component_bound + {d : ℕ} {Q : TriadicCube d} {s C Bcirc : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hlocal : CubeLocalMultiscalePoincareVectorEstimate Q C (cubeFluctuation Q u) G M) + (hs : 0 < s) (hC : 0 ≤ C) (hBcirc : 0 ≤ Bcirc) + (hcirc : ∀ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc) : + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) ≤ + cubeBesovScaleWeight (-s) Q * + ((C * (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + have hgeneric : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M + (cubeFluctuation Q u) ≤ + C * (1 - (3 : ℝ) ^ (-s))⁻¹ * ((Fintype.card (Fin d) : ℝ) * Bcirc) := + hlocal.partialSeminorm_two_two_le_geometric_mul_card_mul_of_component_bound + hs hC hBcirc hcirc + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + calc + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) + = cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M + (cubeFluctuation Q u) := by + rw [cubeBesovPositiveScalarPartialSeminormTwo_eq_scaleWeight_neg_mul_cubeBesovPartialSeminorm_two_two] + _ ≤ cubeBesovScaleWeight (-s) Q * + ((C * (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + simpa [mul_assoc] using mul_le_mul_of_nonneg_left hgeneric hscale_nonneg + +theorem CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs_of_component_bound + {d : ℕ} {Q : TriadicCube d} {s C Bcirc : ℝ} {u : Vec d → ℝ} + {G : Vec d → Vec d} {M : ℕ} + (hproj : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G M) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 < s) (hC : 0 ≤ C) (hBcirc : 0 ≤ Bcirc) + (hcirc : ∀ i : Fin d, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M + (fun x => G x i) ≤ Bcirc) : + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + have hlocal := + hproj.to_localEstimate hG hC + have hK_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hgeneric : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹ * ((Fintype.card (Fin d) : ℝ) * Bcirc) := by + exact + hlocal.partialSeminorm_two_two_le_geometric_mul_card_mul_of_component_bound + hs hK_nonneg hBcirc hcirc + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + calc + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) + = cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + rw [cubeBesovPositiveScalarPartialSeminormTwo_eq_scaleWeight_neg_mul_cubeBesovPartialSeminorm_two_two] + _ ≤ cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * ((Fintype.card (Fin d) : ℝ) * Bcirc)) := by + exact mul_le_mul_of_nonneg_left hgeneric hscale_nonneg + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs + {d : ℕ} {Q : TriadicCube d} {s C : ℝ} {u g : Vec d → ℝ} {M : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g M) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : 0 < s) (hC : 0 ≤ C) : + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g) := by + have hgeneric : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M (cubeFluctuation Q u) ≤ + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g := by + exact + (hproj.to_input hg hC).partialSeminorm_two_two_le_geometric_mul_cubeBesovCircPartialNorm + hs (by positivity) + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-s) Q := + cubeBesovScaleWeight_nonneg (-s) Q + calc + cubeBesovPositiveScalarPartialSeminormTwo Q s M (cubeFluctuation Q u) + = cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) M (cubeFluctuation Q u) := by + rw [cubeBesovPositiveScalarPartialSeminormTwo_eq_scaleWeight_neg_mul_cubeBesovPartialSeminorm_two_two] + _ ≤ cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) M g) := by + exact mul_le_mul_of_nonneg_left hgeneric hscale_nonneg + + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Definitions.lean new file mode 100644 index 0000000000..dfe64cea57 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/PositiveSeminorms/Definitions.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.OneCube + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +noncomputable def cubeL2ScalarDepthAverage {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => (cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2 + +noncomputable def cubeL2ScalarDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) * Real.sqrt (cubeL2ScalarDepthAverage Q v j) + +noncomputable def cubeL2ScalarPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeL2ScalarDepthSeminorm Q s v j) ^ 2 + +noncomputable def cubeBesovPositiveScalarDepthAverage {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) v) ^ 2 + +noncomputable def cubeBesovPositiveScalarDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) * Real.sqrt (cubeBesovPositiveScalarDepthAverage Q v j) + +noncomputable def cubeBesovPositiveScalarPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveScalarDepthSeminorm Q s v j) ^ 2 + +theorem cubeL2ScalarDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeL2ScalarDepthAverage Q v j := by + unfold cubeL2ScalarDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + +theorem cubeL2ScalarDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeL2ScalarDepthSeminorm Q s v j := by + unfold cubeL2ScalarDepthSeminorm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem cubeBesovPositiveScalarDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovPositiveScalarDepthAverage Q v j := by + unfold cubeBesovPositiveScalarDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + +theorem cubeBesovPositiveScalarDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + 0 ≤ cubeBesovPositiveScalarDepthSeminorm Q s v j := by + unfold cubeBesovPositiveScalarDepthSeminorm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem sq_cubeL2ScalarDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + (cubeL2ScalarDepthSeminorm Q s v j) ^ 2 = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * cubeL2ScalarDepthAverage Q v j := by + have hA : 0 ≤ cubeL2ScalarDepthAverage Q v j := cubeL2ScalarDepthAverage_nonneg Q v j + calc + (cubeL2ScalarDepthSeminorm Q s v j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeL2ScalarDepthAverage Q v j)) ^ 2 := by + rfl + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeL2ScalarDepthAverage Q v j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeL2ScalarDepthAverage Q v j := by + rw [Real.sq_sqrt hA] + +theorem sq_cubeL2ScalarPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) : + (cubeL2ScalarPartialSeminormTwo Q s N v) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeL2ScalarDepthSeminorm Q s v j) ^ 2 := by + unfold cubeL2ScalarPartialSeminormTwo + simpa [pow_two] using + Real.sq_sqrt + (Finset.sum_nonneg fun j _ => sq_nonneg (cubeL2ScalarDepthSeminorm Q s v j)) + +theorem sq_cubeBesovPositiveScalarDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + (cubeBesovPositiveScalarDepthSeminorm Q s v j) ^ 2 = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveScalarDepthAverage Q v j := by + have hA : 0 ≤ cubeBesovPositiveScalarDepthAverage Q v j := + cubeBesovPositiveScalarDepthAverage_nonneg Q v j + calc + (cubeBesovPositiveScalarDepthSeminorm Q s v j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovPositiveScalarDepthAverage Q v j)) ^ 2 := by + rfl + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovPositiveScalarDepthAverage Q v j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveScalarDepthAverage Q v j := by + rw [Real.sq_sqrt hA] + +theorem sq_cubeBesovPositiveScalarPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) : + (cubeBesovPositiveScalarPartialSeminormTwo Q s N v) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveScalarDepthSeminorm Q s v j) ^ 2 := by + unfold cubeBesovPositiveScalarPartialSeminormTwo + simpa [pow_two] using + Real.sq_sqrt + (Finset.sum_nonneg fun j _ => sq_nonneg (cubeBesovPositiveScalarDepthSeminorm Q s v j)) + +theorem cubeBesovPositiveScalarDepthAverage_sub_const {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (c : ℝ) (j : ℕ) + (hmem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveScalarDepthAverage Q (fun x => u x - c) j = + cubeBesovPositiveScalarDepthAverage Q u j := by + unfold cubeBesovPositiveScalarDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + congr 1 + apply cubeLpNorm_congr_on_cubeSet_generic R (2 : ℝ≥0∞) + intro x hx + simpa using congrFun (cubeFluctuation_sub_const R u c (hmem R hR)) x + +theorem cubeBesovPositiveScalarDepthSeminorm_sub_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → ℝ) (c : ℝ) (j : ℕ) + (hmem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveScalarDepthSeminorm Q s (fun x => u x - c) j = + cubeBesovPositiveScalarDepthSeminorm Q s u j := by + unfold cubeBesovPositiveScalarDepthSeminorm + rw [cubeBesovPositiveScalarDepthAverage_sub_const Q u c j hmem] + +theorem cubeBesovPositiveScalarPartialSeminormTwo_sub_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) (c : ℝ) + (hmem : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveScalarPartialSeminormTwo Q s N (fun x => u x - c) = + cubeBesovPositiveScalarPartialSeminormTwo Q s N u := by + unfold cubeBesovPositiveScalarPartialSeminormTwo + congr 1 + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovPositiveScalarDepthSeminorm_sub_const Q s u c j (hmem j hj)] + +theorem descendantsAverage_sq_const_mul {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) (F : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => (c * F R) ^ 2) = + c ^ 2 * descendantsAverage Q j (fun R => (F R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (c * F R) ^ 2) + = descendantsAverage Q j (fun R => c ^ 2 * (F R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = c ^ 2 * descendantsAverage Q j (fun R => (F R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (c ^ 2) (fun R => (F R) ^ 2)] + +theorem sqrt_sum_sq_add_le {ι : Type*} (s : Finset ι) (A B : ι → ℝ) + (hA : ∀ i ∈ s, 0 ≤ A i) (hB : ∀ i ∈ s, 0 ≤ B i) : + (∑ i ∈ s, (A i + B i) ^ 2) ^ (1 / 2 : ℝ) ≤ + (∑ i ∈ s, (A i) ^ 2) ^ (1 / 2 : ℝ) + + (∑ i ∈ s, (B i) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + (Real.Lp_add_le_of_nonneg + (s := s) (f := A) (g := B) (p := (2 : ℝ)) + (by norm_num) hA hB) + +theorem descendantsAverage_L2_add_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (A B : TriadicCube d → ℝ) + (hA : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R) + (hB : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ B R) : + (descendantsAverage Q j (fun R => (A R + B R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) + + (descendantsAverage Q j (fun R => (B R) ^ 2)) ^ (1 / 2 : ℝ) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + have hc : 0 ≤ c := by + dsimp [c] + exact inv_nonneg.mpr (by positivity) + have hsumA_nonneg : 0 ≤ ∑ R ∈ D, (A R) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hsumB_nonneg : 0 ≤ ∑ R ∈ D, (B R) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hsumAB_nonneg : 0 ≤ ∑ R ∈ D, (A R + B R) ^ 2 := by + exact Finset.sum_nonneg fun R hR => sq_nonneg _ + have hLp : + (∑ R ∈ D, (A R + B R) ^ 2) ^ (1 / 2 : ℝ) ≤ + (∑ R ∈ D, (A R) ^ 2) ^ (1 / 2 : ℝ) + + (∑ R ∈ D, (B R) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + (Real.Lp_add_le_of_nonneg + (s := D) (f := A) (g := B) (p := (2 : ℝ)) + (by norm_num) + (fun R hR => hA R (by simpa [D] using hR)) + (fun R hR => hB R (by simpa [D] using hR))) + calc + (descendantsAverage Q j (fun R => (A R + B R) ^ 2)) ^ (1 / 2 : ℝ) + = c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (A R + B R) ^ 2) ^ (1 / 2 : ℝ) := by + have hmul : + (c * ∑ R ∈ D, (A R + B R) ^ 2) ^ (1 / 2 : ℝ) = + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (A R + B R) ^ 2) ^ (1 / 2 : ℝ) := + Real.mul_rpow hc hsumAB_nonneg + simpa [descendantsAverage, D, c] using hmul + _ ≤ c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (A R) ^ 2) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (B R) ^ 2) ^ (1 / 2 : ℝ) := by + have hc_rpow : 0 ≤ c ^ (1 / 2 : ℝ) := Real.rpow_nonneg hc _ + have hmul := mul_le_mul_of_nonneg_left hLp hc_rpow + simpa [mul_add] using hmul + _ = (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (B R) ^ 2) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsumA_nonneg] + simp [descendantsAverage, D, c] + _ = (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) + + (descendantsAverage Q j (fun R => (B R) ^ 2)) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsumB_nonneg] + simp [descendantsAverage, D, c] + +theorem descendantsAverage_L2_const_mul_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) (F : TriadicCube d → ℝ) (hc : 0 ≤ c) : + (descendantsAverage Q j (fun R => (c * F R) ^ 2)) ^ (1 / 2 : ℝ) = + c * (descendantsAverage Q j (fun R => (F R) ^ 2)) ^ (1 / 2 : ℝ) := by + have hF_nonneg : 0 ≤ descendantsAverage Q j (fun R => (F R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + rw [descendantsAverage_sq_const_mul Q j c F] + rw [Real.mul_rpow (sq_nonneg c) hF_nonneg] + rw [sq_rpow_half_eq_of_nonneg hc] + +theorem sqrt_sum_sq_const_mul_eq {ι : Type*} (s : Finset ι) (c : ℝ) (F : ι → ℝ) + (hc : 0 ≤ c) : + Real.sqrt (∑ i ∈ s, (c * F i) ^ 2) = + c * Real.sqrt (∑ i ∈ s, (F i) ^ 2) := by + have hF_nonneg : 0 ≤ ∑ i ∈ s, (F i) ^ 2 := by + exact Finset.sum_nonneg fun i hi => sq_nonneg _ + calc + Real.sqrt (∑ i ∈ s, (c * F i) ^ 2) + = Real.sqrt (c ^ 2 * ∑ i ∈ s, (F i) ^ 2) := by + congr 1 + calc + ∑ i ∈ s, (c * F i) ^ 2 = ∑ i ∈ s, c ^ 2 * (F i) ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = c ^ 2 * ∑ i ∈ s, (F i) ^ 2 := by + rw [← Finset.mul_sum] + _ = Real.sqrt (c ^ 2) * Real.sqrt (∑ i ∈ s, (F i) ^ 2) := by + rw [Real.sqrt_mul (sq_nonneg c)] + _ = c * Real.sqrt (∑ i ∈ s, (F i) ^ 2) := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hc] + +theorem descendantsAverage_sqrt_const_mul_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) (F : TriadicCube d → ℝ) (hc : 0 ≤ c) : + Real.sqrt (descendantsAverage Q j (fun R => (c * F R) ^ 2)) = + c * Real.sqrt (descendantsAverage Q j (fun R => (F R) ^ 2)) := by + simpa [Real.sqrt_eq_rpow] using descendantsAverage_L2_const_mul_eq Q j c F hc + +theorem descendantsAverage_sqrt_add_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (A B : TriadicCube d → ℝ) + (hA : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R) + (hB : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ B R) : + Real.sqrt (descendantsAverage Q j (fun R => (A R + B R) ^ 2)) ≤ + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (B R) ^ 2)) := by + simpa [Real.sqrt_eq_rpow] using descendantsAverage_L2_add_le Q j A B hA hB + +theorem sqrt_sum_sq_add_le_sqrt {ι : Type*} (s : Finset ι) (A B : ι → ℝ) + (hA : ∀ i ∈ s, 0 ≤ A i) (hB : ∀ i ∈ s, 0 ≤ B i) : + Real.sqrt (∑ i ∈ s, (A i + B i) ^ 2) ≤ + Real.sqrt (∑ i ∈ s, (A i) ^ 2) + Real.sqrt (∑ i ∈ s, (B i) ^ 2) := by + simpa [Real.sqrt_eq_rpow] using sqrt_sum_sq_add_le s A B hA hB + +theorem sqrt_sum_sq_le_sum {ι : Type*} (s : Finset ι) (A : ι → ℝ) + (hA : ∀ i ∈ s, 0 ≤ A i) : + Real.sqrt (∑ i ∈ s, (A i) ^ 2) ≤ ∑ i ∈ s, A i := by + have hsq : + ∑ i ∈ s, (A i) ^ 2 ≤ (∑ i ∈ s, A i) ^ 2 := by + simpa [pow_two] using Finset.sum_sq_le_sq_sum_of_nonneg hA + have hsum_nonneg : 0 ≤ ∑ i ∈ s, A i := Finset.sum_nonneg hA + calc + Real.sqrt (∑ i ∈ s, (A i) ^ 2) + ≤ Real.sqrt ((∑ i ∈ s, A i) ^ 2) := Real.sqrt_le_sqrt hsq + _ = ∑ i ∈ s, A i := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hsum_nonneg] + +theorem sqrt_sum_sq_sum_le_sum_sqrt_sum_sq {ι κ : Type*} [DecidableEq κ] + (s : Finset ι) (t : Finset κ) (A : ι → κ → ℝ) + (hA : ∀ i ∈ s, ∀ k ∈ t, 0 ≤ A i k) : + Real.sqrt (∑ i ∈ s, (∑ k ∈ t, A i k) ^ 2) ≤ + ∑ k ∈ t, Real.sqrt (∑ i ∈ s, (A i k) ^ 2) := by + induction t using Finset.induction_on with + | empty => + simp + | @insert a t ha ih => + have hsum_nonneg : ∀ i ∈ s, 0 ≤ ∑ k ∈ t, A i k := by + intro i hi + exact Finset.sum_nonneg fun k hk => hA i hi k (Finset.mem_insert_of_mem hk) + calc + Real.sqrt (∑ i ∈ s, (∑ k ∈ insert a t, A i k) ^ 2) + = Real.sqrt (∑ i ∈ s, (A i a + ∑ k ∈ t, A i k) ^ 2) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro i hi + rw [Finset.sum_insert ha] + _ ≤ Real.sqrt (∑ i ∈ s, (A i a) ^ 2) + + Real.sqrt (∑ i ∈ s, (∑ k ∈ t, A i k) ^ 2) := by + exact + sqrt_sum_sq_add_le_sqrt s (fun i => A i a) (fun i => ∑ k ∈ t, A i k) + (fun i hi => hA i hi a (by simp [ha])) + hsum_nonneg + _ ≤ Real.sqrt (∑ i ∈ s, (A i a) ^ 2) + + ∑ k ∈ t, Real.sqrt (∑ i ∈ s, (A i k) ^ 2) := by + exact add_le_add le_rfl <| + ih (fun i hi k hk => hA i hi k (Finset.mem_insert_of_mem hk)) + _ = ∑ k ∈ insert a t, Real.sqrt (∑ i ∈ s, (A i k) ^ 2) := by + simp [ha] + +theorem cubeBesovPartialSeminorm_two_two_eq_sqrt_sum_sq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u = + Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) u j) ^ 2) := by + unfold cubeBesovPartialSeminorm + norm_num [Real.sqrt_eq_rpow] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing.lean new file mode 100644 index 0000000000..85edaaad7a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Centered +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Vector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.VectorFullDual + +/-! # Split Pairing -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Centered.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Centered.lean new file mode 100644 index 0000000000..0570d437c6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Centered.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct + +/-! # Centered -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bavg Bcirc1 BcircS B C Bg : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hneg1 : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) + (hnegS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg := by + intro N + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_poincare_cutoff_terms + Q s N u g ξ hB hu (hproj N) hg hξLp hξ hderiv hs0 hs1 hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) := by + refine mul_le_mul_of_nonneg_left ?_ hcoeff_nonneg + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + refine mul_le_mul_of_nonneg_left (hneg1 N) ?_ + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hnoteS_nonneg : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2inner : + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) + ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS) := by + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovScaleWeight_nonneg (-s) Q) + exact mul_le_mul_of_nonneg_left (hnegS N) hnoteS_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS)) := by + exact mul_le_mul_of_nonneg_left hterm2inner (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := hpartial + _ ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + _ ≤ Bg := hBg_bound + exact + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_average_note_terms_of_partialBounds_of_projectedDualMeanZeroPoincareEstimate + Q s flux u g ξ hs0 hflux hu hg hξLp hBg hBavg hC havg hneg hpos hproj hneg1 + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) {Bu Bavg Bcirc1 BcircS B C Bg : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hneg1 : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) + (hnegS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg := by + intro N + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_poincare_cutoff_terms + Q s N u g ξ hB hu (hproj N) hg hξLp hξ hderiv hs0 hs1 hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) := by + refine mul_le_mul_of_nonneg_left ?_ hcoeff_nonneg + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + refine mul_le_mul_of_nonneg_left (hneg1 N) ?_ + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hnoteS_nonneg : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2inner : + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) + ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS) := by + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovScaleWeight_nonneg (-s) Q) + exact mul_le_mul_of_nonneg_left (hnegS N) hnoteS_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS)) := by + exact mul_le_mul_of_nonneg_left hterm2inner (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) + ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := hpartial + _ ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + _ ≤ Bg := hBg_bound + exact + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_projectedDualMeanZeroPoincareEstimate + Q s flux u g ξ hs0 hflux hu hg hξLp hBg hBavg hC havg hneg hpos hproj hneg1 + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_note_terms_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bavg Bcirc1 BcircS B C Bg : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * Bg))) := by + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg := by + intro N + exact le_trans + (cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_vector_poincare_cutoff_terms + Q s N u G ξ hB hu (hproj N) hG hξLp hξ hderiv hs0 hs1 hC hBcircS + (fun i => hGcirc1 i N) (fun i => hGcircS i N)) + hBg_bound + exact + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_average_note_terms_of_partialBounds_of_projectedDualMeanZeroVectorPoincareEstimate + Q s flux u G ξ hs0 hflux hu hG hξLp hBg hBavg hC havg hneg hpos hproj + hGcirc1 + +theorem + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) + {Bu Bavg Bcirc1 BcircS B C Bg : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ Bu) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBg_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + (d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg))) := by + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ Bg := by + intro N + exact le_trans + (cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_note_vector_poincare_cutoff_terms + Q s N u G ξ hB hu (hproj N) hG hξLp hξ hderiv hs0 hs1 hC hBcircS + (fun i => hGcirc1 i N) (fun i => hGcircS i N)) + hBg_bound + exact + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_projectedDualMeanZeroVectorPoincareEstimate + Q s flux u G ξ hs0 hflux hu hG hξLp hBg hBavg hC havg hneg hpos hproj + hGcirc1 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Scalar.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Scalar.lean new file mode 100644 index 0000000000..c350f5ce21 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Scalar.lean @@ -0,0 +1,350 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Centered + +/-! # Scalar -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hgCirc1 : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1) + + cubeBesovScaleWeight 1 Q * Bavg) * BgConst)) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hBavg havg hfluxNeg1 hξ hderiv hBgConst_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_note_terms_of_contDiff_component_bound + Q s flux u g ξ hB hs0 hs1 hflux hu hg hξLp hBgCent hBavg hC havg hfluxNegS + hproj hξ hderiv hgCirc1 hgCircS hBgCent_bound + have hconstVecInfty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hconstVec2 : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hconstVecInfty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hcentVec2 : + MeasureTheory.MemLp (fun x => (u x - cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [cubeFluctuation] using! + hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) huFluct + have hfluxComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hconstComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((cubeAverage Q u) • ξ x) i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hconstVec2 + have hcentComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((u x - cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hcentVec2 + have hIntConstComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hconstComp i) + have hIntCentComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((u x - cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hcentComp i) + have hIntConst : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntConstComp i)) + have hIntCent : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntCentComp i)) + have hsplitFun : + (fun x => vecDot (flux x) (u x • ξ x)) = + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((cubeAverage Q u) + (u x - cubeAverage Q u)) • ξ x) := by + congr 1 + ring_nf + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x + (u x - cubeAverage Q u) • ξ x) := by + rw [add_smul] + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + have hsplit : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + calc + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) + = ∫ x, vecDot (flux x) (u x • ξ x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, + (vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + ∂ normalizedCubeMeasure Q := by + exact congrArg (fun f => ∫ x, f x ∂ normalizedCubeMeasure Q) hsplitFun + _ = ∫ x, vecDot (flux x) ((cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q + + ∫ x, vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add hIntConst hIntCent] + _ = cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + rw [hsplit] + _ ≤ |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| + + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + exact abs_add_le _ _ + _ ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1) + + cubeBesovScaleWeight 1 Q * Bavg) * BgConst)) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact add_le_add hconst hcent + +/-- Sharp split pairing estimate. The constant branch uses only the +negative Besov circ norm of the flux, matching the LaTeX small-cube line. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hgCirc1 : ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Bcirc1) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hfluxNeg1 hξ hderiv hBgConst_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + Q s flux u g ξ hB hs0 hs1 hflux hu hg hξLp hBgCent hBavg hC havg hfluxNegS + hproj hξ hderiv hgCirc1 hgCircS hBgCent_bound + have hconstVecInfty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hconstVec2 : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hconstVecInfty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hcentVec2 : + MeasureTheory.MemLp (fun x => (u x - cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [cubeFluctuation] using! + hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) huFluct + have hfluxComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hconstComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((cubeAverage Q u) • ξ x) i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hconstVec2 + have hcentComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((u x - cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hcentVec2 + have hIntConstComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hconstComp i) + have hIntCentComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((u x - cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hcentComp i) + have hIntConst : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntConstComp i)) + have hIntCent : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntCentComp i)) + have hsplitFun : + (fun x => vecDot (flux x) (u x • ξ x)) = + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((cubeAverage Q u) + (u x - cubeAverage Q u)) • ξ x) := by + congr 1 + ring_nf + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x + (u x - cubeAverage Q u) • ξ x) := by + rw [add_smul] + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + have hsplit : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + calc + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) + = ∫ x, vecDot (flux x) (u x • ξ x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, + (vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + ∂ normalizedCubeMeasure Q := by + exact congrArg (fun f => ∫ x, f x ∂ normalizedCubeMeasure Q) hsplitFun + _ = ∫ x, vecDot (flux x) ((cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q + + ∫ x, vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add hIntConst hIntCent] + _ = cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + rw [hsplit] + _ ≤ |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| + + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + exact abs_add_le _ _ + _ ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact add_le_add hconst hcent + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Vector.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Vector.lean new file mode 100644 index 0000000000..64b0bbdf55 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/Vector.lean @@ -0,0 +1,635 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Scalar + +/-! # Vector -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1) + + cubeBesovScaleWeight 1 Q * Bavg) * BgConst)) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hBavg havg hfluxNeg1 hξ hderiv hBgConst_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_note_terms_of_contDiff_component_vector_bound + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgCent hBavg hC hBcircS havg + hfluxNegS hproj hξ hderiv hGcirc1 hGcircS hBgCent_bound + have hconstVecInfty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hconstVec2 : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hconstVecInfty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hcentVec2 : + MeasureTheory.MemLp (fun x => (u x - cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [cubeFluctuation] using! + hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) huFluct + have hfluxComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hconstComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((cubeAverage Q u) • ξ x) i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hconstVec2 + have hcentComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((u x - cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hcentVec2 + have hIntConstComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hconstComp i) + have hIntCentComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((u x - cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hcentComp i) + have hIntConst : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntConstComp i)) + have hIntCent : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntCentComp i)) + have hsplitFun : + (fun x => vecDot (flux x) (u x • ξ x)) = + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((cubeAverage Q u) + (u x - cubeAverage Q u)) • ξ x) := by + congr 1 + ring_nf + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x + (u x - cubeAverage Q u) • ξ x) := by + rw [add_smul] + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + have hsplit : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + calc + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) + = ∫ x, vecDot (flux x) (u x • ξ x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, + (vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + ∂ normalizedCubeMeasure Q := by + exact congrArg (fun f => ∫ x, f x ∂ normalizedCubeMeasure Q) hsplitFun + _ = ∫ x, vecDot (flux x) ((cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q + + ∫ x, vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add hIntConst hIntCent] + _ = cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + rw [hsplit] + _ ≤ |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| + + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + exact abs_add_le _ _ + _ ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1) + + cubeBesovScaleWeight 1 Q * Bavg) * BgConst)) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact add_le_add hconst hcent + +/-- Vector projected-Poincare version of the sharp split pairing estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hfluxNeg1 hξ hderiv hBgConst_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_vector_bound + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgCent hBavg hC hBcircS havg + hfluxNegS hproj hξ hderiv hGcirc1 hGcircS hBgCent_bound + have hconstVecInfty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hconstVec2 : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hconstVecInfty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hcentVec2 : + MeasureTheory.MemLp (fun x => (u x - cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [cubeFluctuation] using! + hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) huFluct + have hfluxComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hconstComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((cubeAverage Q u) • ξ x) i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hconstVec2 + have hcentComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ((u x - cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hcentVec2 + have hIntConstComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hconstComp i) + have hIntCentComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((u x - cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hcentComp i) + have hIntConst : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntConstComp i)) + have hIntCent : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntCentComp i)) + have hsplitFun : + (fun x => vecDot (flux x) (u x • ξ x)) = + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((cubeAverage Q u) + (u x - cubeAverage Q u)) • ξ x) := by + congr 1 + ring_nf + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x + (u x - cubeAverage Q u) • ξ x) := by + rw [add_smul] + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + have hsplit : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + calc + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) + = ∫ x, vecDot (flux x) (u x • ξ x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, + (vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + ∂ normalizedCubeMeasure Q := by + exact congrArg (fun f => ∫ x, f x ∂ normalizedCubeMeasure Q) hsplitFun + _ = ∫ x, vecDot (flux x) ((cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q + + ∫ x, vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add hIntConst hIntCent] + _ = cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + rw [hsplit] + _ ≤ |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| + + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + exact abs_add_le _ _ + _ ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact add_le_add hconst hcent + +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_vector_effective_constant + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1) + + cubeBesovScaleWeight 1 Q * Bavg) * BgConst)) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS) + + cubeBesovScaleWeight s Q * Bavg) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hBgCent_bound_vec : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent := by + simpa [mul_assoc, mul_left_comm, mul_comm] using hBgCent_bound + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_vector_bound + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgConst hBgCent hBavg hC + hBcircS havg hfluxNeg1 hfluxNegS hproj hξ hderiv hGcirc1 hGcircS + hBgConst_bound hBgCent_bound_vec + simpa [mul_assoc, mul_left_comm, mul_comm] using hraw + +/-- Effective-constant wrapper for the sharp vector split estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_vector_effective_constant + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hBgCent_bound_vec : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent := by + simpa [mul_assoc, mul_left_comm, mul_comm] using hBgCent_bound + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_vector_bound + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgConst hBgCent hBavg hC + hBcircS havg hfluxNeg1 hfluxNegS hproj hξ hderiv hGcirc1 hGcircS + hBgConst_bound hBgCent_bound_vec + simpa [mul_assoc, mul_left_comm, mul_comm] using hraw + +/-- Energy-coefficient form of the split local Caccioppoli pairing. + +The previous theorem keeps the five Besov/average bounds as raw constants. +This wrapper records the next downstream shape: each of those bounds is a +coefficient times one common local energy scale `E`. The radius/coefficient +bookkeeping can now substitute the Chapter-2/coarse-Poincare coefficients +without reopening the cutoff-product proof. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_energy_coefficients_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {Aflux1 AfluxS Aavg Acirc1 AcircS E B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hAavg : 0 ≤ Aavg) (hE : 0 ≤ E) (hC : 0 ≤ C) + (havg : ‖cubeAverageVec Q flux‖ ≤ Aavg * E) + (hfluxNeg1 : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Aflux1 * E) + (hfluxNegS : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ AfluxS * E) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hgCirc1 : + ∀ N : ℕ, cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ Acirc1 * E) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ AcircS * E) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * (AcircS * E)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * (Aflux1 * E)) + + cubeBesovScaleWeight 1 Q * (Aavg * E)) * BgConst)) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E)) + + cubeBesovScaleWeight s Q * (Aavg * E)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_bound + (Q := Q) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (Bu1 := Aflux1 * E) (BuS := AfluxS * E) (Bavg := Aavg * E) + (Bcirc1 := Acirc1 * E) (BcircS := AcircS * E) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hflux hu hg hξLp hBgConst hBgCent + (mul_nonneg hAavg hE) hC havg hfluxNeg1 hfluxNegS hproj hξ hderiv + hgCirc1 hgCircS hBgConst_bound hBgCent_bound + +/-- Vector projected-Poincare version of +`abs_cubeAverage_vecDot_scalar_smul_le_split_energy_coefficients_of_contDiff_component_bound`. + +This is the coefficient-times-energy wrapper for the descendant/local +Caccioppoli pairing used by the harmonic-vector endpoint. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_energy_coefficients_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Aflux1 AfluxS Aavg Acirc1 AcircS E B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hAavg : 0 ≤ Aavg) (hE : 0 ≤ E) (hC : 0 ≤ C) (hAcircS : 0 ≤ AcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Aavg * E) + (hfluxNeg1 : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Aflux1 * E) + (hfluxNegS : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ AfluxS * E) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Acirc1 * E) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * E) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * (AcircS * E)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * (Aflux1 * E)) + + cubeBesovScaleWeight 1 Q * (Aavg * E)) * BgConst)) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E)) + + cubeBesovScaleWeight s Q * (Aavg * E)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_note_terms_of_contDiff_component_vector_effective_constant + (Q := Q) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (Bu1 := Aflux1 * E) (BuS := AfluxS * E) (Bavg := Aavg * E) + (Bcirc1 := Acirc1 * E) (BcircS := AcircS * E) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hflux hu hG hξLp hBgConst hBgCent + (mul_nonneg hAavg hE) hC (mul_nonneg hAcircS hE) + havg hfluxNeg1 hfluxNegS hproj hξ hderiv hGcirc1 hGcircS + hBgConst_bound hBgCent_bound + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/VectorFullDual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/VectorFullDual.lean new file mode 100644 index 0000000000..6f66daa6dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/SplitPairing/VectorFullDual.lean @@ -0,0 +1,448 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.CenteredProductFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Vector + +/-! # Vector Full Dual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +# Full-dual vector split pairing estimates + +This sidecar is the corrected replacement for the projected-vector centered +branch in `SplitPairing/Vector.lean`. The constant branch is unchanged; the +centered branch is routed through the full-dual/local-multiscale theorem from +`CenteredProductFullDual.lean`. +-/ + +private theorem abs_cubeAverage_vecDot_scalar_smul_le_split_of_const_centered_bounds + {d : ℕ} (Q : TriadicCube d) (flux ξ : Vec d → Vec d) (u : Vec d → ℝ) + {Aconst Acent : ℝ} + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hconst : + |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| ≤ + Aconst) + (hcent : + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| ≤ + Acent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ Aconst + Acent := by + have hconstVecInfty : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) ∞ + (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply] using! hξLp.const_smul (cubeAverage Q u) + have hconstVec2 : + MeasureTheory.MemLp (fun x => (cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + hconstVecInfty.mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞) + have huFluct : + MeasureTheory.MemLp (cubeFluctuation Q u) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + exact hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + have hcentVec2 : + MeasureTheory.MemLp (fun x => (u x - cubeAverage Q u) • ξ x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [cubeFluctuation] using! + hξLp.smul (p := (2 : ℝ≥0∞)) (r := (2 : ℝ≥0∞)) huFluct + have hfluxComp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => flux x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp flux i hflux + have hconstComp : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => ((cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hconstVec2 + have hcentComp : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => ((u x - cubeAverage Q u) • ξ x) i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hcentVec2 + have hIntConstComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hconstComp i) + have hIntCentComp : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => flux x i * (((u x - cubeAverage Q u) • ξ x) i)) + (normalizedCubeMeasure Q) := by + intro i + simpa using! (hfluxComp i).integrable_mul (hcentComp i) + have hIntConst : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntConstComp i)) + have hIntCent : + MeasureTheory.Integrable + (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + (normalizedCubeMeasure Q) := by + simpa [vecDot] using + (MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => hIntCentComp i)) + have hsplitFun : + (fun x => vecDot (flux x) (u x • ξ x)) = + (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + funext x + calc + vecDot (flux x) (u x • ξ x) + = vecDot (flux x) (((cubeAverage Q u) + (u x - cubeAverage Q u)) • ξ x) := by + congr 1 + ring_nf + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x + (u x - cubeAverage Q u) • ξ x) := by + rw [add_smul] + _ = vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) := by + simp [vecDot, Finset.sum_add_distrib, mul_add] + have hsplit : + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) = + cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + calc + cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x)) + = ∫ x, vecDot (flux x) (u x • ξ x) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, + (vecDot (flux x) ((cubeAverage Q u) • ξ x) + + vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) + ∂ normalizedCubeMeasure Q := by + exact congrArg (fun f => ∫ x, f x ∂ normalizedCubeMeasure Q) hsplitFun + _ = ∫ x, vecDot (flux x) ((cubeAverage Q u) • ξ x) ∂ normalizedCubeMeasure Q + + ∫ x, vecDot (flux x) ((u x - cubeAverage Q u) • ξ x) + ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_add hIntConst hIntCent] + _ = cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x)) := by + rw [← cubeAverage_eq_integral_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + = + |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x)) + + cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + rw [hsplit] + _ ≤ + |cubeAverage Q (fun x => vecDot (flux x) ((cubeAverage Q u) • ξ x))| + + |cubeAverage Q (fun x => vecDot (flux x) ((u x - cubeAverage Q u) • ξ x))| := by + exact abs_add_le _ _ + _ ≤ Aconst + Acent := add_le_add hconst hcent + +/-- Full-dual/local-multiscale version of the sharp vector split pairing +estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_localMultiscale + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hfluxNeg1 hξ hderiv hBgConst_bound + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ BgCent := by + intro N + exact le_trans + (cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_fullDual_localMultiscale_cutoff_terms + Q s N u G ξ hB hu (hfull N) (hlocal N) hG hξLp hξ hderiv + hs0 hs1 hC hBcirc1 hBcircS hGcirc1 (fun i => hGcircS i N)) + hBgCent_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_average_note_terms_of_partialBounds_of_dualFullVectorPoincareEstimate + Q s flux u G ξ hs0 hflux hu hG hξLp hBgCent hBavg hC hBcirc1 + havg hfluxNegS hpos hfull hGcirc1 + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_of_const_centered_bounds + Q flux ξ u hflux hu hξLp hconst hcent + +/-- Effective-constant wrapper for the full-dual/local-multiscale sharp vector +split estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_localMultiscale_effective_constant + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hBgCent_bound_vec : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent := by + simpa [mul_assoc, mul_left_comm, mul_comm] using hBgCent_bound + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_localMultiscale + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgConst hBgCent hBavg hC + hBcirc1 hBcircS havg hfluxNeg1 hfluxNegS hfull hlocal hξ hderiv + hGcirc1 hGcircS hBgConst_bound hBgCent_bound_vec + simpa [mul_assoc, mul_left_comm, mul_comm] using hraw + +/-- Full-dual/full-circ version of the sharp vector split pairing estimate. + +This is the replacement used by the unconditional Caccioppoli route: the +centered cutoff product is controlled directly by full-dual Poincare and the +infinite-depth full-circ Besov bounds, with no finite local-multiscale +Poincare hypothesis. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_fullCirc + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hconst := + abs_cubeAverage_vecDot_cubeAverage_scalar_smul_le_collapsed_sharp_note_terms_of_contDiff_component_bound + Q flux u ξ hB hflux hu hξLp hBgConst hfluxNeg1 hξ hderiv hBgConst_bound + have hcent := + abs_cubeAverage_vecDot_centered_scalar_smul_le_collapsed_sharp_note_terms_of_dualFull_fullCirc + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgCent hBavg hC + hBcirc1 hBcircS havg hfluxNegS hfull hξ hderiv hGcirc1 hGcircS + hBgCent_bound + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_of_const_centered_bounds + Q flux ξ u hflux hu hξLp hconst hcent + +/-- Effective-constant wrapper for the full-dual/full-circ sharp vector split +estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_fullCirc_effective_constant + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (flux : Vec d → Vec d) + (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + {Bu1 BuS Bavg Bcirc1 BcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hflux : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hBavg : 0 ≤ Bavg) (hC : 0 ≤ C) + (hBcirc1 : 0 ≤ Bcirc1) (hBcircS : 0 ≤ BcircS) + (havg : ‖cubeAverageVec Q flux‖ ≤ Bavg) + (hfluxNeg1 : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q 1 N flux ≤ Bu1) + (hfluxNegS : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ BuS) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ Bcirc1) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ BcircS) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) ≤ BgCent) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Bu1)) * + BgConst) + + ((d : ℝ) * + (Bavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * Bcirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * BuS)) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + have hBgCent_bound_vec : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((Fintype.card (Fin d) : ℝ) * Bcirc1))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + ((Fintype.card (Fin d) : ℝ) * BcircS)))) ≤ BgCent := by + simpa [mul_assoc, mul_left_comm, mul_comm] using hBgCent_bound + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_fullCirc + Q s flux u G ξ hB hs0 hs1 hflux hu hG hξLp hBgConst hBgCent hBavg hC + hBcirc1 hBcircS havg hfluxNeg1 hfluxNegS hfull hξ hderiv + hGcirc1 hGcircS hBgConst_bound hBgCent_bound_vec + simpa [mul_assoc, mul_left_comm, mul_comm] using hraw + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/VectorProduct.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/VectorProduct.lean new file mode 100644 index 0000000000..a6e8850813 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/CutoffProduct/VectorProduct.lean @@ -0,0 +1,757 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.PositiveSeminorms + +/-! # Vector Product -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeL2Scalar_scale_depth_term_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2)) ^ (1 / 2 : ℝ) = + cubeScaleFactor Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j := by + have hfactor : + descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) = + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ 2 * cubeL2ScalarDepthAverage Q v j := by + calc + descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) + = + descendantsAverage Q j + (fun R => ((cubeScaleFactor Q / (3 : ℝ) ^ j) * + cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + _ = + descendantsAverage Q j + (fun R => (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ 2 * + (cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ 2 * cubeL2ScalarDepthAverage Q v j := by + rw [descendantsAverage_mul_left Q j + ((cubeScaleFactor Q / (3 : ℝ) ^ j) ^ 2) + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2)] + rfl + have havg_nonneg : 0 ≤ cubeL2ScalarDepthAverage Q v j := cubeL2ScalarDepthAverage_nonneg Q v j + have hscale_nonneg : 0 ≤ cubeScaleFactor Q / (3 : ℝ) ^ j := by + exact div_nonneg (cubeScaleFactor_nonneg Q) (by positivity) + have hmain : + (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2)) ^ (1 / 2 : ℝ) = + (cubeScaleFactor Q / (3 : ℝ) ^ j) * Real.sqrt (cubeL2ScalarDepthAverage Q v j) := by + rw [hfactor, Real.mul_rpow (sq_nonneg _) havg_nonneg] + rw [sq_rpow_half_eq_of_nonneg hscale_nonneg] + rw [Real.sqrt_eq_rpow] + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2)) ^ (1 / 2 : ℝ) + = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + ((cubeScaleFactor Q / (3 : ℝ) ^ j) * Real.sqrt (cubeL2ScalarDepthAverage Q v j)) := by + rw [hmain] + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeL2ScalarDepthAverage Q v j) := by + ring + _ = + (cubeScaleFactor Q * Real.rpow (3 : ℝ) ((s - 1) * (j : ℝ))) * + Real.sqrt (cubeL2ScalarDepthAverage Q v j) := by + congr 1 + have hpow : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * (cubeScaleFactor Q / (3 : ℝ) ^ j) = + cubeScaleFactor Q * Real.rpow (3 : ℝ) ((s - 1) * (j : ℝ)) := by + have hnat : (3 : ℝ) ^ j = Real.rpow (3 : ℝ) (j : ℝ) := by + symm + exact Real.rpow_natCast (3 : ℝ) j + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * (cubeScaleFactor Q / (3 : ℝ) ^ j) + = + cubeScaleFactor Q * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * ((3 : ℝ) ^ j)⁻¹) := by + ring + _ = + cubeScaleFactor Q * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (Real.rpow (3 : ℝ) (j : ℝ))⁻¹) := by + rw [hnat] + _ = + cubeScaleFactor Q * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (3 : ℝ) (-(j : ℝ))) := by + congr 1 + rw [show (Real.rpow (3 : ℝ) (j : ℝ))⁻¹ = + Real.rpow (3 : ℝ) (-(j : ℝ)) by + symm + exact Real.rpow_neg (by positivity : 0 ≤ (3 : ℝ)) (j : ℝ)] + _ = + cubeScaleFactor Q * + Real.rpow (3 : ℝ) (s * (j : ℝ) + -(j : ℝ)) := by + congr 1 + exact + (Real.rpow_add (by positivity : 0 < (3 : ℝ)) + (s * (j : ℝ)) (-(j : ℝ))).symm + _ = cubeScaleFactor Q * Real.rpow (3 : ℝ) ((s - 1) * (j : ℝ)) := by + congr 1 + ring_nf + rw [hpow] + _ = cubeScaleFactor Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j := by + simp [cubeL2ScalarDepthSeminorm, mul_assoc] + +theorem cubeBesovPositiveVectorDepthSeminorm_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) (v : Vec d → ℝ) (ξ : Vec d → Vec d) + {B : ℝ} (hB : 0 ≤ B) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j ≤ + 2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j) := by + let A : TriadicCube d → ℝ := + fun R => (cubeScaleFactor R * B) * cubeLpNorm R (2 : ℝ≥0∞) v + let C : TriadicCube d → ℝ := + fun R => cubeLpNorm Q ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v + have hlocal : + ∀ R ∈ descendantsAtDepth Q j, + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R (fun x => v x • ξ x)) ≤ + 2 * (A R + C R) := by + intro R hR + have hvR : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := ℝ) hR hv + have hξR : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hξLp + have hcutoffR : + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R (fun x => v x • ξ x)) ≤ + 2 * ((cubeScaleFactor R * B) * cubeLpNorm R (2 : ℝ≥0∞) v + + cubeLpNorm R ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v) := by + exact + cubeLpNorm_two_cubeFluctuationVec_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + R v ξ hB hvR hξR hξ + (fun i z hz => hderiv i z (cubeSet_subset_of_mem_descendantsAtDepth hR hz)) + have hosc_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) v := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) v + have hlinfty : + cubeLpNorm R ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v ≤ + cubeLpNorm Q ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v := by + exact mul_le_mul_of_nonneg_right + (cubeLpNorm_infty_descendant_le hR ξ hξLp) hosc_nonneg + calc + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R (fun x => v x • ξ x)) + ≤ 2 * ((cubeScaleFactor R * B) * cubeLpNorm R (2 : ℝ≥0∞) v + + cubeLpNorm R ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v) := hcutoffR + _ ≤ 2 * ((cubeScaleFactor R * B) * cubeLpNorm R (2 : ℝ≥0∞) v + + cubeLpNorm Q ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v) := by + exact mul_le_mul_of_nonneg_left (add_le_add le_rfl hlinfty) (by norm_num) + _ = 2 * (A R + C R) := by + simp [A, C] + have hA_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R := by + intro R hR + exact mul_nonneg + (mul_nonneg (cubeScaleFactor_nonneg R) hB) + (cubeLpNorm_nonneg R (2 : ℝ≥0∞) v) + have hC_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ C R := by + intro R hR + exact mul_nonneg + (cubeLpNorm_nonneg Q ∞ ξ) + (cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) v) + have hsq_bound : + descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (fun x => v x • ξ x))) ^ 2) ≤ + descendantsAverage Q j (fun R => (2 * (A R + C R)) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hleft_nonneg : + 0 ≤ cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (fun x => v x • ξ x)) := + cubeLpNorm_nonneg R (2 : ℝ≥0∞) (cubeFluctuationVec R (fun x => v x • ξ x)) + have hright_nonneg : 0 ≤ 2 * (A R + C R) := by + exact mul_nonneg (by norm_num) (add_nonneg (hA_nonneg R hR) (hC_nonneg R hR)) + nlinarith [hlocal R hR, hleft_nonneg, hright_nonneg] + have hleft_nonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (fun x => v x • ξ x))) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot_bound : + Real.sqrt (descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (fun x => v x • ξ x))) ^ 2)) ≤ + Real.sqrt (descendantsAverage Q j (fun R => (2 * (A R + C R)) ^ 2)) := by + exact Real.sqrt_le_sqrt hsq_bound + have hconst : + Real.sqrt (descendantsAverage Q j (fun R => (2 * (A R + C R)) ^ 2)) = + 2 * Real.sqrt (descendantsAverage Q j (fun R => (A R + C R) ^ 2)) := by + rw [descendantsAverage_sqrt_const_mul_eq Q j 2 (fun R => A R + C R) (by norm_num)] + have hsplit : + Real.sqrt (descendantsAverage Q j (fun R => (A R + C R) ^ 2)) ≤ + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2)) := + descendantsAverage_sqrt_add_le Q j A C hA_nonneg hC_nonneg + have hAterm : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) = + cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j := by + have hArew : + descendantsAverage Q j (fun R => (A R) ^ 2) = + descendantsAverage Q j + (fun R => (B * (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v)) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + simp [A] + ring + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) + = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (B * (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v)) ^ 2)) := by + rw [hArew] + _ = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (B * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2))) := by + rw [descendantsAverage_sqrt_const_mul_eq Q j B + (fun R => cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) hB] + _ = B * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2))) := by + ring + _ = B * (cubeScaleFactor Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j) := by + rw [show Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeScaleFactor R * cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2)) = + cubeScaleFactor Q * cubeL2ScalarDepthSeminorm Q (s - 1) v j by + simpa [Real.sqrt_eq_rpow] using cubeL2Scalar_scale_depth_term_eq Q s v j] + _ = cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j := by + ring + have hCterm : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2)) = + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j := by + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2)) + = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeLpNorm Q ∞ ξ * cubeBesovOscillation R (2 : ℝ≥0∞) v) ^ 2)) := by + simp [C] + _ = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (cubeLpNorm Q ∞ ξ * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) v) ^ 2))) := by + rw [descendantsAverage_sqrt_const_mul_eq Q j (cubeLpNorm Q ∞ ξ) + (fun R => cubeBesovOscillation R (2 : ℝ≥0∞) v) + (cubeLpNorm_nonneg Q ∞ ξ)] + _ = cubeLpNorm Q ∞ ξ * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) v) ^ 2))) := by + ring + _ = cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j := by + rfl + calc + cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j + = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (fun x => v x • ξ x))) ^ 2)) := by + simp [cubeBesovPositiveVectorDepthSeminorm, cubeBesovPositiveVectorDepthAverage] + _ ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (2 * (A R + C R)) ^ 2)) := by + exact mul_le_mul_of_nonneg_left hroot_bound (Real.rpow_nonneg (by positivity) _) + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (2 * Real.sqrt (descendantsAverage Q j (fun R => (A R + C R) ^ 2))) := by + rw [hconst] + _ = 2 * (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (A R + C R) ^ 2))) := by + ring + _ ≤ 2 * (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2)))) := by + have hinner : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (A R + C R) ^ 2)) + ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2))) := by + exact mul_le_mul_of_nonneg_left hsplit + (Real.rpow_nonneg (by positivity : 0 ≤ (3 : ℝ)) _) + exact mul_le_mul_of_nonneg_left hinner (by norm_num) + _ = 2 * ((Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (A R) ^ 2))) + + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j (fun R => (C R) ^ 2)))) := by + ring + _ = 2 * (cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j) := by + rw [hAterm, hCterm] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) (ξ : Vec d → Vec d) + {B : ℝ} (hB : 0 ≤ B) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => v x • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * cubeL2ScalarPartialSeminormTwo Q (s - 1) N v + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N v) := by + let A : ℕ → ℝ := fun j => cubeScaleFactor Q * B * cubeL2ScalarDepthSeminorm Q (s - 1) v j + let C : ℕ → ℝ := fun j => cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarDepthSeminorm Q s v j + have hA_nonneg : ∀ j ∈ Finset.range (N + 1), 0 ≤ A j := by + intro j hj + exact mul_nonneg + (mul_nonneg (cubeScaleFactor_nonneg Q) hB) + (cubeL2ScalarDepthSeminorm_nonneg Q (s - 1) v j) + have hC_nonneg : ∀ j ∈ Finset.range (N + 1), 0 ≤ C j := by + intro j hj + exact mul_nonneg + (cubeLpNorm_nonneg Q ∞ ξ) + (cubeBesovPositiveScalarDepthSeminorm_nonneg Q s v j) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j ≤ + 2 * (A j + C j) := by + intro j hj + simpa [A, C] using + cubeBesovPositiveVectorDepthSeminorm_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s j v ξ hB hv hξLp hξ hderiv + have hsq_bound : + ∑ j ∈ Finset.range (N + 1), + (cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j) ^ 2 + ≤ + ∑ j ∈ Finset.range (N + 1), (2 * (A j + C j)) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro j hj + have hleft_nonneg : 0 ≤ cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j := + cubeBesovPositiveVectorDepthSeminorm_nonneg Q s (fun x => v x • ξ x) j + have hright_nonneg : 0 ≤ 2 * (A j + C j) := by + exact mul_nonneg (by norm_num) (add_nonneg (hA_nonneg j hj) (hC_nonneg j hj)) + nlinarith [hdepth j hj, hleft_nonneg, hright_nonneg] + have hsum_nonneg : + 0 ≤ ∑ j ∈ Finset.range (N + 1), + (cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j) ^ 2 := by + exact Finset.sum_nonneg fun j hj => sq_nonneg _ + have hroot_bound : + Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j) ^ 2) ≤ + Real.sqrt (∑ j ∈ Finset.range (N + 1), (2 * (A j + C j)) ^ 2) := by + exact Real.sqrt_le_sqrt hsq_bound + have hsplit : + Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j + C j) ^ 2) ≤ + Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j) ^ 2) + + Real.sqrt (∑ j ∈ Finset.range (N + 1), (C j) ^ 2) := + sqrt_sum_sq_add_le_sqrt (Finset.range (N + 1)) A C hA_nonneg hC_nonneg + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => v x • ξ x) + = Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeBesovPositiveVectorDepthSeminorm Q s (fun x => v x • ξ x) j) ^ 2) := by + rfl + _ ≤ Real.sqrt (∑ j ∈ Finset.range (N + 1), (2 * (A j + C j)) ^ 2) := hroot_bound + _ = 2 * Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j + C j) ^ 2) := by + rw [sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) 2 (fun j => A j + C j) (by norm_num)] + _ ≤ 2 * (Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j) ^ 2) + + Real.sqrt (∑ j ∈ Finset.range (N + 1), (C j) ^ 2)) := by + refine mul_le_mul_of_nonneg_left hsplit ?_ + norm_num + _ = 2 * (cubeScaleFactor Q * B * cubeL2ScalarPartialSeminormTwo Q (s - 1) N v + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N v) := by + rw [show Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j) ^ 2) = + cubeScaleFactor Q * B * cubeL2ScalarPartialSeminormTwo Q (s - 1) N v by + unfold A cubeL2ScalarPartialSeminormTwo + exact sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) + (cubeScaleFactor Q * B) (fun j => cubeL2ScalarDepthSeminorm Q (s - 1) v j) + (mul_nonneg (cubeScaleFactor_nonneg Q) hB)] + rw [show Real.sqrt (∑ j ∈ Finset.range (N + 1), (C j) ^ 2) = + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N v by + unfold C cubeBesovPositiveScalarPartialSeminormTwo + exact sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) + (cubeLpNorm Q ∞ ξ) (fun j => cubeBesovPositiveScalarDepthSeminorm Q s v j) + (cubeLpNorm_nonneg Q ∞ ξ)] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_centered_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + {B : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => (u x - cubeAverage Q u) • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N (fun x => u x - cubeAverage Q u) + + cubeLpNorm Q ∞ ξ * + cubeBesovPositiveScalarPartialSeminormTwo Q s N (fun x => u x - cubeAverage Q u)) := by + have hu_centered : + MeasureTheory.MemLp (fun x => u x - cubeAverage Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (MeasureTheory.memLp_const (cubeAverage Q u)) + simpa using + cubeBesovPositiveVectorPartialSeminormTwo_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N (fun x => u x - cubeAverage Q u) ξ hB hu_centered hξLp hξ hderiv + +theorem cubeLpNorm_two_le_cubeBesovPartialNormTop_zero {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) v ≤ cubeBesovPartialNormTop Q 0 (2 : ℝ≥0∞) 0 v := by + have hv_fluct : + MeasureTheory.MemLp (cubeFluctuation Q v) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hv.sub (MeasureTheory.memLp_const (cubeAverage Q v)) + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage Q v) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverage Q v) + calc + cubeLpNorm Q (2 : ℝ≥0∞) v + = cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => cubeFluctuation Q v x + (fun _ : Vec d => cubeAverage Q v) x) := by + congr 1 + funext x + simp [cubeFluctuation] + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q v) + + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => cubeAverage Q v) := by + exact cubeLpNorm_add_le Q (2 : ℝ≥0∞) + (cubeFluctuation Q v) (fun _ : Vec d => cubeAverage Q v) + hv_fluct hconst (by norm_num) + _ = cubeBesovOscillation Q (2 : ℝ≥0∞) v + ‖cubeAverage Q v‖ := by + rw [cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) (c := cubeAverage Q v) (by norm_num)] + simp [cubeBesovOscillation] + _ = cubeBesovPartialNormTop Q 0 (2 : ℝ≥0∞) 0 v := by + have hosc_nonneg : 0 ≤ cubeBesovOscillation Q (2 : ℝ≥0∞) v := + cubeBesovOscillation_nonneg Q (2 : ℝ≥0∞) v + have hsq : + (cubeBesovOscillation Q (2 : ℝ≥0∞) v ^ (2 : ℕ)) ^ ((2 : ℝ)⁻¹) = + cubeBesovOscillation Q (2 : ℝ≥0∞) v := by + simpa using sq_rpow_half_eq_of_nonneg hosc_nonneg + simp [cubeBesovPartialNormTop, cubeBesovPartialSeminormTop, cubeBesovDepthSeminorm, + cubeBesovDepthAverage_depth_zero, cubeBesovDepthWeight_depth_zero, cubeBesovScaleWeight] + simpa using hsq.symm + +theorem CubeDescendantProjectedDualMeanZeroPoincareEstimate.restrict_to_descendant + {d : ℕ} {Q R : TriadicCube d} {C : ℝ} {u g : Vec d → ℝ} {M j : ℕ} + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C u g M) + (hR : R ∈ descendantsAtDepth Q j) (hj : j ≤ M) : + CubeDescendantProjectedDualMeanZeroPoincareEstimate R C u g (M - j) := by + intro n hn S hS + have hn_le : n ≤ M - j := Nat.lt_succ_iff.mp (Finset.mem_range.mp hn) + have hjn_le : j + n ≤ M := by + simpa [Nat.add_sub_of_le hj] using Nat.add_le_add_left hn_le j + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + have hmem : j + n ∈ Finset.range (M + 1) := by + exact Finset.mem_range.mpr (Nat.lt_succ_iff.mpr hjn_le) + have hbase := hproj (j + n) hmem S hSQ + have hsub : M - (j + n) = (M - j) - n := by + omega + simpa [hsub] using hbase + +theorem cubeL2ScalarDepthAverage_eq_cubeLpNorm_two_sq {d : ℕ} + (Q : TriadicCube d) (v : Vec d → ℝ) (j : ℕ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeL2ScalarDepthAverage Q v j = (cubeLpNorm Q (2 : ℝ≥0∞) v) ^ 2 := by + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖v x‖ ^ (2 : ℝ)) + (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hv.integrable_norm_rpow (by norm_num) (by norm_num)) + calc + cubeL2ScalarDepthAverage Q v j + = descendantsAverage Q j (fun R => cubeAverage R (fun x => ‖v x‖ ^ (2 : ℝ))) := by + unfold cubeL2ScalarDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := R) (p := (2 : ℝ≥0∞)) + (f := v) (by norm_num) (by norm_num) + (memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR hv)) + _ = cubeAverage Q (fun x => ‖v x‖ ^ (2 : ℝ)) := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => ‖v x‖ ^ (2 : ℝ)) hnorm_int] + _ = (cubeLpNorm Q (2 : ℝ≥0∞) v) ^ 2 := by + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := Q) (p := (2 : ℝ≥0∞)) + (f := v) (by norm_num) (by norm_num) hv).symm + +theorem cubeL2ScalarDepthSeminorm_eq_rpow_mul_cubeLpNorm_two {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (v : Vec d → ℝ) (j : ℕ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeL2ScalarDepthSeminorm Q s v j = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * cubeLpNorm Q (2 : ℝ≥0∞) v := by + rw [cubeL2ScalarDepthSeminorm, cubeL2ScalarDepthAverage_eq_cubeLpNorm_two_sq Q v j hv] + rw [Real.sqrt_sq_eq_abs] + simp [abs_of_nonneg (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) v)] + +theorem cubeBesovPartialNormTop_zero_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (N : ℕ) (v : Vec d → ℝ) : + cubeBesovPartialNormTop Q s p 0 v ≤ cubeBesovPartialNormTop Q s p N v := by + unfold cubeBesovPartialNormTop cubeBesovPartialSeminormTop + refine add_le_add ?_ le_rfl + simpa using + (Finset.le_sup' (s := Finset.range (N + 1)) + (f := fun j => cubeBesovDepthSeminorm Q s p v j) (by simp : 0 ∈ Finset.range (N + 1))) + +theorem rpow_three_weight_sq_eq_geometric_ratio_pow (s : ℝ) (j : ℕ) : + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 = (Real.rpow (3 : ℝ) (2 * s)) ^ j := by + calc + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 + = Real.rpow (Real.rpow (3 : ℝ) (s * (j : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) ((s * (j : ℝ)) * 2) := by + simpa using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (s * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) ((2 * s) * (j : ℝ)) := by + congr 1 + ring + _ = Real.rpow (Real.rpow (3 : ℝ) (2 * s)) (j : ℝ) := by + simpa using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (2 * s) (j : ℝ)) + _ = (Real.rpow (3 : ℝ) (2 * s)) ^ j := by + exact Real.rpow_natCast _ j + +theorem cubeL2ScalarPartialSeminormTwo_le_geometric_mul_cubeLpNorm_two_of_neg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (v : Vec d → ℝ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hs : s < 0) : + cubeL2ScalarPartialSeminormTwo Q s N v ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * s))⁻¹) * cubeLpNorm Q (2 : ℝ≥0∞) v := by + let r : ℝ := Real.rpow (3 : ℝ) (2 * s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by positivity) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hsum_bound : + ∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 ≤ (1 - r)⁻¹ := by + calc + ∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 + = ∑ j ∈ Finset.range (N + 1), r ^ j := by + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_three_weight_sq_eq_geometric_ratio_pow] + _ ≤ (1 - r)⁻¹ := geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one + have hsqrt_bound : + Real.sqrt (∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) ≤ + Real.sqrt ((1 - r)⁻¹) := by + exact Real.sqrt_le_sqrt hsum_bound + have hpartial_eq : + cubeL2ScalarPartialSeminormTwo Q s N v = + cubeLpNorm Q (2 : ℝ≥0∞) v * + Real.sqrt (∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) := by + calc + cubeL2ScalarPartialSeminormTwo Q s N v + = Real.sqrt (∑ j ∈ Finset.range (N + 1), + (cubeLpNorm Q (2 : ℝ≥0∞) v * Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) := by + unfold cubeL2ScalarPartialSeminormTwo + refine congrArg Real.sqrt ?_ + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeL2ScalarDepthSeminorm_eq_rpow_mul_cubeLpNorm_two Q s v j hv] + ring + _ = cubeLpNorm Q (2 : ℝ≥0∞) v * + Real.sqrt (∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) := by + exact sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) + (cubeLpNorm Q (2 : ℝ≥0∞) v) + (fun j => Real.rpow (3 : ℝ) (s * (j : ℝ))) + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) v) + have hnorm_nonneg : 0 ≤ cubeLpNorm Q (2 : ℝ≥0∞) v := + cubeLpNorm_nonneg Q (2 : ℝ≥0∞) v + calc + cubeL2ScalarPartialSeminormTwo Q s N v + = cubeLpNorm Q (2 : ℝ≥0∞) v * + Real.sqrt (∑ j ∈ Finset.range (N + 1), (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) := hpartial_eq + _ ≤ cubeLpNorm Q (2 : ℝ≥0∞) v * Real.sqrt ((1 - r)⁻¹) := by + exact mul_le_mul_of_nonneg_left hsqrt_bound hnorm_nonneg + _ = Real.sqrt ((1 - r)⁻¹) * cubeLpNorm Q (2 : ℝ≥0∞) v := by + ring + +theorem cubeBesovPositiveVectorPartialSeminormTwo_scalar_smul_le_note_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := by + have hraw := + cubeBesovPositiveVectorPartialSeminormTwo_scalar_smul_le_cutoff_terms_of_contDiff_component_bound + Q s N u ξ hB hu hξLp hξ hderiv + have hs_neg : s - 1 < 0 := by linarith + have hL2 : + cubeL2ScalarPartialSeminormTwo Q (s - 1) N u ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u := by + exact cubeL2ScalarPartialSeminormTwo_le_geometric_mul_cubeLpNorm_two_of_neg + Q (s - 1) N u hu hs_neg + have hmem : + ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro j hj R hR + exact memLp_on_descendant_of_memLp_generic (E := ℝ) hR hu + have hpos_eq : + cubeBesovPositiveScalarPartialSeminormTwo Q s N u = + cubeBesovPositiveScalarPartialSeminormTwo Q s N (cubeFluctuation Q u) := by + simpa [cubeFluctuation] using! + (cubeBesovPositiveScalarPartialSeminormTwo_sub_const + Q s N u (cubeAverage Q u) hmem).symm + have hfluct : + cubeBesovPositiveScalarPartialSeminormTwo Q s N u ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) := by + rw [hpos_eq] + exact + hproj.fluctuation_positiveScalarPartialSeminormTwo_le_note_rhs + (u := u) (hg := hg) hs0 hC + have hcoeff_nonneg : 0 ≤ cubeScaleFactor Q * B := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hB + have hterm1 : + cubeScaleFactor Q * B * cubeL2ScalarPartialSeminormTwo Q (s - 1) N u ≤ + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) := by + exact mul_le_mul_of_nonneg_left hL2 hcoeff_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N u ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) := by + exact mul_le_mul_of_nonneg_left hfluct (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x • ξ x) + ≤ 2 * (cubeScaleFactor Q * B * + cubeL2ScalarPartialSeminormTwo Q (s - 1) N u + + cubeLpNorm Q ∞ ξ * cubeBesovPositiveScalarPartialSeminormTwo Q s N u) := hraw + _ ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := by + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) (by norm_num) + +theorem cubeBesovPositiveVectorSeminormTwo_scalar_smul_le_note_poincare_cutoff_terms + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + {B C BcircS : ℝ} (hB : 0 ≤ B) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 ≤ C) + (hnegS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ BcircS) : + cubeBesovPositiveVectorSeminormTwo Q s (fun x => u x • ξ x) ≤ + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound (Q := Q) (s := s) + (u := fun x => u x • ξ x) ?_ + intro N + have hpartial := + cubeBesovPositiveVectorPartialSeminormTwo_scalar_smul_le_note_poincare_cutoff_terms + Q s N u g ξ hB hu (hproj N) hg hξLp hξ hderiv hs0 hs1 hC + have hnoteS_nonneg : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg + (mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _)) + (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2inner : + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g) + ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS) := by + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovScaleWeight_nonneg (-s) Q) + exact mul_le_mul_of_nonneg_left (hnegS N) hnoteS_nonneg + have hterm2 : + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g)) + ≤ + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (1 - (3 : ℝ) ^ (-s))⁻¹) * + BcircS)) := by + exact mul_le_mul_of_nonneg_left hterm2inner (cubeLpNorm_nonneg Q ∞ ξ) + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x • ξ x) + ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g))) := hpartial + _ ≤ 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + cubeLpNorm Q (2 : ℝ≥0∞) u) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * BcircS))) := by + exact mul_le_mul_of_nonneg_left (add_le_add le_rfl hterm2) (by norm_num) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge.lean new file mode 100644 index 0000000000..d164d44aef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.ExactRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.Flux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimateFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CenteredLocalCoefficient.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CenteredLocalCoefficient.lean new file mode 100644 index 0000000000..79cb5ff046 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CenteredLocalCoefficient.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs + +/-! # Centered Local Coefficient -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Centered local coefficient bridge + +This module isolates the centered small-cube coefficient bookkeeping used by +the descendant Caccioppoli summation. The final scalar comparison is left as a +single adequacy hypothesis, while the exact coefficient is reduced to the +existing average, Besov, and cutoff-gradient factor bounds. +-/ + +/-- Centered exact coefficient domination from separated scalar factors. + +The hypothesis `hcentered` is the remaining scalar algebraic comparison +against the note-facing centered single-cube coefficient. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_of_separated_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) + {Aavg AfluxS Xi D A1 AS T : ℝ} + (hs0 : 0 < s) (hC : 0 ≤ C) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hAavg : Real.sqrt (coarseBBlockNorm Q a) ≤ Aavg) + (hAfluxS : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ AfluxS) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s Aavg AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ T) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ T := by + have hAavg_nonneg : 0 ≤ Aavg := by + exact le_trans (Real.sqrt_nonneg _) hAavg + have hXi_nonneg : 0 ≤ Xi := by + exact le_trans (cubeLpNorm_nonneg Q ∞ ξ) hξ + have hD_nonneg : 0 ≤ D := by + exact le_trans hB_nonneg hB + have hdiscS_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs0) + have hLambdaS_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hAfluxS_nonneg : 0 ≤ AfluxS := by + exact le_trans + (mul_nonneg (inv_nonneg.mpr hdiscS_pos.le) + (Real.rpow_nonneg hLambdaS_nonneg _)) + hAfluxS + let BgCent : ℝ := + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C + have hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := by + exact + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hB_nonneg hC + have hBgCent : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ BgCent := by + exact + coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hD_nonneg hC + hξ hB hAcirc1 hAcircS + have havgCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C := by + exact + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ hAavg_nonneg hXi_nonneg hAcirc1_nonneg hC + hAavg hξ hAcirc1 + have hbesovCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s Aavg AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) := by + simpa [BgCent] using + (coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ hAavg_nonneg hAfluxS_nonneg hBgCentCoeff_nonneg + hAavg hAfluxS hBgCent) + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact le_trans (add_le_add havgCoeff_le hbesovCoeff_le) hcentered + +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_singleCubeBoundaryCenteredCoeff_of_separated_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C k h : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) + {Aavg AfluxS Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hC : 0 ≤ C) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hAavg : Real.sqrt (coarseBBlockNorm Q a) ≤ Aavg) + (hAfluxS : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ AfluxS) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s Aavg AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h := by + have hAavg_nonneg : 0 ≤ Aavg := by + exact le_trans (Real.sqrt_nonneg _) hAavg + have hXi_nonneg : 0 ≤ Xi := by + exact le_trans (cubeLpNorm_nonneg Q ∞ ξ) hξ + have hD_nonneg : 0 ≤ D := by + exact le_trans hB_nonneg hB + have hdiscS_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs0) + have hLambdaS_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hAfluxS_nonneg : 0 ≤ AfluxS := by + exact le_trans + (mul_nonneg (inv_nonneg.mpr hdiscS_pos.le) + (Real.rpow_nonneg hLambdaS_nonneg _)) + hAfluxS + let BgCent : ℝ := + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C + have hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := by + exact + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hB_nonneg hC + have hBgCent : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ BgCent := by + exact + coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hD_nonneg hC + hξ hB hAcirc1 hAcircS + have havgCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C := by + exact + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ hAavg_nonneg hXi_nonneg hAcirc1_nonneg hC + hAavg hξ hAcirc1 + have hbesovCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s Aavg AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) := by + simpa [BgCent] using + (coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ hAavg_nonneg hAfluxS_nonneg hBgCentCoeff_nonneg + hAavg hAfluxS hBgCent) + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact le_trans (add_le_add havgCoeff_le hbesovCoeff_le) hcentered + +/-- Local small-cube version of +`coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_singleCubeBoundaryCenteredCoeff_of_separated_factor_bounds`. + +The conclusion has the descendant-local scale `kR - j` and height `j`, which is +the exact centered branch consumed by the small-cube summation layer. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_local_singleCubeBoundaryCenteredCoeff_of_separated_factor_bounds + {d : ℕ} (R : TriadicCube d) (a : CoeffField d) (s Ceff kR : ℝ) (j : ℕ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) + {Aavg AfluxS Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hCeff : 0 ≤ Ceff) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hAavg : Real.sqrt (coarseBBlockNorm R a) ≤ Aavg) + (hAfluxS : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ AfluxS) + (hξ : cubeLpNorm R ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 Ceff + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s Aavg AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s Xi D A1 AS Ceff) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ Acirc1 AcircS B Ceff ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ) := by + exact + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_singleCubeBoundaryCenteredCoeff_of_separated_factor_bounds + R a s Ceff (kR - (j : ℝ)) (j : ℝ) ξ Acirc1 AcircS B + hs0 hCeff hB_nonneg hAcirc1_nonneg hAcircS_nonneg hAavg hAfluxS + hξ hB hAcirc1 hAcircS hcentered + +/-- Canonical-factor local small-cube centered coefficient bound. + +This fills the average and flux slots with `coarseCaccioppoliLambdaFactor` and +uses the descendant cutoff-gradient bound supplied as `hξ`. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_local_singleCubeBoundaryCenteredCoeff_of_canonical_factor_bounds + {d : ℕ} (R : TriadicCube d) (a : CoeffField d) (s Ceff kR : ℝ) (j : ℕ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) + {Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hCeff : 0 ≤ Ceff) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hξ : cubeLpNorm R ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) Xi A1 Ceff + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s Xi D A1 AS Ceff) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ Acirc1 AcircS B Ceff ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ) := by + exact + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_local_singleCubeBoundaryCenteredCoeff_of_separated_factor_bounds + R a s Ceff kR j ξ Acirc1 AcircS B hs0 hCeff + hB_nonneg hAcirc1_nonneg hAcircS_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a hs0 hsumS) + (by simp [coarseCaccioppoliLambdaFactor]) + hξ hB hAcirc1 hAcircS hcentered + +/-- Quantitative parent-cutoff specialization on a depth-`j` descendant. + +The `L^\infty` bound for the gradient field is supplied by +`quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le_on_descendant`; the +only remaining cutoff-size comparison is the scalar Hessian bound `hB`. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_local_singleCubeBoundaryCenteredCoeff_of_quantitativeCutoff_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (a : CoeffField d) + (s Ceff kR : ℝ) {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS B : ℝ) {D A1 AS : ℝ} + (hs0 : 0 < s) (hCeff : 0 ≤ Ceff) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hB_nonneg : 0 ≤ B) (hB : B ≤ D) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hAcircS_nonneg : 0 ≤ AcircS) + (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) + A1 Ceff + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) + D A1 AS Ceff) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField η) Acirc1 AcircS B Ceff ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s Ceff + (kR - (j : ℝ)) (j : ℝ) := by + exact + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_local_singleCubeBoundaryCenteredCoeff_of_canonical_factor_bounds + R a s Ceff kR j (scalarCutoffGradientField η) Acirc1 AcircS B + hs0 hCeff hsumS hB_nonneg hAcirc1_nonneg hAcircS_nonneg + (quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le_on_descendant hR η) + hB hAcirc1 hAcircS hcentered + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CutoffSizes.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CutoffSizes.lean new file mode 100644 index 0000000000..68486c90f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/CutoffSizes.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.Flux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions + +/-! # Cutoff Sizes -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-- Exact cutoff size controlling the constant piece `(u)_Q ξ`. + +The local split theorem only needs this quantity through an upper bound, but +keeping the exact expression here gives the next coefficient-bookkeeping layer +a stable target to dominate by the note's radius/height constants. -/ +def coarseCaccioppoliConstantCutoffSize {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (B : ℝ) : ℝ := + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) + +/-- Exact cutoff size controlling the centered piece `(u-(u)_Q) ξ` after the +cutoff-product theorem and projected mean-zero Poincare estimate have supplied +the two scalar `circ` bounds. -/ +def coarseCaccioppoliCenteredCutoffSize {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS E B C : ℝ) : ℝ := + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * (AcircS * E)))) + +theorem coarseCaccioppoliConstantCutoffSize_nonneg {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {B : ℝ} (hB : 0 ≤ B) : + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B := by + unfold coarseCaccioppoliConstantCutoffSize + refine mul_nonneg (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) ?_ + exact add_nonneg hB + (mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) (cubeLpNorm_nonneg Q ∞ ξ)) + +theorem coarseCaccioppoliConstantCutoffSize_pos_of_cubeLpNorm_pos_of_B_pos {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) {B : ℝ} + (hu : 0 < cubeLpNorm Q (2 : ℝ≥0∞) u) (hB : 0 < B) : + 0 < coarseCaccioppoliConstantCutoffSize Q u ξ B := by + unfold coarseCaccioppoliConstantCutoffSize + have htail : + 0 ≤ cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := + mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) (cubeLpNorm_nonneg Q ∞ ξ) + exact mul_pos hu (add_pos_of_pos_of_nonneg hB htail) + +/-- Separated upper bound for the constant cutoff size. In applications `U` +is a note-facing bound for `‖u‖_{L^2(Q)}` and `Xi`, `D` bound the cutoff and +its derivative. -/ +def coarseCaccioppoliConstantCutoffSizeFactorBound {d : ℕ} (Q : TriadicCube d) + (U Xi D : ℝ) : ℝ := + U * (D + cubeBesovScaleWeight 1 Q * Xi) + +theorem coarseCaccioppoliConstantCutoffSizeFactorBound_nonneg {d : ℕ} + (Q : TriadicCube d) {U Xi D : ℝ} + (hU : 0 ≤ U) (hXi : 0 ≤ Xi) (hD : 0 ≤ D) : + 0 ≤ coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + unfold coarseCaccioppoliConstantCutoffSizeFactorBound + exact mul_nonneg hU + (add_nonneg hD (mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) hXi)) + +theorem coarseCaccioppoliConstantCutoffSize_le_factorBound {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) {B U Xi D : ℝ} + (hU_nonneg : 0 ≤ U) (hB_nonneg : 0 ≤ B) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) (hB : B ≤ D) : + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + unfold coarseCaccioppoliConstantCutoffSize + coarseCaccioppoliConstantCutoffSizeFactorBound + have hinner : + B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ ≤ + D + cubeBesovScaleWeight 1 Q * Xi := by + exact add_le_add hB + (mul_le_mul_of_nonneg_left hξ (cubeBesovScaleWeight_nonneg 1 Q)) + have hinner_nonneg : + 0 ≤ B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ := by + exact add_nonneg hB_nonneg + (mul_nonneg (cubeBesovScaleWeight_nonneg 1 Q) (cubeLpNorm_nonneg Q ∞ ξ)) + exact mul_le_mul hu hinner hinner_nonneg hU_nonneg + +theorem coarseCaccioppoliCenteredCutoffSize_nonneg {d : ℕ} (Q : TriadicCube d) + {s : ℝ} (ξ : Vec d → Vec d) {Acirc1 AcircS E B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hE : 0 ≤ E) (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C := by + unfold coarseCaccioppoliCenteredCutoffSize + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hterm1 : + 0 ≤ cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E))) := by + refine mul_nonneg (mul_nonneg (cubeScaleFactor_nonneg Q) hB) ?_ + refine mul_nonneg (Real.sqrt_nonneg _) ?_ + exact mul_nonneg hnote1 (mul_nonneg hAcirc1 hE) + have hnoteS : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg hnote1 (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2 : + 0 ≤ cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * (AcircS * E))) := by + refine mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) ?_ + refine mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) ?_ + exact mul_nonneg hnoteS (mul_nonneg hAcircS hE) + exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (add_nonneg hterm1 hterm2) + +theorem coarseCaccioppoliCenteredCutoffSize_pos_of_first_branch {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (ξ : Vec d → Vec d) {Acirc1 AcircS E B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) (hAcirc1 : 0 < Acirc1) + (hAcircS : 0 ≤ AcircS) (hE : 0 < E) (hB : 0 < B) (hC : 0 < C) : + 0 < coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C := by + unfold coarseCaccioppoliCenteredCutoffSize + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hexp_neg : 2 * (s - 1) < 0 := by nlinarith + have hrpow_lt_one : + Real.rpow (3 : ℝ) (2 * (s - 1)) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) hexp_neg + have hsqrt_pos : + 0 < Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) := + Real.sqrt_pos.2 (inv_pos.mpr (sub_pos.mpr hrpow_lt_one)) + have hnote1_pos : + 0 < ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_pos (mul_pos (by norm_num) hC) (Real.rpow_pos_of_pos (by norm_num) _) + have hterm1 : + 0 < cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E))) := by + refine mul_pos (mul_pos hscale hB) ?_ + refine mul_pos hsqrt_pos ?_ + exact mul_pos hnote1_pos (mul_pos hAcirc1 hE) + have hterm2 : + 0 ≤ cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * (AcircS * E))) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hnoteS : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) := by + exact mul_nonneg hnote1_pos.le (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + refine mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) ?_ + refine mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) ?_ + exact mul_nonneg hnoteS (mul_nonneg hAcircS hE.le) + exact mul_pos (by norm_num : 0 < (2 : ℝ)) (add_pos_of_pos_of_nonneg hterm1 hterm2) + +/-- Flux-side hypotheses needed to substitute coarse-Poincare energy controls +into the local Caccioppoli split theorem. -/ +def CoarseCaccioppoliFluxEnergyControls {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) (flux : Vec d → Vec d) (energy : Vec d → ℝ) : + Prop := + (∀ x ∈ cubeSet Q, 0 ≤ energy x) ∧ + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume ∧ + CubeAverageFluxEnergyControl Q a flux energy ∧ + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) ∧ + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) + +/-- Gradient-average energy controls restrict from a parent cube to any +depth-`j` descendant. -/ +theorem CubeAverageGradientEnergyControl.restrict_to_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {a : CoeffField d} {g : Vec d → Vec d} {energy : Vec d → ℝ} + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hR : R ∈ descendantsAtDepth Q j) : + CubeAverageGradientEnergyControl R a g energy := by + intro n S hS + exact hgrad (j + n) S (mem_descendantsAtDepth_add hR hS) + +/-- Flux-energy controls restrict from a parent cube to any depth-`j` +descendant. -/ +theorem CoarseCaccioppoliFluxEnergyControls.restrict_to_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {a : CoeffField d} {s : ℝ} {flux : Vec d → Vec d} {energy : Vec d → ℝ} + (hctrl : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) : + CoarseCaccioppoliFluxEnergyControls R a s flux energy := by + rcases hctrl with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + refine ⟨?_, ?_, ?_, ?_, ?_⟩ + · intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + · exact henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + · intro n S hS + exact hfluxCtrl (j + n) S (mem_descendantsAtDepth_add hR hS) + · exact + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 : ℝ) (by norm_num) hR hsum1 + · exact + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a s hs hR hsumS + +/-- Harmonic closed-cube constructor for the flux energy-control package used +by the Caccioppoli bridge. The final note-facing endpoints still work on open +cubes; this lemma records the exact stronger compatibility hypothesis under +which the flux package is already available from the coarse-Poincare API. -/ +theorem CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + {lam Lam : ℝ} (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) : + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) (u.toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a u x) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + refine ⟨?_, ?_, ?_, ?_, ?_⟩ + · exact scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u + · exact ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u + · exact + cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEll u hOrigin + · exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s := (1 : ℝ)) (by norm_num) hEll hOrigin + · exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s := s) hs hEll hOrigin + +/-- Scalar projected-Poincare and cutoff-product hypotheses remaining after the +flux-side coarse-Poincare controls have been substituted. -/ +def CoarseCaccioppoliScalarCutoffControls {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (u g : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B C : ℝ) : Prop := + 0 ≤ B ∧ + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B ∧ + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B C ∧ + 0 ≤ C ∧ + (∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) ∧ + (∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) ∧ + (∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) + +/-- Vector projected-Poincare and cutoff-product hypotheses remaining after the +flux-side coarse-Poincare controls have been substituted. + +The Poincare constant is the vector constant `C`; downstream exact RHS +bookkeeping uses the effective scalar-shaped constant +`(Fintype.card (Fin d) : ℝ) * C`, reflecting the sum over gradient +components. -/ +def CoarseCaccioppoliVectorCutoffControls {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (u : Vec d → ℝ) (G : Vec d → Vec d) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B C : ℝ) : Prop := + 0 ≤ B ∧ + 0 ≤ AcircS ∧ + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B ∧ + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C) ∧ + 0 ≤ C ∧ + (∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) ∧ + (∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) ∧ + (∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) ∧ + (∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) ∧ + (∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation.lean new file mode 100644 index 0000000000..2d3e9d36fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation.lean @@ -0,0 +1,565 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.ExactRhs + +/-! # Descendant Summation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Descendant summation for the small-cube Caccioppoli route + +The LaTeX proof estimates the cutoff pairing on small cubes and then sums over +those cubes. This file isolates the measure-theoretic bookkeeping: a +cube-average over `Q` is the descendants-average of the cube-averages over the +depth-`j` descendants, hence its absolute value is controlled by the +descendants-average of the local absolute values. +-/ + +/-- Small-cube Caccioppoli estimate in the exact-RHS proof shape. + +This theorem is the direct descendant route: estimate the cutoff pairing on +each depth-`j` cube using the parent quantitative cutoff, average the local +exact RHS values, and collapse the result to the parent raw RHS by finite +Cauchy. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_raw_of_parentQuantitativeCutoff_on_descendants + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C K Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s (scalarCutoffGradientField η) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * cubeAverage Q energy + Bcross * Real.sqrt (cubeAverage Q energy) := by + refine le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + Q j flux (scalarCutoffGradientField η) u + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + hpair_int ?_) ?_ + · intro R hR + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := energy) (η := η) (Acirc1 := Acirc1) (AcircS := AcircS) + (C := C) hs0 hs1 (hfluxMem R hR) (hu R hR) (hG R hR) + (hfluxEnergy R hR) hB hAcircS (hBgConst R hR) (hBgCent R hR) hC + (hproj R hR) (hGcirc1 R hR) (hGcircS R hR) + · exact + descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients + Q j a s u (scalarCutoffGradientField η) energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) K Alpha Bcross + huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + +/-- Variable-`Acirc` version of +`abs_cubeAverage_vecDot_scalar_smul_le_raw_of_parentQuantitativeCutoff_on_descendants`. + +The local descendant pairing and the averaged exact RHS both use +`Acirc1 R` and `AcircS R`. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * cubeAverage Q energy + Bcross * Real.sqrt (cubeAverage Q energy) := by + refine le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + Q j flux (scalarCutoffGradientField η) u + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + hpair_int ?_) ?_ + · intro R hR + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := energy) (η := η) (Acirc1 := Acirc1 R) (AcircS := AcircS R) + (C := C) hs0 hs1 (hfluxMem R hR) (hu R hR) (hG R hR) + (hfluxEnergy R hR) hB (hAcircS R hR) (hBgConst R hR) (hBgCent R hR) hC + (hproj R hR) (hGcirc1 R hR) (hGcircS R hR) + · exact + descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients_variableAcirc + Q j a s u (scalarCutoffGradientField η) energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) K Alpha Bcross + huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + +/-- Localized-energy descendant summation for a cutoff pairing, assuming the +local descendant bounds are already stated with the outer-radius localized +energy density. + +This is the purely summation-level replacement for the old final rewrite by a +full-cube/localized energy equality: the parent exact-RHS collapse is performed +directly on `(scaledClosedCubeSet Q ρ).indicator energy`. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc + {d : ℕ} {Q : TriadicCube d} (j : ℕ) (ρ : ℝ) + (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) {B C K Alpha Bcross : ℝ} + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ + (Acirc1 R) (AcircS R) B C ≤ Alpha) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + |cubeAverage R (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((scaledClosedCubeSet Q ρ).indicator energy) + (Acirc1 R) (AcircS R) B C) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + Alpha * coarseCaccioppoliLocalizedEnergyProfile Q ρ energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ energy) := by + refine le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + Q j flux ξ u + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((scaledClosedCubeSet Q ρ).indicator energy) + (Acirc1 R) (AcircS R) B C) + hpair_int hlocal) ?_ + exact + descendantsAverage_fluxEnergyExactRhs_le_localized_raw_of_pointwise_coefficients_variableAcirc + Q j ρ a s u ξ energy Acirc1 AcircS B C K Alpha Bcross + huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + +/-- Arbitrary-center local-patch analogue of +`abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc`. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_local_exactRhs_bounds_variableAcirc + {d : ℕ} {Q : TriadicCube d} (center : Vec d) (j : ℕ) (rho : ℝ) + (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) {B C K Alpha Bcross : ℝ} + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ + (Acirc1 R) (AcircS R) B C ≤ Alpha) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + |cubeAverage R (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (Acirc1 R) (AcircS R) B C) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + Alpha * coarseCaccioppoliLocalEnergyProfile Q center rho energy + + Bcross * Real.sqrt + (coarseCaccioppoliLocalEnergyProfile Q center rho energy) := by + refine le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + Q j flux ξ u + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (Acirc1 R) (AcircS R) B C) + hpair_int hlocal) ?_ + exact + descendantsAverage_fluxEnergyExactRhs_le_localPatch_raw_of_pointwise_coefficients_variableAcirc + Q center j rho a s u ξ energy Acirc1 AcircS B C K Alpha Bcross + huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + +/-- Parent-cutoff specialization of +`abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc`. + +The only analytic input not supplied here is the genuinely local, support-aware +exact-RHS estimate with the outer localized energy density. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS : TriadicCube d → ℝ) {B C K Alpha Bcross : ℝ} + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField η) (Acirc1 R) (AcircS R) B C ≤ Alpha) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, + |cubeAverage R + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ₂).indicator energy) + (Acirc1 R) (AcircS R) B C) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * coarseCaccioppoliLocalizedEnergyProfile Q ρ₂ energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ₂ energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc + (Q := Q) (j := j) (ρ := ρ₂) (a := a) (s := s) + (flux := flux) (u := u) (ξ := scalarCutoffGradientField η) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := B) (C := C) (K := K) (Alpha := Alpha) (Bcross := Bcross) + hpair_int huQ henergy_nonneg henergy_int hK_nonneg hKparent + hconst hcent hlocal + +/-- Buffered localized-energy descendant summation for a parent cutoff. + +The cutoff is supported in `scaledClosedCubeSet Q ρ₂`, while the RHS energy is +localized on the larger radius `ρ`. The buffer hypothesis says every +depth-`j` descendant is small enough that a cube touching the cutoff support is +contained in the larger localization cube; descendants missing the support have +zero local pairing. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc_of_support_buffer + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ - ρ₂) * cubeRadius Q) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * coarseCaccioppoliLocalizedEnergyProfile Q ρ energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc + (Q := Q) (j := j) (ρ := ρ) (a := a) (s := s) + (flux := flux) (u := u) (ξ := scalarCutoffGradientField η) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + (K := K) (Alpha := Alpha) (Bcross := Bcross) + hpair_int huQ henergy_nonneg henergy_int hK_nonneg hKparent + hconst hcent + (fun R hR => + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_support_buffer + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) + (ρ := ρ) (flux := flux) (u := u) (G := G) (energy := energy) + (η := η) (Acirc1 := Acirc1 R) (AcircS := AcircS R) (C := C) + (hbuffer R hR) hs0 hs1 (hfluxMem R hR) (hu R hR) (hG R hR) + (hfluxEnergy R hR) hB (hAcirc1 R hR) (hAcircS R hR) + (hBgConst R hR) (hBgCent R hR) hC (hproj R hR) + (hGcirc1 R hR) (hGcircS R hR)) + +/-- Buffered arbitrary-center local-patch descendant summation for the +translated canonical cutoff. This is the summation-level form of the boundary +Caccioppoli radius step from the notes. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_localCanonicalCutoff_on_descendants_variableAcirc_of_support_buffer + {d : ℕ} {Q : TriadicCube d} (center : Vec d) (j : ℕ) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hs0 : 0 < s) (hs1 : s < 1) + (hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (rho - rhoOuter) * (cubeRadius Q / 3)) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2) + + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter))) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + Alpha * coarseCaccioppoliLocalEnergyProfile Q center rho energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalEnergyProfile Q center rho energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_local_exactRhs_bounds_variableAcirc + (Q := Q) (center := center) (j := j) (rho := rho) + (a := a) (s := s) (flux := flux) (u := u) + (ξ := scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + (K := K) (Alpha := Alpha) (Bcross := Bcross) + hpair_int huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + (fun R hR => + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_descendant_of_support_buffer + (Q := Q) (R := R) (j := j) hR + (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1 R) (AcircS := AcircS R) (C := C) + hinner hinnerOuter (hbuffer R hR) hs0 hs1 + (hfluxMem R hR) (hu R hR) (hG R hR) (hfluxEnergy R hR) hB + (hAcirc1 R hR) (hAcircS R hR) + (hBgConst R hR) (hBgCent R hR) hC (hproj R hR) + (hGcirc1 R hR) (hGcircS R hR)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Averages.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Averages.lean new file mode 100644 index 0000000000..c4d7b37493 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Averages.lean @@ -0,0 +1,357 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Gradient + +/-! # Averages -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Descendant summation for the small-cube Caccioppoli route + +The LaTeX proof estimates the cutoff pairing on small cubes and then sums over +those cubes. This file isolates the measure-theoretic bookkeeping: a +cube-average over `Q` is the descendants-average of the cube-averages over the +depth-`j` descendants, hence its absolute value is controlled by the +descendants-average of the local absolute values. +-/ + +/-- Triangle inequality after decomposing a cube average into depth-`j` +descendant cube averages. -/ +theorem abs_cubeAverage_le_descendantsAverage_abs_cubeAverage_of_integrableOn + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ) + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) : + |cubeAverage Q f| ≤ descendantsAverage Q j (fun R => |cubeAverage R f|) := by + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := f) hf] + unfold descendantsAverage + have hcard_nonneg : 0 ≤ (((descendantsAtDepth Q j).card : ℝ)⁻¹) := by + positivity + calc + |((↑(descendantsAtDepth Q j).card)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, cubeAverage R f)| + = ((↑(descendantsAtDepth Q j).card)⁻¹) * + |∑ R ∈ descendantsAtDepth Q j, cubeAverage R f| := by + rw [abs_mul, abs_of_nonneg hcard_nonneg] + _ ≤ ((↑(descendantsAtDepth Q j).card)⁻¹) * + ∑ R ∈ descendantsAtDepth Q j, |cubeAverage R f| := by + exact mul_le_mul_of_nonneg_left + (Finset.abs_sum_le_sum_abs _ _) hcard_nonneg + _ = (↑(descendantsAtDepth Q j).card)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, |cubeAverage R f| := by + rfl + +/-- If each depth-`j` descendant cube average is bounded by a local RHS, then +the parent cube average is bounded by the descendants-average of those local +RHS values. -/ +theorem abs_cubeAverage_le_descendantsAverage_of_local_abs_bounds + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ) (B : TriadicCube d → ℝ) + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, |cubeAverage R f| ≤ B R) : + |cubeAverage Q f| ≤ descendantsAverage Q j B := by + refine + le_trans + (abs_cubeAverage_le_descendantsAverage_abs_cubeAverage_of_integrableOn + Q j f hf) ?_ + unfold descendantsAverage + have hcard_nonneg : 0 ≤ (((descendantsAtDepth Q j).card : ℝ)⁻¹) := by + positivity + exact mul_le_mul_of_nonneg_left + (Finset.sum_le_sum fun R hR => hlocal R hR) hcard_nonneg + +/-- Descendant summation specialized to the Caccioppoli cutoff pairing. The +local estimates may come from any source, in particular from +`abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_parentQuantitativeCutoff_on_descendant`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (flux ξ : Vec d → Vec d) (u : Vec d → ℝ) (B : TriadicCube d → ℝ) + (hf : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume) + (hlocal : + ∀ R ∈ descendantsAtDepth Q j, + |cubeAverage R (fun x => vecDot (flux x) (u x • ξ x))| ≤ B R) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + descendantsAverage Q j B := by + exact + abs_cubeAverage_le_descendantsAverage_of_local_abs_bounds + Q j (fun x => vecDot (flux x) (u x • ξ x)) B hf hlocal + +/-- If a cube lies outside the outer support of a quantitative cutoff, then +the local cutoff-gradient flux pairing over that cube is zero. -/ +theorem cubeAverage_vecDot_scalar_smul_scalarCutoffGradientField_eq_zero_of_forall_notMem_scaledClosedCubeSet + {d : ℕ} {Q R : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (flux : Vec d → Vec d) (u : Vec d → ℝ) + (hout : ∀ x ∈ cubeSet R, x ∉ scaledClosedCubeSet Q ρ₂) : + cubeAverage R + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField (η : Vec d → ℝ) x)) = + 0 := by + rw [← cubeAverage_const (Q := R) (c := 0)] + apply cubeAverage_congr_on_cubeSet + intro x hxR + have hξ : + scalarCutoffGradientField (η : Vec d → ℝ) x = 0 := + scalarCutoffGradientField_eq_zero_of_notMem_tsupport + (fun hx_support => hout x hxR (η.tsupport_subset_scaledClosedCubeSet hx_support)) + simp [hξ, vecDot_zero_right] + +theorem descendantsAverage_add_local {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F G : TriadicCube d → ℝ) : + descendantsAverage Q j (fun R => F R + G R) = + descendantsAverage Q j F + descendantsAverage Q j G := by + classical + let D := descendantsAtDepth Q j + change (↑D.card)⁻¹ * D.sum (fun R => F R + G R) = + (↑D.card)⁻¹ * D.sum F + (↑D.card)⁻¹ * D.sum G + rw [Finset.sum_add_distrib, left_distrib] + +theorem descendantsAverage_const_local {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + descendantsAverage Q j (fun _ => c) = c := by + classical + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum (fun _ => c) = c + have hD : (descendantsAtDepth Q j).Nonempty := descendantsAtDepth_nonempty Q j + have hcard : (((descendantsAtDepth Q j).card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr hD) + rw [Finset.sum_const, nsmul_eq_mul] + rw [← mul_assoc, inv_mul_cancel₀ hcard, one_mul] + +/-- Jensen/Cauchy for the finite descendant average: the average of square +roots is controlled by the square root of the average. -/ +theorem descendantsAverage_sqrt_le_sqrt_descendantsAverage_of_nonneg + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) + (hF : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ F R) : + descendantsAverage Q j (fun R => Real.sqrt (F R)) ≤ + Real.sqrt (descendantsAverage Q j F) := by + have hpq : Real.HolderConjugate (2 : ℝ) (2 : ℝ) := by + refine ⟨?_, ?_, ?_⟩ <;> norm_num + have hholder := + descendantsAverage_mul_le_Lp_mul_Lq_of_nonneg Q j + (fun R => Real.sqrt (F R)) (fun _ => (1 : ℝ)) hpq + (fun R _ => Real.sqrt_nonneg (F R)) + (fun _ _ => by norm_num) + have hleft : + descendantsAverage Q j (fun R => Real.sqrt (F R) * (1 : ℝ)) = + descendantsAverage Q j (fun R => Real.sqrt (F R)) := by + simp + have hsq : + descendantsAverage Q j (fun R => (Real.sqrt (F R)) ^ (2 : ℝ)) = + descendantsAverage Q j F := by + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum (fun R => (Real.sqrt (F R)) ^ (2 : ℝ)) = + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * (descendantsAtDepth Q j).sum F + congr 1 + exact Finset.sum_congr rfl + (fun R hR => by + simpa [pow_two] using Real.sq_sqrt (hF R hR)) + have hone : + descendantsAverage Q j (fun _ => ((1 : ℝ) ^ (2 : ℝ))) = (1 : ℝ) := by + simp + have hmain : + descendantsAverage Q j (fun R => Real.sqrt (F R)) ≤ + (descendantsAverage Q j F) ^ (1 / (2 : ℝ)) * (1 : ℝ) := by + have hholder' := hholder + rw [hleft, hsq, hone] at hholder' + simpa using hholder' + simpa [Real.sqrt_eq_rpow] using hmain + +/-- Descendant Cauchy estimate for the constant branch of the small-cube +Caccioppoli proof. + +This is the step that lets the proof use the parent normalized `L²` norm of +`u` after summing over descendants, instead of requiring a pointwise `L²` +bound on every small cube. -/ +theorem descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u energy : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage Q energy) := by + have hpq : Real.HolderConjugate (2 : ℝ) (2 : ℝ) := by + refine ⟨?_, ?_, ?_⟩ <;> norm_num + have hE_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ cubeAverage R energy := by + intro R hR + exact cubeAverage_nonneg_of_nonneg_on (Q := R) + (fun x hx => henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx)) + have hholder := + descendantsAverage_mul_le_Lp_mul_Lq_of_nonneg Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u) + (fun R => Real.sqrt (cubeAverage R energy)) hpq + (fun R _ => cubeLpNorm_nonneg R (2 : ℝ≥0∞) u) + (fun R _ => Real.sqrt_nonneg (cubeAverage R energy)) + have hA : + descendantsAverage Q j (fun R => (cubeLpNorm R (2 : ℝ≥0∞) u) ^ 2) = + (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 := by + change cubeL2ScalarDepthAverage Q u j = + (cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2 + rw [cubeL2ScalarDepthAverage_eq_cubeLpNorm_two_sq Q u j hu] + have hB : + descendantsAverage Q j (fun R => (Real.sqrt (cubeAverage R energy)) ^ 2) = + cubeAverage Q energy := by + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = cubeAverage Q energy := by + simpa using + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := energy) henergy_int).symm + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum + (fun R => (Real.sqrt (cubeAverage R energy)) ^ 2) = + cubeAverage Q energy + rw [← havg_eq] + unfold descendantsAverage + congr 1 + exact Finset.sum_congr rfl + (fun R hR => by + simpa [pow_two] using Real.sq_sqrt (hE_nonneg R hR)) + have hmain : + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage R energy)) ≤ + ((cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2) ^ (1 / (2 : ℝ)) * + (cubeAverage Q energy) ^ (1 / (2 : ℝ)) := by + simpa [Real.rpow_two, hA, hB] using hholder + have hU : + ((cubeLpNorm Q (2 : ℝ≥0∞) u) ^ 2) ^ ((2 : ℝ)⁻¹) = + cubeLpNorm Q (2 : ℝ≥0∞) u := by + simpa using + sq_rpow_half_eq_of_nonneg (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) + have hE : + (cubeAverage Q energy) ^ ((2 : ℝ)⁻¹) = + Real.sqrt (cubeAverage Q energy) := by + simp [Real.sqrt_eq_rpow] + simpa [hU, hE] using hmain + +/-- Descendant averages of the outer-localized energy density collapse to the +outer localized parent profile, not to the full-cube energy average. -/ +theorem descendantsAverage_cubeAverage_indicator_scaledClosedCubeSet_eq_localizedEnergyProfile + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (ρ : ℝ) (energy : Vec d → ℝ) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + descendantsAverage Q j + (fun R => cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy)) = + coarseCaccioppoliLocalizedEnergyProfile Q ρ energy := by + have hloc_int : + MeasureTheory.IntegrableOn ((scaledClosedCubeSet Q ρ).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ henergy_int + unfold coarseCaccioppoliLocalizedEnergyProfile + exact + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j ((scaledClosedCubeSet Q ρ).indicator energy) hloc_int).symm + +/-- Finite Cauchy for the constant branch after replacing the energy density by +its outer-localized version. This is the summation shape needed by the +localized raw Caccioppoli repair. -/ +theorem descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_indicator_scaledClosedCubeSet_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (ρ : ℝ) + (u energy : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + descendantsAverage Q j + (fun R => + cubeLpNorm R (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy))) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * + Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ energy) := by + have hloc_nonneg : + ∀ x ∈ cubeSet Q, 0 ≤ (scaledClosedCubeSet Q ρ).indicator energy x := by + intro x hxQ + by_cases hxρ : x ∈ scaledClosedCubeSet Q ρ + · simpa [Set.indicator_of_mem hxρ] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxρ] + have hloc_int : + MeasureTheory.IntegrableOn ((scaledClosedCubeSet Q ρ).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ henergy_int + have hmain := + descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_le + Q j u ((scaledClosedCubeSet Q ρ).indicator energy) hu hloc_nonneg hloc_int + simpa [coarseCaccioppoliLocalizedEnergyProfile] using hmain + +/-- Descendant averages of the arbitrary-center local-patch energy density +collapse to the corresponding local parent profile. -/ +theorem descendantsAverage_cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_eq_localEnergyProfile + {d : ℕ} (Q : TriadicCube d) (center : Vec d) (j : ℕ) (rho : ℝ) + (energy : Vec d → ℝ) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + descendantsAverage Q j + (fun R => + cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy)) = + coarseCaccioppoliLocalEnergyProfile Q center rho energy := by + have hloc_int : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q center rho henergy_int + unfold coarseCaccioppoliLocalEnergyProfile + exact + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + hloc_int).symm + +/-- Finite Cauchy for the constant branch after replacing the energy density by +the arbitrary-center local-patch localization. -/ +theorem + descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_le + {d : ℕ} (Q : TriadicCube d) (center : Vec d) (j : ℕ) (rho : ℝ) + (u energy : Vec d → ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + descendantsAverage Q j + (fun R => + cubeLpNorm R (2 : ℝ≥0∞) u * + Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy))) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * + Real.sqrt (coarseCaccioppoliLocalEnergyProfile Q center rho energy) := by + have hloc_nonneg : + ∀ x ∈ cubeSet Q, + 0 ≤ (coarseCaccioppoliLocalClosedCube Q center rho).indicator energy x := by + intro x hxQ + by_cases hxrho : x ∈ coarseCaccioppoliLocalClosedCube Q center rho + · simpa [Set.indicator_of_mem hxrho] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxrho] + have hloc_int : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q center rho henergy_int + have hmain := + descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_le + Q j u + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + hu hloc_nonneg hloc_int + simpa [coarseCaccioppoliLocalEnergyProfile] using hmain + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/ExactRhs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/ExactRhs.lean new file mode 100644 index 0000000000..eba04b1640 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/ExactRhs.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation.Averages + +/-! # Exact Rhs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Descendant summation for the small-cube Caccioppoli route + +The LaTeX proof estimates the cutoff pairing on small cubes and then sums over +those cubes. This file isolates the measure-theoretic bookkeeping: a +cube-average over `Q` is the descendants-average of the cube-averages over the +depth-`j` descendants, hence its absolute value is controlled by the +descendants-average of the local absolute values. +-/ + +/-- Collapse a descendant average of exact flux-energy RHS values to the +parent raw-recursion RHS. + +This is the core small-cube summation step. The constant branch is summed by +finite Cauchy, so it only needs the parent `L²` norm of `u`; the centered branch +collapses by additivity of the energy average. -/ +theorem descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B C K Alpha Bcross : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ Acirc1 AcircS B C ≤ Alpha) : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy Acirc1 AcircS B C) ≤ + Alpha * cubeAverage Q energy + Bcross * Real.sqrt (cubeAverage Q energy) := by + have hE_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ cubeAverage R energy := by + intro R hR + exact cubeAverage_nonneg_of_nonneg_on (Q := R) + (fun x hx => henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx)) + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy Acirc1 AcircS B C ≤ + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy := by + intro R hR + have hconstR : + coarseCaccioppoliFluxEnergyExactConstantRhs R a u ξ energy B ≤ + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul] + unfold coarseCaccioppoliConstantCutoffSize + have hscaled : + cubeLpNorm R (2 : ℝ≥0∞) u * + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ)) * + Real.sqrt (cubeAverage R energy) ≤ + cubeLpNorm R (2 : ℝ≥0∞) u * K * + Real.sqrt (cubeAverage R energy) := by + have hleft := + mul_le_mul_of_nonneg_left (hconst R hR) + (cubeLpNorm_nonneg R (2 : ℝ≥0∞) u) + exact mul_le_mul_of_nonneg_right hleft (Real.sqrt_nonneg _) + calc + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (cubeLpNorm R (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ))) * + Real.sqrt (cubeAverage R energy) + = + cubeLpNorm R (2 : ℝ≥0∞) u * + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ)) * + Real.sqrt (cubeAverage R energy) := by + ring + _ ≤ + cubeLpNorm R (2 : ℝ≥0∞) u * K * + Real.sqrt (cubeAverage R energy) := hscaled + _ = + K * (cubeLpNorm R (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage R energy)) := by + ring + have hcentR : + coarseCaccioppoliFluxEnergyExactCenteredRhs R a s ξ energy Acirc1 AcircS B C ≤ + Alpha * cubeAverage R energy := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq] + have hsqrt_sq : + Real.sqrt (cubeAverage R energy) * Real.sqrt (cubeAverage R energy) = + cubeAverage R energy := by + simpa [pow_two] using Real.sq_sqrt (hE_nonneg R hR) + rw [hsqrt_sq] + exact mul_le_mul_of_nonneg_right (hcent R hR) (hE_nonneg R hR) + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered] + exact add_le_add hconstR hcentR + have havg_point : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy Acirc1 AcircS B C) ≤ + descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) := + descendantsAverage_le_descendantsAverage Q j hpoint + have hsplit : + descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) = + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * descendantsAverage Q j (fun R => cubeAverage R energy) := by + rw [descendantsAverage_add_local] + rw [descendantsAverage_mul_left, descendantsAverage_mul_left] + have hA : + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage Q energy) := + descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_le + Q j u energy hu henergy_nonneg henergy_int + have hconst_avg : + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) ≤ + Bcross * Real.sqrt (cubeAverage Q energy) := by + calc + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + ≤ K * (cubeLpNorm Q (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hA hK_nonneg + _ = (K * cubeLpNorm Q (2 : ℝ≥0∞) u) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_right hKparent (Real.sqrt_nonneg _) + have havgE_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = cubeAverage Q energy := by + simpa using + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := energy) henergy_int).symm + calc + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy Acirc1 AcircS B C) + ≤ descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) := havg_point + _ = + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * descendantsAverage Q j (fun R => cubeAverage R energy) := hsplit + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) + + Alpha * cubeAverage Q energy := by + exact add_le_add hconst_avg (by simp [havgE_eq]) + _ = Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + ring + +/-- Variable-`Acirc` version of +`descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients`. + +The exact RHS on each descendant uses the local values `Acirc1 R` and +`AcircS R`; the endpoint raw RHS is unchanged. -/ +theorem descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients_variableAcirc + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) (B C K Alpha Bcross : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B C ≤ + Alpha) : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy (Acirc1 R) (AcircS R) B C) ≤ + Alpha * cubeAverage Q energy + Bcross * Real.sqrt (cubeAverage Q energy) := by + have hE_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ cubeAverage R energy := by + intro R hR + exact cubeAverage_nonneg_of_nonneg_on (Q := R) + (fun x hx => henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx)) + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy (Acirc1 R) (AcircS R) B C ≤ + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy := by + intro R hR + have hconstR : + coarseCaccioppoliFluxEnergyExactConstantRhs R a u ξ energy B ≤ + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul] + unfold coarseCaccioppoliConstantCutoffSize + have hscaled : + cubeLpNorm R (2 : ℝ≥0∞) u * + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ)) * + Real.sqrt (cubeAverage R energy) ≤ + cubeLpNorm R (2 : ℝ≥0∞) u * K * + Real.sqrt (cubeAverage R energy) := by + have hleft := + mul_le_mul_of_nonneg_left (hconst R hR) + (cubeLpNorm_nonneg R (2 : ℝ≥0∞) u) + exact mul_le_mul_of_nonneg_right hleft (Real.sqrt_nonneg _) + calc + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (cubeLpNorm R (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ))) * + Real.sqrt (cubeAverage R energy) + = + cubeLpNorm R (2 : ℝ≥0∞) u * + (coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ)) * + Real.sqrt (cubeAverage R energy) := by + ring + _ ≤ + cubeLpNorm R (2 : ℝ≥0∞) u * K * + Real.sqrt (cubeAverage R energy) := hscaled + _ = + K * (cubeLpNorm R (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage R energy)) := by + ring + have hcentR : + coarseCaccioppoliFluxEnergyExactCenteredRhs R a s ξ energy (Acirc1 R) (AcircS R) B C ≤ + Alpha * cubeAverage R energy := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq] + have hsqrt_sq : + Real.sqrt (cubeAverage R energy) * Real.sqrt (cubeAverage R energy) = + cubeAverage R energy := by + simpa [pow_two] using Real.sq_sqrt (hE_nonneg R hR) + rw [hsqrt_sq] + exact mul_le_mul_of_nonneg_right (hcent R hR) (hE_nonneg R hR) + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered] + exact add_le_add hconstR hcentR + have havg_point : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy (Acirc1 R) (AcircS R) B C) ≤ + descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) := + descendantsAverage_le_descendantsAverage Q j hpoint + have hsplit : + descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) = + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * descendantsAverage Q j (fun R => cubeAverage R energy) := by + rw [descendantsAverage_add_local] + rw [descendantsAverage_mul_left, descendantsAverage_mul_left] + have hA : + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage Q energy) := + descendantsAverage_cubeLpNorm_two_mul_sqrt_cubeAverage_le + Q j u energy hu henergy_nonneg henergy_int + have hconst_avg : + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) ≤ + Bcross * Real.sqrt (cubeAverage Q energy) := by + calc + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + ≤ K * (cubeLpNorm Q (2 : ℝ≥0∞) u * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hA hK_nonneg + _ = (K * cubeLpNorm Q (2 : ℝ≥0∞) u) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_right hKparent (Real.sqrt_nonneg _) + have havgE_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = cubeAverage Q energy := by + simpa using + (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := energy) henergy_int).symm + calc + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ energy (Acirc1 R) (AcircS R) B C) + ≤ descendantsAverage Q j + (fun R => + K * (cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * cubeAverage R energy) := havg_point + _ = + K * descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) u * Real.sqrt (cubeAverage R energy)) + + Alpha * descendantsAverage Q j (fun R => cubeAverage R energy) := hsplit + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) + + Alpha * cubeAverage Q energy := by + exact add_le_add hconst_avg (by simp [havgE_eq]) + _ = Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + ring + +/-- Localized-energy version of the variable-`Acirc` exact-RHS descendant +collapse. The local RHS values use the energy density cut down to the outer +scaled cube, so the endpoint is the outer localized profile rather than the +full parent cube average. -/ +theorem + descendantsAverage_fluxEnergyExactRhs_le_localized_raw_of_pointwise_coefficients_variableAcirc + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (ρ : ℝ) + (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) (B C K Alpha Bcross : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B C ≤ + Alpha) : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((scaledClosedCubeSet Q ρ).indicator energy) + (Acirc1 R) (AcircS R) B C) ≤ + Alpha * coarseCaccioppoliLocalizedEnergyProfile Q ρ energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ energy) := by + have hloc_nonneg : + ∀ x ∈ cubeSet Q, 0 ≤ (scaledClosedCubeSet Q ρ).indicator energy x := by + intro x hxQ + by_cases hxρ : x ∈ scaledClosedCubeSet Q ρ + · simpa [Set.indicator_of_mem hxρ] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxρ] + have hloc_int : + MeasureTheory.IntegrableOn ((scaledClosedCubeSet Q ρ).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ henergy_int + have hraw := + descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients_variableAcirc + Q j a s u ξ ((scaledClosedCubeSet Q ρ).indicator energy) Acirc1 AcircS + B C K Alpha Bcross hu hloc_nonneg hloc_int hK_nonneg hKparent hconst hcent + simpa [coarseCaccioppoliLocalizedEnergyProfile] using hraw + +/-- Arbitrary-center local-patch version of the variable-`Acirc` exact-RHS +descendant collapse. -/ +theorem + descendantsAverage_fluxEnergyExactRhs_le_localPatch_raw_of_pointwise_coefficients_variableAcirc + {d : ℕ} (Q : TriadicCube d) (center : Vec d) (j : ℕ) (rho : ℝ) + (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) (B C K Alpha Bcross : ℝ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B C ≤ + Alpha) : + descendantsAverage Q j + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u ξ + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (Acirc1 R) (AcircS R) B C) ≤ + Alpha * coarseCaccioppoliLocalEnergyProfile Q center rho energy + + Bcross * Real.sqrt + (coarseCaccioppoliLocalEnergyProfile Q center rho energy) := by + have hloc_nonneg : + ∀ x ∈ cubeSet Q, + 0 ≤ (coarseCaccioppoliLocalClosedCube Q center rho).indicator energy x := by + intro x hxQ + by_cases hxrho : x ∈ coarseCaccioppoliLocalClosedCube Q center rho + · simpa [Set.indicator_of_mem hxrho] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxrho] + have hloc_int : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (cubeSet Q) MeasureTheory.volume := + integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q center rho henergy_int + have hraw := + descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients_variableAcirc + Q j a s u ξ + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS B C K Alpha Bcross hu hloc_nonneg hloc_int + hK_nonneg hKparent hconst hcent + simpa [coarseCaccioppoliLocalEnergyProfile] using hraw + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Gradient.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Gradient.lean new file mode 100644 index 0000000000..732c3d048e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummation/Gradient.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.VectorProduct +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.Descendants + +/-! # Gradient -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Descendant summation for the small-cube Caccioppoli route + +The LaTeX proof estimates the cutoff pairing on small cubes and then sums over +those cubes. This file isolates the measure-theoretic bookkeeping: a +cube-average over `Q` is the descendants-average of the cube-averages over the +depth-`j` descendants, hence its absolute value is controlled by the +descendants-average of the local absolute values. +-/ + +/-- Descendant-local gradient `circ` bound with the parent canonical +coefficient. + +This is the scale-cancellation step in the small-cube proof: the negative +scale weight of the descendant cancels the `3^{r j}` growth in the localized +ellipticity bound. -/ +theorem cubeBesovCircPartialNorm_component_le_parent_canonicalGradientAcirc_of_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (r : ℝ) + (hr : 0 < r) {g : Vec d → Vec d} {energy : Vec d → ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight r 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (i : Fin d) (N : ℕ) : + cubeBesovCircPartialNorm R r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ + (cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage R energy) := by + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgrad_R : CubeAverageGradientEnergyControl R a g energy := + hgrad.restrict_to_descendant hR + have hsum_R : + Summable (fun n : ℕ => + geometricWeight r 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a r hr.le hR hsum + have hpartial : + cubeBesovNegativeVectorPartialSeminorm R r N g ≤ + (geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage R energy) := + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + R a r hr g energy N henergy_nonneg_R henergy_int_R hgrad_R hsum_R + have hlambda : + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (r * (j : ℝ)) * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ) := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a r hr.le hR hsum + have hdisc_nonneg : 0 ≤ (geometricDiscount r 1)⁻¹ := by + exact inv_nonneg.mpr (geometricDiscount_pos (by simpa using hr)).le + have hscale_R_nonneg : 0 ≤ cubeBesovScaleWeight (-r) R := + cubeBesovScaleWeight_nonneg (-r) R + have hsqrt_nonneg : 0 ≤ Real.sqrt (cubeAverage R energy) := Real.sqrt_nonneg _ + have hscale_cancel : + cubeBesovScaleWeight (-r) R * Real.rpow (3 : ℝ) (r * (j : ℝ)) = + cubeBesovScaleWeight (-r) Q := by + exact cubeBesovScaleWeight_neg_mul_rpow_eq_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) r hR + calc + cubeBesovCircPartialNorm R r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) + ≤ cubeBesovScaleWeight (-r) R * + cubeBesovNegativeVectorPartialSeminorm R r N g := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + R r g i N + _ ≤ cubeBesovScaleWeight (-r) R * + (((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage R energy)) := by + exact mul_le_mul_of_nonneg_left hpartial hscale_R_nonneg + _ ≤ cubeBesovScaleWeight (-r) R * + (((geometricDiscount r 1)⁻¹ * + (Real.rpow (3 : ℝ) (r * (j : ℝ)) * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage R energy)) := by + refine mul_le_mul_of_nonneg_left ?_ hscale_R_nonneg + refine mul_le_mul_of_nonneg_right ?_ hsqrt_nonneg + exact mul_le_mul_of_nonneg_left hlambda hdisc_nonneg + _ = + (cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage R energy) := by + rw [← hscale_cancel] + ring + +/-- Descendant-local gradient `circ` bound with the local canonical +coefficient. + +This is the small-cube version of the gradient-control line in the LaTeX +proof: before localization to the parent cube, each descendant keeps its own +`A^\circ_r(R)` factor. -/ +theorem cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (r : ℝ) + (hr : 0 < r) {g : Vec d → Vec d} {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight r 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (i : Fin d) (N : ℕ) : + cubeBesovCircPartialNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) ≤ + (cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q r N g ≤ + (geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + Q a r hr g energy N henergy_nonneg henergy_int hgrad hsum + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-r) Q := + cubeBesovScaleWeight_nonneg (-r) Q + calc + cubeBesovCircPartialNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => g x i) + ≤ cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q r N g := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q r g i N + _ ≤ cubeBesovScaleWeight (-r) Q * + (((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hpartial hscale_nonneg + _ = + (cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + ring + +/-- A local canonical gradient `A^\circ_r(R)` on a depth-`j` descendant is +bounded by the parent canonical factor after the usual descendant scale +cancellation. -/ +theorem local_canonicalGradientAcirc_core_le_parent_of_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (r : ℝ) + (hr : 0 < r) + (hR : R ∈ descendantsAtDepth Q j) + (hsum : + Summable (fun n : ℕ => + geometricWeight r 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovScaleWeight (-r) R * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ)) ≤ + cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ)) := by + have hlambda : + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (r * (j : ℝ)) * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ) := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a r hr.le hR hsum + have hdisc_nonneg : 0 ≤ (geometricDiscount r 1)⁻¹ := by + exact inv_nonneg.mpr (geometricDiscount_pos (by simpa using hr)).le + have hscale_R_nonneg : 0 ≤ cubeBesovScaleWeight (-r) R := + cubeBesovScaleWeight_nonneg (-r) R + have hscale_cancel : + cubeBesovScaleWeight (-r) R * Real.rpow (3 : ℝ) (r * (j : ℝ)) = + cubeBesovScaleWeight (-r) Q := by + exact cubeBesovScaleWeight_neg_mul_rpow_eq_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) r hR + calc + cubeBesovScaleWeight (-r) R * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq R r (.finite 1) a) (-1 / 2 : ℝ)) + ≤ + cubeBesovScaleWeight (-r) R * + ((geometricDiscount r 1)⁻¹ * + (Real.rpow (3 : ℝ) (r * (j : ℝ)) * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hlambda hdisc_nonneg) hscale_R_nonneg + _ = + cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ)) := by + rw [← hscale_cancel] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummationFullDual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummationFullDual.lean new file mode 100644 index 0000000000..eb6bb3bf92 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/DescendantSummationFullDual.lean @@ -0,0 +1,326 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimateFullDual + +/-! # Descendant Summation Full Dual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Full-dual descendant summation + +This sidecar is the corrected descendant summation corridor for the vector +small-cube Caccioppoli route. It is parallel to the legacy projected theorem +in `DescendantSummation.lean`, but the local estimate is supplied by the +full-dual/local-multiscale exact-RHS theorem. +-/ + +/-- Variable-`Acirc` descendant raw estimate using full-dual vector Poincare +and the finite local-multiscale estimate on every descendant. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc_vectorFullDualLocalMultiscale + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hlocal : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate R + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * cubeAverage Q energy + Bcross * Real.sqrt (cubeAverage Q energy) := by + refine le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_descendantsAverage_of_local_bounds + Q j flux (scalarCutoffGradientField η) u + (fun R => + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + hpair_int ?_) ?_ + · intro R hR + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant_vectorFullDualLocalMultiscale + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := energy) (η := η) (Acirc1 := Acirc1 R) (AcircS := AcircS R) + (C := C) hs0 hs1 (hfluxMem R hR) (hu R hR) (hG R hR) + (hfluxEnergy R hR) hB (hAcirc1 R hR) (hAcircS R hR) + (hBgConst R hR) (hBgCent R hR) hC + (hfull R hR) (hlocal R hR) (hGcirc1 R hR) (hGcircS R hR) + · exact + descendantsAverage_fluxEnergyExactRhs_le_raw_of_pointwise_coefficients_variableAcirc + Q j a s u (scalarCutoffGradientField η) energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) K Alpha Bcross + huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + +/-- Buffered localized-energy descendant summation using full-dual Poincare and +the infinite-depth full-circ route on every descendant. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + {d : ℕ} {Q : TriadicCube d} (j : ℕ) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ - ρ₂) * cubeRadius Q) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s (scalarCutoffGradientField η) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + Alpha * coarseCaccioppoliLocalizedEnergyProfile Q ρ energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalizedEnergyProfile Q ρ energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_local_exactRhs_bounds_variableAcirc + (Q := Q) (j := j) (ρ := ρ) (a := a) (s := s) + (flux := flux) (u := u) (ξ := scalarCutoffGradientField η) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + (K := K) (Alpha := Alpha) (Bcross := Bcross) + hpair_int huQ henergy_nonneg henergy_int hK_nonneg hKparent + hconst hcent + (fun R hR => + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) + (ρ := ρ) (flux := flux) (u := u) (G := G) (energy := energy) + (η := η) (Acirc1 := Acirc1 R) (AcircS := AcircS R) (C := C) + (hbuffer R hR) hs0 hs1 (hfluxMem R hR) (hu R hR) (hG R hR) + (hfluxEnergy R hR) hB (hAcirc1 R hR) (hAcircS R hR) + (hBgConst R hR) (hBgCent R hR) hC (hfull R hR) + (hGcirc1 R hR) (hGcircS R hR)) + +/-- Buffered arbitrary-center local-patch descendant summation for the +translated canonical cutoff using the full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_localCanonicalCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + {d : ℕ} {Q : TriadicCube d} (center : Vec d) (j : ℕ) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + (Acirc1 AcircS : TriadicCube d → ℝ) {C K Alpha Bcross : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hs0 : 0 < s) (hs1 : s < 1) + (hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (rho - rhoOuter) * (cubeRadius Q / 3)) + (hpair_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x)) + (cubeSet Q) MeasureTheory.volume) + (huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R) + (hAcircS : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R) + (hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy)) + (hK_nonneg : 0 ≤ K) + (hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross) + (hconst : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2) + + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter))) ≤ K) + (hcent : ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (Acirc1 R) (AcircS R) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) ≤ Alpha) : + |cubeAverage Q + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + Alpha * coarseCaccioppoliLocalEnergyProfile Q center rho energy + + Bcross * Real.sqrt (coarseCaccioppoliLocalEnergyProfile Q center rho energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_local_exactRhs_bounds_variableAcirc + (Q := Q) (center := center) (j := j) (rho := rho) + (a := a) (s := s) (flux := flux) (u := u) + (ξ := scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + (K := K) (Alpha := Alpha) (Bcross := Bcross) + hpair_int huQ henergy_nonneg henergy_int hK_nonneg hKparent hconst hcent + (fun R hR => + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_descendant_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (R := R) (j := j) hR + (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1 R) (AcircS := AcircS R) (C := C) + hinner hinnerOuter (hbuffer R hR) hs0 hs1 + (hfluxMem R hR) (hu R hR) (hG R hR) (hfluxEnergy R hR) hB + (hAcirc1 R hR) (hAcircS R hR) + (hBgConst R hR) (hBgCent R hR) hC (hfull R hR) + (hGcirc1 R hR) (hGcircS R hR)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/ExactRhs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/ExactRhs.lean new file mode 100644 index 0000000000..82a08735c1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/ExactRhs.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes + +/-! # Exact Rhs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-- The exact local RHS produced after substituting flux-side energy controls +and the scalar/cutoff control bundle into the split Caccioppoli pairing. + +The next coefficient-bookkeeping theorem should prove this quantity is bounded +by the note's single-cube RHS. -/ +def coarseCaccioppoliFluxEnergyExactRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) (Acirc1 AcircS B C : ℝ) : ℝ := + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgConst : ℝ := coarseCaccioppoliConstantCutoffSize Q u ξ B + let BgCent : ℝ := coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) + +/-- The exact local RHS only sees the energy density through its cube +average. -/ +theorem coarseCaccioppoliFluxEnergyExactRhs_congr_cubeAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) + {energy₁ energy₂ : Vec d → ℝ} (Acirc1 AcircS B C : ℝ) + (havg : cubeAverage Q energy₁ = cubeAverage Q energy₂) : + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy₁ Acirc1 AcircS B C = + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy₂ Acirc1 AcircS B C := by + simp [coarseCaccioppoliFluxEnergyExactRhs, havg] + +/-- Constant-piece summand of `coarseCaccioppoliFluxEnergyExactRhs`. -/ +def coarseCaccioppoliFluxEnergyExactConstantRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) (B : ℝ) : ℝ := + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let BgConst : ℝ := coarseCaccioppoliConstantCutoffSize Q u ξ B + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + +/-- The exact constant-piece RHS only sees the energy density through its cube +average. -/ +theorem coarseCaccioppoliFluxEnergyExactConstantRhs_congr_cubeAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → ℝ) + (ξ : Vec d → Vec d) {energy₁ energy₂ : Vec d → ℝ} (B : ℝ) + (havg : cubeAverage Q energy₁ = cubeAverage Q energy₂) : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy₁ B = + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy₂ B := by + simp [coarseCaccioppoliFluxEnergyExactConstantRhs, havg] + +/-- Coefficient in the exact constant-piece RHS, after factoring out the +energy norm and cutoff size. -/ +def coarseCaccioppoliFluxEnergyExactConstantCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) : ℝ := + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Aflux1)) + +theorem coarseCaccioppoliFluxEnergyExactConstantCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantCoeff Q a := by + unfold coarseCaccioppoliFluxEnergyExactConstantCoeff + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdisc_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * (1 : ℝ)) + have hLambda_nonneg : 0 ≤ LambdaSq Q (1 : ℝ) (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q (1 : ℝ) a (by norm_num) + have hAflux_nonneg : + 0 ≤ (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) := + mul_nonneg (inv_nonneg.mpr hdisc_pos.le) (Real.rpow_nonneg hLambda_nonneg _) + refine mul_nonneg hd_nonneg ?_ + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg (cubeBesovScaleWeight_nonneg (-1) Q) hAflux_nonneg) + +/-- Separated factor-bound expression for the exact constant flux coefficient. +`Aavg` bounds the block-average coefficient and `Aflux1` bounds the finite +`q = 1` flux Besov coefficient. -/ +def coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound {d : ℕ} + (Q : TriadicCube d) (_Aavg Aflux1 : ℝ) : ℝ := + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + 1) * (cubeBesovScaleWeight (-1) Q * Aflux1)) + +theorem coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_nonneg {d : ℕ} + (Q : TriadicCube d) {Aavg Aflux1 : ℝ} + (_hAavg : 0 ≤ Aavg) (hAflux1 : 0 ≤ Aflux1) : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q Aavg Aflux1 := by + unfold coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + refine mul_nonneg hd_nonneg ?_ + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg (cubeBesovScaleWeight_nonneg (-1) Q) hAflux1) + +theorem coarseCaccioppoliFluxEnergyExactConstantCoeff_le_factorBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {Aavg Aflux1 : ℝ} + (_hAavg : + Real.sqrt (coarseBBlockNorm Q a) ≤ Aavg) + (hAflux1 : + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) ≤ Aflux1) : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q Aavg Aflux1 := by + unfold coarseCaccioppoliFluxEnergyExactConstantCoeff + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound + have hfluxTerm : + (3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ))) ≤ + (3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * Aflux1) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hAflux1 (cubeBesovScaleWeight_nonneg (-1) Q)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + exact mul_le_mul_of_nonneg_left hfluxTerm + (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + +theorem coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) (B : ℝ) : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B = + (coarseCaccioppoliFluxEnergyExactConstantCoeff Q a * + coarseCaccioppoliConstantCutoffSize Q u ξ B) * + Real.sqrt (cubeAverage Q energy) := by + unfold coarseCaccioppoliFluxEnergyExactConstantRhs + coarseCaccioppoliFluxEnergyExactConstantCoeff + ring + +theorem coarseCaccioppoliFluxEnergyExactConstantRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) {B : ℝ} (hB : 0 ≤ B) : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul] + exact mul_nonneg + (mul_nonneg + (coarseCaccioppoliFluxEnergyExactConstantCoeff_nonneg Q a) + (coarseCaccioppoliConstantCutoffSize_nonneg Q u ξ hB)) + (Real.sqrt_nonneg _) + +/-- Centered-piece summand of `coarseCaccioppoliFluxEnergyExactRhs`. -/ +def coarseCaccioppoliFluxEnergyExactCenteredRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) (Acirc1 AcircS B C : ℝ) : ℝ := + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgCent : ℝ := coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C + (d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent))) + +/-- The exact centered-piece RHS only sees the energy density through its cube +average. -/ +theorem coarseCaccioppoliFluxEnergyExactCenteredRhs_congr_cubeAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (ξ : Vec d → Vec d) {energy₁ energy₂ : Vec d → ℝ} + (Acirc1 AcircS B C : ℝ) + (havg : cubeAverage Q energy₁ = cubeAverage Q energy₂) : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy₁ Acirc1 AcircS B C = + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy₂ Acirc1 AcircS B C := by + simp [coarseCaccioppoliFluxEnergyExactCenteredRhs, havg] + +/-- Centered cutoff coefficient after factoring out the energy norm. -/ +def coarseCaccioppoliCenteredCutoffCoeff {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B C : ℝ) : ℝ := + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1)) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS))) + +/-- Coefficient in the exact centered-piece RHS after factoring out +`(sqrt energy)^2`. -/ +def coarseCaccioppoliFluxEnergyExactCenteredCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS B C : ℝ) : + ℝ := + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgCentCoeff : ℝ := + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C + (d : ℝ) * + (Aavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS)) * + (cubeBesovScaleWeight s Q * BgCentCoeff))) + +/-- Average-flux part of the exact centered coefficient. -/ +def coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (ξ : Vec d → Vec d) (Acirc1 C : ℝ) : ℝ := + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + (d : ℝ) * + (Aavg * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1))) + +/-- Besov/cutoff-product part of the exact centered coefficient. -/ +def coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS B C : ℝ) : + ℝ := + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgCentCoeff : ℝ := + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS)) * + (cubeBesovScaleWeight s Q * BgCentCoeff))) + +theorem coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B C : ℝ) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C = + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C := by + rfl + +theorem coarseCaccioppoliCenteredCutoffCoeff_nonneg {d : ℕ} (Q : TriadicCube d) + {s : ℝ} (ξ : Vec d → Vec d) {Acirc1 AcircS B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := by + unfold coarseCaccioppoliCenteredCutoffCoeff + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hterm1 : + 0 ≤ cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1)) := by + refine mul_nonneg (mul_nonneg (cubeScaleFactor_nonneg Q) hB) ?_ + refine mul_nonneg (Real.sqrt_nonneg _) ?_ + exact mul_nonneg hnote1 hAcirc1 + have hnoteS : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg hnote1 (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2 : + 0 ≤ cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS)) := by + refine mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) ?_ + refine mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) ?_ + exact mul_nonneg hnoteS hAcircS + exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (add_nonneg hterm1 hterm2) + +/-- Separated factor-bound expression for the centered cutoff coefficient. +`Xi` bounds `‖ξ‖_{L∞}`, `D` bounds `‖∇ξ‖_{L∞}`, and `A1`, `AS` bound the +two projected Poincare/Besov scalar constants. -/ +def coarseCaccioppoliCenteredCutoffCoeffFactorBound {d : ℕ} (Q : TriadicCube d) + (s Xi D A1 AS C : ℝ) : ℝ := + 2 * (cubeScaleFactor Q * D * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1)) + + Xi * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS))) + +private theorem cubeBesovScaleWeight_mul_neg_factor {d : ℕ} (Q : TriadicCube d) + (s Xi Z : ℝ) : + cubeBesovScaleWeight s Q * (Xi * (cubeBesovScaleWeight (-s) Q * Z)) = + Xi * Z := by + have hcancel : cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + rw [mul_comm] + exact cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + calc + cubeBesovScaleWeight s Q * (Xi * (cubeBesovScaleWeight (-s) Q * Z)) + = Xi * ((cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q) * Z) := by + ring + _ = Xi * Z := by + rw [hcancel] + ring + +/-- Multiplying the centered cutoff factor by the descendant Besov weight +cancels the `cubeBesovScaleWeight (-s)` in the `A_s^\circ` term. -/ +theorem cubeBesovScaleWeight_mul_centeredCutoffCoeffFactorBound_eq {d : ℕ} + (Q : TriadicCube d) (s Xi D A1 AS C : ℝ) : + cubeBesovScaleWeight s Q * + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C = + 2 * (cubeBesovScaleWeight s Q * (cubeScaleFactor Q * D * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1))) + + Xi * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS)) := by + let A : ℝ := cubeScaleFactor Q * D * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1)) + let Z : ℝ := + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS + change + cubeBesovScaleWeight s Q * (2 * (A + Xi * (cubeBesovScaleWeight (-s) Q * Z))) = + 2 * (cubeBesovScaleWeight s Q * A + Xi * Z) + calc + cubeBesovScaleWeight s Q * (2 * (A + Xi * (cubeBesovScaleWeight (-s) Q * Z))) + = 2 * (cubeBesovScaleWeight s Q * A + + cubeBesovScaleWeight s Q * (Xi * (cubeBesovScaleWeight (-s) Q * Z))) := by + ring + _ = 2 * (cubeBesovScaleWeight s Q * A + Xi * Z) := by + rw [cubeBesovScaleWeight_mul_neg_factor] + +theorem coarseCaccioppoliCenteredCutoffCoeffFactorBound_nonneg {d : ℕ} + (Q : TriadicCube d) {s Xi D A1 AS C : ℝ} + (hs : 0 < s) (hXi : 0 ≤ Xi) (hD : 0 ≤ D) + (hA1 : 0 ≤ A1) (hAS : 0 ≤ AS) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C := by + unfold coarseCaccioppoliCenteredCutoffCoeffFactorBound + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hterm1 : + 0 ≤ cubeScaleFactor Q * D * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1)) := by + refine mul_nonneg (mul_nonneg (cubeScaleFactor_nonneg Q) hD) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) (mul_nonneg hnote1 hA1) + have hnoteS : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) := by + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact mul_nonneg hnote1 (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hterm2 : + 0 ≤ Xi * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS)) := by + refine mul_nonneg hXi ?_ + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) (mul_nonneg hnoteS hAS) + exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (add_nonneg hterm1 hterm2) + +theorem coarseCaccioppoliCenteredCutoffCoeff_le_factorBound {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (ξ : Vec d → Vec d) + {Acirc1 AcircS B C Xi D A1 AS : ℝ} + (hs : 0 < s) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hAcircS_nonneg : 0 ≤ AcircS) + (hXi_nonneg : 0 ≤ Xi) (hD_nonneg : 0 ≤ D) (hC : 0 ≤ C) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) (hB : B ≤ D) + (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C := by + unfold coarseCaccioppoliCenteredCutoffCoeff + coarseCaccioppoliCenteredCutoffCoeffFactorBound + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hnote1Acirc : + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1 ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1 := by + exact mul_le_mul_of_nonneg_left hAcirc1 hnote1 + have hrest1 : + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1) := by + exact mul_le_mul_of_nonneg_left hnote1Acirc (Real.sqrt_nonneg _) + have hrest1_nonneg : + 0 ≤ Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1) := by + exact mul_nonneg (Real.sqrt_nonneg _) (mul_nonneg hnote1 hAcirc1_nonneg) + have hleft1 : + cubeScaleFactor Q * B ≤ cubeScaleFactor Q * D := by + exact mul_le_mul_of_nonneg_left hB (cubeScaleFactor_nonneg Q) + have hleft1_bound_nonneg : 0 ≤ cubeScaleFactor Q * D := by + exact mul_nonneg (cubeScaleFactor_nonneg Q) hD_nonneg + have hterm1 : + cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1)) ≤ + cubeScaleFactor Q * D * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1)) := by + exact mul_le_mul hleft1 hrest1 hrest1_nonneg hleft1_bound_nonneg + have hr_lt_one : (3 : ℝ) ^ (-s) < 1 := by + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + have hnoteS : + 0 ≤ (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) := by + exact mul_nonneg hnote1 (inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le)) + have hnoteSAcirc : + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS ≤ + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS := by + exact mul_le_mul_of_nonneg_left hAcircS hnoteS + have hrest2 : + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS) ≤ + cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS) := by + exact mul_le_mul_of_nonneg_left hnoteSAcirc (cubeBesovScaleWeight_nonneg (-s) Q) + have hrest2_nonneg : + 0 ≤ cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS) := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) + (mul_nonneg hnoteS hAcircS_nonneg) + have hterm2 : + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AcircS)) ≤ + Xi * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * AS)) := by + exact mul_le_mul hξ hrest2 hrest2_nonneg hXi_nonneg + exact mul_le_mul_of_nonneg_left (add_le_add hterm1 hterm2) + (by norm_num : 0 ≤ (2 : ℝ)) + +theorem coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (ξ : Vec d → Vec d) + {Acirc1 C : ℝ} (hAcirc1 : 0 ≤ Acirc1) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C := by + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + refine mul_nonneg hd_nonneg ?_ + refine mul_nonneg (Real.sqrt_nonneg _) ?_ + exact mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) (mul_nonneg hnote1 hAcirc1) + +/-- Separated factor-bound expression for the average-flux part of the +centered coefficient. -/ +def coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound {d : ℕ} + (Aavg Xi A1 C : ℝ) : ℝ := + (d : ℝ) * + (Aavg * (Xi * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1))) + +theorem coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_nonneg + {d : ℕ} {Aavg Xi A1 C : ℝ} + (hAavg : 0 ≤ Aavg) (hXi : 0 ≤ Xi) (hA1 : 0 ≤ A1) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C := by + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + exact mul_nonneg hd_nonneg + (mul_nonneg hAavg (mul_nonneg hXi (mul_nonneg hnote1 hA1))) + +theorem coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (ξ : Vec d → Vec d) + {Acirc1 C Aavg Xi A1 : ℝ} + (hAavg_nonneg : 0 ≤ Aavg) (hXi_nonneg : 0 ≤ Xi) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hC : 0 ≤ C) + (hAavg : Real.sqrt (coarseBBlockNorm Q a) ≤ Aavg) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) (hAcirc1 : Acirc1 ≤ A1) : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) Aavg Xi A1 C := by + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + have hnote1 : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) (Real.rpow_nonneg (by positivity) _) + have hnote1Acirc : + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1 ≤ + ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1 := by + exact mul_le_mul_of_nonneg_left hAcirc1 hnote1 + have hinner : + cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1) ≤ + Xi * (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1) := by + exact mul_le_mul hξ hnote1Acirc + (mul_nonneg hnote1 hAcirc1_nonneg) hXi_nonneg + have hinner_nonneg : + 0 ≤ cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1) := by + exact mul_nonneg (cubeLpNorm_nonneg Q ∞ ξ) (mul_nonneg hnote1 hAcirc1_nonneg) + have hmain : + Real.sqrt (coarseBBlockNorm Q a) * + (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * Acirc1)) ≤ + Aavg * + (Xi * (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * A1)) := by + exact mul_le_mul hAavg hinner hinner_nonneg hAavg_nonneg + exact mul_le_mul_of_nonneg_left hmain + (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + +theorem coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (ξ : Vec d → Vec d) {Acirc1 AcircS B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C := by + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + have hAflux_nonneg : + 0 ≤ (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + mul_nonneg (inv_nonneg.mpr hdisc_pos.le) (Real.rpow_nonneg hLambda_nonneg _) + have hcoeff_nonneg : + 0 ≤ (3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * + ((geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ))) := by + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) hAflux_nonneg) + refine mul_nonneg hd_nonneg ?_ + refine mul_nonneg hcoeff_nonneg ?_ + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (coarseCaccioppoliCenteredCutoffCoeff_nonneg Q ξ hs hAcirc1 hAcircS hB hC) + +/-- Separated factor-bound expression for the Besov/cutoff-product part of +the centered coefficient. -/ +def coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound {d : ℕ} + (Q : TriadicCube d) (s _Aavg AfluxS BgCent : ℝ) : ℝ := + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS)) * + (cubeBesovScaleWeight s Q * BgCent))) + +theorem coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_nonneg + {d : ℕ} (Q : TriadicCube d) {s Aavg AfluxS BgCent : ℝ} + (_hAavg : 0 ≤ Aavg) (hAfluxS : 0 ≤ AfluxS) (hBgCent : 0 ≤ BgCent) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + Q s Aavg AfluxS BgCent := by + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hcoeff_nonneg : + 0 ≤ (3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS) := by + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) hAfluxS) + exact mul_nonneg hd_nonneg + (mul_nonneg hcoeff_nonneg + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBgCent)) + +theorem coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (ξ : Vec d → Vec d) {Acirc1 AcircS B C Aavg AfluxS BgCent : ℝ} + (_hAavg_nonneg : 0 ≤ Aavg) (hAfluxS_nonneg : 0 ≤ AfluxS) + (hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C) + (_hAavg : Real.sqrt (coarseBBlockNorm Q a) ≤ Aavg) + (hAfluxS : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ AfluxS) + (hBgCent : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ BgCent) : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + Q s Aavg AfluxS BgCent := by + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + have hfluxTerm : + (3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * + ((geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ))) ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * AfluxS) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hAfluxS (cubeBesovScaleWeight_nonneg (-s) Q)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hcoeff : + (3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * + ((geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ))) ≤ + (3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * AfluxS) := hfluxTerm + have hcoeff_bound_nonneg : + 0 ≤ (3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS) := by + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) hAfluxS_nonneg) + have htail : + cubeBesovScaleWeight s Q * + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ + cubeBesovScaleWeight s Q * BgCent := by + exact mul_le_mul_of_nonneg_left hBgCent (cubeBesovScaleWeight_nonneg s Q) + have htail_nonneg : + 0 ≤ cubeBesovScaleWeight s Q * + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBgCentCoeff_nonneg + have hmain : + ((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * + ((geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)))) * + (cubeBesovScaleWeight s Q * + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C) ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * AfluxS)) * + (cubeBesovScaleWeight s Q * BgCent) := by + exact mul_le_mul hcoeff htail htail_nonneg hcoeff_bound_nonneg + exact mul_le_mul_of_nonneg_left hmain + (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + +theorem coarseCaccioppoliFluxEnergyExactCenteredCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (ξ : Vec d → Vec d) {Acirc1 AcircS B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C := by + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact add_nonneg + (coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_nonneg Q a ξ hAcirc1 hC) + (coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_nonneg + Q a ξ hs hAcirc1 hAcircS hB hC) + +/-- The exact centered coefficient is monotone in the two canonical gradient +slots. This is the local-to-parent `A^\circ` comparison used in the +small-cube Caccioppoli proof. -/ +theorem coarseCaccioppoliFluxEnergyExactCenteredCoeff_mono_Acirc {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} (ξ : Vec d → Vec d) + {Acirc1 AcircS A1 AS B C : ℝ} + (hs : 0 < s) (hC : 0 ≤ C) (hB : 0 ≤ B) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hAcircS_nonneg : 0 ≤ AcircS) + (hA1 : Acirc1 ≤ A1) (hAS : AcircS ≤ AS) : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ A1 AS B C := by + have hAavg_nonneg : 0 ≤ Real.sqrt (coarseBBlockNorm Q a) := Real.sqrt_nonneg _ + have hXi_nonneg : 0 ≤ cubeLpNorm Q ∞ ξ := cubeLpNorm_nonneg Q ∞ ξ + have hAflux_nonneg : + 0 ≤ (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact mul_nonneg + (inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le) + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _) + have hcutoff_le : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliCenteredCutoffCoeff Q s ξ A1 AS B C := by + simpa [coarseCaccioppoliCenteredCutoffCoeff, + coarseCaccioppoliCenteredCutoffCoeffFactorBound] using + (coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hB hC + (le_rfl : cubeLpNorm Q ∞ ξ ≤ cubeLpNorm Q ∞ ξ) + (le_rfl : B ≤ B) hA1 hAS) + have hcutoff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs hAcirc1_nonneg hAcircS_nonneg hB hC + have havg_le : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ A1 C := by + simpa [coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound] using! + (coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ hAavg_nonneg hXi_nonneg hAcirc1_nonneg hC + (le_rfl : Real.sqrt (coarseBBlockNorm Q a) ≤ Real.sqrt (coarseBBlockNorm Q a)) + (le_rfl : cubeLpNorm Q ∞ ξ ≤ cubeLpNorm Q ∞ ξ) hA1) + have hbesov_le : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ A1 AS B C := by + simpa [coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff, + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound] using + (coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ hAavg_nonneg hAflux_nonneg hcutoff_nonneg + (le_rfl : Real.sqrt (coarseBBlockNorm Q a) ≤ Real.sqrt (coarseBBlockNorm Q a)) + (le_rfl : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) + hcutoff_le) + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov, + coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact add_le_add havg_le hbesov_le + +theorem coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (ξ : Vec d → Vec d) (energy : Vec d → ℝ) (Acirc1 AcircS B C : ℝ) : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C = + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C * + (Real.sqrt (cubeAverage Q energy) * Real.sqrt (cubeAverage Q energy)) := by + unfold coarseCaccioppoliFluxEnergyExactCenteredRhs + coarseCaccioppoliFluxEnergyExactCenteredCoeff + coarseCaccioppoliCenteredCutoffSize + coarseCaccioppoliCenteredCutoffCoeff + ring + +theorem coarseCaccioppoliFluxEnergyExactCenteredRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactCenteredRhs + Q a s ξ energy Acirc1 AcircS B C := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq] + exact mul_nonneg + (coarseCaccioppoliFluxEnergyExactCenteredCoeff_nonneg + Q a ξ hs hAcirc1 hAcircS hB hC) + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) + +theorem coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B C : ℝ) : + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B C = + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B + + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C := by + rfl + +theorem coarseCaccioppoliFluxEnergyExactRhs_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B C := by + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered] + exact add_nonneg + (coarseCaccioppoliFluxEnergyExactConstantRhs_nonneg Q a u ξ energy hB) + (coarseCaccioppoliFluxEnergyExactCenteredRhs_nonneg + Q a ξ energy hs hAcirc1 hAcircS hB hC) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/Flux.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/Flux.lean new file mode 100644 index 0000000000..4cd8190524 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/Flux.lean @@ -0,0 +1,413 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QOne + +/-! # Flux -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Energy bridges for coarse Caccioppoli + +This sidecar file connects the local cutoff-product Caccioppoli estimate to the +coarse-Poincare energy-control surface, without editing the active Poincare +files. The main point is to expose the finite `q = 1` flux partial bounds that +the local pairing theorem consumes. +-/ + +theorem norm_le_sqrt_vecNormSq {d : ℕ} (v : Vec d) : + ‖v‖ ≤ Real.sqrt (vecNormSq v) := by + refine (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg _)).2 ?_ + intro i + have hsq : ‖v i‖ ^ (2 : ℕ) ≤ (Real.sqrt (vecNormSq v)) ^ (2 : ℕ) := by + calc + ‖v i‖ ^ (2 : ℕ) = v i ^ (2 : ℕ) := by + rw [Real.norm_eq_abs, sq_abs] + _ ≤ vecNormSq v := sq_apply_le_vecNormSq v i + _ = (Real.sqrt (vecNormSq v)) ^ (2 : ℕ) := by + rw [Real.sq_sqrt (vecNormSq_nonneg v)] + exact le_of_sq_le_sq hsq (Real.sqrt_nonneg _) + +theorem norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_cubeAverage_of_fluxEnergyControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (flux : Vec d → Vec d) (energy : Vec d → ℝ) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a * cubeAverage Q energy) := by + have hQ : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + have hsq : + vecNormSq (cubeAverageVec Q flux) ≤ + coarseBBlockNorm Q a * cubeAverage Q energy := hflux 0 Q hQ + calc + ‖cubeAverageVec Q flux‖ + ≤ Real.sqrt (vecNormSq (cubeAverageVec Q flux)) := + norm_le_sqrt_vecNormSq (cubeAverageVec Q flux) + _ ≤ Real.sqrt (coarseBBlockNorm Q a * cubeAverage Q energy) := + Real.sqrt_le_sqrt hsq + +theorem norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_sqrt_cubeAverage_of_fluxEnergyControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (flux : Vec d → Vec d) (energy : Vec d → ℝ) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := by + calc + ‖cubeAverageVec Q flux‖ + ≤ Real.sqrt (coarseBBlockNorm Q a * cubeAverage Q energy) := + norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_cubeAverage_of_fluxEnergyControl + Q a flux energy hflux + _ = Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := by + rw [Real.sqrt_mul (coarseBBlockNorm_nonneg Q a)] + +theorem sqrt_coarseBBlockNorm_le_inv_geometricDiscount_mul_LambdaSq_one_rpow_half + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.sqrt (coarseBBlockNorm Q a) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hbase : + geometricDiscount s 1 * Real.sqrt (coarseBBlockNorm Q a) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + simpa [Real.sqrt_eq_rpow] using + geometricDiscount_mul_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half + Q a s hs.le hsum + calc + Real.sqrt (coarseBBlockNorm Q a) + = (geometricDiscount s 1)⁻¹ * + (geometricDiscount s 1 * Real.sqrt (coarseBBlockNorm Q a)) := by + rw [← mul_assoc, inv_mul_cancel₀ hdisc_pos.ne', one_mul] + _ ≤ (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hbase (inv_nonneg.mpr hdisc_pos.le) + +/-- Canonical `q = 1` coefficient factor used by the Caccioppoli local bridge. +It simultaneously bounds the block-average coefficient and the negative Besov +flux coefficient once the corresponding geometric series is summable. -/ +noncomputable def coarseCaccioppoliLambdaFactor {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s : ℝ) : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + +theorem coarseCaccioppoliLambdaFactor_nonneg {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) {s : ℝ} (hs : 0 ≤ s) : + 0 ≤ coarseCaccioppoliLambdaFactor Q a s := by + unfold coarseCaccioppoliLambdaFactor + have hdisc_nonneg : 0 ≤ (geometricDiscount s 1)⁻¹ := by + by_cases hs0 : 0 < s + · exact inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs0)).le + · exact inv_nonneg.mpr (geometricDiscount_nonneg (by simpa using hs)) + exact mul_nonneg hdisc_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) _) + +theorem sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.sqrt (coarseBBlockNorm Q a) ≤ coarseCaccioppoliLambdaFactor Q a s := by + simpa [coarseCaccioppoliLambdaFactor] using + sqrt_coarseBBlockNorm_le_inv_geometricDiscount_mul_LambdaSq_one_rpow_half + Q a hs hsum + +/-- Finite `q = 1` gradient coarse-Poincare bound, exposed in the Caccioppoli +bridge namespace so scalar component `circ` bounds can be built without +reopening the active Poincare files. -/ +theorem coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovNegativeVectorPartialSeminorm Q s N g ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos hs1 + let coeff : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s g j ≤ + coeff j * Real.sqrt (cubeAverage Q energy) := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_gradientEnergy + (Q := Q) a g energy henergy_nonneg henergy_int hgrad j + have hmax_nonneg : + 0 ≤ maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a := by + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j) ≤ + Real.sqrt + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact Real.sqrt_le_sqrt havg + calc + cubeBesovNegativeVectorDepthSeminorm Q s g j = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j) := by + rfl + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left hsqrt + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = coeff j * Real.sqrt (cubeAverage Q energy) := by + unfold coeff + rw [mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt hmax_nonneg] + have hsum_partial : + cubeBesovNegativeVectorPartialSeminorm Q s N g ≤ + Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) (fun j => + cubeBesovNegativeVectorDepthSeminorm Q s g j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + coeff j * Real.sqrt (cubeAverage Q energy)) := by + exact Finset.sum_le_sum hdepth + _ = Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + rw [Finset.sum_mul] + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + have hcoeff_eq : + Finset.sum (Finset.range (N + 1)) coeff = + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + unfold coeff + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight hs j] + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) + ≤ ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + calc + cubeBesovNegativeVectorPartialSeminorm Q s N g + ≤ Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := + hsum_partial + _ = (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + rw [hcoeff_eq] + _ ≤ (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + have hscaled : + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (j : ℤ)) a) (1 / 2 : ℝ)) + ≤ + (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled (Real.sqrt_nonneg _) + _ = (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + rw [multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q s a hs.le] + +/-- Finite `q = 1` flux coarse-Poincare bound, exposed in the Caccioppoli +bridge namespace so the local pairing theorem can consume the exact partial +seminorm hypotheses it needs. -/ +theorem coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (flux : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos hs1 + let coeff : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s flux j ≤ + coeff j * Real.sqrt (cubeAverage Q energy) := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_fluxEnergy + (Q := Q) a flux energy henergy_nonneg henergy_int hflux j + have hmax_nonneg : + 0 ≤ maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a := by + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j) ≤ + Real.sqrt + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact Real.sqrt_le_sqrt havg + calc + cubeBesovNegativeVectorDepthSeminorm Q s flux j = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j) := by + rfl + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left hsqrt + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = coeff j * Real.sqrt (cubeAverage Q energy) := by + unfold coeff + rw [mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt hmax_nonneg] + have hsum_partial : + cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ + Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) (fun j => + cubeBesovNegativeVectorDepthSeminorm Q s flux j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + coeff j * Real.sqrt (cubeAverage Q energy)) := by + exact Finset.sum_le_sum hdepth + _ = Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + rw [Finset.sum_mul] + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + have hcoeff_eq : + Finset.sum (Finset.range (N + 1)) coeff = + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + unfold coeff + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight hs j] + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) + ≤ ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + calc + cubeBesovNegativeVectorPartialSeminorm Q s N flux + ≤ Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := + hsum_partial + _ = (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + rw [hcoeff_eq] + _ ≤ (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + have hscaled : + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q + (Q.scale - (j : ℤ)) a) (1 / 2 : ℝ)) + ≤ + (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled (Real.sqrt_nonneg _) + _ = (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + rw [multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q s a hs.le] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalConstantBranch.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalConstantBranch.lean new file mode 100644 index 0000000000..457f0a2b24 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalConstantBranch.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs + +/-! # Local Constant Branch -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local constant branch coefficient helpers + +This file isolates the bounded coefficient step for the constant branch in the +small-cube Caccioppoli route. The local `L²` norm of `u` has already been +factored out by the descendant summation argument, so the target is the +single-cube base coefficient. +-/ + +/-- Constant-branch local coefficient comparison from separated coefficient +factor bounds and an `L∞` bound for the cutoff gradient. + +The final scalar hypothesis is the remaining deterministic adequacy comparison +between the bounded exact coefficient/cutoff expression and the local +single-cube base coefficient at scale `kR - j`. -/ +theorem + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds + {d : ℕ} (R : TriadicCube d) (a : CoeffField d) + (ξ : Vec d → Vec d) {B Ceff kR Aavg Aflux1 Xi : ℝ} (j : ℕ) + (hB_nonneg : 0 ≤ B) + (hAavg : Real.sqrt (coarseBBlockNorm R a) ≤ Aavg) + (hAflux1 : + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq R (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) ≤ Aflux1) + (hξ : cubeLpNorm R ∞ ξ ≤ Xi) + (hbounded : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R Aavg Aflux1 * + (B + cubeBesovScaleWeight 1 R * Xi) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff + (kR - (j : ℝ))) : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff + (kR - (j : ℝ)) := by + have hAavg_nonneg : 0 ≤ Aavg := + le_trans (Real.sqrt_nonneg _) hAavg + have hdisc1_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * (1 : ℝ)) + have hLambda1_nonneg : 0 ≤ LambdaSq R (1 : ℝ) (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg R (1 : ℝ) a (by norm_num) + have hAflux1_nonneg : 0 ≤ Aflux1 := by + exact le_trans + (mul_nonneg (inv_nonneg.mpr hdisc1_pos.le) + (Real.rpow_nonneg hLambda1_nonneg _)) + hAflux1 + have hcoeff : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R Aavg Aflux1 := + coarseCaccioppoliFluxEnergyExactConstantCoeff_le_factorBound R a hAavg hAflux1 + have hfactor_nonneg : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R Aavg Aflux1 := + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_nonneg R + hAavg_nonneg hAflux1_nonneg + have hcutoff : + B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ ≤ + B + cubeBesovScaleWeight 1 R * Xi := by + simpa [add_comm, add_left_comm, add_assoc] using add_le_add_left + (mul_le_mul_of_nonneg_left hξ (cubeBesovScaleWeight_nonneg 1 R)) B + have hcutoff_nonneg : + 0 ≤ B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ := by + exact add_nonneg hB_nonneg + (mul_nonneg (cubeBesovScaleWeight_nonneg 1 R) (cubeLpNorm_nonneg R ∞ ξ)) + exact le_trans + (mul_le_mul hcoeff hcutoff hcutoff_nonneg hfactor_nonneg) + hbounded + +/-- Descendant version for a parent quantitative cutoff. The `L∞` cutoff +gradient input is supplied by the standard descendant-local quantitative +cutoff bound. -/ +theorem + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_cutoffGradient_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (a : CoeffField d) + {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {B Ceff kR Aavg Aflux1 : ℝ} + (hB_nonneg : 0 ≤ B) + (hAavg : Real.sqrt (coarseBBlockNorm R a) ≤ Aavg) + (hAflux1 : + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq R (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) ≤ Aflux1) + (hbounded : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R Aavg Aflux1 * + (B + cubeBesovScaleWeight 1 R * + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q))) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff + (kR - (j : ℝ))) : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ (scalarCutoffGradientField η)) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff + (kR - (j : ℝ)) := by + exact + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds + R a (scalarCutoffGradientField η) j hB_nonneg hAavg hAflux1 + (quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le_on_descendant hR η) + hbounded + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate.lean new file mode 100644 index 0000000000..c798fe49e2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.SingleCube + +/-! # Local Estimate -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Cutoff.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Cutoff.lean new file mode 100644 index 0000000000..404cbc7291 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Cutoff.lean @@ -0,0 +1,632 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Split + +/-! # Cutoff -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Local energy estimate: cutoff-localized exact RHS bridge +-/ + +noncomputable section + +open scoped BigOperators ENNReal + +/-- Exact local Caccioppoli estimate on a descendant cube using a cutoff +constructed on the parent cube. This is the small-cube local form of the +Chapter 3 proof: the cube being averaged is `R`, while the cutoff transition +still comes from the annulus between the two radii of `Q`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have hξLp : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure R) := + quantitativeCubeCutoff_memLp_top_gradientField_on_descendant hR η + have hvector : + CoarseCaccioppoliVectorCutoffControls R s u G (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C := + CoarseCaccioppoliVectorCutoffControls.of_quantitativeCubeCutoff_on_descendant + (Q := Q) (R := R) (j := j) hR (s := s) (u := u) (G := G) + (energy := energy) (η := η) hB hAcircS hBgConst hBgCent hC + hproj hGcirc1 hGcircS + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorControls + (Q := R) (a := a) (s := s) (flux := flux) (u := u) (G := G) + (ξ := scalarCutoffGradientField η) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := C) hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hvector + +/-- Exact local Caccioppoli estimate on a cube using the arbitrary-center local +canonical cutoff. This is the single-cube bridge needed by the boundary +radius profile in the notes, where the cutoff lives on `center + rho cu_{m-1}` +rather than on a cube centered at the parent cube center. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_localCanonicalCutoff_on_cube + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have hξLp : + MeasureTheory.MemLp + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ∞ (normalizedCubeMeasure R) := + coarseCaccioppoliLocalCanonicalFun_memLp_top_gradientField_on_cube + Q R center hinner hinnerOuter + have hvector : + CoarseCaccioppoliVectorCutoffControls R s u G + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + C := + CoarseCaccioppoliVectorCutoffControls.of_localCanonicalCutoff_on_cube + Q R center s hinner hinnerOuter u G energy hB hAcircS hBgConst + hBgCent hC hproj hGcirc1 hGcircS + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorControls + (Q := R) (a := a) (s := s) (flux := flux) (u := u) (G := G) + (ξ := scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := C) hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hvector + +/-- Local exact-RHS estimate for the arbitrary-center canonical cutoff, with +the RHS energy localized to a larger arbitrary-center local cube, on the branch +where the averaged cube is contained in that larger local cube. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have havg : + cubeAverage R ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) = + cubeAverage R energy := + cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := R) center rho energy hsub + have hfluxEnergy_indicator : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) := + hfluxEnergy.indicator_coarseCaccioppoliLocalClosedCube_of_cubeSet_subset + center rho hsub + have hBgCent_indicator : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS + (Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy))) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + simpa [havg] using hBgCent + have hGcirc1_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * + Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy)) := by + intro i N + simpa [havg] using hGcirc1 i N + have hGcircS_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ + AcircS * + Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy)) := by + intro i N + simpa [havg] using hGcircS i N + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_localCanonicalCutoff_on_cube + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) + (flux := flux) (u := u) (G := G) + (energy := (coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hinner hinnerOuter hs0 hs1 hfluxMem hu hG hfluxEnergy_indicator hB hAcircS + hBgConst hBgCent_indicator hC hproj hGcirc1_indicator hGcircS_indicator + +/-- Local exact-RHS estimate for descendant cubes outside the support of the +arbitrary-center canonical cutoff. The pairing vanishes pointwise on the +averaged cube. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_forall_notMem_localClosedCube + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) + (a : CoeffField d) {s : ℝ} {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hout : ∀ x ∈ cubeSet R, x ∉ coarseCaccioppoliLocalClosedCube Q center rhoOuter) + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS B C := by + have hpair_zero : + cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x)) = + 0 := by + rw [← cubeAverage_const (Q := R) (c := 0)] + apply cubeAverage_congr_on_cubeSet + intro x hxR + have hξ : + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x = 0 := + scalarCutoffGradientField_coarseCaccioppoliLocalCanonicalFun_eq_zero_of_notMem_localClosedCube + hinner hinnerOuter (hout x hxR) + simp [hξ, vecDot_zero_right] + rw [hpair_zero, abs_zero] + exact + coarseCaccioppoliFluxEnergyExactRhs_nonneg + R a u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + hs hAcirc1 hAcircS hB hC + +/-- Buffered local exact-RHS estimate for the arbitrary-center canonical +cutoff. A descendant either misses the local cutoff support or, if it touches +the support, the buffer hypothesis forces it into the larger local energy cube. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_descendant_of_support_buffer + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (_hR : R ∈ descendantsAtDepth Q j) + (center : Vec d) (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hgap : cubeScaleFactor R ≤ (rho - rhoOuter) * (cubeRadius Q / 3)) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + by_cases hinter : + ∃ y ∈ cubeSet R, y ∈ coarseCaccioppoliLocalClosedCube Q center rhoOuter + · have hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho := + cubeSet_subset_coarseCaccioppoliLocalClosedCube_of_intersects_of_scaleFactor_le_gap + (Q := Q) (R := R) (center := center) + (rhoInner := rhoOuter) (rhoOuter := rho) hgap hinter + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_cubeSet_subset + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hinner hinnerOuter hsub hs0 hs1 hfluxMem hu hG hfluxEnergy hB hAcircS + hBgConst hBgCent hC hproj hGcirc1 hGcircS + · have hout : + ∀ x ∈ cubeSet R, x ∉ coarseCaccioppoliLocalClosedCube Q center rhoOuter := by + intro x hxR hxrhoOuter + exact hinter ⟨x, hxR, hxrhoOuter⟩ + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_forall_notMem_localClosedCube + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + hinner hinnerOuter hout hs0 hAcirc1 hAcircS hB + (mul_nonneg (by positivity) hC) + +/-- Local exact-RHS estimate with an outer localized energy density, for +descendant cubes contained in the localization region. + +This is the support-localized version of +`abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant` +on the easy branch: when `cubeSet R` is contained in the outer scaled cube, +the localized indicator agrees with the original energy on every descendant +of `R`, so the flux-energy controls and the scalar bounds transfer by +cube-average congruence. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have havg : + cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy) = + cubeAverage R energy := + cubeAverage_indicator_scaledClosedCubeSet_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := R) ρ energy hsub + have hfluxEnergy_indicator : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((scaledClosedCubeSet Q ρ).indicator energy) := + hfluxEnergy.indicator_scaledClosedCubeSet_of_cubeSet_subset ρ hsub + have hBgCent_indicator : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy))) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + simpa [havg] using hBgCent + have hGcirc1_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * + Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy)) := by + intro i N + simpa [havg] using hGcirc1 i N + have hGcircS_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ + AcircS * + Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy)) := by + intro i N + simpa [havg] using hGcircS i N + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := (scaledClosedCubeSet Q ρ).indicator energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hs0 hs1 hfluxMem hu hG hfluxEnergy_indicator hB hAcircS hBgConst + hBgCent_indicator hC hproj hGcirc1_indicator hGcircS_indicator + +/-- Local exact-RHS estimate with an outer localized energy density, for +descendant cubes outside the support region of the parent cutoff. In this +branch the pairing vanishes pointwise on the averaged cube. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_forall_notMem_scaledClosedCubeSet + {d : ℕ} {Q R : TriadicCube d} + (a : CoeffField d) {s : ℝ} {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS B C : ℝ} + (hout : ∀ x ∈ cubeSet R, x ∉ scaledClosedCubeSet Q ρ₂) + (hs : 0 < s) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hB : 0 ≤ B) (hC : 0 ≤ C) : + |cubeAverage R + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + Acirc1 AcircS B C := by + have hpair_zero : + cubeAverage R + (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x)) = + 0 := by + rw [← cubeAverage_const (Q := R) (c := 0)] + apply cubeAverage_congr_on_cubeSet + intro x hxR + have hξ : + scalarCutoffGradientField (η : Vec d → ℝ) x = 0 := + η.scalarCutoffGradientField_eq_zero_of_notMem_scaledClosedCubeSet + (hout x hxR) + simp [hξ, vecDot_zero_right] + rw [hpair_zero, abs_zero] + exact + coarseCaccioppoliFluxEnergyExactRhs_nonneg + R a u (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + hs hAcirc1 hAcircS hB hC + +/-- Buffered local exact-RHS estimate. The cutoff is supported in +`scaledClosedCubeSet Q ρ₂`, while the energy is localized on a larger radius +`ρ`. If the descendant side length fits in the buffer `ρ - ρ₂`, then every +descendant either misses the cutoff support, or is entirely contained in the +larger localization cube. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_support_buffer + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hgap : cubeScaleFactor R ≤ (ρ - ρ₂) * cubeRadius Q) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + by_cases hinter : ∃ y ∈ cubeSet R, y ∈ scaledClosedCubeSet Q ρ₂ + · have hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ := + cubeSet_subset_scaledClosedCubeSet_of_intersects_scaledClosedCubeSet_of_scaleFactor_le_gap + (Q := Q) (R := R) (ρinner := ρ₂) (ρouter := ρ) hgap hinter + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_cubeSet_subset + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (ρ := ρ) + (flux := flux) (u := u) (G := G) (energy := energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hsub hs0 hs1 hfluxMem hu hG hfluxEnergy hB hAcircS hBgConst hBgCent + hC hproj hGcirc1 hGcircS + · have hout : ∀ x ∈ cubeSet R, x ∉ scaledClosedCubeSet Q ρ₂ := by + intro x hxR hxρ₂ + exact hinter ⟨x, hxR, hxρ₂⟩ + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_forall_notMem_scaledClosedCubeSet + (Q := Q) (R := R) (a := a) (s := s) (ρ := ρ) + (flux := flux) (u := u) (energy := energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + hout hs0 hAcirc1 hAcircS hB + (mul_nonneg (by positivity) hC) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/SingleCube.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/SingleCube.lean new file mode 100644 index 0000000000..4ac2a61397 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/SingleCube.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Cutoff + +/-! # Single Cube -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Local energy estimate: single-cube note RHS bridge +-/ + +noncomputable section + +open scoped BigOperators ENNReal + +/-- Note single-cube estimate obtained from the exact local bridge once the +remaining coefficient-domination obligation has been supplied. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_controls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C k h uL2Sq : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) + (hdom : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s C k h uL2Sq u ξ energy + Acirc1 AcircS B) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq + (cubeAverage Q energy) := by + exact le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_controls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + hs0 hs1 hfluxMem hu hg hξLp hfluxEnergy hscalar) + hdom + +/-- Note single-cube estimate from the vector projected-Poincare package and a +coefficient-domination proof stated for the effective scalar-facing constant +`(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_vectorControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C k h uL2Sq : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hvector : CoarseCaccioppoliVectorCutoffControls Q s u G ξ energy Acirc1 AcircS B C) + (hdom : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s + ((Fintype.card (Fin d) : ℝ) * C) k h uL2Sq u ξ energy Acirc1 AcircS B) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s + ((Fintype.card (Fin d) : ℝ) * C) k h uL2Sq + (cubeAverage Q energy) := by + exact le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorControls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hvector) + hdom + +/-- Note single-cube estimate on a descendant cube using a parent quantitative +cutoff, after the small-cube coefficient domination has been supplied. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_parentQuantitativeCutoff_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C k h uL2Sq : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) + (hdom : + CoarseCaccioppoliSingleCubeCoefficientDomination R a s + ((Fintype.card (Fin d) : ℝ) * C) k h uL2Sq u (scalarCutoffGradientField η) + energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs R a s + ((Fintype.card (Fin d) : ℝ) * C) k h uL2Sq + (cubeAverage R energy) := by + exact le_trans + (abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := energy) (η := η) (Acirc1 := Acirc1) (AcircS := AcircS) + (C := C) hs0 hs1 hfluxMem hu hG hfluxEnergy hB hAcircS hBgConst hBgCent + hC hproj hGcirc1 hGcircS) + hdom + +/-- Note single-cube estimate obtained directly from the factored coefficient +controls. The nonnegativity of the averaged energy is supplied by the +flux-energy bundle, so callers only need the two scalar coefficient +inequalities. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_coefficientControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C k h uL2Sq : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) + (hcoeff : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C k h uL2Sq u ξ + Acirc1 AcircS B) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq + (cubeAverage Q energy) := by + have henergy : + 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on (Q := Q) hfluxEnergy.1 + exact + abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_controls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (k := k) (h := h) (uL2Sq := uL2Sq) + hs0 hs1 hfluxMem hu hg hξLp hfluxEnergy hscalar + (CoarseCaccioppoliSingleCubeCoefficientDomination.of_coefficientControls + Q a s C k h uL2Sq u ξ energy Acirc1 AcircS B henergy hcoeff) + +/-- Note single-cube estimate from the most separated coefficient inputs: +a constant coefficient bound, a constant cutoff-size bound, and termwise +centered average/Besov bounds. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C k h uL2Sq A G X Y : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) + (hA_nonneg : 0 ≤ A) + (hconstCoeff : coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ A) + (hconstCutoff : coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ G) + (hconst : + A * G ≤ coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (havg : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ X) + (hbesov : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ Y) + (hcentered : + X + Y ≤ coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq + (cubeAverage Q energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_coefficientControls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (k := k) (h := h) (uL2Sq := uL2Sq) + hs0 hs1 hfluxMem hu hg hξLp hfluxEnergy hscalar + (CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds + Q a s C k h uL2Sq u ξ Acirc1 AcircS hA_nonneg hscalar.1 + hconstCoeff hconstCutoff hconst havg hbesov hcentered) + +/-- Note single-cube estimate from canonical coefficient factors and primitive +scalar cutoff bounds. This is the fixed-cube counterpart of the canonical +radius-energy input in `CoarseCaccioppoliSingleCubeToRaw`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_canonical_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C k h uL2Sq U Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) + (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq + (cubeAverage Q energy) := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_coefficientControls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (k := k) (h := h) (uL2Sq := uL2Sq) + hs0 hs1 hfluxMem huMem hg hξLp hfluxEnergy hscalar + (CoarseCaccioppoliSingleCubeCoefficientControls.of_canonical_factor_bounds + Q a s C k h uL2Sq u ξ Acirc1 AcircS hs0 hscalar.2.2.2.1 + hfluxEnergy.2.2.2.1 hfluxEnergy.2.2.2.2 hscalar.1 hAcirc1_nonneg + hAcircS_nonneg hu hξ hB hAcirc1 hAcircS hconst hcentered) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Split.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Split.lean new file mode 100644 index 0000000000..252d17b97b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimate/Split.lean @@ -0,0 +1,417 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Scalar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.Vector + +/-! # Split -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Local energy estimate: split exact RHS bridge +-/ + +noncomputable section + +open scoped BigOperators ENNReal + +/-- The split local Caccioppoli estimate with all flux-side Besov and average +hypotheses supplied by the coarse-Poincare flux energy-control interface. The +remaining hypotheses are exactly the scalar projected-Poincare/cutoff-product +side and the elementary cutoff-size bounds. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hC : 0 ≤ C) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxCtrl : CubeAverageFluxEnergyControl Q a flux energy) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Acirc1 * Real.sqrt (cubeAverage Q energy)))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + (AcircS * Real.sqrt (cubeAverage Q energy))))) ≤ BgCent) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + dsimp only + have havgFlux : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := + norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_sqrt_cubeAverage_of_fluxEnergyControl + Q a flux energy hfluxCtrl + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_bound + (Q := Q) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (Bu1 := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (BuS := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (Bavg := Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy)) + (Bcirc1 := Acirc1 * Real.sqrt (cubeAverage Q energy)) + (BcircS := AcircS * Real.sqrt (cubeAverage Q energy)) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hfluxMem hu hg hξLp hBgConst hBgCent + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) hC havgFlux + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) flux energy N henergy_nonneg henergy_int hfluxCtrl hsum1) + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a s hs0 flux energy N henergy_nonneg henergy_int hfluxCtrl hsumS) + hproj hξ hderiv hgCirc1 hgCircS hBgConst_bound hBgCent_bound + +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hC : 0 ≤ C) (hAcircS : 0 ≤ AcircS) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxCtrl : CubeAverageFluxEnergyControl Q a flux energy) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Acirc1 * Real.sqrt (cubeAverage Q energy)))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + (AcircS * Real.sqrt (cubeAverage Q energy))))) ≤ BgCent) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + dsimp only + have havgFlux : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := + norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_sqrt_cubeAverage_of_fluxEnergyControl + Q a flux energy hfluxCtrl + have hBcircS_nonneg : + 0 ≤ AcircS * Real.sqrt (cubeAverage Q energy) := + mul_nonneg hAcircS (Real.sqrt_nonneg _) + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_contDiff_component_vector_effective_constant + (Q := Q) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (Bu1 := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (BuS := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (Bavg := Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy)) + (Bcirc1 := Acirc1 * Real.sqrt (cubeAverage Q energy)) + (BcircS := AcircS * Real.sqrt (cubeAverage Q energy)) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) hC hBcircS_nonneg havgFlux + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) flux energy N henergy_nonneg henergy_int hfluxCtrl hsum1) + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a s hs0 flux energy N henergy_nonneg henergy_int hfluxCtrl hsumS) + hproj hξ hderiv hGcirc1 hGcircS hBgConst_bound hBgCent_bound + +/-- Version of the flux-energy bridge using the exact cutoff sizes instead of +separate upper-bound hypotheses for `BgConst` and `BgCent`. + +This is the last purely local bookkeeping step before the note-facing +single-cube estimate: the remaining work is to dominate these exact cutoff +sizes by the Chapter-3 radius/height coefficients. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_exact_cutoff_sizes + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B C) + (hC : 0 ≤ C) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxCtrl : CubeAverageFluxEnergyControl Q a flux energy) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgConst : ℝ := coarseCaccioppoliConstantCutoffSize Q u ξ B + let BgCent : ℝ := coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + dsimp only + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_bound + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (BgConst := coarseCaccioppoliConstantCutoffSize Q u ξ B) + (BgCent := + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B C) + hB hs0 hs1 hfluxMem hu hg hξLp hBgConst hBgCent hC henergy_nonneg henergy_int + hfluxCtrl hsum1 hsumS hproj hξ hderiv hgCirc1 hgCircS + (by rfl) + (by rfl) + +/-- Bundled-hypothesis version of the flux-energy/exact-cutoff bridge. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControls_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + let BgConst : ℝ := coarseCaccioppoliConstantCutoffSize Q u ξ B + let BgCent : ℝ := coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS E B C + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + rcases hfluxEnergy with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + rcases hscalar with + ⟨hB, hBgConst, hBgCent, hC, hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_exact_cutoff_sizes + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + hB hs0 hs1 hfluxMem hu hg hξLp hBgConst hBgCent hC henergy_nonneg henergy_int + hfluxCtrl hsum1 hsumS hproj hξ hderiv hgCirc1 hgCircS + +/-- Compact exact-RHS form of the local coarse Caccioppoli bridge. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_controls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B C := by + simpa [coarseCaccioppoliFluxEnergyExactRhs] using + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControls_of_scalarCutoffControls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + hs0 hs1 hfluxMem hu hg hξLp hfluxEnergy hscalar + +/-- Compact exact-RHS form of the local coarse Caccioppoli bridge, using the +vector projected-Poincare package. The scalar-facing exact RHS receives the +effective constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hvector : CoarseCaccioppoliVectorCutoffControls Q s u G ξ energy Acirc1 AcircS B C) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B + ((Fintype.card (Fin d) : ℝ) * C) := by + rcases hfluxEnergy with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + rcases hvector with + ⟨hB, hAcircS, hBgConst, hBgCent, hC, hproj, hξ, hderiv, hGcirc1, hGcircS⟩ + simpa [coarseCaccioppoliFluxEnergyExactRhs] using + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (BgConst := coarseCaccioppoliConstantCutoffSize Q u ξ B) + (BgCent := + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C)) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent hC hAcircS + henergy_nonneg henergy_int hfluxCtrl hsum1 hsumS + hproj hξ hderiv hGcirc1 hGcircS + (by rfl) + (by rfl) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimateFullDual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimateFullDual.lean new file mode 100644 index 0000000000..616be9f4dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalEstimateFullDual.lean @@ -0,0 +1,915 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing.VectorFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate + +/-! # Local Estimate Full Dual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Full-dual local Caccioppoli estimate + +This sidecar is the corrected full-dual/local-multiscale analogue of the +vector projected-Poincare local estimate in `LocalEstimate.lean`. +-/ + +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound_dualFull_localMultiscale + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hC : 0 ≤ C) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxCtrl : CubeAverageFluxEnergyControl Q a flux energy) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Acirc1 * Real.sqrt (cubeAverage Q energy)))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + (AcircS * Real.sqrt (cubeAverage Q energy))))) ≤ BgCent) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + dsimp only + have havgFlux : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := + norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_sqrt_cubeAverage_of_fluxEnergyControl + Q a flux energy hfluxCtrl + have hBcircS_nonneg : + 0 ≤ AcircS * Real.sqrt (cubeAverage Q energy) := + mul_nonneg hAcircS (Real.sqrt_nonneg _) + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_localMultiscale_effective_constant + (Q := Q) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (Bu1 := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (BuS := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (Bavg := Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy)) + (Bcirc1 := Acirc1 * Real.sqrt (cubeAverage Q energy)) + (BcircS := AcircS * Real.sqrt (cubeAverage Q energy)) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) hC + (mul_nonneg hAcirc1 (Real.sqrt_nonneg _)) + (mul_nonneg hAcircS (Real.sqrt_nonneg _)) havgFlux + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) flux energy N henergy_nonneg henergy_int hfluxCtrl hsum1) + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a s hs0 flux energy N henergy_nonneg henergy_int hfluxCtrl hsumS) + hfull hlocal hξ hderiv hGcirc1 hGcircS hBgConst_bound hBgCent_bound + +/-- Compact exact-RHS local Caccioppoli estimate using full-dual vector +Poincare plus the finite local-multiscale estimate. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorFullDualLocalMultiscale + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hB : 0 ≤ B) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hBgConst : 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate Q + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B + ((Fintype.card (Fin d) : ℝ) * C) := by + rcases hfluxEnergy with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + simpa [coarseCaccioppoliFluxEnergyExactRhs] using + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound_dualFull_localMultiscale + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (BgConst := coarseCaccioppoliConstantCutoffSize Q u ξ B) + (BgCent := + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C)) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent hC hAcirc1 hAcircS + henergy_nonneg henergy_int hfluxCtrl hsum1 hsumS + hfull hlocal hξ hderiv hGcirc1 hGcircS + (by rfl) + (by rfl) + +/-- Exact local Caccioppoli estimate on a descendant cube using a cutoff +constructed on the parent cube, with the corrected full-dual/local-multiscale +Poincare inputs. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant_vectorFullDualLocalMultiscale + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hlocal : ∀ N : ℕ, + CubeLocalMultiscalePoincareVectorEstimate R + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1))) + (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have hξLp : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure R) := + quantitativeCubeCutoff_memLp_top_gradientField_on_descendant hR η + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorFullDualLocalMultiscale + (Q := R) (a := a) (s := s) (flux := flux) (u := u) (G := G) + (ξ := scalarCutoffGradientField η) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := C) hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hB hAcirc1 hAcircS + hBgConst hBgCent hC hfull hlocal + (fun i => contDiff_scalarCutoffGradientField_component η.smooth i) + (quantitativeCubeCutoff_component_fderiv_bound_on_descendant hR η) + hGcirc1 hGcircS + +/-- Local Caccioppoli estimate using full-dual Poincare and infinite-depth +full-circ bounds, with no finite local-multiscale Poincare input. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound_dualFull_fullCirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C BgConst BgCent : ℝ} + (hB : 0 ≤ B) (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hBgConst : 0 ≤ BgConst) (hBgCent : 0 ≤ BgCent) + (hC : 0 ≤ C) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hfluxCtrl : CubeAverageFluxEnergyControl Q a flux energy) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) + (hBgConst_bound : + cubeLpNorm Q (2 : ℝ≥0∞) u * + (B + cubeBesovScaleWeight 1 Q * cubeLpNorm Q ∞ ξ) ≤ BgConst) + (hBgCent_bound : + 2 * (cubeScaleFactor Q * B * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (Acirc1 * Real.sqrt (cubeAverage Q energy)))) + + cubeLpNorm Q ∞ ξ * + (cubeBesovScaleWeight (-s) Q * + ((((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + (AcircS * Real.sqrt (cubeAverage Q energy))))) ≤ BgCent) : + let E : ℝ := Real.sqrt (cubeAverage Q energy) + let Aavg : ℝ := Real.sqrt (coarseBBlockNorm Q a) + let Aflux1 : ℝ := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) + let AfluxS : ℝ := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + (d : ℝ) * + (((3 : ℝ) ^ ((d : ℝ) + 1) * + (cubeBesovScaleWeight (-1) Q * (Aflux1 * E))) * BgConst) + + ((d : ℝ) * + ((Aavg * E) * (cubeLpNorm Q ∞ ξ * + (((3 / 2 : ℝ) * ((Fintype.card (Fin d) : ℝ) * C) * + (3 : ℝ) ^ ((d : ℝ) + 1)) * (Acirc1 * E)))) + + (d : ℝ) * + ((((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * (AfluxS * E))) * + (cubeBesovScaleWeight s Q * BgCent)))) := by + dsimp only + have havgFlux : + ‖cubeAverageVec Q flux‖ ≤ + Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy) := + norm_cubeAverageVec_le_sqrt_coarseBBlockNorm_mul_sqrt_cubeAverage_of_fluxEnergyControl + Q a flux energy hfluxCtrl + exact + abs_cubeAverage_vecDot_scalar_smul_le_split_collapsed_sharp_note_terms_of_dualFull_fullCirc_effective_constant + (Q := Q) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (Bu1 := + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (BuS := + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) + (Bavg := Real.sqrt (coarseBBlockNorm Q a) * Real.sqrt (cubeAverage Q energy)) + (Bcirc1 := Acirc1 * Real.sqrt (cubeAverage Q energy)) + (BcircS := AcircS * Real.sqrt (cubeAverage Q energy)) + (B := B) (C := C) (BgConst := BgConst) (BgCent := BgCent) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent + (mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _)) hC + (mul_nonneg hAcirc1 (Real.sqrt_nonneg _)) + (mul_nonneg hAcircS (Real.sqrt_nonneg _)) havgFlux + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) flux energy N henergy_nonneg henergy_int hfluxCtrl hsum1) + (fun N => + coarseCaccioppoli_flux_qone_partialBound_of_cubeAverageEnergyControl + Q a s hs0 flux energy N henergy_nonneg henergy_int hfluxCtrl hsumS) + hfull hξ hderiv hGcirc1 hGcircS hBgConst_bound hBgCent_bound + +/-- Compact exact-RHS local Caccioppoli estimate using full-dual Poincare and +the infinite-depth full-circ bounds. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorFullDualFullCirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hB : 0 ≤ B) (hAcirc1 : 0 ≤ Acirc1) (hAcircS : 0 ≤ AcircS) + (hBgConst : 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hξ : ∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => ξ x i)) + (hderiv : ∀ i : Fin d, ∀ z ∈ cubeSet Q, ‖fderiv ℝ (fun x => ξ x i) z‖ ≤ B) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B + ((Fintype.card (Fin d) : ℝ) * C) := by + rcases hfluxEnergy with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + simpa [coarseCaccioppoliFluxEnergyExactRhs] using + abs_cubeAverage_vecDot_scalar_smul_le_split_of_fluxEnergyControl_of_contDiff_component_vector_bound_dualFull_fullCirc + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + (BgConst := coarseCaccioppoliConstantCutoffSize Q u ξ B) + (BgCent := + coarseCaccioppoliCenteredCutoffSize Q s ξ Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) B ((Fintype.card (Fin d) : ℝ) * C)) + hB hs0 hs1 hfluxMem hu hG hξLp hBgConst hBgCent hC hAcirc1 hAcircS + henergy_nonneg henergy_int hfluxCtrl hsum1 hsumS + hfull hξ hderiv hGcirc1 hGcircS + (by rfl) + (by rfl) + +/-- Exact local Caccioppoli estimate on a descendant cube using a parent +quantitative cutoff and the full-dual/full-circ Poincare route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant_vectorFullDualFullCirc + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have hξLp : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure R) := + quantitativeCubeCutoff_memLp_top_gradientField_on_descendant hR η + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorFullDualFullCirc + (Q := R) (a := a) (s := s) (flux := flux) (u := u) (G := G) + (ξ := scalarCutoffGradientField η) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := C) hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hB hAcirc1 hAcircS + hBgConst hBgCent hC hfull + (fun i => contDiff_scalarCutoffGradientField_component η.smooth i) + (quantitativeCubeCutoff_component_fderiv_bound_on_descendant hR η) + hGcirc1 hGcircS + +/-- Support-localized exact-RHS estimate on the contained-descendant branch, +using the full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_cubeSet_subset_vectorFullDualFullCirc + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have havg : + cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy) = + cubeAverage R energy := + cubeAverage_indicator_scaledClosedCubeSet_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := R) ρ energy hsub + have hfluxEnergy_indicator : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((scaledClosedCubeSet Q ρ).indicator energy) := + hfluxEnergy.indicator_scaledClosedCubeSet_of_cubeSet_subset ρ hsub + have hBgCent_indicator : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy))) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + simpa [havg] using hBgCent + have hGcirc1_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * + Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy)) := by + intro i N + simpa [havg] using hGcirc1 i N + have hGcircS_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ + AcircS * + Real.sqrt (cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy)) := by + intro i N + simpa [havg] using hGcircS i N + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_parentQuantitativeCutoff_on_descendant_vectorFullDualFullCirc + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (flux := flux) (u := u) + (G := G) (energy := (scaledClosedCubeSet Q ρ).indicator energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hs0 hs1 hfluxMem hu hG hfluxEnergy_indicator hB hAcirc1 hAcircS hBgConst + hBgCent_indicator hC hfull hGcirc1_indicator hGcircS_indicator + +/-- Buffered support-localized local exact-RHS estimate using the +full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_support_buffer_vectorFullDualFullCirc + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (a : CoeffField d) (s : ℝ) {ρ₁ ρ₂ ρ : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hgap : cubeScaleFactor R ≤ (ρ - ρ₂) * cubeRadius Q) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R (fun x => vecDot (flux x) (u x • scalarCutoffGradientField η x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u (scalarCutoffGradientField η) + ((scaledClosedCubeSet Q ρ).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + by_cases hinter : ∃ y ∈ cubeSet R, y ∈ scaledClosedCubeSet Q ρ₂ + · have hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ := + cubeSet_subset_scaledClosedCubeSet_of_intersects_scaledClosedCubeSet_of_scaleFactor_le_gap + (Q := Q) (R := R) (ρinner := ρ₂) (ρouter := ρ) hgap hinter + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_cubeSet_subset_vectorFullDualFullCirc + (Q := Q) (R := R) (j := j) hR (a := a) (s := s) (ρ := ρ) + (flux := flux) (u := u) (G := G) (energy := energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hsub hs0 hs1 hfluxMem hu hG hfluxEnergy hB hAcirc1 hAcircS hBgConst hBgCent + hC hfull hGcirc1 hGcircS + · have hout : ∀ x ∈ cubeSet R, x ∉ scaledClosedCubeSet Q ρ₂ := by + intro x hxR hxρ₂ + exact hinter ⟨x, hxR, hxρ₂⟩ + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_parentQuantitativeCutoff_on_descendant_of_forall_notMem_scaledClosedCubeSet + (Q := Q) (R := R) (a := a) (s := s) (ρ := ρ) + (flux := flux) (u := u) (energy := energy) (η := η) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + hout hs0 hAcirc1 hAcircS hB + (mul_nonneg (by positivity) hC) + +/-- Exact local Caccioppoli estimate on a cube using the arbitrary-center local +canonical cutoff and the full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_localCanonicalCutoff_on_cube_vectorFullDualFullCirc + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have hξLp : + MeasureTheory.MemLp + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ∞ (normalizedCubeMeasure R) := + coarseCaccioppoliLocalCanonicalFun_memLp_top_gradientField_on_cube + Q R center hinner hinnerOuter + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorFullDualFullCirc + (Q := R) (a := a) (s := s) (flux := flux) (u := u) (G := G) + (ξ := scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := C) hs0 hs1 hfluxMem hu hG hξLp hfluxEnergy hB hAcirc1 hAcircS + hBgConst hBgCent hC hfull + (fun i => + contDiff_scalarCutoffGradientField_component + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) i) + (coarseCaccioppoliLocalCanonicalFun_component_fderiv_bound_on_cubeSet + Q R center hinner hinnerOuter) + hGcirc1 hGcircS + +/-- Local exact-RHS estimate for the arbitrary-center canonical cutoff, with +the RHS energy localized to a larger local cube, on the contained branch of +the full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_cubeSet_subset_vectorFullDualFullCirc + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) + (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + have havg : + cubeAverage R ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) = + cubeAverage R energy := + cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := R) center rho energy hsub + have hfluxEnergy_indicator : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) := + hfluxEnergy.indicator_coarseCaccioppoliLocalClosedCube_of_cubeSet_subset + center rho hsub + have hBgCent_indicator : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS + (Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy))) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + simpa [havg] using hBgCent + have hGcirc1_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * + Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy)) := by + intro i N + simpa [havg] using hGcirc1 i N + have hGcircS_indicator : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ + AcircS * + Real.sqrt + (cubeAverage R + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy)) := by + intro i N + simpa [havg] using hGcircS i N + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_localCanonicalCutoff_on_cube_vectorFullDualFullCirc + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) + (flux := flux) (u := u) (G := G) + (energy := (coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hinner hinnerOuter hs0 hs1 hfluxMem hu hG hfluxEnergy_indicator hB + hAcirc1 hAcircS hBgConst hBgCent_indicator hC hfull hGcirc1_indicator + hGcircS_indicator + +/-- Buffered local exact-RHS estimate for the arbitrary-center canonical +cutoff using the full-dual/full-circ route. -/ +theorem + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_descendant_of_support_buffer_vectorFullDualFullCirc + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (_hR : R ∈ descendantsAtDepth Q j) + (center : Vec d) (a : CoeffField d) (s : ℝ) {rhoInner rhoOuter rho : ℝ} + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hgap : cubeScaleFactor R ≤ (rho - rhoOuter) * (cubeRadius Q / 3)) + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hG : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcirc1 : 0 ≤ Acirc1) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hfull : ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + |cubeAverage R + (fun x => + vecDot (flux x) + (u x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| ≤ + coarseCaccioppoliFluxEnergyExactRhs R a s u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C) := by + by_cases hinter : + ∃ y ∈ cubeSet R, y ∈ coarseCaccioppoliLocalClosedCube Q center rhoOuter + · have hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho := + cubeSet_subset_coarseCaccioppoliLocalClosedCube_of_intersects_of_scaleFactor_le_gap + (Q := Q) (R := R) (center := center) + (rhoInner := rhoOuter) (rhoOuter := rho) hgap hinter + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_cubeSet_subset_vectorFullDualFullCirc + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + hinner hinnerOuter hsub hs0 hs1 hfluxMem hu hG hfluxEnergy hB + hAcirc1 hAcircS hBgConst hBgCent hC hfull hGcirc1 hGcircS + · have hout : + ∀ x ∈ cubeSet R, x ∉ coarseCaccioppoliLocalClosedCube Q center rhoOuter := by + intro x hxR hxrhoOuter + exact hinter ⟨x, hxR, hxrhoOuter⟩ + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_indicator_of_localCanonicalCutoff_on_cube_of_forall_notMem_localClosedCube + (Q := Q) (R := R) (center := center) (a := a) (s := s) + (rhoInner := rhoInner) (rhoOuter := rhoOuter) (rho := rho) + (flux := flux) (u := u) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) + (B := quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (C := (Fintype.card (Fin d) : ℝ) * C) + hinner hinnerOuter hout hs0 hAcirc1 hAcircS hB + (mul_nonneg (by positivity) hC) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalPatchCutoff.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalPatchCutoff.lean new file mode 100644 index 0000000000..3f9cb27b7b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalPatchCutoff.lean @@ -0,0 +1,539 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import Mathlib.Analysis.Calculus.FDeriv.Add + +/-! # Local Patch Cutoff -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Arbitrary-center local cutoffs for coarse Caccioppoli + +The boundary Caccioppoli proof in the notes uses cutoffs on +`(center + rho cu_{m-1}) ∩ cu_m`, with arbitrary patch center `center`. +The older deterministic stack used only cutoffs centered at the parent cube +center. This file reuses the canonical cube cutoff on the origin cube of +scale `Q.scale - 1`, translated to the desired local center. +-/ + +/-- Reference origin cube with the scale of `cu_{m-1}` when `Q` has scale +`m`. -/ +def coarseCaccioppoliLocalReferenceCube {d : ℕ} (Q : TriadicCube d) : + TriadicCube d := + originCube d (Q.scale - 1) + +theorem cubeCenter_coarseCaccioppoliLocalReferenceCube {d : ℕ} + (Q : TriadicCube d) : + cubeCenter (coarseCaccioppoliLocalReferenceCube Q) = 0 := by + ext i + simp [coarseCaccioppoliLocalReferenceCube, cubeCenter, originCube] + +theorem cubeRadius_coarseCaccioppoliLocalReferenceCube {d : ℕ} + (Q : TriadicCube d) : + cubeRadius (coarseCaccioppoliLocalReferenceCube Q) = cubeRadius Q / 3 := by + unfold coarseCaccioppoliLocalReferenceCube cubeRadius cubeScaleFactor originCube + rw [zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0)] + norm_num + ring + +theorem sub_center_mem_scaledClosedCubeSet_localReference_iff {d : ℕ} + (Q : TriadicCube d) (center x : Vec d) (rho : ℝ) : + x - center ∈ scaledClosedCubeSet (coarseCaccioppoliLocalReferenceCube Q) rho ↔ + x ∈ coarseCaccioppoliLocalClosedCube Q center rho := by + constructor + · intro hx i + have hxi := hx i + simpa [scaledClosedCubeSet, coarseCaccioppoliLocalClosedCube, + coarseCaccioppoliLocalPatchRadius, Pi.sub_apply, + cubeCenter_coarseCaccioppoliLocalReferenceCube, + cubeRadius_coarseCaccioppoliLocalReferenceCube] using hxi + · intro hx i + have hxi := hx i + simpa [scaledClosedCubeSet, coarseCaccioppoliLocalClosedCube, + coarseCaccioppoliLocalPatchRadius, Pi.sub_apply, + cubeCenter_coarseCaccioppoliLocalReferenceCube, + cubeRadius_coarseCaccioppoliLocalReferenceCube] using hxi + +theorem sub_center_mem_scaledOpenCubeSet_localReference_iff {d : ℕ} + (Q : TriadicCube d) (center x : Vec d) (rho : ℝ) : + x - center ∈ scaledOpenCubeSet (coarseCaccioppoliLocalReferenceCube Q) rho ↔ + x ∈ coarseCaccioppoliLocalOpenCube Q center rho := by + constructor + · intro hx i + have hxi := hx i + simpa [scaledOpenCubeSet, coarseCaccioppoliLocalOpenCube, + coarseCaccioppoliLocalPatchRadius, Pi.sub_apply, + cubeCenter_coarseCaccioppoliLocalReferenceCube, + cubeRadius_coarseCaccioppoliLocalReferenceCube] using hxi + · intro hx i + have hxi := hx i + simpa [scaledOpenCubeSet, coarseCaccioppoliLocalOpenCube, + coarseCaccioppoliLocalPatchRadius, Pi.sub_apply, + cubeCenter_coarseCaccioppoliLocalReferenceCube, + cubeRadius_coarseCaccioppoliLocalReferenceCube] using hxi + +/-- If a descendant cube touches an inner local cube and is smaller than the +local radial buffer, then it is contained in the outer local cube. -/ +theorem cubeSet_subset_coarseCaccioppoliLocalClosedCube_of_intersects_of_scaleFactor_le_gap + {d : ℕ} {Q R : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hgap : cubeScaleFactor R ≤ (rhoOuter - rhoInner) * (cubeRadius Q / 3)) + (hinter : + ∃ y ∈ cubeSet R, y ∈ coarseCaccioppoliLocalClosedCube Q center rhoInner) : + cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rhoOuter := by + rcases hinter with ⟨y, hyR, hyinner⟩ + intro x hxR i + have hxy_norm : ‖x - y‖ ≤ cubeScaleFactor R := + norm_sub_le_cubeScaleFactor_of_mem_cubeSet R hxR hyR + have hxy_coord : |x i - y i| ≤ cubeScaleFactor R := by + calc + |x i - y i| = ‖(x - y) i‖ := by + simp [Pi.sub_apply, Real.norm_eq_abs] + _ ≤ ‖x - y‖ := norm_le_pi_norm (x - y) i + _ ≤ cubeScaleFactor R := hxy_norm + have htri : + |x i - center i| ≤ |x i - y i| + |y i - center i| := by + have hdecomp : + x i - center i = (x i - y i) + (y i - center i) := by + ring + rw [hdecomp] + exact abs_add_le _ _ + calc + |x i - center i| + ≤ |x i - y i| + |y i - center i| := htri + _ ≤ coarseCaccioppoliLocalPatchRadius Q rhoInner + cubeScaleFactor R := by + linarith [hxy_coord, hyinner i] + _ ≤ coarseCaccioppoliLocalPatchRadius Q rhoInner + + (rhoOuter - rhoInner) * (cubeRadius Q / 3) := by + linarith [hgap] + _ = coarseCaccioppoliLocalPatchRadius Q rhoOuter := by + unfold coarseCaccioppoliLocalPatchRadius + ring + +/-- Canonical local cutoff centered at an arbitrary patch center. -/ +def coarseCaccioppoliLocalCanonicalFun {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rhoInner rhoOuter : ℝ) : Vec d → ℝ := + fun x => + QuantitativeCubeCutoff.canonicalFun + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter (x - center) + +theorem coarseCaccioppoliLocalCanonicalFun_smooth {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + ContDiff ℝ (⊤ : ℕ∞) + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) := by + have hcanonical : + ContDiff ℝ (⊤ : ℕ∞) + (QuantitativeCubeCutoff.canonicalFun + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter) := + QuantitativeCubeCutoff.canonicalFun_smooth + (coarseCaccioppoliLocalReferenceCube Q) hinner hinnerOuter + have hshift : ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => x - center) := + contDiff_id.sub contDiff_const + simpa [coarseCaccioppoliLocalCanonicalFun] using! hcanonical.comp hshift + +theorem coarseCaccioppoliLocalCanonicalFun_nonneg {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rhoInner rhoOuter : ℝ) + (x : Vec d) : + 0 ≤ coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x := + QuantitativeCubeCutoff.canonicalFun_nonneg + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter (x - center) + +theorem coarseCaccioppoliLocalCanonicalFun_le_one {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rhoInner rhoOuter : ℝ) + (x : Vec d) : + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x ≤ 1 := + QuantitativeCubeCutoff.canonicalFun_le_one + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter (x - center) + +theorem coarseCaccioppoliLocalCanonicalFun_hasCompactSupport {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + HasCompactSupport + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) := by + have hbase : + HasCompactSupport + (QuantitativeCubeCutoff.canonicalFun + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter) := + QuantitativeCubeCutoff.canonicalFun_hasCompactSupport + (coarseCaccioppoliLocalReferenceCube Q) hinner hinnerOuter + show + HasCompactSupport + ((QuantitativeCubeCutoff.canonicalFun + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter) ∘ + Homeomorph.subRight center) + simpa [coarseCaccioppoliLocalCanonicalFun, Function.comp] using + hbase.comp_homeomorph (Homeomorph.subRight center) + +/-- Multiplication by the translated local canonical cutoff preserves +parent-cube integrability. -/ +theorem integrableOn_localCanonicalCutoff_mul_of_integrableOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + {energy : Vec d → ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + MeasureTheory.IntegrableOn + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * energy x) + (cubeSet Q) MeasureTheory.volume := by + have hcut_meas : + MeasureTheory.AEStronglyMeasurable + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) + (MeasureTheory.volume.restrict (cubeSet Q)) := + ((coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter).continuous).aestronglyMeasurable + have hcut_bound : + ∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet Q), + ‖coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x‖ ≤ 1 := by + exact Filter.Eventually.of_forall fun x => by + rw [Real.norm_eq_abs] + exact + abs_le.mpr + ⟨by + linarith + [coarseCaccioppoliLocalCanonicalFun_nonneg + Q center rhoInner rhoOuter x], + coarseCaccioppoliLocalCanonicalFun_le_one + Q center rhoInner rhoOuter x⟩ + exact henergy_int.bdd_mul hcut_meas hcut_bound + +theorem coarseCaccioppoliLocalCanonicalFun_eq_one_on_inner {d : ℕ} + {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + {x : Vec d} (hx : x ∈ coarseCaccioppoliLocalClosedCube Q center rhoInner) : + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x = 1 := by + have hxref : + x - center ∈ + scaledClosedCubeSet (coarseCaccioppoliLocalReferenceCube Q) rhoInner := + (sub_center_mem_scaledClosedCubeSet_localReference_iff Q center x rhoInner).2 hx + exact + QuantitativeCubeCutoff.canonicalFun_eq_one_on_inner + hinner hinnerOuter hxref + +/-- The local inner energy is bounded by the translated canonical +cutoff-weighted energy. -/ +theorem coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy + {d : ℕ} (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (energy : Vec d → ℝ) + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hprofile_int : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedCube Q center rhoInner).indicator energy) + (cubeSet Q) MeasureTheory.volume) + (hweighted_int : + MeasureTheory.IntegrableOn + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * energy x) + (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalEnergyProfile Q center rhoInner energy ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * + energy x) := by + unfold coarseCaccioppoliLocalEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q hprofile_int hweighted_int + intro x hxQ + by_cases hxinner : x ∈ coarseCaccioppoliLocalClosedCube Q center rhoInner + · have hη : + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x = 1 := + coarseCaccioppoliLocalCanonicalFun_eq_one_on_inner + hinner hinnerOuter hxinner + simp [Set.indicator_of_mem hxinner, hη] + · have hη_nonneg : + 0 ≤ coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x := + coarseCaccioppoliLocalCanonicalFun_nonneg Q center rhoInner rhoOuter x + rw [Set.indicator_of_notMem hxinner] + exact mul_nonneg hη_nonneg (henergy_nonneg x hxQ) + +/-- Integrability-free local lower bound using the translated canonical +cutoff. -/ +theorem coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy_of_integrable + {d : ℕ} (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (energy : Vec d → ℝ) + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalEnergyProfile Q center rhoInner energy ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * + energy x) := by + exact + coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy + Q center energy hinner hinnerOuter henergy_nonneg + (integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q center rhoInner henergy_int) + (integrableOn_localCanonicalCutoff_mul_of_integrableOn_cubeSet + Q center hinner hinnerOuter henergy_int) + +theorem coarseCaccioppoliLocalCanonicalFun_support_subset_localOpenCube {d : ℕ} + {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + Function.support + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) ⊆ + coarseCaccioppoliLocalOpenCube Q center rhoOuter := by + intro x hx + have hxref : + x - center ∈ + Function.support + (QuantitativeCubeCutoff.canonicalFun + (coarseCaccioppoliLocalReferenceCube Q) rhoInner rhoOuter) := by + simpa [coarseCaccioppoliLocalCanonicalFun] using hx + exact + (sub_center_mem_scaledOpenCubeSet_localReference_iff Q center x rhoOuter).1 + (QuantitativeCubeCutoff.canonicalFun_support_subset hinner hinnerOuter hxref) + +theorem coarseCaccioppoliLocalCanonicalFun_tsupport_subset_localClosedCube {d : ℕ} + {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + tsupport + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) ⊆ + coarseCaccioppoliLocalClosedCube Q center rhoOuter := by + have hsupp : + Function.support + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) ⊆ + coarseCaccioppoliLocalClosedCube Q center rhoOuter := + (coarseCaccioppoliLocalCanonicalFun_support_subset_localOpenCube + hinner hinnerOuter).trans + (coarseCaccioppoliLocalOpenCube_subset_closedCube Q center rhoOuter) + simpa [tsupport] using + closure_minimal hsupp + (isClosed_coarseCaccioppoliLocalClosedCube Q center rhoOuter) + +theorem coarseCaccioppoliLocalCanonicalFun_tsupport_subset_openCubeSet + {d : ℕ} {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hsub : coarseCaccioppoliLocalClosedCube Q center rhoOuter ⊆ openCubeSet Q) : + tsupport + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) ⊆ + openCubeSet Q := + (coarseCaccioppoliLocalCanonicalFun_tsupport_subset_localClosedCube + hinner hinnerOuter).trans hsub + +theorem coarseCaccioppoliLocalClosedCube_subset_localOpenCube_one_of_lt_one + {d : ℕ} {Q : TriadicCube d} {center : Vec d} {rho : ℝ} (hrho : rho < 1) : + coarseCaccioppoliLocalClosedCube Q center rho ⊆ + coarseCaccioppoliLocalOpenCube Q center 1 := by + intro x hx i + have hxi := hx i + have hbase_pos : 0 < cubeRadius Q / 3 := by + exact div_pos (cubeRadius_pos Q) (by norm_num) + have hrad_lt : + coarseCaccioppoliLocalPatchRadius Q rho < + coarseCaccioppoliLocalPatchRadius Q 1 := by + dsimp [coarseCaccioppoliLocalPatchRadius] + exact mul_lt_mul_of_pos_right hrho hbase_pos + exact lt_of_le_of_lt hxi hrad_lt + +theorem support_scalarCutoffGradientField_coarseCaccioppoliLocalCanonicalFun_subset_localClosedCube + {d : ℕ} {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + Function.support + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) ⊆ + coarseCaccioppoliLocalClosedCube Q center rhoOuter := + (support_scalarCutoffGradientField_subset_tsupport + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)).trans + (coarseCaccioppoliLocalCanonicalFun_tsupport_subset_localClosedCube + hinner hinnerOuter) + +theorem scalarCutoffGradientField_coarseCaccioppoliLocalCanonicalFun_eq_zero_of_notMem_localClosedCube + {d : ℕ} {Q : TriadicCube d} {center : Vec d} {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + {x : Vec d} + (hx : x ∉ coarseCaccioppoliLocalClosedCube Q center rhoOuter) : + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x = 0 := by + exact + scalarCutoffGradientField_eq_zero_of_notMem_tsupport + (fun hx_support => + hx + (coarseCaccioppoliLocalCanonicalFun_tsupport_subset_localClosedCube + hinner hinnerOuter hx_support)) + +theorem coarseCaccioppoliLocalCanonicalFun_gradient_bound {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (x : Vec d) : + ‖fderiv ℝ + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x‖ ≤ + quantitativeCubeCutoffGradientConst d / + ((rhoOuter - rhoInner) * (cubeRadius Q / 3)) := by + let Qloc : TriadicCube d := coarseCaccioppoliLocalReferenceCube Q + have hbase : + ‖fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + (x - center)‖ ≤ + quantitativeCubeCutoffGradientConst d / + ((rhoOuter - rhoInner) * cubeRadius Qloc) := + (QuantitativeCubeCutoff.canonical Qloc rhoInner rhoOuter hinner hinnerOuter).gradient_bound + (x - center) + have hshift : + fderiv ℝ (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x = + fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + (x - center) := by + simpa [coarseCaccioppoliLocalCanonicalFun, Qloc] using! + (fderiv_comp_sub (𝕜 := ℝ) + (f := QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + (x := x) center) + rw [hshift] + simpa [Qloc, cubeRadius_coarseCaccioppoliLocalReferenceCube] using hbase + +theorem coarseCaccioppoliLocalCanonicalFun_hessian_bound {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (x : Vec d) : + ‖iteratedFDeriv ℝ 2 + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x‖ ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2) := by + let Qloc : TriadicCube d := coarseCaccioppoliLocalReferenceCube Q + have hbase : + ‖iteratedFDeriv ℝ 2 + (QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + (x - center)‖ ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * cubeRadius Qloc) ^ 2) := + (QuantitativeCubeCutoff.canonical Qloc rhoInner rhoOuter hinner hinnerOuter).hessian_bound + (x - center) + have hshift : + iteratedFDeriv ℝ 2 + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x = + iteratedFDeriv ℝ 2 + (QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + (x - center) := by + simpa [coarseCaccioppoliLocalCanonicalFun, Qloc] using! + (iteratedFDeriv_comp_sub (𝕜 := ℝ) + (f := QuantitativeCubeCutoff.canonicalFun Qloc rhoInner rhoOuter) + 2 center x) + rw [hshift] + simpa [Qloc, cubeRadius_coarseCaccioppoliLocalReferenceCube] using hbase + +theorem coarseCaccioppoliLocalCanonicalFun_memLp_top_gradientField_on_cube + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + MeasureTheory.MemLp + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + ∞ (normalizedCubeMeasure R) := by + refine + memLp_top_scalarCutoffGradientField_of_bound_on_cubeSet + (Q := R) + (η := coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) + (Xi := + quantitativeCubeCutoffGradientConst d / + ((rhoOuter - rhoInner) * (cubeRadius Q / 3))) + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) ?_ + intro z _hz + exact coarseCaccioppoliLocalCanonicalFun_gradient_bound Q center hinner hinnerOuter z + +theorem coarseCaccioppoliLocalCanonicalFun_cubeLpNorm_infty_gradientField_le_on_cube + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) ≤ + quantitativeCubeCutoffGradientConst d / + ((rhoOuter - rhoInner) * (cubeRadius Q / 3)) := by + have hden_nonneg : + 0 ≤ (rhoOuter - rhoInner) * (cubeRadius Q / 3) := by + have hgap_nonneg : 0 ≤ rhoOuter - rhoInner := sub_nonneg.mpr hinnerOuter.le + have hrad_nonneg : 0 ≤ cubeRadius Q / 3 := by + nlinarith [cubeRadius_pos Q] + exact mul_nonneg hgap_nonneg hrad_nonneg + have hconst_nonneg : 0 ≤ quantitativeCubeCutoffGradientConst d := by + unfold quantitativeCubeCutoffGradientConst + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + smoothTransitionProfile.derivBound_nonneg + refine cubeLpNorm_infty_scalarCutoffGradientField_le_of_bound_on_cubeSet R + (hXi := div_nonneg hconst_nonneg hden_nonneg) ?_ + intro z _hz + exact coarseCaccioppoliLocalCanonicalFun_gradient_bound Q center hinner hinnerOuter z + +theorem coarseCaccioppoliLocalCanonicalFun_component_fderiv_bound_on_cubeSet + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + ∀ i : Fin d, ∀ z ∈ cubeSet R, + ‖fderiv ℝ + (fun x => + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x i) z‖ ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2) := by + exact + scalarCutoffGradientField_component_fderiv_bound_on_cubeSet_of_hessian_bound + R + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) + (fun z _hz => + coarseCaccioppoliLocalCanonicalFun_hessian_bound Q center hinner hinnerOuter z) + +theorem CoarseCaccioppoliVectorCutoffControls.of_localCanonicalCutoff_on_cube + {d : ℕ} (Q R : TriadicCube d) (center : Vec d) (s : ℝ) + {rhoInner rhoOuter : ℝ} + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (u : Vec d → ℝ) (G : Vec d → Vec d) (energy : Vec d → ℝ) + {Acirc1 AcircS C : ℝ} + (hB : + 0 ≤ + quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + CoarseCaccioppoliVectorCutoffControls R s u G + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter)) + energy Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / + (((rhoOuter - rhoInner) * (cubeRadius Q / 3)) ^ 2)) + C := by + refine + ⟨hB, hAcircS, hBgConst, hBgCent, hC, hproj, ?_, ?_, hGcirc1, hGcircS⟩ + · intro i + exact + contDiff_scalarCutoffGradientField_component + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) i + · exact + coarseCaccioppoliLocalCanonicalFun_component_fderiv_bound_on_cubeSet + Q R center hinner hinnerOuter + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalizedEnergyProfile.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalizedEnergyProfile.lean new file mode 100644 index 0000000000..a282ee22a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/LocalizedEnergyProfile.lean @@ -0,0 +1,572 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff + +/-! # Localized Energy Profile -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Localized energy profiles for coarse Caccioppoli + +This file starts the Phase 3 `hlower` bridge. The LaTeX proof uses a radius +profile obtained by averaging the energy over the inner scaled cube. The +lemmas here isolate the purely order-theoretic/cutoff part: once `F rho` is +defined as this localized profile, the lower-bound hypothesis follows from +the canonical cutoff being `1` on the inner scaled cube and nonnegative +elsewhere. +-/ + +/-- Localized cube-average energy over the closed scaled inner cube. -/ +def coarseCaccioppoliLocalizedEnergyProfile {d : ℕ} (Q : TriadicCube d) + (ρ : ℝ) (energy : Vec d → ℝ) : ℝ := + cubeAverage Q ((scaledClosedCubeSet Q ρ).indicator energy) + +/-- Indicator localization preserves cube integrability. -/ +theorem integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) {energy : Vec d → ℝ} + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + MeasureTheory.IntegrableOn + ((scaledClosedCubeSet Q ρ).indicator energy) + (cubeSet Q) MeasureTheory.volume := by + exact henergy_int.indicator (isClosed_scaledClosedCubeSet Q ρ).measurableSet + +/-- On a cube contained in the scaled closed cube, the localized indicator has +the same cube average as the original energy density. -/ +theorem cubeAverage_indicator_scaledClosedCubeSet_eq_cubeAverage_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (ρ : ℝ) (energy : Vec d → ℝ) + (hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ) : + cubeAverage R ((scaledClosedCubeSet Q ρ).indicator energy) = + cubeAverage R energy := by + apply cubeAverage_congr_on_cubeSet + intro x hxR + simp [Set.indicator_of_mem (hsub hxR)] + +/-- Flux-energy controls may be localized by an outer indicator on a cube +contained in the localization region. -/ +theorem CoarseCaccioppoliFluxEnergyControls.indicator_scaledClosedCubeSet_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (ρ : ℝ) + {a : CoeffField d} {s : ℝ} {flux : Vec d → Vec d} {energy : Vec d → ℝ} + (hctrl : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hsub : cubeSet R ⊆ scaledClosedCubeSet Q ρ) : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((scaledClosedCubeSet Q ρ).indicator energy) := by + rcases hctrl with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + refine ⟨?_, ?_, ?_, hsum1, hsumS⟩ + · intro x hxR + simpa [Set.indicator_of_mem (hsub hxR)] using henergy_nonneg x hxR + · exact henergy_int.indicator (isClosed_scaledClosedCubeSet Q ρ).measurableSet + · intro n S hS + have hSsub : cubeSet S ⊆ scaledClosedCubeSet Q ρ := + (cubeSet_subset_of_mem_descendantsAtDepth hS).trans hsub + have havg : + cubeAverage S ((scaledClosedCubeSet Q ρ).indicator energy) = + cubeAverage S energy := + cubeAverage_indicator_scaledClosedCubeSet_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := S) ρ energy hSsub + simpa [havg] using hfluxCtrl n S hS + +/-- Multiplication by the canonical cutoff preserves cube integrability. -/ +theorem integrableOn_canonicalCutoff_mul_of_integrableOn_cubeSet {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} {energy : Vec d → ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + MeasureTheory.IntegrableOn + (fun x => QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * energy x) + (cubeSet Q) MeasureTheory.volume := by + have hcut_meas : + MeasureTheory.AEStronglyMeasurable + (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) + (MeasureTheory.volume.restrict (cubeSet Q)) := + (QuantitativeCubeCutoff.canonicalFun_smooth Q hρ₁ hρ₁₂).continuous.aestronglyMeasurable + have hcut_bound : + ∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet Q), + ‖QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x‖ ≤ 1 := by + exact Filter.Eventually.of_forall fun x => by + rw [Real.norm_eq_abs] + exact + abs_le.mpr + ⟨by + linarith [QuantitativeCubeCutoff.canonicalFun_nonneg Q ρ₁ ρ₂ x], + QuantitativeCubeCutoff.canonicalFun_le_one Q ρ₁ ρ₂ x⟩ + exact henergy_int.bdd_mul hcut_meas hcut_bound + +/-- Monotonicity of `cubeAverage` from a pointwise comparison on the cube. -/ +theorem cubeAverage_le_cubeAverage_of_le_on {d : ℕ} (Q : TriadicCube d) + {f g : Vec d → ℝ} + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) + (hg : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hfg : ∀ x ∈ cubeSet Q, f x ≤ g x) : + cubeAverage Q f ≤ cubeAverage Q g := by + have hmono : + ∫ x in cubeSet Q, f x ∂MeasureTheory.volume ≤ + ∫ x in cubeSet Q, g x ∂MeasureTheory.volume := by + exact + MeasureTheory.integral_mono_ae hf hg <| + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall hfg + unfold cubeAverage + exact mul_le_mul_of_nonneg_left hmono (inv_nonneg.mpr (cubeVolume_nonneg Q)) + +/-- Radius of the note's local Caccioppoli patch `x + rho * cu_{m-1}` when the +parent cube has radius `cubeRadius Q`. -/ +def coarseCaccioppoliLocalPatchRadius {d : ℕ} (Q : TriadicCube d) + (rho : ℝ) : ℝ := + rho * (cubeRadius Q / 3) + +/-- Closed local cube used in the boundary Caccioppoli radius profile. Unlike +`scaledClosedCubeSet`, this is centered at the boundary-patch center, not at +the parent cube center, and has base scale one triadic level smaller than the +parent. -/ +def coarseCaccioppoliLocalClosedCube {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rho : ℝ) : Set (Vec d) := + {y | ∀ i, |y i - center i| ≤ coarseCaccioppoliLocalPatchRadius Q rho} + +/-- Open local cube used for support cutoffs in the boundary Caccioppoli +argument. -/ +def coarseCaccioppoliLocalOpenCube {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rho : ℝ) : Set (Vec d) := + {y | ∀ i, |y i - center i| < coarseCaccioppoliLocalPatchRadius Q rho} + +/-- The note-facing local boundary patch: the local cube intersected with the +ambient parent cube. For the normalized parent `cu_0`, this is +`(center + rho cu_{-1}) ∩ cu_0`. -/ +def coarseCaccioppoliLocalClosedPatch {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rho : ℝ) : Set (Vec d) := + openCubeSet Q ∩ coarseCaccioppoliLocalClosedCube Q center rho + +/-- Open version of the local boundary patch. -/ +def coarseCaccioppoliLocalOpenPatch {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rho : ℝ) : Set (Vec d) := + openCubeSet Q ∩ coarseCaccioppoliLocalOpenCube Q center rho + +theorem isClosed_coarseCaccioppoliLocalClosedCube {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + IsClosed (coarseCaccioppoliLocalClosedCube Q center rho) := by + classical + unfold coarseCaccioppoliLocalClosedCube + rw [show + {y : Vec d | ∀ i, |y i - center i| ≤ coarseCaccioppoliLocalPatchRadius Q rho} = + ⋂ i : Fin d, + {y : Vec d | |y i - center i| ≤ coarseCaccioppoliLocalPatchRadius Q rho} by + ext y + simp] + exact isClosed_iInter fun i => + isClosed_Iic.preimage + ((continuous_abs.comp ((continuous_apply i).sub continuous_const))) + +theorem measurableSet_coarseCaccioppoliLocalClosedCube {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + MeasurableSet (coarseCaccioppoliLocalClosedCube Q center rho) := + (isClosed_coarseCaccioppoliLocalClosedCube Q center rho).measurableSet + +theorem measurableSet_coarseCaccioppoliLocalClosedPatch {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + MeasurableSet (coarseCaccioppoliLocalClosedPatch Q center rho) := by + exact + (measurableSet_openCubeSet Q).inter + (measurableSet_coarseCaccioppoliLocalClosedCube Q center rho) + +theorem coarseCaccioppoliLocalClosedPatch_subset_openCubeSet {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + coarseCaccioppoliLocalClosedPatch Q center rho ⊆ openCubeSet Q := by + intro x hx + exact hx.1 + +theorem coarseCaccioppoliLocalOpenCube_subset_closedCube {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + coarseCaccioppoliLocalOpenCube Q center rho ⊆ + coarseCaccioppoliLocalClosedCube Q center rho := by + intro x hx i + exact le_of_lt (hx i) + +theorem coarseCaccioppoliLocalOpenPatch_subset_closedPatch {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) : + coarseCaccioppoliLocalOpenPatch Q center rho ⊆ + coarseCaccioppoliLocalClosedPatch Q center rho := by + intro x hx + exact ⟨hx.1, coarseCaccioppoliLocalOpenCube_subset_closedCube Q center rho hx.2⟩ + +/-- Local-patch cube-average energy profile with the parent-cube normalization +used by the deterministic radius-iteration backbone. -/ +def coarseCaccioppoliLocalEnergyProfile {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (rho : ℝ) (energy : Vec d → ℝ) : ℝ := + cubeAverage Q ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + +/-- Indicator localization to the local closed cube preserves cube +integrability. -/ +theorem integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) (center : Vec d) (rho : ℝ) + {energy : Vec d → ℝ} + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) + (cubeSet Q) MeasureTheory.volume := by + exact + henergy_int.indicator + (measurableSet_coarseCaccioppoliLocalClosedCube Q center rho) + +/-- Indicator localization to the note's local open-parent patch preserves cube +integrability. -/ +theorem integrableOn_indicator_coarseCaccioppoliLocalClosedPatch_of_integrableOn_cubeSet + {d : ℕ} (Q : TriadicCube d) (center : Vec d) (rho : ℝ) + {energy : Vec d → ℝ} + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + MeasureTheory.IntegrableOn + ((coarseCaccioppoliLocalClosedPatch Q center rho).indicator energy) + (cubeSet Q) MeasureTheory.volume := by + exact + henergy_int.indicator + (measurableSet_coarseCaccioppoliLocalClosedPatch Q center rho) + +/-- On a cube contained in the local closed cube, the localized indicator has +the same cube average as the original energy density. -/ +theorem + cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_eq_cubeAverage_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) (rho : ℝ) + (energy : Vec d → ℝ) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho) : + cubeAverage R ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) = + cubeAverage R energy := by + apply cubeAverage_congr_on_cubeSet + intro x hxR + simp [Set.indicator_of_mem (hsub hxR)] + +/-- On a cube contained in the local Caccioppoli patch, the localized indicator +has the same cube average as the original energy density. -/ +theorem + cubeAverage_indicator_coarseCaccioppoliLocalClosedPatch_eq_cubeAverage_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) (rho : ℝ) + (energy : Vec d → ℝ) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedPatch Q center rho) : + cubeAverage R ((coarseCaccioppoliLocalClosedPatch Q center rho).indicator energy) = + cubeAverage R energy := by + apply cubeAverage_congr_on_cubeSet + intro x hxR + simp [Set.indicator_of_mem (hsub hxR)] + +/-- Flux-energy controls may be localized by a local-closed-cube indicator on a +cube contained in the local cube. -/ +theorem + CoarseCaccioppoliFluxEnergyControls.indicator_coarseCaccioppoliLocalClosedCube_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) (rho : ℝ) + {a : CoeffField d} {s : ℝ} {flux : Vec d → Vec d} {energy : Vec d → ℝ} + (hctrl : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedCube Q center rho) : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) := by + rcases hctrl with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + refine ⟨?_, ?_, ?_, hsum1, hsumS⟩ + · intro x hxR + simpa [Set.indicator_of_mem (hsub hxR)] using henergy_nonneg x hxR + · exact + henergy_int.indicator + (measurableSet_coarseCaccioppoliLocalClosedCube Q center rho) + · intro n S hS + have hSsub : cubeSet S ⊆ coarseCaccioppoliLocalClosedCube Q center rho := + (cubeSet_subset_of_mem_descendantsAtDepth hS).trans hsub + have havg : + cubeAverage S + ((coarseCaccioppoliLocalClosedCube Q center rho).indicator energy) = + cubeAverage S energy := + cubeAverage_indicator_coarseCaccioppoliLocalClosedCube_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := S) center rho energy hSsub + simpa [havg] using hfluxCtrl n S hS + +/-- Flux-energy controls may be localized by a local-patch indicator on a cube +contained in the patch. -/ +theorem + CoarseCaccioppoliFluxEnergyControls.indicator_coarseCaccioppoliLocalClosedPatch_of_cubeSet_subset + {d : ℕ} {Q R : TriadicCube d} (center : Vec d) (rho : ℝ) + {a : CoeffField d} {s : ℝ} {flux : Vec d → Vec d} {energy : Vec d → ℝ} + (hctrl : CoarseCaccioppoliFluxEnergyControls R a s flux energy) + (hsub : cubeSet R ⊆ coarseCaccioppoliLocalClosedPatch Q center rho) : + CoarseCaccioppoliFluxEnergyControls R a s flux + ((coarseCaccioppoliLocalClosedPatch Q center rho).indicator energy) := by + rcases hctrl with ⟨henergy_nonneg, henergy_int, hfluxCtrl, hsum1, hsumS⟩ + refine ⟨?_, ?_, ?_, hsum1, hsumS⟩ + · intro x hxR + simpa [Set.indicator_of_mem (hsub hxR)] using henergy_nonneg x hxR + · exact + henergy_int.indicator + (measurableSet_coarseCaccioppoliLocalClosedPatch Q center rho) + · intro n S hS + have hSsub : cubeSet S ⊆ coarseCaccioppoliLocalClosedPatch Q center rho := + (cubeSet_subset_of_mem_descendantsAtDepth hS).trans hsub + have havg : + cubeAverage S + ((coarseCaccioppoliLocalClosedPatch Q center rho).indicator energy) = + cubeAverage S energy := + cubeAverage_indicator_coarseCaccioppoliLocalClosedPatch_eq_cubeAverage_of_cubeSet_subset + (Q := Q) (R := S) center rho energy hSsub + simpa [havg] using hfluxCtrl n S hS + +/-- The local-patch profile is nonnegative when the energy is nonnegative on +the parent cube. -/ +theorem coarseCaccioppoliLocalEnergyProfile_nonneg {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) : + 0 ≤ coarseCaccioppoliLocalEnergyProfile Q center rho energy := by + apply cubeAverage_nonneg_of_nonneg_on (Q := Q) + intro x hxQ + by_cases hxinner : x ∈ coarseCaccioppoliLocalClosedCube Q center rho + · simpa [Set.indicator_of_mem hxinner] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxinner] + +/-- The local-patch profile is bounded above by the full parent-cube average. -/ +theorem coarseCaccioppoliLocalEnergyProfile_le_cubeAverage {d : ℕ} + (Q : TriadicCube d) (center : Vec d) (rho : ℝ) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalEnergyProfile Q center rho energy ≤ cubeAverage Q energy := by + unfold coarseCaccioppoliLocalEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q + (integrableOn_indicator_coarseCaccioppoliLocalClosedCube_of_integrableOn_cubeSet + Q center rho henergy_int) + henergy_int + intro x hxQ + by_cases hxinner : x ∈ coarseCaccioppoliLocalClosedCube Q center rho + · simp [Set.indicator_of_mem hxinner] + · rw [Set.indicator_of_notMem hxinner] + exact henergy_nonneg x hxQ + +/-- Unary radius profile for the note's arbitrary-center local patch. -/ +def coarseCaccioppoliLocalEnergyRadiusProfile {d : ℕ} (Q : TriadicCube d) + (center : Vec d) (energy : Vec d → ℝ) : ℝ → ℝ := + fun rho => coarseCaccioppoliLocalEnergyProfile Q center rho energy + +/-- The arbitrary-center local radius profile supplies the nonnegativity +hypothesis used by radius iteration. -/ +theorem coarseCaccioppoliLocalEnergyRadiusProfile_nonneg {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) : + ∀ ⦃rho : ℝ⦄, (1 / 3 : ℝ) ≤ rho → rho ≤ 1 → + 0 ≤ coarseCaccioppoliLocalEnergyRadiusProfile Q center energy rho := by + intro rho _ _ + exact coarseCaccioppoliLocalEnergyProfile_nonneg Q center rho henergy_nonneg + +/-- The arbitrary-center local radius profile is bounded above by the full +parent-cube energy average. -/ +theorem coarseCaccioppoliLocalEnergyRadiusProfile_boundedAbove {d : ℕ} + (Q : TriadicCube d) (center : Vec d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + CoarseCaccioppoliRadiusBoundedAbove + (coarseCaccioppoliLocalEnergyRadiusProfile Q center energy) := by + refine ⟨cubeAverage Q energy, ?_⟩ + intro rho _ _ + exact + coarseCaccioppoliLocalEnergyProfile_le_cubeAverage + Q center rho henergy_nonneg henergy_int + +/-- The localized inner energy is bounded by the canonical cutoff-weighted +energy. This is the reusable core of the eventual `hlower` discharge. -/ +theorem coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy + {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (energy : Vec d → ℝ) + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (hprofile_int : + MeasureTheory.IntegrableOn + ((scaledClosedCubeSet Q ρ₁).indicator energy) + (cubeSet Q) MeasureTheory.volume) + (hweighted_int : + MeasureTheory.IntegrableOn + (fun x => QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * energy x) + (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalizedEnergyProfile Q ρ₁ energy ≤ + cubeAverage Q + (fun x => QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * energy x) := by + unfold coarseCaccioppoliLocalizedEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q hprofile_int hweighted_int + intro x hxQ + by_cases hxinner : x ∈ scaledClosedCubeSet Q ρ₁ + · have hη : + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x = 1 := + QuantitativeCubeCutoff.canonicalFun_eq_one_on_inner hρ₁ hρ₁₂ hxinner + simp [Set.indicator_of_mem hxinner, hη] + · have hη_nonneg : + 0 ≤ QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x := + QuantitativeCubeCutoff.canonicalFun_nonneg Q ρ₁ ρ₂ x + rw [Set.indicator_of_notMem hxinner] + exact mul_nonneg hη_nonneg (henergy_nonneg x hxQ) + +/-- Integrability-free localized-energy lower bound using the canonical cutoff. -/ +theorem coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy_of_integrable + {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (energy : Vec d → ℝ) + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalizedEnergyProfile Q ρ₁ energy ≤ + cubeAverage Q + (fun x => QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * energy x) := by + exact + coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy + Q energy hρ₁ hρ₁₂ henergy_nonneg + (integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ₁ henergy_int) + (integrableOn_canonicalCutoff_mul_of_integrableOn_cubeSet Q hρ₁ hρ₁₂ henergy_int) + +/-- The localized profile is nonnegative when the energy is nonnegative on +the cube. -/ +theorem coarseCaccioppoliLocalizedEnergyProfile_nonneg {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) : + 0 ≤ coarseCaccioppoliLocalizedEnergyProfile Q ρ energy := by + apply cubeAverage_nonneg_of_nonneg_on (Q := Q) + intro x hxQ + by_cases hxinner : x ∈ scaledClosedCubeSet Q ρ + · simpa [Set.indicator_of_mem hxinner] using henergy_nonneg x hxQ + · simp [Set.indicator_of_notMem hxinner] + +/-- The localized profile is bounded above by the full cube average. -/ +theorem coarseCaccioppoliLocalizedEnergyProfile_le_cubeAverage + {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + coarseCaccioppoliLocalizedEnergyProfile Q ρ energy ≤ cubeAverage Q energy := by + unfold coarseCaccioppoliLocalizedEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q + (integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ henergy_int) + henergy_int + intro x hxQ + by_cases hxinner : x ∈ scaledClosedCubeSet Q ρ + · simp [Set.indicator_of_mem hxinner] + · rw [Set.indicator_of_notMem hxinner] + exact henergy_nonneg x hxQ + +/-- Unary radius profile obtained by localizing a fixed energy density. -/ +def coarseCaccioppoliLocalizedEnergyRadiusProfile {d : ℕ} (Q : TriadicCube d) + (energy : Vec d → ℝ) : ℝ → ℝ := + fun ρ => coarseCaccioppoliLocalizedEnergyProfile Q ρ energy + +/-- The fixed-energy localized radius profile supplies the nonnegativity +hypothesis used by radius iteration. -/ +theorem coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg {d : ℕ} + (Q : TriadicCube d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) : + ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → + 0 ≤ coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy ρ := by + intro ρ _ _ + exact coarseCaccioppoliLocalizedEnergyProfile_nonneg Q ρ henergy_nonneg + +/-- The fixed-energy localized radius profile is bounded above by the full +cube energy average. -/ +theorem coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove {d : ℕ} + (Q : TriadicCube d) {energy : Vec d → ℝ} + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) : + CoarseCaccioppoliRadiusBoundedAbove + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy) := by + refine ⟨cubeAverage Q energy, ?_⟩ + intro ρ _ _ + exact coarseCaccioppoliLocalizedEnergyProfile_le_cubeAverage Q ρ henergy_nonneg henergy_int + +/-- A concrete localized-radius profile control, stated at the exact arity of +the Caccioppoli radius bridge. -/ +def CoarseCaccioppoliLocalizedEnergyProfileLowerControls {d : ℕ} + (Q : TriadicCube d) (F : ℝ → ℝ) (energy : ℝ → ℝ → Vec d → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ coarseCaccioppoliLocalizedEnergyProfile Q ρ₁ (energy ρ₁ ρ₂) + +/-- Localized-radius profile controls produce the exact `hlower` family needed +by the weak-testing bridge. -/ +theorem + CoarseCaccioppoliLocalizedEnergyProfileLowerControls.to_canonicalCutoffLower + {d : ℕ} {Q : TriadicCube d} {F : ℝ → ℝ} + {energy : ℝ → ℝ → Vec d → ℝ} + (hprofile : CoarseCaccioppoliLocalizedEnergyProfileLowerControls Q F energy) + (henergy_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ cubeSet Q, 0 ≤ energy ρ₁ ρ₂ x) + (henergy_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn (energy ρ₁ ρ₂) (cubeSet Q) MeasureTheory.volume) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * energy ρ₁ ρ₂ x) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + (hprofile hρ₁ hlt hρ₂).trans + (coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy_of_integrable + Q (energy ρ₁ ρ₂) + (lt_of_lt_of_le (by norm_num : (0 : ℝ) < 1 / 3) hρ₁) hlt + (henergy_nonneg hρ₁ hlt hρ₂) (henergy_int hρ₁ hlt hρ₂)) + +/-- Build localized lower controls for a fixed radius profile from a +pointwise comparison with the pair-dependent energy on each inner cube. -/ +theorem + CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + {d : ℕ} (Q : TriadicCube d) {baseEnergy : Vec d → ℝ} + {pairEnergy : ℝ → ℝ → Vec d → ℝ} + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hpair_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn (pairEnergy ρ₁ ρ₂) (cubeSet Q) MeasureTheory.volume) + (hpoint : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, baseEnergy x ≤ pairEnergy ρ₁ ρ₂ x) : + CoarseCaccioppoliLocalizedEnergyProfileLowerControls Q + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + pairEnergy := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + unfold coarseCaccioppoliLocalizedEnergyRadiusProfile + unfold coarseCaccioppoliLocalizedEnergyProfile + apply cubeAverage_le_cubeAverage_of_le_on Q + (integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ₁ hbase_int) + (integrableOn_indicator_scaledClosedCubeSet_of_integrableOn_cubeSet Q ρ₁ + (hpair_int hρ₁ hlt hρ₂)) + intro x hxQ + by_cases hxinner : x ∈ scaledClosedCubeSet Q ρ₁ + · simpa [Set.indicator_of_mem hxinner] using + hpoint (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ x hxinner + · simp [Set.indicator_of_notMem hxinner] + +/-- Equality on each inner cube is a convenient way to supply the fixed-profile +lower-control comparison. -/ +theorem + CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_eq_pairEnergy + {d : ℕ} (Q : TriadicCube d) {baseEnergy : Vec d → ℝ} + {pairEnergy : ℝ → ℝ → Vec d → ℝ} + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hpair_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn (pairEnergy ρ₁ ρ₂) (cubeSet Q) MeasureTheory.volume) + (hpoint : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, baseEnergy x = pairEnergy ρ₁ ρ₂ x) : + CoarseCaccioppoliLocalizedEnergyProfileLowerControls Q + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + pairEnergy := by + exact + CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int hpair_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ x hx => + le_of_eq (hpoint (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ x hx)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff.lean new file mode 100644 index 0000000000..14fbfb65b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.NormalizedAndGradient + +/-! # Quantitative Cutoff -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/Basic.lean new file mode 100644 index 0000000000..7f3809c8fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/Basic.lean @@ -0,0 +1,725 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Calculus.ContDiff.Bounds +public import Mathlib.Analysis.Calculus.FDeriv.CompCLM + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- The vector cutoff field used in coarse Caccioppoli, obtained by applying +the scalar cutoff gradient to the coordinate basis vectors. -/ +def scalarCutoffGradientField {d : ℕ} (η : Vec d → ℝ) : Vec d → Vec d := + fun x i => (fderiv ℝ η x) (basisVec i) + +@[simp] theorem scalarCutoffGradientField_apply {d : ℕ} (η : Vec d → ℝ) + (x : Vec d) (i : Fin d) : + scalarCutoffGradientField η x i = (fderiv ℝ η x) (basisVec i) := + rfl + +theorem support_scalarCutoffGradientField_subset_tsupport {d : ℕ} + (η : Vec d → ℝ) : + Function.support (scalarCutoffGradientField η) ⊆ tsupport η := by + intro x hx + exact (support_fderiv_subset (𝕜 := ℝ) (f := η)) <| by + change fderiv ℝ η x ≠ 0 + intro hzero + apply hx + ext i + simp [scalarCutoffGradientField, hzero] + +theorem scalarCutoffGradientField_eq_zero_of_notMem_tsupport {d : ℕ} + {η : Vec d → ℝ} {x : Vec d} (hx : x ∉ tsupport η) : + scalarCutoffGradientField η x = 0 := by + by_contra hnonzero + exact hx (support_scalarCutoffGradientField_subset_tsupport η hnonzero) + +@[simp] theorem norm_basisVec {d : ℕ} (i : Fin d) : + ‖basisVec i‖ = 1 := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases h : j = i + · subst h + simp [basisVec] + · simp [basisVec, h] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +theorem norm_scalarCutoffGradientField_le_fderiv {d : ℕ} (η : Vec d → ℝ) + (x : Vec d) : + ‖scalarCutoffGradientField η x‖ ≤ ‖fderiv ℝ η x‖ := by + refine (pi_norm_le_iff_of_nonneg (norm_nonneg _)).2 ?_ + intro i + calc + ‖scalarCutoffGradientField η x i‖ = ‖(fderiv ℝ η x) (basisVec i)‖ := by + rfl + _ ≤ ‖fderiv ℝ η x‖ * ‖basisVec i‖ := by + simpa using (fderiv ℝ η x).le_opNorm (basisVec i) + _ = ‖fderiv ℝ η x‖ := by simp [norm_basisVec] + +theorem continuous_scalarCutoffGradientField {d : ℕ} {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) : + Continuous (scalarCutoffGradientField η) := by + refine continuous_pi ?_ + intro i + simpa [scalarCutoffGradientField] using + ((hη.continuous_fderiv (by simp)).clm_apply continuous_const) + +theorem contDiff_scalarCutoffGradientField_component {d : ℕ} {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => scalarCutoffGradientField η x i) := by + simpa [scalarCutoffGradientField] using + ((hη.fderiv_right (m := (⊤ : ℕ∞)) (by simp)).clm_apply + (contDiff_const : ContDiff ℝ (⊤ : ℕ∞) (fun _ : Vec d => basisVec i))) + +theorem memLp_top_scalarCutoffGradientField_of_bound_on_cubeSet {d : ℕ} + (Q : TriadicCube d) {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) {Xi : ℝ} + (hgrad : ∀ z ∈ cubeSet Q, ‖fderiv ℝ η z‖ ≤ Xi) : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure Q) := by + have hcont : Continuous (scalarCutoffGradientField η) := + continuous_scalarCutoffGradientField hη + have hbound_ae_cube : + ∀ᵐ x ∂ cubeMeasure Q, ‖scalarCutoffGradientField η x‖ ≤ Xi := by + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => + le_trans (norm_scalarCutoffGradientField_le_fderiv η x) (hgrad x hx) + have hbound_ae : + ∀ᵐ x ∂ normalizedCubeMeasure Q, ‖scalarCutoffGradientField η x‖ ≤ Xi := by + rw [MeasureTheory.ae_iff] + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply] + rw [(MeasureTheory.ae_iff).1 hbound_ae_cube] + simp + exact MeasureTheory.memLp_top_of_bound hcont.aestronglyMeasurable Xi hbound_ae + +theorem cubeLpNorm_infty_scalarCutoffGradientField_le_of_bound_on_cubeSet {d : ℕ} + (Q : TriadicCube d) {η : Vec d → ℝ} {Xi : ℝ} (hXi : 0 ≤ Xi) + (hgrad : ∀ z ∈ cubeSet Q, ‖fderiv ℝ η z‖ ≤ Xi) : + cubeLpNorm Q ∞ (scalarCutoffGradientField η) ≤ Xi := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet Q (hC := hXi) + intro x hx + exact le_trans (norm_scalarCutoffGradientField_le_fderiv η x) (hgrad x hx) + +theorem scaledClosedCubeSet_subset_openCubeSet_of_lt_one {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ_nonneg : 0 ≤ ρ) (hρ_lt_one : ρ < 1) : + scaledClosedCubeSet Q ρ ⊆ openCubeSet Q := by + intro x hx + rw [← ball_cubeCenter_eq_openCubeSet] + have hxball : + x ∈ Metric.closedBall (cubeCenter Q) (ρ * cubeRadius Q) := + scaledClosedCubeSet_subset_metricClosedBall Q hρ_nonneg hx + have hr_lt : ρ * cubeRadius Q < cubeRadius Q := by + have hrad : 0 < cubeRadius Q := cubeRadius_pos Q + nlinarith + exact Metric.closedBall_subset_ball hr_lt hxball + +theorem scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) : + scaledOpenCubeSet Q ρ ⊆ scaledClosedCubeSet Q ρ := by + intro x hx i + exact le_of_lt (hx i) + +private theorem quantitativeCutoff_isOpen_scaledOpenCubeSet {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) : + IsOpen (scaledOpenCubeSet Q ρ) := by + rw [show scaledOpenCubeSet Q ρ = + ⋂ i : Fin d, {x : Vec d | |x i - cubeCenter Q i| < ρ * cubeRadius Q} by + ext x + simp [scaledOpenCubeSet]] + refine isOpen_iInter_of_finite ?_ + intro i + exact isOpen_lt + (continuous_abs.comp ((continuous_apply i).sub continuous_const)) + continuous_const + +private theorem volume_scaledOpenCubeSet_toReal_of_nonneg {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ : 0 ≤ ρ) : + (MeasureTheory.volume (scaledOpenCubeSet Q ρ)).toReal = + (ρ * cubeScaleFactor Q) ^ d := by + let a : Fin d → ℝ := fun i => cubeCenter Q i - ρ * cubeRadius Q + let b : Fin d → ℝ := fun i => cubeCenter Q i + ρ * cubeRadius Q + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith [hρ, cubeRadius_nonneg Q] + rw [show scaledOpenCubeSet Q ρ = + Set.pi Set.univ (fun i : Fin d => Set.Ioo (a i) (b i)) by + ext x + constructor + · intro hx i _hi + have hi := hx i + rw [abs_lt] at hi + constructor <;> dsimp [a, b] <;> linarith + · intro hx i + have hi := hx i (by simp) + rw [abs_lt] + constructor + · dsimp [a, b] at hi + linarith [hi.1] + · dsimp [a, b] at hi + linarith [hi.2]] + have hside : ∀ i : Fin d, b i - a i = ρ * cubeScaleFactor Q := by + intro i + dsimp [a, b] + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ (fun i : Fin d => Set.Ioo (a i) (b i)))).toReal = + ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ioo_toReal (ι := Fin d) hab + _ = (ρ * cubeScaleFactor Q) ^ d := by + calc + ∏ i : Fin d, (b i - a i) = + ∏ _i : Fin d, ρ * cubeScaleFactor Q := by + refine Finset.prod_congr rfl ?_ + intro i _hi + exact hside i + _ = (ρ * cubeScaleFactor Q) ^ d := by + simp + +theorem QuantitativeCubeCutoff.tsupport_subset_scaledClosedCubeSet {d : ℕ} + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + tsupport η ⊆ scaledClosedCubeSet Q ρ₂ := by + have hsupp : + Function.support η ⊆ scaledClosedCubeSet Q ρ₂ := + η.support_subset.trans (scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt Q ρ₂) + simpa [tsupport] using + closure_minimal hsupp (isClosed_scaledClosedCubeSet Q ρ₂) + +theorem QuantitativeCubeCutoff.support_scalarCutoffGradientField_subset_scaledClosedCubeSet {d : ℕ} + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + Function.support (scalarCutoffGradientField (η : Vec d → ℝ)) ⊆ scaledClosedCubeSet Q ρ₂ := + (support_scalarCutoffGradientField_subset_tsupport (η : Vec d → ℝ)).trans + η.tsupport_subset_scaledClosedCubeSet + +theorem QuantitativeCubeCutoff.scalarCutoffGradientField_eq_zero_of_notMem_scaledClosedCubeSet + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {x : Vec d} (hx : x ∉ scaledClosedCubeSet Q ρ₂) : + scalarCutoffGradientField (η : Vec d → ℝ) x = 0 := by + exact scalarCutoffGradientField_eq_zero_of_notMem_tsupport + (fun hx_support => hx (η.tsupport_subset_scaledClosedCubeSet hx_support)) + +/-- A descendant cube that touches a smaller scaled cube is contained in a +larger scaled cube, provided its side length fits in the radial buffer. -/ +theorem cubeSet_subset_scaledClosedCubeSet_of_intersects_scaledClosedCubeSet_of_scaleFactor_le_gap + {d : ℕ} {Q R : TriadicCube d} {ρinner ρouter : ℝ} + (hgap : cubeScaleFactor R ≤ (ρouter - ρinner) * cubeRadius Q) + (hinter : ∃ y ∈ cubeSet R, y ∈ scaledClosedCubeSet Q ρinner) : + cubeSet R ⊆ scaledClosedCubeSet Q ρouter := by + rcases hinter with ⟨y, hyR, hyinner⟩ + intro x hxR i + have hxy_norm : ‖x - y‖ ≤ cubeScaleFactor R := + norm_sub_le_cubeScaleFactor_of_mem_cubeSet R hxR hyR + have hxy_coord : |x i - y i| ≤ cubeScaleFactor R := by + calc + |x i - y i| = ‖(x - y) i‖ := by + simp [Pi.sub_apply, Real.norm_eq_abs] + _ ≤ ‖x - y‖ := norm_le_pi_norm (x - y) i + _ ≤ cubeScaleFactor R := hxy_norm + have htri : + |x i - cubeCenter Q i| ≤ |x i - y i| + |y i - cubeCenter Q i| := by + have hdecomp : + x i - cubeCenter Q i = (x i - y i) + (y i - cubeCenter Q i) := by + ring + rw [hdecomp] + exact abs_add_le _ _ + calc + |x i - cubeCenter Q i| + ≤ |x i - y i| + |y i - cubeCenter Q i| := htri + _ ≤ ρinner * cubeRadius Q + cubeScaleFactor R := by + linarith [hxy_coord, hyinner i] + _ ≤ ρinner * cubeRadius Q + (ρouter - ρinner) * cubeRadius Q := by + linarith [hgap] + _ = ρouter * cubeRadius Q := by ring + +/-- The note's triadic gap scale makes depth-`j` descendants fit inside the +radial buffer, as soon as `j` dominates the chosen scale. -/ +theorem cubeScaleFactor_le_gap_mul_cubeRadius_of_mem_descendantsAtDepth_of_triadicGapScaleChoice + {d : ℕ} {Q R : TriadicCube d} {j k : ℕ} {ρinner ρouter : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρinner ρouter) + (hkj : k ≤ j) : + cubeScaleFactor R ≤ (ρouter - ρinner) * cubeRadius Q := by + have hscale : cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := + cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR + have hQscale : cubeScaleFactor Q = 2 * cubeRadius Q := by + unfold cubeRadius + ring + have hpow_le : (3 : ℝ) ^ k ≤ (3 : ℝ) ^ j := by + exact pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hkj + have hinv_le : ((3 : ℝ) ^ j)⁻¹ ≤ ((3 : ℝ) ^ k)⁻¹ := by + have hpow_pos : 0 < (3 : ℝ) ^ k := by positivity + simpa [one_div] using + (one_div_le_one_div_of_le hpow_pos hpow_le) + have hgap_nonneg : 0 ≤ ρouter - ρinner := by + have hinv_pos : 0 < ((3 : ℝ) ^ k)⁻¹ := by positivity + nlinarith [hchoice.2] + have hsmall : + 2 * ((3 : ℝ) ^ j)⁻¹ ≤ ρouter - ρinner := by + calc + 2 * ((3 : ℝ) ^ j)⁻¹ + ≤ 2 * ((3 : ℝ) ^ k)⁻¹ := by + exact mul_le_mul_of_nonneg_left hinv_le (by norm_num : (0 : ℝ) ≤ 2) + _ ≤ 2 * ((1 / 27 : ℝ) * (ρouter - ρinner)) := by + exact mul_le_mul_of_nonneg_left hchoice.2 (by norm_num : (0 : ℝ) ≤ 2) + _ ≤ ρouter - ρinner := by + nlinarith [hgap_nonneg] + calc + cubeScaleFactor R + = cubeScaleFactor Q / (3 : ℝ) ^ j := hscale + _ = (2 * ((3 : ℝ) ^ j)⁻¹) * cubeRadius Q := by + rw [hQscale] + ring + _ ≤ (ρouter - ρinner) * cubeRadius Q := by + exact mul_le_mul_of_nonneg_right hsmall (cubeRadius_nonneg Q) + +/-- The midpoint cutoff leaves a half-gap buffer, and the note's triadic scale +still makes depth-`j` descendants fit inside that buffer. -/ +theorem cubeScaleFactor_le_buffer_of_mem_descendantsAtDepth_of_triadicGapScaleChoice + {d : ℕ} {Q R : TriadicCube d} {j k : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hkj : k ≤ j) : + cubeScaleFactor R ≤ + (ρ₂ - coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) * cubeRadius Q := by + have hscale : cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := + cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR + have hQscale : cubeScaleFactor Q = 2 * cubeRadius Q := by + unfold cubeRadius + ring + have hpow_le : (3 : ℝ) ^ k ≤ (3 : ℝ) ^ j := by + exact pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hkj + have hinv_le : ((3 : ℝ) ^ j)⁻¹ ≤ ((3 : ℝ) ^ k)⁻¹ := by + have hpow_pos : 0 < (3 : ℝ) ^ k := by positivity + simpa [one_div] using + (one_div_le_one_div_of_le hpow_pos hpow_le) + have hgap_nonneg : 0 ≤ ρ₂ - ρ₁ := by + have hinv_pos : 0 < ((3 : ℝ) ^ k)⁻¹ := by positivity + nlinarith [hchoice.2] + have hsmall : + 2 * ((3 : ℝ) ^ j)⁻¹ ≤ (ρ₂ - ρ₁) / 2 := by + calc + 2 * ((3 : ℝ) ^ j)⁻¹ + ≤ 2 * ((3 : ℝ) ^ k)⁻¹ := by + exact mul_le_mul_of_nonneg_left hinv_le (by norm_num : (0 : ℝ) ≤ 2) + _ ≤ 2 * ((1 / 27 : ℝ) * (ρ₂ - ρ₁)) := by + exact mul_le_mul_of_nonneg_left hchoice.2 (by norm_num : (0 : ℝ) ≤ 2) + _ ≤ (ρ₂ - ρ₁) / 2 := by + nlinarith [hgap_nonneg] + calc + cubeScaleFactor R + = cubeScaleFactor Q / (3 : ℝ) ^ j := hscale + _ = (2 * ((3 : ℝ) ^ j)⁻¹) * cubeRadius Q := by + rw [hQscale] + ring + _ ≤ ((ρ₂ - ρ₁) / 2) * cubeRadius Q := by + exact mul_le_mul_of_nonneg_right hsmall (cubeRadius_nonneg Q) + _ = (ρ₂ - coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) * cubeRadius Q := by + rw [coarseCaccioppoliBufferedCutoffRadius_outer_gap] + +/-- One extra descendant generation fits the midpoint buffer at the +`Q.scale - 1` local-patch scale. -/ +theorem cubeScaleFactor_le_local_buffer_of_mem_descendantsAtDepth_succ_of_triadicGapScaleChoice + {d : ℕ} {Q R : TriadicCube d} {j k : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hkj : k ≤ j) : + cubeScaleFactor R ≤ + (ρ₂ - coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) * (cubeRadius Q / 3) := by + have hscale : cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ (j + 1) := + cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR + have hQscale : cubeScaleFactor Q = 2 * cubeRadius Q := by + unfold cubeRadius + ring + have hpow_le : (3 : ℝ) ^ k ≤ (3 : ℝ) ^ j := by + exact pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hkj + have hinv_le : ((3 : ℝ) ^ j)⁻¹ ≤ ((3 : ℝ) ^ k)⁻¹ := by + have hpow_pos : 0 < (3 : ℝ) ^ k := by positivity + simpa [one_div] using + (one_div_le_one_div_of_le hpow_pos hpow_le) + have hgap_nonneg : 0 ≤ ρ₂ - ρ₁ := by + have hinv_pos : 0 < ((3 : ℝ) ^ k)⁻¹ := by positivity + nlinarith [hchoice.2] + have hsmall : + 2 * ((3 : ℝ) ^ (j + 1))⁻¹ ≤ (ρ₂ - ρ₁) / 6 := by + have hpow_succ : + ((3 : ℝ) ^ (j + 1))⁻¹ = (3 : ℝ)⁻¹ * ((3 : ℝ) ^ j)⁻¹ := by + rw [pow_succ'] + field_simp + rw [hpow_succ] + calc + 2 * ((3 : ℝ)⁻¹ * ((3 : ℝ) ^ j)⁻¹) + = (2 * ((3 : ℝ) ^ j)⁻¹) / 3 := by ring + _ ≤ (2 * ((3 : ℝ) ^ k)⁻¹) / 3 := by + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left hinv_le (by norm_num : (0 : ℝ) ≤ 2)) + (by norm_num : (0 : ℝ) ≤ 3) + _ ≤ (2 * ((1 / 27 : ℝ) * (ρ₂ - ρ₁))) / 3 := by + exact div_le_div_of_nonneg_right + (mul_le_mul_of_nonneg_left hchoice.2 (by norm_num : (0 : ℝ) ≤ 2)) + (by norm_num : (0 : ℝ) ≤ 3) + _ ≤ (ρ₂ - ρ₁) / 6 := by + nlinarith [hgap_nonneg] + calc + cubeScaleFactor R + = cubeScaleFactor Q / (3 : ℝ) ^ (j + 1) := hscale + _ = (2 * ((3 : ℝ) ^ (j + 1))⁻¹) * cubeRadius Q := by + rw [hQscale] + ring + _ ≤ ((ρ₂ - ρ₁) / 6) * cubeRadius Q := by + exact mul_le_mul_of_nonneg_right hsmall (cubeRadius_nonneg Q) + _ = (ρ₂ - coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) * + (cubeRadius Q / 3) := by + rw [coarseCaccioppoliBufferedCutoffRadius_outer_gap] + ring + +theorem QuantitativeCubeCutoff.tsupport_subset_openCubeSet_of_lt_one {d : ℕ} + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hρ₂_nonneg : 0 ≤ ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + tsupport η ⊆ openCubeSet Q := by + exact (η.tsupport_subset_scaledClosedCubeSet).trans <| + scaledClosedCubeSet_subset_openCubeSet_of_lt_one Q hρ₂_nonneg hρ₂_lt_one + +theorem QuantitativeCubeCutoff.support_scalarCutoffGradientField_subset_openCubeSet_of_lt_one + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hρ₂_nonneg : 0 ≤ ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + Function.support (scalarCutoffGradientField (η : Vec d → ℝ)) ⊆ openCubeSet Q := + (support_scalarCutoffGradientField_subset_tsupport (η : Vec d → ℝ)).trans + (η.tsupport_subset_openCubeSet_of_lt_one hρ₂_nonneg hρ₂_lt_one) + +theorem QuantitativeCubeCutoff.scalarCutoffGradientField_eq_zero_of_notMem_openCubeSet_of_lt_one + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hρ₂_nonneg : 0 ≤ ρ₂) (hρ₂_lt_one : ρ₂ < 1) {x : Vec d} + (hx : x ∉ openCubeSet Q) : + scalarCutoffGradientField (η : Vec d → ℝ) x = 0 := by + exact scalarCutoffGradientField_eq_zero_of_notMem_tsupport + (fun hx_support => hx (η.tsupport_subset_openCubeSet_of_lt_one + hρ₂_nonneg hρ₂_lt_one hx_support)) + +theorem quantitativeCubeCutoff_canonicalFun_tsupport_subset_openCubeSet {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + tsupport (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) ⊆ openCubeSet Q := by + have htsupport : + tsupport (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) ⊆ scaledClosedCubeSet Q ρ₂ := by + simpa [QuantitativeCubeCutoff.canonicalFun] using + (QuantitativeTransitionProfile.cubeCutoff_tsupport_subset_scaledClosedCubeSet + smoothTransitionProfile.quantitativeProfile (Q := Q) hρ₁ hρ₁₂) + exact htsupport.trans <| + scaledClosedCubeSet_subset_openCubeSet_of_lt_one Q + (le_of_lt (lt_trans hρ₁ hρ₁₂)) hρ₂_lt_one + +/-- Canonical cube cutoff packaged as an `H10` test function on `openCubeSet Q` +whenever the outer cutoff radius stays strictly inside the cube. -/ +noncomputable def quantitativeCubeCutoffCanonicalH10 {d : ℕ} + (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + H10Function (openCubeSet Q) := + H10Function.ofContDiff (isOpen_openCubeSet Q) + (QuantitativeCubeCutoff.canonicalFun_smooth Q hρ₁ hρ₁₂) + (QuantitativeCubeCutoff.canonicalFun_hasCompactSupport Q hρ₁ hρ₁₂) + (quantitativeCubeCutoff_canonicalFun_tsupport_subset_openCubeSet Q hρ₁ hρ₁₂ hρ₂_lt_one) + +theorem cubeAverage_quantitativeCubeCutoff_canonicalFun_pos + {d : ℕ} (Q : TriadicCube d) : + 0 < cubeAverage Q + (QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ)) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hη_compact : HasCompactSupport η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_hasCompactSupport Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hη_int : MeasureTheory.IntegrableOn η (cubeSet Q) MeasureTheory.volume := + (hη_smooth.continuous.integrable_of_hasCompactSupport hη_compact).integrableOn + have hnonneg : 0 ≤ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] η := by + exact Filter.Eventually.of_forall fun x => by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + have hscaled_subset : + scaledOpenCubeSet Q (1 / 2 : ℝ) ⊆ Function.support η ∩ cubeSet Q := by + intro x hx + refine ⟨?_, ?_⟩ + · have hxclosed : x ∈ scaledClosedCubeSet Q (1 / 2 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt Q (1 / 2 : ℝ) hx + have hone : η x = 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_eq_one_on_inner + (Q := Q) (ρ₁ := (1 / 2 : ℝ)) (ρ₂ := (3 / 4 : ℝ)) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) hxclosed + simp [Function.support, hone] + · have hxclosed : x ∈ scaledClosedCubeSet Q (1 / 2 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt Q (1 / 2 : ℝ) hx + have hxopen : x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_lt_one Q + (by norm_num : (0 : ℝ) ≤ 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 1) hxclosed + exact openCubeSet_subset_cubeSet Q hxopen + have hscaled_nonempty : (scaledOpenCubeSet Q (1 / 2 : ℝ)).Nonempty := by + refine ⟨cubeCenter Q, ?_⟩ + intro i + have hpos : 0 < (1 / 2 : ℝ) * cubeRadius Q := by + nlinarith [cubeRadius_pos Q] + simpa using hpos + have hscaled_pos : 0 < MeasureTheory.volume (scaledOpenCubeSet Q (1 / 2 : ℝ)) := + (quantitativeCutoff_isOpen_scaledOpenCubeSet Q (1 / 2 : ℝ)).measure_pos + MeasureTheory.volume hscaled_nonempty + have hsupport_pos : 0 < MeasureTheory.volume (Function.support η ∩ cubeSet Q) := + lt_of_lt_of_le hscaled_pos (MeasureTheory.measure_mono hscaled_subset) + have hint_pos : 0 < ∫ x in cubeSet Q, η x ∂MeasureTheory.volume := + (MeasureTheory.setIntegral_pos_iff_support_of_nonneg_ae hnonneg hη_int).2 hsupport_pos + unfold cubeAverage + exact mul_pos (inv_pos.mpr (cubeVolume_pos Q)) hint_pos + +/-- The canonical cutoff has a dimension-only lower average: it is identically +one on the concentric half cube. -/ +theorem half_pow_card_le_cubeAverage_quantitativeCubeCutoff_canonicalFun + {d : ℕ} (Q : TriadicCube d) : + (1 / 2 : ℝ) ^ d ≤ + cubeAverage Q + (QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ)) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let S : Set (Vec d) := scaledOpenCubeSet Q (1 / 2 : ℝ) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hη_compact : HasCompactSupport η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_hasCompactSupport Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hη_int : MeasureTheory.IntegrableOn η (cubeSet Q) MeasureTheory.volume := + (hη_smooth.continuous.integrable_of_hasCompactSupport hη_compact).integrableOn + have hS_meas : MeasurableSet S := + (quantitativeCutoff_isOpen_scaledOpenCubeSet Q (1 / 2 : ℝ)).measurableSet + have hS_sub : S ⊆ cubeSet Q := by + intro x hx + have hxclosed : x ∈ scaledClosedCubeSet Q (1 / 2 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt Q (1 / 2 : ℝ) hx + have hxopen : x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_lt_one Q + (by norm_num : (0 : ℝ) ≤ 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 1) hxclosed + exact openCubeSet_subset_cubeSet Q hxopen + have hS_int : + MeasureTheory.IntegrableOn (S.indicator (fun _ : Vec d => (1 : ℝ))) + (cubeSet Q) MeasureTheory.volume := by + have hconst : + MeasureTheory.IntegrableOn (fun _ : Vec d => (1 : ℝ)) + (cubeSet Q) MeasureTheory.volume := + MeasureTheory.integrableOn_const + (μ := MeasureTheory.volume) (s := cubeSet Q) (C := (1 : ℝ)) + (volume_cubeSet_lt_top Q).ne + exact hconst.indicator hS_meas + have hpoint : + ∀ x ∈ cubeSet Q, + S.indicator (fun _ : Vec d => (1 : ℝ)) x ≤ η x := by + intro x _hxQ + by_cases hxS : x ∈ S + · have hxclosed : x ∈ scaledClosedCubeSet Q (1 / 2 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet_of_coord_lt Q (1 / 2 : ℝ) hxS + have hone : η x = 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_eq_one_on_inner + (Q := Q) (ρ₁ := (1 / 2 : ℝ)) (ρ₂ := (3 / 4 : ℝ)) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) hxclosed + simp [Set.indicator_of_mem hxS, hone] + · have hnonneg : 0 ≤ η x := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + simpa [Set.indicator_of_notMem hxS] using hnonneg + have hmono : + ∫ x in cubeSet Q, S.indicator (fun _ : Vec d => (1 : ℝ)) x ∂MeasureTheory.volume + ≤ ∫ x in cubeSet Q, η x ∂MeasureTheory.volume := + MeasureTheory.setIntegral_mono_on hS_int hη_int (measurableSet_cubeSet Q) hpoint + have hleft_eq : + ∫ x in cubeSet Q, S.indicator (fun _ : Vec d => (1 : ℝ)) x ∂MeasureTheory.volume = + (MeasureTheory.volume S).toReal := by + rw [MeasureTheory.setIntegral_indicator hS_meas] + have hinter : cubeSet Q ∩ S = S := Set.inter_eq_right.mpr hS_sub + rw [hinter] + simp [MeasureTheory.measureReal_def] + have hS_vol : + (MeasureTheory.volume S).toReal = + ((1 / 2 : ℝ) * cubeScaleFactor Q) ^ d := by + simpa [S] using + volume_scaledOpenCubeSet_toReal_of_nonneg Q + (by norm_num : (0 : ℝ) ≤ 1 / 2) + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hratio : + (cubeVolume Q)⁻¹ * ((1 / 2 : ℝ) * cubeScaleFactor Q) ^ d = + (1 / 2 : ℝ) ^ d := by + have hpow_ne : cubeScaleFactor Q ^ d ≠ 0 := + pow_ne_zero d hscale_pos.ne' + simp [cubeVolume, mul_pow] + field_simp [hpow_ne] + unfold cubeAverage + calc + (1 / 2 : ℝ) ^ d = + (cubeVolume Q)⁻¹ * + ((1 / 2 : ℝ) * cubeScaleFactor Q) ^ d := hratio.symm + _ = + (cubeVolume Q)⁻¹ * (MeasureTheory.volume S).toReal := by + rw [hS_vol] + _ = + (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, + S.indicator (fun _ : Vec d => (1 : ℝ)) x ∂MeasureTheory.volume := by + rw [hleft_eq] + _ ≤ + (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, η x ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hmono (inv_nonneg.mpr (cubeVolume_pos Q).le) + +/-- The inverse average of the canonical cutoff is bounded by a +dimension-only constant. -/ +theorem inv_cubeAverage_quantitativeCubeCutoff_canonicalFun_le_two_pow_card + {d : ℕ} (Q : TriadicCube d) : + (cubeAverage Q + (QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ)))⁻¹ ≤ + (2 : ℝ) ^ d := by + let A : ℝ := + cubeAverage Q + (QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ)) + have hApos : 0 < A := by + simpa [A] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hhalf_pos : 0 < (1 / 2 : ℝ) ^ d := by positivity + have hle : (1 / 2 : ℝ) ^ d ≤ A := by + simpa [A] using half_pow_card_le_cubeAverage_quantitativeCubeCutoff_canonicalFun Q + have hinv : + A⁻¹ ≤ ((1 / 2 : ℝ) ^ d)⁻¹ := + by simpa [one_div] using one_div_le_one_div_of_le hhalf_pos hle + have hpow : + ((1 / 2 : ℝ) ^ d)⁻¹ = (2 : ℝ) ^ d := by + calc + ((1 / 2 : ℝ) ^ d)⁻¹ = ((1 / 2 : ℝ)⁻¹) ^ d := by + rw [inv_pow] + _ = (2 : ℝ) ^ d := by norm_num + simpa [A, hpow] using hinv + +theorem cubeAverage_normalized_quantitativeCubeCutoff_canonicalFun_eq_one + {d : ℕ} (Q : TriadicCube d) : + cubeAverage Q (fun x => + (cubeAverage Q (QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ)))⁻¹ * + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) x) = 1 := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + change cubeAverage Q (fun x => A⁻¹ * η x) = 1 + unfold cubeAverage + rw [MeasureTheory.integral_const_mul] + calc + (cubeVolume Q)⁻¹ * (A⁻¹ * ∫ (x : Vec d) in cubeSet Q, η x ∂MeasureTheory.volume) + = A⁻¹ * + ((cubeVolume Q)⁻¹ * ∫ (x : Vec d) in cubeSet Q, η x ∂MeasureTheory.volume) := by + ring + _ = A⁻¹ * A := by rfl + _ = 1 := inv_mul_cancel₀ hpos.ne.symm + +theorem normalized_quantitativeCubeCutoff_canonicalFun_basic_controls + {d : ℕ} (Q : TriadicCube d) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + cubeAverage Q φ = 1 ∧ + MeasureTheory.AEStronglyMeasurable φ (volumeMeasureOn (cubeSet Q)) ∧ + (∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ (cubeAverage Q η)⁻¹) ∧ + ContDiff ℝ (⊤ : ℕ∞) φ ∧ + HasCompactSupport φ ∧ + tsupport φ ⊆ openCubeSet Q := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hη_compact : HasCompactSupport η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_hasCompactSupport Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ, smul_eq_mul] using hη_smooth.const_smul A⁻¹ + have hφ_compact : HasCompactSupport φ := by + have hmul : HasCompactSupport ((fun _ : Vec d => A⁻¹) * η) := hη_compact.mul_left + simpa [φ, Pi.mul_apply] using! hmul + have hφ_tsupport_subset : tsupport φ ⊆ tsupport η := by + have hsupp : Function.support φ ⊆ tsupport η := by + intro x hx + have hηx : η x ≠ 0 := by + intro hzero + apply hx + simp [φ, hzero] + exact subset_closure hηx + simpa [tsupport] using closure_minimal hsupp (isClosed_tsupport η) + have hη_tsupport_subset : tsupport η ⊆ openCubeSet Q := by + simpa [η] using + quantitativeCubeCutoff_canonicalFun_tsupport_subset_openCubeSet Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + (by norm_num : (3 / 4 : ℝ) < 1) + have hbound : ∀ᵐ x ∂ volumeMeasureOn (cubeSet Q), ‖φ x‖ ≤ A⁻¹ := by + refine Filter.Eventually.of_forall ?_ + intro x + have hA_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr (le_of_lt hpos) + have hη_nonneg : 0 ≤ η x := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + have hη_le : η x ≤ 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_le_one Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + calc + ‖φ x‖ = ‖A⁻¹‖ * ‖η x‖ := by simp [φ, norm_mul] + _ = A⁻¹ * η x := by + rw [Real.norm_eq_abs, abs_of_nonneg hA_nonneg, + Real.norm_eq_abs, abs_of_nonneg hη_nonneg] + _ ≤ A⁻¹ * 1 := mul_le_mul_of_nonneg_left hη_le hA_nonneg + _ = A⁻¹ := by ring + have hmean : cubeAverage Q φ = 1 := by + simpa [φ, A, η] using cubeAverage_normalized_quantitativeCubeCutoff_canonicalFun_eq_one Q + refine ⟨hmean, ?_, hbound, hφ_smooth, hφ_compact, ?_⟩ + · exact hφ_smooth.continuous.aestronglyMeasurable + · exact hφ_tsupport_subset.trans hη_tsupport_subset + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/NormalizedAndGradient.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/NormalizedAndGradient.lean new file mode 100644 index 0000000000..00c404b9a5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/QuantitativeCutoff/NormalizedAndGradient.lean @@ -0,0 +1,707 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Bounds +public import Mathlib.Analysis.Calculus.FDeriv.CompCLM + +/-! # Normalized And Gradient -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +theorem normalized_quantitativeCubeCutoff_canonicalFun_descendant_average_oscillation_controls + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + let B : ℝ := (cubeAverage Q η)⁻¹ + let D : ℝ := B * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) + (∀ R ∈ descendantsAtDepth Q j, |1 - cubeAverage R φ| ≤ 1 + B) ∧ + (∀ R ∈ descendantsAtDepth Q j, + ∀ᵐ x ∂ volumeMeasureOn (cubeSet R), + |cubeAverage R φ - φ x| ≤ cubeScaleFactor R * D) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + let B : ℝ := A⁻¹ + let rawD : ℝ := + quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) + let D : ℝ := B * rawD + let ηq : QuantitativeCubeCutoff Q (1 / 2 : ℝ) (3 / 4 : ℝ) := + QuantitativeCubeCutoff.canonical Q (1 / 2 : ℝ) (3 / 4 : ℝ) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact inv_nonneg.mpr (le_of_lt hpos) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ, B, smul_eq_mul] using hη_smooth.const_smul B + have hφ_eq : φ = B • η := by + funext x + simp [φ, B] + have hrawD_nonneg : 0 ≤ rawD := by + exact le_trans (norm_nonneg _) (by + simpa [rawD, ηq, QuantitativeCubeCutoff.canonical] using + ηq.gradient_bound (cubeCenter Q)) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact mul_nonneg hB_nonneg hrawD_nonneg + have hpoint_bound : ∀ x, ‖φ x‖ ≤ B := by + intro x + have hη_nonneg : 0 ≤ η x := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + have hη_le : η x ≤ 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_le_one Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + calc + ‖φ x‖ = ‖B‖ * ‖η x‖ := by simp [φ, B, norm_mul] + _ = B * η x := by + rw [Real.norm_eq_abs, abs_of_nonneg hB_nonneg, + Real.norm_eq_abs, abs_of_nonneg hη_nonneg] + _ ≤ B * 1 := mul_le_mul_of_nonneg_left hη_le hB_nonneg + _ = B := by ring + have hφ_mem_top : ∀ R : TriadicCube d, + MeasureTheory.MemLp φ ∞ (normalizedCubeMeasure R) := by + intro R + exact MeasureTheory.memLp_top_of_bound hφ_smooth.continuous.aestronglyMeasurable B + (Filter.Eventually.of_forall hpoint_bound) + have hderiv : ∀ z : Vec d, ‖fderiv ℝ φ z‖ ≤ D := by + intro z + have hraw : ‖fderiv ℝ η z‖ ≤ rawD := by + simpa [η, rawD, ηq, QuantitativeCubeCutoff.canonical] using ηq.gradient_bound z + rw [hφ_eq] + rw [fderiv_const_smul_field (𝕜 := ℝ) (f := η) B] + calc + ‖B • fderiv ℝ η z‖ = ‖B‖ * ‖fderiv ℝ η z‖ := by rw [norm_smul] + _ = B * ‖fderiv ℝ η z‖ := by rw [Real.norm_eq_abs, abs_of_nonneg hB_nonneg] + _ ≤ B * rawD := mul_le_mul_of_nonneg_left hraw hB_nonneg + _ = D := by rfl + refine ⟨?_, ?_⟩ + · intro R _hR + have hlinfty : cubeLpNorm R ∞ φ ≤ B := by + exact cubeLpNorm_infty_le_of_bound_on_cubeSet R φ hB_nonneg + (fun x hx => hpoint_bound x) + have havg_norm : ‖cubeAverage R φ‖ ≤ B := by + exact (norm_cubeAverage_le_cubeLpNorm_infty R φ (hφ_mem_top R)).trans hlinfty + have htri : |1 - cubeAverage R φ| ≤ 1 + |cubeAverage R φ| := by + simpa [Real.norm_eq_abs] using norm_sub_le (1 : ℝ) (cubeAverage R φ) + have havg_abs : |cubeAverage R φ| ≤ B := by + simpa [Real.norm_eq_abs] using havg_norm + have hsum : 1 + |cubeAverage R φ| ≤ 1 + B := by linarith + exact htri.trans hsum + · intro R _hR + have hpoint : ∀ x ∈ cubeSet R, + |cubeAverage R φ - φ x| ≤ cubeScaleFactor R * D := by + intro x hx + have havg : + ‖φ x - cubeAverage R φ‖ ≤ cubeLpNorm R ∞ (fun y => φ y - φ x) := + norm_sub_cubeAverage_le_cubeLpNorm_infty_sub_const R φ x (hφ_mem_top R) + have hlinfty : + cubeLpNorm R ∞ (fun y => φ y - φ x) ≤ cubeScaleFactor R * D := by + apply cubeLpNorm_infty_le_of_bound_on_cubeSet R + · exact mul_nonneg (cubeScaleFactor_nonneg R) hD_nonneg + · intro y hy + simpa [norm_sub_rev] using + norm_sub_le_cubeScaleFactor_mul_of_contDiff_bound R hφ_smooth hD_nonneg + (fun z hz => hderiv z) hy hx + have hnorm : ‖φ x - cubeAverage R φ‖ ≤ cubeScaleFactor R * D := havg.trans hlinfty + simpa [Real.norm_eq_abs, abs_sub_comm] using hnorm + simpa [volumeMeasureOn, φ, D, B, rawD, A, η] using + (MeasureTheory.ae_restrict_iff' (μ := MeasureTheory.volume) (measurableSet_cubeSet R)).2 + (Filter.Eventually.of_forall hpoint) + +theorem cubeBesovDualTestNorm_normalized_quantitativeCubeCutoff_canonicalFun_le + {d : ℕ} (Q : TriadicCube d) {r : ℝ} (hr_le_one : r ≤ 1) (N : ℕ) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + let B : ℝ := (cubeAverage Q η)⁻¹ + let D : ℝ := B * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) + cubeBesovDualTestNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ + cubeBesovScaleWeight r Q * (cubeScaleFactor Q * D + B) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + let B : ℝ := A⁻¹ + let rawD : ℝ := + quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) + let D : ℝ := B * rawD + let ηq : QuantitativeCubeCutoff Q (1 / 2 : ℝ) (3 / 4 : ℝ) := + QuantitativeCubeCutoff.canonical Q (1 / 2 : ℝ) (3 / 4 : ℝ) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact inv_nonneg.mpr (le_of_lt hpos) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ, B, smul_eq_mul] using hη_smooth.const_smul B + have hφ_eq : φ = B • η := by + funext x + simp [φ, B] + have hrawD_nonneg : 0 ≤ rawD := by + exact le_trans (norm_nonneg _) (by + simpa [rawD, ηq, QuantitativeCubeCutoff.canonical] using + ηq.gradient_bound (cubeCenter Q)) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact mul_nonneg hB_nonneg hrawD_nonneg + have hpoint_bound : ∀ x, ‖φ x‖ ≤ B := by + intro x + have hη_nonneg : 0 ≤ η x := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + have hη_le : η x ≤ 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_le_one Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + calc + ‖φ x‖ = ‖B‖ * ‖η x‖ := by simp [φ, B, norm_mul] + _ = B * η x := by + rw [Real.norm_eq_abs, abs_of_nonneg hB_nonneg, + Real.norm_eq_abs, abs_of_nonneg hη_nonneg] + _ ≤ B * 1 := mul_le_mul_of_nonneg_left hη_le hB_nonneg + _ = B := by ring + have hφ_mem_top : MeasureTheory.MemLp φ ∞ (normalizedCubeMeasure Q) := + MeasureTheory.memLp_top_of_bound hφ_smooth.continuous.aestronglyMeasurable B + (Filter.Eventually.of_forall hpoint_bound) + have hlinfty : cubeLpNorm Q ∞ φ ≤ B := + cubeLpNorm_infty_le_of_bound_on_cubeSet Q φ hB_nonneg + (fun x hx => hpoint_bound x) + have hderiv : ∀ z ∈ cubeSet Q, ‖fderiv ℝ φ z‖ ≤ D := by + intro z hz + have hraw : ‖fderiv ℝ η z‖ ≤ rawD := by + simpa [η, rawD, ηq, QuantitativeCubeCutoff.canonical] using ηq.gradient_bound z + rw [hφ_eq] + rw [fderiv_const_smul_field (𝕜 := ℝ) (f := η) B] + calc + ‖B • fderiv ℝ η z‖ = ‖B‖ * ‖fderiv ℝ η z‖ := by rw [norm_smul] + _ = B * ‖fderiv ℝ η z‖ := by rw [Real.norm_eq_abs, abs_of_nonneg hB_nonneg] + _ ≤ B * rawD := mul_le_mul_of_nonneg_left hraw hB_nonneg + _ = D := by rfl + calc + cubeBesovDualTestNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ + ≤ cubeBesovScaleWeight r Q * (cubeScaleFactor Q * D + cubeLpNorm Q ∞ φ) := by + exact cubeBesovDualTestNorm_two_one_le_scaleWeight_mul_of_contDiff_bound_of_le_one + Q φ N hr_le_one hD_nonneg hφ_mem_top hφ_smooth hderiv + _ ≤ cubeBesovScaleWeight r Q * (cubeScaleFactor Q * D + B) := by + have hsum : cubeScaleFactor Q * D + cubeLpNorm Q ∞ φ ≤ cubeScaleFactor Q * D + B := by + linarith + exact mul_le_mul_of_nonneg_left hsum (cubeBesovScaleWeight_nonneg r Q) + +theorem cubeBesovDualLocalMemLpGlobal_normalized_quantitativeCubeCutoff_canonicalFun + {d : ℕ} (Q : TriadicCube d) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + let B : ℝ := A⁻¹ + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact inv_nonneg.mpr (le_of_lt hpos) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ, B, smul_eq_mul] using hη_smooth.const_smul B + have hpoint_bound : ∀ x, ‖φ x‖ ≤ B := by + intro x + have hη_nonneg : 0 ≤ η x := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_nonneg Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + have hη_le : η x ≤ 1 := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_le_one Q (1 / 2 : ℝ) (3 / 4 : ℝ) x + calc + ‖φ x‖ = ‖B‖ * ‖η x‖ := by simp [φ, B, norm_mul] + _ = B * η x := by + rw [Real.norm_eq_abs, abs_of_nonneg hB_nonneg, + Real.norm_eq_abs, abs_of_nonneg hη_nonneg] + _ ≤ B * 1 := mul_le_mul_of_nonneg_left hη_le hB_nonneg + _ = B := by ring + have hφ_mem_top : ∀ R : TriadicCube d, + MeasureTheory.MemLp φ ∞ (normalizedCubeMeasure R) := by + intro R + exact MeasureTheory.memLp_top_of_bound hφ_smooth.continuous.aestronglyMeasurable B + (Filter.Eventually.of_forall hpoint_bound) + change CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ + intro j R hR + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + rw [hconj] + exact ((hφ_mem_top R).mono_exponent (by norm_num : (2 : ℝ≥0∞) ≤ ∞)).sub + (MeasureTheory.memLp_const (cubeAverage R φ)) + +theorem fderiv_scalarCutoffGradientField_component_le_of_hessian_bound {d : ℕ} + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) (i : Fin d) + {B : ℝ} {z : Vec d} (hB : ‖iteratedFDeriv ℝ 2 η z‖ ≤ B) : + ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ ≤ B := by + have hB_nonneg : 0 ≤ B := le_trans (norm_nonneg _) hB + have hc1 : + ContDiffAt ℝ (1 : ℕ∞) (fderiv ℝ η) z := by + exact + hη.contDiffAt.fderiv_right (m := (1 : ℕ∞)) + (by + exact_mod_cast (show (1 : ℕ∞) + 1 ≤ (⊤ : ℕ∞) by simp)) + have hc : + DifferentiableAt ℝ (fderiv ℝ η) z := hc1.differentiableAt (by simp) + refine ContinuousLinearMap.opNorm_le_bound _ hB_nonneg ?_ + intro v + have happly : + (fderiv ℝ (fun x => scalarCutoffGradientField η x i) z) v = + (fderiv ℝ (fderiv ℝ η) z v) (basisVec i) := by + have htmp := + congrArg (fun L : Vec d →L[ℝ] ℝ => L v) + (fderiv_clm_apply (𝕜 := ℝ) (c := fderiv ℝ η) + (u := fun _ : Vec d => basisVec i) hc + (by simp)) + simpa [scalarCutoffGradientField] using htmp + calc + ‖(fderiv ℝ (fun x => scalarCutoffGradientField η x i) z) v‖ + = ‖(fderiv ℝ (fderiv ℝ η) z v) (basisVec i)‖ := by + rw [happly] + _ = ‖(fderiv ℝ (fderiv ℝ η) z (![v, basisVec i] 0)) (![v, basisVec i] 1)‖ := by + simp + _ = ‖iteratedFDeriv ℝ 2 η z ![v, basisVec i]‖ := by + rw [iteratedFDeriv_two_apply] + _ ≤ ‖iteratedFDeriv ℝ 2 η z‖ * ∏ j, ‖![v, basisVec i] j‖ := by + simpa using ContinuousMultilinearMap.le_opNorm (iteratedFDeriv ℝ 2 η z) ![v, basisVec i] + _ = ‖iteratedFDeriv ℝ 2 η z‖ * (‖v‖ * ‖basisVec i‖) := by + simp + _ = ‖iteratedFDeriv ℝ 2 η z‖ * ‖v‖ := by + simp [norm_basisVec] + _ ≤ B * ‖v‖ := by + exact mul_le_mul_of_nonneg_right hB (norm_nonneg _) + +theorem scalarCutoffGradientField_component_fderiv_bound_on_cubeSet_of_hessian_bound + {d : ℕ} (Q : TriadicCube d) {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) {B : ℝ} + (hB : ∀ z ∈ cubeSet Q, ‖iteratedFDeriv ℝ 2 η z‖ ≤ B) : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ ≤ B := by + intro i z hz + exact fderiv_scalarCutoffGradientField_component_le_of_hessian_bound hη i (hB z hz) + +theorem quantitativeCubeCutoff_memLp_top_gradientField {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure Q) := by + refine + memLp_top_scalarCutoffGradientField_of_bound_on_cubeSet + (Q := Q) (η := η) (Xi := quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) + η.smooth ?_ + intro z hz + exact η.gradient_bound z + +theorem quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + cubeLpNorm Q ∞ (scalarCutoffGradientField η) ≤ + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hXi_nonneg : + 0 ≤ quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + exact le_trans (norm_nonneg _) (η.gradient_bound (cubeCenter Q)) + apply cubeLpNorm_infty_scalarCutoffGradientField_le_of_bound_on_cubeSet Q + · exact hXi_nonneg + · intro z hz + exact η.gradient_bound z + +theorem quantitativeCubeCutoff_component_fderiv_bound_on_cubeSet {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + ∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ ≤ + quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + exact + scalarCutoffGradientField_component_fderiv_bound_on_cubeSet_of_hessian_bound + Q η.smooth (fun z hz => η.hessian_bound z) + +theorem normalized_quantitativeCubeCutoff_canonicalFun_gradient_controls + {d : ℕ} (Q : TriadicCube d) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + MeasureTheory.MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure Q) ∧ + (∀ i : Fin d, ContDiff ℝ (⊤ : ℕ∞) (fun x => scalarCutoffGradientField φ x i)) ∧ + (∀ i : Fin d, ∀ z ∈ cubeSet Q, + ‖fderiv ℝ (fun x => scalarCutoffGradientField φ x i) z‖ ≤ + (cubeAverage Q η)⁻¹ * + (quantitativeCubeCutoffHessianConst d / + ((((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) ^ 2))) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + let ηq : QuantitativeCubeCutoff Q (1 / 2 : ℝ) (3 / 4 : ℝ) := + QuantitativeCubeCutoff.canonical Q (1 / 2 : ℝ) (3 / 4 : ℝ) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hA_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr (le_of_lt hpos) + have hη_smooth : ContDiff ℝ (⊤ : ℕ∞) η := by + simpa [η] using + QuantitativeCubeCutoff.canonicalFun_smooth Q + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ, smul_eq_mul] using hη_smooth.const_smul A⁻¹ + have hgrad_eq : scalarCutoffGradientField φ = A⁻¹ • scalarCutoffGradientField η := by + have hφ_eq : φ = A⁻¹ • η := by + funext x + simp [φ] + funext x i + change (fderiv ℝ φ x) (basisVec i) = + (A⁻¹ • scalarCutoffGradientField η x) i + rw [hφ_eq] + rw [fderiv_const_smul_field (𝕜 := ℝ) (f := η) A⁻¹] + simp [scalarCutoffGradientField] + have hraw_mem : MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure Q) := by + simpa [η, ηq, QuantitativeCubeCutoff.canonical] using + quantitativeCubeCutoff_memLp_top_gradientField Q ηq + have hmem : MeasureTheory.MemLp (scalarCutoffGradientField φ) ∞ (normalizedCubeMeasure Q) := by + rw [hgrad_eq] + exact hraw_mem.const_smul A⁻¹ + refine ⟨hmem, ?_, ?_⟩ + · intro i + exact contDiff_scalarCutoffGradientField_component hφ_smooth i + · intro i z hz + have hcomponent_eq : + (fun x => scalarCutoffGradientField φ x i) = + fun x => A⁻¹ * scalarCutoffGradientField η x i := by + funext x + have h := congrFun (congrFun hgrad_eq x) i + simpa using h + have hfun_eq : + (fun x => A⁻¹ * scalarCutoffGradientField η x i) = + A⁻¹ • (fun x => scalarCutoffGradientField η x i) := by + funext x + simp + have hraw : + ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ ≤ + quantitativeCubeCutoffHessianConst d / + ((((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) ^ 2) := by + simpa [η, ηq, QuantitativeCubeCutoff.canonical] using + quantitativeCubeCutoff_component_fderiv_bound_on_cubeSet Q ηq i z hz + rw [hcomponent_eq, hfun_eq] + rw [fderiv_const_smul_field (𝕜 := ℝ) + (f := fun x => scalarCutoffGradientField η x i) A⁻¹] + calc + ‖A⁻¹ • fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ + = ‖A⁻¹‖ * ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ := by + rw [norm_smul] + _ = A⁻¹ * ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ := by + rw [Real.norm_eq_abs, abs_of_nonneg hA_nonneg] + _ ≤ A⁻¹ * + (quantitativeCubeCutoffHessianConst d / + ((((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) ^ 2)) := by + exact mul_le_mul_of_nonneg_left hraw hA_nonneg + +/-- `L∞` bound for the scalar-gradient field of the normalized quantitative +cutoff. This extracts the gradient-size part of +`normalized_quantitativeCubeCutoff_canonicalFun_gradient_controls`; it is used +to bound the Section 5.3 cutoff-product coefficient. -/ +theorem cubeLpNorm_infty_scalarCutoffGradientField_normalized_quantitativeCubeCutoff_canonicalFun_le + {d : ℕ} (Q : TriadicCube d) : + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let φ : Vec d → ℝ := fun x => (cubeAverage Q η)⁻¹ * η x + cubeLpNorm Q ∞ (scalarCutoffGradientField φ) ≤ + (cubeAverage Q η)⁻¹ * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) := by + let η : Vec d → ℝ := + QuantitativeCubeCutoff.canonicalFun Q (1 / 2 : ℝ) (3 / 4 : ℝ) + let A : ℝ := cubeAverage Q η + let φ : Vec d → ℝ := fun x => A⁻¹ * η x + let ηq : QuantitativeCubeCutoff Q (1 / 2 : ℝ) (3 / 4 : ℝ) := + QuantitativeCubeCutoff.canonical Q (1 / 2 : ℝ) (3 / 4 : ℝ) + (by norm_num : (0 : ℝ) < 1 / 2) + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hpos : 0 < A := by + simpa [A, η] using cubeAverage_quantitativeCubeCutoff_canonicalFun_pos Q + have hA_nonneg : 0 ≤ A⁻¹ := inv_nonneg.mpr (le_of_lt hpos) + have hφ_eq : φ = A⁻¹ • η := by + funext x + simp [φ] + have hG_nonneg : 0 ≤ quantitativeCubeCutoffGradientConst d := by + unfold quantitativeCubeCutoffGradientConst + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + smoothTransitionProfile.derivBound_nonneg + apply cubeLpNorm_infty_scalarCutoffGradientField_le_of_bound_on_cubeSet Q + · exact mul_nonneg hA_nonneg + (div_nonneg hG_nonneg + (mul_nonneg (by norm_num : 0 ≤ (3 / 4 : ℝ) - (1 / 2 : ℝ)) + (cubeRadius_pos Q).le)) + · intro z hz + change ‖fderiv ℝ φ z‖ ≤ + A⁻¹ * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) + have hraw : + ‖fderiv ℝ η z‖ ≤ + quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q) := by + simpa [η, ηq, QuantitativeCubeCutoff.canonical] using + (ηq.gradient_bound z) + rw [hφ_eq] + rw [fderiv_const_smul_field (𝕜 := ℝ) (f := η) A⁻¹] + calc + ‖A⁻¹ • fderiv ℝ η z‖ + = ‖A⁻¹‖ * ‖fderiv ℝ η z‖ := by + rw [norm_smul] + _ = A⁻¹ * ‖fderiv ℝ η z‖ := by + rw [Real.norm_eq_abs, abs_of_nonneg hA_nonneg] + _ ≤ A⁻¹ * + (quantitativeCubeCutoffGradientConst d / + (((3 / 4 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) := by + exact mul_le_mul_of_nonneg_left hraw hA_nonneg + +/-- The gradient field of a quantitative cutoff built on a parent cube is +`L∞` on every descendant cube. This is the small-cube version needed by the +Chapter 3 Caccioppoli argument. -/ +theorem quantitativeCubeCutoff_memLp_top_gradientField_on_descendant {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (_hR : R ∈ descendantsAtDepth Q j) + {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + MeasureTheory.MemLp (scalarCutoffGradientField η) ∞ (normalizedCubeMeasure R) := by + refine + memLp_top_scalarCutoffGradientField_of_bound_on_cubeSet + (Q := R) (η := η) + (Xi := quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) + η.smooth ?_ + intro z hz + exact η.gradient_bound z + +/-- Descendant-local `L∞` bound for the gradient field of a parent-cube +quantitative cutoff. -/ +theorem quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (_hR : R ∈ descendantsAtDepth Q j) {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + cubeLpNorm R ∞ (scalarCutoffGradientField η) ≤ + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hXi_nonneg : + 0 ≤ quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + exact le_trans (norm_nonneg _) (η.gradient_bound (cubeCenter Q)) + apply cubeLpNorm_infty_scalarCutoffGradientField_le_of_bound_on_cubeSet R + · exact hXi_nonneg + · intro z hz + exact η.gradient_bound z + +/-- Descendant-local derivative bound for the cutoff-gradient field. The +bound is still expressed with the parent cube radius, while later small-cube +bookkeeping multiplies it by the descendant scale. -/ +theorem quantitativeCubeCutoff_component_fderiv_bound_on_descendant {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + ∀ i : Fin d, ∀ z ∈ cubeSet R, + ‖fderiv ℝ (fun x => scalarCutoffGradientField η x i) z‖ ≤ + quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + intro i z hz + exact quantitativeCubeCutoff_component_fderiv_bound_on_cubeSet Q η i z + (cubeSet_subset_of_mem_descendantsAtDepth hR hz) + +theorem CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (u g : Vec d → ℝ) (energy : Vec d → ℝ) + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) : + CoarseCaccioppoliScalarCutoffControls Q s u g (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C := by + refine + ⟨hB, hBgConst, hBgCent, hC, hproj, ?_, ?_, hgCirc1, hgCircS⟩ + · intro i + exact contDiff_scalarCutoffGradientField_component η.smooth i + · intro i z hz + exact quantitativeCubeCutoff_component_fderiv_bound_on_cubeSet Q η i z hz + +/-- Scalar cutoff-control package on a descendant cube, using a quantitative +cutoff constructed on the parent cube. -/ +theorem CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (s : ℝ) {ρ₁ ρ₂ : ℝ} + (u g : Vec d → ℝ) (energy : Vec d → ℝ) + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate R C (cubeFluctuation R u) g N) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage R energy)) : + CoarseCaccioppoliScalarCutoffControls R s u g (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C := by + refine + ⟨hB, hBgConst, hBgCent, hC, hproj, ?_, ?_, hgCirc1, hgCircS⟩ + · intro i + exact contDiff_scalarCutoffGradientField_component η.smooth i + · intro i z hz + exact quantitativeCubeCutoff_component_fderiv_bound_on_descendant hR η i z hz + +/-- Vector projected-Poincare version of +`CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff`. + +The vector Poincare constant is `C`; the centered exact cutoff size is stated +with the effective scalar-facing constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem CoarseCaccioppoliVectorCutoffControls.of_quantitativeCubeCutoff + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {ρ₁ ρ₂ : ℝ} + (u : Vec d → ℝ) (G : Vec d → Vec d) (energy : Vec d → ℝ) + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage Q energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) : + CoarseCaccioppoliVectorCutoffControls Q s u G (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C := by + refine + ⟨hB, hAcircS, hBgConst, hBgCent, hC, hproj, ?_, ?_, hGcirc1, hGcircS⟩ + · intro i + exact contDiff_scalarCutoffGradientField_component η.smooth i + · intro i z hz + exact quantitativeCubeCutoff_component_fderiv_bound_on_cubeSet Q η i z hz + +/-- Vector projected-Poincare cutoff-control package on a descendant cube, +using a quantitative cutoff constructed on the parent cube. -/ +theorem CoarseCaccioppoliVectorCutoffControls.of_quantitativeCubeCutoff_on_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + (s : ℝ) {ρ₁ ρ₂ : ℝ} + (u : Vec d → ℝ) (G : Vec d → Vec d) (energy : Vec d → ℝ) + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {Acirc1 AcircS C : ℝ} + (hB : + 0 ≤ quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + (hAcircS : 0 ≤ AcircS) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize R u (scalarCutoffGradientField η) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2))) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize R s (scalarCutoffGradientField η) Acirc1 AcircS + (Real.sqrt (cubeAverage R energy)) + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) + ((Fintype.card (Fin d) : ℝ) * C)) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C (cubeFluctuation R u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage R energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage R energy)) : + CoarseCaccioppoliVectorCutoffControls R s u G (scalarCutoffGradientField η) energy + Acirc1 AcircS + (quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) C := by + refine + ⟨hB, hAcircS, hBgConst, hBgCent, hC, hproj, ?_, ?_, hGcirc1, hGcircS⟩ + · intro i + exact contDiff_scalarCutoffGradientField_component η.smooth i + · intro i z hz + exact quantitativeCubeCutoff_component_fderiv_bound_on_descendant hR η i z hz + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/SingleCubeRhs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/SingleCubeRhs.lean new file mode 100644 index 0000000000..8d2812c104 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/EnergyBridge/SingleCubeRhs.lean @@ -0,0 +1,634 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.ExactRhs + +/-! # Single Cube Rhs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-- Note-facing single-cube boundary Caccioppoli RHS. + +The parameters `k` and `h` are the triadic gap scale and auxiliary height from +Chapter 3. The scalar `energyAvg` represents +`‖σ^{1/2}∇u‖_{\underline L^2(Q)}^2`, so its square root is the normalized +energy norm appearing in the first term. -/ +def coarseCaccioppoliSingleCubeBoundaryNoteRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h uL2Sq energyAvg : ℝ) : ℝ := + C * Real.rpow (3 : ℝ) k * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq * Real.sqrt energyAvg + + (C / (s * (1 - s))) * Real.rpow (3 : ℝ) (k - h) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) * + energyAvg + +/-- Constant-piece summand of `coarseCaccioppoliSingleCubeBoundaryNoteRhs`. -/ +def coarseCaccioppoliSingleCubeBoundaryConstantRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (C k uL2Sq energyAvg : ℝ) : ℝ := + C * Real.rpow (3 : ℝ) k * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq * Real.sqrt energyAvg + +/-- Coefficient in the note's constant-piece RHS, after factoring out the +energy norm. -/ +def coarseCaccioppoliSingleCubeBoundaryConstantCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (C k uL2Sq : ℝ) : ℝ := + C * Real.rpow (3 : ℝ) k * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt uL2Sq + +/-- The constant-piece single-cube coefficient before multiplying by the +global `L²` size of `u`. + +This is the coefficient used in the small-cube summation proof: the local +estimate keeps the local `L²` norm of `u`, and the descendant average is +collapsed by finite Cauchy only after summing over the small cubes. -/ +def coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C k : ℝ) : ℝ := + C * Real.rpow (3 : ℝ) k * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) + +theorem coarseCaccioppoliSingleCubeBoundaryConstantCoeff_eq_baseCoeff_mul_sqrt + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (C k uL2Sq : ℝ) : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq = + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k * + Real.sqrt uL2Sq := by + rfl + +theorem coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {C k : ℝ} + (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k := by + unfold coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff + have hLambda_nonneg : 0 ≤ LambdaSq Q (1 : ℝ) (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q (1 : ℝ) a (by norm_num) + exact mul_nonneg + (mul_nonneg hC (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.rpow_nonneg hLambda_nonneg _) + +/-- The constant base coefficient is monotone increasing in the scale +parameter `k`. -/ +theorem coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff_mono_scale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {C k k' : ℝ} + (hC : 0 ≤ C) (hk : k ≤ k') : + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k' := by + have hLambda_nonneg : 0 ≤ LambdaSq Q (1 : ℝ) (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q (1 : ℝ) a (by norm_num) + have hLambda_rpow_nonneg : + 0 ≤ Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg hLambda_nonneg _ + have hpow : + Real.rpow (3 : ℝ) k ≤ Real.rpow (3 : ℝ) k' := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hk + calc + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k + = + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) := by + rfl + _ ≤ + (C * Real.rpow (3 : ℝ) k') * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hpow hC) hLambda_rpow_nonneg + _ = + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff Q a C k' := by + rfl + +theorem coarseCaccioppoliSingleCubeBoundaryConstantCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {C k uL2Sq : ℝ} + (hC : 0 ≤ C) : + 0 ≤ coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq := by + rw [coarseCaccioppoliSingleCubeBoundaryConstantCoeff_eq_baseCoeff_mul_sqrt] + exact mul_nonneg + (coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff_nonneg Q a hC) + (Real.sqrt_nonneg _) + +/-- The constant coefficient after inserting the global `L²` size is monotone +in the scale parameter `k`. -/ +theorem coarseCaccioppoliSingleCubeBoundaryConstantCoeff_mono_scale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {C k k' uL2Sq : ℝ} + (hC : 0 ≤ C) (hk : k ≤ k') : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k' uL2Sq := by + rw [coarseCaccioppoliSingleCubeBoundaryConstantCoeff_eq_baseCoeff_mul_sqrt, + coarseCaccioppoliSingleCubeBoundaryConstantCoeff_eq_baseCoeff_mul_sqrt] + exact mul_le_mul_of_nonneg_right + (coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff_mono_scale Q a hC hk) + (Real.sqrt_nonneg _) + +theorem coarseCaccioppoliSingleCubeBoundaryConstantRhs_eq_coeff_mul {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C k uL2Sq energyAvg : ℝ) : + coarseCaccioppoliSingleCubeBoundaryConstantRhs Q a C k uL2Sq energyAvg = + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq * + Real.sqrt energyAvg := by + unfold coarseCaccioppoliSingleCubeBoundaryConstantRhs + coarseCaccioppoliSingleCubeBoundaryConstantCoeff + ring + +/-- Centered-piece summand of `coarseCaccioppoliSingleCubeBoundaryNoteRhs`. -/ +def coarseCaccioppoliSingleCubeBoundaryCenteredRhs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h energyAvg : ℝ) : ℝ := + (C / (s * (1 - s))) * Real.rpow (3 : ℝ) (k - h) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) * + energyAvg + +/-- Coefficient in the note's centered-piece RHS after factoring out +`energyAvg`. -/ +def coarseCaccioppoliSingleCubeBoundaryCenteredCoeff {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h : ℝ) : ℝ := + (C / (s * (1 - s))) * Real.rpow (3 : ℝ) (k - h) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) + +theorem coarseCaccioppoliSingleCubeBoundaryCenteredCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s C k h : ℝ} + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) : + 0 ≤ coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h := by + unfold coarseCaccioppoliSingleCubeBoundaryCenteredCoeff + have hden_nonneg : 0 ≤ s * (1 - s) := by + exact mul_nonneg hs0.le (sub_nonneg.mpr hs1.le) + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hlambda_nonneg : 0 ≤ lambdaSq Q (1 - s) (.finite 1) a := + multiscale_ellipticity_lambdaSq_one_nonneg Q (1 - s) a (sub_nonneg.mpr hs1.le) + exact mul_nonneg + (mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (mul_nonneg + (Real.rpow_nonneg hLambda_nonneg _) + (Real.rpow_nonneg hlambda_nonneg _)) + +/-- The centered coefficient is monotone increasing in the scale parameter +`k`. -/ +theorem coarseCaccioppoliSingleCubeBoundaryCenteredCoeff_mono_scale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s C k k' h : ℝ} + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) (hk : k ≤ k') : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k' h := by + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs0.le (sub_nonneg.mpr hs1.le) + have hA_nonneg : 0 ≤ C / (s * (1 - s)) := + div_nonneg hC hden_nonneg + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hlambda_nonneg : 0 ≤ lambdaSq Q (1 - s) (.finite 1) a := + multiscale_ellipticity_lambdaSq_one_nonneg Q (1 - s) a (sub_nonneg.mpr hs1.le) + have hB_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) := + mul_nonneg (Real.rpow_nonneg hLambda_nonneg _) + (Real.rpow_nonneg hlambda_nonneg _) + have hpow : + Real.rpow (3 : ℝ) (k - h) ≤ Real.rpow (3 : ℝ) (k' - h) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) ?_ + linarith + calc + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h + = + (C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k - h)) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) := by + rfl + _ ≤ + (C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k' - h)) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hpow hA_nonneg) hB_nonneg + _ = + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k' h := by + rfl + +/-- The centered single-cube coefficient is monotone decreasing in the +auxiliary height. -/ +theorem coarseCaccioppoliSingleCubeBoundaryCenteredCoeff_anti_mono_height {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s C k h h' : ℝ} + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) (hh : h ≤ h') : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h' ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h := by + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs0.le (sub_nonneg.mpr hs1.le) + have hA_nonneg : 0 ≤ C / (s * (1 - s)) := + div_nonneg hC hden_nonneg + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hlambda_nonneg : 0 ≤ lambdaSq Q (1 - s) (.finite 1) a := + multiscale_ellipticity_lambdaSq_one_nonneg Q (1 - s) a (sub_nonneg.mpr hs1.le) + have hB_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) := + mul_nonneg (Real.rpow_nonneg hLambda_nonneg _) + (Real.rpow_nonneg hlambda_nonneg _) + have hpow : + Real.rpow (3 : ℝ) (k - h') ≤ Real.rpow (3 : ℝ) (k - h) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) ?_ + linarith + calc + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h' + = + (C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k - h')) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) := by + rfl + _ ≤ + (C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k - h)) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hpow hA_nonneg) hB_nonneg + _ = + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h := by + rfl + +theorem coarseCaccioppoliSingleCubeBoundaryCenteredRhs_eq_coeff_mul {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h energyAvg : ℝ) : + coarseCaccioppoliSingleCubeBoundaryCenteredRhs Q a s C k h energyAvg = + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h * energyAvg := by + rfl + +theorem coarseCaccioppoliSingleCubeBoundaryNoteRhs_eq_constant_add_centered {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq energyAvg : ℝ) : + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq energyAvg = + coarseCaccioppoliSingleCubeBoundaryConstantRhs Q a C k uL2Sq energyAvg + + coarseCaccioppoliSingleCubeBoundaryCenteredRhs Q a s C k h energyAvg := by + rfl + +/-- The note-facing single-cube RHS is monotone increasing in the outer scale +parameter `k`. -/ +theorem coarseCaccioppoliSingleCubeBoundaryNoteRhs_mono_scale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s C k k' h uL2Sq energyAvg : ℝ} + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) (hk : k ≤ k') + (henergy : 0 ≤ energyAvg) : + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq energyAvg ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k' h uL2Sq energyAvg := by + rw [coarseCaccioppoliSingleCubeBoundaryNoteRhs_eq_constant_add_centered, + coarseCaccioppoliSingleCubeBoundaryNoteRhs_eq_constant_add_centered] + exact add_le_add + (by + rw [coarseCaccioppoliSingleCubeBoundaryConstantRhs_eq_coeff_mul, + coarseCaccioppoliSingleCubeBoundaryConstantRhs_eq_coeff_mul] + exact mul_le_mul_of_nonneg_right + (coarseCaccioppoliSingleCubeBoundaryConstantCoeff_mono_scale Q a hC hk) + (Real.sqrt_nonneg _)) + (by + rw [coarseCaccioppoliSingleCubeBoundaryCenteredRhs_eq_coeff_mul, + coarseCaccioppoliSingleCubeBoundaryCenteredRhs_eq_coeff_mul] + exact mul_le_mul_of_nonneg_right + (coarseCaccioppoliSingleCubeBoundaryCenteredCoeff_mono_scale Q a hC hs0 hs1 hk) + henergy) + +/-- The coefficient-bookkeeping obligation left after the exact local +cutoff/Besov bridge: dominate the exact local RHS by the note's single-cube +RHS. -/ +def CoarseCaccioppoliSingleCubeCoefficientDomination {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h uL2Sq : ℝ) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) (Acirc1 AcircS B : ℝ) : Prop := + coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C k h uL2Sq (cubeAverage Q energy) + +theorem CoarseCaccioppoliSingleCubeCoefficientDomination.of_termwise {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B : ℝ) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B ≤ + coarseCaccioppoliSingleCubeBoundaryConstantRhs Q a C k uL2Sq + (cubeAverage Q energy)) + (hcent : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredRhs Q a s C k h + (cubeAverage Q energy)) : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s C k h uL2Sq u ξ energy + Acirc1 AcircS B := by + unfold CoarseCaccioppoliSingleCubeCoefficientDomination + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered, + coarseCaccioppoliSingleCubeBoundaryNoteRhs_eq_constant_add_centered] + exact add_le_add hconst hcent + +theorem coarseCaccioppoliFluxEnergyExactConstantRhs_le_singleCubeBoundaryConstantRhs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (B C k uL2Sq : ℝ) + (hcoeff : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a * + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B ≤ + coarseCaccioppoliSingleCubeBoundaryConstantRhs Q a C k uL2Sq + (cubeAverage Q energy) := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul, + coarseCaccioppoliSingleCubeBoundaryConstantRhs_eq_coeff_mul] + exact mul_le_mul_of_nonneg_right hcoeff (Real.sqrt_nonneg _) + +theorem coarseCaccioppoliFluxEnergyExactCenteredRhs_le_singleCubeBoundaryCenteredRhs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (ξ : Vec d → Vec d) (energy : Vec d → ℝ) (Acirc1 AcircS B C k h : ℝ) + (henergy : 0 ≤ cubeAverage Q energy) + (hcoeff : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredRhs Q a s C k h + (cubeAverage Q energy) := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq, + coarseCaccioppoliSingleCubeBoundaryCenteredRhs_eq_coeff_mul] + have hsqrt_sq : + Real.sqrt (cubeAverage Q energy) * Real.sqrt (cubeAverage Q energy) = + cubeAverage Q energy := by + simpa [pow_two] using Real.sq_sqrt henergy + rw [hsqrt_sq] + exact mul_le_mul_of_nonneg_right hcoeff henergy + +/-- Coefficient-only domination for the constant part of the exact local RHS. -/ +def CoarseCaccioppoliConstantCoefficientDomination {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (C k uL2Sq : ℝ) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (B : ℝ) : Prop := + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a * + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq + +/-- Prove constant-piece coefficient domination from separate bounds on the +flux coefficient and cutoff size. -/ +theorem CoarseCaccioppoliConstantCoefficientDomination.of_factor_bounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C k uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) {B A G : ℝ} + (hA_nonneg : 0 ≤ A) (hB : 0 ≤ B) + (hcoeff : coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ A) + (hcutoff : coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ G) + (hAG : A * G ≤ coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) : + CoarseCaccioppoliConstantCoefficientDomination Q a C k uL2Sq u ξ B := by + unfold CoarseCaccioppoliConstantCoefficientDomination + exact le_trans + (mul_le_mul hcoeff hcutoff + (coarseCaccioppoliConstantCutoffSize_nonneg Q u ξ hB) hA_nonneg) + hAG + +/-- Coefficient-only domination for the centered part of the exact local RHS. -/ +def CoarseCaccioppoliCenteredCoefficientDomination {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h : ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) : + Prop := + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h + +/-- Prove centered-piece coefficient domination by bounding the average-flux +and Besov/cutoff-product parts separately. -/ +theorem CoarseCaccioppoliCenteredCoefficientDomination.of_termwise {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h : ℝ) + (ξ : Vec d → Vec d) (Acirc1 AcircS B : ℝ) {X Y : ℝ} + (havg : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ X) + (hbesov : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ Y) + (hXY : X + Y ≤ coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + CoarseCaccioppoliCenteredCoefficientDomination Q a s C k h ξ Acirc1 AcircS B := by + unfold CoarseCaccioppoliCenteredCoefficientDomination + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact le_trans (add_le_add havg hbesov) hXY + +/-- The two coefficient inequalities left after the exact cutoff/Besov local +bridge has been factored into constant and centered pieces. -/ +def CoarseCaccioppoliSingleCubeCoefficientControls {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C k h uL2Sq : ℝ) (u : Vec d → ℝ) (ξ : Vec d → Vec d) + (Acirc1 AcircS B : ℝ) : Prop := + CoarseCaccioppoliConstantCoefficientDomination Q a C k uL2Sq u ξ B ∧ + CoarseCaccioppoliCenteredCoefficientDomination Q a s C k h ξ Acirc1 AcircS B + +/-- Build the bundled coefficient controls from the separated constant +cutoff-size estimate and the centered average/Besov estimates. -/ +theorem CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS : ℝ) + {B A G X Y : ℝ} + (hA_nonneg : 0 ≤ A) (hB : 0 ≤ B) + (hconstCoeff : coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ A) + (hconstCutoff : coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ G) + (hconst : + A * G ≤ coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (havg : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ X) + (hbesov : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ Y) + (hcentered : + X + Y ≤ coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C k h uL2Sq u ξ + Acirc1 AcircS B := by + constructor + · exact + CoarseCaccioppoliConstantCoefficientDomination.of_factor_bounds + Q a C k uL2Sq u ξ hA_nonneg hB hconstCoeff hconstCutoff hconst + · exact + CoarseCaccioppoliCenteredCoefficientDomination.of_termwise + Q a s C k h ξ Acirc1 AcircS B havg hbesov hcentered + +/-- Build the coefficient controls from primitive scalar factor estimates: +bounds for `‖u‖₂`, `‖ξ‖∞`, `‖∇ξ‖∞`, the scalar projected-Poincare factors, +and the average/flux coefficient factors. This is the final algebraic layer +before a concrete cutoff construction supplies those scalar estimates. -/ +theorem CoarseCaccioppoliSingleCubeCoefficientControls.of_separated_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS : ℝ) + {B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hC : 0 ≤ C) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hAavgConst : Real.sqrt (coarseBBlockNorm Q a) ≤ AavgConst) + (hAavgCent : Real.sqrt (coarseBBlockNorm Q a) ≤ AavgCent) + (hAflux1 : + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) ≤ Aflux1) + (hAfluxS : + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ AfluxS) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q AavgConst Aflux1 * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) AavgCent Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s AavgCent AfluxS + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C k h uL2Sq u ξ + Acirc1 AcircS B := by + have hAavgConst_nonneg : 0 ≤ AavgConst := by + exact le_trans (Real.sqrt_nonneg _) hAavgConst + have hAavgCent_nonneg : 0 ≤ AavgCent := by + exact le_trans (Real.sqrt_nonneg _) hAavgCent + have hdisc1_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * (1 : ℝ)) + have hLambda1_nonneg : 0 ≤ LambdaSq Q (1 : ℝ) (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q (1 : ℝ) a (by norm_num) + have hAflux1_nonneg : 0 ≤ Aflux1 := by + exact le_trans + (mul_nonneg (inv_nonneg.mpr hdisc1_pos.le) + (Real.rpow_nonneg hLambda1_nonneg _)) + hAflux1 + have hdiscS_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs0) + have hLambdaS_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs0.le + have hAfluxS_nonneg : 0 ≤ AfluxS := by + exact le_trans + (mul_nonneg (inv_nonneg.mpr hdiscS_pos.le) + (Real.rpow_nonneg hLambdaS_nonneg _)) + hAfluxS + have hU_nonneg : 0 ≤ U := by + exact le_trans (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) hu + have hXi_nonneg : 0 ≤ Xi := by + exact le_trans (cubeLpNorm_nonneg Q ∞ ξ) hξ + have hD_nonneg : 0 ≤ D := by + exact le_trans hB_nonneg hB + let BgCent : ℝ := + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C + have hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hB_nonneg hC + have hBgCent : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ BgCent := by + exact + coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hD_nonneg hC + hξ hB hAcirc1 hAcircS + exact + CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds + Q a s C k h uL2Sq u ξ Acirc1 AcircS + (coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_nonneg + Q hAavgConst_nonneg hAflux1_nonneg) + hB_nonneg + (coarseCaccioppoliFluxEnergyExactConstantCoeff_le_factorBound + Q a hAavgConst hAflux1) + (coarseCaccioppoliConstantCutoffSize_le_factorBound + Q u ξ hU_nonneg hB_nonneg hu hξ hB) + hconst + (coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ hAavgCent_nonneg hXi_nonneg hAcirc1_nonneg hC hAavgCent hξ hAcirc1) + (by + simpa [BgCent] using + (coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ hAavgCent_nonneg hAfluxS_nonneg hBgCentCoeff_nonneg + hAavgCent hAfluxS hBgCent)) + (by + simpa [BgCent] using hcentered) + +/-- Canonical-factor version of the primitive coefficient-control constructor. +The average and flux coefficient slots are filled by +`coarseCaccioppoliLambdaFactor`; the two summability hypotheses are exactly the +flux-energy inputs that justify the average-coefficient bounds. -/ +theorem CoarseCaccioppoliSingleCubeCoefficientControls.of_canonical_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (Acirc1 AcircS : ℝ) + {B U Xi D A1 AS : ℝ} + (hs0 : 0 < s) (hC : 0 ≤ C) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hB_nonneg : 0 ≤ B) (hAcirc1_nonneg : 0 ≤ Acirc1) + (hAcircS_nonneg : 0 ≤ AcircS) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C k h uL2Sq u ξ + Acirc1 AcircS B := by + exact + CoarseCaccioppoliSingleCubeCoefficientControls.of_separated_factor_bounds + Q a s C k h uL2Sq u ξ Acirc1 AcircS hs0 hC + hB_nonneg hAcirc1_nonneg hAcircS_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a (by norm_num : 0 < (1 : ℝ)) hsum1) + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hsumS) + (by simp [coarseCaccioppoliLambdaFactor]) + (by simp [coarseCaccioppoliLambdaFactor]) + hu hξ hB hAcirc1 hAcircS hconst hcentered + +theorem CoarseCaccioppoliSingleCubeCoefficientDomination.of_coefficientControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS B : ℝ) + (henergy : 0 ≤ cubeAverage Q energy) + (hcoeff : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C k h uL2Sq u ξ + Acirc1 AcircS B) : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s C k h uL2Sq u ξ energy + Acirc1 AcircS B := by + rcases hcoeff with ⟨hconst, hcent⟩ + exact + CoarseCaccioppoliSingleCubeCoefficientDomination.of_termwise + Q a s C k h uL2Sq u ξ energy Acirc1 AcircS B + (coarseCaccioppoliFluxEnergyExactConstantRhs_le_singleCubeBoundaryConstantRhs + Q a u ξ energy B C k uL2Sq hconst) + (coarseCaccioppoliFluxEnergyExactCenteredRhs_le_singleCubeBoundaryCenteredRhs + Q a s ξ energy Acirc1 AcircS B C k h henergy hcent) + +/-- Direct full coefficient domination from the separated constant and +centered factor bounds. -/ +theorem CoarseCaccioppoliSingleCubeCoefficientDomination.of_factor_bounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C k h uL2Sq : ℝ) + (u : Vec d → ℝ) (ξ : Vec d → Vec d) (energy : Vec d → ℝ) + (Acirc1 AcircS : ℝ) {B A G X Y : ℝ} + (henergy : 0 ≤ cubeAverage Q energy) + (hA_nonneg : 0 ≤ A) (hB : 0 ≤ B) + (hconstCoeff : coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ A) + (hconstCutoff : coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ G) + (hconst : + A * G ≤ coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C k uL2Sq) + (havg : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ X) + (hbesov : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ Y) + (hcentered : + X + Y ≤ coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C k h) : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s C k h uL2Sq u ξ energy + Acirc1 AcircS B := by + exact + CoarseCaccioppoliSingleCubeCoefficientDomination.of_coefficientControls + Q a s C k h uL2Sq u ξ energy Acirc1 AcircS B henergy + (CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds + Q a s C k h uL2Sq u ξ Acirc1 AcircS hA_nonneg hB + hconstCoeff hconstCutoff hconst havg hbesov hcentered) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Height.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Height.lean new file mode 100644 index 0000000000..8858169f46 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Height.lean @@ -0,0 +1,910 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Basic + +/-! # Height -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoli_sigma_pos {s t : ℝ} + (hst : s + t < 1) : + 0 < coarseCaccioppoliSigma s t := by + unfold coarseCaccioppoliSigma + linarith + +theorem coarseCaccioppoli_beta_nonneg {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliBeta s t := by + have hσ : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hnum : 0 ≤ 2 * (1 - t) := by + have ht1 : t < 1 := by linarith + exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (sub_nonneg.mpr ht1.le) + unfold coarseCaccioppoliBeta + exact div_nonneg hnum hσ.le + +theorem coarseCaccioppoli_power_nonneg {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 0 ≤ coarseCaccioppoliPower s t := by + have hσ : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + unfold coarseCaccioppoliPower + exact div_nonneg (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hs.le) hσ.le + +theorem coarseCaccioppoli_sigma_le_one_sub_s {s t : ℝ} (ht : 0 < t) : + coarseCaccioppoliSigma s t ≤ 1 - s := by + unfold coarseCaccioppoliSigma + linarith + +theorem coarseCaccioppoli_sigma_div_one_sub_s_le_one {s t : ℝ} + (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliSigma s t / (1 - s) ≤ 1 := by + have hs1_pos : 0 < 1 - s := by linarith + rw [div_le_iff₀ hs1_pos] + simpa using coarseCaccioppoli_sigma_le_one_sub_s (s := s) (t := t) ht + +theorem coarseCaccioppoli_sigma_mul_beta {s t : ℝ} + (hst : s + t < 1) : + coarseCaccioppoliSigma s t * coarseCaccioppoliBeta s t = + 2 * (1 - t) := by + have hσ : coarseCaccioppoliSigma s t ≠ 0 := + (coarseCaccioppoli_sigma_pos hst).ne' + unfold coarseCaccioppoliBeta + field_simp [hσ] + +theorem coarseCaccioppoli_sigma_mul_power {s t : ℝ} + (hst : s + t < 1) : + coarseCaccioppoliSigma s t * coarseCaccioppoliPower s t = 2 * s := by + have hσ : coarseCaccioppoliSigma s t ≠ 0 := + (coarseCaccioppoli_sigma_pos hst).ne' + unfold coarseCaccioppoliPower + field_simp [hσ] + +theorem coarseCaccioppoli_sigma_mul_beta_le_two {s t : ℝ} + (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliSigma s t * coarseCaccioppoliBeta s t ≤ 2 := by + rw [coarseCaccioppoli_sigma_mul_beta hst] + calc + 2 * (1 - t) ≤ 2 * 1 := + mul_le_mul_of_nonneg_left (sub_le_self (1 : ℝ) ht.le) (by norm_num) + _ = 2 := by ring + +theorem coarseCaccioppoli_sigma_mul_power_le_two {s t : ℝ} + (_hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliSigma s t * coarseCaccioppoliPower s t ≤ 2 := by + rw [coarseCaccioppoli_sigma_mul_power hst] + have hs_le_one : s ≤ 1 := by linarith + calc + 2 * s ≤ 2 * 1 := + mul_le_mul_of_nonneg_left hs_le_one (by norm_num : 0 ≤ (2 : ℝ)) + _ = 2 := by ring + +theorem coarseCaccioppoli_beta_eq_two_add_power {s t : ℝ} + (hst : s + t < 1) : + coarseCaccioppoliBeta s t = 2 + coarseCaccioppoliPower s t := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hσ_ne : coarseCaccioppoliSigma s t ≠ 0 := hσ_pos.ne' + have hsplit : 1 - t = coarseCaccioppoliSigma s t + s := by + unfold coarseCaccioppoliSigma + ring + calc + coarseCaccioppoliBeta s t + = (2 * (coarseCaccioppoliSigma s t + s)) / coarseCaccioppoliSigma s t := by + unfold coarseCaccioppoliBeta + rw [hsplit] + _ = 2 * ((coarseCaccioppoliSigma s t + s) / coarseCaccioppoliSigma s t) := by + field_simp [hσ_ne] + _ = 2 * (1 + s / coarseCaccioppoliSigma s t) := by + field_simp [hσ_ne] + _ = 2 + 2 * s / coarseCaccioppoliSigma s t := by + ring + _ = 2 + coarseCaccioppoliPower s t := by + unfold coarseCaccioppoliPower + rfl + +theorem coarseCaccioppoli_beta_ge_two {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 2 ≤ coarseCaccioppoliBeta s t := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + linarith [coarseCaccioppoli_power_nonneg hs hst] + +theorem coarseCaccioppoli_natCeil_beta_le_two_mul_beta {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) ≤ + 2 * coarseCaccioppoliBeta s t := by + have hβ_nonneg : 0 ≤ coarseCaccioppoliBeta s t := by + linarith [coarseCaccioppoli_beta_ge_two hs hst] + have hceil_lt : + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) < + coarseCaccioppoliBeta s t + 1 := + Nat.ceil_lt_add_one hβ_nonneg + linarith [coarseCaccioppoli_beta_ge_two hs hst] + +theorem coarseCaccioppoli_sigma_mul_natCeil_beta_le_four {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliSigma s t * + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) ≤ 4 := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + calc + coarseCaccioppoliSigma s t * + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) + ≤ coarseCaccioppoliSigma s t * + (2 * coarseCaccioppoliBeta s t) := by + exact mul_le_mul_of_nonneg_left + (coarseCaccioppoli_natCeil_beta_le_two_mul_beta hs hst) + hσ_pos.le + _ = 2 * (coarseCaccioppoliSigma s t * + coarseCaccioppoliBeta s t) := by ring + _ ≤ 4 := by + nlinarith [coarseCaccioppoli_sigma_mul_beta_le_two ht hst] + +theorem coarseCaccioppoli_power_ge_two_mul_s {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 2 * s ≤ coarseCaccioppoliPower s t := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hσ_le_one : coarseCaccioppoliSigma s t ≤ 1 := by + unfold coarseCaccioppoliSigma + linarith + unfold coarseCaccioppoliPower + have hmul : 2 * s * coarseCaccioppoliSigma s t ≤ 2 * s := by + nlinarith + exact (le_div_iff₀ hσ_pos).2 hmul + +theorem coarseCaccioppoli_beta_ge_two_add_two_mul_s {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + 2 + 2 * s ≤ coarseCaccioppoliBeta s t := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + linarith [coarseCaccioppoli_power_ge_two_mul_s hs ht hst] + +theorem coarseCaccioppoli_noteExponent_eq_two_mul_beta_sub_two {s t : ℝ} + (hst : s + t < 1) : + 2 + 4 * s / coarseCaccioppoliSigma s t = + 2 * coarseCaccioppoliBeta s t - 2 := by + rw [coarseCaccioppoli_beta_eq_two_add_power hst] + unfold coarseCaccioppoliPower + ring + +theorem coarseCaccioppoli_noteExponent_pos {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 0 < 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hdiv_nonneg : 0 ≤ 4 * s / coarseCaccioppoliSigma s t := by + positivity + linarith + +theorem coarseCaccioppoli_noteExponent_ge_one {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 1 ≤ 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hdiv_nonneg : 0 ≤ 4 * s / coarseCaccioppoliSigma s t := by + positivity + linarith + +theorem coarseCaccioppoli_beta_le_noteExponent {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + coarseCaccioppoliBeta s t ≤ + 2 + 4 * s / coarseCaccioppoliSigma s t := by + rw [coarseCaccioppoli_noteExponent_eq_two_mul_beta_sub_two hst] + linarith [coarseCaccioppoli_beta_ge_two hs hst] + +theorem coarseCaccioppoli_power_le_noteExponent {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + coarseCaccioppoliPower s t ≤ + 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hq_nonneg := coarseCaccioppoli_power_nonneg hs hst + have hp_eq : + 2 + 4 * s / coarseCaccioppoliSigma s t = + 2 + 2 * coarseCaccioppoliPower s t := by + unfold coarseCaccioppoliPower + ring + rw [hp_eq] + linarith + +theorem coarseCaccioppoli_power_div_noteExponent_le_one {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + coarseCaccioppoliPower s t / + (2 + 4 * s / coarseCaccioppoliSigma s t) ≤ 1 := by + have hp_pos := coarseCaccioppoli_noteExponent_pos hs hst + rw [div_le_iff₀ hp_pos] + simpa using coarseCaccioppoli_power_le_noteExponent hs hst + +/-- The note exponent dominates the integerized radius exponent, up to the +fixed four-unit loss from taking a ceiling. -/ +theorem coarseCaccioppoli_two_natCeil_beta_sub_four_le_noteExponent {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) : + 2 * (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) - 4 ≤ + 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hβ_nonneg : 0 ≤ coarseCaccioppoliBeta s t := by + linarith [coarseCaccioppoli_beta_ge_two hs hst] + have hceil_lt : + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) < + coarseCaccioppoliBeta s t + 1 := + Nat.ceil_lt_add_one hβ_nonneg + rw [coarseCaccioppoli_noteExponent_eq_two_mul_beta_sub_two hst] + linarith + +theorem coarseCaccioppoli_natCeil_beta_le_noteExponent_of_four_le {s t : ℝ} + (hs : 0 < s) (hst : s + t < 1) + (hk : 4 ≤ Nat.ceil (coarseCaccioppoliBeta s t)) : + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) ≤ + 2 + 4 * s / coarseCaccioppoliSigma s t := by + have hk_real : + (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) ≤ + 2 * (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) - 4 := by + have hk_real4 : + (4 : ℝ) ≤ (Nat.ceil (coarseCaccioppoliBeta s t) : ℝ) := by + exact_mod_cast hk + linarith + exact hk_real.trans + (coarseCaccioppoli_two_natCeil_beta_sub_four_le_noteExponent hs hst) + +theorem coarseCaccioppoli_sigma_mul_noteExponent_le_four {s t : ℝ} + (_hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + coarseCaccioppoliSigma s t * + (2 + 4 * s / coarseCaccioppoliSigma s t) ≤ 4 := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + rw [coarseCaccioppoli_noteExponent_eq_two_mul_beta_sub_two hst] + calc + coarseCaccioppoliSigma s t * + (2 * coarseCaccioppoliBeta s t - 2) + = 2 * (coarseCaccioppoliSigma s t * + coarseCaccioppoliBeta s t) - + 2 * coarseCaccioppoliSigma s t := by ring + _ ≤ 2 * (coarseCaccioppoliSigma s t * + coarseCaccioppoliBeta s t) := by + exact sub_le_self _ + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hσ_pos.le) + _ ≤ 4 := by + calc + 2 * (coarseCaccioppoliSigma s t * coarseCaccioppoliBeta s t) ≤ + 2 * 2 := + mul_le_mul_of_nonneg_left + (coarseCaccioppoli_sigma_mul_beta_le_two ht hst) + (by norm_num : 0 ≤ (2 : ℝ)) + _ = 4 := by ring + +/-- Entropy-type scalar bound used in the Caccioppoli constant extraction. +For `0 < r ≤ 1`, the factor `r^{-r}` is uniformly bounded by `exp 1`. This is the +one-variable cancellation behind the small-`s` branch of the note constant. -/ +theorem rpow_neg_self_le_exp_one {r : ℝ} (hr : 0 < r) (_hr_le : r ≤ 1) : + Real.rpow r (-r) ≤ Real.exp 1 := by + have hinv_pos : 0 < r⁻¹ := inv_pos.mpr hr + have hlog_inv_le : Real.log r⁻¹ ≤ r⁻¹ - 1 := + Real.log_le_sub_one_of_pos hinv_pos + have hlog_inv_eq : Real.log r⁻¹ = -Real.log r := Real.log_inv r + have hmul : + r * Real.log r⁻¹ ≤ r * (r⁻¹ - 1) := + mul_le_mul_of_nonneg_left hlog_inv_le hr.le + have hentropy : -r * Real.log r ≤ 1 := by + calc + -r * Real.log r = r * Real.log r⁻¹ := by + rw [hlog_inv_eq] + ring + _ ≤ r * (r⁻¹ - 1) := hmul + _ = 1 - r := by + field_simp [hr.ne'] + _ ≤ 1 := by linarith + have hrpow_eq : Real.rpow r (-r) = Real.exp (-r * Real.log r) := by + calc + Real.rpow r (-r) = Real.exp (Real.log r * (-r)) := + Real.rpow_def_of_pos hr (-r) + _ = Real.exp (-r * Real.log r) := by ring_nf + calc + Real.rpow r (-r) = Real.exp (-r * Real.log r) := hrpow_eq + _ ≤ Real.exp 1 := Real.exp_le_exp.mpr hentropy + +/-- A two-fold version of `rpow_neg_self_le_exp_one`. -/ +theorem rpow_neg_two_mul_self_le_exp_two {r : ℝ} (hr : 0 < r) (_hr_le : r ≤ 1) : + Real.rpow r (-(2 * r)) ≤ Real.exp 2 := by + have hinv_pos : 0 < r⁻¹ := inv_pos.mpr hr + have hlog_inv_le : Real.log r⁻¹ ≤ r⁻¹ - 1 := + Real.log_le_sub_one_of_pos hinv_pos + have hlog_inv_eq : Real.log r⁻¹ = -Real.log r := Real.log_inv r + have hmul : + r * Real.log r⁻¹ ≤ r * (r⁻¹ - 1) := + mul_le_mul_of_nonneg_left hlog_inv_le hr.le + have hentropy : -r * Real.log r ≤ 1 := by + calc + -r * Real.log r = r * Real.log r⁻¹ := by + rw [hlog_inv_eq] + ring + _ ≤ r * (r⁻¹ - 1) := hmul + _ = 1 - r := by + field_simp [hr.ne'] + _ ≤ 1 := by linarith + have htwo_entropy : -(2 * r) * Real.log r ≤ 2 := by + have hscale : (2 : ℝ) * (-r * Real.log r) ≤ 2 * 1 := + mul_le_mul_of_nonneg_left hentropy (by norm_num) + linarith + have hrpow_eq : Real.rpow r (-(2 * r)) = + Real.exp (-(2 * r) * Real.log r) := by + calc + Real.rpow r (-(2 * r)) = Real.exp (Real.log r * (-(2 * r))) := + Real.rpow_def_of_pos hr (-(2 * r)) + _ = Real.exp (-(2 * r) * Real.log r) := by ring_nf + calc + Real.rpow r (-(2 * r)) = Real.exp (-(2 * r) * Real.log r) := hrpow_eq + _ ≤ Real.exp 2 := Real.exp_le_exp.mpr htwo_entropy + +/-- The singular scalar factors left after taking the note-exponent root are +uniformly bounded. This is the explicit `s,t` cancellation in the Caccioppoli +constant extraction. -/ +theorem coarseCaccioppoli_sigma_mul_singularRoot_le_exp_two {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + σ * Real.rpow s (-(q / p)) * Real.rpow (1 - s) (-(q / p)) ≤ + Real.exp 2 := by + let σ : ℝ := coarseCaccioppoliSigma s t + let q : ℝ := coarseCaccioppoliPower s t + let p : ℝ := 2 + 4 * s / σ + let e : ℝ := q / p + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hs1_pos : 0 < 1 - s := by linarith + have hσ_le_one_sub_s : σ ≤ 1 - s := by + dsimp [σ] + unfold coarseCaccioppoliSigma + linarith + have hσ_le_one : σ ≤ 1 := by + dsimp [σ] + unfold coarseCaccioppoliSigma + linarith + have hp_pos : 0 < p := by + dsimp [p] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hq_nonneg : 0 ≤ q := by + dsimp [q] + exact coarseCaccioppoli_power_nonneg hs hst + have he_nonneg : 0 ≤ e := by + dsimp [e] + exact div_nonneg hq_nonneg hp_pos.le + have hp_eq : p = 2 + 2 * q := by + dsimp [p, q, coarseCaccioppoliPower] + ring + have he_le_half : e ≤ (1 / 2 : ℝ) := by + dsimp [e] + rw [div_le_iff₀ hp_pos] + rw [hp_eq] + ring_nf + linarith + have hone_sub_two_e_nonneg : 0 ≤ 1 - 2 * e := by + linarith + have hF_pos : + 0 < + σ * Real.rpow s (-e) * Real.rpow (1 - s) (-e) := by + exact mul_pos (mul_pos hσ_pos (Real.rpow_pos_of_pos hs (-e))) + (Real.rpow_pos_of_pos hs1_pos (-e)) + have hlogF : + Real.log (σ * Real.rpow s (-e) * Real.rpow (1 - s) (-e)) = + Real.log σ - e * Real.log s - e * Real.log (1 - s) := by + have hs_rpow_pos : 0 < Real.rpow s (-e) := Real.rpow_pos_of_pos hs (-e) + have hs1_rpow_pos : + 0 < Real.rpow (1 - s) (-e) := Real.rpow_pos_of_pos hs1_pos (-e) + calc + Real.log (σ * Real.rpow s (-e) * Real.rpow (1 - s) (-e)) + = Real.log (σ * Real.rpow s (-e)) + + Real.log (Real.rpow (1 - s) (-e)) := by + rw [Real.log_mul (mul_ne_zero hσ_pos.ne' hs_rpow_pos.ne') + hs1_rpow_pos.ne'] + _ = (Real.log σ + Real.log (Real.rpow s (-e))) + + Real.log (Real.rpow (1 - s) (-e)) := by + rw [Real.log_mul hσ_pos.ne' hs_rpow_pos.ne'] + _ = (Real.log σ + (-e) * Real.log s) + + (-e) * Real.log (1 - s) := by + rw [show Real.log (Real.rpow s (-e)) = (-e) * Real.log s by + simpa using Real.log_rpow hs (-e), + show Real.log (Real.rpow (1 - s) (-e)) = + (-e) * Real.log (1 - s) by + simpa using Real.log_rpow hs1_pos (-e)] + _ = Real.log σ - e * Real.log s - e * Real.log (1 - s) := by ring + have hlog_le_two : + Real.log (σ * Real.rpow s (-e) * Real.rpow (1 - s) (-e)) ≤ 2 := by + by_cases hσ_le_s : σ ≤ s + · have hlog_s_ge : Real.log σ ≤ Real.log s := + Real.log_le_log hσ_pos hσ_le_s + have hlog_one_sub_ge : Real.log σ ≤ Real.log (1 - s) := + Real.log_le_log hσ_pos hσ_le_one_sub_s + have hneg_s : + -e * Real.log s ≤ -e * Real.log σ := by + exact mul_le_mul_of_nonpos_left hlog_s_ge (by linarith) + have hneg_one_sub : + -e * Real.log (1 - s) ≤ -e * Real.log σ := by + exact mul_le_mul_of_nonpos_left hlog_one_sub_ge (by linarith) + have hσ_log_nonpos : Real.log σ ≤ 0 := + Real.log_nonpos hσ_pos.le hσ_le_one + have hmain : + Real.log σ - e * Real.log s - e * Real.log (1 - s) ≤ + (1 - 2 * e) * Real.log σ := by + linarith + have hright_nonpos : (1 - 2 * e) * Real.log σ ≤ 0 := + mul_nonpos_of_nonneg_of_nonpos hone_sub_two_e_nonneg hσ_log_nonpos + rw [hlogF] + linarith + · have hs_le_σ : s ≤ σ := le_of_not_ge hσ_le_s + have hs_le_one_sub : s ≤ 1 - s := hs_le_σ.trans hσ_le_one_sub_s + let r : ℝ := s / σ + have hr_pos : 0 < r := by + dsimp [r] + positivity + have hr_le_one : r ≤ 1 := by + dsimp [r] + exact (div_le_one hσ_pos).2 hs_le_σ + have he_le_r : e ≤ r := by + have hq_eq : q = 2 * r := by + dsimp [q, r, coarseCaccioppoliPower] + ring + have hp_ge_two : (2 : ℝ) ≤ p := by + rw [hp_eq] + exact le_add_of_nonneg_right + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hq_nonneg) + dsimp [e] + calc + q / p ≤ q / 2 := + div_le_div_of_nonneg_left hq_nonneg (by norm_num : 0 < (2 : ℝ)) + hp_ge_two + _ = r := by + rw [hq_eq] + ring + have hlog_s_le : Real.log s ≤ Real.log (1 - s) := + Real.log_le_log hs hs_le_one_sub + have hneg_one_sub : + -e * Real.log (1 - s) ≤ -e * Real.log s := by + exact mul_le_mul_of_nonpos_left hlog_s_le (by linarith) + have hlog_r : Real.log r = Real.log s - Real.log σ := by + dsimp [r] + rw [Real.log_div hs.ne' hσ_pos.ne'] + have hσ_log_nonpos : Real.log σ ≤ 0 := + Real.log_nonpos hσ_pos.le hσ_le_one + have hfirst : + Real.log σ - e * Real.log s - e * Real.log (1 - s) ≤ + Real.log σ - 2 * e * Real.log s := by + linarith + have hsplit : + Real.log σ - 2 * e * Real.log s = + (1 - 2 * e) * Real.log σ - 2 * e * Real.log r := by + rw [hlog_r] + ring + have hdrop : + (1 - 2 * e) * Real.log σ - 2 * e * Real.log r ≤ + -2 * e * Real.log r := by + have hterm_nonpos : (1 - 2 * e) * Real.log σ ≤ 0 := + mul_nonpos_of_nonneg_of_nonpos hone_sub_two_e_nonneg hσ_log_nonpos + linarith + have hlog_r_nonpos : Real.log r ≤ 0 := + Real.log_nonpos hr_pos.le hr_le_one + have hentropy : + -2 * e * Real.log r ≤ -2 * r * Real.log r := by + have hmul : e * Real.log r ≥ r * Real.log r := by + exact mul_le_mul_of_nonpos_right he_le_r hlog_r_nonpos + linarith + have hrpow_bound : + -2 * r * Real.log r ≤ 2 := by + have h := rpow_neg_two_mul_self_le_exp_two hr_pos hr_le_one + have hlog_bound : + Real.log (Real.rpow r (-(2 * r))) ≤ 2 := + (Real.log_le_iff_le_exp (Real.rpow_pos_of_pos hr_pos (-(2 * r)))).2 h + have hlog_rpow : + Real.log (Real.rpow r (-(2 * r))) = + -(2 * r) * Real.log r := by + simpa using Real.log_rpow hr_pos (-(2 * r)) + calc + -2 * r * Real.log r = -(2 * r) * Real.log r := by ring + _ = Real.log (Real.rpow r (-(2 * r))) := hlog_rpow.symm + _ ≤ 2 := hlog_bound + rw [hlogF] + calc + Real.log σ - e * Real.log s - e * Real.log (1 - s) ≤ + Real.log σ - 2 * e * Real.log s := hfirst + _ = (1 - 2 * e) * Real.log σ - 2 * e * Real.log r := hsplit + _ ≤ -2 * e * Real.log r := hdrop + _ ≤ -2 * r * Real.log r := hentropy + _ ≤ 2 := hrpow_bound + exact (Real.log_le_iff_le_exp hF_pos).1 hlog_le_two + +theorem coarseCaccioppoliBoundaryExplicitHeightAtScale_ge_k_add_four + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + (k : ℝ) + 4 ≤ coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k := by + unfold coarseCaccioppoliBoundaryExplicitHeightAtScale + exact le_max_left _ _ + +theorem coarseCaccioppoliBoundaryExplicitHeightAtScale_le_localizedExplicitHeightAtScale + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k := by + unfold coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale + exact le_max_left _ _ + +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_k_add_four + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + (k : ℝ) + 4 ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k := by + exact le_trans + (coarseCaccioppoliBoundaryExplicitHeightAtScale_ge_k_add_four Q a s t C k) + (coarseCaccioppoliBoundaryExplicitHeightAtScale_le_localizedExplicitHeightAtScale + Q a s t C k) + +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k := by + unfold coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale + exact le_max_right _ _ + +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s_add_t + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s t C : ℝ} (k : ℕ) + (hs : 0 < s) (ht : 0 < t) : + (4 : ℝ) / (s + t) ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k := by + have hst : s < s + t := by linarith + have hpos : 0 < s + t := by linarith + have hdiv : (4 : ℝ) / (s + t) ≤ 4 / s := by + exact div_le_div_of_nonneg_left (by norm_num : 0 ≤ (4 : ℝ)) hs hst.le + exact le_trans hdiv + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s Q a s t C k) + +/-- Natural depth obtained by integerizing the localized explicit height. This +is the depth used by the small-cube Caccioppoli route. -/ +noncomputable def coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : ℕ := + Nat.ceil (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k) + +/-- Radius-indexed integerized localized height depth. -/ +noncomputable def coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) : ℝ → ℝ → ℕ := + fun ρ₁ ρ₂ => + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C (k ρ₁ ρ₂) + +/-- Real-valued height associated to the integerized localized depth. -/ +noncomputable def coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) : ℝ → ℝ → ℝ := + fun ρ₁ ρ₂ => + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t C k + ρ₁ ρ₂ : ℝ) + +/-- The integerized localized depth dominates the localized real height. -/ +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k ≤ + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k : ℝ) := by + exact Nat.le_ceil _ + +/-- The integerized localized height keeps the `k + 4` lower bound. -/ +theorem coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_k_add_four + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + (k : ℝ) + 4 ≤ + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k : ℝ) := by + exact le_trans + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_k_add_four Q a s t C k) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth Q a s t C k) + +/-- The integerized localized depth is at least the triadic gap scale. -/ +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale_ge_scale + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + k ≤ coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k := by + have hreal : + (k : ℝ) ≤ + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k : ℝ) := by + have hfour := + coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_k_add_four + Q a s t C k + nlinarith + exact_mod_cast hreal + +/-- Radius-indexed version of +`coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale_ge_scale`. -/ +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) (ρ₁ ρ₂ : ℝ) : + k ρ₁ ρ₂ ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t C k + ρ₁ ρ₂ := by + simpa [coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale_ge_scale + Q a s t C (k ρ₁ ρ₂) + +/-- The integerized localized height keeps the `4 / s` lower bound. -/ +theorem coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_four_div_s + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) : + (4 : ℝ) / s ≤ + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k : ℝ) := by + exact le_trans + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s Q a s t C k) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth Q a s t C k) + +/-- The integerized localized height keeps the `4 / (s + t)` lower bound. -/ +theorem coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_four_div_s_add_t + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s t C : ℝ} (k : ℕ) + (hs : 0 < s) (ht : 0 < t) : + (4 : ℝ) / (s + t) ≤ + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale Q a s t C k : ℝ) := by + exact le_trans + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s_add_t + Q a k hs ht) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth Q a s t C k) + +theorem coarseCaccioppoliBoundaryExplicitHeightAtScale_logBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) + (hst : s + t < 1) : + Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) ≤ + coarseCaccioppoliSigma s t * + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k * + Real.log (3 : ℝ) := by + have hσ_pos : 0 < coarseCaccioppoliSigma s t := coarseCaccioppoli_sigma_pos hst + have hlog3_pos : 0 < Real.log (3 : ℝ) := by + exact Real.log_pos (by norm_num) + have hden_pos : 0 < coarseCaccioppoliSigma s t * Real.log (3 : ℝ) := + mul_pos hσ_pos hlog3_pos + have hceil_le : + Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)) ≤ + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k := by + calc + Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)) + ≤ + ((Nat.ceil + (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ))) : ℕ) : ℝ) := by + exact Nat.le_ceil _ + _ ≤ coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k := by + unfold coarseCaccioppoliBoundaryExplicitHeightAtScale + exact le_max_right _ _ + have hscaled := + mul_le_mul_of_nonneg_right hceil_le hden_pos.le + have hden_ne : coarseCaccioppoliSigma s t * Real.log (3 : ℝ) ≠ 0 := hden_pos.ne' + calc + Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) + = (Real.log (coarseCaccioppoliBoundaryHeightLogArg Q a s t C k) / + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ))) * + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)) := by + field_simp [hden_ne] + _ ≤ coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k * + (coarseCaccioppoliSigma s t * Real.log (3 : ℝ)) := hscaled + _ = coarseCaccioppoliSigma s t * + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k * + Real.log (3 : ℝ) := by ring + +private theorem coarseCaccioppoli_le_rpow_three_of_logBound {A h σ : ℝ} + (hA_nonneg : 0 ≤ A) + (hlog : Real.log A ≤ σ * h * Real.log (3 : ℝ)) : + A ≤ Real.rpow (3 : ℝ) (σ * h) := by + by_cases hA_zero : A = 0 + · simpa [hA_zero] using + (Real.rpow_nonneg (show 0 ≤ (3 : ℝ) by norm_num) (σ * h)) + · have hA_pos : 0 < A := lt_of_le_of_ne hA_nonneg (by simpa [eq_comm] using hA_zero) + have hexp : Real.exp (Real.log A) ≤ Real.exp (σ * h * Real.log (3 : ℝ)) := + (Real.exp_le_exp).2 hlog + rw [Real.exp_log hA_pos] at hexp + calc + A ≤ Real.exp (σ * h * Real.log (3 : ℝ)) := hexp + _ = Real.rpow (3 : ℝ) (σ * h) := by + rw [show σ * h * Real.log (3 : ℝ) = Real.log (3 : ℝ) * (σ * h) by ring] + rw [Real.exp_mul, Real.exp_log (by norm_num : 0 < (3 : ℝ))] + rw [Real.rpow_eq_pow] + +theorem coarseCaccioppoliBoundaryExplicitHeightAtScale_absorption + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) + (-coarseCaccioppoliSigma s t * + coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) ≤ (1 / 4 : ℝ) := by + let h0 : ℝ := coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k + let M : ℝ := + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let A : ℝ := coarseCaccioppoliBoundaryHeightLogArg Q a s t C k + have hs1 : s < 1 := by + linarith + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + refine mul_nonneg ?_ (Real.rpow_nonneg htheta_nonneg _) + refine mul_nonneg ?_ (pow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + exact div_nonneg hC hden_nonneg + have hA_eq : A = 4 * M := by + rfl + have hA_nonneg : 0 ≤ A := by + rw [hA_eq] + nlinarith + have hA_le : + A ≤ Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0) := by + apply coarseCaccioppoli_le_rpow_three_of_logBound + · exact hA_nonneg + · simpa [A, h0] using + coarseCaccioppoliBoundaryExplicitHeightAtScale_logBound Q a s t C k hst + have hM_eq : M = (1 / 4 : ℝ) * A := by + rw [hA_eq] + ring + have hM_le : + M ≤ (1 / 4 : ℝ) * Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0) := by + rw [hM_eq] + exact mul_le_mul_of_nonneg_left hA_le (by norm_num : 0 ≤ (1 / 4 : ℝ)) + have hpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) := by + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hcancel : + Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) = 1 := by + calc + Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) = + Real.rpow (3 : ℝ) + (coarseCaccioppoliSigma s t * h0 + -coarseCaccioppoliSigma s t * h0) := by + symm + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + _ = Real.rpow (3 : ℝ) 0 := by + congr 1 + ring + _ = 1 := by simp + calc + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + = M * Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) := by + dsimp [M] + ring + _ ≤ + ((1 / 4 : ℝ) * Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0)) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0) := by + exact mul_le_mul_of_nonneg_right hM_le hpow_nonneg + _ = (1 / 4 : ℝ) * + (Real.rpow (3 : ℝ) (coarseCaccioppoliSigma s t * h0) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h0)) := by + ring + _ = (1 / 4 : ℝ) := by rw [hcancel]; ring + +theorem coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_absorption + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (k : ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) + (-coarseCaccioppoliSigma s t * + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) ≤ (1 / 4 : ℝ) := by + let hOld : ℝ := coarseCaccioppoliBoundaryExplicitHeightAtScale Q a s t C k + let hNew : ℝ := coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k + let M : ℝ := + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + have hs1 : s < 1 := by + linarith + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hOld_le_new : hOld ≤ hNew := by + dsimp [hOld, hNew] + exact coarseCaccioppoliBoundaryExplicitHeightAtScale_le_localizedExplicitHeightAtScale + Q a s t C k + have hpow_exp : + -coarseCaccioppoliSigma s t * hNew ≤ + -coarseCaccioppoliSigma s t * hOld := by + exact mul_le_mul_of_nonpos_left hOld_le_new (neg_nonpos.mpr hσ_pos.le) + have hpow_le : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hNew) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hOld) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) hpow_exp + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le (by linarith) + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg + (mul_nonneg (div_nonneg hC hden_nonneg) (pow_nonneg (by norm_num) k)) + (Real.rpow_nonneg htheta_nonneg _) + calc + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) + (-coarseCaccioppoliSigma s t * + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + = M * Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hNew) := by + dsimp [M, hNew] + ring + _ ≤ M * Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hOld) := by + exact mul_le_mul_of_nonneg_left hpow_le hM_nonneg + _ = + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hOld) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [M] + ring + _ ≤ (1 / 4 : ℝ) := by + simpa [hOld] using + coarseCaccioppoliBoundaryExplicitHeightAtScale_absorption + Q a s t C k hC hs ht hst + +theorem coarseCaccioppoli_boundary_heightChoice_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨k ρ₁ ρ₂, hscale hρ₁ hlt hρ₂, ?_, ?_⟩ + · simpa [coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryExplicitHeightAtScale_ge_k_add_four + Q a s t C (k ρ₁ ρ₂) + · simpa [coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryExplicitHeightAtScale_absorption + Q a s t C (k ρ₁ ρ₂) hC hs ht hst + +theorem coarseCaccioppoli_interior_heightChoice_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + CoarseCaccioppoliInteriorHeightChoice Q a s t C + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) := by + exact coarseCaccioppoli_boundary_heightChoice_of_explicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + +theorem coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨k ρ₁ ρ₂, hscale hρ₁ hlt hρ₂, ?_, ?_⟩ + · simpa [coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_k_add_four + Q a s t C (k ρ₁ ρ₂) + · simpa [coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_absorption + Q a s t C (k ρ₁ ρ₂) hC hs ht hst + +theorem coarseCaccioppoli_interior_heightChoice_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) : + CoarseCaccioppoliInteriorHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := by + exact coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + +@[simp] theorem coarseCaccioppoliRadiusSequence_zero : + coarseCaccioppoliRadiusSequence 0 = (1 / 3 : ℝ) := by + unfold coarseCaccioppoliRadiusSequence + norm_num + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Interior.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Interior.lean new file mode 100644 index 0000000000..2610c536c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/Interior.lean @@ -0,0 +1,463 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary + +/-! # Interior -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoli_nonneg_of_radiusAgreement + {F G : ℝ → ℝ} (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) : + ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ := by + intro ρ hρ hρ_upper + rw [hagree hρ hρ_upper] + exact hG_nonneg hρ hρ_upper + +/-- Agreement of radius quantities also transfers the boundedness hypothesis +needed by the deterministic radius iteration. -/ +theorem coarseCaccioppoli_radiusBoundedAbove_of_radiusAgreement + {F G : ℝ → ℝ} (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove G) : + CoarseCaccioppoliRadiusBoundedAbove F := by + rcases hbounded with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + intro ρ hρ hρ_upper + rw [hagree hρ hρ_upper] + exact hB hρ hρ_upper + +/-- A boundary note-shaped raw estimate for `G` can be reused for `F` whenever +the two radius quantities agree on the deterministic interval. -/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h G) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₁_upper : ρ₁ ≤ 1 := le_trans hlt.le hρ₂ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + simpa [hagree hρ₁ hρ₁_upper, hagree hρ₂_lower hρ₂] using + hraw hρ₁ hlt hρ₂ + +/-- The interior middle layer can consume the same local note-shaped estimate +as the boundary proof, provided the underlying radius quantity is unchanged by +centering. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_boundary_noteEstimate_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h G) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F := by + unfold CoarseCaccioppoliInteriorNoteRawEstimate + exact coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + Q a s t C uL2Sq h hagree hraw + +/-- The centered interior proof packages into the same pre-recurrence middle +layer once the raw estimate is transported across a radius agreement +`F = G`. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_boundary_noteEstimate_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h G) + (hctrl : CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + unfold CoarseCaccioppoliInteriorNoteCoefficientControl at hctrl + unfold CoarseCaccioppoliInteriorPreRecurrence + exact coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate + Q a s t C uL2Sq h + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + Q a s t C uL2Sq h hagree hraw) + hctrl + +/-- Interior coarse Caccioppoli from the same note-shaped local estimate as the +boundary proof, together with an abstract radius agreement encoding the +centering step `v := u - (u)_Q`. -/ +theorem coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_of_radiusAgreement_of_heightChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hraw : CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h G) + (hheight : CoarseCaccioppoliInteriorHeightChoice Q a s t C h) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorBound + exact coarseCaccioppoli_boundary_qone_of_noteEstimate_of_heightChoice_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu + (coarseCaccioppoli_nonneg_of_radiusAgreement hagree hG_nonneg) + (coarseCaccioppoli_radiusBoundedAbove_of_radiusAgreement hagree hG_bounded) + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + Q a s t C uL2Sq h hagree hraw) + hheight hcrossscale + +/-- Interior coarse Caccioppoli in the completed pre-Besov form: the same +boundary-style local estimate as above, transported across the centering +agreement `F = G`, now combines with the note's actual explicit height choice +without any extra cross-scale hypothesis. -/ +theorem coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) G) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorExplicitHeightBound + exact coarseCaccioppoli_boundary_qone_of_noteEstimate_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu + (coarseCaccioppoli_nonneg_of_radiusAgreement hagree hG_nonneg) + (coarseCaccioppoli_radiusBoundedAbove_of_radiusAgreement hagree hG_bounded) + hscale + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hagree hraw) + +/-- Interior coarse Caccioppoli with the localized explicit height, transported +from a boundary-style note estimate across the radius agreement. -/ +theorem coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) G) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorExplicitHeightBound + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu + (coarseCaccioppoli_nonneg_of_radiusAgreement hagree hG_nonneg) + (coarseCaccioppoli_radiusBoundedAbove_of_radiusAgreement hagree hG_bounded) + hscale + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusAgreement + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hagree hraw) + +/-- Interior coarse Caccioppoli with the localized explicit height, transported +from a boundary-style note estimate available only on the deterministic +Chapter-3 radius sequence. -/ +theorem coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_on_radiusSequence_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + ∀ n : ℕ, + G (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + G (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt (G (coarseCaccioppoliRadiusSequence (n + 1)))) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hG : + G (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorExplicitHeightBound + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_on_radiusSequence_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hG_nonneg hG_bounded hscale hraw + have hEq : F (1 / 3 : ℝ) = G (1 / 3 : ℝ) := by + exact hagree (by norm_num) (by norm_num) + calc + F (1 / 3 : ℝ) = G (1 / 3 : ℝ) := hEq + _ ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := hG + +/-- Interior coarse Caccioppoli in the same pre-Besov explicit-height form, +when the caller already supplies the interior local estimate directly rather +than transporting it from the boundary proof. -/ +theorem coarseCaccioppoli_interior_qone_of_noteEstimate_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorExplicitHeightBound + unfold CoarseCaccioppoliInteriorNoteRawEstimate at hraw + exact coarseCaccioppoli_boundary_qone_of_noteEstimate_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hnonneg hbounded hscale hraw + +/-- Interior coarse Caccioppoli with the localized explicit height, when the +caller supplies the interior note estimate directly. -/ +theorem coarseCaccioppoli_interior_qone_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hraw : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorExplicitHeightBound + unfold CoarseCaccioppoliInteriorNoteRawEstimate at hraw + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hnonneg hbounded hscale hraw + +/-- Interior coarse Caccioppoli currently reuses the same radius-iteration +backbone as the boundary version, provided the caller supplies the interior +radius-recursion explicitly. -/ +theorem coarseCaccioppoli_interior_qone_of_radius_recurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : + CoarseCaccioppoliRadiusRecurrence F + (coarseCaccioppoliBoundaryRecursionRhs Q a s t C uL2Sq) + (coarseCaccioppoliBeta s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + unfold coarseCaccioppoliInteriorBound + exact coarseCaccioppoli_boundary_qone_of_radius_recurrence + Q a s t C uL2Sq hC hs ht hst hu hbounded hrec + +/-- Interior coarse Caccioppoli from the same already-absorbed pre-recurrence +surface as the boundary version. -/ +theorem coarseCaccioppoli_interior_qone_of_preRecurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hpre : CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + unfold CoarseCaccioppoliInteriorPreRecurrence at hpre + exact coarseCaccioppoli_interior_qone_of_radius_recurrence + Q a s t C uL2Sq hC hs ht hst hu hbounded + (coarseCaccioppoli_boundary_radius_recurrence_of_preRecurrence + Q a s t C uL2Sq hnonneg hpre) + +/-- Interior coarse Caccioppoli from the explicit-height pre-recurrence middle +layer. -/ +theorem coarseCaccioppoli_interior_qone_of_explicitHeightPreRecurrence {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hpre : + CoarseCaccioppoliInteriorExplicitHeightPreRecurrence Q a s t C uL2Sq F) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + unfold CoarseCaccioppoliInteriorExplicitHeightPreRecurrence at hpre + unfold coarseCaccioppoliInteriorExplicitHeightBound + exact coarseCaccioppoli_boundary_qone_of_explicitHeightPreRecurrence + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded hpre + +/-- Interior pre-recurrence from the same note-shaped raw estimate and +note-shaped coefficient-control surface as the boundary version. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_noteEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hraw : CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F) + (hctrl : CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + unfold CoarseCaccioppoliInteriorNoteRawEstimate at hraw + unfold CoarseCaccioppoliInteriorNoteCoefficientControl at hctrl + unfold CoarseCaccioppoliInteriorPreRecurrence + exact coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate + Q a s t C uL2Sq h hraw hctrl + +/-- Interior pre-recurrence from the note-shaped raw estimate plus the two +remaining note-specific bookkeeping obligations. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_noteEstimate_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hraw : CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + unfold CoarseCaccioppoliInteriorNoteRawEstimate at hraw + unfold CoarseCaccioppoliInteriorPreRecurrence + exact coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst hraw habs hcross + +/-- Interior coarse Caccioppoli from the same raw local-estimate plus +coefficient-control surface as the boundary version. -/ +theorem coarseCaccioppoli_interior_qone_of_rawEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + {F : ℝ → ℝ} {α B : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliInteriorRawEstimate F α B) + (hctrl : CoarseCaccioppoliInteriorCoefficientControl Q a s t C uL2Sq α B) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + unfold CoarseCaccioppoliInteriorRawEstimate at hraw + unfold CoarseCaccioppoliInteriorCoefficientControl at hctrl + apply coarseCaccioppoli_interior_qone_of_preRecurrence + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded + exact coarseCaccioppoli_boundary_preRecurrence_of_rawEstimate + Q a s t C uL2Sq hraw hctrl + +/-- Interior coarse Caccioppoli from the same note-shaped raw estimate and +note-shaped coefficient-control surface as the boundary version. -/ +theorem coarseCaccioppoli_interior_qone_of_noteEstimate {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F) + (hctrl : CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + unfold CoarseCaccioppoliInteriorNoteRawEstimate at hraw + unfold CoarseCaccioppoliInteriorNoteCoefficientControl at hctrl + exact coarseCaccioppoli_interior_qone_of_rawEstimate + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded hraw hctrl + +/-- The split interior note-specific bookkeeping conditions imply the packaged +note-shaped coefficient-control surface. -/ +theorem coarseCaccioppoli_interior_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h := by + exact + coarseCaccioppoli_boundary_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst habs hcross + +/-- The same explicit `h`-choice bookkeeping and stronger triadic-scale cross +estimate also recover the packaged interior coefficient-control surface. -/ +theorem coarseCaccioppoli_interior_noteCoefficientControl_of_heightChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hheight : CoarseCaccioppoliInteriorHeightChoice Q a s t C h) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h := by + exact + coarseCaccioppoli_boundary_noteCoefficientControl_of_heightChoice_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu hheight hcrossscale + +/-- Interior coarse Caccioppoli from the note-shaped raw estimate plus the two +remaining note-specific bookkeeping obligations. -/ +theorem coarseCaccioppoli_interior_qone_of_noteEstimate_of_absorptionCondition_of_crossTermBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + have hctrl : + CoarseCaccioppoliInteriorNoteCoefficientControl Q a s t C uL2Sq h := + coarseCaccioppoli_interior_noteCoefficientControl_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst habs hcross + exact coarseCaccioppoli_interior_qone_of_noteEstimate + Q a s t C uL2Sq h hC hs ht hst hu hnonneg hbounded hraw hctrl + +/-- Interior coarse Caccioppoli from the note-shaped local estimate, the +explicit note-facing `h` choice, and the remaining stronger triadic-scale +cross-term inequality. -/ +theorem coarseCaccioppoli_interior_qone_of_noteEstimate_of_heightChoice_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hraw : CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F) + (hheight : CoarseCaccioppoliInteriorHeightChoice Q a s t C h) + (hcrossscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C * Real.rpow (3 : ℝ) (2 * s * h ρ₁ ρ₂) ≤ + Real.rpow + (C / (s * (1 - s)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) + (coarseCaccioppoliPower s t) * + Real.rpow (((3 : ℝ) ^ k) / 81) (coarseCaccioppoliPower s t)) : + F (1 / 3 : ℝ) ≤ coarseCaccioppoliInteriorBound Q a s t C uL2Sq := by + apply coarseCaccioppoli_interior_qone_of_noteEstimate + Q a s t C uL2Sq h hC hs ht hst hu hnonneg hbounded hraw + exact + coarseCaccioppoli_interior_noteCoefficientControl_of_heightChoice_of_triadicGapScaleChoice + Q a s t C uL2Sq h hC hs ht hst hu hheight hcrossscale + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration.lean new file mode 100644 index 0000000000..2b5ae7b672 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration.lean @@ -0,0 +1,648 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.RadiusIteration.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CrossTerm +public import Mathlib.Data.Nat.Choose.Bounds + +/-! # Radius Iteration -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoliBoundaryAlphaOfHeight_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) (h : ℝ → ℝ → ℝ) + {ρ₁ ρ₂ : ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) (hρ : ρ₁ < ρ₂) : + 0 ≤ coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ := by + have hs1 : s < 1 := by + linarith + have hden_nonneg : 0 ≤ s * (1 - s) := by + nlinarith + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + unfold coarseCaccioppoliBoundaryAlphaOfHeight + exact mul_nonneg + (mul_nonneg + (mul_nonneg (div_nonneg hC hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hρ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.rpow_nonneg htheta_nonneg _) + +theorem coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) (h : ℝ → ℝ → ℝ) + {ρ₁ ρ₂ : ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (hρ : ρ₁ < ρ₂) : + 0 ≤ coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ := by + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + exact mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg hC (coarseCaccioppoliGapInv_nonneg hρ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.rpow_nonneg hLambda_nonneg _)) + (Real.sqrt_nonneg _) + +theorem coarseCaccioppoli_absorb_cross_term + {x α B : ℝ} (hx : 0 ≤ x) (hα : α ≤ (1 / 4 : ℝ)) : + α * x + B * Real.sqrt x ≤ (1 / 2 : ℝ) * x + B ^ (2 : ℕ) := by + have hαx : α * x ≤ (1 / 4 : ℝ) * x := by + exact mul_le_mul_of_nonneg_right hα hx + have hsq : + (Real.sqrt x / 2) ^ (2 : ℕ) = x / 4 := by + calc + (Real.sqrt x / 2) ^ (2 : ℕ) = (Real.sqrt x) ^ (2 : ℕ) / 4 := by + ring_nf + _ = x / 4 := by + rw [Real.sq_sqrt hx] + have hyoung : B * Real.sqrt x ≤ B ^ (2 : ℕ) + x / 4 := by + calc + B * Real.sqrt x = 2 * B * (Real.sqrt x / 2) := by ring + _ ≤ B ^ (2 : ℕ) + (Real.sqrt x / 2) ^ (2 : ℕ) := by + simpa [pow_two] using (two_mul_le_add_sq B (Real.sqrt x / 2)) + _ = B ^ (2 : ℕ) + x / 4 := by rw [hsq] + calc + α * x + B * Real.sqrt x ≤ (1 / 4 : ℝ) * x + B * Real.sqrt x := by + gcongr + _ ≤ (1 / 4 : ℝ) * x + (B ^ (2 : ℕ) + x / 4) := by + gcongr + _ = (1 / 2 : ℝ) * x + B ^ (2 : ℕ) := by ring + +private theorem coarseCaccioppoli_radius_iteration_term_le_majorant + (β : ℝ) (_hβ : 0 ≤ β) : + ∀ n : ℕ, + coarseCaccioppoliRadiusIterationTerm β n ≤ + (2 : ℝ) ^ Nat.ceil β * + ((((n + 2 : ℕ) : ℝ) ^ (2 * Nat.ceil β)) * (1 / 2 : ℝ) ^ n) := by + intro n + let k : ℕ := Nat.ceil β + let m : ℝ := (((n + 1) * (n + 2) : ℕ) : ℝ) + have hm_nonneg : 0 ≤ m := by + dsimp [m] + positivity + have hm_one : 1 ≤ m := by + have hn1_nat : 1 ≤ n + 1 := Nat.succ_le_succ (Nat.zero_le n) + have hn2_nat : 1 ≤ n + 2 := by + omega + have hn1 : (1 : ℝ) ≤ ((n + 1 : ℕ) : ℝ) := by + exact_mod_cast hn1_nat + have hn2 : (1 : ℝ) ≤ ((n + 2 : ℕ) : ℝ) := by + exact_mod_cast hn2_nat + have hmul : + (1 : ℝ) * 1 ≤ ((n + 1 : ℕ) : ℝ) * ((n + 2 : ℕ) : ℝ) := by + exact mul_le_mul hn1 hn2 (by positivity) (by positivity) + simpa [m] using hmul + have hgap_rpow : + Real.rpow + (coarseCaccioppoliRadiusSequence (n + 1) - coarseCaccioppoliRadiusSequence n) + (-β) = + Real.rpow ((3 / 2 : ℝ) * m) β := by + rw [coarseCaccioppoliRadiusSequence_succ_sub] + calc + Real.rpow (2 / (3 * (((n + 1) * (n + 2) : ℕ) : ℝ))) (-β) + = Real.rpow ((2 / (3 * (((n + 1) * (n + 2) : ℕ) : ℝ)))⁻¹) β := by + simpa using + (Real.rpow_neg_eq_inv_rpow + (2 / (3 * (((n + 1) * (n + 2) : ℕ) : ℝ))) β) + _ = Real.rpow ((3 / 2 : ℝ) * m) β := by + have hm_pos : 0 < m := by + dsimp [m] + positivity + have hm_ne : m ≠ 0 := hm_pos.ne' + have hinv : (2 / (3 * m))⁻¹ = (3 / 2 : ℝ) * m := by + field_simp [hm_ne] + simpa [m] using congrArg (fun x : ℝ => Real.rpow x β) hinv + have hk_le : β ≤ (k : ℝ) := Nat.le_ceil β + have hbase_one : 1 ≤ (3 / 2 : ℝ) * m := by + nlinarith + have hbase_nonneg : 0 ≤ (3 / 2 : ℝ) * m := by positivity + have hbase_le : (3 / 2 : ℝ) * m ≤ 2 * (((n + 2 : ℕ) : ℝ) ^ 2) := by + have hm_le : m ≤ (((n + 2 : ℕ) : ℝ) ^ 2) := by + have hstep : ((n + 1 : ℕ) : ℝ) ≤ ((n + 2 : ℕ) : ℝ) := by + exact_mod_cast Nat.le_succ (n + 1) + have hnonneg : 0 ≤ ((n + 2 : ℕ) : ℝ) := by positivity + have hmul : + (((n + 1 : ℕ) : ℝ) * ((n + 2 : ℕ) : ℝ)) ≤ + ((n + 2 : ℕ) : ℝ) * ((n + 2 : ℕ) : ℝ) := + mul_le_mul_of_nonneg_right hstep hnonneg + simpa [m, pow_two] using hmul + nlinarith + calc + coarseCaccioppoliRadiusIterationTerm β n + = (1 / 2 : ℝ) ^ n * Real.rpow ((3 / 2 : ℝ) * m) β := by + rw [coarseCaccioppoliRadiusIterationTerm, hgap_rpow] + _ ≤ (1 / 2 : ℝ) ^ n * Real.rpow ((3 / 2 : ℝ) * m) (k : ℝ) := by + gcongr + exact Real.rpow_le_rpow_of_exponent_le hbase_one hk_le + _ = (1 / 2 : ℝ) ^ n * (((3 / 2 : ℝ) * m) ^ k) := by + have hnat : Real.rpow ((3 / 2 : ℝ) * m) (k : ℝ) = (((3 / 2 : ℝ) * m) ^ k) := by + exact Real.rpow_natCast ((3 / 2 : ℝ) * m) k + rw [hnat] + _ ≤ (1 / 2 : ℝ) ^ n * (2 * (((n + 2 : ℕ) : ℝ) ^ 2)) ^ k := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + exact pow_le_pow_left₀ hbase_nonneg hbase_le k + _ = (2 : ℝ) ^ k * ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n) := by + rw [mul_pow, pow_mul] + ring + +private theorem coarseCaccioppoli_radius_iteration_term_summable + (β : ℝ) (hβ : 0 ≤ β) : + Summable (coarseCaccioppoliRadiusIterationTerm β) := by + let k : ℕ := Nat.ceil β + have hhalf : ‖(1 / 2 : ℝ)‖ < 1 := by + norm_num + have hpoly : + Summable (fun n : ℕ => (n : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ n) := + summable_pow_mul_geometric_of_norm_lt_one (2 * k) hhalf + have hshift : + Summable (fun n : ℕ => ((n + 2 : ℕ) : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ (n + 2)) := + (summable_nat_add_iff + (f := fun n : ℕ => (n : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ n) 2).2 hpoly + have hmajor : + Summable (fun n : ℕ => + (2 : ℝ) ^ k * ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n)) := by + have hfun : + (fun n : ℕ => + (2 : ℝ) ^ (k + 2) * + ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ (n + 2))) = + (fun n : ℕ => + (2 : ℝ) ^ k * ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n)) := by + funext n + rw [pow_add, pow_two] + ring_nf + rw [← hfun] + exact hshift.mul_left ((2 : ℝ) ^ (k + 2)) + exact hmajor.of_nonneg_of_le + (fun n => coarseCaccioppoliRadiusIterationTerm_nonneg β n) + (fun n => coarseCaccioppoli_radius_iteration_term_le_majorant β hβ n) + +/-- The deterministic radius-iteration constant is nonnegative. -/ +theorem coarseCaccioppoliRadiusIterationConst_nonneg (β : ℝ) : + 0 ≤ coarseCaccioppoliRadiusIterationConst β := by + unfold coarseCaccioppoliRadiusIterationConst + exact tsum_nonneg fun n => coarseCaccioppoliRadiusIterationTerm_nonneg β n + +/-- +Explicit polynomial-geometric majorant for the deterministic radius-iteration +constant. + +This is the scalar bottleneck isolated from the Caccioppoli proof: the final +uniform public constant only has to bound this displayed series after taking +the note exponent root. +-/ +theorem coarseCaccioppoliRadiusIterationConst_le_majorant_tsum + (β : ℝ) (hβ : 0 ≤ β) : + coarseCaccioppoliRadiusIterationConst β ≤ + ∑' n : ℕ, + (2 : ℝ) ^ Nat.ceil β * + ((((n + 2 : ℕ) : ℝ) ^ (2 * Nat.ceil β)) * (1 / 2 : ℝ) ^ n) := by + let k : ℕ := Nat.ceil β + have hhalf : ‖(1 / 2 : ℝ)‖ < 1 := by + norm_num + have hpoly : + Summable (fun n : ℕ => (n : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ n) := + summable_pow_mul_geometric_of_norm_lt_one (2 * k) hhalf + have hshift : + Summable (fun n : ℕ => ((n + 2 : ℕ) : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ (n + 2)) := + (summable_nat_add_iff + (f := fun n : ℕ => (n : ℝ) ^ (2 * k) * (1 / 2 : ℝ) ^ n) 2).2 hpoly + have hmajor : + Summable (fun n : ℕ => + (2 : ℝ) ^ k * ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n)) := by + have hfun : + (fun n : ℕ => + (2 : ℝ) ^ (k + 2) * + ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ (n + 2))) = + (fun n : ℕ => + (2 : ℝ) ^ k * ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n)) := by + funext n + rw [pow_add, pow_two] + ring_nf + rw [← hfun] + exact hshift.mul_left ((2 : ℝ) ^ (k + 2)) + unfold coarseCaccioppoliRadiusIterationConst + simpa [k] using + (coarseCaccioppoli_radius_iteration_term_summable β hβ).tsum_le_tsum + (fun n => coarseCaccioppoli_radius_iteration_term_le_majorant β hβ n) + hmajor + +private theorem coarseCaccioppoli_shifted_pow_le_factorial_mul_choose + (m n : ℕ) : + (((n + 2 : ℕ) : ℝ) ^ m) ≤ + (m.factorial : ℝ) * (((n + m + 1).choose m : ℕ) : ℝ) := by + have h := + Nat.pow_le_choose (α := ℝ) m (n + m + 1) + have hfac_pos : (0 : ℝ) < (m.factorial : ℝ) := by + exact_mod_cast Nat.factorial_pos m + have hmul := + (div_le_iff₀ hfac_pos).1 h + have hnat : n + m + 1 + 1 - m = n + 2 := by + omega + simpa [hnat, Nat.cast_pow, mul_comm, mul_left_comm, mul_assoc] using hmul + +private theorem coarseCaccioppoli_shifted_choose_geometric_tsum_le + (m : ℕ) : + (∑' n : ℕ, + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) ≤ + (2 : ℝ) ^ (m + 2) := by + let f : ℕ → ℝ := fun n => + (((n + m).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n + have hhalf : ‖(1 / 2 : ℝ)‖ < 1 := by + norm_num + have hf : Summable f := by + simpa [f] using + (summable_choose_mul_geometric_of_norm_lt_one (R := ℝ) m hhalf) + have hshift : + (∑' n : ℕ, + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) = + 2 * ∑' n : ℕ, f (n + 1) := by + calc + (∑' n : ℕ, + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) + = ∑' n : ℕ, 2 * f (n + 1) := by + apply tsum_congr + intro n + dsimp [f] + rw [show n + 1 + m = n + m + 1 by omega, pow_succ] + ring + _ = 2 * ∑' n : ℕ, f (n + 1) := by + rw [tsum_mul_left] + have htail : + ∑' n : ℕ, f (n + 1) ≤ ∑' n : ℕ, f n := by + have hsum := hf.sum_add_tsum_nat_add 1 + have hfirst_nonneg : 0 ≤ ∑ n ∈ Finset.range 1, f n := by + refine Finset.sum_nonneg ?_ + intro n _hn + dsimp [f] + exact mul_nonneg (by positivity) (pow_nonneg (by norm_num) n) + linarith + have htsum : + (∑' n : ℕ, f n) = (2 : ℝ) ^ (m + 1) := by + have hclosed := + (tsum_choose_mul_geometric_of_norm_lt_one (𝕜 := ℝ) m hhalf) + have hhalf_sub : (1 - (1 / 2 : ℝ)) = (1 / 2 : ℝ) := by + norm_num + calc + (∑' n : ℕ, f n) + = 1 / (1 - (1 / 2 : ℝ)) ^ (m + 1) := by + simpa [f] using hclosed + _ = 1 / (1 / 2 : ℝ) ^ (m + 1) := by rw [hhalf_sub] + _ = (2 : ℝ) ^ (m + 1) := by + rw [one_div, ← inv_pow] + norm_num + calc + (∑' n : ℕ, + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) + = 2 * ∑' n : ℕ, f (n + 1) := hshift + _ ≤ 2 * ∑' n : ℕ, f n := by + exact mul_le_mul_of_nonneg_left htail (by norm_num) + _ = 2 * (2 : ℝ) ^ (m + 1) := by rw [htsum] + _ = (2 : ℝ) ^ (m + 2) := by + rw [show m + 2 = m + 1 + 1 by omega, pow_succ] + ring + +private theorem coarseCaccioppoli_shifted_pow_geometric_tsum_le + (m : ℕ) : + (∑' n : ℕ, (((n + 2 : ℕ) : ℝ) ^ m) * (1 / 2 : ℝ) ^ n) ≤ + (m.factorial : ℝ) * (2 : ℝ) ^ (m + 2) := by + have hhalf : ‖(1 / 2 : ℝ)‖ < 1 := by + norm_num + have hright : + Summable (fun n : ℕ => + (m.factorial : ℝ) * + ((((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n)) := by + have hchoose : + Summable (fun n : ℕ => + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) := by + have hbase : + Summable (fun n : ℕ => + (((n + m).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) := by + simpa using + (summable_choose_mul_geometric_of_norm_lt_one (R := ℝ) m hhalf) + exact + (((summable_nat_add_iff 1).2 hbase).mul_left (2 : ℝ)).congr + (fun n => by + rw [show n + 1 + m = n + m + 1 by omega, pow_succ] + ring) + exact hchoose.mul_left (m.factorial : ℝ) + have hterm : ∀ n : ℕ, + (((n + 2 : ℕ) : ℝ) ^ m) * (1 / 2 : ℝ) ^ n ≤ + (m.factorial : ℝ) * + ((((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) := by + intro n + have hpow := + coarseCaccioppoli_shifted_pow_le_factorial_mul_choose m n + have hgeom_nonneg : 0 ≤ (1 / 2 : ℝ) ^ n := + pow_nonneg (by norm_num) n + calc + (((n + 2 : ℕ) : ℝ) ^ m) * (1 / 2 : ℝ) ^ n + ≤ ((m.factorial : ℝ) * (((n + m + 1).choose m : ℕ) : ℝ)) * + (1 / 2 : ℝ) ^ n := + mul_le_mul_of_nonneg_right hpow hgeom_nonneg + _ = + (m.factorial : ℝ) * + ((((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) := by + ring + have hleft : + Summable (fun n : ℕ => + (((n + 2 : ℕ) : ℝ) ^ m) * (1 / 2 : ℝ) ^ n) := by + exact Summable.of_nonneg_of_le + (fun n => mul_nonneg (pow_nonneg (by positivity) m) + (pow_nonneg (by norm_num) n)) + hterm hright + calc + (∑' n : ℕ, (((n + 2 : ℕ) : ℝ) ^ m) * (1 / 2 : ℝ) ^ n) + ≤ ∑' n : ℕ, + (m.factorial : ℝ) * + ((((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n) := + hleft.tsum_le_tsum hterm hright + _ = + (m.factorial : ℝ) * + ∑' n : ℕ, + (((n + m + 1).choose m : ℕ) : ℝ) * (1 / 2 : ℝ) ^ n := by + rw [tsum_mul_left] + _ ≤ (m.factorial : ℝ) * (2 : ℝ) ^ (m + 2) := by + exact mul_le_mul_of_nonneg_left + (coarseCaccioppoli_shifted_choose_geometric_tsum_le m) + (by positivity) + +/-- +Factorial-geometric upper bound for the deterministic radius-iteration +constant. This is the quantitative form needed to make the final Caccioppoli +constant dimension-only: after the note exponent root, the remaining growth is +controlled by `σ * ceil β`. +-/ +theorem coarseCaccioppoliRadiusIterationConst_le_factorial_majorant + (β : ℝ) (hβ : 0 ≤ β) : + let k : ℕ := Nat.ceil β + coarseCaccioppoliRadiusIterationConst β ≤ + (4 : ℝ) * (2 : ℝ) ^ (3 * k) * (((2 * k).factorial : ℕ) : ℝ) := by + let k : ℕ := Nat.ceil β + have hmajor := + coarseCaccioppoliRadiusIterationConst_le_majorant_tsum β hβ + have hseries := + coarseCaccioppoli_shifted_pow_geometric_tsum_le (2 * k) + have hconst_nonneg : 0 ≤ (2 : ℝ) ^ k := + pow_nonneg (by norm_num) k + calc + coarseCaccioppoliRadiusIterationConst β + ≤ ∑' n : ℕ, + (2 : ℝ) ^ k * + ((((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n) := by + simpa [k] using hmajor + _ = + (2 : ℝ) ^ k * + ∑' n : ℕ, + (((n + 2 : ℕ) : ℝ) ^ (2 * k)) * (1 / 2 : ℝ) ^ n := by + rw [tsum_mul_left] + _ ≤ + (2 : ℝ) ^ k * + (((2 * k).factorial : ℕ) : ℝ) * (2 : ℝ) ^ (2 * k + 2) := by + nlinarith [mul_le_mul_of_nonneg_left hseries hconst_nonneg] + _ = + (4 : ℝ) * (2 : ℝ) ^ (3 * k) * (((2 * k).factorial : ℕ) : ℝ) := by + rw [show 2 * k + 2 = 2 * k + 1 + 1 by omega, pow_succ, + show 3 * k = k + 2 * k by omega, pow_add] + ring + +/-- +Polynomial-geometric form of the radius-iteration constant. Compared with +`coarseCaccioppoliRadiusIterationConst_le_factorial_majorant`, this replaces +the factorial by the elementary power bound `n! <= n^n`. +-/ +theorem coarseCaccioppoliRadiusIterationConst_le_power_majorant + (β : ℝ) (hβ : 0 ≤ β) : + let k : ℕ := Nat.ceil β + coarseCaccioppoliRadiusIterationConst β ≤ + (4 : ℝ) * (2 : ℝ) ^ (3 * k) * (((2 * k : ℕ) : ℝ) ^ (2 * k)) := by + let k : ℕ := Nat.ceil β + have hfac := + coarseCaccioppoliRadiusIterationConst_le_factorial_majorant β hβ + have hfac_le : + (((2 * k).factorial : ℕ) : ℝ) ≤ (((2 * k : ℕ) : ℝ) ^ (2 * k)) := by + exact_mod_cast Nat.factorial_le_pow (2 * k) + have hfront_nonneg : 0 ≤ (4 : ℝ) * (2 : ℝ) ^ (3 * k) := by + positivity + calc + coarseCaccioppoliRadiusIterationConst β + ≤ (4 : ℝ) * (2 : ℝ) ^ (3 * k) * + (((2 * k).factorial : ℕ) : ℝ) := by + simpa [k] using hfac + _ ≤ (4 : ℝ) * (2 : ℝ) ^ (3 * k) * + (((2 * k : ℕ) : ℝ) ^ (2 * k)) := by + exact mul_le_mul_of_nonneg_left hfac_le hfront_nonneg + +private theorem coarseCaccioppoli_radius_iteration_raw + {F : ℝ → ℝ} {A β : ℝ} (hrec : CoarseCaccioppoliRadiusRecurrence F A β) : + ∀ N : ℕ, + F (coarseCaccioppoliRadiusSequence 0) ≤ + (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + intro N + induction N with + | zero => + simp [coarseCaccioppoliRadiusSequence_zero] + | succ N hN => + have hmemN := coarseCaccioppoliRadiusSequence_mem_Icc N + have hmemNSucc := coarseCaccioppoliRadiusSequence_mem_Icc (N + 1) + have hlt : coarseCaccioppoliRadiusSequence N < coarseCaccioppoliRadiusSequence (N + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self N) + have hstep := + hrec hmemN.1 hlt hmemNSucc.2 + calc + F (coarseCaccioppoliRadiusSequence 0) + ≤ (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := hN + _ ≤ (1 / 2 : ℝ) ^ N * + ((1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (N + 1)) + + A * Real.rpow + (coarseCaccioppoliRadiusSequence (N + 1) - + coarseCaccioppoliRadiusSequence N) + (-β)) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + gcongr + _ = (1 / 2 : ℝ) ^ (N + 1) * F (coarseCaccioppoliRadiusSequence (N + 1)) + + A * Finset.sum (Finset.range (N + 1)) + (coarseCaccioppoliRadiusIterationTerm β) := by + rw [Finset.sum_range_succ, coarseCaccioppoliRadiusIterationTerm] + rw [pow_succ] + ring_nf + +theorem coarseCaccioppoli_radiusSequenceRecurrence_of_radiusRecurrence + {F : ℝ → ℝ} {A β : ℝ} (hrec : CoarseCaccioppoliRadiusRecurrence F A β) : + CoarseCaccioppoliRadiusSequenceRecurrence F A β := by + intro n + exact + hrec + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + (coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n)) + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + +private theorem coarseCaccioppoli_radius_iteration_raw_of_sequenceRecurrence + {F : ℝ → ℝ} {A β : ℝ} (hrec : CoarseCaccioppoliRadiusSequenceRecurrence F A β) : + ∀ N : ℕ, + F (coarseCaccioppoliRadiusSequence 0) ≤ + (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + intro N + induction N with + | zero => + simp [coarseCaccioppoliRadiusSequence_zero] + | succ N hN => + have hstep := hrec N + calc + F (coarseCaccioppoliRadiusSequence 0) + ≤ (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := hN + _ ≤ (1 / 2 : ℝ) ^ N * + ((1 / 2 : ℝ) * F (coarseCaccioppoliRadiusSequence (N + 1)) + + A * Real.rpow + (coarseCaccioppoliRadiusSequence (N + 1) - + coarseCaccioppoliRadiusSequence N) + (-β)) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + gcongr + _ = (1 / 2 : ℝ) ^ (N + 1) * F (coarseCaccioppoliRadiusSequence (N + 1)) + + A * Finset.sum (Finset.range (N + 1)) + (coarseCaccioppoliRadiusIterationTerm β) := by + rw [Finset.sum_range_succ, coarseCaccioppoliRadiusIterationTerm] + rw [pow_succ] + ring_nf + +/-- Quantitative radius iteration on `[1/3, 1]` with the `1/2`-absorption +used in the Chapter-3 coarse Caccioppoli proof. -/ +theorem coarseCaccioppoli_radius_iteration + {F : ℝ → ℝ} {A β : ℝ} + (hβ : 0 ≤ β) (hA : 0 ≤ A) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : CoarseCaccioppoliRadiusRecurrence F A β) : + F (1 / 3 : ℝ) ≤ A * coarseCaccioppoliRadiusIterationConst β := by + rcases hbounded with ⟨B, hB⟩ + have hsum : Summable (coarseCaccioppoliRadiusIterationTerm β) := + coarseCaccioppoli_radius_iteration_term_summable β hβ + have hraw : + ∀ N : ℕ, + F (1 / 3 : ℝ) ≤ + (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + intro N + have hNmem := coarseCaccioppoliRadiusSequence_mem_Icc N + calc + F (1 / 3 : ℝ) + = F (coarseCaccioppoliRadiusSequence 0) := by simp [coarseCaccioppoliRadiusSequence_zero] + _ ≤ (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := + coarseCaccioppoli_radius_iteration_raw hrec N + _ ≤ (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + have hBN : F (coarseCaccioppoliRadiusSequence N) ≤ B := hB hNmem.1 hNmem.2 + have hhalf_nonneg : 0 ≤ (1 / 2 : ℝ) ^ N := by positivity + have hmul : + (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) ≤ + (1 / 2 : ℝ) ^ N * B := + mul_le_mul_of_nonneg_left hBN hhalf_nonneg + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hmul + (A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β)) + apply le_of_forall_pos_le_add + intro ε hε + have hpow := + (tendsto_pow_atTop_nhds_zero_of_abs_lt_one (by norm_num : |(1 / 2 : ℝ)| < 1)).mul_const B + rcases Metric.tendsto_atTop.1 hpow ε hε with ⟨N, hN⟩ + have hsmall_abs : |(1 / 2 : ℝ) ^ N * B| < ε := by + simpa [dist_eq_norm, Real.norm_eq_abs] using hN N le_rfl + have hsmall : (1 / 2 : ℝ) ^ N * B ≤ ε := by + exact le_trans (le_abs_self _) hsmall_abs.le + have hfinite_le_tsum : + Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) ≤ + coarseCaccioppoliRadiusIterationConst β := by + unfold coarseCaccioppoliRadiusIterationConst + exact hsum.sum_le_tsum (Finset.range N) fun n _ => + coarseCaccioppoliRadiusIterationTerm_nonneg β n + calc + F (1 / 3 : ℝ) + ≤ (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := hraw N + _ ≤ ε + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + gcongr + _ ≤ ε + A * coarseCaccioppoliRadiusIterationConst β := by + gcongr + _ = A * coarseCaccioppoliRadiusIterationConst β + ε := by ring + +/-- Sequence-specialized version of the deterministic Chapter-3 radius +iteration. This is the concrete interface used when the local bridge only +produces the recursive inequality on the consecutive Chapter-3 radii +`(ρ_n, ρ_{n+1})`. -/ +theorem coarseCaccioppoli_radius_iteration_of_sequenceRecurrence + {F : ℝ → ℝ} {A β : ℝ} + (hβ : 0 ≤ β) (hA : 0 ≤ A) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : CoarseCaccioppoliRadiusSequenceRecurrence F A β) : + F (1 / 3 : ℝ) ≤ A * coarseCaccioppoliRadiusIterationConst β := by + rcases hbounded with ⟨B, hB⟩ + have hsum : Summable (coarseCaccioppoliRadiusIterationTerm β) := + coarseCaccioppoli_radius_iteration_term_summable β hβ + have hraw : + ∀ N : ℕ, + F (1 / 3 : ℝ) ≤ + (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + intro N + have hNmem := coarseCaccioppoliRadiusSequence_mem_Icc N + calc + F (1 / 3 : ℝ) + = F (coarseCaccioppoliRadiusSequence 0) := by simp [coarseCaccioppoliRadiusSequence_zero] + _ ≤ (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := + coarseCaccioppoli_radius_iteration_raw_of_sequenceRecurrence hrec N + _ ≤ (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + have hBN : F (coarseCaccioppoliRadiusSequence N) ≤ B := hB hNmem.1 hNmem.2 + have hhalf_nonneg : 0 ≤ (1 / 2 : ℝ) ^ N := by positivity + have hmul : + (1 / 2 : ℝ) ^ N * F (coarseCaccioppoliRadiusSequence N) ≤ + (1 / 2 : ℝ) ^ N * B := + mul_le_mul_of_nonneg_left hBN hhalf_nonneg + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hmul + (A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β)) + apply le_of_forall_pos_le_add + intro ε hε + have hpow := + (tendsto_pow_atTop_nhds_zero_of_abs_lt_one (by norm_num : |(1 / 2 : ℝ)| < 1)).mul_const B + rcases Metric.tendsto_atTop.1 hpow ε hε with ⟨N, hN⟩ + have hsmall_abs : |(1 / 2 : ℝ) ^ N * B| < ε := by + simpa [dist_eq_norm, Real.norm_eq_abs] using hN N le_rfl + have hsmall : (1 / 2 : ℝ) ^ N * B ≤ ε := by + exact le_trans (le_abs_self _) hsmall_abs.le + have hfinite_le_tsum : + Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) ≤ + coarseCaccioppoliRadiusIterationConst β := by + unfold coarseCaccioppoliRadiusIterationConst + exact hsum.sum_le_tsum (Finset.range N) fun n _ => + coarseCaccioppoliRadiusIterationTerm_nonneg β n + calc + F (1 / 3 : ℝ) + ≤ (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := hraw N + _ ≤ ε + A * Finset.sum (Finset.range N) (coarseCaccioppoliRadiusIterationTerm β) := by + gcongr + _ ≤ ε + A * coarseCaccioppoliRadiusIterationConst β := by + gcongr + _ = A * coarseCaccioppoliRadiusIterationConst β + ε := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration/Standard.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration/Standard.lean new file mode 100644 index 0000000000..356f613271 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/RadiusIteration/Standard.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Height +public import Mathlib.Analysis.Convex.SpecificFunctions.Basic + +/-! # Standard -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-- Geometric ratio used in the standard beta-dependent radius iteration. +It is close enough to `1` that the geometric loss has ratio bounded away from +`1`, but `1 - theta` is still explicitly comparable to `(max 1 beta)⁻¹`. -/ +private noncomputable def coarseCaccioppoliStandardRadiusTheta (β : ℝ) : ℝ := + 1 - (4 * max 1 β)⁻¹ + +private theorem coarseCaccioppoliStandardRadiusTheta_pos {β : ℝ} (_hβ : 0 ≤ β) : + 0 < coarseCaccioppoliStandardRadiusTheta β := by + let M : ℝ := max 1 β + have hM_ge_one : 1 ≤ M := by + dsimp [M] + exact le_max_left _ _ + have hM_pos : 0 < M := zero_lt_one.trans_le hM_ge_one + have hinv_le_quarter : (4 * M)⁻¹ ≤ (1 / 4 : ℝ) := by + have hfourM_pos : 0 < 4 * M := by positivity + have hfour_pos : 0 < (4 : ℝ) := by norm_num + have hfour_le : (4 : ℝ) ≤ 4 * M := by nlinarith + have hraw : (4 * M)⁻¹ ≤ (4 : ℝ)⁻¹ := + (inv_le_inv₀ hfourM_pos hfour_pos).2 hfour_le + simpa using hraw + unfold coarseCaccioppoliStandardRadiusTheta + dsimp [M] at * + linarith + +private theorem coarseCaccioppoliStandardRadiusTheta_lt_one {β : ℝ} (_hβ : 0 ≤ β) : + coarseCaccioppoliStandardRadiusTheta β < 1 := by + let M : ℝ := max 1 β + have hM_ge_one : 1 ≤ M := by + dsimp [M] + exact le_max_left _ _ + have hM_pos : 0 < M := zero_lt_one.trans_le hM_ge_one + have hinv_pos : 0 < (4 * M)⁻¹ := by positivity + unfold coarseCaccioppoliStandardRadiusTheta + dsimp [M] at * + linarith + +private theorem coarseCaccioppoliStandardRadiusTheta_le_one {β : ℝ} (hβ : 0 ≤ β) : + coarseCaccioppoliStandardRadiusTheta β ≤ 1 := + (coarseCaccioppoliStandardRadiusTheta_lt_one hβ).le + +private theorem coarseCaccioppoliStandardRadiusTheta_rpow_neg_le_four_thirds + {β : ℝ} (hβ : 0 ≤ β) : + Real.rpow (coarseCaccioppoliStandardRadiusTheta β) (-β) ≤ + (4 / 3 : ℝ) := by + let M : ℝ := max 1 β + let θ : ℝ := coarseCaccioppoliStandardRadiusTheta β + have hM_ge_one : 1 ≤ M := by + dsimp [M] + exact le_max_left _ _ + have hM_pos : 0 < M := zero_lt_one.trans_le hM_ge_one + have hβ_le_M : β ≤ M := by + dsimp [M] + exact le_max_right _ _ + have hθ_pos : 0 < θ := by + dsimp [θ] + exact coarseCaccioppoliStandardRadiusTheta_pos hβ + have hθ_le_one : θ ≤ 1 := by + dsimp [θ] + exact coarseCaccioppoliStandardRadiusTheta_le_one hβ + have hθM_ge : + (3 / 4 : ℝ) ≤ Real.rpow θ M := by + let u : ℝ := -((4 * M)⁻¹) + have hu_lower : (-1 : ℝ) ≤ u := by + dsimp [u] + have hfourM_pos : 0 < 4 * M := by positivity + have hinv_le_one : (4 * M)⁻¹ ≤ (1 : ℝ) := by + have hone_pos : 0 < (1 : ℝ) := by norm_num + have hone_le : (1 : ℝ) ≤ 4 * M := by nlinarith + have hraw : (4 * M)⁻¹ ≤ (1 : ℝ)⁻¹ := + (inv_le_inv₀ hfourM_pos hone_pos).2 hone_le + simpa using hraw + linarith + have hbern := + one_add_mul_self_le_rpow_one_add (s := u) hu_lower + (p := M) hM_ge_one + have hleft : 1 + M * u = (3 / 4 : ℝ) := by + dsimp [u] + field_simp [hM_pos.ne'] + ring + have hone_add : 1 + u = θ := by + dsimp [u, θ, coarseCaccioppoliStandardRadiusTheta, M] + ring + simpa [hleft, hone_add] using hbern + have hnegM_le : Real.rpow θ (-M) ≤ (4 / 3 : ℝ) := by + have hθM_pos : 0 < Real.rpow θ M := Real.rpow_pos_of_pos hθ_pos M + have hthree_pos : 0 < (3 / 4 : ℝ) := by norm_num + have hinv : + (Real.rpow θ M)⁻¹ ≤ ((3 / 4 : ℝ)⁻¹) := + (inv_le_inv₀ hθM_pos hthree_pos).2 hθM_ge + have hinv' : (Real.rpow θ M)⁻¹ ≤ (4 / 3 : ℝ) := by + norm_num at hinv ⊢ + exact hinv + have hneg_eq : Real.rpow θ (-M) = (Real.rpow θ M)⁻¹ := by + simpa using Real.rpow_neg hθ_pos.le M + exact hneg_eq.trans_le hinv' + have hmono : + Real.rpow θ (-β) ≤ Real.rpow θ (-M) := + Real.rpow_le_rpow_of_exponent_ge hθ_pos hθ_le_one (by linarith) + exact hmono.trans hnegM_le + +/-- The beta-dependent radius-iteration constant from the standard +hole-filling proof. The factor `3` comes from summing a geometric series with +ratio at most `2 / 3`. -/ +noncomputable def coarseCaccioppoliStandardRadiusIterationConst (β : ℝ) : ℝ := + let θ : ℝ := coarseCaccioppoliStandardRadiusTheta β + 3 * Real.rpow (1 - θ) (-β) * Real.rpow (2 / 3 : ℝ) (-β) + +theorem coarseCaccioppoliStandardRadiusIterationConst_nonneg {β : ℝ} (hβ : 0 ≤ β) : + 0 ≤ coarseCaccioppoliStandardRadiusIterationConst β := by + let θ : ℝ := coarseCaccioppoliStandardRadiusTheta β + have hbase : 0 ≤ 1 - θ := by + dsimp [θ] + linarith [coarseCaccioppoliStandardRadiusTheta_le_one (β := β) hβ] + unfold coarseCaccioppoliStandardRadiusIterationConst + dsimp [θ] + exact mul_nonneg + (mul_nonneg (by norm_num) (Real.rpow_nonneg hbase _)) + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 2 / 3) _) + +/-- Closed scalar form of the standard radius-iteration constant. This is the +piece needed by the final Caccioppoli scalar envelope: the beta-dependent +iteration costs exactly a `(6 * max 1 beta)^beta` factor up to the harmless +front constant `3`. -/ +theorem coarseCaccioppoliStandardRadiusIterationConst_eq_growth (β : ℝ) : + coarseCaccioppoliStandardRadiusIterationConst β = + 3 * Real.rpow (6 * max 1 β) β := by + let M : ℝ := max 1 β + let θ : ℝ := coarseCaccioppoliStandardRadiusTheta β + have hM_ge_one : 1 ≤ M := by + dsimp [M] + exact le_max_left _ _ + have hM_pos : 0 < M := zero_lt_one.trans_le hM_ge_one + have hfourM_pos : 0 < 4 * M := by positivity + have hthree_halves_pos : 0 < (3 / 2 : ℝ) := by norm_num + have hbase : 1 - θ = (4 * M)⁻¹ := by + dsimp [θ, coarseCaccioppoliStandardRadiusTheta, M] + ring + have hfirst : + Real.rpow (1 - θ) (-β) = Real.rpow (4 * M) β := by + rw [hbase] + calc + Real.rpow ((4 * M)⁻¹) (-β) + = (Real.rpow ((4 * M)⁻¹) β)⁻¹ := by + exact Real.rpow_neg (inv_nonneg.mpr hfourM_pos.le) β + _ = ((Real.rpow (4 * M) β)⁻¹)⁻¹ := by + exact congrArg Inv.inv (Real.inv_rpow hfourM_pos.le β) + _ = Real.rpow (4 * M) β := by simp + have hsecond : + Real.rpow (2 / 3 : ℝ) (-β) = Real.rpow (3 / 2 : ℝ) β := by + have hbase_nonneg : 0 ≤ (2 / 3 : ℝ) := by norm_num + have hbase_eq : (2 / 3 : ℝ) = ((3 / 2 : ℝ))⁻¹ := by norm_num + rw [hbase_eq] + calc + Real.rpow ((3 / 2 : ℝ)⁻¹) (-β) + = (Real.rpow ((3 / 2 : ℝ)⁻¹) β)⁻¹ := by + exact Real.rpow_neg (inv_nonneg.mpr hthree_halves_pos.le) β + _ = ((Real.rpow (3 / 2 : ℝ) β)⁻¹)⁻¹ := by + exact congrArg Inv.inv (Real.inv_rpow hthree_halves_pos.le β) + _ = Real.rpow (3 / 2 : ℝ) β := by simp + unfold coarseCaccioppoliStandardRadiusIterationConst + dsimp [θ] + change + 3 * Real.rpow (1 - coarseCaccioppoliStandardRadiusTheta β) (-β) * + Real.rpow (2 / 3 : ℝ) (-β) = + 3 * Real.rpow (6 * max 1 β) β + rw [show Real.rpow (1 - coarseCaccioppoliStandardRadiusTheta β) (-β) = + Real.rpow (4 * M) β by simpa [θ] using hfirst, hsecond] + calc + 3 * Real.rpow (4 * M) β * Real.rpow (3 / 2 : ℝ) β = + 3 * (Real.rpow (4 * M) β * Real.rpow (3 / 2 : ℝ) β) := by ring + _ = 3 * Real.rpow ((4 * M) * (3 / 2 : ℝ)) β := by + congr 1 + exact (Real.mul_rpow hfourM_pos.le hthree_halves_pos.le).symm + _ = 3 * Real.rpow (6 * max 1 β) β := by + congr 1 + congr 1 + dsimp [M] + ring + +/-- After taking the note-exponent root, the beta-dependent radius-iteration +constant has a dimensionless scalar bound. This is the scalar cancellation +used by the note-facing Caccioppoli constant: the apparent beta growth is +absorbed by `sigma * beta <= 2`. -/ +theorem coarseCaccioppoli_sigma_mul_standardRadiusIterationConst_root_le + {s t : ℝ} (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + let σ : ℝ := coarseCaccioppoliSigma s t + let p : ℝ := 2 + 4 * s / σ + σ * Real.rpow + (coarseCaccioppoliStandardRadiusIterationConst + (coarseCaccioppoliBeta s t)) p⁻¹ ≤ 36 := by + let σ : ℝ := coarseCaccioppoliSigma s t + let β : ℝ := coarseCaccioppoliBeta s t + let p : ℝ := 2 + 4 * s / σ + let base : ℝ := 6 * β + have hσ_pos : 0 < σ := by + dsimp [σ] + exact coarseCaccioppoli_sigma_pos hst + have hβ_ge_two : 2 ≤ β := by + dsimp [β] + exact coarseCaccioppoli_beta_ge_two hs hst + have hβ_nonneg : 0 ≤ β := by linarith + have hp_pos : 0 < p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_pos hs hst + have hp_ge_one : 1 ≤ p := by + dsimp [p, σ] + exact coarseCaccioppoli_noteExponent_ge_one hs hst + have hβ_le_p : β ≤ p := by + dsimp [β, p, σ] + exact coarseCaccioppoli_beta_le_noteExponent hs hst + have hp_inv_nonneg : 0 ≤ p⁻¹ := inv_nonneg.mpr hp_pos.le + have hp_inv_le_one : p⁻¹ ≤ 1 := by + exact inv_le_one_of_one_le₀ hp_ge_one + have hβ_mul_inv_le_one : β * p⁻¹ ≤ 1 := by + have hdiv : β / p ≤ 1 := by + rw [div_le_iff₀ hp_pos] + simpa using hβ_le_p + simpa [div_eq_mul_inv] using hdiv + have hbase_pos : 0 < base := by + dsimp [base] + positivity + have hbase_nonneg : 0 ≤ base := hbase_pos.le + have hbase_ge_one : 1 ≤ base := by + dsimp [base] + nlinarith + have hthree_root_le : + Real.rpow (3 : ℝ) p⁻¹ ≤ 3 := by + calc + Real.rpow (3 : ℝ) p⁻¹ ≤ Real.rpow (3 : ℝ) (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hp_inv_le_one + _ = 3 := by simp + have hbase_root_le : + Real.rpow base (β * p⁻¹) ≤ base := by + calc + Real.rpow base (β * p⁻¹) ≤ Real.rpow base (1 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hbase_ge_one hβ_mul_inv_le_one + _ = base := by simp + have hR_root_le : + Real.rpow + (coarseCaccioppoliStandardRadiusIterationConst β) p⁻¹ ≤ + 3 * base := by + rw [coarseCaccioppoliStandardRadiusIterationConst_eq_growth] + have hmax : max 1 β = β := max_eq_right (by linarith) + rw [hmax] + have hsplit : + Real.rpow (3 * Real.rpow base β) p⁻¹ = + Real.rpow (3 : ℝ) p⁻¹ * + Real.rpow (Real.rpow base β) p⁻¹ := by + exact Real.mul_rpow + (by norm_num : (0 : ℝ) ≤ 3) + (Real.rpow_nonneg hbase_nonneg β) + rw [show 6 * β = base by rfl, hsplit] + have hbase_mul : + Real.rpow (Real.rpow base β) p⁻¹ = + Real.rpow base (β * p⁻¹) := by + exact (Real.rpow_mul hbase_nonneg β p⁻¹).symm + rw [hbase_mul] + exact mul_le_mul hthree_root_le hbase_root_le + (Real.rpow_nonneg hbase_nonneg _) (by norm_num : (0 : ℝ) ≤ 3) + calc + σ * Real.rpow + (coarseCaccioppoliStandardRadiusIterationConst β) p⁻¹ + ≤ σ * (3 * base) := by + exact mul_le_mul_of_nonneg_left hR_root_le hσ_pos.le + _ = 18 * (σ * β) := by + dsimp [base] + ring + _ ≤ 36 := by + nlinarith [coarseCaccioppoli_sigma_mul_beta_le_two ht hst] + +private theorem coarseCaccioppoli_radius_iteration_raw_of_sequence + {F : ℝ → ℝ} {A β : ℝ} {ρ : ℕ → ℝ} + (hstep : ∀ n : ℕ, + F (ρ n) ≤ (1 / 2 : ℝ) * F (ρ (n + 1)) + + A * Real.rpow (ρ (n + 1) - ρ n) (-β)) : + ∀ N : ℕ, + F (ρ 0) ≤ + (1 / 2 : ℝ) ^ N * F (ρ N) + + A * Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := by + intro N + induction N with + | zero => + simp + | succ N hN => + have hstepN := hstep N + calc + F (ρ 0) + ≤ (1 / 2 : ℝ) ^ N * F (ρ N) + + A * Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := hN + _ ≤ (1 / 2 : ℝ) ^ N * + ((1 / 2 : ℝ) * F (ρ (N + 1)) + + A * Real.rpow (ρ (N + 1) - ρ N) (-β)) + + A * Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := by + gcongr + _ = (1 / 2 : ℝ) ^ (N + 1) * F (ρ (N + 1)) + + A * Finset.sum (Finset.range (N + 1)) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := by + rw [Finset.sum_range_succ, pow_succ] + ring + +/-- Standard beta-dependent radius iteration on `[1/3,1]`. Unlike the fixed +deterministic radius sequence, this is the note-facing hole-filling estimate: +the iteration constant grows like `(C * max 1 beta)^beta`. -/ +theorem coarseCaccioppoli_standard_radius_iteration + {F : ℝ → ℝ} {A β : ℝ} + (hβ : 0 ≤ β) (hA : 0 ≤ A) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hrec : CoarseCaccioppoliRadiusRecurrence F A β) : + F (1 / 3 : ℝ) ≤ A * coarseCaccioppoliStandardRadiusIterationConst β := by + rcases hbounded with ⟨B, hB⟩ + let θ : ℝ := coarseCaccioppoliStandardRadiusTheta β + let D : ℝ := (2 / 3 : ℝ) + let pref : ℝ := Real.rpow (1 - θ) (-β) * Real.rpow D (-β) + let ratio : ℝ := (1 / 2 : ℝ) * Real.rpow θ (-β) + let ρ : ℕ → ℝ := fun n => 1 - θ ^ n * D + have hθ_pos : 0 < θ := by + dsimp [θ] + exact coarseCaccioppoliStandardRadiusTheta_pos hβ + have hθ_nonneg : 0 ≤ θ := hθ_pos.le + have hθ_lt_one : θ < 1 := by + dsimp [θ] + exact coarseCaccioppoliStandardRadiusTheta_lt_one hβ + have hθ_le_one : θ ≤ 1 := hθ_lt_one.le + have hD_pos : 0 < D := by + dsimp [D] + norm_num + have hD_nonneg : 0 ≤ D := hD_pos.le + have hone_sub_θ_pos : 0 < 1 - θ := by linarith + have hpref_nonneg : 0 ≤ pref := by + dsimp [pref] + exact mul_nonneg (Real.rpow_nonneg hone_sub_θ_pos.le _) + (Real.rpow_nonneg hD_nonneg _) + have hρ_zero : ρ 0 = (1 / 3 : ℝ) := by + dsimp [ρ, D] + norm_num + have hpow_le_one : ∀ n : ℕ, θ ^ n ≤ 1 := by + intro n + exact pow_le_one₀ hθ_nonneg hθ_le_one + have hρ_mem : ∀ n : ℕ, (1 / 3 : ℝ) ≤ ρ n ∧ ρ n ≤ 1 := by + intro n + have hpow_nonneg : 0 ≤ θ ^ n := pow_nonneg hθ_nonneg n + have hpow_le : θ ^ n ≤ 1 := hpow_le_one n + constructor + · dsimp [ρ, D] + nlinarith + · dsimp [ρ, D] + nlinarith + have hgap_eq : ∀ n : ℕ, + ρ (n + 1) - ρ n = (1 - θ) * θ ^ n * D := by + intro n + dsimp [ρ] + rw [pow_succ] + ring + have hρ_lt : ∀ n : ℕ, ρ n < ρ (n + 1) := by + intro n + have hgap_pos : 0 < ρ (n + 1) - ρ n := by + rw [hgap_eq n] + positivity + linarith + have hstep : ∀ n : ℕ, + F (ρ n) ≤ (1 / 2 : ℝ) * F (ρ (n + 1)) + + A * Real.rpow (ρ (n + 1) - ρ n) (-β) := by + intro n + exact hrec (hρ_mem n).1 (hρ_lt n) (hρ_mem (n + 1)).2 + have hraw := + coarseCaccioppoli_radius_iteration_raw_of_sequence + (F := F) (A := A) (β := β) (ρ := ρ) hstep + have hratio_nonneg : 0 ≤ ratio := by + dsimp [ratio] + positivity + have hratio_le_two_thirds : ratio ≤ (2 / 3 : ℝ) := by + have hθpow : Real.rpow θ (-β) ≤ (4 / 3 : ℝ) := by + simpa [θ] using + coarseCaccioppoliStandardRadiusTheta_rpow_neg_le_four_thirds + (β := β) hβ + calc + ratio = (1 / 2 : ℝ) * Real.rpow θ (-β) := by rfl + _ ≤ (1 / 2 : ℝ) * (4 / 3 : ℝ) := by + exact mul_le_mul_of_nonneg_left hθpow (by norm_num) + _ = (2 / 3 : ℝ) := by norm_num + have hterm_le : ∀ n : ℕ, + (1 / 2 : ℝ) ^ n * Real.rpow (ρ (n + 1) - ρ n) (-β) ≤ + pref * ratio ^ n := by + intro n + have hgap_nonneg : 0 ≤ ρ (n + 1) - ρ n := (sub_pos.mpr (hρ_lt n)).le + have hθpow_nonneg : 0 ≤ θ ^ n := pow_nonneg hθ_nonneg n + have hθrpow_nonneg : 0 ≤ Real.rpow θ (-β) := + Real.rpow_nonneg hθ_nonneg _ + have hθpow_rpow : + Real.rpow (θ ^ n) (-β) = (Real.rpow θ (-β)) ^ n := by + calc + Real.rpow (θ ^ n) (-β) + = Real.rpow (Real.rpow θ (n : ℝ)) (-β) := by + simp [Real.rpow_natCast] + _ = Real.rpow θ ((n : ℝ) * (-β)) := by + exact (Real.rpow_mul hθ_nonneg (n : ℝ) (-β)).symm + _ = Real.rpow θ ((-β) * (n : ℝ)) := by ring_nf + _ = Real.rpow (Real.rpow θ (-β)) (n : ℝ) := by + exact Real.rpow_mul hθ_nonneg (-β) (n : ℝ) + _ = (Real.rpow θ (-β)) ^ n := by + simp [Real.rpow_natCast] + have hgap_rpow : + Real.rpow ((1 - θ) * θ ^ n * D) (-β) = + (Real.rpow (1 - θ) (-β) * + Real.rpow (θ ^ n) (-β)) * + Real.rpow D (-β) := by + have hleft : + Real.rpow ((1 - θ) * θ ^ n * D) (-β) = + Real.rpow ((1 - θ) * θ ^ n) (-β) * + Real.rpow D (-β) := by + exact Real.mul_rpow + (mul_nonneg hone_sub_θ_pos.le hθpow_nonneg) hD_nonneg + have hsplit : + Real.rpow ((1 - θ) * θ ^ n) (-β) = + Real.rpow (1 - θ) (-β) * + Real.rpow (θ ^ n) (-β) := by + exact Real.mul_rpow hone_sub_θ_pos.le hθpow_nonneg + rw [hleft, hsplit] + calc + (1 / 2 : ℝ) ^ n * Real.rpow (ρ (n + 1) - ρ n) (-β) + = (1 / 2 : ℝ) ^ n * + Real.rpow ((1 - θ) * θ ^ n * D) (-β) := by + rw [hgap_eq n] + _ = + (1 / 2 : ℝ) ^ n * + ((Real.rpow (1 - θ) (-β) * + Real.rpow (θ ^ n) (-β)) * + Real.rpow D (-β)) := by + rw [hgap_rpow] + _ = + pref * ratio ^ n := by + dsimp [pref, ratio] + change + (1 / 2 : ℝ) ^ n * + ((Real.rpow (1 - θ) (-β) * + Real.rpow (θ ^ n) (-β)) * + Real.rpow D (-β)) = + (Real.rpow (1 - θ) (-β) * Real.rpow D (-β)) * + ((1 / 2 : ℝ) * Real.rpow θ (-β)) ^ n + rw [hθpow_rpow, mul_pow] + ring + _ ≤ pref * ratio ^ n := le_rfl + have hsum_le : ∀ N : ℕ, + Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) ≤ + 3 * pref := by + intro N + have hgeom_summable : + Summable (fun n : ℕ => ((2 / 3 : ℝ) ^ n)) := + summable_geometric_of_lt_one (by norm_num : (0 : ℝ) ≤ 2 / 3) + (by norm_num : (2 / 3 : ℝ) < 1) + calc + Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) + ≤ Finset.sum (Finset.range N) + (fun n : ℕ => pref * ((2 / 3 : ℝ) ^ n)) := by + refine Finset.sum_le_sum ?_ + intro n hn + exact (hterm_le n).trans + (mul_le_mul_of_nonneg_left + (pow_le_pow_left₀ hratio_nonneg hratio_le_two_thirds n) + hpref_nonneg) + _ = pref * Finset.sum (Finset.range N) + (fun n : ℕ => ((2 / 3 : ℝ) ^ n)) := by + rw [Finset.mul_sum] + _ ≤ pref * (∑' n : ℕ, ((2 / 3 : ℝ) ^ n)) := by + exact mul_le_mul_of_nonneg_left + (hgeom_summable.sum_le_tsum (Finset.range N) + (fun n _ => pow_nonneg (by norm_num : (0 : ℝ) ≤ 2 / 3) n)) + hpref_nonneg + _ = pref * 3 := by + rw [tsum_geometric_of_lt_one + (by norm_num : (0 : ℝ) ≤ 2 / 3) + (by norm_num : (2 / 3 : ℝ) < 1)] + norm_num + _ = 3 * pref := by ring + apply le_of_forall_pos_le_add + intro ε hε + have hpow := + (tendsto_pow_atTop_nhds_zero_of_abs_lt_one + (by norm_num : |(1 / 2 : ℝ)| < 1)).mul_const B + rcases Metric.tendsto_atTop.1 hpow ε hε with ⟨N, hN⟩ + have hsmall_abs : |(1 / 2 : ℝ) ^ N * B| < ε := by + simpa [dist_eq_norm, Real.norm_eq_abs] using hN N le_rfl + have hsmall : (1 / 2 : ℝ) ^ N * B ≤ ε := + le_trans (le_abs_self _) hsmall_abs.le + have hrawN := hraw N + have hNmem := hρ_mem N + calc + F (1 / 3 : ℝ) = F (ρ 0) := by rw [hρ_zero] + _ ≤ (1 / 2 : ℝ) ^ N * F (ρ N) + + A * Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := hrawN + _ ≤ (1 / 2 : ℝ) ^ N * B + + A * Finset.sum (Finset.range N) + (fun n : ℕ => + (1 / 2 : ℝ) ^ n * + Real.rpow (ρ (n + 1) - ρ n) (-β)) := by + exact add_le_add + (mul_le_mul_of_nonneg_left (hB hNmem.1 hNmem.2) + (pow_nonneg (by norm_num : (0 : ℝ) ≤ 1 / 2) N)) + le_rfl + _ ≤ ε + A * (3 * pref) := by + exact add_le_add hsmall + (mul_le_mul_of_nonneg_left (hsum_le N) hA) + _ = A * coarseCaccioppoliStandardRadiusIterationConst β + ε := by + unfold coarseCaccioppoliStandardRadiusIterationConst + dsimp [θ, pref] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw.lean new file mode 100644 index 0000000000..48cca034fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.FinalWrappers +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.LocalPatchWeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.WeakTesting + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Boundary.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Boundary.lean new file mode 100644 index 0000000000..4407e4b6c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Boundary.lean @@ -0,0 +1,656 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Boundary.ExplicitHeight + +/-! # Boundary -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Radius-indexed energy bridge inputs plus the single-cube-to-raw +coefficient-localization controls produce the note-shaped raw radius estimate. +-/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h F) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_boundary_noteRawEstimate_of_singleCubeRawEstimate + Q a s t C uL2Sq k h + (coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 hinputs) + hctrl + +/-- Radius-indexed energy bridge inputs produce the note-shaped raw estimate +from pure coefficient-localization data plus nonnegativity of the radius +energy. -/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_coefficientLocalization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + k h) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq k h F hnonneg hloc) + +/-- Raw boundary note estimate from the primitive scale and ellipticity +localization inputs. -/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hscaleLoc : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_coefficientLocalization + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 hnonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq k h hC hs0 hs1 hscaleLoc helliptic) + +/-- Raw boundary note estimate from radius-indexed energy bridge inputs using +the localized explicit height and the standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F := by + exact + coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_coefficientLocalization + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + flux u g ξ energy Acirc1 AcircS B hs (by linarith) hnonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_localizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k hC hs ht hst hscale hEll hData hBsum_s hSigmaSum_t) + +/-- Explicit-height boundary pre-recurrence from radius-indexed energy bridge +inputs using the localized explicit height and standard multiscale ellipticity +data. -/ +theorem coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hheight + exact + coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_noteEstimate_of_absorptionCondition_of_explicitCrossTermBound + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hnonneg hscale hinputs hEll hData hBsum_s hSigmaSum_t) + habs + (coarseCaccioppoli_boundary_noteCrossTermBound_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale) + +/-- Raw boundary note estimate from canonical `LambdaSq` factor inputs using +the localized explicit height and standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F := by + exact + coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hnonneg hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Boundary explicit-height pre-recurrence from canonical `LambdaSq` factor +inputs using localized explicit height and standard multiscale ellipticity data. +-/ +theorem coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryExplicitHeightPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- The same radius-indexed energy bridge inputs also feed the absorbed +pre-recurrence layer, once the note-specific absorption and cross-term +bookkeeping are available. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_radiusEnergyBridgeInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h F) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_boundary_preRecurrence_of_noteEstimate_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs (by linarith) + hinputs hctrl) + habs hcross + +/-- Boundary pre-recurrence from radius-indexed energy bridge inputs and pure +coefficient localization. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_radiusEnergyBridgeInputs_of_coefficientLocalization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + k h) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_boundary_preRecurrence_of_radiusEnergyBridgeInputs + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hC hs ht hst hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq k h F hnonneg hloc) + habs hcross + +/-- Boundary pre-recurrence from the primitive scale and ellipticity +localization inputs. -/ +theorem coarseCaccioppoli_boundary_preRecurrence_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) + (hscaleLoc : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) + (habs : CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliBoundaryNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliBoundaryPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_boundary_preRecurrence_of_radiusEnergyBridgeInputs_of_coefficientLocalization + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hC hs ht hst + hnonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq k h hC hs (by linarith) hscaleLoc helliptic) + habs hcross + +/-- Boundary coarse Caccioppoli from radius-indexed single-cube estimates, +explicit-height choice, and the single-cube-to-raw coefficient-localization +controls. -/ +theorem coarseCaccioppoli_boundary_qone_of_singleCubeRawEstimate_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hsingle : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hnonneg hbounded hscale + (coarseCaccioppoli_boundary_noteRawEstimate_of_singleCubeRawEstimate + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hsingle hctrl) + +/-- Boundary coarse Caccioppoli directly from the radius-indexed energy bridge +inputs, explicit-height choice, and the single-cube-to-raw +coefficient-localization controls. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) F) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_singleCubeRawEstimate_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hnonneg hbounded hscale + (coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + flux u g ξ energy Acirc1 AcircS B hs (by linarith) hinputs) + hctrl + +/-- Boundary coarse Caccioppoli from radius-indexed energy bridge inputs and +pure coefficient-localization data. This is the same as +`coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_explicitHeightOfScaleChoice`, +but it assembles the mixed single-cube-to-raw coefficient-control bundle from +the already-available nonnegativity hypothesis. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k)) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + F hnonneg hloc) + +/-- Boundary coarse Caccioppoli from the two primitive localization inputs: +the scale-only radius inequality and the ellipticity-only comparison. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hscaleLoc : + CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k)) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs (by linarith) hscaleLoc helliptic) + +/-- Boundary coarse Caccioppoli from radius-indexed energy bridge inputs and +fully composed localization data: triadic gap scale choice, concrete lower +bounds on the explicit height, and the standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_height_lower_bounds_of_multiscaleEllipticity_of_explicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂) + (hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_height_lower_bounds_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hscale hheight_const hheight_cent hEll hData hBsum_s hSigmaSum_t) + +/-- Boundary coarse Caccioppoli from radius-indexed energy bridge inputs using +the localized explicit height. The localized height supplies the scale-side +lower bounds internally, so callers only provide the triadic gap choice and the +standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_explicitHeightPreRecurrence + Q a s t C uL2Sq hC hs ht hst hu hnonneg hbounded + (coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hscale hinputs hEll hData hBsum_s hSigmaSum_t) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/FinalWrappers.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/FinalWrappers.lean new file mode 100644 index 0000000000..e17889aad8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/FinalWrappers.lean @@ -0,0 +1,744 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Interior +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs + +/-! # Final Wrappers -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Boundary coarse Caccioppoli from the separated radius-indexed factor +inputs, localized explicit height, and standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B A G X Y : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B A G X Y) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_factorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B A G X Y hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli from primitive separated radius-indexed factor +inputs, localized explicit height, and standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeSeparatedFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : + ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_separatedFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B + AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli from canonical `LambdaSq` factor inputs, +localized explicit height, and standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli from the separated radius-indexed factor +inputs, localized explicit height, radius agreement, and standard multiscale +ellipticity data. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B A G X Y : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B A G X Y) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_factorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B A G X Y hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli from primitive separated radius-indexed factor +inputs, localized explicit height, radius agreement, and standard multiscale +ellipticity data. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeSeparatedFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : + ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_separatedFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B + AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli from canonical `LambdaSq` factor inputs, +localized explicit height, radius agreement, and standard multiscale +ellipticity data. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli from the split canonical interface: local +analytic/cutoff inputs plus the two remaining canonical coefficient bounds. +This is the narrowest current final theorem surface before constructing the +actual Chapter 3 cutoff family. -/ +theorem coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_analyticInputs_of_coefficientBounds + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hanalytic hcoeff) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli from the split canonical interface, transported +across the radius agreement used for the centered interior quantity. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_analyticInputs_of_coefficientBounds + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hanalytic hcoeff) + hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli from a quantitative cutoff family, the split +canonical coefficient bounds, localized explicit height, and the standard +multiscale ellipticity data. This packages the cutoff-generated vector field +`ξ = ∇η` and its canonical `L^∞`/derivative bounds automatically. -/ +theorem coarseCaccioppoli_boundary_qone_of_quantitativeCutoff_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (energy : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (htest : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (flux ρ₁ ρ₂ x) + ((u ρ₁ ρ₂ x) • scalarCutoffGradientField (η ρ₁ ρ₂) x))|) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (u ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (u ρ₁ ρ₂)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F flux u g energy η Acirc1 AcircS U A1 AS + htest henergyAvg hfluxMem huMem hgMem hfluxEnergy hBgConst hBgCent hC + hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli from a quantitative cutoff family, the split +canonical coefficient bounds, localized explicit height, radius agreement, and +the standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_interior_qone_of_quantitativeCutoff_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (energy : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (htest : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + G₀ ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (flux ρ₁ ρ₂ x) + ((u ρ₁ ρ₂ x) • scalarCutoffGradientField (η ρ₁ ρ₂) x))|) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (energy ρ₁ ρ₂) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (u ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (u ρ₁ ρ₂)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ flux u g energy η Acirc1 AcircS U A1 AS + htest henergyAvg hfluxMem huMem hgMem hfluxEnergy hBgConst hBgCent hC + hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient.lean new file mode 100644 index 0000000000..177b4a4263 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Specializations + +/-! # Harmonic Canonical Gradient -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Definitions.lean new file mode 100644 index 0000000000..0c1561a1fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Definitions.lean @@ -0,0 +1,579 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Fully canonical harmonic-gradient Caccioppoli endpoints + +This sidecar keeps `HarmonicGradientControls.lean` under the preferred file-size +ceiling while adding the next Phase 2 specialization: the canonical gradient +`Acirc` factors are paired with the exact harmonic `L²` radius profile in the +coefficient-bound package. +-/ + +/-- Exact harmonic `L²` profile used as the canonical `U` envelope for the +gradient-component Caccioppoli endpoints. -/ +noncomputable def coarseCaccioppoliCanonicalHarmonicL2Profile {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : ℝ → ℝ → ℝ := + fun ρ₁ ρ₂ => cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) + +/-- The exact projected mean-zero Poincare family still needed by the +canonical gradient-component Caccioppoli endpoint. This is the remaining +Besov/Poincare bridge for the actual Chapter 3 auxiliary field +`g = partial_i w`. -/ +def CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N + +theorem CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily.projectedPoincare + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} {i : Fin d} + (hproj : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (hρ₂ : ρ₂ ≤ 1) (N : ℕ) : + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N := + hproj hρ₁ hlt hρ₂ N + +/-! ### Vector replacement for the projected Poincare family + +The componentwise `…ProjectedPoincareFamily Q a C w i` above is mathematically +**too strong** when applied to a single coordinate of a harmonic gradient: +an affine harmonic function `u(x) = x_j` (with `j ≠ i`) has zero `i`-th +partial derivative but nonzero oscillation. The vector replacement below +controls oscillation by a sum over coordinates; this is the actual +Sobolev/Besov negative-norm Poincare statement that holds on harmonic +fields. -/ + +/-- Vector form of the projected mean-zero Poincare family for the +canonical gradient Caccioppoli endpoint: at every radius pair and every +multiscale depth, the `cubeFluctuation` of `w ρ₁ ρ₂` is controlled (on every +descendant) by the sum over coordinates of the dual seminorms of the +projected gradient components. -/ +def CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N + +theorem CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily.vectorPoincare + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hproj : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C w) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (hρ₂ : ρ₂ ≤ 1) (N : ℕ) : + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N := + hproj hρ₁ hlt hρ₂ N + +/-- Descendant-local version of the canonical projected vector Poincare +family. This is the Poincare input needed by the small-cube Caccioppoli +proof on a depth-`j` descendant `R`; the oscillation is recentered from the +parent cube average to the local cube average. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily.vectorPoincare_on_descendant + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} {C : ℝ} {j : ℕ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hproj : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C w) + (hR : R ∈ descendantsAtDepth Q j) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (hρ₂ : ρ₂ ≤ 1) : + ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate R C + (cubeFluctuation R (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N := by + refine + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate.restrict_fluctuation_to_descendant + hR ?_ ?_ + · intro n S hS + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + exact + memLp_on_descendant_of_memLp (Q := Q) (R := S) (j := j + n) hSQ + (memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + · intro M + exact hproj.vectorPoincare hρ₁ hlt hρ₂ M + +/-- Enlarge the constant in the canonical projected vector Poincare family. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily.mono_C + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {C₁ C₂ : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hproj : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C₁ w) + (hC : C₁ ≤ C₂) : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C₂ w := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + exact (hproj hρ₁ hlt hρ₂ N).mono_C hC + +/-- Infinite-depth vector full-dual Poincare family for the canonical gradient +Caccioppoli endpoint. This is the constant-mode-safe replacement for the legacy +mean-zero dual family: the right-hand side uses `cubeBesovDualFullNorm`, so +affine/constant-gradient modes are retained. -/ +def CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N + +theorem CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.vectorPoincare + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hproj : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a C w) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (hρ₂ : ρ₂ ≤ 1) (N : ℕ) : + CubeDescendantDualFullVectorPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N := + hproj hρ₁ hlt hρ₂ N + +/-- Enlarge the constant in the canonical full-dual vector Poincare family. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.mono_C + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {C₁ C₂ : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hfull : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a C₁ w) + (hC : C₁ ≤ C₂) : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a C₂ w := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + exact (hfull hρ₁ hlt hρ₂ N).mono_C hC + +/-- Descendant-local version of the canonical full-dual vector Poincare +family. This is the corrected local input for consumers that work on a +depth-`j` descendant `R`, with the oscillation recentered at the local cube. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.vectorPoincare_on_descendant + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} {C : ℝ} {j : ℕ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (hfull : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a C w) + (hR : R ∈ descendantsAtDepth Q j) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (hρ₂ : ρ₂ ≤ 1) : + ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R C + (cubeFluctuation R (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x) N := by + refine + CubeDescendantDualFullVectorPoincareEstimate.restrict_fluctuation_to_descendant + hR ?_ ?_ + · intro n S hS + have hSQ : S ∈ descendantsAtDepth Q (j + n) := mem_descendantsAtDepth_add hR hS + exact + memLp_on_descendant_of_memLp (Q := Q) (R := S) (j := j + n) hSQ + (memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + · intro M + exact hfull.vectorPoincare hρ₁ hlt hρ₂ M + +/-! ### Analytical input stubs (to be discharged by Sobolev/Besov pass) + +These constructors expose the precise contract that the analytical +Sobolev/Besov negative-norm Poincare proof has to deliver. The public corrected +full-dual route uses the cube-only `fullVectorPoincareCubeConstant Q`, selected +as a parent-cube uniform analytic constant in +`Sobolev/Foundations/CubeBesovPoincare.lean`, so descendant estimates use the +same parent constant on every local cube. + +**No harmonicity is required at the analytic level**: the inequality +`‖u − ⟨u⟩_R‖_{L²(R)} ≲ ∑_i ‖∂_i u‖_{B^{-1}_{2,1},full(R)}` is a duality fact +about `H¹` on the corrected surface. The load-bearing full-dual constructor +`of_h1Function` therefore takes an arbitrary `H1Function (openCubeSet Q)`; +the harmonic specialisations +`of_aHarmonicFunction` (per-function and family) are one-line corollaries +that simply pass `u.toH1`. The `L²` membership of the value and gradient +fields is supplied automatically by the `H1Function` structure. +-/ + +/-- Constructor for the infinite-depth vector full-dual Poincare estimate +specialised to a scalar `A`-harmonic function. One-line corollary of the +corrected `H1Function` full-dual constructor. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.of_aHarmonicFunction + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : AHarmonicFunction a (openCubeSet Q)) (N : ℕ) : + CubeDescendantDualFullVectorPoincareEstimate Q + (fullVectorPoincareCubeConstant Q) + (cubeFluctuation Q (fun x => u.toH1 x)) + (fun x => u.toH1.grad x) N := + CubeDescendantDualFullVectorPoincareEstimate.of_h1Function + Q u.toH1 N + +/-- Variant exposing the Sobolev-level selected corrected uniform analytic +constant directly. This is definitionally the same constant as +`fullVectorPoincareCubeConstant Q`. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.of_aHarmonicFunction_uniformAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : AHarmonicFunction a (openCubeSet Q)) (N : ℕ) : + CubeDescendantDualFullVectorPoincareEstimate Q + (cubeFullVectorPoincareUniformAnalyticConstant Q) + (cubeFluctuation Q (fun x => u.toH1 x)) + (fun x => u.toH1.grad x) N := + CubeDescendantDualFullVectorPoincareEstimate.of_h1Function_uniformAnalyticConstant + Q u.toH1 N + +/-- Specialisation: the corrected infinite-depth full-dual vector Poincare +family is realised on any harmonic family `w` with the public corrected +cube constant `fullVectorPoincareCubeConstant Q`. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a + (fullVectorPoincareCubeConstant Q) w := by + intro ρ₁ ρ₂ _ _ _ N + exact CubeDescendantDualFullVectorPoincareEstimate.of_aHarmonicFunction + Q a (w ρ₁ ρ₂) N + +/-- Specialisation using the selected corrected uniform analytic constant over +all descendants of `Q`. -/ +theorem CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction_uniformAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a + (cubeFullVectorPoincareUniformAnalyticConstant Q) w := by + intro ρ₁ ρ₂ _ _ _ N + exact + CubeDescendantDualFullVectorPoincareEstimate.of_aHarmonicFunction_uniformAnalyticConstant + Q a (w ρ₁ ρ₂) N + +/-- The two genuinely solution-dependent strict positivity facts still needed +by the canonical gradient endpoint. Positivity of the canonical `Acirc1` +coefficient is separated out below as a coefficient-side `lambdaSq` hypothesis. -/ +def CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 < cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ∧ + 0 < + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + +theorem coarseCaccioppoli_cubeBesovScaleWeight_pos {d : ℕ} (s : ℝ) + (Q : TriadicCube d) : + 0 < cubeBesovScaleWeight s Q := by + unfold cubeBesovScaleWeight + exact Real.rpow_pos_of_pos + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + _ + +theorem coarseCaccioppoliCanonicalGradientAcirc_pos_of_lambdaSq_pos {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {r : ℝ} + (hr : 0 < r) (hlambda : 0 < lambdaSq Q r (.finite 1) a) : + 0 < coarseCaccioppoliCanonicalGradientAcirc Q a r := by + unfold coarseCaccioppoliCanonicalGradientAcirc + have hdisc_pos : 0 < geometricDiscount r 1 := + geometricDiscount_pos (by simpa using hr) + exact + mul_pos (coarseCaccioppoli_cubeBesovScaleWeight_pos (-r) Q) + (mul_pos (inv_pos.mpr hdisc_pos) (Real.rpow_pos_of_pos hlambda _)) + +theorem coarseCaccioppoliCanonicalGradientAcircOne_pos_of_lambdaSq_pos {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (ρ₁ ρ₂ : ℝ) + (hlambda : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) : + 0 < coarseCaccioppoliCanonicalGradientAcircOne Q a ρ₁ ρ₂ := by + simpa [coarseCaccioppoliCanonicalGradientAcircOne] using + coarseCaccioppoliCanonicalGradientAcirc_pos_of_lambdaSq_pos + Q a (by norm_num : 0 < (1 : ℝ)) hlambda + +theorem CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors.to_positiveFactors + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hlambda : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hnonzero : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hnonzero hρ₁ hlt hρ₂ with ⟨hU, henergy⟩ + exact + ⟨hU, + coarseCaccioppoliCanonicalGradientAcircOne_pos_of_lambdaSq_pos Q a ρ₁ ρ₂ hlambda, + henergy⟩ + +/-- Boundary canonical harmonic Caccioppoli with the concrete Chapter 3 +`U/A1/AS` choices installed in the coefficient-bound package: + +* `U` is the exact harmonic `L²` profile; +* `A1` is the canonical gradient `Acirc(1)` profile; +* `AS` is the canonical gradient `Acirc(1-s)` profile. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hprofileLower : + CoarseCaccioppoliLocalizedEnergyProfileLowerControls Q F + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcircCoefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (i := i) + (U := coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + hC hs ht hst hu hnonneg hbounded hscale + (hprofileLower.to_canonicalCutoffLower + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).1) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1)) + henergyAvg + hfluxEnergy + (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ N => + hprojected.projectedPoincare (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ N) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hcoeff hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli with the concrete Chapter 3 +`U/A1/AS` choices installed in the coefficient-bound package. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hprofileLower : + CoarseCaccioppoliLocalizedEnergyProfileLowerControls Q G₀ + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcircCoefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (i := i) + (U := coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (hprofileLower.to_canonicalCutoffLower + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).1) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1)) + henergyAvg + hfluxEnergy + (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ N => + hprojected.projectedPoincare (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ N) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hcoeff hEll hData hSigmaSum_t + +/-- Boundary canonical harmonic Caccioppoli specialized to a fixed localized +energy radius profile. This removes the public `hnonneg`, `hbounded`, and +localized-profile-lower hypotheses from the strongest boundary surface; the +only remaining profile-specific input is the pointwise agreement of the fixed +energy with the pair-dependent local energy on the inner cube. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinner_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x = scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (i := i) + hC hs ht hst hu + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + hscale + (CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_eq_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy) + henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad hprojected hcoeff + hEll hData hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Specializations.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Specializations.lean new file mode 100644 index 0000000000..137bcf2cba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCanonicalGradient/Specializations.lean @@ -0,0 +1,502 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare + +/-! # Specializations -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Interior canonical harmonic Caccioppoli specialized to a fixed localized +energy radius profile for the centered quantity. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : + CoarseCaccioppoliRadiusAgreement F + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy)) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinner_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x = scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) + (G₀ := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (i := i) + hC hs ht hst hu hagree + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + hscale + (CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_eq_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy) + henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad hprojected hcoeff + hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli with the interior iterated radius +profile specialized directly to the fixed localized energy profile. This is +the no-public-`hagree` version of the fixed-profile wrapper. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_self + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinner_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x = scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu + (fun {_ρ} _ _ => rfl) + hbase_nonneg hbase_int hscale hinner_energy henergyAvg hfluxEnergy + hnonzeroFactors hlambda1 hgrad hprojected hcoeff hEll hData hSigmaSum_t + +/-- Boundary fixed-localized-energy canonical harmonic Caccioppoli with the +canonical Chapter 3 triadic gap scale installed. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_of_canonicalTriadicGapScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x = scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) (baseEnergy := baseEnergy) + (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + hinner_energy henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad + hprojected hcoeff hEll hData hSigmaSum_t + +/-- Interior fixed-localized-energy canonical harmonic Caccioppoli with both +the fixed profile and canonical Chapter 3 triadic gap scale installed. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_self_of_canonicalTriadicGapScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x = scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_self + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) (baseEnergy := baseEnergy) + (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + hinner_energy henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad + hprojected hcoeff hEll hData hSigmaSum_t + +/-- Boundary fixed-localized-energy canonical harmonic Caccioppoli with the +canonical Chapter 3 triadic gap scale installed, requiring only domination of +the fixed localized energy by the pair-dependent energy on each inner cube. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_le_of_canonicalTriadicGapScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (i := i) + hC hs ht hst hu + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + (CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy_le) + henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad hprojected hcoeff + hEll hData hSigmaSum_t + +/-- Interior fixed-localized-energy canonical harmonic Caccioppoli with the +canonical Chapter 3 triadic gap scale installed, requiring only domination of +the fixed localized energy by the pair-dependent energy on each inner cube. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_fixedLocalizedEnergyProfile_self_le_of_canonicalTriadicGapScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalHarmonicL2GradientAcircCoefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (G₀ := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (i := i) + hC hs ht hst hu + (fun {_ρ} _ _ => rfl) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + (CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy_le) + henergyAvg hfluxEnergy hnonzeroFactors hlambda1 hgrad hprojected hcoeff + hEll hData hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCoefficientBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCoefficientBounds.lean new file mode 100644 index 0000000000..ea3367353b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicCoefficientBounds.lean @@ -0,0 +1,783 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff + +/-! # Harmonic Coefficient Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Harmonic canonical cutoff coefficient localization + +This file removes the direct raw-coefficient hypothesis from the strongest +canonical harmonic wrappers by rebuilding it from the note-shaped ingredients: +single-cube coefficient bounds plus the localized multiscale ellipticity +comparison. +-/ + +/-- Canonical raw coefficient bounds from the note's single-cube coefficient +bounds and localized explicit-height coefficient localization. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) + (U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U Xi D A1 AS := by + exact + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_localization + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U Xi D A1 AS hcoeff + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_localizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k hC hs ht hst hscale hEll hData hBsum_s hSigmaSum_t) + +/-- Boundary canonical harmonic Caccioppoli with the raw coefficient hypothesis +rebuilt from localized multiscale coefficient data. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg hfluxMem huMem + hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS hEll + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS hC hs ht hst hscale hcoeff hEll hData hBsum_s hSigmaSum_t) + +/-- Interior canonical harmonic Caccioppoli with the raw coefficient hypothesis +rebuilt from localized multiscale coefficient data. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + hfluxMem huMem hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg + hU hA1 hAS hEll + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS hC hs ht hst hscale hcoeff hEll hData hBsum_s hSigmaSum_t) + +/-- The canonical quantitative cutoff supplies the scalar cutoff-control +bundle once the projected Poincare and Besov `circ` bounds are available. -/ +theorem CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (u g energy : Vec d → ℝ) (Acirc1 AcircS : ℝ) + (hBgConst : + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q u + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + Acirc1 AcircS (Real.sqrt (cubeAverage Q energy)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) : + CoarseCaccioppoliScalarCutoffControls Q s u g + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + energy Acirc1 AcircS (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + C := by + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt + have hB : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using + (CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff + (Q := Q) (s := s) (u := u) (g := g) (energy := energy) (η := ηρ) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + (by simpa [coarseCaccioppoliQuantitativeCutoffHessianBound] using hB) + (by simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hBgConst) + (by simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hBgCent) + hC hproj hgCirc1 hgCircS) + +/-- A positivity-factor version of the canonical scalar cutoff-control +constructor. This replaces the raw strict-positivity hypotheses for the two +exact cutoff sizes by simpler positive inputs. -/ +theorem + CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff_of_positiveFactors + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s C : ℝ) {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (u g energy : Vec d → ℝ) (Acirc1 AcircS : ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hu : 0 < cubeLpNorm Q (2 : ℝ≥0∞) u) + (hAcirc1 : 0 < Acirc1) (hAcircS : 0 ≤ AcircS) + (hE : 0 < Real.sqrt (cubeAverage Q energy)) (hC : 0 < C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C (cubeFluctuation Q u) g N) + (hgCirc1 : ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hgCircS : ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g ≤ + AcircS * Real.sqrt (cubeAverage Q energy)) : + CoarseCaccioppoliScalarCutoffControls Q s u g + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + energy Acirc1 AcircS (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + C := by + have hBpos : + 0 < coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_pos Q hlt + have hBgConst : + 0 < + coarseCaccioppoliConstantCutoffSize Q u + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) := + coarseCaccioppoliConstantCutoffSize_pos_of_cubeLpNorm_pos_of_B_pos + Q u + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + hu hBpos + have hBgCent : + 0 < + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + Acirc1 AcircS (Real.sqrt (cubeAverage Q energy)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := + coarseCaccioppoliCenteredCutoffSize_pos_of_first_branch + Q + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + hs0 hs1 hAcirc1 hAcircS hE hBpos hC + exact + CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff + (Q := Q) (s := s) (C := C) hρ₁ hlt u g energy Acirc1 AcircS + hBgConst.le hBgCent.le hC.le hproj hgCirc1 hgCircS + +/-- Vector-Poincare analogue of +`CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff_of_positiveFactors`. + +The strict positivity of the centered cutoff size uses the effective +scalar-facing constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem + CoarseCaccioppoliVectorCutoffControls.of_canonicalQuantitativeCutoff_of_positiveFactors + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s C : ℝ) {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) + (u energy : Vec d → ℝ) (G : Vec d → Vec d) (Acirc1 AcircS : ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hu : 0 < cubeLpNorm Q (2 : ℝ≥0∞) u) + (hAcirc1 : 0 < Acirc1) (hAcircS : 0 ≤ AcircS) + (hE : 0 < Real.sqrt (cubeAverage Q energy)) (hC : 0 < C) + (hproj : ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroVectorPoincareEstimate Q C (cubeFluctuation Q u) G N) + (hGcirc1 : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 * Real.sqrt (cubeAverage Q energy)) + (hGcircS : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS * Real.sqrt (cubeAverage Q energy)) : + CoarseCaccioppoliVectorCutoffControls Q s u G + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + energy Acirc1 AcircS (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + C := by + have hBpos : + 0 < coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_pos Q hlt + have hBgConst : + 0 < + coarseCaccioppoliConstantCutoffSize Q u + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) := + coarseCaccioppoliConstantCutoffSize_pos_of_cubeLpNorm_pos_of_B_pos + Q u + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + hu hBpos + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hCeff_pos : 0 < (Fintype.card (Fin d) : ℝ) * C := + mul_pos hcard_pos hC + have hBgCent : + 0 < + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + Acirc1 AcircS (Real.sqrt (cubeAverage Q energy)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + ((Fintype.card (Fin d) : ℝ) * C) := + coarseCaccioppoliCenteredCutoffSize_pos_of_first_branch + Q + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + hs0 hs1 hAcirc1 hAcircS hE hBpos hCeff_pos + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt + have hB : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + hBpos.le + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using + (CoarseCaccioppoliVectorCutoffControls.of_quantitativeCubeCutoff + (Q := Q) (s := s) (u := u) (G := G) (energy := energy) (η := ηρ) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := C) + (by simpa [coarseCaccioppoliQuantitativeCutoffHessianBound] using hB) + hAcircS + (by simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hBgConst.le) + (by simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hBgCent.le) + hC.le hproj hGcirc1 hGcircS) + +/-- Boundary canonical harmonic Caccioppoli with the scalar cutoff-control +bundle rebuilt from the canonical cutoff-product/Poincare inputs. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_cutoffProductControls_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff + (Q := Q) (s := s) (C := C) hρ₁ hlt + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (hBgConst hρ₁ hlt hρ₂) (hBgCent hρ₁ hlt hρ₂) hC + (hproj hρ₁ hlt hρ₂) (hgCirc1 hρ₁ hlt hρ₂) (hgCircS hρ₁ hlt hρ₂) + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg hfluxMem huMem + hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS hcoeff + hEll hData hBsum_s hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli with the scalar cutoff-control +bundle rebuilt from the canonical cutoff-product/Poincare inputs. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_cutoffProductControls_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff + (Q := Q) (s := s) (C := C) hρ₁ hlt + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (hBgConst hρ₁ hlt hρ₂) (hBgCent hρ₁ hlt hρ₂) hC + (hproj hρ₁ hlt hρ₂) (hgCirc1 hρ₁ hlt hρ₂) (hgCircS hρ₁ hlt hρ₂) + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + hfluxMem huMem hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg + hU hA1 hAS hcoeff hEll hData hBsum_s hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal.lean new file mode 100644 index 0000000000..57fa2826b0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Endpoints + +/-! # Harmonic Final -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CoefficientBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CoefficientBounds.lean new file mode 100644 index 0000000000..7258dff4e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CoefficientBounds.lean @@ -0,0 +1,601 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CorePositiveFactors + +/-! # Coefficient Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Boundary fixed-localized-energy coarse Caccioppoli from canonical raw +coefficient bounds, with the older nonzero-energy/`lambdaSq` positivity split +kept as a compatibility surface. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad hprojected + hrawcoeff hEll hSigmaSum_t + +/-- Interior fixed-localized-energy coarse Caccioppoli from canonical raw +coefficient bounds, with the older nonzero-energy/`lambdaSq` positivity split +kept as a compatibility surface. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad hprojected + hrawcoeff hEll hSigmaSum_t + +/-- Boundary fixed-localized-energy coarse Caccioppoli with all canonical +radius/cutoff/profile choices installed, using the canonical gradient positive +factor package directly. This is the same endpoint as the shorter wrapper +below, but it avoids splitting strict positivity into separate nonzero-energy +and `lambdaSq` hypotheses. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy hpositiveFactors hgrad hprojected + (CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity + Q a s t C uL2Sq w hC hs ht hst hcoeff hEll hData + (summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family Q a s hfluxEnergy) + hSigmaSum_t) + hEll hSigmaSum_t + +/-- Interior fixed-localized-energy coarse Caccioppoli with all canonical +radius/cutoff/profile choices installed, using the canonical gradient positive +factor package directly. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy hpositiveFactors hgrad hprojected + (CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity + Q a s t C uL2Sq w hC hs ht hst hcoeff hEll hData + (summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family Q a s hfluxEnergy) + hSigmaSum_t) + hEll hSigmaSum_t + +/-- Boundary fixed-localized-energy coarse Caccioppoli with all canonical +radius/cutoff/profile choices installed and the remaining coefficient algebra +named as `CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds`. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad hprojected + hcoeff hEll hData + hSigmaSum_t + +/-- Interior fixed-localized-energy coarse Caccioppoli with all canonical +radius/cutoff/profile choices installed and the remaining coefficient algebra +named as `CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds`. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu hbase_nonneg hbase_int hinner_energy_le henergyAvg + hfluxEnergy (hnonzeroFactors.to_positiveFactors Q a w hlambda1) hgrad hprojected + hcoeff hEll hData + hSigmaSum_t + +/-- Boundary fixed-localized-energy coarse Caccioppoli with the solution-side +analytic/profile assumptions bundled into +`CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs`. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicAnalyticInputs_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hAnalytic : + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs Q a s C baseEnergy w i) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu + hAnalytic.base_nonneg hAnalytic.base_integrable hAnalytic.inner_energy_le + hAnalytic.energy_average hAnalytic.flux_energy hAnalytic.nonzero_energy_factors + hlambda1 hAnalytic.gradient_energy hAnalytic.projected_poincare hcoeff hEll hData + hSigmaSum_t + +/-- Interior fixed-localized-energy coarse Caccioppoli with the solution-side +analytic/profile assumptions bundled into +`CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs`. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalHarmonicAnalyticInputs_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hAnalytic : + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs Q a s C baseEnergy w i) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu + hAnalytic.base_nonneg hAnalytic.base_integrable hAnalytic.inner_energy_le + hAnalytic.energy_average hAnalytic.flux_energy hAnalytic.nonzero_energy_factors + hlambda1 hAnalytic.gradient_energy hAnalytic.projected_poincare hcoeff hEll hData + hSigmaSum_t + +/-- Boundary fixed-localized-energy coarse Caccioppoli where the solution-side +flux/gradient controls, descendant deterministic data, and `Sigma*` summability +are derived from closed-cube ellipticity and the origin recovery theorem. + +This is not yet the pure open-cube note endpoint, but it removes the main +energy-control bookkeeping hypotheses from the public boundary wrapper under +the currently available coarse-Poincare compatibility hypothesis. -/ +theorem + coarseCaccioppoli_boundary_qone_of_closedCubeHarmonicEnergyControls_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s := t) ht hEllCube hOrigin + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + exact + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicAnalyticInputs_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu + (CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs.of_closedCubeHarmonicEnergyControls + Q a s C baseEnergy w i hs hEllCube hbase_nonneg hbase_int hinner_energy_le + henergyAvg hnonzeroFactors hprojected) + hlambda1 hcoeff hEllOpen hData hSigmaSum_t + +/-- Interior fixed-localized-energy coarse Caccioppoli with the same +closed-cube compatibility discharge as the boundary wrapper above. -/ +theorem + coarseCaccioppoli_interior_qone_of_closedCubeHarmonicEnergyControls_of_canonicalHarmonicCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hlambda1 : 0 < lambdaSq Q (1 : ℝ) (.finite 1) a) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s := t) ht hEllCube hOrigin + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + exact + coarseCaccioppoli_interior_qone_of_canonicalHarmonicAnalyticInputs_of_canonicalHarmonicCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) (i := i) + hC hs ht hst hu + (CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs.of_closedCubeHarmonicEnergyControls + Q a s C baseEnergy w i hs hEllCube hbase_nonneg hbase_int hinner_energy_le + henergyAvg hnonzeroFactors hprojected) + hlambda1 hcoeff hEllOpen hData hSigmaSum_t + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CorePositiveFactors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CorePositiveFactors.lean new file mode 100644 index 0000000000..3d674acf28 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/CorePositiveFactors.lean @@ -0,0 +1,638 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation + +/-! # Core Positive Factors -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Boundary fixed-localized-energy coarse Caccioppoli from the canonical raw +coefficient bounds. Compared with the coefficient-bound wrapper below, the +multiscale localization data has already been absorbed into `hrawcoeff`. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + let g : ℝ → ℝ → Vec d → ℝ := fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i + let U : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalHarmonicL2Profile Q a w + let A1 : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOne Q a + let AS : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s + have hscalarFactors : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g A1 AS := by + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_harmonicGradientComponent_of_fluxEnergyControls_canonicalGradientAcirc + Q a s C w i hpositiveFactors hs1 hfluxEnergy hgrad + hSigmaSum_one hSigmaSum_one_sub_s + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ N => + hprojected.projectedPoincare (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ N) + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (g := g) (Acirc1 := A1) (AcircS := AS) + (U := U) (A1 := A1) (AS := AS) + hC.le hs ht hst hu + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + ((CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy_le).to_canonicalCutoffLower + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).1) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1)) + henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFlux_normalizedCubeMeasure Q a (w ρ₁ ρ₂) hEll) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicGradientComponent_normalizedCubeMeasure Q a (w ρ₁ ρ₂) i) + hfluxEnergy + (by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.to_scalarCutoffControls + Q a w g A1 AS hscalarFactors hs hs1 hC hρ₁ hlt hρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact coarseCaccioppoliCanonicalGradientAcircOne_nonneg Q a ρ₁ ρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg Q a hs1.le ρ₁ ρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hEll hrawcoeff + +/-- Sequence-local note raw bridge from the vector projected-Poincare family +and canonical raw coefficient bounds stated for the effective scalar-facing +constant `(Fintype.card (Fin d) : ℝ) * C`. + +This is the note-faithful bridge: it proves the local recurrence on the +Chapter-3 radius sequence before the recurrence is summed. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge.of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C w) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge + Q a s t C uL2Sq baseEnergy := by + let Ceff : ℝ := (Fintype.card (Fin d) : ℝ) * C + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hCeff_pos : 0 < Ceff := by + exact mul_pos hcard_pos hC + have hs1 : s < 1 := by nlinarith [ht, hst] + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + let G : ℝ → ℝ → Vec d → Vec d := fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x + let U : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalHarmonicL2Profile Q a w + let A1 : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOne Q a + let AS : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s + have hGcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => (w ρ₁ ρ₂).toH1.grad x i) ≤ + A1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ i N + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + let Grad : Vec d → Vec d := fun x => (w ρ₁ ρ₂).toH1.grad x + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q (1 : ℝ) N Grad ≤ + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + exact + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) Grad energy N + (hfluxEnergy hρ₁ hlt hρ₂).1 (hfluxEnergy hρ₁ hlt hρ₂).2.1 + (by simpa [Grad, energy] using hgrad hρ₁ hlt hρ₂) hSigmaSum_one + have hE_nonneg : 0 ≤ Real.sqrt (cubeAverage Q energy) := + Real.sqrt_nonneg _ + calc + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => Grad x i) + ≤ cubeBesovScaleWeight (-1) Q * + cubeBesovNegativeVectorPartialSeminorm Q 1 N Grad := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q 1 Grad i N + _ ≤ + cubeBesovScaleWeight (-1) Q * + (((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hpartial (cubeBesovScaleWeight_nonneg (-1) Q) + _ = + (cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ = + A1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q energy) := by + simp [A1, coarseCaccioppoliCanonicalGradientAcircOne, + coarseCaccioppoliCanonicalGradientAcirc, energy] + have hGcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => (w ρ₁ ρ₂).toH1.grad x i) ≤ + AS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ i N + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + let Grad : Vec d → Vec d := fun x => (w ρ₁ ρ₂).toH1.grad x + have hs_pos : 0 < 1 - s := by linarith + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N Grad ≤ + (geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + exact + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 - s) hs_pos Grad energy N + (hfluxEnergy hρ₁ hlt hρ₂).1 (hfluxEnergy hρ₁ hlt hρ₂).2.1 + (by simpa [Grad, energy] using hgrad hρ₁ hlt hρ₂) hSigmaSum_one_sub_s + calc + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => Grad x i) + ≤ cubeBesovScaleWeight (-(1 - s)) Q * + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N Grad := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q (1 - s) Grad i N + _ ≤ + cubeBesovScaleWeight (-(1 - s)) Q * + (((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hpartial + (cubeBesovScaleWeight_nonneg (-(1 - s)) Q) + _ = + (cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ = + AS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q energy) := by + simp [AS, coarseCaccioppoliCanonicalGradientAcircOneSub, + coarseCaccioppoliCanonicalGradientAcirc, energy] + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt + have hlowerρ : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₁ ≤ + cubeAverage Q + (fun x => + ηρ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) := by + have hlowerCanon : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) := + ((CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy_le).to_canonicalCutoffLower + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).1) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1)) + hρ₁ hlt hρ₂ + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using hlowerCanon + have htest : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (((w ρ₁ ρ₂).toH1 x) • + scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x))| := by + have houter : ρ₂ < 1 := by + simpa [ρ₂] using coarseCaccioppoliRadiusSequence_lt_one (n + 1) + have htestη := + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a (w ρ₁ ρ₂) hEll ηρ.smooth ηρ.hasCompactSupport + (coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q hρ₁ hlt houter) + hlowerρ + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using htestη + have hξLp : + MeasureTheory.MemLp + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (⊤ : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + quantitativeCubeCutoff_memLp_top_gradientField Q ηρ + have hXi : + cubeLpNorm Q (⊤ : ℝ≥0∞) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using! + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le Q ηρ + have hrawcoeff' : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t Ceff uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t Ceff + coarseCaccioppoliTriadicGapScale) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + simpa [Ceff, U, A1, AS, + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds] using hrawcoeff + rcases hrawcoeff' hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + refine le_trans htest ?_ + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge, Ceff, ρ₁, ρ₂, + henergyAvg hρ₁ hlt hρ₂] using + (abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_vector_factor_bounds + (Q := Q) (a := a) (s := s) + (flux := fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (u := fun x => (w ρ₁ ρ₂).toH1 x) + (G := fun x => (w ρ₁ ρ₂).toH1.grad x) + (ξ := scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (energy := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 := A1 ρ₁ ρ₂) (AcircS := AS ρ₁ ρ₂) + (B := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (C := C) (U := U ρ₁ ρ₂) + (Xi := coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (D := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (A1 := A1 ρ₁ ρ₂) (AS := AS ρ₁ ρ₂) + (Alpha := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Ceff + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t Ceff + coarseCaccioppoliTriadicGapScale) ρ₁ ρ₂) + (Bcross := coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Ceff uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t Ceff + coarseCaccioppoliTriadicGapScale) ρ₁ ρ₂) + hs hs1 + (memLp_harmonicFlux_normalizedCubeMeasure Q a (w ρ₁ ρ₂) hEll) + (memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + (fun i => memLp_harmonicGradientComponent_normalizedCubeMeasure Q a (w ρ₁ ρ₂) i) + hξLp + (hfluxEnergy hρ₁ hlt hρ₂) + (CoarseCaccioppoliVectorCutoffControls.of_canonicalQuantitativeCutoff_of_positiveFactors + (Q := Q) (s := s) (C := C) hρ₁ hlt + (fun x => (w ρ₁ ρ₂).toH1 x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (fun x => (w ρ₁ ρ₂).toH1.grad x) + (A1 ρ₁ ρ₂) (AS ρ₁ ρ₂) hs hs1 + (hpositiveFactors hρ₁ hlt hρ₂).1 + (hpositiveFactors hρ₁ hlt hρ₂).2.1 + (coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg Q a hs1.le ρ₁ ρ₂) + (hpositiveFactors hρ₁ hlt hρ₂).2.2 hC + (fun N => hprojected.vectorPoincare hρ₁ hlt hρ₂ N) + (hGcirc1 hρ₁ hlt hρ₂) (hGcircS hρ₁ hlt hρ₂)) + (coarseCaccioppoliCanonicalGradientAcircOne_nonneg Q a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg Q a hs1.le ρ₁ ρ₂) + le_rfl hXi le_rfl le_rfl le_rfl hconst hcentered) + +/-- Boundary fixed-localized-energy coarse Caccioppoli from the vector +projected-Poincare family and canonical raw coefficient bounds stated for the +effective scalar-facing constant `(Fintype.card (Fin d) : ℝ) * C`. + +This is the note-facing replacement for the old componentwise projected +Poincare endpoint. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalHarmonicVectorPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C w) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq := by + let Ceff : ℝ := (Fintype.card (Fin d) : ℝ) * C + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hCeff_nonneg : 0 ≤ Ceff := (mul_pos hcard_pos hC).le + exact + coarseCaccioppoli_boundary_qone_of_noteEstimate_on_radiusSequence_of_localizedExplicitHeightOfScaleChoice + Q a s t Ceff uL2Sq coarseCaccioppoliTriadicGapScale + hCeff_nonneg hs ht hst hu + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + (by + simpa [Ceff, CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge, + Fintype.card_fin] using + (CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge.of_canonicalHarmonicRawCoefficientBounds + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) + hC hs ht hst hbase_int hinner_energy_le henergyAvg + hfluxEnergy hpositiveFactors hgrad hprojected hrawcoeff hEll hSigmaSum_t)) + +/-- Interior fixed-localized-energy coarse Caccioppoli from the canonical raw +coefficient bounds. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalHarmonicPositiveFactors_of_canonicalHarmonicRawCoefficientBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + let g : ℝ → ℝ → Vec d → ℝ := fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i + let U : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalHarmonicL2Profile Q a w + let A1 : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOne Q a + let AS : ℝ → ℝ → ℝ := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s + have hscalarFactors : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g A1 AS := by + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_harmonicGradientComponent_of_fluxEnergyControls_canonicalGradientAcirc + Q a s C w i hpositiveFactors hs1 hfluxEnergy hgrad + hSigmaSum_one hSigmaSum_one_sub_s + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ N => + hprojected.projectedPoincare (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂ N) + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + (F := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (G₀ := coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + (w := w) (g := g) (Acirc1 := A1) (AcircS := AS) + (U := U) (A1 := A1) (AS := AS) + hC.le hs ht hst hu + (fun {_ρ} _ _ => rfl) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg Q hbase_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove Q hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + ((CoarseCaccioppoliLocalizedEnergyProfileLowerControls.of_fixedEnergy_le_pairEnergy + Q hbase_int + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1) + hinner_energy_le).to_canonicalCutoffLower + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).1) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + (hfluxEnergy (ρ₁ := ρ₁) (ρ₂ := ρ₂) hρ₁ hlt hρ₂).2.1)) + henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFlux_normalizedCubeMeasure Q a (w ρ₁ ρ₂) hEll) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicGradientComponent_normalizedCubeMeasure Q a (w ρ₁ ρ₂) i) + hfluxEnergy + (by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.to_scalarCutoffControls + Q a w g A1 AS hscalarFactors hs hs1 hC hρ₁ hlt hρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact coarseCaccioppoliCanonicalGradientAcircOne_nonneg Q a ρ₁ ρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg Q a hs1.le ρ₁ ρ₂) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hEll hrawcoeff + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Endpoints.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Endpoints.lean new file mode 100644 index 0000000000..ec7ed0bc57 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Endpoints.lean @@ -0,0 +1,711 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFronts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.Constructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor + +/-! # Endpoints -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Theorem-facing Caccioppoli endpoint aliases + +This file keeps the theorem-facing endpoint aliases separate from the internal +`InputSpecializations` bridge machinery. It retains only the standard +beta-dependent split endpoint route and the scalar budgets needed to construct +that route internally. +-/ + +/-- Explicit local-patch cutoff budget for the buffered boundary route. + +This is the cutoff-size term formerly hidden inside an existential choice of +`Clocal`. Keeping it as a definition lets later public theorems bound the +resulting note constant without losing track of which max construction was +used. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCutoffBudget {d : ℕ} + (Q : TriadicCube d) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) + +/-- The local-patch cutoff budget on a scale-zero cube, written without cube +geometry parameters. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCutoffBudgetUnit + (d : ℕ) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (48 * quantitativeCubeCutoffHessianConst d + + 12 * quantitativeCubeCutoffGradientConst d) + +theorem coarseCaccioppoliLocalPatchBufferedCutoffBudget_eq_unit_of_scale_eq_zero + {d : ℕ} {Q : TriadicCube d} (hQ : Q.scale = 0) : + coarseCaccioppoliLocalPatchBufferedCutoffBudget Q = + coarseCaccioppoliLocalPatchBufferedCutoffBudgetUnit d := by + unfold coarseCaccioppoliLocalPatchBufferedCutoffBudget + coarseCaccioppoliLocalPatchBufferedCutoffBudgetUnit + rw [cubeScaleFactor_eq_one_of_scale_eq_zero hQ, + cubeRadius_eq_half_of_scale_eq_zero hQ] + ring_nf + +/-- Explicit `Clocal` used by the local-patch buffered boundary endpoint. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedLocalBudget {d : ℕ} + (Q : TriadicCube d) (Csol : ℝ) : ℝ := + max 1 (max Csol (coarseCaccioppoliLocalPatchBufferedCutoffBudget Q)) + +/-- Effective local budget after summing over coordinate directions. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCeffLocalBudget {d : ℕ} + (Q : TriadicCube d) (Csol : ℝ) : ℝ := + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol + +/-- Centered-front budget used by the arbitrary-center local-patch route. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCenteredFrontBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + 6 * coarseCaccioppoliCenteredAverageFront d s + (coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q Csol) + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s + (coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q Csol) + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s + (coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q Csol) + +/-- Split alpha/front budget used by the local-patch buffered boundary +endpoint. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedAlphaBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + let centeredFront : ℝ := + coarseCaccioppoliLocalPatchBufferedCenteredFrontBudget Q s Csol + let frontWork : ℝ := ((81 : ℝ) * centeredFront) * (s * (1 - s)) + max 1 frontWork + +/-- Split constant/cross budget used by the local-patch buffered boundary +endpoint. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCrossBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + let Clocal : ℝ := coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol + let constantWork : ℝ := (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * Clocal + max 1 constantWork + +/-- Unit-cube split alpha/front budget for the local-patch boundary route. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit + (d : ℕ) [NeZero d] (s : ℝ) : ℝ := + coarseCaccioppoliLocalPatchBufferedAlphaBudget (originCube d 0) s + (fullVectorPoincareCubeConstant (originCube d 0)) + +/-- Unit-cube split constant/cross budget for the local-patch boundary route. -/ +noncomputable def coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit + (d : ℕ) [NeZero d] (s : ℝ) : ℝ := + coarseCaccioppoliLocalPatchBufferedCrossBudget (originCube d 0) s + (fullVectorPoincareCubeConstant (originCube d 0)) + +theorem + coarseCaccioppoliLocalPatchBufferedAlphaBudget_eq_unit_of_scale_eq_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} (s : ℝ) (hQ : Q.scale = 0) : + coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s + (fullVectorPoincareCubeConstant Q) = + coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit d s := by + unfold coarseCaccioppoliLocalPatchBufferedAlphaBudgetUnit + coarseCaccioppoliLocalPatchBufferedAlphaBudget + coarseCaccioppoliLocalPatchBufferedCenteredFrontBudget + coarseCaccioppoliLocalPatchBufferedCeffLocalBudget + coarseCaccioppoliLocalPatchBufferedLocalBudget + rw [fullVectorPoincareCubeConstant_eq_dimensionConstant Q, + fullVectorPoincareCubeConstant_eq_dimensionConstant (originCube d 0), + coarseCaccioppoliLocalPatchBufferedCutoffBudget_eq_unit_of_scale_eq_zero hQ, + coarseCaccioppoliLocalPatchBufferedCutoffBudget_eq_unit_of_scale_eq_zero + (Q := originCube d 0) rfl] + +theorem + coarseCaccioppoliLocalPatchBufferedCrossBudget_eq_unit_of_scale_eq_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} (s : ℝ) (hQ : Q.scale = 0) : + coarseCaccioppoliLocalPatchBufferedCrossBudget Q s + (fullVectorPoincareCubeConstant Q) = + coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit d s := by + unfold coarseCaccioppoliLocalPatchBufferedCrossBudgetUnit + coarseCaccioppoliLocalPatchBufferedCrossBudget + coarseCaccioppoliLocalPatchBufferedLocalBudget + rw [fullVectorPoincareCubeConstant_eq_dimensionConstant Q, + fullVectorPoincareCubeConstant_eq_dimensionConstant (originCube d 0), + coarseCaccioppoliLocalPatchBufferedCutoffBudget_eq_unit_of_scale_eq_zero hQ, + coarseCaccioppoliLocalPatchBufferedCutoffBudget_eq_unit_of_scale_eq_zero + (Q := originCube d 0) rfl] + +/-- The explicit split local-patch buffered budgets satisfy the scalar side +conditions needed by the split exact raw-coefficient package. -/ +theorem coarseCaccioppoliLocalPatchBufferedBudgetSplit_spec + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s t Csol : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + Csol ≤ coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol ∧ + 0 ≤ coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol ∧ + 0 < coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol ∧ + 0 ≤ coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol ∧ + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol) ≤ + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol ∧ + (81 : ℝ) * + (6 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol) + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol) + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol)) ≤ + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol) / (s * (1 - s)) ∧ + coarseCaccioppoliLocalPatchBufferedCutoffBudget Q ≤ + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol := by + let card : ℝ := Fintype.card (Fin d) + let cutoffBound : ℝ := coarseCaccioppoliLocalPatchBufferedCutoffBudget Q + let Clocal : ℝ := coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol + let CeffLocal : ℝ := + coarseCaccioppoliLocalPatchBufferedCeffLocalBudget Q Csol + let centeredFront : ℝ := + coarseCaccioppoliLocalPatchBufferedCenteredFrontBudget Q s Csol + let den : ℝ := s * (1 - s) + let constantWork : ℝ := (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * Clocal + let frontWork : ℝ := ((81 : ℝ) * centeredFront) * den + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + have hClocal_eq : Clocal = max 1 (max Csol cutoffBound) := by rfl + have hCeffLocal_eq : CeffLocal = card * Clocal := by rfl + have hcenteredFront_eq : + centeredFront = + 6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal := by + rfl + have hCalpha_eq : Calpha = max 1 frontWork := by rfl + have hCcross_eq : Ccross = max 1 constantWork := by rfl + have hcard_nat_pos : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hcard_nonneg : 0 ≤ card := by + dsimp [card] + exact_mod_cast (Nat.zero_le (Fintype.card (Fin d))) + have hcard_ge_one : (1 : ℝ) ≤ card := by + dsimp [card] + exact_mod_cast (Nat.succ_le_of_lt hcard_nat_pos) + have hs1 : s < 1 := by nlinarith + have hden_pos : 0 < den := by + have hs1_pos : 0 < 1 - s := by nlinarith + exact mul_pos hs hs1_pos + have hCsol_le_Clocal : Csol ≤ Clocal := by + rw [hClocal_eq] + exact (le_max_left Csol cutoffBound).trans + (le_max_right (1 : ℝ) (max Csol cutoffBound)) + have hcutoff_le_Clocal : cutoffBound ≤ Clocal := by + rw [hClocal_eq] + exact (le_max_right Csol cutoffBound).trans + (le_max_right (1 : ℝ) (max Csol cutoffBound)) + have hClocal_nonneg : 0 ≤ Clocal := by + rw [hClocal_eq] + exact (show (0 : ℝ) ≤ 1 by norm_num).trans + (le_max_left (1 : ℝ) (max Csol cutoffBound)) + have hCalpha_pos : 0 < Calpha := by + rw [hCalpha_eq] + exact zero_lt_one.trans_le (le_max_left (1 : ℝ) frontWork) + have hCcross_pos : 0 < Ccross := by + rw [hCcross_eq] + exact zero_lt_one.trans_le (le_max_left (1 : ℝ) constantWork) + have hClocal_le_card_mul : Clocal ≤ card * Clocal := by + nlinarith + have hCalpha_le_card_mul : Calpha ≤ card * Calpha := by + nlinarith + have hCcross_le_card_mul : Ccross ≤ card * Ccross := by + nlinarith + have hconstantWork_le_Ccross : constantWork ≤ Ccross := by + rw [hCcross_eq] + exact le_max_right (1 : ℝ) constantWork + have hfrontWork_le_Calpha : frontWork ≤ Calpha := by + rw [hCalpha_eq] + exact le_max_right (1 : ℝ) frontWork + have hwork_constant : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * (card * Clocal) ≤ + card * Ccross := by + have hscaled := mul_le_mul_of_nonneg_left hconstantWork_le_Ccross hcard_nonneg + simpa [constantWork, mul_assoc, mul_left_comm, mul_comm] using hscaled + have hwork_front : + (81 : ℝ) * centeredFront ≤ card * Calpha / den := by + refine (le_div_iff₀ hden_pos).2 ?_ + exact hfrontWork_le_Calpha.trans hCalpha_le_card_mul + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · simpa [Clocal] using hCsol_le_Clocal + · simpa [Clocal] using hClocal_nonneg + · simpa [Calpha] using hCalpha_pos + · simpa [Ccross] using hCcross_pos.le + · simpa [card, Clocal, Ccross] using hwork_constant + · simpa [card, Clocal, Calpha, CeffLocal, centeredFront, den, + hCeffLocal_eq, hcenteredFront_eq] using hwork_front + · simpa [card, Clocal, cutoffBound] using + hcutoff_le_Clocal.trans hClocal_le_card_mul + +/-- Explicit cutoff budget for the centered buffered route. -/ +noncomputable def coarseCaccioppoliBufferedCutoffBudget {d : ℕ} + (Q : TriadicCube d) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) + +/-- The centered buffered cutoff budget on a scale-zero cube, written without +cube geometry parameters. -/ +noncomputable def coarseCaccioppoliBufferedCutoffBudgetUnit (d : ℕ) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (16 * quantitativeCubeCutoffHessianConst d + + 4 * quantitativeCubeCutoffGradientConst d) + +theorem coarseCaccioppoliBufferedCutoffBudget_eq_unit_of_scale_eq_zero + {d : ℕ} {Q : TriadicCube d} (hQ : Q.scale = 0) : + coarseCaccioppoliBufferedCutoffBudget Q = + coarseCaccioppoliBufferedCutoffBudgetUnit d := by + unfold coarseCaccioppoliBufferedCutoffBudget + coarseCaccioppoliBufferedCutoffBudgetUnit + rw [cubeScaleFactor_eq_one_of_scale_eq_zero hQ, + cubeRadius_eq_half_of_scale_eq_zero hQ] + ring_nf + +/-- Explicit `Clocal` used by the centered buffered endpoint. -/ +noncomputable def coarseCaccioppoliBufferedLocalBudget {d : ℕ} + (Q : TriadicCube d) (Csol : ℝ) : ℝ := + max 1 (max Csol (coarseCaccioppoliBufferedCutoffBudget Q)) + +/-- Effective centered buffered local budget after summing directions. -/ +noncomputable def coarseCaccioppoliBufferedCeffLocalBudget {d : ℕ} + (Q : TriadicCube d) (Csol : ℝ) : ℝ := + (Fintype.card (Fin d) : ℝ) * coarseCaccioppoliBufferedLocalBudget Q Csol + +/-- Centered-front budget used by the centered buffered route. -/ +noncomputable def coarseCaccioppoliBufferedCenteredFrontBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + 2 * coarseCaccioppoliCenteredAverageFront d s + (coarseCaccioppoliBufferedCeffLocalBudget Q Csol) + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s + (coarseCaccioppoliBufferedCeffLocalBudget Q Csol) + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s + (coarseCaccioppoliBufferedCeffLocalBudget Q Csol) + +/-- Split alpha/front budget used by the centered buffered endpoint. -/ +noncomputable def coarseCaccioppoliBufferedAlphaBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + let centeredFront : ℝ := coarseCaccioppoliBufferedCenteredFrontBudget Q s Csol + let den : ℝ := s * (1 - s) + let frontWork : ℝ := ((81 : ℝ) * centeredFront) * den + max 1 frontWork + +/-- Split constant/cross budget used by the centered buffered endpoint. -/ +noncomputable def coarseCaccioppoliBufferedCrossBudget {d : ℕ} + (Q : TriadicCube d) (s Csol : ℝ) : ℝ := + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q Csol + let constantWork : ℝ := (81 : ℝ) * Real.rpow (3 : ℝ) s * Clocal + max 1 constantWork + +/-- Unit-cube centered buffered alpha/front budget, depending only on `d` and +`s`. -/ +noncomputable def coarseCaccioppoliBufferedAlphaBudgetUnit + (d : ℕ) [NeZero d] (s : ℝ) : ℝ := + coarseCaccioppoliBufferedAlphaBudget (originCube d 0) s + (fullVectorPoincareCubeConstant (originCube d 0)) + +/-- Unit-cube centered buffered constant/cross budget, depending only on `d` +and `s`. -/ +noncomputable def coarseCaccioppoliBufferedCrossBudgetUnit + (d : ℕ) [NeZero d] (s : ℝ) : ℝ := + coarseCaccioppoliBufferedCrossBudget (originCube d 0) s + (fullVectorPoincareCubeConstant (originCube d 0)) + +theorem coarseCaccioppoliBufferedAlphaBudget_eq_unit_of_scale_eq_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} (s : ℝ) (hQ : Q.scale = 0) : + coarseCaccioppoliBufferedAlphaBudget Q s + (fullVectorPoincareCubeConstant Q) = + coarseCaccioppoliBufferedAlphaBudgetUnit d s := by + unfold coarseCaccioppoliBufferedAlphaBudgetUnit + coarseCaccioppoliBufferedAlphaBudget + coarseCaccioppoliBufferedCenteredFrontBudget + coarseCaccioppoliBufferedCeffLocalBudget + coarseCaccioppoliBufferedLocalBudget + rw [fullVectorPoincareCubeConstant_eq_dimensionConstant Q, + fullVectorPoincareCubeConstant_eq_dimensionConstant (originCube d 0), + coarseCaccioppoliBufferedCutoffBudget_eq_unit_of_scale_eq_zero hQ, + coarseCaccioppoliBufferedCutoffBudget_eq_unit_of_scale_eq_zero + (Q := originCube d 0) rfl] + +theorem coarseCaccioppoliBufferedCrossBudget_eq_unit_of_scale_eq_zero + {d : ℕ} [NeZero d] {Q : TriadicCube d} (s : ℝ) (hQ : Q.scale = 0) : + coarseCaccioppoliBufferedCrossBudget Q s + (fullVectorPoincareCubeConstant Q) = + coarseCaccioppoliBufferedCrossBudgetUnit d s := by + unfold coarseCaccioppoliBufferedCrossBudgetUnit + coarseCaccioppoliBufferedCrossBudget + coarseCaccioppoliBufferedLocalBudget + rw [fullVectorPoincareCubeConstant_eq_dimensionConstant Q, + fullVectorPoincareCubeConstant_eq_dimensionConstant (originCube d 0), + coarseCaccioppoliBufferedCutoffBudget_eq_unit_of_scale_eq_zero hQ, + coarseCaccioppoliBufferedCutoffBudget_eq_unit_of_scale_eq_zero + (Q := originCube d 0) rfl] + +/-- The explicit split centered buffered budgets satisfy the scalar side +conditions needed by the split exact raw-coefficient package. -/ +theorem coarseCaccioppoliBufferedBudgetSplit_spec + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s t Csol : ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) : + Csol ≤ coarseCaccioppoliBufferedLocalBudget Q Csol ∧ + 0 ≤ coarseCaccioppoliBufferedLocalBudget Q Csol ∧ + 0 < coarseCaccioppoliBufferedAlphaBudget Q s Csol ∧ + 0 ≤ coarseCaccioppoliBufferedCrossBudget Q s Csol ∧ + (81 : ℝ) * Real.rpow (3 : ℝ) s * + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedLocalBudget Q Csol) ≤ + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedCrossBudget Q s Csol ∧ + (81 : ℝ) * + (2 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedLocalBudget Q Csol) + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedLocalBudget Q Csol) + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedLocalBudget Q Csol)) ≤ + ((Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedAlphaBudget Q s Csol) / (s * (1 - s)) ∧ + coarseCaccioppoliBufferedCutoffBudget Q ≤ + (Fintype.card (Fin d) : ℝ) * + coarseCaccioppoliBufferedLocalBudget Q Csol := by + let card : ℝ := Fintype.card (Fin d) + let cutoffBound : ℝ := coarseCaccioppoliBufferedCutoffBudget Q + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q Csol + let CeffLocal : ℝ := coarseCaccioppoliBufferedCeffLocalBudget Q Csol + let centeredFront : ℝ := coarseCaccioppoliBufferedCenteredFrontBudget Q s Csol + let den : ℝ := s * (1 - s) + let constantWork : ℝ := (81 : ℝ) * Real.rpow (3 : ℝ) s * Clocal + let frontWork : ℝ := ((81 : ℝ) * centeredFront) * den + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + have hClocal_eq : Clocal = max 1 (max Csol cutoffBound) := by rfl + have hCeffLocal_eq : CeffLocal = card * Clocal := by rfl + have hcenteredFront_eq : + centeredFront = + 2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal := by + rfl + have hCalpha_eq : Calpha = max 1 frontWork := by rfl + have hCcross_eq : Ccross = max 1 constantWork := by rfl + have hcard_nat_pos : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + have hcard_nonneg : 0 ≤ card := by + dsimp [card] + exact_mod_cast (Nat.zero_le (Fintype.card (Fin d))) + have hcard_ge_one : (1 : ℝ) ≤ card := by + dsimp [card] + exact_mod_cast (Nat.succ_le_of_lt hcard_nat_pos) + have hs1 : s < 1 := by nlinarith + have hden_pos : 0 < den := by + have hs1_pos : 0 < 1 - s := by nlinarith + exact mul_pos hs hs1_pos + have hCsol_le_Clocal : Csol ≤ Clocal := by + rw [hClocal_eq] + exact (le_max_left Csol cutoffBound).trans + (le_max_right (1 : ℝ) (max Csol cutoffBound)) + have hcutoff_le_Clocal : cutoffBound ≤ Clocal := by + rw [hClocal_eq] + exact (le_max_right Csol cutoffBound).trans + (le_max_right (1 : ℝ) (max Csol cutoffBound)) + have hClocal_nonneg : 0 ≤ Clocal := by + rw [hClocal_eq] + exact (show (0 : ℝ) ≤ 1 by norm_num).trans + (le_max_left (1 : ℝ) (max Csol cutoffBound)) + have hCalpha_pos : 0 < Calpha := by + rw [hCalpha_eq] + exact zero_lt_one.trans_le (le_max_left (1 : ℝ) frontWork) + have hCcross_pos : 0 < Ccross := by + rw [hCcross_eq] + exact zero_lt_one.trans_le (le_max_left (1 : ℝ) constantWork) + have hClocal_le_card_mul : Clocal ≤ card * Clocal := by + nlinarith + have hCalpha_le_card_mul : Calpha ≤ card * Calpha := by + nlinarith + have hconstantWork_le_Ccross : constantWork ≤ Ccross := by + rw [hCcross_eq] + exact le_max_right (1 : ℝ) constantWork + have hfrontWork_le_Calpha : frontWork ≤ Calpha := by + rw [hCalpha_eq] + exact le_max_right (1 : ℝ) frontWork + have hwork_constant : + (81 : ℝ) * Real.rpow (3 : ℝ) s * (card * Clocal) ≤ + card * Ccross := by + have hscaled := mul_le_mul_of_nonneg_left hconstantWork_le_Ccross hcard_nonneg + simpa [constantWork, mul_assoc, mul_left_comm, mul_comm] using hscaled + have hwork_front : + (81 : ℝ) * centeredFront ≤ card * Calpha / den := by + refine (le_div_iff₀ hden_pos).2 ?_ + exact hfrontWork_le_Calpha.trans hCalpha_le_card_mul + refine ⟨?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · simpa [Clocal] using hCsol_le_Clocal + · simpa [Clocal] using hClocal_nonneg + · simpa [Calpha] using hCalpha_pos + · simpa [Ccross] using hCcross_pos.le + · simpa [card, Clocal, Ccross] using hwork_constant + · simpa [card, Clocal, Calpha, CeffLocal, centeredFront, den, + hCeffLocal_eq, hcenteredFront_eq] using hwork_front + · simpa [card, Clocal, cutoffBound] using + hcutoff_le_Clocal.trans hClocal_le_card_mul + +/-- Boundary local-patch Caccioppoli with explicit split max-chosen budgets, +using the standard beta-dependent radius iteration. + +This is the repaired arbitrary-center boundary endpoint: the deterministic +bridge is all-radii, and the note constant is the standard split one. -/ +theorem + coarseCaccioppoli_boundary_qone_standard_note_of_closedCubeEllipticity_of_localPatchBuffered_constantFamily_of_localizedZeroTraceOnLocalOpenCube_explicitBudgetSplit + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t : ℝ) {lam Lam : ℝ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hzero : + LocalizedZeroTraceFunctionOn (openCubeSet Q) + (coarseCaccioppoliLocalOpenCube Q center 1) u.toH1.toFun) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + 0 ≤ Cnote ∧ + coarseCaccioppoliLocalEnergyRadiusProfile Q center + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) := by + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Clocal : ℝ := coarseCaccioppoliLocalPatchBufferedLocalBudget Q Csol + let Calpha : ℝ := coarseCaccioppoliLocalPatchBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliLocalPatchBufferedCrossBudget Q s Csol + rcases coarseCaccioppoliLocalPatchBufferedBudgetSplit_spec + (Q := Q) (s := s) (t := t) (Csol := Csol) hs ht hst with + ⟨hCsol_le, hClocal, hCalpha, hCcross, hwork_constant_cross, + hwork_centered_fronts_alpha, hlarge⟩ + let hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii.of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst_of_centeredFronts + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) + hClocal hCalpha.le hwork_constant_cross hwork_centered_fronts_alpha + hs ht hst hEllCube hlarge + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + change 0 ≤ Cnote ∧ + coarseCaccioppoliLocalEnergyRadiusProfile Q center + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) + refine ⟨?_, ?_⟩ + · dsimp [Cnote] + exact + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_nonneg_of_thetaRatio_pos + Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + hs ht hst + (thetaRatio_pos_of_closedCubeHarmonicFamily Q a s t (fun _ _ => u) + hs ht hEllCube) + · dsimp [Cnote] + exact + coarseCaccioppoli_boundary_localPatch_qone_standard_le_noteRhs_explicitSplit_of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_localizedZeroTraceOnLocalOpenCube + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) (u0 := u) + hzero hClocal hCalpha hCcross hCsol_le hs ht hst hEllCube hrawcoeff + +/-- Boundary centered Caccioppoli with explicit split budgets and the standard +beta-dependent radius iteration. + +This is the `m = 0` centered note-RHS endpoint with all all-radii coefficient +and raw-bridge inputs constructed internally. -/ +theorem + coarseCaccioppoli_boundary_qone_standard_note_of_closedCubeEllipticity_of_buffered_constantFamily_explicitBudgetSplit + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t : ℝ) {lam Lam : ℝ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + 0 ≤ Cnote ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) := by + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q Csol + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + rcases coarseCaccioppoliBufferedBudgetSplit_spec + (Q := Q) (s := s) (t := t) (Csol := Csol) hs ht hst with + ⟨hCsol_le, hClocal, hCalpha, hCcross, hwork_constant_cross, + hwork_centered_fronts_alpha, hlarge⟩ + let hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + Q a s t Clocal Calpha Ccross := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii.of_closedCubeEllipticity_of_bufferedCutoffRadiusConst_of_centeredFronts + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) + hClocal hCalpha.le hCcross hwork_constant_cross hwork_centered_fronts_alpha + hs ht hst hEllCube hlarge + let hBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u) + (fun x => scalarVariationEnergyIntegrand a u x) := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_closedCubeEllipticity + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) (u0 := u) + hClocal hCalpha.le hCcross hCsol_le hs ht hst hEllCube hrawcoeff + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + change 0 ≤ Cnote ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) + refine ⟨?_, ?_⟩ + · dsimp [Cnote] + exact + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_nonneg_of_thetaRatio_pos + Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + hs ht hst + (thetaRatio_pos_of_closedCubeHarmonicFamily Q a s t (fun _ _ => u) + hs ht hEllCube) + · dsimp [Cnote] + exact + coarseCaccioppoli_boundary_qone_standard_le_noteRhs_explicitSplit_of_profileInputs_of_noteRawBridgeSplitAllRadii + (Q := Q) (a := a) (s := s) (t := t) (Calpha := Calpha) + (Ccross := Ccross) (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u) + (baseEnergy := fun x => scalarVariationEnergyIntegrand a u x) + (w := fun _ _ => u) + hCalpha hCcross hs ht hst (coarseCaccioppoliHarmonicL2Sq_nonneg Q a u) + hEllCube + (CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs.of_constantFamily + Q a u hEllCube) + hBridge + +/-- Interior centered Caccioppoli with explicit split budgets and the standard +beta-dependent radius iteration. -/ +theorem + coarseCaccioppoli_interior_qone_standard_note_of_closedCubeEllipticity_of_buffered_constantFamily_explicitBudgetSplit + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t : ℝ) {lam Lam : ℝ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + 0 ≤ Cnote ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) := by + let Csol : ℝ := fullVectorPoincareCubeConstant Q + let Clocal : ℝ := coarseCaccioppoliBufferedLocalBudget Q Csol + let Calpha : ℝ := coarseCaccioppoliBufferedAlphaBudget Q s Csol + let Ccross : ℝ := coarseCaccioppoliBufferedCrossBudget Q s Csol + rcases coarseCaccioppoliBufferedBudgetSplit_spec + (Q := Q) (s := s) (t := t) (Csol := Csol) hs ht hst with + ⟨hCsol_le, hClocal, hCalpha, hCcross, hwork_constant_cross, + hwork_centered_fronts_alpha, hlarge⟩ + let hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + Q a s t Clocal Calpha Ccross := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii.of_closedCubeEllipticity_of_bufferedCutoffRadiusConst_of_centeredFronts + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) + hClocal hCalpha.le hCcross hwork_constant_cross hwork_centered_fronts_alpha + hs ht hst hEllCube hlarge + let hBoundaryBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u) + (fun x => scalarVariationEnergyIntegrand a u x) := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_closedCubeEllipticity + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) (u0 := u) + hClocal hCalpha.le hCcross hCsol_le hs ht hst hEllCube hrawcoeff + let hBridge : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u) + (fun x => scalarVariationEnergyIntegrand a u x) := by + simpa [CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii] + using hBoundaryBridge + let Cnote : ℝ := + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + change 0 ≤ Cnote ∧ + coarseCaccioppoliLocalizedEnergyRadiusProfile Q + (fun x => scalarVariationEnergyIntegrand a u x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t Cnote + (coarseCaccioppoliHarmonicL2Sq Q a u) + refine ⟨?_, ?_⟩ + · dsimp [Cnote] + exact + coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit_nonneg_of_thetaRatio_pos + Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) + hs ht hst + (thetaRatio_pos_of_closedCubeHarmonicFamily Q a s t (fun _ _ => u) + hs ht hEllCube) + · dsimp [Cnote] + exact + coarseCaccioppoli_interior_qone_standard_le_noteRhs_explicitSplit_of_profileInputs_of_noteRawBridgeSplitAllRadii + (Q := Q) (a := a) (s := s) (t := t) (Calpha := Calpha) + (Ccross := Ccross) (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u) + (baseEnergy := fun x => scalarVariationEnergyIntegrand a u x) + (w := fun _ _ => u) + hCalpha hCcross hs ht hst (coarseCaccioppoliHarmonicL2Sq_nonneg Q a u) + hEllCube + (CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs.of_constantFamily + Q a u hEllCube) + hBridge + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube.lean new file mode 100644 index 0000000000..9f7eef9747 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFronts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.Constructor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors.lean new file mode 100644 index 0000000000..51ab147db8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.BufferedAlpha + +/-! # Centered Factors -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/Besov.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/Besov.lean new file mode 100644 index 0000000000..e689c2dfbf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/Besov.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFronts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup + +/-! # Besov -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Exact small-cube centered factors: Besov cutoff pieces +-/ + +noncomputable section + +open scoped ENNReal + +/-- The Besov/cutoff-product part of the centered exact coefficient has the two +small-cube cutoff gains appearing in the LaTeX proof. The Hessian subterm uses +the extra descendant scale in +`cubeBesovScaleWeight_neg_one_mul_descendantCutoffHessianScaleBound_le_rpow_sub`; +the gradient subterm uses +`cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_rpow_sub`. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localAcirc_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) (hs1 : s < 1) + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) Ceff) ≤ + coarseCaccioppoliCenteredBesovHessianFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + coarseCaccioppoliCenteredBesovGradientFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp + let Hbase : ℝ := coarseCaccioppoliCenteredBesovHessianBase d s Ceff + let Gbase : ℝ := coarseCaccioppoliCenteredBesovGradientBase d s Ceff + let WH : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + let WG : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + have hH : + WH ≤ (4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WH] using + (cubeBesovScaleWeight_neg_one_mul_descendantCutoffHessianScaleBound_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hG : + WG ≤ (2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WG] using + (cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hdisc_sub_pos : 0 < geometricDiscount (1 - s) 1 := by + exact geometricDiscount_pos (by nlinarith) + have hgeomS_nonneg : 0 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hlt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hlt_one.le) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hCeff) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hHbase_nonneg : 0 ≤ Hbase := by + dsimp [Hbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) + (mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le)) + have hGbase_nonneg : 0 ≤ Gbase := by + dsimp [Gbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (mul_nonneg hnote_nonneg hgeomS_nonneg) + (inv_nonneg.mpr hdisc_sub_pos.le) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hHterm : + Hbase * WH * Pone ≤ + coarseCaccioppoliCenteredBesovHessianFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + have h := + mul_le_mul_of_nonneg_left hH hHbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPone_nonneg + calc + Hbase * WH * Pone ≤ + Hbase * ((4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone := h' + _ = + coarseCaccioppoliCenteredBesovHessianFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + dsimp [Hbase, coarseCaccioppoliCenteredBesovHessianFront] + ring + have hGterm : + Gbase * WG * Psub ≤ + coarseCaccioppoliCenteredBesovGradientFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + have h := + mul_le_mul_of_nonneg_left hG hGbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPsub_nonneg + calc + Gbase * WG * Psub ≤ + Gbase * ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Psub := h' + _ = + coarseCaccioppoliCenteredBesovGradientFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp [Gbase, coarseCaccioppoliCenteredBesovGradientFront] + ring + have hsplit : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) Ceff) = + Hbase * WH * Pone + Gbase * WG * Psub := by + have hcancel_s : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight s R = 1 := + cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight R s + have hweight_sub : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight (-(1 - s)) R = + cubeBesovScaleWeight (-1) R := by + rw [cubeBesovScaleWeight_mul_eq_add] + congr 1 + ring + let Wm : ℝ := cubeBesovScaleWeight (-s) R + let Wp : ℝ := cubeBesovScaleWeight s R + let Wo : ℝ := cubeBesovScaleWeight (-1) R + let Wsub : ℝ := cubeBesovScaleWeight (-(1 - s)) R + let Pow : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let DiscS : ℝ := (geometricDiscount s 1)⁻¹ + let Lam : ℝ := Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) + let DescH : ℝ := coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + let Xi : ℝ := coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + let Sqrt : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) + let Note : ℝ := (3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1) + let Disc1 : ℝ := (geometricDiscount (1 : ℝ) 1)⁻¹ + let DiscSub : ℝ := (geometricDiscount (1 - s) 1)⁻¹ + let Geom : ℝ := (1 - (3 : ℝ) ^ (-s))⁻¹ + let L1 : ℝ := Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) + let Lsub : ℝ := Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) + have hcancel : Wm * Wp = 1 := by + simpa [Wm, Wp] using hcancel_s + have hsub : Wm * Wsub = Wo := by + simpa [Wm, Wsub, Wo] using hweight_sub + have hexpanded : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) Ceff) = + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := by + dsimp [Pow, Wm, Wp, Wo, Wsub, DiscS, Lam, DescH, Xi, Sqrt, Note, + Disc1, DiscSub, Geom, L1, Lsub] + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + rw [cubeBesovScaleWeight_mul_centeredCutoffCoeffFactorBound_eq] + unfold coarseCaccioppoliLambdaFactor + coarseCaccioppoliCanonicalGradientAcircOne + coarseCaccioppoliCanonicalGradientAcircOneSub + coarseCaccioppoliCanonicalGradientAcirc + LambdaSq lambdaSq + rw [cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant + hR ρ₁ ρ₂] + ring_nf + rw [show LambdaSqFinite R s 1 a ^ (1 / 2 : ℝ) = + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 : ℝ) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 - s) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) by rfl, + show (3 : ℝ) ^ (-2 + s * 2) = Real.rpow (3 : ℝ) (-2 + s * 2) by rfl] + ring + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) Ceff) + = Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := hexpanded + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + calc + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) + = Pow * DiscS * 2 * + ((Wm * Wp) * (Lam * DescH * Sqrt * Note * Wo * Disc1 * L1) + + (Wm * Wsub) * (Lam * Xi * Note * Geom * DiscSub * Lsub)) := by + ring + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + rw [hcancel, hsub] + ring + _ = Hbase * WH * Pone + Gbase * WG * Psub := by + dsimp [Hbase, Gbase, WH, WG, Pone, Psub, Pow, DiscS, Lam, DescH, + Xi, Sqrt, Note, Disc1, DiscSub, Geom, L1, Lsub, + coarseCaccioppoliCenteredBesovHessianBase, + coarseCaccioppoliCenteredBesovGradientBase, LambdaSq, lambdaSq] + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) Ceff) + = Hbase * WH * Pone + Gbase * WG * Psub := hsplit + _ ≤ coarseCaccioppoliCenteredBesovHessianFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + coarseCaccioppoliCenteredBesovGradientFront d s Ceff * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := + add_le_add hHterm hGterm + +/-- Buffered version of +`coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localAcirc_le_rpow_sub`. +The midpoint cutoff quadruples the Hessian contribution and doubles the +gradient contribution, while the triadic scale is still chosen from the full +outer gap. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_buffered_localAcirc_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) (hs1 : s < 1) + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) ≤ + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let Hbase : ℝ := coarseCaccioppoliCenteredBesovHessianBase d s Ceff + let Gbase : ℝ := coarseCaccioppoliCenteredBesovGradientBase d s Ceff + let WH : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρm + let WG : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + have hH : + WH ≤ (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WH, ρm] using + (cubeBesovScaleWeight_neg_one_mul_descendantBufferedCutoffHessianScaleBound_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hG : + WG ≤ (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WG, ρm] using + (cubeBesovScaleWeight_neg_one_mul_parent_buffered_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hdisc_sub_pos : 0 < geometricDiscount (1 - s) 1 := by + exact geometricDiscount_pos (by nlinarith) + have hgeomS_nonneg : 0 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hlt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hlt_one.le) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hCeff) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hHbase_nonneg : 0 ≤ Hbase := by + dsimp [Hbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) + (mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le)) + have hGbase_nonneg : 0 ≤ Gbase := by + dsimp [Gbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (mul_nonneg hnote_nonneg hgeomS_nonneg) + (inv_nonneg.mpr hdisc_sub_pos.le) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hHterm : + Hbase * WH * Pone ≤ + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + have h := + mul_le_mul_of_nonneg_left hH hHbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPone_nonneg + calc + Hbase * WH * Pone ≤ + Hbase * ((16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone := h' + _ = + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + dsimp [Hbase, coarseCaccioppoliCenteredBesovHessianFront] + ring + have hGterm : + Gbase * WG * Psub ≤ + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + have h := + mul_le_mul_of_nonneg_left hG hGbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPsub_nonneg + calc + Gbase * WG * Psub ≤ + Gbase * ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Psub := h' + _ = + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp [Gbase, coarseCaccioppoliCenteredBesovGradientFront] + ring + have hsplit : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) = + Hbase * WH * Pone + Gbase * WG * Psub := by + have hcancel_s : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight s R = 1 := + cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight R s + have hweight_sub : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight (-(1 - s)) R = + cubeBesovScaleWeight (-1) R := by + rw [cubeBesovScaleWeight_mul_eq_add] + congr 1 + ring + let Wm : ℝ := cubeBesovScaleWeight (-s) R + let Wp : ℝ := cubeBesovScaleWeight s R + let Wo : ℝ := cubeBesovScaleWeight (-1) R + let Wsub : ℝ := cubeBesovScaleWeight (-(1 - s)) R + let Pow : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let DiscS : ℝ := (geometricDiscount s 1)⁻¹ + let Lam : ℝ := Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) + let DescH : ℝ := coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρm + let Xi : ℝ := coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm + let Sqrt : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) + let Note : ℝ := (3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1) + let Disc1 : ℝ := (geometricDiscount (1 : ℝ) 1)⁻¹ + let DiscSub : ℝ := (geometricDiscount (1 - s) 1)⁻¹ + let Geom : ℝ := (1 - (3 : ℝ) ^ (-s))⁻¹ + let L1 : ℝ := Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) + let Lsub : ℝ := Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) + have hcancel : Wm * Wp = 1 := by + simpa [Wm, Wp] using hcancel_s + have hsub : Wm * Wsub = Wo := by + simpa [Wm, Wsub, Wo] using hweight_sub + have hexpanded : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) = + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := by + dsimp [Pow, Wm, Wp, Wo, Wsub, DiscS, Lam, DescH, Xi, Sqrt, Note, + Disc1, DiscSub, Geom, L1, Lsub] + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + rw [cubeBesovScaleWeight_mul_centeredCutoffCoeffFactorBound_eq] + unfold coarseCaccioppoliLambdaFactor + coarseCaccioppoliCanonicalGradientAcircOne + coarseCaccioppoliCanonicalGradientAcircOneSub + coarseCaccioppoliCanonicalGradientAcirc + LambdaSq lambdaSq + rw [cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant + hR ρ₁ ρm] + ring_nf + rw [show LambdaSqFinite R s 1 a ^ (1 / 2 : ℝ) = + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 : ℝ) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 - s) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) by rfl, + show (3 : ℝ) ^ (-2 + s * 2) = Real.rpow (3 : ℝ) (-2 + s * 2) by rfl] + ring + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) + = Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := hexpanded + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + calc + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) + = Pow * DiscS * 2 * + ((Wm * Wp) * (Lam * DescH * Sqrt * Note * Wo * Disc1 * L1) + + (Wm * Wsub) * (Lam * Xi * Note * Geom * DiscSub * Lsub)) := by + ring + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + rw [hcancel, hsub] + ring + _ = Hbase * WH * Pone + Gbase * WG * Psub := by + dsimp [Hbase, Gbase, WH, WG, Pone, Psub, Pow, DiscS, Lam, DescH, + Xi, Sqrt, Note, Disc1, DiscSub, Geom, L1, Lsub, + coarseCaccioppoliCenteredBesovHessianBase, + coarseCaccioppoliCenteredBesovGradientBase, LambdaSq, lambdaSq] + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) + = Hbase * WH * Pone + Gbase * WG * Psub := hsplit + _ ≤ (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := + add_le_add hHterm hGterm + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/BufferedAlpha.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/BufferedAlpha.lean new file mode 100644 index 0000000000..e79cc45ce1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/BufferedAlpha.lean @@ -0,0 +1,285 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.LocalAlpha + +/-! # Buffered Alpha -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Exact small-cube centered factors: buffered alpha comparison +-/ + +noncomputable section + +open scoped ENNReal + +/-- Buffered average-plus-Besov factor-bound comparison for the centered exact +coefficient. The cutoff is taken at the midpoint radius, while the scale +choice, height, and parent `Alpha` coefficient are still indexed by the full +outer pair `(ρ₁, ρ₂)`. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredFactorBounds_buffered_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let A : ℝ := 2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + let H : ℝ := 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + let G : ℝ := 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + let Theta : ℝ := Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let depthTheta : ℝ := + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta + let front : ℝ := CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ + have hs1 : s < 1 := by nlinarith [ht, hst] + have havg_sub := + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_buffered_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hR hchoice hlt + have hbesov_sub := + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_buffered_localAcirc_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hs1 hR hchoice hlt hjk + have hprod_one : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone ≤ depthTheta := by + simpa [Pone, Theta, depthTheta] using + (faithful_centered_descendant_product_one_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hprod_sub : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub ≤ depthTheta := by + simpa [Psub, Theta, depthTheta] using + (faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hA_nonneg : 0 ≤ A := by + exact mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal hs) + have hH_nonneg : 0 ≤ H := by + exact mul_nonneg (by norm_num : (0 : ℝ) ≤ 4) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal hs) + have hG_nonneg : 0 ≤ G := by + exact mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal hs hs1) + have hTheta_nonneg : 0 ≤ Theta := by + dsimp [Theta] + exact Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le ht.le) _ + have hdepthTheta_nonneg : 0 ≤ depthTheta := by + dsimp [depthTheta] + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hTheta_nonneg + have hpowk_nonneg : 0 ≤ Real.rpow (3 : ℝ) (k : ℝ) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hApow_nonneg : 0 ≤ A * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hA_nonneg hpowk_nonneg + have hHpow_nonneg : 0 ≤ H * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hH_nonneg hpowk_nonneg + have hGpow_nonneg : 0 ≤ G * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hG_nonneg hpowk_nonneg + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg (div_nonneg hCeffWork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hpow_split : + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) = + Real.rpow (3 : ℝ) (k : ℝ) * Real.rpow (3 : ℝ) (-(j : ℝ)) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have havg_rhs_eq : + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + Pone = + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + dsimp [A, coarseCaccioppoliCenteredAverageFront] + ring + have hfactor_sub : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) ≤ + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) := by + exact add_le_add + (by simpa [Pone, ρm] using le_trans havg_sub havg_rhs_eq.le) + (by simpa [H, G, Pone, Psub, ρm] using hbesov_sub) + have hsub_rhs_eq : + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := by + rw [hpow_split] + ring + have hterms_to_depth : + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) ≤ + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + calc + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) + ≤ + (A * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + exact add_le_add + (add_le_add + (mul_le_mul_of_nonneg_left hprod_one hApow_nonneg) + (mul_le_mul_of_nonneg_left hprod_one hHpow_nonneg)) + (mul_le_mul_of_nonneg_left hprod_sub hGpow_nonneg) + _ = ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + ring + have hfront_depth : + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta ≤ + front * depthTheta := by + exact mul_le_mul_of_nonneg_right + (by simpa [A, H, G, front] using hscale) hdepthTheta_nonneg + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * (j : ℝ) ≤ + -coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂ := by + nlinarith + have hpow_height : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hexp_le + have hheight_step : + front * depthTheta ≤ + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := by + refine mul_le_mul_of_nonneg_left ?_ hfront_nonneg + dsimp [depthTheta] + exact mul_le_mul_of_nonneg_right hpow_height hTheta_nonneg + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) + ≤ A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) := hfactor_sub + _ = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := hsub_rhs_eq + _ ≤ ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := + hterms_to_depth + _ ≤ front * depthTheta := hfront_depth + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := hheight_step + _ = CeffWork / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [front, Theta] + ring + _ = coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/LocalAlpha.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/LocalAlpha.lean new file mode 100644 index 0000000000..2cccd46672 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFactors/LocalAlpha.lean @@ -0,0 +1,484 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors.Besov + +/-! # Local Alpha -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Exact small-cube centered factors: local alpha comparison +-/ + +noncomputable section + +open scoped ENNReal + +/-- The Besov/cutoff-product part of the centered exact coefficient localizes +to the parent `Alpha` coefficient once the two Besov scalar fronts are absorbed +into the working constant. This is the second substitution line in the LaTeX +centered single-cube estimate: the Hessian and gradient cutoff gains are +estimated separately, but both descendant ellipticity products are compared to +the same parent theta term. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) + CeffLocal) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + let H : ℝ := coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + let G : ℝ := coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + let Theta : ℝ := Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let depthTheta : ℝ := + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta + let front : ℝ := CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ + have hs1 : s < 1 := by nlinarith [ht, hst] + have hsub := + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localAcirc_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hs1 hR hchoice hlt hjk + have hprod_one : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone ≤ depthTheta := by + simpa [Pone, Theta, depthTheta] using + (faithful_centered_descendant_product_one_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hprod_sub : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub ≤ depthTheta := by + simpa [Psub, Theta, depthTheta] using + (faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hprod_one_left_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone := + mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hPone_nonneg + have hprod_sub_left_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub := + mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hPsub_nonneg + have hTheta_nonneg : 0 ≤ Theta := by + dsimp [Theta] + exact Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le ht.le) _ + have hdepthTheta_nonneg : 0 ≤ depthTheta := by + dsimp [depthTheta] + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hTheta_nonneg + have hH_nonneg : 0 ≤ H := by + simpa [H] using + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal hs) + have hG_nonneg : 0 ≤ G := by + simpa [G] using + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal hs hs1) + have hpowk_nonneg : 0 ≤ Real.rpow (3 : ℝ) (k : ℝ) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hHpow_nonneg : 0 ≤ H * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hH_nonneg hpowk_nonneg + have hGpow_nonneg : 0 ≤ G * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hG_nonneg hpowk_nonneg + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg (div_nonneg hCeffWork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hpow_split : + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) = + Real.rpow (3 : ℝ) (k : ℝ) * Real.rpow (3 : ℝ) (-(j : ℝ)) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have hsub_rhs_eq : + H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub = + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := by + rw [hpow_split] + ring + have hterms_to_depth : + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) ≤ + ((H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + calc + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) + ≤ + (H * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + exact add_le_add + (mul_le_mul_of_nonneg_left hprod_one hHpow_nonneg) + (mul_le_mul_of_nonneg_left hprod_sub hGpow_nonneg) + _ = ((H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + ring + have hfront_depth : + ((H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta ≤ + front * depthTheta := by + exact mul_le_mul_of_nonneg_right + (by simpa [H, G, front] using hscale) hdepthTheta_nonneg + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * (j : ℝ) ≤ + -coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂ := by + nlinarith + have hpow_height : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hexp_le + have hheight_step : + front * depthTheta ≤ + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := by + refine mul_le_mul_of_nonneg_left ?_ hfront_nonneg + dsimp [depthTheta] + exact mul_le_mul_of_nonneg_right hpow_height hTheta_nonneg + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) + CeffLocal) + ≤ H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + simpa [H, G, Pone, Psub] using hsub + _ = + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := hsub_rhs_eq + _ ≤ ((H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := + hterms_to_depth + _ ≤ front * depthTheta := hfront_depth + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := hheight_step + _ = CeffWork / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [front, Theta] + ring + _ = coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + rfl + +/-- The average and Besov factor-bound pieces of the centered exact coefficient +localize together to one parent `Alpha` coefficient. This is the combined +budget line in the LaTeX proof: the average front, Hessian front, and gradient +front are absorbed by a single work-constant inequality before applying the +height monotonicity of `Alpha`. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredFactorBounds_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (coarseCaccioppoliCenteredAverageFront d s CeffLocal + + coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) + CeffLocal) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + let A : ℝ := coarseCaccioppoliCenteredAverageFront d s CeffLocal + let H : ℝ := coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + let G : ℝ := coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + let Theta : ℝ := Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let depthTheta : ℝ := + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta + let front : ℝ := CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ + have hs1 : s < 1 := by nlinarith [ht, hst] + have havg_sub := + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hR hchoice hlt + have hbesov_sub := + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localAcirc_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hs1 hR hchoice hlt hjk + have hprod_one : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone ≤ depthTheta := by + simpa [Pone, Theta, depthTheta] using + (faithful_centered_descendant_product_one_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hprod_sub : + Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub ≤ depthTheta := by + simpa [Psub, Theta, depthTheta] using + (faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hA_nonneg : 0 ≤ A := by + simpa [A] using + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal hs) + have hH_nonneg : 0 ≤ H := by + simpa [H] using + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal hs) + have hG_nonneg : 0 ≤ G := by + simpa [G] using + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal hs hs1) + have hTheta_nonneg : 0 ≤ Theta := by + dsimp [Theta] + exact Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le ht.le) _ + have hdepthTheta_nonneg : 0 ≤ depthTheta := by + dsimp [depthTheta] + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hTheta_nonneg + have hpowk_nonneg : 0 ≤ Real.rpow (3 : ℝ) (k : ℝ) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hApow_nonneg : 0 ≤ A * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hA_nonneg hpowk_nonneg + have hHpow_nonneg : 0 ≤ H * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hH_nonneg hpowk_nonneg + have hGpow_nonneg : 0 ≤ G * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hG_nonneg hpowk_nonneg + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg (div_nonneg hCeffWork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hpow_split : + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) = + Real.rpow (3 : ℝ) (k : ℝ) * Real.rpow (3 : ℝ) (-(j : ℝ)) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have havg_rhs_eq : + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + Pone = + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + dsimp [A, coarseCaccioppoliCenteredAverageFront] + ring + have hfactor_sub : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) + CeffLocal) ≤ + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) := by + exact add_le_add (by simpa [Pone] using le_trans havg_sub havg_rhs_eq.le) + (by simpa [H, G, Pone, Psub] using hbesov_sub) + have hsub_rhs_eq : + A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := by + rw [hpow_split] + ring + have hterms_to_depth : + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) ≤ + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + calc + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) + ≤ + (A * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + exact add_le_add + (add_le_add + (mul_le_mul_of_nonneg_left hprod_one hApow_nonneg) + (mul_le_mul_of_nonneg_left hprod_one hHpow_nonneg)) + (mul_le_mul_of_nonneg_left hprod_sub hGpow_nonneg) + _ = ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + ring + have hfront_depth : + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta ≤ + front * depthTheta := by + exact mul_le_mul_of_nonneg_right + (by simpa [A, H, G, front] using hscale) hdepthTheta_nonneg + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * (j : ℝ) ≤ + -coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂ := by + nlinarith + have hpow_height : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hexp_le + have hheight_step : + front * depthTheta ≤ + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := by + refine mul_le_mul_of_nonneg_left ?_ hfront_nonneg + dsimp [depthTheta] + exact mul_le_mul_of_nonneg_right hpow_height hTheta_nonneg + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρ₂) + CeffLocal) + ≤ A * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub) := hfactor_sub + _ = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * Psub) := hsub_rhs_eq + _ ≤ ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := + hterms_to_depth + _ ≤ front * depthTheta := hfront_depth + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := hheight_step + _ = CeffWork / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [front, Theta] + ring + _ = coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFronts.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFronts.lean new file mode 100644 index 0000000000..84593a9d74 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/CenteredFronts.lean @@ -0,0 +1,866 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup + +/-! # Centered Fronts -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local small-cube coefficient package constructors + +This sidecar file packages the two local EnergyBridge branch helpers into the +canonical harmonic small-cube local coefficient hypothesis used by the final +single-cube-to-raw bridge. +-/ + +/-- Split buffered direct exact-raw constant branch calibration. + +The descendant depth and explicit height are chosen with `Calpha`, while the +parent cross coefficient is charged only to `Ccross`. This is the upstream +constant-branch version of the split note-RHS budget. -/ +theorem + faithfulWorkSmallCubeExactRawConstantBranchSplit_of_closedCubeEllipticity_of_bufferedCutoffRadiusConst + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (_hCcross : 0 ≤ Ccross) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) s * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hs1 : s < 1 := by nlinarith [ht, hst] + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let kR : ℝ := (k : ℝ) + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt_m + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hj_le_height_add_one : (j : ℝ) ≤ hheight ρ₁ ρ₂ + 1 := by + simpa [hheight, j, k, CeffAlpha, ρ₁, ρ₂, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (faithful_integerized_height_depth_le_height_add_one + (Q := Q) (a := a) (s := s) (t := t) (C := CeffAlpha) hs k) + have hscale_const : + (CeffLocal * Real.rpow (3 : ℝ) kR) * Real.rpow (3 : ℝ) s ≤ + CeffCross * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [CeffLocal, CeffCross, kR] using + (faithful_scale_mul_rpow_s_le_workGap_of_triadicGapScaleChoice + (s := s) (C := CeffLocal) (Cwork := CeffCross) + hCeffLocal_nonneg + (by simpa [CeffLocal, CeffCross, mul_assoc] using hwork_constant_cross) + hchoice hlt) + have hB_nonneg : 0 ≤ B := by + simpa [B, ρm] using coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hconstn : + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (B + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + intro R hR + simpa [B, CeffLocal, kR, k, ρm] using + (coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_parent_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant + (Q := Q) (R := R) (a := a) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hR hchoice hlt hjk (by simpa [CeffLocal] using hlarge)) + dsimp + intro R hR + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllR hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hsum_s : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + R a s hs hEllR hDataR + have hsum_one : + Summable (fun m : ℕ => + geometricWeight (1 : ℝ) 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := by + have hs_lt_one : s < 1 := by linarith + refine summable_geometricWeight_one_of_lt ?_ hs hs_lt_one hsum_s + intro m + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le m)) a) _ + have hlocal : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ (scalarCutoffGradientField ηρ)) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + have hlocal' := + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_cutoffGradient_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds_on_descendant + (Q := Q) (R := R) (j := j) hR a (η := ηρ) (B := B) + (Ceff := CeffLocal) (kR := kR + (j : ℝ)) + (Aavg := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (Aflux1 := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + hB_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a + (by norm_num : 0 < (1 : ℝ)) hsum_one) + (by simp [coarseCaccioppoliLambdaFactor]) + (by + simpa [B, ρm, coarseCaccioppoliQuantitativeCutoffGradientBound, + sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hconstn R hR) + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hlocal' + have hbase_le : + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR ≤ K := by + simpa [coarseCaccioppoliSingleCubeBoundaryConstantCoeff, + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff, K] using + (faithful_constant_descendant_coeff_le_cross_of_scale_height_le_depth + (Q := Q) (R := R) (j := j) a + (s := s) (C := CeffLocal) (Cwork := CeffCross) (k := kR) + (uL2Sq := (1 : ℝ)) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (h := hheight) + hCeffLocal_nonneg hs hs1 hEllCube hR hBsum_s + hscale_const hj_le_height_add_one) + exact le_trans + (by + simpa [ξ, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, B, K, ρm] using hlocal) + hbase_le + +/-- All-radii split buffered direct exact-raw constant branch calibration. + +This is the same constant/cross branch as +`faithfulWorkSmallCubeExactRawConstantBranchSplit_of_closedCubeEllipticity_of_bufferedCutoffRadiusConst`, +but with an arbitrary radius pair `1/3 ≤ ρ₁ < ρ₂ ≤ 1`. It is the +constant-branch input needed by the standard beta-dependent radius iteration. -/ +theorem + faithfulWorkSmallCubeExactRawConstantBranchSplitAllRadii_of_closedCubeEllipticity_of_bufferedCutoffRadiusConst + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (_hCcross : 0 ≤ Ccross) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) s * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hs1 : s < 1 := by nlinarith [ht, hst] + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let kR : ℝ := (k : ℝ) + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt_m + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hj_le_height_add_one : (j : ℝ) ≤ hheight ρ₁ ρ₂ + 1 := by + simpa [hheight, j, k, CeffAlpha, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (faithful_integerized_height_depth_le_height_add_one + (Q := Q) (a := a) (s := s) (t := t) (C := CeffAlpha) hs k) + have hscale_const : + (CeffLocal * Real.rpow (3 : ℝ) kR) * Real.rpow (3 : ℝ) s ≤ + CeffCross * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [CeffLocal, CeffCross, kR] using + (faithful_scale_mul_rpow_s_le_workGap_of_triadicGapScaleChoice + (s := s) (C := CeffLocal) (Cwork := CeffCross) + hCeffLocal_nonneg + (by simpa [CeffLocal, CeffCross, mul_assoc] using hwork_constant_cross) + hchoice hlt) + have hB_nonneg : 0 ≤ B := by + simpa [B, ρm] using coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hconstn : + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (B + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + intro R hR + simpa [B, CeffLocal, kR, k, ρm] using + (coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_parent_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant + (Q := Q) (R := R) (a := a) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hR hchoice hlt hjk (by simpa [CeffLocal] using hlarge)) + dsimp + intro R hR + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllR hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hsum_s : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + R a s hs hEllR hDataR + have hsum_one : + Summable (fun m : ℕ => + geometricWeight (1 : ℝ) 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := by + have hs_lt_one : s < 1 := by linarith + refine summable_geometricWeight_one_of_lt ?_ hs hs_lt_one hsum_s + intro m + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le m)) a) _ + have hlocal : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ (scalarCutoffGradientField ηρ)) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + have hlocal' := + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_cutoffGradient_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds_on_descendant + (Q := Q) (R := R) (j := j) hR a (η := ηρ) (B := B) + (Ceff := CeffLocal) (kR := kR + (j : ℝ)) + (Aavg := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (Aflux1 := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + hB_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a + (by norm_num : 0 < (1 : ℝ)) hsum_one) + (by simp [coarseCaccioppoliLambdaFactor]) + (by + simpa [B, ρm, coarseCaccioppoliQuantitativeCutoffGradientBound, + sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hconstn R hR) + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hlocal' + have hbase_le : + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR ≤ K := by + simpa [coarseCaccioppoliSingleCubeBoundaryConstantCoeff, + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff, K] using + (faithful_constant_descendant_coeff_le_cross_of_scale_height_le_depth + (Q := Q) (R := R) (j := j) a + (s := s) (C := CeffLocal) (Cwork := CeffCross) (k := kR) + (uL2Sq := (1 : ℝ)) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (h := hheight) + hCeffLocal_nonneg hs hs1 hEllCube hR hBsum_s + hscale_const hj_le_height_add_one) + exact le_trans + (by + simpa [ξ, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, B, K, ρm] using hlocal) + hbase_le + +/-- Scalar front multiplying the average part of the centered exact +coefficient after inserting the descendant cutoff-gradient estimate. -/ +def coarseCaccioppoliCenteredAverageFront (d : ℕ) (s C : ℝ) : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) + +/-- The average part of the centered exact coefficient has the small-cube +cutoff-gradient gain `3^(k-j)` when the canonical `A^\circ_1` factor is kept +on the descendant cube. This is the first substitution line in the LaTeX +centered single-cube estimate. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) Ceff ≤ + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + let cut : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + let cutBound : ℝ := + (2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) + let K : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) + let L : ℝ := + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) * + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) + have hcut : cut ≤ cutBound := by + simpa [cut, cutBound] using + (cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + have hdiscS_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc1_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + refine mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) ?_ + refine mul_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (by positivity) hCeff) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · exact mul_nonneg (inv_nonneg.mpr hdiscS_pos.le) + (inv_nonneg.mpr hdisc1_pos.le) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + simpa [LambdaSq, lambdaSq] using + (mul_nonneg + (Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _)) + have hmain : K * cut * L ≤ K * cutBound * L := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcut hK_nonneg) hL_nonneg + have hleft : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) Ceff = + K * cut * L := by + dsimp [K, cut, L] + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + coarseCaccioppoliLambdaFactor + coarseCaccioppoliCanonicalGradientAcircOne + coarseCaccioppoliCanonicalGradientAcirc + simp only [LambdaSq, lambdaSq] + ring_nf + rw [show LambdaSqFinite R s 1 a ^ (1 / 2 : ℝ) = + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 : ℝ) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) by rfl] + ac_rfl + have hright : + K * cutBound * L = + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + dsimp [K, cutBound, L] + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) Ceff + = K * cut * L := hleft + _ ≤ K * cutBound * L := hmain + _ = + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := hright + +/-- Buffered version of +`coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_rpow_sub`. +The midpoint cutoff doubles the average-branch gradient contribution. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_buffered_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) Ceff ≤ + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + have hfull := + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := Ceff) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeff hs hR hchoice hlt + have hleft_eq : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) Ceff = + 2 * coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) Ceff := by + rw [coarseCaccioppoliQuantitativeCutoffGradientBound_buffered_eq_two_mul Q hlt] + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + coarseCaccioppoliCanonicalGradientAcircOne + ring + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) Ceff + = + 2 * coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) Ceff := + hleft_eq + _ ≤ + 2 * + (((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ))) := by + exact mul_le_mul_of_nonneg_left hfull (by norm_num : (0 : ℝ) ≤ 2) + _ = + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + ring + +/-- The average part of the centered exact coefficient localizes directly to +the parent `Alpha` coefficient once the fixed average-branch scalar front is +absorbed into the working constant. + +This is the average-term line of the LaTeX small-cube coefficient comparison: +the cutoff gradient gives `3^(k-j)`, the new descendant product lemma turns +`3^{-j} Lambda_s(R)^{1/2} lambda_1(R)^{-1/2}` into the parent theta term, and +the integerized height only improves the final `3^{-sigma h}` decay. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) + (hscale : + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d)) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) CeffLocal ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + let A : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + (2 * quantitativeCubeCutoffGradientConst d) + let P : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Theta : ℝ := Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let front : ℝ := CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ + have hsub := + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localAcircOne_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hR hchoice hlt + have hprod : + Real.rpow (3 : ℝ) (-(j : ℝ)) * P ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta := by + simpa [P, Theta] using + (faithful_centered_descendant_product_one_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hprod_left_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) * P := + mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hP_nonneg + have hs1 : s < 1 := by nlinarith [ht, hst] + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg (div_nonneg hCeffWork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hscaled := + mul_le_mul hscale hprod hprod_left_nonneg hfront_nonneg + have hpow_split : + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) = + Real.rpow (3 : ℝ) (k : ℝ) * Real.rpow (3 : ℝ) (-(j : ℝ)) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have hsub_rhs_eq : + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + P = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * P) := by + calc + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + P = + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + (Real.rpow (3 : ℝ) (k : ℝ) * + Real.rpow (3 : ℝ) (-(j : ℝ))))) * + P := by + rw [hpow_split] + _ = (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * P) := by + dsimp [A] + ring_nf + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * (j : ℝ) ≤ + -coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂ := by + nlinarith + have hpow_height : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hexp_le + have hTheta_nonneg : 0 ≤ Theta := by + dsimp [Theta] + exact Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le ht.le) _ + have hheight_step : + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta) ≤ + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := by + refine mul_le_mul_of_nonneg_left ?_ hfront_nonneg + exact mul_le_mul_of_nonneg_right hpow_height hTheta_nonneg + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρ₂) CeffLocal + ≤ + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + P := hsub + _ = (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * P) := hsub_rhs_eq + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * Theta) := + hscaled + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := hheight_step + _ = CeffWork / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [front, Theta] + ring_nf + _ = coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + rfl + +theorem coarseCaccioppoliCenteredAverageFront_nonneg + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) : + 0 ≤ coarseCaccioppoliCenteredAverageFront d s C := by + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + unfold coarseCaccioppoliCenteredAverageFront + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ ?_ + · exact_mod_cast Nat.zero_le d + · exact mul_nonneg hnote_nonneg + (mul_nonneg (inv_nonneg.mpr hdisc_s_pos.le) + (inv_nonneg.mpr hdisc_one_pos.le)) + · exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (quantitativeCubeCutoffGradientConst_nonneg d) + +/-- Multiplicativity of Besov scale weights on a fixed cube. -/ +theorem cubeBesovScaleWeight_mul_eq_add {d : ℕ} + (Q : TriadicCube d) (r q : ℝ) : + cubeBesovScaleWeight r Q * cubeBesovScaleWeight q Q = + cubeBesovScaleWeight (r + q) Q := by + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + unfold cubeBesovScaleWeight + rw [← Real.rpow_add hpos] + congr 1 + ring + +/-- Scalar front multiplying the Hessian piece of the centered Besov exact +coefficient before the cutoff scale estimate is inserted. -/ +def coarseCaccioppoliCenteredBesovHessianBase (d : ℕ) (s C : ℝ) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) * + (geometricDiscount s 1)⁻¹ * + (2 * (Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) * + (((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (geometricDiscount (1 : ℝ) 1)⁻¹))) + +/-- Scalar front multiplying the gradient piece of the centered Besov exact +coefficient before the cutoff scale estimate is inserted. -/ +def coarseCaccioppoliCenteredBesovGradientBase (d : ℕ) (s C : ℝ) : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) * + (geometricDiscount s 1)⁻¹ * + (2 * ((((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) * + (1 - (3 : ℝ) ^ (-s))⁻¹) * + (geometricDiscount (1 - s) 1)⁻¹)) + +/-- Hessian scalar front after inserting the descendant cutoff estimate. -/ +def coarseCaccioppoliCenteredBesovHessianFront (d : ℕ) (s C : ℝ) : ℝ := + coarseCaccioppoliCenteredBesovHessianBase d s C * + (4 * quantitativeCubeCutoffHessianConst d) + +/-- Gradient scalar front after inserting the descendant cutoff estimate. -/ +def coarseCaccioppoliCenteredBesovGradientFront (d : ℕ) (s C : ℝ) : ℝ := + coarseCaccioppoliCenteredBesovGradientBase d s C * + (2 * quantitativeCubeCutoffGradientConst d) + +theorem coarseCaccioppoliCenteredBesovHessianFront_nonneg + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) : + 0 ≤ coarseCaccioppoliCenteredBesovHessianFront d s C := by + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + unfold coarseCaccioppoliCenteredBesovHessianFront + coarseCaccioppoliCenteredBesovHessianBase + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) + (mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le)) + · exact mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) + (quantitativeCubeCutoffHessianConst_nonneg d) + +theorem coarseCaccioppoliCenteredBesovGradientFront_nonneg + (d : ℕ) {s C : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) : + 0 ≤ coarseCaccioppoliCenteredBesovGradientFront d s C := by + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_sub_pos : 0 < geometricDiscount (1 - s) 1 := by + exact geometricDiscount_pos (by nlinarith) + have hgeomS_nonneg : 0 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hlt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hlt_one.le) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * C * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hC) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + unfold coarseCaccioppoliCenteredBesovGradientFront + coarseCaccioppoliCenteredBesovGradientBase + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (mul_nonneg hnote_nonneg hgeomS_nonneg) + (inv_nonneg.mpr hdisc_sub_pos.le) + · exact mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (quantitativeCubeCutoffGradientConst_nonneg d) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/Constructor.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/Constructor.lean new file mode 100644 index 0000000000..4ce9799cee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/Constructor.lean @@ -0,0 +1,435 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CenteredLocalCoefficient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup + +/-! # Constructor -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Buffered exact centered local coefficient, with descendant-local canonical +`A^\circ` factors, localized directly to the parent `Alpha` coefficient. The +cutoff radius is the midpoint, while the height and `Alpha` radius pair remain +the full outer pair. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_buffered_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField η) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + CeffLocal ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + have hs1 : s < 1 := by nlinarith [ht, hst] + have hsumR_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a s hs.le hR hBsum_s + have hB_nonneg : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm := by + simpa [ρm] using coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q η + have hAcirc1_nonneg : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm := by + simpa using coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm := by + simpa using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hξ : + cubeLpNorm R ∞ (scalarCutoffGradientField η) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρm := by + simpa [ρm, coarseCaccioppoliQuantitativeCutoffGradientBound] using + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le_on_descendant hR η + have hcentered := + coarseCaccioppoliFluxEnergyExactCenteredFactorBounds_buffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffWork) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) hCeffLocal hCeffWork hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk hscale hheight_le_j + exact + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_of_separated_factor_bounds + R a s CeffLocal (scalarCutoffGradientField η) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm) + hs hCeffLocal hB_nonneg hAcirc1_nonneg hAcircS_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a hs hsumR_s) + (show + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ + coarseCaccioppoliLambdaFactor R a s by + simp [coarseCaccioppoliLambdaFactor]) + hξ le_rfl le_rfl le_rfl + (by simpa [ρm] using hcentered) + +private theorem faithful_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + {S Cwork s ρ₁ ρ₂ : ℝ} {k : ℕ} + (hS : 0 ≤ S) + (hwork : (81 : ℝ) * S ≤ Cwork / (s * (1 - s))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + S * Real.rpow (3 : ℝ) (k : ℝ) ≤ + Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hpow : + Real.rpow (3 : ℝ) (k : ℝ) ≤ + 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [Real.rpow_natCast] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + hchoice hlt) + have hscaled := mul_le_mul_of_nonneg_left hpow hS + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + calc + S * Real.rpow (3 : ℝ) (k : ℝ) + ≤ S * (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) := hscaled + _ = (81 * S) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by ring + _ ≤ Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + mul_le_mul_of_nonneg_right hwork hgap_nonneg + +/-- Split buffered exact-to-parent-raw coefficient bounds from closed-cube +ellipticity and separate note budgets. + +`Calpha` controls the explicit height and centered absorption coefficient, +while `Ccross` controls only the constant/cross branch. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit.of_closedCubeEllipticity_of_bufferedCutoffRadiusConst_of_centeredFronts + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) s * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hwork_centered_fronts_alpha : + (81 : ℝ) * + (2 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal)) ≤ + ((Fintype.card (Fin d) : ℝ) * Calpha) / (s * (1 - s))) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit + Q a s t Clocal Calpha Ccross := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let Scenter : ℝ := + 2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hCeffAlpha_nonneg : 0 ≤ CeffAlpha := mul_nonneg hcard_nonneg hCalpha + have hs1 : s < 1 := by nlinarith [ht, hst] + have hScenter_nonneg : 0 ≤ Scenter := by + dsimp [Scenter] + exact add_nonneg + (add_nonneg + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal_nonneg hs)) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 4) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal_nonneg hs))) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal_nonneg hs hs1)) + have hcentered_alpha : (81 : ℝ) * Scenter ≤ CeffAlpha / (s * (1 - s)) := by + simpa [Scenter, CeffLocal, CeffAlpha] using hwork_centered_fronts_alpha + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + let hconst : + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := + faithfulWorkSmallCubeExactRawConstantBranchSplit_of_closedCubeEllipticity_of_bufferedCutoffRadiusConst + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) + hClocal hCcross hwork_constant_cross hs ht hst hEllCube hlarge + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt_m + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ) := by + simpa [hheight, j, CeffAlpha, ρ₁, ρ₂, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth + Q a s t CeffAlpha (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂)) + have hscale : + Scenter * Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffAlpha / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + faithful_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + hScenter_nonneg hcentered_alpha hchoice hlt + constructor + · intro R hR + simpa [CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, ρm, j, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using hconst n R hR + · intro R hR + simpa [CeffLocal, CeffAlpha, hheight, ρ₁, ρ₂, ρm, j, Scenter, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using + (coarseCaccioppoliFluxEnergyExactCenteredCoeff_buffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffAlpha) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) ηρ + hCeffLocal_nonneg hCeffAlpha_nonneg hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk + (by simpa [Scenter] using hscale) hheight_le_j) + +/-- All-radii split buffered exact-to-parent-raw coefficient bounds from +closed-cube ellipticity and separate note budgets. + +This is the proof-producing coefficient package used by the standard +beta-dependent radius iteration. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii.of_closedCubeEllipticity_of_bufferedCutoffRadiusConst_of_centeredFronts + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) s * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hwork_centered_fronts_alpha : + (81 : ℝ) * + (2 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal)) ≤ + ((Fintype.card (Fin d) : ℝ) * Calpha) / (s * (1 - s))) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + Q a s t Clocal Calpha Ccross := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let Scenter : ℝ := + 2 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hCeffAlpha_nonneg : 0 ≤ CeffAlpha := mul_nonneg hcard_nonneg hCalpha + have hs1 : s < 1 := by nlinarith [ht, hst] + have hScenter_nonneg : 0 ≤ Scenter := by + dsimp [Scenter] + exact add_nonneg + (add_nonneg + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal_nonneg hs)) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 4) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal_nonneg hs))) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 2) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal_nonneg hs hs1)) + have hcentered_alpha : (81 : ℝ) * Scenter ≤ CeffAlpha / (s * (1 - s)) := by + simpa [Scenter, CeffLocal, CeffAlpha] using hwork_centered_fronts_alpha + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + have hconst := + faithfulWorkSmallCubeExactRawConstantBranchSplitAllRadii_of_closedCubeEllipticity_of_bufferedCutoffRadiusConst + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) + hClocal hCcross hwork_constant_cross hs ht hst hEllCube hlarge + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt_m + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ) := by + simpa [hheight, j, CeffAlpha, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth + Q a s t CeffAlpha (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂)) + have hscale : + Scenter * Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffAlpha / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + faithful_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + hScenter_nonneg hcentered_alpha hchoice hlt + constructor + · intro R hR + simpa [CeffAlpha, CeffCross, hheight, ρm, j, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using hconst hρ₁ hlt hρ₂ R hR + · intro R hR + simpa [CeffLocal, CeffAlpha, hheight, ρm, j, Scenter, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using + (coarseCaccioppoliFluxEnergyExactCenteredCoeff_buffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffAlpha) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) ηρ + hCeffLocal_nonneg hCeffAlpha_nonneg hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk + (by simpa [Scenter] using hscale) hheight_le_j) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor.lean new file mode 100644 index 0000000000..e2758e65c8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor.lean @@ -0,0 +1,346 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.ConstantBranch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch + +/-! # Local Patch Constructor -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch exact small-cube coefficient constructors + +This file contains the final coefficient-package constructors for the +arbitrary-center local-patch exact small-cube route. Factor and branch estimates +live in the `LocalPatchConstructor/` submodules. +-/ + +/-- Direct split local-patch exact-to-parent-raw coefficient bounds from +closed-cube ellipticity. + +The constant branch is paid by `Ccross`, while the centered branch and the +integerized height are paid by `Calpha`. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit.of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst_of_centeredFronts + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (hCalpha : 0 ≤ Calpha) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hwork_centered_fronts_alpha : + (81 : ℝ) * + (6 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal)) ≤ + ((Fintype.card (Fin d) : ℝ) * Calpha) / (s * (1 - s))) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit + Q center a s t Clocal Calpha Ccross := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let Scenter : ℝ := + 6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hCeffAlpha_nonneg : 0 ≤ CeffAlpha := mul_nonneg hcard_nonneg hCalpha + have hs1 : s < 1 := by nlinarith [ht, hst] + have hScenter_nonneg : 0 ≤ Scenter := by + dsimp [Scenter] + exact add_nonneg + (add_nonneg + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 6) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal_nonneg hs)) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 12) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal_nonneg hs))) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 6) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal_nonneg hs hs1)) + have hcentered_alpha : (81 : ℝ) * Scenter ≤ CeffAlpha / (s * (1 - s)) := by + simpa [Scenter, CeffLocal, CeffAlpha] using hwork_centered_fronts_alpha + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + let hconst : + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := + faithfulWorkSmallCubeExactRawConstantBranchSplit_of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) + hClocal hwork_constant_cross hs ht hst hEllCube hlarge + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k, ρ₁, ρ₂] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha, ρ₁, ρ₂] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hheight_le_j0 : hheight ρ₁ ρ₂ ≤ (j0 : ℝ) := by + simpa [hheight, j0, CeffAlpha, ρ₁, ρ₂, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth + Q a s t CeffAlpha (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂)) + have hscale : + Scenter * Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffAlpha / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + localPatch_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + hScenter_nonneg hcentered_alpha hchoice hlt + constructor + · intro R hR + simpa [CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, ρm, j, + coarseCaccioppoliLocalPatchCutoffHessianBound] + using hconst n R hR + · intro R hR + simpa [CeffLocal, CeffAlpha, hheight, ρ₁, ρ₂, ρm, j, Scenter, + coarseCaccioppoliLocalPatchCutoffHessianBound] + using + (coarseCaccioppoliFluxEnergyExactCenteredCoeff_localPatchBuffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (center := center) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffAlpha) + (k := k) (j := j0) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) + hρ₁_pos hCeffLocal_nonneg hCeffAlpha_nonneg hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk + (by simpa [Scenter] using hscale) hheight_le_j0) + +/-- All-radii direct split local-patch exact-to-parent-raw coefficient bounds +from closed-cube ellipticity. + +This is the proof-producing coefficient package for the standard radius +iteration in the arbitrary-center boundary route. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii.of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst_of_centeredFronts + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) (hCalpha : 0 ≤ Calpha) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hwork_centered_fronts_alpha : + (81 : ℝ) * + (6 * coarseCaccioppoliCenteredAverageFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal) + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s + ((Fintype.card (Fin d) : ℝ) * Clocal)) ≤ + ((Fintype.card (Fin d) : ℝ) * Calpha) / (s * (1 - s))) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let Scenter : ℝ := + 6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := mul_nonneg hcard_nonneg hClocal + have hCeffAlpha_nonneg : 0 ≤ CeffAlpha := mul_nonneg hcard_nonneg hCalpha + have hs1 : s < 1 := by nlinarith [ht, hst] + have hScenter_nonneg : 0 ≤ Scenter := by + dsimp [Scenter] + exact add_nonneg + (add_nonneg + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 6) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal_nonneg hs)) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 12) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal_nonneg hs))) + (mul_nonneg (by norm_num : (0 : ℝ) ≤ 6) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal_nonneg hs hs1)) + have hcentered_alpha : (81 : ℝ) * Scenter ≤ CeffAlpha / (s * (1 - s)) := by + simpa [Scenter, CeffLocal, CeffAlpha] using hwork_centered_fronts_alpha + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + let hconst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := + faithfulWorkSmallCubeExactRawConstantBranchSplitAllRadii_of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) + hClocal hwork_constant_cross hs ht hst hEllCube hlarge + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hheight_le_j0 : hheight ρ₁ ρ₂ ≤ (j0 : ℝ) := by + simpa [hheight, j0, CeffAlpha, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_le_depth + Q a s t CeffAlpha (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂)) + have hscale : + Scenter * Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffAlpha / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + localPatch_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + hScenter_nonneg hcentered_alpha hchoice hlt + constructor + · intro R hR + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii, + CeffAlpha, CeffCross, hheight, ρm, j, coarseCaccioppoliLocalPatchCutoffHessianBound] + using hconst hρ₁ hlt hρ₂ R hR + · intro R hR + simpa [CeffLocal, CeffAlpha, hheight, ρm, j, Scenter, + coarseCaccioppoliLocalPatchCutoffHessianBound] + using + (coarseCaccioppoliFluxEnergyExactCenteredCoeff_localPatchBuffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (center := center) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffAlpha) + (k := k) (j := j0) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) + hρ₁_pos hCeffLocal_nonneg hCeffAlpha_nonneg hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk + (by simpa [Scenter] using hscale) hheight_le_j0) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/ConstantBranch.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/ConstantBranch.lean new file mode 100644 index 0000000000..fbf30fc0ed --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/ConstantBranch.lean @@ -0,0 +1,468 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.LocalPatchConstructor.Factors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch + +/-! # Constant Branch -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch exact small-cube constant branches + +This file contains the constant/cross branch constructors for the +arbitrary-center local-patch exact small-cube coefficient route. +-/ + +theorem localPatch_centered_fronts_scale_mul_le_workGap_of_triadicGapScaleChoice + {S Cwork s ρ₁ ρ₂ : ℝ} {k : ℕ} + (hS : 0 ≤ S) + (hwork : (81 : ℝ) * S ≤ Cwork / (s * (1 - s))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + S * Real.rpow (3 : ℝ) (k : ℝ) ≤ + Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hpow : + Real.rpow (3 : ℝ) (k : ℝ) ≤ + 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [Real.rpow_natCast] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + hchoice hlt) + have hscaled := mul_le_mul_of_nonneg_left hpow hS + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + calc + S * Real.rpow (3 : ℝ) (k : ℝ) + ≤ S * (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) := hscaled + _ = (81 * S) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by ring + _ ≤ Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := + mul_le_mul_of_nonneg_right hwork hgap_nonneg + +/-- Split constant branch of the local-patch exact-to-parent-raw coefficient +constructor. + +The integerized height/depth is governed by `Calpha`, but the constant/cross +coefficient itself is paid for by the independent `Ccross` budget. -/ +theorem + faithfulWorkSmallCubeExactRawConstantBranchSplit_of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let kR : ℝ := (k : ℝ) + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k, ρ₁, ρ₂] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha, ρ₁, ρ₂] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hj0_le_height_add_one : (j0 : ℝ) ≤ hheight ρ₁ ρ₂ + 1 := by + simpa [hheight, j0, k, CeffAlpha, ρ₁, ρ₂, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (faithful_integerized_height_depth_le_height_add_one + (Q := Q) (a := a) (s := s) (t := t) (C := CeffAlpha) hs k) + have hj_le_height_add_two : (j : ℝ) ≤ hheight ρ₁ ρ₂ + 2 := by + dsimp [j] + norm_num + nlinarith + have hB_nonneg : 0 ≤ B := by + dsimp [B, coarseCaccioppoliLocalPatchCutoffHessianBound] + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + have hscale_const : + (CeffLocal * Real.rpow (3 : ℝ) kR) * Real.rpow (3 : ℝ) (2 * s) ≤ + CeffCross * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [CeffLocal, CeffCross, kR] using + (faithful_scale_mul_rpow_s_le_workGap_of_triadicGapScaleChoice + (s := 2 * s) (C := CeffLocal) (Cwork := CeffCross) + (mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) hClocal) + (by simpa [CeffLocal, CeffCross, mul_assoc] using hwork_constant_cross) + hchoice hlt) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s_parent : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + dsimp + intro R hR + have hRj : R ∈ descendantsAtDepth Q j := by + simpa [j, j0, CeffAlpha, ρ₁, ρ₂] using hR + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hRj) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllR hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hsum_s : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + R a s hs hEllR hDataR + have hsum_one : + Summable (fun m : ℕ => + geometricWeight (1 : ℝ) 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := by + have hs_lt_one : s < 1 := by linarith + refine summable_geometricWeight_one_of_lt ?_ hs hs_lt_one hsum_s + intro m + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le m)) a) _ + have hξ : + cubeLpNorm R ∞ + (scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) ≤ + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm := by + simpa [coarseCaccioppoliLocalPatchCutoffGradientBound] using + coarseCaccioppoliLocalCanonicalFun_cubeLpNorm_infty_gradientField_le_on_cube + Q R center hρ₁_pos hlt_m + have hconstn : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (B + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + simpa [B, CeffLocal, kR, k, ρm] using + (coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_localPatch_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant_succ + (Q := Q) (R := R) (a := a) (Ceff := CeffLocal) + (k := k) (j := j0) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (by simpa [j] using hRj) hchoice hlt hjk + (by simpa [CeffLocal] using hlarge)) + have hlocal : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm))) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + have hlocal' := + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds + R a + (scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) + j hB_nonneg + (Ceff := CeffLocal) (kR := kR + (j : ℝ)) + (Aavg := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (Aflux1 := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a + (by norm_num : 0 < (1 : ℝ)) hsum_one) + (by simp [coarseCaccioppoliLambdaFactor]) + hξ + (by + simpa [B, sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hconstn) + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hlocal' + have hbase_le : + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR ≤ K := by + have hsingle : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a CeffLocal kR 1 ≤ K := by + simpa [CeffLocal, CeffCross, hheight, ρ₁, ρ₂, kR, j, K] using + (faithful_constant_descendant_coeff_le_cross_of_scale_height_add_two_le_depth + (Q := Q) (R := R) (j := j) a + (s := s) (C := CeffLocal) (Cwork := CeffCross) (k := kR) + (uL2Sq := 1) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (h := hheight) + (mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) hClocal) + hs (by nlinarith [ht, hst]) hEllCube hRj + hBsum_s_parent + hscale_const hj_le_height_add_two) + simpa [coarseCaccioppoliSingleCubeBoundaryConstantCoeff, + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff] using hsingle + exact le_trans + (by simpa [ξ, B, K] using hlocal) + hbase_le + +/-- All-radii split constant branch of the local-patch exact-to-parent-raw +coefficient constructor. + +This is the proof-producing version used by the standard beta-dependent +radius iteration. -/ +theorem + faithfulWorkSmallCubeExactRawConstantBranchSplitAllRadii_of_closedCubeEllipticity_of_localPatchBufferedCutoffRadiusConst + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (hClocal : 0 ≤ Clocal) + (hwork_constant_cross : + (81 : ℝ) * Real.rpow (3 : ℝ) (2 * s) * + ((Fintype.card (Fin d) : ℝ) * Clocal) ≤ + (Fintype.card (Fin d) : ℝ) * Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ + (Fintype.card (Fin d) : ℝ) * Clocal) : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + ∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let kR : ℝ := (k : ℝ) + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hj0_le_height_add_one : (j0 : ℝ) ≤ hheight ρ₁ ρ₂ + 1 := by + simpa [hheight, j0, k, CeffAlpha, + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + (faithful_integerized_height_depth_le_height_add_one + (Q := Q) (a := a) (s := s) (t := t) (C := CeffAlpha) hs k) + have hj_le_height_add_two : (j : ℝ) ≤ hheight ρ₁ ρ₂ + 2 := by + dsimp [j] + norm_num + nlinarith + have hB_nonneg : 0 ≤ B := by + dsimp [B, coarseCaccioppoliLocalPatchCutoffHessianBound] + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + have hscale_const : + (CeffLocal * Real.rpow (3 : ℝ) kR) * Real.rpow (3 : ℝ) (2 * s) ≤ + CeffCross * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [CeffLocal, CeffCross, kR] using + (faithful_scale_mul_rpow_s_le_workGap_of_triadicGapScaleChoice + (s := 2 * s) (C := CeffLocal) (Cwork := CeffCross) + (mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) hClocal) + (by simpa [CeffLocal, CeffCross, mul_assoc] using hwork_constant_cross) + hchoice hlt) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hBsum_s_parent : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a s hs hEllCube hData + dsimp + intro R hR + have hRj : R ∈ descendantsAtDepth Q j := by + simpa [j, j0, CeffAlpha] using hR + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hRj) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllR hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hsum_s : + Summable (fun m : ℕ => + geometricWeight s 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + R a s hs hEllR hDataR + have hsum_one : + Summable (fun m : ℕ => + geometricWeight (1 : ℝ) 1 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (1 / 2 : ℝ)) := by + have hs_lt_one : s < 1 := by linarith + refine summable_geometricWeight_one_of_lt ?_ hs hs_lt_one hsum_s + intro m + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le m)) a) _ + have hξ : + cubeLpNorm R ∞ + (scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) ≤ + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm := by + simpa [coarseCaccioppoliLocalPatchCutoffGradientBound] using + coarseCaccioppoliLocalCanonicalFun_cubeLpNorm_infty_gradientField_le_on_cube + Q R center hρ₁_pos hlt_m + have hconstn : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (B + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + simpa [B, CeffLocal, kR, k, ρm] using + (coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_localPatch_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant_succ + (Q := Q) (R := R) (a := a) (Ceff := CeffLocal) + (k := k) (j := j0) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (by simpa [j] using hRj) hchoice hlt hjk + (by simpa [CeffLocal] using hlarge)) + have hlocal : + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm))) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR := by + have hlocal' := + coarseCaccioppoliFluxEnergyExactConstantCoeff_mul_le_singleCubeBoundaryConstantBaseCoeff_of_factor_bounds + R a + (scalarCutoffGradientField (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) + j hB_nonneg + (Ceff := CeffLocal) (kR := kR + (j : ℝ)) + (Aavg := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (Aflux1 := coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a + (by norm_num : 0 < (1 : ℝ)) hsum_one) + (by simp [coarseCaccioppoliLambdaFactor]) + hξ + (by + simpa [B, sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hconstn) + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hlocal' + have hbase_le : + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a CeffLocal kR ≤ K := by + have hsingle : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a CeffLocal kR 1 ≤ K := by + simpa [CeffLocal, CeffCross, hheight, kR, j, K] using + (faithful_constant_descendant_coeff_le_cross_of_scale_height_add_two_le_depth + (Q := Q) (R := R) (j := j) a + (s := s) (C := CeffLocal) (Cwork := CeffCross) (k := kR) + (uL2Sq := 1) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (h := hheight) + (mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) hClocal) + hs (by nlinarith [ht, hst]) hEllCube hRj + hBsum_s_parent + hscale_const hj_le_height_add_two) + simpa [coarseCaccioppoliSingleCubeBoundaryConstantCoeff, + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff] using hsingle + exact le_trans + (by simpa [ξ, B, K] using hlocal) + hbase_le + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/Factors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/Factors.lean new file mode 100644 index 0000000000..a27043cbaf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/ExactSmallCube/LocalPatchConstructor/Factors.lean @@ -0,0 +1,868 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.ExactSmallCube.CenteredFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalConstantBranch + +/-! # Factors -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch exact small-cube factor estimates + +This file contains the centered average/Besov factor estimates for the +arbitrary-center local-patch exact small-cube coefficient route. +-/ + +/-- Average part of the centered exact coefficient for the local-patch +midpoint cutoff. The local cutoff radius and the extra descendant generation +combine to give the same normalized front as the centered buffered route. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localPatchBuffered_localAcircOne_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) Ceff ≤ + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let cut : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm + let cutBound : ℝ := + (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) + let K : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) + let L : ℝ := + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) * + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) + have hcut : cut ≤ cutBound := by + simpa [cut, cutBound, ρm] using + (cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + have hdiscS_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc1_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + refine mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) ?_ + refine mul_nonneg ?_ ?_ + · exact mul_nonneg + (mul_nonneg (by positivity) hCeff) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · exact mul_nonneg (inv_nonneg.mpr hdiscS_pos.le) + (inv_nonneg.mpr hdisc1_pos.le) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + simpa [LambdaSq, lambdaSq] using + (mul_nonneg + (Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _)) + have hmain : K * cut * L ≤ K * cutBound * L := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcut hK_nonneg) hL_nonneg + have hleft : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) Ceff = + K * cut * L := by + dsimp [K, cut, L] + unfold coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + coarseCaccioppoliLambdaFactor + coarseCaccioppoliCanonicalGradientAcircOne + coarseCaccioppoliCanonicalGradientAcirc + simp only [LambdaSq, lambdaSq] + ring_nf + rw [show LambdaSqFinite R s 1 a ^ (1 / 2 : ℝ) = + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 : ℝ) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) by rfl] + ac_rfl + have hright : + K * cutBound * L = + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := by + dsimp [K, cutBound, L] + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) Ceff + = K * cut * L := hleft + _ ≤ K * cutBound * L := hmain + _ = + ((d : ℝ) * (((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) := hright + +/-- Besov/cutoff-product part of the centered exact coefficient for the +local-patch midpoint cutoff. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localPatchBuffered_localAcirc_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s Ceff : ℝ} + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hCeff : 0 ≤ Ceff) (hs : 0 < s) (hs1 : s < 1) + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) ≤ + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let Hbase : ℝ := coarseCaccioppoliCenteredBesovHessianBase d s Ceff + let Gbase : ℝ := coarseCaccioppoliCenteredBesovGradientBase d s Ceff + let WH : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ ρm + let WG : ℝ := + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + have hH : + WH ≤ (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WH, ρm] using + (cubeBesovScaleWeight_neg_one_mul_localPatchDescendantBufferedCutoffHessianScaleBound_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hG : + WG ≤ (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [WG, ρm] using + (cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hdisc_one_pos : 0 < geometricDiscount (1 : ℝ) 1 := by + exact geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hdisc_sub_pos : 0 < geometricDiscount (1 - s) 1 := by + exact geometricDiscount_pos (by nlinarith) + have hgeomS_nonneg : 0 ≤ (1 - (3 : ℝ) ^ (-s))⁻¹ := by + have hlt_one : (3 : ℝ) ^ (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hlt_one.le) + have hnote_nonneg : + 0 ≤ ((3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1)) := by + exact mul_nonneg (mul_nonneg (by positivity) hCeff) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hHbase_nonneg : 0 ≤ Hbase := by + dsimp [Hbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) + (mul_nonneg hnote_nonneg (inv_nonneg.mpr hdisc_one_pos.le)) + have hGbase_nonneg : 0 ≤ Gbase := by + dsimp [Gbase] + refine mul_nonneg ?_ ?_ + · refine mul_nonneg ?_ (inv_nonneg.mpr hdisc_s_pos.le) + exact mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · refine mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) ?_ + exact mul_nonneg (mul_nonneg hnote_nonneg hgeomS_nonneg) + (inv_nonneg.mpr hdisc_sub_pos.le) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hHterm : + Hbase * WH * Pone ≤ + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + have h := + mul_le_mul_of_nonneg_left hH hHbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPone_nonneg + calc + Hbase * WH * Pone ≤ + Hbase * ((16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone := h' + _ = + (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone := by + dsimp [Hbase, coarseCaccioppoliCenteredBesovHessianFront] + ring + have hGterm : + Gbase * WG * Psub ≤ + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + have h := + mul_le_mul_of_nonneg_left hG hGbase_nonneg + have h' := mul_le_mul_of_nonneg_right h hPsub_nonneg + calc + Gbase * WG * Psub ≤ + Gbase * ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Psub := h' + _ = + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + dsimp [Gbase, coarseCaccioppoliCenteredBesovGradientFront] + ring + have hsplit : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) = + Hbase * WH * Pone + Gbase * WG * Psub := by + have hcancel_s : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight s R = 1 := + cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight R s + have hweight_sub : + cubeBesovScaleWeight (-s) R * cubeBesovScaleWeight (-(1 - s)) R = + cubeBesovScaleWeight (-1) R := by + rw [cubeBesovScaleWeight_mul_eq_add] + congr 1 + ring + let Wm : ℝ := cubeBesovScaleWeight (-s) R + let Wp : ℝ := cubeBesovScaleWeight s R + let Wo : ℝ := cubeBesovScaleWeight (-1) R + let Wsub : ℝ := cubeBesovScaleWeight (-(1 - s)) R + let Pow : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let DiscS : ℝ := (geometricDiscount s 1)⁻¹ + let Lam : ℝ := Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) + let DescH : ℝ := coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ ρm + let Xi : ℝ := coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm + let Sqrt : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (2 * (s - 1)))⁻¹) + let Note : ℝ := (3 / 2 : ℝ) * Ceff * (3 : ℝ) ^ ((d : ℝ) + 1) + let Disc1 : ℝ := (geometricDiscount (1 : ℝ) 1)⁻¹ + let DiscSub : ℝ := (geometricDiscount (1 - s) 1)⁻¹ + let Geom : ℝ := (1 - (3 : ℝ) ^ (-s))⁻¹ + let L1 : ℝ := Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) + let Lsub : ℝ := Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) + have hcancel : Wm * Wp = 1 := by + simpa [Wm, Wp] using hcancel_s + have hsub : Wm * Wsub = Wo := by + simpa [Wm, Wsub, Wo] using hweight_sub + have hexpanded : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) = + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := by + dsimp [Pow, Wm, Wp, Wo, Wsub, DiscS, Lam, DescH, Xi, Sqrt, Note, + Disc1, DiscSub, Geom, L1, Lsub] + unfold coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound + rw [cubeBesovScaleWeight_mul_centeredCutoffCoeffFactorBound_eq] + unfold coarseCaccioppoliLambdaFactor + coarseCaccioppoliCanonicalGradientAcircOne + coarseCaccioppoliCanonicalGradientAcircOneSub + coarseCaccioppoliCanonicalGradientAcirc + LambdaSq lambdaSq + rw [cubeScaleFactor_mul_coarseCaccioppoliLocalPatchCutoffHessianBound_eq_descendant + hR ρ₁ ρm] + ring_nf + rw [show LambdaSqFinite R s 1 a ^ (1 / 2 : ℝ) = + Real.rpow (LambdaSqFinite R s 1 a) (1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 : ℝ) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 : ℝ) 1 a) (-1 / 2 : ℝ) by rfl, + show lambdaSqFinite R (1 - s) 1 a ^ (-1 / 2 : ℝ) = + Real.rpow (lambdaSqFinite R (1 - s) 1 a) (-1 / 2 : ℝ) by rfl, + show (3 : ℝ) ^ (-2 + s * 2) = Real.rpow (3 : ℝ) (-2 + s * 2) by rfl] + ring + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) + = Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) := hexpanded + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + calc + Pow * Wm * DiscS * Lam * + (2 * (Wp * (DescH * Sqrt * (Note * (Wo * Disc1 * L1))) + + Xi * (Note * Geom * (Wsub * DiscSub * Lsub)))) + = Pow * DiscS * 2 * + ((Wm * Wp) * (Lam * DescH * Sqrt * Note * Wo * Disc1 * L1) + + (Wm * Wsub) * (Lam * Xi * Note * Geom * DiscSub * Lsub)) := by + ring + _ = + Pow * DiscS * (2 * (Sqrt * (Note * Disc1))) * + (Wo * DescH) * (Lam * L1) + + Pow * DiscS * (2 * ((Note * Geom) * DiscSub)) * + (Wo * Xi) * (Lam * Lsub) := by + rw [hcancel, hsub] + ring + _ = Hbase * WH * Pone + Gbase * WG * Psub := by + dsimp [Hbase, Gbase, WH, WG, Pone, Psub, Pow, DiscS, Lam, DescH, + Xi, Sqrt, Note, Disc1, DiscSub, Geom, L1, Lsub, + coarseCaccioppoliCenteredBesovHessianBase, + coarseCaccioppoliCenteredBesovGradientBase, LambdaSq, lambdaSq] + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) Ceff) + = Hbase * WH * Pone + Gbase * WG * Psub := hsplit + _ ≤ (4 * coarseCaccioppoliCenteredBesovHessianFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (2 * coarseCaccioppoliCenteredBesovGradientFront d s Ceff) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := + add_le_add hHterm hGterm + +/-- Average-plus-Besov factor-bound comparison for the local-patch centered +exact coefficient. The extra descendant generation is charged as an extra +factor `3` in the centered-front budget. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredFactorBounds_localPatchBuffered_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let jS : ℝ := ((j + 1 : ℕ) : ℝ) + let A : ℝ := 6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + let H : ℝ := 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + let G : ℝ := 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal + let Pone : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) + let Psub : ℝ := + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + let Theta : ℝ := Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + let depthTheta : ℝ := + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * jS) * Theta + let front : ℝ := CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ + have hs1 : s < 1 := by nlinarith [ht, hst] + have hpow_succ : + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) = + 3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS) := by + have hsplit : ((k : ℝ) - (j : ℝ)) = 1 + ((k : ℝ) - jS) := by + dsimp [jS] + norm_num + ring + have hadd : + Real.rpow (3 : ℝ) (1 + ((k : ℝ) - jS)) = + Real.rpow (3 : ℝ) (1 : ℝ) * + Real.rpow (3 : ℝ) ((k : ℝ) - jS) := + Real.rpow_add (by norm_num : 0 < (3 : ℝ)) (1 : ℝ) ((k : ℝ) - jS) + calc + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) + = Real.rpow (3 : ℝ) (1 + ((k : ℝ) - jS)) := by rw [hsplit] + _ = Real.rpow (3 : ℝ) (1 : ℝ) * + Real.rpow (3 : ℝ) ((k : ℝ) - jS) := hadd + _ = 3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS) := by norm_num + have havg_sub := + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound_localPatchBuffered_localAcircOne_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hR hchoice hlt + have hbesov_sub := + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound_localPatchBuffered_localAcirc_le_rpow_sub + (Q := Q) (R := R) (a := a) (s := s) (Ceff := CeffLocal) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + hCeffLocal hs hs1 hR hchoice hlt hjk + have havg_rhs_eq : + ((d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) * + ((4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)))) * + Pone = + A * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone := by + let Base : ℝ := + (d : ℝ) * (((3 / 2 : ℝ) * CeffLocal * (3 : ℝ) ^ ((d : ℝ) + 1)) * + ((geometricDiscount s 1)⁻¹ * (geometricDiscount (1 : ℝ) 1)⁻¹)) + let Grad : ℝ := quantitativeCubeCutoffGradientConst d + have hreplace : + Base * ((4 * Grad) * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone = + Base * ((4 * Grad) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS))) * Pone := + congrArg (fun x : ℝ => Base * ((4 * Grad) * x) * Pone) hpow_succ + change + Base * ((4 * Grad) * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone = + (6 * (Base * (2 * Grad))) * + Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + calc + Base * ((4 * Grad) * Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) * Pone + = Base * ((4 * Grad) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS))) * Pone := hreplace + _ = (6 * (Base * (2 * Grad))) * + Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone := by ring + have hbesov_sub' : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) CeffLocal) ≤ + H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub := by + have hH_eq : + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone = + H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone := by + have hreplace : + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone = + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS)) * Pone := + congrArg + (fun x : ℝ => + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * x * + Pone) hpow_succ + calc + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + = (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS)) * Pone := hreplace + _ = H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone := by + dsimp [H] + ring + have hG_eq : + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub = + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub := by + have hreplace : + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub = + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS)) * Psub := + congrArg + (fun x : ℝ => + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * x * + Psub) hpow_succ + calc + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub + = (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + (3 * Real.rpow (3 : ℝ) ((k : ℝ) - jS)) * Psub := hreplace + _ = G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub := by + dsimp [G] + ring + calc + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) CeffLocal) + ≤ + (4 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Pone + + (2 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) * Psub := by + simpa [ρm, Pone, Psub] using hbesov_sub + _ = + H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub := by + exact congrArg₂ (fun x y : ℝ => x + y) hH_eq hG_eq + have hfactor_sub : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) ≤ + A * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub) := by + exact add_le_add + (by simpa [Pone, ρm] using le_trans havg_sub havg_rhs_eq.le) + hbesov_sub' + have hprod_one : + Real.rpow (3 : ℝ) (-jS) * Pone ≤ depthTheta := by + simpa [Pone, Theta, depthTheta, jS] using + (faithful_centered_descendant_product_one_le_parent_theta + (Q := Q) (R := R) (j := j + 1) a hs ht hst hEllCube hR + hBsum_s hSigmaSum_t) + have hprod_sub : + Real.rpow (3 : ℝ) (-jS) * Psub ≤ depthTheta := by + simpa [Psub, Theta, depthTheta, jS] using + (faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j + 1) a hs ht hst hEllCube hR + hBsum_s hSigmaSum_t) + have hPone_nonneg : 0 ≤ Pone := by + dsimp [Pone] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 : ℝ) a (by norm_num)) _) + have hPsub_nonneg : 0 ≤ Psub := by + dsimp [Psub] + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hA_nonneg : 0 ≤ A := by + exact mul_nonneg (by norm_num) + (coarseCaccioppoliCenteredAverageFront_nonneg d hCeffLocal hs) + have hH_nonneg : 0 ≤ H := by + exact mul_nonneg (by norm_num) + (coarseCaccioppoliCenteredBesovHessianFront_nonneg d hCeffLocal hs) + have hG_nonneg : 0 ≤ G := by + exact mul_nonneg (by norm_num) + (coarseCaccioppoliCenteredBesovGradientFront_nonneg d hCeffLocal hs hs1) + have hTheta_nonneg : 0 ≤ Theta := by + dsimp [Theta] + exact Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le ht.le) _ + have hdepthTheta_nonneg : 0 ≤ depthTheta := by + dsimp [depthTheta] + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hTheta_nonneg + have hpowk_nonneg : 0 ≤ Real.rpow (3 : ℝ) (k : ℝ) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hApow_nonneg : 0 ≤ A * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hA_nonneg hpowk_nonneg + have hHpow_nonneg : 0 ≤ H * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hH_nonneg hpowk_nonneg + have hGpow_nonneg : 0 ≤ G * Real.rpow (3 : ℝ) (k : ℝ) := + mul_nonneg hG_nonneg hpowk_nonneg + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : 0 ≤ front := by + dsimp [front] + exact mul_nonneg (div_nonneg hCeffWork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hpow_split : + Real.rpow (3 : ℝ) ((k : ℝ) - jS) = + Real.rpow (3 : ℝ) (k : ℝ) * Real.rpow (3 : ℝ) (-jS) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have hsub_rhs_eq : + A * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub) = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Psub) := by + rw [hpow_split] + ring + have hterms_to_depth : + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Psub) ≤ + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + calc + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Psub) + ≤ + (A * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + exact add_le_add + (add_le_add + (mul_le_mul_of_nonneg_left hprod_one hApow_nonneg) + (mul_le_mul_of_nonneg_left hprod_one hHpow_nonneg)) + (mul_le_mul_of_nonneg_left hprod_sub hGpow_nonneg) + _ = ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := by + ring + have hfront_depth : + ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta ≤ + front * depthTheta := by + exact mul_le_mul_of_nonneg_right + (by simpa [A, H, G, front] using hscale) hdepthTheta_nonneg + have hheight_le_jS : hheight ρ₁ ρ₂ ≤ jS := by + have hj_le_succ : (j : ℝ) ≤ jS := by + dsimp [jS] + exact_mod_cast Nat.le_succ j + exact le_trans hheight_le_j hj_le_succ + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * jS ≤ + -coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂ := by + exact mul_le_mul_of_nonpos_left hheight_le_jS (by linarith) + have hpow_height : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * jS) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ (3 : ℝ)) hexp_le + have hheight_step : + front * depthTheta ≤ + front * (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := by + refine mul_le_mul_of_nonneg_left ?_ hfront_nonneg + dsimp [depthTheta] + exact mul_le_mul_of_nonneg_right hpow_height hTheta_nonneg + calc + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) CeffLocal + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound R s + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliLambdaFactor R a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound R s + (coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + CeffLocal) + ≤ A * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + (H * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Pone + + G * Real.rpow (3 : ℝ) ((k : ℝ) - jS) * Psub) := hfactor_sub + _ = + (A * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (H * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Pone) + + (G * Real.rpow (3 : ℝ) (k : ℝ)) * + (Real.rpow (3 : ℝ) (-jS) * Psub) := hsub_rhs_eq + _ ≤ ((A + H + G) * Real.rpow (3 : ℝ) (k : ℝ)) * depthTheta := + hterms_to_depth + _ ≤ front * depthTheta := hfront_depth + _ ≤ front * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Theta) := hheight_step + _ = CeffWork / (s * (1 - s)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * hheight ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + dsimp [front, Theta] + ring + _ = coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + rfl + +/-- Local-patch exact centered coefficient, with descendant-local canonical +`A^\circ` factors, localized directly to the parent `Alpha` coefficient. The +cutoff is the translated local patch cutoff on the midpoint radius, so the +descendant lies one generation deeper than the centered buffered route. -/ +theorem + coarseCaccioppoliFluxEnergyExactCenteredCoeff_localPatchBuffered_localAcirc_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (center : Vec d) (a : CoeffField d) + {s t CeffLocal CeffWork : ℝ} {k j : ℕ} {ρ₁ ρ₂ lam Lam : ℝ} + {hheight : ℝ → ℝ → ℝ} + (hρ₁_pos : 0 < ρ₁) + (hCeffLocal : 0 ≤ CeffLocal) (hCeffWork : 0 ≤ CeffWork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hscale : + (6 * coarseCaccioppoliCenteredAverageFront d s CeffLocal + + 12 * coarseCaccioppoliCenteredBesovHessianFront d s CeffLocal + + 6 * coarseCaccioppoliCenteredBesovGradientFront d s CeffLocal) * + Real.rpow (3 : ℝ) (k : ℝ) ≤ + CeffWork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hheight_le_j : hheight ρ₁ ρ₂ ≤ (j : ℝ)) : + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + CeffLocal ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffWork hheight ρ₁ ρ₂ := by + dsimp + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + have hlt_m : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hs1 : s < 1 := by nlinarith [ht, hst] + have hsumR_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j + 1) a s hs.le hR hBsum_s + have hB_nonneg : + 0 ≤ coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm := by + dsimp [coarseCaccioppoliLocalPatchCutoffHessianBound] + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + have hAcirc1_nonneg : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm := by + simpa using coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm := by + simpa using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hξ : + cubeLpNorm R ∞ + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) ≤ + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ ρm := by + simpa [ρm, coarseCaccioppoliLocalPatchCutoffGradientBound] using + coarseCaccioppoliLocalCanonicalFun_cubeLpNorm_infty_gradientField_le_on_cube + Q R center hρ₁_pos hlt_m + have hcentered := + coarseCaccioppoliFluxEnergyExactCenteredFactorBounds_localPatchBuffered_localAcirc_le_alpha_of_scale + (Q := Q) (R := R) (a := a) (s := s) (t := t) + (CeffLocal := CeffLocal) (CeffWork := CeffWork) + (k := k) (j := j) (ρ₁ := ρ₁) (ρ₂ := ρ₂) + (hheight := hheight) hCeffLocal hCeffWork hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hchoice hlt hjk hscale hheight_le_j + exact + coarseCaccioppoliFluxEnergyExactCenteredCoeff_le_of_separated_factor_bounds + R a s CeffLocal + (scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm)) + (coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm) + (coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm) + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm) + hs hCeffLocal hB_nonneg hAcirc1_nonneg hAcircS_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor R a hs hsumR_s) + (show + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ + coarseCaccioppoliLambdaFactor R a s by + simp [coarseCaccioppoliLambdaFactor]) + hξ le_rfl le_rfl le_rfl + (by simpa [ρm] using hcentered) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations.lean new file mode 100644 index 0000000000..a9fedb474e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.PositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge + +/-! # Input Specializations -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/FaithfulDescendant.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/FaithfulDescendant.lean new file mode 100644 index 0000000000..36fa4901c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/FaithfulDescendant.lean @@ -0,0 +1,737 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.SolutionInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Faithful Descendant -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Descendant version of the coefficient localization displayed after the +single-cube estimate in the notes, for the centered ellipticity product. -/ +theorem faithful_centered_descendant_product_le_parent_theta + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s t lam Lam : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hEllRcube : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hEllRopen : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEllRcube.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllRcube hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hBsumR_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a s hs.le hR hBsum_s + have hSigmaSumR_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a t ht.le hR hSigmaSum_t + have hellipticR : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization R a s t := + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization.of_isEllipticFieldOn_of_isSigmaCoarse + R a hs ht hst hEllRopen hDataR hBsumR_s hSigmaSumR_t + have hfactor_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + have htheta : + Real.rpow (3 : ℝ) (-(j : ℝ)) * + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + simpa [htoNat, coarseCaccioppoliSigma] using + (thetaRatio_boundary_coefficient_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s t hs.le ht.le + (mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR) + hBsum_s hSigmaSum_t) + calc + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) + ≤ + Real.rpow (3 : ℝ) (-(j : ℝ)) * + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hellipticR.2 hfactor_nonneg + _ ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := htheta + +/-- Variant of `faithful_centered_descendant_product_le_parent_theta` with +`lambdaSq R 1` in the inverse slot. + +This is the structural line needed by the average part of the exact centered +coefficient, whose local canonical `A^\circ_1(R)` contains +`lambdaSq R 1`. Since `1 - s < 1`, the inverse lambda monotonicity upgrades +the `1` slot to the centered `1 - s` slot before applying the usual +descendant theta localization. -/ +theorem faithful_centered_descendant_product_one_le_parent_theta + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s t lam Lam : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hs1 : s < 1 := by nlinarith [ht, hst] + have hone_sub_pos : 0 < 1 - s := by linarith + have hEllRcube : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hEllRopen : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEllRcube.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllRcube hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + have hSigmaSumR_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 - s) hone_sub_pos.le hR + hSigmaSum_one_sub_s + have hlambda_one : + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) (a := a) (t := 1 - s) (s := (1 : ℝ)) + hone_sub_pos (by linarith) hEllRopen hDataR hSigmaSumR_one_sub_s + have hLambda_nonneg : + 0 ≤ Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _ + have hprod_le : + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ) := + mul_le_mul_of_nonneg_left hlambda_one hLambda_nonneg + have hpow_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + exact le_trans + (mul_le_mul_of_nonneg_left hprod_le hpow_nonneg) + (faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t) + +/-- Faithful descendant centered coefficient localization, with the harmless +triadic scale constants isolated in `hscaleC`. -/ +private theorem faithful_centered_descendant_coeff_le_alpha_of_scale + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s t C Cwork k ρ₁ ρ₂ lam Lam : ℝ} + {h : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) (hCwork : 0 ≤ Cwork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hlt : ρ₁ < ρ₂) + (hscaleC : + C / (s * (1 - s)) * Real.rpow (3 : ℝ) k ≤ + Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hh : h ρ₁ ρ₂ = (j : ℝ)) : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s C k (j : ℝ) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork h ρ₁ ρ₂ := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hleft_factor_nonneg : + 0 ≤ C / (s * (1 - s)) * Real.rpow (3 : ℝ) k := by + exact mul_nonneg (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hright_factor_nonneg : + 0 ≤ Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + exact mul_nonneg (div_nonneg hCwork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have hprod := + faithful_centered_descendant_product_le_parent_theta + (Q := Q) (R := R) (j := j) a hs ht hst hEllCube hR hBsum_s hSigmaSum_t + have hprod_left_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(j : ℝ)) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) := by + refine mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) ?_ + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R (1 - s) a + (sub_nonneg.mpr hs1.le)) _) + have hscaled := + mul_le_mul hscaleC hprod hprod_left_nonneg hright_factor_nonneg + have hpow_split : + Real.rpow (3 : ℝ) (k - (j : ℝ)) = + Real.rpow (3 : ℝ) k * Real.rpow (3 : ℝ) (-(j : ℝ)) := by + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + calc + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s C k (j : ℝ) + = + (C / (s * (1 - s)) * Real.rpow (3 : ℝ) k) * + (Real.rpow (3 : ℝ) (-(j : ℝ)) * + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R (1 - s) (.finite 1) a) (-1 / 2 : ℝ))) := by + unfold coarseCaccioppoliSingleCubeBoundaryCenteredCoeff + rw [hpow_split] + ring + _ ≤ + (Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) * + (Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := hscaled + _ = + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryAlphaOfHeight + rw [hh] + ring + +/-- Descendant localization for the constant branch ellipticity factor: +`Λ_1(R)^{1/2} ≤ 3^{s j} Λ_s(Q)^{1/2}`. -/ +private theorem faithful_constant_descendant_lambda_one_le_parent_lambda_s + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s lam Lam : ℝ} + (hs : 0 < s) (hs1 : s < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hEllRcube : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEllCube.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hEllRopen : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEllRcube.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + have hRecR : + OpenCubeDescendantEllipticRecoveryFamily R a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := R) (a := a) hEllRcube hOrigin + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRecR + have hBsumR_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a s hs.le hR hBsum_s + have hmonoR : + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) (a := a) (t := s) (s := (1 : ℝ)) (lam := lam) (Lam := Lam) + hs hs1 hEllRopen hDataR hBsumR_s + have hdesc : + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a s hs.le hR hBsum_s + exact le_trans hmonoR hdesc + +/-- The triadic gap scale absorbs the local factor `3^k` after enlarging the +working constant by the universal factor `81`. -/ +private theorem faithful_scale_mul_le_workGap_of_triadicGapScaleChoice + {C Cwork ρ₁ ρ₂ : ℝ} {k : ℕ} + (hC : 0 ≤ C) (hwork : (81 : ℝ) * C ≤ Cwork) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + C * Real.rpow (3 : ℝ) (k : ℝ) ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hpow : + Real.rpow (3 : ℝ) (k : ℝ) ≤ + 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [Real.rpow_natCast] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + hchoice hlt) + have hscaled := + mul_le_mul_of_nonneg_left hpow hC + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + calc + C * Real.rpow (3 : ℝ) (k : ℝ) + ≤ C * (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) := hscaled + _ = (81 * C) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by ring + _ ≤ Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ := + mul_le_mul_of_nonneg_right hwork hgap_nonneg + +/-- Centered-coefficient variant of +`faithful_scale_mul_le_workGap_of_triadicGapScaleChoice`, with the harmless +factor `1 / (s * (1 - s))` carried along. -/ +theorem faithful_centered_scale_mul_le_workGap_of_triadicGapScaleChoice + {s C Cwork ρ₁ ρ₂ : ℝ} {k : ℕ} + (hC : 0 ≤ C) (hwork : (81 : ℝ) * C ≤ Cwork) + (hs : 0 < s) (hs1 : s < 1) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k : ℝ) ≤ + Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hscale := + faithful_scale_mul_le_workGap_of_triadicGapScaleChoice + (C := C) (Cwork := Cwork) hC hwork hchoice hlt + have hden_pos : 0 < s * (1 - s) := by nlinarith + have hinv_nonneg : 0 ≤ (s * (1 - s))⁻¹ := + inv_nonneg.mpr hden_pos.le + have hscaled := + mul_le_mul_of_nonneg_left hscale hinv_nonneg + calc + C / (s * (1 - s)) * Real.rpow (3 : ℝ) (k : ℝ) + = (s * (1 - s))⁻¹ * (C * Real.rpow (3 : ℝ) (k : ℝ)) := by + ring + _ ≤ (s * (1 - s))⁻¹ * (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂) := hscaled + _ = Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + ring + +/-- Constant-branch scale absorption with the extra `3^s` ceiling loss. -/ +theorem faithful_scale_mul_rpow_s_le_workGap_of_triadicGapScaleChoice + {s C Cwork ρ₁ ρ₂ : ℝ} {k : ℕ} + (hC : 0 ≤ C) + (hwork : (81 : ℝ) * Real.rpow (3 : ℝ) s * C ≤ Cwork) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + (C * Real.rpow (3 : ℝ) (k : ℝ)) * Real.rpow (3 : ℝ) s ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hpow : + Real.rpow (3 : ℝ) (k : ℝ) ≤ + 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [Real.rpow_natCast] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + hchoice hlt) + have hscaled := + mul_le_mul_of_nonneg_left hpow hC + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hpow_s_nonneg : 0 ≤ Real.rpow (3 : ℝ) s := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + (C * Real.rpow (3 : ℝ) (k : ℝ)) * Real.rpow (3 : ℝ) s + ≤ (C * (81 * coarseCaccioppoliGapInv ρ₁ ρ₂)) * + Real.rpow (3 : ℝ) s := by + exact mul_le_mul_of_nonneg_right hscaled hpow_s_nonneg + _ = (81 * Real.rpow (3 : ℝ) s * C) * + coarseCaccioppoliGapInv ρ₁ ρ₂ := by ring + _ ≤ Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ := + mul_le_mul_of_nonneg_right hwork hgap_nonneg + +/-- A ceiling estimate for the integerized localized small-cube height. -/ +theorem faithful_integerized_height_depth_le_height_add_one + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {s t C : ℝ} (hs : 0 < s) (k : ℕ) : + ((coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthAtScale + Q a s t C k : ℕ) : ℝ) ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k + 1 := by + have hheight_nonneg : + 0 ≤ coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale Q a s t C k := by + exact le_trans (div_nonneg (by norm_num : 0 ≤ (4 : ℝ)) hs.le) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s + Q a s t C k) + exact le_of_lt (Nat.ceil_lt_add_one hheight_nonneg) + +/-- The unit-`L²` cross coefficient times a parent `L²` bound is controlled by +the public cross coefficient. This is the finite-Cauchy bookkeeping used in +the faithful small-cube proof: local descendant `L²` norms are summed first, +then the parent `L²` size is inserted. -/ +theorem boundaryCrossCoeff_one_mul_le_boundaryCrossCoeff_of_cubeLpNorm_le_sqrt + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {s C uL2Sq ρ₁ ρ₂ U : ℝ} {h : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (hlt : ρ₁ < ρ₂) + (hU : U ≤ Real.sqrt uL2Sq) : + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C 1 h ρ₁ ρ₂ * U ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ := by + let front : ℝ := + C * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + have hfront_nonneg : 0 ≤ front := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg hC (coarseCaccioppoliGapInv_nonneg hlt)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _) + have hmul := mul_le_mul_of_nonneg_left hU hfront_nonneg + simpa [coarseCaccioppoliBoundaryCrossCoeffOfHeight, front, mul_assoc] using hmul + +/-- Descendant constant coefficient localization against the real localized +height, with the ceiling loss isolated in `hscaleC`. -/ +theorem faithful_constant_descendant_coeff_le_cross_of_scale_height_le_depth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s C Cwork k uL2Sq ρ₁ ρ₂ lam Lam : ℝ} + {h : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) + (hs : 0 < s) (hs1 : s < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hscaleC : + (C * Real.rpow (3 : ℝ) k) * Real.rpow (3 : ℝ) s ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hj_le : (j : ℝ) ≤ h ρ₁ ρ₂ + 1) : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a C k uL2Sq ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Cwork uL2Sq h ρ₁ ρ₂ := by + have hLambda := + faithful_constant_descendant_lambda_one_le_parent_lambda_s + (Q := Q) (R := R) (j := j) a hs hs1 hEllCube hR hBsum_s + have hleft_factor_nonneg : + 0 ≤ C * Real.rpow (3 : ℝ) k := by + exact mul_nonneg hC (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hpow_depth : + Real.rpow (3 : ℝ) (s * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + have hexp_le : s * (j : ℝ) ≤ s + s * h ρ₁ ρ₂ := by + nlinarith [mul_le_mul_of_nonneg_left hj_le hs.le] + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) + ≤ Real.rpow (3 : ℝ) (s + s * h ρ₁ ρ₂) := by + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + _ = Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + simpa using + (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) s + (s * h ρ₁ ρ₂)) + have hcoeff_depth : + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + calc + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) + ≤ (C * Real.rpow (3 : ℝ) k) * + (Real.rpow (3 : ℝ) s * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) := by + exact mul_le_mul_of_nonneg_left hpow_depth hleft_factor_nonneg + _ = ((C * Real.rpow (3 : ℝ) k) * Real.rpow (3 : ℝ) s) * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by ring + _ ≤ (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂) * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + exact mul_le_mul_of_nonneg_right hscaleC + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by ring + have hLambda_nonneg : + 0 ≤ Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R 1 a (by norm_num)) _ + have hLambdaQ_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _ + have hcoeffLambda : + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + calc + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) + ≤ + (C * Real.rpow (3 : ℝ) k) * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hLambda hleft_factor_nonneg + _ = + ((C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ))) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by ring + _ ≤ + (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right hcoeff_depth hLambdaQ_nonneg + have hsqrt_nonneg : 0 ≤ Real.sqrt uL2Sq := Real.sqrt_nonneg _ + calc + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a C k uL2Sq + = + ((C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ)) * + Real.sqrt uL2Sq := by + unfold coarseCaccioppoliSingleCubeBoundaryConstantCoeff + ring + _ ≤ + ((Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) * + Real.sqrt uL2Sq := by + exact mul_le_mul_of_nonneg_right hcoeffLambda hsqrt_nonneg + _ = + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Cwork uL2Sq h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + ring + +/-- Depth-plus-one version of +`faithful_constant_descendant_coeff_le_cross_of_scale_height_le_depth`. + +The arbitrary-center local-patch route takes descendants one generation deeper +than the integerized height. The constant branch therefore needs one extra +factor `3^s` in the work-constant budget. -/ +theorem faithful_constant_descendant_coeff_le_cross_of_scale_height_add_two_le_depth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s C Cwork k uL2Sq ρ₁ ρ₂ lam Lam : ℝ} + {h : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) + (hs : 0 < s) (hs1 : s < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hscaleC : + (C * Real.rpow (3 : ℝ) k) * Real.rpow (3 : ℝ) (2 * s) ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hj_le : (j : ℝ) ≤ h ρ₁ ρ₂ + 2) : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a C k uL2Sq ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Cwork uL2Sq h ρ₁ ρ₂ := by + have hLambda := + faithful_constant_descendant_lambda_one_le_parent_lambda_s + (Q := Q) (R := R) (j := j) a hs hs1 hEllCube hR hBsum_s + have hleft_factor_nonneg : + 0 ≤ C * Real.rpow (3 : ℝ) k := by + exact mul_nonneg hC (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hpow_depth : + Real.rpow (3 : ℝ) (s * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (2 * s) * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + have hexp_le : s * (j : ℝ) ≤ 2 * s + s * h ρ₁ ρ₂ := by + nlinarith [mul_le_mul_of_nonneg_left hj_le hs.le] + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) + ≤ Real.rpow (3 : ℝ) (2 * s + s * h ρ₁ ρ₂) := by + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + _ = Real.rpow (3 : ℝ) (2 * s) * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + simpa using + (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) (2 * s) + (s * h ρ₁ ρ₂)) + have hcoeff_depth : + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) ≤ + Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + calc + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) + ≤ (C * Real.rpow (3 : ℝ) k) * + (Real.rpow (3 : ℝ) (2 * s) * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) := by + exact mul_le_mul_of_nonneg_left hpow_depth hleft_factor_nonneg + _ = ((C * Real.rpow (3 : ℝ) k) * Real.rpow (3 : ℝ) (2 * s)) * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by ring + _ ≤ (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂) * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + exact mul_le_mul_of_nonneg_right hscaleC + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by ring + have hLambda_nonneg : + 0 ≤ Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R 1 a (by norm_num)) _ + have hLambdaQ_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _ + have hcoeffLambda : + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + calc + (C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) + ≤ + (C * Real.rpow (3 : ℝ) k) * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hLambda hleft_factor_nonneg + _ = + ((C * Real.rpow (3 : ℝ) k) * + Real.rpow (3 : ℝ) (s * (j : ℝ))) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by ring + _ ≤ + (Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right hcoeff_depth hLambdaQ_nonneg + have hsqrt_nonneg : 0 ≤ Real.sqrt uL2Sq := Real.sqrt_nonneg _ + calc + coarseCaccioppoliSingleCubeBoundaryConstantCoeff R a C k uL2Sq + = + ((C * Real.rpow (3 : ℝ) k) * + Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ)) * + Real.sqrt uL2Sq := by + unfold coarseCaccioppoliSingleCubeBoundaryConstantCoeff + ring + _ ≤ + ((Cwork * coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) * + Real.sqrt uL2Sq := by + exact mul_le_mul_of_nonneg_right hcoeffLambda hsqrt_nonneg + _ = + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s Cwork uL2Sq h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + ring + +/-- The centered faithful coefficient produced at the integerized depth is +bounded by the parent alpha coefficient at the real localized height. -/ +theorem faithful_centered_descendant_coeff_le_alpha_of_scale_height_le_depth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {j : ℕ} + (a : CoeffField d) {s t C Cwork k ρ₁ ρ₂ lam Lam : ℝ} + {h : ℝ → ℝ → ℝ} + (hC : 0 ≤ C) (hCwork : 0 ≤ Cwork) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hlt : ρ₁ < ρ₂) + (hscaleC : + C / (s * (1 - s)) * Real.rpow (3 : ℝ) k ≤ + Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) + (hh_le : h ρ₁ ρ₂ ≤ (j : ℝ)) : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s C k (j : ℝ) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork h ρ₁ ρ₂ := by + let hint : ℝ → ℝ → ℝ := fun _ _ => (j : ℝ) + have hcent_j : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff R a s C k (j : ℝ) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork hint ρ₁ ρ₂ := + faithful_centered_descendant_coeff_le_alpha_of_scale + (Q := Q) (R := R) (j := j) a hC hCwork hs ht hst hEllCube hR + hBsum_s hSigmaSum_t hlt hscaleC (by simp [hint]) + have hσ_pos : 0 < coarseCaccioppoliSigma s t := + coarseCaccioppoli_sigma_pos hst + have hexp_le : + -coarseCaccioppoliSigma s t * (j : ℝ) ≤ + -coarseCaccioppoliSigma s t * h ρ₁ ρ₂ := by + nlinarith + have hpow_le : + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hexp_le + have hs1 : s < 1 := by nlinarith [ht, hst] + have hden_nonneg : 0 ≤ s * (1 - s) := + mul_nonneg hs.le (sub_nonneg.mpr hs1.le) + have hfront_nonneg : + 0 ≤ Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + exact mul_nonneg (div_nonneg hCwork hden_nonneg) + (coarseCaccioppoliGapInv_nonneg hlt) + have htheta_nonneg : + 0 ≤ Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := + Real.rpow_nonneg (thetaRatio_nonneg Q s t a hs.le (by linarith : 0 ≤ t)) _ + have hAlpha_le : + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork hint ρ₁ ρ₂ ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork h ρ₁ ρ₂ := by + calc + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork hint ρ₁ ρ₂ + = + (Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + unfold coarseCaccioppoliBoundaryAlphaOfHeight + simp [hint] + _ ≤ + (Cwork / (s * (1 - s)) * coarseCaccioppoliGapInv ρ₁ ρ₂) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hpow_le hfront_nonneg) htheta_nonneg + _ = + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t Cwork h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryAlphaOfHeight + ring + exact le_trans hcent_j hAlpha_le + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge.lean new file mode 100644 index 0000000000..42865f826f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.BoundarySplit + +/-! # Local Patch Note Raw Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch note raw bridge + +This sidecar ties the arbitrary-center local-patch descendant summation to the +harmonic weak-testing identity. It covers the interior-contained local patch +case: the translated cutoff support is required to lie inside the parent open +cube, so the compact-support test function is admissible without a boundary +zero-trace argument. +-/ + +/-- Boundary local-patch split raw bridge for a constant harmonic family, in +the boundary-touching case supplied by a localized scalar zero-trace condition. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_localizedZeroTrace_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} {V : Set (Vec d)} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V u0.toH1.toFun) + (hClocal : 0 ≤ Clocal) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcutoffWindow : ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliLocalClosedCube Q center ρm ⊆ V) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit + Q center a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit + Q center a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + refine + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_testing_of_closedCubeEllipticity + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) (u0 := u0) + hClocal hCcross hCsol_le hs ht hst hEllCube ?_ hrawcoeff + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm x * energy x) := by + simpa [coarseCaccioppoliLocalEnergyRadiusProfile] using + coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy_of_integrable + Q center energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + have htestη := + le_abs_cubeAverage_vecDot_flux_localCanonicalCutoff_of_aHarmonicFunction_of_localizedZeroTrace_of_le_localCanonicalCutoffEnergy + Q a center u0 hEllOpen hzero hρ₁_pos hlt_mid + (by simpa [ρ₁, ρ₂, ρm] using hcutoffWindow n) + (by simpa [energy] using hlowerρ) + simpa [ρ₁, ρ₂, ρm, energy, flux, u, ξ] using htestη + +/-- All-radii boundary local-patch split raw bridge for a constant harmonic +family, in the boundary-touching case supplied by a localized scalar +zero-trace condition. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_localizedZeroTrace_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} {V : Set (Vec d)} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V u0.toH1.toFun) + (hClocal : 0 ≤ Clocal) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcutoffWindow : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliLocalClosedCube Q center ρm ⊆ V) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + Q center a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + refine + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_testing_of_closedCubeEllipticity + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) (u0 := u0) + hClocal hCcross hCsol_le hs ht hst hEllCube ?_ hrawcoeff + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm x * energy x) := by + simpa [coarseCaccioppoliLocalEnergyRadiusProfile] using + coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy_of_integrable + Q center energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + have htestη := + le_abs_cubeAverage_vecDot_flux_localCanonicalCutoff_of_aHarmonicFunction_of_localizedZeroTrace_of_le_localCanonicalCutoffEnergy + Q a center u0 hEllOpen hzero hρ₁_pos hlt_mid + (by simpa [ρm] using hcutoffWindow hρ₁ hlt hρ₂) + (by simpa [energy] using hlowerρ) + simpa [ρm, energy, flux, u, ξ] using htestη + +/-- Boundary local-patch standard note-RHS endpoint for a constant harmonic +family with zero trace on the full local `cu_{m-1}` window, with split note +coefficients. -/ +theorem + coarseCaccioppoli_boundary_localPatch_qone_standard_le_noteRhs_explicitSplit_of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_localizedZeroTraceOnLocalOpenCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hzero : + LocalizedZeroTraceFunctionOn (openCubeSet Q) + (coarseCaccioppoliLocalOpenCube Q center 1) u0.toH1.toFun) + (hClocal : 0 ≤ Clocal) (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross) : + coarseCaccioppoliLocalEnergyRadiusProfile Q center + (fun x => scalarVariationEnergyIntegrand a u0 x) (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross)) + (coarseCaccioppoliHarmonicL2Sq Q a u0) := by + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) (u0.toH1.grad x)) energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [energy, scalarVariationEnergyIntegrand] using hflux + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := + hfluxEnergyQ.2.1 + have hcutoffWindow : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + coarseCaccioppoliLocalClosedCube Q center ρm ⊆ + coarseCaccioppoliLocalOpenCube Q center 1 := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + have houter : ρm < 1 := by + have hm_lt : ρm < ρ₂ := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).2 + exact hm_lt.trans_le hρ₂ + exact + coarseCaccioppoliLocalClosedCube_subset_localOpenCube_one_of_lt_one + (Q := Q) (center := center) (rho := ρm) houter + have hBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + Q center a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) energy := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_localizedZeroTrace_of_closedCubeEllipticity + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Clocal := Clocal) (Calpha := Calpha) (Ccross := Ccross) (u0 := u0) + hzero hClocal hCcross hCsol_le hs ht hst hEllCube hcutoffWindow hrawcoeff + simpa [energy] using + coarseCaccioppoli_boundary_localPatch_qone_standard_le_noteRhs_explicitSplit_of_noteRawBridgeSplitAllRadii + (Q := Q) (center := center) (a := a) (s := s) (t := t) + (Calpha := Calpha) (Ccross := Ccross) + (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u0) + (baseEnergy := energy) (w := fun _ _ => u0) + hCalpha hCcross hs ht hst (coarseCaccioppoliHarmonicL2Sq_nonneg Q a u0) + hEllCube henergy_nonneg henergy_int hBridge + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/BoundarySplit.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/BoundarySplit.lean new file mode 100644 index 0000000000..d839c6863d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/BoundarySplit.lean @@ -0,0 +1,667 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.LocalPatchNoteRawBridge.CoefficientBounds + +/-! # Boundary Split -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch note raw bridge + +This sidecar ties the arbitrary-center local-patch descendant summation to the +harmonic weak-testing identity. It covers the interior-contained local patch +case: the translated cutoff support is required to lie inside the parent open +cube, so the compact-support test function is admissible without a boundary +zero-trace argument. +-/ + +/-- Boundary local-patch raw bridge for a constant harmonic family with split +note coefficients, once the local weak-testing estimate has been supplied at +every radius. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_testing_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hClocal : 0 ≤ Clocal) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (htesting : ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))|) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit + Q center a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit + Q center a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := by + exact mul_nonneg hcard_nonneg hClocal + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_nonneg hCcross + have hs1 : s < 1 := by nlinarith [ht, hst] + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let G : Vec d → Vec d := fun x => u0.toH1.grad x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := + quantitativeCubeCutoffHessianConst d / (((ρm - ρ₁) * (cubeRadius Q / 3)) ^ 2) + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + let Bcross : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross + (coarseCaccioppoliHarmonicL2Sq Q a u0) hheight ρ₁ ρ₂ + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have houter : ρm < 1 := by + have hm_lt : ρm < ρ₂ := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).2 + have hρ₂_lt : ρ₂ < 1 := by + simpa [ρ₂] using coarseCaccioppoliRadiusSequence_lt_one (n + 1) + exact hm_lt.trans hρ₂_lt + have hρm_le_one : ρm ≤ 1 := houter.le + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k, ρ₁, ρ₂] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha, ρ₁, ρ₂] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have hgradQ : CubeAverageGradientEnergyControl Q a G energy := by + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube u0.toCubeSet hOrigin + simpa [G, energy, scalarVariationEnergyIntegrand] using hgrad + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm x * energy x) := by + simpa [coarseCaccioppoliLocalEnergyRadiusProfile] using + coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy_of_integrable + Q center energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + have htest : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| := by + simpa [ρ₁, ρ₂, ρm, energy, flux, u, ξ] using htesting n + have hpair_int : + MeasureTheory.IntegrableOn (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [flux, u, ξ] using + integrableOn_vecDot_harmonicFlux_harmonicFunction_localCanonicalCutoff + Q a center u0 hEllOpen hρ₁_pos hlt_mid + have huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [u] using memLp_harmonicFunction_normalizedCubeMeasure Q a u0 + have hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR + (by simpa [flux] using memLp_harmonicFlux_normalizedCubeMeasure Q a u0 hEllOpen) + have huMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := ℝ) hR huQ + have hGMem : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR + (by simpa [G] using memLp_harmonicGradientComponent_normalizedCubeMeasure Q a u0 i) + have hfluxEnergyR : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy := by + intro R hR + exact hfluxEnergyQ.restrict_to_descendant hs.le hR + have hB_nonneg : 0 ≤ B := by + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + have hAcirc1_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R := by + intro R hR + simpa [Acirc1] using + coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R := by + intro R hR + simpa [AcircS] using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliConstantCutoffSize R u ξ B := by + intro R hR + exact coarseCaccioppoliConstantCutoffSize_nonneg R u ξ hB_nonneg + have hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliCenteredCutoffSize R s ξ (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) B CeffLocal := by + intro R hR + exact + coarseCaccioppoliCenteredCutoffSize_nonneg R ξ hs + (hAcirc1_nonneg R hR) (hAcircS_nonneg R hR) + (Real.sqrt_nonneg _) hB_nonneg hCeffLocal_nonneg + have hfullFamily : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a Clocal + (fun _ _ => u0) := + (CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction + Q a (fun _ _ => u0)).mono_C hCsol_le + have hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R Clocal + (cubeFluctuation R u) G N := by + intro R hR N + simpa [u, G] using + hfullFamily.vectorPoincare_on_descendant + hR hρ₁ hlt_mid hρm_le_one N + have hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_R : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 : ℝ) (by norm_num) hR hSigmaSum_one + simpa [G, Acirc1, coarseCaccioppoliCanonicalGradientAcircOne, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 : ℝ) (by norm_num) + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_R i N + have hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have hs_pos : 0 < 1 - s := by linarith + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_sub_s_R : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 - s) hs_pos.le hR hSigmaSum_one_sub_s + simpa [G, AcircS, coarseCaccioppoliCanonicalGradientAcircOneSub, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 - s) hs_pos + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_sub_s_R i N + have hL2n : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + Real.sqrt (coarseCaccioppoliHarmonicL2Sq Q a u0) := by + simpa [u, coarseCaccioppoliCanonicalHarmonicL2Profile] using + CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl.of_constantFamily Q a u0 + hρ₁ hlt hρ₂ + have hK_nonneg : 0 ≤ K := by + simpa [K] using + coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s CeffCross (1 : ℝ) hheight hCeffCross_nonneg hs hlt + have hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross := by + simpa [K, Bcross] using + boundaryCrossCoeff_one_mul_le_boundaryCrossCoeff_of_cubeLpNorm_le_sqrt + (Q := Q) (a := a) (s := s) (C := CeffCross) + (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u0) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) (U := cubeLpNorm Q (2 : ℝ≥0∞) u) + (h := hheight) hCeffCross_nonneg hs hlt hL2n + have hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ₂ - ρm) * (cubeRadius Q / 3) := by + intro R hR + simpa [j, j0, ρm] using + cubeScaleFactor_le_local_buffer_of_mem_descendantsAtDepth_succ_of_triadicGapScaleChoice + (Q := Q) (R := R) (j := j0) (k := k) hR hchoice hjk + have hrawn : + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) + B CeffLocal ≤ Alpha) := by + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit, + CeffLocal, CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, ρm, j, j0, ξ, B, Acirc1, + AcircS, K, Alpha] + using hrawcoeff n + rcases hrawn with ⟨hconst_raw, hcent_raw⟩ + refine le_trans htest ?_ + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_localCanonicalCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (center := center) (j := j) (a := a) (s := s) + (rhoInner := ρ₁) (rhoOuter := ρm) (rho := ρ₂) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := Clocal) (K := K) + (Alpha := Alpha) (Bcross := Bcross) + hρ₁_pos hlt_mid hs hs1 hbuffer hpair_int huQ henergy_nonneg henergy_int + hfluxMem huMem hGMem hfluxEnergyR hB_nonneg hAcirc1_nonneg hAcircS_nonneg + hBgConst hBgCent hClocal hfull hGcirc1 hGcircS hK_nonneg hKparent + (by + intro R hR + simpa [ξ, B, CeffLocal] using hconst_raw R hR) + (by + intro R hR + simpa [ξ, B, Acirc1, AcircS, CeffLocal] using hcent_raw R hR) + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit, + coarseCaccioppoliLocalEnergyRadiusProfile, CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, + energy, Alpha, Bcross, flux, u, ξ, B] + using hraw + +/-- All-radii boundary local-patch raw bridge for a constant harmonic family +with split note coefficients, once the local weak-testing estimate has been +supplied at every admissible radius pair. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii.of_constantFamily_localPatchBufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_testing_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hClocal : 0 ≤ Clocal) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (htesting : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))|) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + Q center a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := by + exact mul_nonneg hcard_nonneg hClocal + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_nonneg hCcross + have hs1 : s < 1 := by nlinarith [ht, hst] + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j0 : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := j0 + 1 + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let G : Vec d → Vec d := fun x => u0.toH1.grad x + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := + quantitativeCubeCutoffHessianConst d / (((ρm - ρ₁) * (cubeRadius Q / 3)) ^ 2) + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + let Bcross : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross + (coarseCaccioppoliHarmonicL2Sq Q a u0) hheight ρ₁ ρ₂ + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have houter : ρm < 1 := by + have hm_lt : ρm < ρ₂ := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).2 + exact hm_lt.trans_le hρ₂ + have hρm_le_one : ρm ≤ 1 := houter.le + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j0 := by + simpa [k, j0, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have hgradQ : CubeAverageGradientEnergyControl Q a G energy := by + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube u0.toCubeSet hOrigin + simpa [G, energy, scalarVariationEnergyIntegrand] using hgrad + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm x * energy x) := by + simpa [coarseCaccioppoliLocalEnergyRadiusProfile] using + coarseCaccioppoliLocalEnergyProfile_le_localCanonicalCutoffEnergy_of_integrable + Q center energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + have htest : + coarseCaccioppoliLocalEnergyRadiusProfile Q center energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| := by + simpa [ρm, energy, flux, u, ξ] using htesting hρ₁ hlt hρ₂ + have hpair_int : + MeasureTheory.IntegrableOn (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [flux, u, ξ] using + integrableOn_vecDot_harmonicFlux_harmonicFunction_localCanonicalCutoff + Q a center u0 hEllOpen hρ₁_pos hlt_mid + have huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [u] using memLp_harmonicFunction_normalizedCubeMeasure Q a u0 + have hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR + (by simpa [flux] using memLp_harmonicFlux_normalizedCubeMeasure Q a u0 hEllOpen) + have huMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := ℝ) hR huQ + have hGMem : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR + (by simpa [G] using memLp_harmonicGradientComponent_normalizedCubeMeasure Q a u0 i) + have hfluxEnergyR : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy := by + intro R hR + exact hfluxEnergyQ.restrict_to_descendant hs.le hR + have hB_nonneg : 0 ≤ B := by + exact div_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) (sq_nonneg _) + have hAcirc1_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R := by + intro R hR + simpa [Acirc1] using + coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R := by + intro R hR + simpa [AcircS] using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliConstantCutoffSize R u ξ B := by + intro R hR + exact coarseCaccioppoliConstantCutoffSize_nonneg R u ξ hB_nonneg + have hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliCenteredCutoffSize R s ξ (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) B CeffLocal := by + intro R hR + exact + coarseCaccioppoliCenteredCutoffSize_nonneg R ξ hs + (hAcirc1_nonneg R hR) (hAcircS_nonneg R hR) + (Real.sqrt_nonneg _) hB_nonneg hCeffLocal_nonneg + have hfullFamily : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a Clocal + (fun _ _ => u0) := + (CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction + Q a (fun _ _ => u0)).mono_C hCsol_le + have hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R Clocal + (cubeFluctuation R u) G N := by + intro R hR N + simpa [u, G] using + hfullFamily.vectorPoincare_on_descendant + hR hρ₁ hlt_mid hρm_le_one N + have hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_R : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 : ℝ) (by norm_num) hR hSigmaSum_one + simpa [G, Acirc1, coarseCaccioppoliCanonicalGradientAcircOne, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 : ℝ) (by norm_num) + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_R i N + have hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have hs_pos : 0 < 1 - s := by linarith + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_sub_s_R : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 - s) hs_pos.le hR hSigmaSum_one_sub_s + simpa [G, AcircS, coarseCaccioppoliCanonicalGradientAcircOneSub, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 - s) hs_pos + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_sub_s_R i N + have hL2n : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + Real.sqrt (coarseCaccioppoliHarmonicL2Sq Q a u0) := by + simpa [u, coarseCaccioppoliCanonicalHarmonicL2Profile] using + CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl.of_constantFamily Q a u0 + hρ₁ hlt hρ₂ + have hK_nonneg : 0 ≤ K := by + simpa [K] using + coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s CeffCross (1 : ℝ) hheight hCeffCross_nonneg hs hlt + have hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross := by + simpa [K, Bcross] using + boundaryCrossCoeff_one_mul_le_boundaryCrossCoeff_of_cubeLpNorm_le_sqrt + (Q := Q) (a := a) (s := s) (C := CeffCross) + (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u0) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) (U := cubeLpNorm Q (2 : ℝ≥0∞) u) + (h := hheight) hCeffCross_nonneg hs hlt hL2n + have hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ₂ - ρm) * (cubeRadius Q / 3) := by + intro R hR + simpa [j, j0, ρm] using + cubeScaleFactor_le_local_buffer_of_mem_descendantsAtDepth_succ_of_triadicGapScaleChoice + (Q := Q) (R := R) (j := j0) (k := k) hR hchoice hjk + have hrawn : + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) + B CeffLocal ≤ Alpha) := by + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii, + CeffLocal, CeffAlpha, CeffCross, hheight, ρm, j, j0, ξ, B, Acirc1, + AcircS, K, Alpha, coarseCaccioppoliLocalPatchCutoffHessianBound] + using hrawcoeff hρ₁ hlt hρ₂ + rcases hrawn with ⟨hconst_raw, hcent_raw⟩ + refine le_trans htest ?_ + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_localPatch_raw_of_localCanonicalCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (center := center) (j := j) (a := a) (s := s) + (rhoInner := ρ₁) (rhoOuter := ρm) (rho := ρ₂) + (flux := flux) (u := u) (G := G) (energy := energy) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := Clocal) (K := K) + (Alpha := Alpha) (Bcross := Bcross) + hρ₁_pos hlt_mid hs hs1 hbuffer hpair_int huQ henergy_nonneg henergy_int + hfluxMem huMem hGMem hfluxEnergyR hB_nonneg hAcirc1_nonneg hAcircS_nonneg + hBgConst hBgCent hClocal hfull hGcirc1 hGcircS hK_nonneg hKparent + (by + intro R hR + simpa [ξ, B, CeffLocal] using hconst_raw R hR) + (by + intro R hR + simpa [ξ, B, Acirc1, AcircS, CeffLocal] using hcent_raw R hR) + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii, + coarseCaccioppoliLocalEnergyRadiusProfile, CeffAlpha, CeffCross, hheight, + energy, Alpha, Bcross, flux, u, ξ, B] + using hraw + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/CoefficientBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/CoefficientBounds.lean new file mode 100644 index 0000000000..bc24bfabf2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/LocalPatchNoteRawBridge/CoefficientBounds.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.LocalPatchWeakTesting + +/-! # Coefficient Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch note raw bridge + +This sidecar ties the arbitrary-center local-patch descendant summation to the +harmonic weak-testing identity. It covers the interior-contained local patch +case: the translated cutoff support is required to lie inside the parent open +cube, so the compact-support test function is admissible without a boundary +zero-trace argument. +-/ + +/-- Split exact-to-parent-raw coefficient comparisons for the arbitrary-center +local patch route. + +`Calpha` controls the centered/front branch and may carry the small-`s` +front budget. `Ccross` controls only the local constant/cross branch, so the +later note-facing constant can stay dimension-only in that branch. -/ +def + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) : Prop := + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := + quantitativeCubeCutoffHessianConst d / (((ρm - ρ₁) * (cubeRadius Q / 3)) ^ 2) + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B + CeffLocal ≤ + Alpha) + +/-- All-radii split exact-to-parent-raw coefficient comparisons for the +arbitrary-center local-patch route. This is the coefficient package needed by +the standard beta-dependent radius iteration. -/ +def + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + 1 + let ξ : Vec d → Vec d := + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center ρ₁ ρm) + let B : ℝ := coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρm + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B + CeffLocal ≤ + Alpha) + +/-- The all-radii local-patch split coefficient package restricts to the +legacy Chapter-3 radius sequence. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit.of_allRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii + Q center a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit + Q center a s t Clocal Calpha Ccross := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplit, + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeLocalPatchBufferedExactRawCoefficientBoundsSplitAllRadii, + coarseCaccioppoliLocalPatchCutoffHessianBound] + using h hρ₁ hlt hρ₂ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge.lean new file mode 100644 index 0000000000..6d4520bedd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.BoundarySplit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Note Raw Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Split interior raw bridge for a constant harmonic family using the same +buffered localized-energy summation as the repaired boundary route. -/ +theorem + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hClocal : 0 ≤ Clocal) (hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit + Q a s t Clocal Calpha Ccross) : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit.of_boundary + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) + (CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_closedCubeEllipticity + (Q := Q) (a := a) (s := s) (t := t) (Clocal := Clocal) + (Calpha := Calpha) (Ccross := Ccross) (u0 := u0) + hClocal hCalpha hCcross hCsol_le hs ht hst hEllCube hrawcoeff) + +/-- Boundary note-RHS Caccioppoli from an all-radii split note-faithful raw +bridge, using the standard beta-dependent radius iteration. -/ +theorem + coarseCaccioppoli_boundary_qone_standard_le_noteRhs_explicitSplit_of_profileInputs_of_noteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hProfile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w) + (hBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross uL2Sq baseEnergy) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross)) uL2Sq := by + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + have hnat : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + exact_mod_cast hnat + have hCeffAlpha_pos : 0 < CeffAlpha := by + exact mul_pos hcard_pos hCalpha + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_pos.le hCcross + exact + coarseCaccioppoli_boundary_qone_standard_le_noteRhs_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice_split + (Q := Q) (a := a) (s := s) (t := t) + (Calpha := CeffAlpha) (Ccross := CeffCross) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + hCeffAlpha_pos hCeffCross_nonneg hs ht hst hu + (thetaRatio_pos_of_closedCubeHarmonicFamily Q a s t w hs ht hEllCube) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_nonneg + Q hProfile.base_nonneg) + (coarseCaccioppoliLocalizedEnergyRadiusProfile_boundedAbove + Q hProfile.base_nonneg hProfile.base_integrable) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + (by + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii, + CeffAlpha, CeffCross] using hBridge) + +/-- Interior note-RHS Caccioppoli from an all-radii split note-faithful raw +bridge, using the standard beta-dependent radius iteration. -/ +theorem + coarseCaccioppoli_interior_qone_standard_le_noteRhs_explicitSplit_of_profileInputs_of_noteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hProfile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w) + (hBridge : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross uL2Sq baseEnergy) : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross)) uL2Sq := by + have hBoundaryBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross uL2Sq baseEnergy := by + simpa [CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii] + using hBridge + simpa [coarseCaccioppoliInteriorNoteRhs] using + (coarseCaccioppoli_boundary_qone_standard_le_noteRhs_explicitSplit_of_profileInputs_of_noteRawBridgeSplitAllRadii + (Q := Q) (a := a) (s := s) (t := t) (Calpha := Calpha) + (Ccross := Ccross) (uL2Sq := uL2Sq) + (baseEnergy := baseEnergy) (w := w) + hCalpha hCcross hs ht hst hu hEllCube hProfile hBoundaryBridge) + +/-- Boundary note-RHS Caccioppoli from an all-radii split arbitrary-center +local-patch raw bridge, using the standard beta-dependent radius iteration. -/ +theorem + coarseCaccioppoli_boundary_localPatch_qone_standard_le_noteRhs_explicitSplit_of_noteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) + (a : CoeffField d) (s t Calpha Ccross uL2Sq : ℝ) {lam Lam : ℝ} + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hCalpha : 0 < Calpha) (hCcross : 0 ≤ Ccross) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hBridge : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + Q center a s t Calpha Ccross uL2Sq baseEnergy) : + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryNoteRhs Q a s t + (coarseCaccioppoliBoundaryStandardExplicitNoteConstantSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross)) uL2Sq := by + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + have hcard_pos : 0 < (Fintype.card (Fin d) : ℝ) := by + have hnat : 0 < Fintype.card (Fin d) := by + simp [Fintype.card_fin, Nat.pos_iff_ne_zero, NeZero.ne d] + exact_mod_cast hnat + have hCeffAlpha_pos : 0 < CeffAlpha := by + exact mul_pos hcard_pos hCalpha + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_pos.le hCcross + exact + coarseCaccioppoli_boundary_qone_standard_le_noteRhs_of_noteEstimate_of_localizedExplicitHeightOfScaleChoice_split + (Q := Q) (a := a) (s := s) (t := t) + (Calpha := CeffAlpha) (Ccross := CeffCross) (uL2Sq := uL2Sq) + (k := coarseCaccioppoliTriadicGapScale) + hCeffAlpha_pos hCeffCross_nonneg hs ht hst hu + (thetaRatio_pos_of_closedCubeHarmonicFamily Q a s t w hs ht hEllCube) + (coarseCaccioppoliLocalEnergyRadiusProfile_nonneg + Q center hbase_nonneg) + (coarseCaccioppoliLocalEnergyRadiusProfile_boundedAbove + Q center hbase_nonneg hbase_int) + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + (by + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii, + CeffAlpha, CeffCross] using hBridge) + +/-! +The theorem-facing endpoint aliases that used to live here are now in +`HarmonicFinal/Endpoints.lean`. This file now stops at the internal bridge +constructors and compatibility plumbing that those endpoints consume. +-/ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/BoundarySplit.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/BoundarySplit.lean new file mode 100644 index 0000000000..828bc7d879 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/BoundarySplit.lean @@ -0,0 +1,685 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.NoteRawBridge.CoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Boundary Split -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- All-radii boundary raw bridge for a constant harmonic family using the +split buffered localized-energy summation. + +This is the proof-producing bridge needed by the standard beta-dependent +radius iteration. It is the all-radii version of +`CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_closedCubeEllipticity`. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplitAllRadii_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hClocal : 0 ≤ Clocal) (_hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + Q a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := by + exact mul_nonneg hcard_nonneg hClocal + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_nonneg hCcross + have hs1 : s < 1 := by nlinarith [ht, hst] + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ + (by simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1) + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let G : Vec d → Vec d := fun x => u0.toH1.grad x + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + let Bcross : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross + (coarseCaccioppoliHarmonicL2Sq Q a u0) hheight ρ₁ ρ₂ + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have houter : ρm < 1 := by + have hm_lt : ρm < ρ₂ := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).2 + exact hm_lt.trans_le hρ₂ + have hρm_le_one : ρm ≤ 1 := houter.le + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have hgradQ : CubeAverageGradientEnergyControl Q a G energy := by + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube u0.toCubeSet hOrigin + simpa [G, energy, scalarVariationEnergyIntegrand] using hgrad + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy ρ₁ ≤ + cubeAverage Q (fun x => ηρ x * energy x) := by + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlowerCanon : + coarseCaccioppoliLocalizedEnergyProfile Q ρ₁ energy ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm x * energy x) := + coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy_of_integrable + Q energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + simpa [coarseCaccioppoliLocalizedEnergyRadiusProfile, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using hlowerCanon + have htest : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| := by + have htestη := + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a u0 hEllOpen ηρ.smooth ηρ.hasCompactSupport + (coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q hρ₁ hlt_mid houter) + (by simpa [energy] using hlowerρ) + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, flux, u, ξ, energy] using htestη + have hpair_int : + MeasureTheory.IntegrableOn (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [flux, u, ξ] using! + integrableOn_vecDot_harmonicFlux_harmonicFunction_scalarCutoffGradientField + Q a u0 hEllOpen ηρ.smooth ηρ.hasCompactSupport + have huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [u] using memLp_harmonicFunction_normalizedCubeMeasure Q a u0 + have hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR + (by simpa [flux] using memLp_harmonicFlux_normalizedCubeMeasure Q a u0 hEllOpen) + have huMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := ℝ) hR huQ + have hGMem : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR + (by simpa [G] using memLp_harmonicGradientComponent_normalizedCubeMeasure Q a u0 i) + have hfluxEnergyR : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy := by + intro R hR + exact hfluxEnergyQ.restrict_to_descendant hs.le hR + have hB_nonneg : 0 ≤ B := by + simpa [B, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hAcirc1_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R := by + intro R hR + simpa [Acirc1] using + coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R := by + intro R hR + simpa [AcircS] using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliConstantCutoffSize R u ξ B := by + intro R hR + exact coarseCaccioppoliConstantCutoffSize_nonneg R u ξ hB_nonneg + have hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliCenteredCutoffSize R s ξ (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) B CeffLocal := by + intro R hR + exact + coarseCaccioppoliCenteredCutoffSize_nonneg R ξ hs + (hAcirc1_nonneg R hR) (hAcircS_nonneg R hR) + (Real.sqrt_nonneg _) hB_nonneg hCeffLocal_nonneg + have hfullFamily : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a Clocal + (fun _ _ => u0) := + (CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction + Q a (fun _ _ => u0)).mono_C hCsol_le + have hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R Clocal + (cubeFluctuation R u) G N := by + intro R hR N + simpa [u, G] using + hfullFamily.vectorPoincare_on_descendant + hR hρ₁ hlt_mid hρm_le_one N + have hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_R : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 : ℝ) (by norm_num) hR hSigmaSum_one + simpa [G, Acirc1, coarseCaccioppoliCanonicalGradientAcircOne, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 : ℝ) (by norm_num) + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_R i N + have hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have hs_pos : 0 < 1 - s := by linarith + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_sub_s_R : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 - s) hs_pos.le hR hSigmaSum_one_sub_s + simpa [G, AcircS, coarseCaccioppoliCanonicalGradientAcircOneSub, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 - s) hs_pos + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_sub_s_R i N + have hL2n : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + Real.sqrt (coarseCaccioppoliHarmonicL2Sq Q a u0) := by + simpa [u, coarseCaccioppoliCanonicalHarmonicL2Profile] using + CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl.of_constantFamily Q a u0 + hρ₁ hlt hρ₂ + have hK_nonneg : 0 ≤ K := by + simpa [K] using + coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s CeffCross (1 : ℝ) hheight hCeffCross_nonneg hs hlt + have hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross := by + simpa [K, Bcross] using + boundaryCrossCoeff_one_mul_le_boundaryCrossCoeff_of_cubeLpNorm_le_sqrt + (Q := Q) (a := a) (s := s) (C := CeffCross) + (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u0) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) (U := cubeLpNorm Q (2 : ℝ≥0∞) u) + (h := hheight) hCeffCross_nonneg hs hlt hL2n + have hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ₂ - ρm) * cubeRadius Q := by + intro R hR + simpa [ρm] using + cubeScaleFactor_le_buffer_of_mem_descendantsAtDepth_of_triadicGapScaleChoice + (Q := Q) (R := R) (j := j) (k := k) hR hchoice hjk + have hrawn : + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) + B CeffLocal ≤ Alpha) := by + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii, + CeffLocal, CeffAlpha, CeffCross, hheight, ρm, j, ξ, B, Acirc1, AcircS, + K, Alpha] + using hrawcoeff hρ₁ hlt hρ₂ + rcases hrawn with ⟨hconst_raw, hcent_raw⟩ + refine le_trans htest ?_ + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (j := j) (a := a) (s := s) (ρ₁ := ρ₁) (ρ₂ := ρm) + (ρ := ρ₂) (flux := flux) (u := u) (G := G) (energy := energy) (η := ηρ) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := Clocal) (K := K) + (Alpha := Alpha) (Bcross := Bcross) + hs hs1 hbuffer hpair_int huQ henergy_nonneg henergy_int hfluxMem huMem hGMem + hfluxEnergyR hB_nonneg hAcirc1_nonneg hAcircS_nonneg hBgConst hBgCent hClocal + hfull hGcirc1 hGcircS hK_nonneg hKparent + (by + intro R hR + simpa [ξ, B, CeffLocal, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hconst_raw R hR) + (by + intro R hR + simpa [ξ, B, Acirc1, AcircS, CeffLocal, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical, + coarseCaccioppoliQuantitativeCutoffHessianBound] using hcent_raw R hR) + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii, + coarseCaccioppoliLocalizedEnergyRadiusProfile, CeffAlpha, CeffCross, hheight, + energy, Alpha, Bcross, flux, u, ξ, B] + using! hraw + +/-- Boundary raw bridge for a constant harmonic family using the split +buffered localized-energy summation. + +This is the split-budget version of +`of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBounds_of_closedCubeEllipticity`: +the explicit height and absorption coefficient use `Calpha`, while the cross +branch uses `Ccross`. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit.of_constantFamily_bufferedFaithfulWorkSmallCubeExactRawCoefficientBoundsSplit_of_closedCubeEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) {lam Lam : ℝ} + (u0 : AHarmonicFunction a (openCubeSet Q)) + (hClocal : 0 ≤ Clocal) (_hCalpha : 0 ≤ Calpha) (hCcross : 0 ≤ Ccross) + (hCsol_le : fullVectorPoincareCubeConstant Q ≤ Clocal) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit + Q a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit + Q a s t Calpha Ccross (coarseCaccioppoliHarmonicL2Sq Q a u0) + (fun x => scalarVariationEnergyIntegrand a u0 x) := by + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast Nat.zero_le (Fintype.card (Fin d)) + have hCeffLocal_nonneg : 0 ≤ CeffLocal := by + exact mul_nonneg hcard_nonneg hClocal + have hCeffCross_nonneg : 0 ≤ CeffCross := by + exact mul_nonneg hcard_nonneg hCcross + have hs1 : s < 1 := by nlinarith [ht, hst] + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + Q a t ht hEllCube hData + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + intro n + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let k : ℕ := coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρm := + coarseCaccioppoliCanonicalQuantitativeCutoff Q + (by simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1) + (by + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + exact (coarseCaccioppoliBufferedCutoffRadius_between hlt).1) + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a u0 x + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u0.toH1.grad x) + let u : Vec d → ℝ := fun x => u0.toH1 x + let G : Vec d → Vec d := fun x => u0.toH1.grad x + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + let Bcross : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross + (coarseCaccioppoliHarmonicL2Sq Q a u0) hheight ρ₁ ρ₂ + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + have hρ₁ : (1 / 3 : ℝ) ≤ ρ₁ := by + simpa [ρ₁] using (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : ρ₁ < ρ₂ := by + simpa [ρ₁, ρ₂] using + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : ρ₂ ≤ 1 := by + simpa [ρ₂] using (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + have houter : ρm < 1 := by + have hm_lt : ρm < ρ₂ := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).2 + have hρ₂_lt : ρ₂ < 1 := by + simpa [ρ₂] using coarseCaccioppoliRadiusSequence_lt_one (n + 1) + exact hm_lt.trans hρ₂_lt + have hρm_le_one : ρm ≤ 1 := houter.le + have hlt_mid : ρ₁ < ρm := by + simpa [ρm] using (coarseCaccioppoliBufferedCutoffRadius_between hlt).1 + have hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + simpa [k, ρ₁, ρ₂] using coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂ + have hjk : k ≤ j := by + simpa [k, j, CeffAlpha, ρ₁, ρ₂] using + (coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice_ge_scaleChoice + Q a s t CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) + have hfluxEnergyQ : + CoarseCaccioppoliFluxEnergyControls Q a s flux energy := by + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube u0.toCubeSet + simpa [flux, energy, scalarVariationEnergyIntegrand] using hflux + have hgradQ : CubeAverageGradientEnergyControl Q a G energy := by + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube u0.toCubeSet hOrigin + simpa [G, energy, scalarVariationEnergyIntegrand] using hgrad + have henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x := by + intro x hx + have hnonneg := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u0.toCubeSet x hx + simpa [energy, scalarVariationEnergyIntegrand] using hnonneg + have henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume := hfluxEnergyQ.2.1 + have hlowerρ : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy ρ₁ ≤ + cubeAverage Q (fun x => ηρ x * energy x) := by + have hρ₁_pos : 0 < ρ₁ := by + exact (show (0 : ℝ) < 1 / 3 by norm_num).trans_le hρ₁ + have hlowerCanon : + coarseCaccioppoliLocalizedEnergyProfile Q ρ₁ energy ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm x * energy x) := + coarseCaccioppoliLocalizedEnergyProfile_le_canonicalCutoffEnergy_of_integrable + Q energy hρ₁_pos hlt_mid henergy_nonneg henergy_int + simpa [coarseCaccioppoliLocalizedEnergyRadiusProfile, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical] + using hlowerCanon + have htest : + coarseCaccioppoliLocalizedEnergyRadiusProfile Q energy ρ₁ ≤ + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| := by + have htestη := + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a u0 hEllOpen ηρ.smooth ηρ.hasCompactSupport + (coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q hρ₁ hlt_mid houter) + (by simpa [energy] using hlowerρ) + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, flux, u, ξ, energy] using htestη + have hpair_int : + MeasureTheory.IntegrableOn (fun x => vecDot (flux x) (u x • ξ x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [flux, u, ξ] using! + integrableOn_vecDot_harmonicFlux_harmonicFunction_scalarCutoffGradientField + Q a u0 hEllOpen ηρ.smooth ηρ.hasCompactSupport + have huQ : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [u] using memLp_harmonicFunction_normalizedCubeMeasure Q a u0 + have hfluxMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR + (by simpa [flux] using memLp_harmonicFlux_normalizedCubeMeasure Q a u0 hEllOpen) + have huMem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR + exact memLp_on_descendant_of_memLp_generic (E := ℝ) hR huQ + have hGMem : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro R hR i + exact memLp_on_descendant_of_memLp (Q := Q) (R := R) (j := j) hR + (by simpa [G] using memLp_harmonicGradientComponent_normalizedCubeMeasure Q a u0 i) + have hfluxEnergyR : ∀ R ∈ descendantsAtDepth Q j, + CoarseCaccioppoliFluxEnergyControls R a s flux energy := by + intro R hR + exact hfluxEnergyQ.restrict_to_descendant hs.le hR + have hB_nonneg : 0 ≤ B := by + simpa [B, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hAcirc1_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ Acirc1 R := by + intro R hR + simpa [Acirc1] using + coarseCaccioppoliCanonicalGradientAcircOne_nonneg R a ρ₁ ρm + have hAcircS_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ AcircS R := by + intro R hR + simpa [AcircS] using + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg R a hs1.le ρ₁ ρm + have hBgConst : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliConstantCutoffSize R u ξ B := by + intro R hR + exact coarseCaccioppoliConstantCutoffSize_nonneg R u ξ hB_nonneg + have hBgCent : ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseCaccioppoliCenteredCutoffSize R s ξ (Acirc1 R) (AcircS R) + (Real.sqrt (cubeAverage R energy)) B CeffLocal := by + intro R hR + exact + coarseCaccioppoliCenteredCutoffSize_nonneg R ξ hs + (hAcirc1_nonneg R hR) (hAcircS_nonneg R hR) + (Real.sqrt_nonneg _) hB_nonneg hCeffLocal_nonneg + have hfullFamily : + CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily Q a Clocal + (fun _ _ => u0) := + (CoarseCaccioppoliBoundaryCanonicalGradientFullDualPoincareVectorFamily.of_aHarmonicFunction + Q a (fun _ _ => u0)).mono_C hCsol_le + have hfull : ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + CubeDescendantDualFullVectorPoincareEstimate R Clocal + (cubeFluctuation R u) G N := by + intro R hR N + simpa [u, G] using + hfullFamily.vectorPoincare_on_descendant + hR hρ₁ hlt_mid hρm_le_one N + have hGcirc1 : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => G x i) ≤ + Acirc1 R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_R : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 : ℝ) (by norm_num) hR hSigmaSum_one + simpa [G, Acirc1, coarseCaccioppoliCanonicalGradientAcircOne, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 : ℝ) (by norm_num) + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_R i N + have hGcircS : ∀ R ∈ descendantsAtDepth Q j, ∀ i : Fin d, ∀ N : ℕ, + cubeBesovCircPartialNorm R (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G x i) ≤ AcircS R * Real.sqrt (cubeAverage R energy) := by + intro R hR i N + have hs_pos : 0 < 1 - s := by linarith + have henergy_nonneg_R : ∀ x ∈ cubeSet R, 0 ≤ energy x := by + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_int_R : + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume := + henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgradR : CubeAverageGradientEnergyControl R a G energy := + hgradQ.restrict_to_descendant hR + have hSigmaSum_one_sub_s_R : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) a (1 - s) hs_pos.le hR hSigmaSum_one_sub_s + simpa [G, AcircS, coarseCaccioppoliCanonicalGradientAcircOneSub, + coarseCaccioppoliCanonicalGradientAcirc, energy] using + cubeBesovCircPartialNorm_component_le_local_canonicalGradientAcirc + R a (1 - s) hs_pos + henergy_nonneg_R henergy_int_R hgradR hSigmaSum_one_sub_s_R i N + have hL2n : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ + Real.sqrt (coarseCaccioppoliHarmonicL2Sq Q a u0) := by + simpa [u, coarseCaccioppoliCanonicalHarmonicL2Profile] using + CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl.of_constantFamily Q a u0 + hρ₁ hlt hρ₂ + have hK_nonneg : 0 ≤ K := by + simpa [K] using + coarseCaccioppoliBoundaryCrossCoeffOfHeight_nonneg + Q a s CeffCross (1 : ℝ) hheight hCeffCross_nonneg hs hlt + have hKparent : K * cubeLpNorm Q (2 : ℝ≥0∞) u ≤ Bcross := by + simpa [K, Bcross] using + boundaryCrossCoeff_one_mul_le_boundaryCrossCoeff_of_cubeLpNorm_le_sqrt + (Q := Q) (a := a) (s := s) (C := CeffCross) + (uL2Sq := coarseCaccioppoliHarmonicL2Sq Q a u0) + (ρ₁ := ρ₁) (ρ₂ := ρ₂) (U := cubeLpNorm Q (2 : ℝ≥0∞) u) + (h := hheight) hCeffCross_nonneg hs hlt hL2n + have hbuffer : ∀ R ∈ descendantsAtDepth Q j, + cubeScaleFactor R ≤ (ρ₂ - ρm) * cubeRadius Q := by + intro R hR + simpa [ρm] using + cubeScaleFactor_le_buffer_of_mem_descendantsAtDepth_of_triadicGapScaleChoice + (Q := Q) (R := R) (j := j) (k := k) hR hchoice hjk + have hrawn : + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) + B CeffLocal ≤ Alpha) := by + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit, + CeffLocal, CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, ρm, j, ξ, B, Acirc1, + AcircS, K, Alpha] + using hrawcoeff n + rcases hrawn with ⟨hconst_raw, hcent_raw⟩ + refine le_trans htest ?_ + have hraw := + abs_cubeAverage_vecDot_scalar_smul_le_localized_raw_of_parentQuantitativeCutoff_on_descendants_variableAcirc_of_support_buffer_vectorFullDualFullCirc + (Q := Q) (j := j) (a := a) (s := s) (ρ₁ := ρ₁) (ρ₂ := ρm) + (ρ := ρ₂) (flux := flux) (u := u) (G := G) (energy := energy) (η := ηρ) + (Acirc1 := Acirc1) (AcircS := AcircS) (C := Clocal) (K := K) + (Alpha := Alpha) (Bcross := Bcross) + hs hs1 hbuffer hpair_int huQ henergy_nonneg henergy_int hfluxMem huMem hGMem + hfluxEnergyR hB_nonneg hAcirc1_nonneg hAcircS_nonneg hBgConst hBgCent hClocal + hfull hGcirc1 hGcircS hK_nonneg hKparent + (by + intro R hR + simpa [ξ, B, CeffLocal, ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical, coarseCaccioppoliQuantitativeCutoffHessianBound] + using hconst_raw R hR) + (by + intro R hR + simpa [ξ, B, Acirc1, AcircS, CeffLocal, ηρ, + coarseCaccioppoliCanonicalQuantitativeCutoff, QuantitativeCubeCutoff.canonical, + coarseCaccioppoliQuantitativeCutoffHessianBound] using hcent_raw R hR) + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit, + coarseCaccioppoliLocalizedEnergyRadiusProfile, CeffAlpha, CeffCross, hheight, ρ₁, ρ₂, + energy, Alpha, Bcross, flux, u, ξ, B] + using! hraw + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/CoefficientLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/CoefficientLocalization.lean new file mode 100644 index 0000000000..e7757303f1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/NoteRawBridge/CoefficientLocalization.lean @@ -0,0 +1,130 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.FaithfulDescendant +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Coefficient Localization -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Split exact-to-parent-raw coefficient comparisons for the buffered +localized-energy route. + +The explicit height and absorption coefficient are chosen with `Calpha`, while +the constant/cross branch is charged to `Ccross`. This is the coefficient +surface needed to keep the public note constant split all the way back to the +small-cube estimates. -/ +def + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) : Prop := + ∀ n : ℕ, + let ρ₁ : ℝ := coarseCaccioppoliRadiusSequence n + let ρ₂ : ℝ := coarseCaccioppoliRadiusSequence (n + 1) + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B + CeffLocal ≤ + Alpha) + +/-- All-radii split exact-to-parent-raw coefficient comparisons for the +buffered localized-energy route. This is the coefficient package needed by +the standard beta-dependent radius iteration. -/ +def + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + let ρm : ℝ := coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂ + let CeffLocal : ℝ := (Fintype.card (Fin d) : ℝ) * Clocal + let CeffAlpha : ℝ := (Fintype.card (Fin d) : ℝ) * Calpha + let CeffCross : ℝ := (Fintype.card (Fin d) : ℝ) * Ccross + let hheight : ℝ → ℝ → ℝ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t CeffAlpha + coarseCaccioppoliTriadicGapScale + let j : ℕ := + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice Q a s t + CeffAlpha coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ + let ξ : Vec d → Vec d := + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρm) + let B : ℝ := coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρm + let Acirc1 : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOne R a ρ₁ ρm + let AcircS : TriadicCube d → ℝ := fun R => + coarseCaccioppoliCanonicalGradientAcircOneSub R a s ρ₁ ρm + let K : ℝ := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s CeffCross 1 hheight ρ₁ ρ₂ + let Alpha : ℝ := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t CeffAlpha hheight ρ₁ ρ₂ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactConstantCoeff R a * + (B + cubeBesovScaleWeight 1 R * cubeLpNorm R ∞ ξ) ≤ K) ∧ + (∀ R ∈ descendantsAtDepth Q j, + coarseCaccioppoliFluxEnergyExactCenteredCoeff R a s ξ (Acirc1 R) (AcircS R) B + CeffLocal ≤ + Alpha) + +/-- The all-radii split coefficient package restricts to the legacy +Chapter-3 radius sequence. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit.of_allRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Clocal Calpha Ccross : ℝ) + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii + Q a s t Clocal Calpha Ccross) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit + Q a s t Clocal Calpha Ccross := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [ + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplit, + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorFaithfulWorkSmallCubeBufferedExactRawCoefficientBoundsSplitAllRadii] + using h hρ₁ hlt hρ₂ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/PositiveFactors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/PositiveFactors.lean new file mode 100644 index 0000000000..663c5ae901 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/PositiveFactors.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Positive Factors -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/SolutionInputs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/SolutionInputs.lean new file mode 100644 index 0000000000..af8b22816e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/InputSpecializations/SolutionInputs.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.InputSpecializations.PositiveFactors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Solution Inputs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +theorem thetaRatio_pos_of_closedCubeHarmonicFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t : ℝ) {lam Lam : ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hs : 0 < s) (ht : 0 < t) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + 0 < ThetaRatio Q s t a := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hRec : + OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam) := + openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEllCube hOrigin + have hDataDesc : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec + have hData : OpenCubeDeterministicCoarseData Q a := + OpenCubeDescendantDeterministicCoarseData.self hDataDesc + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllCube.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s := t) ht hEllCube hOrigin + have hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube ((w ρ₁ ρ₂).toCubeSet) + simpa [scalarVariationEnergyIntegrand] using hflux + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family Q a s hfluxEnergy + exact + thetaRatio_pos_of_isEllipticFieldOn_of_openCubeData + Q a hs ht hEllOpen hData hBsum_s hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup.lean new file mode 100644 index 0000000000..951dec380a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.SolutionInputs + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/CoefficientBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/CoefficientBounds.lean new file mode 100644 index 0000000000..822f301bf2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/CoefficientBounds.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes + +/-! # Coefficient Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Final-facing canonical harmonic Caccioppoli endpoints + +This file keeps the last public theorem surface readable. The coefficient +algebra is still a real remaining hypothesis, but it is now exposed as one +named Chapter-3 schedule rather than as the full expanded +`U/Xi/D/A1/AS` expression at every endpoint. +-/ + +/-- The exact coefficient-schedule hypothesis left for the fully canonical +harmonic-gradient Caccioppoli endpoint. + +It specializes the generic canonical coefficient bounds to the Chapter-3 +triadic gap scale, the localized explicit height, the harmonic `L²` profile, +the canonical quantitative cutoff bounds, and the canonical gradient `Acirc` +factors. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + +/-- The same fully canonical harmonic coefficient schedule after the +single-cube coefficient bounds have already been localized to the raw radius +recursion coefficients `Alpha` and `Bcross`. + +This is the natural handoff point for the concrete cutoff construction: prove +the two raw inequalities once, then invoke the final Caccioppoli wrapper without +also carrying the multiscale localization data. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C + coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + +/-- Note-facing `L²` size control for the harmonic family. + +The scalar `uL2Sq` is the squared `L²` size appearing in the public RHS. This +package is the honest public replacement for the `U` component hidden inside +the coefficient-schedule hypothesis: every radius-pair harmonic function has +normalized `L²` norm bounded by `sqrt uL2Sq`. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (uL2Sq : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliCanonicalHarmonicL2Profile Q a w ρ₁ ρ₂ ≤ Real.sqrt uL2Sq + +/-- The actual squared normalized `L²` size of a single open-cube harmonic +function, in the units used by the public note RHS. -/ +noncomputable def coarseCaccioppoliHarmonicL2Sq {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) + (u : AHarmonicFunction a (openCubeSet Q)) : ℝ := + (cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u.toH1 x)) ^ (2 : ℕ) + +theorem coarseCaccioppoliHarmonicL2Sq_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) + (u : AHarmonicFunction a (openCubeSet Q)) : + 0 ≤ coarseCaccioppoliHarmonicL2Sq Q a u := by + exact sq_nonneg _ + +/-- The constant harmonic family has the note-facing `L²` size control with +the actual squared normalized `L²` size. -/ +theorem CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl.of_constantFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : AHarmonicFunction a (openCubeSet Q)) : + CoarseCaccioppoliBoundaryCanonicalHarmonicL2SizeControl Q a + (coarseCaccioppoliHarmonicL2Sq Q a u) (fun _ _ => u) := by + intro ρ₁ ρ₂ _ _ _ + have hnorm_nonneg : + 0 ≤ cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u.toH1 x) := + cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => u.toH1 x) + simp [coarseCaccioppoliCanonicalHarmonicL2Profile, + coarseCaccioppoliHarmonicL2Sq, Real.sqrt_sq_eq_abs, + abs_of_nonneg hnorm_nonneg] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/SolutionInputs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/SolutionInputs.lean new file mode 100644 index 0000000000..5b2ffebe1a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicFinal/Setup/SolutionInputs.lean @@ -0,0 +1,731 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal.Setup.CoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.CutoffSizes + +/-! # Solution Inputs -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- The fixed localized energy profile used by the harmonic-gradient +Caccioppoli endpoints. + +This is the solution-side part that genuinely belongs to the chosen localized +energy density: nonnegativity and integrability on the cube, and comparison +with each radius-pair harmonic energy on the inner closed cube. It does not +assert that a full-cube pair-energy average equals the localized outer-radius +profile; that statement is false for a general solution and must not be hidden +inside the profile package. -/ +structure CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop where + base_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x + base_integrable : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume + inner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + +/-- The natural energy density of a single harmonic function supplies the fixed +localized energy profile for the constant radius-pair family. -/ +theorem CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs.of_constantFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {lam Lam : ℝ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a + (fun x => scalarVariationEnergyIntegrand a u x) (fun _ _ => u) where + base_nonneg := by + intro x hx + simpa [scalarVariationEnergyIntegrand] using + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (cubeSet Q) a hEllCube u.toCubeSet x hx + base_integrable := by + have hflux : + CoarseCaccioppoliFluxEnergyControls Q a (1 : ℝ) + (fun x => matVecMul (a x) (u.toCubeSet.toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a u.toCubeSet x) := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := (1 : ℝ)) (by norm_num) hEllCube u.toCubeSet + simpa [scalarVariationEnergyIntegrand] using hflux.2.1 + inner_energy_le := by + intro ρ₁ ρ₂ _ _ _ x _ + exact le_rfl + +/-- Legacy componentwise solution-side assumptions for the harmonic-gradient +Caccioppoli surface. + +This groups the fixed localized energy profile, strict positivity of the +canonical gradient factors, and the projected Poincare family for the selected +component. The projected Poincare field is a compatibility input for older +componentwise endpoints; the corrected note-facing route must use the full-dual +vector Poincare family instead. -/ +structure CoarseCaccioppoliBoundaryCanonicalHarmonicSolutionInputs {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) : Prop where + profile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w + positive_factors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w + projected_poincare : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i + +/-- The actual live compatibility inputs for the repaired vector small-cube +route: fixed localized profile plus projected-vector Poincare. + +This package deliberately omits the old strict positive-factor field. The +faithful small-cube route only needs nonnegative local cutoff sizes and +gradient `circ` bounds, both derived directly in the proof; strict positivity +would incorrectly exclude the zero harmonic solution. The projected-vector +Poincare field is still a legacy consumer boundary and must be replaced by the +full-dual vector route before this becomes note-facing. -/ +structure CoarseCaccioppoliBoundaryCanonicalHarmonicVectorProfilePoincareInputs {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop where + profile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w + projected_vector_poincare : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareVectorFamily Q a C w + +/-- Enlarge the projected-vector Poincare constant inside the live +profile/Poincare package. -/ +theorem CoarseCaccioppoliBoundaryCanonicalHarmonicVectorProfilePoincareInputs.mono_C + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {C₁ C₂ : ℝ} {baseEnergy : Vec d → ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorProfilePoincareInputs + Q a C₁ baseEnergy w) + (hC : C₁ ≤ C₂) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorProfilePoincareInputs + Q a C₂ baseEnergy w where + profile := h.profile + projected_vector_poincare := h.projected_vector_poincare.mono_C hC + +/-- Note-faithful raw bridge for the vector harmonic Caccioppoli endpoint. + +This is the intended landing pad for the local subcube/Besov argument in the +LaTeX proof. It is stated only on the Chapter-3 radius sequence, which is the +actual recurrence used by the proof and keeps the canonical cutoff away from +the outer-radius endpoint `1`. Unlike the older canonical coefficient +schedules, this bridge is already after the local `3^{k+h}` against `3^{-h}` +cancellation and therefore targets the note's radius-recursion coefficients +directly. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * C) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- Split note-faithful raw bridge for the vector harmonic Caccioppoli +endpoint. `Calpha` controls the explicit height/absorption coefficient and +`Ccross` controls the cross coefficient. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * Ccross) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- All-radii split raw bridge for the vector harmonic Caccioppoli endpoint. +This is the bridge shape consumed by the standard beta-dependent hole-filling +iteration. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteRawEstimateSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy) + +/-- Interior counterpart of the note-faithful raw bridge. The current +interior Caccioppoli backbone reuses the same coefficient shape as the boundary +case; the distinction is in how the local estimate is produced. -/ +def CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * C) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- Split interior counterpart of the note-faithful raw bridge. As in the +boundary bridge, `Calpha` controls the explicit height/absorption coefficient +and `Ccross` controls the cross coefficient. -/ +def CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * Ccross) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- All-radii split raw bridge for the centered interior endpoint. -/ +def CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross uL2Sq baseEnergy + +/-- Boundary raw bridge for an arbitrary-center local patch radius profile. + +This is the translated/localized counterpart of +`CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge`: the recurrence +uses the same note-facing coefficients, but the energy profile is centered at +the boundary/interior patch center and has base scale `Q.scale - 1`. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridge {d : ℕ} + [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * C) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- Split boundary raw bridge for an arbitrary-center local patch radius +profile. `Calpha` controls the explicit height/absorption coefficient and +`Ccross` controls the cross coefficient. -/ +def CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit {d : ℕ} + [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * Ccross) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- All-radii split raw bridge for an arbitrary-center local patch radius +profile. -/ +def + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + CoarseCaccioppoliBoundaryNoteRawEstimateSplit Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) + ((Fintype.card (Fin d) : ℝ) * Ccross) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * Calpha) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy) + +/-- Interior counterpart of the local-patch raw bridge. The coefficient shape +is again identical to the boundary bridge at the radius-recursion level. -/ +def CoarseCaccioppoliInteriorCanonicalHarmonicVectorLocalPatchNoteRawBridge {d : ℕ} + [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) : Prop := + ∀ n : ℕ, + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence n) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * C) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1)) + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) * + Real.sqrt + (coarseCaccioppoliLocalEnergyRadiusProfile Q center baseEnergy + (coarseCaccioppoliRadiusSequence (n + 1))) + +/-- The local-patch interior and boundary vector raw bridges have the same +radius-sequence recurrence shape. -/ +theorem + CoarseCaccioppoliInteriorCanonicalHarmonicVectorLocalPatchNoteRawBridge.of_boundary + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridge + Q center a s t C uL2Sq baseEnergy) : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorLocalPatchNoteRawBridge + Q center a s t C uL2Sq baseEnergy := by + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridge, + CoarseCaccioppoliInteriorCanonicalHarmonicVectorLocalPatchNoteRawBridge] using h + +/-- An all-radii boundary raw estimate restricts to the note-faithful +Chapter-3 radius-sequence bridge. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge.of_noteRawEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy)) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge + Q a s t C uL2Sq baseEnergy := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge] using + hraw hρ₁ hlt hρ₂ + +/-- An all-radii interior raw estimate restricts to the note-faithful +Chapter-3 radius-sequence bridge. -/ +theorem + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge.of_noteRawEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (hraw : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t + ((Fintype.card (Fin d) : ℝ) * C) coarseCaccioppoliTriadicGapScale) + (coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy)) : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge + Q a s t C uL2Sq baseEnergy := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge, + CoarseCaccioppoliInteriorNoteRawEstimate] using hraw hρ₁ hlt hρ₂ + +/-- An all-radii split boundary raw bridge restricts to the legacy +radius-sequence split bridge. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit.of_allRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (hraw : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii + Q a s t Calpha Ccross uL2Sq baseEnergy) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit + Q a s t Calpha Ccross uL2Sq baseEnergy := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit, + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplitAllRadii] + using hraw hρ₁ hlt hρ₂ + +/-- An all-radii split local-patch raw bridge restricts to the legacy +radius-sequence split local-patch bridge. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit.of_allRadii + {d : ℕ} [NeZero d] (Q : TriadicCube d) (center : Vec d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (hraw : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii + Q center a s t Calpha Ccross uL2Sq baseEnergy) : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit + Q center a s t Calpha Ccross uL2Sq baseEnergy := by + intro n + have hρ₁ : (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n := + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : + coarseCaccioppoliRadiusSequence n < + coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ : coarseCaccioppoliRadiusSequence (n + 1) ≤ 1 := + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplit, + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorLocalPatchNoteRawBridgeSplitAllRadii] + using hraw hρ₁ hlt hρ₂ + +/-- The interior and boundary vector raw bridges have the same radius-sequence +recurrence shape at this level. -/ +theorem + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge.of_boundary + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge + Q a s t C uL2Sq baseEnergy) : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge + Q a s t C uL2Sq baseEnergy := by + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridge, + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridge] using h + +/-- The split interior and boundary vector raw bridges have the same +radius-sequence recurrence shape at this level. -/ +theorem + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit.of_boundary + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t Calpha Ccross uL2Sq : ℝ) (baseEnergy : Vec d → ℝ) + (h : + CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit + Q a s t Calpha Ccross uL2Sq baseEnergy) : + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit + Q a s t Calpha Ccross uL2Sq baseEnergy := by + simpa [CoarseCaccioppoliBoundaryCanonicalHarmonicVectorNoteRawBridgeSplit, + CoarseCaccioppoliInteriorCanonicalHarmonicVectorNoteRawBridgeSplit] using h + +/-- Build the legacy solution-side package from the existing projected-Poincare +and `circ` package for the canonical gradient component. The final theorem +only needs the projected-Poincare part; the two `circ` estimates are useful +upstream and are safely forgotten here. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicSolutionInputs.of_projectedPoincareCircBounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hProfile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hProjectedCirc : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds Q a s C w + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) : + CoarseCaccioppoliBoundaryCanonicalHarmonicSolutionInputs Q a C baseEnergy w i where + profile := hProfile + positive_factors := hpositiveFactors + projected_poincare := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + exact hProjectedCirc.projectedPoincare hρ₁ hlt hρ₂ N + +/-- The remaining analytic/profile hypotheses for the legacy componentwise +harmonic-gradient endpoint at the Chapter-3 radii. + +This package deliberately does not hide the coefficient schedule or the +multiscale ellipticity data. Its role is to name the solution-side inputs: +fixed localized energy profile, flux/gradient energy controls, nonzero energy +factors, the explicit full-cube/localized energy compatibility equality, and +the projected Poincare family for the selected component. -/ +structure CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) : Prop where + base_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x + base_integrable : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume + inner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + energy_average : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂ + flux_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + nonzero_energy_factors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w + gradient_energy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + projected_poincare : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i + +/-- Extend a fixed localized profile package to the final analytic-input +package by deriving the flux and gradient energy-control fields from +closed-cube ellipticity, while keeping the nondegeneracy and projected +Poincare inputs explicit. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs.of_profileInputs_closedCubeHarmonicEnergyControls + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + {lam Lam : ℝ} (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hs : 0 < s) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hProfile : + CoarseCaccioppoliBoundaryCanonicalHarmonicProfileInputs Q a baseEnergy w) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) : + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs Q a s C baseEnergy w i where + base_nonneg := hProfile.base_nonneg + base_integrable := hProfile.base_integrable + inner_energy_le := hProfile.inner_energy_le + energy_average := henergyAvg + flux_energy := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube ((w ρ₁ ρ₂).toCubeSet) + simpa [scalarVariationEnergyIntegrand] using hflux + nonzero_energy_factors := hnonzeroFactors + gradient_energy := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube ((w ρ₁ ρ₂).toCubeSet) hOrigin + simpa [scalarVariationEnergyIntegrand] using hgrad + projected_poincare := hprojected + +/-- Extend the clean solution-side package to the analytic-input package under +closed-cube ellipticity. + +The solution package records strict positivity of the canonical gradient +factors. The analytic package only needs the weaker nonzero-energy part, so +this bridge forgets the extra `Acirc` positivity while deriving the flux and +gradient energy controls from closed-cube ellipticity. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicSolutionInputs.to_analyticInputs_closedCubeHarmonicEnergyControls + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {s C lam Lam : ℝ} {baseEnergy : Vec d → ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} {i : Fin d} + (hSolution : + CoarseCaccioppoliBoundaryCanonicalHarmonicSolutionInputs Q a C baseEnergy w i) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hs : 0 < s) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs Q a s C baseEnergy w i := by + have hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hSolution.positive_factors hρ₁ hlt hρ₂ with ⟨hU, _hA, hEnergy⟩ + exact ⟨hU, hEnergy⟩ + exact + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs.of_profileInputs_closedCubeHarmonicEnergyControls + Q a s C baseEnergy w i hs hEllCube henergyAvg hSolution.profile hnonzeroFactors + hSolution.projected_poincare + +/-- Build the final analytic/profile input package from the remaining profile, +nondegeneracy, and projected-Poincare fields, while deriving the flux and +gradient energy-control fields from closed-cube ellipticity. + +This is a compatibility bridge for the current coarse-Poincare API: it uses +`AHarmonicFunction.toCubeSet`, so it requires ellipticity on `cubeSet Q`. +The pure note-facing open-cube version remains the next analytic target. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs.of_closedCubeHarmonicEnergyControls + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + {lam Lam : ℝ} (baseEnergy : Vec d → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hs : 0 < s) + (hEllCube : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hbase_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ baseEnergy x) + (hbase_int : + MeasureTheory.IntegrableOn baseEnergy (cubeSet Q) MeasureTheory.volume) + (hinner_energy_le : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ scaledClosedCubeSet Q ρ₁, + baseEnergy x ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + coarseCaccioppoliLocalizedEnergyRadiusProfile Q baseEnergy ρ₂) + (hnonzeroFactors : + CoarseCaccioppoliBoundaryCanonicalGradientNonzeroEnergyFactors Q a w) + (hprojected : + CoarseCaccioppoliBoundaryCanonicalGradientProjectedPoincareFamily Q a C w i) : + CoarseCaccioppoliBoundaryCanonicalHarmonicAnalyticInputs Q a s C baseEnergy w i where + base_nonneg := hbase_nonneg + base_integrable := hbase_int + inner_energy_le := hinner_energy_le + energy_average := henergyAvg + flux_energy := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hflux := + CoarseCaccioppoliFluxEnergyControls.of_aHarmonicFunction_of_isEllipticFieldOn + (Q := Q) (a := a) (s := s) hs hEllCube ((w ρ₁ ρ₂).toCubeSet) + simpa [scalarVariationEnergyIntegrand] using hflux + nonzero_energy_factors := hnonzeroFactors + gradient_energy := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hgrad := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEllCube ((w ρ₁ ρ₂).toCubeSet) hOrigin + simpa [scalarVariationEnergyIntegrand] using hgrad + projected_poincare := hprojected + +/-- Localize the canonical harmonic coefficient schedule to the raw +radius-recursion coefficient schedule. This is the final coefficient-only +composition step: single-cube coefficient bounds plus standard multiscale data +produce the raw `Alpha`/`Bcross` inequalities consumed by the newest wrappers. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hcoeff : + CoarseCaccioppoliBoundaryCanonicalHarmonicCoefficientBounds Q a s t C uL2Sq w) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundaryCanonicalHarmonicRawCoefficientBounds Q a s t C uL2Sq w := by + exact + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq + coarseCaccioppoliTriadicGapScale + (coarseCaccioppoliCanonicalHarmonicL2Profile Q a w) + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + hC.le hs ht hst + (fun {ρ₁ ρ₂} hρ₁ hlt hρ₂ => + coarseCaccioppoliTriadicGapScale_spec hρ₁ hlt hρ₂) + hcoeff hEll hData hBsum_s hSigmaSum_t + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicGradientControls.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicGradientControls.lean new file mode 100644 index 0000000000..167512483e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicGradientControls.lean @@ -0,0 +1,980 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls + +/-! # Harmonic Gradient Controls -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Harmonic gradient scalar-control bridges + +This file contains the Phase 2 scalar-control wrappers specialized to the +eventual Chapter 3 auxiliary scalar field `g = partial_i w`. It keeps the +long generic scalar-control file below the preferred size threshold while +removing routine energy hypotheses from downstream call sites. +-/ + +/-- Canonical scalar `Acirc` factor used for gradient components at regularity +`r`. The final harmonic-gradient wrappers specialize this at `r = 1` and +`r = 1 - s`, so the corresponding lower-bound hypotheses become definitional. -/ +noncomputable def coarseCaccioppoliCanonicalGradientAcirc {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (r : ℝ) : ℝ := + cubeBesovScaleWeight (-r) Q * + ((geometricDiscount r 1)⁻¹ * + Real.rpow (lambdaSq Q r (.finite 1) a) (-1 / 2 : ℝ)) + +/-- Radius-constant canonical `Acirc` factor at regularity `1`. -/ +noncomputable def coarseCaccioppoliCanonicalGradientAcircOne {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) : ℝ → ℝ → ℝ := + fun _ _ => coarseCaccioppoliCanonicalGradientAcirc Q a (1 : ℝ) + +/-- Radius-constant canonical `Acirc` factor at regularity `1 - s`. -/ +noncomputable def coarseCaccioppoliCanonicalGradientAcircOneSub {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) : ℝ → ℝ → ℝ := + fun _ _ => coarseCaccioppoliCanonicalGradientAcirc Q a (1 - s) + +/-- The canonical gradient `Acirc` factor is nonnegative in the nonnegative +regularity range. -/ +theorem coarseCaccioppoliCanonicalGradientAcirc_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {r : ℝ} (hr : 0 ≤ r) : + 0 ≤ coarseCaccioppoliCanonicalGradientAcirc Q a r := by + unfold coarseCaccioppoliCanonicalGradientAcirc + have hdisc_nonneg : 0 ≤ (geometricDiscount r 1)⁻¹ := by + exact inv_nonneg.mpr (geometricDiscount_nonneg (by simpa using hr)) + exact + mul_nonneg (cubeBesovScaleWeight_nonneg (-r) Q) + (mul_nonneg hdisc_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_lambdaSq_one_nonneg Q r a hr) _)) + +/-- The canonical `r = 1` gradient `Acirc` factor is nonnegative. -/ +theorem coarseCaccioppoliCanonicalGradientAcircOne_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (ρ₁ ρ₂ : ℝ) : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOne Q a ρ₁ ρ₂ := by + exact + coarseCaccioppoliCanonicalGradientAcirc_nonneg Q a + (by norm_num : 0 ≤ (1 : ℝ)) + +/-- The canonical `r = 1 - s` gradient `Acirc` factor is nonnegative when +`s ≤ 1`. -/ +theorem coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} (hs1 : s ≤ 1) (ρ₁ ρ₂ : ℝ) : + 0 ≤ coarseCaccioppoliCanonicalGradientAcircOneSub Q a s ρ₁ ρ₂ := by + exact + coarseCaccioppoliCanonicalGradientAcirc_nonneg Q a + (sub_nonneg.mpr hs1) + +/-- The strict nondegeneracy inputs still needed for the canonical gradient +`Acirc` specialization. Nonnegativity of the `1 - s` canonical factor is +derived separately from `s < 1`. -/ +def CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 < cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ∧ + 0 < coarseCaccioppoliCanonicalGradientAcircOne Q a ρ₁ ρ₂ ∧ + 0 < + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + +/-- Build the scalar-positive-factor package for the canonical gradient +`Acirc` factors from the genuinely strict nondegeneracy inputs. -/ +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.of_canonicalGradientAcirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (hs1 : s < 1) + (hpos : CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) : + CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + obtain ⟨hU, hA1, henergy⟩ := hpos hρ₁ hlt hρ₂ + exact + ⟨hU, hA1, + coarseCaccioppoliCanonicalGradientAcircOneSub_nonneg Q a hs1.le ρ₁ ρ₂, + henergy⟩ + +/-- A component of the gradient of an open-cube harmonic function is `L²` for +the normalized closed-cube measure. -/ +theorem memLp_harmonicGradientComponent_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : AHarmonicFunction a (openCubeSet Q)) (i : Fin d) : + MeasureTheory.MemLp (fun x => w.toH1.grad x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hgrad : + MeasureTheory.MemLp (fun x => w.toH1.grad x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet Q w.toH1.grad_memVectorL2 + exact memLp_component_of_memLp (fun x => w.toH1.grad x) i hgrad + +/-- Summability of the `sigma_*^{-1}` series improves when the geometric +regularity exponent is increased. -/ +theorem summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {t r : ℝ} + (ht : 0 < t) (htr : t < r) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Summable (fun n : ℕ => + geometricWeight r 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + refine summable_geometricWeight_one_of_lt ?_ ht htr hsum_t + intro n + exact + Real.rpow_nonneg + (maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + _ + +/-- Concrete harmonic-gradient projected/circ package using the already +available flux-energy controls to supply scalar-energy nonnegativity and +integrability. The projected mean-zero Poincare estimate for `partial_i w` +remains the genuine analytic input. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hs1 : s < 1) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) : + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS := by + refine + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent + Q a s C w i Acirc1 AcircS hs1 ?_ ?_ hgrad hsum1 hsumS hproj hAcirc1 hAcircS + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact (hfluxEnergy hρ₁ hlt hρ₂).1 + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact (hfluxEnergy hρ₁ hlt hρ₂).2.1 + +/-- Concrete harmonic-gradient projected/circ package with the canonical +gradient `Acirc` factors. This removes the two explicit `Acirc` lower-bound +hypotheses from the projected/circ handoff. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls_canonicalGradientAcirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hs1 : s < 1) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) : + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) := by + exact + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls + Q a s C w i + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + hs1 hfluxEnergy hgrad hsum1 hsumS hproj + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + +/-- Full scalar-control factors for `g = partial_i w`, with scalar-energy +nonnegativity/integrability taken from the flux-energy controls already used +by the single-cube Caccioppoli bridge. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_harmonicGradientComponent_of_fluxEnergyControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hpos : + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors + Q a w Acirc1 AcircS) + (hs1 : s < 1) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) : + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarControlFactors + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS := by + exact + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS hpos + (_root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls + Q a s C w i Acirc1 AcircS hs1 hfluxEnergy hgrad hsum1 hsumS hproj hAcirc1 + hAcircS) + +/-- Full scalar-control factors for `g = partial_i w` with the canonical +gradient `Acirc` factors. -/ +theorem + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_harmonicGradientComponent_of_fluxEnergyControls_canonicalGradientAcirc + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (hpos : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hs1 : s < 1) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) : + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarControlFactors + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) := by + exact + _root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + (_root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.of_canonicalGradientAcirc + Q a s w hs1 hpos) + (_root_.Homogenization.CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls_canonicalGradientAcirc + Q a s C w i hs1 hfluxEnergy hgrad hsum1 hsumS hproj) + +/-- Boundary canonical harmonic Caccioppoli specialized to the concrete scalar +auxiliary field `g = partial_i w`. The theorem builds the projected/circ +package from flux-energy controls plus gradient-energy controls; projected +mean-zero Poincare for `partial_i w` is still an explicit analytic input. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_harmonicGradientComponent_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1_lower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS_lower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_projectedPoincareCircBounds_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) + (g := fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicGradientComponent_normalizedCubeMeasure Q a (w ρ₁ ρ₂) i) + hfluxEnergy hpositiveFactors + (CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls + Q a s C w i Acirc1 AcircS hs1 hfluxEnergy hgrad hSigmaSum_one + hSigmaSum_one_sub_s hproj hAcirc1_lower hAcircS_lower) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli specialized to +`g = partial_i w`. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_harmonicGradientComponent_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1_lower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS_lower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hSigmaSum_one : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hs, hst]) hSigmaSum_t + have hSigmaSum_one_sub_s : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_maxDescendantSigmaStarInvNormAtScale_geometricWeight_one_of_lt + Q a ht (by nlinarith [hst]) hSigmaSum_t + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_projectedPoincareCircBounds_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) + (g := fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicGradientComponent_normalizedCubeMeasure Q a (w ρ₁ ρ₂) i) + hfluxEnergy hpositiveFactors + (CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent_of_fluxEnergyControls + Q a s C w i Acirc1 AcircS hs1 hfluxEnergy hgrad hSigmaSum_one + hSigmaSum_one_sub_s hproj hAcirc1_lower hAcircS_lower) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +/-- Boundary canonical harmonic Caccioppoli specialized to the canonical +gradient `Acirc` factors. Compared with +`...of_harmonicGradientComponent...`, the `Acirc` lower-bound hypotheses are +now definitional. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcirc_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliCanonicalGradientAcircOne Q a ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliCanonicalGradientAcircOneSub Q a s ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_harmonicGradientComponent_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (i := i) + (Acirc1 := coarseCaccioppoliCanonicalGradientAcircOne Q a) + (AcircS := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg + hfluxEnergy + (CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.of_canonicalGradientAcirc + Q a s w hs1 hpositiveFactors) + hgrad hproj + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli specialized to the canonical +gradient `Acirc` factors. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcirc_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliCanonicalGradientAcircOne Q a ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliCanonicalGradientAcircOneSub Q a s ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_harmonicGradientComponent_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (i := i) + (Acirc1 := coarseCaccioppoliCanonicalGradientAcircOne Q a) + (AcircS := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + hfluxEnergy + (CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.of_canonicalGradientAcirc + Q a s w hs1 hpositiveFactors) + hgrad hproj + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +/-- Boundary canonical harmonic Caccioppoli with the canonical gradient +`Acirc` factors also installed in the coefficient-bound package. This removes +the caller-facing `hA1` and `hAS` comparison hypotheses from the canonical +gradient endpoint. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcircCoefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (U : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcirc_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (i := i) + (U := U) + (A1 := coarseCaccioppoliCanonicalGradientAcircOne Q a) + (AS := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg + hfluxEnergy hpositiveFactors hgrad hproj hU + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hcoeff hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli with the canonical gradient +`Acirc` factors also installed in the coefficient-bound package. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcircCoefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (U : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalGradientPositiveFactors Q a w) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + (coarseCaccioppoliCanonicalGradientAcircOne Q a) + (coarseCaccioppoliCanonicalGradientAcircOneSub Q a s)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_canonicalGradientAcirc_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (i := i) + (U := U) + (A1 := coarseCaccioppoliCanonicalGradientAcircOne Q a) + (AS := coarseCaccioppoliCanonicalGradientAcircOneSub Q a s) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + hfluxEnergy hpositiveFactors hgrad hproj hU + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + (by + intro ρ₁ ρ₂ _ _ _ + exact le_rfl) + hcoeff hEll hData hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff.lean new file mode 100644 index 0000000000..c831ded6a7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.BoundaryCanonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.InteriorCanonical + +/-! # Harmonic Quantitative Cutoff -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/BoundaryCanonical.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/BoundaryCanonical.lean new file mode 100644 index 0000000000..9f7d8c8d67 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/BoundaryCanonical.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.Standard + +/-! # Boundary Canonical -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Boundary coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F w g Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff, with the cutoff-product/Poincare +side bundled as `CoarseCaccioppoliScalarCutoffControls`. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F w g Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy hscalar + hC hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff, with the strict support +hypothesis `ρ₂ < 1` discharged automatically on the deterministic radius +sequence. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by + linarith + refine + coarseCaccioppoli_boundary_qone_of_noteEstimate_on_radiusSequence_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hnonneg hbounded hscale ?_ + intro n + have hρ₁ := (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : coarseCaccioppoliRadiusSequence n < coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + rcases + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_radiusSequence_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls + Q a s C F w g Acirc1 AcircS U A1 AS hEll n + (hlower hρ₁ hlt hρ₂) + (henergyAvg hρ₁ hlt hρ₂) + (hfluxMem hρ₁ hlt hρ₂) + (huMem hρ₁ hlt hρ₂) + (hgMem hρ₁ hlt hρ₂) + (hfluxEnergy hρ₁ hlt hρ₂) + (hscalar hρ₁ hlt hρ₂) + hC + (hAcirc1_nonneg hρ₁ hlt hρ₂) + (hAcircS_nonneg hρ₁ hlt hρ₂) + (hU hρ₁ hlt hρ₂) + (hA1 hρ₁ hlt hρ₂) + (hAS hρ₁ hlt hρ₂) with + ⟨htest, henergyAvgN, hfluxMemN, huMemN, hgMemN, hξLpN, hfluxEnergyN, hscalarN, + hB_nonnegN, hAcirc1_nonnegN, hAcircS_nonnegN, hUN, hXiN, hDN, hA1N, hASN⟩ + rcases hrawcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + refine le_trans htest ?_ + simpa [henergyAvgN] using + (abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_factor_bounds + (Q := Q) (a := a) (s := s) + (flux := fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (u := fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (g := g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (ξ := scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) + (energy := fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) + (Acirc1 := Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AcircS := AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (B := coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (C := C) + (U := U (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Xi := coarseCaccioppoliQuantitativeCutoffGradientBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (D := coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (A1 := A1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AS := AS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Alpha := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Bcross := coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + hs hs1 hfluxMemN huMemN hgMemN hξLpN hfluxEnergyN hscalarN + hAcirc1_nonnegN hAcircS_nonnegN hUN hXiN hDN hA1N hASN hconst hcentered) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/InteriorCanonical.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/InteriorCanonical.lean new file mode 100644 index 0000000000..d54b29a589 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/InteriorCanonical.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff.BoundaryCanonical + +/-! # Interior Canonical -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Interior coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ w g Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff, with the cutoff-product/Poincare +side bundled as `CoarseCaccioppoliScalarCutoffControls`. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ w g Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy hscalar + hC hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli for the actual harmonic family using the +canonical chapter-3 quantitative cube cutoff, with the strict support +hypothesis `ρ₂ < 1` discharged automatically on the deterministic radius +sequence. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hrawcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by + linarith + refine + coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_on_radiusSequence_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hagree hG_nonneg hG_bounded hscale ?_ + intro n + have hρ₁ := (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + have hlt : coarseCaccioppoliRadiusSequence n < coarseCaccioppoliRadiusSequence (n + 1) := + coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n) + have hρ₂ := (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + rcases + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_radiusSequence_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls + Q a s C G₀ w g Acirc1 AcircS U A1 AS hEll n + (hlower hρ₁ hlt hρ₂) + (henergyAvg hρ₁ hlt hρ₂) + (hfluxMem hρ₁ hlt hρ₂) + (huMem hρ₁ hlt hρ₂) + (hgMem hρ₁ hlt hρ₂) + (hfluxEnergy hρ₁ hlt hρ₂) + (hscalar hρ₁ hlt hρ₂) + hC + (hAcirc1_nonneg hρ₁ hlt hρ₂) + (hAcircS_nonneg hρ₁ hlt hρ₂) + (hU hρ₁ hlt hρ₂) + (hA1 hρ₁ hlt hρ₂) + (hAS hρ₁ hlt hρ₂) with + ⟨htest, henergyAvgN, hfluxMemN, huMemN, hgMemN, hξLpN, hfluxEnergyN, hscalarN, + hB_nonnegN, hAcirc1_nonnegN, hAcircS_nonnegN, hUN, hXiN, hDN, hA1N, hASN⟩ + rcases hrawcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + refine le_trans htest ?_ + simpa [henergyAvgN] using + (abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_factor_bounds + (Q := Q) (a := a) (s := s) + (flux := fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (u := fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (g := g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (ξ := scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) + (energy := fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) + (Acirc1 := Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AcircS := AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (B := coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (C := C) + (U := U (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Xi := coarseCaccioppoliQuantitativeCutoffGradientBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (D := coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (A1 := A1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AS := AS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Alpha := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (Bcross := coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + hs hs1 hfluxMemN huMemN hgMemN hξLpN hfluxEnergyN hscalarN + hAcirc1_nonnegN hAcircS_nonnegN hUN hXiN hDN hA1N hASN hconst hcentered) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/Standard.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/Standard.lean new file mode 100644 index 0000000000..e68548ec44 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicQuantitativeCutoff/Standard.lean @@ -0,0 +1,613 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.FinalWrappers + +/-! # Standard -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Boundary coarse Caccioppoli for the actual harmonic family, with the +testing inequality discharged by the weak-testing bridge and a quantitative +cutoff family. -/ +theorem + coarseCaccioppoli_boundary_qone_of_quantitativeCutoff_of_aHarmonicFamily_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hη_tsupport : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + tsupport (η ρ₁ ρ₂) ⊆ openCubeSet Q) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F w g η Acirc1 AcircS U A1 AS + hEll hlower hη_tsupport henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Boundary coarse Caccioppoli for the actual harmonic family, with cutoff +support discharged from the strict outer-radius condition `ρ₂ < 1`. -/ +theorem + coarseCaccioppoli_boundary_qone_of_quantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hnonneg hbounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + F w g η Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli for the actual harmonic family, transported +across the radius agreement used for the centered quantity. -/ +theorem + coarseCaccioppoli_interior_qone_of_quantitativeCutoff_of_aHarmonicFamily_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hη_tsupport : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + tsupport (η ρ₁ ρ₂) ⊆ openCubeSet Q) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ w g η Acirc1 AcircS U A1 AS + hEll hlower hη_tsupport henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + +/-- Interior coarse Caccioppoli for the actual harmonic family, with cutoff +support discharged from the strict outer-radius condition `ρ₂ < 1`. -/ +theorem + coarseCaccioppoli_interior_qone_of_quantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = G₀ ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_coefficientBounds_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + Q a s C + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G₀ w g η Acirc1 AcircS U A1 AS + hEll hlower houter henergyAvg hfluxMem huMem hgMem hfluxEnergy + hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS + hU hA1 hAS) + hcoeff hEll hData hBsum_s hSigmaSum_t + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicScalarControls.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicScalarControls.lean new file mode 100644 index 0000000000..1e101c4519 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/HarmonicScalarControls.lean @@ -0,0 +1,1007 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCoefficientBounds + +/-! # Harmonic Scalar Controls -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Harmonic scalar-control factors + +This file packages the remaining Phase 2 scalar-control primitives for the +canonical harmonic coarse-Caccioppoli wrappers. The raw bundled hypothesis +`CoarseCaccioppoliScalarCutoffControls` has already been removed from the +strongest localization-data endpoints; this sidecar replaces the two exact +cutoff-size positivity hypotheses by simpler positive factor assumptions. +-/ + +/-- Vector `L²` data on the open cube also gives `L²` data for the normalized +closed-cube measure. -/ +theorem memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet {d : ℕ} + (Q : TriadicCube d) {f : Vec d → Vec d} + (hf : MemVectorL2 (openCubeSet Q) f) : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hfCube : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hf + exact + hfCube.of_measure_le_smul (c := ENNReal.ofReal ((cubeVolume Q)⁻¹)) + ENNReal.ofReal_ne_top (by rw [normalizedCubeMeasure, cubeMeasure]) + +/-- Scalar `L²` data on the open cube also gives `L²` data for the normalized +closed-cube measure. -/ +theorem memLp_normalizedCubeMeasure_of_memL2On_openCubeSet {d : ℕ} + (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : MemL2On (openCubeSet Q) f) : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hfCube : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemL2On, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hf + exact + hfCube.of_measure_le_smul (c := ENNReal.ofReal ((cubeVolume Q)⁻¹)) + ENNReal.ofReal_ne_top (by rw [normalizedCubeMeasure, cubeMeasure]) + +/-- An open-cube harmonic function is `L²` for the normalized closed-cube +measure. -/ +theorem memLp_harmonicFunction_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : AHarmonicFunction a (openCubeSet Q)) : + MeasureTheory.MemLp (fun x => w.toH1 x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa using memLp_normalizedCubeMeasure_of_memL2On_openCubeSet Q w.toH1.memL2 + +/-- The flux of an open-cube harmonic function is `L²` for the normalized +closed-cube measure under ellipticity. -/ +theorem memLp_harmonicFlux_normalizedCubeMeasure {d : ℕ} {lam Lam : ℝ} + (Q : TriadicCube d) (a : CoeffField d) + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) : + MeasureTheory.MemLp + (fun x => matVecMul (a x) (w.toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact + memLp_normalizedCubeMeasure_of_memVectorL2_openCubeSet Q + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2) + +/-- The flux-energy package already includes the `B`-coefficient summability +needed by the final radius bridge. A single fixed admissible radius pair is +enough because this summability does not depend on the radius pair. -/ +theorem summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + {flux : ℝ → ℝ → Vec d → Vec d} {energy : ℝ → ℝ → Vec d → ℝ} + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + (hfluxEnergy (ρ₁ := (1 / 3 : ℝ)) (ρ₂ := (2 / 3 : ℝ)) + (by norm_num) (by norm_num) (by norm_num)).2.2.2.2 + +/-- Radius-wise primitive data that generate the scalar cutoff-control bundle +for the canonical Chapter 3 cutoff. -/ +def CoarseCaccioppoliBoundaryCanonicalScalarControlFactors {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 < cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ∧ + 0 < Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + 0 < + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) ∧ + (∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + +/-- The nondegeneracy/positivity part of the canonical scalar-control factors. + +This is deliberately separated from the actual projected-Poincare/circ content: +the latter is the real Besov/Poincare input for Phase 2. -/ +def CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (Acirc1 AcircS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 < cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ∧ + 0 < Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + 0 < + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + +/-- The actual projected-Poincare and `circ` estimates needed for Phase 2. -/ +def CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) ∧ + (∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.cubeLpNorm_pos + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 < cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) := + (hpos hρ₁ hlt hρ₂).1 + +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.acirc1_pos + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 < Acirc1 ρ₁ ρ₂ := + (hpos hρ₁ hlt hρ₂).2.1 + +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.acirc1_nonneg + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 ≤ Acirc1 ρ₁ ρ₂ := + (hpos.acirc1_pos hρ₁ hlt hρ₂).le + +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.acircS_nonneg + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 ≤ AcircS ρ₁ ρ₂ := + (hpos hρ₁ hlt hρ₂).2.2.1 + +theorem CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors.energySqrt_pos + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 < Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := + (hpos hρ₁ hlt hρ₂).2.2.2 + +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.projectedPoincare + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {s C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {g : ℝ → ℝ → Vec d → ℝ} {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hctrl : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds Q a s C w g Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) + (N : ℕ) : + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N := + (hctrl hρ₁ hlt hρ₂).1 N + +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.circPartialNorm_one_le + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {s C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {g : ℝ → ℝ → Vec d → ℝ} {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hctrl : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds Q a s C w g Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) + (N : ℕ) : + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := + (hctrl hρ₁ hlt hρ₂).2.1 N + +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.circPartialNorm_one_sub_le + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {s C : ℝ} + {w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)} + {g : ℝ → ℝ → Vec d → ℝ} {Acirc1 AcircS : ℝ → ℝ → ℝ} + (hctrl : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds Q a s C w g Acirc1 AcircS) + {ρ₁ ρ₂ : ℝ} (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) + (N : ℕ) : + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := + (hctrl hρ₁ hlt hρ₂).2.2 N + +/-- Build the projected-Poincare/`circ` package when the scalar auxiliary +field is one component of a vector field whose negative Besov partial seminorms +already dominate the desired `circ` factors. This is the local scalarization +bridge used before the final concrete choice of `g` is fixed. -/ +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_component_negativeVectorBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (G : ℝ → ℝ → Vec d → Vec d) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => G ρ₁ ρ₂ x i) N) + (hneg1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovScaleWeight (-1) Q * + cubeBesovNegativeVectorPartialSeminorm Q 1 N (G ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hnegS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovScaleWeight (-(1 - s)) Q * + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N (G ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => G ρ₁ ρ₂ x i) Acirc1 AcircS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + refine ⟨?_, ?_, ?_⟩ + · intro N + exact hproj hρ₁ hlt hρ₂ N + · intro N + calc + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G ρ₁ ρ₂ x i) + ≤ cubeBesovScaleWeight (-1) Q * + cubeBesovNegativeVectorPartialSeminorm Q 1 N (G ρ₁ ρ₂) := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q 1 (G ρ₁ ρ₂) i N + _ ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := + hneg1 hρ₁ hlt hρ₂ N + · intro N + calc + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => G ρ₁ ρ₂ x i) + ≤ cubeBesovScaleWeight (-(1 - s)) Q * + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N (G ρ₁ ρ₂) := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q (1 - s) (G ρ₁ ρ₂) i N + _ ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) := + hnegS hρ₁ hlt hρ₂ N + +/-- Build the projected-Poincare/`circ` package for a component of a vector +field whose descendant gradient-energy controls supply the note's `lambdaSq` +factors. This is the concrete gradient-side scalarization bridge; the +projected mean-zero Poincare family remains as the analytic input. -/ +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_component_gradientEnergyControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (G : ℝ → ℝ → Vec d → Vec d) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hs1 : s < 1) + (henergy_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergy_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (cubeSet Q) MeasureTheory.volume) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (G ρ₁ ρ₂) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => G ρ₁ ρ₂ x i) N) + (hAcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => G ρ₁ ρ₂ x i) Acirc1 AcircS := by + refine + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_component_negativeVectorBounds + Q a s C w G i Acirc1 AcircS hproj ?_ ?_ + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q (1 : ℝ) N (G ρ₁ ρ₂) ≤ + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + exact + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 : ℝ) (by norm_num) (G ρ₁ ρ₂) energy N + (henergy_nonneg hρ₁ hlt hρ₂) (henergy_int hρ₁ hlt hρ₂) + (hgrad hρ₁ hlt hρ₂) hsum1 + have hE_nonneg : 0 ≤ Real.sqrt (cubeAverage Q energy) := + Real.sqrt_nonneg _ + calc + cubeBesovScaleWeight (-1) Q * + cubeBesovNegativeVectorPartialSeminorm Q 1 N (G ρ₁ ρ₂) + ≤ + cubeBesovScaleWeight (-1) Q * + (((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hpartial (cubeBesovScaleWeight_nonneg (-1) Q) + _ = + (cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ ≤ + Acirc1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_right (hAcirc1 hρ₁ hlt hρ₂) hE_nonneg + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + let energy : Vec d → ℝ := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x + have hs_pos : 0 < 1 - s := by linarith + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N (G ρ₁ ρ₂) ≤ + (geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + exact + coarseCaccioppoli_gradient_qone_partialBound_of_cubeAverageEnergyControl + Q a (1 - s) hs_pos (G ρ₁ ρ₂) energy N + (henergy_nonneg hρ₁ hlt hρ₂) (henergy_int hρ₁ hlt hρ₂) + (hgrad hρ₁ hlt hρ₂) hsumS + have hE_nonneg : 0 ≤ Real.sqrt (cubeAverage Q energy) := + Real.sqrt_nonneg _ + calc + cubeBesovScaleWeight (-(1 - s)) Q * + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N (G ρ₁ ρ₂) + ≤ + cubeBesovScaleWeight (-(1 - s)) Q * + (((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hpartial + (cubeBesovScaleWeight_nonneg (-(1 - s)) Q) + _ = + (cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ))) * + Real.sqrt (cubeAverage Q energy) := by + ring + _ ≤ + AcircS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_right (hAcircS hρ₁ hlt hρ₂) hE_nonneg + +/-- Concrete harmonic-gradient version of +`CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_component_gradientEnergyControl`. + +Once the projected mean-zero Poincare family is available for the component +`∂ᵢ w`, the gradient-energy bridge supplies both scalar `circ` estimates for +that same component. -/ +theorem CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hs1 : s < 1) + (henergy_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergy_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (cubeSet Q) MeasureTheory.volume) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS := by + exact + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_component_gradientEnergyControl + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x) i Acirc1 AcircS + hs1 henergy_nonneg henergy_int hgrad hsum1 hsumS hproj hAcirc1 hAcircS + +theorem CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hctrl : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds Q a s C w g Acirc1 AcircS) : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hpos hρ₁ hlt hρ₂ with ⟨hu_pos, hAcirc1_pos, hAcircS_nonneg, hE_pos⟩ + rcases hctrl hρ₁ hlt hρ₂ with ⟨hproj, hgCirc1, hgCircS⟩ + exact ⟨hu_pos, hAcirc1_pos, hAcircS_nonneg, hE_pos, hproj, hgCirc1, hgCircS⟩ + +/-- Full scalar-control factors for the concrete scalar field `partial_i w`. + +This is the Phase 2 bridge used by the final Caccioppoli wrappers once the +projected mean-zero Poincare estimate for `partial_i w` has been supplied. -/ +theorem CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_harmonicGradientComponent + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) (i : Fin d) + (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hpos : CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hs1 : s < 1) + (henergy_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (henergy_int : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.IntegrableOn + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (cubeSet Q) MeasureTheory.volume) + (hgrad : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CubeAverageGradientEnergyControl Q a (fun x => (w ρ₁ ρ₂).toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hsum1 : + Summable (fun n : ℕ => + geometricWeight (1 : ℝ) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsumS : + Summable (fun n : ℕ => + geometricWeight (1 - s) 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) + (fun x => (w ρ₁ ρ₂).toH1.grad x i) N) + (hAcirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-1) Q * + ((geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 : ℝ) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + Acirc1 ρ₁ ρ₂) + (hAcircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeBesovScaleWeight (-(1 - s)) Q * + ((geometricDiscount (1 - s) 1)⁻¹ * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + AcircS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS := by + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + Q a s C w (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1.grad x i) Acirc1 AcircS hpos + (CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds.of_harmonicGradientComponent + Q a s C w i Acirc1 AcircS hs1 henergy_nonneg henergy_int hgrad hsum1 hsumS + hproj hAcirc1 hAcircS) + +theorem CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.to_scalarCutoffControls + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s C ρ₁ ρ₂ : ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hfactors : CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS) + (hs0 : 0 < s) (hs1 : s < 1) (hC : 0 < C) + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + rcases hfactors hρ₁ hlt hρ₂ with + ⟨hu_pos, hAcirc1_pos, hAcircS_nonneg, hE_pos, hproj, hgCirc1, hgCircS⟩ + exact + CoarseCaccioppoliScalarCutoffControls.of_canonicalQuantitativeCutoff_of_positiveFactors + (Q := Q) (s := s) (C := C) hρ₁ hlt + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + hs0 hs1 hu_pos hAcirc1_pos hAcircS_nonneg hE_pos hC hproj hgCirc1 hgCircS + +theorem CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acirc1_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {s C ρ₁ ρ₂ : ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hfactors : CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS) + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 ≤ Acirc1 ρ₁ ρ₂ := by + exact (hfactors hρ₁ hlt hρ₂).2.1.le + +theorem CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acircS_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {s C ρ₁ ρ₂ : ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) (Acirc1 AcircS : ℝ → ℝ → ℝ) + (hfactors : CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS) + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + 0 ≤ AcircS ρ₁ ρ₂ := by + exact (hfactors hρ₁ hlt hρ₂).2.2.1 + +/-- Boundary canonical harmonic Caccioppoli from primitive scalar-control +factors, without exposing the raw scalar-control bundle or exact cutoff-size +positivity hypotheses. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarControlFactors_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalarFactors : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.to_scalarCutoffControls + Q a w g Acirc1 AcircS hscalarFactors hs hs1 hC hρ₁ hlt hρ₂ + have hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acirc1_nonneg + Q a w g Acirc1 AcircS hscalarFactors hρ₁ hlt hρ₂ + have hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acircS_nonneg + Q a w g Acirc1 AcircS hscalarFactors hρ₁ hlt hρ₂ + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC.le hs ht hst hu hnonneg hbounded hscale hlower henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFlux_normalizedCubeMeasure Q a (w ρ₁ ρ₂) hEll) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS hcoeff + hEll hData + (summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family Q a s hfluxEnergy) + hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli from primitive scalar-control +factors, without exposing the raw scalar-control bundle or exact cutoff-size +positivity hypotheses. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarControlFactors_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalarFactors : + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors Q a s C w g Acirc1 AcircS) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + have hs1 : s < 1 := by nlinarith [ht, hst] + have hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.to_scalarCutoffControls + Q a w g Acirc1 AcircS hscalarFactors hs hs1 hC hρ₁ hlt hρ₂ + have hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acirc1_nonneg + Q a w g Acirc1 AcircS hscalarFactors hρ₁ hlt hρ₂ + have hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.acircS_nonneg + Q a w g Acirc1 AcircS hscalarFactors hρ₁ hlt hρ₂ + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC.le hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFlux_normalizedCubeMeasure Q a (w ρ₁ ρ₂) hEll) + (by + intro ρ₁ ρ₂ _ _ _ + exact memLp_harmonicFunction_normalizedCubeMeasure Q a (w ρ₁ ρ₂)) + hgMem hfluxEnergy hscalar hAcirc1_nonneg hAcircS_nonneg + hU hA1 hAS hcoeff hEll hData + (summable_bBlock_geometricWeight_s_of_fluxEnergyControls_family Q a s hfluxEnergy) + hSigmaSum_t + +/-- Boundary canonical harmonic Caccioppoli from the split Phase 2 scalar +inputs: nondegenerate positive factors plus the genuine projected-Poincare +and `circ` bounds. -/ +theorem + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_projectedPoincareCircBounds_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hbounded : CoarseCaccioppoliRadiusBoundedAbove F) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hprojectedCirc : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w g Acirc1 AcircS) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliBoundaryExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_boundary_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarControlFactors_of_coefficientBounds_of_localizationData_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hnonneg hbounded hscale hlower henergyAvg hgMem hfluxEnergy + (CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + Q a s C w g Acirc1 AcircS hpositiveFactors hprojectedCirc) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +/-- Interior canonical harmonic Caccioppoli from the split Phase 2 scalar +inputs: nondegenerate positive factors plus the genuine projected-Poincare +and `circ` bounds. -/ +theorem + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_positiveFactors_of_projectedPoincareCircBounds_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G₀ : ℝ → ℝ} + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hC : 0 < C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G₀) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G₀ ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G₀) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + G₀ ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = + G₀ ρ₂) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hpositiveFactors : + CoarseCaccioppoliBoundaryCanonicalScalarPositiveFactors Q a w Acirc1 AcircS) + (hprojectedCirc : + CoarseCaccioppoliBoundaryCanonicalProjectedPoincareCircBounds + Q a s C w g Acirc1 AcircS) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarControlFactors_of_coefficientBounds_of_localizationData_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + (Q := Q) (a := a) (s := s) (t := t) (C := C) (uL2Sq := uL2Sq) + (k := k) (F := F) (G₀ := G₀) (w := w) (g := g) + (Acirc1 := Acirc1) (AcircS := AcircS) (U := U) (A1 := A1) (AS := AS) + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hlower henergyAvg + hgMem hfluxEnergy + (CoarseCaccioppoliBoundaryCanonicalScalarControlFactors.of_positiveFactors_of_projectedPoincareCircBounds + Q a s C w g Acirc1 AcircS hpositiveFactors hprojectedCirc) + hU hA1 hAS hcoeff hEll hData hSigmaSum_t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Interior.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Interior.lean new file mode 100644 index 0000000000..62d352323b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Interior.lean @@ -0,0 +1,678 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Boundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Interior + +/-! # Interior -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Interior note-shaped raw estimate from radius-indexed boundary-style +energy bridge inputs, transported across the radius agreement used in the +centering step. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h G) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_boundary_noteEstimate_of_radiusAgreement + Q a s t C uL2Sq h hagree + (coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeInputs + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + hinputs hctrl) + +/-- Interior note raw estimate from radius-indexed energy bridge inputs and +pure coefficient localization, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_coefficientLocalization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + k h) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + hagree hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq k h G hG_nonneg hloc) + +/-- Interior note raw estimate from the primitive scale and ellipticity +localization inputs, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hscaleLoc : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq h F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_coefficientLocalization + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + hagree hG_nonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq k h hC hs0 hs1 hscaleLoc helliptic) + +/-- Interior note raw estimate from radius-indexed energy bridge inputs using +the localized explicit height and standard multiscale ellipticity data, +transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_coefficientLocalization + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + flux u g ξ energy Acirc1 AcircS B hs (by linarith) + hagree hG_nonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_localizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k hC hs ht hst hscale hEll hData hBsum_s hSigmaSum_t) + +/-- Interior explicit-height pre-recurrence from radius-indexed energy bridge +inputs using the localized explicit height and standard multiscale ellipticity +data, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliInteriorExplicitHeightPreRecurrence Q a s t C uL2Sq F := by + have hheight : + CoarseCaccioppoliBoundaryHeightChoice Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_heightChoice_of_localizedExplicitHeightOfScaleChoice + Q a s t C k hC hs ht hst hscale + have habs : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := + coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hheight + have hraw : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hagree hG_nonneg hscale hinputs hEll hData hBsum_s hSigmaSum_t + unfold CoarseCaccioppoliInteriorExplicitHeightPreRecurrence + exact + coarseCaccioppoli_boundary_explicitHeightPreRecurrence_of_noteEstimate_of_absorptionCondition_of_explicitCrossTermBound + Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hraw habs + (coarseCaccioppoli_boundary_noteCrossTermBound_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hscale) + +/-- Interior raw note estimate from canonical `LambdaSq` factor inputs using +localized explicit height, radius agreement, and standard multiscale +ellipticity data. -/ +theorem coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliInteriorNoteRawEstimate Q a s t C uL2Sq + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) F := by + exact + coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hagree hG_nonneg hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior explicit-height pre-recurrence from canonical `LambdaSq` factor +inputs using localized explicit height, radius agreement, and standard +multiscale ellipticity data. -/ +theorem coarseCaccioppoli_interior_explicitHeightPreRecurrence_of_radiusEnergyBridgeCanonicalFactorInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliInteriorExplicitHeightPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_interior_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hscale + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS hC hs hinputs) + hEll hData hBsum_s hSigmaSum_t + +/-- Interior pre-recurrence from the radius-indexed energy bridge inputs after +transporting the raw estimate across the centering radius agreement. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_radiusEnergyBridgeInputs_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h G) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_interior_preRecurrence_of_noteEstimate_of_absorptionCondition_of_crossTermBound + Q a s t C uL2Sq h hC hs ht hst + (coarseCaccioppoli_interior_noteRawEstimate_of_radiusEnergyBridgeInputs_of_radiusAgreement + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs (by linarith) + hagree hinputs hctrl) + habs hcross + +/-- Interior pre-recurrence from radius-indexed energy bridge inputs and pure +coefficient localization, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_coefficientLocalization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + k h) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_interior_preRecurrence_of_radiusEnergyBridgeInputs_of_radiusAgreement + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hC hs ht hst + hagree hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq k h G hG_nonneg hloc) + habs hcross + +/-- Interior pre-recurrence from the primitive scale and ellipticity +localization inputs, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_preRecurrence_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity_of_radiusAgreement + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h G flux u g ξ + energy Acirc1 AcircS B) + (hscaleLoc : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) + (habs : CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h) + (hcross : CoarseCaccioppoliInteriorNoteCrossTermBound Q a s t C uL2Sq h) : + CoarseCaccioppoliInteriorPreRecurrence Q a s t C uL2Sq F := by + exact + coarseCaccioppoli_interior_preRecurrence_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_coefficientLocalization + Q a s t C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hC hs ht hst + hagree hG_nonneg hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq k h hC hs (by linarith) hscaleLoc helliptic) + habs hcross + +/-- Interior coarse Caccioppoli from radius-indexed single-cube estimates, +explicit-height choice, coefficient-localization controls, and the radius +agreement that identifies the centered interior quantity with the +boundary-style local quantity. -/ +theorem coarseCaccioppoli_interior_qone_of_singleCubeRawEstimate_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hsingle : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) G) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) G) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_boundary_noteEstimate_of_radiusAgreement_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (coarseCaccioppoli_boundary_noteRawEstimate_of_singleCubeRawEstimate + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hsingle hctrl) + +/-- Interior coarse Caccioppoli directly from the radius-indexed energy bridge +inputs, explicit-height choice, coefficient-localization controls, and the +radius agreement used for centering. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) G) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_singleCubeRawEstimate_of_radiusAgreement_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k hC hs ht hst hu hagree hG_nonneg hG_bounded hscale + (coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + flux u g ξ energy Acirc1 AcircS B hs (by linarith) hinputs) + hctrl + +/-- Interior coarse Caccioppoli from radius-indexed energy bridge inputs and +pure coefficient-localization data, transported across the centering radius +agreement. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k)) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_radiusAgreement_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + G hG_nonneg hloc) + +/-- Interior coarse Caccioppoli from the two primitive localization inputs, +after transporting the boundary-style local quantity across radius agreement. +-/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_scale_of_ellipticity_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hscaleLoc : + CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k)) + (helliptic : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_radiusAgreement_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs (by linarith) hscaleLoc helliptic) + +/-- Interior coarse Caccioppoli from radius-indexed energy bridge inputs and +fully composed localization data, transported across radius agreement. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_height_lower_bounds_of_multiscaleEllipticity_of_radiusAgreement_of_explicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂) + (hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ + coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_coefficientLocalization_of_radiusAgreement_of_explicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hG_bounded hscale hinputs + (CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_height_lower_bounds_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k + (coarseCaccioppoliBoundaryExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hscale hheight_const hheight_cent hEll hData hBsum_s hSigmaSum_t) + +/-- Interior coarse Caccioppoli from radius-indexed energy bridge inputs using +the localized explicit height and standard multiscale ellipticity data. -/ +theorem coarseCaccioppoli_interior_qone_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s t C uL2Sq : ℝ) {lam Lam : ℝ} + (k : ℝ → ℝ → ℕ) {F G : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hu : 0 ≤ uL2Sq) + (hagree : CoarseCaccioppoliRadiusAgreement F G) + (hG_nonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ G ρ) + (hG_bounded : CoarseCaccioppoliRadiusBoundedAbove G) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + G flux u g ξ energy Acirc1 AcircS B) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + F (1 / 3 : ℝ) ≤ + coarseCaccioppoliInteriorExplicitHeightBound Q a s t C uL2Sq := by + exact + coarseCaccioppoli_interior_qone_of_explicitHeightPreRecurrence + Q a s t C uL2Sq hC hs ht hst hu + (coarseCaccioppoli_nonneg_of_radiusAgreement hagree hG_nonneg) + (coarseCaccioppoli_radiusBoundedAbove_of_radiusAgreement hagree hG_bounded) + (coarseCaccioppoli_interior_explicitHeightPreRecurrence_of_radiusEnergyBridgeInputs_of_multiscaleEllipticity_of_radiusAgreement_of_localizedExplicitHeightOfScaleChoice + Q a s t C uL2Sq k flux u g ξ energy Acirc1 AcircS B + hC hs ht hst hu hagree hG_nonneg hscale hinputs hEll hData hBsum_s hSigmaSum_t) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/LocalPatchWeakTesting.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/LocalPatchWeakTesting.lean new file mode 100644 index 0000000000..fd9544f6c0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/LocalPatchWeakTesting.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.WeakTesting + +/-! # Local Patch Weak Testing -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Weak testing with arbitrary-center local Caccioppoli cutoffs + +This file specializes the parent-cube weak testing identity to the translated +local canonical cutoffs used in the boundary Caccioppoli proof. The only +geometric input is that the local outer closed cube is still contained in the +parent open cube, so the product cutoff is an admissible compactly supported +test function in the parent cube. +-/ + +/-- The harmonic flux paired with the arbitrary-center local cutoff gradient +is integrable on the parent cube. -/ +theorem integrableOn_vecDot_harmonicFlux_harmonicFunction_localCanonicalCutoff + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (center : Vec d) {rhoInner rhoOuter : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x)) + (cubeSet Q) MeasureTheory.volume := by + exact + integrableOn_vecDot_harmonicFlux_harmonicFunction_scalarCutoffGradientField + Q a w hEll + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) + (coarseCaccioppoliLocalCanonicalFun_hasCompactSupport Q center hinner hinnerOuter) + +/-- Local-cutoff weak testing for an arbitrary patch center whose outer local +closed cube stays inside the parent open cube. -/ +theorem + le_abs_cubeAverage_vecDot_flux_localCanonicalCutoff_of_aHarmonicFunction_of_le_localCanonicalCutoffEnergy + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam F : ℝ} + (center : Vec d) {rhoInner rhoOuter : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hsub : coarseCaccioppoliLocalClosedCube Q center rhoOuter ⊆ openCubeSet Q) + (hlower : + F ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * + scalarVariationEnergyIntegrand a w x)) : + F ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| := by + exact + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a w hEll + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) + (coarseCaccioppoliLocalCanonicalFun_hasCompactSupport Q center hinner hinnerOuter) + (coarseCaccioppoliLocalCanonicalFun_tsupport_subset_openCubeSet + hinner hinnerOuter hsub) + hlower + +/-- Local-cutoff weak testing for a boundary-touching patch. Instead of +requiring the outer local closed cube to sit inside the parent open cube, this +uses a localized scalar zero-trace hypothesis to make the cutoff product an +admissible `H¹₀` test function. -/ +theorem + le_abs_cubeAverage_vecDot_flux_localCanonicalCutoff_of_aHarmonicFunction_of_localizedZeroTrace_of_le_localCanonicalCutoffEnergy + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam F : ℝ} + (center : Vec d) {rhoInner rhoOuter : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {V : Set (Vec d)} + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V w.toH1.toFun) + (hinner : 0 < rhoInner) (hinnerOuter : rhoInner < rhoOuter) + (hsub : coarseCaccioppoliLocalClosedCube Q center rhoOuter ⊆ V) + (hlower : + F ≤ + cubeAverage Q + (fun x => + coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter x * + scalarVariationEnergyIntegrand a w x)) : + F ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • + scalarCutoffGradientField + (coarseCaccioppoliLocalCanonicalFun Q center rhoInner rhoOuter) x))| := by + exact + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a w hEll hzero + (coarseCaccioppoliLocalCanonicalFun_smooth Q center hinner hinnerOuter) + (coarseCaccioppoliLocalCanonicalFun_hasCompactSupport Q center hinner hinnerOuter) + ((coarseCaccioppoliLocalCanonicalFun_tsupport_subset_localClosedCube + hinner hinnerOuter).trans hsub) + hlower + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Localization.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Localization.lean new file mode 100644 index 0000000000..52d3e5bad1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/Localization.lean @@ -0,0 +1,698 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.SingleCubeRhs + +/-! # Localization -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# From single-cube Caccioppoli to the radius raw estimate + +This sidecar connects the fixed-cube local estimate produced by +`CoarseCaccioppoliEnergyBridge` to the abstract radius-recursion surface in +`CoarseCaccioppoli`. It keeps the geometric covering/testing step abstract: +callers provide a single-cube raw estimate for each radius pair and the two +coefficient-localization inequalities that compare the local cube coefficients +to the note's radius coefficients. +-/ + +/-- Radius-indexed version of the note-facing single-cube local estimate. -/ +def CoarseCaccioppoliBoundarySingleCubeRawEstimate {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C uL2Sq : ℝ) (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : + Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + uL2Sq (F ρ₂) + +/-- Coefficient-localization controls that turn the fixed-cube single-cube RHS +into the radius-recursion raw RHS. -/ +def CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ F ρ₂ ∧ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ ∧ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ + +/-- Pure coefficient localization for the constant single-cube term. -/ +def CoarseCaccioppoliBoundarySingleCubeConstantCoefficientLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ + +/-- Pure coefficient localization for the centered single-cube term. -/ +def CoarseCaccioppoliBoundarySingleCubeCenteredCoefficientLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (k h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ + +/-- The pure coefficient localization data needed to convert fixed-cube +single-cube coefficients into the radius-recursion coefficients. -/ +def CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) : Prop := + CoarseCaccioppoliBoundarySingleCubeConstantCoefficientLocalization Q a s C uL2Sq k h ∧ + CoarseCaccioppoliBoundarySingleCubeCenteredCoefficientLocalization Q a s t C k h + +/-- Base scale/ellipticity inequality behind the constant coefficient +localization, before multiplying by the common `C sqrt(uL2Sq)` factor. -/ +def CoarseCaccioppoliBoundarySingleCubeConstantBaseLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (k h : ℝ → ℝ → ℝ) : + Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Real.rpow (3 : ℝ) (k ρ₁ ρ₂) * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) + +/-- Base scale/ellipticity inequality behind the centered coefficient +localization, before multiplying by the common `C / (s(1-s))` factor. -/ +def CoarseCaccioppoliBoundarySingleCubeCenteredBaseLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t : ℝ) (k h : ℝ → ℝ → ℝ) : + Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Real.rpow (3 : ℝ) (k ρ₁ ρ₂ - h ρ₁ ρ₂) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ)) ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + +/-- Base coefficient-localization inequalities before the harmless common +positive factors are restored. -/ +def CoarseCaccioppoliBoundarySingleCubeBaseLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t : ℝ) (k h : ℝ → ℝ → ℝ) : + Prop := + CoarseCaccioppoliBoundarySingleCubeConstantBaseLocalization Q a s k h ∧ + CoarseCaccioppoliBoundarySingleCubeCenteredBaseLocalization Q a s t k h + +/-- Scale-only part of the single-cube-to-raw localization. -/ +def CoarseCaccioppoliBoundarySingleCubeScaleLocalization + (s t : ℝ) (k h : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Real.rpow (3 : ℝ) (k ρ₁ ρ₂) ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) ∧ + Real.rpow (3 : ℝ) (k ρ₁ ρ₂ - h ρ₁ ρ₂) ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) + +theorem CoarseCaccioppoliBoundarySingleCubeScaleLocalization.of_triadicGapScaleChoice_of_height_lower_bounds + (s t : ℝ) (k : ℝ → ℝ → ℕ) (h : ℝ → ℝ → ℝ) + (hs : 0 < s) (ht : 0 < t) + (hchoice : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ h ρ₁ ρ₂) + (hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ h ρ₁ ρ₂) : + CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) h := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let H : ℝ := h ρ₁ ρ₂ + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hpow_le : + Real.rpow (3 : ℝ) ((k ρ₁ ρ₂ : ℕ) : ℝ) ≤ + 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + simpa [Real.rpow_natCast] using + (coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + (hchoice hρ₁ hlt hρ₂) hlt) + have h81_le_const : (81 : ℝ) ≤ Real.rpow (3 : ℝ) (s * H) := by + have h4le : (4 : ℝ) ≤ s * H := by + have hh := hheight_const hρ₁ hlt hρ₂ + have hscaled : (4 : ℝ) ≤ H * s := (div_le_iff₀ hs).1 hh + nlinarith + calc + (81 : ℝ) = Real.rpow (3 : ℝ) (4 : ℝ) := by norm_num [Real.rpow_natCast] + _ ≤ Real.rpow (3 : ℝ) (s * H) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) h4le + have hst_pos : 0 < s + t := by linarith + have h81_le_cent : (81 : ℝ) ≤ Real.rpow (3 : ℝ) ((s + t) * H) := by + have h4le : (4 : ℝ) ≤ (s + t) * H := by + have hh := hheight_cent hρ₁ hlt hρ₂ + have hscaled : (4 : ℝ) ≤ H * (s + t) := (div_le_iff₀ hst_pos).1 hh + nlinarith + calc + (81 : ℝ) = Real.rpow (3 : ℝ) (4 : ℝ) := by norm_num [Real.rpow_natCast] + _ ≤ Real.rpow (3 : ℝ) ((s + t) * H) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) h4le + constructor + · calc + Real.rpow (3 : ℝ) ((fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) ρ₁ ρ₂) + ≤ 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := hpow_le + _ ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + have hmul := + mul_le_mul_of_nonneg_right h81_le_const hgap_nonneg + simpa [H, mul_comm, mul_left_comm, mul_assoc] using hmul + · have hsplit : + Real.rpow (3 : ℝ) + (((fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) ρ₁ ρ₂) - h ρ₁ ρ₂) = + Real.rpow (3 : ℝ) ((k ρ₁ ρ₂ : ℕ) : ℝ) * + Real.rpow (3 : ℝ) (-H) := by + dsimp [H] + rw [sub_eq_add_neg] + exact Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _ + have hscaled : + Real.rpow (3 : ℝ) ((k ρ₁ ρ₂ : ℕ) : ℝ) * Real.rpow (3 : ℝ) (-H) ≤ + (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) * Real.rpow (3 : ℝ) (-H) := by + exact mul_le_mul_of_nonneg_right hpow_le + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hfactor : + (81 : ℝ) * Real.rpow (3 : ℝ) (-H) ≤ + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * H) := by + calc + (81 : ℝ) * Real.rpow (3 : ℝ) (-H) + ≤ Real.rpow (3 : ℝ) ((s + t) * H) * Real.rpow (3 : ℝ) (-H) := by + exact mul_le_mul_of_nonneg_right h81_le_cent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = Real.rpow (3 : ℝ) (((s + t) * H) + (-H)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) ((s + t) * H) (-H)).symm + _ = Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * H) := by + congr 1 + unfold coarseCaccioppoliSigma + ring + have htail : + (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) * Real.rpow (3 : ℝ) (-H) ≤ + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * H) := by + have hmul := mul_le_mul_of_nonneg_left hfactor hgap_nonneg + calc + (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) * Real.rpow (3 : ℝ) (-H) + = coarseCaccioppoliGapInv ρ₁ ρ₂ * + ((81 : ℝ) * Real.rpow (3 : ℝ) (-H)) := by ring + _ ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * H) := hmul + calc + Real.rpow (3 : ℝ) + (((fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) ρ₁ ρ₂) - h ρ₁ ρ₂) + = + Real.rpow (3 : ℝ) ((k ρ₁ ρ₂ : ℕ) : ℝ) * + Real.rpow (3 : ℝ) (-H) := hsplit + _ ≤ (81 * coarseCaccioppoliGapInv ρ₁ ρ₂) * Real.rpow (3 : ℝ) (-H) := hscaled + _ ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * H) := htail + _ = + coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) := by + rfl + +/-- Ellipticity-only part of the single-cube-to-raw localization. -/ +def CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t : ℝ) : Prop := + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ∧ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) + +theorem CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization.of_monotonicity + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s t : ℝ} + (hs : 0 ≤ s) (ht : 0 ≤ t) + (hLambda : + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) + (hlambda : + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t := by + constructor + · exact hLambda + · have hLambda_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) _ + calc + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) + ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left hlambda hLambda_nonneg + _ = Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + rw [thetaRatio_rpow_half_eq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + +theorem CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization.of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s t lam Lam : ℝ} + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t := by + have hs1 : s < 1 := by + linarith + have ht_one_sub : t < 1 - s := by + linarith + have hLambda : + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (a := a) (t := s) (s := (1 : ℝ)) (lam := lam) (Lam := Lam) + hs hs1 hEll hData hBsum_s + have hlambda : + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (a := a) (t := t) (s := 1 - s) (lam := lam) (Lam := Lam) + ht ht_one_sub hEll hData hSigmaSum_t + exact + CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization.of_monotonicity + Q a hs.le ht.le hLambda hlambda + +theorem CoarseCaccioppoliBoundarySingleCubeBaseLocalization.of_scale_of_ellipticity + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t : ℝ) + (k h : ℝ → ℝ → ℝ) + (hs : 0 < s) (hs1 : s < 1) + (hscale : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + CoarseCaccioppoliBoundarySingleCubeBaseLocalization Q a s t k h := by + constructor + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hscale_const := (hscale hρ₁ hlt hρ₂).1 + have hright_nonneg : + 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) := by + exact mul_nonneg (coarseCaccioppoliGapInv_nonneg hlt) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hleft_ell_nonneg : + 0 ≤ Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q 1 a (by norm_num)) _ + exact mul_le_mul hscale_const helliptic.1 hleft_ell_nonneg hright_nonneg + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hscale_cent := (hscale hρ₁ hlt hρ₂).2 + have hright_nonneg : + 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) := by + exact mul_nonneg (coarseCaccioppoliGapInv_nonneg hlt) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hell_left_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ) := by + exact mul_nonneg + (Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _) + (Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q (1 - s) a (sub_nonneg.mpr hs1.le)) _) + exact mul_le_mul hscale_cent helliptic.2 hell_left_nonneg hright_nonneg + +theorem CoarseCaccioppoliBoundarySingleCubeBaseLocalization.of_scale_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s t lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) + (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeBaseLocalization Q a s t k h := by + exact + CoarseCaccioppoliBoundarySingleCubeBaseLocalization.of_scale_of_ellipticity + Q a s t k h hs (by linarith) + hscale + (CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization.of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs ht hst hEll hData hBsum_s hSigmaSum_t) + +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_baseLocalization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) + (hbase : CoarseCaccioppoliBoundarySingleCubeBaseLocalization Q a s t k h) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq k h := by + constructor + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hfactor_nonneg : 0 ≤ C * Real.sqrt uL2Sq := by + exact mul_nonneg hC (Real.sqrt_nonneg _) + have hscaled := + mul_le_mul_of_nonneg_left (hbase.1 hρ₁ hlt hρ₂) hfactor_nonneg + calc + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq + = + (C * Real.sqrt uL2Sq) * + (Real.rpow (3 : ℝ) (k ρ₁ ρ₂) * + Real.rpow (LambdaSq Q 1 (.finite 1) a) (1 / 2 : ℝ)) := by + unfold coarseCaccioppoliSingleCubeBoundaryConstantCoeff + ring + _ ≤ + (C * Real.sqrt uL2Sq) * + (coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (s * h ρ₁ ρ₂) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) := hscaled + _ = + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryCrossCoeffOfHeight + ring + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hden_nonneg : 0 ≤ s * (1 - s) := by + nlinarith + have hfactor_nonneg : 0 ≤ C / (s * (1 - s)) := by + exact div_nonneg hC hden_nonneg + have hscaled := + mul_le_mul_of_nonneg_left (hbase.2 hρ₁ hlt hρ₂) hfactor_nonneg + calc + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + = + (C / (s * (1 - s))) * + (Real.rpow (3 : ℝ) (k ρ₁ ρ₂ - h ρ₁ ρ₂) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q (1 - s) (.finite 1) a) (-1 / 2 : ℝ))) := by + unfold coarseCaccioppoliSingleCubeBoundaryCenteredCoeff + ring + _ ≤ + (C / (s * (1 - s))) * + (coarseCaccioppoliGapInv ρ₁ ρ₂ * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := hscaled + _ = + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ := by + unfold coarseCaccioppoliBoundaryAlphaOfHeight + ring + +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_ellipticity + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (hs1 : s < 1) + (hscale : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (helliptic : CoarseCaccioppoliBoundarySingleCubeEllipticityLocalization Q a s t) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq k h := by + exact + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_baseLocalization + Q a s t C uL2Sq k h hC hs hs1 + (CoarseCaccioppoliBoundarySingleCubeBaseLocalization.of_scale_of_ellipticity + Q a s t k h hs hs1 hscale helliptic) + +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s t lam Lam : ℝ} (C uL2Sq : ℝ) (k h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : CoarseCaccioppoliBoundarySingleCubeScaleLocalization s t k h) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq k h := by + exact + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_baseLocalization + Q a s t C uL2Sq k h hC hs (by linarith) + (CoarseCaccioppoliBoundarySingleCubeBaseLocalization.of_scale_of_isEllipticFieldOn_of_isSigmaCoarse + Q a k h hs ht hst hscale hEll hData hBsum_s hSigmaSum_t) + +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_height_lower_bounds_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s t lam Lam : ℝ} (C uL2Sq : ℝ) (k : ℝ → ℝ → ℕ) (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hchoice : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ h ρ₁ ρ₂) + (hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ h ρ₁ ρ₂) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) h := by + exact + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_scale_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) h + hC hs ht hst + (CoarseCaccioppoliBoundarySingleCubeScaleLocalization.of_triadicGapScaleChoice_of_height_lower_bounds + s t k h hs ht hchoice hheight_const hheight_cent) + hEll hData hBsum_s hSigmaSum_t + +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_localizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s t lam Lam : ℝ} (C uL2Sq : ℝ) (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hchoice : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) := by + have hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + simpa [coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s + Q a s t C (k ρ₁ ρ₂) + have hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ + coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + simpa [coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice] using + coarseCaccioppoliBoundaryLocalizedExplicitHeightAtScale_ge_four_div_s_add_t + Q a (k ρ₁ ρ₂) hs ht + exact + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_height_lower_bounds_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k + (coarseCaccioppoliBoundaryLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hchoice hheight_const hheight_cent hEll hData hBsum_s hSigmaSum_t + +/-- Integerized variant of +`of_triadicGapScaleChoice_of_localizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse`. +The resulting height is the real cast of a natural depth, which is the form +needed by the small-cube proof. -/ +theorem CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_integerizedLocalizedExplicitHeightOfScaleChoice_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s t lam Lam : ℝ} (C uL2Sq : ℝ) (k : ℝ → ℝ → ℕ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hchoice : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliTriadicGapScaleChoice (k ρ₁ ρ₂) ρ₁ ρ₂) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ R ∈ descendantsAtScale Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det) + (hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + (fun ρ₁ ρ₂ => (k ρ₁ ρ₂ : ℝ)) + (coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice Q a s t C k) := by + have hheight_const : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / s ≤ + coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice + Q a s t C k ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + simpa [coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_four_div_s + Q a s t C (k ρ₁ ρ₂) + have hheight_cent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (4 : ℝ) / (s + t) ≤ + coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice + Q a s t C k ρ₁ ρ₂ := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + simpa [coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice, + coarseCaccioppoliBoundaryLocalizedExplicitHeightDepthOfScaleChoice] using + coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightAtScale_ge_four_div_s_add_t + Q a (k ρ₁ ρ₂) hs ht + exact + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization.of_triadicGapScaleChoice_of_height_lower_bounds_of_isEllipticFieldOn_of_isSigmaCoarse + Q a C uL2Sq k + (coarseCaccioppoliBoundaryIntegerizedLocalizedExplicitHeightOfScaleChoice Q a s t C k) + hC hs ht hst hchoice hheight_const hheight_cent hEll hData hBsum_s hSigmaSum_t + +theorem CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl.of_localization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (hnonneg : ∀ ⦃ρ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ → ρ ≤ 1 → 0 ≤ F ρ) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq k h) : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq k h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_lower : (1 / 3 : ℝ) ≤ ρ₂ := le_trans hρ₁ hlt.le + exact ⟨hnonneg hρ₂_lower hρ₂, hloc.1 hρ₁ hlt hρ₂, hloc.2 hρ₁ hlt hρ₂⟩ + +theorem coarseCaccioppoliSingleCubeBoundaryNoteRhs_le_boundaryRawRhs_of_coefficientControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + {ρ₁ ρ₂ : ℝ} + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h F) + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + uL2Sq (F ρ₂) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ * F ρ₂ + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ * + Real.sqrt (F ρ₂) := by + rcases hctrl hρ₁ hlt hρ₂ with ⟨hF, hconst, hcent⟩ + rw [coarseCaccioppoliSingleCubeBoundaryNoteRhs_eq_constant_add_centered, + coarseCaccioppoliSingleCubeBoundaryConstantRhs_eq_coeff_mul, + coarseCaccioppoliSingleCubeBoundaryCenteredRhs_eq_coeff_mul] + have hconstTerm : + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq * + Real.sqrt (F ρ₂) ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ * + Real.sqrt (F ρ₂) := by + exact mul_le_mul_of_nonneg_right hconst (Real.sqrt_nonneg _) + have hcentTerm : + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) * + F ρ₂ ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ * F ρ₂ := by + exact mul_le_mul_of_nonneg_right hcent hF + calc + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq * + Real.sqrt (F ρ₂) + + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) * + F ρ₂ + ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ * + Real.sqrt (F ρ₂) + + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ * F ρ₂ := by + exact add_le_add hconstTerm hcentTerm + _ = + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ * F ρ₂ + + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ * + Real.sqrt (F ρ₂) := by + ring + +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_singleCubeRawEstimate + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (hsingle : CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq k h F) + (hctrl : + CoarseCaccioppoliBoundarySingleCubeToRawCoefficientControl Q a s t C uL2Sq + k h F) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact le_trans + (hsingle hρ₁ hlt hρ₂) + (coarseCaccioppoliSingleCubeBoundaryNoteRhs_le_boundaryRawRhs_of_coefficientControl + Q a s t C uL2Sq k h F hctrl hρ₁ hlt hρ₂) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs.lean new file mode 100644 index 0000000000..993e39d002 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Standard +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Canonical +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.LocalPatch + +/-! # Quantitative Cutoff Inputs -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Canonical.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Canonical.lean new file mode 100644 index 0000000000..099757e340 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Canonical.lean @@ -0,0 +1,667 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Standard + +/-! # Canonical -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Canonical-cutoff harmonic analytic inputs with the scalar cutoff package +bundled as `CoarseCaccioppoliScalarCutoffControls`. -/ +theorem + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_pair_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (_hρ₂ : ρ₂ ≤ 1) + (hlower : + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : ρ₂ < 1) + (henergyAvg : + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (_hC : 0 ≤ C) + (hAcirc1_nonneg : 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : 0 ≤ AcircS ρ₁ ρ₂) + (hU : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + (F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + ((w ρ₁ ρ₂).toH1 x • + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x))|) ∧ + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂ ∧ + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (⊤ : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) ∧ + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C ∧ + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ ∧ + 0 ≤ Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂ ∧ + cubeLpNorm Q (⊤ : ℝ≥0∞) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ∧ + coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ ≤ + coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ ∧ + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂ ∧ + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂ := by + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt + have hB_nonneg : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have htest : + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + ((w ρ₁ ρ₂).toH1 x • + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x))| := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + (le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a (w ρ₁ ρ₂) hEll ηρ.smooth ηρ.hasCompactSupport + (coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q hρ₁ hlt houter) + hlower) + have hξ_mem : + MeasureTheory.MemLp + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (⊤ : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + quantitativeCubeCutoff_memLp_top_gradientField Q ηρ + have hXi : + cubeLpNorm Q (⊤ : ℝ≥0∞) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using! + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le Q ηρ + exact + ⟨htest, henergyAvg, hfluxMem, huMem, hgMem, hξ_mem, + hfluxEnergy, hscalar, hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, + hU, hXi, le_rfl, hA1, hAS⟩ + +/-- Canonical-cutoff harmonic analytic inputs at the concrete Chapter-3 radius +sequence pair `(ρ_n, ρ_{n+1})`, with the strict outer-radius hypothesis +discharged by the sequence itself. -/ +theorem + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_radiusSequence_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (n : ℕ) + (hlower : + F (coarseCaccioppoliRadiusSequence n) ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) x * + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x)) + (henergyAvg : + cubeAverage Q + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) = + F (coarseCaccioppoliRadiusSequence (n + 1))) + (hfluxMem : + MeasureTheory.MemLp + (fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + MeasureTheory.MemLp + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + MeasureTheory.MemLp + (g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x)) + (hscalar : + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) + (Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + 0 ≤ Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (hAcircS_nonneg : + 0 ≤ AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (hU : + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) ≤ + U (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (hA1 : + Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ≤ + A1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (hAS : + AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ≤ + AS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) : + (F (coarseCaccioppoliRadiusSequence n) ≤ + |cubeAverage Q + (fun x => + vecDot + (matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x • + scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x))|) ∧ + cubeAverage Q + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) = + F (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + MeasureTheory.MemLp + (fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp + (g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp + (scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) + (⊤ : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => + matVecMul (a x) + ((w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1.grad x)) + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) ∧ + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) + (g (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) + (fun x => + scalarVariationEnergyIntegrand a + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) x) + (Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))) C ∧ + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + 0 ≤ Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + 0 ≤ AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + (w (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1))).toH1 x) ≤ + U (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + cubeLpNorm Q (⊤ : ℝ≥0∞) + (scalarCutoffGradientField + (QuantitativeCubeCutoff.canonicalFun Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)))) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ≤ + coarseCaccioppoliQuantitativeCutoffHessianBound Q + (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + Acirc1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ≤ + A1 (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ∧ + AcircS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) ≤ + AS (coarseCaccioppoliRadiusSequence n) + (coarseCaccioppoliRadiusSequence (n + 1)) := by + exact + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_pair_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + Q a s C F w g Acirc1 AcircS U A1 AS hEll + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + (coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n)) + (coarseCaccioppoliRadiusSequence_mem_Icc (n + 1)).2 + hlower + (coarseCaccioppoliRadiusSequence_lt_one (n + 1)) + henergyAvg hfluxMem huMem hgMem hfluxEnergy hscalar hC + hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS + +/-- Canonical-cutoff harmonic analytic inputs with the scalar cutoff package +bundled as `CoarseCaccioppoliScalarCutoffControls`. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + coarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs_at_pair_of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + Q a s C F w g Acirc1 AcircS U A1 AS hEll hρ₁ hlt hρ₂ + (hlower hρ₁ hlt hρ₂) (houter hρ₁ hlt hρ₂) + (henergyAvg hρ₁ hlt hρ₂) (hfluxMem hρ₁ hlt hρ₂) (huMem hρ₁ hlt hρ₂) + (hgMem hρ₁ hlt hρ₂) (hfluxEnergy hρ₁ hlt hρ₂) + (hscalar hρ₁ hlt hρ₂) hC (hAcirc1_nonneg hρ₁ hlt hρ₂) + (hAcircS_nonneg hρ₁ hlt hρ₂) (hU hρ₁ hlt hρ₂) + (hA1 hρ₁ hlt hρ₂) (hAS hρ₁ hlt hρ₂) + +/-- Quantitative cutoff analytic inputs combine with the separated canonical +coefficient algebra to produce the full canonical factor inputs. -/ +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_quantitativeCubeCutoff_of_coefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (energy : ℝ → ℝ -> Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (htest : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (flux ρ₁ ρ₂ x) + ((u ρ₁ ρ₂ x) • scalarCutoffGradientField (η ρ₁ ρ₂) x))|) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (u ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (u ρ₁ ρ₂)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + k h U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F flux u g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + exact + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_analyticInputs_of_coefficientBounds + Q a s C uL2Sq k h F flux u g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff + Q a s C k h F flux u g energy η Acirc1 AcircS U A1 AS + htest henergyAvg hfluxMem huMem hgMem hfluxEnergy hBgConst hBgCent hC + hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS hU hA1 hAS) + hcoeff + +/-- Canonical Chapter-3 cutoff constructor for the full radius-indexed +canonical factor-input package. + +This is the direct handoff from the actual smooth cutoff +`QuantitativeCubeCutoff.canonicalFun`: its `L∞` and derivative bounds fill the +`Xi` and `D` slots, while the remaining scalar-control and coefficient +inequalities stay explicit. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls_of_coefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → + (hρ₂ : ρ₂ ≤ 1) → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds Q a s C uL2Sq + k h U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + exact + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_analyticInputs_of_coefficientBounds + Q a s C uL2Sq k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + Q a s C k h F w g Acirc1 AcircS U A1 AS hEll hlower houter + henergyAvg hfluxMem huMem hgMem hfluxEnergy hscalar hC + hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS) + hcoeff + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/LocalPatch.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/LocalPatch.lean new file mode 100644 index 0000000000..876bfde6d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/LocalPatch.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalPatchCutoff + +/-! # Local Patch -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Local-patch cutoff input scalars + +This file contains the scalar cutoff bookkeeping for the arbitrary-center +local-patch Caccioppoli route. The cutoff lives at radius `cubeRadius Q / 3`, +while descendants are taken one generation deeper than the centered route. +-/ + +/-- Canonical `L∞` gradient bound for the arbitrary-center local-patch cutoff. -/ +def coarseCaccioppoliLocalPatchCutoffGradientBound {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) : ℝ := + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * (cubeRadius Q / 3)) + +/-- Canonical Hessian bound for the arbitrary-center local-patch cutoff. -/ +def coarseCaccioppoliLocalPatchCutoffHessianBound {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) : ℝ := + quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * (cubeRadius Q / 3)) ^ 2) + +/-- Hessian contribution after the extra local-patch descendant generation. -/ +def coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (ρ₁ ρ₂ : ℝ) : ℝ := + (cubeScaleFactor Q / (3 : ℝ) ^ (j + 1)) * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρ₂ + +theorem cubeScaleFactor_mul_coarseCaccioppoliLocalPatchCutoffHessianBound_eq_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) (ρ₁ ρ₂ : ℝ) : + cubeScaleFactor R * coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ ρ₂ = + coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + rfl + +/-- The local-patch midpoint cutoff has the same normalized gradient size as +the parent midpoint cutoff one generation earlier. -/ +theorem cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoffGradient_eq_depthGap + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + (4 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * coarseCaccioppoliGapInv ρ₁ ρ₂) := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hscaleQ_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow_pos : 0 < (3 : ℝ) ^ (j + 1) := by positivity + rw [cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor] + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + unfold coarseCaccioppoliLocalPatchCutoffGradientBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + rw [coarseCaccioppoliGapInv_eq_inv] + unfold cubeRadius + field_simp [hgap_pos.ne', hscaleQ_pos.ne', hpow_pos.ne'] + ring + +/-- LaTeX-shaped normalized gradient bound for the local-patch midpoint +cutoff. -/ +theorem cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoffGradient_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hgap_le_pow : + coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := by + have hmain : + 27 * coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := + coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + hchoice hlt + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + nlinarith + have hfront_nonneg : 0 ≤ 4 * quantitativeCubeCutoffGradientConst d := by + exact mul_nonneg (by norm_num) (quantitativeCubeCutoffGradientConst_nonneg d) + have hdepth_nonneg : 0 ≤ ((3 : ℝ) ^ j)⁻¹ := by positivity + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + (4 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * coarseCaccioppoliGapInv ρ₁ ρ₂) := + cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoffGradient_eq_depthGap + hR hlt + _ ≤ + (4 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hgap_le_pow hdepth_nonneg) + hfront_nonneg + _ = + (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + rw [inv_pow_mul_pow_eq_rpow_sub k j] + +/-- Algebraic normal form for the local-patch Hessian contribution in the +centered coefficient. The local scale `cubeRadius Q / 3` is exactly offset by +the extra descendant generation. -/ +theorem cubeBesovScaleWeight_neg_one_mul_localPatchDescendantBufferedCutoffHessianScaleBound_eq_depthGap + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + (16 * quantitativeCubeCutoffHessianConst d) * + (((3 : ℝ) ^ j)⁻¹ * + (((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ))) := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hscaleQ_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow_pos : 0 < (3 : ℝ) ^ (j + 1) := by positivity + have hpowj_pos : 0 < (3 : ℝ) ^ j := by positivity + rw [cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor] + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + unfold coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound + coarseCaccioppoliLocalPatchCutoffHessianBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + rw [coarseCaccioppoliGapInv_eq_inv] + unfold cubeRadius + field_simp [hgap_pos.ne', hscaleQ_pos.ne', hpow_pos.ne', hpowj_pos.ne'] + ring + +/-- LaTeX-shaped normalized Hessian bound for the local-patch midpoint cutoff. -/ +theorem cubeBesovScaleWeight_neg_one_mul_localPatchDescendantBufferedCutoffHessianScaleBound_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hdepth : + ((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) ≤ + (3 : ℝ) ^ k := + coarseCaccioppoliGapInv_sq_mul_depthFactor_le_pow_of_triadicGapScaleChoice + hchoice hlt hjk + have hfront_nonneg : 0 ≤ 16 * quantitativeCubeCutoffHessianConst d := by + exact mul_nonneg (by norm_num) (quantitativeCubeCutoffHessianConst_nonneg d) + have hdepth_nonneg : 0 ≤ ((3 : ℝ) ^ j)⁻¹ := by positivity + have hscaled_depth : + ((3 : ℝ) ^ j)⁻¹ * + (((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ)) ≤ + ((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k := by + exact mul_le_mul_of_nonneg_left hdepth hdepth_nonneg + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliLocalPatchDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + (16 * quantitativeCubeCutoffHessianConst d) * + (((3 : ℝ) ^ j)⁻¹ * + (((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ))) := + cubeBesovScaleWeight_neg_one_mul_localPatchDescendantBufferedCutoffHessianScaleBound_eq_depthGap + hR hlt + _ ≤ + (16 * quantitativeCubeCutoffHessianConst d) * + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) := by + exact mul_le_mul_of_nonneg_left hscaled_depth hfront_nonneg + _ = + (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + rw [inv_pow_mul_pow_eq_rpow_sub k j] + +/-- The raw local-patch Hessian bracket in the constant branch is controlled +by the full-gap triadic scale. -/ +theorem coarseCaccioppoliLocalPatchDescendantBufferedCutoffHessianScaleBound_le_radiusConst_mul_pow + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeScaleFactor R * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * (3 : ℝ) ^ k := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hscaleQ_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hpow_pos : 0 < (3 : ℝ) ^ (j + 1) := by positivity + have hpowj_pos : 0 < (3 : ℝ) ^ j := by positivity + have hdepth : + ((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) ≤ + (3 : ℝ) ^ k := + coarseCaccioppoliGapInv_sq_mul_depthFactor_le_pow_of_triadicGapScaleChoice + hchoice hlt hjk + have hfront_nonneg : + 0 ≤ 12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) := by + exact mul_nonneg (by norm_num) + (div_nonneg + (mul_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) + (cubeScaleFactor_nonneg Q)) + (sq_nonneg (cubeRadius Q))) + have heq : + cubeScaleFactor R * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * + (((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ)) := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + unfold coarseCaccioppoliLocalPatchCutoffHessianBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + rw [coarseCaccioppoliGapInv_eq_inv] + unfold cubeRadius + field_simp [hgap_pos.ne', hscaleQ_pos.ne', hpow_pos.ne', hpowj_pos.ne'] + ring + calc + cubeScaleFactor R * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * + (((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ)) := heq + _ ≤ + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * (3 : ℝ) ^ k := by + exact mul_le_mul_of_nonneg_left hdepth hfront_nonneg + +/-- Raw local-patch gradient bound for the constant branch. -/ +theorem coarseCaccioppoliLocalPatchBufferedCutoffGradientBound_le_radiusConst_mul_pow + {d : ℕ} (Q : TriadicCube d) {k : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + have hgap_le_pow : + coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := by + have hmain : + 27 * coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := + coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + hchoice hlt + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + nlinarith + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hradius_pos : 0 < cubeRadius Q := cubeRadius_pos Q + have hfront_nonneg : + 0 ≤ 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q) := by + exact mul_nonneg (by norm_num) + (div_nonneg (quantitativeCubeCutoffGradientConst_nonneg d) hradius_pos.le) + have heq : + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ := by + unfold coarseCaccioppoliLocalPatchCutoffGradientBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + rw [coarseCaccioppoliGapInv_eq_inv] + field_simp [hgap_pos.ne', hradius_pos.ne'] + ring + calc + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + coarseCaccioppoliGapInv ρ₁ ρ₂ := heq + _ ≤ + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + exact mul_le_mul_of_nonneg_left hgap_le_pow hfront_nonneg + +/-- Descendant form of the local-patch buffered cutoff bracket used by the +constant branch. -/ +theorem cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoff_terms_le_radiusConst_mul_pow + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) ≤ + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + have hH : + cubeScaleFactor R * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * (3 : ℝ) ^ k := + coarseCaccioppoliLocalPatchDescendantBufferedCutoffHessianScaleBound_le_radiusConst_mul_pow + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk + have hG : + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := + coarseCaccioppoliLocalPatchBufferedCutoffGradientBound_le_radiusConst_mul_pow + Q hchoice hlt + calc + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + = + cubeScaleFactor R * + coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) := by + rw [cubeBesovScaleWeight_neg_one_mul_add_weighted_eq_scale_mul_add] + _ ≤ + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ))) * (3 : ℝ) ^ k + + (6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + exact add_le_add hH hG + _ = + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + ring + +/-- Constant-branch exact coefficient comparison for the arbitrary-center +local-patch midpoint cutoff. The cutoff is supported on the `m-1` patch, so +descendants are taken one generation deeper than the height depth. -/ +theorem + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_localPatch_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant_succ + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) + {Ceff : ℝ} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q (j + 1)) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ Ceff) : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + let K : ℝ := + 12 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 6 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q) + let P : ℝ := (3 : ℝ) ^ k + let L : ℝ := Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) + let A0 : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ + let S : ℝ := + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + have hcutoff : S ≤ K * P := by + simpa [S, K, P] using + (cubeBesovScaleWeight_neg_one_mul_localPatch_buffered_cutoff_terms_le_radiusConst_mul_pow + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hdisc_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hA0_nonneg : 0 ≤ A0 := by + dsimp [A0] + exact mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (inv_nonneg.mpr hdisc_pos.le) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R 1 a (by norm_num)) _ + have hAL_nonneg : 0 ≤ A0 * L := mul_nonneg hA0_nonneg hL_nonneg + have hP_nonneg : 0 ≤ P := by + dsimp [P] + positivity + have hPL_nonneg : 0 ≤ P * L := mul_nonneg hP_nonneg hL_nonneg + have hlarge' : A0 * K ≤ Ceff := by + simpa [A0, K, mul_assoc] using hlarge + have hleft_eq : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) = + (A0 * L) * S := by + dsimp [A0, L, S] + unfold coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound + coarseCaccioppoliLambdaFactor + simp + ring_nf + have hright_eq : + Ceff * (P * L) = + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + dsimp [P, L] + unfold coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff + simp [Real.rpow_natCast] + ring + calc + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliLocalPatchCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliLocalPatchCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + = (A0 * L) * S := hleft_eq + _ ≤ (A0 * L) * (K * P) := + mul_le_mul_of_nonneg_left hcutoff hAL_nonneg + _ = (A0 * K) * (P * L) := by ring + _ ≤ Ceff * (P * L) := + mul_le_mul_of_nonneg_right hlarge' hPL_nonneg + _ = coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := + hright_eq + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup.lean new file mode 100644 index 0000000000..efe47a3002 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.Canonical + +/-! # Setup -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/Canonical.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/Canonical.lean new file mode 100644 index 0000000000..dcf982aea7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/Canonical.lean @@ -0,0 +1,377 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ConstantCoeff + +/-! # Canonical -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Quantitative cutoff inputs: canonical cutoff packages +-/ + +noncomputable section + +open scoped ENNReal + +theorem coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := by + exact le_trans (norm_nonneg _) (η.hessian_bound (cubeCenter Q)) + +theorem coarseCaccioppoliQuantitativeCutoffHessianBound_pos {d : ℕ} [NeZero d] + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hlt : ρ₁ < ρ₂) : + 0 < coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := by + unfold coarseCaccioppoliQuantitativeCutoffHessianBound + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + have hmax : + 0 < + max 1 (max smoothTransitionProfile.derivBound + smoothTransitionProfile.secondDerivBound) := by + exact lt_of_lt_of_le (by norm_num : (0 : ℝ) < 1) (le_max_left _ _) + have hconst : 0 < quantitativeCubeCutoffHessianConst d := by + unfold quantitativeCubeCutoffHessianConst + exact mul_pos (mul_pos (by norm_num : (0 : ℝ) < 8) (sq_pos_of_pos hd)) + (sq_pos_of_pos hmax) + have hgap : + 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hlt) (cubeRadius_pos Q) + exact div_pos hconst (sq_pos_of_pos hgap) + +/-- Canonical quantitative cube cutoff at an admissible radius pair +`(ρ₁, ρ₂)` with `ρ₁ ≥ 1/3` and `ρ₁ < ρ₂`. -/ +noncomputable def coarseCaccioppoliCanonicalQuantitativeCutoff {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) : + QuantitativeCubeCutoff Q ρ₁ ρ₂ := + QuantitativeCubeCutoff.canonical Q ρ₁ ρ₂ + (lt_of_lt_of_le (by norm_num : (0 : ℝ) < 1 / 3) hρ₁) hlt + +theorem + coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + tsupport (coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt) ⊆ + openCubeSet Q := by + have hρ₂_nonneg : 0 ≤ ρ₂ := by + exact le_trans (by norm_num : 0 ≤ (1 / 3 : ℝ)) <| + le_trans hρ₁ (le_of_lt hlt) + exact + QuantitativeCubeCutoff.tsupport_subset_openCubeSet_of_lt_one + (η := coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt) + hρ₂_nonneg hρ₂_lt_one + +theorem + coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_on_radiusSequence + {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + tsupport + (coarseCaccioppoliCanonicalQuantitativeCutoff Q + (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + (coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n))) ⊆ + openCubeSet Q := by + exact + coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q (coarseCaccioppoliRadiusSequence_mem_Icc n).1 + (coarseCaccioppoliRadiusSequence_strictMono (Nat.lt_succ_self n)) + (coarseCaccioppoliRadiusSequence_lt_one (n + 1)) + +/-- A quantitative cube cutoff upgrades the external testing/flux/Poincare +hypotheses to the split canonical local analytic inputs used by the final +coarse Caccioppoli wrappers. The cutoff contributes the vector field +`ξ = ∇η`, its `L^∞` control, and the component derivative bound. -/ +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (energy : ℝ → ℝ -> Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (htest : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (flux ρ₁ ρ₂ x) + ((u ρ₁ ρ₂ x) • scalarCutoffGradientField (η ρ₁ ρ₂) x))|) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (u ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (u ρ₁ ρ₂)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * Real.sqrt (cubeAverage Q (energy ρ₁ ρ₂))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F flux u g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := η ρ₁ ρ₂ + have hB_nonneg : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hscalar : + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) + (scalarCutoffGradientField ηρ) (energy ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + exact + CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff + (Q := Q) (s := s) (u := u ρ₁ ρ₂) (g := g ρ₁ ρ₂) (energy := energy ρ₁ ρ₂) + (η := ηρ) (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (C := C) + hB_nonneg + (by + simpa [ηρ, coarseCaccioppoliQuantitativeCutoffHessianBound] using + hBgConst hρ₁ hlt hρ₂) + (by + simpa [ηρ, coarseCaccioppoliQuantitativeCutoffHessianBound] using + hBgCent hρ₁ hlt hρ₂) + hC + (hproj hρ₁ hlt hρ₂) (hgCirc1 hρ₁ hlt hρ₂) (hgCircS hρ₁ hlt hρ₂) + exact + ⟨htest hρ₁ hlt hρ₂, henergyAvg hρ₁ hlt hρ₂, hfluxMem hρ₁ hlt hρ₂, + huMem hρ₁ hlt hρ₂, hgMem hρ₁ hlt hρ₂, + quantitativeCubeCutoff_memLp_top_gradientField Q ηρ, + hfluxEnergy hρ₁ hlt hρ₂, hscalar, hB_nonneg, + hAcirc1_nonneg hρ₁ hlt hρ₂, hAcircS_nonneg hρ₁ hlt hρ₂, + hU hρ₁ hlt hρ₂, + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le Q ηρ, + le_rfl, hA1 hρ₁ hlt hρ₂, hAS hρ₁ hlt hρ₂⟩ + +/-- Vector-Poincare version of +`CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff`. +The cutoff again supplies `ξ = ∇η`; the analytic package keeps the vector +cutoff controls rather than scalarizing to one gradient component. -/ +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs.of_quantitativeCubeCutoff + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u : ℝ → ℝ → Vec d → ℝ) + (G : ℝ → ℝ → Vec d → Vec d) + (energy : ℝ → ℝ -> Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (htest : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (flux ρ₁ ρ₂ x) + ((u ρ₁ ρ₂ x) • scalarCutoffGradientField (η ρ₁ ρ₂) x))|) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hGMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G ρ₁ ρ₂ x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂)) + (hvector : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliVectorCutoffControls Q s (u ρ₁ ρ₂) (G ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) (energy ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs Q a s C + k h F flux u G + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + energy Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := η ρ₁ ρ₂ + have hB_nonneg : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + exact + ⟨htest hρ₁ hlt hρ₂, henergyAvg hρ₁ hlt hρ₂, hfluxMem hρ₁ hlt hρ₂, + huMem hρ₁ hlt hρ₂, hGMem hρ₁ hlt hρ₂, + quantitativeCubeCutoff_memLp_top_gradientField Q ηρ, + hfluxEnergy hρ₁ hlt hρ₂, hvector hρ₁ hlt hρ₂, hB_nonneg, + hAcirc1_nonneg hρ₁ hlt hρ₂, hAcircS_nonneg hρ₁ hlt hρ₂, + hU hρ₁ hlt hρ₂, + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le Q ηρ, + le_rfl, hA1 hρ₁ hlt hρ₂, hAS hρ₁ hlt hρ₂⟩ + +/-- Harmonic-family builder for the vector canonical analytic inputs. The +weak-testing bridge supplies the testing inequality from the weighted energy +lower bound, while the caller supplies the vector cutoff controls. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (G : ℝ → ℝ → Vec d → Vec d) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hη_tsupport : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + tsupport (η ρ₁ ρ₂) ⊆ openCubeSet Q) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hGMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G ρ₁ ρ₂ x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hvector : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliVectorCutoffControls Q s (fun x => (w ρ₁ ρ₂).toH1 x) + (G ρ₁ ρ₂) (scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + G + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + refine + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs.of_quantitativeCubeCutoff + Q a s C k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + G + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + η Acirc1 AcircS U A1 AS ?_ henergyAvg hfluxMem huMem hGMem + hfluxEnergy hvector hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a (w ρ₁ ρ₂) hEll (η ρ₁ ρ₂).smooth (η ρ₁ ρ₂).hasCompactSupport + (hη_tsupport hρ₁ hlt hρ₂) (hlower hρ₁ hlt hρ₂) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ConstantCoeff.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ConstantCoeff.lean new file mode 100644 index 0000000000..f30e9ffe34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ConstantCoeff.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup.ScaleBounds + +/-! # Constant Coeff -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Quantitative cutoff inputs: constant coefficient comparisons +-/ + +noncomputable section + +open scoped ENNReal + +/-- Constant-branch exact coefficient comparison on a descendant cube, after +the parent cutoff constants have been converted to the note's triadic scale. + +The only scalar input is the expected fixed-constant calibration: the local +constant `Ceff` dominates the dimension/geometric-discount factor times the +parent-radius cutoff front. -/ +theorem + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_parent_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) + {Ceff : ℝ} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q) ≤ Ceff) : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + let K : ℝ := + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q + let P : ℝ := (3 : ℝ) ^ k + let L : ℝ := Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) + let A0 : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ + let S : ℝ := + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + have hcutoff : S ≤ K * P := by + simpa [S, K, P] using + (cubeBesovScaleWeight_neg_one_mul_parent_cutoff_terms_le_radiusConst_mul_pow + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hdisc_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hA0_nonneg : 0 ≤ A0 := by + dsimp [A0] + exact mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (inv_nonneg.mpr hdisc_pos.le) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R 1 a (by norm_num)) _ + have hAL_nonneg : 0 ≤ A0 * L := mul_nonneg hA0_nonneg hL_nonneg + have hP_nonneg : 0 ≤ P := by + dsimp [P] + positivity + have hPL_nonneg : 0 ≤ P * L := mul_nonneg hP_nonneg hL_nonneg + have hlarge' : A0 * K ≤ Ceff := by + simpa [A0, K, mul_assoc] using hlarge + have hleft_eq : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) = + (A0 * L) * S := by + dsimp [A0, L, S] + unfold coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound + coarseCaccioppoliLambdaFactor + simp + ring_nf + have hright_eq : + Ceff * (P * L) = + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + dsimp [P, L] + unfold coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff + simp [Real.rpow_natCast] + ring + calc + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + = (A0 * L) * S := hleft_eq + _ ≤ (A0 * L) * (K * P) := + mul_le_mul_of_nonneg_left hcutoff hAL_nonneg + _ = (A0 * K) * (P * L) := by ring + _ ≤ Ceff * (P * L) := + mul_le_mul_of_nonneg_right hlarge' hPL_nonneg + _ = coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := + hright_eq + +/-- Buffered constant-branch exact coefficient comparison on a descendant cube. +The midpoint cutoff uses the full-gap triadic scale but requires the inflated +fixed cutoff front `4 * Hessian + 2 * Gradient`. -/ +theorem + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_mul_parent_buffered_cutoff_terms_le_singleCubeBoundaryConstantBaseCoeff_of_descendant + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) + {Ceff : ℝ} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) + (hlarge : + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ * + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) ≤ Ceff) : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + let K : ℝ := + 4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q) + let P : ℝ := (3 : ℝ) ^ k + let L : ℝ := Real.rpow (LambdaSq R 1 (.finite 1) a) (1 / 2 : ℝ) + let A0 : ℝ := + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + 1) * + (geometricDiscount (1 : ℝ) 1)⁻¹ + let S : ℝ := + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + have hcutoff : S ≤ K * P := by + simpa [S, K, P] using + (cubeBesovScaleWeight_neg_one_mul_parent_buffered_cutoff_terms_le_radiusConst_mul_pow + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk) + have hdisc_pos : 0 < geometricDiscount (1 : ℝ) 1 := + geometricDiscount_pos (by norm_num : 0 < (1 : ℝ) * 1) + have hA0_nonneg : 0 ≤ A0 := by + dsimp [A0] + exact mul_nonneg + (mul_nonneg (by exact_mod_cast Nat.zero_le d : 0 ≤ (d : ℝ)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (inv_nonneg.mpr hdisc_pos.le) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R 1 a (by norm_num)) _ + have hAL_nonneg : 0 ≤ A0 * L := mul_nonneg hA0_nonneg hL_nonneg + have hP_nonneg : 0 ≤ P := by + dsimp [P] + positivity + have hPL_nonneg : 0 ≤ P * L := mul_nonneg hP_nonneg hL_nonneg + have hlarge' : A0 * K ≤ Ceff := by + simpa [A0, K, mul_assoc] using hlarge + have hleft_eq : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) = + (A0 * L) * S := by + dsimp [A0, L, S] + unfold coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound + coarseCaccioppoliLambdaFactor + simp + ring_nf + have hright_eq : + Ceff * (P * L) = + coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := by + dsimp [P, L] + unfold coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff + simp [Real.rpow_natCast] + ring + calc + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound R + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor R a (1 : ℝ)) * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + = (A0 * L) * S := hleft_eq + _ ≤ (A0 * L) * (K * P) := + mul_le_mul_of_nonneg_left hcutoff hAL_nonneg + _ = (A0 * K) * (P * L) := by ring + _ ≤ Ceff * (P * L) := + mul_le_mul_of_nonneg_right hlarge' hPL_nonneg + _ = coarseCaccioppoliSingleCubeBoundaryConstantBaseCoeff R a Ceff (k : ℝ) := + hright_eq + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ScaleBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ScaleBounds.lean new file mode 100644 index 0000000000..e9ded954b3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Setup/ScaleBounds.lean @@ -0,0 +1,736 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.WeakTesting +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection + +/-! # Scale Bounds -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Quantitative cutoff inputs: scale bounds +-/ + +noncomputable section + +open scoped ENNReal + +/-- Canonical `L^∞` bound supplied by the quantitative cube cutoff gradient +estimate. -/ +def coarseCaccioppoliQuantitativeCutoffGradientBound {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) : ℝ := + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) + +/-- Canonical derivative bound supplied by the quantitative cube cutoff +Hessian estimate. -/ +def coarseCaccioppoliQuantitativeCutoffHessianBound {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) : ℝ := + quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + +/-- The midpoint cutoff has twice the gradient scale of the full-gap cutoff. -/ +theorem coarseCaccioppoliQuantitativeCutoffGradientBound_buffered_eq_two_mul + {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + 2 * coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hradius_pos : 0 < cubeRadius Q := cubeRadius_pos Q + unfold coarseCaccioppoliQuantitativeCutoffGradientBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + field_simp [hgap_pos.ne', hradius_pos.ne'] + +/-- The midpoint cutoff has four times the Hessian scale of the full-gap +cutoff. -/ +theorem coarseCaccioppoliQuantitativeCutoffHessianBound_buffered_eq_four_mul + {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + 4 * coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hradius_pos : 0 < cubeRadius Q := cubeRadius_pos Q + unfold coarseCaccioppoliQuantitativeCutoffHessianBound + rw [coarseCaccioppoliBufferedCutoffRadius_inner_gap] + field_simp [hgap_pos.ne', hradius_pos.ne'] + ring + +theorem quantitativeCubeCutoffGradientConst_nonneg (d : ℕ) : + 0 ≤ quantitativeCubeCutoffGradientConst d := by + unfold quantitativeCubeCutoffGradientConst + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + smoothTransitionProfile.derivBound_nonneg + +theorem quantitativeCubeCutoffHessianConst_nonneg (d : ℕ) : + 0 ≤ quantitativeCubeCutoffHessianConst d := by + unfold quantitativeCubeCutoffHessianConst + exact mul_nonneg + (mul_nonneg (by norm_num) (sq_nonneg (d : ℝ))) + (sq_nonneg _) + +/-- The small-cube Hessian contribution after multiplying the parent-cube +cutoff Hessian bound by a depth-`j` descendant scale. This is the formal +`3^{-j}` gain used in the LaTeX Caccioppoli proof. -/ +def coarseCaccioppoliDescendantCutoffHessianScaleBound {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (ρ₁ ρ₂ : ℝ) : ℝ := + (cubeScaleFactor Q / (3 : ℝ) ^ j) * + coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + +theorem cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor {d : ℕ} + (Q : TriadicCube d) : + cubeBesovScaleWeight (-1) Q = cubeScaleFactor Q := by + simp [cubeBesovScaleWeight] + +theorem cubeBesovScaleWeight_neg_one_mul_cubeBesovScaleWeight_one_eq_one {d : ℕ} + (Q : TriadicCube d) : + cubeBesovScaleWeight (-1) Q * cubeBesovScaleWeight 1 Q = 1 := by + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeBesovScaleWeight, Real.rpow_neg hpos.le, mul_inv_cancel₀ hpos.ne'] + +/-- The constant-branch cutoff bracket, after multiplying by the exact +negative Besov scale weight, splits into the local Hessian-scale term plus the +gradient term. -/ +theorem cubeBesovScaleWeight_neg_one_mul_add_weighted_eq_scale_mul_add + {d : ℕ} (Q : TriadicCube d) (B Xi : ℝ) : + cubeBesovScaleWeight (-1) Q * + (B + cubeBesovScaleWeight 1 Q * Xi) = + cubeScaleFactor Q * B + Xi := by + have hmul : + cubeBesovScaleWeight (-1) Q * cubeBesovScaleWeight 1 Q = 1 := + cubeBesovScaleWeight_neg_one_mul_cubeBesovScaleWeight_one_eq_one Q + have hscale : + cubeBesovScaleWeight (-1) Q = cubeScaleFactor Q := + cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor Q + calc + cubeBesovScaleWeight (-1) Q * + (B + cubeBesovScaleWeight 1 Q * Xi) + = + cubeBesovScaleWeight (-1) Q * B + + (cubeBesovScaleWeight (-1) Q * cubeBesovScaleWeight 1 Q) * Xi := by + ring + _ = cubeScaleFactor Q * B + Xi := by + rw [hmul, hscale] + ring + +/-- On a depth-`j` descendant, `cubeScaleFactor R` converts the parent cutoff +Hessian bound into the descendant small-cube scale bound. -/ +theorem cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (ρ₁ ρ₂ : ℝ) : + cubeScaleFactor R * coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ = + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + rfl + +/-- Inequality form of +`cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant`, +for feeding cutoff-product coefficient estimates. -/ +theorem cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_le_of_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (ρ₁ ρ₂ : ℝ) {D : ℝ} + (hD : coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ D) : + cubeScaleFactor R * coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ ≤ D := by + simpa [cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant + hR ρ₁ ρ₂] using hD + +/-- On a depth-`j` descendant, a local length divided by the parent radius is +exactly the expected `3^{-j}` factor, up to the radius normalization `1/2`. -/ +theorem cubeScaleFactor_div_parent_cubeRadius_eq_two_mul_depthFactor + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + cubeScaleFactor R / cubeRadius Q = 2 * ((3 : ℝ) ^ j)⁻¹ := by + have hQ_ne : cubeScaleFactor Q ≠ 0 := by + have hQ_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact ne_of_gt hQ_pos + have hpow_ne : (3 : ℝ) ^ j ≠ 0 := by positivity + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + unfold cubeRadius + field_simp [hQ_ne, hpow_ne] + +/-- Parent cutoff constants rewritten in the depth-`j` descendant scale used by +the constant branch. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_cutoff_terms_eq_descendant + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (ρ₁ ρ₂ : ℝ) : + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) = + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + calc + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + = + cubeScaleFactor R * coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + rw [cubeBesovScaleWeight_neg_one_mul_add_weighted_eq_scale_mul_add] + _ = + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + rw [cubeScaleFactor_mul_coarseCaccioppoliQuantitativeCutoffHessianBound_eq_descendant + hR ρ₁ ρ₂] + +/-- The parent cutoff gradient bound is controlled by the triadic gap scale, +with the fixed parent radius carried as a front constant. -/ +theorem coarseCaccioppoliQuantitativeCutoffGradientBound_le_radiusConst_mul_pow + {d : ℕ} (Q : TriadicCube d) {k : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * (3 : ℝ) ^ k := by + have hgap_le_pow : + coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := by + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + have hmain : + 27 * coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := + coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + hchoice hlt + nlinarith + have hfront_nonneg : + 0 ≤ quantitativeCubeCutoffGradientConst d / cubeRadius Q := + div_nonneg (quantitativeCubeCutoffGradientConst_nonneg d) (cubeRadius_nonneg Q) + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hradius_ne : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + calc + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + = + (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + coarseCaccioppoliGapInv ρ₁ ρ₂ := by + unfold coarseCaccioppoliQuantitativeCutoffGradientBound + rw [coarseCaccioppoliGapInv_eq_inv] + field_simp [hgap_pos.ne', hradius_ne] + _ ≤ (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * (3 : ℝ) ^ k := by + exact mul_le_mul_of_nonneg_left hgap_le_pow hfront_nonneg + +/-- On a depth-`j` descendant, the parent cutoff-gradient bound gains the +small-cube length scale `3^{-j}`. This is the centered-branch analogue of the +constant-branch cutoff-scale normalization. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_eq_depthGap + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ = + (2 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * coarseCaccioppoliGapInv ρ₁ ρ₂) := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hrad_ne : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + = + cubeScaleFactor R * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) := by + rw [cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor] + rfl + _ = + quantitativeCubeCutoffGradientConst d * + (cubeScaleFactor R / cubeRadius Q) * + coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + field_simp [hgap_pos.ne', hrad_ne] + _ = + (2 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * coarseCaccioppoliGapInv ρ₁ ρ₂) := by + rw [cubeScaleFactor_div_parent_cubeRadius_eq_two_mul_depthFactor hR] + ring + +/-- After the triadic gap scale is chosen, the descendant-normalized parent +cutoff-gradient term is bounded by `3^{-j} 3^k` times a fixed cutoff constant. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_depth_pow + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (2 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) := by + have hgap_le_pow : + coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := by + have hmain : + 27 * coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := + coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + hchoice hlt + have hgap_nonneg : 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := + coarseCaccioppoliGapInv_nonneg hlt + nlinarith + have hfront_nonneg : 0 ≤ 2 * quantitativeCubeCutoffGradientConst d := by + exact mul_nonneg (by norm_num) (quantitativeCubeCutoffGradientConst_nonneg d) + have hdepth_nonneg : 0 ≤ ((3 : ℝ) ^ j)⁻¹ := by positivity + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + = + (2 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * coarseCaccioppoliGapInv ρ₁ ρ₂) := + cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_eq_depthGap + hR hlt + _ ≤ + (2 * quantitativeCubeCutoffGradientConst d) * + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hgap_le_pow hdepth_nonneg) + hfront_nonneg + +/-- Convert the descendant-depth/gap-scale product to the usual real-power +notation `3^(k-j)`. -/ +theorem inv_pow_mul_pow_eq_rpow_sub (k j : ℕ) : + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) = + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hpowj : (3 : ℝ) ^ j = Real.rpow (3 : ℝ) (j : ℝ) := by + exact (Real.rpow_natCast (3 : ℝ) j).symm + have hpowk : (3 : ℝ) ^ k = Real.rpow (3 : ℝ) (k : ℝ) := by + exact (Real.rpow_natCast (3 : ℝ) k).symm + have hneg : + Real.rpow (3 : ℝ) (-(j : ℝ)) = + (Real.rpow (3 : ℝ) (j : ℝ))⁻¹ := by + simp + calc + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) + = + Real.rpow (3 : ℝ) (-(j : ℝ)) * + Real.rpow (3 : ℝ) (k : ℝ) := by + rw [hpowj, hpowk, hneg] + _ = + Real.rpow (3 : ℝ) (-(j : ℝ) + (k : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) (-(j : ℝ)) (k : ℝ)).symm + _ = + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + congr 1 + ring + +/-- LaTeX-shaped version of +`cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_depth_pow`. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + simpa [inv_pow_mul_pow_eq_rpow_sub k j] using + (cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_depth_pow + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt) + +/-- Buffered LaTeX-shaped gradient cutoff bound. The midpoint cutoff doubles +the full-gap gradient bound, while the triadic scale is still chosen from the +full outer gap. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_buffered_cutoffGradient_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hG : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := + cubeBesovScaleWeight_neg_one_mul_parent_cutoffGradient_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + 2 * (cubeBesovScaleWeight (-1) R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) := by + rw [coarseCaccioppoliQuantitativeCutoffGradientBound_buffered_eq_two_mul Q hlt] + ring + _ ≤ 2 * ((2 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) := by + exact mul_le_mul_of_nonneg_left hG (by norm_num : (0 : ℝ) ≤ 2) + _ = + (4 * quantitativeCubeCutoffGradientConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + ring + +/-- The Hessian gap factor gains one descendant scale. This is the +`3^{-j} gap^{-2} ≤ 3^k` line used after choosing the triadic gap scale and +taking descendants at depth `j ≥ k`. -/ +theorem coarseCaccioppoliGapInv_sq_mul_depthFactor_le_pow_of_triadicGapScaleChoice + {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + ((3 : ℝ) ^ j)⁻¹ * (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) ≤ + (3 : ℝ) ^ k := by + let A : ℝ := (3 : ℝ) ^ k + let B : ℝ := (3 : ℝ) ^ j + let G : ℝ := coarseCaccioppoliGapInv ρ₁ ρ₂ + have hG_nonneg : 0 ≤ G := by + exact coarseCaccioppoliGapInv_nonneg hlt + have hG_le_A : G ≤ A := by + have hmain : 27 * G ≤ A := by + simpa [A, G] using + (coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + hchoice hlt) + nlinarith + have hA_pos : 0 < A := by positivity + have hB_pos : 0 < B := by positivity + have hA_le_B : A ≤ B := by + exact pow_le_pow_right₀ (by norm_num : (1 : ℝ) ≤ 3) hjk + have hinv_le : B⁻¹ ≤ A⁻¹ := by + exact (inv_le_inv₀ hB_pos hA_pos).2 hA_le_B + have hG_sq : G ^ (2 : ℕ) ≤ A ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hG_nonneg hG_le_A 2 + have hmul : B⁻¹ * G ^ (2 : ℕ) ≤ A⁻¹ * A ^ (2 : ℕ) := by + exact mul_le_mul hinv_le hG_sq (pow_nonneg hG_nonneg 2) + (inv_nonneg.mpr hA_pos.le) + have hright : A⁻¹ * A ^ (2 : ℕ) = A := by + field_simp [hA_pos.ne'] + simpa [A, B, G, hright] using hmul + +/-- Algebraic normal form for the descendant Hessian cutoff contribution: +parent Hessian bound times the small-cube volume scale is a fixed parent +front constant times `3^{-j} gap^{-2}`. -/ +theorem coarseCaccioppoliDescendantCutoffHessianScaleBound_eq_radiusConst_mul_depthGap + {d : ℕ} (Q : TriadicCube d) {j : ℕ} {ρ₁ ρ₂ : ℝ} + (hlt : ρ₁ < ρ₂) : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ = + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * + (((3 : ℝ) ^ j)⁻¹ * + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ)) := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hradius_ne : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + have hpow_ne : (3 : ℝ) ^ j ≠ 0 := by positivity + unfold coarseCaccioppoliDescendantCutoffHessianScaleBound + coarseCaccioppoliQuantitativeCutoffHessianBound + rw [coarseCaccioppoliGapInv_eq_inv] + field_simp [hgap_pos.ne', hradius_ne, hpow_ne] + +/-- The descendant Hessian cutoff contribution is controlled by the note's +triadic gap scale, with only a fixed parent-radius front constant remaining. -/ +theorem coarseCaccioppoliDescendantCutoffHessianScaleBound_le_radiusConst_mul_pow + {d : ℕ} (Q : TriadicCube d) {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k := by + have hdepth : + ((3 : ℝ) ^ j)⁻¹ * + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ) ≤ (3 : ℝ) ^ k := + coarseCaccioppoliGapInv_sq_mul_depthFactor_le_pow_of_triadicGapScaleChoice + hchoice hlt hjk + have hfront_nonneg : + 0 ≤ quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ) := by + exact div_nonneg + (mul_nonneg (quantitativeCubeCutoffHessianConst_nonneg d) + (cubeScaleFactor_nonneg Q)) + (sq_nonneg (cubeRadius Q)) + calc + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + = + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * + (((3 : ℝ) ^ j)⁻¹ * + (coarseCaccioppoliGapInv ρ₁ ρ₂) ^ (2 : ℕ)) := + coarseCaccioppoliDescendantCutoffHessianScaleBound_eq_radiusConst_mul_depthGap + Q hlt + _ ≤ (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k := by + exact mul_le_mul_of_nonneg_left hdepth hfront_nonneg + +/-- The centered Hessian cutoff contribution has one extra small-cube scale, +so after the triadic gap choice it also has the `3^(k-j)` normalization. -/ +theorem cubeBesovScaleWeight_neg_one_mul_descendantCutoffHessianScaleBound_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hH : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k := + coarseCaccioppoliDescendantCutoffHessianScaleBound_le_radiusConst_mul_pow + Q hchoice hlt hjk + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-1) R := + cubeBesovScaleWeight_nonneg (-1) R + have hscaled := + mul_le_mul_of_nonneg_left hH hscale_nonneg + have hrad_ne : cubeRadius Q ≠ 0 := (cubeRadius_pos Q).ne' + have hscale_eq : + cubeBesovScaleWeight (-1) R * + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k) = + (4 * quantitativeCubeCutoffHessianConst d) * + (((3 : ℝ) ^ j)⁻¹ * (3 : ℝ) ^ k) := by + have hscale : + cubeBesovScaleWeight (-1) R = + (2 * ((3 : ℝ) ^ j)⁻¹) * cubeRadius Q := by + rw [cubeBesovScaleWeight_neg_one_eq_cubeScaleFactor] + calc + cubeScaleFactor R = + (cubeScaleFactor R / cubeRadius Q) * cubeRadius Q := by + field_simp [hrad_ne] + _ = (2 * ((3 : ℝ) ^ j)⁻¹) * cubeRadius Q := by + rw [cubeScaleFactor_div_parent_cubeRadius_eq_two_mul_depthFactor hR] + have hQscale : cubeScaleFactor Q = 2 * cubeRadius Q := by + unfold cubeRadius + ring + rw [hscale, hQscale] + field_simp [hrad_ne] + ring + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + ≤ + cubeBesovScaleWeight (-1) R * + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k) := hscaled + _ = + (4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + rw [hscale_eq, inv_pow_mul_pow_eq_rpow_sub] + +/-- Buffered LaTeX-shaped Hessian cutoff bound. The midpoint cutoff quadruples +the full-gap Hessian scale, while the triadic scale is still chosen from the +full outer gap. -/ +theorem cubeBesovScaleWeight_neg_one_mul_descendantBufferedCutoffHessianScaleBound_le_rpow_sub + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + have hH : + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := + cubeBesovScaleWeight_neg_one_mul_descendantCutoffHessianScaleBound_le_rpow_sub + (Q := Q) (R := R) (k := k) (j := j) hR hchoice hlt hjk + have hHbuf : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + 4 * coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ := by + unfold coarseCaccioppoliDescendantCutoffHessianScaleBound + rw [coarseCaccioppoliQuantitativeCutoffHessianBound_buffered_eq_four_mul Q hlt] + ring + calc + cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + 4 * (cubeBesovScaleWeight (-1) R * + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂) := by + rw [hHbuf] + ring + _ ≤ 4 * ((4 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ))) := by + exact mul_le_mul_of_nonneg_left hH (by norm_num : (0 : ℝ) ≤ 4) + _ = + (16 * quantitativeCubeCutoffHessianConst d) * + Real.rpow (3 : ℝ) ((k : ℝ) - (j : ℝ)) := by + ring + +/-- Combined small-cube cutoff contribution bounded by the note's triadic +scale. This packages the Hessian `3^{-j} gap^{-2}` gain together with the +gradient `gap^{-1}` contribution. -/ +theorem coarseCaccioppoliDescendantCutoffTerms_le_radiusConst_mul_pow + {d : ℕ} (Q : TriadicCube d) {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k := by + have hH : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k := + coarseCaccioppoliDescendantCutoffHessianScaleBound_le_radiusConst_mul_pow + Q hchoice hlt hjk + have hG : + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * (3 : ℝ) ^ k := + coarseCaccioppoliQuantitativeCutoffGradientBound_le_radiusConst_mul_pow + Q hchoice hlt + calc + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ + ≤ + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k + + (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k := by + exact add_le_add hH hG + _ = + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k := by + ring + +/-- Descendant form of the combined cutoff bound, in the scaled bracket used by +the constant branch of the exact single-cube estimate. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_cutoff_terms_le_radiusConst_mul_pow + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) ≤ + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k := by + calc + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂) + = + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := + cubeBesovScaleWeight_neg_one_mul_parent_cutoff_terms_eq_descendant + hR ρ₁ ρ₂ + _ ≤ + ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k := + coarseCaccioppoliDescendantCutoffTerms_le_radiusConst_mul_pow + Q hchoice hlt hjk + +/-- Buffered version of `coarseCaccioppoliDescendantCutoffTerms_le_radiusConst_mul_pow`. +The midpoint cutoff inflates the Hessian contribution by `4` and the gradient +contribution by `2`, while the triadic scale is still the full outer gap. -/ +theorem coarseCaccioppoliDescendantCutoffTerms_buffered_le_radiusConst_mul_pow + {d : ℕ} (Q : TriadicCube d) {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) ≤ + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + have hH : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k := + coarseCaccioppoliDescendantCutoffHessianScaleBound_le_radiusConst_mul_pow + Q hchoice hlt hjk + have hG : + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ ≤ + (quantitativeCubeCutoffGradientConst d / cubeRadius Q) * (3 : ℝ) ^ k := + coarseCaccioppoliQuantitativeCutoffGradientBound_le_radiusConst_mul_pow + Q hchoice hlt + have hHbuf : + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + 4 * coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ := by + unfold coarseCaccioppoliDescendantCutoffHessianScaleBound + rw [coarseCaccioppoliQuantitativeCutoffHessianBound_buffered_eq_four_mul Q hlt] + ring + have hGbuf : + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) = + 2 * coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffGradientBound_buffered_eq_two_mul Q hlt + calc + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + = + 4 * coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ ρ₂ + + 2 * coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + rw [hHbuf, hGbuf] + _ ≤ + 4 * ((quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) * (3 : ℝ) ^ k) + + 2 * ((quantitativeCubeCutoffGradientConst d / cubeRadius Q) * + (3 : ℝ) ^ k) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hH (by norm_num : (0 : ℝ) ≤ 4)) + (mul_le_mul_of_nonneg_left hG (by norm_num : (0 : ℝ) ≤ 2)) + _ = + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + ring + +/-- Descendant form of the buffered combined cutoff bound, in the scaled +bracket used by the constant branch. -/ +theorem cubeBesovScaleWeight_neg_one_mul_parent_buffered_cutoff_terms_le_radiusConst_mul_pow + {d : ℕ} {Q R : TriadicCube d} {k j : ℕ} {ρ₁ ρ₂ : ℝ} + (hR : R ∈ descendantsAtDepth Q j) + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hlt : ρ₁ < ρ₂) (hjk : k ≤ j) : + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) ≤ + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := by + calc + cubeBesovScaleWeight (-1) R * + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + cubeBesovScaleWeight 1 R * + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂)) + = + coarseCaccioppoliDescendantCutoffHessianScaleBound Q j ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ + (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) := + cubeBesovScaleWeight_neg_one_mul_parent_cutoff_terms_eq_descendant + hR ρ₁ (coarseCaccioppoliBufferedCutoffRadius ρ₁ ρ₂) + _ ≤ + (4 * (quantitativeCubeCutoffHessianConst d * cubeScaleFactor Q / + (cubeRadius Q) ^ (2 : ℕ)) + + 2 * (quantitativeCubeCutoffGradientConst d / cubeRadius Q)) * + (3 : ℝ) ^ k := + coarseCaccioppoliDescendantCutoffTerms_buffered_le_radiusConst_mul_pow + Q hchoice hlt hjk + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Standard.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Standard.lean new file mode 100644 index 0000000000..a823f85542 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/QuantitativeCutoffInputs/Standard.lean @@ -0,0 +1,612 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs.Setup + +/-! # Standard -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Specialized analytic-input builder for the actual coarse Caccioppoli +harmonic family. This removes the external `htest` hypothesis once the caller +supplies the weighted-energy lower bound and the cutoff topological-support +condition needed by the weak-testing bridge. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hη_tsupport : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + tsupport (η ρ₁ ρ₂) ⊆ openCubeSet Q) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + refine + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff + Q a s C k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + η Acirc1 AcircS U A1 AS ?_ henergyAvg hfluxMem huMem hgMem + hfluxEnergy hBgConst hBgCent hC hAcirc1_nonneg hAcircS_nonneg + hproj hgCirc1 hgCircS hU hA1 hAS + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + exact + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a (w ρ₁ ρ₂) hEll (η ρ₁ ρ₂).smooth (η ρ₁ ρ₂).hasCompactSupport + (hη_tsupport hρ₁ hlt hρ₂) (hlower hρ₁ hlt hρ₂) + +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hη_tsupport : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + tsupport (η ρ₁ ρ₂) ⊆ openCubeSet Q) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + refine + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + Q a s C k h F w g η Acirc1 AcircS U A1 AS + hEll hlower hη_tsupport henergyAvg hfluxMem huMem hgMem hfluxEnergy + ?_ ?_ hC hAcirc1_nonneg hAcircS_nonneg ?_ ?_ ?_ hU hA1 hAS + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hscalar hρ₁ hlt hρ₂ with + ⟨hB, hBgConst, hBgCent, hC', hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact hBgConst + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hscalar hρ₁ hlt hρ₂ with + ⟨hB, hBgConst, hBgCent, hC', hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact hBgCent + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + rcases hscalar hρ₁ hlt hρ₂ with + ⟨hB, hBgConst, hBgCent, hC', hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact hproj N + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + rcases hscalar hρ₁ hlt hρ₂ with + ⟨hB, hBgConst, hBgCent, hC', hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact hgCirc1 N + · intro ρ₁ ρ₂ hρ₁ hlt hρ₂ N + rcases hscalar hρ₁ hlt hρ₂ with + ⟨hB, hBgConst, hBgCent, hC', hproj, hξ, hderiv, hgCirc1, hgCircS⟩ + exact hgCircS N + +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + refine + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily + Q a s C k h F w g η Acirc1 AcircS U A1 AS hEll hlower ?_ + henergyAvg hfluxMem huMem hgMem hfluxEnergy hBgConst hBgCent hC + hAcirc1_nonneg hAcircS_nonneg hproj hgCirc1 hgCircS hU hA1 hAS + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_nonneg : 0 ≤ ρ₂ := by + exact le_trans (by norm_num : 0 ≤ (1 / 3 : ℝ)) <| + le_trans hρ₁ (le_of_lt hlt) + exact (η ρ₁ ρ₂).tsupport_subset_openCubeSet_of_lt_one + hρ₂_nonneg (houter hρ₁ hlt hρ₂) + +/-- Quantitative-cutoff harmonic analytic inputs with the scalar cutoff package +bundled as `CoarseCaccioppoliScalarCutoffControls`. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one_of_scalarCutoffControls + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (η : ∀ ρ₁ ρ₂ : ℝ, QuantitativeCubeCutoff Q ρ₁ ρ₂) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + F ρ₁ ≤ + cubeAverage Q + (fun x => η ρ₁ ρ₂ x * scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hscalar : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (η ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + refine + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_quantitativeCubeCutoff_of_aHarmonicFamily_of_scalarCutoffControls + Q a s C k h F w g η Acirc1 AcircS U A1 AS + hEll hlower ?_ henergyAvg hfluxMem huMem hgMem hfluxEnergy hscalar + hC hAcirc1_nonneg hAcircS_nonneg hU hA1 hAS + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + have hρ₂_nonneg : 0 ≤ ρ₂ := by + exact le_trans (by norm_num : 0 ≤ (1 / 3 : ℝ)) <| + le_trans hρ₁ (le_of_lt hlt) + exact (η ρ₁ ρ₂).tsupport_subset_openCubeSet_of_lt_one + hρ₂_nonneg (houter hρ₁ hlt hρ₂) + +/-- Canonical analytic-input builder for the actual harmonic family using the +chapter-3 canonical quantitative cube cutoff. The cutoff data are discharged +from the canonical smooth formula plus the strict outer-radius condition +`ρ₂ < 1`. -/ +theorem + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs.of_canonicalQuantitativeCutoff_of_aHarmonicFamily_of_outerRadius_lt_one + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) {lam Lam : ℝ} + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (w : ℝ → ℝ → AHarmonicFunction a (openCubeSet Q)) + (g : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS U A1 AS : ℝ → ℝ → ℝ) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hlower : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + F ρ₁ ≤ + cubeAverage Q + (fun x => + QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂ x * + scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (houter : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + ρ₂ < 1) + (henergyAvg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) = F ρ₂) + (hfluxMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (fun x => (w ρ₁ ρ₂).toH1 x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hfluxEnergy : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + CoarseCaccioppoliFluxEnergyControls Q a s + (fun x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x)) + (hBgConst : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂)) + (hBgCent : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) → (hlt : ρ₁ < ρ₂) → (hρ₂ : ρ₂ ≤ 1) → + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C) + (hC : 0 ≤ C) + (hAcirc1_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ Acirc1 ρ₁ ρ₂) + (hAcircS_nonneg : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + 0 ≤ AcircS ρ₁ ρ₂) + (hproj : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + CubeDescendantProjectedDualMeanZeroPoincareEstimate Q C + (cubeFluctuation Q (fun x => (w ρ₁ ρ₂).toH1 x)) (g ρ₁ ρ₂) N) + (hgCirc1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + Acirc1 ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hgCircS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → ∀ N : ℕ, + cubeBesovCircPartialNorm Q (1 - s) (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (g ρ₁ ρ₂) ≤ + AcircS ρ₁ ρ₂ * + Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (hU : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => (w ρ₁ ρ₂).toH1 x) ≤ U ρ₁ ρ₂) + (hA1 : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂) + (hAS : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F + (fun ρ₁ ρ₂ x => matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + (fun ρ₁ ρ₂ x => (w ρ₁ ρ₂).toH1 x) + g + (fun ρ₁ ρ₂ => scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun ρ₁ ρ₂ x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + Acirc1 AcircS + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + U + (coarseCaccioppoliQuantitativeCutoffGradientBound Q) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q) + A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + let ηρ : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + coarseCaccioppoliCanonicalQuantitativeCutoff Q hρ₁ hlt + have hB_nonneg : + 0 ≤ coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂ := + coarseCaccioppoliQuantitativeCutoffHessianBound_nonneg Q ηρ + have hBgConstρ : + 0 ≤ + coarseCaccioppoliConstantCutoffSize Q (fun x => (w ρ₁ ρ₂).toH1 x) + (scalarCutoffGradientField ηρ) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using hBgConst hρ₁ hlt hρ₂ + have hBgCentρ : + 0 ≤ + coarseCaccioppoliCenteredCutoffSize Q s + (scalarCutoffGradientField ηρ) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (Real.sqrt + (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x))) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using hBgCent hρ₁ hlt hρ₂ + have hscalar : + CoarseCaccioppoliScalarCutoffControls Q s + (fun x => (w ρ₁ ρ₂).toH1 x) (g ρ₁ ρ₂) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (coarseCaccioppoliQuantitativeCutoffHessianBound Q ρ₁ ρ₂) C := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using! + (CoarseCaccioppoliScalarCutoffControls.of_quantitativeCubeCutoff + (Q := Q) (s := s) + (u := fun x => (w ρ₁ ρ₂).toH1 x) (g := g ρ₁ ρ₂) + (energy := fun x => scalarVariationEnergyIntegrand a (w ρ₁ ρ₂) x) + (η := ηρ) (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (C := C) + hB_nonneg hBgConstρ hBgCentρ hC + (hproj hρ₁ hlt hρ₂) (hgCirc1 hρ₁ hlt hρ₂) (hgCircS hρ₁ hlt hρ₂)) + have htest : + F ρ₁ ≤ + |cubeAverage Q + (fun x => + vecDot (matVecMul (a x) ((w ρ₁ ρ₂).toH1.grad x)) + ((w ρ₁ ρ₂).toH1 x • + scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x))| := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + (le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + Q a (w ρ₁ ρ₂) hEll ηρ.smooth ηρ.hasCompactSupport + (coarseCaccioppoliCanonicalQuantitativeCutoff_tsupport_subset_openCubeSet_of_lt_one + Q hρ₁ hlt (houter hρ₁ hlt hρ₂)) + (hlower hρ₁ hlt hρ₂)) + have hξ_mem : + MeasureTheory.MemLp + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) + (⊤ : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using + quantitativeCubeCutoff_memLp_top_gradientField Q ηρ + have hXi : + cubeLpNorm Q (⊤ : ℝ≥0∞) + (scalarCutoffGradientField (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂)) ≤ + coarseCaccioppoliQuantitativeCutoffGradientBound Q ρ₁ ρ₂ := by + simpa [ηρ, coarseCaccioppoliCanonicalQuantitativeCutoff, + QuantitativeCubeCutoff.canonical] using! + quantitativeCubeCutoff_cubeLpNorm_infty_gradientField_le Q ηρ + exact + ⟨htest, henergyAvg hρ₁ hlt hρ₂, hfluxMem hρ₁ hlt hρ₂, + huMem hρ₁ hlt hρ₂, hgMem hρ₁ hlt hρ₂, hξ_mem, + hfluxEnergy hρ₁ hlt hρ₂, hscalar, hB_nonneg, + hAcirc1_nonneg hρ₁ hlt hρ₂, hAcircS_nonneg hρ₁ hlt hρ₂, + hU hρ₁ hlt hρ₂, hXi, le_rfl, hA1 hρ₁ hlt hρ₂, hAS hρ₁ hlt hρ₂⟩ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs.lean new file mode 100644 index 0000000000..3daaa6bd94 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Profiles + +/-! # Radius Inputs -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Profiles.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Profiles.lean new file mode 100644 index 0000000000..a1209577d2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Profiles.lean @@ -0,0 +1,518 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.RadiusInputs.Setup +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.SingleCube + +/-! # Profiles -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Single-pair raw boundary estimate from the vector projected-Poincare +cutoff package and canonical coefficient factor bounds. The raw coefficients +are evaluated at the effective scalar-facing constant +`(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_vector_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u : Vec d → ℝ) (G ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C U Xi D A1 AS Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hGMem : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hvector : CoarseCaccioppoliVectorCutoffControls Q s u G ξ energy Acirc1 AcircS B C) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hAcircS_nonneg : 0 ≤ AcircS) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D ≤ + Bcross) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 + ((Fintype.card (Fin d) : ℝ) * C) + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS + ((Fintype.card (Fin d) : ℝ) * C)) ≤ + Alpha) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + have hvector_controls := hvector + rcases hvector with + ⟨hB_nonneg, _, _, _, hC, _, _, _, _, _⟩ + let Ceff : ℝ := (Fintype.card (Fin d) : ℝ) * C + have hCeff_nonneg : 0 ≤ Ceff := by + have hcard_nonneg : 0 ≤ (Fintype.card (Fin d) : ℝ) := by + exact_mod_cast (Nat.zero_le (Fintype.card (Fin d))) + exact mul_nonneg hcard_nonneg hC + have henergy_nonneg : + 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on (Q := Q) hfluxEnergy.1 + have hU_nonneg : 0 ≤ U := le_trans (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) hu + have hXi_nonneg : 0 ≤ Xi := le_trans (cubeLpNorm_nonneg Q ∞ ξ) hξ + have hD_nonneg : 0 ≤ D := le_trans hB_nonneg hB + have hA1_nonneg : 0 ≤ A1 := le_trans hAcirc1_nonneg hAcirc1 + have hAS_nonneg : 0 ≤ AS := le_trans hAcircS_nonneg hAcircS + have hconstCoeff_nonneg : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) := by + exact + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_nonneg Q + (coarseCaccioppoliLambdaFactor_nonneg Q a (by norm_num : 0 ≤ (1 : ℝ))) + (coarseCaccioppoliLambdaFactor_nonneg Q a (by norm_num : 0 ≤ (1 : ℝ))) + have hconstCutoff_nonneg : + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B := by + exact coarseCaccioppoliConstantCutoffSize_nonneg Q u ξ hB_nonneg + have hconstCoeff_le : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) := by + exact + coarseCaccioppoliFluxEnergyExactConstantCoeff_le_factorBound + Q a + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a (by norm_num : 0 < (1 : ℝ)) hfluxEnergy.2.2.2.1) + (by simp [coarseCaccioppoliLambdaFactor]) + have hconstCutoff_le : + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + exact + coarseCaccioppoliConstantCutoffSize_le_factorBound + Q u ξ hU_nonneg hB_nonneg hu hξ hB + have hconstFactor_le : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a * + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + exact + mul_le_mul hconstCoeff_le hconstCutoff_le + hconstCutoff_nonneg hconstCoeff_nonneg + have hconstRhs : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B ≤ + Bcross * Real.sqrt (cubeAverage Q energy) := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul] + exact mul_le_mul_of_nonneg_right (le_trans hconstFactor_le hconst) + (Real.sqrt_nonneg _) + have havgCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 Ceff ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 Ceff := by + exact + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + hXi_nonneg hAcirc1_nonneg hCeff_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hfluxEnergy.2.2.2.2) + hξ hAcirc1 + have hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B Ceff := by + exact + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hB_nonneg hCeff_nonneg + have hBgCent_le : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B Ceff ≤ + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS Ceff := by + exact + coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hD_nonneg hCeff_nonneg + hξ hB hAcirc1 hAcircS + have hbesovCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B Ceff ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS Ceff) := by + exact + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + hBgCentCoeff_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hfluxEnergy.2.2.2.2) + (by simp [coarseCaccioppoliLambdaFactor]) + hBgCent_le + have hcentCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B Ceff ≤ + Alpha := by + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact le_trans (add_le_add havgCoeff_le hbesovCoeff_le) hcentered + have hsqrt_sq : + Real.sqrt (cubeAverage Q energy) * Real.sqrt (cubeAverage Q energy) = + cubeAverage Q energy := by + simpa [pow_two] using (Real.sq_sqrt henergy_nonneg) + have hcentRhs : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B Ceff ≤ + Alpha * cubeAverage Q energy := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq, hsqrt_sq] + exact mul_le_mul_of_nonneg_right hcentCoeff_le henergy_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + ≤ coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B Ceff := by + simpa [Ceff] using + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_vectorControls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (G := G) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) + (C := C) hs0 hs1 hfluxMem huMem hGMem hξLp hfluxEnergy hvector_controls + _ = + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B + + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B Ceff := by + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered] + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) + + Alpha * cubeAverage Q energy := by + exact add_le_add hconstRhs hcentRhs + _ = Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + ring + +/-- Vector-Poincare raw boundary estimate from the radius-indexed analytic +package and raw coefficient bounds stated with the effective scalar-facing +constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem + coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeCanonicalVectorAnalyticInputs_of_rawCoefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u : ℝ → ℝ → Vec d → ℝ) + (G : ℝ → ℝ → Vec d → Vec d) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs Q a s C + (fun _ _ => 0) h F flux u G ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t ((Fintype.card (Fin d) : ℝ) * C) uL2Sq h U Xi D A1 AS) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t ((Fintype.card (Fin d) : ℝ) * C) + uL2Sq h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hanalytic hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hGMem, hξLp, hfluxEnergy, hvector, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, hU, hXi, hD, hA1, hAS⟩ + rcases hcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + refine le_trans htest ?_ + simpa [henergyAvg] using + (abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_vector_factor_bounds + (Q := Q) (a := a) (s := s) + (flux := flux ρ₁ ρ₂) (u := u ρ₁ ρ₂) (G := G ρ₁ ρ₂) (ξ := ξ ρ₁ ρ₂) + (energy := energy ρ₁ ρ₂) + (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (B := B ρ₁ ρ₂) + (C := C) (U := U ρ₁ ρ₂) (Xi := Xi ρ₁ ρ₂) + (D := D ρ₁ ρ₂) (A1 := A1 ρ₁ ρ₂) (AS := AS ρ₁ ρ₂) + (Alpha := + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t + ((Fintype.card (Fin d) : ℝ) * C) h ρ₁ ρ₂) + (Bcross := + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq h ρ₁ ρ₂) + hs0 hs1 hfluxMem huMem hGMem hξLp hfluxEnergy hvector + hAcirc1_nonneg hAcircS_nonneg hU hXi hD hA1 hAS hconst hcentered) + +/-- Vector-Poincare single-cube estimate from the radius-indexed analytic +package and the note-shaped single-cube coefficient bounds. The local vector +Poincare constant is `C`; the scalar-facing single-cube RHS uses the effective +constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +theorem + coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeCanonicalVectorAnalyticInputs_of_coefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u : ℝ → ℝ → Vec d → ℝ) + (G : ℝ → ℝ → Vec d → Vec d) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs Q a s C + k h F flux u G ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds + Q a s ((Fintype.card (Fin d) : ℝ) * C) uL2Sq k h U Xi D A1 AS) : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s + ((Fintype.card (Fin d) : ℝ) * C) uL2Sq k h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hanalytic hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hGMem, hξLp, hfluxEnergy, hvector, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, hU, hXi, hD, hA1, hAS⟩ + rcases hcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + let Ceff : ℝ := (Fintype.card (Fin d) : ℝ) * C + have hCeff_nonneg : 0 ≤ Ceff := by + exact mul_nonneg (by exact_mod_cast Nat.zero_le (Fintype.card (Fin d))) hC + have hcontrols : + CoarseCaccioppoliSingleCubeCoefficientControls Q a s Ceff + (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq + (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (B ρ₁ ρ₂) := by + exact + CoarseCaccioppoliSingleCubeCoefficientControls.of_canonical_factor_bounds + Q a s Ceff (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq + (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + hs0 hCeff_nonneg hfluxEnergy.2.2.2.1 hfluxEnergy.2.2.2.2 + hB_nonneg hAcirc1_nonneg hAcircS_nonneg hU hXi hD hA1 hAS + (by simpa [Ceff] using hconst) + (by simpa [Ceff] using hcentered) + have henergy_nonneg : + 0 ≤ cubeAverage Q (energy ρ₁ ρ₂) := + cubeAverage_nonneg_of_nonneg_on (Q := Q) hfluxEnergy.1 + have hdom : + CoarseCaccioppoliSingleCubeCoefficientDomination Q a s Ceff + (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq + (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (energy ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) := + CoarseCaccioppoliSingleCubeCoefficientDomination.of_coefficientControls + Q a s Ceff (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq + (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (energy ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) + henergy_nonneg hcontrols + have hsingle : + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s Ceff + (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq + (cubeAverage Q (energy ρ₁ ρ₂)) := + abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_vectorControls + (Q := Q) (a := a) (s := s) + (flux := flux ρ₁ ρ₂) (u := u ρ₁ ρ₂) (G := G ρ₁ ρ₂) (ξ := ξ ρ₁ ρ₂) + (energy := energy ρ₁ ρ₂) + (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (B := B ρ₁ ρ₂) + (C := C) (k := k ρ₁ ρ₂) (h := h ρ₁ ρ₂) (uL2Sq := uL2Sq) + hs0 hs1 hfluxMem huMem hGMem hξLp hfluxEnergy hvector + (by simpa [Ceff] using hdom) + exact le_trans htest + (by + simpa [henergyAvg, Ceff] using hsingle) + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_factorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B A G X Y : ℝ → ℝ → ℝ) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeFactorInputs Q a s C uL2Sq k h F + flux u g ξ energy Acirc1 AcircS B A G X Y) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F + flux u g ξ energy Acirc1 AcircS B := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hinputs hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, hu, hg, hξLp, hfluxEnergy, hscalar, hA_nonneg, + hconstCoeff, hconstCutoff, hconst, havg, hbesov, hcentered⟩ + exact + ⟨htest, henergyAvg, hfluxMem, hu, hg, hξLp, hfluxEnergy, hscalar, + CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds + Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) hA_nonneg hscalar.1 + hconstCoeff hconstCutoff hconst havg hbesov hcentered⟩ + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_separatedFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : + ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS + U Xi D A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F + flux u g ξ energy Acirc1 AcircS B := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hinputs hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, hAavgConst, hAavgCent, + hAflux1, hAfluxS, huBound, hξBound, hB, hAcirc1, hAcircS, hconst, + hcentered⟩ + exact + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + CoarseCaccioppoliSingleCubeCoefficientControls.of_separated_factor_bounds + Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) uL2Sq (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) hs0 hC + hB_nonneg hAcirc1_nonneg hAcircS_nonneg hAavgConst hAavgCent hAflux1 hAfluxS + huBound hξBound hB hAcirc1 hAcircS hconst hcentered⟩ + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs.of_canonicalFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hs0 : 0 < s) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B + (fun _ _ => coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a s) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a s) + U Xi D A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hinputs hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, huBound, hξBound, hB, hAcirc1, + hAcircS, hconst, hcentered⟩ + have hAavgConst : + Real.sqrt (coarseBBlockNorm Q a) ≤ + coarseCaccioppoliLambdaFactor Q a (1 : ℝ) := by + exact + sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a (by norm_num : 0 < (1 : ℝ)) hfluxEnergy.2.2.2.1 + have hAavgCent : + Real.sqrt (coarseBBlockNorm Q a) ≤ + coarseCaccioppoliLambdaFactor Q a s := by + exact + sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hfluxEnergy.2.2.2.2 + exact + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, hAavgConst, hAavgCent, + le_rfl, le_rfl, huBound, hξBound, hB, hAcirc1, hAcircS, hconst, hcentered⟩ + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F + flux u g ξ energy Acirc1 AcircS B := by + exact + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_separatedFactorInputs + Q a s C uL2Sq k h F flux u g ξ energy Acirc1 AcircS B + (fun _ _ => coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a s) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (fun _ _ => coarseCaccioppoliLambdaFactor Q a s) + U Xi D A1 AS hC hs0 + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs.of_canonicalFactorInputs + Q a s C uL2Sq k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS + hs0 hinputs) + +theorem coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs Q a s C uL2Sq k h F flux u g ξ + energy Acirc1 AcircS B) : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq k h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hinputs hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, hu, hg, hξLp, hfluxEnergy, hscalar, hcoeff⟩ + have hsingle : + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))| ≤ + coarseCaccioppoliSingleCubeBoundaryNoteRhs Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + uL2Sq (F ρ₂) := by + simpa [henergyAvg] using + (abs_cubeAverage_vecDot_scalar_smul_le_singleCubeBoundaryNoteRhs_of_coefficientControls + (Q := Q) (a := a) (s := s) (flux := flux ρ₁ ρ₂) (u := u ρ₁ ρ₂) + (g := g ρ₁ ρ₂) (ξ := ξ ρ₁ ρ₂) (energy := energy ρ₁ ρ₂) + (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (B := B ρ₁ ρ₂) + (C := C) (k := k ρ₁ ρ₂) (h := h ρ₁ ρ₂) (uL2Sq := uL2Sq) + hs0 hs1 hfluxMem hu hg hξLp hfluxEnergy hscalar hcoeff) + exact le_trans htest + hsingle + +/-- Radius-indexed factor inputs produce the note-facing single-cube raw +estimate after assembling the bundled coefficient controls. -/ +theorem coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B A G X Y : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeFactorInputs Q a s C uL2Sq k h F + flux u g ξ energy Acirc1 AcircS B A G X Y) : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq k h F := by + exact + coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_factorInputs + Q a s C uL2Sq k h F flux u g ξ energy Acirc1 AcircS B A G X Y hinputs) + +/-- Radius-indexed primitive separated factor inputs produce the note-facing +single-cube raw estimate. -/ +theorem coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeSeparatedFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : + ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS + U Xi D A1 AS) : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq k h F := by + exact + coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_separatedFactorInputs + Q a s C uL2Sq k h F flux u g ξ energy Acirc1 AcircS B + AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS hC hs0 hinputs) + +/-- Radius-indexed canonical factor inputs produce the note-facing single-cube +raw estimate. -/ +theorem coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeCanonicalFactorInputs + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs0 : 0 < s) (hs1 : s < 1) + (hinputs : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) : + CoarseCaccioppoliBoundarySingleCubeRawEstimate Q a s C uL2Sq k h F := by + exact + coarseCaccioppoli_boundary_singleCubeRawEstimate_of_radiusEnergyBridgeInputs + Q a s C uL2Sq k h flux u g ξ energy Acirc1 AcircS B hs0 hs1 + (CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs.of_canonicalFactorInputs + Q a s C uL2Sq k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS + hC hs0 hinputs) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Setup.lean new file mode 100644 index 0000000000..b582628923 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/RadiusInputs/Setup.lean @@ -0,0 +1,533 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.Localization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate.Split + +/-! # Setup -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- Radius-indexed local data sufficient for the energy bridge to produce the +single-cube note estimate at every radius pair. This packages the testing +inequality, `L^p` hypotheses, flux-energy controls, scalar cutoff controls, and +the two exact local coefficient inequalities. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeInputs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C uL2Sq : ℝ) (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + CoarseCaccioppoliSingleCubeCoefficientControls Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + uL2Sq (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) + (B ρ₁ ρ₂) + +/-- Radius-indexed energy bridge inputs with the final coefficient comparison +kept in the separated factor form supplied by +`CoarseCaccioppoliSingleCubeCoefficientControls.of_factor_bounds`. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeFactorInputs {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (s C uL2Sq : ℝ) (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B A G X Y : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + 0 ≤ A ρ₁ ρ₂ ∧ + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ A ρ₁ ρ₂ ∧ + coarseCaccioppoliConstantCutoffSize Q (u ρ₁ ρ₂) (ξ ρ₁ ρ₂) (B ρ₁ ρ₂) ≤ + G ρ₁ ρ₂ ∧ + A ρ₁ ρ₂ * G ρ₁ ρ₂ ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ∧ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a (ξ ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) C ≤ X ρ₁ ρ₂ ∧ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s (ξ ρ₁ ρ₂) + (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ≤ Y ρ₁ ρ₂ ∧ + X ρ₁ ρ₂ + Y ρ₁ ρ₂ ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + +/-- Radius-indexed energy bridge inputs with the coefficient comparison stated +in primitive separated scalar factors. This is the closest current interface +to a concrete cutoff construction: callers provide bounds for `‖u‖₂`, +`‖ξ‖∞`, `‖∇ξ‖∞`, the two scalar projected-Poincare factors, and the three +coefficient factors. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeSeparatedFactorInputs {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B AavgConst AavgCent Aflux1 AfluxS U Xi D A1 AS : + ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + 0 ≤ B ρ₁ ρ₂ ∧ + 0 ≤ Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + Real.sqrt (coarseBBlockNorm Q a) ≤ AavgConst ρ₁ ρ₂ ∧ + Real.sqrt (coarseBBlockNorm Q a) ≤ AavgCent ρ₁ ρ₂ ∧ + (geometricDiscount (1 : ℝ) 1)⁻¹ * + Real.rpow (LambdaSq Q (1 : ℝ) (.finite 1) a) (1 / 2 : ℝ) ≤ + Aflux1 ρ₁ ρ₂ ∧ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ + AfluxS ρ₁ ρ₂ ∧ + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂ ∧ + cubeLpNorm Q ∞ (ξ ρ₁ ρ₂) ≤ Xi ρ₁ ρ₂ ∧ + B ρ₁ ρ₂ ≤ D ρ₁ ρ₂ ∧ + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂ ∧ + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂ ∧ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (AavgConst ρ₁ ρ₂) (Aflux1 ρ₁ ρ₂) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q + (U ρ₁ ρ₂) (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ∧ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (AavgCent ρ₁ ρ₂) (Xi ρ₁ ρ₂) (A1 ρ₁ ρ₂) C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (AavgCent ρ₁ ρ₂) (AfluxS ρ₁ ρ₂) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s + (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) (A1 ρ₁ ρ₂) (AS ρ₁ ρ₂) C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + +/-- Radius-indexed energy bridge inputs with the coefficient factors fixed to +the canonical `LambdaSq` choices. This removes the four average/flux +coefficient slots from the caller-facing local interface; the bounds for those +slots are recovered from the flux-energy summability hypotheses. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + 0 ≤ B ρ₁ ρ₂ ∧ + 0 ≤ Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂ ∧ + cubeLpNorm Q ∞ (ξ ρ₁ ρ₂) ≤ Xi ρ₁ ρ₂ ∧ + B ρ₁ ρ₂ ≤ D ρ₁ ρ₂ ∧ + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂ ∧ + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂ ∧ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q + (U ρ₁ ρ₂) (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ∧ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) + (Xi ρ₁ ρ₂) (A1 ρ₁ ρ₂) C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s + (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) (A1 ρ₁ ρ₂) (AS ρ₁ ρ₂) C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + +/-- Analytic/local part of the canonical radius-indexed energy bridge inputs. +This deliberately omits the final two single-cube coefficient inequalities: +those are separated below so an actual cutoff construction can first prove the +testing, integrability, flux-energy, scalar-cutoff, and primitive scalar bounds +without also carrying the coefficient-localization algebra. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (_k _h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (g ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliScalarCutoffControls Q s (u ρ₁ ρ₂) (g ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + 0 ≤ B ρ₁ ρ₂ ∧ + 0 ≤ Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂ ∧ + cubeLpNorm Q ∞ (ξ ρ₁ ρ₂) ≤ Xi ρ₁ ρ₂ ∧ + B ρ₁ ρ₂ ≤ D ρ₁ ρ₂ ∧ + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂ ∧ + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂ + +/-- Vector-Poincare version of +`CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs`. + +The local cutoff package uses a vector Poincare constant `C`; downstream +coefficient and height bounds are stated with the effective scalar-facing +constant `(Fintype.card (Fin d) : ℝ) * C`. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalVectorAnalyticInputs {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C : ℝ) + (_k _h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u : ℝ → ℝ → Vec d → ℝ) + (G : ℝ → ℝ → Vec d → Vec d) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + (F ρ₁ ≤ + |cubeAverage Q + (fun x => vecDot (flux ρ₁ ρ₂ x) ((u ρ₁ ρ₂ x) • ξ ρ₁ ρ₂ x))|) ∧ + cubeAverage Q (energy ρ₁ ρ₂) = F ρ₂ ∧ + MeasureTheory.MemLp (flux ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + MeasureTheory.MemLp (u ρ₁ ρ₂) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ∧ + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => G ρ₁ ρ₂ x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) ∧ + MeasureTheory.MemLp (ξ ρ₁ ρ₂) ∞ (normalizedCubeMeasure Q) ∧ + CoarseCaccioppoliFluxEnergyControls Q a s (flux ρ₁ ρ₂) (energy ρ₁ ρ₂) ∧ + CoarseCaccioppoliVectorCutoffControls Q s (u ρ₁ ρ₂) (G ρ₁ ρ₂) (ξ ρ₁ ρ₂) + (energy ρ₁ ρ₂) (Acirc1 ρ₁ ρ₂) (AcircS ρ₁ ρ₂) (B ρ₁ ρ₂) C ∧ + 0 ≤ B ρ₁ ρ₂ ∧ + 0 ≤ Acirc1 ρ₁ ρ₂ ∧ + 0 ≤ AcircS ρ₁ ρ₂ ∧ + cubeLpNorm Q (2 : ℝ≥0∞) (u ρ₁ ρ₂) ≤ U ρ₁ ρ₂ ∧ + cubeLpNorm Q ∞ (ξ ρ₁ ρ₂) ≤ Xi ρ₁ ρ₂ ∧ + B ρ₁ ρ₂ ≤ D ρ₁ ρ₂ ∧ + Acirc1 ρ₁ ρ₂ ≤ A1 ρ₁ ρ₂ ∧ + AcircS ρ₁ ρ₂ ≤ AS ρ₁ ρ₂ + +/-- The two radius-indexed coefficient inequalities left after the canonical +local analytic inputs have been supplied. This is the formal target for the +Chapter 3 cutoff-scale algebra: constant branch and centered branch. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (U Xi D A1 AS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q + (U ρ₁ ρ₂) (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) ≤ + coarseCaccioppoliSingleCubeBoundaryConstantCoeff Q a C (k ρ₁ ρ₂) uL2Sq ∧ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) + (Xi ρ₁ ρ₂) (A1 ρ₁ ρ₂) C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s + (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) (A1 ρ₁ ρ₂) (AS ρ₁ ρ₂) C) ≤ + coarseCaccioppoliSingleCubeBoundaryCenteredCoeff Q a s C (k ρ₁ ρ₂) (h ρ₁ ρ₂) + +/-- Direct radius-indexed comparison from the canonical factor bounds to the +final boundary raw coefficients. This is the natural top-level bookkeeping +surface once the local estimate is targeted straight at the note's raw +radius recursion rather than routed through the intermediate single-cube +coefficients. -/ +def CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) (U Xi D A1 AS : ℝ → ℝ → ℝ) : Prop := + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q + (U ρ₁ ρ₂) (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) ≤ + coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂ ∧ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) + (Xi ρ₁ ρ₂) (A1 ρ₁ ρ₂) C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s + (Xi ρ₁ ρ₂) (D ρ₁ ρ₂) (A1 ρ₁ ρ₂) (AS ρ₁ ρ₂) C) ≤ + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds.of_coefficientBounds_of_localization + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (U Xi D A1 AS : ℝ → ℝ → ℝ) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds + Q a s C uL2Sq k h U Xi D A1 AS) + (hloc : + CoarseCaccioppoliBoundarySingleCubeCoefficientLocalization Q a s t C uL2Sq + k h) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq h U Xi D A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + rcases hloc with ⟨hlocConst, hlocCent⟩ + exact + ⟨le_trans hconst (hlocConst hρ₁ hlt hρ₂), + le_trans hcentered (hlocCent hρ₁ hlt hρ₂)⟩ + +theorem abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_factor_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (flux : Vec d → Vec d) (u g : Vec d → ℝ) (ξ : Vec d → Vec d) + (energy : Vec d → ℝ) + {Acirc1 AcircS B C U Xi D A1 AS Alpha Bcross : ℝ} + (hs0 : 0 < s) (hs1 : s < 1) + (hfluxMem : MeasureTheory.MemLp flux (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (huMem : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgMem : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hξLp : MeasureTheory.MemLp ξ ∞ (normalizedCubeMeasure Q)) + (hfluxEnergy : CoarseCaccioppoliFluxEnergyControls Q a s flux energy) + (hscalar : CoarseCaccioppoliScalarCutoffControls Q s u g ξ energy Acirc1 AcircS B C) + (hAcirc1_nonneg : 0 ≤ Acirc1) (hAcircS_nonneg : 0 ≤ AcircS) + (hu : cubeLpNorm Q (2 : ℝ≥0∞) u ≤ U) + (hξ : cubeLpNorm Q ∞ ξ ≤ Xi) + (hB : B ≤ D) (hAcirc1 : Acirc1 ≤ A1) (hAcircS : AcircS ≤ AS) + (hconst : + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D ≤ + Bcross) + (hcentered : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 C + + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) ≤ + Alpha) : + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| ≤ + Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + have hscalar_controls := hscalar + rcases hscalar_controls with + ⟨hB_nonneg, _, _, hC, _, _, _, _, _⟩ + have henergy_nonneg : + 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on (Q := Q) hfluxEnergy.1 + have hU_nonneg : 0 ≤ U := le_trans (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) u) hu + have hXi_nonneg : 0 ≤ Xi := le_trans (cubeLpNorm_nonneg Q ∞ ξ) hξ + have hD_nonneg : 0 ≤ D := le_trans hB_nonneg hB + have hA1_nonneg : 0 ≤ A1 := le_trans hAcirc1_nonneg hAcirc1 + have hAS_nonneg : 0 ≤ AS := le_trans hAcircS_nonneg hAcircS + have hconstCoeff_nonneg : + 0 ≤ coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) := by + exact + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound_nonneg Q + (coarseCaccioppoliLambdaFactor_nonneg Q a (by norm_num : 0 ≤ (1 : ℝ))) + (coarseCaccioppoliLambdaFactor_nonneg Q a (by norm_num : 0 ≤ (1 : ℝ))) + have hconstCutoff_nonneg : + 0 ≤ coarseCaccioppoliConstantCutoffSize Q u ξ B := by + exact coarseCaccioppoliConstantCutoffSize_nonneg Q u ξ hB_nonneg + have hconstCoeff_le : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) := by + exact + coarseCaccioppoliFluxEnergyExactConstantCoeff_le_factorBound + Q a + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a (by norm_num : 0 < (1 : ℝ)) hfluxEnergy.2.2.2.1) + (by simp [coarseCaccioppoliLambdaFactor]) + have hconstCutoff_le : + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + exact + coarseCaccioppoliConstantCutoffSize_le_factorBound + Q u ξ hU_nonneg hB_nonneg hu hξ hB + have hconstFactor_le : + coarseCaccioppoliFluxEnergyExactConstantCoeff Q a * + coarseCaccioppoliConstantCutoffSize Q u ξ B ≤ + coarseCaccioppoliFluxEnergyExactConstantCoeffFactorBound Q + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) + (coarseCaccioppoliLambdaFactor Q a (1 : ℝ)) * + coarseCaccioppoliConstantCutoffSizeFactorBound Q U Xi D := by + exact + mul_le_mul hconstCoeff_le hconstCutoff_le + hconstCutoff_nonneg hconstCoeff_nonneg + have hconstRhs : + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B ≤ + Bcross * Real.sqrt (cubeAverage Q energy) := by + rw [coarseCaccioppoliFluxEnergyExactConstantRhs_eq_coeff_mul] + exact mul_le_mul_of_nonneg_right (le_trans hconstFactor_le hconst) + (Real.sqrt_nonneg _) + have havgCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff Q a ξ Acirc1 C ≤ + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeffFactorBound + (d := d) (coarseCaccioppoliLambdaFactor Q a s) Xi A1 C := by + exact + coarseCaccioppoliFluxEnergyExactCenteredAverageCoeff_le_factorBound + Q a ξ + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + hXi_nonneg hAcirc1_nonneg hC + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hfluxEnergy.2.2.2.2) + hξ hAcirc1 + have hBgCentCoeff_nonneg : + 0 ≤ coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C := by + exact + coarseCaccioppoliCenteredCutoffCoeff_nonneg + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hB_nonneg hC + have hBgCent_le : + coarseCaccioppoliCenteredCutoffCoeff Q s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C := by + exact + coarseCaccioppoliCenteredCutoffCoeff_le_factorBound + Q ξ hs0 hAcirc1_nonneg hAcircS_nonneg hXi_nonneg hD_nonneg hC + hξ hB hAcirc1 hAcircS + have hbesovCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff Q a s ξ Acirc1 AcircS B C ≤ + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeffFactorBound Q s + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliLambdaFactor Q a s) + (coarseCaccioppoliCenteredCutoffCoeffFactorBound Q s Xi D A1 AS C) := by + exact + coarseCaccioppoliFluxEnergyExactCenteredBesovCoeff_le_factorBound + Q a s ξ + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + (coarseCaccioppoliLambdaFactor_nonneg Q a hs0.le) + hBgCentCoeff_nonneg + (sqrt_coarseBBlockNorm_le_coarseCaccioppoliLambdaFactor + Q a hs0 hfluxEnergy.2.2.2.2) + (by simp [coarseCaccioppoliLambdaFactor]) + hBgCent_le + have hcentCoeff_le : + coarseCaccioppoliFluxEnergyExactCenteredCoeff Q a s ξ Acirc1 AcircS B C ≤ Alpha := by + rw [coarseCaccioppoliFluxEnergyExactCenteredCoeff_eq_average_add_besov] + exact le_trans (add_le_add havgCoeff_le hbesovCoeff_le) hcentered + have hsqrt_sq : + Real.sqrt (cubeAverage Q energy) * Real.sqrt (cubeAverage Q energy) = + cubeAverage Q energy := by + simpa [pow_two] using (Real.sq_sqrt henergy_nonneg) + have hcentRhs : + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C ≤ + Alpha * cubeAverage Q energy := by + rw [coarseCaccioppoliFluxEnergyExactCenteredRhs_eq_coeff_mul_sqrt_sq, hsqrt_sq] + exact mul_le_mul_of_nonneg_right hcentCoeff_le henergy_nonneg + calc + |cubeAverage Q (fun x => vecDot (flux x) (u x • ξ x))| + ≤ coarseCaccioppoliFluxEnergyExactRhs Q a s u ξ energy Acirc1 AcircS B C := by + exact + abs_cubeAverage_vecDot_scalar_smul_le_fluxEnergyExactRhs_of_controls + (Q := Q) (a := a) (s := s) (flux := flux) (u := u) (g := g) (ξ := ξ) + (energy := energy) (Acirc1 := Acirc1) (AcircS := AcircS) (B := B) (C := C) + hs0 hs1 hfluxMem huMem hgMem hξLp hfluxEnergy hscalar + _ = + coarseCaccioppoliFluxEnergyExactConstantRhs Q a u ξ energy B + + coarseCaccioppoliFluxEnergyExactCenteredRhs Q a s ξ energy Acirc1 AcircS B C := by + rw [coarseCaccioppoliFluxEnergyExactRhs_eq_constant_add_centered] + _ ≤ Bcross * Real.sqrt (cubeAverage Q energy) + + Alpha * cubeAverage Q energy := by + exact add_le_add hconstRhs hcentRhs + _ = Alpha * cubeAverage Q energy + + Bcross * Real.sqrt (cubeAverage Q energy) := by + ring + +theorem CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs.of_analyticInputs_of_coefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s C uL2Sq : ℝ) + (k h : ℝ → ℝ → ℝ) (F : ℝ → ℝ) + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalCoefficientBounds + Q a s C uL2Sq k h U Xi D A1 AS) : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalFactorInputs Q a s C uL2Sq + k h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hanalytic hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, huBound, hξBound, hB, hAcirc1, + hAcircS⟩ + rcases hcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + exact + ⟨htest, henergyAvg, hfluxMem, huMem, hg, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, huBound, hξBound, hB, hAcirc1, + hAcircS, hconst, hcentered⟩ + +theorem coarseCaccioppoli_boundary_noteRawEstimate_of_radiusEnergyBridgeCanonicalAnalyticInputs_of_rawCoefficientBounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C uL2Sq : ℝ) + (h : ℝ → ℝ → ℝ) {F : ℝ → ℝ} + (flux : ℝ → ℝ → Vec d → Vec d) (u g : ℝ → ℝ → Vec d → ℝ) + (ξ : ℝ → ℝ → Vec d → Vec d) (energy : ℝ → ℝ → Vec d → ℝ) + (Acirc1 AcircS B U Xi D A1 AS : ℝ → ℝ → ℝ) + (hs0 : 0 < s) (hs1 : s < 1) + (hanalytic : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalAnalyticInputs Q a s C + (fun _ _ => 0) h F flux u g ξ energy Acirc1 AcircS B U Xi D A1 AS) + (hcoeff : + CoarseCaccioppoliBoundaryRadiusEnergyBridgeCanonicalRawCoefficientBounds + Q a s t C uL2Sq h U Xi D A1 AS) : + CoarseCaccioppoliBoundaryNoteRawEstimate Q a s t C uL2Sq h F := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hanalytic hρ₁ hlt hρ₂ with + ⟨htest, henergyAvg, hfluxMem, huMem, hgMem, hξLp, hfluxEnergy, hscalar, + hB_nonneg, hAcirc1_nonneg, hAcircS_nonneg, hU, hXi, hD, hA1, hAS⟩ + rcases hcoeff hρ₁ hlt hρ₂ with ⟨hconst, hcentered⟩ + refine le_trans htest ?_ + simpa [henergyAvg] using + (abs_cubeAverage_vecDot_scalar_smul_le_boundaryRawEstimate_of_canonical_factor_bounds + (Q := Q) (a := a) (s := s) + (flux := flux ρ₁ ρ₂) (u := u ρ₁ ρ₂) (g := g ρ₁ ρ₂) (ξ := ξ ρ₁ ρ₂) + (energy := energy ρ₁ ρ₂) + (Acirc1 := Acirc1 ρ₁ ρ₂) (AcircS := AcircS ρ₁ ρ₂) (B := B ρ₁ ρ₂) + (C := C) (U := U ρ₁ ρ₂) (Xi := Xi ρ₁ ρ₂) + (D := D ρ₁ ρ₂) (A1 := A1 ρ₁ ρ₂) (AS := AS ρ₁ ρ₂) + (Alpha := coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂) + (Bcross := coarseCaccioppoliBoundaryCrossCoeffOfHeight Q a s C uL2Sq h ρ₁ ρ₂) + hs0 hs1 hfluxMem huMem hgMem hξLp hfluxEnergy hscalar + hAcirc1_nonneg hAcircS_nonneg hU hXi hD hA1 hAS hconst hcentered) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/WeakTesting.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/WeakTesting.lean new file mode 100644 index 0000000000..417dafcf3a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/SingleCubeToRaw/WeakTesting.lean @@ -0,0 +1,478 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.LocalizedZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Weak Testing -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-- The harmonic flux tested against `u ∇η` is integrable on the closed cube. + +The weak-testing identity below already proves this internally on the open +cube; this lemma exposes the integrability input needed by descendant +summation. -/ +theorem integrableOn_vecDot_harmonicFlux_harmonicFunction_scalarCutoffGradientField + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) + (cubeSet Q) MeasureTheory.volume := by + let U : Set (Vec d) := openCubeSet Q + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [U, volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hflux_mem : + MemVectorL2 U (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have hpair_vec_mem : + MemVectorL2 U (fun x => w.toH1 x • scalarCutoffGradientField η x) := by + simpa [MemVectorL2, volumeMeasureOn, Pi.smul_apply, smul_eq_mul, mul_comm] using + (MeasureTheory.MemLp.of_eval fun i : Fin d => by + have hgradη_compact : + HasCompactSupport (fun x => scalarCutoffGradientField η x i) := by + simpa [scalarCutoffGradientField] using + hη_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + rcases + memH1_mul_of_contDiff_hasCompactSupport + (contDiff_scalarCutoffGradientField_component hη i) hgradη_compact + w.toH1.memH1 with + ⟨v, hv_toFun⟩ + simpa [hv_toFun, mul_comm] using v.memL2) + have hpair_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) + U := by + exact integrableOn_vecDot_of_memVectorL2 hflux_mem hpair_vec_mem + simpa [U, MeasureTheory.IntegrableOn, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] using hpair_int + +theorem + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_memH10_mul + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) + (hw_memH10 : MemH10 (openCubeSet Q) (fun x => η x * w.toH1 x)) : + ∫ x in openCubeSet Q, η x * scalarVariationEnergyIntegrand a w x ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume := by + let U : Set (Vec d) := openCubeSet Q + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [U, volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let wη : H1Function U := w.toH1.mulContDiffHasCompactSupport hη hη_compact + rcases (show MemH10 U (fun x => η x * w.toH1 x) from by + simpa [U] using hw_memH10) with ⟨φ, hφ_toFun⟩ + have hflux_mem : + MemVectorL2 U (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have hprod_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x)) U := by + exact integrableOn_vecDot_of_memVectorL2 hflux_mem wη.grad_memVectorL2 + have hpair_vec_mem : + MemVectorL2 U (fun x => w.toH1 x • scalarCutoffGradientField η x) := by + simpa [MemVectorL2, volumeMeasureOn, Pi.smul_apply, smul_eq_mul, mul_comm] using + (MeasureTheory.MemLp.of_eval fun i : Fin d => by + have hgradη_compact : + HasCompactSupport (fun x => scalarCutoffGradientField η x i) := by + simpa [scalarCutoffGradientField] using + hη_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + rcases + memH1_mul_of_contDiff_hasCompactSupport + (contDiff_scalarCutoffGradientField_component hη i) hgradη_compact + w.toH1.memH1 with + ⟨v, hv_toFun⟩ + simpa [hv_toFun, mul_comm] using v.memL2) + have hpair_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) + U := by + exact integrableOn_vecDot_of_memVectorL2 hflux_mem hpair_vec_mem + have hcoord_ae : + ∀ i : Fin d, + (fun x => φ.toH1Function.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + (fun x => wη.grad x i) := by + intro i + have hφ_loc : + MeasureTheory.LocallyIntegrableOn (fun x => φ.toH1Function.grad x i) + U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((φ.toH1Function.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2)) + have hwη_loc : + MeasureTheory.LocallyIntegrableOn (fun x => wη.grad x i) + U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((wη.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2)) + have hφ_weak : + HasWeakPartialDerivOn U i (fun x => η x * w.toH1 x) + (fun x => φ.toH1Function.grad x i) := by + simpa [hφ_toFun] using φ.toH1Function.hasWeakGradient i + have hwη_weak : + HasWeakPartialDerivOn U i (fun x => η x * w.toH1 x) + (fun x => wη.grad x i) := by + simpa [wη, H1Function.mulContDiffHasCompactSupport_toFun] using + wη.hasWeakGradient i + exact + HasWeakPartialDerivOn.ae_eq (isOpen_openCubeSet Q) + hφ_loc hwη_loc hφ_weak hwη_weak + have hsol_wη : + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) ∂MeasureTheory.volume = 0 := by + have hcoord_int_wη : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => (matVecMul (a x) (w.toH1.grad x)) i * wη.grad x i) + (MeasureTheory.volume.restrict U) := by + intro i + exact + (memScalarL2_coord_of_memVectorL2 hflux_mem i).integrable_mul + (wη.gradMemL2 i) + have hcoord_int_φ : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x => (matVecMul (a x) (w.toH1.grad x)) i * φ.toH1Function.grad x i) + (MeasureTheory.volume.restrict U) := by + intro i + exact + (memScalarL2_coord_of_memVectorL2 hflux_mem i).integrable_mul + (φ.toH1Function.gradMemL2 i) + calc + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) ∂MeasureTheory.volume + = + ∑ i, ∫ x in U, + (matVecMul (a x) (w.toH1.grad x)) i * wη.grad x i ∂MeasureTheory.volume := by + rw [show + (fun x => vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x)) = + fun x => ∑ i, (matVecMul (a x) (w.toH1.grad x)) i * wη.grad x i by + funext x + simp [vecDot]] + rw [MeasureTheory.integral_finsetSum] + intro i hi + exact hcoord_int_wη i + _ = ∑ i, ∫ x in U, + (matVecMul (a x) (w.toH1.grad x)) i * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + refine Finset.sum_congr rfl ?_ + intro i hi + apply MeasureTheory.integral_congr_ae + filter_upwards [hcoord_ae i] with x hx + simp [hx] + _ = ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + symm + rw [show + (fun x => vecDot (matVecMul (a x) (w.toH1.grad x)) (φ.toH1Function.grad x)) = + fun x => ∑ i, (matVecMul (a x) (w.toH1.grad x)) i * φ.toH1Function.grad x i by + funext x + simp [vecDot]] + rw [MeasureTheory.integral_finsetSum] + intro i hi + exact hcoord_int_φ i + _ = 0 := w.isHarmonic.2 φ + have hprod_split : + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x)) = + (fun x => + η x * scalarVariationEnergyIntegrand a w x + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + funext x + have henergy : + vecDot (matVecMul (a x) (w.toH1.grad x)) (w.toH1.grad x) = + scalarVariationEnergyIntegrand a w x := by + rw [vecDot_comm, ← vecDot_matVecMul_symmPart (a x) (w.toH1.grad x)] + rfl + have hwη_grad : + wη.grad x = η x • w.toH1.grad x + w.toH1 x • scalarCutoffGradientField η x := by + ext i + simp [wη, H1Function.mulContDiffHasCompactSupport_grad, scalarCutoffGradientField, + Pi.smul_apply, smul_eq_mul] + calc + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) + = vecDot (matVecMul (a x) (w.toH1.grad x)) + (η x • w.toH1.grad x + w.toH1 x • scalarCutoffGradientField η x) := by + rw [hwη_grad] + _ = vecDot (matVecMul (a x) (w.toH1.grad x)) (η x • w.toH1.grad x) + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) := by + rw [vecDot_add_right] + _ = η x * vecDot (matVecMul (a x) (w.toH1.grad x)) (w.toH1.grad x) + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) := by + rw [vecDot_smul_right] + _ = η x * scalarVariationEnergyIntegrand a w x + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) := by + rw [henergy] + have hweighted_eq : + (fun x => η x * scalarVariationEnergyIntegrand a w x) = + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) - + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + funext x + have hx := congrFun hprod_split x + linarith + have hweighted_int : + MeasureTheory.IntegrableOn + (fun x => η x * scalarVariationEnergyIntegrand a w x) U := by + have hdiff_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) - + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) + U := by + simpa [MeasureTheory.IntegrableOn] using! hprod_int.integrable.sub hpair_int.integrable + simpa [hweighted_eq] using hdiff_int + have hsum_zero : + ∫ x in U, + (η x * scalarVariationEnergyIntegrand a w x + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, + (η x * scalarVariationEnergyIntegrand a w x + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) ∂MeasureTheory.volume + = + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) (wη.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => (congrFun hprod_split x).symm + _ = 0 := hsol_wη + have hsum_zero' : + ∫ x in U, η x * scalarVariationEnergyIntegrand a w x ∂MeasureTheory.volume + + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, η x * scalarVariationEnergyIntegrand a w x ∂MeasureTheory.volume + + ∫ x in U, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume + = + ∫ x in U, + (η x * scalarVariationEnergyIntegrand a w x + + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) ∂MeasureTheory.volume := by + symm + rw [MeasureTheory.integral_add hweighted_int hpair_int] + _ = 0 := hsum_zero + linarith + +theorem + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ openCubeSet Q) : + ∫ x in openCubeSet Q, η x * scalarVariationEnergyIntegrand a w x ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume := by + exact + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_memH10_mul + Q a w hEll hη hη_compact + (memH10_mul_of_contDiff_hasCompactSupport + (isOpenBoundedConvexDomain_openCubeSet Q) hη hη_compact hη_sub w.toH1.memH1) + +theorem + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {V : Set (Vec d)} + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V w.toH1.toFun) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in openCubeSet Q, η x * scalarVariationEnergyIntegrand a w x ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume := by + exact + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_memH10_mul + Q a w hEll hη hη_compact + (localizedZeroTraceFunctionOn_memH10_mul hzero hη hη_compact hη_sub) + +theorem + cubeAverage_mul_scalarVariationEnergyIntegrand_eq_neg_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ openCubeSet Q) : + cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) = + -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + have hset := + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction + Q a w hEll hη hη_compact hη_sub + calc + cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) + = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, η x * scalarVariationEnergyIntegrand a w x + ∂MeasureTheory.volume := by + rfl + _ = (cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, η x * scalarVariationEnergyIntegrand a w x + ∂MeasureTheory.volume := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = (cubeVolume Q)⁻¹ * + (-∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + rw [hset] + _ = -((cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + ring + _ = -((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + rfl + +theorem + cubeAverage_mul_scalarVariationEnergyIntegrand_eq_neg_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {V : Set (Vec d)} + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V w.toH1.toFun) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) = + -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + have hset := + setIntegral_mul_scalarVariationEnergyIntegrand_eq_neg_setIntegral_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace + Q a w hEll hzero hη hη_compact hη_sub + calc + cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) + = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, η x * scalarVariationEnergyIntegrand a w x + ∂MeasureTheory.volume := by + rfl + _ = (cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, η x * scalarVariationEnergyIntegrand a w x + ∂MeasureTheory.volume := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = (cubeVolume Q)⁻¹ * + (-∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + rw [hset] + _ = -((cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + ring + _ = -((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x) ∂MeasureTheory.volume) := by + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + _ = -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := by + rfl + +theorem + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam F : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ openCubeSet Q) + (hlower : + F ≤ cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x)) : + F ≤ + |cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x))| := by + have havg := + cubeAverage_mul_scalarVariationEnergyIntegrand_eq_neg_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction + Q a w hEll hη hη_compact hη_sub + calc + F ≤ cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) := hlower + _ = -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := havg + _ ≤ |cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x))| := by + exact neg_le_abs _ + +theorem + le_abs_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace_of_le_cubeAverage_mul_scalarVariationEnergyIntegrand + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam F : ℝ} + (w : AHarmonicFunction a (openCubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + {V : Set (Vec d)} + (hzero : LocalizedZeroTraceFunctionOn (openCubeSet Q) V w.toH1.toFun) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) + (hlower : + F ≤ cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x)) : + F ≤ + |cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x))| := by + have havg := + cubeAverage_mul_scalarVariationEnergyIntegrand_eq_neg_cubeAverage_vecDot_flux_scalarCutoffGradientField_of_aHarmonicFunction_of_localizedZeroTrace + Q a w hEll hzero hη hη_compact hη_sub + calc + F ≤ cubeAverage Q (fun x => η x * scalarVariationEnergyIntegrand a w x) := hlower + _ = -cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x)) := havg + _ ≤ |cubeAverage Q (fun x => + vecDot (matVecMul (a x) (w.toH1.grad x)) + (w.toH1 x • scalarCutoffGradientField η x))| := by + exact neg_le_abs _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/TriadicScale.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/TriadicScale.lean new file mode 100644 index 0000000000..1b16f55388 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoli/TriadicScale.lean @@ -0,0 +1,325 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.Height + +/-! # Triadic Scale -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem coarseCaccioppoliRadiusSequence_mem_Icc (n : ℕ) : + (1 / 3 : ℝ) ≤ coarseCaccioppoliRadiusSequence n ∧ + coarseCaccioppoliRadiusSequence n ≤ 1 := by + unfold coarseCaccioppoliRadiusSequence + constructor + · have hpos : 0 < 3 * (n + 1 : ℝ) := by positivity + field_simp [hpos.ne'] + nlinarith + · have hfrac_nonneg : 0 ≤ 2 / (3 * (n + 1 : ℝ)) := by positivity + nlinarith + +theorem coarseCaccioppoliRadiusSequence_lt_one (n : ℕ) : + coarseCaccioppoliRadiusSequence n < 1 := by + unfold coarseCaccioppoliRadiusSequence + have hfrac_pos : 0 < 2 / (3 * (n + 1 : ℝ)) := by positivity + linarith + +theorem coarseCaccioppoliRadiusSequence_strictMono : + StrictMono coarseCaccioppoliRadiusSequence := by + intro m n hmn + unfold coarseCaccioppoliRadiusSequence + have hm3 : (0 : ℝ) < 3 * (m + 1 : ℝ) := by positivity + have hlt3 : 3 * (m + 1 : ℝ) < 3 * (n + 1 : ℝ) := by + have hlt : (m : ℝ) + 1 < n + 1 := by + exact_mod_cast Nat.succ_lt_succ hmn + nlinarith + have hInv : (3 * (n + 1 : ℝ))⁻¹ < (3 * (m + 1 : ℝ))⁻¹ := by + simpa [one_div] using (one_div_lt_one_div_of_lt hm3 hlt3) + have hFrac : 2 / (3 * (n + 1 : ℝ)) < 2 / (3 * (m + 1 : ℝ)) := by + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + (mul_lt_mul_of_pos_left hInv (show (0 : ℝ) < 2 by positivity)) + nlinarith + +theorem coarseCaccioppoliRadiusSequence_succ_sub (n : ℕ) : + coarseCaccioppoliRadiusSequence (n + 1) - coarseCaccioppoliRadiusSequence n = + 2 / (3 * (((n + 1) * (n + 2) : ℕ) : ℝ)) := by + unfold coarseCaccioppoliRadiusSequence + have hcast : (((n + 1 : ℕ) : ℝ) + 1) = (n + 2 : ℝ) := by + have hstep : (((n + 1 : ℕ) : ℝ) + 1) = ((((n + 1) + 1 : ℕ) : ℝ)) := by + rw [show (1 : ℝ) = ((1 : ℕ) : ℝ) by norm_num, ← Nat.cast_add] + calc + (((n + 1 : ℕ) : ℝ) + 1) = ((((n + 1) + 1 : ℕ) : ℝ)) := hstep + _ = (n + 2 : ℝ) := by + exact_mod_cast (by omega : (n + 1) + 1 = n + 2) + rw [hcast] + calc + (1 - 2 / (3 * (n + 2 : ℝ))) - (1 - 2 / (3 * (n + 1 : ℝ))) + = 2 / (3 * (n + 1 : ℝ)) - 2 / (3 * (n + 2 : ℝ)) := by ring + _ = 2 / (3 * (((n + 1) * (n + 2) : ℕ) : ℝ)) := by + field_simp + ring_nf + norm_num [Nat.cast_add, Nat.cast_mul, Nat.cast_pow] + +theorem coarseCaccioppoliRadiusSequence_gap_pos (n : ℕ) : + 0 < coarseCaccioppoliRadiusSequence (n + 1) - coarseCaccioppoliRadiusSequence n := by + rw [coarseCaccioppoliRadiusSequence_succ_sub] + positivity + +theorem coarseCaccioppoliRadiusIterationTerm_nonneg (β : ℝ) (n : ℕ) : + 0 ≤ coarseCaccioppoliRadiusIterationTerm β n := by + unfold coarseCaccioppoliRadiusIterationTerm + refine mul_nonneg ?_ ?_ + · positivity + · exact Real.rpow_nonneg (le_of_lt (coarseCaccioppoliRadiusSequence_gap_pos n)) _ + +theorem coarseCaccioppoliGapInv_nonneg {ρ₁ ρ₂ : ℝ} (hρ : ρ₁ < ρ₂) : + 0 ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + unfold coarseCaccioppoliGapInv + exact Real.rpow_nonneg (sub_nonneg.mpr hρ.le) _ + +@[simp] theorem coarseCaccioppoliGapInv_eq_inv (ρ₁ ρ₂ : ℝ) : + coarseCaccioppoliGapInv ρ₁ ρ₂ = (ρ₂ - ρ₁)⁻¹ := by + unfold coarseCaccioppoliGapInv + simpa using (Real.rpow_neg_one (ρ₂ - ρ₁)) + +theorem coarseCaccioppoli_gap_le_two_thirds {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (_hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + ρ₂ - ρ₁ ≤ (2 / 3 : ℝ) := by + linarith + +/-- There is always a triadic scale in the note's admissible gap window. -/ +theorem exists_coarseCaccioppoliTriadicGapScaleChoice {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ := by + let gap : ℝ := ρ₂ - ρ₁ + have hgap_pos : 0 < gap := by + dsimp [gap] + exact sub_pos.mpr hlt + have hgap_le : gap ≤ (2 / 3 : ℝ) := by + dsimp [gap] + exact coarseCaccioppoli_gap_le_two_thirds hρ₁ hlt hρ₂ + have hA_ge_one : (1 : ℝ) ≤ 27 / gap := by + rw [le_div_iff₀ hgap_pos] + nlinarith + rcases exists_nat_pow_near hA_ge_one (by norm_num : (1 : ℝ) < 3) with + ⟨n, hn_lower, hn_upper⟩ + refine ⟨n + 1, ?_⟩ + have hpow_pos : 0 < (3 : ℝ) ^ (n + 1) := by positivity + have hA_pos : 0 < 27 / gap := div_pos (by norm_num) hgap_pos + have hpow_lower : 27 / gap ≤ (3 : ℝ) ^ (n + 1) := + le_of_lt hn_upper + have hpow_upper : (3 : ℝ) ^ (n + 1) ≤ 81 / gap := by + calc + (3 : ℝ) ^ (n + 1) = 3 * (3 : ℝ) ^ n := by + rw [pow_succ] + ring + _ ≤ 3 * (27 / gap) := by + exact mul_le_mul_of_nonneg_left hn_lower (by norm_num : (0 : ℝ) ≤ 3) + _ = 81 / gap := by ring + constructor + · have hinv : + 1 / (81 / gap) ≤ 1 / ((3 : ℝ) ^ (n + 1)) := + one_div_le_one_div_of_le hpow_pos hpow_upper + have hrewrite : + 1 / (81 / gap) = (1 / 81 : ℝ) * gap := by + field_simp [hgap_pos.ne'] + simpa [hrewrite, one_div] using hinv + · have hinv : + 1 / ((3 : ℝ) ^ (n + 1)) ≤ 1 / (27 / gap) := + one_div_le_one_div_of_le hA_pos hpow_lower + have hrewrite : + 1 / (27 / gap) = (1 / 27 : ℝ) * gap := by + field_simp [hgap_pos.ne'] + simpa [hrewrite, one_div] using hinv + +/-- A canonical triadic scale choice for the radius gap. Outside the Caccioppoli +radius range it is set to `0`; all note-facing uses go through the `_spec` +lemma below. -/ +noncomputable def coarseCaccioppoliTriadicGapScale (ρ₁ ρ₂ : ℝ) : ℕ := + if h : (1 / 3 : ℝ) ≤ ρ₁ ∧ ρ₁ < ρ₂ ∧ ρ₂ ≤ 1 then + Classical.choose + (exists_coarseCaccioppoliTriadicGapScaleChoice h.1 h.2.1 h.2.2) + else + 0 + +theorem coarseCaccioppoliTriadicGapScale_spec {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + CoarseCaccioppoliTriadicGapScaleChoice + (coarseCaccioppoliTriadicGapScale ρ₁ ρ₂) ρ₁ ρ₂ := by + unfold coarseCaccioppoliTriadicGapScale + have hvalid : (1 / 3 : ℝ) ≤ ρ₁ ∧ ρ₁ < ρ₂ ∧ ρ₂ ≤ 1 := + ⟨hρ₁, hlt, hρ₂⟩ + rw [dif_pos hvalid] + exact + Classical.choose_spec + (exists_coarseCaccioppoliTriadicGapScaleChoice hρ₁ hlt hρ₂) + +theorem coarseCaccioppoliGapInv_ge_three_halves {ρ₁ ρ₂ : ℝ} + (hρ₁ : (1 / 3 : ℝ) ≤ ρ₁) (hlt : ρ₁ < ρ₂) (hρ₂ : ρ₂ ≤ 1) : + (3 / 2 : ℝ) ≤ coarseCaccioppoliGapInv ρ₁ ρ₂ := by + rw [coarseCaccioppoliGapInv_eq_inv] + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hlt + have hgap_ne : ρ₂ - ρ₁ ≠ 0 := hgap_pos.ne' + have hgap_le : ρ₂ - ρ₁ ≤ (2 / 3 : ℝ) := + coarseCaccioppoli_gap_le_two_thirds hρ₁ hlt hρ₂ + field_simp [hgap_ne] + nlinarith + +theorem coarseCaccioppoli_pow_scale_le_mul_gapInv_of_triadicGapScaleChoice + {k : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hρ : ρ₁ < ρ₂) : + (3 : ℝ) ^ k ≤ 81 * coarseCaccioppoliGapInv ρ₁ ρ₂ := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hρ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ k := by positivity + have hpow_ne : (3 : ℝ) ^ k ≠ 0 := by positivity + have hscaled : + ((3 : ℝ) ^ k) * ((1 / 81 : ℝ) * (ρ₂ - ρ₁)) ≤ 1 := by + calc + ((3 : ℝ) ^ k) * ((1 / 81 : ℝ) * (ρ₂ - ρ₁)) + ≤ ((3 : ℝ) ^ k) * (((3 : ℝ) ^ k)⁻¹) := by + exact mul_le_mul_of_nonneg_left hchoice.1 hpow_nonneg + _ = 1 := by rw [mul_inv_cancel₀ hpow_ne] + have hmain : (3 : ℝ) ^ k * (ρ₂ - ρ₁) ≤ 81 := by + nlinarith + have hdiv : (3 : ℝ) ^ k ≤ 81 / (ρ₂ - ρ₁) := by + exact (le_div_iff₀ hgap_pos).2 <| by + simpa [mul_comm, mul_left_comm, mul_assoc] using hmain + simpa [coarseCaccioppoliGapInv_eq_inv, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + using hdiv + +theorem coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice + {k : ℕ} {ρ₁ ρ₂ : ℝ} + (hchoice : CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂) + (hρ : ρ₁ < ρ₂) : + 27 * coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ (3 : ℝ) ^ k := by + have hgap_pos : 0 < ρ₂ - ρ₁ := sub_pos.mpr hρ + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ k := by positivity + have hpow_ne : (3 : ℝ) ^ k ≠ 0 := by positivity + have hscaled : + 1 ≤ ((3 : ℝ) ^ k) * ((1 / 27 : ℝ) * (ρ₂ - ρ₁)) := by + calc + 1 = ((3 : ℝ) ^ k) * (((3 : ℝ) ^ k)⁻¹) := by rw [mul_inv_cancel₀ hpow_ne] + _ ≤ ((3 : ℝ) ^ k) * ((1 / 27 : ℝ) * (ρ₂ - ρ₁)) := by + exact mul_le_mul_of_nonneg_left hchoice.2 hpow_nonneg + have hmain : 27 ≤ (3 : ℝ) ^ k * (ρ₂ - ρ₁) := by + nlinarith + have hdiv : 27 / (ρ₂ - ρ₁) ≤ (3 : ℝ) ^ k := by + exact (div_le_iff₀ hgap_pos).2 <| by + simpa [mul_comm, mul_left_comm, mul_assoc] using hmain + simpa [coarseCaccioppoliGapInv_eq_inv, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + using hdiv + +/-- A stronger triadic-scale absorption estimate, stated using the note's +auxiliary scale `k`, implies the actual absorption condition appearing in the +boundary coefficient bookkeeping. -/ +theorem coarseCaccioppoli_boundary_noteAbsorptionCondition_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) ≤ (27 / 4 : ℝ)) : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h := by + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hscale hρ₁ hlt hρ₂ with ⟨k, hkchoice, hkbound⟩ + have hs1 : s < 1 := by + linarith + have hden_nonneg : 0 ≤ s * (1 - s) := mul_one_sub_nonneg hs.le hs1.le + have htheta_nonneg : 0 ≤ ThetaRatio Q s t a := + thetaRatio_nonneg Q s t a hs.le ht.le + have hpow_nonneg : + 0 ≤ C / (s * (1 - s)) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + refine mul_nonneg ?_ ?_ + · exact mul_nonneg + (div_nonneg hC hden_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + · exact Real.rpow_nonneg htheta_nonneg _ + have hgap_le : coarseCaccioppoliGapInv ρ₁ ρ₂ ≤ ((3 : ℝ) ^ k) / 27 := by + exact (le_div_iff₀ (show (0 : ℝ) < 27 by norm_num)).2 <| by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (coarseCaccioppoli_mul_gapInv_le_pow_scale_of_triadicGapScaleChoice hkchoice hlt) + calc + coarseCaccioppoliBoundaryAlphaOfHeight Q a s t C h ρ₁ ρ₂ + = coarseCaccioppoliGapInv ρ₁ ρ₂ * + (C / (s * (1 - s)) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := by + unfold coarseCaccioppoliBoundaryAlphaOfHeight + ring + _ ≤ ((3 : ℝ) ^ k / 27) * + (C / (s * (1 - s)) * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_right hgap_le hpow_nonneg + _ = (1 / 27 : ℝ) * + (C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := by + ring + _ ≤ (1 / 27 : ℝ) * (27 / 4 : ℝ) := by + exact mul_le_mul_of_nonneg_left hkbound (by norm_num : 0 ≤ (1 / 27 : ℝ)) + _ = (1 / 4 : ℝ) := by norm_num + +/-- The note-facing explicit height choice already implies the absorbability +condition in the boundary bookkeeping. -/ +theorem coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hheight : CoarseCaccioppoliBoundaryHeightChoice Q a s t C h) : + CoarseCaccioppoliBoundaryNoteAbsorptionCondition Q a s t C h := by + apply coarseCaccioppoli_boundary_noteAbsorptionCondition_of_triadicGapScaleChoice + Q a s t C h hC hs ht hst + intro ρ₁ ρ₂ hρ₁ hlt hρ₂ + rcases hheight hρ₁ hlt hρ₂ with ⟨k, hkchoice, -, hkbound⟩ + refine ⟨k, hkchoice, ?_⟩ + exact le_trans hkbound (by norm_num) + +/-- The interior note-specific absorption condition currently follows from the +same stronger triadic-scale estimate as the boundary version. -/ +theorem coarseCaccioppoli_interior_noteAbsorptionCondition_of_triadicGapScaleChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hscale : + ∀ ⦃ρ₁ ρ₂ : ℝ⦄, (1 / 3 : ℝ) ≤ ρ₁ → ρ₁ < ρ₂ → ρ₂ ≤ 1 → + ∃ k : ℕ, CoarseCaccioppoliTriadicGapScaleChoice k ρ₁ ρ₂ ∧ + C / (s * (1 - s)) * (3 : ℝ) ^ k * + Real.rpow (3 : ℝ) (-coarseCaccioppoliSigma s t * h ρ₁ ρ₂) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) ≤ (27 / 4 : ℝ)) : + CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h := by + exact coarseCaccioppoli_boundary_noteAbsorptionCondition_of_triadicGapScaleChoice + Q a s t C h hC hs ht hst hscale + +/-- The same explicit `h`-choice bookkeeping also discharges the interior +absorption condition. -/ +theorem coarseCaccioppoli_interior_noteAbsorptionCondition_of_heightChoice + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s t C : ℝ) + (h : ℝ → ℝ → ℝ) + (hC : 0 ≤ C) (hs : 0 < s) (ht : 0 < t) (hst : s + t < 1) + (hheight : CoarseCaccioppoliInteriorHeightChoice Q a s t C h) : + CoarseCaccioppoliInteriorNoteAbsorptionCondition Q a s t C h := by + exact coarseCaccioppoli_boundary_noteAbsorptionCondition_of_heightChoice + Q a s t C h hC hs ht hst hheight + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliCutoffProduct.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliCutoffProduct.lean new file mode 100644 index 0000000000..558ccfa2b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliCutoffProduct.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.SplitPairing + +/-! +# Cutoff-product bridge for coarse Caccioppoli + +Compatibility wrapper for the cutoff-product subdirectory. The development now +lives in `Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.*`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliEnergyBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliEnergyBridge.lean new file mode 100644 index 0000000000..6914a3d8bd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliEnergyBridge.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalizedEnergyProfile +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimate +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.LocalEstimateFullDual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.DescendantSummationFullDual + +/-! +# Energy bridges for coarse Caccioppoli + +Compatibility wrapper for the energy-bridge subdirectory. The development now +lives in `Homogenization.Deterministic.CoarseCaccioppoli.EnergyBridge.*`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalBridge.lean new file mode 100644 index 0000000000..ecb6a7ebda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalBridge.lean @@ -0,0 +1,366 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise + +/-! # Coarse Caccioppoli Local Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + {d : ℕ} (Q : TriadicCube d) (u g : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage Q (fun x => vecDot (u x) (g x)) = + vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) + + cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x)) := by + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hg_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp g i hg + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hgFluct_comp : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => cubeFluctuationVec Q g x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp (cubeFluctuationVec Q g) i hgFluct + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + simpa [Pi.mul_apply, mul_comm] using! (hu_comp i).integrable_mul (hg_comp i) + have hIntFluct : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * cubeFluctuationVec Q g x i) + (normalizedCubeMeasure Q) := by + intro i + simpa [Pi.mul_apply, mul_comm] using! (hu_comp i).integrable_mul (hgFluct_comp i) + calc + cubeAverage Q (fun x => vecDot (u x) (g x)) + = ∑ i, cubeBesovPairing Q (fun x => u x i) (fun x => g x i) := by + exact cubeAverage_vecDot_eq_sum_cubeBesovPairing Q u g hInt + _ = ∑ i, (cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i) + + cubeBesovPairing Q (fun x => u x i) + (fun x => cubeFluctuationVec Q g x i)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + calc + cubeBesovPairing Q (fun x => u x i) (fun x => g x i) + = cubeBesovPairing Q (fun x => u x i) + (fun x => cubeAverage Q (fun y => g y i) + cubeFluctuationVec Q g x i) := by + congr 1 + funext x + simp [cubeFluctuationVec, cubeAverageVec] + _ = cubeAverage Q (fun x => u x i * cubeAverage Q (fun y => g y i)) + + cubeBesovPairing Q (fun x => u x i) + (fun x => cubeFluctuationVec Q g x i) := by + have hsplit : + (fun x => u x i * + (cubeAverage Q (fun y => g y i) + cubeFluctuationVec Q g x i)) = + (fun x => u x i * cubeAverage Q (fun y => g y i) + + u x i * cubeFluctuationVec Q g x i) := by + funext x + ring + have hIntConst : + MeasureTheory.Integrable + (fun x => u x i * cubeAverage Q (fun y => g y i)) + (normalizedCubeMeasure Q) := by + have huInt : + MeasureTheory.Integrable (fun x => u x i) + (normalizedCubeMeasure Q) := + (hu_comp i).integrable (by norm_num) + have hIntConst' : + MeasureTheory.Integrable + (fun x => cubeAverage Q (fun y => g y i) * u x i) + (normalizedCubeMeasure Q) := + huInt.const_mul (cubeAverage Q (fun y => g y i)) + simpa [mul_comm] using hIntConst' + unfold cubeBesovPairing + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + rw [hsplit] + rw [MeasureTheory.integral_add hIntConst (hIntFluct i)] + rw [← cubeAverage_eq_integral_normalizedCubeMeasure Q + (fun x => u x i * cubeAverage Q (fun y => g y i))] + rw [← cubeAverage_eq_integral_normalizedCubeMeasure Q + (fun x => u x i * cubeFluctuationVec Q g x i)] + _ = cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i) + + cubeBesovPairing Q (fun x => u x i) + (fun x => cubeFluctuationVec Q g x i) := by + have hconst : + (fun x => u x i * cubeAverage Q (fun y => g y i)) = + fun x => cubeAverage Q (fun y => g y i) * u x i := by + funext x + ring + rw [hconst, cubeAverage_const_mul] + ring + _ = (∑ i, cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i)) + + ∑ i, cubeBesovPairing Q (fun x => u x i) + (fun x => cubeFluctuationVec Q g x i) := by + rw [Finset.sum_add_distrib] + _ = vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) + + cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x)) := by + rw [cubeAverage_vecDot_eq_sum_cubeBesovPairing Q u (cubeFluctuationVec Q g) hIntFluct] + simp [vecDot, cubeAverageVec] + +theorem abs_vecDot_cubeAverageVec_le_sum_norm_mul_norm {d : ℕ} + (Q : TriadicCube d) (u g : Vec d → Vec d) : + |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g)| ≤ + ∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖ := by + calc + |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g)| + = |∑ i, cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i)| := by + simp [vecDot, cubeAverageVec] + _ ≤ ∑ i, |cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i)| := by + exact Finset.abs_sum_le_sum_abs (s := Finset.univ) + (f := fun i : Fin d => cubeAverage Q (fun x => u x i) * cubeAverage Q (fun x => g x i)) + _ = ∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖ := by + refine Finset.sum_congr rfl ?_ + intro i hi + rw [abs_mul, Real.norm_eq_abs, Real.norm_eq_abs] + +theorem abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hdecomp := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q u g hu hg + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + = |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) + + cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + rw [hdecomp] + _ ≤ |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g)| + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact abs_add_le _ _ + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact add_le_add + (abs_vecDot_cubeAverageVec_le_sum_norm_mul_norm Q u g) le_rfl + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact add_le_add le_rfl + (abs_cubeAverage_vecDot_fluctuationVec_le_sum_note_terms_of_partialBounds + Q s u g hs hu hg hBg hneg hpos) + +/-- Sharp average/fluctuation split for the vector product. Compared with +`abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds`, +the fluctuation piece uses the sharp Besov duality bound and therefore does +not carry the extra positive average tail on the flux side. -/ +theorem abs_cubeAverage_vecDot_le_sum_average_terms_add_sharp_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hdecomp := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q u g hu hg + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + = |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) + + cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + rw [hdecomp] + _ ≤ |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g)| + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact abs_add_le _ _ + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact add_le_add + (abs_vecDot_cubeAverageVec_le_sum_norm_mul_norm Q u g) le_rfl + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact add_le_add le_rfl + (abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_partialBounds + Q s u g hs hu hg hBg hneg hpos) + +theorem abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (havg : cubeAverageVec Q g = 0) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hmain := + abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds + Q s u g hs hu hg hBg hneg hpos + have hmean_zero : + ∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖ = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + have hgi : cubeAverage Q (fun x => g x i) = 0 := by + simpa [cubeAverageVec] using congrFun havg i + rw [hgi] + simp + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := hmain + _ = ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + rw [hmean_zero, zero_add] + +theorem abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hdecomp := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q u g hu hg + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + = |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) + + cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + rw [hdecomp] + _ ≤ |vecDot (cubeAverageVec Q u) (cubeAverageVec Q g)| + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact abs_add_le _ _ + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + exact add_le_add + (abs_vecDot_cubeAverageVec_le_sum_norm_mul_norm Q u g) le_rfl + _ ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact add_le_add le_rfl + (abs_cubeAverage_vecDot_fluctuationVec_le_sum_note_terms_of_partialBounds_two_two + Q s u g hs hu hg hBg hneg hpos) + +theorem abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (havg : cubeAverageVec Q g = 0) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hmain := + abs_cubeAverage_vecDot_le_sum_average_terms_add_note_terms_of_partialBounds_two_two + Q s u g hs hu hg hBg hneg hpos + have hmean_zero : + ∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖ = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + have hgi : cubeAverage Q (fun x => g x i) = 0 := by + simpa [cubeAverageVec] using congrFun havg i + rw [hgi] + simp + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ (∑ i, ‖cubeAverage Q (fun x => u x i)‖ * ‖cubeAverage Q (fun x => g x i)‖) + + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := hmain + _ = ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + rw [hmean_zero, zero_add] + +/-- Sharp centered `q = 2` vector pairing bound. The depth-zero negative +seminorm absorbs the average contribution, so no separate average tail remains +when the second field has zero cube average. -/ +theorem abs_cubeAverage_vecDot_le_sharp_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (havg : cubeAverageVec Q g = 0) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hdecomp := + cubeAverage_vecDot_eq_vecDot_cubeAverageVec_add_cubeAverage_vecDot_fluctuationVec + Q u g hu hg + have hmean_zero : + vecDot (cubeAverageVec Q u) (cubeAverageVec Q g) = 0 := by + simp [havg, vecDot_zero_right] + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + = |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| := by + rw [hdecomp, hmean_zero, zero_add] + _ ≤ (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := + abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_partialBounds_two_two + Q s u g hs hu hg hBg hneg hpos + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalGradientBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalGradientBridge.lean new file mode 100644 index 0000000000..dd1285fb19 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliLocalGradientBridge.lean @@ -0,0 +1,310 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Correctors + +/-! # Coarse Caccioppoli Local Gradient Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem abs_cubeAverage_vecDot_grad_le_note_terms_of_partialBounds_of_h10OnCube + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (φ : H10Function (cubeSet Q)) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad : MeasureTheory.MemLp (fun x => φ.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => φ.toH1Function.grad x) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (φ.toH1Function.grad x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + apply abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero + Q s u (fun x => φ.toH1Function.grad x) hs hu hgrad hBg + · exact cubeAverageVec_grad_eq_zero_of_h10OnCube Q φ + · exact hneg + · exact hpos + +namespace ZeroTraceDirichletCorrectorData + +theorem cubeAverage_energy_identity_sub_const + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] + (ρ : ZeroTraceDirichletCorrectorData Q a g) + (hmem : MemVectorL2 (cubeSet Q) g) (c : Vec d) : + cubeAverage Q + (fun x => + vecDot (ρ.toH10.toH1Function.grad x) + (matVecMul (a x) (ρ.toH10.toH1Function.grad x))) = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := by + unfold cubeAverage + rw [ρ.weakSolution.energy_identity_sub_const hmem c] + +/-- Corrector identity averaged in the intrinsic coefficient energy. -/ +theorem cubeAverage_coefficientEnergy_identity_sub_const + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] + (ρ : ZeroTraceDirichletCorrectorData Q a g) + (hmem : MemVectorL2 (cubeSet Q) g) (c : Vec d) : + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := by + unfold cubeAverage + rw [ρ.weakSolution.coefficientEnergy_identity_sub_const hmem c] + +theorem coefficientEnergy_average_le_note_terms_of_partialBounds_sub_const + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) (c : Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hmem : MemVectorL2 (cubeSet Q) g) + (hu : MeasureTheory.MemLp (fun x => g x - c) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N (fun x => g x - c) ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ Bg) : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hpair : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := + ρ.cubeAverage_coefficientEnergy_identity_sub_const hmem c + have hnote : + |cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + simpa using + abs_cubeAverage_vecDot_grad_le_note_terms_of_partialBounds_of_h10OnCube + Q s (fun x => g x - c) ρ.toH10 hs hu hgrad hBg hneg hpos + calc + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) + = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := hpair + _ ≤ |cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x))| := + le_abs_self _ + _ ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := hnote + +theorem abs_cubeAverage_vecDot_grad_le_note_terms_of_partialBounds_of_h10OnCube_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (φ : H10Function (cubeSet Q)) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad : MeasureTheory.MemLp (fun x => φ.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => φ.toH1Function.grad x) ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (φ.toH1Function.grad x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + apply abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + Q s u (fun x => φ.toH1Function.grad x) hs hu hgrad hBg + · exact cubeAverageVec_grad_eq_zero_of_h10OnCube Q φ + · exact hneg + · exact hpos + +theorem coefficientEnergy_average_le_note_terms_of_partialBounds_sub_const_two_two + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) (c : Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hmem : MemVectorL2 (cubeSet Q) g) + (hu : MeasureTheory.MemLp (fun x => g x - c) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => g x - c) ≤ Bu) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ Bg) : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hpair : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := + ρ.cubeAverage_coefficientEnergy_identity_sub_const hmem c + have hnote : + |cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + simpa using + abs_cubeAverage_vecDot_grad_le_note_terms_of_partialBounds_of_h10OnCube_two_two + Q s (fun x => g x - c) ρ.toH10 hs hu hgrad hBg hneg hpos + calc + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) + = + cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x)) := hpair + _ ≤ |cubeAverage Q (fun x => vecDot (g x - c) (ρ.toH10.toH1Function.grad x))| := + le_abs_self _ + _ ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => (g x - c) i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := hnote + +theorem coefficientEnergy_average_le_collapsed_note_term_centered_two_two + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) {Bρ Bg : ℝ} + (hs : 0 < s) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ Bρ) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ Bg) : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := by + have hcentered : + MeasureTheory.MemLp (fun x => g x - cubeAverageVec Q g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q g) + simpa using! hg.sub hconst + have havg_g : + cubeAverageVec Q (fun x => g x - cubeAverageVec Q g) = 0 := by + rw [cubeAverageVec_sub_const Q g (cubeAverageVec Q g) hg] + simp + have hnote_raw : + |cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bρ) + + cubeBesovScaleWeight s Q * + ‖cubeAverage Q (fun x => ρ.toH10.toH1Function.grad x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + Q s (fun x => ρ.toH10.toH1Function.grad x) + (fun x => g x - cubeAverageVec Q g) + hs hgrad hcentered hBg havg_g hneg hpos + have havg_ρ : + cubeAverageVec Q (fun x => ρ.toH10.toH1Function.grad x) = 0 := + cubeAverageVec_grad_eq_zero_of_h10OnCube Q ρ.toH10 + have hsum_zero : + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bρ) + + cubeBesovScaleWeight s Q * + ‖cubeAverage Q (fun x => ρ.toH10.toH1Function.grad x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) = + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bρ)) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hi0 : cubeAverage Q (fun x => ρ.toH10.toH1Function.grad x i) = 0 := by + simpa [cubeAverageVec] using congrFun havg_ρ i + rw [hi0] + simp + have hcollapse : + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bρ)) * + (cubeBesovScaleWeight s Q * Bg)) = + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := by + have hterm : + (((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bρ)) * + (cubeBesovScaleWeight s Q * Bg)) = + (3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg := by + calc + (((3 : ℝ) ^ ((d : ℝ) + s) * (cubeBesovScaleWeight (-s) Q * Bρ)) * + (cubeBesovScaleWeight s Q * Bg)) + = + (cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := by + ring + _ = (3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg := by + rw [cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight, one_mul] + rw [Finset.sum_const, nsmul_eq_mul, Finset.card_univ, Fintype.card_fin, hterm] + have hnote : + |cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g))| ≤ + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := by + rw [hsum_zero] at hnote_raw + rw [hcollapse] at hnote_raw + exact hnote_raw + have hpair : + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) = + cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g)) := by + calc + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) + = + cubeAverage Q + (fun x => vecDot (g x - cubeAverageVec Q g) + (ρ.toH10.toH1Function.grad x)) := by + exact ρ.cubeAverage_coefficientEnergy_identity_sub_const + hmem (cubeAverageVec Q g) + _ = + cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g)) := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => vecDot_comm _ _ + calc + cubeAverage Q (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) + = + cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g)) := hpair + _ ≤ + |cubeAverage Q + (fun x => vecDot (ρ.toH10.toH1Function.grad x) + (g x - cubeAverageVec Q g))| := le_abs_self _ + _ ≤ (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := hnote + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliSingleCubeToRaw.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliSingleCubeToRaw.lean new file mode 100644 index 0000000000..baef550f3f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseCaccioppoliSingleCubeToRaw.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.QuantitativeCutoffInputs +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.FinalWrappers +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicQuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCoefficientBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicScalarControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicGradientControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicCanonicalGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.HarmonicFinal + +/-! +# From single-cube Caccioppoli to the radius raw estimate + +Compatibility wrapper for the single-cube-to-raw subdirectory. The development +now lives in `Homogenization.Deterministic.CoarseCaccioppoli.SingleCubeToRaw.*`. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse.lean new file mode 100644 index 0000000000..1170cf9087 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.PrivateLemmas +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.EnergyForm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSCorrections +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSScalarAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantEnvelope +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApex +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexComponent +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletTail +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEstimates +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBV +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBVForce +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletWeakFluxScalarAdequacy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged + +/-! # Coarse Flux Response -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/EnergyForm.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/EnergyForm.lean new file mode 100644 index 0000000000..3afc7f52fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/EnergyForm.lean @@ -0,0 +1,455 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.PrivateLemmas +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds + +/-! # Energy Form -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators MatrixOrder Pointwise + + +/-- Single-cube response-control theorem for the actual flux defect measured +against the natural `symmPart a0` energy form. -/ +theorem cubeAverageFluxDefect_energyForm_le_normalizedBlockResponseMax_mul_energyAverage_of_scalarCanonicalMaximizer + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (w : AHarmonicFunction a (cubeSet R)) + (v : ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)))) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x))))) a) : + vecDot + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x))) + (matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)))) + ≤ + ((4 : ℝ) * normalizedBlockResponseMax R a a0) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + let := isFiniteMeasureVolumeMeasureOnCubeSet R + let defect : Vec d → Vec d := + fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x) + let D : Vec d := cubeAverageVec R defect + let ξ : Vec d := matVecMul ((symmPart a0)⁻¹) D + let P : BlockVec d := (0, D) + let Q0 : BlockVec d := blockMatVecMul (blockMatrixOfCoeff a0) P + have hsdet : IsUnit (symmPart a0).det := isUnit_det_symmPart_of_isEllipticMatrix ha0 + have hsξ : matVecMul (symmPart a0) ξ = D := by + dsimp [ξ] + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hsdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hQ0snd : Q0.2 = ξ := by + change (blockMatVecMul (blockMatrixOfCoeff a0) ((0 : Vec d), D)).2 = ξ + rw [blockMatVecMul_blockMatrixOfCoeff_snd] + simp [ξ, matVecMul_zero] + have hQ0fst : Q0.1 = matVecMul (skewPart a0) ξ := by + change (blockMatVecMul (blockMatrixOfCoeff a0) ((0 : Vec d), D)).1 = + matVecMul (skewPart a0) ξ + rw [blockMatVecMul_blockMatrixOfCoeff_fst] + simp [ξ, matVecMul_zero] + have hsplit : a0 = symmPart a0 + skewPart a0 := by + ext i j + simp [symmPart, skewPart, sub_eq_add_neg] + ring + have hsplitT : matTranspose a0 = symmPart a0 - skewPart a0 := by + ext i j + simp [symmPart, skewPart, matTranspose, sub_eq_add_neg] + ring + have hresp_le : + ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a ≤ + (2 : ℝ) * BlockJ (cubeSet R) P Q0 a := by + have hvol : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hblock : + BlockJ (cubeSet R) P Q0 a = + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet R) (ξ) (matVecMul a0 ξ) + (Homogenization.adjointCoeffField a) := by + have hq : + Q0.1 - D = -matVecMul (matTranspose a0) ξ := by + rw [hQ0fst] + rw [show D = matVecMul (symmPart a0) ξ by simpa using hsξ.symm] + rw [hsplitT] + ext i + simp [matVecMul, sub_eq_add_neg] + have hsum : + ∑ x, (symmPart a0 i x + -skewPart a0 i x) * ξ x = + ∑ x, symmPart a0 i x * ξ x + ∑ x, (-skewPart a0 i x) * ξ x := by + calc + ∑ x, (symmPart a0 i x + -skewPart a0 i x) * ξ x = + ∑ x, (symmPart a0 i x * ξ x + (-skewPart a0 i x) * ξ x) := by + refine Finset.sum_congr rfl ?_ + intro x hx + ring + _ = ∑ x, symmPart a0 i x * ξ x + ∑ x, (-skewPart a0 i x) * ξ x := by + rw [Finset.sum_add_distrib] + rw [hsum] + have hnegSkew : + -(∑ x, -skewPart a0 i x * ξ x) = ∑ x, skewPart a0 i x * ξ x := by + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl ?_ + intro x hx + ring + calc + ∑ j, skewPart a0 i j * ξ j + -∑ j, symmPart a0 i j * ξ j = + -∑ j, symmPart a0 i j * ξ j + -(∑ j, -skewPart a0 i j * ξ j) := by + rw [hnegSkew] + ring + _ = -(∑ x, symmPart a0 i x * ξ x + ∑ x, -skewPart a0 i x * ξ x) := by + ring + have hqa : + Q0.1 + D = matVecMul a0 ξ := by + rw [hQ0fst] + rw [show D = matVecMul (symmPart a0) ξ by simpa using hsξ.symm] + rw [hsplit] + ext i + simp [symmPart, skewPart, matVecMul, sub_eq_add_neg] + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl ?_ + intro x hx + ring + rw [show Q0 = (Q0.1, ξ) by ext <;> simp [hQ0snd]] + change BlockJ (cubeSet R) ((0 : Vec d), D) (Q0.1, ξ) a = + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet R) ξ (matVecMul a0 ξ) (Homogenization.adjointCoeffField a) + rw [blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) (U := cubeSet R) (measurableSet_cubeSet R) hEll hvol + (p := 0) (pStar := ξ) (q := D) (qStar := Q0.1)] + simp [hq, hqa] + have hadj_nonneg : + 0 ≤ ResponseJ (cubeSet R) ξ (matVecMul a0 ξ) (Homogenization.adjointCoeffField a) := + responseJ_nonneg (cubeSet R) ξ (matVecMul a0 ξ) (Homogenization.adjointCoeffField a) + linarith [hblock, hadj_nonneg] + have hblock_le : + BlockJ (cubeSet R) P Q0 a ≤ normalizedBlockResponseMax R a a0 * + vecDot D ξ := by + have hquadratic : + blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) = vecDot D ξ := by + dsimp [P, ξ] + rw [blockMatrixOfCoeff_quadratic_eq] + simp [vecDot_zero_left, matVecMul_zero] + calc + BlockJ (cubeSet R) P Q0 a + ≤ normalizedBlockResponseMax R a a0 * + blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) := by + simpa [Q0] using + blockJ_le_normalizedBlockResponseMax_mul_blockQuadratic_of_isEllipticMatrix + R a a0 hEll ha0 P + _ = normalizedBlockResponseMax R a a0 * vecDot D ξ := by rw [hquadratic] + have hlin : + (vecDot D ξ) ^ 2 ≤ + cubeAverage R (scalarVariationEnergyIntegrand a w) * + (2 * ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a) := by + let avgGrad : Vec d := fun i => volumeAverage (cubeSet R) (fun x => w.toH1.grad x i) + let avgFlux : Vec d := + fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i) + have hraw := + ScalarCanonicalMaximizer.linearResponseSq + (U := cubeSet R) (a := a) (p := -ξ) (q := -matVecMul (matTranspose a0) ξ) + (lam := lam) (Lam := Lam) v hEll + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w + have havgGrad : + cubeAverageVec R (fun x => w.toH1.grad x) = avgGrad := by + funext i + simp [avgGrad, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have havgFlux : + cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x)) = avgFlux := by + funext i + simp [avgFlux, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have hD : + D = avgFlux - matVecMul a0 avgGrad := by + ext i + have hgradCoord : + ∀ j : Fin d, MeasureTheory.IntegrableOn (fun x => w.toH1.grad x j) (cubeSet R) := by + intro j + exact CorrectionFieldData.integrableOn_coord_of_memVectorL2 w.toH1.grad_memVectorL2 j + have hfluxMem : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have hfluxCoord : + ∀ j : Fin d, + MeasureTheory.IntegrableOn + (fun x => matVecMul (a x) (w.toH1.grad x) j) (cubeSet R) := by + intro j + exact CorrectionFieldData.integrableOn_coord_of_memVectorL2 hfluxMem j + have hA0avg : + volumeAverage (cubeSet R) (fun x => matVecMul a0 (w.toH1.grad x) i) = + matVecMul a0 avgGrad i := by + calc + volumeAverage (cubeSet R) (fun x => matVecMul a0 (w.toH1.grad x) i) + = ∑ j, volumeAverage (cubeSet R) (fun x => a0 i j * w.toH1.grad x j) := by + rw [show (fun x => matVecMul a0 (w.toH1.grad x) i) = + fun x => ∑ j, a0 i j * w.toH1.grad x j by + funext x + simp [matVecMul]] + exact volumeAverage_sum (U := cubeSet R) Finset.univ + (fun j x => a0 i j * w.toH1.grad x j) + (fun j hj => (hgradCoord j).const_mul (a0 i j)) + _ = ∑ j, a0 i j * volumeAverage (cubeSet R) (fun x => w.toH1.grad x j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + rw [show (fun x => a0 i j * w.toH1.grad x j) = + (a0 i j) • fun x => w.toH1.grad x j by + funext x + simp] + rw [volumeAverage_smul] + _ = matVecMul a0 avgGrad i := by + simp [avgGrad, matVecMul] + calc + D i = volumeAverage (cubeSet R) (fun x => defect x i) := by + simp [D, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + _ = volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i) - + volumeAverage (cubeSet R) (fun x => matVecMul a0 (w.toH1.grad x) i) := by + apply volumeAverage_sub (hfluxCoord i) + have hsum : + MeasureTheory.IntegrableOn + (fun x => ∑ j, a0 i j * w.toH1.grad x j) (cubeSet R) := by + refine MeasureTheory.integrable_finsetSum Finset.univ ?_ + intro j hj + exact (hgradCoord j).const_mul (a0 i j) + simpa [defect, matVecMul] using hsum + _ = avgFlux i - volumeAverage (cubeSet R) (fun x => matVecMul a0 (w.toH1.grad x) i) := by + simp [avgFlux] + _ = avgFlux i - matVecMul a0 avgGrad i := by + rw [hA0avg] + have hleft : + volumeAverage (cubeSet R) (fun x => vecDot (-matVecMul (matTranspose a0) ξ) (w.toH1.grad x)) - + volumeAverage (cubeSet R) (fun x => vecDot (-ξ) (matVecMul (a x) (w.toH1.grad x))) = + vecDot D ξ := by + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + (cubeSet R) a (-ξ) (-matVecMul (matTranspose a0) ξ) + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w + calc + volumeAverage (cubeSet R) (fun x => vecDot (-matVecMul (matTranspose a0) ξ) (w.toH1.grad x)) - + volumeAverage (cubeSet R) (fun x => vecDot (-ξ) (matVecMul (a x) (w.toH1.grad x))) = + vecDot (-matVecMul (matTranspose a0) ξ) avgGrad - vecDot (-ξ) avgFlux := by + simpa [avgGrad, avgFlux] using hpair + _ = -vecDot (matVecMul a0 avgGrad) ξ + vecDot ξ avgFlux := by + rw [vecDot_neg_left, vecDot_neg_left] + rw [vecDot_comm (matVecMul (matTranspose a0) ξ) avgGrad] + rw [vecDot_matVecMul_transpose avgGrad ξ a0] + ring + _ = vecDot ξ avgFlux - vecDot ξ (matVecMul a0 avgGrad) := by + rw [vecDot_comm (matVecMul a0 avgGrad) ξ] + ring + _ = vecDot ξ (avgFlux - matVecMul a0 avgGrad) := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] + _ = vecDot ξ D := by rw [hD] + _ = vecDot D ξ := by rw [vecDot_comm] + have hleft' : + cubeAverage R (fun x => vecDot (-matVecMul (matTranspose a0) ξ) (w.toH1.grad x)) - + cubeAverage R (fun x => vecDot (-ξ) (matVecMul (a x) (w.toH1.grad x))) = + vecDot D ξ := by + simpa [volumeAverage_cubeSet_eq_cubeAverage] using hleft + have hraw' : + (cubeAverage R (fun x => vecDot (-matVecMul (matTranspose a0) ξ) (w.toH1.grad x)) - + cubeAverage R (fun x => vecDot (-ξ) (matVecMul (a x) (w.toH1.grad x)))) ^ 2 ≤ + cubeAverage R (scalarVariationEnergyIntegrand a w) * + (2 * ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a) := by + simpa [volumeAverage_cubeSet_eq_cubeAverage] using hraw + have hleft_sq : + (vecDot D ξ) ^ 2 = + (cubeAverage R (fun x => vecDot (-matVecMul (matTranspose a0) ξ) (w.toH1.grad x)) - + cubeAverage R (fun x => vecDot (-ξ) (matVecMul (a x) (w.toH1.grad x)))) ^ 2 := by + rw [hleft'] + rw [hleft_sq] + exact hraw' + have ht_nonneg : + 0 ≤ vecDot D ξ := by + have hlower := lowerBound_symmPartInv_of_isEllipticMatrix ha0 D + rcases ha0 with ⟨hlam0_pos, hlam0Lam0, -, -⟩ + have hLam0_pos : 0 < Lam0 := lt_of_lt_of_le hlam0_pos hlam0Lam0 + have hcoeff_nonneg : 0 ≤ lam0 * (Lam0⁻¹ * Lam0⁻¹) := by + positivity + have hterm_nonneg : 0 ≤ (lam0 * (Lam0⁻¹ * Lam0⁻¹)) * vecNormSq D := by + exact mul_nonneg hcoeff_nonneg (vecNormSq_nonneg D) + simpa [ξ, D] using (le_trans hterm_nonneg hlower) + by_cases ht : vecDot D ξ = 0 + · rw [ht] + have henergy_nonneg : 0 ≤ cubeAverage R (scalarVariationEnergyIntegrand a w) := by + simpa [volumeAverage_cubeSet_eq_cubeAverage] using + (volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (U := cubeSet R) a hEll w) + nlinarith [normalizedBlockResponseMax_nonneg R a a0, henergy_nonneg] + · have ht_pos : 0 < vecDot D ξ := lt_of_le_of_ne ht_nonneg (by simpa [eq_comm] using ht) + have hresp_scaled : + (2 : ℝ) * ResponseJ (cubeSet R) (-ξ) (-matVecMul (matTranspose a0) ξ) a ≤ + (4 : ℝ) * normalizedBlockResponseMax R a a0 * vecDot D ξ := by + nlinarith [hresp_le, hblock_le] + have henergy_nonneg : + 0 ≤ cubeAverage R (scalarVariationEnergyIntegrand a w) := by + simpa [volumeAverage_cubeSet_eq_cubeAverage] using + (volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (U := cubeSet R) a hEll w) + have hsq : + (vecDot D ξ) ^ 2 ≤ + cubeAverage R (scalarVariationEnergyIntegrand a w) * + ((4 : ℝ) * normalizedBlockResponseMax R a a0 * vecDot D ξ) := by + exact le_trans hlin <| mul_le_mul_of_nonneg_left hresp_scaled henergy_nonneg + nlinarith [hsq] + +/-- Descendant-local Chapter-3 witness package for the actual flux defect +relative to the constant matrix `a0`. -/ +def DescendantScalarCanonicalFluxDefectData {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (a0 : Mat d) (defect : Vec d → Vec d) + (energy : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∃ lam, ∃ Lam, ∃ w : AHarmonicFunction a (cubeSet R), + IsEllipticFieldOn lam Lam (cubeSet R) a ∧ + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) (cubeAverageVec R defect)) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) (cubeAverageVec R defect))) a) ∧ + (∀ x ∈ cubeSet R, + defect x = matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)) ∧ + (∀ x ∈ cubeSet R, energy x = scalarVariationEnergyIntegrand a w x) + +/-- Descendant-local Chapter-3 witness package for the actual flux defect of a +single global harmonic field on `cubeSet Q`. Each descendant comes with a +local harmonic witness whose gradient agrees with the global field on that +cube and which carries the needed scalar canonical maximizer. -/ +def DescendantScalarCanonicalFluxDefectAHarmonicData {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (a0 : Mat d) (u : AHarmonicFunction a (cubeSet Q)) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∃ lam, ∃ Lam, ∃ w : AHarmonicFunction a (cubeSet R), + IsEllipticFieldOn lam Lam (cubeSet R) a ∧ + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)))) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x))))) a) ∧ + (∀ x ∈ cubeSet R, w.toH1.grad x = u.toH1.grad x) + +theorem descendantScalarCanonicalFluxDefectData_of_aHarmonicData {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (u : AHarmonicFunction a (cubeSet Q)) + (hdesc : DescendantScalarCanonicalFluxDefectAHarmonicData Q a a0 u) : + DescendantScalarCanonicalFluxDefectData Q a a0 + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (scalarVariationEnergyIntegrand a u) := by + intro j R hR + rcases hdesc j R hR with + ⟨lam, Lam, w, hEll, hv, hgrad⟩ + have hdefect : + ∀ x ∈ cubeSet R, + matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x) = + matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x) := by + intro x hx + simp [hgrad x hx] + have henergy : + ∀ x ∈ cubeSet R, + scalarVariationEnergyIntegrand a u x = scalarVariationEnergyIntegrand a w x := by + intro x hx + simp [scalarVariationEnergyIntegrand, hgrad x hx] + have hv' : + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)))) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x))))) a) := by + rcases hv with ⟨v⟩ + have hdefectavg : + cubeAverageVec R + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) = + cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)) := + cubeAverageVec_eq_of_eq_on_cubeSet hdefect + refine ⟨?_⟩ + simpa [hdefectavg] using v + exact ⟨lam, Lam, w, hEll, hv', hdefect, henergy⟩ + +/-- Every descendant cube of a global harmonic field on `cubeSet Q` carries the +scalar canonical maximizer needed for the flux-defect argument. -/ +theorem descendantScalarCanonicalFluxDefectAHarmonicData_of_aHarmonicFunction + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) : + DescendantScalarCanonicalFluxDefectAHarmonicData Q a a0 u := by + intro j R hR + have hEllR : + IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + let w : AHarmonicFunction a (cubeSet R) := u.restrictToSubcube hEll hR + have hne : Set.Nonempty (cubeSet R) := by + refine ⟨cubeCenter R, openCubeSet_subset_cubeSet R ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R + let : Fact (MeasureTheory.volume (cubeSet R) < ⊤) := by + refine ⟨?_⟩ + simpa using volume_cubeSet_lt_top R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet R)) + infer_instance + have hv : + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x)))) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) + (cubeAverageVec R + (fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x))))) + a) := by + exact + ScalarCanonicalMaximizer.nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := cubeSet R) (a := a) hne + (hodgeConverseCriterion_cubeSet_triadicCube R) hEllR _ _ + refine ⟨lam, Lam, w, hEllR, hv, ?_⟩ + intro x hx + simp [w] + +/-- Direct descendant-local flux-defect witness package for one harmonic field +on `cubeSet Q`, with no separate scalar-canonical assumptions. -/ +theorem descendantScalarCanonicalFluxDefectData_of_aHarmonicFunction + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) : + DescendantScalarCanonicalFluxDefectData Q a a0 + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (scalarVariationEnergyIntegrand a u) := by + exact + descendantScalarCanonicalFluxDefectData_of_aHarmonicData + (Q := Q) (a := a) (a0 := a0) (u := u) + (descendantScalarCanonicalFluxDefectAHarmonicData_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) hEll u) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/PrivateLemmas.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/PrivateLemmas.lean new file mode 100644 index 0000000000..092ece28c4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/PrivateLemmas.lean @@ -0,0 +1,353 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric + +/-! # Private Lemmas -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators MatrixOrder Pointwise + +/-! +# Deterministic coarse-grained flux-response inequalities + +This file packages the Chapter-3 `q = 1` weak-norm estimate for the coarse +flux defect under an explicit one-cube response hypothesis. + +At the current checkpoint we isolate the genuinely local linear-response input +from the downstream multiscale summation argument. The local hypothesis is the +square bound on descendant cube averages that the note proof produces on each +cube, and the main theorem turns it into a note-normalized negative Besov +seminorm estimate with `HomogenizationErrorOnCube`. +-/ + +private theorem ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul {d : ℕ} + (M : FullBlockMat d) (P : BlockVec d) : + ofFullBlockVec (Matrix.mulVec M (toFullBlockVec P)) = + blockMatVecMul (ofFullBlockMat M) P := by + simpa using + (congrArg ofFullBlockVec + (toFullBlockVec_blockMatVecMul (A := ofFullBlockMat M) P)).symm + +private theorem blockMatVecMul_ofFullBlockMat_mul {d : ℕ} + (M N : FullBlockMat d) (P : BlockVec d) : + blockMatVecMul (ofFullBlockMat M) (blockMatVecMul (ofFullBlockMat N) P) = + blockMatVecMul (ofFullBlockMat (M * N)) P := by + rw [← ofFullBlockVec_toFullBlockVec + (blockMatVecMul (ofFullBlockMat M) (blockMatVecMul (ofFullBlockMat N) P))] + rw [← ofFullBlockVec_toFullBlockVec + (blockMatVecMul (ofFullBlockMat (M * N)) P)] + congr 1 + rw [toFullBlockVec_blockMatVecMul, toFullBlockVec_blockMatVecMul, + toFullBlockMat_ofFullBlockMat, toFullBlockMat_ofFullBlockMat] + simp [toFullBlockVec_blockMatVecMul, toFullBlockMat_ofFullBlockMat, + Matrix.mulVec_mulVec] + +private theorem blockVecDot_self_eq_zero {d : ℕ} {P : BlockVec d} + (hP : blockVecDot P P = 0) : + P = 0 := by + rcases P with ⟨p, q⟩ + have hpq : vecNormSq p + vecNormSq q = 0 := by + simpa [blockVecDot, vecNormSq] using hP + have hp : vecNormSq p = 0 := by + nlinarith [vecNormSq_nonneg p, vecNormSq_nonneg q, hpq] + have hq : vecNormSq q = 0 := by + nlinarith [vecNormSq_nonneg p, vecNormSq_nonneg q, hpq] + ext i <;> simp [vecNormSq_eq_zero hp, vecNormSq_eq_zero hq] + +theorem symmPart_eq_of_isSymm {d : ℕ} {A : Mat d} (hA : A.IsSymm) : + symmPart A = A := by + ext i j + have hAij : A j i = A i j := (Matrix.IsSymm.ext_iff.mp hA) i j + simp [symmPart, hAij] + +private theorem blockJValueSet_homogeneous {d : ℕ} (U : Set (Vec d)) (P Q : BlockVec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + blockJValueSet U (c • P) (c • Q) a = (c ^ 2 : ℝ) • blockJValueSet U P Q a := by + ext m + constructor + · intro hm + change ∃ y, y ∈ blockJValueSet U P Q a ∧ (c ^ 2 : ℝ) * y = m + have hm' : (c⁻¹ : ℝ) ^ 2 * m ∈ blockJValueSet U P Q a := by + simpa [smul_smul, hc, pow_two] using + (blockResponse_blockJValueSet_smul_mem (P := c • P) (Q := c • Q) hm c⁻¹) + refine ⟨(c⁻¹ : ℝ) ^ 2 * m, hm', ?_⟩ + field_simp [hc] + · rintro ⟨m', hm', rfl⟩ + simpa [smul_eq_mul] using blockResponse_blockJValueSet_smul_mem hm' c + +private theorem blockJ_homogeneous {d : ℕ} (U : Set (Vec d)) (P Q : BlockVec d) + (a : CoeffField d) {c : ℝ} (hc : c ≠ 0) : + BlockJ U (c • P) (c • Q) a = c ^ 2 * BlockJ U P Q a := by + rw [BlockJ, blockJValueSet_homogeneous U P Q a hc] + simpa [smul_eq_mul] using! + (Real.sSup_smul_of_nonneg (show 0 ≤ (c ^ 2 : ℝ) by positivity) + (blockJValueSet U P Q a)) + +private theorem blockJ_zero_zero_eq_zero_of_isEllipticFieldOn {d : ℕ} + (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) : + BlockJ (cubeSet R) 0 0 a = 0 := by + have hnonneg : 0 ≤ BlockJ (cubeSet R) 0 0 a := + blockJ_nonneg (cubeSet R) 0 0 a + have hvol : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hle : + BlockJ (cubeSet R) (0 : BlockVec d) (0 : BlockVec d) a ≤ + blockResponsePlainUpperBound (d := d) lam Lam (0 : BlockVec d) (0 : BlockVec d) := by + exact blockJ_le_plainUpperBound_of_isEllipticFieldOn + (a := a) (U := cubeSet R) (measurableSet_cubeSet R) hEll hvol 0 0 + have hbound : + blockResponsePlainUpperBound (d := d) lam Lam (0 : BlockVec d) (0 : BlockVec d) = 0 := by + simp [blockResponsePlainUpperBound, blockVecDot, vecDot_zero_right] + have hle0 : BlockJ (cubeSet R) 0 0 a ≤ 0 := by + simpa [hbound] using hle + linarith + +private theorem constantFullBlockMatrix_posDef_of_isEllipticMatrix {d : ℕ} + {lam Lam : ℝ} {a0 : Mat d} (ha0 : IsEllipticMatrix lam Lam a0) : + (constantFullBlockMatrix a0).PosDef := by + classical + let M := constantFullBlockMatrix a0 + have hsymm : M.IsSymm := by + dsimp [M, constantFullBlockMatrix] + simpa using isSymm_toFullBlockMat_of_isSymmetricBlockMat + (isSymmetricBlockMat_blockMatrixOfCoeff a0) + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hsymm + · intro x hx + let X : BlockVec d := ofFullBlockVec x + have hX : X ≠ 0 := by + intro hX0 + apply hx + have hx0 : x = toFullBlockVec (0 : BlockVec d) := by + simpa [X] using congrArg toFullBlockVec hX0 + have hzero : toFullBlockVec (0 : BlockVec d) = (0 : FullBlockVec d) := by + ext i + cases i <;> simp [toFullBlockVec] + simpa [hzero] using hx0 + have hblock : + 0 < blockVecDot X (blockMatVecMul (blockMatrixOfCoeff a0) X) := + blockMatrixOfCoeff_quadratic_pos_of_isEllipticMatrix ha0 hX + have hdot : + 0 < dotProduct (toFullBlockVec X) + (Matrix.mulVec (constantFullBlockMatrix a0) (toFullBlockVec X)) := by + have hEq : + dotProduct (toFullBlockVec X) + (Matrix.mulVec (toFullBlockMat (blockMatrixOfCoeff a0)) (toFullBlockVec X)) = + blockVecDot X (blockMatVecMul (blockMatrixOfCoeff a0) X) := by + rw [← dotProduct_toFullBlockVec X (blockMatVecMul (blockMatrixOfCoeff a0) X)] + simp [toFullBlockVec_blockMatVecMul] + have : + 0 < dotProduct (toFullBlockVec X) + (Matrix.mulVec (toFullBlockMat (blockMatrixOfCoeff a0)) (toFullBlockVec X)) := by + rwa [hEq] + simpa [constantFullBlockMatrix] using this + simpa [M, X] using hdot + +private theorem constantFullBlockMatrixSqrt_isSymm {d : ℕ} (a0 : Mat d) : + (constantFullBlockMatrixSqrt a0).IsSymm := by + let M := constantFullBlockMatrix a0 + have hpsd : (constantFullBlockMatrixSqrt a0).PosSemidef := by + dsimp [constantFullBlockMatrixSqrt, M] + exact (Matrix.nonneg_iff_posSemidef (A := CFC.sqrt M)).mp (CFC.sqrt_nonneg M) + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hpsd.isHermitian + +private theorem fullBlockVecNormSq_constantFullBlockMatrixSqrt_mul_toFullBlockVec_eq {d : ℕ} + {a0 : Mat d} {lam Lam : ℝ} (ha0 : IsEllipticMatrix lam Lam a0) (P : BlockVec d) : + fullBlockVecNormSq + (Matrix.mulVec (constantFullBlockMatrixSqrt a0) (toFullBlockVec P)) = + blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) := by + let S := constantFullBlockMatrixSqrt a0 + let B := ofFullBlockMat S + have hSsymm : S.IsSymm := constantFullBlockMatrixSqrt_isSymm a0 + have hBsymm : IsSymmetricBlockMat B := isSymmetricBlockMat_of_isSymm hSsymm + calc + fullBlockVecNormSq (Matrix.mulVec S (toFullBlockVec P)) = + blockVecDot + (ofFullBlockVec (Matrix.mulVec S (toFullBlockVec P))) + (ofFullBlockVec (Matrix.mulVec S (toFullBlockVec P))) := by + symm + exact blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq _ + _ = blockVecDot (blockMatVecMul B P) (blockMatVecMul B P) := by + rw [ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul] + _ = blockVecDot P (blockMatVecMul B (blockMatVecMul B P)) := by + symm + exact blockVecDot_blockMatVecMul_comm_of_isSymmetricBlockMat hBsymm P + (blockMatVecMul B P) + _ = blockVecDot P (blockMatVecMul (ofFullBlockMat (S * S)) P) := by + rw [blockMatVecMul_ofFullBlockMat_mul] + _ = blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) := by + let M := constantFullBlockMatrix a0 + have hMpos : M.PosDef := constantFullBlockMatrix_posDef_of_isEllipticMatrix + (a0 := a0) ha0 + have hsq : S ^ 2 = M := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using CFC.sq_sqrt M hMpos.posSemidef.nonneg + rw [pow_two] at hsq + rw [hsq] + simp [M, constantFullBlockMatrix] + +private theorem normalizedBlockResponseValueSet_mem_of_blockQuadratic_eq_one {d : ℕ} + (R : TriadicCube d) (a : CoeffField d) {a0 : Mat d} {lam Lam : ℝ} + (ha0 : IsEllipticMatrix lam Lam a0) (P : BlockVec d) + (hquad : + blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) = 1) : + BlockJ (cubeSet R) P (blockMatVecMul (blockMatrixOfCoeff a0) P) a ∈ + normalizedBlockResponseValueSet R a a0 := by + classical + let M := constantFullBlockMatrix a0 + let S := constantFullBlockMatrixSqrt a0 + let e : FullBlockVec d := Matrix.mulVec S (toFullBlockVec P) + have hMpos : M.PosDef := by + dsimp [M] + exact constantFullBlockMatrix_posDef_of_isEllipticMatrix (a0 := a0) ha0 + have hSunit : IsUnit S := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using (CFC.isUnit_sqrt_iff M).2 hMpos.isUnit + have he : fullBlockVecNormSq e = 1 := by + simpa [e] using + (fullBlockVecNormSq_constantFullBlockMatrixSqrt_mul_toFullBlockVec_eq + (a0 := a0) ha0 P).trans hquad + refine ⟨e, he, ?_⟩ + have hP : + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) = P := by + dsimp [constantFullBlockMatrixInvSqrt, e, S] + have hSdet : IsUnit (Matrix.det S) := (Matrix.isUnit_iff_isUnit_det (A := S)).mp hSunit + calc + ofFullBlockVec (Matrix.mulVec S⁻¹ (Matrix.mulVec S (toFullBlockVec P))) = + ofFullBlockVec (Matrix.mulVec (S⁻¹ * S) (toFullBlockVec P)) := by + exact congrArg ofFullBlockVec (Matrix.mulVec_mulVec (toFullBlockVec P) S⁻¹ S) + _ = ofFullBlockVec (toFullBlockVec P) := by + rw [Matrix.nonsing_inv_mul S hSdet] + simp + _ = P := by simp + have hQ : + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) = + blockMatVecMul (blockMatrixOfCoeff a0) P := by + have hsq : S ^ 2 = M := by + dsimp [S, M, constantFullBlockMatrixSqrt] + simpa using CFC.sq_sqrt M hMpos.posSemidef.nonneg + rw [pow_two] at hsq + change + ofFullBlockVec (Matrix.mulVec S (Matrix.mulVec S (toFullBlockVec P))) = + blockMatVecMul (blockMatrixOfCoeff a0) P + calc + ofFullBlockVec (Matrix.mulVec S (Matrix.mulVec S (toFullBlockVec P))) = + ofFullBlockVec (Matrix.mulVec (S * S) (toFullBlockVec P)) := by + exact congrArg ofFullBlockVec + (Matrix.mulVec_mulVec (toFullBlockVec P) S S) + _ = ofFullBlockVec (Matrix.mulVec M (toFullBlockVec P)) := by rw [hsq] + _ = blockMatVecMul (ofFullBlockMat M) P := by + exact ofFullBlockVec_mulVec_toFullBlockVec_eq_blockMatVecMul M P + _ = blockMatVecMul (blockMatrixOfCoeff a0) P := by + simp [M, constantFullBlockMatrix] + simp [hP, hQ] + +theorem blockJ_le_normalizedBlockResponseMax_mul_blockQuadratic_of_isEllipticMatrix {d : ℕ} + (R : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (P : BlockVec d) : + BlockJ (cubeSet R) P (blockMatVecMul (blockMatrixOfCoeff a0) P) a ≤ + normalizedBlockResponseMax R a a0 * + blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) := by + let t := blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P) + have hcoeff_pos : 0 < lam0 / (1 + 2 * Lam0 ^ 2) := by + rcases ha0 with ⟨hlam_pos, -, -, -⟩ + positivity + have hcoeff_nonneg : 0 ≤ lam0 / (1 + 2 * Lam0 ^ 2) := by + exact le_of_lt hcoeff_pos + have ht_nonneg : 0 ≤ t := by + have hcoerc := blockMatrixOfCoeff_coercive_of_isEllipticMatrix (A := a0) ha0 P + exact le_trans (mul_nonneg hcoeff_nonneg (blockVecDot_nonneg P)) hcoerc + by_cases ht : t = 0 + · have hzero_norm : blockVecDot P P = 0 := by + have hcoerc := blockMatrixOfCoeff_coercive_of_isEllipticMatrix (A := a0) ha0 P + by_contra hnorm + have hnorm_ne : blockVecDot P P ≠ 0 := by + simpa [eq_comm] using hnorm + have hnorm_pos : 0 < blockVecDot P P := by + exact lt_of_le_of_ne (blockVecDot_nonneg P) (by simpa [eq_comm] using hnorm_ne) + nlinarith + have hP0 : P = 0 := blockVecDot_self_eq_zero hzero_norm + have hblock0 : + BlockJ (cubeSet R) 0 0 a = 0 := + blockJ_zero_zero_eq_zero_of_isEllipticFieldOn R a hEll + have hQzero : blockMatVecMul (blockMatrixOfCoeff a0) (0 : BlockVec d) = 0 := by + ext <;> simp [blockMatVecMul, matVecMul] + rw [hP0, hQzero, hblock0] + have hmax_nonneg : 0 ≤ normalizedBlockResponseMax R a a0 := normalizedBlockResponseMax_nonneg R a a0 + have hrhs_nonneg : 0 ≤ normalizedBlockResponseMax R a a0 * blockVecDot (0 : BlockVec d) 0 := by + exact mul_nonneg hmax_nonneg (blockVecDot_nonneg 0) + nlinarith + · have ht_pos : 0 < t := lt_of_le_of_ne ht_nonneg (by simpa [eq_comm] using ht) + let c : ℝ := Real.sqrt t + have hc_ne : c ≠ 0 := by + exact Real.sqrt_ne_zero'.2 ht_pos + let P' : BlockVec d := c⁻¹ • P + have hquad_one : + blockVecDot P' (blockMatVecMul (blockMatrixOfCoeff a0) P') = 1 := by + dsimp [P', c, t] + rw [blockMatVecMul_smul, blockVecDot_smul_left, blockVecDot_smul_right] + have hsq : Real.sqrt t ^ 2 = t := by + exact Real.sq_sqrt ht_nonneg + calc + (Real.sqrt t)⁻¹ * ((Real.sqrt t)⁻¹ * blockVecDot P (blockMatVecMul (blockMatrixOfCoeff a0) P)) + = ((Real.sqrt t)⁻¹ * (Real.sqrt t)⁻¹) * t := by ring + _ = 1 := by + have hmul_ne : Real.sqrt t * Real.sqrt t ≠ 0 := mul_ne_zero hc_ne hc_ne + refine (mul_right_cancel₀ hmul_ne) ?_ + calc + (((Real.sqrt t)⁻¹ * (Real.sqrt t)⁻¹) * t) * (Real.sqrt t * Real.sqrt t) = t := by + field_simp [hc_ne] + _ = 1 * (Real.sqrt t * Real.sqrt t) := by + nlinarith [hsq] + have hmem : + BlockJ (cubeSet R) P' (blockMatVecMul (blockMatrixOfCoeff a0) P') a ∈ + normalizedBlockResponseValueSet R a a0 := + normalizedBlockResponseValueSet_mem_of_blockQuadratic_eq_one + R a ha0 P' hquad_one + have hunit : + BlockJ (cubeSet R) P' (blockMatVecMul (blockMatrixOfCoeff a0) P') a ≤ + normalizedBlockResponseMax R a a0 := by + unfold normalizedBlockResponseMax + exact le_csSup + (normalizedBlockResponseValueSet_bddAbove_of_isEllipticFieldOn R a a0 hEll) hmem + have hscale : + BlockJ (cubeSet R) P (blockMatVecMul (blockMatrixOfCoeff a0) P) a = + c ^ 2 * + BlockJ (cubeSet R) P' (blockMatVecMul (blockMatrixOfCoeff a0) P') a := by + have hhom := + blockJ_homogeneous (U := cubeSet R) (P := P') + (Q := blockMatVecMul (blockMatrixOfCoeff a0) P') a (c := c) hc_ne + simpa [P', blockMatVecMul_smul, smul_smul, hc_ne] using hhom + calc + BlockJ (cubeSet R) P (blockMatVecMul (blockMatrixOfCoeff a0) P) a = + c ^ 2 * BlockJ (cubeSet R) P' (blockMatVecMul (blockMatrixOfCoeff a0) P') a := + hscale + _ ≤ c ^ 2 * normalizedBlockResponseMax R a a0 := by + exact mul_le_mul_of_nonneg_left hunit (by positivity) + _ = normalizedBlockResponseMax R a a0 * t := by + have hsq : c ^ 2 = t := by + dsimp [c] + exact Real.sq_sqrt ht_nonneg + rw [hsq] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHS.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHS.lean new file mode 100644 index 0000000000..33ee297647 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHS.lean @@ -0,0 +1,923 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities + +/-! # RHS -/ + +@[expose] public section + +namespace Real + +/-- Square-root comparison from a nonnegative square-side bound. -/ +theorem sqrt_le_of_le_sq {A B : ℝ} + (hA : 0 ≤ A) (hB : 0 ≤ B) (hAB : A ≤ B ^ 2) : + Real.sqrt A ≤ B := by + refine le_of_sq_le_sq ?_ hB + simpa [Real.sq_sqrt hA] using hAB + +end Real + +namespace Homogenization + +noncomputable section + +/-! +# Coarse-flux response with right-hand side + +This file starts the Lean surface for manuscript §3.2.4, +`l.coarse.grained.flux.response.RHS.deterministic.theory`. + +The key distinction from §3.2.3 is the field being controlled: §3.2.3 estimates +`a∇u`, while §3.2.4 estimates the actual coarse flux defect `(a-a₀)∇u`. +The first lemmas here package the homogeneous response contribution in the +`q = 2` negative seminorm used by the downstream §3.3 duality lemma. +-/ + +open scoped BigOperators ENNReal + +/-- The q=1 homogeneous coarse-flux response bound from §3.1.3. -/ +noncomputable def coarseFluxResponseQOneBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : ℝ := + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a u))) + +/-- +The one-cube §3.2.4 RHS flux-response bound, before the descendant-depth +inflation used in §3.3.B. + +This mirrors the manuscript display +`e.coarse.grained.flux.response.RHS.deterministic.theory` on one cube. +-/ +noncomputable def coarseFluxResponseRHSBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : ℝ := + (s⁻¹) * Real.sqrt (matNorm a0) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) + + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + Real.rpow s (-3 : ℝ) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- The `∇u`-energy part of the §3.2.4 RHS flux-response bound. -/ +noncomputable def coarseFluxResponseRHSEnergyBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU : Vec d → Vec d) : ℝ := + (s⁻¹) * Real.sqrt (matNorm a0) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) + +/-- +The forcing contribution in the homogeneous-response part of the §3.2.4 split. +It comes from replacing the harmonic energy of `w = u - v` by the energy of +`u` plus the zero-Dirichlet RHS energy estimate for `v`. +-/ +noncomputable def coarseFluxResponseRHSResponseCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- The weak-flux estimate contribution for the correction field `a∇v`. -/ +noncomputable def coarseFluxResponseRHSWeakFluxCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- The RHS Poincare contribution for the constant-coefficient correction `a₀∇v`. -/ +noncomputable def coarseFluxResponseRHSPoincareCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + Real.rpow s (-3 : ℝ) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- The homogeneous split component after the zero-Dirichlet energy correction. -/ +noncomputable def coarseFluxResponseRHSHomogeneousSplitBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : ℝ := + coarseFluxResponseRHSEnergyBound Q a a0 s gradU + + coarseFluxResponseRHSResponseCorrectionBound Q a a0 s g + +/-- +The explicit split-envelope produced by the Lean q=2 triangle wrappers before +absorbing harmless dimensional constants into the manuscript's `C(d)`. +-/ +noncomputable def coarseFluxResponseRHSSplitEnvelope {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : ℝ := + Real.sqrt 2 * + (Real.sqrt 2 * + (coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g + + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) + +theorem coarseFluxResponseRHSBound_eq_component_sum {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : + coarseFluxResponseRHSBound Q a a0 s gradU g = + coarseFluxResponseRHSEnergyBound Q a a0 s gradU + + coarseFluxResponseRHSResponseCorrectionBound Q a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g + + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + unfold coarseFluxResponseRHSBound + coarseFluxResponseRHSEnergyBound + coarseFluxResponseRHSResponseCorrectionBound + coarseFluxResponseRHSWeakFluxCorrectionBound + coarseFluxResponseRHSPoincareCorrectionBound + ring + +private theorem coarseFluxResponse_homogenizationErrorOnCube_infinity_one_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (hs : 0 ≤ s) : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_nonneg + intro n + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) + (scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0) + +/-- +The descendant ellipticity hypothesis includes the parent cube itself at +depth zero. +-/ +theorem isEllipticFieldOn_self_of_descendant_isEllipticFieldOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) : + IsEllipticFieldOn lam Lam (cubeSet Q) a := + hEll_desc Q ⟨0, by simp⟩ + +/-- Coefficient-energy cube averages are nonnegative under ellipticity. -/ +theorem cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (F : Vec d → Vec d) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a F) := + cubeAverage_nonneg_of_nonneg_on (Q := Q) + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll F) + +/-- +Descendant version of coefficient-energy average nonnegativity from a +descendant ellipticity hypothesis. +-/ +theorem cubeAverage_coefficientEnergyDensity_nonneg_of_descendant_isEllipticFieldOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (F : Vec d → Vec d) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a F) := by + intro n R hR + exact cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + R a F (hEll_desc R ⟨n, hR⟩) + +theorem coarseFluxResponseRHSEnergyBound_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU : Vec d → Vec d) (hs : 0 < s) : + 0 ≤ coarseFluxResponseRHSEnergyBound Q a a0 s gradU := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have herror_nonneg : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := + coarseFluxResponse_homogenizationErrorOnCube_infinity_one_nonneg Q a a0 hs.le + unfold coarseFluxResponseRHSEnergyBound + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_inv_nonneg (Real.sqrt_nonneg _)) + herror_nonneg) + (Real.sqrt_nonneg _) + +theorem coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound Q a a0 s g := by + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have herror_nonneg : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := + coarseFluxResponse_homogenizationErrorOnCube_infinity_one_nonneg Q a a0 hs.le + have hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hgBdd + unfold coarseFluxResponseRHSResponseCorrectionBound + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_nonneg (Real.sqrt_nonneg _)) + (Real.sqrt_nonneg _)) + herror_nonneg) + hB_nonneg + +theorem coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + {s : ℝ} (g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hgBdd + unfold coarseFluxResponseRHSWeakFluxCorrectionBound + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_nonneg (Real.sqrt_nonneg _)) + (Real.sqrt_nonneg _)) + hB_nonneg + +theorem coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hgBdd + unfold coarseFluxResponseRHSPoincareCorrectionBound + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_nonneg (matNorm_nonneg a0)) + hlambda_inv_nonneg) + hB_nonneg + +theorem coarseFluxResponseRHSBound_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseFluxResponseRHSBound Q a a0 s gradU g := by + rw [coarseFluxResponseRHSBound_eq_component_sum] + exact + add_nonneg + (add_nonneg + (add_nonneg + (coarseFluxResponseRHSEnergyBound_nonneg Q a a0 gradU hs) + (coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + Q a a0 g hs hgBdd)) + (coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + Q a g hs hgBdd)) + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + Q a a0 g hs hgBdd) + +/-- +Homogeneous §3.2.4 component: the q=1 coarse-flux response theorem for an +`a`-harmonic field supplies the q=2 flux-defect control required by the +inhomogeneous split. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseQOneBound_of_aHarmonicFunction + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (u : AHarmonicFunction a (cubeSet Q)) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) ≤ + coarseFluxResponseQOneBound Q a a0 s u := by + refine + cubeBesovNegativeVectorSeminormTwo_le_of_qone_partialBound + Q s (fluxDefect a a0 u.toH1.grad) ?_ + intro N + simpa [fluxDefect, coarseFluxResponseQOneBound] using! + coarseFluxResponse_qone_partialSeminorm_le_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) (s := s) + hs hEll ha0 ha0symm u hsum N + +/-- A bounded q=1 finite-depth family gives a bounded q=2 finite-depth family. -/ +theorem cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_partialSeminorm_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hpartialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N u)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u) := by + rcases hpartialBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro y ⟨N, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm Q s N u).trans + (hB ⟨N, rfl⟩) + +/-- Pointwise algebra behind the §3.2.4 split +`(a - a₀)∇u = (a - a₀)∇w + a∇v - a₀∇v`. -/ +theorem fluxDefect_eq_add_sub_of_eq_add_on_cubeSet + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (gradU gradW gradV : Vec d → Vec d) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) : + ∀ x ∈ cubeSet Q, + fluxDefect a a0 gradU x = + fluxDefect a a0 gradW x + matVecMul (a x) (gradV x) - + matVecMul a0 (gradV x) := by + intro x hx + ext i + simp [fluxDefect, hgrad x hx, matVecMul_add, sub_eq_add_neg, add_assoc, + add_left_comm, add_comm] + +/-- +Recompose the three §3.2.4 split components in the note-normalized negative +`q = 2` seminorm. + +This is the Lean form of the triangle-inequality step in +`e.cg.flux.response.RHS.split.deterministic.theory`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_split_components + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV : Vec d → Vec d) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x))) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x))) := by + let splitField : Vec d → Vec d := + fun x => + fluxDefect a a0 gradW x + matVecMul (a x) (gradV x) - + matVecMul a0 (gradV x) + have hEq : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) = + cubeBesovNegativeVectorSeminormTwo Q s splitField := by + exact cubeBesovNegativeVectorSeminormTwo_eq_of_eq_on_cubeSet + (Q := Q) s (fluxDefect_eq_add_sub_of_eq_add_on_cubeSet Q a a0 + gradU gradW gradV hgrad) + rw [hEq] + exact + cubeBesovNegativeVectorSeminormTwo_add_sub_le_sqrtTwo_mul_add_sqrtTwo_mul_add_of_bddAbove + Q s (fluxDefect a a0 gradW) + (fun x => matVecMul (a x) (gradV x)) + (fun x => matVecMul a0 (gradV x)) + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + +/-- +Component-facing §3.2.4 split theorem. The hypotheses are exactly the three +estimates produced by the manuscript proof after splitting `u = w + v`: + +* homogeneous response for `(a-a₀)∇w`, including the RHS energy correction; +* weak-flux RHS control of `a∇v`; +* RHS Poincare control of `a₀∇v`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSSplitEnvelope_of_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV g : Vec d → Vec d) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g := by + have hsplit := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_split_components + Q a a0 s gradU gradW gradV hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + calc + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) + ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x))) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x))) := hsplit + _ ≤ coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g := by + unfold coarseFluxResponseRHSSplitEnvelope + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + exact add_le_add + (mul_le_mul_of_nonneg_left (add_le_add hdefectW hfluxV) + (Real.sqrt_nonneg _)) + ha0V + +/-- +The same split-envelope theorem with the homogeneous component discharged by +the already-formalized q=1 coarse-flux response for an `a`-harmonic remainder. + +The remaining hypotheses are the two correction estimates (`a∇v` and `a₀∇v`) +and the scalar comparison which replaces the harmonic-response energy of `w` +by the §3.2.4 homogeneous split bound. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSSplitEnvelope_of_aHarmonicFunction_component_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (gradU gradV g : Vec d → Vec d) + (w : AHarmonicFunction a (cubeSet Q)) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + gradV x) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneousEnergy : + coarseFluxResponseQOneBound Q a a0 s w ≤ + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g := by + have hfluxW_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have ha0Field : + IsEllipticFieldOn lam0 Lam0 (cubeSet Q) (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_cubeSet Q) ha0 + have ha0W_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (w.toH1.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn ha0Field w.toH1.grad_memVectorL2 + have hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 w.toH1.grad) := by + unfold fluxDefect + exact hfluxW_mem.sub ha0W_mem + have hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 w.toH1.grad)) := by + refine ⟨coarseFluxResponseQOneBound Q a a0 s w, ?_⟩ + rintro y ⟨N, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm + Q s N (fluxDefect a a0 w.toH1.grad)).trans <| by + simpa [fluxDefect, coarseFluxResponseQOneBound] using! + coarseFluxResponse_qone_partialSeminorm_le_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) (s := s) + hs hEll ha0 ha0symm w hsum N + have hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 w.toH1.grad) ≤ + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := by + exact + (cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseQOneBound_of_aHarmonicFunction + Q a a0 s hs hEll ha0 ha0symm w hsum).trans + hhomogeneousEnergy + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSSplitEnvelope_of_split_component_bounds + Q a a0 s gradU w.toH1.grad gradV g hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + hdefectW hfluxV ha0V + +/-- +Note-facing recomposition wrapper for §3.2.4: once the harmonic defect, +corrector flux, and constant-coefficient corrector-gradient components have +been bounded by the manuscript RHS, the split theorem yields the desired +coarse-flux-response bound for `(a - a₀)∇u`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSBound_of_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV g : Vec d → Vec d) + {BdefectW BfluxV Ba0V : ℝ} + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ BdefectW) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V) + (hcomponents : + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW + BfluxV) + Ba0V) ≤ + coarseFluxResponseRHSBound Q a a0 s gradU g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hsplit := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_split_components + Q a a0 s gradU gradW gradV hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + calc + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) + ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x))) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x))) := hsplit + _ ≤ Real.sqrt 2 * (Real.sqrt 2 * (BdefectW + BfluxV) + Ba0V) := by + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + exact add_le_add + (mul_le_mul_of_nonneg_left (add_le_add hdefectW hfluxV) + (Real.sqrt_nonneg _)) + ha0V + _ ≤ coarseFluxResponseRHSBound Q a a0 s gradU g := hcomponents + +/-- +Descendant `L²` average of the one-cube §3.2.4 RHS flux-response bound. +This is the scalar localization target that §3.3 has to compare with +`coarseGrainingL2FluxDefectBound`. +-/ +noncomputable def localizedCoarseFluxResponseRHSBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) + +@[simp] theorem localizedCoarseFluxResponseRHSBound_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g = + |coarseFluxResponseRHSBound Q a a0 s gradU g| := by + simp [localizedCoarseFluxResponseRHSBound, descendantsAverage, Real.sqrt_sq_eq_abs] + +theorem localizedCoarseFluxResponseRHSBound_zero_of_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (hbound_nonneg : 0 ≤ coarseFluxResponseRHSBound Q a a0 s gradU g) : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g = + coarseFluxResponseRHSBound Q a a0 s gradU g := by + rw [localizedCoarseFluxResponseRHSBound_zero, abs_of_nonneg hbound_nonneg] + +theorem localizedCoarseFluxResponseRHSBound_zero_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g = + coarseFluxResponseRHSBound Q a a0 s gradU g := + localizedCoarseFluxResponseRHSBound_zero_of_nonneg Q a a0 s gradU g + (coarseFluxResponseRHSBound_nonneg_of_bddAbove Q a a0 gradU g hs hgBdd) + +/-- +If each descendant one-cube RHS bound is nonnegative and pointwise bounded by a +single scalar `B`, then its descendant `L²` average is bounded by `B`. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_of_descendant_bound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) {B : ℝ} + (hB_nonneg : 0 ≤ B) + (hbound_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSBound R a a0 s gradU g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSBound R a a0 s gradU g ≤ B) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ B := by + have hsq : + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) ≤ + descendantsAverage Q j (fun _ : TriadicCube d => B ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ (hbound_nonneg R hR) (hpoint R hR) 2 + calc + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g + ≤ Real.sqrt (descendantsAverage Q j (fun _ : TriadicCube d => B ^ 2)) := by + exact Real.sqrt_le_sqrt hsq + _ = B := by + rw [descendantsAverage_const, Real.sqrt_sq hB_nonneg] + +/-- +Bounded-positive-Besov version of +`localizedCoarseFluxResponseRHSBound_le_of_descendant_bound`. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_of_descendant_bound_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {B : ℝ} + (hs : 0 < s) (hB_nonneg : 0 ≤ B) + (hgBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSBound R a a0 s gradU g ≤ B) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ B := + localizedCoarseFluxResponseRHSBound_le_of_descendant_bound Q a a0 s j gradU g + hB_nonneg + (fun R hR => + coarseFluxResponseRHSBound_nonneg_of_bddAbove R a a0 gradU g hs + (hgBdd R hR)) + hpoint + +/-- +Descendant-localized §3.2.4 RHS handoff from pointwise one-cube +coarse-flux-response bounds. + +This is the averaging wrapper needed by the downstream §3.3.B duality surface: +if every depth-`j` descendant has the one-cube RHS bound, then the localized +`q = 2` average is bounded by the descendant `ℓ²` average of those RHS values. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_coarseFluxResponseRHSBound_sq_of_descendant_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) (j : ℕ) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_pointwiseBound + Q s (fluxDefect a a0 gradU) j + (fun R => coarseFluxResponseRHSBound R a a0 s gradU g) ?_ hbound + intro R hR + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s + (fluxDefect a a0 gradU) (hdefect_bdd R hR) + +/-- +Named localized §3.2.4 RHS handoff from pointwise one-cube bounds. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) (j : ℕ) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + simpa [localizedCoarseFluxResponseRHSBound] using + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_coarseFluxResponseRHSBound_sq_of_descendant_bounds + Q a a0 s gradU g j hdefect_bdd hbound + +/-- +Descendant-localized §3.2.4 RHS handoff with the split components exposed on +each descendant cube. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_coarseFluxResponseRHSBound_sq_of_descendant_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV g : Vec d → Vec d) (j : ℕ) + {BdefectW BfluxV Ba0V : TriadicCube d → ℝ} + (hgrad : + ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, gradU x = gradW x + gradV x) + (hdefectW_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fluxDefect a a0 gradW)) + (hfluxV_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (gradV x))) + (hdefectU_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hdefectW_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradW) ≤ + BdefectW R) + (hfluxV : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV R) + (ha0V : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V R) + (hcomponents : + ∀ R ∈ descendantsAtDepth Q j, + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW R + BfluxV R) + Ba0V R) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_coarseFluxResponseRHSBound_sq_of_descendant_bounds + Q a a0 s gradU g j hdefectU_bdd ?_ + intro R hR + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSBound_of_split_component_bounds + R a a0 s gradU gradW gradV g + (hgrad R hR) + (hdefectW_mem R hR) (hfluxV_mem R hR) (ha0V_mem R hR) + (hdefectW_bdd R hR) (hfluxV_bdd R hR) (ha0V_bdd R hR) + (hdefectW R hR) (hfluxV R hR) (ha0V R hR) + (hcomponents R hR) + +/-- +Named localized §3.2.4 RHS handoff with the split components exposed on each +descendant cube. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_localizedCoarseFluxResponseRHSBound_of_descendant_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV g : Vec d → Vec d) (j : ℕ) + {BdefectW BfluxV Ba0V : TriadicCube d → ℝ} + (hgrad : + ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, gradU x = gradW x + gradV x) + (hdefectW_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fluxDefect a a0 gradW)) + (hfluxV_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (gradV x))) + (hdefectU_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hdefectW_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradW) ≤ + BdefectW R) + (hfluxV : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV R) + (ha0V : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V R) + (hcomponents : + ∀ R ∈ descendantsAtDepth Q j, + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW R + BfluxV R) + Ba0V R) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + simpa [localizedCoarseFluxResponseRHSBound] using + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_coarseFluxResponseRHSBound_sq_of_descendant_split_component_bounds + Q a a0 s gradU gradW gradV g j hgrad hdefectW_mem hfluxV_mem + ha0V_mem hdefectU_bdd hdefectW_bdd hfluxV_bdd ha0V_bdd + hdefectW hfluxV ha0V hcomponents + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantAbsorption.lean new file mode 100644 index 0000000000..9a537562d1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantAbsorption.lean @@ -0,0 +1,820 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSScalarAbsorption + +/-! # RHSConstant Absorption -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Constant-envelope scalar absorption for the RHS coarse-flux response + +The scalar absorption hooks in `RHSScalarAbsorption` target the bare correction +components. The manuscript §3.2.4 theorem carries a dimensional constant, so +this leaf exposes the same hooks with a caller-supplied nonnegative multiplier. +-/ + +open scoped BigOperators ENNReal + +/-- Weak-flux radicand component budgets closing into `C * correctionBound`. -/ +theorem coarseFluxResponseRHSWeakFluxExpandedRadicand_zero_le_const_mul_correctionBound_sq_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (C s : ℝ) + (g gradV : Vec d → Vec d) {BU BV Benergy BUtail BVtail Bforce : ℝ} + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hsum : + Benergy + BUtail + BVtail + Bforce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV 0 BU BV ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 := by + unfold coarseFluxResponseRHSWeakFluxExpandedRadicand + simp only [coarsePoincareRHSDepthWeight_zero, inv_one, one_mul] + nlinarith [henergy, hBU, hBV, hforce, hsum] + +/-- Weak-flux square-root absorption into `C * correctionBound`. -/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_radicand_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {C s : ℝ} + (g gradV : Vec d → Vec d) (m : ℕ) {BU BV : ℝ} + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hrad : + coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV m BU BV ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV m BU BV ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + rw [coarseFluxResponseRHSWeakFluxExpandedBound_eq_sqrt_radicand] + exact Real.sqrt_le_of_le_sq + (coarseFluxResponseRHSWeakFluxExpandedRadicand_nonneg + Q a g gradV m hs havg_nonneg hBU_nonneg hBV_nonneg) + (mul_nonneg hC_nonneg + (coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + Q a g hs hgBdd)) + hrad + +/-- Weak-flux square-root absorption into `C * correctionBound` from budgets. -/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {C s : ℝ} + (g gradV : Vec d → Vec d) {BU BV Benergy BUtail BVtail Bforce : ℝ} + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hsum : + Benergy + BUtail + BVtail + Bforce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_radicand_le_sq + Q a g gradV 0 hC_nonneg hs havg_nonneg hBU_nonneg hBV_nonneg hgBdd + (coarseFluxResponseRHSWeakFluxExpandedRadicand_zero_le_const_mul_correctionBound_sq_of_component_bounds + Q a C s g gradV henergy hBU hBV hforce hsum) + +/-- +Weak-flux square-root absorption with the scalar side stated as the exact +expanded depth-zero budget. +-/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_exact_budget + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {C s : ℝ} + (g gradV : Vec d → Vec d) {BU BV : ℝ} + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hbudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_component_bounds + (Q := Q) (a := a) (g := g) (gradV := gradV) + (C := C) (s := s) (BU := BU) (BV := BV) + (Benergy := + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV)) + (BUtail := (5 * s⁻¹) * BU) + (BVtail := (5 * s⁻¹) * BV) + (Bforce := + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + hC_nonneg hs havg_nonneg hBU_nonneg hBV_nonneg hgBdd + (by rfl) (by rfl) (by rfl) (by rfl) hbudget + +/-- Depth-zero weak-flux local handoff to an arbitrary scalar envelope. -/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_le_of_localized_depth_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (gradV g : Vec d → Vec d) {BU BV B : ℝ} + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (gradV x)) 0 ≤ + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV) + (hscalar : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV ≤ B) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ B := by + have hnonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s + (fun x => matVecMul (a x) (gradV x)) hfluxV_bdd + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) + = + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (gradV x)) 0 := by + exact + (localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg + Q s (fun x => matVecMul (a x) (gradV x)) hnonneg).symm + _ ≤ coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV := + hlocalized + _ ≤ B := hscalar + +/-- +H¹ weak-solution weak-flux correction with the scalar side supplied as +component budgets closing into a caller-supplied multiple of the compact bound. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + (C : ℝ) {lam Lam : ℝ} + (hCmul_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV Benergy BUtail BVtail Bforce : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hbudget : + Benergy + BUtail + BVtail + Bforce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + have hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (v.grad x)) 0 ≤ + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g v.grad 0 BU BV := by + simpa [coarseFluxResponseRHSWeakFluxExpandedBound] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) (u := v) (lam := lam) + (Lam := Lam) hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc (m := 0) (BU := BU) (BV := BV) hBdd + hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg + (by intro k; simpa using hu_tail k) hvConstructed + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_le_of_localized_depth_zero + Q a s v.grad g hfluxV_bdd hlocalized + (coarseFluxResponseRHSWeakFluxExpandedBound_le_const_mul_correctionBound_of_component_bounds + Q a g v.grad hCmul_nonneg hs havg_parent_nonneg hBU_nonneg hBV_nonneg + hGlobalBdd henergy hBU hBV hforce hbudget) + +/-- +H¹ weak-solution weak-flux correction with the scalar side stated as the exact +expanded depth-zero budget. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_exact_budget + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + (C : ℝ) {lam Lam : ℝ} + (hCmul_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (hbudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + (Q := Q) (a := a) (s := s) (g := g) (v := v) (C := C) + (lam := lam) (Lam := Lam) (BU := BU) (BV := BV) + (Benergy := + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + (BUtail := (5 * s⁻¹) * BU) + (BVtail := (5 * s⁻¹) * BV) + (Bforce := + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + hCmul_nonneg hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc + hBdd hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + hfluxV_bdd (by rfl) (by rfl) (by rfl) (by rfl) hbudget + +/-- +Exact-budget weak-flux correction with coefficient-energy average +nonnegativity derived from descendant ellipticity. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_exact_budget_of_descendant_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + (C : ℝ) {lam Lam : ℝ} + (hCmul_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (hbudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + have havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a v.grad (hEll_desc Q ⟨0, by simp⟩) + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_descendant_isEllipticFieldOn + Q a v.grad hEll_desc + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_exact_budget + Q a s g v C hCmul_nonneg hs hs_le hweak hEll_desc hu_mem_desc + hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hfluxV_bdd hbudget + +/-- Poincare radicand budgets closing into `C * correctionBound`. -/ +theorem matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_const_mul_correctionBound_sq_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (C s : ℝ) + (g gradV : Vec d → Vec d) {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + unfold coarseFluxResponseRHSPoincareExpandedRadicand + nlinarith [henergy, hforce, hsum] + +/-- Poincare square-root absorption into `C * correctionBound`. -/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_radicand_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {C s : ℝ} + (g gradV : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hrad : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have hrad_nonneg : + 0 ≤ coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV := + coarseFluxResponseRHSPoincareExpandedRadicand_nonneg Q a g gradV hs havg_nonneg + have hleft_sq : + (matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV) ^ 2 = + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV := by + rw [coarseFluxResponseRHSPoincareExpandedBound_eq_sqrt_radicand, + mul_pow, Real.sq_sqrt hrad_nonneg] + refine le_of_sq_le_sq ?_ + (mul_nonneg hC_nonneg + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + Q a a0 g hs hgBdd)) + simpa [hleft_sq] using hrad + +/-- Poincare square-root absorption into `C * correctionBound` from budgets. -/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {C s : ℝ} + (g gradV : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_radicand_le_sq + Q a a0 g gradV hC_nonneg hs havg_nonneg hgBdd + (matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_const_mul_correctionBound_sq_of_component_bounds + Q a a0 C s g gradV henergy hforce hsum) + +/-- +Poincare square-root absorption with the scalar side stated as the exact +matrix-weighted expanded budget. +-/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_exact_budget + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {C s : ℝ} + (g gradV : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hbudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_component_bounds + (Q := Q) (a := a) (a0 := a0) (g := g) (gradV := gradV) + (C := C) (s := s) + (Benergy := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV))) + (Bforce := + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + hC_nonneg hs havg_nonneg hgBdd (by rfl) (by rfl) hbudget + +/-- Constant-matrix gradient handoff to an arbitrary scalar envelope. -/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le_of_grad_bound + {d : ℕ} (Q : TriadicCube d) (a0 : Mat d) + (s : ℝ) (gradV : Vec d → Vec d) {Bgrad B : ℝ} + (hmat : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV) + (hgrad : + cubeBesovNegativeVectorSeminormTwo Q s gradV ≤ Bgrad) + (hscalar : matNorm a0 * Bgrad ≤ B) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ B := by + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) + ≤ matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV := hmat + _ ≤ matNorm a0 * Bgrad := by + exact mul_le_mul_of_nonneg_left hgrad (matNorm_nonneg a0) + _ ≤ B := hscalar + +/-- +H¹ weak-solution Poincare correction with the scalar side supplied as +matrix-weighted budgets closing into a caller-supplied multiple. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_const_mul_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + (C : ℝ) {lam Lam : ℝ} + (hCmul_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hbudget : + Benergy + Bforce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have havg_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad) := + cubeAverage_nonneg_of_nonneg_on (Q := Q) + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll v.grad) + have hgrad : + cubeBesovNegativeVectorSeminormTwo Q s v.grad ≤ + coarseFluxResponseRHSPoincareExpandedBound Q a s g v.grad := by + simpa [coarseFluxResponseRHSPoincareExpandedBound] using + cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := v) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hweak hg hGlobalBdd + have hmat : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s v.grad := + cubeBesovNegativeVectorSeminormTwo_constMatMul_le + Q s a0 v.grad hgrad_mem_desc hgrad_bdd + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_le_of_grad_bound + Q a0 s v.grad hmat hgrad + (matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_component_bounds + Q a a0 g v.grad hCmul_nonneg hs havg_nonneg hGlobalBdd + henergy hforce hbudget) + +/-- +H¹ weak-solution Poincare correction with the scalar side stated as the exact +matrix-weighted expanded budget. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_const_mul_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_exact_budget + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + (C : ℝ) {lam Lam : ℝ} + (hCmul_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hbudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_const_mul_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + (Q := Q) (a := a) (a0 := a0) (s := s) (g := g) (v := v) (C := C) + (lam := lam) (Lam := Lam) + (Benergy := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad))) + (Bforce := + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + hCmul_nonneg hs hs_le hEll hweak hg hGlobalBdd hgrad_mem_desc + hgrad_bdd (by rfl) (by rfl) hbudget + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApex.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApex.lean new file mode 100644 index 0000000000..5461d40c6f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApex.lean @@ -0,0 +1,924 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantAbsorption +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantEnvelope + +/-! # RHSConstant Apex -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Constant-envelope one-cube RHS coarse-flux response apex + +This leaf composes the `C`-scaled correction wrappers with the split +recomposition theorem. The remaining mathematical inputs are the analytic +component budgets: the homogeneous energy correction and the zero-Dirichlet +RHS weak-flux/Poincare budgets. +-/ + +open scoped BigOperators ENNReal + +/-- +One-cube §3.2.4 RHS flux-response recomposition with a single nonnegative +constant multiplying each compact component. + +The theorem is intentionally still component-budget-facing: it records the +formal route from the H¹ weak-solution estimates to the manuscript-shaped +`C(d)` one-cube bound, while leaving the analytic energy/tail/forcing budget +estimates as explicit hypotheses. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV BweakEnergy BUtail BVtail BweakForce BPoincareEnergy BPoincareForce : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)))) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hweakEnergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ + BweakEnergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hweakForce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + BweakForce) + (hweakBudget : + BweakEnergy + BUtail + BVtail + BweakForce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareEnergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) ≤ + BPoincareEnergy) + (hPoincareForce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + BPoincareForce) + (hPoincareBudget : + BPoincareEnergy + BPoincareForce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hfluxW_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have ha0Field : + IsEllipticFieldOn lam0 Lam0 (cubeSet Q) (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_cubeSet Q) ha0 + have ha0W_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (w.toH1.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn ha0Field w.toH1.grad_memVectorL2 + have hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 w.toH1.grad) := by + unfold fluxDefect + exact hfluxW_mem.sub ha0W_mem + have hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (v.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.grad_memVectorL2 + have ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (v.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn ha0Field v.grad_memVectorL2 + have hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 w.toH1.grad)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_partialSeminorm_bddAbove + Q s (fluxDefect a a0 w.toH1.grad) hdefectW_partialBdd + have hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 w.toH1.grad) ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := + (cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseQOneBound_of_aHarmonicFunction + Q a a0 s hs hEll ha0 ha0symm w hresponseSum).trans + hhomogeneous + have hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + Q a s g v C hC_nonneg hs hs_le hweak hEll_desc hu_mem_desc + hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hweakBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hfluxV_bdd + hweakEnergy hBU hBV hweakForce hweakBudget + have ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + have hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad := by + intro j R hR + exact hu_mem_desc R ⟨j, hR⟩ + cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_const_mul_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + Q a a0 s g v C hC_nonneg hs hs_le hEll hweak hg hGlobalBdd + hgrad_mem_desc hgrad_bdd hPoincareEnergy hPoincareForce hPoincareBudget + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_const_mul_split_component_bounds + Q a a0 gradU w.toH1.grad v.grad g hC_nonneg hs hGlobalBdd + hgrad hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd hdefectW hfluxV ha0V + +/-- +Same one-cube apex with the weak-flux and Poincare scalar sides stated as the +exact expanded budget inequalities, rather than through auxiliary budget +variables. This is the cleanest current note-facing surface: the remaining +analytic work is precisely the two displayed scalar budget bounds plus the +homogeneous energy-correction estimate. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)))) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hweakBudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareBudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets + (Q := Q) (a := a) (a0 := a0) (s := s) (gradU := gradU) + (g := g) (v := v) (w := w) (C := C) + (lam := lam) (Lam := Lam) (lam0 := lam0) (Lam0 := Lam0) + (BU := BU) (BV := BV) + (BweakEnergy := + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + (BUtail := (5 * s⁻¹) * BU) + (BVtail := (5 * s⁻¹) * BV) + (BweakForce := + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + (BPoincareEnergy := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad))) + (BPoincareForce := + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + hC_nonneg hs hs_le hEll hEll_open ha0 ha0symm hweak hgrad + hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc + hchildBdd huBdd_desc hgBdd_centered_desc hweakBdd hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hg hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hdefectW_partialBdd + hresponseSum hhomogeneous hfluxV_bdd ha0V_bdd hgrad_bdd + (by rfl) (by rfl) (by rfl) (by rfl) hweakBudget + (by rfl) (by rfl) hPoincareBudget + +/-- +Exact-budget one-cube apex with coefficient-energy average nonnegativity +derived from the ellipticity hypotheses. + +This is the cleaner note-facing surface after the average-nonnegativity +bookkeeping has been moved into the RHS layer. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets_of_descendant_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)))) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hweakBudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareBudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a v.grad hEll + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_descendant_isEllipticFieldOn + Q a v.grad hEll_desc + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets + Q a a0 s gradU g v w C hC_nonneg hs hs_le hEll hEll_open + ha0 ha0symm hweak hgrad hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hweakBdd hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hg hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hdefectW_partialBdd + hresponseSum hhomogeneous hfluxV_bdd ha0V_bdd hgrad_bdd + hweakBudget hPoincareBudget + +/-- +Exact-budget one-cube apex with the parent-cube ellipticity hypothesis derived +from descendant ellipticity at depth zero. + +This removes the redundant standalone `IsEllipticFieldOn ... (cubeSet Q) a` +input when the caller already supplies ellipticity on all descendants of `Q`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets_of_descendant_isEllipticFieldOn_self + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)))) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hweakBudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareBudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a := + isEllipticFieldOn_self_of_descendant_isEllipticFieldOn Q a hEll_desc + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets_of_descendant_isEllipticFieldOn + Q a a0 s gradU g v w C hC_nonneg hs hs_le hEll hEll_open + ha0 ha0symm hweak hgrad hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hweakBdd hData hsum_half hint hmem hg + hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + hdefectW_partialBdd hresponseSum hhomogeneous hfluxV_bdd ha0V_bdd + hgrad_bdd hweakBudget hPoincareBudget + +/-- +Exact-budget one-cube apex with all parent depth-zero inputs derived from the +corresponding descendant/global hypotheses. + +Besides deriving self-cube ellipticity from descendant ellipticity, this +wrapper also derives the descendant deterministic-data family from the +single parent descendant-data hypothesis, the descendant `MemVectorL2 v.grad` +family from the H¹ input, the parent `a∇v` partial boundedness from ellipticity +and H¹ data, the parent `v.grad` and `a₀∇v` partial boundedness inputs from the +descendant `v.grad` boundedness family, the parent `MemLp g`, the descendant +`MemVectorL2 g` family, and the parent positive-Besov boundedness hypothesis +from their descendant/global versions. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets_of_descendant_depth_zero_inputs + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hweakBudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareBudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a := by + intro R hR + rcases hR with ⟨n, hRn⟩ + have hRn_scale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hRn + have hn_scale : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + exact OpenCubeDescendantDeterministicCoarseData.of_mem_descendantsAtScale + hData hn_scale hRn_scale + have hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad := by + intro R hR + rcases hR with ⟨n, hRn⟩ + simpa [MemVectorL2, volumeMeasureOn] using + v.grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hRn)) + have hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g := by + intro R hR + rcases hR with ⟨n, hRn⟩ + exact memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (hmem n R hRn) + have hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q) := + hmem 0 Q (by simp) + have hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g) := + hLocalBdd 0 Q (by simp) + have hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad) := + huBdd_desc Q ⟨0, by simp⟩ + have hEll : + IsEllipticFieldOn lam Lam (cubeSet Q) a := + isEllipticFieldOn_self_of_descendant_isEllipticFieldOn Q a hEll_desc + have hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (v.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.grad_memVectorL2 + have hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x))) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => matVecMul (a x) (v.grad x)) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hfluxV_mem) + have ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x))) := by + rcases hgrad_bdd with ⟨M, hM⟩ + refine ⟨matNorm a0 * M, ?_⟩ + rintro y ⟨N, rfl⟩ + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)) + ≤ matNorm a0 * cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad := by + exact cubeBesovNegativeVectorPartialSeminormTwo_constMatMul_le + Q s a0 v.grad N + (fun j _ R hR => hu_mem_desc R ⟨j, hR⟩) + _ ≤ matNorm a0 * M := by + exact mul_le_mul_of_nonneg_left (hM ⟨N, rfl⟩) (matNorm_nonneg a0) + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_exact_budgets_of_descendant_isEllipticFieldOn_self + Q a a0 s gradU g v w C hC_nonneg hs hs_le hEll_open ha0 ha0symm + hweak hgrad hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc + hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc hweakBdd hData + hsum_half hint hmem hg hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg + hu_tail hvConstructed hdefectW_partialBdd hresponseSum hhomogeneous + hfluxV_bdd ha0V_bdd hgrad_bdd hweakBudget hPoincareBudget + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexComponent.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexComponent.lean new file mode 100644 index 0000000000..1e759af344 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexComponent.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApex + +/-! # RHSConstant Apex Component -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Component-budget one-cube RHS coarse-flux response apex + +This leaf keeps `RHSConstantApex` below the file-size guardrail while exposing +the clean depth-zero-input surface for the component-budget version of the +one-cube RHS flux-response theorem. +-/ + +open scoped BigOperators ENNReal + +/-- +Component-budget one-cube apex with all parent depth-zero bookkeeping inputs +derived from descendant/global hypotheses. + +Compared with the exact-budget wrapper in `RHSConstantApex`, this surface keeps +the weak-flux and Poincare scalar sides split into energy, tail, and forcing +component budgets. These are the inputs that the remaining analytic +energy-to-force estimates are meant to discharge separately. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets_of_descendant_depth_zero_inputs + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV BweakEnergy BUtail BVtail BweakForce BPoincareEnergy BPoincareForce : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hweakEnergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ + BweakEnergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hweakForce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + BweakForce) + (hweakBudget : + BweakEnergy + BUtail + BVtail + BweakForce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareEnergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) ≤ + BPoincareEnergy) + (hPoincareForce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + BPoincareForce) + (hPoincareBudget : + BPoincareEnergy + BPoincareForce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a := by + intro R hR + rcases hR with ⟨n, hRn⟩ + have hRn_scale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hRn + have hn_scale : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + exact OpenCubeDescendantDeterministicCoarseData.of_mem_descendantsAtScale + hData hn_scale hRn_scale + have hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad := by + intro R hR + rcases hR with ⟨n, hRn⟩ + simpa [MemVectorL2, volumeMeasureOn] using + v.grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hRn)) + have hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g := by + intro R hR + rcases hR with ⟨n, hRn⟩ + exact memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (hmem n R hRn) + have hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q) := + hmem 0 Q (by simp) + have hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g) := + hLocalBdd 0 Q (by simp) + have hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad) := + huBdd_desc Q ⟨0, by simp⟩ + have hEll : + IsEllipticFieldOn lam Lam (cubeSet Q) a := + isEllipticFieldOn_self_of_descendant_isEllipticFieldOn Q a hEll_desc + have havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a v.grad hEll + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad) := + cubeAverage_coefficientEnergyDensity_nonneg_of_descendant_isEllipticFieldOn + Q a v.grad hEll_desc + have hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (v.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.grad_memVectorL2 + have hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x))) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => matVecMul (a x) (v.grad x)) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hfluxV_mem) + have ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x))) := by + rcases hgrad_bdd with ⟨M, hM⟩ + refine ⟨matNorm a0 * M, ?_⟩ + rintro y ⟨N, rfl⟩ + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (v.grad x)) + ≤ matNorm a0 * cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad := by + exact cubeBesovNegativeVectorPartialSeminormTwo_constMatMul_le + Q s a0 v.grad N + (fun j _ R hR => hu_mem_desc R ⟨j, hR⟩) + _ ≤ matNorm a0 * M := by + exact mul_le_mul_of_nonneg_left (hM ⟨N, rfl⟩) (matNorm_nonneg a0) + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets + Q a a0 s gradU g v w C hC_nonneg hs hs_le hEll hEll_open + ha0 ha0symm hweak hgrad hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hweakBdd hData hsum_half havg_parent_nonneg + havg_nonneg hint hmem hg hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg + hu_tail hvConstructed hdefectW_partialBdd hresponseSum hhomogeneous + hfluxV_bdd ha0V_bdd hgrad_bdd hweakEnergy hBU hBV hweakForce + hweakBudget hPoincareEnergy hPoincareForce hPoincareBudget + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexEnergy.lean new file mode 100644 index 0000000000..289a2ebe89 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexEnergy.lean @@ -0,0 +1,224 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexComponent + +/-! # RHSConstant Apex Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Energy-envelope one-cube RHS coarse-flux response apex + +This leaf keeps the component-budget apex available with one shared +coefficient-energy envelope. It is the formal socket that the +zero-Dirichlet energy estimate from the notes should eventually feed. +-/ + +open scoped BigOperators ENNReal + +/-- +Component-budget one-cube apex where the weak-flux and Poincare energy +components are both derived from a single parent cube-energy envelope. + +The remaining tail and force component budgets stay explicit: those are +different analytic estimates in the notes. The common energy envelope is the +piece supplied by the zero-Dirichlet RHS energy estimate. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets_of_energy_envelope_of_descendant_depth_zero_inputs + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) + (w : AHarmonicFunction a (cubeSet Q)) + (C : ℝ) {lam Lam lam0 Lam0 : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = w.toH1.grad x + v.grad x) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV BEnergy BweakEnergy BUtail BVtail BweakForce + BPoincareEnergy BPoincareForce : ℝ} + (hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hdefectW_partialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N + (fluxDefect a a0 w.toH1.grad))) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (henergyEnvelope : + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ BEnergy) + (hweakEnergyBudget : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * BEnergy ≤ + BweakEnergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hweakForce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + BweakForce) + (hweakBudget : + BweakEnergy + BUtail + BVtail + BweakForce ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) + (hPoincareEnergyBudget : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + BEnergy) ≤ + BPoincareEnergy) + (hPoincareForce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + BPoincareForce) + (hPoincareBudget : + BPoincareEnergy + BPoincareForce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hweakCoeff_nonneg : + 0 ≤ 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (50 : ℝ)) (sq_nonneg (s⁻¹))) + hLambda_nonneg + have hweakEnergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ + BweakEnergy := by + exact + (mul_le_mul_of_nonneg_left henergyEnvelope hweakCoeff_nonneg).trans + hweakEnergyBudget + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambdaInv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hPoincareCoeff_nonneg : + 0 ≤ (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + exact + mul_nonneg (sq_nonneg (matNorm a0)) + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + hlambdaInv_nonneg) + have hPoincareEnergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) ≤ + BPoincareEnergy := by + calc + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) + = + ((matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeAverage Q (coefficientEnergyDensity a v.grad) := by + ring + _ ≤ + ((matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + BEnergy := by + exact mul_le_mul_of_nonneg_left henergyEnvelope hPoincareCoeff_nonneg + _ = + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + BEnergy) := by + ring + _ ≤ BPoincareEnergy := hPoincareEnergyBudget + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_aHarmonicFunction_h1DirichletRhsWeakSolutionOn_component_budgets_of_descendant_depth_zero_inputs + Q a a0 s gradU g v w C hC_nonneg hs hs_le hEll_open + ha0 ha0symm hweak hgrad hEll_desc hC_desc hData hsum_desc + hchildBdd huBdd_desc hgBdd_centered_desc hweakBdd hsum_half + hint hmem hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + hdefectW_partialBdd hresponseSum hhomogeneous hweakEnergy hBU hBV + hweakForce hweakBudget hPoincareEnergy hPoincareForce hPoincareBudget + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBV.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBV.lean new file mode 100644 index 0000000000..fc95cb1788 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBV.lean @@ -0,0 +1,638 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEstimates +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletScalarAdequacy + +/-! # RHSConstant Apex Zero Dirichlet BV -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Averaged `BV` tail for the zero-Dirichlet RHS apex + +This leaf proves the averaged harmonic-remainder tail estimate actually +consumed by the weak-flux iteration. The pointwise `BVEstimate` package in +`RHSConstantApexZeroDirichletEstimates` remains available, but this theorem +targets the weaker averaged quantity appearing in the recurrence. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +theorem zeroTraceDirichletHarmonicRemainderSq_le_corrector_energy_and_neumann_young_terms + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hgR : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g)) + (w0 : AHarmonicFunction a (cubeSet R)) + (hdecomp : + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) : + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + (250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 + + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2) := by + let W : ℝ := + cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x) + let G : ℝ := + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g) + let M : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let K : ℝ := + 250 * (s⁻¹) ^ 2 * (lambdaSq R (s / 2) (.finite 2) a)⁻¹ + have hzeroMem : + MeasureTheory.MemLp (0 : Vec d → Vec d) (2 : ENNReal) + (normalizedCubeMeasure R) := by + simp + have hsol : + IsSolenoidalOn (cubeSet R) + (fun x => matVecMul (a x) (w0.toH1.grad x) - + (0 : Vec d → Vec d) x) := by + simpa using w0.isHarmonic.2 + have hsq : + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) := by + simpa using + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := R) (a := a) (g := (0 : Vec d → Vec d)) + (u := fun x => w0.toH1.grad x) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEllR w0.isHarmonic.1 hsol hzeroMem + (cubeBesovPositiveVectorPartialSeminormTwo_zero_bddAbove R s) + have hρMemQ : + MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ρ.toH10.toH1Function.grad_memVectorL2 + have hρMemR : + MemVectorL2 (cubeSet R) + (fun x => ρ.toH10.toH1Function.grad x) := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hρMemQ) + have hsplit : + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) ≤ + 2 * cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 2 * cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := + ω.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := fun x => ρ.toH10.toH1Function.grad x) w0 hEllR hdecomp + hρMemR + have hlambda_nonneg : + 0 ≤ lambdaSq R (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg R (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hcoeff250_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have hsplit_weighted : + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + nlinarith [mul_le_mul_of_nonneg_left hsplit hcoeff250_nonneg] + have hgMemR : MemVectorL2 (cubeSet R) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R hgR + have hωgrad : + MeasureTheory.MemLp (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hωBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => ω.toH1MeanZero.toH1Function.grad x) hωgrad + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s + (fun x => g x - cubeAverageVec R g) hgBdd + have hωEnergy := + ω.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + (s := s) (Bω := W) (Bg := G) + hs hgMemR hgR hωgrad hG_nonneg + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s (fun x => ω.toH1MeanZero.toH1Function.grad x) hωBdd N) + (fun N => + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s (fun x => g x - cubeAverageVec R g) hgBdd N) + have hcoeff500_nonneg : + 0 ≤ 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (500 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have hωWeighted : + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * W * G)) := + mul_le_mul_of_nonneg_left hωEnergy hcoeff500_nonneg + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact hcoeff250_nonneg + have hYoung : + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * W * G)) ≤ + K * W ^ 2 + K * (M * G) ^ 2 := by + have hbase : 2 * W * (M * G) ≤ W ^ 2 + (M * G) ^ 2 := by + nlinarith [sq_nonneg (W - M * G)] + have hscaled := mul_le_mul_of_nonneg_left hbase hK_nonneg + calc + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * W * G)) + = + K * (2 * W * (M * G)) := by + dsimp [K, M] + ring + _ ≤ K * (W ^ 2 + (M * G) ^ 2) := hscaled + _ = K * W ^ 2 + K * (M * G) ^ 2 := by ring + calc + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 + ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) := hsq + _ ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := + hsplit_weighted + _ ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + (K * W ^ 2 + K * (M * G) ^ 2) := by + exact add_le_add_right (hωWeighted.trans hYoung) _ + _ = + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + (250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 + + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2) := by + dsimp [K, W, G, M] + ring + +/-- +Raw averaged control of the zero-trace corrector-energy part of the harmonic +remainder `BV` budget. + +This is the analytic `rho` component before converting the natural +`lambda^{-2}` scale produced by the energy envelope into the corrected +weak-flux compact `Lambda * lambda^{-1}` scale. +-/ +theorem zeroTraceDirichletHarmonicRemainderRhoEnergyAverage_le_raw_lambdaInv_sq + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + ∀ j : ℕ, + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) ≤ + 325000 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + ((s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + intro j + let u : Vec d → Vec d := fun x => ρ.toH10.toH1Function.grad x + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let E : ℝ := cubeAverage Q (coefficientEnergyDensity a u) + let W : ℝ := coarsePoincareRHSDepthWeight s j + let T : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have hs_half : 0 < s / 2 := by nlinarith + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) + (2 / 2)) := by + have hsum : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa using hsum + have hlocal_lambda : + ∀ R ∈ descendantsAtDepth Q j, + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ T * L := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hloc : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) + (2 * (s / 2) * + (Int.toNat (Q.scale - (Q.scale - (j : ℤ))) : ℝ)) * + L := by + simpa [L] using + multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a (s / 2) 2 + (by nlinarith : 0 ≤ s / 2) (by norm_num) hRscale hsum_half + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + omega + rw [hdiff] + simp + have hloc' : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (j : ℝ)) * L := by + simpa [htoNat] using hloc + simpa [T, show 2 * (s / 2) * (j : ℝ) = s * (j : ℝ) by ring] using hloc' + have havg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u) := by + intro R hR + exact + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + R a u + (hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + have hlocal_bound : + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R (coefficientEnergyDensity a u)) ≤ + 500 * (s⁻¹) ^ 2 * (T * L) * + descendantsAverage Q j + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + calc + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R (coefficientEnergyDensity a u)) + ≤ + descendantsAverage Q j + (fun R => + (500 * (s⁻¹) ^ 2 * (T * L)) * + cubeAverage R (coefficientEnergyDensity a u)) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hscaled := + mul_le_mul_of_nonneg_right (hlocal_lambda R hR) (havg_nonneg R hR) + have hcoeff_nonneg : 0 ≤ 500 * (s⁻¹) ^ 2 := by + exact mul_nonneg (by norm_num : 0 ≤ (500 : ℝ)) (sq_nonneg (s⁻¹)) + nlinarith [mul_le_mul_of_nonneg_left hscaled hcoeff_nonneg] + _ = + 500 * (s⁻¹) ^ 2 * (T * L) * + descendantsAverage Q j + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + rw [descendantsAverage_smul Q j (500 * (s⁻¹) ^ 2 * (T * L)) + (fun R => cubeAverage R (coefficientEnergyDensity a u))] + have hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume := by + dsimp [u] + exact integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hpartition : + descendantsAverage Q j + (fun R => cubeAverage R (coefficientEnergyDensity a u)) = E := by + dsimp [E] + exact (cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j (coefficientEnergyDensity a u) hint).symm + have hweight_nonneg : 0 ≤ W := by + dsimp [W] + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hweighted : + W * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R (coefficientEnergyDensity a u)) ≤ + 500 * (s⁻¹) ^ 2 * L * E := by + have hmul := mul_le_mul_of_nonneg_left hlocal_bound hweight_nonneg + have hcancel : W * T = 1 := by + dsimp [W, T] + unfold coarsePoincareRHSDepthWeight + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) + = Real.rpow (3 : ℝ) ((-s * (j : ℝ)) + s * (j : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (-s * (j : ℝ)) (s * (j : ℝ))).symm + _ = 1 := by + have hsum : (-s * (j : ℝ)) + s * (j : ℝ) = 0 := by ring + rw [hsum] + simp + calc + W * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R (coefficientEnergyDensity a u)) + ≤ + W * + (500 * (s⁻¹) ^ 2 * (T * L) * + descendantsAverage Q j + (fun R => cubeAverage R (coefficientEnergyDensity a u))) := hmul + _ = (W * T) * (500 * (s⁻¹) ^ 2 * L * E) := by + rw [hpartition] + ring + _ = 500 * (s⁻¹) ^ 2 * L * E := by + rw [hcancel] + ring + have henergyEnvelope : + E ≤ zeroTraceDirichletEnergyEnvelope Q a s g := by + dsimp [E, u] + exact + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hcoeff_nonneg : 0 ≤ 500 * (s⁻¹) ^ 2 * L := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (500 : ℝ)) (sq_nonneg (s⁻¹))) + hL_nonneg + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have henv_display : + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + 650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + simpa [L, N, G, mul_assoc, mul_left_comm, mul_comm] using + zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + Q a g hs hG_nonneg + calc + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) + = + W * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R (coefficientEnergyDensity a u)) := by + dsimp [W, u] + _ ≤ 500 * (s⁻¹) ^ 2 * L * E := hweighted + _ ≤ 500 * (s⁻¹) ^ 2 * L * + zeroTraceDirichletEnergyEnvelope Q a s g := by + exact mul_le_mul_of_nonneg_left henergyEnvelope hcoeff_nonneg + _ ≤ 500 * (s⁻¹) ^ 2 * L * + (650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by + exact mul_le_mul_of_nonneg_left henv_display hcoeff_nonneg + _ = + 325000 * N ^ 2 * ((s⁻¹) ^ 4 * L ^ 2 * G ^ 2) := by ring + _ = + 325000 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + ((s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [N, L, G] + +theorem zeroTraceDirichletHarmonicRemainderScaledAveragedTail_le_of_selectors_corrector_energy_and_neumann_young_average_bounds + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) {BV Bρ BωNeg BωForce lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hg_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R)) + (hgBdd_centered_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (v : TriadicCube d → Vec d → Vec d) + (ω : (R : TriadicCube d) → + MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g)) + (w0 : (R : TriadicCube d) → AHarmonicFunction a (cubeSet R)) + (hv_eq : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + v R = (fun x => (w0 R).toH1.grad x)) + (hdecomp : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + (w0 R).toH1.grad x + + (ω R).toH1MeanZero.toH1Function.grad x) + (hρEnergyAvg : + ∀ j : ℕ, + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) ≤ Bρ) + (hωNegSqAvg : + ∀ j : ℕ, + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω R).toH1MeanZero.toH1Function.grad x)) ^ 2) ≤ + BωNeg) + (hcenteredForceSqAvg : + ∀ j : ℕ, + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2) ≤ + BωForce) + (hbudget : Bρ + (BωNeg + BωForce) ≤ BV) : + ∀ j : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v j ≤ BV := by + intro j + let Aρ : TriadicCube d → ℝ := fun R => + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + let Aω : TriadicCube d → ℝ := fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => (ω R).toH1MeanZero.toH1Function.grad x)) ^ 2 + let Ag : TriadicCube d → ℝ := fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2 + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + Aρ R + (Aω R + Ag R) := by + intro R hR + have hlocal := + zeroTraceDirichletHarmonicRemainderSq_le_corrector_energy_and_neumann_young_terms + (Q := Q) (R := R) ρ hR hs hs_le + (hEll_desc R ⟨j, hR⟩) (hg_mem_desc j R hR) + (hgBdd_centered_desc j R hR) (ω R) (w0 R) + (hdecomp j R hR) + simpa [hv_eq j R hR, Aρ, Aω, Ag] using hlocal + have havg : + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v j ≤ + descendantsAverage Q j (fun R => Aρ R + (Aω R + Ag R)) := by + unfold weakFluxRHSHarmonicRemainderAveragedSeminormSq + exact descendantsAverage_le_descendantsAverage Q j hpoint + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s j := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hscaled : + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v j ≤ + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j (fun R => Aρ R + (Aω R + Ag R)) := by + unfold weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + have hsplit : + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j (fun R => Aρ R + (Aω R + Ag R)) = + coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Aρ + + (coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Aω + + coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Ag) := by + rw [descendantsAverage_add Q j Aρ (fun R => Aω R + Ag R)] + rw [descendantsAverage_add Q j Aω Ag] + ring + have hsum : + coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Aρ + + (coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Aω + + coarsePoincareRHSDepthWeight s j * descendantsAverage Q j Ag) ≤ + Bρ + (BωNeg + BωForce) := by + exact add_le_add (hρEnergyAvg j) + (add_le_add (hωNegSqAvg j) (hcenteredForceSqAvg j)) + exact hscaled.trans (by rw [hsplit]; exact hsum.trans hbudget) + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBVForce.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBVForce.lean new file mode 100644 index 0000000000..f3762317ab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletBVForce.lean @@ -0,0 +1,334 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletBV + +/-! # RHSConstant Apex Zero Dirichlet BVForce -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Centered-force averaged `BV` localization for the zero-Dirichlet RHS apex + +This leaf proves the raw averaged localization estimate for the centered-force +part of the harmonic-remainder `BV` budget. It deliberately stops at the +natural `s^{-2} * lambda^{-1}` scale; converting this into the corrected +weak-flux compact scale is a separate coefficient-normalization step. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +/-- +Raw averaged control of the centered-force part of the harmonic-remainder +`BV` budget. + +This proves the analytic localization step before any enlargement to the +corrected weak-flux compact scale. The natural output has +`s^{-2} * lambda^{-1}` units. +-/ +theorem zeroTraceDirichletHarmonicRemainderCenteredForceAverage_le_raw_lambdaInv + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + ∀ j : ℕ, + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2) ≤ + 250 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + ((s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + intro j + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let M : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let N : ℝ := M * Real.sqrt 2 + let W : ℝ := coarsePoincareRHSDepthWeight s j + let T : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + let A : TriadicCube d → ℝ := fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (M * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2 + let C : ℝ := 250 * (s⁻¹) ^ 2 * (T * L) * M ^ 2 + have hs_half : 0 < s / 2 := by nlinarith + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) + (2 / 2)) := by + have hsum : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa using hsum + have hlocal_lambda : + ∀ R ∈ descendantsAtDepth Q j, + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ T * L := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hloc : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) + (2 * (s / 2) * + (Int.toNat (Q.scale - (Q.scale - (j : ℤ))) : ℝ)) * + L := by + simpa [L] using + multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a (s / 2) 2 + (by nlinarith : 0 ≤ s / 2) (by norm_num) hRscale hsum_half + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + omega + rw [hdiff] + simp + have hloc' : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (j : ℝ)) * L := by + simpa [htoNat] using hloc + simpa [T, show 2 * (s / 2) * (j : ℝ) = s * (j : ℝ) by ring] using hloc' + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hT_nonneg : 0 ≤ T := by + dsimp [T] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + A R ≤ + C * + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2 := by + intro R hR + let GR : ℝ := + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g) + have hcoeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * (M * GR) ^ 2 := by + positivity + calc + A R = + (250 * (s⁻¹) ^ 2 * (M * GR) ^ 2) * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by + dsimp [A, GR] + ring + _ ≤ + (250 * (s⁻¹) ^ 2 * (M * GR) ^ 2) * (T * L) := by + exact mul_le_mul_of_nonneg_left (hlocal_lambda R hR) hcoeff_nonneg + _ = C * GR ^ 2 := by + dsimp [C, GR] + ring + have hlocal_avg : + descendantsAverage Q j A ≤ + C * descendantsAverage Q j + (fun R => + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2) := by + calc + descendantsAverage Q j A ≤ + descendantsAverage Q j + (fun R => + C * + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2) := by + exact descendantsAverage_le_descendantsAverage Q j hpoint + _ = + C * descendantsAverage Q j + (fun R => + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2) := by + exact descendantsAverage_smul Q j C _ + have hmem_desc : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := by + intro n R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hlocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro R hR + exact + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + have hcentered_avg : + descendantsAverage Q j + (fun R => + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2) ≤ + coarsePoincareRHSGlobalForceBound Q g s j := by + have heq := + descendantsAverage_sq_coarsePoincareRHSLocalCenteredForceSeminorm_eq_of_mem + Q g s j hmem_desc + have huncentered := + descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + Q g s j hGlobalBdd hlocalBdd + calc + descendantsAverage Q j + (fun R => + (cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2) + = + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + simpa [coarsePoincareRHSLocalCenteredForceSeminorm] using heq + _ ≤ coarsePoincareRHSGlobalForceBound Q g s j := huncentered + have hlocal_global : + descendantsAverage Q j A ≤ + C * coarsePoincareRHSGlobalForceBound Q g s j := + hlocal_avg.trans (mul_le_mul_of_nonneg_left hcentered_avg hC_nonneg) + have hweight_nonneg : 0 ≤ W := by + dsimp [W] + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hcancel : W * T = 1 := by + dsimp [W, T] + unfold coarsePoincareRHSDepthWeight + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) + = Real.rpow (3 : ℝ) ((-s * (j : ℝ)) + s * (j : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (-s * (j : ℝ)) (s * (j : ℝ))).symm + _ = 1 := by + have hsum : (-s * (j : ℝ)) + s * (j : ℝ) = 0 := by ring + rw [hsum] + simp + have hglobal_le_Gsq : + coarsePoincareRHSGlobalForceBound Q g s j ≤ G ^ 2 := by + let T0 : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have hT0_pos : 0 < T0 := by + dsimp [T0] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hT0_ge_one : 1 ≤ T0 := by + dsimp [T0] + have hpow := Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) + (mul_nonneg hs.le (by positivity : 0 ≤ (j : ℝ))) + simpa using hpow + have hT0_sq_ge_one : 1 ≤ T0 ^ 2 := by + nlinarith [sq_nonneg T0] + have hinv_le_one : (T0 ^ 2)⁻¹ ≤ 1 := + inv_le_one_of_one_le₀ hT0_sq_ge_one + calc + coarsePoincareRHSGlobalForceBound Q g s j = + (T0 ^ 2)⁻¹ * G ^ 2 := by + dsimp [T0, G] + rfl + _ ≤ 1 * G ^ 2 := by + exact mul_le_mul_of_nonneg_right hinv_le_one (sq_nonneg G) + _ = G ^ 2 := by ring + have hcoeff_raw_nonneg : 0 ≤ 250 * (s⁻¹) ^ 2 * L * M ^ 2 := by + positivity + have hweighted_raw : + W * descendantsAverage Q j A ≤ + (250 * (s⁻¹) ^ 2 * L * M ^ 2) * + coarsePoincareRHSGlobalForceBound Q g s j := by + have hmul := mul_le_mul_of_nonneg_left hlocal_global hweight_nonneg + calc + W * descendantsAverage Q j A ≤ + W * (C * coarsePoincareRHSGlobalForceBound Q g s j) := hmul + _ = + (W * T) * + ((250 * (s⁻¹) ^ 2 * L * M ^ 2) * + coarsePoincareRHSGlobalForceBound Q g s j) := by + dsimp [C] + ring + _ = + (250 * (s⁻¹) ^ 2 * L * M ^ 2) * + coarsePoincareRHSGlobalForceBound Q g s j := by + rw [hcancel] + ring + have hraw : + W * descendantsAverage Q j A ≤ + (250 * (s⁻¹) ^ 2 * L * M ^ 2) * G ^ 2 := + hweighted_raw.trans + (mul_le_mul_of_nonneg_left hglobal_le_Gsq hcoeff_raw_nonneg) + have hsqrt_two_sq : (Real.sqrt 2) ^ 2 = (2 : ℝ) := by + rw [Real.sq_sqrt] + norm_num + have hN_sq : N ^ 2 = 2 * M ^ 2 := by + dsimp [N] + calc + (M * Real.sqrt 2) ^ 2 = M ^ 2 * (Real.sqrt 2) ^ 2 := by ring + _ = M ^ 2 * 2 := by rw [hsqrt_two_sq] + _ = 2 * M ^ 2 := by ring + have hM_sq_le_N_sq : M ^ 2 ≤ N ^ 2 := by + rw [hN_sq] + nlinarith [sq_nonneg M] + have hcoeff_N_nonneg : 0 ≤ 250 * (s⁻¹) ^ 2 * L * G ^ 2 := by + positivity + calc + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j + (fun R => + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2) + = + W * descendantsAverage Q j A := by + apply congrArg (fun F : TriadicCube d → ℝ => W * descendantsAverage Q j F) + funext R + dsimp [A, M] + ring + _ ≤ (250 * (s⁻¹) ^ 2 * L * M ^ 2) * G ^ 2 := hraw + _ = + (250 * (s⁻¹) ^ 2 * L * G ^ 2) * M ^ 2 := by ring + _ ≤ + (250 * (s⁻¹) ^ 2 * L * G ^ 2) * N ^ 2 := by + exact mul_le_mul_of_nonneg_left hM_sq_le_N_sq hcoeff_N_nonneg + _ = + 250 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + ((s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [N, M, L, G] + ring + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFlux.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFlux.lean new file mode 100644 index 0000000000..5cc85b1043 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFlux.lean @@ -0,0 +1,392 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletHomogeneous +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedGlobalIteration + +/-! # RHSConstant Apex Zero Dirichlet Corrected Weak Flux -/ + +@[expose] public section +namespace Homogenization + +noncomputable section + +/-! +# Corrected zero-Dirichlet weak-flux component route + +This leaf is the live bridge from the zero-Dirichlet apex to the corrected +`Lambda * lambda^{-1}` weak-flux scalar surface. It uses the corrector-energy +recurrence directly, avoiding the older absorbed forcing route whose displayed +force term has `Lambda^2` units. +-/ + +open scoped BigOperators ENNReal +namespace ZeroTraceDirichletCorrectorData + +private theorem coarsePoincareRHSDepthWeight_nonneg (s : ℝ) (n : ℕ) : + 0 ≤ coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem isEllipticFieldOn_descendant_cubeSet_of_parent + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hRdesc : ∃ n : ℕ, R ∈ descendantsAtDepth Q n) : + IsEllipticFieldOn lam Lam (cubeSet R) a := by + rcases hRdesc with ⟨n, hRn⟩ + exact IsEllipticFieldOn.mono hEll (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hRn) + +private theorem weakFluxRHSLocalCorrectorEnergyErrorAverage_nonneg_of_descendant_ellipticity + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (z : TriadicCube d → Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (n : ℕ) : + 0 ≤ weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n := by + unfold weakFluxRHSLocalCorrectorEnergyErrorAverage + exact descendantsAverage_nonneg Q n _ fun R hR => by + unfold weakFluxRHSLocalCorrectorEnergyError + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (weakFluxRHSLocalCoeff_nonneg R a hs)) + (cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + R a (z R) + (isEllipticFieldOn_descendant_cubeSet_of_parent hEll ⟨n, hR⟩)) + +private theorem openCubeDescendantDeterministicCoarseData_of_descendant_depth + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hRdesc : ∃ n : ℕ, R ∈ descendantsAtDepth Q n) : + OpenCubeDescendantDeterministicCoarseData R a := by + rcases hRdesc with ⟨n, hRn⟩ + have hRn_scale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hRn + have hn_scale : Q.scale - (n : ℤ) ≤ Q.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + exact OpenCubeDescendantDeterministicCoarseData.of_mem_descendantsAtScale + hData hn_scale hRn_scale + +private theorem summable_qtwo_maxDescendantBBlockNormAtScale_of_descendant_depth + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} {s : ℝ} + (hs : 0 < s) + (hRdesc : ∃ n : ℕ, R ∈ descendantsAtDepth Q n) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a)) : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) := by + rcases hRdesc with ⟨n, hRn⟩ + have hsum' : + Summable (fun m : ℕ => + geometricWeight s 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) + (2 / 2 : ℝ)) := by + simpa using hsum + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hRn + have hdesc : + Summable (fun m : ℕ => + geometricWeight s 2 m * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) + (2 / 2 : ℝ)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_rpow_q_div_two_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (n : ℤ)) a s 2 hs.le + (by norm_num) hRscale hsum' + simpa using hdesc + +private theorem weakFluxRHSScaledAveragedSeminormSq_bddAbove_of_flux_memLp + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (u : Vec d → Vec d) (hs : 0 < s) + (hflux : + MeasureTheory.MemLp (fun x => matVecMul (a x) (u x)) + (2 : ENNReal) (normalizedCubeMeasure Q)) : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n) := by + simpa [weakFluxRHSScaledAveragedSeminormSq, weakFluxRHSAveragedSeminormSq, + coarsePoincareRHSSn, coarsePoincareRHSRn] using + coarsePoincareRHSSn_bddAbove_of_memLp Q hs + (fun x => matVecMul (a x) (u x)) hflux + +private theorem zeroTraceDirichletWeakFluxCoefficientComponent_bound + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s k * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a + (fun x => ρ.toH10.toH1Function.grad x) s k ≤ + weakFluxRHSWeightedCoefficientEnergyBase Q a + (fun x => ρ.toH10.toH1Function.grad x) s := by + intro k + have hs_half : 0 < s / 2 := by nlinarith + have hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1) := by + have hsum : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa [Real.rpow_one] using hsum + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEll.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have havg_nonneg : + ∀ R ∈ descendantsAtDepth Q k, + 0 ≤ cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := by + intro R hR + exact + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + R a (fun x => ρ.toH10.toH1Function.grad x) + (isEllipticFieldOn_descendant_cubeSet_of_parent hEll ⟨k, hR⟩) + have hint : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + exact + weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_weightedCoefficientEnergyBase + Q a (fun x => ρ.toH10.toH1Function.grad x) k hs hEllOpen hData + hsum_half havg_nonneg hint + +/-- Displayed dimensional scale in the corrected zero-Dirichlet scalar budgets. -/ +noncomputable def zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + (d : ℕ) (s : ℝ) : ℝ := + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + +/-- Fixed internal scalar constant for the corrected zero-Dirichlet apex route. -/ +noncomputable def zeroTraceDirichletCorrectedWeakFluxApexConstant + (d : ℕ) (s : ℝ) : ℝ := + 2000 * zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s + +theorem zeroTraceDirichletCorrectedWeakFluxApexDisplayScale_nonneg + (d : ℕ) (s : ℝ) : + 0 ≤ zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s := by + unfold zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + exact mul_nonneg + (by exact_mod_cast Nat.zero_le d) + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + +theorem zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg + (d : ℕ) (s : ℝ) : + 0 ≤ zeroTraceDirichletCorrectedWeakFluxApexConstant d s := by + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + exact mul_nonneg (by norm_num : 0 ≤ (2000 : ℝ)) + (zeroTraceDirichletCorrectedWeakFluxApexDisplayScale_nonneg d s) + +theorem zeroTraceDirichletCorrectedWeakFluxApexPoincareConstant_sq + (d : ℕ) (s : ℝ) : + 177500 * + (zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s) ^ 2 ≤ + (zeroTraceDirichletCorrectedWeakFluxApexConstant d s) ^ 2 := by + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + nlinarith [sq_nonneg + (zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s)] + +/-- +Localized zero-Dirichlet weak-flux estimate through the corrector-energy +component iteration. + +The `u` coefficient-energy component is discharged internally from the +coefficient-localization bound; `hcorr` is the remaining Neumann-corrector +component input. No `Lambda^2` absorbed-force estimate is used here. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_grad_le_sqrt_correctorEnergyComponents_of_selectors + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) {Bcorr lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (m : ℕ) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (z : TriadicCube d → Vec d → Vec d) + (hzdecomp : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w0 : AHarmonicFunction a (cubeSet R), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + z R x) + (hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a + z s (m + k) ≤ + Bcorr) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a + (fun x => ρ.toH10.toH1Function.grad x) s + Bcorr) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hBcoeff_nonneg : + 0 ≤ weakFluxRHSWeightedCoefficientEnergyBase Q a + (fun x => ρ.toH10.toH1Function.grad x) s := by + have havg_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a (fun x => ρ.toH10.toH1Function.grad x) hEll + exact + weakFluxRHSWeightedCoefficientEnergyBase_nonneg Q a + (fun x => ρ.toH10.toH1Function.grad x) hs havg_nonneg + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll hData + have hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a + (fun x => ρ.toH10.toH1Function.grad x) s (m + k) ≤ + weakFluxRHSWeightedCoefficientEnergyBase Q a + (fun x => ρ.toH10.toH1Function.grad x) s := by + intro k + exact + zeroTraceDirichletWeakFluxCoefficientComponent_bound + (Q := Q) (a := a) (g := g) ρ hs hEll hData (m + k) + have hBcorr_nonneg : 0 ≤ Bcorr := by + have havg_nonneg : + 0 ≤ weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s m := + weakFluxRHSLocalCorrectorEnergyErrorAverage_nonneg_of_descendant_ellipticity + (Q := Q) (a := a) + (z := z) + (s := s) (lam := lam) (Lam := Lam) hs hEll m + have hleft_nonneg : + 0 ≤ coarsePoincareRHSDepthWeight s (m + 0) * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s (m + 0) := by + simpa using + mul_nonneg (coarsePoincareRHSDepthWeight_nonneg s m) havg_nonneg + exact hleft_nonneg.trans (hcorr 0) + have hρMemQ : + MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ρ.toH10.toH1Function.grad_memVectorL2 + have hfluxMemQ : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hweakBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s + (fun x => ρ.toH10.toH1Function.grad x) n) := + weakFluxRHSScaledAveragedSeminormSq_bddAbove_of_flux_memLp Q a + (fun x => ρ.toH10.toH1Function.grad x) hs + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hfluxMemQ) + have hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x))) := by + intro R hRdesc S hS + rcases hRdesc with ⟨j, hR⟩ + have hSQ : S ∈ descendantsAtDepth Q (j + 1) := + mem_descendantsAtDepth_add hR hS + have hρMemS : + MemVectorL2 (cubeSet S) + (fun x => ρ.toH10.toH1Function.grad x) := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure S + (memLp_on_descendant_of_memLp_generic (E := Vec d) hSQ hρMemQ) + have hfluxMemS : + MemVectorL2 (cubeSet S) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn + (isEllipticFieldOn_descendant_cubeSet_of_parent hEll ⟨j + 1, hSQ⟩) + hρMemS + exact + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp S hs + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet S hfluxMemS) + have hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => + matVecMul (a x) (ρ.toH10.toH1Function.grad x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a + (fun x => ρ.toH10.toH1Function.grad x) + (z R) s := by + intro j R hR + have hRdesc : ∃ n : ℕ, R ∈ descendantsAtDepth Q n := ⟨j, hR⟩ + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + isEllipticFieldOn_descendant_cubeSet_of_parent hEll hRdesc + have hρMemR : + MemVectorL2 (cubeSet R) + (fun x => ρ.toH10.toH1Function.grad x) := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hρMemQ) + have hgMemR : MemVectorL2 (cubeSet R) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg) + rcases hzdecomp j R hR with ⟨ωR, wR, hzR, hdecompR⟩ + have hflux : + CubeAverageFluxEnergyControl R a + (fun x => matVecMul (a x) (wR.toH1.grad x)) + (coefficientEnergyDensity a (fun x => wR.toH1.grad x)) := by + simpa [scalarVariationEnergyIntegrand, coefficientEnergyDensity] using! + cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := R) (a := a) hEllR wR + (openCubeDescendantDeterministicCoarseData_of_descendant_depth + hData hRdesc) + have hdecompω : + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + wR.toH1.grad x + ωR.toH1MeanZero.toH1Function.grad x := by + simpa [hzR] using hdecompR + have hstep := + ωR.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_correctorEnergyLocalError_of_childBddAbove + (u := fun x => ρ.toH10.toH1Function.grad x) wR s hs + hEllR hρMemR hgMemR hflux + (summable_qtwo_maxDescendantBBlockNormAtScale_of_descendant_depth + hs hRdesc hsum) + hdecompω (hchildBdd R hRdesc) + simpa [hzR] using hstep + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_correctorEnergyComponents_bddAbove + (Q := Q) (a := a) (s := s) + (u := fun x => ρ.toH10.toH1Function.grad x) + (z := z) + hs hlocal m hweakBdd hBcoeff_nonneg hBcorr_nonneg hcoeff hcorr + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged.lean new file mode 100644 index 0000000000..0066f31df6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletCorrectedWeakFluxAveraged.lean @@ -0,0 +1,745 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletCorrectedWeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyAveraged + +/-! # RHSConstant Apex Zero Dirichlet Corrected Weak Flux Averaged -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Corrected zero-Dirichlet weak-flux apex with averaged corrector energy + +This leaf consumes the proved averaged Neumann-corrector energy estimate in the +corrected zero-Dirichlet weak-flux route. It removes the exposed +`hcorr`/`hcorrectorBudget` arguments from the previous component theorem and +constructs the descendant harmonic-remainder selector inside the apex. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +/-- +The corrected weak-flux component with the averaged corrector-energy force +budget inserted directly. + +This is the scalar repair that avoids the false comparison +`lambda^{-1} <= Lambda`: the coefficient-energy component is bounded by the +proved weak-flux energy compact scale, and the corrector-energy component is +bounded by its own proved `Lambda * lambda^{-1}` force scale. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_averagedCorrectorEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (C s : ℝ) {Bcorr lam Lam : ℝ} + (hC_nonneg : 0 ≤ C) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (z : TriadicCube d → Vec d → Vec d) + (hzdecomp : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w0 : AHarmonicFunction a (cubeSet R), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + z R x) + (hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s k * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s k ≤ + Bcorr) + (hcorrectorForceBudget : + Bcorr * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + (hC_sq : + 32500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 + + 2500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + C ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + let Bcoeff : ℝ := + weakFluxRHSWeightedCoefficientEnergyBase Q a + (fun x => ρ.toH10.toH1Function.grad x) s + let H : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let LamQ : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let K : ℝ := + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * LamQ * L * G ^ 2 + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have havg_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a (fun x => ρ.toH10.toH1Function.grad x) hEll + have hBcoeff_nonneg : 0 ≤ Bcoeff := by + dsimp [Bcoeff] + exact + weakFluxRHSWeightedCoefficientEnergyBase_nonneg Q a + (fun x => ρ.toH10.toH1Function.grad x) hs havg_nonneg + have hBcorr_nonneg : 0 ≤ Bcorr := by + have havg_corr_nonneg : + 0 ≤ weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s 0 := by + unfold weakFluxRHSLocalCorrectorEnergyErrorAverage + exact descendantsAverage_nonneg Q 0 _ fun R hR => by + unfold weakFluxRHSLocalCorrectorEnergyError + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR) + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (weakFluxRHSLocalCoeff_nonneg R a hs)) + (cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEllR + (z R))) + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s 0 := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + exact (mul_nonneg hweight_nonneg havg_corr_nonneg).trans (hcorr 0) + have hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) 0 ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s 0)⁻¹ * + ((Bcoeff + Bcorr) * H)) := by + simpa [Bcoeff, H] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_grad_le_sqrt_correctorEnergyComponents_of_selectors + (Q := Q) (a := a) (g := g) ρ (s := s) + (Bcorr := Bcorr) (lam := lam) (Lam := Lam) + hs hEll 0 hg z hzdecomp + (by intro k; simpa using hcorr k) + have hfluxV_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x))) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hfluxV_mem) + have hseminorm_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) hfluxV_bdd + have hH_nonneg : 0 ≤ H := by + dsimp [H] + have hr_lt_one : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hrad_nonneg : 0 ≤ (Bcoeff + Bcorr) * H := + mul_nonneg (add_nonneg hBcoeff_nonneg hBcorr_nonneg) hH_nonneg + have htarget_nonneg : + 0 ≤ C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + mul_nonneg hC_nonneg + (coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + Q a g hs hGlobalBdd) + have henergyEnvelope : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hcoeffNote : + Bcoeff * H ≤ + 50 * (s⁻¹) ^ 2 * LamQ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := by + simpa [Bcoeff, H, LamQ] using + weakFluxRHSWeightedCoefficientEnergyBase_mul_inv_one_sub_step_le_noteEnergySquare + Q a (fun x => ρ.toH10.toH1Function.grad x) hs hs_le havg_nonneg + have hcoeffMultiplier_nonneg : + 0 ≤ 50 * (s⁻¹) ^ 2 * LamQ := by + dsimp [LamQ] + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (50 : ℝ)) (sq_nonneg (s⁻¹))) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ))) + have hcoeffEnvelope : + Bcoeff * H ≤ + 50 * (s⁻¹) ^ 2 * LamQ * + zeroTraceDirichletEnergyEnvelope Q a s g := by + calc + Bcoeff * H ≤ + 50 * (s⁻¹) ^ 2 * LamQ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := hcoeffNote + _ ≤ + 50 * (s⁻¹) ^ 2 * LamQ * + zeroTraceDirichletEnergyEnvelope Q a s g := by + exact mul_le_mul_of_nonneg_left henergyEnvelope hcoeffMultiplier_nonneg + have henergyScale : + 50 * (s⁻¹) ^ 2 * LamQ * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + (32500 * N ^ 2) * K := by + simpa [LamQ, L, N, G, K, mul_assoc, mul_left_comm, mul_comm] using + zeroTraceDirichletWeakFluxDisplayedEnergyScale_le_compact_sq + Q a g hs hs_le hG_nonneg + have hcorrectorScale : + 2500 * (s⁻¹) ^ 4 * + LamQ * L * N ^ 2 * G ^ 2 ≤ + (2500 * N ^ 2) * K := by + have hbase : + 2500 * (s⁻¹) ^ 4 * LamQ * L * N ^ 2 ≤ + (2500 * N ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * LamQ * L) := by + simpa [LamQ, L, N, mul_assoc, mul_left_comm, mul_comm] using + zeroTraceDirichletWeakFluxDisplayedForceScale_le_compact_sq + (Q := Q) (a := a) (s := s) + (AweakForce := 2500 * N ^ 2) hs hs_le + (by simp [N]) + have hscaled := mul_le_mul_of_nonneg_right hbase (sq_nonneg G) + calc + 2500 * (s⁻¹) ^ 4 * LamQ * L * N ^ 2 * G ^ 2 + = + (2500 * (s⁻¹) ^ 4 * LamQ * L * N ^ 2) * G ^ 2 := by ring + _ ≤ + ((2500 * N ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * LamQ * L)) * G ^ 2 := + hscaled + _ = (2500 * N ^ 2) * K := by + dsimp [K] + ring + have hK_nonneg : 0 ≤ K := by + have hLam_nonneg : 0 ≤ LamQ := by + dsimp [LamQ] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + dsimp [K, L] + positivity + have hcomponentBudget : + (Bcoeff + Bcorr) * H ≤ + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 := by + have hcoeffCompact : Bcoeff * H ≤ (32500 * N ^ 2) * K := + hcoeffEnvelope.trans henergyScale + have hcorrCompact : Bcorr * H ≤ (2500 * N ^ 2) * K := by + calc + Bcorr * H ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + simpa [H] using hcorrectorForceBudget + _ ≤ (2500 * N ^ 2) * K := by + simpa [LamQ, L, N, G, mul_assoc, mul_left_comm, mul_comm] using + hcorrectorScale + have hsum : + Bcoeff * H + Bcorr * H ≤ + (32500 * N ^ 2) * K + (2500 * N ^ 2) * K := + add_le_add hcoeffCompact hcorrCompact + have halloc_scaled : + (32500 * N ^ 2 + 2500 * N ^ 2) * K ≤ C ^ 2 * K := + mul_le_mul_of_nonneg_right hC_sq hK_nonneg + calc + (Bcoeff + Bcorr) * H = Bcoeff * H + Bcorr * H := by ring + _ ≤ (32500 * N ^ 2) * K + (2500 * N ^ 2) * K := hsum + _ = (32500 * N ^ 2 + 2500 * N ^ 2) * K := by ring + _ ≤ C ^ 2 * K := halloc_scaled + _ = + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 := by + rw [const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_sq_eq + Q a C g hs] + dsimp [K, LamQ, L, G] + ring + have hsqrt : + Real.sqrt ((Bcoeff + Bcorr) * H) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + Real.sqrt_le_of_le_sq hrad_nonneg htarget_nonneg hcomponentBudget + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + = + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) 0 := by + exact + (localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg + Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + hseminorm_nonneg).symm + _ ≤ Real.sqrt + ((coarsePoincareRHSDepthWeight s 0)⁻¹ * + ((Bcoeff + Bcorr) * H)) := hlocalized + _ = Real.sqrt ((Bcoeff + Bcorr) * H) := by + simp [coarsePoincareRHSDepthWeight] + _ ≤ C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := hsqrt + +/-- +Zero-Dirichlet one-cube RHS apex with the weak-flux component routed directly +through the proved averaged corrector-energy budget. The theorem no longer +exposes `Bcorr`, `hcorr`, `hcorrectorBudget`, or the invalid +`lambda^{-1} <= Lambda` comparison, and it constructs the descendant +`omega`/`w0` harmonic-remainder decomposition internally. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_correctedWeakFlux_averagedCorrectorEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (a0 : Mat d) (s : ℝ) (gradU : Vec d → Vec d) + (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hgrad : ∀ x ∈ cubeSet Q, + gradU x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound Q a a0 s gradU g := by + classical + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let Bcorr : ℝ := + 1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + N ^ 2 * G ^ 2 + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + let IsDescendantOfQ : TriadicCube d → Prop := + fun R => ∃ n : ℕ, R ∈ descendantsAtDepth Q n + have hρMemQ : + MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ρ.toH10.toH1Function.grad_memVectorL2 + have hgMemQ : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + have hresidual : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x) - g x) := + ρ.residualFlux_solenoidal hEll hgMemQ + have hlocalSelector : + ∀ R : TriadicCube d, IsDescendantOfQ R → + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w0 : AHarmonicFunction a (cubeSet R), + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + + ω.toH1MeanZero.toH1Function.grad x := by + intro R hRdesc + rcases hRdesc with ⟨j, hR⟩ + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + isEllipticFieldOn_descendant_cubeSet_of_parent hEll ⟨j, hR⟩ + have hρMemR : + MemVectorL2 (cubeSet R) + (fun x => ρ.toH10.toH1Function.grad x) := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hρMemQ) + have hgMemR : MemVectorL2 (cubeSet R) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg) + exact + MeanZeroNeumannCorrectorData.exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := Q) (R := R) (a := a) (g := g) + (n := j) (lam := lam) (Lam := Lam) + (u := fun x => ρ.toH10.toH1Function.grad x) + ρ.toH10.toH1Function.isPotentialOn hresidual hR hEllR + hρMemR hgMemR (h1CoerciveEstimate_cubeSet R) + let z : TriadicCube d → Vec d → Vec d := + fun R => + if hR : IsDescendantOfQ R then + fun x => + (Classical.choose (hlocalSelector R hR)).toH1MeanZero.toH1Function.grad x + else + 0 + have hzdecomp : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w0 : AHarmonicFunction a (cubeSet R), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + z R x := by + intro j R hR + have hRdesc : IsDescendantOfQ R := ⟨j, hR⟩ + let ωR : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocalSelector R hRdesc) + let wR : AHarmonicFunction a (cubeSet R) := + Classical.choose (Classical.choose_spec (hlocalSelector R hRdesc)) + have hzR : + z R = fun x => ωR.toH1MeanZero.toH1Function.grad x := by + simp [z, hRdesc, ωR] + have hdecompR : + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + wR.toH1.grad x + ωR.toH1MeanZero.toH1Function.grad x := by + simpa [ωR, wR] using + Classical.choose_spec + (Classical.choose_spec (hlocalSelector R hRdesc)) + refine ⟨ωR, wR, hzR, ?_⟩ + intro x hx + rw [hzR] + exact hdecompR x hx + have hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s k * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s k ≤ + Bcorr := by + intro k + simpa [Bcorr, N, G] using + weakFluxRHSDepthWeight_mul_correctorEnergyErrorAverage_le_forceScale + (Q := Q) (a := a) (g := g) (s := s) (n := k) + hs hs_le hEll hg hGlobalBdd + z + (by + intro R hR + rcases hzdecomp k R hR with ⟨ωR, _wR, hzR, _hdecompR⟩ + exact ⟨ωR, hzR⟩) + have hcorrectorForceBudget : + Bcorr * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + N ^ 2 * G ^ 2 := by + simpa [Bcorr, N, G] using + weakFluxRHSCorrectorEnergyForceScale_mul_inv_one_sub_step_le_noteForceScale + (Q := Q) (a := a) (g := g) (s := s) hs hs_le + have hC_nonneg : + 0 ≤ zeroTraceDirichletCorrectedWeakFluxApexConstant d s := + zeroTraceDirichletCorrectedWeakFluxApexConstant_nonneg d s + have hweakFluxC_sq : + 32500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 + + 2500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + (zeroTraceDirichletCorrectedWeakFluxApexConstant d s) ^ 2 := by + let Dscale : ℝ := zeroTraceDirichletCorrectedWeakFluxApexDisplayScale d s + have hD_nonneg : 0 ≤ Dscale ^ 2 := sq_nonneg Dscale + have hsmall : + 32500 * Dscale ^ 2 + 2500 * Dscale ^ 2 ≤ (2000 * Dscale) ^ 2 := by + nlinarith [hD_nonneg] + simpa [Dscale, zeroTraceDirichletCorrectedWeakFluxApexConstant, + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale, + add_assoc, add_comm, add_left_comm] using hsmall + have hweakρ : + IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) + ρ.toH10.toH1Function g := by + intro φ + exact ρ.weakSolution φ + have hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) ρ.toH10.toH1Function.grad := by + intro j R hR + exact + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hρMemQ) + have hPoincareC_sq : + 177500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + (zeroTraceDirichletCorrectedWeakFluxApexConstant d s) ^ 2 := by + simpa [zeroTraceDirichletCorrectedWeakFluxApexDisplayScale] using + zeroTraceDirichletCorrectedWeakFluxApexPoincareConstant_sq d s + rcases + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_const_ge + (Q := Q) (a := a) (a0 := a0) + (C := zeroTraceDirichletCorrectedWeakFluxApexConstant d s) (g := g) + hs hs_le hG_nonneg hPoincareC_sq with + ⟨BPoincareEnergy, BPoincareForce, hPoincareEnergyBudget, + hPoincareForce, hPoincareBudget⟩ + have hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + ρ.toH10.toH1Function.grad) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + ρ.toH10.toH1Function.grad hρMemQ + have hfluxV_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x))) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hfluxV_mem) + have ha0Field : + IsEllipticFieldOn lam0 Lam0 (cubeSet Q) (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_cubeSet Q) ha0 + have hfluxW_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (w.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll w.toH1.grad_memVectorL2 + have ha0W_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (w.toH1.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn ha0Field w.toH1.grad_memVectorL2 + have hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 w.toH1.grad) := by + unfold fluxDefect + exact hfluxW_mem.sub ha0W_mem + have ha0V_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul a0 (ρ.toH10.toH1Function.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn ha0Field + ρ.toH10.toH1Function.grad_memVectorL2 + have hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 w.toH1.grad)) := by + refine ⟨coarseFluxResponseQOneBound Q a a0 s w, ?_⟩ + rintro y ⟨N, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm + Q s N (fluxDefect a a0 w.toH1.grad)).trans <| by + simpa [fluxDefect, coarseFluxResponseQOneBound] using! + coarseFluxResponse_qone_partialSeminorm_le_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) (s := s) + hs hEll ha0 ha0symm w hresponseSum N + have ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (ρ.toH10.toH1Function.grad x))) := by + rcases hgrad_bdd with ⟨M, hM⟩ + refine ⟨matNorm a0 * M, ?_⟩ + rintro y ⟨N0, rfl⟩ + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N0 + (fun x => matVecMul a0 (ρ.toH10.toH1Function.grad x)) + ≤ matNorm a0 * + cubeBesovNegativeVectorPartialSeminormTwo Q s N0 + ρ.toH10.toH1Function.grad := by + exact cubeBesovNegativeVectorPartialSeminormTwo_constMatMul_le + Q s a0 ρ.toH10.toH1Function.grad N0 + (fun j _ R hR => hgrad_mem_desc j R hR) + _ ≤ matNorm a0 * M := by + exact mul_le_mul_of_nonneg_left (hM ⟨N0, rfl⟩) + (matNorm_nonneg a0) + have henergyEnvelope : + cubeAverage Q + (coefficientEnergyDensity a ρ.toH10.toH1Function.grad) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hdisplay_ge_one : + 1 ≤ + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) := + one_le_zeroTraceDirichletDisplayScale_expr (d := d) (s := s) hs + have hdisplay_nonneg : + 0 ≤ (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) := by + simpa [zeroTraceDirichletCorrectedWeakFluxApexDisplayScale] using + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale_nonneg d s + have hhomogeneous : + coarseFluxResponseQOneBound Q a a0 s w ≤ + zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := + coarseFluxResponseQOneBound_le_const_mul_RHSHomogeneousSplitBound_of_zeroTraceDirichlet + (Q := Q) (a := a) (g := g) ρ a0 s gradU w + (lam := lam) (Lam := Lam) + (C := zeroTraceDirichletCorrectedWeakFluxApexConstant d s) + hs hs_le hEll hgrad hg hGlobalBdd + (by + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + nlinarith [hdisplay_ge_one]) + (by + unfold zeroTraceDirichletCorrectedWeakFluxApexConstant + zeroTraceDirichletCorrectedWeakFluxApexDisplayScale + nlinarith [hdisplay_nonneg]) + have hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_of_averagedCorrectorEnergy + (Q := Q) (a := a) (g := g) ρ + (C := zeroTraceDirichletCorrectedWeakFluxApexConstant d s) (s := s) + (Bcorr := Bcorr) (lam := lam) (Lam := Lam) hC_nonneg + hs hs_le hEll hg hGlobalBdd z hzdecomp hcorr + (by simpa [N, G] using hcorrectorForceBudget) + hweakFluxC_sq + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambdaInv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hPoincareCoeff_nonneg : + 0 ≤ (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + exact + mul_nonneg (sq_nonneg (matNorm a0)) + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + hlambdaInv_nonneg) + have hPoincareEnergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a ρ.toH10.toH1Function.grad)) ≤ + BPoincareEnergy := by + calc + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a ρ.toH10.toH1Function.grad)) + = + ((matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeAverage Q + (coefficientEnergyDensity a ρ.toH10.toH1Function.grad) := by + ring + _ ≤ + ((matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + zeroTraceDirichletEnergyEnvelope Q a s g := by + exact mul_le_mul_of_nonneg_left henergyEnvelope hPoincareCoeff_nonneg + _ = + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) := by + ring + _ ≤ BPoincareEnergy := hPoincareEnergyBudget + have ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_const_mul_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + Q a a0 s g ρ.toH10.toH1Function + (zeroTraceDirichletCorrectedWeakFluxApexConstant d s) + hC_nonneg hs hs_le hEll + hweakρ hg hGlobalBdd hgrad_mem_desc hgrad_bdd + hPoincareEnergy hPoincareForce hPoincareBudget + have hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 w.toH1.grad) ≤ + zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := + (cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseQOneBound_of_aHarmonicFunction + Q a a0 s hs hEll ha0 ha0symm w hresponseSum).trans + hhomogeneous + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_const_mul_split_component_bounds + Q a a0 gradU w.toH1.grad ρ.toH10.toH1Function.grad g + hC_nonneg hs hGlobalBdd hgrad hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd hdefectW hfluxV ha0V + +/-- +PDE-facing corrected one-cube RHS apex with the zero-trace corrector and +harmonic split constructed internally from the weak solution. + +This removes the non-proposition `ρ`, `w`, and decomposition arguments from +the corrected averaged route. +-/ +private theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy_of_memLp_of_bddAbove + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (a0 : Mat d) (s : ℝ) (g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 v.grad) ≤ + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound Q a a0 s v.grad g := by + have hgMemQ : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + have hresidual : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (v.grad x) - g x) := + hweak.residual_solenoidal hEll hgMemQ + rcases + ZeroTraceDirichletCorrectorData.exists_corrector_aHarmonicRemainder_of_parent_potential_solenoidal + (Q := Q) (R := Q) (a := a) (g := g) (n := 0) + (lam := lam) (Lam := Lam) (u := v.grad) + v.isPotentialOn hresidual (by simp) hEll v.grad_memVectorL2 hgMemQ with + ⟨ρ, w, hgrad⟩ + exact + ρ.cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_correctedWeakFlux_averagedCorrectorEnergy + (a0 := a0) (s := s) (gradU := v.grad) w + hs hs_le hEll ha0 ha0symm hgrad hg hGlobalBdd hresponseSum + +/-- +PDE-facing corrected one-cube RHS apex with the zero-trace corrector and +harmonic split constructed internally, consuming the note-facing `H^s` +regularity package for the right-hand side. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (a0 : Mat d) (s : ℝ) (g : Vec d → Vec d) + (v : H1Function (cubeSet Q)) {lam Lam lam0 Lam0 : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : CubeVectorBesovHRegularity Q s g) + (hresponseSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 v.grad) ≤ + 2 * zeroTraceDirichletCorrectedWeakFluxApexConstant d s * + coarseFluxResponseRHSBound Q a a0 s v.grad g := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_h1DirichletRhsWeakSolutionOn_correctedWeakFlux_averagedCorrectorEnergy_of_memLp_of_bddAbove + a0 s g v hs hs_le hEll ha0 ha0symm hweak hg.memLp + hg.partialSeminorms_bddAbove hresponseSum + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEnergy.lean new file mode 100644 index 0000000000..7030783a7e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEnergy.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ZeroDirichletEnergy + +/-! # RHSConstant Apex Zero Dirichlet Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Zero-Dirichlet energy input for the one-cube RHS coarse-flux response apex + +This leaf records the zero-trace energy envelope and the Poincare scalar +budget used by the corrected zero-Dirichlet apex route. +-/ + +open scoped BigOperators ENNReal + +/-- +Displayed Poincare scalar budget after the zero-trace energy envelope has +been inserted. +-/ +noncomputable def zeroTraceDirichletPoincareScalarBudget {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +theorem zeroTraceDirichletEnergyEnvelope_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (g : Vec d → Vec d) + (hs : 0 < s) : + 0 ≤ zeroTraceDirichletEnergyEnvelope Q a s g := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hA_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have hforce_nonneg : + 0 ≤ + 2 * + |(d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)| * + Real.sqrt + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (abs_nonneg _)) + (Real.sqrt_nonneg _) + unfold zeroTraceDirichletEnergyEnvelope + exact add_nonneg (mul_nonneg (sq_nonneg _) hA_nonneg) hforce_nonneg + +theorem zeroTraceDirichletPoincareScalarBudget_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (hs : 0 < s) : + 0 ≤ zeroTraceDirichletPoincareScalarBudget Q a a0 s g := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have henergyEnvelope_nonneg : + 0 ≤ zeroTraceDirichletEnergyEnvelope Q a s g := + zeroTraceDirichletEnergyEnvelope_nonneg Q a s g hs + have henergy_inner_nonneg : + 0 ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg)) + henergyEnvelope_nonneg + have hs_inv_pow_four_nonneg : 0 ≤ (s⁻¹) ^ 4 := by + rw [show (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 by ring] + exact sq_nonneg _ + have hforce_inner_nonneg : + 0 ≤ + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (15000 : ℝ)) hs_inv_pow_four_nonneg) + (sq_nonneg ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹))) + (sq_nonneg ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)))) + (sq_nonneg (cubeBesovPositiveVectorSeminormTwo Q s g)) + unfold zeroTraceDirichletPoincareScalarBudget + exact + add_nonneg + (mul_nonneg (sq_nonneg (matNorm a0)) henergy_inner_nonneg) + (mul_nonneg (sq_nonneg (matNorm a0)) hforce_inner_nonneg) + +/-- +Component bounds imply the named Poincare scalar budget inequality. +-/ +theorem zeroTraceDirichletPoincareScalarBudget_le_const_mul_correctionBound_sq_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + zeroTraceDirichletPoincareScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + unfold zeroTraceDirichletPoincareScalarBudget + nlinarith + +/-- +The matrix-weighted depth-zero Poincare expanded radicand is controlled by the +named zero-trace Poincare scalar budget once the correction energy is bounded +by the zero-trace energy envelope. +-/ +theorem matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_zeroTraceDirichletPoincareScalarBudget_of_energy_le_envelope + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (g gradV : Vec d → Vec d) + (hs : 0 < s) + (henergy : + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g) : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + zeroTraceDirichletPoincareScalarBudget Q a a0 s g := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have henergy_coeff_nonneg : + 0 ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have henergy_inner : + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g := + mul_le_mul_of_nonneg_left henergy henergy_coeff_nonneg + have henergy_term : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) := + mul_le_mul_of_nonneg_left henergy_inner (sq_nonneg (matNorm a0)) + unfold coarseFluxResponseRHSPoincareExpandedRadicand + zeroTraceDirichletPoincareScalarBudget + nlinarith + +/-- +Poincare square-radicand closure from the named zero-trace scalar budget. +-/ +theorem matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_const_mul_correctionBound_sq_of_energy_le_envelope_of_zeroTraceDirichletPoincareScalarBudget + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C : ℝ) {s : ℝ} (g gradV : Vec d → Vec d) + (hs : 0 < s) + (henergy : + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g) + (hbudget : + zeroTraceDirichletPoincareScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := + (matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_zeroTraceDirichletPoincareScalarBudget_of_energy_le_envelope + Q a a0 g gradV hs henergy).trans hbudget + +/-- +Poincare square-root absorption from the zero-trace energy envelope and the +named Poincare scalar budget. +-/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_energy_le_envelope_of_zeroTraceDirichletPoincareScalarBudget + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (g gradV : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (henergy : + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g) + (hbudget : + zeroTraceDirichletPoincareScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + exact + matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_const_mul_correctionBound_of_radicand_le_sq + Q a a0 g gradV hC_nonneg hs havg_nonneg hgBdd + (matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_const_mul_correctionBound_sq_of_energy_le_envelope_of_zeroTraceDirichletPoincareScalarBudget + Q a a0 C g gradV hs henergy hbudget) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEstimates.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEstimates.lean new file mode 100644 index 0000000000..e23aad8048 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletEstimates.lean @@ -0,0 +1,758 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletTail + +/-! # RHSConstant Apex Zero Dirichlet Estimates -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Split estimate targets for the zero-Dirichlet RHS flux-response apex + +This leaf separates the remaining analytic inputs to the §3.2.4 +zero-Dirichlet one-cube apex into the two pieces supplied by the manuscript: + +* the harmonic-remainder `BV` tail estimate; +* the displayed weak-flux and Poincare component inequalities. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +/-- +Square expansion for the compact weak-flux correction factor. This is the +scalar core needed by the displayed weak-flux radicand estimate. +-/ +theorem coarseFluxResponseRHSWeakFluxCorrectionBound_sq_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) (hs : 0 < s) : + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 = + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + unfold coarseFluxResponseRHSWeakFluxCorrectionBound + rw [mul_pow, mul_pow, mul_pow, Real.sq_sqrt hLambda_nonneg, + Real.sq_sqrt hlambda_inv_nonneg] + +/-- +Square expansion for the constant-multiplied compact weak-flux correction +factor. This is the exact right-hand side shape of the displayed weak-flux +radicand estimate after the manuscript's constant `C(d)` is inserted. +-/ +theorem const_mul_coarseFluxResponseRHSWeakFluxCorrectionBound_sq_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (C : ℝ) {s : ℝ} + (g : Vec d → Vec d) (hs : 0 < s) : + (C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 = + C ^ 2 * + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + rw [mul_pow, coarseFluxResponseRHSWeakFluxCorrectionBound_sq_eq Q a g hs] + ring + +/-- +Square expansion for the compact Poincare correction factor. This is the +scalar core needed by the displayed Poincare radicand estimate. +-/ +theorem coarseFluxResponseRHSPoincareCorrectionBound_sq_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (g : Vec d → Vec d) : + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 = + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + unfold coarseFluxResponseRHSPoincareCorrectionBound + ring + +/-- +Square expansion for the constant-multiplied compact Poincare correction +factor. This is the exact right-hand side shape of the displayed Poincare +radicand estimate after the manuscript's constant `C(d)` is inserted. +-/ +theorem const_mul_coarseFluxResponseRHSPoincareCorrectionBound_sq_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (C s : ℝ) + (g : Vec d → Vec d) : + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 = + C ^ 2 * + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + rw [mul_pow, coarseFluxResponseRHSPoincareCorrectionBound_sq_eq Q a a0 s g] + ring + +/-- Boundedness side of the harmonic-remainder tail package. -/ +def zeroTraceDirichletHarmonicRemainderTailBounded {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s : ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) + +/-- Squared `BV` estimate side of the harmonic-remainder tail package. -/ +def zeroTraceDirichletHarmonicRemainderBVEstimate {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s BV : ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV + +theorem zeroTraceDirichletHarmonicRemainderBVEstimate_mono {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV BV' : ℝ} + (hBV : BV ≤ BV') + (hestimate : zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV' := by + intro j R hR ω w0 hdecomp + have hweight_nonneg : 0 ≤ (coarsePoincareRHSDepthWeight s j)⁻¹ := by + have hweight_pos : 0 < coarsePoincareRHSDepthWeight s j := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + exact inv_nonneg.mpr hweight_pos.le + exact + (hestimate j R hR ω w0 hdecomp).trans + (mul_le_mul_of_nonneg_left hBV hweight_nonneg) + +theorem zeroTraceDirichletHarmonicRemainderTailBounded_of_pos {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s : ℝ} (hs : 0 < s) : + zeroTraceDirichletHarmonicRemainderTailBounded ρ s := by + intro j R hR ω w0 hdecomp + exact + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => w0.toH1.grad x) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + w0.toH1.grad_memVectorL2) + +theorem zeroTraceDirichletHarmonicRemainderTailClose_bounded {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} + (h : zeroTraceDirichletHarmonicRemainderTailClose ρ s BV) : + zeroTraceDirichletHarmonicRemainderTailBounded ρ s := by + intro j R hR ω w0 hdecomp + exact (zeroTraceDirichletHarmonicRemainderTailClose_constructed h + j R hR ω w0 hdecomp).1 + +theorem zeroTraceDirichletHarmonicRemainderTailClose_bvEstimate {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} + (h : zeroTraceDirichletHarmonicRemainderTailClose ρ s BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := by + intro j R hR ω w0 hdecomp + exact (zeroTraceDirichletHarmonicRemainderTailClose_constructed h + j R hR ω w0 hdecomp).2 + +theorem zeroTraceDirichletHarmonicRemainderTailClose_of_bounded_of_bvEstimate + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV : ℝ} + (hBV_nonneg : 0 ≤ BV) + (hbounded : zeroTraceDirichletHarmonicRemainderTailBounded ρ s) + (hestimate : zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV) : + zeroTraceDirichletHarmonicRemainderTailClose ρ s BV := + zeroTraceDirichletHarmonicRemainderTailClose_of_bounds ρ hBV_nonneg + (by + intro j R hR ω w0 hdecomp + exact ⟨hbounded j R hR ω w0 hdecomp, + hestimate j R hR ω w0 hdecomp⟩) + +theorem zeroTraceDirichletHarmonicRemainderTailClose_of_bvEstimate {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV : ℝ} + (hs : 0 < s) + (hBV_nonneg : 0 ≤ BV) + (hestimate : zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV) : + zeroTraceDirichletHarmonicRemainderTailClose ρ s BV := + zeroTraceDirichletHarmonicRemainderTailClose_of_bounded_of_bvEstimate + ρ hBV_nonneg + (zeroTraceDirichletHarmonicRemainderTailBounded_of_pos ρ hs) + hestimate + +theorem zeroTraceDirichletHarmonicRemainderTailClose_iff_bounded_and_bvEstimate + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} : + zeroTraceDirichletHarmonicRemainderTailClose ρ s BV ↔ + 0 ≤ BV ∧ + zeroTraceDirichletHarmonicRemainderTailBounded ρ s ∧ + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := + ⟨fun h => + ⟨zeroTraceDirichletHarmonicRemainderTailClose_nonneg h, + zeroTraceDirichletHarmonicRemainderTailClose_bounded h, + zeroTraceDirichletHarmonicRemainderTailClose_bvEstimate h⟩, + fun h => + zeroTraceDirichletHarmonicRemainderTailClose_of_bounded_of_bvEstimate + ρ h.1 h.2.1 h.2.2⟩ + +theorem zeroTraceDirichletHarmonicRemainderTailClose_iff_bvEstimate_of_pos + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} (hs : 0 < s) : + zeroTraceDirichletHarmonicRemainderTailClose ρ s BV ↔ + 0 ≤ BV ∧ zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := + ⟨fun h => + ⟨zeroTraceDirichletHarmonicRemainderTailClose_nonneg h, + zeroTraceDirichletHarmonicRemainderTailClose_bvEstimate h⟩, + fun h => + zeroTraceDirichletHarmonicRemainderTailClose_of_bvEstimate + ρ hs h.1 h.2⟩ + +/-- +A descendantwise zero-trace harmonic-remainder `BV` estimate controls the +scaled averaged harmonic-remainder tail used by the weak-flux RHS iteration, +for any selector whose values are produced by the local Neumann-corrector +decompositions. +-/ +theorem zeroTraceDirichletHarmonicRemainderScaledAveragedTail_le_of_bvEstimate_of_selector + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} + (hestimate : zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV) + (v : TriadicCube d → Vec d → Vec d) + (hselector : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w0 : AHarmonicFunction a (cubeSet R), + v R = (fun x => w0.toH1.grad x) ∧ + ∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (m : ℕ) : + ∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ + BV := by + exact + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_tail_le_of_descendant_scaled_sq_bound + Q s v m + (by + intro k R hR + rcases hselector R ⟨m + k, hR⟩ with + ⟨ω, w0, hv_eq, hdecomp⟩ + have hsq := hestimate (m + k) R hR ω w0 hdecomp + simpa [hv_eq] using hsq) + +/-- +The zero-force coarse-Poincare RHS theorem reduces the harmonic-remainder +`BV` estimate to descendantwise coefficient-energy control of the selected +harmonic remainders. +-/ +theorem zeroTraceDirichletHarmonicRemainderBVEstimate_of_zeroForce_energy_bounds + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (henergy : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := by + intro j R hR ω w0 hdecomp + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll_desc R ⟨j, hR⟩ + have hzeroMem : + MeasureTheory.MemLp (0 : Vec d → Vec d) (2 : ENNReal) + (normalizedCubeMeasure R) := by + simp + have hsol : + IsSolenoidalOn (cubeSet R) + (fun x => matVecMul (a x) (w0.toH1.grad x) - + (0 : Vec d → Vec d) x) := by + simpa using w0.isHarmonic.2 + have hsq : + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) := by + simpa using + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := R) (a := a) (g := (0 : Vec d → Vec d)) + (u := fun x => w0.toH1.grad x) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEllR w0.isHarmonic.1 hsol hzeroMem + (cubeBesovPositiveVectorPartialSeminormTwo_zero_bddAbove R s) + exact hsq.trans (henergy j R hR ω w0 hdecomp) + +/-- +The local identity `ρ = w0 + ω` reduces the harmonic-remainder `BV` estimate +to separate coefficient-energy tail bounds for the zero-trace gradient and the +centered Neumann corrector. +-/ +theorem zeroTraceDirichletHarmonicRemainderBVEstimate_of_corrector_neumann_energy_bounds + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV Bρ Bω lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hρEnergy : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ) + (hωEnergy : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bω) + (hbudget : Bρ + Bω ≤ BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := by + refine + zeroTraceDirichletHarmonicRemainderBVEstimate_of_zeroForce_energy_bounds + ρ hs hs_le hEll_desc ?_ + intro j R hR ω w0 hdecomp + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll_desc R ⟨j, hR⟩ + have hρMemQ : + MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ρ.toH10.toH1Function.grad_memVectorL2 + have hρMemR : + MemVectorL2 (cubeSet R) + (fun x => ρ.toH10.toH1Function.grad x) := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R + (memLp_on_descendant_of_memLp_generic (E := Vec d) hR hρMemQ) + have hsplit : + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) ≤ + 2 * cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 2 * cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := + ω.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := fun x => ρ.toH10.toH1Function.grad x) w0 hEllR hdecomp + hρMemR + have hlambda_nonneg : + 0 ≤ lambdaSq R (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg R (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hcoeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have hsplit_weighted : + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => w0.toH1.grad x)) ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + nlinarith [mul_le_mul_of_nonneg_left hsplit hcoeff_nonneg] + have hsplit_bound : + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ + + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bω := + add_le_add (hρEnergy j R hR) (hωEnergy j R hR ω) + have hweight_nonneg : + 0 ≤ (coarsePoincareRHSDepthWeight s j)⁻¹ := by + have hweight_pos : 0 < coarsePoincareRHSDepthWeight s j := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + exact inv_nonneg.mpr hweight_pos.le + have hbudget_weighted : + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ + + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bω ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV := by + calc + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ + + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bω + = + (coarsePoincareRHSDepthWeight s j)⁻¹ * (Bρ + Bω) := by + ring + _ ≤ (coarsePoincareRHSDepthWeight s j)⁻¹ * BV := + mul_le_mul_of_nonneg_left hbudget hweight_nonneg + exact hsplit_weighted.trans (hsplit_bound.trans hbudget_weighted) + +/-- +The centered Neumann-corrector energy identity controls the Neumann half of +the harmonic-remainder `BV` reduction by the product of the corrector negative +seminorm and the centered forcing positive seminorm. +-/ +theorem zeroTraceDirichletHarmonicRemainderBVEstimate_of_corrector_energy_and_neumann_seminorm_bounds + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV Bρ Bω lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hg_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R)) + (hgBdd_centered_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (hρEnergy : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ) + (hωSeminormTail : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bω) + (hbudget : Bρ + Bω ≤ BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := by + refine + zeroTraceDirichletHarmonicRemainderBVEstimate_of_corrector_neumann_energy_bounds + ρ hs hs_le hEll_desc hρEnergy ?_ hbudget + intro j R hR ω + have hgR : + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := + hg_mem_desc j R hR + have hgMemR : MemVectorL2 (cubeSet R) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R hgR + have hωgrad : + MeasureTheory.MemLp (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hωBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => ω.toH1MeanZero.toH1Function.grad x) hωgrad + have hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g)) := + hgBdd_centered_desc j R hR + have hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g) := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s + (fun x => g x - cubeAverageVec R g) hgBdd + have henergy := + ω.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + (s := s) + (Bω := + cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + (Bg := + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) + hs hgMemR hgR hωgrad hBg + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s (fun x => ω.toH1MeanZero.toH1Function.grad x) hωBdd N) + (fun N => + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s (fun x => g x - cubeAverageVec R g) hgBdd N) + have hlambda_nonneg : + 0 ≤ lambdaSq R (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg R (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hcoeff_nonneg : + 0 ≤ 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (500 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + exact + (mul_le_mul_of_nonneg_left henergy hcoeff_nonneg).trans + (hωSeminormTail j R hR ω) + +theorem zeroTraceDirichletHarmonicRemainderBVEstimate_of_corrector_energy_and_neumann_young_bounds + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV Bρ BωNeg BωForce lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hg_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R)) + (hgBdd_centered_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (hρEnergy : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * Bρ) + (hωNegSqTail : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BωNeg) + (hcenteredForceSqTail : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + 250 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g))) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BωForce) + (hbudget : Bρ + (BωNeg + BωForce) ≤ BV) : + zeroTraceDirichletHarmonicRemainderBVEstimate ρ s BV := by + refine + zeroTraceDirichletHarmonicRemainderBVEstimate_of_corrector_energy_and_neumann_seminorm_bounds + ρ hs hs_le hEll_desc hg_mem_desc hgBdd_centered_desc hρEnergy ?_ + hbudget + intro j R hR ω + let W : ℝ := + cubeBesovNegativeVectorSeminormTwo R s + (fun x => ω.toH1MeanZero.toH1Function.grad x) + let G : ℝ := + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g) + let M : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let K : ℝ := + 250 * (s⁻¹) ^ 2 * (lambdaSq R (s / 2) (.finite 2) a)⁻¹ + have hlambda_nonneg : + 0 ≤ lambdaSq R (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg R (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have hYoung : + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * W * G)) ≤ + K * W ^ 2 + K * (M * G) ^ 2 := by + have hbase : 2 * W * (M * G) ≤ W ^ 2 + (M * G) ^ 2 := by + nlinarith [sq_nonneg (W - M * G)] + have hscaled := mul_le_mul_of_nonneg_left hbase hK_nonneg + calc + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * W * G)) + = + K * (2 * W * (M * G)) := by + dsimp [K, M] + ring + _ ≤ K * (W ^ 2 + (M * G) ^ 2) := hscaled + _ = K * W ^ 2 + K * (M * G) ^ 2 := by ring + have htail_sum : + K * W ^ 2 + K * (M * G) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * (BωNeg + BωForce) := by + have hsum := + add_le_add (hωNegSqTail j R hR ω) (hcenteredForceSqTail j R hR) + calc + K * W ^ 2 + K * (M * G) ^ 2 + ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BωNeg + + (coarsePoincareRHSDepthWeight s j)⁻¹ * BωForce := by + simpa [K, W, G, M, mul_assoc, mul_left_comm, mul_comm] using hsum + _ = + (coarsePoincareRHSDepthWeight s j)⁻¹ * (BωNeg + BωForce) := by + ring + exact hYoung.trans htail_sum + +/-- Displayed Poincare component estimates after inserting the energy envelope. -/ +def zeroTraceDirichletPoincareDisplayedComponentBoundsClose {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) : Prop := + ∃ BPoincareEnergy BPoincareForce : ℝ, + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) ≤ + BPoincareEnergy ∧ + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + BPoincareForce ∧ + BPoincareEnergy + BPoincareForce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 + +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + {BPoincareEnergy BPoincareForce : ℝ} + (hPoincareEnergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) ≤ + BPoincareEnergy) + (hPoincareForce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + BPoincareForce) + (hPoincareBudget : + BPoincareEnergy + BPoincareForce ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g := + ⟨BPoincareEnergy, BPoincareForce, hPoincareEnergy, hPoincareForce, + hPoincareBudget⟩ + +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_displayed_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + (hPoincareBudget : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g := + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_bounds + (Q := Q) (a := a) (a0 := a0) (C := C) (s := s) (g := g) + (BPoincareEnergy := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g)) + (BPoincareForce := + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + le_rfl le_rfl + (by simpa [zeroTraceDirichletPoincareDisplayedScalarBudget] using + hPoincareBudget) + +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_displayed_bound + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {a0 : Mat d} + {C s : ℝ} {g : Vec d → Vec d} + (h : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g) : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + rcases h with + ⟨BPoincareEnergy, BPoincareForce, hPoincareEnergy, hPoincareForce, + hPoincareBudget⟩ + unfold zeroTraceDirichletPoincareDisplayedScalarBudget + nlinarith [hPoincareEnergy, hPoincareForce, hPoincareBudget] + +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_iff_displayed_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g ↔ + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := + ⟨zeroTraceDirichletPoincareDisplayedComponentBoundsClose_displayed_bound, + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_displayed_bound + Q a a0 C s g⟩ + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletHomogeneous.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletHomogeneous.lean new file mode 100644 index 0000000000..3f9dcdc76a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletHomogeneous.lean @@ -0,0 +1,441 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletWeakFluxScalarAdequacy + +/-! # RHSConstant Apex Zero Dirichlet Homogeneous -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Homogeneous response discharge for the zero-Dirichlet RHS apex + +This leaf proves the scalar comparison that replaces the harmonic-response +energy of the remainder `w` by the manuscript's homogeneous split bound. The +proof uses the zero-trace energy envelope for the correction field and keeps the +constant requirements explicit so the apex file can close them from its fixed +dimension scale. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +private theorem inv_geometricDiscount_one_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := by + simpa [geometricDiscount] using + inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + +private theorem homogenizationErrorOnCube_infinity_one_nonneg_local + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (hs : 0 ≤ s) : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + apply tsum_nonneg + intro n + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) + (scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0) + +private theorem inv_sq_le_rpow_neg_five_halves {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (s⁻¹) ^ 2 ≤ Real.rpow s (-(5 / 2 : ℝ)) := by + have hs_inv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hpow : + Real.rpow (s⁻¹) (2 : ℝ) ≤ Real.rpow (s⁻¹) (5 / 2 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hs_inv_ge_one (by norm_num) + have hleft : Real.rpow (s⁻¹) (2 : ℝ) = (s⁻¹) ^ 2 := by + norm_num + have hright : + Real.rpow (s⁻¹) (5 / 2 : ℝ) = Real.rpow s (-(5 / 2 : ℝ)) := by + exact (Real.rpow_neg_eq_inv_rpow s (5 / 2 : ℝ)).symm + rw [hleft] at hpow + rw [hright] at hpow + exact hpow + +private theorem sqrt_four_mul_matNorm_eq_two_mul_sqrt_matNorm + {d : ℕ} (a0 : Mat d) : + Real.sqrt ((4 : ℝ) * matNorm a0) = 2 * Real.sqrt (matNorm a0) := by + have hmat : 0 ≤ matNorm a0 := matNorm_nonneg a0 + calc + Real.sqrt ((4 : ℝ) * matNorm a0) + = Real.sqrt ((2 : ℝ) ^ 2 * matNorm a0) := by norm_num + _ = Real.sqrt ((2 : ℝ) ^ 2) * Real.sqrt (matNorm a0) := by + rw [Real.sqrt_mul (sq_nonneg (2 : ℝ))] + _ = 2 * Real.sqrt (matNorm a0) := by + rw [Real.sqrt_sq_eq_abs] + norm_num + +private theorem sqrt_le_two_mul_add_sqrt_of_le_two_mul_add + {X A B : ℝ} + (hX_nonneg : 0 ≤ X) (hA_nonneg : 0 ≤ A) (hB_nonneg : 0 ≤ B) + (hX : X ≤ 2 * A + 2 * B) : + Real.sqrt X ≤ 2 * (Real.sqrt A + Real.sqrt B) := by + have hrhs_nonneg : 0 ≤ 2 * (Real.sqrt A + Real.sqrt B) := by + positivity + refine Real.sqrt_le_of_le_sq hX_nonneg hrhs_nonneg ?_ + have hA_sq : (Real.sqrt A) ^ 2 = A := by + rw [Real.sq_sqrt hA_nonneg] + have hB_sq : (Real.sqrt B) ^ 2 = B := by + rw [Real.sq_sqrt hB_nonneg] + have hcross_nonneg : 0 ≤ Real.sqrt A * Real.sqrt B := by + positivity + nlinarith + +private theorem cubeAverage_scalarVariationEnergyIntegrand_harmonic_le_two_mul_add + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (w : AHarmonicFunction a (cubeSet Q)) {gradU : Vec d → Vec d} + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hgrad : ∀ x ∈ cubeSet Q, + gradU x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) : + cubeAverage Q (scalarVariationEnergyIntegrand a w) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a gradU) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := by + let gradSum : Vec d → Vec d := + fun x => w.toH1.grad x + ρ.toH10.toH1Function.grad x + have hgradSum_mem : MemVectorL2 (cubeSet Q) gradSum := + w.toH1.grad_memVectorL2.add ρ.toH10.toH1Function.grad_memVectorL2 + have hsplit : + cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a gradSum) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := + ρ.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := gradSum) w hEll + (by intro x hx; rfl) hgradSum_mem + have hgradAvg : + cubeAverage Q (coefficientEnergyDensity a gradSum) = + cubeAverage Q (coefficientEnergyDensity a gradU) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simp [gradSum, coefficientEnergyDensity, hgrad x hx] + calc + cubeAverage Q (scalarVariationEnergyIntegrand a w) + = cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) := by + rfl + _ ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a gradSum) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := hsplit + _ = + 2 * cubeAverage Q (coefficientEnergyDensity a gradU) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := by + rw [hgradAvg] + +private theorem sqrt_correction_energy_le_display_scale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s : ℝ} (g : Vec d → Vec d) + (hs : 0 < s) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) + {Eρ : ℝ} + (hEρ_nonneg : 0 ≤ Eρ) + (hEρ : + Eρ ≤ zeroTraceDirichletEnergyEnvelope Q a s g) : + Real.sqrt Eρ ≤ + 26 * s⁻¹ * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) * + cubeBesovPositiveVectorSeminormTwo Q s g := by + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hG : 0 ≤ G := by + dsimp [G] + exact hG_nonneg + have htarget_nonneg : + 0 ≤ 26 * s⁻¹ * Real.sqrt L * N * G := by + positivity + refine Real.sqrt_le_of_le_sq hEρ_nonneg htarget_nonneg ?_ + have henv : + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + 650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + simpa [L, N, G] using + zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + Q a g hs hG_nonneg + have hcommon_nonneg : + 0 ≤ (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + positivity + calc + Eρ ≤ 650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := hEρ.trans henv + _ = 650 * ((s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by ring + _ ≤ 676 * ((s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by + exact mul_le_mul_of_nonneg_right (by norm_num : (650 : ℝ) ≤ 676) + hcommon_nonneg + _ = (26 * s⁻¹ * Real.sqrt L * N * G) ^ 2 := by + ring_nf + rw [Real.sq_sqrt hL_nonneg] + ring + +theorem one_le_zeroTraceDirichletDisplayScale_expr + {d : ℕ} [NeZero d] {s : ℝ} (hs : 0 < s) : + 1 ≤ (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) := by + have hd : 1 ≤ (d : ℝ) := by + exact_mod_cast (Nat.one_le_iff_ne_zero.mpr (NeZero.ne d)) + have hpow : + 1 ≤ (3 : ℝ) ^ ((d : ℝ) + s) := by + exact Real.one_le_rpow (by norm_num : (1 : ℝ) ≤ 3) + (add_nonneg (by exact_mod_cast Nat.zero_le d) hs.le) + have hsqrttwo : 1 ≤ Real.sqrt 2 := by + have h := Real.sqrt_le_sqrt (by norm_num : (1 : ℝ) ≤ 2) + rw [Real.sqrt_one] at h + exact h + have hinner : + 1 ≤ (3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2 := by + simpa [one_mul] using + mul_le_mul hpow hsqrttwo (by norm_num : (0 : ℝ) ≤ 1) + (le_trans (by norm_num : (0 : ℝ) ≤ 1) hpow) + simpa [one_mul] using + mul_le_mul hd hinner (by norm_num : (0 : ℝ) ≤ 1) + (le_trans (by norm_num : (0 : ℝ) ≤ 1) hd) + +/-- +Discharge of the homogeneous scalar comparison in the zero-Dirichlet RHS +route. The two size assumptions on `C` are pure scalar constant checks; the +apex supplies them from `1000` times the displayed dimensional scale. +-/ +theorem coarseFluxResponseQOneBound_le_const_mul_RHSHomogeneousSplitBound_of_zeroTraceDirichlet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (a0 : Mat d) (s : ℝ) (gradU : Vec d → Vec d) + (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} {C : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hgrad : ∀ x ∈ cubeSet Q, + gradU x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hC_energy : 20 ≤ C) + (hC_response : + 520 * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ≤ C) : + coarseFluxResponseQOneBound Q a a0 s w ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := by + let gdInv : ℝ := (geometricDiscount s 1)⁻¹ + let H : ℝ := HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 + let M : ℝ := Real.sqrt (matNorm a0) + let A : ℝ := Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) + let Linv : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let L : ℝ := Real.sqrt Linv + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let R : ℝ := 26 * s⁻¹ * L * N * G + let Rp : ℝ := Real.rpow s (-(5 / 2 : ℝ)) + have hgd_nonneg : 0 ≤ gdInv := by + dsimp [gdInv] + exact inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by simpa using hs))) + have hgd_le : gdInv ≤ 5 * s⁻¹ := by + dsimp [gdInv] + exact inv_geometricDiscount_one_le_five_inv hs hs_le + have hH_nonneg : 0 ≤ H := by + dsimp [H] + exact homogenizationErrorOnCube_infinity_one_nonneg_local Q a a0 hs.le + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact Real.sqrt_nonneg _ + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact Real.sqrt_nonneg _ + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hLinv_nonneg : 0 ≤ Linv := by + dsimp [Linv] + exact inv_nonneg.mpr hlambda_nonneg + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.sqrt_nonneg _ + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have hR_nonneg : 0 ≤ R := by + dsimp [R] + positivity + have hRp_nonneg : 0 ≤ Rp := by + dsimp [Rp] + exact Real.rpow_nonneg hs.le _ + have hEgrad_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradU) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a gradU hEll + have hEρ_nonneg : + 0 ≤ cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a (fun x => ρ.toH10.toH1Function.grad x) hEll + have hAw_nonneg : + 0 ≤ cubeAverage Q (scalarVariationEnergyIntegrand a w) := by + simpa [scalarVariationEnergyIntegrand, coefficientEnergyDensity] using! + cubeAverage_coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + Q a (fun x => w.toH1.grad x) hEll + have hρEnvelope : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hsqrtρ : + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) ≤ R := by + simpa [Linv, L, N, G, R] using + sqrt_correction_energy_le_display_scale Q a g hs hG_nonneg + hEρ_nonneg hρEnvelope + have hAw_split : + cubeAverage Q (scalarVariationEnergyIntegrand a w) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a gradU) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := + cubeAverage_scalarVariationEnergyIntegrand_harmonic_le_two_mul_add + ρ w hEll hgrad + have hsqrtsplit : + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a w)) ≤ + 2 * (A + R) := by + have hbase := + sqrt_le_two_mul_add_sqrt_of_le_two_mul_add hAw_nonneg + hEgrad_nonneg hEρ_nonneg hAw_split + calc + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a w)) + ≤ 2 * (A + + Real.sqrt + (cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)))) := by + simpa [A] using hbase + _ ≤ 2 * (A + R) := by nlinarith + have hscale : (s⁻¹) ^ 2 ≤ Rp := by + dsimp [Rp] + exact inv_sq_le_rpow_neg_five_halves hs hs_le + have hcoeff_energy : 4 * gdInv ≤ C * s⁻¹ := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + nlinarith [hgd_le, hC_energy, hs_inv_nonneg] + have hcoeff_response : 104 * gdInv * s⁻¹ * N ≤ C * Rp := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hfactor_nonneg : 0 ≤ 104 * s⁻¹ * N := by positivity + have hgd_scaled : + gdInv * (104 * s⁻¹ * N) ≤ (5 * s⁻¹) * (104 * s⁻¹ * N) := + mul_le_mul_of_nonneg_right hgd_le hfactor_nonneg + have hscale_scaled : + 520 * (s⁻¹) ^ 2 * N ≤ 520 * Rp * N := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hscale (by norm_num : 0 ≤ (520 : ℝ))) + hN_nonneg + have hC_scaled : + 520 * N * Rp ≤ C * Rp := + mul_le_mul_of_nonneg_right hC_response hRp_nonneg + calc + 104 * gdInv * s⁻¹ * N = gdInv * (104 * s⁻¹ * N) := by ring + _ ≤ (5 * s⁻¹) * (104 * s⁻¹ * N) := hgd_scaled + _ = 520 * (s⁻¹) ^ 2 * N := by ring + _ ≤ 520 * Rp * N := hscale_scaled + _ = 520 * N * Rp := by ring + _ ≤ C * Rp := hC_scaled + have henergyTerm : + 4 * gdInv * H * M * A ≤ + C * (s⁻¹ * M * H * A) := by + have hcommon_nonneg : 0 ≤ M * H * A := by positivity + have hscaled := + mul_le_mul_of_nonneg_right hcoeff_energy hcommon_nonneg + calc + 4 * gdInv * H * M * A = (4 * gdInv) * (M * H * A) := by ring + _ ≤ (C * s⁻¹) * (M * H * A) := hscaled + _ = C * (s⁻¹ * M * H * A) := by ring + have hresponseTerm : + 4 * gdInv * H * M * R ≤ + C * (Rp * M * L * H * G) := by + have hcommon_nonneg : 0 ≤ M * L * H * G := by positivity + have hscaled := + mul_le_mul_of_nonneg_right hcoeff_response hcommon_nonneg + calc + 4 * gdInv * H * M * R = + (104 * gdInv * s⁻¹ * N) * (M * L * H * G) := by + dsimp [R] + ring + _ ≤ (C * Rp) * (M * L * H * G) := hscaled + _ = C * (Rp * M * L * H * G) := by ring + have hhom_split : + gdInv * H * (2 * M) * (2 * (A + R)) ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := by + have henergy_eq : + coarseFluxResponseRHSEnergyBound Q a a0 s gradU = + s⁻¹ * M * H * A := by + unfold coarseFluxResponseRHSEnergyBound + dsimp [M, H, A] + have hresponse_eq : + coarseFluxResponseRHSResponseCorrectionBound Q a a0 s g = + Rp * M * L * H * G := by + unfold coarseFluxResponseRHSResponseCorrectionBound + dsimp [Rp, M, L, Linv, H, G] + calc + gdInv * H * (2 * M) * (2 * (A + R)) + = 4 * gdInv * H * M * A + 4 * gdInv * H * M * R := by ring + _ ≤ C * (s⁻¹ * M * H * A) + + C * (Rp * M * L * H * G) := + add_le_add henergyTerm hresponseTerm + _ = C * + (coarseFluxResponseRHSEnergyBound Q a a0 s gradU + + coarseFluxResponseRHSResponseCorrectionBound Q a a0 s g) := by + rw [henergy_eq, hresponse_eq] + ring + _ = C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := by + rfl + have hprefix_nonneg : 0 ≤ gdInv * H * (2 * M) := by positivity + calc + coarseFluxResponseQOneBound Q a a0 s w + = gdInv * H * (2 * M) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a w)) := by + unfold coarseFluxResponseQOneBound + dsimp [gdInv, H, M] + rw [sqrt_four_mul_matNorm_eq_two_mul_sqrt_matNorm a0] + ring + _ ≤ gdInv * H * (2 * M) * (2 * (A + R)) := + mul_le_mul_of_nonneg_left hsqrtsplit hprefix_nonneg + _ ≤ C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g := + hhom_split + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletScalarAdequacy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletScalarAdequacy.lean new file mode 100644 index 0000000000..ab4bce2fda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletScalarAdequacy.lean @@ -0,0 +1,605 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEstimates + +/-! # RHSConstant Apex Zero Dirichlet Scalar Adequacy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Scalar adequacy for the zero-Dirichlet RHS flux-response apex + +This leaf records the Poincare displayed scalar comparison in the form used by +the manuscript constant absorption. The weak-flux displayed comparison now +lives in `RHSConstantApexZeroDirichletWeakFluxScalarAdequacy`, where the +manuscript `Lambda * lambda^{-1}` force units are used directly. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +private theorem inv_pow_four_le_rpow_neg_three_sq {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (s⁻¹) ^ 4 ≤ (Real.rpow s (-3 : ℝ)) ^ 2 := by + have hs_inv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hpow : + Real.rpow (s⁻¹) (4 : ℝ) ≤ Real.rpow (s⁻¹) (6 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hs_inv_ge_one (by norm_num) + have hpow_nat : (s⁻¹) ^ 4 ≤ (s⁻¹) ^ 6 := by + simpa using hpow + have hright : + (Real.rpow s (-3 : ℝ)) ^ 2 = (s⁻¹) ^ 6 := by + have hneg : + Real.rpow s (-3 : ℝ) = Real.rpow (s⁻¹) (3 : ℝ) := by + simp + have hpow_three : Real.rpow (s⁻¹) (3 : ℝ) = (s⁻¹) ^ 3 := by + simp + rw [hneg, hpow_three] + ring + calc + (s⁻¹) ^ 4 ≤ (s⁻¹) ^ 6 := hpow_nat + _ = (Real.rpow s (-3 : ℝ)) ^ 2 := hright.symm + +/-- +Positivity of the compact Poincare correction-square base in the nondegenerate +case. +-/ +theorem zeroTraceDirichletPoincareDisplayedScalarAdequacyBase_pos + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) + (hs : 0 < s) + (hmat_pos : 0 < matNorm a0) + (hlambda_pos : 0 < lambdaSq Q (s / 2) (.finite 2) a) + (hG_pos : 0 < cubeBesovPositiveVectorSeminormTwo Q s g) : + 0 < + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hs_pow_pos : + 0 < (Real.rpow s (-3 : ℝ)) ^ 2 := + pow_pos (Real.rpow_pos_of_pos hs _) 2 + have hmat_sq_pos : 0 < (matNorm a0) ^ 2 := + pow_pos hmat_pos 2 + have hlambda_inv_sq_pos : + 0 < ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 := + pow_pos (inv_pos.mpr hlambda_pos) 2 + have hG_sq_pos : + 0 < (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + pow_pos hG_pos 2 + exact mul_pos (mul_pos (mul_pos hs_pow_pos hmat_sq_pos) + hlambda_inv_sq_pos) hG_sq_pos + +/-- Sharp zero-Dirichlet energy envelope control after expanding the square-root force term. -/ +theorem zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) + (hs : 0 < s) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) : + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + 650 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let M : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let X : ℝ := + 15000 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hsqrt_two_nonneg : 0 ≤ Real.sqrt 2 := Real.sqrt_nonneg 2 + have hsqrt_two_ge_one : 1 ≤ Real.sqrt 2 := by + exact Real.one_le_sqrt.mpr (by norm_num : (1 : ℝ) ≤ 2) + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + hsqrt_two_nonneg) + have hM_le_N : M ≤ N := by + dsimp [M, N] + calc + (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + = ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s)) * 1 := by ring + _ ≤ ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s)) * Real.sqrt 2 := + mul_le_mul_of_nonneg_left hsqrt_two_ge_one + (mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + _ = (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) := by ring + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hG : 0 ≤ G := by + dsimp [G] + exact hG_nonneg + have hs_inv_four_nonneg : 0 ≤ (s⁻¹) ^ 4 := by + rw [show (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 by ring] + exact sq_nonneg _ + have hX_nonneg : 0 ≤ X := by + dsimp [X] + positivity + have hs_inv_sq_nonneg : 0 ≤ (s⁻¹) ^ 2 := sq_nonneg _ + have hsqrt_bound : + Real.sqrt X ≤ 200 * (s⁻¹) ^ 2 * L * N * G := by + have hrhs_nonneg : + 0 ≤ 200 * (s⁻¹) ^ 2 * L * N * G := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (200 : ℝ)) + hs_inv_sq_nonneg) + hL_nonneg) + hN_nonneg) + hG + refine Real.sqrt_le_of_le_sq hX_nonneg hrhs_nonneg ?_ + have hfactor_nonneg : + 0 ≤ (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 := by + exact + mul_nonneg + (mul_nonneg (mul_nonneg hs_inv_four_nonneg (sq_nonneg L)) + (sq_nonneg N)) + (sq_nonneg G) + calc + X = 15000 * ((s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2) := by + dsimp [X] + ring + _ ≤ 40000 * ((s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2) := by + nlinarith + _ = (200 * (s⁻¹) ^ 2 * L * N * G) ^ 2 := by ring + have hMG_nonneg : 0 ≤ M * G := mul_nonneg hM_nonneg hG + have hNG_nonneg : 0 ≤ N * G := mul_nonneg hN_nonneg hG + have hMG_le_NG : M * G ≤ N * G := + mul_le_mul_of_nonneg_right hM_le_N hG + have hMG_sq_le_NG_sq : (M * G) ^ 2 ≤ (N * G) ^ 2 := by + nlinarith [hMG_nonneg, hNG_nonneg, hMG_le_NG] + have henergy_coeff_nonneg : 0 ≤ 250 * (s⁻¹) ^ 2 * L := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) hs_inv_sq_nonneg) + hL_nonneg + have hfirst : + (M * G) ^ 2 * (250 * (s⁻¹) ^ 2 * L) ≤ + 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + have hscaled := mul_le_mul_of_nonneg_right + hMG_sq_le_NG_sq henergy_coeff_nonneg + calc + (M * G) ^ 2 * (250 * (s⁻¹) ^ 2 * L) + ≤ (N * G) ^ 2 * (250 * (s⁻¹) ^ 2 * L) := hscaled + _ = 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by ring + have habs_MG_le_NG : |M * G| ≤ N * G := by + rw [abs_of_nonneg hMG_nonneg] + exact hMG_le_NG + have hsqrt_rhs_nonneg : + 0 ≤ 200 * (s⁻¹) ^ 2 * L * N * G := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (200 : ℝ)) + hs_inv_sq_nonneg) + hL_nonneg) + hN_nonneg) + hG + have hsecond : + 2 * |M * G| * Real.sqrt X ≤ + 400 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + have hmul := mul_le_mul habs_MG_le_NG hsqrt_bound + (Real.sqrt_nonneg X) hNG_nonneg + nlinarith + have henv_eq : + zeroTraceDirichletEnergyEnvelope Q a s g = + (M * G) ^ 2 * (250 * (s⁻¹) ^ 2 * L) + + 2 * |M * G| * Real.sqrt X := by + unfold zeroTraceDirichletEnergyEnvelope + dsimp [G, L, M, N, X] + ring_nf + calc + zeroTraceDirichletEnergyEnvelope Q a s g = + (M * G) ^ 2 * (250 * (s⁻¹) ^ 2 * L) + + 2 * |M * G| * Real.sqrt X := henv_eq + _ ≤ + 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 + + 400 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := + add_le_add hfirst hsecond + _ ≤ 650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + ring_nf + rfl + _ = + 650 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [G, L, N] + +/-- Poincare energy component adequacy after expanding the zero-Dirichlet envelope. -/ +theorem zeroTraceDirichletPoincareDisplayedEnergyScale_le_compact_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) + (hs : 0 < s) (hs_le : s ≤ 1) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) : + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + (162500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-3 : ℝ)) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hG : 0 ≤ G := by + dsimp [G] + exact hG_nonneg + have hs_inv_sq_nonneg : 0 ≤ (s⁻¹) ^ 2 := sq_nonneg _ + have hcoeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * L := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) hs_inv_sq_nonneg) + hL_nonneg + have henv := + zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + Q a g hs hG_nonneg + have hmul := mul_le_mul_of_nonneg_left henv hcoeff_nonneg + have hs_inv_four_le := inv_pow_four_le_rpow_neg_three_sq hs hs_le + have hfactor_nonneg : + 0 ≤ 162500 * N ^ 2 * L ^ 2 * G ^ 2 := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (162500 : ℝ)) + (sq_nonneg N)) + (sq_nonneg L)) + (sq_nonneg G) + have hscale := + mul_le_mul_of_nonneg_left hs_inv_four_le hfactor_nonneg + calc + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g + ≤ + 250 * (s⁻¹) ^ 2 * L * + (650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by + simpa [L, N, G, mul_assoc, mul_left_comm, mul_comm] using hmul + _ = 162500 * N ^ 2 * L ^ 2 * G ^ 2 * (s⁻¹) ^ 4 := by ring + _ ≤ 162500 * N ^ 2 * L ^ 2 * G ^ 2 * + (Real.rpow s (-3 : ℝ)) ^ 2 := hscale + _ = + (162500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-3 : ℝ)) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [N, L, G] + ring + +/-- Poincare force component adequacy: the `s^{-4}` term is absorbed by the compact `s^{-6}` scale. -/ +theorem zeroTraceDirichletPoincareDisplayedForceScale_le_compact_sq + {d : ℕ} {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + 15000 * (s⁻¹) ^ 4 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + (15000 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + (Real.rpow s (-3 : ℝ)) ^ 2 := by + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hfactor_nonneg : 0 ≤ 15000 * N ^ 2 := by + exact mul_nonneg (by norm_num : 0 ≤ (15000 : ℝ)) (sq_nonneg N) + have hscale := inv_pow_four_le_rpow_neg_three_sq hs hs_le + have hscaled := mul_le_mul_of_nonneg_left hscale hfactor_nonneg + calc + 15000 * (s⁻¹) ^ 4 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 + = + 15000 * N ^ 2 * (s⁻¹) ^ 4 := by + dsimp [N] + ring + _ ≤ 15000 * N ^ 2 * (Real.rpow s (-3 : ℝ)) ^ 2 := hscaled + _ = + (15000 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + (Real.rpow s (-3 : ℝ)) ^ 2 := by + dsimp [N] + +/-- Poincare scalar adequacy from the energy-envelope and force-scale estimates. -/ +theorem zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_energyEnvelope_and_force_scale_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + {APoincareEnergy APoincareForce : ℝ} + (hPoincareEnergy : + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + APoincareEnergy * + ((Real.rpow s (-3 : ℝ)) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + (hPoincareForceScale : + 15000 * (s⁻¹) ^ 4 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + APoincareForce * (Real.rpow s (-3 : ℝ)) ^ 2) + (halloc : APoincareEnergy + APoincareForce ≤ C ^ 2) : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let K : ℝ := + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + L ^ 2 * + G ^ 2 + have hmat_sq_nonneg : 0 ≤ (matNorm a0) ^ 2 := sq_nonneg _ + have htail_factor_nonneg : 0 ≤ (matNorm a0) ^ 2 * L ^ 2 * G ^ 2 := by + exact + mul_nonneg (mul_nonneg hmat_sq_nonneg (sq_nonneg L)) + (sq_nonneg G) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (sq_nonneg (Real.rpow s (-3 : ℝ))) + hmat_sq_nonneg) + (sq_nonneg L)) + (sq_nonneg G) + have henergy_mul : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) ≤ + APoincareEnergy * K := by + have hscaled := mul_le_mul_of_nonneg_left hPoincareEnergy hmat_sq_nonneg + calc + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) + ≤ + (matNorm a0) ^ 2 * + (APoincareEnergy * + ((Real.rpow s (-3 : ℝ)) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := hscaled + _ = APoincareEnergy * K := by + dsimp [K, L, G] + ring + have hforce_mul : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + APoincareForce * K := by + have hscaled := + mul_le_mul_of_nonneg_right hPoincareForceScale htail_factor_nonneg + calc + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + = + (15000 * (s⁻¹) ^ 4 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((matNorm a0) ^ 2 * L ^ 2 * G ^ 2) := by + dsimp [L, G] + ring + _ ≤ + (APoincareForce * (Real.rpow s (-3 : ℝ)) ^ 2) * + ((matNorm a0) ^ 2 * L ^ 2 * G ^ 2) := hscaled + _ = APoincareForce * K := by + dsimp [K] + ring + have halloc_scaled : + APoincareEnergy * K + APoincareForce * K ≤ C ^ 2 * K := by + have hscaled := mul_le_mul_of_nonneg_right halloc hK_nonneg + calc + APoincareEnergy * K + APoincareForce * K = + (APoincareEnergy + APoincareForce) * K := by ring + _ ≤ C ^ 2 * K := hscaled + have hbudget_le : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + APoincareEnergy * K + APoincareForce * K := by + unfold zeroTraceDirichletPoincareDisplayedScalarBudget + nlinarith + have htarget : + C ^ 2 * K = + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + calc + C ^ 2 * K = + C ^ 2 * + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [K, L, G] + ring + _ = (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := + (const_mul_coarseFluxResponseRHSPoincareCorrectionBound_sq_eq + Q a a0 C s g).symm + calc + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g + ≤ APoincareEnergy * K + APoincareForce * K := hbudget_le + _ ≤ C ^ 2 * K := halloc_scaled + _ = (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := + htarget + +/-- Poincare component target from the energy-envelope and force-scale estimates. -/ +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_energyEnvelope_and_force_scale_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + {APoincareEnergy APoincareForce : ℝ} + (hPoincareEnergy : + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + APoincareEnergy * + ((Real.rpow s (-3 : ℝ)) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + (hPoincareForceScale : + 15000 * (s⁻¹) ^ 4 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + APoincareForce * (Real.rpow s (-3 : ℝ)) ^ 2) + (halloc : APoincareEnergy + APoincareForce ≤ C ^ 2) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g := + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_displayed_bound + Q a a0 C s g + (zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_energyEnvelope_and_force_scale_bounds + Q a a0 C s g hPoincareEnergy hPoincareForceScale halloc) + +/-- Poincare scalar adequacy with the analytic estimates discharged into one constant bound. -/ +theorem zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_const_ge + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C : ℝ) {s : ℝ} (g : Vec d → Vec d) + (hs : 0 < s) (hs_le : s ≤ 1) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) + (hC_sq : + 177500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + C ^ 2) : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + refine + zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_energyEnvelope_and_force_scale_bounds + (Q := Q) (a := a) (a0 := a0) (C := C) (s := s) (g := g) + (APoincareEnergy := + 162500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) + (APoincareForce := + 15000 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) + ?_ ?_ ?_ + · exact zeroTraceDirichletPoincareDisplayedEnergyScale_le_compact_sq + Q a g hs hs_le hG_nonneg + · exact zeroTraceDirichletPoincareDisplayedForceScale_le_compact_sq + hs hs_le + · nlinarith + +/-- Poincare component target with scalar adequacy discharged into one constant bound. -/ +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_const_ge + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C : ℝ) {s : ℝ} (g : Vec d → Vec d) + (hs : 0 < s) (hs_le : s ≤ 1) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) + (hC_sq : + 177500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + C ^ 2) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g := + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_displayed_bound + Q a a0 C s g + (zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_const_ge + Q a a0 C g hs hs_le hG_nonneg hC_sq) + +/-- +Poincare displayed scalar adequacy in normalized `C^2` form. +-/ +theorem zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_div_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + (hbase_pos : + 0 < + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + (hC_sq : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g / + ((Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + C ^ 2) : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + (C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + let K : ℝ := + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + have hbudget_le_grouped : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + C ^ 2 * K := by + exact (div_le_iff₀ (by simpa [K] using hbase_pos)).mp + (by simpa [K] using hC_sq) + have hbudget_le_expanded : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g ≤ + C ^ 2 * + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + calc + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g + ≤ C ^ 2 * K := hbudget_le_grouped + _ = + C ^ 2 * + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [K] + ring + simpa [const_mul_coarseFluxResponseRHSPoincareCorrectionBound_sq_eq Q a a0 C s g] + using hbudget_le_expanded + +/-- +The Poincare displayed component target follows from the normalized scalar +adequacy inequality. +-/ +theorem zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_div_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (g : Vec d → Vec d) + (hbase_pos : + 0 < + (Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + (hC_sq : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g / + ((Real.rpow s (-3 : ℝ)) ^ 2 * + (matNorm a0) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + C ^ 2) : + zeroTraceDirichletPoincareDisplayedComponentBoundsClose Q a a0 C s g := + zeroTraceDirichletPoincareDisplayedComponentBoundsClose_of_displayed_bound + Q a a0 C s g + (zeroTraceDirichletPoincareDisplayedScalarBudget_le_const_mul_correctionBound_sq_of_div_le_sq + Q a a0 C s g hbase_pos hC_sq) + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletTail.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletTail.lean new file mode 100644 index 0000000000..33c281a4ea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletTail.lean @@ -0,0 +1,274 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletEnergy + +/-! # RHSConstant Apex Zero Dirichlet Tail -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Zero-Dirichlet tail input for the RHS coarse-flux response apex + +This leaf contains the zero-trace gradient-tail budget, the Poincare displayed +scalar budget, and the harmonic-remainder `BV` tail package used by the +corrected zero-Dirichlet §3.2.4 apex route. +-/ + +open scoped BigOperators ENNReal + +/-- +The expanded note-constant tail budget for the zero-trace correction gradient. +-/ +noncomputable def zeroTraceDirichletGradientTailBudget {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g : Vec d → Vec d) : ℝ := + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + +theorem zeroTraceDirichletGradientTailBudget_nonneg {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) (hs : 0 < s) : + 0 ≤ zeroTraceDirichletGradientTailBudget Q a s g := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have henergy_coeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have henergy_nonneg : + 0 ≤ zeroTraceDirichletEnergyEnvelope Q a s g := + zeroTraceDirichletEnergyEnvelope_nonneg Q a s g hs + have hs_inv_pow_four_nonneg : 0 ≤ (s⁻¹) ^ 4 := by + rw [show (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 by ring] + exact sq_nonneg _ + have hforce_nonneg : + 0 ≤ + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (15000 : ℝ)) hs_inv_pow_four_nonneg) + (sq_nonneg ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹))) + (sq_nonneg ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)))) + (sq_nonneg (cubeBesovPositiveVectorSeminormTwo Q s g)) + unfold zeroTraceDirichletGradientTailBudget + exact add_nonneg (mul_nonneg henergy_coeff_nonneg henergy_nonneg) hforce_nonneg + +/-- +The displayed Poincare scalar budget after inserting the zero-trace energy +envelope. +-/ +noncomputable def zeroTraceDirichletPoincareDisplayedScalarBudget {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) : ℝ := + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g) + + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +theorem zeroTraceDirichletPoincareDisplayedScalarBudget_eq_scalarBudget + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) : + zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g = + zeroTraceDirichletPoincareScalarBudget Q a a0 s g := by + rfl + +theorem zeroTraceDirichletPoincareDisplayedScalarBudget_nonneg {d : ℕ} + [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (hs : 0 < s) : + 0 ≤ zeroTraceDirichletPoincareDisplayedScalarBudget Q a a0 s g := by + rw [zeroTraceDirichletPoincareDisplayedScalarBudget_eq_scalarBudget] + exact zeroTraceDirichletPoincareScalarBudget_nonneg Q a a0 s g hs + +namespace ZeroTraceDirichletCorrectorData + +/-- +The expanded coarse-Poincare RHS estimate gives a uniform `S_k` tail bound for +the zero-trace corrector gradient after inserting the zero-Dirichlet energy +envelope. +-/ +theorem coarsePoincareRHSSn_le_zeroTraceDirichletGradientTailBudget_noteConstants_expanded + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (m : ℕ) : + coarsePoincareRHSSn Q s + (fun x => ρ.toH10.toH1Function.grad x) m ≤ + zeroTraceDirichletGradientTailBudget Q a s g := by + have hg_mem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + have hraw : + coarsePoincareRHSSn Q s + (fun x => ρ.toH10.toH1Function.grad x) m ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := a) (g := g) + (u := fun x => ρ.toH10.toH1Function.grad x) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll ρ.toH10.toH1Function.isPotentialOn + (ρ.residualFlux_solenoidal hEll hg_mem) hg hGlobalBdd m + have henergy : + cubeAverage Q (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hcoeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + (inv_nonneg.mpr hlambda_nonneg) + have henergy_term : + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g := + mul_le_mul_of_nonneg_left henergy hcoeff_nonneg + unfold zeroTraceDirichletGradientTailBudget + exact hraw.trans (add_le_add henergy_term le_rfl) + +theorem coarsePoincareRHSSn_tail_le_zeroTraceDirichletGradientTailBudget_noteConstants_expanded + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + ∀ k : ℕ, + coarsePoincareRHSSn Q s + (fun x => ρ.toH10.toH1Function.grad x) k ≤ + zeroTraceDirichletGradientTailBudget Q a s g := by + intro k + exact + ρ.coarsePoincareRHSSn_le_zeroTraceDirichletGradientTailBudget_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd k + +/-- +The named `BV` tail package for the harmonic remainders constructed from the +centered Neumann corrector decomposition on descendants of the parent cube. +-/ +def zeroTraceDirichletHarmonicRemainderTailClose {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (s BV : ℝ) : Prop := + 0 ≤ BV ∧ + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV + +theorem zeroTraceDirichletHarmonicRemainderTailClose_nonneg {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} + (h : zeroTraceDirichletHarmonicRemainderTailClose ρ s BV) : + 0 ≤ BV := + h.1 + +theorem zeroTraceDirichletHarmonicRemainderTailClose_constructed {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {ρ : ZeroTraceDirichletCorrectorData Q a g} + {s BV : ℝ} + (h : zeroTraceDirichletHarmonicRemainderTailClose ρ s BV) : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV := + h.2 + +theorem zeroTraceDirichletHarmonicRemainderTailClose_of_bounds {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s BV : ℝ} + (hBV_nonneg : 0 ≤ BV) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w0 : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + ρ.toH10.toH1Function.grad x = + w0.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w0.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w0.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + zeroTraceDirichletHarmonicRemainderTailClose ρ s BV := + ⟨hBV_nonneg, hvConstructed⟩ + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletWeakFluxScalarAdequacy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletWeakFluxScalarAdequacy.lean new file mode 100644 index 0000000000..3f9d86114f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantApexZeroDirichletWeakFluxScalarAdequacy.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSConstantApexZeroDirichletScalarAdequacy + +/-! # RHSConstant Apex Zero Dirichlet Weak Flux Scalar Adequacy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Weak-flux scalar adequacy for the zero-Dirichlet RHS apex + +This leaf continues the weak-flux displayed scalar calculation after the +Poincare scalar adequacy discharge. It closes the weak-flux energy scale and +composes it with the force-scale coefficient comparison, leaving only the +separate tail allocations. +-/ + +open scoped BigOperators ENNReal + +namespace ZeroTraceDirichletCorrectorData + +private theorem weakFlux_inv_pow_four_le_rpow_neg_five_halves_sq {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (s⁻¹) ^ 4 ≤ (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 := by + have hs_inv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hs_inv_pos : 0 < s⁻¹ := inv_pos.mpr hs + have hpow : + Real.rpow (s⁻¹) (4 : ℝ) ≤ Real.rpow (s⁻¹) (5 : ℝ) := + Real.rpow_le_rpow_of_exponent_le hs_inv_ge_one (by norm_num) + have hpow_nat : (s⁻¹) ^ 4 ≤ Real.rpow (s⁻¹) (5 : ℝ) := by + simpa using hpow + have hright : + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 = + Real.rpow (s⁻¹) (5 : ℝ) := by + change (s ^ (-(5 / 2 : ℝ))) ^ 2 = (s⁻¹) ^ (5 : ℝ) + rw [Real.rpow_neg_eq_inv_rpow] + rw [sq] + rw [← Real.rpow_add hs_inv_pos (5 / 2 : ℝ) (5 / 2 : ℝ)] + norm_num + calc + (s⁻¹) ^ 4 ≤ Real.rpow (s⁻¹) (5 : ℝ) := hpow_nat + _ = (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 := hright.symm + +private theorem weakFlux_inv_pow_five_eq_rpow_neg_five_halves_sq {s : ℝ} + (hs : 0 < s) : + (s⁻¹) ^ 5 = (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 := by + have hs_inv_pos : 0 < s⁻¹ := inv_pos.mpr hs + have hright : + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 = + Real.rpow (s⁻¹) (5 : ℝ) := by + change (s ^ (-(5 / 2 : ℝ))) ^ 2 = (s⁻¹) ^ (5 : ℝ) + rw [Real.rpow_neg_eq_inv_rpow] + rw [sq] + rw [← Real.rpow_add hs_inv_pos (5 / 2 : ℝ) (5 / 2 : ℝ)] + norm_num + have hpow_five : Real.rpow (s⁻¹) (5 : ℝ) = (s⁻¹) ^ 5 := by + simp + exact hpow_five.symm.trans hright.symm + +/-- Corrected weak-flux force-scale adequacy with manuscript `Lambda * lambda^{-1}` units. -/ +theorem zeroTraceDirichletWeakFluxDisplayedForceScale_le_compact_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + {AweakForce : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hAweakForce : + 2500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + AweakForce) : + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 ≤ + AweakForce * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let Lam : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + have hN_sq_nonneg : 0 ≤ N ^ 2 := sq_nonneg N + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hcompact_nonneg : 0 ≤ Lam * L := mul_nonneg hLam_nonneg hL_nonneg + have hscale := weakFlux_inv_pow_four_le_rpow_neg_five_halves_sq hs hs_le + have hscale_scaled := + mul_le_mul_of_nonneg_left hscale + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2500 : ℝ)) hN_sq_nonneg) + hcompact_nonneg) + have htarget_nonneg : + 0 ≤ (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * Lam * L := by + exact mul_nonneg + (mul_nonneg (sq_nonneg _) hLam_nonneg) + hL_nonneg + have hforce_scaled := + mul_le_mul_of_nonneg_right hAweakForce htarget_nonneg + calc + 2500 * (s⁻¹) ^ 4 * LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 + = + (2500 * N ^ 2 * (Lam * L)) * (s⁻¹) ^ 4 := by + dsimp [N, Lam, L] + ring + _ ≤ (2500 * N ^ 2 * (Lam * L)) * + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 := hscale_scaled + _ = (2500 * N ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * Lam * L) := by ring + _ ≤ AweakForce * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * Lam * L) := by + simpa [N, Lam, L, mul_assoc, mul_left_comm, mul_comm] using + hforce_scaled + _ = + AweakForce * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + dsimp [Lam, L] + +/-- Weak-flux energy component adequacy after expanding the zero-Dirichlet envelope. -/ +theorem zeroTraceDirichletWeakFluxDisplayedEnergyScale_le_compact_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) + (hs : 0 < s) (hs_le : s ≤ 1) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + (32500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let Lam : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hLam_nonneg : 0 ≤ Lam := by + dsimp [Lam] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hcoeff_nonneg : 0 ≤ 50 * (s⁻¹) ^ 2 * Lam := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (50 : ℝ)) (sq_nonneg (s⁻¹))) + hLam_nonneg + have henv := + zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + Q a g hs hG_nonneg + have hmul := mul_le_mul_of_nonneg_left henv hcoeff_nonneg + have hscale := weakFlux_inv_pow_four_le_rpow_neg_five_halves_sq hs hs_le + have hfactor_nonneg : 0 ≤ 32500 * N ^ 2 * Lam * L * G ^ 2 := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (32500 : ℝ)) (sq_nonneg N)) + hLam_nonneg) + hL_nonneg) + (sq_nonneg G) + have hscaled := mul_le_mul_of_nonneg_left hscale hfactor_nonneg + calc + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + zeroTraceDirichletEnergyEnvelope Q a s g + ≤ 50 * (s⁻¹) ^ 2 * Lam * + (650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by + simpa [Lam, L, N, G, mul_assoc, mul_left_comm, mul_comm] using hmul + _ = 32500 * N ^ 2 * Lam * L * G ^ 2 * (s⁻¹) ^ 4 := by ring + _ ≤ 32500 * N ^ 2 * Lam * L * G ^ 2 * + (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 := hscaled + _ = + (32500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [N, Lam, L, G] + ring + +/-- +Zero-trace gradient-tail adequacy at the raw scale produced by the +zero-Dirichlet energy envelope. + +This is the complete tail algebra before the final coefficient conversion from +`lambda^{-2}` to the manuscript `Lambda * lambda^{-1}` scale. +-/ +theorem zeroTraceDirichletGradientTailBudget_mul_five_inv_le_raw_lambdaInv_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) + (hs : 0 < s) + (hG_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) : + (5 * s⁻¹) * zeroTraceDirichletGradientTailBudget Q a s g ≤ + (887500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have htail_coeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * L := by + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + hL_nonneg + have henergy := + zeroTraceDirichletEnergyEnvelope_le_poincareDisplayedScale_noteConstants + Q a g hs hG_nonneg + have henergy_scaled := + mul_le_mul_of_nonneg_left henergy htail_coeff_nonneg + have htail_base : + zeroTraceDirichletGradientTailBudget Q a s g ≤ + 177500 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 := by + have henergy_term : + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g ≤ + 250 * (s⁻¹) ^ 2 * L * + (650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) := by + simpa [L, N, G, mul_assoc, mul_left_comm, mul_comm] using + henergy_scaled + have hforce_term : + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 = + 15000 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 := by + dsimp [L, N, G] + unfold zeroTraceDirichletGradientTailBudget + calc + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + zeroTraceDirichletEnergyEnvelope Q a s g + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + ≤ + 250 * (s⁻¹) ^ 2 * L * + (650 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2) + + 15000 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 := + add_le_add henergy_term hforce_term.le + _ = 177500 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2 := by ring + have htail_mul := + mul_le_mul_of_nonneg_left htail_base (by positivity : 0 ≤ 5 * s⁻¹) + calc + (5 * s⁻¹) * zeroTraceDirichletGradientTailBudget Q a s g + ≤ (5 * s⁻¹) * + (177500 * (s⁻¹) ^ 4 * L ^ 2 * N ^ 2 * G ^ 2) := htail_mul + _ = 887500 * N ^ 2 * ((s⁻¹) ^ 5 * L ^ 2 * G ^ 2) := by ring + _ = + 887500 * N ^ 2 * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * L ^ 2 * G ^ 2) := by + rw [weakFlux_inv_pow_five_eq_rpow_neg_five_halves_sq hs] + _ = + (887500 * N ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * L ^ 2 * G ^ 2) := by + ring + _ = + (887500 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [N, L, G] + +/-- +Weak-flux `BV` tail adequacy for the tight averaged-budget choice. This is +the algebraic allocation used when the harmonic-remainder BV constant is chosen +as the sum of the three averaged budget pieces. +-/ +theorem zeroTraceDirichletWeakFluxDisplayedBVTailScale_le_compact_sq_of_averaged_budget_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g : Vec d → Vec d) + {Brho BomegaNeg BomegaForce Arho AomegaNeg AomegaForce : ℝ} + (hs : 0 < s) + (hBrho : + Brho ≤ + Arho * + ((s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + (hBomegaNeg : + BomegaNeg ≤ + AomegaNeg * + ((s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + (hBomegaForce : + BomegaForce ≤ + AomegaForce * + ((s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) : + (5 * s⁻¹) * (Brho + (BomegaNeg + BomegaForce)) ≤ + (5 * (Arho + (AomegaNeg + AomegaForce))) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let Lam : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let K4 : ℝ := (s⁻¹) ^ 4 * Lam * L * G ^ 2 + let K5 : ℝ := (Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * Lam * L * G ^ 2 + have hsum : + Brho + (BomegaNeg + BomegaForce) ≤ + (Arho + (AomegaNeg + AomegaForce)) * K4 := by + calc + Brho + (BomegaNeg + BomegaForce) + ≤ Arho * K4 + (AomegaNeg * K4 + AomegaForce * K4) := by + exact add_le_add + (by simpa [K4, Lam, L, G] using hBrho) + (add_le_add + (by simpa [K4, Lam, L, G] using hBomegaNeg) + (by simpa [K4, Lam, L, G] using hBomegaForce)) + _ = (Arho + (AomegaNeg + AomegaForce)) * K4 := by ring + have htail_coeff_nonneg : 0 ≤ 5 * s⁻¹ := by positivity + have hscaled := mul_le_mul_of_nonneg_left hsum htail_coeff_nonneg + calc + (5 * s⁻¹) * (Brho + (BomegaNeg + BomegaForce)) + ≤ (5 * s⁻¹) * + ((Arho + (AomegaNeg + AomegaForce)) * K4) := hscaled + _ = + (5 * (Arho + (AomegaNeg + AomegaForce))) * + ((s⁻¹) ^ 5 * Lam * L * G ^ 2) := by + dsimp [K4] + ring + _ = + (5 * (Arho + (AomegaNeg + AomegaForce))) * K5 := by + dsimp [K5] + rw [weakFlux_inv_pow_five_eq_rpow_neg_five_halves_sq hs] + simp only [Real.rpow_eq_pow] + _ = + (5 * (Arho + (AomegaNeg + AomegaForce))) * + ((Real.rpow s (-(5 / 2 : ℝ))) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + dsimp [K5, Lam, L, G] + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantEnvelope.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantEnvelope.lean new file mode 100644 index 0000000000..0738375e1d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSConstantEnvelope.lean @@ -0,0 +1,607 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS + +/-! # RHSConstant Envelope -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Constant envelopes for the RHS coarse-flux response + +The manuscript statement of §3.2.4 carries an unspecified dimensional constant +`C(d)`. The base `coarseFluxResponseRHSBound` names the displayed scalar RHS +without this constant. This leaf module keeps the harmless constant envelope +available at the split/recomposition and descendant-averaging surfaces. +-/ + +open scoped BigOperators ENNReal + +private theorem sqrt_two_mul_add_le_two_mul_add {A B : ℝ} + (hB : 0 ≤ B) : + Real.sqrt 2 * (Real.sqrt 2 * A + B) ≤ 2 * (A + B) := by + have hsqrt_two_sq : Real.sqrt 2 * Real.sqrt 2 = (2 : ℝ) := by + rw [← pow_two, Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + have hsqrt_two_le_two : Real.sqrt 2 ≤ (2 : ℝ) := by + have hlt : Real.sqrt 2 < (3 / 2 : ℝ) := Real.sqrt_two_lt_three_halves + linarith + calc + Real.sqrt 2 * (Real.sqrt 2 * A + B) + = (Real.sqrt 2 * Real.sqrt 2) * A + Real.sqrt 2 * B := by + ring + _ = 2 * A + Real.sqrt 2 * B := by + rw [hsqrt_two_sq] + _ ≤ 2 * A + 2 * B := by + exact add_le_add (le_refl (2 * A)) + (mul_le_mul_of_nonneg_right hsqrt_two_le_two hB) + _ = 2 * (A + B) := by ring + +/-- +Generic target version of the §3.2.4 split-component recomposition theorem. +This is useful when the component estimates close into `C(d)` times the named +bare RHS rather than the bare RHS itself. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_of_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV : Vec d → Vec d) + {BdefectW BfluxV Ba0V B : ℝ} + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ BdefectW) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V) + (hcomponents : + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW + BfluxV) + Ba0V) ≤ B) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ B := by + have hsplit := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_split_components + Q a a0 s gradU gradW gradV hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + calc + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) + ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x))) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x))) := hsplit + _ ≤ Real.sqrt 2 * (Real.sqrt 2 * (BdefectW + BfluxV) + Ba0V) := by + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + exact add_le_add + (mul_le_mul_of_nonneg_left (add_le_add hdefectW hfluxV) + (Real.sqrt_nonneg _)) + ha0V + _ ≤ B := hcomponents + +/-- +Constant-envelope version of the one-cube §3.2.4 split recomposition. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_const_mul_coarseFluxResponseRHSBound_of_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (gradU gradW gradV g : Vec d → Vec d) + {BdefectW BfluxV Ba0V : ℝ} + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ BdefectW) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V) + (hcomponents : + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW + BfluxV) + Ba0V) ≤ + C * coarseFluxResponseRHSBound Q a a0 s gradU g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + C * coarseFluxResponseRHSBound Q a a0 s gradU g := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_of_split_component_bounds + Q a a0 s gradU gradW gradV hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + hdefectW hfluxV ha0V hcomponents + +/-- +The split-envelope triangle constants for component bounds that already carry +the same nonnegative multiplier `C`. +-/ +theorem coarseFluxResponseRHSScaledSplitEnvelope_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU g : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + Real.sqrt 2 * + (Real.sqrt 2 * + (C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g + + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + have hpoincare_nonneg : + 0 ≤ C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := + mul_nonneg hC_nonneg + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + Q a a0 g hs hgBdd) + calc + Real.sqrt 2 * + (Real.sqrt 2 * + (C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g + + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) + ≤ + 2 * + ((C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g + + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) := + sqrt_two_mul_add_le_two_mul_add hpoincare_nonneg + _ = 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := by + rw [coarseFluxResponseRHSBound_eq_component_sum] + unfold coarseFluxResponseRHSHomogeneousSplitBound + ring + +/-- +Split-component recomposition when every component estimate closes into the +same constant multiple of its compact §3.2.4 component. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_const_mul_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU gradW gradV g : Vec d → Vec d) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound Q a a0 s gradU g := + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_of_split_component_bounds + Q a a0 s gradU gradW gradV hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd + hdefectW hfluxV ha0V + (coarseFluxResponseRHSScaledSplitEnvelope_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_bddAbove + Q a a0 gradU g hC_nonneg hs hgBdd) + +/-- +Descendant-localized split-component handoff to an arbitrary scalar envelope. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_bound_sq_of_descendant_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU gradW gradV : Vec d → Vec d) (j : ℕ) + {BdefectW BfluxV Ba0V B : TriadicCube d → ℝ} + (hgrad : + ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, gradU x = gradW x + gradV x) + (hdefectW_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fluxDefect a a0 gradW)) + (hfluxV_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (gradV x))) + (hdefectU_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hdefectW_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradW) ≤ + BdefectW R) + (hfluxV : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV R) + (ha0V : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V R) + (hcomponents : + ∀ R ∈ descendantsAtDepth Q j, + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW R + BfluxV R) + Ba0V R) ≤ + B R) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + Real.sqrt (descendantsAverage Q j fun R => (B R) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_pointwiseBound + Q s (fluxDefect a a0 gradU) j B ?_ ?_ + · intro R hR + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s + (fluxDefect a a0 gradU) (hdefectU_bdd R hR) + · intro R hR + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_of_split_component_bounds + R a a0 s gradU gradW gradV + (hgrad R hR) + (hdefectW_mem R hR) (hfluxV_mem R hR) (ha0V_mem R hR) + (hdefectW_bdd R hR) (hfluxV_bdd R hR) (ha0V_bdd R hR) + (hdefectW R hR) (hfluxV R hR) (ha0V R hR) + (hcomponents R hR) + +/-- +Descendant-localized split-component handoff to `C` times the named bare +one-cube RHS on every descendant. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_const_mul_coarseFluxResponseRHSBound_sq_of_descendant_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (gradU gradW gradV g : Vec d → Vec d) (j : ℕ) + {BdefectW BfluxV Ba0V : TriadicCube d → ℝ} + (hgrad : + ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, gradU x = gradW x + gradV x) + (hdefectW_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fluxDefect a a0 gradW)) + (hfluxV_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (gradV x))) + (hdefectU_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hdefectW_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradW) ≤ + BdefectW R) + (hfluxV : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (gradV x)) ≤ BfluxV R) + (ha0V : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul a0 (gradV x)) ≤ Ba0V R) + (hcomponents : + ∀ R ∈ descendantsAtDepth Q j, + Real.sqrt 2 * (Real.sqrt 2 * (BdefectW R + BfluxV R) + Ba0V R) ≤ + C * coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_bound_sq_of_descendant_split_component_bounds + Q a a0 s gradU gradW gradV j + hgrad hdefectW_mem hfluxV_mem ha0V_mem + hdefectU_bdd hdefectW_bdd hfluxV_bdd ha0V_bdd + hdefectW hfluxV ha0V hcomponents + +/-- +Pull a nonnegative scalar outside the descendant `L²` average of the named +one-cube §3.2.4 RHS bound. +-/ +theorem sqrt_descendantsAverage_const_mul_coarseFluxResponseRHSBound_sq_eq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU g : Vec d → Vec d) (j : ℕ) + (hC_nonneg : 0 ≤ C) : + Real.sqrt + (descendantsAverage Q j fun R => + (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) = + C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + have havg_nonneg : + 0 ≤ descendantsAverage Q j fun R => + (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2 := + descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hscaled : + descendantsAverage Q j + (fun R => (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) = + C ^ 2 * + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := by + calc + descendantsAverage Q j + (fun R => (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) + = + descendantsAverage Q j + (fun R => C ^ 2 * (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := by + apply congrArg (descendantsAverage Q j) + funext R + ring + _ = + C ^ 2 * + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := + descendantsAverage_mul_left Q j (C ^ 2) + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) + calc + Real.sqrt + (descendantsAverage Q j fun R => + (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) + = + Real.sqrt + (C ^ 2 * + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2)) := by + rw [hscaled] + _ = + C * + Real.sqrt + (descendantsAverage Q j + (fun R => (coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2)) := by + rw [Real.sqrt_mul (sq_nonneg C), + Real.sqrt_sq hC_nonneg] + _ = C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := rfl + +/-- +Descendant-localized §3.2.4 handoff from pointwise one-cube bounds with a +caller-supplied scalar envelope. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_const_mul_coarseFluxResponseRHSBound_sq_of_descendant_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (C s : ℝ) (gradU g : Vec d → Vec d) (j : ℕ) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + C * coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_pointwiseBound + Q s (fluxDefect a a0 gradU) j + (fun R => C * coarseFluxResponseRHSBound R a a0 s gradU g) ?_ hbound + intro R hR + exact cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove R s + (fluxDefect a a0 gradU) (hdefect_bdd R hR) + +/-- +Named descendant-localized §3.2.4 handoff with the nonnegative scalar envelope +pulled outside the localized RHS norm. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU g : Vec d → Vec d) (j : ℕ) + (hC_nonneg : 0 ≤ C) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + C * coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + calc + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j + ≤ + Real.sqrt + (descendantsAverage Q j fun R => + (C * coarseFluxResponseRHSBound R a a0 s gradU g) ^ 2) := + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_sqrt_descendantsAverage_const_mul_coarseFluxResponseRHSBound_sq_of_descendant_bounds + Q a a0 C s gradU g j hdefect_bdd hbound + _ = C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := + sqrt_descendantsAverage_const_mul_coarseFluxResponseRHSBound_sq_eq + Q a a0 gradU g j hC_nonneg + +/-- +Descendant-localized handoff for one-cube apex estimates whose target already +contains the formal split/recomposition constant `2 * C`. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_two_mul_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU g : Vec d → Vec d) (j : ℕ) + (hC_nonneg : 0 ≤ C) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + 2 * C * coarseFluxResponseRHSBound R a a0 s gradU g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + 2 * C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + exact + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + Q a a0 gradU g j (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) hC_nonneg) + hdefect_bdd hbound + +/-- +Descendant-localized split-component handoff with the formal `2 * C` +split/recomposition constant already included in the localized endpoint. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_two_mul_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_const_mul_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {C s : ℝ} (gradU gradW gradV g : Vec d → Vec d) (j : ℕ) + (hC_nonneg : 0 ≤ C) (hs : 0 < s) + (hgBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hgrad : + ∀ R ∈ descendantsAtDepth Q j, + ∀ x ∈ cubeSet R, gradU x = gradW x + gradV x) + (hdefectW_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fluxDefect a a0 gradW)) + (hfluxV_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (gradV x))) + (hdefectU_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hdefectW_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradW) ≤ + C * coarseFluxResponseRHSHomogeneousSplitBound R a a0 s gradU g) + (hfluxV : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (gradV x)) ≤ + C * coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (ha0V : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul a0 (gradV x)) ≤ + C * coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 gradU) j ≤ + 2 * C * localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := by + refine + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_two_mul_const_mul_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + Q a a0 gradU g j hC_nonneg hdefectU_bdd ?_ + intro R hR + exact + cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_const_mul_coarseFluxResponseRHSBound_of_const_mul_split_component_bounds + (Q := R) (a := a) (a0 := a0) (C := C) (s := s) + (gradU := gradU) (gradW := gradW) (gradV := gradV) (g := g) + hC_nonneg hs (hgBdd R hR) + (hgrad R hR) + (hdefectW_mem R hR) (hfluxV_mem R hR) (ha0V_mem R hR) + (hdefectW_bdd R hR) (hfluxV_bdd R hR) (ha0V_bdd R hR) + (hdefectW R hR) (hfluxV R hR) (ha0V R hR) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSCorrections.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSCorrections.lean new file mode 100644 index 0000000000..c0b6d23bb4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSCorrections.lean @@ -0,0 +1,536 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHS +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex + +/-! # RHSCorrections -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# RHS correction components for the coarse-flux response split + +This file contains the first correction-component bridge in manuscript §3.2.4. +The core split algebra stays in `CoarseFluxResponse.RHS`; here we import the +heavier §3.2.3 weak-flux RHS apex only where it is actually used. +-/ + +open scoped BigOperators ENNReal + +/-- +The expanded note-facing §3.2.3 weak-flux RHS used before it is absorbed into +the compact §3.2.4 weak-flux correction component. +-/ +noncomputable def coarseFluxResponseRHSWeakFluxExpandedBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) (m : ℕ) (BU BV : ℝ) : ℝ := + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + +/-- +Depth-zero bridge from the localized §3.2.3 weak-flux output to the one-cube +`q = 2` component estimate used in the §3.2.4 split. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_localized_depth_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (gradV g : Vec d → Vec d) {BU BV : ℝ} + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (gradV x)) 0 ≤ + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV) + (hscalar : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + have hnonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s + (fun x => matVecMul (a x) (gradV x)) hfluxV_bdd + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) + = + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (gradV x)) 0 := by + exact + (localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg + Q s (fun x => matVecMul (a x) (gradV x)) hnonneg).symm + _ ≤ coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV := + hlocalized + _ ≤ coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := hscalar + +/-- +The `a∇v` correction component in the §3.2.4 split, discharged from the +note-facing H¹ §3.2.3 weak-flux RHS apex. The remaining scalar hypothesis is +the manuscript constant-absorption step comparing the expanded weak-flux RHS +with the compact §3.2.4 component. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (hscalar : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g v.grad 0 BU BV ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + have hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (v.grad x)) 0 ≤ + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g v.grad 0 BU BV := by + simpa [coarseFluxResponseRHSWeakFluxExpandedBound] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) (u := v) (lam := lam) + (Lam := Lam) hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc (m := 0) (BU := BU) (BV := BV) hBdd + hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg + (by intro k; simpa using hu_tail k) hvConstructed + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_localized_depth_zero + Q a s v.grad g hfluxV_bdd hlocalized hscalar + +/-- +Frobenius control of a constant matrix acting on a vector. This is the +pointwise algebraic core used to move a constant coarse matrix through the +note-normalized negative seminorm. +-/ +theorem vecNormSq_matVecMul_le_matNormSq_mul_vecNormSq + {d : ℕ} (A : Mat d) (ξ : Vec d) : + vecNormSq (matVecMul A ξ) ≤ matNormSq A * vecNormSq ξ := by + have hcalc : + ∑ i, (∑ j, A i j * ξ j) ^ 2 ≤ + (∑ i, ∑ j, (A i j) ^ 2) * ∑ j, (ξ j) ^ 2 := by + calc + ∑ i, (∑ j, A i j * ξ j) ^ 2 + ≤ ∑ i, (∑ j, (A i j) ^ 2) * ∑ j, (ξ j) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i hi + simpa [pow_two] using + (Finset.sum_mul_sq_le_sq_mul_sq + (s := Finset.univ) (f := fun j => A i j) (g := ξ)) + _ = (∑ i, ∑ j, (A i j) ^ 2) * ∑ j, (ξ j) ^ 2 := by + rw [Finset.sum_mul] + simpa [vecNormSq, vecDot, matNormSq, matVecMul, pow_two] using hcalc + +/-- +The cube average commutes with applying a constant matrix to a vector field. +-/ +theorem cubeAverageVec_matVecMul_const + {d : ℕ} (Q : TriadicCube d) (A : Mat d) (u : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) : + cubeAverageVec Q (fun x => matVecMul A (u x)) = + matVecMul A (cubeAverageVec Q u) := by + funext i + have hui_int : + ∀ j : Fin d, + MeasureTheory.Integrable (fun x => u x j) + (volumeMeasureOn (cubeSet Q)) := by + intro j + have huj : + MeasureTheory.MemLp (fun x => u x j) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) j).comp_memLp' hu + exact huj.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hAui_int : + ∀ j : Fin d, + MeasureTheory.Integrable (fun x => A i j * u x j) + (volumeMeasureOn (cubeSet Q)) := by + intro j + exact (hui_int j).const_mul (A i j) + calc + cubeAverageVec Q (fun x => matVecMul A (u x)) i + = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, ∑ j, A i j * u x j ∂MeasureTheory.volume := by + rfl + _ = (cubeVolume Q)⁻¹ * + ∑ j, ∫ x in cubeSet Q, A i j * u x j ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro j hj + exact hAui_int j + _ = (cubeVolume Q)⁻¹ * + ∑ j, A i j * ∫ x in cubeSet Q, u x j ∂MeasureTheory.volume := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro j hj + rw [MeasureTheory.integral_const_mul] + _ = ∑ j, A i j * + ((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, u x j ∂MeasureTheory.volume) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = matVecMul A (cubeAverageVec Q u) i := by + simp [matVecMul, cubeAverageVec, cubeAverage] + +/-- +Depthwise action of a constant matrix on the `q = 2` negative Besov +descendant-average quantity. +-/ +theorem cubeBesovNegativeVectorDepthAverage_constMatMul_le + {d : ℕ} (Q : TriadicCube d) (A : Mat d) (u : Vec d → Vec d) (j : ℕ) + (hu_desc : + ∀ R ∈ descendantsAtDepth Q j, MemVectorL2 (cubeSet R) u) : + cubeBesovNegativeVectorDepthAverage Q (fun x => matVecMul A (u x)) j ≤ + matNormSq A * cubeBesovNegativeVectorDepthAverage Q u j := by + unfold cubeBesovNegativeVectorDepthAverage + calc + descendantsAverage Q j + (fun R => vecNormSq (cubeAverageVec R (fun x => matVecMul A (u x)))) + ≤ + descendantsAverage Q j + (fun R => matNormSq A * vecNormSq (cubeAverageVec R u)) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + calc + vecNormSq (cubeAverageVec R (fun x => matVecMul A (u x))) + = vecNormSq (matVecMul A (cubeAverageVec R u)) := by + rw [cubeAverageVec_matVecMul_const R A u (hu_desc R hR)] + _ ≤ matNormSq A * vecNormSq (cubeAverageVec R u) := + vecNormSq_matVecMul_le_matNormSq_mul_vecNormSq A (cubeAverageVec R u) + _ = + matNormSq A * + descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R u)) := by + rw [descendantsAverage_mul_left] + +/-- +Finite `q = 2` negative seminorm control under a constant matrix action. +-/ +theorem cubeBesovNegativeVectorPartialSeminormTwo_constMatMul_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (A : Mat d) + (u : Vec d → Vec d) (N : ℕ) + (hu_desc : + ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) u) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul A (u x)) ≤ + matNorm A * cubeBesovNegativeVectorPartialSeminormTwo Q s N u := by + have hsq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul A (u x))) ^ 2 ≤ + matNormSq A * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul A (u x))) ^ 2 + ≤ + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (matNormSq A * cubeBesovNegativeVectorDepthAverage Q u j) := by + refine + sq_cubeBesovNegativeVectorPartialSeminormTwo_le_of_depthAverage_le + Q s N (fun x => matVecMul A (u x)) ?_ + intro j hj + exact cubeBesovNegativeVectorDepthAverage_constMatMul_le + Q A u j (fun R hR => hu_desc j hj R hR) + _ = + matNormSq A * + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j := by + calc + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (matNormSq A * cubeBesovNegativeVectorDepthAverage Q u j) + = + ∑ j ∈ Finset.range (N + 1), + matNormSq A * + ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = + matNormSq A * + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j := by + rw [Finset.mul_sum] + _ = + matNormSq A * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 := by + congr 1 + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + refine Finset.sum_congr rfl ?_ + intro j hj + exact (sq_cubeBesovNegativeVectorDepthSeminorm Q s u j).symm + have hright_sq : + matNormSq A * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 = + (matNorm A * cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 := by + calc + matNormSq A * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + = + (Real.sqrt (matNormSq A)) ^ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 := by + rw [Real.sq_sqrt (matNormSq_nonneg A)] + _ = + (matNorm A * cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 := by + rw [matNorm] + ring + have hleft_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul A (u x)) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N + (fun x => matVecMul A (u x)) + have hright_nonneg : + 0 ≤ matNorm A * cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + mul_nonneg (matNorm_nonneg A) + (cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u) + nlinarith + +/-- +Full `q = 2` negative seminorm control under a constant matrix action. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (A : Mat d) (u : Vec d → Vec d) + (hu_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, MemVectorL2 (cubeSet R) u) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul A (u x)) ≤ + matNorm A * cubeBesovNegativeVectorSeminormTwo Q s u := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s + (fun x => matVecMul A (u x)) ?_ + intro N + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul A (u x)) + ≤ matNorm A * cubeBesovNegativeVectorPartialSeminormTwo Q s N u := by + exact cubeBesovNegativeVectorPartialSeminormTwo_constMatMul_le + Q s A u N (fun j hj R hR => hu_desc j R hR) + _ ≤ matNorm A * cubeBesovNegativeVectorSeminormTwo Q s u := by + refine mul_le_mul_of_nonneg_left ?_ (matNorm_nonneg A) + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup huBdd ⟨N, rfl⟩ + +/-- +The expanded note-facing RHS Poincare bound before the constant-coefficient +correction `a₀∇v` is absorbed into the compact §3.2.4 Poincare component. +-/ +noncomputable def coarseFluxResponseRHSPoincareExpandedBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) : ℝ := + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +/-- +Poincare-correction bridge from a gradient RHS Poincare bound plus a +constant-matrix action estimate to the `a₀∇v` component in the §3.2.4 split. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradV g : Vec d → Vec d) {Bgrad : ℝ} + (hmat : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV) + (hgrad : + cubeBesovNegativeVectorSeminormTwo Q s gradV ≤ Bgrad) + (hscalar : + matNorm a0 * Bgrad ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) + ≤ matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV := hmat + _ ≤ matNorm a0 * Bgrad := by + exact mul_le_mul_of_nonneg_left hgrad (matNorm_nonneg a0) + _ ≤ coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := hscalar + +/-- +Poincare-correction bridge where the constant-matrix action is discharged from +descendant-local `L²` data plus bounded finite negative seminorms. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound_and_descendant_mem + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradV g : Vec d → Vec d) {Bgrad : ℝ} + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) gradV) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N gradV)) + (hgrad : + cubeBesovNegativeVectorSeminormTwo Q s gradV ≤ Bgrad) + (hscalar : + matNorm a0 * Bgrad ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have hmat : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV := + cubeBesovNegativeVectorSeminormTwo_constMatMul_le + Q s a0 gradV hgrad_mem_desc hgrad_bdd + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound + Q a a0 s gradV g hmat hgrad hscalar + +/-- +The `a₀∇v` correction component routed through the H¹ RHS Poincare theorem. +The constant-matrix action is discharged by the seminorm bridge above; the +remaining scalar hypothesis is the compact-manuscript absorption step. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hscalar : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g v.grad ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have hgrad : + cubeBesovNegativeVectorSeminormTwo Q s v.grad ≤ + coarseFluxResponseRHSPoincareExpandedBound Q a s g v.grad := by + simpa [coarseFluxResponseRHSPoincareExpandedBound] using + cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := v) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hweak hg hGlobalBdd + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound_and_descendant_mem + Q a a0 s v.grad g hgrad_mem_desc hgrad_bdd hgrad hscalar + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSScalarAbsorption.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSScalarAbsorption.lean new file mode 100644 index 0000000000..6f7212e6c5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/RHSScalarAbsorption.lean @@ -0,0 +1,885 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.RHSCorrections + +/-! # RHSScalar Absorption -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Scalar absorption for the RHS coarse-flux response + +This leaf module keeps the scalar bookkeeping for manuscript §3.2.4 out of the +main split/recomposition files. The estimates here turn the expanded +§3.2.3/Poincare square-root RHSs into compact correction components once the +corresponding square-side adequacy inequalities are supplied, and absorb the +`sqrt 2` triangle constants into a dimension-constant envelope. +-/ + +open scoped BigOperators ENNReal + +private theorem sqrt_two_mul_add_le_two_mul_add {A B : ℝ} + (hB : 0 ≤ B) : + Real.sqrt 2 * (Real.sqrt 2 * A + B) ≤ 2 * (A + B) := by + have hsqrt_two_sq : Real.sqrt 2 * Real.sqrt 2 = (2 : ℝ) := by + rw [← pow_two, Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + have hsqrt_two_le_two : Real.sqrt 2 ≤ (2 : ℝ) := by + have hlt : Real.sqrt 2 < (3 / 2 : ℝ) := Real.sqrt_two_lt_three_halves + linarith + calc + Real.sqrt 2 * (Real.sqrt 2 * A + B) + = (Real.sqrt 2 * Real.sqrt 2) * A + Real.sqrt 2 * B := by + ring + _ = 2 * A + Real.sqrt 2 * B := by + rw [hsqrt_two_sq] + _ ≤ 2 * A + 2 * B := by + exact add_le_add (le_refl (2 * A)) + (mul_le_mul_of_nonneg_right hsqrt_two_le_two hB) + _ = 2 * (A + B) := by ring + +/-- The square radicand in the expanded weak-flux correction bound. -/ +noncomputable def coarseFluxResponseRHSWeakFluxExpandedRadicand {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) (m : ℕ) (BU BV : ℝ) : ℝ := + (coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +/-- The expanded weak-flux correction bound is the square root of its radicand. -/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_eq_sqrt_radicand {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) (m : ℕ) (BU BV : ℝ) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV m BU BV = + Real.sqrt + (coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV m BU BV) := by + rfl + +/-- Nonnegativity of the expanded weak-flux correction radicand. -/ +theorem coarseFluxResponseRHSWeakFluxExpandedRadicand_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g gradV : Vec d → Vec d) (m : ℕ) {BU BV : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) : + 0 ≤ coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV m BU BV := by + have hweight_nonneg : 0 ≤ (coarsePoincareRHSDepthWeight s m)⁻¹ := by + refine inv_nonneg.mpr ?_ + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * 2) + have henergy_coeff_nonneg : + 0 ≤ 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a := by + positivity + have htail_coeff_nonneg : 0 ≤ 5 * s⁻¹ := by + positivity + have hforce_nonneg : + 0 ≤ + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + positivity + unfold coarseFluxResponseRHSWeakFluxExpandedRadicand + exact mul_nonneg hweight_nonneg + (add_nonneg + (add_nonneg + (add_nonneg + (mul_nonneg henergy_coeff_nonneg havg_nonneg) + (mul_nonneg htail_coeff_nonneg hBU_nonneg)) + (mul_nonneg htail_coeff_nonneg hBV_nonneg)) + hforce_nonneg) + +/-- +Square-side scalar absorption for the weak-flux correction component. + +The remaining analytic input is the radicand inequality, which is where the +zero-Dirichlet energy estimate for the correction field is inserted. +-/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_le_correctionBound_of_radicand_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g gradV : Vec d → Vec d) (m : ℕ) {BU BV : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hrad : + coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV m BU BV ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV m BU BV ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + rw [coarseFluxResponseRHSWeakFluxExpandedBound_eq_sqrt_radicand] + exact Real.sqrt_le_of_le_sq + (coarseFluxResponseRHSWeakFluxExpandedRadicand_nonneg + Q a g gradV m hs havg_nonneg hBU_nonneg hBV_nonneg) + (coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + Q a g hs hgBdd) + hrad + +/-- +Depth-zero weak-flux radicand absorption from four component budgets. + +This is the scalar bookkeeping form of the remaining manuscript estimate: the +energy, two tail terms, and forcing term may be proved separately and then +summed into the compact correction square. +-/ +theorem coarseFluxResponseRHSWeakFluxExpandedRadicand_zero_le_correctionBound_sq_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) {BU BV Benergy BUtail BVtail Bforce : ℝ} + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hsum : + Benergy + BUtail + BVtail + Bforce ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g gradV 0 BU BV ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2 := by + unfold coarseFluxResponseRHSWeakFluxExpandedRadicand + simp only [coarsePoincareRHSDepthWeight_zero, inv_one, one_mul] + nlinarith [henergy, hBU, hBV, hforce, hsum] + +/-- +Weak-flux square-root absorption from component budgets and the standard +nonnegativity/boundedness hypotheses. +-/ +theorem coarseFluxResponseRHSWeakFluxExpandedBound_le_correctionBound_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g gradV : Vec d → Vec d) {BU BV Benergy BUtail BVtail Bforce : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hsum : + Benergy + BUtail + BVtail + Bforce ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + exact + coarseFluxResponseRHSWeakFluxExpandedBound_le_correctionBound_of_radicand_le_sq + Q a g gradV 0 hs havg_nonneg hBU_nonneg hBV_nonneg hgBdd + (coarseFluxResponseRHSWeakFluxExpandedRadicand_zero_le_correctionBound_sq_of_component_bounds + Q a s g gradV henergy hBU hBV hforce hsum) + +/-- +Depth-zero weak-flux component bridge with the scalar side supplied as +component budgets rather than one opaque expanded-RHS comparison. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_localized_depth_zero_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (gradV g : Vec d → Vec d) {BU BV Benergy BUtail BVtail Bforce : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (gradV x)) 0 ≤ + coarseFluxResponseRHSWeakFluxExpandedBound Q a s g gradV 0 BU BV) + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradV) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hsum : + Benergy + BUtail + BVtail + Bforce ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_localized_depth_zero + Q a s gradV g hfluxV_bdd hlocalized + (coarseFluxResponseRHSWeakFluxExpandedBound_le_correctionBound_of_component_bounds + Q a g gradV hs havg_nonneg hBU_nonneg hBV_nonneg hgBdd + henergy hBU hBV hforce hsum) + +/-- +H¹ weak-solution weak-flux correction with the scalar side expressed as the +square-radicand inequality which remains after inserting the correction-field +energy estimate. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_expanded_radicand_le_sq + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (hrad : + coarseFluxResponseRHSWeakFluxExpandedRadicand Q a s g v.grad 0 BU BV ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn + Q a s g v hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hfluxV_bdd + (coarseFluxResponseRHSWeakFluxExpandedBound_le_correctionBound_of_radicand_le_sq + Q a g v.grad 0 hs havg_parent_nonneg hBU_nonneg hBV_nonneg + hGlobalBdd hrad) + +/-- +H¹ weak-solution weak-flux correction with the scalar side supplied as the +four component budgets of the expanded depth-zero radicand. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) v.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (v.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N v.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV Benergy BUtail BVtail Bforce : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s v.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a v.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a v.grad) + (cubeSet Q) MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s v.grad k ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + v.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (v.grad x)))) + (henergy : + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a v.grad) ≤ + Benergy) + (hBU : (5 * s⁻¹) * BU ≤ BUtail) + (hBV : (5 * s⁻¹) * BV ≤ BVtail) + (hforce : + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 ≤ + Bforce) + (hbudget : + Benergy + BUtail + BVtail + Bforce ≤ + (coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (v.grad x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g := by + exact + cubeBesovNegativeVectorSeminormTwo_matVecMul_grad_le_coarseFluxResponseRHSWeakFluxCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_expanded_radicand_le_sq + Q a s g v hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed hfluxV_bdd + (coarseFluxResponseRHSWeakFluxExpandedRadicand_zero_le_correctionBound_sq_of_component_bounds + Q a s g v.grad henergy hBU hBV hforce hbudget) + +/-- The square radicand in the expanded RHS Poincare correction bound. -/ +noncomputable def coarseFluxResponseRHSPoincareExpandedRadicand {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) : ℝ := + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + +/-- The expanded RHS Poincare correction bound is the square root of its radicand. -/ +theorem coarseFluxResponseRHSPoincareExpandedBound_eq_sqrt_radicand {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradV : Vec d → Vec d) : + coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV = + Real.sqrt + (coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV) := by + rfl + +/-- Nonnegativity of the expanded RHS Poincare correction radicand. -/ +theorem coarseFluxResponseRHSPoincareExpandedRadicand_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (g gradV : Vec d → Vec d) + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) : + 0 ≤ coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV := by + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * 2) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have henergy_coeff_nonneg : + 0 ≤ 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + positivity + have hforce_nonneg : + 0 ≤ + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + positivity + unfold coarseFluxResponseRHSPoincareExpandedRadicand + exact add_nonneg (mul_nonneg henergy_coeff_nonneg havg_nonneg) hforce_nonneg + +/-- +Square-side scalar absorption for the constant-coefficient Poincare correction. + +This is shaped to discharge the `matNorm a0 * expanded ≤ compact` hypothesis in +`RHSCorrections` after proving the manuscript energy-to-force square bound. +-/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_radicand_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {s : ℝ} + (g gradV : Vec d → Vec d) + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hrad : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have hrad_nonneg : + 0 ≤ coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV := + coarseFluxResponseRHSPoincareExpandedRadicand_nonneg Q a g gradV hs havg_nonneg + have hleft_sq : + (matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV) ^ 2 = + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV := by + rw [coarseFluxResponseRHSPoincareExpandedBound_eq_sqrt_radicand, + mul_pow, Real.sq_sqrt hrad_nonneg] + refine le_of_sq_le_sq ?_ + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + Q a a0 g hs hgBdd) + simpa [hleft_sq] using hrad + +/-- +Poincare radicand absorption from separate energy and forcing budgets after +multiplying by the constant-coefficient matrix norm. +-/ +theorem matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_correctionBound_sq_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (g gradV : Vec d → Vec d) {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g gradV ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2 := by + unfold coarseFluxResponseRHSPoincareExpandedRadicand + nlinarith [henergy, hforce, hsum] + +/-- +Poincare square-root absorption from component budgets and the standard +nonnegativity/boundedness hypotheses. +-/ +theorem matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {s : ℝ} + (g gradV : Vec d → Vec d) + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + matNorm a0 * coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + exact + matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_radicand_le_sq + Q a a0 g gradV hs havg_nonneg hgBdd + (matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_correctionBound_sq_of_component_bounds + Q a a0 s g gradV henergy hforce hsum) + +/-- +Poincare component bridge with the compact scalar correction supplied by +energy/forcing budgets. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound_and_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradV g : Vec d → Vec d) {Benergy Bforce : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hmat : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + matNorm a0 * cubeBesovNegativeVectorSeminormTwo Q s gradV) + (hgrad : + cubeBesovNegativeVectorSeminormTwo Q s gradV ≤ + coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV) + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound + Q a a0 s gradV g hmat hgrad + (matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_component_bounds + Q a a0 g gradV hs havg_nonneg hgBdd henergy hforce hsum) + +/-- +Poincare component bridge with constant-matrix action discharged from +descendant `L²` data, and scalar correction supplied by component budgets. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound_and_descendant_mem_and_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradV g : Vec d → Vec d) {Benergy Bforce : ℝ} + (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a gradV)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) gradV) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N gradV)) + (hgrad : + cubeBesovNegativeVectorSeminormTwo Q s gradV ≤ + coarseFluxResponseRHSPoincareExpandedBound Q a s g gradV) + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a gradV)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hsum : + Benergy + Bforce ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_le_coarseFluxResponseRHSPoincareCorrectionBound_of_grad_bound_and_descendant_mem + Q a a0 s gradV g hgrad_mem_desc hgrad_bdd hgrad + (matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_component_bounds + Q a a0 g gradV hs havg_nonneg hgBdd henergy hforce hsum) + +/-- +H¹ weak-solution Poincare correction with the scalar side expressed as the +square-radicand inequality remaining after the correction-field energy bound. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_expanded_radicand_le_sq + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + (hrad : + (matNorm a0) ^ 2 * + coarseFluxResponseRHSPoincareExpandedRadicand Q a s g v.grad ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + have havg_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a v.grad) := + cubeAverage_nonneg_of_nonneg_on (Q := Q) + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll v.grad) + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn + Q a a0 s g v hs hs_le hEll hweak hg hGlobalBdd + hgrad_mem_desc hgrad_bdd + (matNorm_mul_coarseFluxResponseRHSPoincareExpandedBound_le_correctionBound_of_radicand_le_sq + Q a a0 g v.grad hs havg_nonneg hGlobalBdd hrad) + +/-- +H¹ weak-solution Poincare correction with the scalar side supplied as +matrix-weighted energy and forcing budgets. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_component_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (g : Vec d → Vec d) (v : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) v g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad_mem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MemVectorL2 (cubeSet R) v.grad) + (hgrad_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v.grad)) + {Benergy Bforce : ℝ} + (henergy : + (matNorm a0) ^ 2 * + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a v.grad)) ≤ + Benergy) + (hforce : + (matNorm a0) ^ 2 * + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) ≤ + Bforce) + (hbudget : + Benergy + Bforce ≤ + (coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) ^ 2) : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (v.grad x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g := by + exact + cubeBesovNegativeVectorSeminormTwo_constMatMul_grad_le_coarseFluxResponseRHSPoincareCorrectionBound_of_h1DirichletRhsWeakSolutionOn_of_expanded_radicand_le_sq + Q a a0 s g v hs hs_le hEll hweak hg hGlobalBdd + hgrad_mem_desc hgrad_bdd + (matNorm_sq_mul_coarseFluxResponseRHSPoincareExpandedRadicand_le_correctionBound_sq_of_component_bounds + Q a a0 s g v.grad henergy hforce hbudget) + +/-- +The split-envelope constants are absorbed into a single factor `2`. This is +the local `C(d)` bookkeeping for the `sqrt 2` triangle inequalities. +-/ +theorem coarseFluxResponseRHSSplitEnvelope_le_two_mul_coarseFluxResponseRHSBound_of_poincare_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (hpoincare_nonneg : 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g ≤ + 2 * coarseFluxResponseRHSBound Q a a0 s gradU g := by + let H : ℝ := coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g + let W : ℝ := coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g + let P : ℝ := coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g + calc + coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g + = Real.sqrt 2 * (Real.sqrt 2 * (H + W) + P) := by + simp [H, W, P, coarseFluxResponseRHSSplitEnvelope] + _ ≤ 2 * ((H + W) + P) := + sqrt_two_mul_add_le_two_mul_add hpoincare_nonneg + _ = 2 * coarseFluxResponseRHSBound Q a a0 s gradU g := by + rw [coarseFluxResponseRHSBound_eq_component_sum] + simp [H, W, P, coarseFluxResponseRHSHomogeneousSplitBound] + +/-- Bounded-positive-Besov version of the split-envelope constant absorption. -/ +theorem coarseFluxResponseRHSSplitEnvelope_le_two_mul_coarseFluxResponseRHSBound_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + coarseFluxResponseRHSSplitEnvelope Q a a0 s gradU g ≤ + 2 * coarseFluxResponseRHSBound Q a a0 s gradU g := + coarseFluxResponseRHSSplitEnvelope_le_two_mul_coarseFluxResponseRHSBound_of_poincare_nonneg + Q a a0 s gradU g + (coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove Q a a0 g hs hgBdd) + +/-- +Split-component RHS flux-response estimate with the triangle constants +absorbed into the factor `2`. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_two_mul_coarseFluxResponseRHSBound_of_split_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU gradW gradV g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgrad : ∀ x ∈ cubeSet Q, gradU x = gradW x + gradV x) + (hdefectW_mem : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 gradW)) + (hfluxV_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (gradV x))) + (ha0V_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul a0 (gradV x))) + (hdefectW_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradW))) + (hfluxV_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul (a x) (gradV x)))) + (ha0V_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => matVecMul a0 (gradV x)))) + (hdefectW : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradW) ≤ + coarseFluxResponseRHSHomogeneousSplitBound Q a a0 s gradU g) + (hfluxV : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (gradV x)) ≤ + coarseFluxResponseRHSWeakFluxCorrectionBound Q a s g) + (ha0V : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradV x)) ≤ + coarseFluxResponseRHSPoincareCorrectionBound Q a a0 s g) : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + 2 * coarseFluxResponseRHSBound Q a a0 s gradU g := by + exact + (cubeBesovNegativeVectorSeminormTwo_fluxDefect_le_coarseFluxResponseRHSSplitEnvelope_of_split_component_bounds + Q a a0 s gradU gradW gradV g hgrad + hdefectW_mem hfluxV_mem ha0V_mem + hdefectW_bdd hfluxV_bdd ha0V_bdd hdefectW hfluxV ha0V).trans + (coarseFluxResponseRHSSplitEnvelope_le_two_mul_coarseFluxResponseRHSBound_of_bddAbove + Q a a0 gradU g hs hgBdd) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/Response.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/Response.lean new file mode 100644 index 0000000000..52ae0721ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarseFluxResponse/Response.lean @@ -0,0 +1,510 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse.EnergyForm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.HarmonicAndData + +/-! # Response -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators MatrixOrder Pointwise + +/-- For a symmetric elliptic matrix `a0`, the actual-defect energy form +controls the Euclidean square of the averaged defect up to `matNorm a0`. -/ +private theorem vecNormSq_le_matNorm_mul_vecDot_inv_of_isEllipticMatrix_of_isSymm {d : ℕ} + {a0 : Mat d} {lam Lam : ℝ} (ha0 : IsEllipticMatrix lam Lam a0) (ha0symm : a0.IsSymm) + (ξ : Vec d) : + vecNormSq ξ ≤ matNorm a0 * vecDot ξ (matVecMul a0⁻¹ ξ) := by + have ha0psd : a0.PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using ha0symm + · intro x + have hlam_pos : 0 < lam := ha0.1 + have hbase : 0 ≤ lam * vecNormSq x := by + exact mul_nonneg (le_of_lt hlam_pos) (vecNormSq_nonneg x) + have hlower := lowerBound_symmPart_of_isEllipticMatrix ha0 x + rw [vecDot_matVecMul_symmPart] at hlower + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using le_trans hbase hlower + have hleftInv : ∀ x : Vec d, matVecMul a0 (matVecMul a0⁻¹ x) = x := by + intro x + rw [matVecMul_mul, Matrix.mul_nonsing_inv a0 (isUnit_det_of_isEllipticMatrix ha0)] + funext i + simp [matVecMul, Matrix.one_apply] + exact + vecNormSq_le_matNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := a0⁻¹) (B := a0) ha0psd hleftInv ξ + +/-- Descendant cube-average control for a flux-defect field by the local +normalized block response and a scalar energy density. -/ +def CubeAverageFluxResponseControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (a0 : Mat d) (defect : Vec d → Vec d) + (energy : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R defect) ≤ + (((4 : ℝ) * matNorm a0 * normalizedBlockResponseMax R a a0) * + cubeAverage R energy) + +theorem cubeAverageFluxResponseControl_of_descendantScalarCanonicalFluxDefectData {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (defect : Vec d → Vec d) (energy : Vec d → ℝ) + {lam0 Lam0 : ℝ} (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hdesc : DescendantScalarCanonicalFluxDefectData Q a a0 defect energy) : + CubeAverageFluxResponseControl Q a a0 defect energy := by + intro j R hR + rcases hdesc j R hR with + ⟨lam, Lam, w, hEll, hv, hdefect, henergy⟩ + rcases hv with ⟨v⟩ + let actualDefect : Vec d → Vec d := + fun x => matVecMul (a x) (w.toH1.grad x) - matVecMul a0 (w.toH1.grad x) + have hdefectavg : + cubeAverageVec R defect = cubeAverageVec R actualDefect := + cubeAverageVec_eq_of_eq_on_cubeSet hdefect + have henergyavg : + cubeAverage R energy = cubeAverage R (scalarVariationEnergyIntegrand a w) := + cubeAverage_eq_of_eq_on_cubeSet henergy + have hv' : + ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul ((symmPart a0)⁻¹) (cubeAverageVec R actualDefect)) + (-matVecMul (matTranspose a0) + (matVecMul ((symmPart a0)⁻¹) (cubeAverageVec R actualDefect))) a := by + simpa [actualDefect, hdefectavg] using v + let D : Vec d := cubeAverageVec R actualDefect + have hlocalEnergy : + vecDot D (matVecMul a0⁻¹ D) ≤ + ((4 : ℝ) * normalizedBlockResponseMax R a a0) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + simpa [D, actualDefect, symmPart_eq_of_isSymm ha0symm, + matTranspose, Matrix.IsSymm] using + (cubeAverageFluxDefect_energyForm_le_normalizedBlockResponseMax_mul_energyAverage_of_scalarCanonicalMaximizer + (R := R) (a := a) (a0 := a0) hEll ha0 w hv') + have hnorm : + vecNormSq D ≤ matNorm a0 * vecDot D (matVecMul a0⁻¹ D) := + vecNormSq_le_matNorm_mul_vecDot_inv_of_isEllipticMatrix_of_isSymm ha0 ha0symm D + calc + vecNormSq (cubeAverageVec R defect) = vecNormSq D := by + simpa [D] using congrArg vecNormSq hdefectavg + _ ≤ matNorm a0 * vecDot D (matVecMul a0⁻¹ D) := hnorm + _ ≤ matNorm a0 * + (((4 : ℝ) * normalizedBlockResponseMax R a a0) * + cubeAverage R (scalarVariationEnergyIntegrand a w)) := by + exact mul_le_mul_of_nonneg_left hlocalEnergy (matNorm_nonneg a0) + _ = (((4 : ℝ) * matNorm a0 * normalizedBlockResponseMax R a a0) * + cubeAverage R (scalarVariationEnergyIntegrand a w)) := by + ring + _ = (((4 : ℝ) * matNorm a0 * normalizedBlockResponseMax R a a0) * + cubeAverage R energy) := by rw [henergyavg] + +/-- Direct descendant-average control for the actual flux defect of one +harmonic field on `cubeSet Q`. -/ +theorem cubeAverageFluxResponseControl_of_aHarmonicFunction {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (u : AHarmonicFunction a (cubeSet Q)) : + CubeAverageFluxResponseControl Q a a0 + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (scalarVariationEnergyIntegrand a u) := by + exact + cubeAverageFluxResponseControl_of_descendantScalarCanonicalFluxDefectData + (Q := Q) (a := a) (a0 := a0) + (defect := fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (energy := scalarVariationEnergyIntegrand a u) + ha0 ha0symm + (descendantScalarCanonicalFluxDefectData_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) hEll u) + +theorem cubeBesovNegativeVectorDepthAverage_le_fluxResponseEnergy {d : ℕ} + {Q : TriadicCube d} (a : CoeffField d) (a0 : Mat d) + (defect : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hresp : CubeAverageFluxResponseControl Q a a0 defect energy) + (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q defect j ≤ + ((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage Q energy := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R defect) ≤ + (((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage R energy) := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have havg_nonneg : 0 ≤ cubeAverage R energy := by + apply cubeAverage_nonneg_of_nonneg_on + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have hresp_le : + ((4 : ℝ) * matNorm a0 * normalizedBlockResponseMax R a a0) ≤ + ((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) := by + exact mul_le_mul_of_nonneg_left + (normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale a a0 hRscale) + (mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) (matNorm_nonneg a0)) + exact le_trans (hresp j R hR) <| + mul_le_mul_of_nonneg_right hresp_le havg_nonneg + have hdesc := + descendantsAverage_le_descendantsAverage Q j hpoint + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hconst : + descendantsAverage Q j (fun R => + (((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage R energy)) = + (((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + descendantsAverage Q j (fun R => cubeAverage R energy)) := by + let D := descendantsAtDepth Q j + let M := + ((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * + Finset.sum D (fun R => M * cubeAverage R energy) = + Finset.sum D (fun R => (((D.card : ℝ)⁻¹ * M) * cubeAverage R energy)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = (((D.card : ℝ)⁻¹ * M) * + Finset.sum D (fun R => cubeAverage R energy)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) (f := fun R => cubeAverage R energy) + (((D.card : ℝ)⁻¹) * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * Finset.sum D (fun R => cubeAverage R energy)) := by + ring + rw [hconst, havg_eq] at hdesc + simpa [cubeBesovNegativeVectorDepthAverage] using hdesc + +/-- Finite-depth `q = 1` deterministic coarse flux-response bound under an +explicit descendant-local one-cube response bound. -/ +theorem coarseFluxResponse_qone_partialSeminorm_le_of_cubeAverageFluxResponseControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) (defect : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hresp : CubeAverageFluxResponseControl Q a a0 defect energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (N : ℕ) : + cubeBesovNegativeVectorPartialSeminorm Q s N defect ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * Real.sqrt (cubeAverage Q energy)) := by + have hs1 : 0 < s * (1 : ℝ) := by + simpa using hs + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos hs1 + have hconst_nonneg : 0 ≤ ((4 : ℝ) * matNorm a0) := by + exact mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) (matNorm_nonneg a0) + let coeff : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + let C : ℝ := Real.sqrt (((4 : ℝ) * matNorm a0)) * Real.sqrt (cubeAverage Q energy) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s defect j ≤ coeff j * C := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_fluxResponseEnergy + (Q := Q) a a0 defect energy henergy_nonneg henergy_int hresp j + have hmax_nonneg : + 0 ≤ maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0 := by + exact maxDescendantNormalizedBlockResponseAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a a0 + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q defect j) ≤ + Real.sqrt + ((((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage Q energy)) := by + exact Real.sqrt_le_sqrt havg + calc + cubeBesovNegativeVectorDepthSeminorm Q s defect j = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q defect j) := by + rfl + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + ((((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage Q energy)) := by + exact mul_le_mul_of_nonneg_left hsqrt + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = coeff j * C := by + unfold coeff C + have hrewrite : + (((4 : ℝ) * matNorm a0 * + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0) * + cubeAverage Q energy) = + maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (j : ℤ)) a a0 * + ((((4 : ℝ) * matNorm a0)) * cubeAverage Q energy) := by + ring + rw [hrewrite] + rw [mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt hmax_nonneg] + rw [← scaleResponseAtScale_infinity_eq] + rw [Real.sqrt_mul hconst_nonneg] + have hsum_partial : + cubeBesovNegativeVectorPartialSeminorm Q s N defect ≤ + Finset.sum (Finset.range (N + 1)) coeff * C := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) (fun j => + cubeBesovNegativeVectorDepthSeminorm Q s defect j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + coeff j * C) := by + exact Finset.sum_le_sum hdepth + _ = Finset.sum (Finset.range (N + 1)) coeff * C := by + rw [Finset.sum_mul] + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + have hcoeff_eq : + Finset.sum (Finset.range (N + 1)) coeff = + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + scaleResponseAtScale Q (Q.scale - (j : ℤ)) .infinity a a0) := by + unfold coeff + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight hs j] + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + scaleResponseAtScale Q (Q.scale - (j : ℤ)) .infinity a a0) + ≤ ∑' n : ℕ, + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + have hC_nonneg : 0 ≤ C := by + unfold C + exact mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + calc + cubeBesovNegativeVectorPartialSeminorm Q s N defect ≤ + Finset.sum (Finset.range (N + 1)) coeff * C := + hsum_partial + _ = ((geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + scaleResponseAtScale Q (Q.scale - (j : ℤ)) .infinity a a0)) * C := by + rw [hcoeff_eq] + _ ≤ ((geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) * C := by + have hscaled : + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + scaleResponseAtScale Q (Q.scale - (j : ℤ)) .infinity a a0) + ≤ + (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0) := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled hC_nonneg + _ = (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + C := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + +/-- Note-normalized `q = 1` deterministic coarse flux-response inequality under +an explicit descendant-local one-cube response bound. -/ +theorem coarseFluxResponse_qone_of_cubeAverageFluxResponseControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) (defect : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hresp : CubeAverageFluxResponseControl Q a a0 defect energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminorm Q s defect ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * Real.sqrt (cubeAverage Q energy)) := by + exact + cubeBesovNegativeVectorSeminorm_le_of_partialBound Q s defect fun N => + coarseFluxResponse_qone_partialSeminorm_le_of_cubeAverageFluxResponseControl + (Q := Q) (a := a) (a0 := a0) (s := s) hs + (defect := defect) (energy := energy) + henergy_nonneg henergy_int hresp hsum N + +/-- Note-facing `q = 1` deterministic coarse flux-response inequality for the +actual defect field, packaged directly from descendant scalar canonical +maximizer data. -/ +theorem coarseFluxResponse_qone_of_descendantScalarCanonicalFluxDefectData {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) (defect : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + {lam0 Lam0 : ℝ} (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hdesc : DescendantScalarCanonicalFluxDefectData Q a a0 defect energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminorm Q s defect ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * Real.sqrt (cubeAverage Q energy)) := by + exact + coarseFluxResponse_qone_of_cubeAverageFluxResponseControl + (Q := Q) (a := a) (a0 := a0) (s := s) hs (defect := defect) (energy := energy) + henergy_nonneg henergy_int + (cubeAverageFluxResponseControl_of_descendantScalarCanonicalFluxDefectData + (Q := Q) (a := a) (a0 := a0) (defect := defect) (energy := energy) + ha0 ha0symm hdesc) + hsum + +/-- Note-facing `q = 1` deterministic coarse flux-response inequality for the +actual defect field of one harmonic function on `cubeSet Q`. -/ +theorem coarseFluxResponse_qone_of_descendantScalarCanonicalFluxDefectAHarmonicData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (u : AHarmonicFunction a (cubeSet Q)) + (hdesc : DescendantScalarCanonicalFluxDefectAHarmonicData Q a a0 u) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminorm Q s + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a u))) := by + let := isFiniteMeasureVolumeMeasureOnCubeSet Q + have henergy_nonneg : + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a u x := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u + have henergy_int : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) (cubeSet Q) + MeasureTheory.volume := by + exact ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u + exact + coarseFluxResponse_qone_of_descendantScalarCanonicalFluxDefectData + (Q := Q) (a := a) (a0 := a0) (s := s) hs + (defect := fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (energy := scalarVariationEnergyIntegrand a u) + henergy_nonneg henergy_int ha0 ha0symm + (descendantScalarCanonicalFluxDefectData_of_aHarmonicData + (Q := Q) (a := a) (a0 := a0) (u := u) hdesc) + hsum + +/-- Finite-depth `q = 1` deterministic coarse flux-response bound for the +actual defect field of one harmonic function on `cubeSet Q`, with no separate +descendant witness package. -/ +theorem coarseFluxResponse_qone_partialSeminorm_le_of_aHarmonicFunction + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (u : AHarmonicFunction a (cubeSet Q)) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (N : ℕ) : + cubeBesovNegativeVectorPartialSeminorm Q s N + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a u))) := by + let := isFiniteMeasureVolumeMeasureOnCubeSet Q + have henergy_nonneg : + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a u x := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u + have henergy_int : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) (cubeSet Q) + MeasureTheory.volume := by + exact ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u + exact + coarseFluxResponse_qone_partialSeminorm_le_of_cubeAverageFluxResponseControl + (Q := Q) (a := a) (a0 := a0) (s := s) hs + (defect := fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (energy := scalarVariationEnergyIntegrand a u) + henergy_nonneg henergy_int + (cubeAverageFluxResponseControl_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) hEll ha0 ha0symm u) + hsum N + +/-- Note-facing `q = 1` deterministic coarse flux-response inequality for the +actual defect field of one harmonic function on `cubeSet Q`, with no separate +descendant witness package. -/ +theorem coarseFluxResponse_qone_of_aHarmonicFunction + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 < s) {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (u : AHarmonicFunction a (cubeSet Q)) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + cubeBesovNegativeVectorSeminorm Q s + (fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a u))) := by + let := isFiniteMeasureVolumeMeasureOnCubeSet Q + have henergy_nonneg : + ∀ x ∈ cubeSet Q, 0 ≤ scalarVariationEnergyIntegrand a u x := + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u + have henergy_int : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a u) (cubeSet Q) + MeasureTheory.volume := by + exact ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u + exact + coarseFluxResponse_qone_of_cubeAverageFluxResponseControl + (Q := Q) (a := a) (a0 := a0) (s := s) hs + (defect := fun x => matVecMul (a x) (u.toH1.grad x) - matVecMul a0 (u.toH1.grad x)) + (energy := scalarVariationEnergyIntegrand a u) + henergy_nonneg henergy_int + (cubeAverageFluxResponseControl_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) hEll ha0 ha0symm u) + hsum + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare.lean new file mode 100644 index 0000000000..62526fe60a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo + +/-! +# Coarse-grained Poincare inequalities + +Compatibility wrapper for the split deterministic coarse Poincare development. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QOne.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QOne.lean new file mode 100644 index 0000000000..cc2db8332a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QOne.lean @@ -0,0 +1,504 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup + +/-! # QOne -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem cubeBesovNegativeVectorDepthAverage_le_gradientEnergy {d : ℕ} + {Q : TriadicCube d} (a : CoeffField d) (g : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q g j ≤ + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R g) ≤ + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have havg_nonneg : 0 ≤ cubeAverage R energy := by + apply cubeAverage_nonneg_of_nonneg_on + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + exact le_trans (hgrad j R hR) <| + mul_le_mul_of_nonneg_right + (coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale a hRscale) + havg_nonneg + have hdesc := + descendantsAverage_le_descendantsAverage Q j hpoint + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hconst : + descendantsAverage Q j (fun R => + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy) = + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + descendantsAverage Q j (fun R => cubeAverage R energy) := by + let D := descendantsAtDepth Q j + let M := maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * Finset.sum D (fun R => M * cubeAverage R energy) = + Finset.sum D (fun R => (((D.card : ℝ)⁻¹ * M) * cubeAverage R energy)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = (((D.card : ℝ)⁻¹ * M) * Finset.sum D (fun R => cubeAverage R energy)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) (f := fun R => cubeAverage R energy) + (((D.card : ℝ)⁻¹) * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * Finset.sum D (fun R => cubeAverage R energy)) := by + ring + rw [hconst, havg_eq] at hdesc + simpa [cubeBesovNegativeVectorDepthAverage] using hdesc + +theorem cubeBesovNegativeVectorDepthAverage_le_fluxEnergy {d : ℕ} + {Q : TriadicCube d} (a : CoeffField d) (flux : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q flux j ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy := by + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R flux) ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have havg_nonneg : 0 ≤ cubeAverage R energy := by + apply cubeAverage_nonneg_of_nonneg_on + intro x hx + exact henergy_nonneg x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + exact le_trans (hflux j R hR) <| + mul_le_mul_of_nonneg_right + (coarseBBlockNorm_le_maxDescendantBBlockNormAtScale a hRscale) + havg_nonneg + have hdesc := + descendantsAverage_le_descendantsAverage Q j hpoint + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hconst : + descendantsAverage Q j (fun R => + maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage R energy) = + maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + descendantsAverage Q j (fun R => cubeAverage R energy) := by + let D := descendantsAtDepth Q j + let M := maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * Finset.sum D (fun R => M * cubeAverage R energy) = + Finset.sum D (fun R => (((D.card : ℝ)⁻¹ * M) * cubeAverage R energy)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = (((D.card : ℝ)⁻¹ * M) * Finset.sum D (fun R => cubeAverage R energy)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) (f := fun R => cubeAverage R energy) + (((D.card : ℝ)⁻¹) * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * Finset.sum D (fun R => cubeAverage R energy)) := by + ring + rw [hconst, havg_eq] at hdesc + simpa [cubeBesovNegativeVectorDepthAverage] using hdesc + +theorem coarsePoincare_gradient_qone_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovNegativeVectorSeminorm Q s g ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos hs1 + have hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N g ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + intro N + let coeff : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s g j ≤ + coeff j * Real.sqrt (cubeAverage Q energy) := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_gradientEnergy + (Q := Q) a g energy henergy_nonneg henergy_int hgrad j + have hmax_nonneg : + 0 ≤ maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a := by + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j) ≤ + Real.sqrt + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact Real.sqrt_le_sqrt havg + calc + cubeBesovNegativeVectorDepthSeminorm Q s g j = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j) := by + rfl + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left hsqrt + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = coeff j * Real.sqrt (cubeAverage Q energy) := by + unfold coeff + rw [mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt hmax_nonneg] + have hsum_partial : + cubeBesovNegativeVectorPartialSeminorm Q s N g ≤ + Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) (fun j => + cubeBesovNegativeVectorDepthSeminorm Q s g j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + coeff j * Real.sqrt (cubeAverage Q energy)) := by + exact Finset.sum_le_sum hdepth + _ = Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + rw [Finset.sum_mul] + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + have hcoeff_eq : + Finset.sum (Finset.range (N + 1)) coeff = + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + unfold coeff + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight hs j] + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) + ≤ ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + calc + cubeBesovNegativeVectorPartialSeminorm Q s N g + ≤ Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := + hsum_partial + _ = (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + rw [hcoeff_eq] + _ ≤ (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + have hscaled : + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (j : ℤ)) a) (1 / 2 : ℝ)) + ≤ + (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled (Real.sqrt_nonneg _) + _ = (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + rw [multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q s a hs.le] + simpa using cubeBesovNegativeVectorSeminorm_le_of_partialBound Q s g hpartial + +theorem coarsePoincare_flux_qone_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (flux : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovNegativeVectorSeminorm Q s flux ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hdisc_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos hs1 + have hpartial : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + intro N + let coeff : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthSeminorm Q s flux j ≤ + coeff j * Real.sqrt (cubeAverage Q energy) := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_fluxEnergy + (Q := Q) a flux energy henergy_nonneg henergy_int hflux j + have hmax_nonneg : + 0 ≤ maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a := by + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j) ≤ + Real.sqrt + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact Real.sqrt_le_sqrt havg + calc + cubeBesovNegativeVectorDepthSeminorm Q s flux j = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j) := by + rfl + _ ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left hsqrt + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + _ = coeff j * Real.sqrt (cubeAverage Q energy) := by + unfold coeff + rw [mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt hmax_nonneg] + have hsum_partial : + cubeBesovNegativeVectorPartialSeminorm Q s N flux ≤ + Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) (fun j => + cubeBesovNegativeVectorDepthSeminorm Q s flux j) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + coeff j * Real.sqrt (cubeAverage Q energy)) := by + exact Finset.sum_le_sum hdepth + _ = Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := by + rw [Finset.sum_mul] + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + have hcoeff_eq : + Finset.sum (Finset.range (N + 1)) coeff = + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) := by + unfold coeff + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight hs j] + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) + ≤ ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + calc + cubeBesovNegativeVectorPartialSeminorm Q s N flux + ≤ Finset.sum (Finset.range (N + 1)) coeff * Real.sqrt (cubeAverage Q energy) := + hsum_partial + _ = (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + rw [hcoeff_eq] + _ ≤ (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) * + Real.sqrt (cubeAverage Q energy) := by + have hscaled : + (geometricDiscount s 1)⁻¹ * + Finset.sum (Finset.range (N + 1)) (fun j => + geometricWeight s 1 j * + Real.rpow (maxDescendantBBlockNormAtScale Q + (Q.scale - (j : ℤ)) a) (1 / 2 : ℝ)) + ≤ + (geometricDiscount s 1)⁻¹ * + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q + (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled (Real.sqrt_nonneg _) + _ = (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + rw [multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q s a hs.le] + simpa using cubeBesovNegativeVectorSeminorm_le_of_partialBound Q s flux hpartial + +/-- Note-facing `q = 1` gradient and flux coarse Poincare bounds under direct +descendant cube-average energy control. -/ +theorem coarsePoincare_qone_note_bounds_of_cubeAverageEnergyControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g flux : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum_grad : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) + (hsum_flux : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + cubeBesovNegativeVectorSeminorm Q s g ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) ∧ + cubeBesovNegativeVectorSeminorm Q s flux ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + refine ⟨?_, ?_⟩ + · exact + coarsePoincare_gradient_qone_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs (g := g) (energy := energy) + henergy_nonneg henergy_int hgrad hsum_grad + · exact + coarsePoincare_flux_qone_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs (flux := flux) (energy := energy) + henergy_nonneg henergy_int hflux hsum_flux + + +/-- Note-facing `q = 1` gradient and flux coarse Poincare bounds for one +harmonic field on the parent cube. -/ +theorem coarsePoincare_qone_note_bounds_of_aHarmonicFunction + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) : + cubeBesovNegativeVectorSeminorm Q s (fun x => u.toH1.grad x) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a u x)) ∧ + cubeBesovNegativeVectorSeminorm Q s (fun x => matVecMul (a x) (u.toH1.grad x)) ≤ + (geometricDiscount s 1)⁻¹ * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a u x)) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hsum_grad := + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) s hs hEll hOrigin + have hsum_flux := + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) s hs hEll hOrigin + exact + coarsePoincare_qone_note_bounds_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs + (g := fun x => u.toH1.grad x) + (flux := fun x => matVecMul (a x) (u.toH1.grad x)) + (energy := fun x => scalarVariationEnergyIntegrand a u x) + (scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u) + (ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u) + (cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEll u hOrigin) + (cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEll u hOrigin) + hsum_grad hsum_flux + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QTwo.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QTwo.lean new file mode 100644 index 0000000000..a59c411306 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/QTwo.lean @@ -0,0 +1,710 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QOne + +/-! # QTwo -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem rpow_neg_two_mul_s_nat_eq_inv_geometricDiscount_mul_geometricWeight_two + {s : ℝ} (hs : 0 < s) (j : ℕ) : + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) = + (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hdisc_ne : geometricDiscount s 2 ≠ 0 := (geometricDiscount_pos hs2).ne' + calc + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) = + (geometricDiscount s 2)⁻¹ * + (geometricDiscount s 2 * Real.rpow (3 : ℝ) (-2 * s * (j : ℝ))) := by + field_simp [hdisc_ne] + _ = (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + unfold geometricWeight + congr 1 + ring_nf + +theorem sq_coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N g) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hdisc_pos : 0 < geometricDiscount s 2 := geometricDiscount_pos hs2 + let coeff : ℕ → ℝ := fun n => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a + have hdepth_sq : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q s g j) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_gradientEnergy + (Q := Q) a g energy henergy_nonneg henergy_int hgrad j + have hdepth_nonneg : 0 ≤ cubeBesovNegativeVectorDepthAverage Q g j := + cubeBesovNegativeVectorDepthAverage_nonneg Q g j + have hweight_sq : + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) ((-s * (j : ℝ)) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by ring_nf + _ = (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + exact rpow_neg_two_mul_s_nat_eq_inv_geometricDiscount_mul_geometricWeight_two hs j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s g j) ^ 2 = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q g j := by + unfold cubeBesovNegativeVectorDepthSeminorm + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j)) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovNegativeVectorDepthAverage Q g j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q g j := by + rw [Real.sq_sqrt hdepth_nonneg] + _ ≤ (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg _) + _ = (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + rw [hweight_sq] + dsimp [coeff] + ring + have hcoeff_nonneg : ∀ n : ℕ, 0 ≤ coeff n := by + intro n + dsimp [coeff] + refine mul_nonneg (geometricWeight_nonneg n (by nlinarith [hs.le])) ?_ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hpartial_sq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N g) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (cubeBesovNegativeVectorDepthSeminorm Q s g j) ^ 2) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) := by + exact Finset.sum_le_sum hdepth_sq + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) + = + Finset.sum (Finset.range (N + 1)) (fun j => + ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * coeff j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * + Finset.sum (Finset.range (N + 1)) coeff := by + rw [Finset.mul_sum] + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) coeff ≤ ∑' n : ℕ, coeff n := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + have hcoeff_tsum : + ∑' n : ℕ, coeff n = (lambdaSq Q s (.finite 2) a)⁻¹ := by + dsimp [coeff] + calc + ∑' n : ℕ, + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a + = Real.rpow (lambdaSq Q s (.finite 2) a) (-1 : ℝ) := by + simpa using + (multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum + Q s (2 : ℝ) a (by norm_num) (by nlinarith [hs])).symm + _ = (lambdaSq Q s (.finite 2) a)⁻¹ := by + exact Real.rpow_neg_one (lambdaSq Q s (.finite 2) a) + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N g) ^ 2 + ≤ (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := hpartial_sq + _ ≤ (geometricDiscount s 2)⁻¹ * (∑' n : ℕ, coeff n) * cubeAverage Q energy := by + have hscaled : + (geometricDiscount s 2)⁻¹ * Finset.sum (Finset.range (N + 1)) coeff ≤ + (geometricDiscount s 2)⁻¹ * ∑' n : ℕ, coeff n := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled henergy_avg_nonneg + _ = (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + rw [hcoeff_tsum] + +theorem coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N g ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + let B : ℝ := + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + refine mul_nonneg (mul_nonneg ?_ ?_) (Real.sqrt_nonneg _) + · exact Real.rpow_nonneg (geometricDiscount_nonneg (by nlinarith [hs.le])) _ + · exact Real.rpow_nonneg hlambda_nonneg _ + have hB_sq : + B ^ 2 = + (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + dsimp [B] + calc + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) ^ 2 + = + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ)) ^ 2 * + (Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ)) ^ 2 * + (Real.sqrt (cubeAverage Q energy)) ^ 2 := by + ring + _ = (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + rw [sq_rpow_neg_half_eq_inv_of_nonneg + (geometricDiscount_nonneg (by nlinarith [hs.le])), + sq_rpow_neg_half_eq_inv_of_nonneg hlambda_nonneg, + Real.sq_sqrt henergy_avg_nonneg] + have hsq := + sq_coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs g energy N henergy_nonneg henergy_int hgrad hsum + rw [← hB_sq] at hsq + have hpartial_nonneg := cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N g + have habs : |cubeBesovNegativeVectorPartialSeminormTwo Q s N g| ≤ |B| := by + exact sq_le_sq.mp hsq + simpa [abs_of_nonneg hpartial_nonneg, abs_of_nonneg hB_nonneg] using! habs + +/-- Note-facing `q = 2` gradient coarse Poincare inequality under descendant +cube-average energy control. -/ +theorem coarsePoincare_gradient_qtwo_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) : + cubeBesovNegativeVectorSeminormTwo Q s g ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + exact cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s g <| + coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs g energy + (henergy_nonneg := henergy_nonneg) + (henergy_int := henergy_int) + (hgrad := hgrad) + (hsum := hsum) + +/-- Squared finite-depth `q = 2` flux coarse Poincare inequality under +descendant cube-average energy control. -/ +theorem sq_coarsePoincare_flux_qtwo_partial_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (flux : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hdisc_pos : 0 < geometricDiscount s 2 := geometricDiscount_pos hs2 + let coeff : ℕ → ℝ := fun n => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a + have hdepth_sq : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_fluxEnergy + (Q := Q) a flux energy henergy_nonneg henergy_int hflux j + have hdepth_nonneg : 0 ≤ cubeBesovNegativeVectorDepthAverage Q flux j := + cubeBesovNegativeVectorDepthAverage_nonneg Q flux j + have hweight_sq : + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) ((-s * (j : ℝ)) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by ring_nf + _ = (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + exact rpow_neg_two_mul_s_nat_eq_inv_geometricDiscount_mul_geometricWeight_two hs j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2 = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q flux j := by + unfold cubeBesovNegativeVectorDepthSeminorm + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j)) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q flux j := by + rw [Real.sq_sqrt hdepth_nonneg] + _ ≤ (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg _) + _ = (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + rw [hweight_sq] + dsimp [coeff] + ring + have hcoeff_nonneg : ∀ n : ℕ, 0 ≤ coeff n := by + intro n + dsimp [coeff] + refine mul_nonneg (geometricWeight_nonneg n (by nlinarith [hs.le])) ?_ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hpartial_sq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) := by + exact Finset.sum_le_sum hdepth_sq + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) + = + Finset.sum (Finset.range (N + 1)) (fun j => + ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * coeff j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * + Finset.sum (Finset.range (N + 1)) coeff := by + rw [Finset.mul_sum] + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) coeff ≤ ∑' n : ℕ, coeff n := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + have hcoeff_tsum : + ∑' n : ℕ, coeff n = LambdaSq Q s (.finite 2) a := by + dsimp [coeff] + calc + ∑' n : ℕ, + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a + = Real.rpow (LambdaSq Q s (.finite 2) a) (1 : ℝ) := by + simpa using + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum + Q s (2 : ℝ) a (by norm_num) (by nlinarith [hs])).symm + _ = LambdaSq Q s (.finite 2) a := by + exact Real.rpow_one (LambdaSq Q s (.finite 2) a) + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 + ≤ (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := hpartial_sq + _ ≤ (geometricDiscount s 2)⁻¹ * (∑' n : ℕ, coeff n) * + cubeAverage Q energy := by + have hscaled : + (geometricDiscount s 2)⁻¹ * Finset.sum (Finset.range (N + 1)) coeff ≤ + (geometricDiscount s 2)⁻¹ * ∑' n : ℕ, coeff n := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled henergy_avg_nonneg + _ = (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rw [hcoeff_tsum] + +/-- Note-facing `q = 2` finite-depth flux coarse Poincare inequality under +descendant cube-average energy control. -/ +theorem coarsePoincare_flux_qtwo_partial_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (flux : Vec d → Vec d) (energy : Vec d → ℝ) (N : ℕ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + let B : ℝ := + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + refine mul_nonneg (mul_nonneg ?_ ?_) (Real.sqrt_nonneg _) + · exact Real.rpow_nonneg (geometricDiscount_nonneg (by nlinarith [hs.le])) _ + · exact Real.rpow_nonneg hLambda_nonneg _ + have hB_sq : + B ^ 2 = + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + dsimp [B] + calc + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) ^ 2 + = + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ)) ^ 2 * + (Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ)) ^ 2 * + (Real.sqrt (cubeAverage Q energy)) ^ 2 := by + ring + _ = (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rw [sq_rpow_neg_half_eq_inv_of_nonneg + (geometricDiscount_nonneg (by nlinarith [hs.le])), + sq_rpow_half_eq_self_of_nonneg hLambda_nonneg, + Real.sq_sqrt henergy_avg_nonneg] + have hsq := + sq_coarsePoincare_flux_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs flux energy N henergy_nonneg henergy_int hflux hsum + rw [← hB_sq] at hsq + have hpartial_nonneg := cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N flux + have habs : |cubeBesovNegativeVectorPartialSeminormTwo Q s N flux| ≤ |B| := by + exact sq_le_sq.mp hsq + change cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ B + simpa [abs_of_nonneg hpartial_nonneg, abs_of_nonneg hB_nonneg] using habs + +/-- Note-facing `q = 2` flux coarse Poincare inequality under descendant +cube-average energy control. -/ +theorem coarsePoincare_flux_qtwo_of_cubeAverageEnergyControl {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (flux : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) : + cubeBesovNegativeVectorSeminormTwo Q s flux ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hdisc_pos : 0 < geometricDiscount s 2 := geometricDiscount_pos hs2 + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + let B : ℝ := + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + refine mul_nonneg (mul_nonneg ?_ ?_) (Real.sqrt_nonneg _) + · exact Real.rpow_nonneg (geometricDiscount_nonneg (by nlinarith [hs.le])) _ + · exact Real.rpow_nonneg hLambda_nonneg _ + have hB_sq : + B ^ 2 = + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + dsimp [B] + calc + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy)) ^ 2 + = + (Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ)) ^ 2 * + (Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ)) ^ 2 * + (Real.sqrt (cubeAverage Q energy)) ^ 2 := by + ring + _ = (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rw [sq_rpow_neg_half_eq_inv_of_nonneg + (geometricDiscount_nonneg (by nlinarith [hs.le])), + sq_rpow_half_eq_self_of_nonneg hLambda_nonneg, + Real.sq_sqrt henergy_avg_nonneg] + have hpartial : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N flux ≤ B := by + intro N + let coeff : ℕ → ℝ := fun n => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a + have hdepth_sq : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + intro j hj + have havg := + cubeBesovNegativeVectorDepthAverage_le_fluxEnergy + (Q := Q) a flux energy henergy_nonneg henergy_int hflux j + have hdepth_nonneg : 0 ≤ cubeBesovNegativeVectorDepthAverage Q flux j := + cubeBesovNegativeVectorDepthAverage_nonneg Q flux j + have hmax_nonneg : + 0 ≤ maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a := by + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le j)) a + have hweight_sq : + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) ((-s * (j : ℝ)) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by ring_nf + _ = (geometricDiscount s 2)⁻¹ * geometricWeight s 2 j := by + exact rpow_neg_two_mul_s_nat_eq_inv_geometricDiscount_mul_geometricWeight_two hs j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2 = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q flux j := by + unfold cubeBesovNegativeVectorDepthSeminorm + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j)) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovNegativeVectorDepthAverage Q flux j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q flux j := by + rw [Real.sq_sqrt hdepth_nonneg] + _ ≤ (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (maxDescendantBBlockNormAtScale Q (Q.scale - (j : ℤ)) a * + cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg _) + _ = (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy := by + rw [hweight_sq] + dsimp [coeff] + ring + have hcoeff_nonneg : ∀ n : ℕ, 0 ≤ coeff n := by + intro n + dsimp [coeff] + refine mul_nonneg (geometricWeight_nonneg n (by nlinarith [hs.le])) ?_ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hpartial_sq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (cubeBesovNegativeVectorDepthSeminorm Q s flux j) ^ 2) + ≤ Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) := by + exact Finset.sum_le_sum hdepth_sq + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + calc + Finset.sum (Finset.range (N + 1)) (fun j => + (geometricDiscount s 2)⁻¹ * coeff j * cubeAverage Q energy) + = + Finset.sum (Finset.range (N + 1)) (fun j => + ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * coeff j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = ((geometricDiscount s 2)⁻¹ * cubeAverage Q energy) * + Finset.sum (Finset.range (N + 1)) coeff := by + rw [Finset.mul_sum] + _ = (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := by + ring + have hfinite_le_tsum : + Finset.sum (Finset.range (N + 1)) coeff ≤ ∑' n : ℕ, coeff n := by + exact hsum.sum_le_tsum (Finset.range (N + 1)) (fun n _ => hcoeff_nonneg n) + have hcoeff_tsum : + ∑' n : ℕ, coeff n = LambdaSq Q s (.finite 2) a := by + dsimp [coeff] + calc + ∑' n : ℕ, + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a + = Real.rpow (LambdaSq Q s (.finite 2) a) (1 : ℝ) := by + simpa using + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum + Q s (2 : ℝ) a (by norm_num) (by nlinarith [hs])).symm + _ = LambdaSq Q s (.finite 2) a := by + exact Real.rpow_one (LambdaSq Q s (.finite 2) a) + have hbound_sq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N flux) ^ 2 + ≤ (geometricDiscount s 2)⁻¹ * + Finset.sum (Finset.range (N + 1)) coeff * + cubeAverage Q energy := hpartial_sq + _ ≤ (geometricDiscount s 2)⁻¹ * (∑' n : ℕ, coeff n) * cubeAverage Q energy := by + have hscaled : + (geometricDiscount s 2)⁻¹ * Finset.sum (Finset.range (N + 1)) coeff ≤ + (geometricDiscount s 2)⁻¹ * ∑' n : ℕ, coeff n := by + exact mul_le_mul_of_nonneg_left hfinite_le_tsum + (inv_nonneg.mpr hdisc_pos.le) + exact mul_le_mul_of_nonneg_right hscaled henergy_avg_nonneg + _ = (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rw [hcoeff_tsum] + rw [← hB_sq] at hbound_sq + have hpartial_nonneg := cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N flux + have habs : |cubeBesovNegativeVectorPartialSeminormTwo Q s N flux| ≤ |B| := by + exact sq_le_sq.mp hbound_sq + simpa [abs_of_nonneg hpartial_nonneg, abs_of_nonneg hB_nonneg] using habs + exact cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s flux hpartial + +/-- Note-facing `q = 2` gradient and flux coarse Poincare bounds under direct +descendant cube-average energy control. -/ +theorem coarsePoincare_qtwo_note_bounds_of_cubeAverageEnergyControl + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (g flux : Vec d → Vec d) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a g energy) + (hflux : CubeAverageFluxEnergyControl Q a flux energy) + (hsum_grad : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hsum_flux : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) : + cubeBesovNegativeVectorSeminormTwo Q s g ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) ∧ + cubeBesovNegativeVectorSeminormTwo Q s flux ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q energy) := by + refine ⟨?_, ?_⟩ + · exact + coarsePoincare_gradient_qtwo_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs (g := g) (energy := energy) + henergy_nonneg henergy_int hgrad hsum_grad + · exact + coarsePoincare_flux_qtwo_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs (flux := flux) (energy := energy) + henergy_nonneg henergy_int hflux hsum_flux + + +/-- Note-facing `q = 2` gradient and flux coarse Poincare bounds for one +harmonic field on the parent cube. -/ +theorem coarsePoincare_qtwo_note_bounds_of_aHarmonicFunction + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) : + cubeBesovNegativeVectorSeminormTwo Q s (fun x => u.toH1.grad x) ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (lambdaSq Q s (.finite 2) a) (-1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a u x)) ∧ + cubeBesovNegativeVectorSeminormTwo Q s (fun x => matVecMul (a x) (u.toH1.grad x)) ≤ + Real.rpow (geometricDiscount s 2) (-1 / 2 : ℝ) * + Real.rpow (LambdaSq Q s (.finite 2) a) (1 / 2 : ℝ) * + Real.sqrt (cubeAverage Q (fun x => scalarVariationEnergyIntegrand a u x)) := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hsum_grad := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) s hs hEll hOrigin + have hsum_flux := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) s hs hEll hOrigin + exact + coarsePoincare_qtwo_note_bounds_of_cubeAverageEnergyControl + (Q := Q) (a := a) (s := s) hs + (g := fun x => u.toH1.grad x) + (flux := fun x => matVecMul (a x) (u.toH1.grad x)) + (energy := fun x => scalarVariationEnergyIntegrand a u x) + (scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn (cubeSet Q) a hEll u) + (ResponseLinearIntegrabilityData.energy + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) u) + (cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEll u hOrigin) + (cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) hEll u hOrigin) + hsum_grad hsum_flux + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup.lean new file mode 100644 index 0000000000..5824a3a95b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.Conversions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.EnergyControls +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.HarmonicAndData + +/-! # Setup -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/Conversions.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/Conversions.lean new file mode 100644 index 0000000000..536de4ebb8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/Conversions.lean @@ -0,0 +1,196 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric + +/-! # Conversions -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-! +# Deterministic coarse-grained Poincare inequalities + +This file packages the first deterministic Chapter-3 `q = 1` Poincare step. + +At the current checkpoint we keep the one-cube energy estimate as an explicit +hypothesis on descendant cube averages. This isolates the honest downstream +multiscale summation argument while the fully note-faithful Chapter-2 +energy-averaging interface is still being stabilized upstream. +-/ + +/-- Descendant cube-average control for gradients by the local coarse +`σ_*^{-1}` block and a scalar energy density. -/ +def CubeAverageGradientEnergyControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (g : Vec d → Vec d) (energy : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R g) ≤ + coarseSigmaStarInvBlockNorm R a * cubeAverage R energy + +/-- Descendant cube-average control for fluxes by the local coarse `b` block +and a scalar energy density. -/ +def CubeAverageFluxEnergyControl {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (flux : Vec d → Vec d) (energy : Vec d → ℝ) : Prop := + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R flux) ≤ + coarseBBlockNorm R a * cubeAverage R energy + + +private theorem vecNormSq_single_one {d : ℕ} (i : Fin d) : + vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij + simp [Pi.single_eq_of_ne hij] + · simp + +private theorem basis_sub_pairing {d : ℕ} (M : Mat d) (i j : Fin d) : + vecDot (Pi.single i 1 - Pi.single j 1) + (matVecMul M (Pi.single i 1 - Pi.single j 1)) = + M i i - M i j - M j i + M j j := by + calc + vecDot (Pi.single i 1 - Pi.single j 1) + (matVecMul M (Pi.single i 1 - Pi.single j 1)) = + vecDot (Pi.single i 1 - Pi.single j 1) + (matVecMul M (Pi.single i 1) - matVecMul M (Pi.single j 1)) := by + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg] + _ = + vecDot (Pi.single i 1 - Pi.single j 1) (matVecMul M (Pi.single i 1)) - + vecDot (Pi.single i 1 - Pi.single j 1) (matVecMul M (Pi.single j 1)) := by + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] + _ = + (vecDot (Pi.single i 1) (matVecMul M (Pi.single i 1)) - + vecDot (Pi.single j 1) (matVecMul M (Pi.single i 1))) - + (vecDot (Pi.single i 1) (matVecMul M (Pi.single j 1)) - + vecDot (Pi.single j 1) (matVecMul M (Pi.single j 1))) := by + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + _ = M i i - M i j - M j i + M j j := by + simp [vecDot_single_left, matVecMul_single] + ring + +theorem responseJ_le_plainUpperBound_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q : Vec d) : + ResponseJ U p q a ≤ lam⁻¹ * (Lam ^ 2 * vecNormSq p + vecNormSq q) := by + unfold ResponseJ + refine csSup_le (responseJValueSet_nonempty U p q a) ?_ + rintro m ⟨u, rfl⟩ + refine volumeAverage_le_of_le_on (measurableSet_of_isEllipticFieldOn hEll) + (scalarResponseIntegrand_integrableOn_of_isEllipticFieldOn hEll p q u) hvol ?_ + exact scalarResponseIntegrand_le_plainUpperBound_of_isEllipticFieldOn hEll p q u + +theorem matNorm_le_two_mul_card_mul_of_posSemidef_of_quadratic_le + {d : ℕ} {A : Mat d} {C : ℝ} + (hPos : A.PosSemidef) (hC : 0 ≤ C) + (hquad : ∀ x : Vec d, vecDot x (matVecMul A x) ≤ C * vecNormSq x) : + matNorm A ≤ 2 * (Fintype.card (Fin d) : ℝ) * C := by + have hsymm : A.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hPos.isHermitian + have hentry : + ∀ i j : Fin d, |A i j| ≤ 2 * C := by + intro i j + by_cases hij : i = j + · subst j + have hdiag_nonneg : 0 ≤ A i i := by + simpa using hPos.diag_nonneg (i := i) + have hdiag_le : A i i ≤ C := by + have hsingle := hquad (Pi.single i 1 : Vec d) + simpa [vecNormSq_single_one, vecDot_single_left, matVecMul_single] using hsingle + have hdiag_abs : |A i i| ≤ 2 * C := by + refine abs_le.mpr ?_ + constructor <;> nlinarith + simpa using hdiag_abs + · have hii_nonneg : 0 ≤ A i i := by + simpa using hPos.diag_nonneg (i := i) + have hjj_nonneg : 0 ≤ A j j := by + simpa using hPos.diag_nonneg (i := j) + have hi : vecNormSq (Pi.single i 1 : Vec d) = 1 := vecNormSq_single_one i + have hj : vecNormSq (Pi.single j 1 : Vec d) = 1 := vecNormSq_single_one j + have hsum_pairing : + A i i + A i j + A j i + A j j ≤ 4 * C := by + have hsum := + hquad ((Pi.single i 1 : Vec d) + Pi.single j 1) + have hsum_norm : + vecNormSq ((Pi.single i 1 : Vec d) + Pi.single j 1) ≤ 4 := by + calc + vecNormSq ((Pi.single i 1 : Vec d) + Pi.single j 1) ≤ + 2 * + (vecNormSq (Pi.single i 1 : Vec d) + + vecNormSq (Pi.single j 1 : Vec d)) := by + exact vecNormSq_add_le _ _ + _ = 4 := by rw [hi, hj]; norm_num + rw [basis_sum_pairing] at hsum + nlinarith + have hsub_pairing : + A i i - A i j - A j i + A j j ≤ 4 * C := by + have hsub := + hquad ((Pi.single i 1 : Vec d) - Pi.single j 1) + have hsub_norm : + vecNormSq ((Pi.single i 1 : Vec d) - Pi.single j 1) ≤ 4 := by + calc + vecNormSq ((Pi.single i 1 : Vec d) - Pi.single j 1) = + vecNormSq ((Pi.single i 1 : Vec d) + (-1 : ℝ) • (Pi.single j 1 : Vec d)) := by + simp [sub_eq_add_neg] + _ ≤ + 2 * + (vecNormSq (Pi.single i 1 : Vec d) + + vecNormSq ((-1 : ℝ) • (Pi.single j 1 : Vec d))) := by + exact vecNormSq_add_le _ _ + _ = 4 := by + rw [hi, vecNormSq_smul, hj] + norm_num + rw [basis_sub_pairing] at hsub + nlinarith + have hupper : A i j ≤ 2 * C := by + rw [hsymm.apply i j] at hsum_pairing + nlinarith + have hlower : -2 * C ≤ A i j := by + rw [hsymm.apply i j] at hsub_pairing + nlinarith + exact abs_le.mpr ⟨by simpa using hlower, hupper⟩ + have hsq : + matNormSq A ≤ (2 * (Fintype.card (Fin d) : ℝ) * C) ^ 2 := by + unfold matNormSq + calc + ∑ i, ∑ j, A i j ^ 2 ≤ ∑ i, ∑ j, (2 * C) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i hi + refine Finset.sum_le_sum ?_ + intro j hj + have hij : |A i j| ≤ 2 * C := hentry i j + rcases abs_le.mp hij with ⟨hij_lo, hij_hi⟩ + nlinarith [sq_nonneg (A i j)] + _ = (Fintype.card (Fin d) : ℝ) * ((Fintype.card (Fin d) : ℝ) * (2 * C) ^ 2) := by + simp [Finset.sum_const, nsmul_eq_mul] + _ = (2 * (Fintype.card (Fin d) : ℝ) * C) ^ 2 := by + ring + have hrhs_nonneg : 0 ≤ 2 * (Fintype.card (Fin d) : ℝ) * C := by + positivity + unfold matNorm + exact (Real.sqrt_le_iff).2 ⟨hrhs_nonneg, hsq⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/EnergyControls.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/EnergyControls.lean new file mode 100644 index 0000000000..7a0ba52ef9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/EnergyControls.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.UniformBounds + +/-! # Energy Controls -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem abs_vecDot_matVecMul_le_matNorm_mul_vecNormSq {d : ℕ} (A : Mat d) (x : Vec d) : + |vecDot x (matVecMul A x)| ≤ matNorm A * vecNormSq x := by + have hsum : + vecDot x (matVecMul A x) = + ∑ z ∈ Finset.univ ×ˢ Finset.univ, A z.1 z.2 * (x z.1 * x z.2) := by + unfold vecDot matVecMul + calc + ∑ i, x i * ∑ j, A i j * x j = ∑ i, ∑ j, x i * (A i j * x j) := by + simp_rw [Finset.mul_sum] + _ = ∑ i, ∑ j, A i j * (x i * x j) := by + refine Finset.sum_congr rfl ?_ + intro i hi + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = ∑ z ∈ Finset.univ ×ˢ Finset.univ, A z.1 z.2 * (x z.1 * x z.2) := by + rw [← Finset.sum_product'] + have hcs : + (∑ z ∈ Finset.univ ×ˢ Finset.univ, A z.1 z.2 * (x z.1 * x z.2)) ^ 2 ≤ + (∑ z ∈ Finset.univ ×ˢ Finset.univ, (A z.1 z.2) ^ 2) * + (∑ z ∈ Finset.univ ×ˢ Finset.univ, (x z.1 * x z.2) ^ 2) := by + simpa using + (Finset.sum_mul_sq_le_sq_mul_sq + (s := Finset.univ ×ˢ Finset.univ) + (f := fun z : Fin d × Fin d => A z.1 z.2) + (g := fun z : Fin d × Fin d => x z.1 * x z.2)) + have hA_sq : + (∑ z ∈ Finset.univ ×ˢ Finset.univ, (A z.1 z.2) ^ 2) = matNormSq A := by + unfold matNormSq + rw [← Finset.sum_product'] + have hx_sq : + (∑ z ∈ Finset.univ ×ˢ Finset.univ, (x z.1 * x z.2) ^ 2) = + (vecNormSq x) ^ 2 := by + calc + ∑ z ∈ Finset.univ ×ˢ Finset.univ, (x z.1 * x z.2) ^ 2 + = ∑ i, ∑ j, (x i * x j) ^ 2 := by + symm + exact (Finset.sum_product' Finset.univ Finset.univ + (fun i j => (x i * x j) ^ 2)).symm + _ = ∑ i, x i ^ 2 * ∑ j, x j ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro i hi + calc + ∑ j, (x i * x j) ^ 2 = ∑ j, x i ^ 2 * x j ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = x i ^ 2 * ∑ j, x j ^ 2 := by + rw [Finset.mul_sum] + _ = (∑ i, x i ^ 2) * (∑ j, x j ^ 2) := by + simpa using (Finset.sum_mul Finset.univ (fun i => x i ^ 2) (∑ j, x j ^ 2)).symm + _ = (vecNormSq x) ^ 2 := by + simp [vecNormSq, vecDot, pow_two] + have hsq : + (vecDot x (matVecMul A x)) ^ 2 ≤ matNormSq A * (vecNormSq x) ^ 2 := by + rw [hsum] + rw [hA_sq, hx_sq] at hcs + exact hcs + have hrhs_nonneg : 0 ≤ matNorm A * vecNormSq x := by + exact mul_nonneg (matNorm_nonneg A) (vecNormSq_nonneg x) + have hsq_abs : + |vecDot x (matVecMul A x)| ^ 2 ≤ (matNorm A * vecNormSq x) ^ 2 := by + have hmul_sq : + (matNorm A * vecNormSq x) ^ 2 = matNormSq A * (vecNormSq x) ^ 2 := by + calc + (matNorm A * vecNormSq x) ^ 2 = (matNorm A) ^ 2 * (vecNormSq x) ^ 2 := by + ring + _ = matNormSq A * (vecNormSq x) ^ 2 := by + unfold matNorm + rw [Real.sq_sqrt (matNormSq_nonneg A)] + calc + |vecDot x (matVecMul A x)| ^ 2 = (vecDot x (matVecMul A x)) ^ 2 := by + rw [sq_abs] + _ ≤ matNormSq A * (vecNormSq x) ^ 2 := hsq + _ = (matNorm A * vecNormSq x) ^ 2 := by + exact hmul_sq.symm + simpa [abs_of_nonneg hrhs_nonneg] using (sq_le_sq.mp hsq_abs) + +theorem vecDot_matVecMul_le_matNorm_mul_vecNormSq_of_posSemidef {d : ℕ} {A : Mat d} + (hA : A.PosSemidef) (x : Vec d) : + vecDot x (matVecMul A x) ≤ matNorm A * vecNormSq x := by + have hnonneg : 0 ≤ vecDot x (matVecMul A x) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hA.dotProduct_mulVec_nonneg x + simpa [abs_of_nonneg hnonneg] using abs_vecDot_matVecMul_le_matNorm_mul_vecNormSq A x + +theorem vecNormSq_le_matNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse {d : ℕ} + {A B : Mat d} (hB : B.PosSemidef) + (hleftInv : ∀ ξ : Vec d, matVecMul B (matVecMul A ξ) = ξ) (ξ : Vec d) : + vecNormSq ξ ≤ matNorm B * vecDot ξ (matVecMul A ξ) := by + let η : Vec d := matVecMul A ξ + have hBsymm : B.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hB.1 + have hBnonneg : ∀ z : Vec d, 0 ≤ vecDot z (matVecMul B z) := by + intro z + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hB.dotProduct_mulVec_nonneg z + have hηeq : matVecMul B η = ξ := by + simpa [η] using hleftInv ξ + have hξη_nonneg : 0 ≤ vecDot ξ η := by + have := hBnonneg η + simpa [hηeq, vecDot_comm, η] using this + have hcs : + vecNormSq ξ ^ 2 ≤ vecDot ξ (matVecMul B ξ) * vecDot ξ η := by + have hraw := sq_vecDot_matVecMul_le_of_isSymm_of_nonneg hBsymm hBnonneg ξ η + simpa [vecNormSq, hηeq, vecDot_comm, η] using hraw + have hfirst : + vecDot ξ (matVecMul B ξ) ≤ matNorm B * vecNormSq ξ := + vecDot_matVecMul_le_matNorm_mul_vecNormSq_of_posSemidef hB ξ + have hmain : + vecNormSq ξ ^ 2 ≤ (matNorm B * vecNormSq ξ) * vecDot ξ η := by + exact le_trans hcs <| mul_le_mul_of_nonneg_right hfirst hξη_nonneg + by_cases hx : vecNormSq ξ = 0 + · rw [hx] + nlinarith [matNorm_nonneg B] + · have hx_pos : 0 < vecNormSq ξ := by + exact lt_of_le_of_ne (vecNormSq_nonneg ξ) (by simpa [eq_comm] using hx) + have hnorm_nonneg : 0 ≤ matNorm B := matNorm_nonneg B + nlinarith + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/HarmonicAndData.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/HarmonicAndData.lean new file mode 100644 index 0000000000..a56e31e3fa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/HarmonicAndData.lean @@ -0,0 +1,809 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.EnergyControls +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MultiscaleEllipticity.Basic + +/-! # Harmonic And Data -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem cubeAverageFlux_le_coarseBBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet R) a (deterministicCoarseBlockMatrix (openCubeSet R) a)) + (hS : IsSigmaStarCoarse (openCubeSet R) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet R) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet R) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) ≤ + coarseBBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + let : Fact (MeasureTheory.volume (cubeSet R) < ⊤) := by + refine ⟨?_⟩ + simpa using volume_cubeSet_lt_top R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet R)) + infer_instance + have hne : Set.Nonempty (cubeSet R) := by + refine ⟨cubeCenter R, openCubeSet_subset_cubeSet R ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R + have hSCube : IsSigmaStarCoarse (cubeSet R) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hS + have hKCube : IsKappaCoarse (cubeSet R) a sigmaStar kappa := + (isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hK + have hSigmaCube : IsSigmaCoarse (cubeSet R) a sigma sigmaStar kappa := + (isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hSigma + have hBCoarseEq : + bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) (kappaCoarse (cubeSet R) a) = + bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) := by + exact + bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) hS hK hSigma hdet + let hOpenR : IsOpenBoundedConvexDomain (openCubeSet R) := + isOpenBoundedConvexDomain_openCubeSet R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using hOpenR.isFiniteMeasure_restrict_volume + have hEllOpen : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + have hBdet : + IsUnit + (bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)).det := by + have hvolOpen : (MeasureTheory.volume (openCubeSet R)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos R).ne' + exact + isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := openCubeSet R) (a := a) hOpenR.isSobolevRegularDomain hEllOpen hvolOpen + hA hS hK hSigma hdet + have hBdetCube : + IsUnit + (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)).det := by + simpa [hBCoarseEq] using hBdet + have hv : + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))⁻¹ + (fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a) := by + exact + ScalarCanonicalMaximizer.nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := cubeSet R) (a := a) hne + (hodgeConverseCriterion_cubeSet_triadicCube R) hEll _ _ + rcases hv with ⟨v⟩ + let B := + bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) (kappaCoarse (cubeSet R) a) + let avgFlux : Vec d := + fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i) + have havg_eq : cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x)) = avgFlux := by + funext i + simp [avgFlux, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have henergy : + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + have hraw := + ScalarCanonicalMaximizer.energyAverageFluxCanonicalOfIsSigmaCoarse + (U := cubeSet R) (a := a) hEll hSCube hKCube hSigmaCube hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w v + simpa [avgFlux, B] using (show + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) from by + nlinarith [hraw]) + have hleftInv : + ∀ ξ : Vec d, matVecMul B (matVecMul B⁻¹ ξ) = ξ := by + intro ξ + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hBdetCube] + funext i + simp [matVecMul, Matrix.one_apply] + have hflux : + vecNormSq avgFlux ≤ matNorm B * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + exact vecNormSq_le_matNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := B⁻¹) (B := B) + (bCoarse_canonical_posSemidef_of_isSigmaCoarse (U := cubeSet R) (a := a) hSCube hKCube hSigmaCube hdet) + hleftInv avgFlux + have hB_eq_open : + bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) = + bCoarse sigma sigmaStar kappa := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + have hnorm_eq : matNorm B = coarseBBlockNorm R a := by + unfold coarseBBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hA hS hK hSigma hdet] + calc + matNorm B = + matNorm + (bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) := by + simpa [B] using congrArg matNorm hBCoarseEq + _ = matNorm (bCoarse sigma sigmaStar kappa) := by rw [hB_eq_open] + have henergy_eq : + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) = + cubeAverage R (scalarVariationEnergyIntegrand a w) := + volumeAverage_cubeSet_eq_cubeAverage R (scalarVariationEnergyIntegrand a w) + calc + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) = + vecNormSq avgFlux := by rw [havg_eq] + _ ≤ matNorm B * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := hflux + _ ≤ matNorm B * volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + exact mul_le_mul_of_nonneg_left henergy (matNorm_nonneg _) + _ = coarseBBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rw [hnorm_eq, henergy_eq] + +theorem cubeAverageFlux_le_matrixNorm_bCoarse_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet R) a (deterministicCoarseBlockMatrix (openCubeSet R) a)) + (hS : IsSigmaStarCoarse (openCubeSet R) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet R) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet R) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) ≤ + Book.Ch02.matrixNorm + (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + let : Fact (MeasureTheory.volume (cubeSet R) < ⊤) := by + refine ⟨?_⟩ + simpa using volume_cubeSet_lt_top R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet R)) + infer_instance + have hne : Set.Nonempty (cubeSet R) := by + refine ⟨cubeCenter R, openCubeSet_subset_cubeSet R ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R + have hSCube : IsSigmaStarCoarse (cubeSet R) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hS + have hKCube : IsKappaCoarse (cubeSet R) a sigmaStar kappa := + (isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hK + have hSigmaCube : IsSigmaCoarse (cubeSet R) a sigma sigmaStar kappa := + (isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hSigma + have hBCoarseEq : + bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) (kappaCoarse (cubeSet R) a) = + bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) := by + exact + bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) hS hK hSigma hdet + let hOpenR : IsOpenBoundedConvexDomain (openCubeSet R) := + isOpenBoundedConvexDomain_openCubeSet R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using hOpenR.isFiniteMeasure_restrict_volume + have hEllOpen : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + have hBdet : + IsUnit + (bCoarse (sigmaCoarse (openCubeSet R) a) (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)).det := by + have hvolOpen : (MeasureTheory.volume (openCubeSet R)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos R).ne' + exact + isUnit_det_bCoarse_canonical_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := openCubeSet R) (a := a) hOpenR.isSobolevRegularDomain hEllOpen hvolOpen + hA hS hK hSigma hdet + have hBdetCube : + IsUnit + (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)).det := by + simpa [hBCoarseEq] using hBdet + have hv : + Nonempty + (ScalarCanonicalMaximizer (cubeSet R) + (-matVecMul (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))⁻¹ + (fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i))) + 0 a) := by + exact + ScalarCanonicalMaximizer.nonempty_of_hodgeConverseCriterion_of_isEllipticFieldOn + (U := cubeSet R) (a := a) hne + (hodgeConverseCriterion_cubeSet_triadicCube R) hEll _ _ + rcases hv with ⟨v⟩ + let B := + bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) (kappaCoarse (cubeSet R) a) + let avgFlux : Vec d := + fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i) + have havg_eq : cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x)) = avgFlux := by + funext i + simp [avgFlux, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have henergy : + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + have hraw := + ScalarCanonicalMaximizer.energyAverageFluxCanonicalOfIsSigmaCoarse + (U := cubeSet R) (a := a) hEll hSCube hKCube hSigmaCube hdet + (ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll) w v + simpa [avgFlux, B] using (show + vecDot avgFlux (matVecMul B⁻¹ avgFlux) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) from by + nlinarith [hraw]) + have hleftInv : + ∀ ξ : Vec d, matVecMul B (matVecMul B⁻¹ ξ) = ξ := by + intro ξ + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hBdetCube] + funext i + simp [matVecMul, Matrix.one_apply] + have hflux : + vecNormSq avgFlux ≤ + Book.Ch02.matrixNorm B * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := by + exact Book.Ch02.vecNormSq_le_matrixNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := B⁻¹) (B := B) + (bCoarse_canonical_posSemidef_of_isSigmaCoarse (U := cubeSet R) (a := a) hSCube hKCube hSigmaCube hdet) + hleftInv avgFlux + have henergy_eq : + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) = + cubeAverage R (scalarVariationEnergyIntegrand a w) := + volumeAverage_cubeSet_eq_cubeAverage R (scalarVariationEnergyIntegrand a w) + calc + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) = + vecNormSq avgFlux := by rw [havg_eq] + _ ≤ Book.Ch02.matrixNorm B * vecDot avgFlux (matVecMul B⁻¹ avgFlux) := hflux + _ ≤ Book.Ch02.matrixNorm B * volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + exact mul_le_mul_of_nonneg_left henergy (Book.Ch02.matrixNorm_nonneg B) + _ = + Book.Ch02.matrixNorm + (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rw [henergy_eq] + +/-- +Flux coarse-square estimate with the deterministic open-cube coarse witnesses +packaged as `OpenCubeDeterministicCoarseData`. +-/ +theorem cubeAverageFlux_le_coarseBBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) ≤ + coarseBBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + cubeAverageFlux_le_coarseBBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEll hA hS hK hSigma hdet w + +theorem cubeAverageFlux_le_matrixNorm_bCoarse_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x))) ≤ + Book.Ch02.matrixNorm + (bCoarse (sigmaCoarse (cubeSet R) a) (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + cubeAverageFlux_le_matrixNorm_bCoarse_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEll hA hS hK hSigma hdet w + +theorem cubeAverageGradient_le_coarseSigmaStarInvBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix (openCubeSet R) a (deterministicCoarseBlockMatrix (openCubeSet R) a)) + (hS : IsSigmaStarCoarse (openCubeSet R) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet R) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet R) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) ≤ + coarseSigmaStarInvBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + let hInt : ResponseLinearIntegrabilityData (cubeSet R) a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hvol : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hSCube : IsSigmaStarCoarse (cubeSet R) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hS + have hKCube : IsKappaCoarse (cubeSet R) a sigmaStar kappa := + (isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hK + have hSigmaCube : IsSigmaCoarse (cubeSet R) a sigma sigmaStar kappa := + (isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hSigma + let avgGrad : Vec d := fun i => volumeAverage (cubeSet R) (fun x => w.toH1.grad x i) + let qbar : Vec d := matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad + have havg_eq : cubeAverageVec R (fun x => w.toH1.grad x) = avgGrad := by + funext i + simp [avgGrad, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have hpairing : + volumeAverage (cubeSet R) (fun x => vecDot qbar (w.toH1.grad x)) = + vecDot qbar avgGrad := by + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + (cubeSet R) a 0 qbar hInt w + have hzero_left : + volumeAverage (cubeSet R) + (fun x => vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x))) = 0 := by + rw [show (fun x => vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x))) = fun _ => (0 : ℝ) by + funext x + rw [vecDot] + simp] + exact volumeAverage_zero (cubeSet R) + have hzero_right : + vecDot (0 : Vec d) + (fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i)) = 0 := by + rw [vecDot] + simp + nlinarith [hpair, hzero_left, hzero_right] + have henergyInt : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) (cubeSet R) + MeasureTheory.volume := + ResponseLinearIntegrabilityData.energy hInt w + have hgradInt : + MeasureTheory.IntegrableOn (fun x => vecDot qbar (w.toH1.grad x)) (cubeSet R) + MeasureTheory.volume := + hInt.grad qbar w + have hresp_le : + volumeAverage (cubeSet R) (scalarResponseIntegrand (cubeSet R) a 0 qbar w) ≤ + ResponseJ (cubeSet R) 0 qbar a := by + exact + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEll hvol 0 qbar (responseJValueSet_mem (cubeSet R) 0 qbar a w) + have hresp_lhs : + volumeAverage (cubeSet R) (scalarResponseIntegrand (cubeSet R) a 0 qbar w) = + (-(1 / 2 : ℝ)) * volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) + + vecDot qbar avgGrad := by + have hdecomp : + scalarResponseIntegrand (cubeSet R) a 0 qbar w = + (((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a w) + + fun x => vecDot qbar (w.toH1.grad x)) := by + funext x + unfold scalarResponseIntegrand scalarVariationEnergyIntegrand + rw [show vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x)) = 0 by + rw [vecDot] + simp] + simp [Pi.smul_apply] + rw [hdecomp, volumeAverage_add] + · rw [volumeAverage_smul, hpairing] + · simpa [MeasureTheory.IntegrableOn] using + (henergyInt.integrable.smul (-(1 / 2 : ℝ))) + · exact hgradInt + have hleftInv : + ∀ ξ : Vec d, + matVecMul (sigmaStarInvCoarse (cubeSet R) a) + (matVecMul (sigmaStarCoarse (cubeSet R) a) ξ) = ξ := by + intro ξ + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCube, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSCube hdet, matVecMul_mul, + Matrix.nonsing_inv_mul sigmaStar hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hqbar : + matVecMul (sigmaStarInvCoarse (cubeSet R) a) qbar = avgGrad := by + simpa [qbar] using hleftInv avgGrad + have hresp_rhs : + ResponseJ (cubeSet R) 0 qbar a = + (1 / 2 : ℝ) * vecDot avgGrad + (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + have hresp := + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + (cubeSet R) a hSCube hKCube hSigmaCube hdet 0 qbar + calc + ResponseJ (cubeSet R) 0 qbar a = + (1 / 2 : ℝ) * vecDot qbar + (matVecMul (sigmaStarInvCoarse (cubeSet R) a) qbar) := by + simpa [qbar, vecDot, matVecMul] + using hresp + _ = (1 / 2 : ℝ) * vecDot qbar avgGrad := by rw [hqbar] + _ = (1 / 2 : ℝ) * vecDot avgGrad + (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + simp [qbar, vecDot_comm] + have henergy : + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + rw [hresp_lhs, hresp_rhs] at hresp_le + have hpairing' : + vecDot qbar avgGrad = + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + simp [qbar, vecDot_comm] + rw [hpairing'] at hresp_le + nlinarith + have hgrad : + vecNormSq avgGrad ≤ + matNorm (sigmaStarInvCoarse (cubeSet R) a) * + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + exact vecNormSq_le_matNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := sigmaStarCoarse (cubeSet R) a) (B := sigmaStarInvCoarse (cubeSet R) a) + (sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := cubeSet R) (a := a) hSCube) + hleftInv avgGrad + have hcanonRsig : sigmaStar⁻¹ = sigmaStarInvCoarse (cubeSet R) a := by + calc + sigmaStar⁻¹ = sigmaStarInvCoarse (openCubeSet R) a := by + symm + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + _ = sigmaStarInvCoarse (cubeSet R) a := by + symm + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := a) hS] + have hnorm_eq : + matNorm (sigmaStarInvCoarse (cubeSet R) a) = coarseSigmaStarInvBlockNorm R a := by + unfold coarseSigmaStarInvBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix hA hS hK hSigma hdet, + hcanonRsig] + have henergy_eq : + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) = + cubeAverage R (scalarVariationEnergyIntegrand a w) := + volumeAverage_cubeSet_eq_cubeAverage R (scalarVariationEnergyIntegrand a w) + calc + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) = vecNormSq avgGrad := by + rw [havg_eq] + _ ≤ + matNorm (sigmaStarInvCoarse (cubeSet R) a) * + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := hgrad + _ ≤ + matNorm (sigmaStarInvCoarse (cubeSet R) a) * + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + exact mul_le_mul_of_nonneg_left henergy (matNorm_nonneg _) + _ = coarseSigmaStarInvBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rw [hnorm_eq, henergy_eq] + +theorem cubeAverageGradient_le_matrixNorm_sigmaStarInv_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + {sigma sigmaStar kappa : Mat d} + (_hA : IsCoarseBlockMatrix (openCubeSet R) a (deterministicCoarseBlockMatrix (openCubeSet R) a)) + (hS : IsSigmaStarCoarse (openCubeSet R) a sigmaStar) + (hK : IsKappaCoarse (openCubeSet R) a sigmaStar kappa) + (hSigma : IsSigmaCoarse (openCubeSet R) a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) ≤ + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + let hInt : ResponseLinearIntegrabilityData (cubeSet R) a := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hvol : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hSCube : IsSigmaStarCoarse (cubeSet R) a sigmaStar := + (isSigmaStarCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hS + have hKCube : IsKappaCoarse (cubeSet R) a sigmaStar kappa := + (isKappaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hK + have hSigmaCube : IsSigmaCoarse (cubeSet R) a sigma sigmaStar kappa := + (isSigmaCoarse_cubeSet_iff_openCubeSet_of_triadicCube (Q := R)).2 hSigma + let avgGrad : Vec d := fun i => volumeAverage (cubeSet R) (fun x => w.toH1.grad x i) + let qbar : Vec d := matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad + have havg_eq : cubeAverageVec R (fun x => w.toH1.grad x) = avgGrad := by + funext i + simp [avgGrad, cubeAverageVec, volumeAverage_cubeSet_eq_cubeAverage] + have hpairing : + volumeAverage (cubeSet R) (fun x => vecDot qbar (w.toH1.grad x)) = + vecDot qbar avgGrad := by + have hpair := + basic_cg_identities_average_pairing_eq_vecDot_average_gradient_sub_average_flux + (cubeSet R) a 0 qbar hInt w + have hzero_left : + volumeAverage (cubeSet R) + (fun x => vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x))) = 0 := by + rw [show (fun x => vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x))) = fun _ => (0 : ℝ) by + funext x + rw [vecDot] + simp] + exact volumeAverage_zero (cubeSet R) + have hzero_right : + vecDot (0 : Vec d) + (fun i => volumeAverage (cubeSet R) (fun x => matVecMul (a x) (w.toH1.grad x) i)) = 0 := by + rw [vecDot] + simp + nlinarith [hpair, hzero_left, hzero_right] + have henergyInt : + MeasureTheory.IntegrableOn (scalarVariationEnergyIntegrand a w) (cubeSet R) + MeasureTheory.volume := + ResponseLinearIntegrabilityData.energy hInt w + have hgradInt : + MeasureTheory.IntegrableOn (fun x => vecDot qbar (w.toH1.grad x)) (cubeSet R) + MeasureTheory.volume := + hInt.grad qbar w + have hresp_le : + volumeAverage (cubeSet R) (scalarResponseIntegrand (cubeSet R) a 0 qbar w) ≤ + ResponseJ (cubeSet R) 0 qbar a := by + exact + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEll hvol 0 qbar (responseJValueSet_mem (cubeSet R) 0 qbar a w) + have hresp_lhs : + volumeAverage (cubeSet R) (scalarResponseIntegrand (cubeSet R) a 0 qbar w) = + (-(1 / 2 : ℝ)) * volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) + + vecDot qbar avgGrad := by + have hdecomp : + scalarResponseIntegrand (cubeSet R) a 0 qbar w = + (((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a w) + + fun x => vecDot qbar (w.toH1.grad x)) := by + funext x + unfold scalarResponseIntegrand scalarVariationEnergyIntegrand + rw [show vecDot (0 : Vec d) (matVecMul (a x) (w.toH1.grad x)) = 0 by + rw [vecDot] + simp] + simp [Pi.smul_apply] + rw [hdecomp, volumeAverage_add] + · rw [volumeAverage_smul, hpairing] + · simpa [MeasureTheory.IntegrableOn] using + (henergyInt.integrable.smul (-(1 / 2 : ℝ))) + · exact hgradInt + have hleftInv : + ∀ ξ : Vec d, + matVecMul (sigmaStarInvCoarse (cubeSet R) a) + (matVecMul (sigmaStarCoarse (cubeSet R) a) ξ) = ξ := by + intro ξ + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCube, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSCube hdet, matVecMul_mul, + Matrix.nonsing_inv_mul sigmaStar hdet] + funext i + simp [matVecMul, Matrix.one_apply] + have hqbar : + matVecMul (sigmaStarInvCoarse (cubeSet R) a) qbar = avgGrad := by + simpa [qbar] using hleftInv avgGrad + have hresp_rhs : + ResponseJ (cubeSet R) 0 qbar a = + (1 / 2 : ℝ) * vecDot avgGrad + (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + have hresp := + basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + (cubeSet R) a hSCube hKCube hSigmaCube hdet 0 qbar + calc + ResponseJ (cubeSet R) 0 qbar a = + (1 / 2 : ℝ) * vecDot qbar + (matVecMul (sigmaStarInvCoarse (cubeSet R) a) qbar) := by + simpa [qbar, vecDot, matVecMul] + using hresp + _ = (1 / 2 : ℝ) * vecDot qbar avgGrad := by rw [hqbar] + _ = (1 / 2 : ℝ) * vecDot avgGrad + (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + simp [qbar, vecDot_comm] + have henergy : + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) ≤ + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + rw [hresp_lhs, hresp_rhs] at hresp_le + have hpairing' : + vecDot qbar avgGrad = + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + simp [qbar, vecDot_comm] + rw [hpairing'] at hresp_le + nlinarith + have hgrad : + vecNormSq avgGrad ≤ + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := by + exact Book.Ch02.vecNormSq_le_matrixNorm_mul_vecDot_matVecMul_of_posSemidef_of_leftInverse + (A := sigmaStarCoarse (cubeSet R) a) (B := sigmaStarInvCoarse (cubeSet R) a) + (sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := cubeSet R) (a := a) hSCube) + hleftInv avgGrad + have henergy_eq : + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) = + cubeAverage R (scalarVariationEnergyIntegrand a w) := + volumeAverage_cubeSet_eq_cubeAverage R (scalarVariationEnergyIntegrand a w) + calc + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) = vecNormSq avgGrad := by + rw [havg_eq] + _ ≤ + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + vecDot avgGrad (matVecMul (sigmaStarCoarse (cubeSet R) a) avgGrad) := hgrad + _ ≤ + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + volumeAverage (cubeSet R) (scalarVariationEnergyIntegrand a w) := by + exact mul_le_mul_of_nonneg_left henergy + (Book.Ch02.matrixNorm_nonneg (sigmaStarInvCoarse (cubeSet R) a)) + _ = + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rw [henergy_eq] + +/-- +Gradient coarse-square estimate with the deterministic open-cube coarse +witnesses packaged as `OpenCubeDeterministicCoarseData`. +-/ +theorem cubeAverageGradient_le_coarseSigmaStarInvBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) ≤ + coarseSigmaStarInvBlockNorm R a * cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + cubeAverageGradient_le_coarseSigmaStarInvBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEll hA hS hK hSigma hdet w + +theorem cubeAverageGradient_le_matrixNorm_sigmaStarInv_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) + (w : AHarmonicFunction a (cubeSet R)) : + vecNormSq (cubeAverageVec R (fun x => w.toH1.grad x)) ≤ + Book.Ch02.matrixNorm (sigmaStarInvCoarse (cubeSet R) a) * + cubeAverage R (scalarVariationEnergyIntegrand a w) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact + cubeAverageGradient_le_matrixNorm_sigmaStarInv_mul_energyAverage_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEll hA hS hK hSigma hdet w + +theorem cubeAverageGradientEnergyControl_of_aHarmonicFunction {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + CubeAverageGradientEnergyControl Q a + (fun x => u.toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a u x) := by + intro j R hR + have hEllR : + IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hj : Q.scale - (j : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hj] + simpa using hR + have hDataR : OpenCubeDeterministicCoarseData R a := hData _ hj R hRscale + let w : AHarmonicFunction a (cubeSet R) := u.restrictToSubcube hEll hR + have hlocal := + cubeAverageGradient_le_coarseSigmaStarInvBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + (R := R) (a := a) hEllR hDataR w + have henergy_eq : + cubeAverage R (scalarVariationEnergyIntegrand a w) = + cubeAverage R + (fun x => vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simp [w, scalarVariationEnergyIntegrand] + rw [henergy_eq] at hlocal + simpa [w] using! hlocal + +theorem cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + CubeAverageGradientEnergyControl Q a + (fun x => u.toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a u x) := by + exact + cubeAverageGradientEnergyControl_of_aHarmonicFunction + (Q := Q) (a := a) hEll u + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + CubeAverageGradientEnergyControl Q a + (fun x => u.toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a u x) := by + exact + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) hEll u + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem mem_descendantsAtScale_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + have hj : Q.scale - (j : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le j) + rw [descendantsAtScale_eq_descendantsAtDepth Q hj] + simpa using hR + +theorem cubeAverageFluxEnergyControl_of_aHarmonicFunction + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (u.toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a u x) := by + intro j R hR + have hEllR : + IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hj : Q.scale - (j : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le j) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + exact mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hDataR : OpenCubeDeterministicCoarseData R a := hData _ hj R hRscale + let w : AHarmonicFunction a (cubeSet R) := u.restrictToSubcube hEll hR + have hlocal := + cubeAverageFlux_le_coarseBBlockNorm_mul_energyAverage_of_isEllipticFieldOn_of_deterministicCoarseData + (R := R) (a := a) hEllR hDataR w + have hflux_eq : + cubeAverageVec R (fun x => matVecMul (a x) (w.toH1.grad x)) = + cubeAverageVec R (fun x => matVecMul (a x) (u.toH1.grad x)) := by + apply cubeAverageVec_eq_of_eq_on_cubeSet + intro x hx + simp [w] + have henergy_eq : + cubeAverage R (scalarVariationEnergyIntegrand a w) = + cubeAverage R + (fun x => vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simp [w, scalarVariationEnergyIntegrand] + rw [hflux_eq, henergy_eq] at hlocal + simpa [scalarVariationEnergyIntegrand] using hlocal + +theorem cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (u.toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a u x) := by + exact + cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := Q) (a := a) hEll u + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (u : AHarmonicFunction a (cubeSet Q)) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (u.toH1.grad x)) + (fun x => scalarVariationEnergyIntegrand a u x) := by + exact + cubeAverageFluxEnergyControl_of_aHarmonicFunction_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) hEll u + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + + +theorem rpow_neg_s_nat_eq_inv_geometricDiscount_mul_geometricWeight + {s : ℝ} (hs : 0 < s) (j : ℕ) : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) = + (geometricDiscount s 1)⁻¹ * geometricWeight s 1 j := by + have hs1 : 0 < s * (1 : ℝ) := by simpa using hs + have hdisc_ne : geometricDiscount s 1 ≠ 0 := (geometricDiscount_pos hs1).ne' + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) = + ((geometricDiscount s 1)⁻¹ * geometricDiscount s 1) * + Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + rw [inv_mul_cancel₀ hdisc_ne, one_mul] + _ = (geometricDiscount s 1)⁻¹ * + (geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * (j : ℝ))) := by + ring + _ = (geometricDiscount s 1)⁻¹ * geometricWeight s 1 j := by + rw [geometricWeight_one_eq] + +theorem mul_sqrt_mul_eq_mul_rpow_half_mul_sqrt {a b c : ℝ} + (ha : 0 ≤ a) : + c * Real.sqrt (a * b) = c * Real.rpow a (1 / 2 : ℝ) * Real.sqrt b := by + rw [Real.sqrt_mul ha, Real.sqrt_eq_rpow] + ring_nf + ac_rfl + + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/UniformBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/UniformBounds.lean new file mode 100644 index 0000000000..eac8c11fea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincare/Setup/UniformBounds.lean @@ -0,0 +1,596 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.Conversions + +/-! # Uniform Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + + +private theorem coarseBBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) : + coarseBBlockNorm R a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + let U := openCubeSet R + let hOpenR : IsOpenBoundedConvexDomain U := isOpenBoundedConvexDomain_openCubeSet R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hOpenR.isFiniteMeasure_restrict_volume + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := by + simpa [U, volume_openCubeSet_toReal] using (cubeVolume_pos R).ne' + have hlam_pos : 0 < lam := by + exact (hEllOpen.2 (cubeCenter R) (by + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R)).1 + let B := bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a) + have hBpos : B.PosSemidef := + bCoarse_canonical_posSemidef_of_isSigmaCoarse (U := U) (a := a) hS hK hSigma hdet + have hBquad : + ∀ p : Vec d, vecDot p (matVecMul B p) ≤ + (2 * lam⁻¹ * Lam ^ 2) * vecNormSq p := by + intro p + have hresp : + ResponseJ U p 0 a ≤ lam⁻¹ * Lam ^ 2 * vecNormSq p := by + have hresp0 := + responseJ_le_plainUpperBound_of_isEllipticFieldOn + (U := U) (a := a) hEllOpen hvol p (0 : Vec d) + have hzero : vecNormSq (0 : Vec d) = 0 := by + simp [vecNormSq, vecDot] + simpa [hzero, mul_assoc] using hresp0 + have hformula : + ResponseJ U p 0 a = (1 / 2 : ℝ) * vecDot p (matVecMul B p) := by + simpa [B] using + basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + U a hS hK hSigma hdet p + rw [hformula] at hresp + nlinarith + have hBnorm : + matNorm B ≤ 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 := by + have hCnonneg : 0 ≤ 2 * lam⁻¹ * Lam ^ 2 := by + positivity + convert + (matNorm_le_two_mul_card_mul_of_posSemidef_of_quadratic_le hBpos hCnonneg hBquad) using 1 + ring + have hB_eq : B = bCoarse sigma sigmaStar kappa := by + dsimp [B] + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + have hnorm_eq : coarseBBlockNorm R a = matNorm B := by + unfold coarseBBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hA hS hK hSigma hdet, + ← hB_eq] + rw [hnorm_eq] + exact hBnorm + +private theorem coarseSigmaStarInvBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + {d : ℕ} [NeZero d] (R : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet R) a) + (hData : OpenCubeDeterministicCoarseData R a) : + coarseSigmaStarInvBlockNorm R a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + let U := openCubeSet R + let hOpenR : IsOpenBoundedConvexDomain U := isOpenBoundedConvexDomain_openCubeSet R + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hOpenR.isFiniteMeasure_restrict_volume + have hvol : (MeasureTheory.volume U).toReal ≠ 0 := by + simpa [U, volume_openCubeSet_toReal] using (cubeVolume_pos R).ne' + have hlam_pos : 0 < lam := by + exact (hEllOpen.2 (cubeCenter R) (by + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R)).1 + let SInv := sigmaStarInvCoarse U a + have hSInvPos : SInv.PosSemidef := + sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := U) (a := a) hS + have hSInvQuad : + ∀ q : Vec d, vecDot q (matVecMul SInv q) ≤ + (2 * lam⁻¹) * vecNormSq q := by + intro q + have hresp : + ResponseJ U 0 q a ≤ lam⁻¹ * vecNormSq q := by + have hresp0 := + responseJ_le_plainUpperBound_of_isEllipticFieldOn + (U := U) (a := a) hEllOpen hvol (0 : Vec d) q + have hzero : vecNormSq (0 : Vec d) = 0 := by + simp [vecNormSq, vecDot] + simpa [hzero, mul_assoc] using hresp0 + have hformula : + ResponseJ U 0 q a = (1 / 2 : ℝ) * vecDot q (matVecMul SInv q) := by + have hInv : + IsSigmaStarInvCoarse U a SInv := by + exact isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨sigmaStar⁻¹, isSigmaStarInvCoarse_of_isSigmaStarCoarse hS⟩ + simpa [SInv] using hInv.2 q + rw [hformula] at hresp + nlinarith + have hSInvNorm : + matNorm SInv ≤ 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ := by + have hCnonneg : 0 ≤ 2 * lam⁻¹ := by + positivity + convert + (matNorm_le_two_mul_card_mul_of_posSemidef_of_quadratic_le + hSInvPos hCnonneg hSInvQuad) using 1 + ring + have hcanonRsig : sigmaStar⁻¹ = SInv := by + dsimp [SInv] + symm + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + have hnorm_eq : coarseSigmaStarInvBlockNorm R a = matNorm SInv := by + unfold coarseSigmaStarInvBlockNorm SInv + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix hA hS hK hSigma hdet, + hcanonRsig] + rw [hnorm_eq] + exact hSInvNorm + +theorem maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (n : ℕ) : + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 := by + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + unfold maxDescendantBBlockNormAtScale finsetSsup + have hne : + ((fun R => coarseBBlockNorm R a) '' + (↑(descendantsAtScale Q (Q.scale - (n : ℤ))) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseBBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtScale hk hR) + have hEllOpenR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEllR.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + exact + coarseBBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEllOpenR (hData _ hk R hR) + +theorem maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (n : ℕ) : + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ := by + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hne : + ((fun R => coarseSigmaStarInvBlockNorm R a) '' + (↑(descendantsAtScale Q (Q.scale - (n : ℤ))) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtScale hk hR) + have hEllOpenR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEllR.mono (measurableSet_openCubeSet R) (openCubeSet_subset_cubeSet R) + exact + coarseSigmaStarInvBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEllOpenR (hData _ hk R hR) + +theorem maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (n : ℕ) : + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 := by + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + unfold maxDescendantBBlockNormAtScale finsetSsup + have hne : + ((fun R => coarseBBlockNorm R a) '' + (↑(descendantsAtScale Q (Q.scale - (n : ℤ))) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseBBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hEllR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + exact + coarseBBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEllR (hData _ hk R hR) + +theorem maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (n : ℕ) : + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a ≤ + 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ := by + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hne : + ((fun R => coarseSigmaStarInvBlockNorm R a) '' + (↑(descendantsAtScale Q (Q.scale - (n : ℤ))) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hEllR : IsEllipticFieldOn lam Lam (openCubeSet R) a := + hEll.mono (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + exact + coarseSigmaStarInvBlockNorm_le_uniform_of_isEllipticFieldOn_of_openCubeDeterministicCoarseData + (R := R) (a := a) hEllR (hData _ hk R hR) + +theorem summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 + refine summable_geometricWeight_mul_of_nonneg_of_le + (C := Real.rpow C (1 / 2 : ℝ)) (by simpa using hs) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + · intro n + have hbound : + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := + maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n + refine Real.rpow_le_rpow ?_ hbound ?_ + · exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · positivity + +theorem summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ + refine summable_geometricWeight_mul_of_nonneg_of_le + (C := Real.rpow C (1 / 2 : ℝ)) (by simpa using hs) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + · intro n + have hbound : + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := + maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n + refine Real.rpow_le_rpow ?_ hbound ?_ + · exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · positivity + +theorem + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 + refine summable_geometricWeight_mul_of_nonneg_of_le + (C := Real.rpow C (1 / 2 : ℝ)) (by simpa using hs) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + · intro n + have hbound : + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := + maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n + refine Real.rpow_le_rpow ?_ hbound ?_ + · exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · positivity + +theorem + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ + refine summable_geometricWeight_mul_of_nonneg_of_le + (C := Real.rpow C (1 / 2 : ℝ)) (by simpa using hs) ?_ ?_ + · intro n + exact Real.rpow_nonneg + (maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) _ + · intro n + have hbound : + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a ≤ C := + maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n + refine Real.rpow_le_rpow ?_ hbound ?_ + · exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · positivity + +theorem summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ * Lam ^ 2 + refine summable_geometricWeight_mul_of_nonneg_of_le (C := C) (by positivity) ?_ ?_ + · intro n + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · intro n + exact + (maxDescendantBBlockNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n) + +theorem summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) := by + let C : ℝ := 4 * (Fintype.card (Fin d) : ℝ) * lam⁻¹ + refine summable_geometricWeight_mul_of_nonneg_of_le (C := C) (by positivity) ?_ ?_ + · intro n + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + · intro n + exact + (maxDescendantSigmaStarInvNormAtScale_le_uniform_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) hEll hData n) + +theorem + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_openCubeSet_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_qone_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_openCubeSet_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_openCubeSet_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) := by + exact + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) := by + exact + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hRec : OpenCubeDescendantEllipticRecoveryFamily Q a (lam := lam) (Lam := Lam)) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) := by + exact + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) s hs hEll + (openCubeDescendantDeterministicCoarseData_of_recoveryFamily hRec) + +theorem + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam) : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) := by + exact + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantEllipticRecoveryFamily + (Q := Q) (a := a) s hs hEll + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + +theorem cubeAverage_nonneg_of_nonneg_on {d : ℕ} {Q : TriadicCube d} {f : Vec d → ℝ} + (hf : ∀ x ∈ cubeSet Q, 0 ≤ f x) : + 0 ≤ cubeAverage Q f := by + unfold cubeAverage + refine mul_nonneg ?_ ?_ + · exact inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q)) + · apply MeasureTheory.integral_nonneg_of_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => hf x hx + +theorem volumeAverage_cubeSet_eq_cubeAverage {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) : + volumeAverage (cubeSet Q) f = cubeAverage Q f := by + calc + volumeAverage (cubeSet Q) f + = (cubeVolume Q)⁻¹ * ∫ x in cubeSet Q, f x ∂MeasureTheory.volume := by + unfold volumeAverage + rw [volume_cubeSet_toReal] + _ = cubeAverage Q f := rfl + +theorem cubeAverage_eq_of_eq_on_cubeSet {d : ℕ} {Q : TriadicCube d} {f g : Vec d → ℝ} + (hfg : ∀ x ∈ cubeSet Q, f x = g x) : + cubeAverage Q f = cubeAverage Q g := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine MeasureTheory.integral_congr_ae ?_ + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => hfg x hx + +theorem cubeAverageVec_eq_of_eq_on_cubeSet {d : ℕ} {Q : TriadicCube d} + {f g : Vec d → Vec d} (hfg : ∀ x ∈ cubeSet Q, f x = g x) : + cubeAverageVec Q f = cubeAverageVec Q g := by + funext i + exact cubeAverage_eq_of_eq_on_cubeSet fun x hx => congrArg (fun v => v i) (hfg x hx) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS.lean new file mode 100644 index 0000000000..2a1e23a411 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Correctors + +/-! +# Coarse Poincare with right-hand side + +Foundational wrapper for the local zero-trace RHS corrector package. +The recurrence and note-facing theorem files live under +`Homogenization/Deterministic/CoarsePoincareRHS/` and are re-exported by +`CoarsePoincareRHSLocalRecurrence.lean` until the Caccioppoli bridge import can be +retargeted without creating an import cycle. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AbsorbedErrors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AbsorbedErrors.lean new file mode 100644 index 0000000000..f6088949b4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AbsorbedErrors.lean @@ -0,0 +1,125 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalBaseBounds + +/-! # Absorbed Errors -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + + +theorem coarsePoincareRHSDepthWeight_mul_intrinsicWeightedLocalizedEnergyForceErrorSum_eq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) (s θ CE CF : ℝ) (B : ℕ → ℝ) (m N : ℕ) : + coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N = + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N := by + unfold coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + rw [← mul_assoc, + coarsePoincareRHSDepthWeight_mul_theta_pow_eq_scaledStepCoeff_mul s θ m k] + ring + +theorem coarsePoincareRHSIntrinsicAbsorbedLocalError_eq_components + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) : + coarsePoincareRHSIntrinsicAbsorbedLocalError Q a g u s η = + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicLocalEnergyError Q a u s + + coarsePoincareRHSAbsorbedRnCoeff η * + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicLocalForceError Q a g s := by + let A : ℝ := coarsePoincareRHSIntrinsicLocalEnergyError Q a u s + let K : ℝ := coarsePoincareRHSIntrinsicLocalForceMultiplier Q a s + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g) + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + change + A + η * U ^ 2 + + η * ((1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2))) + + 2 * η⁻¹ * ((K * G) ^ 2) = + (1 + η * (1 - η)⁻¹) * A + + (η + η ^ 2 * (1 - η)⁻¹) * U ^ 2 + + (2 * η * (1 - η)⁻¹ * η⁻¹ + 2 * η⁻¹) * ((K * G) ^ 2) + ring + +theorem coarsePoincareRHSIntrinsicAbsorbedErrorAverage_eq_componentAverages + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) : + coarsePoincareRHSIntrinsicAbsorbedErrorAverage Q a g u s η n = + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedRnCoeff η * + coarsePoincareRHSRn Q s u n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + let A : TriadicCube d → ℝ := fun R => coarsePoincareRHSIntrinsicLocalEnergyError R a u s + let U : TriadicCube d → ℝ := fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 + let F : TriadicCube d → ℝ := fun R => coarsePoincareRHSIntrinsicLocalForceError R a g s + let cA : ℝ := coarsePoincareRHSAbsorbedEnergyCoeff η + let cU : ℝ := coarsePoincareRHSAbsorbedRnCoeff η + let cF : ℝ := coarsePoincareRHSAbsorbedForceCoeff η + have hpoint : + (fun R : TriadicCube d => coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) = + fun R => cA * A R + cU * U R + cF * F R := by + funext R + simp [A, U, F, cA, cU, cF, + coarsePoincareRHSIntrinsicAbsorbedLocalError_eq_components R a g u s η, add_assoc] + calc + coarsePoincareRHSIntrinsicAbsorbedErrorAverage Q a g u s η n + = descendantsAverage Q n (fun R => cA * A R + cU * U R + cF * F R) := by + simp [coarsePoincareRHSIntrinsicAbsorbedErrorAverage, hpoint] + _ = + cA * descendantsAverage Q n A + + cU * descendantsAverage Q n U + + cF * descendantsAverage Q n F := by + rw [descendantsAverage_add Q n (fun R => cA * A R + cU * U R) + (fun R => cF * F R)] + rw [descendantsAverage_add Q n (fun R => cA * A R) (fun R => cU * U R)] + rw [← descendantsAverage_smul Q n cA A] + rw [← descendantsAverage_smul Q n cU U] + rw [← descendantsAverage_smul Q n cF F] + _ = + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedRnCoeff η * + coarsePoincareRHSRn Q s u n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + simp [A, U, F, cA, cU, cF, coarsePoincareRHSIntrinsicEnergyErrorAverage, + coarsePoincareRHSRn, coarsePoincareRHSIntrinsicForceErrorAverage] + + +theorem coarsePoincareRHSRn_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (n : ℕ) : + 0 ≤ coarsePoincareRHSRn Q s u n := by + unfold coarsePoincareRHSRn + exact descendantsAverage_nonneg Q n _ + fun R hR => sq_nonneg (cubeBesovNegativeVectorSeminormTwo R s u) + +theorem coarsePoincareRHSSn_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (n : ℕ) : + 0 ≤ coarsePoincareRHSSn Q s u n := by + unfold coarsePoincareRHSSn coarsePoincareRHSDepthWeight + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (coarsePoincareRHSRn_nonneg Q s u n) + + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal.lean new file mode 100644 index 0000000000..044f85243d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.DescendantsAverage +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.ComponentBoundsBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.LocalizedEnergyForce + +/-! # Averaged Local -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/ComponentBoundsBasic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/ComponentBoundsBasic.lean new file mode 100644 index 0000000000..fd07d39607 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/ComponentBoundsBasic.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.DescendantsAverage + +/-! # Component Bounds Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSRn_le_discount_next_add_intrinsicAbsorbedErrorAverage_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSIntrinsicAbsorbedErrorAverage Q a g u s η n := by + have hlocal' : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2) + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η := by + intro R hR + simpa [coarsePoincareRHSDiscount, coarsePoincareRHSRn] using hlocal R hR + simpa [coarsePoincareRHSDiscount, coarsePoincareRHSRn, + coarsePoincareRHSIntrinsicAbsorbedErrorAverage] using + descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_error_of_localBound + Q s u n (fun R => coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + hlocal' + +theorem coarsePoincareRHSRn_le_intrinsicComponentErrors_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + (coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedRnCoeff η * + coarsePoincareRHSRn Q s u n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n) := by + have hmain := + coarsePoincareRHSRn_le_discount_next_add_intrinsicAbsorbedErrorAverage_of_localBound + Q a g u s η n hlocal + calc + coarsePoincareRHSRn Q s u n + ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSIntrinsicAbsorbedErrorAverage Q a g u s η n := hmain + _ = + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + (coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedRnCoeff η * + coarsePoincareRHSRn Q s u n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n) := by + rw [coarsePoincareRHSIntrinsicAbsorbedErrorAverage_eq_componentAverages] + +theorem coarsePoincareRHSRn_intrinsicAbsorptionReady_le_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + (1 - coarsePoincareRHSAbsorbedRnCoeff η) * + coarsePoincareRHSRn Q s u n ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + have hsplit := + coarsePoincareRHSRn_le_intrinsicComponentErrors_of_localBound + Q a g u s η n hlocal + linarith + +theorem coarsePoincareRHSRn_le_invAbsorptionCoeff_mul_intrinsicErrors_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + (coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n) := by + let B : ℝ := + coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n + have hready : + (1 - coarsePoincareRHSAbsorbedRnCoeff η) * + coarsePoincareRHSRn Q s u n ≤ B := by + simpa [B, add_assoc] using + coarsePoincareRHSRn_intrinsicAbsorptionReady_le_of_localBound + Q a g u s η n hlocal + exact (le_inv_mul_iff₀ habs).mpr hready + +theorem coarsePoincareRHSRn_le_intrinsicComponentBounds_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s η : ℝ) (n : ℕ) + {θ CE CF : ℝ} + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hnext_nonneg : 0 ≤ coarsePoincareRHSRn Q s u (n + 1)) + (hE_nonneg : 0 ≤ coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n) + (hF_nonneg : 0 ≤ coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + CF * coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + have hbase := + coarsePoincareRHSRn_le_invAbsorptionCoeff_mul_intrinsicErrors_of_localBound + Q a g u s η n habs hlocal + calc + coarsePoincareRHSRn Q s u n + ≤ + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + (coarsePoincareRHSDiscount s * coarsePoincareRHSRn Q s u (n + 1) + + coarsePoincareRHSAbsorbedEnergyCoeff η * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + coarsePoincareRHSAbsorbedForceCoeff η * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n) := hbase + _ = + ((1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s) * + coarsePoincareRHSRn Q s u (n + 1) + + ((1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η) * + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + ((1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η) * + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + ring + _ ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + CF * coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + exact + add_le_add + (add_le_add + (mul_le_mul_of_nonneg_right hθ hnext_nonneg) + (mul_le_mul_of_nonneg_right hEcoeff hE_nonneg)) + (mul_le_mul_of_nonneg_right hFcoeff hF_nonneg) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/DescendantsAverage.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/DescendantsAverage.lean new file mode 100644 index 0000000000..61ba7f3017 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/DescendantsAverage.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms + +/-! # Descendants Average -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_error_of_localBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (j : ℕ) (E : TriadicCube d → ℝ) + (hlocal : + ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2) + + E R) : + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q (j + 1) + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) + + descendantsAverage Q j E := by + have havg : + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) ≤ + descendantsAverage Q j + (fun R => + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2) + + E R) := by + exact descendantsAverage_le_descendantsAverage Q j (fun R hR => hlocal R hR) + calc + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) + ≤ + descendantsAverage Q j + (fun R => + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2) + + E R) := havg + _ = + descendantsAverage Q j + (fun R => + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2)) + + descendantsAverage Q j E := by + rw [descendantsAverage_add Q j + (fun R => + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2)) + E] + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q (j + 1) + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) + + descendantsAverage Q j E := by + rw [descendantsAverage_smul Q j (Real.rpow (3 : ℝ) (-2 * s)) + (fun R => + descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorSeminormTwo S s u) ^ 2))] + rw [← descendantsAverage_add_eq_descendantsAverage_descendantsAverage + (Q := Q) (j := j) (n := 1) + (F := fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2)] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/LocalizedEnergyForce.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/LocalizedEnergyForce.lean new file mode 100644 index 0000000000..87cdf20854 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/AveragedLocal/LocalizedEnergyForce.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.ComponentBoundsBasic + +/-! # Localized Energy Force -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + + +theorem coarsePoincareRHSRn_le_intrinsicLocalizedEnergyForce_of_localBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η : ℝ} (n : ℕ) + {θ CE CF B : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hforceAvg : + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u)) + + CF * ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * B) := by + have hE_nonneg : + 0 ≤ coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n := by + unfold coarsePoincareRHSIntrinsicEnergyErrorAverage + exact descendantsAverage_nonneg Q n _ fun R hR => by + unfold coarsePoincareRHSIntrinsicLocalEnergyError + exact mul_nonneg + (mul_nonneg (by norm_num) (coarsePoincareRHSLocalCoeff_nonneg R a hs)) + (havg_nonneg R hR) + have hbase := + coarsePoincareRHSRn_le_intrinsicComponentBounds_of_localBound + Q a g u s η n habs hθ hEcoeff hFcoeff + (coarsePoincareRHSRn_nonneg Q s u (n + 1)) + hE_nonneg + (coarsePoincareRHSIntrinsicForceErrorAverage_nonneg Q a g s n) + hlocal + have hE := + coarsePoincareRHSIntrinsicEnergyErrorAverage_le_parentHalfCoeff_globalAverage + (Q := Q) (a := a) (u := u) (s := s) (lam := lam) (Lam := Lam) n + hs hEll hData hsum_half havg_nonneg hint + have hF := + coarsePoincareRHSIntrinsicForceErrorAverage_le_parentHalfLambda_of_centeredForceAverageBound + (Q := Q) (a := a) (g := g) (s := s) (lam := lam) (Lam := Lam) n + hs hEll hData hsum_half hforceAvg + calc + coarsePoincareRHSRn Q s u n + ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n + + CF * coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := hbase + _ ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u)) + + CF * ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * B) := by + exact + add_le_add + (add_le_add le_rfl (mul_le_mul_of_nonneg_left hE hCE_nonneg)) + (mul_le_mul_of_nonneg_left hF hCF_nonneg) + +theorem coarsePoincareRHSRn_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η : ℝ} (n : ℕ) + {θ CE CF B : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hforceAvg : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ B) + (hlocal : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) : + coarsePoincareRHSRn Q s u n ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u)) + + CF * ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * B) := by + have hforceCentered : + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B := by + rw [descendantsAverage_sq_coarsePoincareRHSLocalCenteredForceSeminorm_eq_of_mem + Q g s n hmem] + exact hforceAvg + exact + coarsePoincareRHSRn_le_intrinsicLocalizedEnergyForce_of_localBound + Q a g u n hs hEll hData hsum_half habs hθ hEcoeff hFcoeff + hCE_nonneg hCF_nonneg havg_nonneg hint hforceCentered hlocal + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Compatibility.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Compatibility.lean new file mode 100644 index 0000000000..4951e93056 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Compatibility.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems + +/-! # Compatibility -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Constants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Constants.lean new file mode 100644 index 0000000000..2324afe4d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Constants.lean @@ -0,0 +1,136 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence + +/-! # Constants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Coefficient prefactor in the local absorbed RHS error. -/ +noncomputable def coarsePoincareRHSLocalCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) : ℝ := + (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + +/-- Intrinsic local energy piece in the absorbed RHS error. -/ +noncomputable def coarsePoincareRHSIntrinsicLocalEnergyError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) (s : ℝ) : ℝ := + 2 * coarsePoincareRHSLocalCoeff Q a s * cubeAverage Q (coefficientEnergyDensity a u) + +/-- Intrinsic local forcing multiplier in the absorbed RHS error. + +The uniform ellipticity lower bound is intentionally absent: quantitative +dependence runs through `lambdaSq`, while `IsEllipticFieldOn` only supplies +well-posedness and nonnegativity hypotheses. -/ +noncomputable def coarsePoincareRHSIntrinsicLocalForceMultiplier {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) : ℝ := + coarsePoincareRHSLocalCoeff Q a s * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + +/-- Centered local forcing seminorm in the absorbed RHS error. -/ +noncomputable def coarsePoincareRHSLocalCenteredForceSeminorm {d : ℕ} + (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) : ℝ := + cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + +/-- The global positive-Besov forcing bound localized to descendants of depth `n`. -/ +noncomputable def coarsePoincareRHSGlobalForceBound {d : ℕ} + (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) : ℝ := + ((Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2)⁻¹ * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + +/-- Intrinsic local forcing piece in the absorbed RHS error. -/ +noncomputable def coarsePoincareRHSIntrinsicLocalForceError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) (s : ℝ) : ℝ := + (coarsePoincareRHSIntrinsicLocalForceMultiplier Q a s * + coarsePoincareRHSLocalCenteredForceSeminorm Q g s) ^ 2 + +/-- Intrinsic local non-child error produced by the absorbed RHS one-cube recurrence. -/ +noncomputable def coarsePoincareRHSIntrinsicAbsorbedLocalError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u : Vec d → Vec d) + (s η : ℝ) : ℝ := + let A : ℝ := coarsePoincareRHSIntrinsicLocalEnergyError Q a u s + let K : ℝ := coarsePoincareRHSIntrinsicLocalForceMultiplier Q a s + let G : ℝ := coarsePoincareRHSLocalCenteredForceSeminorm Q g s + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + A + η * U ^ 2 + + η * ((1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2))) + + 2 * η⁻¹ * ((K * G) ^ 2) + +/-- Parent half-scale coefficient used after localizing `lambda_{s,2}^{-1}`. -/ +noncomputable def coarsePoincareRHSParentHalfCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : ℝ := + (geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + +/-- Intrinsic parent half-scale forcing multiplier used after localizing `lambda_{s,2}^{-1}`. -/ +noncomputable def coarsePoincareRHSIntrinsicParentHalfForceMultiplier {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : ℝ := + coarsePoincareRHSParentHalfCoeff Q a s n * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + +/-- Coefficient of the local energy average after expanding the absorbed error. -/ +noncomputable def coarsePoincareRHSAbsorbedEnergyCoeff (η : ℝ) : ℝ := + 1 + η * (1 - η)⁻¹ + +/-- Coefficient of the current `R_n` term after expanding the absorbed error. -/ +noncomputable def coarsePoincareRHSAbsorbedRnCoeff (η : ℝ) : ℝ := + η + η ^ 2 * (1 - η)⁻¹ + +/-- Coefficient of the local forcing average after expanding the absorbed error. -/ +noncomputable def coarsePoincareRHSAbsorbedForceCoeff (η : ℝ) : ℝ := + 2 * η * (1 - η)⁻¹ * η⁻¹ + 2 * η⁻¹ + +/-- Absorption parameter that makes the scaled recurrence use the note-step +ratio exactly. -/ +noncomputable def coarsePoincareRHSNoteEta (s : ℝ) : ℝ := + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + (1 - r) / (2 - r) + +/-- Exact energy envelope after inserting `coarsePoincareRHSNoteEta`. -/ +noncomputable def coarsePoincareRHSNoteEnergyEnvelope (s : ℝ) : ℝ := + (1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s))⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff (coarsePoincareRHSNoteEta s) + +/-- Exact forcing envelope after inserting `coarsePoincareRHSNoteEta`. -/ +noncomputable def coarsePoincareRHSNoteForceEnvelope (s : ℝ) : ℝ := + (1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s))⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff (coarsePoincareRHSNoteEta s) + +/-- The fixed one-step discount in the current natural-depth `R_n` recurrence. -/ +noncomputable def coarsePoincareRHSDiscount (s : ℝ) : ℝ := + Real.rpow (3 : ℝ) (-2 * s) + +/-- The one-step discount after the note-style scaling from `R_n` to `S_n`. -/ +noncomputable def coarsePoincareRHSStepDiscount (s : ℝ) : ℝ := + Real.rpow (3 : ℝ) (-s) + +/-- Abstract one-step coefficient after passing from `R_n` to the scaled `S_n`. -/ +noncomputable def coarsePoincareRHSScaledStepCoeff (s θ : ℝ) : ℝ := + θ * Real.rpow (3 : ℝ) s + +/-- The note-facing one-step coefficient `3^{-3s/2}` for the `R_n` recurrence. -/ +noncomputable def coarsePoincareRHSNoteStepCoeff (s : ℝ) : ℝ := + Real.rpow (3 : ℝ) (-(3 * s / 2)) + +/-- Ratio governing the localized energy coefficient sums after inserting parent `q = 2` bounds. -/ +noncomputable def coarsePoincareRHSFiniteSumRatio (s θ : ℝ) : ℝ := + coarsePoincareRHSScaledStepCoeff s θ + +/-- Ratio governing the localized force coefficient sums after inserting parent `q = 2` bounds. -/ +noncomputable def coarsePoincareRHSForceFiniteSumRatio (s θ : ℝ) : ℝ := + coarsePoincareRHSScaledStepCoeff s θ * Real.rpow (3 : ℝ) (-s) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Correctors.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Correctors.lean new file mode 100644 index 0000000000..ab674c83c6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Correctors.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization + +/-! # Correctors -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coarse Poincare with right-hand side + +This file starts the deterministic Chapter-3 RHS development. The present pass +only packages the local zero-trace corrector surface on one triadic cube, +leaving the scale recurrence and iteration for downstream work. +-/ + +theorem isFiniteMeasureVolumeMeasureOnCubeSet_rhs {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + let U : Set (Vec d) := cubeSet Q + let : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_cubeSet_lt_top Q⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) + infer_instance + +instance instIsFiniteMeasureVolumeMeasureOnCubeSet_rhs {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_rhs Q + +private theorem openCubeSet_nonempty_rhs {d : ℕ} (Q : TriadicCube d) : + Set.Nonempty (openCubeSet Q) := by + refine ⟨fun i => (Q.index i : ℝ) * cubeScaleFactor Q, ?_⟩ + intro i + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + constructor <;> nlinarith + +/-- A local zero-trace corrector on one cube for the weak equation +`- div (a grad rho) = div g`. -/ +structure ZeroTraceDirichletCorrectorData {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) where + toH10 : H10Function (cubeSet Q) + weakSolution : IsZeroTraceDirichletRhsWeakSolution a (cubeSet Q) toH10 g + +/-- Package a local zero-trace corrector on one cube from the abstract +Dirichlet RHS existence theorem. -/ +private noncomputable def zeroTraceDirichletCorrectorDataOf_potentialZeroTraceClosureRealization + {d : ℕ} (Q : TriadicCube d) {a : CoeffField d} {g : Vec d → Vec d} + {lam Lam : ℝ} (hg : MemVectorL2 (cubeSet Q) g) + (hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization (cubeSet Q)) + (hne : Set.Nonempty (cubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + ZeroTraceDirichletCorrectorData Q a g := by + exact + ⟨zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := cubeSet Q) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll, + isZeroTraceDirichletRhsWeakSolution_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := cubeSet Q) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll⟩ + +theorem isZeroTraceDirichletRhsWeakSolution_cubeSet_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} {u : H10Function (openCubeSet Q)} + (hu : IsZeroTraceDirichletRhsWeakSolution a (openCubeSet Q) u g) : + IsZeroTraceDirichletRhsWeakSolution a (cubeSet Q) u.toCubeSet g := by + intro φ + have hopen := hu φ.toOpenCubeSet + have hleft : + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) + (f := fun x => + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x))) + have hright : + ∫ x in cubeSet Q, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + calc + ∫ x in cubeSet Q, + vecDot (matVecMul (a x) (u.toCubeSet.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) + (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := hleft + _ = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) + ∂MeasureTheory.volume := hopen + _ = + ∫ x in cubeSet Q, vecDot (g x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := hright.symm + +/-- Canonical local zero-trace corrector on the half-open cube, obtained by +solving the Dirichlet problem on the corresponding open cube and transporting +the weak formulation across the a.e.-equal cube realizations. -/ +noncomputable def zeroTraceDirichletCorrectorDataOf_isEllipticFieldOn_cubeSet + {d : ℕ} [NeZero d] (Q : TriadicCube d) {a : CoeffField d} + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 (cubeSet Q) g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + ZeroTraceDirichletCorrectorData Q a g := by + have hgOpen : MemVectorL2 (openCubeSet Q) g := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hg + have hRealizeOpen : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization (openCubeSet Q) := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + haveI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let uOpen : H10Function (openCubeSet Q) := + zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := openCubeSet Q) (g := g) (lam := lam) (Lam := Lam) + hgOpen hRealizeOpen (openCubeSet_nonempty_rhs Q) hEllOpen + refine ⟨uOpen.toCubeSet, ?_⟩ + exact + isZeroTraceDirichletRhsWeakSolution_cubeSet_of_openCubeSet + (Q := Q) (a := a) (g := g) (u := uOpen) + (isZeroTraceDirichletRhsWeakSolution_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := openCubeSet Q) (g := g) (lam := lam) (Lam := Lam) + hgOpen hRealizeOpen (openCubeSet_nonempty_rhs Q) hEllOpen) + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem residualFlux_solenoidal + {lam Lam : ℝ} (ρ : ZeroTraceDirichletCorrectorData Q a g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hmem : MemVectorL2 (cubeSet Q) g) : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x) - g x) := by + intro φ + have hflux_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hflux_int : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + (φ.toH1Function.grad x)) (cubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hflux_mem φ.toH1Function.grad_memVectorL2 + have hg_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (g x) (φ.toH1Function.grad x)) (cubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hmem φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => + vecDot (matVecMul (a x) (ρ.toH10.toH1Function.grad x) - g x) + (φ.toH1Function.grad x)) = + fun x => + vecDot (matVecMul (a x) (ρ.toH10.toH1Function.grad x)) + (φ.toH1Function.grad x) - + vecDot (g x) (φ.toH1Function.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + rw [hfun, MeasureTheory.integral_sub hflux_int hg_int, ρ.weakSolution φ] + ring + +theorem exists_aHarmonicRemainder_of_potential_solenoidal + {lam Lam : ℝ} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hmem : MemVectorL2 (cubeSet Q) g) : + ∃ w : AHarmonicFunction a (cubeSet Q), + ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x := by + rcases hu_potential with ⟨v, hv⟩ + let wH1 : H1Function (cubeSet Q) := v - ρ.toH10.toH1Function + have hρ_residual := + ρ.residualFlux_solenoidal hEll hmem + have hu_mem : MemVectorL2 (cubeSet Q) u := by + simpa [← hv] using v.grad_memVectorL2 + have hflux_u_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hu_mem + have hres_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x) := + hflux_u_mem.sub hmem + have hflux_ρ_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hρ_res_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x) - g x) := + hflux_ρ_mem.sub hmem + have hsol_sum : + IsSolenoidalOn (cubeSet Q) + ((fun x => matVecMul (a x) (u x) - g x) + + (-1 : ℝ) • + (fun x => matVecMul (a x) (ρ.toH10.toH1Function.grad x) - g x)) := + isSolenoidalOn_add_of_memVectorL2 hres_mem (hρ_res_mem.const_smul (-1)) + hu_residual (isSolenoidalOn_smul hρ_residual (-1)) + have hsol : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (wH1.grad x)) := by + convert hsol_sum using 1 + funext x + ext i + simp [wH1, hv, sub_eq_add_neg, matVecMul_add, matVecMul_neg, Pi.add_apply] + let w : AHarmonicFunction a (cubeSet Q) := + { toH1 := wH1 + isHarmonic := ⟨wH1.isPotentialOn, hsol⟩ } + refine ⟨w, ?_⟩ + intro x hx + change u x = wH1.grad x + ρ.toH10.toH1Function.grad x + simp [wH1, hv, sub_eq_add_neg] + +/-- Descendant-cube form of the local harmonic-remainder construction. The +global PDE predicates on the parent half-open cube are restricted to `R` using +the Sobolev cube bridge, and then the existing one-cube corrector lemma is +applied on `R`. -/ +theorem exists_aHarmonicRemainder_of_parent_potential_solenoidal + [NeZero d] {R : TriadicCube d} {n : ℕ} {lam Lam : ℝ} + (ρ : ZeroTraceDirichletCorrectorData R a g) + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth Q n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) : + ∃ w : AHarmonicFunction a (cubeSet R), + ∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x := by + have hu_potential_R : + IsPotentialOn (cubeSet R) u := + hu_potential.restrict_cubeSet_of_mem_descendantsAtDepth hR + have hflux_memR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEllR hu_memR + have hres_memR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u x) - g x) := + hflux_memR.sub hg_memR + have hu_residual_R : + IsSolenoidalOn (cubeSet R) (fun x => matVecMul (a x) (u x) - g x) := + hu_residual.restrict_cubeSet_of_mem_descendantsAtDepth hR hres_memR + exact + ρ.exists_aHarmonicRemainder_of_potential_solenoidal + hu_potential_R hu_residual_R hEllR hg_memR + +/-- Fully constructed descendant-cube corrector and harmonic remainder from +parent potential/solenoidal PDE data. The zero-trace corrector is built on the +open cube and transported to the half-open cube, so callers no longer need a +separate realization hypothesis on `cubeSet R`. -/ +theorem exists_corrector_aHarmonicRemainder_of_parent_potential_solenoidal + [NeZero d] {R : TriadicCube d} {n : ℕ} {lam Lam : ℝ} + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth Q n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) : + ∃ ρ : ZeroTraceDirichletCorrectorData R a g, + ∃ w : AHarmonicFunction a (cubeSet R), + ∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x := by + let ρ : ZeroTraceDirichletCorrectorData R a g := + zeroTraceDirichletCorrectorDataOf_isEllipticFieldOn_cubeSet + (Q := R) (a := a) (g := g) (lam := lam) (Lam := Lam) hg_memR hEllR + rcases ρ.exists_aHarmonicRemainder_of_parent_potential_solenoidal + (Q := Q) (u := u) hu_potential hu_residual hR hEllR hu_memR hg_memR with + ⟨w, hw⟩ + exact ⟨ρ, w, hw⟩ + +end ZeroTraceDirichletCorrectorData + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/DepthWeightAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/DepthWeightAlgebra.lean new file mode 100644 index 0000000000..faa6bbec3b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/DepthWeightAlgebra.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalQuantities + +/-! # Depth Weight Algebra -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem real_le_of_forall_le_add_of_tendsto_zero {X A : ℝ} {T : ℕ → ℝ} + (hT : Filter.Tendsto T Filter.atTop (nhds 0)) + (h : ∀ N : ℕ, X ≤ T N + A) : + X ≤ A := by + have hX : Filter.Tendsto (fun _ : ℕ => X) Filter.atTop (nhds X) := + tendsto_const_nhds + have hTA : Filter.Tendsto (fun N : ℕ => T N + A) Filter.atTop (nhds (0 + A)) := + hT.add tendsto_const_nhds + have hle : X ≤ 0 + A := + le_of_tendsto_of_tendsto' hX hTA h + simpa using hle + +theorem tendsto_pow_mul_of_nonneg_bddAbove + {r : ℝ} {F : ℕ → ℝ} + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) + (hF_nonneg : ∀ N : ℕ, 0 ≤ F N) + (hF_bdd : BddAbove (Set.range F)) : + Filter.Tendsto (fun N : ℕ => r ^ N * F N) Filter.atTop (nhds 0) := by + rw [tendsto_zero_iff_abs_tendsto_zero] + rcases hF_bdd with ⟨B, hB⟩ + have hB_nonneg : 0 ≤ B := by + exact (hF_nonneg 0).trans (hB ⟨0, rfl⟩) + have hpow : + Filter.Tendsto (fun N : ℕ => r ^ N * B) Filter.atTop (nhds 0) := by + have habs : |r| < 1 := by + simpa [abs_of_nonneg hr_nonneg] using hr_lt_one + simpa using (tendsto_pow_atTop_nhds_zero_of_abs_lt_one habs).mul_const B + refine squeeze_zero (fun N : ℕ => abs_nonneg _) ?_ hpow + intro N + have hpow_nonneg : 0 ≤ r ^ N := pow_nonneg hr_nonneg N + have hF_le : F N ≤ B := hB ⟨N, rfl⟩ + have hprod_nonneg : 0 ≤ r ^ N * F N := + mul_nonneg hpow_nonneg (hF_nonneg N) + calc + |r ^ N * F N| = r ^ N * F N := abs_of_nonneg hprod_nonneg + _ ≤ r ^ N * B := mul_le_mul_of_nonneg_left hF_le hpow_nonneg + + +theorem coarsePoincareRHSDepthWeight_succ (s : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s (n + 1) = + coarsePoincareRHSStepDiscount s * coarsePoincareRHSDepthWeight s n := by + simpa [coarsePoincareRHSDepthWeight, coarsePoincareRHSStepDiscount] using + rpow_neg_mul_nat_succ_eq s n + + +theorem coarsePoincareRHSDepthWeight_eq_rpow_mul_succ (s : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s n = + Real.rpow (3 : ℝ) s * coarsePoincareRHSDepthWeight s (n + 1) := by + have h3 : 0 < (3 : ℝ) := by norm_num + unfold coarsePoincareRHSDepthWeight + calc + Real.rpow (3 : ℝ) (-s * (n : ℝ)) + = Real.rpow (3 : ℝ) (s + (-s * ((n + 1 : ℕ) : ℝ))) := by + congr 1 + norm_num + ring + _ = + Real.rpow (3 : ℝ) s * + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) := by + exact Real.rpow_add h3 s (-s * ((n + 1 : ℕ) : ℝ)) + +theorem coarsePoincareRHSDepthWeight_mul_theta_pow_eq_scaledStepCoeff_mul + (s θ : ℝ) (m N : ℕ) : + coarsePoincareRHSDepthWeight s m * θ ^ N = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSDepthWeight s (m + N) := by + induction N generalizing m with + | zero => + simp + | succ N ih => + calc + coarsePoincareRHSDepthWeight s m * θ ^ (N + 1) + = (coarsePoincareRHSDepthWeight s m * θ ^ N) * θ := by + rw [pow_succ] + ring + _ = + ((coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSDepthWeight s (m + N)) * θ := by + rw [ih] + _ = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + (coarsePoincareRHSScaledStepCoeff s θ * + coarsePoincareRHSDepthWeight s (m + (N + 1))) := by + rw [← Nat.add_assoc] + rw [coarsePoincareRHSDepthWeight_eq_rpow_mul_succ s (m + N)] + unfold coarsePoincareRHSScaledStepCoeff + ring + _ = + (coarsePoincareRHSScaledStepCoeff s θ) ^ (N + 1) * + coarsePoincareRHSDepthWeight s (m + (N + 1)) := by + rw [pow_succ] + ring + +theorem coarsePoincareRHSDepthWeight_mul_parentHalfCoeff_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s (n + 1) * + coarsePoincareRHSParentHalfCoeff Q a s (n + 1) = + coarsePoincareRHSDepthWeight s n * + coarsePoincareRHSParentHalfCoeff Q a s n := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hdepth : + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s * (n : ℝ)) := + rpow_neg_mul_nat_succ_eq s n + have hparent : + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + have hexp : + s * ((n + 1 : ℕ) : ℝ) = s + s * (n : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (s + s * (n : ℝ)) := by + rw [hexp] + _ = Real.rpow (3 : ℝ) s * + Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + exact Real.rpow_add h3 s (s * (n : ℝ)) + have hcombine : + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) s = 1 := by + calc + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) s = + Real.rpow (3 : ℝ) (-s + s) := by + exact (Real.rpow_add h3 (-s) s).symm + _ = 1 := by + simp [show -s + s = (0 : ℝ) by ring] + unfold coarsePoincareRHSDepthWeight coarsePoincareRHSParentHalfCoeff + rw [hdepth, hparent] + let A : ℝ := Real.rpow (3 : ℝ) (-s) + let B : ℝ := Real.rpow (3 : ℝ) s + let C : ℝ := Real.rpow (3 : ℝ) (-s * (n : ℝ)) + let D : ℝ := (geometricDiscount s 2)⁻¹ + let E : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + change A * C * (D * (B * E * L)) = C * (D * (E * L)) + have hAB : A * B = 1 := by simpa [A, B] using hcombine + calc + A * C * (D * (B * E * L)) = (A * B) * (C * (D * (E * L))) := by ring + _ = C * (D * (E * L)) := by rw [hAB]; ring + +theorem coarsePoincareRHSParentHalfCoeff_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : + coarsePoincareRHSParentHalfCoeff Q a s (n + 1) = + Real.rpow (3 : ℝ) s * coarsePoincareRHSParentHalfCoeff Q a s n := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hparent : + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + have hexp : + s * ((n + 1 : ℕ) : ℝ) = s + s * (n : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (s + s * (n : ℝ)) := by + rw [hexp] + _ = Real.rpow (3 : ℝ) s * + Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + exact Real.rpow_add h3 s (s * (n : ℝ)) + unfold coarsePoincareRHSParentHalfCoeff + rw [hparent] + ring + +theorem coarsePoincareRHSIntrinsicParentHalfForceMultiplier_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : + coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (n + 1) = + Real.rpow (3 : ℝ) s * + coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n := by + unfold coarsePoincareRHSIntrinsicParentHalfForceMultiplier + rw [coarsePoincareRHSParentHalfCoeff_succ Q a s n] + ring + +theorem coarsePoincareRHSGlobalForceBound_succ + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) : + coarsePoincareRHSGlobalForceBound Q g s (n + 1) = + Real.rpow (3 : ℝ) (-2 * s) * coarsePoincareRHSGlobalForceBound Q g s n := by + have h3 : 0 < (3 : ℝ) := by norm_num + let c : ℝ := Real.rpow (3 : ℝ) s + let b : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + have hc_pos : 0 < c := by + dsimp [c] + exact Real.rpow_pos_of_pos h3 s + have hb_pos : 0 < b := by + dsimp [b] + exact Real.rpow_pos_of_pos h3 (s * (n : ℝ)) + have hscale : + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = c * b := by + dsimp [c, b] + have hexp : + s * ((n + 1 : ℕ) : ℝ) = s + s * (n : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (s + s * (n : ℝ)) := by + rw [hexp] + _ = Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + exact Real.rpow_add h3 s (s * (n : ℝ)) + have hneg : + Real.rpow (3 : ℝ) (-2 * s) = (c ^ 2)⁻¹ := by + dsimp [c] + calc + Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) (-(2 * s)) := by + congr 1 + ring + _ = (Real.rpow (3 : ℝ) (2 * s))⁻¹ := by + simpa using (Real.rpow_neg (le_of_lt h3) (2 * s)) + _ = ((Real.rpow (3 : ℝ) s) ^ 2)⁻¹ := by + have hs2 : + Real.rpow (3 : ℝ) (2 * s) = + (Real.rpow (3 : ℝ) s) ^ 2 := by + calc + Real.rpow (3 : ℝ) (2 * s) = + Real.rpow (3 : ℝ) (s + s) := by + congr 1 + ring + _ = Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) s := by + exact Real.rpow_add h3 s s + _ = (Real.rpow (3 : ℝ) s) ^ 2 := by + ring + rw [hs2] + unfold coarsePoincareRHSGlobalForceBound + rw [hscale, hneg] + dsimp [c, b] at hc_pos hb_pos ⊢ + field_simp [hc_pos.ne', hb_pos.ne'] + +theorem coarsePoincareRHSIntrinsicForceFactor_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s (n + 1) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (n + 1)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (n + 1)) = + Real.rpow (3 : ℝ) (-s) * + (coarsePoincareRHSDepthWeight s n * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s n)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hdepth : + coarsePoincareRHSDepthWeight s (n + 1) = + Real.rpow (3 : ℝ) (-s) * coarsePoincareRHSDepthWeight s n := by + simpa [coarsePoincareRHSStepDiscount] using + coarsePoincareRHSDepthWeight_succ s n + have hmult := + coarsePoincareRHSIntrinsicParentHalfForceMultiplier_succ Q a s n + have hforce := + coarsePoincareRHSGlobalForceBound_succ Q g s n + have hfactor : + Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) s) ^ 2 * + Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) (-s) := by + have hsq : + (Real.rpow (3 : ℝ) s) ^ 2 = + Real.rpow (3 : ℝ) (2 * s) := by + calc + (Real.rpow (3 : ℝ) s) ^ 2 = + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) s := by + ring + _ = Real.rpow (3 : ℝ) (s + s) := by + exact (Real.rpow_add h3 s s).symm + _ = Real.rpow (3 : ℝ) (2 * s) := by + congr 1 + ring + have hsum1 : + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (2 * s) = + Real.rpow (3 : ℝ) (-s + 2 * s) := by + simpa using (Real.rpow_add h3 (-s) (2 * s)).symm + have hsum2 : + Real.rpow (3 : ℝ) (-s + 2 * s) * Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) ((-s + 2 * s) + -2 * s) := by + simpa using (Real.rpow_add h3 (-s + 2 * s) (-2 * s)).symm + calc + Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) s) ^ 2 * + Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (2 * s) * + Real.rpow (3 : ℝ) (-2 * s) := by + rw [hsq] + _ = Real.rpow (3 : ℝ) (-s + 2 * s) * Real.rpow (3 : ℝ) (-2 * s) := by + rw [hsum1] + _ = Real.rpow (3 : ℝ) ((-s + 2 * s) + -2 * s) := by + rw [hsum2] + _ = Real.rpow (3 : ℝ) (-s) := by + congr 1 + ring + rw [hdepth, hmult, hforce] + nth_rewrite 2 [← hfactor] + ring + +theorem coarsePoincareRHSWeightedDepthParentHalfCoeff_eq_base_mul_ratio_pow + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (s θ : ℝ) (m k : ℕ) : + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + coarsePoincareRHSParentHalfCoeff Q a s (m + k)) = + (coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSParentHalfCoeff Q a s m) * + (coarsePoincareRHSFiniteSumRatio s θ) ^ k := by + induction k with + | zero => + simp + | succ k ih => + calc + (coarsePoincareRHSScaledStepCoeff s θ) ^ (k + 1) * + (coarsePoincareRHSDepthWeight s (m + (k + 1)) * + coarsePoincareRHSParentHalfCoeff Q a s (m + (k + 1))) + = + (coarsePoincareRHSScaledStepCoeff s θ) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s ((m + k) + 1) * + coarsePoincareRHSParentHalfCoeff Q a s ((m + k) + 1))) := by + rw [pow_succ] + rw [← Nat.add_assoc] + ring + _ = + (coarsePoincareRHSScaledStepCoeff s θ) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + coarsePoincareRHSParentHalfCoeff Q a s (m + k))) := by + rw [coarsePoincareRHSDepthWeight_mul_parentHalfCoeff_succ Q a s (m + k)] + _ = + coarsePoincareRHSScaledStepCoeff s θ * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + coarsePoincareRHSParentHalfCoeff Q a s (m + k))) := by + ring + _ = + coarsePoincareRHSScaledStepCoeff s θ * + ((coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSParentHalfCoeff Q a s m) * + (coarsePoincareRHSFiniteSumRatio s θ) ^ k) := by + rw [ih] + _ = + (coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSParentHalfCoeff Q a s m) * + (coarsePoincareRHSFiniteSumRatio s θ) ^ (k + 1) := by + unfold coarsePoincareRHSFiniteSumRatio + rw [pow_succ] + ring + +theorem coarsePoincareRHSIntrinsicWeightedForceFactor_eq_base_mul_ratio_pow + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s θ : ℝ) (m k : ℕ) : + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k))) = + (coarsePoincareRHSDepthWeight s m * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) * + (coarsePoincareRHSForceFiniteSumRatio s θ) ^ k := by + induction k with + | zero => + simp + | succ k ih => + calc + (coarsePoincareRHSScaledStepCoeff s θ) ^ (k + 1) * + (coarsePoincareRHSDepthWeight s (m + (k + 1)) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + (k + 1))) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + (k + 1)))) + = + (coarsePoincareRHSScaledStepCoeff s θ) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s ((m + k) + 1) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s ((m + k) + 1)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s ((m + k) + 1)))) := by + rw [pow_succ] + rw [← Nat.add_assoc] + ring + _ = + (coarsePoincareRHSScaledStepCoeff s θ) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (Real.rpow (3 : ℝ) (-s) * + (coarsePoincareRHSDepthWeight s (m + k) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k))))) := by + rw [coarsePoincareRHSIntrinsicForceFactor_succ Q a g s (m + k)] + _ = + (coarsePoincareRHSScaledStepCoeff s θ * Real.rpow (3 : ℝ) (-s)) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k)))) := by + ring + _ = + (coarsePoincareRHSScaledStepCoeff s θ * Real.rpow (3 : ℝ) (-s)) * + ((coarsePoincareRHSDepthWeight s m * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) * + (coarsePoincareRHSForceFiniteSumRatio s θ) ^ k) := by + rw [ih] + _ = + (coarsePoincareRHSDepthWeight s m * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) * + (coarsePoincareRHSForceFiniteSumRatio s θ) ^ (k + 1) := by + unfold coarsePoincareRHSForceFiniteSumRatio + rw [pow_succ] + ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Energy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Energy.lean new file mode 100644 index 0000000000..1923e5a46d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Energy.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities + +/-! +# Coarse Poincare RHS energy compatibility module + +The coefficient-energy surface now lives in `Homogenization.PDE.EnergyIdentities`. +This module remains as a compatibility re-export for existing Coarse Poincare +RHS imports. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems.lean new file mode 100644 index 0000000000..61fb7cbced --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.NoteStepAndConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ZeroDirichletEnergy + +/-! # Final Theorems -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ExpandedAndElliptic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ExpandedAndElliptic.lean new file mode 100644 index 0000000000..44b46d9651 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ExpandedAndElliptic.lean @@ -0,0 +1,349 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.NoteStepAndConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Intrinsic + +/-! # Expanded And Elliptic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1) := by + have hs_half : 0 < s / 2 := by nlinarith + simpa using + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s / 2) hs_half hEll hOrigin + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEll.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have huMem : MemVectorL2 (cubeSet Q) u := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hu + have hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll huMem + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u) := by + intro n R hR + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR)) u) + have hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro j S hS + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hS hg + have hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro n R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + exact + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEllOpen hData hsum_half hu havg_nonneg hint hmem hGlobalBdd + hLocalBdd hlocal + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) + (m : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1) := by + have hs_half : 0 < s / 2 := by nlinarith + simpa using + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := Q) (a := a) (s / 2) hs_half hEll hOrigin + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEll.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have huMem : MemVectorL2 (cubeSet Q) u := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hu + have hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll huMem + have havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u) := by + intro n R hR + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + (hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR)) u) + have hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro j S hS + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hS hg + have hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro n R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + exact + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEllOpen hData hsum_half hu havg_nonneg hint hmem hGlobalBdd + hLocalBdd hlocal m + +theorem cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + have hsq := + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hu hg hGlobalBdd hlocal + have hnonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s u := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp Q hs u hu + calc + cubeBesovNegativeVectorSeminormTwo Q s u + = Real.sqrt ((cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2) := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hnonneg] + _ ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := + Real.sqrt_le_sqrt hsq + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have huMem : MemVectorL2 (cubeSet Q) u := by + rcases hu_potential with ⟨v, hv⟩ + simpa [← hv] using v.grad_memVectorL2 + have hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q huMem + have hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s) := by + intro n R hR + have hLocalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + exact + ZeroTraceDirichletCorrectorData.sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_intrinsicAbsorbedLocalError_noteEta_of_parent_potential_solenoidal + (Q := Q) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) (s := s) + hs hu_potential hu_residual hR hEll hg hLocalBdd + exact + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hu hg hGlobalBdd hlocal + +theorem cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + have huMem : MemVectorL2 (cubeSet Q) u := by + rcases hu_potential with ⟨v, hv⟩ + simpa [← hv] using v.grad_memVectorL2 + have hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q huMem + have hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s) := by + intro n R hR + have hLocalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + exact + ZeroTraceDirichletCorrectorData.sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_intrinsicAbsorbedLocalError_noteEta_of_parent_potential_solenoidal + (Q := Q) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) (s := s) + hs hu_potential hu_residual hR hEll hg hLocalBdd + exact + cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hu hg hGlobalBdd hlocal + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (m : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have huMem : MemVectorL2 (cubeSet Q) u := by + rcases hu_potential with ⟨v, hv⟩ + simpa [← hv] using v.grad_memVectorL2 + have hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q huMem + have hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s) := by + intro n R hR + have hLocalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + exact + ZeroTraceDirichletCorrectorData.sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_intrinsicAbsorbedLocalError_noteEta_of_parent_potential_solenoidal + (Q := Q) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) (s := s) + hs hu_potential hu_residual hR hEll hg hLocalBdd + exact + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded_of_isEllipticFieldOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hu hg hGlobalBdd hlocal m + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/NoteStepAndConstants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/NoteStepAndConstants.lean new file mode 100644 index 0000000000..72a1645761 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/NoteStepAndConstants.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.GlobalIteration + +/-! # Note Step And Constants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 0 * (5 * s⁻¹) + + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) 0 * + (5 * s⁻¹) := by + simpa using + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hData hsum_half hu havg_nonneg hint hmem hGlobalBdd + hLocalBdd hlocal 0 + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants_expanded + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hmain := + sq_cubeBesovNegativeVectorSeminormTwo_le_intrinsicGlobalEnergyForce_noteConstants + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hData hsum_half hu havg_nonneg hint hmem hGlobalBdd + hLocalBdd hlocal + have hE := + coarsePoincareRHSSIntrinsicGlobalEnergyBase_zero_noteConstants_le + (Q := Q) (a := a) (u := u) hs hs_le (havg_nonneg 0 Q (by simp)) + have hF := + coarsePoincareRHSSIntrinsicGlobalForceBase_zero_noteConstants_le + (Q := Q) (a := a) (g := g) (s := s) hs hs_le + exact hmain.trans (add_le_add hE hF) + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants_expanded + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) + (m : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hmain := + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hData hsum_half hu havg_nonneg hint hmem hGlobalBdd + hLocalBdd hlocal m + have hE := + coarsePoincareRHSSIntrinsicGlobalEnergyBase_noteConstants_le + (Q := Q) (a := a) (u := u) hs hs_le (havg_nonneg 0 Q (by simp)) m + have hF := + coarsePoincareRHSSIntrinsicGlobalForceBase_noteConstants_le + (Q := Q) (a := a) (g := g) (s := s) hs hs_le m + exact hmain.trans (add_le_add hE hF) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ZeroDirichletEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ZeroDirichletEnergy.lean new file mode 100644 index 0000000000..1a64076e0c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/FinalTheorems/ZeroDirichletEnergy.lean @@ -0,0 +1,429 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity + +/-! # Zero Dirichlet Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Zero-Dirichlet RHS energy bridge + +This leaf packages the note-facing bridge between the zero-trace energy +identity and the expanded coarse-Poincare-with-RHS estimate. The final Young +absorption is intentionally left as a separate algebraic step. +-/ + +open scoped ENNReal + +/-- +The note-facing forcing-square envelope for the coefficient energy of a +zero-trace RHS corrector. +-/ +noncomputable def zeroTraceDirichletEnergyEnvelope {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g : Vec d → Vec d) : ℝ := + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + 2 * + |(d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)| * + Real.sqrt + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +private theorem le_sq_mul_add_two_mul_sqrt_of_le_mul_sqrt_mul_add + {E A F B : ℝ} + (hE_nonneg : 0 ≤ E) (hA_nonneg : 0 ≤ A) + (hF_nonneg : 0 ≤ F) (hB_nonneg : 0 ≤ B) + (h : E ≤ B * Real.sqrt (A * E + F)) : + E ≤ B ^ 2 * A + 2 * B * Real.sqrt F := by + have hAE_nonneg : 0 ≤ A * E := mul_nonneg hA_nonneg hE_nonneg + have hsqrt_split : + Real.sqrt (A * E + F) ≤ Real.sqrt (A * E) + Real.sqrt F := + sqrt_add_le_add_sqrt_of_nonneg hAE_nonneg hF_nonneg + have hsplit : + E ≤ B * Real.sqrt (A * E) + B * Real.sqrt F := by + calc + E ≤ B * Real.sqrt (A * E + F) := h + _ ≤ B * (Real.sqrt (A * E) + Real.sqrt F) := by + exact mul_le_mul_of_nonneg_left hsqrt_split hB_nonneg + _ = B * Real.sqrt (A * E) + B * Real.sqrt F := by ring + have hyoung_left : + B * Real.sqrt (A * E) ≤ E / 2 + (B ^ 2 * A) / 2 := by + rw [Real.sqrt_mul hA_nonneg E] + have htwo := + two_mul_le_add_sq (B * Real.sqrt A) (Real.sqrt E) + have hsqA : (Real.sqrt A) ^ 2 = A := Real.sq_sqrt hA_nonneg + have hsqE : (Real.sqrt E) ^ 2 = E := Real.sq_sqrt hE_nonneg + nlinarith + calc + E ≤ B * Real.sqrt (A * E) + B * Real.sqrt F := hsplit + _ ≤ E / 2 + (B ^ 2 * A) / 2 + B * Real.sqrt F := by + nlinarith + _ ≤ B ^ 2 * A + 2 * B * Real.sqrt F := by + nlinarith + +namespace ZeroTraceDirichletCorrectorData + +/-- +Pre-Young zero-Dirichlet energy estimate. + +The coefficient energy of the zero-trace corrector is bounded by the centered +positive-Besov forcing seminorm times the square-root coarse-Poincare RHS +bound for the same corrector gradient. This is the faithful formal socket +immediately before the manuscript's Young absorption step. +-/ +theorem coefficientEnergy_average_le_centered_force_mul_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hCenteredBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) := by + have hg_mem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + have hρ_lp : + MeasureTheory.MemLp + (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ρ.toH10.toH1Function.grad_memVectorL2 + have hρ_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + (fun x => ρ.toH10.toH1Function.grad x) hρ_lp + have hρ_poincare : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + exact + cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := a) (g := g) + (u := fun x => ρ.toH10.toH1Function.grad x) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll ρ.toH10.toH1Function.isPotentialOn + (ρ.residualFlux_solenoidal hEll hg_mem) hg hGlobalBdd + have hneg : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + intro N + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => ρ.toH10.toH1Function.grad x) hρ_bdd N).trans + hρ_poincare + have hCentered_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g) := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s + (fun x => g x - cubeAverageVec Q g) hCenteredBdd + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g) := by + intro N + exact + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hCenteredBdd N + exact + ρ.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + (s := s) hs hg_mem hg hρ_lp hCentered_nonneg hneg hpos + +/-- +Zero-Dirichlet energy estimate after the sharp Young absorption. + +This turns the pre-Young energy/Poincare bridge into the note-facing sharp +envelope. The source term remains as `2 B sqrt(F)` instead of being +over-absorbed into the larger `B^2 + F` envelope. +-/ +theorem coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + 2 * + |(d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)| * + Real.sqrt + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + let E : ℝ := + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + let A : ℝ := + 250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let F : ℝ := + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 + let B : ℝ := + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g) + have hmem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := by + intro j R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hCenteredBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g)) := by + rcases hGlobalBdd with ⟨M, hM⟩ + refine ⟨M, ?_⟩ + rintro y ⟨N, rfl⟩ + change + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ + M + rw [cubeBesovPositiveVectorPartialSeminormTwo_sub_const + Q s N g (cubeAverageVec Q g) (fun j _ R hR => hmem_desc j R hR)] + exact hM ⟨N, rfl⟩ + have hcenter_eq : + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g) = + cubeBesovPositiveVectorSeminormTwo Q s g := by + exact cubeBesovPositiveVectorSeminormTwo_sub_const + Q s g (cubeAverageVec Q g) hmem_desc + have hpre_raw := + ρ.coefficientEnergy_average_le_centered_force_mul_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hg hGlobalBdd hCenteredBdd + have hpre : E ≤ B * Real.sqrt (A * E + F) := by + dsimp [E, A, F, B] + calc + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) := hpre_raw + _ = + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + rw [hcenter_eq] + ring + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + hEll (fun x => ρ.toH10.toH1Function.grad x)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + hlambda_inv_nonneg + have hBseminorm_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + hBseminorm_nonneg) + have hF_nonneg : 0 ≤ F := by + have hs_inv_pow_four_nonneg : 0 ≤ (s⁻¹) ^ 4 := by + rw [show (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 by ring] + exact sq_nonneg _ + dsimp [F] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (15000 : ℝ)) hs_inv_pow_four_nonneg) + (sq_nonneg ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹))) + (sq_nonneg ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)))) + (sq_nonneg (cubeBesovPositiveVectorSeminormTwo Q s g)) + have hmain : E ≤ B ^ 2 * A + 2 * B * Real.sqrt F := + le_sq_mul_add_two_mul_sqrt_of_le_mul_sqrt_mul_add + hE_nonneg hA_nonneg hF_nonneg hB_nonneg hpre + have hB_abs : |B| = B := abs_of_nonneg hB_nonneg + simpa [E, A, F, B, hB_abs] using hmain + +/-- +Bundled version of the Young-absorbed zero-Dirichlet energy estimate using the +named forcing-square envelope. +-/ +theorem coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := by + simpa [zeroTraceDirichletEnergyEnvelope] using + ρ.coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + +/-- +Zero-Dirichlet energy estimate with the manuscript `g ∈ H^s` regularity +package, rather than separate `L²` and positive-Besov boundedness hypotheses. +-/ +theorem coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded_of_cubeVectorBesovHRegularity + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (ρ : ZeroTraceDirichletCorrectorData Q a g) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : CubeVectorBesovHRegularity Q s g) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hg.memLp hg.partialSeminorms_bddAbove + +end ZeroTraceDirichletCorrectorData + +/-- +PDE-facing zero-Dirichlet energy estimate for an explicit zero-trace weak +solution, with RHS regularity supplied by the single manuscript `H^s` package. +-/ +theorem coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded_of_isZeroTraceDirichletRhsWeakSolution_of_cubeVectorBesovHRegularity + {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + {g : Vec d → Vec d} (v : H10Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hweak : IsZeroTraceDirichletRhsWeakSolution a (cubeSet Q) v g) + (hg : CubeVectorBesovHRegularity Q s g) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => v.toH1Function.grad x)) ≤ + zeroTraceDirichletEnergyEnvelope Q a s g := by + let ρ : ZeroTraceDirichletCorrectorData Q a g := ⟨v, hweak⟩ + simpa [ρ] using + ρ.coefficientEnergy_average_le_zeroTraceDirichletEnergyEnvelope_noteConstants_expanded_of_cubeVectorBesovHRegularity + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/ForceLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/ForceLocalization.lean new file mode 100644 index 0000000000..a5368ee454 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/ForceLocalization.lean @@ -0,0 +1,743 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds + +/-! # Force Localization -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSLocalCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} (hs : 0 < s) : + 0 ≤ coarsePoincareRHSLocalCoeff Q a s := by + unfold coarsePoincareRHSLocalCoeff + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a + (by norm_num) hs2.le + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + +theorem coarsePoincareRHSLocalCenteredForceSeminorm_eq_uncentered_of_mem + {d : ℕ} {Q R : TriadicCube d} (g : Vec d → Vec d) (s : ℝ) {n : ℕ} + (hR : R ∈ descendantsAtDepth Q n) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) : + coarsePoincareRHSLocalCenteredForceSeminorm R g s = + cubeBesovPositiveVectorSeminormTwo R s g := by + unfold coarsePoincareRHSLocalCenteredForceSeminorm + exact + cubeBesovPositiveVectorSeminormTwo_sub_const R s g + (cubeAverageVec R g) + (fun j S hS => hmem (n + j) S (mem_descendantsAtDepth_add hR hS)) + +theorem descendantsAverage_sq_coarsePoincareRHSLocalCenteredForceSeminorm_eq_of_mem + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) : + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) = + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + unfold descendantsAverage + apply congrArg (fun t : ℝ => ((descendantsAtDepth Q n).card : ℝ)⁻¹ * t) + refine Finset.sum_congr rfl ?_ + intro R hR + rw [coarsePoincareRHSLocalCenteredForceSeminorm_eq_uncentered_of_mem + (Q := Q) (R := R) g s hR hmem] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + {d : ℕ} {Q R : TriadicCube d} {n : ℕ} (s : ℝ) (u : Vec d → Vec d) + (hR : R ∈ descendantsAtDepth Q n) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N u) := by + classical + rcases hGlobalBdd with ⟨B, hB⟩ + have hB_nonneg : 0 ≤ B := by + have hB0 : cubeBesovPositiveVectorPartialSeminormTwo Q s 0 u ≤ B := + hB ⟨0, rfl⟩ + exact (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s 0 u).trans hB0 + let D : Finset (TriadicCube d) := descendantsAtDepth Q n + let c : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q n + have hcard_pos_nat : 0 < D.card := Finset.card_pos.mpr hD_nonempty + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast hcard_pos_nat + have hcard_nonneg : 0 ≤ (D.card : ℝ) := le_of_lt hcard_pos + have hc_pos : 0 < c := by + dsimp [c] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + refine ⟨c⁻¹ * Real.sqrt ((D.card : ℝ) * B ^ 2), ?_⟩ + rintro x ⟨N, rfl⟩ + have hparent_le : + cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) u ≤ B := + hB ⟨n + N, rfl⟩ + have hparent_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) u := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s (n + N) u + have hparent_sq_le : + (cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) u) ^ 2 ≤ B ^ 2 := by + nlinarith + let F : TriadicCube d → ℝ := fun S => + (c * cubeBesovPositiveVectorPartialSeminormTwo S s N u) ^ 2 + have havg_le_parent : + descendantsAverage Q n F ≤ + (cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) u) ^ 2 := by + dsimp [F, c] + exact descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_le + Q s u n N + have havg_le_Bsq : descendantsAverage Q n F ≤ B ^ 2 := + havg_le_parent.trans hparent_sq_le + have hsum_le : (∑ S ∈ D, F S) ≤ (D.card : ℝ) * B ^ 2 := by + have hmul : + (D.card : ℝ) * descendantsAverage Q n F ≤ (D.card : ℝ) * B ^ 2 := + mul_le_mul_of_nonneg_left havg_le_Bsq hcard_nonneg + have hdesc : (D.card : ℝ) * descendantsAverage Q n F = ∑ S ∈ D, F S := by + dsimp [descendantsAverage, D] + field_simp [ne_of_gt hcard_pos] + rwa [hdesc] at hmul + have hterm_le_sum : F R ≤ ∑ S ∈ D, F S := by + exact Finset.single_le_sum + (fun S hS => sq_nonneg (c * cubeBesovPositiveVectorPartialSeminormTwo S s N u)) + (by simpa [D] using hR) + have hterm_sq_le : + (c * cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2 ≤ + (D.card : ℝ) * B ^ 2 := + hterm_le_sum.trans hsum_le + have hscaled_le : + c * cubeBesovPositiveVectorPartialSeminormTwo R s N u ≤ + Real.sqrt ((D.card : ℝ) * B ^ 2) := + Real.le_sqrt_of_sq_le hterm_sq_le + exact (le_inv_mul_iff₀ hc_pos).mpr hscaled_le + +theorem tendsto_cubeBesovPositiveVectorPartialSeminormTwo_atTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u)) : + Filter.Tendsto + (fun N : ℕ => cubeBesovPositiveVectorPartialSeminormTwo Q s N u) + Filter.atTop + (nhds (cubeBesovPositiveVectorSeminormTwo Q s u)) := by + unfold cubeBesovPositiveVectorSeminormTwo + exact + tendsto_atTop_ciSup + (monotone_nat_of_le_succ + (fun N => cubeBesovPositiveVectorPartialSeminormTwo_le_succ Q s u N)) + hBdd + +theorem tendsto_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_atTop + {d : ℕ} (Q : TriadicCube d) (s c : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u)) : + Filter.Tendsto + (fun N : ℕ => (c * cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2) + Filter.atTop + (nhds ((c * cubeBesovPositiveVectorSeminormTwo Q s u) ^ 2)) := by + exact + ((Filter.Tendsto.const_mul c + (tendsto_cubeBesovPositiveVectorPartialSeminormTwo_atTop Q s u hBdd)).pow 2) + +theorem tendsto_descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_atTop + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (n : ℕ) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N u)) : + Filter.Tendsto + (fun N : ℕ => + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2)) + Filter.atTop + (nhds + (descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s u) ^ 2))) := by + unfold descendantsAverage + exact + Filter.Tendsto.const_mul ((descendantsAtDepth Q n).card : ℝ)⁻¹ + (tendsto_finsetSum (descendantsAtDepth Q n) + (fun R hR => + tendsto_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_atTop + R s (Real.rpow (3 : ℝ) (s * (n : ℝ))) u (hLocalBdd R hR))) + +theorem descendantsAverage_sq_scaled_cubeBesovPositiveVectorSeminormTwo_le + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hglobal_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have hbound : + ∀ N : ℕ, + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N g) ^ 2) ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + intro N + have hpartial := + descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_le + Q s g n N + have hpartial_le_full : + cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) g ≤ + cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s g hGlobalBdd (n + N) + have hpartial_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) g := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s (n + N) g + have hpartial_sq : + (cubeBesovPositiveVectorPartialSeminormTwo Q s (n + N) g) ^ 2 ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + nlinarith + exact hpartial.trans hpartial_sq + have hlim := + tendsto_descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_atTop + Q s g n hLocalBdd + exact le_of_tendsto' hlim hbound + +/-- +Unscaled parent-seminorm corollary of +`descendantsAverage_sq_scaled_cubeBesovPositiveVectorSeminormTwo_le`. +-/ +theorem descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_parent_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) {s : ℝ} (n : ℕ) + (hs : 0 ≤ s) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let c : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + have hscaled := + descendantsAverage_sq_scaled_cubeBesovPositiveVectorSeminormTwo_le + Q g s n hGlobalBdd hLocalBdd + have hscaled_eq : + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) = + c ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + dsimp [c] + calc + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) + = + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + apply congrArg (descendantsAverage Q n) + funext R + ring + _ = + (Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + exact descendantsAverage_mul_left Q n + ((Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2) + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) + have hc_one : 1 ≤ c := by + dsimp [c] + simpa using + (Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) + (mul_nonneg hs (by exact_mod_cast Nat.zero_le n))) + have hc_sq_one : 1 ≤ c ^ 2 := by + nlinarith [sq_nonneg c] + have havg_nonneg : + 0 ≤ descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := + descendantsAverage_nonneg Q n _ + (fun R hR => sq_nonneg (cubeBesovPositiveVectorSeminormTwo R s g)) + have havg_le_scaled : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + c ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + nlinarith + calc + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) + ≤ + c ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := + havg_le_scaled + _ = + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := + hscaled_eq.symm + _ ≤ (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := hscaled + +theorem descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + coarsePoincareRHSGlobalForceBound Q g s n := by + let c : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + have hc_pos : 0 < c := by + dsimp [c] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hc_sq_pos : 0 < c ^ 2 := sq_pos_of_pos hc_pos + have hscaled := + descendantsAverage_sq_scaled_cubeBesovPositiveVectorSeminormTwo_le + Q g s n hGlobalBdd hLocalBdd + have hscaled_eq : + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) = + c ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + dsimp [c] + calc + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) + = + descendantsAverage Q n + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + refine congrArg (descendantsAverage Q n) ?_ + funext R + ring + _ = + (Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + rw [descendantsAverage_mul_left Q n + ((Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2) + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2)] + have hmul : + c ^ 2 * + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + rw [hscaled_eq] at hscaled + exact hscaled + exact (le_inv_mul_iff₀ hc_sq_pos).mpr hmul + +/-- +Localized descendant `L²` average of the positive forcing seminorm at a fixed +depth. This is the quantity whose parent-cube control carries the small +factor `3^{-s n}`. +-/ +noncomputable def localizedPositiveBesovForcingSeminormTwoAtDepth {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (n : ℕ) (g : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q n fun R => + (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) + +/-- +The square root of the global force bound is the inverse depth weight times the +parent positive-Besov seminorm. +-/ +theorem sqrt_coarsePoincareRHSGlobalForceBound_eq_depthWeight_inv_mul_parent_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + Real.sqrt (coarsePoincareRHSGlobalForceBound Q g s n) = + (Real.rpow (3 : ℝ) (s * (n : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g := by + let c : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + have hc_pos : 0 < c := by + dsimp [c] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hc_nonneg : 0 ≤ c := hc_pos.le + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have hprod_nonneg : 0 ≤ c⁻¹ * B := + mul_nonneg (inv_nonneg.mpr hc_nonneg) hB_nonneg + have hinside : + coarsePoincareRHSGlobalForceBound Q g s n = (c⁻¹ * B) ^ 2 := by + unfold coarsePoincareRHSGlobalForceBound + dsimp [c, B] + ring + rw [hinside, Real.sqrt_sq hprod_nonneg] + +/-- +Scale-sharp localization of the positive forcing seminorm: averaging the +descendant forcing seminorms costs the inverse positive depth weight, not the +positive depth weight. +-/ +theorem localizedPositiveBesovForcingSeminormTwoAtDepth_le_depthWeight_inv_mul_parent_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + localizedPositiveBesovForcingSeminormTwoAtDepth Q s n g ≤ + (Real.rpow (3 : ℝ) (s * (n : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g := by + have hscaled : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + coarsePoincareRHSGlobalForceBound Q g s n := + descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + Q g s n hGlobalBdd hLocalBdd + calc + localizedPositiveBesovForcingSeminormTwoAtDepth Q s n g + ≤ Real.sqrt (coarsePoincareRHSGlobalForceBound Q g s n) := by + exact Real.sqrt_le_sqrt hscaled + _ = + (Real.rpow (3 : ℝ) (s * (n : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g := + sqrt_coarsePoincareRHSGlobalForceBound_eq_depthWeight_inv_mul_parent_of_bddAbove + Q g s n hGlobalBdd + +theorem coarsePoincareRHSIntrinsicLocalForceError_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) (s : ℝ) : + 0 ≤ coarsePoincareRHSIntrinsicLocalForceError Q a g s := by + unfold coarsePoincareRHSIntrinsicLocalForceError + exact sq_nonneg _ + +theorem coarsePoincareRHSIntrinsicForceErrorAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) (n : ℕ) : + 0 ≤ coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n := by + unfold coarsePoincareRHSIntrinsicForceErrorAverage + exact descendantsAverage_nonneg Q n _ + fun R hR => coarsePoincareRHSIntrinsicLocalForceError_nonneg R a g s + +theorem coarsePoincareRHSIntrinsicEnergyErrorAverage_le_of_localCoeffBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) (n : ℕ) {C : ℝ} + (hcoeff : + ∀ R ∈ descendantsAtDepth Q n, + coarsePoincareRHSLocalCoeff R a s ≤ C) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) : + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n ≤ + 2 * C * + descendantsAverage Q n (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + unfold coarsePoincareRHSIntrinsicEnergyErrorAverage + calc + descendantsAverage Q n (fun R => coarsePoincareRHSIntrinsicLocalEnergyError R a u s) + ≤ + descendantsAverage Q n + (fun R => 2 * C * cubeAverage R (coefficientEnergyDensity a u)) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + unfold coarsePoincareRHSIntrinsicLocalEnergyError + calc + 2 * coarsePoincareRHSLocalCoeff R a s * + cubeAverage R (coefficientEnergyDensity a u) + ≤ 2 * (C * cubeAverage R (coefficientEnergyDensity a u)) := by + simpa [mul_assoc] using mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right (hcoeff R hR) (havg_nonneg R hR)) + (show 0 ≤ (2 : ℝ) by norm_num) + _ = 2 * C * cubeAverage R (coefficientEnergyDensity a u) := by + ring + _ = + 2 * C * + descendantsAverage Q n (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + rw [descendantsAverage_smul Q n (2 * C) + (fun R => cubeAverage R (coefficientEnergyDensity a u))] + +theorem coarsePoincareRHSIntrinsicEnergyErrorAverage_le_globalAverage_of_localCoeffBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) (n : ℕ) {C : ℝ} + (hcoeff : + ∀ R ∈ descendantsAtDepth Q n, + coarsePoincareRHSLocalCoeff R a s ≤ C) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) : + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n ≤ + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) := by + have hbase := + coarsePoincareRHSIntrinsicEnergyErrorAverage_le_of_localCoeffBound + Q a u s n hcoeff havg_nonneg + have hpartition : + cubeAverage Q (coefficientEnergyDensity a u) = + descendantsAverage Q n + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn Q n + (coefficientEnergyDensity a u) hint + simpa [hpartition] using hbase + +theorem coarsePoincareRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s lam Lam : ℝ} (n : ℕ) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q n) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) : + coarsePoincareRHSLocalCoeff R a s ≤ + (geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hdisc_nonneg : 0 ≤ (geometricDiscount s 2)⁻¹ := + inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2)) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hlambda := + multiscale_ellipticity_lambdaSq_two_inv_le_rpow_s_of_mem_descendantsAtScale_of_half_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (R := R) (k := Q.scale - (n : ℤ)) a hs hRscale hEll hData hsum_half + have htoNat : + Int.toNat (Q.scale - (Q.scale - (n : ℤ))) = n := by + have hdiff : Q.scale - (Q.scale - (n : ℤ)) = (n : ℤ) := by + omega + rw [hdiff] + simp + unfold coarsePoincareRHSLocalCoeff + refine mul_le_mul_of_nonneg_left ?_ hdisc_nonneg + simpa [htoNat] using hlambda + +theorem coarsePoincareRHSIntrinsicEnergyErrorAverage_le_parentHalfCoeff_globalAverage + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) : + coarsePoincareRHSIntrinsicEnergyErrorAverage Q a u s n ≤ + 2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u) := by + simpa [coarsePoincareRHSParentHalfCoeff, mul_assoc] using + coarsePoincareRHSIntrinsicEnergyErrorAverage_le_globalAverage_of_localCoeffBound + Q a u s n + (fun R hR => + coarsePoincareRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a n hs hR hEll hData hsum_half) + havg_nonneg hint + +theorem coarsePoincareRHSIntrinsicForceErrorAverage_le_of_multiplierSqBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) (n : ℕ) {K2 : ℝ} + (hmult : + ∀ R ∈ descendantsAtDepth Q n, + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s) ^ 2 ≤ K2) : + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n ≤ + K2 * + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + unfold coarsePoincareRHSIntrinsicForceErrorAverage + calc + descendantsAverage Q n (fun R => coarsePoincareRHSIntrinsicLocalForceError R a g s) + ≤ + descendantsAverage Q n + (fun R => K2 * (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + unfold coarsePoincareRHSIntrinsicLocalForceError + calc + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s * + coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2 + = + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s) ^ 2 * + (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2 := by + ring + _ ≤ + K2 * (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2 := by + exact mul_le_mul_of_nonneg_right (hmult R hR) (sq_nonneg _) + _ = + K2 * + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + rw [descendantsAverage_smul Q n K2 + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2)] + +theorem coarsePoincareRHSIntrinsicLocalForceMultiplier_sq_le_of_localCoeffBound {d : ℕ} + (R : TriadicCube d) (a : CoeffField d) {s C : ℝ} + (hs : 0 < s) + (hcoeff : coarsePoincareRHSLocalCoeff R a s ≤ C) : + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s) ^ 2 ≤ + (C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) ^ 2 := by + let P : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (by exact_mod_cast Nat.zero_le d) + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hlocal_nonneg : + 0 ≤ coarsePoincareRHSIntrinsicLocalForceMultiplier R a s := by + unfold coarsePoincareRHSIntrinsicLocalForceMultiplier + exact mul_nonneg (coarsePoincareRHSLocalCoeff_nonneg R a hs) hP_nonneg + have hle : + coarsePoincareRHSIntrinsicLocalForceMultiplier R a s ≤ C * P := by + unfold coarsePoincareRHSIntrinsicLocalForceMultiplier + exact mul_le_mul_of_nonneg_right hcoeff hP_nonneg + simpa [P] using pow_le_pow_left₀ hlocal_nonneg hle 2 + +theorem coarsePoincareRHSIntrinsicLocalForceMultiplier_sq_le_parentHalfLambda_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s lam Lam : ℝ} (n : ℕ) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q n) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) : + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s) ^ 2 ≤ + (coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 := by + simpa [coarsePoincareRHSParentHalfCoeff, + coarsePoincareRHSIntrinsicParentHalfForceMultiplier] using + coarsePoincareRHSIntrinsicLocalForceMultiplier_sq_le_of_localCoeffBound + R a hs + (coarsePoincareRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a n hs hR hEll hData hsum_half) + +theorem coarsePoincareRHSIntrinsicForceErrorAverage_le_of_multiplierSqBound_of_centeredForceAverageBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) (n : ℕ) {K2 B : ℝ} + (hK2 : 0 ≤ K2) + (hmult : + ∀ R ∈ descendantsAtDepth Q n, + (coarsePoincareRHSIntrinsicLocalForceMultiplier R a s) ^ 2 ≤ K2) + (hforceAvg : + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B) : + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n ≤ K2 * B := by + calc + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n + ≤ + K2 * + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + exact + coarsePoincareRHSIntrinsicForceErrorAverage_le_of_multiplierSqBound + Q a g s n hmult + _ ≤ K2 * B := by + exact mul_le_mul_of_nonneg_left hforceAvg hK2 + +theorem coarsePoincareRHSIntrinsicForceErrorAverage_le_parentHalfLambda_of_centeredForceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) {B : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hforceAvg : + descendantsAverage Q n + (fun R => (coarsePoincareRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B) : + coarsePoincareRHSIntrinsicForceErrorAverage Q a g s n ≤ + (coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * B := by + refine + coarsePoincareRHSIntrinsicForceErrorAverage_le_of_multiplierSqBound_of_centeredForceAverageBound + Q a g s n (K2 := + (coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2) + (B := B) ?_ ?_ hforceAvg + · exact sq_nonneg _ + · intro R hR + exact + coarsePoincareRHSIntrinsicLocalForceMultiplier_sq_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a n hs hR hEll hData hsum_half + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalBaseBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalBaseBounds.lean new file mode 100644 index 0000000000..2cbd50e30e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalBaseBounds.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.DepthWeightAlgebra + +/-! # Global Base Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSParentHalfCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} (hs : 0 < s) (n : ℕ) : + 0 ≤ coarsePoincareRHSParentHalfCoeff Q a s n := by + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hshalf2_nonneg : 0 ≤ (s / 2) * (2 : ℝ) := by nlinarith + unfold coarsePoincareRHSParentHalfCoeff + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) hshalf2_nonneg))) + + +theorem coarsePoincareRHSGlobalForceBound_nonneg {d : ℕ} + (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) : + 0 ≤ coarsePoincareRHSGlobalForceBound Q g s n := by + unfold coarsePoincareRHSGlobalForceBound + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) (sq_nonneg _) + +theorem coarsePoincareRHSSIntrinsicGlobalEnergyBase_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s CE : ℝ} (hs : 0 < s) (hCE_nonneg : 0 ≤ CE) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) (m : ℕ) : + 0 ≤ coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m := by + unfold coarsePoincareRHSSIntrinsicGlobalEnergyBase + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg hCE_nonneg + (mul_nonneg + (mul_nonneg (by norm_num) (coarsePoincareRHSParentHalfCoeff_nonneg Q a hs m)) + havg_nonneg)) + +/-- The depth-scaled global energy base is independent of the starting depth. -/ +theorem coarsePoincareRHSSIntrinsicGlobalEnergyBase_succ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s CE : ℝ) (n : ℕ) : + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE (n + 1) = + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE n := by + let Dsucc : ℝ := coarsePoincareRHSDepthWeight s (n + 1) + let D : ℝ := coarsePoincareRHSDepthWeight s n + let Psucc : ℝ := coarsePoincareRHSParentHalfCoeff Q a s (n + 1) + let P : ℝ := coarsePoincareRHSParentHalfCoeff Q a s n + let A : ℝ := cubeAverage Q (coefficientEnergyDensity a u) + have hDP : Dsucc * Psucc = D * P := by + simpa [Dsucc, D, Psucc, P] using + coarsePoincareRHSDepthWeight_mul_parentHalfCoeff_succ Q a s n + calc + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE (n + 1) + = CE * 2 * A * (Dsucc * Psucc) := by + simp [coarsePoincareRHSSIntrinsicGlobalEnergyBase, Dsucc, Psucc, A] + ring + _ = CE * 2 * A * (D * P) := by rw [hDP] + _ = coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE n := by + simp [coarsePoincareRHSSIntrinsicGlobalEnergyBase, D, P, A] + ring + +theorem coarsePoincareRHSSIntrinsicGlobalEnergyBase_eq_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s CE : ℝ) (m : ℕ) : + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m = + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE 0 := by + induction m with + | zero => rfl + | succ n ih => + rw [coarsePoincareRHSSIntrinsicGlobalEnergyBase_succ Q a u s CE n, ih] + +theorem coarsePoincareRHSSIntrinsicGlobalEnergyBase_zero_noteConstants_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) : + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 0 * (5 * s⁻¹) ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) := by + let K : ℝ := 5 * s⁻¹ + let L : ℝ := (lambdaSqFinite Q (s / 2) 2 a)⁻¹ + let A : ℝ := cubeAverage Q (coefficientEnergyDensity a u) + let P : ℝ := coarsePoincareRHSParentHalfCoeff Q a s 0 + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith [hs])) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact havg_nonneg + have hP_le : P ≤ K * L := by + dsimp [P, K, L] + unfold coarsePoincareRHSParentHalfCoeff + simpa [lambdaSq, L] using + mul_le_mul_of_nonneg_right + (inv_geometricDiscount_two_le_five_inv hs hs_le) hL_nonneg + have hinner : + 2 * P * A ≤ 2 * (K * L) * A := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hP_le (by norm_num : 0 ≤ (2 : ℝ))) hA_nonneg + calc + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 0 * (5 * s⁻¹) + = 5 * (2 * P * A) * K := by + simp [coarsePoincareRHSSIntrinsicGlobalEnergyBase, coarsePoincareRHSDepthWeight, + P, K, A] + _ ≤ 5 * (2 * (K * L) * A) * K := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hinner (by norm_num : 0 ≤ (5 : ℝ))) hK_nonneg + _ = + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) := by + simp [K, L, A, lambdaSq] + ring + +theorem coarsePoincareRHSSIntrinsicGlobalEnergyBase_noteConstants_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (m : ℕ) : + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 m * (5 * s⁻¹) ≤ + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u) := by + rw [coarsePoincareRHSSIntrinsicGlobalEnergyBase_eq_zero Q a u s 5 m] + exact + coarsePoincareRHSSIntrinsicGlobalEnergyBase_zero_noteConstants_le + Q a u hs hs_le havg_nonneg + +theorem coarsePoincareRHSSIntrinsicGlobalForceBase_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) {CF : ℝ} (hCF_nonneg : 0 ≤ CF) (m : ℕ) : + 0 ≤ coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m := by + unfold coarsePoincareRHSSIntrinsicGlobalForceBase + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (mul_nonneg hCF_nonneg + (mul_nonneg (sq_nonneg _) + (coarsePoincareRHSGlobalForceBound_nonneg Q g s m))) + +/-- The depth-scaled global force base decays by one `3^{-s}` factor. -/ +theorem coarsePoincareRHSSIntrinsicGlobalForceBase_succ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s CF : ℝ) (n : ℕ) : + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF (n + 1) = + Real.rpow (3 : ℝ) (-s) * + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := by + let Dsucc : ℝ := coarsePoincareRHSDepthWeight s (n + 1) + let D : ℝ := coarsePoincareRHSDepthWeight s n + let Msucc : ℝ := coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (n + 1) + let M : ℝ := coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n + let Fsucc : ℝ := coarsePoincareRHSGlobalForceBound Q g s (n + 1) + let F : ℝ := coarsePoincareRHSGlobalForceBound Q g s n + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hfactor : Dsucc * (Msucc ^ 2 * Fsucc) = r * (D * (M ^ 2 * F)) := by + simpa [Dsucc, D, Msucc, M, Fsucc, F, r] using + coarsePoincareRHSIntrinsicForceFactor_succ Q a g s n + calc + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF (n + 1) + = CF * (Dsucc * (Msucc ^ 2 * Fsucc)) := by + simp [coarsePoincareRHSSIntrinsicGlobalForceBase, Dsucc, Msucc, Fsucc] + ring + _ = CF * (r * (D * (M ^ 2 * F))) := by rw [hfactor] + _ = r * coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := by + simp [coarsePoincareRHSSIntrinsicGlobalForceBase, D, M, F, r] + ring + +theorem coarsePoincareRHSSIntrinsicGlobalForceBase_le_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s CF : ℝ} (hs_nonneg : 0 ≤ s) (hCF_nonneg : 0 ≤ CF) (m : ℕ) : + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m ≤ + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF 0 := by + have hr_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-s) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_le_one : Real.rpow (3 : ℝ) (-s) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + induction m with + | zero => rfl + | succ n ih => + have hbase_nonneg : + 0 ≤ coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := + coarsePoincareRHSSIntrinsicGlobalForceBase_nonneg + Q a g s hCF_nonneg n + calc + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF (n + 1) + = Real.rpow (3 : ℝ) (-s) * + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := by + rw [coarsePoincareRHSSIntrinsicGlobalForceBase_succ] + _ ≤ 1 * coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := + mul_le_mul_of_nonneg_right hr_le_one hbase_nonneg + _ = coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF n := by ring + _ ≤ coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF 0 := ih + +theorem coarsePoincareRHSSIntrinsicGlobalForceBase_zero_noteConstants_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) : + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) 0 * (5 * s⁻¹) ≤ + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let K : ℝ := 5 * s⁻¹ + let L : ℝ := (lambdaSqFinite Q (s / 2) 2 a)⁻¹ + let P : ℝ := coarsePoincareRHSParentHalfCoeff Q a s 0 + let M : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith [hs])) + have hKL_nonneg : 0 ≤ K * L := mul_nonneg hK_nonneg hL_nonneg + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact coarsePoincareRHSParentHalfCoeff_nonneg Q a hs 0 + have hP_le : P ≤ K * L := by + dsimp [P, K, L] + unfold coarsePoincareRHSParentHalfCoeff + simpa [lambdaSq, L] using + mul_le_mul_of_nonneg_right + (inv_geometricDiscount_two_le_five_inv hs hs_le) hL_nonneg + have hP_sq : P ^ 2 ≤ (K * L) ^ 2 := by + have habs : |P| ≤ |K * L| := by + simpa [abs_of_nonneg hP_nonneg, abs_of_nonneg hKL_nonneg] using hP_le + exact sq_le_sq.mpr habs + have hmult_nonneg : 0 ≤ (120 * s⁻¹) * M ^ 2 * B ^ 2 * K := by + dsimp [K, M, B] + positivity + calc + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) 0 * (5 * s⁻¹) + = P ^ 2 * ((120 * s⁻¹) * M ^ 2 * B ^ 2 * K) := by + simp [coarsePoincareRHSSIntrinsicGlobalForceBase, coarsePoincareRHSDepthWeight, + coarsePoincareRHSIntrinsicParentHalfForceMultiplier, + coarsePoincareRHSGlobalForceBound, P, M, B, K] + ring + _ ≤ (K * L) ^ 2 * ((120 * s⁻¹) * M ^ 2 * B ^ 2 * K) := by + exact mul_le_mul_of_nonneg_right hP_sq hmult_nonneg + _ = + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + simp [K, L, M, B, lambdaSq] + ring + +theorem coarsePoincareRHSSIntrinsicGlobalForceBase_noteConstants_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (m : ℕ) : + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m * (5 * s⁻¹) ≤ + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hK_nonneg : 0 ≤ 5 * s⁻¹ := by positivity + have hbase_le : + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m ≤ + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) 0 := + coarsePoincareRHSSIntrinsicGlobalForceBase_le_zero Q a g + hs.le (by positivity) m + exact + (mul_le_mul_of_nonneg_right hbase_le hK_nonneg).trans + (coarsePoincareRHSSIntrinsicGlobalForceBase_zero_noteConstants_le + Q a g hs hs_le) + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_eq_base_mul_geomSum + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s θ CE : ℝ) (m N : ℕ) : + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N = + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m * + ∑ k ∈ Finset.range N, (coarsePoincareRHSFiniteSumRatio s θ) ^ k := by + unfold coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum + coarsePoincareRHSSIntrinsicGlobalEnergyBase + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + have hcoeff := + coarsePoincareRHSWeightedDepthParentHalfCoeff_eq_base_mul_ratio_pow + Q a s θ m k + calc + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + (CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s (m + k) * + cubeAverage Q (coefficientEnergyDensity a u)))) + = + (CE * 2 * cubeAverage Q (coefficientEnergyDensity a u)) * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + coarsePoincareRHSParentHalfCoeff Q a s (m + k))) := by + ring + _ = + (CE * 2 * cubeAverage Q (coefficientEnergyDensity a u)) * + ((coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSParentHalfCoeff Q a s m) * + (coarsePoincareRHSFiniteSumRatio s θ) ^ k) := by + rw [hcoeff] + _ = + coarsePoincareRHSDepthWeight s m * + (CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s m * + cubeAverage Q (coefficientEnergyDensity a u))) * + (coarsePoincareRHSFiniteSumRatio s θ) ^ k := by + ring + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_le_base_mul_inv_one_sub + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s θ CE : ℝ) (m N : ℕ) + (hr_nonneg : 0 ≤ coarsePoincareRHSFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSFiniteSumRatio s θ < 1) + (hbase_nonneg : 0 ≤ coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m) : + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m * + (1 - coarsePoincareRHSFiniteSumRatio s θ)⁻¹ := by + rw [coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_eq_base_mul_geomSum] + exact mul_le_mul_of_nonneg_left + (geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one) hbase_nonneg + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_le_base_mul_inv_one_sub_of_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s θ CE : ℝ} (m N : ℕ) (hs : 0 < s) (hCE_nonneg : 0 ≤ CE) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (hr_nonneg : 0 ≤ coarsePoincareRHSFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSFiniteSumRatio s θ < 1) : + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m * + (1 - coarsePoincareRHSFiniteSumRatio s θ)⁻¹ := by + exact + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_le_base_mul_inv_one_sub + Q a u s θ CE m N hr_nonneg hr_lt_one + (coarsePoincareRHSSIntrinsicGlobalEnergyBase_nonneg + Q a u hs hCE_nonneg havg_nonneg m) + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_eq_base_mul_geomSum + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s θ CF : ℝ) (m N : ℕ) : + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N = + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m * + ∑ k ∈ Finset.range N, (coarsePoincareRHSForceFiniteSumRatio s θ) ^ k := by + unfold coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum + coarsePoincareRHSSIntrinsicGlobalForceBase + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + have hfactor := + coarsePoincareRHSIntrinsicWeightedForceFactor_eq_base_mul_ratio_pow + Q a g s θ m k + calc + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + (CF * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k)))) + = + CF * + ((coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k)))) := by + ring + _ = + CF * + ((coarsePoincareRHSDepthWeight s m * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) * + (coarsePoincareRHSForceFiniteSumRatio s θ) ^ k) := by + rw [hfactor] + _ = + coarsePoincareRHSDepthWeight s m * + (CF * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) * + (coarsePoincareRHSForceFiniteSumRatio s θ) ^ k := by + ring + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_le_base_mul_inv_one_sub + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s θ CF : ℝ) (m N : ℕ) + (hr_nonneg : 0 ≤ coarsePoincareRHSForceFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSForceFiniteSumRatio s θ < 1) + (hbase_nonneg : 0 ≤ coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m) : + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N ≤ + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m * + (1 - coarsePoincareRHSForceFiniteSumRatio s θ)⁻¹ := by + rw [coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_eq_base_mul_geomSum] + exact mul_le_mul_of_nonneg_left + (geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one) hbase_nonneg + +theorem coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_le_base_mul_inv_one_sub_of_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s θ CF : ℝ} (m N : ℕ) (hCF_nonneg : 0 ≤ CF) + (hr_nonneg : 0 ≤ coarsePoincareRHSForceFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSForceFiniteSumRatio s θ < 1) : + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N ≤ + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m * + (1 - coarsePoincareRHSForceFiniteSumRatio s θ)⁻¹ := by + exact + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_le_base_mul_inv_one_sub + Q a g s θ CF m N hr_nonneg hr_lt_one + (coarsePoincareRHSSIntrinsicGlobalForceBase_nonneg Q a g s hCF_nonneg m) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalIteration.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalIteration.lean new file mode 100644 index 0000000000..c3eb851fd4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalIteration.lean @@ -0,0 +1,347 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalizedIteration + +/-! # Global Iteration -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSSn_terminal_tendsto_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + {s θ : ℝ} (m : ℕ) + (hr_nonneg : 0 ≤ coarsePoincareRHSFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSFiniteSumRatio s θ < 1) + (hS_bdd : + BddAbove (Set.range fun n : ℕ => coarsePoincareRHSSn Q s u n)) : + Filter.Tendsto + (fun N : ℕ => + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N)) + Filter.atTop (nhds 0) := by + have hshift_bdd : + BddAbove (Set.range fun N : ℕ => coarsePoincareRHSSn Q s u (m + N)) := by + rcases hS_bdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro _ ⟨N, rfl⟩ + exact hB ⟨m + N, rfl⟩ + exact + tendsto_pow_mul_of_nonneg_bddAbove + (r := coarsePoincareRHSScaledStepCoeff s θ) + (F := fun N : ℕ => coarsePoincareRHSSn Q s u (m + N)) + (by simpa [coarsePoincareRHSFiniteSumRatio] using hr_nonneg) + (by simpa [coarsePoincareRHSFiniteSumRatio] using hr_lt_one) + (fun N => coarsePoincareRHSSn_nonneg Q s u (m + N)) + hshift_bdd + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergy_add_globalForce_of_terminal_tendsto + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η θ CE CF : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ_nonneg : 0 ≤ θ) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m : ℕ) {E F : ℝ} + (hterminal : + Filter.Tendsto + (fun N : ℕ => + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N)) + Filter.atTop (nhds 0)) + (hEbound : + ∀ N : ℕ, coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N ≤ E) + (hFbound : + ∀ N : ℕ, + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N ≤ F) : + coarsePoincareRHSSn Q s u m ≤ E + F := by + refine real_le_of_forall_le_add_of_tendsto_zero hterminal ?_ + intro N + have hiter := + coarsePoincareRHSSn_iterate_le_intrinsicGlobalEnergy_add_globalForce + Q a g u hs hEll hData hsum_half habs hθ_nonneg hθ hEcoeff + hFcoeff hCE_nonneg hCF_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hlocal m N + have hsum : + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N ≤ + E + F := + add_le_add (hEbound N) (hFbound N) + calc + coarsePoincareRHSSn Q s u m + ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N := + hiter + _ = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + (coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N) := by + ring + _ ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + (E + F) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hsum + ((coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N)) + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteStep_of_bddAbove + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η CE CF : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ coarsePoincareRHSNoteStepCoeff s) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hS_bdd : + BddAbove (Set.range fun n : ℕ => coarsePoincareRHSSn Q s u n)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m * + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ + + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m * + (1 - Real.rpow (3 : ℝ) (-(3 * s / 2)))⁻¹ := by + have hgeom := + coarsePoincareRHSSn_le_intrinsicGlobalEnergy_add_globalForce_of_terminal_tendsto + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) (η := η) + (θ := coarsePoincareRHSNoteStepCoeff s) (CE := CE) (CF := CF) + hs hEll hData hsum_half habs + (coarsePoincareRHSNoteStepCoeff_nonneg s) hθ hEcoeff hFcoeff + hCE_nonneg hCF_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd hlocal + (m := m) + (E := coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s CE m * + (1 - coarsePoincareRHSFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s))⁻¹) + (F := coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s CF m * + (1 - coarsePoincareRHSForceFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s))⁻¹) + (coarsePoincareRHSSn_terminal_tendsto_of_bddAbove + Q u m + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_nonneg s) + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_lt_one hs) + hS_bdd) + ?_ ?_ + · rw [coarsePoincareRHSFiniteSumRatio_noteStepCoeff_eq s, + coarsePoincareRHSForceFiniteSumRatio_noteStepCoeff_eq s] at hgeom + exact hgeom + · intro N + exact + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum_le_base_mul_inv_one_sub_of_nonneg + Q a u m N hs hCE_nonneg (havg_nonneg 0 Q (by simp)) + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_nonneg s) + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_lt_one hs) + · intro N + have hfr_nonneg : + 0 ≤ coarsePoincareRHSForceFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) := + coarsePoincareRHSForceFiniteSumRatio_nonneg_of_finiteSumRatio_nonneg + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_nonneg s) + have hfr_lt_one : + coarsePoincareRHSForceFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) < 1 := + coarsePoincareRHSForceFiniteSumRatio_lt_one_of_finiteSumRatio_lt_one + hs (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_nonneg s) + (coarsePoincareRHSFiniteSumRatio_noteStepCoeff_lt_one hs) + exact + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum_le_base_mul_inv_one_sub_of_nonneg + Q a g m N hCF_nonneg hfr_nonneg hfr_lt_one + +theorem coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteConstants + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s)) + (m : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 m * (5 * s⁻¹) + + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m * + (5 * s⁻¹) := by + have hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s))⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff (coarsePoincareRHSNoteEta s) ≤ 5 := by + simpa [coarsePoincareRHSNoteEnergyEnvelope] using + coarsePoincareRHSNoteEnergyEnvelope_le_five hs (by linarith : s ≤ 2) + have hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s))⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff (coarsePoincareRHSNoteEta s) ≤ + 120 * s⁻¹ := by + simpa [coarsePoincareRHSNoteForceEnvelope] using + coarsePoincareRHSNoteForceEnvelope_le_oneTwenty_mul_inv hs hs_le + have hCF_nonneg : 0 ≤ 120 * s⁻¹ := by positivity + have hraw := + coarsePoincareRHSSn_le_intrinsicGlobalEnergyForce_noteStep_of_bddAbove + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + (η := coarsePoincareRHSNoteEta s) (CE := 5) (CF := 120 * s⁻¹) + hs hEll hData hsum_half + (one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_pos hs) + (coarsePoincareRHS_noteEta_discount_le_noteStepCoeff hs) + hEcoeff hFcoeff (by norm_num : 0 ≤ (5 : ℝ)) hCF_nonneg + havg_nonneg hint hmem hGlobalBdd hLocalBdd + (coarsePoincareRHSSn_bddAbove_of_memLp Q hs u hu) hlocal m + have hEbase_nonneg : + 0 ≤ coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 m := + coarsePoincareRHSSIntrinsicGlobalEnergyBase_nonneg + Q a u hs (by norm_num) (havg_nonneg 0 Q (by simp)) m + have hFbase_nonneg : + 0 ≤ coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m := + coarsePoincareRHSSIntrinsicGlobalForceBase_nonneg Q a g s hCF_nonneg m + have hEfac : + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ ≤ 5 * s⁻¹ := + inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + have hFfac : + (1 - Real.rpow (3 : ℝ) (-(3 * s / 2)))⁻¹ ≤ 5 * s⁻¹ := + inv_one_sub_rpow_three_neg_three_half_le_five_inv hs hs_le + calc + coarsePoincareRHSSn Q s u m + ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 m * + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ + + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m * + (1 - Real.rpow (3 : ℝ) (-(3 * s / 2)))⁻¹ := hraw + _ ≤ + coarsePoincareRHSSIntrinsicGlobalEnergyBase Q a u s 5 m * (5 * s⁻¹) + + coarsePoincareRHSSIntrinsicGlobalForceBase Q a g s (120 * s⁻¹) m * + (5 * s⁻¹) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hEfac hEbase_nonneg) + (mul_le_mul_of_nonneg_left hFfac hFbase_nonneg) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalQuantities.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalQuantities.lean new file mode 100644 index 0000000000..8081796304 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/GlobalQuantities.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.NoteConstants + +/-! # Global Quantities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- The natural-depth scale weight used to pass from `R_n` to `S_n`. -/ +noncomputable def coarsePoincareRHSDepthWeight (s : ℝ) (n : ℕ) : ℝ := + Real.rpow (3 : ℝ) (-s * (n : ℝ)) + +/-- Natural-depth version of the note's averaged `R_n` quantity. -/ +noncomputable def coarsePoincareRHSRn {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 + +@[simp] theorem coarsePoincareRHSRn_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : + coarsePoincareRHSRn Q s u 0 = + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 := by + simp [coarsePoincareRHSRn, descendantsAverage] + +/-- Natural-depth version of the note's scaled `S_n` quantity. -/ +noncomputable def coarsePoincareRHSSn {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (n : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s n * coarsePoincareRHSRn Q s u n + +@[simp] theorem coarsePoincareRHSDepthWeight_zero (s : ℝ) : + coarsePoincareRHSDepthWeight s 0 = 1 := by + simp [coarsePoincareRHSDepthWeight] + +@[simp] theorem coarsePoincareRHSSn_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : + coarsePoincareRHSSn Q s u 0 = + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 := by + simp [coarsePoincareRHSSn] + +/-- Averaged intrinsic local error appearing in the absorbed `R_n` recurrence. -/ +noncomputable def coarsePoincareRHSIntrinsicAbsorbedErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η + +/-- Averaged intrinsic local energy piece in the absorbed `R_n` recurrence. -/ +noncomputable def coarsePoincareRHSIntrinsicEnergyErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => coarsePoincareRHSIntrinsicLocalEnergyError R a u s + +/-- Averaged intrinsic local forcing piece in the absorbed `R_n` recurrence. -/ +noncomputable def coarsePoincareRHSIntrinsicForceErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => coarsePoincareRHSIntrinsicLocalForceError R a g s + +/-- Intrinsic localized one-step error after absorption and parent coefficient localization. -/ +noncomputable def coarsePoincareRHSIntrinsicLocalizedEnergyForceError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s CE CF : ℝ) (B : ℕ → ℝ) (n : ℕ) : ℝ := + CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u)) + + CF * ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * B n) + +/-- Finite weighted intrinsic localized-error sum produced by iterating the localized recurrence. -/ +noncomputable def coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s θ CE CF : ℝ) (B : ℕ → ℝ) (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + θ ^ k * coarsePoincareRHSIntrinsicLocalizedEnergyForceError Q a u s CE CF B (m + k) + +/-- Scaled intrinsic localized-error sum produced by the localized `S_n` recurrence. -/ +noncomputable def coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s θ CE CF : ℝ) (B : ℕ → ℝ) (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + coarsePoincareRHSIntrinsicLocalizedEnergyForceError Q a u s CE CF B (m + k)) + +/-- Intrinsic energy part of the scaled localized global-force error sum. -/ +noncomputable def coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s θ CE : ℝ) (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + (CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s (m + k) * + cubeAverage Q (coefficientEnergyDensity a u)))) + +/-- The `k = 0` intrinsic energy coefficient for the scaled global-force finite sum. -/ +noncomputable def coarsePoincareRHSSIntrinsicGlobalEnergyBase {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s CE : ℝ) (m : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s m * + (CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s m * + cubeAverage Q (coefficientEnergyDensity a u))) + +/-- Intrinsic force part of the scaled localized global-force error sum. -/ +noncomputable def coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s θ CF : ℝ) (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + (CF * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k)))) + +/-- The `k = 0` intrinsic force coefficient for the scaled global-force finite sum. -/ +noncomputable def coarsePoincareRHSSIntrinsicGlobalForceBase {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s CF : ℝ) (m : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s m * + (CF * + ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s m) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s m)) + +theorem coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum_global_eq_energy_add_force + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (s θ CE CF : ℝ) (m N : ℕ) : + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF + (fun n => coarsePoincareRHSGlobalForceBound Q g s n) m N = + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N := by + unfold coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum + coarsePoincareRHSIntrinsicLocalizedEnergyForceError + rw [← Finset.sum_add_distrib] + refine Finset.sum_congr rfl ?_ + intro k hk + ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalCorrector.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalCorrector.lean new file mode 100644 index 0000000000..7591ca0295 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalCorrector.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization + +/-! # Local Corrector -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem cubeAverageVec_eq_of_eq_add_grad_on_cubeSet + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u v : Vec d → Vec d} + (huv : ∀ x ∈ cubeSet Q, u x = v x + ρ.toH10.toH1Function.grad x) + (hv : MemVectorL2 (cubeSet Q) v) : + cubeAverageVec Q u = cubeAverageVec Q v := by + funext i + have hui : + cubeAverage Q (fun x => u x i) = + cubeAverage Q (fun x => v x i + ρ.toH10.toH1Function.grad x i) := by + apply cubeAverage_eq_of_eq_on_cubeSet + intro x hx + simpa using congrArg (fun z => z i) (huv x hx) + show cubeAverage Q (fun x => u x i) = cubeAverage Q (fun x => v x i) + rw [hui] + unfold cubeAverage + have hvi : + MeasureTheory.MemLp (fun x => v x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + have hvi_int : + MeasureTheory.Integrable (fun x => v x i) (volumeMeasureOn (cubeSet Q)) := + hvi.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hρi_int : + MeasureTheory.Integrable (fun x => ρ.toH10.toH1Function.grad x i) + (volumeMeasureOn (cubeSet Q)) := + (ρ.toH10.toH1Function.grad_memL2 i).integrable + (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hzero : + (fun i => ∫ x in cubeSet Q, ρ.toH10.toH1Function.grad x i ∂MeasureTheory.volume) = 0 := + IsPotentialZeroTraceOn.integral_eq_zero ρ.toH10.isPotentialZeroTraceOn + have hzeroi : ∫ x in cubeSet Q, ρ.toH10.toH1Function.grad x i ∂MeasureTheory.volume = 0 := by + simpa using congrFun hzero i + rw [MeasureTheory.integral_add hvi_int hρi_int, hzeroi] + simp [volumeMeasureOn] + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_two_mul_add + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) (N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x)) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + have hEq : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) = + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => u x - w.toH1.grad x) := by + apply cubeBesovNegativeVectorPartialSeminormTwo_eq_of_eq_on_cubeSet s N + intro x hx + ext i + change ρ.toH10.toH1Function.grad x i = u x i - w.toH1.grad x i + have hcoord : u x i = w.toH1.grad x i + ρ.toH10.toH1Function.grad x i := by + simpa using congrArg (fun z => z i) (huw x hx) + linarith + rw [hEq] + exact + sq_cubeBesovNegativeVectorPartialSeminormTwo_sub_le_two_mul_add + Q s u (fun x => w.toH1.grad x) hu w.toH1.grad_memVectorL2 N + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + have hsq := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_two_mul_add + (u := u) w huw hu s N + have hρ_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N + (fun x => ρ.toH10.toH1Function.grad x) + have hu_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hw_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N + (fun x => w.toH1.grad x) + have hsum_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => w.toH1.grad x) := + add_nonneg hu_nonneg hw_nonneg + have hsq_bound : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x)) ^ 2 ≤ + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x)) ^ 2 + ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := hsq + _ ≤ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + nlinarith + _ = (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + have hsqrt2 : (Real.sqrt 2) ^ 2 = (2 : ℝ) := by + nlinarith [Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + calc + 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 + = + (Real.sqrt 2) ^ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + rw [hsqrt2] + _ = + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + ring + have hright_nonneg : + 0 ≤ Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + exact mul_nonneg (Real.sqrt_nonneg _) hsum_nonneg + nlinarith + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bounds + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) {Bu Bw : ℝ} + (huB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hwB : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x) ≤ Bw) : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt 2 * (Bu + Bw) := by + intro N + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) + ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + exact + ρ.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add + (u := u) w huw hu s N + _ ≤ Real.sqrt 2 * (Bu + Bw) := by + exact mul_le_mul_of_nonneg_left + (add_le_add (huB N) (hwB N)) (Real.sqrt_nonneg _) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x)) := by + exact + ρ.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bounds + (u := u) w huw hu s + (Bu := cubeBesovNegativeVectorSeminormTwo Q s u) + (Bw := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s u huBdd N) + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => w.toH1.grad x) hwBdd N) + + + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms.lean new file mode 100644 index 0000000000..336055ae43 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Stepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Bounded +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Intrinsic + +/-! # Local Note Terms -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Bounded.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Bounded.lean new file mode 100644 index 0000000000..ec9f057be3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Bounded.lean @@ -0,0 +1,651 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Stepping + +/-! # Bounded -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_two_two_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {η : ℝ} + (hs : 0 < s) (hη : 0 < η) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + η * (cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + let Child : ℝ := + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + let A : ℝ := 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + let D : ℝ := 2 * K + have hnegρ : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt 2 * (U + W) := by + dsimp [U, W] + exact + ρ.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bddAbove + (u := u) w huw hu s huBdd hwBdd + have hposg : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ G := by + intro N + dsimp [G] + exact + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hgBdd N + have hmain := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_centeredCollapsedNoteTerm_two_two + (u := u) w s hs N hEll hu hgrad hsum huw hmem hg hgradρ hBg hnegρ hposg + have hmain' : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Child + A + D * (U + W) * G := by + dsimp [Child, U, W, G, C, A, K, D] at hmain ⊢ + simpa [mul_assoc, mul_left_comm, mul_comm, left_distrib, right_distrib] using hmain + have hcross : + D * (U + W) * G ≤ η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + have hraw := add_bilinear_term_le_add_eta_sq_add_invEta_sq + (D := D) (U := U) (W := W) (G := G) hη + have hhalf : (D / 2) * G = K * G := by + dsimp [D] + ring + calc + D * (U + W) * G ≤ + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2) := hraw + _ = η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + rw [hhalf] + have hfinal : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Child + A + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + linarith + simpa [Child, U, W, G, C, A, K] using hfinal + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_harmonic_le_uCoeffEnergy_add_correctorShortTerm_two_two_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) (hs : 0 < s) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 ≤ + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) := by + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let Short : ℝ := + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * (Real.sqrt 2 * (U + W)) * G) + have hharmonic := + sq_coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) N + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll + (fun x => w.toH1.grad x)) + (integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + w.toH1.grad_memVectorL2) + hgrad hsum + have hnegρ : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ + Real.sqrt 2 * (U + W) := by + dsimp [U, W] + exact + ρ.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bddAbove + (u := u) w huw hu s huBdd hwBdd + have hposg : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ G := by + intro N + dsimp [G] + exact + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hgBdd N + have hρenergy : + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ + Short := by + dsimp [Short, U, W, G] + exact + ρ.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + s hs hmem hg hgradρ hBg hnegρ hposg + have hwavg := + ρ.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := u) w hEll huw hu + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => w.toH1.grad x)) ^ 2 + ≤ C * cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) := by + simpa [C] using hharmonic + _ ≤ C * + (2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x))) := by + exact mul_le_mul_of_nonneg_left hwavg hC_nonneg + _ ≤ C * + (2 * cubeAverage Q (coefficientEnergyDensity a u) + 2 * Short) := by + exact mul_le_mul_of_nonneg_left (by gcongr) hC_nonneg + _ = 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * Short := by + ring + _ = + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) := by + simp [C, Short, U, W, G] + +theorem sq_cubeBesovNegativeVectorSeminormTwo_harmonic_le_uCoeffEnergy_add_correctorShortTerm_two_two_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) ^ 2 ≤ + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) := by + let B : ℝ := + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + have huSem_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s u := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s u huBdd + have hwSem_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s + (fun x => w.toH1.grad x) hwBdd + have hgSem_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hgBdd + have hB_nonneg : 0 ≤ B := by + dsimp [B] + refine add_nonneg ?_ ?_ + · refine mul_nonneg ?_ ?_ + · refine mul_nonneg (by norm_num) ?_ + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + · exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll u) + · refine mul_nonneg ?_ ?_ + · refine mul_nonneg (by norm_num) ?_ + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + · refine mul_nonneg (by positivity) ?_ + refine mul_nonneg ?_ hgSem_nonneg + refine mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) ?_ + exact mul_nonneg (Real.sqrt_nonneg _) (add_nonneg huSem_nonneg hwSem_nonneg) + have hpartial : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 ≤ B := by + intro N + dsimp [B] + exact + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_harmonic_le_uCoeffEnergy_add_correctorShortTerm_two_two_of_bddAbove + (u := u) w s hs N hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd + simpa [B] using + sq_cubeBesovNegativeVectorSeminormTwo_le_of_partialSqBound + (Q := Q) (s := s) (u := fun x => w.toH1.grad x) hB_nonneg hpartial + +theorem sq_cubeBesovNegativeVectorSeminormTwo_harmonic_le_uCoeffEnergy_add_eta_uSq_add_invEta_gSq_two_two_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {η : ℝ} + (hs : 0 < s) (hη : 0 < η) (hη_lt : η < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) ^ 2 ≤ + (1 - η)⁻¹ * + (2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2)) := by + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + let A : ℝ := 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + let D : ℝ := 2 * K + have hmain := + ρ.sq_cubeBesovNegativeVectorSeminormTwo_harmonic_le_uCoeffEnergy_add_correctorShortTerm_two_two_of_bddAbove + (u := u) w s hs hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd + have hmain' : W ^ 2 ≤ A + D * (U + W) * G := by + dsimp [U, W, G, C, A, K, D] at hmain ⊢ + simpa [mul_assoc, mul_left_comm, mul_comm, left_distrib, right_distrib] using hmain + have habsorb := + sq_le_inv_one_sub_mul_add_of_sq_le_add_bilinear_term + (A := A) (D := D) (U := U) (W := W) (G := G) hη hη_lt hmain' + have hhalf : (D / 2) * G = K * G := by + dsimp [D] + ring + have hfinal : + W ^ 2 ≤ (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2)) := by + calc + W ^ 2 ≤ + (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2)) := + habsorb + _ = (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2)) := by + rw [hhalf] + simpa [U, W, G, C, A, K] using hfinal + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_absorbed_uSq_gSq_two_two_of_bddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {η : ℝ} + (hs : 0 < s) (hη : 0 < η) (hη_lt : η < 1) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + η * + ((1 - η)⁻¹ * + (2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2))) + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + let Child : ℝ := + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + let A : ℝ := 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + let H : ℝ := (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2)) + have hrec := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_two_two_of_bddAbove + (u := u) w s hs hη N hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd + have hrec' : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Child + A + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + simpa [Child, U, W, G, C, A, K] using hrec + have hharm := + ρ.sq_cubeBesovNegativeVectorSeminormTwo_harmonic_le_uCoeffEnergy_add_eta_uSq_add_invEta_gSq_two_two_of_bddAbove + (u := u) w s hs hη hη_lt hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd + have hharm' : W ^ 2 ≤ H := by + simpa [W, G, C, A, K, H, U] using hharm + have hηW : η * W ^ 2 ≤ η * H := + mul_le_mul_of_nonneg_left hharm' hη.le + have hfinal : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Child + A + η * U ^ 2 + η * H + 2 * η⁻¹ * ((K * G) ^ 2) := by + linarith + simpa [Child, U, G, C, A, K, H] using hfinal + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_uCoeffEnergy_add_absorbed_uSq_gSq_two_two_of_partialChildBounds + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {η : ℝ} (Bchild : TriadicCube d → ℝ) + (hs : 0 < s) (hη : 0 < η) (hη_lt : η < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) + (hchild : + ∀ R ∈ descendantsAtDepth Q 1, ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo R s N u ≤ Bchild R) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + η * + ((1 - η)⁻¹ * + (2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2))) + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + let Echild : ℝ := + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + let A : ℝ := 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + let H : ℝ := (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2)) + let F : ℝ := A + η * U ^ 2 + η * H + 2 * η⁻¹ * ((K * G) ^ 2) + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg + (mul_nonneg (by norm_num) hC_nonneg) + (cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll u)) + have hone_sub : 0 < 1 - η := by linarith + have hH_nonneg : 0 ≤ H := by + dsimp [H] + refine mul_nonneg (inv_nonneg.mpr hone_sub.le) ?_ + refine add_nonneg (add_nonneg hA_nonneg ?_) ?_ + · exact mul_nonneg hη.le (sq_nonneg U) + · exact mul_nonneg (mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le)) (sq_nonneg (K * G)) + have hF_nonneg : 0 ≤ F := by + dsimp [F] + refine add_nonneg (add_nonneg (add_nonneg hA_nonneg ?_) ?_) ?_ + · exact mul_nonneg hη.le (sq_nonneg U) + · exact mul_nonneg hη.le hH_nonneg + · exact mul_nonneg (mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le)) (sq_nonneg (K * G)) + have hEchild_nonneg : 0 ≤ Echild := by + dsimp [Echild] + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (descendantsAverage_nonneg Q 1 _ fun R hR => sq_nonneg (Bchild R)) + have hB_nonneg : 0 ≤ Echild + F := add_nonneg hEchild_nonneg hF_nonneg + have hlocal : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + F := by + intro N + have hN := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_absorbed_uSq_gSq_two_two_of_bddAbove + (u := u) w s hs hη hη_lt N hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd + simpa [U, G, C, A, K, H, F, add_assoc] using hN + have hfull := + sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_of_succ_partialBound + (Q := Q) (s := s) (u := u) Bchild hB_nonneg hlocal hchild + simpa [Echild, U, G, C, A, K, H, F, add_assoc] using hfull + + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Intrinsic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Intrinsic.lean new file mode 100644 index 0000000000..e183c0c321 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Intrinsic.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalNoteTerms.Bounded + +/-! # Intrinsic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_intrinsicAbsorbedLocalError_two_two_of_childBddAbove + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {η : ℝ} + (hs : 0 < s) (hη : 0 < η) (hη_lt : η < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) + + coarsePoincareRHSIntrinsicAbsorbedLocalError Q a g u s η := by + have hchild : + ∀ R ∈ descendantsAtDepth Q 1, ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo R s N u ≤ + cubeBesovNegativeVectorSeminormTwo R s u := by + intro R hR N + exact + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s u (hchildBdd R hR) N + have hmain := + ρ.sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_uCoeffEnergy_add_absorbed_uSq_gSq_two_two_of_partialChildBounds + (u := u) w s (Bchild := fun R => cubeBesovNegativeVectorSeminormTwo R s u) + hs hη hη_lt hEll hu hgrad hsum huw + hmem hg hgradρ hBg huBdd hwBdd hgBdd hchild + simpa [coarsePoincareRHSIntrinsicAbsorbedLocalError, + coarsePoincareRHSIntrinsicLocalEnergyError, + coarsePoincareRHSIntrinsicLocalForceMultiplier, + coarsePoincareRHSLocalCenteredForceSeminorm, + coarsePoincareRHSLocalCoeff, add_assoc] using hmain + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_intrinsicAbsorbedLocalError_noteEta_of_parent_potential_solenoidal + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {n : ℕ} + {a : CoeffField d} {g u : Vec d → Vec d} {lam Lam s : ℝ} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth Q n) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hLocalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s + (coarsePoincareRHSNoteEta s) := by + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgR : + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hgMemR : MemVectorL2 (cubeSet R) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure R hgR + have hu_potential_R : IsPotentialOn (cubeSet R) u := + hu_potential.restrict_cubeSet_of_mem_descendantsAtDepth hR + have huMemR : MemVectorL2 (cubeSet R) u := by + rcases hu_potential_R with ⟨v, hv⟩ + simpa [← hv] using v.grad_memVectorL2 + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantSigmaStarInvNormAtScale R (R.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeOriginEllipticRecoveryExistence + (Q := R) (a := a) s hs hEllR hOrigin + rcases + ZeroTraceDirichletCorrectorData.exists_corrector_aHarmonicRemainder_of_parent_potential_solenoidal + (Q := Q) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) + hu_potential hu_residual hR hEllR huMemR hgMemR with + ⟨ρ, w, huw⟩ + have hgradScalar : + CubeAverageGradientEnergyControl R a (fun x => w.toH1.grad x) + (fun x => scalarVariationEnergyIntegrand a w x) := + cubeAverageGradientEnergyControl_of_aHarmonicFunction_of_openCubeOriginEllipticRecoveryExistence + (Q := R) (a := a) hEllR w hOrigin + have hgradCoeff : + CubeAverageGradientEnergyControl R a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) := by + simpa [coefficientEnergyDensity, scalarVariationEnergyIntegrand] using! hgradScalar + have hη_pos : 0 < coarsePoincareRHSNoteEta s := + coarsePoincareRHSNoteEta_pos hs + have hη_lt_one : coarsePoincareRHSNoteEta s < 1 := by + have hη_lt_half := coarsePoincareRHSNoteEta_lt_half hs + linarith + have huLp : + MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R huMemR + have hwLp : + MeasureTheory.MemLp (fun x => w.toH1.grad x) (2 : ENNReal) + (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R w.toH1.grad_memVectorL2 + have hgradρ : + MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R + ρ.toH10.toH1Function.grad_memVectorL2 + have huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs u huLp + have hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs + (fun x => w.toH1.grad x) hwLp + have hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N u) := by + intro S hS + have huS : + MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure S) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hS huLp + exact cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp S hs u huS + have hmemDesc : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth R j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro j S hS + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hS hgR + have hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g)) := by + rcases hLocalBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro x ⟨N, rfl⟩ + change + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g) ≤ B + rw [cubeBesovPositiveVectorPartialSeminormTwo_sub_const R s N g + (cubeAverageVec R g) (fun j _ S hS => hmemDesc j S hS)] + exact hB ⟨N, rfl⟩ + have hBg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g) := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove + R s (fun x => g x - cubeAverageVec R g) hgBdd + have hmain := + ρ.sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_intrinsicAbsorbedLocalError_two_two_of_childBddAbove + (u := u) w s hs hη_pos hη_lt_one hEllR huMemR hgradCoeff hsum huw + hgMemR hgR hgradρ hBg huBdd hwBdd hgBdd hchildBdd + simpa [coarsePoincareRHSDiscount, coarsePoincareRHSRn] using hmain + + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Stepping.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Stepping.lean new file mode 100644 index 0000000000..43f90aa382 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalNoteTerms/Stepping.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep + +/-! # Stepping -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_centeredCollapsedNoteTerm_two_two + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) {Bρ Bg : ℝ} + (hs : 0 < s) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hmem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradρ : MeasureTheory.MemLp (fun x => ρ.toH10.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ρ.toH10.toH1Function.grad x) ≤ Bρ) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ Bg) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg)) := by + have hρenergy : + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bρ * Bg) := + ρ.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + s hs hmem hg hgradρ hBg hneg hpos + exact + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_of_correctorCoeffEnergyBound + (u := u) w s hs N hEll hu_mem hgrad hsum huw hρenergy + + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep.lean new file mode 100644 index 0000000000..549e48a7cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.HarmonicStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalStep.DiscountNext + +/-! # Local Step -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/DiscountNext.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/DiscountNext.lean new file mode 100644 index 0000000000..cd0f132a75 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/DiscountNext.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + +@[expose] public section + +namespace Homogenization + +noncomputable section + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/HarmonicStepping.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/HarmonicStepping.lean new file mode 100644 index 0000000000..d9ae803fcc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalStep/HarmonicStepping.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.LocalCorrector + +/-! # Harmonic Stepping -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace ZeroTraceDirichletCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_harmonic_zero + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (N : ℕ) (s : ℝ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (fun x => w.toH1.grad x)) ^ 2 := by + have hwavg : + cubeAverageVec Q u = cubeAverageVec Q (fun x => w.toH1.grad x) := + ρ.cubeAverageVec_eq_of_eq_add_grad_on_cubeSet huw w.toH1.grad_memVectorL2 + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_eq_top_add_descendantsAverage] + have htop : + vecNormSq (cubeAverageVec Q u) ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (fun x => w.toH1.grad x)) ^ 2 := by + rw [hwavg, sq_cubeBesovNegativeVectorPartialSeminormTwo] + simp [sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] + calc + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (fun x => w.toH1.grad x)) ^ 2 + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + exact add_le_add htop le_rfl + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (fun x => w.toH1.grad x)) ^ 2 := by + ring + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_harmonic_energy + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) (N : ℕ) (energy : Vec d → ℝ) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hgrad : CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + have hsplit := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_harmonic_zero + (u := u) w huw N s + have hharmonic := + sq_coarsePoincare_gradient_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs (fun x => w.toH1.grad x) energy 0 + henergy_nonneg henergy_int hgrad hsum + have hstep : + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (fun x => w.toH1.grad x)) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ * + cubeAverage Q energy := by + simpa [add_comm, add_left_comm, add_assoc] using + (add_le_add_right hharmonic + (Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2))) + exact le_trans hsplit hstep + + +/-- Coefficient-energy version of the elementary split estimate +`w = u - grad rho`. + +This is the local algebraic replacement for the older Euclidean +`vecNormSq` split. The ellipticity hypotheses only certify that the +symmetric coefficient quadratic form is non-negative/integrable; the estimate +itself has the universal constant `2`. -/ +theorem cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) : + cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) := by + let ρgrad : Vec d → Vec d := fun x => ρ.toH10.toH1Function.grad x + have hwEnergy_int : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + w.toH1.grad_memVectorL2 + have huEnergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hu + have hρEnergy_int : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a ρgrad) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + ρ.toH10.toH1Function.grad_memVectorL2 + have hpoint : + ∀ x ∈ cubeSet Q, + coefficientEnergyDensity a (fun y => w.toH1.grad y) x ≤ + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ρgrad x) := by + intro x hx + have hwsub : w.toH1.grad x = u x - ρgrad x := by + ext i + change w.toH1.grad x i = u x i - ρ.toH10.toH1Function.grad x i + have hcoord : u x i = w.toH1.grad x i + ρ.toH10.toH1Function.grad x i := by + simpa using congrArg (fun z => z i) (huw x hx) + linarith + have hsub := + coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + hEll u ρgrad x hx + have hEq : + coefficientEnergyDensity a (fun y => w.toH1.grad y) x = + coefficientEnergyDensity a (fun y => u y - ρgrad y) x := by + simp [coefficientEnergyDensity, hwsub] + exact hEq.trans_le hsub + have havg_raw : + cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + cubeAverage Q + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ρgrad x)) := by + unfold cubeAverage + have hvol_inv_nonneg : 0 ≤ (cubeVolume Q)⁻¹ := by + exact inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q)) + refine mul_le_mul_of_nonneg_left ?_ hvol_inv_nonneg + exact + MeasureTheory.integral_mono_ae hwEnergy_int + ((huEnergy_int.add hρEnergy_int).const_mul (2 : ℝ)) + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => hpoint x hx) + have hsplit : + cubeAverage Q + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ρgrad x)) = + 2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q (coefficientEnergyDensity a ρgrad) := by + unfold cubeAverage + have hfun : + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ρgrad x)) = + (fun x => + 2 * coefficientEnergyDensity a u x + + 2 * coefficientEnergyDensity a ρgrad x) := by + funext x + ring + rw [hfun, MeasureTheory.integral_add (huEnergy_int.const_mul (2 : ℝ)) + (hρEnergy_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + exact havg_raw.trans_eq hsplit + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) (hs : 0 < s) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) := by + have hharmonic := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_harmonic_energy + (u := u) w s hs N (coefficientEnergyDensity a (fun x => w.toH1.grad x)) + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll (fun x => w.toH1.grad x)) + (integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + w.toH1.grad_memVectorL2) + hgrad hsum huw + have hwavg := + ρ.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := u) w hEll huw hu + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + let C : ℝ := (geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹ + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + C * cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) := by + simpa [C] using hharmonic + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + C * + (2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) := by + have hmul : + C * cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + C * + (2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x))) := + mul_le_mul_of_nonneg_left hwavg hC_nonneg + simpa [add_comm, add_left_comm, add_assoc] using + (add_le_add_right hmul + (Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2))) + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) := by + ring + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) := by + simp [C] + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_of_correctorCoeffEnergyBound + (ρ : ZeroTraceDirichletCorrectorData Q a g) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} (s : ℝ) (hs : 0 < s) (N : ℕ) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : MemVectorL2 (cubeSet Q) u) + (hgrad : + CubeAverageGradientEnergyControl Q a (fun x => w.toH1.grad x) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, u x = w.toH1.grad x + ρ.toH10.toH1Function.grad x) + {Eρ : ℝ} + (hρenergy : + cubeAverage Q + (coefficientEnergyDensity a (fun x => ρ.toH10.toH1Function.grad x)) ≤ Eρ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * Eρ := by + have hpre := + ρ.sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy + (u := u) w s hs N hEll hu hgrad hsum huw + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hlambda_nonneg : 0 ≤ lambdaSq Q s (.finite 2) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s 2 a (by norm_num) + (by nlinarith [hs]) + have hC_nonneg : + 0 ≤ 2 * ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) := by + refine mul_nonneg (by norm_num) ?_ + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (inv_nonneg.mpr hlambda_nonneg) + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ρ.toH10.toH1Function.grad x)) := hpre + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * + ((geometricDiscount s 2)⁻¹ * (lambdaSq Q s (.finite 2) a)⁻¹) * Eρ := by + gcongr + + +end ZeroTraceDirichletCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalizedIteration.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalizedIteration.lean new file mode 100644 index 0000000000..a0f0b65bdb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/LocalizedIteration.lean @@ -0,0 +1,349 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal + +/-! # Localized Iteration -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSRn_iterate_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η θ CE CF : ℝ} (B : ℕ → ℝ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ_nonneg : 0 ≤ θ) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hforceAvg : + ∀ n : ℕ, + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ B n) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m N : ℕ) : + coarsePoincareRHSRn Q s u m ≤ + θ ^ N * coarsePoincareRHSRn Q s u (m + N) + + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N := by + let E : ℕ → ℝ := fun n => + coarsePoincareRHSIntrinsicLocalizedEnergyForceError Q a u s CE CF B n + have hstep : + ∀ n : ℕ, + coarsePoincareRHSRn Q s u n ≤ θ * coarsePoincareRHSRn Q s u (n + 1) + E n := by + intro n + have hloc := + coarsePoincareRHSRn_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + Q a g u n hs hEll hData hsum_half habs hθ hEcoeff hFcoeff + hCE_nonneg hCF_nonneg (havg_nonneg n) hint hmem (hforceAvg n) (hlocal n) + calc + coarsePoincareRHSRn Q s u n + ≤ + θ * coarsePoincareRHSRn Q s u (n + 1) + + CE * + (2 * coarsePoincareRHSParentHalfCoeff Q a s n * + cubeAverage Q (coefficientEnergyDensity a u)) + + CF * ((coarsePoincareRHSIntrinsicParentHalfForceMultiplier Q a s n) ^ 2 * + B n) := hloc + _ = + θ * coarsePoincareRHSRn Q s u (n + 1) + E n := by + simp [E, coarsePoincareRHSIntrinsicLocalizedEnergyForceError] + ring + simpa [E, coarsePoincareRHSRn, + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum] using + real_forward_recurrence_iterate_le + (R := fun n => coarsePoincareRHSRn Q s u n) (E := E) + hθ_nonneg hstep m N + +theorem coarsePoincareRHSSn_iterate_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η θ CE CF : ℝ} (B : ℕ → ℝ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ_nonneg : 0 ≤ θ) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hforceAvg : + ∀ n : ℕ, + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ B n) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m N : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N := by + have hR := + coarsePoincareRHSRn_iterate_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + Q a g u B hs hEll hData hsum_half habs hθ_nonneg hθ hEcoeff hFcoeff + hCE_nonneg hCF_nonneg havg_nonneg hint hmem hforceAvg hlocal m N + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s m := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmul : + coarsePoincareRHSDepthWeight s m * coarsePoincareRHSRn Q s u m ≤ + coarsePoincareRHSDepthWeight s m * + (θ ^ N * coarsePoincareRHSRn Q s u (m + N) + + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N) := by + exact mul_le_mul_of_nonneg_left hR hweight_nonneg + calc + coarsePoincareRHSSn Q s u m + = coarsePoincareRHSDepthWeight s m * coarsePoincareRHSRn Q s u m := by + rfl + _ ≤ + coarsePoincareRHSDepthWeight s m * + (θ ^ N * coarsePoincareRHSRn Q s u (m + N) + + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N) := hmul + _ = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF B m N := by + have hterm : + coarsePoincareRHSDepthWeight s m * + (θ ^ N * coarsePoincareRHSRn Q s u (m + N)) = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + (coarsePoincareRHSDepthWeight s (m + N) * + coarsePoincareRHSRn Q s u (m + N)) := by + rw [← mul_assoc, + coarsePoincareRHSDepthWeight_mul_theta_pow_eq_scaledStepCoeff_mul + s θ m N] + ring + have herr : + coarsePoincareRHSDepthWeight s m * + coarsePoincareRHSIntrinsicWeightedLocalizedEnergyForceErrorSum + Q a u s θ CE CF B m N = + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum + Q a u s θ CE CF B m N := + coarsePoincareRHSDepthWeight_mul_intrinsicWeightedLocalizedEnergyForceErrorSum_eq + Q a u s θ CE CF B m N + rw [mul_add, hterm, herr] + rfl + +theorem coarsePoincareRHSSn_iterate_le_intrinsicLocalizedEnergyForce_of_globalForceBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η θ CE CF : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ_nonneg : 0 ≤ θ) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m N : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF + (fun n => coarsePoincareRHSGlobalForceBound Q g s n) m N := by + refine + coarsePoincareRHSSn_iterate_le_intrinsicLocalizedEnergyForce_of_forceAverageBound + Q a g u + (fun n => coarsePoincareRHSGlobalForceBound Q g s n) + hs hEll hData hsum_half habs hθ_nonneg hθ hEcoeff hFcoeff + hCE_nonneg hCF_nonneg havg_nonneg hint hmem ?_ hlocal m N + intro n + exact + descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + Q g s n hGlobalBdd (hLocalBdd n) + +theorem coarsePoincareRHSSn_iterate_le_intrinsicGlobalEnergy_add_globalForce + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) {s lam Lam η θ CE CF : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : + ∀ j ≤ Q.scale, ∀ S ∈ descendantsAtScale Q j, + ∃ sigmaS sigmaStarS kappaS, + IsCoarseBlockMatrix (openCubeSet S) a + (deterministicCoarseBlockMatrix (openCubeSet S) a) ∧ + IsSigmaStarCoarse (openCubeSet S) a sigmaStarS ∧ + IsKappaCoarse (openCubeSet S) a sigmaStarS kappaS ∧ + IsSigmaCoarse (openCubeSet S) a sigmaS sigmaStarS kappaS ∧ + IsUnit sigmaStarS.det) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (habs : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff η) + (hθ_nonneg : 0 ≤ θ) + (hθ : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSDiscount s ≤ θ) + (hEcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedEnergyCoeff η ≤ CE) + (hFcoeff : + (1 - coarsePoincareRHSAbsorbedRnCoeff η)⁻¹ * + coarsePoincareRHSAbsorbedForceCoeff η ≤ CF) + (hCE_nonneg : 0 ≤ CE) (hCF_nonneg : 0 ≤ CF) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hlocal : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 ≤ + coarsePoincareRHSDiscount s * coarsePoincareRHSRn R s u 1 + + coarsePoincareRHSIntrinsicAbsorbedLocalError R a g u s η) + (m N : ℕ) : + coarsePoincareRHSSn Q s u m ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N := by + calc + coarsePoincareRHSSn Q s u m ≤ + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum Q a u s θ CE CF + (fun n => coarsePoincareRHSGlobalForceBound Q g s n) m N := + coarsePoincareRHSSn_iterate_le_intrinsicLocalizedEnergyForce_of_globalForceBound + Q a g u hs hEll hData hsum_half habs hθ_nonneg hθ hEcoeff + hFcoeff hCE_nonneg hCF_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hlocal m N + _ = + (coarsePoincareRHSScaledStepCoeff s θ) ^ N * + coarsePoincareRHSSn Q s u (m + N) + + coarsePoincareRHSSIntrinsicWeightedGlobalEnergyErrorSum Q a u s θ CE m N + + coarsePoincareRHSSIntrinsicWeightedGlobalForceErrorSum Q a g s θ CF m N := by + rw [coarsePoincareRHSSIntrinsicWeightedLocalizedEnergyForceErrorSum_global_eq_energy_add_force] + ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/NoteConstants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/NoteConstants.lean new file mode 100644 index 0000000000..57b54836a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/NoteConstants.lean @@ -0,0 +1,509 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Constants + +/-! # Note Constants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSNoteStepCoeff_nonneg (s : ℝ) : + 0 ≤ coarsePoincareRHSNoteStepCoeff s := by + unfold coarsePoincareRHSNoteStepCoeff + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem coarsePoincareRHSFiniteSumRatio_noteStepCoeff_eq (s : ℝ) : + coarsePoincareRHSFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) = + Real.rpow (3 : ℝ) (-s / 2) := by + have h3 : 0 < (3 : ℝ) := by norm_num + unfold coarsePoincareRHSFiniteSumRatio coarsePoincareRHSScaledStepCoeff + coarsePoincareRHSNoteStepCoeff + calc + Real.rpow (3 : ℝ) (-(3 * s / 2)) * Real.rpow (3 : ℝ) s = + Real.rpow (3 : ℝ) (-(3 * s / 2) + s) := by + exact (Real.rpow_add h3 (-(3 * s / 2)) s).symm + _ = Real.rpow (3 : ℝ) (-s / 2) := by + congr 1 + ring + +theorem coarsePoincareRHSForceFiniteSumRatio_noteStepCoeff_eq (s : ℝ) : + coarsePoincareRHSForceFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) = + Real.rpow (3 : ℝ) (-(3 * s / 2)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hscaled : + coarsePoincareRHSScaledStepCoeff s (coarsePoincareRHSNoteStepCoeff s) = + Real.rpow (3 : ℝ) (-s / 2) := by + simpa [coarsePoincareRHSFiniteSumRatio] using + coarsePoincareRHSFiniteSumRatio_noteStepCoeff_eq s + unfold coarsePoincareRHSForceFiniteSumRatio + rw [hscaled] + calc + Real.rpow (3 : ℝ) (-s / 2) * Real.rpow (3 : ℝ) (-s) = + Real.rpow (3 : ℝ) (-s / 2 + -s) := by + exact (Real.rpow_add h3 (-s / 2) (-s)).symm + _ = Real.rpow (3 : ℝ) (-(3 * s / 2)) := by + congr 1 + ring + +theorem coarsePoincareRHSFiniteSumRatio_noteStepCoeff_nonneg (s : ℝ) : + 0 ≤ coarsePoincareRHSFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) := by + rw [coarsePoincareRHSFiniteSumRatio_noteStepCoeff_eq] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem coarsePoincareRHSFiniteSumRatio_noteStepCoeff_lt_one + {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSFiniteSumRatio s (coarsePoincareRHSNoteStepCoeff s) < 1 := by + rw [coarsePoincareRHSFiniteSumRatio_noteStepCoeff_eq] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + +theorem coarsePoincareRHSForceFiniteSumRatio_nonneg_of_finiteSumRatio_nonneg + {s θ : ℝ} (hr_nonneg : 0 ≤ coarsePoincareRHSFiniteSumRatio s θ) : + 0 ≤ coarsePoincareRHSForceFiniteSumRatio s θ := by + unfold coarsePoincareRHSForceFiniteSumRatio + exact mul_nonneg (by simpa [coarsePoincareRHSFiniteSumRatio] using hr_nonneg) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + +theorem coarsePoincareRHSForceFiniteSumRatio_lt_one_of_finiteSumRatio_lt_one + {s θ : ℝ} (hs : 0 < s) + (hr_nonneg : 0 ≤ coarsePoincareRHSFiniteSumRatio s θ) + (hr_lt_one : coarsePoincareRHSFiniteSumRatio s θ < 1) : + coarsePoincareRHSForceFiniteSumRatio s θ < 1 := by + have hdecay_le_one : Real.rpow (3 : ℝ) (-s) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hle : + coarsePoincareRHSForceFiniteSumRatio s θ ≤ coarsePoincareRHSFiniteSumRatio s θ := by + unfold coarsePoincareRHSForceFiniteSumRatio + simpa [coarsePoincareRHSFiniteSumRatio] using + mul_le_of_le_one_right hr_nonneg hdecay_le_one + exact lt_of_le_of_lt hle hr_lt_one + +theorem coarsePoincareRHSNoteEta_pos {s : ℝ} (hs : 0 < s) : + 0 < coarsePoincareRHSNoteEta s := by + unfold coarsePoincareRHSNoteEta + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + exact div_pos (by linarith) (by linarith) + +theorem coarsePoincareRHSNoteEta_lt_half {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSNoteEta s < (1 : ℝ) / 2 := by + unfold coarsePoincareRHSNoteEta + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hden : 0 < 2 - r := by linarith + rw [div_lt_iff₀ hden] + nlinarith + +theorem one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_eq {s : ℝ} + (hs : 0 < s) : + 1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s) = + Real.rpow (3 : ℝ) (-s / 2) := by + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hden : 2 - r ≠ 0 := by linarith + unfold coarsePoincareRHSNoteEta + change 1 - coarsePoincareRHSAbsorbedRnCoeff ((1 - r) / (2 - r)) = r + unfold coarsePoincareRHSAbsorbedRnCoeff + have hone_sub : + 1 - (1 - r) / (2 - r) = (2 - r)⁻¹ := by + field_simp [hden] + ring + rw [hone_sub] + field_simp [hden] + ring + +theorem one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_pos {s : ℝ} + (hs : 0 < s) : + 0 < 1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s) := by + rw [one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_eq hs] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + +theorem coarsePoincareRHSAbsorbedEnergyCoeff_noteEta_eq {s : ℝ} + (hs : 0 < s) : + coarsePoincareRHSAbsorbedEnergyCoeff (coarsePoincareRHSNoteEta s) = + 2 - Real.rpow (3 : ℝ) (-s / 2) := by + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hden : 2 - r ≠ 0 := by linarith + unfold coarsePoincareRHSNoteEta + change coarsePoincareRHSAbsorbedEnergyCoeff ((1 - r) / (2 - r)) = 2 - r + unfold coarsePoincareRHSAbsorbedEnergyCoeff + have hone_sub : + 1 - (1 - r) / (2 - r) = (2 - r)⁻¹ := by + field_simp [hden] + ring + rw [hone_sub] + field_simp [hden] + ring + +theorem coarsePoincareRHSNoteEnergyEnvelope_eq {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSNoteEnergyEnvelope s = + (Real.rpow (3 : ℝ) (-s / 2))⁻¹ * + (2 - Real.rpow (3 : ℝ) (-s / 2)) := by + unfold coarsePoincareRHSNoteEnergyEnvelope + rw [one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_eq hs, + coarsePoincareRHSAbsorbedEnergyCoeff_noteEta_eq hs] + +theorem coarsePoincareRHSAbsorbedForceCoeff_noteEta_eq {s : ℝ} + (hs : 0 < s) : + coarsePoincareRHSAbsorbedForceCoeff (coarsePoincareRHSNoteEta s) = + 2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) + + 2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) * + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := by + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_pos : 0 < r := by + dsimp [r] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hden : 2 - r ≠ 0 := by linarith + have hnum : 1 - r ≠ 0 := by linarith + unfold coarsePoincareRHSNoteEta + change + coarsePoincareRHSAbsorbedForceCoeff ((1 - r) / (2 - r)) = + 2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹ + unfold coarsePoincareRHSAbsorbedForceCoeff + have hone_sub : + 1 - (1 - r) / (2 - r) = (2 - r)⁻¹ := by + field_simp [hden] + ring + rw [hone_sub] + field_simp [hden, hnum] + +theorem coarsePoincareRHSNoteForceEnvelope_eq {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSNoteForceEnvelope s = + (Real.rpow (3 : ℝ) (-s / 2))⁻¹ * + (2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) + + 2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) * + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹) := by + unfold coarsePoincareRHSNoteForceEnvelope + rw [one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_eq hs, + coarsePoincareRHSAbsorbedForceCoeff_noteEta_eq hs] + +theorem inv_rpow_three_neg_half_eq_rpow_half (s : ℝ) : + (Real.rpow (3 : ℝ) (-s / 2))⁻¹ = Real.rpow (3 : ℝ) (s / 2) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hneg : + Real.rpow (3 : ℝ) (-s / 2) = (Real.rpow (3 : ℝ) (s / 2))⁻¹ := by + rw [show -s / 2 = -(s / 2) by ring] + exact Real.rpow_neg h3.le (s / 2) + rw [hneg, inv_inv] + +theorem rpow_three_half_mul_rpow_three_neg_half_eq_one (s : ℝ) : + Real.rpow (3 : ℝ) (s / 2) * Real.rpow (3 : ℝ) (-s / 2) = 1 := by + have h3 : 0 < (3 : ℝ) := by norm_num + calc + Real.rpow (3 : ℝ) (s / 2) * Real.rpow (3 : ℝ) (-s / 2) + = Real.rpow (3 : ℝ) (s / 2 + -s / 2) := by + exact (Real.rpow_add h3 (s / 2) (-s / 2)).symm + _ = 1 := by + rw [show s / 2 + -s / 2 = 0 by ring] + simp + +theorem coarsePoincareRHSNoteEnergyEnvelope_eq_two_mul_rpow_half_sub_one + {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSNoteEnergyEnvelope s = + 2 * Real.rpow (3 : ℝ) (s / 2) - 1 := by + rw [coarsePoincareRHSNoteEnergyEnvelope_eq hs, + inv_rpow_three_neg_half_eq_rpow_half] + rw [mul_sub, rpow_three_half_mul_rpow_three_neg_half_eq_one] + ring + +theorem coarsePoincareRHSNoteForceEnvelope_eq_rpow_half_mul {s : ℝ} + (hs : 0 < s) : + coarsePoincareRHSNoteForceEnvelope s = + Real.rpow (3 : ℝ) (s / 2) * + (2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) + + 2 * (2 - Real.rpow (3 : ℝ) (-s / 2)) * + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹) := by + rw [coarsePoincareRHSNoteForceEnvelope_eq hs, + inv_rpow_three_neg_half_eq_rpow_half] + +theorem rpow_three_half_le_three_of_le_two {s : ℝ} (hs_le : s ≤ 2) : + Real.rpow (3 : ℝ) (s / 2) ≤ 3 := by + have hexp : s / 2 ≤ (1 : ℝ) := by linarith + simpa using + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hexp + +theorem coarsePoincareRHSNoteEnergyEnvelope_le_five {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 2) : + coarsePoincareRHSNoteEnergyEnvelope s ≤ 5 := by + rw [coarsePoincareRHSNoteEnergyEnvelope_eq_two_mul_rpow_half_sub_one hs] + have hpow : Real.rpow (3 : ℝ) (s / 2) ≤ 3 := + rpow_three_half_le_three_of_le_two hs_le + linarith + +theorem coarsePoincareRHSNoteForceEnvelope_le_twentyfour_mul_inv_one_sub + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 2) : + coarsePoincareRHSNoteForceEnvelope s ≤ + 24 * (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := by + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hB_nonneg : 0 ≤ (1 - r)⁻¹ := by + exact inv_nonneg.mpr (by linarith) + have hB_ge_one : 1 ≤ (1 - r)⁻¹ := by + exact (one_le_inv₀ (by linarith : 0 < 1 - r)).2 (by linarith) + have hpow : Real.rpow (3 : ℝ) (s / 2) ≤ 3 := + rpow_three_half_le_three_of_le_two hs_le + have hterm1 : + 2 * (2 - r) ≤ 4 * (1 - r)⁻¹ := by + have hleft : 2 * (2 - r) ≤ 4 := by nlinarith [hr_nonneg] + have hright : 4 ≤ 4 * (1 - r)⁻¹ := by nlinarith [hB_ge_one] + linarith + have hterm2 : + 2 * (2 - r) * (1 - r)⁻¹ ≤ 4 * (1 - r)⁻¹ := by + have hleft : 2 * (2 - r) ≤ 4 := by nlinarith [hr_nonneg] + exact mul_le_mul_of_nonneg_right hleft hB_nonneg + have hinner : + 2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹ ≤ 8 * (1 - r)⁻¹ := by + linarith + have hinner_nonneg : + 0 ≤ 2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹ := by + nlinarith [hr_lt_one, hB_nonneg] + rw [coarsePoincareRHSNoteForceEnvelope_eq_rpow_half_mul hs] + change + Real.rpow (3 : ℝ) (s / 2) * + (2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹) ≤ + 24 * (1 - r)⁻¹ + calc + Real.rpow (3 : ℝ) (s / 2) * + (2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹) + ≤ 3 * (2 * (2 - r) + 2 * (2 - r) * (1 - r)⁻¹) := by + exact mul_le_mul_of_nonneg_right hpow hinner_nonneg + _ ≤ 3 * (8 * (1 - r)⁻¹) := by + exact mul_le_mul_of_nonneg_left hinner (by norm_num) + _ = 24 * (1 - r)⁻¹ := by ring + +theorem one_half_le_log_three : (1 / 2 : ℝ) ≤ Real.log 3 := by + have hexp_half_le_exp_one : Real.exp ((1 : ℝ) / 2) ≤ Real.exp 1 := by + exact (Real.exp_le_exp).2 (by norm_num) + have hexp_half_lt_three : Real.exp ((1 : ℝ) / 2) < 3 := by + exact lt_of_le_of_lt hexp_half_le_exp_one + (lt_trans Real.exp_one_lt_d9 (by norm_num)) + exact le_of_lt <| + (Real.lt_log_iff_exp_lt (by norm_num : 0 < (3 : ℝ))).2 hexp_half_lt_three + +theorem inv_one_sub_rpow_three_neg_half_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ ≤ 5 * s⁻¹ := by + let x : ℝ := s * Real.log 3 / 2 + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hlog_pos : 0 < Real.log 3 := Real.log_pos (by norm_num : (1 : ℝ) < 3) + have hx_pos : 0 < x := by + dsimp [x] + positivity + have hx_nonneg : 0 ≤ x := hx_pos.le + have h1x_pos : 0 < 1 + x := by linarith + have hr_eq : r = (Real.exp x)⁻¹ := by + dsimp [r, x] + rw [Real.rpow_def_of_pos (by norm_num : 0 < (3 : ℝ))] + have harg : Real.log 3 * (-s / 2) = -(s * Real.log 3 / 2) := by ring + rw [harg, Real.exp_neg] + have hexp_ge : 1 + x ≤ Real.exp x := by + simpa [add_comm] using Real.add_one_le_exp x + have hr_le : r ≤ (1 + x)⁻¹ := by + rw [hr_eq] + exact (inv_le_inv₀ (Real.exp_pos x) h1x_pos).2 hexp_ge + have hx_div_pos : 0 < x / (1 + x) := div_pos hx_pos h1x_pos + have hden_lower : x / (1 + x) ≤ 1 - r := by + have hcalc : 1 - (1 + x)⁻¹ = x / (1 + x) := by + field_simp [h1x_pos.ne'] + ring + calc + x / (1 + x) = 1 - (1 + x)⁻¹ := hcalc.symm + _ ≤ 1 - r := by linarith + have hden_pos : 0 < 1 - r := + lt_of_lt_of_le hx_div_pos hden_lower + have hinv_le : (1 - r)⁻¹ ≤ (x / (1 + x))⁻¹ := by + exact (inv_le_inv₀ hden_pos hx_div_pos).2 hden_lower + have hquot_inv : (x / (1 + x))⁻¹ = (1 + x) / x := by + field_simp [hx_pos.ne', h1x_pos.ne'] + have hx_lower : s / 4 ≤ x := by + dsimp [x] + nlinarith [mul_le_mul_of_nonneg_left one_half_le_log_three hs.le] + have hs4_pos : 0 < s / 4 := by positivity + have hx_inv_le : x⁻¹ ≤ 4 * s⁻¹ := by + have hbase : x⁻¹ ≤ (s / 4)⁻¹ := + (inv_le_inv₀ hx_pos hs4_pos).2 hx_lower + have hrewrite : (s / 4)⁻¹ = 4 * s⁻¹ := by + field_simp [hs.ne'] + simpa [hrewrite] using hbase + have hs_inv_ge_one : 1 ≤ s⁻¹ := (one_le_inv₀ hs).2 hs_le + have hquot_le : (1 + x) / x ≤ 5 * s⁻¹ := by + have hquot : (1 + x) / x = 1 + x⁻¹ := by + field_simp [hx_pos.ne'] + ring + rw [hquot] + nlinarith [hx_inv_le, hs_inv_ge_one] + calc + (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ = (1 - r)⁻¹ := rfl + _ ≤ (x / (1 + x))⁻¹ := hinv_le + _ = (1 + x) / x := hquot_inv + _ ≤ 5 * s⁻¹ := hquot_le + +theorem inv_one_sub_rpow_three_neg_three_half_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-(3 * s / 2)))⁻¹ ≤ 5 * s⁻¹ := by + let r₁ : ℝ := Real.rpow (3 : ℝ) (-s / 2) + let r₃ : ℝ := Real.rpow (3 : ℝ) (-(3 * s / 2)) + have hr₁_lt_one : r₁ < 1 := by + dsimp [r₁] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr₃_lt_one : r₃ < 1 := by + dsimp [r₃] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr_le : r₃ ≤ r₁ := by + dsimp [r₁, r₃] + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hden₁_pos : 0 < 1 - r₁ := by linarith + have hden₃_pos : 0 < 1 - r₃ := by linarith + have hden_order : 1 - r₁ ≤ 1 - r₃ := by linarith + have hinv_order : (1 - r₃)⁻¹ ≤ (1 - r₁)⁻¹ := + (inv_le_inv₀ hden₃_pos hden₁_pos).2 hden_order + calc + (1 - Real.rpow (3 : ℝ) (-(3 * s / 2)))⁻¹ = (1 - r₃)⁻¹ := rfl + _ ≤ (1 - r₁)⁻¹ := hinv_order + _ = (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := rfl + _ ≤ 5 * s⁻¹ := inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + +theorem inv_one_sub_rpow_three_neg_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ 5 * s⁻¹ := by + let r₁ : ℝ := Real.rpow (3 : ℝ) (-s / 2) + let r₂ : ℝ := Real.rpow (3 : ℝ) (-s) + have hr₁_lt_one : r₁ < 1 := by + dsimp [r₁] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr₂_lt_one : r₂ < 1 := by + dsimp [r₂] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr_le : r₂ ≤ r₁ := by + dsimp [r₁, r₂] + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hden₁_pos : 0 < 1 - r₁ := by linarith + have hden₂_pos : 0 < 1 - r₂ := by linarith + have hden_order : 1 - r₁ ≤ 1 - r₂ := by linarith + have hinv_order : (1 - r₂)⁻¹ ≤ (1 - r₁)⁻¹ := + (inv_le_inv₀ hden₂_pos hden₁_pos).2 hden_order + calc + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = (1 - r₂)⁻¹ := rfl + _ ≤ (1 - r₁)⁻¹ := hinv_order + _ = (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := rfl + _ ≤ 5 * s⁻¹ := inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + +theorem inv_geometricDiscount_two_le_five_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (geometricDiscount s 2)⁻¹ ≤ 5 * s⁻¹ := by + let r₁ : ℝ := Real.rpow (3 : ℝ) (-s / 2) + let r₂ : ℝ := Real.rpow (3 : ℝ) (-s * 2) + have hr₁_lt_one : r₁ < 1 := by + dsimp [r₁] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr₂_lt_one : r₂ < 1 := by + dsimp [r₂] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hr_le : r₂ ≤ r₁ := by + dsimp [r₁, r₂] + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hden₁_pos : 0 < 1 - r₁ := by linarith + have hden₂_pos : 0 < 1 - r₂ := by linarith + have hden_order : 1 - r₁ ≤ 1 - r₂ := by linarith + have hinv_order : (1 - r₂)⁻¹ ≤ (1 - r₁)⁻¹ := + (inv_le_inv₀ hden₂_pos hden₁_pos).2 hden_order + calc + (geometricDiscount s 2)⁻¹ = (1 - r₂)⁻¹ := by + simp [geometricDiscount, r₂] + _ ≤ (1 - r₁)⁻¹ := hinv_order + _ = (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := rfl + _ ≤ 5 * s⁻¹ := inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + +theorem coarsePoincareRHSNoteForceEnvelope_le_oneTwenty_mul_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + coarsePoincareRHSNoteForceEnvelope s ≤ 120 * s⁻¹ := by + have henv := + coarsePoincareRHSNoteForceEnvelope_le_twentyfour_mul_inv_one_sub + hs (by linarith : s ≤ 2) + have hinv := inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + calc + coarsePoincareRHSNoteForceEnvelope s + ≤ 24 * (1 - Real.rpow (3 : ℝ) (-s / 2))⁻¹ := henv + _ ≤ 24 * (5 * s⁻¹) := by + exact mul_le_mul_of_nonneg_left hinv (by norm_num) + _ = 120 * s⁻¹ := by ring + +theorem coarsePoincareRHS_noteEta_discount_le_noteStepCoeff {s : ℝ} (hs : 0 < s) : + (1 - coarsePoincareRHSAbsorbedRnCoeff (coarsePoincareRHSNoteEta s))⁻¹ * + coarsePoincareRHSDiscount s ≤ coarsePoincareRHSNoteStepCoeff s := by + have h3 : 0 < (3 : ℝ) := by norm_num + rw [one_sub_coarsePoincareRHSAbsorbedRnCoeff_noteEta_eq hs] + unfold coarsePoincareRHSDiscount coarsePoincareRHSNoteStepCoeff + have h_inv : + (Real.rpow (3 : ℝ) (-s / 2))⁻¹ = Real.rpow (3 : ℝ) (s / 2) := by + have hneg : + Real.rpow (3 : ℝ) (-s / 2) = (Real.rpow (3 : ℝ) (s / 2))⁻¹ := by + rw [show -s / 2 = -(s / 2) by ring] + exact Real.rpow_neg h3.le (s / 2) + rw [hneg, inv_inv] + rw [h_inv] + calc + Real.rpow (3 : ℝ) (s / 2) * Real.rpow (3 : ℝ) (-2 * s) + = Real.rpow (3 : ℝ) ((s / 2) + (-2 * s)) := by + exact (Real.rpow_add h3 (s / 2) (-2 * s)).symm + _ = Real.rpow (3 : ℝ) (-(3 * s / 2)) := by + congr 1 + ring + _ ≤ Real.rpow (3 : ℝ) (-(3 * s / 2)) := le_rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Regularity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Regularity.lean new file mode 100644 index 0000000000..3c1f80ad73 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/Regularity.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo + +/-! # Regularity -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# RHS regularity package for Chapter 3 + +This file records the Lean-facing form of the manuscript assumption +`g ∈ H^s(Q; R^d)` used by the deterministic right-hand-side estimates. +-/ + +/-- +Note-facing `H^s` regularity for a vector right-hand side on one cube. + +The current Besov development consumes this assumption through `L²` +membership and boundedness of the positive-order partial Besov seminorms. +-/ +structure CubeVectorBesovHRegularity {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (g : Vec d → Vec d) : Prop where + memLp : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q) + partialSeminorms_bddAbove : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g) + +theorem CubeVectorBesovHRegularity.of_exponent_le {d : ℕ} + {Q : TriadicCube d} {s t : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorBesovHRegularity Q t g) (hst : s ≤ t) : + CubeVectorBesovHRegularity Q s g where + memLp := hg.memLp + partialSeminorms_bddAbove := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + Q g hst hg.partialSeminorms_bddAbove + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/SeminormRecurrence.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/SeminormRecurrence.lean new file mode 100644 index 0000000000..44da0f0bbe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/SeminormRecurrence.lean @@ -0,0 +1,999 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Complex.ExponentialBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalGradientBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Correctors +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo + +/-! # Seminorm Recurrence -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + + +theorem cubeAverageVec_sub + {d : ℕ} (Q : TriadicCube d) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) : + cubeAverageVec Q (fun x => u x - v x) = cubeAverageVec Q u - cubeAverageVec Q v := by + funext i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hvi : + MeasureTheory.MemLp (fun x => v x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + have hui_int : + MeasureTheory.Integrable (fun x => u x i) (volumeMeasureOn (cubeSet Q)) := + hui.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hvi_int : + MeasureTheory.Integrable (fun x => v x i) (volumeMeasureOn (cubeSet Q)) := + hvi.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + show cubeAverage Q (fun x => (u x - v x) i) = + cubeAverage Q (fun x => u x i) - cubeAverage Q (fun x => v x i) + have hfun : (fun x => (u x - v x) i) = fun x => u x i - v x i := by + funext x + simp + unfold cubeAverage + rw [hfun] + rw [MeasureTheory.integral_sub hui_int hvi_int] + ring + +theorem cubeAverageVec_add + {d : ℕ} (Q : TriadicCube d) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) : + cubeAverageVec Q (fun x => u x + v x) = cubeAverageVec Q u + cubeAverageVec Q v := by + funext i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hvi : + MeasureTheory.MemLp (fun x => v x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + have hui_int : + MeasureTheory.Integrable (fun x => u x i) (volumeMeasureOn (cubeSet Q)) := + hui.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hvi_int : + MeasureTheory.Integrable (fun x => v x i) (volumeMeasureOn (cubeSet Q)) := + hvi.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + show cubeAverage Q (fun x => (u x + v x) i) = + cubeAverage Q (fun x => u x i) + cubeAverage Q (fun x => v x i) + have hfun : (fun x => (u x + v x) i) = fun x => u x i + v x i := by + funext x + simp + unfold cubeAverage + rw [hfun] + rw [MeasureTheory.integral_add hui_int hvi_int] + ring + +theorem cubeBesovNegativeVectorDepthAverage_eq_of_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (huv : ∀ x ∈ cubeSet Q, u x = v x) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q u j = + cubeBesovNegativeVectorDepthAverage Q v j := by + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + exact congrArg vecNormSq <| + cubeAverageVec_eq_of_eq_on_cubeSet fun x hx => + huv x (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + +theorem cubeBesovNegativeVectorDepthSeminorm_eq_of_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (huv : ∀ x ∈ cubeSet Q, u x = v x) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q s u j = + cubeBesovNegativeVectorDepthSeminorm Q s v j := by + unfold cubeBesovNegativeVectorDepthSeminorm + rw [cubeBesovNegativeVectorDepthAverage_eq_of_eq_on_cubeSet huv] + +theorem cubeBesovNegativeVectorPartialSeminormTwo_eq_of_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (N : ℕ) (huv : ∀ x ∈ cubeSet Q, u x = v x) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N u = + cubeBesovNegativeVectorPartialSeminormTwo Q s N v := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + congr 1 + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovNegativeVectorDepthSeminorm_eq_of_eq_on_cubeSet s huv j] + +theorem cubeBesovNegativeVectorSeminormTwo_eq_of_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (huv : ∀ x ∈ cubeSet Q, u x = v x) : + cubeBesovNegativeVectorSeminormTwo Q s u = + cubeBesovNegativeVectorSeminormTwo Q s v := by + unfold cubeBesovNegativeVectorSeminormTwo + apply congrArg sSup + ext y + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, (cubeBesovNegativeVectorPartialSeminormTwo_eq_of_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, cubeBesovNegativeVectorPartialSeminormTwo_eq_of_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv⟩ + +theorem cubeBesovNegativeVectorDepthAverage_sub_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q (fun x => u x - v x) j ≤ + 2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j := by + unfold cubeBesovNegativeVectorDepthAverage + calc + descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R (fun x => u x - v x))) + ≤ + descendantsAverage Q j + (fun R => 2 * (vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v))) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have huR : MemVectorL2 (cubeSet R) u := by + simpa [MemVectorL2, volumeMeasureOn] using + hu.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + have hvR : MemVectorL2 (cubeSet R) v := by + simpa [MemVectorL2, volumeMeasureOn] using + hv.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + calc + vecNormSq (cubeAverageVec R (fun x => u x - v x)) + = vecNormSq (cubeAverageVec R u - cubeAverageVec R v) := by + rw [cubeAverageVec_sub R u v huR hvR] + _ ≤ 2 * (vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v)) := by + exact vecNormSq_sub_le (cubeAverageVec R u) (cubeAverageVec R v) + _ = + 2 * descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v)) := by + rw [descendantsAverage_smul Q j (2 : ℝ) + (fun R => vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v))] + _ = + 2 * (cubeBesovNegativeVectorDepthAverage Q u j + + cubeBesovNegativeVectorDepthAverage Q v j) := by + rw [descendantsAverage_add Q j + (fun R => vecNormSq (cubeAverageVec R u)) + (fun R => vecNormSq (cubeAverageVec R v))] + simp [cubeBesovNegativeVectorDepthAverage] + _ = 2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j := by + ring + +theorem sq_cubeBesovNegativeVectorDepthSeminorm_sub_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (j : ℕ) : + (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x - v x) j) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2 := by + have havg := + cubeBesovNegativeVectorDepthAverage_sub_le_two_mul_add Q u v hu hv j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x - v x) j) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q (fun x => u x - v x) j := by + rw [sq_cubeBesovNegativeVectorDepthSeminorm] + _ ≤ + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j) := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg _) + _ = + 2 * ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j) + + 2 * ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q v j) := by + ring + _ = + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2 := by + rw [← sq_cubeBesovNegativeVectorDepthSeminorm, + ← sq_cubeBesovNegativeVectorDepthSeminorm] + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_sub_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x)) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x - v x) j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact + sq_cubeBesovNegativeVectorDepthSeminorm_sub_le_two_mul_add + Q s u v hu hv j + _ = + Finset.sum (Finset.range (N + 1)) + (fun j => 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + Finset.sum (Finset.range (N + 1)) + (fun j => 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + rw [Finset.sum_add_distrib] + _ = + 2 * Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + 2 * Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + rw [← Finset.mul_sum, ← Finset.mul_sum] + _ = + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [← sq_cubeBesovNegativeVectorPartialSeminormTwo, + ← sq_cubeBesovNegativeVectorPartialSeminormTwo] + +theorem cubeBesovNegativeVectorDepthAverage_add_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q (fun x => u x + v x) j ≤ + 2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j := by + unfold cubeBesovNegativeVectorDepthAverage + calc + descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R (fun x => u x + v x))) + ≤ + descendantsAverage Q j + (fun R => 2 * (vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v))) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have huR : MemVectorL2 (cubeSet R) u := by + simpa [MemVectorL2, volumeMeasureOn] using + hu.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + have hvR : MemVectorL2 (cubeSet R) v := by + simpa [MemVectorL2, volumeMeasureOn] using + hv.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + calc + vecNormSq (cubeAverageVec R (fun x => u x + v x)) + = vecNormSq (cubeAverageVec R u + cubeAverageVec R v) := by + rw [cubeAverageVec_add R u v huR hvR] + _ ≤ 2 * (vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v)) := by + exact vecNormSq_add_le (cubeAverageVec R u) (cubeAverageVec R v) + _ = + 2 * descendantsAverage Q j (fun R => vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v)) := by + rw [descendantsAverage_smul Q j (2 : ℝ) + (fun R => vecNormSq (cubeAverageVec R u) + vecNormSq (cubeAverageVec R v))] + _ = + 2 * (cubeBesovNegativeVectorDepthAverage Q u j + + cubeBesovNegativeVectorDepthAverage Q v j) := by + rw [descendantsAverage_add Q j + (fun R => vecNormSq (cubeAverageVec R u)) + (fun R => vecNormSq (cubeAverageVec R v))] + simp [cubeBesovNegativeVectorDepthAverage] + _ = 2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j := by + ring + +theorem sq_cubeBesovNegativeVectorDepthSeminorm_add_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (j : ℕ) : + (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x + v x) j) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2 := by + have havg := + cubeBesovNegativeVectorDepthAverage_add_le_two_mul_add Q u v hu hv j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x + v x) j) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q (fun x => u x + v x) j := by + rw [sq_cubeBesovNegativeVectorDepthSeminorm] + _ ≤ + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (2 * cubeBesovNegativeVectorDepthAverage Q u j + + 2 * cubeBesovNegativeVectorDepthAverage Q v j) := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg _) + _ = + 2 * ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j) + + 2 * ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q v j) := by + ring + _ = + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2 := by + rw [← sq_cubeBesovNegativeVectorDepthSeminorm, + ← sq_cubeBesovNegativeVectorDepthSeminorm] + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_add_le_two_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x)) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s (fun x => u x + v x) j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + + 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact + sq_cubeBesovNegativeVectorDepthSeminorm_add_le_two_mul_add + Q s u v hu hv j + _ = + Finset.sum (Finset.range (N + 1)) + (fun j => 2 * (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + Finset.sum (Finset.range (N + 1)) + (fun j => 2 * (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + rw [Finset.sum_add_distrib] + _ = + 2 * Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + 2 * Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s v j) ^ 2) := by + rw [← Finset.mul_sum, ← Finset.mul_sum] + _ = + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [← sq_cubeBesovNegativeVectorPartialSeminormTwo, + ← sq_cubeBesovNegativeVectorPartialSeminormTwo] + +theorem cubeBesovNegativeVectorPartialSeminormTwo_add_le_sqrtTwo_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + have hsq := + sq_cubeBesovNegativeVectorPartialSeminormTwo_add_le_two_mul_add Q s u v hu hv N + have hadd_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N (fun x => u x + v x) + have hu_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hv_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N v := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N v + have hsum_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v := + add_nonneg hu_nonneg hv_nonneg + have hsq_bound : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x)) ^ 2 ≤ + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x)) ^ 2 + ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := hsq + _ ≤ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + nlinarith + _ = (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + have hsqrt2 : (Real.sqrt 2) ^ 2 = (2 : ℝ) := by + nlinarith [Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + calc + 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 + = + (Real.sqrt 2) ^ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [hsqrt2] + _ = + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + ring + have hright_nonneg : + 0 ≤ Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + exact mul_nonneg (Real.sqrt_nonneg _) hsum_nonneg + nlinarith + +theorem cubeBesovNegativeVectorSeminormTwo_add_le_sqrtTwo_mul_add_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hvBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) : + cubeBesovNegativeVectorSeminormTwo Q s (fun x => u x + v x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s + (fun x => u x + v x) ?_ + intro N + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x) + ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + exact cubeBesovNegativeVectorPartialSeminormTwo_add_le_sqrtTwo_mul_add + Q s u v hu hv N + _ ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) := by + exact mul_le_mul_of_nonneg_left + (add_le_add + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup huBdd ⟨N, rfl⟩) + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hvBdd ⟨N, rfl⟩)) + (Real.sqrt_nonneg _) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_sub_le_sqrtTwo_mul_add + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + have hsq := + sq_cubeBesovNegativeVectorPartialSeminormTwo_sub_le_two_mul_add Q s u v hu hv N + have hsub_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N (fun x => u x - v x) + have hu_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hv_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N v := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N v + have hsum_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v := + add_nonneg hu_nonneg hv_nonneg + have hsq_bound : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x)) ^ 2 ≤ + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x)) ^ 2 + ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := hsq + _ ≤ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + nlinarith + _ = (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + have hsqrt2 : (Real.sqrt 2) ^ 2 = (2 : ℝ) := by + nlinarith [Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + calc + 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 + = + (Real.sqrt 2) ^ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) ^ 2 := by + rw [hsqrt2] + _ = + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) ^ 2 := by + ring + have hright_nonneg : + 0 ≤ Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + exact mul_nonneg (Real.sqrt_nonneg _) hsum_nonneg + nlinarith + +theorem cubeBesovNegativeVectorSeminormTwo_sub_le_sqrtTwo_mul_add_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hvBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) : + cubeBesovNegativeVectorSeminormTwo Q s (fun x => u x - v x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s + (fun x => u x - v x) ?_ + intro N + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x - v x) + ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) := by + exact cubeBesovNegativeVectorPartialSeminormTwo_sub_le_sqrtTwo_mul_add + Q s u v hu hv N + _ ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) := by + exact mul_le_mul_of_nonneg_left + (add_le_add + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup huBdd ⟨N, rfl⟩) + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hvBdd ⟨N, rfl⟩)) + (Real.sqrt_nonneg _) + +theorem cubeBesovNegativeVectorSeminormTwo_add_sub_le_sqrtTwo_mul_add_sqrtTwo_mul_add_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u v w : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) + (hw : MemVectorL2 (cubeSet Q) w) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hvBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N v)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N w)) : + cubeBesovNegativeVectorSeminormTwo Q s (fun x => u x + v x - w x) ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) + + cubeBesovNegativeVectorSeminormTwo Q s w) := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s + (fun x => u x + v x - w x) ?_ + intro N + have huv : MemVectorL2 (cubeSet Q) (fun x => u x + v x) := hu.add hv + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x - w x) + ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => u x + v x) + + cubeBesovNegativeVectorPartialSeminormTwo Q s N w) := by + exact cubeBesovNegativeVectorPartialSeminormTwo_sub_le_sqrtTwo_mul_add + Q s (fun x => u x + v x) w huv hw N + _ ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N v) + + cubeBesovNegativeVectorPartialSeminormTwo Q s N w) := by + exact mul_le_mul_of_nonneg_left + (add_le_add + (cubeBesovNegativeVectorPartialSeminormTwo_add_le_sqrtTwo_mul_add + Q s u v hu hv N) + le_rfl) + (Real.sqrt_nonneg _) + _ ≤ + Real.sqrt 2 * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s v) + + cubeBesovNegativeVectorSeminormTwo Q s w) := by + refine mul_le_mul_of_nonneg_left ?_ (Real.sqrt_nonneg _) + exact add_le_add + (mul_le_mul_of_nonneg_left + (add_le_add + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup huBdd ⟨N, rfl⟩) + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hvBdd ⟨N, rfl⟩)) + (Real.sqrt_nonneg _)) + (by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hwBdd ⟨N, rfl⟩) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_le_succ + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ + cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u := by + have hsq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo, + sq_cubeBesovNegativeVectorPartialSeminormTwo] + have hsplit : + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) = + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + (cubeBesovNegativeVectorDepthSeminorm Q s u (N + 1)) ^ 2 := by + simpa [add_comm, add_left_comm, add_assoc] using + (Finset.sum_range_succ + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) (N + 1)) + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + + (cubeBesovNegativeVectorDepthSeminorm Q s u (N + 1)) ^ 2 := by + exact le_add_of_nonneg_right (sq_nonneg _) + _ = + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) := by + rw [hsplit] + have hN_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hSucc_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s (N + 1) u + have habs : + |cubeBesovNegativeVectorPartialSeminormTwo Q s N u| ≤ + |cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u| := + sq_le_sq.mp hsq + simpa [abs_of_nonneg hN_nonneg, abs_of_nonneg hSucc_nonneg] using habs + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_succ + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (N : ℕ) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N u ≤ + cubeBesovPositiveVectorPartialSeminormTwo Q s (N + 1) u := by + have hsq : + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (cubeBesovPositiveVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 := by + rw [sq_cubeBesovPositiveVectorPartialSeminormTwo, + sq_cubeBesovPositiveVectorPartialSeminormTwo] + have hsplit : + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) = + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) + + (cubeBesovPositiveVectorDepthSeminorm Q s u (N + 1)) ^ 2 := by + simpa [add_comm, add_left_comm, add_assoc] using + (Finset.sum_range_succ + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) (N + 1)) + calc + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) + + (cubeBesovPositiveVectorDepthSeminorm Q s u (N + 1)) ^ 2 := by + exact le_add_of_nonneg_right (sq_nonneg _) + _ = + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) := by + rw [hsplit] + have hN_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s N u := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s N u + have hSucc_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s (N + 1) u := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s (N + 1) u + have habs : + |cubeBesovPositiveVectorPartialSeminormTwo Q s N u| ≤ + |cubeBesovPositiveVectorPartialSeminormTwo Q s (N + 1) u| := + sq_le_sq.mp hsq + simpa [abs_of_nonneg hN_nonneg, abs_of_nonneg hSucc_nonneg] using habs + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_of_partialSqBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB_nonneg : 0 ≤ B) + (hpartial : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ B) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ B := by + let C : ℝ := Real.sqrt B + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact Real.sqrt_nonneg _ + have hpartial_le : + ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ C := by + intro N + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hsq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ C ^ 2 := by + simpa [C, Real.sq_sqrt hB_nonneg] using hpartial N + have habs : + |cubeBesovNegativeVectorPartialSeminormTwo Q s N u| ≤ |C| := + sq_le_sq.mp hsq + simpa [abs_of_nonneg hpartial_nonneg, abs_of_nonneg hC_nonneg] using habs + have hfull_le : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ C := + cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s u hpartial_le + have hbdd : + BddAbove + (Set.range fun N : ℕ => cubeBesovNegativeVectorPartialSeminormTwo Q s N u) := by + refine ⟨C, ?_⟩ + rintro x ⟨N, rfl⟩ + exact hpartial_le N + have hfull_nonneg : 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s u := by + have hpartial0_le : + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u ≤ + cubeBesovNegativeVectorSeminormTwo Q s u := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hbdd ⟨0, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s 0 u).trans hpartial0_le + have habs : + |cubeBesovNegativeVectorSeminormTwo Q s u| ≤ |C| := by + simpa [abs_of_nonneg hfull_nonneg, abs_of_nonneg hC_nonneg] using hfull_le + have hsq : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ C ^ 2 := + sq_le_sq.mpr habs + simpa [C, Real.sq_sqrt hB_nonneg] using hsq + + +theorem cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ + cubeBesovNegativeVectorSeminormTwo Q s u := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u)) + (N : ℕ) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N u ≤ + cubeBesovPositiveVectorSeminormTwo Q s u := by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s u := by + have h0_le : + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u ≤ + cubeBesovNegativeVectorSeminormTwo Q s u := + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove Q s u hBdd 0 + exact (cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s 0 u).trans h0_le + +theorem cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u)) : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s u := by + have h0_le : + cubeBesovPositiveVectorPartialSeminormTwo Q s 0 u ≤ + cubeBesovPositiveVectorSeminormTwo Q s u := + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove Q s u hBdd 0 + exact (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s 0 u).trans h0_le + +theorem sq_le_inv_one_sub_mul_add_of_sq_le_add_bilinear_term + {A D U W G η : ℝ} + (hη : 0 < η) (hη_lt : η < 1) + (h : W ^ 2 ≤ A + D * (U + W) * G) : + W ^ 2 ≤ (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2)) := by + have hU : + D * U * G ≤ η * U ^ 2 + η⁻¹ * (((D / 2) * G) ^ 2) := by + convert (two_mul_le_add_mul_sq (a := U) (b := (D / 2) * G) (ε := η) hη) using 1 + all_goals (first | rfl | ring) + have hW : + D * W * G ≤ η * W ^ 2 + η⁻¹ * (((D / 2) * G) ^ 2) := by + convert (two_mul_le_add_mul_sq (a := W) (b := (D / 2) * G) (ε := η) hη) using 1 + all_goals (first | rfl | ring) + have hstep : + (1 - η) * W ^ 2 ≤ A + η * U ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2) := by + linarith + have hone_sub : 0 < 1 - η := by linarith + calc + W ^ 2 = (1 - η)⁻¹ * ((1 - η) * W ^ 2) := by + field_simp [hone_sub.ne'] + _ ≤ (1 - η)⁻¹ * (A + η * U ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2)) := by + exact mul_le_mul_of_nonneg_left hstep (inv_nonneg.mpr hone_sub.le) + +theorem add_bilinear_term_le_add_eta_sq_add_invEta_sq + {D U W G η : ℝ} (hη : 0 < η) : + D * (U + W) * G ≤ + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2) := by + have hU : + D * U * G ≤ η * U ^ 2 + η⁻¹ * (((D / 2) * G) ^ 2) := by + convert (two_mul_le_add_mul_sq (a := U) (b := (D / 2) * G) (ε := η) hη) using 1 + all_goals (first | rfl | ring) + have hW : + D * W * G ≤ η * W ^ 2 + η⁻¹ * (((D / 2) * G) ^ 2) := by + convert (two_mul_le_add_mul_sq (a := W) (b := (D / 2) * G) (ε := η) hη) using 1 + all_goals (first | rfl | ring) + have hsplit : D * (U + W) * G = D * U * G + D * W * G := by + ring + rw [hsplit] + linarith + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_of_succ_partialBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (Bchild : TriadicCube d → ℝ) {F : ℝ} + (hB_nonneg : + 0 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + F) + (hlocal : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + F) + (hchild : + ∀ R ∈ descendantsAtDepth Q 1, ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo R s N u ≤ Bchild R) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + F := by + let Echild : ℝ := + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + have hscale_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-2 * s) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hchildSq : + ∀ N : ℕ, + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) ≤ + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) := by + intro N + refine descendantsAverage_le_descendantsAverage Q 1 ?_ + intro R hR + have hchildR := hchild R hR N + have hpartialR_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo R s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s N u + have hBR_nonneg : 0 ≤ Bchild R := by + have hchildR0 := hchild R hR 0 + have hpartialR0_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo R s 0 u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s 0 u + linarith + have habs : + |cubeBesovNegativeVectorPartialSeminormTwo R s N u| ≤ |Bchild R| := by + simpa [abs_of_nonneg hpartialR_nonneg, abs_of_nonneg hBR_nonneg] using hchildR + exact sq_le_sq.mpr habs + have hpartial : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ Echild + F := by + intro N + cases N with + | zero => + have hmono : + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u ≤ + cubeBesovNegativeVectorPartialSeminormTwo Q s 1 u := + cubeBesovNegativeVectorPartialSeminormTwo_le_succ Q s u 0 + have hmono_sq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u) ^ 2 ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 1 u) ^ 2 := by + have h0_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s 0 u + have h1_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s 1 u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s 1 u + nlinarith + have hscaled0 : + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s 0 u) ^ 2) ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) := + mul_le_mul_of_nonneg_left (hchildSq 0) hscale_nonneg + have hsucc := hlocal 0 + have hsucc' : + (cubeBesovNegativeVectorPartialSeminormTwo Q s 1 u) ^ 2 ≤ Echild + F := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s 1 u) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s 0 u) ^ 2) + + F := by + simpa using hsucc + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + + F := by + exact add_le_add hscaled0 le_rfl + _ = Echild + F := by + rfl + exact hmono_sq.trans hsucc' + | succ N => + have hscaledN : + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) := + mul_le_mul_of_nonneg_left (hchildSq N) hscale_nonneg + have hsucc := hlocal N + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) + + F := hsucc + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 (fun R => (Bchild R) ^ 2) + + F := by + exact add_le_add hscaledN le_rfl + _ = Echild + F := by + rfl + simpa [Echild] using + sq_cubeBesovNegativeVectorSeminormTwo_le_of_partialSqBound + (Q := Q) (s := s) (u := u) hB_nonneg hpartial + +theorem real_forward_recurrence_iterate_le + (R E : ℕ → ℝ) {γ : ℝ} (hγ : 0 ≤ γ) + (hstep : ∀ m : ℕ, R m ≤ γ * R (m + 1) + E m) + (m N : ℕ) : + R m ≤ γ ^ N * R (m + N) + + (∑ k ∈ Finset.range N, γ ^ k * E (m + k)) := by + induction N generalizing m with + | zero => + simp + | succ N ih => + have htail := ih (m + 1) + have hmul : + γ * R (m + 1) ≤ + γ * + (γ ^ N * R ((m + 1) + N) + + ∑ k ∈ Finset.range N, γ ^ k * E ((m + 1) + k)) := by + exact mul_le_mul_of_nonneg_left htail hγ + have hsum_shift : + γ * (∑ k ∈ Finset.range N, γ ^ k * E ((m + 1) + k)) = + ∑ k ∈ Finset.range N, γ ^ (k + 1) * E (m + (k + 1)) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + ring_nf + calc + R m ≤ γ * R (m + 1) + E m := hstep m + _ ≤ + γ * + (γ ^ N * R ((m + 1) + N) + + ∑ k ∈ Finset.range N, γ ^ k * E ((m + 1) + k)) + + E m := by + exact add_le_add hmul le_rfl + _ = + γ ^ (N + 1) * R (m + (N + 1)) + + ∑ k ∈ Finset.range (N + 1), γ ^ k * E (m + k) := by + rw [mul_add, hsum_shift, Finset.sum_range_succ'] + simp [pow_succ, Nat.add_assoc] + ring_nf + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/TerminalBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/TerminalBounds.lean new file mode 100644 index 0000000000..f546ccefa1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHS/TerminalBounds.lean @@ -0,0 +1,450 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AbsorbedErrors + +/-! # Terminal Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet {d : ℕ} + (Q : TriadicCube d) {f : Vec d → Vec d} + (hf : MemVectorL2 (cubeSet Q) f) : + MeasureTheory.MemLp f (2 : ENNReal) (normalizedCubeMeasure Q) := by + have hfCube : + MeasureTheory.MemLp f (2 : ENNReal) (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemVectorL2, volumeMeasureOn] using hf + exact + hfCube.of_measure_le_smul (c := ENNReal.ofReal ((cubeVolume Q)⁻¹)) + ENNReal.ofReal_ne_top (by rw [normalizedCubeMeasure, cubeMeasure]) + +theorem memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) {f : Vec d → Vec d} + (hf : MeasureTheory.MemLp f (2 : ENNReal) (normalizedCubeMeasure Q)) : + MemVectorL2 (cubeSet Q) f := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hfCube : + MeasureTheory.MemLp f (2 : ENNReal) (cubeMeasure Q) := + hf.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa [MemVectorL2, volumeMeasureOn, cubeMeasure] using hfCube + +theorem cubeBesovNegativeVectorDepthAverage_eq_sum_components {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q u j = + ∑ i : Fin d, + cubeBesovCircDepthAverage Q (2 : ENNReal) (fun x => u x i) j := by + let D := descendantsAtDepth Q j + unfold cubeBesovNegativeVectorDepthAverage cubeBesovCircDepthAverage descendantsAverage + change ((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R u) = + ∑ i : Fin d, + ((D.card : ℝ)⁻¹) * + ∑ R ∈ D, ‖cubeAverage R (fun x => u x i)‖ ^ (ENNReal.toReal (2 : ENNReal)) + rw [← Finset.mul_sum] + congr 1 + calc + ∑ R ∈ D, vecNormSq (cubeAverageVec R u) = + ∑ R ∈ D, ∑ i : Fin d, (cubeAverage R (fun x => u x i)) ^ (2 : ℕ) := by + refine Finset.sum_congr rfl ?_ + intro R hR + simp [cubeAverageVec, vecNormSq, vecDot, pow_two] + _ = ∑ i : Fin d, ∑ R ∈ D, (cubeAverage R (fun x => u x i)) ^ (2 : ℕ) := by + rw [Finset.sum_comm] + _ = ∑ i : Fin d, + ∑ R ∈ D, ‖cubeAverage R (fun x => u x i)‖ ^ (ENNReal.toReal (2 : ENNReal)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + refine Finset.sum_congr rfl ?_ + intro R hR + simp [Real.norm_eq_abs, pow_two] + +theorem cubeBesovNegativeVectorDepthAverage_le_cubeAverage_vecNormSq_of_memLp {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + cubeBesovNegativeVectorDepthAverage Q u j ≤ + cubeAverage Q (fun x => vecNormSq (u x)) := by + rw [cubeBesovNegativeVectorDepthAverage_eq_sum_components Q u j] + have hcomponent : + ∀ i : Fin d, + cubeBesovCircDepthAverage Q (2 : ENNReal) (fun x => u x i) j ≤ + cubeAverage Q (fun x => (u x i) ^ (2 : ℕ)) := by + intro i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hle := + cubeBesovCircDepthAverage_le_cubeLpNorm_rpow + (Q := Q) (p := (2 : ENNReal)) (u := fun x => u x i) (j := j) + (by norm_num) (by norm_num) hui + have hLp : + (cubeLpNorm Q (2 : ENNReal) (fun x => u x i)) ^ (ENNReal.toReal (2 : ENNReal)) = + cubeAverage Q (fun x => ‖u x i‖ ^ (2 : ℝ)) := by + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ENNReal)) (f := fun x => u x i) + (by norm_num) (by norm_num) hui) + rw [hLp] at hle + simpa [Real.norm_eq_abs, sq_abs, pow_two] using hle + calc + ∑ i : Fin d, + cubeBesovCircDepthAverage Q (2 : ENNReal) (fun x => u x i) j + ≤ ∑ i : Fin d, cubeAverage Q (fun x => (u x i) ^ (2 : ℕ)) := by + exact Finset.sum_le_sum fun i hi => hcomponent i + _ = cubeAverage Q (fun x => vecNormSq (u x)) := by + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * u x i) + (normalizedCubeMeasure Q) := by + intro i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) + (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hint : + MeasureTheory.Integrable (fun x => ‖u x i‖ ^ (2 : ℝ)) + (normalizedCubeMeasure Q) := + hui.integrable_norm_rpow (by norm_num) (by norm_num) + simpa [Real.norm_eq_abs, sq_abs, pow_two] using hint + have hsum := cubeAverage_vecDot_eq_sum_cubeBesovPairing Q u u hInt + symm + simpa [cubeBesovPairing, vecNormSq, vecDot, pow_two] using hsum + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_le_l2Average_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hdisc_nonneg : 0 ≤ (geometricDiscount s 2)⁻¹ := by + exact inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2)) + have henergy_nonneg : 0 ≤ cubeAverage Q (fun x => vecNormSq (u x)) := by + exact cubeAverage_nonneg_of_nonneg_on fun x hx => vecNormSq_nonneg (u x) + have hweight_nonneg : + ∀ j : ℕ, 0 ≤ Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by + intro j + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hdepth : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) * + cubeAverage Q (fun x => vecNormSq (u x)) := by + intro j hj + rw [sq_cubeBesovNegativeVectorDepthSeminorm] + have havg := + cubeBesovNegativeVectorDepthAverage_le_cubeAverage_vecNormSq_of_memLp + Q u j hu + have hpow : + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + calc + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + ring + _ = Real.rpow (3 : ℝ) ((-s * (j : ℝ)) + (-s * (j : ℝ))) := by + exact (Real.rpow_add h3 (-s * (j : ℝ)) (-s * (j : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) := by + congr 1 + ring + rw [hpow] + exact mul_le_mul_of_nonneg_left havg (hweight_nonneg j) + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + calc + ∑ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + ≤ ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) * + cubeAverage Q (fun x => vecNormSq (u x)) := by + exact Finset.sum_le_sum hdepth + _ = (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-2 * s * (j : ℝ))) * + cubeAverage Q (fun x => vecNormSq (u x)) := by + rw [Finset.sum_mul] + _ ≤ (geometricDiscount s 2)⁻¹ * + cubeAverage Q (fun x => vecNormSq (u x)) := by + have hfinite_le : + ∑ j ∈ Finset.range (N + 1), Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) ≤ + (geometricDiscount s 2)⁻¹ := by + have hcoeff_nonneg : + ∀ n : ℕ, 0 ≤ geometricWeight s 2 n := by + intro n + exact geometricWeight_nonneg n (by nlinarith [hs.le]) + have hsum_le : + ∑ j ∈ Finset.range (N + 1), geometricWeight s 2 j ≤ + ∑' n : ℕ, geometricWeight s 2 n := by + exact (summable_geometricWeight hs2).sum_le_tsum + (Finset.range (N + 1)) (fun n hn => hcoeff_nonneg n) + have hrewrite : + ∑ j ∈ Finset.range (N + 1), Real.rpow (3 : ℝ) (-2 * s * (j : ℝ)) = + (geometricDiscount s 2)⁻¹ * + ∑ j ∈ Finset.range (N + 1), geometricWeight s 2 j := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + rw [rpow_neg_two_mul_s_nat_eq_inv_geometricDiscount_mul_geometricWeight_two hs j] + rw [hrewrite] + calc + (geometricDiscount s 2)⁻¹ * + ∑ j ∈ Finset.range (N + 1), geometricWeight s 2 j + ≤ (geometricDiscount s 2)⁻¹ * + ∑' n : ℕ, geometricWeight s 2 n := by + exact mul_le_mul_of_nonneg_left hsum_le hdisc_nonneg + _ = (geometricDiscount s 2)⁻¹ := by + rw [tsum_geometricWeight_eq_one hs2] + ring + exact mul_le_mul_of_nonneg_right hfinite_le henergy_nonneg + +theorem sq_cubeBesovNegativeVectorSeminormTwo_le_l2Average_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 ≤ + (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + have henergy_nonneg : 0 ≤ cubeAverage Q (fun x => vecNormSq (u x)) := by + exact cubeAverage_nonneg_of_nonneg_on fun x hx => vecNormSq_nonneg (u x) + have hB_nonneg : + 0 ≤ (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by nlinarith [hs])))) + henergy_nonneg + exact + sq_cubeBesovNegativeVectorSeminormTwo_le_of_partialSqBound + (Q := Q) (s := s) (u := u) hB_nonneg + (fun N => + sq_cubeBesovNegativeVectorPartialSeminormTwo_le_l2Average_of_memLp + Q hs u N hu) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u) := by + let B : ℝ := (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) + have henergy_nonneg : 0 ≤ cubeAverage Q (fun x => vecNormSq (u x)) := by + exact cubeAverage_nonneg_of_nonneg_on fun x hx => vecNormSq_nonneg (u x) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by nlinarith [hs])))) + henergy_nonneg + refine ⟨Real.sqrt B, ?_⟩ + rintro x ⟨N, rfl⟩ + have hpartial_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hsquare : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (Real.sqrt B) ^ 2 := by + simpa [B, Real.sq_sqrt hB_nonneg] using + sq_cubeBesovNegativeVectorPartialSeminormTwo_le_l2Average_of_memLp + Q hs u N hu + have habs : + |cubeBesovNegativeVectorPartialSeminormTwo Q s N u| ≤ |Real.sqrt B| := + sq_le_sq.mp hsquare + simpa [abs_of_nonneg hpartial_nonneg, abs_of_nonneg (Real.sqrt_nonneg B)] using habs + +theorem cubeBesovNegativeVectorPartialSeminorm_bddAbove_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N u) := by + have hs_half : 0 < s / 2 := by linarith + have hgap : 0 < s - s / 2 := by linarith + rcases cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp + Q hs_half u hu with + ⟨B₂, hB₂⟩ + let K : ℝ := Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (s - s / 2)))⁻¹) + refine ⟨K * max B₂ 0, ?_⟩ + rintro x ⟨N, rfl⟩ + have hq12 : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + K * cubeBesovNegativeVectorPartialSeminormTwo Q (s / 2) N u := by + simpa [K] using + cubeBesovNegativeVectorPartialSeminorm_le_gap_geometric_mul_partialSeminormTwo + Q hgap N u + have htwo_le : + cubeBesovNegativeVectorPartialSeminormTwo Q (s / 2) N u ≤ max B₂ 0 := + (hB₂ ⟨N, rfl⟩).trans (le_max_left B₂ 0) + exact hq12.trans + (mul_le_mul_of_nonneg_left htwo_le (Real.sqrt_nonneg _)) + +theorem cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s u := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_bddAbove Q s u <| + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs u hu + +theorem cubeBesovNegativeVectorSeminorm_nonneg_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + 0 ≤ cubeBesovNegativeVectorSeminorm Q s u := + cubeBesovNegativeVectorSeminorm_nonneg_of_bddAbove Q s u <| + cubeBesovNegativeVectorPartialSeminorm_bddAbove_of_memLp Q hs u hu + +theorem cubeBesovNegativeVectorPartialSeminorm_le_seminorm_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + cubeBesovNegativeVectorSeminorm Q s u := + cubeBesovNegativeVectorPartialSeminorm_le_seminorm_of_bddAbove Q s u + (cubeBesovNegativeVectorPartialSeminorm_bddAbove_of_memLp Q hs u hu) N + +theorem cubeBesovScaleWeight_mul_cubeBesovNegativeVectorPartialSeminorm_le_mul_cubeBesovNegativeVectorSeminorm_of_memLp + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (w : ℝ) + (u : Vec d → Vec d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight w Q * cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + cubeBesovScaleWeight w Q * cubeBesovNegativeVectorSeminorm Q s u := + mul_le_mul_of_nonneg_left + (cubeBesovNegativeVectorPartialSeminorm_le_seminorm_of_memLp Q hs u N hu) + (cubeBesovScaleWeight_nonneg w Q) + +theorem coarsePoincareRHSSn_le_l2Average_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) (n : ℕ) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + coarsePoincareRHSSn Q s u n ≤ + (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + have hdesc : + descendantsAverage Q n + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) ≤ + descendantsAverage Q n + (fun R => (geometricDiscount s 2)⁻¹ * + cubeAverage R (fun x => vecNormSq (u x))) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + have huR : + MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + exact sq_cubeBesovNegativeVectorSeminormTwo_le_l2Average_of_memLp R hs u huR + have henergy_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u x)) (cubeSet Q) + MeasureTheory.volume := by + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * u x i) + (normalizedCubeMeasure Q) := by + intro i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hint : + MeasureTheory.Integrable (fun x => ‖u x i‖ ^ (2 : ℝ)) + (normalizedCubeMeasure Q) := + hui.integrable_norm_rpow (by norm_num) (by norm_num) + simpa [Real.norm_eq_abs, sq_abs, pow_two] using hint + have hvec_int : + MeasureTheory.Integrable (fun x => vecNormSq (u x)) (normalizedCubeMeasure Q) := by + have hsum_int : + MeasureTheory.Integrable (fun x => ∑ i : Fin d, u x i * u x i) + (normalizedCubeMeasure Q) := by + exact MeasureTheory.integrable_finsetSum Finset.univ (fun i hi => hInt i) + simpa [vecNormSq, vecDot] using hsum_int + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) hvec_int + have hconst : + descendantsAverage Q n + (fun R => (geometricDiscount s 2)⁻¹ * + cubeAverage R (fun x => vecNormSq (u x))) = + (geometricDiscount s 2)⁻¹ * + descendantsAverage Q n (fun R => cubeAverage R (fun x => vecNormSq (u x))) := by + let D := descendantsAtDepth Q n + let M := (geometricDiscount s 2)⁻¹ + unfold descendantsAverage + calc + ((D.card : ℝ)⁻¹) * ∑ R ∈ D, + M * cubeAverage R (fun x => vecNormSq (u x)) = + ∑ R ∈ D, + (((D.card : ℝ)⁻¹ * M) * cubeAverage R (fun x => vecNormSq (u x))) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro R hR + ring + _ = ((D.card : ℝ)⁻¹ * M) * + ∑ R ∈ D, cubeAverage R (fun x => vecNormSq (u x)) := by + simpa [mul_assoc] using + (Finset.mul_sum (s := D) + (f := fun R => cubeAverage R (fun x => vecNormSq (u x))) + ((D.card : ℝ)⁻¹ * M)).symm + _ = M * (((D.card : ℝ)⁻¹) * + ∑ R ∈ D, cubeAverage R (fun x => vecNormSq (u x))) := by + ring + have hdesc_energy : + descendantsAverage Q n (fun R => cubeAverage R (fun x => vecNormSq (u x))) = + cubeAverage Q (fun x => vecNormSq (u x)) := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q n (fun x => vecNormSq (u x)) henergy_int + have hRn : + coarsePoincareRHSRn Q s u n ≤ + (geometricDiscount s 2)⁻¹ * + cubeAverage Q (fun x => vecNormSq (u x)) := by + unfold coarsePoincareRHSRn at hdesc ⊢ + simpa [hconst, hdesc_energy] using hdesc + have hweight_le_one : coarsePoincareRHSDepthWeight s n ≤ 1 := by + unfold coarsePoincareRHSDepthWeight + have hbase_one : (1 : ℝ) = Real.rpow (3 : ℝ) 0 := by simp + rw [hbase_one] + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) (by nlinarith [hs.le]) + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hRn_nonneg := coarsePoincareRHSRn_nonneg Q s u n + have hB_nonneg : + 0 ≤ (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + have henergy_nonneg : 0 ≤ cubeAverage Q (fun x => vecNormSq (u x)) := + cubeAverage_nonneg_of_nonneg_on fun x hx => vecNormSq_nonneg (u x) + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by nlinarith [hs])))) + henergy_nonneg + unfold coarsePoincareRHSSn + calc + coarsePoincareRHSDepthWeight s n * coarsePoincareRHSRn Q s u n + ≤ 1 * coarsePoincareRHSRn Q s u n := by + exact mul_le_mul_of_nonneg_right hweight_le_one hRn_nonneg + _ ≤ 1 * ((geometricDiscount s 2)⁻¹ * + cubeAverage Q (fun x => vecNormSq (u x))) := by + exact mul_le_mul_of_nonneg_left hRn zero_le_one + _ = (geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)) := by + ring + +theorem coarsePoincareRHSSn_bddAbove_of_memLp {d : ℕ} + (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + BddAbove (Set.range fun n : ℕ => coarsePoincareRHSSn Q s u n) := by + refine ⟨(geometricDiscount s 2)⁻¹ * cubeAverage Q (fun x => vecNormSq (u x)), ?_⟩ + rintro _ ⟨n, rfl⟩ + exact coarsePoincareRHSSn_le_l2Average_of_memLp Q hs u n hu + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHSLocalRecurrence.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHSLocalRecurrence.lean new file mode 100644 index 0000000000..f17f4034cf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/CoarsePoincareRHSLocalRecurrence.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Compatibility + +/-! +# Coarse Poincare RHS local recurrence compatibility wrapper + +The implementation has been split into the +`Homogenization.Deterministic.CoarsePoincareRHS.*` submodules. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov.lean new file mode 100644 index 0000000000..9c797b0f92 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PublicTheorems +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionVector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionIncrementEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionResidual +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighbor +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighborCount +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryGap +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardOverlapComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DiscreteConvolution +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSharpKernel + +/-! # Constant Coefficient Dirichlet Besov -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradient.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradient.lean new file mode 100644 index 0000000000..6a6decf68e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradient.lean @@ -0,0 +1,886 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 + +/-! # Averaging Gradient -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- The vector field obtained by averaging `h` on overlap cubes and blending +the averages with a smooth overlap partition. -/ +noncomputable def averagingField {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + Vec d → Vec d := + fun x i => + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * overlapCubeAverageVec S h i) + +@[simp] theorem averagingField_apply {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (x : Vec d) (i : Fin d) : + P.averagingField h x i = + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * overlapCubeAverageVec S h i) := + rfl + +/-- Each coordinate of the overlap averaging field is globally `C¹`, since it +is a finite linear combination of the smooth partition weights. -/ +theorem contDiff_averagingField_coord {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (i : Fin d) : + ContDiff ℝ 1 (fun x : Vec d => P.averagingField h x i) := by + dsimp [averagingField] + exact ContDiff.sum fun S _hS => + (P.contDiff_weight S).mul contDiff_const + +/-- The overlap averaging field packaged as a coordinatewise `H¹` competitor +on the parent cube. -/ +noncomputable def averagingCompetitor {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + CubeVectorH1Function Q where + coord := fun i => + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) + (P.contDiff_averagingField_coord h i) + +@[simp] theorem averagingCompetitor_toField_apply {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (x : Vec d) (i : Fin d) : + (P.averagingCompetitor h).toField x i = P.averagingField h x i := + rfl + +@[simp] theorem averagingCompetitor_coord_grad_apply {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (x : Vec d) (i k : Fin d) : + ((P.averagingCompetitor h).coord i).grad x k = + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x := + rfl + +/-- Coordinate derivative of one component of the overlap averaging field. -/ +theorem euclideanCoordDeriv_averagingField_coord_eq_sum {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (x : Vec d) (i k : Fin d) : + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x = + (overlapCentersAtDepth Q j).sum + (fun S => + euclideanCoordDeriv k (P.weight S) x * + overlapCubeAverageVec S h i) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let F : TriadicCube d → Vec d → ℝ := + fun S y => P.weight S y * overlapCubeAverageVec S h i + have hsum : + fderiv ℝ (fun y : Vec d => ∑ S ∈ D, F S y) x = + ∑ S ∈ D, fderiv ℝ (F S) x := by + rw [fderiv_fun_sum] + intro S _hS + dsimp [F] + exact ((P.contDiff_weight S).mul contDiff_const).differentiable + (by simp) x + calc + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x + = (fderiv ℝ (fun y : Vec d => ∑ S ∈ D, F S y) x) (basisVec k) := by + rfl + _ = (∑ S ∈ D, fderiv ℝ (F S) x) (basisVec k) := by + rw [hsum] + _ = ∑ S ∈ D, (fderiv ℝ (F S) x) (basisVec k) := by + simp + _ = + ∑ S ∈ D, + euclideanCoordDeriv k (P.weight S) x * + overlapCubeAverageVec S h i := by + refine Finset.sum_congr rfl ?_ + intro S _hS + have hdiff : DifferentiableAt ℝ (P.weight S) x := + (P.contDiff_weight S).differentiable (by simp) x + dsimp [F, euclideanCoordDeriv] + rw [fderiv_mul_const] + · simp [mul_comm] + · exact hdiff + _ = + (overlapCentersAtDepth Q j).sum + (fun S => + euclideanCoordDeriv k (P.weight S) x * + overlapCubeAverageVec S h i) := by + rfl + +/-- Coordinate derivative of the overlap averaging field after subtracting the +point value using the partition-of-unity cancellation. -/ +theorem euclideanCoordDeriv_averagingField_coord_eq_sum_fluctuation {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i k : Fin d) : + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x = + (overlapCentersAtDepth Q j).sum + (fun S => + euclideanCoordDeriv k (P.weight S) x * + (overlapCubeAverageVec S h i - h x i)) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let a : TriadicCube d → ℝ := fun S => euclideanCoordDeriv k (P.weight S) x + let b : TriadicCube d → ℝ := fun S => overlapCubeAverageVec S h i + let c : ℝ := h x i + have hzero : D.sum a = 0 := by + simpa [D, a] using P.coordDeriv_sum_eq_zero hx k + calc + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x + = D.sum (fun S => a S * b S) := by + simpa [D, a, b] using + P.euclideanCoordDeriv_averagingField_coord_eq_sum h x i k + _ = + D.sum (fun S => a S * (b S - c) + a S * c) := by + refine Finset.sum_congr rfl ?_ + intro S _hS + ring + _ = + D.sum (fun S => a S * (b S - c)) + D.sum (fun S => a S * c) := by + rw [Finset.sum_add_distrib] + _ = + D.sum (fun S => a S * (b S - c)) + D.sum a * c := by + rw [Finset.sum_mul] + _ = + D.sum (fun S => a S * (b S - c)) := by + rw [hzero] + ring + _ = + (overlapCentersAtDepth Q j).sum + (fun S => + euclideanCoordDeriv k (P.weight S) x * + (overlapCubeAverageVec S h i - h x i)) := by + rfl + +/-- Pointwise scalar derivative bound for the overlap averaging field, in the +same localized fluctuation budget used by the residual estimate. -/ +theorem exists_euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {x : Vec d}, x ∈ openCubeSet Q → ∀ i k : Fin d, + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 ≤ + (3 ^ d : ℝ) * (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + classical + let C : ℝ := P.coordDerivConstant + have hC_nonneg : 0 ≤ C := by + simpa [C] using P.coordDerivConstant_nonneg + refine ⟨C, hC_nonneg, ?_⟩ + intro x hx i k + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := overlapCentersAtDepthContaining Q j x + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let B : ℝ := C / scale + let a : TriadicCube d → ℝ := + fun S => euclideanCoordDeriv k (P.weight S) x + let f : TriadicCube d → ℝ := + fun S => overlapCubeAverageVec S h i - h x i + let F : TriadicCube d → Vec d → ℝ := + fun S y => (h y i - overlapCubeAverageVec S h i) ^ 2 + let b : TriadicCube d → ℝ := fun S => a S * f S + have hscale_pos : 0 < scale := by + dsimp [scale] + exact div_pos + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact div_nonneg hC_nonneg (le_of_lt hscale_pos) + have hderiv : + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x = + D.sum b := by + simpa [D, a, f, b] using + P.euclideanCoordDeriv_averagingField_coord_eq_sum_fluctuation h hx i k + have hsum_active : A.sum b = D.sum b := by + dsimp [A, overlapCentersAtDepthContaining] + refine Finset.sum_filter_of_ne ?_ + intro S hS hb + by_contra hxS + have hzero : euclideanCoordDeriv k (P.weight S) x = 0 := + P.coordDeriv_zero_of_not_mem_overlap (S := S) (x := x) k + (by simpa [D] using hS) hx hxS + have ha0 : a S = 0 := by + simpa [a] using hzero + exact hb (by simp [ha0]) + have hcard : (A.card : ℝ) ≤ (3 ^ d : ℝ) := by + exact_mod_cast overlapCentersAtDepthContaining_card_le_pow Q j x + have hA_F_nonneg : 0 ≤ A.sum (fun S => F S x) := by + exact Finset.sum_nonneg fun S _hS => sq_nonneg _ + have hsum_sq : + A.sum (fun S => (b S) ^ 2) ≤ B ^ 2 * A.sum (fun S => F S x) := by + calc + A.sum (fun S => (b S) ^ 2) + ≤ A.sum (fun S => B ^ 2 * F S x) := by + refine Finset.sum_le_sum ?_ + intro S hS + have hS_mem : S ∈ D := by + exact (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).1 + have habs : |a S| ≤ B := by + simpa [a, B, scale, C] using + P.coordDeriv_bound k (by simpa [D] using hS_mem) hx + have hasq : (a S) ^ 2 ≤ B ^ 2 := by + have hs := (sq_le_sq₀ (abs_nonneg (a S)) hB_nonneg).mpr habs + simpa [sq_abs] using hs + have hf_eq : (f S) ^ 2 = F S x := by + dsimp [f, F] + ring + have hf_nonneg : 0 ≤ F S x := by + dsimp [F] + exact sq_nonneg _ + calc + (b S) ^ 2 = (a S) ^ 2 * (f S) ^ 2 := by + dsimp [b] + ring + _ = (a S) ^ 2 * F S x := by rw [hf_eq] + _ ≤ B ^ 2 * F S x := + mul_le_mul_of_nonneg_right hasq hf_nonneg + _ = B ^ 2 * A.sum (fun S => F S x) := by + rw [Finset.mul_sum] + have hA_to_D : + A.sum (fun S => F S x) ≤ + D.sum + (fun S => + (overlapCubeSet S).indicator (F S) x) := by + have hactive_eq : + A.sum (fun S => F S x) = + A.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := by + refine Finset.sum_congr rfl ?_ + intro S hS + have hxS : x ∈ overlapCubeSet S := + (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).2 + simp [Set.indicator, hxS, F] + calc + A.sum (fun S => F S x) + = A.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := + hactive_eq + _ ≤ D.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (by + intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).1) + (by + intro S _hSD _hSnot + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, F, sq_nonneg] + · simp [Set.indicator, hxS]) + have hD_nonneg : + 0 ≤ D.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := by + exact Finset.sum_nonneg fun S _hS => by + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, F, sq_nonneg] + · simp [Set.indicator, hxS] + have hcauchy : + (A.sum b) ^ 2 ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := + sq_sum_le_card_mul_sum_sq + calc + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 + = (D.sum b) ^ 2 := by rw [hderiv] + _ = (A.sum b) ^ 2 := by rw [hsum_active] + _ ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := hcauchy + _ ≤ (3 ^ d : ℝ) * (B ^ 2 * A.sum (fun S => F S x)) := by + exact mul_le_mul hcard hsum_sq + (Finset.sum_nonneg fun S _hS => sq_nonneg _) + (by positivity) + _ ≤ (3 ^ d : ℝ) * + (B ^ 2 * + D.sum + (fun S => + (overlapCubeSet S).indicator (F S) x)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hA_to_D (sq_nonneg B)) + (by positivity) + _ = + (3 ^ d : ℝ) * (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + simp [D, B, scale, F] + ring + +/-- `ENNReal` pointwise scalar derivative estimate for the overlap averaging +field. This is the form that can be integrated directly. -/ +theorem exists_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {x : Vec d}, x ∈ openCubeSet Q → ∀ i k : Fin d, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) ≤ + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) := by + classical + rcases P.exists_euclideanCoordDeriv_averagingField_coord_sq_le h with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro x hx i k + let K : ℝ := (3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 + let realSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) + let ennSum : ℝ≥0∞ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hrealSum_nonneg : 0 ≤ realSum := by + dsimp [realSum] + refine Finset.sum_nonneg ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, sq_nonneg] + · simp [Set.indicator, hxS] + have hreal : + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 ≤ + K * realSum := by + simpa [K, realSum] using hC hx i k + have hsum_ofReal : ENNReal.ofReal realSum = ennSum := by + dsimp [realSum, ennSum] + rw [ENNReal.ofReal_sum_of_nonneg] + · refine Finset.sum_congr rfl ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS] + · simp [Set.indicator, hxS] + · intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, sq_nonneg] + · simp [Set.indicator, hxS] + calc + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ≤ ENNReal.ofReal (K * realSum) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal K * ennSum := by + rw [ENNReal.ofReal_mul hK_nonneg, hsum_ofReal] + _ = + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) := by + rfl + +/-- Integrated scalar derivative estimate up to the localized overlap +fluctuation indicator budget. -/ +theorem exists_lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ i k : Fin d, + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q := by + classical + rcases P.exists_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le h with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro i k + let K : ℝ≥0∞ := + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) + let fluct : Vec d → ℝ≥0∞ := + fun x => + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + have hK_ne_top : K ≠ ∞ := by + dsimp [K] + exact ENNReal.ofReal_ne_top + have hpoint : + (fun x => + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2)) + ≤ᵐ[normalizedCubeMeasure Q] + fun x => K * fluct x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [K, fluct] using hC hx i k + calc + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ ∫⁻ x, K * fluct x ∂ normalizedCubeMeasure Q := + MeasureTheory.lintegral_mono_ae hpoint + _ = K * ∫⁻ x, fluct x ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.lintegral_const_mul' K fluct hK_ne_top] + _ = + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q := by + rfl + +/-- Integrated scalar derivative estimate after converting the localized +indicator budget to the vector overlap fluctuation average. -/ +theorem exists_lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le_vector_average + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ i k : Fin d, + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) := by + classical + rcases P.exists_lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le h + with ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro i k + let K : ℝ≥0∞ := + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) + let I : ℝ≥0∞ := + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q + let A : ℝ≥0∞ := + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) + have hI_le_A : I ≤ A := by + simpa [I, A] using + lintegral_sum_coord_fluctuation_indicator_le_vector_average + Q h j i hloc + calc + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ K * I := by + simpa [K, I] using hC i k + _ ≤ K * A := by + exact mul_le_mul_right hI_le_A K + _ = + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) := by + rfl + +/-- Normalized scalar `L²` version of the integrated derivative estimate, +still with the vector-overlap average as an `ENNReal.toReal` budget. -/ +theorem exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_vector_average_toReal + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ i k : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + ≤ + (ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)))).toReal := by + classical + rcases + P.exists_lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le_vector_average + h hloc with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro i k + let R : ℝ≥0∞ := + ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) + have hA_ne_top : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) ≠ ∞ := + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_ne_top + Q h j hloc + have hR_ne_top : R ≠ ∞ := by + dsimp [R] + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞) hA_ne_top) + have htoReal : + (∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q).toReal ≤ R.toReal := + ENNReal.toReal_mono hR_ne_top (by simpa [R] using hC i k) + calc + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + = + (∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q).toReal := by + rw [cubeLpNorm_two_sq_eq_lintegral_ofReal_sq_toReal] + _ ≤ R.toReal := htoReal + _ = + (ENNReal.ofReal + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)))).toReal := by + rfl + +/-- Real-valued squared normalized scalar derivative bound in terms of the +overlapping positive depth average. -/ +theorem exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ i k : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + ≤ + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + rcases + P.exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_vector_average_toReal + h hloc with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro i k + let A : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) + let B : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) + let K : ℝ := (3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hsq : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + ≤ + (ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A)).toReal := by + simpa [K, A] using hC i k + have hA_le : A ≤ (Fintype.card (Fin d) : ℝ≥0∞) * B := by + simpa [A, B] using + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + Q j h + have hB_ne : B ≠ ∞ := by + simpa [B] using + overlapCentersAtDepth_average_lintegral_fluctuation_ne_top Q h j hloc + have hright_ne : + ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)) ≠ ∞ := by + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top + (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞) + (ENNReal.mul_ne_top + (by simp : (Fintype.card (Fin d) : ℝ≥0∞) ≠ ∞) hB_ne)) + have htoReal_mono : + (ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A)).toReal ≤ + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal := by + refine ENNReal.toReal_mono hright_ne ?_ + refine mul_le_mul_right ?_ _ + exact mul_le_mul_right hA_le (3 ^ d : ℝ≥0∞) + have hB_toReal : + B.toReal = cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + have hfin : + ∀ S ∈ overlapCentersAtDepth Q j, + (∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞ := by + intro S hS + exact lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top S h + (hloc S hS) + simpa [B] using + toReal_overlapCentersAtDepth_average_lintegral_fluctuation_eq_depthAverage + Q h j hfin + have hconst_toReal : + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal = + K * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rw [ENNReal.toReal_ofReal_mul K _ hK_nonneg] + rw [ENNReal.toReal_mul, ENNReal.toReal_mul] + rw [hB_toReal] + simp + ring_nf + simp + calc + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + ≤ (ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A)).toReal := hsq + _ ≤ + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal := htoReal_mono + _ = + K * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + hconst_toReal + _ = + ((3 ^ d : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rfl + +/-- Square-rooted normalized scalar derivative bound for the overlap averaging +field. The scale appears as the inverse overlap side length +`(cubeScaleFactor Q / 3^j)^{-1}`. -/ +theorem exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_le_invScale_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ i k : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + ≤ + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + rcases + P.exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_depthAverage + h hloc with + ⟨C, hC_nonneg, hC⟩ + let M : ℝ := + (3 ^ d : ℝ) * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ)) + refine ⟨Real.sqrt M * C, mul_nonneg (Real.sqrt_nonneg _) hC_nonneg, ?_⟩ + intro i k + let A : ℝ := + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q h j + have hscale_nonneg : 0 ≤ scale := by + dsimp [scale] + exact div_nonneg + (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hCg_sq : (Real.sqrt M * C) ^ 2 = M * C ^ 2 := by + rw [mul_pow, Real.sq_sqrt hM_nonneg] + have hdivCg_sq : + (Real.sqrt M * C / scale) ^ 2 = + (Real.sqrt M * C) ^ 2 / scale ^ 2 := by + ring + have hright_nonneg : + 0 ≤ ((Real.sqrt M * C) / scale) * Real.sqrt D := by + exact mul_nonneg + (div_nonneg (mul_nonneg (Real.sqrt_nonneg _) hC_nonneg) hscale_nonneg) + (Real.sqrt_nonneg _) + have hsq : + A ^ 2 ≤ (((Real.sqrt M * C) / scale) * Real.sqrt D) ^ 2 := by + calc + A ^ 2 + ≤ + ((3 ^ d : ℝ) * (C / scale) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * D) := by + simpa [A, scale, D] using hC i k + _ = (((Real.sqrt M * C) / scale) * Real.sqrt D) ^ 2 := by + rw [mul_pow] + rw [Real.sq_sqrt hD_nonneg] + rw [hdivCg_sq, hCg_sq] + dsimp [M] + ring + have hle : A ≤ ((Real.sqrt M * C) / scale) * Real.sqrt D := + (sq_le_sq₀ hA_nonneg hright_nonneg).mp hsq + simpa [A, scale, D, M] using hle + +end SmoothOverlapPartition + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradientExplicit.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradientExplicit.lean new file mode 100644 index 0000000000..844df4d3b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingGradientExplicit.lean @@ -0,0 +1,745 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidualExplicit + +/-! # Averaging Gradient Explicit -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- Scalar derivative constant for the explicit overlap averaging gradient +estimate. -/ +noncomputable def scalarGradientConstant {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : ℝ := + Real.sqrt ((3 ^ d : ℝ) * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ))) * + P.coordDerivConstant + +theorem scalarGradientConstant_nonneg {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : + 0 ≤ P.scalarGradientConstant := by + unfold scalarGradientConstant + exact mul_nonneg (Real.sqrt_nonneg _) P.coordDerivConstant_nonneg + +noncomputable def gradientConstant {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : ℝ := + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + P.scalarGradientConstant + +theorem gradientConstant_nonneg {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : + 0 ≤ P.gradientConstant := by + unfold gradientConstant + exact mul_nonneg + (mul_nonneg (by positivity) (by positivity)) + P.scalarGradientConstant_nonneg + +/-- Pointwise scalar derivative bound for the overlap averaging field with the +explicit derivative constant stored in the partition. -/ +theorem euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i k : Fin d) : + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 ≤ + (3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := overlapCentersAtDepthContaining Q j x + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let B : ℝ := P.coordDerivConstant / scale + let a : TriadicCube d → ℝ := + fun S => euclideanCoordDeriv k (P.weight S) x + let f : TriadicCube d → ℝ := + fun S => overlapCubeAverageVec S h i - h x i + let F : TriadicCube d → Vec d → ℝ := + fun S y => (h y i - overlapCubeAverageVec S h i) ^ 2 + let b : TriadicCube d → ℝ := fun S => a S * f S + have hscale_pos : 0 < scale := by + dsimp [scale] + exact div_pos + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact div_nonneg P.coordDerivConstant_nonneg (le_of_lt hscale_pos) + have hderiv : + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x = + D.sum b := by + simpa [D, a, f, b] using + P.euclideanCoordDeriv_averagingField_coord_eq_sum_fluctuation h hx i k + have hsum_active : A.sum b = D.sum b := by + dsimp [A, overlapCentersAtDepthContaining] + refine Finset.sum_filter_of_ne ?_ + intro S hS hb + by_contra hxS + have hzero : euclideanCoordDeriv k (P.weight S) x = 0 := + P.coordDeriv_zero_of_not_mem_overlap (S := S) (x := x) k + (by simpa [D] using hS) hx hxS + have ha0 : a S = 0 := by + simpa [a] using hzero + exact hb (by simp [ha0]) + have hcard : (A.card : ℝ) ≤ (3 ^ d : ℝ) := by + exact_mod_cast overlapCentersAtDepthContaining_card_le_pow Q j x + have hsum_sq : + A.sum (fun S => (b S) ^ 2) ≤ B ^ 2 * A.sum (fun S => F S x) := by + calc + A.sum (fun S => (b S) ^ 2) + ≤ A.sum (fun S => B ^ 2 * F S x) := by + refine Finset.sum_le_sum ?_ + intro S hS + have hS_mem : S ∈ D := by + exact (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).1 + have habs : |a S| ≤ B := by + simpa [a, B, scale] using + P.coordDeriv_bound k (by simpa [D] using hS_mem) hx + have hasq : (a S) ^ 2 ≤ B ^ 2 := by + have hs := (sq_le_sq₀ (abs_nonneg (a S)) hB_nonneg).mpr habs + simpa [sq_abs] using hs + have hf_eq : (f S) ^ 2 = F S x := by + dsimp [f, F] + ring + have hf_nonneg : 0 ≤ F S x := by + dsimp [F] + exact sq_nonneg _ + calc + (b S) ^ 2 = (a S) ^ 2 * (f S) ^ 2 := by + dsimp [b] + ring + _ = (a S) ^ 2 * F S x := by rw [hf_eq] + _ ≤ B ^ 2 * F S x := + mul_le_mul_of_nonneg_right hasq hf_nonneg + _ = B ^ 2 * A.sum (fun S => F S x) := by + rw [Finset.mul_sum] + have hA_to_D : + A.sum (fun S => F S x) ≤ + D.sum + (fun S => + (overlapCubeSet S).indicator (F S) x) := by + have hactive_eq : + A.sum (fun S => F S x) = + A.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := by + refine Finset.sum_congr rfl ?_ + intro S hS + have hxS : x ∈ overlapCubeSet S := + (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).2 + simp [Set.indicator, hxS, F] + calc + A.sum (fun S => F S x) + = A.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := + hactive_eq + _ ≤ D.sum + (fun S => (overlapCubeSet S).indicator (F S) x) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (by + intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp + (by simpa [A] using hS)).1) + (by + intro S _hSD _hSnot + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, F, sq_nonneg] + · simp [Set.indicator, hxS]) + have hcauchy : + (A.sum b) ^ 2 ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := + sq_sum_le_card_mul_sum_sq + calc + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 + = (D.sum b) ^ 2 := by rw [hderiv] + _ = (A.sum b) ^ 2 := by rw [hsum_active] + _ ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := hcauchy + _ ≤ (3 ^ d : ℝ) * (B ^ 2 * A.sum (fun S => F S x)) := by + exact mul_le_mul hcard hsum_sq + (Finset.sum_nonneg fun S _hS => sq_nonneg _) + (by positivity) + _ ≤ (3 ^ d : ℝ) * + (B ^ 2 * + D.sum + (fun S => + (overlapCubeSet S).indicator (F S) x)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hA_to_D (sq_nonneg B)) + (by positivity) + _ = + (3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + simp [D, B, scale, F] + ring + +theorem ofReal_euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i k : Fin d) : + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) ≤ + ENNReal.ofReal + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) := by + classical + let K : ℝ := (3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 + let realSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + (h y i - overlapCubeAverageVec S h i) ^ 2) x) + let ennSum : ℝ≥0∞ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hreal : + (euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2 ≤ + K * realSum := by + simpa [K, realSum] using + P.euclideanCoordDeriv_averagingField_coord_sq_le h hx i k + have hsum_ofReal : ENNReal.ofReal realSum = ennSum := by + dsimp [realSum, ennSum] + rw [ENNReal.ofReal_sum_of_nonneg] + · refine Finset.sum_congr rfl ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS] + · simp [Set.indicator, hxS] + · intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, sq_nonneg] + · simp [Set.indicator, hxS] + calc + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ≤ ENNReal.ofReal (K * realSum) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal K * ennSum := by + rw [ENNReal.ofReal_mul hK_nonneg, hsum_ofReal] + _ = + ENNReal.ofReal + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) := by + rfl + +theorem lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (i k : Fin d) : + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ + ENNReal.ofReal + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q := by + classical + let K : ℝ≥0∞ := + ENNReal.ofReal + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) + let fluct : Vec d → ℝ≥0∞ := + fun x => + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + have hK_ne_top : K ≠ ∞ := by + dsimp [K] + exact ENNReal.ofReal_ne_top + have hpoint : + (fun x => + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2)) + ≤ᵐ[normalizedCubeMeasure Q] + fun x => K * fluct x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [K, fluct] using + P.ofReal_euclideanCoordDeriv_averagingField_coord_sq_le h hx i k + calc + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ ∫⁻ x, K * fluct x ∂ normalizedCubeMeasure Q := + MeasureTheory.lintegral_mono_ae hpoint + _ = K * ∫⁻ x, fluct x ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.lintegral_const_mul' K fluct hK_ne_top] + _ = + ENNReal.ofReal + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q := by + rfl + +theorem cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) + (i k : Fin d) : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + ≤ + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + let A : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) + let B : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) + let K : ℝ := (3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2 + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hI_le_A : + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q ≤ + (3 ^ d : ℝ≥0∞) * A := by + simpa [A] using + lintegral_sum_coord_fluctuation_indicator_le_vector_average + Q h j i hloc + have hlin : + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A) := by + calc + ∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q + ≤ ENNReal.ofReal K * + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q := by + simpa [K] using + P.lintegral_ofReal_euclideanCoordDeriv_averagingField_coord_sq_le h i k + _ ≤ ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A) := by + exact mul_le_mul_right hI_le_A (ENNReal.ofReal K) + let R : ℝ≥0∞ := ENNReal.ofReal K * ((3 ^ d : ℝ≥0∞) * A) + have hA_le : A ≤ (Fintype.card (Fin d) : ℝ≥0∞) * B := by + simpa [A, B] using + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + Q j h + have hB_ne : B ≠ ∞ := by + simpa [B] using + overlapCentersAtDepth_average_lintegral_fluctuation_ne_top Q h j hloc + have hright_ne : + ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)) ≠ ∞ := by + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top + (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞) + (ENNReal.mul_ne_top + (by simp : (Fintype.card (Fin d) : ℝ≥0∞) ≠ ∞) hB_ne)) + have htoReal_mono : + R.toReal ≤ + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal := by + refine ENNReal.toReal_mono hright_ne ?_ + dsimp [R] + refine mul_le_mul_right ?_ _ + exact mul_le_mul_right hA_le (3 ^ d : ℝ≥0∞) + have hB_toReal : + B.toReal = cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + have hfin : + ∀ S ∈ overlapCentersAtDepth Q j, + (∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞ := by + intro S hS + exact lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top S h + (hloc S hS) + simpa [B] using + toReal_overlapCentersAtDepth_average_lintegral_fluctuation_eq_depthAverage + Q h j hfin + have hconst_toReal : + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal = + K * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rw [ENNReal.toReal_ofReal_mul K _ hK_nonneg] + rw [ENNReal.toReal_mul, ENNReal.toReal_mul] + rw [hB_toReal] + simp + ring_nf + simp + have htoReal : + (∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q).toReal ≤ R.toReal := by + refine ENNReal.toReal_mono ?_ hlin + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞) + (ne_top_of_le_ne_top + (ENNReal.mul_ne_top + (by simp : (Fintype.card (Fin d) : ℝ≥0∞) ≠ ∞) hB_ne) + hA_le)) + calc + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x)) ^ 2 + = + (∫⁻ x, + ENNReal.ofReal + ((euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) ^ 2) + ∂ normalizedCubeMeasure Q).toReal := by + rw [cubeLpNorm_two_sq_eq_lintegral_ofReal_sq_toReal] + _ ≤ R.toReal := htoReal + _ ≤ + (ENNReal.ofReal K * + ((3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B))).toReal := htoReal_mono + _ = + K * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + hconst_toReal + _ = + ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rfl + +theorem cubeLpNorm_euclideanCoordDeriv_averagingField_coord_le_invScale_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) + (i k : Fin d) : + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + ≤ + (P.scalarGradientConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + let M : ℝ := + (3 ^ d : ℝ) * ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ)) + let A : ℝ := + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => + euclideanCoordDeriv k + (fun y : Vec d => P.averagingField h y i) x) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q h j + have hscale_nonneg : 0 ≤ scale := by + dsimp [scale] + exact div_nonneg + (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hscale_pos : 0 < scale := by + dsimp [scale] + exact div_pos + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hconst_sq : + P.scalarGradientConstant ^ 2 = M * P.coordDerivConstant ^ 2 := by + dsimp [scalarGradientConstant, M] + rw [mul_pow, Real.sq_sqrt hM_nonneg] + have hright_nonneg : + 0 ≤ (P.scalarGradientConstant / scale) * Real.sqrt D := by + exact mul_nonneg + (div_nonneg P.scalarGradientConstant_nonneg hscale_nonneg) + (Real.sqrt_nonneg _) + have hsq : + A ^ 2 ≤ ((P.scalarGradientConstant / scale) * Real.sqrt D) ^ 2 := by + calc + A ^ 2 + ≤ + ((3 ^ d : ℝ) * + (P.coordDerivConstant / scale) ^ 2) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * D) := by + simpa [A, scale, D] using + P.cubeLpNorm_euclideanCoordDeriv_averagingField_coord_sq_le_depthAverage + h hloc i k + _ = ((P.scalarGradientConstant / scale) * Real.sqrt D) ^ 2 := by + rw [mul_pow] + rw [Real.sq_sqrt hD_nonneg] + field_simp [ne_of_gt hscale_pos] + rw [hconst_sq] + dsimp [M] + ring + exact (sq_le_sq₀ hA_nonneg hright_nonneg).mp hsq + +theorem gradientCoordL2NormSum_averagingCompetitor_le_volume_invScale_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + (P.averagingCompetitor h).gradientCoordL2NormSum ≤ + (cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + let n : ℝ := Fintype.card (Fin d) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let base : ℝ := + (cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.scalarGradientConstant / scale) * Real.sqrt D + have hvol_half_nonneg : 0 ≤ (cubeVolume Q) ^ (1 / 2 : ℝ) := + Real.rpow_nonneg (cubeVolume_nonneg Q) _ + have hcoord_raw : + ∀ i k : Fin d, + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ ≤ + base := by + intro i k + let f : Vec d → ℝ := + fun x => ((P.averagingCompetitor h).coord i).grad x k + let hgi : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + H1Function.grad_memL2_normalizedCubeMeasure + ((P.averagingCompetitor h).coord i) k + have hnorm_eq : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hgi)‖ = + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ := by + congr 1 + have hnorm : + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) f := by + rw [← hnorm_eq] + exact norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two + Q hgi + have hcube : + cubeLpNorm Q (2 : ℝ≥0∞) f ≤ + (P.scalarGradientConstant / scale) * Real.sqrt D := by + simpa [f, scale, D] using + P.cubeLpNorm_euclideanCoordDeriv_averagingField_coord_le_invScale_sqrt_depthAverage + h hloc i k + calc + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ + = (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) f := hnorm + _ ≤ + (cubeVolume Q) ^ (1 / 2 : ℝ) * + ((P.scalarGradientConstant / scale) * Real.sqrt D) := by + exact mul_le_mul_of_nonneg_left hcube hvol_half_nonneg + _ = base := by + ring + have hsum : + (P.averagingCompetitor h).gradientCoordL2NormSum ≤ + ∑ i : Fin d, ∑ k : Fin d, base := by + unfold CubeVectorH1Function.gradientCoordL2NormSum + exact Finset.sum_le_sum fun i _hi => by + unfold H1Function.gradientCoordL2NormSum + exact Finset.sum_le_sum fun k _hk => hcoord_raw i k + have hsum_const : + (∑ i : Fin d, ∑ k : Fin d, base) = n * n * base := by + simp [n, Finset.sum_const, nsmul_eq_mul] + ring + calc + (P.averagingCompetitor h).gradientCoordL2NormSum + ≤ ∑ i : Fin d, ∑ k : Fin d, base := hsum + _ = n * n * base := hsum_const + _ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + simp [base, n, scale, D, gradientConstant] + ring + +theorem rpow_neg_mul_relativeGradientCoordL2NormSum_averagingCompetitor_le_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (P.averagingCompetitor h).relativeGradientCoordL2NormSum ≤ + P.gradientConstant * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + let G : CubeVectorH1Function Q := P.averagingCompetitor h + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let α : ℝ := cubeScaleFactor Q / Real.sqrt (cubeVolume Q) + have hraw := P.gradientCoordL2NormSum_averagingCompetitor_le_volume_invScale_sqrt_depthAverage + h hloc + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hα_nonneg : 0 ≤ α := by + dsimp [α] + exact div_nonneg + (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (Real.sqrt_nonneg _) + have hrel_le : + G.relativeGradientCoordL2NormSum ≤ + α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / scale) * Real.sqrt D) := by + calc + G.relativeGradientCoordL2NormSum + = α * G.gradientCoordL2NormSum := by + rfl + _ ≤ + α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / scale) * Real.sqrt D) := by + exact mul_le_mul_of_nonneg_left (by simpa [G, scale, D] using hraw) + hα_nonneg + have hscaleFactor_ne : cubeScaleFactor Q ≠ 0 := by + exact ne_of_gt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hsqrtVol_ne : Real.sqrt (cubeVolume Q) ≠ 0 := + Real.sqrt_ne_zero'.mpr (cubeVolume_pos Q) + have hpow_ne : (3 : ℝ) ^ j ≠ 0 := by + exact pow_ne_zero j (by norm_num : (3 : ℝ) ≠ 0) + have hscale_cancel : + t * (α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / scale) * Real.sqrt D)) = + P.gradientConstant * Real.sqrt D := by + dsimp [t, α, scale] + rw [Real.rpow_neg (by norm_num : 0 ≤ (3 : ℝ))] + rw [Real.rpow_natCast] + rw [← Real.sqrt_eq_rpow] + field_simp [hscaleFactor_ne, hsqrtVol_ne, hpow_ne] + calc + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (P.averagingCompetitor h).relativeGradientCoordL2NormSum + = t * G.relativeGradientCoordL2NormSum := by + rfl + _ ≤ + t * (α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (P.gradientConstant / scale) * Real.sqrt D)) := by + exact mul_le_mul_of_nonneg_left hrel_le ht_nonneg + _ = P.gradientConstant * Real.sqrt D := hscale_cancel + +end SmoothOverlapPartition + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidual.lean new file mode 100644 index 0000000000..87fd5e2d02 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidual.lean @@ -0,0 +1,892 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingScale + +/-! # Averaging Residual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- The partition-parametrized averaging field preserves constants on the +parent cube. -/ +theorem averagingField_const_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (c : Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + P.averagingField (fun _ : Vec d => c) x = c := by + funext i + have hsum := P.sum_eq_one hx + calc + P.averagingField (fun _ : Vec d => c) x i + = + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * c i) := by + simp [averagingField] + _ = + ((overlapCentersAtDepth Q j).sum + (fun S => P.weight S x)) * c i := by + rw [Finset.sum_mul] + _ = c i := by + rw [hsum] + ring + +/-- Coordinate form of the residual identity +`h - A_j h = sum_S phi_S (h - h_S)`. -/ +theorem sub_averagingField_apply_eq_sum_weighted_overlap_fluctuation {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i : Fin d) : + (h x - P.averagingField h x) i = + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * + (h x i - overlapCubeAverageVec S h i)) := by + have hsum := P.sum_eq_one hx + calc + (h x - P.averagingField h x) i + = + h x i - + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * overlapCubeAverageVec S h i) := by + simp [averagingField] + _ = + ((overlapCentersAtDepth Q j).sum + (fun S => P.weight S x)) * h x i - + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * overlapCubeAverageVec S h i) := by + rw [hsum] + ring + _ = + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * h x i) - + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * overlapCubeAverageVec S h i) := by + rw [Finset.sum_mul] + _ = + (overlapCentersAtDepth Q j).sum + (fun S => P.weight S x * + (h x i - overlapCubeAverageVec S h i)) := by + rw [← Finset.sum_sub_distrib] + refine Finset.sum_congr rfl ?_ + intro S _hS + ring + +/-- A partition weight belonging to an active overlap center is at most one on +the parent cube. -/ +theorem weight_le_one_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) + {S : TriadicCube d} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) (hx : x ∈ openCubeSet Q) : + P.weight S x ≤ 1 := by + have hsum := P.sum_eq_one hx + have hnonneg : + ∀ T ∈ overlapCentersAtDepth Q j, 0 ≤ P.weight T x := by + intro T hT + exact P.nonneg hT hx + have hsingle : + P.weight S x ≤ + (overlapCentersAtDepth Q j).sum (fun T => P.weight T x) := + Finset.single_le_sum hnonneg hS + simpa [hsum] using hsingle + +/-- Pointwise coordinate residual bound obtained from the partition identity +and bounded active overlap. This is the local algebraic heart of the +`L²` residual estimate; the subsequent integral step uses support containment +and the finite-overlap comparison. -/ +theorem sub_averagingField_apply_sq_le_activeCard_mul_sum_overlap_fluctuation_sq + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i : Fin d) : + ((h x - P.averagingField h x) i) ^ 2 ≤ + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := D.filter (fun S => P.weight S x ≠ 0) + let b : TriadicCube d → ℝ := + fun S => P.weight S x * (h x i - overlapCubeAverageVec S h i) + let a : TriadicCube d → ℝ := + fun S => h x i - overlapCubeAverageVec S h i + have hres : + (h x - P.averagingField h x) i = D.sum b := by + simpa [D, b, a] using + P.sub_averagingField_apply_eq_sum_weighted_overlap_fluctuation h hx i + have hsum_active : A.sum b = D.sum b := by + dsimp [A] + refine Finset.sum_filter_of_ne ?_ + intro S _hS hb + dsimp [b] at hb ⊢ + intro hzero + exact hb (by simp [hzero]) + have hcauchy : + (A.sum b) ^ 2 ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := + sq_sum_le_card_mul_sum_sq + have hweighted_le_unweighted : + A.sum (fun S => (b S) ^ 2) ≤ D.sum (fun S => (a S) ^ 2) := by + calc + A.sum (fun S => (b S) ^ 2) + ≤ A.sum (fun S => (a S) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro S hS_active + have hS : S ∈ D := by + simpa [A] using (Finset.mem_of_mem_filter S hS_active) + have hw_nonneg : 0 ≤ P.weight S x := + P.nonneg (by simpa [D] using hS) hx + have hw_le : P.weight S x ≤ 1 := + P.weight_le_one_of_mem_openCubeSet (by simpa [D] using hS) hx + have ha_sq_nonneg : 0 ≤ (a S) ^ 2 := sq_nonneg (a S) + have hw_sq_le_one : (P.weight S x) ^ 2 ≤ 1 := by + nlinarith [mul_nonneg hw_nonneg (sub_nonneg.mpr hw_le)] + have hmul_le : + (P.weight S x) ^ 2 * (a S) ^ 2 ≤ 1 * (a S) ^ 2 := + mul_le_mul_of_nonneg_right hw_sq_le_one ha_sq_nonneg + calc + (b S) ^ 2 = (P.weight S x) ^ 2 * (a S) ^ 2 := by + simp [b, a] + ring + _ ≤ (a S) ^ 2 := by + simpa using hmul_le + _ ≤ D.sum (fun S => (a S) ^ 2) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (Finset.filter_subset _ _) + (by + intro S _hSD _hSnot + exact sq_nonneg (a S)) + calc + ((h x - P.averagingField h x) i) ^ 2 + = (D.sum b) ^ 2 := by rw [hres] + _ = (A.sum b) ^ 2 := by rw [hsum_active] + _ ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := hcauchy + _ ≤ (A.card : ℝ) * D.sum (fun S => (a S) ^ 2) := by + exact mul_le_mul_of_nonneg_left hweighted_le_unweighted (by positivity) + _ = + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + rfl + +/-- Sharper pointwise coordinate residual bound retaining the active-center +sum. This is the form used for the support-localized integral estimate. -/ +theorem sub_averagingField_apply_sq_le_activeCard_mul_activeSum_overlap_fluctuation_sq + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i : Fin d) : + ((h x - P.averagingField h x) i) ^ 2 ≤ + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := D.filter (fun S => P.weight S x ≠ 0) + let b : TriadicCube d → ℝ := + fun S => P.weight S x * (h x i - overlapCubeAverageVec S h i) + let a : TriadicCube d → ℝ := + fun S => h x i - overlapCubeAverageVec S h i + have hres : + (h x - P.averagingField h x) i = D.sum b := by + simpa [D, b, a] using + P.sub_averagingField_apply_eq_sum_weighted_overlap_fluctuation h hx i + have hsum_active : A.sum b = D.sum b := by + dsimp [A] + refine Finset.sum_filter_of_ne ?_ + intro S _hS hb + dsimp [b] at hb ⊢ + intro hzero + exact hb (by simp [hzero]) + have hcauchy : + (A.sum b) ^ 2 ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := + sq_sum_le_card_mul_sum_sq + have hweighted_le_unweighted : + A.sum (fun S => (b S) ^ 2) ≤ A.sum (fun S => (a S) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro S hS_active + have hS : S ∈ D := by + simpa [A] using (Finset.mem_of_mem_filter S hS_active) + have hw_nonneg : 0 ≤ P.weight S x := + P.nonneg (by simpa [D] using hS) hx + have hw_le : P.weight S x ≤ 1 := + P.weight_le_one_of_mem_openCubeSet (by simpa [D] using hS) hx + have ha_sq_nonneg : 0 ≤ (a S) ^ 2 := sq_nonneg (a S) + have hw_sq_le_one : (P.weight S x) ^ 2 ≤ 1 := by + nlinarith [mul_nonneg hw_nonneg (sub_nonneg.mpr hw_le)] + have hmul_le : + (P.weight S x) ^ 2 * (a S) ^ 2 ≤ 1 * (a S) ^ 2 := + mul_le_mul_of_nonneg_right hw_sq_le_one ha_sq_nonneg + calc + (b S) ^ 2 = (P.weight S x) ^ 2 * (a S) ^ 2 := by + simp [b, a] + ring + _ ≤ (a S) ^ 2 := by + simpa using hmul_le + calc + ((h x - P.averagingField h x) i) ^ 2 + = (D.sum b) ^ 2 := by rw [hres] + _ = (A.sum b) ^ 2 := by rw [hsum_active] + _ ≤ (A.card : ℝ) * A.sum (fun S => (b S) ^ 2) := hcauchy + _ ≤ (A.card : ℝ) * A.sum (fun S => (a S) ^ 2) := by + exact mul_le_mul_of_nonneg_left hweighted_le_unweighted (by positivity) + _ = + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + rfl + +/-- Active terms in the residual estimate are supported in their corresponding +open overlap cubes, so the active fluctuation sum is dominated by the +indicator sum over all retained overlap centers. -/ +theorem activeSum_overlap_fluctuation_sq_le_sum_openOverlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i : Fin d) : + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) ≤ + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := D.filter (fun S => P.weight S x ≠ 0) + let F : TriadicCube d → Vec d → ℝ := + fun S y => (h y i - overlapCubeAverageVec S h i) ^ 2 + have hactive_eq : + A.sum (fun S => F S x) = + A.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := by + refine Finset.sum_congr rfl ?_ + intro S hS_active + have hS_mem : S ∈ D := by + simpa [A] using (Finset.mem_of_mem_filter S hS_active) + have hS_weight : P.weight S x ≠ 0 := by + simpa [A] using (Finset.mem_filter.mp hS_active).2 + have hxS : x ∈ openOverlapCubeSet S := + P.support_subset (by simpa [D] using hS_mem) hx hS_weight + simp [Set.indicator, hxS, F] + calc + A.sum (fun S => F S x) + = + A.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := + hactive_eq + _ ≤ + D.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (Finset.filter_subset _ _) + (by + intro S _hSD _hSnot + by_cases hxS : x ∈ openOverlapCubeSet S + · simp [Set.indicator, hxS, F, sq_nonneg] + · simp [Set.indicator, hxS]) + _ = + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => (h y i - overlapCubeAverageVec S h i) ^ 2) x) := by + rfl + +/-- Vector-valued pointwise residual bound, obtained by summing the coordinate +active-center estimates. -/ +theorem vecNormSq_sub_averagingField_le_activeCard_mul_activeSum_vecNormSq + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + vecNormSq (h x - P.averagingField h x) ≤ + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) := by + classical + let A : Finset (TriadicCube d) := + (overlapCentersAtDepth Q j).filter (fun S => P.weight S x ≠ 0) + let m : ℝ := (A.card : ℝ) + calc + vecNormSq (h x - P.averagingField h x) + = + ∑ i : Fin d, ((h x - P.averagingField h x) i) ^ 2 := by + simp [vecNormSq, vecDot, pow_two] + _ ≤ + ∑ i : Fin d, + m * A.sum + (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro i _hi + simpa [A, m] using + P.sub_averagingField_apply_sq_le_activeCard_mul_activeSum_overlap_fluctuation_sq + h hx i + _ = + m * ∑ i : Fin d, + A.sum (fun S => (h x i - overlapCubeAverageVec S h i) ^ 2) := by + rw [Finset.mul_sum] + _ = + m * A.sum + (fun S => + ∑ i : Fin d, (h x i - overlapCubeAverageVec S h i) ^ 2) := by + rw [Finset.sum_comm] + _ = + m * A.sum + (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro S _hS + simp [vecNormSq, vecDot, pow_two] + _ = + (((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).card : ℝ) * + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) := by + rfl + +/-- Vector-valued active sums are dominated by overlap-cube indicator sums, +retaining the support information from the partition. -/ +theorem activeSum_vecNormSq_le_sum_openOverlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + ((overlapCentersAtDepth Q j).filter + (fun S => P.weight S x ≠ 0)).sum + (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) ≤ + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let A : Finset (TriadicCube d) := D.filter (fun S => P.weight S x ≠ 0) + let F : TriadicCube d → Vec d → ℝ := + fun S y => vecNormSq (h y - overlapCubeAverageVec S h) + have hactive_eq : + A.sum (fun S => F S x) = + A.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := by + refine Finset.sum_congr rfl ?_ + intro S hS_active + have hS_mem : S ∈ D := by + simpa [A] using (Finset.mem_of_mem_filter S hS_active) + have hS_weight : P.weight S x ≠ 0 := by + simpa [A] using (Finset.mem_filter.mp hS_active).2 + have hxS : x ∈ openOverlapCubeSet S := + P.support_subset (by simpa [D] using hS_mem) hx hS_weight + simp [Set.indicator, hxS, F] + calc + A.sum (fun S => F S x) + = + A.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := + hactive_eq + _ ≤ + D.sum + (fun S => (openOverlapCubeSet S).indicator (F S) x) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (Finset.filter_subset _ _) + (by + intro S _hSD _hSnot + by_cases hxS : x ∈ openOverlapCubeSet S + · simp [Set.indicator, hxS, F, vecNormSq_nonneg] + · simp [Set.indicator, hxS]) + _ = + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + rfl + +/-- Pointwise residual energy estimate with the abstract active-cardinality +constant from the partition. -/ +theorem exists_vecNormSq_sub_averagingField_le_activeBound_mul_sum_openOverlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + ∃ M : ℕ, + ∀ {x : Vec d}, x ∈ openCubeSet Q → + vecNormSq (h x - P.averagingField h x) ≤ + (M : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + refine ⟨P.activeCardBound, ?_⟩ + intro x hx + let A : Finset (TriadicCube d) := + (overlapCentersAtDepth Q j).filter (fun S => P.weight S x ≠ 0) + let localEnergy : ℝ := + A.sum (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) + let indicators : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + have hres : + vecNormSq (h x - P.averagingField h x) ≤ + (A.card : ℝ) * localEnergy := by + simpa [A, localEnergy] using + P.vecNormSq_sub_averagingField_le_activeCard_mul_activeSum_vecNormSq h hx + have hcard : (A.card : ℝ) ≤ (P.activeCardBound : ℝ) := by + exact_mod_cast P.active_card_bound hx + have hlocal_nonneg : 0 ≤ localEnergy := by + dsimp [localEnergy] + exact Finset.sum_nonneg fun S _hS => vecNormSq_nonneg _ + have hlocal_le_indicators : localEnergy ≤ indicators := by + simpa [A, localEnergy, indicators] using + P.activeSum_vecNormSq_le_sum_openOverlap_indicator h hx + have hindicators_nonneg : 0 ≤ indicators := + hlocal_nonneg.trans hlocal_le_indicators + calc + vecNormSq (h x - P.averagingField h x) + ≤ (A.card : ℝ) * localEnergy := hres + _ ≤ (P.activeCardBound : ℝ) * localEnergy := + mul_le_mul_of_nonneg_right hcard hlocal_nonneg + _ ≤ (P.activeCardBound : ℝ) * indicators := by + exact mul_le_mul_of_nonneg_left hlocal_le_indicators (by positivity) + _ = + (P.activeCardBound : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + rfl + +/-- `ENNReal` pointwise residual energy estimate using closed overlap-cube +indicators. This is the form designed to integrate against +`normalizedCubeMeasure Q`. -/ +theorem exists_ofReal_vecNormSq_sub_averagingField_le_activeBound_mul_sum_overlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) : + ∃ M : ℕ, + ∀ {x : Vec d}, x ∈ openCubeSet Q → + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) ≤ + (M : ℝ≥0∞) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) := by + classical + rcases P.exists_vecNormSq_sub_averagingField_le_activeBound_mul_sum_openOverlap_indicator + h with ⟨M, hM⟩ + refine ⟨M, ?_⟩ + intro x hx + let openRealSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + let overlapRealSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + let overlapEnnSum : ℝ≥0∞ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) + have hopen_le_overlap : openRealSum ≤ overlapRealSum := by + dsimp [openRealSum, overlapRealSum] + refine Finset.sum_le_sum ?_ + intro S _hS + by_cases hxOpen : x ∈ openOverlapCubeSet S + · have hxClosed : x ∈ overlapCubeSet S := + openOverlapCubeSet_subset_overlapCubeSet S hxOpen + simp [Set.indicator, hxOpen, hxClosed] + · by_cases hxClosed : x ∈ overlapCubeSet S + · simp [Set.indicator, hxOpen, hxClosed, vecNormSq_nonneg] + · simp [Set.indicator, hxOpen, hxClosed] + have hoverlap_nonneg : 0 ≤ overlapRealSum := by + dsimp [overlapRealSum] + refine Finset.sum_nonneg ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, vecNormSq_nonneg] + · simp [Set.indicator, hxS] + have hreal : + vecNormSq (h x - P.averagingField h x) ≤ + (M : ℝ) * overlapRealSum := by + calc + vecNormSq (h x - P.averagingField h x) + ≤ (M : ℝ) * openRealSum := by + simpa [openRealSum] using hM hx + _ ≤ (M : ℝ) * overlapRealSum := by + exact mul_le_mul_of_nonneg_left hopen_le_overlap + (Nat.cast_nonneg M) + have hsum_ofReal : ENNReal.ofReal overlapRealSum = overlapEnnSum := by + dsimp [overlapRealSum, overlapEnnSum] + rw [ENNReal.ofReal_sum_of_nonneg] + · refine Finset.sum_congr rfl ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS] + · simp [Set.indicator, hxS] + · intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, vecNormSq_nonneg] + · simp [Set.indicator, hxS] + calc + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ≤ ENNReal.ofReal ((M : ℝ) * overlapRealSum) := + ENNReal.ofReal_le_ofReal hreal + _ = (M : ℝ≥0∞) * overlapEnnSum := by + rw [ENNReal.ofReal_mul (Nat.cast_nonneg M)] + rw [ENNReal.ofReal_natCast, hsum_ofReal] + +/-- Integrated `lintegral` residual-energy estimate for the overlap averaging +competitor. The only measurability input is the family of closed-overlap +fluctuation indicators needed by the finite-sum integral comparison. -/ +theorem exists_lintegral_ofReal_vecNormSq_sub_averagingField_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) : + ∃ M : ℕ, + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + (M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + classical + rcases P.exists_ofReal_vecNormSq_sub_averagingField_le_activeBound_mul_sum_overlap_indicator + h with ⟨M, hM⟩ + refine ⟨M, ?_⟩ + let Fsum : Vec d → ℝ≥0∞ := + fun x => + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) + have hpoint : + (fun x => + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x))) ≤ᵐ[ + normalizedCubeMeasure Q] fun x => (M : ℝ≥0∞) * Fsum x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [Fsum] using hM hx + have hlin : + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + ∫⁻ x, (M : ℝ≥0∞) * Fsum x ∂ normalizedCubeMeasure Q := + MeasureTheory.lintegral_mono_ae hpoint + have hconst : + ∫⁻ x, (M : ℝ≥0∞) * Fsum x ∂ normalizedCubeMeasure Q = + (M : ℝ≥0∞) * + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.lintegral_const_mul' + (r := (M : ℝ≥0∞)) (f := Fsum)] + norm_num + have hoverlap : + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + simpa [Fsum] using + overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + (Q := Q) (j := j) + (f := fun S x => + ENNReal.ofReal (vecNormSq (h x - overlapCubeAverageVec S h))) + hfQ + calc + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + ∫⁻ x, (M : ℝ≥0∞) * Fsum x ∂ normalizedCubeMeasure Q := hlin + _ = + (M : ℝ≥0∞) * + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q := hconst + _ ≤ + (M : ℝ≥0∞) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) := by + exact mul_le_mul_of_nonneg_left hoverlap + (zero_le : (0 : ℝ≥0∞) ≤ (M : ℝ≥0∞)) + _ = + (M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + rw [mul_assoc] + +/-- Real squared `L²` residual estimate for the overlap averaging competitor, +packaged from the `lintegral` estimate. The finiteness hypothesis is +intentional: without it, `ENNReal.toReal` would turn an infinite upper bound +into zero. -/ +theorem exists_cubeLpNorm_sq_sub_averagingField_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) : + ∃ M : ℕ, + ∀ _hfinite : + ((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) ≠ ∞, + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)))).toReal := by + rcases P.exists_lintegral_ofReal_vecNormSq_sub_averagingField_le h hfQ + with ⟨M, hM⟩ + refine ⟨M, ?_⟩ + intro hfinite + exact + cubeLpNorm_two_sq_le_lintegral_ofReal_vecNormSq_toReal_of_le + (Q := Q) + (F := fun x => h x - P.averagingField h x) + hfinite hM + +/-- Squared residual estimate against the existing overlapping positive depth +average. This is the residual half of the averaging-competitor estimate, +before taking square roots. -/ +theorem exists_cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + classical + rcases P.exists_cubeLpNorm_sq_sub_averagingField_le h hfQ with ⟨M, hM⟩ + let A : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) + let B : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) + let C : ℝ := (M : ℝ) * (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) + refine ⟨C, by positivity, ?_⟩ + have hres_sq : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) := by + have hfinite : + ((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A) ≠ ∞ := by + simpa [A] using + residualEuclideanOverlapBound_ne_top_of_memLp_overlap Q h j M hloc + simpa [A] using hM hfinite + have hA_le : A ≤ (Fintype.card (Fin d) : ℝ≥0∞) * B := by + simpa [A, B] using + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + Q j h + have hB_ne : B ≠ ∞ := by + simpa [B] using + overlapCentersAtDepth_average_lintegral_fluctuation_ne_top Q h j hloc + have hright_ne : + (M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B) ≠ ∞ := by + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top (by simp : (M : ℝ≥0∞) ≠ ∞) + (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞)) + (ENNReal.mul_ne_top + (by simp : (Fintype.card (Fin d) : ℝ≥0∞) ≠ ∞) hB_ne) + have hA_toReal : + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) ≤ + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) := by + refine ENNReal.toReal_mono hright_ne ?_ + exact mul_le_mul_of_nonneg_left hA_le (zero_le) + have hB_toReal : + B.toReal = cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + have hfin : + ∀ S ∈ overlapCentersAtDepth Q j, + (∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞ := by + intro S hS + exact lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top S h + (hloc S hS) + simpa [B] using + toReal_overlapCentersAtDepth_average_lintegral_fluctuation_eq_depthAverage + Q h j hfin + have hconst_toReal : + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) = + C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + rw [ENNReal.toReal_mul, ENNReal.toReal_mul, ENNReal.toReal_mul] + simp [C, hB_toReal] + ring + calc + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 + ≤ (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) := hres_sq + _ ≤ + (((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) := hA_toReal + _ = C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := hconst_toReal + +theorem exists_cubeLpNorm_sub_averagingField_le_mul_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rcases P.exists_cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage h hfQ hloc + with ⟨C2, hC2_nonneg, hsq⟩ + refine ⟨Real.sqrt C2, Real.sqrt_nonneg _, ?_⟩ + let A : ℝ := + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q h j + have hright_nonneg : 0 ≤ Real.sqrt C2 * Real.sqrt D := + mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + have hsq' : A ^ 2 ≤ (Real.sqrt C2 * Real.sqrt D) ^ 2 := by + calc + A ^ 2 ≤ C2 * D := by + simpa [A, D] using hsq + _ = (Real.sqrt C2 * Real.sqrt D) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hC2_nonneg, Real.sq_sqrt hD_nonneg] + have hle : A ≤ Real.sqrt C2 * Real.sqrt D := + (sq_le_sq₀ hA_nonneg hright_nonneg).mp hsq' + simpa [A, D] using hle + +theorem exists_cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage_of_memLp_overlap + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + refine + P.exists_cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage h ?_ hloc + intro S hS + exact aemeasurable_overlapCubeResidualIndicator_of_memLp hS (hloc S hS) + +theorem exists_cubeLpNorm_sub_averagingField_le_mul_sqrt_depthAverage_of_memLp_overlap + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + refine P.exists_cubeLpNorm_sub_averagingField_le_mul_sqrt_depthAverage h ?_ hloc + intro S hS + exact aemeasurable_overlapCubeResidualIndicator_of_memLp hS (hloc S hS) + +end SmoothOverlapPartition + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidualExplicit.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidualExplicit.lean new file mode 100644 index 0000000000..d3e0a114f5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingResidualExplicit.lean @@ -0,0 +1,469 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidual + +/-! # Averaging Residual Explicit -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- The explicit residual constant carried by a smooth overlap partition. -/ +noncomputable def residualConstant {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : ℝ := + Real.sqrt + ((P.activeCardBound : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ)) + +theorem residualConstant_nonneg {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) : + 0 ≤ P.residualConstant := + Real.sqrt_nonneg _ + +/-- Pointwise residual estimate with the explicit active-cardinality field of +the partition. -/ +theorem vecNormSq_sub_averagingField_le_activeBound_mul_sum_openOverlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + vecNormSq (h x - P.averagingField h x) ≤ + (P.activeCardBound : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + classical + let A : Finset (TriadicCube d) := + (overlapCentersAtDepth Q j).filter (fun S => P.weight S x ≠ 0) + let localEnergy : ℝ := + A.sum (fun S => vecNormSq (h x - overlapCubeAverageVec S h)) + let indicators : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + have hres : + vecNormSq (h x - P.averagingField h x) ≤ + (A.card : ℝ) * localEnergy := by + simpa [A, localEnergy] using + P.vecNormSq_sub_averagingField_le_activeCard_mul_activeSum_vecNormSq h hx + have hcard : (A.card : ℝ) ≤ (P.activeCardBound : ℝ) := by + exact_mod_cast P.active_card_bound hx + have hlocal_nonneg : 0 ≤ localEnergy := by + dsimp [localEnergy] + exact Finset.sum_nonneg fun S _hS => vecNormSq_nonneg _ + have hlocal_le_indicators : localEnergy ≤ indicators := by + simpa [A, localEnergy, indicators] using + P.activeSum_vecNormSq_le_sum_openOverlap_indicator h hx + calc + vecNormSq (h x - P.averagingField h x) + ≤ (A.card : ℝ) * localEnergy := hres + _ ≤ (P.activeCardBound : ℝ) * localEnergy := + mul_le_mul_of_nonneg_right hcard hlocal_nonneg + _ ≤ (P.activeCardBound : ℝ) * indicators := by + exact mul_le_mul_of_nonneg_left hlocal_le_indicators (by positivity) + _ = + (P.activeCardBound : ℝ) * + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) := by + rfl + +/-- `ENNReal` pointwise residual estimate with the explicit active-cardinality +field. -/ +theorem ofReal_vecNormSq_sub_averagingField_le_activeBound_mul_sum_overlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) ≤ + (P.activeCardBound : ℝ≥0∞) * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) := by + classical + let openRealSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (openOverlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + let overlapRealSum : ℝ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => vecNormSq (h y - overlapCubeAverageVec S h)) x) + let overlapEnnSum : ℝ≥0∞ := + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) + have hopen_le_overlap : openRealSum ≤ overlapRealSum := by + dsimp [openRealSum, overlapRealSum] + refine Finset.sum_le_sum ?_ + intro S _hS + by_cases hxOpen : x ∈ openOverlapCubeSet S + · have hxClosed : x ∈ overlapCubeSet S := + openOverlapCubeSet_subset_overlapCubeSet S hxOpen + simp [Set.indicator, hxOpen, hxClosed] + · by_cases hxClosed : x ∈ overlapCubeSet S + · simp [Set.indicator, hxOpen, hxClosed, vecNormSq_nonneg] + · simp [Set.indicator, hxOpen, hxClosed] + have hoverlap_nonneg : 0 ≤ overlapRealSum := by + dsimp [overlapRealSum] + refine Finset.sum_nonneg ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, vecNormSq_nonneg] + · simp [Set.indicator, hxS] + have hreal : + vecNormSq (h x - P.averagingField h x) ≤ + (P.activeCardBound : ℝ) * overlapRealSum := by + calc + vecNormSq (h x - P.averagingField h x) + ≤ (P.activeCardBound : ℝ) * openRealSum := by + simpa [openRealSum] using + P.vecNormSq_sub_averagingField_le_activeBound_mul_sum_openOverlap_indicator h hx + _ ≤ (P.activeCardBound : ℝ) * overlapRealSum := by + exact mul_le_mul_of_nonneg_left hopen_le_overlap + (Nat.cast_nonneg P.activeCardBound) + have hsum_ofReal : ENNReal.ofReal overlapRealSum = overlapEnnSum := by + dsimp [overlapRealSum, overlapEnnSum] + rw [ENNReal.ofReal_sum_of_nonneg] + · refine Finset.sum_congr rfl ?_ + intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS] + · simp [Set.indicator, hxS] + · intro S _hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS, vecNormSq_nonneg] + · simp [Set.indicator, hxS] + calc + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ≤ ENNReal.ofReal ((P.activeCardBound : ℝ) * overlapRealSum) := + ENNReal.ofReal_le_ofReal hreal + _ = (P.activeCardBound : ℝ≥0∞) * overlapEnnSum := by + rw [ENNReal.ofReal_mul (Nat.cast_nonneg P.activeCardBound)] + rw [ENNReal.ofReal_natCast, hsum_ofReal] + +/-- Integrated residual-energy estimate with the explicit active-cardinality +field. -/ +theorem lintegral_ofReal_vecNormSq_sub_averagingField_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) : + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + (P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + classical + let Fsum : Vec d → ℝ≥0∞ := + fun x => + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) x) + have hpoint : + (fun x => + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x))) ≤ᵐ[ + normalizedCubeMeasure Q] fun x => (P.activeCardBound : ℝ≥0∞) * Fsum x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [Fsum] using + P.ofReal_vecNormSq_sub_averagingField_le_activeBound_mul_sum_overlap_indicator h hx + have hlin : + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + ∫⁻ x, (P.activeCardBound : ℝ≥0∞) * Fsum x + ∂ normalizedCubeMeasure Q := + MeasureTheory.lintegral_mono_ae hpoint + have hconst : + ∫⁻ x, (P.activeCardBound : ℝ≥0∞) * Fsum x ∂ normalizedCubeMeasure Q = + (P.activeCardBound : ℝ≥0∞) * + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.lintegral_const_mul' + (r := (P.activeCardBound : ℝ≥0∞)) (f := Fsum)] + norm_num + have hoverlap : + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + simpa [Fsum] using + overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + (Q := Q) (j := j) + (f := fun S x => + ENNReal.ofReal (vecNormSq (h x - overlapCubeAverageVec S h))) + hfQ + calc + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - P.averagingField h x)) + ∂ normalizedCubeMeasure Q + ≤ + ∫⁻ x, (P.activeCardBound : ℝ≥0∞) * Fsum x + ∂ normalizedCubeMeasure Q := hlin + _ = + (P.activeCardBound : ℝ≥0∞) * + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q := hconst + _ ≤ + (P.activeCardBound : ℝ≥0∞) * + ((3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) := by + exact mul_le_mul_of_nonneg_left hoverlap + (zero_le : (0 : ℝ≥0∞) ≤ (P.activeCardBound : ℝ≥0∞)) + _ = + (P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + rw [mul_assoc] + +/-- Real squared `L²` residual estimate with the explicit active-cardinality +field. -/ +theorem cubeLpNorm_sq_sub_averagingField_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) + (hfinite : + ((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S))) ≠ ∞) : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)))).toReal := by + exact + cubeLpNorm_two_sq_le_lintegral_ofReal_vecNormSq_toReal_of_le + (Q := Q) + (F := fun x => h x - P.averagingField h x) + hfinite + (P.lintegral_ofReal_vecNormSq_sub_averagingField_le h hfQ) + +/-- Squared residual estimate against the overlapping positive depth average, +with the explicit active-cardinality field. -/ +theorem cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q))) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + ((P.activeCardBound : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ)) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + classical + let A : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) + let B : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) + let C : ℝ := + (P.activeCardBound : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ) + have hres_sq : + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 ≤ + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) := by + have hfinite : + ((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A) ≠ ∞ := by + simpa [A] using + residualEuclideanOverlapBound_ne_top_of_memLp_overlap + Q h j P.activeCardBound hloc + simpa [A] using P.cubeLpNorm_sq_sub_averagingField_le h hfQ hfinite + have hA_le : A ≤ (Fintype.card (Fin d) : ℝ≥0∞) * B := by + simpa [A, B] using + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + Q j h + have hB_ne : B ≠ ∞ := by + simpa [B] using + overlapCentersAtDepth_average_lintegral_fluctuation_ne_top Q h j hloc + have hright_ne : + (P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B) ≠ ∞ := by + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top (by simp : (P.activeCardBound : ℝ≥0∞) ≠ ∞) + (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞)) + (ENNReal.mul_ne_top + (by simp : (Fintype.card (Fin d) : ℝ≥0∞) ≠ ∞) hB_ne) + have hA_toReal : + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) ≤ + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) := by + refine ENNReal.toReal_mono hright_ne ?_ + exact mul_le_mul_of_nonneg_left hA_le (zero_le) + have hB_toReal : + B.toReal = cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + have hfin : + ∀ S ∈ overlapCentersAtDepth Q j, + (∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞ := by + intro S hS + exact lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top S h + (hloc S hS) + simpa [B] using + toReal_overlapCentersAtDepth_average_lintegral_fluctuation_eq_depthAverage + Q h j hfin + have hconst_toReal : + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) = + C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + rw [ENNReal.toReal_mul, ENNReal.toReal_mul, ENNReal.toReal_mul] + simp [C, hB_toReal] + ring + calc + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x)) ^ 2 + ≤ (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * A).toReal) := hres_sq + _ ≤ + (((P.activeCardBound : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + ((Fintype.card (Fin d) : ℝ≥0∞) * B)).toReal) := hA_toReal + _ = C * cubeBesovOverlappingPositiveVectorDepthAverage Q h j := hconst_toReal + _ = + ((P.activeCardBound : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ)) * + cubeBesovOverlappingPositiveVectorDepthAverage Q h j := by + rfl + +theorem cubeLpNorm_sub_averagingField_le_residualConstant_mul_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) ≤ + P.residualConstant * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + have hsq := + P.cubeLpNorm_sq_sub_averagingField_le_mul_depthAverage h + (fun S hS => aemeasurable_overlapCubeResidualIndicator_of_memLp hS (hloc S hS)) + hloc + let A : ℝ := + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let C2 : ℝ := + (P.activeCardBound : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q h j + have hC2_nonneg : 0 ≤ C2 := by + dsimp [C2] + positivity + have hright_nonneg : 0 ≤ P.residualConstant * Real.sqrt D := + mul_nonneg P.residualConstant_nonneg (Real.sqrt_nonneg _) + have hresidual_sq : P.residualConstant ^ 2 = C2 := by + dsimp [residualConstant, C2] + rw [Real.sq_sqrt] + positivity + have hsq' : A ^ 2 ≤ (P.residualConstant * Real.sqrt D) ^ 2 := by + calc + A ^ 2 ≤ C2 * D := by + simpa [A, D, C2] using hsq + _ = (P.residualConstant * Real.sqrt D) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hD_nonneg] + rw [hresidual_sq] + exact (sq_le_sq₀ hA_nonneg hright_nonneg).mp hsq' + +end SmoothOverlapPartition + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingScale.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingScale.lean new file mode 100644 index 0000000000..9cf0464565 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/AveragingScale.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradient + +/-! # Averaging Scale -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- Raw parent-cube coordinate-summed gradient bound for the overlap averaging +competitor. This is still unnormalized by the parent scale. -/ +theorem exists_gradientCoordL2NormSum_averagingCompetitor_le_volume_invScale_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + (P.averagingCompetitor h).gradientCoordL2NormSum ≤ + (cubeVolume Q) ^ (1 / 2 : ℝ) * + (C / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + rcases + P.exists_cubeLpNorm_euclideanCoordDeriv_averagingField_coord_le_invScale_sqrt_depthAverage + h hloc with + ⟨C, hC_nonneg, hC⟩ + let n : ℝ := Fintype.card (Fin d) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let base : ℝ := + (cubeVolume Q) ^ (1 / 2 : ℝ) * (C / scale) * Real.sqrt D + refine ⟨n * n * C, by positivity, ?_⟩ + have hvol_half_nonneg : 0 ≤ (cubeVolume Q) ^ (1 / 2 : ℝ) := + Real.rpow_nonneg (cubeVolume_nonneg Q) _ + have hcoord_raw : + ∀ i k : Fin d, + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ ≤ + base := by + intro i k + let f : Vec d → ℝ := + fun x => ((P.averagingCompetitor h).coord i).grad x k + let hgi : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + H1Function.grad_memL2_normalizedCubeMeasure + ((P.averagingCompetitor h).coord i) k + have hnorm_eq : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hgi)‖ = + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ := by + congr 1 + have hnorm : + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) f := by + rw [← hnorm_eq] + exact norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two + Q hgi + have hcube : + cubeLpNorm Q (2 : ℝ≥0∞) f ≤ + (C / scale) * Real.sqrt D := by + simpa [f, scale, D] using hC i k + calc + ‖((P.averagingCompetitor h).coord i).gradCoordToScalarL2 k‖ + = (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) f := hnorm + _ ≤ + (cubeVolume Q) ^ (1 / 2 : ℝ) * + ((C / scale) * Real.sqrt D) := by + exact mul_le_mul_of_nonneg_left hcube hvol_half_nonneg + _ = base := by + ring + have hsum : + (P.averagingCompetitor h).gradientCoordL2NormSum ≤ + ∑ i : Fin d, ∑ k : Fin d, base := by + unfold CubeVectorH1Function.gradientCoordL2NormSum + exact Finset.sum_le_sum fun i _hi => by + unfold H1Function.gradientCoordL2NormSum + exact Finset.sum_le_sum fun k _hk => hcoord_raw i k + have hsum_const : + (∑ i : Fin d, ∑ k : Fin d, base) = n * n * base := by + simp [n, Finset.sum_const, nsmul_eq_mul] + ring + calc + (P.averagingCompetitor h).gradientCoordL2NormSum + ≤ ∑ i : Fin d, ∑ k : Fin d, base := hsum + _ = n * n * base := hsum_const + _ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + ((n * n * C) / (cubeScaleFactor Q / (3 : ℝ) ^ j)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + simp [base, n, scale, D] + ring + +/-- Scale-correct relative-gradient estimate for the overlap averaging +competitor. The factor `3^{-j}` cancels the inverse overlap scale in the raw +gradient bound. -/ +theorem exists_rpow_neg_mul_relativeGradientCoordL2NormSum_averagingCompetitor_le_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (P.averagingCompetitor h).relativeGradientCoordL2NormSum ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + classical + rcases + P.exists_gradientCoordL2NormSum_averagingCompetitor_le_volume_invScale_sqrt_depthAverage + h hloc with + ⟨C, hC_nonneg, hraw⟩ + refine ⟨C, hC_nonneg, ?_⟩ + let G : CubeVectorH1Function Q := P.averagingCompetitor h + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let α : ℝ := cubeScaleFactor Q / Real.sqrt (cubeVolume Q) + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hα_nonneg : 0 ≤ α := by + dsimp [α] + exact div_nonneg + (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (Real.sqrt_nonneg _) + have hrel_le : + G.relativeGradientCoordL2NormSum ≤ + α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (C / scale) * Real.sqrt D) := by + calc + G.relativeGradientCoordL2NormSum + = α * G.gradientCoordL2NormSum := by + rfl + _ ≤ + α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (C / scale) * Real.sqrt D) := by + exact mul_le_mul_of_nonneg_left (by simpa [G, scale, D] using hraw) + hα_nonneg + have hscaleFactor_ne : cubeScaleFactor Q ≠ 0 := by + exact ne_of_gt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hsqrtVol_ne : Real.sqrt (cubeVolume Q) ≠ 0 := + Real.sqrt_ne_zero'.mpr (cubeVolume_pos Q) + have hpow_ne : (3 : ℝ) ^ j ≠ 0 := by + exact pow_ne_zero j (by norm_num : (3 : ℝ) ≠ 0) + have hscale_cancel : + t * (α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (C / scale) * Real.sqrt D)) = + C * Real.sqrt D := by + dsimp [t, α, scale] + rw [Real.rpow_neg (by norm_num : 0 ≤ (3 : ℝ))] + rw [Real.rpow_natCast] + rw [← Real.sqrt_eq_rpow] + field_simp [hscaleFactor_ne, hsqrtVol_ne, hpow_ne] + calc + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (P.averagingCompetitor h).relativeGradientCoordL2NormSum + = t * G.relativeGradientCoordL2NormSum := by + rfl + _ ≤ + t * (α * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + (C / scale) * Real.sqrt D)) := by + exact mul_le_mul_of_nonneg_left hrel_le ht_nonneg + _ = C * Real.sqrt D := hscale_cancel + _ = + C * Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rfl + +end SmoothOverlapPartition + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/Basic.lean new file mode 100644 index 0000000000..af197b47af --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/Basic.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.WeakDerivativeTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import Mathlib.Algebra.Order.Chebyshev + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + + +/-! +# Discrete constant-coefficient Dirichlet Besov compatibility kernel + +This file records the discrete compatibility kernel used by the legacy +K-functional/overlap route. It is not the exact Lean contract for +`l.constant.coefficient.Dirichlet.Besov.function.spaces` pending the continuum +`K`/`H^s` gate. +-/ + +/-- Normalized cube `L²` data also gives vector `L²` data on the open cube. +This is the measure-conversion needed when normalized Besov data is paired +against Sobolev test gradients. -/ +theorem memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) {f : Vec d → Vec d} + (hf : MeasureTheory.MemLp f (2 : ENNReal) (normalizedCubeMeasure Q)) : + MemVectorL2 (openCubeSet Q) f := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hfCube : + MeasureTheory.MemLp f (2 : ENNReal) (cubeMeasure Q) := + hf.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa [MemVectorL2, volumeMeasureOn, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] using hfCube + +/-- Monotonicity of the normalized cube average, with integrability supplied on +the underlying half-open cube. -/ +theorem cubeAverage_le_of_le_on_cubeSet {d : ℕ} {Q : TriadicCube d} + {f g : Vec d → ℝ} + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) + (hg : MeasureTheory.IntegrableOn g (cubeSet Q) MeasureTheory.volume) + (hle : ∀ x ∈ cubeSet Q, f x ≤ g x) : + cubeAverage Q f ≤ cubeAverage Q g := by + unfold cubeAverage + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr (cubeVolume_nonneg Q)) + exact + MeasureTheory.integral_mono_ae hf hg <| + (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall hle + +/-- Jensen/Cauchy bound for the normalized scalar cube average. -/ +theorem sq_cubeAverage_le_cubeAverage_sq_of_memLp {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (cubeAverage Q f) ^ 2 ≤ cubeAverage Q (fun x => f x ^ 2) := by + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (1 : ℝ) + have hholder : + |cubeAverage Q (fun x => f x * (1 : ℝ))| ≤ + cubeLpNorm Q (2 : ℝ≥0∞) f * + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => (1 : ℝ)) := + abs_cubeAverage_mul_le_mul_cubeLpNorm_of_holderConjugate + Q (2 : ℝ≥0∞) (2 : ℝ≥0∞) f (fun _ : Vec d => (1 : ℝ)) hf hconst + have hone : + cubeLpNorm Q (2 : ℝ≥0∞) (fun _ : Vec d => (1 : ℝ)) = 1 := by + simpa using + (cubeLpNorm_const (Q := Q) (p := (2 : ℝ≥0∞)) (c := (1 : ℝ)) + (by norm_num)) + have habs : |cubeAverage Q f| ≤ cubeLpNorm Q (2 : ℝ≥0∞) f := by + simpa [hone] using hholder + have hsq : + |cubeAverage Q f| ^ 2 ≤ (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 := + (sq_le_sq₀ (abs_nonneg _) (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) f)).mpr habs + have hlp : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 = + cubeAverage Q (fun x => ‖f x‖ ^ (2 : ℝ)) := by + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := f) + (by norm_num) (by norm_num) hf) + calc + (cubeAverage Q f) ^ 2 = |cubeAverage Q f| ^ 2 := by rw [sq_abs] + _ ≤ (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 := hsq + _ = cubeAverage Q (fun x => f x ^ 2) := by + rw [hlp] + congr 1 + funext x + simp [Real.norm_eq_abs, sq_abs] + +/-- Coordinatewise Jensen/Cauchy bound for vector-valued cube averages. -/ +theorem vecNormSq_cubeAverageVec_le_sum_cubeAverage_sq_of_memLp {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + vecNormSq (cubeAverageVec Q u) ≤ + ∑ i : Fin d, cubeAverage Q (fun x => (u x i) ^ 2) := by + have hcoord : ∀ i : Fin d, + (cubeAverage Q (fun x => u x i)) ^ 2 ≤ + cubeAverage Q (fun x => (u x i) ^ 2) := by + intro i + have hui : MeasureTheory.MemLp (fun x => u x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + exact sq_cubeAverage_le_cubeAverage_sq_of_memLp Q (fun x => u x i) hui + calc + vecNormSq (cubeAverageVec Q u) + = ∑ i : Fin d, (cubeAverage Q (fun x => u x i)) ^ 2 := by + simp [cubeAverageVec, vecNormSq, vecDot, pow_two] + _ ≤ ∑ i : Fin d, cubeAverage Q (fun x => (u x i) ^ 2) := by + exact Finset.sum_le_sum fun i _hi => hcoord i + +/-- The ambient Pi norm of a project vector is bounded by its Euclidean square +root. -/ +theorem norm_le_sqrt_vecNormSq {d : ℕ} (v : Vec d) : + ‖v‖ ≤ Real.sqrt (vecNormSq v) := by + refine (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg _)).2 ?_ + intro i + have hsq : ‖v i‖ ^ (2 : ℕ) ≤ (Real.sqrt (vecNormSq v)) ^ (2 : ℕ) := by + calc + ‖v i‖ ^ (2 : ℕ) = v i ^ (2 : ℕ) := by + rw [Real.norm_eq_abs, sq_abs] + _ ≤ vecNormSq v := sq_apply_le_vecNormSq v i + _ = (Real.sqrt (vecNormSq v)) ^ (2 : ℕ) := by + rw [Real.sq_sqrt (vecNormSq_nonneg v)] + exact le_of_sq_le_sq hsq (Real.sqrt_nonneg _) + +theorem vecNormSq_le_card_mul_norm_sq {d : ℕ} (v : Vec d) : + vecNormSq v ≤ (Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2 := by + rw [vecNormSq, vecDot] + calc + (∑ i : Fin d, v i * v i) ≤ ∑ _i : Fin d, ‖v‖ ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hcoord_abs : |v i| ≤ ‖v‖ := by + simpa [Real.norm_eq_abs] using norm_le_pi_norm v i + have hcoord_sq : |v i| ^ 2 ≤ ‖v‖ ^ 2 := by + nlinarith [abs_nonneg (v i), norm_nonneg v] + simpa [sq_abs, pow_two] using hcoord_sq + _ = (Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + +theorem enorm_rpow_two_le_ofReal_vecNormSq {d : ℕ} (v : Vec d) : + ‖v‖ₑ ^ (2 : ℝ) ≤ ENNReal.ofReal (vecNormSq v) := by + have hnorm_sq_nat : ‖v‖ ^ (2 : ℕ) ≤ vecNormSq v := by + have hnorm := norm_le_sqrt_vecNormSq v + have hsq : + ‖v‖ ^ (2 : ℕ) ≤ + (Real.sqrt (vecNormSq v)) ^ (2 : ℕ) := + (sq_le_sq₀ (norm_nonneg v) (Real.sqrt_nonneg _)).mpr hnorm + simpa [Real.sq_sqrt (vecNormSq_nonneg v)] using hsq + have hnorm_sq : ‖v‖ ^ (2 : ℝ) ≤ vecNormSq v := by + simpa [Real.rpow_two] using hnorm_sq_nat + calc + ‖v‖ₑ ^ (2 : ℝ) + = ENNReal.ofReal (‖v‖ ^ (2 : ℝ)) := by + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg v) (by norm_num)] + _ ≤ ENNReal.ofReal (vecNormSq v) := + ENNReal.ofReal_le_ofReal hnorm_sq + +theorem ofReal_vecNormSq_le_card_mul_enorm_rpow_two {d : ℕ} (v : Vec d) : + ENNReal.ofReal (vecNormSq v) ≤ + (Fintype.card (Fin d) : ℝ≥0∞) * ‖v‖ₑ ^ (2 : ℝ) := by + have hreal := vecNormSq_le_card_mul_norm_sq v + calc + ENNReal.ofReal (vecNormSq v) + ≤ ENNReal.ofReal ((Fintype.card (Fin d) : ℝ) * ‖v‖ ^ 2) := + ENNReal.ofReal_le_ofReal hreal + _ = + (Fintype.card (Fin d) : ℝ≥0∞) * ‖v‖ₑ ^ (2 : ℝ) := by + rw [ENNReal.ofReal_mul (Nat.cast_nonneg _)] + rw [ENNReal.ofReal_natCast] + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg v) (by norm_num)] + rw [Real.rpow_two] + +theorem H1Function.norm_gradToVectorL2_le_gradientCoordL2NormSum + {d : ℕ} {U : Set (Vec d)} (v : H1Function U) : + ‖v.gradToVectorL2‖ ≤ v.gradientCoordL2NormSum := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let D : Vec d → ℝ := fun x => ∑ j : Fin d, ‖v.grad x j‖ + have hcoord_mem : + ∀ j : Fin d, MeasureTheory.MemLp (fun x => ‖v.grad x j‖) + (2 : ℝ≥0∞) μ := by + intro j + simpa [μ] using (v.grad_memL2 j).norm + have hD_mem : MeasureTheory.MemLp D (2 : ℝ≥0∞) μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => ‖v.grad x j‖) + (fun j _hj => hcoord_mem j) + simpa [D] using hsum + let dCoordLp : ScalarL2 U := Homogenization.toScalarL2 (by + simpa [MemScalarL2, μ] using hD_mem) + have hrow_le_sumLp : ‖v.gradToVectorL2‖ ≤ ‖dCoordLp‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards [H1Function.coeFn_gradToVectorL2 v, + Homogenization.coeFn_toScalarL2 (by + simpa [MemScalarL2, μ] using hD_mem)] with x hrow hD + rw [hrow, hD] + have hD_nonneg : 0 ≤ D x := by + exact Finset.sum_nonneg fun j _hj => norm_nonneg _ + have hvec_le : ‖v.grad x‖ ≤ D x := by + refine (pi_norm_le_iff_of_nonneg hD_nonneg).2 ?_ + intro j + exact Finset.single_le_sum + (fun k _hk => norm_nonneg (v.grad x k)) + (Finset.mem_univ j) + simpa [Real.norm_eq_abs, abs_of_nonneg hD_nonneg] using hvec_le + have hsum_eLp : + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ ≤ + ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ := by + have hD : + D = ∑ j : Fin d, (fun x : Vec d => ‖v.grad x j‖) := by + funext x + simp [D] + rw [hD] + simpa using + (MeasureTheory.eLpNorm_sum_le + (μ := μ) (p := (2 : ℝ≥0∞)) (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => ‖v.grad x j‖) + (fun j _hj => (hcoord_mem j).1) + (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞))) + have hsum_toReal : + ENNReal.toReal + (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ) = + ∑ j : Fin d, ‖v.gradCoordToScalarL2 j‖ := by + rw [ENNReal.toReal_sum (fun j _hj => (hcoord_mem j).2.ne)] + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [MeasureTheory.eLpNorm_norm] + simp [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp, μ] + calc + ‖v.gradToVectorL2‖ ≤ ‖dCoordLp‖ := hrow_le_sumLp + _ = ENNReal.toReal (MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ) := by + simp [dCoordLp, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp, μ] + _ ≤ + ENNReal.toReal + (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun j _hj => (hcoord_mem j).2.ne + _ = v.gradientCoordL2NormSum := by + simpa [H1Function.gradientCoordL2NormSum] using hsum_toReal + +/-- The square of the normalized vector `L²` norm is controlled by the +normalized average of the Euclidean square. The dimension-free direction uses +`‖v‖_∞ ≤ |v|_2` pointwise. -/ +theorem cubeLpNorm_two_sq_le_cubeAverage_vecNormSq {d : ℕ} + {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ 2 ≤ + cubeAverage Q (fun x => vecNormSq (F x)) := by + have hF_open : MemVectorL2 (cubeSet Q) F := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hfCube : + MeasureTheory.MemLp F (2 : ENNReal) (cubeMeasure Q) := + hF.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa [MemVectorL2, volumeMeasureOn, cubeMeasure] using hfCube + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖F x‖ ^ (2 : ℕ)) + (cubeSet Q) MeasureTheory.volume := by + have hF_vol : MeasureTheory.MemLp F (2 : ENNReal) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [MemVectorL2, volumeMeasureOn] using hF_open + simpa using! + hF_vol.integrable_norm_rpow + (by norm_num : (2 : ENNReal) ≠ 0) + (by norm_num : (2 : ENNReal) ≠ ⊤) + have hvec_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (F x)) + (cubeSet Q) MeasureTheory.volume := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hF_open hF_open + have hnorm_eq : + (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℕ) = + cubeAverage Q (fun x => ‖F x‖ ^ (2 : ℕ)) := by + simpa using + cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := F) + (by norm_num) (by norm_num) hF + rw [hnorm_eq] + exact cubeAverage_le_of_le_on_cubeSet hnorm_int hvec_int fun x _hx => by + have hsq : + ‖F x‖ ^ (2 : ℕ) ≤ (Real.sqrt (vecNormSq (F x))) ^ (2 : ℕ) := + (sq_le_sq₀ (norm_nonneg _) (Real.sqrt_nonneg _)).mpr + (norm_le_sqrt_vecNormSq (F x)) + simpa [Real.sq_sqrt (vecNormSq_nonneg (F x))] using hsq + +/-- Vector Cauchy-Schwarz for normalized cube averages, stated in the ambient +`cubeLpNorm` used by the K-functional layer. -/ +theorem abs_cubeAverage_vecDot_le_card_mul_cubeLpNorm_two_mul {d : ℕ} + (Q : TriadicCube d) (F G : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hG : MeasureTheory.MemLp G (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + |cubeAverage Q (fun x => vecDot (F x) (G x))| ≤ + (Fintype.card (Fin d) : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F * + cubeLpNorm Q (2 : ℝ≥0∞) G := by + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => F x i * G x i) + (normalizedCubeMeasure Q) := by + intro i + have hFi : MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_component_of_memLp F i hF + have hGi : MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_component_of_memLp G i hG + simpa [Pi.mul_apply] using! hFi.integrable_mul hGi + calc + |cubeAverage Q (fun x => vecDot (F x) (G x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => F x i) (fun x => G x i)| := + abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q F G hInt + _ ≤ ∑ i, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => F x i) * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact abs_cubeBesovPairing_le_mul_cubeLpNorm_of_holderConjugate + Q (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) (fun x => G x i) + (memLp_component_of_memLp F i hF) + (memLp_component_of_memLp G i hG) + _ ≤ ∑ _i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) F * + cubeLpNorm Q (2 : ℝ≥0∞) G := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact mul_le_mul + (cubeLpNorm_two_component_le_cubeLpNorm_two Q F i hF) + (cubeLpNorm_two_component_le_cubeLpNorm_two Q G i hG) + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => G x i)) + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F) + _ = + (Fintype.card (Fin d) : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F * + cubeLpNorm Q (2 : ℝ≥0∞) G := by + simp [Finset.sum_const, nsmul_eq_mul] + ring + +theorem memScalarL2_of_contDiff_hasCompactSupport {d : ℕ} + (U : Set (Vec d)) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict U + +theorem memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + {d : ℕ} (U : Set (Vec d)) (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U (euclideanCoordDeriv i ψ) := by + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hψ i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hψ_compact i)).restrict U + +namespace H1Function + +/-- Weak integration by parts between an `H¹` function and a zero-trace `H¹` +test. -/ +theorem integral_mul_zeroTrace_gradCoord_eq_neg_integral_gradCoord_mul + {d : ℕ} {U : Set (Vec d)} (u : H1Function U) + (φ : H10Function U) (i : Fin d) : + ∫ x in U, u x * φ.toH1Function.grad x i ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * φ.toH1Function x ∂MeasureTheory.volume := by + let Dapprox : ℕ → Vec d → ℝ := fun n x => + euclideanCoordDeriv i (φ.approx n) x + have happroxL2 : ∀ n, MemScalarL2 U (φ.approx n) := by + intro n + exact memScalarL2_of_contDiff_hasCompactSupport + U (φ.approx_smooth n) (φ.approx_hasCompactSupport n) + have hDapproxL2 : ∀ n, MemScalarL2 U (Dapprox n) := by + intro n + exact memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + U i (φ.approx_smooth n) (φ.approx_hasCompactSupport n) + exact + HasWeakPartialDerivOn.integral_mul_deriv_eq_neg_integral_mul_of_eLpNorm_approx + (U := U) (i := i) (u := u.toFun) (gi := fun x => u.grad x i) + (ψ := φ.toH1Function.toFun) (Dψ := fun x => φ.toH1Function.grad x i) + (u.hasWeakPartialDerivOn i) u.memL2 (u.gradMemL2 i) + φ.toH1Function.memL2 (φ.toH1Function.gradMemL2 i) + φ.approx φ.approx_smooth φ.approx_hasCompactSupport φ.approx_support_subset + happroxL2 (by + intro n + simpa [Dapprox] using hDapproxL2 n) + φ.tendsto_approx (by + simpa [Dapprox, euclideanCoordDeriv] using φ.tendsto_approx_grad i) + +end H1Function + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeHsRegularity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeHsRegularity.lean new file mode 100644 index 0000000000..537becf44c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeHsRegularity.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeScaleTransport +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKFullRegularity + +/-! +# Exact centered-cube Euclidean `H^s` Dirichlet regularity + +This module first converts the unit-cube continuous interpolation estimate to +the exact Euclidean fractional full norm. It then transports that estimate to +every centered triadic cube. The physical full norm carries the essential +root factor `3^(-m s)` in front of its normalized `L²` term, making both terms +scale by the same factor. + +## Main definitions + +- `centeredCubeEuclideanHsFullENorm`: the homogeneous physical fractional + full norm. + +## Main results + +- `exactOverlapRootWeight_originCube_eq_scale_rpow`: the exact root-factor + formula. +- `centeredCubeEuclideanHsFullENorm_eq_scale_mul_pullbackToUnit`: exact full + norm scaling. +- `exists_centeredCubeDirichletEuclideanHsFullENormRegularity`: the all-scale + exact Euclidean `H^s` Dirichlet estimate. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The homogeneous exact Euclidean fractional full norm on a centered cube. +The normalized `L²` term carries the same root-scale weight as the fractional +seminorm. -/ +noncomputable def centeredCubeEuclideanHsFullENorm {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + centeredCubeEuclideanHsESeminorm s F + +/-- Evaluation formula for the homogeneous physical fractional full norm. -/ +theorem centeredCubeEuclideanHsFullENorm_eq {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsFullENorm s F = + exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + centeredCubeEuclideanHsESeminorm s F := + rfl + +/-- On `originCube d m`, the overlap root factor is exactly the fractional +dilation factor `(3 ^ m)^(-s)`. -/ +theorem exactOverlapRootWeight_originCube_eq_scale_rpow {d : ℕ} + (m : ℤ) (s : ℝ) : + exactOverlapRootWeight (originCube d m) s = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-s) := by + unfold exactOverlapRootWeight + have hscale : ENNReal.ofReal (centeredCubeScale m) = + (3 : ℝ≥0∞) ^ (m : ℝ) := by + unfold centeredCubeScale + rw [← Real.rpow_intCast] + rw [← ENNReal.ofReal_rpow_of_pos (show (0 : ℝ) < 3 by norm_num)] + norm_num + rw [hscale, ← ENNReal.rpow_mul] + congr 1 + simp only [originCube] + ring + +/-- The physical full norm scales homogeneously by `(3 ^ m)^(-s)` under +pullback to the centered unit cube. -/ +theorem centeredCubeEuclideanHsFullENorm_eq_scale_mul_pullbackToUnit {d : ℕ} + {m : ℤ} (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsFullENorm s F = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-s.1) * + euclideanHsFullENorm s F.pullbackToUnit := by + rw [centeredCubeEuclideanHsFullENorm_eq, + exactOverlapRootWeight_originCube_eq_scale_rpow, + ← CenteredCubeEuclideanL2Field.normalizedEuclideanLpENorm_pullbackToUnit, + centeredCubeEuclideanHsESeminorm_eq_scale_mul_pullbackToUnit, + euclideanHsFullENorm_eq] + rw [mul_add] + +private theorem euclideanHsFullENorm_congr_ae {d : ℕ} {s : FractionalOrder} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + euclideanHsFullENorm s F = euclideanHsFullENorm s G := by + unfold euclideanHsFullENorm + rw [(unitCenteredCubeDomain d).normalizedEuclideanLpENorm_congr_ae + (2 : ℝ≥0∞) hFG, euclideanHsESeminorm_congr_ae hFG] + +/-- The unit-cube weak Dirichlet problem controls the exact Euclidean +fractional full norm. Both directions of the approved full-norm comparison +are used internally. -/ +theorem exists_unitCubeDirichletEuclideanHsFullENormRegularity + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))), + CubeDirichletDivergenceProblem (originCube d 0) w h → + euclideanHsFullENorm s (unitCubeGradientEuclideanL2Field w) ≤ + C * euclideanHsFullENorm s h := by + rcases exists_unitCubeDirichletContinuousKFullENormRegularity d with + ⟨CK, hCK, hK⟩ + let A : ℝ≥0∞ := continuousKEuclideanHsFullENormConstant s d + let C : ℝ≥0∞ := A * CK * A + refine ⟨C, ?_, ?_⟩ + · exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top (continuousKEuclideanHsFullENormConstant_lt_top s d) hCK) + (continuousKEuclideanHsFullENormConstant_lt_top s d) + · intro h w hproblem + calc + euclideanHsFullENorm s (unitCubeGradientEuclideanL2Field w) ≤ + A * continuousKFullENorm s (unitCubeGradientEuclideanL2Field w) := by + simpa only [A] using + euclideanHsFullENorm_le_mul_continuousKFullENorm s + (unitCubeGradientEuclideanL2Field w) + _ ≤ A * (CK * continuousKFullENorm s h) := by + exact mul_le_mul_right (hK s h w hproblem) A + _ ≤ A * (CK * (A * euclideanHsFullENorm s h)) := by + exact mul_le_mul_right (mul_le_mul_right + (continuousKFullENorm_le_mul_euclideanHsFullENorm s h) CK) A + _ = C * euclideanHsFullENorm s h := by + simp only [C] + ring + +private theorem centeredCubeHsScaleFactor_pos (m : ℤ) (s : FractionalOrder) : + 0 < (ENNReal.ofReal (centeredCubeScale m)) ^ (-s.1) := + ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr (centeredCubeScale_pos m)) + ENNReal.ofReal_ne_top + +private theorem centeredCubeHsScaleFactor_ne_top (m : ℤ) (s : FractionalOrder) : + (ENNReal.ofReal (centeredCubeScale m)) ^ (-s.1) ≠ ∞ := by + intro htop + rcases ENNReal.rpow_eq_top_iff.mp htop with hzero | htop' + · exact (ENNReal.ofReal_ne_zero_iff.mpr (centeredCubeScale_pos m)) hzero.1 + · exact ENNReal.ofReal_ne_top htop'.1 + +/-- One finite constant, fixed before the cube scale, datum, and solution, +controls the homogeneous exact Euclidean fractional full norm on every +centered triadic cube. -/ +theorem exists_centeredCubeDirichletEuclideanHsFullENormRegularity + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (h : CenteredCubeEuclideanL2Field d m) + (w : H10Function (openCubeSet (originCube d m))), + CubeDirichletDivergenceProblem (originCube d m) w h → + centeredCubeEuclideanHsFullENorm s + (centeredCubeGradientEuclideanL2Field w) ≤ + C * centeredCubeEuclideanHsFullENorm s h := by + rcases exists_unitCubeDirichletEuclideanHsFullENormRegularity d s with + ⟨C, hC, hunit⟩ + refine ⟨C, hC, ?_⟩ + intro m h w hproblem + let a : ℝ≥0∞ := (ENNReal.ofReal (centeredCubeScale m)) ^ (-s.1) + have ha_zero : a ≠ 0 := (centeredCubeHsScaleFactor_pos m s).ne' + have ha_top : a ≠ ∞ := centeredCubeHsScaleFactor_ne_top m s + have hunitProblem : CubeDirichletDivergenceProblem (originCube d 0) + (centeredCubeNormalizedPullback w) h.pullbackToUnit := + cubeDirichletDivergenceProblem_normalizedPullback h w hproblem + have hunitEstimate := hunit h.pullbackToUnit + (centeredCubeNormalizedPullback w) hunitProblem + have hgradient : + euclideanHsFullENorm s + (centeredCubeGradientEuclideanL2Field w).pullbackToUnit = + euclideanHsFullENorm s + (unitCubeGradientEuclideanL2Field (centeredCubeNormalizedPullback w)) := + euclideanHsFullENorm_congr_ae + (unitCubeGradientEuclideanL2Field_normalizedPullback_ae_eq w).symm + have hunitEstimate' : + euclideanHsFullENorm s + (centeredCubeGradientEuclideanL2Field w).pullbackToUnit ≤ + C * euclideanHsFullENorm s h.pullbackToUnit := by + rw [hgradient] + exact hunitEstimate + rw [centeredCubeEuclideanHsFullENorm_eq_scale_mul_pullbackToUnit, + centeredCubeEuclideanHsFullENorm_eq_scale_mul_pullbackToUnit] + change a * euclideanHsFullENorm s + (centeredCubeGradientEuclideanL2Field w).pullbackToUnit ≤ + C * (a * euclideanHsFullENorm s h.pullbackToUnit) + rw [show C * (a * euclideanHsFullENorm s h.pullbackToUnit) = + a * (C * euclideanHsFullENorm s h.pullbackToUnit) by ac_rfl] + exact (ENNReal.mul_le_mul_iff_right ha_zero ha_top).2 hunitEstimate' + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeScaleTransport.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeScaleTransport.lean new file mode 100644 index 0000000000..f8fa364569 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CenteredCubeScaleTransport.lean @@ -0,0 +1,262 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKRegularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanH2 + +/-! +# Centered-cube transport for the Dirichlet divergence problem + +This module transports the zero-trace weak problem on `originCube d m` to the +centered unit cube. The solution is normalized as +`wHat(x) = (3 ^ m)⁻¹ w((3 ^ m) x)`, so its weak gradient is the unscaled +pullback of the physical gradient. + +## Main definitions + +- `centeredCubeGradientEuclideanL2Field`: the physical gradient as an exact + centered-cube Euclidean `L²` field. +- `centeredCubeNormalizedPullback`: the normalized zero-trace pullback. + +## Main results + +- `centeredCubeNormalizedPullback_grad`: exact pointwise gradient transport. +- `cubeDirichletDivergenceProblem_normalizedPullback`: transport of the weak + divergence problem to the unit cube. +- `unitCubeGradientEuclideanL2Field_normalizedPullback_apply`: compatibility + of the unit gradient carrier with centered-cube field pullback. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Pointwise + +noncomputable section + +private theorem castH10Function_apply {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) (x : Vec d) : + (hUV ▸ u).toH1Function.toFun x = u.toH1Function.toFun x := by + subst V + rfl + +private theorem castH10Function_grad {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) (x : Vec d) : + (hUV ▸ u).toH1Function.grad x = u.toH1Function.grad x := by + subst V + rfl + +private theorem centeredOpenCube_eq_smul_unitCenteredOpenCube + {d : ℕ} (m : ℤ) : + openCubeSet (originCube d m) = + centeredCubeScale m • openCubeSet (originCube d 0) := by + simpa only [centeredCubeScale, cubeScaleFactor_originCube] using + openCubeSet_originCube_eq_smul_originCube_zero (d := d) m + +private theorem unitCenteredOpenCube_eq_inv_smul_centeredOpenCube + {d : ℕ} (m : ℤ) : + openCubeSet (originCube d 0) = + (centeredCubeScale m)⁻¹ • openCubeSet (originCube d m) := by + rw [openCubeSet_originCube_eq_smul_originCube_zero (d := d) m] + rw [show cubeScaleFactor (originCube d m) = centeredCubeScale m by rfl] + rw [smul_smul, inv_mul_cancel₀ (centeredCubeScale_ne_zero m), one_smul] + +/-- The gradient of a physical centered-cube zero-trace function, packaged as +the exact Euclidean `L²` field used by the fractional scale-transport API. -/ +noncomputable def centeredCubeGradientEuclideanL2Field {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) : + CenteredCubeEuclideanL2Field d m where + toField := fun x => w.toH1Function.grad x + euclideanMemL2 := by + rw [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rw [memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + w.toH1Function.grad_memL2_normalizedCubeMeasure (Q := originCube d m) i + +@[simp] theorem centeredCubeGradientEuclideanL2Field_apply {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + centeredCubeGradientEuclideanL2Field w x = w.toH1Function.grad x := + rfl + +/-- The normalized zero-trace pullback +`wHat(x) = (3 ^ m)⁻¹ w((3 ^ m) x)` from the centered physical cube to the +centered unit cube. -/ +noncomputable def centeredCubeNormalizedPullback {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) : + H10Function (openCubeSet (originCube d 0)) := + (centeredCubeScale m)⁻¹ • H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ w) + +/-- Pointwise value formula for the normalized zero-trace pullback. -/ +@[simp] theorem centeredCubeNormalizedPullback_apply {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + centeredCubeNormalizedPullback w x = + (centeredCubeScale m)⁻¹ * w (centeredCubeScale m • x) := by + unfold centeredCubeNormalizedPullback + change (centeredCubeScale m)⁻¹ * + (H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ w)).toH1Function.toFun x = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_toFun] + rw [castH10Function_apply] + +/-- The normalized pullback has the unscaled physical gradient pointwise. -/ +@[simp] theorem centeredCubeNormalizedPullback_grad {d : ℕ} {m : ℤ} + (w : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + (centeredCubeNormalizedPullback w).toH1Function.grad x = + w.toH1Function.grad (centeredCubeScale m • x) := by + unfold centeredCubeNormalizedPullback + change (centeredCubeScale m)⁻¹ • + (H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ w)).toH1Function.grad x = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_grad] + rw [castH10Function_grad] + ext i + simp only [Pi.smul_apply, smul_eq_mul] + field_simp [centeredCubeScale_ne_zero m] + +/-- Inverse normalized transport of a unit-cube zero-trace test: +`phi_m(y) = (3 ^ m) phi((3 ^ m)⁻¹ y)`. -/ +private noncomputable def centeredCubeNormalizedTestPushforward {d : ℕ} {m : ℤ} + (phi : H10Function (openCubeSet (originCube d 0))) : + H10Function (openCubeSet (originCube d m)) := + centeredCubeScale m • H10Function.unscale (inv_pos.mpr (centeredCubeScale_pos m)) + (unitCenteredOpenCube_eq_inv_smul_centeredOpenCube m ▸ phi) + +private theorem centeredCubeNormalizedTestPushforward_apply {d : ℕ} {m : ℤ} + (phi : H10Function (openCubeSet (originCube d 0))) (y : Vec d) : + centeredCubeNormalizedTestPushforward (m := m) phi y = + centeredCubeScale m * phi ((centeredCubeScale m)⁻¹ • y) := by + unfold centeredCubeNormalizedTestPushforward + change centeredCubeScale m * + (H10Function.unscale (inv_pos.mpr (centeredCubeScale_pos m)) + (unitCenteredOpenCube_eq_inv_smul_centeredOpenCube m ▸ phi)).toH1Function.toFun y = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_toFun] + rw [castH10Function_apply] + +private theorem centeredCubeNormalizedTestPushforward_grad {d : ℕ} {m : ℤ} + (phi : H10Function (openCubeSet (originCube d 0))) (y : Vec d) : + (centeredCubeNormalizedTestPushforward (m := m) phi).toH1Function.grad y = + phi.toH1Function.grad ((centeredCubeScale m)⁻¹ • y) := by + unfold centeredCubeNormalizedTestPushforward + change centeredCubeScale m • + (H10Function.unscale (inv_pos.mpr (centeredCubeScale_pos m)) + (unitCenteredOpenCube_eq_inv_smul_centeredOpenCube m ▸ phi)).toH1Function.grad y = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_grad] + rw [castH10Function_grad] + ext i + simp only [Pi.smul_apply, smul_eq_mul] + field_simp [centeredCubeScale_ne_zero m] + +private theorem setIntegral_centeredCube_comp_dilation {d : ℕ} {m : ℤ} + (f : Vec d → ℝ) : + ∫ x in openCubeSet (originCube d 0), f (centeredCubeScale m • x) + ∂volume = + ((centeredCubeScale m) ^ d)⁻¹ * + ∫ y in openCubeSet (originCube d m), f y ∂volume := by + have hchange := Measure.setIntegral_comp_smul_of_pos + (μ := volume) (f := f) (s := openCubeSet (originCube d 0)) + (centeredCubeScale_pos m) + rw [← centeredOpenCube_eq_smul_unitCenteredOpenCube (d := d) m] + at hchange + simpa only [centeredCubeScale, cubeScaleFactor_originCube, Module.finrank_fin_fun, + smul_eq_mul] using hchange + +/-- Exact transport of `-Delta w = div h` from a centered physical cube to +the centered unit cube under the normalized pullback. -/ +theorem cubeDirichletDivergenceProblem_normalizedPullback {d : ℕ} {m : ℤ} + (h : CenteredCubeEuclideanL2Field d m) + (w : H10Function (openCubeSet (originCube d m))) + (hproblem : CubeDirichletDivergenceProblem (originCube d m) w h) : + CubeDirichletDivergenceProblem (originCube d 0) + (centeredCubeNormalizedPullback w) h.pullbackToUnit := by + intro phi + let psi : H10Function (openCubeSet (originCube d m)) := + centeredCubeNormalizedTestPushforward (m := m) phi + have hweak := hproblem psi + let lhsPhysical : Vec d → ℝ := fun y => + vecDot (w.toH1Function.grad y) (psi.toH1Function.grad y) + let rhsPhysical : Vec d → ℝ := fun y => + vecDot (h y) (psi.toH1Function.grad y) + have hlhsPointwise (x : Vec d) : + lhsPhysical (centeredCubeScale m • x) = + vecDot ((centeredCubeNormalizedPullback w).toH1Function.grad x) + (phi.toH1Function.grad x) := by + dsimp only [lhsPhysical] + rw [centeredCubeNormalizedPullback_grad] + rw [show psi.toH1Function.grad (centeredCubeScale m • x) = + phi.toH1Function.grad x by + rw [show psi = centeredCubeNormalizedTestPushforward (m := m) phi by rfl] + rw [centeredCubeNormalizedTestPushforward_grad] + congr 2 + simp [centeredCubeScale_ne_zero m]] + have hrhsPointwise (x : Vec d) : + rhsPhysical (centeredCubeScale m • x) = + vecDot (h.pullbackToUnit x) (phi.toH1Function.grad x) := by + dsimp only [rhsPhysical] + rw [CenteredCubeEuclideanL2Field.pullbackToUnit_apply] + rw [show psi.toH1Function.grad (centeredCubeScale m • x) = + phi.toH1Function.grad x by + rw [show psi = centeredCubeNormalizedTestPushforward (m := m) phi by rfl] + rw [centeredCubeNormalizedTestPushforward_grad] + congr 2 + simp [centeredCubeScale_ne_zero m]] + have hlhsChange : + ∫ x in openCubeSet (originCube d 0), + vecDot ((centeredCubeNormalizedPullback w).toH1Function.grad x) + (phi.toH1Function.grad x) ∂volume = + ((centeredCubeScale m) ^ d)⁻¹ * + ∫ y in openCubeSet (originCube d m), lhsPhysical y ∂volume := by + rw [← setIntegral_centeredCube_comp_dilation lhsPhysical] + apply integral_congr_ae + filter_upwards with x + exact (hlhsPointwise x).symm + have hrhsChange : + ∫ x in openCubeSet (originCube d 0), + vecDot (h.pullbackToUnit x) (phi.toH1Function.grad x) ∂volume = + ((centeredCubeScale m) ^ d)⁻¹ * + ∫ y in openCubeSet (originCube d m), rhsPhysical y ∂volume := by + rw [← setIntegral_centeredCube_comp_dilation rhsPhysical] + apply integral_congr_ae + filter_upwards with x + exact (hrhsPointwise x).symm + rw [hlhsChange, hrhsChange] + change ((centeredCubeScale m) ^ d)⁻¹ * + (∫ y in openCubeSet (originCube d m), + vecDot (w.toH1Function.grad y) (psi.toH1Function.grad y) ∂volume) = _ + rw [hweak] + ring + +/-- The unit gradient field is pointwise the centered-cube pullback of the +physical gradient field. -/ +theorem unitCubeGradientEuclideanL2Field_normalizedPullback_apply {d : ℕ} + {m : ℤ} (w : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + unitCubeGradientEuclideanL2Field (centeredCubeNormalizedPullback w) x = + (centeredCubeGradientEuclideanL2Field w).pullbackToUnit x := by + rw [unitCubeGradientEuclideanL2Field_apply, + centeredCubeNormalizedPullback_grad, + CenteredCubeEuclideanL2Field.pullbackToUnit_apply, + centeredCubeGradientEuclideanL2Field_apply] + +/-- The unit gradient field agrees almost everywhere with the pullback of the +physical gradient field. -/ +theorem unitCubeGradientEuclideanL2Field_normalizedPullback_ae_eq {d : ℕ} + {m : ℤ} (w : H10Function (openCubeSet (originCube d m))) : + unitCubeGradientEuclideanL2Field (centeredCubeNormalizedPullback w) =ᵐ[ + (unitCenteredCubeDomain d).normalizedVolume] + (centeredCubeGradientEuclideanL2Field w).pullbackToUnit := + Filter.Eventually.of_forall + (unitCubeGradientEuclideanL2Field_normalizedPullback_apply w) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ConcreteAveraging.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ConcreteAveraging.lean new file mode 100644 index 0000000000..f86324f67a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ConcreteAveraging.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradientExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DirichletBridge + +/-! # Concrete Averaging -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Residual constant for the concrete smooth overlap averaging operator. -/ +noncomputable def concreteOverlapAveragingResidualConstant (d : ℕ) : ℝ := + Real.sqrt (((3 ^ d : ℕ) : ℝ) * (3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ)) + +theorem concreteOverlapAveragingResidualConstant_nonneg (d : ℕ) : + 0 ≤ concreteOverlapAveragingResidualConstant d := by + unfold concreteOverlapAveragingResidualConstant + exact Real.sqrt_nonneg _ + +/-- Gradient constant for the concrete smooth overlap averaging operator. -/ +noncomputable def concreteOverlapAveragingGradientConstant (d : ℕ) : ℝ := + (Fintype.card (Fin d) : ℝ) * (Fintype.card (Fin d) : ℝ) * + (Real.sqrt ((3 ^ d : ℝ) * ((3 ^ d : ℝ) * + (Fintype.card (Fin d) : ℝ))) * + smoothOverlapPartitionDerivativeConstant d) + +theorem concreteOverlapAveragingGradientConstant_nonneg (d : ℕ) : + 0 ≤ concreteOverlapAveragingGradientConstant d := by + unfold concreteOverlapAveragingGradientConstant + exact mul_nonneg + (mul_nonneg (by positivity) (by positivity)) + (mul_nonneg (Real.sqrt_nonneg _) + (smoothOverlapPartitionDerivativeConstant_nonneg d)) + +/-- Dimension-only constant controlling both the residual and the scaled +gradient of the concrete smooth overlap averaging competitor. -/ +noncomputable def concreteOverlapAveragingCompetitorConstant (d : ℕ) : ℝ := + concreteOverlapAveragingResidualConstant d + + concreteOverlapAveragingGradientConstant d + +theorem concreteOverlapAveragingCompetitorConstant_nonneg (d : ℕ) : + 0 ≤ concreteOverlapAveragingCompetitorConstant d := by + unfold concreteOverlapAveragingCompetitorConstant + exact add_nonneg + (concreteOverlapAveragingResidualConstant_nonneg d) + (concreteOverlapAveragingGradientConstant_nonneg d) + +theorem concreteSmoothOverlapPartition_residualConstant + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (concreteSmoothOverlapPartition Q j).residualConstant = + concreteOverlapAveragingResidualConstant d := by + rfl + +theorem concreteSmoothOverlapPartition_gradientConstant + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (concreteSmoothOverlapPartition Q j).gradientConstant = + concreteOverlapAveragingGradientConstant d := by + rfl + +theorem concreteSmoothOverlapPartition_residualConstant_le_competitorConstant + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (concreteSmoothOverlapPartition Q j).residualConstant ≤ + concreteOverlapAveragingCompetitorConstant d := by + rw [concreteSmoothOverlapPartition_residualConstant] + unfold concreteOverlapAveragingCompetitorConstant + exact le_add_of_nonneg_right + (concreteOverlapAveragingGradientConstant_nonneg d) + +theorem concreteSmoothOverlapPartition_gradientConstant_le_competitorConstant + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (concreteSmoothOverlapPartition Q j).gradientConstant ≤ + concreteOverlapAveragingCompetitorConstant d := by + rw [concreteSmoothOverlapPartition_gradientConstant] + unfold concreteOverlapAveragingCompetitorConstant + exact le_add_of_nonneg_left + (concreteOverlapAveragingResidualConstant_nonneg d) + +/-- The concrete normalized smooth overlap partition supplies the one-depth +averaging competitor estimate with a dimension-only constant. -/ +theorem cubeKBesovOverlapAveragingCompetitorEstimate_concrete + (d : ℕ) : + CubeKBesovOverlapAveragingCompetitorEstimate d + (concreteOverlapAveragingCompetitorConstant d) := by + intro Q h j hh + let P : SmoothOverlapPartition Q j := concreteSmoothOverlapPartition Q j + have hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + intro S hS + exact memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + hS hh + refine ⟨P.averagingCompetitor h, ?_, ?_⟩ + · have hres : + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) ≤ + P.residualConstant * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + P.cubeLpNorm_sub_averagingField_le_residualConstant_mul_sqrt_depthAverage + h hloc + have hconst : + P.residualConstant ≤ concreteOverlapAveragingCompetitorConstant d := by + simpa [P] using + concreteSmoothOverlapPartition_residualConstant_le_competitorConstant + Q j + have hsqrt_nonneg : + 0 ≤ Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + Real.sqrt_nonneg _ + calc + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - (P.averagingCompetitor h).toField x) + = + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - P.averagingField h x) := by + rfl + _ ≤ + P.residualConstant * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + hres + _ ≤ + concreteOverlapAveragingCompetitorConstant d * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + mul_le_mul_of_nonneg_right hconst hsqrt_nonneg + · have hgrad : + Real.rpow (3 : ℝ) (-(j : ℝ)) * + (P.averagingCompetitor h).relativeGradientCoordL2NormSum ≤ + P.gradientConstant * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + P.rpow_neg_mul_relativeGradientCoordL2NormSum_averagingCompetitor_le_sqrt_depthAverage + h hloc + have hconst : + P.gradientConstant ≤ concreteOverlapAveragingCompetitorConstant d := by + simpa [P] using + concreteSmoothOverlapPartition_gradientConstant_le_competitorConstant + Q j + have hsqrt_nonneg : + 0 ≤ Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := + Real.sqrt_nonneg _ + exact hgrad.trans + (mul_le_mul_of_nonneg_right hconst hsqrt_nonneg) + +/-- Concrete replacement for the finite-level K/overlapping comparison input +used by the public constant-coefficient Dirichlet Besov theorem. -/ +theorem cubeKBesovPartialBoundByOverlappingPositiveUniform_concrete + (d : ℕ) : + CubeKBesovPartialBoundByOverlappingPositiveUniform d + (2 * concreteOverlapAveragingCompetitorConstant d) := + cubeKBesovPartialBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + (concreteOverlapAveragingCompetitorConstant_nonneg d) + (cubeKBesovOverlapAveragingCompetitorEstimate_concrete d) + +/-- Concrete replacement for the finite-level K/overlapping comparison input +used by the public constant-coefficient Dirichlet Besov theorem. -/ +theorem cubeKBesovPartialBoundByOverlappingPositive_concrete + (d : ℕ) : + CubeKBesovPartialBoundByOverlappingPositive d := + (cubeKBesovPartialBoundByOverlappingPositiveUniform_concrete d).to_partialBound + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKFullRegularity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKFullRegularity.lean new file mode 100644 index 0000000000..be9670aa4e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKFullRegularity.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ContinuousKRegularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.FullNormEquivalence + +/-! +# Full continuous K-regularity for the unit-cube Dirichlet problem + +This module integrates the pointwise continuous `K`-functional estimate and +combines it with the exact normalized Euclidean `L²` energy estimate. The +resulting full-norm constant is chosen before the fractional order, datum, and +solution. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem UnitCubeEuclideanL2Field.ambientMemL2 {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + MemLp F (2 : ℝ≥0∞) (unitCenteredCubeDomain d).normalizedVolume := by + apply MemLp.of_eval + intro i + have hF := F.euclideanMemL2 + rw [memLp_piLp_iff] at hF + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF i + +private theorem continuousKSeminorm_le_of_pointwise + {d : ℕ} {C : ℝ} (hC : 0 ≤ C) + (hpoint : ∀ (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))) + (t : ContinuousKScale), + CubeDirichletDivergenceProblem (originCube d 0) w h → + continuousKFunctional t (unitCubeGradientEuclideanL2Field w) ≤ + C * continuousKFunctional t h) : + ∀ (s : FractionalOrder) (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))), + CubeDirichletDivergenceProblem (originCube d 0) w h → + continuousKSeminorm s (unitCubeGradientEuclideanL2Field w) ≤ + (ENNReal.ofReal C ^ 2) ^ (1 / 2 : ℝ) * continuousKSeminorm s h := by + intro s h w hweak + let out : UnitCubeEuclideanL2Field d := unitCubeGradientEuclideanL2Field w + let c : ℝ≥0∞ := ENNReal.ofReal C + have hintegrand : ∀ t ∈ Set.Ioo (0 : ℝ) 1, + continuousKSeminormIntegrand s.1 out t ≤ + c ^ 2 * continuousKSeminormIntegrand s.1 h t := by + intro t ht + let kt : ContinuousKScale := ⟨t, ⟨ht.1, ht.2.le⟩⟩ + have hK : continuousKFunctional kt out ≤ C * continuousKFunctional kt h := by + simpa only [out] using hpoint h w kt hweak + have hCkh_nonneg : 0 ≤ C * continuousKFunctional kt h := + mul_nonneg hC (continuousKFunctional_nonneg kt h) + have hKsq : continuousKFunctional kt out ^ 2 ≤ + (C * continuousKFunctional kt h) ^ 2 := + (sq_le_sq₀ (continuousKFunctional_nonneg kt out) hCkh_nonneg).2 hK + have hKsq_ofReal : + ENNReal.ofReal (continuousKFunctional kt out ^ 2) ≤ + c ^ 2 * ENNReal.ofReal (continuousKFunctional kt h ^ 2) := by + calc + ENNReal.ofReal (continuousKFunctional kt out ^ 2) ≤ + ENNReal.ofReal ((C * continuousKFunctional kt h) ^ 2) := + ENNReal.ofReal_le_ofReal hKsq + _ = c ^ 2 * ENNReal.ofReal (continuousKFunctional kt h ^ 2) := by + rw [ENNReal.ofReal_pow hCkh_nonneg, ENNReal.ofReal_mul hC, + ENNReal.ofReal_pow (continuousKFunctional_nonneg kt h)] + ring + rw [continuousKSeminormIntegrand_eq_of_mem s.1 out ht, + continuousKSeminormIntegrand_eq_of_mem s.1 h ht] + change + ENNReal.ofReal (Real.rpow t (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional kt out ^ 2) * ENNReal.ofReal t⁻¹ ≤ + c ^ 2 * + (ENNReal.ofReal (Real.rpow t (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional kt h ^ 2) * ENNReal.ofReal t⁻¹) + calc + ENNReal.ofReal (Real.rpow t (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional kt out ^ 2) * ENNReal.ofReal t⁻¹ ≤ + ENNReal.ofReal (Real.rpow t (-2 * s.1)) * + (c ^ 2 * ENNReal.ofReal (continuousKFunctional kt h ^ 2)) * + ENNReal.ofReal t⁻¹ := by + gcongr + _ = c ^ 2 * + (ENNReal.ofReal (Real.rpow t (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional kt h ^ 2) * ENNReal.ofReal t⁻¹) := by + ring + have hintegral : + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 out t) ≤ + c ^ 2 * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 h t := by + calc + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 out t) ≤ + ∫⁻ t in Set.Ioo (0 : ℝ) 1, + c ^ 2 * continuousKSeminormIntegrand s.1 h t := + setLIntegral_mono' measurableSet_Ioo hintegrand + _ = c ^ 2 * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 h t := by + rw [lintegral_const_mul' _ _ (ENNReal.pow_ne_top ENNReal.ofReal_ne_top)] + rw [continuousKSeminorm_eq_lintegral, continuousKSeminorm_eq_lintegral] + calc + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 out t) ^ + (1 / 2 : ℝ) ≤ + (c ^ 2 * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 h t) ^ + (1 / 2 : ℝ) := + ENNReal.rpow_le_rpow hintegral (by norm_num) + _ = (c ^ 2) ^ (1 / 2 : ℝ) * + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 h t) ^ + (1 / 2 : ℝ) := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by norm_num)] + _ = (ENNReal.ofReal C ^ 2) ^ (1 / 2 : ℝ) * + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 h t) ^ + (1 / 2 : ℝ) := rfl + +/-- Integrating the pointwise continuous `K`-functional estimate gives a +uniform continuum interpolation-seminorm estimate. -/ +theorem exists_unitCubeDirichletContinuousKSeminormRegularity + (d : ℕ) [NeZero d] : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (s : FractionalOrder) (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))), + CubeDirichletDivergenceProblem (originCube d 0) w h → + continuousKSeminorm s (unitCubeGradientEuclideanL2Field w) ≤ + C * continuousKSeminorm s h := by + rcases exists_unitCubeDirichletContinuousKFunctionalRegularity d with + ⟨C, hC, hpoint⟩ + let Csem : ℝ≥0∞ := (ENNReal.ofReal C ^ 2) ^ (1 / 2 : ℝ) + refine ⟨Csem, ?_, ?_⟩ + · exact ENNReal.rpow_lt_top_of_nonneg (by norm_num) + (ENNReal.pow_ne_top ENNReal.ofReal_ne_top) + · simpa only [Csem] using continuousKSeminorm_le_of_pointwise hC hpoint + +/-- The weak Dirichlet equation controls the exact normalized Euclidean `L²` +norm of the solution gradient by that of the datum. The concrete ambient-norm +energy theorem is converted here using both directions of the explicit +finite-dimensional Euclidean/ambient norm comparison. -/ +theorem exists_unitCubeGradientNormalizedEuclideanL2EnergyRegularity + (d : ℕ) [NeZero d] : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))), + CubeDirichletDivergenceProblem (originCube d 0) w h → + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) + (unitCubeGradientEuclideanL2Field w) ≤ + C * (unitCenteredCubeDomain d).normalizedEuclideanLpENorm + (2 : ℝ≥0∞) h := by + rcases cubeDirichletDivergenceEnergyEstimate d with ⟨C₀, hC₀, henergy⟩ + let Cenergy : ℝ≥0∞ := ENNReal.ofReal (d : ℝ) * ENNReal.ofReal C₀ + refine ⟨Cenergy, ?_, ?_⟩ + · exact ENNReal.mul_lt_top ENNReal.ofReal_lt_top ENNReal.ofReal_lt_top + · intro h w hweak + let out : UnitCubeEuclideanL2Field d := unitCubeGradientEuclideanL2Field w + let μ : Measure (Vec d) := (unitCenteredCubeDomain d).normalizedVolume + have hout_mem : MemLp out (2 : ℝ≥0∞) μ := out.ambientMemL2 + have hh_mem : MemLp h (2 : ℝ≥0∞) μ := h.ambientMemL2 + have hh_cube_mem : + MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := by + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + exact hh_mem + have henergy_real : + (eLpNorm out (2 : ℝ≥0∞) μ).toReal ≤ + C₀ * (eLpNorm h (2 : ℝ≥0∞) μ).toReal := by + simpa only [cubeLpNorm, μ, out, unitCubeGradientEuclideanL2Field, + normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + using henergy (originCube d 0) h w hh_cube_mem hweak + have henergy_ennreal : + eLpNorm out (2 : ℝ≥0∞) μ ≤ + ENNReal.ofReal C₀ * eLpNorm h (2 : ℝ≥0∞) μ := by + apply (ENNReal.toReal_le_toReal hout_mem.eLpNorm_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top hh_mem.eLpNorm_ne_top)).mp + rw [ENNReal.toReal_mul, ENNReal.toReal_ofReal hC₀] + exact henergy_real + have hout_euclidean_le : + eLpNorm (fun x => euclideanNorm (out x)) (2 : ℝ≥0∞) μ ≤ + ENNReal.ofReal (d : ℝ) * eLpNorm out (2 : ℝ≥0∞) μ := by + apply eLpNorm_le_mul_eLpNorm_of_ae_le_mul + filter_upwards [] with x + simpa only [Real.norm_eq_abs, abs_of_nonneg (euclideanNorm_nonneg (out x))] using + euclideanNorm_le_dimension_mul_norm (out x) + have hh_ambient_le_euclidean : + eLpNorm h (2 : ℝ≥0∞) μ ≤ + eLpNorm (fun x => euclideanNorm (h x)) (2 : ℝ≥0∞) μ := by + apply eLpNorm_mono + intro x + simpa only [Real.norm_eq_abs, abs_of_nonneg (euclideanNorm_nonneg (h x))] using + norm_le_euclideanNorm (h x) + change + eLpNorm (fun x => euclideanNorm (out x)) (2 : ℝ≥0∞) μ ≤ + Cenergy * eLpNorm (fun x => euclideanNorm (h x)) (2 : ℝ≥0∞) μ + calc + eLpNorm (fun x => euclideanNorm (out x)) (2 : ℝ≥0∞) μ ≤ + ENNReal.ofReal (d : ℝ) * eLpNorm out (2 : ℝ≥0∞) μ := + hout_euclidean_le + _ ≤ ENNReal.ofReal (d : ℝ) * + (ENNReal.ofReal C₀ * eLpNorm h (2 : ℝ≥0∞) μ) := by + gcongr + _ ≤ ENNReal.ofReal (d : ℝ) * + (ENNReal.ofReal C₀ * + eLpNorm (fun x => euclideanNorm (h x)) (2 : ℝ≥0∞) μ) := by + gcongr + _ = Cenergy * + eLpNorm (fun x => euclideanNorm (h x)) (2 : ℝ≥0∞) μ := by + simp only [Cenergy] + ring + +/-- The exact additive continuous-interpolation full norm of the unit-cube +Dirichlet solution gradient is controlled by that of the datum. A single +finite dimension-dependent constant is chosen before the fractional order, +datum, and solution; all endpoint and comparison estimates are discharged in +the proof. -/ +theorem exists_unitCubeDirichletContinuousKFullENormRegularity + (d : ℕ) [NeZero d] : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (s : FractionalOrder) (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))), + CubeDirichletDivergenceProblem (originCube d 0) w h → + continuousKFullENorm s (unitCubeGradientEuclideanL2Field w) ≤ + C * continuousKFullENorm s h := by + rcases exists_unitCubeGradientNormalizedEuclideanL2EnergyRegularity d with + ⟨Cenergy, hCenergy, henergy⟩ + rcases exists_unitCubeDirichletContinuousKSeminormRegularity d with + ⟨Csem, hCsem, hsem⟩ + let C : ℝ≥0∞ := max Cenergy Csem + refine ⟨C, (max_lt_iff.2 ⟨hCenergy, hCsem⟩), ?_⟩ + intro s h w hweak + rw [continuousKFullENorm_eq, continuousKFullENorm_eq] + calc + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) + (unitCubeGradientEuclideanL2Field w) + + continuousKSeminorm s (unitCubeGradientEuclideanL2Field w) ≤ + Cenergy * + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) h + + Csem * continuousKSeminorm s h := + add_le_add (henergy h w hweak) (hsem s h w hweak) + _ ≤ C * (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) h + + C * continuousKSeminorm s h := by + apply add_le_add + · exact mul_le_mul_left (le_max_left Cenergy Csem) _ + · exact mul_le_mul_left (le_max_right Cenergy Csem) _ + _ = C * + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) h + + continuousKSeminorm s h) := by + rw [mul_add] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKRegularity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKRegularity.lean new file mode 100644 index 0000000000..b1d4cc2eed --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ContinuousKRegularity.lean @@ -0,0 +1,96 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PublicTheorems +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKBridge + +/-! +# Continuous K-functional regularity for the unit-cube Dirichlet problem + +This module transfers the concrete constant-coefficient Dirichlet endpoint +estimates to the exact continuous `K`-functional on the centered unit cube. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The gradient of a zero-trace unit-cube function, packaged as the exact +Euclidean `L²` field consumed by the continuous `K`-functional. -/ +noncomputable def unitCubeGradientEuclideanL2Field {d : ℕ} + (w : H10Function (openCubeSet (originCube d 0))) : + UnitCubeEuclideanL2Field d where + toField := fun x => w.toH1Function.grad x + euclideanMemL2 := by + rw [← normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + w.toH1Function.grad_memL2_normalizedCubeMeasure (Q := originCube d 0) i + +@[simp] theorem unitCubeGradientEuclideanL2Field_apply {d : ℕ} + (w : H10Function (openCubeSet (originCube d 0))) (x : Vec d) : + unitCubeGradientEuclideanL2Field w x = w.toH1Function.grad x := + rfl + +private theorem UnitCubeEuclideanL2Field.memLp_originCube_normalizedCubeMeasure + {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := by + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + apply MemLp.of_eval + intro i + have hF := F.euclideanMemL2 + rw [memLp_piLp_iff] at hF + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF i + +/-- The exact continuous `K`-functional estimate for the constant-coefficient +zero-Dirichlet divergence problem on the centered unit cube. The constant is +chosen before the datum, solution, and interpolation scale, so it depends only +on the dimension. -/ +theorem exists_unitCubeDirichletContinuousKFunctionalRegularity + (d : ℕ) [NeZero d] : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (h : UnitCubeEuclideanL2Field d) + (w : H10Function (openCubeSet (originCube d 0))) + (t : ContinuousKScale), + CubeDirichletDivergenceProblem (originCube d 0) w h → + continuousKFunctional t (unitCubeGradientEuclideanL2Field w) ≤ + C * continuousKFunctional t h := by + rcases cubeKFunctionalDirichletPointwiseRegularity d with ⟨Cₚ, hCₚ, hpoint⟩ + let D : ℝ := continuousDiscreteKBridgeConstant d + refine ⟨D * Cₚ * D, ?_, ?_⟩ + · exact mul_nonneg (mul_nonneg (continuousDiscreteKBridgeConstant_nonneg d) hCₚ) + (continuousDiscreteKBridgeConstant_nonneg d) + · intro h w t hweak + let out : UnitCubeEuclideanL2Field d := unitCubeGradientEuclideanL2Field w + have hdisc := hpoint (originCube d 0) h w t.1 + h.memLp_originCube_normalizedCubeMeasure hweak + calc + continuousKFunctional t out ≤ + D * cubeVectorKFunctional (originCube d 0) t.1 out := by + simpa only [D] using continuousKFunctional_le_mul_cubeVectorKFunctional t out + _ ≤ D * (Cₚ * cubeVectorKFunctional (originCube d 0) t.1 h) := by + apply mul_le_mul_of_nonneg_left + · simpa only [out, unitCubeGradientEuclideanL2Field] using hdisc + · exact continuousDiscreteKBridgeConstant_nonneg d + _ ≤ D * (Cₚ * (D * continuousKFunctional t h)) := by + apply mul_le_mul_of_nonneg_left + · apply mul_le_mul_of_nonneg_left + · simpa only [D] using cubeVectorKFunctional_le_mul_continuousKFunctional t h + · exact hCₚ + · exact continuousDiscreteKBridgeConstant_nonneg d + _ = (D * Cₚ * D) * continuousKFunctional t h := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CubeVectorH1.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CubeVectorH1.lean new file mode 100644 index 0000000000..4df09a877b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/CubeVectorH1.lean @@ -0,0 +1,476 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm + +/-! # Cube Vector H1 -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Weak zero-trace formulation of `-Δw = div h` on a cube. -/ +def CubeDirichletDivergenceProblem {d : ℕ} + (Q : TriadicCube d) (w : H10Function (openCubeSet Q)) + (h : Vec d → Vec d) : Prop := + ∀ φ : H10Function (openCubeSet Q), + ∫ x in openCubeSet Q, + vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet Q, + vecDot (h x) (φ.toH1Function.grad x) ∂volume + +/-- Abstract placeholder for the cube vector K-functional Besov norm. The +formal proof will later replace this model by the actual K-functional +definition; keeping it as a parameter lets the Dirichlet proof consume only the +properties it needs. -/ +abbrev CubeKBesovNormModel (d : ℕ) : Type := + TriadicCube d → ℝ → (Vec d → Vec d) → ℝ + +/-- Coordinatewise `H¹` vector-field competitors on a cube for the +K-functional. -/ +structure CubeVectorH1Function {d : ℕ} (Q : TriadicCube d) where + coord : Fin d → H1Function (openCubeSet Q) + +namespace CubeVectorH1Function + +instance {d : ℕ} {Q : TriadicCube d} : Inhabited (CubeVectorH1Function Q) := + ⟨{ coord := fun _ => 0 }⟩ + +/-- The vector field represented by a coordinatewise `H¹` competitor. -/ +noncomputable def toField {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : Vec d → Vec d := + fun x i => G.coord i x + +/-- Restrict one coordinate of a parent-cube `H¹` vector competitor to an +admitted open overlap cube. -/ +noncomputable def restrictCoordToOpenOverlap {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (G : CubeVectorH1Function Q) (hS : S ∈ overlapCentersAtDepth Q j) + (i : Fin d) : H1Function (openOverlapCubeSet S) := + (G.coord i).restrict (isOpen_openOverlapCubeSet S) + (openOverlapCubeSet_subset_openCubeSet_of_mem_overlapCentersAtDepth hS) + +@[simp] theorem restrictCoordToOpenOverlap_apply {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (G : CubeVectorH1Function Q) (hS : S ∈ overlapCentersAtDepth Q j) + (i : Fin d) (x : Vec d) : + (G.restrictCoordToOpenOverlap hS i) x = G.coord i x := + rfl + +@[simp] theorem restrictCoordToOpenOverlap_grad {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (G : CubeVectorH1Function Q) (hS : S ∈ overlapCentersAtDepth Q j) + (i : Fin d) (x : Vec d) : + (G.restrictCoordToOpenOverlap hS i).grad x = (G.coord i).grad x := + rfl + +/-- Coordinatewise `H¹` competitors are `L²` vector fields for the normalized +cube measure. -/ +theorem memLp_toField_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + MeasureTheory.MemLp G.toField (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro i + simpa [CubeVectorH1Function.toField] using + H1Function.memL2_normalizedCubeMeasure (G.coord i) + +/-- Coordinatewise `H¹` competitors are vector `L²` fields on the open cube. -/ +theorem memVectorL2_toField_openCubeSet {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + MemVectorL2 (openCubeSet Q) G.toField := by + simpa [MemVectorL2, volumeMeasureOn, CubeVectorH1Function.toField] using! + (MeasureTheory.MemLp.of_eval + (fun i : Fin d => (G.coord i).memL2)) + +/-- If the datum is `L²`, then its residual against an `H¹` competitor is also +`L²`. This is the integrability input needed by the residual energy estimate. -/ +theorem memLp_sub_toField_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + {h : Vec d → Vec d} + (hh : MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (G : CubeVectorH1Function Q) : + MeasureTheory.MemLp (fun x => h x - G.toField x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa [Pi.sub_apply] using! hh.sub G.memLp_toField_normalizedCubeMeasure + +/-- Coordinate-summed `H¹` gradient size for a vector-field competitor. -/ +noncomputable def gradientCoordL2NormSum {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : ℝ := + ∑ i : Fin d, (G.coord i).gradientCoordL2NormSum + +theorem gradientCoordL2NormSum_nonneg {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + 0 ≤ G.gradientCoordL2NormSum := by + unfold gradientCoordL2NormSum + exact Finset.sum_nonneg fun i _ => + (G.coord i).gradientCoordL2NormSum_nonneg + +/-- Parent-normalized coordinate-summed `H¹` gradient size. + +The local overlapping Besov oscillations use normalized `L²` norms. Converting +the raw `L²(openCubeSet Q)` gradient size to that normalization costs the +scale factor `side(Q) / volume(Q)^{1/2}`. -/ +noncomputable def relativeGradientCoordL2NormSum {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : ℝ := + (cubeScaleFactor Q / Real.sqrt (cubeVolume Q)) * G.gradientCoordL2NormSum + +theorem relativeGradientCoordL2NormSum_nonneg {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + 0 ≤ G.relativeGradientCoordL2NormSum := by + unfold relativeGradientCoordL2NormSum + have hscale_nonneg : 0 ≤ cubeScaleFactor Q := by + exact le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact mul_nonneg + (div_nonneg hscale_nonneg (Real.sqrt_nonneg _)) + G.gradientCoordL2NormSum_nonneg + +theorem relativeGradientCoordL2NormSum_le_mul_of_gradientCoordL2NormSum_le + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + {V G : CubeVectorH1Function Q} + (hGrad : V.gradientCoordL2NormSum ≤ C * G.gradientCoordL2NormSum) : + V.relativeGradientCoordL2NormSum ≤ C * G.relativeGradientCoordL2NormSum := by + let α : ℝ := cubeScaleFactor Q / Real.sqrt (cubeVolume Q) + have hα_nonneg : 0 ≤ α := by + dsimp [α] + have hscale_nonneg : 0 ≤ cubeScaleFactor Q := by + exact le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact div_nonneg hscale_nonneg (Real.sqrt_nonneg _) + calc + V.relativeGradientCoordL2NormSum + = α * V.gradientCoordL2NormSum := by rfl + _ ≤ α * (C * G.gradientCoordL2NormSum) := + mul_le_mul_of_nonneg_left hGrad hα_nonneg + _ = C * (α * G.gradientCoordL2NormSum) := by ring + _ = C * G.relativeGradientCoordL2NormSum := by rfl + +/-- Distributional divergence of a coordinatewise `H¹` vector competitor. -/ +noncomputable def divergence {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : Vec d → ℝ := + fun x => ∑ i : Fin d, (G.coord i).grad x i + +theorem divergence_memLp_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + MeasureTheory.MemLp G.divergence (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hsum := + MeasureTheory.memLp_finsetSum + (μ := normalizedCubeMeasure Q) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => (G.coord i).grad x i) + (fun i _hi => H1Function.grad_memL2_normalizedCubeMeasure (G.coord i) i) + simpa [CubeVectorH1Function.divergence] using! hsum + +theorem divergence_memScalarL2_openCubeSet {d : ℕ} {Q : TriadicCube d} + (G : CubeVectorH1Function Q) : + MemScalarL2 (openCubeSet Q) G.divergence := by + have hsum := + MeasureTheory.memLp_finsetSum + (μ := volumeMeasureOn (openCubeSet Q)) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => (G.coord i).grad x i) + (fun i _hi => by + simpa [MemScalarL2, volumeMeasureOn] using (G.coord i).grad_memL2 i) + simpa [CubeVectorH1Function.divergence, MemScalarL2, volumeMeasureOn] using! hsum + +theorem norm_toScalarL2_divergence_le_gradientCoordL2NormSum {d : ℕ} + {Q : TriadicCube d} (G : CubeVectorH1Function Q) + (hdiv : MemScalarL2 (openCubeSet Q) G.divergence) : + ‖toScalarL2 hdiv‖ ≤ G.gradientCoordL2NormSum := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openCubeSet Q) + have hcoord_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ := by + intro i + simpa [μ, MemScalarL2, volumeMeasureOn] using (G.coord i).grad_memL2 i + have hsum_eLp : + MeasureTheory.eLpNorm G.divergence (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ := by + have hdiv_eq_sum : + G.divergence =ᵐ[μ] + (∑ i : Fin d, fun x : Vec d => (G.coord i).grad x i) := by + exact Filter.Eventually.of_forall fun x => by + simp [CubeVectorH1Function.divergence] + calc + MeasureTheory.eLpNorm G.divergence (2 : ℝ≥0∞) μ + = + MeasureTheory.eLpNorm + (∑ i : Fin d, fun x : Vec d => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ := MeasureTheory.eLpNorm_congr_ae hdiv_eq_sum + _ ≤ ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ := + MeasureTheory.eLpNorm_sum_le + (μ := μ) (p := (2 : ℝ≥0∞)) (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => (G.coord i).grad x i) + (fun i _hi => (hcoord_mem i).1) + (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) + have hsum_toReal : + ENNReal.toReal + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ) = + ∑ i : Fin d, ‖(G.coord i).gradCoordToScalarL2 i‖ := by + rw [ENNReal.toReal_sum (fun i _hi => (hcoord_mem i).2.ne)] + refine Finset.sum_congr rfl ?_ + intro i _hi + simp [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp, μ] + calc + ‖toScalarL2 hdiv‖ + = ENNReal.toReal (MeasureTheory.eLpNorm G.divergence (2 : ℝ≥0∞) μ) := by + simp [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp, μ] + _ ≤ ENNReal.toReal + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => (G.coord i).grad x i) + (2 : ℝ≥0∞) μ) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun i _hi => (hcoord_mem i).2.ne + _ = ∑ i : Fin d, ‖(G.coord i).gradCoordToScalarL2 i‖ := hsum_toReal + _ ≤ ∑ i : Fin d, (G.coord i).gradientCoordL2NormSum := by + refine Finset.sum_le_sum ?_ + intro i _hi + unfold H1Function.gradientCoordL2NormSum + exact Finset.single_le_sum + (fun j _hj => norm_nonneg ((G.coord i).gradCoordToScalarL2 j)) + (Finset.mem_univ i) + _ = G.gradientCoordL2NormSum := rfl + +/-- Integration by parts for the distributional divergence of a coordinatewise +`H¹` vector field tested against an `H¹₀` function. -/ +theorem integral_divergence_mul_zeroTrace_eq_neg_integral_vecDot + {d : ℕ} {Q : TriadicCube d} (G : CubeVectorH1Function Q) + (φ : H10Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + G.divergence x * φ.toH1Function x ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + classical + let U : Set (Vec d) := openCubeSet Q + have hgrad_mul_int : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x : Vec d => (G.coord i).grad x i * φ.toH1Function x) + (MeasureTheory.volume.restrict U) := by + intro i + simpa [U, MeasureTheory.IntegrableOn] using! + ((G.coord i).gradMemL2 i).integrable_mul φ.toH1Function.memL2 + have hfield_mul_int : + ∀ i : Fin d, + MeasureTheory.Integrable + (fun x : Vec d => (G.coord i) x * φ.toH1Function.grad x i) + (MeasureTheory.volume.restrict U) := by + intro i + simpa [U, MeasureTheory.IntegrableOn] using! + (G.coord i).memL2.integrable_mul (φ.toH1Function.gradMemL2 i) + have hleft_sum : + ∫ x in openCubeSet Q, + G.divergence x * φ.toH1Function x ∂MeasureTheory.volume = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume := by + unfold divergence + simp_rw [Finset.sum_mul] + change + ∫ x, (∑ i : Fin d, (G.coord i).grad x i * φ.toH1Function x) + ∂MeasureTheory.volume.restrict U = + ∑ i : Fin d, + ∫ x, (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume.restrict U + simpa using + (MeasureTheory.integral_finsetSum + (μ := MeasureTheory.volume.restrict U) (s := Finset.univ) + (f := fun i : Fin d => + fun x : Vec d => (G.coord i).grad x i * φ.toH1Function x) + (fun i _hi => hgrad_mul_int i)) + have hright_sum : + ∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + unfold Homogenization.vecDot toField + change + ∫ x, (∑ i : Fin d, (G.coord i) x * φ.toH1Function.grad x i) + ∂MeasureTheory.volume.restrict U = + ∑ i : Fin d, + ∫ x, (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume.restrict U + simpa using + (MeasureTheory.integral_finsetSum + (μ := MeasureTheory.volume.restrict U) (s := Finset.univ) + (f := fun i : Fin d => + fun x : Vec d => (G.coord i) x * φ.toH1Function.grad x i) + (fun i _hi => hfield_mul_int i)) + have hcoord : + ∀ i : Fin d, + ∫ x in openCubeSet Q, + (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + intro i + have h := + (G.coord i).integral_mul_zeroTrace_gradCoord_eq_neg_integral_gradCoord_mul + φ i + calc + ∫ x in openCubeSet Q, + (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume + = -(-∫ x in openCubeSet Q, + (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume) := by ring + _ = -∫ x in openCubeSet Q, + (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + rw [← h] + calc + ∫ x in openCubeSet Q, + G.divergence x * φ.toH1Function x ∂MeasureTheory.volume + = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (G.coord i).grad x i * φ.toH1Function x + ∂MeasureTheory.volume := hleft_sum + _ = + ∑ i : Fin d, + -∫ x in openCubeSet Q, + (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + exact Finset.sum_congr rfl fun i _hi => hcoord i + _ = + -∑ i : Fin d, + ∫ x in openCubeSet Q, + (G.coord i) x * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + rw [Finset.sum_neg_distrib] + _ = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [hright_sum] + +/-- The coordinate-gradient vector field associated to a weak Hessian witness, +packaged as a coordinatewise `H¹` competitor. -/ +noncomputable def ofWeakHessianGradient {d : ℕ} {Q : TriadicCube d} + {v : H10Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v.toH1Function) : + CubeVectorH1Function Q where + coord := fun i => H.gradCoordH1Function i + +@[simp] theorem ofWeakHessianGradient_toField {d : ℕ} {Q : TriadicCube d} + {v : H10Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v.toH1Function) : + (ofWeakHessianGradient H).toField = + fun x => v.toH1Function.grad x := by + funext x i + rfl + +theorem gradientCoordL2NormSum_ofWeakHessianGradient {d : ℕ} + {Q : TriadicCube d} {v : H10Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v.toH1Function) : + (ofWeakHessianGradient H).gradientCoordL2NormSum = + H.hessianCoordL2NormSum := by + calc + (ofWeakHessianGradient H).gradientCoordL2NormSum + = ∑ i : Fin d, (H.gradCoordH1Function i).gradientCoordL2NormSum := rfl + _ = ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ := by + refine Finset.sum_congr rfl ?_ + intro i _hi + exact H.gradCoordH1Function_gradientCoordL2NormSum_eq i + _ = H.hessianCoordL2NormSum := rfl + +end CubeVectorH1Function + +/-- Smooth relative partition of unity subordinate to the retained overlap +cubes at one depth. + +The structure is intentionally an implementation interface: the downstream +quasi-interpolant only needs smooth weights, partition of unity, support, +derivative, and bounded-overlap facts. The explicit normalized cutoff +construction will provide a value of this structure. -/ +structure SmoothOverlapPartition {d : ℕ} + (Q : TriadicCube d) (j : ℕ) where + weight : TriadicCube d → Vec d → ℝ + contDiff_weight : ∀ S : TriadicCube d, ContDiff ℝ 1 (weight S) + nonneg : + ∀ {S : TriadicCube d} {x : Vec d}, + S ∈ overlapCentersAtDepth Q j → x ∈ openCubeSet Q → 0 ≤ weight S x + zero_of_not_mem : + ∀ {S : TriadicCube d}, S ∉ overlapCentersAtDepth Q j → + ∀ x : Vec d, weight S x = 0 + support_subset : + ∀ {S : TriadicCube d} {x : Vec d}, + S ∈ overlapCentersAtDepth Q j → x ∈ openCubeSet Q → + weight S x ≠ 0 → x ∈ openOverlapCubeSet S + sum_eq_one : + ∀ {x : Vec d}, x ∈ openCubeSet Q → + (overlapCentersAtDepth Q j).sum (fun S => weight S x) = 1 + coordDeriv_sum_eq_zero : + ∀ {x : Vec d}, x ∈ openCubeSet Q → ∀ i : Fin d, + (overlapCentersAtDepth Q j).sum + (fun S => euclideanCoordDeriv i (weight S) x) = 0 + coordDeriv_zero_of_not_mem_overlap : + ∀ {S : TriadicCube d} {x : Vec d} (i : Fin d), + S ∈ overlapCentersAtDepth Q j → x ∈ openCubeSet Q → + x ∉ overlapCubeSet S → euclideanCoordDeriv i (weight S) x = 0 + coordDerivConstant : ℝ + coordDerivConstant_nonneg : 0 ≤ coordDerivConstant + coordDeriv_bound : + ∀ {S : TriadicCube d} {x : Vec d} (i : Fin d), + S ∈ overlapCentersAtDepth Q j → x ∈ openCubeSet Q → + |euclideanCoordDeriv i (weight S) x| ≤ + coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j) + activeCardBound : ℕ + active_card_bound : + ∀ {x : Vec d}, x ∈ openCubeSet Q → + ((overlapCentersAtDepth Q j).filter + (fun S => weight S x ≠ 0)).card ≤ activeCardBound + +noncomputable def concreteSmoothOverlapPartition {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : SmoothOverlapPartition Q j where + weight := overlapPartitionWeight Q j + contDiff_weight := fun S => + (contDiff_overlapPartitionWeight Q S j).of_le (by norm_num) + nonneg := fun _hS hxQ => + overlapPartitionWeight_nonneg_of_mem_openCubeSet hxQ + zero_of_not_mem := fun hS x => + overlapPartitionWeight_zero_of_not_mem hS x + support_subset := fun hS hxQ hne => + overlapPartitionWeight_support_subset hS hxQ hne + sum_eq_one := fun hxQ => + overlapPartitionWeight_sum_eq_one hxQ + coordDeriv_sum_eq_zero := fun hxQ i => + overlapPartitionWeight_coordDeriv_sum_eq_zero hxQ i + coordDeriv_zero_of_not_mem_overlap := fun i hS hxQ hxS => + overlapPartitionWeight_coordDeriv_zero_of_not_mem_overlap i hS hxQ hxS + coordDerivConstant := smoothOverlapPartitionDerivativeConstant d + coordDerivConstant_nonneg := smoothOverlapPartitionDerivativeConstant_nonneg d + coordDeriv_bound := fun i hS hxQ => + abs_overlapPartitionWeight_coordDeriv_le_depthScale i hS hxQ + activeCardBound := 3 ^ d + active_card_bound := fun {x} hxQ => + overlapPartitionWeight_active_card_bound hxQ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DirichletBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DirichletBridge.lean new file mode 100644 index 0000000000..8d195a5ca0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DirichletBridge.lean @@ -0,0 +1,1007 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KAveraging + +/-! # Dirichlet Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- The depthwise smoothing estimate implies the exact finite partial bound +used by the public Dirichlet Besov theorem. The mean term in the public +statement is harmless here; the depthwise estimate controls the K-partial +seminorm directly by the overlapping partial seminorm. -/ +theorem cubeKBesovPartialBoundByOverlappingPositive_of_depthBound + {d : ℕ} + (hdepth : CubeKBesovDepthBoundByOverlappingPositive d) : + CubeKBesovPartialBoundByOverlappingPositive d := by + intro s hs_pos hs_lt + rcases hdepth hs_pos hs_lt with ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro Q h N _hh + have hpartial : + cubeKBesovVectorPartialSeminormTwo Q s N h ≤ + C * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := + cubeKBesovVectorPartialSeminormTwo_le_mul_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_of_forall_depthSeminorm_le + Q s C N h hC_nonneg fun j _hj => hC Q h j _hh + have hmean_nonneg : 0 ≤ Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + Real.sqrt_nonneg _ + have hoverlap_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q s N h + have hsum : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h ≤ + Real.sqrt (vecNormSq (cubeAverageVec Q h)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := by + linarith + exact hpartial.trans + (mul_le_mul_of_nonneg_left hsum hC_nonneg) + +/-- Uniform-in-`s` depth control implies the uniform finite partial +K/overlap comparison. -/ +theorem cubeKBesovPartialBoundByOverlappingPositiveUniform_of_depthBound + {d : ℕ} {C : ℝ} + (hdepth : CubeKBesovDepthBoundByOverlappingPositiveUniform d C) : + CubeKBesovPartialBoundByOverlappingPositiveUniform d C := by + refine ⟨hdepth.1, ?_⟩ + intro s hs_pos hs_lt Q h N hh + have hpartial : + cubeKBesovVectorPartialSeminormTwo Q s N h ≤ + C * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := + cubeKBesovVectorPartialSeminormTwo_le_mul_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_of_forall_depthSeminorm_le + Q s C N h hdepth.1 fun j _hj => + hdepth.2 hs_pos hs_lt Q h j hh + have hmean_nonneg : 0 ≤ Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + Real.sqrt_nonneg _ + have hoverlap_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q s N h + have hsum : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h ≤ + Real.sqrt (vecNormSq (cubeAverageVec Q h)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := by + linarith + exact hpartial.trans + (mul_le_mul_of_nonneg_left hsum hdepth.1) + +/-- Direct Phase-7 bridge: the one-depth overlap-averaging competitor estimate +is enough to replace the finite partial K/overlap axiom. -/ +theorem cubeKBesovPartialBoundByOverlappingPositive_of_overlapAveragingCompetitorEstimate + {d : ℕ} {C : ℝ} (hC : 0 ≤ C) + (hcomp : CubeKBesovOverlapAveragingCompetitorEstimate d C) : + CubeKBesovPartialBoundByOverlappingPositive d := + cubeKBesovPartialBoundByOverlappingPositive_of_depthBound + (cubeKBesovDepthBoundByOverlappingPositive_of_overlapAveragingCompetitorEstimate + hC hcomp) + +/-- Uniform version of the Phase-7 bridge from the concrete overlap averaging +competitor estimate to the finite partial K/overlap comparison. -/ +theorem cubeKBesovPartialBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + {d : ℕ} {C : ℝ} (hC : 0 ≤ C) + (hcomp : CubeKBesovOverlapAveragingCompetitorEstimate d C) : + CubeKBesovPartialBoundByOverlappingPositiveUniform d (2 * C) := + cubeKBesovPartialBoundByOverlappingPositiveUniform_of_depthBound + (cubeKBesovDepthBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + hC hcomp) + +/-- The finite-level K/overlapping comparison implies the boundedness bridge +needed to use the full K-functional seminorm for overlapping-regular inputs. -/ +theorem cubeKBesovInputBoundednessOfOverlappingHRegularity_of_partialBoundByOverlappingPositive + {d : ℕ} + (hpartial : CubeKBesovPartialBoundByOverlappingPositive d) : + CubeKBesovInputBoundednessOfOverlappingHRegularity d := by + intro s hs_pos hs_lt Q h hh + rcases hpartial hs_pos hs_lt with ⟨C, hC_nonneg, hC⟩ + rcases hh.partialSeminorms_bddAbove with ⟨B, hB⟩ + refine ⟨C * (Real.sqrt (vecNormSq (cubeAverageVec Q h)) + B), ?_⟩ + rintro y ⟨N, rfl⟩ + have hpos_le : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h ≤ B := + hB ⟨N, rfl⟩ + have hsum_le : + Real.sqrt (vecNormSq (cubeAverageVec Q h)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h ≤ + Real.sqrt (vecNormSq (cubeAverageVec Q h)) + B := + add_le_add le_rfl hpos_le + exact (hC Q h N hh.memLp).trans + (mul_le_mul_of_nonneg_left hsum_le hC_nonneg) + +/-- The proved overlap-Poincare estimate controls the full overlapping +positive seminorm by the full K-functional seminorm, provided the K partial +seminorms are bounded above so the real `sSup` is a genuine supremum. -/ +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_le_mul_cubeKBesovVectorSeminormTwo_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hK_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) : + cubeBesovOverlappingPositiveVectorSeminormTwo Q s F ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeKBesovVectorSeminormTwo Q s F := by + let A : ℝ := 8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1 + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + refine + cubeBesovOverlappingPositiveVectorSeminormTwo_le_of_partialBound + Q s F (B := A * cubeKBesovVectorSeminormTwo Q s F) ?_ + intro N + have hpartial : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + A * cubeKBesovVectorPartialSeminormTwo Q s N F := by + simpa [A] using + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + hC hPoincare Q s N F hF + exact hpartial.trans + (mul_le_mul_of_nonneg_left + (cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s F hK_bdd N) + hA_nonneg) + +/-- Bounded K-functional partial sums give overlapping Besov regularity. -/ +theorem cubeVectorOverlappingBesovHRegularity_of_memLp_of_kPartial_bddAbove + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hK_bdd : BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) : + CubeVectorOverlappingBesovHRegularity Q s F := by + refine ⟨hF, ?_⟩ + let A : ℝ := 8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1 + have hA_nonneg : 0 ≤ A := by dsimp [A]; positivity + rcases hK_bdd with ⟨B, hB⟩ + refine ⟨A * B, ?_⟩ + rintro y ⟨N, rfl⟩ + have hpartial : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + A * cubeKBesovVectorPartialSeminormTwo Q s N F := by + simpa [A] using + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + hC hPoincare Q s N F hF + exact hpartial.trans (mul_le_mul_of_nonneg_left (hB ⟨N, rfl⟩) hA_nonneg) + +/-- Norm-level version of the overlap-to-K comparison. The mean term is the +same on both sides, so the seminorm comparison only costs one extra additive +constant. -/ +theorem cubeBesovOverlappingPositiveVectorNormTwo_le_mul_cubeKBesovVectorNormTwo_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hK_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) : + cubeBesovOverlappingPositiveVectorNormTwo Q s F ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 2) * + cubeKBesovVectorNormTwo Q s F := by + let A : ℝ := 8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1 + let M : ℝ := Real.sqrt (vecNormSq (cubeAverageVec Q F)) + let BO : ℝ := cubeBesovOverlappingPositiveVectorSeminormTwo Q s F + let BK : ℝ := cubeKBesovVectorSeminormTwo Q s F + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact Real.sqrt_nonneg _ + have hBK_nonneg : 0 ≤ BK := by + dsimp [BK] + exact cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove Q s F hK_bdd + have hsemi : BO ≤ A * BK := by + dsimp [BO, BK, A] + exact + cubeBesovOverlappingPositiveVectorSeminormTwo_le_mul_cubeKBesovVectorSeminormTwo_of_overlapPoincare + hC hPoincare Q s F hF hK_bdd + calc + cubeBesovOverlappingPositiveVectorNormTwo Q s F + = M + BO := by rfl + _ ≤ M + A * BK := add_le_add le_rfl hsemi + _ ≤ (A + 1) * (M + BK) := by + nlinarith + _ = + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 2) * + cubeKBesovVectorNormTwo Q s F := by + dsimp [A, M, BK, cubeKBesovVectorNormTwo] + ring + +/-- The finite-level K-partial comparison gives a full K-norm bound on every +input with overlapping Besov regularity. -/ +theorem cubeKBesovVectorNormTwo_le_mul_cubeBesovOverlappingPositiveVectorNormTwo_of_partialBound + {d : ℕ} + (hpartial : CubeKBesovPartialBoundByOverlappingPositive d) + {s : ℝ} (hs_pos : 0 < s) (hs_lt : s < 1) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (F : Vec d → Vec d), + CubeVectorOverlappingBesovHRegularity Q s F → + cubeKBesovVectorNormTwo Q s F ≤ + C * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + rcases hpartial hs_pos hs_lt with ⟨C, hC_nonneg, hC⟩ + refine ⟨C + 1, add_nonneg hC_nonneg zero_le_one, ?_⟩ + intro Q F hF + let M : ℝ := Real.sqrt (vecNormSq (cubeAverageVec Q F)) + let BO : ℝ := cubeBesovOverlappingPositiveVectorSeminormTwo Q s F + let BK : ℝ := cubeKBesovVectorSeminormTwo Q s F + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact Real.sqrt_nonneg _ + have hBO_nonneg : 0 ≤ BO := by + dsimp [BO] + exact hF.seminorm_nonneg + have hNorm_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := + hF.norm_nonneg + have hM_le_norm : + M ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [M, BO, cubeBesovOverlappingPositiveVectorNormTwo] + linarith + have hsemi : + BK ≤ C * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [BK] + refine cubeKBesovVectorSeminormTwo_le_of_partialBound Q s F ?_ + intro N + have hpartialN : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * + (Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F) := + hC Q F N hF.memLp + have hsum_le : + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [cubeBesovOverlappingPositiveVectorNormTwo] + exact add_le_add le_rfl (hF.partialSeminorm_le_seminorm N) + exact hpartialN.trans + (mul_le_mul_of_nonneg_left hsum_le hC_nonneg) + calc + cubeKBesovVectorNormTwo Q s F + = M + BK := by rfl + _ ≤ M + C * cubeBesovOverlappingPositiveVectorNormTwo Q s F := + add_le_add le_rfl hsemi + _ ≤ + (C + 1) * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + nlinarith + +/-- Uniform version of the K-norm bound by the corrected overlapping positive +norm. -/ +theorem cubeKBesovVectorNormTwo_le_mul_cubeBesovOverlappingPositiveVectorNormTwo_of_partialBoundUniform + {d : ℕ} {C : ℝ} + (hpartial : CubeKBesovPartialBoundByOverlappingPositiveUniform d C) + {s : ℝ} (hs_pos : 0 < s) (hs_lt : s < 1) + (Q : TriadicCube d) (F : Vec d → Vec d) : + CubeVectorOverlappingBesovHRegularity Q s F → + cubeKBesovVectorNormTwo Q s F ≤ + (C + 1) * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + intro hF + let M : ℝ := Real.sqrt (vecNormSq (cubeAverageVec Q F)) + let BO : ℝ := cubeBesovOverlappingPositiveVectorSeminormTwo Q s F + let BK : ℝ := cubeKBesovVectorSeminormTwo Q s F + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact Real.sqrt_nonneg _ + have hBO_nonneg : 0 ≤ BO := by + dsimp [BO] + exact hF.seminorm_nonneg + have hNorm_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := + hF.norm_nonneg + have hM_le_norm : + M ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [M, BO, cubeBesovOverlappingPositiveVectorNormTwo] + linarith + have hsemi : + BK ≤ C * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [BK] + refine cubeKBesovVectorSeminormTwo_le_of_partialBound Q s F ?_ + intro N + have hpartialN : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * + (Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F) := + hpartial.2 hs_pos hs_lt Q F N hF.memLp + have hsum_le : + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + dsimp [cubeBesovOverlappingPositiveVectorNormTwo] + exact add_le_add le_rfl (hF.partialSeminorm_le_seminorm N) + exact hpartialN.trans + (mul_le_mul_of_nonneg_left hsum_le hpartial.1) + calc + cubeKBesovVectorNormTwo Q s F + = M + BK := by rfl + _ ≤ M + C * cubeBesovOverlappingPositiveVectorNormTwo Q s F := + add_le_add le_rfl hsemi + _ ≤ + (C + 1) * cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + nlinarith + +/-- Mean-term estimate for the gradient of the zero-Dirichlet divergence +solution. In the classical proof this is the zero-trace averaged-gradient +identity, packaged as an estimate so it composes with the norm algebra. -/ +def CubeDirichletGradientAverageRegularity + (d : ℕ) : Prop := + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)), + CubeDirichletDivergenceProblem Q w h → + Real.sqrt + (vecNormSq + (cubeAverageVec Q fun x => w.toH1Function.grad x)) ≤ + C * Real.sqrt (vecNormSq (cubeAverageVec Q h)) + +/-- Pointwise-in-scale K-functional estimate for the zero-Dirichlet divergence +solution operator. This is the interpolation core before summing over +dyadic/triadic depths. -/ +def CubeKFunctionalDirichletPointwiseRegularity + (d : ℕ) : Prop := + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)) (t : ℝ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletDivergenceProblem Q w h → + cubeVectorKFunctional Q t (fun x => w.toH1Function.grad x) ≤ + C * cubeVectorKFunctional Q t h + +/-- Endpoint decomposition needed for the K-functional proof. For each +`H¹` competitor `G` for the datum `h`, produce an `H¹` competitor `V` for the +solution gradient whose residual is controlled by the `L²` endpoint and whose +`H¹` size is controlled by the Dirichlet `H²` endpoint. -/ +def CubeDirichletKEndpointDecomposition + (d : ℕ) : Prop := + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)) (G : CubeVectorH1Function Q), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletDivergenceProblem Q w h → + ∃ V : CubeVectorH1Function Q, + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => w.toH1Function.grad x - V.toField x) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - G.toField x) ∧ + V.gradientCoordL2NormSum ≤ C * G.gradientCoordL2NormSum + +/-- Two-constant endpoint construction behind +`CubeDirichletKEndpointDecomposition`. The first constant is the `L²` residual +stability constant; the second is the Dirichlet `H²`/`H¹` competitor-size +constant. Keeping them separate mirrors the analytic proof before the final +K-functional algebra absorbs both into one constant. -/ +def CubeDirichletKEndpointCompetitorConstruction + (d : ℕ) : Prop := + ∃ C0 C1 : ℝ, 0 ≤ C0 ∧ 0 ≤ C1 ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)) (G : CubeVectorH1Function Q), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletDivergenceProblem Q w h → + ∃ V : CubeVectorH1Function Q, + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => w.toH1Function.grad x - V.toField x) ≤ + C0 * cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - G.toField x) ∧ + V.gradientCoordL2NormSum ≤ C1 * G.gradientCoordL2NormSum + +/-- One-solution energy estimate for the constant-coefficient zero-Dirichlet +divergence solver. This is the real analytic input behind residual stability: +test the equation with the solution and apply Cauchy-Schwarz. -/ +def CubeDirichletDivergenceEnergyEstimate + (d : ℕ) : Prop := + ∃ C0 : ℝ, 0 ≤ C0 ∧ + ∀ (Q : TriadicCube d) (F : Vec d → Vec d) + (u : H10Function (openCubeSet Q)), + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletDivergenceProblem Q u F → + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u.toH1Function.grad x) ≤ + C0 * cubeLpNorm Q (2 : ℝ≥0∞) F + +/-- Residual `L²` stability for the constant-coefficient zero-Dirichlet +divergence solver. This packages the energy estimate applied to the difference +of two solutions, avoiding any commitment here to a particular formalization of +solution subtraction. -/ +def CubeDirichletDivergenceResidualL2Stability + (d : ℕ) : Prop := + ∃ C0 : ℝ, 0 ≤ C0 ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)) (G : CubeVectorH1Function Q) + (v : H10Function (openCubeSet Q)), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletDivergenceProblem Q w h → + CubeDirichletDivergenceProblem Q v G.toField → + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) ≤ + C0 * cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => h x - G.toField x) + +/-- Dirichlet `H²` endpoint as an `H¹` lift for vector-field competitors. +Given an `H¹` vector competitor `G`, solve the corresponding divergence-RHS +Dirichlet problem and realize its gradient as a coordinatewise `H¹` vector +field `V`, with the expected `H¹` bound. -/ +def CubeDirichletH1CompetitorLiftRegularity + (d : ℕ) : Prop := + ∃ C1 : ℝ, 0 ≤ C1 ∧ + ∀ (Q : TriadicCube d) (G : CubeVectorH1Function Q), + ∃ (v : H10Function (openCubeSet Q)) (V : CubeVectorH1Function Q), + CubeDirichletDivergenceProblem Q v G.toField ∧ + V.toField = (fun x => v.toH1Function.grad x) ∧ + V.gradientCoordL2NormSum ≤ C1 * G.gradientCoordL2NormSum + +/-- Weak-divergence realization needed to feed the scalar Dirichlet `H²` +theorem. For each coordinatewise `H¹` vector field `G`, the zero-Dirichlet +solution of the divergence problem is also a scalar Poisson solution with +forcing `div G`. -/ +def CubeVectorH1DivergencePoissonRealization + (d : ℕ) : Prop := + ∀ (Q : TriadicCube d) (G : CubeVectorH1Function Q), + ∃ v : H10Function (openCubeSet Q), + CubeDirichletDivergenceProblem Q v G.toField ∧ + CubeDirichletWeakPoissonProblem Q v G.divergence + +/-- Sharper analytic form of the Dirichlet `H²` endpoint for H¹ vector +competitors. It supplies the divergence-RHS solution and a weak Hessian bound; +the coordinatewise H¹ competitor is then a formal wrapper around the Hessian +witness. -/ +def CubeDirichletDivergenceH2CompetitorRegularity + (d : ℕ) : Prop := + ∃ C1 : ℝ, 0 ≤ C1 ∧ + ∀ (Q : TriadicCube d) (G : CubeVectorH1Function Q), + ∃ (v : H10Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) v.toH1Function), + CubeDirichletDivergenceProblem Q v G.toField ∧ + H.hessianCoordL2NormSum ≤ C1 * G.gradientCoordL2NormSum + +theorem cubeDirichletDivergenceH2CompetitorRegularity_of_vectorH1DivergencePoissonRealization + {d : ℕ} [NeZero d] + (hreal : CubeVectorH1DivergencePoissonRealization d) : + CubeDirichletDivergenceH2CompetitorRegularity d := by + rcases + CubeDirichletWeakPoissonProblem.exists_cubeDirichletH2RegularityVolumeL2InDimension d + with ⟨C1, hH2⟩ + refine ⟨C1, hH2.1, ?_⟩ + intro Q G + rcases hreal Q G with ⟨v, hdivProblem, hpoisson⟩ + let hdivNorm : MemScalarL2 (openCubeSet Q) G.divergence := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q + (G.divergence_memLp_normalizedCubeMeasure) + rcases (hH2.2 Q).2 v G.divergence + G.divergence_memLp_normalizedCubeMeasure hpoisson with + ⟨H, hH⟩ + refine ⟨v, H, hdivProblem, ?_⟩ + exact hH.trans + (mul_le_mul_of_nonneg_left + (G.norm_toScalarL2_divergence_le_gradientCoordL2NormSum hdivNorm) + hH2.1) + +theorem cubeDirichletH1CompetitorLiftRegularity_of_divergenceH2CompetitorRegularity + {d : ℕ} + (hH2 : CubeDirichletDivergenceH2CompetitorRegularity d) : + CubeDirichletH1CompetitorLiftRegularity d := by + rcases hH2 with ⟨C1, hC1_nonneg, hH2⟩ + refine ⟨C1, hC1_nonneg, ?_⟩ + intro Q G + rcases hH2 Q G with ⟨v, H, hweak, hH⟩ + refine ⟨v, CubeVectorH1Function.ofWeakHessianGradient H, hweak, ?_, ?_⟩ + · exact CubeVectorH1Function.ofWeakHessianGradient_toField H + · simpa [CubeVectorH1Function.gradientCoordL2NormSum_ofWeakHessianGradient H] using hH + +theorem cubeDirichletDivergenceProblem_sub + {d : ℕ} {Q : TriadicCube d} {h k : Vec d → Vec d} + {w v : H10Function (openCubeSet Q)} + (hh : MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hk : MeasureTheory.MemLp k (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hw : CubeDirichletDivergenceProblem Q w h) + (hv : CubeDirichletDivergenceProblem Q v k) : + CubeDirichletDivergenceProblem Q (w - v) (fun x => h x - k x) := by + intro φ + have hhOpen : MemVectorL2 (openCubeSet Q) h := + memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hh + have hkOpen : MemVectorL2 (openCubeSet Q) k := + memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hk + have hwInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x)) + (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 + w.toH1Function.grad_memVectorL2 φ.toH1Function.grad_memVectorL2 + have hvInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x)) + (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 + v.toH1Function.grad_memVectorL2 φ.toH1Function.grad_memVectorL2 + have hhInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (h x) (φ.toH1Function.grad x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hhOpen φ.toH1Function.grad_memVectorL2 + have hkInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (k x) (φ.toH1Function.grad x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hkOpen φ.toH1Function.grad_memVectorL2 + have hleft_fun : + (fun x => + vecDot ((w - v).toH1Function.grad x) (φ.toH1Function.grad x)) = + fun x => + vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) - + vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x) := by + funext x + have hgradSubX : + (w - v).toH1Function.grad x = + w.toH1Function.grad x - v.toH1Function.grad x := by + change (w.toH1Function - v.toH1Function).grad x = + w.toH1Function.grad x - v.toH1Function.grad x + exact congrFun (H1Function.sub_grad w.toH1Function v.toH1Function) x + rw [hgradSubX] + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hright_fun : + (fun x => vecDot (h x - k x) (φ.toH1Function.grad x)) = + fun x => + vecDot (h x) (φ.toH1Function.grad x) - + vecDot (k x) (φ.toH1Function.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hrhs_sub : + ∫ x in openCubeSet Q, vecDot (h x - k x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (h x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, vecDot (k x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [hright_fun, MeasureTheory.integral_sub hhInt hkInt] + calc + ∫ x in openCubeSet Q, + vecDot ((w - v).toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + (vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) - + vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x)) + ∂MeasureTheory.volume := by + rw [hleft_fun] + _ = + ∫ x in openCubeSet Q, vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hwInt hvInt] + _ = + -∫ x in openCubeSet Q, vecDot (h x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + -∫ x in openCubeSet Q, vecDot (k x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [hw φ, hv φ] + _ = + - (∫ x in openCubeSet Q, vecDot (h x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, vecDot (k x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume) := by + ring + _ = + -∫ x in openCubeSet Q, vecDot (h x - k x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [hrhs_sub] + +theorem cubeDirichletDivergenceResidualL2Stability_of_energyEstimate + {d : ℕ} + (henergy : CubeDirichletDivergenceEnergyEstimate d) : + CubeDirichletDivergenceResidualL2Stability d := by + rcases henergy with ⟨C0, hC0_nonneg, henergy⟩ + refine ⟨C0, hC0_nonneg, ?_⟩ + intro Q h w G v hh hw hv + have hGmem : MeasureTheory.MemLp G.toField (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + G.memLp_toField_normalizedCubeMeasure + have hresMem : + MeasureTheory.MemLp (fun x => h x - G.toField x) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + G.memLp_sub_toField_normalizedCubeMeasure hh + have hresWeak : + CubeDirichletDivergenceProblem Q (w - v) (fun x => h x - G.toField x) := + cubeDirichletDivergenceProblem_sub + (Q := Q) (h := h) (k := G.toField) hh hGmem hw hv + have hgradEq : + (fun x => (w - v).toH1Function.grad x) = + fun x => w.toH1Function.grad x - v.toH1Function.grad x := by + funext x + change (w.toH1Function - v.toH1Function).grad x = + w.toH1Function.grad x - v.toH1Function.grad x + exact congrFun (H1Function.sub_grad w.toH1Function v.toH1Function) x + simpa [hgradEq] using + henergy Q (fun x => h x - G.toField x) (w - v) hresMem hresWeak + +theorem cubeDirichletKEndpointCompetitorConstruction_of_residualStability_of_liftRegularity + {d : ℕ} + (hstable : CubeDirichletDivergenceResidualL2Stability d) + (hlift : CubeDirichletH1CompetitorLiftRegularity d) : + CubeDirichletKEndpointCompetitorConstruction d := by + rcases hstable with ⟨C0, hC0_nonneg, hstable⟩ + rcases hlift with ⟨C1, hC1_nonneg, hlift⟩ + refine ⟨C0, C1, hC0_nonneg, hC1_nonneg, ?_⟩ + intro Q h w G hh hweak + rcases hlift Q G with ⟨v, V, hv, hVfield, hVgrad⟩ + refine ⟨V, ?_, hVgrad⟩ + simpa [hVfield] using hstable Q h w G v hh hweak hv + +theorem cubeDirichletKEndpointDecomposition_of_competitorConstruction + {d : ℕ} + (hendpoint : CubeDirichletKEndpointCompetitorConstruction d) : + CubeDirichletKEndpointDecomposition d := by + rcases hendpoint with ⟨C0, C1, hC0_nonneg, hC1_nonneg, hendpoint⟩ + refine ⟨C0 + C1, add_nonneg hC0_nonneg hC1_nonneg, ?_⟩ + intro Q h w G hh hweak + rcases hendpoint Q h w G hh hweak with ⟨V, hL2, hGrad⟩ + refine ⟨V, ?_, ?_⟩ + · have hC0_le : C0 ≤ C0 + C1 := by + linarith + exact hL2.trans + (mul_le_mul_of_nonneg_right hC0_le + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => h x - G.toField x))) + · have hC1_le : C1 ≤ C0 + C1 := by + linarith + exact hGrad.trans + (mul_le_mul_of_nonneg_right hC1_le + G.gradientCoordL2NormSum_nonneg) + +theorem cubeKFunctionalDirichletPointwiseRegularity_of_endpointDecomposition + {d : ℕ} + (hendpoint : CubeDirichletKEndpointDecomposition d) : + CubeKFunctionalDirichletPointwiseRegularity d := by + rcases hendpoint with ⟨C, hC_nonneg, hendpoint⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro Q h w t hh hweak + refine cubeVectorKFunctional_le_of_forall_competitorValue_le + Q t C (fun x => w.toH1Function.grad x) h hC_nonneg ?_ + intro G + rcases hendpoint Q h w G hh hweak with ⟨V, hL2, hGrad⟩ + exact ⟨V, + cubeVectorKFunctionalCompetitorValue_le_of_endpoint_bounds + Q t C (fun x => w.toH1Function.grad x) h V G hC_nonneg hL2 hGrad⟩ + +/-- The three focused ingredients that imply the K-functional Dirichlet +Besov regularity statement. -/ +def CubeKBesovDirichletRegularityComponents + (d : ℕ) : Prop := + CubeKBesovInputBoundednessOfOverlappingHRegularity d ∧ + CubeDirichletGradientAverageRegularity d ∧ + CubeKFunctionalDirichletPointwiseRegularity d + +/-- The full pure function-space input for the canonical K-functional model: +norm equivalence with the corrected overlapping positive Besov norm, together +with boundedness of the canonical K partial sums for overlapping-regular +inputs. -/ +def CubeKBesovCanonicalOverlappingTheory + (d : ℕ) [NeZero d] : Prop := + CubeKBesovOverlappingEquivalence (cubeKBesovNormModel d) ∧ + CubeKBesovInputBoundednessOfOverlappingHRegularity d + +/-- Sharpened pure canonical K-functional/overlapping theory. The second +component is finite-level K-partial control by the overlapping-positive partial +sums, which then implies the boundedness bridge for full K-seminorms. -/ +def CubeKBesovCanonicalOverlappingTheoryCore + (d : ℕ) [NeZero d] : Prop := + CubeKBesovOverlappingEquivalence (cubeKBesovNormModel d) ∧ + CubeKBesovPartialBoundByOverlappingPositive d + +theorem CubeKBesovCanonicalOverlappingTheoryCore.to_canonicalOverlappingTheory + {d : ℕ} [NeZero d] + (hcore : CubeKBesovCanonicalOverlappingTheoryCore d) : + CubeKBesovCanonicalOverlappingTheory d := + ⟨hcore.1, + cubeKBesovInputBoundednessOfOverlappingHRegularity_of_partialBoundByOverlappingPositive + hcore.2⟩ + +theorem cubeKBesovDirichletRegularity_of_components + {d : ℕ} + (hcomponents : CubeKBesovDirichletRegularityComponents d) : + CubeKBesovDirichletRegularity (cubeKBesovNormModel d) := by + rcases hcomponents with ⟨hbounded, hmean, hpointwise⟩ + rcases hmean with ⟨Cavg, hCavg_nonneg, hmean⟩ + rcases hpointwise with ⟨CK, hCK_nonneg, hpointwise⟩ + intro s hs_pos hs_lt + refine ⟨Cavg + CK, add_nonneg hCavg_nonneg hCK_nonneg, ?_⟩ + intro Q h w hh hweak + have hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N h) := + hbounded hs_pos hs_lt Q h hh + have hCK_le : CK ≤ Cavg + CK := by + linarith + have hCavg_le : Cavg ≤ Cavg + CK := by + linarith + have hsemi_base : + cubeKBesovVectorSeminormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + CK * cubeKBesovVectorSeminormTwo Q s h := + cubeKBesovVectorSeminormTwo_le_of_forall_kFunctional_le + Q s CK (fun x => w.toH1Function.grad x) h hCK_nonneg hBdd + fun j => hpointwise Q h w (Real.rpow (3 : ℝ) (-(j : ℝ))) hh.memLp hweak + have hsemi_h_nonneg : + 0 ≤ cubeKBesovVectorSeminormTwo Q s h := + cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove Q s h hBdd + have hsemi : + cubeKBesovVectorSeminormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + (Cavg + CK) * cubeKBesovVectorSeminormTwo Q s h := + hsemi_base.trans + (mul_le_mul_of_nonneg_right hCK_le hsemi_h_nonneg) + have havg_base : + Real.sqrt + (vecNormSq + (cubeAverageVec Q fun x => w.toH1Function.grad x)) ≤ + Cavg * Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + hmean Q h w hweak + have havg_h_nonneg : + 0 ≤ Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + Real.sqrt_nonneg _ + have havg : + Real.sqrt + (vecNormSq + (cubeAverageVec Q fun x => w.toH1Function.grad x)) ≤ + (Cavg + CK) * Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + havg_base.trans + (mul_le_mul_of_nonneg_right hCavg_le havg_h_nonneg) + simpa [cubeKBesovNormModel] using + cubeKBesovVectorNormTwo_le_of_average_and_seminorm + Q s (Cavg + CK) (fun x => w.toH1Function.grad x) h havg hsemi + +/-- Uniform-in-`s` version of the PDE/K-functional regularity assembled from +the same three focused components. -/ +theorem exists_cubeKBesovDirichletRegularityUniform_of_components + {d : ℕ} + (hcomponents : CubeKBesovDirichletRegularityComponents d) : + ∃ C : ℝ, CubeKBesovDirichletRegularityUniform (cubeKBesovNormModel d) C := by + rcases hcomponents with ⟨hbounded, hmean, hpointwise⟩ + rcases hmean with ⟨Cavg, hCavg_nonneg, hmean⟩ + rcases hpointwise with ⟨CK, hCK_nonneg, hpointwise⟩ + refine ⟨Cavg + CK, add_nonneg hCavg_nonneg hCK_nonneg, ?_⟩ + intro s hs_pos hs_lt Q h w hh hweak + have hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N h) := + hbounded hs_pos hs_lt Q h hh + have hCK_le : CK ≤ Cavg + CK := by + linarith + have hCavg_le : Cavg ≤ Cavg + CK := by + linarith + have hsemi_base : + cubeKBesovVectorSeminormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + CK * cubeKBesovVectorSeminormTwo Q s h := + cubeKBesovVectorSeminormTwo_le_of_forall_kFunctional_le + Q s CK (fun x => w.toH1Function.grad x) h hCK_nonneg hBdd + fun j => hpointwise Q h w (Real.rpow (3 : ℝ) (-(j : ℝ))) hh.memLp hweak + have hsemi_h_nonneg : + 0 ≤ cubeKBesovVectorSeminormTwo Q s h := + cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove Q s h hBdd + have hsemi : + cubeKBesovVectorSeminormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + (Cavg + CK) * cubeKBesovVectorSeminormTwo Q s h := + hsemi_base.trans + (mul_le_mul_of_nonneg_right hCK_le hsemi_h_nonneg) + have havg_base : + Real.sqrt + (vecNormSq + (cubeAverageVec Q fun x => w.toH1Function.grad x)) ≤ + Cavg * Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + hmean Q h w hweak + have havg_h_nonneg : + 0 ≤ Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + Real.sqrt_nonneg _ + have havg : + Real.sqrt + (vecNormSq + (cubeAverageVec Q fun x => w.toH1Function.grad x)) ≤ + (Cavg + CK) * Real.sqrt (vecNormSq (cubeAverageVec Q h)) := + havg_base.trans + (mul_le_mul_of_nonneg_right hCavg_le havg_h_nonneg) + simpa [cubeKBesovNormModel] using + cubeKBesovVectorNormTwo_le_of_average_and_seminorm + Q s (Cavg + CK) (fun x => w.toH1Function.grad x) h havg hsemi + +/-- Discrete compatibility K-functional route: one pure norm-equivalence input +and one PDE/K-functional regularity input. This is not the source theorem +pending the continuum `K`/`H^s` gate. -/ +def DiscreteConstantCoefficientDirichletBesovKFunctionalRoute + (d : ℕ) [NeZero d] : Prop := + CubeKBesovOverlappingEquivalence (cubeKBesovNormModel d) ∧ + CubeKBesovDirichletRegularity (cubeKBesovNormModel d) + +/-- Discrete compatibility statement obtained from the finite-level +K-functional/overlap machinery. It is not the source theorem +`l.constant.coefficient.Dirichlet.Besov.function.spaces` pending the continuum +`K`/`H^s` gate. -/ +def DiscreteConstantCoefficientDirichletBesovFunctionSpaces + (d : ℕ) [NeZero d] : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)), + CubeVectorOverlappingBesovHRegularity Q s h → + CubeDirichletDivergenceProblem Q w h → + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + C * cubeBesovOverlappingPositiveVectorNormTwo Q s h + +/-- Uniform-in-`s` discrete compatibility strengthening of +`DiscreteConstantCoefficientDirichletBesovFunctionSpaces`, used by the +compatibility duality route. It is not the source theorem pending the +continuum `K`/`H^s` gate. -/ +def DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ {s : ℝ}, 0 < s → s < 1 → + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)), + CubeVectorOverlappingBesovHRegularity Q s h → + CubeDirichletDivergenceProblem Q w h → + CubeVectorOverlappingBesovHRegularity Q s + (fun x => w.toH1Function.grad x) ∧ + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + C * cubeBesovOverlappingPositiveVectorNormTwo Q s h + +theorem DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform.to_functionSpaces + {d : ℕ} [NeZero d] {C : ℝ} + (h : DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d C) : + DiscreteConstantCoefficientDirichletBesovFunctionSpaces d := by + intro s hs_pos hs_lt + refine ⟨C, h.1, ?_⟩ + intro Q F w hF hw + exact (h.2 hs_pos hs_lt Q F w hF hw).2 + +/-- Assemble the discrete compatibility Dirichlet Besov statement from the +discrete K-functional route. -/ +theorem discreteConstantCoefficientDirichletBesovFunctionSpaces_of_discreteKFunctionalRoute + {d : ℕ} [NeZero d] + (hroute : DiscreteConstantCoefficientDirichletBesovKFunctionalRoute d) : + DiscreteConstantCoefficientDirichletBesovFunctionSpaces d := by + intro s hs_pos hs_lt + let K : CubeKBesovNormModel d := cubeKBesovNormModel d + rcases hroute with ⟨hK_equiv, hK_dir⟩ + rcases hK_equiv hs_pos hs_lt with ⟨Ce, hCe_nonneg, hCe⟩ + rcases hK_dir hs_pos hs_lt with ⟨Cd, hCd_nonneg, hCd⟩ + refine ⟨Ce * Cd * Ce, ?_, ?_⟩ + · exact mul_nonneg (mul_nonneg hCe_nonneg hCd_nonneg) hCe_nonneg + · intro Q h w hh hweak + have hout : + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + Ce * K Q s (fun x => w.toH1Function.grad x) := + (hCe Q (fun x => w.toH1Function.grad x)).1 + have hdir : + K Q s (fun x => w.toH1Function.grad x) ≤ Cd * K Q s h := + hCd Q h w hh hweak + have hin : + K Q s h ≤ Ce * cubeBesovOverlappingPositiveVectorNormTwo Q s h := + (hCe Q h).2 + calc + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) + ≤ Ce * K Q s (fun x => w.toH1Function.grad x) := hout + _ ≤ Ce * (Cd * K Q s h) := + mul_le_mul_of_nonneg_left hdir hCe_nonneg + _ = (Ce * Cd) * K Q s h := by ring + _ ≤ (Ce * Cd) * (Ce * cubeBesovOverlappingPositiveVectorNormTwo Q s h) := + mul_le_mul_of_nonneg_left hin (mul_nonneg hCe_nonneg hCd_nonneg) + _ = Ce * Cd * Ce * cubeBesovOverlappingPositiveVectorNormTwo Q s h := by ring + +/-- Direct uniform assembly of the discrete compatibility Dirichlet Besov +statement from the uniform finite-partial K/overlapping comparison. This is +not the source theorem pending the continuum `K`/`H^s` gate. -/ +theorem exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform_of_partialBoundByOverlappingPositiveUniform + {d : ℕ} [NeZero d] {Cpartial : ℝ} + (hpartial : CubeKBesovPartialBoundByOverlappingPositiveUniform d Cpartial) + (hcomponents : CubeKBesovDirichletRegularityComponents d) : + ∃ C : ℝ, DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d C := by + let CP : ℝ := cubeVectorH1OverlapPoincareConstant d + let Coverlap : ℝ := 8 * (3 ^ d : ℝ) + 2 * CP ^ 2 + 2 + let Cin : ℝ := Cpartial + 1 + have hcomponents' := hcomponents + rcases exists_cubeKBesovDirichletRegularityUniform_of_components hcomponents with + ⟨Cd, hCd⟩ + rcases hcomponents' with ⟨hbounded, _hmean, hpointwise_component⟩ + rcases hpointwise_component with ⟨CK, hCK_nonneg, hpointwise⟩ + have hCP_nonneg : 0 ≤ CP := by + dsimp [CP] + exact cubeVectorH1OverlapPoincareConstant_nonneg d + have hCoverlap_nonneg : 0 ≤ Coverlap := by + dsimp [Coverlap, CP] + positivity + have hCin_nonneg : 0 ≤ Cin := by + dsimp [Cin] + exact add_nonneg hpartial.1 zero_le_one + refine ⟨Coverlap * Cd * Cin, + mul_nonneg (mul_nonneg hCoverlap_nonneg hCd.1) hCin_nonneg, ?_⟩ + intro s hs_pos hs_lt Q h w hh hweak + have hInKBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N h) := + hbounded hs_pos hs_lt Q h hh + have hOutKBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N + (fun x => w.toH1Function.grad x)) := by + rcases hInKBdd with ⟨B, hB⟩ + refine ⟨CK * B, ?_⟩ + rintro y ⟨N, rfl⟩ + have hpartialOut : + cubeKBesovVectorPartialSeminormTwo Q s N + (fun x => w.toH1Function.grad x) ≤ + CK * cubeKBesovVectorPartialSeminormTwo Q s N h := + cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + Q s CK N (fun x => w.toH1Function.grad x) h hCK_nonneg + fun j _hj => + hpointwise Q h w (Real.rpow (3 : ℝ) (-(j : ℝ))) hh.memLp hweak + exact hpartialOut.trans + (mul_le_mul_of_nonneg_left (hB ⟨N, rfl⟩) hCK_nonneg) + have hOutMem : + MeasureTheory.MemLp (fun x => w.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro i + simpa using w.toH1Function.grad_memL2_normalizedCubeMeasure (Q := Q) i + have hOutReg : + CubeVectorOverlappingBesovHRegularity Q s + (fun x => w.toH1Function.grad x) := + cubeVectorOverlappingBesovHRegularity_of_memLp_of_kPartial_bddAbove + hCP_nonneg (cubeVectorH1OverlapPoincareEstimate d) + Q s (fun x => w.toH1Function.grad x) hOutMem hOutKBdd + have hOutOverlapK : + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + Coverlap * + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) := by + dsimp [Coverlap, CP] + exact + cubeBesovOverlappingPositiveVectorNormTwo_le_mul_cubeKBesovVectorNormTwo_of_overlapPoincare + hCP_nonneg (cubeVectorH1OverlapPoincareEstimate d) + Q s (fun x => w.toH1Function.grad x) hOutMem hOutKBdd + have hDir : + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) ≤ + Cd * cubeKBesovVectorNormTwo Q s h := + hCd.2 hs_pos hs_lt Q h w hh hweak + have hInKOverlap : + cubeKBesovVectorNormTwo Q s h ≤ + Cin * cubeBesovOverlappingPositiveVectorNormTwo Q s h := + cubeKBesovVectorNormTwo_le_mul_cubeBesovOverlappingPositiveVectorNormTwo_of_partialBoundUniform + hpartial hs_pos hs_lt Q h hh + refine ⟨hOutReg, ?_⟩ + calc + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) + ≤ + Coverlap * + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) := + hOutOverlapK + _ ≤ Coverlap * (Cd * cubeKBesovVectorNormTwo Q s h) := + mul_le_mul_of_nonneg_left hDir hCoverlap_nonneg + _ = (Coverlap * Cd) * cubeKBesovVectorNormTwo Q s h := by + ring + _ ≤ (Coverlap * Cd) * + (Cin * cubeBesovOverlappingPositiveVectorNormTwo Q s h) := + mul_le_mul_of_nonneg_left hInKOverlap + (mul_nonneg hCoverlap_nonneg hCd.1) + _ = + Coverlap * Cd * Cin * + cubeBesovOverlappingPositiveVectorNormTwo Q s h := by + ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DiscreteConvolution.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DiscreteConvolution.lean new file mode 100644 index 0000000000..82ddebb99f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/DiscreteConvolution.lean @@ -0,0 +1,299 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm + +/-! # Discrete Convolution -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-! +# Finite lower-triangular convolution estimates + +This file contains the purely discrete summation step used by the hard +standard-to-overlapping positive comparison. The analytic estimates produce a +lower-triangular convolution in the depth variables; once the row and column +geometric weights are bounded, the following finite Cauchy-Schwarz argument +turns it into an `l²` estimate. +-/ + +theorem lowerTriangularConvolution_sq_sum_le + (N : ℕ) (K : ℝ) (w : ℕ → ℕ → ℝ) (a : ℕ → ℝ) + (hK_nonneg : 0 ≤ K) + (hw_nonneg : ∀ j m : ℕ, 0 ≤ w j m) + (hrow : + ∀ j ∈ Finset.range (N + 1), + ∑ m ∈ Finset.range j, w j m ≤ K) + (hcol : + ∀ m ∈ Finset.range (N + 1), + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => m < j), w j m ≤ K) : + ∑ j ∈ Finset.range (N + 1), + (∑ m ∈ Finset.range j, w j m * a m) ^ 2 + ≤ + K ^ 2 * ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + classical + let J : Finset ℕ := Finset.range (N + 1) + let T : ℕ → ℝ := fun j => ∑ m ∈ Finset.range j, w j m * (a m) ^ 2 + have hT_nonneg : ∀ j, 0 ≤ T j := by + intro j + dsimp [T] + refine Finset.sum_nonneg ?_ + intro m _hm + exact mul_nonneg (hw_nonneg j m) (sq_nonneg (a m)) + have hrow_nonneg : ∀ j, 0 ≤ ∑ m ∈ Finset.range j, w j m := by + intro j + refine Finset.sum_nonneg ?_ + intro m _hm + exact hw_nonneg j m + have hdepth : + ∀ j ∈ J, + (∑ m ∈ Finset.range j, w j m * a m) ^ 2 ≤ K * T j := by + intro j hj + have hcauchy : + (∑ m ∈ Finset.range j, w j m * a m) ^ 2 ≤ + (∑ m ∈ Finset.range j, w j m) * T j := by + dsimp [T] + exact + Finset.sum_sq_le_sum_mul_sum_of_sq_le_mul + (s := Finset.range j) + (r := fun m => w j m * a m) + (f := fun m => w j m) + (g := fun m => w j m * (a m) ^ 2) + (fun m _hm => hw_nonneg j m) + (fun m _hm => mul_nonneg (hw_nonneg j m) (sq_nonneg (a m))) + (fun m _hm => le_of_eq (by ring)) + exact hcauchy.trans + (mul_le_mul_of_nonneg_right (hrow j hj) (hT_nonneg j)) + have hsum_depth : + ∑ j ∈ J, (∑ m ∈ Finset.range j, w j m * a m) ^ 2 + ≤ ∑ j ∈ J, K * T j := by + exact Finset.sum_le_sum hdepth + have hrange_filter : + ∀ j ∈ J, Finset.range j = J.filter (fun m => m < j) := by + intro j hj + ext m + constructor + · intro hm + rw [Finset.mem_filter] + exact + ⟨by + have hj' : j < N + 1 := by + have : j ∈ Finset.range (N + 1) := hj + exact Finset.mem_range.mp this + exact Finset.mem_range.mpr (Nat.lt_trans (Finset.mem_range.mp hm) hj'), + Finset.mem_range.mp hm⟩ + · intro h + exact Finset.mem_range.mpr ((Finset.mem_filter.mp h).2) + have hT_sum_eq : + ∑ j ∈ J, T j = + ∑ m ∈ J, ∑ j ∈ J.filter (fun j => m < j), w j m * (a m) ^ 2 := by + calc + ∑ j ∈ J, T j + = + ∑ j ∈ J, ∑ m ∈ J.filter (fun m => m < j), + w j m * (a m) ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro j hj + dsimp [T] + rw [hrange_filter j hj] + _ = + ∑ j ∈ J, ∑ m ∈ J, + if m < j then w j m * (a m) ^ 2 else 0 := by + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [Finset.sum_filter] + _ = + ∑ m ∈ J, ∑ j ∈ J, + if m < j then w j m * (a m) ^ 2 else 0 := by + exact Finset.sum_comm + _ = + ∑ m ∈ J, ∑ j ∈ J.filter (fun j => m < j), + w j m * (a m) ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro m _hm + rw [Finset.sum_filter] + have hT_sum_le : + ∑ j ∈ J, T j ≤ K * ∑ m ∈ J, (a m) ^ 2 := by + rw [hT_sum_eq] + calc + ∑ m ∈ J, ∑ j ∈ J.filter (fun j => m < j), + w j m * (a m) ^ 2 + ≤ + ∑ m ∈ J, K * (a m) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro m hm + calc + ∑ j ∈ J.filter (fun j => m < j), w j m * (a m) ^ 2 + = + (∑ j ∈ J.filter (fun j => m < j), w j m) * + (a m) ^ 2 := by + rw [Finset.sum_mul] + _ ≤ K * (a m) ^ 2 := + mul_le_mul_of_nonneg_right (hcol m hm) (sq_nonneg (a m)) + _ = + K * ∑ m ∈ J, (a m) ^ 2 := by + rw [Finset.mul_sum] + calc + ∑ j ∈ Finset.range (N + 1), + (∑ m ∈ Finset.range j, w j m * a m) ^ 2 + = + ∑ j ∈ J, (∑ m ∈ Finset.range j, w j m * a m) ^ 2 := rfl + _ ≤ ∑ j ∈ J, K * T j := hsum_depth + _ = K * ∑ j ∈ J, T j := by + rw [Finset.mul_sum] + _ ≤ K * (K * ∑ m ∈ J, (a m) ^ 2) := + mul_le_mul_of_nonneg_left hT_sum_le hK_nonneg + _ = K ^ 2 * ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + dsimp [J] + ring + +/-- Row sums for the lower-triangular geometric kernel. The exponent starts at +`1` because `m < j`, but we bound it by the full geometric series starting at +`0`. -/ +theorem sum_range_geometric_pow_sub_le_inv {r : ℝ} + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) (j : ℕ) : + ∑ m ∈ Finset.range j, r ^ (j - m) ≤ (1 - r)⁻¹ := by + have hreflect : + (∑ m ∈ Finset.range j, r ^ (j - m)) = + ∑ m ∈ Finset.range j, r ^ (m + 1) := by + rw [← Finset.sum_range_reflect (fun m : ℕ => r ^ (m + 1)) j] + refine Finset.sum_congr rfl ?_ + intro m hm + congr 1 + have hm_lt : m < j := Finset.mem_range.mp hm + omega + calc + ∑ m ∈ Finset.range j, r ^ (j - m) + = ∑ m ∈ Finset.range j, r ^ (m + 1) := hreflect + _ ≤ ∑ m ∈ Finset.range j, r ^ m := by + refine Finset.sum_le_sum ?_ + intro m _hm + exact pow_le_pow_of_le_one hr_nonneg hr_lt_one.le (Nat.le_succ m) + _ = ∑ m ∈ Finset.Ico 0 j, r ^ m := by + rw [Finset.range_eq_Ico] + _ ≤ r ^ (0 : ℕ) / (1 - r) := + geom_sum_Ico_le_of_lt_one hr_nonneg hr_lt_one + _ = (1 - r)⁻¹ := by + simp [div_eq_mul_inv] + +/-- Column sums for the lower-triangular geometric kernel. -/ +theorem sum_filter_geometric_pow_sub_le_inv {r : ℝ} + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) (N m : ℕ) : + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => m < j), r ^ (j - m) ≤ + (1 - r)⁻¹ := by + have hfilter : + (Finset.range (N + 1)).filter (fun j => m < j) = + Finset.Ico (m + 1) (N + 1) := by + ext j + simp only [Finset.mem_filter, Finset.mem_range, Finset.mem_Ico] + constructor + · intro h + omega + · intro h + omega + calc + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => m < j), r ^ (j - m) + = ∑ j ∈ Finset.Ico (m + 1) (N + 1), r ^ (j - m) := by + rw [hfilter] + _ = + ∑ k ∈ Finset.range (N + 1 - (m + 1)), r ^ (k + 1) := by + rw [Finset.sum_Ico_eq_sum_range] + refine Finset.sum_congr rfl ?_ + intro k _hk + congr 1 + omega + _ ≤ + ∑ k ∈ Finset.range (N + 1 - (m + 1)), r ^ k := by + refine Finset.sum_le_sum ?_ + intro k _hk + exact pow_le_pow_of_le_one hr_nonneg hr_lt_one.le (Nat.le_succ k) + _ = ∑ k ∈ Finset.Ico 0 (N + 1 - (m + 1)), r ^ k := by + rw [Finset.range_eq_Ico] + _ ≤ r ^ (0 : ℕ) / (1 - r) := + geom_sum_Ico_le_of_lt_one hr_nonneg hr_lt_one + _ = (1 - r)⁻¹ := by + simp [div_eq_mul_inv] + +/-- Finite `l²` boundedness of the lower-triangular geometric convolution. -/ +theorem lowerTriangularGeometricConvolution_sq_sum_le + (N : ℕ) {r : ℝ} (a : ℕ → ℝ) + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) : + ∑ j ∈ Finset.range (N + 1), + (∑ m ∈ Finset.range j, r ^ (j - m) * a m) ^ 2 + ≤ + ((1 - r)⁻¹) ^ 2 * + ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + have hK_nonneg : 0 ≤ (1 - r)⁻¹ := by + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + exact + lowerTriangularConvolution_sq_sum_le + (N := N) (K := (1 - r)⁻¹) + (w := fun j m => r ^ (j - m)) (a := a) + hK_nonneg + (fun j m => pow_nonneg hr_nonneg _) + (fun j _hj => sum_range_geometric_pow_sub_le_inv hr_nonneg hr_lt_one j) + (fun m _hm => sum_filter_geometric_pow_sub_le_inv hr_nonneg hr_lt_one N m) + +/-- Finite-depth summation of a one-depth estimate with a geometric +lower-triangular tail. -/ +theorem sq_sum_le_of_le_add_geometric_convolution_sq + (N : ℕ) {A B r : ℝ} (x a : ℕ → ℝ) + (hB_nonneg : 0 ≤ B) + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + (x j) ^ 2 ≤ + A * (a j) ^ 2 + + B * (∑ m ∈ Finset.range j, r ^ (j - m) * a m) ^ 2) : + ∑ j ∈ Finset.range (N + 1), (x j) ^ 2 + ≤ + (A + B * ((1 - r)⁻¹) ^ 2) * + ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + let G : ℕ → ℝ := + fun j => ∑ m ∈ Finset.range j, r ^ (j - m) * a m + have hsum_depth : + ∑ j ∈ Finset.range (N + 1), (x j) ^ 2 + ≤ ∑ j ∈ Finset.range (N + 1), (A * (a j) ^ 2 + B * (G j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + simpa [G] using hdepth j hj + have hconv : + ∑ j ∈ Finset.range (N + 1), (G j) ^ 2 + ≤ ((1 - r)⁻¹) ^ 2 * + ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + simpa [G] using + lowerTriangularGeometricConvolution_sq_sum_le + (N := N) (r := r) (a := a) hr_nonneg hr_lt_one + calc + ∑ j ∈ Finset.range (N + 1), (x j) ^ 2 + ≤ ∑ j ∈ Finset.range (N + 1), + (A * (a j) ^ 2 + B * (G j) ^ 2) := hsum_depth + _ = + A * ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 + + B * ∑ j ∈ Finset.range (N + 1), (G j) ^ 2 := by + rw [Finset.sum_add_distrib, Finset.mul_sum, Finset.mul_sum] + _ ≤ + A * ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 + + B * (((1 - r)⁻¹) ^ 2 * + ∑ m ∈ Finset.range (N + 1), (a m) ^ 2) := by + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_left hconv hB_nonneg) + _ = + (A + B * ((1 - r)⁻¹) ^ 2) * + ∑ m ∈ Finset.range (N + 1), (a m) ^ 2 := by + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ExactOverlapEuclideanRegularity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ExactOverlapEuclideanRegularity.lean new file mode 100644 index 0000000000..168bb4e61b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/ExactOverlapEuclideanRegularity.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeHsRegularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanFullComparison + +/-! +# Exact overlap-Besov regularity for the centered-cube Dirichlet problem + +This module proves the manuscript-facing fractional Dirichlet estimate from +`coarsegraining/chapters/ch1_function_spaces.tex:782-930`. It combines the +exact overlap-Besov/physical-Sobolev full-norm equivalence with the all-scale +constant-coefficient Dirichlet estimate. All comparison, endpoint, scale, +and representative inputs remain proof-internal. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- Fractional Dirichlet regularity for constant-coefficient equations, +formalizing `coarsegraining/chapters/ch1_function_spaces.tex:782-930`. + +One finite constant depending only on `s` and `d` is chosen before the cube +scale, datum, and solution. The only analytic premises are the source +fractional-Sobolev membership of the datum and the weak Dirichlet equation. -/ +theorem exists_centeredCubeDirichletExactOverlapEuclideanNormTwoRegularity + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (h : CenteredCubeEuclideanL2Field d m) + (w : H10Function (openCubeSet (originCube d m))), + MemCenteredCubeEuclideanHs s h → + CubeDirichletDivergenceProblem (originCube d m) w h → + exactOverlapEuclideanNormTwo s (originCube d m) + (centeredCubeGradientEuclideanL2Field w) + (centeredCubeGradientEuclideanL2Field w).exactOverlapEuclideanIntegrable ≤ + C * exactOverlapEuclideanNormTwo s (originCube d m) h + h.exactOverlapEuclideanIntegrable := by + rcases exists_centeredCubeEuclideanHs_exactOverlapEuclideanNormTwo_comparison d s with + ⟨Ccomparison, hCcomparison, hcomparison⟩ + rcases exists_centeredCubeDirichletEuclideanHsFullENormRegularity d s with + ⟨Cpde, hCpde, hpde⟩ + let C : ℝ≥0∞ := Ccomparison * Cpde * Ccomparison + refine ⟨C, ?_, ?_⟩ + · exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top hCcomparison hCpde) hCcomparison + · intro m h w _hHs hproblem + let out : CenteredCubeEuclideanL2Field d m := + centeredCubeGradientEuclideanL2Field w + have houtComparison := (hcomparison m out).1 + have hinComparison := (hcomparison m h).2 + have hpdeEstimate := hpde m h w hproblem + calc + exactOverlapEuclideanNormTwo s (originCube d m) + (centeredCubeGradientEuclideanL2Field w) + (centeredCubeGradientEuclideanL2Field w).exactOverlapEuclideanIntegrable = + centeredCubeExactOverlapEuclideanNormTwo s out := by + rfl + _ ≤ Ccomparison * centeredCubeEuclideanHsFullENorm s out := + houtComparison + _ ≤ Ccomparison * + (Cpde * centeredCubeEuclideanHsFullENorm s h) := by + simpa only [mul_comm] using mul_le_mul_left hpdeEstimate Ccomparison + _ ≤ Ccomparison * + (Cpde * (Ccomparison * centeredCubeExactOverlapEuclideanNormTwo s h)) := by + simpa only [mul_comm] using + mul_le_mul_left (mul_le_mul_left hinComparison Cpde) Ccomparison + _ = C * exactOverlapEuclideanNormTwo s (originCube d m) h + h.exactOverlapEuclideanIntegrable := by + simp only [C, centeredCubeExactOverlapEuclideanNormTwo] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KAveraging.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KAveraging.lean new file mode 100644 index 0000000000..9f0e2b9461 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KAveraging.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KFunctional + +/-! # KAveraging -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +namespace SmoothOverlapPartition + +/-- Phase-5 K-functional endpoint for the concrete overlap-averaging +competitor coming from a supplied smooth overlap partition. -/ +theorem exists_cubeVectorKFunctional_le_mul_sqrt_depthAverage + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) h ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rcases P.exists_cubeLpNorm_sub_averagingField_le_mul_sqrt_depthAverage_of_memLp_overlap + h hloc with + ⟨Cres, hCres_nonneg, hres⟩ + rcases + P.exists_rpow_neg_mul_relativeGradientCoordL2NormSum_averagingCompetitor_le_sqrt_depthAverage + h hloc with + ⟨Cgrad, hCgrad_nonneg, hgrad⟩ + refine ⟨Cres + Cgrad, add_nonneg hCres_nonneg hCgrad_nonneg, ?_⟩ + let G : CubeVectorH1Function Q := P.averagingCompetitor h + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let A : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (fun x => h x - G.toField x) + let B : ℝ := t * G.relativeGradientCoordL2NormSum + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => h x - G.toField x) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg ht_nonneg G.relativeGradientCoordL2NormSum_nonneg + have hres' : A ≤ Cres * Real.sqrt D := by + simpa [A, D, G] using! hres + have hgrad' : B ≤ Cgrad * Real.sqrt D := by + simpa [B, D, G, t] using hgrad + have hcomp_value_le_sum : + cubeVectorKFunctionalCompetitorValue Q t h G ≤ A + B := by + have hright_nonneg : 0 ≤ A + B := add_nonneg hA_nonneg hB_nonneg + have hsq : + A ^ 2 + t ^ 2 * G.relativeGradientCoordL2NormSum ^ 2 ≤ + (A + B) ^ 2 := by + have hBsq : B ^ 2 = t ^ 2 * G.relativeGradientCoordL2NormSum ^ 2 := by + dsimp [B] + ring + rw [← hBsq] + nlinarith [mul_nonneg hA_nonneg hB_nonneg] + simpa [cubeVectorKFunctionalCompetitorValue, A, B] using + (Real.sqrt_le_iff.mpr ⟨hright_nonneg, hsq⟩) + have hcomp_value_le : + cubeVectorKFunctionalCompetitorValue Q t h G ≤ + (Cres + Cgrad) * Real.sqrt D := by + calc + cubeVectorKFunctionalCompetitorValue Q t h G + ≤ A + B := hcomp_value_le_sum + _ ≤ Cres * Real.sqrt D + Cgrad * Real.sqrt D := + add_le_add hres' hgrad' + _ = (Cres + Cgrad) * Real.sqrt D := by + ring + calc + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) h + = cubeVectorKFunctional Q t h := by + rfl + _ ≤ cubeVectorKFunctionalCompetitorValue Q t h G := + cubeVectorKFunctional_le_competitor Q t h G + _ ≤ (Cres + Cgrad) * Real.sqrt D := hcomp_value_le + _ = + (Cres + Cgrad) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) := by + rfl + +/-- Phase-5 depth-seminorm estimate for the concrete overlap-averaging +competitor coming from a supplied smooth overlap partition. -/ +theorem exists_cubeKBesovVectorDepthSeminorm_le_mul_overlapDepthSeminorm + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (s : ℝ) (h : Vec d → Vec d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∃ C : ℝ, 0 ≤ C ∧ + cubeKBesovVectorDepthSeminorm Q s h j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + rcases P.exists_cubeVectorKFunctional_le_mul_sqrt_depthAverage h hloc with + ⟨C, hC_nonneg, hK⟩ + refine ⟨C, hC_nonneg, ?_⟩ + let W : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + cubeKBesovVectorDepthSeminorm Q s h j + = + W * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) h := by + rfl + _ ≤ W * (C * Real.sqrt D) := + mul_le_mul_of_nonneg_left (by simpa [D] using hK) hW_nonneg + _ = C * (W * Real.sqrt D) := by + ring + _ = C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + rfl + +/-- Concrete finite-depth Phase-6 assembly from supplied smooth overlap +partitions at every depth in the partial sum. The constant may depend on the +finite family of supplied partitions; the later public axiom removal still +requires the uniform partition construction. -/ +theorem exists_cubeKBesovVectorPartialSeminormTwo_le_mul_overlapPartialSeminorm + {d : ℕ} {Q : TriadicCube d} {N : ℕ} + (s : ℝ) (h : Vec d → Vec d) + (hparent : + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hpart : + ∀ j ∈ Finset.range (N + 1), Nonempty (SmoothOverlapPartition Q j)) : + ∃ C : ℝ, 0 ≤ C ∧ + cubeKBesovVectorPartialSeminormTwo Q s N h ≤ + C * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h := by + classical + let S := Finset.range (N + 1) + have hdepth_exists : + ∀ j ∈ S, ∃ C : ℝ, 0 ≤ C ∧ + cubeKBesovVectorDepthSeminorm Q s h j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + intro j hj + rcases hpart j (by simpa [S] using hj) with ⟨P⟩ + have hloc : + ∀ R ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure R) := by + intro R hR + exact memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + hR hparent + exact P.exists_cubeKBesovVectorDepthSeminorm_le_mul_overlapDepthSeminorm + s h hloc + let c : ℕ → ℝ := fun j => + if hj : j ∈ S then Classical.choose (hdepth_exists j hj) else 0 + let C : ℝ := ∑ j ∈ S, c j + have hc_nonneg : ∀ j ∈ S, 0 ≤ c j := by + intro j hj + dsimp [c] + rw [dif_pos hj] + exact (Classical.choose_spec (hdepth_exists j hj)).1 + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact Finset.sum_nonneg fun j hj => hc_nonneg j hj + refine ⟨C, hC_nonneg, ?_⟩ + have hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeKBesovVectorDepthSeminorm Q s h j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + intro j hj + have hjS : j ∈ S := by simpa [S] using hj + have hdepth_j : + cubeKBesovVectorDepthSeminorm Q s h j ≤ + c j * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + dsimp [c] + rw [dif_pos hjS] + exact (Classical.choose_spec (hdepth_exists j hjS)).2 + have hc_le_C : c j ≤ C := by + dsimp [C] + exact Finset.single_le_sum (fun k hk => hc_nonneg k hk) hjS + exact hdepth_j.trans + (mul_le_mul_of_nonneg_right hc_le_C + (cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s h j)) + exact + cubeKBesovVectorPartialSeminormTwo_le_mul_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_of_forall_depthSeminorm_le + Q s C N h hC_nonneg hdepth + +end SmoothOverlapPartition + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KFunctional.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KFunctional.lean new file mode 100644 index 0000000000..55095e770c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/KFunctional.lean @@ -0,0 +1,1018 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapPoincare + +/-! # KFunctional -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- The value of one competitor in the discrete cube vector K-functional. -/ +noncomputable def cubeVectorKFunctionalCompetitorValue {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : ℝ := + Real.sqrt + ((cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => F x - G.toField x)) ^ 2 + + t ^ 2 * (G.relativeGradientCoordL2NormSum) ^ 2) + +/-- Discrete cube K-functional for vector fields, with `t` as the smoothing +scale. -/ +noncomputable def cubeVectorKFunctional {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) : ℝ := + sInf (Set.range fun G : CubeVectorH1Function Q => + cubeVectorKFunctionalCompetitorValue Q t F G) + +theorem cubeVectorKFunctionalCompetitorValue_nonneg {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : + 0 ≤ cubeVectorKFunctionalCompetitorValue Q t F G := + Real.sqrt_nonneg _ + +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctionalCompetitorValue_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) + (G : CubeVectorH1Function Q) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G := by + let R : Vec d → Vec d := fun x => F x - G.toField x + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let A : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) R + let B : ℝ := G.relativeGradientCoordL2NormSum + let M : ℝ := 8 * (3 ^ d : ℝ) + 2 * C ^ 2 + let K : ℝ := M + 1 + have hGparent : + MeasureTheory.MemLp G.toField (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + G.memLp_toField_normalizedCubeMeasure + have hRparent : + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [R] using! hF.sub hGparent + have hRloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + intro S hS + exact memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS hRparent + have hGloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp G.toField (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + intro S hS + exact memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS hGparent + have hF_split : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j = + cubeBesovOverlappingPositiveVectorDepthAverage + Q (fun x => R x + G.toField x) j := by + have hfield : (fun x => R x + G.toField x) = F := by + funext x i + simp [R] + rw [hfield] + have hsplit : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q R j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j := by + rw [hF_split] + exact cubeBesovOverlappingPositiveVectorDepthAverage_add_le Q R G.toField j + hRloc hGloc + have hres : + cubeBesovOverlappingPositiveVectorDepthAverage Q R j ≤ + 4 * (3 ^ d : ℝ) * A ^ 2 := by + simpa [A, R] using + cubeBesovOverlappingPositiveVectorDepthAverage_residual_le + Q R j hRparent hRloc + have hcomp : + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j ≤ + (C * t * B) ^ 2 := by + simpa [t, B] using + cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_of_overlapPoincare + hC hPoincare Q j G + have hdepth_coeff : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j ≤ + 8 * (3 ^ d : ℝ) * A ^ 2 + 2 * (C * t * B) ^ 2 := by + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q F j + ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q R j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j := + hsplit + _ ≤ 2 * (4 * (3 ^ d : ℝ) * A ^ 2) + 2 * ((C * t * B) ^ 2) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hres (by norm_num)) + (mul_le_mul_of_nonneg_left hcomp (by norm_num)) + _ = 8 * (3 ^ d : ℝ) * A ^ 2 + 2 * (C * t * B) ^ 2 := by + ring + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) R + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact G.relativeGradientCoordL2NormSum_nonneg + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hK_nonneg : 0 ≤ K := by + dsimp [K] + linarith + have hK_sq : + M ≤ K ^ 2 := by + have hK_eq : K = M + 1 := by rfl + rw [hK_eq] + nlinarith [sq_nonneg M, hM_nonneg] + have hdepth_M : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j ≤ + M * (A ^ 2 + t ^ 2 * B ^ 2) := by + have hcoefA : 8 * (3 ^ d : ℝ) ≤ M := by + dsimp [M] + nlinarith [sq_nonneg C] + have hcoefB : 2 * C ^ 2 ≤ M := by + dsimp [M] + have hpow_nonneg : 0 ≤ (3 ^ d : ℝ) := by positivity + nlinarith + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q F j + ≤ 8 * (3 ^ d : ℝ) * A ^ 2 + 2 * (C * t * B) ^ 2 := + hdepth_coeff + _ = + (8 * (3 ^ d : ℝ)) * A ^ 2 + + (2 * C ^ 2) * (t ^ 2 * B ^ 2) := by + ring + _ ≤ M * A ^ 2 + M * (t ^ 2 * B ^ 2) := by + exact add_le_add + (mul_le_mul_of_nonneg_right hcoefA (sq_nonneg A)) + (mul_le_mul_of_nonneg_right hcoefB + (mul_nonneg (sq_nonneg t) (sq_nonneg B))) + _ = M * (A ^ 2 + t ^ 2 * B ^ 2) := by + ring + have hY_nonneg : 0 ≤ A ^ 2 + t ^ 2 * B ^ 2 := by + exact add_nonneg (sq_nonneg A) + (mul_nonneg (sq_nonneg t) (sq_nonneg B)) + have hdepth_K : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j ≤ + K ^ 2 * (A ^ 2 + t ^ 2 * B ^ 2) := by + exact hdepth_M.trans + (mul_le_mul_of_nonneg_right hK_sq hY_nonneg) + calc + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) + ≤ Real.sqrt (K ^ 2 * (A ^ 2 + t ^ 2 * B ^ 2)) := + Real.sqrt_le_sqrt hdepth_K + _ = Real.sqrt (K ^ 2) * Real.sqrt (A ^ 2 + t ^ 2 * B ^ 2) := by + rw [Real.sqrt_mul (sq_nonneg K)] + _ = K * Real.sqrt (A ^ 2 + t ^ 2 * B ^ 2) := by + rw [Real.sqrt_sq hK_nonneg] + _ = + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G := by + dsimp [cubeVectorKFunctionalCompetitorValue, A, B, K, M, t, R] + +theorem cubeVectorKFunctional_range_nonempty {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) : + (Set.range fun G : CubeVectorH1Function Q => + cubeVectorKFunctionalCompetitorValue Q t F G).Nonempty := + ⟨cubeVectorKFunctionalCompetitorValue Q t F default, ⟨default, rfl⟩⟩ + +theorem cubeVectorKFunctional_range_bddBelow {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) : + BddBelow (Set.range fun G : CubeVectorH1Function Q => + cubeVectorKFunctionalCompetitorValue Q t F G) := by + refine ⟨0, ?_⟩ + rintro y ⟨G, rfl⟩ + exact cubeVectorKFunctionalCompetitorValue_nonneg Q t F G + +theorem cubeVectorKFunctional_nonneg {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) : + 0 ≤ cubeVectorKFunctional Q t F := by + unfold cubeVectorKFunctional + exact le_csInf (cubeVectorKFunctional_range_nonempty Q t F) fun y hy => by + rcases hy with ⟨G, rfl⟩ + exact cubeVectorKFunctionalCompetitorValue_nonneg Q t F G + +theorem cubeVectorKFunctional_le_competitor {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) + (G : CubeVectorH1Function Q) : + cubeVectorKFunctional Q t F ≤ + cubeVectorKFunctionalCompetitorValue Q t F G := by + unfold cubeVectorKFunctional + exact csInf_le (cubeVectorKFunctional_range_bddBelow Q t F) ⟨G, rfl⟩ + +theorem cubeVectorKFunctionalCompetitorValue_le_of_endpoint_bounds {d : ℕ} + (Q : TriadicCube d) (t C : ℝ) (F H : Vec d → Vec d) + (V G : CubeVectorH1Function Q) (hC : 0 ≤ C) + (hL2 : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => F x - V.toField x) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => H x - G.toField x)) + (hGrad : + V.gradientCoordL2NormSum ≤ C * G.gradientCoordL2NormSum) : + cubeVectorKFunctionalCompetitorValue Q t F V ≤ + C * cubeVectorKFunctionalCompetitorValue Q t H G := by + let Aout : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (fun x => F x - V.toField x) + let Ain : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (fun x => H x - G.toField x) + let Bout : ℝ := V.relativeGradientCoordL2NormSum + let Bin : ℝ := G.relativeGradientCoordL2NormSum + have hAout_nonneg : 0 ≤ Aout := by + dsimp [Aout] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => F x - V.toField x) + have hAin_nonneg : 0 ≤ Ain := by + dsimp [Ain] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => H x - G.toField x) + have hBout_nonneg : 0 ≤ Bout := by + dsimp [Bout] + exact V.relativeGradientCoordL2NormSum_nonneg + have hBin_nonneg : 0 ≤ Bin := by + dsimp [Bin] + exact G.relativeGradientCoordL2NormSum_nonneg + have hCAin_nonneg : 0 ≤ C * Ain := mul_nonneg hC hAin_nonneg + have hCBin_nonneg : 0 ≤ C * Bin := mul_nonneg hC hBin_nonneg + have hA_sq : Aout ^ 2 ≤ C ^ 2 * Ain ^ 2 := by + have hsq : Aout ^ 2 ≤ (C * Ain) ^ 2 := + (sq_le_sq₀ hAout_nonneg hCAin_nonneg).mpr (by + simpa [Aout, Ain] using hL2) + calc + Aout ^ 2 ≤ (C * Ain) ^ 2 := hsq + _ = C ^ 2 * Ain ^ 2 := by ring + have hB_sq : Bout ^ 2 ≤ C ^ 2 * Bin ^ 2 := by + have hGradRel : + V.relativeGradientCoordL2NormSum ≤ + C * G.relativeGradientCoordL2NormSum := + CubeVectorH1Function.relativeGradientCoordL2NormSum_le_mul_of_gradientCoordL2NormSum_le + hGrad + have hsq : Bout ^ 2 ≤ (C * Bin) ^ 2 := + (sq_le_sq₀ hBout_nonneg hCBin_nonneg).mpr (by + simpa [Bout, Bin] using hGradRel) + calc + Bout ^ 2 ≤ (C * Bin) ^ 2 := hsq + _ = C ^ 2 * Bin ^ 2 := by ring + have ht_sq_nonneg : 0 ≤ t ^ 2 := sq_nonneg t + have hsum : + Aout ^ 2 + t ^ 2 * Bout ^ 2 ≤ + C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + calc + Aout ^ 2 + t ^ 2 * Bout ^ 2 + ≤ C ^ 2 * Ain ^ 2 + t ^ 2 * (C ^ 2 * Bin ^ 2) := by + exact add_le_add hA_sq (mul_le_mul_of_nonneg_left hB_sq ht_sq_nonneg) + _ = C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + ring + calc + cubeVectorKFunctionalCompetitorValue Q t F V + = Real.sqrt (Aout ^ 2 + t ^ 2 * Bout ^ 2) := by + rfl + _ ≤ Real.sqrt (C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2)) := + Real.sqrt_le_sqrt hsum + _ = Real.sqrt (C ^ 2) * Real.sqrt (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + rw [Real.sqrt_mul (sq_nonneg C)] + _ = C * Real.sqrt (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + rw [Real.sqrt_sq hC] + _ = C * cubeVectorKFunctionalCompetitorValue Q t H G := by + rfl + +theorem cubeVectorKFunctional_le_of_forall_competitorValue_le {d : ℕ} + (Q : TriadicCube d) (t C : ℝ) (F H : Vec d → Vec d) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + ∃ V : CubeVectorH1Function Q, + cubeVectorKFunctionalCompetitorValue Q t F V ≤ + C * cubeVectorKFunctionalCompetitorValue Q t H G) : + cubeVectorKFunctional Q t F ≤ C * cubeVectorKFunctional Q t H := by + by_cases hC_zero : C = 0 + · rcases hcomp default with ⟨V, hV⟩ + have hout_le_zero : + cubeVectorKFunctional Q t F ≤ 0 := by + calc + cubeVectorKFunctional Q t F + ≤ cubeVectorKFunctionalCompetitorValue Q t F V := + cubeVectorKFunctional_le_competitor Q t F V + _ ≤ 0 := by simpa [hC_zero] using hV + simpa [hC_zero] using hout_le_zero + · have hC_pos : 0 < C := lt_of_le_of_ne hC (Ne.symm hC_zero) + have hdiv_le : + cubeVectorKFunctional Q t F / C ≤ cubeVectorKFunctional Q t H := by + unfold cubeVectorKFunctional + refine le_csInf (cubeVectorKFunctional_range_nonempty Q t H) ?_ + rintro y ⟨G, rfl⟩ + rcases hcomp G with ⟨V, hV⟩ + have hout_le : + sInf (Set.range fun W : CubeVectorH1Function Q => + cubeVectorKFunctionalCompetitorValue Q t F W) ≤ + C * cubeVectorKFunctionalCompetitorValue Q t H G := + (csInf_le (cubeVectorKFunctional_range_bddBelow Q t F) ⟨V, rfl⟩).trans hV + exact (div_le_iff₀ hC_pos).2 (by simpa [mul_comm] using hout_le) + exact (div_le_iff₀ hC_pos).1 hdiv_le |>.trans_eq (by ring) + +/-- Depth-`j` K-functional contribution to the positive `q = 2` scale. -/ +noncomputable def cubeKBesovVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F + +theorem cubeKBesovVectorDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s F j := by + unfold cubeKBesovVectorDepthSeminorm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeVectorKFunctional_nonneg Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F) + +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctional_of_forall_competitorValue + {d : ℕ} (Q : TriadicCube d) (C : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F := by + let A : ℝ := Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + by_cases hC_zero : C = 0 + · have hA_le_zero : A ≤ 0 := by + simpa [A, t, hC_zero] using hcomp default + simpa [A, t, hC_zero] using hA_le_zero + · have hC_pos : 0 < C := lt_of_le_of_ne hC (Ne.symm hC_zero) + have hdiv_le : A / C ≤ cubeVectorKFunctional Q t F := by + unfold cubeVectorKFunctional + refine le_csInf (cubeVectorKFunctional_range_nonempty Q t F) ?_ + rintro y ⟨G, rfl⟩ + exact (div_le_iff₀ hC_pos).2 (by + simpa [A, t, mul_comm] using hcomp G) + have hA_le : A ≤ cubeVectorKFunctional Q t F * C := + (div_le_iff₀ hC_pos).1 hdiv_le + simpa [A, t, mul_comm] using hA_le + +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_le_mul_cubeKBesovVectorDepthSeminorm_of_forall_competitorValue + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hC : 0 ≤ C) + (hcomp : + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s F j := by + let W : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have hW : 0 ≤ W := Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hbase : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F := + sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctional_of_forall_competitorValue + Q C F j hC hcomp + calc + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j + = + W * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) := by + rfl + _ ≤ W * (C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F) := + mul_le_mul_of_nonneg_left hbase hW + _ = C * cubeKBesovVectorDepthSeminorm Q s F j := by + unfold cubeKBesovVectorDepthSeminorm W + ring + +theorem cubeKBesovVectorDepthSeminorm_le_of_kFunctional_le {d : ℕ} + (Q : TriadicCube d) (s C : ℝ) (F G : Vec d → Vec d) (j : ℕ) + (hK : + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s G j := by + let W : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have hW : 0 ≤ W := Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + cubeKBesovVectorDepthSeminorm Q s F j + = W * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F := by + rfl + _ ≤ W * (C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) := + mul_le_mul_of_nonneg_left hK hW + _ = C * cubeKBesovVectorDepthSeminorm Q s G j := by + unfold cubeKBesovVectorDepthSeminorm W + ring + +/-- Finite-depth discrete K-functional Besov seminorm. -/ +noncomputable def cubeKBesovVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2 + +theorem cubeKBesovVectorPartialSeminormTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : + 0 ≤ cubeKBesovVectorPartialSeminormTwo Q s N F := + Real.sqrt_nonneg _ + +theorem sq_cubeKBesovVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) : + (cubeKBesovVectorPartialSeminormTwo Q s N F) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2 := by + unfold cubeKBesovVectorPartialSeminormTwo + rw [Real.sq_sqrt] + exact Finset.sum_nonneg fun j _ => sq_nonneg _ + +theorem cubeKBesovVectorPartialSeminormTwo_le_of_forall_depthSeminorm_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (N : ℕ) + (F G : Vec d → Vec d) (hC : 0 ≤ C) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeKBesovVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s G j) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G := by + let S := Finset.range (N + 1) + have hsum : + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) ≤ + C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2) := by + calc + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) + ≤ Finset.sum S (fun j => + (C * cubeKBesovVectorDepthSeminorm Q s G j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hF_nonneg : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s F j := + cubeKBesovVectorDepthSeminorm_nonneg Q s F j + have hG_nonneg : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s G j := + cubeKBesovVectorDepthSeminorm_nonneg Q s G j + have hCG_nonneg : + 0 ≤ C * cubeKBesovVectorDepthSeminorm Q s G j := + mul_nonneg hC hG_nonneg + exact (sq_le_sq₀ hF_nonneg hCG_nonneg).mpr (hdepth j hj) + _ = Finset.sum S (fun j => + C ^ 2 * (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + ring + _ = C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2) := by + rw [Finset.mul_sum] + calc + cubeKBesovVectorPartialSeminormTwo Q s N F + = Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2)) := by + rfl + _ ≤ Real.sqrt + (C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2)) := + Real.sqrt_le_sqrt hsum + _ = Real.sqrt (C ^ 2) * + Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2)) := by + rw [Real.sqrt_mul (sq_nonneg C)] + _ = C * + Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s G j) ^ 2)) := by + rw [Real.sqrt_sq hC] + _ = C * cubeKBesovVectorPartialSeminormTwo Q s N G := by + rfl + +theorem cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (N : ℕ) + (F G : Vec d → Vec d) (hC : 0 ≤ C) + (hK : + ∀ j ∈ Finset.range (N + 1), + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G := + cubeKBesovVectorPartialSeminormTwo_le_of_forall_depthSeminorm_le + Q s C N F G hC fun j hj => + cubeKBesovVectorDepthSeminorm_le_of_kFunctional_le + Q s C F G j (hK j hj) + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_depthSeminorm_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (N : ℕ) + (F : Vec d → Vec d) (hC : 0 ≤ C) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + C * cubeKBesovVectorDepthSeminorm Q s F j) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N F := by + let S := Finset.range (N + 1) + have hsum : + Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) ≤ + C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) := by + calc + Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) + ≤ Finset.sum S (fun j => + (C * cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hOverlap_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j := + cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s F j + have hK_nonneg : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s F j := + cubeKBesovVectorDepthSeminorm_nonneg Q s F j + have hCK_nonneg : + 0 ≤ C * cubeKBesovVectorDepthSeminorm Q s F j := + mul_nonneg hC hK_nonneg + exact (sq_le_sq₀ hOverlap_nonneg hCK_nonneg).mpr (hdepth j hj) + _ = Finset.sum S (fun j => + C ^ 2 * (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + ring + _ = C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) := by + rw [Finset.mul_sum] + calc + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F + = Real.sqrt + (Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2)) := by + rfl + _ ≤ Real.sqrt + (C ^ 2 * + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2)) := + Real.sqrt_le_sqrt hsum + _ = Real.sqrt (C ^ 2) * + Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2)) := by + rw [Real.sqrt_mul (sq_nonneg C)] + _ = C * + Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2)) := by + rw [Real.sqrt_sq hC] + _ = C * cubeKBesovVectorPartialSeminormTwo Q s N F := by + rfl + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_competitorValue + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (N : ℕ) + (F : Vec d → Vec d) (hC : 0 ≤ C) + (hcomp : + ∀ j ∈ Finset.range (N + 1), + ∀ G : CubeVectorH1Function Q, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + C * + cubeVectorKFunctionalCompetitorValue Q + (Real.rpow (3 : ℝ) (-(j : ℝ))) F G) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N F := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_depthSeminorm_le + Q s C N F hC fun j hj => + cubeBesovOverlappingPositiveVectorDepthSeminorm_le_mul_cubeKBesovVectorDepthSeminorm_of_forall_competitorValue + Q s C F j hC (hcomp j hj) + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + (8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1) * + cubeKBesovVectorPartialSeminormTwo Q s N F := by + let K : ℝ := 8 * (3 ^ d : ℝ) + 2 * C ^ 2 + 1 + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + exact + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_forall_competitorValue + Q s K N F hK_nonneg fun j hj G => by + simpa [K] using + sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_mul_cubeVectorKFunctionalCompetitorValue_of_overlapPoincare + hC hPoincare Q F j G hF + +/-- Assemble the reverse finite-level comparison from a depthwise +K-functional bound by the corrected overlapping depth seminorm. + +This is the square-sum part of the remaining interpolation proof. The hard +analytic construction still has to provide the depthwise estimate, but once it +does, no additional summability argument is needed. -/ +theorem cubeKBesovVectorPartialSeminormTwo_le_mul_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_of_forall_depthSeminorm_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (N : ℕ) + (F : Vec d → Vec d) (hC : 0 ≤ C) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + cubeKBesovVectorDepthSeminorm Q s F j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F := by + let S := Finset.range (N + 1) + have hsum : + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) ≤ + C ^ 2 * + Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := by + calc + Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2) + ≤ Finset.sum S (fun j => + (C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hK_nonneg : + 0 ≤ cubeKBesovVectorDepthSeminorm Q s F j := + cubeKBesovVectorDepthSeminorm_nonneg Q s F j + have hOverlap_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j := + cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s F j + have hCOverlap_nonneg : + 0 ≤ C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j := + mul_nonneg hC hOverlap_nonneg + exact (sq_le_sq₀ hK_nonneg hCOverlap_nonneg).mpr (hdepth j hj) + _ = Finset.sum S (fun j => + C ^ 2 * (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + ring + _ = C ^ 2 * + Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := by + rw [Finset.mul_sum] + calc + cubeKBesovVectorPartialSeminormTwo Q s N F + = Real.sqrt + (Finset.sum S (fun j => + (cubeKBesovVectorDepthSeminorm Q s F j) ^ 2)) := by + rfl + _ ≤ Real.sqrt + (C ^ 2 * + Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2)) := + Real.sqrt_le_sqrt hsum + _ = Real.sqrt (C ^ 2) * + Real.sqrt + (Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2)) := by + rw [Real.sqrt_mul (sq_nonneg C)] + _ = C * + Real.sqrt + (Finset.sum S (fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2)) := by + rw [Real.sqrt_sq hC] + _ = C * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F := by + rfl + +/-- Full discrete K-functional Besov seminorm. -/ +noncomputable def cubeKBesovVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + sSup (Set.range fun N : ℕ => cubeKBesovVectorPartialSeminormTwo Q s N F) + +theorem cubeKBesovVectorSeminormTwo_le_of_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeKBesovVectorPartialSeminormTwo Q s N F ≤ B) : + cubeKBesovVectorSeminormTwo Q s F ≤ B := by + unfold cubeKBesovVectorSeminormTwo + refine csSup_le ?_ ?_ + · exact ⟨cubeKBesovVectorPartialSeminormTwo Q s 0 F, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) + (N : ℕ) : + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + cubeKBesovVectorSeminormTwo Q s F := by + unfold cubeKBesovVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeKBesovVectorSeminormTwo_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N F)) : + 0 ≤ cubeKBesovVectorSeminormTwo Q s F := by + have h0_le : + cubeKBesovVectorPartialSeminormTwo Q s 0 F ≤ + cubeKBesovVectorSeminormTwo Q s F := + cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s F hBdd 0 + exact (cubeKBesovVectorPartialSeminormTwo_nonneg Q s 0 F).trans h0_le + +theorem cubeKBesovVectorSeminormTwo_le_of_forall_partialSeminormTwo_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (F G : Vec d → Vec d) + (hC : 0 ≤ C) + (hG_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N G)) + (hpartial : + ∀ N : ℕ, + cubeKBesovVectorPartialSeminormTwo Q s N F ≤ + C * cubeKBesovVectorPartialSeminormTwo Q s N G) : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G := + cubeKBesovVectorSeminormTwo_le_of_partialBound Q s F fun N => + (hpartial N).trans + (mul_le_mul_of_nonneg_left + (cubeKBesovVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s G hG_bdd N) + hC) + +theorem cubeKBesovVectorSeminormTwo_le_of_forall_kFunctional_le + {d : ℕ} (Q : TriadicCube d) (s C : ℝ) (F G : Vec d → Vec d) + (hC : 0 ≤ C) + (hG_bdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N G)) + (hK : + ∀ j : ℕ, + cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) F ≤ + C * cubeVectorKFunctional Q (Real.rpow (3 : ℝ) (-(j : ℝ))) G) : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G := + cubeKBesovVectorSeminormTwo_le_of_forall_partialSeminormTwo_le + Q s C F G hC hG_bdd fun N => + cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + Q s C N F G hC fun j _hj => hK j + +/-- Full discrete K-functional Besov norm with the same mean term as the +note-normalized positive triadic norm. -/ +noncomputable def cubeKBesovVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeKBesovVectorSeminormTwo Q s F + +theorem cubeKBesovVectorNormTwo_le_of_average_and_seminorm {d : ℕ} + (Q : TriadicCube d) (s C : ℝ) (F G : Vec d → Vec d) + (havg : + Real.sqrt (vecNormSq (cubeAverageVec Q F)) ≤ + C * Real.sqrt (vecNormSq (cubeAverageVec Q G))) + (hsemi : + cubeKBesovVectorSeminormTwo Q s F ≤ + C * cubeKBesovVectorSeminormTwo Q s G) : + cubeKBesovVectorNormTwo Q s F ≤ + C * cubeKBesovVectorNormTwo Q s G := by + unfold cubeKBesovVectorNormTwo + calc + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeKBesovVectorSeminormTwo Q s F + ≤ + C * Real.sqrt (vecNormSq (cubeAverageVec Q G)) + + C * cubeKBesovVectorSeminormTwo Q s G := + add_le_add havg hsemi + _ = + C * + (Real.sqrt (vecNormSq (cubeAverageVec Q G)) + + cubeKBesovVectorSeminormTwo Q s G) := by + ring + +/-- The canonical K-functional Besov norm model used by the revised proof. -/ +noncomputable def cubeKBesovNormModel (d : ℕ) : CubeKBesovNormModel d := + fun Q s F => cubeKBesovVectorNormTwo Q s F + +/-- Pure function-space bridge between a K-functional Besov norm and the +corrected overlapping positive `B^s_{2,2}` norm. -/ +def CubeKBesovOverlappingEquivalence + {d : ℕ} (K : CubeKBesovNormModel d) : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (F : Vec d → Vec d), + cubeBesovOverlappingPositiveVectorNormTwo Q s F ≤ C * K Q s F ∧ + K Q s F ≤ C * cubeBesovOverlappingPositiveVectorNormTwo Q s F + +/-- K-functional regularity estimate for the Dirichlet divergence solution +operator. This is the PDE-plus-K-functional part of the revised proof, before +the pure norm-equivalence bridge back to the triadic Besov norm. -/ +def CubeKBesovDirichletRegularity + {d : ℕ} (K : CubeKBesovNormModel d) : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)), + CubeVectorOverlappingBesovHRegularity Q s h → + CubeDirichletDivergenceProblem Q w h → + K Q s (fun x => w.toH1Function.grad x) ≤ C * K Q s h + +/-- Uniform-in-`s` version of `CubeKBesovDirichletRegularity`. This is the +form needed by downstream arguments which must track the entire `s`-profile +instead of choosing a fresh constant after `s` has been fixed. -/ +def CubeKBesovDirichletRegularityUniform + {d : ℕ} (K : CubeKBesovNormModel d) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ {s : ℝ}, 0 < s → s < 1 → + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) + (w : H10Function (openCubeSet Q)), + CubeVectorOverlappingBesovHRegularity Q s h → + CubeDirichletDivergenceProblem Q w h → + K Q s (fun x => w.toH1Function.grad x) ≤ C * K Q s h + +theorem CubeKBesovDirichletRegularityUniform.to_dirichletRegularity + {d : ℕ} {K : CubeKBesovNormModel d} {C : ℝ} + (h : CubeKBesovDirichletRegularityUniform K C) : + CubeKBesovDirichletRegularity K := by + intro s hs_pos hs_lt + exact ⟨C, h.1, h.2 hs_pos hs_lt⟩ + +/-- Boundedness bridge needed to read the `sSup` defining the K-functional +Besov seminorm as a genuine supremum for inputs known to have the corrected +overlapping positive Besov regularity. -/ +def CubeKBesovInputBoundednessOfOverlappingHRegularity + (d : ℕ) : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∀ (Q : TriadicCube d) (h : Vec d → Vec d), + CubeVectorOverlappingBesovHRegularity Q s h → + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N h) + +/-- Finite-level pure K/overlapping comparison strong enough to make the +`sSup`-based K-functional seminorm honest on every datum with overlapping +positive Besov regularity. + +This is the boundedness half of the pure Besov theory in a form that avoids +talking about the full K-seminorm before boundedness has been established. -/ +def CubeKBesovPartialBoundByOverlappingPositive + (d : ℕ) : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) (N : ℕ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + cubeKBesovVectorPartialSeminormTwo Q s N h ≤ + C * + (Real.sqrt (vecNormSq (cubeAverageVec Q h)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h) + +/-- Uniform-in-`s` finite-level K/overlap comparison. -/ +def CubeKBesovPartialBoundByOverlappingPositiveUniform + (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ {s : ℝ}, 0 < s → s < 1 → + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) (N : ℕ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + cubeKBesovVectorPartialSeminormTwo Q s N h ≤ + C * + (Real.sqrt (vecNormSq (cubeAverageVec Q h)) + + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N h) + +theorem CubeKBesovPartialBoundByOverlappingPositiveUniform.to_partialBound + {d : ℕ} {C : ℝ} + (h : CubeKBesovPartialBoundByOverlappingPositiveUniform d C) : + CubeKBesovPartialBoundByOverlappingPositive d := by + intro s hs_pos hs_lt + exact ⟨C, h.1, h.2 hs_pos hs_lt⟩ + +/-- One-depth competitor estimate expected from the overlap averaging +operator. + +For every parent cube, field, and depth, there is an `H¹` competitor whose +residual and scaled gradient are both controlled by the corrected overlapping +oscillation at that depth. -/ +def CubeKBesovOverlapAveragingCompetitorEstimate + (d : ℕ) (C : ℝ) : Prop := + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) (j : ℕ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + ∃ G : CubeVectorH1Function Q, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => h x - G.toField x) ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) ∧ + Real.rpow (3 : ℝ) (-(j : ℝ)) * + G.relativeGradientCoordL2NormSum ≤ + C * Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q h j) + +/-- Depthwise reverse K/overlap estimate supplied by the planned smoothing +operator. + +This is now the precise analytic target for the hard interpolation step: build +an `H¹` competitor at scale `3^{-j}` whose K-functional value is controlled by +the corrected overlapping oscillation at the same depth. -/ +def CubeKBesovDepthBoundByOverlappingPositive + (d : ℕ) : Prop := + ∀ {s : ℝ}, 0 < s → s < 1 → + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) (j : ℕ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + cubeKBesovVectorDepthSeminorm Q s h j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j + +/-- Uniform-in-`s` depthwise K/overlap comparison. -/ +def CubeKBesovDepthBoundByOverlappingPositiveUniform + (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ {s : ℝ}, 0 < s → s < 1 → + ∀ (Q : TriadicCube d) (h : Vec d → Vec d) (j : ℕ), + MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + cubeKBesovVectorDepthSeminorm Q s h j ≤ + C * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j + +theorem CubeKBesovDepthBoundByOverlappingPositiveUniform.to_depthBound + {d : ℕ} {C : ℝ} + (h : CubeKBesovDepthBoundByOverlappingPositiveUniform d C) : + CubeKBesovDepthBoundByOverlappingPositive d := by + intro s hs_pos hs_lt + exact ⟨C, h.1, h.2 hs_pos hs_lt⟩ + +/-- Uniform residual-plus-gradient control implies the uniform depthwise +K/overlap estimate. -/ +theorem cubeKBesovDepthBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + {d : ℕ} {C : ℝ} (hC : 0 ≤ C) + (hcomp : CubeKBesovOverlapAveragingCompetitorEstimate d C) : + CubeKBesovDepthBoundByOverlappingPositiveUniform d (2 * C) := by + refine ⟨mul_nonneg (by norm_num) hC, ?_⟩ + intro s _hs_pos _hs_lt Q h j hh + rcases hcomp Q h j hh with ⟨G, hres, hgrad⟩ + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let A : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (fun x => h x - G.toField x) + let B : ℝ := t * G.relativeGradientCoordL2NormSum + let D : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q h j + let Y : ℝ := C * Real.sqrt D + let W : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => h x - G.toField x) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg ht_nonneg G.relativeGradientCoordL2NormSum_nonneg + have hY_nonneg : 0 ≤ Y := by + dsimp [Y] + exact mul_nonneg hC (Real.sqrt_nonneg D) + have hW_nonneg : 0 ≤ W := by + dsimp [W] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hres' : A ≤ Y := by + simpa [A, D, Y] using hres + have hgrad' : B ≤ Y := by + simpa [B, D, Y, t] using hgrad + have hcomp_value_le_sum : + cubeVectorKFunctionalCompetitorValue Q t h G ≤ A + B := by + have hright_nonneg : 0 ≤ A + B := add_nonneg hA_nonneg hB_nonneg + have hsq : + A ^ 2 + t ^ 2 * G.relativeGradientCoordL2NormSum ^ 2 ≤ + (A + B) ^ 2 := by + have hBsq : B ^ 2 = t ^ 2 * G.relativeGradientCoordL2NormSum ^ 2 := by + dsimp [B] + ring + rw [← hBsq] + nlinarith [mul_nonneg hA_nonneg hB_nonneg] + simpa [cubeVectorKFunctionalCompetitorValue, A, B] using + (Real.sqrt_le_iff.mpr ⟨hright_nonneg, hsq⟩) + have hcomp_value_le : + cubeVectorKFunctionalCompetitorValue Q t h G ≤ 2 * Y := by + calc + cubeVectorKFunctionalCompetitorValue Q t h G + ≤ A + B := hcomp_value_le_sum + _ ≤ Y + Y := add_le_add hres' hgrad' + _ = 2 * Y := by ring + have hK_le : + cubeVectorKFunctional Q t h ≤ 2 * Y := + (cubeVectorKFunctional_le_competitor Q t h G).trans hcomp_value_le + calc + cubeKBesovVectorDepthSeminorm Q s h j + = W * cubeVectorKFunctional Q t h := by + rfl + _ ≤ W * (2 * Y) := + mul_le_mul_of_nonneg_left hK_le hW_nonneg + _ = (2 * C) * + (W * Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q h j)) := by + simp [Y, D] + ring + _ = (2 * C) * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s h j := by + rfl + +/-- Residual plus scaled-gradient control for the planned overlap averaging +competitor implies the depthwise K/overlap estimate. -/ +theorem cubeKBesovDepthBoundByOverlappingPositive_of_overlapAveragingCompetitorEstimate + {d : ℕ} {C : ℝ} (hC : 0 ≤ C) + (hcomp : CubeKBesovOverlapAveragingCompetitorEstimate d C) : + CubeKBesovDepthBoundByOverlappingPositive d := by + exact + (cubeKBesovDepthBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + hC hcomp).to_depthBound + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapCenters.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapCenters.lean new file mode 100644 index 0000000000..a7c51f7e3e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapCenters.lean @@ -0,0 +1,758 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapLp + +/-! # Overlap Centers -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Fine-grid centers used by the overlapping norm at depth `j`. + +The centers are descendants one generation below the cube scale. We retain +only those centers whose overlapping cube lies inside the parent cube; this +keeps the local Dirichlet theorem from sampling outside the cube where the +solution representative has no Sobolev control. -/ +noncomputable def overlapCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q (j + 1)).filter + (fun S => overlapCubeSet S ⊆ cubeSet Q) + +theorem mem_overlapCentersAtDepth_iff {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} : + S ∈ overlapCentersAtDepth Q j ↔ + S ∈ descendantsAtDepth Q (j + 1) ∧ overlapCubeSet S ⊆ cubeSet Q := by + classical + simp [overlapCentersAtDepth] + +theorem mem_descendantsAtDepth_of_mem_overlapCentersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + S ∈ descendantsAtDepth Q (j + 1) := + (mem_overlapCentersAtDepth_iff.mp hS).1 + +theorem overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeSet S ⊆ cubeSet Q := + (mem_overlapCentersAtDepth_iff.mp hS).2 + +theorem openOverlapCubeSet_subset_openCubeSet_of_mem_overlapCentersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + openOverlapCubeSet S ⊆ openCubeSet Q := by + have hsub : openOverlapCubeSet S ⊆ cubeSet Q := + (openOverlapCubeSet_subset_overlapCubeSet S).trans + (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS) + have hsub_int : openOverlapCubeSet S ⊆ interior (cubeSet Q) := + (isOpen_openOverlapCubeSet S).subset_interior_iff.2 hsub + simpa [interior_cubeSet_eq_openCubeSet Q] using hsub_int + +theorem memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + {Q S : TriadicCube d} {j : ℕ} {p : ℝ≥0∞} {f : Vec d → E} + (hS : S ∈ overlapCentersAtDepth Q j) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S) := by + have hfCube : MeasureTheory.MemLp f p (cubeMeasure Q) := + memLp_cubeMeasure_of_memLp_normalizedCubeMeasure Q hf + have hle : overlapCubeMeasure S ≤ cubeMeasure Q := by + rw [overlapCubeMeasure, cubeMeasure] + exact MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS) + have hfOverlap : MeasureTheory.MemLp f p (overlapCubeMeasure S) := + hfCube.mono_measure hle + simpa [normalizedOverlapCubeMeasure] using + hfOverlap.smul_measure ENNReal.ofReal_ne_top + +theorem overlapCubeScaleFactor_eq_cubeScaleFactor_div_pow_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeScaleFactor S = cubeScaleFactor Q / (3 : ℝ) ^ j := by + have hdesc : S ∈ descendantsAtDepth Q (j + 1) := + mem_descendantsAtDepth_of_mem_overlapCentersAtDepth hS + unfold overlapCubeScaleFactor + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hdesc] + have hpow_succ : (3 : ℝ) ^ (j + 1) = (3 : ℝ) ^ j * 3 := by + rw [pow_succ] + rw [hpow_succ] + field_simp [pow_ne_zero j (show (3 : ℝ) ≠ 0 by norm_num)] + +theorem inv_cubeScaleFactor_eq_three_mul_inv_depthScale_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + (cubeScaleFactor S)⁻¹ = + 3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹ := by + have hscale := + overlapCubeScaleFactor_eq_cubeScaleFactor_div_pow_of_mem_overlapCentersAtDepth hS + unfold overlapCubeScaleFactor at hscale + calc + (cubeScaleFactor S)⁻¹ = (3 * cubeScaleFactor S)⁻¹ * 3 := by + have hSpos : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + field_simp [hSpos.ne'] + _ = (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹ * 3 := by + rw [hscale] + _ = 3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹ := by + ring + +theorem overlapCubeVolume_eq_cubeVolume_div_pow_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeVolume S = cubeVolume Q / (((3 : ℝ) ^ d) ^ j) := by + have hscale := + overlapCubeScaleFactor_eq_cubeScaleFactor_div_pow_of_mem_overlapCentersAtDepth hS + unfold overlapCubeVolume + rw [hscale, div_pow, cubeVolume_eq_scaleFactor_pow] + congr 1 + rw [← pow_mul, ← pow_mul, Nat.mul_comm] + +theorem middleDescendant_succ_mem_overlapCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + middleDescendant Q (j + 1) ∈ overlapCentersAtDepth Q j := by + rw [mem_overlapCentersAtDepth_iff] + exact ⟨middleDescendant_mem_descendantsAtDepth Q (j + 1), + overlapCubeSet_middleDescendant_succ_subset_cubeSet Q j⟩ + +theorem overlapCentersAtDepth_nonempty {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (overlapCentersAtDepth Q j).Nonempty := + ⟨middleDescendant Q (j + 1), + middleDescendant_succ_mem_overlapCentersAtDepth Q j⟩ + +theorem overlapCentersAtDepth_card_pos {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + 0 < (overlapCentersAtDepth Q j).card := + Finset.card_pos.mpr (overlapCentersAtDepth_nonempty Q j) + +theorem one_le_overlapCentersAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + 1 ≤ (overlapCentersAtDepth Q j).card := + overlapCentersAtDepth_card_pos Q j + +theorem overlapCentersAtDepth_card_ne_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≠ 0 := + ne_of_gt (overlapCentersAtDepth_card_pos Q j) + +theorem overlapCentersAtDepth_card_real_ne_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (((overlapCentersAtDepth Q j).card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast overlapCentersAtDepth_card_ne_zero Q j + +theorem overlapCentersAtDepth_card_le_descendantsAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≤ + (descendantsAtDepth Q (j + 1)).card := by + classical + unfold overlapCentersAtDepth + exact Finset.card_filter_le _ _ + +theorem overlapCentersAtDepth_card_le_pow {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≤ (3 ^ d) ^ (j + 1) := by + rw [← descendantsAtDepth_card Q (j + 1)] + exact overlapCentersAtDepth_card_le_descendantsAtDepth_card Q j + +theorem middleChildCube_mem_overlapCentersAtDepth_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + middleChildCube R ∈ overlapCentersAtDepth Q j := by + rw [mem_overlapCentersAtDepth_iff] + refine ⟨?_, ?_⟩ + · rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr + ⟨R, hR, middleChildCube_mem_childCubes R⟩ + · intro x hx + have hxR : x ∈ cubeSet R := by + simpa [overlapCubeSet_middleChildCube_eq_cubeSet R] using hx + exact cubeSet_subset_of_mem_descendantsAtDepth hR hxR + +theorem exists_mem_overlapCentersAtDepth_of_mem_cubeSet {d : ℕ} + {Q : TriadicCube d} {x : Vec d} (j : ℕ) + (hx : x ∈ cubeSet Q) : + ∃ S ∈ overlapCentersAtDepth Q j, x ∈ overlapCubeSet S := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet j hx with ⟨R, hR, hxR⟩ + refine ⟨middleChildCube R, + middleChildCube_mem_overlapCentersAtDepth_of_mem_descendantsAtDepth hR, ?_⟩ + simpa [overlapCubeSet_middleChildCube_eq_cubeSet R] using hxR + +theorem cubeSet_subset_iUnion_overlapCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeSet Q ⊆ + ⋃ S ∈ (overlapCentersAtDepth Q j : Set (TriadicCube d)), + overlapCubeSet S := by + intro x hx + rcases exists_mem_overlapCentersAtDepth_of_mem_cubeSet (Q := Q) j hx + with ⟨S, hS, hxS⟩ + exact Set.mem_iUnion.mpr ⟨S, Set.mem_iUnion.mpr ⟨hS, hxS⟩⟩ + +theorem descendantsAtDepth_card_le_overlapCentersAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (descendantsAtDepth Q j).card ≤ (overlapCentersAtDepth Q j).card := by + classical + refine Finset.card_le_card_of_injOn (fun R => middleChildCube R) ?_ ?_ + · intro R hR + exact middleChildCube_mem_overlapCentersAtDepth_of_mem_descendantsAtDepth hR + · intro R _hR S _hS hRS + exact middleChildCube_injective hRS + +theorem pow_le_overlapCentersAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (3 ^ d) ^ j ≤ (overlapCentersAtDepth Q j).card := by + rw [← descendantsAtDepth_card Q j] + exact descendantsAtDepth_card_le_overlapCentersAtDepth_card Q j + +theorem cubeVolume_le_card_mul_overlapCubeVolume_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + cubeVolume Q ≤ ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S := by + have hpow_cast : + (((3 ^ d) ^ j : ℕ) : ℝ) = (((3 : ℝ) ^ d) ^ j) := by + norm_num + have hcard_nat := pow_le_overlapCentersAtDepth_card Q j + have hcard : + (((3 : ℝ) ^ d) ^ j) ≤ ((overlapCentersAtDepth Q j).card : ℝ) := by + rw [← hpow_cast] + exact_mod_cast hcard_nat + have hden_pos : 0 < (((3 : ℝ) ^ d) ^ j) := by positivity + have hquot_nonneg : + 0 ≤ cubeVolume Q / (((3 : ℝ) ^ d) ^ j) := + div_nonneg (cubeVolume_nonneg Q) hden_pos.le + calc + cubeVolume Q = + (((3 : ℝ) ^ d) ^ j) * + (cubeVolume Q / (((3 : ℝ) ^ d) ^ j)) := by + field_simp [hden_pos.ne'] + _ ≤ ((overlapCentersAtDepth Q j).card : ℝ) * + (cubeVolume Q / (((3 : ℝ) ^ d) ^ j)) := by + exact mul_le_mul_of_nonneg_right hcard hquot_nonneg + _ = ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S := by + rw [overlapCubeVolume_eq_cubeVolume_div_pow_of_mem_overlapCentersAtDepth hS] + +theorem card_mul_overlapCubeVolume_le_pow_mul_cubeVolume_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S ≤ + (3 ^ d : ℝ) * cubeVolume Q := by + have hcard_nat := overlapCentersAtDepth_card_le_pow Q j + have hcard : + ((overlapCentersAtDepth Q j).card : ℝ) ≤ + (((3 ^ d) ^ (j + 1) : ℕ) : ℝ) := by + exact_mod_cast hcard_nat + have hpow_cast : + (((3 ^ d) ^ (j + 1) : ℕ) : ℝ) = + (((3 : ℝ) ^ d) ^ (j + 1)) := by + norm_num + rw [hpow_cast] at hcard + have hvol_nonneg : 0 ≤ overlapCubeVolume S := overlapCubeVolume_nonneg S + calc + ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S + ≤ (((3 : ℝ) ^ d) ^ (j + 1)) * overlapCubeVolume S := by + exact mul_le_mul_of_nonneg_right hcard hvol_nonneg + _ = + (((3 : ℝ) ^ d) ^ (j + 1)) * + (cubeVolume Q / (((3 : ℝ) ^ d) ^ j)) := by + rw [overlapCubeVolume_eq_cubeVolume_div_pow_of_mem_overlapCentersAtDepth hS] + _ = (3 ^ d : ℝ) * cubeVolume Q := by + have hbase_ne : (3 : ℝ) ^ d ≠ 0 := by positivity + rw [pow_succ] + field_simp [hbase_ne, pow_ne_zero j hbase_ne] + +theorem inv_cubeVolume_le_pow_mul_inv_card_mul_inv_overlapCubeVolume_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + (cubeVolume Q)⁻¹ ≤ + (3 ^ d : ℝ) * + (((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCubeVolume S)⁻¹) := by + let a : ℝ := ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S + let b : ℝ := cubeVolume Q + let K : ℝ := (3 ^ d : ℝ) + have ha_pos : 0 < a := by + dsimp [a] + exact mul_pos (by exact_mod_cast overlapCentersAtDepth_card_pos Q j) + (overlapCubeVolume_pos S) + have hb_pos : 0 < b := by + dsimp [b] + exact cubeVolume_pos Q + have hab : a ≤ K * b := by + simpa [a, b, K] using + card_mul_overlapCubeVolume_le_pow_mul_cubeVolume_of_mem_overlapCentersAtDepth + hS + have hmain : a * b⁻¹ ≤ K := by + rw [← div_eq_mul_inv] + exact (div_le_iff₀ hb_pos).2 hab + have hmain' : b⁻¹ ≤ K * a⁻¹ := by + have hmain_comm : b⁻¹ * a ≤ K := by + simpa [mul_comm] using hmain + rw [← div_eq_mul_inv] + exact (le_div_iff₀ ha_pos).2 hmain_comm + simpa [a, b, K, mul_inv, mul_assoc, mul_left_comm, mul_comm] using hmain' + +theorem inv_card_mul_inv_overlapCubeVolume_le_inv_cubeVolume_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) * + (overlapCubeVolume S)⁻¹ ≤ + (cubeVolume Q)⁻¹ := by + have hcard_pos : 0 < ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast overlapCentersAtDepth_card_pos Q j + have hprod_pos : + 0 < ((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S := + mul_pos hcard_pos (overlapCubeVolume_pos S) + calc + (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) * + (overlapCubeVolume S)⁻¹ = + (((overlapCentersAtDepth Q j).card : ℝ) * overlapCubeVolume S)⁻¹ := by + rw [mul_inv] + _ ≤ (cubeVolume Q)⁻¹ := by + exact + (inv_le_inv₀ hprod_pos (cubeVolume_pos Q)).2 + (cubeVolume_le_card_mul_overlapCubeVolume_of_mem_overlapCentersAtDepth hS) + +theorem inv_card_mul_ofReal_inv_overlapCubeVolume_le_ofReal_inv_cubeVolume + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) ≤ + ENNReal.ofReal ((cubeVolume Q)⁻¹) := by + have hcard_pos : 0 < ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast overlapCentersAtDepth_card_pos Q j + have hcard_inv_nonneg : + 0 ≤ (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) := by positivity + have hcard_ofReal : + ENNReal.ofReal (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) = + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) := by + rw [ENNReal.ofReal_inv_of_pos hcard_pos] + rw [ENNReal.ofReal_natCast] + rw [← hcard_ofReal, ← ENNReal.ofReal_mul hcard_inv_nonneg] + exact ENNReal.ofReal_le_ofReal + (inv_card_mul_inv_overlapCubeVolume_le_inv_cubeVolume_of_mem_overlapCentersAtDepth hS) + +theorem ofReal_inv_cubeVolume_le_pow_mul_inv_card_mul_ofReal_inv_overlapCubeVolume + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) : + ENNReal.ofReal ((cubeVolume Q)⁻¹) ≤ + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ENNReal.ofReal ((overlapCubeVolume S)⁻¹)) := by + have hcard_pos : 0 < ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast overlapCentersAtDepth_card_pos Q j + have hcard_inv_nonneg : + 0 ≤ (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) := by positivity + have hoverlap_inv_nonneg : 0 ≤ (overlapCubeVolume S)⁻¹ := + inv_nonneg.mpr (overlapCubeVolume_nonneg S) + have hprod_nonneg : + 0 ≤ (((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCubeVolume S)⁻¹) := + mul_nonneg hcard_inv_nonneg hoverlap_inv_nonneg + have hK_nonneg : 0 ≤ (3 ^ d : ℝ) := by positivity + have hcard_ofReal : + ENNReal.ofReal (((overlapCentersAtDepth Q j).card : ℝ)⁻¹) = + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) := by + rw [ENNReal.ofReal_inv_of_pos hcard_pos] + rw [ENNReal.ofReal_natCast] + have hK_ofReal : ENNReal.ofReal (3 ^ d : ℝ) = (3 ^ d : ℝ≥0∞) := by + norm_num + rw [← hK_ofReal, ← hcard_ofReal] + rw [← ENNReal.ofReal_mul hcard_inv_nonneg] + rw [← ENNReal.ofReal_mul hK_nonneg] + exact ENNReal.ofReal_le_ofReal + (by + simpa [mul_assoc] using + inv_cubeVolume_le_pow_mul_inv_card_mul_inv_overlapCubeVolume_of_mem_overlapCentersAtDepth + hS) + +/-- Reverse normalized integral comparison for families indexed by retained +overlap centers. Integrating a sum of overlap-supported nonnegative fields on +the parent normalized cube is controlled by the average of the normalized +overlap-cube integrals, with only a dimension constant. -/ +theorem overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) + {f : TriadicCube d → Vec d → ℝ≥0∞} + (hfQ : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable + ((overlapCubeSet S).indicator (f S)) + (MeasureTheory.volume.restrict (cubeSet Q))) : + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => (overlapCubeSet S).indicator (f S) x) + ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => ∫⁻ x, f S x ∂ normalizedOverlapCubeMeasure S)) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let parentCoeff : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let K : ℝ≥0∞ := (3 ^ d : ℝ≥0∞) + let childCoeff : TriadicCube d → ℝ≥0∞ := + fun S => ENNReal.ofReal ((overlapCubeVolume S)⁻¹) + let I : TriadicCube d → ℝ≥0∞ := + fun S => ∫⁻ x in overlapCubeSet S, f S x ∂MeasureTheory.volume + have hparent : + ∫⁻ x, + D.sum (fun S => (overlapCubeSet S).indicator (f S) x) + ∂ normalizedCubeMeasure Q = + parentCoeff * + ∫⁻ x in cubeSet Q, + D.sum (fun S => (overlapCubeSet S).indicator (f S) x) + ∂MeasureTheory.volume := by + simpa [D, parentCoeff] using + lintegral_normalizedCubeMeasure_eq Q + (fun x => + D.sum (fun S => (overlapCubeSet S).indicator (f S) x)) + have hcube_sum : + ∫⁻ x in cubeSet Q, + D.sum (fun S => (overlapCubeSet S).indicator (f S) x) + ∂MeasureTheory.volume = + D.sum I := by + calc + ∫⁻ x in cubeSet Q, + D.sum (fun S => (overlapCubeSet S).indicator (f S) x) + ∂MeasureTheory.volume + = + D.sum + (fun S => + ∫⁻ x in cubeSet Q, + (overlapCubeSet S).indicator (f S) x + ∂MeasureTheory.volume) := by + rw [MeasureTheory.lintegral_finsetSum' D] + intro S hS + exact hfQ S (by simpa [D] using hS) + _ = D.sum I := by + refine Finset.sum_congr rfl ?_ + intro S hS + have hsubset : + overlapCubeSet S ⊆ cubeSet Q := + overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth + (by simpa [D] using hS) + have hindicator : + (cubeSet Q).indicator + (fun x => (overlapCubeSet S).indicator (f S) x) = + (overlapCubeSet S).indicator (f S) := by + funext x + by_cases hxS : x ∈ overlapCubeSet S + · have hxQ : x ∈ cubeSet Q := hsubset hxS + simp [Set.indicator, hxS, hxQ] + · simp [Set.indicator, hxS] + calc + ∫⁻ x in cubeSet Q, + (overlapCubeSet S).indicator (f S) x + ∂MeasureTheory.volume + = + ∫⁻ x, + (cubeSet Q).indicator + (fun y => (overlapCubeSet S).indicator (f S) y) x + ∂MeasureTheory.volume := by + rw [MeasureTheory.lintegral_indicator (measurableSet_cubeSet Q)] + _ = ∫⁻ x, + (overlapCubeSet S).indicator (f S) x + ∂MeasureTheory.volume := by + rw [hindicator] + _ = I S := by + rw [MeasureTheory.lintegral_indicator + (measurableSet_overlapCubeSet S)] + have hsum_coeff : + parentCoeff * D.sum I ≤ + K * ((D.card : ℝ≥0∞)⁻¹ * + D.sum (fun S => childCoeff S * I S)) := by + calc + parentCoeff * D.sum I + = D.sum (fun S => parentCoeff * I S) := by + rw [Finset.mul_sum] + _ ≤ D.sum + (fun S => + K * (((D.card : ℝ≥0∞)⁻¹ * childCoeff S) * I S)) := by + refine Finset.sum_le_sum ?_ + intro S hS + have hcoeff : + parentCoeff ≤ + K * (((D.card : ℝ≥0∞)⁻¹ * childCoeff S)) := by + simpa [D, parentCoeff, K, childCoeff, mul_assoc] using + ofReal_inv_cubeVolume_le_pow_mul_inv_card_mul_ofReal_inv_overlapCubeVolume + (by simpa [D] using hS) + calc + parentCoeff * I S + ≤ (K * (((D.card : ℝ≥0∞)⁻¹ * childCoeff S))) * I S := by + exact mul_le_mul_of_nonneg_right hcoeff zero_le + _ = K * (((D.card : ℝ≥0∞)⁻¹ * childCoeff S) * I S) := by + rw [mul_assoc] + _ = D.sum + (fun S => + K * ((D.card : ℝ≥0∞)⁻¹ * (childCoeff S * I S))) := by + refine Finset.sum_congr rfl ?_ + intro S _hS + rw [mul_assoc ((D.card : ℝ≥0∞)⁻¹) (childCoeff S) (I S)] + _ = K * + D.sum + (fun S => (D.card : ℝ≥0∞)⁻¹ * (childCoeff S * I S)) := by + rw [Finset.mul_sum] + _ = K * ((D.card : ℝ≥0∞)⁻¹ * + D.sum (fun S => childCoeff S * I S)) := by + congr 1 + rw [Finset.mul_sum] + calc + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => (overlapCubeSet S).indicator (f S) x) + ∂ normalizedCubeMeasure Q + = + parentCoeff * D.sum I := by + rw [hparent, hcube_sum] + _ ≤ + K * ((D.card : ℝ≥0∞)⁻¹ * + D.sum (fun S => childCoeff S * I S)) := hsum_coeff + _ = + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => ∫⁻ x, f S x ∂ normalizedOverlapCubeMeasure S)) := by + refine congrArg (fun z => K * ((D.card : ℝ≥0∞)⁻¹ * z)) ?_ + refine Finset.sum_congr rfl ?_ + intro S _hS + simpa [childCoeff, I] using + (lintegral_normalizedOverlapCubeMeasure_eq S (f S)).symm + +/-- The overlap centers at depth `j` whose overlap cube contains `x`. -/ +noncomputable def overlapCentersAtDepthContaining {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : Finset (TriadicCube d) := by + classical + exact (overlapCentersAtDepth Q j).filter fun S => x ∈ overlapCubeSet S + +theorem mem_overlapCentersAtDepthContaining_iff {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} : + S ∈ overlapCentersAtDepthContaining Q j x ↔ + S ∈ overlapCentersAtDepth Q j ∧ x ∈ overlapCubeSet S := by + classical + simp [overlapCentersAtDepthContaining] + +theorem cubeColor_injOn_overlapCentersAtDepthContaining {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : + Set.InjOn cubeColor (overlapCentersAtDepthContaining Q j x : Set (TriadicCube d)) := by + intro R hR S hS hcolor + rcases mem_overlapCentersAtDepthContaining_iff.mp hR with ⟨hRcenter, hxR⟩ + rcases mem_overlapCentersAtDepthContaining_iff.mp hS with ⟨hScenter, hxS⟩ + by_contra hne + have hscale : + R.scale = S.scale := by + calc + R.scale = Q.scale - ((j + 1 : ℕ) : ℤ) := by + simpa using + scale_eq_sub_of_mem_descendantsAtDepth + (mem_descendantsAtDepth_of_mem_overlapCentersAtDepth hRcenter) + _ = S.scale := by + symm + simpa using + scale_eq_sub_of_mem_descendantsAtDepth + (mem_descendantsAtDepth_of_mem_overlapCentersAtDepth hScenter) + exact + (Set.disjoint_left.mp + (disjoint_overlapCubeSet_of_scale_eq_of_cubeColor_eq_of_ne hscale hcolor hne)) + hxR hxS + +theorem overlapCentersAtDepthContaining_card_le_pow {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : + (overlapCentersAtDepthContaining Q j x).card ≤ 3 ^ d := by + classical + have hcard_univ : + (overlapCentersAtDepthContaining Q j x).card ≤ + (Finset.univ : Finset (CubeColor d)).card := by + refine Finset.card_le_card_of_injOn cubeColor ?_ ?_ + · intro S _hS + simp + · exact cubeColor_injOn_overlapCentersAtDepthContaining Q j x + simpa [card_cubeColor] using hcard_univ + +/-- Pointwise finite-overlap bound for the overlapping cubes. This is the +indicator form of the multiplicity estimate: inside the parent cube at most +`3^d` overlap cubes contain a point, and outside the parent cube none of the +retained overlap cubes contribute. -/ +theorem overlapCentersAtDepth_sum_indicator_le_mul_cubeSet_indicator {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ≥0∞) : + (fun x => ∑ S ∈ overlapCentersAtDepth Q j, + (overlapCubeSet S).indicator f x) ≤ + fun x => (3 ^ d : ℝ≥0∞) * (cubeSet Q).indicator f x := by + classical + intro x + let D := overlapCentersAtDepth Q j + by_cases hxQ : x ∈ cubeSet Q + · have hsum_eq : + ∑ S ∈ D, (overlapCubeSet S).indicator f x = + ∑ S ∈ overlapCentersAtDepthContaining Q j x, f x := by + change + ∑ S ∈ D, (overlapCubeSet S).indicator f x = + ∑ S ∈ D.filter (fun S => x ∈ overlapCubeSet S), f x + rw [Finset.sum_filter] + refine Finset.sum_congr rfl ?_ + intro S hS + by_cases hxS : x ∈ overlapCubeSet S + · simp [Set.indicator, hxS] + · simp [Set.indicator, hxS] + have hcard : + ((overlapCentersAtDepthContaining Q j x).card : ℝ≥0∞) ≤ + (3 ^ d : ℝ≥0∞) := by + exact_mod_cast overlapCentersAtDepthContaining_card_le_pow Q j x + calc + ∑ S ∈ D, (overlapCubeSet S).indicator f x + = (overlapCentersAtDepthContaining Q j x).card • f x := by + rw [hsum_eq, Finset.sum_const] + _ = ((overlapCentersAtDepthContaining Q j x).card : ℝ≥0∞) * f x := by + rw [nsmul_eq_mul] + _ ≤ (3 ^ d : ℝ≥0∞) * f x := by + exact mul_le_mul_left hcard (f x) + _ = (3 ^ d : ℝ≥0∞) * (cubeSet Q).indicator f x := by + simp [Set.indicator, hxQ] + · have hzero : + ∑ S ∈ D, (overlapCubeSet S).indicator f x = 0 := by + refine Finset.sum_eq_zero ?_ + intro S hS + have hxS : x ∉ overlapCubeSet S := by + intro hxS' + exact hxQ (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS hxS') + simp [Set.indicator, hxS] + change + ∑ S ∈ D, (overlapCubeSet S).indicator f x ≤ + (3 ^ d : ℝ≥0∞) * (cubeSet Q).indicator f x + rw [hzero] + simp [Set.indicator, hxQ] + +/-- Integrated finite-overlap bound for nonnegative functions on the retained +overlap cubes. This is the measure-level form of the geometry API used by the +overlapping Besov endpoint. -/ +theorem overlapCentersAtDepth_sum_setLIntegral_le_mul_setLIntegral_cubeSet {d : ℕ} + (Q : TriadicCube d) (j : ℕ) {f : Vec d → ℝ≥0∞} + (hfQ : AEMeasurable f (MeasureTheory.volume.restrict (cubeSet Q))) + (hfS : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable f (MeasureTheory.volume.restrict (overlapCubeSet S))) : + ∑ S ∈ overlapCentersAtDepth Q j, + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume + ≤ (3 ^ d : ℝ≥0∞) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by + classical + let D := overlapCentersAtDepth Q j + have hleft : + ∑ S ∈ D, ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume = + ∫⁻ x, ∑ S ∈ D, (overlapCubeSet S).indicator f x + ∂MeasureTheory.volume := by + calc + ∑ S ∈ D, ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume + = ∑ S ∈ D, + ∫⁻ x, (overlapCubeSet S).indicator f x ∂MeasureTheory.volume := by + refine Finset.sum_congr rfl ?_ + intro S hS + rw [MeasureTheory.lintegral_indicator (measurableSet_overlapCubeSet S)] + _ = ∫⁻ x, ∑ S ∈ D, (overlapCubeSet S).indicator f x + ∂MeasureTheory.volume := by + symm + refine MeasureTheory.lintegral_finsetSum' D ?_ + intro S hS + exact (aemeasurable_indicator_iff (measurableSet_overlapCubeSet S)).2 + (hfS S (by simpa [D] using hS)) + have hright : + ∫⁻ x, (3 ^ d : ℝ≥0∞) * (cubeSet Q).indicator f x + ∂MeasureTheory.volume = + (3 ^ d : ℝ≥0∞) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by + have hindicator : + AEMeasurable ((cubeSet Q).indicator f) MeasureTheory.volume := + (aemeasurable_indicator_iff (measurableSet_cubeSet Q)).2 hfQ + rw [MeasureTheory.lintegral_const_mul'' _ hindicator] + rw [MeasureTheory.lintegral_indicator (measurableSet_cubeSet Q)] + rw [hleft, ← hright] + exact MeasureTheory.lintegral_mono + (overlapCentersAtDepth_sum_indicator_le_mul_cubeSet_indicator Q j f) + +/-- Normalized finite-overlap comparison. Averaging the normalized overlap +cube integrals over the retained centers costs only the pointwise overlap +multiplicity `3^d` relative to the normalized parent cube integral. -/ +theorem overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) {f : Vec d → ℝ≥0∞} + (hfQ : AEMeasurable f (MeasureTheory.volume.restrict (cubeSet Q))) + (hfS : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable f (MeasureTheory.volume.restrict (overlapCubeSet S))) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (∑ S ∈ overlapCentersAtDepth Q j, + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S)) + ≤ (3 ^ d : ℝ≥0∞) * + ∫⁻ x, f x ∂(normalizedCubeMeasure Q) := by + classical + let D := overlapCentersAtDepth Q j + calc + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (∑ S ∈ overlapCentersAtDepth Q j, + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S)) + = ∑ S ∈ D, + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S) := by + change + (((D.card : ℝ≥0∞)⁻¹) * + (∑ S ∈ D, + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S))) = + ∑ S ∈ D, + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S) + rw [Finset.mul_sum] + _ ≤ ∑ S ∈ D, + ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume := by + refine Finset.sum_le_sum ?_ + intro S hS + rw [lintegral_normalizedOverlapCubeMeasure_eq] + calc + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (ENNReal.ofReal ((overlapCubeVolume S)⁻¹) * + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume) + = + ((((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + ENNReal.ofReal ((overlapCubeVolume S)⁻¹)) * + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume := by + rw [mul_assoc] + _ ≤ ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume := by + exact mul_le_mul_left + (inv_card_mul_ofReal_inv_overlapCubeVolume_le_ofReal_inv_cubeVolume + hS) + (∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume) + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + (∑ S ∈ D, + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume) := by + rw [Finset.mul_sum] + _ ≤ ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ((3 ^ d : ℝ≥0∞) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume) := by + exact mul_le_mul_right + (overlapCentersAtDepth_sum_setLIntegral_le_mul_setLIntegral_cubeSet + Q j hfQ hfS) + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + _ = (3 ^ d : ℝ≥0∞) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume) := by + ac_rfl + _ = (3 ^ d : ℝ≥0∞) * + ∫⁻ x, f x ∂(normalizedCubeMeasure Q) := by + rw [lintegral_normalizedCubeMeasure_eq] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapFluctuation.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapFluctuation.lean new file mode 100644 index 0000000000..98e5fff12a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapFluctuation.lean @@ -0,0 +1,665 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapCenters + +/-! # Overlap Fluctuation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Average over the overlapping centers at a fixed depth. -/ +noncomputable def overlapCentersAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) : ℝ := + let D := overlapCentersAtDepth Q j + ((D.card : ℝ)⁻¹) * D.sum F + +theorem overlapCentersAverage_add {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F G : TriadicCube d → ℝ) : + overlapCentersAverage Q j (fun S => F S + G S) = + overlapCentersAverage Q j F + overlapCentersAverage Q j G := by + classical + let D := overlapCentersAtDepth Q j + change (↑D.card)⁻¹ * D.sum (fun S => F S + G S) = + (↑D.card)⁻¹ * D.sum F + (↑D.card)⁻¹ * D.sum G + rw [Finset.sum_add_distrib, left_distrib] + +theorem overlapCentersAverage_mul_left {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) (F : TriadicCube d → ℝ) : + overlapCentersAverage Q j (fun S => c * F S) = + c * overlapCentersAverage Q j F := by + classical + let D := overlapCentersAtDepth Q j + calc + overlapCentersAverage Q j (fun S => c * F S) + = ((D.card : ℝ)⁻¹) * D.sum (fun S => c * F S) := by + rfl + _ = ((D.card : ℝ)⁻¹) * (c * D.sum F) := by + rw [← Finset.mul_sum] + _ = c * overlapCentersAverage Q j F := by + unfold overlapCentersAverage + ring + +theorem overlapCentersAverage_le_overlapCentersAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) {F G : TriadicCube d → ℝ} + (hFG : ∀ S ∈ overlapCentersAtDepth Q j, F S ≤ G S) : + overlapCentersAverage Q j F ≤ overlapCentersAverage Q j G := by + classical + unfold overlapCentersAverage + exact mul_le_mul_of_nonneg_left + (Finset.sum_le_sum hFG) + (inv_nonneg.mpr (by positivity)) + +theorem overlapCentersAverage_const_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) + (hD : (overlapCentersAtDepth Q j).Nonempty) : + overlapCentersAverage Q j (fun _ => c) = c := by + classical + let D := overlapCentersAtDepth Q j + change ((D.card : ℝ)⁻¹) * D.sum (fun _ => c) = c + have hD' : D.Nonempty := by + simpa [D] using hD + have hcard : (((D.card : ℕ) : ℝ) ≠ 0) := by + exact_mod_cast (Finset.card_ne_zero.mpr hD') + rw [Finset.sum_const, nsmul_eq_mul] + rw [← mul_assoc, inv_mul_cancel₀ hcard, one_mul] + +theorem overlapCentersAverage_const {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + overlapCentersAverage Q j (fun _ => c) = c := + overlapCentersAverage_const_eq Q j c (overlapCentersAtDepth_nonempty Q j) + +theorem overlapCentersAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) + (hF : ∀ S ∈ overlapCentersAtDepth Q j, 0 ≤ F S) : + 0 ≤ overlapCentersAverage Q j F := by + unfold overlapCentersAverage + exact mul_nonneg (inv_nonneg.mpr (by positivity)) + (Finset.sum_nonneg hF) + +theorem overlapCentersAverage_L2_sum_le_sum_overlapCentersAverage_L2 + {d : ℕ} {ι : Type*} + (Q : TriadicCube d) (j : ℕ) (s : Finset ι) (A : TriadicCube d → ι → ℝ) + (hA : ∀ S ∈ overlapCentersAtDepth Q j, ∀ i ∈ s, 0 ≤ A S i) : + (overlapCentersAverage Q j (fun S => (∑ i ∈ s, A S i) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ∑ i ∈ s, (overlapCentersAverage Q j (fun S => (A S i) ^ 2)) ^ (1 / 2 : ℝ) := by + classical + induction s using Finset.induction_on with + | empty => + simp [overlapCentersAverage] + | @insert a s ha ih => + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + have hc : 0 ≤ c := by + dsimp [c] + exact inv_nonneg.mpr (by positivity) + have hsum_nonneg : ∀ S ∈ D, 0 ≤ ∑ i ∈ s, A S i := by + intro S hS + exact Finset.sum_nonneg fun i hi => + hA S (by simpa [D] using hS) i (Finset.mem_insert_of_mem hi) + have hsum_sq_nonneg : 0 ≤ ∑ S ∈ D, (∑ i ∈ s, A S i) ^ 2 := by + exact Finset.sum_nonneg fun S hS => sq_nonneg _ + have hsingle_sq_nonneg : 0 ≤ ∑ S ∈ D, (A S a) ^ 2 := by + exact Finset.sum_nonneg fun S hS => sq_nonneg _ + have hinsert_sq_nonneg : 0 ≤ ∑ S ∈ D, (∑ i ∈ insert a s, A S i) ^ 2 := by + exact Finset.sum_nonneg fun S hS => sq_nonneg _ + have hLp : + (∑ S ∈ D, (A S a + ∑ i ∈ s, A S i) ^ 2) ^ (1 / 2 : ℝ) ≤ + (∑ S ∈ D, (A S a) ^ 2) ^ (1 / 2 : ℝ) + + (∑ S ∈ D, (∑ i ∈ s, A S i) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + (Real.Lp_add_le_of_nonneg + (s := D) + (f := fun S => A S a) + (g := fun S => ∑ i ∈ s, A S i) + (p := (2 : ℝ)) + (by norm_num) + (fun S hS => hA S (by simpa [D] using hS) a (by simp [ha])) + hsum_nonneg) + calc + (overlapCentersAverage Q j (fun S => (∑ i ∈ insert a s, A S i) ^ 2)) ^ + (1 / 2 : ℝ) + = c ^ (1 / 2 : ℝ) * + (∑ S ∈ D, (A S a + ∑ i ∈ s, A S i) ^ 2) ^ (1 / 2 : ℝ) := by + have hmul : + (c * ∑ S ∈ D, (∑ i ∈ insert a s, A S i) ^ 2) ^ (1 / 2 : ℝ) = + c ^ (1 / 2 : ℝ) * + (∑ S ∈ D, (∑ i ∈ insert a s, A S i) ^ 2) ^ + (1 / 2 : ℝ) := + Real.mul_rpow hc hinsert_sq_nonneg + simpa [overlapCentersAverage, D, c, Finset.sum_insert, ha] using hmul + _ ≤ c ^ (1 / 2 : ℝ) * (∑ S ∈ D, (A S a) ^ 2) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ S ∈ D, (∑ i ∈ s, A S i) ^ 2) ^ (1 / 2 : ℝ) := by + have hc_rpow : 0 ≤ c ^ (1 / 2 : ℝ) := Real.rpow_nonneg hc _ + have hmul := mul_le_mul_of_nonneg_left hLp hc_rpow + simpa [mul_add] using hmul + _ = (overlapCentersAverage Q j (fun S => (A S a) ^ 2)) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * + (∑ S ∈ D, (∑ i ∈ s, A S i) ^ 2) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsingle_sq_nonneg] + simp [overlapCentersAverage, D, c] + _ = (overlapCentersAverage Q j (fun S => (A S a) ^ 2)) ^ (1 / 2 : ℝ) + + (overlapCentersAverage Q j (fun S => (∑ i ∈ s, A S i) ^ 2)) ^ + (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsum_sq_nonneg] + simp [overlapCentersAverage, D, c] + _ ≤ (overlapCentersAverage Q j (fun S => (A S a) ^ 2)) ^ (1 / 2 : ℝ) + + ∑ i ∈ s, + (overlapCentersAverage Q j (fun S => (A S i) ^ 2)) ^ (1 / 2 : ℝ) := by + exact add_le_add le_rfl + (ih (fun S hS i hi => hA S hS i (Finset.mem_insert_of_mem hi))) + _ = ∑ i ∈ insert a s, + (overlapCentersAverage Q j (fun S => (A S i) ^ 2)) ^ (1 / 2 : ℝ) := by + simp [Finset.sum_insert, ha] + +theorem overlapCentersAverage_lintegral_rpow_enorm_two_le {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [MeasurableSpace E] [BorelSpace E] + (Q : TriadicCube d) (j : ℕ) (R : Vec d → E) + (hR : MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hRloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCentersAverage Q j + (fun S => (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S).toReal) + ≤ (3 ^ d : ℝ) * + (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal := by + classical + let D := overlapCentersAtDepth Q j + let I : TriadicCube d → ℝ≥0∞ := + fun S => ∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S + let IQ : ℝ≥0∞ := ∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q + have hfQ : + AEMeasurable (fun x => ‖R x‖ₑ ^ (2 : ℝ)) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + have hnorm : + AEMeasurable (fun x => ‖R x‖ₑ ^ (2 : ℝ)) + (normalizedCubeMeasure Q) := + hR.1.aemeasurable.enorm.pow_const (2 : ℝ) + have hc : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + simpa [normalizedCubeMeasure, cubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := MeasureTheory.volume.restrict (cubeSet Q)) + (f := fun x => ‖R x‖ₑ ^ (2 : ℝ)) hc).1 hnorm + have hfS : + ∀ S ∈ overlapCentersAtDepth Q j, + AEMeasurable (fun x => ‖R x‖ₑ ^ (2 : ℝ)) + (MeasureTheory.volume.restrict (overlapCubeSet S)) := by + intro S hS + have hnorm : + AEMeasurable (fun x => ‖R x‖ₑ ^ (2 : ℝ)) + (normalizedOverlapCubeMeasure S) := + (hRloc S hS).1.aemeasurable.enorm.pow_const (2 : ℝ) + have hc : ENNReal.ofReal ((overlapCubeVolume S)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (overlapCubeVolume_pos S)) + simpa [normalizedOverlapCubeMeasure, overlapCubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := MeasureTheory.volume.restrict (overlapCubeSet S)) + (f := fun x => ‖R x‖ₑ ^ (2 : ℝ)) hc).1 hnorm + have hle_enn : + (((D.card : ℝ≥0∞)⁻¹) * (∑ S ∈ D, I S)) ≤ + (3 ^ d : ℝ≥0∞) * IQ := by + simpa [D, I, IQ] using + overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le + (Q := Q) (j := j) (f := fun x => ‖R x‖ₑ ^ (2 : ℝ)) hfQ hfS + have hIQ_lt_top : IQ < ∞ := by + simpa [IQ] using + (MeasureTheory.eLpNorm_lt_top_iff_lintegral_rpow_enorm_lt_top + (p := (2 : ℝ≥0∞)) (μ := normalizedCubeMeasure Q) (f := R) + (by norm_num) (by norm_num)).1 hR.2 + have hIQ_ne_top : IQ ≠ ∞ := ne_of_lt hIQ_lt_top + have hI_ne_top : ∀ S ∈ D, I S ≠ ∞ := by + intro S hS + have hSlt : I S < ∞ := by + simpa [I] using + (MeasureTheory.eLpNorm_lt_top_iff_lintegral_rpow_enorm_lt_top + (p := (2 : ℝ≥0∞)) (μ := normalizedOverlapCubeMeasure S) (f := R) + (by norm_num) (by norm_num)).1 (hRloc S (by simpa [D] using hS)).2 + exact ne_of_lt hSlt + have hright_ne_top : (3 ^ d : ℝ≥0∞) * IQ ≠ ∞ := by + exact ENNReal.mul_ne_top + (ENNReal.pow_ne_top (by norm_num : (3 : ℝ≥0∞) ≠ ∞)) hIQ_ne_top + have htoReal : + ((((D.card : ℝ≥0∞)⁻¹) * (∑ S ∈ D, I S)).toReal) ≤ + (((3 ^ d : ℝ≥0∞) * IQ).toReal) := + ENNReal.toReal_mono hright_ne_top hle_enn + have hleft_toReal : + ((((D.card : ℝ≥0∞)⁻¹) * (∑ S ∈ D, I S)).toReal) = + ((D.card : ℝ)⁻¹) * ∑ S ∈ D, (I S).toReal := by + rw [ENNReal.toReal_mul, ENNReal.toReal_inv, ENNReal.toReal_natCast, + ENNReal.toReal_sum hI_ne_top] + have hright_toReal : + (((3 ^ d : ℝ≥0∞) * IQ).toReal) = (3 ^ d : ℝ) * IQ.toReal := by + simp [ENNReal.toReal_mul] + rw [hleft_toReal, hright_toReal] at htoReal + simpa [overlapCentersAverage, D, I, IQ] using htoReal + +/-- Vector fluctuation around the overlapping-cube average. -/ +noncomputable def overlapCubeFluctuationVec {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) : Vec d → Vec d := + fun x => u x - overlapCubeAverageVec S u + +@[simp] theorem overlapCubeFluctuationVec_zero {d : ℕ} + (S : TriadicCube d) : + overlapCubeFluctuationVec S (0 : Vec d → Vec d) = 0 := by + have havg : overlapCubeAverageVec S (0 : Vec d → Vec d) = 0 := by + change overlapCubeAverageVec S (fun _ : Vec d => (0 : Vec d)) = 0 + simp + funext x + simp [overlapCubeFluctuationVec, havg] + +theorem overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (h : Vec d → Vec d) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S) + ≤ + (Fintype.card (Fin d) : ℝ≥0∞) * + ((((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let cardDim : ℝ≥0∞ := Fintype.card (Fin d) + let I : TriadicCube d → ℝ≥0∞ := + fun S => + ∫⁻ x, + ENNReal.ofReal (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S + let J : TriadicCube d → ℝ≥0∞ := + fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S + have hIJ : ∀ S ∈ D, I S ≤ cardDim * J S := by + intro S _hS + calc + I S + ≤ + ∫⁻ x, + cardDim * (‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ)) + ∂ normalizedOverlapCubeMeasure S := by + refine MeasureTheory.lintegral_mono ?_ + intro x + simpa [cardDim, overlapCubeFluctuationVec] using + ofReal_vecNormSq_le_card_mul_enorm_rpow_two + (h x - overlapCubeAverageVec S h) + _ ≤ cardDim * J S := by + rw [MeasureTheory.lintegral_const_mul' + (r := cardDim) + (f := fun x => + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ))] + simp [cardDim] + have hsum : D.sum I ≤ D.sum (fun S => cardDim * J S) := + Finset.sum_le_sum hIJ + calc + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S) + = + ((D.card : ℝ≥0∞)⁻¹) * D.sum I := by + rfl + _ ≤ ((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => cardDim * J S) := by + exact mul_le_mul_of_nonneg_left hsum (zero_le) + _ = ((D.card : ℝ≥0∞)⁻¹) * (cardDim * D.sum J) := by + congr 1 + rw [Finset.mul_sum] + _ = cardDim * (((D.card : ℝ≥0∞)⁻¹) * D.sum J) := by + ac_rfl + _ = + (Fintype.card (Fin d) : ℝ≥0∞) * + ((((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S h x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) := by + rfl + +theorem overlapCubeAverage_add_of_memLp_two {d : ℕ} + (S : TriadicCube d) {f g : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeAverage S (fun x => f x + g x) = + overlapCubeAverage S f + overlapCubeAverage S g := by + have hf_int : + MeasureTheory.Integrable f (normalizedOverlapCubeMeasure S) := + hf.integrable (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) + have hg_int : + MeasureTheory.Integrable g (normalizedOverlapCubeMeasure S) := + hg.integrable (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) + repeat rw [overlapCubeAverage_eq_integral_normalizedOverlapCubeMeasure] + rw [MeasureTheory.integral_add hf_int hg_int] + +theorem overlapCubeAverageVec_add_of_memLp_two {d : ℕ} + (S : TriadicCube d) {u v : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeAverageVec S (fun x => u x + v x) = + overlapCubeAverageVec S u + overlapCubeAverageVec S v := by + funext i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hvi : MeasureTheory.MemLp (fun x => v x i) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + show overlapCubeAverage S (fun x => (u x + v x) i) = + overlapCubeAverage S (fun x => u x i) + + overlapCubeAverage S (fun x => v x i) + have hfun : (fun x => (u x + v x) i) = + fun x => u x i + v x i := by + funext x + simp + rw [hfun] + exact overlapCubeAverage_add_of_memLp_two S hui hvi + +theorem memLp_overlapCubeFluctuationVec {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + MeasureTheory.MemLp (overlapCubeFluctuationVec S u) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => overlapCubeAverageVec S u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + MeasureTheory.memLp_const (overlapCubeAverageVec S u) + simpa [overlapCubeFluctuationVec] using! hu.sub hconst + +theorem overlapCubeFluctuationVec_add_of_memLp_two {d : ℕ} + (S : TriadicCube d) {u v : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeFluctuationVec S (fun x => u x + v x) = + fun x => overlapCubeFluctuationVec S u x + + overlapCubeFluctuationVec S v x := by + have havg : overlapCubeAverageVec S (fun x => u x + v x) = + overlapCubeAverageVec S u + overlapCubeAverageVec S v := + overlapCubeAverageVec_add_of_memLp_two S hu hv + funext x i + simp [overlapCubeFluctuationVec, havg] + ring + +theorem overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_two_mul_overlapCubeLpNorm_two + {d : ℕ} (S : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u) ≤ + 2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => -overlapCubeAverageVec S u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + MeasureTheory.memLp_const (-overlapCubeAverageVec S u) + have hadd : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u) ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) u + + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun _ : Vec d => -overlapCubeAverageVec S u) := by + have hfun : + overlapCubeFluctuationVec S u = + fun x => u x + (fun _ : Vec d => -overlapCubeAverageVec S u) x := by + funext x + simp [overlapCubeFluctuationVec, sub_eq_add_neg] + rw [hfun] + exact overlapCubeLpNorm_add_le S (2 : ℝ≥0∞) u + (fun _ : Vec d => -overlapCubeAverageVec S u) hu hconst (by norm_num) + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u) + ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) u + + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun _ : Vec d => -overlapCubeAverageVec S u) := hadd + _ = overlapCubeLpNorm S (2 : ℝ≥0∞) u + ‖overlapCubeAverageVec S u‖ := by + rw [overlapCubeLpNorm_const (S := S) (p := (2 : ℝ≥0∞)) + (c := -overlapCubeAverageVec S u) (by norm_num)] + simp + _ ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) u + + overlapCubeLpNorm S (2 : ℝ≥0∞) u := by + gcongr + exact norm_overlapCubeAverageVec_le_overlapCubeLpNorm_two S u hu + _ = 2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u := by ring + +theorem sq_overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_four_mul_of_forall_overlapCubeSet_vecNormSq_le + {d : ℕ} {S : TriadicCube d} {u : Vec d → Vec d} {B : ℝ} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hB : 0 ≤ B) + (hpoint : ∀ x ∈ overlapCubeSet S, vecNormSq (u x) ≤ B) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) ^ 2 ≤ + 4 * B := by + have hfluct : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u) ≤ + 2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u := + overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_two_mul_overlapCubeLpNorm_two + S u hu + have hnorm : + (overlapCubeLpNorm S (2 : ℝ≥0∞) u) ^ 2 ≤ B := + overlapCubeLpNorm_two_sq_le_of_forall_overlapCubeSet_vecNormSq_le + (S := S) (F := u) hB hpoint + have hsq : + (overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) ^ 2 ≤ + (2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u) ^ 2 := by + exact (sq_le_sq₀ + (overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) + (mul_nonneg (by norm_num) (overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) u))).mpr + hfluct + calc + (overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) ^ 2 + ≤ (2 * overlapCubeLpNorm S (2 : ℝ≥0∞) u) ^ 2 := hsq + _ = 4 * (overlapCubeLpNorm S (2 : ℝ≥0∞) u) ^ 2 := by ring + _ ≤ 4 * B := by + exact mul_le_mul_of_nonneg_left hnorm (by norm_num) + +/-- Depth-`j` overlapping positive `q = 2` square average. -/ +noncomputable def cubeBesovOverlappingPositiveVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : ℝ := + overlapCentersAverage Q j fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) ^ 2 + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage + exact overlapCentersAverage_nonneg Q j _ fun S _hS => sq_nonneg _ + +theorem toReal_overlapCentersAtDepth_average_lintegral_fluctuation_eq_depthAverage + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hfin : + ∀ S ∈ overlapCentersAtDepth Q j, + (∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞) : + ((((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)).toReal = + cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let I : TriadicCube d → ℝ≥0∞ := + fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S + have hleft_toReal : + ((((D.card : ℝ≥0∞)⁻¹) * D.sum I).toReal) = + ((D.card : ℝ)⁻¹) * D.sum (fun S => (I S).toReal) := by + rw [ENNReal.toReal_mul, ENNReal.toReal_inv, ENNReal.toReal_natCast, + ENNReal.toReal_sum] + intro S hS + exact hfin S (by simpa [D] using hS) + calc + ((((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹) * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)).toReal + = + ((D.card : ℝ)⁻¹) * D.sum (fun S => (I S).toReal) := by + simpa [D, I] using hleft_toReal + _ = cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage + unfold overlapCentersAverage + change ((D.card : ℝ)⁻¹) * D.sum (fun S => (I S).toReal) = + ((D.card : ℝ)⁻¹) * + D.sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u)) ^ 2) + congr 1 + refine Finset.sum_congr rfl ?_ + intro S _hS + exact (overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + (E := Vec d) S (overlapCubeFluctuationVec S u)).symm + +theorem lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top + {d : ℕ} (S : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + (∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) ≠ ∞ := by + have hfluct : + MeasureTheory.MemLp (overlapCubeFluctuationVec S u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S u hu + have hlt : + (∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S) < ∞ := by + simpa using + (MeasureTheory.eLpNorm_lt_top_iff_lintegral_rpow_enorm_lt_top + (p := (2 : ℝ≥0∞)) + (μ := normalizedOverlapCubeMeasure S) + (f := overlapCubeFluctuationVec S u) + (by norm_num) (by norm_num)).1 hfluct.2 + exact ne_of_lt hlt + +theorem overlapCentersAtDepth_average_lintegral_fluctuation_ne_top + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) ≠ ∞ := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let I : TriadicCube d → ℝ≥0∞ := + fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S + have hI : ∀ S ∈ D, I S ≠ ∞ := by + intro S hS + exact lintegral_overlapCubeFluctuationVec_rpow_enorm_two_ne_top S u + (hu S (by simpa [D] using hS)) + have hD_nonempty : D.Nonempty := by + simpa [D] using overlapCentersAtDepth_nonempty Q j + have hcoeff_ne_top : ((D.card : ℝ≥0∞)⁻¹) ≠ ∞ := by + have hcard_ne : D.card ≠ 0 := Finset.card_ne_zero.mpr hD_nonempty + simp [hcard_ne] + simpa [D, I] using + ENNReal.mul_ne_top + hcoeff_ne_top + (ENNReal.sum_ne_top.2 hI) + +theorem overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_ne_top + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (u x - overlapCubeAverageVec S u)) + ∂ normalizedOverlapCubeMeasure S)) ≠ ∞ := by + let A : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (u x - overlapCubeAverageVec S u)) + ∂ normalizedOverlapCubeMeasure S)) + let B : ℝ≥0∞ := + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ‖overlapCubeFluctuationVec S u x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S)) + have hle : A ≤ (Fintype.card (Fin d) : ℝ≥0∞) * B := by + simpa [A, B] using + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_le + Q j u + have hB_ne : B ≠ ∞ := by + simpa [B] using + overlapCentersAtDepth_average_lintegral_fluctuation_ne_top Q u j hu + have hright_ne : (Fintype.card (Fin d) : ℝ≥0∞) * B ≠ ∞ := + ENNReal.mul_ne_top (by simp) hB_ne + exact ne_top_of_le_ne_top hright_ne hle + +theorem residualEuclideanOverlapBound_ne_top_of_memLp_overlap + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j M : ℕ) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ((M : ℝ≥0∞) * (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (u x - overlapCubeAverageVec S u)) + ∂ normalizedOverlapCubeMeasure S))) ≠ ∞ := by + have havg : + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (u x - overlapCubeAverageVec S u)) + ∂ normalizedOverlapCubeMeasure S)) ≠ ∞ := + overlapCentersAtDepth_average_lintegral_ofReal_vecNormSq_fluctuation_ne_top + Q u j hu + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top (by simp : (M : ℝ≥0∞) ≠ ∞) + (by simp : (3 ^ d : ℝ≥0∞) ≠ ∞)) + havg + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapGeometry.lean new file mode 100644 index 0000000000..833afab9fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapGeometry.lean @@ -0,0 +1,654 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring + +/-! # Overlap Geometry -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Note-normalized full positive `q = 2` Besov norm for vector fields. -/ +noncomputable def cubeBesovPositiveVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovPositiveVectorSeminormTwo Q s F + +/-! +## Overlapping positive Besov norm + +The disjoint descendant norm above is useful elsewhere in Chapter 3, but it is +not the right endpoint for the classical `K(L²,H¹)` interpolation route: it +does not see jumps across the boundaries of the active triadic partition. The +corrected norm below tests oscillation on overlapping cubes. At depth `j`, the +centers lie on the grid one generation finer than the cube size. +-/ + +/-- Side length of the overlapping cube centered at the fine-grid cube `S`. +If `S` has scale `k - 1`, this overlapping cube has side length `3^k`. -/ +noncomputable def overlapCubeScaleFactor {d : ℕ} (S : TriadicCube d) : ℝ := + 3 * cubeScaleFactor S + +theorem overlapCubeScaleFactor_pos {d : ℕ} (S : TriadicCube d) : + 0 < overlapCubeScaleFactor S := by + unfold overlapCubeScaleFactor + exact mul_pos (by norm_num) + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale)) + +theorem overlapCubeScaleFactor_nonneg {d : ℕ} (S : TriadicCube d) : + 0 ≤ overlapCubeScaleFactor S := + (overlapCubeScaleFactor_pos S).le + +/-- The half-open overlapping cube centered at `cubeCenter S` with side length +`3 * cubeScaleFactor S`. -/ +def overlapCubeSet {d : ℕ} (S : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S ≤ x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S)) } + +/-- The open overlapping cube with the same center and side length as +`overlapCubeSet`. This is the analytic domain used by the local H¹ Poincare +estimate. -/ +def openOverlapCubeSet {d : ℕ} (S : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S)) } + +theorem measurableSet_coord_overlapHalfOpenStrip {d : ℕ} + (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a ≤ x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isClosed_le continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +theorem measurableSet_coord_overlapOpenStrip {d : ℕ} + (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a < x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +theorem measurableSet_overlapCubeSet {d : ℕ} (S : TriadicCube d) : + MeasurableSet (overlapCubeSet S) := by + classical + simpa [overlapCubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_overlapHalfOpenStrip i + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) + +theorem measurableSet_openOverlapCubeSet {d : ℕ} (S : TriadicCube d) : + MeasurableSet (openOverlapCubeSet S) := by + classical + simpa [openOverlapCubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_overlapOpenStrip i + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) + +theorem isOpen_openOverlapCubeSet {d : ℕ} (S : TriadicCube d) : + IsOpen (openOverlapCubeSet S) := by + classical + rw [openOverlapCubeSet] + have hEq : + {x : Vec d | + ∀ i : Fin d, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))} = + (⋂ i : Fin d, + {x : Vec d | + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))}) := by + ext x + simp + rw [hEq] + exact + (isOpen_iInter_of_finite fun i : Fin d => + (isOpen_lt + (show Continuous fun _x : Vec d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S) from continuous_const) + (continuous_apply i)).inter + (isOpen_lt (continuous_apply i) + (show Continuous fun _x : Vec d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S) from continuous_const))) + +theorem overlapCubeSet_eq_pi_Ico {d : ℕ} (S : TriadicCube d) : + overlapCubeSet S = + Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) := by + ext x + simp [overlapCubeSet] + +theorem openOverlapCubeSet_eq_pi_Ioo {d : ℕ} (S : TriadicCube d) : + openOverlapCubeSet S = + Set.pi Set.univ + (fun i : Fin d => + Set.Ioo + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) := by + ext x + simp [openOverlapCubeSet] + +theorem overlapCubeSet_ae_eq_openOverlapCubeSet {d : ℕ} (S : TriadicCube d) : + overlapCubeSet S =ᵐ[MeasureTheory.volume] openOverlapCubeSet S := by + rw [overlapCubeSet_eq_pi_Ico, openOverlapCubeSet_eq_pi_Ioo] + exact (MeasureTheory.Measure.univ_pi_Ico_ae_eq_Icc (f := fun i : Fin d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + (g := fun i : Fin d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))).trans + (MeasureTheory.Measure.univ_pi_Ioo_ae_eq_Icc (f := fun i : Fin d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + (g := fun i : Fin d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))).symm + +theorem volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet + {d : ℕ} (S : TriadicCube d) : + MeasureTheory.volume.restrict (overlapCubeSet S) = + MeasureTheory.volume.restrict (openOverlapCubeSet S) := + MeasureTheory.Measure.restrict_congr_set (overlapCubeSet_ae_eq_openOverlapCubeSet S) + +theorem integrableOn_overlapCubeSet_iff_integrableOn_openOverlapCubeSet + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {S : TriadicCube d} {f : Vec d → E} : + MeasureTheory.IntegrableOn f (overlapCubeSet S) MeasureTheory.volume ↔ + MeasureTheory.IntegrableOn f (openOverlapCubeSet S) MeasureTheory.volume := + MeasureTheory.integrableOn_congr_set_ae (overlapCubeSet_ae_eq_openOverlapCubeSet S) + +theorem setIntegral_overlapCubeSet_eq_setIntegral_openOverlapCubeSet + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {S : TriadicCube d} {f : Vec d → E} : + ∫ x in overlapCubeSet S, f x ∂MeasureTheory.volume = + ∫ x in openOverlapCubeSet S, f x ∂MeasureTheory.volume := + MeasureTheory.setIntegral_congr_set (overlapCubeSet_ae_eq_openOverlapCubeSet S) + +theorem openOverlapCubeSet_subset_overlapCubeSet {d : ℕ} (S : TriadicCube d) : + openOverlapCubeSet S ⊆ overlapCubeSet S := by + intro x hx i + exact ⟨le_of_lt (hx i).1, (hx i).2⟩ + +theorem interior_cubeSet_eq_openCubeSet {d : ℕ} (Q : TriadicCube d) : + interior (cubeSet Q) = openCubeSet Q := by + rw [cubeSet_eq_pi_Ico, openCubeSet_eq_pi_Ioo, + interior_pi_set Set.finite_univ] + simp [interior_Ico] + +theorem overlapCubeScaleFactor_eq_cubeScaleFactor_originCube_succ {d : ℕ} + (S : TriadicCube d) : + overlapCubeScaleFactor S = cubeScaleFactor (originCube d (S.scale + 1)) := by + unfold overlapCubeScaleFactor cubeScaleFactor originCube + rw [zpow_add₀] + · ring + · norm_num + +theorem openOverlapCubeSet_eq_translateSet_smul_originCube_zero {d : ℕ} + (S : TriadicCube d) : + openOverlapCubeSet S = + translateSet (cubeCenter S) + (overlapCubeScaleFactor S • openCubeSet (originCube d 0)) := by + ext x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx + rw [Set.mem_smul_set] + refine ⟨(overlapCubeScaleFactor S)⁻¹ • (x - cubeCenter S), ?_, ?_⟩ + · rw [mem_openCubeSet_originCube_iff] + intro i + rw [zpow_zero] + have hxi := hx i + have hs_pos : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have hos_pos : 0 < overlapCubeScaleFactor S := overlapCubeScaleFactor_pos S + have hcoeff : + (overlapCubeScaleFactor S)⁻¹ * ((3 / 2 : ℝ) * cubeScaleFactor S) = + (1 / 2 : ℝ) := by + unfold overlapCubeScaleFactor + field_simp [hs_pos.ne'] + constructor + · have hlo_sub : + (-(3 / 2 : ℝ)) * cubeScaleFactor S < x i - cubeCenter S i := by + simp [cubeCenter] + nlinarith [hxi.1] + have hmul := mul_lt_mul_of_pos_left hlo_sub (inv_pos.mpr hos_pos) + have hright : + (overlapCubeScaleFactor S)⁻¹ * (x i - cubeCenter S i) = + (overlapCubeScaleFactor S)⁻¹ * ((x - cubeCenter S) i) := by + simp + rw [hright] at hmul + have htarget : + (-(1 / 2 : ℝ)) < + (overlapCubeScaleFactor S)⁻¹ * ((x - cubeCenter S) i) := by + nlinarith [hcoeff, hmul] + simpa using htarget + · have hhi_sub : + x i - cubeCenter S i < (3 / 2 : ℝ) * cubeScaleFactor S := by + simp [cubeCenter] + nlinarith [hxi.2] + have hmul := mul_lt_mul_of_pos_left hhi_sub (inv_pos.mpr hos_pos) + have hleft : + (overlapCubeScaleFactor S)⁻¹ * (x i - cubeCenter S i) = + (overlapCubeScaleFactor S)⁻¹ * ((x - cubeCenter S) i) := by + simp + rw [hleft] at hmul + have htarget : + (overlapCubeScaleFactor S)⁻¹ * ((x - cubeCenter S) i) < + (1 / 2 : ℝ) := by + nlinarith [hcoeff, hmul] + simpa using htarget + · ext i + simp + field_simp [(overlapCubeScaleFactor_pos S).ne'] + · intro hx + rw [Set.mem_smul_set] at hx + rcases hx with ⟨y, hy, hxy⟩ + intro i + have hyi := (mem_openCubeSet_originCube_iff.mp hy) i + rw [zpow_zero] at hyi + have hos_pos : 0 < overlapCubeScaleFactor S := overlapCubeScaleFactor_pos S + have hcoord : overlapCubeScaleFactor S * y i = x i - cubeCenter S i := by + simpa [Pi.sub_apply] using congrFun hxy i + constructor + · have hmul := mul_lt_mul_of_pos_left hyi.1 hos_pos + dsimp [cubeCenter, overlapCubeScaleFactor] at hmul hcoord ⊢ + nlinarith [hmul, hcoord] + · have hmul := mul_lt_mul_of_pos_left hyi.2 hos_pos + dsimp [cubeCenter, overlapCubeScaleFactor] at hmul hcoord ⊢ + nlinarith [hmul, hcoord] + +/-- Scale-correct mean-zero H¹ coercive estimate on an open overlap cube, +obtained by dilating the unit centered cube estimate by the overlap side length +and translating to the overlap center. -/ +noncomputable def openOverlapCubeMeanZeroH1CoerciveEstimate {d : ℕ} + (S : TriadicCube d) : + H1CoerciveEstimate (openOverlapCubeSet S) := by + let a : ℝ := overlapCubeScaleFactor S + have ha : 0 < a := overlapCubeScaleFactor_pos S + let hCunit : H1CoerciveEstimate (openCubeSet (originCube d 0)) := + originCubeMeanZeroH1CoerciveEstimate d 0 + let hCdil : H1CoerciveEstimate (a • openCubeSet (originCube d 0)) := + hCunit.dilate ha + letI : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (a • openCubeSet (originCube d 0))) := by + have hscale : a = cubeScaleFactor (originCube d (S.scale + 1)) := by + simpa [a] using overlapCubeScaleFactor_eq_cubeScaleFactor_originCube_succ S + rw [hscale, ← openCubeSet_originCube_eq_smul_unit d (S.scale + 1)] + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet + (originCube d (S.scale + 1))).isFiniteMeasure_restrict_volume + refine + { fixedValue := a * hCunit.fixedValue + constant_nonneg := mul_nonneg ha.le hCunit.constant_nonneg + bound := ?_ } + rw [openOverlapCubeSet_eq_translateSet_smul_originCube_zero S] + exact (hCdil.translate (cubeCenter S)).bound + +@[simp] theorem openOverlapCubeMeanZeroH1CoerciveEstimate_constant {d : ℕ} + (S : TriadicCube d) : + (openOverlapCubeMeanZeroH1CoerciveEstimate S).fixedValue = + overlapCubeScaleFactor S * (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + rfl + +/-- The middle child of a triadic cube. It is the child whose center agrees +with the center of the parent. -/ +def middleChildCube {d : ℕ} (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i } + +theorem middleChildCube_mem_childCubes {d : ℕ} (Q : TriadicCube d) : + middleChildCube Q ∈ childCubes Q := by + simpa [middleChildCube] using middleChild_mem_childCubes Q + +theorem overlapCubeSet_middleChildCube_eq_cubeSet {d : ℕ} (Q : TriadicCube d) : + overlapCubeSet (middleChildCube Q) = cubeSet Q := by + ext x + constructor + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by + simp [middleChildCube] + have hlower : + (((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + (((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa [hlower] using hlo, by simpa [hupper] using hhi⟩ + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by + simp [middleChildCube] + have hlower : + (((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + (((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa [hlower] using hlo, by simpa [hupper] using hhi⟩ + +theorem overlapCubeSet_middleChildCube_subset_cubeSet {d : ℕ} + (Q : TriadicCube d) : + overlapCubeSet (middleChildCube Q) ⊆ cubeSet Q := by + rw [overlapCubeSet_middleChildCube_eq_cubeSet] + +/-- The iterated middle descendant at depth `n`. -/ +def middleDescendant {d : ℕ} (Q : TriadicCube d) : ℕ → TriadicCube d + | 0 => Q + | n + 1 => middleChildCube (middleDescendant Q n) + +theorem middleDescendant_mem_descendantsAtDepth {d : ℕ} + (Q : TriadicCube d) : + ∀ n : ℕ, middleDescendant Q n ∈ descendantsAtDepth Q n + | 0 => by + simp [middleDescendant] + | n + 1 => by + change middleChildCube (middleDescendant Q n) ∈ descendantsAtDepth Q (n + 1) + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr + ⟨middleDescendant Q n, + middleDescendant_mem_descendantsAtDepth Q n, + middleChildCube_mem_childCubes (middleDescendant Q n)⟩ + +theorem overlapCubeSet_middleDescendant_succ_subset_cubeSet {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + overlapCubeSet (middleDescendant Q (j + 1)) ⊆ cubeSet Q := by + change overlapCubeSet (middleChildCube (middleDescendant Q j)) ⊆ cubeSet Q + intro x hx + have hx_mid : x ∈ cubeSet (middleDescendant Q j) := + overlapCubeSet_middleChildCube_subset_cubeSet (middleDescendant Q j) hx + exact cubeSet_subset_of_mem_descendantsAtDepth + (middleDescendant_mem_descendantsAtDepth Q j) hx_mid + +theorem middleChildCube_injective {d : ℕ} : + Function.Injective (middleChildCube : TriadicCube d → TriadicCube d) := by + intro Q R hQR + cases Q with + | mk scaleQ indexQ => + cases R with + | mk scaleR indexR => + simp [middleChildCube] at hQR ⊢ + rcases hQR with ⟨hscale, hindex⟩ + constructor + · omega + · funext i + exact mul_right_cancel₀ (show (3 : ℤ) ≠ 0 by norm_num) + (by simpa [mul_comm] using congrFun hindex i) + +theorem cubeColor_index_add_three_le_of_lt {d : ℕ} + {R S : TriadicCube d} {i : Fin d} + (hcolor : cubeColor R = cubeColor S) (hlt : R.index i < S.index i) : + R.index i + 3 ≤ S.index i := by + have hmod : R.index i ≡ S.index i [ZMOD 3] := + (cubeColor_eq_iff_modEq.mp hcolor) i + rw [Int.modEq_iff_dvd] at hmod + rcases hmod with ⟨n, hn⟩ + omega + +theorem disjoint_overlapCubeSet_of_scale_eq_of_cubeColor_eq_of_ne {d : ℕ} + {R S : TriadicCube d} (hscale : R.scale = S.scale) + (hcolor : cubeColor R = cubeColor S) (hneq : R ≠ S) : + Disjoint (overlapCubeSet R) (overlapCubeSet S) := by + rw [Set.disjoint_left] + intro x hxR hxS + have hindex_ne : ∃ i, R.index i ≠ S.index i := by + by_contra h + push Not at h + apply hneq + cases R with + | mk scaleR indexR => + cases S with + | mk scaleS indexS => + simp at hscale h ⊢ + exact ⟨hscale, funext h⟩ + rcases hindex_ne with ⟨i, hi⟩ + have hfactor : cubeScaleFactor S = cubeScaleFactor R := by + simp [cubeScaleFactor, hscale] + have hfactor_nonneg : 0 ≤ cubeScaleFactor R := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) R.scale).le + have hxRi := hxR i + have hxSi := hxS i + rcases lt_or_gt_of_ne hi with hlt | hgt + · have hgap : R.index i + 3 ≤ S.index i := + cubeColor_index_add_three_le_of_lt hcolor hlt + have hgap_real : ((R.index i : ℝ) + 3 : ℝ) ≤ (S.index i : ℝ) := by + exact_mod_cast hgap + have hsep : + (((R.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor R) ≤ + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S) := by + rw [hfactor] + have hcoeff : + (R.index i : ℝ) + (3 / 2 : ℝ) ≤ + (S.index i : ℝ) - (3 / 2 : ℝ) := by + linarith + exact mul_le_mul_of_nonneg_right hcoeff hfactor_nonneg + exact not_lt_of_ge (le_trans hsep (by simpa [hfactor] using hxSi.1)) hxRi.2 + · have hgap : S.index i + 3 ≤ R.index i := + cubeColor_index_add_three_le_of_lt hcolor.symm hgt + have hgap_real : ((S.index i : ℝ) + 3 : ℝ) ≤ (R.index i : ℝ) := by + exact_mod_cast hgap + have hsep : + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S) ≤ + (((R.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor R) := by + rw [hfactor] + have hcoeff : + (S.index i : ℝ) + (3 / 2 : ℝ) ≤ + (R.index i : ℝ) - (3 / 2 : ℝ) := by + linarith + exact mul_le_mul_of_nonneg_right hcoeff hfactor_nonneg + exact not_lt_of_ge (le_trans hsep hxRi.1) (by simpa [hfactor] using hxSi.2) + +/-- Volume of an overlapping cube. -/ +noncomputable def overlapCubeVolume {d : ℕ} (S : TriadicCube d) : ℝ := + (overlapCubeScaleFactor S) ^ d + +theorem overlapCubeVolume_pos {d : ℕ} (S : TriadicCube d) : + 0 < overlapCubeVolume S := by + unfold overlapCubeVolume + exact pow_pos (overlapCubeScaleFactor_pos S) d + +theorem overlapCubeVolume_nonneg {d : ℕ} (S : TriadicCube d) : + 0 ≤ overlapCubeVolume S := + (overlapCubeVolume_pos S).le + +@[simp] theorem volume_overlapCubeSet_toReal {d : ℕ} (S : TriadicCube d) : + (MeasureTheory.volume (overlapCubeSet S)).toReal = overlapCubeVolume S := by + let a : Fin d → ℝ := + fun i => ((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S + let b : Fin d → ℝ := + fun i => ((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S + have hscale_pos : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith + rw [overlapCubeSet_eq_pi_Ico] + have hside : ∀ i : Fin d, b i - a i = overlapCubeScaleFactor S := by + intro i + dsimp [a, b, overlapCubeScaleFactor] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))))).toReal + = ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ico_toReal (ι := Fin d) hab + _ = overlapCubeVolume S := by + calc + ∏ i : Fin d, (b i - a i) = + ∏ _i : Fin d, overlapCubeScaleFactor S := by + refine Finset.prod_congr rfl ?_ + intro i hi + exact hside i + _ = overlapCubeVolume S := by + simp [overlapCubeVolume] + +@[simp] theorem volume_openOverlapCubeSet_toReal {d : ℕ} (S : TriadicCube d) : + (MeasureTheory.volume (openOverlapCubeSet S)).toReal = overlapCubeVolume S := by + have hmeasure : + MeasureTheory.volume (overlapCubeSet S) = + MeasureTheory.volume (openOverlapCubeSet S) := + MeasureTheory.measure_congr (overlapCubeSet_ae_eq_openOverlapCubeSet S) + rw [← hmeasure, volume_overlapCubeSet_toReal] + +theorem volume_overlapCubeSet_lt_top {d : ℕ} (S : TriadicCube d) : + MeasureTheory.volume (overlapCubeSet S) < ⊤ := by + refine lt_of_le_of_ne le_top ?_ + intro htop + have htoReal : (MeasureTheory.volume (overlapCubeSet S)).toReal = 0 := by + simp [htop] + rw [volume_overlapCubeSet_toReal] at htoReal + exact (overlapCubeVolume_pos S).ne' htoReal + +theorem volume_openOverlapCubeSet_lt_top {d : ℕ} (S : TriadicCube d) : + MeasureTheory.volume (openOverlapCubeSet S) < ⊤ := + lt_of_le_of_lt + (MeasureTheory.measure_mono (openOverlapCubeSet_subset_overlapCubeSet S)) + (volume_overlapCubeSet_lt_top S) + +instance openOverlapCubeSet.instIsFiniteMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openOverlapCubeSet S)) := by + let U : Set (Vec d) := openOverlapCubeSet S + let : Fact (MeasureTheory.volume U < ⊤) := + ⟨by simpa [U] using volume_openOverlapCubeSet_lt_top S⟩ + infer_instance + +theorem openOverlapCubeMeanZero_valueL2Norm_le {d : ℕ} + (S : TriadicCube d) (u : H1Function (openOverlapCubeSet S)) : + (u.toMeanZero).valueL2Norm ≤ + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ‖u.gradToVectorL2‖ := by + simpa using (openOverlapCubeMeanZeroH1CoerciveEstimate S).bound_subAverage u + +/-- Unnormalized measure on an overlapping cube. -/ +noncomputable def overlapCubeMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.Measure (Vec d) := + volume.restrict (overlapCubeSet S) + +/-- Normalized measure on an overlapping cube. -/ +noncomputable def normalizedOverlapCubeMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.Measure (Vec d) := + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) • overlapCubeMeasure S + +theorem lintegral_normalizedCubeMeasure_eq {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ≥0∞) : + ∫⁻ x, f x ∂(normalizedCubeMeasure Q) = + ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by + rw [normalizedCubeMeasure, cubeMeasure] + rw [MeasureTheory.lintegral_smul_measure] + rfl + +theorem ae_openCubeSet_normalizedCubeMeasure {d : ℕ} (Q : TriadicCube d) : + ∀ᵐ x ∂ normalizedCubeMeasure Q, x ∈ openCubeSet Q := by + have hcube : ∀ᵐ x ∂ cubeMeasure Q, x ∈ openCubeSet Q := by + rw [cubeMeasure, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + exact MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q) + simpa [normalizedCubeMeasure] using + MeasureTheory.Measure.ae_smul_measure hcube + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +theorem lintegral_normalizedOverlapCubeMeasure_eq {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ≥0∞) : + ∫⁻ x, f x ∂(normalizedOverlapCubeMeasure S) = + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) * + ∫⁻ x in overlapCubeSet S, f x ∂MeasureTheory.volume := by + rw [normalizedOverlapCubeMeasure, overlapCubeMeasure] + rw [MeasureTheory.lintegral_smul_measure] + rfl + +@[simp] theorem overlapCubeMeasure_apply_univ {d : ℕ} (S : TriadicCube d) : + overlapCubeMeasure S Set.univ = MeasureTheory.volume (overlapCubeSet S) := by + rw [overlapCubeMeasure, MeasureTheory.Measure.restrict_apply_univ] + +@[simp] theorem overlapCubeMeasure_apply_univ_toReal {d : ℕ} (S : TriadicCube d) : + (overlapCubeMeasure S Set.univ).toReal = overlapCubeVolume S := by + simp [overlapCubeMeasure] + +theorem overlapCubeMeasure_apply_univ_ne_top {d : ℕ} (S : TriadicCube d) : + overlapCubeMeasure S Set.univ ≠ ∞ := by + intro htop + have hzero : (overlapCubeMeasure S Set.univ).toReal = 0 := by + simp [htop] + have hvol : (overlapCubeMeasure S Set.univ).toReal = overlapCubeVolume S := + overlapCubeMeasure_apply_univ_toReal S + have : overlapCubeVolume S = 0 := by + simpa [hvol] using hzero + exact (overlapCubeVolume_pos S).ne' this + +@[simp] theorem overlapCubeMeasure_apply_univ_eq {d : ℕ} (S : TriadicCube d) : + overlapCubeMeasure S Set.univ = ENNReal.ofReal (overlapCubeVolume S) := by + exact (ENNReal.toReal_eq_toReal_iff' (overlapCubeMeasure_apply_univ_ne_top S) + ENNReal.ofReal_ne_top).1 (by + rw [overlapCubeMeasure_apply_univ_toReal S, + ENNReal.toReal_ofReal (overlapCubeVolume_nonneg S)]) + +@[simp] theorem normalizedOverlapCubeMeasure_apply_univ {d : ℕ} (S : TriadicCube d) : + normalizedOverlapCubeMeasure S Set.univ = 1 := by + rw [normalizedOverlapCubeMeasure, MeasureTheory.Measure.smul_apply, + overlapCubeMeasure_apply_univ_eq S] + rw [ENNReal.ofReal_inv_of_pos (overlapCubeVolume_pos S)] + have hvol : ENNReal.ofReal (overlapCubeVolume S) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (overlapCubeVolume_pos S) + exact ENNReal.inv_mul_cancel hvol ENNReal.ofReal_ne_top + +instance normalizedOverlapCubeMeasure.instIsFiniteMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (normalizedOverlapCubeMeasure S) where + measure_univ_lt_top := by + simp [normalizedOverlapCubeMeasure_apply_univ S] + +theorem normalizedOverlapCubeMeasure_ne_zero {d : ℕ} (S : TriadicCube d) : + normalizedOverlapCubeMeasure S ≠ 0 := by + intro hzero + have huniv : normalizedOverlapCubeMeasure S Set.univ = 0 := by + simp [hzero] + simp at huniv + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapLp.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapLp.lean new file mode 100644 index 0000000000..e0c58447d8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapLp.lean @@ -0,0 +1,913 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapGeometry + +/-! # Overlap Lp -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Average of a scalar field on an overlapping cube. -/ +noncomputable def overlapCubeAverage {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : ℝ := + (overlapCubeVolume S)⁻¹ * + ∫ x in overlapCubeSet S, f x ∂volume + +theorem overlapCubeAverage_eq_integralAverage_openOverlapCubeSet {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : + overlapCubeAverage S f = integralAverage (openOverlapCubeSet S) f := by + unfold overlapCubeAverage integralAverage + rw [setIntegral_overlapCubeSet_eq_setIntegral_openOverlapCubeSet, + volume_openOverlapCubeSet_toReal] + +namespace H1Function + +@[simp] theorem toMeanZero_openOverlapCubeSet_apply {d : ℕ} + (S : TriadicCube d) (u : H1Function (openOverlapCubeSet S)) (x : Vec d) : + u.toMeanZero x = u x - overlapCubeAverage S (fun y => u y) := by + have havg : + integralAverage (openOverlapCubeSet S) (fun y => u y) = + overlapCubeAverage S (fun y => u y) := + (overlapCubeAverage_eq_integralAverage_openOverlapCubeSet S (fun y => u y)).symm + simp [havg] + +@[simp] theorem toMeanZero_openOverlapCubeSet_grad {d : ℕ} + (S : TriadicCube d) (u : H1Function (openOverlapCubeSet S)) (x : Vec d) : + u.toMeanZero.toH1Function.grad x = u.grad x := by + simp + +end H1Function + +/-- Coordinatewise average of a vector field on an overlapping cube. -/ +noncomputable def overlapCubeAverageVec {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) : Vec d := + fun i => overlapCubeAverage S fun x => u x i + +/-- Normalized `Lᵖ` norm on an overlapping cube. -/ +noncomputable def overlapCubeLpNorm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → E) : ℝ := + (MeasureTheory.eLpNorm u p (normalizedOverlapCubeMeasure S)).toReal + +theorem overlapCubeAverage_eq_integral_normalizedOverlapCubeMeasure {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : + overlapCubeAverage S f = ∫ x, f x ∂ normalizedOverlapCubeMeasure S := by + rw [overlapCubeAverage, normalizedOverlapCubeMeasure, overlapCubeMeasure, + MeasureTheory.integral_smul_measure] + simp [smul_eq_mul, ENNReal.toReal_ofReal, inv_nonneg, overlapCubeVolume_nonneg] + +theorem overlapCubeAverage_congr_on_overlapCubeSet {d : ℕ} + {S : TriadicCube d} {u v : Vec d → ℝ} + (h : ∀ x ∈ overlapCubeSet S, u x = v x) : + overlapCubeAverage S u = overlapCubeAverage S v := by + unfold overlapCubeAverage + refine congrArg (fun t : ℝ => (overlapCubeVolume S)⁻¹ * t) ?_ + apply MeasureTheory.integral_congr_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_overlapCubeSet S)).2 <| + Filter.Eventually.of_forall h + +theorem overlapCubeAverageVec_congr_on_overlapCubeSet {d : ℕ} + {S : TriadicCube d} {u v : Vec d → Vec d} + (h : ∀ x ∈ overlapCubeSet S, u x = v x) : + overlapCubeAverageVec S u = overlapCubeAverageVec S v := by + funext i + exact overlapCubeAverage_congr_on_overlapCubeSet + (S := S) (u := fun x => u x i) (v := fun x => v x i) + (fun x hx => by simpa using congrFun (h x hx) i) + +theorem overlapCubeLpNorm_congr_on_overlapCubeSet_generic {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (p : ℝ≥0∞) + {u v : Vec d → E} (h : ∀ x ∈ overlapCubeSet S, u x = v x) : + overlapCubeLpNorm S p u = overlapCubeLpNorm S p v := by + unfold overlapCubeLpNorm + rw [MeasureTheory.eLpNorm_congr_ae] + rw [normalizedOverlapCubeMeasure, overlapCubeMeasure, Filter.EventuallyEq] + exact MeasureTheory.Measure.ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_overlapCubeSet S)).2 <| + Filter.Eventually.of_forall h) + (ENNReal.ofReal ((overlapCubeVolume S)⁻¹)) + +@[simp] theorem overlapCubeAverage_const {d : ℕ} + (S : TriadicCube d) (c : ℝ) : + overlapCubeAverage S (fun _ : Vec d => c) = c := by + rw [overlapCubeAverage_eq_integral_normalizedOverlapCubeMeasure, + MeasureTheory.integral_const] + simp [MeasureTheory.Measure.real, normalizedOverlapCubeMeasure_apply_univ] + +@[simp] theorem overlapCubeAverageVec_const {d : ℕ} + (S : TriadicCube d) (c : Vec d) : + overlapCubeAverageVec S (fun _ : Vec d => c) = c := by + funext i + simp [overlapCubeAverageVec] + +theorem overlapCubeLpNorm_nonneg {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) : + 0 ≤ overlapCubeLpNorm S p f := + ENNReal.toReal_nonneg + +theorem overlapCubeLpNorm_const {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (c : E) (hp : p ≠ 0) : + overlapCubeLpNorm S p (fun _ => c) = ‖c‖ := by + unfold overlapCubeLpNorm + rw [MeasureTheory.eLpNorm_const c hp (normalizedOverlapCubeMeasure_ne_zero S), + normalizedOverlapCubeMeasure_apply_univ] + simp + +theorem overlapCubeLpNorm_one_eq_integral_norm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S 1 f = ∫ x, ‖f x‖ ∂ normalizedOverlapCubeMeasure S := by + unfold overlapCubeLpNorm + rw [MeasureTheory.eLpNorm_one_eq_lintegral_enorm, + ← MeasureTheory.integral_norm_eq_lintegral_enorm hf] + +theorem overlapCubeLpNorm_mul_le_mul_overlapCubeLpNorm_of_holderConjugate {d : ℕ} + (S : TriadicCube d) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + [ENNReal.HolderConjugate p q] + (hf : MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g q (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S 1 (fun x => f x * g x) ≤ + overlapCubeLpNorm S p f * overlapCubeLpNorm S q g := by + have hmul : + MeasureTheory.eLpNorm (fun x => f x * g x) 1 (normalizedOverlapCubeMeasure S) ≤ + 1 * MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) * + MeasureTheory.eLpNorm g q (normalizedOverlapCubeMeasure S) := by + simpa using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + hf.1 hg.1 (fun a b => a * b) 1 + (Filter.Eventually.of_forall fun x => by + simp)) + have hf_top : + MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) ≠ ∞ := ne_of_lt hf.2 + have hg_top : + MeasureTheory.eLpNorm g q (normalizedOverlapCubeMeasure S) ≠ ∞ := ne_of_lt hg.2 + have hmul_top : + 1 * MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) * + MeasureTheory.eLpNorm g q (normalizedOverlapCubeMeasure S) ≠ ∞ := by + exact ENNReal.mul_ne_top (ENNReal.mul_ne_top ENNReal.one_ne_top hf_top) hg_top + have htoReal : + (MeasureTheory.eLpNorm (fun x => f x * g x) 1 + (normalizedOverlapCubeMeasure S)).toReal ≤ + (1 * MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) * + MeasureTheory.eLpNorm g q (normalizedOverlapCubeMeasure S)).toReal := + ENNReal.toReal_mono hmul_top hmul + simpa [overlapCubeLpNorm, hf_top, hg_top, mul_assoc] using htoReal + +theorem abs_overlapCubeAverage_mul_le_mul_overlapCubeLpNorm_of_holderConjugate {d : ℕ} + (S : TriadicCube d) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + [ENNReal.HolderConjugate p q] + (hf : MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g q (normalizedOverlapCubeMeasure S)) : + |overlapCubeAverage S (fun x => f x * g x)| ≤ + overlapCubeLpNorm S p f * overlapCubeLpNorm S q g := by + have hfg_meas : MeasureTheory.AEStronglyMeasurable + (fun x => f x * g x) (normalizedOverlapCubeMeasure S) := + hf.1.mul hg.1 + calc + |overlapCubeAverage S (fun x => f x * g x)| + = |∫ x, f x * g x ∂ normalizedOverlapCubeMeasure S| := by + rw [overlapCubeAverage_eq_integral_normalizedOverlapCubeMeasure] + _ ≤ ∫ x, |f x * g x| ∂ normalizedOverlapCubeMeasure S := + MeasureTheory.abs_integral_le_integral_abs + _ = overlapCubeLpNorm S 1 (fun x => f x * g x) := by + symm + simpa using overlapCubeLpNorm_one_eq_integral_norm + S (fun x => f x * g x) hfg_meas + _ ≤ overlapCubeLpNorm S p f * overlapCubeLpNorm S q g := + overlapCubeLpNorm_mul_le_mul_overlapCubeLpNorm_of_holderConjugate + S p q f g hf hg + +theorem abs_overlapCubeAverage_mul_le_mul_overlapCubeLpNorm_conjExponent {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g (ENNReal.conjExponent p) + (normalizedOverlapCubeMeasure S)) + (hp : 1 ≤ p) : + |overlapCubeAverage S (fun x => f x * g x)| ≤ + overlapCubeLpNorm S p f * overlapCubeLpNorm S (ENNReal.conjExponent p) g := by + let : ENNReal.HolderConjugate p (ENNReal.conjExponent p) := + ENNReal.HolderConjugate.conjExponent hp + simpa using + abs_overlapCubeAverage_mul_le_mul_overlapCubeLpNorm_of_holderConjugate + S p (ENNReal.conjExponent p) f g hf hg + +theorem overlapCubeLpNorm_component_le_overlapCubeLpNorm {d : ℕ} + (S : TriadicCube d) (p : ℝ≥0∞) (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u p (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S p (fun x => u x i) ≤ overlapCubeLpNorm S p u := by + have hui : MeasureTheory.MemLp (fun x => u x i) p + (normalizedOverlapCubeMeasure S) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hpoint : + ∀ᵐ x ∂ normalizedOverlapCubeMeasure S, ‖u x i‖ ≤ (1 : ℝ) * ‖u x‖ := by + exact Filter.Eventually.of_forall fun x => by + simpa using (norm_le_pi_norm (u x) i) + have hle : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedOverlapCubeMeasure S) ≤ + ENNReal.ofReal (1 : ℝ) * + MeasureTheory.eLpNorm u p (normalizedOverlapCubeMeasure S) := + MeasureTheory.eLpNorm_le_mul_eLpNorm_of_ae_le_mul hpoint p + have htop_u : + MeasureTheory.eLpNorm u p (normalizedOverlapCubeMeasure S) ≠ ∞ := ne_of_lt hu.2 + have htop_ui : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedOverlapCubeMeasure S) ≠ ∞ := + ne_of_lt hui.2 + have htoReal : + (MeasureTheory.eLpNorm (fun x => u x i) p + (normalizedOverlapCubeMeasure S)).toReal ≤ + (MeasureTheory.eLpNorm u p (normalizedOverlapCubeMeasure S)).toReal := by + have hle' : + MeasureTheory.eLpNorm (fun x => u x i) p (normalizedOverlapCubeMeasure S) ≤ + MeasureTheory.eLpNorm u p (normalizedOverlapCubeMeasure S) := by + simpa using hle + exact ENNReal.toReal_mono htop_u hle' + simpa [overlapCubeLpNorm] using htoReal + +theorem norm_overlapCubeAverageVec_le_overlapCubeLpNorm_two {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + ‖overlapCubeAverageVec S u‖ ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) u := by + have hconj_two : ENNReal.conjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + refine (pi_norm_le_iff_of_nonneg + (overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) u)).2 ?_ + intro i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hconst : MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (ENNReal.conjExponent (2 : ℝ≥0∞)) (normalizedOverlapCubeMeasure S) := by + simpa [hconj_two] using + (MeasureTheory.memLp_const (1 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (1 : ℝ)) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + have havg : + ‖overlapCubeAverage S (fun x => u x i)‖ ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (fun x => u x i) * + overlapCubeLpNorm S (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) := by + simpa [hconj_two] using + abs_overlapCubeAverage_mul_le_mul_overlapCubeLpNorm_conjExponent + (S := S) (p := (2 : ℝ≥0∞)) (f := fun x => u x i) (g := fun _ => (1 : ℝ)) + hui hconst (by norm_num) + have hnorm_one : overlapCubeLpNorm S (2 : ℝ≥0∞) (fun _ => (1 : ℝ)) = 1 := by + simpa using + overlapCubeLpNorm_const (S := S) (p := (2 : ℝ≥0∞)) (c := (1 : ℝ)) + (by norm_num) + have havg' : + ‖overlapCubeAverage S (fun x => u x i)‖ ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (fun x => u x i) := by + simpa [hnorm_one] using havg + calc + ‖overlapCubeAverageVec S u i‖ = + ‖overlapCubeAverage S (fun x => u x i)‖ := by + simp [overlapCubeAverageVec] + _ ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) (fun x => u x i) := havg' + _ ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) u := + overlapCubeLpNorm_component_le_overlapCubeLpNorm S (2 : ℝ≥0∞) u i hu + +theorem overlapCubeLpNorm_add_le {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → E) + (hf : MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S)) + (hg : MeasureTheory.MemLp g p (normalizedOverlapCubeMeasure S)) + (hp : 1 ≤ p) : + overlapCubeLpNorm S p (fun x => f x + g x) ≤ + overlapCubeLpNorm S p f + overlapCubeLpNorm S p g := by + have hsum : + MeasureTheory.eLpNorm (fun x => f x + g x) p (normalizedOverlapCubeMeasure S) ≤ + MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) + + MeasureTheory.eLpNorm g p (normalizedOverlapCubeMeasure S) := by + simpa using! MeasureTheory.eLpNorm_add_le hf.1 hg.1 hp + have hsum_top : + MeasureTheory.eLpNorm f p (normalizedOverlapCubeMeasure S) + + MeasureTheory.eLpNorm g p (normalizedOverlapCubeMeasure S) ≠ ∞ := + ENNReal.add_ne_top.2 ⟨ne_of_lt hf.2, ne_of_lt hg.2⟩ + have htoReal := + ENNReal.toReal_mono hsum_top hsum + rw [ENNReal.toReal_add (ne_of_lt hf.2) (ne_of_lt hg.2)] at htoReal + simpa [overlapCubeLpNorm, ne_of_lt hf.2, ne_of_lt hg.2] using htoReal + +theorem overlapCubeLpNorm_two_vec_le_sum_components {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) u ≤ + ∑ i : Fin d, overlapCubeLpNorm S (2 : ℝ≥0∞) (fun x => u x i) := by + let μ : MeasureTheory.Measure (Vec d) := normalizedOverlapCubeMeasure S + let D : Vec d → ℝ := fun x => ∑ i : Fin d, ‖u x i‖ + have hcoord_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) μ := by + intro i + simpa [μ] using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hcoord_norm_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := by + intro i + simpa using (hcoord_mem i).norm + have hD_mem : MeasureTheory.MemLp D (2 : ℝ≥0∞) μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => ‖u x i‖) + (fun i _hi => hcoord_norm_mem i) + simpa [D] using hsum + have hvec_le : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ ≤ + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ := by + have hpoint : + ∀ᵐ x ∂μ, ‖u x‖ ≤ (1 : ℝ) * ‖D x‖ := by + exact Filter.Eventually.of_forall fun x => by + have hD_nonneg : 0 ≤ D x := + Finset.sum_nonneg fun i _hi => norm_nonneg _ + have hu_le_D : ‖u x‖ ≤ D x := by + refine (pi_norm_le_iff_of_nonneg hD_nonneg).2 ?_ + intro i + exact Finset.single_le_sum + (fun j _hj => norm_nonneg (u x j)) (Finset.mem_univ i) + simpa [Real.norm_eq_abs, abs_of_nonneg hD_nonneg] using hu_le_D + simpa using + (MeasureTheory.eLpNorm_le_mul_eLpNorm_of_ae_le_mul hpoint + (2 : ℝ≥0∞)) + have hsum_eLp : + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := by + have hD : + D = ∑ i : Fin d, (fun x : Vec d => ‖u x i‖) := by + funext x + simp [D] + rw [hD] + exact + MeasureTheory.eLpNorm_sum_le + (μ := μ) (p := (2 : ℝ≥0∞)) (s := Finset.univ) + (f := fun i : Fin d => fun x : Vec d => ‖u x i‖) + (fun i _hi => (hcoord_norm_mem i).1) + (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) + have hmain : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ := + hvec_le.trans hsum_eLp + have hsum_ne_top : + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ) ≠ ∞ := + ENNReal.sum_ne_top.2 fun i _hi => (hcoord_norm_mem i).2.ne + have htoReal : + (MeasureTheory.eLpNorm u (2 : ℝ≥0∞) μ).toReal ≤ + (∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ).toReal := + ENNReal.toReal_mono hsum_ne_top hmain + rw [ENNReal.toReal_sum (fun i _hi => (hcoord_norm_mem i).2.ne)] at htoReal + have hsum_toReal_norm : + (∑ i : Fin d, + (MeasureTheory.eLpNorm (fun x => ‖u x i‖) (2 : ℝ≥0∞) μ).toReal) = + ∑ i : Fin d, + (MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) μ).toReal := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [MeasureTheory.eLpNorm_norm] + rw [hsum_toReal_norm] at htoReal + simpa [overlapCubeLpNorm, μ] using htoReal + +theorem cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (f : Vec d → E) : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal := by + unfold cubeLpNorm + calc + ((MeasureTheory.eLpNorm f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)).toReal) ^ 2 + = + ((MeasureTheory.eLpNorm f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) ^ + (2 : ℝ)).toReal := by + rw [← ENNReal.toReal_rpow] + norm_num + _ = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num)] + let A : ℝ≥0∞ := ∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q + change ((A ^ (1 / (2 : ℝ))) ^ (2 : ℝ)).toReal = A.toReal + rw [← ENNReal.rpow_mul] + norm_num + +theorem cubeLpNorm_two_sq_eq_lintegral_ofReal_sq_toReal {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ 2 = + (∫⁻ x, ENNReal.ofReal ((f x) ^ 2) ∂ normalizedCubeMeasure Q).toReal := by + rw [cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal] + congr 1 + apply MeasureTheory.lintegral_congr + intro x + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg (f x)) (by norm_num)] + rw [Real.rpow_two] + simp [Real.norm_eq_abs, sq_abs] + +theorem cubeLpNorm_two_sq_le_lintegral_ofReal_vecNormSq_toReal_of_le + {d : ℕ} {Q : TriadicCube d} {F : Vec d → Vec d} {B : ℝ≥0∞} + (hB_ne_top : B ≠ ∞) + (hbound : + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedCubeMeasure Q ≤ B) : + (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ 2 ≤ B.toReal := by + have hnorm : + ∫⁻ x, ‖F x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q ≤ + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedCubeMeasure Q := + MeasureTheory.lintegral_mono fun x => + enorm_rpow_two_le_ofReal_vecNormSq (F x) + have hle : ∫⁻ x, ‖F x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q ≤ B := + hnorm.trans hbound + have htoReal := ENNReal.toReal_mono hB_ne_top hle + simpa [cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + (Q := Q) (f := F)] using htoReal + +theorem overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (f : Vec d → E) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) f) ^ 2 = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S).toReal := by + unfold overlapCubeLpNorm + calc + ((MeasureTheory.eLpNorm f (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)).toReal) ^ 2 + = + ((MeasureTheory.eLpNorm f (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) ^ (2 : ℝ)).toReal := by + rw [← ENNReal.toReal_rpow] + norm_num + _ = + (∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S).toReal := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num)] + let A : ℝ≥0∞ := ∫⁻ x, ‖f x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S + change ((A ^ (1 / (2 : ℝ))) ^ (2 : ℝ)).toReal = A.toReal + rw [← ENNReal.rpow_mul] + norm_num + +theorem overlapCubeLpNorm_two_sq_le_lintegral_ofReal_vecNormSq_toReal_of_le + {d : ℕ} {S : TriadicCube d} {F : Vec d → Vec d} {B : ℝ≥0∞} + (hB_ne_top : B ≠ ∞) + (hbound : + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedOverlapCubeMeasure S ≤ B) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) F) ^ 2 ≤ B.toReal := by + have hnorm : + ∫⁻ x, ‖F x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S ≤ + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedOverlapCubeMeasure S := + MeasureTheory.lintegral_mono fun x => + enorm_rpow_two_le_ofReal_vecNormSq (F x) + have hle : ∫⁻ x, ‖F x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S ≤ B := + hnorm.trans hbound + have htoReal := ENNReal.toReal_mono hB_ne_top hle + simpa [overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + (S := S) (f := F)] using htoReal + +theorem ae_mem_overlapCubeSet_normalizedOverlapCubeMeasure {d : ℕ} + (S : TriadicCube d) : + ∀ᵐ x ∂ normalizedOverlapCubeMeasure S, x ∈ overlapCubeSet S := by + have h : + ∀ᵐ x ∂ overlapCubeMeasure S, x ∈ overlapCubeSet S := by + rw [overlapCubeMeasure] + exact MeasureTheory.ae_restrict_mem (measurableSet_overlapCubeSet S) + simpa [normalizedOverlapCubeMeasure] using + MeasureTheory.Measure.ae_smul_measure h + (ENNReal.ofReal ((overlapCubeVolume S)⁻¹)) + +theorem lintegral_ofReal_vecNormSq_le_of_forall_overlapCubeSet + {d : ℕ} {S : TriadicCube d} {F : Vec d → Vec d} {B : ℝ} + (hpoint : ∀ x ∈ overlapCubeSet S, vecNormSq (F x) ≤ B) : + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedOverlapCubeMeasure S ≤ + ENNReal.ofReal B := by + have hmono : + ∀ᵐ x ∂ normalizedOverlapCubeMeasure S, + ENNReal.ofReal (vecNormSq (F x)) ≤ ENNReal.ofReal B := + (ae_mem_overlapCubeSet_normalizedOverlapCubeMeasure S).mono + fun x hx => ENNReal.ofReal_le_ofReal (hpoint x hx) + calc + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedOverlapCubeMeasure S + ≤ ∫⁻ _x, ENNReal.ofReal B ∂ normalizedOverlapCubeMeasure S := + MeasureTheory.lintegral_mono_ae hmono + _ = ENNReal.ofReal B := by + simp [MeasureTheory.lintegral_const] + +theorem overlapCubeLpNorm_two_sq_le_of_forall_overlapCubeSet_vecNormSq_le + {d : ℕ} {S : TriadicCube d} {F : Vec d → Vec d} {B : ℝ} + (hB : 0 ≤ B) + (hpoint : ∀ x ∈ overlapCubeSet S, vecNormSq (F x) ≤ B) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) F) ^ 2 ≤ B := by + have hbound : + ∫⁻ x, ENNReal.ofReal (vecNormSq (F x)) ∂ normalizedOverlapCubeMeasure S ≤ + ENNReal.ofReal B := + lintegral_ofReal_vecNormSq_le_of_forall_overlapCubeSet + (S := S) (F := F) hpoint + have hnorm := + overlapCubeLpNorm_two_sq_le_lintegral_ofReal_vecNormSq_toReal_of_le + (S := S) (F := F) (B := ENNReal.ofReal B) + ENNReal.ofReal_ne_top hbound + simpa [ENNReal.toReal_ofReal hB] using hnorm + +theorem memLp_cubeMeasure_of_memLp_normalizedCubeMeasure {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) {p : ℝ≥0∞} {f : Vec d → E} + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (cubeMeasure Q) := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + exact hf.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + +/-- Exact normalized-to-unnormalized vector `L²` conversion on an open cube. -/ +theorem cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toVectorL2_openCubeSet + {d : ℕ} (Q : TriadicCube d) {f : Vec d → Vec d} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) f = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toVectorL2 + (memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openCubeSet Q) + let hopen : MemVectorL2 (openCubeSet Q) f := + memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hμ_eq : cubeMeasure Q = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + have hnorm_eq : + cubeLpNorm Q (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + unfold cubeLpNorm normalizedCubeMeasure + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞)] + simp [c, hμ_eq, μ] + have hopen_norm : + ‖Homogenization.toVectorL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toVectorL2, MeasureTheory.Lp.norm_toLp] + have hfactor : + (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg + (inv_nonneg.mpr (cubeVolume_nonneg Q)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _)] + rw [hnorm_eq, ENNReal.toReal_mul, hopen_norm, hfactor] + +theorem memLp_overlapCubeMeasure_of_memLp_normalizedOverlapCubeMeasure {d : ℕ} + {E : Type*} [NormedAddCommGroup E] (S : TriadicCube d) {p : ℝ≥0∞} + {f : Vec d → E} + (hf : MeasureTheory.MemLp f p (normalizedOverlapCubeMeasure S)) : + MeasureTheory.MemLp f p (overlapCubeMeasure S) := by + have hle : + overlapCubeMeasure S ≤ + ENNReal.ofReal (overlapCubeVolume S) • normalizedOverlapCubeMeasure S := by + have hvol_nonneg : 0 ≤ overlapCubeVolume S := overlapCubeVolume_nonneg S + have hmul : + ENNReal.ofReal (overlapCubeVolume S) * + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : overlapCubeVolume S * (overlapCubeVolume S)⁻¹ = 1 := by + field_simp [(overlapCubeVolume_pos S).ne'] + rw [hreal] + norm_num + have heq : + ENNReal.ofReal (overlapCubeVolume S) • normalizedOverlapCubeMeasure S = + overlapCubeMeasure S := by + rw [normalizedOverlapCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (overlapCubeVolume S) * + (ENNReal.ofReal ((overlapCubeVolume S)⁻¹) * + (overlapCubeMeasure S) s) = + (overlapCubeMeasure S) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + exact hf.of_measure_le_smul (c := ENNReal.ofReal (overlapCubeVolume S)) + ENNReal.ofReal_ne_top hle + +theorem memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure {d : ℕ} + (S : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + MemL2On (openOverlapCubeSet S) f := by + have hfOverlap : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (overlapCubeMeasure S) := + memLp_overlapCubeMeasure_of_memLp_normalizedOverlapCubeMeasure S hf + simpa [MemL2On, overlapCubeMeasure, + volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S] + using hfOverlap + +theorem memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure {d : ℕ} + (S : TriadicCube d) {f : Vec d → Vec d} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + MemVectorL2 (openOverlapCubeSet S) f := by + have hfOverlap : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (overlapCubeMeasure S) := + memLp_overlapCubeMeasure_of_memLp_normalizedOverlapCubeMeasure S hf + simpa [MemVectorL2, overlapCubeMeasure, + volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S] + using hfOverlap + +theorem memL2On_openOverlapCubeSet_normalizedOverlapCubeMeasure {d : ℕ} + {S : TriadicCube d} {f : Vec d → ℝ} + (hf : MemL2On (openOverlapCubeSet S) f) : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + have hfOverlap : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (overlapCubeMeasure S) := by + simpa [MemL2On, overlapCubeMeasure, + volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S] + using hf + simpa [normalizedOverlapCubeMeasure] using + hfOverlap.smul_measure ENNReal.ofReal_ne_top + +theorem memVectorL2_openOverlapCubeSet_normalizedOverlapCubeMeasure {d : ℕ} + {S : TriadicCube d} {f : Vec d → Vec d} + (hf : MemVectorL2 (openOverlapCubeSet S) f) : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + have hfOverlap : + MeasureTheory.MemLp f (2 : ℝ≥0∞) (overlapCubeMeasure S) := by + simpa [MemVectorL2, overlapCubeMeasure, + volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S] + using hf + simpa [normalizedOverlapCubeMeasure] using + hfOverlap.smul_measure ENNReal.ofReal_ne_top + +/-- Exact normalized-to-unnormalized `L²` conversion on an open overlapping +cube. -/ +theorem overlapCubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openOverlapCubeSet + {d : ℕ} (S : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) f = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ := by + let c : ℝ≥0∞ := ENNReal.ofReal ((overlapCubeVolume S)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openOverlapCubeSet S) + let hopen : MemScalarL2 (openOverlapCubeSet S) f := + memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hμ_eq : overlapCubeMeasure S = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S + have hnorm_eq : + overlapCubeLpNorm S (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + unfold overlapCubeLpNorm normalizedOverlapCubeMeasure + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞)] + simp [c, hμ_eq, μ] + have hopen_norm : + ‖Homogenization.toScalarL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + have hfactor : + (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg + (inv_nonneg.mpr (overlapCubeVolume_nonneg S)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal + (Real.rpow_nonneg (inv_nonneg.mpr (overlapCubeVolume_nonneg S)) _)] + rw [hnorm_eq, ENNReal.toReal_mul, hopen_norm, hfactor] + +theorem norm_toScalarL2_openOverlapCubeSet_eq_volume_rpow_half_mul_overlapCubeLpNorm_two + {d : ℕ} (S : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + ‖Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ = + (overlapCubeVolume S) ^ (1 / 2 : ℝ) * + overlapCubeLpNorm S (2 : ℝ≥0∞) f := by + let A : ℝ := ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) + let N : ℝ := + ‖Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ + let L : ℝ := overlapCubeLpNorm S (2 : ℝ≥0∞) f + have hA_pos : 0 < A := by + dsimp [A] + exact Real.rpow_pos_of_pos (inv_pos.mpr (overlapCubeVolume_pos S)) _ + have hL_eq : L = A * N := by + simpa [A, N, L] using + overlapCubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openOverlapCubeSet + S hf + have hA_inv : + A⁻¹ = (overlapCubeVolume S) ^ (1 / 2 : ℝ) := by + dsimp [A] + rw [Real.inv_rpow (le_of_lt (overlapCubeVolume_pos S)) (1 / 2 : ℝ)] + rw [inv_inv] + calc + N = A⁻¹ * L := by + rw [hL_eq] + field_simp [hA_pos.ne'] + _ = (overlapCubeVolume S) ^ (1 / 2 : ℝ) * L := by + rw [hA_inv] + _ = (overlapCubeVolume S) ^ (1 / 2 : ℝ) * + overlapCubeLpNorm S (2 : ℝ≥0∞) f := rfl + +/-- Exact normalized-to-unnormalized vector `L²` conversion on an open +overlapping cube. -/ +theorem overlapCubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toVectorL2_openOverlapCubeSet + {d : ℕ} (S : TriadicCube d) {f : Vec d → Vec d} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) f = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toVectorL2 + (memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ := by + let c : ℝ≥0∞ := ENNReal.ofReal ((overlapCubeVolume S)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openOverlapCubeSet S) + let hopen : MemVectorL2 (openOverlapCubeSet S) f := + memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hμ_eq : overlapCubeMeasure S = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet S + have hnorm_eq : + overlapCubeLpNorm S (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + unfold overlapCubeLpNorm normalizedOverlapCubeMeasure + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞)] + simp [c, hμ_eq, μ] + have hopen_norm : + ‖Homogenization.toVectorL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toVectorL2, MeasureTheory.Lp.norm_toLp] + have hfactor : + (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg + (inv_nonneg.mpr (overlapCubeVolume_nonneg S)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal + (Real.rpow_nonneg (inv_nonneg.mpr (overlapCubeVolume_nonneg S)) _)] + rw [hnorm_eq, ENNReal.toReal_mul, hopen_norm, hfactor] + +theorem overlapCubeLpNorm_two_sub_overlapCubeAverage_le + {d : ℕ} (S : TriadicCube d) (u : H1Function (openOverlapCubeSet S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => u x - overlapCubeAverage S (fun y => u y)) ≤ + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ((overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ‖u.gradToVectorL2‖) := by + let f : Vec d → ℝ := fun x => u.toMeanZero x + have hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memL2On_openOverlapCubeSet_normalizedOverlapCubeMeasure + (S := S) (f := f) (by + simpa [f] using! u.toMeanZero.toH1Function.memL2) + have hfluct : (fun x => u x - overlapCubeAverage S (fun y => u y)) = f := by + funext x + dsimp [f] + exact (H1Function.toMeanZero_openOverlapCubeSet_apply S u x).symm + have hnorm : + ‖Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ = + (u.toMeanZero).valueL2Norm := by + have hLp : + Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf) = + (u.toMeanZero).toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [Homogenization.coeFn_toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf), + H1Function.coeFn_toScalarL2 (u.toMeanZero.toH1Function)] + with x hleft hright + rw [hleft] + change f x = (u.toMeanZero.toH1Function.toScalarL2 : Vec d → ℝ) x + rw [hright] + simpa [H1MeanZeroFunction.valueL2Norm] using congrArg norm hLp + rw [hfluct] + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) f + = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toScalarL2 + (memL2On_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hf)‖ := by + exact + overlapCubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openOverlapCubeSet + S hf + _ = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + (u.toMeanZero).valueL2Norm := by + rw [hnorm] + _ ≤ + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ((overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ‖u.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left + (openOverlapCubeMeanZero_valueL2Norm_le S u) + (Real.rpow_nonneg (inv_nonneg.mpr (overlapCubeVolume_nonneg S)) _) + +theorem overlapCubeLpNorm_two_sub_overlapCubeAverage_le_scale_mul_grad + {d : ℕ} (S : TriadicCube d) (u : H1Function (openOverlapCubeSet S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => u x - overlapCubeAverage S (fun y => u y)) ≤ + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + overlapCubeLpNorm S (2 : ℝ≥0∞) u.grad := by + have hgrad : MeasureTheory.MemLp u.grad (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memVectorL2_openOverlapCubeSet_normalizedOverlapCubeMeasure + (S := S) (f := u.grad) u.grad_memVectorL2 + have hgradNorm : + ‖Homogenization.toVectorL2 + (memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hgrad)‖ = + ‖u.gradToVectorL2‖ := by + have hLp : + Homogenization.toVectorL2 + (memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hgrad) = + u.gradToVectorL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [Homogenization.coeFn_toVectorL2 + (memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure S hgrad), + H1Function.coeFn_gradToVectorL2 u] + with x hleft hright + rw [hleft] + rw [hright] + exact congrArg norm hLp + have hgradExact : + overlapCubeLpNorm S (2 : ℝ≥0∞) u.grad = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖u.gradToVectorL2‖ := by + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) u.grad + = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toVectorL2 + (memVectorL2_openOverlapCubeSet_of_memLp_normalizedOverlapCubeMeasure + S hgrad)‖ := by + exact + overlapCubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toVectorL2_openOverlapCubeSet + S hgrad + _ = + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖u.gradToVectorL2‖ := by + rw [hgradNorm] + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => u x - overlapCubeAverage S (fun y => u y)) + ≤ + ((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ((overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ‖u.gradToVectorL2‖) := + overlapCubeLpNorm_two_sub_overlapCubeAverage_le S u + _ = + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + (((overlapCubeVolume S)⁻¹) ^ (1 / 2 : ℝ) * + ‖u.gradToVectorL2‖) := by + ring + _ = + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + overlapCubeLpNorm S (2 : ℝ≥0∞) u.grad := by + rw [hgradExact] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapPoincare.lean new file mode 100644 index 0000000000..0ad7fa4080 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/OverlapPoincare.lean @@ -0,0 +1,605 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidual + +/-! # Overlap Poincare -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +theorem overlapCubeLpNorm_two_overlapCubeFluctuationVec_toField_le_scale_mul_sum_grad + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (G : CubeVectorH1Function Q) (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) ≤ + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (G.restrictCoordToOpenOverlap hS i).grad := by + have hGloc : + MeasureTheory.MemLp G.toField (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure + hS G.memLp_toField_normalizedCubeMeasure + have hfluct : + MeasureTheory.MemLp (overlapCubeFluctuationVec S G.toField) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S G.toField hGloc + have hvec : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) ≤ + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => overlapCubeFluctuationVec S G.toField x i) := + overlapCubeLpNorm_two_vec_le_sum_components S + (overlapCubeFluctuationVec S G.toField) hfluct + have hcomponents : + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => overlapCubeFluctuationVec S G.toField x i) ≤ + ∑ i : Fin d, + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + overlapCubeLpNorm S (2 : ℝ≥0∞) + (G.restrictCoordToOpenOverlap hS i).grad := by + refine Finset.sum_le_sum ?_ + intro i _hi + let u : H1Function (openOverlapCubeSet S) := + G.restrictCoordToOpenOverlap hS i + have hcomp : + (fun x => overlapCubeFluctuationVec S G.toField x i) = + fun x => u x - overlapCubeAverage S (fun y => u y) := by + funext x + simp [u, overlapCubeFluctuationVec, overlapCubeAverageVec, + CubeVectorH1Function.toField] + rw [hcomp] + exact overlapCubeLpNorm_two_sub_overlapCubeAverage_le_scale_mul_grad S u + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) + ≤ + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => overlapCubeFluctuationVec S G.toField x i) := hvec + _ ≤ + ∑ i : Fin d, + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + overlapCubeLpNorm S (2 : ℝ≥0∞) + (G.restrictCoordToOpenOverlap hS i).grad := hcomponents + _ = + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (G.restrictCoordToOpenOverlap hS i).grad := by + rw [Finset.mul_sum] + +theorem overlapCubeLpNorm_two_overlapCubeFluctuationVec_toField_le_scale_mul_sum_parent_grad + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (G : CubeVectorH1Function Q) (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) ≤ + (overlapCubeScaleFactor S * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad := by + simpa using! + overlapCubeLpNorm_two_overlapCubeFluctuationVec_toField_le_scale_mul_sum_grad + G hS + +theorem overlapCentersAverage_finset_sum {d : ℕ} {ι : Type*} + (Q : TriadicCube d) (j : ℕ) (s : Finset ι) + (F : ι → TriadicCube d → ℝ) : + overlapCentersAverage Q j (fun S => ∑ i ∈ s, F i S) = + ∑ i ∈ s, overlapCentersAverage Q j (fun S => F i S) := by + classical + let D := overlapCentersAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + unfold overlapCentersAverage + change c * (∑ S ∈ D, ∑ i ∈ s, F i S) = + ∑ i ∈ s, c * (∑ S ∈ D, F i S) + rw [Finset.sum_comm] + rw [Finset.mul_sum] + +theorem overlapCentersAverage_overlapCubeLpNorm_grad_sq_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (G : CubeVectorH1Function Q) (i : Fin d) : + overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) ≤ + (3 ^ d : ℝ) * + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 := by + have hparent : + MeasureTheory.MemLp (G.coord i).grad (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro k + exact H1Function.grad_memL2_normalizedCubeMeasure (G.coord i) k + have hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (G.coord i).grad (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := by + intro S hS + exact memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS hparent + have havg := + overlapCentersAverage_lintegral_rpow_enorm_two_le + Q j (G.coord i).grad hparent hloc + calc + overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) + = + overlapCentersAverage Q j + (fun S => + (∫⁻ x, ‖(G.coord i).grad x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S).toReal) := by + classical + let D := overlapCentersAtDepth Q j + unfold overlapCentersAverage + change ((D.card : ℝ)⁻¹) * + D.sum (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) = + ((D.card : ℝ)⁻¹) * + D.sum (fun S => + (∫⁻ x, ‖(G.coord i).grad x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S).toReal) + congr 1 + refine Finset.sum_congr rfl ?_ + intro S _hS + exact overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal + (E := Vec d) S (G.coord i).grad + _ ≤ + (3 ^ d : ℝ) * + (∫⁻ x, ‖(G.coord i).grad x‖ₑ ^ (2 : ℝ) + ∂ normalizedCubeMeasure Q).toReal := havg + _ = + (3 ^ d : ℝ) * + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 := by + rw [cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal (E := Vec d)] + +theorem cubeLpNorm_two_grad_le_volume_inv_rpow_half_mul_gradientCoordL2NormSum + {d : ℕ} {Q : TriadicCube d} (u : H1Function (openCubeSet Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) u.grad ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * u.gradientCoordL2NormSum := by + have hgrad : MeasureTheory.MemLp u.grad (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro k + exact H1Function.grad_memL2_normalizedCubeMeasure u k + have hgradNorm : + ‖Homogenization.toVectorL2 + (memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hgrad)‖ = + ‖u.gradToVectorL2‖ := by + have hLp : + Homogenization.toVectorL2 + (memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hgrad) = + u.gradToVectorL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [Homogenization.coeFn_toVectorL2 + (memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hgrad), + H1Function.coeFn_gradToVectorL2 u] + with x hleft hright + rw [hleft, hright] + exact congrArg norm hLp + calc + cubeLpNorm Q (2 : ℝ≥0∞) u.grad + = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toVectorL2 + (memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hgrad)‖ := by + exact + cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toVectorL2_openCubeSet + Q hgrad + _ = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * ‖u.gradToVectorL2‖ := by + rw [hgradNorm] + _ ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + u.gradientCoordL2NormSum := by + exact mul_le_mul_of_nonneg_left + u.norm_gradToVectorL2_le_gradientCoordL2NormSum + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_raw + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (G : CubeVectorH1Function Q) : + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j ≤ + (((cubeScaleFactor Q / (3 : ℝ) ^ j) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) ^ 2) * + ((Fintype.card (Fin d) : ℝ) * + ((3 ^ d : ℝ) * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + G.gradientCoordL2NormSum) ^ 2))) := by + classical + let C0 : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let scale : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let m : ℝ := (Fintype.card (Fin d) : ℝ) + let parent : ℝ := ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + G.gradientCoordL2NormSum + have hC0_nonneg : 0 ≤ C0 := by + dsimp [C0] + exact (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hscale_nonneg : 0 ≤ scale := by + dsimp [scale] + exact div_nonneg + (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hm_nonneg : 0 ≤ m := by + dsimp [m] + positivity + have hparent_nonneg : 0 ≤ parent := by + dsimp [parent] + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + G.gradientCoordL2NormSum_nonneg + have hpoint : + ∀ S ∈ overlapCentersAtDepth Q j, + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField)) ^ 2 ≤ + (scale * C0) ^ 2 * + (m * + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) := by + intro S hS + let L : ℝ := overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) + let b : Fin d → ℝ := + fun i => overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad + have hscaleS : overlapCubeScaleFactor S = scale := by + simpa [scale] using + overlapCubeScaleFactor_eq_cubeScaleFactor_div_pow_of_mem_overlapCentersAtDepth + hS + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S G.toField) + have hb_nonneg : ∀ i : Fin d, 0 ≤ b i := by + intro i + dsimp [b] + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (G.coord i).grad + have hsum_nonneg : 0 ≤ ∑ i : Fin d, b i := + Finset.sum_nonneg fun i _hi => hb_nonneg i + have hlocal : + L ≤ (scale * C0) * ∑ i : Fin d, b i := by + dsimp [L, b] + simpa [hscaleS, C0, scale] using + overlapCubeLpNorm_two_overlapCubeFluctuationVec_toField_le_scale_mul_sum_parent_grad + G hS + have hright_nonneg : 0 ≤ (scale * C0) * ∑ i : Fin d, b i := + mul_nonneg (mul_nonneg hscale_nonneg hC0_nonneg) hsum_nonneg + have hsq : + L ^ 2 ≤ ((scale * C0) * ∑ i : Fin d, b i) ^ 2 := + (sq_le_sq₀ hL_nonneg hright_nonneg).mpr hlocal + have hcs : + (∑ i : Fin d, b i) ^ 2 ≤ + m * ∑ i : Fin d, (b i) ^ 2 := by + simpa [m] using + (sq_sum_le_card_mul_sum_sq + (s := (Finset.univ : Finset (Fin d))) (f := b)) + have hmul : + (scale * C0) ^ 2 * (∑ i : Fin d, b i) ^ 2 ≤ + (scale * C0) ^ 2 * (m * ∑ i : Fin d, (b i) ^ 2) := + mul_le_mul_of_nonneg_left hcs (sq_nonneg (scale * C0)) + have hsq' : + L ^ 2 ≤ (scale * C0) ^ 2 * (∑ i : Fin d, b i) ^ 2 := by + nlinarith [hsq] + have htarget : + L ^ 2 ≤ (scale * C0) ^ 2 * + (m * ∑ i : Fin d, (b i) ^ 2) := + hsq'.trans hmul + simpa [L, b, mul_assoc] using htarget + have havg_point : + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j ≤ + overlapCentersAverage Q j + (fun S => + (scale * C0) ^ 2 * + (m * + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage + exact overlapCentersAverage_le_overlapCentersAverage Q j hpoint + have hfactor_avg : + overlapCentersAverage Q j + (fun S => + (scale * C0) ^ 2 * + (m * + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) = + (scale * C0) ^ 2 * + (m * + overlapCentersAverage Q j + (fun S => + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) := by + rw [overlapCentersAverage_mul_left] + rw [overlapCentersAverage_mul_left] + have havg_grad : + overlapCentersAverage Q j + (fun S => + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) ≤ + (3 ^ d : ℝ) * + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 := by + calc + overlapCentersAverage Q j + (fun S => + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) + = + ∑ i : Fin d, + overlapCentersAverage Q j + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) := by + simpa using + overlapCentersAverage_finset_sum Q j + (Finset.univ : Finset (Fin d)) + (fun i S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2) + _ ≤ + ∑ i : Fin d, + (3 ^ d : ℝ) * + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact overlapCentersAverage_overlapCubeLpNorm_grad_sq_le Q j G i + _ = + (3 ^ d : ℝ) * + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 := by + rw [Finset.mul_sum] + have hparent_sum : + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 ≤ + parent ^ 2 := by + let a : ℝ := ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) + let c : Fin d → ℝ := fun i => (G.coord i).gradientCoordL2NormSum + have ha_nonneg : 0 ≤ a := by + dsimp [a] + exact Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _ + have hc_nonneg : ∀ i : Fin d, 0 ≤ c i := by + intro i + dsimp [c] + exact (G.coord i).gradientCoordL2NormSum_nonneg + have hterm : + ∀ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 ≤ + (a * c i) ^ 2 := by + intro i + have hle := + cubeLpNorm_two_grad_le_volume_inv_rpow_half_mul_gradientCoordL2NormSum + (Q := Q) (G.coord i) + exact (sq_le_sq₀ + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (G.coord i).grad) + (mul_nonneg ha_nonneg (hc_nonneg i))).mpr (by simpa [a, c] using hle) + calc + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2 + ≤ ∑ i : Fin d, (a * c i) ^ 2 := by + exact Finset.sum_le_sum fun i _hi => hterm i + _ = a ^ 2 * ∑ i : Fin d, (c i) ^ 2 := by + simp_rw [mul_pow] + rw [← Finset.mul_sum] + _ ≤ a ^ 2 * (∑ i : Fin d, c i) ^ 2 := by + exact mul_le_mul_of_nonneg_left + (Finset.sum_sq_le_sq_sum_of_nonneg + (s := (Finset.univ : Finset (Fin d))) + (f := c) (fun i _hi => hc_nonneg i)) + (sq_nonneg a) + _ = parent ^ 2 := by + simp [parent, a, c, CubeVectorH1Function.gradientCoordL2NormSum] + ring + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j + ≤ + overlapCentersAverage Q j + (fun S => + (scale * C0) ^ 2 * + (m * + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) := + havg_point + _ = + (scale * C0) ^ 2 * + (m * + overlapCentersAverage Q j + (fun S => + ∑ i : Fin d, + (overlapCubeLpNorm S (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) := + hfactor_avg + _ ≤ + (scale * C0) ^ 2 * + (m * + ((3 ^ d : ℝ) * + ∑ i : Fin d, + (cubeLpNorm Q (2 : ℝ≥0∞) (G.coord i).grad) ^ 2)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left havg_grad hm_nonneg) + (sq_nonneg (scale * C0)) + _ ≤ + (scale * C0) ^ 2 * + (m * ((3 ^ d : ℝ) * parent ^ 2)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hparent_sum (by positivity)) + hm_nonneg) + (sq_nonneg (scale * C0)) + _ = + (((cubeScaleFactor Q / (3 : ℝ) ^ j) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) ^ 2) * + ((Fintype.card (Fin d) : ℝ) * + ((3 ^ d : ℝ) * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + G.gradientCoordL2NormSum) ^ 2))) := by + simp [C0, scale, m, parent] + +/-- Explicit constant for the averaged overlap-cube Poincare estimate. -/ +noncomputable def cubeVectorH1OverlapPoincareConstant (d : ℕ) : ℝ := + Real.sqrt ((Fintype.card (Fin d) : ℝ) * (3 ^ d : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + +theorem cubeVectorH1OverlapPoincareConstant_nonneg (d : ℕ) : + 0 ≤ cubeVectorH1OverlapPoincareConstant d := by + unfold cubeVectorH1OverlapPoincareConstant + exact mul_nonneg (Real.sqrt_nonneg _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + +/-- Averaged overlap-cube Poincare estimate for coordinatewise `H¹` vector +competitors. + +This is the scale-correct analytic input for the competitor branch of the pure +K/overlapping comparison. The overlapping oscillations are normalized `L²` +quantities, while the `H¹` competitor carries a raw parent-cube gradient norm, +so the parent-normalized size `relativeGradientCoordL2NormSum` appears. -/ +def CubeVectorH1OverlapPoincareEstimate (d : ℕ) (C : ℝ) : Prop := + ∀ (Q : TriadicCube d) (j : ℕ) (G : CubeVectorH1Function Q), + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j) ≤ + C * Real.rpow (3 : ℝ) (-(j : ℝ)) * G.relativeGradientCoordL2NormSum + +theorem cubeVectorH1OverlapPoincareEstimate + (d : ℕ) : + CubeVectorH1OverlapPoincareEstimate d + (cubeVectorH1OverlapPoincareConstant d) := by + intro Q j G + let C0 : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let M : ℝ := (Fintype.card (Fin d) : ℝ) * (3 ^ d : ℝ) + let C : ℝ := cubeVectorH1OverlapPoincareConstant d + let t : ℝ := Real.rpow (3 : ℝ) (-(j : ℝ)) + let R : ℝ := G.relativeGradientCoordL2NormSum + let A : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q G.toField j + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact cubeVectorH1OverlapPoincareConstant_nonneg d + have ht_nonneg : 0 ≤ t := by + dsimp [t] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hR_nonneg : 0 ≤ R := by + dsimp [R] + exact G.relativeGradientCoordL2NormSum_nonneg + have hB_nonneg : 0 ≤ C * t * R := + mul_nonneg (mul_nonneg hC_nonneg ht_nonneg) hR_nonneg + have hraw : + A ≤ + (((cubeScaleFactor Q / (3 : ℝ) ^ j) * C0) ^ 2) * + ((Fintype.card (Fin d) : ℝ) * + ((3 ^ d : ℝ) * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + G.gradientCoordL2NormSum) ^ 2))) := by + dsimp [A, C0] + exact cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_raw Q j G + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hC_sq : C ^ 2 = M * C0 ^ 2 := by + dsimp [C, M, C0, cubeVectorH1OverlapPoincareConstant] + rw [mul_pow, Real.sq_sqrt hM_nonneg] + have ht_eq : t = ((3 : ℝ) ^ j)⁻¹ := by + dsimp [t] + rw [Real.rpow_neg (by norm_num : 0 ≤ (3 : ℝ))] + rw [Real.rpow_natCast] + have hvol_half : + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) = + (Real.sqrt (cubeVolume Q))⁻¹ := by + rw [Real.inv_rpow (cubeVolume_nonneg Q) (1 / 2 : ℝ)] + rw [← Real.sqrt_eq_rpow] + have hraw_eq : + (((cubeScaleFactor Q / (3 : ℝ) ^ j) * C0) ^ 2) * + ((Fintype.card (Fin d) : ℝ) * + ((3 ^ d : ℝ) * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + G.gradientCoordL2NormSum) ^ 2))) = + (C * t * R) ^ 2 := by + dsimp [R, CubeVectorH1Function.relativeGradientCoordL2NormSum] + rw [ht_eq, hvol_half] + have hC_sq' : + C ^ 2 = + ((Fintype.card (Fin d) : ℝ) * (3 ^ d : ℝ)) * C0 ^ 2 := by + simpa [M] using hC_sq + calc + (((cubeScaleFactor Q / (3 : ℝ) ^ j) * C0) ^ 2) * + ((Fintype.card (Fin d) : ℝ) * + ((3 ^ d : ℝ) * + (((Real.sqrt (cubeVolume Q))⁻¹ * + G.gradientCoordL2NormSum) ^ 2))) + = + (((Fintype.card (Fin d) : ℝ) * (3 ^ d : ℝ)) * C0 ^ 2) * + (((cubeScaleFactor Q / (3 : ℝ) ^ j) ^ 2) * + (((Real.sqrt (cubeVolume Q))⁻¹ * + G.gradientCoordL2NormSum) ^ 2)) := by + ring + _ = + C ^ 2 * + ((((3 : ℝ) ^ j)⁻¹) ^ 2 * + ((cubeScaleFactor Q / Real.sqrt (cubeVolume Q) * + G.gradientCoordL2NormSum) ^ 2)) := by + rw [← hC_sq'] + ring + _ = + (C * ((3 : ℝ) ^ j)⁻¹ * + (cubeScaleFactor Q / Real.sqrt (cubeVolume Q) * + G.gradientCoordL2NormSum)) ^ 2 := by + ring + have hA_le : A ≤ (C * t * R) ^ 2 := + hraw.trans_eq hraw_eq + have hsqrt : Real.sqrt A ≤ C * t * R := + Real.sqrt_le_iff.mpr ⟨hB_nonneg, hA_le⟩ + simpa [A, C, t, R] using hsqrt + +theorem exists_cubeVectorH1OverlapPoincareEstimate + (d : ℕ) : + ∃ C : ℝ, 0 ≤ C ∧ CubeVectorH1OverlapPoincareEstimate d C := + ⟨cubeVectorH1OverlapPoincareConstant d, + cubeVectorH1OverlapPoincareConstant_nonneg d, + cubeVectorH1OverlapPoincareEstimate d⟩ + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_toField_le_of_overlapPoincare + {d : ℕ} {C : ℝ} + (hC : 0 ≤ C) (hPoincare : CubeVectorH1OverlapPoincareEstimate d C) + (Q : TriadicCube d) (j : ℕ) (G : CubeVectorH1Function Q) : + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j ≤ + (C * Real.rpow (3 : ℝ) (-(j : ℝ)) * + G.relativeGradientCoordL2NormSum) ^ 2 := by + let A : ℝ := cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j + let B : ℝ := C * Real.rpow (3 : ℝ) (-(j : ℝ)) * + G.relativeGradientCoordL2NormSum + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q G.toField j + have hB_nonneg : 0 ≤ B := by + exact mul_nonneg + (mul_nonneg hC (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + G.relativeGradientCoordL2NormSum_nonneg + have hsqr : + (Real.sqrt A) ^ 2 ≤ B ^ 2 := + (sq_le_sq₀ (Real.sqrt_nonneg _) hB_nonneg).mpr (by + simpa [A, B] using hPoincare Q j G) + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q G.toField j + = (Real.sqrt A) ^ 2 := by + dsimp [A] + rw [Real.sq_sqrt hA_nonneg] + _ ≤ B ^ 2 := hsqr + _ = (C * Real.rpow (3 : ℝ) (-(j : ℝ)) * + G.relativeGradientCoordL2NormSum) ^ 2 := by + rfl + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionDerivatives.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionDerivatives.lean new file mode 100644 index 0000000000..48e770291a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionDerivatives.lean @@ -0,0 +1,430 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionGeometry + +/-! # Partition Derivatives -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +theorem norm_fderiv_lowerOverlapArgument_le {d : ℕ} + (S : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖fderiv ℝ + (fun y : Vec d => (y i - overlapCoordLower S i) / cubeScaleFactor S) x‖ + ≤ (cubeScaleFactor S)⁻¹ := by + let c : Vec d := fun _ => overlapCoordLower S i + have hfun : + (fun y : Vec d => (y i - overlapCoordLower S i) / cubeScaleFactor S) = + fun y : Vec d => (cubeScaleFactor S)⁻¹ * (y i - c i) := by + funext y + dsimp [c] + field_simp [(cubeScaleFactor_pos' S).ne'] + rw [hfun] + rw [fderiv_const_mul] + · calc + ‖(cubeScaleFactor S)⁻¹ • + fderiv ℝ (fun y : Vec d => y i - c i) x‖ + = ‖(cubeScaleFactor S)⁻¹‖ * + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ := norm_smul _ _ + _ ≤ ‖(cubeScaleFactor S)⁻¹‖ * 1 := + mul_le_mul_of_nonneg_left + (norm_fderiv_coord_sub_const_le_one i c x) + (norm_nonneg _) + _ = (cubeScaleFactor S)⁻¹ := by + rw [mul_one, Real.norm_eq_abs, + abs_of_nonneg (inv_nonneg.mpr (cubeScaleFactor_pos' S).le)] + · fun_prop + +theorem norm_fderiv_upperOverlapArgument_le {d : ℕ} + (S : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖fderiv ℝ + (fun y : Vec d => (overlapCoordUpper S i - y i) / cubeScaleFactor S) x‖ + ≤ (cubeScaleFactor S)⁻¹ := by + let c : Vec d := fun _ => overlapCoordUpper S i + have hfun : + (fun y : Vec d => (overlapCoordUpper S i - y i) / cubeScaleFactor S) = + fun y : Vec d => -((cubeScaleFactor S)⁻¹) * (y i - c i) := by + funext y + dsimp [c] + field_simp [(cubeScaleFactor_pos' S).ne'] + ring + rw [hfun] + rw [fderiv_const_mul] + · calc + ‖(-((cubeScaleFactor S)⁻¹)) • + fderiv ℝ (fun y : Vec d => y i - c i) x‖ + = ‖-((cubeScaleFactor S)⁻¹)‖ * + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ := norm_smul _ _ + _ ≤ ‖-((cubeScaleFactor S)⁻¹)‖ * 1 := + mul_le_mul_of_nonneg_left + (norm_fderiv_coord_sub_const_le_one i c x) + (norm_nonneg _) + _ = (cubeScaleFactor S)⁻¹ := by + rw [mul_one, norm_neg, Real.norm_eq_abs, + abs_of_nonneg (inv_nonneg.mpr (cubeScaleFactor_pos' S).le)] + · fun_prop + +theorem norm_fderiv_lowerOverlapTransition_le {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖fderiv ℝ (lowerOverlapTransition Q S i) x‖ ≤ + smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · have hfun : lowerOverlapTransition Q S i = fun _ : Vec d => (1 : ℝ) := by + funext y + simp [lowerOverlapTransition, hboundary] + rw [hfun] + simp + exact mul_nonneg smoothTransitionProfile.derivBound_nonneg + (inv_nonneg.mpr (cubeScaleFactor_pos' S).le) + · have harg_diff : + DifferentiableAt ℝ + (fun y : Vec d => (y i - overlapCoordLower S i) / cubeScaleFactor S) x := by + fun_prop + have hfun : + lowerOverlapTransition Q S i = + fun y : Vec d => + smoothTransitionProfile ((y i - overlapCoordLower S i) / cubeScaleFactor S) := by + funext y + simp [lowerOverlapTransition, hboundary] + rw [hfun] + exact + (norm_fderiv_profile_comp_le smoothTransitionProfile.quantitativeProfile + harg_diff).trans + (mul_le_mul_of_nonneg_left + (norm_fderiv_lowerOverlapArgument_le S i x) + smoothTransitionProfile.derivBound_nonneg) + +theorem norm_fderiv_upperOverlapTransition_le {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖fderiv ℝ (upperOverlapTransition Q S i) x‖ ≤ + smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · have hfun : upperOverlapTransition Q S i = fun _ : Vec d => (1 : ℝ) := by + funext y + simp [upperOverlapTransition, hboundary] + rw [hfun] + simp + exact mul_nonneg smoothTransitionProfile.derivBound_nonneg + (inv_nonneg.mpr (cubeScaleFactor_pos' S).le) + · have harg_diff : + DifferentiableAt ℝ + (fun y : Vec d => (overlapCoordUpper S i - y i) / cubeScaleFactor S) x := by + fun_prop + have hfun : + upperOverlapTransition Q S i = + fun y : Vec d => + smoothTransitionProfile ((overlapCoordUpper S i - y i) / cubeScaleFactor S) := by + funext y + simp [upperOverlapTransition, hboundary] + rw [hfun] + exact + (norm_fderiv_profile_comp_le smoothTransitionProfile.quantitativeProfile + harg_diff).trans + (mul_le_mul_of_nonneg_left + (norm_fderiv_upperOverlapArgument_le S i x) + smoothTransitionProfile.derivBound_nonneg) + +theorem norm_fderiv_overlapTransitionFactor_le {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖fderiv ℝ + (fun y : Vec d => + lowerOverlapTransition Q S i y * upperOverlapTransition Q S i y) x‖ ≤ + 2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + have hl_diff : + DifferentiableAt ℝ (lowerOverlapTransition Q S i) x := + (contDiff_lowerOverlapTransition Q S i).differentiable (by simp) x + have hu_diff : + DifferentiableAt ℝ (upperOverlapTransition Q S i) x := + (contDiff_upperOverlapTransition Q S i).differentiable (by simp) x + rw [fderiv_fun_mul hl_diff hu_diff] + have hD_nonneg : 0 ≤ smoothTransitionProfile.derivBound := + smoothTransitionProfile.derivBound_nonneg + have hscale_inv_nonneg : 0 ≤ (cubeScaleFactor S)⁻¹ := + inv_nonneg.mpr (cubeScaleFactor_pos' S).le + have hl_nonneg : 0 ≤ lowerOverlapTransition Q S i x := + lowerOverlapTransition_nonneg Q S i x + have hu_nonneg : 0 ≤ upperOverlapTransition Q S i x := + upperOverlapTransition_nonneg Q S i x + have hl_abs_le : ‖lowerOverlapTransition Q S i x‖ ≤ 1 := by + rw [Real.norm_eq_abs, abs_of_nonneg hl_nonneg] + exact lowerOverlapTransition_le_one Q S i x + have hu_abs_le : ‖upperOverlapTransition Q S i x‖ ≤ 1 := by + rw [Real.norm_eq_abs, abs_of_nonneg hu_nonneg] + exact upperOverlapTransition_le_one Q S i x + calc + ‖lowerOverlapTransition Q S i x • fderiv ℝ (upperOverlapTransition Q S i) x + + upperOverlapTransition Q S i x • fderiv ℝ (lowerOverlapTransition Q S i) x‖ + ≤ + ‖lowerOverlapTransition Q S i x • + fderiv ℝ (upperOverlapTransition Q S i) x‖ + + ‖upperOverlapTransition Q S i x • + fderiv ℝ (lowerOverlapTransition Q S i) x‖ := norm_add_le _ _ + _ = + ‖lowerOverlapTransition Q S i x‖ * + ‖fderiv ℝ (upperOverlapTransition Q S i) x‖ + + ‖upperOverlapTransition Q S i x‖ * + ‖fderiv ℝ (lowerOverlapTransition Q S i) x‖ := by + rw [norm_smul, norm_smul] + _ ≤ + 1 * (smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) + + 1 * (smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) := by + exact add_le_add + (mul_le_mul hl_abs_le + (norm_fderiv_upperOverlapTransition_le Q S i x) + (norm_nonneg _) + (by norm_num)) + (mul_le_mul hu_abs_le + (norm_fderiv_lowerOverlapTransition_le Q S i x) + (norm_nonneg _) + (by norm_num)) + _ = 2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + ring + +theorem norm_basisVec {d : ℕ} (i : Fin d) : + ‖basisVec i‖ = 1 := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases h : j = i + · subst h + simp [basisVec] + · simp [basisVec, h] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +theorem lowerOverlapTransition_eq_one_of_add_scale_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hle : overlapCoordLower S i + cubeScaleFactor S ≤ x i) : + lowerOverlapTransition Q S i x = 1 := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · simp [lowerOverlapTransition, hboundary] + · have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + have hnum : cubeScaleFactor S ≤ x i - overlapCoordLower S i := by + linarith + have harg : + 1 ≤ (x i - overlapCoordLower S i) / cubeScaleFactor S := by + exact (le_div_iff₀ hscale).2 (by simpa using hnum) + simpa [lowerOverlapTransition, hboundary] using + smoothTransitionProfile.one_of_one_le harg + +theorem upperOverlapTransition_eq_one_of_add_scale_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hle : x i + cubeScaleFactor S ≤ overlapCoordUpper S i) : + upperOverlapTransition Q S i x = 1 := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · simp [upperOverlapTransition, hboundary] + · have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + have hnum : cubeScaleFactor S ≤ overlapCoordUpper S i - x i := by + linarith + have harg : + 1 ≤ (overlapCoordUpper S i - x i) / cubeScaleFactor S := by + exact (le_div_iff₀ hscale).2 (by simpa using hnum) + simpa [upperOverlapTransition, hboundary] using + smoothTransitionProfile.one_of_one_le harg + +theorem lowerOverlapTransition_plateauChildCube_eq_one {d : ℕ} + {Q R : TriadicCube d} {x : Vec d} (hxR : x ∈ cubeSet R) + (i : Fin d) : + lowerOverlapTransition Q (plateauChildCube Q R x) i x = 1 := by + classical + let digits : Fin d → Fin 3 := plateauChildDigit Q R x + let S : TriadicCube d := plateauChildCube Q R x + have hxRi := (mem_cubeSet_iff_coord_bounds.mp hxR i) + have hSscale : cubeScaleFactor S = cubeScaleFactor R / 3 := by + simp [S, plateauChildCube, digits, cubeScaleFactor_childCube R digits] + have hSlower : + overlapCoordLower S i = + cubeCoordLower R i + + ((((digits i : ℤ) : ℝ) - 1) * cubeScaleFactor S) := by + simpa [S, plateauChildCube, digits] using + overlapCoordLower_child R digits i + change lowerOverlapTransition Q S i x = 1 + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · simp [lowerOverlapTransition, hboundary] + · refine lowerOverlapTransition_eq_one_of_add_scale_le ?_ + by_cases hleft : x i < cubeCoordLower R i + cubeScaleFactor R / 3 + · by_cases hlower : cubeCoordLower R i = cubeCoordLower Q i + · exfalso + have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + have hleftQ : + x i < cubeCoordLower Q i + cubeScaleFactor R / 3 := by + simpa [hlower] using hleft + simp [digits, plateauChildDigit, hleftQ, hlower] + rw [hfin] + norm_num + have hface : overlapCoordLower S i = cubeCoordLower Q i := by + rw [hSlower] + nlinarith [hdigit, hlower] + exact hboundary (le_of_eq hface) + · have hdigit : (((digits i : ℤ) : ℝ)) = 0 := by + have hfin : digits i = (0 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hlower] + rw [hfin] + norm_num + rw [hSlower] + nlinarith [hxRi.1, hdigit] + · by_cases hmid : x i < cubeCoordLower R i + 2 * cubeScaleFactor R / 3 + · have hleft_le : + cubeCoordLower R i + cubeScaleFactor R / 3 ≤ x i := + le_of_not_gt hleft + have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid] + rw [hfin] + norm_num + rw [hSlower, hSscale] + nlinarith [hleft_le, hdigit] + · have hmid_le : + cubeCoordLower R i + 2 * cubeScaleFactor R / 3 ≤ x i := + le_of_not_gt hmid + by_cases hupper : cubeCoordUpper R i = cubeCoordUpper Q i + · have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid, hupper] + rw [hfin] + norm_num + rw [hSlower, hSscale] + nlinarith [hmid_le, hdigit, cubeScaleFactor_pos' R] + · have hdigit : (((digits i : ℤ) : ℝ)) = 2 := by + have hfin : digits i = (2 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid, hupper] + rw [hfin] + norm_num + rw [hSlower, hSscale] + nlinarith [hmid_le, hdigit] + +theorem upperOverlapTransition_plateauChildCube_eq_one {d : ℕ} + {Q R : TriadicCube d} {x : Vec d} (hxR : x ∈ cubeSet R) + (i : Fin d) : + upperOverlapTransition Q (plateauChildCube Q R x) i x = 1 := by + classical + let digits : Fin d → Fin 3 := plateauChildDigit Q R x + let S : TriadicCube d := plateauChildCube Q R x + have hxRi := (mem_cubeSet_iff_coord_bounds.mp hxR i) + have hSscale : cubeScaleFactor S = cubeScaleFactor R / 3 := by + simp [S, plateauChildCube, digits, cubeScaleFactor_childCube R digits] + have hSupper : + overlapCoordUpper S i = + cubeCoordUpper R i + + ((((digits i : ℤ) : ℝ) - 1) * cubeScaleFactor S) := by + simpa [S, plateauChildCube, digits] using + overlapCoordUpper_child R digits i + have hRupper : cubeCoordUpper R i = cubeCoordLower R i + cubeScaleFactor R := + cubeCoordUpper_eq_lower_add_scale R i + change upperOverlapTransition Q S i x = 1 + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · simp [upperOverlapTransition, hboundary] + · refine upperOverlapTransition_eq_one_of_add_scale_le ?_ + by_cases hleft : x i < cubeCoordLower R i + cubeScaleFactor R / 3 + · by_cases hlower : cubeCoordLower R i = cubeCoordLower Q i + · have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + have hleftQ : + x i < cubeCoordLower Q i + cubeScaleFactor R / 3 := by + simpa [hlower] using hleft + simp [digits, plateauChildDigit, hleftQ, hlower] + rw [hfin] + norm_num + rw [hSupper, hSscale] + nlinarith [hleft, hRupper, hdigit, cubeScaleFactor_pos' R] + · have hdigit : (((digits i : ℤ) : ℝ)) = 0 := by + have hfin : digits i = (0 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hlower] + rw [hfin] + norm_num + rw [hSupper, hSscale] + nlinarith [hleft, hRupper, hdigit] + · by_cases hmid : x i < cubeCoordLower R i + 2 * cubeScaleFactor R / 3 + · have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid] + rw [hfin] + norm_num + rw [hSupper, hSscale] + nlinarith [hmid, hRupper, hdigit, cubeScaleFactor_pos' R] + · by_cases hupper : cubeCoordUpper R i = cubeCoordUpper Q i + · exfalso + have hdigit : (((digits i : ℤ) : ℝ)) = 1 := by + have hfin : digits i = (1 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid, hupper] + rw [hfin] + norm_num + have hface : overlapCoordUpper S i = cubeCoordUpper Q i := by + rw [hSupper] + nlinarith [hdigit, hupper] + exact hboundary (le_of_eq hface.symm) + · have hdigit : (((digits i : ℤ) : ℝ)) = 2 := by + have hfin : digits i = (2 : Fin 3) := by + simp [digits, plateauChildDigit, hleft, hmid, hupper] + rw [hfin] + norm_num + rw [hSupper] + nlinarith [hxRi.2, hdigit] + +theorem lowerOverlapTransition_ne_zero_coord_lt {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hne : lowerOverlapTransition Q S i x ≠ 0) : + overlapCoordLower S i < x i := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · have hx := (mem_openCubeSet_iff_coord_bounds.mp hxQ i).1 + exact lt_of_le_of_lt hboundary hx + · have hne' : + smoothTransitionProfile ((x i - overlapCoordLower S i) / cubeScaleFactor S) ≠ 0 := by + simpa [lowerOverlapTransition, hboundary] using hne + have harg_pos : + 0 < (x i - overlapCoordLower S i) / cubeScaleFactor S := by + by_contra hnot + have hnonpos : (x i - overlapCoordLower S i) / cubeScaleFactor S ≤ 0 := + not_lt.mp hnot + exact hne' (smoothTransitionProfile.zero_of_nonpos hnonpos) + have hscale : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have hmul : + 0 < x i - overlapCoordLower S i := by + rwa [div_pos_iff_of_pos_right hscale] at harg_pos + linarith + +theorem upperOverlapTransition_ne_zero_coord_lt {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hne : upperOverlapTransition Q S i x ≠ 0) : + x i < overlapCoordUpper S i := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · have hx := (mem_openCubeSet_iff_coord_bounds.mp hxQ i).2 + exact lt_of_lt_of_le hx hboundary + · have hne' : + smoothTransitionProfile ((overlapCoordUpper S i - x i) / cubeScaleFactor S) ≠ 0 := by + simpa [upperOverlapTransition, hboundary] using hne + have harg_pos : + 0 < (overlapCoordUpper S i - x i) / cubeScaleFactor S := by + by_contra hnot + have hnonpos : (overlapCoordUpper S i - x i) / cubeScaleFactor S ≤ 0 := + not_lt.mp hnot + exact hne' (smoothTransitionProfile.zero_of_nonpos hnonpos) + have hscale : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have hmul : + 0 < overlapCoordUpper S i - x i := by + rwa [div_pos_iff_of_pos_right hscale] at harg_pos + linarith + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionGeometry.lean new file mode 100644 index 0000000000..eb4ca23e6c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionGeometry.lean @@ -0,0 +1,737 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapFluctuation + +/-! # Partition Geometry -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-! +### Raw one-sided overlap weights + +These are the planned Stage-7 building blocks for the uniform smooth overlap +partition. Interior coordinates use a two-sided smooth transition across the +outer collar of an overlap cube. If an overlap face coincides with a parent +face, the corresponding one-sided transition is suppressed; this keeps the raw +weight uniformly positive near `∂Q` when we work relative to `openCubeSet Q`. +-/ + +noncomputable def cubeCoordLower {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : ℝ := + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + +noncomputable def cubeCoordUpper {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : ℝ := + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + +noncomputable def overlapCoordLower {d : ℕ} + (S : TriadicCube d) (i : Fin d) : ℝ := + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S) + +noncomputable def overlapCoordUpper {d : ℕ} + (S : TriadicCube d) (i : Fin d) : ℝ := + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S) + +theorem mem_openCubeSet_iff_coord_bounds {d : ℕ} + {Q : TriadicCube d} {x : Vec d} : + x ∈ openCubeSet Q ↔ + ∀ i : Fin d, cubeCoordLower Q i < x i ∧ x i < cubeCoordUpper Q i := by + constructor + · intro hx i + simpa [cubeCoordLower, cubeCoordUpper] using hx i + · intro hx i + simpa [cubeCoordLower, cubeCoordUpper] using hx i + +theorem mem_cubeSet_iff_coord_bounds {d : ℕ} + {Q : TriadicCube d} {x : Vec d} : + x ∈ cubeSet Q ↔ + ∀ i : Fin d, cubeCoordLower Q i ≤ x i ∧ x i < cubeCoordUpper Q i := by + constructor + · intro hx i + simpa [cubeCoordLower, cubeCoordUpper] using hx i + · intro hx i + simpa [cubeCoordLower, cubeCoordUpper] using hx i + +theorem mem_openOverlapCubeSet_iff_coord_bounds {d : ℕ} + {S : TriadicCube d} {x : Vec d} : + x ∈ openOverlapCubeSet S ↔ + ∀ i : Fin d, overlapCoordLower S i < x i ∧ x i < overlapCoordUpper S i := by + constructor + · intro hx i + simpa [overlapCoordLower, overlapCoordUpper] using hx i + · intro hx i + simpa [overlapCoordLower, overlapCoordUpper] using hx i + +theorem mem_overlapCubeSet_iff_coord_bounds {d : ℕ} + {S : TriadicCube d} {x : Vec d} : + x ∈ overlapCubeSet S ↔ + ∀ i : Fin d, overlapCoordLower S i ≤ x i ∧ x i < overlapCoordUpper S i := by + constructor + · intro hx i + simpa [overlapCoordLower, overlapCoordUpper] using hx i + · intro hx i + simpa [overlapCoordLower, overlapCoordUpper] using hx i + +theorem cubeScaleFactor_pos' {d : ℕ} (Q : TriadicCube d) : + 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +theorem cubeCoordUpper_eq_lower_add_scale {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeCoordUpper Q i = cubeCoordLower Q i + cubeScaleFactor Q := by + simp [cubeCoordLower, cubeCoordUpper] + ring + +theorem cubeCoordLower_child {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + cubeCoordLower + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordLower Q i + + ((digits i : ℤ) : ℝ) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) := by + simp [cubeCoordLower, cubeScaleFactor_childCube] + ring_nf + +theorem cubeCoordUpper_child {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + cubeCoordUpper + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordUpper Q i - + (((2 : ℤ) - (digits i : ℤ)) : ℝ) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) := by + simp [cubeCoordUpper, cubeScaleFactor_childCube] + ring_nf + +theorem cubeScaleFactor_child_eq_three_mul {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) : + cubeScaleFactor Q = + 3 * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) := by + rw [cubeScaleFactor_childCube Q digits] + ring + +theorem overlapCoordLower_child {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + overlapCoordLower + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordLower Q i + + ((((digits i : ℤ) : ℝ) - 1) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d)) := by + simp [overlapCoordLower, cubeCoordLower, cubeScaleFactor_childCube] + ring_nf + +theorem overlapCoordUpper_child {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + overlapCoordUpper + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordUpper Q i + + ((((digits i : ℤ) : ℝ) - 1) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } : + TriadicCube d)) := by + simp [overlapCoordUpper, cubeCoordUpper, cubeScaleFactor_childCube] + ring_nf + +theorem cubeCoordLower_descendant_eq_or_one_scale_le {d : ℕ} : + ∀ {n : ℕ} {Q R : TriadicCube d}, + R ∈ descendantsAtDepth Q n → + ∀ i : Fin d, + cubeCoordLower R i = cubeCoordLower Q i ∨ + cubeCoordLower Q i + cubeScaleFactor R ≤ cubeCoordLower R i + | 0, Q, R, hR => by + rw [descendantsAtDepth_zero] at hR + rcases Finset.mem_singleton.mp hR with rfl + intro i + exact Or.inl rfl + | n + 1, Q, R, hR => by + intro i + rcases mem_descendantsAtDepth_succ_iff.mp hR with ⟨P, hP, hRchild⟩ + rcases mem_childCubes_iff.mp hRchild with ⟨digits, rfl⟩ + let C : TriadicCube d := + { scale := P.scale - 1 + index := fun k => 3 * P.index k + (digits k : ℤ) - 1 } + have hlowerC : + cubeCoordLower C i = + cubeCoordLower P i + ((digits i : ℤ) : ℝ) * cubeScaleFactor C := by + simpa [C] using cubeCoordLower_child P digits i + have hscaleP : cubeScaleFactor P = 3 * cubeScaleFactor C := by + simpa [C] using cubeScaleFactor_child_eq_three_mul P digits + have hCpos : 0 < cubeScaleFactor C := cubeScaleFactor_pos' C + rcases cubeCoordLower_descendant_eq_or_one_scale_le hP i with hPeq | hPle + · by_cases hzero : (digits i).val = 0 + · have hdigit : (((digits i : ℤ) : ℝ)) = 0 := by + exact_mod_cast hzero + left + change cubeCoordLower C i = cubeCoordLower Q i + nlinarith [hlowerC, hPeq, hdigit] + · have hdigit_one : 1 ≤ (((digits i : ℤ) : ℝ)) := by + have hpos : 0 < (digits i).val := Nat.pos_of_ne_zero hzero + have hcast : (1 : ℤ) ≤ (digits i : ℤ) := by + exact_mod_cast hpos + exact_mod_cast hcast + right + change cubeCoordLower Q i + cubeScaleFactor C ≤ cubeCoordLower C i + nlinarith [hlowerC, hPeq, hCpos, hdigit_one] + · right + change cubeCoordLower Q i + cubeScaleFactor C ≤ cubeCoordLower C i + have hdigit_nonneg : 0 ≤ (((digits i : ℤ) : ℝ)) := by + exact_mod_cast (Nat.zero_le (digits i).val) + nlinarith [hlowerC, hPle, hscaleP, hCpos, hdigit_nonneg] + +theorem cubeCoordUpper_descendant_eq_or_one_scale_le {d : ℕ} : + ∀ {n : ℕ} {Q R : TriadicCube d}, + R ∈ descendantsAtDepth Q n → + ∀ i : Fin d, + cubeCoordUpper R i = cubeCoordUpper Q i ∨ + cubeCoordUpper R i + cubeScaleFactor R ≤ cubeCoordUpper Q i + | 0, Q, R, hR => by + rw [descendantsAtDepth_zero] at hR + rcases Finset.mem_singleton.mp hR with rfl + intro i + exact Or.inl rfl + | n + 1, Q, R, hR => by + intro i + rcases mem_descendantsAtDepth_succ_iff.mp hR with ⟨P, hP, hRchild⟩ + rcases mem_childCubes_iff.mp hRchild with ⟨digits, rfl⟩ + let C : TriadicCube d := + { scale := P.scale - 1 + index := fun k => 3 * P.index k + (digits k : ℤ) - 1 } + have hupperC : + cubeCoordUpper C i = + cubeCoordUpper P i - + (((2 : ℤ) - (digits i : ℤ)) : ℝ) * cubeScaleFactor C := by + simpa [C] using cubeCoordUpper_child P digits i + have hscaleP : cubeScaleFactor P = 3 * cubeScaleFactor C := by + simpa [C] using cubeScaleFactor_child_eq_three_mul P digits + have hCpos : 0 < cubeScaleFactor C := cubeScaleFactor_pos' C + rcases cubeCoordUpper_descendant_eq_or_one_scale_le hP i with hPeq | hPle + · by_cases htwo : (digits i).val = 2 + · have hdiff : (2 : ℝ) - (((digits i : ℤ) : ℝ)) = 0 := by + have hdigit : (((digits i : ℤ) : ℝ)) = 2 := by + exact_mod_cast htwo + nlinarith + left + change cubeCoordUpper C i = cubeCoordUpper Q i + rw [hPeq] at hupperC + let t : ℝ := (↑(2 : ℤ) : ℝ) - (((digits i : ℤ) : ℝ)) + have hupperC' : + cubeCoordUpper C i = cubeCoordUpper Q i - t * cubeScaleFactor C := by + simpa [t] using hupperC + have ht : t = 0 := by + simpa [t] using hdiff + rw [hupperC', ht] + ring + · have hdiff_one : + 1 ≤ (2 : ℝ) - (((digits i : ℤ) : ℝ)) := by + have hdle : (digits i).val ≤ 1 := by + have hdle_two : (digits i).val ≤ 2 := + Nat.le_of_lt_succ (digits i).isLt + omega + have hdle_real : (((digits i : ℤ) : ℝ)) ≤ 1 := by + exact_mod_cast hdle + nlinarith + right + change cubeCoordUpper C i + cubeScaleFactor C ≤ cubeCoordUpper Q i + rw [hPeq] at hupperC + let t : ℝ := (↑(2 : ℤ) : ℝ) - (((digits i : ℤ) : ℝ)) + have hupperC' : + cubeCoordUpper C i = cubeCoordUpper Q i - t * cubeScaleFactor C := by + simpa [t] using hupperC + have ht : 1 ≤ t := by + simpa [t] using hdiff_one + rw [hupperC'] + nlinarith [hCpos, ht] + · right + change cubeCoordUpper C i + cubeScaleFactor C ≤ cubeCoordUpper Q i + have hPnonneg : 0 ≤ cubeScaleFactor P := (cubeScaleFactor_pos' P).le + have hCnonneg : 0 ≤ cubeScaleFactor C := hCpos.le + have hdiff_nonneg : + 0 ≤ (((2 : ℤ) - (digits i : ℤ)) : ℝ) := by + have hd_le_two : (digits i : ℤ) ≤ 2 := by + exact_mod_cast Nat.le_of_lt_succ (digits i).isLt + exact_mod_cast sub_nonneg.mpr hd_le_two + nlinarith [hupperC, hPle, hscaleP, hCpos, hCnonneg, hPnonneg, + hdiff_nonneg] + +theorem cubeCoordLower_le_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {n : ℕ} + (hR : R ∈ descendantsAtDepth Q n) (i : Fin d) : + cubeCoordLower Q i ≤ cubeCoordLower R i := by + rcases cubeCoordLower_descendant_eq_or_one_scale_le hR i with hEq | hLe + · exact le_of_eq hEq.symm + · exact le_trans (by linarith [cubeScaleFactor_pos' R]) hLe + +theorem cubeCoordUpper_le_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {n : ℕ} + (hR : R ∈ descendantsAtDepth Q n) (i : Fin d) : + cubeCoordUpper R i ≤ cubeCoordUpper Q i := by + rcases cubeCoordUpper_descendant_eq_or_one_scale_le hR i with hEq | hLe + · exact le_of_eq hEq + · exact le_trans (by linarith [cubeScaleFactor_pos' R]) hLe + +theorem overlapCubeSet_child_subset_cubeSet_of_digit_safe {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) + (digits : Fin d → Fin 3) + (hlo_safe : + ∀ i : Fin d, (digits i).val = 0 → + cubeCoordLower Q i + cubeScaleFactor R ≤ cubeCoordLower R i) + (hhi_safe : + ∀ i : Fin d, (digits i).val = 2 → + cubeCoordUpper R i + cubeScaleFactor R ≤ cubeCoordUpper Q i) : + overlapCubeSet + ({ scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } : + TriadicCube d) ⊆ cubeSet Q := by + intro y hy i + let S : TriadicCube d := + { scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } + have hyS : y ∈ overlapCubeSet S := by + simpa [S] using hy + have hyi := (mem_overlapCubeSet_iff_coord_bounds.mp hyS i) + have hSscale : cubeScaleFactor S = cubeScaleFactor R / 3 := by + simp [S, cubeScaleFactor_childCube R digits] + have hSlower : + overlapCoordLower S i = + cubeCoordLower R i + + ((((digits i : ℤ) : ℝ) - 1) * cubeScaleFactor S) := by + simpa [S] using overlapCoordLower_child R digits i + have hSupper : + overlapCoordUpper S i = + cubeCoordUpper R i + + ((((digits i : ℤ) : ℝ) - 1) * cubeScaleFactor S) := by + simpa [S] using overlapCoordUpper_child R digits i + have hQlowerR : cubeCoordLower Q i ≤ cubeCoordLower R i := + cubeCoordLower_le_of_mem_descendantsAtDepth hR i + have hRupperQ : cubeCoordUpper R i ≤ cubeCoordUpper Q i := + cubeCoordUpper_le_of_mem_descendantsAtDepth hR i + have hRscale_pos : 0 < cubeScaleFactor R := cubeScaleFactor_pos' R + have hSscale_pos : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + constructor + · have hlower_overlap : cubeCoordLower Q i ≤ overlapCoordLower S i := by + by_cases hzero : (digits i).val = 0 + · have hsafe := hlo_safe i hzero + have hdigit : (((digits i : ℤ) : ℝ)) = 0 := by + exact_mod_cast hzero + rw [hSlower, hSscale] + nlinarith [hsafe, hRscale_pos, hdigit] + · have hdigit_one : 1 ≤ (((digits i : ℤ) : ℝ)) := by + have hpos : 0 < (digits i).val := Nat.pos_of_ne_zero hzero + have hcast : (1 : ℤ) ≤ (digits i : ℤ) := by + exact_mod_cast hpos + exact_mod_cast hcast + rw [hSlower] + nlinarith [hQlowerR, hSscale_pos, hdigit_one] + exact le_trans hlower_overlap hyi.1 + · have hupper_overlap : overlapCoordUpper S i ≤ cubeCoordUpper Q i := by + by_cases htwo : (digits i).val = 2 + · have hsafe := hhi_safe i htwo + have hdigit : (((digits i : ℤ) : ℝ)) = 2 := by + exact_mod_cast htwo + rw [hSupper, hSscale] + nlinarith [hsafe, hRscale_pos, hdigit] + · have hdigit_le_one : (((digits i : ℤ) : ℝ)) ≤ 1 := by + have hdle : (digits i).val ≤ 1 := by + have hdle_two : (digits i).val ≤ 2 := + Nat.le_of_lt_succ (digits i).isLt + omega + exact_mod_cast hdle + rw [hSupper] + nlinarith [hRupperQ, hSscale_pos, hdigit_le_one] + exact lt_of_lt_of_le hyi.2 hupper_overlap + +noncomputable def plateauChildDigit {d : ℕ} + (Q R : TriadicCube d) (x : Vec d) (i : Fin d) : Fin 3 := + if x i < cubeCoordLower R i + cubeScaleFactor R / 3 then + if cubeCoordLower R i = cubeCoordLower Q i then + (1 : Fin 3) + else + (0 : Fin 3) + else if x i < cubeCoordLower R i + 2 * cubeScaleFactor R / 3 then + (1 : Fin 3) + else if cubeCoordUpper R i = cubeCoordUpper Q i then + (1 : Fin 3) + else + (2 : Fin 3) + +theorem plateauChildDigit_zero_safe {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} {x : Vec d} {i : Fin d} + (hR : R ∈ descendantsAtDepth Q j) + (hzero : (plateauChildDigit Q R x i).val = 0) : + cubeCoordLower Q i + cubeScaleFactor R ≤ cubeCoordLower R i := by + rcases cubeCoordLower_descendant_eq_or_one_scale_le hR i with hEq | hSep + · exfalso + by_cases hleft : x i < cubeCoordLower R i + cubeScaleFactor R / 3 + · have hval : (plateauChildDigit Q R x i).val = 1 := by + have hleftQ : x i < cubeCoordLower Q i + cubeScaleFactor R / 3 := by + simpa [hEq] using hleft + simp [plateauChildDigit, hleftQ, hEq] + omega + · by_cases hmid : x i < cubeCoordLower R i + 2 * cubeScaleFactor R / 3 + · have hval : (plateauChildDigit Q R x i).val = 1 := by + simp [plateauChildDigit, hleft, hmid] + omega + · by_cases hupper : cubeCoordUpper R i = cubeCoordUpper Q i + · have hval : (plateauChildDigit Q R x i).val = 1 := by + simp [plateauChildDigit, hleft, hmid, hupper] + omega + · have hval : (plateauChildDigit Q R x i).val = 2 := by + simp [plateauChildDigit, hleft, hmid, hupper] + omega + · exact hSep + +theorem plateauChildDigit_two_safe {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} {x : Vec d} {i : Fin d} + (hR : R ∈ descendantsAtDepth Q j) + (htwo : (plateauChildDigit Q R x i).val = 2) : + cubeCoordUpper R i + cubeScaleFactor R ≤ cubeCoordUpper Q i := by + rcases cubeCoordUpper_descendant_eq_or_one_scale_le hR i with hEq | hSep + · exfalso + by_cases hleft : x i < cubeCoordLower R i + cubeScaleFactor R / 3 + · by_cases hlower : cubeCoordLower R i = cubeCoordLower Q i + · have hval : (plateauChildDigit Q R x i).val = 1 := by + have hleftQ : x i < cubeCoordLower Q i + cubeScaleFactor R / 3 := by + simpa [hlower] using hleft + simp [plateauChildDigit, hleftQ, hlower] + omega + · have hval : (plateauChildDigit Q R x i).val = 0 := by + simp [plateauChildDigit, hleft, hlower] + omega + · by_cases hmid : x i < cubeCoordLower R i + 2 * cubeScaleFactor R / 3 + · have hval : (plateauChildDigit Q R x i).val = 1 := by + simp [plateauChildDigit, hleft, hmid] + omega + · have hval : (plateauChildDigit Q R x i).val = 1 := by + simp [plateauChildDigit, hleft, hmid, hEq] + omega + · exact hSep + +noncomputable def plateauChildCube {d : ℕ} + (Q R : TriadicCube d) (x : Vec d) : TriadicCube d := + { scale := R.scale - 1 + index := fun i => 3 * R.index i + (plateauChildDigit Q R x i : ℤ) - 1 } + +theorem plateauChildCube_mem_childCubes {d : ℕ} + (Q R : TriadicCube d) (x : Vec d) : + plateauChildCube Q R x ∈ childCubes R := by + rw [mem_childCubes_iff] + exact ⟨plateauChildDigit Q R x, rfl⟩ + +theorem plateauChildCube_mem_overlapCentersAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) : + plateauChildCube Q R x ∈ overlapCentersAtDepth Q j := by + rw [mem_overlapCentersAtDepth_iff] + refine ⟨?_, ?_⟩ + · rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr + ⟨R, hR, plateauChildCube_mem_childCubes Q R x⟩ + · simpa [plateauChildCube] using + overlapCubeSet_child_subset_cubeSet_of_digit_safe + hR (plateauChildDigit Q R x) + (fun i hzero => plateauChildDigit_zero_safe hR hzero) + (fun i htwo => plateauChildDigit_two_safe hR htwo) + +theorem contDiff_lowerOverlapArgument {d : ℕ} + (S : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => (x i - overlapCoordLower S i) / cubeScaleFactor S) := by + fun_prop + +theorem contDiff_upperOverlapArgument {d : ℕ} + (S : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => (overlapCoordUpper S i - x i) / cubeScaleFactor S) := by + fun_prop + +noncomputable def lowerOverlapTransition {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : ℝ := + if overlapCoordLower S i ≤ cubeCoordLower Q i then + 1 + else + smoothTransitionProfile ((x i - overlapCoordLower S i) / cubeScaleFactor S) + +noncomputable def upperOverlapTransition {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : ℝ := + if cubeCoordUpper Q i ≤ overlapCoordUpper S i then + 1 + else + smoothTransitionProfile ((overlapCoordUpper S i - x i) / cubeScaleFactor S) + +theorem contDiff_lowerOverlapTransition {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (lowerOverlapTransition Q S i) := by + unfold lowerOverlapTransition + split + · exact contDiff_const + · exact smoothTransitionProfile.smooth.comp + (contDiff_lowerOverlapArgument S i) + +theorem contDiff_upperOverlapTransition {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (upperOverlapTransition Q S i) := by + unfold upperOverlapTransition + split + · exact contDiff_const + · exact smoothTransitionProfile.smooth.comp + (contDiff_upperOverlapArgument S i) + +theorem lowerOverlapTransition_nonneg {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + 0 ≤ lowerOverlapTransition Q S i x := by + unfold lowerOverlapTransition + split + · norm_num + · exact smoothTransitionProfile.nonneg _ + +theorem upperOverlapTransition_nonneg {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + 0 ≤ upperOverlapTransition Q S i x := by + unfold upperOverlapTransition + split + · norm_num + · exact smoothTransitionProfile.nonneg _ + +theorem lowerOverlapTransition_le_one {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + lowerOverlapTransition Q S i x ≤ 1 := by + unfold lowerOverlapTransition + split + · norm_num + · exact smoothTransitionProfile.le_one _ + +theorem upperOverlapTransition_le_one {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + upperOverlapTransition Q S i x ≤ 1 := by + unfold upperOverlapTransition + split + · norm_num + · exact smoothTransitionProfile.le_one _ + +theorem fderiv_lowerOverlapTransition_eq_zero_of_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hx : x i ≤ overlapCoordLower S i) : + fderiv ℝ (lowerOverlapTransition Q S i) x = 0 := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · have hfun : lowerOverlapTransition Q S i = fun _ : Vec d => (1 : ℝ) := by + funext y + simp [lowerOverlapTransition, hboundary] + rw [hfun] + simp + · have harg : + (x i - overlapCoordLower S i) / cubeScaleFactor S ≤ 0 := by + have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + exact div_nonpos_of_nonpos_of_nonneg (by linarith) hscale.le + have harg_diff : + DifferentiableAt ℝ + (fun y : Vec d => (y i - overlapCoordLower S i) / cubeScaleFactor S) x := by + fun_prop + have hprofile_diff : + DifferentiableAt ℝ smoothTransitionProfile + ((x i - overlapCoordLower S i) / cubeScaleFactor S) := + smoothTransitionProfile.smooth.differentiable (by simp) _ + have hprofile_zero : + fderiv ℝ smoothTransitionProfile + ((x i - overlapCoordLower S i) / cubeScaleFactor S) = 0 := by + rw [← toSpanSingleton_deriv, + smoothTransitionProfile.deriv_zero_of_nonpos harg] + apply ContinuousLinearMap.ext + intro r + simp + have hfun : + lowerOverlapTransition Q S i = + fun y : Vec d => + smoothTransitionProfile ((y i - overlapCoordLower S i) / cubeScaleFactor S) := by + funext y + simp [lowerOverlapTransition, hboundary] + rw [hfun] + rw [fderiv_fun_comp (x := x) hprofile_diff harg_diff] + simp [hprofile_zero] + +theorem fderiv_upperOverlapTransition_eq_zero_of_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hx : overlapCoordUpper S i ≤ x i) : + fderiv ℝ (upperOverlapTransition Q S i) x = 0 := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · have hfun : upperOverlapTransition Q S i = fun _ : Vec d => (1 : ℝ) := by + funext y + simp [upperOverlapTransition, hboundary] + rw [hfun] + simp + · have harg : + (overlapCoordUpper S i - x i) / cubeScaleFactor S ≤ 0 := by + have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + exact div_nonpos_of_nonpos_of_nonneg (by linarith) hscale.le + have harg_diff : + DifferentiableAt ℝ + (fun y : Vec d => (overlapCoordUpper S i - y i) / cubeScaleFactor S) x := by + fun_prop + have hprofile_diff : + DifferentiableAt ℝ smoothTransitionProfile + ((overlapCoordUpper S i - x i) / cubeScaleFactor S) := + smoothTransitionProfile.smooth.differentiable (by simp) _ + have hprofile_zero : + fderiv ℝ smoothTransitionProfile + ((overlapCoordUpper S i - x i) / cubeScaleFactor S) = 0 := by + rw [← toSpanSingleton_deriv, + smoothTransitionProfile.deriv_zero_of_nonpos harg] + apply ContinuousLinearMap.ext + intro r + simp + have hfun : + upperOverlapTransition Q S i = + fun y : Vec d => + smoothTransitionProfile ((overlapCoordUpper S i - y i) / cubeScaleFactor S) := by + funext y + simp [upperOverlapTransition, hboundary] + rw [hfun] + rw [fderiv_fun_comp (x := x) hprofile_diff harg_diff] + simp [hprofile_zero] + +theorem lowerOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : x i ≤ overlapCoordLower S i) : + lowerOverlapTransition Q S i x = 0 := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · have hxQ_i := (mem_openCubeSet_iff_coord_bounds.mp hxQ i).1 + exfalso + linarith + · have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + have harg : + (x i - overlapCoordLower S i) / cubeScaleFactor S ≤ 0 := + div_nonpos_of_nonpos_of_nonneg (by linarith) hscale.le + simpa [lowerOverlapTransition, hboundary] using + smoothTransitionProfile.zero_of_nonpos harg + +theorem upperOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : overlapCoordUpper S i ≤ x i) : + upperOverlapTransition Q S i x = 0 := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · have hxQ_i := (mem_openCubeSet_iff_coord_bounds.mp hxQ i).2 + exfalso + linarith + · have hscale : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + have harg : + (overlapCoordUpper S i - x i) / cubeScaleFactor S ≤ 0 := + div_nonpos_of_nonpos_of_nonneg (by linarith) hscale.le + simpa [upperOverlapTransition, hboundary] using + smoothTransitionProfile.zero_of_nonpos harg + +theorem overlapTransitionFactor_eq_zero_of_lower_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : x i ≤ overlapCoordLower S i) : + lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x = 0 := by + rw [lowerOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le hxQ hx] + ring + +theorem overlapTransitionFactor_eq_zero_of_upper_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : overlapCoordUpper S i ≤ x i) : + lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x = 0 := by + rw [upperOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le hxQ hx] + ring + +theorem overlapTransitionFactor_nonneg {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + 0 ≤ lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x := + mul_nonneg + (lowerOverlapTransition_nonneg Q S i x) + (upperOverlapTransition_nonneg Q S i x) + +theorem overlapTransitionFactor_le_one {d : ℕ} + (Q S : TriadicCube d) (i : Fin d) (x : Vec d) : + lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x ≤ 1 := + mul_le_one₀ + (lowerOverlapTransition_le_one Q S i x) + (upperOverlapTransition_nonneg Q S i x) + (upperOverlapTransition_le_one Q S i x) + +theorem fderiv_overlapTransitionFactor_eq_zero_of_lower_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : x i ≤ overlapCoordLower S i) : + fderiv ℝ + (fun y : Vec d => + lowerOverlapTransition Q S i y * upperOverlapTransition Q S i y) x = 0 := by + have hl_diff : + DifferentiableAt ℝ (lowerOverlapTransition Q S i) x := + (contDiff_lowerOverlapTransition Q S i).differentiable (by simp) x + have hu_diff : + DifferentiableAt ℝ (upperOverlapTransition Q S i) x := + (contDiff_upperOverlapTransition Q S i).differentiable (by simp) x + rw [fderiv_fun_mul hl_diff hu_diff] + have hl_zero : + lowerOverlapTransition Q S i x = 0 := + lowerOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le hxQ hx + have hlderiv_zero : + fderiv ℝ (lowerOverlapTransition Q S i) x = 0 := + fderiv_lowerOverlapTransition_eq_zero_of_coord_le hx + simp [hl_zero, hlderiv_zero] + +theorem fderiv_overlapTransitionFactor_eq_zero_of_upper_coord_le {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) + (hx : overlapCoordUpper S i ≤ x i) : + fderiv ℝ + (fun y : Vec d => + lowerOverlapTransition Q S i y * upperOverlapTransition Q S i y) x = 0 := by + have hl_diff : + DifferentiableAt ℝ (lowerOverlapTransition Q S i) x := + (contDiff_lowerOverlapTransition Q S i).differentiable (by simp) x + have hu_diff : + DifferentiableAt ℝ (upperOverlapTransition Q S i) x := + (contDiff_upperOverlapTransition Q S i).differentiable (by simp) x + rw [fderiv_fun_mul hl_diff hu_diff] + have hu_zero : + upperOverlapTransition Q S i x = 0 := + upperOverlapTransition_eq_zero_of_mem_openCubeSet_coord_le hxQ hx + have huderiv_zero : + fderiv ℝ (upperOverlapTransition Q S i) x = 0 := + fderiv_upperOverlapTransition_eq_zero_of_coord_le hx + simp [hu_zero, huderiv_zero] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionWeights.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionWeights.lean new file mode 100644 index 0000000000..bede2a70d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PartitionWeights.lean @@ -0,0 +1,952 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionDerivatives + +/-! # Partition Weights -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Raw relative overlap weight before normalization. It is only meant to be +used for retained centers; off the retained set it is exactly zero so that +later finite sums can range over all cubes without changing values. -/ +noncomputable def rawOverlapWeight {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) (x : Vec d) : ℝ := + if S ∈ overlapCentersAtDepth Q j then + ∏ i : Fin d, + lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x + else + 0 + +theorem rawOverlapWeight_zero_of_not_mem {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∉ overlapCentersAtDepth Q j) : + ∀ x : Vec d, rawOverlapWeight Q j S x = 0 := by + intro x + simp [rawOverlapWeight, hS] + +theorem contDiff_rawOverlapWeight {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) : + ContDiff ℝ (⊤ : ℕ∞) (rawOverlapWeight Q j S) := by + unfold rawOverlapWeight + split + · exact contDiff_prod fun i _ => + (contDiff_lowerOverlapTransition Q S i).mul + (contDiff_upperOverlapTransition Q S i) + · exact contDiff_const + +theorem rawOverlapWeight_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) (x : Vec d) : + 0 ≤ rawOverlapWeight Q j S x := by + unfold rawOverlapWeight + split + · exact Finset.prod_nonneg fun i _ => + mul_nonneg + (lowerOverlapTransition_nonneg Q S i x) + (upperOverlapTransition_nonneg Q S i x) + · norm_num + +theorem rawOverlapWeight_le_one {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) (x : Vec d) : + rawOverlapWeight Q j S x ≤ 1 := by + unfold rawOverlapWeight + split + · exact Finset.prod_le_one + (fun i _ => + mul_nonneg + (lowerOverlapTransition_nonneg Q S i x) + (upperOverlapTransition_nonneg Q S i x)) + (fun i _ => + mul_le_one₀ + (lowerOverlapTransition_le_one Q S i x) + (upperOverlapTransition_nonneg Q S i x) + (upperOverlapTransition_le_one Q S i x)) + · norm_num + +theorem rawOverlapWeight_support_subset {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hne : rawOverlapWeight Q j S x ≠ 0) : + x ∈ openOverlapCubeSet S := by + rw [mem_openOverlapCubeSet_iff_coord_bounds] + intro i + have hprod : + (∏ k : Fin d, + lowerOverlapTransition Q S k x * upperOverlapTransition Q S k x) ≠ 0 := by + simpa [rawOverlapWeight, hS] using hne + have hfactor : + lowerOverlapTransition Q S i x * upperOverlapTransition Q S i x ≠ 0 := by + exact Finset.prod_ne_zero_iff.mp hprod i (Finset.mem_univ i) + have hlower_ne : lowerOverlapTransition Q S i x ≠ 0 := + left_ne_zero_of_mul hfactor + have hupper_ne : upperOverlapTransition Q S i x ≠ 0 := + right_ne_zero_of_mul hfactor + exact ⟨lowerOverlapTransition_ne_zero_coord_lt hxQ hlower_ne, + upperOverlapTransition_ne_zero_coord_lt hxQ hupper_ne⟩ + +theorem rawOverlapWeight_support_subset_overlapCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hne : rawOverlapWeight Q j S x ≠ 0) : + x ∈ overlapCubeSet S := + openOverlapCubeSet_subset_overlapCubeSet S + (rawOverlapWeight_support_subset hS hxQ hne) + +theorem rawOverlapWeight_eq_zero_of_not_mem_overlapCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hxS : x ∉ overlapCubeSet S) : + rawOverlapWeight Q j S x = 0 := by + by_contra hne + exact hxS (rawOverlapWeight_support_subset_overlapCubeSet hS hxQ hne) + +theorem exists_coord_le_or_upper_le_of_not_mem_overlapCubeSet {d : ℕ} + {S : TriadicCube d} {x : Vec d} + (hxS : x ∉ overlapCubeSet S) : + ∃ i : Fin d, + x i ≤ overlapCoordLower S i ∨ overlapCoordUpper S i ≤ x i := by + have hnot : + ¬ ∀ i : Fin d, + overlapCoordLower S i ≤ x i ∧ x i < overlapCoordUpper S i := by + intro hx + exact hxS (mem_overlapCubeSet_iff_coord_bounds.2 hx) + rcases not_forall.mp hnot with ⟨i, hi⟩ + refine ⟨i, ?_⟩ + by_cases hlo : overlapCoordLower S i ≤ x i + · right + have hnot_upper : ¬ x i < overlapCoordUpper S i := by + intro hupper + exact hi ⟨hlo, hupper⟩ + exact le_of_not_gt hnot_upper + · left + exact le_of_not_ge hlo + +theorem rawOverlapWeight_fderiv_eq_zero_of_not_mem_overlapCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hxS : x ∉ overlapCubeSet S) : + fderiv ℝ (rawOverlapWeight Q j S) x = 0 := by + classical + rcases exists_coord_le_or_upper_le_of_not_mem_overlapCubeSet hxS with + ⟨a, ha⟩ + let factor : Fin d → Vec d → ℝ := + fun i y => lowerOverlapTransition Q S i y * upperOverlapTransition Q S i y + have hfactor_zero : factor a x = 0 := by + rcases ha with hlo | hhi + · exact overlapTransitionFactor_eq_zero_of_lower_coord_le hxQ hlo + · exact overlapTransitionFactor_eq_zero_of_upper_coord_le hxQ hhi + have hfactor_deriv_zero : fderiv ℝ (factor a) x = 0 := by + rcases ha with hlo | hhi + · exact fderiv_overlapTransitionFactor_eq_zero_of_lower_coord_le hxQ hlo + · exact fderiv_overlapTransitionFactor_eq_zero_of_upper_coord_le hxQ hhi + have hfactor_diff : + ∀ i : Fin d, DifferentiableAt ℝ (factor i) x := by + intro i + exact + ((contDiff_lowerOverlapTransition Q S i).mul + (contDiff_upperOverlapTransition Q S i)).differentiable (by simp) x + have hraw_fun : + rawOverlapWeight Q j S = + fun y : Vec d => ∏ i : Fin d, factor i y := by + funext y + simp [rawOverlapWeight, hS, factor] + rw [hraw_fun] + rw [fderiv_finsetProd (u := (Finset.univ : Finset (Fin d))) + (g := fun i y => factor i y)] + · apply Finset.sum_eq_zero + intro i _hi + by_cases hia : i = a + · subst i + simp [hfactor_deriv_zero] + · have hprod_zero : + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x) = 0 := by + have ha_mem : a ∈ (Finset.univ : Finset (Fin d)).erase i := by + rw [Finset.mem_erase] + exact ⟨fun hai => hia hai.symm, Finset.mem_univ a⟩ + exact Finset.prod_eq_zero ha_mem hfactor_zero + simp [hprod_zero] + · intro i _hi + exact hfactor_diff i + +theorem norm_fderiv_rawOverlapWeight_le {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) : + ‖fderiv ℝ (rawOverlapWeight Q j S) x‖ ≤ + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) := by + classical + let factor : Fin d → Vec d → ℝ := + fun i y => lowerOverlapTransition Q S i y * upperOverlapTransition Q S i y + have hfactor_diff : + ∀ i : Fin d, DifferentiableAt ℝ (factor i) x := by + intro i + exact + ((contDiff_lowerOverlapTransition Q S i).mul + (contDiff_upperOverlapTransition Q S i)).differentiable (by simp) x + have hraw_fun : + rawOverlapWeight Q j S = + fun y : Vec d => ∏ i : Fin d, factor i y := by + funext y + simp [rawOverlapWeight, hS, factor] + rw [hraw_fun] + rw [fderiv_finsetProd (u := (Finset.univ : Finset (Fin d))) + (g := fun i y => factor i y)] + · calc + ‖∑ i ∈ (Finset.univ : Finset (Fin d)), + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x) • + fderiv ℝ (factor i) x‖ + ≤ + ∑ i ∈ (Finset.univ : Finset (Fin d)), + ‖(∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x) • + fderiv ℝ (factor i) x‖ := by + simpa using + norm_sum_le + (s := (Finset.univ : Finset (Fin d))) + (f := fun i => + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x) • + fderiv ℝ (factor i) x) + _ ≤ + ∑ _i ∈ (Finset.univ : Finset (Fin d)), + 2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + apply Finset.sum_le_sum + intro i _hi + rw [norm_smul] + have hprod_nonneg : + 0 ≤ ∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x := + Finset.prod_nonneg fun j _hj => + overlapTransitionFactor_nonneg Q S j x + have hprod_le_one : + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x) ≤ 1 := + Finset.prod_le_one + (fun j _hj => overlapTransitionFactor_nonneg Q S j x) + (fun j _hj => overlapTransitionFactor_le_one Q S j x) + have hprod_norm_le : + ‖∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x‖ ≤ 1 := by + rw [Real.norm_eq_abs, abs_of_nonneg hprod_nonneg] + exact hprod_le_one + have hbound : + ‖fderiv ℝ (factor i) x‖ ≤ + 2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹ := by + simpa [factor] using norm_fderiv_overlapTransitionFactor_le Q S i x + calc + ‖∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, factor j x‖ * + ‖fderiv ℝ (factor i) x‖ + ≤ + 1 * + (2 * smoothTransitionProfile.derivBound * + (cubeScaleFactor S)⁻¹) := + mul_le_mul hprod_norm_le hbound + (norm_nonneg _) + (by norm_num) + _ = 2 * smoothTransitionProfile.derivBound * + (cubeScaleFactor S)⁻¹ := by + ring + _ = + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) := by + simp [Finset.sum_const, nsmul_eq_mul] + · intro i _hi + exact hfactor_diff i + +theorem abs_rawOverlapWeight_coordDeriv_le {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) : + |euclideanCoordDeriv i (rawOverlapWeight Q j S) x| ≤ + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) := by + have happly : + ‖(fderiv ℝ (rawOverlapWeight Q j S) x) (basisVec i)‖ ≤ + ‖fderiv ℝ (rawOverlapWeight Q j S) x‖ * ‖basisVec i‖ := + (fderiv ℝ (rawOverlapWeight Q j S) x).le_opNorm (basisVec i) + calc + |euclideanCoordDeriv i (rawOverlapWeight Q j S) x| + = ‖(fderiv ℝ (rawOverlapWeight Q j S) x) (basisVec i)‖ := by + simp [euclideanCoordDeriv, Real.norm_eq_abs] + _ ≤ ‖fderiv ℝ (rawOverlapWeight Q j S) x‖ * ‖basisVec i‖ := happly + _ = ‖fderiv ℝ (rawOverlapWeight Q j S) x‖ := by + rw [norm_basisVec, mul_one] + _ ≤ (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * (cubeScaleFactor S)⁻¹) := + norm_fderiv_rawOverlapWeight_le hS + +theorem abs_rawOverlapWeight_coordDeriv_le_depthScale {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) : + |euclideanCoordDeriv i (rawOverlapWeight Q j S) x| ≤ + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) := by + simpa [inv_cubeScaleFactor_eq_three_mul_inv_depthScale_of_mem_overlapCentersAtDepth hS] + using abs_rawOverlapWeight_coordDeriv_le i hS + +theorem rawOverlapWeight_coordDeriv_eq_zero_of_not_mem_overlapCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hxS : x ∉ overlapCubeSet S) : + euclideanCoordDeriv i (rawOverlapWeight Q j S) x = 0 := by + unfold euclideanCoordDeriv + rw [rawOverlapWeight_fderiv_eq_zero_of_not_mem_overlapCubeSet hS hxQ hxS] + simp + +theorem lowerOverlapTransition_pos_of_mem_openOverlap {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxS : x ∈ openOverlapCubeSet S) : + 0 < lowerOverlapTransition Q S i x := by + by_cases hboundary : overlapCoordLower S i ≤ cubeCoordLower Q i + · simp [lowerOverlapTransition, hboundary] + · have hx_lower := (mem_openOverlapCubeSet_iff_coord_bounds.mp hxS i).1 + have hscale : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have harg : + 0 < (x i - overlapCoordLower S i) / cubeScaleFactor S := by + exact div_pos (sub_pos.mpr hx_lower) hscale + simpa [lowerOverlapTransition, hboundary] using + smoothTransitionProfile.pos_of_pos harg + +theorem upperOverlapTransition_pos_of_mem_openOverlap {d : ℕ} + {Q S : TriadicCube d} {i : Fin d} {x : Vec d} + (hxS : x ∈ openOverlapCubeSet S) : + 0 < upperOverlapTransition Q S i x := by + by_cases hboundary : cubeCoordUpper Q i ≤ overlapCoordUpper S i + · simp [upperOverlapTransition, hboundary] + · have hx_upper := (mem_openOverlapCubeSet_iff_coord_bounds.mp hxS i).2 + have hscale : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have harg : + 0 < (overlapCoordUpper S i - x i) / cubeScaleFactor S := by + exact div_pos (sub_pos.mpr hx_upper) hscale + simpa [upperOverlapTransition, hboundary] using + smoothTransitionProfile.pos_of_pos harg + +theorem rawOverlapWeight_pos_of_mem_openOverlap {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxS : x ∈ openOverlapCubeSet S) : + 0 < rawOverlapWeight Q j S x := by + simp only [rawOverlapWeight, if_pos hS] + exact Finset.prod_pos fun i _ => + mul_pos + (lowerOverlapTransition_pos_of_mem_openOverlap (Q := Q) hxS) + (upperOverlapTransition_pos_of_mem_openOverlap (Q := Q) hxS) + +theorem rawOverlapWeight_plateauChildCube_eq_one {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hxR : x ∈ cubeSet R) : + rawOverlapWeight Q j (plateauChildCube Q R x) x = 1 := by + have hS : plateauChildCube Q R x ∈ overlapCentersAtDepth Q j := + plateauChildCube_mem_overlapCentersAtDepth hR + have hprod : + (∏ i : Fin d, + lowerOverlapTransition Q (plateauChildCube Q R x) i x * + upperOverlapTransition Q (plateauChildCube Q R x) i x) = 1 := by + simp [lowerOverlapTransition_plateauChildCube_eq_one hxR, + upperOverlapTransition_plateauChildCube_eq_one hxR] + simp [rawOverlapWeight, hS, hprod] + +/-- Denominator of the normalized overlap partition planned for Stage 7. -/ +noncomputable def rawOverlapWeightDenom {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : ℝ := + (overlapCentersAtDepth Q j).sum fun S => rawOverlapWeight Q j S x + +theorem rawOverlapWeightDenom_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : + 0 ≤ rawOverlapWeightDenom Q j x := by + dsimp [rawOverlapWeightDenom] + exact Finset.sum_nonneg fun S _ => rawOverlapWeight_nonneg Q j S x + +theorem contDiff_rawOverlapWeightDenom {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + ContDiff ℝ (⊤ : ℕ∞) (rawOverlapWeightDenom Q j) := by + unfold rawOverlapWeightDenom + exact ContDiff.sum fun S _hS => contDiff_rawOverlapWeight Q j S + +theorem rawOverlapWeightDenom_coordDeriv_eq_sum {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) (i : Fin d) : + euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x = + (overlapCentersAtDepth Q j).sum + (fun S => euclideanCoordDeriv i (rawOverlapWeight Q j S) x) := by + unfold euclideanCoordDeriv rawOverlapWeightDenom + rw [fderiv_fun_sum] + · simp + · intro S _hS + exact (contDiff_rawOverlapWeight Q j S).differentiable (by simp) x + +theorem abs_rawOverlapWeightDenom_coordDeriv_le {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) (i : Fin d) : + |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| ≤ + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹))) := by + classical + let A : TriadicCube d → ℝ := + fun S => euclideanCoordDeriv i (rawOverlapWeight Q j S) x + let B : ℝ := + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) + have hB_nonneg : 0 ≤ B := by + have hdepth_pos : 0 < cubeScaleFactor Q / (3 : ℝ) ^ j := by + exact div_pos (cubeScaleFactor_pos' Q) (pow_pos (by norm_num : (0 : ℝ) < 3) j) + dsimp [B] + exact mul_nonneg + (by positivity) + (mul_nonneg + (mul_nonneg (by norm_num) smoothTransitionProfile.derivBound_nonneg) + (mul_nonneg (by norm_num) (inv_nonneg.mpr hdepth_pos.le))) + have hsum_abs : + (overlapCentersAtDepth Q j).sum (fun S => |A S|) = + (overlapCentersAtDepthContaining Q j x).sum (fun S => |A S|) := by + symm + apply Finset.sum_subset + · intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp hS).1 + · intro S hSD hSnot + have hxS : x ∉ overlapCubeSet S := by + intro hxS + exact hSnot (mem_overlapCentersAtDepthContaining_iff.2 ⟨hSD, hxS⟩) + have hzero : + A S = 0 := by + dsimp [A] + exact rawOverlapWeight_coordDeriv_eq_zero_of_not_mem_overlapCubeSet + i hSD hxQ hxS + simp [hzero] + have hactive_bound : + (overlapCentersAtDepthContaining Q j x).sum (fun S => |A S|) ≤ + ((overlapCentersAtDepthContaining Q j x).card : ℝ) * B := by + have hsum := + Finset.sum_le_card_nsmul + (overlapCentersAtDepthContaining Q j x) + (fun S => |A S|) + B + (by + intro S hS + have hS_center : S ∈ overlapCentersAtDepth Q j := + (mem_overlapCentersAtDepthContaining_iff.mp hS).1 + dsimp [A, B] + exact abs_rawOverlapWeight_coordDeriv_le_depthScale i hS_center) + simpa [nsmul_eq_mul] using hsum + have hcard : + ((overlapCentersAtDepthContaining Q j x).card : ℝ) ≤ (3 ^ d : ℝ) := by + exact_mod_cast overlapCentersAtDepthContaining_card_le_pow Q j x + calc + |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| + = + |(overlapCentersAtDepth Q j).sum + (fun S => euclideanCoordDeriv i (rawOverlapWeight Q j S) x)| := by + rw [rawOverlapWeightDenom_coordDeriv_eq_sum Q j x i] + _ ≤ (overlapCentersAtDepth Q j).sum (fun S => |A S|) := by + simpa [A] using + Finset.abs_sum_le_sum_abs + (fun S => euclideanCoordDeriv i (rawOverlapWeight Q j S) x) + (overlapCentersAtDepth Q j) + _ = + (overlapCentersAtDepthContaining Q j x).sum (fun S => |A S|) := hsum_abs + _ ≤ ((overlapCentersAtDepthContaining Q j x).card : ℝ) * B := hactive_bound + _ ≤ (3 ^ d : ℝ) * B := + mul_le_mul_of_nonneg_right hcard hB_nonneg + _ = + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹))) := by + rfl + +theorem rawOverlapWeightDenom_pos_of_exists_openOverlap {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hcover : + ∃ S ∈ overlapCentersAtDepth Q j, x ∈ openOverlapCubeSet S) : + 0 < rawOverlapWeightDenom Q j x := by + rcases hcover with ⟨S, hS, hxS⟩ + dsimp [rawOverlapWeightDenom] + exact Finset.sum_pos' + (fun T _ => rawOverlapWeight_nonneg Q j T x) + ⟨S, hS, rawOverlapWeight_pos_of_mem_openOverlap hS hxS⟩ + +theorem one_le_rawOverlapWeightDenom_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + 1 ≤ rawOverlapWeightDenom Q j x := by + have hxQ_closed : x ∈ cubeSet Q := openCubeSet_subset_cubeSet Q hxQ + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet j hxQ_closed with + ⟨R, hR, hxR⟩ + let S : TriadicCube d := plateauChildCube Q R x + have hS : S ∈ overlapCentersAtDepth Q j := by + simpa [S] using plateauChildCube_mem_overlapCentersAtDepth hR + have hraw : rawOverlapWeight Q j S x = 1 := by + simpa [S] using rawOverlapWeight_plateauChildCube_eq_one hR hxR + dsimp [rawOverlapWeightDenom] + calc + 1 = rawOverlapWeight Q j S x := hraw.symm + _ ≤ (overlapCentersAtDepth Q j).sum fun T => rawOverlapWeight Q j T x := + Finset.single_le_sum + (fun T _hT => rawOverlapWeight_nonneg Q j T x) + hS + +theorem rawOverlapWeightDenom_pos_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + 0 < rawOverlapWeightDenom Q j x := + lt_of_lt_of_le zero_lt_one (one_le_rawOverlapWeightDenom_of_mem_openCubeSet hxQ) + +noncomputable def overlapWeightDenomSafe {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : ℝ := + rawOverlapWeightDenom Q j x + + smoothTransitionProfile (1 - rawOverlapWeightDenom Q j x) + +theorem overlapWeightDenomSafe_eq_raw_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + overlapWeightDenomSafe Q j x = rawOverlapWeightDenom Q j x := by + have hD : 1 ≤ rawOverlapWeightDenom Q j x := + one_le_rawOverlapWeightDenom_of_mem_openCubeSet hxQ + have harg : 1 - rawOverlapWeightDenom Q j x ≤ 0 := by + linarith + simp [overlapWeightDenomSafe, smoothTransitionProfile.zero_of_nonpos harg] + +theorem overlapWeightDenomSafe_pos {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (x : Vec d) : + 0 < overlapWeightDenomSafe Q j x := by + by_cases hD : 1 ≤ rawOverlapWeightDenom Q j x + · have harg : 1 - rawOverlapWeightDenom Q j x ≤ 0 := by + linarith + simp [overlapWeightDenomSafe, smoothTransitionProfile.zero_of_nonpos harg] + exact lt_of_lt_of_le zero_lt_one hD + · have hDlt : rawOverlapWeightDenom Q j x < 1 := lt_of_not_ge hD + have harg_pos : 0 < 1 - rawOverlapWeightDenom Q j x := by + linarith + have hraw_nonneg : 0 ≤ rawOverlapWeightDenom Q j x := + rawOverlapWeightDenom_nonneg Q j x + have hprofile_pos : + 0 < smoothTransitionProfile (1 - rawOverlapWeightDenom Q j x) := + smoothTransitionProfile.pos_of_pos harg_pos + dsimp [overlapWeightDenomSafe] + linarith + +theorem contDiff_overlapWeightDenomSafe {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + ContDiff ℝ (⊤ : ℕ∞) (overlapWeightDenomSafe Q j) := by + unfold overlapWeightDenomSafe + exact (contDiff_rawOverlapWeightDenom Q j).add + (smoothTransitionProfile.smooth.comp + (contDiff_const.sub (contDiff_rawOverlapWeightDenom Q j))) + +theorem overlapWeightDenomSafe_coordDeriv_eq_raw_of_mem_openCubeSet {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) (i : Fin d) : + euclideanCoordDeriv i (overlapWeightDenomSafe Q j) x = + euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x := by + have heq : + overlapWeightDenomSafe Q j =ᶠ[nhds x] rawOverlapWeightDenom Q j := + ((isOpen_openCubeSet Q).eventually_mem hxQ).mono fun y hy => by + exact overlapWeightDenomSafe_eq_raw_of_mem_openCubeSet (Q := Q) (j := j) (x := y) hy + unfold euclideanCoordDeriv + rw [Filter.EventuallyEq.fderiv_eq heq] + +theorem abs_inv_overlapWeightDenomSafe_coordDeriv_le {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) (i : Fin d) : + |euclideanCoordDeriv i + (fun y : Vec d => (overlapWeightDenomSafe Q j y)⁻¹) x| ≤ + |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| := by + let D : Vec d → ℝ := overlapWeightDenomSafe Q j + have hD_diff : DifferentiableAt ℝ D x := + (contDiff_overlapWeightDenomSafe Q j).differentiable (by simp) x + have hD_ge : 1 ≤ D x := by + have hsafe : D x = rawOverlapWeightDenom Q j x := by + simpa [D] using overlapWeightDenomSafe_eq_raw_of_mem_openCubeSet hxQ + rw [hsafe] + exact one_le_rawOverlapWeightDenom_of_mem_openCubeSet hxQ + have hD_pos : 0 < D x := lt_of_lt_of_le zero_lt_one hD_ge + have hD_ne : D x ≠ 0 := ne_of_gt hD_pos + have hcoord : + euclideanCoordDeriv i (fun y : Vec d => (D y)⁻¹) x = + -((D x) ^ 2)⁻¹ * euclideanCoordDeriv i D x := by + unfold euclideanCoordDeriv + rw [fderiv_fun_comp (x := x) (differentiableAt_inv hD_ne) hD_diff] + rw [fderiv_inv] + simp [ContinuousLinearMap.comp_apply, smul_eq_mul, mul_comm] + have hdraw : + euclideanCoordDeriv i D x = + euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x := by + simpa [D] using overlapWeightDenomSafe_coordDeriv_eq_raw_of_mem_openCubeSet hxQ i + have hcoeff_le : |-((D x) ^ 2)⁻¹| ≤ 1 := by + have hsq_ge : 1 ≤ (D x) ^ 2 := by + nlinarith + rw [abs_neg, abs_of_nonneg (inv_nonneg.mpr (sq_nonneg (D x)))] + exact inv_le_one_of_one_le₀ hsq_ge + rw [hcoord, hdraw, abs_mul] + calc + |-((D x) ^ 2)⁻¹| * + |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| + ≤ 1 * |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| := + mul_le_mul_of_nonneg_right hcoeff_le (abs_nonneg _) + _ = |euclideanCoordDeriv i (rawOverlapWeightDenom Q j) x| := by + ring + +noncomputable def overlapPartitionWeight {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) (x : Vec d) : ℝ := + rawOverlapWeight Q j S x / overlapWeightDenomSafe Q j x + +theorem contDiff_overlapPartitionWeight {d : ℕ} + (Q S : TriadicCube d) (j : ℕ) : + ContDiff ℝ (⊤ : ℕ∞) (overlapPartitionWeight Q j S) := by + unfold overlapPartitionWeight + exact (contDiff_rawOverlapWeight Q j S).div + (contDiff_overlapWeightDenomSafe Q j) + (fun x => ne_of_gt (overlapWeightDenomSafe_pos Q j x)) + +theorem contDiffOn_overlapPartitionWeight_openCubeSet {d : ℕ} + (Q S : TriadicCube d) (j : ℕ) : + ContDiffOn ℝ 1 (overlapPartitionWeight Q j S) (openCubeSet Q) := by + exact (contDiff_overlapPartitionWeight Q S j).of_le (by simp) |>.contDiffOn + +theorem overlapPartitionWeight_coordDeriv_eq {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} (i : Fin d) : + euclideanCoordDeriv i (overlapPartitionWeight Q j S) x = + rawOverlapWeight Q j S x * + euclideanCoordDeriv i + (fun y : Vec d => (overlapWeightDenomSafe Q j y)⁻¹) x + + (overlapWeightDenomSafe Q j x)⁻¹ * + euclideanCoordDeriv i (rawOverlapWeight Q j S) x := by + let R : Vec d → ℝ := rawOverlapWeight Q j S + let I : Vec d → ℝ := fun y : Vec d => (overlapWeightDenomSafe Q j y)⁻¹ + have hR_diff : DifferentiableAt ℝ R x := + (contDiff_rawOverlapWeight Q j S).differentiable (by simp) x + have hD_diff : DifferentiableAt ℝ (overlapWeightDenomSafe Q j) x := + (contDiff_overlapWeightDenomSafe Q j).differentiable (by simp) x + have hD_ne : overlapWeightDenomSafe Q j x ≠ 0 := + ne_of_gt (overlapWeightDenomSafe_pos Q j x) + have hI_diff : DifferentiableAt ℝ I x := by + dsimp [I] + exact hD_diff.inv hD_ne + have hfun : + overlapPartitionWeight Q j S = fun y : Vec d => R y * I y := by + funext y + simp [overlapPartitionWeight, R, I, div_eq_mul_inv] + unfold euclideanCoordDeriv + rw [hfun, fderiv_fun_mul hR_diff hI_diff] + simp [R, I] + +theorem abs_overlapPartitionWeight_coordDeriv_le {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) : + |euclideanCoordDeriv i (overlapPartitionWeight Q j S) x| ≤ + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) + + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹))) := by + let B : ℝ := + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) + let E : ℝ := (3 ^ d : ℝ) * B + have hdepth_pos : 0 < cubeScaleFactor Q / (3 : ℝ) ^ j := by + exact div_pos (cubeScaleFactor_pos' Q) (pow_pos (by norm_num : (0 : ℝ) < 3) j) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact mul_nonneg + (by positivity) + (mul_nonneg + (mul_nonneg (by norm_num) smoothTransitionProfile.derivBound_nonneg) + (mul_nonneg (by norm_num) (inv_nonneg.mpr hdepth_pos.le))) + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact mul_nonneg (by positivity) hB_nonneg + let R : ℝ := rawOverlapWeight Q j S x + let D : ℝ := overlapWeightDenomSafe Q j x + let dR : ℝ := euclideanCoordDeriv i (rawOverlapWeight Q j S) x + let dI : ℝ := + euclideanCoordDeriv i + (fun y : Vec d => (overlapWeightDenomSafe Q j y)⁻¹) x + have hR_abs_le : |R| ≤ 1 := by + dsimp [R] + rw [abs_of_nonneg (rawOverlapWeight_nonneg Q j S x)] + exact rawOverlapWeight_le_one Q j S x + have hD_ge : 1 ≤ D := by + dsimp [D] + have hsafe : + overlapWeightDenomSafe Q j x = rawOverlapWeightDenom Q j x := + overlapWeightDenomSafe_eq_raw_of_mem_openCubeSet hxQ + rw [hsafe] + exact one_le_rawOverlapWeightDenom_of_mem_openCubeSet hxQ + have hD_pos : 0 < D := lt_of_lt_of_le zero_lt_one hD_ge + have hD_inv_abs_le : |D⁻¹| ≤ 1 := by + rw [abs_of_nonneg (inv_nonneg.mpr hD_pos.le)] + exact inv_le_one_of_one_le₀ hD_ge + have hdR_le : |dR| ≤ B := by + dsimp [dR, B] + exact abs_rawOverlapWeight_coordDeriv_le_depthScale i hS + have hdI_le : |dI| ≤ E := by + dsimp [dI, E, B] + exact + (abs_inv_overlapWeightDenomSafe_coordDeriv_le hxQ i).trans + (abs_rawOverlapWeightDenom_coordDeriv_le hxQ i) + have hcoord : + euclideanCoordDeriv i (overlapPartitionWeight Q j S) x = + R * dI + D⁻¹ * dR := by + dsimp [R, D, dR, dI] + exact overlapPartitionWeight_coordDeriv_eq (Q := Q) (S := S) (j := j) (x := x) i + calc + |euclideanCoordDeriv i (overlapPartitionWeight Q j S) x| + = |R * dI + D⁻¹ * dR| := by rw [hcoord] + _ ≤ |R * dI| + |D⁻¹ * dR| := abs_add_le _ _ + _ = |R| * |dI| + |D⁻¹| * |dR| := by rw [abs_mul, abs_mul] + _ ≤ 1 * E + 1 * B := by + exact add_le_add + (mul_le_mul hR_abs_le hdI_le (abs_nonneg _) (by norm_num)) + (mul_le_mul hD_inv_abs_le hdR_le (abs_nonneg _) (by norm_num)) + _ = B + E := by ring + _ = + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) + + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹))) := by + rfl + +noncomputable def smoothOverlapPartitionDerivativeConstant (d : ℕ) : ℝ := + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * 3) + + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * 3)) + +theorem smoothOverlapPartitionDerivativeConstant_nonneg (d : ℕ) : + 0 ≤ smoothOverlapPartitionDerivativeConstant d := by + unfold smoothOverlapPartitionDerivativeConstant + exact add_nonneg + (mul_nonneg + (by positivity) + (mul_nonneg + (mul_nonneg (by norm_num) smoothTransitionProfile.derivBound_nonneg) + (by norm_num))) + (mul_nonneg + (by positivity) + (mul_nonneg + (by positivity) + (mul_nonneg + (mul_nonneg (by norm_num) smoothTransitionProfile.derivBound_nonneg) + (by norm_num)))) + +theorem abs_overlapPartitionWeight_coordDeriv_le_depthScale {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) : + |euclideanCoordDeriv i (overlapPartitionWeight Q j S) x| ≤ + smoothOverlapPartitionDerivativeConstant d / + (cubeScaleFactor Q / (3 : ℝ) ^ j) := by + have hdepth_pos : 0 < cubeScaleFactor Q / (3 : ℝ) ^ j := by + exact div_pos (cubeScaleFactor_pos' Q) (pow_pos (by norm_num : (0 : ℝ) < 3) j) + calc + |euclideanCoordDeriv i (overlapPartitionWeight Q j S) x| + ≤ + (Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹)) + + (3 ^ d : ℝ) * + ((Fintype.card (Fin d) : ℝ) * + (2 * smoothTransitionProfile.derivBound * + (3 * (cubeScaleFactor Q / (3 : ℝ) ^ j)⁻¹))) := + abs_overlapPartitionWeight_coordDeriv_le i hS hxQ + _ = + smoothOverlapPartitionDerivativeConstant d / + (cubeScaleFactor Q / (3 : ℝ) ^ j) := by + dsimp [smoothOverlapPartitionDerivativeConstant] + field_simp [ne_of_gt hdepth_pos] + +theorem overlapPartitionWeight_nonneg_of_mem_openCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (_hxQ : x ∈ openCubeSet Q) : + 0 ≤ overlapPartitionWeight Q j S x := by + exact div_nonneg + (rawOverlapWeight_nonneg Q j S x) + (overlapWeightDenomSafe_pos Q j x).le + +theorem overlapPartitionWeight_zero_of_not_mem {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∉ overlapCentersAtDepth Q j) : + ∀ x : Vec d, overlapPartitionWeight Q j S x = 0 := by + intro x + simp [overlapPartitionWeight, rawOverlapWeight_zero_of_not_mem hS x] + +theorem overlapPartitionWeight_support_subset {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hne : overlapPartitionWeight Q j S x ≠ 0) : + x ∈ openOverlapCubeSet S := by + have hraw_ne : rawOverlapWeight Q j S x ≠ 0 := by + intro hraw + apply hne + simp [overlapPartitionWeight, hraw] + exact rawOverlapWeight_support_subset hS hxQ hraw_ne + +theorem overlapPartitionWeight_fderiv_eq_zero_of_not_mem_overlapCubeSet {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hxS : x ∉ overlapCubeSet S) : + fderiv ℝ (overlapPartitionWeight Q j S) x = 0 := by + have hraw_zero : + rawOverlapWeight Q j S x = 0 := + rawOverlapWeight_eq_zero_of_not_mem_overlapCubeSet hS hxQ hxS + have hraw_deriv_zero : + fderiv ℝ (rawOverlapWeight Q j S) x = 0 := + rawOverlapWeight_fderiv_eq_zero_of_not_mem_overlapCubeSet hS hxQ hxS + have hraw_diff : + DifferentiableAt ℝ (rawOverlapWeight Q j S) x := + (contDiff_rawOverlapWeight Q j S).differentiable (by simp) x + have hden_diff : + DifferentiableAt ℝ (overlapWeightDenomSafe Q j) x := + (contDiff_overlapWeightDenomSafe Q j).differentiable (by simp) x + have hden_ne : overlapWeightDenomSafe Q j x ≠ 0 := + ne_of_gt (overlapWeightDenomSafe_pos Q j x) + have hden_inv_diff : + DifferentiableAt ℝ (fun y : Vec d => (overlapWeightDenomSafe Q j y)⁻¹) x := + hden_diff.inv hden_ne + have hfun : + overlapPartitionWeight Q j S = + fun y : Vec d => + rawOverlapWeight Q j S y * (overlapWeightDenomSafe Q j y)⁻¹ := by + funext y + rw [overlapPartitionWeight, div_eq_mul_inv] + rw [hfun] + rw [fderiv_fun_mul hraw_diff hden_inv_diff] + simp [hraw_zero, hraw_deriv_zero] + +theorem overlapPartitionWeight_coordDeriv_zero_of_not_mem_overlap {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {x : Vec d} (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hxQ : x ∈ openCubeSet Q) + (hxS : x ∉ overlapCubeSet S) : + euclideanCoordDeriv i (overlapPartitionWeight Q j S) x = 0 := by + unfold euclideanCoordDeriv + rw [overlapPartitionWeight_fderiv_eq_zero_of_not_mem_overlapCubeSet hS hxQ hxS] + simp + +theorem overlapPartitionWeight_sum_eq_one {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + (overlapCentersAtDepth Q j).sum + (fun S => overlapPartitionWeight Q j S x) = 1 := by + have hden_ne : rawOverlapWeightDenom Q j x ≠ 0 := + ne_of_gt (rawOverlapWeightDenom_pos_of_mem_openCubeSet hxQ) + have hsafe : overlapWeightDenomSafe Q j x = rawOverlapWeightDenom Q j x := + overlapWeightDenomSafe_eq_raw_of_mem_openCubeSet hxQ + calc + (overlapCentersAtDepth Q j).sum + (fun S => overlapPartitionWeight Q j S x) + = + (overlapCentersAtDepth Q j).sum + (fun S => rawOverlapWeight Q j S x / rawOverlapWeightDenom Q j x) := by + simp [overlapPartitionWeight, hsafe] + _ = + rawOverlapWeightDenom Q j x / rawOverlapWeightDenom Q j x := by + rw [← Finset.sum_div] + rfl + _ = 1 := div_self hden_ne + +theorem overlapPartitionWeight_coordDeriv_sum_eq_zero {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) (i : Fin d) : + (overlapCentersAtDepth Q j).sum + (fun S => euclideanCoordDeriv i (overlapPartitionWeight Q j S) x) = 0 := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let F : Vec d → ℝ := + fun y => ∑ S ∈ D, overlapPartitionWeight Q j S y + have hsum : + fderiv ℝ F x = + ∑ S ∈ D, fderiv ℝ (overlapPartitionWeight Q j S) x := by + dsimp [F] + rw [fderiv_fun_sum] + intro S _hS + exact (contDiff_overlapPartitionWeight Q S j).differentiable (by simp) x + have hF_eventually : F =ᶠ[nhds x] fun _ : Vec d => (1 : ℝ) := by + exact ((isOpen_openCubeSet Q).eventually_mem hxQ).mono fun y hy => by + simpa [F, D] using + overlapPartitionWeight_sum_eq_one (Q := Q) (j := j) (x := y) hy + have hF_deriv_zero : fderiv ℝ F x = 0 := by + have hconst : fderiv ℝ (fun _ : Vec d => (1 : ℝ)) x = 0 := by + simp + rw [Filter.EventuallyEq.fderiv_eq hF_eventually, hconst] + have happly : + (∑ S ∈ D, fderiv ℝ (overlapPartitionWeight Q j S) x) (basisVec i) = 0 := by + rw [← hsum, hF_deriv_zero] + simp + calc + (overlapCentersAtDepth Q j).sum + (fun S => euclideanCoordDeriv i (overlapPartitionWeight Q j S) x) + = + ∑ S ∈ D, + (fderiv ℝ (overlapPartitionWeight Q j S) x) (basisVec i) := by + rfl + _ = + (∑ S ∈ D, fderiv ℝ (overlapPartitionWeight Q j S) x) (basisVec i) := by + simp + _ = 0 := happly + +theorem rawOverlapWeight_active_card_bound {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + ((overlapCentersAtDepth Q j).filter + (fun S => rawOverlapWeight Q j S x ≠ 0)).card ≤ 3 ^ d := by + refine + (Finset.card_le_card ?_).trans + (overlapCentersAtDepthContaining_card_le_pow Q j x) + intro S hS + rw [Finset.mem_filter] at hS + rw [mem_overlapCentersAtDepthContaining_iff] + exact ⟨hS.1, + rawOverlapWeight_support_subset_overlapCubeSet hS.1 hxQ hS.2⟩ + +theorem overlapPartitionWeight_active_card_bound {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {x : Vec d} + (hxQ : x ∈ openCubeSet Q) : + ((overlapCentersAtDepth Q j).filter + (fun S => overlapPartitionWeight Q j S x ≠ 0)).card ≤ 3 ^ d := by + refine + (Finset.card_le_card ?_).trans + (rawOverlapWeight_active_card_bound (Q := Q) (j := j) hxQ) + intro S hS + rw [Finset.mem_filter] at hS ⊢ + refine ⟨hS.1, ?_⟩ + intro hraw + exact hS.2 (by simp [overlapPartitionWeight, hraw]) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PositiveNorm.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PositiveNorm.lean new file mode 100644 index 0000000000..767e0e249f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PositiveNorm.lean @@ -0,0 +1,511 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PartitionWeights + +/-! # Positive Norm -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +theorem aemeasurable_overlapCubeResidualIndicator_of_memLp + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} {h : Vec d → Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hh : MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)))) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + let μS : MeasureTheory.Measure (Vec d) := + MeasureTheory.volume.restrict (overlapCubeSet S) + have hcoeff : + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (overlapCubeVolume_pos S)) + have hh_vol : AEMeasurable h μS := by + have hh_norm : AEMeasurable h (normalizedOverlapCubeMeasure S) := + hh.1.aemeasurable + simpa [μS, normalizedOverlapCubeMeasure, overlapCubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := MeasureTheory.volume.restrict (overlapCubeSet S)) + (f := h) hcoeff).1 hh_norm + have hmap : + Measurable (fun v : Vec d => + vecNormSq (v - overlapCubeAverageVec S h)) := by + unfold vecNormSq vecDot + fun_prop + have hbase : AEMeasurable + (fun y : Vec d => + ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h))) μS := by + exact (hmap.comp_aemeasurable hh_vol).ennreal_ofReal + have hsubset : overlapCubeSet S ⊆ cubeSet Q := + overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS + refine (aemeasurable_indicator_iff (measurableSet_overlapCubeSet S)).2 ?_ + rwa [MeasureTheory.Measure.restrict_restrict_of_subset hsubset] + +/-- Coordinate version of the closed-overlap fluctuation indicator +measurability lemma. -/ +theorem aemeasurable_overlapCubeCoordResidualIndicator_of_memLp + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} {h : Vec d → Vec d} + (i : Fin d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hh : MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + AEMeasurable + ((overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2))) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + let μS : MeasureTheory.Measure (Vec d) := + MeasureTheory.volume.restrict (overlapCubeSet S) + have hcoeff : + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (overlapCubeVolume_pos S)) + have hh_vol : AEMeasurable h μS := by + have hh_norm : AEMeasurable h (normalizedOverlapCubeMeasure S) := + hh.1.aemeasurable + simpa [μS, normalizedOverlapCubeMeasure, overlapCubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := MeasureTheory.volume.restrict (overlapCubeSet S)) + (f := h) hcoeff).1 hh_norm + have hmap : + Measurable (fun v : Vec d => + (v i - overlapCubeAverageVec S h i) ^ 2) := by + fun_prop + have hbase : AEMeasurable + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) μS := by + exact (hmap.comp_aemeasurable hh_vol).ennreal_ofReal + have hsubset : overlapCubeSet S ⊆ cubeSet Q := + overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS + refine (aemeasurable_indicator_iff (measurableSet_overlapCubeSet S)).2 ?_ + rwa [MeasureTheory.Measure.restrict_restrict_of_subset hsubset] + +/-- Integrated coordinate fluctuation indicators are controlled by the +vector-valued overlap fluctuation average. -/ +theorem lintegral_sum_coord_fluctuation_indicator_le_vector_average + {d : ℕ} (Q : TriadicCube d) (h : Vec d → Vec d) (j : ℕ) + (i : Fin d) + (hloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp h (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S)) : + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + classical + let D : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let scalar : TriadicCube d → Vec d → ℝ≥0∞ := + fun S y => ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2) + let vector : TriadicCube d → Vec d → ℝ≥0∞ := + fun S y => ENNReal.ofReal + (vecNormSq (h y - overlapCubeAverageVec S h)) + have hfinite : + ∫⁻ x, + D.sum (fun S => (overlapCubeSet S).indicator (scalar S) x) + ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((D.card : ℝ≥0∞)⁻¹) * + D.sum + (fun S => + ∫⁻ x, scalar S x ∂ normalizedOverlapCubeMeasure S)) := by + simpa [D, scalar] using + overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + Q j + (f := scalar) + (fun S hS => + aemeasurable_overlapCubeCoordResidualIndicator_of_memLp + (Q := Q) (j := j) (h := h) i hS (hloc S hS)) + have hscalar_le_vector : + (((D.card : ℝ≥0∞)⁻¹) * + D.sum + (fun S => + ∫⁻ x, scalar S x ∂ normalizedOverlapCubeMeasure S)) + ≤ + (((D.card : ℝ≥0∞)⁻¹) * + D.sum + (fun S => + ∫⁻ x, vector S x ∂ normalizedOverlapCubeMeasure S)) := by + refine mul_le_mul_right ?_ _ + refine Finset.sum_le_sum ?_ + intro S _hS + exact MeasureTheory.lintegral_mono fun x => by + have hcoord : + (h x i - overlapCubeAverageVec S h i) ^ 2 ≤ + vecNormSq (h x - overlapCubeAverageVec S h) := by + simpa using + sq_apply_le_vecNormSq (h x - overlapCubeAverageVec S h) i + exact ENNReal.ofReal_le_ofReal hcoord + calc + ∫⁻ x, + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeSet S).indicator + (fun y : Vec d => + ENNReal.ofReal + ((h y i - overlapCubeAverageVec S h i) ^ 2)) x) + ∂ normalizedCubeMeasure Q + ≤ + (3 ^ d : ℝ≥0∞) * + (((D.card : ℝ≥0∞)⁻¹) * + D.sum + (fun S => + ∫⁻ x, scalar S x ∂ normalizedOverlapCubeMeasure S)) := by + simpa [D, scalar] using hfinite + _ ≤ + (3 ^ d : ℝ≥0∞) * + (((D.card : ℝ≥0∞)⁻¹) * + D.sum + (fun S => + ∫⁻ x, vector S x ∂ normalizedOverlapCubeMeasure S)) := by + exact mul_le_mul_right hscalar_le_vector _ + _ = + (3 ^ d : ℝ≥0∞) * + (((overlapCentersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + ∫⁻ x, + ENNReal.ofReal + (vecNormSq (h x - overlapCubeAverageVec S h)) + ∂ normalizedOverlapCubeMeasure S)) := by + rfl + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_add_le {d : ℕ} + (Q : TriadicCube d) (u v : Vec d → Vec d) (j : ℕ) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hv : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q (fun x => u x + v x) j ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q u j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q v j := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage + calc + overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => u x + v x))) ^ 2) + ≤ + overlapCentersAverage Q j + (fun S => + 2 * (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u)) ^ 2 + + 2 * (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S v)) ^ 2) := by + refine overlapCentersAverage_le_overlapCentersAverage Q j ?_ + intro S hS + let n : ℝ := overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => u x + v x)) + let a : ℝ := overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u) + let b : ℝ := overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S v) + have hfluct : + overlapCubeFluctuationVec S (fun x => u x + v x) = + fun x => overlapCubeFluctuationVec S u x + + overlapCubeFluctuationVec S v x := + overlapCubeFluctuationVec_add_of_memLp_two S (hu S hS) (hv S hS) + have hfu : + MeasureTheory.MemLp (overlapCubeFluctuationVec S u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S u (hu S hS) + have hfv : + MeasureTheory.MemLp (overlapCubeFluctuationVec S v) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S v (hv S hS) + have hnorm : n ≤ a + b := by + dsimp [n, a, b] + rw [hfluct] + exact overlapCubeLpNorm_add_le S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u) + (overlapCubeFluctuationVec S v) hfu hfv (by norm_num) + have hn_nonneg : 0 ≤ n := by + dsimp [n] + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => u x + v x)) + have ha_nonneg : 0 ≤ a := by + dsimp [a] + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u) + have hb_nonneg : 0 ≤ b := by + dsimp [b] + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S v) + have hsq : n ^ 2 ≤ (a + b) ^ 2 := + (sq_le_sq₀ hn_nonneg (add_nonneg ha_nonneg hb_nonneg)).mpr hnorm + have hquad : (a + b) ^ 2 ≤ 2 * a ^ 2 + 2 * b ^ 2 := by + nlinarith [sq_nonneg (a - b)] + simpa [n, a, b] using le_trans hsq hquad + _ = + overlapCentersAverage Q j + (fun S => + 2 * (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u)) ^ 2) + + overlapCentersAverage Q j + (fun S => + 2 * (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S v)) ^ 2) := by + rw [overlapCentersAverage_add] + _ = + 2 * overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S u)) ^ 2) + + 2 * overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S v)) ^ 2) := by + rw [overlapCentersAverage_mul_left, overlapCentersAverage_mul_left] + +theorem cubeBesovOverlappingPositiveVectorDepthAverage_residual_le {d : ℕ} + (Q : TriadicCube d) (R : Vec d → Vec d) (j : ℕ) + (hR : MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hRloc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp R (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q R j ≤ + 4 * (3 ^ d : ℝ) * (cubeLpNorm Q (2 : ℝ≥0∞) R) ^ 2 := by + have havg_lintegral := + overlapCentersAverage_lintegral_rpow_enorm_two_le Q j R hR hRloc + unfold cubeBesovOverlappingPositiveVectorDepthAverage + calc + overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S R)) ^ 2) + ≤ + overlapCentersAverage Q j + (fun S => (2 * overlapCubeLpNorm S (2 : ℝ≥0∞) R) ^ 2) := by + refine overlapCentersAverage_le_overlapCentersAverage Q j ?_ + intro S hS + have hfluct : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S R) ≤ + 2 * overlapCubeLpNorm S (2 : ℝ≥0∞) R := + overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_two_mul_overlapCubeLpNorm_two + S R (hRloc S hS) + exact (sq_le_sq₀ + (overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S R)) + (mul_nonneg (by norm_num) (overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) R))).mpr + hfluct + _ = + overlapCentersAverage Q j + (fun S => 4 * (overlapCubeLpNorm S (2 : ℝ≥0∞) R) ^ 2) := by + congr 1 + funext S + ring + _ = + 4 * overlapCentersAverage Q j + (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) R) ^ 2) := by + rw [overlapCentersAverage_mul_left] + _ = + 4 * overlapCentersAverage Q j + (fun S => + (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedOverlapCubeMeasure S).toReal) := by + classical + congr 1 + let D := overlapCentersAtDepth Q j + unfold overlapCentersAverage + change + ((D.card : ℝ)⁻¹) * + D.sum (fun S => (overlapCubeLpNorm S (2 : ℝ≥0∞) R) ^ 2) = + ((D.card : ℝ)⁻¹) * + D.sum (fun S => + (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) + ∂ normalizedOverlapCubeMeasure S).toReal) + congr 1 + refine Finset.sum_congr rfl ?_ + intro S _hS + exact overlapCubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal S R + _ ≤ + 4 * ((3 ^ d : ℝ) * + (∫⁻ x, ‖R x‖ₑ ^ (2 : ℝ) ∂ normalizedCubeMeasure Q).toReal) := by + exact mul_le_mul_of_nonneg_left havg_lintegral (by norm_num) + _ = + 4 * ((3 ^ d : ℝ) * (cubeLpNorm Q (2 : ℝ≥0∞) R) ^ 2) := by + rw [cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal] + _ = + 4 * (3 ^ d : ℝ) * (cubeLpNorm Q (2 : ℝ≥0∞) R) ^ 2 := by + ring + +/-- Depth-`j` overlapping positive `q = 2` seminorm. -/ +noncomputable def cubeBesovOverlappingPositiveVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q u j) + +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j := by + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + have hA : 0 ≤ cubeBesovOverlappingPositiveVectorDepthAverage Q u j := + cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q u j + calc + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q u j)) ^ 2 := by + rfl + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q u j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + rw [Real.sq_sqrt hA] + +/-- Finite-depth overlapping positive `q = 2` seminorm. -/ +noncomputable def cubeBesovOverlappingPositiveVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + 0 ≤ cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u := + Real.sqrt_nonneg _ + +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + unfold cubeBesovOverlappingPositiveVectorPartialSeminormTwo + rw [Real.sq_sqrt] + exact Finset.sum_nonneg fun j _ => + sq_nonneg (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) + +/-- Full overlapping positive `q = 2` seminorm. -/ +noncomputable def cubeBesovOverlappingPositiveVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : ℝ := + sSup (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) + +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_le_of_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB : + ∀ N : ℕ, cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u ≤ B) : + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u ≤ B := by + unfold cubeBesovOverlappingPositiveVectorSeminormTwo + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s 0 u, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u)) + (N : ℕ) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u ≤ + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := by + unfold cubeBesovOverlappingPositiveVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u)) : + 0 ≤ cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := by + have h0_le : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s 0 u ≤ + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s u hBdd 0 + exact + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q s 0 u).trans + h0_le + +/-- Corrected full positive `q = 2` Besov norm for vector fields, using +overlapping cubes at each depth. -/ +noncomputable def cubeBesovOverlappingPositiveVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + Real.sqrt (vecNormSq (cubeAverageVec Q F)) + + cubeBesovOverlappingPositiveVectorSeminormTwo Q s F + +theorem cubeBesovOverlappingPositiveVectorNormTwo_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F)) : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s F := by + unfold cubeBesovOverlappingPositiveVectorNormTwo + exact add_nonneg (Real.sqrt_nonneg _) + (cubeBesovOverlappingPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s F hBdd) + +/-- Corrected `H^s` regularity package for the overlapping positive norm. -/ +structure CubeVectorOverlappingBesovHRegularity {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (g : Vec d → Vec d) : Prop where + memLp : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q) + partialSeminorms_bddAbove : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N g) + +theorem CubeVectorOverlappingBesovHRegularity.partialSeminorm_le_seminorm + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) (N : ℕ) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N g ≤ + cubeBesovOverlappingPositiveVectorSeminormTwo Q s g := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s g hg.partialSeminorms_bddAbove N + +theorem CubeVectorOverlappingBesovHRegularity.seminorm_nonneg + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) : + 0 ≤ cubeBesovOverlappingPositiveVectorSeminormTwo Q s g := + cubeBesovOverlappingPositiveVectorSeminormTwo_nonneg_of_bddAbove + Q s g hg.partialSeminorms_bddAbove + +theorem CubeVectorOverlappingBesovHRegularity.norm_nonneg + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {g : Vec d → Vec d} + (hg : CubeVectorOverlappingBesovHRegularity Q s g) : + 0 ≤ cubeBesovOverlappingPositiveVectorNormTwo Q s g := + cubeBesovOverlappingPositiveVectorNormTwo_nonneg_of_bddAbove + Q s g hg.partialSeminorms_bddAbove + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PublicTheorems.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PublicTheorems.lean new file mode 100644 index 0000000000..07788b43ad --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/PublicTheorems.lean @@ -0,0 +1,473 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ConcreteAveraging + +/-! # Public Theorems -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal Pointwise + +/-- Pure/K-interface analytic input: finite-level K-functional partial sums +are controlled by the overlapping positive partial sums and mean term. + +This is proved by the concrete smooth overlap averaging operator and the +K-functional depth/partial assembly. -/ +theorem cubeKBesovPartialBoundByOverlappingPositive + (d : ℕ) [NeZero d] : + CubeKBesovPartialBoundByOverlappingPositive d := + cubeKBesovPartialBoundByOverlappingPositive_concrete d + +/-- Uniform pure/K-interface input: finite-level K-functional partial sums are +controlled by the overlapping positive partial sums and mean term with a +dimension-only constant, independent of `s`. -/ +theorem cubeKBesovPartialBoundByOverlappingPositiveUniform + (d : ℕ) [NeZero d] : + CubeKBesovPartialBoundByOverlappingPositiveUniform d + (2 * concreteOverlapAveragingCompetitorConstant d) := + cubeKBesovPartialBoundByOverlappingPositiveUniform_concrete d + +/-- Pure/K-interface analytic input: overlapping Besov regularity gives bounded +canonical K-functional partial sums. -/ +theorem cubeKBesovInputBoundednessOfOverlappingHRegularity + (d : ℕ) [NeZero d] : + CubeKBesovInputBoundednessOfOverlappingHRegularity d := + cubeKBesovInputBoundednessOfOverlappingHRegularity_of_partialBoundByOverlappingPositive + (cubeKBesovPartialBoundByOverlappingPositive d) + +/-- Mean-term estimate for zero-Dirichlet divergence solutions. This is +proved by transporting the open-cube zero-trace function to the half-open cube +used by `cubeAverageVec`, then applying the zero-trace averaged-gradient +identity. -/ +theorem cubeDirichletGradientAverageRegularity + (d : ℕ) [NeZero d] : + CubeDirichletGradientAverageRegularity d := by + refine ⟨0, le_rfl, ?_⟩ + intro Q _h w _hweak + have hzero : + cubeAverageVec Q (fun x => w.toH1Function.grad x) = 0 := by + simpa using cubeAverageVec_grad_eq_zero_of_h10OnCube Q w.toCubeSet + rw [hzero] + simp [vecNormSq, vecDot] + +/-- PDE endpoint estimate: one-solution `L²` energy estimate for +zero-Dirichlet divergence solutions. This is the formal test-with-the-solution +argument. -/ +theorem cubeDirichletDivergenceEnergyEstimate + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceEnergyEstimate d := by + let C0 : ℝ := Fintype.card (Fin d) + refine ⟨C0, by exact Nat.cast_nonneg _, ?_⟩ + intro Q F u hF hweak + let G : Vec d → Vec d := fun x => u.toH1Function.grad x + let A : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) G + let B : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + have hG : MeasureTheory.MemLp G (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro i + simpa [G] using u.toH1Function.grad_memL2_normalizedCubeMeasure (Q := Q) i + have henergy_avg : + cubeAverage Q (fun x => vecNormSq (G x)) = + -cubeAverage Q (fun x => vecDot (F x) (G x)) := by + have hweak_u := hweak u + have hvol_avg : + cubeVolume Q * cubeAverage Q (fun x => vecNormSq (G x)) = + -(cubeVolume Q * cubeAverage Q (fun x => vecDot (F x) (G x))) := by + calc + cubeVolume Q * cubeAverage Q (fun x => vecNormSq (G x)) + = + ∫ x in openCubeSet Q, vecDot (u.toH1Function.grad x) + (u.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage] + simp [G, vecNormSq] + _ = + -∫ x in openCubeSet Q, vecDot (F x) (u.toH1Function.grad x) + ∂MeasureTheory.volume := hweak_u + _ = + -(cubeVolume Q * + cubeAverage Q (fun x => vecDot (F x) (G x))) := by + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage] + have hvol_pos : 0 < cubeVolume Q := cubeVolume_pos Q + nlinarith [hvol_avg, hvol_pos] + have hA_sq_le_energy : + A ^ 2 ≤ cubeAverage Q (fun x => vecNormSq (G x)) := by + simpa [A] using cubeLpNorm_two_sq_le_cubeAverage_vecNormSq (Q := Q) (F := G) hG + have henergy_le_pair : + cubeAverage Q (fun x => vecNormSq (G x)) ≤ + |cubeAverage Q (fun x => vecDot (F x) (G x))| := by + rw [henergy_avg] + exact neg_le_abs _ + have hpair : + |cubeAverage Q (fun x => vecDot (F x) (G x))| ≤ C0 * B * A := by + simpa [C0, A, B] using + abs_cubeAverage_vecDot_le_card_mul_cubeLpNorm_two_mul Q F G hF hG + have hA_sq : + A ^ 2 ≤ C0 * B * A := + hA_sq_le_energy.trans (henergy_le_pair.trans hpair) + have hA_nonneg : 0 ≤ A := by + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) G + have hB_nonneg : 0 ≤ B := by + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hC0_nonneg : 0 ≤ C0 := by + exact Nat.cast_nonneg _ + have hA_le : A ≤ C0 * B := by + by_cases hA0 : A = 0 + · rw [hA0] + exact mul_nonneg hC0_nonneg hB_nonneg + · have hA_pos : 0 < A := lt_of_le_of_ne hA_nonneg (Ne.symm hA0) + have hmul : A * A ≤ (C0 * B) * A := by + calc + A * A = A ^ 2 := by ring + _ ≤ C0 * B * A := hA_sq + _ = (C0 * B) * A := by ring + exact le_of_mul_le_mul_right hmul hA_pos + simpa [A, B, G] using hA_le + +/-- Residual `L²` stability is a theorem once the one-solution energy estimate +is available: subtract the two weak equations, then apply the estimate to the +residual solution. -/ +theorem cubeDirichletDivergenceResidualL2Stability + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceResidualL2Stability d := + cubeDirichletDivergenceResidualL2Stability_of_energyEstimate + (cubeDirichletDivergenceEnergyEstimate d) + +/-- The identity coefficient field, represented as the scalar matrix `1 • I`. +-/ +noncomputable def identityCoeffField (d : ℕ) : CoeffField d := + fun _ => scalarMatrix (d := d) 1 + +theorem matVecMul_identityCoeffField {d : ℕ} (x ξ : Vec d) : + matVecMul (identityCoeffField d x) ξ = ξ := by + simpa [identityCoeffField] using + (matVecMul_scalarMatrix (d := d) (1 : ℝ) ξ) + +theorem isEllipticFieldOn_identityCoeffField {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsEllipticFieldOn 1 1 U (identityCoeffField d) := by + classical + constructor + · apply measurable_pi_iff.2 + intro i + apply measurable_pi_iff.2 + intro j + have hpiece : + Measurable (Set.piecewise U + (fun _ : Vec d => scalarMatrix (d := d) (1 : ℝ) i j) + (fun _ : Vec d => (0 : ℝ))) := + measurable_const.piecewise hU measurable_const + simpa [identityCoeffField, Set.piecewise] using! hpiece + · intro x _hx + simpa [identityCoeffField] using + (isEllipticMatrix_scalarMatrix (d := d) (by norm_num : (0 : ℝ) < 1)) + +theorem openCubeSet_nonempty_internal {d : ℕ} (Q : TriadicCube d) : + Set.Nonempty (openCubeSet Q) := by + refine ⟨cubeCenter Q, ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa using Metric.mem_ball_self (x := cubeCenter Q) (cubeRadius_pos Q) + +/-- PDE endpoint analytic input: weak-divergence realization for coordinatewise +`H¹` vector fields. The scalar Dirichlet `H²` estimate is already proved, so +this is now the remaining bridge from vector divergence data to scalar Poisson +forcing. -/ +theorem cubeVectorH1DivergencePoissonRealization + (d : ℕ) [NeZero d] : + CubeVectorH1DivergencePoissonRealization d := by + intro Q G + let U : Set (Vec d) := openCubeSet Q + let a : CoeffField d := identityCoeffField d + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [U, volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (by simpa [U] using isOpenBoundedConvexDomain_openCubeSet Q) + have hEll : IsEllipticFieldOn 1 1 U a := by + simpa [a] using isEllipticFieldOn_identityCoeffField + (d := d) (U := U) (by simpa [U] using measurableSet_openCubeSet Q) + have hGneg : MemVectorL2 U (fun x => -G.toField x) := by + simpa [U, Pi.neg_apply] using! G.memVectorL2_toField_openCubeSet.neg + rcases + exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := fun x => -G.toField x) + (lam := 1) (Lam := 1) + hGneg hRealize + (by simpa [U] using openCubeSet_nonempty_internal Q) hEll + with ⟨v, hv⟩ + have hdivProblem : CubeDirichletDivergenceProblem Q v G.toField := by + intro φ + have hsol := hv φ + have hleft : + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (v.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [a, matVecMul_identityCoeffField] + have hright : + ∫ x in openCubeSet Q, + vecDot ((fun x => -G.toField x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot ((fun x => -G.toField x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + -vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [vecDot_neg_left] + _ = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + calc + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (v.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume := hleft.symm + _ = + ∫ x in openCubeSet Q, + vecDot ((fun x => -G.toField x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [U] using hsol + _ = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := hright + refine ⟨v, hdivProblem, ?_⟩ + intro φ + calc + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + -∫ x in openCubeSet Q, + vecDot (G.toField x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := hdivProblem φ + _ = + ∫ x in openCubeSet Q, + G.divergence x * φ.toH1Function x ∂MeasureTheory.volume := by + exact (G.integral_divergence_mul_zeroTrace_eq_neg_integral_vecDot φ).symm + +/-- Dirichlet `H²` regularity for divergence RHS generated by an `H¹` vector +competitor, assembled from the scalar `H²` theorem and the weak-divergence +realization bridge. -/ +theorem cubeDirichletDivergenceH2CompetitorRegularity + (d : ℕ) [NeZero d] : + CubeDirichletDivergenceH2CompetitorRegularity d := + cubeDirichletDivergenceH2CompetitorRegularity_of_vectorH1DivergencePoissonRealization + (cubeVectorH1DivergencePoissonRealization d) + +/-- Dirichlet `H²` regularity as an `H¹` solution-gradient lift for each +`H¹` vector competitor, assembled from the sharper divergence-H² contract. -/ +theorem cubeDirichletH1CompetitorLiftRegularity + (d : ℕ) [NeZero d] : + CubeDirichletH1CompetitorLiftRegularity d := + cubeDirichletH1CompetitorLiftRegularity_of_divergenceH2CompetitorRegularity + (cubeDirichletDivergenceH2CompetitorRegularity d) + +/-- Two-constant endpoint construction assembled from residual `L²` +stability and the Dirichlet `H²` competitor lift. -/ +theorem cubeDirichletKEndpointCompetitorConstruction + (d : ℕ) [NeZero d] : + CubeDirichletKEndpointCompetitorConstruction d := + cubeDirichletKEndpointCompetitorConstruction_of_residualStability_of_liftRegularity + (cubeDirichletDivergenceResidualL2Stability d) + (cubeDirichletH1CompetitorLiftRegularity d) + +/-- One-constant endpoint decomposition assembled from the two endpoint +constants. -/ +theorem cubeDirichletKEndpointDecomposition + (d : ℕ) [NeZero d] : + CubeDirichletKEndpointDecomposition d := + cubeDirichletKEndpointDecomposition_of_competitorConstruction + (cubeDirichletKEndpointCompetitorConstruction d) + +/-- Pointwise K-functional regularity assembled from the endpoint +decomposition. -/ +theorem cubeKFunctionalDirichletPointwiseRegularity + (d : ℕ) [NeZero d] : + CubeKFunctionalDirichletPointwiseRegularity d := + cubeKFunctionalDirichletPointwiseRegularity_of_endpointDecomposition + (cubeDirichletKEndpointDecomposition d) + +/-- Direct assembly of the discrete compatibility Dirichlet Besov statement +from the finite-level pure K/overlapping comparison. This is not the source +theorem pending the continuum `K`/`H^s` gate. + +This avoids using the over-strong all-functions K/overlapping equivalence +package. The output overlap norm is controlled by the proved overlap-Poincare +comparison and bounded K partial sums for the output; those bounded output +partials come from pointwise K-regularity and the input boundedness supplied by +the finite-level partial comparison. -/ +theorem discreteConstantCoefficientDirichletBesovFunctionSpaces_of_partialBoundByOverlappingPositive + {d : ℕ} [NeZero d] + (hpartial : CubeKBesovPartialBoundByOverlappingPositive d) : + DiscreteConstantCoefficientDirichletBesovFunctionSpaces d := by + intro s hs_pos hs_lt + let CP : ℝ := cubeVectorH1OverlapPoincareConstant d + let Coverlap : ℝ := 8 * (3 ^ d : ℝ) + 2 * CP ^ 2 + 2 + have hCP_nonneg : 0 ≤ CP := by + dsimp [CP] + exact cubeVectorH1OverlapPoincareConstant_nonneg d + have hCoverlap_nonneg : 0 ≤ Coverlap := by + dsimp [Coverlap, CP] + positivity + let hbounded : CubeKBesovInputBoundednessOfOverlappingHRegularity d := + cubeKBesovInputBoundednessOfOverlappingHRegularity_of_partialBoundByOverlappingPositive + hpartial + let hcomponents : CubeKBesovDirichletRegularityComponents d := + ⟨hbounded, + cubeDirichletGradientAverageRegularity d, + cubeKFunctionalDirichletPointwiseRegularity d⟩ + rcases (cubeKBesovDirichletRegularity_of_components hcomponents) hs_pos hs_lt with + ⟨Cd, hCd_nonneg, hdir⟩ + rcases + cubeKBesovVectorNormTwo_le_mul_cubeBesovOverlappingPositiveVectorNormTwo_of_partialBound + hpartial hs_pos hs_lt + with ⟨Cin, hCin_nonneg, hCin⟩ + refine ⟨Coverlap * Cd * Cin, + mul_nonneg (mul_nonneg hCoverlap_nonneg hCd_nonneg) hCin_nonneg, ?_⟩ + intro Q h w hh hweak + rcases cubeKFunctionalDirichletPointwiseRegularity d with + ⟨CK, hCK_nonneg, hpointwise⟩ + have hInKBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N h) := + hbounded hs_pos hs_lt Q h hh + have hOutKBdd : + BddAbove (Set.range fun N : ℕ => + cubeKBesovVectorPartialSeminormTwo Q s N + (fun x => w.toH1Function.grad x)) := by + rcases hInKBdd with ⟨B, hB⟩ + refine ⟨CK * B, ?_⟩ + rintro y ⟨N, rfl⟩ + have hpartialOut : + cubeKBesovVectorPartialSeminormTwo Q s N + (fun x => w.toH1Function.grad x) ≤ + CK * cubeKBesovVectorPartialSeminormTwo Q s N h := + cubeKBesovVectorPartialSeminormTwo_le_of_forall_kFunctional_le + Q s CK N (fun x => w.toH1Function.grad x) h hCK_nonneg + fun j _hj => + hpointwise Q h w (Real.rpow (3 : ℝ) (-(j : ℝ))) hh.memLp hweak + exact hpartialOut.trans + (mul_le_mul_of_nonneg_left (hB ⟨N, rfl⟩) hCK_nonneg) + have hOutMem : + MeasureTheory.MemLp (fun x => w.toH1Function.grad x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro i + simpa using w.toH1Function.grad_memL2_normalizedCubeMeasure (Q := Q) i + have hOutOverlapK : + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + Coverlap * + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) := by + dsimp [Coverlap, CP] + exact + cubeBesovOverlappingPositiveVectorNormTwo_le_mul_cubeKBesovVectorNormTwo_of_overlapPoincare + hCP_nonneg (cubeVectorH1OverlapPoincareEstimate d) + Q s (fun x => w.toH1Function.grad x) hOutMem hOutKBdd + have hDir : + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) ≤ + Cd * cubeKBesovVectorNormTwo Q s h := + hdir Q h w hh hweak + have hInKOverlap : + cubeKBesovVectorNormTwo Q s h ≤ + Cin * cubeBesovOverlappingPositiveVectorNormTwo Q s h := + hCin Q h hh + calc + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) + ≤ + Coverlap * + cubeKBesovVectorNormTwo Q s (fun x => w.toH1Function.grad x) := + hOutOverlapK + _ ≤ Coverlap * (Cd * cubeKBesovVectorNormTwo Q s h) := + mul_le_mul_of_nonneg_left hDir hCoverlap_nonneg + _ = (Coverlap * Cd) * cubeKBesovVectorNormTwo Q s h := by + ring + _ ≤ (Coverlap * Cd) * + (Cin * cubeBesovOverlappingPositiveVectorNormTwo Q s h) := + mul_le_mul_of_nonneg_left hInKOverlap + (mul_nonneg hCoverlap_nonneg hCd_nonneg) + _ = + Coverlap * Cd * Cin * + cubeBesovOverlappingPositiveVectorNormTwo Q s h := by + ring + +/-- Focused components for the PDE/K-functional part of the revised proof. -/ +theorem cubeKBesovDirichletRegularityComponents + (d : ℕ) [NeZero d] : + CubeKBesovDirichletRegularityComponents d := + ⟨cubeKBesovInputBoundednessOfOverlappingHRegularity d, + cubeDirichletGradientAverageRegularity d, + cubeKFunctionalDirichletPointwiseRegularity d⟩ + +/-- PDE/K-functional regularity assembled from the three focused analytic +inputs. -/ +theorem cubeKBesovDirichletRegularity + (d : ℕ) [NeZero d] : + CubeKBesovDirichletRegularity (cubeKBesovNormModel d) := + cubeKBesovDirichletRegularity_of_components + (cubeKBesovDirichletRegularityComponents d) + +/-- Uniform-in-`s` PDE/K-functional regularity. -/ +theorem exists_cubeKBesovDirichletRegularityUniform + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CubeKBesovDirichletRegularityUniform (cubeKBesovNormModel d) C := + exists_cubeKBesovDirichletRegularityUniform_of_components + (cubeKBesovDirichletRegularityComponents d) + +/-- Uniform discrete compatibility theorem, with one dimension-only constant +for all `s ∈ (0,1)`. It is not the source theorem pending the continuum +`K`/`H^s` gate. -/ +theorem exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform + (d : ℕ) [NeZero d] : + ∃ C : ℝ, DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d C := + exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform_of_partialBoundByOverlappingPositiveUniform + (cubeKBesovPartialBoundByOverlappingPositiveUniform d) + (cubeKBesovDirichletRegularityComponents d) + +/-- Discrete compatibility theorem assembled from the direct finite-partial +K/overlapping route. It is not the source theorem pending the continuum +`K`/`H^s` gate. -/ +theorem discreteConstantCoefficientDirichletBesovFunctionSpaces + (d : ℕ) [NeZero d] : + DiscreteConstantCoefficientDirichletBesovFunctionSpaces d + := by + rcases exists_discreteConstantCoefficientDirichletBesovFunctionSpacesUniform d with + ⟨C, hC⟩ + exact hC.to_functionSpaces + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardOverlapComparison.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardOverlapComparison.lean new file mode 100644 index 0000000000..0e0fa74975 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardOverlapComparison.lean @@ -0,0 +1,355 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm + +/-! # Standard Overlap Comparison -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Standard/overlapping positive Besov comparison + +The key geometric observation is that every ordinary descendant cube appears +as the overlapping cube of its middle child. This file starts the comparison +API with the exact middle-child identities. +-/ + +@[simp] theorem overlapCubeScaleFactor_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + overlapCubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q := by + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + unfold overlapCubeScaleFactor + rw [hscale] + ring + +@[simp] theorem overlapCubeVolume_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + overlapCubeVolume (middleChildCube Q) = cubeVolume Q := by + simp [overlapCubeVolume, cubeVolume_eq_scaleFactor_pow] + +@[simp] theorem overlapCubeMeasure_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + overlapCubeMeasure (middleChildCube Q) = cubeMeasure Q := by + rw [overlapCubeMeasure, cubeMeasure, overlapCubeSet_middleChildCube_eq_cubeSet] + +@[simp] theorem normalizedOverlapCubeMeasure_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + normalizedOverlapCubeMeasure (middleChildCube Q) = + normalizedCubeMeasure Q := by + rw [normalizedOverlapCubeMeasure, normalizedCubeMeasure] + simp + +@[simp] theorem overlapCubeAverage_middleChildCube {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + overlapCubeAverage (middleChildCube Q) f = cubeAverage Q f := by + rw [overlapCubeAverage_eq_integral_normalizedOverlapCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + simp + +@[simp] theorem overlapCubeAverageVec_middleChildCube {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : + overlapCubeAverageVec (middleChildCube Q) u = cubeAverageVec Q u := by + funext i + simp [overlapCubeAverageVec, cubeAverageVec] + +@[simp] theorem overlapCubeFluctuationVec_middleChildCube {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : + overlapCubeFluctuationVec (middleChildCube Q) u = cubeFluctuationVec Q u := by + funext x + simp [overlapCubeFluctuationVec, cubeFluctuationVec] + +@[simp] theorem overlapCubeLpNorm_middleChildCube {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → E) : + overlapCubeLpNorm (middleChildCube Q) p u = cubeLpNorm Q p u := by + unfold overlapCubeLpNorm cubeLpNorm + simp + +@[simp] theorem overlapCubeLpNorm_middleChildCube_fluctuation {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : + overlapCubeLpNorm (middleChildCube Q) (2 : ℝ≥0∞) + (overlapCubeFluctuationVec (middleChildCube Q) u) = + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) := by + simp + +theorem overlapCentersAtDepth_card_le_three_pow_mul_descendantsAtDepth_card + {d : ℕ} (Q : TriadicCube d) (j : ℕ) : + (overlapCentersAtDepth Q j).card ≤ + 3 ^ d * (descendantsAtDepth Q j).card := by + calc + (overlapCentersAtDepth Q j).card + ≤ (descendantsAtDepth Q (j + 1)).card := + overlapCentersAtDepth_card_le_descendantsAtDepth_card Q j + _ = (descendantsAtDepth Q j).card * 3 ^ d := + descendantsAtDepth_card_succ Q j + _ = 3 ^ d * (descendantsAtDepth Q j).card := by + rw [Nat.mul_comm] + +theorem cubeBesovPositiveVectorDepthAverage_le_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovPositiveVectorDepthAverage Q u j ≤ + (3 ^ d : ℝ) * cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let O : Finset (TriadicCube d) := overlapCentersAtDepth Q j + let G : TriadicCube d → ℝ := + fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S u)) ^ 2 + have hD_nonempty : D.Nonempty := by + simpa [D] using descendantsAtDepth_nonempty Q j + have hD_card_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD_nonempty + have hD_card_ne : (D.card : ℝ) ≠ 0 := ne_of_gt hD_card_pos + have hO_nonempty : O.Nonempty := by + simpa [O] using overlapCentersAtDepth_nonempty Q j + have hO_card_pos : 0 < (O.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hO_nonempty + have hO_card_ne : (O.card : ℝ) ≠ 0 := ne_of_gt hO_card_pos + have hG_nonneg : ∀ S ∈ O, 0 ≤ G S := by + intro S _hS + exact sq_nonneg _ + have himage_subset : D.image middleChildCube ⊆ O := by + intro S hS + rcases Finset.mem_image.mp hS with ⟨R, hR, rfl⟩ + exact middleChildCube_mem_overlapCentersAtDepth_of_mem_descendantsAtDepth + (by simpa [D] using hR) + have hsum_image_le : (D.image middleChildCube).sum G ≤ O.sum G := by + exact Finset.sum_le_sum_of_subset_of_nonneg himage_subset + (fun S hSO _hSnot => hG_nonneg S hSO) + have hsum_desc_eq_image : + D.sum + (fun R => + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u)) ^ 2) = + (D.image middleChildCube).sum G := by + rw [Finset.sum_image] + · simp + · intro R _hR S _hS hRS + exact middleChildCube_injective hRS + have hsum_nonneg : 0 ≤ O.sum G := by + exact Finset.sum_nonneg hG_nonneg + have hcard_nat : + O.card ≤ 3 ^ d * D.card := by + simpa [D, O] using + overlapCentersAtDepth_card_le_three_pow_mul_descendantsAtDepth_card Q j + have hcard_real : + (O.card : ℝ) ≤ (3 ^ d : ℝ) * (D.card : ℝ) := by + exact_mod_cast hcard_nat + have hdenom : + (D.card : ℝ)⁻¹ * O.sum G ≤ + (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := by + calc + (D.card : ℝ)⁻¹ * O.sum G + = ((O.card : ℝ) / (D.card : ℝ)) * + ((O.card : ℝ)⁻¹ * O.sum G) := by + field_simp [hD_card_ne, hO_card_ne] + _ ≤ (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := by + have hratio : + (O.card : ℝ) / (D.card : ℝ) ≤ (3 ^ d : ℝ) := by + rw [div_le_iff₀ hD_card_pos] + simpa [mul_comm, mul_left_comm, mul_assoc] using hcard_real + have havg_nonneg : 0 ≤ (O.card : ℝ)⁻¹ * O.sum G := + mul_nonneg (inv_nonneg.mpr (le_of_lt hO_card_pos)) hsum_nonneg + exact mul_le_mul_of_nonneg_right hratio havg_nonneg + calc + cubeBesovPositiveVectorDepthAverage Q u j + = (D.card : ℝ)⁻¹ * + D.sum + (fun R => + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u)) ^ 2) := by + rfl + _ = (D.card : ℝ)⁻¹ * (D.image middleChildCube).sum G := by + rw [hsum_desc_eq_image] + _ ≤ (D.card : ℝ)⁻¹ * O.sum G := by + exact mul_le_mul_of_nonneg_left hsum_image_le + (inv_nonneg.mpr (le_of_lt hD_card_pos)) + _ ≤ (3 ^ d : ℝ) * ((O.card : ℝ)⁻¹ * O.sum G) := hdenom + _ = (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + rfl + +theorem sq_cubeBesovPositiveVectorDepthSeminorm_le_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 ≤ + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + have havg := + cubeBesovPositiveVectorDepthAverage_le_three_pow_mul_overlapping Q u j + have hweight_nonneg : + 0 ≤ (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 := sq_nonneg _ + calc + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u j := by + exact sq_cubeBesovPositiveVectorDepthSeminorm Q s u j + _ ≤ + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + ((3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j) := by + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = + (3 ^ d : ℝ) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j) := by + ring + _ = + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + rw [sq_cubeBesovOverlappingPositiveVectorDepthSeminorm] + +theorem sq_cubeBesovPositiveVectorPartialSeminormTwo_le_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 := by + calc + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2 + = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + exact sq_cubeBesovPositiveVectorPartialSeminormTwo Q s N u + _ ≤ + Finset.sum (Finset.range (N + 1)) fun j => + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + exact Finset.sum_le_sum fun j _hj => + sq_cubeBesovPositiveVectorDepthSeminorm_le_three_pow_mul_overlapping + Q s u j + _ = + (3 ^ d : ℝ) * + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + rw [Finset.mul_sum] + _ = + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 := by + rw [sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_sqrt_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N u ≤ + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u := by + have hsq := + sq_cubeBesovPositiveVectorPartialSeminormTwo_le_three_pow_mul_overlapping + Q s N u + have hc_nonneg : 0 ≤ (3 ^ d : ℝ) := by positivity + have hright_sq : + (Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 = + (3 ^ d : ℝ) * + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hc_nonneg] + have hsq' : + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + (Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u) ^ 2 := by + simpa [hright_sq] using hsq + exact + (sq_le_sq₀ + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s N u) + (mul_nonneg (Real.sqrt_nonneg _) + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q s N u))).mp + hsq' + +theorem cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u) := by + rcases hBdd with ⟨B, hB⟩ + refine ⟨Real.sqrt (3 ^ d : ℝ) * B, ?_⟩ + rintro x ⟨N, rfl⟩ + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N u + ≤ Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u := + cubeBesovPositiveVectorPartialSeminormTwo_le_sqrt_three_pow_mul_overlapping + Q s N u + _ ≤ Real.sqrt (3 ^ d : ℝ) * B := by + exact mul_le_mul_of_nonneg_left (hB ⟨N, rfl⟩) + (Real.sqrt_nonneg _) + +theorem cubeBesovPositiveVectorSeminormTwo_le_sqrt_three_pow_mul_overlapping + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u)) : + cubeBesovPositiveVectorSeminormTwo Q s u ≤ + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s u ?_ + intro N + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N u + ≤ Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u := + cubeBesovPositiveVectorPartialSeminormTwo_le_sqrt_three_pow_mul_overlapping + Q s N u + _ ≤ Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_seminorm_of_bddAbove + Q s u hBdd N) + (Real.sqrt_nonneg _) + +theorem positiveVectorNormTwo_le_sqrt_three_pow_mul_overlappingNorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N u)) : + Real.sqrt (vecNormSq (cubeAverageVec Q u)) + + cubeBesovPositiveVectorSeminormTwo Q s u ≤ + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorNormTwo Q s u := by + have hsem := + cubeBesovPositiveVectorSeminormTwo_le_sqrt_three_pow_mul_overlapping + Q s u hBdd + have hconst_one : 1 ≤ Real.sqrt (3 ^ d : ℝ) := by + have hpow : (1 : ℝ) ≤ (3 ^ d : ℝ) := by + exact one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + have hsqrt := Real.sqrt_le_sqrt hpow + simpa using hsqrt + have hmean_nonneg : 0 ≤ Real.sqrt (vecNormSq (cubeAverageVec Q u)) := + Real.sqrt_nonneg _ + have hmean : + Real.sqrt (vecNormSq (cubeAverageVec Q u)) ≤ + Real.sqrt (3 ^ d : ℝ) * + Real.sqrt (vecNormSq (cubeAverageVec Q u)) := by + simpa [one_mul] using + mul_le_mul_of_nonneg_right hconst_one hmean_nonneg + calc + Real.sqrt (vecNormSq (cubeAverageVec Q u)) + + cubeBesovPositiveVectorSeminormTwo Q s u + ≤ + Real.sqrt (3 ^ d : ℝ) * + Real.sqrt (vecNormSq (cubeAverageVec Q u)) + + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorSeminormTwo Q s u := by + exact add_le_add hmean hsem + _ = + Real.sqrt (3 ^ d : ℝ) * + cubeBesovOverlappingPositiveVectorNormTwo Q s u := by + unfold cubeBesovOverlappingPositiveVectorNormTwo + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundary.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundary.lean new file mode 100644 index 0000000000..f799de4cff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundary.lean @@ -0,0 +1,977 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionResidual + +/-! # Standard Projection Boundary -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Boundary-crossing centers for projection increments + +For one martingale increment, an overlap cube contributes only if it crosses the +standard triadic partition at the increment scale. This file isolates that +support reduction. The remaining geometric work is then a finite counting +estimate for the crossing centers. +-/ + +/-- Overlap centers whose overlap cube is not contained in any standard +descendant at the increment scale `m + 1`. -/ +noncomputable def overlapCrossingCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) : Finset (TriadicCube d) := by + classical + exact (overlapCentersAtDepth Q j).filter + (fun S => + ∀ R ∈ descendantsAtDepth Q (m + 1), ¬ overlapCubeSet S ⊆ cubeSet R) + +theorem mem_overlapCrossingCentersAtDepth_iff {d : ℕ} + {Q S : TriadicCube d} {j m : ℕ} : + S ∈ overlapCrossingCentersAtDepth Q j m ↔ + S ∈ overlapCentersAtDepth Q j ∧ + ∀ R ∈ descendantsAtDepth Q (m + 1), ¬ overlapCubeSet S ⊆ cubeSet R := by + classical + simp [overlapCrossingCentersAtDepth] + +theorem mem_overlapCentersAtDepth_of_mem_overlapCrossingCentersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j m : ℕ} + (hS : S ∈ overlapCrossingCentersAtDepth Q j m) : + S ∈ overlapCentersAtDepth Q j := + (mem_overlapCrossingCentersAtDepth_iff.mp hS).1 + +theorem overlapCrossingCentersAtDepth_subset_overlapCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) : + overlapCrossingCentersAtDepth Q j m ⊆ overlapCentersAtDepth Q j := by + intro S hS + exact mem_overlapCentersAtDepth_of_mem_overlapCrossingCentersAtDepth hS + +/-- If an admissible overlap center is not crossing at the increment scale, +then the increment has zero corrected overlap fluctuation on that center. -/ +theorem overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_eq_zero_of_not_mem_crossing + {d : ℕ} {Q S : TriadicCube d} {j m : ℕ} (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) + (hSnot : S ∉ overlapCrossingCentersAtDepth Q j m) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u)) = 0 := by + classical + have hnot : + ¬ ∀ R ∈ descendantsAtDepth Q (m + 1), ¬ overlapCubeSet S ⊆ cubeSet R := by + intro hcross + exact hSnot (mem_overlapCrossingCentersAtDepth_iff.2 ⟨hS, hcross⟩) + push Not at hnot + rcases hnot with ⟨R, hR, hsub⟩ + exact + overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_eq_zero_of_subset_descendant + (Q := Q) (S := S) (R := R) (m := m) u hR hsub + +/-- The overlap-center sum for one increment may be restricted to the crossing +centers. Non-crossing centers contribute zero by local constancy. -/ +theorem overlapCentersAtDepth_sum_cubeIncrementVec_eq_crossing_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j m : ℕ) : + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) = + (overlapCrossingCentersAtDepth Q j m).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) := by + classical + symm + refine + Finset.sum_subset + (overlapCrossingCentersAtDepth_subset_overlapCentersAtDepth Q j m) ?_ + intro S hS hSnot + have hzero := + overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_eq_zero_of_not_mem_crossing + (Q := Q) (S := S) (j := j) (m := m) u hS hSnot + simp [hzero] + +/-- Depth-average form of +`overlapCentersAtDepth_sum_cubeIncrementVec_eq_crossing_sum`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_eq_crossing_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j m : ℕ) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j = + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCrossingCentersAtDepth Q j m).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage overlapCentersAverage + change + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCentersAtDepth Q j).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) = + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCrossingCentersAtDepth Q j m).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) + rw [overlapCentersAtDepth_sum_cubeIncrementVec_eq_crossing_sum] + +theorem overlapCoordLower_eq_cubeCoordLower_sub_cubeScaleFactor {d : ℕ} + (S : TriadicCube d) (i : Fin d) : + overlapCoordLower S i = cubeCoordLower S i - cubeScaleFactor S := by + simp [overlapCoordLower, cubeCoordLower] + ring + +theorem overlapCoordUpper_eq_cubeCoordUpper_add_cubeScaleFactor {d : ℕ} + (S : TriadicCube d) (i : Fin d) : + overlapCoordUpper S i = cubeCoordUpper S i + cubeScaleFactor S := by + simp [overlapCoordUpper, cubeCoordUpper] + ring + +/-- If a fine descendant is one fine scale away from every face of a coarser +cube, then its overlap cube is contained in that coarser cube. -/ +theorem overlapCubeSet_subset_cubeSet_of_coord_one_scale_separated + {d : ℕ} {R S : TriadicCube d} + (hlo : + ∀ i : Fin d, cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i) + (hhi : + ∀ i : Fin d, cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i) : + overlapCubeSet S ⊆ cubeSet R := by + intro x hx i + have hxi := (mem_overlapCubeSet_iff_coord_bounds.mp hx i) + have hlower : + cubeCoordLower R i ≤ overlapCoordLower S i := by + rw [overlapCoordLower_eq_cubeCoordLower_sub_cubeScaleFactor] + linarith [hlo i] + have hupper : + overlapCoordUpper S i ≤ cubeCoordUpper R i := by + rw [overlapCoordUpper_eq_cubeCoordUpper_add_cubeScaleFactor] + exact hhi i + exact ⟨le_trans hlower hxi.1, lt_of_lt_of_le hxi.2 hupper⟩ + +/-- A one-scale-separated descendant cannot be a crossing center for the +coarser increment partition. -/ +theorem not_mem_overlapCrossingCentersAtDepth_of_coord_one_scale_separated + {d : ℕ} {Q R S : TriadicCube d} {j m : ℕ} + (hR : R ∈ descendantsAtDepth Q (m + 1)) + (hlo : + ∀ i : Fin d, cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i) + (hhi : + ∀ i : Fin d, cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i) : + S ∉ overlapCrossingCentersAtDepth Q j m := by + intro hS + have hcross := (mem_overlapCrossingCentersAtDepth_iff.mp hS).2 + exact hcross R hR + (overlapCubeSet_subset_cubeSet_of_coord_one_scale_separated hlo hhi) + +/-- Crossing descendants fail the one-fine-scale interior separation from any +coarser descendant that contains their center cube. This is the boundary-layer +form needed for the cardinality estimate. -/ +theorem not_forall_coord_one_scale_separated_of_mem_overlapCrossingCentersAtDepth + {d : ℕ} {Q R S : TriadicCube d} {j m n : ℕ} + (hS : S ∈ overlapCrossingCentersAtDepth Q j m) + (hR : R ∈ descendantsAtDepth Q (m + 1)) + (_hSR : S ∈ descendantsAtDepth R n) : + ¬ ∀ i : Fin d, + cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i ∧ + cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i := by + intro hsep + exact + not_mem_overlapCrossingCentersAtDepth_of_coord_one_scale_separated + (Q := Q) (R := R) (S := S) (j := j) (m := m) + hR (fun i => (hsep i).1) (fun i => (hsep i).2) hS + +/-- An overlap center at depth `j` has an ancestor at any increment depth +`m + 1 ≤ j + 1`. -/ +theorem exists_increment_ancestor_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j m : ℕ} + (hS : S ∈ overlapCentersAtDepth Q j) (hmj : m ≤ j) : + ∃ R ∈ descendantsAtDepth Q (m + 1), + S ∈ descendantsAtDepth R (j - m) := by + have hSdesc : S ∈ descendantsAtDepth Q (j + 1) := + mem_descendantsAtDepth_of_mem_overlapCentersAtDepth hS + have hdepth : j + 1 = (m + 1) + (j - m) := by + omega + have hSdesc' : S ∈ descendantsAtDepth Q ((m + 1) + (j - m)) := by + simpa [hdepth] using hSdesc + exact exists_descendant_ancestor_at_depth (Q := Q) (R := S) + (m + 1) (j - m) hSdesc' + +/-- A crossing overlap center has a coarser increment ancestor, and relative to +that ancestor it lies in the one-fine-scale boundary layer. -/ +theorem exists_increment_ancestor_boundary_layer_of_mem_overlapCrossingCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j m : ℕ} + (hS : S ∈ overlapCrossingCentersAtDepth Q j m) (hmj : m ≤ j) : + ∃ R ∈ descendantsAtDepth Q (m + 1), + S ∈ descendantsAtDepth R (j - m) ∧ + ¬ ∀ i : Fin d, + cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i ∧ + cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i := by + rcases exists_increment_ancestor_of_mem_overlapCentersAtDepth + (Q := Q) (S := S) (j := j) (m := m) + (mem_overlapCentersAtDepth_of_mem_overlapCrossingCentersAtDepth hS) hmj with + ⟨R, hR, hSR⟩ + refine ⟨R, hR, hSR, ?_⟩ + exact + not_forall_coord_one_scale_separated_of_mem_overlapCrossingCentersAtDepth + (Q := Q) (R := R) (S := S) (j := j) (m := m) (n := j - m) + hS hR hSR + +/-- Descendants of `R` at depth `n` lying in the one-fine-scale boundary layer +of `R`. -/ +noncomputable def descendantBoundaryLayerAtDepth {d : ℕ} + (R : TriadicCube d) (n : ℕ) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth R n).filter + (fun S => + ¬ ∀ i : Fin d, + cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i ∧ + cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i) + +theorem mem_descendantBoundaryLayerAtDepth_iff {d : ℕ} + {R S : TriadicCube d} {n : ℕ} : + S ∈ descendantBoundaryLayerAtDepth R n ↔ + S ∈ descendantsAtDepth R n ∧ + ¬ ∀ i : Fin d, + cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i ∧ + cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i := by + classical + simp [descendantBoundaryLayerAtDepth] + +/-- The boundary layer is exactly the union of the descendants sharing at least +one lower or upper coordinate face with the parent cube. -/ +theorem mem_descendantBoundaryLayerAtDepth_iff_exists_coord_face {d : ℕ} + {R S : TriadicCube d} {n : ℕ} : + S ∈ descendantBoundaryLayerAtDepth R n ↔ + S ∈ descendantsAtDepth R n ∧ + ∃ i : Fin d, + cubeCoordLower S i = cubeCoordLower R i ∨ + cubeCoordUpper S i = cubeCoordUpper R i := by + constructor + · intro hS + rcases mem_descendantBoundaryLayerAtDepth_iff.mp hS with + ⟨hdesc, hboundary⟩ + refine ⟨hdesc, ?_⟩ + by_contra hno + push Not at hno + have hsep : + ∀ i : Fin d, + cubeCoordLower R i + cubeScaleFactor S ≤ cubeCoordLower S i ∧ + cubeCoordUpper S i + cubeScaleFactor S ≤ cubeCoordUpper R i := by + intro i + constructor + · rcases cubeCoordLower_descendant_eq_or_one_scale_le hdesc i with hEq | hSep + · exact False.elim ((hno i).1 hEq) + · exact hSep + · rcases cubeCoordUpper_descendant_eq_or_one_scale_le hdesc i with hEq | hSep + · exact False.elim ((hno i).2 hEq) + · exact hSep + exact hboundary hsep + · rintro ⟨hdesc, i, hface⟩ + rw [mem_descendantBoundaryLayerAtDepth_iff] + refine ⟨hdesc, ?_⟩ + intro hsep + have hscale_pos : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + rcases hface with hface | hface + · have hbad := (hsep i).1 + nlinarith [hbad, hface, hscale_pos] + · have hbad := (hsep i).2 + nlinarith [hbad, hface, hscale_pos] + +private noncomputable def fixedCoordinateFunctionEquiv {α β : Type*} + [DecidableEq α] (i : α) (a : β) : + {f : α → β // f i = a} ≃ ({j : α // j ≠ i} → β) where + toFun f := fun j => f.1 j.1 + invFun g := ⟨fun j => if h : j = i then a else g ⟨j, h⟩, by simp⟩ + left_inv f := by + ext j + by_cases h : j = i + · subst h + simp [f.2] + · simp [h] + right_inv g := by + funext j + simp [j.2] + +private theorem card_function_fixed_coord_fin_three {d : ℕ} + (i : Fin d) (a : Fin 3) : + ((Finset.univ : Finset (Fin d → Fin 3)).filter + (fun digits => digits i = a)).card = 3 ^ (d - 1) := by + classical + rw [← Fintype.card_subtype (fun digits : Fin d → Fin 3 => digits i = a)] + have hcard := Fintype.card_congr (fixedCoordinateFunctionEquiv i a) + rw [Fintype.card_fun] at hcard + have hcompl : Fintype.card {j : Fin d // j ≠ i} = d - 1 := by + have h := Fintype.card_subtype_compl (fun j : Fin d => j = i) + simp [Fintype.card_fin] at h ⊢ + simpa [Fintype.card_fin, hcompl] using hcard + +theorem cubeCoordLower_child_eq_parent_iff_digit_zero {d : ℕ} + (R : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + cubeCoordLower + ({ scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordLower R i ↔ + digits i = 0 := by + constructor + · intro h + let C : TriadicCube d := + { scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } + have hcoord := cubeCoordLower_child R digits i + have hscale_pos : 0 < cubeScaleFactor C := cubeScaleFactor_pos' _ + have hcoord' : + cubeCoordLower C i = + cubeCoordLower R i + (((digits i : ℤ) : ℝ)) * cubeScaleFactor C := by + simpa [C] using hcoord + have hdigit_real : (((digits i : ℤ) : ℝ)) = 0 := by + nlinarith [hcoord', h, hscale_pos] + have hval : (digits i).val = 0 := by + exact_mod_cast hdigit_real + exact Fin.ext hval + · intro h + have hcoord := cubeCoordLower_child R digits i + have hdigit_real : (((digits i : ℤ) : ℝ)) = 0 := by + simp [h] + rw [hcoord, hdigit_real] + ring + +theorem cubeCoordUpper_child_eq_parent_iff_digit_two {d : ℕ} + (R : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + cubeCoordUpper + ({ scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } : + TriadicCube d) i = + cubeCoordUpper R i ↔ + digits i = 2 := by + constructor + · intro h + let C : TriadicCube d := + { scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } + have hcoord := cubeCoordUpper_child R digits i + have hscale_pos : 0 < cubeScaleFactor C := cubeScaleFactor_pos' _ + have hdle_int : (digits i : ℤ) ≤ 2 := by + exact_mod_cast Nat.le_of_lt_succ (digits i).isLt + have hdiff_nonneg : 0 ≤ (2 : ℝ) - (((digits i : ℤ) : ℝ)) := by + exact_mod_cast sub_nonneg.mpr hdle_int + have hcoord' : + cubeCoordUpper C i = + cubeCoordUpper R i - + ((2 : ℝ) - (((digits i : ℤ) : ℝ))) * cubeScaleFactor C := by + simpa [C] using hcoord + have hmul_zero : + ((2 : ℝ) - (((digits i : ℤ) : ℝ))) * cubeScaleFactor C = 0 := by + nlinarith [hcoord', h] + have hdiff_real : (2 : ℝ) - (((digits i : ℤ) : ℝ)) = 0 := by + nlinarith [hmul_zero, hscale_pos, hdiff_nonneg] + have hdigit_real : (((digits i : ℤ) : ℝ)) = 2 := by + nlinarith + have hval : (digits i).val = 2 := by + exact_mod_cast hdigit_real + exact Fin.ext hval + · intro h + have hcoord := cubeCoordUpper_child R digits i + have hdigit_real : (((digits i : ℤ) : ℝ)) = 2 := by + simp [h] + rw [hcoord, hdigit_real] + ring + +theorem childCubes_lowerFace_card {d : ℕ} + (R : TriadicCube d) (i : Fin d) : + ((childCubes R).filter + (fun S => cubeCoordLower S i = cubeCoordLower R i)).card = + 3 ^ (d - 1) := by + classical + let childOf : (Fin d → Fin 3) → TriadicCube d := + fun digits => + { scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } + have hinj : Function.Injective childOf := by + intro a b hab + funext k + apply Fin.ext + have hindex : + 3 * R.index k + (a k : ℤ) - 1 = + 3 * R.index k + (b k : ℤ) - 1 := by + simpa [childOf] using congrArg (fun S : TriadicCube d => S.index k) hab + have hcast : (a k : ℤ) = (b k : ℤ) := by omega + exact Int.ofNat_inj.mp (by simpa using hcast) + have hfilter : + (childCubes R).filter + (fun S => cubeCoordLower S i = cubeCoordLower R i) = + ((Finset.univ : Finset (Fin d → Fin 3)).filter + (fun digits => digits i = 0)).image childOf := by + unfold childCubes + rw [Finset.filter_image] + apply congrArg (Finset.image childOf) + ext digits + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + change cubeCoordLower (childOf digits) i = cubeCoordLower R i ↔ + digits i = 0 + simpa [childOf] using + cubeCoordLower_child_eq_parent_iff_digit_zero R digits i + rw [hfilter, Finset.card_image_of_injective] + · exact card_function_fixed_coord_fin_three i 0 + · exact hinj + +theorem childCubes_upperFace_card {d : ℕ} + (R : TriadicCube d) (i : Fin d) : + ((childCubes R).filter + (fun S => cubeCoordUpper S i = cubeCoordUpper R i)).card = + 3 ^ (d - 1) := by + classical + let childOf : (Fin d → Fin 3) → TriadicCube d := + fun digits => + { scale := R.scale - 1 + index := fun k => 3 * R.index k + (digits k : ℤ) - 1 } + have hinj : Function.Injective childOf := by + intro a b hab + funext k + apply Fin.ext + have hindex : + 3 * R.index k + (a k : ℤ) - 1 = + 3 * R.index k + (b k : ℤ) - 1 := by + simpa [childOf] using congrArg (fun S : TriadicCube d => S.index k) hab + have hcast : (a k : ℤ) = (b k : ℤ) := by omega + exact Int.ofNat_inj.mp (by simpa using hcast) + have hfilter : + (childCubes R).filter + (fun S => cubeCoordUpper S i = cubeCoordUpper R i) = + ((Finset.univ : Finset (Fin d → Fin 3)).filter + (fun digits => digits i = 2)).image childOf := by + unfold childCubes + rw [Finset.filter_image] + apply congrArg (Finset.image childOf) + ext digits + simp only [Finset.mem_filter, Finset.mem_univ, true_and] + change cubeCoordUpper (childOf digits) i = cubeCoordUpper R i ↔ + digits i = 2 + simpa [childOf] using + cubeCoordUpper_child_eq_parent_iff_digit_two R digits i + rw [hfilter, Finset.card_image_of_injective] + · exact card_function_fixed_coord_fin_three i 2 + · exact hinj + +noncomputable def descendantLowerFaceAtDepth {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth R n).filter + (fun S => cubeCoordLower S i = cubeCoordLower R i) + +theorem mem_descendantLowerFaceAtDepth_iff {d : ℕ} + {R S : TriadicCube d} {n : ℕ} {i : Fin d} : + S ∈ descendantLowerFaceAtDepth R n i ↔ + S ∈ descendantsAtDepth R n ∧ + cubeCoordLower S i = cubeCoordLower R i := by + classical + simp [descendantLowerFaceAtDepth] + +noncomputable def descendantUpperFaceAtDepth {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth R n).filter + (fun S => cubeCoordUpper S i = cubeCoordUpper R i) + +theorem mem_descendantUpperFaceAtDepth_iff {d : ℕ} + {R S : TriadicCube d} {n : ℕ} {i : Fin d} : + S ∈ descendantUpperFaceAtDepth R n i ↔ + S ∈ descendantsAtDepth R n ∧ + cubeCoordUpper S i = cubeCoordUpper R i := by + classical + simp [descendantUpperFaceAtDepth] + +/-- The coordinate-face union containing the boundary layer. -/ +noncomputable def descendantFaceBoundaryAtDepth {d : ℕ} + (R : TriadicCube d) (n : ℕ) : Finset (TriadicCube d) := by + classical + exact (Finset.univ : Finset (Fin d)).biUnion + (fun i => descendantLowerFaceAtDepth R n i ∪ descendantUpperFaceAtDepth R n i) + +theorem descendantBoundaryLayerAtDepth_subset_faceBoundaryAtDepth {d : ℕ} + (R : TriadicCube d) (n : ℕ) : + descendantBoundaryLayerAtDepth R n ⊆ descendantFaceBoundaryAtDepth R n := by + intro S hS + rcases (mem_descendantBoundaryLayerAtDepth_iff_exists_coord_face.mp hS) with + ⟨hdesc, i, hface | hface⟩ + · dsimp [descendantFaceBoundaryAtDepth] + exact Finset.mem_biUnion.mpr + ⟨i, Finset.mem_univ i, + Finset.mem_union.mpr + (Or.inl (mem_descendantLowerFaceAtDepth_iff.2 ⟨hdesc, hface⟩))⟩ + · dsimp [descendantFaceBoundaryAtDepth] + exact Finset.mem_biUnion.mpr + ⟨i, Finset.mem_univ i, + Finset.mem_union.mpr + (Or.inr (mem_descendantUpperFaceAtDepth_iff.2 ⟨hdesc, hface⟩))⟩ + +theorem descendantLowerFaceAtDepth_succ_subset_biUnion {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : + descendantLowerFaceAtDepth R (n + 1) i ⊆ + (descendantLowerFaceAtDepth R n i).biUnion + (fun P => descendantLowerFaceAtDepth P 1 i) := by + intro S hS + rcases mem_descendantLowerFaceAtDepth_iff.mp hS with ⟨hSdesc, hSface⟩ + rcases mem_descendantsAtDepth_succ_iff.mp hSdesc with ⟨P, hP, hSPchild⟩ + have hSPdesc : S ∈ descendantsAtDepth P 1 := by + simpa [descendantsAtDepth_one] using hSPchild + have hR_le_P : cubeCoordLower R i ≤ cubeCoordLower P i := + cubeCoordLower_le_of_mem_descendantsAtDepth hP i + have hP_le_S : cubeCoordLower P i ≤ cubeCoordLower S i := + cubeCoordLower_le_of_mem_descendantsAtDepth hSPdesc i + have hPface : cubeCoordLower P i = cubeCoordLower R i := by + linarith + have hSfaceP : cubeCoordLower S i = cubeCoordLower P i := by + linarith + exact Finset.mem_biUnion.mpr + ⟨P, + mem_descendantLowerFaceAtDepth_iff.2 ⟨hP, hPface⟩, + mem_descendantLowerFaceAtDepth_iff.2 ⟨hSPdesc, hSfaceP⟩⟩ + +theorem descendantUpperFaceAtDepth_succ_subset_biUnion {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : + descendantUpperFaceAtDepth R (n + 1) i ⊆ + (descendantUpperFaceAtDepth R n i).biUnion + (fun P => descendantUpperFaceAtDepth P 1 i) := by + intro S hS + rcases mem_descendantUpperFaceAtDepth_iff.mp hS with ⟨hSdesc, hSface⟩ + rcases mem_descendantsAtDepth_succ_iff.mp hSdesc with ⟨P, hP, hSPchild⟩ + have hSPdesc : S ∈ descendantsAtDepth P 1 := by + simpa [descendantsAtDepth_one] using hSPchild + have hP_le_R : cubeCoordUpper P i ≤ cubeCoordUpper R i := + cubeCoordUpper_le_of_mem_descendantsAtDepth hP i + have hS_le_P : cubeCoordUpper S i ≤ cubeCoordUpper P i := + cubeCoordUpper_le_of_mem_descendantsAtDepth hSPdesc i + have hPface : cubeCoordUpper P i = cubeCoordUpper R i := by + linarith + have hSfaceP : cubeCoordUpper S i = cubeCoordUpper P i := by + linarith + exact Finset.mem_biUnion.mpr + ⟨P, + mem_descendantUpperFaceAtDepth_iff.2 ⟨hP, hPface⟩, + mem_descendantUpperFaceAtDepth_iff.2 ⟨hSPdesc, hSfaceP⟩⟩ + +theorem descendantLowerFaceAtDepth_card_le {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : + (descendantLowerFaceAtDepth R n i).card ≤ (3 ^ (d - 1)) ^ n := by + induction n generalizing R with + | zero => + dsimp [descendantLowerFaceAtDepth] + exact Finset.card_filter_le {R} (fun S => cubeCoordLower S i = cubeCoordLower R i) + | succ n ih => + let B : Finset (TriadicCube d) := + (descendantLowerFaceAtDepth R n i).biUnion + (fun P => descendantLowerFaceAtDepth P 1 i) + have hsubset : + descendantLowerFaceAtDepth R (n + 1) i ⊆ B := by + simpa [B] using descendantLowerFaceAtDepth_succ_subset_biUnion R n i + have hcard_child : + ∀ P ∈ descendantLowerFaceAtDepth R n i, + (descendantLowerFaceAtDepth P 1 i).card = 3 ^ (d - 1) := by + intro P _hP + simpa [descendantLowerFaceAtDepth] using childCubes_lowerFace_card P i + calc + (descendantLowerFaceAtDepth R (n + 1) i).card + ≤ B.card := Finset.card_le_card hsubset + _ ≤ + ∑ P ∈ descendantLowerFaceAtDepth R n i, + (descendantLowerFaceAtDepth P 1 i).card := by + simpa [B] using + (Finset.card_biUnion_le + (s := descendantLowerFaceAtDepth R n i) + (t := fun P => descendantLowerFaceAtDepth P 1 i)) + _ = + ∑ P ∈ descendantLowerFaceAtDepth R n i, 3 ^ (d - 1) := by + refine Finset.sum_congr rfl ?_ + intro P hP + exact hcard_child P hP + _ = + (descendantLowerFaceAtDepth R n i).card * 3 ^ (d - 1) := by + simp + _ ≤ + (3 ^ (d - 1)) ^ n * 3 ^ (d - 1) := + Nat.mul_le_mul_right _ (ih R) + _ = + (3 ^ (d - 1)) ^ (n + 1) := by + rw [pow_succ] + +theorem descendantUpperFaceAtDepth_card_le {d : ℕ} + (R : TriadicCube d) (n : ℕ) (i : Fin d) : + (descendantUpperFaceAtDepth R n i).card ≤ (3 ^ (d - 1)) ^ n := by + induction n generalizing R with + | zero => + dsimp [descendantUpperFaceAtDepth] + exact Finset.card_filter_le {R} (fun S => cubeCoordUpper S i = cubeCoordUpper R i) + | succ n ih => + let B : Finset (TriadicCube d) := + (descendantUpperFaceAtDepth R n i).biUnion + (fun P => descendantUpperFaceAtDepth P 1 i) + have hsubset : + descendantUpperFaceAtDepth R (n + 1) i ⊆ B := by + simpa [B] using descendantUpperFaceAtDepth_succ_subset_biUnion R n i + have hcard_child : + ∀ P ∈ descendantUpperFaceAtDepth R n i, + (descendantUpperFaceAtDepth P 1 i).card = 3 ^ (d - 1) := by + intro P _hP + simpa [descendantUpperFaceAtDepth] using childCubes_upperFace_card P i + calc + (descendantUpperFaceAtDepth R (n + 1) i).card + ≤ B.card := Finset.card_le_card hsubset + _ ≤ + ∑ P ∈ descendantUpperFaceAtDepth R n i, + (descendantUpperFaceAtDepth P 1 i).card := by + simpa [B] using + (Finset.card_biUnion_le + (s := descendantUpperFaceAtDepth R n i) + (t := fun P => descendantUpperFaceAtDepth P 1 i)) + _ = + ∑ P ∈ descendantUpperFaceAtDepth R n i, 3 ^ (d - 1) := by + refine Finset.sum_congr rfl ?_ + intro P hP + exact hcard_child P hP + _ = + (descendantUpperFaceAtDepth R n i).card * 3 ^ (d - 1) := by + simp + _ ≤ + (3 ^ (d - 1)) ^ n * 3 ^ (d - 1) := + Nat.mul_le_mul_right _ (ih R) + _ = + (3 ^ (d - 1)) ^ (n + 1) := by + rw [pow_succ] + +theorem descendantBoundaryLayerAtDepth_card_le {d : ℕ} + (R : TriadicCube d) (n : ℕ) : + (descendantBoundaryLayerAtDepth R n).card ≤ + 2 * d * (3 ^ (d - 1)) ^ n := by + classical + let A : ℕ := (3 ^ (d - 1)) ^ n + calc + (descendantBoundaryLayerAtDepth R n).card + ≤ (descendantFaceBoundaryAtDepth R n).card := + Finset.card_le_card + (descendantBoundaryLayerAtDepth_subset_faceBoundaryAtDepth R n) + _ ≤ + ∑ i : Fin d, + (descendantLowerFaceAtDepth R n i ∪ + descendantUpperFaceAtDepth R n i).card := by + simpa [descendantFaceBoundaryAtDepth] using + (Finset.card_biUnion_le + (s := (Finset.univ : Finset (Fin d))) + (t := fun i => + descendantLowerFaceAtDepth R n i ∪ + descendantUpperFaceAtDepth R n i)) + _ ≤ + ∑ _i : Fin d, 2 * A := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hlower : (descendantLowerFaceAtDepth R n i).card ≤ A := by + simpa [A] using descendantLowerFaceAtDepth_card_le R n i + have hupper : (descendantUpperFaceAtDepth R n i).card ≤ A := by + simpa [A] using descendantUpperFaceAtDepth_card_le R n i + calc + (descendantLowerFaceAtDepth R n i ∪ + descendantUpperFaceAtDepth R n i).card + ≤ + (descendantLowerFaceAtDepth R n i).card + + (descendantUpperFaceAtDepth R n i).card := + Finset.card_union_le _ _ + _ ≤ A + A := Nat.add_le_add hlower hupper + _ = 2 * A := by ring + _ = 2 * d * A := by + simp [A] + ring + _ = 2 * d * (3 ^ (d - 1)) ^ n := by + rfl + +/-- Boundary-layer descendants over all increment-scale ancestors. -/ +noncomputable def incrementBoundaryLayerCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q (m + 1)).biUnion + (fun R => descendantBoundaryLayerAtDepth R (j - m)) + +theorem incrementBoundaryLayerCentersAtDepth_card_le {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) : + (incrementBoundaryLayerCentersAtDepth Q j m).card ≤ + (descendantsAtDepth Q (m + 1)).card * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) := by + classical + calc + (incrementBoundaryLayerCentersAtDepth Q j m).card + ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + (descendantBoundaryLayerAtDepth R (j - m)).card := by + dsimp [incrementBoundaryLayerCentersAtDepth] + exact Finset.card_biUnion_le + _ ≤ + ∑ _R ∈ descendantsAtDepth Q (m + 1), + 2 * d * (3 ^ (d - 1)) ^ (j - m) := by + refine Finset.sum_le_sum ?_ + intro R _hR + exact descendantBoundaryLayerAtDepth_card_le R (j - m) + _ = + (descendantsAtDepth Q (m + 1)).card * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) := by + simp + +theorem incrementBoundaryLayerCentersAtDepth_card_le_pow {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) : + (incrementBoundaryLayerCentersAtDepth Q j m).card ≤ + (3 ^ d) ^ (m + 1) * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) := by + have h := incrementBoundaryLayerCentersAtDepth_card_le Q j m + rw [descendantsAtDepth_card Q (m + 1)] at h + exact h + +private theorem finset_sum_biUnion_le_sum_of_nonneg + {α β : Type*} [DecidableEq β] + (s : Finset α) (t : α → Finset β) (F : β → ℝ) + (hF : ∀ x ∈ s.biUnion t, 0 ≤ F x) : + (s.biUnion t).sum F ≤ ∑ a ∈ s, (t a).sum F := by + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert a s ha ih => + have hF_s : ∀ x ∈ s.biUnion t, 0 ≤ F x := by + intro x hx + exact hF x (by simpa using Finset.mem_union.mpr (Or.inr hx)) + have hinter_nonneg : 0 ≤ ∑ x ∈ t a ∩ s.biUnion t, F x := by + exact Finset.sum_nonneg (fun x hx => + hF x (by + have hx_left : x ∈ t a := (Finset.mem_inter.mp hx).1 + simp [hx_left])) + have hunion_le : + (t a ∪ s.biUnion t).sum F ≤ (t a).sum F + (s.biUnion t).sum F := by + have h := + Finset.sum_union_inter (s₁ := t a) (s₂ := s.biUnion t) (f := F) + linarith + calc + ((insert a s).biUnion t).sum F + = (t a ∪ s.biUnion t).sum F := by + simp + _ ≤ (t a).sum F + (s.biUnion t).sum F := hunion_le + _ ≤ (t a).sum F + ∑ a' ∈ s, (t a').sum F := by + have hih := ih hF_s + linarith + _ = ∑ a' ∈ insert a s, (t a').sum F := by + simp [ha] + +theorem incrementBoundaryLayerCentersAtDepth_sum_le_ancestor_boundaryLayer_sum + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (F : TriadicCube d → ℝ) + (hF : ∀ S ∈ incrementBoundaryLayerCentersAtDepth Q j m, 0 ≤ F S) : + (incrementBoundaryLayerCentersAtDepth Q j m).sum F ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + (descendantBoundaryLayerAtDepth R (j - m)).sum F := by + dsimp [incrementBoundaryLayerCentersAtDepth] + exact finset_sum_biUnion_le_sum_of_nonneg + (descendantsAtDepth Q (m + 1)) + (fun R => descendantBoundaryLayerAtDepth R (j - m)) F hF + +theorem incrementBoundaryLayerCentersAtDepth_sum_le_ancestor_weighted_sum + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) + (F B : TriadicCube d → ℝ) + (hF : ∀ S ∈ incrementBoundaryLayerCentersAtDepth Q j m, 0 ≤ F S) + (hbound : + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), F S ≤ B R) : + (incrementBoundaryLayerCentersAtDepth Q j m).sum F ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + ((descendantBoundaryLayerAtDepth R (j - m)).card : ℝ) * B R := by + calc + (incrementBoundaryLayerCentersAtDepth Q j m).sum F + ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + (descendantBoundaryLayerAtDepth R (j - m)).sum F := + incrementBoundaryLayerCentersAtDepth_sum_le_ancestor_boundaryLayer_sum + Q j m F hF + _ ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + ((descendantBoundaryLayerAtDepth R (j - m)).card : ℝ) * B R := by + refine Finset.sum_le_sum ?_ + intro R hR + have hinner := + Finset.sum_le_card_nsmul + (descendantBoundaryLayerAtDepth R (j - m)) F (B R) + (hbound R hR) + simpa using hinner + +theorem incrementBoundaryLayerCentersAtDepth_sum_le_const_mul_ancestor_sum + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) + (F B : TriadicCube d → ℝ) + (hF : ∀ S ∈ incrementBoundaryLayerCentersAtDepth Q j m, 0 ≤ F S) + (hB : ∀ R ∈ descendantsAtDepth Q (m + 1), 0 ≤ B R) + (hbound : + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), F S ≤ B R) : + (incrementBoundaryLayerCentersAtDepth Q j m).sum F ≤ + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R := by + calc + (incrementBoundaryLayerCentersAtDepth Q j m).sum F + ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + ((descendantBoundaryLayerAtDepth R (j - m)).card : ℝ) * B R := + incrementBoundaryLayerCentersAtDepth_sum_le_ancestor_weighted_sum + Q j m F B hF hbound + _ ≤ + ∑ R ∈ descendantsAtDepth Q (m + 1), + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * B R := by + refine Finset.sum_le_sum ?_ + intro R hR + have hcard_nat := descendantBoundaryLayerAtDepth_card_le R (j - m) + have hcard : + ((descendantBoundaryLayerAtDepth R (j - m)).card : ℝ) ≤ + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) := by + exact_mod_cast hcard_nat + exact mul_le_mul_of_nonneg_right hcard (hB R hR) + _ = + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R := by + rw [Finset.mul_sum] + +/-- Every crossing center belongs to the boundary layer of its increment-scale +ancestor. -/ +theorem overlapCrossingCentersAtDepth_subset_incrementBoundaryLayerCentersAtDepth + {d : ℕ} (Q : TriadicCube d) {j m : ℕ} (hmj : m ≤ j) : + overlapCrossingCentersAtDepth Q j m ⊆ + incrementBoundaryLayerCentersAtDepth Q j m := by + intro S hS + rcases exists_increment_ancestor_boundary_layer_of_mem_overlapCrossingCentersAtDepth + (Q := Q) (S := S) (j := j) (m := m) hS hmj with + ⟨R, hR, hSR, hboundary⟩ + dsimp [incrementBoundaryLayerCentersAtDepth] + exact Finset.mem_biUnion.mpr + ⟨R, hR, + mem_descendantBoundaryLayerAtDepth_iff.2 ⟨hSR, hboundary⟩⟩ + +theorem overlapCrossingCentersAtDepth_sum_le_incrementBoundaryLayerCentersAtDepth_sum + {d : ℕ} (Q : TriadicCube d) {j m : ℕ} (hmj : m ≤ j) + (F : TriadicCube d → ℝ) + (hF : + ∀ S ∈ incrementBoundaryLayerCentersAtDepth Q j m, 0 ≤ F S) : + (overlapCrossingCentersAtDepth Q j m).sum F ≤ + (incrementBoundaryLayerCentersAtDepth Q j m).sum F := by + exact + Finset.sum_le_sum_of_subset_of_nonneg + (overlapCrossingCentersAtDepth_subset_incrementBoundaryLayerCentersAtDepth + Q hmj) + (fun S hS _hSnot => hF S hS) + +/-- One-increment depth averages are controlled by the corresponding +boundary-layer sum. The remaining work is to count that boundary layer. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_boundaryLayer_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) := by + rw [cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_eq_crossing_sum] + have hsum := + overlapCrossingCentersAtDepth_sum_le_incrementBoundaryLayerCentersAtDepth_sum + Q hmj + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2) + (fun S _hS => sq_nonneg _) + exact mul_le_mul_of_nonneg_left hsum + (inv_nonneg.mpr (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ))) + +/-- One-increment overlap averages are controlled by any nonnegative +increment-ancestor budget which bounds each boundary-layer center of that +ancestor. This is the counted form of the boundary reduction: the only +remaining analytic work is to provide the pointwise ancestor budget. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_const_mul_ancestor_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) (B : TriadicCube d → ℝ) + (hB : ∀ R ∈ descendantsAtDepth Q (m + 1), 0 ≤ B R) + (hbound : + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ B R) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + ((2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R) := by + let F : TriadicCube d → ℝ := fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 + have hboundary : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum F := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_boundaryLayer_sum + (Q := Q) (u := u) hmj + have hsum : + (incrementBoundaryLayerCentersAtDepth Q j m).sum F ≤ + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R := + incrementBoundaryLayerCentersAtDepth_sum_le_const_mul_ancestor_sum + Q j m F B + (fun S _hS => sq_nonneg _) + hB + hbound + exact hboundary.trans + (mul_le_mul_of_nonneg_left hsum + (inv_nonneg.mpr (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ)))) + +/-- Lowering the overlap-center normalization to the explicit standard +cardinality lower bound gives the scale-separated counted form of the +one-increment boundary estimate. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_pow_inv_const_mul_ancestor_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) (B : TriadicCube d → ℝ) + (hB : ∀ R ∈ descendantsAtDepth Q (m + 1), 0 ≤ B R) + (hbound : + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ B R) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + (((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + ((2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R) := by + have hbase := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_const_mul_ancestor_sum + (Q := Q) (u := u) (j := j) (m := m) hmj B hB hbound + have hcardLower : + (((3 ^ d) ^ j : ℕ) : ℝ) ≤ ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast pow_le_overlapCentersAtDepth_card Q j + have hcard_pos : 0 < ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast overlapCentersAtDepth_card_pos Q j + have hpow_pos : 0 < (((3 ^ d) ^ j : ℕ) : ℝ) := by + positivity + have hinv : + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ ≤ + (((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ := + (inv_le_inv₀ hcard_pos hpow_pos).2 hcardLower + have hsum_nonneg : + 0 ≤ ∑ R ∈ descendantsAtDepth Q (m + 1), B R := + Finset.sum_nonneg (fun R hR => hB R hR) + have hbudget_nonneg : + 0 ≤ + (2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R := by + exact mul_nonneg (by positivity) hsum_nonneg + exact hbase.trans + (mul_le_mul_of_nonneg_right hinv hbudget_nonneg) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryGap.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryGap.lean new file mode 100644 index 0000000000..5188a38cd3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryGap.lean @@ -0,0 +1,110 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundary + +/-! # Standard Projection Boundary Gap -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Projection gaps from boundary-budgeted increments + +This file sits downstream of `StandardProjectionBoundary`: the boundary file +controls one martingale increment by an abstract ancestor budget. Here we +insert that one-increment estimate into the already-proved telescoping estimate +for the projection gap `P_j u - P_0 u`. +-/ + +/-- Seminorm form of the one-increment boundary-budget estimate. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_cubeIncrementVec_le_sqrt_boundaryBudget + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) (B : TriadicCube d → ℝ) + (hB : ∀ R ∈ descendantsAtDepth Q (m + 1), 0 ≤ B R) + (hbound : + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ B R) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeIncrementVec Q (m + 1) u) j ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + ((2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B R)) := by + have havg := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_pow_inv_const_mul_ancestor_sum + (Q := Q) (u := u) (j := j) (m := m) hmj B hB hbound + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt havg) hweight_nonneg + +/-- The projection gap is controlled by the sum of square-root boundary budgets +for its martingale increments. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_boundaryBudget + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (B : ℕ → TriadicCube d → ℝ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hB : + ∀ m ∈ Finset.range j, + ∀ R ∈ descendantsAtDepth Q (m + 1), 0 ≤ B m R) + (hbound : + ∀ m ∈ Finset.range j, + ∀ R ∈ descendantsAtDepth Q (m + 1), + ∀ S ∈ descendantBoundaryLayerAtDepth R (j - m), + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ + B m R) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j ≤ + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + ((2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B m R)) := by + have hgap := + cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_incrementVec + Q s u j hincLoc + calc + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j + ≤ + ∑ m ∈ Finset.range j, + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeIncrementVec Q (m + 1) u) j := hgap + _ ≤ + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + ((2 * d * (3 ^ (d - 1)) ^ (j - m) : ℝ) * + ∑ R ∈ descendantsAtDepth Q (m + 1), B m R)) := by + refine Finset.sum_le_sum ?_ + intro m hm + exact + cubeBesovOverlappingPositiveVectorDepthSeminorm_cubeIncrementVec_le_sqrt_boundaryBudget + (Q := Q) (s := s) (u := u) (j := j) (m := m) + (Nat.le_of_lt (Finset.mem_range.mp hm)) + (B m) (hB m hm) (hbound m hm) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighbor.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighbor.lean new file mode 100644 index 0000000000..8ed59f102c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighbor.lean @@ -0,0 +1,771 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundary +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionIncrementEnergy + +/-! # Standard Projection Boundary Neighbor -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal BigOperators + +/-! +# Boundary sums with local neighbor-energy budgets + +This file refines the boundary-crossing reduction so that the enlarged +boundary-layer sum is gated back to admissible overlap centers. That lets us +insert the local-neighbor increment-energy estimate, whose hypotheses require +`overlapCubeSet S ⊆ cubeSet Q`. +-/ + +/-- Child-energy budget of the depth-`m` parents whose cubes meet the overlap +cube centered at `S`. -/ +noncomputable def overlapIntersectingParentEnergy {d : ℕ} + (Q S : TriadicCube d) (m : ℕ) (u : Vec d → Vec d) : ℝ := + ∑ T ∈ overlapIntersectingParentsAtDepth Q S m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) + +theorem overlapIntersectingParentEnergy_nonneg {d : ℕ} + (Q S : TriadicCube d) (m : ℕ) (u : Vec d → Vec d) : + 0 ≤ overlapIntersectingParentEnergy Q S m u := by + unfold overlapIntersectingParentEnergy + exact Finset.sum_nonneg fun T _hT => parentChildEnergy_sum_nonneg T u + +/-- Boundary-layer reduction with a gate back to admissible overlap centers. +The gate is important because the raw ancestor boundary layer also contains +fine descendants whose overlap cube may leave `Q`; crossing centers never do. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_admissible_boundaryLayer_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 + else + 0) := by + classical + let F : TriadicCube d → ℝ := fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 + let G : TriadicCube d → ℝ := fun S => + if S ∈ overlapCentersAtDepth Q j then F S else 0 + have hcross_eq : + (overlapCrossingCentersAtDepth Q j m).sum F = + (overlapCrossingCentersAtDepth Q j m).sum G := by + refine Finset.sum_congr rfl ?_ + intro S hS + have hcenter : S ∈ overlapCentersAtDepth Q j := + mem_overlapCentersAtDepth_of_mem_overlapCrossingCentersAtDepth hS + simp [G, hcenter] + have hsum : + (overlapCrossingCentersAtDepth Q j m).sum G ≤ + (incrementBoundaryLayerCentersAtDepth Q j m).sum G := by + refine Finset.sum_le_sum_of_subset_of_nonneg + (overlapCrossingCentersAtDepth_subset_incrementBoundaryLayerCentersAtDepth + Q hmj) ?_ + intro S _hS _hSnot + by_cases hcenter : S ∈ overlapCentersAtDepth Q j + · simp [hcenter, F, sq_nonneg] + · simp [hcenter] + rw [cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_eq_crossing_sum] + calc + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCrossingCentersAtDepth Q j m).sum F + = + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (overlapCrossingCentersAtDepth Q j m).sum G := by + rw [hcross_eq] + _ ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum G := by + exact mul_le_mul_of_nonneg_left hsum + (inv_nonneg.mpr + (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ))) + _ = + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 + else + 0) := rfl + +/-- Insert the local-neighbor increment-energy estimate into the admissible +boundary-layer reduction. The remaining task after this theorem is purely +geometric summation: control the admissible boundary-layer neighbor-energy +sum by the ordinary standard positive depth budgets. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_boundary_neighborEnergy_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huChild : + ∀ T ∈ descendantsAtDepth Q m, ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + 4 * overlapIntersectingParentEnergy Q S m u + else + 0) := by + classical + have hbase := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_admissible_boundaryLayer_sum + (Q := Q) (u := u) hmj + let F : TriadicCube d → ℝ := fun S => + if S ∈ overlapCentersAtDepth Q j then + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 + else + 0 + let G : TriadicCube d → ℝ := fun S => + if S ∈ overlapCentersAtDepth Q j then + 4 * overlapIntersectingParentEnergy Q S m u + else + 0 + have hsum : + (incrementBoundaryLayerCentersAtDepth Q j m).sum F ≤ + (incrementBoundaryLayerCentersAtDepth Q j m).sum G := by + refine Finset.sum_le_sum ?_ + intro S hS + by_cases hcenter : S ∈ overlapCentersAtDepth Q j + · have hlocal := + sq_overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_le_four_mul_overlapIntersectingParentEnergy_sum + (Q := Q) (S := S) (m := m) u + (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hcenter) + (hincLoc S hcenter) huChild + simpa [F, G, hcenter, overlapIntersectingParentEnergy] using hlocal + · simp [hcenter] + exact hbase.trans + (mul_le_mul_of_nonneg_left hsum + (inv_nonneg.mpr + (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ)))) + +/-- Admissible boundary-neighbor centers which charge a fixed depth-`m` +parent. -/ +noncomputable def boundaryNeighborCentersForParent {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + Finset (TriadicCube d) := by + classical + exact (incrementBoundaryLayerCentersAtDepth Q j m).filter fun S => + S ∈ overlapCentersAtDepth Q j ∧ + T ∈ overlapIntersectingParentsAtDepth Q S m + +theorem mem_boundaryNeighborCentersForParent_iff {d : ℕ} + {Q S T : TriadicCube d} {j m : ℕ} : + S ∈ boundaryNeighborCentersForParent Q j m T ↔ + S ∈ incrementBoundaryLayerCentersAtDepth Q j m ∧ + S ∈ overlapCentersAtDepth Q j ∧ + T ∈ overlapIntersectingParentsAtDepth Q S m := by + classical + simp [boundaryNeighborCentersForParent] + +theorem boundaryNeighborCentersForParent_subset_incrementBoundaryLayerCentersAtDepth + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + boundaryNeighborCentersForParent Q j m T ⊆ + incrementBoundaryLayerCentersAtDepth Q j m := by + intro S hS + exact (mem_boundaryNeighborCentersForParent_iff.mp hS).1 + +/-- Safe global fallback for the parent-hit count. This is not the sharp +surface-count estimate needed at the end, but it proves that every parent-hit +family is a subfamily of the global increment boundary layer. -/ +theorem boundaryNeighborCentersForParent_card_le_globalBoundaryLayer_card + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (boundaryNeighborCentersForParent Q j m T).card ≤ + (incrementBoundaryLayerCentersAtDepth Q j m).card := + Finset.card_le_card + (boundaryNeighborCentersForParent_subset_incrementBoundaryLayerCentersAtDepth + Q j m T) + +theorem boundaryNeighborCentersForParent_card_le_globalBoundaryLayer_pow + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (boundaryNeighborCentersForParent Q j m T).card ≤ + (3 ^ d) ^ (m + 1) * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) := by + exact (boundaryNeighborCentersForParent_card_le_globalBoundaryLayer_card Q j m T).trans + (incrementBoundaryLayerCentersAtDepth_card_le_pow Q j m) + +theorem boundaryNeighborCentersForParent_card_cast_le_globalBoundaryLayer_pow + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ + ((3 ^ d) ^ (m + 1) * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) : ℕ) := by + exact_mod_cast boundaryNeighborCentersForParent_card_le_globalBoundaryLayer_pow + Q j m T + +/-- Boundary-layer centers generated by the children of one depth-`m` parent. +This is the scale-sharp part of the hit count; the separate remaining geometry +is to control centers generated by neighboring depth-`m` parents. -/ +noncomputable def childBoundaryLayerCentersAtDepth {d : ℕ} + (T : TriadicCube d) (n : ℕ) : Finset (TriadicCube d) := by + classical + exact (childCubes T).biUnion fun R => descendantBoundaryLayerAtDepth R n + +theorem childBoundaryLayerCentersAtDepth_card_le {d : ℕ} + (T : TriadicCube d) (n : ℕ) : + (childBoundaryLayerCentersAtDepth T n).card ≤ + (3 ^ d) * (2 * d * (3 ^ (d - 1)) ^ n) := by + classical + calc + (childBoundaryLayerCentersAtDepth T n).card + ≤ ∑ R ∈ childCubes T, (descendantBoundaryLayerAtDepth R n).card := by + dsimp [childBoundaryLayerCentersAtDepth] + exact Finset.card_biUnion_le + _ ≤ ∑ _R ∈ childCubes T, 2 * d * (3 ^ (d - 1)) ^ n := by + refine Finset.sum_le_sum ?_ + intro R _hR + exact descendantBoundaryLayerAtDepth_card_le R n + _ = (3 ^ d) * (2 * d * (3 ^ (d - 1)) ^ n) := by + simp [childCubes_card] + +theorem childBoundaryLayerCentersAtDepth_card_cast_le {d : ℕ} + (T : TriadicCube d) (n : ℕ) : + ((childBoundaryLayerCentersAtDepth T n).card : ℝ) ≤ + (3 ^ d : ℝ) * (2 * d * (3 ^ (d - 1)) ^ n : ℕ) := by + exact_mod_cast childBoundaryLayerCentersAtDepth_card_le T n + +/-- The own-child part of the parent hit family. -/ +noncomputable def ownChildBoundaryNeighborCentersForParent {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + Finset (TriadicCube d) := by + classical + exact (boundaryNeighborCentersForParent Q j m T).filter fun S => + S ∈ childBoundaryLayerCentersAtDepth T (j - m) + +theorem ownChildBoundaryNeighborCentersForParent_subset_childBoundaryLayerCentersAtDepth + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + ownChildBoundaryNeighborCentersForParent Q j m T ⊆ + childBoundaryLayerCentersAtDepth T (j - m) := by + intro S hS + exact (Finset.mem_filter.mp hS).2 + +theorem ownChildBoundaryNeighborCentersForParent_card_le {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (ownChildBoundaryNeighborCentersForParent Q j m T).card ≤ + (3 ^ d) * (2 * d * (3 ^ (d - 1)) ^ (j - m)) := + (Finset.card_le_card + (ownChildBoundaryNeighborCentersForParent_subset_childBoundaryLayerCentersAtDepth + Q j m T)).trans + (childBoundaryLayerCentersAtDepth_card_le T (j - m)) + +/-- Depth-`m` parents whose children generate at least one admissible +boundary-neighbor center for the fixed charged parent `T`. -/ +noncomputable def boundaryGeneratingParentsForParent {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q m).filter fun P => + ∃ S ∈ boundaryNeighborCentersForParent Q j m T, + S ∈ childBoundaryLayerCentersAtDepth P (j - m) + +theorem mem_boundaryGeneratingParentsForParent_iff {d : ℕ} + {Q P T : TriadicCube d} {j m : ℕ} : + P ∈ boundaryGeneratingParentsForParent Q j m T ↔ + P ∈ descendantsAtDepth Q m ∧ + ∃ S ∈ boundaryNeighborCentersForParent Q j m T, + S ∈ childBoundaryLayerCentersAtDepth P (j - m) := by + classical + simp [boundaryGeneratingParentsForParent] + +theorem boundaryNeighborCentersForParent_subset_generatingParents_childBoundary + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + boundaryNeighborCentersForParent Q j m T ⊆ + (boundaryGeneratingParentsForParent Q j m T).biUnion + (fun P => childBoundaryLayerCentersAtDepth P (j - m)) := by + intro S hS + have hboundary : S ∈ incrementBoundaryLayerCentersAtDepth Q j m := + (mem_boundaryNeighborCentersForParent_iff.mp hS).1 + dsimp [incrementBoundaryLayerCentersAtDepth] at hboundary + rcases Finset.mem_biUnion.mp hboundary with ⟨R, hR, hSR⟩ + rcases mem_descendantsAtDepth_succ_iff.mp hR with ⟨P, hP, hRP⟩ + have hSchild : S ∈ childBoundaryLayerCentersAtDepth P (j - m) := by + dsimp [childBoundaryLayerCentersAtDepth] + exact Finset.mem_biUnion.mpr ⟨R, hRP, hSR⟩ + have hPgen : P ∈ boundaryGeneratingParentsForParent Q j m T := + mem_boundaryGeneratingParentsForParent_iff.2 + ⟨hP, ⟨S, hS, hSchild⟩⟩ + exact Finset.mem_biUnion.mpr ⟨P, hPgen, hSchild⟩ + +theorem boundaryNeighborCentersForParent_card_le_generatingParents_mul_surface + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (boundaryNeighborCentersForParent Q j m T).card ≤ + (boundaryGeneratingParentsForParent Q j m T).card * + (3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m))) := by + classical + calc + (boundaryNeighborCentersForParent Q j m T).card + ≤ + ((boundaryGeneratingParentsForParent Q j m T).biUnion + (fun P => childBoundaryLayerCentersAtDepth P (j - m))).card := + Finset.card_le_card + (boundaryNeighborCentersForParent_subset_generatingParents_childBoundary + Q j m T) + _ ≤ + ∑ P ∈ boundaryGeneratingParentsForParent Q j m T, + (childBoundaryLayerCentersAtDepth P (j - m)).card := by + exact Finset.card_biUnion_le + _ ≤ + ∑ _P ∈ boundaryGeneratingParentsForParent Q j m T, + 3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m)) := by + refine Finset.sum_le_sum ?_ + intro P _hP + exact childBoundaryLayerCentersAtDepth_card_le P (j - m) + _ = + (boundaryGeneratingParentsForParent Q j m T).card * + (3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m))) := by + simp + +theorem boundaryNeighborCentersForParent_card_le_of_generatingParents_card_le + {d : ℕ} (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) {K : ℕ} + (hK : (boundaryGeneratingParentsForParent Q j m T).card ≤ K) : + (boundaryNeighborCentersForParent Q j m T).card ≤ + K * (3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m))) := by + exact (boundaryNeighborCentersForParent_card_le_generatingParents_mul_surface + Q j m T).trans + (Nat.mul_le_mul_right _ hK) + +/-- Pure finite-sum bookkeeping for the remaining geometry. If every +depth-`m` parent is charged by at most `M` admissible boundary-neighbor centers, +then the full boundary-neighbor energy sum is controlled by `M` times the +ordinary depth-`m` parent child-energy sum. -/ +theorem admissible_boundary_neighborEnergy_sum_le_count_mul_parentEnergy_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j m : ℕ) + {M : ℝ} + (hM : + ∀ T ∈ descendantsAtDepth Q m, + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ M) : + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) + ≤ + M * + ∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + classical + let D : Finset (TriadicCube d) := incrementBoundaryLayerCentersAtDepth Q j m + let P : Finset (TriadicCube d) := descendantsAtDepth Q m + let E : TriadicCube d → ℝ := fun T => + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) + have hE_nonneg : ∀ T ∈ P, 0 ≤ E T := by + intro T _hT + exact parentChildEnergy_sum_nonneg T u + have hpoint : + ∀ S ∈ D, + (if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) ≤ + ∑ T ∈ P, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := by + intro S hS + by_cases hcenter : S ∈ overlapCentersAtDepth Q j + · have hsubset : + overlapIntersectingParentsAtDepth Q S m ⊆ + P.filter (fun T => S ∈ boundaryNeighborCentersForParent Q j m T) := by + intro T hT + rw [Finset.mem_filter] + have hTdesc : T ∈ descendantsAtDepth Q m := + (mem_overlapIntersectingParentsAtDepth_iff.mp hT).1 + exact ⟨by simpa [P] using hTdesc, + mem_boundaryNeighborCentersForParent_iff.2 + ⟨by simpa [D] using hS, hcenter, hT⟩⟩ + have hsum_le : + (overlapIntersectingParentsAtDepth Q S m).sum E ≤ + (P.filter (fun T => S ∈ boundaryNeighborCentersForParent Q j m T)).sum E := + Finset.sum_le_sum_of_subset_of_nonneg hsubset + (fun T hT _hnot => by + exact hE_nonneg T (Finset.mem_filter.mp hT).1) + calc + (if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) + = (overlapIntersectingParentsAtDepth Q S m).sum E := by + simp [hcenter, overlapIntersectingParentEnergy, E] + _ ≤ (P.filter + (fun T => S ∈ boundaryNeighborCentersForParent Q j m T)).sum E := + hsum_le + _ = + ∑ T ∈ P, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := by + rw [Finset.sum_filter] + · simp [hcenter] + exact Finset.sum_nonneg fun T hT => by + by_cases hmem : S ∈ boundaryNeighborCentersForParent Q j m T + · simp [hmem, hE_nonneg T hT] + · simp [hmem] + have hsum₁ : + D.sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) + ≤ + ∑ S ∈ D, ∑ T ∈ P, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := + Finset.sum_le_sum hpoint + have hswap : + (∑ S ∈ D, ∑ T ∈ P, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0) + = + ∑ T ∈ P, ∑ S ∈ D, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := by + exact Finset.sum_comm + have hinner : + ∀ T ∈ P, + (∑ S ∈ D, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0) + ≤ M * E T := by + intro T hT + have hfilter : + D.filter (fun S => S ∈ boundaryNeighborCentersForParent Q j m T) = + boundaryNeighborCentersForParent Q j m T := by + ext S + constructor + · intro hS + exact (Finset.mem_filter.mp hS).2 + · intro hS + rw [Finset.mem_filter] + exact ⟨(mem_boundaryNeighborCentersForParent_iff.mp hS).1, hS⟩ + calc + (∑ S ∈ D, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0) + = + ∑ S ∈ D.filter + (fun S => S ∈ boundaryNeighborCentersForParent Q j m T), E T := by + rw [Finset.sum_filter] + _ = ∑ S ∈ boundaryNeighborCentersForParent Q j m T, E T := by + rw [hfilter] + _ = ((boundaryNeighborCentersForParent Q j m T).card : ℝ) * E T := by + simp [Finset.sum_const, nsmul_eq_mul] + _ ≤ M * E T := by + exact mul_le_mul_of_nonneg_right (hM T (by simpa [P] using hT)) + (hE_nonneg T hT) + calc + (incrementBoundaryLayerCentersAtDepth Q j m).sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) + = D.sum + (fun S => + if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0) := rfl + _ ≤ + ∑ S ∈ D, ∑ T ∈ P, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := + hsum₁ + _ = + ∑ T ∈ P, ∑ S ∈ D, + if S ∈ boundaryNeighborCentersForParent Q j m T then E T else 0 := + hswap + _ ≤ ∑ T ∈ P, M * E T := by + exact Finset.sum_le_sum hinner + _ = M * ∑ T ∈ P, E T := by + rw [Finset.mul_sum] + _ = + M * + ∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := rfl + +/-- One-increment boundary estimate after the local-neighbor budget and a +supplied parent-hit counting bound. The remaining geometric theorem should +provide the count `M ≃ (3^(d-1))^(j-m)`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_neighbor_count_parentEnergy_sum + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) {M : ℝ} + (hM : + ∀ T ∈ descendantsAtDepth Q m, + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ M) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huChild : + ∀ T ∈ descendantsAtDepth Q m, ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (4 * + (M * + ∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2))) := by + classical + let H : TriadicCube d → ℝ := fun S => + if S ∈ overlapCentersAtDepth Q j then + overlapIntersectingParentEnergy Q S m u + else + 0 + let H4 : TriadicCube d → ℝ := fun S => + if S ∈ overlapCentersAtDepth Q j then + 4 * overlapIntersectingParentEnergy Q S m u + else + 0 + have hboundary := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_boundary_neighborEnergy_sum + (Q := Q) (u := u) hmj hincLoc huChild + have hbook := + admissible_boundary_neighborEnergy_sum_le_count_mul_parentEnergy_sum + (Q := Q) (u := u) j m hM + have hsum4 : + (incrementBoundaryLayerCentersAtDepth Q j m).sum H4 = + 4 * (incrementBoundaryLayerCentersAtDepth Q j m).sum H := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro S _hS + by_cases hcenter : S ∈ overlapCentersAtDepth Q j + · simp [H4, hcenter] + · simp [H4, hcenter] + have hsum : + (incrementBoundaryLayerCentersAtDepth Q j m).sum H4 ≤ + 4 * + (M * + ∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) := by + rw [hsum4] + exact mul_le_mul_of_nonneg_left hbook (by norm_num) + exact hboundary.trans + (mul_le_mul_of_nonneg_left hsum + (inv_nonneg.mpr + (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ)))) + +/-- One-increment boundary estimate after the parent-hit count, expressed in +terms of the ordinary standard positive depth-`m` average. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_neighbor_count_depthAverage + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) {M : ℝ} + (hM : + ∀ T ∈ descendantsAtDepth Q m, + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ M) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * + (4 * + (M * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m))) := by + have hM_nonneg : 0 ≤ M := by + rcases descendantsAtDepth_nonempty Q m with ⟨T, hT⟩ + exact le_trans (by positivity : 0 ≤ ((boundaryNeighborCentersForParent Q j m T).card : ℝ)) + (hM T hT) + have huChild : + ∀ T ∈ descendantsAtDepth Q m, ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro T hT R hR + have hRdesc : R ∈ descendantsAtDepth T 1 := by + simpa [descendantsAtDepth_one] using hR + exact memLp_on_descendant_of_memLp_generic hRdesc (huParent T hT) + have hparent := + parentChildEnergy_sum_descendants_le_const_mul_depthAverage + Q u m huParent + have hbase := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_neighbor_count_parentEnergy_sum + (Q := Q) (u := u) hmj hM hincLoc huChild + have hbudget : + 4 * + (M * + ∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) + ≤ + 4 * + (M * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hparent hM_nonneg) (by norm_num) + exact hbase.trans + (mul_le_mul_of_nonneg_left hbudget + (inv_nonneg.mpr + (by positivity : 0 ≤ ((overlapCentersAtDepth Q j).card : ℝ)))) + +/-- Scale-separated normalization form of +`cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_neighbor_count_depthAverage`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_pow_inv_neighbor_count_depthAverage + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) {M : ℝ} + (hM : + ∀ T ∈ descendantsAtDepth Q m, + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ M) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j ≤ + (((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (M * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m))) := by + have hbase := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_neighbor_count_depthAverage + (Q := Q) (u := u) hmj hM hincLoc huParent + have hM_nonneg : 0 ≤ M := by + rcases descendantsAtDepth_nonempty Q m with ⟨T, hT⟩ + exact le_trans (by positivity : 0 ≤ ((boundaryNeighborCentersForParent Q j m T).card : ℝ)) + (hM T hT) + have hbudget_nonneg : + 0 ≤ + 4 * + (M * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)) := by + have havg_nonneg : 0 ≤ cubeBesovPositiveVectorDepthAverage Q u m := + cubeBesovPositiveVectorDepthAverage_nonneg Q u m + positivity + have hcardLower : + (((3 ^ d) ^ j : ℕ) : ℝ) ≤ ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast pow_le_overlapCentersAtDepth_card Q j + have hcard_pos : 0 < ((overlapCentersAtDepth Q j).card : ℝ) := by + exact_mod_cast overlapCentersAtDepth_card_pos Q j + have hpow_pos : 0 < (((3 ^ d) ^ j : ℕ) : ℝ) := by + positivity + have hinv : + ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ ≤ + (((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ := + (inv_le_inv₀ hcard_pos hpow_pos).2 hcardLower + exact hbase.trans + (mul_le_mul_of_nonneg_right hinv hbudget_nonneg) + +/-- Projection-gap seminorm estimate assembled from the one-increment +neighbor-count estimates. This is the downstream form of the remaining +geometry: supply the hit count for every increment scale, and the projection +jump is controlled by the corresponding weighted standard positive depths. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_neighbor_count_depthAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (M : ℕ → ℝ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hM : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ M m) + (huParent : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j ≤ + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (M m * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) := by + have hgap := + cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_incrementVec + Q s u j hincLoc + refine hgap.trans ?_ + refine Finset.sum_le_sum ?_ + intro m hm + have hmj : m ≤ j := Nat.le_of_lt (Finset.mem_range.mp hm) + have havg := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeIncrementVec_le_pow_inv_neighbor_count_depthAverage + (Q := Q) (u := u) (j := j) (m := m) hmj + (hM m hm) (fun S hS => hincLoc S hS m hm) (huParent m hm) + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + exact mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt havg) hweight_nonneg + +/-- Baseline projection-gap estimate using the global boundary-layer count. +This is scale-incorrect for the final theorem, but it is a fully proved +fallback showing that the hit-count interface composes without any remaining +analytic hypotheses. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_globalBoundaryLayer_depthAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j ≤ + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + ((((3 ^ d) ^ (m + 1) * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) := by + exact + cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_neighbor_count_depthAverage + (Q := Q) (s := s) (u := u) (j := j) + (M := fun m => + (((3 ^ d) ^ (m + 1) * + (2 * d * (3 ^ (d - 1)) ^ (j - m)) : ℕ) : ℝ)) + hincLoc + (fun m _hm T _hT => + boundaryNeighborCentersForParent_card_cast_le_globalBoundaryLayer_pow + Q j m T) + huParent + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighborCount.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighborCount.lean new file mode 100644 index 0000000000..f381af8e00 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionBoundaryNeighborCount.lean @@ -0,0 +1,343 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighbor + +/-! # Standard Projection Boundary Neighbor Count -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal BigOperators + +/-! +# Sharp boundary-neighbor hit counts + +This file closes the geometric counting interface left by +`StandardProjectionBoundaryNeighbor`. For a fixed depth-`m` parent `T`, any +depth-`m` parent whose boundary children can charge `T` must lie in the +one-step lattice neighborhood of `T`. That neighborhood has dimension-only +cardinality, by triadic color injectivity. +-/ + +noncomputable def oneStepNeighborParentsAtDepth {d : ℕ} + (Q : TriadicCube d) (m : ℕ) (T : TriadicCube d) : + Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q m).filter fun P => + ∀ i : Fin d, T.index i - 1 ≤ P.index i ∧ P.index i ≤ T.index i + 1 + +theorem mem_oneStepNeighborParentsAtDepth_iff {d : ℕ} + {Q P T : TriadicCube d} {m : ℕ} : + P ∈ oneStepNeighborParentsAtDepth Q m T ↔ + P ∈ descendantsAtDepth Q m ∧ + ∀ i : Fin d, T.index i - 1 ≤ P.index i ∧ + P.index i ≤ T.index i + 1 := by + classical + simp [oneStepNeighborParentsAtDepth] + +theorem cubeColor_injOn_oneStepNeighborParentsAtDepth {d : ℕ} + (Q : TriadicCube d) (m : ℕ) (T : TriadicCube d) : + Set.InjOn cubeColor (oneStepNeighborParentsAtDepth Q m T : Set (TriadicCube d)) := by + intro P hP R hR hcolor + rcases mem_oneStepNeighborParentsAtDepth_iff.mp hP with ⟨hPdesc, hPnear⟩ + rcases mem_oneStepNeighborParentsAtDepth_iff.mp hR with ⟨hRdesc, hRnear⟩ + have hscale : P.scale = R.scale := by + calc + P.scale = Q.scale - m := scale_eq_sub_of_mem_descendantsAtDepth hPdesc + _ = R.scale := by + symm + exact scale_eq_sub_of_mem_descendantsAtDepth hRdesc + have hindex : P.index = R.index := by + funext i + by_contra hne + rcases lt_or_gt_of_ne hne with hlt | hgt + · have hgap : P.index i + 3 ≤ R.index i := + cubeColor_index_add_three_le_of_lt hcolor hlt + have hPlo := (hPnear i).1 + have hRhi := (hRnear i).2 + omega + · have hgap : R.index i + 3 ≤ P.index i := + cubeColor_index_add_three_le_of_lt hcolor.symm hgt + have hRlo := (hRnear i).1 + have hPhi := (hPnear i).2 + omega + cases P with + | mk Pscale Pindex => + cases R with + | mk Rscale Rindex => + simp at hscale hindex ⊢ + exact ⟨hscale, hindex⟩ + +theorem oneStepNeighborParentsAtDepth_card_le_pow {d : ℕ} + (Q : TriadicCube d) (m : ℕ) (T : TriadicCube d) : + (oneStepNeighborParentsAtDepth Q m T).card ≤ 3 ^ d := by + classical + have hcard_univ : + (oneStepNeighborParentsAtDepth Q m T).card ≤ + (Finset.univ : Finset (CubeColor d)).card := by + refine Finset.card_le_card_of_injOn cubeColor ?_ ?_ + · intro P _hP + simp + · exact cubeColor_injOn_oneStepNeighborParentsAtDepth Q m T + simpa [card_cubeColor] using hcard_univ + +theorem cubeScaleFactor_le_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {n : ℕ} + (hR : R ∈ descendantsAtDepth Q n) : + cubeScaleFactor R ≤ cubeScaleFactor Q := by + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth hR] + exact div_le_self (le_of_lt (cubeScaleFactor_pos' Q)) + (one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3)) + +theorem cubeIndex_oneStep_of_overlap_inter_cube_of_descendant + {d : ℕ} {P S T : TriadicCube d} {n : ℕ} + (hSP : S ∈ descendantsAtDepth P n) + (hscale : T.scale = P.scale) + (hinter : (overlapCubeSet S ∩ cubeSet T).Nonempty) : + ∀ i : Fin d, T.index i - 1 ≤ P.index i ∧ + P.index i ≤ T.index i + 1 := by + rcases hinter with ⟨x, hxS, hxT⟩ + have hSscale_le : cubeScaleFactor S ≤ cubeScaleFactor P := + cubeScaleFactor_le_of_mem_descendantsAtDepth hSP + have hfactor_eq : cubeScaleFactor T = cubeScaleFactor P := by + simp [cubeScaleFactor, hscale] + intro i + constructor + · by_contra hnot + have hindex : P.index i + 2 ≤ T.index i := by omega + have hgap : + cubeCoordUpper P i + cubeScaleFactor P ≤ cubeCoordLower T i := by + rw [cubeCoordUpper, cubeCoordLower, hfactor_eq] + have hindex_real : (P.index i : ℝ) + 2 ≤ (T.index i : ℝ) := by + exact_mod_cast hindex + have hcoeff : + (P.index i : ℝ) + (3 / 2 : ℝ) ≤ + (T.index i : ℝ) - (1 / 2 : ℝ) := by + linarith + have hscale_nonneg : 0 ≤ cubeScaleFactor P := + le_of_lt (cubeScaleFactor_pos' P) + nlinarith [mul_le_mul_of_nonneg_right hcoeff hscale_nonneg] + have hSupperP : cubeCoordUpper S i ≤ cubeCoordUpper P i := + cubeCoordUpper_le_of_mem_descendantsAtDepth hSP i + have hover_le : overlapCoordUpper S i ≤ cubeCoordLower T i := by + rw [overlapCoordUpper_eq_cubeCoordUpper_add_cubeScaleFactor] + linarith + have hxTlo := (mem_cubeSet_iff_coord_bounds.mp hxT i).1 + have hxSupper := (mem_overlapCubeSet_iff_coord_bounds.mp hxS i).2 + exact not_lt_of_ge hxTlo (lt_of_lt_of_le hxSupper hover_le) + · by_contra hnot + have hindex : T.index i + 2 ≤ P.index i := by omega + have hgap : + cubeCoordUpper T i + cubeScaleFactor P ≤ cubeCoordLower P i := by + rw [cubeCoordUpper, cubeCoordLower, hfactor_eq] + have hindex_real : (T.index i : ℝ) + 2 ≤ (P.index i : ℝ) := by + exact_mod_cast hindex + have hcoeff : + (T.index i : ℝ) + (3 / 2 : ℝ) ≤ + (P.index i : ℝ) - (1 / 2 : ℝ) := by + linarith + have hscale_nonneg : 0 ≤ cubeScaleFactor P := + le_of_lt (cubeScaleFactor_pos' P) + nlinarith [mul_le_mul_of_nonneg_right hcoeff hscale_nonneg] + have hPlowerS : cubeCoordLower P i ≤ cubeCoordLower S i := + cubeCoordLower_le_of_mem_descendantsAtDepth hSP i + have hupper_le : cubeCoordUpper T i ≤ overlapCoordLower S i := by + rw [overlapCoordLower_eq_cubeCoordLower_sub_cubeScaleFactor] + linarith + have hxTupper := (mem_cubeSet_iff_coord_bounds.mp hxT i).2 + have hxSlower := (mem_overlapCubeSet_iff_coord_bounds.mp hxS i).1 + exact not_lt_of_ge (le_trans hupper_le hxSlower) hxTupper + +theorem mem_descendantsAtDepth_succ_of_mem_childBoundaryLayerCentersAtDepth + {d : ℕ} {P S : TriadicCube d} {n : ℕ} + (hS : S ∈ childBoundaryLayerCentersAtDepth P n) : + S ∈ descendantsAtDepth P (1 + n) := by + classical + dsimp [childBoundaryLayerCentersAtDepth] at hS + rcases Finset.mem_biUnion.mp hS with ⟨R, hRchild, hSboundary⟩ + have hSdesc : S ∈ descendantsAtDepth R n := + (mem_descendantBoundaryLayerAtDepth_iff.mp hSboundary).1 + have hRdesc : R ∈ descendantsAtDepth P 1 := by + simpa [descendantsAtDepth_one] using hRchild + exact mem_descendantsAtDepth_add hRdesc hSdesc + +theorem boundaryGeneratingParentsForParent_subset_oneStepNeighborParentsAtDepth + {d : ℕ} (Q : TriadicCube d) {j m : ℕ} (T : TriadicCube d) : + boundaryGeneratingParentsForParent Q j m T ⊆ + oneStepNeighborParentsAtDepth Q m T := by + intro P hP + rcases mem_boundaryGeneratingParentsForParent_iff.mp hP with + ⟨hPdesc, S, hSneighbor, hSchild⟩ + rcases mem_boundaryNeighborCentersForParent_iff.mp hSneighbor with + ⟨_hSboundary, _hScenter, hTintersect⟩ + rcases mem_overlapIntersectingParentsAtDepth_iff.mp hTintersect with + ⟨hTdesc, hinter⟩ + have hscale : T.scale = P.scale := by + calc + T.scale = Q.scale - m := scale_eq_sub_of_mem_descendantsAtDepth hTdesc + _ = P.scale := by + symm + exact scale_eq_sub_of_mem_descendantsAtDepth hPdesc + have hSPdesc : S ∈ descendantsAtDepth P (1 + (j - m)) := + mem_descendantsAtDepth_succ_of_mem_childBoundaryLayerCentersAtDepth hSchild + exact mem_oneStepNeighborParentsAtDepth_iff.2 + ⟨hPdesc, + cubeIndex_oneStep_of_overlap_inter_cube_of_descendant hSPdesc hscale hinter⟩ + +theorem boundaryGeneratingParentsForParent_card_le_pow {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (boundaryGeneratingParentsForParent Q j m T).card ≤ 3 ^ d := + (Finset.card_le_card + (boundaryGeneratingParentsForParent_subset_oneStepNeighborParentsAtDepth + Q T)).trans + (oneStepNeighborParentsAtDepth_card_le_pow Q m T) + +theorem boundaryNeighborCentersForParent_card_le_sharp {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + (boundaryNeighborCentersForParent Q j m T).card ≤ + 3 ^ d * (3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m))) := by + exact boundaryNeighborCentersForParent_card_le_of_generatingParents_card_le + Q j m T (boundaryGeneratingParentsForParent_card_le_pow Q j m T) + +theorem boundaryNeighborCentersForParent_card_cast_le_sharp {d : ℕ} + (Q : TriadicCube d) (j m : ℕ) (T : TriadicCube d) : + ((boundaryNeighborCentersForParent Q j m T).card : ℝ) ≤ + ((3 ^ d * (3 ^ d * (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ) := by + exact_mod_cast boundaryNeighborCentersForParent_card_le_sharp Q j m T + +/-- Projection-gap estimate with the sharp per-parent boundary-neighbor count. +This is the closed geometric version of the hit-count interface from +`StandardProjectionBoundaryNeighbor`: the only remaining inputs are the local +`L²` hypotheses needed to form the overlap norms and the ordinary standard +parent `L²` hypotheses. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_sharpBoundary_depthAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j ≤ + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (((3 ^ d * (3 ^ d * + (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) := by + exact + cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_neighbor_count_depthAverage + (Q := Q) (s := s) (u := u) (j := j) + (M := fun m => + ((3 ^ d * (3 ^ d * + (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ)) + hincLoc + (fun m _hm T _hT => + boundaryNeighborCentersForParent_card_cast_le_sharp Q j m T) + huParent + +/-- One-depth hard comparison with the sharp projection-gap branch inserted. +The residual half is paid by the same-depth ordinary standard positive term; +the projection half is paid by the sharp boundary-neighbor sum over coarser +ordinary positive depths. -/ +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_sharpBoundary_sum + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + let G : ℝ := + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (((3 ^ d * (3 ^ d * + (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 ≤ + 8 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + + 4 * G ^ 2 := by + dsimp only + let G : ℝ := + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (((3 ^ d * (3 ^ d * + (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) + have hsplit := + sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_gap_zero + Q s u j hres hresLoc hprojLoc hzeroLoc hgapLoc + have hgap : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j ≤ G := by + dsimp [G] + exact + cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_sqrt_sharpBoundary_depthAverage + Q s u j hincLoc huParent + have hG_nonneg : 0 ≤ G := by + dsimp [G] + refine Finset.sum_nonneg ?_ + intro m _hm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have hgap_sq : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j) ^ 2 ≤ G ^ 2 := + (sq_le_sq₀ + (cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s + (cubeProjectionGapVec Q 0 j u) j) + hG_nonneg).mpr hgap + exact hsplit.trans + (add_le_add_right + (mul_le_mul_of_nonneg_left hgap_sq (by norm_num : 0 ≤ (4 : ℝ))) + (8 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionIncrementEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionIncrementEnergy.lean new file mode 100644 index 0000000000..9d838006bf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionIncrementEnergy.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapFluctuation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionVector + +/-! # Standard Projection Increment Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory +open scoped ENNReal BigOperators + +/-! +# Energy bounds for standard martingale increments + +This file records the local Jensen step needed for the boundary-budget +construction: a child-minus-parent average is controlled by the `L²` energy of +the field measured relative to the parent average on that child. +-/ + +/-- A child-average jump is controlled coordinatewise by the child `L²` +energy relative to the parent average. -/ +theorem vecNormSq_childAverage_sub_parentAverage_le_sum_cubeAverage_sq_sub_parentAverage + {d : ℕ} {T R : TriadicCube d} (u : Vec d → Vec d) + (_hRT : R ∈ childCubes T) + (huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + vecNormSq (cubeAverageVec R u - cubeAverageVec T u) ≤ + ∑ i : Fin d, cubeAverage R (fun x => (u x i - cubeAverageVec T u i) ^ 2) := by + have hfield : + MeasureTheory.MemLp (fun x => u x - cubeAverageVec T u) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + huR.sub (MeasureTheory.memLp_const (cubeAverageVec T u)) + have hJ := + vecNormSq_cubeAverageVec_le_sum_cubeAverage_sq_of_memLp + R (fun x => u x - cubeAverageVec T u) hfield + have havg : + cubeAverageVec R (fun x => u x - cubeAverageVec T u) = + cubeAverageVec R u - cubeAverageVec T u := + cubeAverageVec_sub_const R u (cubeAverageVec T u) huR + simpa [havg] using hJ + +/-- Pointwise form for a martingale increment on a child cube: the squared +increment value is paid by the child energy relative to the parent average. -/ +theorem vecNormSq_cubeIncrementVec_le_sum_cubeAverage_sq_sub_parentAverage + {d : ℕ} {Q T R : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hT : T ∈ descendantsAtDepth Q m) (hRT : R ∈ childCubes T) {x : Vec d} + (hxR : x ∈ cubeSet R) + (huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + vecNormSq (cubeIncrementVec Q (m + 1) u x) ≤ + ∑ i : Fin d, cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + rw [cubeIncrementVec_eq_sub_cubeAverageVec_of_mem_childCubes + (Q := Q) (T := T) (R := R) (m := m) u hT hRT hxR] + exact + vecNormSq_childAverage_sub_parentAverage_le_sum_cubeAverage_sq_sub_parentAverage + (T := T) (R := R) u hRT huR + +theorem cubeAverage_sq_sub_parentAverage_nonneg {d : ℕ} + (T R : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) : + 0 ≤ cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + unfold cubeAverage + exact mul_nonneg (inv_nonneg.mpr (cubeVolume_nonneg R)) + (MeasureTheory.setIntegral_nonneg (measurableSet_cubeSet R) + fun y _hy => sq_nonneg (u y i - cubeAverageVec T u i)) + +theorem childEnergy_sum_nonneg {d : ℕ} (T R : TriadicCube d) (u : Vec d → Vec d) : + 0 ≤ ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.sum_nonneg fun i _hi => + cubeAverage_sq_sub_parentAverage_nonneg T R u i + +theorem parentChildEnergy_sum_nonneg {d : ℕ} (T : TriadicCube d) + (u : Vec d → Vec d) : + 0 ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.sum_nonneg fun R _hR => childEnergy_sum_nonneg T R u + +/-- The child-energy sum relative to a parent average is controlled by the +ordinary vector `L²` fluctuation on the parent. The factor `3^d` comes from +summing normalized child averages rather than averaging over the children, and +the factor `d` comes from comparing the Euclidean coordinate sum to the ambient +Pi norm used by `cubeLpNorm`. -/ +theorem parentChildEnergy_sum_le_card_mul_cubeLpNorm_cubeFluctuationVec_sq + {d : ℕ} (T : TriadicCube d) (u : Vec d → Vec d) + (huT : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + (∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) ≤ + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + (cubeLpNorm T (2 : ℝ≥0∞) (cubeFluctuationVec T u)) ^ 2 := by + let v : Vec d → Vec d := cubeFluctuationVec T u + have hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure T) := + memLp_cubeFluctuationVec T u huT + have hcoord_mem : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => v x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure T) := by + intro i + exact memLp_component_of_memLp v i hv + have hsum_coord : + ∀ i : Fin d, + ∑ R ∈ childCubes T, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) = + (3 ^ d : ℝ) * + (cubeLpNorm T (2 : ℝ≥0∞) (fun y => v y i)) ^ 2 := by + intro i + let f : Vec d → ℝ := fun y => (u y i - cubeAverageVec T u i) ^ 2 + have hf_int : + MeasureTheory.IntegrableOn f (cubeSet T) MeasureTheory.volume := by + have hpow : + MeasureTheory.IntegrableOn (fun y => ‖v y i‖ ^ (2 : ℝ)) + (cubeSet T) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure (Q := T) + ((hcoord_mem i).integrable_norm_rpow + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by norm_num : (2 : ℝ≥0∞) ≠ ⊤)) + simpa [f, v, cubeFluctuationVec, Real.norm_eq_abs, sq_abs, Real.rpow_two] + using hpow + have havg := + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + T 1 f hf_int + have hsum : + ∑ R ∈ childCubes T, cubeAverage R f = + (3 ^ d : ℝ) * cubeAverage T f := by + have hpow_ne : (3 ^ d : ℝ) ≠ 0 := by positivity + simp [descendantsAverage, childCubes_card] at havg + calc + ∑ R ∈ childCubes T, cubeAverage R f + = (3 ^ d : ℝ) * + ((3 ^ d : ℝ)⁻¹ * + ∑ R ∈ childCubes T, cubeAverage R f) := by + field_simp [hpow_ne] + _ = (3 ^ d : ℝ) * cubeAverage T f := by + rw [← havg] + have hnorm : + (cubeLpNorm T (2 : ℝ≥0∞) (fun y => v y i)) ^ 2 = + cubeAverage T f := by + have hraw := + cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := T) (p := (2 : ℝ≥0∞)) (f := fun y => v y i) + (by norm_num) (by norm_num) (hcoord_mem i) + simpa [f, v, cubeFluctuationVec, Real.norm_eq_abs, sq_abs, Real.rpow_two] + using hraw + rw [hsum, ← hnorm] + calc + (∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) + = + ∑ i : Fin d, + ∑ R ∈ childCubes T, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + rw [Finset.sum_comm] + _ = + ∑ i : Fin d, + (3 ^ d : ℝ) * + (cubeLpNorm T (2 : ℝ≥0∞) (fun y => v y i)) ^ 2 := by + exact Finset.sum_congr rfl fun i _hi => hsum_coord i + _ ≤ + ∑ _i : Fin d, + (3 ^ d : ℝ) * + (cubeLpNorm T (2 : ℝ≥0∞) v) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hcomp := + cubeLpNorm_two_component_le_cubeLpNorm_two T v i hv + have hsq : + (cubeLpNorm T (2 : ℝ≥0∞) (fun y => v y i)) ^ 2 ≤ + (cubeLpNorm T (2 : ℝ≥0∞) v) ^ 2 := + (sq_le_sq₀ + (cubeLpNorm_nonneg T (2 : ℝ≥0∞) (fun y => v y i)) + (cubeLpNorm_nonneg T (2 : ℝ≥0∞) v)).mpr hcomp + exact mul_le_mul_of_nonneg_left hsq (by positivity) + _ = + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + (cubeLpNorm T (2 : ℝ≥0∞) v) ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + ring + +/-- Summed over all depth-`m` parents, the parent child-energy budgets are +controlled by the ordinary standard positive depth average. -/ +theorem parentChildEnergy_sum_descendants_le_const_mul_depthAverage + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (m : ℕ) + (huParent : + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + (∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) ≤ + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q m + let A : TriadicCube d → ℝ := fun T => + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) + let N : TriadicCube d → ℝ := fun T => + (cubeLpNorm T (2 : ℝ≥0∞) (cubeFluctuationVec T u)) ^ 2 + have hsum : + ∑ T ∈ D, A T ≤ + ∑ T ∈ D, + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * N T := by + refine Finset.sum_le_sum ?_ + intro T hT + exact parentChildEnergy_sum_le_card_mul_cubeLpNorm_cubeFluctuationVec_sq + T u (huParent T (by simpa [D] using hT)) + have hNsum : + ∑ T ∈ D, N T = + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m := by + have hcard_ne : ((descendantsAtDepth Q m).card : ℝ) ≠ 0 := by + exact_mod_cast Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q m) + unfold cubeBesovPositiveVectorDepthAverage descendantsAverage + change + ∑ T ∈ D, N T = + ((descendantsAtDepth Q m).card : ℝ) * + (((descendantsAtDepth Q m).card : ℝ)⁻¹ * + ∑ T ∈ descendantsAtDepth Q m, + (cubeLpNorm T (2 : ℝ≥0∞) (cubeFluctuationVec T u)) ^ 2) + simp [D, N] + field_simp [hcard_ne] + calc + (∑ T ∈ descendantsAtDepth Q m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2)) + = ∑ T ∈ D, A T := rfl + _ ≤ + ∑ T ∈ D, + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * N T := hsum + _ = + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ∑ T ∈ D, N T := by + rw [← Finset.mul_sum] + _ = + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + (((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m) := by + rw [hNsum] + _ = + (3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m := by + ring + +/-- If the point lies in a depth-`m` parent, the pointwise martingale +increment at scale `m + 1` is controlled by the finite sum of the child +energies of that parent. -/ +theorem vecNormSq_cubeIncrementVec_le_childEnergy_sum_of_mem_parent + {d : ℕ} {Q T : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hT : T ∈ descendantsAtDepth Q m) {x : Vec d} (hxT : x ∈ cubeSet T) + (huChild : + ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + vecNormSq (cubeIncrementVec Q (m + 1) u x) ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := T) (n := 1) hxT with + ⟨R, hR, hxR⟩ + have hRT : R ∈ childCubes T := by + simpa [descendantsAtDepth_one] using hR + have hlocal := + vecNormSq_cubeIncrementVec_le_sum_cubeAverage_sq_sub_parentAverage + (Q := Q) (T := T) (R := R) (m := m) u hT hRT hxR (huChild R hRT) + calc + vecNormSq (cubeIncrementVec Q (m + 1) u x) + ≤ ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := + hlocal + _ ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.single_le_sum + (fun A _hA => childEnergy_sum_nonneg T A u) hRT + +/-- Local overlap version of the child-energy budget. When the overlap cube +does not leave a depth-`m` parent, the fluctuation of the `m + 1` martingale +increment is paid by the finite child-energy sum of that parent. -/ +theorem sq_overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_le_four_mul_childEnergy_sum + {d : ℕ} {Q T S : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hT : T ∈ descendantsAtDepth Q m) + (hsub : overlapCubeSet S ⊆ cubeSet T) + (hinc : + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huChild : + ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ + 4 * + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + have hB : + 0 ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.sum_nonneg fun R hR => childEnergy_sum_nonneg T R u + exact + sq_overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_four_mul_of_forall_overlapCubeSet_vecNormSq_le + (S := S) (u := cubeIncrementVec Q (m + 1) u) hinc hB + (fun x hxS => + vecNormSq_cubeIncrementVec_le_childEnergy_sum_of_mem_parent + (Q := Q) (T := T) (m := m) u hT (hsub hxS) huChild) + +/-- Depth-`m` parents whose standard cubes meet a fixed overlap cube. This +is the local-neighbor family needed for the true finite-overlap summation. -/ +noncomputable def overlapIntersectingParentsAtDepth {d : ℕ} + (Q S : TriadicCube d) (m : ℕ) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q m).filter fun T => + (overlapCubeSet S ∩ cubeSet T).Nonempty + +theorem mem_overlapIntersectingParentsAtDepth_iff {d : ℕ} + {Q S T : TriadicCube d} {m : ℕ} : + T ∈ overlapIntersectingParentsAtDepth Q S m ↔ + T ∈ descendantsAtDepth Q m ∧ (overlapCubeSet S ∩ cubeSet T).Nonempty := by + classical + simp [overlapIntersectingParentsAtDepth] + +/-- Pointwise local-neighbor version: on an overlap cube contained in `Q`, a +martingale increment is paid by child energies of only those depth-`m` parents +which meet that overlap cube. -/ +theorem vecNormSq_cubeIncrementVec_le_overlapIntersectingParentEnergy_sum + {d : ℕ} {Q S : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hSsub : overlapCubeSet S ⊆ cubeSet Q) {x : Vec d} (hxS : x ∈ overlapCubeSet S) + (huChild : + ∀ T ∈ descendantsAtDepth Q m, ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + vecNormSq (cubeIncrementVec Q (m + 1) u x) ≤ + ∑ T ∈ overlapIntersectingParentsAtDepth Q S m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (Q := Q) (n := m) + (hSsub hxS) with + ⟨T, hT, hxT⟩ + have hTneighbor : T ∈ overlapIntersectingParentsAtDepth Q S m := by + rw [mem_overlapIntersectingParentsAtDepth_iff] + exact ⟨hT, ⟨x, hxS, hxT⟩⟩ + have hlocal : + vecNormSq (cubeIncrementVec Q (m + 1) u x) ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := + vecNormSq_cubeIncrementVec_le_childEnergy_sum_of_mem_parent + (Q := Q) (T := T) (m := m) u hT hxT (huChild T hT) + calc + vecNormSq (cubeIncrementVec Q (m + 1) u x) + ≤ + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := + hlocal + _ ≤ + ∑ T ∈ overlapIntersectingParentsAtDepth Q S m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.single_le_sum + (fun A _hA => parentChildEnergy_sum_nonneg A u) hTneighbor + +/-- Overlap-fluctuation local-neighbor budget for one martingale increment. -/ +theorem sq_overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_le_four_mul_overlapIntersectingParentEnergy_sum + {d : ℕ} {Q S : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hSsub : overlapCubeSet S ⊆ cubeSet Q) + (hinc : + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huChild : + ∀ T ∈ descendantsAtDepth Q m, ∀ R ∈ childCubes T, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u))) ^ 2 ≤ + 4 * + ∑ T ∈ overlapIntersectingParentsAtDepth Q S m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + have hB : + 0 ≤ + ∑ T ∈ overlapIntersectingParentsAtDepth Q S m, + ∑ R ∈ childCubes T, + ∑ i : Fin d, + cubeAverage R (fun y => (u y i - cubeAverageVec T u i) ^ 2) := by + exact Finset.sum_nonneg fun T _hT => parentChildEnergy_sum_nonneg T u + exact + sq_overlapCubeLpNorm_two_overlapCubeFluctuationVec_le_four_mul_of_forall_overlapCubeSet_vecNormSq_le + (S := S) (u := cubeIncrementVec Q (m + 1) u) hinc hB + (fun x hxS => + vecNormSq_cubeIncrementVec_le_overlapIntersectingParentEnergy_sum + (Q := Q) (S := S) (m := m) u hSsub hxS huChild) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionResidual.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionResidual.lean new file mode 100644 index 0000000000..a9fdfa9f2a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionResidual.lean @@ -0,0 +1,694 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionVector + +/-! # Standard Projection Residual -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Overlap bounds for standard projection residuals + +This file isolates the residual half of the hard comparison from the corrected +overlapping positive norm back to the ordinary triadic positive norm. After +subtracting the depth-`j` standard projection, the existing finite-overlap +residual estimate controls the overlapping depth-`j` oscillation by the +ordinary depth-`j` positive average. +-/ + +/-- The overlapping depth average of the depth-`j` standard projection residual +is controlled by the ordinary positive depth average at the same scale. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_sub_cubeProjectionVec_le + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => u x - cubeProjectionVec Q j u x) j ≤ + 4 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j := by + have hbase := + cubeBesovOverlappingPositiveVectorDepthAverage_residual_le + Q (fun x => u x - cubeProjectionVec Q j u x) j hres hresLoc + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => u x - cubeProjectionVec Q j u x) j + ≤ + 4 * (3 ^ d : ℝ) * + (cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => u x - cubeProjectionVec Q j u x)) ^ 2 := hbase + _ = 4 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j := by + rw [cubeLpNorm_sub_cubeProjectionVec_sq_eq_cubeBesovPositiveVectorDepthAverage + Q u j hres] + +/-- The depth-zero standard projection is constant on every admissible overlap +cube, so its overlap average is the parent average. -/ +theorem overlapCubeAverageVec_cubeProjectionVec_zero_of_mem_overlapCentersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeAverageVec S (cubeProjectionVec Q 0 u) = cubeAverageVec Q u := by + calc + overlapCubeAverageVec S (cubeProjectionVec Q 0 u) + = overlapCubeAverageVec S (fun _ : Vec d => cubeAverageVec Q u) := by + exact overlapCubeAverageVec_congr_on_overlapCubeSet + (S := S) + (u := cubeProjectionVec Q 0 u) + (v := fun _ : Vec d => cubeAverageVec Q u) + (fun x hx => + cubeProjectionVec_zero_eq_cubeAverageVec_of_mem_cubeSet + Q u (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS hx)) + _ = cubeAverageVec Q u := by + simp + +/-- The depth-zero standard projection has zero overlap fluctuation on every +admissible overlap cube. -/ +theorem overlapCubeLpNorm_overlapCubeFluctuationVec_cubeProjectionVec_zero_eq_zero + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeProjectionVec Q 0 u)) = 0 := by + have havg : + overlapCubeAverageVec S (cubeProjectionVec Q 0 u) = cubeAverageVec Q u := + overlapCubeAverageVec_cubeProjectionVec_zero_of_mem_overlapCentersAtDepth + (Q := Q) (S := S) (j := j) u hS + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeProjectionVec Q 0 u)) + = overlapCubeLpNorm S (2 : ℝ≥0∞) (0 : Vec d → Vec d) := by + exact overlapCubeLpNorm_congr_on_overlapCubeSet_generic S (2 : ℝ≥0∞) + (fun x hx => by + have hpoint : + cubeProjectionVec Q 0 u x = cubeAverageVec Q u := + cubeProjectionVec_zero_eq_cubeAverageVec_of_mem_cubeSet + Q u (overlapCubeSet_subset_cubeSet_of_mem_overlapCentersAtDepth hS hx) + simp [overlapCubeFluctuationVec, havg, hpoint]) + _ = 0 := by + simpa using! + (overlapCubeLpNorm_const (S := S) (p := (2 : ℝ≥0∞)) + (c := (0 : Vec d)) (by norm_num)) + +/-- The depth-zero standard projection contributes no corrected overlapping +positive depth average. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_zero_eq_zero + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionVec Q 0 u) j = 0 := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage overlapCentersAverage + let D := overlapCentersAtDepth Q j + have hsum : + D.sum + (fun S => + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeProjectionVec Q 0 u))) ^ 2) = 0 := by + refine Finset.sum_eq_zero ?_ + intro S hS + have hzero := + overlapCubeLpNorm_overlapCubeFluctuationVec_cubeProjectionVec_zero_eq_zero + (Q := Q) (S := S) (j := j) u (by simpa [D] using hS) + simp [hzero] + simp [D, hsum] + +/-- Seminorm form of +`cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_zero_eq_zero`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_cubeProjectionVec_zero_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s (cubeProjectionVec Q 0 u) j = 0 := by + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + rw [cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_zero_eq_zero] + simp + +/-- If an overlap cube is contained in one standard descendant at the scale of +a martingale increment, then that increment has zero overlap fluctuation on +the overlap cube. -/ +theorem overlapCubeLpNorm_overlapCubeFluctuationVec_cubeIncrementVec_eq_zero_of_subset_descendant + {d : ℕ} {Q S R : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hR : R ∈ descendantsAtDepth Q (m + 1)) + (hsub : overlapCubeSet S ⊆ cubeSet R) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u)) = 0 := by + rcases exists_const_cubeIncrementVec_on_mem_descendantsAtDepth_succ + (Q := Q) (R := R) (m := m) u hR with ⟨c, hc⟩ + have havg : + overlapCubeAverageVec S (cubeIncrementVec Q (m + 1) u) = c := by + calc + overlapCubeAverageVec S (cubeIncrementVec Q (m + 1) u) + = overlapCubeAverageVec S (fun _ : Vec d => c) := by + exact overlapCubeAverageVec_congr_on_overlapCubeSet + (S := S) + (u := cubeIncrementVec Q (m + 1) u) + (v := fun _ : Vec d => c) + (fun x hx => hc x (hsub hx)) + _ = c := by + simp + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (cubeIncrementVec Q (m + 1) u)) + = overlapCubeLpNorm S (2 : ℝ≥0∞) (0 : Vec d → Vec d) := by + exact overlapCubeLpNorm_congr_on_overlapCubeSet_generic S (2 : ℝ≥0∞) + (fun x hx => by + have hpoint : cubeIncrementVec Q (m + 1) u x = c := + hc x (hsub hx) + simp [overlapCubeFluctuationVec, havg, hpoint]) + _ = 0 := by + simpa using! + (overlapCubeLpNorm_const (S := S) (p := (2 : ℝ≥0∞)) + (c := (0 : Vec d)) (by norm_num)) + +/-- Corrected overlapping depth averages only depend on the tested function on +the overlap cubes used at that depth. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_congr_on_overlapCenters + {d : ℕ} (Q : TriadicCube d) (j : ℕ) {u v : Vec d → Vec d} + (h : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ x ∈ overlapCubeSet S, u x = v x) : + cubeBesovOverlappingPositiveVectorDepthAverage Q u j = + cubeBesovOverlappingPositiveVectorDepthAverage Q v j := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage overlapCentersAverage + refine congrArg (fun t : ℝ => ((overlapCentersAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro S hS + have havg : + overlapCubeAverageVec S u = overlapCubeAverageVec S v := + overlapCubeAverageVec_congr_on_overlapCubeSet + (S := S) (u := u) (v := v) (h S hS) + congr 1 + exact overlapCubeLpNorm_congr_on_overlapCubeSet_generic S (2 : ℝ≥0∞) + (fun x hx => by + rw [overlapCubeFluctuationVec, overlapCubeFluctuationVec, h S hS x hx, havg]) + +/-- Triangle inequality for the overlap fluctuation of a finite sum. -/ +theorem overlapCubeLpNorm_overlapCubeFluctuationVec_finset_sum_le + {d : ℕ} {ι : Type*} (S : TriadicCube d) (I : Finset ι) + (u : ι → Vec d → Vec d) + (hu : + ∀ i ∈ I, + MeasureTheory.MemLp (u i) (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) ≤ + ∑ i ∈ I, + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u i)) := by + classical + induction I using Finset.induction_on with + | empty => + have hzero : + overlapCubeLpNorm S (2 : ℝ≥0∞) (0 : Vec d → Vec d) = 0 := by + simpa using! + (overlapCubeLpNorm_const (S := S) (p := (2 : ℝ≥0∞)) + (c := (0 : Vec d)) (by norm_num)) + have hfun : + (fun x => ∑ i ∈ (∅ : Finset ι), u i x) = (0 : Vec d → Vec d) := by + funext x + simp + rw [hfun, overlapCubeFluctuationVec_zero] + exact le_of_eq hzero + | @insert a I ha ih => + have hua : + MeasureTheory.MemLp (u a) (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + hu a (by simp [ha]) + have huI : + ∀ i ∈ I, + MeasureTheory.MemLp (u i) (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + intro i hi + exact hu i (Finset.mem_insert_of_mem hi) + have hsum : + MeasureTheory.MemLp (fun x => ∑ i ∈ I, u i x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := by + exact MeasureTheory.memLp_finsetSum + (μ := normalizedOverlapCubeMeasure S) (p := (2 : ℝ≥0∞)) + (s := I) (f := fun i => u i) huI + have hfluct : + overlapCubeFluctuationVec S + (fun x => ∑ i ∈ insert a I, u i x) = + fun x => + overlapCubeFluctuationVec S (u a) x + + overlapCubeFluctuationVec S (fun y => ∑ i ∈ I, u i y) x := by + have hsum_fun : + (fun x => ∑ i ∈ insert a I, u i x) = + fun x => u a x + (∑ i ∈ I, u i x) := by + funext x + simp [Finset.sum_insert, ha] + rw [hsum_fun] + exact overlapCubeFluctuationVec_add_of_memLp_two S hua hsum + have hfa : + MeasureTheory.MemLp (overlapCubeFluctuationVec S (u a)) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S (u a) hua + have hfI : + MeasureTheory.MemLp + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x) hsum + have htri : + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S + (fun x => ∑ i ∈ insert a I, u i x)) ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u a)) + + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) := by + rw [hfluct] + exact overlapCubeLpNorm_add_le S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (u a)) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) + hfa hfI (by norm_num) + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ insert a I, u i x)) + ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u a)) + + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) := htri + _ ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u a)) + + ∑ i ∈ I, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (u i)) := by + exact add_le_add_right (ih huI) _ + _ = + ∑ i ∈ insert a I, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (u i)) := by + simp [Finset.sum_insert, ha] + +/-- Minkowski inequality for corrected overlapping depth averages of finite +sums, in square-root form. -/ +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_finset_sum_le + {d : ℕ} {ι : Type*} (Q : TriadicCube d) (j : ℕ) (I : Finset ι) + (u : ι → Vec d → Vec d) + (hu : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ i ∈ I, + MeasureTheory.MemLp (u i) (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => ∑ i ∈ I, u i x) j) ≤ + ∑ i ∈ I, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q (u i) j) := by + classical + let A : TriadicCube d → ι → ℝ := + fun S i => + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u i)) + have hA_nonneg : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ i ∈ I, 0 ≤ A S i := by + intro S hS i hi + exact overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S (u i)) + have hpoint : + ∀ S ∈ overlapCentersAtDepth Q j, + (overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x))) ^ 2 ≤ + (∑ i ∈ I, A S i) ^ 2 := by + intro S hS + have hnorm := + overlapCubeLpNorm_overlapCubeFluctuationVec_finset_sum_le + S I u (hu S hS) + have hleft_nonneg : + 0 ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) := + overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S (fun x => ∑ i ∈ I, u i x)) + have hright_nonneg : 0 ≤ ∑ i ∈ I, A S i := + Finset.sum_nonneg fun i hi => hA_nonneg S hS i hi + exact (sq_le_sq₀ hleft_nonneg hright_nonneg).mpr hnorm + have havg_le : + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => ∑ i ∈ I, u i x) j ≤ + overlapCentersAverage Q j (fun S => (∑ i ∈ I, A S i) ^ 2) := by + unfold cubeBesovOverlappingPositiveVectorDepthAverage + exact overlapCentersAverage_le_overlapCentersAverage Q j hpoint + have hroot_le : + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => ∑ i ∈ I, u i x) j) ^ (1 / 2 : ℝ) ≤ + (overlapCentersAverage Q j (fun S => (∑ i ∈ I, A S i) ^ 2)) ^ + (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow + (cubeBesovOverlappingPositiveVectorDepthAverage_nonneg Q + (fun x => ∑ i ∈ I, u i x) j) + havg_le (by norm_num) + have hL2 := + overlapCentersAverage_L2_sum_le_sum_overlapCentersAverage_L2 + Q j I A hA_nonneg + calc + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => ∑ i ∈ I, u i x) j) + = + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => ∑ i ∈ I, u i x) j) ^ (1 / 2 : ℝ) := by + rw [Real.sqrt_eq_rpow] + _ ≤ + (overlapCentersAverage Q j (fun S => (∑ i ∈ I, A S i) ^ 2)) ^ + (1 / 2 : ℝ) := hroot_le + _ ≤ + ∑ i ∈ I, + (overlapCentersAverage Q j (fun S => (A S i) ^ 2)) ^ (1 / 2 : ℝ) := hL2 + _ = + ∑ i ∈ I, + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q (u i) j) := by + simp [cubeBesovOverlappingPositiveVectorDepthAverage, A, Real.sqrt_eq_rpow] + +/-- The projection part of the hard comparison reduces to the projection gap +from depth zero. This is the algebraic split before estimating the gap by +ordinary standard positive terms. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_le_gap_zero + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hzeroLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionVec Q j u) j ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j := by + have hcongr : + cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionVec Q j u) j = + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => cubeProjectionVec Q 0 u x + cubeProjectionGapVec Q 0 j u x) j := by + exact cubeBesovOverlappingPositiveVectorDepthAverage_congr_on_overlapCenters + Q j + (fun S _hS x _hx => by + simpa using congrFun + (cubeProjectionVec_eq_projection_zero_add_gap_zero Q j u) x) + rw [hcongr] + have hadd := + cubeBesovOverlappingPositiveVectorDepthAverage_add_le + Q (cubeProjectionVec Q 0 u) (cubeProjectionGapVec Q 0 j u) j hzeroLoc hgapLoc + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => cubeProjectionVec Q 0 u x + cubeProjectionGapVec Q 0 j u x) j + ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionVec Q 0 u) j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j := hadd + _ = + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j := by + rw [cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_zero_eq_zero] + ring + +/-- Split a field into its depth-`j` standard projection residual plus its +depth-`j` standard projection, at the corrected overlapping depth average. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_le_residual_add_projection + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthAverage Q u j ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => u x - cubeProjectionVec Q j u x) j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionVec Q j u) j := by + have hcongr : + cubeBesovOverlappingPositiveVectorDepthAverage Q u j = + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => (u x - cubeProjectionVec Q j u x) + + cubeProjectionVec Q j u x) j := by + exact cubeBesovOverlappingPositiveVectorDepthAverage_congr_on_overlapCenters + Q j (fun _S _hS x _hx => by + simp) + rw [hcongr] + exact cubeBesovOverlappingPositiveVectorDepthAverage_add_le + Q (fun x => u x - cubeProjectionVec Q j u x) (cubeProjectionVec Q j u) j + hresLoc hprojLoc + +/-- Seminorm-squared form of +`cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_le_gap_zero`. -/ +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_cubeProjectionVec_le_gap_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hzeroLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s (cubeProjectionVec Q j u) j) ^ 2 ≤ + 2 * (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j) ^ 2 := by + have havg := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_le_gap_zero + Q u j hzeroLoc hgapLoc + have hweight_nonneg : + 0 ≤ (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 := sq_nonneg _ + calc + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s (cubeProjectionVec Q j u) j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionVec Q j u) j := by + exact sq_cubeBesovOverlappingPositiveVectorDepthSeminorm + Q s (cubeProjectionVec Q j u) j + _ ≤ + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j) := by + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = + 2 * ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j) := by + ring + _ = + 2 * (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j) ^ 2 := by + rw [sq_cubeBesovOverlappingPositiveVectorDepthSeminorm] + +/-- The depth-`j` projection gap from depth zero is the finite sum of vector +martingale increments, at the level of corrected overlapping depth averages. -/ +theorem cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_eq_sum_incrementVec + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionGapVec Q 0 j u) j = + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => + Finset.sum (Finset.range j) + (fun m => cubeIncrementVec Q (m + 1) u x)) j := by + symm + exact cubeBesovOverlappingPositiveVectorDepthAverage_congr_on_overlapCenters + Q j + (fun S _hS x _hx => by + simpa using congrFun + (sum_cubeIncrementVec_eq_cubeProjectionGapVec + (Q := Q) (u := u) (j := 0) (n := j)) x) + +/-- Seminorm form of +`cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_eq_sum_incrementVec`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_eq_sum_incrementVec + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s (cubeProjectionGapVec Q 0 j u) j = + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (fun x => + Finset.sum (Finset.range j) + (fun m => cubeIncrementVec Q (m + 1) u x)) j := by + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + rw [cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_eq_sum_incrementVec] + +/-- The projection gap is controlled, in corrected overlapping square-root +depth average, by the sum of its martingale increments. -/ +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_le_sum_incrementVec + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionGapVec Q 0 j u) j) ≤ + ∑ m ∈ Finset.range j, + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j) := by + rw [cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_eq_sum_incrementVec] + exact sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_finset_sum_le + Q j (Finset.range j) (fun m => cubeIncrementVec Q (m + 1) u) hincLoc + +/-- Seminorm form of +`sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_le_sum_incrementVec`. -/ +theorem cubeBesovOverlappingPositiveVectorDepthSeminorm_gap_zero_le_sum_incrementVec + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s (cubeProjectionGapVec Q 0 j u) j ≤ + ∑ m ∈ Finset.range j, + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeIncrementVec Q (m + 1) u) j := by + have hroot := + sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_gap_zero_le_sum_incrementVec + Q u j hincLoc + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovOverlappingPositiveVectorDepthSeminorm + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q (cubeProjectionGapVec Q 0 j u) j) + ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (∑ m ∈ Finset.range j, + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j)) := by + exact mul_le_mul_of_nonneg_left hroot hweight_nonneg + _ = + ∑ m ∈ Finset.range j, + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + (cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeIncrementVec Q (m + 1) u) j) := by + rw [Finset.mul_sum] + +/-- Seminorm-squared form of +`cubeBesovOverlappingPositiveVectorDepthAverage_sub_cubeProjectionVec_le`. -/ +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_sub_cubeProjectionVec_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (fun x => u x - cubeProjectionVec Q j u x) j) ^ 2 ≤ + 4 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + have havg := + cubeBesovOverlappingPositiveVectorDepthAverage_sub_cubeProjectionVec_le + Q u j hres hresLoc + have hweight_nonneg : + 0 ≤ (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 := sq_nonneg _ + calc + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (fun x => u x - cubeProjectionVec Q j u x) j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => u x - cubeProjectionVec Q j u x) j := by + exact sq_cubeBesovOverlappingPositiveVectorDepthSeminorm + Q s (fun x => u x - cubeProjectionVec Q j u x) j + _ ≤ + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (4 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j) := by + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = + 4 * (3 ^ d : ℝ) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u j) := by + ring + _ = + 4 * (3 ^ d : ℝ) * + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + rw [sq_cubeBesovPositiveVectorDepthSeminorm] + +/-- Combined depth split for the hard comparison. The residual branch is paid +by the ordinary same-depth positive term, while the projection branch is paid +by the depth-zero projection gap. -/ +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_gap_zero + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 ≤ + 8 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + + 4 * (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j) ^ 2 := by + have hsplit := + cubeBesovOverlappingPositiveVectorDepthAverage_le_residual_add_projection + Q u j hresLoc hprojLoc + have hresAvg := + cubeBesovOverlappingPositiveVectorDepthAverage_sub_cubeProjectionVec_le + Q u j hres hresLoc + have hprojAvg := + cubeBesovOverlappingPositiveVectorDepthAverage_cubeProjectionVec_le_gap_zero + Q u j hzeroLoc hgapLoc + have havg : + cubeBesovOverlappingPositiveVectorDepthAverage Q u j ≤ + 8 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j + + 4 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j := by + calc + cubeBesovOverlappingPositiveVectorDepthAverage Q u j + ≤ + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (fun x => u x - cubeProjectionVec Q j u x) j + + 2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionVec Q j u) j := hsplit + _ ≤ + 2 * (4 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j) + + 2 * (2 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hresAvg (by norm_num)) + (mul_le_mul_of_nonneg_left hprojAvg (by norm_num)) + _ = + 8 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j + + 4 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j := by + ring + have hweight_nonneg : + 0 ≤ (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 := sq_nonneg _ + calc + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q u j := by + exact sq_cubeBesovOverlappingPositiveVectorDepthSeminorm Q s u j + _ ≤ + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (8 * (3 ^ d : ℝ) * cubeBesovPositiveVectorDepthAverage Q u j + + 4 * cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j) := by + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = + 8 * (3 ^ d : ℝ) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u j) + + 4 * ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovOverlappingPositiveVectorDepthAverage Q + (cubeProjectionGapVec Q 0 j u) j) := by + ring + _ = + 8 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + + 4 * (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s + (cubeProjectionGapVec Q 0 j u) j) ^ 2 := by + rw [sq_cubeBesovPositiveVectorDepthSeminorm, + sq_cubeBesovOverlappingPositiveVectorDepthSeminorm] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSharpKernel.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSharpKernel.lean new file mode 100644 index 0000000000..900ade7c61 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSharpKernel.lean @@ -0,0 +1,863 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionBoundaryNeighborCount +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSummation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity + +/-! # Standard Projection Sharp Kernel -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal BigOperators + +/-! +# The sharp boundary tail as a geometric kernel input + +The one-depth sharp boundary estimate leaves a concrete tail over coarser +standard projection depths. This file names that tail and connects any +geometric-kernel bound for it to the finite positive Besov summation theorem. +-/ + +/-- MemLp closure hypotheses needed by the sharp-boundary standard projection +comparison. These are bookkeeping assumptions: the analytic content is in the +finite bridge below. -/ +structure SharpBoundaryProjectionMemLp {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : Prop where + residual : + ∀ j : ℕ, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) + residual_overlap : + ∀ j : ℕ, ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) + projection_overlap : + ∀ j : ℕ, ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) + projection_zero_overlap : + ∀ j : ℕ, ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) + projection_gap_overlap : + ∀ j : ℕ, ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) + increment_overlap : + ∀ j : ℕ, ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) + parent : + ∀ j : ℕ, ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T) + +/-- The vector standard projection is `L²` on its parent cube. -/ +theorem cubeProjectionVec_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u : Vec d → Vec d) : + MeasureTheory.MemLp (cubeProjectionVec Q j u) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + refine MeasureTheory.MemLp.of_eval ?_ + intro i + simpa [cubeProjectionVec] using + (cubeProjection_memLp Q j (2 : ℝ≥0∞) (fun x => u x i)) + +/-- The vector standard projection restricts to every admissible overlap cube. -/ +theorem cubeProjectionVec_memLp_normalizedOverlapCubeMeasure {d : ℕ} + {Q S : TriadicCube d} {j k : ℕ} (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) : + MeasureTheory.MemLp (cubeProjectionVec Q k u) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS + (cubeProjectionVec_memLp_normalizedCubeMeasure Q k u) + +/-- The vector projection residual is `L²` on the parent cube. -/ +theorem cubeProjectionVec_residual_memLp_normalizedCubeMeasure {d : ℕ} + {Q : TriadicCube d} (j : ℕ) {u : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + hu.sub (cubeProjectionVec_memLp_normalizedCubeMeasure Q j u) + +/-- The vector projection residual restricts to every admissible overlap cube. -/ +theorem cubeProjectionVec_residual_memLp_normalizedOverlapCubeMeasure {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {u : Vec d → Vec d} + (hS : S ∈ overlapCentersAtDepth Q j) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS + (cubeProjectionVec_residual_memLp_normalizedCubeMeasure j hu) + +/-- A vector projection gap is the difference of two vector projections. -/ +theorem cubeProjectionGapVec_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) (j n : ℕ) (u : Vec d → Vec d) : + MeasureTheory.MemLp (cubeProjectionGapVec Q j n u) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + rw [cubeProjectionGapVec_eq_sub_cubeProjectionVec] + exact + (cubeProjectionVec_memLp_normalizedCubeMeasure Q (j + n) u).sub + (cubeProjectionVec_memLp_normalizedCubeMeasure Q j u) + +/-- A vector projection gap restricts to every admissible overlap cube. -/ +theorem cubeProjectionGapVec_memLp_normalizedOverlapCubeMeasure {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (n : ℕ) (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) : + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 n u) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS + (cubeProjectionGapVec_memLp_normalizedCubeMeasure Q 0 n u) + +/-- The vector martingale increment is the difference of consecutive vector +standard projections. -/ +theorem cubeIncrementVec_succ_eq_sub_cubeProjectionVec {d : ℕ} + (Q : TriadicCube d) (m : ℕ) (u : Vec d → Vec d) : + cubeIncrementVec Q (m + 1) u = + fun x => cubeProjectionVec Q (m + 1) u x - cubeProjectionVec Q m u x := by + funext x i + simp [cubeIncrementVec, cubeProjectionVec, cubeIncrement_succ] + +/-- A vector martingale increment is `L²` on the parent cube. -/ +theorem cubeIncrementVec_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) (m : ℕ) (u : Vec d → Vec d) : + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + rw [cubeIncrementVec_succ_eq_sub_cubeProjectionVec] + exact + (cubeProjectionVec_memLp_normalizedCubeMeasure Q (m + 1) u).sub + (cubeProjectionVec_memLp_normalizedCubeMeasure Q m u) + +/-- A vector martingale increment restricts to every admissible overlap cube. -/ +theorem cubeIncrementVec_memLp_normalizedOverlapCubeMeasure {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (m : ℕ) (u : Vec d → Vec d) + (hS : S ∈ overlapCentersAtDepth Q j) : + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS + (cubeIncrementVec_memLp_normalizedCubeMeasure Q m u) + +/-- The sharp-boundary projection `MemLp` closure package follows from parent +`L²` membership. All projection, gap, and increment fields are finite-depth +piecewise constants, and all overlap cubes are measured by restriction from +the parent cube. -/ +theorem SharpBoundaryProjectionMemLp.of_memLp {d : ℕ} + {Q : TriadicCube d} {u : Vec d → Vec d} + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + SharpBoundaryProjectionMemLp Q u where + residual j := + cubeProjectionVec_residual_memLp_normalizedCubeMeasure j hu + residual_overlap _j _S hS := + cubeProjectionVec_residual_memLp_normalizedOverlapCubeMeasure hS hu + projection_overlap j _S hS := + cubeProjectionVec_memLp_normalizedOverlapCubeMeasure (j := j) (k := j) u hS + projection_zero_overlap j _S hS := + cubeProjectionVec_memLp_normalizedOverlapCubeMeasure (j := j) (k := 0) u hS + projection_gap_overlap j _S hS := + cubeProjectionGapVec_memLp_normalizedOverlapCubeMeasure (j := j) j u hS + increment_overlap j _S hS m _hm := + cubeIncrementVec_memLp_normalizedOverlapCubeMeasure (j := j) m u hS + parent _j _m _hm _T hT := + memLp_on_descendant_of_memLp_generic hT hu + +/-- Positive triadic depth weights as powers of the one-step weight. -/ +theorem triadicPositiveDepthWeight_eq_pow (t : ℝ) (j : ℕ) : + Real.rpow (3 : ℝ) (t * (j : ℝ)) = + (Real.rpow (3 : ℝ) t) ^ j := by + calc + Real.rpow (3 : ℝ) (t * (j : ℝ)) + = Real.rpow (Real.rpow (3 : ℝ) t) (j : ℝ) := by + exact Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) t (j : ℝ) + _ = (Real.rpow (3 : ℝ) t) ^ j := by + exact Real.rpow_natCast (Real.rpow (3 : ℝ) t) j + +/-- Dimension-only constant in the sharp boundary kernel. -/ +noncomputable def sharpBoundaryKernelConstant (d : ℕ) : ℝ := + Real.sqrt + (4 * + (((3 ^ d * (3 ^ d * (2 * d))) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ))) + +/-- The square-root surface/volume ratio in one gap of the sharp boundary +kernel. For positive dimension this is `3^{-1/2}`. -/ +noncomputable def sharpBoundaryKernelRatio (d : ℕ) : ℝ := + Real.sqrt ((((3 ^ (d - 1) : ℕ) : ℝ) / ((3 ^ d : ℕ) : ℝ))) + +/-- One-gap kernel base before replacing the dimension ratio by `3^{-1/2}`. -/ +noncomputable def sharpBoundaryKernelBase (d : ℕ) (t : ℝ) : ℝ := + Real.rpow (3 : ℝ) t * sharpBoundaryKernelRatio d + +/-- The explicit finite-depth sharp-boundary loss. For positive dimension and +`t < 1/2`, the denominator is finite because +`sharpBoundaryKernelBase d t = 3^(t - 1/2) < 1`. -/ +noncomputable def sharpBoundaryKernelLoss (d : ℕ) (t : ℝ) : ℝ := + 8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2 + +theorem sharpBoundaryKernelConstant_nonneg (d : ℕ) : + 0 ≤ sharpBoundaryKernelConstant d := by + unfold sharpBoundaryKernelConstant + exact Real.sqrt_nonneg _ + +theorem sharpBoundaryKernelRatio_nonneg (d : ℕ) : + 0 ≤ sharpBoundaryKernelRatio d := by + unfold sharpBoundaryKernelRatio + exact Real.sqrt_nonneg _ + +theorem sharpBoundaryKernelBase_nonneg (d : ℕ) (t : ℝ) : + 0 ≤ sharpBoundaryKernelBase d t := by + unfold sharpBoundaryKernelBase + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (sharpBoundaryKernelRatio_nonneg d) + +theorem sharpBoundaryKernelLoss_nonneg (d : ℕ) (t : ℝ) : + 0 ≤ sharpBoundaryKernelLoss d t := by + unfold sharpBoundaryKernelLoss + exact add_nonneg + (mul_nonneg (by norm_num) (by positivity)) + (mul_nonneg + (mul_nonneg (by norm_num) (sq_nonneg (sharpBoundaryKernelConstant d))) + (sq_nonneg _)) + +theorem sharpBoundaryKernelRatio_eq {d : ℕ} [NeZero d] : + sharpBoundaryKernelRatio d = Real.rpow (3 : ℝ) (-(1 / 2 : ℝ)) := by + unfold sharpBoundaryKernelRatio + have hdpos : 0 < d := Nat.pos_of_neZero d + have hpow_nat : (3 ^ d : ℕ) = 3 ^ (d - 1) * 3 := by + rw [← pow_succ] + congr 1 + omega + have hpow_real : + (((3 ^ d : ℕ) : ℝ)) = (((3 ^ (d - 1) : ℕ) : ℝ)) * 3 := by + exact_mod_cast hpow_nat + have hratio : + (((3 ^ (d - 1) : ℕ) : ℝ) / ((3 ^ d : ℕ) : ℝ)) = (3 : ℝ)⁻¹ := by + rw [hpow_real] + field_simp [show (((3 ^ (d - 1) : ℕ) : ℝ) ≠ 0) by positivity] + rw [hratio] + rw [Real.sqrt_eq_rpow] + exact (Real.rpow_neg_eq_inv_rpow (3 : ℝ) (1 / 2 : ℝ)).symm + +theorem sharpBoundaryKernelBase_eq {d : ℕ} [NeZero d] (t : ℝ) : + sharpBoundaryKernelBase d t = Real.rpow (3 : ℝ) (t - 1 / 2) := by + unfold sharpBoundaryKernelBase + rw [sharpBoundaryKernelRatio_eq] + calc + Real.rpow (3 : ℝ) t * Real.rpow (3 : ℝ) (-(1 / 2 : ℝ)) + = Real.rpow (3 : ℝ) (t + -(1 / 2 : ℝ)) := by + exact (Real.rpow_add (by norm_num : (0 : ℝ) < 3) t (-(1 / 2 : ℝ))).symm + _ = Real.rpow (3 : ℝ) (t - 1 / 2) := by ring_nf + +theorem sharpBoundaryKernelBase_lt_one {d : ℕ} [NeZero d] {t : ℝ} + (ht : t < 1 / 2) : + sharpBoundaryKernelBase d t < 1 := by + rw [sharpBoundaryKernelBase_eq] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + +private theorem sqrt_div_pow_sq_eq_pow_div_pow {a b : ℝ} + (ha : 0 ≤ a) (hb : 0 ≤ b) (n : ℕ) : + ((Real.sqrt a / Real.sqrt b) ^ n) ^ 2 = (a / b) ^ n := by + have hsquare : (Real.sqrt a / Real.sqrt b) ^ 2 = a / b := by + rw [div_pow, Real.sq_sqrt ha, Real.sq_sqrt hb] + calc + ((Real.sqrt a / Real.sqrt b) ^ n) ^ 2 + = ((Real.sqrt a / Real.sqrt b) ^ 2) ^ n := by + rw [← pow_mul, ← pow_mul] + congr 1 + omega + _ = (a / b) ^ n := by + rw [hsquare] + +/-- The `m`th summand in the sharp boundary tail at depth `j`. -/ +noncomputable def sharpBoundaryDepthTailTerm {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j m : ℕ) : ℝ := + Real.rpow (3 : ℝ) (t * (j : ℝ)) * + Real.sqrt + ((((3 ^ d) ^ j : ℕ) : ℝ)⁻¹ * + (4 * + (((3 ^ d * (3 ^ d * + (2 * d * (3 ^ (d - 1)) ^ (j - m))) : ℕ) : ℝ) * + ((3 ^ d : ℝ) * (Fintype.card (Fin d) : ℝ) * + ((descendantsAtDepth Q m).card : ℝ) * + cubeBesovPositiveVectorDepthAverage Q u m)))) + +/-- The sharp boundary tail appearing in the one-depth hard comparison. -/ +noncomputable def sharpBoundaryDepthTail {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j : ℕ) : ℝ := + ∑ m ∈ Finset.range j, sharpBoundaryDepthTailTerm Q t u j m + +theorem sharpBoundaryDepthTailTerm_nonneg {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j m : ℕ) : + 0 ≤ sharpBoundaryDepthTailTerm Q t u j m := by + unfold sharpBoundaryDepthTailTerm + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + +/-- Single-summand scale arithmetic for the sharp boundary tail, in the clean +`j = m + n` form. -/ +theorem sharpBoundaryDepthTailTerm_le_kernelBase_add {d : ℕ} [NeZero d] + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (m n : ℕ) : + sharpBoundaryDepthTailTerm Q t u (m + n) m ≤ + sharpBoundaryKernelConstant d * (sharpBoundaryKernelBase d t) ^ n * + cubeBesovPositiveVectorDepthSeminorm Q t u m := by + have hL : 0 ≤ sharpBoundaryDepthTailTerm Q t u (m + n) m := + sharpBoundaryDepthTailTerm_nonneg Q t u (m + n) m + have hR : + 0 ≤ sharpBoundaryKernelConstant d * (sharpBoundaryKernelBase d t) ^ n * + cubeBesovPositiveVectorDepthSeminorm Q t u m := by + exact mul_nonneg + (mul_nonneg (sharpBoundaryKernelConstant_nonneg d) + (pow_nonneg (sharpBoundaryKernelBase_nonneg d t) _)) + (cubeBesovPositiveVectorDepthSeminorm_nonneg Q t u m) + refine (sq_le_sq₀ hL hR).1 ?_ + unfold sharpBoundaryDepthTailTerm sharpBoundaryKernelConstant + sharpBoundaryKernelBase cubeBesovPositiveVectorDepthSeminorm + sharpBoundaryKernelRatio + have hA : 0 ≤ cubeBesovPositiveVectorDepthAverage Q u m := + cubeBesovPositiveVectorDepthAverage_nonneg Q u m + simp [mul_pow, descendantsAtDepth_card, Fintype.card_fin, Real.sq_sqrt, hA] + rw [Real.sq_sqrt (by positivity)] + rw [Real.sq_sqrt (by positivity)] + have hweight_mn : + (3 : ℝ) ^ (t * ((m : ℝ) + (n : ℝ))) = + (Real.rpow (3 : ℝ) t) ^ (m + n) := by + rw [← Nat.cast_add] + exact triadicPositiveDepthWeight_eq_pow t (m + n) + have hweight_m : + (3 : ℝ) ^ (t * (m : ℝ)) = (Real.rpow (3 : ℝ) t) ^ m := + triadicPositiveDepthWeight_eq_pow t m + rw [hweight_mn, hweight_m] + rw [sqrt_div_pow_sq_eq_pow_div_pow + (by positivity : 0 ≤ (3 ^ (d - 1) : ℝ)) + (by positivity : 0 ≤ (3 ^ d : ℝ)) n] + rw [pow_add (Real.rpow (3 : ℝ) t) m n] + rw [pow_add ((3 : ℝ) ^ d) m n] + rw [div_pow] + field_simp [pow_ne_zero n (by positivity : ((3 : ℝ) ^ d) ≠ 0), + pow_ne_zero m (by positivity : ((3 : ℝ) ^ d) ≠ 0)] + change + ((Real.rpow (3 : ℝ) t) ^ n) ^ 2 * (d : ℝ) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u m ≤ + (d : ℝ) ^ 2 * cubeBesovPositiveVectorDepthAverage Q u m * + (((Real.rpow (3 : ℝ) t) ^ n) ^ 2) + ring_nf + exact le_rfl + +/-- Single-summand scale arithmetic for the sharp boundary tail. -/ +theorem sharpBoundaryDepthTailTerm_le_kernelBase {d : ℕ} [NeZero d] + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) {j m : ℕ} + (hmj : m ≤ j) : + sharpBoundaryDepthTailTerm Q t u j m ≤ + sharpBoundaryKernelConstant d * (sharpBoundaryKernelBase d t) ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m := by + have hj : m + (j - m) = j := Nat.add_sub_of_le hmj + simpa [hj] using + sharpBoundaryDepthTailTerm_le_kernelBase_add + (Q := Q) (t := t) (u := u) m (j - m) + +theorem sharpBoundaryDepthTail_nonneg {d : ℕ} + (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ sharpBoundaryDepthTail Q t u j := by + unfold sharpBoundaryDepthTail + refine Finset.sum_nonneg ?_ + intro m _hm + exact sharpBoundaryDepthTailTerm_nonneg Q t u j m + +/-- Summing termwise geometric bounds gives the sharp-tail geometric kernel +bound. -/ +theorem sharpBoundaryDepthTail_le_geometric_convolution_of_forall_term_le + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j : ℕ) + {C r : ℝ} + (hterm : + ∀ m ∈ Finset.range j, + sharpBoundaryDepthTailTerm Q t u j m ≤ + C * (r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m)) : + sharpBoundaryDepthTail Q t u j ≤ + C * + (∑ m ∈ Finset.range j, + r ^ (j - m) * cubeBesovPositiveVectorDepthSeminorm Q t u m) := by + unfold sharpBoundaryDepthTail + calc + ∑ m ∈ Finset.range j, sharpBoundaryDepthTailTerm Q t u j m + ≤ + ∑ m ∈ Finset.range j, + C * (r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) := by + exact Finset.sum_le_sum hterm + _ = + C * + (∑ m ∈ Finset.range j, + r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) := by + rw [Finset.mul_sum] + +/-- Named form of the one-depth hard comparison using +`sharpBoundaryDepthTail`. -/ +theorem sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_sharpBoundaryDepthTail + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ m ∈ Finset.range j, ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q t u j) ^ 2 ≤ + 8 * (3 ^ d : ℝ) * (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + 4 * (sharpBoundaryDepthTail Q t u j) ^ 2 := by + simpa [sharpBoundaryDepthTail, sharpBoundaryDepthTailTerm] using + sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_sharpBoundary_sum + Q t u j hres hresLoc hprojLoc hzeroLoc hgapLoc hincLoc huParent + +/-- If the named sharp boundary tail is bounded by a geometric convolution of +ordinary positive depth seminorms, then the finite overlapping positive +seminorm is bounded by the ordinary finite positive seminorm. -/ +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_sharpBoundaryDepthTail_kernel + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + {C r : ℝ} + (hC_nonneg : 0 ≤ C) + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) + (hres : + ∀ j ∈ Finset.range (N + 1), + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ j ∈ Finset.range (N + 1), ∀ m ∈ Finset.range j, + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) + (hkernel : + ∀ j ∈ Finset.range (N + 1), + sharpBoundaryDepthTail Q t u j ≤ + C * + (∑ m ∈ Finset.range j, + r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m)) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + (8 * (3 ^ d : ℝ) + (4 * C ^ 2) * ((1 - r)⁻¹) ^ 2) * + (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + refine + sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_depth_geometric_tail + (Q := Q) (t := t) (N := N) (u := u) + (A := 8 * (3 ^ d : ℝ)) (B := 4 * C ^ 2) (r := r) + ?_ hr_nonneg hr_lt_one ?_ + · exact mul_nonneg (by norm_num) (sq_nonneg C) + · intro j hj + let conv : ℝ := + ∑ m ∈ Finset.range j, + r ^ (j - m) * cubeBesovPositiveVectorDepthSeminorm Q t u m + have hbase := + sq_cubeBesovOverlappingPositiveVectorDepthSeminorm_le_standard_add_sharpBoundaryDepthTail + Q t u j (hres j hj) (hresLoc j hj) (hprojLoc j hj) + (hzeroLoc j hj) (hgapLoc j hj) (hincLoc j hj) (huParent j hj) + have hconv_nonneg : 0 ≤ conv := by + dsimp [conv] + refine Finset.sum_nonneg ?_ + intro m _hm + exact mul_nonneg (pow_nonneg hr_nonneg _) + (cubeBesovPositiveVectorDepthSeminorm_nonneg Q t u m) + have htail_sq : + 4 * (sharpBoundaryDepthTail Q t u j) ^ 2 ≤ + (4 * C ^ 2) * conv ^ 2 := by + have htail_le : sharpBoundaryDepthTail Q t u j ≤ C * conv := by + simpa [conv] using hkernel j hj + have hsq : + (sharpBoundaryDepthTail Q t u j) ^ 2 ≤ (C * conv) ^ 2 := + (sq_le_sq₀ + (sharpBoundaryDepthTail_nonneg Q t u j) + (mul_nonneg hC_nonneg hconv_nonneg)).mpr htail_le + calc + 4 * (sharpBoundaryDepthTail Q t u j) ^ 2 + ≤ 4 * (C * conv) ^ 2 := by + exact mul_le_mul_of_nonneg_left hsq (by norm_num) + _ = (4 * C ^ 2) * conv ^ 2 := by + ring + calc + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q t u j) ^ 2 + ≤ + 8 * (3 ^ d : ℝ) * + (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + 4 * (sharpBoundaryDepthTail Q t u j) ^ 2 := hbase + _ ≤ + 8 * (3 ^ d : ℝ) * + (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + (4 * C ^ 2) * conv ^ 2 := by + exact add_le_add le_rfl htail_sq + _ = + 8 * (3 ^ d : ℝ) * + (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + (4 * C ^ 2) * + (∑ m ∈ Finset.range j, + r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) ^ 2 := by + rfl + +/-- Version of +`sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_sharpBoundaryDepthTail_kernel` +where the geometric kernel bound is supplied term-by-term with the canonical +sharp boundary kernel base. The only remaining input is the local +single-summand scale arithmetic estimate. -/ +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_sharpBoundaryDepthTailTerm_kernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + {C : ℝ} + (ht : t < 1 / 2) + (hC_nonneg : 0 ≤ C) + (hres : + ∀ j ∈ Finset.range (N + 1), + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ j ∈ Finset.range (N + 1), ∀ m ∈ Finset.range j, + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) + (hterm : + ∀ j ∈ Finset.range (N + 1), ∀ m ∈ Finset.range j, + sharpBoundaryDepthTailTerm Q t u j m ≤ + C * (sharpBoundaryKernelBase d t) ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + (8 * (3 ^ d : ℝ) + + (4 * C ^ 2) * ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2) * + (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + refine + sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_sharpBoundaryDepthTail_kernel + (Q := Q) (t := t) (N := N) (u := u) + (C := C) (r := sharpBoundaryKernelBase d t) + hC_nonneg (sharpBoundaryKernelBase_nonneg d t) + (sharpBoundaryKernelBase_lt_one (d := d) (t := t) ht) + hres hresLoc hprojLoc hzeroLoc hgapLoc hincLoc huParent ?_ + intro j hj + exact + sharpBoundaryDepthTail_le_geometric_convolution_of_forall_term_le + Q t u j + (C := C) (r := sharpBoundaryKernelBase d t) + (fun m hm => by + calc + sharpBoundaryDepthTailTerm Q t u j m + ≤ C * (sharpBoundaryKernelBase d t) ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m := + hterm j hj m hm + _ = + C * ((sharpBoundaryKernelBase d t) ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) := by + ring) + +/-- Closed finite partial bridge for the sharp boundary branch. The +overlapping exponent must satisfy `t < 1/2`, exactly because the sharp boundary +kernel has base `3^(t - 1/2)`. -/ +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sharpBoundaryKernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + (ht : t < 1 / 2) + (hres : + ∀ j ∈ Finset.range (N + 1), + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ j ∈ Finset.range (N + 1), ∀ m ∈ Finset.range j, + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + (8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2) * + (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + exact + sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_sharpBoundaryDepthTailTerm_kernel + (Q := Q) (t := t) (N := N) (u := u) + (C := sharpBoundaryKernelConstant d) + ht (sharpBoundaryKernelConstant_nonneg d) + hres hresLoc hprojLoc hzeroLoc hgapLoc hincLoc huParent + (fun j _hj m hm => + sharpBoundaryDepthTailTerm_le_kernelBase + (Q := Q) (t := t) (u := u) + (j := j) (m := m) + (Nat.le_of_lt (Finset.mem_range.mp hm))) + +/-- Square-root form of +`sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sharpBoundaryKernel`. -/ +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sqrt_sharpBoundaryKernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + (ht : t < 1 / 2) + (hres : + ∀ j ∈ Finset.range (N + 1), + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hresLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hprojLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hzeroLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionVec Q 0 u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hgapLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + MeasureTheory.MemLp (cubeProjectionGapVec Q 0 j u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (hincLoc : + ∀ j ∈ Finset.range (N + 1), ∀ S ∈ overlapCentersAtDepth Q j, + ∀ m ∈ Finset.range j, + MeasureTheory.MemLp (cubeIncrementVec Q (m + 1) u) + (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) + (huParent : + ∀ j ∈ Finset.range (N + 1), ∀ m ∈ Finset.range j, + ∀ T ∈ descendantsAtDepth Q m, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure T)) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u + ≤ + Real.sqrt + (8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2) * + cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + let L : ℝ := + 8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2 + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact add_nonneg + (mul_nonneg (by norm_num) (by positivity)) + (mul_nonneg + (mul_nonneg (by norm_num) (sq_nonneg (sharpBoundaryKernelConstant d))) + (sq_nonneg _)) + have hsq := + sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sharpBoundaryKernel + Q t N u ht hres hresLoc hprojLoc hzeroLoc hgapLoc hincLoc huParent + have hleft_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q t N u + have hright_nonneg : + 0 ≤ Real.sqrt L * cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + exact mul_nonneg (Real.sqrt_nonneg _) + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q t N u) + refine (sq_le_sq₀ hleft_nonneg hright_nonneg).1 ?_ + calc + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + L * (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + simpa [L] using hsq + _ = + (Real.sqrt L * cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hL_nonneg] + +/-- Full overlapping regularity from ordinary positive regularity and the +sharp-boundary projection MemLp closure package. -/ +theorem CubeVectorOverlappingBesovHRegularity.of_sharpBoundaryKernel + {d : ℕ} [NeZero d] {Q : TriadicCube d} {t : ℝ} {u : Vec d → Vec d} + (ht : t < 1 / 2) + (hstd : CubeVectorBesovHRegularity Q t u) + (hmem : SharpBoundaryProjectionMemLp Q u) : + CubeVectorOverlappingBesovHRegularity Q t u := by + refine ⟨hstd.memLp, ?_⟩ + rcases hstd.partialSeminorms_bddAbove with ⟨B, hB⟩ + let L : ℝ := + 8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2 + refine ⟨Real.sqrt L * B, ?_⟩ + rintro x ⟨N, rfl⟩ + have hpartial := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sqrt_sharpBoundaryKernel + Q t N u ht + (fun j _hj => hmem.residual j) + (fun j _hj => hmem.residual_overlap j) + (fun j _hj => hmem.projection_overlap j) + (fun j _hj => hmem.projection_zero_overlap j) + (fun j _hj => hmem.projection_gap_overlap j) + (fun j _hj => hmem.increment_overlap j) + (fun j _hj => hmem.parent j) + calc + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u + ≤ Real.sqrt L * cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + simpa [L] using hpartial + _ ≤ Real.sqrt L * B := by + exact mul_le_mul_of_nonneg_left + (hB ⟨N, rfl⟩) + (Real.sqrt_nonneg _) + +/-- Full seminorm form of the sharp-boundary comparison. -/ +theorem cubeBesovOverlappingPositiveVectorSeminormTwo_le_sqrt_sharpBoundaryKernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) + (ht : t < 1 / 2) + (hstd : CubeVectorBesovHRegularity Q t u) + (hmem : SharpBoundaryProjectionMemLp Q u) : + cubeBesovOverlappingPositiveVectorSeminormTwo Q t u ≤ + Real.sqrt (sharpBoundaryKernelLoss d t) * + cubeBesovPositiveVectorSeminormTwo Q t u := by + refine cubeBesovOverlappingPositiveVectorSeminormTwo_le_of_partialBound Q t u ?_ + intro N + have hpartial := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sqrt_sharpBoundaryKernel + Q t N u ht + (fun j _hj => hmem.residual j) + (fun j _hj => hmem.residual_overlap j) + (fun j _hj => hmem.projection_overlap j) + (fun j _hj => hmem.projection_zero_overlap j) + (fun j _hj => hmem.projection_gap_overlap j) + (fun j _hj => hmem.increment_overlap j) + (fun j _hj => hmem.parent j) + calc + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u + ≤ Real.sqrt (sharpBoundaryKernelLoss d t) * + cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + simpa [sharpBoundaryKernelLoss] using hpartial + _ ≤ Real.sqrt (sharpBoundaryKernelLoss d t) * + cubeBesovPositiveVectorSeminormTwo Q t u := by + exact mul_le_mul_of_nonneg_left + (by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hstd.partialSeminorms_bddAbove ⟨N, rfl⟩) + (Real.sqrt_nonneg _) + +/-- Full norm form of the sharp-boundary comparison. The average part is +common to the two positive norms, so the seminorm loss becomes `1 + sqrt L` +on the full norm. -/ +theorem cubeBesovOverlappingPositiveVectorNormTwo_le_one_add_sqrt_sharpBoundaryKernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) (t : ℝ) (u : Vec d → Vec d) + (ht : t < 1 / 2) + (hstd : CubeVectorBesovHRegularity Q t u) + (hmem : SharpBoundaryProjectionMemLp Q u) : + cubeBesovOverlappingPositiveVectorNormTwo Q t u ≤ + (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * + cubeBesovPositiveVectorNormTwo Q t u := by + let A : ℝ := Real.sqrt (vecNormSq (cubeAverageVec Q u)) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q t u + let C : ℝ := Real.sqrt (sharpBoundaryKernelLoss d t) + have hsem : + cubeBesovOverlappingPositiveVectorSeminormTwo Q t u ≤ C * B := by + simpa [B, C] using + cubeBesovOverlappingPositiveVectorSeminormTwo_le_sqrt_sharpBoundaryKernel + Q t u ht hstd hmem + have hA : 0 ≤ A := by + dsimp [A] + exact Real.sqrt_nonneg _ + have hB : 0 ≤ B := by + dsimp [B] + unfold cubeBesovPositiveVectorSeminormTwo + have h0_le : + cubeBesovPositiveVectorPartialSeminormTwo Q t 0 u ≤ + sSup (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N u) := + le_csSup hstd.partialSeminorms_bddAbove ⟨0, rfl⟩ + exact (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q t 0 u).trans h0_le + have hC : 0 ≤ C := by + dsimp [C] + exact Real.sqrt_nonneg _ + unfold cubeBesovOverlappingPositiveVectorNormTwo cubeBesovPositiveVectorNormTwo + change + A + cubeBesovOverlappingPositiveVectorSeminormTwo Q t u ≤ + (1 + C) * (A + B) + calc + A + cubeBesovOverlappingPositiveVectorSeminormTwo Q t u + ≤ A + C * B := by + exact add_le_add le_rfl hsem + _ ≤ A + C * B + (B + C * A) := by + exact le_add_of_nonneg_right + (add_nonneg hB (mul_nonneg hC hA)) + _ = (1 + C) * (A + B) := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSummation.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSummation.lean new file mode 100644 index 0000000000..f1dd14d140 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionSummation.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.DiscreteConvolution + +/-! # Standard Projection Summation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal BigOperators + +/-! +# Summing geometric-tail depth estimates + +The sharp boundary comparison gives a one-depth estimate whose hard term is a +lower-triangular geometric tail of ordinary positive depth seminorms. This +file converts such one-depth estimates into finite `q = 2` positive Besov +estimates. +-/ + +/-- If every overlapping depth contribution is controlled by the same-depth +ordinary contribution plus a lower-triangular geometric tail of ordinary depth +contributions, then the finite overlapping `q = 2` seminorm is controlled by +the ordinary finite `q = 2` seminorm with the corresponding geometric loss. -/ +theorem sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_depth_geometric_tail + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + {A B r : ℝ} + (hB_nonneg : 0 ≤ B) + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q t u j) ^ 2 ≤ + A * (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + B * + (∑ m ∈ Finset.range j, + r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) ^ 2) : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + (A + B * ((1 - r)⁻¹) ^ 2) * + (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + rw [sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo, + sq_cubeBesovPositiveVectorPartialSeminormTwo] + exact + sq_sum_le_of_le_add_geometric_convolution_sq + (N := N) (A := A) (B := B) (r := r) + (x := fun j => cubeBesovOverlappingPositiveVectorDepthSeminorm Q t u j) + (a := fun j => cubeBesovPositiveVectorDepthSeminorm Q t u j) + hB_nonneg hr_nonneg hr_lt_one hdepth + +/-- Square-root form of +`sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_depth_geometric_tail`. -/ +theorem cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_sqrt_loss_of_depth_geometric_tail + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (N : ℕ) (u : Vec d → Vec d) + {A B r : ℝ} + (hB_nonneg : 0 ≤ B) + (hr_nonneg : 0 ≤ r) (hr_lt_one : r < 1) + (hloss_nonneg : 0 ≤ A + B * ((1 - r)⁻¹) ^ 2) + (hdepth : + ∀ j ∈ Finset.range (N + 1), + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q t u j) ^ 2 ≤ + A * (cubeBesovPositiveVectorDepthSeminorm Q t u j) ^ 2 + + B * + (∑ m ∈ Finset.range j, + r ^ (j - m) * + cubeBesovPositiveVectorDepthSeminorm Q t u m) ^ 2) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u + ≤ + Real.sqrt (A + B * ((1 - r)⁻¹) ^ 2) * + cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + have hsq := + sq_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_of_depth_geometric_tail + (Q := Q) (t := t) (N := N) (u := u) + (A := A) (B := B) (r := r) + hB_nonneg hr_nonneg hr_lt_one hdepth + have hleft_nonneg : + 0 ≤ cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u := + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q t N u + have hright_nonneg : + 0 ≤ Real.sqrt (A + B * ((1 - r)⁻¹) ^ 2) * + cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + exact mul_nonneg (Real.sqrt_nonneg _) + (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q t N u) + refine (sq_le_sq₀ hleft_nonneg hright_nonneg).1 ?_ + calc + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q t N u) ^ 2 + ≤ + (A + B * ((1 - r)⁻¹) ^ 2) * + (cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := hsq + _ = + (Real.sqrt (A + B * ((1 - r)⁻¹) ^ 2) * + cubeBesovPositiveVectorPartialSeminormTwo Q t N u) ^ 2 := by + rw [mul_pow, Real.sq_sqrt hloss_nonneg] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionVector.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionVector.lean new file mode 100644 index 0000000000..eb6ce8907c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/ConstantCoefficientDirichletBesov/StandardProjectionVector.lean @@ -0,0 +1,289 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.ProjectionCharacterization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise + +/-! # Standard Projection Vector -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped ENNReal + +/-! +# Vector projection API for standard positive Besov depths + +This file packages the coordinatewise version of the scalar triadic projection +and records that, on each depth-`j` descendant, the projection residual is +exactly the ordinary cube fluctuation used in the standard positive vector norm. +-/ + +/-- Coordinatewise triadic projection of a vector field. -/ +noncomputable def cubeProjectionVec {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → Vec d) : Vec d → Vec d := + fun x i => cubeProjection Q j (fun y => u y i) x + +/-- Coordinatewise triadic martingale increment of a vector field. -/ +noncomputable def cubeIncrementVec {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → Vec d) : Vec d → Vec d := + fun x i => cubeIncrement Q j (fun y => u y i) x + +/-- Coordinatewise projection gap `P_{j+n} u - P_j u`. -/ +noncomputable def cubeProjectionGapVec {d : ℕ} (Q : TriadicCube d) (j n : ℕ) + (u : Vec d → Vec d) : Vec d → Vec d := + fun x i => cubeProjectionGap Q j n (fun y => u y i) x + +@[simp] theorem cubeProjectionVec_apply {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → Vec d) (x : Vec d) (i : Fin d) : + cubeProjectionVec Q j u x i = cubeProjection Q j (fun y => u y i) x := + rfl + +@[simp] theorem cubeIncrementVec_apply {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (u : Vec d → Vec d) (x : Vec d) (i : Fin d) : + cubeIncrementVec Q j u x i = cubeIncrement Q j (fun y => u y i) x := + rfl + +@[simp] theorem cubeProjectionGapVec_apply {d : ℕ} (Q : TriadicCube d) (j n : ℕ) + (u : Vec d → Vec d) (x : Vec d) (i : Fin d) : + cubeProjectionGapVec Q j n u x i = + cubeProjectionGap Q j n (fun y => u y i) x := + rfl + +/-- On a descendant cube, the vector projection is the descendant average. -/ +theorem cubeProjectionVec_eq_cubeAverageVec_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (u : Vec d → Vec d) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hxR : x ∈ cubeSet R) : + cubeProjectionVec Q j u x = cubeAverageVec R u := by + ext i + exact cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) (fun y => u y i) hR hxR + +/-- Depth-zero vector projections are the parent average on the parent cube. -/ +theorem cubeProjectionVec_zero_eq_cubeAverageVec_of_mem_cubeSet {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) {x : Vec d} + (hxQ : x ∈ cubeSet Q) : + cubeProjectionVec Q 0 u x = cubeAverageVec Q u := by + exact cubeProjectionVec_eq_cubeAverageVec_of_mem_descendantsAtDepth + (Q := Q) (R := Q) (j := 0) u (by simp) hxQ + +/-- Vector projection gaps are pointwise projection differences. -/ +theorem cubeProjectionGapVec_eq_sub_cubeProjectionVec {d : ℕ} + (Q : TriadicCube d) (j n : ℕ) (u : Vec d → Vec d) : + cubeProjectionGapVec Q j n u = + fun x => cubeProjectionVec Q (j + n) u x - cubeProjectionVec Q j u x := by + funext x + ext i + rfl + +/-- Projection as depth-zero projection plus the gap from depth zero. -/ +theorem cubeProjectionVec_eq_projection_zero_add_gap_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u : Vec d → Vec d) : + cubeProjectionVec Q j u = + fun x => cubeProjectionVec Q 0 u x + cubeProjectionGapVec Q 0 j u x := by + funext x + ext i + simp [cubeProjectionGapVec, cubeProjectionGap] + +/-- Vector projections telescope as a finite sum of coordinatewise increments. -/ +theorem sum_cubeIncrementVec_eq_cubeProjectionGapVec {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j n : ℕ) : + (fun x => + Finset.sum (Finset.range n) + (fun m => cubeIncrementVec Q (j + m + 1) u x)) = + cubeProjectionGapVec Q j n u := by + funext x + ext i + simpa [cubeIncrementVec, cubeProjectionGapVec] using + congrFun (sum_cubeIncrement_eq_cubeProjectionGap + (Q := Q) (u := fun y => u y i) (j := j) (n := n)) x + +@[simp] theorem cubeProjectionGapVec_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u : Vec d → Vec d) : + cubeProjectionGapVec Q j 0 u = 0 := by + funext x + ext i + simp [cubeProjectionGapVec, cubeProjectionGap] + +/-- The depth-`j` vector projection is the parent average plus the gap from +depth zero to depth `j`, on the parent cube. -/ +theorem cubeProjectionVec_eq_average_add_gap_zero_of_mem_cubeSet {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u : Vec d → Vec d) {x : Vec d} + (hxQ : x ∈ cubeSet Q) : + cubeProjectionVec Q j u x = + cubeAverageVec Q u + cubeProjectionGapVec Q 0 j u x := by + ext i + have hzero : + cubeProjectionVec Q 0 u x i = cubeAverageVec Q u i := by + rw [cubeProjectionVec_zero_eq_cubeAverageVec_of_mem_cubeSet Q u hxQ] + calc + cubeProjectionVec Q j u x i + = + cubeAverageVec Q u i + + (cubeProjectionVec Q j u x i - cubeProjectionVec Q 0 u x i) := by + rw [hzero] + ring + _ = + (cubeAverageVec Q u + cubeProjectionGapVec Q 0 j u x) i := by + simp [cubeProjectionGapVec, cubeProjectionGap] + +/-- On a child of a depth-`m` descendant, the vector martingale increment is +the child average minus the parent average. -/ +theorem cubeIncrementVec_eq_sub_cubeAverageVec_of_mem_childCubes + {d : ℕ} {Q T R : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hT : T ∈ descendantsAtDepth Q m) (hRT : R ∈ childCubes T) {x : Vec d} + (hxR : x ∈ cubeSet R) : + cubeIncrementVec Q (m + 1) u x = cubeAverageVec R u - cubeAverageVec T u := by + have hR : R ∈ descendantsAtDepth Q (m + 1) := by + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨T, hT, hRT⟩ + have hxT : x ∈ cubeSet T := cubeSet_subset_of_mem_childCubes hRT hxR + ext i + have hnext : + cubeProjection Q (m + 1) (fun y => u y i) x = + cubeAverage R (fun y => u y i) := + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := m + 1) (fun y => u y i) hR hxR + have hprev : + cubeProjection Q m (fun y => u y i) x = + cubeAverage T (fun y => u y i) := + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := T) (j := m) (fun y => u y i) hT hxT + simp [cubeIncrementVec, cubeIncrement, hnext, hprev, cubeAverageVec] + +/-- A vector martingale increment is constant on every standard descendant at +its own scale. -/ +theorem exists_const_cubeIncrementVec_on_mem_descendantsAtDepth_succ {d : ℕ} + {Q R : TriadicCube d} {m : ℕ} (u : Vec d → Vec d) + (hR : R ∈ descendantsAtDepth Q (m + 1)) : + ∃ c : Vec d, ∀ x ∈ cubeSet R, cubeIncrementVec Q (m + 1) u x = c := by + rcases mem_descendantsAtDepth_succ_iff.mp hR with ⟨T, hT, hRT⟩ + refine ⟨cubeAverageVec R u - cubeAverageVec T u, ?_⟩ + intro x hxR + have hxT : x ∈ cubeSet T := cubeSet_subset_of_mem_childCubes hRT hxR + ext i + have hnext : + cubeProjection Q (m + 1) (fun y => u y i) x = + cubeAverage R (fun y => u y i) := + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := m + 1) (fun y => u y i) hR hxR + have hprev : + cubeProjection Q m (fun y => u y i) x = + cubeAverage T (fun y => u y i) := + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth + (Q := Q) (R := T) (j := m) (fun y => u y i) hT hxT + simp [cubeIncrementVec, cubeIncrement, hnext, hprev, cubeAverageVec] + +/-- On a descendant cube, the vector projection residual is the ordinary +fluctuation on that cube. -/ +theorem sub_cubeProjectionVec_eq_cubeFluctuationVec_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (u : Vec d → Vec d) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hxR : x ∈ cubeSet R) : + u x - cubeProjectionVec Q j u x = cubeFluctuationVec R u x := by + rw [cubeProjectionVec_eq_cubeAverageVec_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR hxR] + rfl + +/-- The `L²` norm of the projection residual on a descendant is the ordinary +positive fluctuation norm on that descendant. -/ +theorem cubeLpNorm_sub_cubeProjectionVec_eq_cubeLpNorm_cubeFluctuationVec_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (u : Vec d → Vec d) + (hR : R ∈ descendantsAtDepth Q j) : + cubeLpNorm R (2 : ℝ≥0∞) (fun x => u x - cubeProjectionVec Q j u x) = + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u) := by + apply cubeLpNorm_congr_on_cubeSet_generic R (2 : ℝ≥0∞) + intro x hx + exact sub_cubeProjectionVec_eq_cubeFluctuationVec_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR hx + +/-- Ordinary positive vector depth averages can be read as projection-residual +averages at the same depth. -/ +theorem cubeBesovPositiveVectorDepthAverage_eq_projectionVec_residual {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovPositiveVectorDepthAverage Q u j = + descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (fun x => u x - cubeProjectionVec Q j u x)) ^ 2) := by + unfold cubeBesovPositiveVectorDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [cubeLpNorm_sub_cubeProjectionVec_eq_cubeLpNorm_cubeFluctuationVec_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) u hR] + +/-- Depth seminorm form of `cubeBesovPositiveVectorDepthAverage_eq_projectionVec_residual`. -/ +theorem cubeBesovPositiveVectorDepthSeminorm_eq_projectionVec_residual {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovPositiveVectorDepthSeminorm Q s u j = + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (fun x => u x - cubeProjectionVec Q j u x)) ^ 2)) := by + unfold cubeBesovPositiveVectorDepthSeminorm + rw [cubeBesovPositiveVectorDepthAverage_eq_projectionVec_residual] + +/-- The descendant average of squared vector `L²` norms is the parent squared +`L²` norm. -/ +theorem descendantsAverage_cubeLpNorm_two_sq_eq_cubeLpNorm_two_sq {d : ℕ} + (Q : TriadicCube d) (v : Vec d → Vec d) (j : ℕ) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + descendantsAverage Q j (fun R => (cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) = + (cubeLpNorm Q (2 : ℝ≥0∞) v) ^ 2 := by + have hnorm_int : + MeasureTheory.IntegrableOn (fun x => ‖v x‖ ^ (2 : ℝ)) + (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure (Q := Q) + (hv.integrable_norm_rpow (by norm_num) (by norm_num)) + calc + descendantsAverage Q j (fun R => (cubeLpNorm R (2 : ℝ≥0∞) v) ^ 2) + = descendantsAverage Q j (fun R => cubeAverage R (fun x => ‖v x‖ ^ (2 : ℝ))) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := R) (p := (2 : ℝ≥0∞)) + (f := v) (by norm_num) (by norm_num) + (memLp_on_descendant_of_memLp_generic (Q := Q) (R := R) (j := j) + hR hv)) + _ = cubeAverage Q (fun x => ‖v x‖ ^ (2 : ℝ)) := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + (Q := Q) (j := j) (f := fun x => ‖v x‖ ^ (2 : ℝ)) hnorm_int] + _ = (cubeLpNorm Q (2 : ℝ≥0∞) v) ^ 2 := by + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow (Q := Q) (p := (2 : ℝ≥0∞)) + (f := v) (by norm_num) (by norm_num) hv).symm + +/-- The parent `L²` norm of the depth-`j` projection residual is exactly the +ordinary positive depth average. -/ +theorem cubeLpNorm_sub_cubeProjectionVec_sq_eq_cubeBesovPositiveVectorDepthAverage + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (hres : + MeasureTheory.MemLp (fun x => u x - cubeProjectionVec Q j u x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeProjectionVec Q j u x)) ^ 2 = + cubeBesovPositiveVectorDepthAverage Q u j := by + calc + (cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x - cubeProjectionVec Q j u x)) ^ 2 + = + descendantsAverage Q j + (fun R => (cubeLpNorm R (2 : ℝ≥0∞) + (fun x => u x - cubeProjectionVec Q j u x)) ^ 2) := by + exact (descendantsAverage_cubeLpNorm_two_sq_eq_cubeLpNorm_two_sq + Q (fun x => u x - cubeProjectionVec Q j u x) j hres).symm + _ = cubeBesovPositiveVectorDepthAverage Q u j := by + exact (cubeBesovPositiveVectorDepthAverage_eq_projectionVec_residual + Q u j).symm + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes.lean new file mode 100644 index 0000000000..683a8f18dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityExponentLoss +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSCoefficientLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2WeakFlux +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.HarmonicApproximation + +/-! # Homogenization Black Boxes -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2.lean new file mode 100644 index 0000000000..e46c1f08b8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2.lean @@ -0,0 +1,1058 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities + +/-! # Coarse Graining L2 -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Deterministic homogenization black boxes: general coarse graining in `L²` + +This file contains the Section 3.3.B theorem surface from +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3009--3253. + +The theorem is stated as the deterministic composition step: once the local +coarse flux-defect estimate from the preceding Chapter-3 files supplies the +single hypothesis `hcoarseFluxDefect`, the duality lemma from Section 3.3.A +turns it into the global comparison estimate. The right-hand side below is the +manuscript expression in the existing Lean notation: + +* `coarseGrainingHomogenizationErrorAtDepth Q a a0 s j` is + `𝓔_{s,∞,1}(Q,n;a,a₀)` with depth `j = m - n`; +* `lambdaSq` and `LambdaSq` are the scale-local multiscale ellipticity + quantities, not the qualitative uniform ellipticity constants; +* `cubeBesovPositiveVectorSeminormTwo` is the note-normalized + `3^{sm}[g]_{\underline B^s_{2,2}(Q)}`. +-/ + +open scoped BigOperators ENNReal + +/-- +The truncated homogenization-error quantity +`𝓔_{s,∞,1}(Q,n;a,a₀)` from Proposition +`p.general.coarse.graining.p2.deterministic.theory`. + +In Lean, the parent cube is `Q` and the scale gap `m - n` is the descendant +depth `j`, so the truncation is the supremum over descendants of `Q` at depth +`j`. +-/ +noncomputable def coarseGrainingHomogenizationErrorAtDepth {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) (j : ℕ) : ℝ := + finsetSsup (descendantsAtDepth Q j) fun R => + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 + +/-- At depth zero the truncated homogenization error is the one-cube error. -/ +@[simp] theorem coarseGrainingHomogenizationErrorAtDepth_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) : + coarseGrainingHomogenizationErrorAtDepth Q a a0 s 0 = + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + simp [coarseGrainingHomogenizationErrorAtDepth] + +/-- The q=1 homogenization error on one cube is nonnegative. -/ +theorem homogenizationErrorOnCube_infinity_one_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {s : ℝ} + (hs : 0 ≤ s) : + 0 ≤ HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + refine tsum_nonneg ?_ + intro n + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) + (scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0) + +/-- Each descendant error is bounded by the depth-truncated parent error. -/ +theorem homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth + {d : ℕ} {Q R : TriadicCube d} {a : CoeffField d} {a0 : Mat d} + {s : ℝ} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := by + unfold coarseGrainingHomogenizationErrorAtDepth finsetSsup + have hBdd : + BddAbove + ((fun S : TriadicCube d => + HomogenizationErrorOnCube S s .infinity (.finite 1) a a0) '' + (↑(descendantsAtDepth Q j) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image + (fun S : TriadicCube d => + HomogenizationErrorOnCube S s .infinity (.finite 1) a a0)).bddAbove + exact le_csSup hBdd ⟨R, hR, rfl⟩ + +/-- The depth-truncated parent homogenization error is nonnegative. -/ +theorem coarseGrainingHomogenizationErrorAtDepth_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {s : ℝ} (j : ℕ) + (hs : 0 ≤ s) : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := by + obtain ⟨R0, hR0⟩ := descendantsAtDepth_nonempty Q j + exact (homogenizationErrorOnCube_infinity_one_nonneg R0 a a0 hs).trans + (homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR0) + +/-- +The explicit right-hand side inside the dimension-only constant in the general +coarse-graining estimate, manuscript lines 3026--3057. + +This is intentionally separated from the final theorem so downstream callers +can produce a bound on the local flux defect once and then compose it through +`solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le`. +-/ +noncomputable def coarseGrainingL2FluxDefectBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : ℝ := + (s⁻¹) * Real.sqrt (matNorm a0) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) + + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- The first, energy-only term in `coarseGrainingL2FluxDefectBound`. -/ +noncomputable def coarseGrainingL2FluxDefectEnergyTerm {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU : Vec d → Vec d) : ℝ := + (s⁻¹) * Real.sqrt (matNorm a0) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) + +/-- The positive-Besov forcing tail in `coarseGrainingL2FluxDefectBound`. -/ +noncomputable def coarseGrainingL2FluxDefectForcingTerm {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (g : Vec d → Vec d) : ℝ := + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo Q s g + +/-- Scale-separated positive-Besov forcing tail in the repaired Section 3.3.B +RHS. The flux-response exponent is `s`, while the force is measured at the +stronger positive exponent `t`. -/ +noncomputable def coarseGrainingL2FluxDefectForcingTermTwoExponent {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s t : ℝ) (j : ℕ) (g : Vec d → Vec d) : ℝ := + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + ((Real.rpow (3 : ℝ) (t * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q t g) + +/-- Repaired scale-separated local flux-defect RHS in Section 3.3.B. -/ +noncomputable def coarseGrainingL2FluxDefectBoundTwoExponent {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s t : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : ℝ := + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU + + coarseGrainingL2FluxDefectForcingTermTwoExponent Q a a0 s t j g + +theorem coarseGrainingL2FluxDefectBound_eq_energyTerm_add_forcingTerm {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g = + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU + + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := by + rfl + +theorem coarseGrainingL2FluxDefectBoundTwoExponent_eq_energyTerm_add_forcingTerm {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s t : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : + coarseGrainingL2FluxDefectBoundTwoExponent Q a a0 s t j gradU g = + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU + + coarseGrainingL2FluxDefectForcingTermTwoExponent Q a a0 s t j g := by + rfl + +theorem coarseGrainingL2FluxDefectEnergyTerm_le_coarseGrainingL2FluxDefectBound_of_forcingTerm_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) + (hforcing_nonneg : 0 ≤ coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := by + rw [coarseGrainingL2FluxDefectBound_eq_energyTerm_add_forcingTerm] + linarith + +/-- The positive-Besov forcing tail in the Section 3.3.B RHS is nonnegative. -/ +theorem coarseGrainingL2FluxDefectForcingTerm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := by + have hE_nonneg : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hB_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g := + by + have h0_le : + cubeBesovPositiveVectorPartialSeminormTwo Q s 0 g ≤ + cubeBesovPositiveVectorSeminormTwo Q s g := by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hgBdd ⟨0, rfl⟩ + exact (cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s 0 g).trans h0_le + have hs_rpow_five_half_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hs_rpow_three_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hpow_half_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hLambda_sqrt_nonneg : + 0 ≤ Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) := + Real.sqrt_nonneg _ + have hmat_sqrt_nonneg : 0 ≤ Real.sqrt (matNorm a0) := + Real.sqrt_nonneg _ + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hlambda_inv_sqrt_nonneg : + 0 ≤ Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := + Real.sqrt_nonneg _ + have hterm₁ : + 0 ≤ + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_five_half_nonneg hmat_sqrt_nonneg) + hpow_half_nonneg) + hlambda_inv_sqrt_nonneg) + hE_nonneg + have hterm₂ : + 0 ≤ + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_five_half_nonneg hpow_nonneg) + hLambda_sqrt_nonneg) + hlambda_inv_sqrt_nonneg + have hterm₃ : + 0 ≤ + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_three_nonneg hpow_nonneg) + (matNorm_nonneg a0)) + hlambda_inv_nonneg + have hsum_nonneg : + 0 ≤ + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact add_nonneg (add_nonneg hterm₁ hterm₂) hterm₃ + unfold coarseGrainingL2FluxDefectForcingTerm + exact mul_nonneg hsum_nonneg hB_nonneg + +/-- +With depth zero and zero forcing, the general Section 3.3.B flux-defect RHS +collapses to the homogeneous RHS term from manuscript lines 3264--3292. +-/ +@[simp] theorem coarseGrainingL2FluxDefectBound_depth_zero_zero_forcing {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU : Vec d → Vec d) : + coarseGrainingL2FluxDefectBound Q a a0 s 0 gradU (0 : Vec d → Vec d) = + (s⁻¹) * Real.sqrt (matNorm a0) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU)) := by + simp [coarseGrainingL2FluxDefectBound] + +/-- +Localized `q = 2` response-average bound produced by applying the `q = 1` +coarse-flux response estimate on each descendant cube. + +This is the scalar quantity that still has to be localized into the manuscript +`coarseGrainingL2FluxDefectBound` when assembling the fully internal Section +3.3.B wrapper. +-/ +noncomputable def localizedCoarseFluxResponseAverageBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (energy : Vec d → ℝ) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2) + +/-- +If the localized response square is pointwise bounded by a constant multiple of +the local energy average, then the descendant `L²` response average is bounded +by that constant times the square root of the averaged energy. +-/ +theorem localizedCoarseFluxResponseAverageBound_le_const_mul_sqrt_of_descendantsAverage_energy_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (energy : Vec d → ℝ) {C A : ℝ} + (hC_nonneg : 0 ≤ C) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2 ≤ + C ^ 2 * cubeAverage R energy) + (havg : descendantsAverage Q j (fun R => cubeAverage R energy) ≤ A) : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + C * Real.sqrt A := by + let T : TriadicCube d → ℝ := fun R => + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy)) + have hdesc : + descendantsAverage Q j (fun R => (T R) ^ 2) ≤ + descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact hpoint R hR + have hconst : + descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) = + C ^ 2 * descendantsAverage Q j (fun R => cubeAverage R energy) := by + exact descendantsAverage_mul_left Q j (C ^ 2) (fun R => cubeAverage R energy) + have hscaled : + C ^ 2 * descendantsAverage Q j (fun R => cubeAverage R energy) ≤ C ^ 2 * A := by + exact mul_le_mul_of_nonneg_left havg (sq_nonneg C) + have hinside : + descendantsAverage Q j (fun R => (T R) ^ 2) ≤ C ^ 2 * A := by + calc + descendantsAverage Q j (fun R => (T R) ^ 2) + ≤ descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) := hdesc + _ = C ^ 2 * descendantsAverage Q j (fun R => cubeAverage R energy) := hconst + _ ≤ C ^ 2 * A := hscaled + calc + localizedCoarseFluxResponseAverageBound Q a a0 s j energy + = Real.sqrt (descendantsAverage Q j fun R => (T R) ^ 2) := by + rfl + _ ≤ Real.sqrt (C ^ 2 * A) := Real.sqrt_le_sqrt hinside + _ = C * Real.sqrt A := by + rw [Real.sqrt_mul (sq_nonneg C), Real.sqrt_sq hC_nonneg] + +/-- +Parent-cube energy localization form of +`localizedCoarseFluxResponseAverageBound_le_const_mul_sqrt_of_descendantsAverage_energy_bound`. +-/ +theorem localizedCoarseFluxResponseAverageBound_le_const_mul_sqrt_cubeAverage_of_pointwise_sq_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (energy : Vec d → ℝ) {C : ℝ} + (hC_nonneg : 0 ≤ C) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2 ≤ + C ^ 2 * cubeAverage R energy) : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + C * Real.sqrt (cubeAverage Q energy) := by + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + exact + localizedCoarseFluxResponseAverageBound_le_const_mul_sqrt_of_descendantsAverage_energy_bound + Q a a0 s j energy hC_nonneg hpoint (le_of_eq havg_eq) + +/-- +The localized response average is bounded by the parent depth-truncated +homogenization error with the raw q=1 geometric prefactor. +-/ +theorem localizedCoarseFluxResponseAverageBound_le_invGeom_mul_errorAtDepth_mul_sqrt_four_matNorm_sqrt_cubeAverage + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (energy : Vec d → ℝ) + (hs : 0 < s) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (henergy_avg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ cubeAverage R energy) + (herror_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + ((geometricDiscount s 1)⁻¹ * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j * + Real.sqrt (((4 : ℝ) * matNorm a0))) * + Real.sqrt (cubeAverage Q energy) := by + let H : ℝ := (geometricDiscount s 1)⁻¹ + let E : ℝ := coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let M : ℝ := Real.sqrt (((4 : ℝ) * matNorm a0)) + let C : ℝ := H * E * M + have hH_nonneg : 0 ≤ H := by + dsimp [H] + exact inv_nonneg.mpr (geometricDiscount_pos (by simpa using hs)).le + have hE_nonneg : 0 ≤ E := by + obtain ⟨R0, hR0⟩ := descendantsAtDepth_nonempty Q j + exact (herror_nonneg R0 hR0).trans + (homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR0) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact Real.sqrt_nonneg _ + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (mul_nonneg hH_nonneg hE_nonneg) hM_nonneg + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2 ≤ + C ^ 2 * cubeAverage R energy := by + intro R hR + have hER_nonneg : + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 := + herror_nonneg R hR + have hER_le : + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ E := by + dsimp [E] + exact homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR + have hA_nonneg : 0 ≤ cubeAverage R energy := henergy_avg_nonneg R hR + have hsqrtA_nonneg : 0 ≤ Real.sqrt (cubeAverage R energy) := Real.sqrt_nonneg _ + have hbase_le : + H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * M ≤ + H * E * M := by + have hleft : + H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + H * E := by + exact mul_le_mul_of_nonneg_left hER_le hH_nonneg + exact mul_le_mul_of_nonneg_right hleft hM_nonneg + have hterm_nonneg : + 0 ≤ H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (M * Real.sqrt (cubeAverage R energy)) := by + exact mul_nonneg (mul_nonneg hH_nonneg hER_nonneg) + (mul_nonneg hM_nonneg hsqrtA_nonneg) + have hterm_le : + H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (M * Real.sqrt (cubeAverage R energy)) ≤ + C * Real.sqrt (cubeAverage R energy) := by + calc + H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (M * Real.sqrt (cubeAverage R energy)) + = + (H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * M) * + Real.sqrt (cubeAverage R energy) := by + ring + _ ≤ (H * E * M) * Real.sqrt (cubeAverage R energy) := by + exact mul_le_mul_of_nonneg_right hbase_le hsqrtA_nonneg + _ = C * Real.sqrt (cubeAverage R energy) := by + simp [C] + have hsquare := + pow_le_pow_left₀ hterm_nonneg hterm_le 2 + calc + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2 + = + (H * HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (M * Real.sqrt (cubeAverage R energy))) ^ 2 := by + simp [H, M] + _ ≤ (C * Real.sqrt (cubeAverage R energy)) ^ 2 := hsquare + _ = C ^ 2 * cubeAverage R energy := by + rw [mul_pow, Real.sq_sqrt hA_nonneg] + simpa [H, E, M, C] using + localizedCoarseFluxResponseAverageBound_le_const_mul_sqrt_cubeAverage_of_pointwise_sq_bound + Q a a0 s j energy hC_nonneg henergy_int hpoint + +/-- +Constant-adequacy form of the localized response average: once the scalar +geometric reciprocal has been bounded by `5 * s⁻¹`, the raw q=1 response +prefactor is controlled by ten times the manuscript energy term. +-/ +theorem localizedCoarseFluxResponseAverageBound_le_ten_mul_energyTerm_of_invGeom_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (energy : Vec d → ℝ) + (hs : 0 < s) + (hgeom_le : (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹) + (henergy_int : + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (henergy_avg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ cubeAverage R energy) + (herror_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + 10 * ((s⁻¹) * Real.sqrt (matNorm a0) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j * + Real.sqrt (cubeAverage Q energy)) := by + let H : ℝ := (geometricDiscount s 1)⁻¹ + let E : ℝ := coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let S : ℝ := Real.sqrt (matNorm a0) + have hE_nonneg : 0 ≤ E := by + obtain ⟨R0, hR0⟩ := descendantsAtDepth_nonempty Q j + exact (herror_nonneg R0 hR0).trans + (homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR0) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact Real.sqrt_nonneg _ + have hsqrtQ_nonneg : 0 ≤ Real.sqrt (cubeAverage Q energy) := Real.sqrt_nonneg _ + have hroot_four : Real.sqrt (4 : ℝ) = 2 := by + rw [Real.sqrt_eq_iff_mul_self_eq + (by norm_num : 0 ≤ (4 : ℝ)) (by norm_num : 0 ≤ (2 : ℝ))] + norm_num + have hsqrt_four : + Real.sqrt (((4 : ℝ) * matNorm a0)) = 2 * S := by + dsimp [S] + rw [Real.sqrt_mul (by norm_num : 0 ≤ (4 : ℝ)), hroot_four] + have htwoH_le : 2 * H ≤ 10 * s⁻¹ := by + have h := mul_le_mul_of_nonneg_left hgeom_le (by norm_num : 0 ≤ (2 : ℝ)) + dsimp [H] + nlinarith + have hcoef0 : + H * Real.sqrt (((4 : ℝ) * matNorm a0)) ≤ (10 * s⁻¹) * S := by + calc + H * Real.sqrt (((4 : ℝ) * matNorm a0)) + = H * (2 * S) := by rw [hsqrt_four] + _ = (2 * H) * S := by ring + _ ≤ (10 * s⁻¹) * S := by + exact mul_le_mul_of_nonneg_right htwoH_le hS_nonneg + have hcoef : + H * E * Real.sqrt (((4 : ℝ) * matNorm a0)) ≤ + ((10 * s⁻¹) * S) * E := by + calc + H * E * Real.sqrt (((4 : ℝ) * matNorm a0)) + = (H * Real.sqrt (((4 : ℝ) * matNorm a0))) * E := by ring + _ ≤ ((10 * s⁻¹) * S) * E := by + exact mul_le_mul_of_nonneg_right hcoef0 hE_nonneg + calc + localizedCoarseFluxResponseAverageBound Q a a0 s j energy + ≤ (H * E * Real.sqrt (((4 : ℝ) * matNorm a0))) * + Real.sqrt (cubeAverage Q energy) := by + simpa [H, E] using + localizedCoarseFluxResponseAverageBound_le_invGeom_mul_errorAtDepth_mul_sqrt_four_matNorm_sqrt_cubeAverage + Q a a0 j energy hs henergy_int henergy_avg_nonneg herror_nonneg + _ ≤ (((10 * s⁻¹) * S) * E) * Real.sqrt (cubeAverage Q energy) := by + exact mul_le_mul_of_nonneg_right hcoef hsqrtQ_nonneg + _ = 10 * ((s⁻¹) * Real.sqrt (matNorm a0) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j * + Real.sqrt (cubeAverage Q energy)) := by + simp [S, E] + ring + +/-- +For the coefficient-energy density, the ten-factor response control is +absorbed by ten times the full Section 3.3.B flux-defect RHS whenever the +forcing tail is nonnegative. +-/ +theorem localizedCoarseFluxResponseAverageBound_coefficientEnergy_le_ten_mul_coarseGrainingL2FluxDefectBound_of_invGeom_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (hs : 0 < s) + (hgeom_le : (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (henergy_avg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ cubeAverage R (coefficientEnergyDensity a gradU)) + (herror_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) + (hforcing_nonneg : + 0 ≤ coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + localizedCoarseFluxResponseAverageBound Q a a0 s j + (coefficientEnergyDensity a gradU) ≤ + 10 * coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := by + have hresponse_energy : + localizedCoarseFluxResponseAverageBound Q a a0 s j + (coefficientEnergyDensity a gradU) ≤ + 10 * coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := by + simpa [coarseGrainingL2FluxDefectEnergyTerm] using + localizedCoarseFluxResponseAverageBound_le_ten_mul_energyTerm_of_invGeom_le + Q a a0 j (coefficientEnergyDensity a gradU) hs hgeom_le + henergy_int henergy_avg_nonneg herror_nonneg + have henergy_le : + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + coarseGrainingL2FluxDefectEnergyTerm_le_coarseGrainingL2FluxDefectBound_of_forcingTerm_nonneg + Q a a0 s j gradU g hforcing_nonneg + exact hresponse_energy.trans + (mul_le_mul_of_nonneg_left henergy_le (by norm_num : 0 ≤ (10 : ℝ))) + +/-- +Localized `q = 2` flux-defect bound obtained by applying the `q = 1` +coarse-flux response theorem on every descendant cube and then averaging the +result. + +This is the bridge between the Section 3.2 flux-response estimates and the +single localized flux-defect hypothesis consumed by the Section 3.3.B +coarse-graining apex. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendant_coarseFluxResponse + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (defect : Vec d → Vec d) (energy : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 defect energy) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N defect)) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_qonePartialBound + Q s defect j + (fun R => + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ?_ + intro R hR N + calc + cubeBesovNegativeVectorPartialSeminorm R s N defect + ≤ cubeBesovNegativeVectorSeminorm R s defect := by + unfold cubeBesovNegativeVectorSeminorm + exact le_csSup (hpartialBdd R hR) ⟨N, rfl⟩ + _ ≤ + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy)) := + coarseFluxResponse_qone_of_cubeAverageFluxResponseControl + (Q := R) (a := a) (a0 := a0) (s := s) hs + (defect := defect) (energy := energy) + (henergy_nonneg R hR) (henergy_int R hR) + (hresp R hR) (hsum R hR) + +/-- +Localized flux-defect bridge with the existing descendant canonical response +data package exposed directly. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendantScalarCanonicalFluxDefectData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (defect : Vec d → Vec d) (energy : Vec d → ℝ) (j : ℕ) + {lam0 Lam0 : ℝ} + (hs : 0 < s) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hdesc : + ∀ R ∈ descendantsAtDepth Q j, + DescendantScalarCanonicalFluxDefectData R a a0 defect energy) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N defect)) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + Real.sqrt + (descendantsAverage Q j fun R => + ((geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage R energy))) ^ 2) := + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendant_coarseFluxResponse + Q a a0 s defect energy j hs henergy_nonneg henergy_int + (fun R hR => + cubeAverageFluxResponseControl_of_descendantScalarCanonicalFluxDefectData + (Q := R) (a := a) (a0 := a0) (defect := defect) (energy := energy) + ha0 ha0symm (hdesc R hR)) + hpartialBdd hsum + +/-- Named response-average version of +`localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendant_coarseFluxResponse`. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_localizedCoarseFluxResponseAverageBound_of_descendant_coarseFluxResponse + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (defect : Vec d → Vec d) (energy : Vec d → ℝ) (j : ℕ) + (hs : 0 < s) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 defect energy) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N defect)) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + localizedCoarseFluxResponseAverageBound Q a a0 s j energy := by + simpa [localizedCoarseFluxResponseAverageBound] using + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendant_coarseFluxResponse + Q a a0 s defect energy j hs henergy_nonneg henergy_int hresp hpartialBdd hsum + +/-- Named response-average version with descendant scalar-canonical data. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_localizedCoarseFluxResponseAverageBound_of_descendantScalarCanonicalFluxDefectData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (defect : Vec d → Vec d) (energy : Vec d → ℝ) (j : ℕ) + {lam0 Lam0 : ℝ} + (hs : 0 < s) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) (ha0symm : a0.IsSymm) + (hdesc : + ∀ R ∈ descendantsAtDepth Q j, + DescendantScalarCanonicalFluxDefectData R a a0 defect energy) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N defect)) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + localizedCoarseFluxResponseAverageBound Q a a0 s j energy := by + simpa [localizedCoarseFluxResponseAverageBound] using + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_descendantScalarCanonicalFluxDefectData + Q a a0 s defect energy j hs ha0 ha0symm hdesc henergy_nonneg henergy_int + hpartialBdd hsum + +/-- The full Section 3.3.B right-hand side after applying the duality constant. -/ +noncomputable def coarseGrainingL2Rhs {d : ℕ} [NeZero d] + (Cdual : ℝ) (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) : ℝ := + Cdual * s⁻¹ * + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g + +/-- +With depth zero and zero forcing, the full Section 3.3.B RHS collapses to the +homogeneous RHS after multiplication by the duality constant. +-/ +@[simp] theorem coarseGrainingL2Rhs_depth_zero_zero_forcing {d : ℕ} [NeZero d] + (Cdual : ℝ) (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU : Vec d → Vec d) : + coarseGrainingL2Rhs Cdual Q a a0 s 0 gradU (0 : Vec d → Vec d) = + Cdual * s⁻¹ * + ((s⁻¹) * Real.sqrt (matNorm a0) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a gradU))) := by + simp [coarseGrainingL2Rhs] + +/-- +Note-facing general coarse-graining apex for +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3009--3253. + +This is Proposition `p.general.coarse.graining.p2.deterministic.theory` in the +project's modular form. The displayed PDE equations for `u` and `v` are +represented by the equivalent weak comparison predicate +`IsHomogenizationComparisonPairOn`; the local Section-3.2.3 operator estimate +is represented by the single hypothesis `hcoarseFluxDefect`. No quantitative +uniform ellipticity constants appear in the conclusion. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + subst a0 + calc + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV + ≤ Cdual * + s⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll hcomparison + _ ≤ Cdual * s⁻¹ * + coarseGrainingL2FluxDefectBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g := by + exact mul_le_mul_of_nonneg_left hcoarseFluxDefect + (mul_nonneg hdual.1 (inv_nonneg.mpr hs_pos.le)) + _ = coarseGrainingL2Rhs Cdual Q a (scalarMatrix (d := d) sigma0) s j gradU g := rfl + +/-- +Constant-envelope version of +`solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le`. + +This is the form needed when the local flux-defect theorem supplies a +dimension-only multiple of the displayed Section 3.3.B flux-defect RHS. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_mul_const_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual K : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + K * coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs (Cdual * K) Q a a0 s j gradU g := by + subst a0 + calc + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV + ≤ Cdual * + s⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll hcomparison + _ ≤ Cdual * s⁻¹ * + (K * coarseGrainingL2FluxDefectBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g) := by + exact mul_le_mul_of_nonneg_left hcoarseFluxDefect + (mul_nonneg hdual.1 (inv_nonneg.mpr hs_pos.le)) + _ = + coarseGrainingL2Rhs (Cdual * K) Q a + (scalarMatrix (d := d) sigma0) s j gradU g := by + simp [coarseGrainingL2Rhs] + ring + +/-- +General coarse-graining comparison with a caller-supplied scalar upper bound +for the Section 3.3.B flux-defect RHS. + +This is a downstream-friendly reformulation of manuscript lines 3009--3253: +once the local coarse flux-defect estimate gives the note RHS and the caller +has bounded that RHS by `coarseGrainingBound`, the comparison estimate is +immediate with the same dimension-only duality constant. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_coarseGrainingBound_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s coarseGrainingBound : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hcoarseGrainingBound : + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g ≤ coarseGrainingBound) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + Cdual * s⁻¹ * coarseGrainingBound := + by + subst a0 + exact + solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_localizedFluxDefect_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll hcomparison + (hcoarseFluxDefect.trans hcoarseGrainingBound) + +/-- +Note-facing general coarse-graining apex with the manuscript PDE hypotheses +exposed directly. + +This is Proposition `p.general.coarse.graining.p2.deterministic.theory`, +manuscript lines 3009--3253. The equations +`-div(a∇u)=div g` and `-div(a₀∇v)=div g` are represented by the `H¹` weak +solution predicates below, while the boundary condition is the zero-trace +potentiality of `∇u - ∇v`. The local Section-3.2.3 flux-defect estimate still +enters as the single quantitative hypothesis `hcoarseFluxDefect`. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := by + subst a0 + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le + hdual Q a (scalarMatrix (d := d) sigma0) sigma0 u.grad v.grad g j + hsigma0 rfl hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + hcoarseFluxDefect + +/-- +Same-right-hand-side version with a caller-supplied nonnegative constant in the +local flux-defect bound. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_mul_const_of_sameRhs_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual K : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) j ≤ + K * coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs (Cdual * K) Q a a0 s j u.grad g := by + subst a0 + exact + solution_diff_l2_le_coarseGrainingL2Rhs_mul_const_of_coarseFluxDefect_le + hdual Q a (scalarMatrix (d := d) sigma0) sigma0 u.grad v.grad g j + hsigma0 rfl hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + hcoarseFluxDefect + +/-- +Same-right-hand-side general coarse-graining comparison with a caller-supplied +scalar upper bound for the Section 3.3.B flux-defect RHS. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_coarseGrainingBound_of_sameRhs_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + {s coarseGrainingBound : ℝ} (j : ℕ) {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) + (hcoarseGrainingBound : + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g ≤ coarseGrainingBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + Cdual * s⁻¹ * coarseGrainingBound := + by + subst a0 + exact + solution_diff_l2_le_dualityConstant_mul_coarseGrainingBound_of_coarseFluxDefect_le + hdual Q a (scalarMatrix (d := d) sigma0) sigma0 u.grad v.grad g j + hsigma0 rfl hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + hcoarseFluxDefect hcoarseGrainingBound + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSCoefficientLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSCoefficientLocalization.lean new file mode 100644 index 0000000000..9dc6cf15d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSCoefficientLocalization.lean @@ -0,0 +1,1131 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2RHSComparison +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity + +/-! # Coarse Graining L2RHSCoefficient Localization -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +private theorem lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s : ℝ} {j : ℕ} + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + have hbase : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + simpa [htoNat] using + (multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) + a (s / 2) 2 (by nlinarith) (by norm_num) hRscale hsumSigma) + simpa [show 2 * (s / 2) * (j : ℝ) = s * (j : ℝ) by ring] using hbase + +private theorem sqrt_lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s : ℝ} {j : ℕ} + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) ≤ + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + have hlambda := + lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs hR hsumSigma + have hlambdaQ_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith)) + have hfactor_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hfactor_sq : + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + calc + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) ^ 2 + = Real.rpow (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) (((s / 2) * (j : ℝ)) * 2) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + ((s / 2) * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + ring + calc + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) + ≤ Real.sqrt + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := + Real.sqrt_le_sqrt hlambda + _ = Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + rw [← hfactor_sq] + rw [Real.sqrt_mul (sq_nonneg _), Real.sqrt_sq hfactor_nonneg] + +private theorem sqrt_LambdaSq_half_two_le_parent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) {s : ℝ} {j : ℕ} + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) ≤ + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) := by + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + have hbase : + LambdaSq R (s / 2) (.finite 2) a ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := by + have hraw := + (multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) + a (s / 2) 2 (by nlinarith) (by norm_num) hRscale hsumB) + simpa [htoNat, show 2 * (s / 2) * (j : ℝ) = s * (j : ℝ) by ring] using hraw + have hLambdaQ_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hfactor_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hfactor_sq : + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + calc + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) ^ 2 + = Real.rpow (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) (((s / 2) * (j : ℝ)) * 2) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + ((s / 2) * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + ring + calc + Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) + ≤ Real.sqrt + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a) := + Real.sqrt_le_sqrt hbase + _ = Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) := by + rw [← hfactor_sq] + rw [Real.sqrt_mul (sq_nonneg _), Real.sqrt_sq hfactor_nonneg] + +/-- +Pointwise descendant-to-parent coefficient localization for the §3.2.4 +homogeneous response-correction component. +-/ +theorem coarseFluxResponseRHSResponseCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) (a0 : Mat d) + {s : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) * + cubeBesovPositiveVectorSeminormTwo R s g := by + let B : ℝ := cubeBesovPositiveVectorSeminormTwo R s g + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s g hgBddR + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hmat_sqrt_nonneg : 0 ≤ Real.sqrt (matNorm a0) := Real.sqrt_nonneg _ + have herror_nonneg : + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 := + homogenizationErrorOnCube_infinity_one_nonneg R a a0 hs.le + have hparent_error_nonneg : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le + have herror_le : + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR + have hlambda_sqrt : + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) ≤ + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := + sqrt_lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs.le hR hsumSigma + have hparent_lambda_sqrt_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := + mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg _) + have hinner : + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + mul_le_mul hlambda_sqrt herror_le herror_nonneg hparent_lambda_sqrt_nonneg + have hcoef : + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + (Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + ((Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) := by + exact mul_le_mul_of_nonneg_left hinner + (mul_nonneg hs_rpow_nonneg hmat_sqrt_nonneg) + calc + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + = + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + (Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) * + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0)) * B := by + unfold coarseFluxResponseRHSResponseCorrectionBound + dsimp [B] + ring_nf + _ ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + ((Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j)) * B := by + exact mul_le_mul_of_nonneg_right hcoef hB_nonneg + _ = + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) * B := by + ring + +/-- +Pointwise descendant-to-parent coefficient localization for the §3.2.4 +weak-flux correction component. +-/ +theorem coarseFluxResponseRHSWeakFluxCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) + {s : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeBesovPositiveVectorSeminormTwo R s g := by + let B : ℝ := cubeBesovPositiveVectorSeminormTwo R s g + let factor : ℝ := Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s g hgBddR + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hfactor_nonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hfactor_sq : + factor ^ 2 = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + dsimp [factor] + calc + (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) ^ 2 + = Real.rpow (Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) (((s / 2) * (j : ℝ)) * 2) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + ((s / 2) * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + ring + have hLambda_sqrt : + Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) ≤ + factor * Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) := by + simpa [factor] using + sqrt_LambdaSq_half_two_le_parent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs.le hR hsumB + have hlambda_sqrt : + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) ≤ + factor * Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + simpa [factor] using + sqrt_lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs.le hR hsumSigma + have hparent_Lambda_nonneg : + 0 ≤ factor * Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) := + mul_nonneg hfactor_nonneg (Real.sqrt_nonneg _) + have hlambda_local_nonneg : + 0 ≤ Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) := + Real.sqrt_nonneg _ + have hinner : + Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹) ≤ + (factor * Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a)) * + (factor * Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) := + mul_le_mul hLambda_sqrt hlambda_sqrt hlambda_local_nonneg hparent_Lambda_nonneg + have hcoef : + Real.rpow s (-(5 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹)) ≤ + Real.rpow s (-(5 / 2 : ℝ)) * + ((factor * Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a)) * + (factor * Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹))) := by + exact mul_le_mul_of_nonneg_left hinner hs_rpow_nonneg + calc + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + = + (Real.rpow s (-(5 / 2 : ℝ)) * + (Real.sqrt (LambdaSq R (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq R (s / 2) (.finite 2) a)⁻¹))) * B := by + unfold coarseFluxResponseRHSWeakFluxCorrectionBound + dsimp [B] + ring_nf + _ ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * + ((factor * Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a)) * + (factor * Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)))) * B := by + exact mul_le_mul_of_nonneg_right hcoef hB_nonneg + _ = + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * B := by + rw [← hfactor_sq] + ring + +/-- +Pointwise descendant-to-parent coefficient localization for the §3.2.4 +Poincare correction component. +-/ +theorem coarseFluxResponseRHSPoincareCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) (a0 : Mat d) + {s : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo R s g := by + let B : ℝ := cubeBesovPositiveVectorSeminormTwo R s g + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove R s g hgBddR + have hs_rpow_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hmat_nonneg : 0 ≤ matNorm a0 := matNorm_nonneg a0 + have hlambda : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + lambdaSq_half_two_inv_le_parent_of_mem_descendantsAtDepth + a hs.le hR hsumSigma + have hcoef : + Real.rpow s (-3 : ℝ) * matNorm a0 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow s (-3 : ℝ) * matNorm a0 * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := by + exact mul_le_mul_of_nonneg_left hlambda + (mul_nonneg hs_rpow_nonneg hmat_nonneg) + calc + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g + = + (Real.rpow s (-3 : ℝ) * matNorm a0 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹) * B := by + unfold coarseFluxResponseRHSPoincareCorrectionBound + simp [B] + _ ≤ + (Real.rpow s (-3 : ℝ) * matNorm a0 * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * B := by + exact mul_le_mul_of_nonneg_right hcoef hB_nonneg + _ = + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * B := by + ring + +/-- +Two-exponent descendant-to-parent coefficient localization for the response +correction component. The local flux-response exponent is `s`, while the +force is measured at the stronger positive exponent `t`. +-/ +theorem coarseFluxResponseRHSResponseCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hst : s ≤ t) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) * + cubeBesovPositiveVectorSeminormTwo R t g := by + let C : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + have hgBddR_s : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + R g hst hgBddR + have hbase : + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g := by + simpa [C] using + coarseFluxResponseRHSResponseCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hR hgBddR_s hsumSigma + have hmono : + cubeBesovPositiveVectorSeminormTwo R s g ≤ + cubeBesovPositiveVectorSeminormTwo R t g := + cubeBesovPositiveVectorSeminormTwo_le_of_exponent_le_of_bddAbove + R g hst hgBddR + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) (Real.sqrt_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.sqrt_nonneg _)) + (coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le) + exact hbase.trans (mul_le_mul_of_nonneg_left hmono hC_nonneg) + +/-- +Two-exponent descendant-to-parent coefficient localization for the weak-flux +correction component. +-/ +theorem coarseFluxResponseRHSWeakFluxCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) + {s t : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hst : s ≤ t) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeBesovPositiveVectorSeminormTwo R t g := by + let C : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + have hgBddR_s : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + R g hst hgBddR + have hbase : + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g := by + simpa [C] using + coarseFluxResponseRHSWeakFluxCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a g hs hR hgBddR_s hsumB hsumSigma + have hmono : + cubeBesovPositiveVectorSeminormTwo R s g ≤ + cubeBesovPositiveVectorSeminormTwo R t g := + cubeBesovPositiveVectorSeminormTwo_le_of_exponent_le_of_bddAbove + R g hst hgBddR + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.sqrt_nonneg _)) + (Real.sqrt_nonneg _) + exact hbase.trans (mul_le_mul_of_nonneg_left hmono hC_nonneg) + +/-- +Two-exponent descendant-to-parent coefficient localization for the Poincare +correction component. +-/ +theorem coarseFluxResponseRHSPoincareCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} {j : ℕ} (g : Vec d → Vec d) + (hs : 0 < s) (hst : s ≤ t) (hR : R ∈ descendantsAtDepth Q j) + (hgBddR : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo R t g := by + let C : ℝ := + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + have hgBddR_s : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + R g hst hgBddR + have hbase : + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g := by + simpa [C] using + coarseFluxResponseRHSPoincareCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hR hgBddR_s hsumSigma + have hmono : + cubeBesovPositiveVectorSeminormTwo R s g ≤ + cubeBesovPositiveVectorSeminormTwo R t g := + cubeBesovPositiveVectorSeminormTwo_le_of_exponent_le_of_bddAbove + R g hst hgBddR + have hlambda_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith)) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (matNorm_nonneg a0)) + hlambda_nonneg + exact hbase.trans (mul_le_mul_of_nonneg_left hmono hC_nonneg) + +/-- +Localized forcing correction absorbed into the §3.3.B forcing term, with the +three pointwise coefficient localizations discharged from descendant +multiscale-ellipticity summability. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_bddAbove_of_summable + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_pointwise_parent_coeff_bounds_of_bddAbove + Q a a0 j g hs hgBdd hgBdd_desc + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hR (hgBdd_desc R hR) hsumSigma) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a g hs hR (hgBdd_desc R hR) hsumB hsumSigma) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_le_parent_coeff_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hR (hgBdd_desc R hR) hsumSigma) + +/-- +Two-exponent localized forcing correction with parent coefficient localization +and the inverse force-depth weight kept visible. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_parent_coeff_mul_depthWeight_inv_forceExponent_of_bddAbove_of_summable + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} (j : ℕ) (g : Vec d → Vec d) + (hs : 0 < s) (hst : s ≤ t) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + ((Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) + + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) + + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + ((Real.rpow (3 : ℝ) (t * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q t g) := by + let C₁ : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let C₂ : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + let C₃ : ℝ := + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + have hC₁_nonneg : 0 ≤ C₁ := by + dsimp [C₁] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) (Real.sqrt_nonneg _)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.sqrt_nonneg _)) + (coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le) + have hC₂_nonneg : 0 ≤ C₂ := by + dsimp [C₂] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (Real.sqrt_nonneg _)) + (Real.sqrt_nonneg _) + have hlambda_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith)) + have hC₃_nonneg : 0 ≤ C₃ := by + dsimp [C₃] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg (Real.rpow_nonneg hs.le _) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + (matNorm_nonneg a0)) + hlambda_nonneg + have hgBdd_desc_s : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro R hR + exact + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + R g hst (hgBdd_desc R hR) + have hmain := + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_depthWeight_inv_mul_parent_forceExponent_of_pointwise_le_of_bddAbove + Q a a0 j g hC₁_nonneg hC₂_nonneg hC₃_nonneg hgBdd hgBdd_desc + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc_s R hR)) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + R a g hs (hgBdd_desc_s R hR)) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc_s R hR)) + (fun R hR => + by + simpa [C₁] using + coarseFluxResponseRHSResponseCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hst hR (hgBdd_desc R hR) + hsumSigma) + (fun R hR => + by + simpa [C₂] using + coarseFluxResponseRHSWeakFluxCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a g hs hst hR (hgBdd_desc R hR) + hsumB hsumSigma) + (fun R hR => + by + simpa [C₃] using + coarseFluxResponseRHSPoincareCorrectionBound_le_parent_coeff_forceExponent_of_mem_descendantsAtDepth + (Q := Q) (R := R) a a0 g hs hst hR (hgBdd_desc R hR) + hsumSigma) + simpa [C₁, C₂, C₃, add_assoc] using hmain + +/-- +Scalar §3.3 RHS comparison with the localized energy average and the +scale-separated two-exponent forcing correction. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBoundTwoExponent_of_bddAbove_of_isEllipticFieldOn_of_summable + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hst : s ≤ t) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBoundTwoExponent Q a a0 s t j gradU g := by + have hgBdd_desc_s : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro R hR + exact + cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le + R g hst (hgBdd_desc R hR) + have henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := + localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm_of_isEllipticFieldOn + Q a a0 j gradU hs hEll henergy_int + have hforcing : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTermTwoExponent Q a a0 s t j g := by + simpa [coarseGrainingL2FluxDefectForcingTermTwoExponent, add_assoc] using + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_parent_coeff_mul_depthWeight_inv_forceExponent_of_bddAbove_of_summable + Q a a0 j g hs hst hgBdd hgBdd_desc hsumB hsumSigma + have hmain := + localizedCoarseFluxResponseRHSBound_le_energy_add_forcing_of_component_average_bounds + Q a a0 j gradU g + (fun R _ => + coarseFluxResponseRHSEnergyBound_nonneg R a a0 gradU hs) + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc_s R hR)) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + R a g hs (hgBdd_desc_s R hR)) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc_s R hR)) + henergy hforcing + simpa [coarseGrainingL2FluxDefectBoundTwoExponent] using hmain + +/-- +Scalar §3.3 RHS comparison with the localized energy average and the three +forcing-correction coefficient localizations discharged internally. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_bddAbove_of_isEllipticFieldOn_of_summable + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_average_bounds_of_bddAbove + Q a a0 j gradU g hs hgBdd_desc + (localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm_of_isEllipticFieldOn + Q a a0 j gradU hs hEll henergy_int) + (localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_bddAbove_of_summable + Q a a0 j g hs hgBdd hgBdd_desc hsumB hsumSigma) + +/-- +§3.3 wrapper through descendant one-cube §3.2.4 RHS bounds, with the scalar +RHS comparison closed from the coefficient-localization hypotheses. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_bddAbove_of_isEllipticFieldOn_of_summable + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd hRhs + (localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_bddAbove_of_isEllipticFieldOn_of_summable + Q a a0 j gradU g hs_pos hEll henergy_int hgBdd hgBdd_desc + hsumB hsumSigma) + +/-- +§3.3 wrapper through descendant one-cube §3.2.4 RHS bounds, deriving the +raw parent/descendant positive-Besov boundedness hypotheses from the note-facing +`H^s` regularity package for the right-hand side. +-/ +private theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_cubeVectorBesovHRegularity_of_isEllipticFieldOn_of_summable + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hg : CubeVectorBesovHRegularity Q s g) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + have hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hg.partialSeminorms_bddAbove + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_bddAbove_of_isEllipticFieldOn_of_summable + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + hcomparison henergy_int hdefect_bdd hRhs hg.partialSeminorms_bddAbove + hgBdd_desc hsumB hsumSigma + +/-- +Note-facing same-RHS §3.3 wrapper through descendant one-cube §3.2.4 RHS +bounds. The energy-density integrability input is derived from the `H¹` +solution gradient and ellipticity. +-/ +private theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_descendant_coarseFluxResponseRHSBound_of_cubeVectorBesovHRegularity_of_isEllipticFieldOn_of_summable + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 u.grad))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 u.grad) ≤ + coarseFluxResponseRHSBound R a a0 s u.grad g) + (hg : CubeVectorBesovHRegularity Q s g) + (hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) + (hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2))) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := by + have henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + u.grad_memVectorL2 + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_cubeVectorBesovHRegularity_of_isEllipticFieldOn_of_summable + hdual Q a a0 sigma0 u.grad v.grad g j hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll ha0 u v g hu hv hzeroTrace) + henergy_int hdefect_bdd hRhs hg hsumB hsumSigma + +/-- +Same-RHS §3.3 wrapper deriving the half-scale coefficient summability inputs +from the descendant deterministic coarse-data package. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_descendant_coarseFluxResponseRHSBound_of_cubeVectorBesovHRegularity_of_openCubeDescendantDeterministicCoarseData + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 u.grad) ≤ + coarseFluxResponseRHSBound R a a0 s u.grad g) + (hg : CubeVectorBesovHRegularity Q s g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := by + have hs_half : 0 < s / 2 := by nlinarith + have hsumB : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2)) := by + have hsum : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa [Real.rpow_one] using hsum + have hsumSigma : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2)) := by + have hsum : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa [Real.rpow_one] using hsum + have hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 u.grad)) := by + intro R hR + have hu_grad_memR : MemVectorL2 (cubeSet R) u.grad := by + simpa [MemVectorL2, volumeMeasureOn] using + u.grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR)) + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hflux_mem : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEllR hu_grad_memR + have hEll0R : + IsEllipticFieldOn lam0 Lam0 (cubeSet R) (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_cubeSet R) ha0 + have ha0_mem : + MemVectorL2 (cubeSet R) (fun x => matVecMul a0 (u.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0R hu_grad_memR + have hdefect_mem : + MemVectorL2 (cubeSet R) (fluxDefect a a0 u.grad) := by + unfold fluxDefect + exact hflux_mem.sub ha0_mem + exact cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp R hs_pos + (fluxDefect a a0 u.grad) + (memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet R hdefect_mem) + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_descendant_coarseFluxResponseRHSBound_of_cubeVectorBesovHRegularity_of_isEllipticFieldOn_of_summable + hdual Q a a0 sigma0 u v g j hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hu hv + hzeroTrace hdefect_bdd hRhs hg hsumB hsumSigma + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSComparison.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSComparison.lean new file mode 100644 index 0000000000..2b1242ffc1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2RHSComparison.lean @@ -0,0 +1,1307 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization + +/-! # Coarse Graining L2RHSComparison -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +private theorem descendantsAverage_sqrt_add_le_of_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F G : TriadicCube d → ℝ) + (hF : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ F R) + (hG : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ G R) : + Real.sqrt (descendantsAverage Q j (fun R => (F R + G R) ^ 2)) ≤ + Real.sqrt (descendantsAverage Q j (fun R => (F R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (G R) ^ 2)) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let c : ℝ := ((D.card : ℝ)⁻¹) + have hc : 0 ≤ c := by + dsimp [c] + exact inv_nonneg.mpr (by positivity) + have hsumF_nonneg : 0 ≤ ∑ R ∈ D, (F R) ^ 2 := + Finset.sum_nonneg fun R _ => sq_nonneg _ + have hsumG_nonneg : 0 ≤ ∑ R ∈ D, (G R) ^ 2 := + Finset.sum_nonneg fun R _ => sq_nonneg _ + have hsumFG_nonneg : 0 ≤ ∑ R ∈ D, (F R + G R) ^ 2 := + Finset.sum_nonneg fun R _ => sq_nonneg _ + have hLp : + (∑ R ∈ D, (F R + G R) ^ 2) ^ (1 / 2 : ℝ) ≤ + (∑ R ∈ D, (F R) ^ 2) ^ (1 / 2 : ℝ) + + (∑ R ∈ D, (G R) ^ 2) ^ (1 / 2 : ℝ) := by + simpa using + (Real.Lp_add_le_of_nonneg + (s := D) (f := F) (g := G) (p := (2 : ℝ)) + (by norm_num) + (fun R hR => hF R (by simpa [D] using hR)) + (fun R hR => hG R (by simpa [D] using hR))) + calc + Real.sqrt (descendantsAverage Q j (fun R => (F R + G R) ^ 2)) + = + c ^ (1 / 2 : ℝ) * + (∑ R ∈ D, (F R + G R) ^ 2) ^ (1 / 2 : ℝ) := by + have hmul : + (c * ∑ R ∈ D, (F R + G R) ^ 2) ^ (1 / 2 : ℝ) = + c ^ (1 / 2 : ℝ) * + (∑ R ∈ D, (F R + G R) ^ 2) ^ (1 / 2 : ℝ) := + Real.mul_rpow hc hsumFG_nonneg + simpa [Real.sqrt_eq_rpow, descendantsAverage, D, c] using hmul + _ ≤ + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (F R) ^ 2) ^ (1 / 2 : ℝ) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (G R) ^ 2) ^ (1 / 2 : ℝ) := by + have hc_rpow : 0 ≤ c ^ (1 / 2 : ℝ) := Real.rpow_nonneg hc _ + simpa [mul_add] using mul_le_mul_of_nonneg_left hLp hc_rpow + _ = + Real.sqrt (descendantsAverage Q j (fun R => (F R) ^ 2)) + + c ^ (1 / 2 : ℝ) * (∑ R ∈ D, (G R) ^ 2) ^ (1 / 2 : ℝ) := by + rw [← Real.mul_rpow hc hsumF_nonneg] + simp [Real.sqrt_eq_rpow, descendantsAverage, D, c] + _ = + Real.sqrt (descendantsAverage Q j (fun R => (F R) ^ 2)) + + Real.sqrt (descendantsAverage Q j (fun R => (G R) ^ 2)) := by + rw [← Real.mul_rpow hc hsumG_nonneg] + simp [Real.sqrt_eq_rpow, descendantsAverage, D, c] + +private theorem sqrt_descendantsAverage_sq_le_mul_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (j : ℕ) (F B : TriadicCube d → ℝ) + {C A : ℝ} + (hC_nonneg : 0 ≤ C) (hA_nonneg : 0 ≤ A) + (hF_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ F R) + (hpoint : ∀ R ∈ descendantsAtDepth Q j, F R ≤ C * B R) + (havg : descendantsAverage Q j (fun R => (B R) ^ 2) ≤ A ^ 2) : + Real.sqrt (descendantsAverage Q j fun R => (F R) ^ 2) ≤ C * A := by + have hsq : + descendantsAverage Q j (fun R => (F R) ^ 2) ≤ + descendantsAverage Q j (fun R => (C * B R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ (hF_nonneg R hR) (hpoint R hR) 2 + have hscaled : + descendantsAverage Q j (fun R => (C * B R) ^ 2) = + C ^ 2 * descendantsAverage Q j (fun R => (B R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (C * B R) ^ 2) + = descendantsAverage Q j (fun R => C ^ 2 * (B R) ^ 2) := by + apply congrArg (descendantsAverage Q j) + funext R + ring + _ = C ^ 2 * descendantsAverage Q j (fun R => (B R) ^ 2) := + descendantsAverage_mul_left Q j (C ^ 2) (fun R => (B R) ^ 2) + have hinside : + descendantsAverage Q j (fun R => (F R) ^ 2) ≤ C ^ 2 * A ^ 2 := by + calc + descendantsAverage Q j (fun R => (F R) ^ 2) + ≤ descendantsAverage Q j (fun R => (C * B R) ^ 2) := hsq + _ = C ^ 2 * descendantsAverage Q j (fun R => (B R) ^ 2) := hscaled + _ ≤ C ^ 2 * A ^ 2 := + mul_le_mul_of_nonneg_left havg (sq_nonneg C) + calc + Real.sqrt (descendantsAverage Q j fun R => (F R) ^ 2) + ≤ Real.sqrt (C ^ 2 * A ^ 2) := Real.sqrt_le_sqrt hinside + _ = C * A := by + rw [show C ^ 2 * A ^ 2 = (C * A) ^ 2 by ring, + Real.sqrt_sq (mul_nonneg hC_nonneg hA_nonneg)] + +/-- Localized descendant `L²` average of the §3.2.4 energy component. -/ +noncomputable def localizedCoarseFluxResponseRHSEnergyBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2) + +/-- Localized descendant `L²` average of the §3.2.4 response correction. -/ +noncomputable def localizedCoarseFluxResponseRHSResponseCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (g : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) ^ 2) + +/-- Localized descendant `L²` average of the §3.2.4 weak-flux correction. -/ +noncomputable def localizedCoarseFluxResponseRHSWeakFluxCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (j : ℕ) (g : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) ^ 2) + +/-- Localized descendant `L²` average of the §3.2.4 Poincare correction. -/ +noncomputable def localizedCoarseFluxResponseRHSPoincareCorrectionBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (g : Vec d → Vec d) : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) ^ 2) + +/-- +The localized `L²` average of the §3.2.4 RHS energy component is controlled +by the parent-cube energy term in the §3.3.B flux-defect RHS. +-/ +theorem localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU : Vec d → Vec d) + (hs : 0 < s) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (henergy_avg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ cubeAverage R (coefficientEnergyDensity a gradU)) : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := by + let energy : Vec d → ℝ := coefficientEnergyDensity a gradU + let E : ℝ := coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let C : ℝ := s⁻¹ * Real.sqrt (matNorm a0) * E + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hsqrt_mat_nonneg : 0 ≤ Real.sqrt (matNorm a0) := Real.sqrt_nonneg _ + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (mul_nonneg hs_inv_nonneg hsqrt_mat_nonneg) hE_nonneg + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2 ≤ + C ^ 2 * cubeAverage R energy := by + intro R hR + let ER : ℝ := HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 + have hER_nonneg : 0 ≤ ER := by + dsimp [ER] + exact homogenizationErrorOnCube_infinity_one_nonneg R a a0 hs.le + have hER_le : ER ≤ E := by + dsimp [ER, E] + exact homogenizationErrorOnCube_le_coarseGrainingHomogenizationErrorAtDepth hR + have hA_nonneg : 0 ≤ cubeAverage R energy := + henergy_avg_nonneg R hR + have hsqrtA_nonneg : 0 ≤ Real.sqrt (cubeAverage R energy) := + Real.sqrt_nonneg _ + have hbase_nonneg : 0 ≤ s⁻¹ * Real.sqrt (matNorm a0) * ER := + mul_nonneg (mul_nonneg hs_inv_nonneg hsqrt_mat_nonneg) hER_nonneg + have hbase_le : s⁻¹ * Real.sqrt (matNorm a0) * ER ≤ C := by + have hleft : + s⁻¹ * Real.sqrt (matNorm a0) * ER ≤ + s⁻¹ * Real.sqrt (matNorm a0) * E := by + exact mul_le_mul_of_nonneg_left hER_le + (mul_nonneg hs_inv_nonneg hsqrt_mat_nonneg) + simpa [C] using hleft + have hterm_nonneg : + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU := + coarseFluxResponseRHSEnergyBound_nonneg R a a0 gradU hs + have hterm_le : + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + C * Real.sqrt (cubeAverage R energy) := by + calc + coarseFluxResponseRHSEnergyBound R a a0 s gradU + = + (s⁻¹ * Real.sqrt (matNorm a0) * ER) * + Real.sqrt (cubeAverage R energy) := by + unfold coarseFluxResponseRHSEnergyBound + simp [ER, energy] + _ ≤ C * Real.sqrt (cubeAverage R energy) := by + exact mul_le_mul_of_nonneg_right hbase_le hsqrtA_nonneg + have hsquare := pow_le_pow_left₀ hterm_nonneg hterm_le 2 + calc + (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2 + ≤ (C * Real.sqrt (cubeAverage R energy)) ^ 2 := hsquare + _ = C ^ 2 * cubeAverage R energy := by + rw [mul_pow, Real.sq_sqrt hA_nonneg] + have havg_sq : + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2) ≤ + descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact hpoint R hR + have hconst : + descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) = + C ^ 2 * descendantsAverage Q j (fun R => cubeAverage R energy) := + descendantsAverage_mul_left Q j (C ^ 2) (fun R => cubeAverage R energy) + have havg_eq : + descendantsAverage Q j (fun R => cubeAverage R energy) = + cubeAverage Q energy := by + symm + exact cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q j energy henergy_int + have hinside : + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2) ≤ + C ^ 2 * cubeAverage Q energy := by + calc + descendantsAverage Q j + (fun R => (coarseFluxResponseRHSEnergyBound R a a0 s gradU) ^ 2) + ≤ descendantsAverage Q j (fun R => C ^ 2 * cubeAverage R energy) := + havg_sq + _ = C ^ 2 * descendantsAverage Q j (fun R => cubeAverage R energy) := + hconst + _ = C ^ 2 * cubeAverage Q energy := by rw [havg_eq] + calc + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU + ≤ Real.sqrt (C ^ 2 * cubeAverage Q energy) := by + exact Real.sqrt_le_sqrt hinside + _ = C * Real.sqrt (cubeAverage Q energy) := by + rw [Real.sqrt_mul (sq_nonneg C), Real.sqrt_sq hC_nonneg] + _ = coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := by + simp [coarseGrainingL2FluxDefectEnergyTerm, C, E, energy] + +/-- +Ellipticity-facing version of +`localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm`. +-/ +theorem localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm_of_isEllipticFieldOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := + localizedCoarseFluxResponseRHSEnergyBound_le_coarseGrainingL2FluxDefectEnergyTerm + Q a a0 j gradU hs henergy_int + (fun R hR => + cubeAverage_nonneg_of_nonneg_on (Q := R) + (fun x hx => + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll gradU x + (cubeSet_subset_of_mem_descendantsAtDepth hR hx))) + +/-- +Square-average wrapper for the localized response-correction component. The +analytic inputs are a pointwise coefficient bound and the parent-scale +localized positive-Besov square estimate. +-/ +theorem localizedCoarseFluxResponseRHSResponseCorrectionBound_le_mul_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) {C A : ℝ} + (hC_nonneg : 0 ≤ C) (hA_nonneg : 0 ≤ A) + (hcomponent_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g) + (havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + A ^ 2) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g ≤ + C * A := by + simpa [localizedCoarseFluxResponseRHSResponseCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R s g) + hC_nonneg hA_nonneg hcomponent_nonneg hpoint havg + +/-- +Square-average wrapper for the localized weak-flux correction component. +-/ +theorem localizedCoarseFluxResponseRHSWeakFluxCorrectionBound_le_mul_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) {C A : ℝ} + (hC_nonneg : 0 ≤ C) (hA_nonneg : 0 ≤ A) + (hcomponent_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g) + (havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + A ^ 2) : + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g ≤ + C * A := by + simpa [localizedCoarseFluxResponseRHSWeakFluxCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R s g) + hC_nonneg hA_nonneg hcomponent_nonneg hpoint havg + +/-- +Square-average wrapper for the localized Poincare correction component. +-/ +theorem localizedCoarseFluxResponseRHSPoincareCorrectionBound_le_mul_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) {C A : ℝ} + (hC_nonneg : 0 ≤ C) (hA_nonneg : 0 ≤ A) + (hcomponent_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C * cubeBesovPositiveVectorSeminormTwo R s g) + (havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + A ^ 2) : + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + C * A := by + simpa [localizedCoarseFluxResponseRHSPoincareCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R s g) + hC_nonneg hA_nonneg hcomponent_nonneg hpoint havg + +/-- +Component-average forcing correction bound with the descendant-localized +positive-Besov forcing norm kept visible. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_localizedPositiveBesovForcing_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) {C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R s g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * + localizedPositiveBesovForcingSeminormTwoAtDepth Q s j g := by + let A : ℝ := localizedPositiveBesovForcingSeminormTwoAtDepth Q s j g + have hA_nonneg : 0 ≤ A := by + dsimp [A, localizedPositiveBesovForcingSeminormTwoAtDepth] + exact Real.sqrt_nonneg _ + have havg_nonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := + descendantsAverage_nonneg Q j _ + (fun R _ => sq_nonneg (cubeBesovPositiveVectorSeminormTwo R s g)) + have havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + A ^ 2 := by + dsimp [A, localizedPositiveBesovForcingSeminormTwoAtDepth] + rw [Real.sq_sqrt havg_nonneg] + have hresponse : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g ≤ + C₁ * A := by + exact + localizedCoarseFluxResponseRHSResponseCorrectionBound_le_mul_of_pointwise_le + Q a a0 j g hC₁_nonneg hA_nonneg hresponse_nonneg + hresponse_point havg + have hweak : + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g ≤ + C₂ * A := by + exact + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound_le_mul_of_pointwise_le + Q a j g hC₂_nonneg hA_nonneg hweak_nonneg hweak_point havg + have hpoincare : + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + C₃ * A := by + exact + localizedCoarseFluxResponseRHSPoincareCorrectionBound_le_mul_of_pointwise_le + Q a a0 j g hC₃_nonneg hA_nonneg hpoincare_nonneg + hpoincare_point havg + calc + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g + ≤ C₁ * A + C₂ * A + C₃ * A := by + linarith + _ = (C₁ + C₂ + C₃) * A := by ring + +/-- +Component-average forcing correction bound with the inverse depth weight +exposed after applying positive-Besov localization. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_depthWeight_inv_mul_parent_of_pointwise_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) {C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R s g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g) := by + let A : ℝ := localizedPositiveBesovForcingSeminormTwoAtDepth Q s j g + have hcoeff_nonneg : 0 ≤ C₁ + C₂ + C₃ := by + linarith + have hlocal : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * A := + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_localizedPositiveBesovForcing_of_pointwise_le + Q a a0 j g hC₁_nonneg hC₂_nonneg hC₃_nonneg hresponse_nonneg + hweak_nonneg hpoincare_nonneg hresponse_point hweak_point + hpoincare_point + have hA : + A ≤ + (Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g := by + dsimp [A] + exact + localizedPositiveBesovForcingSeminormTwoAtDepth_le_depthWeight_inv_mul_parent_of_bddAbove + Q g s j hGlobalBdd hLocalBdd + exact hlocal.trans (mul_le_mul_of_nonneg_left hA hcoeff_nonneg) + +/-- +Two-exponent component-average forcing correction bound. The flux-response +components are evaluated at exponent `s`, while the force is measured in the +stronger positive-Besov seminorm at exponent `t`. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_localizedPositiveBesovForcing_forceExponent_of_pointwise_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} (j : ℕ) (g : Vec d → Vec d) {C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R t g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R t g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R t g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * + localizedPositiveBesovForcingSeminormTwoAtDepth Q t j g := by + let A : ℝ := localizedPositiveBesovForcingSeminormTwoAtDepth Q t j g + have hA_nonneg : 0 ≤ A := by + dsimp [A, localizedPositiveBesovForcingSeminormTwoAtDepth] + exact Real.sqrt_nonneg _ + have havg_nonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R t g) ^ 2) := + descendantsAverage_nonneg Q j _ + (fun R _ => sq_nonneg (cubeBesovPositiveVectorSeminormTwo R t g)) + have havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R t g) ^ 2) ≤ + A ^ 2 := by + dsimp [A, localizedPositiveBesovForcingSeminormTwoAtDepth] + rw [Real.sq_sqrt havg_nonneg] + have hresponse : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g ≤ + C₁ * A := by + simpa [localizedCoarseFluxResponseRHSResponseCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R t g) + hC₁_nonneg hA_nonneg hresponse_nonneg hresponse_point havg + have hweak : + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g ≤ + C₂ * A := by + simpa [localizedCoarseFluxResponseRHSWeakFluxCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R t g) + hC₂_nonneg hA_nonneg hweak_nonneg hweak_point havg + have hpoincare : + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + C₃ * A := by + simpa [localizedCoarseFluxResponseRHSPoincareCorrectionBound] using + sqrt_descendantsAverage_sq_le_mul_of_pointwise_le Q j + (fun R => coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (fun R => cubeBesovPositiveVectorSeminormTwo R t g) + hC₃_nonneg hA_nonneg hpoincare_nonneg hpoincare_point havg + calc + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g + ≤ C₁ * A + C₂ * A + C₃ * A := by + linarith + _ = (C₁ + C₂ + C₃) * A := by ring + +/-- +Two-exponent component-average forcing correction bound with the inverse +depth weight exposed at the force exponent. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_depthWeight_inv_mul_parent_forceExponent_of_pointwise_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} (j : ℕ) (g : Vec d → Vec d) {C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R t g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R t g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R t g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (t * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q t g) := by + let A : ℝ := localizedPositiveBesovForcingSeminormTwoAtDepth Q t j g + have hcoeff_nonneg : 0 ≤ C₁ + C₂ + C₃ := by + linarith + have hlocal : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + (C₁ + C₂ + C₃) * A := + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_localizedPositiveBesovForcing_forceExponent_of_pointwise_le + Q a a0 j g hC₁_nonneg hC₂_nonneg hC₃_nonneg hresponse_nonneg + hweak_nonneg hpoincare_nonneg hresponse_point hweak_point + hpoincare_point + have hA : + A ≤ + (Real.rpow (3 : ℝ) (t * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q t g := by + dsimp [A] + exact + localizedPositiveBesovForcingSeminormTwoAtDepth_le_depthWeight_inv_mul_parent_of_bddAbove + Q g t j hGlobalBdd hLocalBdd + exact hlocal.trans (mul_le_mul_of_nonneg_left hA hcoeff_nonneg) + +/-- +The three localized forcing-correction averages are absorbed by the §3.3.B +forcing term once their pointwise descendant coefficients are bounded by the +corresponding parent coefficients and the local positive-Besov squares average +back to the parent seminorm. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_pointwise_parent_coeff_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) + (hs : 0 < s) + (hB_nonneg : 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s g) + (havg : + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) * + cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo R s g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := by + let C₁ : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j + let C₂ : ℝ := + Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + let C₃ : ℝ := + Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + have hE_nonneg : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le + have hLambda_nonneg : + 0 ≤ LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith) + have hs_rpow_five_half_nonneg : 0 ≤ Real.rpow s (-(5 / 2 : ℝ)) := + Real.rpow_nonneg hs.le _ + have hs_rpow_three_nonneg : 0 ≤ Real.rpow s (-3 : ℝ) := + Real.rpow_nonneg hs.le _ + have hpow_half_nonneg : + 0 ≤ Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hpow_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hlambda_inv_sqrt_nonneg : + 0 ≤ Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) := + Real.sqrt_nonneg _ + have hC₁_nonneg : 0 ≤ C₁ := by + dsimp [C₁] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_five_half_nonneg (Real.sqrt_nonneg _)) + hpow_half_nonneg) + hlambda_inv_sqrt_nonneg) + hE_nonneg + have hC₂_nonneg : 0 ≤ C₂ := by + dsimp [C₂] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_five_half_nonneg hpow_nonneg) + (Real.sqrt_nonneg _)) + hlambda_inv_sqrt_nonneg + have hC₃_nonneg : 0 ≤ C₃ := by + dsimp [C₃] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_rpow_three_nonneg hpow_nonneg) + (matNorm_nonneg a0)) + hlambda_inv_nonneg + have hresponse : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo Q s g := by + exact + localizedCoarseFluxResponseRHSResponseCorrectionBound_le_mul_of_pointwise_le + Q a a0 j g hC₁_nonneg hB_nonneg hresponse_nonneg + (by simpa [C₁] using hresponse_point) havg + have hweak : + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo Q s g := by + exact + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound_le_mul_of_pointwise_le + Q a j g hC₂_nonneg hB_nonneg hweak_nonneg + (by simpa [C₂] using hweak_point) havg + have hpoincare : + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo Q s g := by + exact + localizedCoarseFluxResponseRHSPoincareCorrectionBound_le_mul_of_pointwise_le + Q a a0 j g hC₃_nonneg hB_nonneg hpoincare_nonneg + (by simpa [C₃] using hpoincare_point) havg + calc + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g + ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo Q s g + + C₂ * cubeBesovPositiveVectorSeminormTwo Q s g + + C₃ * cubeBesovPositiveVectorSeminormTwo Q s g := by + linarith + _ = coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := by + simp [coarseGrainingL2FluxDefectForcingTerm, C₁, C₂, C₃] + ring + +/-- +Bounded-positive-Besov version of +`localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_pointwise_parent_coeff_bounds`. +-/ +theorem localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_pointwise_parent_coeff_bounds_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * Real.sqrt (matNorm a0) * + Real.rpow (3 : ℝ) ((s / 2) * (j : ℝ)) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + coarseGrainingHomogenizationErrorAtDepth Q a a0 s j) * + cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + (Real.rpow s (-(5 / 2 : ℝ)) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (LambdaSq Q (s / 2) (.finite 2) a) * + Real.sqrt ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹)) * + cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + (Real.rpow s (-3 : ℝ) * + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + matNorm a0 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) * + cubeBesovPositiveVectorSeminormTwo R s g) : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coarseGrainingL2FluxDefectForcingTerm_of_pointwise_parent_coeff_bounds + Q a a0 j g hs + (cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hgBdd) + (descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_parent_of_bddAbove + Q g j hs.le hgBdd hgBdd_desc) + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc R hR)) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + R a g hs (hgBdd_desc R hR)) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd_desc R hR)) + hresponse_point hweak_point hpoincare_point + +/-- +Minkowski split of the localized one-cube §3.2.4 RHS average into its four +component averages. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_component_average_sum + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU + + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g := by + let E : TriadicCube d → ℝ := fun R => + coarseFluxResponseRHSEnergyBound R a a0 s gradU + let C₁ : TriadicCube d → ℝ := fun R => + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + let C₂ : TriadicCube d → ℝ := fun R => + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + let C₃ : TriadicCube d → ℝ := fun R => + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g + have hRhs_eq : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g = + Real.sqrt (descendantsAverage Q j fun R => (E R + (C₁ R + (C₂ R + C₃ R))) ^ 2) := by + unfold localizedCoarseFluxResponseRHSBound + apply congrArg Real.sqrt + apply congrArg (descendantsAverage Q j) + funext R + rw [coarseFluxResponseRHSBound_eq_component_sum] + ring + have htail_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ C₁ R + (C₂ R + C₃ R) := by + intro R hR + exact add_nonneg (hresponse_nonneg R hR) + (add_nonneg (hweak_nonneg R hR) (hpoincare_nonneg R hR)) + have htail₂_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ C₂ R + C₃ R := by + intro R hR + exact add_nonneg (hweak_nonneg R hR) (hpoincare_nonneg R hR) + have hmain : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU + + Real.sqrt (descendantsAverage Q j fun R => (C₁ R + (C₂ R + C₃ R)) ^ 2) := by + rw [hRhs_eq] + simpa [localizedCoarseFluxResponseRHSEnergyBound, E] using + descendantsAverage_sqrt_add_le_of_nonneg Q j E + (fun R => C₁ R + (C₂ R + C₃ R)) + (by intro R hR; exact henergy_nonneg R hR) htail_nonneg + have htail : + Real.sqrt (descendantsAverage Q j fun R => (C₁ R + (C₂ R + C₃ R)) ^ 2) ≤ + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + Real.sqrt (descendantsAverage Q j fun R => (C₂ R + C₃ R) ^ 2) := by + simpa [localizedCoarseFluxResponseRHSResponseCorrectionBound, C₁] using + descendantsAverage_sqrt_add_le_of_nonneg Q j C₁ (fun R => C₂ R + C₃ R) + (by intro R hR; exact hresponse_nonneg R hR) htail₂_nonneg + have htail₂ : + Real.sqrt (descendantsAverage Q j fun R => (C₂ R + C₃ R) ^ 2) ≤ + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g := by + simpa [localizedCoarseFluxResponseRHSWeakFluxCorrectionBound, + localizedCoarseFluxResponseRHSPoincareCorrectionBound, C₂, C₃] using + descendantsAverage_sqrt_add_le_of_nonneg Q j C₂ C₃ + (by intro R hR; exact hweak_nonneg R hR) + (by intro R hR; exact hpoincare_nonneg R hR) + linarith + +/-- +Generic recomposition of the localized one-cube RHS average from an energy +bound and a forcing-correction bound. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_energy_add_forcing_of_component_average_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {E F : ℝ} + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ E) + (hforcing : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ F) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ E + F := by + have hsplit := + localizedCoarseFluxResponseRHSBound_le_component_average_sum + Q a a0 j gradU g henergy_nonneg hresponse_nonneg hweak_nonneg + hpoincare_nonneg + linarith + +/-- +Scale-sharp localized RHS comparison with an arbitrary nonnegative descendant +coefficient envelope for the three forcing correction components. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_energy_add_coeffSum_mul_depthWeight_inv_mul_parent_of_pointwise_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {E C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ E) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R s g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + E + + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g) := by + refine + localizedCoarseFluxResponseRHSBound_le_energy_add_forcing_of_component_average_bounds + Q a a0 j gradU g henergy_nonneg hresponse_nonneg hweak_nonneg + hpoincare_nonneg henergy ?_ + exact + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_depthWeight_inv_mul_parent_of_pointwise_le_of_bddAbove + Q a a0 j g hC₁_nonneg hC₂_nonneg hC₃_nonneg hGlobalBdd + hLocalBdd hresponse_nonneg hweak_nonneg hpoincare_nonneg + hresponse_point hweak_point hpoincare_point + +/-- +Two-exponent scale-sharp localized RHS comparison with an arbitrary +nonnegative descendant coefficient envelope for the forcing correction +components. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_energy_add_coeffSum_mul_depthWeight_inv_mul_parent_forceExponent_of_pointwise_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s t : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) {E C₁ C₂ C₃ : ℝ} + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R t N g)) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ E) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R t g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R t g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R t g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + E + + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (t * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q t g) := by + refine + localizedCoarseFluxResponseRHSBound_le_energy_add_forcing_of_component_average_bounds + Q a a0 j gradU g henergy_nonneg hresponse_nonneg hweak_nonneg + hpoincare_nonneg henergy ?_ + exact + localizedCoarseFluxResponseRHSForcingCorrectionBound_le_coeffSum_mul_depthWeight_inv_mul_parent_forceExponent_of_pointwise_le_of_bddAbove + Q a a0 j g hC₁_nonneg hC₂_nonneg hC₃_nonneg hGlobalBdd + hLocalBdd hresponse_nonneg hweak_nonneg hpoincare_nonneg + hresponse_point hweak_point hpoincare_point + +/-- +End-to-end localized comparison corridor with the scale-sharp forcing +localization kept in the final scalar bound. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_energy_add_coeffSum_mul_depthWeight_inv_mul_parent_of_descendant_coarseFluxResponseRHSBound_of_pointwise_le_of_bddAbove + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 E C₁ C₂ C₃ : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (_ha0 : IsEllipticMatrix lam0 Lam0 a0) + (_ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hC₁_nonneg : 0 ≤ C₁) (hC₂_nonneg : 0 ≤ C₂) (hC₃_nonneg : 0 ≤ C₃) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ E) + (hresponse_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g ≤ + C₁ * cubeBesovPositiveVectorSeminormTwo R s g) + (hweak_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g ≤ + C₂ * cubeBesovPositiveVectorSeminormTwo R s g) + (hpoincare_point : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + C₃ * cubeBesovPositiveVectorSeminormTwo R s g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + Cdual * s⁻¹ * + (E + + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g)) := by + subst a0 + have hflux : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j ≤ + E + + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g) := by + calc + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j + ≤ localizedCoarseFluxResponseRHSBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g := + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + Q a (scalarMatrix (d := d) sigma0) s gradU g j hdefect_bdd hRhs + _ ≤ + E + + (C₁ + C₂ + C₃) * + ((Real.rpow (3 : ℝ) (s * (j : ℝ)))⁻¹ * + cubeBesovPositiveVectorSeminormTwo Q s g) := + localizedCoarseFluxResponseRHSBound_le_energy_add_coeffSum_mul_depthWeight_inv_mul_parent_of_pointwise_le_of_bddAbove + Q a (scalarMatrix (d := d) sigma0) j gradU g hC₁_nonneg hC₂_nonneg + hC₃_nonneg hGlobalBdd hLocalBdd + (fun R _ => + coarseFluxResponseRHSEnergyBound_nonneg R a + (scalarMatrix (d := d) sigma0) gradU hs_pos) + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + R a (scalarMatrix (d := d) sigma0) g hs_pos (hLocalBdd R hR)) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + R a g hs_pos (hLocalBdd R hR)) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + R a (scalarMatrix (d := d) sigma0) g hs_pos (hLocalBdd R hR)) + henergy hresponse_point hweak_point hpoincare_point + exact + solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_localizedFluxDefect_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll + hcomparison hflux + +/-- +Scalar §3.3 RHS comparison from localized component-average bounds. This is +the `L²` version of the component-envelope bridge, and is weaker than asking +for pointwise descendant domination. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_average_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := by + have hsplit := + localizedCoarseFluxResponseRHSBound_le_component_average_sum + Q a a0 j gradU g henergy_nonneg hresponse_nonneg hweak_nonneg + hpoincare_nonneg + rw [coarseGrainingL2FluxDefectBound_eq_energyTerm_add_forcingTerm] + linarith + +/-- +Bounded-positive-Besov version of the localized component-average scalar +comparison. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_average_bounds_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_average_bounds + Q a a0 j gradU g + (fun R _ => coarseFluxResponseRHSEnergyBound_nonneg R a a0 gradU hs) + (fun R hR => + coarseFluxResponseRHSResponseCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd R hR)) + (fun R hR => + coarseFluxResponseRHSWeakFluxCorrectionBound_nonneg_of_bddAbove + R a g hs (hgBdd R hR)) + (fun R hR => + coarseFluxResponseRHSPoincareCorrectionBound_nonneg_of_bddAbove + R a a0 g hs (hgBdd R hR)) + henergy hforcing + +/-- +§3.3 wrapper where the scalar RHS-average comparison is supplied by localized +component-average bounds. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_component_average_bounds + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSEnergyBound R a a0 s gradU) + (hresponse_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSResponseCorrectionBound R a a0 s g) + (hweak_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSWeakFluxCorrectionBound R a s g) + (hpoincare_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g) + (henergy : + localizedCoarseFluxResponseRHSEnergyBound Q a a0 s j gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + localizedCoarseFluxResponseRHSResponseCorrectionBound Q a a0 s j g + + localizedCoarseFluxResponseRHSWeakFluxCorrectionBound Q a s j g + + localizedCoarseFluxResponseRHSPoincareCorrectionBound Q a a0 s j g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd hRhs + (localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_average_bounds + Q a a0 j gradU g henergy_nonneg hresponse_nonneg hweak_nonneg + hpoincare_nonneg henergy hforcing) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2Response.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2Response.lean new file mode 100644 index 0000000000..fa0682ba56 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2Response.lean @@ -0,0 +1,844 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.NoteConstants + +/-! # Coarse Graining L2Response -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-- +At depth zero, the one-cube §3.2.4 RHS flux-response bound is exactly the +flux-defect bound used by the Section 3.3.B coarse-graining wrapper. +-/ +theorem coarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) : + coarseFluxResponseRHSBound Q a a0 s gradU g = + coarseGrainingL2FluxDefectBound Q a a0 s 0 gradU g := by + simp [coarseFluxResponseRHSBound, coarseGrainingL2FluxDefectBound] + +/-- +Depth-zero scalar comparison for the localized §3.2.4 RHS average. The +nonnegativity hypothesis is exactly the `sqrt (B^2) = B` side condition. +-/ +theorem localizedCoarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero_of_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (gradU g : Vec d → Vec d) + (hbound_nonneg : 0 ≤ coarseFluxResponseRHSBound Q a a0 s gradU g) : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g = + coarseGrainingL2FluxDefectBound Q a a0 s 0 gradU g := by + rw [localizedCoarseFluxResponseRHSBound_zero_of_nonneg Q a a0 s gradU g hbound_nonneg, + coarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero] + +/-- +Depth-zero scalar comparison with the standard positive-Besov boundedness +input for the forcing term. +-/ +theorem localizedCoarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g = + coarseGrainingL2FluxDefectBound Q a a0 s 0 gradU g := + localizedCoarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero_of_nonneg + Q a a0 s gradU g + (coarseFluxResponseRHSBound_nonneg_of_bddAbove Q a a0 gradU g hs hgBdd) + +/-- The energy term in the Section 3.3.B flux-defect RHS is nonnegative. -/ +theorem coarseGrainingL2FluxDefectEnergyTerm_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU : Vec d → Vec d) (hs : 0 < s) : + 0 ≤ coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have herror_nonneg : + 0 ≤ coarseGrainingHomogenizationErrorAtDepth Q a a0 s j := + coarseGrainingHomogenizationErrorAtDepth_nonneg Q a a0 j hs.le + unfold coarseGrainingL2FluxDefectEnergyTerm + exact + mul_nonneg + (mul_nonneg + (mul_nonneg hs_inv_nonneg (Real.sqrt_nonneg _)) + herror_nonneg) + (Real.sqrt_nonneg _) + +/-- The full Section 3.3.B flux-defect RHS is nonnegative. -/ +theorem coarseGrainingL2FluxDefectBound_nonneg_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := by + rw [coarseGrainingL2FluxDefectBound_eq_energyTerm_add_forcingTerm] + exact add_nonneg + (coarseGrainingL2FluxDefectEnergyTerm_nonneg Q a a0 j gradU hs) + (coarseGrainingL2FluxDefectForcingTerm_nonneg_of_bddAbove + Q a a0 j g hs hgBdd) + +/-- +General coarse-graining comparison where the localized flux-defect hypothesis +is derived from descendant coarse-flux response data. + +The remaining scalar input `hresponseBound` is the localization/Minkowski step +that compares the descendant response average with the manuscript RHS +`coarseGrainingL2FluxDefectBound`. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponse + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) (energy : Vec d → ℝ) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 (fluxDefect a a0 gradU) energy) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N (fluxDefect a a0 gradU))) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) + (hresponseBound : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + have _ : IsEllipticMatrix lam0 Lam0 a0 := ha0 + have _ : a0.IsSymm := ha0symm + have hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + (localizedFluxDefectNegativeBesovAverageTwo_le_localizedCoarseFluxResponseAverageBound_of_descendant_coarseFluxResponse + Q a a0 s (fluxDefect a a0 gradU) energy j hs_pos henergy_nonneg + henergy_int hresp hpartialBdd hsum).trans hresponseBound + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 gradU gradV g j hsigma0 ha0eq hs_pos hs_lt_one hEll + hcomparison + hcoarseFluxDefect + +/-- +Same-right-hand-side coarse-graining wrapper with the local flux-defect bound +derived from descendant coarse-flux response data instead of supplied as +`hcoarseFluxDefect`. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_descendant_coarseFluxResponse + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + (energy : Vec d → ℝ) {s : ℝ} (j : ℕ) {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, 0 ≤ energy x) + (henergy_int : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 (fluxDefect a a0 u.grad) energy) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N (fluxDefect a a0 u.grad))) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) + (hresponseBound : + localizedCoarseFluxResponseAverageBound Q a a0 s j energy ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponse + hdual Q a a0 sigma0 u.grad v.grad g energy j hs_pos hs_lt_one hsigma0 ha0eq + hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll ha0 u v g hu hv hzeroTrace) + henergy_nonneg henergy_int hresp hpartialBdd hsum hresponseBound + +/-- +General coarse-graining comparison where the localized flux-defect hypothesis +is derived from descendant one-cube §3.2.4 RHS flux-response bounds. + +The remaining scalar input `hresponseBound` is exactly the comparison between +the descendant `ℓ²` average of the §3.2.4 RHS and the manuscript §3.3.B +`coarseGrainingL2FluxDefectBound`. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hresponseBound : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + have _ : IsEllipticMatrix lam0 Lam0 a0 := ha0 + have _ : a0.IsSymm := ha0symm + have hlocalized : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g := + localizedFluxDefectNegativeBesovAverageTwo_fluxDefect_le_localizedCoarseFluxResponseRHSBound_of_descendant_bounds + Q a a0 s gradU g j hdefect_bdd hRhs + have hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + hlocalized.trans hresponseBound + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 gradU gradV g j hsigma0 ha0eq hs_pos hs_lt_one hEll + hcomparison + hcoarseFluxDefect + +/-- +Same-right-hand-side version of +`solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound`. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_descendant_coarseFluxResponseRHSBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + {s : ℝ} (j : ℕ) {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 u.grad))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 u.grad) ≤ + coarseFluxResponseRHSBound R a a0 s u.grad g) + (hresponseBound : + localizedCoarseFluxResponseRHSBound Q a a0 s j u.grad g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + hdual Q a a0 sigma0 u.grad v.grad g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll ha0 u v g hu hv hzeroTrace) + hdefect_bdd hRhs hresponseBound + +/-- +Pointwise component envelope for the scalar comparison between a one-cube +§3.2.4 RHS and the parent §3.3.B flux-defect RHS. + +The remaining analytic scalar work is exactly the two hypotheses below: +localize the energy component into the parent energy term, and localize the +three correction components into the parent forcing term. +-/ +theorem coarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_bounds + {d : ℕ} (Q R : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) + (henergy : + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + coarseFluxResponseRHSBound R a a0 s gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := by + rw [coarseFluxResponseRHSBound_eq_component_sum, + coarseGrainingL2FluxDefectBound_eq_energyTerm_add_forcingTerm] + simpa [add_assoc] using add_le_add henergy hforcing + +/-- +Scalar §3.3 RHS comparison from a pointwise descendant scalar envelope. +This converts the remaining `L²` descendant-average comparison into the +componentwise task of bounding every one-cube §3.2.4 RHS by the parent +`coarseGrainingL2FluxDefectBound`. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_bound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) + (hcoarse_nonneg : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hbound_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSBound R a a0 s gradU g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSBound R a a0 s gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_of_descendant_bound Q a a0 s j gradU g + hcoarse_nonneg hbound_nonneg hpoint + +/-- +Bounded-positive-Besov version of the pointwise descendant scalar-envelope +comparison. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_bound_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (hs : 0 < s) + (hcoarse_nonneg : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hgBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSBound R a a0 s gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_of_descendant_bound_of_bddAbove + Q a a0 j gradU g hs hcoarse_nonneg hgBdd hpoint + +/-- +Localized scalar §3.3 RHS comparison from descendant component envelopes. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_component_bounds + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (j : ℕ) (gradU g : Vec d → Vec d) + (hcoarse_nonneg : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hbound_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSBound R a a0 s gradU g) + (henergy : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_bound + Q a a0 s j gradU g hcoarse_nonneg hbound_nonneg + (fun R hR => + coarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_bounds + Q R a a0 s j gradU g (henergy R hR) (hforcing R hR)) + +/-- +Bounded-positive-Besov version of the descendant component-envelope scalar +comparison. +-/ +theorem localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_component_bounds_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} (j : ℕ) (gradU g : Vec d → Vec d) + (hs : 0 < s) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (henergy : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + localizedCoarseFluxResponseRHSBound Q a a0 s j gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g := + localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_component_bounds + Q a a0 s j gradU g + (coarseGrainingL2FluxDefectBound_nonneg_of_bddAbove Q a a0 j gradU g hs hgBdd) + (fun R hR => + coarseFluxResponseRHSBound_nonneg_of_bddAbove R a a0 gradU g hs + (hgBdd_desc R hR)) + henergy hforcing + +/-- +§3.3 wrapper where the scalar RHS-average comparison is supplied in pointwise +descendant-envelope form. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_descendant_bound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hcoarse_nonneg : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hbound_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSBound R a a0 s gradU g) + (hpoint : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSBound R a a0 s gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd hRhs + (localizedCoarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_descendant_bound + Q a a0 s j gradU g hcoarse_nonneg hbound_nonneg hpoint) + +/-- +§3.3 wrapper where the scalar RHS-average comparison is supplied by +descendant component envelopes. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_descendant_component_bounds + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hcoarse_nonneg : + 0 ≤ coarseGrainingL2FluxDefectBound Q a a0 s j gradU g) + (hbound_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ coarseFluxResponseRHSBound R a a0 s gradU g) + (henergy : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_descendant_bound + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd hRhs hcoarse_nonneg hbound_nonneg + (fun R hR => + coarseFluxResponseRHSBound_le_coarseGrainingL2FluxDefectBound_of_component_bounds + Q R a a0 s j gradU g (henergy R hR) (hforcing R hR)) + +/-- +Bounded-positive-Besov version of the descendant component-envelope §3.3 +wrapper. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_descendant_component_bounds_of_bddAbove + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU))) + (hRhs : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hgBdd_desc : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (henergy : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSEnergyBound R a a0 s gradU ≤ + coarseGrainingL2FluxDefectEnergyTerm Q a a0 s j gradU) + (hforcing : + ∀ R ∈ descendantsAtDepth Q j, + coarseFluxResponseRHSResponseCorrectionBound R a a0 s g + + coarseFluxResponseRHSWeakFluxCorrectionBound R a s g + + coarseFluxResponseRHSPoincareCorrectionBound R a a0 s g ≤ + coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound_of_descendant_component_bounds + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd hRhs + (coarseGrainingL2FluxDefectBound_nonneg_of_bddAbove Q a a0 j gradU g hs_pos hgBdd) + (fun R hR => + coarseFluxResponseRHSBound_nonneg_of_bddAbove R a a0 gradU g hs_pos + (hgBdd_desc R hR)) + henergy hforcing + +/-- +Depth-zero §3.3 wrapper through the one-cube §3.2.4 RHS flux-response bound. +At depth zero the scalar descendant-average comparison is closed internally. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxResponseRHSBound_zero + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (hdefect_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 gradU))) + (hRhs : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound Q a a0 s gradU g) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + coarseGrainingL2Rhs Cdual Q a a0 s 0 gradU g := by + have hdefect_bdd_desc : + ∀ R ∈ descendantsAtDepth Q 0, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fluxDefect a a0 gradU)) := by + intro R hR + simp at hR + subst R + exact hdefect_bdd + have hRhs_desc : + ∀ R ∈ descendantsAtDepth Q 0, + cubeBesovNegativeVectorSeminormTwo R s (fluxDefect a a0 gradU) ≤ + coarseFluxResponseRHSBound R a a0 s gradU g := by + intro R hR + simp at hR + subst R + exact hRhs + have hresponseBound : + localizedCoarseFluxResponseRHSBound Q a a0 s 0 gradU g ≤ + coarseGrainingL2FluxDefectBound Q a a0 s 0 gradU g := by + exact le_of_eq + (localizedCoarseFluxResponseRHSBound_eq_coarseGrainingL2FluxDefectBound_zero_of_bddAbove + Q a a0 gradU g hs_pos hgBdd) + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_descendant_coarseFluxResponseRHSBound + hdual Q a a0 sigma0 gradU gradV g 0 hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm hcomparison + hdefect_bdd_desc hRhs_desc hresponseBound + +/-- +Same-right-hand-side depth-zero wrapper through the one-cube §3.2.4 RHS +flux-response bound. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_coarseFluxResponseRHSBound_zero + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hdefect_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 u.grad))) + (hRhs : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.grad) ≤ + coarseFluxResponseRHSBound Q a a0 s u.grad g) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s 0 u.grad g := + solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxResponseRHSBound_zero + hdual Q a a0 sigma0 u.grad v.grad g hs_pos hs_lt_one hsigma0 ha0eq hEll + ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll ha0 u v g hu hv hzeroTrace) + hdefect_bdd hRhs hgBdd + +/-- +General coarse-graining comparison where the localized flux-defect hypothesis +is derived from descendant coarse-flux response data and the scalar response +average is absorbed into the Section 3.3.B RHS with the explicit ten-factor +constant. + +The assumptions `hgeom_le`, `herror_nonneg`, and `hforcing_nonneg` are the +remaining scalar side conditions needed to keep this wrapper import-light: +the note-constant file supplies `hgeom_le`, while later positivity wrappers can +close the two nonnegativity inputs. +-/ +theorem solution_diff_l2_le_ten_mul_coarseGrainingL2Rhs_of_descendant_coarseFluxResponse_energy + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hgeom_le : (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 (fluxDefect a a0 gradU) + (coefficientEnergyDensity a gradU)) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N (fluxDefect a a0 gradU))) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) + (herror_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) + (hforcing_nonneg : + 0 ≤ coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + 10 * coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + subst a0 + have henergy_nonneg : + ∀ R ∈ descendantsAtDepth Q j, ∀ x ∈ cubeSet R, + 0 ≤ coefficientEnergyDensity a gradU x := by + intro R hR x hx + exact coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll gradU x + (cubeSet_subset_of_mem_descendantsAtDepth hR hx) + have henergy_avg_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ cubeAverage R (coefficientEnergyDensity a gradU) := by + intro R hR + exact cubeAverage_nonneg_of_nonneg_on + (Q := R) (f := coefficientEnergyDensity a gradU) (henergy_nonneg R hR) + have henergy_int_desc : + ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet R) MeasureTheory.volume := by + intro R hR + exact henergy_int.mono_set (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hlocalized_response : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j ≤ + localizedCoarseFluxResponseAverageBound Q a + (scalarMatrix (d := d) sigma0) s j + (coefficientEnergyDensity a gradU) := + localizedFluxDefectNegativeBesovAverageTwo_le_localizedCoarseFluxResponseAverageBound_of_descendant_coarseFluxResponse + Q a (scalarMatrix (d := d) sigma0) s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) + (coefficientEnergyDensity a gradU) j + hs_pos henergy_nonneg henergy_int_desc hresp hpartialBdd hsum + have hresponse_bound : + localizedCoarseFluxResponseAverageBound Q a + (scalarMatrix (d := d) sigma0) s j + (coefficientEnergyDensity a gradU) ≤ + 10 * coarseGrainingL2FluxDefectBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g := + localizedCoarseFluxResponseAverageBound_coefficientEnergy_le_ten_mul_coarseGrainingL2FluxDefectBound_of_invGeom_le + Q a (scalarMatrix (d := d) sigma0) j gradU g hs_pos hgeom_le henergy_int + henergy_avg_nonneg + herror_nonneg hforcing_nonneg + have hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j ≤ + 10 * coarseGrainingL2FluxDefectBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g := + hlocalized_response.trans hresponse_bound + calc + solutionComparisonNegativeBesovLhs Q s a (scalarMatrix (d := d) sigma0) gradU gradV + ≤ Cdual * s⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll hcomparison + _ ≤ Cdual * s⁻¹ * + (10 * coarseGrainingL2FluxDefectBound Q a + (scalarMatrix (d := d) sigma0) s j gradU g) := by + exact mul_le_mul_of_nonneg_left hcoarseFluxDefect + (mul_nonneg hdual.1 (inv_nonneg.mpr hs_pos.le)) + _ = 10 * coarseGrainingL2Rhs Cdual Q a + (scalarMatrix (d := d) sigma0) s j gradU g := by + unfold coarseGrainingL2Rhs + ring + +/-- +Import-light side conditions in the response-data apex discharged from the +standard manuscript range and the global positive-Besov boundedness of `g`. +-/ +theorem solution_diff_l2_le_ten_mul_coarseGrainingL2Rhs_of_descendant_coarseFluxResponse_energy_of_bddAbove + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (gradU gradV g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) + (henergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a gradU) + (cubeSet Q) MeasureTheory.volume) + (hresp : + ∀ R ∈ descendantsAtDepth Q j, + CubeAverageFluxResponseControl R a a0 (fluxDefect a a0 gradU) + (coefficientEnergyDensity a gradU)) + (hpartialBdd : + ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm R s N (fluxDefect a a0 gradU))) + (hsum : + ∀ R ∈ descendantsAtDepth Q j, + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + 10 * coarseGrainingL2Rhs Cdual Q a a0 s j gradU g := by + have hgeom_le : (geometricDiscount s 1)⁻¹ ≤ 5 * s⁻¹ := by + simpa [geometricDiscount_one_eq] using + inv_one_sub_rpow_three_neg_le_five_inv hs_pos hs_lt_one.le + have herror_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 := by + intro R hR + exact homogenizationErrorOnCube_infinity_one_nonneg R a a0 hs_pos.le + have hforcing_nonneg : + 0 ≤ coarseGrainingL2FluxDefectForcingTerm Q a a0 s j g := + coarseGrainingL2FluxDefectForcingTerm_nonneg_of_bddAbove + Q a a0 j g hs_pos hgBdd + exact + solution_diff_l2_le_ten_mul_coarseGrainingL2Rhs_of_descendant_coarseFluxResponse_energy + hdual Q a a0 sigma0 gradU gradV g j hs_pos hs_lt_one hgeom_le hsigma0 + ha0eq hEll ha0 ha0symm hcomparison henergy_int hresp hpartialBdd hsum herror_nonneg + hforcing_nonneg + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2WeakFlux.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2WeakFlux.lean new file mode 100644 index 0000000000..1610d596d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/CoarseGrainingL2WeakFlux.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex + +/-! # Coarse Graining L2Weak Flux -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-- +The expanded note-facing Section 3.2.3 weak-flux RHS, named so the Section +3.3.B composition layer can state its scalar handoff without repeating the +large square-root expression. +-/ +noncomputable def weakFluxNoteEnergySeminormsForceBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (g gradU : Vec d → Vec d) (m : ℕ) (BU BV : ℝ) : ℝ := + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a gradU) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) + +/-- +Named black-box handoff from the Section 3.2.3 H¹ weak-solution apex to the +compressed RHS name used by the Section 3.3.B wrapper. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_weakFluxNoteEnergySeminormsForceBound_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + weakFluxNoteEnergySeminormsForceBound Q a s g u.grad m BU BV := by + simpa [weakFluxNoteEnergySeminormsForceBound] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) (u := u) (lam := lam) + (Lam := Lam) hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc + (m := m) (BU := BU) (BV := BV) hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed + +/-- +Bridge-explicit Section 3.3.B composition surface routed through the Section +3.2.3 H¹ weak-flux RHS apex. + +This theorem is intentionally not given the final Step-B name: the remaining +bridge hypotheses are genuine interface obligations. The Section 3.2.3 H¹ +apex controls the weak-flux field `a∇u`, whereas Section 3.3.A consumes the +coarse flux-defect `(a-a₀)∇u`. The first bridge supplies that negative-Besov +field conversion; the second compares the expanded weak-flux RHS with the +manuscript coarse-graining RHS. +-/ +theorem solution_diff_l2_le_coarseGrainingL2Rhs_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds_of_weakFluxBridges + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) (cubeSet Q) v g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (j + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) + (hweakFluxControlsDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) j ≤ + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) j) + (hweakFluxRhs_le : + weakFluxNoteEnergySeminormsForceBound Q a s g u.grad j BU BV ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + coarseGrainingL2Rhs Cdual Q a a0 s j u.grad g := by + have _ : IsEllipticMatrix lam0 Lam0 a0 := ha0 + have _ : a0.IsSymm := ha0symm + have hweakFlux : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) j ≤ + weakFluxNoteEnergySeminormsForceBound Q a s g u.grad j BU BV := + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_weakFluxNoteEnergySeminormsForceBound_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) (u := u) (lam := lam) + (Lam := Lam) hs_pos hs_lt_one.le hweak hEll_desc hu_mem_desc hg_mem_desc + hC_desc hData_desc hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc + (m := j) (BU := BU) (BV := BV) hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail hvConstructed + have hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) j ≤ + coarseGrainingL2FluxDefectBound Q a a0 s j u.grad g := + (hweakFluxControlsDefect.trans hweakFlux).trans hweakFluxRhs_le + exact + solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 u v g j hsigma0 ha0eq hs_pos hs_lt_one hEll + hweak hv hzeroTrace hcoarseFluxDefect + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/Duality.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/Duality.lean new file mode 100644 index 0000000000..d08bd092d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/Duality.lean @@ -0,0 +1,808 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic + +/-! # Duality -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Deterministic homogenization black boxes: duality + +This file contains the Section 3.3.A deterministic duality surface from +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 2804--3008. + +The Lean statement is written on an arbitrary triadic cube `Q` and a descendant +depth `j`. This is the existing codebase's scale convention: `j` represents +the manuscript scale gap `m - n`, and the quantities +`cubeBesovNegativeVectorSeminormTwo` are already note-normalized, i.e. they +include the displayed factors `3^{-sm}` and `3^{-sn}`. +-/ + +open scoped BigOperators + +/-- Constant coefficient field associated to a matrix. -/ +abbrev constantCoeffField {d : ℕ} (a0 : Mat d) : CoeffField d := + fun _ => a0 + +/-- A constant elliptic matrix defines an elliptic coefficient field on every measurable set. -/ +theorem isEllipticFieldOn_constantCoeffField {d : ℕ} {U : Set (Vec d)} + {a0 : Mat d} {lam0 Lam0 : ℝ} + (hU : MeasurableSet U) (ha0 : IsEllipticMatrix lam0 Lam0 a0) : + IsEllipticFieldOn lam0 Lam0 U (constantCoeffField a0) := by + classical + constructor + · apply (measurable_pi_iff).2 + intro i + apply (measurable_pi_iff).2 + intro j + have hpiece : + Measurable (U.piecewise (fun _ : Vec d => a0 i j) (fun _ => 0)) := + measurable_const.piecewise hU measurable_const + simpa [Set.piecewise, constantCoeffField] using! hpiece + · intro x hx + simpa [constantCoeffField] using ha0 + +/-- The flux defect `(a - a₀)∇u`, written in terms of the gradient field. -/ +noncomputable def fluxDefect {d : ℕ} (a : CoeffField d) (a0 : Mat d) + (gradU : Vec d → Vec d) : Vec d → Vec d := + fun x => matVecMul (a x) (gradU x) - matVecMul a0 (gradU x) + +/-- The constant-coefficient gradient comparison field `a₀(∇u - ∇v)`. -/ +noncomputable def constantGradientComparison {d : ℕ} (a0 : Mat d) + (gradU gradV : Vec d → Vec d) : Vec d → Vec d := + fun x => matVecMul a0 (gradU x - gradV x) + +/-- The full flux comparison `a∇u - a₀∇v`. -/ +noncomputable def fluxComparison {d : ℕ} (a : CoeffField d) (a0 : Mat d) + (gradU gradV : Vec d → Vec d) : Vec d → Vec d := + fun x => matVecMul (a x) (gradU x) - matVecMul a0 (gradV x) + +/-- +Weak `H¹` formulation of `- div (a ∇u) = div g` on `U`, tested against +zero-trace functions. + +Unlike `IsZeroTraceDirichletRhsWeakSolution`, this predicate does not impose a +zero boundary condition on `u`; it matches the comparison hypotheses in +manuscript lines 3020--3029, where only `u - v ∈ H¹₀` is prescribed. +-/ +def IsH1DirichletRhsWeakSolutionOn {d : ℕ} + (a : CoeffField d) (U : Set (Vec d)) (u : H1Function U) + (g : Vec d → Vec d) : Prop := + ∀ φ : H10Function U, + ∫ x in U, vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +namespace IsH1DirichletRhsWeakSolutionOn + +/-- +An `H¹` function whose flux is solenoidal solves the zero-right-hand-side weak +Dirichlet equation. +-/ +theorem of_isSolenoidalOn_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {u : H1Function U} + (hsol : IsSolenoidalOn U (fun x => matVecMul (a x) (u.grad x))) : + IsH1DirichletRhsWeakSolutionOn a U u (0 : Vec d → Vec d) := by + intro φ + rw [hsol φ] + simp [vecDot_zero_left] + +/-- A packaged `a`-harmonic function solves the zero-right-hand-side weak equation. -/ +theorem of_aHarmonicFunction {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) : + IsH1DirichletRhsWeakSolutionOn a U u.toH1 (0 : Vec d → Vec d) := + of_isSolenoidalOn_zero u.isHarmonic.2 + +/-- +The weak equation `-div(a grad u) = div g`, in the codebase's sign convention, +says exactly that the residual flux `a grad u - g` is solenoidal. +-/ +theorem residual_solenoidal {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {u : H1Function U} {g : Vec d → Vec d} {lam Lam : ℝ} + (h : IsH1DirichletRhsWeakSolutionOn a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) + (hg : MemVectorL2 U g) : + IsSolenoidalOn U (fun x => matVecMul (a x) (u.grad x) - g x) := by + intro φ + have hflux_mem : + MemVectorL2 U (fun x => matVecMul (a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hflux_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hflux_mem φ.toH1Function.grad_memVectorL2 + have hg_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (g x) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hg φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => vecDot (matVecMul (a x) (u.grad x) - g x) + (φ.toH1Function.grad x)) = + fun x => + vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) - + vecDot (g x) (φ.toH1Function.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + rw [hfun, MeasureTheory.integral_sub hflux_int hg_int, h φ] + ring + +end IsH1DirichletRhsWeakSolutionOn + +/-- +Weak formulation of the comparison system in Lemma +`l.duality.from.flux.defect.deterministic.theory`. + +The manuscript states +`div (a∇u - a₀∇v) = 0` and `u - v ∈ H¹₀`. The existing PDE layer represents +these exactly as solenoidality of the flux comparison and zero-trace +potentiality of the gradient difference. +-/ +def IsHomogenizationComparisonPairOn {d : ℕ} (U : Set (Vec d)) + (a : CoeffField d) (a0 : Mat d) (gradU gradV : Vec d → Vec d) : Prop := + IsSolenoidalOn U (fluxComparison a a0 gradU gradV) ∧ + IsPotentialZeroTraceOn U (fun x => gradU x - gradV x) + +namespace IsHomogenizationComparisonPairOn + +/-- +Build the comparison-pair hypothesis for a harmonic function and its +constant-coefficient harmonic replacement from the manuscript boundary +condition `u - v ∈ H¹₀`. +-/ +theorem of_aHarmonicFunctions {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {a0 : Mat d} {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (u : AHarmonicFunction a U) + (v : AHarmonicFunction (constantCoeffField a0) U) + (hzeroTrace : + IsPotentialZeroTraceOn U (fun x => u.toH1.grad x - v.toH1.grad x)) : + IsHomogenizationComparisonPairOn U a a0 u.toH1.grad v.toH1.grad := by + have hEll0 : IsEllipticFieldOn lam0 Lam0 U (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_of_isEllipticFieldOn hEll) ha0 + have huFluxL2 : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + have hvFluxL2 : + MemVectorL2 U (fun x => matVecMul a0 (v.toH1.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 v.toH1.grad_memVectorL2 + have huSol : + IsSolenoidalOn U (fun x => matVecMul (a x) (u.toH1.grad x)) := + u.isHarmonic.2 + have hvSol : + IsSolenoidalOn U (fun x => matVecMul a0 (v.toH1.grad x)) := by + simpa [constantCoeffField] using v.isHarmonic.2 + have hvNegFluxL2 : + MemVectorL2 U (fun x => -matVecMul a0 (v.toH1.grad x)) := by + simpa [Pi.smul_apply] using! hvFluxL2.const_smul (-1 : ℝ) + have hvNegSol : + IsSolenoidalOn U (fun x => -matVecMul a0 (v.toH1.grad x)) := by + simpa [Pi.smul_apply] using! isSolenoidalOn_smul hvSol (-1 : ℝ) + have hfluxSol : + IsSolenoidalOn U + ((fun x => matVecMul (a x) (u.toH1.grad x)) + + fun x => -matVecMul a0 (v.toH1.grad x)) := + isSolenoidalOn_add_of_memVectorL2 huFluxL2 hvNegFluxL2 huSol hvNegSol + constructor + · simpa [fluxComparison, Pi.add_apply, sub_eq_add_neg] using! hfluxSol + · exact hzeroTrace + +/-- +Build the comparison-pair hypothesis from the Section 3.3.B weak equations +with common right-hand side and the manuscript boundary condition +`u - v ∈ H¹₀`. +-/ +theorem of_sameRhs_h1Functions {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {a0 : Mat d} {lam Lam lam0 Lam0 : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (u v : H1Function U) (g : Vec d → Vec d) + (hu : IsH1DirichletRhsWeakSolutionOn a U u g) + (hv : IsH1DirichletRhsWeakSolutionOn (constantCoeffField a0) U v g) + (hzeroTrace : + IsPotentialZeroTraceOn U (fun x => u.grad x - v.grad x)) : + IsHomogenizationComparisonPairOn U a a0 u.grad v.grad := by + have hEll0 : IsEllipticFieldOn lam0 Lam0 U (constantCoeffField a0) := + isEllipticFieldOn_constantCoeffField (measurableSet_of_isEllipticFieldOn hEll) ha0 + have huFluxL2 : + MemVectorL2 U (fun x => matVecMul (a x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hvFluxL2 : + MemVectorL2 U (fun x => matVecMul a0 (v.grad x)) := by + simpa [constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll0 v.grad_memVectorL2 + constructor + · intro φ + have huInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 huFluxL2 φ.toH1Function.grad_memVectorL2 + have hvInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul a0 (v.grad x)) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hvFluxL2 φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => + vecDot (fluxComparison a a0 u.grad v.grad x) (φ.toH1Function.grad x)) = + fun x => + vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul a0 (v.grad x)) (φ.toH1Function.grad x) := by + funext x + simp [fluxComparison, sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hvφ : + ∫ x in U, vecDot (matVecMul a0 (v.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa [constantCoeffField] using hv φ + calc + ∫ x in U, + vecDot (fluxComparison a a0 u.grad v.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, + (vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul a0 (v.grad x)) (φ.toH1Function.grad x)) + ∂MeasureTheory.volume := by + rw [hfun] + _ = + ∫ x in U, vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in U, vecDot (matVecMul a0 (v.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub huInt hvInt] + _ = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume - + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [hu φ, hvφ] + _ = 0 := by ring + · exact hzeroTrace + +end IsHomogenizationComparisonPairOn + +/-- +The left-hand side of the duality estimate: +`[a₀(∇u-∇v)]_{B^{-s}_{2,2}} + [a∇u-a₀∇v]_{B^{-s}_{2,2}}`, with the note +normalization already included in each cube seminorm. +-/ +noncomputable def solutionComparisonNegativeBesovLhs {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (a0 : Mat d) + (gradU gradV : Vec d → Vec d) : ℝ := + cubeBesovNegativeVectorSeminormTwo Q s (constantGradientComparison a0 gradU gradV) + + cubeBesovNegativeVectorSeminormTwo Q s (fluxComparison a a0 gradU gradV) + +/-- +The localized `ℓ²` average of the local flux-defect negative Besov seminorms. +For a parent cube of scale `m`, depth `j = m - n` corresponds to the manuscript +average over `3^n ℤ^d ∩ □_m`. +-/ +noncomputable def localizedFluxDefectNegativeBesovAverageTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) (j : ℕ) : ℝ := + Real.sqrt <| + descendantsAverage Q j fun R => (cubeBesovNegativeVectorSeminormTwo R s defect) ^ 2 + +theorem localizedFluxDefectNegativeBesovAverageTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) (j : ℕ) : + 0 ≤ localizedFluxDefectNegativeBesovAverageTwo Q s defect j := by + unfold localizedFluxDefectNegativeBesovAverageTwo + exact Real.sqrt_nonneg _ + +private theorem one_le_inv_of_pos_of_lt_one {s : ℝ} (hs : 0 < s) (hs_lt : s < 1) : + (1 : ℝ) ≤ s⁻¹ := + (one_le_inv₀ hs).2 hs_lt.le + +private theorem mul_le_mul_inv_mul_of_pos_of_lt_one_of_nonneg + {C s X : ℝ} (hC : 0 ≤ C) (hs : 0 < s) (hs_lt : s < 1) (hX : 0 ≤ X) : + C * X ≤ C * s⁻¹ * X := by + have hinv : (1 : ℝ) ≤ s⁻¹ := one_le_inv_of_pos_of_lt_one hs hs_lt + calc + C * X = C * (1 * X) := by ring + _ ≤ C * (s⁻¹ * X) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hinv hX) hC + _ = C * s⁻¹ * X := by ring + +/-- +At depth zero the localized flux-defect average is the absolute value of the +one-cube negative Besov seminorm. Later callers may remove the absolute value +when they have the usual boundedness or `L²` hypotheses giving nonnegativity of +the seminorm. +-/ +@[simp] theorem localizedFluxDefectNegativeBesovAverageTwo_depth_zero_abs {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect 0 = + |cubeBesovNegativeVectorSeminormTwo Q s defect| := by + unfold localizedFluxDefectNegativeBesovAverageTwo descendantsAverage + simp [Real.sqrt_sq_eq_abs] + +/-- +At depth zero, if the one-cube negative Besov seminorm is known nonnegative, +the localized flux-defect average is exactly that seminorm. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) + (hdefect_nonneg : 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s defect) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect 0 = + cubeBesovNegativeVectorSeminormTwo Q s defect := by + rw [localizedFluxDefectNegativeBesovAverageTwo_depth_zero_abs] + exact abs_of_nonneg hdefect_nonneg + +/-- +Localized `q = 2` flux-defect averages inherit pointwise bounds on every +descendant cube. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_pointwiseBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) (j : ℕ) + (B : TriadicCube d → ℝ) + (hseminorm_nonneg : + ∀ R ∈ descendantsAtDepth Q j, + 0 ≤ cubeBesovNegativeVectorSeminormTwo R s defect) + (hbound : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovNegativeVectorSeminormTwo R s defect ≤ B R) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + Real.sqrt (descendantsAverage Q j fun R => (B R) ^ 2) := by + unfold localizedFluxDefectNegativeBesovAverageTwo + refine Real.sqrt_le_sqrt ?_ + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ (hseminorm_nonneg R hR) (hbound R hR) 2 + +/-- +Localized `q = 2` flux-defect averages from descendantwise `q = 1` partial +seminorm bounds. This is the handoff shape used by coarse-flux response +estimates before they are averaged over descendants. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_qonePartialBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (defect : Vec d → Vec d) (j : ℕ) + (B : TriadicCube d → ℝ) + (hpartial : + ∀ R ∈ descendantsAtDepth Q j, ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm R s N defect ≤ B R) : + localizedFluxDefectNegativeBesovAverageTwo Q s defect j ≤ + Real.sqrt (descendantsAverage Q j fun R => (B R) ^ 2) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_le_sqrt_descendantsAverage_sq_of_pointwiseBound + Q s defect j B ?_ ?_ + · intro R hR + have hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N defect) := by + use B R + rintro x ⟨N, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm + R s N defect).trans (hpartial R hR N) + have hzero_le : + cubeBesovNegativeVectorPartialSeminormTwo R s 0 defect ≤ + cubeBesovNegativeVectorSeminormTwo R s defect := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hBdd ⟨0, rfl⟩ + exact (cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s 0 defect).trans hzero_le + · intro R hR + exact + cubeBesovNegativeVectorSeminormTwo_le_of_qone_partialBound + R s defect (hpartial R hR) + +/-- +Direct arbitrary-matrix solution-comparison duality estimate. + +This is the active deterministic interface for Lemma +`l.duality.from.flux.defect.deterministic.theory`: the comparison fields are +controlled directly by the localized flux defect. It deliberately does not +depend on the abandoned Ch1 route. +-/ +def SolutionComparisonDualityEstimate + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (a0 : Mat d) (w F : Vec d → Vec d) + {s : ℝ} (j : ℕ) {lam0 Lam0 : ℝ}, + 0 < s → + s < 1 → + IsEllipticMatrix lam0 Lam0 a0 → + a0.IsSymm → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul a0 (w x) + F x) → + cubeBesovNegativeVectorSeminormTwo Q s (fun x => matVecMul a0 (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (w x) + F x) ≤ + C * localizedFluxDefectNegativeBesovAverageTwo Q s F j + +/-- +The comparison-pair left-hand side is exactly the pair +`(a₀(∇u-∇v), a₀(∇u-∇v) + (a-a₀)∇u)`. +-/ +theorem solutionComparisonNegativeBesovLhs_eq_comparisonPair + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (a0 : Mat d) + (gradU gradV : Vec d → Vec d) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV = + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul a0 (gradU x - gradV x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => + matVecMul a0 (gradU x - gradV x) + + fluxDefect a a0 gradU x) := by + unfold solutionComparisonNegativeBesovLhs constantGradientComparison fluxComparison fluxDefect + congr 2 + funext x + ext i + simp [sub_eq_add_neg, matVecMul, mul_add, Finset.sum_add_distrib] + ring + +/-- +The solenoidal part of a homogenization comparison pair has the normal form +`a₀(∇u-∇v) + (a-a₀)∇u`. +-/ +theorem IsHomogenizationComparisonPairOn.comparisonPair_solenoidal + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {a0 : Mat d} + {gradU gradV : Vec d → Vec d} + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) : + IsSolenoidalOn (cubeSet Q) + (fun x => + matVecMul a0 (gradU x - gradV x) + fluxDefect a a0 gradU x) := by + have hfield : + (fun x => + matVecMul a0 (gradU x - gradV x) + fluxDefect a a0 gradU x) = + fluxComparison a a0 gradU gradV := by + funext x + ext i + simp [fluxComparison, fluxDefect, sub_eq_add_neg, matVecMul, mul_add, + Finset.sum_add_distrib] + ring + simpa [hfield] using hcomparison.1 + +/-- Use the direct arbitrary-matrix solution-comparison duality estimate on a +homogenization comparison pair. -/ +theorem solutionComparisonNegativeBesovLhs_le_of_solutionComparisonDualityEstimate + {d : ℕ} [NeZero d] {C : ℝ} + (hduality : SolutionComparisonDualityEstimate d C) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV) : + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + C * localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j := by + have hbound := + hduality.2 Q a0 (fun x => gradU x - gradV x) (fluxDefect a a0 gradU) j + hs_pos hs_lt_one ha0 ha0symm hcomparison.2 + hcomparison.comparisonPair_solenoidal + rwa [solutionComparisonNegativeBesovLhs_eq_comparisonPair] + +/-- +Existence of a dimension-only direct duality constant gives the arbitrary-matrix +Section 3.3.A duality estimate surface. +-/ +theorem exists_solutionComparisonNegativeBesovLhsBound_of_solutionComparisonDualityEstimate + (d : ℕ) [NeZero d] + (hduality : ∃ C : ℝ, SolutionComparisonDualityEstimate d C) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam lam0 Lam0 : ℝ}, + 0 < s → + s < 1 → + IsEllipticFieldOn lam Lam (cubeSet Q) a → + IsEllipticMatrix lam0 Lam0 a0 → + a0.IsSymm → + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 gradU gradV → + solutionComparisonNegativeBesovLhs Q s a a0 gradU gradV ≤ + C * localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 gradU) j := by + rcases hduality with ⟨C, hC⟩ + refine ⟨C, hC.1, ?_⟩ + intro Q a a0 gradU gradV s j lam Lam lam0 Lam0 hs_pos hs_lt_one _hEll ha0 ha0symm + hcomparison + exact + solutionComparisonNegativeBesovLhs_le_of_solutionComparisonDualityEstimate + hC Q a a0 gradU gradV j hs_pos hs_lt_one ha0 ha0symm hcomparison + +/-- +Direct scalar-background solution-comparison duality estimate. + +This is the scalar form consumed by the existing Chapter 3 coarse-graining +wrappers. It is a direct flux-defect duality input, not a proof obligation +about the abandoned Ch1 route. +-/ +def ScalarSolutionComparisonDualityEstimate + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {s : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < s → + s < 1 → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + C * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s F j + +/-- The arbitrary-matrix direct duality estimate specializes to the scalar route. -/ +theorem SolutionComparisonDualityEstimate.to_scalar + {d : ℕ} [NeZero d] {C : ℝ} + (hduality : SolutionComparisonDualityEstimate d C) : + ScalarSolutionComparisonDualityEstimate d C := by + refine ⟨hduality.1, ?_⟩ + intro Q sigma0 w F s j hsigma0 hs_pos hs_lt_one hw hsol + have hbound : + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + C * localizedFluxDefectNegativeBesovAverageTwo Q s F j := + hduality.2 Q (scalarMatrix (d := d) sigma0) w F j + hs_pos hs_lt_one (isEllipticMatrix_scalarMatrix hsigma0) + (scalarMatrix_isSymm sigma0) hw hsol + exact hbound.trans + (mul_le_mul_inv_mul_of_pos_of_lt_one_of_nonneg hduality.1 hs_pos hs_lt_one + (localizedFluxDefectNegativeBesovAverageTwo_nonneg Q s F j)) + +/-- Existence of the arbitrary-matrix direct duality constant implies the scalar one. -/ +theorem exists_scalarSolutionComparisonDualityEstimate_of_solutionComparisonDualityEstimate + {d : ℕ} [NeZero d] + (hduality : ∃ C : ℝ, SolutionComparisonDualityEstimate d C) : + ∃ C : ℝ, ScalarSolutionComparisonDualityEstimate d C := by + rcases hduality with ⟨C, hC⟩ + exact ⟨C, hC.to_scalar⟩ + +/-- Use the direct scalar-background duality estimate on a comparison pair. -/ +theorem solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimate + {d : ℕ} [NeZero d] {C : ℝ} + (hduality : ScalarSolutionComparisonDualityEstimate d C) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) : + solutionComparisonNegativeBesovLhs Q s a (scalarMatrix (d := d) sigma0) gradU gradV ≤ + C * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := by + have hbound := + hduality.2 Q sigma0 (fun x => gradU x - gradV x) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j + hsigma0 hs_pos hs_lt_one hcomparison.2 hcomparison.comparisonPair_solenoidal + rwa [solutionComparisonNegativeBesovLhs_eq_comparisonPair] + +/-- +Existence of the scalar direct duality constant gives the corrected +scalar-background Section 3.3.A duality surface. +-/ +theorem exists_scalarSolutionComparisonDualityConstant_of_scalarSolutionComparisonDualityEstimate + (d : ℕ) [NeZero d] + (hduality : ∃ C : ℝ, ScalarSolutionComparisonDualityEstimate d C) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ}, + 0 < sigma0 → + 0 < s → + s < 1 → + IsEllipticFieldOn lam Lam (cubeSet Q) a → + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV → + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV ≤ + C * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := by + rcases hduality with ⟨C, hC⟩ + refine ⟨C, hC.1, ?_⟩ + intro Q a sigma0 gradU gradV s j lam Lam hsigma0 hs_pos hs_lt_one _hEll + hcomparison + exact + solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimate + hC Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hcomparison + +/-- +Scalar-background duality apex for +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 2804--3008. + +The corrected route exposes the remaining analytic input directly: +`hdual` is the scalar solution-comparison duality estimate. No arbitrary-matrix +dimension-only theorem data is assumed here. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (_hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV ≤ + Cdual * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := + solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimate + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hcomparison + +/-- +Scalar-background duality bound with an arbitrary caller-supplied upper bound +on the localized flux defect. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_localizedFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s fluxDefectBound : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) + (hfluxDefectBound : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV ≤ + Cdual * s⁻¹ * fluxDefectBound := by + calc + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV + ≤ Cdual * s⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 gradU gradV j hsigma0 hs_pos hs_lt_one hEll hcomparison + _ ≤ Cdual * s⁻¹ * fluxDefectBound := by + exact mul_le_mul_of_nonneg_left hfluxDefectBound + (mul_nonneg hdual.1 (inv_nonneg.mpr hs_pos.le)) + +/-- +Scalar-background depth-zero duality bound from a direct one-cube negative +Besov bound on the flux defect, with nonnegativity supplied separately. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_cubeBesovNegativeFluxDefectBound_of_depth_zero_of_nonneg + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s fluxDefectBound : ℝ} + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) + (hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU)) + (hfluxDefectBound : + cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) gradU gradV ≤ + Cdual * s⁻¹ * fluxDefectBound := + solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_localizedFluxDefect_le + hdual Q a sigma0 gradU gradV 0 hsigma0 hs_pos hs_lt_one hEll hcomparison + (by + rw [localizedFluxDefectNegativeBesovAverageTwo_depth_zero_of_nonneg] + · exact hfluxDefectBound + · exact hdefect_nonneg) + +/-- +Scalar-background duality apex with the Section 3.3.B PDE hypotheses exposed +directly. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_sameRhs + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) {s : ℝ} (j : ℕ) + {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : + IsH1DirichletRhsWeakSolutionOn + (constantCoeffField (scalarMatrix (d := d) sigma0)) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) u.grad v.grad ≤ + Cdual * s⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) u.grad) j := + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 u.grad v.grad j hsigma0 hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + +/-- Scalar-background same-right-hand-side duality bound with a supplied +localized flux-defect upper bound. -/ +theorem solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_sameRhs_of_localizedFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + {s fluxDefectBound : ℝ} (j : ℕ) {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : + IsH1DirichletRhsWeakSolutionOn + (constantCoeffField (scalarMatrix (d := d) sigma0)) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hfluxDefectBound : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) u.grad) j ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) u.grad v.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := + solution_diff_l2_le_dualityConstant_mul_fluxDefectBound_of_localizedFluxDefect_le + hdual Q a sigma0 u.grad v.grad j hsigma0 hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + hfluxDefectBound + +/-- +Scalar-background same-right-hand-side depth-zero duality bound from a direct +one-cube negative Besov bound on the flux defect. +-/ +theorem solution_diff_l2_le_dualityConstant_mul_cubeBesovNegativeFluxDefectBound_of_sameRhs_of_depth_zero_of_nonneg + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) (g : Vec d → Vec d) + {s fluxDefectBound : ℝ} {lam Lam : ℝ} + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hv : + IsH1DirichletRhsWeakSolutionOn + (constantCoeffField (scalarMatrix (d := d) sigma0)) (cubeSet Q) v g) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) u.grad)) + (hfluxDefectBound : + cubeBesovNegativeVectorSeminormTwo Q s + (fluxDefect a (scalarMatrix (d := d) sigma0) u.grad) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a + (scalarMatrix (d := d) sigma0) u.grad v.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := + solution_diff_l2_le_dualityConstant_mul_cubeBesovNegativeFluxDefectBound_of_depth_zero_of_nonneg + hdual Q a sigma0 u.grad v.grad hsigma0 hs_pos hs_lt_one hEll + (IsHomogenizationComparisonPairOn.of_sameRhs_h1Functions + hEll (isEllipticMatrix_scalarMatrix hsigma0) u v g hu hv hzeroTrace) + hdefect_nonneg hfluxDefectBound + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityExponentLoss.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityExponentLoss.lean new file mode 100644 index 0000000000..0f13f0fb5f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityExponentLoss.lean @@ -0,0 +1,403 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.TerminalBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.Full +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.DualToCircLoss.FiniteLoss +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.NegativeBesovLocalize + +/-! # Duality Exponent Loss -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Exponent-loss Besov bridge + +This file contains the pure function-space exponent-loss bridge used by the +sharp-boundary scalar duality path. It consumes the Chapter 1 legacy +finite-truncation, totalized-real, disjoint/componentwise compatibility lane; +it is not an exact `ENNReal` source-norm bridge. +-/ + +/-- Geometric singular factor for the embedding +`B^{-t}_{2,2,dual} -> B^{-s}_{2,2,circ}`. + +The projection-test proof has singularities both at `t = 0` and at `s = t`. +This is definitionally the coefficient proved in Chapter 1's pure Besov +dual-to-circ bridge, repeated in the root namespace so deterministic theorem +surfaces do not mention book-facing names. -/ +noncomputable def besovExponentLossGap (s t : ℝ) : ℝ := + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (2 * (1 - Real.rpow (3 : ℝ) (-t))⁻¹) * + (1 - Real.rpow (3 : ℝ) (-(s - t)))⁻¹ + +theorem besovExponentLossGap_nonneg {s t : ℝ} (ht : 0 < t) (hts : t < s) : + 0 ≤ besovExponentLossGap s t := by + have hs : 0 < s := lt_trans ht hts + have hst : 0 < s - t := sub_pos.mpr hts + have hs_lt_one : + Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have ht_lt_one : + Real.rpow (3 : ℝ) (-t) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hst_lt_one : + Real.rpow (3 : ℝ) (-(s - t)) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + unfold besovExponentLossGap + exact add_nonneg + (inv_nonneg.mpr (sub_nonneg.mpr hs_lt_one.le)) + (mul_nonneg + (mul_nonneg (by norm_num) + (inv_nonneg.mpr (sub_nonneg.mpr ht_lt_one.le))) + (inv_nonneg.mpr (sub_nonneg.mpr hst_lt_one.le))) + +/-- Half-exponent specialization of the geometric gap. This is the +one-parameter loss used when the downstream theorem exposes only the larger +output exponent `s` and measures the localized flux defect at `s / 2`. -/ +theorem besovExponentLossGap_half_le_fiftyFive_inv_sq {s : ℝ} + (hs : 0 < s) (hs_lt : s < 1) : + besovExponentLossGap s (s / 2) ≤ 55 * (s⁻¹) ^ (2 : ℕ) := by + simpa [besovExponentLossGap, Book.Ch01.Legacy.dualToCircGeometricLossCoefficient] + using + Book.Ch01.Legacy.dualToCircGeometricLossCoefficient_half_le_fiftyFive_inv_sq + hs hs_lt.le + +/-- A zero-trace potential field has the `L²` membership supplied by its +`H¹₀` primitive. This local copy avoids importing the Ch1 public theorem layer +into the deterministic black-box namespace. -/ +theorem memVectorL2_of_isPotentialZeroTraceOn + {d : ℕ} {U : Set (Vec d)} {w : Vec d → Vec d} + (hw : IsPotentialZeroTraceOn U w) : + MemVectorL2 U w := by + rcases hw with ⟨u, hgrad⟩ + simpa [hgrad] using u.toH1Function.grad_memVectorL2 + +private theorem cubeBesovConjExponent_two_eq_dualityExponentLoss : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +private theorem cubeBesovConjExponent_two_ne_zero_dualityExponentLoss : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [cubeBesovConjExponent_two_eq_dualityExponentLoss] + norm_num + +private theorem cubeBesovConjExponent_two_ne_top_dualityExponentLoss : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [cubeBesovConjExponent_two_eq_dualityExponentLoss] + norm_num + +/-- Root-namespace version of the note-normalized vector genuine dual negative +Besov norm. This matches the Chapter 3 public definition but lives in the +deterministic black-box layer to avoid a reverse dependency on the book-facing +namespace. -/ +noncomputable def cubeScaleNormalizedDualNegativeBesovVectorNormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : ℝ := + cubeBesovScaleWeight s Q * + ∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + +theorem cubeScaleNormalizedDualNegativeBesovVectorNormTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) : + 0 ≤ cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q s F := by + unfold cubeScaleNormalizedDualNegativeBesovVectorNormTwo + refine mul_nonneg (cubeBesovScaleWeight_nonneg s Q) ?_ + exact Finset.sum_nonneg fun i _hi => + cubeBesovDualFullNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + cubeBesovConjExponent_two_ne_zero_dualityExponentLoss + cubeBesovConjExponent_two_ne_top_dualityExponentLoss + +/-- Localized descendant `ℓ²` average of note-normalized vector genuine-dual +negative Besov norms. -/ +noncomputable def localizedScaleNormalizedDualNegativeBesovVectorAverageTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : ℝ := + Real.sqrt <| + descendantsAverage Q j fun R => + (cubeScaleNormalizedDualNegativeBesovVectorNormTwo R s F) ^ 2 + +theorem localizedScaleNormalizedDualNegativeBesovVectorAverageTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q s F j := by + unfold localizedScaleNormalizedDualNegativeBesovVectorAverageTwo + exact Real.sqrt_nonneg _ + +private theorem cubeBesovScaleWeight_mul_component_localizedDualAverage_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) (i : Fin d) : + cubeBesovScaleWeight s Q * + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2) ≤ + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q s F j := by + classical + let wQ : ℝ := cubeBesovScaleWeight s Q + let a : ℝ := Real.rpow (3 : ℝ) (s * (j : ℝ)) + have hwQ_nonneg : 0 ≤ wQ := by + dsimp [wQ] + exact cubeBesovScaleWeight_nonneg s Q + have ha_nonneg : 0 ≤ a := by + dsimp [a] + exact Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) _ + have havg_nonneg : + 0 ≤ descendantsAverage Q j fun R => + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2 := by + exact descendantsAverage_nonneg Q j _ fun R _hR => sq_nonneg _ + unfold localizedScaleNormalizedDualNegativeBesovVectorAverageTwo + refine Real.le_sqrt_of_sq_le ?_ + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, + wQ ^ 2 * + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2 ≤ + (cubeScaleNormalizedDualNegativeBesovVectorNormTwo R s F) ^ 2 := by + intro R hR + have hscale : + cubeBesovScaleWeight s R = wQ * a := by + dsimp [wQ, a] + exact cubeBesovScaleWeight_eq_mul_rpow_of_mem_descendantsAtDepth + (Q := Q) (R := R) (j := j) s hR + have hdual_nonneg : + ∀ k : Fin d, + 0 ≤ cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x k) := by + intro k + exact cubeBesovDualFullNorm_nonneg R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x k) + cubeBesovConjExponent_two_ne_zero_dualityExponentLoss + cubeBesovConjExponent_two_ne_top_dualityExponentLoss + have hsingle : + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) ≤ + ∑ k : Fin d, + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x k) := + Finset.single_le_sum (fun k _hk => hdual_nonneg k) (Finset.mem_univ i) + have hleft_nonneg : + 0 ≤ wQ * a * + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) := by + exact mul_nonneg (mul_nonneg hwQ_nonneg ha_nonneg) (hdual_nonneg i) + have hleft_le : + wQ * a * + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) ≤ + cubeScaleNormalizedDualNegativeBesovVectorNormTwo R s F := by + unfold cubeScaleNormalizedDualNegativeBesovVectorNormTwo + rw [hscale] + exact mul_le_mul_of_nonneg_left hsingle (mul_nonneg hwQ_nonneg ha_nonneg) + calc + wQ ^ 2 * + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2 = + (wQ * a * + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2 := by + ring + _ ≤ (cubeScaleNormalizedDualNegativeBesovVectorNormTwo R s F) ^ 2 := + pow_le_pow_left₀ hleft_nonneg hleft_le 2 + calc + (wQ * + Real.sqrt + (descendantsAverage Q j fun R => + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2)) ^ 2 + = + wQ ^ 2 * + (Real.sqrt + (descendantsAverage Q j fun R => + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2)) ^ 2 := by + ring + _ = + wQ ^ 2 * + descendantsAverage Q j (fun R => + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2) := by + rw [Real.sq_sqrt havg_nonneg] + _ = + descendantsAverage Q j (fun R => + wQ ^ 2 * + (a * cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2) := by + rw [descendantsAverage_mul_left] + _ ≤ + descendantsAverage Q j fun R => + (cubeScaleNormalizedDualNegativeBesovVectorNormTwo R s F) ^ 2 := + descendantsAverage_le_descendantsAverage Q j hpoint + +/-- Componentwise Ch1 negative localization, repackaged for the deterministic +note-normalized vector full-dual norm. -/ +theorem cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_card_mul_negativeBesovLocalizeConstant_mul_localizedAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hs : 0 < s) + (hF : MemVectorL2 (cubeSet Q) F) : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q s F ≤ + (Fintype.card (Fin d) : ℝ) * Book.Ch01.Legacy.negativeBesovLocalizeConstant d * + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q s F j := by + classical + let C : ℝ := Book.Ch01.Legacy.negativeBesovLocalizeConstant d + let L : ℝ := localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q s F j + have hC_nonneg : 0 ≤ C := by + dsimp [C, Book.Ch01.Legacy.negativeBesovLocalizeConstant] + norm_num + have hwQ_nonneg : 0 ≤ cubeBesovScaleWeight s Q := + cubeBesovScaleWeight_nonneg s Q + have hcomp : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + Book.Ch01.Legacy.component_memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 + Q hF + unfold cubeScaleNormalizedDualNegativeBesovVectorNormTwo + calc + cubeBesovScaleWeight s Q * + ∑ i : Fin d, + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + = + ∑ i : Fin d, + cubeBesovScaleWeight s Q * + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) := by + rw [Finset.mul_sum] + _ ≤ + ∑ _i : Fin d, C * L := by + refine Finset.sum_le_sum ?_ + intro i _hi + let S : ℝ := + Real.sqrt + (descendantsAverage Q j fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovDualFullNorm R s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i)) ^ 2) + have hscalar : + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) ≤ + C * S := by + dsimp [C, S] + simpa [Book.Ch01.Legacy.dualNegativeBesovNorm] using + Book.Ch01.Legacy.negativeBesovFullLocalize_of_memLp + Q s (fun x => F x i) j hs (hcomp i) + have hlocal : + cubeBesovScaleWeight s Q * S ≤ L := by + dsimp [S, L] + exact cubeBesovScaleWeight_mul_component_localizedDualAverage_le + Q s F j i + calc + cubeBesovScaleWeight s Q * + cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => F x i) + ≤ cubeBesovScaleWeight s Q * (C * S) := + mul_le_mul_of_nonneg_left hscalar hwQ_nonneg + _ = C * (cubeBesovScaleWeight s Q * S) := by + ring + _ ≤ C * L := + mul_le_mul_of_nonneg_left hlocal hC_nonneg + _ = + (Fintype.card (Fin d) : ℝ) * Book.Ch01.Legacy.negativeBesovLocalizeConstant d * + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q s F j := by + dsimp [C, L] + simp [Finset.sum_const, nsmul_eq_mul, mul_assoc] + +/-- Pure function-space bridge: concrete/circ negative Besov at the larger +exponent `s` is controlled by genuine dual negative Besov at the smaller +exponent `t`. -/ +def ConcreteNegativeFromDualExponentLoss + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (F : Vec d → Vec d) {s t : ℝ}, + 0 < t → + t < s → + s < 1 → + MemVectorL2 (cubeSet Q) F → + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + C * besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t F + +/-- The pure Chapter 1 dual-to-circ theorem realizes the deterministic +exponent-loss bridge with unit prefactor. -/ +theorem concreteNegativeFromDualExponentLoss_geometric + (d : ℕ) [NeZero d] : + ConcreteNegativeFromDualExponentLoss d 1 := by + refine ⟨by norm_num, ?_⟩ + intro Q F s t ht hts _hs_lt_one hF + have hs : 0 < s := lt_trans ht hts + have hcomp : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + Book.Ch01.Legacy.component_memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet_ch1 + Q hF + have h := + Book.Ch01.Legacy.cubeBesovNegativeVectorSeminormTwo_le_dualToCircGeometricLossCoefficient_mul_normalizedDual + Q F hs ht hts hcomp + simpa [besovExponentLossGap, cubeScaleNormalizedDualNegativeBesovVectorNormTwo, + Book.Ch01.Legacy.dualToCircGeometricLossCoefficient, + Book.Ch01.Legacy.normalizedDualNegativeBesovVectorNormTwo, + Book.Ch01.Legacy.dualNegativeBesovNorm] using h + +/-- Localized concrete/circ consequence of the exponent-loss bridge and Ch1 +negative Besov localization. + +This is the downstream-facing form: the parent concrete negative Besov seminorm +is controlled by the descendant RMS of note-normalized vector full-dual norms at +the lower exponent. -/ +theorem cubeBesovNegativeVectorSeminormTwo_le_localizedDualAverage_exponentLoss + {d : ℕ} [NeZero d] (Q : TriadicCube d) (F : Vec d → Vec d) + {s t : ℝ} (j : ℕ) + (ht : 0 < t) (hts : t < s) (hs_lt_one : s < 1) + (hF : MemVectorL2 (cubeSet Q) F) : + cubeBesovNegativeVectorSeminormTwo Q s F ≤ + ((Fintype.card (Fin d) : ℝ) * Book.Ch01.Legacy.negativeBesovLocalizeConstant d) * + besovExponentLossGap s t * + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q t F j := by + have hdual := + (concreteNegativeFromDualExponentLoss_geometric d).2 Q F ht hts hs_lt_one hF + have hlocalized := + cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_card_mul_negativeBesovLocalizeConstant_mul_localizedAverage + Q t F j ht hF + have hgap_nonneg : 0 ≤ besovExponentLossGap s t := + besovExponentLossGap_nonneg ht hts + calc + cubeBesovNegativeVectorSeminormTwo Q s F + ≤ + 1 * besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t F := hdual + _ = + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t F := by + ring + _ ≤ + besovExponentLossGap s t * + ((Fintype.card (Fin d) : ℝ) * Book.Ch01.Legacy.negativeBesovLocalizeConstant d * + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q t F j) := + mul_le_mul_of_nonneg_left hlocalized hgap_nonneg + _ = + ((Fintype.card (Fin d) : ℝ) * Book.Ch01.Legacy.negativeBesovLocalizeConstant d) * + besovExponentLossGap s t * + localizedScaleNormalizedDualNegativeBesovVectorAverageTwo Q t F j := by + ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge.lean new file mode 100644 index 0000000000..b7d3cfc667 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge.lean @@ -0,0 +1,523 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.CoordinateStandard + +/-! # Duality Positive Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Positive-test bridge helper lemmas + +This file contains the shared PDE identity and full-dual bookkeeping lemmas +used by the sharp-boundary scalar duality assembly. The old all-exponent +coordinate bridge route has been removed from the active code path. +-/ + +private theorem cubeBesovConjExponent_two_eq_positiveBridge : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +private theorem cubeBesovConjExponent_two_ne_zero_positiveBridge : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + rw [cubeBesovConjExponent_two_eq_positiveBridge] + norm_num + +private theorem cubeBesovConjExponent_two_ne_top_positiveBridge : + cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [cubeBesovConjExponent_two_eq_positiveBridge] + norm_num + +/-- +Componentwise scalar full-dual pairing bounds control the note-normalized +vector genuine-dual negative Besov norm. + +This is the bookkeeping supremum step used by the restored deterministic +duality proof: after the PDE identity bounds each scalar component against +every unit full-dual test, the vector norm is obtained by summing over +coordinates and multiplying by the parent scale weight. +-/ +theorem cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_of_forall_component_fullTest_pairing_le + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) + {B : Fin d → ℝ} + (hB : + ∀ (i : Fin d) (g : Vec d → ℝ), + CubeBesovDualFullTest Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + |cubeBesovPairing Q (fun x => F x i) g| ≤ B i) : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t F ≤ + cubeBesovScaleWeight t Q * ∑ i : Fin d, B i := by + unfold cubeScaleNormalizedDualNegativeBesovVectorNormTwo + refine mul_le_mul_of_nonneg_left ?_ (cubeBesovScaleWeight_nonneg t Q) + refine Finset.sum_le_sum ?_ + intro i _hi + exact + cubeBesovDualFullNorm_le_of_forall_fullTest_pairing_le + Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => F x i) + cubeBesovConjExponent_two_ne_zero_positiveBridge + cubeBesovConjExponent_two_ne_top_positiveBridge + (fun g hg => hB i g hg) + +/-- +Uniform scalar full-dual pairing bounds control the note-normalized vector +genuine-dual negative Besov norm with the expected coordinate-cardinality +factor. +-/ +theorem cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_card_mul_of_forall_component_fullTest_pairing_le + {d : ℕ} (Q : TriadicCube d) (t : ℝ) (F : Vec d → Vec d) {B : ℝ} + (hB : + ∀ (i : Fin d) (g : Vec d → ℝ), + CubeBesovDualFullTest Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + |cubeBesovPairing Q (fun x => F x i) g| ≤ B) : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t F ≤ + cubeBesovScaleWeight t Q * ((Fintype.card (Fin d) : ℝ) * B) := by + have h := + cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_of_forall_component_fullTest_pairing_le + (Q := Q) (t := t) (F := F) (B := fun _ : Fin d => B) + (fun i g hg => hB i g hg) + simpa [Finset.sum_const, nsmul_eq_mul, Fintype.card_fin] using h + +/-- Any normalized-cube `L²` vector datum has a zero-trace weak solution to the +Dirichlet divergence problem on the corresponding open cube. -/ +theorem exists_cubeDirichletDivergenceProblem_of_memLp_normalizedCubeMeasure + {d : ℕ} [NeZero d] {Q : TriadicCube d} {h : Vec d → Vec d} + (hh : MeasureTheory.MemLp h (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∃ w : H10Function (openCubeSet Q), + CubeDirichletDivergenceProblem Q w h := by + let U : Set (Vec d) := openCubeSet Q + let a : CoeffField d := identityCoeffField d + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [U, volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (by simpa [U] using isOpenBoundedConvexDomain_openCubeSet Q) + have hEll : IsEllipticFieldOn 1 1 U a := by + simpa [a] using isEllipticFieldOn_identityCoeffField + (d := d) (U := U) (by simpa [U] using measurableSet_openCubeSet Q) + have hhOpen : MemVectorL2 U h := by + simpa [U] using memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hh + have hneg : MemVectorL2 U (fun x => -h x) := by + simpa [Pi.neg_apply] using! hhOpen.neg + rcases + exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := fun x => -h x) + (lam := 1) (Lam := 1) + hneg hRealize + (by simpa [U] using openCubeSet_nonempty_internal Q) hEll + with ⟨w, hw⟩ + refine ⟨w, ?_⟩ + intro φ + have hsol := hw φ + have hleft : + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [a, matVecMul_identityCoeffField] + have hright : + ∫ x in openCubeSet Q, + vecDot ((fun x => -h x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (h x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot ((fun x => -h x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + -vecDot (h x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [vecDot_neg_left] + _ = + -∫ x in openCubeSet Q, + vecDot (h x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + calc + ∫ x in openCubeSet Q, + vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + vecDot (matVecMul (a x) (w.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume := hleft.symm + _ = + ∫ x in openCubeSet Q, + vecDot ((fun x => -h x) x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [U] using hsol + _ = + -∫ x in openCubeSet Q, + vecDot (h x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := hright + +/-- +Weak-form identity behind the scalar-background solution-comparison duality +argument. + +If `v` solves the Dirichlet divergence problem with datum `h`, `w` is a +zero-trace potential field, and `sigma0 w + F` is solenoidal, then the pairing +of the scalar-background comparison field `sigma0 w` against `h` is equal to +the pairing of the flux defect `F` against the dual solution gradient. +-/ +theorem dirichletDivergence_solutionComparison_integral_identity + {d : ℕ} [NeZero d] {Q : TriadicCube d} {sigma0 : ℝ} + {w F h : Vec d → Vec d} {v : H10Function (openCubeSet Q)} + (hF : MemVectorL2 (cubeSet Q) F) + (hdiv : CubeDirichletDivergenceProblem Q v h) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x)) : + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + have hwOpen : IsPotentialZeroTraceOn (openCubeSet Q) w := + isPotentialZeroTraceOn_openCubeSet_triadicCube_of_cubeSet hw + rcases hwOpen with ⟨u, hu⟩ + have hwL2Open : MemVectorL2 (openCubeSet Q) w := + memVectorL2_of_isPotentialZeroTraceOn ⟨u, hu⟩ + have hFOpen : MemVectorL2 (openCubeSet Q) F := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hF + have hSigmaL2Open : + MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) := by + simpa [matVecMul_scalarMatrix] using! hwL2Open.const_smul sigma0 + have hSigmaVInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) + (v.toH1Function.grad x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hSigmaL2Open v.toH1Function.grad_memVectorL2 + have hFVInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (v.toH1Function.grad x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hFOpen v.toH1Function.grad_memVectorL2 + have hsolOpen : + IsSolenoidalOn (openCubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) := + isSolenoidalOn_openCubeSet_triadicCube_of_cubeSet hsol + have hsolv := hsolOpen v + have hsolSplit : + (∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) + (v.toH1Function.grad x) ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume = 0 := by + rw [← MeasureTheory.integral_add hSigmaVInt hFVInt] + simpa [Pi.add_apply, vecDot_add_left] using hsolv + have hdivu := hdiv u + have hdivw : + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (w x) ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, vecDot (h x) (w x) ∂MeasureTheory.volume := by + simpa [hu] using hdivu + have hleft_smul : + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume = + sigma0 * + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + sigma0 * vecDot (w x) (h x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [matVecMul_scalarMatrix, vecDot_smul_left] + _ = + sigma0 * + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hwh_comm : + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (h x) (w x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + exact vecDot_comm (w x) (h x) + have hvw_comm : + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (w x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + exact vecDot_comm (v.toH1Function.grad x) (w x) + have hhw_eq_neg : + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + linarith + have hsolScalar : + sigma0 * + (∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume = 0 := by + have hSigmaV : + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) + (v.toH1Function.grad x) ∂MeasureTheory.volume = + sigma0 * + ∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) + (v.toH1Function.grad x) ∂MeasureTheory.volume + = + ∫ x in openCubeSet Q, + sigma0 * vecDot (w x) (v.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [matVecMul_scalarMatrix, vecDot_smul_left] + _ = + sigma0 * + ∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + linarith + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume + = + sigma0 * + ∫ x in openCubeSet Q, vecDot (w x) (h x) ∂MeasureTheory.volume := + hleft_smul + _ = + -sigma0 * + ∫ x in openCubeSet Q, + vecDot (w x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [hhw_eq_neg] + ring + _ = + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume := by + linarith + +/-- +Companion weak-form identity for the flux-comparison field `sigma0 w + F`. +After the previous identity, the extra term is exactly the direct pairing of +the flux defect `F` with the input dual datum `h`. +-/ +theorem dirichletDivergence_fluxComparison_integral_identity + {d : ℕ} [NeZero d] {Q : TriadicCube d} {sigma0 : ℝ} + {w F h : Vec d → Vec d} {v : H10Function (openCubeSet Q)} + (hF : MemVectorL2 (cubeSet Q) F) + (hh : MemVectorL2 (openCubeSet Q) h) + (hdiv : CubeDirichletDivergenceProblem Q v h) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x)) : + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) (h x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x + h x) ∂MeasureTheory.volume := by + have hmain := + dirichletDivergence_solutionComparison_integral_identity + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) (h := h) (v := v) + hF hdiv hw hsol + have hwOpen : IsPotentialZeroTraceOn (openCubeSet Q) w := + isPotentialZeroTraceOn_openCubeSet_triadicCube_of_cubeSet hw + rcases hwOpen with ⟨u, hu⟩ + have hwL2Open : MemVectorL2 (openCubeSet Q) w := + memVectorL2_of_isPotentialZeroTraceOn ⟨u, hu⟩ + have hFOpen : MemVectorL2 (openCubeSet Q) F := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hF + have hSigmaL2Open : + MemVectorL2 (openCubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) := by + simpa [matVecMul_scalarMatrix] using! hwL2Open.const_smul sigma0 + have hSigmaHInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x)) + (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hSigmaL2Open hh + have hFHInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (h x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hFOpen hh + have hFVInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (v.toH1Function.grad x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hFOpen v.toH1Function.grad_memVectorL2 + have hleft_split : + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) (h x) + ∂MeasureTheory.volume = + (∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, vecDot (F x) (h x) ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_add hSigmaHInt hFHInt] + simp [vecDot_add_left] + have hright_split : + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x + h x) ∂MeasureTheory.volume = + (∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, vecDot (F x) (h x) ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_add hFVInt hFHInt] + simp [vecDot_add_right] + calc + ∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) (h x) + ∂MeasureTheory.volume + = + (∫ x in openCubeSet Q, + vecDot (matVecMul (scalarMatrix (d := d) sigma0) (w x)) (h x) + ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, vecDot (F x) (h x) ∂MeasureTheory.volume := + hleft_split + _ = + (∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x) ∂MeasureTheory.volume) + + ∫ x in openCubeSet Q, vecDot (F x) (h x) ∂MeasureTheory.volume := by + rw [hmain] + _ = + ∫ x in openCubeSet Q, + vecDot (F x) (v.toH1Function.grad x + h x) ∂MeasureTheory.volume := + hright_split.symm + +theorem cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage Q f = + (cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume := by + unfold cubeAverage + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet] + +/-- Linearity of vector pairings in the test field, written for cube averages +over the open-cube representative. -/ +theorem cubeAverage_vecDot_add_right + {d : ℕ} (Q : TriadicCube d) (F H K : Vec d → Vec d) + (hF : MemVectorL2 (openCubeSet Q) F) + (hH : MemVectorL2 (openCubeSet Q) H) + (hK : MemVectorL2 (openCubeSet Q) K) : + cubeAverage Q (fun x => vecDot (F x) (H x + K x)) = + cubeAverage Q (fun x => vecDot (F x) (H x)) + + cubeAverage Q (fun x => vecDot (F x) (K x)) := by + have hFH : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (H x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hF hH + have hFK : + MeasureTheory.IntegrableOn + (fun x => vecDot (F x) (K x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hF hK + rw [cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet, + cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet, + cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet] + have hfun : + (fun x : Vec d => vecDot (F x) (H x + K x)) = + fun x => vecDot (F x) (H x) + vecDot (F x) (K x) := by + funext x + rw [vecDot_add_right] + rw [hfun, MeasureTheory.integral_add hFH hFK] + ring + +theorem abs_cubeAverage_vecDot_add_right_le + {d : ℕ} (Q : TriadicCube d) (F H K : Vec d → Vec d) + (hF : MemVectorL2 (openCubeSet Q) F) + (hH : MemVectorL2 (openCubeSet Q) H) + (hK : MemVectorL2 (openCubeSet Q) K) : + |cubeAverage Q (fun x => vecDot (F x) (H x + K x))| ≤ + |cubeAverage Q (fun x => vecDot (F x) (H x))| + + |cubeAverage Q (fun x => vecDot (F x) (K x))| := by + rw [cubeAverage_vecDot_add_right Q F H K hF hH hK] + exact abs_add_le _ _ + +/-- +Normalized `cubeBesovPairing` form of +`dirichletDivergence_solutionComparison_integral_identity`. +-/ +theorem cubeBesovPairing_solutionComparison_component_eq_cubeAverage_fluxDefect_dualGradient + {d : ℕ} [NeZero d] {Q : TriadicCube d} {sigma0 : ℝ} + {w F : Vec d → Vec d} {v : H10Function (openCubeSet Q)} + (i : Fin d) (g : Vec d → ℝ) + (hF : MemVectorL2 (cubeSet Q) F) + (hdiv : CubeDirichletDivergenceProblem Q v (coordinateVectorField i g)) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x)) : + cubeBesovPairing Q + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) i) g = + cubeAverage Q + (fun x => vecDot (F x) (v.toH1Function.grad x)) := by + rw [cubeBesovPairing_component_eq_cubeAverage_vecDot_coordinateVectorField] + rw [cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet, + cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet] + exact congrArg (fun I : ℝ => (cubeVolume Q)⁻¹ * I) + (dirichletDivergence_solutionComparison_integral_identity + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) + (h := coordinateVectorField i g) (v := v) hF hdiv hw hsol) + +/-- +Normalized `cubeBesovPairing` form of +`dirichletDivergence_fluxComparison_integral_identity`. +-/ +theorem cubeBesovPairing_fluxComparison_component_eq_cubeAverage_fluxDefect_dualGradient_add_coordinate + {d : ℕ} [NeZero d] {Q : TriadicCube d} {sigma0 s : ℝ} + {w F : Vec d → Vec d} {v : H10Function (openCubeSet Q)} + (i : Fin d) {g : Vec d → ℝ} + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) + (hF : MemVectorL2 (cubeSet Q) F) + (hdiv : CubeDirichletDivergenceProblem Q v (coordinateVectorField i g)) + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x)) : + cubeBesovPairing Q + (fun x => (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) i) g = + cubeAverage Q + (fun x => vecDot (F x) + (v.toH1Function.grad x + coordinateVectorField i g x)) := by + have hcoordLp : + MeasureTheory.MemLp (coordinateVectorField i g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two hg + have hcoordOpen : MemVectorL2 (openCubeSet Q) (coordinateVectorField i g) := + memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hcoordLp + rw [cubeBesovPairing_component_eq_cubeAverage_vecDot_coordinateVectorField] + rw [cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet, + cubeAverage_eq_inv_cubeVolume_mul_setIntegral_openCubeSet] + exact congrArg (fun I : ℝ => (cubeVolume Q)⁻¹ * I) + (dirichletDivergence_fluxComparison_integral_identity + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) + (h := coordinateVectorField i g) (v := v) hF hcoordOpen hdiv hw hsol) + +theorem cubeBesovScaleWeight_mul_neg_self {d : ℕ} (s : ℝ) (Q : TriadicCube d) : + cubeBesovScaleWeight s Q * cubeBesovScaleWeight (-s) Q = 1 := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add] + simp [cubeBesovScaleWeight] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/Contracts.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/Contracts.lean new file mode 100644 index 0000000000..552113c95e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/Contracts.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityExponentLoss +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison + +/-! # Contracts -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Positive-test bridge contracts + +The restored proof of the deterministic flux-defect duality lemma tests each +component of the solution-comparison field against a scalar unit full-dual +positive Besov test. To feed that test into the discrete compatibility +Dirichlet theorem, we insert the scalar test into one vector coordinate and +need the resulting vector field to be admissible for the overlapping positive +norm used by the discrete compatibility statement +`DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform` (not the +source theorem pending the continuum `K`/`H^s` gate). + +This file records that bridge with the true target norm. The `MemLp` part is +formal and proved here; the remaining analytic comparison is the finite-overlap +positive-localization estimate. +-/ + +/-- Insert a scalar field into one vector coordinate. -/ +def coordinateVectorField {d : ℕ} (i : Fin d) (g : Vec d → ℝ) : + Vec d → Vec d := + fun x j => if j = i then g x else 0 + +@[simp] theorem coordinateVectorField_same {d : ℕ} (i : Fin d) (g : Vec d → ℝ) + (x : Vec d) : + coordinateVectorField i g x i = g x := by + simp [coordinateVectorField] + +@[simp] theorem coordinateVectorField_of_ne {d : ℕ} {i j : Fin d} + (hji : j ≠ i) (g : Vec d → ℝ) (x : Vec d) : + coordinateVectorField i g x j = 0 := by + simp [coordinateVectorField, hji] + +@[simp] theorem vecDot_coordinateVectorField {d : ℕ} + (U : Vec d → Vec d) (i : Fin d) (g : Vec d → ℝ) (x : Vec d) : + vecDot (U x) (coordinateVectorField i g x) = U x i * g x := by + classical + simp [vecDot, coordinateVectorField] + +@[simp] theorem vecDot_coordinateVectorField_left {d : ℕ} + (U : Vec d → Vec d) (i : Fin d) (g : Vec d → ℝ) (x : Vec d) : + vecDot (coordinateVectorField i g x) (U x) = g x * U x i := by + rw [vecDot_comm, vecDot_coordinateVectorField] + ring + +/-- A scalar component pairing is the vector pairing against the corresponding +coordinate-inserted vector field. -/ +theorem cubeBesovPairing_component_eq_cubeAverage_vecDot_coordinateVectorField + {d : ℕ} (Q : TriadicCube d) (U : Vec d → Vec d) + (i : Fin d) (g : Vec d → ℝ) : + cubeBesovPairing Q (fun x => U x i) g = + cubeAverage Q (fun x => vecDot (U x) (coordinateVectorField i g x)) := by + unfold cubeBesovPairing + congr 1 + funext x + rw [vecDot_coordinateVectorField] + +/-- Unit full-dual tests at `p=q=2` are `L²`; inserting such a test into one +coordinate gives an `L²` vector field on the parent cube. -/ +theorem coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two + {d : ℕ} {Q : TriadicCube d} {s : ℝ} {i : Fin d} {g : Vec d → ℝ} + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + MeasureTheory.MemLp (coordinateVectorField i g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hgL2 : + MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hconj] using hg.memLp + refine MeasureTheory.MemLp.of_eval ?_ + intro j + by_cases hji : j = i + · subst j + simpa [coordinateVectorField] using hgL2 + · have hfun : (fun x : Vec d => coordinateVectorField i g x j) = + fun _ : Vec d => (0 : ℝ) := by + funext x + simp [coordinateVectorField, hji] + rw [hfun] + exact + (MeasureTheory.memLp_const (0 : ℝ) : + MeasureTheory.MemLp (fun _ : Vec d => (0 : ℝ)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) + +/-- +The remaining local analytic estimate in budget form. + +It pairs a flux-defect field `F` against any vector test field whose corrected +overlapping positive Besov norm is bounded by a caller-supplied budget `B`. +The explicit regularity hypothesis is part of the honest `sSup` interface: +without bounded positive partial sums, the full norm cannot be used to recover +finite-level test bounds. +The right side is the localized negative Besov flux-defect average times that +positive test budget, with the explicit `s⁻¹` loss from the LaTeX proof. +-/ +def LocalizedFluxDefectPositivePairingEstimate + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) {s : ℝ} (j : ℕ) + (F H : Vec d → Vec d) (B : ℝ), + 0 < s → + s < 1 → + MemVectorL2 (cubeSet Q) F → + CubeVectorOverlappingBesovHRegularity Q s H → + 0 ≤ B → + cubeBesovOverlappingPositiveVectorNormTwo Q s H ≤ B → + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ + C * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s F j * B + +theorem LocalizedFluxDefectPositivePairingEstimate.nonneg + {d : ℕ} [NeZero d] {C : ℝ} + (hpair : LocalizedFluxDefectPositivePairingEstimate d C) : + 0 ≤ C := + hpair.1 + +theorem LocalizedFluxDefectPositivePairingEstimate.bound + {d : ℕ} [NeZero d] {C : ℝ} + (hpair : LocalizedFluxDefectPositivePairingEstimate d C) + (Q : TriadicCube d) {s : ℝ} (j : ℕ) + (F H : Vec d → Vec d) (B : ℝ) + (hs : 0 < s) (hs_lt_one : s < 1) + (hF : MemVectorL2 (cubeSet Q) F) + (hHreg : CubeVectorOverlappingBesovHRegularity Q s H) (hB : 0 ≤ B) + (hH : cubeBesovOverlappingPositiveVectorNormTwo Q s H ≤ B) : + |cubeAverage Q (fun x => vecDot (F x) (H x))| ≤ + C * s⁻¹ * localizedFluxDefectNegativeBesovAverageTwo Q s F j * B := + hpair.2 Q j F H B hs hs_lt_one hF hHreg hB hH + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/CoordinateStandard.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/CoordinateStandard.lean new file mode 100644 index 0000000000..2d3a97aa0c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/CoordinateStandard.lean @@ -0,0 +1,405 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge.Contracts +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardProjectionSharpKernel +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise + +/-! # Coordinate Standard -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Coordinate full-dual tests and the standard positive norm + +This file separates the purely algebraic coordinate insertion step from the +remaining finite-overlap localization estimate. A scalar full-dual unit test +inserted into one coordinate has controlled ordinary positive vector Besov +norm; the still-analytic bridge is the passage from that ordinary norm to the +corrected overlapping norm used by the Dirichlet theorem. +-/ + +private theorem cubeBesovConjExponent_two_eq_coordinateStandard : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +@[simp] theorem cubeAverageVec_coordinateVectorField_same {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (g : Vec d → ℝ) : + cubeAverageVec Q (coordinateVectorField i g) i = cubeAverage Q g := by + simp [cubeAverageVec] + +@[simp] theorem cubeAverageVec_coordinateVectorField_of_ne {d : ℕ} + (Q : TriadicCube d) {i j : Fin d} (hji : j ≠ i) (g : Vec d → ℝ) : + cubeAverageVec Q (coordinateVectorField i g) j = 0 := by + have hzero : cubeAverage Q (fun _ : Vec d => (0 : ℝ)) = 0 := by + simpa using cubeAverage_const Q (0 : ℝ) + simp [cubeAverageVec, coordinateVectorField, hji, hzero] + +theorem cubeFluctuationVec_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (g : Vec d → ℝ) : + cubeFluctuationVec Q (coordinateVectorField i g) = + coordinateVectorField i (cubeFluctuation Q g) := by + funext x j + by_cases hji : j = i + · subst j + simp [cubeFluctuationVec, cubeFluctuation, cubeAverageVec] + · have hzero : cubeAverage Q (fun _ : Vec d => (0 : ℝ)) = 0 := by + simpa using cubeAverage_const Q (0 : ℝ) + simp [cubeFluctuationVec, cubeAverageVec, coordinateVectorField, hji, hzero] + +theorem norm_coordinateVectorField_apply {d : ℕ} + (i : Fin d) (g : Vec d → ℝ) (x : Vec d) : + ‖coordinateVectorField i g x‖ = ‖g x‖ := by + classical + refine le_antisymm ?_ ?_ + · refine (pi_norm_le_iff_of_nonneg (norm_nonneg (g x))).2 ?_ + intro j + by_cases hji : j = i + · subst j + simp [coordinateVectorField] + · simp [coordinateVectorField, hji] + · simpa [coordinateVectorField] using + norm_le_pi_norm (coordinateVectorField i g x) i + +theorem sq_cubeLpNorm_two_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (g : Vec d → ℝ) : + (cubeLpNorm Q (2 : ℝ≥0∞) (coordinateVectorField i g)) ^ 2 = + (cubeLpNorm Q (2 : ℝ≥0∞) g) ^ 2 := by + rw [cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal (E := Vec d), + cubeLpNorm_two_sq_eq_lintegral_rpow_enorm_toReal (E := ℝ)] + congr 1 + apply MeasureTheory.lintegral_congr + intro x + rw [← ofReal_norm, ← ofReal_norm, + norm_coordinateVectorField_apply] + +theorem cubeBesovPositiveVectorDepthAverage_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (g : Vec d → ℝ) (j : ℕ) : + cubeBesovPositiveVectorDepthAverage Q (coordinateVectorField i g) j = + cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j := by + classical + unfold cubeBesovPositiveVectorDepthAverage cubeBesovDepthAverage + congr 1 + funext R + rw [cubeFluctuationVec_coordinateVectorField] + simpa [cubeBesovOscillation, Real.rpow_natCast] using + sq_cubeLpNorm_two_coordinateVectorField R i (cubeFluctuation R g) + +theorem cubeBesovPositiveVectorDepthSeminorm_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (i : Fin d) (g : Vec d → ℝ) (j : ℕ) : + cubeBesovPositiveVectorDepthSeminorm Q s (coordinateVectorField i g) j = + cubeBesovScaleWeight (-s) Q * + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j := by + have hmul : + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q = 1 := + cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + unfold cubeBesovPositiveVectorDepthSeminorm cubeBesovDepthSeminorm + rw [cubeBesovPositiveVectorDepthAverage_coordinateVectorField Q i g j] + rw [cubeBesovDepthWeight_eq_scaleWeight_mul_rpow] + have hsqrt : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j ^ + (1 / ENNReal.toReal (2 : ℝ≥0∞)) = + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j) := by + rw [Real.sqrt_eq_rpow] + norm_num + rw [hsqrt] + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j) + = + (cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j)) := by + rw [hmul] + ring + _ = + cubeBesovScaleWeight (-s) Q * + (cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) g j)) := by + ring + +theorem cubeBesovPositiveVectorPartialSeminormTwo_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (i : Fin d) (g : Vec d → ℝ) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (coordinateVectorField i g) = + cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + calc + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveVectorDepthSeminorm Q s + (coordinateVectorField i g) j) ^ 2) + = + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovScaleWeight (-s) Q * + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j) ^ 2) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [cubeBesovPositiveVectorDepthSeminorm_coordinateVectorField] + _ = + cubeBesovScaleWeight (-s) Q * + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j) ^ 2) := by + exact sqrt_sum_sq_const_mul_eq_componentwise + (Finset.range (N + 1)) (cubeBesovScaleWeight (-s) Q) + (fun j => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j) + (cubeBesovScaleWeight_nonneg (-s) Q) + _ = + cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + unfold cubeBesovPartialSeminorm + rw [Real.sqrt_eq_rpow] + norm_num + +theorem cubeBesovPartialSeminorm_two_two_le_dualTestNorm_two_two {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (g : Vec d → ℝ) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + have hq : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [cubeBesovConjExponent_two_eq_coordinateStandard] + norm_num + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top Q s (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N g hq] + rw [cubeBesovConjExponent_two_eq_coordinateStandard] + unfold cubeBesovPartialNorm + exact le_add_of_nonneg_right + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) (norm_nonneg _)) + +theorem cubeBesovPositiveVectorPartialSeminormTwo_coordinateVectorField_le_scaleWeight_neg + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (N : ℕ) (i : Fin d) (g : Vec d → ℝ) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (coordinateVectorField i g) ≤ + cubeBesovScaleWeight (-s) Q := by + rw [cubeBesovPositiveVectorPartialSeminormTwo_coordinateVectorField] + calc + cubeBesovScaleWeight (-s) Q * + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g + ≤ + cubeBesovScaleWeight (-s) Q * + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g := by + exact mul_le_mul_of_nonneg_left + (cubeBesovPartialSeminorm_two_two_le_dualTestNorm_two_two Q s N g) + (cubeBesovScaleWeight_nonneg (-s) Q) + _ ≤ cubeBesovScaleWeight (-s) Q * 1 := by + exact mul_le_mul_of_nonneg_left (hg.1 N) + (cubeBesovScaleWeight_nonneg (-s) Q) + _ = cubeBesovScaleWeight (-s) Q := by ring + +theorem sqrt_vecNormSq_cubeAverageVec_coordinateVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (g : Vec d → ℝ) : + Real.sqrt (vecNormSq (cubeAverageVec Q (coordinateVectorField i g))) = + ‖cubeAverage Q g‖ := by + have hsq : + vecNormSq (cubeAverageVec Q (coordinateVectorField i g)) = + (cubeAverage Q g) ^ 2 := by + classical + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp [pow_two] + · intro j _hj hji + have hzero : cubeAverage Q (fun _ : Vec d => (0 : ℝ)) = 0 := by + simpa using cubeAverage_const Q (0 : ℝ) + simp [cubeAverageVec, coordinateVectorField, hji, hzero] + · simp + rw [hsq, Real.sqrt_sq_eq_abs, Real.norm_eq_abs] + +theorem norm_cubeAverage_le_scaleWeight_neg_of_cubeBesovDualFullTest_two_two + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (g : Vec d → ℝ) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + ‖cubeAverage Q g‖ ≤ cubeBesovScaleWeight (-s) Q := by + have hmean : + cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖ ≤ 1 := by + exact + (cubeBesovScaleWeight_mul_norm_cubeAverage_le_cubeBesovDualTestNorm + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) 0 g).trans (hg.1 0) + have hmul : + cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q = 1 := + cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight Q s + calc + ‖cubeAverage Q g‖ + = (cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + ‖cubeAverage Q g‖ := by + rw [hmul] + ring + _ = + cubeBesovScaleWeight (-s) Q * + (cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖) := by + ring + _ ≤ cubeBesovScaleWeight (-s) Q * 1 := by + exact mul_le_mul_of_nonneg_left hmean + (cubeBesovScaleWeight_nonneg (-s) Q) + _ = cubeBesovScaleWeight (-s) Q := by ring + +/-- Standard, non-overlapping version of the coordinate full-dual bridge. -/ +def UnitFullDualCoordinateStandardBridge + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) {s : ℝ} (i : Fin d) (g : Vec d → ℝ), + 0 < s → + s < 1 → + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + CubeVectorBesovHRegularity Q s (coordinateVectorField i g) ∧ + cubeBesovPositiveVectorNormTwo Q s (coordinateVectorField i g) ≤ + C * cubeBesovScaleWeight (-s) Q + +theorem unitFullDualCoordinateStandardBridge + (d : ℕ) [NeZero d] : + UnitFullDualCoordinateStandardBridge d 2 := by + refine ⟨by norm_num, ?_⟩ + intro Q s i g _hs _hs_lt_one hg + have hpartial : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (coordinateVectorField i g) ≤ + cubeBesovScaleWeight (-s) Q := by + intro N + exact + cubeBesovPositiveVectorPartialSeminormTwo_coordinateVectorField_le_scaleWeight_neg + Q N i g hg + have hreg : CubeVectorBesovHRegularity Q s (coordinateVectorField i g) := by + refine ⟨?_, ?_⟩ + · exact coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two hg + · exact ⟨cubeBesovScaleWeight (-s) Q, by + rintro x ⟨N, rfl⟩ + exact hpartial N⟩ + have hsem : + cubeBesovPositiveVectorSeminormTwo Q s (coordinateVectorField i g) ≤ + cubeBesovScaleWeight (-s) Q := + cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s + (coordinateVectorField i g) hpartial + have hmean : + Real.sqrt (vecNormSq (cubeAverageVec Q (coordinateVectorField i g))) ≤ + cubeBesovScaleWeight (-s) Q := by + rw [sqrt_vecNormSq_cubeAverageVec_coordinateVectorField] + exact norm_cubeAverage_le_scaleWeight_neg_of_cubeBesovDualFullTest_two_two + Q g hg + refine ⟨hreg, ?_⟩ + unfold cubeBesovPositiveVectorNormTwo + calc + Real.sqrt (vecNormSq (cubeAverageVec Q (coordinateVectorField i g))) + + cubeBesovPositiveVectorSeminormTwo Q s (coordinateVectorField i g) + ≤ cubeBesovScaleWeight (-s) Q + cubeBesovScaleWeight (-s) Q := + add_le_add hmean hsem + _ = 2 * cubeBesovScaleWeight (-s) Q := by ring + +/-- +Low-exponent coordinate bridge with the sharp-boundary loss displayed in the +RHS. It is only required for `s < 1/2`, exactly the summability range of the +sharp boundary kernel. +-/ +def UnitFullDualCoordinateOverlappingBridgeSharpLoss + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) {s : ℝ} (i : Fin d) (g : Vec d → ℝ), + 0 < s → + s < 1 / 2 → + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + CubeVectorOverlappingBesovHRegularity Q s (coordinateVectorField i g) ∧ + cubeBesovOverlappingPositiveVectorNormTwo Q s (coordinateVectorField i g) ≤ + C * (1 + Real.sqrt (sharpBoundaryKernelLoss d s)) * + cubeBesovScaleWeight (-s) Q + +/-- +Low-exponent coordinate bridge supplied by the sharp-boundary comparison. + +This is the honest replacement for the old uniform all-exponents overlap +bridge: it works for `s < 1/2`, carries the explicit sharp-boundary loss, and +keeps the overlap-cube `MemLp` closure package as an input. +-/ +theorem unitFullDualCoordinateOverlappingBridge_sharpBoundaryKernel + {d : ℕ} [NeZero d] (Q : TriadicCube d) {s : ℝ} + (i : Fin d) (g : Vec d → ℝ) + (hs : 0 < s) (hs_lt_half : s < 1 / 2) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) + (hmem : SharpBoundaryProjectionMemLp Q (coordinateVectorField i g)) : + CubeVectorOverlappingBesovHRegularity Q s (coordinateVectorField i g) ∧ + cubeBesovOverlappingPositiveVectorNormTwo Q s (coordinateVectorField i g) ≤ + (2 * (1 + Real.sqrt (sharpBoundaryKernelLoss d s))) * + cubeBesovScaleWeight (-s) Q := by + have hs_lt_one : s < 1 := by nlinarith + rcases + (unitFullDualCoordinateStandardBridge d).2 Q i g hs hs_lt_one hg with + ⟨hstdReg, hstdNorm⟩ + have hoverReg : + CubeVectorOverlappingBesovHRegularity Q s (coordinateVectorField i g) := + CubeVectorOverlappingBesovHRegularity.of_sharpBoundaryKernel + hs_lt_half hstdReg hmem + have hoverNorm : + cubeBesovOverlappingPositiveVectorNormTwo Q s (coordinateVectorField i g) ≤ + (1 + Real.sqrt (sharpBoundaryKernelLoss d s)) * + cubeBesovPositiveVectorNormTwo Q s (coordinateVectorField i g) := + cubeBesovOverlappingPositiveVectorNormTwo_le_one_add_sqrt_sharpBoundaryKernel + Q s (coordinateVectorField i g) hs_lt_half hstdReg hmem + refine ⟨hoverReg, ?_⟩ + have hfactor_nonneg : + 0 ≤ 1 + Real.sqrt (sharpBoundaryKernelLoss d s) := by + positivity + calc + cubeBesovOverlappingPositiveVectorNormTwo Q s (coordinateVectorField i g) + ≤ + (1 + Real.sqrt (sharpBoundaryKernelLoss d s)) * + cubeBesovPositiveVectorNormTwo Q s (coordinateVectorField i g) := + hoverNorm + _ ≤ + (1 + Real.sqrt (sharpBoundaryKernelLoss d s)) * + (2 * cubeBesovScaleWeight (-s) Q) := by + exact mul_le_mul_of_nonneg_left hstdNorm hfactor_nonneg + _ = + (2 * (1 + Real.sqrt (sharpBoundaryKernelLoss d s))) * + cubeBesovScaleWeight (-s) Q := by ring + +/-- Coordinate full-dual tests satisfy the `MemLp` closure package needed by +the sharp-boundary standard-to-overlap comparison. -/ +theorem sharpBoundaryProjectionMemLp_coordinateVectorField_of_cubeBesovDualFullTest_two_two + {d : ℕ} {Q : TriadicCube d} {s : ℝ} + (i : Fin d) (g : Vec d → ℝ) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + SharpBoundaryProjectionMemLp Q (coordinateVectorField i g) := + SharpBoundaryProjectionMemLp.of_memLp + (coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two hg) + +/-- The sharp-boundary coordinate bridge follows once the overlap-cube `MemLp` +closure package is available for coordinate full-dual tests. -/ +theorem UnitFullDualCoordinateOverlappingBridgeSharpLoss.of_sharpBoundaryMemLp + {d : ℕ} [NeZero d] + (hmem : + ∀ (Q : TriadicCube d) {s : ℝ} (i : Fin d) (g : Vec d → ℝ), + 0 < s → + s < 1 / 2 → + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + SharpBoundaryProjectionMemLp Q (coordinateVectorField i g)) : + UnitFullDualCoordinateOverlappingBridgeSharpLoss d 2 := by + refine ⟨by norm_num, ?_⟩ + intro Q s i g hs hs_lt_half hg + have h := + unitFullDualCoordinateOverlappingBridge_sharpBoundaryKernel + Q i g hs hs_lt_half hg (hmem Q i g hs hs_lt_half hg) + simpa [mul_assoc] using h + +/-- Closed sharp-boundary coordinate full-dual bridge. -/ +theorem unitFullDualCoordinateOverlappingBridgeSharpLoss + (d : ℕ) [NeZero d] : + UnitFullDualCoordinateOverlappingBridgeSharpLoss d 2 := + UnitFullDualCoordinateOverlappingBridgeSharpLoss.of_sharpBoundaryMemLp + (fun _Q _s i g _hs _hs_lt_half hg => + sharpBoundaryProjectionMemLp_coordinateVectorField_of_cubeBesovDualFullTest_two_two + i g hg) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/SharpLoss.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/SharpLoss.lean new file mode 100644 index 0000000000..8dc03128e1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/DualityPositiveBridge/SharpLoss.lean @@ -0,0 +1,922 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge + +/-! # Sharp Loss -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Sharp-loss positive-test route + +This file keeps the honest low-exponent sharp-boundary loss visible in the +scalar duality assembly. The bridge is only used for exponents below `1/2`, +and the public RHS carries the corresponding factor +`1 + sqrt (sharpBoundaryKernelLoss d t)`. +-/ + +/-- Genuine-dual solution-comparison estimate with the sharp boundary loss +shown explicitly. -/ +def ScalarSolutionComparisonGenuineDualityEstimateSharpLoss + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {t : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < t → + t < 1 / 2 → + MemVectorL2 (cubeSet Q) F → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + C * (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * t⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t F j + +/-- One-parameter concrete/circ scalar duality estimate with the flux defect +measured at `s / 2` and the sharp-boundary bridge loss displayed. -/ +def ScalarSolutionComparisonDualityEstimateHalfExponentSharpLoss + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {s : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < s → + s < 1 → + MemVectorL2 (cubeSet Q) F → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + C * (1 + Real.sqrt (sharpBoundaryKernelLoss d (s / 2))) * + (s⁻¹) ^ (3 : ℕ) * + localizedFluxDefectNegativeBesovAverageTwo Q (s / 2) F j + +/-- Two-exponent concrete/circ scalar duality estimate with the manuscript +loss `s^{-1} t^{-2} (1/2 - t)^{-1}`. -/ +def ScalarSolutionComparisonDualityEstimateExponentLoss + (d : ℕ) [NeZero d] (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {s t : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < s → + 0 < t → + t < s / 2 → + s < 1 → + MemVectorL2 (cubeSet Q) F → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + C * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t F j + +/-- Dimension-only constant bounding the sharp-boundary loss by the displayed +`(1/2 - t)^{-1}` singularity. -/ +noncomputable def sharpBoundaryKernelNoteConstant (d : ℕ) : ℝ := + 1 + Real.sqrt (8 * (3 ^ d : ℝ) + + 100 * (sharpBoundaryKernelConstant d) ^ (2 : ℕ)) + +theorem sharpBoundaryKernelNoteConstant_nonneg (d : ℕ) : + 0 ≤ sharpBoundaryKernelNoteConstant d := by + unfold sharpBoundaryKernelNoteConstant + positivity + +theorem one_add_sqrt_sharpBoundaryKernelLoss_le_noteConstant + {d : ℕ} [NeZero d] {t : ℝ} + (ht : 0 < t) (ht_lt_half : t < 1 / 2) : + 1 + Real.sqrt (sharpBoundaryKernelLoss d t) ≤ + sharpBoundaryKernelNoteConstant d * ((1 / 2 : ℝ) - t)⁻¹ := by + let r : ℝ := (1 / 2 : ℝ) - t + let A : ℝ := 8 * (3 ^ d : ℝ) + + 100 * (sharpBoundaryKernelConstant d) ^ (2 : ℕ) + have hr_pos : 0 < r := by + dsimp [r] + linarith + have hr_le_one : r ≤ 1 := by + dsimp [r] + linarith + have hr_inv_nonneg : 0 ≤ r⁻¹ := inv_nonneg.mpr hr_pos.le + have hr_inv_ge_one : 1 ≤ r⁻¹ := (one_le_inv₀ hr_pos).2 hr_le_one + have hr_inv_sq_ge_one : 1 ≤ (r⁻¹) ^ (2 : ℕ) := by + simpa using + (pow_le_pow_left₀ (by norm_num : 0 ≤ (1 : ℝ)) hr_inv_ge_one 2) + have hbase_eq : sharpBoundaryKernelBase d t = Real.rpow (3 : ℝ) (-r) := by + rw [sharpBoundaryKernelBase_eq] + congr 1 + dsimp [r] + ring + have hinv_le : + (1 - sharpBoundaryKernelBase d t)⁻¹ ≤ 5 * r⁻¹ := by + rw [hbase_eq] + exact inv_one_sub_rpow_three_neg_le_five_inv hr_pos hr_le_one + have hbase_lt_one : sharpBoundaryKernelBase d t < 1 := + sharpBoundaryKernelBase_lt_one (d := d) (t := t) ht_lt_half + have hinv_nonneg : + 0 ≤ (1 - sharpBoundaryKernelBase d t)⁻¹ := + inv_nonneg.mpr (sub_nonneg.mpr hbase_lt_one.le) + have hinv_sq_le : + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ (2 : ℕ) ≤ + (5 * r⁻¹) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hinv_nonneg hinv_le 2 + have hK_nonneg : 0 ≤ sharpBoundaryKernelConstant d := + sharpBoundaryKernelConstant_nonneg d + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hloss_le : + sharpBoundaryKernelLoss d t ≤ A * (r⁻¹) ^ (2 : ℕ) := by + unfold sharpBoundaryKernelLoss + dsimp [A] + calc + 8 * (3 ^ d : ℝ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + ((1 - sharpBoundaryKernelBase d t)⁻¹) ^ 2 + ≤ + 8 * (3 ^ d : ℝ) * (r⁻¹) ^ (2 : ℕ) + + (4 * (sharpBoundaryKernelConstant d) ^ 2) * + (5 * r⁻¹) ^ (2 : ℕ) := by + have hfirst : + 8 * (3 ^ d : ℝ) ≤ + 8 * (3 ^ d : ℝ) * (r⁻¹) ^ (2 : ℕ) := by + have hcoeff_nonneg : 0 ≤ 8 * (3 ^ d : ℝ) := + mul_nonneg (by norm_num : 0 ≤ (8 : ℝ)) + (pow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) d) + calc + 8 * (3 ^ d : ℝ) = 8 * (3 ^ d : ℝ) * 1 := by ring + _ ≤ 8 * (3 ^ d : ℝ) * (r⁻¹) ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left hr_inv_sq_ge_one hcoeff_nonneg + exact add_le_add hfirst + (mul_le_mul_of_nonneg_left hinv_sq_le + (mul_nonneg (by norm_num) (sq_nonneg (sharpBoundaryKernelConstant d)))) + _ = (8 * (3 ^ d : ℝ) + + 100 * (sharpBoundaryKernelConstant d) ^ (2 : ℕ)) * + (r⁻¹) ^ (2 : ℕ) := by ring + have hsqrt_le : + Real.sqrt (sharpBoundaryKernelLoss d t) ≤ + Real.sqrt A * r⁻¹ := by + calc + Real.sqrt (sharpBoundaryKernelLoss d t) ≤ + Real.sqrt (A * (r⁻¹) ^ (2 : ℕ)) := + Real.sqrt_le_sqrt hloss_le + _ = Real.sqrt A * r⁻¹ := by + rw [Real.sqrt_mul hA_nonneg, Real.sqrt_sq hr_inv_nonneg] + calc + 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + ≤ r⁻¹ + Real.sqrt A * r⁻¹ := by + exact add_le_add hr_inv_ge_one hsqrt_le + _ = sharpBoundaryKernelNoteConstant d * r⁻¹ := by + unfold sharpBoundaryKernelNoteConstant + dsimp [A] + ring + _ = sharpBoundaryKernelNoteConstant d * ((1 / 2 : ℝ) - t)⁻¹ := by + rfl + +/-- The Ch1 exponent-loss gap has the note-facing two-exponent singularity +when the input exponent is below half the output exponent. -/ +theorem besovExponentLossGap_le_note {s t : ℝ} + (hs : 0 < s) (ht : 0 < t) (hts : t < s / 2) (hs_lt_one : s < 1) : + besovExponentLossGap s t ≤ 110 * s⁻¹ * t⁻¹ := by + let A : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let B : ℝ := (1 - Real.rpow (3 : ℝ) (-t))⁻¹ + let D : ℝ := (1 - Real.rpow (3 : ℝ) (-(s - t)))⁻¹ + have hs_le_one : s ≤ 1 := hs_lt_one.le + have ht_le_one : t ≤ 1 := by linarith + have hst_pos : 0 < s - t := by linarith + have hst_le_one : s - t ≤ 1 := by linarith + have hA_le : A ≤ 5 * s⁻¹ := by + dsimp [A] + exact inv_one_sub_rpow_three_neg_le_five_inv hs hs_le_one + have hB_le : B ≤ 5 * t⁻¹ := by + dsimp [B] + exact inv_one_sub_rpow_three_neg_le_five_inv ht ht_le_one + have hD_le_raw : D ≤ 5 * (s - t)⁻¹ := by + dsimp [D] + exact inv_one_sub_rpow_three_neg_le_five_inv hst_pos hst_le_one + have hhalf_le_gap : s / 2 ≤ s - t := by linarith + have hs_half_pos : 0 < s / 2 := by positivity + have hgap_inv_le : (s - t)⁻¹ ≤ (s / 2)⁻¹ := + (inv_le_inv₀ hst_pos hs_half_pos).2 hhalf_le_gap + have hhalf_inv : (s / 2)⁻¹ = 2 * s⁻¹ := by + field_simp [hs.ne'] + have hD_le : D ≤ 10 * s⁻¹ := by + calc + D ≤ 5 * (s - t)⁻¹ := hD_le_raw + _ ≤ 5 * (s / 2)⁻¹ := by + exact mul_le_mul_of_nonneg_left hgap_inv_le (by norm_num) + _ = 10 * s⁻¹ := by rw [hhalf_inv]; ring + have hA_nonneg : 0 ≤ A := by + dsimp [A] + have hr_lt : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt.le) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + have hr_lt : Real.rpow (3 : ℝ) (-t) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt.le) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + have hr_lt : Real.rpow (3 : ℝ) (-(s - t)) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt.le) + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have ht_inv_nonneg : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + have ht_inv_ge_one : 1 ≤ t⁻¹ := (one_le_inv₀ ht).2 ht_le_one + unfold besovExponentLossGap + change A + (2 * B) * D ≤ 110 * s⁻¹ * t⁻¹ + have hA_note : A ≤ 10 * s⁻¹ * t⁻¹ := by + have hfive_s_nonneg : 0 ≤ 5 * s⁻¹ := + mul_nonneg (by norm_num : 0 ≤ (5 : ℝ)) hs_inv_nonneg + have hfive_s_le_ten_s : 5 * s⁻¹ ≤ 10 * s⁻¹ := + mul_le_mul_of_nonneg_right (by norm_num : (5 : ℝ) ≤ 10) hs_inv_nonneg + calc + A ≤ 5 * s⁻¹ := hA_le + _ = 5 * s⁻¹ * 1 := by ring + _ ≤ 5 * s⁻¹ * t⁻¹ := + mul_le_mul_of_nonneg_left ht_inv_ge_one hfive_s_nonneg + _ ≤ 10 * s⁻¹ * t⁻¹ := + mul_le_mul_of_nonneg_right hfive_s_le_ten_s ht_inv_nonneg + have hBD_note : (2 * B) * D ≤ 100 * s⁻¹ * t⁻¹ := by + have htwoB_le : 2 * B ≤ 2 * (5 * t⁻¹) := + mul_le_mul_of_nonneg_left hB_le (by norm_num : 0 ≤ (2 : ℝ)) + have hB_bound_nonneg : 0 ≤ 2 * (5 * t⁻¹) := + mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (mul_nonneg (by norm_num : 0 ≤ (5 : ℝ)) ht_inv_nonneg) + calc + (2 * B) * D ≤ (2 * (5 * t⁻¹)) * (10 * s⁻¹) := + mul_le_mul htwoB_le hD_le hD_nonneg hB_bound_nonneg + _ = 100 * s⁻¹ * t⁻¹ := by ring + calc + A + (2 * B) * D ≤ 10 * s⁻¹ * t⁻¹ + 100 * s⁻¹ * t⁻¹ := + add_le_add hA_note hBD_note + _ = 110 * s⁻¹ * t⁻¹ := by ring + +/-- Coordinate-test Dirichlet solution bound using the low-exponent +sharp-loss bridge. -/ +theorem exists_coordinateDirichletSolution_overlappingPositiveNorm_le_sharpLoss + {d : ℕ} [NeZero d] {Cdir Cbridge : ℝ} + (hdir : DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d Cdir) + (hbridge : UnitFullDualCoordinateOverlappingBridgeSharpLoss d Cbridge) + (Q : TriadicCube d) {s : ℝ} (i : Fin d) (g : Vec d → ℝ) + (hs : 0 < s) (hs_lt_half : s < 1 / 2) + (hg : CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) g) : + ∃ w : H10Function (openCubeSet Q), + CubeDirichletDivergenceProblem Q w (coordinateVectorField i g) ∧ + CubeVectorOverlappingBesovHRegularity Q s + (fun x => w.toH1Function.grad x) ∧ + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + Cdir * + (Cbridge * (1 + Real.sqrt (sharpBoundaryKernelLoss d s)) * + cubeBesovScaleWeight (-s) Q) := by + have hs_lt_one : s < 1 := by nlinarith + have hh : + MeasureTheory.MemLp (coordinateVectorField i g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two hg + rcases exists_cubeDirichletDivergenceProblem_of_memLp_normalizedCubeMeasure + (Q := Q) hh with + ⟨w, hw⟩ + refine ⟨w, hw, ?_⟩ + rcases hbridge.2 Q i g hs hs_lt_half hg with + ⟨hreg, hbridgeBound⟩ + have hdirBound : + CubeVectorOverlappingBesovHRegularity Q s + (fun x => w.toH1Function.grad x) ∧ + cubeBesovOverlappingPositiveVectorNormTwo Q s + (fun x => w.toH1Function.grad x) ≤ + Cdir * + cubeBesovOverlappingPositiveVectorNormTwo Q s + (coordinateVectorField i g) := + hdir.2 hs hs_lt_one Q (coordinateVectorField i g) w hreg hw + exact ⟨hdirBound.1, hdirBound.2.trans + (mul_le_mul_of_nonneg_left hbridgeBound hdir.1)⟩ + +/-- Componentwise scalar full-dual pairing bounds with the sharp loss control +the vector genuine-dual solution-comparison estimate with the same displayed +loss. -/ +theorem scalarSolutionComparisonGenuineDualityEstimateSharpLoss_of_component_fullTest_pairing_bounds + {d : ℕ} [NeZero d] {Cpair : ℝ} + (hCpair : 0 ≤ Cpair) + (hSigma : + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {t : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < t → + t < 1 / 2 → + MemVectorL2 (cubeSet Q) F → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + ∀ (i : Fin d) (g : Vec d → ℝ), + CubeBesovDualFullTest Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + |cubeBesovPairing Q + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) i) g| ≤ + Cpair * (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * + t⁻¹ * cubeBesovScaleWeight (-t) Q * + localizedFluxDefectNegativeBesovAverageTwo Q t F j) + (hFlux : + ∀ (Q : TriadicCube d) (sigma0 : ℝ) (w F : Vec d → Vec d) + {t : ℝ} (j : ℕ), + 0 < sigma0 → + 0 < t → + t < 1 / 2 → + MemVectorL2 (cubeSet Q) F → + IsPotentialZeroTraceOn (cubeSet Q) w → + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) → + ∀ (i : Fin d) (g : Vec d → ℝ), + CubeBesovDualFullTest Q t (2 : ℝ≥0∞) (2 : ℝ≥0∞) g → + |cubeBesovPairing Q + (fun x => (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) i) + g| ≤ + Cpair * (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * + t⁻¹ * cubeBesovScaleWeight (-t) Q * + localizedFluxDefectNegativeBesovAverageTwo Q t F j) : + ScalarSolutionComparisonGenuineDualityEstimateSharpLoss d + (2 * (Fintype.card (Fin d) : ℝ) * Cpair) := by + refine ⟨?_, ?_⟩ + · have hcard : 0 ≤ (Fintype.card (Fin d) : ℝ) := by positivity + nlinarith + intro Q sigma0 w F t j hsigma0 ht ht_lt_half hF hw hsol + let K : ℝ := 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q t F j + let B : ℝ := Cpair * K * t⁻¹ * cubeBesovScaleWeight (-t) Q * L + have hSigmaNorm : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) ≤ + cubeBesovScaleWeight t Q * ((Fintype.card (Fin d) : ℝ) * B) := + cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_card_mul_of_forall_component_fullTest_pairing_le + Q t (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + (B := B) + (fun i g hg => by + dsimp [B, K, L] + exact hSigma Q sigma0 w F j hsigma0 ht ht_lt_half hF hw hsol i g hg) + have hFluxNorm : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + cubeBesovScaleWeight t Q * ((Fintype.card (Fin d) : ℝ) * B) := + cubeScaleNormalizedDualNegativeBesovVectorNormTwo_le_card_mul_of_forall_component_fullTest_pairing_le + Q t (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) + (B := B) + (fun i g hg => by + dsimp [B, K, L] + exact hFlux Q sigma0 w F j hsigma0 ht ht_lt_half hF hw hsol i g hg) + have hscale : + cubeBesovScaleWeight t Q * ((Fintype.card (Fin d) : ℝ) * B) = + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := by + dsimp [B, K, L] + calc + cubeBesovScaleWeight t Q * + ((Fintype.card (Fin d) : ℝ) * + (Cpair * (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * + t⁻¹ * cubeBesovScaleWeight (-t) Q * + localizedFluxDefectNegativeBesovAverageTwo Q t F j)) + = + (cubeBesovScaleWeight t Q * cubeBesovScaleWeight (-t) Q) * + (((Fintype.card (Fin d) : ℝ) * Cpair) * + (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * t⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t F j) := by + ring + _ = + 1 * (((Fintype.card (Fin d) : ℝ) * Cpair) * + (1 + Real.sqrt (sharpBoundaryKernelLoss d t)) * t⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t F j) := by + rw [cubeBesovScaleWeight_mul_neg_self] + _ = + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := by + dsimp [K, L] + ring + have hSigmaNorm' : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) ≤ + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := by + exact hSigmaNorm.trans (le_of_eq hscale) + have hFluxNorm' : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) ≤ + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := by + exact hFluxNorm.trans (le_of_eq hscale) + calc + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) + ≤ + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L + + ((Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := + add_le_add hSigmaNorm' hFluxNorm' + _ = + (2 * (Fintype.card (Fin d) : ℝ) * Cpair) * K * t⁻¹ * L := by + ring + +/-- +Close the genuine-dual scalar solution-comparison estimate from the restored +LaTeX argument, but using the honest low-exponent coordinate bridge with the +sharp-boundary loss displayed. +-/ +theorem scalarSolutionComparisonGenuineDualityEstimateSharpLoss_of_dirichletBesov_of_coordinateBridgeSharpLoss_of_localizedPairing + {d : ℕ} [NeZero d] {Cdir Cbridge Cpairing : ℝ} + (hdir : DiscreteConstantCoefficientDirichletBesovFunctionSpacesUniform d Cdir) + (hbridge : UnitFullDualCoordinateOverlappingBridgeSharpLoss d Cbridge) + (hpair : LocalizedFluxDefectPositivePairingEstimate d Cpairing) : + ScalarSolutionComparisonGenuineDualityEstimateSharpLoss d + (2 * (Fintype.card (Fin d) : ℝ) * + (Cpairing * (Cdir + 1) * Cbridge)) := by + let Ccomponent : ℝ := Cpairing * (Cdir + 1) * Cbridge + have hCcomponent : 0 ≤ Ccomponent := by + have hCdir1 : 0 ≤ Cdir + 1 := by linarith [hdir.1] + exact mul_nonneg (mul_nonneg hpair.1 hCdir1) hbridge.1 + refine + scalarSolutionComparisonGenuineDualityEstimateSharpLoss_of_component_fullTest_pairing_bounds + (d := d) (Cpair := Ccomponent) hCcomponent ?_ ?_ + · intro Q sigma0 w F t j _hsigma0 ht ht_lt_half hF hw hsol i g hg + let K : ℝ := 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + let W : ℝ := cubeBesovScaleWeight (-t) Q + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q t F j + have ht_lt_one : t < 1 := by linarith + rcases + exists_coordinateDirichletSolution_overlappingPositiveNorm_le_sharpLoss + hdir hbridge Q i g ht ht_lt_half hg with + ⟨v, hv, hvReg, hvNorm⟩ + have hpairing_eq : + cubeBesovPairing Q + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) i) g = + cubeAverage Q (fun x => vecDot (F x) (v.toH1Function.grad x)) := + cubeBesovPairing_solutionComparison_component_eq_cubeAverage_fluxDefect_dualGradient + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) (v := v) + i g hF hv hw hsol + have hW_nonneg : 0 ≤ W := cubeBesovScaleWeight_nonneg (-t) Q + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hBv_nonneg : 0 ≤ Cdir * (Cbridge * K * W) := by + exact mul_nonneg hdir.1 + (mul_nonneg (mul_nonneg hbridge.1 hK_nonneg) hW_nonneg) + have hlocal : + |cubeAverage Q (fun x => vecDot (F x) (v.toH1Function.grad x))| ≤ + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) := + hpair.bound Q j F (fun x => v.toH1Function.grad x) + (Cdir * (Cbridge * K * W)) ht ht_lt_one hF hvReg hBv_nonneg hvNorm + have htarget : + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) ≤ + Ccomponent * K * t⁻¹ * W * L := by + have htinv_nonneg : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + have hL_nonneg : 0 ≤ L := + localizedFluxDefectNegativeBesovAverageTwo_nonneg Q t F j + have hCdir1 : Cdir ≤ Cdir + 1 := by linarith + have hcoeff : + Cpairing * Cdir * Cbridge ≤ Cpairing * (Cdir + 1) * Cbridge := by + calc + Cpairing * Cdir * Cbridge = + (Cpairing * Cdir) * Cbridge := by ring + _ ≤ (Cpairing * (Cdir + 1)) * Cbridge := + mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hCdir1 hpair.1) hbridge.1 + _ = Cpairing * (Cdir + 1) * Cbridge := by ring + have htail_nonneg : 0 ≤ K * t⁻¹ * W * L := + mul_nonneg (mul_nonneg (mul_nonneg hK_nonneg htinv_nonneg) hW_nonneg) + hL_nonneg + calc + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) + = (Cpairing * Cdir * Cbridge) * (K * t⁻¹ * W * L) := by + ring + _ ≤ (Cpairing * (Cdir + 1) * Cbridge) * + (K * t⁻¹ * W * L) := + mul_le_mul_of_nonneg_right hcoeff htail_nonneg + _ = Ccomponent * K * t⁻¹ * W * L := by + dsimp [Ccomponent] + ring + rw [hpairing_eq] + exact hlocal.trans htarget + · intro Q sigma0 w F t j _hsigma0 ht ht_lt_half hF hw hsol i g hg + let K : ℝ := 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + let W : ℝ := cubeBesovScaleWeight (-t) Q + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q t F j + have ht_lt_one : t < 1 := by nlinarith + rcases + exists_coordinateDirichletSolution_overlappingPositiveNorm_le_sharpLoss + hdir hbridge Q i g ht ht_lt_half hg with + ⟨v, hv, hvReg, hvNorm⟩ + have hpairing_eq : + cubeBesovPairing Q + (fun x => (matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) i) g = + cubeAverage Q + (fun x => vecDot (F x) + (v.toH1Function.grad x + coordinateVectorField i g x)) := + cubeBesovPairing_fluxComparison_component_eq_cubeAverage_fluxDefect_dualGradient_add_coordinate + (Q := Q) (sigma0 := sigma0) (w := w) (F := F) (v := v) + i hg hF hv hw hsol + have hFOpen : MemVectorL2 (openCubeSet Q) F := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hF + have hcoordLp : + MeasureTheory.MemLp (coordinateVectorField i g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + coordinateVectorField_memLp_of_cubeBesovDualFullTest_two_two hg + have hcoordOpen : + MemVectorL2 (openCubeSet Q) (coordinateVectorField i g) := + memVectorL2_openCubeSet_of_memLp_normalizedCubeMeasure Q hcoordLp + have hsplit : + |cubeAverage Q + (fun x => vecDot (F x) + (v.toH1Function.grad x + coordinateVectorField i g x))| ≤ + |cubeAverage Q (fun x => vecDot (F x) (v.toH1Function.grad x))| + + |cubeAverage Q (fun x => vecDot (F x) (coordinateVectorField i g x))| := + abs_cubeAverage_vecDot_add_right_le + Q F (fun x => v.toH1Function.grad x) (coordinateVectorField i g) + hFOpen v.toH1Function.grad_memVectorL2 hcoordOpen + have hW_nonneg : 0 ≤ W := cubeBesovScaleWeight_nonneg (-t) Q + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hBv_nonneg : 0 ≤ Cdir * (Cbridge * K * W) := by + exact mul_nonneg hdir.1 + (mul_nonneg (mul_nonneg hbridge.1 hK_nonneg) hW_nonneg) + have hBg_nonneg : 0 ≤ Cbridge * K * W := by + exact mul_nonneg (mul_nonneg hbridge.1 hK_nonneg) hW_nonneg + have hlocal_v : + |cubeAverage Q (fun x => vecDot (F x) (v.toH1Function.grad x))| ≤ + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) := + hpair.bound Q j F (fun x => v.toH1Function.grad x) + (Cdir * (Cbridge * K * W)) ht ht_lt_one hF hvReg hBv_nonneg hvNorm + rcases hbridge.2 Q i g ht ht_lt_half hg with + ⟨hcoordReg, hcoordNorm⟩ + have hlocal_g : + |cubeAverage Q (fun x => vecDot (F x) (coordinateVectorField i g x))| ≤ + Cpairing * t⁻¹ * L * (Cbridge * K * W) := + hpair.bound Q j F (coordinateVectorField i g) + (Cbridge * K * W) ht ht_lt_one hF hcoordReg hBg_nonneg hcoordNorm + have hsum : + |cubeAverage Q + (fun x => vecDot (F x) + (v.toH1Function.grad x + coordinateVectorField i g x))| ≤ + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) + + Cpairing * t⁻¹ * L * (Cbridge * K * W) := + hsplit.trans (add_le_add hlocal_v hlocal_g) + have htarget : + Cpairing * t⁻¹ * L * (Cdir * (Cbridge * K * W)) + + Cpairing * t⁻¹ * L * (Cbridge * K * W) ≤ + Ccomponent * K * t⁻¹ * W * L := by + apply le_of_eq + dsimp [Ccomponent, K, W, L] + ring + rw [hpairing_eq] + exact hsum.trans htarget + +/-- Specialize the sharp-loss genuine-dual estimate to `t = s / 2` and compose +with the proved Ch1 dual-to-circ exponent-loss embedding. -/ +theorem ScalarSolutionComparisonGenuineDualityEstimateSharpLoss.to_halfExponentSharpLoss + {d : ℕ} [NeZero d] {C : ℝ} + (hdual : ScalarSolutionComparisonGenuineDualityEstimateSharpLoss d C) : + ScalarSolutionComparisonDualityEstimateHalfExponentSharpLoss d (110 * C) := by + refine ⟨mul_nonneg (by norm_num) hdual.1, ?_⟩ + intro Q sigma0 w F s j hsigma0 hs hs_lt_one hF hw hsol + let t : ℝ := s / 2 + let K : ℝ := 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q t F j + let Gc : Vec d → Vec d := + fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + let Gf : Vec d → Vec d := + fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x + have ht_pos : 0 < t := by + dsimp [t] + linarith + have ht_lt_s : t < s := by + dsimp [t] + linarith + have ht_lt_half : t < 1 / 2 := by + dsimp [t] + linarith + have hwMem : MemVectorL2 (cubeSet Q) w := + memVectorL2_of_isPotentialZeroTraceOn hw + have hGcMem : MemVectorL2 (cubeSet Q) Gc := by + have hEll : + IsEllipticFieldOn sigma0 sigma0 (cubeSet Q) + (constantCoeffField (scalarMatrix (d := d) sigma0)) := + isEllipticFieldOn_constantCoeffField + (measurableSet_cubeSet Q) (isEllipticMatrix_scalarMatrix hsigma0) + simpa [Gc, constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hwMem + have hGfMem : MemVectorL2 (cubeSet Q) Gf := by + simpa [Gf, Gc] using! hGcMem.add hF + have hGc_embed : + cubeBesovNegativeVectorSeminormTwo Q s Gc ≤ + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc := by + have h := + (concreteNegativeFromDualExponentLoss_geometric d).2 + Q Gc ht_pos ht_lt_s hs_lt_one hGcMem + simpa using h + have hGf_embed : + cubeBesovNegativeVectorSeminormTwo Q s Gf ≤ + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf := by + have h := + (concreteNegativeFromDualExponentLoss_geometric d).2 + Q Gf ht_pos ht_lt_s hs_lt_one hGfMem + simpa using h + have hgap_nonneg : 0 ≤ besovExponentLossGap s t := + besovExponentLossGap_nonneg ht_pos ht_lt_s + have hgenuine : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf ≤ + C * K * t⁻¹ * L := by + simpa [Gc, Gf, K, L, t] using + hdual.2 Q sigma0 w F (t := t) j + hsigma0 ht_pos ht_lt_half hF hw hsol + have hraw : + cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf ≤ + C * K * t⁻¹ * besovExponentLossGap s t * L := by + calc + cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf + ≤ besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf := + add_le_add hGc_embed hGf_embed + _ = + besovExponentLossGap s t * + (cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf) := by + ring + _ ≤ besovExponentLossGap s t * (C * K * t⁻¹ * L) := by + exact mul_le_mul_of_nonneg_left hgenuine hgap_nonneg + _ = C * K * t⁻¹ * besovExponentLossGap s t * L := by + ring + have hgap : + besovExponentLossGap s (s / 2) ≤ 55 * (s⁻¹) ^ (2 : ℕ) := + besovExponentLossGap_half_le_fiftyFive_inv_sq hs hs_lt_one + have hinv_half : (s / 2)⁻¹ = 2 * s⁻¹ := by + field_simp [hs.ne'] + have hinv_nonneg : 0 ≤ 2 * s⁻¹ := by + exact mul_nonneg (by norm_num) (inv_nonneg.mpr hs.le) + have hfactor : + (s / 2)⁻¹ * besovExponentLossGap s (s / 2) ≤ + 110 * (s⁻¹) ^ (3 : ℕ) := by + calc + (s / 2)⁻¹ * besovExponentLossGap s (s / 2) + = (2 * s⁻¹) * besovExponentLossGap s (s / 2) := by rw [hinv_half] + _ ≤ (2 * s⁻¹) * (55 * (s⁻¹) ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hgap hinv_nonneg + _ = 110 * (s⁻¹) ^ (3 : ℕ) := by ring + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hCK_nonneg : 0 ≤ C * K := mul_nonneg hdual.1 hK_nonneg + have hL_nonneg : 0 ≤ L := by + dsimp [L, t] + exact localizedFluxDefectNegativeBesovAverageTwo_nonneg Q (s / 2) F j + have htail : + C * K * t⁻¹ * besovExponentLossGap s t * L ≤ + (110 * C) * K * (s⁻¹) ^ (3 : ℕ) * L := by + have hcoeff : + C * K * ((s / 2)⁻¹ * besovExponentLossGap s (s / 2)) ≤ + C * K * (110 * (s⁻¹) ^ (3 : ℕ)) := + mul_le_mul_of_nonneg_left hfactor hCK_nonneg + calc + C * K * t⁻¹ * besovExponentLossGap s t * L + = C * K * ((s / 2)⁻¹ * besovExponentLossGap s (s / 2)) * L := by + dsimp [t] + ring + _ ≤ C * K * (110 * (s⁻¹) ^ (3 : ℕ)) * L := + mul_le_mul_of_nonneg_right hcoeff hL_nonneg + _ = (110 * C) * K * (s⁻¹) ^ (3 : ℕ) * L := by ring + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) + = cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf := by rfl + _ ≤ C * K * t⁻¹ * besovExponentLossGap s t * L := hraw + _ ≤ (110 * C) * K * (s⁻¹) ^ (3 : ℕ) * L := htail + _ = + (110 * C) * (1 + Real.sqrt (sharpBoundaryKernelLoss d (s / 2))) * + (s⁻¹) ^ (3 : ℕ) * + localizedFluxDefectNegativeBesovAverageTwo Q (s / 2) F j := by + dsimp [K, L, t] + +/-- Keep the two exponents exposed and absorb the sharp-boundary and +dual-to-circ geometric factors into the note-facing +`s^{-1} t^{-2} (1/2 - t)^{-1}` loss. -/ +theorem ScalarSolutionComparisonGenuineDualityEstimateSharpLoss.to_exponentLoss + {d : ℕ} [NeZero d] {C : ℝ} + (hdual : ScalarSolutionComparisonGenuineDualityEstimateSharpLoss d C) : + ScalarSolutionComparisonDualityEstimateExponentLoss d + (110 * sharpBoundaryKernelNoteConstant d * C) := by + refine + ⟨mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (110 : ℝ)) + (sharpBoundaryKernelNoteConstant_nonneg d)) hdual.1, ?_⟩ + intro Q sigma0 w F s t j hsigma0 hs ht hts hs_lt_one hF hw hsol + let K : ℝ := 1 + Real.sqrt (sharpBoundaryKernelLoss d t) + let H : ℝ := ((1 / 2 : ℝ) - t)⁻¹ + let S : ℝ := sharpBoundaryKernelNoteConstant d + let L : ℝ := localizedFluxDefectNegativeBesovAverageTwo Q t F j + let Gc : Vec d → Vec d := + fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + let Gf : Vec d → Vec d := + fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x + have ht_lt_s : t < s := by linarith + have ht_lt_half : t < 1 / 2 := by linarith + have hwMem : MemVectorL2 (cubeSet Q) w := + memVectorL2_of_isPotentialZeroTraceOn hw + have hGcMem : MemVectorL2 (cubeSet Q) Gc := by + have hEll : + IsEllipticFieldOn sigma0 sigma0 (cubeSet Q) + (constantCoeffField (scalarMatrix (d := d) sigma0)) := + isEllipticFieldOn_constantCoeffField + (measurableSet_cubeSet Q) (isEllipticMatrix_scalarMatrix hsigma0) + simpa [Gc, constantCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hwMem + have hGfMem : MemVectorL2 (cubeSet Q) Gf := by + simpa [Gf, Gc] using! hGcMem.add hF + have hGc_embed : + cubeBesovNegativeVectorSeminormTwo Q s Gc ≤ + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc := by + have h := + (concreteNegativeFromDualExponentLoss_geometric d).2 + Q Gc ht ht_lt_s hs_lt_one hGcMem + simpa using h + have hGf_embed : + cubeBesovNegativeVectorSeminormTwo Q s Gf ≤ + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf := by + have h := + (concreteNegativeFromDualExponentLoss_geometric d).2 + Q Gf ht ht_lt_s hs_lt_one hGfMem + simpa using h + have hgap_nonneg : 0 ≤ besovExponentLossGap s t := + besovExponentLossGap_nonneg ht ht_lt_s + have hgenuine : + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf ≤ + C * K * t⁻¹ * L := by + simpa [Gc, Gf, K, L] using + hdual.2 Q sigma0 w F (t := t) j + hsigma0 ht ht_lt_half hF hw hsol + have hraw : + cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf ≤ + C * K * t⁻¹ * besovExponentLossGap s t * L := by + calc + cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf + ≤ besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + besovExponentLossGap s t * + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf := + add_le_add hGc_embed hGf_embed + _ = + besovExponentLossGap s t * + (cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gc + + cubeScaleNormalizedDualNegativeBesovVectorNormTwo Q t Gf) := by + ring + _ ≤ besovExponentLossGap s t * (C * K * t⁻¹ * L) := by + exact mul_le_mul_of_nonneg_left hgenuine hgap_nonneg + _ = C * K * t⁻¹ * besovExponentLossGap s t * L := by + ring + have hK_le : K ≤ S * H := by + dsimp [K, S, H] + exact one_add_sqrt_sharpBoundaryKernelLoss_le_noteConstant ht ht_lt_half + have hgap_le : + besovExponentLossGap s t ≤ 110 * s⁻¹ * t⁻¹ := + besovExponentLossGap_le_note hs ht hts hs_lt_one + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact sharpBoundaryKernelNoteConstant_nonneg d + have hH_nonneg : 0 ≤ H := by + dsimp [H] + exact inv_nonneg.mpr (by linarith : 0 ≤ (1 / 2 : ℝ) - t) + have ht_inv_nonneg : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + have hs_inv_nonneg : 0 ≤ s⁻¹ := inv_nonneg.mpr hs.le + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact localizedFluxDefectNegativeBesovAverageTwo_nonneg Q t F j + have hfactor : + K * t⁻¹ * besovExponentLossGap s t ≤ + S * H * t⁻¹ * (110 * s⁻¹ * t⁻¹) := by + have hKt : + K * t⁻¹ ≤ (S * H) * t⁻¹ := + mul_le_mul_of_nonneg_right hK_le ht_inv_nonneg + have hSHt_nonneg : 0 ≤ (S * H) * t⁻¹ := + mul_nonneg (mul_nonneg hS_nonneg hH_nonneg) ht_inv_nonneg + calc + K * t⁻¹ * besovExponentLossGap s t + = (K * t⁻¹) * besovExponentLossGap s t := by ring + _ ≤ ((S * H) * t⁻¹) * besovExponentLossGap s t := + mul_le_mul_of_nonneg_right hKt hgap_nonneg + _ ≤ ((S * H) * t⁻¹) * (110 * s⁻¹ * t⁻¹) := + mul_le_mul_of_nonneg_left hgap_le hSHt_nonneg + _ = S * H * t⁻¹ * (110 * s⁻¹ * t⁻¹) := by ring + have htail : + C * K * t⁻¹ * besovExponentLossGap s t * L ≤ + (110 * S * C) * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * H * L := by + calc + C * K * t⁻¹ * besovExponentLossGap s t * L + = C * (K * t⁻¹ * besovExponentLossGap s t) * L := by ring + _ ≤ C * (S * H * t⁻¹ * (110 * s⁻¹ * t⁻¹)) * L := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hfactor hdual.1) hL_nonneg + _ = (110 * S * C) * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * H * L := by + ring + calc + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x)) + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (scalarMatrix (d := d) sigma0) (w x) + F x) + = cubeBesovNegativeVectorSeminormTwo Q s Gc + + cubeBesovNegativeVectorSeminormTwo Q s Gf := by rfl + _ ≤ C * K * t⁻¹ * besovExponentLossGap s t * L := hraw + _ ≤ (110 * S * C) * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * H * L := htail + _ = + (110 * sharpBoundaryKernelNoteConstant d * C) * s⁻¹ * + (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t F j := by + dsimp [S, H, L] + +/-- Use the sharp-loss half-exponent scalar-background duality estimate on a +comparison pair. -/ +theorem solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimateHalfExponentSharpLoss + {d : ℕ} [NeZero d] {C : ℝ} + (hduality : ScalarSolutionComparisonDualityEstimateHalfExponentSharpLoss d C) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s : ℝ} (j : ℕ) + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hF : + MemVectorL2 (cubeSet Q) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU)) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) : + solutionComparisonNegativeBesovLhs Q s a (scalarMatrix (d := d) sigma0) gradU gradV ≤ + C * (1 + Real.sqrt (sharpBoundaryKernelLoss d (s / 2))) * + (s⁻¹) ^ (3 : ℕ) * + localizedFluxDefectNegativeBesovAverageTwo Q (s / 2) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := by + have hbound := + hduality.2 Q sigma0 (fun x => gradU x - gradV x) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j + hsigma0 hs_pos hs_lt_one hF hcomparison.2 hcomparison.comparisonPair_solenoidal + rwa [solutionComparisonNegativeBesovLhs_eq_comparisonPair] + +/-- Use the two-exponent scalar-background duality estimate on a comparison +pair. -/ +theorem solutionComparisonNegativeBesovLhs_le_of_scalarSolutionComparisonDualityEstimateExponentLoss + {d : ℕ} [NeZero d] {C : ℝ} + (hduality : ScalarSolutionComparisonDualityEstimateExponentLoss d C) + (Q : TriadicCube d) (a : CoeffField d) (sigma0 : ℝ) + (gradU gradV : Vec d → Vec d) {s t : ℝ} (j : ℕ) + (hsigma0 : 0 < sigma0) + (hs_pos : 0 < s) (ht_pos : 0 < t) (hts : t < s / 2) (hs_lt_one : s < 1) + (hF : + MemVectorL2 (cubeSet Q) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU)) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a + (scalarMatrix (d := d) sigma0) gradU gradV) : + solutionComparisonNegativeBesovLhs Q s a (scalarMatrix (d := d) sigma0) gradU gradV ≤ + C * s⁻¹ * (t⁻¹) ^ (2 : ℕ) * ((1 / 2 : ℝ) - t)⁻¹ * + localizedFluxDefectNegativeBesovAverageTwo Q t + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j := by + have hbound := + hduality.2 Q sigma0 (fun x => gradU x - gradV x) + (fluxDefect a (scalarMatrix (d := d) sigma0) gradU) j + hsigma0 hs_pos ht_pos hts hs_lt_one hF hcomparison.2 + hcomparison.comparisonPair_solenoidal + rwa [solutionComparisonNegativeBesovLhs_eq_comparisonPair] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/HarmonicApproximation.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/HarmonicApproximation.lean new file mode 100644 index 0000000000..129dc5f231 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/HomogenizationBlackBoxes/HarmonicApproximation.lean @@ -0,0 +1,919 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.CoarseGrainingL2 +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseFluxResponse +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic + +/-! # Harmonic Approximation -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Deterministic homogenization black boxes: harmonic approximation + +This file contains the Section 3.3.C corollary surface from +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3254--3356. + +The manuscript states the mesoscopic corollary on cubes `x + □_n`. In Lean we +state the same result on an arbitrary triadic cube `Q`; callers instantiate +`Q` with the desired subcube. The current Section 3.3 output is a negative +Besov comparison estimate, exactly as the manuscript notes before deferring the +stronger excess-decay upgrade to the large-scale regularity chapter. +-/ + +/-- +The single flux-defect quantity used by the harmonic-approximation corollary. +It is the Section 3.3.A localized average at depth zero, i.e. the local +negative Besov size of `(a - a₀)∇u` on the cube where the harmonic replacement +is taken. +-/ +noncomputable def harmonicApproximationFluxDefectBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) : ℝ := + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.toH1.grad) 0 + +/-- +The harmonic-approximation flux-defect quantity is the absolute value of the +one-cube negative Besov seminorm of `(a - a₀)∇u`. +-/ +@[simp] theorem harmonicApproximationFluxDefectBound_eq_abs_cubeBesovNegativeVectorSeminormTwo + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) : + harmonicApproximationFluxDefectBound Q a a0 s u = + |cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad)| := by + simp [harmonicApproximationFluxDefectBound] + +/-- +If the one-cube negative Besov seminorm is known to be nonnegative, the +harmonic-approximation flux-defect package is exactly that seminorm. +-/ +theorem harmonicApproximationFluxDefectBound_eq_cubeBesovNegativeVectorSeminormTwo_of_nonneg + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad)) : + harmonicApproximationFluxDefectBound Q a a0 s u = + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) := by + rw [harmonicApproximationFluxDefectBound_eq_abs_cubeBesovNegativeVectorSeminormTwo] + exact abs_of_nonneg hdefect_nonneg + +/-- +Exact harmonic-approximation comparison from the local flux-defect quantity, +assuming the comparison pair has already been packaged. + +This is the clean deterministic corollary surface behind +`c.harmonic.approximation.negative.norm.deterministic.theory`, manuscript lines +3294--3348, in cube-normalized notation. +-/ +theorem solution_l2_close_harmonic_of_harmonicApproximationFluxDefectBound_of_comparisonPair + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 u.toH1.grad v.toH1.grad) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * + harmonicApproximationFluxDefectBound Q a a0 s u := by + subst a0 + simpa [harmonicApproximationFluxDefectBound] using + solution_diff_l2_le_dualityConstant_mul_localizedFluxDefect_of_fluxDefect_negativeBesov_le + hdual Q a sigma0 u.toH1.grad v.toH1.grad 0 hsigma0 hs_pos hs_lt_one hEll + hcomparison + +/-- +Exact harmonic-approximation comparison from the local flux-defect quantity. + +This is the clean deterministic corollary surface behind +`c.harmonic.approximation.negative.norm.deterministic.theory`, manuscript lines +3294--3348, in cube-normalized notation. The boundary condition is the +manuscript hypothesis `u - v ∈ H¹₀`, represented here by zero-trace +potentiality of `∇u - ∇v`; harmonicity supplies the solenoidal comparison +identity. +-/ +theorem solution_l2_close_harmonic_of_harmonicApproximationFluxDefectBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * + harmonicApproximationFluxDefectBound Q a a0 s u := + solution_l2_close_harmonic_of_harmonicApproximationFluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_aHarmonicFunctions hEll ha0 u v hzeroTrace) + +/-- +Downstream-facing harmonic-approximation bound from an already packaged +comparison pair. + +This variant is useful for lower-level deterministic plumbing. Most callers +should prefer `solution_l2_close_harmonic_of_fluxDefectBound`, whose boundary +input is the manuscript zero-trace condition. +-/ +theorem solution_l2_close_harmonic_of_fluxDefectBound_of_comparisonPair + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 u.toH1.grad v.toH1.grad) + (hfluxDefectBound : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := by + calc + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad + ≤ Cdual * s⁻¹ * + harmonicApproximationFluxDefectBound Q a a0 s u := + solution_l2_close_harmonic_of_harmonicApproximationFluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + hcomparison + _ ≤ Cdual * s⁻¹ * fluxDefectBound := by + exact mul_le_mul_of_nonneg_left hfluxDefectBound + (mul_nonneg hdual.1 (inv_nonneg.mpr hs_pos.le)) + +/-- +Downstream-facing harmonic-approximation apex for +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3294--3348. + +Probabilistic or iteration-loop callers only need to prove the single +hypothesis `hfluxDefectBound`, namely a bound on +`harmonicApproximationFluxDefectBound`. The qualitative ellipticity +parameters certify the coefficient classes but do not appear quantitatively in +the conclusion. +-/ +theorem solution_l2_close_harmonic_of_fluxDefectBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hfluxDefectBound : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := by + exact + solution_l2_close_harmonic_of_fluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_aHarmonicFunctions hEll ha0 u v hzeroTrace) + hfluxDefectBound + +/-- +Downstream-facing harmonic-approximation apex from a direct one-cube negative +Besov bound on the flux defect `(a - a₀)∇u`. + +This is the same statement as +`solution_l2_close_harmonic_of_fluxDefectBound`, with the Section 3.3.C +depth-zero flux-defect package unfolded using +`harmonicApproximationFluxDefectBound_eq_abs_cubeBesovNegativeVectorSeminormTwo`. +-/ +theorem solution_l2_close_harmonic_of_cubeBesovNegativeFluxDefectBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hfluxDefectBound : + |cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad)| ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := by + exact + solution_l2_close_harmonic_of_fluxDefectBound + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hzeroTrace + (by simpa using hfluxDefectBound) + +/-- +Downstream-facing harmonic-approximation apex from a direct one-cube negative +Besov bound, with the usual nonnegativity of the seminorm supplied separately. + +This keeps Ch3 independent of any future convenience lemma that may derive +nonnegativity from stronger integrability hypotheses. +-/ +theorem solution_l2_close_harmonic_of_cubeBesovNegativeFluxDefectBound_of_nonneg + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad)) + (hfluxDefectBound : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := by + exact + solution_l2_close_harmonic_of_fluxDefectBound + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hzeroTrace + (by + rw [harmonicApproximationFluxDefectBound_eq_cubeBesovNegativeVectorSeminormTwo_of_nonneg + Q a a0 s u hdefect_nonneg] + exact hfluxDefectBound) + +/-- +The explicit RHS-final-theorem flux-defect bound from +`CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic`, packaged for direct +Section 3.3.C composition. + +Only the scale-local `lambdaSq` quantity appears here; the qualitative +uniform ellipticity witnesses remain hypotheses of the theorem that supplies +the bound. +-/ +noncomputable def coarsePoincareRHSFinalFluxDefectBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g defect : Vec d → Vec d) (s : ℝ) : ℝ := + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a defect) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) + +/-- +Direct Section 3.3.C composition with the RHS-side final theorem +`cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal`. + +This is the explicit wrapper deferred in the blocker memo: callers supply the +potential/solenoidal hypotheses for the actual flux defect +`(a - a₀)∇u`, and the theorem feeds the resulting q=2 bound through the +harmonic-approximation black box from manuscript lines 3294--3348. +-/ +theorem solution_l2_close_harmonic_of_coarsePoincareRHSFinalFluxDefectBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (g : Vec d → Vec d) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_le_one : s ≤ 1) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hdefect_potential : + IsPotentialOn (cubeSet Q) (fluxDefect a a0 u.toH1.grad)) + (hdefect_residual : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (fluxDefect a a0 u.toH1.grad x) - g x)) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * + coarsePoincareRHSFinalFluxDefectBound Q a g (fluxDefect a a0 u.toH1.grad) s := by + have hdefectMemL2 : + MemVectorL2 (cubeSet Q) (fluxDefect a a0 u.toH1.grad) := by + rcases hdefect_potential with ⟨w, hw⟩ + simpa [← hw] using w.grad_memVectorL2 + have hdefectMemLp : + MeasureTheory.MemLp (fluxDefect a a0 u.toH1.grad) (2 : ENNReal) + (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hdefectMemL2 + have hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) := + cubeBesovNegativeVectorSeminormTwo_nonneg_of_memLp + Q hs_pos (fluxDefect a a0 u.toH1.grad) hdefectMemLp + have hfluxDefectBound : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) ≤ + coarsePoincareRHSFinalFluxDefectBound Q a g (fluxDefect a a0 u.toH1.grad) s := by + simpa [coarsePoincareRHSFinalFluxDefectBound] using + cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := a) (g := g) (u := fluxDefect a a0 u.toH1.grad) + (s := s) (lam := lam) (Lam := Lam) + hs_pos hs_le_one hEll hdefect_potential hdefect_residual hg hGlobalBdd + exact + solution_l2_close_harmonic_of_cubeBesovNegativeFluxDefectBound_of_nonneg + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hzeroTrace + hdefect_nonneg hfluxDefectBound + +/-- +The Ch1 q=1-to-q=2 weak-norm bridge converts a finite-depth q=1 flux-defect +bound into the single Section 3.3.C flux-defect quantity. + +This is the API bridge needed to compose with q=1 actual flux-response estimates: +the caller supplies the partial q=1 bounds for `(a - a₀)∇u`, and this lemma +packages them as the q=2 local flux-defect bound consumed by the harmonic +approximation corollary. +-/ +theorem harmonicApproximationFluxDefectBound_le_of_qonePartialFluxDefectBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (u : AHarmonicFunction a (cubeSet Q)) {s fluxDefectBound : ℝ} + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ fluxDefectBound := by + have hq2 : + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound := + cubeBesovNegativeVectorSeminormTwo_le_of_qone_partialBound + Q s (fluxDefect a a0 u.toH1.grad) hpartialFluxDefectBound + have hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fluxDefect a a0 u.toH1.grad)) := by + use fluxDefectBound + rintro x ⟨N, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm + Q s N (fluxDefect a a0 u.toH1.grad)).trans (hpartialFluxDefectBound N) + have hdefect_nonneg : + 0 ≤ cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) := by + have hpartial0_le : + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fluxDefect a a0 u.toH1.grad) ≤ + cubeBesovNegativeVectorSeminormTwo Q s (fluxDefect a a0 u.toH1.grad) := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hBdd ⟨0, rfl⟩ + exact + (cubeBesovNegativeVectorPartialSeminormTwo_nonneg + Q s 0 (fluxDefect a a0 u.toH1.grad)).trans hpartial0_le + rw [harmonicApproximationFluxDefectBound_eq_cubeBesovNegativeVectorSeminormTwo_of_nonneg + Q a a0 s u hdefect_nonneg] + exact hq2 + +/-- +Harmonic-approximation comparison from q=1 finite-depth flux-defect bounds, +with the comparison pair already packaged. + +This wrapper is for direct composition with q=1 actual flux-response estimates +once they expose their finite-depth partial-bound form. It is still the +Section 3.3.C deterministic comparison from manuscript lines 3294--3348; the +new input is only a q=1 presentation of the same local flux-defect bound. +-/ +theorem solution_l2_close_harmonic_of_qonePartialFluxDefectBound_of_comparisonPair + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 u.toH1.grad v.toH1.grad) + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := by + exact + solution_l2_close_harmonic_of_fluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hcomparison + (harmonicApproximationFluxDefectBound_le_of_qonePartialFluxDefectBound + Q a a0 u hpartialFluxDefectBound) + +/-- +Harmonic-approximation comparison from q=1 finite-depth flux-defect bounds. + +This is the zero-trace-facing version of +`solution_l2_close_harmonic_of_qonePartialFluxDefectBound_of_comparisonPair`. +It keeps the Section 3.3.C headline API compatible with q=1 actual +flux-response inputs while preserving the same qualitative ellipticity surface. +-/ +theorem solution_l2_close_harmonic_of_qonePartialFluxDefectBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := + solution_l2_close_harmonic_of_qonePartialFluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_aHarmonicFunctions hEll ha0 u v hzeroTrace) + hpartialFluxDefectBound + +/-- +Convert a full q=1 flux-defect bound into the Section 3.3.C q=2 flux-defect +package, assuming the finite-depth q=1 seminorms are bounded above. + +The boundedness hypothesis is the standard condition needed to compare a +finite partial seminorm with its `sSup` definition. When the caller already +has finite-depth q=1 bounds, prefer +`harmonicApproximationFluxDefectBound_le_of_qonePartialFluxDefectBound`, which +does not need this extra boundedness witness. +-/ +theorem harmonicApproximationFluxDefectBound_le_of_qoneFluxDefectBound_of_partialSeminorm_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (u : AHarmonicFunction a (cubeSet Q)) {s fluxDefectBound : ℝ} + (hpartialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad))) + (hqoneFluxDefectBound : + cubeBesovNegativeVectorSeminorm Q s (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ fluxDefectBound := by + have hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound := by + intro N + have hpartial_le_full : + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + cubeBesovNegativeVectorSeminorm Q s (fluxDefect a a0 u.toH1.grad) := by + unfold cubeBesovNegativeVectorSeminorm + exact le_csSup hpartialBdd ⟨N, rfl⟩ + exact hpartial_le_full.trans hqoneFluxDefectBound + exact + harmonicApproximationFluxDefectBound_le_of_qonePartialFluxDefectBound + Q a a0 u hpartialFluxDefectBound + +/-- +Harmonic-approximation comparison from a full q=1 flux-defect bound, plus the +boundedness witness needed to unfold the q=1 supremum. + +This is useful when a previous theorem exposes only the full q=1 seminorm +bound. It is intentionally weaker than the finite-depth partial-bound wrapper +above, because the extra boundedness hypothesis is mathematically required by +the `sSup` API. +-/ +theorem solution_l2_close_harmonic_of_qoneFluxDefectBound_of_partialSeminorm_bddAbove + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s fluxDefectBound : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hpartialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad))) + (hqoneFluxDefectBound : + cubeBesovNegativeVectorSeminorm Q s (fluxDefect a a0 u.toH1.grad) ≤ + fluxDefectBound) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * fluxDefectBound := + solution_l2_close_harmonic_of_fluxDefectBound + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hzeroTrace + (harmonicApproximationFluxDefectBound_le_of_qoneFluxDefectBound_of_partialSeminorm_bddAbove + Q a a0 u hpartialBdd hqoneFluxDefectBound) + +/-- +The q=1 actual flux-response right-hand side for a harmonic field, matching the +bound proved by `coarseFluxResponse_qone_of_aHarmonicFunction`. + +This is kept in the black-box namespace as a composition target: if the +coarse-flux-response side exposes the same finite-depth q=1 partial bound, the +harmonic approximation theorem below consumes it without re-bundling. +-/ +noncomputable def qoneCoarseFluxResponseBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : ℝ := + (geometricDiscount s 1)⁻¹ * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + (Real.sqrt (((4 : ℝ) * matNorm a0)) * + Real.sqrt (cubeAverage Q (scalarVariationEnergyIntegrand a u))) + +/-- +Direct Section 3.3.C composition with +`coarseFluxResponse_qone_of_aHarmonicFunction`. + +The upstream theorem currently exposes the full q=1 seminorm bound, so this +wrapper keeps the boundedness witness needed to compare finite q=1 partial +seminorms with that supremum. Callers that have finite-depth q=1 estimates +can continue to use +`solution_l2_close_harmonic_of_qoneCoarseFluxResponsePartialBound`. +-/ +theorem solution_l2_close_harmonic_of_coarseFluxResponse_qone_of_aHarmonicFunction + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hpartialBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * qoneCoarseFluxResponseBound Q a a0 s u := by + have hqone : + cubeBesovNegativeVectorSeminorm Q s (fluxDefect a a0 u.toH1.grad) ≤ + qoneCoarseFluxResponseBound Q a a0 s u := by + simpa [fluxDefect, qoneCoarseFluxResponseBound] using! + coarseFluxResponse_qone_of_aHarmonicFunction + (Q := Q) (a := a) (a0 := a0) (s := s) + hs_pos hEll ha0 ha0symm u hsum + exact + solution_l2_close_harmonic_of_qoneFluxDefectBound_of_partialSeminorm_bddAbove + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hzeroTrace + hpartialBdd hqone + +/-- +Convert the q=1 finite-depth actual flux-response estimate into the Section +3.3.C flux-defect package. + +The right-hand side is definitionally the q=1 response bound from +`coarseFluxResponse_qone_of_aHarmonicFunction`; the only requested input is the +finite-depth version of that estimate, because the q=2 black-box consumes the +supremum through the Ch1 q=1-to-q=2 bridge. +-/ +theorem harmonicApproximationFluxDefectBound_le_qoneCoarseFluxResponseBound_of_partialFluxDefectBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (u : AHarmonicFunction a (cubeSet Q)) {s : ℝ} + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + qoneCoarseFluxResponseBound Q a a0 s u) : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ + qoneCoarseFluxResponseBound Q a a0 s u := + harmonicApproximationFluxDefectBound_le_of_qonePartialFluxDefectBound + Q a a0 u hpartialFluxDefectBound + +/-- +Harmonic-approximation comparison with the q=1 actual flux-response RHS, +assuming the comparison pair has already been packaged. + +This is the direct Section 3.3.C composition surface for q=1 actual +flux-response inputs: finite-depth q=1 defect control is converted to the q=2 +local flux-defect package and then fed through the deterministic comparison +theorem from manuscript lines 3294--3348. +-/ +theorem solution_l2_close_harmonic_of_qoneCoarseFluxResponsePartialBound_of_comparisonPair + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 u.toH1.grad v.toH1.grad) + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + qoneCoarseFluxResponseBound Q a a0 s u) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * qoneCoarseFluxResponseBound Q a a0 s u := by + exact + solution_l2_close_harmonic_of_qonePartialFluxDefectBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm hcomparison + hpartialFluxDefectBound + +/-- +Harmonic-approximation comparison with the q=1 actual flux-response RHS. + +This zero-trace-facing wrapper is the black-box endpoint to use once the +coarse-flux-response side supplies finite-depth q=1 bounds for the actual +defect `(a - a₀)∇u`. +-/ +theorem solution_l2_close_harmonic_of_qoneCoarseFluxResponsePartialBound + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hpartialFluxDefectBound : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminorm Q s N (fluxDefect a a0 u.toH1.grad) ≤ + qoneCoarseFluxResponseBound Q a a0 s u) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + Cdual * s⁻¹ * qoneCoarseFluxResponseBound Q a a0 s u := + solution_l2_close_harmonic_of_qoneCoarseFluxResponsePartialBound_of_comparisonPair + hdual Q a a0 sigma0 u v hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsHomogenizationComparisonPairOn.of_aHarmonicFunctions hEll ha0 u v hzeroTrace) + hpartialFluxDefectBound + +/-- +Homogeneous coarse-graining bound from manuscript lines 3264--3292 for an +arbitrary `H¹` function, written as the flux-defect quantity predicted by the +previous coarse-graining theorem with zero forcing. +-/ +noncomputable def homogeneousCoarseGrainingFluxDefectBoundH1 {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : H1Function (cubeSet Q)) : ℝ := + (s⁻¹) * Real.sqrt (matNorm a0) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 * + Real.sqrt (cubeAverage Q (coefficientEnergyDensity a u.grad)) + +/-- The homogeneous `H¹` comparison right-hand side after duality. -/ +noncomputable def homogeneousCoarseGrainingRhsH1 {d : ℕ} [NeZero d] + (Cdual : ℝ) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : H1Function (cubeSet Q)) : ℝ := + Cdual * s⁻¹ * + homogeneousCoarseGrainingFluxDefectBoundH1 Q a a0 s u + +/-- +The homogeneous `H¹` flux-defect bound is the general Section 3.3.B bound with +depth zero and zero right-hand side. +-/ +theorem homogeneousCoarseGrainingFluxDefectBoundH1_eq_coarseGrainingL2FluxDefectBound_zero_forcing + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : H1Function (cubeSet Q)) : + homogeneousCoarseGrainingFluxDefectBoundH1 Q a a0 s u = + coarseGrainingL2FluxDefectBound Q a a0 s 0 u.grad (0 : Vec d → Vec d) := by + rw [coarseGrainingL2FluxDefectBound_depth_zero_zero_forcing] + rfl + +/-- +The homogeneous `H¹` comparison RHS is the general Section 3.3.B RHS with depth +zero and zero right-hand side. +-/ +theorem homogeneousCoarseGrainingRhsH1_eq_coarseGrainingL2Rhs_zero_forcing + {d : ℕ} [NeZero d] (Cdual : ℝ) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : H1Function (cubeSet Q)) : + homogeneousCoarseGrainingRhsH1 Cdual Q a a0 s u = + coarseGrainingL2Rhs Cdual Q a a0 s 0 u.grad (0 : Vec d → Vec d) := by + unfold homogeneousCoarseGrainingRhsH1 coarseGrainingL2Rhs + rw [homogeneousCoarseGrainingFluxDefectBoundH1_eq_coarseGrainingL2FluxDefectBound_zero_forcing] + +/-- +Manuscript-facing homogeneous coarse-graining corollary for +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3254--3292. + +This is Corollary `c.general.coarse.graining.homogeneous.deterministic.theory` +in the same abstract-composition form as the Section 3.3.B theorem: the local +coarse flux-defect estimate enters as the single hypothesis +`hcoarseFluxDefect`. +-/ +theorem solution_diff_l2_le_homogeneousCoarseGrainingRhsH1_of_zeroRhs_of_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u v : H1Function (cubeSet Q)) {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u (0 : Vec d → Vec d)) + (hv : + IsH1DirichletRhsWeakSolutionOn + (constantCoeffField a0) (cubeSet Q) v (0 : Vec d → Vec d)) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.grad x - v.grad x)) + (hcoarseFluxDefect : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) 0 ≤ + homogeneousCoarseGrainingFluxDefectBoundH1 Q a a0 s u) : + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad ≤ + homogeneousCoarseGrainingRhsH1 Cdual Q a a0 s u := by + have _ : IsEllipticMatrix lam0 Lam0 a0 := ha0 + have _ : a0.IsSymm := ha0symm + have hcoarseFluxDefect' : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.grad) 0 ≤ + coarseGrainingL2FluxDefectBound Q a a0 s 0 u.grad (0 : Vec d → Vec d) := by + rw [← homogeneousCoarseGrainingFluxDefectBoundH1_eq_coarseGrainingL2FluxDefectBound_zero_forcing] + exact hcoarseFluxDefect + calc + solutionComparisonNegativeBesovLhs Q s a a0 u.grad v.grad + ≤ coarseGrainingL2Rhs Cdual Q a a0 s 0 u.grad (0 : Vec d → Vec d) := + solution_diff_l2_le_coarseGrainingL2Rhs_of_sameRhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 u v (0 : Vec d → Vec d) 0 + hsigma0 ha0eq hs_pos hs_lt_one hEll hu hv hzeroTrace hcoarseFluxDefect' + _ = homogeneousCoarseGrainingRhsH1 Cdual Q a a0 s u := by + rw [← homogeneousCoarseGrainingRhsH1_eq_coarseGrainingL2Rhs_zero_forcing] + +/-- +Homogeneous coarse-graining bound from manuscript lines 3264--3292, specialized +to an `a`-harmonic function. +-/ +noncomputable def homogeneousCoarseGrainingFluxDefectBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : ℝ := + homogeneousCoarseGrainingFluxDefectBoundH1 Q a a0 s u.toH1 + +/-- The homogeneous harmonic-approximation right-hand side after duality. -/ +noncomputable def homogeneousCoarseGrainingRhs {d : ℕ} [NeZero d] + (Cdual : ℝ) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : ℝ := + Cdual * s⁻¹ * + homogeneousCoarseGrainingFluxDefectBound Q a a0 s u + +/-- +The homogeneous flux-defect bound is the general Section 3.3.B bound with +depth zero and zero right-hand side. +-/ +theorem homogeneousCoarseGrainingFluxDefectBound_eq_coarseGrainingL2FluxDefectBound_zero_forcing + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : + homogeneousCoarseGrainingFluxDefectBound Q a a0 s u = + coarseGrainingL2FluxDefectBound Q a a0 s 0 u.toH1.grad (0 : Vec d → Vec d) := by + rw [coarseGrainingL2FluxDefectBound_depth_zero_zero_forcing] + rfl + +/-- +The homogeneous comparison RHS is the general Section 3.3.B RHS with depth +zero and zero right-hand side. +-/ +theorem homogeneousCoarseGrainingRhs_eq_coarseGrainingL2Rhs_zero_forcing + {d : ℕ} [NeZero d] (Cdual : ℝ) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (u : AHarmonicFunction a (cubeSet Q)) : + homogeneousCoarseGrainingRhs Cdual Q a a0 s u = + coarseGrainingL2Rhs Cdual Q a a0 s 0 u.toH1.grad (0 : Vec d → Vec d) := by + unfold homogeneousCoarseGrainingRhs coarseGrainingL2Rhs + rw [homogeneousCoarseGrainingFluxDefectBound_eq_coarseGrainingL2FluxDefectBound_zero_forcing] + +/-- +Homogeneous coarse-graining corollary for an already packaged comparison pair. + +This proof deliberately specializes the Section 3.3.B coarse-graining theorem +with depth zero and zero forcing, matching the manuscript proof of +Corollary `c.general.coarse.graining.homogeneous.deterministic.theory`. +-/ +theorem solution_l2_close_harmonic_of_homogeneous_coarseFluxDefect_le_of_comparisonPair + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hcomparison : + IsHomogenizationComparisonPairOn (cubeSet Q) a a0 u.toH1.grad v.toH1.grad) + (hcoarseFluxDefect : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ + homogeneousCoarseGrainingFluxDefectBound Q a a0 s u) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + homogeneousCoarseGrainingRhs Cdual Q a a0 s u := by + have _ : IsEllipticMatrix lam0 Lam0 a0 := ha0 + have _ : a0.IsSymm := ha0symm + have hcoarseFluxDefect' : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fluxDefect a a0 u.toH1.grad) 0 ≤ + coarseGrainingL2FluxDefectBound Q a a0 s 0 u.toH1.grad (0 : Vec d → Vec d) := by + rw [← homogeneousCoarseGrainingFluxDefectBound_eq_coarseGrainingL2FluxDefectBound_zero_forcing] + simpa [harmonicApproximationFluxDefectBound] using hcoarseFluxDefect + calc + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad + ≤ coarseGrainingL2Rhs Cdual Q a a0 s 0 u.toH1.grad (0 : Vec d → Vec d) := + solution_diff_l2_le_coarseGrainingL2Rhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 u.toH1.grad v.toH1.grad (0 : Vec d → Vec d) 0 + hsigma0 ha0eq hs_pos hs_lt_one hEll hcomparison hcoarseFluxDefect' + _ = homogeneousCoarseGrainingRhs Cdual Q a a0 s u := by + rw [← homogeneousCoarseGrainingRhs_eq_coarseGrainingL2Rhs_zero_forcing] + +/-- +Homogeneous coarse-graining corollary for +`coarsegraining/chapters/ch3_deterministic_theory.tex`, lines 3264--3292. + +The single hypothesis `hcoarseFluxDefect` is the homogeneous local +flux-defect estimate. When supplied by the coarse-graining side, this recovers +the displayed estimate for the `a₀`-harmonic replacement. The boundary input +is the manuscript zero-trace condition for the replacement. +-/ +theorem solution_l2_close_harmonic_of_homogeneous_coarseFluxDefect_le + {d : ℕ} [NeZero d] {Cdual : ℝ} + (hdual : ScalarSolutionComparisonDualityEstimate d Cdual) + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) (sigma0 : ℝ) + (u : AHarmonicFunction a (cubeSet Q)) + (v : AHarmonicFunction (constantCoeffField a0) (cubeSet Q)) + {s : ℝ} {lam Lam lam0 Lam0 : ℝ} + (hs_pos : 0 < s) (hs_lt_one : s < 1) + (hsigma0 : 0 < sigma0) + (ha0eq : a0 = scalarMatrix (d := d) sigma0) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (ha0 : IsEllipticMatrix lam0 Lam0 a0) + (ha0symm : a0.IsSymm) + (hzeroTrace : + IsPotentialZeroTraceOn (cubeSet Q) (fun x => u.toH1.grad x - v.toH1.grad x)) + (hcoarseFluxDefect : + harmonicApproximationFluxDefectBound Q a a0 s u ≤ + homogeneousCoarseGrainingFluxDefectBound Q a a0 s u) : + solutionComparisonNegativeBesovLhs Q s a a0 u.toH1.grad v.toH1.grad ≤ + homogeneousCoarseGrainingRhs Cdual Q a a0 s u := by + have hcoarseFluxDefectH1 : + localizedFluxDefectNegativeBesovAverageTwo Q s (fluxDefect a a0 u.toH1.grad) 0 ≤ + homogeneousCoarseGrainingFluxDefectBoundH1 Q a a0 s u.toH1 := by + simpa [harmonicApproximationFluxDefectBound, homogeneousCoarseGrainingFluxDefectBound] + using hcoarseFluxDefect + have hH1 := + solution_diff_l2_le_homogeneousCoarseGrainingRhsH1_of_zeroRhs_of_coarseFluxDefect_le + hdual Q a a0 sigma0 u.toH1 v.toH1 hs_pos hs_lt_one hsigma0 ha0eq hEll ha0 ha0symm + (IsH1DirichletRhsWeakSolutionOn.of_aHarmonicFunction u) + (IsH1DirichletRhsWeakSolutionOn.of_aHarmonicFunction v) + hzeroTrace hcoarseFluxDefectH1 + simpa [homogeneousCoarseGrainingRhs] using! hH1 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantities.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantities.lean new file mode 100644 index 0000000000..bb1dd1acfd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantities.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import Mathlib.Analysis.Matrix.Normed +public import Mathlib.Analysis.Matrix.Order +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Topology.Algebra.InfiniteSum.Real + +/-! # Multiscale Quantities -/ + +@[expose] public section + +open scoped BigOperators +open scoped MatrixOrder + +namespace Homogenization + +inductive MultiscaleExponent where + | finite (value : ℝ) + | infinity + +def fullBlockVecNormSq {d : ℕ} (x : FullBlockVec d) : ℝ := + ∑ i, x i ^ 2 + +def matNormSq {d : ℕ} (A : Mat d) : ℝ := + ∑ i, ∑ j, A i j ^ 2 + +noncomputable def matNorm {d : ℕ} (A : Mat d) : ℝ := + Real.sqrt (matNormSq A) + +noncomputable def finsetAverage {α : Type*} (s : Finset α) (f : α → ℝ) : ℝ := + ((s.card : ℝ)⁻¹) * s.sum f + +noncomputable def finsetSsup {α : Type*} (s : Finset α) (f : α → ℝ) : ℝ := + sSup (f '' (↑s : Set α)) + +noncomputable def coarseBBlockNorm {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) : ℝ := + matNorm (coarseBlockMatrix (cubeSet Q) a).upperLeft + +noncomputable def coarseSigmaStarInvBlockNorm {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) : ℝ := + matNorm (coarseBlockMatrix (cubeSet Q) a).lowerRight + +noncomputable def maxDescendantBBlockNormAtScale {d : ℕ} (Q : TriadicCube d) + (k : ℤ) (a : CoeffField d) : ℝ := + finsetSsup (descendantsAtScale Q k) (fun R => coarseBBlockNorm R a) + +noncomputable def maxDescendantSigmaStarInvNormAtScale {d : ℕ} (Q : TriadicCube d) + (k : ℤ) (a : CoeffField d) : ℝ := + finsetSsup (descendantsAtScale Q k) (fun R => coarseSigmaStarInvBlockNorm R a) + +noncomputable def geometricDiscount (s q : ℝ) : ℝ := + 1 - Real.rpow (3 : ℝ) (-s * q) + +noncomputable def geometricWeight (s q : ℝ) (n : ℕ) : ℝ := + geometricDiscount s q * Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) + +noncomputable def LambdaSqFinite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : CoeffField d) : ℝ := + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) + (2 / q) + +noncomputable def lambdaSqFinite {d : ℕ} (Q : TriadicCube d) (s q : ℝ) + (a : CoeffField d) : ℝ := + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) + (-2 / q) + +noncomputable def LambdaSqInfinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : CoeffField d) : ℝ := + sSup + { m | ∃ n : ℕ, + m = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a } + +noncomputable def lambdaSqInfinity {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (a : CoeffField d) : ℝ := + (sSup + { m | ∃ n : ℕ, + m = + Real.rpow (3 : ℝ) (-2 * s * (n : ℝ)) * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a })⁻¹ + +noncomputable def LambdaSq {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) (a : CoeffField d) : ℝ := + match q with + | .finite q => LambdaSqFinite Q s q a + | .infinity => LambdaSqInfinity Q s a + +noncomputable def lambdaSq {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (q : MultiscaleExponent) (a : CoeffField d) : ℝ := + match q with + | .finite q => lambdaSqFinite Q s q a + | .infinity => lambdaSqInfinity Q s a + +/-- +Deterministic cube-level contrast ratio `Λ_{s,1}(Q) / λ_{t,1}(Q)`. +This is not the annealed Chapter-5 sequence `Θ_n`. +-/ +noncomputable def ThetaRatio {d : ℕ} (Q : TriadicCube d) (s t : ℝ) + (a : CoeffField d) : ℝ := + LambdaSq Q s (.finite 1) a / lambdaSq Q t (.finite 1) a + +noncomputable def constantFullBlockMatrix {d : ℕ} (a0 : Mat d) : FullBlockMat d := + toFullBlockMat (blockMatrixOfCoeff a0) + +noncomputable def constantFullBlockMatrixSqrt {d : ℕ} (a0 : Mat d) : FullBlockMat d := + CFC.sqrt (constantFullBlockMatrix a0) + +noncomputable def constantFullBlockMatrixInvSqrt {d : ℕ} (a0 : Mat d) : FullBlockMat d := + (constantFullBlockMatrixSqrt a0)⁻¹ + +noncomputable def normalizedBlockResponseValueSet {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (a0 : Mat d) : Set ℝ := + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + m = + BlockJ (cubeSet Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + a } + +noncomputable def normalizedBlockResponseMax {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) (a0 : Mat d) : ℝ := + sSup (normalizedBlockResponseValueSet Q a a0) + +noncomputable def maxDescendantNormalizedBlockResponseAtScale {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (a : CoeffField d) (a0 : Mat d) : ℝ := + finsetSsup (descendantsAtScale Q k) (fun R => normalizedBlockResponseMax R a a0) + +noncomputable def scaleResponseAtScale {d : ℕ} (Q : TriadicCube d) (k : ℤ) + (p : MultiscaleExponent) (a : CoeffField d) (a0 : Mat d) : ℝ := + match p with + | .finite p => + Real.rpow + (finsetAverage (descendantsAtScale Q k) + (fun R => Real.rpow (normalizedBlockResponseMax R a a0) (p / 2))) + (1 / p) + | .infinity => + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q k a a0) (1 / 2) + +noncomputable def HomogenizationErrorFinite {d : ℕ} (Q : TriadicCube d) (n : ℤ) + (s : ℝ) (p : MultiscaleExponent) (q : ℝ) (a : CoeffField d) (a0 : Mat d) : ℝ := + Real.rpow + (∑' l : ℕ, + geometricWeight s q l * + Real.rpow (scaleResponseAtScale Q (n - (l : ℤ)) p a a0) q) + (1 / q) + +noncomputable def HomogenizationErrorInfinity {d : ℕ} (Q : TriadicCube d) (n : ℤ) + (s : ℝ) (p : MultiscaleExponent) (a : CoeffField d) (a0 : Mat d) : ℝ := + sSup + { m | ∃ l : ℕ, + m = + Real.rpow (3 : ℝ) (-s * (l : ℝ)) * + scaleResponseAtScale Q (n - (l : ℤ)) p a a0 } + +noncomputable def HomogenizationError {d : ℕ} (Q : TriadicCube d) (n : ℤ) + (s : ℝ) (p q : MultiscaleExponent) (a : CoeffField d) (a0 : Mat d) : ℝ := + match q with + | .finite q => HomogenizationErrorFinite Q n s p q a a0 + | .infinity => HomogenizationErrorInfinity Q n s p a a0 + +noncomputable def HomogenizationErrorOnCube {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (p q : MultiscaleExponent) (a : CoeffField d) (a0 : Mat d) : ℝ := + HomogenizationError Q Q.scale s p q a a0 + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic.lean new file mode 100644 index 0000000000..6bdef1093e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Theta +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.HomogenizationError + +/-! # Multiscale Quantities Basic -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity.lean new file mode 100644 index 0000000000..600d03381f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.ScaleBounds + +/-! +# q = 1 multiscale ellipticity API + +Compatibility wrapper for the split q = 1 ellipticity development. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/Descendants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/Descendants.lean new file mode 100644 index 0000000000..b6e26ba37c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/Descendants.lean @@ -0,0 +1,855 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.QOneRoot + +/-! # Descendants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem thetaRatio_eq_sq_mul_rpow_half_rpow_neg_half {d : ℕ} + (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) + (hs : 0 ≤ s) (ht : 0 ≤ t) : + ThetaRatio Q s t a = + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + have hLambda : + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 = + LambdaSq Q s (.finite 1) a := by + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_inv_rpow + (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) + (show (2 : ℝ) ≠ 0 by norm_num)) + have hlambdaInv : + (Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 = + (lambdaSq Q t (.finite 1) a)⁻¹ := by + let x := lambdaSq Q t (.finite 1) a + have hx : 0 ≤ x := by + dsimp [x] + exact multiscale_ellipticity_lambdaSq_one_nonneg Q t a ht + change (Real.rpow x (-1 / 2 : ℝ)) ^ 2 = x⁻¹ + calc + (Real.rpow x (-1 / 2 : ℝ)) ^ 2 = + Real.rpow (Real.rpow x (-1 / 2 : ℝ)) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow x ((-1 / 2 : ℝ) * 2) := by + simpa using (Real.rpow_mul hx (-1 / 2 : ℝ) (2 : ℝ)).symm + _ = x⁻¹ := by + norm_num + rw [Real.rpow_neg_one] + rw [thetaRatio_eq_div, div_eq_mul_inv] + calc + LambdaSq Q s (.finite 1) a * (lambdaSq Q t (.finite 1) a)⁻¹ = + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 * + (Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + rw [hLambda, hlambdaInv] + _ = + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + rw [pow_two, pow_two, pow_two] + ring + +theorem thetaRatio_eq_sq_series_product {d : ℕ} + (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) + (hs : 0 ≤ s) (ht : 0 ≤ t) : + ThetaRatio Q s t a = + ((∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) * + (∑' n : ℕ, + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) ^ 2 := by + rw [thetaRatio_eq_sq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + rw [multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q s a hs] + rw [multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q t a ht] + +theorem thetaRatio_nonneg {d : ℕ} + (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) + (hs : 0 ≤ s) (ht : 0 ≤ t) : + 0 ≤ ThetaRatio Q s t a := by + rw [thetaRatio_eq_sq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + exact sq_nonneg _ + +theorem thetaRatio_rpow_half_eq_mul_rpow_half_rpow_neg_half {d : ℕ} + (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) + (hs : 0 ≤ s) (ht : 0 ≤ t) : + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) = + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := by + rw [thetaRatio_eq_sq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + let x := + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) + have hLambdaNonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) _ + have hlambdaNonneg : + 0 ≤ Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_lambdaSq_one_nonneg Q t a ht) _ + have hprodNonneg : 0 ≤ x := by + dsimp [x] + exact mul_nonneg hLambdaNonneg hlambdaNonneg + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + change Real.rpow (x ^ 2) (1 / 2 : ℝ) = x + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_rpow_inv hprodNonneg (show (2 : ℝ) ≠ 0 by norm_num)) + +theorem multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let fR : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let factor : ℝ := Real.rpow (3 : ℝ) (s * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ) ≤ + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) (1 / 2 : ℝ) := by + refine Real.rpow_le_rpow + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + norm_num + calc + fR n = + factor * + (geometricWeight s 1 (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := by + dsimp [fR, factor] + rw [geometricWeight_one_shift (s := s) h n] + simp [mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s 1 (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (1 / 2 : ℝ)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow (geometricWeight_nonneg (n + h) (by simpa using hs)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledNonneg : ∀ n : ℕ, 0 ≤ factor * fQ (n + h) := by + intro n + exact mul_nonneg hfactorNonneg (hQnonneg (n + h)) + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := by + exact Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) = ∑' n : ℕ, fR n := by + simpa [fR] using (multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum R s a hs) + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q s a hs).symm + +/-- Convert a depth-`j` descendant membership into the corresponding +absolute-scale descendant membership. -/ +theorem mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := by + have hk : Q.scale - (j : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le j) + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simpa [hdiff] using hR + +/-- A summable upper-ellipticity `q = 1` series remains summable after +restricting the base cube to a descendant. -/ +theorem summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let fR : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let factor : ℝ := Real.rpow (3 : ℝ) (s * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := + (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + Real.rpow + (maxDescendantBBlockNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (1 / 2 : ℝ) := by + refine Real.rpow_le_rpow + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + norm_num + calc + fR n = + factor * + (geometricWeight s 1 (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + dsimp [fR, factor] + rw [geometricWeight_one_shift (s := s) h n] + simp [mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s 1 (n + h) * + Real.rpow + (maxDescendantBBlockNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (1 / 2 : ℝ)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (geometricWeight_nonneg (n + h) (by simpa using hs)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + exact Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + +/-- Depth-`j` form of +`summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtScale`. -/ +theorem summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_geometricWeight_maxDescendantBBlockNormAtScale_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s hs + (mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR) hsum + +/-- Depth-`j` form of +`summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtScale`. -/ +theorem + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + exact + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s (1 : ℝ) hs + (by norm_num) (mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR) hsum + +/-- Depth-`j` form of the finite-`q = 1` upper ellipticity localization. -/ +theorem multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + simpa [htoNat] using + (multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s hs hRscale hsum) + +theorem multiscale_ellipticity_LambdaSq_one_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + LambdaSq R s (.finite 1) a ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite 1) a := by + have hhalf := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + have hsqrt_nonneg : + 0 ≤ Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs) _ + have hsq := pow_le_pow_left₀ hsqrt_nonneg hhalf 2 + have hfactorSq : + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) := by + calc + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) ((s * (Int.toNat (Q.scale - k) : ℝ)) * 2) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (s * (Int.toNat (Q.scale - k) : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) := by + congr 1 + ring + calc + LambdaSq R s (.finite 1) a = + (Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := by + symm + exact sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg R s a hs) + _ ≤ + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := hsq + _ = + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 * + LambdaSq Q s (.finite 1) a := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs)] + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite 1) a := by + rw [hfactorSq] + +theorem multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (lambdaSq R s (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let fR : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ) + let factor : ℝ := Real.rpow (3 : ℝ) (s * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantSigmaStarInvNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) (1 / 2 : ℝ) ≤ + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (1 / 2 : ℝ) := by + refine Real.rpow_le_rpow + (maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + norm_num + calc + fR n = + factor * + (geometricWeight s 1 (n + h) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := by + dsimp [fR, factor] + rw [geometricWeight_one_shift (s := s) h n] + simp [mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s 1 (n + h) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (1 / 2 : ℝ)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow (geometricWeight_nonneg (n + h) (by simpa using hs)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hscaledNonneg : ∀ n : ℕ, 0 ≤ factor * fQ (n + h) := by + intro n + exact mul_nonneg hfactorNonneg (hQnonneg (n + h)) + have hRsummable : Summable fR := by + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + exact Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := by + exact Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + Real.rpow (lambdaSq R s (.finite 1) a) (-1 / 2 : ℝ) = ∑' n : ℕ, fR n := by + simpa [fR] using (multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum R s a hs) + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q s a hs).symm + +/-- Depth-`j` form of the finite-`q = 1` lower ellipticity localization. -/ +theorem multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtDepth Q j) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (lambdaSq R s (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + simpa [htoNat] using + (multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s hs hRscale hsum) + +theorem multiscale_ellipticity_lambdaSq_one_inv_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + (lambdaSq R s (.finite 1) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + have hhalf := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + have hsqrt_nonneg : + 0 ≤ Real.rpow (lambdaSq R s (.finite 1) a) (-1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_lambdaSq_one_nonneg R s a hs) _ + have hsq := pow_le_pow_left₀ hsqrt_nonneg hhalf 2 + have hfactorSq : + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) := by + calc + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) ((s * (Int.toNat (Q.scale - k) : ℝ)) * 2) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + (s * (Int.toNat (Q.scale - k) : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) := by + congr 1 + ring + calc + (lambdaSq R s (.finite 1) a)⁻¹ = + (Real.rpow (lambdaSq R s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + symm + exact sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg R s a hs) + _ ≤ + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := hsq + _ = + (Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + rw [pow_two] + ring_nf + rw [sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q s a hs)] + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + rw [hfactorSq] + +theorem multiscale_ellipticity_LambdaSq_one_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite 1) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite 1) a := by + unfold finsetSsup + have hne : + ((fun R => LambdaSq R s (.finite 1) a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨LambdaSq R s (.finite 1) a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact multiscale_ellipticity_LambdaSq_one_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + +theorem multiscale_ellipticity_lambdaSq_one_inv_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite 1) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + unfold finsetSsup + have hne : + ((fun R => (lambdaSq R s (.finite 1) a)⁻¹) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨(lambdaSq R s (.finite 1) a)⁻¹, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact multiscale_ellipticity_lambdaSq_one_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + +theorem thetaRatio_rpow_half_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) (hR : R ∈ descendantsAtScale Q k) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + let h : ℕ := Int.toNat (Q.scale - k) + have hLambda := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hBsum + have hlambda := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a t ht hR hSigmaSum + have h3 : 0 < (3 : ℝ) := by norm_num + have hLambdaQNonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) _ + have hlambdaRNonneg : + 0 ≤ Real.rpow (lambdaSq R t (.finite 1) a) (-1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_lambdaSq_one_nonneg R t a ht) _ + rw [thetaRatio_rpow_half_eq_mul_rpow_half_rpow_neg_half R s t a hs ht, + thetaRatio_rpow_half_eq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + calc + Real.rpow (LambdaSq R s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq R t (.finite 1) a) (-1 / 2 : ℝ) ≤ + (Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) * + (Real.rpow (3 : ℝ) (t * (h : ℝ)) * Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) := by + exact mul_le_mul hLambda hlambda hlambdaRNonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hLambdaQNonneg) + _ = + Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) := by + have hpow : + Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (3 : ℝ) (t * (h : ℝ)) = + Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) := by + calc + Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (3 : ℝ) (t * (h : ℝ)) = + Real.rpow (3 : ℝ) (s * (h : ℝ) + t * (h : ℝ)) := by + simpa using (Real.rpow_add h3 (s * (h : ℝ)) (t * (h : ℝ))).symm + _ = Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) := by + congr 1 + ring + calc + (Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) * + (Real.rpow (3 : ℝ) (t * (h : ℝ)) * Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) = + (Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (3 : ℝ) (t * (h : ℝ))) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) := by + ring + _ = + Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) * + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) := by + rw [hpow] + +/-- Depth-`j` form of the `ThetaRatio` square-root localization. -/ +theorem thetaRatio_rpow_half_le_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) (hR : R ∈ descendantsAtDepth Q j) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) ((s + t) * (j : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (j : ℤ)) := + mem_descendantsAtScale_sub_nat_of_mem_descendantsAtDepth hR + have htoNat : Int.toNat (Q.scale - (Q.scale - (j : ℤ))) = j := by + have hdiff : Q.scale - (Q.scale - (j : ℤ)) = (j : ℤ) := by + ring + simp [hdiff] + simpa [htoNat] using + (thetaRatio_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (j : ℤ)) a s t hs ht hRscale hBsum hSigmaSum) + +theorem thetaRatio_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) (hR : R ∈ descendantsAtScale Q k) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + ThetaRatio R s t a ≤ + Real.rpow (3 : ℝ) (2 * (s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + ThetaRatio Q s t a := by + have hhalf := + thetaRatio_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s t hs ht hR hBsum hSigmaSum + have hsqrt_nonneg : + 0 ≤ Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (thetaRatio_nonneg R s t a hs ht) _ + have hsq := pow_le_pow_left₀ hsqrt_nonneg hhalf 2 + have hfactorSq : + (Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow (3 : ℝ) (2 * (s + t) * (Int.toNat (Q.scale - k) : ℝ)) := by + calc + (Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 = + Real.rpow + (Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ))) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow (3 : ℝ) (((s + t) * (Int.toNat (Q.scale - k) : ℝ)) * 2) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) + ((s + t) * (Int.toNat (Q.scale - k) : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (2 * (s + t) * (Int.toNat (Q.scale - k) : ℝ)) := by + congr 1 + ring + calc + ThetaRatio R s t a = (Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ)) ^ 2 := by + symm + exact sq_rpow_half_eq_self_of_nonneg (thetaRatio_nonneg R s t a hs ht) + _ ≤ + (Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) ^ 2 := hsq + _ = + (Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ))) ^ 2 * + ThetaRatio Q s t a := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg (thetaRatio_nonneg Q s t a hs ht)] + _ = Real.rpow (3 : ℝ) (2 * (s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + ThetaRatio Q s t a := by + rw [hfactorSq] + +theorem thetaRatio_rpow_half_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + finsetSsup (descendantsAtScale Q k) + (fun R => Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ)) ≤ + Real.rpow (3 : ℝ) ((s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + unfold finsetSsup + have hne : + ((fun R => Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ)) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ), ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact thetaRatio_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s t hs ht hR hBsum hSigmaSum + +theorem thetaRatio_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + finsetSsup (descendantsAtScale Q k) (fun R => ThetaRatio R s t a) ≤ + Real.rpow (3 : ℝ) (2 * (s + t) * (Int.toNat (Q.scale - k) : ℝ)) * + ThetaRatio Q s t a := by + unfold finsetSsup + have hne : + ((fun R => ThetaRatio R s t a) '' (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨ThetaRatio R s t a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact thetaRatio_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s t hs ht hR hBsum hSigmaSum + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/QOneRoot.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/QOneRoot.lean new file mode 100644 index 0000000000..8cf1a233fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/QOneRoot.lean @@ -0,0 +1,845 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences + +/-! # QOne Root -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# q = 1 ellipticity and localization +-/ + +theorem sqrt_coarseBBlockNorm_le_sqrt_maxDescendantBBlockNormAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) : + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (maxDescendantBBlockNormAtScale Q k a) (1 / 2 : ℝ) := by + refine Real.rpow_le_rpow (coarseBBlockNorm_nonneg R a) + (coarseBBlockNorm_le_maxDescendantBBlockNormAtScale a hR) ?_ + norm_num + +theorem sqrt_coarseSigmaStarInvBlockNorm_le_sqrt_maxDescendantSigmaStarInvNormAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) : + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q k a) (1 / 2 : ℝ) := by + refine Real.rpow_le_rpow (coarseSigmaStarInvBlockNorm_nonneg R a) + (coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale a hR) ?_ + norm_num + +theorem geometricWeight_mul_sqrt_coarseBBlockNorm_le {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) (n : ℕ) + (hsq : 0 ≤ s * q) (hR : R ∈ descendantsAtScale Q k) : + geometricWeight s q n * Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + geometricWeight s q n * Real.rpow (maxDescendantBBlockNormAtScale Q k a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left + (sqrt_coarseBBlockNorm_le_sqrt_maxDescendantBBlockNormAtScale a hR) + (geometricWeight_nonneg n hsq) + +theorem geometricWeight_mul_sqrt_coarseSigmaStarInvBlockNorm_le {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) (n : ℕ) + (hsq : 0 ≤ s * q) (hR : R ∈ descendantsAtScale Q k) : + geometricWeight s q n * Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + geometricWeight s q n * Real.rpow (maxDescendantSigmaStarInvNormAtScale Q k a) (1 / 2 : ℝ) := by + exact mul_le_mul_of_nonneg_left + (sqrt_coarseSigmaStarInvBlockNorm_le_sqrt_maxDescendantSigmaStarInvNormAtScale a hR) + (geometricWeight_nonneg n hsq) + +theorem weighted_sqrt_coarseBBlockNorm_le_LambdaSqFinite_one_series {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + have hk : k ≤ Q.scale := by + by_contra hk + exact (not_mem_descendantsAtScale_of_lt (Q := Q) (R := R) (k := k) (lt_of_not_ge hk)) hR + let N : ℕ := Int.toNat (Q.scale - k) + have hN : (N : ℤ) = Q.scale - k := by + dsimp [N] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hk_eq : Q.scale - (N : ℤ) = k := by + rw [hN] + ring + have hR' : R ∈ descendantsAtScale Q (Q.scale - (N : ℤ)) := by + simpa [hk_eq] using hR + have hterm : + geometricWeight s 1 N * Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + geometricWeight s 1 N * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (N : ℤ)) a) (1 / 2 : ℝ) := by + exact geometricWeight_mul_sqrt_coarseBBlockNorm_le + (a := a) (s := s) (q := 1) (n := N) (by simpa using hs) hR' + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hsingleton : + ∑ n ∈ ({N} : Finset ℕ), + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum ({N} : Finset ℕ) (fun n _ => hnonneg n) + exact le_trans hterm (by simpa [N] using hsingleton) + +theorem weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSqFinite_one_series {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + have hk : k ≤ Q.scale := by + by_contra hk + exact (not_mem_descendantsAtScale_of_lt (Q := Q) (R := R) (k := k) (lt_of_not_ge hk)) hR + let N : ℕ := Int.toNat (Q.scale - k) + have hN : (N : ℤ) = Q.scale - k := by + dsimp [N] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hk_eq : Q.scale - (N : ℤ) = k := by + rw [hN] + ring + have hR' : R ∈ descendantsAtScale Q (Q.scale - (N : ℤ)) := by + simpa [hk_eq] using hR + have hterm : + geometricWeight s 1 N * Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + geometricWeight s 1 N * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (N : ℤ)) a) + (1 / 2 : ℝ) := by + exact geometricWeight_mul_sqrt_coarseSigmaStarInvBlockNorm_le + (a := a) (s := s) (q := 1) (n := N) (by simpa using hs) hR' + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hsingleton : + ∑ n ∈ ({N} : Finset ℕ), + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + exact hsum.sum_le_tsum ({N} : Finset ℕ) (fun n _ => hnonneg n) + exact le_trans hterm (by simpa [N] using hsingleton) + +theorem weighted_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hseries_nonneg : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := + tsum_nonneg hnonneg + calc + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := + weighted_sqrt_coarseBBlockNorm_le_LambdaSqFinite_one_series a s hs hR hsum + _ = Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + rw [multiscale_ellipticity_LambdaSq_one_formula] + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + symm + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_rpow_inv hseries_nonneg (show (2 : ℝ) ≠ 0 by norm_num)) + +theorem weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_rpow_neg_half {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hseries_nonneg : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := + tsum_nonneg hnonneg + calc + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := + weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSqFinite_one_series a s hs hR hsum + _ = Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + rw [multiscale_ellipticity_lambdaSq_one_formula] + have hhalf : (-1 / 2 : ℝ) = (-2 : ℝ)⁻¹ := by norm_num + symm + simpa [hhalf] using + (Real.rpow_rpow_inv hseries_nonneg (show (-2 : ℝ) ≠ 0 by norm_num)) + +theorem geometricDiscount_mul_sqrt_coarseBBlockNorm_le_LambdaSqFinite_one_series {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + geometricDiscount s 1 * Real.rpow (coarseBBlockNorm Q a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + simpa using weighted_sqrt_coarseBBlockNorm_le_LambdaSqFinite_one_series + (Q := Q) (R := Q) (k := Q.scale) a s hs (by simp) hsum + +theorem geometricDiscount_mul_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSqFinite_one_series + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + geometricDiscount s 1 * Real.rpow (coarseSigmaStarInvBlockNorm Q a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + simpa using weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSqFinite_one_series + (Q := Q) (R := Q) (k := Q.scale) a s hs (by simp) hsum + +theorem geometricDiscount_mul_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + geometricDiscount s 1 * Real.rpow (coarseBBlockNorm Q a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hseries_nonneg : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := + tsum_nonneg hnonneg + calc + geometricDiscount s 1 * Real.rpow (coarseBBlockNorm Q a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := + geometricDiscount_mul_sqrt_coarseBBlockNorm_le_LambdaSqFinite_one_series Q a s hs hsum + _ = Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + rw [multiscale_ellipticity_LambdaSq_one_formula] + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + symm + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_rpow_inv hseries_nonneg (show (2 : ℝ) ≠ 0 by norm_num)) + +theorem geometricDiscount_mul_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_rpow_neg_half + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + geometricDiscount s 1 * Real.rpow (coarseSigmaStarInvBlockNorm Q a) (1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + have hnonneg : + ∀ n : ℕ, + 0 ≤ + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hseries_nonneg : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := + tsum_nonneg hnonneg + calc + geometricDiscount s 1 * Real.rpow (coarseSigmaStarInvBlockNorm Q a) (1 / 2 : ℝ) ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := + geometricDiscount_mul_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSqFinite_one_series Q a s hs + hsum + _ = Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + rw [multiscale_ellipticity_lambdaSq_one_formula] + have hhalf : (-1 / 2 : ℝ) = (-2 : ℝ)⁻¹ := by norm_num + symm + simpa [hhalf] using + (Real.rpow_rpow_inv hseries_nonneg (show (-2 : ℝ) ≠ 0 by norm_num)) + +theorem multiscale_ellipticity_LambdaSq_one_series_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + refine tsum_nonneg ?_ + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_lambdaSq_one_series_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + refine tsum_nonneg ?_ + intro n + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_LambdaSq_one_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + 0 ≤ LambdaSq Q s (.finite 1) a := by + rw [multiscale_ellipticity_LambdaSq_one_formula] + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_one_series_nonneg Q s a hs) _ + +theorem multiscale_ellipticity_lambdaSq_one_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + 0 ≤ lambdaSq Q s (.finite 1) a := by + rw [multiscale_ellipticity_lambdaSq_one_formula] + exact Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_one_series_nonneg Q s a hs) _ + +theorem matNorm_pos_of_posDef {d : ℕ} [NeZero d] {A : Mat d} (hA : A.PosDef) : + 0 < matNorm A := by + let i : Fin d := ⟨0, Nat.pos_of_ne_zero (NeZero.ne d)⟩ + have hdiag : 0 < A i i := hA.diag_pos + have hA_ne : A ≠ 0 := by + intro hzero + have hdiag_zero : A i i = 0 := by simp [hzero] + linarith + rw [matNorm_eq_norm] + exact norm_pos_iff.mpr hA_ne + +theorem coarseBBlockNorm_pos_of_isEllipticFieldOn_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDeterministicCoarseData Q a) : + 0 < coarseBBlockNorm Q a := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hvol : (MeasureTheory.volume (openCubeSet Q)).toReal ≠ 0 := by + rw [volume_openCubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hpos : + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)).PosDef := + bCoarse_canonical_posDef_of_isEllipticFieldOn_of_isSobolevRegularDomain + (U := openCubeSet Q) (a := a) + (isOpenBoundedConvexDomain_openCubeSet Q).isSobolevRegularDomain + hEll hvol hA hS hK hSigma hdet + have hcanon : + bCoarse sigma sigmaStar kappa = + bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + unfold coarseBBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a, + coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix + hA hS hK hSigma hdet, + hcanon] + exact matNorm_pos_of_posDef hpos + +theorem coarseSigmaStarInvBlockNorm_pos_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (hData : OpenCubeDeterministicCoarseData Q a) : + 0 < coarseSigmaStarInvBlockNorm Q a := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + have hpos : (sigmaStarInvCoarse (openCubeSet Q) a).PosDef := + sigmaStarInvCoarse_posDef_of_isSigmaStarCoarse (U := openCubeSet Q) (a := a) hS hdet + have hcanon : sigmaStar⁻¹ = sigmaStarInvCoarse (openCubeSet Q) a := by + symm + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + unfold coarseSigmaStarInvBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix + hA hS hK hSigma hdet, + hcanon] + exact matNorm_pos_of_posDef hpos + +theorem multiscale_ellipticity_LambdaSq_one_series_pos_of_isEllipticFieldOn_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + {lam Lam : ℝ} (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + 0 < + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + let f : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) + have hf_nonneg : ∀ n : ℕ, 0 ≤ f n := by + intro n + dsimp [f] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hf_zero_pos : 0 < f 0 := by + have hweight : 0 < geometricWeight s 1 0 := + geometricWeight_pos 0 (by simpa using hs) + have hmax : 0 < maxDescendantBBlockNormAtScale Q Q.scale a := by + simpa using coarseBBlockNorm_pos_of_isEllipticFieldOn_of_openCubeData + Q a hEll hData + have hrpow : + 0 < Real.rpow (maxDescendantBBlockNormAtScale Q Q.scale a) (1 / 2 : ℝ) := + Real.rpow_pos_of_pos hmax _ + dsimp [f] + simpa using mul_pos hweight hrpow + simpa [f] using hsum.tsum_pos hf_nonneg 0 hf_zero_pos + +theorem multiscale_ellipticity_lambdaSq_one_series_pos_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (hs : 0 < s) + (hData : OpenCubeDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + 0 < + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + let f : ℕ → ℝ := fun n => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) + have hf_nonneg : ∀ n : ℕ, 0 ≤ f n := by + intro n + dsimp [f] + refine mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hf_zero_pos : 0 < f 0 := by + have hweight : 0 < geometricWeight s 1 0 := + geometricWeight_pos 0 (by simpa using hs) + have hmax : 0 < maxDescendantSigmaStarInvNormAtScale Q Q.scale a := by + simpa using coarseSigmaStarInvBlockNorm_pos_of_openCubeData Q a hData + have hrpow : + 0 < Real.rpow (maxDescendantSigmaStarInvNormAtScale Q Q.scale a) + (1 / 2 : ℝ) := + Real.rpow_pos_of_pos hmax _ + dsimp [f] + simpa using mul_pos hweight hrpow + simpa [f] using hsum.tsum_pos hf_nonneg 0 hf_zero_pos + +theorem multiscale_ellipticity_LambdaSq_one_pos_of_isEllipticFieldOn_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + {lam Lam : ℝ} (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + 0 < LambdaSq Q s (.finite 1) a := by + rw [multiscale_ellipticity_LambdaSq_one_formula] + exact Real.rpow_pos_of_pos + (multiscale_ellipticity_LambdaSq_one_series_pos_of_isEllipticFieldOn_of_openCubeData + Q a hs hEll hData hsum) _ + +theorem multiscale_ellipticity_lambdaSq_one_pos_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} + (hs : 0 < s) + (hData : OpenCubeDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + 0 < lambdaSq Q s (.finite 1) a := by + rw [multiscale_ellipticity_lambdaSq_one_formula] + exact Real.rpow_pos_of_pos + (multiscale_ellipticity_lambdaSq_one_series_pos_of_openCubeData Q a hs hData hsum) _ + +theorem thetaRatio_pos_of_isEllipticFieldOn_of_openCubeData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s t : ℝ} + {lam Lam : ℝ} (hs : 0 < s) (ht : 0 < t) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDeterministicCoarseData Q a) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + 0 < ThetaRatio Q s t a := by + rw [thetaRatio_eq_div] + exact div_pos + (multiscale_ellipticity_LambdaSq_one_pos_of_isEllipticFieldOn_of_openCubeData + Q a hs hEll hData hBsum) + (multiscale_ellipticity_lambdaSq_one_pos_of_openCubeData Q a ht hData hSigmaSum) + +theorem sq_rpow_half_eq_self_of_nonneg {x : ℝ} (hx : 0 ≤ x) : + (Real.rpow x (1 / 2 : ℝ)) ^ 2 = x := by + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_inv_rpow hx (show (2 : ℝ) ≠ 0 by norm_num)) + +theorem sq_rpow_neg_half_eq_inv_of_nonneg {x : ℝ} (hx : 0 ≤ x) : + (Real.rpow x (-1 / 2 : ℝ)) ^ 2 = x⁻¹ := by + calc + (Real.rpow x (-1 / 2 : ℝ)) ^ 2 = + Real.rpow (Real.rpow x (-1 / 2 : ℝ)) (2 : ℝ) := by + symm + exact Real.rpow_natCast _ 2 + _ = Real.rpow x ((-1 / 2 : ℝ) * 2) := by + simpa using (Real.rpow_mul hx (-1 / 2 : ℝ) (2 : ℝ)).symm + _ = x⁻¹ := by + norm_num + rw [Real.rpow_neg_one] + +theorem geometricDiscount_sq_mul_coarseBBlockNorm_le_LambdaSq_one {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + geometricDiscount s 1 ^ 2 * coarseBBlockNorm Q a ≤ + LambdaSq Q s (.finite 1) a := by + have hhalf := + geometricDiscount_mul_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half + Q a s hs.le hsum + have hleft_nonneg : + 0 ≤ geometricDiscount s 1 * Real.rpow (coarseBBlockNorm Q a) (1 / 2 : ℝ) := by + refine mul_nonneg (le_of_lt (geometricDiscount_pos (by simpa using hs))) ?_ + exact Real.rpow_nonneg (coarseBBlockNorm_nonneg Q a) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hhalf 2 + calc + geometricDiscount s 1 ^ 2 * coarseBBlockNorm Q a = + (geometricDiscount s 1 * Real.rpow (coarseBBlockNorm Q a) (1 / 2 : ℝ)) ^ 2 := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg (coarseBBlockNorm_nonneg Q a)] + _ ≤ (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := hsq + _ = LambdaSq Q s (.finite 1) a := by + exact sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) + +theorem geometricDiscount_sq_mul_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_inv {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + geometricDiscount s 1 ^ 2 * coarseSigmaStarInvBlockNorm Q a ≤ + (lambdaSq Q s (.finite 1) a)⁻¹ := by + have hhalf := + geometricDiscount_mul_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_rpow_neg_half + Q a s hs.le hsum + have hleft_nonneg : + 0 ≤ geometricDiscount s 1 * Real.rpow (coarseSigmaStarInvBlockNorm Q a) (1 / 2 : ℝ) := by + refine mul_nonneg (le_of_lt (geometricDiscount_pos (by simpa using hs))) ?_ + exact Real.rpow_nonneg (coarseSigmaStarInvBlockNorm_nonneg Q a) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hhalf 2 + calc + geometricDiscount s 1 ^ 2 * coarseSigmaStarInvBlockNorm Q a = + (geometricDiscount s 1 * + Real.rpow (coarseSigmaStarInvBlockNorm Q a) (1 / 2 : ℝ)) ^ 2 := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg (coarseSigmaStarInvBlockNorm_nonneg Q a)] + _ ≤ (Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := hsq + _ = (lambdaSq Q s (.finite 1) a)⁻¹ := by + exact sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q s a hs.le) + +theorem coarseBBlockNorm_le_LambdaSq_one_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + coarseBBlockNorm Q a ≤ LambdaSq Q s (.finite 1) a := by + simpa using + (coarseBBlockNorm_le_LambdaSq_finite_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (a := a) (s := s) (q := 1) hs (by norm_num) hEll hData hsum) + +theorem coarseSigmaStarInvBlockNorm_le_lambdaSq_one_inv_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} {lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseSigmaStarInvBlockNorm Q a ≤ (lambdaSq Q s (.finite 1) a)⁻¹ := by + simpa using + (coarseSigmaStarInvBlockNorm_le_lambdaSq_finite_inv_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (a := a) (s := s) (q := 1) hs (by norm_num) hEll hData hsum) + +@[simp] theorem multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) = + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + rw [multiscale_ellipticity_LambdaSq_one_formula] + have hhalf : (1 / 2 : ℝ) = (2 : ℝ)⁻¹ := by norm_num + simpa [Real.rpow_natCast, hhalf] using + (Real.rpow_rpow_inv + (multiscale_ellipticity_LambdaSq_one_series_nonneg Q s a hs) + (show (2 : ℝ) ≠ 0 by norm_num)) + +@[simp] theorem multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (hs : 0 ≤ s) : + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) = + ∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + rw [multiscale_ellipticity_lambdaSq_one_formula] + have hhalf : (-1 / 2 : ℝ) = (-2 : ℝ)⁻¹ := by norm_num + simpa [hhalf] using + (Real.rpow_rpow_inv + (multiscale_ellipticity_lambdaSq_one_series_nonneg Q s a hs) + (show (-2 : ℝ) ≠ 0 by norm_num)) + +theorem multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s : ℝ} {lam Lam : ℝ} + (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q t (.finite 1) a) (1 / 2 : ℝ) := by + have hs : 0 < s := lt_trans ht hts + rw [multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q s a hs.le, + multiscale_ellipticity_LambdaSq_one_rpow_half_eq_tsum Q t a ht.le] + refine tsum_geometricWeight_one_le_of_monotone ?_ ?_ ht hts hsum_t + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantBBlockNormAtScale_nonneg Q hlQ a + · exact maxDescendantBBlockNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · norm_num + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_LambdaSq_one_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s : ℝ} {lam Lam : ℝ} + (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + LambdaSq Q s (.finite 1) a ≤ LambdaSq Q t (.finite 1) a := by + have hs : 0 < s := lt_trans ht hts + have hhalf := + multiscale_ellipticity_LambdaSq_one_rpow_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a ht hts hEll hData hsum_t + have hleft_nonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hhalf 2 + calc + LambdaSq Q s (.finite 1) a = + (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := by + symm + exact sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le) + _ ≤ (Real.rpow (LambdaSq Q t (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := hsq + _ = LambdaSq Q t (.finite 1) a := by + exact sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q t a ht.le) + +theorem multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s : ℝ} {lam Lam : ℝ} + (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := by + have hs : 0 < s := lt_trans ht hts + rw [multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q s a hs.le, + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_eq_tsum Q t a ht.le] + refine tsum_geometricWeight_one_le_of_monotone ?_ ?_ ht hts hsum_t + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantSigmaStarInvNormAtScale_nonneg Q hlQ a + · exact maxDescendantSigmaStarInvNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · norm_num + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_lambdaSq_one_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s : ℝ} {lam Lam : ℝ} + (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + (lambdaSq Q s (.finite 1) a)⁻¹ ≤ (lambdaSq Q t (.finite 1) a)⁻¹ := by + have hs : 0 < s := lt_trans ht hts + have hhalf := + multiscale_ellipticity_lambdaSq_one_rpow_neg_half_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a ht hts hEll hData hsum_t + have hleft_nonneg : + 0 ≤ Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_lambdaSq_one_nonneg Q s a hs.le) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hhalf 2 + calc + (lambdaSq Q s (.finite 1) a)⁻¹ = + (Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + symm + exact sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q s a hs.le) + _ ≤ (Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := hsq + _ = (lambdaSq Q t (.finite 1) a)⁻¹ := by + exact sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q t a ht.le) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/ScaleBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/ScaleBounds.lean new file mode 100644 index 0000000000..67d8271361 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Ellipticity/ScaleBounds.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity.Descendants + +/-! # Scale Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarseBBlockNorm_le_inv_geometricWeight_sq_mul_LambdaSq_one_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + coarseBBlockNorm R a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + LambdaSq Q s (.finite 1) a := by + let w : ℝ := geometricWeight s 1 (Int.toNat (Q.scale - k)) + have hw_pos : 0 < w := by + dsimp [w] + exact geometricWeight_pos _ (by simpa using hs) + have hw_ne : w ≠ 0 := hw_pos.ne' + have hw_sq_inv_nonneg : 0 ≤ (w ^ 2)⁻¹ := by + positivity + have hweighted := + weighted_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half + (Q := Q) (R := R) (k := k) a s hs.le hR hsum + have hleft_nonneg : + 0 ≤ w * Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) := by + refine mul_nonneg (le_of_lt hw_pos) ?_ + exact Real.rpow_nonneg (coarseBBlockNorm_nonneg R a) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hweighted 2 + calc + coarseBBlockNorm R a = (w ^ 2)⁻¹ * (w ^ 2 * coarseBBlockNorm R a) := by + field_simp [hw_ne] + _ = (w ^ 2)⁻¹ * (w * Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ)) ^ 2 := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg (coarseBBlockNorm_nonneg R a)] + _ ≤ (w ^ 2)⁻¹ * (Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ)) ^ 2 := by + exact mul_le_mul_of_nonneg_left hsq hw_sq_inv_nonneg + _ = (w ^ 2)⁻¹ * LambdaSq Q s (.finite 1) a := by + rw [sq_rpow_half_eq_self_of_nonneg + (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs.le)] + _ = (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + LambdaSq Q s (.finite 1) a := by + simp [w] + +theorem coarseSigmaStarInvBlockNorm_le_inv_geometricWeight_sq_mul_lambdaSq_one_inv_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s : ℝ) + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseSigmaStarInvBlockNorm R a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + let w : ℝ := geometricWeight s 1 (Int.toNat (Q.scale - k)) + have hw_pos : 0 < w := by + dsimp [w] + exact geometricWeight_pos _ (by simpa using hs) + have hw_ne : w ≠ 0 := hw_pos.ne' + have hw_sq_inv_nonneg : 0 ≤ (w ^ 2)⁻¹ := by + positivity + have hweighted := + weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_rpow_neg_half + (Q := Q) (R := R) (k := k) a s hs.le hR hsum + have hleft_nonneg : + 0 ≤ w * Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) := by + refine mul_nonneg (le_of_lt hw_pos) ?_ + exact Real.rpow_nonneg (coarseSigmaStarInvBlockNorm_nonneg R a) _ + have hsq := pow_le_pow_left₀ hleft_nonneg hweighted 2 + calc + coarseSigmaStarInvBlockNorm R a = + (w ^ 2)⁻¹ * (w ^ 2 * coarseSigmaStarInvBlockNorm R a) := by + field_simp [hw_ne] + _ = (w ^ 2)⁻¹ * (w * Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ)) ^ 2 := by + rw [pow_two] + ring_nf + rw [sq_rpow_half_eq_self_of_nonneg (coarseSigmaStarInvBlockNorm_nonneg R a)] + _ ≤ (w ^ 2)⁻¹ * (Real.rpow (lambdaSq Q s (.finite 1) a) (-1 / 2 : ℝ)) ^ 2 := by + exact mul_le_mul_of_nonneg_left hsq hw_sq_inv_nonneg + _ = (w ^ 2)⁻¹ * (lambdaSq Q s (.finite 1) a)⁻¹ := by + rw [sq_rpow_neg_half_eq_inv_of_nonneg + (multiscale_ellipticity_lambdaSq_one_nonneg Q s a hs.le)] + _ = (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + simp [w] + +theorem maxDescendantBBlockNormAtScale_le_inv_geometricWeight_sq_mul_LambdaSq_one {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + maxDescendantBBlockNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + LambdaSq Q s (.finite 1) a := by + unfold maxDescendantBBlockNormAtScale finsetSsup + have hne : + ((fun R => coarseBBlockNorm R a) '' (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseBBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact coarseBBlockNorm_le_inv_geometricWeight_sq_mul_LambdaSq_one_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + +theorem maxDescendantSigmaStarInvNormAtScale_le_inv_geometricWeight_sq_mul_lambdaSq_one_inv + {d : ℕ} (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + maxDescendantSigmaStarInvNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hne : + ((fun R => coarseSigmaStarInvBlockNorm R a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact coarseSigmaStarInvBlockNorm_le_inv_geometricWeight_sq_mul_lambdaSq_one_inv_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s hs hR hsum + +theorem multiscale_ellipticity_q1_normalized_scale_bounds {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s : ℝ) + (hs : 0 < s) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + maxDescendantBBlockNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + LambdaSq Q s (.finite 1) a ∧ + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite 1) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite 1) a ∧ + maxDescendantSigmaStarInvNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + (lambdaSq Q s (.finite 1) a)⁻¹ ∧ + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite 1) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + refine ⟨?_, ?_⟩ + · exact maxDescendantBBlockNormAtScale_le_inv_geometricWeight_sq_mul_LambdaSq_one + Q hk a s hs hBsum + · refine ⟨?_, ?_⟩ + · exact multiscale_ellipticity_LambdaSq_one_descendantsAtScale_le + Q hk a s hs.le hBsum + · refine ⟨?_, ?_⟩ + · exact maxDescendantSigmaStarInvNormAtScale_le_inv_geometricWeight_sq_mul_lambdaSq_one_inv + Q hk a s hs hSigmaSum + · exact multiscale_ellipticity_lambdaSq_one_inv_descendantsAtScale_le + Q hk a s hs.le hSigmaSum + +theorem multiscale_ellipticity_q1_normalized_basic_properties_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s : ℝ} {lam Lam : ℝ} + (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hBsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + coarseSigmaStarInvBlockNorm Q a ≤ + (lambdaSq Q s (.finite 1) a)⁻¹ ∧ + (lambdaSq Q s (.finite 1) a)⁻¹ ≤ (lambdaSq Q t (.finite 1) a)⁻¹ ∧ + coarseBBlockNorm Q a ≤ + LambdaSq Q s (.finite 1) a ∧ + LambdaSq Q s (.finite 1) a ≤ LambdaSq Q t (.finite 1) a ∧ + ∀ {k : ℤ}, k ≤ Q.scale → + maxDescendantBBlockNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + LambdaSq Q s (.finite 1) a ∧ + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite 1) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite 1) a ∧ + maxDescendantSigmaStarInvNormAtScale Q k a ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) ^ 2)⁻¹ * + (lambdaSq Q s (.finite 1) a)⁻¹ ∧ + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite 1) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite 1) a)⁻¹ := by + have hs : 0 < s := lt_trans ht hts + have hBnonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hSigmaNonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ)) := + summable_geometricWeight_one_of_lt hBnonneg ht hts hBsum_t + have hSigmaSum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ)) := + summable_geometricWeight_one_of_lt hSigmaNonneg ht hts hSigmaSum_t + have hsigma0 : + coarseSigmaStarInvBlockNorm Q a ≤ + (lambdaSq Q s (.finite 1) a)⁻¹ := by + exact coarseSigmaStarInvBlockNorm_le_lambdaSq_one_inv_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hEll hData hSigmaSum_s + have hmonoSigma : + (lambdaSq Q s (.finite 1) a)⁻¹ ≤ (lambdaSq Q t (.finite 1) a)⁻¹ := + multiscale_ellipticity_lambdaSq_one_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a ht hts hEll hData hSigmaSum_t + have hb0 : + coarseBBlockNorm Q a ≤ + LambdaSq Q s (.finite 1) a := by + exact coarseBBlockNorm_le_LambdaSq_one_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hEll hData hBsum_s + have hmonoB : + LambdaSq Q s (.finite 1) a ≤ LambdaSq Q t (.finite 1) a := + multiscale_ellipticity_LambdaSq_one_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a ht hts hEll hData hBsum_t + refine ⟨hsigma0, hmonoSigma, hb0, hmonoB, ?_⟩ + intro k hk + exact multiscale_ellipticity_q1_normalized_scale_bounds Q hk a s hs hBsum_s hSigmaSum_s + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ.lean new file mode 100644 index 0000000000..09069bd8a8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ScaleBounds + +/-! +# Finite-q multiscale ellipticity API + +Compatibility wrapper for the split finite-q ellipticity development. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ChangeOfQ.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ChangeOfQ.lean new file mode 100644 index 0000000000..3774650a1f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ChangeOfQ.lean @@ -0,0 +1,535 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Series + +/-! # Change Of Q -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +private theorem le_of_rpow_q_div_two_le {A B q : ℝ} (hq : 0 < q) + (hA : 0 ≤ A) (hB : 0 ≤ B) + (hAB : Real.rpow A (q / 2) ≤ Real.rpow B (q / 2)) : + A ≤ B := by + have hpow : + Real.rpow (Real.rpow A (q / 2)) (2 / q) ≤ + Real.rpow (Real.rpow B (q / 2)) (2 / q) := by + refine Real.rpow_le_rpow ?_ hAB ?_ + · exact Real.rpow_nonneg hA _ + · positivity + have hmul : (q / 2 : ℝ) * (2 / q) = 1 := by + field_simp [hq.ne'] + calc + A = Real.rpow A 1 := by symm; exact Real.rpow_one A + _ = Real.rpow (Real.rpow A (q / 2)) (2 / q) := by + simpa [hmul] using (Real.rpow_mul hA (q / 2) (2 / q)) + _ ≤ Real.rpow (Real.rpow B (q / 2)) (2 / q) := hpow + _ = Real.rpow B 1 := by + simpa [hmul] using (Real.rpow_mul hB (q / 2) (2 / q)).symm + _ = B := by exact Real.rpow_one B + +theorem le_rpow_factor_mul_of_rpow_q_div_two_le {A B F q : ℝ} (hq : 0 < q) + (hA : 0 ≤ A) (hB : 0 ≤ B) (hF : 0 ≤ F) + (hAB : Real.rpow A (q / 2) ≤ F * Real.rpow B (q / 2)) : + A ≤ Real.rpow F (2 / q) * B := by + apply le_of_rpow_q_div_two_le hq hA + (mul_nonneg (Real.rpow_nonneg hF _) hB) + calc + Real.rpow A (q / 2) ≤ F * Real.rpow B (q / 2) := hAB + _ = Real.rpow (Real.rpow F (2 / q) * B) (q / 2) := by + have hmul : (2 / q : ℝ) * (q / 2) = 1 := by + field_simp [hq.ne'] + have hFpow : Real.rpow (Real.rpow F (2 / q)) (q / 2) = F := by + calc + Real.rpow (Real.rpow F (2 / q)) (q / 2) = Real.rpow F ((2 / q) * (q / 2)) := by + exact (Real.rpow_mul hF (2 / q) (q / 2)).symm + _ = Real.rpow F 1 := by simp [hmul] + _ = F := by exact Real.rpow_one F + calc + F * Real.rpow B (q / 2) = Real.rpow (Real.rpow F (2 / q)) (q / 2) * Real.rpow B (q / 2) := by + rw [hFpow] + _ = Real.rpow (Real.rpow F (2 / q) * B) (q / 2) := by + exact (Real.mul_rpow (Real.rpow_nonneg hF _) hB).symm + + +private theorem geometricWeight_changeOfQ_tsum_le {H : ℕ → ℝ} {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hH_nonneg : ∀ n, 0 ≤ H n) + (hsum_p : + Summable (fun n : ℕ => geometricWeight s p n * Real.rpow (H n) (p / 2))) : + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hq_div : 1 ≤ q / p := by + field_simp [hp.ne'] + exact hpq + let A : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * p * (n : ℝ)) * Real.rpow (H n) (p / 2) + have hA_nonneg : ∀ n, 0 ≤ A n := by + intro n + dsimp [A] + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact Real.rpow_nonneg (hH_nonneg n) _ + have hdisc_p_pos : 0 < geometricDiscount s p := geometricDiscount_pos (mul_pos hs hp) + have hdisc_q_nonneg : 0 ≤ geometricDiscount s q := by + exact geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + have hAweighted : + Summable (fun n : ℕ => geometricDiscount s p * A n) := by + simpa [A, geometricWeight, mul_assoc, mul_left_comm, mul_comm] using hsum_p + have hAsum : Summable A := (summable_mul_left_iff hdisc_p_pos.ne').1 hAweighted + have hArpow_sum : Summable (fun n : ℕ => Real.rpow (A n) (q / p)) := + summable_rpow_of_nonneg_of_one_le hq_div hA_nonneg hAsum + have hArpow_le : + ∑' n : ℕ, Real.rpow (A n) (q / p) ≤ Real.rpow (∑' n : ℕ, A n) (q / p) := + tsum_rpow_le_rpow_tsum_of_nonneg hq_div hA_nonneg hAsum + have hAq_rpow : + ∀ n : ℕ, + Real.rpow (A n) (q / p) = + Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) * Real.rpow (H n) (q / 2) := by + intro n + have hmul1 : (-s * p * (n : ℝ)) * (q / p) = -s * q * (n : ℝ) := by + field_simp [hp.ne'] + have hmul2 : (p / 2 : ℝ) * (q / p) = q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow (A n) (q / p) = + Real.rpow + (Real.rpow (3 : ℝ) (-s * p * (n : ℝ)) * Real.rpow (H n) (p / 2)) + (q / p) := by + rfl + _ = + Real.rpow (Real.rpow (3 : ℝ) (-s * p * (n : ℝ))) (q / p) * + Real.rpow (Real.rpow (H n) (p / 2)) (q / p) := by + exact Real.mul_rpow (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.rpow_nonneg (hH_nonneg n) _) + _ = + Real.rpow (3 : ℝ) ((-s * p * (n : ℝ)) * (q / p)) * + Real.rpow (H n) ((p / 2) * (q / p)) := by + congr 1 + · symm + exact Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s * p * (n : ℝ)) (q / p) + · symm + exact Real.rpow_mul (hH_nonneg n) (p / 2) (q / p) + _ = + Real.rpow (3 : ℝ) (-s * q * (n : ℝ)) * Real.rpow (H n) (q / 2) := by + rw [hmul1, hmul2] + have hSeries_q : + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := by + calc + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + ∑' n : ℕ, geometricDiscount s q * Real.rpow (A n) (q / p) := by + apply tsum_congr + intro n + simpa [geometricWeight, mul_assoc, mul_left_comm, mul_comm] using + congrArg (fun x : ℝ => geometricDiscount s q * x) (hAq_rpow n).symm + _ = geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := by + simpa using (Summable.tsum_mul_left (geometricDiscount s q) hArpow_sum) + have hSeries_p : + geometricDiscount s p * ∑' n : ℕ, A n = + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + calc + geometricDiscount s p * ∑' n : ℕ, A n = ∑' n : ℕ, geometricDiscount s p * A n := by + symm + simpa using (Summable.tsum_mul_left (geometricDiscount s p) hAsum) + _ = ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + apply tsum_congr + intro n + simp [A, geometricWeight, mul_assoc, mul_left_comm, mul_comm] + have hSeries_p_nonneg : + 0 ≤ ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + refine tsum_nonneg ?_ + intro n + exact mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs.le hp.le)) + (Real.rpow_nonneg (hH_nonneg n) _) + have hAsum_eq : + ∑' n : ℕ, A n = + (geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + calc + ∑' n : ℕ, A n = + ((geometricDiscount s p)⁻¹ * geometricDiscount s p) * ∑' n : ℕ, A n := by + rw [inv_mul_cancel₀ hdisc_p_pos.ne', one_mul] + _ = (geometricDiscount s p)⁻¹ * (geometricDiscount s p * ∑' n : ℕ, A n) := by ring + _ = + (geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2) := by + rw [hSeries_p] + have hAsum_rpow_eq : + Real.rpow (∑' n : ℕ, A n) (q / p) = + Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + rw [hAsum_eq] + calc + Real.rpow + ((geometricDiscount s p)⁻¹ * + ∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) = + Real.rpow ((geometricDiscount s p)⁻¹) (q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + exact Real.mul_rpow (inv_nonneg.mpr (geometricDiscount_nonneg (mul_nonneg hs.le hp.le))) + hSeries_p_nonneg + _ = + Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + have hnegdiv : -(q / p) = -q / p := by ring + simpa [hnegdiv] using + show Real.rpow ((geometricDiscount s p)⁻¹) (q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) = + Real.rpow (geometricDiscount s p) (-(q / p)) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) by + rw [show Real.rpow ((geometricDiscount s p)⁻¹) (q / p) = + Real.rpow (geometricDiscount s p) (-(q / p)) by + simpa using + (Real.rpow_neg_eq_inv_rpow (geometricDiscount s p) (q / p)).symm] + calc + ∑' n : ℕ, geometricWeight s q n * Real.rpow (H n) (q / 2) = + geometricDiscount s q * ∑' n : ℕ, Real.rpow (A n) (q / p) := hSeries_q + _ ≤ geometricDiscount s q * Real.rpow (∑' n : ℕ, A n) (q / p) := by + exact mul_le_mul_of_nonneg_left hArpow_le hdisc_q_nonneg + _ = + geometricDiscount s q * + (Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p)) := by + rw [hAsum_rpow_eq] + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, geometricWeight s p n * Real.rpow (H n) (p / 2)) + (q / p) := by + ring + + +theorem multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_changeOfQ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hsum_p : + Summable (fun n : ℕ => + geometricWeight s p n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (p / 2))) : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hSeries := + geometricWeight_changeOfQ_tsum_le (hs := hs) (hp1 := hp1) (hpq := hpq) + (H := fun n => maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => + maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hsum_p + have hLambdaP_nonneg : + 0 ≤ LambdaSq Q s (.finite p) a := by + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le) + have hmul : (p / 2 : ℝ) * (q / p) = q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + exact multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le) + _ ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (p / 2)) + (q / p) := hSeries + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (Real.rpow (LambdaSq Q s (.finite p) a) (p / 2)) (q / p) := by + rw [← multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q s p a hp + (mul_nonneg hs.le hp.le)] + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + have hrpow : + Real.rpow (Real.rpow (LambdaSq Q s (.finite p) a) (p / 2)) (q / p) = + Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + calc + Real.rpow (Real.rpow (LambdaSq Q s (.finite p) a) (p / 2)) (q / p) = + Real.rpow (LambdaSq Q s (.finite p) a) ((p / 2) * (q / p)) := by + symm + exact Real.rpow_mul hLambdaP_nonneg (p / 2) (q / p) + _ = Real.rpow (LambdaSq Q s (.finite p) a) (q / 2) := by + rw [hmul] + rw [hrpow] + +theorem multiscale_ellipticity_LambdaSq_finite_le_changeOfQ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hsum_p : + Summable (fun n : ℕ => + geometricWeight s p n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (p / 2))) : + LambdaSq Q s (.finite q) a ≤ + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + LambdaSq Q s (.finite p) a := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hpow := + multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_changeOfQ + Q a hs hp1 hpq hsum_p + have hLambdaQ_nonneg : + 0 ≤ LambdaSq Q s (.finite q) a := by + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le) + have hLambdaP_nonneg : + 0 ≤ LambdaSq Q s (.finite p) a := by + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le) + have hfactor_nonneg : + 0 ≤ geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) := by + refine mul_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hq.le)) ?_ + exact Real.rpow_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) _ + calc + LambdaSq Q s (.finite q) a ≤ + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + LambdaSq Q s (.finite p) a := by + exact le_rpow_factor_mul_of_rpow_q_div_two_le hq hLambdaQ_nonneg hLambdaP_nonneg + hfactor_nonneg hpow + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + LambdaSq Q s (.finite p) a := by + have hdisc_q_nonneg : 0 ≤ geometricDiscount s q := by + exact geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + have hdisc_p_pow_nonneg : 0 ≤ Real.rpow (geometricDiscount s p) (-q / p) := by + exact Real.rpow_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) _ + have hmul : (-q / p : ℝ) * (2 / q) = -2 / p := by + field_simp [hq.ne', hp.ne'] + have hrpow : + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) (-2 / p) := by + calc + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) ((-q / p) * (2 / q)) := by + symm + exact Real.rpow_mul + (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) + (-q / p) (2 / q) + _ = Real.rpow (geometricDiscount s p) (-2 / p) := by + rw [hmul] + have hfac : + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) := by + exact Real.mul_rpow hdisc_q_nonneg hdisc_p_pow_nonneg + calc + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + LambdaSq Q s (.finite p) a = + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q)) * + LambdaSq Q s (.finite p) a := by + rw [hfac] + _ = + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p)) * + LambdaSq Q s (.finite p) a := by + rw [hrpow] + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + LambdaSq Q s (.finite p) a := by ring + +theorem multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_changeOfQ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hsum_p : + Summable (fun n : ℕ => + geometricWeight s p n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (p / 2))) : + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hSeries := + geometricWeight_changeOfQ_tsum_le (hs := hs) (hp1 := hp1) (hpq := hpq) + (H := fun n => maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (fun n => + maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hsum_p + have hlambdaP_nonneg : + 0 ≤ lambdaSq Q s (.finite p) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le) + have hmul_neg : (-p / 2 : ℝ) * (q / p) = -q / 2 := by + field_simp [hp.ne'] + calc + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + exact multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le) + _ ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow + (∑' n : ℕ, + geometricWeight s p n * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (p / 2)) + (q / p) := hSeries + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (Real.rpow (lambdaSq Q s (.finite p) a) (-p / 2)) (q / p) := by + rw [← multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q s p a hp + (mul_nonneg hs.le hp.le)] + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + have hrpow : + Real.rpow (Real.rpow (lambdaSq Q s (.finite p) a) (-p / 2)) (q / p) = + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + calc + Real.rpow (Real.rpow (lambdaSq Q s (.finite p) a) (-p / 2)) (q / p) = + Real.rpow (lambdaSq Q s (.finite p) a) ((-p / 2) * (q / p)) := by + symm + exact Real.rpow_mul hlambdaP_nonneg (-p / 2) (q / p) + _ = Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := by + rw [hmul_neg] + rw [hrpow] + +theorem multiscale_ellipticity_lambdaSq_finite_inv_le_changeOfQ {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s p q : ℝ} + (hs : 0 < s) (hp1 : 1 ≤ p) (hpq : p ≤ q) + (hsum_p : + Summable (fun n : ℕ => + geometricWeight s p n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (p / 2))) : + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + have hp : 0 < p := lt_of_lt_of_le zero_lt_one hp1 + have hq : 0 < q := lt_of_lt_of_le hp hpq + have hpow := + multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_changeOfQ + Q a hs hp1 hpq hsum_p + have hpow' : + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) ≤ + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) * + Real.rpow ((lambdaSq Q s (.finite p) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)).symm + _ ≤ + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow (lambdaSq Q s (.finite p) a) (-q / 2) := hpow + _ = + geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) * + Real.rpow ((lambdaSq Q s (.finite p) a)⁻¹) (q / 2) := by + congr 1 + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite p) a) (q / 2)) + have hLambdaQ_inv_nonneg : + 0 ≤ (lambdaSq Q s (.finite q) a)⁻¹ := by + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le)) + have hLambdaP_inv_nonneg : + 0 ≤ (lambdaSq Q s (.finite p) a)⁻¹ := by + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q s p a hp.le (mul_nonneg hs.le hp.le)) + have hfactor_nonneg : + 0 ≤ geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p) := by + refine mul_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hq.le)) ?_ + exact Real.rpow_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) _ + calc + (lambdaSq Q s (.finite q) a)⁻¹ ≤ + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + exact le_rpow_factor_mul_of_rpow_q_div_two_le hq hLambdaQ_inv_nonneg hLambdaP_inv_nonneg + hfactor_nonneg hpow' + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + have hdisc_q_nonneg : 0 ≤ geometricDiscount s q := by + exact geometricDiscount_nonneg (mul_nonneg hs.le hq.le) + have hdisc_p_pow_nonneg : 0 ≤ Real.rpow (geometricDiscount s p) (-q / p) := by + exact Real.rpow_nonneg (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) _ + have hmul : (-q / p : ℝ) * (2 / q) = -2 / p := by + field_simp [hq.ne', hp.ne'] + have hrpow : + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) (-2 / p) := by + calc + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) = + Real.rpow (geometricDiscount s p) ((-q / p) * (2 / q)) := by + symm + exact Real.rpow_mul + (geometricDiscount_nonneg (mul_nonneg hs.le hp.le)) + (-q / p) (2 / q) + _ = Real.rpow (geometricDiscount s p) (-2 / p) := by + rw [hmul] + have hfac : + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q) := by + exact Real.mul_rpow hdisc_q_nonneg hdisc_p_pow_nonneg + calc + Real.rpow + (geometricDiscount s q * Real.rpow (geometricDiscount s p) (-q / p)) + (2 / q) * + (lambdaSq Q s (.finite p) a)⁻¹ = + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (Real.rpow (geometricDiscount s p) (-q / p)) (2 / q)) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + rw [hfac] + _ = + (Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p)) * + (lambdaSq Q s (.finite p) a)⁻¹ := by + rw [hrpow] + _ = + Real.rpow (geometricDiscount s q) (2 / q) * + Real.rpow (geometricDiscount s p) (-2 / p) * + (lambdaSq Q s (.finite p) a)⁻¹ := by ring + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Descendants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Descendants.lean new file mode 100644 index 0000000000..f5ba217888 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Descendants.lean @@ -0,0 +1,592 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.ChangeOfQ + +/-! # Descendants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + Real.rpow (LambdaSq R s (.finite q) a) (q / 2) ≤ + Real.rpow (3 : ℝ) (s * q * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) ≤ + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (q / 2)) := by + dsimp [fR, factor] + rw [geometricWeight_shift (s := s) (q := q) h n] + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (geometricWeight_nonneg (n + h) (mul_nonneg hs hq.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := by + exact Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + Real.rpow (LambdaSq R s (.finite q) a) (q / 2) = ∑' n : ℕ, fR n := by + simpa [fR] using + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum R s q a hq + (mul_nonneg hs hq.le)) + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs hq.le)).symm + +theorem multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + LambdaSq R s (.finite q) a ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a := by + let h : ℕ := Int.toNat (Q.scale - k) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hbase := + multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs hq hR hsum + have hfactorEq : + Real.rpow factor (2 / q) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + dsimp [factor] + have hmul : (s * q * (h : ℝ)) * (2 / q) = 2 * s * (h : ℝ) := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow (3 : ℝ) (s * q * (h : ℝ))) (2 / q) = + Real.rpow (3 : ℝ) ((s * q * (h : ℝ)) * (2 / q)) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (s * q * (h : ℝ)) (2 / q)).symm + _ = Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by simp [hmul] + calc + LambdaSq R s (.finite q) a ≤ Real.rpow factor (2 / q) * LambdaSq Q s (.finite q) a := by + exact le_rpow_factor_mul_of_rpow_q_div_two_le hq + (multiscale_ellipticity_LambdaSq_finite_nonneg R s q a hq.le (mul_nonneg hs hq.le)) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs hq.le)) + hfactorNonneg hbase + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a := by + rw [hfactorEq] + +/-- A summable upper-ellipticity finite-`q` series remains summable after +restricting the base cube to a descendant. -/ +theorem summable_geometricWeight_maxDescendantBBlockNormAtScale_rpow_q_div_two_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := + (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantBBlockNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2) ≤ + Real.rpow + (maxDescendantBBlockNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + dsimp [fR, factor] + rw [geometricWeight_shift (s := s) (q := q) h n] + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow + (maxDescendantBBlockNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (geometricWeight_nonneg (n + h) (mul_nonneg hs hq.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + exact Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + +theorem multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) ≤ + Real.rpow (3 : ℝ) (s * q * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantSigmaStarInvNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) ≤ + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + dsimp [fR, factor] + rw [geometricWeight_shift (s := s) (q := q) h n] + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a) + (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (geometricWeight_nonneg (n + h) (mul_nonneg hs hq.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := by + exact Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) = ∑' n : ℕ, fR n := by + simpa [fR] using + (multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum R s q a hq + (mul_nonneg hs hq.le)) + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [fQ] using congrArg (fun x : ℝ => factor * x) + (multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs hq.le)).symm + +theorem summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtScale + {d : ℕ} {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + let fR : ℕ → ℝ := fun n => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) (q / 2) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := + (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hmax : + maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a ≤ + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) a := by + have hl : R.scale - (n : ℤ) ≤ R.scale := + sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (maxDescendantSigmaStarInvNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a hR hl) + have hrpow : + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2) ≤ + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2) := by + refine Real.rpow_le_rpow + (maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a) + hmax ?_ + positivity + calc + fR n = + factor * + (geometricWeight s q (n + h) * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (q / 2)) := by + dsimp [fR, factor] + rw [geometricWeight_shift (s := s) (q := q) h n] + simp [mul_assoc, mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s q (n + h) * + Real.rpow + (maxDescendantSigmaStarInvNormAtScale Q + (Q.scale - ((n + h : ℕ) : ℤ)) a) (q / 2)) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hrpow + (geometricWeight_nonneg (n + h) (mul_nonneg hs hq.le)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + refine mul_nonneg (geometricWeight_nonneg n (mul_nonneg hs hq.le)) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + exact Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + +theorem multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + (lambdaSq R s (.finite q) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + let h : ℕ := Int.toNat (Q.scale - k) + let factor : ℝ := Real.rpow (3 : ℝ) (s * q * (h : ℝ)) + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hbase := + multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs hq hR hsum + have hbase' : + Real.rpow ((lambdaSq R s (.finite q) a)⁻¹) (q / 2) ≤ + factor * Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq R s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq R s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq R s (.finite q) a) (q / 2)).symm + _ ≤ factor * Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := hbase + _ = factor * Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + simpa [hneg] using congrArg (fun x : ℝ => factor * x) + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)) + have hfactorEq : + Real.rpow factor (2 / q) = + Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by + dsimp [factor] + have hmul : (s * q * (h : ℝ)) * (2 / q) = 2 * s * (h : ℝ) := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow (3 : ℝ) (s * q * (h : ℝ))) (2 / q) = + Real.rpow (3 : ℝ) ((s * q * (h : ℝ)) * (2 / q)) := by + exact (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (s * q * (h : ℝ)) (2 / q)).symm + _ = Real.rpow (3 : ℝ) (2 * s * (h : ℝ)) := by simp [hmul] + calc + (lambdaSq R s (.finite q) a)⁻¹ ≤ + Real.rpow factor (2 / q) * (lambdaSq Q s (.finite q) a)⁻¹ := by + exact le_rpow_factor_mul_of_rpow_q_div_two_le hq + (inv_nonneg.mpr (multiscale_ellipticity_lambdaSq_finite_nonneg R s q a hq.le + (mul_nonneg hs hq.le))) + (inv_nonneg.mpr (multiscale_ellipticity_lambdaSq_finite_nonneg Q s q a hq.le + (mul_nonneg hs hq.le))) + hfactorNonneg hbase' + _ = Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + rw [hfactorEq] + +theorem multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) (hR : R ∈ descendantsAtScale Q k) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + LambdaSq R s (.finite q) a ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q t (.finite q) a := by + have hs : 0 < s := lt_trans ht hts + have hBnonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hsum_s : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) := + summable_geometricWeight_of_lt hBnonneg hq ht hts hsum_t + calc + LambdaSq R s (.finite q) a ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a := by + exact multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs.le hq hR hsum_s + _ ≤ Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q t (.finite q) a := by + refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact multiscale_ellipticity_LambdaSq_finite_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hsum_t + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) (hR : R ∈ descendantsAtScale Q k) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + (lambdaSq R s (.finite q) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q t (.finite q) a)⁻¹ := by + have hs : 0 < s := lt_trans ht hts + have hSigmaNonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hsum_s : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := + summable_geometricWeight_of_lt hSigmaNonneg hq ht hts hsum_t + calc + (lambdaSq R s (.finite q) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + exact multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs.le hq hR hsum_s + _ ≤ Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q t (.finite q) a)⁻¹ := by + refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact multiscale_ellipticity_lambdaSq_finite_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hsum_t + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ScaleBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ScaleBounds.lean new file mode 100644 index 0000000000..eaffe0d44a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/ScaleBounds.lean @@ -0,0 +1,288 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.EllipticityFiniteQ.Descendants + +/-! # Scale Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem multiscale_ellipticity_lambdaSq_two_inv_le_of_mem_descendantsAtScale_of_half_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : CoeffField d) {s : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) 1)) : + (lambdaSq R s (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + have hhalf : 0 < s / 2 := by positivity + have hlt : s / 2 < s := by linarith + have hsum_half' : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (2 / 2)) := by + simpa using hsum_half + simpa using + multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (R := R) (k := k) a (q := 2) (t := s / 2) (s := s) + (lam := lam) (Lam := Lam) (by norm_num) hhalf hlt hR hEll hData hsum_half' + +theorem multiscale_ellipticity_lambdaSq_two_inv_le_rpow_s_of_mem_descendantsAtScale_of_half_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : CoeffField d) {s : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) 1)) : + (lambdaSq R s (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + have hhalf : 0 < s / 2 := by positivity + have hlt : s / 2 < s := by linarith + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + hData.of_mem_descendantsAtScale hk hR + have hsum_half' : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2)) := by + simpa using hsum_half + have hsumR_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale R (R.scale - (n : ℤ)) a) + (2 / 2)) := + summable_geometricWeight_maxDescendantSigmaStarInvNormAtScale_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a (s / 2) 2 hhalf.le (by norm_num) hR hsum_half' + have hmono : + (lambdaSq R s (.finite 2) a)⁻¹ ≤ (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := + multiscale_ellipticity_lambdaSq_finite_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) a (q := 2) (t := s / 2) (s := s) (lam := lam) (Lam := Lam) + (by norm_num) hhalf hlt hEllR hDataR hsumR_half + have hloc : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a (s / 2) 2 hhalf.le (by norm_num) hR hsum_half' + calc + (lambdaSq R s (.finite 2) a)⁻¹ ≤ + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := hmono + _ ≤ Real.rpow (3 : ℝ) (2 * (s / 2) * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := hloc + _ = Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := by + congr 2 + ring + +/-- Half-scale upper-ellipticity localization for the finite-`q = 2` +multiscale coefficient. -/ +theorem multiscale_ellipticity_LambdaSq_two_le_rpow_s_of_mem_descendantsAtScale_of_half_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {k : ℤ} + (a : CoeffField d) {s : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hR : R ∈ descendantsAtScale Q k) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) 1)) : + LambdaSq R s (.finite 2) a ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := by + have hhalf : 0 < s / 2 := by positivity + have hlt : s / 2 < s := by linarith + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hk hR) + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + hData.of_mem_descendantsAtScale hk hR + have hsum_half' : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) + (2 / 2)) := by + simpa using hsum_half + have hsumR_half : + Summable (fun n : ℕ => + geometricWeight (s / 2) 2 n * + Real.rpow (maxDescendantBBlockNormAtScale R (R.scale - (n : ℤ)) a) + (2 / 2)) := + summable_geometricWeight_maxDescendantBBlockNormAtScale_rpow_q_div_two_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a (s / 2) 2 hhalf.le (by norm_num) hR hsum_half' + have hmono : + LambdaSq R s (.finite 2) a ≤ LambdaSq R (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) a (q := 2) (t := s / 2) (s := s) (lam := lam) (Lam := Lam) + (by norm_num) hhalf hlt hEllR hDataR hsumR_half + have hloc : + LambdaSq R (s / 2) (.finite 2) a ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a (s / 2) 2 hhalf.le (by norm_num) hR hsum_half' + calc + LambdaSq R s (.finite 2) a ≤ + LambdaSq R (s / 2) (.finite 2) a := hmono + _ ≤ Real.rpow (3 : ℝ) (2 * (s / 2) * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := hloc + _ = Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := by + congr 2 + ring + +theorem multiscale_ellipticity_LambdaSq_finite_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite q) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a := by + unfold finsetSsup + have hne : + ((fun R => LambdaSq R s (.finite q) a) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨LambdaSq R s (.finite q) a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact multiscale_ellipticity_LambdaSq_finite_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs hq hR hsum + +theorem multiscale_ellipticity_lambdaSq_finite_inv_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite q) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + unfold finsetSsup + have hne : + ((fun R => (lambdaSq R s (.finite q) a)⁻¹) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨(lambdaSq R s (.finite q) a)⁻¹, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s q hs hq hR hsum + +theorem multiscale_ellipticity_finite_scale_bounds {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (s q : ℝ) + (hs : 0 ≤ s) (hq : 0 < q) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite q) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a ∧ + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite q) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + refine ⟨?_, ?_⟩ + · exact multiscale_ellipticity_LambdaSq_finite_descendantsAtScale_le Q hk a s q hs hq hBsum + · exact multiscale_ellipticity_lambdaSq_finite_inv_descendantsAtScale_le Q hk a s q hs hq hSigmaSum + +theorem multiscale_ellipticity_finite_basic_properties_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hBsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) + (hSigmaSum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + ((lambdaSq Q s (.finite q) a)⁻¹ ≤ (lambdaSq Q t (.finite q) a)⁻¹) ∧ + (coarseSigmaStarInvBlockNorm Q a ≤ (lambdaSq Q s (.finite q) a)⁻¹) ∧ + (coarseBBlockNorm Q a ≤ LambdaSq Q s (.finite q) a) ∧ + (LambdaSq Q s (.finite q) a ≤ LambdaSq Q t (.finite q) a) ∧ + ∀ {k : ℤ}, k ≤ Q.scale → + finsetSsup (descendantsAtScale Q k) (fun R => LambdaSq R s (.finite q) a) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + LambdaSq Q s (.finite q) a ∧ + finsetSsup (descendantsAtScale Q k) (fun R => (lambdaSq R s (.finite q) a)⁻¹) ≤ + Real.rpow (3 : ℝ) (2 * s * (Int.toNat (Q.scale - k) : ℝ)) * + (lambdaSq Q s (.finite q) a)⁻¹ := by + have hs : 0 < s := lt_trans ht hts + have hBnonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hSigmaNonneg : + ∀ n : ℕ, + 0 ≤ Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + have hBsum_s : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) := + summable_geometricWeight_of_lt hBnonneg hq ht hts hBsum_t + have hSigmaSum_s : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2)) := + summable_geometricWeight_of_lt hSigmaNonneg hq ht hts hSigmaSum_t + refine ⟨?_, ?_, ?_, ?_, fun {k} hk => ?_⟩ + · exact multiscale_ellipticity_lambdaSq_finite_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hSigmaSum_t + · exact coarseSigmaStarInvBlockNorm_le_lambdaSq_finite_inv_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hq hEll hData hSigmaSum_s + · exact coarseBBlockNorm_le_LambdaSq_finite_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hq hEll hData hBsum_s + · exact multiscale_ellipticity_LambdaSq_finite_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hBsum_t + exact multiscale_ellipticity_finite_scale_bounds Q hk a s q hs.le hq hBsum_s hSigmaSum_s + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Series.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Series.lean new file mode 100644 index 0000000000..9d4fa23f6e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/EllipticityFiniteQ/Series.lean @@ -0,0 +1,419 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response + +/-! # Series -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# Finite-q ellipticity and localization + +This file upgrades the Chapter-2 ellipticity surface from the first `q = 1` +lane to the finite-`q` statements actually present in the notes. +-/ + +@[simp] theorem multiscale_ellipticity_LambdaSq_finite_formula {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) : + LambdaSq Q s (.finite q) a = + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) + (2 / q) := by + rw [multiscale_ellipticity_LambdaSq_finite_eq] + rfl + +@[simp] theorem multiscale_ellipticity_lambdaSq_finite_formula {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) : + lambdaSq Q s (.finite q) a = + Real.rpow + (∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2)) + (-2 / q) := by + rw [multiscale_ellipticity_lambdaSq_finite_eq] + rfl + +theorem multiscale_ellipticity_LambdaSq_finite_series_nonneg {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (_hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + refine tsum_nonneg ?_ + intro n + refine mul_nonneg (geometricWeight_nonneg n hsq) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_lambdaSq_finite_series_nonneg {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (_hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + refine tsum_nonneg ?_ + intro n + refine mul_nonneg (geometricWeight_nonneg n hsq) ?_ + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_LambdaSq_finite_nonneg {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ LambdaSq Q s (.finite q) a := by + rw [multiscale_ellipticity_LambdaSq_finite_formula] + exact Real.rpow_nonneg + (multiscale_ellipticity_LambdaSq_finite_series_nonneg Q s q a hq hsq) _ + +theorem multiscale_ellipticity_lambdaSq_finite_nonneg {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (hq : 0 ≤ q) (hsq : 0 ≤ s * q) : + 0 ≤ lambdaSq Q s (.finite q) a := by + rw [multiscale_ellipticity_lambdaSq_finite_formula] + exact Real.rpow_nonneg + (multiscale_ellipticity_lambdaSq_finite_series_nonneg Q s q a hq hsq) _ + +@[simp] theorem multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (hq : 0 < q) (hsq : 0 ≤ s * q) : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + rw [multiscale_ellipticity_LambdaSq_finite_formula] + let S : ℝ := + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact multiscale_ellipticity_LambdaSq_finite_series_nonneg Q s q a hq.le hsq + have hmul : (2 / q : ℝ) * (q / 2) = 1 := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow S (2 / q)) (q / 2) = Real.rpow S ((2 / q) * (q / 2)) := by + symm + exact Real.rpow_mul hS_nonneg (2 / q : ℝ) (q / 2) + _ = Real.rpow S 1 := by simp [hmul] + _ = S := by exact Real.rpow_one S + _ = ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + rfl + +@[simp] theorem multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) (hq : 0 < q) (hsq : 0 ≤ s * q) : + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) = + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) := by + rw [multiscale_ellipticity_lambdaSq_finite_formula] + let S : ℝ := + ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact multiscale_ellipticity_lambdaSq_finite_series_nonneg Q s q a hq.le hsq + have hmul : (-2 / q : ℝ) * (-q / 2) = 1 := by + field_simp [hq.ne'] + calc + Real.rpow (Real.rpow S (-2 / q)) (-q / 2) = Real.rpow S ((-2 / q) * (-q / 2)) := by + symm + exact Real.rpow_mul hS_nonneg (-2 / q : ℝ) (-q / 2) + _ = Real.rpow S 1 := by simp [hmul] + _ = S := by exact Real.rpow_one S + _ = ∑' n : ℕ, + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2) := by + rfl + +private theorem le_of_rpow_q_div_two_le {A B q : ℝ} (hq : 0 < q) + (hA : 0 ≤ A) (hB : 0 ≤ B) + (hAB : Real.rpow A (q / 2) ≤ Real.rpow B (q / 2)) : + A ≤ B := by + have hpow : + Real.rpow (Real.rpow A (q / 2)) (2 / q) ≤ + Real.rpow (Real.rpow B (q / 2)) (2 / q) := by + refine Real.rpow_le_rpow ?_ hAB ?_ + · exact Real.rpow_nonneg hA _ + · positivity + have hmul : (q / 2 : ℝ) * (2 / q) = 1 := by + field_simp [hq.ne'] + calc + A = Real.rpow A 1 := by symm; exact Real.rpow_one A + _ = Real.rpow (Real.rpow A (q / 2)) (2 / q) := by + simpa [hmul] using (Real.rpow_mul hA (q / 2) (2 / q)) + _ ≤ Real.rpow (Real.rpow B (q / 2)) (2 / q) := hpow + _ = Real.rpow B 1 := by + simpa [hmul] using (Real.rpow_mul hB (q / 2) (2 / q)).symm + _ = B := by exact Real.rpow_one B + +theorem coarseBBlockNorm_rpow_q_div_two_le_LambdaSq_finite_rpow_q_div_two_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s q : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hq : 0 < q) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + Real.rpow (coarseBBlockNorm Q a) (q / 2) ≤ + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + let H : ℕ → ℝ := fun n => + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantBBlockNormAtScale_nonneg Q hlQ a + · exact maxDescendantBBlockNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · positivity + have hself : + H 0 ≤ + ∑' n : ℕ, geometricWeight s q n * H n := by + exact self_le_tsum_geometricWeight_of_monotone hmono + (mul_pos hs hq) (by simpa [H] using hsum) + calc + Real.rpow (coarseBBlockNorm Q a) (q / 2) = H 0 := by + dsimp [H] + simp [maxDescendantBBlockNormAtScale, descendantsAtScale_self] + _ ≤ ∑' n : ℕ, geometricWeight s q n * H n := hself + _ = Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) := by + symm + simpa [H] using + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le)) + +theorem coarseSigmaStarInvBlockNorm_rpow_q_div_two_le_lambdaSq_finite_rpow_neg_q_div_two_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s q : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hq : 0 < q) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + Real.rpow (coarseSigmaStarInvBlockNorm Q a) (q / 2) ≤ + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + let H : ℕ → ℝ := fun n => + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2) + have hmono : Monotone H := by + intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantSigmaStarInvNormAtScale_nonneg Q hlQ a + · exact maxDescendantSigmaStarInvNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · positivity + have hself : + H 0 ≤ + ∑' n : ℕ, geometricWeight s q n * H n := by + exact self_le_tsum_geometricWeight_of_monotone hmono + (mul_pos hs hq) (by simpa [H] using hsum) + calc + Real.rpow (coarseSigmaStarInvBlockNorm Q a) (q / 2) = H 0 := by + dsimp [H] + simp [maxDescendantSigmaStarInvNormAtScale, descendantsAtScale_self] + _ ≤ ∑' n : ℕ, geometricWeight s q n * H n := hself + _ = Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + symm + simpa [H] using + (multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le)) + +theorem coarseBBlockNorm_le_LambdaSq_finite_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s q : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hq : 0 < q) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + coarseBBlockNorm Q a ≤ LambdaSq Q s (.finite q) a := by + exact le_of_rpow_q_div_two_le hq + (coarseBBlockNorm_nonneg Q a) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le)) + (coarseBBlockNorm_rpow_q_div_two_le_LambdaSq_finite_rpow_q_div_two_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hq hEll hData hsum) + +theorem coarseSigmaStarInvBlockNorm_le_lambdaSq_finite_inv_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {s q : ℝ} {lam Lam : ℝ} + (hs : 0 < s) (hq : 0 < q) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + coarseSigmaStarInvBlockNorm Q a ≤ (lambdaSq Q s (.finite q) a)⁻¹ := by + have hpow := + coarseSigmaStarInvBlockNorm_rpow_q_div_two_le_lambdaSq_finite_rpow_neg_q_div_two_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hs hq hEll hData hsum + have hlambda_nonneg : + 0 ≤ lambdaSq Q s (.finite q) a := by + exact multiscale_ellipticity_lambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le) + have hpow' : + Real.rpow (coarseSigmaStarInvBlockNorm Q a) (q / 2) ≤ + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + calc + Real.rpow (coarseSigmaStarInvBlockNorm Q a) (q / 2) ≤ + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := hpow + _ = Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)) + exact le_of_rpow_q_div_two_le hq + (coarseSigmaStarInvBlockNorm_nonneg Q a) + (inv_nonneg.mpr hlambda_nonneg) + hpow' + +theorem multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + Real.rpow (LambdaSq Q s (.finite q) a) (q / 2) ≤ + Real.rpow (LambdaSq Q t (.finite q) a) (q / 2) := by + have hs : 0 < s := lt_trans ht hts + rw [multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le), + multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_eq_tsum Q t q a hq + (mul_nonneg ht.le hq.le)] + refine tsum_geometricWeight_le_of_monotone ?_ ?_ hq ht hts hsum_t + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantBBlockNormAtScale_nonneg Q hlQ a + · exact maxDescendantBBlockNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · positivity + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantBBlockNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_LambdaSq_finite_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (q / 2))) : + LambdaSq Q s (.finite q) a ≤ LambdaSq Q t (.finite q) a := by + have hs : 0 < s := lt_trans ht hts + exact le_of_rpow_q_div_two_le hq + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s q a hq.le (mul_nonneg hs.le hq.le)) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q t q a hq.le (mul_nonneg ht.le hq.le)) + (multiscale_ellipticity_LambdaSq_finite_rpow_q_div_two_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hsum_t) + +theorem multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) ≤ + Real.rpow (lambdaSq Q t (.finite q) a) (-q / 2) := by + have hs : 0 < s := lt_trans ht hts + rw [multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q s q a hq + (mul_nonneg hs.le hq.le), + multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_eq_tsum Q t q a hq + (mul_nonneg ht.le hq.le)] + refine tsum_geometricWeight_le_of_monotone ?_ ?_ hq ht hts hsum_t + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + refine Real.rpow_le_rpow ?_ ?_ ?_ + · exact maxDescendantSigmaStarInvNormAtScale_nonneg Q hlQ a + · exact maxDescendantSigmaStarInvNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a hEll hData + · positivity + · intro n + refine Real.rpow_nonneg ?_ _ + exact maxDescendantSigmaStarInvNormAtScale_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a + +theorem multiscale_ellipticity_lambdaSq_finite_inv_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) {t s q : ℝ} {lam Lam : ℝ} + (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t q n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (q / 2))) : + (lambdaSq Q s (.finite q) a)⁻¹ ≤ (lambdaSq Q t (.finite q) a)⁻¹ := by + have hs : 0 < s := lt_trans ht hts + have hpow := + multiscale_ellipticity_lambdaSq_finite_rpow_neg_q_div_two_le_of_lt_of_isEllipticFieldOn_of_isSigmaCoarse + Q a hq ht hts hEll hData hsum_t + have hpow' : + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) ≤ + Real.rpow ((lambdaSq Q t (.finite q) a)⁻¹) (q / 2) := by + have hneg : (-(q / 2 : ℝ)) = -q / 2 := by ring + calc + Real.rpow ((lambdaSq Q s (.finite q) a)⁻¹) (q / 2) = + Real.rpow (lambdaSq Q s (.finite q) a) (-q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q s (.finite q) a) (q / 2)).symm + _ ≤ Real.rpow (lambdaSq Q t (.finite q) a) (-q / 2) := hpow + _ = Real.rpow ((lambdaSq Q t (.finite q) a)⁻¹) (q / 2) := by + simpa [hneg] using + (Real.rpow_neg_eq_inv_rpow (lambdaSq Q t (.finite q) a) (q / 2)) + exact le_of_rpow_q_div_two_le hq + (inv_nonneg.mpr (multiscale_ellipticity_lambdaSq_finite_nonneg Q s q a hq.le + (mul_nonneg hs.le hq.le))) + (inv_nonneg.mpr (multiscale_ellipticity_lambdaSq_finite_nonneg Q t q a hq.le + (mul_nonneg ht.le hq.le))) + hpow' + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation.lean new file mode 100644 index 0000000000..173898c39c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.CoefficientBounds + +/-! +# Multiscale quantities foundation + +Compatibility wrapper for the split foundation API. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Basic.lean new file mode 100644 index 0000000000..111c943114 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Basic.lean @@ -0,0 +1,541 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantities +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.StarredSubadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeOpenBridge + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# Foundational lemmas for multiscale deterministic quantities + +This file collects the shared helper lemmas and the first structural wrappers +used by the later `MultiscaleQuantitiesBasic` submodules. +-/ + +def OpenCubeDeterministicCoarseData {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) : Prop := + ∃ sigma sigmaStar kappa, + IsCoarseBlockMatrix (openCubeSet Q) a + (deterministicCoarseBlockMatrix (openCubeSet Q) a) ∧ + IsSigmaStarCoarse (openCubeSet Q) a sigmaStar ∧ + IsKappaCoarse (openCubeSet Q) a sigmaStar kappa ∧ + IsSigmaCoarse (openCubeSet Q) a sigma sigmaStar kappa ∧ + IsUnit sigmaStar.det + +def OpenCubeDescendantDeterministicCoarseData {d : ℕ} (Q : TriadicCube d) + (a : CoeffField d) : Prop := + ∀ l ≤ Q.scale, ∀ R ∈ descendantsAtScale Q l, + OpenCubeDeterministicCoarseData R a + +theorem OpenCubeDescendantDeterministicCoarseData.self {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + OpenCubeDeterministicCoarseData Q a := by + exact hData Q.scale le_rfl Q (by simp [descendantsAtScale_self]) + +/-- Standalone quadratic formula for `ResponseJ` on a triadic open cube, packaged +from the canonical deterministic coarse-data witness. This is the theorem +surface intended for downstream deterministic and probabilistic chapters that +should not need to unpack the individual coarse witnesses by hand. -/ +theorem responseJ_formula_coarseBlockMatrix_openCubeSet_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) (p q : Vec d) : + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a).lowerRight q) - + vecDot p q - + vecDot q (matVecMul (coarseBlockMatrix (openCubeSet Q) a).lowerLeft p) + + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix (openCubeSet Q) a).upperLeft p) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact basic_cg_identities_responseJ_formula_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet Q) a hA hS hK hSigma hdet p q + +/-- Canonical coarse-variable version of the standalone quadratic `ResponseJ` +formula on a triadic open cube. This is a note-facing reformulation of +`responseJ_formula_coarseBlockMatrix_openCubeSet_of_deterministicCoarseData`. -/ +theorem responseJ_formula_canonical_openCubeSet_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) (p q : Vec d) : + ResponseJ (openCubeSet Q) p q a = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) - vecDot p q + + vecDot q + (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) + (matVecMul (kappaCoarse (openCubeSet Q) a) p)) + + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse + (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact basic_cg_identities_responseJ_formula_canonical_of_isSigmaCoarse + (openCubeSet Q) a hS hK hSigma hdet p q + +/-- Coarse-block `q = 0` quadratic formula for `ResponseJ` on a triadic open +cube, with all deterministic coarse witnesses discharged by +`OpenCubeDeterministicCoarseData`. -/ +theorem responseJ_zero_formula_coarseBlockMatrix_openCubeSet_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) (p : Vec d) : + ResponseJ (openCubeSet Q) p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseBlockMatrix (openCubeSet Q) a).upperLeft p) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact basic_cg_identities_responseJ_zero_formula_coarseBlockMatrix_of_isSigmaCoarse + (openCubeSet Q) a hA hS hK hSigma hdet p + +/-- Canonical `q = 0` quadratic formula for `ResponseJ` on a triadic open cube, +with all deterministic coarse witnesses discharged by +`OpenCubeDeterministicCoarseData`. -/ +theorem responseJ_zero_formula_canonical_openCubeSet_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) (p : Vec d) : + ResponseJ (openCubeSet Q) p 0 a = + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse + (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact basic_cg_identities_responseJ_zero_formula_canonical_of_isSigmaCoarse + (openCubeSet Q) a hS hK hSigma hdet p + +theorem fullBlockVecNormSq_nonneg {d : ℕ} (x : FullBlockVec d) : + 0 ≤ fullBlockVecNormSq x := by + unfold fullBlockVecNormSq + exact Finset.sum_nonneg fun i _ => sq_nonneg (x i) + +theorem matNormSq_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matNormSq A := by + unfold matNormSq + exact Finset.sum_nonneg fun i _ => Finset.sum_nonneg fun j _ => sq_nonneg (A i j) + +theorem matNorm_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matNorm A := by + unfold matNorm + exact Real.sqrt_nonneg _ + +theorem matNorm_eq_norm {d : ℕ} (A : Mat d) : + matNorm A = ‖A‖ := by + rw [matNorm, Real.sqrt_eq_rpow] + simpa [matNormSq, Real.norm_eq_abs, Real.rpow_natCast, sq_abs] using + (Matrix.frobenius_norm_def A).symm + +theorem norm_descendantsAverageMat_le_descendantsAverage_norm {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + ‖descendantsAverageMat Q j F‖ ≤ descendantsAverage Q j (fun R => ‖F R‖) := by + classical + let D := descendantsAtDepth Q j + let c : ℝ := (D.card : ℝ)⁻¹ + have havg : + descendantsAverageMat Q j F = c • D.sum F := by + ext i k + rw [Matrix.smul_apply, Matrix.sum_apply] + simp [descendantsAverageMat, descendantsAverage, D, c] + have hc_nonneg : 0 ≤ c := by + positivity + calc + ‖descendantsAverageMat Q j F‖ = ‖c • D.sum F‖ := by + rw [havg] + _ = |c| * ‖D.sum F‖ := by + rw [norm_smul, Real.norm_eq_abs] + _ ≤ |c| * D.sum (fun R => ‖F R‖) := by + exact mul_le_mul_of_nonneg_left (norm_sum_le _ _) (abs_nonneg _) + _ = c * D.sum (fun R => ‖F R‖) := by + rw [abs_of_nonneg hc_nonneg] + _ = descendantsAverage Q j (fun R => ‖F R‖) := by + simp [descendantsAverage, D, c] + +theorem matNorm_descendantsAverageMat_le_descendantsAverage_matNorm {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + matNorm (descendantsAverageMat Q j F) ≤ descendantsAverage Q j (fun R => matNorm (F R)) := by + simpa [matNorm_eq_norm] using + norm_descendantsAverageMat_le_descendantsAverage_norm Q j F + +@[simp] theorem finsetAverage_singleton {α : Type*} (a : α) (f : α → ℝ) : + finsetAverage ({a} : Finset α) f = f a := by + unfold finsetAverage + simp + +@[simp] theorem finsetSsup_singleton {α : Type*} (a : α) (f : α → ℝ) : + finsetSsup ({a} : Finset α) f = f a := by + unfold finsetSsup + simp + +theorem finsetAverage_le_finsetSsup {α : Type*} [DecidableEq α] + (s : Finset α) (hs : s.Nonempty) (f : α → ℝ) : + finsetAverage s f ≤ finsetSsup s f := by + classical + have hBdd : BddAbove (f '' (↑s : Set α)) := by + exact ((Set.toFinite _).image f).bddAbove + unfold finsetAverage finsetSsup + have hsum : + s.sum f ≤ s.sum (fun _ => sSup (f '' (↑s : Set α))) := by + refine Finset.sum_le_sum ?_ + intro a ha + exact le_csSup hBdd ⟨a, ha, rfl⟩ + have hcard : ((s.card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr hs) + calc + (↑s.card)⁻¹ * s.sum f ≤ (↑s.card)⁻¹ * s.sum (fun _ => sSup (f '' (↑s : Set α))) := by + refine mul_le_mul_of_nonneg_left hsum ?_ + positivity + _ = (↑s.card : ℝ)⁻¹ * ((↑s.card : ℝ) * sSup (f '' (↑s : Set α))) := by + simp [Finset.sum_const, nsmul_eq_mul] + _ = (((↑s.card : ℝ)⁻¹) * (↑s.card : ℝ)) * sSup (f '' (↑s : Set α)) := by ring + _ = sSup (f '' (↑s : Set α)) := by + rw [inv_mul_cancel₀ hcard, one_mul] + +theorem descendantsAverage_le_finsetSsup {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : TriadicCube d → ℝ) : + descendantsAverage Q j f ≤ finsetSsup (descendantsAtDepth Q j) f := by + exact finsetAverage_le_finsetSsup (descendantsAtDepth Q j) + (descendantsAtDepth_nonempty Q j) f + +theorem matNorm_descendantsAverageMat_le_finsetSsup_matNorm {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → Mat d) : + matNorm (descendantsAverageMat Q j F) ≤ + finsetSsup (descendantsAtDepth Q j) (fun R => matNorm (F R)) := by + calc + matNorm (descendantsAverageMat Q j F) + ≤ descendantsAverage Q j (fun R => matNorm (F R)) := by + exact matNorm_descendantsAverageMat_le_descendantsAverage_matNorm Q j F + _ ≤ finsetSsup (descendantsAtDepth Q j) (fun R => matNorm (F R)) := by + exact descendantsAverage_le_finsetSsup Q j (fun R => matNorm (F R)) + +theorem sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigmaStar : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) : + (sigmaStarInvCoarse U a).PosSemidef := by + have hInv : + IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) := + isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨sigmaStar⁻¹, isSigmaStarInvCoarse_of_isSigmaStarCoarse hS⟩ + rcases hInv with ⟨hSymm, hResp⟩ + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using hSymm + · intro q + have hRespNonneg : 0 ≤ ResponseJ U 0 q a := responseJ_nonneg U 0 q a + have hQuad : + 0 ≤ vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + nlinarith [hRespNonneg, hResp q] + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hQuad + +theorem bCoarse_posSemidef_of_isSigmaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) : + (bCoarse sigma sigmaStar kappa).PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · have hSymm : (bCoarse sigma sigmaStar kappa).IsSymm := + bCoarse_isSymm_of_isSigmaCoarse hS hSigma + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hSymm + · intro p + have hRespNonneg : 0 ≤ ResponseJ U p 0 a := responseJ_nonneg U p 0 a + have hQuad : + 0 ≤ vecDot p (matVecMul (bCoarse sigma sigmaStar kappa) p) := by + nlinarith [hRespNonneg, responseJ_zero_eq_half_bCoarse_of_isSigmaCoarse hSigma p] + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hQuad + +theorem bCoarse_canonical_posSemidef_of_isSigmaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + (bCoarse (sigmaCoarse U a) (sigmaStarCoarse U a) (kappaCoarse U a)).PosSemidef := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet, + eq_kappaCoarse_of_isKappaCoarse hS hK hdet] + exact bCoarse_posSemidef_of_isSigmaCoarse hS hSigma + +theorem coarseBlockMatrix_upperLeft_posSemidef_of_isSigmaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + ((coarseBlockMatrix U a).upperLeft).PosSemidef := by + rw [coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hA hS hK hSigma hdet] + exact bCoarse_posSemidef_of_isSigmaCoarse hS hSigma + +theorem coarseBlockMatrix_lowerRight_posSemidef_of_isSigmaCoarse {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {sigma sigmaStar kappa : Mat d} + (hA : IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a)) + (hS : IsSigmaStarCoarse U a sigmaStar) + (hK : IsKappaCoarse U a sigmaStar kappa) + (hSigma : IsSigmaCoarse U a sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + ((coarseBlockMatrix U a).lowerRight).PosSemidef := by + rw [coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix hA hS hK hSigma hdet] + simpa [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] using + sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := U) (a := a) hS + +/-- Positive semidefiniteness of the canonical `sigmaStarInvCoarse` matrix on +an open triadic cube, with the sigma-star coarse witness hidden inside +`OpenCubeDeterministicCoarseData`. -/ +theorem sigmaStarInvCoarse_openCubeSet_posSemidef_of_deterministicCoarseData {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) : + (sigmaStarInvCoarse (openCubeSet Q) a).PosSemidef := by + rcases hData with ⟨_, sigmaStar, _, _, hS, _, _, _⟩ + exact sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse + (U := openCubeSet Q) (a := a) hS + +/-- Positive semidefiniteness of the canonical `bCoarse` matrix on an open +triadic cube, with the raw sigma/kappa/coarse witnesses hidden inside +`OpenCubeDeterministicCoarseData`. -/ +theorem bCoarse_canonical_openCubeSet_posSemidef_of_deterministicCoarseData {d : ℕ} + {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) : + (bCoarse + (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)).PosSemidef := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact bCoarse_canonical_posSemidef_of_isSigmaCoarse + (U := openCubeSet Q) (a := a) hS hK hSigma hdet + +/-- Positive semidefiniteness of the upper-left deterministic coarse block on +an open triadic cube, with all raw deterministic coarse witnesses hidden inside +`OpenCubeDeterministicCoarseData`. -/ +theorem coarseBlockMatrix_upperLeft_openCubeSet_posSemidef_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) : + ((coarseBlockMatrix (openCubeSet Q) a).upperLeft).PosSemidef := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact coarseBlockMatrix_upperLeft_posSemidef_of_isSigmaCoarse + (U := openCubeSet Q) (a := a) hA hS hK hSigma hdet + +/-- Positive semidefiniteness of the lower-right deterministic coarse block on +an open triadic cube, with all raw deterministic coarse witnesses hidden inside +`OpenCubeDeterministicCoarseData`. -/ +theorem coarseBlockMatrix_lowerRight_openCubeSet_posSemidef_of_deterministicCoarseData + {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} + (hData : OpenCubeDeterministicCoarseData Q a) : + ((coarseBlockMatrix (openCubeSet Q) a).lowerRight).PosSemidef := by + rcases hData with ⟨sigma, sigmaStar, kappa, hA, hS, hK, hSigma, hdet⟩ + exact coarseBlockMatrix_lowerRight_posSemidef_of_isSigmaCoarse + (U := openCubeSet Q) (a := a) hA hS hK hSigma hdet + +theorem coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) : + coarseBlockMatrix (cubeSet Q) a = coarseBlockMatrix (openCubeSet Q) a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [z, cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [z, cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [z, openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [z, openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + calc + coarseBlockMatrix (cubeSet Q) a + = coarseBlockMatrix (translateSet z (cubeSet (originCube d Q.scale))) a := by + rw [hcube] + _ = coarseBlockMatrix (cubeSet (originCube d Q.scale)) (translateCoeffField z a) := by + exact coarseBlockMatrix_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) a + _ = coarseBlockMatrix (openCubeSet (originCube d Q.scale)) (translateCoeffField z a) := by + exact coarseBlockMatrix_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) (a := translateCoeffField z a) + _ = coarseBlockMatrix (translateSet z (openCubeSet (originCube d Q.scale))) a := by + symm + exact coarseBlockMatrix_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) a + _ = coarseBlockMatrix (openCubeSet Q) a := by + rw [hopen] + +theorem descendantsAverageMat_posSemidef {d : ℕ} + {Q : TriadicCube d} {j : ℕ} {F : TriadicCube d → Mat d} + (hF : ∀ R ∈ descendantsAtDepth Q j, (F R).PosSemidef) : + (descendantsAverageMat Q j F).PosSemidef := by + classical + let D := descendantsAtDepth Q j + let c : ℝ := (D.card : ℝ)⁻¹ + have hsum : (D.sum F).PosSemidef := by + simpa [D] using (Matrix.posSemidef_sum (s := D) (x := F) hF) + have hc : 0 ≤ c := by + positivity + have havg : + descendantsAverageMat Q j F = c • D.sum F := by + ext i k + rw [Matrix.smul_apply, Matrix.sum_apply] + simp [descendantsAverageMat, descendantsAverage, D, c] + rw [havg] + exact hsum.smul hc + +theorem matNormSq_eq_trace_transpose_mul {d : ℕ} (A : Mat d) : + matNormSq A = Matrix.trace (A.transpose * A) := by + rw [Matrix.trace_mul_comm] + simpa [matNormSq, pow_two] using (Matrix.sum_hadamard_eq (A := A) (B := A)) + +theorem matNormSq_eq_trace_mul_transpose {d : ℕ} (A : Mat d) : + matNormSq A = Matrix.trace (A * A.transpose) := by + rw [matNormSq_eq_trace_transpose_mul, Matrix.trace_mul_comm] + +theorem matNormSq_eq_trace_mul_self_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) : + matNormSq A = Matrix.trace (A * A) := by + rw [matNormSq_eq_trace_mul_transpose] + have hAT : A.transpose = A := by + simpa [Matrix.IsSymm] using hA + rw [hAT] + +theorem matNormSq_eq_trace_pow_two_of_isSymm {d : ℕ} {A : Mat d} + (hA : A.IsSymm) : + matNormSq A = Matrix.trace (A ^ 2) := by + simpa [pow_two] using matNormSq_eq_trace_mul_self_of_isSymm hA + +theorem matLoewnerLE_sub_posSemidef_of_posSemidef {d : ℕ} + {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + (B - A).PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg + (hB.isHermitian.sub hA.isHermitian) ?_ + intro x + change 0 ≤ dotProduct x (Matrix.mulVec (B - A) x) + rw [Matrix.sub_mulVec, dotProduct_sub] + have hAB' : + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec A x) ≤ + (1 / 2 : ℝ) * dotProduct x (Matrix.mulVec B x) := by + simpa [vecDot, matVecMul] using! hAB x + nlinarith + +theorem matNormSq_le_of_matLoewnerLE_of_posSemidef {d : ℕ} + {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matNormSq A ≤ matNormSq B := by + let D : Mat d := B - A + have hAh : A.IsHermitian := hA.isHermitian + have hBh : B.IsHermitian := hB.isHermitian + have hAsymm : A.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hAh + have hBsymm : B.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hBh + have hD : D.PosSemidef := by + dsimp [D] + exact matLoewnerLE_sub_posSemidef_of_posSemidef hA hB hAB + let C : Mat d := CFC.sqrt D + have hCpsd : C.PosSemidef := by + dsimp [C] + exact (Matrix.nonneg_iff_posSemidef (A := CFC.sqrt D)).mp (CFC.sqrt_nonneg D) + have hDsq : C ^ 2 = D := by + dsimp [C] + simpa using CFC.sq_sqrt D hD.nonneg + have hCsymm : C.IsSymm := by + simpa [Matrix.IsHermitian, Matrix.IsSymm] using hCpsd.isHermitian + have hCAD : (C * A * C).PosSemidef := by + have hCACt : (C * A * C.transpose).PosSemidef := by + simpa [Matrix.mul_assoc] using hA.mul_mul_conjTranspose_same C + have hCt : C.transpose = C := by + simpa [Matrix.IsSymm] using hCsymm + simpa [hCt, Matrix.mul_assoc] using hCACt + have htraceAD : + Matrix.trace (A * D) = Matrix.trace (C * A * C) := by + calc + Matrix.trace (A * D) = Matrix.trace (A * (C ^ 2)) := by rw [hDsq] + _ = Matrix.trace (C * A * C) := by + simpa [pow_two, Matrix.mul_assoc] using (Matrix.trace_mul_cycle A C C) + have hAD_nonneg : 0 ≤ Matrix.trace (A * D) := by + rw [htraceAD] + exact hCAD.trace_nonneg + have hDA_nonneg : 0 ≤ Matrix.trace (D * A) := by + rw [Matrix.trace_mul_comm] + exact hAD_nonneg + have hDsq_nonneg : 0 ≤ Matrix.trace (D ^ 2) := by + simpa using (hD.pow 2).trace_nonneg + have hB_eq : A + D = B := by + ext i j + dsimp [D] + ring + have htrace_expand : + Matrix.trace (B ^ 2) = + Matrix.trace (A ^ 2) + Matrix.trace (A * D) + Matrix.trace (D * A) + Matrix.trace (D ^ 2) := by + calc + Matrix.trace (B ^ 2) = Matrix.trace ((A + D) ^ 2) := by rw [← hB_eq] + _ = Matrix.trace (A ^ 2 + A * D + (D * A + D ^ 2)) := by + congr 1 + simp [pow_two, Matrix.add_mul, Matrix.mul_add, add_assoc] + abel_nf + _ = Matrix.trace (A ^ 2 + A * D) + Matrix.trace (D * A + D ^ 2) := by + rw [Matrix.trace_add] + _ = (Matrix.trace (A ^ 2) + Matrix.trace (A * D)) + + (Matrix.trace (D * A) + Matrix.trace (D ^ 2)) := by + rw [Matrix.trace_add, Matrix.trace_add] + _ = Matrix.trace (A ^ 2) + Matrix.trace (A * D) + Matrix.trace (D * A) + Matrix.trace (D ^ 2) := by + ac_rfl + have hextra_nonneg : + 0 ≤ Matrix.trace (A * D) + Matrix.trace (D * A) + Matrix.trace (D ^ 2) := by + refine add_nonneg (add_nonneg hAD_nonneg hDA_nonneg) hDsq_nonneg + have htrace_le : Matrix.trace (A ^ 2) ≤ Matrix.trace (B ^ 2) := by + rw [htrace_expand] + linarith + rw [matNormSq_eq_trace_pow_two_of_isSymm hAsymm, matNormSq_eq_trace_pow_two_of_isSymm hBsymm] + exact htrace_le + +theorem matNorm_le_of_matLoewnerLE_of_posSemidef {d : ℕ} + {A B : Mat d} (hA : A.PosSemidef) (hB : B.PosSemidef) + (hAB : MatLoewnerLE A B) : + matNorm A ≤ matNorm B := by + unfold matNorm + exact Real.sqrt_le_sqrt (matNormSq_le_of_matLoewnerLE_of_posSemidef hA hB hAB) + +@[simp] theorem geometricDiscount_one_eq (s : ℝ) : + geometricDiscount s 1 = 1 - Real.rpow (3 : ℝ) (-s) := by + unfold geometricDiscount + simp + +@[simp] theorem geometricWeight_one_eq (s : ℝ) (n : ℕ) : + geometricWeight s 1 n = + geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * (n : ℝ)) := by + unfold geometricWeight + have hexp : -s * (1 : ℝ) * (n : ℝ) = -s * (n : ℝ) := by ring + rw [hexp] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/CoefficientBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/CoefficientBounds.lean new file mode 100644 index 0000000000..b4234e283d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/CoefficientBounds.lean @@ -0,0 +1,599 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometric + +/-! # Coefficient Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem thetaRatio_eq_div {d : ℕ} (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) : + ThetaRatio Q s t a = LambdaSq Q s (.finite 1) a / lambdaSq Q t (.finite 1) a := rfl + +@[simp] theorem homogenizationError_finite_eq {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) (q : ℝ) + (a : CoeffField d) (a0 : Mat d) : + HomogenizationError Q n s p (.finite q) a a0 = + HomogenizationErrorFinite Q n s p q a a0 := rfl + +@[simp] theorem homogenizationError_infinity_eq {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (p : MultiscaleExponent) + (a : CoeffField d) (a0 : Mat d) : + HomogenizationError Q n s p .infinity a a0 = + HomogenizationErrorInfinity Q n s p a a0 := rfl + +theorem homogenizationErrorOnCube_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (p q : MultiscaleExponent) + (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorOnCube Q s p q a a0 = + HomogenizationError Q Q.scale s p q a a0 := rfl + +@[simp] theorem multiscale_ellipticity_LambdaSq_one_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + LambdaSq Q s (.finite 1) a = LambdaSqFinite Q s 1 a := by + simp + +@[simp] theorem multiscale_ellipticity_lambdaSq_one_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + lambdaSq Q s (.finite 1) a = lambdaSqFinite Q s 1 a := by + simp + +@[simp] theorem multiscale_ellipticity_LambdaSqFinite_one_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + LambdaSqFinite Q s 1 a = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2)) + 2 := by + unfold LambdaSqFinite + norm_num + +@[simp] theorem multiscale_ellipticity_lambdaSqFinite_one_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + lambdaSqFinite Q s 1 a = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2)) + (-2) := by + unfold lambdaSqFinite + norm_num + +@[simp] theorem multiscale_ellipticity_LambdaSq_one_formula {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + LambdaSq Q s (.finite 1) a = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2)) + 2 := by + rw [multiscale_ellipticity_LambdaSq_one_eq, multiscale_ellipticity_LambdaSqFinite_one_eq] + +@[simp] theorem multiscale_ellipticity_lambdaSq_one_formula {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + lambdaSq Q s (.finite 1) a = + Real.rpow + (∑' n : ℕ, + geometricWeight s 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2)) + (-2) := by + rw [multiscale_ellipticity_lambdaSq_one_eq, multiscale_ellipticity_lambdaSqFinite_one_eq] + +@[simp] theorem thetaRatio_eq_div_finite_one {d : ℕ} + (Q : TriadicCube d) (s t : ℝ) (a : CoeffField d) : + ThetaRatio Q s t a = LambdaSqFinite Q s 1 a / lambdaSqFinite Q t 1 a := by + simp [thetaRatio_eq_div] + +@[simp] theorem homogenizationError_infinity_one_eq {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationError Q n s .infinity (.finite 1) a a0 = + HomogenizationErrorFinite Q n s .infinity 1 a a0 := by + simp + +@[simp] theorem homogenizationErrorFinite_infinity_one_eq_tsum {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorFinite Q n s .infinity 1 a a0 = + ∑' l : ℕ, geometricWeight s 1 l * scaleResponseAtScale Q (n - (l : ℤ)) .infinity a a0 := by + unfold HomogenizationErrorFinite + simp [Real.rpow_one] + +@[simp] theorem homogenizationErrorFinite_infinity_one_formula {d : ℕ} + (Q : TriadicCube d) (n : ℤ) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorFinite Q n s .infinity 1 a a0 = + ∑' l : ℕ, + geometricWeight s 1 l * + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q (n - (l : ℤ)) a a0) (1 / 2) := by + rw [homogenizationErrorFinite_infinity_one_eq_tsum] + simp + +@[simp] theorem homogenizationErrorOnCube_infinity_one_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 = + HomogenizationErrorFinite Q Q.scale s .infinity 1 a a0 := by + simp [homogenizationErrorOnCube_eq] + +@[simp] theorem homogenizationErrorOnCube_infinity_one_eq_tsum {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 = + ∑' l : ℕ, geometricWeight s 1 l * scaleResponseAtScale Q (Q.scale - (l : ℤ)) .infinity a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq, homogenizationErrorFinite_infinity_one_eq_tsum] + +@[simp] theorem homogenizationErrorOnCube_infinity_one_formula {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) (a0 : Mat d) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 = + ∑' l : ℕ, + geometricWeight s 1 l * + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q (Q.scale - (l : ℤ)) a a0) + (1 / 2) := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + simp + +theorem coarseBBlockNorm_nonneg {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) : + 0 ≤ coarseBBlockNorm Q a := by + unfold coarseBBlockNorm + exact matNorm_nonneg _ + +theorem coarseSigmaStarInvBlockNorm_nonneg {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) : + 0 ≤ coarseSigmaStarInvBlockNorm Q a := by + unfold coarseSigmaStarInvBlockNorm + exact matNorm_nonneg _ + +theorem coarseBBlockNorm_le_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + coarseBBlockNorm Q a ≤ maxDescendantBBlockNormAtScale Q k a := by + let j : ℕ := Int.toNat (Q.scale - k) + have hQQ : Q ∈ descendantsAtScale Q Q.scale := by + simp [descendantsAtScale_self] + rcases hData Q.scale le_rfl Q hQQ with + ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + have hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + exact hData k hk R hRk + have hcanonQ : + bCoarse sigmaQ sigmaStarQ kappaQ = + bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a) := by + calc + bCoarse sigmaQ sigmaStarQ kappaQ = + bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hSQ hKQ hSigmaQ hdetQ, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSQ hdetQ, + eq_kappaCoarse_of_isKappaCoarse hSQ hKQ hdetQ] + _ = + bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a) := by + symm + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := Q) (a := a) hSQ hKQ hSigmaQ hdetQ] + have hAvgEq : + descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a)) = + descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) := by + ext i l + unfold descendantsAverageMat descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) = + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a) := by + symm + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := a) hSR hKR hSigmaR hdetR] + simpa using congrArg (fun M : Mat d => M i l) hcanonR + have hLoewner : + MatLoewnerLE + (bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a)) + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) := by + intro p + calc + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a)) p) = + (1 / 2 : ℝ) * vecDot p + (matVecMul + (bCoarse (sigmaCoarse (openCubeSet Q) a) + (sigmaStarCoarse (openCubeSet Q) a) + (kappaCoarse (openCubeSet Q) a)) p) := by + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := Q) (a := a) hSQ hKQ hSigmaQ hdetQ] + _ ≤ (1 / 2 : ℝ) * vecDot p + (matVecMul + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a))) p) := by + exact + bCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ hDesc p + _ = (1 / 2 : ℝ) * vecDot p + (matVecMul + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) p) := by + rw [hAvgEq] + have hParentPSD : + (bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a)).PosSemidef := by + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := Q) (a := a) hSQ hKQ hSigmaQ hdetQ] + exact bCoarse_canonical_posSemidef_of_isSigmaCoarse hSQ hKQ hSigmaQ hdetQ + have hAvgPSD : + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))).PosSemidef := by + refine descendantsAverageMat_posSemidef ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + bCoarse sigmaR sigmaStarR kappaR = + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a) := by + calc + bCoarse sigmaR sigmaStarR kappaR = + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hSR hKR hSigmaR hdetR, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSR hdetR, + eq_kappaCoarse_of_isKappaCoarse hSR hKR hdetR] + _ = + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a) := by + symm + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := a) hSR hKR hSigmaR hdetR] + rw [← hcanonR] + exact bCoarse_posSemidef_of_isSigmaCoarse hSR hSigmaR + have hParentEq : + coarseBBlockNorm Q a = + matNorm + (bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a)) := by + unfold coarseBBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a, + coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hAQ hSQ hKQ hSigmaQ hdetQ, + hcanonQ] + have hterm_eq : + ∀ R ∈ descendantsAtDepth Q j, + matNorm + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) = + coarseBBlockNorm R a := by + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + bCoarse sigmaR sigmaStarR kappaR = + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a) := by + calc + bCoarse sigmaR sigmaStarR kappaR = + bCoarse (sigmaCoarse (openCubeSet R) a) + (sigmaStarCoarse (openCubeSet R) a) + (kappaCoarse (openCubeSet R) a) := by + rw [sigmaCoarse_eq_of_isSigmaCoarse hSR hKR hSigmaR hdetR, + eq_sigmaStarCoarse_of_isSigmaStarCoarse hSR hdetR, + eq_kappaCoarse_of_isKappaCoarse hSR hKR hdetR] + _ = + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a) := by + symm + rw [bCoarse_sigmaCoarse_sigmaStarCoarse_kappaCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaCoarse + (Q := R) (a := a) hSR hKR hSigmaR hdetR] + unfold coarseBBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_upperLeft_eq_bCoarse_of_isCoarseBlockMatrix hAR hSR hKR hSigmaR hdetR, + hcanonR] + have himage : + (fun R => + matNorm + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) '' + (↑(descendantsAtDepth Q j) : Set (TriadicCube d)) = + (fun R => coarseBBlockNorm R a) '' (↑(descendantsAtDepth Q j) : Set (TriadicCube d)) := by + ext x + constructor + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, (hterm_eq R hR).symm⟩ + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, hterm_eq R hR⟩ + calc + coarseBBlockNorm Q a = + matNorm + (bCoarse (sigmaCoarse (cubeSet Q) a) + (sigmaStarCoarse (cubeSet Q) a) + (kappaCoarse (cubeSet Q) a)) := hParentEq + _ ≤ + matNorm + (descendantsAverageMat Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) := by + exact matNorm_le_of_matLoewnerLE_of_posSemidef hParentPSD hAvgPSD hLoewner + _ ≤ finsetSsup (descendantsAtDepth Q j) + (fun R => + matNorm + (bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a))) := by + exact matNorm_descendantsAverageMat_le_finsetSsup_matNorm Q j + (fun R => + bCoarse (sigmaCoarse (cubeSet R) a) + (sigmaStarCoarse (cubeSet R) a) + (kappaCoarse (cubeSet R) a)) + _ = finsetSsup (descendantsAtDepth Q j) (fun R => coarseBBlockNorm R a) := by + unfold finsetSsup + rw [himage] + _ = maxDescendantBBlockNormAtScale Q k a := by + unfold maxDescendantBBlockNormAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + +theorem coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + coarseSigmaStarInvBlockNorm Q a ≤ + maxDescendantSigmaStarInvNormAtScale Q k a := by + let j : ℕ := Int.toNat (Q.scale - k) + have hQQ : Q ∈ descendantsAtScale Q Q.scale := by + simp [descendantsAtScale_self] + rcases hData Q.scale le_rfl Q hQQ with + ⟨sigmaQ, sigmaStarQ, kappaQ, hAQ, hSQ, hKQ, hSigmaQ, hdetQ⟩ + have hDesc : + ∀ R ∈ descendantsAtDepth Q j, + ∃ sigmaR sigmaStarR kappaR, + IsCoarseBlockMatrix (openCubeSet R) a + (deterministicCoarseBlockMatrix (openCubeSet R) a) ∧ + IsSigmaStarCoarse (openCubeSet R) a sigmaStarR ∧ + IsKappaCoarse (openCubeSet R) a sigmaStarR kappaR ∧ + IsSigmaCoarse (openCubeSet R) a sigmaR sigmaStarR kappaR ∧ + IsUnit sigmaStarR.det := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + exact hData k hk R hRk + have hAvgEq : + descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (openCubeSet R) a) = + descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (cubeSet R) a) := by + ext i l + unfold descendantsAverageMat descendantsAverage + refine congrArg (fun t => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonR : + sigmaStarInvCoarse (openCubeSet R) a = sigmaStarInvCoarse (cubeSet R) a := by + symm + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := a) hSR] + simpa using congrArg (fun M : Mat d => M i l) hcanonR + have hLoewner : + MatLoewnerLE (sigmaStarInvCoarse (cubeSet Q) a) + (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (cubeSet R) a)) := by + intro q + calc + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (cubeSet Q) a) q) = + (1 / 2 : ℝ) * vecDot q (matVecMul (sigmaStarInvCoarse (openCubeSet Q) a) q) := by + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := Q) (a := a) hSQ] + _ ≤ (1 / 2 : ℝ) * vecDot q + (matVecMul (descendantsAverageMat Q j + (fun R => sigmaStarInvCoarse (openCubeSet R) a)) q) := by + exact + sigmaStarInvCoarse_subadditive_openCubeSet_descendantsAtDepth_in_loewner_order_of_isSigmaCoarse + j Q a hEll hSQ hKQ hSigmaQ hdetQ hDesc q + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (descendantsAverageMat Q j + (fun R => sigmaStarInvCoarse (cubeSet R) a)) q) := by + rw [hAvgEq] + have hParentPSD : (sigmaStarInvCoarse (cubeSet Q) a).PosSemidef := by + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := Q) (a := a) hSQ] + exact sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := openCubeSet Q) (a := a) hSQ + have hAvgPSD : + (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (cubeSet R) a)).PosSemidef := by + refine descendantsAverageMat_posSemidef ?_ + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := a) hSR] + exact sigmaStarInvCoarse_posSemidef_of_isSigmaStarCoarse (U := openCubeSet R) (a := a) hSR + have hcanonQsig : sigmaStarQ⁻¹ = sigmaStarInvCoarse (cubeSet Q) a := by + calc + sigmaStarQ⁻¹ = sigmaStarInvCoarse (openCubeSet Q) a := by + symm + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSQ] + _ = sigmaStarInvCoarse (cubeSet Q) a := by + symm + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := Q) (a := a) hSQ] + have hParentEq : + coarseSigmaStarInvBlockNorm Q a = matNorm (sigmaStarInvCoarse (cubeSet Q) a) := by + unfold coarseSigmaStarInvBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube Q a, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix hAQ hSQ hKQ hSigmaQ hdetQ, + hcanonQsig] + have hterm_eq : + ∀ R ∈ descendantsAtDepth Q j, + matNorm (sigmaStarInvCoarse (cubeSet R) a) = coarseSigmaStarInvBlockNorm R a := by + intro R hR + rcases hDesc R hR with + ⟨sigmaR, sigmaStarR, kappaR, hAR, hSR, hKR, hSigmaR, hdetR⟩ + have hcanonRsig : sigmaStarR⁻¹ = sigmaStarInvCoarse (cubeSet R) a := by + calc + sigmaStarR⁻¹ = sigmaStarInvCoarse (openCubeSet R) a := by + symm + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSR] + _ = sigmaStarInvCoarse (cubeSet R) a := by + symm + rw [sigmaStarInvCoarse_cubeSet_eq_openCubeSet_of_triadicCube_of_isSigmaStarCoarse + (Q := R) (a := a) hSR] + unfold coarseSigmaStarInvBlockNorm + rw [coarseBlockMatrix_cubeSet_eq_openCubeSet_of_triadicCube R a, + coarseBlockMatrix_lowerRight_eq_sigmaStar_inv_of_isCoarseBlockMatrix hAR hSR hKR hSigmaR hdetR, + hcanonRsig] + have himage : + (fun R => matNorm (sigmaStarInvCoarse (cubeSet R) a)) '' + (↑(descendantsAtDepth Q j) : Set (TriadicCube d)) = + (fun R => coarseSigmaStarInvBlockNorm R a) '' (↑(descendantsAtDepth Q j) : Set (TriadicCube d)) := by + ext x + constructor + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, (hterm_eq R hR).symm⟩ + · rintro ⟨R, hR, rfl⟩ + exact ⟨R, hR, hterm_eq R hR⟩ + calc + coarseSigmaStarInvBlockNorm Q a = matNorm (sigmaStarInvCoarse (cubeSet Q) a) := hParentEq + _ ≤ matNorm (descendantsAverageMat Q j (fun R => sigmaStarInvCoarse (cubeSet R) a)) := by + exact matNorm_le_of_matLoewnerLE_of_posSemidef hParentPSD hAvgPSD hLoewner + _ ≤ finsetSsup (descendantsAtDepth Q j) (fun R => matNorm (sigmaStarInvCoarse (cubeSet R) a)) := by + exact matNorm_descendantsAverageMat_le_finsetSsup_matNorm Q j + (fun R => sigmaStarInvCoarse (cubeSet R) a) + _ = finsetSsup (descendantsAtDepth Q j) (fun R => coarseSigmaStarInvBlockNorm R a) := by + unfold finsetSsup + rw [himage] + _ = maxDescendantSigmaStarInvNormAtScale Q k a := by + unfold maxDescendantSigmaStarInvNormAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + +@[simp] theorem maxDescendantBBlockNormAtScale_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) : + maxDescendantBBlockNormAtScale Q Q.scale a = coarseBBlockNorm Q a := by + unfold maxDescendantBBlockNormAtScale finsetSsup + rw [descendantsAtScale_self] + have himage : + ((fun R => coarseBBlockNorm R a) '' (↑({Q} : Finset (TriadicCube d)) : Set (TriadicCube d))) = + ({coarseBBlockNorm Q a} : Set ℝ) := by + ext x + simp + rw [himage] + simp + +@[simp] theorem maxDescendantNormalizedBlockResponseAtScale_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) : + maxDescendantNormalizedBlockResponseAtScale Q Q.scale a a0 = + normalizedBlockResponseMax Q a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + rw [descendantsAtScale_self] + simp + +@[simp] theorem scaleResponseAtScale_finite_self_eq {d : ℕ} + (Q : TriadicCube d) (p : ℝ) (a : CoeffField d) (a0 : Mat d) : + scaleResponseAtScale Q Q.scale (.finite p) a a0 = + Real.rpow (Real.rpow (normalizedBlockResponseMax Q a a0) (p / 2)) (1 / p) := by + rw [scaleResponseAtScale_finite_eq] + rw [descendantsAtScale_self, finsetAverage_singleton] + +@[simp] theorem scaleResponseAtScale_infinity_self_eq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) : + scaleResponseAtScale Q Q.scale .infinity a a0 = + Real.rpow (normalizedBlockResponseMax Q a a0) (1 / 2) := by + rw [scaleResponseAtScale_infinity_eq, maxDescendantNormalizedBlockResponseAtScale_self] + +@[simp] theorem maxDescendantSigmaStarInvNormAtScale_self {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) : + maxDescendantSigmaStarInvNormAtScale Q Q.scale a = coarseSigmaStarInvBlockNorm Q a := by + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + rw [descendantsAtScale_self] + have himage : + ((fun R => coarseSigmaStarInvBlockNorm R a) '' (↑({Q} : Finset (TriadicCube d)) : Set (TriadicCube d))) = + ({coarseSigmaStarInvBlockNorm Q a} : Set ℝ) := by + ext x + simp + rw [himage] + simp + +theorem coarseBBlockNorm_le_maxDescendantBBlockNormAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) : + coarseBBlockNorm R a ≤ maxDescendantBBlockNormAtScale Q k a := by + unfold maxDescendantBBlockNormAtScale finsetSsup + have hBdd : + BddAbove ((fun S => coarseBBlockNorm S a) '' (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun S => coarseBBlockNorm S a)).bddAbove + exact le_csSup hBdd ⟨R, hR, rfl⟩ + +theorem coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) : + coarseSigmaStarInvBlockNorm R a ≤ maxDescendantSigmaStarInvNormAtScale Q k a := by + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hBdd : + BddAbove + ((fun S => coarseSigmaStarInvBlockNorm S a) '' (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun S => coarseSigmaStarInvBlockNorm S a)).bddAbove + exact le_csSup hBdd ⟨R, hR, rfl⟩ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometric.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometric.lean new file mode 100644 index 0000000000..bacbc00544 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometric.lean @@ -0,0 +1,446 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Geometry + +/-! # Geometric -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem geometricWeight_one_shift {s : ℝ} (h n : ℕ) : + geometricWeight s 1 n = + Real.rpow (3 : ℝ) (s * (h : ℝ)) * geometricWeight s 1 (n + h) := by + rw [geometricWeight_one_eq, geometricWeight_one_eq] + have h3 : 0 < (3 : ℝ) := by norm_num + have hpow : + Real.rpow (3 : ℝ) (s * (h : ℝ)) * + Real.rpow (3 : ℝ) (-s * ((n + h : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (-s * (n : ℝ)) := by + have hexp : + -s * (n : ℝ) = s * (h : ℝ) + -s * ((n + h : ℕ) : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (s * (h : ℝ)) * + Real.rpow (3 : ℝ) (-s * ((n + h : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (s * (h : ℝ) + -s * ((n + h : ℕ) : ℝ)) := by + simpa using (Real.rpow_add h3 (s * (h : ℝ)) (-s * ((n + h : ℕ) : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-s * (n : ℝ)) := by rw [hexp] + calc + geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * (n : ℝ)) = + geometricDiscount s 1 * + (Real.rpow (3 : ℝ) (s * (h : ℝ)) * Real.rpow (3 : ℝ) (-s * ((n + h : ℕ) : ℝ))) := by + rw [hpow] + _ = Real.rpow (3 : ℝ) (s * (h : ℝ)) * + (geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * ((n + h : ℕ) : ℝ))) := by ring + +theorem rpow_neg_mul_nat_succ_eq (s : ℝ) (n : ℕ) : + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s * (n : ℝ)) := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hexp : -s * ((n + 1 : ℕ) : ℝ) = -s + -s * (n : ℝ) := by + calc + -s * ((n + 1 : ℕ) : ℝ) = -s * ((n : ℝ) + 1) := by + rw [Nat.cast_add, Nat.cast_one] + _ = -s + -s * (n : ℝ) := by ring + calc + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (-s + -s * (n : ℝ)) := by rw [hexp] + _ = Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s * (n : ℝ)) := by + simpa using (Real.rpow_add h3 (-s) (-s * (n : ℝ))) + +theorem summable_rpow_neg_s_nat_mul_of_summable_geometricWeight_one + {H : ℕ → ℝ} {s : ℝ} (hs : 0 < s) + (hsum : Summable (fun n : ℕ => geometricWeight s 1 n * H n)) : + Summable (fun n : ℕ => Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + have hdisc_ne : geometricDiscount s 1 ≠ 0 := (geometricDiscount_pos (by simpa using hs)).ne' + have hEq : + (fun n : ℕ => geometricWeight s 1 n * H n) = + fun n : ℕ => geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + funext n + rw [geometricWeight_one_eq] + ring + rw [hEq] at hsum + exact (summable_mul_left_iff hdisc_ne).mp hsum + +theorem summable_rpow_neg_s_nat_succ_mul_sub_of_summable_geometricWeight_one + {H : ℕ → ℝ} {s : ℝ} (hs : 0 < s) + (hsum : Summable (fun n : ℕ => geometricWeight s 1 n * H n)) : + Summable (fun n : ℕ => + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n)) := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + let A : ℕ → ℝ := fun n => Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n + have hA : Summable A := summable_rpow_neg_s_nat_mul_of_summable_geometricWeight_one hs hsum + have hA1 : Summable (fun n : ℕ => A (n + 1)) := (summable_nat_add_iff 1).2 hA + have hrA : Summable (fun n : ℕ => r * A n) := hA.mul_left r + have hEq : + (fun n : ℕ => Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n)) = + fun n : ℕ => A (n + 1) - r * A n := by + funext n + calc + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) = + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H (n + 1) - + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H n := by + ring + _ = A (n + 1) - r * A n := by + dsimp [A, r] + congr 1 + calc + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H n = + (Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s * (n : ℝ))) * H n := by + exact congrArg (fun x : ℝ => x * H n) (rpow_neg_mul_nat_succ_eq s n) + _ = Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + ring + rw [hEq] + exact hA1.sub hrA + +theorem tsum_geometricWeight_one_eq_zero_add_tsum_rpow_neg_s_nat_succ_mul_sub + {H : ℕ → ℝ} {s : ℝ} (hs : 0 < s) + (hsum : Summable (fun n : ℕ => geometricWeight s 1 n * H n)) : + ∑' n : ℕ, geometricWeight s 1 n * H n = + H 0 + + ∑' n : ℕ, Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + let A : ℕ → ℝ := fun n => Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n + have hA : Summable A := summable_rpow_neg_s_nat_mul_of_summable_geometricWeight_one hs hsum + have hA1 : Summable (fun n : ℕ => A (n + 1)) := (summable_nat_add_iff 1).2 hA + have hrA : Summable (fun n : ℕ => r * A n) := hA.mul_left r + have hWeight : + ∑' n : ℕ, geometricWeight s 1 n * H n = + geometricDiscount s 1 * ∑' n : ℕ, A n := by + have hEq : + (fun n : ℕ => geometricWeight s 1 n * H n) = + fun n : ℕ => geometricDiscount s 1 * A n := by + funext n + rw [geometricWeight_one_eq] + dsimp [A] + ring + rw [hEq, tsum_mul_left] + have hTail : + ∑' n : ℕ, A (n + 1) = ∑' n : ℕ, A n - A 0 := by + have hsplit := hA.sum_add_tsum_nat_add 1 + have hsplit' : A 0 + ∑' n : ℕ, A (n + 1) = ∑' n : ℕ, A n := by + simpa using hsplit + linarith + have hDiff : + ∑' n : ℕ, Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) = + ∑' n : ℕ, A (n + 1) - ∑' n : ℕ, r * A n := by + have hEq : + (fun n : ℕ => Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n)) = + fun n : ℕ => A (n + 1) - r * A n := by + funext n + calc + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) = + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H (n + 1) - + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H n := by + ring + _ = A (n + 1) - r * A n := by + dsimp [A, r] + congr 1 + calc + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * H n = + (Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s * (n : ℝ))) * H n := by + exact congrArg (fun x : ℝ => x * H n) (rpow_neg_mul_nat_succ_eq s n) + _ = Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + ring + rw [hEq] + exact (HasSum.sub hA1.hasSum hrA.hasSum).tsum_eq + have hA0 : A 0 = H 0 := by + dsimp [A] + simp + calc + ∑' n : ℕ, geometricWeight s 1 n * H n = geometricDiscount s 1 * ∑' n : ℕ, A n := hWeight + _ = H 0 + (∑' n : ℕ, A (n + 1) - ∑' n : ℕ, r * A n) := by + rw [geometricDiscount_one_eq, tsum_mul_left, hTail] + dsimp [r] + linarith + _ = + H 0 + + ∑' n : ℕ, Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) := by + rw [hDiff] + +theorem tsum_geometricWeight_one_le_of_monotone {H : ℕ → ℝ} + (hmono : Monotone H) (hnonneg : ∀ n : ℕ, 0 ≤ H n) + {t s : ℝ} (ht : 0 < t) (hts : t < s) + (hsum_t : Summable (fun n : ℕ => geometricWeight t 1 n * H n)) : + ∑' n : ℕ, geometricWeight s 1 n * H n ≤ + ∑' n : ℕ, geometricWeight t 1 n * H n := by + let C : ℝ := geometricDiscount s 1 / geometricDiscount t 1 + have hs : 0 < s := lt_trans ht hts + have hdisc_t_pos : 0 < geometricDiscount t 1 := by + exact geometricDiscount_pos (by simpa using ht) + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hsum_s : Summable (fun n : ℕ => geometricWeight s 1 n * H n) := by + have hscaled : Summable (fun n : ℕ => C * (geometricWeight t 1 n * H n)) := hsum_t.mul_left C + refine Summable.of_nonneg_of_le ?_ ?_ hscaled + · intro n + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) (hnonneg n) + · intro n + have hpow : + Real.rpow (3 : ℝ) (-s * (n : ℝ)) ≤ Real.rpow (3 : ℝ) (-t * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) ?_ + nlinarith + calc + geometricWeight s 1 n * H n + = geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + rw [geometricWeight_one_eq] + ring + _ ≤ geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-t * (n : ℝ)) * H n) := by + refine mul_le_mul_of_nonneg_left ?_ hdisc_s_pos.le + exact mul_le_mul_of_nonneg_right hpow (hnonneg n) + _ = C * (geometricWeight t 1 n * H n) := by + dsimp [C] + rw [geometricWeight_one_eq] + field_simp [hdisc_t_pos.ne'] + simp [mul_comm] + let deltaS : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) + let deltaT : ℕ → ℝ := fun n => + Real.rpow (3 : ℝ) (-t * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) + have hdeltaT_nonneg : ∀ n : ℕ, 0 ≤ deltaT n := by + intro n + dsimp [deltaT] + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact sub_nonneg.mpr (hmono (Nat.le_succ n)) + have hdeltaS_nonneg : ∀ n : ℕ, 0 ≤ deltaS n := by + intro n + dsimp [deltaS] + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact sub_nonneg.mpr (hmono (Nat.le_succ n)) + have hdeltaLe : ∀ n : ℕ, deltaS n ≤ deltaT n := by + intro n + dsimp [deltaS, deltaT] + have hpow : + Real.rpow (3 : ℝ) (-s * ((n + 1 : ℕ) : ℝ)) ≤ + Real.rpow (3 : ℝ) (-t * ((n + 1 : ℕ) : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) ?_ + nlinarith + exact mul_le_mul_of_nonneg_right hpow (sub_nonneg.mpr (hmono (Nat.le_succ n))) + have hdeltaT_summable : + Summable deltaT := by + dsimp [deltaT] + exact summable_rpow_neg_s_nat_succ_mul_sub_of_summable_geometricWeight_one ht hsum_t + have hdeltaS_summable : + Summable deltaS := by + refine Summable.of_nonneg_of_le hdeltaS_nonneg hdeltaLe hdeltaT_summable + have hdeltaSumLe : + ∑' n : ℕ, deltaS n ≤ ∑' n : ℕ, deltaT n := + Summable.tsum_le_tsum hdeltaLe hdeltaS_summable hdeltaT_summable + calc + ∑' n : ℕ, geometricWeight s 1 n * H n = + H 0 + ∑' n : ℕ, deltaS n := by + dsimp [deltaS] + exact tsum_geometricWeight_one_eq_zero_add_tsum_rpow_neg_s_nat_succ_mul_sub hs hsum_s + _ ≤ H 0 + ∑' n : ℕ, deltaT n := by + linarith + _ = ∑' n : ℕ, geometricWeight t 1 n * H n := by + dsimp [deltaT] + symm + exact tsum_geometricWeight_one_eq_zero_add_tsum_rpow_neg_s_nat_succ_mul_sub ht hsum_t + +theorem geometricDiscount_eq_mul_one (s q : ℝ) : + geometricDiscount s q = geometricDiscount (s * q) 1 := by + unfold geometricDiscount + congr 2 + ring + +theorem geometricWeight_eq_mul_one (s q : ℝ) (n : ℕ) : + geometricWeight s q n = geometricWeight (s * q) 1 n := by + unfold geometricWeight + rw [geometricDiscount_eq_mul_one] + congr 2 + ring + +theorem summable_geometricWeight {s q : ℝ} (hsq : 0 < s * q) : + Summable (fun n : ℕ => geometricWeight s q n) := by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using + summable_geometricWeight_one (s := s * q) hsq + +theorem tsum_geometricWeight_eq_one {s q : ℝ} (hsq : 0 < s * q) : + ∑' n : ℕ, geometricWeight s q n = 1 := by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using + tsum_geometricWeight_one_eq_one (s := s * q) hsq + +theorem geometricWeight_shift {s q : ℝ} (h n : ℕ) : + geometricWeight s q n = + Real.rpow (3 : ℝ) (s * q * (h : ℝ)) * geometricWeight s q (n + h) := by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using + (geometricWeight_one_shift (s := s * q) h n) + +theorem summable_geometricWeight_mul_of_nonneg_of_le {H : ℕ → ℝ} {s q C : ℝ} + (hsq : 0 < s * q) (hnonneg : ∀ n : ℕ, 0 ≤ H n) (hbound : ∀ n : ℕ, H n ≤ C) : + Summable (fun n : ℕ => geometricWeight s q n * H n) := by + have hC_nonneg : 0 ≤ C := by + exact le_trans (hnonneg 0) (hbound 0) + have hscaled : Summable (fun n : ℕ => C * geometricWeight s q n) := + (summable_geometricWeight hsq).mul_left C + refine Summable.of_nonneg_of_le ?_ ?_ hscaled + · intro n + exact mul_nonneg (geometricWeight_nonneg n hsq.le) (hnonneg n) + · intro n + calc + geometricWeight s q n * H n ≤ geometricWeight s q n * C := by + exact mul_le_mul_of_nonneg_left (hbound n) (geometricWeight_nonneg n hsq.le) + _ = C * geometricWeight s q n := by ring + +theorem summable_geometricWeight_of_lt {H : ℕ → ℝ} + (hnonneg : ∀ n : ℕ, 0 ≤ H n) {q t s : ℝ} (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hsum_t : Summable (fun n : ℕ => geometricWeight t q n * H n)) : + Summable (fun n : ℕ => geometricWeight s q n * H n) := by + have htq : 0 < t * q := mul_pos ht hq + have hsq : 0 < s * q := mul_pos (lt_trans ht hts) hq + have hstq : t * q < s * q := by + exact mul_lt_mul_of_pos_right hts hq + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using + (summable_geometricWeight_one_of_lt hnonneg htq hstq (by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using hsum_t)) + +theorem tsum_geometricWeight_le_of_monotone {H : ℕ → ℝ} + (hmono : Monotone H) (hnonneg : ∀ n : ℕ, 0 ≤ H n) + {q t s : ℝ} (hq : 0 < q) (ht : 0 < t) (hts : t < s) + (hsum_t : Summable (fun n : ℕ => geometricWeight t q n * H n)) : + ∑' n : ℕ, geometricWeight s q n * H n ≤ + ∑' n : ℕ, geometricWeight t q n * H n := by + have htq : 0 < t * q := mul_pos ht hq + have hsq : 0 < s * q := mul_pos (lt_trans ht hts) hq + have hstq : t * q < s * q := by + exact mul_lt_mul_of_pos_right hts hq + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using + (tsum_geometricWeight_one_le_of_monotone + (H := H) hmono hnonneg htq hstq (by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using hsum_t)) + +theorem self_le_tsum_geometricWeight_of_monotone {H : ℕ → ℝ} + (hmono : Monotone H) {s q : ℝ} (hsq : 0 < s * q) + (hsum : Summable (fun n : ℕ => geometricWeight s q n * H n)) : + H 0 ≤ ∑' n : ℕ, geometricWeight s q n * H n := by + have hsum' : + Summable (fun n : ℕ => geometricWeight (s * q) 1 n * H n) := by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using hsum + have hdecomp := + tsum_geometricWeight_one_eq_zero_add_tsum_rpow_neg_s_nat_succ_mul_sub + (H := H) (s := s * q) hsq hsum' + have htail_nonneg : + 0 ≤ + ∑' n : ℕ, + Real.rpow (3 : ℝ) (-(s * q) * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) := by + refine tsum_nonneg ?_ + intro n + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact sub_nonneg.mpr (hmono (Nat.le_succ n)) + have hdecomp' : + ∑' n : ℕ, geometricWeight s q n * H n = + H 0 + + ∑' n : ℕ, + Real.rpow (3 : ℝ) (-(s * q) * ((n + 1 : ℕ) : ℝ)) * (H (n + 1) - H n) := by + simpa [geometricWeight_eq_mul_one, mul_assoc, mul_left_comm, mul_comm] using hdecomp + linarith [htail_nonneg] + +private theorem rpow_le_rpow_tsum_mul_of_nonneg {f : ℕ → ℝ} {p : ℝ} + (hp : 1 ≤ p) (hf_nonneg : ∀ n, 0 ≤ f n) (hf_sum : Summable f) : + ∀ n, Real.rpow (f n) p ≤ Real.rpow (∑' k : ℕ, f k) (p - 1) * f n := by + let S : ℝ := ∑' k : ℕ, f k + have hterm_le : ∀ n, f n ≤ S := by + intro n + have hsingle : f n ≤ ∑ i ∈ Finset.range (n + 1), f i := by + exact Finset.single_le_sum (fun i _ => hf_nonneg i) (Finset.mem_range.mpr (Nat.lt_succ_self n)) + have hprefix : + ∑ i ∈ Finset.range (n + 1), f i ≤ S := by + simpa [S] using hf_sum.sum_le_tsum (Finset.range (n + 1)) + (fun i _ => hf_nonneg i) + exact hsingle.trans hprefix + intro n + have hpow_le : + Real.rpow (f n) (p - 1) ≤ Real.rpow S (p - 1) := by + refine Real.rpow_le_rpow (hf_nonneg n) (hterm_le n) ?_ + linarith + calc + Real.rpow (f n) p = Real.rpow (f n) ((p - 1) + 1) := by ring_nf + _ = Real.rpow (f n) (p - 1) * Real.rpow (f n) 1 := by + exact Real.rpow_add_of_nonneg (hf_nonneg n) (sub_nonneg.mpr hp) zero_le_one + _ = Real.rpow (f n) (p - 1) * f n := by simp + _ ≤ Real.rpow S (p - 1) * f n := by + exact mul_le_mul_of_nonneg_right hpow_le (hf_nonneg n) + +theorem summable_rpow_of_nonneg_of_one_le {f : ℕ → ℝ} {p : ℝ} + (hp : 1 ≤ p) (hf_nonneg : ∀ n, 0 ≤ f n) (hf_sum : Summable f) : + Summable (fun n => Real.rpow (f n) p) := by + let S : ℝ := ∑' k : ℕ, f k + have hscaled : Summable (fun n => Real.rpow S (p - 1) * f n) := hf_sum.mul_left _ + refine Summable.of_nonneg_of_le ?_ ?_ hscaled + · intro n + exact Real.rpow_nonneg (hf_nonneg n) p + · exact rpow_le_rpow_tsum_mul_of_nonneg hp hf_nonneg hf_sum + +theorem tsum_rpow_le_rpow_tsum_of_nonneg {f : ℕ → ℝ} {p : ℝ} + (hp : 1 ≤ p) (hf_nonneg : ∀ n, 0 ≤ f n) (hf_sum : Summable f) : + ∑' n, Real.rpow (f n) p ≤ Real.rpow (∑' n, f n) p := by + let S : ℝ := ∑' n, f n + have hS_nonneg : 0 ≤ S := by + dsimp [S] + exact tsum_nonneg hf_nonneg + have hrpow_sum : Summable (fun n => Real.rpow (f n) p) := + summable_rpow_of_nonneg_of_one_le hp hf_nonneg hf_sum + have hscaled : Summable (fun n => Real.rpow S (p - 1) * f n) := hf_sum.mul_left _ + have hle : + ∑' n, Real.rpow (f n) p ≤ ∑' n, Real.rpow S (p - 1) * f n := + Summable.tsum_le_tsum (rpow_le_rpow_tsum_mul_of_nonneg hp hf_nonneg hf_sum) hrpow_sum hscaled + calc + ∑' n, Real.rpow (f n) p ≤ ∑' n, Real.rpow S (p - 1) * f n := hle + _ = Real.rpow S (p - 1) * S := by + simpa [S] using (Summable.tsum_mul_left (Real.rpow S (p - 1)) hf_sum) + _ = Real.rpow S p := by + calc + Real.rpow S (p - 1) * S = Real.rpow S (p - 1) * Real.rpow S 1 := by + simp + _ = Real.rpow S ((p - 1) + 1) := by + symm + exact Real.rpow_add_of_nonneg hS_nonneg (sub_nonneg.mpr hp) zero_le_one + _ = Real.rpow S p := by ring_nf + +@[simp] theorem multiscale_ellipticity_LambdaSq_finite_eq {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) : + LambdaSq Q s (.finite q) a = LambdaSqFinite Q s q a := rfl + +@[simp] theorem multiscale_ellipticity_LambdaSq_infinity_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + LambdaSq Q s .infinity a = LambdaSqInfinity Q s a := rfl + +@[simp] theorem multiscale_ellipticity_lambdaSq_finite_eq {d : ℕ} + (Q : TriadicCube d) (s q : ℝ) (a : CoeffField d) : + lambdaSq Q s (.finite q) a = lambdaSqFinite Q s q a := rfl + +@[simp] theorem multiscale_ellipticity_lambdaSq_infinity_eq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (a : CoeffField d) : + lambdaSq Q s .infinity a = lambdaSqInfinity Q s a := rfl + +@[simp] theorem scaleResponseAtScale_finite_eq {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (p : ℝ) (a : CoeffField d) (a0 : Mat d) : + scaleResponseAtScale Q k (.finite p) a a0 = + Real.rpow + (finsetAverage (descendantsAtScale Q k) + (fun R => Real.rpow (normalizedBlockResponseMax R a a0) (p / 2))) + (1 / p) := rfl + +@[simp] theorem scaleResponseAtScale_infinity_eq {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (a : CoeffField d) (a0 : Mat d) : + scaleResponseAtScale Q k .infinity a a0 = + Real.rpow (maxDescendantNormalizedBlockResponseAtScale Q k a a0) (1 / 2) := rfl + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/GeometricOne.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/GeometricOne.lean new file mode 100644 index 0000000000..28a3ab1d39 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/GeometricOne.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.Basic + +/-! # Geometric One -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem geometricDiscount_nonneg {s q : ℝ} (hsq : 0 ≤ s * q) : + 0 ≤ geometricDiscount s q := by + unfold geometricDiscount + by_cases hzero : s * q = 0 + · simp [hzero] + · have hsq_pos : 0 < s * q := lt_of_le_of_ne hsq (by simpa [eq_comm] using hzero) + have hneg : -s * q < 0 := by nlinarith + have hpow_lt : Real.rpow (3 : ℝ) (-s * q) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) hneg + linarith + +theorem geometricDiscount_pos {s q : ℝ} (hsq : 0 < s * q) : + 0 < geometricDiscount s q := by + unfold geometricDiscount + have hneg : -s * q < 0 := by nlinarith + have hpow_lt : Real.rpow (3 : ℝ) (-s * q) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) hneg + linarith + +theorem geometricWeight_nonneg {s q : ℝ} (n : ℕ) (hsq : 0 ≤ s * q) : + 0 ≤ geometricWeight s q n := by + unfold geometricWeight + refine mul_nonneg (geometricDiscount_nonneg hsq) ?_ + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem geometricWeight_pos {s q : ℝ} (n : ℕ) (hsq : 0 < s * q) : + 0 < geometricWeight s q n := by + unfold geometricWeight + refine mul_pos (geometricDiscount_pos hsq) ?_ + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + +theorem summable_geometricWeight_one {s : ℝ} (hs : 0 < s) : + Summable (fun n : ℕ => geometricWeight s 1 n) := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hweight : + ∀ n : ℕ, geometricWeight s 1 n = geometricDiscount s 1 * r ^ n := by + intro n + rw [geometricWeight_one_eq] + calc + geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * (n : ℝ)) + = geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-s)) ^ n := by + congr 1 + calc + Real.rpow (3 : ℝ) (-s * (n : ℝ)) + = Real.rpow (3 : ℝ) ((-s) * (n : ℝ)) := by ring + _ = Real.rpow (Real.rpow (3 : ℝ) (-s)) (n : ℝ) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s) (n : ℝ)) + _ = (Real.rpow (3 : ℝ) (-s)) ^ n := by + exact Real.rpow_natCast (Real.rpow (3 : ℝ) (-s)) n + _ = geometricDiscount s 1 * r ^ n := by simp [r] + have hfun : + (fun n : ℕ => geometricWeight s 1 n) = fun n => geometricDiscount s 1 * r ^ n := by + funext n + exact hweight n + rw [hfun] + exact (summable_geometric_of_lt_one hr_nonneg hr_lt_one).mul_left (geometricDiscount s 1) + +theorem summable_geometricWeight_one_of_lt {H : ℕ → ℝ} + (hnonneg : ∀ n : ℕ, 0 ≤ H n) {t s : ℝ} (ht : 0 < t) (hts : t < s) + (hsum_t : Summable (fun n : ℕ => geometricWeight t 1 n * H n)) : + Summable (fun n : ℕ => geometricWeight s 1 n * H n) := by + let C : ℝ := geometricDiscount s 1 / geometricDiscount t 1 + have hs : 0 < s := lt_trans ht hts + have hdisc_t_pos : 0 < geometricDiscount t 1 := by + exact geometricDiscount_pos (by simpa using ht) + have hdisc_s_pos : 0 < geometricDiscount s 1 := by + exact geometricDiscount_pos (by simpa using hs) + have hscaled : Summable (fun n : ℕ => C * (geometricWeight t 1 n * H n)) := hsum_t.mul_left C + refine Summable.of_nonneg_of_le ?_ ?_ hscaled + · intro n + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs.le)) (hnonneg n) + · intro n + have hpow : + Real.rpow (3 : ℝ) (-s * (n : ℝ)) ≤ Real.rpow (3 : ℝ) (-t * (n : ℝ)) := by + refine Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (3 : ℝ)) ?_ + nlinarith + calc + geometricWeight s 1 n * H n + = geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-s * (n : ℝ)) * H n) := by + rw [geometricWeight_one_eq] + ring + _ ≤ geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-t * (n : ℝ)) * H n) := by + refine mul_le_mul_of_nonneg_left ?_ hdisc_s_pos.le + exact mul_le_mul_of_nonneg_right hpow (hnonneg n) + _ = C * (geometricWeight t 1 n * H n) := by + dsimp [C] + rw [geometricWeight_one_eq] + field_simp [hdisc_t_pos.ne'] + simp [mul_comm] + +theorem tsum_geometricWeight_one_eq_one {s : ℝ} (hs : 0 < s) : + ∑' n : ℕ, geometricWeight s 1 n = 1 := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hweight : + ∀ n : ℕ, geometricWeight s 1 n = geometricDiscount s 1 * r ^ n := by + intro n + rw [geometricWeight_one_eq] + calc + geometricDiscount s 1 * Real.rpow (3 : ℝ) (-s * (n : ℝ)) + = geometricDiscount s 1 * (Real.rpow (3 : ℝ) (-s)) ^ n := by + congr 1 + calc + Real.rpow (3 : ℝ) (-s * (n : ℝ)) + = Real.rpow (3 : ℝ) ((-s) * (n : ℝ)) := by ring + _ = Real.rpow (Real.rpow (3 : ℝ) (-s)) (n : ℝ) := by + simpa using (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s) (n : ℝ)) + _ = (Real.rpow (3 : ℝ) (-s)) ^ n := by + exact Real.rpow_natCast (Real.rpow (3 : ℝ) (-s)) n + _ = geometricDiscount s 1 * r ^ n := by simp [r] + calc + ∑' n : ℕ, geometricWeight s 1 n = ∑' n : ℕ, geometricDiscount s 1 * r ^ n := by + exact tsum_congr hweight + _ = geometricDiscount s 1 * ∑' n : ℕ, r ^ n := by rw [tsum_mul_left] + _ = geometricDiscount s 1 * (1 - r)⁻¹ := by + rw [tsum_geometric_of_lt_one hr_nonneg hr_lt_one] + _ = (1 - r) * (1 - r)⁻¹ := by + simp [r, geometricDiscount_one_eq] + _ = 1 := by + have hne : 1 - r ≠ 0 := by + linarith + simpa using (mul_inv_cancel₀ hne) + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometry.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometry.lean new file mode 100644 index 0000000000..d1360b8358 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Foundation/Geometry.lean @@ -0,0 +1,198 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation.GeometricOne + +/-! # Geometry -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem isFiniteMeasureVolumeMeasureOnCubeSet {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + let U : Set (Vec d) := cubeSet Q + let : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_cubeSet_lt_top Q⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) + infer_instance + +instance instIsFiniteMeasureVolumeMeasureOnCubeSet {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet Q + +noncomputable def fullBlockMatRowAbsSqBound {d : ℕ} (M : FullBlockMat d) : ℝ := + ∑ i, (∑ j, |M i j|) ^ 2 + +theorem abs_fullBlockVec_le_one_of_fullBlockVecNormSq_eq_one {d : ℕ} + {e : FullBlockVec d} (he : fullBlockVecNormSq e = 1) (i : BlockCoord d) : + |e i| ≤ 1 := by + have hnonneg : ∀ j : BlockCoord d, 0 ≤ e j ^ 2 := by + intro j + exact sq_nonneg (e j) + have hle : e i ^ 2 ≤ ∑ j, e j ^ 2 := by + simpa using + (Finset.single_le_sum (fun j _ => hnonneg j) (Finset.mem_univ i) : + e i ^ 2 ≤ ∑ j : BlockCoord d, e j ^ 2) + have hsquare : |e i| ^ 2 ≤ 1 := by + calc + |e i| ^ 2 = e i ^ 2 := by rw [sq_abs] + _ ≤ ∑ j, e j ^ 2 := hle + _ = 1 := by simpa [fullBlockVecNormSq] using he + nlinarith + +theorem fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one {d : ℕ} + (M : FullBlockMat d) {e : FullBlockVec d} (he : fullBlockVecNormSq e = 1) : + fullBlockVecNormSq (Matrix.mulVec M e) ≤ fullBlockMatRowAbsSqBound M := by + unfold fullBlockVecNormSq fullBlockMatRowAbsSqBound + refine Finset.sum_le_sum ?_ + intro i hi + have hcoord : + |Matrix.mulVec M e i| ≤ ∑ j, |M i j| := by + calc + |Matrix.mulVec M e i| = |∑ j, M i j * e j| := by + simp [Matrix.mulVec, dotProduct] + _ ≤ ∑ j, |M i j * e j| := by + simpa using + (Finset.abs_sum_le_sum_abs (s := Finset.univ) (f := fun j : BlockCoord d => M i j * e j)) + _ ≤ ∑ j, |M i j| := by + refine Finset.sum_le_sum ?_ + intro j hj + calc + |M i j * e j| = |M i j| * |e j| := by rw [abs_mul] + _ ≤ |M i j| * 1 := by + exact mul_le_mul_of_nonneg_left + (abs_fullBlockVec_le_one_of_fullBlockVecNormSq_eq_one he j) (abs_nonneg _) + _ = |M i j| := by ring + have hsquare : (Matrix.mulVec M e i) ^ 2 ≤ (∑ j, |M i j|) ^ 2 := by + have hrow_nonneg : 0 ≤ ∑ j, |M i j| := by positivity + have habs : + |Matrix.mulVec M e i| ≤ |(∑ j, |M i j|)| := by + rw [abs_of_nonneg hrow_nonneg] + exact hcoord + have hsquareAbs : |Matrix.mulVec M e i| ^ 2 ≤ |(∑ j, |M i j|)| ^ 2 := by + simpa [pow_two] using + (mul_le_mul habs habs (abs_nonneg _) (abs_nonneg _)) + simpa [sq_abs, abs_of_nonneg hrow_nonneg] using hsquareAbs + exact hsquare + +theorem blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq {d : ℕ} (x : FullBlockVec d) : + blockVecDot (ofFullBlockVec x) (ofFullBlockVec x) = fullBlockVecNormSq x := by + rw [← dotProduct_toFullBlockVec (ofFullBlockVec x) (ofFullBlockVec x)] + simp [fullBlockVecNormSq, dotProduct, pow_two] + +theorem descendant_scale_le_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + k ≤ Q.scale := by + by_contra hk + exact (not_mem_descendantsAtScale_of_lt (Q := Q) (R := R) (k := k) (lt_of_not_ge hk)) hR + +theorem descendant_scale_eq_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + R.scale = k := by + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hdepth := scale_eq_sub_of_mem_descendantsAtScale hk hR + have hnonneg : 0 ≤ Q.scale - k := sub_nonneg.mpr hk + calc + R.scale = Q.scale - (Int.toNat (Q.scale - k) : ℕ) := hdepth + _ = Q.scale - (Q.scale - k) := by rw [Int.toNat_of_nonneg hnonneg] + _ = k := sub_sub_cancel _ _ + +theorem openCubeSet_subset_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + openCubeSet R ⊆ openCubeSet Q := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact openCubeSet_subset_of_mem_descendantsAtDepth hR + +theorem mem_descendantsAtDepth_add_local {d : ℕ} {Q R S : TriadicCube d} {m n : ℕ} + (hR : R ∈ descendantsAtDepth Q m) (hS : S ∈ descendantsAtDepth R n) : + S ∈ descendantsAtDepth Q (m + n) := by + induction n generalizing R S with + | zero => + rw [descendantsAtDepth_zero] at hS + simpa [Finset.mem_singleton.mp hS] + | succ n ih => + rw [mem_descendantsAtDepth_succ_iff] at hS + rcases hS with ⟨T, hT, hchild⟩ + have hTQ : T ∈ descendantsAtDepth Q (m + n) := ih hR hT + have hSQ : S ∈ descendantsAtDepth Q ((m + n) + 1) := by + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨T, hTQ, hchild⟩ + simpa [Nat.add_assoc, Nat.add_left_comm, Nat.add_comm] using hSQ + +theorem mem_descendantsAtScale_trans {d : ℕ} {Q R S : TriadicCube d} {k l : ℤ} + (hR : R ∈ descendantsAtScale Q k) (hS : S ∈ descendantsAtScale R l) : + S ∈ descendantsAtScale Q l := by + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hlR : l ≤ R.scale := descendant_scale_le_of_mem_descendantsAtScale hS + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hlk : l ≤ k := by simpa [hRscale] using hlR + have hlQ : l ≤ Q.scale := le_trans hlk hk + rw [descendantsAtScale_eq_descendantsAtDepth Q hlQ] + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + rw [descendantsAtScale_eq_descendantsAtDepth R hlR] at hS + have hdepth : + Int.toNat (Q.scale - l) = + Int.toNat (Q.scale - k) + Int.toNat (R.scale - l) := by + rw [hRscale] + have hk0 : 0 ≤ Q.scale - k := sub_nonneg.mpr hk + have hlk0 : 0 ≤ k - l := sub_nonneg.mpr hlk + have hsum : Q.scale - l = (Q.scale - k) + (k - l) := by ring + rw [hsum, Int.toNat_add hk0 hlk0] + rw [hdepth] + exact mem_descendantsAtDepth_add_local hR hS + +theorem OpenCubeDescendantDeterministicCoarseData.of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {a : CoeffField d} {l : ℤ} + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hlQ : l ≤ Q.scale) (hR : R ∈ descendantsAtScale Q l) : + OpenCubeDescendantDeterministicCoarseData R a := by + intro j hj S hS + have hRscale : R.scale = l := descendant_scale_eq_of_mem_descendantsAtScale hR + have hjQ : j ≤ Q.scale := by + exact le_trans (by simpa [hRscale] using hj) hlQ + exact hData j hjQ S (mem_descendantsAtScale_trans hR hS) + +theorem maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k l : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantBBlockNormAtScale R l a ≤ maxDescendantBBlockNormAtScale Q l a := by + unfold maxDescendantBBlockNormAtScale finsetSsup + have hne : + ((fun S => coarseBBlockNorm S a) '' (↑(descendantsAtScale R l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty R hl with ⟨S, hS⟩ + exact ⟨coarseBBlockNorm S a, ⟨S, hS, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨S, hS, rfl⟩ + have hBdd : + BddAbove ((fun T => coarseBBlockNorm T a) '' (↑(descendantsAtScale Q l) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun T => coarseBBlockNorm T a)).bddAbove + exact le_csSup hBdd ⟨S, mem_descendantsAtScale_trans hR hS, rfl⟩ + +theorem maxDescendantSigmaStarInvNormAtScale_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k l : ℤ} (a : CoeffField d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantSigmaStarInvNormAtScale R l a ≤ maxDescendantSigmaStarInvNormAtScale Q l a := by + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hne : + ((fun S => coarseSigmaStarInvBlockNorm S a) '' (↑(descendantsAtScale R l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty R hl with ⟨S, hS⟩ + exact ⟨coarseSigmaStarInvBlockNorm S a, ⟨S, hS, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨S, hS, rfl⟩ + have hBdd : + BddAbove + ((fun T => coarseSigmaStarInvBlockNorm T a) '' (↑(descendantsAtScale Q l) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun T => coarseSigmaStarInvBlockNorm T a)).bddAbove + exact le_csSup hBdd ⟨S, mem_descendantsAtScale_trans hR hS, rfl⟩ + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/HomogenizationError.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/HomogenizationError.lean new file mode 100644 index 0000000000..ede2aa160b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/HomogenizationError.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Response + +/-! # Homogenization Error -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# q = 1 homogenization-error theorems +-/ + +theorem homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (a0 : Mat d) (s : ℝ) + (hs : 0 ≤ s) (hR : R ∈ descendantsAtScale Q k) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + let h : ℕ := Int.toNat (Q.scale - k) + let fQ : ℕ → ℝ := fun n => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + let fR : ℕ → ℝ := fun n => + geometricWeight s 1 n * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0 + let factor : ℝ := Real.rpow (3 : ℝ) (s * (h : ℝ)) + have hk : k ≤ Q.scale := descendant_scale_le_of_mem_descendantsAtScale hR + have hh : (h : ℤ) = Q.scale - k := by + dsimp [h] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hRscale : R.scale = k := descendant_scale_eq_of_mem_descendantsAtScale hR + have hQnonneg : ∀ n : ℕ, 0 ≤ fQ n := by + intro n + dsimp [fQ] + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) + (scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0) + have htailSummable : Summable (fun n : ℕ => fQ (n + h)) := (summable_nat_add_iff h).2 hsum + have hfactorNonneg : 0 ≤ factor := by + dsimp [factor] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hterm : + ∀ n : ℕ, fR n ≤ factor * fQ (n + h) := by + intro n + have hscale : + R.scale - (n : ℤ) = Q.scale - ((n + h : ℕ) : ℤ) := by + rw [hRscale, Nat.cast_add, hh] + ring + have hresp : + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0 ≤ + scaleResponseAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) .infinity a a0 := by + have hl : R.scale - (n : ℤ) ≤ R.scale := sub_le_self _ (by exact_mod_cast Nat.zero_le n) + simpa [hscale] using + (scaleResponseAtScale_infinity_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) (l := R.scale - (n : ℤ)) a a0 hR hl) + calc + fR n = + factor * + (geometricWeight s 1 (n + h) * + scaleResponseAtScale R (R.scale - (n : ℤ)) .infinity a a0) := by + dsimp [fR, factor] + rw [geometricWeight_one_shift (s := s) h n] + simp [mul_left_comm, mul_comm] + _ ≤ factor * + (geometricWeight s 1 (n + h) * + scaleResponseAtScale Q (Q.scale - ((n + h : ℕ) : ℤ)) .infinity a a0) := by + refine mul_le_mul_of_nonneg_left ?_ hfactorNonneg + exact mul_le_mul_of_nonneg_left hresp + (geometricWeight_nonneg (n + h) (by simpa using hs)) + _ = factor * fQ (n + h) := by + dsimp [fQ] + have hRnonneg : ∀ n : ℕ, 0 ≤ fR n := by + intro n + dsimp [fR] + exact mul_nonneg (geometricWeight_nonneg n (by simpa using hs)) + (scaleResponseAtScale_infinity_nonneg R + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0) + have hscaledNonneg : ∀ n : ℕ, 0 ≤ factor * fQ (n + h) := by + intro n + exact mul_nonneg hfactorNonneg (hQnonneg (n + h)) + have hscaledSummable : Summable (fun n : ℕ => factor * fQ (n + h)) := + htailSummable.mul_left factor + have hRsummable : Summable fR := + Summable.of_nonneg_of_le hRnonneg hterm hscaledSummable + have hsumLe : + ∑' n : ℕ, fR n ≤ ∑' n : ℕ, factor * fQ (n + h) := + Summable.tsum_le_tsum hterm hRsummable hscaledSummable + have htailLe : + ∑' n : ℕ, fQ (n + h) ≤ ∑' n : ℕ, fQ n := by + have hsplit := hsum.sum_add_tsum_nat_add h + have hprefixNonneg : 0 ≤ ∑ i ∈ Finset.range h, fQ i := by + exact Finset.sum_nonneg (fun i _ => hQnonneg i) + linarith + calc + HomogenizationErrorOnCube R s .infinity (.finite 1) a a0 = ∑' n : ℕ, fR n := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + _ ≤ ∑' n : ℕ, factor * fQ (n + h) := hsumLe + _ = factor * ∑' n : ℕ, fQ (n + h) := by + simpa using (Summable.tsum_mul_left factor htailSummable) + _ ≤ factor * ∑' n : ℕ, fQ n := by + exact mul_le_mul_of_nonneg_left htailLe hfactorNonneg + _ = factor * HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + +theorem homogenizationErrorOnCube_infinity_one_descendantsAtScale_le {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) (hs : 0 ≤ s) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + finsetSsup (descendantsAtScale Q k) + (fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + unfold finsetSsup + have hne : + ((fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) '' + (↑(descendantsAtScale Q k) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact ⟨HomogenizationErrorOnCube R s .infinity (.finite 1) a a0, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + exact homogenizationErrorOnCube_infinity_one_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a a0 s hs hR hsum + +theorem homogenizationErrorOnCube_infinity_one_basic_properties_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {t s : ℝ} {lam Lam : ℝ} (hs : 0 < s) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ∧ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ≤ + HomogenizationErrorOnCube Q t .infinity (.finite 1) a a0 ∧ + ∀ {k : ℤ}, k ≤ Q.scale → + finsetSsup (descendantsAtScale Q k) + (fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + refine ⟨?_, ?_, ?_⟩ + · exact + scaleResponseAtScale_infinity_self_le_homogenizationErrorOnCube_infinity_one_of_isEllipticFieldOn + Q a a0 s hs hEll hsum_s + · exact + homogenizationErrorOnCube_infinity_one_le_of_lt_of_isEllipticFieldOn + Q a a0 ht hts hEll hsum_t + · intro k hk + exact homogenizationErrorOnCube_infinity_one_descendantsAtScale_le + Q hk a a0 s hs.le hsum_s + +theorem oneCubeDefect_rpow_half_sSup_le_homogenizationErrorOnCube_infinity_one_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {s : ℝ} {lam Lam : ℝ} (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + Real.rpow + (sSup + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + let P := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + m = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) }) (1 / 2 : ℝ) ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + simpa [scaleResponseAtScale_infinity_self_eq_rpow_half_sSup_half_responseJ_adjoint_sum_of_isEllipticFieldOn + Q a a0 hEll] using + (scaleResponseAtScale_infinity_self_le_homogenizationErrorOnCube_infinity_one_of_isEllipticFieldOn + Q a a0 s hs hEll hsum_s) + +theorem homogenizationErrorOnCube_infinity_one_note_basic_properties_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {t s : ℝ} {lam Lam : ℝ} (hs : 0 < s) (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hsum_s : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + Real.rpow + (sSup + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + let P := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + m = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) }) (1 / 2 : ℝ) ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ∧ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ≤ + HomogenizationErrorOnCube Q t .infinity (.finite 1) a a0 ∧ + ∀ {k : ℤ}, k ≤ Q.scale → + finsetSsup (descendantsAtScale Q k) + (fun R => HomogenizationErrorOnCube R s .infinity (.finite 1) a a0) ≤ + Real.rpow (3 : ℝ) (s * (Int.toNat (Q.scale - k) : ℝ)) * + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + have hbasic := + homogenizationErrorOnCube_infinity_one_basic_properties_of_isEllipticFieldOn + Q a a0 hs ht hts hEll hsum_s hsum_t + refine ⟨?_, hbasic.2.1, ?_⟩ + · exact + oneCubeDefect_rpow_half_sSup_le_homogenizationErrorOnCube_infinity_one_of_isEllipticFieldOn + Q a a0 hs hEll hsum_s + · intro k hk + exact hbasic.2.2 hk + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Response.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Response.lean new file mode 100644 index 0000000000..4b3aec94b8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Response.lean @@ -0,0 +1,642 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge + +/-! # Response -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# Response and scale-response infrastructure +-/ + +theorem normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) : + normalizedBlockResponseMax R a a0 ≤ maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSsup + have hBdd : + BddAbove + ((fun S => normalizedBlockResponseMax S a a0) '' (↑(descendantsAtScale Q k) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun S => normalizedBlockResponseMax S a a0)).bddAbove + exact le_csSup hBdd ⟨R, hR, rfl⟩ + +theorem normalizedBlockResponseValueSet_nonempty {d : ℕ} [NeZero d] + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) : + (normalizedBlockResponseValueSet Q a a0).Nonempty := by + classical + have hd : 0 < d := Nat.pos_of_ne_zero (NeZero.ne d) + let i0 : BlockCoord d := Sum.inl ⟨0, hd⟩ + let e : FullBlockVec d := Pi.single i0 1 + refine ⟨BlockJ (cubeSet Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + a, ?_⟩ + refine ⟨e, ?_, rfl⟩ + unfold fullBlockVecNormSq e + rw [Fintype.sum_eq_single i0] + · simp + · intro b hb + simp [hb] + +theorem normalizedBlockResponseValueSet_bddAbove_of_isEllipticFieldOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + BddAbove (normalizedBlockResponseValueSet Q a a0) := by + let MInv := constantFullBlockMatrixInvSqrt a0 + let MSqrt := constantFullBlockMatrixSqrt a0 + let B : ℝ := + (lam / (1 + 2 * Lam ^ 2))⁻¹ * fullBlockMatRowAbsSqBound MSqrt + + (lam / (1 + 2 * Lam ^ 2))⁻¹ * + blockMatrixOfCoeffNormSqBound lam Lam * fullBlockMatRowAbsSqBound MInv + refine ⟨B, ?_⟩ + rintro m ⟨e, he, rfl⟩ + let xQ : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hxQ : xQ ∈ cubeSet Q := by + intro i + constructor <;> dsimp [xQ] + · have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : 0 < (3 : ℝ)) Q.scale + nlinarith + · have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : 0 < (3 : ℝ)) Q.scale + nlinarith + rcases hEll.2 xQ hxQ with ⟨hlam_pos, hlamLam, -, -⟩ + have hvolQ : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hcoeff_nonneg : 0 ≤ (lam / (1 + 2 * Lam ^ 2))⁻¹ := by + have hden_pos : 0 < 1 + 2 * Lam ^ 2 := by positivity + have hfrac_pos : 0 < lam / (1 + 2 * Lam ^ 2) := by + exact div_pos hlam_pos hden_pos + positivity + have hbound_nonneg : 0 ≤ blockMatrixOfCoeffNormSqBound lam Lam := by + unfold blockMatrixOfCoeffNormSqBound + positivity + let P := ofFullBlockVec (Matrix.mulVec MInv e) + let Q' := ofFullBlockVec (Matrix.mulVec MSqrt e) + have hP : + blockVecDot P P ≤ fullBlockMatRowAbsSqBound MInv := by + dsimp [P, MInv] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + have hQ : + blockVecDot Q' Q' ≤ fullBlockMatRowAbsSqBound MSqrt := by + dsimp [Q', MSqrt] + rw [blockVecDot_ofFullBlockVec_self_eq_fullBlockVecNormSq] + exact fullBlockVecNormSq_mulVec_le_rowAbsSqBound_of_eq_one _ he + calc + BlockJ (cubeSet Q) P Q' a ≤ blockResponsePlainUpperBound lam Lam P Q' := by + exact blockJ_le_plainUpperBound_of_isEllipticFieldOn + (a := a) (U := cubeSet Q) (measurableSet_cubeSet Q) hEll hvolQ P Q' + _ ≤ B := by + let c : ℝ := (lam / (1 + 2 * Lam ^ 2))⁻¹ + have htermQ : + c * blockVecDot Q' Q' ≤ c * fullBlockMatRowAbsSqBound MSqrt := by + exact mul_le_mul_of_nonneg_left hQ hcoeff_nonneg + have htermP : + c * blockMatrixOfCoeffNormSqBound lam Lam * blockVecDot P P ≤ + c * blockMatrixOfCoeffNormSqBound lam Lam * fullBlockMatRowAbsSqBound MInv := by + exact mul_le_mul_of_nonneg_left hP (mul_nonneg hcoeff_nonneg hbound_nonneg) + dsimp [B] + unfold blockResponsePlainUpperBound + dsimp [c] at htermQ htermP + linarith + +theorem ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube_reproved {d : ℕ} [NeZero d] + (Q : TriadicCube d) (p q : Vec d) (a : CoeffField d) : + ResponseJ (cubeSet Q) p q a = ResponseJ (openCubeSet Q) p q a := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + have hcube : + cubeSet Q = translateSet z (cubeSet (originCube d Q.scale)) := by + simpa [z] using! cubeSet_eq_translateSet_originCube_of_triadicCube Q + have hopen : + openCubeSet Q = translateSet z (openCubeSet (originCube d Q.scale)) := by + simpa [z] using! openCubeSet_eq_translateSet_originCube_of_triadicCube Q + calc + ResponseJ (cubeSet Q) p q a + = ResponseJ (translateSet z (cubeSet (originCube d Q.scale))) p q a := by + rw [hcube] + _ = ResponseJ (cubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_translateSet_eq_translateCoeffField z + (cubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet (originCube d Q.scale)) p q (translateCoeffField z a) := by + exact ResponseJ_cubeSet_originCube_eq_openCubeSet + (d := d) (n := Q.scale) p q (translateCoeffField z a) + _ = ResponseJ (translateSet z (openCubeSet (originCube d Q.scale))) p q a := by + symm + exact ResponseJ_translateSet_eq_translateCoeffField z + (openCubeSet (originCube d Q.scale)) p q a + _ = ResponseJ (openCubeSet Q) p q a := by + rw [hopen] + +theorem normalizedBlockResponseValueSet_eq_half_responseJ_adjoint_sum_set_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + normalizedBlockResponseValueSet Q a a0 = + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + let P := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + m = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) } := by + ext m + constructor + · rintro ⟨e, he, rfl⟩ + let P := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + have hvol : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + refine ⟨e, he, ?_⟩ + dsimp [P, Q'] + simpa using + (blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) (U := cubeSet Q) (measurableSet_cubeSet Q) hEll hvol + (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1)) + · rintro ⟨e, he, hm⟩ + refine ⟨e, he, ?_⟩ + let P := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + have hvol : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + dsimp [P, Q'] at hm ⊢ + rw [blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) (U := cubeSet Q) (measurableSet_cubeSet Q) hEll hvol + (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1)] + exact hm + +theorem normalizedBlockResponseMax_eq_sSup_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + normalizedBlockResponseMax Q a a0 = + sSup + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + let P := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + m = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) } := by + unfold normalizedBlockResponseMax + rw [normalizedBlockResponseValueSet_eq_half_responseJ_adjoint_sum_set_of_isEllipticFieldOn + Q a a0 hEll] + +theorem scaleResponseAtScale_infinity_self_eq_rpow_half_sSup_half_responseJ_adjoint_sum_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + scaleResponseAtScale Q Q.scale .infinity a a0 = + Real.rpow + (sSup + { m | ∃ e : FullBlockVec d, fullBlockVecNormSq e = 1 ∧ + let P := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := + ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + m = + (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) }) (1 / 2 : ℝ) := by + rw [scaleResponseAtScale_infinity_self_eq, + normalizedBlockResponseMax_eq_sSup_half_responseJ_adjoint_sum_of_isEllipticFieldOn + Q a a0 hEll] + +theorem normalizedBlockResponseMax_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) : + 0 ≤ normalizedBlockResponseMax Q a a0 := by + unfold normalizedBlockResponseMax + refine Real.sSup_nonneg ?_ + rintro x ⟨e, -, rfl⟩ + exact blockJ_nonneg + (cubeSet Q) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e)) + (ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e)) + a + +theorem maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k l : ℤ} (a : CoeffField d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + maxDescendantNormalizedBlockResponseAtScale R l a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q l a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSsup + have hne : + ((fun S => normalizedBlockResponseMax S a a0) '' + (↑(descendantsAtScale R l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty R hl with ⟨S, hS⟩ + exact ⟨normalizedBlockResponseMax S a a0, ⟨S, hS, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨S, hS, rfl⟩ + have hBdd : + BddAbove + ((fun T => normalizedBlockResponseMax T a a0) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))) := by + exact ((Set.toFinite _).image (fun T => normalizedBlockResponseMax T a a0)).bddAbove + exact le_csSup hBdd ⟨S, mem_descendantsAtScale_trans hR hS, rfl⟩ + +theorem normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + normalizedBlockResponseMax Q a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + classical + let := isFiniteMeasureVolumeMeasureOnCubeSet Q + let j : ℕ := Int.toNat (Q.scale - k) + have hj : (j : ℤ) = Q.scale - k := by + dsimp [j] + exact Int.toNat_of_nonneg (sub_nonneg.mpr hk) + have hEllOpen : + IsEllipticFieldOn lam Lam (openCubeSet Q) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet Q) + (openCubeSet_subset_cubeSet Q) + have hEllOpenAdj : + IsEllipticFieldOn lam Lam (openCubeSet Q) (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEllOpen + have hvolQ : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + unfold normalizedBlockResponseMax + refine csSup_le (normalizedBlockResponseValueSet_nonempty Q a a0) ?_ + rintro x ⟨e, he, rfl⟩ + let P := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixInvSqrt a0) e) + let Q' := ofFullBlockVec (Matrix.mulVec (constantFullBlockMatrixSqrt a0) e) + let F : TriadicCube d → ℝ := fun R => + ResponseJ (openCubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) a + let G : TriadicCube d → ℝ := fun R => + ResponseJ (openCubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) (Homogenization.adjointCoeffField a) + have hresp : + BlockJ (cubeSet Q) P Q' a ≤ + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + have hrespF : + ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a ≤ + descendantsAverage Q j F := by + calc + ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + = ResponseJ (openCubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a := by + exact ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (P.1 - Q'.2) (Q'.1 - P.2) a + _ ≤ descendantsAverage Q j F := by + exact responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q a hEllOpen (P.1 - Q'.2) (Q'.1 - P.2) + have hrespG : + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) (Homogenization.adjointCoeffField a) ≤ + descendantsAverage Q j G := by + calc + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) (Homogenization.adjointCoeffField a) + = + ResponseJ (openCubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) := by + exact ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube Q + (Q'.2 + P.1) (Q'.1 + P.2) (Homogenization.adjointCoeffField a) + _ ≤ descendantsAverage Q j G := by + exact responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + j Q (Homogenization.adjointCoeffField a) hEllOpenAdj + (Q'.2 + P.1) (Q'.1 + P.2) + have hcombine : + (1 / 2 : ℝ) * descendantsAverage Q j F + (1 / 2 : ℝ) * descendantsAverage Q j G = + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + calc + (1 / 2 : ℝ) * descendantsAverage Q j F + (1 / 2 : ℝ) * descendantsAverage Q j G + = descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R) + + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * G R) := by + rw [descendantsAverage_smul, descendantsAverage_smul] + _ = descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := by + symm + exact descendantsAverage_add Q j + (fun R => (1 / 2 : ℝ) * F R) (fun R => (1 / 2 : ℝ) * G R) + calc + BlockJ (cubeSet Q) P Q' a + ≤ (1 / 2 : ℝ) * ResponseJ (cubeSet Q) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet Q) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) := by + exact blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn + (a := a) (U := cubeSet Q) (measurableSet_cubeSet Q) hEll hvolQ + (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1) |>.le + _ ≤ (1 / 2 : ℝ) * descendantsAverage Q j F + (1 / 2 : ℝ) * descendantsAverage Q j G := by + linarith + _ = descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) := hcombine + have hpointwise : + ∀ R ∈ descendantsAtDepth Q j, + (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R ≤ normalizedBlockResponseMax R a a0 := by + intro R hR + have hRk : R ∈ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using hR + let := isFiniteMeasureVolumeMeasureOnCubeSet R + have hEllR : + IsEllipticFieldOn lam Lam (cubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtScale hk hRk) + have hvolR : (MeasureTheory.volume (cubeSet R)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos R).ne' + have hblock : + (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R ≤ BlockJ (cubeSet R) P Q' a := by + calc + (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R + = + (1 / 2 : ℝ) * ResponseJ (cubeSet R) (P.1 - Q'.2) (Q'.1 - P.2) a + + (1 / 2 : ℝ) * + ResponseJ (cubeSet R) (Q'.2 + P.1) (Q'.1 + P.2) + (Homogenization.adjointCoeffField a) := by + rw [ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R + (P.1 - Q'.2) (Q'.1 - P.2) a, + ResponseJ_cubeSet_eq_openCubeSet_of_triadicCube R + (Q'.2 + P.1) (Q'.1 + P.2) (Homogenization.adjointCoeffField a)] + _ ≤ BlockJ (cubeSet R) P Q' a := by + exact half_responseJ_adjoint_sum_le_blockJ_of_isEllipticFieldOn + (a := a) (U := cubeSet R) (measurableSet_cubeSet R) hEllR hvolR + (p := P.1) (pStar := Q'.2) (q := P.2) (qStar := Q'.1) + have hmem : BlockJ (cubeSet R) P Q' a ∈ normalizedBlockResponseValueSet R a a0 := by + refine ⟨e, he, ?_⟩ + dsimp [P, Q'] + exact le_trans hblock (by + unfold normalizedBlockResponseMax + exact le_csSup + (normalizedBlockResponseValueSet_bddAbove_of_isEllipticFieldOn + R a a0 hEllR) hmem) + have havg : + descendantsAverage Q j (fun R => (1 / 2 : ℝ) * F R + (1 / 2 : ℝ) * G R) ≤ + descendantsAverage Q j (fun R => normalizedBlockResponseMax R a a0) := by + unfold descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · refine Finset.sum_le_sum ?_ + intro R hR + exact hpointwise R hR + · positivity + have hmax : + descendantsAverage Q j (fun R => normalizedBlockResponseMax R a a0) ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + simpa [j] using + (descendantsAverage_le_finsetSsup Q j (fun R => normalizedBlockResponseMax R a a0)) + exact le_trans hresp (le_trans havg hmax) + +theorem maxDescendantNormalizedBlockResponseAtScale_le_of_le_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + maxDescendantNormalizedBlockResponseAtScale Q l a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + unfold maxDescendantNormalizedBlockResponseAtScale finsetSsup + have hne : + ((fun R => normalizedBlockResponseMax R a a0) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hlQ with ⟨R, hR⟩ + exact ⟨normalizedBlockResponseMax R a a0, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hRscale : R.scale = l := descendant_scale_eq_of_mem_descendantsAtScale hR + have hkR : k ≤ R.scale := by + simpa [hRscale] using hkl + have hEllR : + IsEllipticFieldOn lam Lam (cubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtScale hlQ hR) + have hRle : + normalizedBlockResponseMax R a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale R k a a0 := + normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale_of_isEllipticFieldOn + (Q := R) (k := k) hkR a a0 hEllR + have hRQ : + maxDescendantNormalizedBlockResponseAtScale R k a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + exact maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := l) (l := k) a a0 hR hkR + exact le_trans hRle hRQ + +theorem maxDescendantBBlockNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + maxDescendantBBlockNormAtScale Q l a ≤ maxDescendantBBlockNormAtScale Q k a := by + unfold maxDescendantBBlockNormAtScale finsetSsup + have hne : + ((fun R => coarseBBlockNorm R a) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hlQ with ⟨R, hR⟩ + exact ⟨coarseBBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hRscale : R.scale = l := descendant_scale_eq_of_mem_descendantsAtScale hR + have hkR : k ≤ R.scale := by + simpa [hRscale] using hkl + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hlQ hR) + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + hData.of_mem_descendantsAtScale hlQ hR + have hRle : + coarseBBlockNorm R a ≤ maxDescendantBBlockNormAtScale R k a := + coarseBBlockNorm_le_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) (k := k) hkR a hEllR hDataR + have hRQ : + maxDescendantBBlockNormAtScale R k a ≤ maxDescendantBBlockNormAtScale Q k a := by + exact maxDescendantBBlockNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := l) (l := k) a hR hkR + exact le_trans hRle hRQ + +theorem maxDescendantSigmaStarInvNormAtScale_le_of_le_of_isEllipticFieldOn_of_isSigmaCoarse + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) : + maxDescendantSigmaStarInvNormAtScale Q l a ≤ + maxDescendantSigmaStarInvNormAtScale Q k a := by + unfold maxDescendantSigmaStarInvNormAtScale finsetSsup + have hne : + ((fun R => coarseSigmaStarInvBlockNorm R a) '' + (↑(descendantsAtScale Q l) : Set (TriadicCube d))).Nonempty := by + rcases descendantsAtScale_nonempty Q hlQ with ⟨R, hR⟩ + exact ⟨coarseSigmaStarInvBlockNorm R a, ⟨R, hR, rfl⟩⟩ + refine csSup_le hne ?_ + rintro x ⟨R, hR, rfl⟩ + have hRscale : R.scale = l := descendant_scale_eq_of_mem_descendantsAtScale hR + have hkR : k ≤ R.scale := by + simpa [hRscale] using hkl + have hEllR : + IsEllipticFieldOn lam Lam (openCubeSet R) a := + IsEllipticFieldOn.mono hEll (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtScale hlQ hR) + have hDataR : OpenCubeDescendantDeterministicCoarseData R a := + hData.of_mem_descendantsAtScale hlQ hR + have hRle : + coarseSigmaStarInvBlockNorm R a ≤ maxDescendantSigmaStarInvNormAtScale R k a := + coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := R) (k := k) hkR a hEllR hDataR + have hRQ : + maxDescendantSigmaStarInvNormAtScale R k a ≤ + maxDescendantSigmaStarInvNormAtScale Q k a := by + exact maxDescendantSigmaStarInvNormAtScale_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := l) (l := k) a hR hkR + exact le_trans hRle hRQ + +theorem maxDescendantBBlockNormAtScale_nonneg {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) : + 0 ≤ maxDescendantBBlockNormAtScale Q k a := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact le_trans (coarseBBlockNorm_nonneg R a) + (coarseBBlockNorm_le_maxDescendantBBlockNormAtScale a hR) + +theorem maxDescendantSigmaStarInvNormAtScale_nonneg {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) : + 0 ≤ maxDescendantSigmaStarInvNormAtScale Q k a := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact le_trans (coarseSigmaStarInvBlockNorm_nonneg R a) + (coarseSigmaStarInvBlockNorm_le_maxDescendantSigmaStarInvNormAtScale a hR) + +theorem maxDescendantNormalizedBlockResponseAtScale_nonneg {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (a0 : Mat d) : + 0 ≤ maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + rcases descendantsAtScale_nonempty Q hk with ⟨R, hR⟩ + exact le_trans (normalizedBlockResponseMax_nonneg R a a0) + (normalizedBlockResponseMax_le_maxDescendantNormalizedBlockResponseAtScale a a0 hR) + +theorem scaleResponseAtScale_infinity_nonneg {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) (a : CoeffField d) (a0 : Mat d) : + 0 ≤ scaleResponseAtScale Q k .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq] + exact Real.rpow_nonneg + (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hk a a0) _ + +theorem scaleResponseAtScale_infinity_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k l : ℤ} (a : CoeffField d) (a0 : Mat d) + (hR : R ∈ descendantsAtScale Q k) (hl : l ≤ R.scale) : + scaleResponseAtScale R l .infinity a a0 ≤ scaleResponseAtScale Q l .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, scaleResponseAtScale_infinity_eq] + refine Real.rpow_le_rpow + (maxDescendantNormalizedBlockResponseAtScale_nonneg R hl a a0) + (maxDescendantNormalizedBlockResponseAtScale_le_of_mem_descendantsAtScale a a0 hR hl) ?_ + norm_num + +theorem scaleResponseAtScale_infinity_le_of_le_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k l : ℤ} + (hkl : k ≤ l) (hlQ : l ≤ Q.scale) (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + scaleResponseAtScale Q l .infinity a a0 ≤ + scaleResponseAtScale Q k .infinity a a0 := by + rw [scaleResponseAtScale_infinity_eq, scaleResponseAtScale_infinity_eq] + refine Real.rpow_le_rpow + (maxDescendantNormalizedBlockResponseAtScale_nonneg Q hlQ a a0) + (maxDescendantNormalizedBlockResponseAtScale_le_of_le_of_isEllipticFieldOn + (Q := Q) (k := k) (l := l) hkl hlQ a a0 hEll) ?_ + norm_num + +theorem scaleResponseAtScale_infinity_self_le_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) + (a : CoeffField d) (a0 : Mat d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + scaleResponseAtScale Q k .infinity a a0 := by + rw [scaleResponseAtScale_infinity_self_eq, scaleResponseAtScale_infinity_eq] + refine Real.rpow_le_rpow (normalizedBlockResponseMax_nonneg Q a a0) ?_ ?_ + · have hmax : + maxDescendantNormalizedBlockResponseAtScale Q Q.scale a a0 ≤ + maxDescendantNormalizedBlockResponseAtScale Q k a a0 := by + exact maxDescendantNormalizedBlockResponseAtScale_le_of_le_of_isEllipticFieldOn + (Q := Q) (k := k) (l := Q.scale) hk le_rfl a a0 + hEll + simpa [maxDescendantNormalizedBlockResponseAtScale_self] using hmax + · norm_num + +theorem scaleResponseAtScale_infinity_self_le_homogenizationErrorOnCube_infinity_one_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + (s : ℝ) {lam Lam : ℝ} (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 := by + let c : ℝ := scaleResponseAtScale Q Q.scale .infinity a a0 + let g : ℕ → ℝ := fun n => geometricWeight s 1 n * c + let f : ℕ → ℝ := fun n => + geometricWeight s 1 n * scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 + have hgSummable : Summable g := by + dsimp [g] + exact (summable_geometricWeight_one hs).mul_right c + have hterm : ∀ n : ℕ, g n ≤ f n := by + intro n + have hk : Q.scale - (n : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le n) + have hresp : + scaleResponseAtScale Q Q.scale .infinity a a0 ≤ + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0 := by + exact scaleResponseAtScale_infinity_self_le_of_isEllipticFieldOn + Q hk a a0 hEll + dsimp [g, f] + exact mul_le_mul_of_nonneg_left hresp (geometricWeight_nonneg n (by simpa using hs.le)) + have hsumLe : ∑' n : ℕ, g n ≤ ∑' n : ℕ, f n := + Summable.tsum_le_tsum hterm hgSummable hsum + have hgEq : ∑' n : ℕ, g n = c := by + dsimp [g, c] + rw [tsum_mul_right, tsum_geometricWeight_one_eq_one hs, one_mul] + rw [homogenizationErrorOnCube_infinity_one_eq_tsum] + calc + scaleResponseAtScale Q Q.scale .infinity a a0 = ∑' n : ℕ, g n := by + exact hgEq.symm + _ ≤ ∑' n : ℕ, f n := hsumLe + +theorem homogenizationErrorOnCube_infinity_one_le_of_lt_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) (a0 : Mat d) + {t s : ℝ} {lam Lam : ℝ} (ht : 0 < t) (hts : t < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hsum_t : + Summable (fun n : ℕ => + geometricWeight t 1 n * + scaleResponseAtScale Q (Q.scale - (n : ℤ)) .infinity a a0)) : + HomogenizationErrorOnCube Q s .infinity (.finite 1) a a0 ≤ + HomogenizationErrorOnCube Q t .infinity (.finite 1) a a0 := by + rw [homogenizationErrorOnCube_infinity_one_eq_tsum, + homogenizationErrorOnCube_infinity_one_eq_tsum] + refine tsum_geometricWeight_one_le_of_monotone ?_ ?_ ht hts hsum_t + · intro m n hmn + have hmnz : (m : ℤ) ≤ (n : ℤ) := by + exact_mod_cast hmn + have hkl : Q.scale - (n : ℤ) ≤ Q.scale - (m : ℤ) := by + linarith + have hlQ : Q.scale - (m : ℤ) ≤ Q.scale := by + exact sub_le_self _ (by exact_mod_cast Nat.zero_le m) + exact scaleResponseAtScale_infinity_le_of_le_of_isEllipticFieldOn + (Q := Q) (k := Q.scale - (n : ℤ)) (l := Q.scale - (m : ℤ)) + hkl hlQ a a0 + hEll + · intro n + exact scaleResponseAtScale_infinity_nonneg Q + (sub_le_self _ (by exact_mod_cast Nat.zero_le n)) a a0 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Theta.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Theta.lean new file mode 100644 index 0000000000..5f362faffb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/MultiscaleQuantitiesBasic/Theta.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Ellipticity + +/-! # Theta -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped Matrix.Norms.Frobenius +open scoped MatrixOrder + +/-! +# Boundary-facing theta statements +-/ + +theorem thetaRatio_boundary_coefficient_le_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) (hR : R ∈ descendantsAtScale Q k) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) : + Real.rpow (3 : ℝ) (-(Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (-(1 - s - t) * (Int.toNat (Q.scale - k) : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + let h : ℕ := Int.toNat (Q.scale - k) + have htheta := + thetaRatio_rpow_half_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := k) a s t hs ht hR hBsum hSigmaSum + have h3 : 0 < (3 : ℝ) := by norm_num + have hfactorNonneg : + 0 ≤ Real.rpow (3 : ℝ) (-(h : ℝ)) := by + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + Real.rpow (3 : ℝ) (-(h : ℝ)) * Real.rpow (ThetaRatio R s t a) (1 / 2 : ℝ) ≤ + Real.rpow (3 : ℝ) (-(h : ℝ)) * + (Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) := by + exact mul_le_mul_of_nonneg_left htheta hfactorNonneg + _ = + Real.rpow (3 : ℝ) (-(1 - s - t) * (h : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + have hpow : + Real.rpow (3 : ℝ) (-(h : ℝ)) * Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) = + Real.rpow (3 : ℝ) (-(1 - s - t) * (h : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-(h : ℝ)) * Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) = + Real.rpow (3 : ℝ) (-(h : ℝ) + (s + t) * (h : ℝ)) := by + simpa using (Real.rpow_add h3 (-(h : ℝ)) ((s + t) * (h : ℝ))).symm + _ = Real.rpow (3 : ℝ) (-(1 - s - t) * (h : ℝ)) := by + congr 1 + ring + calc + Real.rpow (3 : ℝ) (-(h : ℝ)) * + (Real.rpow (3 : ℝ) ((s + t) * (h : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ)) = + (Real.rpow (3 : ℝ) (-(h : ℝ)) * Real.rpow (3 : ℝ) ((s + t) * (h : ℝ))) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + ring + _ = + Real.rpow (3 : ℝ) (-(1 - s - t) * (h : ℝ)) * + Real.rpow (ThetaRatio Q s t a) (1 / 2 : ℝ) := by + rw [hpow] + +theorem weighted_descendant_product_sq_le_thetaRatio {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (a : CoeffField d) (s t : ℝ) + (hs : 0 ≤ s) (ht : 0 ≤ t) (hR : R ∈ descendantsAtScale Q k) + (hBsum : + Summable (fun n : ℕ => + geometricWeight s 1 n * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) (1 / 2 : ℝ))) + (hSigmaSum : + Summable (fun n : ℕ => + geometricWeight t 1 n * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (n : ℤ)) a) + (1 / 2 : ℝ))) : + ((geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ)) * + (geometricWeight t 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ))) ^ 2 ≤ + ThetaRatio Q s t a := by + have hB : + geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := + weighted_sqrt_coarseBBlockNorm_le_LambdaSq_one_rpow_half + (Q := Q) (R := R) (k := k) a s hs hR hBsum + have hSigma : + geometricWeight t 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) ≤ + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := + weighted_sqrt_coarseSigmaStarInvBlockNorm_le_lambdaSq_one_rpow_neg_half + (Q := Q) (R := R) (k := k) a t ht hR hSigmaSum + have hBnonneg : + 0 ≤ geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ) := by + refine mul_nonneg (geometricWeight_nonneg _ (by simpa using hs)) ?_ + exact Real.rpow_nonneg (coarseBBlockNorm_nonneg R a) _ + have hSigmanonneg : + 0 ≤ geometricWeight t 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ) := by + refine mul_nonneg (geometricWeight_nonneg _ (by simpa using ht)) ?_ + exact Real.rpow_nonneg (coarseSigmaStarInvBlockNorm_nonneg R a) _ + have hLambdanonneg : + 0 ≤ Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) := by + exact Real.rpow_nonneg (multiscale_ellipticity_LambdaSq_one_nonneg Q s a hs) _ + have hmul : + (geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ)) * + (geometricWeight t 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ)) ≤ + Real.rpow (LambdaSq Q s (.finite 1) a) (1 / 2 : ℝ) * + Real.rpow (lambdaSq Q t (.finite 1) a) (-1 / 2 : ℝ) := by + exact mul_le_mul hB hSigma hSigmanonneg hLambdanonneg + have hprodNonneg : + 0 ≤ + (geometricWeight s 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseBBlockNorm R a) (1 / 2 : ℝ)) * + (geometricWeight t 1 (Int.toNat (Q.scale - k)) * + Real.rpow (coarseSigmaStarInvBlockNorm R a) (1 / 2 : ℝ)) := by + exact mul_nonneg hBnonneg hSigmanonneg + have hsq := pow_le_pow_left₀ hprodNonneg hmul 2 + rw [thetaRatio_eq_sq_mul_rpow_half_rpow_neg_half Q s t a hs ht] + exact hsq + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS.lean new file mode 100644 index 0000000000..2b4ea9dcf4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS.lean @@ -0,0 +1,26 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AveragedStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyAveraged +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyPoincare +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FullStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FluxStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalAbsorbed +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge + +/-! +# Weak flux estimates with right-hand side + +Compatibility wrapper for the Section 3.2.3 RHS weak-flux development. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedApex.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedApex.lean new file mode 100644 index 0000000000..abe26dcda1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedApex.lean @@ -0,0 +1,913 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedGlobalIteration + +/-! # Absorbed Apex -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- +Global localized weak-flux estimate with the local absorbed recurrence derived +from parent potential/solenoidal data on descendant cubes. + +This removes the anonymous `hlocal` recurrence hypothesis from +`localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_bddAbove`. +The selected harmonic remainders still expose their local boundedness and +global tail bound, which are the next closure obligations for the +note-facing weak-flux RHS apex. +-/ +theorem exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (u g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + (∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ BV) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + rcases + exists_harmonicRemainderSelector_fluxSeminormStepAbsorbedLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (Q := Q) (a := a) (s := s) (η := η) (lam := lam) (Lam := Lam) + (u := u) (g := g) hs hη hu_potential hu_residual hEll_desc + hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd + huBdd_desc hgBdd_centered_desc with + ⟨v, hlocal_of_bdd⟩ + refine ⟨v, ?_⟩ + intro hvBdd hv + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_bddAbove + (Q := Q) (a := a) (s := s) (η := η) (u := u) (g := g) (v := v) + (lam := lam) (Lam := Lam) hs hη (hlocal_of_bdd hvBdd) (m := m) + hBdd hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu hv + +/-- +Global localized weak-flux estimate with the selected harmonic-remainder tail +derived from descendantwise squared control. + +This is the same parent potential/solenoidal wrapper as +`exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal`, +but it asks for pointwise descendant control of the selected remainders at the +reciprocal depth-weight scale instead of an already-averaged tail bound. +-/ +theorem exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal_of_descendant_scaled_harmonicRemainder_sq_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (u g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + (∀ k : ℕ, ∀ R ∈ descendantsAtDepth Q (m + k), + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s (m + k))⁻¹ * BV) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + rcases + exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal + (Q := Q) (a := a) (s := s) (η := η) (u := u) (g := g) + (lam := lam) (Lam := Lam) hs hη hu_potential hu_residual hEll_desc + hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd + huBdd_desc hgBdd_centered_desc (m := m) hBdd hEll_open hData + hsum_half havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd + hLocalBdd hBU_nonneg hBV_nonneg hu with + ⟨v, hconclusion⟩ + refine ⟨v, ?_⟩ + intro hvBdd hvSq + exact hconclusion hvBdd + (weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_tail_le_of_descendant_scaled_sq_bound + Q s v m hvSq) + +/-- +Global localized weak-flux estimate with the selected harmonic-remainder +boundedness and square tail both discharged from bounds on every local +harmonic remainder produced by the centered Neumann-corrector construction. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (u g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + rcases + exists_harmonicRemainderSelector_fluxSeminormStepAbsorbedLocalError_with_decomposition_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (Q := Q) (a := a) (s := s) (η := η) (lam := lam) (Lam := Lam) + (u := u) (g := g) hs hη hu_potential hu_residual hEll_desc + hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd + huBdd_desc hgBdd_centered_desc with + ⟨v, hselected, hlocal_of_bdd⟩ + have hvBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R)) := by + intro R hRdesc + rcases hRdesc with ⟨j, hR⟩ + rcases hselected R ⟨j, hR⟩ with ⟨ω, w, hv_eq, hdecomp⟩ + have hbdd := (hvConstructed j R hR ω w hdecomp).1 + simpa [hv_eq] using hbdd + have hvSq : + ∀ k : ℕ, ∀ R ∈ descendantsAtDepth Q (m + k), + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s (m + k))⁻¹ * BV := by + intro k R hR + rcases hselected R ⟨m + k, hR⟩ with ⟨ω, w, hv_eq, hdecomp⟩ + have hsq := (hvConstructed (m + k) R hR ω w hdecomp).2 + simpa [hv_eq] using hsq + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_bddAbove + (Q := Q) (a := a) (s := s) (η := η) (u := u) (g := g) (v := v) + (lam := lam) (Lam := Lam) hs hη (hlocal_of_bdd hvBdd) (m := m) + hBdd hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu + (weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_tail_le_of_descendant_scaled_sq_bound + Q s v m hvSq) + +/-- +Note-eta form of the constructed harmonic-remainder parent wrapper. + +This fixes the absorption parameter to the manuscript choice +`coarsePoincareRHSNoteEta s` and packages the component base as +`weakFluxRHSAbsorbedLocalizedNoteBase`. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedNoteBase_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (u g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hη : 0 < coarsePoincareRHSNoteEta s := + coarsePoincareRHSNoteEta_pos hs + simpa [weakFluxRHSAbsorbedLocalizedNoteBase] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (η := coarsePoincareRHSNoteEta s) + (u := u) (g := g) (lam := lam) (Lam := Lam) hs hη hu_potential + hu_residual hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc + hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc (m := m) hBdd + hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint hmem + hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu hvConstructed + +/-- +H¹ weak-solution wrapper for the global localized weak-flux estimate. + +The PDE hypothesis `-div(a grad u) = div g` supplies the parent potential field +and residual solenoidal flux required by +`exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal`. +-/ +theorem exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + (∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ BV) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u.grad s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hQdesc : ∃ n : ℕ, Q ∈ descendantsAtDepth Q n := ⟨0, by simp⟩ + exact + exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal + (Q := Q) (a := a) (s := s) (η := η) (u := u.grad) (g := g) + (lam := lam) (Lam := Lam) hs hη u.isPotentialOn + (hweak.residual_solenoidal (hEll_desc Q hQdesc) (hg_mem_desc Q hQdesc)) + hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc + hchildBdd huBdd_desc hgBdd_centered_desc (m := m) hBdd hEll_open + hData hsum_half havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd + hLocalBdd hBU_nonneg hBV_nonneg hu_tail + +/-- +H¹ weak-solution wrapper whose selected harmonic-remainder tail is supplied by +descendantwise squared bounds rather than an averaged tail hypothesis. +-/ +theorem exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_h1DirichletRhsWeakSolutionOn_of_descendant_scaled_harmonicRemainder_sq_bound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + (∀ k : ℕ, ∀ R ∈ descendantsAtDepth Q (m + k), + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s (m + k))⁻¹ * BV) → + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u.grad s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + rcases + exists_localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (s := s) (η := η) (g := g) (u := u) + (lam := lam) (Lam := Lam) hs hη hweak hEll_desc hu_mem_desc + hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc (m := m) hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu_tail with + ⟨v, hconclusion⟩ + refine ⟨v, ?_⟩ + intro hvBdd hvSq + exact hconclusion hvBdd + (weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_tail_le_of_descendant_scaled_sq_bound + Q s v m hvSq) + +/-- +H¹ weak-solution form of the constructed harmonic-remainder bound wrapper. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u.grad s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hQdesc : ∃ n : ℕ, Q ∈ descendantsAtDepth Q n := ⟨0, by simp⟩ + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (η := η) (u := u.grad) (g := g) + (lam := lam) (Lam := Lam) hs hη u.isPotentialOn + (hweak.residual_solenoidal (hEll_desc Q hQdesc) (hg_mem_desc Q hQdesc)) + hEll_desc hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc + hchildBdd huBdd_desc hgBdd_centered_desc (m := m) hBdd hEll_open + hData hsum_half havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd + hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + +/-- +H¹ weak-solution note-eta form of the constructed harmonic-remainder wrapper. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedNoteBase_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q a u.grad g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hη : 0 < coarsePoincareRHSNoteEta s := + coarsePoincareRHSNoteEta_pos hs + simpa [weakFluxRHSAbsorbedLocalizedNoteBase] using + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (η := coarsePoincareRHSNoteEta s) + (g := g) (u := u) (lam := lam) (Lam := Lam) hs hη hweak hEll_desc + hu_mem_desc hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd + huBdd_desc hgBdd_centered_desc (m := m) hBdd hEll_open hData + hsum_half havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd + hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponentBounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponentBounds.lean new file mode 100644 index 0000000000..334d4f5749 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponentBounds.lean @@ -0,0 +1,452 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponents + +/-! # Absorbed Component Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Depth-weighted parent-localized weak-flux coefficient-energy base. -/ +noncomputable def weakFluxRHSWeightedCoefficientEnergyBase {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) : ℝ := + 2 * (geometricDiscount s 2)⁻¹ * + LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + +/-- The depth-weighted parent-localized weak-flux coefficient-energy base is +nonnegative when the parent energy average is nonnegative. -/ +theorem weakFluxRHSWeightedCoefficientEnergyBase_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) : + 0 ≤ weakFluxRHSWeightedCoefficientEnergyBase Q a u s := by + unfold weakFluxRHSWeightedCoefficientEnergyBase + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hshalf2_nonneg : 0 ≤ (s / 2) * (2 : ℝ) := by nlinarith + exact mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num) + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2)))) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) hshalf2_nonneg)) + havg_nonneg + +/-- Note-constant square-envelope for the coefficient-energy part of the +localized weak-flux RHS. This is the manuscript `s^{-2} Lambda * energy` +piece before taking the final square root. -/ +theorem weakFluxRHSWeightedCoefficientEnergyBase_mul_inv_one_sub_step_le_noteEnergySquare + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) : + weakFluxRHSWeightedCoefficientEnergyBase Q a u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) := by + let G : ℝ := (geometricDiscount s 2)⁻¹ + let H : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let L : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let A : ℝ := cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := 5 * s⁻¹ + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by nlinarith : 0 < s * 2))) + have hG_le : G ≤ K := by + dsimp [G, K] + exact inv_geometricDiscount_two_le_five_inv hs hs_le + have hH_nonneg : 0 ≤ H := by + dsimp [H] + have hr_lt_one : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hH_le : H ≤ K := by + dsimp [H, K] + exact inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * 2) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact havg_nonneg + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hleft_le : + 2 * G * L * A ≤ 2 * K * L * A := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hG_le (by norm_num : 0 ≤ (2 : ℝ))) + hL_nonneg) + hA_nonneg + have hright_nonneg : 0 ≤ 2 * K * L * A := by + exact mul_nonneg + (mul_nonneg (mul_nonneg (by norm_num) hK_nonneg) hL_nonneg) + hA_nonneg + calc + weakFluxRHSWeightedCoefficientEnergyBase Q a u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + (2 * G * L * A) * H := by + simp [weakFluxRHSWeightedCoefficientEnergyBase, G, H, L, A] + _ ≤ (2 * K * L * A) * H := by + exact mul_le_mul_of_nonneg_right hleft_le hH_nonneg + _ ≤ (2 * K * L * A) * K := by + exact mul_le_mul_of_nonneg_left hH_le hright_nonneg + _ = + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) := by + simp [K, L, A] + ring + +/-- Note-eta specialization of the localized absorbed weak-flux component base. -/ +noncomputable def weakFluxRHSAbsorbedLocalizedNoteBase {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u g : Vec d → Vec d) + (s : ℝ) (m : ℕ) (BU BV : ℝ) : ℝ := + weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + coarsePoincareRHSNoteEta s * BU + + coarsePoincareRHSNoteEta s * BV + + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m + +/-- Componentwise upper-bound interface for the full note-eta localized base +after multiplying by the weak-flux geometric tail. -/ +theorem weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_of_components + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u g : Vec d → Vec d) + (s : ℝ) (m : ℕ) (BU BV Bcoeff Bu Bv Bforce : ℝ) + (hcoeff : + weakFluxRHSWeightedCoefficientEnergyBase Q a u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ Bcoeff) + (hu : + (coarsePoincareRHSNoteEta s * BU) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ Bu) + (hv : + (coarsePoincareRHSNoteEta s * BV) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ Bv) + (hforce : + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ Bforce) : + weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + Bcoeff + Bu + Bv + Bforce := by + have hadd : + weakFluxRHSWeightedCoefficientEnergyBase Q a u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (coarsePoincareRHSNoteEta s * BU) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (coarsePoincareRHSNoteEta s * BV) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + Bcoeff + Bu + Bv + Bforce := + add_le_add (add_le_add (add_le_add hcoeff hu) hv) hforce + calc + weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + weakFluxRHSWeightedCoefficientEnergyBase Q a u s * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (coarsePoincareRHSNoteEta s * BU) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + (coarsePoincareRHSNoteEta s * BV) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + simp [weakFluxRHSAbsorbedLocalizedNoteBase] + ring + _ ≤ Bcoeff + Bu + Bv + Bforce := hadd + +/-- Descendant-averaged coefficient-energy component localized to the parent +half-scale upper multiscale coefficient and the parent energy average. -/ +theorem weakFluxRHSLocalCoefficientEnergyErrorAverage_le_parentHalfLambda_globalAverage + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) : + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ + 2 * ((geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a)) * + cubeAverage Q (coefficientEnergyDensity a u) := by + let C : ℝ := + (geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a) + have hcoeff : + ∀ R ∈ descendantsAtDepth Q n, + weakFluxRHSLocalCoeff R a s ≤ C := by + intro R hR + exact weakFluxRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs hR hEll hData hsum_half + have hbase : + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ + 2 * C * + descendantsAverage Q n + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + unfold weakFluxRHSLocalCoefficientEnergyErrorAverage + calc + descendantsAverage Q n (fun R => weakFluxRHSLocalCoefficientEnergyError R a u s) + ≤ + descendantsAverage Q n + (fun R => 2 * C * cubeAverage R (coefficientEnergyDensity a u)) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + unfold weakFluxRHSLocalCoefficientEnergyError + calc + 2 * weakFluxRHSLocalCoeff R a s * + cubeAverage R (coefficientEnergyDensity a u) + ≤ 2 * (C * cubeAverage R (coefficientEnergyDensity a u)) := by + simpa [mul_assoc] using mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right (hcoeff R hR) (havg_nonneg R hR)) + (show 0 ≤ (2 : ℝ) by norm_num) + _ = 2 * C * cubeAverage R (coefficientEnergyDensity a u) := by + ring + _ = + 2 * C * + descendantsAverage Q n + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := by + rw [descendantsAverage_smul Q n (2 * C) + (fun R => cubeAverage R (coefficientEnergyDensity a u))] + have hpartition : + cubeAverage Q (coefficientEnergyDensity a u) = + descendantsAverage Q n + (fun R => cubeAverage R (coefficientEnergyDensity a u)) := + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn Q n + (coefficientEnergyDensity a u) hint + simpa [C, hpartition] using hbase + +/-- The depth weight cancels the half-scale coefficient growth in the averaged +`u` coefficient-energy component. -/ +theorem weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_parentHalfLambda_globalAverage + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ + 2 * (geometricDiscount s 2)⁻¹ * + LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) := by + have hlocal := + weakFluxRHSLocalCoefficientEnergyErrorAverage_le_parentHalfLambda_globalAverage + Q a u n hs hEll hData hsum_half havg_nonneg hint + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmul := mul_le_mul_of_nonneg_left hlocal hweight_nonneg + have hcancel : + coarsePoincareRHSDepthWeight s n * + Real.rpow (3 : ℝ) (s * (n : ℝ)) = 1 := by + unfold coarsePoincareRHSDepthWeight + calc + Real.rpow (3 : ℝ) (-s * (n : ℝ)) * + Real.rpow (3 : ℝ) (s * (n : ℝ)) + = Real.rpow (3 : ℝ) ((-s * (n : ℝ)) + s * (n : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) + (-s * (n : ℝ)) (s * (n : ℝ))).symm + _ = 1 := by + have hsum : (-s * (n : ℝ)) + s * (n : ℝ) = 0 := by ring + rw [hsum] + simp + calc + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + ≤ + coarsePoincareRHSDepthWeight s n * + (2 * ((geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a)) * + cubeAverage Q (coefficientEnergyDensity a u)) := hmul + _ = + (coarsePoincareRHSDepthWeight s n * + Real.rpow (3 : ℝ) (s * (n : ℝ))) * + (2 * (geometricDiscount s 2)⁻¹ * + LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u)) := by + ring + _ = + 2 * (geometricDiscount s 2)⁻¹ * + LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) := by + rw [hcancel] + ring + +/-- The localized coefficient-energy average supplies the uniform component-base +input needed by the weak-flux global wrappers. -/ +theorem weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_weightedCoefficientEnergyBase + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (havg_nonneg : + ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ + weakFluxRHSWeightedCoefficientEnergyBase Q a u s := by + simpa [weakFluxRHSWeightedCoefficientEnergyBase] using + weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_parentHalfLambda_globalAverage + Q a u n hs hEll hData hsum_half havg_nonneg hint + +/-- Averaging preserves the corrector-energy component split. -/ +theorem weakFluxRHSCorrectorEnergyErrorAverage_eq_components {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (z : TriadicCube d → Vec d → Vec d) (s : ℝ) (n : ℕ) : + weakFluxRHSCorrectorEnergyErrorAverage Q a u z s n = + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n := by + simp [weakFluxRHSCorrectorEnergyErrorAverage, + weakFluxRHSLocalCoefficientEnergyErrorAverage, + weakFluxRHSLocalCorrectorEnergyErrorAverage, + weakFluxRHSCorrectorEnergyLocalError_eq_components, + descendantsAverage_add] + +/-- Averaging preserves the absorbed component split. -/ +theorem weakFluxRHSAbsorbedErrorAverage_eq_components {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u : Vec d → Vec d) + (v : TriadicCube d → Vec d → Vec d) (s η : ℝ) (n : ℕ) : + weakFluxRHSAbsorbedErrorAverage Q a g u v s η n = + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + weakFluxRHSLocalUSeminormErrorAverage Q u s η n + + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n + + weakFluxRHSLocalForceErrorAverage Q a g s η n := by + simp [weakFluxRHSAbsorbedErrorAverage, + weakFluxRHSLocalCoefficientEnergyErrorAverage, + weakFluxRHSLocalUSeminormErrorAverage, + weakFluxRHSLocalHarmonicSeminormErrorAverage, + weakFluxRHSLocalForceErrorAverage, + weakFluxRHSAbsorbedLocalError_eq_components, + descendantsAverage_add, add_assoc] + +/-- Weighted component bounds imply a weighted bound for the corrector-energy +local-error envelope. -/ +theorem weakFluxRHSCorrectorEnergyErrorAverage_weighted_le_add_of_components + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (u : Vec d → Vec d) (z : TriadicCube d → Vec d → Vec d) + (s : ℝ) (n : ℕ) {Bcoeff Bcorr : ℝ} + (hcoeff : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ Bcoeff) + (hcorr : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n ≤ Bcorr) : + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) ≤ + Bcoeff + Bcorr := by + calc + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + = + coarsePoincareRHSDepthWeight s n * + weakFluxRHSCorrectorEnergyErrorAverage Q a u z s n := by + rfl + _ = + coarsePoincareRHSDepthWeight s n * + (weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n) := by + rw [weakFluxRHSCorrectorEnergyErrorAverage_eq_components] + _ = + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n := by + ring + _ ≤ Bcoeff + Bcorr := add_le_add hcoeff hcorr + +/-- Weighted component bounds imply a weighted bound for the absorbed +local-error envelope. -/ +theorem weakFluxRHSAbsorbedErrorAverage_weighted_le_add_of_components + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g u : Vec d → Vec d) (v : TriadicCube d → Vec d → Vec d) + (s η : ℝ) (n : ℕ) {Bcoeff Bu Bv Bforce : ℝ} + (hcoeff : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n ≤ Bcoeff) + (hu : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalUSeminormErrorAverage Q u s η n ≤ Bu) + (hv : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n ≤ Bv) + (hforce : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ Bforce) : + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) ≤ + Bcoeff + Bu + Bv + Bforce := by + calc + coarsePoincareRHSDepthWeight s n * + descendantsAverage Q n + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + = + coarsePoincareRHSDepthWeight s n * + weakFluxRHSAbsorbedErrorAverage Q a g u v s η n := by + rfl + _ = + coarsePoincareRHSDepthWeight s n * + (weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + weakFluxRHSLocalUSeminormErrorAverage Q u s η n + + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n + + weakFluxRHSLocalForceErrorAverage Q a g s η n) := by + rw [weakFluxRHSAbsorbedErrorAverage_eq_components] + _ = + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s n + + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalUSeminormErrorAverage Q u s η n + + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n + + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalForceErrorAverage Q a g s η n := by + ring + _ ≤ Bcoeff + Bu + Bv + Bforce := + add_le_add (add_le_add (add_le_add hcoeff hu) hv) hforce + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponents.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponents.lean new file mode 100644 index 0000000000..f079397183 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedComponents.lean @@ -0,0 +1,916 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.ForceLocalization +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.GlobalIteration + +/-! # Absorbed Components -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Explicit non-child error envelope in the absorbed weak-flux RHS recurrence. + +This is the local Section 3.2.3 error produced after absorbing the short +corrector product into the `u`, harmonic-remainder, and centered-forcing +quadratic terms. -/ +noncomputable def weakFluxRHSAbsorbedLocalError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u v : Vec d → Vec d) + (s η : ℝ) : ℝ := + let C : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + η * (cubeBesovNegativeVectorSeminormTwo Q s v) ^ 2 + + 2 * η⁻¹ * + ((K * cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) + +/-- Explicit non-child error envelope in the corrector-energy weak-flux RHS +recurrence, before the corrector energy is converted into Besov forcing +terms. -/ +noncomputable def weakFluxRHSCorrectorEnergyLocalError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u z : Vec d → Vec d) + (s : ℝ) : ℝ := + let C : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a z) + +/-- Local coefficient multiplying the weak-flux RHS error terms. -/ +noncomputable def weakFluxRHSLocalCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) : ℝ := + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + +/-- The weak-flux local coefficient is nonnegative for positive regularity. -/ +theorem weakFluxRHSLocalCoeff_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) {s : ℝ} (hs : 0 < s) : + 0 ≤ weakFluxRHSLocalCoeff Q a s := by + unfold weakFluxRHSLocalCoeff + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a (by norm_num) hs2.le) + +/-- Parent half-scale coefficient used after localizing `Lambda_{s,2}`. -/ +noncomputable def weakFluxRHSParentHalfCoeff {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : ℝ := + (geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a) + +/-- Parent half-scale weak-flux coefficient grows by `3^s` when the descendant +depth is incremented. -/ +theorem weakFluxRHSParentHalfCoeff_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : + weakFluxRHSParentHalfCoeff Q a s (n + 1) = + Real.rpow (3 : ℝ) s * weakFluxRHSParentHalfCoeff Q a s n := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hparent : + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + have hexp : + s * ((n + 1 : ℕ) : ℝ) = s + s * (n : ℝ) := by + norm_num + ring + calc + Real.rpow (3 : ℝ) (s * ((n + 1 : ℕ) : ℝ)) = + Real.rpow (3 : ℝ) (s + s * (n : ℝ)) := by + rw [hexp] + _ = Real.rpow (3 : ℝ) s * + Real.rpow (3 : ℝ) (s * (n : ℝ)) := by + exact Real.rpow_add h3 s (s * (n : ℝ)) + unfold weakFluxRHSParentHalfCoeff + rw [hparent] + ring + +/-- Half-scale localization of the local coefficient multiplying the weak-flux +RHS error terms. -/ +theorem weakFluxRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {n : ℕ} {s lam Lam : ℝ} + (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q n) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) : + weakFluxRHSLocalCoeff R a s ≤ + (geometricDiscount s 2)⁻¹ * + (Real.rpow (3 : ℝ) (s * (n : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a) := by + have hs2 : 0 < s * (2 : ℝ) := by nlinarith + have hdisc_nonneg : 0 ≤ (geometricDiscount s 2)⁻¹ := + inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2)) + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hLambda : + LambdaSq R s (.finite 2) a ≤ + Real.rpow (3 : ℝ) + (s * (Int.toNat (Q.scale - (Q.scale - (n : ℤ))) : ℝ)) * + LambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_LambdaSq_two_le_rpow_s_of_mem_descendantsAtScale_of_half_of_isEllipticFieldOn_of_isSigmaCoarse + (Q := Q) (R := R) (k := Q.scale - (n : ℤ)) a hs hRscale hEll hData hsum_half + have htoNat : + Int.toNat (Q.scale - (Q.scale - (n : ℤ))) = n := by + have hdiff : Q.scale - (Q.scale - (n : ℤ)) = (n : ℤ) := by + omega + rw [hdiff] + simp + unfold weakFluxRHSLocalCoeff + refine mul_le_mul_of_nonneg_left ?_ hdisc_nonneg + simpa [htoNat] using hLambda + +/-- Parent half-scale forcing multiplier used after localizing `Lambda_{s,2}`. -/ +noncomputable def weakFluxRHSParentHalfForceMultiplier {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : ℝ := + weakFluxRHSParentHalfCoeff Q a s n * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + +/-- Parent half-scale weak-flux forcing multiplier grows by `3^s` when the +descendant depth is incremented. -/ +theorem weakFluxRHSParentHalfForceMultiplier_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) (n : ℕ) : + weakFluxRHSParentHalfForceMultiplier Q a s (n + 1) = + Real.rpow (3 : ℝ) s * + weakFluxRHSParentHalfForceMultiplier Q a s n := by + unfold weakFluxRHSParentHalfForceMultiplier + rw [weakFluxRHSParentHalfCoeff_succ Q a s n] + ring + +/-- The geometric multiplier attached to the centered forcing seminorm in the +absorbed weak-flux RHS error. -/ +noncomputable def weakFluxRHSLocalForceMultiplier {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) : ℝ := + weakFluxRHSLocalCoeff Q a s * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + +/-- Local forcing multipliers are controlled by any upper bound on the local +weak-flux coefficient. -/ +theorem weakFluxRHSLocalForceMultiplier_sq_le_of_localCoeffBound {d : ℕ} + (R : TriadicCube d) (a : CoeffField d) {s C : ℝ} + (hs : 0 < s) + (hcoeff : weakFluxRHSLocalCoeff R a s ≤ C) : + (weakFluxRHSLocalForceMultiplier R a s) ^ 2 ≤ + (C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) ^ 2 := by + let P : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (by exact_mod_cast Nat.zero_le d) + (mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hlocal_nonneg : + 0 ≤ weakFluxRHSLocalForceMultiplier R a s := by + unfold weakFluxRHSLocalForceMultiplier + exact mul_nonneg (weakFluxRHSLocalCoeff_nonneg R a hs) hP_nonneg + have hle : + weakFluxRHSLocalForceMultiplier R a s ≤ C * P := by + unfold weakFluxRHSLocalForceMultiplier + exact mul_le_mul_of_nonneg_right hcoeff hP_nonneg + simpa [P] using pow_le_pow_left₀ hlocal_nonneg hle 2 + +/-- Half-scale localization of the weak-flux forcing multiplier on descendants. -/ +theorem weakFluxRHSLocalForceMultiplier_sq_le_parentHalfLambda_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} (a : CoeffField d) + {s lam Lam : ℝ} (n : ℕ) (hs : 0 < s) + (hR : R ∈ descendantsAtDepth Q n) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) : + (weakFluxRHSLocalForceMultiplier R a s) ^ 2 ≤ + (weakFluxRHSParentHalfForceMultiplier Q a s n) ^ 2 := by + simpa [weakFluxRHSParentHalfCoeff, weakFluxRHSParentHalfForceMultiplier] using + weakFluxRHSLocalForceMultiplier_sq_le_of_localCoeffBound + R a hs + (weakFluxRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs hR hEll hData hsum_half) + +/-- Centered positive Besov forcing seminorm used by the absorbed weak-flux +RHS error. -/ +noncomputable def weakFluxRHSLocalCenteredForceSeminorm {d : ℕ} + (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) : ℝ := + cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + +/-- The `u` coefficient-energy contribution to the local weak-flux RHS error. -/ +noncomputable def weakFluxRHSLocalCoefficientEnergyError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) : ℝ := + 2 * weakFluxRHSLocalCoeff Q a s * + cubeAverage Q (coefficientEnergyDensity a u) + +/-- The corrector coefficient-energy contribution to the local weak-flux RHS +error. -/ +noncomputable def weakFluxRHSLocalCorrectorEnergyError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (z : Vec d → Vec d) + (s : ℝ) : ℝ := + 2 * weakFluxRHSLocalCoeff Q a s * + cubeAverage Q (coefficientEnergyDensity a z) + +/-- The absorbed `u` negative-Besov contribution to the local weak-flux RHS +error. -/ +noncomputable def weakFluxRHSLocalUSeminormError {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (s η : ℝ) : ℝ := + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + +/-- The absorbed harmonic-remainder negative-Besov contribution to the local +weak-flux RHS error. -/ +noncomputable def weakFluxRHSLocalHarmonicSeminormError {d : ℕ} + (Q : TriadicCube d) (v : Vec d → Vec d) (s η : ℝ) : ℝ := + η * (cubeBesovNegativeVectorSeminormTwo Q s v) ^ 2 + +/-- The absorbed centered-forcing contribution to the local weak-flux RHS +error. -/ +noncomputable def weakFluxRHSLocalForceError {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s η : ℝ) : ℝ := + 2 * η⁻¹ * + ((weakFluxRHSLocalForceMultiplier Q a s * + weakFluxRHSLocalCenteredForceSeminorm Q g s) ^ 2) + +/-- The corrector-energy local weak-flux RHS error is exactly the sum of its +two coefficient-energy components. -/ +theorem weakFluxRHSCorrectorEnergyLocalError_eq_components {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u z : Vec d → Vec d) + (s : ℝ) : + weakFluxRHSCorrectorEnergyLocalError Q a u z s = + weakFluxRHSLocalCoefficientEnergyError Q a u s + + weakFluxRHSLocalCorrectorEnergyError Q a z s := by + simp [weakFluxRHSCorrectorEnergyLocalError, + weakFluxRHSLocalCoefficientEnergyError, + weakFluxRHSLocalCorrectorEnergyError, weakFluxRHSLocalCoeff] + +/-- The absorbed local weak-flux RHS error is exactly the sum of its named +coefficient-energy, absorbed seminorm, and centered-forcing components. -/ +theorem weakFluxRHSAbsorbedLocalError_eq_components {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u v : Vec d → Vec d) + (s η : ℝ) : + weakFluxRHSAbsorbedLocalError Q a g u v s η = + weakFluxRHSLocalCoefficientEnergyError Q a u s + + weakFluxRHSLocalUSeminormError Q u s η + + weakFluxRHSLocalHarmonicSeminormError Q v s η + + weakFluxRHSLocalForceError Q a g s η := by + simp [weakFluxRHSAbsorbedLocalError, + weakFluxRHSLocalCoefficientEnergyError, + weakFluxRHSLocalUSeminormError, + weakFluxRHSLocalHarmonicSeminormError, + weakFluxRHSLocalForceError, + weakFluxRHSLocalForceMultiplier, + weakFluxRHSLocalCenteredForceSeminorm, + weakFluxRHSLocalCoeff] + +/-- Descendant average of the corrector-energy weak-flux RHS error. -/ +noncomputable def weakFluxRHSCorrectorEnergyErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (z : TriadicCube d → Vec d → Vec d) (s : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s + +/-- Descendant average of the absorbed weak-flux RHS error. -/ +noncomputable def weakFluxRHSAbsorbedErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g u : Vec d → Vec d) + (v : TriadicCube d → Vec d → Vec d) (s η : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSAbsorbedLocalError R a g u (v R) s η + +/-- Descendant average of the `u` coefficient-energy component. -/ +noncomputable def weakFluxRHSLocalCoefficientEnergyErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → Vec d) + (s : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSLocalCoefficientEnergyError R a u s + +/-- Descendant average of the corrector coefficient-energy component. -/ +noncomputable def weakFluxRHSLocalCorrectorEnergyErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) + (z : TriadicCube d → Vec d → Vec d) (s : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSLocalCorrectorEnergyError R a (z R) s + +/-- Descendant average of the absorbed `u` negative-Besov component. -/ +noncomputable def weakFluxRHSLocalUSeminormErrorAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (s η : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSLocalUSeminormError R u s η + +/-- Descendant average of the absorbed harmonic-remainder negative-Besov +component. -/ +noncomputable def weakFluxRHSLocalHarmonicSeminormErrorAverage {d : ℕ} + (Q : TriadicCube d) (v : TriadicCube d → Vec d → Vec d) + (s η : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSLocalHarmonicSeminormError R (v R) s η + +/-- Averaged negative-Besov size of a depth-dependent harmonic remainder. -/ +noncomputable def weakFluxRHSHarmonicRemainderAveragedSeminormSq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) + (v : TriadicCube d → Vec d → Vec d) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 + +/-- Scaled averaged negative-Besov size of a depth-dependent harmonic +remainder. -/ +noncomputable def weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) + (v : TriadicCube d → Vec d → Vec d) (n : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s n * + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n + +/-- Descendantwise squared bounds control the averaged varying-cube harmonic +remainder size. -/ +theorem weakFluxRHSHarmonicRemainderAveragedSeminormSq_le_of_descendant_sq_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (v : TriadicCube d → Vec d → Vec d) (n : ℕ) {B : ℝ} + (hbound : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ B) : + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n ≤ B := by + unfold weakFluxRHSHarmonicRemainderAveragedSeminormSq + calc + descendantsAverage Q n + (fun R => (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2) + ≤ descendantsAverage Q n (fun _ => B) := by + exact descendantsAverage_le_descendantsAverage Q n hbound + _ = B := by + exact descendantsAverage_const_eq Q n B + +/-- Descendantwise squared bounds at the reciprocal depth-weight scale control +the scaled varying-cube harmonic remainder size. -/ +theorem weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_le_of_descendant_scaled_sq_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (v : TriadicCube d → Vec d → Vec d) (n : ℕ) {B : ℝ} + (hbound : + ∀ R ∈ descendantsAtDepth Q n, + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s n)⁻¹ * B) : + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n ≤ B := by + have havg : + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n ≤ + (coarsePoincareRHSDepthWeight s n)⁻¹ * B := + weakFluxRHSHarmonicRemainderAveragedSeminormSq_le_of_descendant_sq_bound + Q s v n hbound + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hweight_pos : 0 < coarsePoincareRHSDepthWeight s n := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + unfold weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq + calc + coarsePoincareRHSDepthWeight s n * + weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n + ≤ coarsePoincareRHSDepthWeight s n * + ((coarsePoincareRHSDepthWeight s n)⁻¹ * B) := by + exact mul_le_mul_of_nonneg_left havg hweight_nonneg + _ = B := by + field_simp [hweight_pos.ne'] + +/-- Tail form of +`weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_le_of_descendant_scaled_sq_bound`. -/ +theorem weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_tail_le_of_descendant_scaled_sq_bound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (v : TriadicCube d → Vec d → Vec d) (m : ℕ) {B : ℝ} + (hbound : + ∀ k : ℕ, ∀ R ∈ descendantsAtDepth Q (m + k), + (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s (m + k))⁻¹ * B) : + ∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ B := by + intro k + exact + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq_le_of_descendant_scaled_sq_bound + Q s v (m + k) (hbound k) + +/-- The averaged absorbed `u` seminorm component is exactly `η R_n`. -/ +theorem weakFluxRHSLocalUSeminormErrorAverage_eq_eta_mul_coarsePoincareRHSRn + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : + weakFluxRHSLocalUSeminormErrorAverage Q u s η n = + η * coarsePoincareRHSRn Q s u n := by + unfold weakFluxRHSLocalUSeminormErrorAverage weakFluxRHSLocalUSeminormError + coarsePoincareRHSRn + exact descendantsAverage_smul Q n η + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) + +/-- The depth-weighted absorbed `u` seminorm component is exactly `η S_n`. -/ +theorem weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_eq_eta_mul_coarsePoincareRHSSn + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalUSeminormErrorAverage Q u s η n = + η * coarsePoincareRHSSn Q s u n := by + rw [weakFluxRHSLocalUSeminormErrorAverage_eq_eta_mul_coarsePoincareRHSRn] + unfold coarsePoincareRHSSn + ring + +/-- The averaged absorbed harmonic-remainder seminorm component is exactly +`η` times its varying-cube averaged seminorm. -/ +theorem weakFluxRHSLocalHarmonicSeminormErrorAverage_eq_eta_mul_harmonicRemainder + {d : ℕ} (Q : TriadicCube d) (v : TriadicCube d → Vec d → Vec d) + (s η : ℝ) (n : ℕ) : + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n = + η * weakFluxRHSHarmonicRemainderAveragedSeminormSq Q s v n := by + unfold weakFluxRHSLocalHarmonicSeminormErrorAverage + weakFluxRHSLocalHarmonicSeminormError + weakFluxRHSHarmonicRemainderAveragedSeminormSq + exact descendantsAverage_smul Q n η + (fun R => (cubeBesovNegativeVectorSeminormTwo R s (v R)) ^ 2) + +/-- The depth-weighted absorbed harmonic-remainder seminorm component is +exactly `η` times its scaled varying-cube averaged seminorm. -/ +theorem weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_eq_eta_mul_harmonicRemainderScaled + {d : ℕ} (Q : TriadicCube d) (v : TriadicCube d → Vec d → Vec d) + (s η : ℝ) (n : ℕ) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n = + η * weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n := by + rw [weakFluxRHSLocalHarmonicSeminormErrorAverage_eq_eta_mul_harmonicRemainder] + unfold weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq + ring + +/-- Any bound on `S_n` gives the corresponding weighted absorbed `u` component +bound after multiplying by `η`. -/ +theorem weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_le_eta_mul_base + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (s : ℝ) {η B : ℝ} (n : ℕ) + (hη_nonneg : 0 ≤ η) + (hbase : coarsePoincareRHSSn Q s u n ≤ B) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalUSeminormErrorAverage Q u s η n ≤ + η * B := by + rw [weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_eq_eta_mul_coarsePoincareRHSSn] + exact mul_le_mul_of_nonneg_left hbase hη_nonneg + +/-- Uniform tail bounds on `S_{m+k}` give the corresponding absorbed `u` +component bounds along the iteration tail. -/ +theorem weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_le_eta_mul_base_of_tail + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (s : ℝ) {η B : ℝ} (m k : ℕ) + (hη_nonneg : 0 ≤ η) + (hbase : ∀ l : ℕ, coarsePoincareRHSSn Q s u (m + l) ≤ B) : + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalUSeminormErrorAverage Q u s η (m + k) ≤ + η * B := by + exact weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_le_eta_mul_base + Q u s (m + k) hη_nonneg (hbase k) + +/-- Any scaled varying-cube harmonic-remainder bound gives the corresponding +weighted absorbed harmonic component bound after multiplying by `η`. -/ +theorem weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_le_eta_mul_base + {d : ℕ} (Q : TriadicCube d) + (v : TriadicCube d → Vec d → Vec d) (s : ℝ) {η B : ℝ} (n : ℕ) + (hη_nonneg : 0 ≤ η) + (hbase : weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v n ≤ B) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η n ≤ + η * B := by + rw [weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_eq_eta_mul_harmonicRemainderScaled] + exact mul_le_mul_of_nonneg_left hbase hη_nonneg + +/-- Uniform tail bounds on the scaled harmonic-remainder seminorm give the +corresponding absorbed harmonic component bounds along the iteration tail. -/ +theorem weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_le_eta_mul_base_of_tail + {d : ℕ} (Q : TriadicCube d) + (v : TriadicCube d → Vec d → Vec d) (s : ℝ) {η B : ℝ} (m k : ℕ) + (hη_nonneg : 0 ≤ η) + (hbase : ∀ l : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + l) ≤ B) : + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η (m + k) ≤ + η * B := by + exact weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_le_eta_mul_base + Q v s (m + k) hη_nonneg (hbase k) + +/-- Descendant average of the absorbed centered-forcing component. -/ +noncomputable def weakFluxRHSLocalForceErrorAverage {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : ℝ := + descendantsAverage Q n fun R => + weakFluxRHSLocalForceError R a g s η + +/-- Average forcing component controlled by a uniform multiplier-square bound. -/ +theorem weakFluxRHSLocalForceErrorAverage_le_of_multiplierSqBound {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) {η : ℝ} (n : ℕ) {K2 : ℝ} + (hη : 0 < η) + (hmult : + ∀ R ∈ descendantsAtDepth Q n, + (weakFluxRHSLocalForceMultiplier R a s) ^ 2 ≤ K2) : + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ + 2 * η⁻¹ * + (K2 * + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)) := by + have hfactor_nonneg : 0 ≤ 2 * η⁻¹ := + mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le) + unfold weakFluxRHSLocalForceErrorAverage + calc + descendantsAverage Q n (fun R => weakFluxRHSLocalForceError R a g s η) + ≤ + descendantsAverage Q n + (fun R => + 2 * η⁻¹ * + (K2 * (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)) := by + refine descendantsAverage_le_descendantsAverage Q n ?_ + intro R hR + unfold weakFluxRHSLocalForceError + calc + 2 * η⁻¹ * + ((weakFluxRHSLocalForceMultiplier R a s * + weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) + = + 2 * η⁻¹ * + ((weakFluxRHSLocalForceMultiplier R a s) ^ 2 * + (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + ring + _ ≤ + 2 * η⁻¹ * + (K2 * (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right (hmult R hR) (sq_nonneg _)) + hfactor_nonneg + _ = + 2 * η⁻¹ * + (K2 * + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)) := by + rw [descendantsAverage_smul Q n (2 * η⁻¹) + (fun R => K2 * (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)] + rw [descendantsAverage_smul Q n K2 + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)] + +/-- Average forcing component controlled by a multiplier bound and an averaged +centered-force bound. -/ +theorem weakFluxRHSLocalForceErrorAverage_le_of_multiplierSqBound_of_centeredForceAverageBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (s : ℝ) {η : ℝ} (n : ℕ) {K2 B : ℝ} + (hη : 0 < η) + (hK2 : 0 ≤ K2) + (hmult : + ∀ R ∈ descendantsAtDepth Q n, + (weakFluxRHSLocalForceMultiplier R a s) ^ 2 ≤ K2) + (hforceAvg : + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B) : + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ + 2 * η⁻¹ * (K2 * B) := by + have hfactor_nonneg : 0 ≤ 2 * η⁻¹ := + mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le) + have hcoef_nonneg : 0 ≤ 2 * η⁻¹ * K2 := + mul_nonneg hfactor_nonneg hK2 + calc + weakFluxRHSLocalForceErrorAverage Q a g s η n + ≤ + 2 * η⁻¹ * + (K2 * + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2)) := by + exact weakFluxRHSLocalForceErrorAverage_le_of_multiplierSqBound + Q a g s n hη hmult + _ = + (2 * η⁻¹ * K2) * + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) := by + ring + _ ≤ (2 * η⁻¹ * K2) * B := by + exact mul_le_mul_of_nonneg_left hforceAvg hcoef_nonneg + _ = 2 * η⁻¹ * (K2 * B) := by + ring + +/-- Average forcing component localized to the parent half-scale multiplier +under an averaged centered-force bound. -/ +theorem weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_of_centeredForceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s η lam Lam : ℝ} (n : ℕ) {B : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hforceAvg : + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B) : + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ + 2 * η⁻¹ * ((weakFluxRHSParentHalfForceMultiplier Q a s n) ^ 2 * B) := by + refine + weakFluxRHSLocalForceErrorAverage_le_of_multiplierSqBound_of_centeredForceAverageBound + Q a g s n hη (sq_nonneg _) ?_ hforceAvg + intro R hR + exact + weakFluxRHSLocalForceMultiplier_sq_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a n hs hR hEll hData hsum_half + +/-- The weak-flux centered forcing seminorm agrees with the uncentered +positive Besov seminorm under the standard descendant `MemLp` assumptions. -/ +theorem weakFluxRHSLocalCenteredForceSeminorm_eq_uncentered_of_mem + {d : ℕ} {Q R : TriadicCube d} (g : Vec d → Vec d) (s : ℝ) {n : ℕ} + (hR : R ∈ descendantsAtDepth Q n) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) : + weakFluxRHSLocalCenteredForceSeminorm R g s = + cubeBesovPositiveVectorSeminormTwo R s g := by + simpa [weakFluxRHSLocalCenteredForceSeminorm, + coarsePoincareRHSLocalCenteredForceSeminorm] using + coarsePoincareRHSLocalCenteredForceSeminorm_eq_uncentered_of_mem + (Q := Q) (R := R) g s hR hmem + +/-- Descendant averages of weak-flux centered forcing seminorms agree with +uncentered positive-Besov averages under the standard `MemLp` assumptions. -/ +theorem descendantsAverage_sq_weakFluxRHSLocalCenteredForceSeminorm_eq_of_mem + {d : ℕ} (Q : TriadicCube d) (g : Vec d → Vec d) (s : ℝ) (n : ℕ) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) : + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) = + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) := by + simpa [weakFluxRHSLocalCenteredForceSeminorm, + coarsePoincareRHSLocalCenteredForceSeminorm] using + descendantsAverage_sq_coarsePoincareRHSLocalCenteredForceSeminorm_eq_of_mem + Q g s n hmem + +/-- Average forcing component localized to the parent half-scale multiplier +under an averaged uncentered-force bound. -/ +theorem weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_of_forceAverageBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s η lam Lam : ℝ} (n : ℕ) {B : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hforceAvg : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ B) : + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ + 2 * η⁻¹ * ((weakFluxRHSParentHalfForceMultiplier Q a s n) ^ 2 * B) := by + have hcentered : + descendantsAverage Q n + (fun R => (weakFluxRHSLocalCenteredForceSeminorm R g s) ^ 2) ≤ B := by + rw [descendantsAverage_sq_weakFluxRHSLocalCenteredForceSeminorm_eq_of_mem + Q g s n hmem] + exact hforceAvg + exact + weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_of_centeredForceAverageBound + Q a g n hs hη hEll hData hsum_half hcentered + +/-- Average forcing component localized to the parent half-scale multiplier and +the global positive-Besov forcing bound. -/ +theorem weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_globalForceBound + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s η lam Lam : ℝ} (n : ℕ) + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1)) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + weakFluxRHSLocalForceErrorAverage Q a g s η n ≤ + 2 * η⁻¹ * + ((weakFluxRHSParentHalfForceMultiplier Q a s n) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s n) := by + have hforceAvg : + descendantsAverage Q n + (fun R => (cubeBesovPositiveVectorSeminormTwo R s g) ^ 2) ≤ + coarsePoincareRHSGlobalForceBound Q g s n := + descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + Q g s n hGlobalBdd hLocalBdd + exact + weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_of_forceAverageBound + Q a g n hs hη hEll hData hsum_half hmem hforceAvg + +/-- Depth-weighted parent-localized weak-flux forcing base. -/ +noncomputable def weakFluxRHSWeightedGlobalForceBase {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s n * + (2 * η⁻¹ * + ((weakFluxRHSParentHalfForceMultiplier Q a s n) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s n)) + +/-- The depth-weighted parent-localized weak-flux forcing base is nonnegative +for positive absorption parameter. -/ +theorem weakFluxRHSWeightedGlobalForceBase_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s : ℝ) {η : ℝ} (hη : 0 < η) (n : ℕ) : + 0 ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η n := by + unfold weakFluxRHSWeightedGlobalForceBase + refine mul_nonneg ?_ ?_ + · unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · refine mul_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le) + · refine mul_nonneg (sq_nonneg _) ?_ + unfold coarsePoincareRHSGlobalForceBound + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) (sq_nonneg _) + +/-- The weighted weak-flux forcing base decays by `3^{-s}` when the depth is +incremented. -/ +theorem weakFluxRHSWeightedGlobalForceBase_succ + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s η : ℝ) (n : ℕ) : + weakFluxRHSWeightedGlobalForceBase Q a g s η (n + 1) = + Real.rpow (3 : ℝ) (-s) * + weakFluxRHSWeightedGlobalForceBase Q a g s η n := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hdepth : + coarsePoincareRHSDepthWeight s (n + 1) = + Real.rpow (3 : ℝ) (-s) * coarsePoincareRHSDepthWeight s n := by + simpa [coarsePoincareRHSStepDiscount] using + coarsePoincareRHSDepthWeight_succ s n + have hmult := + weakFluxRHSParentHalfForceMultiplier_succ Q a s n + have hforce := + coarsePoincareRHSGlobalForceBound_succ Q g s n + have hfactor : + Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) s) ^ 2 * + Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) (-s) := by + have hsq : + (Real.rpow (3 : ℝ) s) ^ 2 = + Real.rpow (3 : ℝ) (2 * s) := by + calc + (Real.rpow (3 : ℝ) s) ^ 2 = + Real.rpow (3 : ℝ) s * Real.rpow (3 : ℝ) s := by + ring + _ = Real.rpow (3 : ℝ) (s + s) := by + exact (Real.rpow_add h3 s s).symm + _ = Real.rpow (3 : ℝ) (2 * s) := by + congr 1 + ring + have hsum1 : + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (2 * s) = + Real.rpow (3 : ℝ) (-s + 2 * s) := by + simpa using (Real.rpow_add h3 (-s) (2 * s)).symm + have hsum2 : + Real.rpow (3 : ℝ) (-s + 2 * s) * Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) ((-s + 2 * s) + -2 * s) := by + simpa using (Real.rpow_add h3 (-s + 2 * s) (-2 * s)).symm + calc + Real.rpow (3 : ℝ) (-s) * (Real.rpow (3 : ℝ) s) ^ 2 * + Real.rpow (3 : ℝ) (-2 * s) = + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (2 * s) * + Real.rpow (3 : ℝ) (-2 * s) := by + rw [hsq] + _ = Real.rpow (3 : ℝ) (-s + 2 * s) * Real.rpow (3 : ℝ) (-2 * s) := by + rw [hsum1] + _ = Real.rpow (3 : ℝ) ((-s + 2 * s) + -2 * s) := by + rw [hsum2] + _ = Real.rpow (3 : ℝ) (-s) := by + congr 1 + ring + unfold weakFluxRHSWeightedGlobalForceBase + rw [hdepth, hmult, hforce] + nth_rewrite 2 [← hfactor] + ring + +/-- The weighted weak-flux forcing base at depth `m + k` is the depth-`m` base +times `3^{-s}` to the `k`. -/ +theorem weakFluxRHSWeightedGlobalForceBase_add_eq_base_mul_ratio_pow + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + (s η : ℝ) (m k : ℕ) : + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + k) = + weakFluxRHSWeightedGlobalForceBase Q a g s η m * + (Real.rpow (3 : ℝ) (-s)) ^ k := by + induction k with + | zero => + simp + | succ k ih => + calc + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + (k + 1)) + = + weakFluxRHSWeightedGlobalForceBase Q a g s η ((m + k) + 1) := by + rw [Nat.add_assoc] + _ = + Real.rpow (3 : ℝ) (-s) * + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + k) := by + rw [weakFluxRHSWeightedGlobalForceBase_succ] + _ = + Real.rpow (3 : ℝ) (-s) * + (weakFluxRHSWeightedGlobalForceBase Q a g s η m * + (Real.rpow (3 : ℝ) (-s)) ^ k) := by + rw [ih] + _ = + weakFluxRHSWeightedGlobalForceBase Q a g s η m * + (Real.rpow (3 : ℝ) (-s)) ^ (k + 1) := by + rw [pow_succ] + ring + +/-- The weighted weak-flux forcing base decreases along descendants when +`s > 0`. -/ +theorem weakFluxRHSWeightedGlobalForceBase_add_le_base + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s η : ℝ} (m k : ℕ) (hs : 0 < s) (hη : 0 < η) : + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + k) ≤ + weakFluxRHSWeightedGlobalForceBase Q a g s η m := by + have hbase_nonneg : + 0 ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η m := by + unfold weakFluxRHSWeightedGlobalForceBase + refine mul_nonneg ?_ ?_ + · unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · refine mul_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) (inv_nonneg.mpr hη.le) + · exact mul_nonneg (sq_nonneg _) + (by + unfold coarsePoincareRHSGlobalForceBound + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg _)) (sq_nonneg _)) + have hratio_nonneg : 0 ≤ Real.rpow (3 : ℝ) (-s) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hratio_le_one : Real.rpow (3 : ℝ) (-s) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) (by linarith) + have hpow_le_one : (Real.rpow (3 : ℝ) (-s)) ^ k ≤ 1 := + pow_le_one₀ hratio_nonneg hratio_le_one + calc + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + k) + = + weakFluxRHSWeightedGlobalForceBase Q a g s η m * + (Real.rpow (3 : ℝ) (-s)) ^ k := by + rw [weakFluxRHSWeightedGlobalForceBase_add_eq_base_mul_ratio_pow] + _ ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η m * 1 := by + exact mul_le_mul_of_nonneg_left hpow_le_one hbase_nonneg + _ = weakFluxRHSWeightedGlobalForceBase Q a g s η m := by + ring + +/-- The localized force-error average supplies the uniform component-base input +needed by the weak-flux global wrappers. -/ +theorem weakFluxRHSDepthWeight_mul_forceErrorAverage_le_weightedGlobalForceBase + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s η lam Lam : ℝ} (m k : ℕ) + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ R ∈ descendantsAtDepth Q (m + k), + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) : + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalForceErrorAverage Q a g s η (m + k) ≤ + weakFluxRHSWeightedGlobalForceBase Q a g s η m := by + have hlocal := + weakFluxRHSLocalForceErrorAverage_le_parentHalfLambda_globalForceBound + Q a g (m + k) hs hη hEll hData hsum_half hmem hGlobalBdd hLocalBdd + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s (m + k) := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + calc + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalForceErrorAverage Q a g s η (m + k) + ≤ + coarsePoincareRHSDepthWeight s (m + k) * + (2 * η⁻¹ * + ((weakFluxRHSParentHalfForceMultiplier Q a s (m + k)) ^ 2 * + coarsePoincareRHSGlobalForceBound Q g s (m + k))) := by + exact mul_le_mul_of_nonneg_left hlocal hweight_nonneg + _ = + weakFluxRHSWeightedGlobalForceBase Q a g s η (m + k) := by + rfl + _ ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η m := + weakFluxRHSWeightedGlobalForceBase_add_le_base Q a g m k hs hη + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedGlobalIteration.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedGlobalIteration.lean new file mode 100644 index 0000000000..512dd07550 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedGlobalIteration.lean @@ -0,0 +1,548 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedRecurrences + +/-! # Absorbed Global Iteration -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Scaled bounded-tail weak-flux iteration with the explicit +corrector-energy local error as the recurrence error. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_correctorEnergyLocalError_base_mul_inv_one_sub_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) ≤ B) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + exact + weakFluxRHSScaledAveragedSeminormSq_le_base_mul_inv_one_sub_of_bddAbove + Q a s u + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + hs hlocal m hBdd hB_nonneg hterm + +/-- Scaled bounded-tail weak-flux iteration where the corrector-energy local +error is controlled by separate averaged coefficient-energy bases. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_correctorEnergyComponents_base_mul_inv_one_sub_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + (m : ℕ) {Bcoeff Bcorr : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hBcoeff_nonneg : 0 ≤ Bcoeff) + (hBcorr_nonneg : 0 ≤ Bcorr) + (hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s (m + k) ≤ Bcoeff) + (hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s (m + k) ≤ Bcorr) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + (Bcoeff + Bcorr) * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + refine + weakFluxRHSScaledAveragedSeminormSq_le_correctorEnergyLocalError_base_mul_inv_one_sub_of_bddAbove + Q a s u z hs hlocal m hBdd (add_nonneg hBcoeff_nonneg hBcorr_nonneg) ?_ + intro k + exact + weakFluxRHSCorrectorEnergyErrorAverage_weighted_le_add_of_components + Q a u z s (m + k) (hcoeff k) (hcorr k) + +/-- Localized flux-defect form of the scaled bounded-tail weak-flux iteration +with the explicit corrector-energy local-error envelope. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_correctorEnergyLocalError_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_base_mul_inv_one_sub_bddAbove + Q a s u + (fun R => weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + hs hlocal m hBdd hB_nonneg hterm + +/-- Localized flux-defect form with separate corrector-energy component bases. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_correctorEnergyComponents_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (z : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s) + (m : ℕ) {Bcoeff Bcorr : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hBcoeff_nonneg : 0 ≤ Bcoeff) + (hBcorr_nonneg : 0 ≤ Bcorr) + (hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s (m + k) ≤ Bcoeff) + (hcorr : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s (m + k) ≤ Bcorr) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((Bcoeff + Bcorr) * (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + refine + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_correctorEnergyLocalError_bddAbove + Q a s u z hs hlocal m hBdd + (add_nonneg hBcoeff_nonneg hBcorr_nonneg) ?_ + intro k + exact + weakFluxRHSCorrectorEnergyErrorAverage_weighted_le_add_of_components + Q a u z s (m + k) (hcoeff k) (hcorr k) + +/-- Scaled bounded-tail weak-flux iteration with the explicit absorbed local +error as the recurrence error. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_absorbedLocalError_base_mul_inv_one_sub_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s η : ℝ) + (u g : Vec d → Vec d) (v : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) ≤ B) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + exact + weakFluxRHSScaledAveragedSeminormSq_le_base_mul_inv_one_sub_of_bddAbove + Q a s u + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + hs hlocal m hBdd hB_nonneg hterm + +/-- Scaled bounded-tail weak-flux iteration where the absorbed local error is +controlled by separate averaged component bases. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_absorbedComponents_base_mul_inv_one_sub_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s η : ℝ) + (u g : Vec d → Vec d) (v : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {Bcoeff Bu Bv Bforce : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hBcoeff_nonneg : 0 ≤ Bcoeff) + (hBu_nonneg : 0 ≤ Bu) + (hBv_nonneg : 0 ≤ Bv) + (hBforce_nonneg : 0 ≤ Bforce) + (hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s (m + k) ≤ Bcoeff) + (hu : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalUSeminormErrorAverage Q u s η (m + k) ≤ Bu) + (hv : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η (m + k) ≤ Bv) + (hforce : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalForceErrorAverage Q a g s η (m + k) ≤ Bforce) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + (Bcoeff + Bu + Bv + Bforce) * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hB_nonneg : 0 ≤ Bcoeff + Bu + Bv + Bforce := + add_nonneg (add_nonneg (add_nonneg hBcoeff_nonneg hBu_nonneg) hBv_nonneg) + hBforce_nonneg + refine + weakFluxRHSScaledAveragedSeminormSq_le_absorbedLocalError_base_mul_inv_one_sub_of_bddAbove + Q a s η u g v hs hlocal m hBdd hB_nonneg ?_ + intro k + exact + weakFluxRHSAbsorbedErrorAverage_weighted_le_add_of_components + Q a g u v s η (m + k) (hcoeff k) (hu k) (hv k) (hforce k) + +/-- Localized flux-defect form of the scaled bounded-tail weak-flux iteration +with the explicit absorbed local-error envelope. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalError_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s η : ℝ) + (u g : Vec d → Vec d) (v : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_base_mul_inv_one_sub_bddAbove + Q a s u + (fun R => weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + hs hlocal m hBdd hB_nonneg hterm + +/-- Localized flux-defect form with separate absorbed component bases. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedComponents_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s η : ℝ) + (u g : Vec d → Vec d) (v : TriadicCube d → Vec d → Vec d) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {Bcoeff Bu Bv Bforce : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hBcoeff_nonneg : 0 ≤ Bcoeff) + (hBu_nonneg : 0 ≤ Bu) + (hBv_nonneg : 0 ≤ Bv) + (hBforce_nonneg : 0 ≤ Bforce) + (hcoeff : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalCoefficientEnergyErrorAverage Q a u s (m + k) ≤ Bcoeff) + (hu : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalUSeminormErrorAverage Q u s η (m + k) ≤ Bu) + (hv : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalHarmonicSeminormErrorAverage Q v s η (m + k) ≤ Bv) + (hforce : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + weakFluxRHSLocalForceErrorAverage Q a g s η (m + k) ≤ Bforce) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((Bcoeff + Bu + Bv + Bforce) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hB_nonneg : 0 ≤ Bcoeff + Bu + Bv + Bforce := + add_nonneg (add_nonneg (add_nonneg hBcoeff_nonneg hBu_nonneg) hBv_nonneg) + hBforce_nonneg + refine + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalError_bddAbove + Q a s η u g v hs hlocal m hBdd hB_nonneg ?_ + intro k + exact + weakFluxRHSAbsorbedErrorAverage_weighted_le_add_of_components + Q a g u v s η (m + k) (hcoeff k) (hu k) (hv k) (hforce k) + +/-- Scaled bounded-tail weak-flux iteration with all localized absorbed +component bases supplied by the coefficient, `u`, harmonic-remainder, and +forcing base estimates. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_absorbedLocalizedBases_mul_inv_one_sub_of_bddAbove + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (u g : Vec d → Vec d) + (v : TriadicCube d → Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) + (hv : + ∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ BV) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + (weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hcoeff_nonneg : + 0 ≤ weakFluxRHSWeightedCoefficientEnergyBase Q a u s := + weakFluxRHSWeightedCoefficientEnergyBase_nonneg Q a u hs havg_parent_nonneg + have hBU_component_nonneg : 0 ≤ η * BU := + mul_nonneg hη.le hBU_nonneg + have hBV_component_nonneg : 0 ≤ η * BV := + mul_nonneg hη.le hBV_nonneg + have hforce_nonneg : + 0 ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η m := + weakFluxRHSWeightedGlobalForceBase_nonneg Q a g s hη m + refine + weakFluxRHSScaledAveragedSeminormSq_le_absorbedComponents_base_mul_inv_one_sub_of_bddAbove + (Q := Q) (a := a) (s := s) (η := η) (u := u) (g := g) (v := v) + (m := m) (Bcoeff := weakFluxRHSWeightedCoefficientEnergyBase Q a u s) + (Bu := η * BU) (Bv := η * BV) + (Bforce := weakFluxRHSWeightedGlobalForceBase Q a g s η m) + hs hlocal hBdd hcoeff_nonneg hBU_component_nonneg hBV_component_nonneg + hforce_nonneg ?_ ?_ ?_ ?_ + · intro k + exact + weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_weightedCoefficientEnergyBase + Q a u (m + k) hs hEll hData hsum_half (havg_nonneg (m + k)) hint + · intro k + exact + weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_le_eta_mul_base_of_tail + (Q := Q) (u := u) (s := s) (η := η) (B := BU) + (m := m) (k := k) hη.le hu + · intro k + exact + weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_le_eta_mul_base_of_tail + (Q := Q) (v := v) (s := s) (η := η) (B := BV) + (m := m) (k := k) hη.le hv + · intro k + exact + weakFluxRHSDepthWeight_mul_forceErrorAverage_le_weightedGlobalForceBase + Q a g m k hs hη hEll hData hsum_half hmem hGlobalBdd + (hLocalBdd (m + k)) + +/-- Localized flux-defect form with all localized absorbed component bases +supplied by the coefficient, `u`, harmonic-remainder, and forcing base +estimates. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedBases_bddAbove + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s η : ℝ) (u g : Vec d → Vec d) + (v : TriadicCube d → Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) + (hv : + ∀ k : ℕ, + weakFluxRHSHarmonicRemainderScaledAveragedSeminormSq Q s v (m + k) ≤ BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + ((weakFluxRHSWeightedCoefficientEnergyBase Q a u s + + η * BU + η * BV + weakFluxRHSWeightedGlobalForceBase Q a g s η m) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + have hcoeff_nonneg : + 0 ≤ weakFluxRHSWeightedCoefficientEnergyBase Q a u s := + weakFluxRHSWeightedCoefficientEnergyBase_nonneg Q a u hs havg_parent_nonneg + have hBU_component_nonneg : 0 ≤ η * BU := + mul_nonneg hη.le hBU_nonneg + have hBV_component_nonneg : 0 ≤ η * BV := + mul_nonneg hη.le hBV_nonneg + have hforce_nonneg : + 0 ≤ weakFluxRHSWeightedGlobalForceBase Q a g s η m := + weakFluxRHSWeightedGlobalForceBase_nonneg Q a g s hη m + refine + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedComponents_bddAbove + (Q := Q) (a := a) (s := s) (η := η) (u := u) (g := g) (v := v) + (m := m) (Bcoeff := weakFluxRHSWeightedCoefficientEnergyBase Q a u s) + (Bu := η * BU) (Bv := η * BV) + (Bforce := weakFluxRHSWeightedGlobalForceBase Q a g s η m) + hs hlocal hBdd hcoeff_nonneg hBU_component_nonneg hBV_component_nonneg + hforce_nonneg ?_ ?_ ?_ ?_ + · intro k + exact + weakFluxRHSDepthWeight_mul_coefficientEnergyErrorAverage_le_weightedCoefficientEnergyBase + Q a u (m + k) hs hEll hData hsum_half (havg_nonneg (m + k)) hint + · intro k + exact + weakFluxRHSDepthWeight_mul_uSeminormErrorAverage_le_eta_mul_base_of_tail + (Q := Q) (u := u) (s := s) (η := η) (B := BU) + (m := m) (k := k) hη.le hu + · intro k + exact + weakFluxRHSDepthWeight_mul_harmonicSeminormErrorAverage_le_eta_mul_base_of_tail + (Q := Q) (v := v) (s := s) (η := η) (B := BV) + (m := m) (k := k) hη.le hv + · intro k + exact + weakFluxRHSDepthWeight_mul_forceErrorAverage_le_weightedGlobalForceBase + Q a g m k hs hη hEll hData hsum_half hmem hGlobalBdd + (hLocalBdd (m + k)) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteApex.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteApex.lean new file mode 100644 index 0000000000..9649f10403 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteApex.lean @@ -0,0 +1,412 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteConstants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity + +/-! # Absorbed Note Apex -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Square-root bridge from the note-base weak-flux apex to the expanded +note-constant energy/seminorm forcing RHS. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_noteBase + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (m : ℕ) {BU BV : ℝ} + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hmain : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹))) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hbase : + weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_noteEnergySeminormsForce + Q a u g hs hs_le m havg_nonneg hBU_nonneg hBV_nonneg + have hweight_nonneg : 0 ≤ (coarsePoincareRHSDepthWeight s m)⁻¹ := by + refine inv_nonneg.mpr ?_ + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + exact + hmain.trans + (Real.sqrt_le_sqrt (mul_le_mul_of_nonneg_left hbase hweight_nonneg)) + +/-- +Parent potential/solenoidal note-facing weak-flux RHS apex with the absorbed +base expanded into the manuscript energy/seminorm forcing RHS. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (u g : Vec d → Vec d) {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu : + ∀ k : ℕ, coarsePoincareRHSSn Q s u (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hmain : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedNoteBase_of_parent_potential_solenoidal_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (u := u) (g := g) (lam := lam) + (Lam := Lam) hs hu_potential hu_residual hEll_desc hu_mem_desc + hg_mem_desc hC_desc hData_desc hsum_desc hchildBdd huBdd_desc + hgBdd_centered_desc (m := m) hBdd hEll_open hData hsum_half + havg_parent_nonneg havg_nonneg hint hmem hGlobalBdd hLocalBdd + hBU_nonneg hBV_nonneg hu hvConstructed + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_noteBase + Q a u g hs hs_le m havg_parent_nonneg hBU_nonneg hBV_nonneg hmain + +/-- +H¹ weak-solution note-facing weak-flux RHS apex with the absorbed base expanded +into the manuscript energy/seminorm forcing RHS. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g)) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hmain : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (weakFluxRHSAbsorbedLocalizedNoteBase Q a u.grad g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_absorbedLocalizedNoteBase_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + (Q := Q) (a := a) (s := s) (g := g) (u := u) (lam := lam) + (Lam := Lam) hs hweak hEll_desc hu_mem_desc hg_mem_desc hC_desc + hData_desc hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc (m := m) + hBdd hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint + hmem hGlobalBdd hLocalBdd hBU_nonneg hBV_nonneg hu_tail hvConstructed + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_noteBase + Q a u.grad g hs hs_le m havg_parent_nonneg hBU_nonneg hBV_nonneg hmain + +/-- +H¹ weak-solution note-facing weak-flux RHS apex with the RHS `H^s` regularity +data compressed to the manuscript-facing package. +-/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds_of_cubeVectorBesovHRegularity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (s : ℝ) (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) + {lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hweak : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hEll_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u.grad) + (hg_mem_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u.grad)) + (hgBdd_centered_desc : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) + (m : ℕ) {BU BV : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u.grad n)) + (hEll_open : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum_half : + Summable (fun l : ℕ => + geometricWeight (s / 2) 2 l * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (l : ℤ)) a) 1)) + (havg_parent_nonneg : + 0 ≤ cubeAverage Q (coefficientEnergyDensity a u.grad)) + (havg_nonneg : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + 0 ≤ cubeAverage R (coefficientEnergyDensity a u.grad)) + (hint : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u.grad) (cubeSet Q) + MeasureTheory.volume) + (hg : CubeVectorBesovHRegularity Q s g) + (hBU_nonneg : 0 ≤ BU) + (hBV_nonneg : 0 ≤ BV) + (hu_tail : + ∀ k : ℕ, coarsePoincareRHSSn Q s u.grad (m + k) ≤ BU) + (hvConstructed : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + ∀ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∀ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x)) ^ 2 ≤ + (coarsePoincareRHSDepthWeight s j)⁻¹ * BV) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u.grad x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2)) := by + have hmem : + ∀ j : ℕ, ∀ S ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure S) := by + intro j S hS + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hS hg.memLp + have hLocalBdd : + ∀ n : ℕ, ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro n R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hg.partialSeminorms_bddAbove + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_noteEnergySeminormsForce_of_h1DirichletRhsWeakSolutionOn_of_constructed_harmonicRemainder_bounds + Q a s g u hs hs_le hweak hEll_desc hu_mem_desc hg_mem_desc hC_desc + hData_desc hsum_desc hchildBdd huBdd_desc hgBdd_centered_desc m hBdd + hEll_open hData hsum_half havg_parent_nonneg havg_nonneg hint hmem + hg.partialSeminorms_bddAbove hLocalBdd hBU_nonneg hBV_nonneg hu_tail + hvConstructed + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteConstants.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteConstants.lean new file mode 100644 index 0000000000..b9f340f228 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedNoteConstants.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedApex + +/-! # Absorbed Note Constants -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem coarsePoincareRHSNoteEta_le_one {s : ℝ} (hs : 0 < s) : + coarsePoincareRHSNoteEta s ≤ 1 := by + have hη_lt_half := coarsePoincareRHSNoteEta_lt_half hs + linarith + +/-- Reciprocal bound for the note absorption parameter used by the weak-flux +forcing component. -/ +theorem coarsePoincareRHSNoteEta_inv_le_ten_inv {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (coarsePoincareRHSNoteEta s)⁻¹ ≤ 10 * s⁻¹ := by + let r : ℝ := Real.rpow (3 : ℝ) (-s / 2) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : 1 < (3 : ℝ)) (by linarith) + have hnum_pos : 0 < 1 - r := by linarith + have hden_pos : 0 < 2 - r := by linarith + have hnum_ne : + 1 - Real.rpow (3 : ℝ) (-s / 2) ≠ 0 := by + simpa [r] using hnum_pos.ne' + have hden_ne : + 2 - Real.rpow (3 : ℝ) (-s / 2) ≠ 0 := by + simpa [r] using hden_pos.ne' + have hinv_eq : + (coarsePoincareRHSNoteEta s)⁻¹ = (2 - r) * (1 - r)⁻¹ := by + unfold coarsePoincareRHSNoteEta + dsimp [r] + field_simp [hnum_ne, hden_ne] + have hinv_nonneg : 0 ≤ (1 - r)⁻¹ := inv_nonneg.mpr hnum_pos.le + have htwo_sub_le : 2 - r ≤ 2 := by linarith + have hmul_le : + (2 - r) * (1 - r)⁻¹ ≤ 2 * (1 - r)⁻¹ := + mul_le_mul_of_nonneg_right htwo_sub_le hinv_nonneg + have htail : + (1 - r)⁻¹ ≤ 5 * s⁻¹ := by + simpa [r] using inv_one_sub_rpow_three_neg_half_le_five_inv hs hs_le + calc + (coarsePoincareRHSNoteEta s)⁻¹ = (2 - r) * (1 - r)⁻¹ := hinv_eq + _ ≤ 2 * (1 - r)⁻¹ := hmul_le + _ ≤ 2 * (5 * s⁻¹) := mul_le_mul_of_nonneg_left htail (by norm_num) + _ = 10 * s⁻¹ := by ring + +/-- The note-eta scalar seminorm component is bounded by the weak-flux +geometric-tail constant. -/ +theorem weakFluxRHSNoteEtaComponent_mul_inv_one_sub_step_le_five_inv_mul + {s B : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (hB_nonneg : 0 ≤ B) : + (coarsePoincareRHSNoteEta s * B) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + (5 * s⁻¹) * B := by + let H : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let K : ℝ := 5 * s⁻¹ + have hH_nonneg : 0 ≤ H := by + dsimp [H] + have hr_lt_one : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hH_le : H ≤ K := by + dsimp [H, K] + exact inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have hη_le_one : coarsePoincareRHSNoteEta s ≤ 1 := + coarsePoincareRHSNoteEta_le_one hs + have hηH_le : coarsePoincareRHSNoteEta s * H ≤ K := by + calc + coarsePoincareRHSNoteEta s * H ≤ 1 * H := + mul_le_mul_of_nonneg_right hη_le_one hH_nonneg + _ = H := by ring + _ ≤ K := hH_le + calc + (coarsePoincareRHSNoteEta s * B) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + (coarsePoincareRHSNoteEta s * H) * B := by + simp [H] + ring + _ ≤ K * B := mul_le_mul_of_nonneg_right hηH_le hB_nonneg + _ = (5 * s⁻¹) * B := by + simp [K] + +/-- Note-constant expansion of the localized weak-flux base with the forcing +component left as a separately supplied bound. -/ +theorem weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_noteEnergySeminorms_of_force + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (m : ℕ) {BU BV Bforce : ℝ} + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) + (hforce : + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ Bforce) : + weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + Bforce := by + exact + weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_of_components + Q a u g s m BU BV + (50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u)) + ((5 * s⁻¹) * BU) ((5 * s⁻¹) * BV) Bforce + (weakFluxRHSWeightedCoefficientEnergyBase_mul_inv_one_sub_step_le_noteEnergySquare + Q a u hs hs_le havg_nonneg) + (weakFluxRHSNoteEtaComponent_mul_inv_one_sub_step_le_five_inv_mul + hs hs_le hBU_nonneg) + (weakFluxRHSNoteEtaComponent_mul_inv_one_sub_step_le_five_inv_mul + hs hs_le hBV_nonneg) + hforce + +/-- Note-constant square-envelope for the weighted global forcing component at +the parent depth. -/ +theorem weakFluxRHSWeightedGlobalForceBase_noteEta_zero_mul_inv_one_sub_step_le_noteForceSquare + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) : + weakFluxRHSWeightedGlobalForceBase Q a g s (coarsePoincareRHSNoteEta s) 0 * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let E : ℝ := (coarsePoincareRHSNoteEta s)⁻¹ + let G : ℝ := (geometricDiscount s 2)⁻¹ + let H : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let K : ℝ := 5 * s⁻¹ + let L : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let M : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let B : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let F : ℝ := L ^ 2 * M ^ 2 * B ^ 2 + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact inv_nonneg.mpr (coarsePoincareRHSNoteEta_pos hs).le + have hE_le : E ≤ 10 * s⁻¹ := by + dsimp [E] + exact coarsePoincareRHSNoteEta_inv_le_ten_inv hs hs_le + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact inv_nonneg.mpr + (le_of_lt (geometricDiscount_pos (by nlinarith : 0 < s * 2))) + have hG_le : G ≤ K := by + dsimp [G, K] + exact inv_geometricDiscount_two_le_five_inv hs hs_le + have hG_sq : G ^ 2 ≤ K ^ 2 := + pow_le_pow_left₀ hG_nonneg hG_le 2 + have hH_nonneg : 0 ≤ H := by + dsimp [H] + have hr_lt_one : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + have hH_le : H ≤ K := by + dsimp [H, K] + exact inv_one_sub_rpow_three_neg_le_five_inv hs hs_le + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hEbound_nonneg : 0 ≤ 10 * s⁻¹ := by positivity + have hF_nonneg : 0 ≤ F := by + dsimp [F] + positivity + have hcore_le : + (G * L * M) ^ 2 * B ^ 2 ≤ K ^ 2 * F := by + calc + (G * L * M) ^ 2 * B ^ 2 = G ^ 2 * F := by + simp [F] + ring + _ ≤ K ^ 2 * F := mul_le_mul_of_nonneg_right hG_sq hF_nonneg + have hcore_nonneg : 0 ≤ (G * L * M) ^ 2 * B ^ 2 := by positivity + have hcore_bound_nonneg : 0 ≤ K ^ 2 * F := + mul_nonneg (sq_nonneg K) hF_nonneg + have hEcore_le : + E * ((G * L * M) ^ 2 * B ^ 2) ≤ + (10 * s⁻¹) * (K ^ 2 * F) := + mul_le_mul hE_le hcore_le hcore_nonneg hEbound_nonneg + have hinner_le : + 2 * E * ((G * L * M) ^ 2 * B ^ 2) ≤ + 2 * (10 * s⁻¹) * (K ^ 2 * F) := by + simpa [mul_assoc] using + mul_le_mul_of_nonneg_left hEcore_le (by norm_num : 0 ≤ (2 : ℝ)) + have hinner_bound_nonneg : + 0 ≤ 2 * (10 * s⁻¹) * (K ^ 2 * F) := by + positivity + calc + weakFluxRHSWeightedGlobalForceBase Q a g s (coarsePoincareRHSNoteEta s) 0 * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + (2 * E * ((G * L * M) ^ 2 * B ^ 2)) * H := by + simp [weakFluxRHSWeightedGlobalForceBase, + weakFluxRHSParentHalfForceMultiplier, weakFluxRHSParentHalfCoeff, + coarsePoincareRHSDepthWeight, coarsePoincareRHSGlobalForceBound, + E, G, H, L, M, B] + _ ≤ (2 * (10 * s⁻¹) * (K ^ 2 * F)) * H := + mul_le_mul_of_nonneg_right hinner_le hH_nonneg + _ ≤ (2 * (10 * s⁻¹) * (K ^ 2 * F)) * K := + mul_le_mul_of_nonneg_left hH_le hinner_bound_nonneg + _ = + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + simp [K, F, L, M, B] + ring + +/-- Note-constant square-envelope for the weighted global forcing component at +any descendant depth. -/ +theorem weakFluxRHSWeightedGlobalForceBase_noteEta_mul_inv_one_sub_step_le_noteForceSquare + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (m : ℕ) : + weakFluxRHSWeightedGlobalForceBase Q a g s (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + have hη_pos : 0 < coarsePoincareRHSNoteEta s := + coarsePoincareRHSNoteEta_pos hs + have htail_nonneg : 0 ≤ (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hr_lt_one : Real.rpow (3 : ℝ) (-s) < 1 := + Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + exact inv_nonneg.mpr (sub_nonneg.mpr hr_lt_one.le) + calc + weakFluxRHSWeightedGlobalForceBase Q a g s (coarsePoincareRHSNoteEta s) m * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + weakFluxRHSWeightedGlobalForceBase Q a g s (coarsePoincareRHSNoteEta s) 0 * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hdecay : + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) m ≤ + weakFluxRHSWeightedGlobalForceBase Q a g s + (coarsePoincareRHSNoteEta s) 0 := by + simpa using + (weakFluxRHSWeightedGlobalForceBase_add_le_base + (Q := Q) (a := a) (g := g) (s := s) + (η := coarsePoincareRHSNoteEta s) 0 m hs hη_pos) + exact mul_le_mul_of_nonneg_right hdecay htail_nonneg + _ ≤ + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := + weakFluxRHSWeightedGlobalForceBase_noteEta_zero_mul_inv_one_sub_step_le_noteForceSquare + Q a g hs hs_le + +/-- Fully expanded note-constant bound for the localized weak-flux base, with +the `u` and harmonic-remainder tails left as caller-supplied square bounds. -/ +theorem weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_noteEnergySeminormsForce + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (u g : Vec d → Vec d) + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) (m : ℕ) {BU BV : ℝ} + (havg_nonneg : 0 ≤ cubeAverage Q (coefficientEnergyDensity a u)) + (hBU_nonneg : 0 ≤ BU) (hBV_nonneg : 0 ≤ BV) : + weakFluxRHSAbsorbedLocalizedNoteBase Q a u g s m BU BV * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 50 * (s⁻¹) ^ 2 * LambdaSq Q (s / 2) (.finite 2) a * + cubeAverage Q (coefficientEnergyDensity a u) + + (5 * s⁻¹) * BU + (5 * s⁻¹) * BV + + 2500 * (s⁻¹) ^ 4 * (LambdaSq Q (s / 2) (.finite 2) a) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + exact + weakFluxRHSAbsorbedLocalizedNoteBase_mul_inv_one_sub_step_le_noteEnergySeminorms_of_force + Q a u g hs hs_le m havg_nonneg hBU_nonneg hBV_nonneg + (weakFluxRHSWeightedGlobalForceBase_noteEta_mul_inv_one_sub_step_le_noteForceSquare + Q a g hs hs_le m) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedRecurrences.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedRecurrences.lean new file mode 100644 index 0000000000..fe9a0acb1a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AbsorbedRecurrences.lean @@ -0,0 +1,729 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponentBounds + +/-! # Absorbed Recurrences -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +/-- Local weak-flux recurrence packaged with the explicit corrector-energy +local-error envelope. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_correctorEnergyLocalError_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError Q a u + (fun x => ω.toH1MeanZero.toH1Function.grad x) s := by + have hstep := + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy_of_childBddAbove + (u := u) w s hs hEll hu_mem hg hflux hsum huw hchildBdd + simpa [weakFluxRHSCorrectorEnergyLocalError, add_assoc] using hstep + +/-- Local absorbed weak-flux recurrence packaged with the explicit absorbed +local-error envelope. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_absorbedLocalError_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) {η : ℝ} (hs : 0 < s) (hη : 0 < η) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError Q a g u (fun x => w.toH1.grad x) s η := by + have hstep := + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_of_childBddAbove + (u := u) w s hs hη hEll hu_mem hg_mem hflux hsum huw + hchildBdd huBdd hwBdd hgBdd + simpa [weakFluxRHSAbsorbedLocalError, add_assoc] using hstep + +end MeanZeroNeumannCorrectorData + +/-- Descendant-cube coefficient-energy recurrence with the explicit +corrector-energy local-error envelope. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCorrectorEnergyLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + {d : ℕ} [NeZero d] {P R : TriadicCube d} (a : CoeffField d) + {n : ℕ} {lam Lam s : ℝ} {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) + (hDataR : OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u + (fun x => ω.toH1MeanZero.toH1Function.grad x) s := by + rcases + MeanZeroNeumannCorrectorData.exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (P := P) (R := R) (a := a) (n := n) + (lam := lam) (Lam := Lam) (s := s) (u := u) (g := g) + hs hu_potential hu_residual hR hEllR hu_memR hg_memR hC hDataR + hsum hchildBdd with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + simpa [weakFluxRHSCorrectorEnergyLocalError, add_assoc] using hstep + +/-- +Choose Neumann-corrector gradients on all descendants of a parent cube and +package the local corrected-energy weak-flux recurrence in the global-selector +shape consumed by the public corrected route. +-/ +theorem exists_correctorGradientSelector_fluxSeminormStepCorrectorEnergyLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s lam Lam : ℝ} {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) : + ∃ z : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) ∧ + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u (z R) s := by + classical + let IsDescendantOfQ : TriadicCube d → Prop := + fun R => ∃ n : ℕ, R ∈ descendantsAtDepth Q n + have hlocal : + ∀ R : TriadicCube d, IsDescendantOfQ R → + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError R a u + (fun x => ω.toH1MeanZero.toH1Function.grad x) s := by + intro R hRdesc + rcases hRdesc with ⟨n, hR⟩ + exact + exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCorrectorEnergyLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (P := Q) (R := R) (a := a) (n := n) + (lam := lam) (Lam := Lam) (s := s) (u := u) (g := g) + hs hu_potential hu_residual hR + (hEll R ⟨n, hR⟩) (hu_mem R ⟨n, hR⟩) (hg_mem R ⟨n, hR⟩) + (hC R ⟨n, hR⟩) (hData R ⟨n, hR⟩) (hsum R ⟨n, hR⟩) + (hchildBdd R ⟨n, hR⟩) + let z : TriadicCube d → Vec d → Vec d := + fun R => + if hR : IsDescendantOfQ R then + fun x => (Classical.choose (hlocal R hR)).toH1MeanZero.toH1Function.grad x + else + 0 + refine ⟨z, ?_, ?_⟩ + · intro R hRdesc + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocal R hRdesc) + have hz : + z R = fun x => ω.toH1MeanZero.toH1Function.grad x := by + change + (if hR : IsDescendantOfQ R then + fun x => (Classical.choose (hlocal R hR)).toH1MeanZero.toH1Function.grad x + else 0) = fun x => ω.toH1MeanZero.toH1Function.grad x + rw [dif_pos hRdesc] + exact ⟨ω, hz⟩ + · intro j R hR + have hRdesc : IsDescendantOfQ R := ⟨j, hR⟩ + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocal R hRdesc) + have hz : + z R = fun x => ω.toH1MeanZero.toH1Function.grad x := by + change + (if hR : IsDescendantOfQ R then + fun x => (Classical.choose (hlocal R hR)).toH1MeanZero.toH1Function.grad x + else 0) = fun x => ω.toH1MeanZero.toH1Function.grad x + rw [dif_pos hRdesc] + have hstep := + (Classical.choose_spec (Classical.choose_spec (hlocal R hRdesc))).2 + rw [hz] + exact hstep + +/-- Descendant-cube absorbed recurrence with the explicit absorbed local-error +envelope. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + {d : ℕ} [NeZero d] {P R : TriadicCube d} (a : CoeffField d) + {n : ℕ} {lam Lam s η : ℝ} {u g : Vec d → Vec d} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) + (hDataR : OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + rcases + MeanZeroNeumannCorrectorData.exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedShortTerm_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (P := P) (R := R) (a := a) (n := n) + (lam := lam) (Lam := Lam) (s := s) (η := η) (u := u) (g := g) + hs hη hu_potential hu_residual hR hEllR hu_memR hg_memR hC hDataR + hsum hchildBdd huBdd hgBdd with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + simpa [weakFluxRHSAbsorbedLocalError, add_assoc] using hstep hwBdd + +/-- +Choose harmonic remainders on all descendants of a parent cube and package the +absorbed weak-flux local recurrence in the global-iteration shape. + +The only remaining local assumption after the selector is chosen is +boundedness of the selected harmonic remainder's finite negative Besov +partials, exactly the boundedness input required by the local absorbed step. +-/ +theorem exists_harmonicRemainderSelector_fluxSeminormStepAbsorbedLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s η lam Lam : ℝ} {u g : Vec d → Vec d} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η := by + classical + let IsDescendantOfQ : TriadicCube d → Prop := + fun R => ∃ n : ℕ, R ∈ descendantsAtDepth Q n + have hlocal : + ∀ R : TriadicCube d, IsDescendantOfQ R → + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + intro R hRdesc + rcases hRdesc with ⟨n, hR⟩ + exact + exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (P := Q) (R := R) (a := a) (n := n) + (lam := lam) (Lam := Lam) (s := s) (η := η) (u := u) (g := g) + hs hη hu_potential hu_residual hR + (hEll R ⟨n, hR⟩) (hu_mem R ⟨n, hR⟩) (hg_mem R ⟨n, hR⟩) + (hC R ⟨n, hR⟩) (hData R ⟨n, hR⟩) (hsum R ⟨n, hR⟩) + (hchildBdd R ⟨n, hR⟩) (huBdd R ⟨n, hR⟩) (hgBdd R ⟨n, hR⟩) + let v : TriadicCube d → Vec d → Vec d := + fun R => + if hR : IsDescendantOfQ R then + fun x => (Classical.choose (Classical.choose_spec (hlocal R hR))).toH1.grad x + else + 0 + refine ⟨v, ?_⟩ + intro hvBdd j R hR + have hRdesc : IsDescendantOfQ R := ⟨j, hR⟩ + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocal R hRdesc) + let w : AHarmonicFunction a (cubeSet R) := + Classical.choose (Classical.choose_spec (hlocal R hRdesc)) + have hv : + v R = fun x => w.toH1.grad x := by + simp [v, hRdesc, w] + have hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) := by + simpa [hv] using hvBdd R hRdesc + have hspec : + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + simpa [ω, w] using + Classical.choose_spec (Classical.choose_spec (hlocal R hRdesc)) + simpa [hv] using hspec.2 hwBdd + +/-- +Choose harmonic remainders on all descendants and also expose that each +selected value is the gradient of one of the local harmonic remainders produced +by the centered Neumann-corrector construction. +-/ +theorem exists_harmonicRemainderSelector_fluxSeminormStepAbsorbedLocalError_with_decomposition_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + {s η lam Lam : ℝ} {u g : Vec d → Vec d} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) u) + (hg_mem : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + MemVectorL2 (cubeSet R) g) + (hC : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + H1CoerciveEstimate (cubeSet R)) + (hData : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd : + ∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) : + ∃ v : TriadicCube d → Vec d → Vec d, + (∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + v R = (fun x => w.toH1.grad x) ∧ + ∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + ((∀ R : TriadicCube d, (∃ n : ℕ, R ∈ descendantsAtDepth Q n) → + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N (v R))) → + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (v R) s η) := by + classical + let IsDescendantOfQ : TriadicCube d → Prop := + fun R => ∃ n : ℕ, R ∈ descendantsAtDepth Q n + have hlocal : + ∀ R : TriadicCube d, IsDescendantOfQ R → + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + intro R hRdesc + rcases hRdesc with ⟨n, hR⟩ + exact + exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedLocalError_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + (P := Q) (R := R) (a := a) (n := n) + (lam := lam) (Lam := Lam) (s := s) (η := η) (u := u) (g := g) + hs hη hu_potential hu_residual hR + (hEll R ⟨n, hR⟩) (hu_mem R ⟨n, hR⟩) (hg_mem R ⟨n, hR⟩) + (hC R ⟨n, hR⟩) (hData R ⟨n, hR⟩) (hsum R ⟨n, hR⟩) + (hchildBdd R ⟨n, hR⟩) (huBdd R ⟨n, hR⟩) (hgBdd R ⟨n, hR⟩) + let v : TriadicCube d → Vec d → Vec d := + fun R => + if hR : IsDescendantOfQ R then + fun x => (Classical.choose (Classical.choose_spec (hlocal R hR))).toH1.grad x + else + 0 + refine ⟨v, ?_, ?_⟩ + · intro R hRdesc + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocal R hRdesc) + let w : AHarmonicFunction a (cubeSet R) := + Classical.choose (Classical.choose_spec (hlocal R hRdesc)) + have hv : + v R = fun x => w.toH1.grad x := by + change + (if hR : IsDescendantOfQ R then + fun x => (Classical.choose (Classical.choose_spec (hlocal R hR))).toH1.grad x + else 0) = fun x => w.toH1.grad x + rw [dif_pos hRdesc] + have hspec : + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + simpa [ω, w] using + Classical.choose_spec (Classical.choose_spec (hlocal R hRdesc)) + exact ⟨ω, w, hv, hspec.1⟩ + · intro hvBdd j R hR + have hRdesc : IsDescendantOfQ R := ⟨j, hR⟩ + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + Classical.choose (hlocal R hRdesc) + let w : AHarmonicFunction a (cubeSet R) := + Classical.choose (Classical.choose_spec (hlocal R hRdesc)) + have hv : + v R = fun x => w.toH1.grad x := by + change + (if hR : IsDescendantOfQ R then + fun x => (Classical.choose (Classical.choose_spec (hlocal R hR))).toH1.grad x + else 0) = fun x => w.toH1.grad x + rw [dif_pos hRdesc] + have hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) := by + simpa [hv] using hvBdd R hRdesc + have hspec : + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + weakFluxRHSAbsorbedLocalError R a g u (fun x => w.toH1.grad x) s η) := by + simpa [ω, w] using + Classical.choose_spec (Classical.choose_spec (hlocal R hRdesc)) + simpa [hv] using hspec.2 hwBdd + +/-- PDE-facing coefficient-energy recurrence with the explicit +corrector-energy local-error envelope. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepCorrectorEnergyLocalError_of_h1DirichletRhsWeakSolutionOn_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + weakFluxRHSCorrectorEnergyLocalError Q a u.grad + (fun x => ω.toH1MeanZero.toH1Function.grad x) s := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_h1DirichletRhsWeakSolutionOn_of_coarseData + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hEll hu hg hC hData hsum hchildBdd with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + simpa [weakFluxRHSCorrectorEnergyLocalError, add_assoc] using hstep + +/-- PDE-facing absorbed recurrence with the explicit absorbed local-error +envelope. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedLocalError_of_h1DirichletRhsWeakSolutionOn_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s η lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u.grad)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + weakFluxRHSAbsorbedLocalError Q a g u.grad (fun x => w.toH1.grad x) s η) := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedShortTerm_of_h1DirichletRhsWeakSolutionOn_of_coarseData + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (η := η) (lam := lam) (Lam := Lam) + hs hη hEll hu hg hC hData hsum hchildBdd huBdd hgBdd with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + simpa [weakFluxRHSAbsorbedLocalError, add_assoc] using hstep hwBdd + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AveragedStepping.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AveragedStepping.lean new file mode 100644 index 0000000000..dcd1a27399 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/AveragedStepping.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.AveragedLocal.DescendantsAverage +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FullStepping + +/-! # Averaged Stepping -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Averaged-scale form of the weak-flux local recurrence. This is the +Section 3.2.3 Step 4 bookkeeping bridge specialized to the flux field +`a u`. -/ +theorem descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_flux_le_discount_next_add_error_of_localBound + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) (E : TriadicCube d → ℝ) + (hlocal : + ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) : + descendantsAverage Q j + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q (j + 1) + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + descendantsAverage Q j E := by + exact + descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_le_discount_next_add_error_of_localBound + Q s (fun x => matVecMul (a x) (u x)) j E hlocal + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergy.lean new file mode 100644 index 0000000000..2cb53bdd47 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergy.lean @@ -0,0 +1,400 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoliLocalBridge +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector + +/-! # Corrector Energy -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_two_mul_add + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) (N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + have hEq : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) = + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => u x - w.toH1.grad x) := by + apply cubeBesovNegativeVectorPartialSeminormTwo_eq_of_eq_on_cubeSet s N + intro x hx + ext i + change ω.toH1MeanZero.toH1Function.grad x i = u x i - w.toH1.grad x i + have hcoord : + u x i = w.toH1.grad x i + ω.toH1MeanZero.toH1Function.grad x i := by + simpa using congrArg (fun z => z i) (huw x hx) + linarith + rw [hEq] + exact + sq_cubeBesovNegativeVectorPartialSeminormTwo_sub_le_two_mul_add + Q s u (fun x => w.toH1.grad x) hu w.toH1.grad_memVectorL2 N + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + have hsq := + ω.sq_cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_two_mul_add + (u := u) w huw hu s N + have hω_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) + have hu_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have hw_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x) := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N + (fun x => w.toH1.grad x) + have hsum_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N (fun x => w.toH1.grad x) := + add_nonneg hu_nonneg hw_nonneg + have hsq_bound : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 ≤ + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ^ 2 + ≤ + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + + 2 * (cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := hsq + _ ≤ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + nlinarith + _ = (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + have hsqrt2 : (Real.sqrt 2) ^ 2 = (2 : ℝ) := by + nlinarith [Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ))] + calc + 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 + = + (Real.sqrt 2) ^ 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) ^ 2 := by + rw [hsqrt2] + _ = + (Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) ^ 2 := by + ring + have hright_nonneg : + 0 ≤ Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + exact mul_nonneg (Real.sqrt_nonneg _) hsum_nonneg + nlinarith + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bounds + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) {Bu Bw : ℝ} + (huB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hwB : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x) ≤ Bw) : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ + Real.sqrt 2 * (Bu + Bw) := by + intro N + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) + ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u + + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) := by + exact + ω.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add + (u := u) w huw hu s N + _ ≤ Real.sqrt 2 * (Bu + Bw) := by + exact mul_le_mul_of_nonneg_left + (add_le_add (huB N) (hwB N)) (Real.sqrt_nonneg _) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) + (s : ℝ) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ + Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x)) := by + exact + ω.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bounds + (u := u) w huw hu s + (Bu := cubeBesovNegativeVectorSeminormTwo Q s u) + (Bw := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s u huBdd N) + (fun N => + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => w.toH1.grad x) hwBdd N) + +/-- Corrector energy bound from the centered Neumann energy identity and the +componentwise `q = 2` Besov pairing estimate. + +This is the Lean counterpart of manuscript Section 3.2.3, Step 2, before the +remaining average term for `grad omega` is absorbed into a local negative +Besov bound. -/ +theorem coefficientEnergy_average_le_note_terms_of_partialBounds_centered_two_two + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + (s : ℝ) {Bω Bg : ℝ} + (hs : 0 < s) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradω : MeasureTheory.MemLp + (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ Bω) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ Bg) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω) + + cubeBesovScaleWeight s Q * + ‖cubeAverage Q + (fun x => ω.toH1MeanZero.toH1Function.grad x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + let gCentered : Vec d → Vec d := fun x => g x - cubeAverageVec Q g + have hg_centered : + MeasureTheory.MemLp gCentered (2 : ENNReal) (normalizedCubeMeasure Q) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q g) + (2 : ENNReal) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q g) + simpa [gCentered] using! hg.sub hconst + have havg_g : cubeAverageVec Q gCentered = 0 := by + simpa [gCentered] using cubeAverageVec_centered_eq_zero Q g hg_mem + have hpair : + cubeAverage Q (coefficientEnergyDensity a ωgrad) = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := by + calc + cubeAverage Q (coefficientEnergyDensity a ωgrad) + = + cubeAverage Q + (fun x => vecDot (gCentered x) (ωgrad x)) := by + simpa [ωgrad, gCentered] using + ω.cubeAverage_coefficientEnergyDensity_eq_centered_rhs_pairing + _ = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => vecDot_comm _ _ + have hnote : + |cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x))| ≤ + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω) + + cubeBesovScaleWeight s Q * + ‖cubeAverage Q (fun x => ωgrad x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + Q s ωgrad gCentered hs hgradω hg_centered hBg havg_g hneg + (by simpa [gCentered] using hpos) + calc + cubeAverage Q (coefficientEnergyDensity a ωgrad) + = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := hpair + _ ≤ |cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x))| := + le_abs_self _ + _ ≤ + ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω) + + cubeBesovScaleWeight s Q * + ‖cubeAverage Q (fun x => ω.toH1MeanZero.toH1Function.grad x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + simpa [ωgrad] using hnote + +/-- Sharp corrector energy bound from the centered Neumann energy identity and +the componentwise `q = 2` Besov pairing estimate. -/ +theorem coefficientEnergy_average_le_sharp_note_terms_of_partialBounds_centered_two_two + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + (s : ℝ) {Bω Bg : ℝ} + (hs : 0 < s) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradω : MeasureTheory.MemLp + (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ Bω) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ Bg) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω)) * + (cubeBesovScaleWeight s Q * Bg)) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + let gCentered : Vec d → Vec d := fun x => g x - cubeAverageVec Q g + have hg_centered : + MeasureTheory.MemLp gCentered (2 : ENNReal) (normalizedCubeMeasure Q) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q g) + (2 : ENNReal) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q g) + simpa [gCentered] using! hg.sub hconst + have havg_g : cubeAverageVec Q gCentered = 0 := by + simpa [gCentered] using cubeAverageVec_centered_eq_zero Q g hg_mem + have hpair : + cubeAverage Q (coefficientEnergyDensity a ωgrad) = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := by + calc + cubeAverage Q (coefficientEnergyDensity a ωgrad) + = + cubeAverage Q + (fun x => vecDot (gCentered x) (ωgrad x)) := by + simpa [ωgrad, gCentered] using + ω.cubeAverage_coefficientEnergyDensity_eq_centered_rhs_pairing + _ = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => vecDot_comm _ _ + have hsharp : + |cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sharp_note_terms_of_partialBounds_of_cubeAverageVec_eq_zero_two_two + Q s ωgrad gCentered hs hgradω hg_centered hBg havg_g hneg + (by simpa [gCentered] using hpos) + calc + cubeAverage Q (coefficientEnergyDensity a ωgrad) + = + cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x)) := hpair + _ ≤ |cubeAverage Q (fun x => vecDot (ωgrad x) (gCentered x))| := + le_abs_self _ + _ ≤ (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω)) * + (cubeBesovScaleWeight s Q * Bg)) := hsharp + +/-- Collapsed sharp corrector energy bound with the opposite scale weights +canceled. -/ +theorem coefficientEnergy_average_le_collapsed_note_term_centered_two_two + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + (s : ℝ) {Bω Bg : ℝ} + (hs : 0 < s) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hgradω : MeasureTheory.MemLp + (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ Bω) + (hpos : ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ Bg) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Bω * Bg) := by + have hsharp := + ω.coefficientEnergy_average_le_sharp_note_terms_of_partialBounds_centered_two_two + s hs hg_mem hg hgradω hBg hneg hpos + have hterm : + (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω)) * + (cubeBesovScaleWeight s Q * Bg)) = + (3 : ℝ) ^ ((d : ℝ) + s) * Bω * Bg := by + calc + (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bω)) * + (cubeBesovScaleWeight s Q * Bg)) + = + (cubeBesovScaleWeight (-s) Q * cubeBesovScaleWeight s Q) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Bω * Bg) := by + ring + _ = (3 : ℝ) ^ ((d : ℝ) + s) * Bω * Bg := by + rw [cubeBesovScaleWeight_neg_mul_cubeBesovScaleWeight, one_mul] + simpa [hterm] using hsharp + +end MeanZeroNeumannCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyAveraged.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyAveraged.lean new file mode 100644 index 0000000000..79a936fe4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyAveraged.lean @@ -0,0 +1,458 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedComponentBounds +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergyPoincare + +/-! # Corrector Energy Averaged -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Averaged corrector-energy input for the corrected weak-flux route + +This leaf turns the local Neumann-corrector force-scale estimate into the +depth-weighted descendant average used by the corrected zero-Dirichlet +weak-flux recurrence. +-/ + +open scoped ENNReal + +private theorem inv_geometricDiscount_two_mul_inv_one_sub_step_le_five_halves_inv_sq + {s : ℝ} (hs : 0 < s) (hs_le : s ≤ 1) : + (geometricDiscount s 2)⁻¹ * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + (5 / 2) * (s⁻¹) ^ 2 := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hconv : ConvexOn ℝ Set.univ (fun t : ℝ => Real.rpow (3 : ℝ) t) := + convexOn_rpow_left (by norm_num : 0 < (3 : ℝ)) + have hr_chord : r ≤ 1 - (2 / 3) * s := by + have hconv_ineq := And.right hconv + have h := + hconv_ineq (x := (0 : ℝ)) (y := (-1 : ℝ)) (a := 1 - s) (b := s) + (Set.mem_univ (0 : ℝ)) (Set.mem_univ (-1 : ℝ)) + (by linarith) hs.le (by ring) + have hpow_neg_one : Real.rpow (3 : ℝ) (-1 : ℝ) = (3 : ℝ)⁻¹ := by + change (3 : ℝ) ^ (-1 : ℝ) = (3 : ℝ)⁻¹ + rw [Real.rpow_neg_one] + dsimp [r] at h + have h' : Real.rpow (3 : ℝ) (-s) ≤ 1 - s + s * (3 : ℝ)⁻¹ := by + simpa [Real.rpow_neg_one] using h + nlinarith + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + have hr_le_one : r ≤ 1 := hr_lt_one.le + have hdenH_pos : 0 < 1 - r := by linarith + have hdenD_pos : 0 < geometricDiscount s 2 := + geometricDiscount_pos (by nlinarith : 0 < s * 2) + have htarget_den_pos : 0 < (2 / 3) * s := by positivity + have hden_lower : (2 / 3) * s ≤ 1 - r := by + linarith + have hH_le : + (1 - r)⁻¹ ≤ (3 / 2) * s⁻¹ := by + have hraw := (inv_le_inv₀ hdenH_pos htarget_den_pos).2 hden_lower + have hrewrite : ((2 / 3) * s)⁻¹ = (3 / 2) * s⁻¹ := by + field_simp [hs.ne'] + simpa [hrewrite] using hraw + have hr_sq_le : r ^ 2 ≤ r := by + have hmul := mul_le_mul_of_nonneg_right hr_le_one hr_nonneg + simpa [pow_two] using hmul + have hr_sq_eq : + r ^ 2 = Real.rpow (3 : ℝ) (-s * 2) := by + dsimp [r] + calc + (Real.rpow (3 : ℝ) (-s)) ^ 2 = + Real.rpow (3 : ℝ) (-s) * Real.rpow (3 : ℝ) (-s) := by ring + _ = Real.rpow (3 : ℝ) ((-s) + (-s)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) (-s) (-s)).symm + _ = Real.rpow (3 : ℝ) (-s * 2) := by + ring_nf + have hden_order : 1 - r ≤ geometricDiscount s 2 := by + unfold geometricDiscount + rw [← hr_sq_eq] + nlinarith + have hD_le_H : + (geometricDiscount s 2)⁻¹ ≤ (1 - r)⁻¹ := + (inv_le_inv₀ hdenD_pos hdenH_pos).2 hden_order + have hH_nonneg : 0 ≤ (1 - r)⁻¹ := inv_nonneg.mpr hdenH_pos.le + have hprod : + (geometricDiscount s 2)⁻¹ * (1 - r)⁻¹ ≤ + ((1 - r)⁻¹) ^ 2 := by + calc + (geometricDiscount s 2)⁻¹ * (1 - r)⁻¹ ≤ + (1 - r)⁻¹ * (1 - r)⁻¹ := by + exact mul_le_mul_of_nonneg_right hD_le_H hH_nonneg + _ = ((1 - r)⁻¹) ^ 2 := by ring + have hHsq : + ((1 - r)⁻¹) ^ 2 ≤ ((3 / 2) * s⁻¹) ^ 2 := + pow_le_pow_left₀ hH_nonneg hH_le 2 + have hconst : + ((3 / 2) * s⁻¹) ^ 2 ≤ (5 / 2) * (s⁻¹) ^ 2 := by + nlinarith [sq_nonneg (s⁻¹)] + calc + (geometricDiscount s 2)⁻¹ * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ = + (geometricDiscount s 2)⁻¹ * (1 - r)⁻¹ := by rfl + _ ≤ ((1 - r)⁻¹) ^ 2 := hprod + _ ≤ ((3 / 2) * s⁻¹) ^ 2 := hHsq + _ ≤ (5 / 2) * (s⁻¹) ^ 2 := hconst + +/-- The force-scale corrector-energy base fits in the displayed corrector +allocation after summing the weak-flux geometric tail. -/ +theorem weakFluxRHSCorrectorEnergyForceScale_mul_inv_one_sub_step_le_noteForceScale + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) : + (1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ ≤ + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let D : ℝ := (geometricDiscount s 2)⁻¹ + let H : ℝ := (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + let LamQ : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let F : ℝ := 1000 * (s⁻¹) ^ 2 * LamQ * L * N ^ 2 * G ^ 2 + have hDH : D * H ≤ (5 / 2) * (s⁻¹) ^ 2 := by + simpa [D, H] using + inv_geometricDiscount_two_mul_inv_one_sub_step_le_five_halves_inv_sq + hs hs_le + have hLamQ_nonneg : 0 ≤ LamQ := by + dsimp [LamQ] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr + (multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ))) + have hF_nonneg : 0 ≤ F := by + dsimp [F] + positivity + have hscaled := mul_le_mul_of_nonneg_right hDH hF_nonneg + calc + (1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ + = + (D * H) * F := by + dsimp [D, H, F, LamQ, L, N, G] + ring + _ ≤ ((5 / 2) * (s⁻¹) ^ 2) * F := hscaled + _ = + 2500 * (s⁻¹) ^ 4 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [F, LamQ, L, N, G] + ring + +/-- +Depth-weighted averaged control of the corrector-energy component in the +corrected weak-flux RHS recurrence. + +The proof combines: +* half-scale localization of the weak-flux local coefficient, +* half-scale localization of the descendant `lambda^{-1}` factor, +* the local Neumann-corrector energy force-scale estimate for each selected + descendant corrector, and +* the global positive-Besov descendant averaging bound. +-/ +theorem weakFluxRHSDepthWeight_mul_correctorEnergyErrorAverage_le_forceScale + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) {s lam Lam : ℝ} (n : ℕ) + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) + (z : TriadicCube d → Vec d → Vec d) + (hz : + ∀ R ∈ descendantsAtDepth Q n, + ∃ ω : MeanZeroNeumannCorrectorData R a + (fun x => g x - cubeAverageVec R g), + z R = (fun x => ω.toH1MeanZero.toH1Function.grad x)) : + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n ≤ + 1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let D : ℝ := (geometricDiscount s 2)⁻¹ + let T : ℝ := Real.rpow (3 : ℝ) (s * (n : ℝ)) + let LamQ : ℝ := LambdaSq Q (s / 2) (.finite 2) a + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let N : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let A : TriadicCube d → ℝ := fun R => + weakFluxRHSLocalCorrectorEnergyError R a (z R) s + let GR : TriadicCube d → ℝ := fun R => cubeBesovPositiveVectorSeminormTwo R s g + let C : ℝ := 1000 * D * (s⁻¹) ^ 2 * LamQ * L * N ^ 2 * T ^ 2 + have hs_half : 0 < s / 2 := by nlinarith + let hOrigin : OpenCubeOriginEllipticRecoveryExistence (d := d) lam Lam := + openCubeOriginEllipticRecoveryExistence (d := d) (lam := lam) (Lam := Lam) + have hData : OpenCubeDescendantDeterministicCoarseData Q a := + openCubeDescendantDeterministicCoarseData_of_recoveryFamily + (openCubeDescendantEllipticRecoveryFamily_of_isEllipticFieldOn_of_originCubeRecoveryExistence + (Q := Q) (a := a) hEll hOrigin) + have hEllOpen : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEll.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + have hsum_B_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) 1) := by + have hsum : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + maxDescendantBBlockNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantBBlockNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa [Real.rpow_one] using hsum + have hsum_lambda_half : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + Real.rpow (maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) + (2 / 2)) := by + have hsum : + Summable (fun m : ℕ => + geometricWeight (s / 2) 2 m * + maxDescendantSigmaStarInvNormAtScale Q (Q.scale - (m : ℤ)) a) := + summable_qtwo_maxDescendantSigmaStarInvNormAtScale_of_isEllipticFieldOn_of_openCubeDescendantDeterministicCoarseData + (Q := Q) (a := a) (s := s / 2) hs_half hEll hData + simpa using hsum + have hlocal_lambda : + ∀ R ∈ descendantsAtDepth Q n, + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ T * L := by + intro R hR + have hRscale : R ∈ descendantsAtScale Q (Q.scale - (n : ℤ)) := + mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hloc : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) + (2 * (s / 2) * + (Int.toNat (Q.scale - (Q.scale - (n : ℤ))) : ℝ)) * + L := by + simpa [L] using + multiscale_ellipticity_lambdaSq_finite_inv_le_of_mem_descendantsAtScale + (Q := Q) (R := R) (k := Q.scale - (n : ℤ)) a (s / 2) 2 + (by nlinarith : 0 ≤ s / 2) (by norm_num) hRscale hsum_lambda_half + have htoNat : Int.toNat (Q.scale - (Q.scale - (n : ℤ))) = n := by + have hdiff : Q.scale - (Q.scale - (n : ℤ)) = (n : ℤ) := by + omega + rw [hdiff] + simp + have hloc' : + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ ≤ + Real.rpow (3 : ℝ) (2 * (s / 2) * (n : ℝ)) * L := by + simpa [htoNat] using hloc + simpa [T, show 2 * (s / 2) * (n : ℝ) = s * (n : ℝ) by ring] using hloc' + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hLamQ_nonneg : + 0 ≤ LamQ := by + dsimp [LamQ] + exact multiscale_ellipticity_LambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hD_nonneg : 0 ≤ D := by + dsimp [D] + exact inv_nonneg.mpr (le_of_lt (geometricDiscount_pos (by nlinarith : 0 < s * 2))) + have hT_pos : 0 < T := by + dsimp [T] + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + have hT_nonneg : 0 ≤ T := hT_pos.le + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg + (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.sqrt_nonneg 2)) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hlocalBdd : + ∀ R ∈ descendantsAtDepth Q n, + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N g) := by + intro R hR + exact cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_parent_bddAbove + s g hR hGlobalBdd + have hpoint : + ∀ R ∈ descendantsAtDepth Q n, + A R ≤ C * (GR R) ^ 2 := by + intro R hR + rcases hz R hR with ⟨ωR, hzR⟩ + let ER : ℝ := + cubeAverage R + (coefficientEnergyDensity a (z R)) + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR) + have hgR : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hcoeff : + weakFluxRHSLocalCoeff R a s ≤ D * (T * LamQ) := by + simpa [D, T, LamQ, mul_assoc] using + weakFluxRHSLocalCoeff_le_parentHalfLambda_of_mem_descendantsAtDepth + (Q := Q) (R := R) a hs hR hEllOpen hData hsum_B_half + have hER_nonneg : 0 ≤ ER := by + dsimp [ER] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEllR + (z R)) + have henergy_raw : + ER ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + N ^ 2 * (GR R) ^ 2 := by + dsimp [ER, N, GR] + simpa [hzR, mul_assoc, mul_left_comm, mul_comm] using + ωR.coefficientEnergy_average_le_force_scale_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEllR hgR (hlocalBdd R hR) + have hforce_factor_nonneg : + 0 ≤ 500 * (s⁻¹) ^ 2 * N ^ 2 * (GR R) ^ 2 := by + positivity + have henergy : + ER ≤ + 500 * (s⁻¹) ^ 2 * (T * L) * N ^ 2 * (GR R) ^ 2 := by + calc + ER ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ * + N ^ 2 * (GR R) ^ 2 := henergy_raw + _ = + (500 * (s⁻¹) ^ 2 * N ^ 2 * (GR R) ^ 2) * + (lambdaSq R (s / 2) (.finite 2) a)⁻¹ := by ring + _ ≤ + (500 * (s⁻¹) ^ 2 * N ^ 2 * (GR R) ^ 2) * (T * L) := by + exact mul_le_mul_of_nonneg_left (hlocal_lambda R hR) + hforce_factor_nonneg + _ = + 500 * (s⁻¹) ^ 2 * (T * L) * N ^ 2 * (GR R) ^ 2 := by ring + have hcoeff_nonneg : + 0 ≤ 2 * (D * (T * LamQ)) := by positivity + calc + A R = + 2 * weakFluxRHSLocalCoeff R a s * ER := by + dsimp [A, ER] + rfl + _ ≤ + 2 * (D * (T * LamQ)) * ER := by + have hscaled := + mul_le_mul_of_nonneg_right hcoeff hER_nonneg + nlinarith + _ ≤ + 2 * (D * (T * LamQ)) * + (500 * (s⁻¹) ^ 2 * (T * L) * N ^ 2 * (GR R) ^ 2) := by + exact mul_le_mul_of_nonneg_left henergy hcoeff_nonneg + _ = C * (GR R) ^ 2 := by + dsimp [C] + ring + have hlocal_avg : + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n ≤ + C * descendantsAverage Q n (fun R => (GR R) ^ 2) := by + calc + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n = + descendantsAverage Q n A := by + unfold weakFluxRHSLocalCorrectorEnergyErrorAverage + rfl + _ ≤ descendantsAverage Q n (fun R => C * (GR R) ^ 2) := by + exact descendantsAverage_le_descendantsAverage Q n hpoint + _ = C * descendantsAverage Q n (fun R => (GR R) ^ 2) := by + exact descendantsAverage_smul Q n C _ + have hforce_avg : + descendantsAverage Q n (fun R => (GR R) ^ 2) ≤ + coarsePoincareRHSGlobalForceBound Q g s n := by + simpa [GR] using + descendantsAverage_sq_cubeBesovPositiveVectorSeminormTwo_le_global_scaled + Q g s n hGlobalBdd hlocalBdd + have hunweighted : + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n ≤ + 1000 * D * (s⁻¹) ^ 2 * LamQ * L * N ^ 2 * G ^ 2 := by + have hstep := hlocal_avg.trans + (mul_le_mul_of_nonneg_left hforce_avg hC_nonneg) + have hT_sq_ne : T ^ 2 ≠ 0 := by positivity + have hcancel : T ^ 2 * (T ^ 2)⁻¹ = 1 := by + exact mul_inv_cancel₀ hT_sq_ne + calc + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n + ≤ C * coarsePoincareRHSGlobalForceBound Q g s n := hstep + _ = + (1000 * D * (s⁻¹) ^ 2 * LamQ * L * N ^ 2) * + (T ^ 2 * (T ^ 2)⁻¹) * G ^ 2 := by + dsimp [C, G, T, coarsePoincareRHSGlobalForceBound] + ring + _ = + 1000 * D * (s⁻¹) ^ 2 * LamQ * L * N ^ 2 * G ^ 2 := by + rw [hcancel] + ring + have herror_nonneg : + 0 ≤ weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n := by + unfold weakFluxRHSLocalCorrectorEnergyErrorAverage + exact descendantsAverage_nonneg Q n _ fun R hR => by + unfold weakFluxRHSLocalCorrectorEnergyError + have hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a := + hEll.mono (measurableSet_cubeSet R) + (cubeSet_subset_of_mem_descendantsAtDepth hR) + exact mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) + (weakFluxRHSLocalCoeff_nonneg R a hs)) + (cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEllR + (z R))) + have hW_le_one : coarsePoincareRHSDepthWeight s n ≤ 1 := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_le_one_of_one_le_of_nonpos + (by norm_num : (1 : ℝ) ≤ 3) + (by nlinarith [mul_nonneg hs.le (by positivity : 0 ≤ (n : ℝ))]) + calc + coarsePoincareRHSDepthWeight s n * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n + ≤ + 1 * + weakFluxRHSLocalCorrectorEnergyErrorAverage Q a z s n := by + exact mul_le_mul_of_nonneg_right hW_le_one herror_nonneg + _ ≤ 1000 * D * (s⁻¹) ^ 2 * LamQ * L * N ^ 2 * G ^ 2 := by + simpa using hunweighted + _ = + 1000 * (geometricDiscount s 2)⁻¹ * (s⁻¹) ^ 2 * + LambdaSq Q (s / 2) (.finite 2) a * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [D, LamQ, L, N, G] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyPoincare.lean new file mode 100644 index 0000000000..0b8442da9f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/CorrectorEnergyPoincare.lean @@ -0,0 +1,547 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergy + +/-! # Corrector Energy Poincare -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Corrector energy from the RHS Poincare estimate + +This leaf closes the manuscript Step 3.2.3 estimate for the local mean-zero +Neumann corrector: the centered energy identity gives `E <= C W G`, the +RHS Poincare estimate bounds `W`, and a scalar Young absorption returns a +forcing-square envelope with the expected `lambda_{s/2,2}^{-1}` factor. +-/ + +open scoped ENNReal + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +private theorem le_sq_mul_add_two_mul_sqrt_of_le_mul_sqrt_mul_add + {E A F B : ℝ} + (hE_nonneg : 0 ≤ E) (hA_nonneg : 0 ≤ A) + (hF_nonneg : 0 ≤ F) (hB_nonneg : 0 ≤ B) + (h : E ≤ B * Real.sqrt (A * E + F)) : + E ≤ B ^ 2 * A + 2 * B * Real.sqrt F := by + have hAE_nonneg : 0 ≤ A * E := mul_nonneg hA_nonneg hE_nonneg + have hsqrt_split : + Real.sqrt (A * E + F) ≤ Real.sqrt (A * E) + Real.sqrt F := + sqrt_add_le_add_sqrt_of_nonneg hAE_nonneg hF_nonneg + have hsplit : + E ≤ B * Real.sqrt (A * E) + B * Real.sqrt F := by + calc + E ≤ B * Real.sqrt (A * E + F) := h + _ ≤ B * (Real.sqrt (A * E) + Real.sqrt F) := by + exact mul_le_mul_of_nonneg_left hsqrt_split hB_nonneg + _ = B * Real.sqrt (A * E) + B * Real.sqrt F := by ring + have hyoung_left : + B * Real.sqrt (A * E) ≤ E / 2 + (B ^ 2 * A) / 2 := by + rw [Real.sqrt_mul hA_nonneg E] + have htwo := + two_mul_le_add_sq (B * Real.sqrt A) (Real.sqrt E) + have hsqA : (Real.sqrt A) ^ 2 = A := Real.sq_sqrt hA_nonneg + have hsqE : (Real.sqrt E) ^ 2 = E := Real.sq_sqrt hE_nonneg + nlinarith + calc + E ≤ B * Real.sqrt (A * E) + B * Real.sqrt F := hsplit + _ ≤ E / 2 + (B ^ 2 * A) / 2 + B * Real.sqrt F := by + nlinarith + _ ≤ B ^ 2 * A + 2 * B * Real.sqrt F := by + nlinarith + +/-- +Pre-Young Neumann-corrector energy estimate. + +The coefficient energy of the centered mean-zero Neumann corrector is bounded +by the centered positive-Besov forcing seminorm times the square root of the +RHS Poincare radicand for the same corrector gradient. +-/ +theorem coefficientEnergy_average_le_centered_force_mul_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded + [NeZero d] + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hCenteredBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + let gCentered : Vec d → Vec d := fun x => g x - cubeAverageVec Q g + have hg_mem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + have hg_centered : + MeasureTheory.MemLp gCentered (2 : ENNReal) (normalizedCubeMeasure Q) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q g) + (2 : ENNReal) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q g) + simpa [gCentered] using! hg.sub hconst + have hg_centered_mem : MemVectorL2 (cubeSet Q) gCentered := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg_centered + have hgradω : + MeasureTheory.MemLp ωgrad (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hω_bdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N ωgrad) := + cubeBesovNegativeVectorPartialSeminormTwo_bddAbove_of_memLp Q hs + ωgrad hgradω + have hω_residual : + IsSolenoidalOn (cubeSet Q) + (fun x => matVecMul (a x) (ωgrad x) - gCentered x) := by + simpa [ωgrad, gCentered] using + (ω.residualFlux_zeroNormalTrace hEll hg_centered_mem).isSolenoidalOn + have hω_poincare : + cubeBesovNegativeVectorSeminormTwo Q s ωgrad ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a ωgrad) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s gCentered) ^ 2) := by + exact + cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := a) (g := gCentered) (u := ωgrad) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll ω.toH1MeanZero.toH1Function.isPotentialOn + hω_residual hg_centered hCenteredBdd + have hneg : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N ωgrad ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a ωgrad) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s gCentered) ^ 2) := by + intro N + exact + (cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s ωgrad hω_bdd N).trans hω_poincare + have hCentered_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s gCentered := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s + gCentered hCenteredBdd + have hpos : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N gCentered ≤ + cubeBesovPositiveVectorSeminormTwo Q s gCentered := by + intro N + exact + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s gCentered hCenteredBdd N + simpa [ωgrad, gCentered] using + ω.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + (s := s) hs hg_mem hg hgradω hCentered_nonneg hneg hpos + +/-- +Young-absorbed Neumann-corrector energy estimate with the centered forcing +seminorm kept explicit. +-/ +theorem coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded_centered + [NeZero d] + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hCenteredBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + 2 * + |(d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))| * + Real.sqrt + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + let gCentered : Vec d → Vec d := fun x => g x - cubeAverageVec Q g + let E : ℝ := cubeAverage Q (coefficientEnergyDensity a ωgrad) + let A : ℝ := + 250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let F : ℝ := + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s gCentered) ^ 2 + let B : ℝ := + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s gCentered) + have hpre_raw := + ω.coefficientEnergy_average_le_centered_force_mul_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hg hCenteredBdd + have hpre : E ≤ B * Real.sqrt (A * E + F) := by + dsimp [E, A, F, B, ωgrad, gCentered] + calc + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + ≤ + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) := hpre_raw + _ = + (d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) * + Real.sqrt + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + ring + have hE_nonneg : 0 ≤ E := by + dsimp [E, ωgrad] + exact cubeAverage_nonneg_of_nonneg_on + (coefficientEnergyDensity_nonneg_of_isEllipticFieldOn + hEll (fun x => ω.toH1MeanZero.toH1Function.grad x)) + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hlambda_inv_nonneg : + 0 ≤ (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ := + inv_nonneg.mpr hlambda_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact + mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (250 : ℝ)) (sq_nonneg (s⁻¹))) + hlambda_inv_nonneg + have hG_nonneg : + 0 ≤ cubeBesovPositiveVectorSeminormTwo Q s gCentered := + cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s + gCentered hCenteredBdd + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + hG_nonneg) + have hF_nonneg : 0 ≤ F := by + have hs_inv_pow_four_nonneg : 0 ≤ (s⁻¹) ^ 4 := by + rw [show (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 by ring] + exact sq_nonneg _ + dsimp [F] + exact + mul_nonneg + (mul_nonneg + (mul_nonneg + (mul_nonneg (by norm_num : 0 ≤ (15000 : ℝ)) hs_inv_pow_four_nonneg) + (sq_nonneg ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹))) + (sq_nonneg ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)))) + (sq_nonneg (cubeBesovPositiveVectorSeminormTwo Q s gCentered)) + have hmain : E ≤ B ^ 2 * A + 2 * B * Real.sqrt F := + le_sq_mul_add_two_mul_sqrt_of_le_mul_sqrt_mul_add + hE_nonneg hA_nonneg hF_nonneg hB_nonneg hpre + have hB_abs : |B| = B := abs_of_nonneg hB_nonneg + simpa [E, A, F, B, ωgrad, gCentered, hB_abs] using hmain + +/-- +Young-absorbed Neumann-corrector energy estimate with the uncentered forcing +seminorm, using the standard invariance of the positive Besov seminorm under +subtracting the cube average. +-/ +theorem coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded + [NeZero d] + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + ((d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)) ^ 2 * + (250 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹) + + 2 * + |(d : ℝ) * + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovPositiveVectorSeminormTwo Q s g)| * + Real.sqrt + (15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + have hmem_desc : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure R) := by + intro j R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hg + have hCenteredBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g)) := by + rcases hGlobalBdd with ⟨M, hM⟩ + refine ⟨M, ?_⟩ + rintro y ⟨N, rfl⟩ + change + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ + M + rw [cubeBesovPositiveVectorPartialSeminormTwo_sub_const + Q s N g (cubeAverageVec Q g) (fun j _ R hR => hmem_desc j R hR)] + exact hM ⟨N, rfl⟩ + have hcenter_eq : + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g) = + cubeBesovPositiveVectorSeminormTwo Q s g := + cubeBesovPositiveVectorSeminormTwo_sub_const + Q s g (cubeAverageVec Q g) hmem_desc + have hcentered := + ω.coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded_centered + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hCenteredBdd + simpa [hcenter_eq] using hcentered + +/-- +Single-scale force-form consequence of the Young-absorbed Neumann-corrector +energy estimate. + +This is the local scalar estimate needed before averaging the corrector-energy +component over descendants: the two terms in the Young envelope are both +absorbed into the same `s^{-2} lambda^{-1} N^2 [g]^2` scale. +-/ +theorem coefficientEnergy_average_le_force_scale_noteConstants_expanded + [NeZero d] + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ + 500 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s g + let L : ℝ := (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ + let M : ℝ := (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) + let N : ℝ := M * Real.sqrt 2 + let A : ℝ := 250 * (s⁻¹) ^ 2 * L + let F : ℝ := + 15000 * (s⁻¹) ^ 4 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + G ^ 2 + let B : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * G) + have hmain := + ω.coefficientEnergy_average_le_forcing_square_envelope_noteConstants_expanded + (s := s) (lam := lam) (Lam := Lam) hs hs_le hEll hg hGlobalBdd + have hlambda_nonneg : + 0 ≤ lambdaSq Q (s / 2) (.finite 2) a := + multiscale_ellipticity_lambdaSq_finite_nonneg Q (s / 2) 2 a + (by norm_num) (by nlinarith : 0 ≤ s / 2 * (2 : ℝ)) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact inv_nonneg.mpr hlambda_nonneg + have hG_nonneg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove Q s g hGlobalBdd + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hsqrt2_ge_one : 1 ≤ Real.sqrt 2 := by + have hsqrt2_nonneg : 0 ≤ Real.sqrt 2 := Real.sqrt_nonneg 2 + have hsqrt2_sq : (Real.sqrt 2) ^ 2 = (2 : ℝ) := + Real.sq_sqrt (by norm_num : 0 ≤ (2 : ℝ)) + nlinarith + have hN_nonneg : 0 ≤ N := by + dsimp [N] + exact mul_nonneg hM_nonneg (Real.sqrt_nonneg 2) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact + mul_nonneg (by exact_mod_cast Nat.zero_le d) + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + hG_nonneg) + have hB_abs : |B| = B := abs_of_nonneg hB_nonneg + have hB_le_NG : B ≤ N * G := by + dsimp [B, N, M] + have hscale : M ≤ M * Real.sqrt 2 := by + calc + M = M * 1 := by ring + _ ≤ M * Real.sqrt 2 := + mul_le_mul_of_nonneg_left hsqrt2_ge_one hM_nonneg + calc + (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * G) + = ((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s)) * G := by ring + _ ≤ (((d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s)) * Real.sqrt 2) * G := + mul_le_mul_of_nonneg_right hscale hG_nonneg + _ = + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) * G := by ring + _ = (d : ℝ) * (3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2 * G := by ring + have hA_nonneg : 0 ≤ A := by + dsimp [A] + positivity + have hF_nonneg : 0 ≤ F := by + dsimp [F] + positivity + let K : ℝ := 125 * (s⁻¹) ^ 2 * L * N * G + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hsqrtF : + Real.sqrt F ≤ K := by + have hF_le_K_sq : F ≤ K ^ 2 := by + dsimp [F, K, L, N, M] + have hs_inv_four : (s⁻¹) ^ 4 = ((s⁻¹) ^ 2) ^ 2 := by ring + rw [hs_inv_four] + have hnonneg : + 0 ≤ + ((s⁻¹) ^ 2) ^ 2 * + ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + (((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2) * + G ^ 2 := by + positivity + nlinarith [hnonneg] + refine le_of_sq_le_sq ?_ hK_nonneg + simpa [Real.sq_sqrt hF_nonneg] using hF_le_K_sq + have hterm1 : + B ^ 2 * A ≤ 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + have hB_sq : + B ^ 2 ≤ (N * G) ^ 2 := by + exact pow_le_pow_left₀ hB_nonneg hB_le_NG 2 + calc + B ^ 2 * A ≤ (N * G) ^ 2 * A := + mul_le_mul_of_nonneg_right hB_sq hA_nonneg + _ = 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + dsimp [A] + ring + have hterm2 : + 2 * |B| * Real.sqrt F ≤ + 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + calc + 2 * |B| * Real.sqrt F ≤ 2 * (N * G) * K := by + rw [hB_abs] + have hleft_nonneg : 0 ≤ 2 * B := by positivity + have hBmul : 2 * B ≤ 2 * (N * G) := by nlinarith + have hNG_nonneg : 0 ≤ N * G := mul_nonneg hN_nonneg hG_nonneg + calc + 2 * B * Real.sqrt F ≤ 2 * B * K := + mul_le_mul_of_nonneg_left hsqrtF hleft_nonneg + _ ≤ 2 * (N * G) * K := + mul_le_mul_of_nonneg_right hBmul hK_nonneg + _ = 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by + dsimp [K] + ring + calc + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) + ≤ B ^ 2 * A + 2 * |B| * Real.sqrt F := by + simpa [A, B, F, G, L] using hmain + _ ≤ + 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 + + 250 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := + add_le_add hterm1 hterm2 + _ = + 500 * (s⁻¹) ^ 2 * L * N ^ 2 * G ^ 2 := by ring + _ = + 500 * (s⁻¹) ^ 2 * + (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2 := by + dsimp [L, N, M, G] + ring + +end MeanZeroNeumannCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FluxStepping.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FluxStepping.lean new file mode 100644 index 0000000000..9758f6cf29 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FluxStepping.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.QTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector + +/-! # Flux Stepping -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +/-- Flux version of the elementary local step: after subtracting the centered +Neumann corrector, the top-scale flux average is the harmonic remainder's flux +average. -/ +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_flux_succ_le_descendantsAverage_add_harmonic_zero + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) + (N : ℕ) (s : ℝ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fun x => matVecMul (a x) (w.toH1.grad x))) ^ 2 := by + have hwavg : + cubeAverageVec Q (fun x => matVecMul (a x) (u x)) = + cubeAverageVec Q (fun x => matVecMul (a x) (w.toH1.grad x)) := + ω.cubeAverageVec_flux_eq_harmonicRemainderFlux_of_centered_rhs + w huw hEll hu_mem hg + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_eq_top_add_descendantsAverage] + have htop : + vecNormSq (cubeAverageVec Q (fun x => matVecMul (a x) (u x))) ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fun x => matVecMul (a x) (w.toH1.grad x))) ^ 2 := by + rw [hwavg, sq_cubeBesovNegativeVectorPartialSeminormTwo] + simp [sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] + calc + vecNormSq (cubeAverageVec Q (fun x => matVecMul (a x) (u x))) + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + ≤ + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fun x => matVecMul (a x) (w.toH1.grad x))) ^ 2 + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) := by + exact add_le_add htop le_rfl + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fun x => matVecMul (a x) (w.toH1.grad x))) ^ 2 := by + ring + +/-- Flux local step with the harmonic top-scale term bounded by the `q = 2` +flux coarse Poincare energy control. -/ +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_flux_succ_le_descendantsAverage_add_harmonic_energy + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) (N : ℕ) (energy : Vec d → ℝ) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + have hsplit := + ω.sq_cubeBesovNegativeVectorPartialSeminormTwo_flux_succ_le_descendantsAverage_add_harmonic_zero + (u := u) w huw hEll hu_mem hg N s + have hharmonic := + sq_coarsePoincare_flux_qtwo_partial_of_cubeAverageEnergyControl + Q a s hs (fun x => matVecMul (a x) (w.toH1.grad x)) energy 0 + henergy_nonneg henergy_int hflux hsum + have hstep : + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + + (cubeBesovNegativeVectorPartialSeminormTwo Q s 0 + (fun x => matVecMul (a x) (w.toH1.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + simpa [add_comm, add_left_comm, add_assoc] using + (add_le_add_right hharmonic + (Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x))) ^ 2))) + exact le_trans hsplit hstep + +end MeanZeroNeumannCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FullStepping.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FullStepping.lean new file mode 100644 index 0000000000..59fb43256c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/FullStepping.lean @@ -0,0 +1,1047 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.SeminormRecurrence +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.CorrectorEnergy +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FluxStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.WeakSolutionBridge + +/-! # Full Stepping -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +/-- Full-seminorm form of the weak-flux local step. This turns the finite-depth +local recurrence from `FluxStepping` into the one-step recurrence for the full +`q = 2` negative seminorm, assuming the child full seminorms bound their finite +partials. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_harmonic_energy_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) (energy : Vec d → ℝ) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) + (henergy_nonneg : ∀ x ∈ cubeSet Q, 0 ≤ energy x) + (henergy_int : MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) energy) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + let flux : Vec d → Vec d := fun x => matVecMul (a x) (u x) + let F : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hF_nonneg : 0 ≤ F := by + dsimp [F] + have hdisc_nonneg : 0 ≤ (geometricDiscount s 2)⁻¹ := + inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2)) + have hLambda_nonneg : 0 ≤ LambdaSq Q s (.finite 2) a := + multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a + (by norm_num) (by nlinarith [hs]) + have henergy_avg_nonneg : 0 ≤ cubeAverage Q energy := + cubeAverage_nonneg_of_nonneg_on henergy_nonneg + exact mul_nonneg (mul_nonneg hdisc_nonneg hLambda_nonneg) henergy_avg_nonneg + have hchildAvg_nonneg : + 0 ≤ descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorSeminormTwo R s flux) ^ 2) := + descendantsAverage_nonneg Q 1 _ fun R hR => sq_nonneg _ + have hB_nonneg : + 0 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorSeminormTwo R s flux) ^ 2) + + F := by + exact add_nonneg + (mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) hchildAvg_nonneg) + hF_nonneg + have hlocal : + ∀ N : ℕ, + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) flux) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N flux) ^ 2) + + F := by + intro N + simpa [flux, F] using + ω.sq_cubeBesovNegativeVectorPartialSeminormTwo_flux_succ_le_descendantsAverage_add_harmonic_energy + (u := u) w s hs N energy hEll hu_mem hg + henergy_nonneg henergy_int hflux hsum huw + have hchild : + ∀ R ∈ descendantsAtDepth Q 1, ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo R s N flux ≤ + cubeBesovNegativeVectorSeminormTwo R s flux := by + intro R hR N + exact + cubeBesovNegativeVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + R s flux (by simpa [flux] using hchildBdd R hR) N + simpa [flux, F] using + sq_cubeBesovNegativeVectorSeminormTwo_le_descendantsAverage_add_of_succ_partialBound + (Q := Q) (s := s) (u := flux) + (Bchild := fun R => cubeBesovNegativeVectorSeminormTwo R s flux) + (F := F) hB_nonneg hlocal hchild + +/-- Coefficient-energy version of the weak-flux local step after splitting the +harmonic remainder energy into the original field and the mean-zero Neumann +corrector. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + let C : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + have henergy_nonneg : + ∀ x ∈ cubeSet Q, + 0 ≤ coefficientEnergyDensity a (fun x => w.toH1.grad x) x := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll + (fun x => w.toH1.grad x) + have henergy_int : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) + (cubeSet Q) MeasureTheory.volume := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + w.toH1.grad_memVectorL2 + have hbase := + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_harmonic_energy_of_childBddAbove + (u := u) w s hs (coefficientEnergyDensity a (fun x => w.toH1.grad x)) + hEll hu_mem hg henergy_nonneg henergy_int hflux hsum huw hchildBdd + have hsplit := + ω.cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (u := u) w hEll huw hu_mem + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a + (by norm_num) (by nlinarith [hs])) + calc + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + C * cubeAverage Q + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) := by + simpa [C] using hbase + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + C * + (2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x))) := by + exact add_le_add_right (mul_le_mul_of_nonneg_left hsplit hC_nonneg) _ + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + ring + +/-- Full-seminorm local recurrence with the Neumann-corrector energy replaced +by the sharp centered Besov product bound. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorShortTerm_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) (hs : 0 < s) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g))) := by + let C : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let Short : ℝ := (d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * (Real.sqrt 2 * (U + W)) * G) + have hbase := + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy_of_childBddAbove + (u := u) w s hs hEll hu_mem hg_mem hflux hsum huw hchildBdd + have hg : + MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q hg_mem + have hgradω : + MeasureTheory.MemLp + (fun x => ω.toH1MeanZero.toH1Function.grad x) + (2 : ENNReal) (normalizedCubeMeasure Q) := + memLp_normalizedCubeMeasure_of_memVectorL2_cubeSet Q + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hBg : 0 ≤ G := by + dsimp [G] + exact cubeBesovPositiveVectorSeminormTwo_nonneg_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hgBdd + have hnegω : + ∀ N : ℕ, + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => ω.toH1MeanZero.toH1Function.grad x) ≤ Real.sqrt 2 * (U + W) := by + dsimp [U, W] + exact + ω.cubeBesovNegativeVectorPartialSeminormTwo_corrector_le_sqrtTwo_mul_add_of_bddAbove + (u := u) w huw hu_mem s huBdd hwBdd + have hposg : + ∀ N : ℕ, + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g) ≤ G := by + intro N + dsimp [G] + exact + cubeBesovPositiveVectorPartialSeminormTwo_le_seminormTwo_of_bddAbove + Q s (fun x => g x - cubeAverageVec Q g) hgBdd N + have hωenergy : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) ≤ Short := by + dsimp [Short, U, W, G] + exact + ω.coefficientEnergy_average_le_collapsed_note_term_centered_two_two + s hs hg_mem hg hgradω hBg hnegω hposg + have hs2 : 0 < s * (2 : ℝ) := by positivity + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg + (inv_nonneg.mpr (le_of_lt (geometricDiscount_pos hs2))) + (multiscale_ellipticity_LambdaSq_finite_nonneg Q s 2 a + (by norm_num) (by nlinarith [hs])) + have h2C_nonneg : 0 ≤ 2 * C := by positivity + have hfinal : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * Short := by + calc + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 + ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + simpa [C] using hbase + _ ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * C * Short := by + exact add_le_add_right + (mul_le_mul_of_nonneg_left hωenergy h2C_nonneg) _ + simpa [C, U, W, G, Short] using hfinal + +/-- Full-seminorm local recurrence with the short corrector product absorbed +into quadratic `u`, harmonic-remainder, and forcing terms. -/ +theorem sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_of_childBddAbove + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + (s : ℝ) {η : ℝ} (hs : 0 < s) (hη : 0 < η) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg_mem : MemVectorL2 (cubeSet Q) g) + (hflux : + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x))) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u)) + (hwBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x))) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u) ^ 2 + + η * (cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2) := by + let Child : ℝ := + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + let U : ℝ := cubeBesovNegativeVectorSeminormTwo Q s u + let W : ℝ := cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x) + let G : ℝ := cubeBesovPositiveVectorSeminormTwo Q s (fun x => g x - cubeAverageVec Q g) + let C : ℝ := (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a + let A : ℝ := 2 * C * cubeAverage Q (coefficientEnergyDensity a u) + let K : ℝ := C * ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) + let D : ℝ := 2 * K + have hshort := + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorShortTerm_of_childBddAbove + (u := u) w s hs hEll hu_mem hg_mem hflux hsum huw hchildBdd huBdd hwBdd hgBdd + have hshort' : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Child + A + D * (U + W) * G := by + dsimp [Child, U, W, G, C, A, K, D] at hshort ⊢ + simpa [mul_assoc, mul_left_comm, mul_comm, left_distrib, right_distrib] using hshort + have hcross : + D * (U + W) * G ≤ η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + have hraw := add_bilinear_term_le_add_eta_sq_add_invEta_sq + (D := D) (U := U) (W := W) (G := G) hη + have hhalf : (D / 2) * G = K * G := by + dsimp [D] + ring + calc + D * (U + W) * G ≤ + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * (((D / 2) * G) ^ 2) := hraw + _ = η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + rw [hhalf] + have hfinal : + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Child + A + η * U ^ 2 + η * W ^ 2 + 2 * η⁻¹ * ((K * G) ^ 2) := by + linarith + simpa [Child, U, W, G, C, A, K] using hfinal + +/-- +Descendant-cube full-seminorm recurrence from parent potential/solenoidal +weak-flux data. This is the local iteration-facing version of the centered +Neumann-corrector construction. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepEnergy_of_parent_potential_solenoidal_h1CoerciveEstimate + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam s : ℝ} + {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ energy : Vec d → ℝ, + (∀ x ∈ cubeSet R, 0 ≤ energy x) → + MeasureTheory.IntegrableOn energy (cubeSet R) MeasureTheory.volume → + CubeAverageFluxEnergyControl R a + (fun x => matVecMul (a x) (w.toH1.grad x)) energy → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) → + (∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a * + cubeAverage R energy := by + rcases + exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := P) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) + hu_potential hu_residual hR hEllR hu_memR hg_memR hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro energy henergy_nonneg henergy_int hflux hsum hchildBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_harmonic_energy_of_childBddAbove + (u := u) w s hs energy hEllR hu_memR hg_memR + henergy_nonneg henergy_int hflux hsum huw hchildBdd + +/-- +Descendant-cube local recurrence with the harmonic flux energy split into the +original-field energy and the mean-zero Neumann-corrector energy. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_parent_potential_solenoidal_h1CoerciveEstimate + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam s : ℝ} + {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (CubeAverageFluxEnergyControl R a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) → + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a) → + (∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R (coefficientEnergyDensity a u) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x))) := by + rcases + exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := P) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) + hu_potential hu_residual hR hEllR hu_memR hg_memR hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hflux hsum hchildBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy_of_childBddAbove + (u := u) w s hs hEllR hu_memR hg_memR hflux hsum huw hchildBdd + +/-- +Descendant-cube coefficient-energy recurrence with harmonic flux control +supplied by deterministic coarse data. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam s : ℝ} + {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) + (hDataR : OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R (coefficientEnergyDensity a u) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + rcases + exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := P) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) (s := s) + hs hu_potential hu_residual hR hEllR hu_memR hg_memR hC with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + exact + hstep + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := R) (a := a) hEllR w hDataR) + hsum hchildBdd + +/-- +Descendant-cube coefficient-energy recurrence with the corrector term replaced +by the short centered Besov product bound. The harmonic seminorm boundedness is +returned as an input to the packaged step because the harmonic remainder is +created by the local Neumann construction. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepShortTerm_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam s : ℝ} + {u g : Vec d → Vec d} + (hs : 0 < s) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) + (hDataR : OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R (coefficientEnergyDensity a u) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo R s u + + cubeBesovNegativeVectorSeminormTwo R s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)))) := by + rcases + exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := P) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) + hu_potential hu_residual hR hEllR hu_memR hg_memR hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorShortTerm_of_childBddAbove + (u := u) w s hs hEllR hu_memR hg_memR + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := R) (a := a) hEllR w hDataR) + hsum huw hchildBdd huBdd hwBdd hgBdd + +/-- +Descendant-cube recurrence with the short corrector product absorbed into +quadratic `u`, harmonic, and forcing terms. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedShortTerm_of_parent_potential_solenoidal_h1CoerciveEstimate_of_coarseData + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam s η : ℝ} + {u g : Vec d → Vec d} + (hs : 0 < s) (hη : 0 < η) + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) + (hDataR : OpenCubeDescendantDeterministicCoarseData R a) + (hsum : + Summable (fun m : ℕ => + geometricWeight s 2 m * + maxDescendantBBlockNormAtScale R (R.scale - (m : ℤ)) a)) + (hchildBdd : + ∀ S ∈ descendantsAtDepth R 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo S s N + (fun x => matVecMul (a x) (u x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo R s N + (fun x => g x - cubeAverageVec R g))) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + (∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + cubeAverage R (coefficientEnergyDensity a u) + + η * (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2 + + η * (cubeBesovNegativeVectorSeminormTwo R s (fun x => w.toH1.grad x)) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * LambdaSq R s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo R s + (fun x => g x - cubeAverageVec R g)) ^ 2)) := by + rcases + exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + (P := P) (R := R) (n := n) (a := a) (g := g) (u := u) + (lam := lam) (Lam := Lam) + hu_potential hu_residual hR hEllR hu_memR hg_memR hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_of_childBddAbove + (u := u) w s hs hη hEllR hu_memR hg_memR + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := R) (a := a) hEllR w hDataR) + hsum huw hchildBdd huBdd hwBdd hgBdd + +end MeanZeroNeumannCorrectorData + +/-- +PDE-facing full-seminorm local recurrence interface for the weak-flux RHS lane. + +This is the one-cube recurrence after constructing the centered Neumann +corrector from an `H¹` RHS weak solution. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepEnergy_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ energy : Vec d → ℝ, + (∀ x ∈ cubeSet Q, 0 ≤ energy x) → + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume → + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) energy → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) → + (∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) → + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + hEll hu hg hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro energy henergy_nonneg henergy_int hflux hsum hchildBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_harmonic_energy_of_childBddAbove + (u := u.grad) w s hs energy hEll u.grad_memVectorL2 hg + henergy_nonneg henergy_int hflux hsum huw hchildBdd + +/-- +PDE-facing coefficient-energy local recurrence for the weak-flux RHS lane. + +This is the Step-2-ready form of the one-cube recurrence after constructing +the centered Neumann corrector from an `H¹` RHS weak solution. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) → + (∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) → + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x))) := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + hEll hu hg hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hflux hsum hchildBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorCoeffEnergy_of_childBddAbove + (u := u.grad) w s hs hEll u.grad_memVectorL2 hg hflux hsum huw hchildBdd + +/-- +PDE-facing coefficient-energy recurrence with harmonic flux control supplied by +deterministic coarse data. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_h1DirichletRhsWeakSolutionOn_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepCoeffEnergy_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hEll hu hg hC with + ⟨ω, w, huw, hstep⟩ + refine ⟨ω, w, huw, ?_⟩ + exact + hstep + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := Q) (a := a) hEll w hData) + hsum hchildBdd + +/-- +PDE-facing coefficient-energy recurrence with the corrector term replaced by +the short centered Besov product bound. As in the descendant-cube wrapper, the +harmonic boundedness assumption is exposed after the harmonic remainder has +been constructed. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepShortTerm_of_h1DirichletRhsWeakSolutionOn_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u.grad)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * + (Real.sqrt 2 * + (cubeBesovNegativeVectorSeminormTwo Q s u.grad + + cubeBesovNegativeVectorSeminormTwo Q s + (fun x => w.toH1.grad x))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)))) := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + hEll hu hg hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_correctorShortTerm_of_childBddAbove + (u := u.grad) w s hs hEll u.grad_memVectorL2 hg + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := Q) (a := a) hEll w hData) + hsum huw hchildBdd huBdd hwBdd hgBdd + +/-- +PDE-facing recurrence with the short corrector product absorbed into quadratic +`u`, harmonic, and forcing terms. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxSeminormStepAbsorbedShortTerm_of_h1DirichletRhsWeakSolutionOn_of_coarseData + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s η lam Lam : ℝ} + (hs : 0 < s) (hη : 0 < η) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hData : OpenCubeDescendantDeterministicCoarseData Q a) + (hsum : + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a)) + (hchildBdd : + ∀ R ∈ descendantsAtDepth Q 1, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x)))) + (huBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N u.grad)) + (hgBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (fun x => g x - cubeAverageVec Q g))) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + (BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N + (fun x => w.toH1.grad x)) → + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + 2 * ((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + η * (cubeBesovNegativeVectorSeminormTwo Q s u.grad) ^ 2 + + η * (cubeBesovNegativeVectorSeminormTwo Q s (fun x => w.toH1.grad x)) ^ 2 + + 2 * η⁻¹ * + (((((geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a) * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2))) * + cubeBesovPositiveVectorSeminormTwo Q s + (fun x => g x - cubeAverageVec Q g)) ^ 2)) := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + hEll hu hg hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro hwBdd + exact + ω.sq_cubeBesovNegativeVectorSeminormTwo_flux_le_descendantsAverage_add_uCoeffEnergy_add_eta_uSq_eta_wSq_invEta_gSq_of_childBddAbove + (u := u.grad) w s hs hη hEll u.grad_memVectorL2 hg + (cubeAverageFluxEnergyControl_of_aHarmonicFunction + (Q := Q) (a := a) hEll w hData) + hsum huw hchildBdd huBdd hwBdd hgBdd + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalAbsorbed.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalAbsorbed.lean new file mode 100644 index 0000000000..2391085f4f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalAbsorbed.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AbsorbedNoteApex + +/-! +# Absorbed global weak-flux wrappers + +Compatibility module for the split Section 3.2.3 absorbed weak-flux development. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalIteration.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalIteration.lean new file mode 100644 index 0000000000..b10085cc5c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/GlobalIteration.lean @@ -0,0 +1,707 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.DepthWeightAlgebra +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.AveragedStepping + +/-! # Global Iteration -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-- Averaged squared `q = 2` weak-flux seminorm at descendant depth `j`. -/ +noncomputable def weakFluxRHSAveragedSeminormSq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) : ℝ := + descendantsAverage Q j + (fun R => + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2) + +@[simp] theorem weakFluxRHSAveragedSeminormSq_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) : + weakFluxRHSAveragedSeminormSq Q a s u 0 = + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 := by + simp [weakFluxRHSAveragedSeminormSq, descendantsAverage] + +theorem weakFluxRHSAveragedSeminormSq_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ weakFluxRHSAveragedSeminormSq Q a s u j := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + +/-- Finite weighted error sum produced by iterating the weak-flux recurrence. -/ +noncomputable def weakFluxRHSAveragedErrorSum {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (E : TriadicCube d → ℝ) + (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + (Real.rpow (3 : ℝ) (-2 * s)) ^ k * descendantsAverage Q (m + k) E + +/-- Manuscript `T_n`-style scaled averaged weak-flux quantity. -/ +noncomputable def weakFluxRHSScaledAveragedSeminormSq {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) : ℝ := + coarsePoincareRHSDepthWeight s j * + weakFluxRHSAveragedSeminormSq Q a s u j + +@[simp] theorem weakFluxRHSScaledAveragedSeminormSq_zero {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) : + weakFluxRHSScaledAveragedSeminormSq Q a s u 0 = + (cubeBesovNegativeVectorSeminormTwo Q s + (fun x => matVecMul (a x) (u x))) ^ 2 := by + simp [weakFluxRHSScaledAveragedSeminormSq] + +theorem weakFluxRHSScaledAveragedSeminormSq_nonneg {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ weakFluxRHSScaledAveragedSeminormSq Q a s u j := by + unfold weakFluxRHSScaledAveragedSeminormSq coarsePoincareRHSDepthWeight + exact mul_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (weakFluxRHSAveragedSeminormSq_nonneg Q a s u j) + +/-- Finite weighted error sum for the scaled weak-flux recurrence. -/ +noncomputable def weakFluxRHSScaledAveragedErrorSum {d : ℕ} + (Q : TriadicCube d) (s θ : ℝ) (E : TriadicCube d → ℝ) + (m N : ℕ) : ℝ := + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E) + +theorem weakFluxRHSScaledStepCoeff_eq (s : ℝ) : + coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s)) = + Real.rpow (3 : ℝ) (-s) := by + have h3 : 0 < (3 : ℝ) := by norm_num + unfold coarsePoincareRHSScaledStepCoeff + calc + Real.rpow (3 : ℝ) (-2 * s) * Real.rpow (3 : ℝ) s = + Real.rpow (3 : ℝ) ((-2 * s) + s) := by + exact (Real.rpow_add h3 (-2 * s) s).symm + _ = Real.rpow (3 : ℝ) (-s) := by + congr 1 + ring + +/-- A uniform base bound on the weighted averaged error terms controls the +finite scaled weak-flux error sum by a geometric tail. -/ +theorem weakFluxRHSScaledAveragedErrorSum_le_base_mul_inv_one_sub + {d : ℕ} (Q : TriadicCube d) (s θ : ℝ) (E : TriadicCube d → ℝ) + (m N : ℕ) {B : ℝ} + (hr_nonneg : 0 ≤ coarsePoincareRHSScaledStepCoeff s θ) + (hr_lt_one : coarsePoincareRHSScaledStepCoeff s θ < 1) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k ∈ Finset.range N, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E ≤ B) : + weakFluxRHSScaledAveragedErrorSum Q s θ E m N ≤ + B * (1 - coarsePoincareRHSScaledStepCoeff s θ)⁻¹ := by + unfold weakFluxRHSScaledAveragedErrorSum + calc + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * + (coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E) + ≤ + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k * B := by + refine Finset.sum_le_sum ?_ + intro k hk + exact mul_le_mul_of_nonneg_left (hterm k hk) + (pow_nonneg hr_nonneg k) + _ = + B * + ∑ k ∈ Finset.range N, + (coarsePoincareRHSScaledStepCoeff s θ) ^ k := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro k hk + ring + _ ≤ B * (1 - coarsePoincareRHSScaledStepCoeff s θ)⁻¹ := by + exact mul_le_mul_of_nonneg_left + (geom_sum_range_le_of_lt_one hr_nonneg hr_lt_one) hB_nonneg + +/-- Note-facing form of the scaled weak-flux error summation: after the +natural `T_n` scaling the one-step ratio is `3^{-s}`. -/ +theorem weakFluxRHSScaledAveragedErrorSum_le_base_mul_inv_one_sub_weakFlux + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (E : TriadicCube d → ℝ) + (m N : ℕ) {B : ℝ} + (hs : 0 < s) (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k ∈ Finset.range N, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E ≤ B) : + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N ≤ + B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hr_nonneg : + 0 ≤ coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s)) := by + rw [weakFluxRHSScaledStepCoeff_eq] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : + coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s)) < 1 := by + rw [weakFluxRHSScaledStepCoeff_eq] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith) + have hsum := + weakFluxRHSScaledAveragedErrorSum_le_base_mul_inv_one_sub + Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N + hr_nonneg hr_lt_one hB_nonneg hterm + rwa [weakFluxRHSScaledStepCoeff_eq] at hsum + +/-- The localized `ℓ²` flux-defect average used by the Section 3.3 black boxes +is the square root of the averaged squared weak-flux quantity. -/ +@[simp] theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_eq_sqrt_weakFluxRHSAveragedSeminormSq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) j = + Real.sqrt (weakFluxRHSAveragedSeminormSq Q a s u j) := by + rfl + +/-- Square-root extraction from a bound on the averaged squared weak-flux +quantity. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_weakFluxRHSAveragedSeminormSq_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) {B : ℝ} + (hB : + weakFluxRHSAveragedSeminormSq Q a s u j ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) j ≤ + Real.sqrt B := by + simpa using Real.sqrt_le_sqrt hB + +/-- Square-root extraction from a square bound on the averaged weak-flux +quantity. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_of_weakFluxRHSAveragedSeminormSq_le_sq + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (j : ℕ) {B : ℝ} + (hB_nonneg : 0 ≤ B) + (hB : + weakFluxRHSAveragedSeminormSq Q a s u j ≤ B ^ 2) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) j ≤ B := by + simpa using (Real.sqrt_le_iff).2 ⟨hB_nonneg, hB⟩ + +/-- Finite-scale iteration of the averaged weak-flux recurrence. This is the +direct Lean form of manuscript Section 3.2.3, Step 4, before the error terms +are localized and summed with the final constants. -/ +theorem weakFluxRHSAveragedSeminormSq_iterate_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m N : ℕ) : + weakFluxRHSAveragedSeminormSq Q a s u m ≤ + (Real.rpow (3 : ℝ) (-2 * s)) ^ N * + weakFluxRHSAveragedSeminormSq Q a s u (m + N) + + weakFluxRHSAveragedErrorSum Q s E m N := by + let γ : ℝ := Real.rpow (3 : ℝ) (-2 * s) + let Rseq : ℕ → ℝ := fun j => weakFluxRHSAveragedSeminormSq Q a s u j + let Eseq : ℕ → ℝ := fun j => descendantsAverage Q j E + have hγ_nonneg : 0 ≤ γ := by + dsimp [γ] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hstep : ∀ j : ℕ, Rseq j ≤ γ * Rseq (j + 1) + Eseq j := by + intro j + simpa [Rseq, Eseq, γ, weakFluxRHSAveragedSeminormSq] using + descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_flux_le_discount_next_add_error_of_localBound + (Q := Q) (a := a) (s := s) (u := u) (j := j) (E := E) + (hlocal j) + simpa [Rseq, Eseq, γ, weakFluxRHSAveragedSeminormSq, + weakFluxRHSAveragedErrorSum] using + real_forward_recurrence_iterate_le + (R := Rseq) (E := Eseq) hγ_nonneg hstep m N + +/-- Finite-scale iteration of the manuscript `T_n`-scaled averaged weak-flux +recurrence. The one-step coefficient becomes `3^{-s}` after multiplying by +the natural depth weight. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_iterate_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m N : ℕ) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + (coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) ^ N * + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N) + + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N := by + let γ : ℝ := Real.rpow (3 : ℝ) (-2 * s) + let Sseq : ℕ → ℝ := fun j => weakFluxRHSScaledAveragedSeminormSq Q a s u j + let Eseq : ℕ → ℝ := fun j => + coarsePoincareRHSDepthWeight s j * descendantsAverage Q j E + have hγ_nonneg : 0 ≤ γ := by + dsimp [γ] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hscaled_nonneg : 0 ≤ coarsePoincareRHSScaledStepCoeff s γ := by + unfold coarsePoincareRHSScaledStepCoeff + exact mul_nonneg hγ_nonneg (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hstep : ∀ j : ℕ, + Sseq j ≤ coarsePoincareRHSScaledStepCoeff s γ * Sseq (j + 1) + Eseq j := by + intro j + have hR : + weakFluxRHSAveragedSeminormSq Q a s u j ≤ + γ * weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + descendantsAverage Q j E := by + simpa [γ, weakFluxRHSAveragedSeminormSq] using + descendantsAverage_sq_cubeBesovNegativeVectorSeminormTwo_flux_le_discount_next_add_error_of_localBound + (Q := Q) (a := a) (s := s) (u := u) (j := j) (E := E) + (hlocal j) + have hweight_nonneg : 0 ≤ coarsePoincareRHSDepthWeight s j := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hmul : + coarsePoincareRHSDepthWeight s j * weakFluxRHSAveragedSeminormSq Q a s u j ≤ + coarsePoincareRHSDepthWeight s j * + (γ * weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + descendantsAverage Q j E) := + mul_le_mul_of_nonneg_left hR hweight_nonneg + have hweight : + coarsePoincareRHSDepthWeight s j * γ = + coarsePoincareRHSScaledStepCoeff s γ * coarsePoincareRHSDepthWeight s (j + 1) := by + simpa using + (coarsePoincareRHSDepthWeight_mul_theta_pow_eq_scaledStepCoeff_mul + s γ j 1) + calc + Sseq j + = + coarsePoincareRHSDepthWeight s j * + weakFluxRHSAveragedSeminormSq Q a s u j := by + rfl + _ ≤ + coarsePoincareRHSDepthWeight s j * + (γ * weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + descendantsAverage Q j E) := hmul + _ = + coarsePoincareRHSScaledStepCoeff s γ * Sseq (j + 1) + Eseq j := by + calc + coarsePoincareRHSDepthWeight s j * + (γ * weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + descendantsAverage Q j E) + = + (coarsePoincareRHSDepthWeight s j * γ) * + weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j E := by + ring + _ = + (coarsePoincareRHSScaledStepCoeff s γ * + coarsePoincareRHSDepthWeight s (j + 1)) * + weakFluxRHSAveragedSeminormSq Q a s u (j + 1) + + coarsePoincareRHSDepthWeight s j * + descendantsAverage Q j E := by + rw [hweight] + _ = + coarsePoincareRHSScaledStepCoeff s γ * Sseq (j + 1) + + Eseq j := by + simp [Sseq, Eseq, weakFluxRHSScaledAveragedSeminormSq, + mul_assoc] + simpa [Sseq, Eseq, γ, weakFluxRHSScaledAveragedSeminormSq, + weakFluxRHSScaledAveragedErrorSum] using + real_forward_recurrence_iterate_le + (R := Sseq) (E := Eseq) hscaled_nonneg hstep m N + +/-- The scaled weak-flux terminal term vanishes under boundedness and `s > 0`. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_terminal_tendsto_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (m : ℕ) + (hs : 0 < s) + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) : + Filter.Tendsto + (fun N : ℕ => + (coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) ^ N * + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N)) + Filter.atTop (nhds 0) := by + have hshift_bdd : + BddAbove (Set.range fun N : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N)) := by + rcases hBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro _ ⟨N, rfl⟩ + exact hB ⟨m + N, rfl⟩ + exact + tendsto_pow_mul_of_nonneg_bddAbove + (r := coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) + (F := fun N : ℕ => weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N)) + (by + rw [weakFluxRHSScaledStepCoeff_eq] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (by + rw [weakFluxRHSScaledStepCoeff_eq] + exact Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by linarith)) + (fun N => weakFluxRHSScaledAveragedSeminormSq_nonneg Q a s u (m + N)) + hshift_bdd + +/-- Infinite-depth terminal passage for the scaled weak-flux recurrence. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_of_terminal_tendsto + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hterminal : + Filter.Tendsto + (fun N : ℕ => + (coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) ^ N * + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N)) + Filter.atTop (nhds 0)) + (hError : + ∀ N : ℕ, + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N ≤ B) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ B := by + refine real_le_of_forall_le_add_of_tendsto_zero hterminal ?_ + intro N + have hiter := + weakFluxRHSScaledAveragedSeminormSq_iterate_le Q a s u E hlocal m N + calc + weakFluxRHSScaledAveragedSeminormSq Q a s u m + ≤ + (coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) ^ N * + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N) + + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N := + hiter + _ ≤ + (coarsePoincareRHSScaledStepCoeff s (Real.rpow (3 : ℝ) (-2 * s))) ^ N * + weakFluxRHSScaledAveragedSeminormSq Q a s u (m + N) + + B := by + exact add_le_add_right (hError N) _ + +/-- Infinite-depth scaled weak-flux bound using boundedness to discharge the +terminal term. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hError : + ∀ N : ℕ, + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N ≤ B) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ B := + weakFluxRHSScaledAveragedSeminormSq_le_of_terminal_tendsto + Q a s u E hlocal m + (weakFluxRHSScaledAveragedSeminormSq_terminal_tendsto_of_bddAbove + Q a s u m hs hBdd) + hError + +/-- Bounded-tail scaled weak-flux iteration with the finite error sums closed +by a uniform geometric base bound. -/ +theorem weakFluxRHSScaledAveragedSeminormSq_le_base_mul_inv_one_sub_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E ≤ B) : + weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ + B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + exact + weakFluxRHSScaledAveragedSeminormSq_le_of_bddAbove + Q a s u E hs hlocal m hBdd + (fun N => + weakFluxRHSScaledAveragedErrorSum_le_base_mul_inv_one_sub_weakFlux + Q s E m N hs hB_nonneg fun k hk => hterm k) + +/-- Convert a scaled `T_m` bound back to the unscaled averaged weak-flux +quantity. -/ +theorem weakFluxRHSAveragedSeminormSq_le_inv_depthWeight_mul_of_scaled_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (m : ℕ) {B : ℝ} + (hB : weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ B) : + weakFluxRHSAveragedSeminormSq Q a s u m ≤ + (coarsePoincareRHSDepthWeight s m)⁻¹ * B := by + have hweight_pos : 0 < coarsePoincareRHSDepthWeight s m := by + unfold coarsePoincareRHSDepthWeight + exact Real.rpow_pos_of_pos (by norm_num : 0 < (3 : ℝ)) _ + calc + weakFluxRHSAveragedSeminormSq Q a s u m + = + (coarsePoincareRHSDepthWeight s m)⁻¹ * + (coarsePoincareRHSDepthWeight s m * + weakFluxRHSAveragedSeminormSq Q a s u m) := by + field_simp [hweight_pos.ne'] + _ ≤ (coarsePoincareRHSDepthWeight s m)⁻¹ * B := by + exact mul_le_mul_of_nonneg_left + (by simpa [weakFluxRHSScaledAveragedSeminormSq] using hB) + (inv_nonneg.mpr hweight_pos.le) + +/-- Localized flux-defect handoff from a scaled averaged weak-flux bound. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_weakFluxRHSScaledAveragedSeminormSq_le + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (m : ℕ) {B : ℝ} + (hB : weakFluxRHSScaledAveragedSeminormSq Q a s u m ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt ((coarsePoincareRHSDepthWeight s m)⁻¹ * B) := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_weakFluxRHSAveragedSeminormSq_le + Q a s u m + (weakFluxRHSAveragedSeminormSq_le_inv_depthWeight_mul_of_scaled_le + Q a s u m hB) + +/-- Localized flux-defect form of the scaled bounded-tail weak-flux iteration. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hError : + ∀ N : ℕ, + weakFluxRHSScaledAveragedErrorSum Q s (Real.rpow (3 : ℝ) (-2 * s)) E m N ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt ((coarsePoincareRHSDepthWeight s m)⁻¹ * B) := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_weakFluxRHSScaledAveragedSeminormSq_le + Q a s u m + (weakFluxRHSScaledAveragedSeminormSq_le_of_bddAbove + Q a s u E hs hlocal m hBdd hError) + +/-- Localized flux-defect form of the scaled bounded-tail weak-flux iteration +after closing the finite error sums by a uniform geometric base bound. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_base_mul_inv_one_sub_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSScaledAveragedSeminormSq Q a s u n)) + (hB_nonneg : 0 ≤ B) + (hterm : + ∀ k : ℕ, + coarsePoincareRHSDepthWeight s (m + k) * + descendantsAverage Q (m + k) E ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt + ((coarsePoincareRHSDepthWeight s m)⁻¹ * + (B * (1 - Real.rpow (3 : ℝ) (-s))⁻¹)) := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_scaled_weakFluxRHSScaledAveragedSeminormSq_le + Q a s u m + (weakFluxRHSScaledAveragedSeminormSq_le_base_mul_inv_one_sub_of_bddAbove + Q a s u E hs hlocal m hBdd hB_nonneg hterm) + +/-- The discounted terminal term vanishes if the averaged weak-flux seminorms +are bounded above and `s > 0`. -/ +theorem weakFluxRHSAveragedSeminormSq_terminal_tendsto_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (m : ℕ) + (hs : 0 < s) + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSAveragedSeminormSq Q a s u n)) : + Filter.Tendsto + (fun N : ℕ => + (Real.rpow (3 : ℝ) (-2 * s)) ^ N * + weakFluxRHSAveragedSeminormSq Q a s u (m + N)) + Filter.atTop (nhds 0) := by + have hshift_bdd : + BddAbove (Set.range fun N : ℕ => + weakFluxRHSAveragedSeminormSq Q a s u (m + N)) := by + rcases hBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro _ ⟨N, rfl⟩ + exact hB ⟨m + N, rfl⟩ + exact + tendsto_pow_mul_of_nonneg_bddAbove + (r := Real.rpow (3 : ℝ) (-2 * s)) + (F := fun N : ℕ => weakFluxRHSAveragedSeminormSq Q a s u (m + N)) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (Real.rpow_lt_one_of_one_lt_of_neg + (by norm_num : (1 : ℝ) < 3) (by nlinarith [hs])) + (fun N => by + exact descendantsAverage_nonneg Q (m + N) _ fun R hR => sq_nonneg _) + hshift_bdd + +/-- Infinite-depth terminal passage for the averaged weak-flux recurrence. Once +the terminal term tends to zero, any uniform bound on the finite weighted error +sums bounds the initial averaged seminorm. -/ +theorem weakFluxRHSAveragedSeminormSq_le_of_terminal_tendsto + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hterminal : + Filter.Tendsto + (fun N : ℕ => + (Real.rpow (3 : ℝ) (-2 * s)) ^ N * + weakFluxRHSAveragedSeminormSq Q a s u (m + N)) + Filter.atTop (nhds 0)) + (hError : ∀ N : ℕ, weakFluxRHSAveragedErrorSum Q s E m N ≤ B) : + weakFluxRHSAveragedSeminormSq Q a s u m ≤ B := by + refine real_le_of_forall_le_add_of_tendsto_zero hterminal ?_ + intro N + have hiter := + weakFluxRHSAveragedSeminormSq_iterate_le Q a s u E hlocal m N + calc + weakFluxRHSAveragedSeminormSq Q a s u m + ≤ + (Real.rpow (3 : ℝ) (-2 * s)) ^ N * + weakFluxRHSAveragedSeminormSq Q a s u (m + N) + + weakFluxRHSAveragedErrorSum Q s E m N := hiter + _ ≤ + (Real.rpow (3 : ℝ) (-2 * s)) ^ N * + weakFluxRHSAveragedSeminormSq Q a s u (m + N) + + B := by + exact add_le_add_right (hError N) _ + +/-- Infinite-depth weak-flux bound using boundedness of the averaged seminorm +sequence to discharge the terminal term. -/ +theorem weakFluxRHSAveragedSeminormSq_le_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSAveragedSeminormSq Q a s u n)) + (hError : ∀ N : ℕ, weakFluxRHSAveragedErrorSum Q s E m N ≤ B) : + weakFluxRHSAveragedSeminormSq Q a s u m ≤ B := + weakFluxRHSAveragedSeminormSq_le_of_terminal_tendsto + Q a s u E hlocal m + (weakFluxRHSAveragedSeminormSq_terminal_tendsto_of_bddAbove + Q a s u m hs hBdd) + hError + +/-- Localized flux-defect form of the bounded-tail weak-flux iteration. -/ +theorem localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_bddAbove + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) (s : ℝ) + (u : Vec d → Vec d) (E : TriadicCube d → ℝ) + (hs : 0 < s) + (hlocal : + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + (cubeBesovNegativeVectorSeminormTwo R s + (fun x => matVecMul (a x) (u x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage R 1 + (fun S => + (cubeBesovNegativeVectorSeminormTwo S s + (fun x => matVecMul (a x) (u x))) ^ 2) + + E R) + (m : ℕ) {B : ℝ} + (hBdd : + BddAbove (Set.range fun n : ℕ => + weakFluxRHSAveragedSeminormSq Q a s u n)) + (hError : ∀ N : ℕ, weakFluxRHSAveragedErrorSum Q s E m N ≤ B) : + localizedFluxDefectNegativeBesovAverageTwo Q s + (fun x => matVecMul (a x) (u x)) m ≤ + Real.sqrt B := by + exact + localizedFluxDefectNegativeBesovAverageTwo_matVecMul_le_sqrt_of_weakFluxRHSAveragedSeminormSq_le + Q a s u m + (weakFluxRHSAveragedSeminormSq_le_of_bddAbove + Q a s u E hs hlocal m hBdd hError) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/NeumannCorrector.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/NeumannCorrector.lean new file mode 100644 index 0000000000..c95e759b6f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/NeumannCorrector.lean @@ -0,0 +1,648 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge + +/-! # Neumann Corrector -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Mean-zero Neumann correctors for the RHS weak-flux lane + +This file packages the local correction used in Section 3.2.3. The key +feature, absent from the zero-trace Dirichlet corrector, is that the Neumann +residual has zero normal trace; on a cube this forces the residual flux average +to vanish. +-/ + +private theorem isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS {d : ℕ} + (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + let U : Set (Vec d) := cubeSet Q + let : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_cubeSet_lt_top Q⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) + infer_instance + +private theorem isBoundedDomain_cubeSet_weakFluxRHS {d : ℕ} (Q : TriadicCube d) : + IsBoundedDomain (cubeSet Q) := by + refine ⟨‖cubeCenter Q‖ + cubeRadius Q + 1, ?_, ?_⟩ + · have hnonneg : 0 ≤ ‖cubeCenter Q‖ + cubeRadius Q := + add_nonneg (norm_nonneg _) (cubeRadius_nonneg Q) + linarith + · intro x hx i + have hxball : x ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hx + have hdist : ‖x - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hxball + have hxnorm : ‖x‖ ≤ ‖cubeCenter Q‖ + cubeRadius Q + 1 := by + calc + ‖x‖ = ‖(x - cubeCenter Q) + cubeCenter Q‖ := by + congr 1 + abel + _ ≤ ‖x - cubeCenter Q‖ + ‖cubeCenter Q‖ := norm_add_le _ _ + _ ≤ cubeRadius Q + ‖cubeCenter Q‖ := add_le_add hdist le_rfl + _ = ‖cubeCenter Q‖ + cubeRadius Q := by ring + _ ≤ ‖cubeCenter Q‖ + cubeRadius Q + 1 := by linarith + exact (by simpa [Real.norm_eq_abs] using (norm_le_pi_norm x i).trans hxnorm) + +private theorem isSobolevRegularDomain_cubeSet_weakFluxRHS {d : ℕ} + (Q : TriadicCube d) : + IsSobolevRegularDomain (cubeSet Q) := + ⟨measurableSet_cubeSet Q, isBoundedDomain_cubeSet_weakFluxRHS Q⟩ + +/-- The half-open triadic cube inherits the mean-zero `H¹` coercive estimate +from the corresponding open cube, since the two realizations differ only by a +Lebesgue-null boundary. -/ +noncomputable def h1CoerciveEstimate_cubeSet {d : ℕ} [NeZero d] + (Q : TriadicCube d) : + H1CoerciveEstimate (cubeSet Q) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hCopen : H1CoerciveEstimate (openCubeSet Q) := + h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) + refine + { fixedValue := hCopen.fixedValue + constant_nonneg := hCopen.constant_nonneg + bound := ?_ } + intro u + let uOpen : H1MeanZeroFunction (openCubeSet Q) := + { toH1Function := u.toH1Function.toOpenCubeSet + meanZero := by + unfold MeanZeroOn + have hset := setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := u.toH1Function.toFun) + simpa using hset.symm.trans u.meanZero } + have hvalue : + u.valueL2Norm = uOpen.valueL2Norm := by + dsimp only [H1MeanZeroFunction.valueL2Norm, H1MeanZeroFunction.toScalarL2, + H1Function.toScalarL2, Homogenization.toScalarL2, uOpen] + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + refine congrArg ENNReal.toReal ?_ + rw [volumeMeasureOn, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q, + H1Function.toFun_toOpenCubeSet] + have hgrad : + u.gradientL2Norm = uOpen.gradientL2Norm := by + dsimp only [H1MeanZeroFunction.gradientL2Norm, H1MeanZeroFunction.gradToVectorL2, + H1Function.gradToVectorL2, Homogenization.toVectorL2, uOpen] + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + refine congrArg ENNReal.toReal ?_ + rw [volumeMeasureOn, volumeMeasureOn, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q, + H1Function.grad_toOpenCubeSet] + calc + u.valueL2Norm = uOpen.valueL2Norm := hvalue + _ ≤ hCopen.fixedValue * uOpen.gradientL2Norm := hCopen.bound uOpen + _ = hCopen.fixedValue * u.gradientL2Norm := by rw [hgrad] + +private theorem cubeAverageVec_sub_of_memVectorL2 {d : ℕ} (Q : TriadicCube d) + (u v : Vec d → Vec d) + (hu : MemVectorL2 (cubeSet Q) u) (hv : MemVectorL2 (cubeSet Q) v) : + cubeAverageVec Q (fun x => u x - v x) = + cubeAverageVec Q u - cubeAverageVec Q v := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + funext i + have hui : + MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hvi : + MeasureTheory.MemLp (fun x => v x i) (2 : ENNReal) + (volumeMeasureOn (cubeSet Q)) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + have hui_int : + MeasureTheory.Integrable (fun x => u x i) (volumeMeasureOn (cubeSet Q)) := + hui.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + have hvi_int : + MeasureTheory.Integrable (fun x => v x i) (volumeMeasureOn (cubeSet Q)) := + hvi.integrable (by norm_num : (1 : ENNReal) ≤ (2 : ENNReal)) + show cubeAverage Q (fun x => (u x - v x) i) = + cubeAverage Q (fun x => u x i) - cubeAverage Q (fun x => v x i) + have hfun : (fun x => (u x - v x) i) = fun x => u x i - v x i := by + funext x + simp + unfold cubeAverage + rw [hfun, MeasureTheory.integral_sub hui_int hvi_int] + ring + +private theorem cubeAverageVec_eq_of_eq_on_cubeSet_weakFluxRHS {d : ℕ} + {Q : TriadicCube d} {f g : Vec d → Vec d} + (hfg : ∀ x ∈ cubeSet Q, f x = g x) : + cubeAverageVec Q f = cubeAverageVec Q g := by + funext i + unfold cubeAverageVec cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume Q)⁻¹ * t) ?_ + refine MeasureTheory.integral_congr_ae ?_ + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => congrArg (fun v => v i) (hfg x hx) + +theorem cubeAverageVec_centered_eq_zero {d : ℕ} (Q : TriadicCube d) + (g : Vec d → Vec d) (hg : MemVectorL2 (cubeSet Q) g) : + cubeAverageVec Q (fun x => g x - cubeAverageVec Q g) = 0 := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + have hconst_mem : + MemVectorL2 (cubeSet Q) (fun _ : Vec d => cubeAverageVec Q g) := + memVectorL2_const (cubeAverageVec Q g) + have hsub := + cubeAverageVec_sub_of_memVectorL2 Q g (fun _ : Vec d => cubeAverageVec Q g) + hg hconst_mem + have hconst_avg : + cubeAverageVec Q (fun _ : Vec d => cubeAverageVec Q g) = cubeAverageVec Q g := by + funext i + simp [cubeAverageVec, cubeAverage_const] + calc + cubeAverageVec Q (fun x => g x - cubeAverageVec Q g) + = cubeAverageVec Q g - cubeAverageVec Q (fun _ : Vec d => cubeAverageVec Q g) := + hsub + _ = cubeAverageVec Q g - cubeAverageVec Q g := by rw [hconst_avg] + _ = 0 := by simp + +/-- A local mean-zero Neumann corrector on one cube for the weak equation +`- div(a grad omega) = div g`. -/ +structure MeanZeroNeumannCorrectorData {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (g : Vec d → Vec d) where + toH1MeanZero : H1MeanZeroFunction (cubeSet Q) + weakSolution : + IsMeanZeroNeumannRhsWeakSolution a (cubeSet Q) toH1MeanZero g + +/-- Package a local mean-zero Neumann corrector from a supplied coercive +estimate on the half-open cube. A later cube-realization bridge can discharge +the coercive input from the open-cube Poincare estimate. -/ +noncomputable def meanZeroNeumannCorrectorDataOf_h1CoerciveEstimate + {d : ℕ} (Q : TriadicCube d) {a : CoeffField d} {g : Vec d → Vec d} + {lam Lam : ℝ} + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) + (hne : Set.Nonempty (cubeSet Q)) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) : + MeanZeroNeumannCorrectorData Q a g := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + exact + ⟨H1MeanZeroFunction.coeffGradientProblemSolution + (U := cubeSet Q) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll, + isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + (U := cubeSet Q) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll⟩ + +namespace MeanZeroNeumannCorrectorData + +variable {d : ℕ} {Q : TriadicCube d} {a : CoeffField d} {g : Vec d → Vec d} + +/-- The Neumann-corrector residual has zero normal trace. -/ +theorem residualFlux_zeroNormalTrace + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) : + IsSolenoidalZeroNormalTraceOn (cubeSet Q) + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - g x) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + exact ω.weakSolution.residual_zeroNormalTrace hEll hg + +/-- The averaged residual flux of a Neumann corrector vanishes on a cube. -/ +theorem cubeAverageVec_residualFlux_eq_zero + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) : + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - g x) = 0 := by + have hzero : + (fun i => + ∫ x in cubeSet Q, + (matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - g x) i + ∂MeasureTheory.volume) = 0 := + IsSolenoidalZeroNormalTraceOn.integral_eq_zero + (isSobolevRegularDomain_cubeSet_weakFluxRHS Q) + (ω.residualFlux_zeroNormalTrace hEll hg) + funext i + unfold cubeAverageVec cubeAverage + rw [show + ∫ x in cubeSet Q, + (matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - g x) i + ∂MeasureTheory.volume = 0 by + simpa using congrFun hzero i] + simp + +/-- If the Neumann RHS is centered, then the corrector flux itself has zero +cube average, the algebraic cancellation used in manuscript Section 3.2.3. -/ +theorem cubeAverageVec_flux_eq_zero_of_cubeAverageVec_rhs_eq_zero + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a g) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) + (havg_g : cubeAverageVec Q g = 0) : + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) = 0 := by + have hflux_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hsub := + cubeAverageVec_sub_of_memVectorL2 Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) g + hflux_mem hg + have hres := ω.cubeAverageVec_residualFlux_eq_zero hEll hg + calc + cubeAverageVec Q (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) + = cubeAverageVec Q (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) - + cubeAverageVec Q g := by rw [havg_g, sub_zero] + _ = + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - g x) := by + rw [hsub] + _ = 0 := hres + +/-- Centered-RHS form of the zero-average corrector-flux cancellation. -/ +theorem cubeAverageVec_flux_eq_zero_of_centered_rhs + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a + (fun x => g x - cubeAverageVec Q g)) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) : + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) = 0 := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + have hconst_mem : + MemVectorL2 (cubeSet Q) (fun _ : Vec d => cubeAverageVec Q g) := + memVectorL2_const (cubeAverageVec Q g) + have hg_centered : + MemVectorL2 (cubeSet Q) (fun x => g x - cubeAverageVec Q g) := + hg.sub hconst_mem + exact + ω.cubeAverageVec_flux_eq_zero_of_cubeAverageVec_rhs_eq_zero + hEll hg_centered (cubeAverageVec_centered_eq_zero Q g hg) + +/-- Correcting a potential weak solution by the mean-zero Neumann solution with +centered RHS produces an `a`-harmonic remainder on the cube. -/ +theorem exists_aHarmonicRemainder_of_potential_solenoidal_centered + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a + (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet Q) u) + (hu_residual : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x)) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hg : MemVectorL2 (cubeSet Q) g) : + ∃ w : AHarmonicFunction a (cubeSet Q), + ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS Q + rcases hu_potential with ⟨v, hv⟩ + let wH1 : H1Function (cubeSet Q) := v - ω.toH1MeanZero.toH1Function + have hconst_mem : + MemVectorL2 (cubeSet Q) (fun _ : Vec d => cubeAverageVec Q g) := + memVectorL2_const (cubeAverageVec Q g) + have hg_centered : + MemVectorL2 (cubeSet Q) (fun x => g x - cubeAverageVec Q g) := + hg.sub hconst_mem + have hu_mem : MemVectorL2 (cubeSet Q) u := by + simpa [← hv] using v.grad_memVectorL2 + have hflux_u_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hu_mem + have hres_u_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (u x) - g x) := + hflux_u_mem.sub hg + have hflux_ω_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hres_ω_mem : + MemVectorL2 (cubeSet Q) + (fun x => + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - + (g x - cubeAverageVec Q g)) := + hflux_ω_mem.sub hg_centered + have hω_residual : + IsSolenoidalOn (cubeSet Q) + (fun x => + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - + (g x - cubeAverageVec Q g)) := + (ω.residualFlux_zeroNormalTrace hEll hg_centered).isSolenoidalOn + have hsol_diff : + IsSolenoidalOn (cubeSet Q) + ((fun x => matVecMul (a x) (u x) - g x) + + (-1 : ℝ) • + (fun x => + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - + (g x - cubeAverageVec Q g))) := + isSolenoidalOn_add_of_memVectorL2 hres_u_mem (hres_ω_mem.const_smul (-1)) + hu_residual (isSolenoidalOn_smul hω_residual (-1)) + have hdiff_mem : + MemVectorL2 (cubeSet Q) + ((fun x => matVecMul (a x) (u x) - g x) + + (-1 : ℝ) • + (fun x => + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - + (g x - cubeAverageVec Q g))) := + hres_u_mem.add (hres_ω_mem.const_smul (-1)) + have hvol : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hconst_sol : + IsSolenoidalOn (cubeSet Q) (fun _ : Vec d => cubeAverageVec Q g) := + IsSolenoidalOn.const_isSolenoidalOn_of_isSobolevRegularDomain + (isSobolevRegularDomain_cubeSet_weakFluxRHS Q) hvol (cubeAverageVec Q g) + have hsol_with_const : + IsSolenoidalOn (cubeSet Q) + (((fun x => matVecMul (a x) (u x) - g x) + + (-1 : ℝ) • + (fun x => + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x) - + (g x - cubeAverageVec Q g))) + + fun _ : Vec d => cubeAverageVec Q g) := + isSolenoidalOn_add_of_memVectorL2 hdiff_mem hconst_mem hsol_diff hconst_sol + have hsol : + IsSolenoidalOn (cubeSet Q) (fun x => matVecMul (a x) (wH1.grad x)) := by + convert hsol_with_const using 1 + funext x + ext i + simp [wH1, hv, sub_eq_add_neg, matVecMul_add, matVecMul_neg, Pi.add_apply] + ring + let w : AHarmonicFunction a (cubeSet Q) := + { toH1 := wH1 + isHarmonic := ⟨wH1.isPotentialOn, hsol⟩ } + refine ⟨w, ?_⟩ + intro x hx + change u x = wH1.grad x + ω.toH1MeanZero.toH1Function.grad x + simp [wH1, hv, sub_eq_add_neg] + +/-- The zero average of the centered Neumann corrector flux lets the local +flux average of the original field be replaced by the harmonic remainder's +flux average. -/ +theorem cubeAverageVec_flux_eq_harmonicRemainderFlux_of_centered_rhs + {lam Lam : ℝ} (ω : MeanZeroNeumannCorrectorData Q a + (fun x => g x - cubeAverageVec Q g)) + (w : AHarmonicFunction a (cubeSet Q)) {u : Vec d → Vec d} + (hdecomp : + ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu_mem : MemVectorL2 (cubeSet Q) u) + (hg : MemVectorL2 (cubeSet Q) g) : + cubeAverageVec Q (fun x => matVecMul (a x) (u x)) = + cubeAverageVec Q (fun x => matVecMul (a x) (w.toH1.grad x)) := by + have hflux_u_mem : + MemVectorL2 (cubeSet Q) (fun x => matVecMul (a x) (u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hu_mem + have hflux_ω_mem : + MemVectorL2 (cubeSet Q) + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hsub := + cubeAverageVec_sub_of_memVectorL2 Q + (fun x => matVecMul (a x) (u x)) + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) + hflux_u_mem hflux_ω_mem + have hω_avg : + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) = 0 := + ω.cubeAverageVec_flux_eq_zero_of_centered_rhs hEll hg + have hsub_eq : + cubeAverageVec Q + (fun x => + matVecMul (a x) (u x) - + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) = + cubeAverageVec Q (fun x => matVecMul (a x) (w.toH1.grad x)) := by + apply cubeAverageVec_eq_of_eq_on_cubeSet_weakFluxRHS + intro x hx + rw [hdecomp x hx] + ext i + simp [matVecMul_add] + calc + cubeAverageVec Q (fun x => matVecMul (a x) (u x)) + = + cubeAverageVec Q (fun x => matVecMul (a x) (u x)) - + cubeAverageVec Q + (fun x => matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) := by + rw [hω_avg, sub_zero] + _ = + cubeAverageVec Q + (fun x => + matVecMul (a x) (u x) - + matVecMul (a x) (ω.toH1MeanZero.toH1Function.grad x)) := by + rw [hsub] + _ = cubeAverageVec Q (fun x => matVecMul (a x) (w.toH1.grad x)) := hsub_eq + +/-- Cube-average form of the Neumann corrector energy identity obtained by +testing the centered corrector equation with the corrector itself. -/ +theorem cubeAverage_coefficientEnergyDensity_eq_centered_rhs_pairing + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) : + cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) = + cubeAverage Q + (fun x => + vecDot (g x - cubeAverageVec Q g) + (ω.toH1MeanZero.toH1Function.grad x)) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + have henergy_eq : + ∫ x in cubeSet Q, coefficientEnergyDensity a ωgrad x ∂MeasureTheory.volume = + ∫ x in cubeSet Q, + vecDot (ωgrad x) (matVecMul (a x) (ωgrad x)) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => by + simpa [ωgrad] using coefficientEnergyDensity_eq_unsymmetrized a ωgrad x + have hweak := ω.weakSolution.energy_identity + unfold cubeAverage + rw [henergy_eq] + rw [hweak] + +/-- Coefficient-energy version of the split +`w = u - grad omega` for the mean-zero Neumann corrector. -/ +theorem cubeAverage_coefficientEnergyDensity_harmonic_le_two_mul_add + (ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g)) + {u : Vec d → Vec d} (w : AHarmonicFunction a (cubeSet Q)) + {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (huw : ∀ x ∈ cubeSet Q, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) + (hu : MemVectorL2 (cubeSet Q) u) : + cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + 2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q + (coefficientEnergyDensity a + (fun x => ω.toH1MeanZero.toH1Function.grad x)) := by + let ωgrad : Vec d → Vec d := fun x => ω.toH1MeanZero.toH1Function.grad x + have hwEnergy_int : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a (fun x => w.toH1.grad x)) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + w.toH1.grad_memVectorL2 + have huEnergy_int : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a u) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll hu + have hωEnergy_int : + MeasureTheory.IntegrableOn + (coefficientEnergyDensity a ωgrad) (cubeSet Q) := + integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn hEll + ω.toH1MeanZero.toH1Function.grad_memVectorL2 + have hpoint : + ∀ x ∈ cubeSet Q, + coefficientEnergyDensity a (fun y => w.toH1.grad y) x ≤ + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ωgrad x) := by + intro x hx + have hwsub : w.toH1.grad x = u x - ωgrad x := by + ext i + change w.toH1.grad x i = u x i - ω.toH1MeanZero.toH1Function.grad x i + have hcoord : u x i = w.toH1.grad x i + + ω.toH1MeanZero.toH1Function.grad x i := by + simpa using congrArg (fun z => z i) (huw x hx) + linarith + have hsub := + coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + hEll u ωgrad x hx + have hEq : + coefficientEnergyDensity a (fun y => w.toH1.grad y) x = + coefficientEnergyDensity a (fun y => u y - ωgrad y) x := by + simp [coefficientEnergyDensity, hwsub] + exact hEq.trans_le hsub + have havg_raw : + cubeAverage Q (coefficientEnergyDensity a (fun x => w.toH1.grad x)) ≤ + cubeAverage Q + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ωgrad x)) := by + unfold cubeAverage + have hvol_inv_nonneg : 0 ≤ (cubeVolume Q)⁻¹ := by + exact inv_nonneg.mpr (le_of_lt (cubeVolume_pos Q)) + refine mul_le_mul_of_nonneg_left ?_ hvol_inv_nonneg + exact + MeasureTheory.integral_mono_ae hwEnergy_int + ((huEnergy_int.add hωEnergy_int).const_mul (2 : ℝ)) + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => hpoint x hx) + have hsplit : + cubeAverage Q + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ωgrad x)) = + 2 * cubeAverage Q (coefficientEnergyDensity a u) + + 2 * cubeAverage Q (coefficientEnergyDensity a ωgrad) := by + unfold cubeAverage + have hfun : + (fun x => + 2 * + (coefficientEnergyDensity a u x + + coefficientEnergyDensity a ωgrad x)) = + (fun x => + 2 * coefficientEnergyDensity a u x + + 2 * coefficientEnergyDensity a ωgrad x) := by + funext x + ring + rw [hfun, MeasureTheory.integral_add (huEnergy_int.const_mul (2 : ℝ)) + (hωEnergy_int.const_mul (2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + ring + exact havg_raw.trans_eq hsplit + +/-- Descendant-cube form of the centered Neumann corrector harmonic-remainder +construction. The parent potential/solenoidal predicates are restricted to +the descendant cube, matching the local step used in the weak-flux recurrence. +-/ +theorem exists_aHarmonicRemainder_of_parent_potential_solenoidal_centered + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam : ℝ} + (ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g)) + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) : + ∃ w : AHarmonicFunction a (cubeSet R), + ∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x := by + have hu_potential_R : + IsPotentialOn (cubeSet R) u := + hu_potential.restrict_cubeSet_of_mem_descendantsAtDepth hR + have hflux_memR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEllR hu_memR + have hres_memR : + MemVectorL2 (cubeSet R) (fun x => matVecMul (a x) (u x) - g x) := + hflux_memR.sub hg_memR + have hu_residual_R : + IsSolenoidalOn (cubeSet R) (fun x => matVecMul (a x) (u x) - g x) := + hu_residual.restrict_cubeSet_of_mem_descendantsAtDepth hR hres_memR + exact + ω.exists_aHarmonicRemainder_of_potential_solenoidal_centered + hu_potential_R hu_residual_R hEllR hg_memR + +/-- Fully constructed descendant-cube centered Neumann corrector and harmonic +remainder from parent potential/solenoidal PDE data, assuming the local +mean-zero coercive estimate on the descendant half-open cube. -/ +theorem exists_centeredCorrector_aHarmonicRemainder_of_parent_potential_solenoidal_h1CoerciveEstimate + [NeZero d] {P R : TriadicCube d} {n : ℕ} {lam Lam : ℝ} + {u : Vec d → Vec d} + (hu_potential : IsPotentialOn (cubeSet P) u) + (hu_residual : + IsSolenoidalOn (cubeSet P) (fun x => matVecMul (a x) (u x) - g x)) + (hR : R ∈ descendantsAtDepth P n) + (hEllR : IsEllipticFieldOn lam Lam (cubeSet R) a) + (hu_memR : MemVectorL2 (cubeSet R) u) + (hg_memR : MemVectorL2 (cubeSet R) g) + (hC : H1CoerciveEstimate (cubeSet R)) : + ∃ ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g), + ∃ w : AHarmonicFunction a (cubeSet R), + ∀ x ∈ cubeSet R, + u x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet R)) := + isFiniteMeasureVolumeMeasureOnCubeSet_weakFluxRHS R + have hconst_mem : + MemVectorL2 (cubeSet R) (fun _ : Vec d => cubeAverageVec R g) := + memVectorL2_const (cubeAverageVec R g) + have hg_centered : + MemVectorL2 (cubeSet R) (fun x => g x - cubeAverageVec R g) := + hg_memR.sub hconst_mem + have hne : Set.Nonempty (cubeSet R) := by + refine ⟨cubeCenter R, openCubeSet_subset_cubeSet R ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos R + let ω : MeanZeroNeumannCorrectorData R a (fun x => g x - cubeAverageVec R g) := + meanZeroNeumannCorrectorDataOf_h1CoerciveEstimate + (Q := R) (a := a) (g := fun x => g x - cubeAverageVec R g) + (lam := lam) (Lam := Lam) hg_centered hC hne hEllR + rcases + ω.exists_aHarmonicRemainder_of_parent_potential_solenoidal_centered + (P := P) (R := R) (n := n) (u := u) + hu_potential hu_residual hR hEllR hu_memR hg_memR with + ⟨w, hw⟩ + exact ⟨ω, w, hw⟩ + +end MeanZeroNeumannCorrectorData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/WeakSolutionBridge.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/WeakSolutionBridge.lean new file mode 100644 index 0000000000..7ad5e0b239 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakFluxRHS/WeakSolutionBridge.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.FinalTheorems.ExpandedAndElliptic +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincareRHS.Regularity +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.FluxStepping +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakFluxRHS.NeumannCorrector + +/-! # Weak Solution Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Weak-solution bridges for the RHS weak-flux lane + +This file starts the Section 3.2.3 development by exposing the existing +RHS Poincare machinery through the same `H¹` weak-solution predicate used by +the Section 3.3 black boxes. The theorem below controls the gradient field; +the full weak-flux estimate still needs the local Neumann-correction and +harmonic-flux recurrence from manuscript lines 1720--2224. +-/ + +/-- +Build the centered Neumann corrector and the corresponding harmonic remainder +directly from an `H¹` RHS weak solution on one cube. + +This is the manuscript Step 1 interface for Section 3.2.3, modulo the supplied +mean-zero coercive estimate on the half-open cube. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + ∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := + isFiniteMeasureVolumeMeasureOnCubeSet_rhs Q + have hconst_mem : + MemVectorL2 (cubeSet Q) (fun _ : Vec d => cubeAverageVec Q g) := + memVectorL2_const (cubeAverageVec Q g) + have hg_centered : + MemVectorL2 (cubeSet Q) (fun x => g x - cubeAverageVec Q g) := + hg.sub hconst_mem + have hne : Set.Nonempty (cubeSet Q) := by + refine ⟨cubeCenter Q, openCubeSet_subset_cubeSet Q ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + simpa [Metric.mem_ball] using cubeRadius_pos Q + let ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g) := + meanZeroNeumannCorrectorDataOf_h1CoerciveEstimate + (Q := Q) (a := a) (g := fun x => g x - cubeAverageVec Q g) + (lam := lam) (Lam := Lam) hg_centered hC hne hEll + rcases + ω.exists_aHarmonicRemainder_of_potential_solenoidal_centered + (Q := Q) (a := a) (g := g) (u := u.grad) + u.isPotentialOn (hu.residual_solenoidal hEll hg) hEll hg with + ⟨w, hw⟩ + exact ⟨ω, w, hw⟩ + +/-- +One-cube PDE-facing local recurrence interface for the weak-flux RHS lane. + +Starting from an `H¹` RHS weak solution, this constructs the centered Neumann +corrector and harmonic remainder, and packages the flux local-step estimate +for any supplied descendant flux-energy control of that harmonic remainder. +This is the Lean counterpart of manuscript Section 3.2.3, Steps 1--3, at the +single-cube interface level. -/ +theorem exists_centeredNeumannCorrector_aHarmonicRemainder_fluxStepEnergy_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MemVectorL2 (cubeSet Q) g) + (hC : H1CoerciveEstimate (cubeSet Q)) (N : ℕ) : + ∃ ω : MeanZeroNeumannCorrectorData Q a (fun x => g x - cubeAverageVec Q g), + ∃ w : AHarmonicFunction a (cubeSet Q), + (∀ x ∈ cubeSet Q, + u.grad x = w.toH1.grad x + ω.toH1MeanZero.toH1Function.grad x) ∧ + ∀ energy : Vec d → ℝ, + (∀ x ∈ cubeSet Q, 0 ≤ energy x) → + MeasureTheory.IntegrableOn energy (cubeSet Q) MeasureTheory.volume → + CubeAverageFluxEnergyControl Q a + (fun x => matVecMul (a x) (w.toH1.grad x)) energy → + Summable (fun n : ℕ => + geometricWeight s 2 n * + maxDescendantBBlockNormAtScale Q (Q.scale - (n : ℤ)) a) → + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) + (fun x => matVecMul (a x) (u.grad x))) ^ 2 ≤ + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N + (fun x => matVecMul (a x) (u.grad x))) ^ 2) + + (geometricDiscount s 2)⁻¹ * LambdaSq Q s (.finite 2) a * + cubeAverage Q energy := by + rcases + exists_centeredNeumannCorrector_aHarmonicRemainder_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + hEll hu hg hC with + ⟨ω, w, huw⟩ + refine ⟨ω, w, huw, ?_⟩ + intro energy henergy_nonneg henergy_int hflux hsum + exact + ω.sq_cubeBesovNegativeVectorPartialSeminormTwo_flux_succ_le_descendantsAverage_add_harmonic_energy + (u := u.grad) w s hs N energy hEll u.grad_memVectorL2 hg + henergy_nonneg henergy_int hflux hsum huw + +/-- +PDE-facing wrapper around the q=2 RHS Poincare final theorem. + +If `u` solves `-div(a grad u) = div g` on `Q`, then `grad u` is a potential +field whose residual flux `a grad u - g` is solenoidal. This packages those +two facts and applies +`cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal`. + +This is an infrastructure step for +`p.weak.flux.RHS.deterministic.theory`, not the final weak-flux estimate. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : MeasureTheory.MemLp g (2 : ENNReal) (normalizedCubeMeasure Q)) + (hGlobalBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N g)) : + cubeBesovNegativeVectorSeminormTwo Q s u.grad ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := by + have hgMem : MemVectorL2 (cubeSet Q) g := + memVectorL2_cubeSet_of_memLp_normalizedCubeMeasure Q hg + exact + cubeBesovNegativeVectorSeminormTwo_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_parent_potential_solenoidal + (Q := Q) (a := a) (g := g) (u := u.grad) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll u.isPotentialOn (hu.residual_solenoidal hEll hgMem) + hg hGlobalBdd + +/-- +PDE-facing RHS Poincare estimate with the manuscript `g ∈ H^s` regularity +package, rather than separate `L²` and positive-Besov boundedness hypotheses. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn_of_cubeVectorBesovHRegularity + {d : ℕ} [NeZero d] (Q : TriadicCube d) (a : CoeffField d) + (g : Vec d → Vec d) (u : H1Function (cubeSet Q)) {s lam Lam : ℝ} + (hs : 0 < s) (hs_le : s ≤ 1) + (hEll : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hu : IsH1DirichletRhsWeakSolutionOn a (cubeSet Q) u g) + (hg : CubeVectorBesovHRegularity Q s g) : + cubeBesovNegativeVectorSeminormTwo Q s u.grad ≤ + Real.sqrt + (250 * (s⁻¹) ^ 2 * (lambdaSq Q (s / 2) (.finite 2) a)⁻¹ * + cubeAverage Q (coefficientEnergyDensity a u.grad) + + 15000 * (s⁻¹) ^ 4 * ((lambdaSq Q (s / 2) (.finite 2) a)⁻¹) ^ 2 * + ((d : ℝ) * ((3 : ℝ) ^ ((d : ℝ) + s) * Real.sqrt 2)) ^ 2 * + (cubeBesovPositiveVectorSeminormTwo Q s g) ^ 2) := + cubeBesovNegativeVectorSeminormTwo_grad_le_sqrt_intrinsicGlobalEnergyForce_noteConstants_expanded_of_h1DirichletRhsWeakSolutionOn + (Q := Q) (a := a) (g := g) (u := u) + (s := s) (lam := lam) (Lam := Lam) + hs hs_le hEll hu hg.memLp hg.partialSeminorms_bddAbove + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces.lean new file mode 100644 index 0000000000..f45e55570a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Definitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Bounds + +/-! # Weak Norm Interfaces -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/AECongruence.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/AECongruence.lean new file mode 100644 index 0000000000..007c84739d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/AECongruence.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo + +/-! # AECongruence -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +theorem cubeAverage_eq_of_ae_eq_on_cubeSet {d : ℕ} {Q : TriadicCube d} + {f g : Vec d → ℝ} + (hfg : f =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] g) : + cubeAverage Q f = cubeAverage Q g := by + unfold cubeAverage + congr 1 + exact MeasureTheory.integral_congr_ae hfg + +theorem cubeAverageVec_eq_of_ae_eq_on_cubeSet {d : ℕ} {Q : TriadicCube d} + {f g : Vec d → Vec d} + (hfg : f =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] g) : + cubeAverageVec Q f = cubeAverageVec Q g := by + funext i + exact cubeAverage_eq_of_ae_eq_on_cubeSet + (hfg.mono fun x hx => congrArg (fun v : Vec d => v i) hx) + +theorem cubeBesovNegativeVectorDepthAverage_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q u j = + cubeBesovNegativeVectorDepthAverage Q v j := by + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + have hle : + MeasureTheory.volume.restrict (cubeSet R) ≤ + MeasureTheory.volume.restrict (cubeSet Q) := + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (cubeSet_subset_of_mem_descendantsAtDepth hR) + have huvR : u =ᵐ[MeasureTheory.volume.restrict (cubeSet R)] v := + huv.filter_mono (MeasureTheory.ae_mono hle) + exact congrArg vecNormSq <| cubeAverageVec_eq_of_ae_eq_on_cubeSet huvR + +theorem cubeBesovNegativeVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q s u j = + cubeBesovNegativeVectorDepthSeminorm Q s v j := by + unfold cubeBesovNegativeVectorDepthSeminorm + rw [cubeBesovNegativeVectorDepthAverage_eq_of_ae_eq_on_cubeSet huv] + +theorem cubeBesovNegativeVectorPartialSeminorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (N : ℕ) + (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) : + cubeBesovNegativeVectorPartialSeminorm Q s N u = + cubeBesovNegativeVectorPartialSeminorm Q s N v := by + unfold cubeBesovNegativeVectorPartialSeminorm + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [cubeBesovNegativeVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet s huv j] + +theorem cubeBesovNegativeVectorSeminorm_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) : + cubeBesovNegativeVectorSeminorm Q s u = + cubeBesovNegativeVectorSeminorm Q s v := by + unfold cubeBesovNegativeVectorSeminorm + apply congrArg sSup + ext y + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, (cubeBesovNegativeVectorPartialSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, cubeBesovNegativeVectorPartialSeminorm_eq_of_ae_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv⟩ + +theorem cubeBesovNegativeVectorPartialSeminormTwo_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (N : ℕ) + (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N u = + cubeBesovNegativeVectorPartialSeminormTwo Q s N v := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + congr 1 + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [cubeBesovNegativeVectorDepthSeminorm_eq_of_ae_eq_on_cubeSet s huv j] + +theorem cubeBesovNegativeVectorSeminormTwo_eq_of_ae_eq_on_cubeSet + {d : ℕ} {Q : TriadicCube d} {u v : Vec d → Vec d} + (s : ℝ) (huv : u =ᵐ[MeasureTheory.volume.restrict (cubeSet Q)] v) : + cubeBesovNegativeVectorSeminormTwo Q s u = + cubeBesovNegativeVectorSeminormTwo Q s v := by + unfold cubeBesovNegativeVectorSeminormTwo + apply congrArg sSup + ext y + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, (cubeBesovNegativeVectorPartialSeminormTwo_eq_of_ae_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, cubeBesovNegativeVectorPartialSeminormTwo_eq_of_ae_eq_on_cubeSet + (Q := Q) (u := u) (v := v) s N huv⟩ + +@[simp] theorem cubeBesovNegativeVectorDepthAverage_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q (0 : Vec d → Vec d) j = 0 := by + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + have hsum : + ∑ R ∈ descendantsAtDepth Q j, + vecNormSq (cubeAverageVec R (0 : Vec d → Vec d)) = 0 := by + refine Finset.sum_eq_zero ?_ + intro R _hR + have havg : cubeAverageVec R (0 : Vec d → Vec d) = 0 := by + funext i + unfold cubeAverageVec cubeAverage + simp + rw [havg] + exact vecNormSq_eq_zero_iff.mpr rfl + simp [hsum] + +@[simp] theorem cubeBesovNegativeVectorDepthSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q s (0 : Vec d → Vec d) j = 0 := by + unfold cubeBesovNegativeVectorDepthSeminorm + simp + +@[simp] theorem cubeBesovNegativeVectorPartialSeminormTwo_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N (0 : Vec d → Vec d) = 0 := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + simp + +@[simp] theorem cubeBesovNegativeVectorSeminormTwo_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) : + cubeBesovNegativeVectorSeminormTwo Q s (0 : Vec d → Vec d) = 0 := by + unfold cubeBesovNegativeVectorSeminormTwo + rw [show Set.range (fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q s N (0 : Vec d → Vec d)) = + ({0} : Set ℝ) by + ext x + constructor + · rintro ⟨N, rfl⟩ + simp + · intro hx + refine ⟨0, ?_⟩ + calc + cubeBesovNegativeVectorPartialSeminormTwo Q s 0 (0 : Vec d → Vec d) = 0 := by simp + _ = x := hx.symm] + simp + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Bounds.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Bounds.lean new file mode 100644 index 0000000000..5e0a57702f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Bounds.lean @@ -0,0 +1,999 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.Definitions +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage + +/-! # Bounds -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +theorem descendantsAverage_four_mul_sum_vecNormSq_cubeAverageVec_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (u₁ u₂ u₃ u₄ : Vec d → Vec d) : + descendantsAverage Q j + (fun R => + 4 * + (vecNormSq (cubeAverageVec R u₁) + vecNormSq (cubeAverageVec R u₂) + + vecNormSq (cubeAverageVec R u₃) + vecNormSq (cubeAverageVec R u₄))) = + 4 * + (cubeBesovNegativeVectorDepthAverage Q u₁ j + + cubeBesovNegativeVectorDepthAverage Q u₂ j + + cubeBesovNegativeVectorDepthAverage Q u₃ j + + cubeBesovNegativeVectorDepthAverage Q u₄ j) := by + simpa [cubeBesovNegativeVectorDepthAverage] using + descendantsAverage_four_mul_sum_vecNormSq_eq Q j + (fun R => cubeAverageVec R u₁) (fun R => cubeAverageVec R u₂) + (fun R => cubeAverageVec R u₃) (fun R => cubeAverageVec R u₄) + +/-- +Depthwise weighted weak-norm split for cube-indexed pieces. This is the +form used by the Section 5.3 analytic estimates before the predictor, +additivity, low-scale, and tail contributions have been represented as global +vector fields. +-/ +theorem cubeBesovNegativeVectorDepthSeminorm_le_two_mul_sum_of_cubeTerms_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) + (predictor additivity lowScale tail : TriadicCube d → Vec d) + (hdecomp : ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor R + additivity R + lowScale R + tail R) : + cubeBesovNegativeVectorDepthSeminorm Q s u j ≤ + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (predictor R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (additivity R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (lowScale R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (tail R))) := by + let A₁ := descendantsAverage Q j fun R => vecNormSq (predictor R) + let A₂ := descendantsAverage Q j fun R => vecNormSq (additivity R) + let A₃ := descendantsAverage Q j fun R => vecNormSq (lowScale R) + let A₄ := descendantsAverage Q j fun R => vecNormSq (tail R) + have hA₁ : 0 ≤ A₁ := by + simpa [A₁] using descendantsAverage_vecNormSq_nonneg Q j predictor + have hA₂ : 0 ≤ A₂ := by + simpa [A₂] using descendantsAverage_vecNormSq_nonneg Q j additivity + have hA₃ : 0 ≤ A₃ := by + simpa [A₃] using descendantsAverage_vecNormSq_nonneg Q j lowScale + have hA₄ : 0 ≤ A₄ := by + simpa [A₄] using descendantsAverage_vecNormSq_nonneg Q j tail + have hdepth : + cubeBesovNegativeVectorDepthAverage Q u j ≤ 4 * (A₁ + A₂ + A₃ + A₄) := by + have hsplit := + cubeBesovNegativeVectorDepthAverage_le_four_mul_sum_of_cubeAverageVec_eq + Q u j predictor additivity lowScale tail hdecomp + have hrewrite : + descendantsAverage Q j + (fun R => + 4 * + (vecNormSq (predictor R) + vecNormSq (additivity R) + + vecNormSq (lowScale R) + vecNormSq (tail R))) = + 4 * (A₁ + A₂ + A₃ + A₄) := by + simpa [A₁, A₂, A₃, A₄] using + descendantsAverage_four_mul_sum_vecNormSq_eq + Q j predictor additivity lowScale tail + exact hsplit.trans_eq hrewrite + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) ≤ + 2 * (Real.sqrt A₁ + Real.sqrt A₂ + Real.sqrt A₃ + Real.sqrt A₄) := + (Real.sqrt_le_sqrt hdepth).trans + (sqrt_four_mul_sum_le_two_mul_sum_sqrt hA₁ hA₂ hA₃ hA₄) + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovNegativeVectorDepthSeminorm + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) + ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (2 * (Real.sqrt A₁ + Real.sqrt A₂ + Real.sqrt A₃ + Real.sqrt A₄)) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₁ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₂ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₃ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₄) := by + ring + +/-- +Low-scale constant-tail split at one depth. If the descendant averages of `w` +are the averages of `u` plus a fixed vector `c`, then the depth contribution +of `w` is bounded by the depth contribution of `u` plus the constant tail. +-/ +theorem cubeBesovNegativeVectorDepthSeminorm_le_two_mul_self_add_const_of_cubeAverageVec_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) + (w u : Vec d → Vec d) (c : Vec d) + (hdecomp : ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = cubeAverageVec R u + c) : + cubeBesovNegativeVectorDepthSeminorm Q s w j ≤ + 2 * + (cubeBesovNegativeVectorDepthSeminorm Q s u j + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let A : ℝ := cubeBesovNegativeVectorDepthAverage Q u j + let B : ℝ := vecNormSq c + have hA : 0 ≤ A := by + simpa [A] using cubeBesovNegativeVectorDepthAverage_nonneg Q u j + have hB : 0 ≤ B := by + simpa [B] using vecNormSq_nonneg c + have havg : + cubeBesovNegativeVectorDepthAverage Q w j ≤ 2 * (A + B) := by + have hcard : ((D.card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q j)) + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + change + ((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R w) ≤ + 2 * + (((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R u) + + vecNormSq c) + calc + ((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R w) + ≤ + ((D.card : ℝ)⁻¹) * + ∑ R ∈ D, + 2 * (vecNormSq (cubeAverageVec R u) + vecNormSq c) := by + refine mul_le_mul_of_nonneg_left ?_ (inv_nonneg.mpr (by positivity)) + refine Finset.sum_le_sum ?_ + intro R hR + rw [hdecomp R hR] + exact vecNormSq_add_le (cubeAverageVec R u) c + _ = + 2 * + (((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R u) + + vecNormSq c) := by + rw [← Finset.mul_sum] + rw [Finset.sum_add_distrib, Finset.sum_const, nsmul_eq_mul] + calc + ((D.card : ℝ)⁻¹) * + (2 * + ((∑ R ∈ D, vecNormSq (cubeAverageVec R u)) + + (D.card : ℝ) * vecNormSq c)) + = + 2 * + (((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R u) + + ((D.card : ℝ)⁻¹ * (D.card : ℝ)) * vecNormSq c) := by + ring + _ = + 2 * + (((D.card : ℝ)⁻¹) * ∑ R ∈ D, vecNormSq (cubeAverageVec R u) + + vecNormSq c) := by + rw [inv_mul_cancel₀ hcard] + ring + have htwo_le_four : 2 * (A + B) ≤ 4 * (A + B + 0 + 0) := by + nlinarith [hA, hB] + have hsqrt_tail : + Real.sqrt (4 * (A + B + 0 + 0)) ≤ + 2 * (Real.sqrt A + Real.sqrt B) := by + simpa using + sqrt_four_mul_sum_le_two_mul_sum_sqrt hA hB + (by norm_num : 0 ≤ (0 : ℝ)) (by norm_num : 0 ≤ (0 : ℝ)) + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q w j) ≤ + 2 * (Real.sqrt A + Real.sqrt B) := + (Real.sqrt_le_sqrt (havg.trans htwo_le_four)).trans hsqrt_tail + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovNegativeVectorDepthSeminorm + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q w j) + ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (2 * (Real.sqrt A + Real.sqrt B)) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt B) := by + ring + +/-- +Depthwise weak-norm triangle inequality obtained from a four-term decomposition +of descendant cube averages. +-/ +theorem cubeBesovNegativeVectorDepthSeminorm_le_two_mul_sum_of_cubeAverageVec_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (j : ℕ) + (u u₁ u₂ u₃ u₄ : Vec d → Vec d) + (hdecomp : ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + cubeAverageVec R u₁ + cubeAverageVec R u₂ + + cubeAverageVec R u₃ + cubeAverageVec R u₄) : + cubeBesovNegativeVectorDepthSeminorm Q s u j ≤ + 2 * + (cubeBesovNegativeVectorDepthSeminorm Q s u₁ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₂ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₃ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₄ j) := by + let A₁ := cubeBesovNegativeVectorDepthAverage Q u₁ j + let A₂ := cubeBesovNegativeVectorDepthAverage Q u₂ j + let A₃ := cubeBesovNegativeVectorDepthAverage Q u₃ j + let A₄ := cubeBesovNegativeVectorDepthAverage Q u₄ j + have hA₁ : 0 ≤ A₁ := by + simpa [A₁] using cubeBesovNegativeVectorDepthAverage_nonneg Q u₁ j + have hA₂ : 0 ≤ A₂ := by + simpa [A₂] using cubeBesovNegativeVectorDepthAverage_nonneg Q u₂ j + have hA₃ : 0 ≤ A₃ := by + simpa [A₃] using cubeBesovNegativeVectorDepthAverage_nonneg Q u₃ j + have hA₄ : 0 ≤ A₄ := by + simpa [A₄] using cubeBesovNegativeVectorDepthAverage_nonneg Q u₄ j + have hdepth : + cubeBesovNegativeVectorDepthAverage Q u j ≤ 4 * (A₁ + A₂ + A₃ + A₄) := by + have hsplit := + cubeBesovNegativeVectorDepthAverage_le_four_mul_sum_of_cubeAverageVec_eq + Q u j + (fun R => cubeAverageVec R u₁) + (fun R => cubeAverageVec R u₂) + (fun R => cubeAverageVec R u₃) + (fun R => cubeAverageVec R u₄) + hdecomp + have hrewrite : + descendantsAverage Q j + (fun R => + 4 * + (vecNormSq (cubeAverageVec R u₁) + vecNormSq (cubeAverageVec R u₂) + + vecNormSq (cubeAverageVec R u₃) + vecNormSq (cubeAverageVec R u₄))) = + 4 * (A₁ + A₂ + A₃ + A₄) := by + simpa [A₁, A₂, A₃, A₄] using + descendantsAverage_four_mul_sum_vecNormSq_cubeAverageVec_eq Q j u₁ u₂ u₃ u₄ + exact hsplit.trans_eq hrewrite + have hsqrt : + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) ≤ + 2 * (Real.sqrt A₁ + Real.sqrt A₂ + Real.sqrt A₃ + Real.sqrt A₄) := + (Real.sqrt_le_sqrt hdepth).trans + (sqrt_four_mul_sum_le_two_mul_sum_sqrt hA₁ hA₂ hA₃ hA₄) + have hweight_nonneg : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + unfold cubeBesovNegativeVectorDepthSeminorm + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) + ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (2 * (Real.sqrt A₁ + Real.sqrt A₂ + Real.sqrt A₃ + Real.sqrt A₄)) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₁ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₂ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₃ + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A₄) := by + ring + +theorem cubeBesovNegativeVectorPartialSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + 0 ≤ cubeBesovNegativeVectorPartialSeminorm Q s N u := by + unfold cubeBesovNegativeVectorPartialSeminorm + simpa using + Finset.sum_nonneg + (fun j _ => cubeBesovNegativeVectorDepthSeminorm_nonneg Q s u j) + +/-- +Finite `q = 1` weak-norm control from depthwise descendant-average controls. +This is the direct weighted-sum form of the negative Besov estimate: no +ellipticity constants or Ch5 packaging enter. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_of_depthAverage_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) {A : ℕ → ℝ} + (hA : ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthAverage Q u j ≤ A j) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (A j) := by + unfold cubeBesovNegativeVectorPartialSeminorm + refine Finset.sum_le_sum ?_ + intro j hj + exact cubeBesovNegativeVectorDepthSeminorm_le_of_depthAverage_le Q s u j (hA j hj) + +/-- +Finite `q = 1` negative weak-norm bound from a four-term decomposition of +the descendant cube averages at every depth. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_of_four_term_depthAverage_decomposition + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor j R + additivity j R + lowScale j R + tail j R) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => + 4 * + (vecNormSq (predictor j R) + vecNormSq (additivity j R) + + vecNormSq (lowScale j R) + vecNormSq (tail j R))) := by + refine cubeBesovNegativeVectorPartialSeminorm_le_of_depthAverage_le Q s N u ?_ + intro j hj + exact + cubeBesovNegativeVectorDepthAverage_le_four_mul_sum_of_cubeAverageVec_eq + Q u j (predictor j) (additivity j) (lowScale j) (tail j) + (hdecomp j hj) + +/-- +Finite `q = 1` negative weak-norm split for cube-indexed analytic pieces at +each depth. This is the note-facing weighted Cauchy/Minkowski step for the +four contributions in the Section 5.3 maximizer estimate. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_two_mul_sum_of_cubeTerms_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor j R + additivity j R + lowScale j R + tail j R) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + 2 * + ((∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (predictor j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (additivity j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (lowScale j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (tail j R)))) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (tail j R)))) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact + cubeBesovNegativeVectorDepthSeminorm_le_two_mul_sum_of_cubeTerms_eq + Q s u j (predictor j) (additivity j) (lowScale j) (tail j) + (hdecomp j hj) + _ = + 2 * + ((∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (predictor j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (additivity j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (lowScale j R))) + + (∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (tail j R)))) := by + rw [← Finset.mul_sum] + rw [Finset.sum_add_distrib, Finset.sum_add_distrib, Finset.sum_add_distrib] + +/-- +Finite high/low split for the negative weak norm. On the selected depths +`high`, a four-term cube-indexed decomposition is used; on the complementary +depths the original depth contribution is left untouched. This is the finite +form of the high-scale/low-scale split in the Section 5.3 maximizer proof. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_on_filter_add_complement + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) + (high : ℕ → Prop) [DecidablePred high] + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), high j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor j R + additivity j R + lowScale j R + tail j R) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (tail j R)))) + + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ high j), + cubeBesovNegativeVectorDepthSeminorm Q s u j := by + let S : Finset ℕ := Finset.range (N + 1) + let highContribution : ℕ → ℝ := fun j => + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (tail j R))) + have hhigh : + (∑ j ∈ S.filter high, cubeBesovNegativeVectorDepthSeminorm Q s u j) ≤ + ∑ j ∈ S.filter high, highContribution j := by + refine Finset.sum_le_sum ?_ + intro j hj + rcases Finset.mem_filter.mp hj with ⟨hjS, hjHigh⟩ + exact + cubeBesovNegativeVectorDepthSeminorm_le_two_mul_sum_of_cubeTerms_eq + Q s u j (predictor j) (additivity j) (lowScale j) (tail j) + (hdecomp j (by simpa [S] using hjS) hjHigh) + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j) + = + (∑ j ∈ S.filter high, cubeBesovNegativeVectorDepthSeminorm Q s u j) + + ∑ j ∈ S.filter (fun j => ¬ high j), + cubeBesovNegativeVectorDepthSeminorm Q s u j := by + simpa [S] using + (Finset.sum_filter_add_sum_filter_not S high + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j)).symm + _ ≤ + (∑ j ∈ S.filter high, highContribution j) + + ∑ j ∈ S.filter (fun j => ¬ high j), + cubeBesovNegativeVectorDepthSeminorm Q s u j := by + exact add_le_add hhigh le_rfl + _ = + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (tail j R)))) + + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ high j), + cubeBesovNegativeVectorDepthSeminorm Q s u j := by + simp [S, highContribution] + +/-- +Filtered low-scale constant-tail estimate. On a selected set of depths, if the +averages of `w` equal the averages of `u` plus a fixed vector `c`, then the +filtered contribution of `w` is controlled by the filtered contribution of `u` +and the weighted constant tail. +-/ +theorem sum_filter_cubeBesovNegativeVectorDepthSeminorm_le_two_mul_self_add_const_of_cubeAverageVec_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) + (low : ℕ → Prop) [DecidablePred low] + (w u : Vec d → Vec d) (c : Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), low j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = cubeAverageVec R u + c) : + (∑ j ∈ (Finset.range (N + 1)).filter low, + cubeBesovNegativeVectorDepthSeminorm Q s w j) ≤ + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter low, + cubeBesovNegativeVectorDepthSeminorm Q s u j) + + ∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) := by + let F : Finset ℕ := (Finset.range (N + 1)).filter low + calc + (∑ j ∈ (Finset.range (N + 1)).filter low, + cubeBesovNegativeVectorDepthSeminorm Q s w j) + = + ∑ j ∈ F, cubeBesovNegativeVectorDepthSeminorm Q s w j := by + rfl + _ ≤ + ∑ j ∈ F, + 2 * + (cubeBesovNegativeVectorDepthSeminorm Q s u j + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) := by + refine Finset.sum_le_sum ?_ + intro j hj + rcases Finset.mem_filter.mp hj with ⟨hjRange, hjLow⟩ + exact + cubeBesovNegativeVectorDepthSeminorm_le_two_mul_self_add_const_of_cubeAverageVec_eq + Q s j w u c (hdecomp j hjRange hjLow) + _ = + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter low, + cubeBesovNegativeVectorDepthSeminorm Q s u j) + + ∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) := by + rw [← Finset.mul_sum] + rw [Finset.sum_add_distrib] + +theorem sum_filter_triadic_weight_mul_const_sqrt_eq + {d : ℕ} (s : ℝ) (N : ℕ) + (low : ℕ → Prop) [DecidablePred low] (c : Vec d) : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) = + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ))) * Real.sqrt (vecNormSq c) := by + rw [Finset.sum_mul] + +theorem sum_filter_triadic_weight_mul_const_sqrt_le_of_weight_sum_le + {d : ℕ} (s : ℝ) (N : ℕ) + (low : ℕ → Prop) [DecidablePred low] (c : Vec d) {tailWeight : ℝ} + (hWeight : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ))) ≤ tailWeight) : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) ≤ + tailWeight * Real.sqrt (vecNormSq c) := by + rw [sum_filter_triadic_weight_mul_const_sqrt_eq s N low c] + exact mul_le_mul_of_nonneg_right hWeight (Real.sqrt_nonneg _) + +theorem sum_range_filter_not_lt_triadic_weight_mul_const_sqrt_le_geometric_tail + {d : ℕ} (s : ℝ) (N L : ℕ) (c : Vec d) (hs : 0 < s) : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) ≤ + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq c) := + sum_filter_triadic_weight_mul_const_sqrt_le_of_weight_sum_le + (s := s) (N := N) (low := fun j => ¬ j < L) c + (sum_range_filter_not_lt_triadicDepthWeight_le_geometric_tail s N L hs) + +/-- +Finite high-scale decomposition plus low-scale constant-tail split. This is a +closer finite Lean analogue of the first displayed split in the deterministic +maximizer proof: high depths get the analytic four-term decomposition, while +low depths become a raw low-scale norm plus the `p₀`/`q₀` constant tail. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_on_filter_add_low_self_add_const + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) + (w lowField : Vec d → Vec d) (c : Vec d) + (high : ℕ → Prop) [DecidablePred high] + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hhigh : ∀ j ∈ Finset.range (N + 1), high j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = + predictor j R + additivity j R + lowScale j R + tail j R) + (hlow : ∀ j ∈ Finset.range (N + 1), ¬ high j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = cubeAverageVec R lowField + c) : + cubeBesovNegativeVectorPartialSeminorm Q s N w ≤ + (∑ j ∈ (Finset.range (N + 1)).filter high, + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (tail j R)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ high j), + cubeBesovNegativeVectorDepthSeminorm Q s lowField j) + + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ high j), + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt (vecNormSq c)) := by + have hsplit := + cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_on_filter_add_complement + Q s N w high predictor additivity lowScale tail hhigh + have hlow_sum := + sum_filter_cubeBesovNegativeVectorDepthSeminorm_le_two_mul_self_add_const_of_cubeAverageVec_eq + Q s N (fun j => ¬ high j) w lowField c hlow + exact hsplit.trans (add_le_add le_rfl hlow_sum) + +/-- +Cutoff version of the finite maximizer weak-norm split. Depths `j < L` are +controlled by the four analytic cube-indexed pieces, while depths `L ≤ j` +contribute a raw low-scale norm and a geometric constant tail. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_below_cutoff_add_low_self_add_geometric_const + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N L : ℕ) + (w lowField : Vec d → Vec d) (c : Vec d) + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hs : 0 < s) + (hhigh : ∀ j ∈ Finset.range (N + 1), j < L → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = + predictor j R + additivity j R + lowScale j R + tail j R) + (hlow : ∀ j ∈ Finset.range (N + 1), L ≤ j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = cubeAverageVec R lowField + c) : + cubeBesovNegativeVectorPartialSeminorm Q s N w ≤ + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + 2 * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt + (descendantsAverage Q j fun R => vecNormSq (tail j R)))) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s lowField j) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq c)) := by + have hbase := + cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_on_filter_add_low_self_add_const + Q s N w lowField c (fun j => j < L) predictor additivity lowScale tail + hhigh + (by + intro j hj hnot + exact hlow j hj (not_lt.mp hnot)) + have htail := + sum_range_filter_not_lt_triadic_weight_mul_const_sqrt_le_geometric_tail + (d := d) s N L c hs + refine hbase.trans ?_ + exact add_le_add le_rfl + (mul_le_mul_of_nonneg_left (add_le_add le_rfl htail) (by norm_num : 0 ≤ (2 : ℝ))) + +/-- +Finite cutoff maximizer estimate with the high-scale analytic pieces already +converted to shifted weak-norm gap sums. This combines the four-term +cube-average decomposition, the low-scale constant-tail split, and the +depthwise estimates with growth factors `3^{s'j}`. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_shifted_gap_sums_below_cutoff_add_low_self_add_geometric_const + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N L : ℕ) + (w lowField : Vec d → Vec d) (c : Vec d) + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (sPred sAdd sLow sTail Cpred Cadd Clow Ctail : ℝ) + (predGap addGap lowGap tailGap : ℕ → ℝ) + (hs : 0 < s) + (hCpred : 0 ≤ Cpred) (hCadd : 0 ≤ Cadd) + (hClow : 0 ≤ Clow) (hCtail : 0 ≤ Ctail) + (hhigh : ∀ j ∈ Finset.range (N + 1), j < L → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = + predictor j R + additivity j R + lowScale j R + tail j R) + (hlow : ∀ j ∈ Finset.range (N + 1), L ≤ j → + ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R w = cubeAverageVec R lowField + c) + (hPred : ∀ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + descendantsAverage Q j (fun R => vecNormSq (predictor j R)) ≤ + (Cpred * Real.rpow (3 : ℝ) (sPred * (j : ℝ))) ^ 2 * predGap j) + (hAdd : ∀ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + descendantsAverage Q j (fun R => vecNormSq (additivity j R)) ≤ + (Cadd * Real.rpow (3 : ℝ) (sAdd * (j : ℝ))) ^ 2 * addGap j) + (hLow : ∀ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + descendantsAverage Q j (fun R => vecNormSq (lowScale j R)) ≤ + (Clow * Real.rpow (3 : ℝ) (sLow * (j : ℝ))) ^ 2 * lowGap j) + (hTail : ∀ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + descendantsAverage Q j (fun R => vecNormSq (tail j R)) ≤ + (Ctail * Real.rpow (3 : ℝ) (sTail * (j : ℝ))) ^ 2 * tailGap j) : + cubeBesovNegativeVectorPartialSeminorm Q s N w ≤ + 2 * + (Cpred * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - sPred) * (j : ℝ)) * + Real.sqrt (predGap j) + + Cadd * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - sAdd) * (j : ℝ)) * + Real.sqrt (addGap j) + + Clow * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - sLow) * (j : ℝ)) * + Real.sqrt (lowGap j) + + Ctail * + ∑ j ∈ (Finset.range (N + 1)).filter (fun j => j < L), + Real.rpow (3 : ℝ) (-(s - sTail) * (j : ℝ)) * + Real.sqrt (tailGap j)) + + 2 * + ((∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + cubeBesovNegativeVectorDepthSeminorm Q s lowField j) + + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq c)) := by + let high : Finset ℕ := (Finset.range (N + 1)).filter (fun j => j < L) + let low : Finset ℕ := (Finset.range (N + 1)).filter (fun j => ¬ j < L) + let predTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (predictor j R)) + let addTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (additivity j R)) + let lowTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (lowScale j R)) + let tailTerm : ℕ → ℝ := fun j => + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (tail j R)) + let predShifted : ℝ := + ∑ j ∈ high, + Real.rpow (3 : ℝ) (-(s - sPred) * (j : ℝ)) * Real.sqrt (predGap j) + let addShifted : ℝ := + ∑ j ∈ high, + Real.rpow (3 : ℝ) (-(s - sAdd) * (j : ℝ)) * Real.sqrt (addGap j) + let lowShifted : ℝ := + ∑ j ∈ high, + Real.rpow (3 : ℝ) (-(s - sLow) * (j : ℝ)) * Real.sqrt (lowGap j) + let tailShifted : ℝ := + ∑ j ∈ high, + Real.rpow (3 : ℝ) (-(s - sTail) * (j : ℝ)) * Real.sqrt (tailGap j) + let lowRemainder : ℝ := + ∑ j ∈ low, cubeBesovNegativeVectorDepthSeminorm Q s lowField j + let tailRemainder : ℝ := + (Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹) * + Real.sqrt (vecNormSq c) + have hsplit := + cubeBesovNegativeVectorPartialSeminorm_le_cubeTerms_below_cutoff_add_low_self_add_geometric_const + Q s N L w lowField c predictor additivity lowScale tail hs hhigh hlow + have hPredSum : + (∑ j ∈ high, predTerm j) ≤ Cpred * predShifted := by + simpa [high, predTerm, predShifted] using + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + (Q := Q) (s := s) (s' := sPred) (C := Cpred) (N := N) + (high := fun j => j < L) (component := predictor) (gap := predGap) + hCpred hPred + have hAddSum : + (∑ j ∈ high, addTerm j) ≤ Cadd * addShifted := by + simpa [high, addTerm, addShifted] using + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + (Q := Q) (s := s) (s' := sAdd) (C := Cadd) (N := N) + (high := fun j => j < L) (component := additivity) (gap := addGap) + hCadd hAdd + have hLowSum : + (∑ j ∈ high, lowTerm j) ≤ Clow * lowShifted := by + simpa [high, lowTerm, lowShifted] using + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + (Q := Q) (s := s) (s' := sLow) (C := Clow) (N := N) + (high := fun j => j < L) (component := lowScale) (gap := lowGap) + hClow hLow + have hTailSum : + (∑ j ∈ high, tailTerm j) ≤ Ctail * tailShifted := by + simpa [high, tailTerm, tailShifted] using + sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + (Q := Q) (s := s) (s' := sTail) (C := Ctail) (N := N) + (high := fun j => j < L) (component := tail) (gap := tailGap) + hCtail hTail + have hHighEq : + (∑ j ∈ high, + 2 * (predTerm j + addTerm j + lowTerm j + tailTerm j)) = + 2 * + ((∑ j ∈ high, predTerm j) + (∑ j ∈ high, addTerm j) + + (∑ j ∈ high, lowTerm j) + (∑ j ∈ high, tailTerm j)) := by + calc + (∑ j ∈ high, + 2 * (predTerm j + addTerm j + lowTerm j + tailTerm j)) + = + ∑ j ∈ high, + (2 * predTerm j + 2 * addTerm j + 2 * lowTerm j + 2 * tailTerm j) := by + refine Finset.sum_congr rfl ?_ + intro j hj + ring + _ = + (∑ j ∈ high, 2 * predTerm j) + + (∑ j ∈ high, 2 * addTerm j) + + (∑ j ∈ high, 2 * lowTerm j) + + (∑ j ∈ high, 2 * tailTerm j) := by + rw [Finset.sum_add_distrib, Finset.sum_add_distrib, + Finset.sum_add_distrib] + _ = + 2 * + ((∑ j ∈ high, predTerm j) + (∑ j ∈ high, addTerm j) + + (∑ j ∈ high, lowTerm j) + (∑ j ∈ high, tailTerm j)) := by + rw [← Finset.mul_sum, ← Finset.mul_sum, ← Finset.mul_sum, + ← Finset.mul_sum] + ring + have hHigh : + (∑ j ∈ high, + 2 * (predTerm j + addTerm j + lowTerm j + tailTerm j)) ≤ + 2 * (Cpred * predShifted + Cadd * addShifted + + Clow * lowShifted + Ctail * tailShifted) := by + rw [hHighEq] + have hPieces : + (∑ j ∈ high, predTerm j) + (∑ j ∈ high, addTerm j) + + (∑ j ∈ high, lowTerm j) + (∑ j ∈ high, tailTerm j) ≤ + Cpred * predShifted + Cadd * addShifted + + Clow * lowShifted + Ctail * tailShifted := by + nlinarith [hPredSum, hAddSum, hLowSum, hTailSum] + exact mul_le_mul_of_nonneg_left hPieces (by norm_num : 0 ≤ (2 : ℝ)) + have htotal : + (∑ j ∈ high, + 2 * (predTerm j + addTerm j + lowTerm j + tailTerm j)) + + 2 * (lowRemainder + tailRemainder) ≤ + 2 * (Cpred * predShifted + Cadd * addShifted + + Clow * lowShifted + Ctail * tailShifted) + + 2 * (lowRemainder + tailRemainder) := by + exact add_le_add hHigh le_rfl + exact hsplit.trans (by + simpa [high, low, predTerm, addTerm, lowTerm, tailTerm, predShifted, + addShifted, lowShifted, tailShifted, lowRemainder, tailRemainder] using htotal) + +/-- +Finite `q = 1` negative weak-norm split from a four-term decomposition of all +descendant cube averages. This is the weighted weak-norm Cauchy/Minkowski step +needed in the Section 5.3 weak-norm estimate. +-/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_two_mul_sum_of_cubeAverageVec_eq + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) + (u u₁ u₂ u₃ u₄ : Vec d → Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + cubeAverageVec R u₁ + cubeAverageVec R u₂ + + cubeAverageVec R u₃ + cubeAverageVec R u₄) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + 2 * + (cubeBesovNegativeVectorPartialSeminorm Q s N u₁ + + cubeBesovNegativeVectorPartialSeminorm Q s N u₂ + + cubeBesovNegativeVectorPartialSeminorm Q s N u₃ + + cubeBesovNegativeVectorPartialSeminorm Q s N u₄) := by + unfold cubeBesovNegativeVectorPartialSeminorm + calc + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + 2 * + (cubeBesovNegativeVectorDepthSeminorm Q s u₁ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₂ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₃ j + + cubeBesovNegativeVectorDepthSeminorm Q s u₄ j)) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact + cubeBesovNegativeVectorDepthSeminorm_le_two_mul_sum_of_cubeAverageVec_eq + Q s j u u₁ u₂ u₃ u₄ (hdecomp j hj) + _ = + 2 * + (Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u₁ j) + + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u₂ j) + + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u₃ j) + + Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u₄ j)) := by + rw [← Finset.mul_sum] + rw [Finset.sum_add_distrib, Finset.sum_add_distrib, Finset.sum_add_distrib] + +theorem cubeBesovNegativeVectorPartialSeminormTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + exact Real.sqrt_nonneg _ + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + simpa [pow_two] using + Real.sq_sqrt + (Finset.sum_nonneg fun j _ => sq_nonneg (cubeBesovNegativeVectorDepthSeminorm Q s u j)) + +theorem cubeBesovNegativeVectorPartialSeminormTwo_anti_mono_exponent {d : ℕ} + (Q : TriadicCube d) {a b : ℝ} (hab : a ≤ b) + (N : ℕ) (u : Vec d → Vec d) : + cubeBesovNegativeVectorPartialSeminormTwo Q b N u ≤ + cubeBesovNegativeVectorPartialSeminormTwo Q a N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + refine Real.sqrt_le_sqrt ?_ + refine Finset.sum_le_sum ?_ + intro j hj + exact pow_le_pow_left₀ + (cubeBesovNegativeVectorDepthSeminorm_nonneg Q b u j) + (cubeBesovNegativeVectorDepthSeminorm_anti_mono_exponent Q hab u j) + 2 + +theorem finset_sqrt_sum_sq_le_sum_of_nonneg {ι : Type*} (s : Finset ι) (A : ι → ℝ) + (hA : ∀ i ∈ s, 0 ≤ A i) : + Real.sqrt (∑ i ∈ s, (A i) ^ 2) ≤ ∑ i ∈ s, A i := by + have hsq : + ∑ i ∈ s, (A i) ^ 2 ≤ (∑ i ∈ s, A i) ^ 2 := by + simpa [pow_two] using Finset.sum_sq_le_sq_sum_of_nonneg hA + have hsum_nonneg : 0 ≤ ∑ i ∈ s, A i := + Finset.sum_nonneg hA + calc + Real.sqrt (∑ i ∈ s, (A i) ^ 2) + ≤ Real.sqrt ((∑ i ∈ s, A i) ^ 2) := Real.sqrt_le_sqrt hsq + _ = ∑ i ∈ s, A i := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hsum_nonneg] + +theorem cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ + cubeBesovNegativeVectorPartialSeminorm Q s N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo cubeBesovNegativeVectorPartialSeminorm + exact finset_sqrt_sum_sq_le_sum_of_nonneg + (Finset.range (N + 1)) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j) + (fun j _ => cubeBesovNegativeVectorDepthSeminorm_nonneg Q s u j) + +theorem cubeBesovNegativeVectorSeminorm_le_of_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ B) : + cubeBesovNegativeVectorSeminorm Q s u ≤ B := by + unfold cubeBesovNegativeVectorSeminorm + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovNegativeVectorPartialSeminorm Q s 0 u, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem cubeBesovNegativeVectorPartialSeminorm_le_seminorm_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N u)) + (N : ℕ) : + cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ + cubeBesovNegativeVectorSeminorm Q s u := by + unfold cubeBesovNegativeVectorSeminorm + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovNegativeVectorSeminorm_nonneg_of_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminorm Q s N u)) : + 0 ≤ cubeBesovNegativeVectorSeminorm Q s u := by + have h0_le : + cubeBesovNegativeVectorPartialSeminorm Q s 0 u ≤ + cubeBesovNegativeVectorSeminorm Q s u := + cubeBesovNegativeVectorPartialSeminorm_le_seminorm_of_bddAbove Q s u hBdd 0 + exact (cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 u).trans h0_le + +theorem cubeBesovNegativeVectorSeminormTwo_le_of_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ B) : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ B := by + unfold cubeBesovNegativeVectorSeminormTwo + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovNegativeVectorPartialSeminormTwo Q s 0 u, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem cubeBesovNegativeVectorSeminormTwo_anti_mono_exponent_of_bddAbove {d : ℕ} + (Q : TriadicCube d) {a b : ℝ} (hab : a ≤ b) (u : Vec d → Vec d) + (hBdd : BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q a N u)) : + cubeBesovNegativeVectorSeminormTwo Q b u ≤ + cubeBesovNegativeVectorSeminormTwo Q a u := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q b u ?_ + intro N + exact (cubeBesovNegativeVectorPartialSeminormTwo_anti_mono_exponent Q hab N u).trans + (le_csSup hBdd ⟨N, rfl⟩) + +theorem cubeBesovNegativeVectorSeminormTwo_le_of_qone_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ B) : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ B := + cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s u fun N => + (cubeBesovNegativeVectorPartialSeminormTwo_le_partialSeminorm Q s N u).trans (hB N) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Definitions.lean new file mode 100644 index 0000000000..bee99f8071 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Definitions.lean @@ -0,0 +1,706 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Basic +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import Mathlib.Algebra.Order.Field.GeomSum + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Deterministic vector-valued weak norm interfaces + +This file isolates the Chapter-3 negative-seminorm surface we need for +coarse-grained estimates without touching the active scalar Besov files. + +The definitions are the note-normalized `q = 1`, `p = 2` vector-field +quantities corresponding to + +`3^{-s m} [F]_{B^{-s}_{2,1}(Q)}` + +when `Q` has scale `m`. +-/ + +open scoped BigOperators + +/-- The depth-`j` block-average square for a vector field on a parent cube `Q`. -/ +noncomputable def cubeBesovNegativeVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => vecNormSq (cubeAverageVec R u) + +/-- The note-normalized negative depth seminorm. For a parent cube of scale `m`, +this is the depth-`j` contribution with weight `3^{-s j}`. -/ +noncomputable def cubeBesovNegativeVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) + +/-- The finite-depth `q = 1` negative seminorm for vector fields. -/ +noncomputable def cubeBesovNegativeVectorPartialSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : ℝ := + Finset.sum (Finset.range (N + 1)) fun j => + cubeBesovNegativeVectorDepthSeminorm Q s u j + +/-- The finite-depth `q = 2` negative seminorm for vector fields. -/ +noncomputable def cubeBesovNegativeVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + +/-- The full note-normalized `q = 1` negative seminorm for vector fields. -/ +noncomputable def cubeBesovNegativeVectorSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : ℝ := + sSup (Set.range fun N : ℕ => cubeBesovNegativeVectorPartialSeminorm Q s N u) + +/-- The full note-normalized `q = 2` negative seminorm for vector fields. -/ +noncomputable def cubeBesovNegativeVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : ℝ := + sSup (Set.range fun N : ℕ => cubeBesovNegativeVectorPartialSeminormTwo Q s N u) + +theorem cubeBesovNegativeVectorDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovNegativeVectorDepthAverage Q u j := by + unfold cubeBesovNegativeVectorDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => vecNormSq_nonneg (cubeAverageVec R u) + +/-- Scalar square-root subadditivity in the two-term form used below. -/ +theorem sqrt_add_le_add_sqrt_of_nonneg {a b : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) : + Real.sqrt (a + b) ≤ Real.sqrt a + Real.sqrt b := by + rw [Real.sqrt_le_iff] + constructor + · exact add_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + · nlinarith [Real.sq_sqrt ha, Real.sq_sqrt hb, + mul_nonneg (Real.sqrt_nonneg a) (Real.sqrt_nonneg b)] + +/-- Four-term scalar square-root subadditivity with the Cauchy factor `2`. -/ +theorem sqrt_four_mul_sum_le_two_mul_sum_sqrt + {a b c d : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) (hc : 0 ≤ c) (hd : 0 ≤ d) : + Real.sqrt (4 * (a + b + c + d)) ≤ + 2 * (Real.sqrt a + Real.sqrt b + Real.sqrt c + Real.sqrt d) := by + have hab : 0 ≤ a + b := add_nonneg ha hb + have hcd : 0 ≤ c + d := add_nonneg hc hd + have hsqrt_sum : + Real.sqrt (a + b + c + d) ≤ + Real.sqrt a + Real.sqrt b + Real.sqrt c + Real.sqrt d := by + calc + Real.sqrt (a + b + c + d) + = Real.sqrt ((a + b) + (c + d)) := by ring_nf + _ ≤ Real.sqrt (a + b) + Real.sqrt (c + d) := + sqrt_add_le_add_sqrt_of_nonneg hab hcd + _ ≤ (Real.sqrt a + Real.sqrt b) + (Real.sqrt c + Real.sqrt d) := + add_le_add + (sqrt_add_le_add_sqrt_of_nonneg ha hb) + (sqrt_add_le_add_sqrt_of_nonneg hc hd) + _ = Real.sqrt a + Real.sqrt b + Real.sqrt c + Real.sqrt d := by ring + have hroot_four : Real.sqrt (4 : ℝ) = 2 := by + rw [Real.sqrt_eq_iff_mul_self_eq (by norm_num : 0 ≤ (4 : ℝ)) (by norm_num : 0 ≤ (2 : ℝ))] + norm_num + calc + Real.sqrt (4 * (a + b + c + d)) + = 2 * Real.sqrt (a + b + c + d) := by + rw [Real.sqrt_mul (by norm_num : 0 ≤ (4 : ℝ)), hroot_four] + _ ≤ 2 * (Real.sqrt a + Real.sqrt b + Real.sqrt c + Real.sqrt d) := by + nlinarith + +theorem weighted_sqrt_sum_le_const_mul_weighted_sqrt_sum_of_le_const_sq_mul + {ι : Type*} (I : Finset ι) (weight value bound : ι → ℝ) {C : ℝ} + (hC : 0 ≤ C) (hweight : ∀ i ∈ I, 0 ≤ weight i) + (hvalue : ∀ i ∈ I, value i ≤ C ^ 2 * bound i) : + (∑ i ∈ I, weight i * Real.sqrt (value i)) ≤ + C * ∑ i ∈ I, weight i * Real.sqrt (bound i) := by + calc + (∑ i ∈ I, weight i * Real.sqrt (value i)) + ≤ ∑ i ∈ I, weight i * (C * Real.sqrt (bound i)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hsqrt : + Real.sqrt (value i) ≤ C * Real.sqrt (bound i) := by + calc + Real.sqrt (value i) ≤ Real.sqrt (C ^ 2 * bound i) := + Real.sqrt_le_sqrt (hvalue i hi) + _ = C * Real.sqrt (bound i) := by + rw [Real.sqrt_mul (sq_nonneg C), Real.sqrt_sq_eq_abs, + abs_of_nonneg hC] + exact mul_le_mul_of_nonneg_left hsqrt (hweight i hi) + _ = C * ∑ i ∈ I, weight i * Real.sqrt (bound i) := by + calc + ∑ i ∈ I, weight i * (C * Real.sqrt (bound i)) + = ∑ i ∈ I, C * (weight i * Real.sqrt (bound i)) := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = C * ∑ i ∈ I, weight i * Real.sqrt (bound i) := by + rw [Finset.mul_sum] + +theorem weighted_sqrt_sum_le_weighted_coeff_sqrt_sum_of_le_sq_mul + {ι : Type*} (I : Finset ι) (weight value bound coeff : ι → ℝ) + (hcoeff : ∀ i ∈ I, 0 ≤ coeff i) + (hweight : ∀ i ∈ I, 0 ≤ weight i) + (hvalue : ∀ i ∈ I, value i ≤ (coeff i) ^ 2 * bound i) : + (∑ i ∈ I, weight i * Real.sqrt (value i)) ≤ + ∑ i ∈ I, weight i * (coeff i * Real.sqrt (bound i)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hsqrt : + Real.sqrt (value i) ≤ coeff i * Real.sqrt (bound i) := by + calc + Real.sqrt (value i) ≤ Real.sqrt ((coeff i) ^ 2 * bound i) := + Real.sqrt_le_sqrt (hvalue i hi) + _ = coeff i * Real.sqrt (bound i) := by + rw [Real.sqrt_mul (sq_nonneg (coeff i)), Real.sqrt_sq_eq_abs, + abs_of_nonneg (hcoeff i hi)] + exact mul_le_mul_of_nonneg_left hsqrt (hweight i hi) + +theorem triadicDepthWeight_eq_pow (s : ℝ) (j : ℕ) : + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) = + (Real.rpow (3 : ℝ) (-s)) ^ j := by + calc + Real.rpow (3 : ℝ) (-(s * (j : ℝ))) + = Real.rpow (3 : ℝ) ((-s) * (j : ℝ)) := by ring_nf + _ = Real.rpow (Real.rpow (3 : ℝ) (-s)) (j : ℝ) := by + exact Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s) (j : ℝ) + _ = (Real.rpow (3 : ℝ) (-s)) ^ j := by + exact Real.rpow_natCast (Real.rpow (3 : ℝ) (-s)) j + +theorem triadicDepthWeight_nonneg (s : ℝ) (j : ℕ) : + 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + +theorem triadicDepthWeight_mul_growth_eq (s s' : ℝ) (j : ℕ) : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s' * (j : ℝ)) = + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s' * (j : ℝ)) + = Real.rpow (3 : ℝ) (-s * (j : ℝ) + s' * (j : ℝ)) := by + exact (Real.rpow_add (by norm_num : 0 < (3 : ℝ)) _ _).symm + _ = Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) := by + congr 1 + ring + +theorem triadicDepthWeight_mul_const_growth_eq (C s s' : ℝ) (j : ℕ) : + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) = + C * Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) := by + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) + = + C * + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.rpow (3 : ℝ) (s' * (j : ℝ))) := by + ring + _ = C * Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) := by + rw [triadicDepthWeight_mul_growth_eq] + +/-- +If a cube-indexed contribution has a depthwise squared bound with growth +`C^2 * 3^{2s'j}`, then its `B^{-s}` weighted square-root sum is controlled by +the shifted `B^{-(s-s')}` weighted square-root sum of the controlling gap. + +This is the deterministic algebraic core behind the Section 5.3 mismatch and +additivity-gap estimates: the analytic input is only the depthwise squared +bound, and the conclusion performs the `3^{-sj} 3^{s'j} = 3^{-(s-s')j}` +weight shift. +-/ +theorem sum_filter_triadicDepthWeight_mul_sqrt_descendantsAverage_vecNormSq_le_const_mul_shifted_weighted_sqrt + {d : ℕ} (Q : TriadicCube d) (s s' C : ℝ) (N : ℕ) + (high : ℕ → Prop) [DecidablePred high] + (component : ℕ → TriadicCube d → Vec d) (gap : ℕ → ℝ) + (hC : 0 ≤ C) + (hbound : ∀ j ∈ (Finset.range (N + 1)).filter high, + descendantsAverage Q j (fun R => vecNormSq (component j R)) ≤ + (C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) ^ 2 * gap j) : + (∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (component j R))) ≤ + C * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt (gap j) := by + let I : Finset ℕ := (Finset.range (N + 1)).filter high + have hcoeff : + ∀ j ∈ I, 0 ≤ C * Real.rpow (3 : ℝ) (s' * (j : ℝ)) := by + intro j hj + exact mul_nonneg hC (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + have hweight : + ∀ j ∈ I, 0 ≤ Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + intro j hj + exact triadicDepthWeight_nonneg s j + have hbase : + (∑ j ∈ I, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (component j R))) ≤ + ∑ j ∈ I, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + ((C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) * Real.sqrt (gap j)) := + weighted_sqrt_sum_le_weighted_coeff_sqrt_sum_of_le_sq_mul I + (fun j => Real.rpow (3 : ℝ) (-s * (j : ℝ))) + (fun j => descendantsAverage Q j fun R => vecNormSq (component j R)) + gap + (fun j => C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) + hcoeff hweight hbound + calc + (∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (component j R))) + ≤ + ∑ j ∈ I, + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + ((C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) * Real.sqrt (gap j)) := by + exact hbase + _ = + C * + ∑ j ∈ I, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt (gap j) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro j hj + calc + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + ((C * Real.rpow (3 : ℝ) (s' * (j : ℝ))) * Real.sqrt (gap j)) + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + (C * Real.rpow (3 : ℝ) (s' * (j : ℝ)))) * + Real.sqrt (gap j) := by + ring + _ = (C * Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ))) * + Real.sqrt (gap j) := by + rw [triadicDepthWeight_mul_const_growth_eq] + _ = C * + (Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt (gap j)) := by + ring + _ = + C * + ∑ j ∈ (Finset.range (N + 1)).filter high, + Real.rpow (3 : ℝ) (-(s - s') * (j : ℝ)) * Real.sqrt (gap j) := by + rfl + +theorem sum_filter_triadicDepthWeight_le_geometric_inv + (s : ℝ) (N : ℕ) (low : ℕ → Prop) [DecidablePred low] (hs : 0 < s) : + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ))) ≤ + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + calc + (∑ j ∈ (Finset.range (N + 1)).filter low, + Real.rpow (3 : ℝ) (-s * (j : ℝ))) + ≤ ∑ j ∈ Finset.range (N + 1), Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + exact Finset.sum_le_sum_of_subset_of_nonneg + (Finset.filter_subset low (Finset.range (N + 1))) + (by + intro j hjRange hjNotMem + exact triadicDepthWeight_nonneg s j) + _ = ∑ j ∈ Finset.range (N + 1), r ^ j := by + refine Finset.sum_congr rfl ?_ + intro j hj + simpa [r] using triadicDepthWeight_eq_pow s j + _ ≤ (1 - r)⁻¹ := by + rw [Finset.range_eq_Ico] + have hgeom := + geom_sum_Ico_le_of_lt_one (x := r) (m := 0) (n := N + 1) + hr_nonneg hr_lt_one + have hrhs : r ^ (0 : ℕ) / (1 - r) = (1 - r)⁻¹ := by + simp [div_eq_mul_inv] + exact hgeom.trans_eq hrhs + +theorem sum_range_filter_ge_triadicDepthWeight_le_geometric_tail + (s : ℝ) (N L : ℕ) (hs : 0 < s) : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => L ≤ j), + Real.rpow (3 : ℝ) (-s * (j : ℝ))) ≤ + Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + let r : ℝ := Real.rpow (3 : ℝ) (-s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hr_lt_one : r < 1 := by + dsimp [r] + exact Real.rpow_lt_one_of_one_lt_of_neg (by norm_num : (1 : ℝ) < 3) (by linarith) + have hfilter : + (Finset.range (N + 1)).filter (fun j => L ≤ j) = Finset.Ico L (N + 1) := by + ext j + simp only [Finset.mem_filter, Finset.mem_range, Finset.mem_Ico] + constructor + · intro h + exact ⟨h.2, h.1⟩ + · intro h + exact ⟨h.2, h.1⟩ + calc + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => L ≤ j), + Real.rpow (3 : ℝ) (-s * (j : ℝ))) + = ∑ j ∈ Finset.Ico L (N + 1), Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + rw [hfilter] + _ = ∑ j ∈ Finset.Ico L (N + 1), r ^ j := by + refine Finset.sum_congr rfl ?_ + intro j hj + simpa [r] using triadicDepthWeight_eq_pow s j + _ ≤ r ^ L / (1 - r) := by + exact geom_sum_Ico_le_of_lt_one hr_nonneg hr_lt_one + _ = + Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + have hL : r ^ L = Real.rpow (3 : ℝ) (-(s * (L : ℝ))) := by + simpa [r] using (triadicDepthWeight_eq_pow s L).symm + rw [hL] + rw [div_eq_mul_inv] + dsimp [r] + congr 1 + ring_nf + +theorem sum_range_filter_not_lt_triadicDepthWeight_le_geometric_tail + (s : ℝ) (N L : ℕ) (hs : 0 < s) : + (∑ j ∈ (Finset.range (N + 1)).filter (fun j => ¬ j < L), + Real.rpow (3 : ℝ) (-s * (j : ℝ))) ≤ + Real.rpow (3 : ℝ) (-s * (L : ℝ)) * + (1 - Real.rpow (3 : ℝ) (-s))⁻¹ := by + simpa [not_lt] using sum_range_filter_ge_triadicDepthWeight_le_geometric_tail s N L hs + +/-- +Depthwise four-term Cauchy split for the negative weak-norm block average. +If each descendant cube average decomposes into four vector terms, then the +depth average is controlled by the average of the four squared sizes. +-/ +theorem cubeBesovNegativeVectorDepthAverage_le_four_mul_sum_of_cubeAverageVec_eq {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) + (predictor additivity lowScale tail : TriadicCube d → Vec d) + (hdecomp : ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor R + additivity R + lowScale R + tail R) : + cubeBesovNegativeVectorDepthAverage Q u j ≤ + descendantsAverage Q j fun R => + 4 * + (vecNormSq (predictor R) + vecNormSq (additivity R) + + vecNormSq (lowScale R) + vecNormSq (tail R)) := by + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + refine mul_le_mul_of_nonneg_left ?_ ?_ + · refine Finset.sum_le_sum ?_ + intro R hR + rw [hdecomp R hR] + exact vecNormSq_four_add_le (predictor R) (additivity R) (lowScale R) (tail R) + · exact inv_nonneg.mpr (by positivity) + +theorem cubeBesovNegativeVectorDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovNegativeVectorDepthSeminorm Q s u j := by + unfold cubeBesovNegativeVectorDepthSeminorm + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact Real.sqrt_nonneg _ + +theorem cubeBesovNegativeVectorDepthSeminorm_anti_mono_exponent {d : ℕ} + (Q : TriadicCube d) {a b : ℝ} (hab : a ≤ b) + (u : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q b u j ≤ + cubeBesovNegativeVectorDepthSeminorm Q a u j := by + have hmul : a * (j : ℝ) ≤ b * (j : ℝ) := + mul_le_mul_of_nonneg_right hab (Nat.cast_nonneg j) + have hexp : -b * (j : ℝ) ≤ -a * (j : ℝ) := by + nlinarith + have hweight : + Real.rpow (3 : ℝ) (-b * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (-a * (j : ℝ)) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp + unfold cubeBesovNegativeVectorDepthSeminorm + exact mul_le_mul_of_nonneg_right hweight (Real.sqrt_nonneg _) + +theorem cubeBesovNegativeVectorPartialSeminorm_anti_mono_exponent {d : ℕ} + (Q : TriadicCube d) {a b : ℝ} (hab : a ≤ b) + (N : ℕ) (u : Vec d → Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q b N u ≤ + cubeBesovNegativeVectorPartialSeminorm Q a N u := by + unfold cubeBesovNegativeVectorPartialSeminorm + exact Finset.sum_le_sum fun j _ => + cubeBesovNegativeVectorDepthSeminorm_anti_mono_exponent Q hab u j + +/-- Exact depthwise conversion between two negative-Besov exponents. -/ +theorem cubeBesovNegativeVectorDepthSeminorm_eq_gap_mul {d : ℕ} + (Q : TriadicCube d) (a b : ℝ) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthSeminorm Q a u j = + Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ)) * + cubeBesovNegativeVectorDepthSeminorm Q b u j := by + unfold cubeBesovNegativeVectorDepthSeminorm + calc + Real.rpow (3 : ℝ) (-a * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) + = + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-b * (j : ℝ))) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) := by + congr 1 + calc + Real.rpow (3 : ℝ) (-a * (j : ℝ)) = + Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ) + -b * (j : ℝ)) := by + congr 1 + ring + _ = + Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ)) * + Real.rpow (3 : ℝ) (-b * (j : ℝ)) := by + exact Real.rpow_add (by norm_num : (0 : ℝ) < 3) + (-(a - b) * (j : ℝ)) (-b * (j : ℝ)) + _ = + Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ)) * + (Real.rpow (3 : ℝ) (-b * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j)) := by + ring + +/-- Finite-depth Cauchy conversion from the `q = 1` negative seminorm at a +larger exponent to the `q = 2` negative seminorm at a smaller exponent. -/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_gap_sqrt_mul_partialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (a b : ℝ) (N : ℕ) (u : Vec d → Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q a N u ≤ + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) * + cubeBesovNegativeVectorPartialSeminormTwo Q b N u := by + calc + cubeBesovNegativeVectorPartialSeminorm Q a N u = + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ)) * + cubeBesovNegativeVectorDepthSeminorm Q b u j := by + unfold cubeBesovNegativeVectorPartialSeminorm + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovNegativeVectorDepthSeminorm_eq_gap_mul] + _ ≤ + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) * + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (cubeBesovNegativeVectorDepthSeminorm Q b u j) ^ (2 : ℕ)) := + Real.sum_mul_le_sqrt_mul_sqrt (Finset.range (N + 1)) + (fun j => Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q b u j) + _ = + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) * + cubeBesovNegativeVectorPartialSeminormTwo Q b N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + rfl + +/-- Geometric-loss version of the finite-depth `q = 1` to `q = 2` conversion. -/ +theorem cubeBesovNegativeVectorPartialSeminorm_le_gap_geometric_mul_partialSeminormTwo + {d : ℕ} (Q : TriadicCube d) {a b : ℝ} (hgap : 0 < a - b) + (N : ℕ) (u : Vec d → Vec d) : + cubeBesovNegativeVectorPartialSeminorm Q a N u ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (a - b)))⁻¹) * + cubeBesovNegativeVectorPartialSeminormTwo Q b N u := by + have hsum : + Finset.sum (Finset.range (N + 1)) (fun j => + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) ≤ + (1 - Real.rpow (3 : ℝ) (-2 * (a - b)))⁻¹ := by + have hrewrite : + (Finset.sum (Finset.range (N + 1)) fun j => + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) = + ∑ j ∈ Finset.range (N + 1), + Real.rpow (3 : ℝ) (-(2 * (a - b)) * (j : ℝ)) := by + refine Finset.sum_congr rfl ?_ + intro j hj + calc + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ) + = + Real.rpow (3 : ℝ) ((-(a - b) * (j : ℝ)) * (2 : ℝ)) := by + rw [← Real.rpow_natCast] + exact (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) + (-(a - b) * (j : ℝ)) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-(2 * (a - b)) * (j : ℝ)) := by + congr 1 + ring + rw [hrewrite] + simpa using + (sum_filter_triadicDepthWeight_le_geometric_inv + (2 * (a - b)) N (fun _ : ℕ => True) (by nlinarith)) + have hpartial := + cubeBesovNegativeVectorPartialSeminorm_le_gap_sqrt_mul_partialSeminormTwo + Q a b N u + have hroot : + Real.sqrt + (Finset.sum (Finset.range (N + 1)) fun j => + (Real.rpow (3 : ℝ) (-(a - b) * (j : ℝ))) ^ (2 : ℕ)) ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (a - b)))⁻¹) := + Real.sqrt_le_sqrt hsum + have htwo_nonneg : + 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q b N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + exact Real.sqrt_nonneg _ + exact hpartial.trans (mul_le_mul_of_nonneg_right hroot htwo_nonneg) + +theorem cubeBesovNegativeVectorPartialSeminorm_scale_compare_of_le {d : ℕ} + (Q : TriadicCube d) {r t : ℝ} (ht : t ≤ r) + (N : ℕ) (F : Vec d → Vec d) : + cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q r N F ≤ + cubeBesovScaleWeight (-(r - t)) Q * + (cubeBesovScaleWeight (-t) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N F) := by + have hmono : + cubeBesovNegativeVectorPartialSeminorm Q r N F ≤ + cubeBesovNegativeVectorPartialSeminorm Q t N F := + cubeBesovNegativeVectorPartialSeminorm_anti_mono_exponent Q ht N F + have hscale_nonneg : 0 ≤ cubeBesovScaleWeight (-r) Q := + cubeBesovScaleWeight_nonneg (-r) Q + have hweighted : + cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q r N F ≤ + cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N F := + mul_le_mul_of_nonneg_left hmono hscale_nonneg + have hscale : + cubeBesovScaleWeight (-(r - t)) Q * cubeBesovScaleWeight (-t) Q = + cubeBesovScaleWeight (-r) Q := by + rw [cubeBesovScaleWeight_mul_eq_scaleWeight_add] + ring_nf + calc + cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q r N F + ≤ cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N F := hweighted + _ = cubeBesovScaleWeight (-(r - t)) Q * + (cubeBesovScaleWeight (-t) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N F) := by + rw [← hscale] + ring + +theorem cubeBesovNegativeVectorPartialSeminorm_flux_scale_compare {d : ℕ} + (Q : TriadicCube d) {s t : ℝ} (hst : s + t ≤ 1) + (N : ℕ) (F : Vec d → Vec d) : + cubeBesovScaleWeight (-(1 - s)) Q * + cubeBesovNegativeVectorPartialSeminorm Q (1 - s) N F ≤ + cubeBesovScaleWeight (-(1 - s - t)) Q * + (cubeBesovScaleWeight (-t) Q * + cubeBesovNegativeVectorPartialSeminorm Q t N F) := by + have ht_le : t ≤ 1 - s := by linarith + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + cubeBesovNegativeVectorPartialSeminorm_scale_compare_of_le + Q (r := 1 - s) (t := t) ht_le N F + +/-- +Turn a bound for one descendant-average block into the corresponding weighted +negative-Besov depth bound. This is the analytic insertion point used by the +Section 5.3 weak-norm estimates after the local Caccioppoli/Besov argument has +produced depthwise controls. +-/ +theorem cubeBesovNegativeVectorDepthSeminorm_le_of_depthAverage_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) {A : ℝ} + (hA : cubeBesovNegativeVectorDepthAverage Q u j ≤ A) : + cubeBesovNegativeVectorDepthSeminorm Q s u j ≤ + Real.rpow (3 : ℝ) (-s * (j : ℝ)) * Real.sqrt A := by + unfold cubeBesovNegativeVectorDepthSeminorm + exact + mul_le_mul_of_nonneg_left (Real.sqrt_le_sqrt hA) + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + +theorem descendantsAverage_vecNormSq_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (v : TriadicCube d → Vec d) : + 0 ≤ descendantsAverage Q j fun R => vecNormSq (v R) := by + exact descendantsAverage_nonneg Q j _ fun R _ => vecNormSq_nonneg (v R) + +theorem sqrt_descendantsAverage_vecNormSq_const_smul_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) (V : TriadicCube d → Vec d) + (hc : 0 ≤ c) : + Real.sqrt (descendantsAverage Q j fun R => vecNormSq (c • V R)) = + c * Real.sqrt (descendantsAverage Q j fun R => vecNormSq (V R)) := by + have havg : + descendantsAverage Q j (fun R => vecNormSq (c • V R)) = + c ^ 2 * descendantsAverage Q j (fun R => vecNormSq (V R)) := by + simp_rw [vecNormSq_smul] + unfold descendantsAverage + simp [Finset.mul_sum] + ring_nf + rw [havg, Real.sqrt_mul (sq_nonneg c), Real.sqrt_sq_eq_abs, + abs_of_nonneg hc] + +theorem descendantsAverage_const_eq {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + descendantsAverage Q j (fun _ => c) = c := by + classical + change ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + (descendantsAtDepth Q j).sum (fun _ => c) = c + have hD : (descendantsAtDepth Q j).Nonempty := descendantsAtDepth_nonempty Q j + have hcard : (((descendantsAtDepth Q j).card : ℕ) : ℝ) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr hD) + rw [Finset.sum_const, nsmul_eq_mul] + rw [← mul_assoc, inv_mul_cancel₀ hcard, one_mul] + +theorem descendantsAverage_four_mul_sum_vecNormSq_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) + (v₁ v₂ v₃ v₄ : TriadicCube d → Vec d) : + descendantsAverage Q j + (fun R => + 4 * + (vecNormSq (v₁ R) + vecNormSq (v₂ R) + + vecNormSq (v₃ R) + vecNormSq (v₄ R))) = + 4 * + (descendantsAverage Q j (fun R => vecNormSq (v₁ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₂ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₃ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₄ R))) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + calc + descendantsAverage Q j + (fun R => + 4 * + (vecNormSq (v₁ R) + vecNormSq (v₂ R) + + vecNormSq (v₃ R) + vecNormSq (v₄ R))) + = + ((D.card : ℝ)⁻¹) * + ∑ R ∈ D, + 4 * + (vecNormSq (v₁ R) + vecNormSq (v₂ R) + + vecNormSq (v₃ R) + vecNormSq (v₄ R)) := by + rfl + _ = + ((D.card : ℝ)⁻¹) * + (4 * ∑ R ∈ D, + (vecNormSq (v₁ R) + vecNormSq (v₂ R) + + vecNormSq (v₃ R) + vecNormSq (v₄ R))) := by + rw [← Finset.mul_sum] + _ = + 4 * + (((D.card : ℝ)⁻¹) * + ∑ R ∈ D, + (vecNormSq (v₁ R) + vecNormSq (v₂ R) + + vecNormSq (v₃ R) + vecNormSq (v₄ R))) := by + ring + _ = + 4 * + (((D.card : ℝ)⁻¹) * + ((∑ R ∈ D, vecNormSq (v₁ R)) + + (∑ R ∈ D, vecNormSq (v₂ R)) + + (∑ R ∈ D, vecNormSq (v₃ R)) + + (∑ R ∈ D, vecNormSq (v₄ R)))) := by + congr 1 + congr 1 + rw [Finset.sum_add_distrib, Finset.sum_add_distrib, Finset.sum_add_distrib] + _ = + 4 * + (descendantsAverage Q j (fun R => vecNormSq (v₁ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₂ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₃ R)) + + descendantsAverage Q j (fun R => vecNormSq (v₄ R))) := by + simp [descendantsAverage, D] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/HodgeZero.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/HodgeZero.lean new file mode 100644 index 0000000000..7311524254 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/HodgeZero.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces.AECongruence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Hodge Zero -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- +If a cube vector field is both a zero-trace potential field and solenoidal, then +it vanishes a.e. on the cube. + +This is the uniqueness end of the cube Hodge projection argument: the +solenoidal test against its own zero-trace potential primitive kills its `L²` +norm, and the Hilbert `L²` carrier converts zero norm back to a.e. equality of +plain vector fields. +-/ +theorem ae_eq_zero_of_isPotentialZeroTraceOn_of_isSolenoidalOn + {d : ℕ} (Q : TriadicCube d) {w : Vec d → Vec d} + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) w) : + w =ᵐ[volumeMeasureOn (cubeSet Q)] (0 : Vec d → Vec d) := by + let : Fact (MeasureTheory.volume (cubeSet Q) < ⊤) := + ⟨volume_cubeSet_lt_top Q⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet Q)) + infer_instance + rcases hw with ⟨u, hgrad⟩ + have hwMem : MemVectorL2 (cubeSet Q) w := by + simpa [hgrad] using u.toH1Function.grad_memVectorL2 + let hzeroMem : MemVectorL2 (cubeSet Q) (0 : Vec d → Vec d) := + MeasureTheory.MemLp.zero + have hww_zero : + ∫ x in cubeSet Q, vecDot (w x) (w x) ∂MeasureTheory.volume = 0 := by + simpa [hgrad] using hsol u + have hzero_hilbert : toHilbertVectorL2OfVecField hwMem = 0 := by + have hinner_zero : + inner ℝ (toHilbertVectorL2OfVecField hwMem) + (toHilbertVectorL2OfVecField hwMem) = 0 := by + calc + inner ℝ (toHilbertVectorL2OfVecField hwMem) + (toHilbertVectorL2OfVecField hwMem) + = ∫ x in cubeSet Q, vecDot (w x) (w x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := cubeSet Q) hwMem hwMem + _ = 0 := hww_zero + have hnorm_sq : ‖toHilbertVectorL2OfVecField hwMem‖ ^ 2 = 0 := by + simpa [real_inner_self_eq_norm_sq] using hinner_zero + have hnorm_zero : ‖toHilbertVectorL2OfVecField hwMem‖ = 0 := by + nlinarith [sq_nonneg ‖toHilbertVectorL2OfVecField hwMem‖, hnorm_sq] + exact norm_eq_zero.mp hnorm_zero + have hzero_vector : toVectorL2 hwMem = 0 := by + have htransport := + congrArg (hilbertVectorL2ToVectorL2 (U := cubeSet Q)) hzero_hilbert + simpa [hilbertVectorL2ToVectorL2_toHilbertVectorL2 + (U := cubeSet Q) (f := w) hwMem] using htransport + have hzero_vector' : + toVectorL2 hwMem = + toVectorL2 (U := cubeSet Q) (f := (0 : Vec d → Vec d)) hzeroMem := by + rw [show toVectorL2 (U := cubeSet Q) (f := (0 : Vec d → Vec d)) hzeroMem = 0 by + simp [toVectorL2]] + exact hzero_vector + exact + (toVectorL2_eq_toVectorL2_iff + (U := cubeSet Q) (f := w) (g := 0) hwMem hzeroMem).mp hzero_vector' + +/-- +If a cube vector field is both a zero-trace potential field and solenoidal, then +the concrete `q = 2` negative Besov seminorm sees it as zero. +-/ +theorem cubeBesovNegativeVectorSeminormTwo_eq_zero_of_isPotentialZeroTraceOn_of_isSolenoidalOn + {d : ℕ} (Q : TriadicCube d) (s : ℝ) {w : Vec d → Vec d} + (hw : IsPotentialZeroTraceOn (cubeSet Q) w) + (hsol : IsSolenoidalOn (cubeSet Q) w) : + cubeBesovNegativeVectorSeminormTwo Q s w = 0 := by + have hw_ae_zero := + ae_eq_zero_of_isPotentialZeroTraceOn_of_isSolenoidalOn Q hw hsol + rw [cubeBesovNegativeVectorSeminormTwo_eq_of_ae_eq_on_cubeSet (Q := Q) (s := s) hw_ae_zero] + exact cubeBesovNegativeVectorSeminormTwo_zero Q s + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Localization.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Localization.lean new file mode 100644 index 0000000000..e7bc14dbf8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfaces/Localization.lean @@ -0,0 +1,246 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise +public import Mathlib.Algebra.Order.Chebyshev + +/-! # Localization -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators ENNReal + +/-! +# Localization for the concrete vector negative `q = 2` seminorm + +This file proves the finite-energy localization estimate for the concrete +negative Besov seminorm used in the Ch3.3 Hodge-projection input. The full +seminorm is an `sSup` of finite partial seminorms, so the final full-seminorm +statement assumes the local partial seminorms are bounded above; this is the +same `sSup` well-posedness hypothesis used throughout the deterministic Ch3 +files when a finite partial norm is compared to the full norm. +-/ + +theorem descendantsAverage_sq_le_descendantsAverage_sq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) : + (descendantsAverage Q j F) ^ 2 ≤ descendantsAverage Q j (fun R => (F R) ^ 2) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let c : ℝ := D.card + let S : ℝ := ∑ R ∈ D, F R + let T : ℝ := ∑ R ∈ D, (F R) ^ 2 + have hcard_ne : c ≠ 0 := by + dsimp [c, D] + exact_mod_cast (Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q j)) + have hcheb : S ^ 2 ≤ c * T := by + dsimp [S, T, c] + simpa [D] using (sq_sum_le_card_mul_sum_sq (s := D) (f := F)) + change (((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, F R) ^ 2 ≤ + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, (F R) ^ 2 + change (c⁻¹ * S) ^ 2 ≤ c⁻¹ * T + calc + (c⁻¹ * S) ^ 2 = (c⁻¹) ^ 2 * S ^ 2 := by ring + _ ≤ (c⁻¹) ^ 2 * (c * T) := + mul_le_mul_of_nonneg_left hcheb (sq_nonneg c⁻¹) + _ = c⁻¹ * T := by + field_simp [hcard_ne] + +theorem vecNormSq_cubeAverageVec_le_descendantsAverage_vecNormSq_cubeAverageVec_one_of_memLp + {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) : + vecNormSq (cubeAverageVec Q u) ≤ + descendantsAverage Q 1 fun R => vecNormSq (cubeAverageVec R u) := by + classical + have hcoord : ∀ i : Fin d, + (cubeAverage Q (fun x => u x i)) ^ 2 ≤ + descendantsAverage Q 1 (fun R => (cubeAverage R (fun x => u x i)) ^ 2) := by + intro i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ENNReal) + (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hui_int : MeasureTheory.IntegrableOn (fun x => u x i) + (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure Q (hui.integrable (by norm_num)) + have havg : cubeAverage Q (fun x => u x i) = + descendantsAverage Q 1 (fun R => cubeAverage R (fun x => u x i)) := + cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn + Q 1 (fun x => u x i) hui_int + rw [havg] + exact descendantsAverage_sq_le_descendantsAverage_sq Q 1 + (fun R => cubeAverage R (fun x => u x i)) + calc + vecNormSq (cubeAverageVec Q u) + = ∑ i : Fin d, (cubeAverage Q (fun x => u x i)) ^ 2 := by + simp [cubeAverageVec, vecNormSq, vecDot, pow_two] + _ ≤ ∑ i : Fin d, + descendantsAverage Q 1 (fun R => (cubeAverage R (fun x => u x i)) ^ 2) := by + exact Finset.sum_le_sum fun i _hi => hcoord i + _ = descendantsAverage Q 1 (fun R => ∑ i : Fin d, + (cubeAverage R (fun x => u x i)) ^ 2) := by + simpa using (descendantsAverage_sum Q 1 Finset.univ + (fun R i => (cubeAverage R (fun x => u x i)) ^ 2)).symm + _ = descendantsAverage Q 1 (fun R => vecNormSq (cubeAverageVec R u)) := by + congr 1 + funext R + simp [cubeAverageVec, vecNormSq, vecDot, pow_two] + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_le_descendantsAverage_one_same_depth_of_memLp + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (_hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) (N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + descendantsAverage Q 1 fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2 := by + induction N generalizing Q with + | zero => + have htop := + vecNormSq_cubeAverageVec_le_descendantsAverage_vecNormSq_cubeAverageVec_one_of_memLp + Q u hu + simpa [sq_cubeBesovNegativeVectorPartialSeminormTwo, + sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] using htop + | succ N ih => + have htop := + vecNormSq_cubeAverageVec_le_descendantsAverage_vecNormSq_cubeAverageVec_one_of_memLp + Q u hu + let r : ℝ := Real.rpow (3 : ℝ) (-2 * s) + have hr_nonneg : 0 ≤ r := by + dsimp [r] + exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + have hchild_step : ∀ R ∈ descendantsAtDepth Q 1, + (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2 ≤ + descendantsAverage R 1 fun S => + (cubeBesovNegativeVectorPartialSeminormTwo S s N u) ^ 2 := by + intro R hR + have huR : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + exact ih R huR + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 + = vecNormSq (cubeAverageVec Q u) + + r * descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + simpa [r] using + sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_eq_top_add_descendantsAverage + Q s N u + _ ≤ descendantsAverage Q 1 (fun R => vecNormSq (cubeAverageVec R u)) + + r * descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + exact add_le_add htop le_rfl + _ ≤ descendantsAverage Q 1 (fun R => vecNormSq (cubeAverageVec R u)) + + r * descendantsAverage Q 1 + (fun R => descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorPartialSeminormTwo S s N u) ^ 2)) := by + refine add_le_add le_rfl ?_ + exact mul_le_mul_of_nonneg_left + (descendantsAverage_le_descendantsAverage Q 1 hchild_step) hr_nonneg + _ = descendantsAverage Q 1 + (fun R => vecNormSq (cubeAverageVec R u) + + r * descendantsAverage R 1 + (fun S => (cubeBesovNegativeVectorPartialSeminormTwo S s N u) ^ 2)) := by + rw [descendantsAverage_add] + rw [descendantsAverage_smul] + _ = descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s (N + 1) u) ^ 2) := by + congr 1 + funext R + simpa [r] using + (sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_eq_top_add_descendantsAverage + R s N u).symm + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_le_descendantsAverage_same_depth_of_memLp + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) (j N : ℕ) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + descendantsAverage Q j fun R => + (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2 := by + induction j generalizing Q with + | zero => + simp [descendantsAverage] + | succ j ih => + have hstep := + sq_cubeBesovNegativeVectorPartialSeminormTwo_le_descendantsAverage_one_same_depth_of_memLp + Q hs u hu N + have hnext : + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) ≤ + descendantsAverage Q 1 + (fun R => descendantsAverage R j + (fun S => (cubeBesovNegativeVectorPartialSeminormTwo S s N u) ^ 2)) := by + refine descendantsAverage_le_descendantsAverage Q 1 ?_ + intro R hR + have huR : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + exact ih R huR + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 + ≤ descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := hstep + _ ≤ descendantsAverage Q 1 + (fun R => descendantsAverage R j + (fun S => (cubeBesovNegativeVectorPartialSeminormTwo S s N u) ^ 2)) := hnext + _ = descendantsAverage Q (j + 1) + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + rw [Nat.add_comm] + rw [descendantsAverage_add_eq_descendantsAverage_descendantsAverage] + +theorem cubeBesovNegativeVectorSeminormTwo_le_sqrt_descendantsAverage_sq_of_memLp_of_descendant_bddAbove + {d : ℕ} (Q : TriadicCube d) {s : ℝ} (hs : 0 < s) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ENNReal) (normalizedCubeMeasure Q)) (j : ℕ) + (hBdd : ∀ R ∈ descendantsAtDepth Q j, + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo R s N u)) : + cubeBesovNegativeVectorSeminormTwo Q s u ≤ + Real.sqrt (descendantsAverage Q j fun R => + (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) := by + refine cubeBesovNegativeVectorSeminormTwo_le_of_partialBound Q s u ?_ + intro N + have hsq_partial := + sq_cubeBesovNegativeVectorPartialSeminormTwo_le_descendantsAverage_same_depth_of_memLp + Q hs u hu j N + have havg_partial_full : + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) ≤ + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hpartial_le_full : + cubeBesovNegativeVectorPartialSeminormTwo R s N u ≤ + cubeBesovNegativeVectorSeminormTwo R s u := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup (hBdd R hR) ⟨N, rfl⟩ + have hpartial_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo R s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s N u + have hfull_nonneg : 0 ≤ cubeBesovNegativeVectorSeminormTwo R s u := by + have hzero_le : cubeBesovNegativeVectorPartialSeminormTwo R s 0 u ≤ + cubeBesovNegativeVectorSeminormTwo R s u := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup (hBdd R hR) ⟨0, rfl⟩ + exact (cubeBesovNegativeVectorPartialSeminormTwo_nonneg R s 0 u).trans hzero_le + nlinarith + have hsq : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) := + hsq_partial.trans havg_partial_full + have hpartial_nonneg : 0 ≤ cubeBesovNegativeVectorPartialSeminormTwo Q s N u := + cubeBesovNegativeVectorPartialSeminormTwo_nonneg Q s N u + have havg_nonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeBesovNegativeVectorSeminormTwo R s u) ^ 2) := + descendantsAverage_nonneg Q j _ fun _R _hR => sq_nonneg _ + exact (Real.le_sqrt hpartial_nonneg havg_nonneg).2 hsq + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesComponentwise.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesComponentwise.lean new file mode 100644 index 0000000000..53444a2257 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesComponentwise.lean @@ -0,0 +1,1249 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesPositiveQTwo +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Bounds + +/-! # Weak Norm Interfaces Componentwise -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +theorem abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_two {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 < B) + (hnorm : ∀ N : ℕ, cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u) * B := by + have hpConjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [show cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)))] + norm_num + have hpair := + abs_cubeBesovPairing_le_mul_cubeBesovDualFullNorm_of_uniform_bound_two_two + Q s u g hs hu hB hnorm hmem + have hfull := + cubeBesovDualFullNorm_le_note_constant_mul_cubeBesovCircNorm + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u hs hu (by norm_num) (by norm_num) hpConjTop + (by norm_num) + calc + |cubeBesovPairing Q u g| + ≤ cubeBesovDualFullNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u * B := hpair + _ ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u) * B := by + exact mul_le_mul_of_nonneg_right hfull hB.le + +theorem abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → ℝ) {B : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : 0 ≤ B) + (hnorm : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B) + (hmem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g) : + |cubeBesovPairing Q u g| ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u) * B := by + let A : ℝ := + (3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + have hCircBdd : + BddAbove (cubeBesovCircNormValueSet Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u) := + cubeBesovCircNormValueSet_bddAbove_of_memLp Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u + hs hu (by norm_num) (by norm_num) (by norm_num) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact mul_nonneg + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _) + (cubeBesovCircNorm_nonneg Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) u hCircBdd) + change |cubeBesovPairing Q u g| ≤ A * B + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + have hBδ_pos : 0 < B + δ := add_pos_of_nonneg_of_pos hB hδ_pos + have hnormδ : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N g ≤ B + δ := by + intro N + exact (hnorm N).trans (le_add_of_nonneg_right hδ_pos.le) + have hstrict := + abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_two + Q s u g hs hu hBδ_pos hnormδ hmem + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + |cubeBesovPairing Q u g| ≤ A * (B + δ) := by + simpa [A] using hstrict + _ = A * B + A * δ := by ring + _ ≤ A * B + ε := by linarith + +theorem abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_two_of_nonneg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) (B : Fin d → ℝ) + (hs : 0 < s) + (hu : ∀ i, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hB : ∀ i, 0 ≤ B i) + (hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => g x i) ≤ B i) + (hmem : + ∀ i, CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => g x i)) : + |cubeAverage Q (fun x => vecDot (u x) (g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i)) * B i) := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hInt : + ∀ i : Fin d, + MeasureTheory.Integrable (fun x => u x i * g x i) (normalizedCubeMeasure Q) := by + intro i + have hBi_pos : 0 < B i + 1 := add_pos_of_nonneg_of_pos (hB i) zero_lt_one + have hnormBi : + ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => g x i) ≤ + B i + 1 := by + intro N + exact (hnorm i N).trans (le_add_of_nonneg_right zero_le_one) + have hgfull : + CubeBesovDualFullTest Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) + (fun x => (B i + 1)⁻¹ * g x i) := + cubeBesovDualFullTest_two_two_of_uniform_bound Q s (fun x => g x i) + hBi_pos hnormBi (hmem i) + have hgi_mem : + MeasureTheory.MemLp (fun x => g x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hscaled_mem : + MeasureTheory.MemLp (fun x => (B i + 1)⁻¹ * g x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [hpConj, Pi.smul_apply, smul_eq_mul] using hgfull.memLp + have hconst : + MeasureTheory.MemLp (fun x => (B i + 1) * ((B i + 1)⁻¹ * g x i)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [Pi.smul_apply, smul_eq_mul] using! hscaled_mem.const_smul (B i + 1) + convert hconst using 1 + funext x + field_simp [hBi_pos.ne'] + simpa [Pi.mul_apply, mul_comm] using! (hu i).integrable_mul hgi_mem + calc + |cubeAverage Q (fun x => vecDot (u x) (g x))| + ≤ ∑ i, |cubeBesovPairing Q (fun x => u x i) (fun x => g x i)| := by + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q u g hInt + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i)) * B i) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_two_of_nonneg + Q s (fun x => u x i) (fun x => g x i) hs (hu i) (hB i) (hnorm i) (hmem i) + +theorem memLp_on_descendant_of_memLp_generic {d : ℕ} {E : Type*} + [NormedAddCommGroup E] {Q R : TriadicCube d} {j : ℕ} + {p : ℝ≥0∞} {f : Vec d → E} + (hR : R ∈ descendantsAtDepth Q j) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedCubeMeasure R) := by + have hrestrict : + MeasureTheory.MemLp f p ((normalizedCubeMeasure Q).restrict (cubeSet R)) := + hf.restrict (cubeSet R) + have hle : + normalizedCubeMeasure R ≤ + ENNReal.ofReal (cubeVolume Q / cubeVolume R) • + (normalizedCubeMeasure Q).restrict (cubeSet R) := by + simp [normalizedCubeMeasure_descendant_eq_smul_restrict hR] + exact hrestrict.of_measure_le_smul ENNReal.ofReal_ne_top hle + +theorem memLp_component_of_memLp {d : ℕ} {Q : TriadicCube d} + (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + +theorem memLp_cubeFluctuationVec {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (cubeFluctuationVec Q u) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverageVec Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const (cubeAverageVec Q u) + simpa [cubeFluctuationVec] using! hu.sub hconst + +theorem cubeFluctuation_component_eq_cubeFluctuationVec_component {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) : + cubeFluctuation Q (fun x => u x i) = fun x => cubeFluctuationVec Q u x i := by + funext x + simp [cubeFluctuation, cubeFluctuationVec, cubeAverageVec] + +theorem sqrt_sum_sq_const_mul_eq_componentwise {ι : Type*} (s : Finset ι) (c : ℝ) (F : ι → ℝ) + (hc : 0 ≤ c) : + Real.sqrt (Finset.sum s (fun i => (c * F i) ^ 2)) = + c * Real.sqrt (Finset.sum s (fun i => (F i) ^ 2)) := by + have hF_nonneg : 0 ≤ Finset.sum s (fun i => (F i) ^ 2) := by + exact Finset.sum_nonneg fun i hi => sq_nonneg _ + calc + Real.sqrt (Finset.sum s (fun i => (c * F i) ^ 2)) + = Real.sqrt (c ^ 2 * Finset.sum s (fun i => (F i) ^ 2)) := by + congr 1 + calc + Finset.sum s (fun i => (c * F i) ^ 2) = Finset.sum s (fun i => c ^ 2 * (F i) ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = c ^ 2 * Finset.sum s (fun i => (F i) ^ 2) := by + rw [← Finset.mul_sum] + _ = Real.sqrt (c ^ 2) * Real.sqrt (Finset.sum s (fun i => (F i) ^ 2)) := by + rw [Real.sqrt_mul (sq_nonneg c)] + _ = c * Real.sqrt (Finset.sum s (fun i => (F i) ^ 2)) := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hc] + +theorem cubeBesovNegativeVectorDepthSeminorm_le_partialSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (N j : ℕ) + (hj : j ∈ Finset.range (N + 1)) : + cubeBesovNegativeVectorDepthSeminorm Q s u j ≤ + cubeBesovNegativeVectorPartialSeminorm Q s N u := by + unfold cubeBesovNegativeVectorPartialSeminorm + exact Finset.single_le_sum + (fun k _ => cubeBesovNegativeVectorDepthSeminorm_nonneg Q s u k) hj + +theorem cubeBesovPositiveVectorDepthSeminorm_le_partialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (N j : ℕ) + (hj : j ∈ Finset.range (N + 1)) : + cubeBesovPositiveVectorDepthSeminorm Q s u j ≤ + cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + have hsq : + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ (2 : ℕ) ≤ + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ (2 : ℕ) := by + rw [sq_cubeBesovPositiveVectorPartialSeminormTwo] + exact Finset.single_le_sum + (fun k _ => sq_nonneg (cubeBesovPositiveVectorDepthSeminorm Q s u k)) hj + have hdepth_nonneg : 0 ≤ cubeBesovPositiveVectorDepthSeminorm Q s u j := + cubeBesovPositiveVectorDepthSeminorm_nonneg Q s u j + have hpartial_nonneg : 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s N u := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s N u + nlinarith + +theorem cubeBesovCircDepthAverage_two_component_le_negativeVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) (j : ℕ) : + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovNegativeVectorDepthAverage Q u j := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hcoord : + (cubeAverage R (fun x => u x i)) ^ (2 : ℕ) ≤ vecNormSq (cubeAverageVec R u) := by + simpa [cubeAverageVec] using sq_apply_le_vecNormSq (cubeAverageVec R u) i + simpa [cubeBesovNegativeVectorDepthAverage, cubeBesovCircDepthAverage, + Real.rpow_natCast, pow_two, Real.norm_eq_abs] using hcoord + +theorem cubeBesovCircDepthSeminorm_two_component_le_scaleWeight_neg_mul_negativeVectorDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (j : ℕ) : + cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorDepthSeminorm Q s u j := by + have havg : + cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovNegativeVectorDepthAverage Q u j := + cubeBesovCircDepthAverage_two_component_le_negativeVectorDepthAverage Q u i j + have hsqrt : + Real.sqrt (cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j) ≤ + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) := by + exact Real.sqrt_le_sqrt havg + have hweight : + cubeBesovCircDepthWeight Q s j = + cubeBesovScaleWeight (-s) Q * Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + calc + cubeBesovCircDepthWeight Q s j + = cubeBesovScaleWeight (-s) Q * ((3 : ℝ) ^ (-s)) ^ j := by + exact cubeBesovCircDepthWeight_eq_scaleWeight_neg_mul_geom Q s j + _ = cubeBesovScaleWeight (-s) Q * Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by + congr 1 + calc + ((3 : ℝ) ^ (-s)) ^ j = Real.rpow ((3 : ℝ) ^ (-s)) (j : ℝ) := by + symm + exact Real.rpow_natCast _ j + _ = Real.rpow (3 : ℝ) ((-s) * (j : ℝ)) := by + simpa using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s) (j : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-s * (j : ℝ)) := by ring + have hweight_nonneg : 0 ≤ cubeBesovCircDepthWeight Q s j := + cubeBesovCircDepthWeight_nonneg Q s j + calc + cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j + = cubeBesovCircDepthWeight Q s j * + Real.sqrt (cubeBesovCircDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j) := by + simp [cubeBesovCircDepthSeminorm, Real.sqrt_eq_rpow] + _ ≤ cubeBesovCircDepthWeight Q s j * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorDepthSeminorm Q s u j := by + rw [hweight] + simp [cubeBesovNegativeVectorDepthSeminorm, mul_assoc] + +theorem cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) : + cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorPartialSeminorm Q s N u := by + calc + cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => u x i) + = Finset.sum (Finset.range (N + 1)) + (fun j => cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) := by + simp [cubeBesovCircPartialNorm, cubeBesovCircPartialSeminorm] + _ ≤ Finset.sum (Finset.range (N + 1)) + (fun j => + cubeBesovScaleWeight (-s) Q * + cubeBesovNegativeVectorDepthSeminorm Q s u j) := by + refine Finset.sum_le_sum ?_ + intro j hj + exact + cubeBesovCircDepthSeminorm_two_component_le_scaleWeight_neg_mul_negativeVectorDepthSeminorm + Q s u i j + _ = cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorPartialSeminorm Q s N u := by + simp [cubeBesovNegativeVectorPartialSeminorm, Finset.mul_sum] + +theorem cubeBesovCircPartialNorm_two_two_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) : + cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorPartialSeminormTwo Q s N u := by + have hsum_le : + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + (cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hdepth := + cubeBesovCircDepthSeminorm_two_component_le_scaleWeight_neg_mul_negativeVectorDepthSeminorm + Q s u i j + have hleft_nonneg : + 0 ≤ cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j := + cubeBesovCircDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => u x i) j + have hright_nonneg : + 0 ≤ cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorDepthSeminorm Q s u j := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-s) Q) + (cubeBesovNegativeVectorDepthSeminorm_nonneg Q s u j) + nlinarith + have hsum_nonneg : + 0 ≤ Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) := by + refine Finset.sum_nonneg ?_ + intro j hj + exact sq_nonneg _ + calc + cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => u x i) + = + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovCircDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) ^ 2)) := by + unfold cubeBesovCircPartialNorm cubeBesovCircPartialSeminorm + rw [Real.sqrt_eq_rpow] + norm_num + _ ≤ + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => + (cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2)) := by + exact Real.sqrt_le_sqrt hsum_le + _ = + cubeBesovScaleWeight (-s) Q * + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2)) := by + exact sqrt_sum_sq_const_mul_eq_componentwise + (Finset.range (N + 1)) + (cubeBesovScaleWeight (-s) Q) + (fun j => cubeBesovNegativeVectorDepthSeminorm Q s u j) + (cubeBesovScaleWeight_nonneg (-s) Q) + _ = cubeBesovScaleWeight (-s) Q * cubeBesovNegativeVectorPartialSeminormTwo Q s N u := by + unfold cubeBesovNegativeVectorPartialSeminormTwo + rfl + +theorem cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ B) : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * B := by + unfold cubeBesovCircNorm + refine csSup_le ?_ ?_ + · exact cubeBesovCircNormValueSet_nonempty Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + · rintro x ⟨N, rfl⟩ + calc + cubeBesovCircNormEntry Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => u x i) + = cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) (fun x => u x i) := by + simp [cubeBesovCircNormEntry] + _ ≤ cubeBesovScaleWeight (-s) Q * + cubeBesovNegativeVectorPartialSeminorm Q s (N + 1) u := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q s u i (N + 1) + _ ≤ cubeBesovScaleWeight (-s) Q * B := by + exact mul_le_mul_of_nonneg_left (hB (N + 1)) + (cubeBesovScaleWeight_nonneg (-s) Q) + +theorem norm_cubeAverage_smul_component_le_cutoffDualCoeff_mul_negativeVectorPartialBound + {d : ℕ} (Q : TriadicCube d) (s : ℝ) + (u : Vec d → Vec d) (φ : Vec d → ℝ) (i : Fin d) + {Bφ B : ℝ} + (hs : 0 < s) + (hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) + (hBφ : 0 ≤ Bφ) + (hφDual : ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N φ ≤ Bφ) + (hφMem : CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) φ) + (hPartial : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ B) : + ‖cubeAverage Q (fun x => (φ x • u x) i)‖ ≤ + ((3 : ℝ) ^ ((d : ℝ) + s) * cubeBesovScaleWeight (-s) Q * Bφ) * B := by + have hB_nonneg : 0 ≤ B := + (cubeBesovNegativeVectorPartialSeminorm_nonneg Q s 0 u).trans (hPartial 0) + have hpair : + ‖cubeAverage Q (fun x => (φ x • u x) i)‖ = + |cubeBesovPairing Q (fun x => u x i) φ| := by + simp [cubeBesovPairing, Pi.smul_apply, smul_eq_mul, Real.norm_eq_abs, + mul_comm] + have hdual := + abs_cubeBesovPairing_le_note_constant_mul_of_uniform_bound_two_one_of_nonneg + Q s (fun x => u x i) φ hs hui hBφ hφDual hφMem + have hcirc : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * B := + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q s u i hPartial + have hcoeff_nonneg : 0 ≤ (3 : ℝ) ^ ((d : ℝ) + s) := + Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + rw [hpair] + calc + |cubeBesovPairing Q (fun x => u x i) φ| + ≤ ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i)) * Bφ := hdual + _ ≤ ((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * B)) * Bφ := by + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcirc hcoeff_nonneg) hBφ + _ = ((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovScaleWeight (-s) Q * Bφ) * B := by ring + +theorem sum_abs_apply_le_card_mul_norm {d : ℕ} (v : Vec d) : + (∑ i : Fin d, |v i|) ≤ (Fintype.card (Fin d) : ℝ) * ‖v‖ := by + calc + (∑ i : Fin d, |v i|) ≤ ∑ _i : Fin d, ‖v‖ := by + refine Finset.sum_le_sum ?_ + intro i _hi + simpa [Real.norm_eq_abs] using norm_le_pi_norm v i + _ = (Fintype.card (Fin d) : ℝ) * ‖v‖ := by + simp [Finset.sum_const, nsmul_eq_mul] + +theorem sum_abs_mul_const_mul_le_card_mul_norm_mul_const_mul_of_nonneg + {d : ℕ} (v : Vec d) {K W : ℝ} + (hK : 0 ≤ K) (hW : 0 ≤ W) : + (∑ i : Fin d, |v i| * (K * W)) ≤ + ((Fintype.card (Fin d) : ℝ) * K) * ‖v‖ * W := by + have hKW : 0 ≤ K * W := mul_nonneg hK hW + calc + (∑ i : Fin d, |v i| * (K * W)) + = ∑ i : Fin d, (K * W) * |v i| := by + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + _ = (K * W) * ∑ i : Fin d, |v i| := by + rw [Finset.mul_sum] + _ ≤ (K * W) * ((Fintype.card (Fin d) : ℝ) * ‖v‖) := by + exact mul_le_mul_of_nonneg_left (sum_abs_apply_le_card_mul_norm v) hKW + _ = ((Fintype.card (Fin d) : ℝ) * K) * ‖v‖ * W := by ring + +theorem cubeBesovCircNorm_two_two_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBoundTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ B) : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * B := by + unfold cubeBesovCircNorm + refine csSup_le ?_ ?_ + · exact cubeBesovCircNormValueSet_nonempty Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + · rintro x ⟨N, rfl⟩ + calc + cubeBesovCircNormEntry Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => u x i) + = cubeBesovCircPartialNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (N + 1) (fun x => u x i) := by + simp [cubeBesovCircNormEntry] + _ ≤ cubeBesovScaleWeight (-s) Q * + cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u := by + exact + cubeBesovCircPartialNorm_two_two_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminormTwo + Q s u i (N + 1) + _ ≤ cubeBesovScaleWeight (-s) Q * B := by + exact mul_le_mul_of_nonneg_left (hB (N + 1)) + (cubeBesovScaleWeight_nonneg (-s) Q) + +/-- Componentwise `q = 1` circ control at a larger exponent from the full +vector `q = 2` negative seminorm at a smaller exponent, with the geometric +loss from the exponent gap. -/ +theorem cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_gap_geometric_of_bddAbove + {d : ℕ} (Q : TriadicCube d) {a b : ℝ} (hgap : 0 < a - b) + (u : Vec d → Vec d) (i : Fin d) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovNegativeVectorPartialSeminormTwo Q b N u)) : + cubeBesovCircNorm Q a (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-a) Q * + (Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (a - b)))⁻¹) * + cubeBesovNegativeVectorSeminormTwo Q b u) := by + refine + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q a u i ?_ + intro N + have hpartial : + cubeBesovNegativeVectorPartialSeminorm Q a N u ≤ + Real.sqrt ((1 - Real.rpow (3 : ℝ) (-2 * (a - b)))⁻¹) * + cubeBesovNegativeVectorPartialSeminormTwo Q b N u := + cubeBesovNegativeVectorPartialSeminorm_le_gap_geometric_mul_partialSeminormTwo + Q hgap N u + have hfull : + cubeBesovNegativeVectorPartialSeminormTwo Q b N u ≤ + cubeBesovNegativeVectorSeminormTwo Q b u := by + unfold cubeBesovNegativeVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + exact hpartial.trans + (mul_le_mul_of_nonneg_left hfull (Real.sqrt_nonneg _)) + +/-- Componentwise `q = 1` circ control at a larger exponent from a scaled +negative-vector partial bound at a smaller exponent. -/ +theorem cubeBesovCircNorm_two_one_component_le_scaleWeight_gap_mul_of_scaled_negativeVectorPartialBound + {d : ℕ} (Q : TriadicCube d) {r t : ℝ} (ht : t ≤ r) + (u : Vec d → Vec d) (i : Fin d) {B : ℝ} + (hB : ∀ N : ℕ, + cubeBesovScaleWeight (-t) Q * cubeBesovNegativeVectorPartialSeminorm Q t N u ≤ B) : + cubeBesovCircNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-(r - t)) Q * B := by + unfold cubeBesovCircNorm + refine csSup_le ?_ ?_ + · exact cubeBesovCircNormValueSet_nonempty Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u x i) + · rintro x ⟨N, rfl⟩ + calc + cubeBesovCircNormEntry Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => u x i) + = cubeBesovCircPartialNorm Q r (2 : ℝ≥0∞) (1 : ℝ≥0∞) (N + 1) + (fun x => u x i) := by + simp [cubeBesovCircNormEntry] + _ ≤ cubeBesovScaleWeight (-r) Q * + cubeBesovNegativeVectorPartialSeminorm Q r (N + 1) u := by + exact + cubeBesovCircPartialNorm_two_one_component_le_scaleWeight_neg_mul_negativeVectorPartialSeminorm + Q r u i (N + 1) + _ ≤ cubeBesovScaleWeight (-(r - t)) Q * + (cubeBesovScaleWeight (-t) Q * + cubeBesovNegativeVectorPartialSeminorm Q t (N + 1) u) := by + exact + cubeBesovNegativeVectorPartialSeminorm_scale_compare_of_le + Q (r := r) (t := t) ht (N + 1) u + _ ≤ cubeBesovScaleWeight (-(r - t)) Q * B := by + exact mul_le_mul_of_nonneg_left (hB (N + 1)) + (cubeBesovScaleWeight_nonneg (-(r - t)) Q) + +theorem cubeLpNorm_two_component_le_cubeLpNorm_two {d : ℕ} (Q : TriadicCube d) + (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => u x i) ≤ cubeLpNorm Q (2 : ℝ≥0∞) u := by + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_component_of_memLp u i hu + have hpoint : + ∀ᵐ x ∂ normalizedCubeMeasure Q, ‖u x i‖ ≤ (1 : ℝ) * ‖u x‖ := by + exact Filter.Eventually.of_forall fun x => by + simpa using (norm_le_pi_norm (u x) i) + have hle : + MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal (1 : ℝ) * + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.eLpNorm_le_mul_eLpNorm_of_ae_le_mul hui.aestronglyMeasurable hpoint (2 : ℝ≥0∞) + have htop_u : + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≠ ∞ := hu.eLpNorm_lt_top.ne + have htop_ui : + MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≠ ∞ := + hui.eLpNorm_lt_top.ne + have htoReal : + (MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)).toReal ≤ + (MeasureTheory.eLpNorm u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)).toReal := by + have hle' : + MeasureTheory.eLpNorm (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using hle + exact ENNReal.toReal_mono htop_u hle' + simpa [cubeLpNorm] using htoReal + +theorem cubeBesovOscillation_two_component_le_cubeLpNorm_fluctuationVec {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u x i) ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u) := by + have hfluct : MeasureTheory.MemLp (cubeFluctuationVec Q u) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q u hu + simpa [cubeBesovOscillation, cubeFluctuation_component_eq_cubeFluctuationVec_component Q u i] using + cubeLpNorm_two_component_le_cubeLpNorm_two Q (cubeFluctuationVec Q u) i hfluct + +theorem cubeBesovDepthAverage_two_component_le_positiveVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) (j : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovPositiveVectorDepthAverage Q u j := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + have hlocal : + cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u x i) ≤ + cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u) := + cubeBesovOscillation_two_component_le_cubeLpNorm_fluctuationVec R u i huR + have hsq : + (cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u x i)) ^ (2 : ℕ) ≤ + (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u)) ^ (2 : ℕ) := by + have hleft_nonneg : 0 ≤ cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u x i) := + cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) (fun x => u x i) + have hright_nonneg : 0 ≤ cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u) := + cubeLpNorm_nonneg R (2 : ℝ≥0∞) (cubeFluctuationVec R u) + nlinarith + simpa [cubeBesovDepthAverage, cubeBesovPositiveVectorDepthAverage, Real.rpow_natCast] + using hsq + +theorem cubeBesovDepthWeight_eq_scaleWeight_mul_rpow {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovDepthWeight Q s j = + cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + have hQ_nonneg : 0 ≤ cubeScaleFactor Q := cubeVolume_nonneg Q |> fun _ => by + simpa [cubeScaleFactor] using + (le_of_lt (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + calc + cubeBesovDepthWeight Q s j + = (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) := by + rfl + _ = (cubeScaleFactor Q) ^ (-s) / ((3 : ℝ) ^ j) ^ (-s) := by + exact Real.div_rpow hQ_nonneg (by positivity) (-s) + _ = (cubeScaleFactor Q ^ s)⁻¹ / (((3 : ℝ) ^ j) ^ s)⁻¹ := by + rw [Real.rpow_neg hQ_nonneg, Real.rpow_neg (show 0 ≤ ((3 : ℝ) ^ j) by positivity)] + _ = (cubeScaleFactor Q ^ s)⁻¹ * ((3 : ℝ) ^ j) ^ s := by + rw [div_eq_mul_inv, inv_inv] + _ = (cubeScaleFactor Q) ^ (-s) * ((3 : ℝ) ^ j) ^ s := by + rw [← Real.rpow_neg hQ_nonneg] + _ = (cubeScaleFactor Q) ^ (-s) * Real.rpow (3 : ℝ) ((j : ℝ) * s) := by + congr 1 + symm + simpa [mul_comm] using Real.rpow_natCast_mul (by positivity : 0 ≤ (3 : ℝ)) j s + _ = (cubeScaleFactor Q) ^ (-s) * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + rw [mul_comm] + _ = cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + simp [cubeBesovScaleWeight] + +theorem cubeBesovDepthSeminorm_two_component_le_scaleWeight_mul_positiveVectorDepthSeminorm + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (j : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j := by + have havg : + cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j ≤ + cubeBesovPositiveVectorDepthAverage Q u j := + cubeBesovDepthAverage_two_component_le_positiveVectorDepthAverage Q u i j hu + have hsqrt : + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j) ≤ + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q u j) := by + exact Real.sqrt_le_sqrt havg + have hweight_nonneg : 0 ≤ cubeBesovDepthWeight Q s j := + cubeBesovDepthWeight_nonneg Q s j + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j + = cubeBesovDepthWeight Q s j * + Real.sqrt (cubeBesovDepthAverage Q (2 : ℝ≥0∞) (fun x => u x i) j) := by + simp [cubeBesovDepthSeminorm, Real.sqrt_eq_rpow] + _ ≤ cubeBesovDepthWeight Q s j * + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q u j) := by + exact mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j := by + rw [cubeBesovDepthWeight_eq_scaleWeight_mul_rpow] + simp [cubeBesovPositiveVectorDepthSeminorm, mul_assoc] + +theorem cubeBesovPartialSeminorm_two_component_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => u x i) ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + have hsum_le : + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) ^ 2) + ≤ + Finset.sum (Finset.range (N + 1)) + (fun j => + (cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) := by + refine Finset.sum_le_sum ?_ + intro j hj + have hdepth := + cubeBesovDepthSeminorm_two_component_le_scaleWeight_mul_positiveVectorDepthSeminorm + Q s u i j hu + have hleft_nonneg : + 0 ≤ cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j := + cubeBesovDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => u x i) j + have hright_nonneg : + 0 ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (cubeBesovPositiveVectorDepthSeminorm_nonneg Q s u j) + nlinarith + have hsum_nonneg : + 0 ≤ Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2) := by + refine Finset.sum_nonneg ?_ + intro j hj + exact sq_nonneg _ + calc + cubeBesovPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => u x i) + = + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) ^ 2)) := by + unfold cubeBesovPartialSeminorm + rw [Real.sqrt_eq_rpow] + norm_num + _ ≤ + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => + (cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2)) := by + exact Real.sqrt_le_sqrt hsum_le + _ = + cubeBesovScaleWeight s Q * + Real.sqrt + (Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2)) := by + exact sqrt_sum_sq_const_mul_eq_componentwise + (Finset.range (N + 1)) + (cubeBesovScaleWeight s Q) + (fun j => cubeBesovPositiveVectorDepthSeminorm Q s u j) + (cubeBesovScaleWeight_nonneg s Q) + _ = cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + rfl + +theorem cubeBesovPartialSeminormTop_two_component_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N (fun x => u x i) ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + classical + unfold cubeBesovPartialSeminormTop + refine Finset.sup'_le + (s := Finset.range (N + 1)) + (H := ⟨0, by simp⟩) + (f := fun j : ℕ => cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j) ?_ + intro j hj + calc + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => u x i) j + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorDepthSeminorm Q s u j := by + exact cubeBesovDepthSeminorm_two_component_le_scaleWeight_mul_positiveVectorDepthSeminorm + Q s u i j hu + _ ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + exact mul_le_mul_of_nonneg_left + (cubeBesovPositiveVectorDepthSeminorm_le_partialSeminormTwo Q s u N j hj) + (cubeBesovScaleWeight_nonneg s Q) + +theorem cubeBesovDualLocalMemLpGlobal_component_of_memLp {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (i : Fin d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => u x i) := by + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + intro j R hR + have huR : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + have hfluctR : MeasureTheory.MemLp (cubeFluctuationVec R u) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_cubeFluctuationVec R u huR + simpa [hpConj, cubeFluctuation_component_eq_cubeFluctuationVec_component R u i] using! + (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hfluctR + +/-- A scalar `L²` function is locally admissible as a `p = 2` Besov dual test +at every descendant scale. -/ +theorem cubeBesovDualLocalMemLpGlobal_of_memLp_two {d : ℕ} + (Q : TriadicCube d) (g : Vec d → ℝ) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) g := by + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + intro j R hR + have hgR : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + memLp_on_descendant_of_memLp_generic (E := ℝ) hR hg + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage R g) + (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + MeasureTheory.memLp_const (cubeAverage R g) + simpa [hpConj, cubeFluctuation] using! hgR.sub hconst + +theorem cubeBesovDualTestNorm_two_one_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q u x i) ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + have hconj : + cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have havg : + cubeAverage Q (fun x => cubeFluctuationVec Q u x i) = 0 := by + simpa [cubeFluctuation_component_eq_cubeFluctuationVec_component Q u i] using + cubeAverage_cubeFluctuation Q (fun x => u x i) + have hmem : + ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro j hj R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + have hpartial_eq : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (cubeFluctuationVec Q u) = + cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + simpa [cubeFluctuationVec] using! + cubeBesovPositiveVectorPartialSeminormTwo_sub_const Q s N u (cubeAverageVec Q u) + (fun j hj R hR => hmem j hj R hR) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) + N (fun x => cubeFluctuationVec Q u x i) hconj] + rw [cubeBesovPartialNormTop_eq_cubeBesovPartialSeminormTop_of_cubeAverage_eq_zero + Q s (cubeBesovConjExponent (2 : ℝ≥0∞)) N (fun x => cubeFluctuationVec Q u x i) havg] + calc + cubeBesovPartialSeminormTop Q s (cubeBesovConjExponent (2 : ℝ≥0∞)) N + (fun x => cubeFluctuationVec Q u x i) + ≤ cubeBesovScaleWeight s Q * + cubeBesovPositiveVectorPartialSeminormTwo Q s N (cubeFluctuationVec Q u) := by + simpa [hpConj] using + cubeBesovPartialSeminormTop_two_component_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s (cubeFluctuationVec Q u) i N (memLp_cubeFluctuationVec Q u hu) + _ = cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + rw [hpartial_eq] + +theorem cubeBesovDualTestNorm_two_two_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (i : Fin d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q u x i) ≤ + cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + have hpConj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hq : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + rw [hpConj] + norm_num + have havg : + cubeAverage Q (fun x => cubeFluctuationVec Q u x i) = 0 := by + simpa [cubeFluctuation_component_eq_cubeFluctuationVec_component Q u i] using + cubeAverage_cubeFluctuation Q (fun x => u x i) + have hmem : + ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + intro j hj R hR + exact memLp_on_descendant_of_memLp_generic (E := Vec d) hR hu + have hpartial_eq : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (cubeFluctuationVec Q u) = + cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + simpa [cubeFluctuationVec] using! + cubeBesovPositiveVectorPartialSeminormTwo_sub_const Q s N u (cubeAverageVec Q u) + (fun j hj R hR => hmem j hj R hR) + rw [cubeBesovDualTestNorm_eq_cubeBesovDualTestSeminorm_of_cubeAverage_eq_zero + Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => cubeFluctuationVec Q u x i) havg] + rw [cubeBesovDualTestSeminorm_of_conjExponent_ne_top Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q u x i) hq] + calc + cubeBesovPartialSeminorm Q s (cubeBesovConjExponent (2 : ℝ≥0∞)) + (cubeBesovConjExponent (2 : ℝ≥0∞)) N (fun x => cubeFluctuationVec Q u x i) + ≤ cubeBesovScaleWeight s Q * + cubeBesovPositiveVectorPartialSeminormTwo Q s N (cubeFluctuationVec Q u) := by + simpa [hpConj] using + cubeBesovPartialSeminorm_two_component_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s (cubeFluctuationVec Q u) i N (memLp_cubeFluctuationVec Q u hu) + _ = cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + rw [hpartial_eq] + +theorem abs_cubeAverage_vecDot_fluctuationVec_le_sum_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hBscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBg + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) ≤ + cubeBesovScaleWeight s Q * Bg := by + intro i N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N g := by + exact + cubeBesovDualTestNorm_two_one_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s g i N hg + _ ≤ cubeBesovScaleWeight s Q * Bg := by + exact mul_le_mul_of_nonneg_left (hpos N) (cubeBesovScaleWeight_nonneg s Q) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => cubeFluctuationVec Q g x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q (cubeFluctuationVec Q g) i hgFluct + calc + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| + ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_one_of_nonneg + Q s u (cubeFluctuationVec Q g) (fun _ => cubeBesovScaleWeight s Q * Bg) + hs hu_comp (fun _ => hBscale_nonneg) hnorm hmem + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * Bu := by + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q s u i hneg + exact mul_le_mul_of_nonneg_right + (add_le_add + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + le_rfl) + hBscale_nonneg + +/-- Sharp fluctuation estimate without the redundant average tail on the +negative Besov side. This is the bridge form of the sharp vectorized duality +bound used in the note-facing Caccioppoli proof. -/ +theorem abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_partialBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hBscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBg + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) ≤ + cubeBesovScaleWeight s Q * Bg := by + intro i N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N g := by + exact + cubeBesovDualTestNorm_two_one_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s g i N hg + _ ≤ cubeBesovScaleWeight s Q * Bg := by + exact mul_le_mul_of_nonneg_left (hpos N) (cubeBesovScaleWeight_nonneg s Q) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => cubeFluctuationVec Q g x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q (cubeFluctuationVec Q g) i hgFluct + calc + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| + ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_one_of_nonneg + Q s u (cubeFluctuationVec Q g) (fun _ => cubeBesovScaleWeight s Q * Bg) + hs hu_comp (fun _ => hBscale_nonneg) hnorm hmem + _ ≤ ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * Bu := by + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q s u i hneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hBscale_nonneg + _ = (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + simp + +/-- Sharp fluctuation estimate with the positive-side input stated directly as +componentwise dual-test bounds. This avoids forcing callers through the finite +`q = 2` positive Besov package when they already have an infinite-depth +`q = ∞` cutoff-product estimate. -/ +theorem abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_dualTestBounds + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminorm Q s N u ≤ Bu) + (hdual : ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) ≤ cubeBesovScaleWeight s Q * Bg) : + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hBscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBg + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => cubeFluctuationVec Q g x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp + Q (cubeFluctuationVec Q g) i hgFluct + calc + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| + ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_one_of_nonneg + Q s u (cubeFluctuationVec Q g) + (fun _ => cubeBesovScaleWeight s Q * Bg) + hs hu_comp (fun _ => hBscale_nonneg) hdual hmem + _ ≤ ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * Bu := by + exact + cubeBesovCircNorm_two_one_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBound + Q s u i hneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hBscale_nonneg + _ = (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + simp + +theorem abs_cubeAverage_vecDot_fluctuationVec_le_sum_note_terms_of_partialBounds_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| ≤ + ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hBscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBg + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) ≤ + cubeBesovScaleWeight s Q * Bg := by + intro i N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N g := by + exact + cubeBesovDualTestNorm_two_two_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s g i N hg + _ ≤ cubeBesovScaleWeight s Q * Bg := by + exact mul_le_mul_of_nonneg_left (hpos N) (cubeBesovScaleWeight_nonneg s Q) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => cubeFluctuationVec Q g x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q (cubeFluctuationVec Q g) i hgFluct + calc + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| + ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sum_note_rhs_mul_of_uniform_component_bounds_two_two_of_nonneg + Q s u (cubeFluctuationVec Q g) (fun _ => cubeBesovScaleWeight s Q * Bg) + hs hu_comp (fun _ => hBscale_nonneg) hnorm hmem + _ ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu) + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * Bu := by + exact + cubeBesovCircNorm_two_two_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBoundTwo + Q s u i hneg + exact mul_le_mul_of_nonneg_right + (add_le_add + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + le_rfl) + hBscale_nonneg + +/-- Sharp `q = 2` fluctuation estimate without the redundant average tail on +the negative Besov side. -/ +theorem abs_cubeAverage_vecDot_fluctuationVec_le_sum_sharp_note_terms_of_partialBounds_two_two + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u g : Vec d → Vec d) {Bu Bg : ℝ} + (hs : 0 < s) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hBg : 0 ≤ Bg) + (hneg : ∀ N : ℕ, cubeBesovNegativeVectorPartialSeminormTwo Q s N u ≤ Bu) + (hpos : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N g ≤ Bg) : + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| ≤ + (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + have hBscale_nonneg : 0 ≤ cubeBesovScaleWeight s Q * Bg := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) hBg + have hu_comp : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact memLp_component_of_memLp u i hu + have hgFluct : + MeasureTheory.MemLp (cubeFluctuationVec Q g) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memLp_cubeFluctuationVec Q g hg + have hnorm : + ∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) ≤ + cubeBesovScaleWeight s Q * Bg := by + intro i N + calc + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => cubeFluctuationVec Q g x i) + ≤ cubeBesovScaleWeight s Q * cubeBesovPositiveVectorPartialSeminormTwo Q s N g := by + exact + cubeBesovDualTestNorm_two_two_component_cubeFluctuationVec_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s g i N hg + _ ≤ cubeBesovScaleWeight s Q * Bg := by + exact mul_le_mul_of_nonneg_left (hpos N) (cubeBesovScaleWeight_nonneg s Q) + have hmem : + ∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) (fun x => cubeFluctuationVec Q g x i) := by + intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q (cubeFluctuationVec Q g) i hgFluct + calc + |cubeAverage Q (fun x => vecDot (u x) (cubeFluctuationVec Q g x))| + ≤ ∑ i, (((3 : ℝ) ^ ((d : ℝ) + s) * + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i)) * + (cubeBesovScaleWeight s Q * Bg)) := by + exact + abs_cubeAverage_vecDot_le_sum_note_constant_mul_of_uniform_component_bounds_two_two_of_nonneg + Q s u (cubeFluctuationVec Q g) (fun _ => cubeBesovScaleWeight s Q * Bg) + hs hu_comp (fun _ => hBscale_nonneg) hnorm hmem + _ ≤ ∑ i : Fin d, (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + refine Finset.sum_le_sum ?_ + intro i hi + have hcomponent : + cubeBesovCircNorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) (fun x => u x i) ≤ + cubeBesovScaleWeight (-s) Q * Bu := by + exact + cubeBesovCircNorm_two_two_component_le_scaleWeight_neg_mul_of_negativeVectorPartialBoundTwo + Q s u i hneg + exact mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hcomponent + (Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _)) + hBscale_nonneg + _ = (d : ℝ) * (((3 : ℝ) ^ ((d : ℝ) + s) * + (cubeBesovScaleWeight (-s) Q * Bu)) * + (cubeBesovScaleWeight s Q * Bg)) := by + simp + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesPositiveQTwo.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesPositiveQTwo.lean new file mode 100644 index 0000000000..fef38065ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesPositiveQTwo.lean @@ -0,0 +1,579 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesQTwo + +/-! # Weak Norm Interfaces Positive QTwo -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open MeasureTheory.Measure +open scoped BigOperators ENNReal + +/-! +# Note-normalized positive `q = 2` vector weak norms + +This file packages the minimal positive-order vector Besov surface needed on the +right-hand-side branch of the deterministic Chapter-3 argument. The +normalization is the note-facing one: when `Q` has scale `m`, the quantity here +corresponds to `3^(s m) [u]_{\underline{B}^{s}_{2,2}(Q)}`. +-/ + +theorem cubeLpNorm_congr_on_cubeSet_generic {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (p : ℝ≥0∞) + {u v : Vec d → E} (h : ∀ x ∈ cubeSet Q, u x = v x) : + cubeLpNorm Q p u = cubeLpNorm Q p v := by + unfold cubeLpNorm + rw [MeasureTheory.eLpNorm_congr_ae] + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall h) + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +@[simp] theorem cubeAverageVec_const {d : ℕ} (Q : TriadicCube d) (c : Vec d) : + cubeAverageVec Q (fun _ => c) = c := by + funext i + simp [cubeAverageVec, cubeAverage_const] + +theorem cubeAverageVec_sub_const {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) (c : Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverageVec Q (fun x => u x - c) = cubeAverageVec Q u - c := by + funext i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hui_int : MeasureTheory.Integrable (fun x => u x i) (normalizedCubeMeasure Q) := + hui.integrable (by norm_num) + have hc_int : MeasureTheory.Integrable (fun _ : Vec d => c i) (normalizedCubeMeasure Q) := + MeasureTheory.integrable_const _ + calc + cubeAverage Q (fun x => u x i - c i) + = ∫ x, (u x i - c i) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, u x i ∂ normalizedCubeMeasure Q - ∫ x, c i ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_sub hui_int hc_int] + _ = cubeAverage Q (fun x => u x i) - cubeAverage Q (fun _ => c i) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + _ = cubeAverage Q (fun x => u x i) - c i := by + rw [cubeAverage_const] + +theorem cubeAverageVec_sub_memLp {d : ℕ} (Q : TriadicCube d) + (u v : Vec d → Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hv : MeasureTheory.MemLp v (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverageVec Q (fun x => u x - v x) = cubeAverageVec Q u - cubeAverageVec Q v := by + funext i + have hui : MeasureTheory.MemLp (fun x => u x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hu + have hvi : MeasureTheory.MemLp (fun x => v x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa using! (ContinuousLinearMap.proj (R := ℝ) i).comp_memLp' hv + have hui_int : MeasureTheory.Integrable (fun x => u x i) + (normalizedCubeMeasure Q) := + hui.integrable (by norm_num) + have hvi_int : MeasureTheory.Integrable (fun x => v x i) + (normalizedCubeMeasure Q) := + hvi.integrable (by norm_num) + calc + cubeAverage Q (fun x => (u x - v x) i) + = cubeAverage Q (fun x => u x i - v x i) := by + rfl + _ = ∫ x, (u x i - v x i) ∂ normalizedCubeMeasure Q := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ = ∫ x, u x i ∂ normalizedCubeMeasure Q - + ∫ x, v x i ∂ normalizedCubeMeasure Q := by + rw [MeasureTheory.integral_sub hui_int hvi_int] + _ = cubeAverage Q (fun x => u x i) - cubeAverage Q (fun x => v x i) := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- Vector-valued fluctuation on a cube. -/ +noncomputable def cubeFluctuationVec {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) : + Vec d → Vec d := + fun x => u x - cubeAverageVec Q u + +@[simp] theorem cubeFluctuationVec_apply {d : ℕ} (Q : TriadicCube d) (u : Vec d → Vec d) + (x : Vec d) : + cubeFluctuationVec Q u x = u x - cubeAverageVec Q u := + rfl + +@[simp] theorem cubeFluctuationVec_zero {d : ℕ} (Q : TriadicCube d) : + cubeFluctuationVec Q (0 : Vec d → Vec d) = 0 := by + have hmean : cubeAverageVec Q (0 : Vec d → Vec d) = 0 := + cubeAverageVec_const Q (0 : Vec d) + funext x + simp [cubeFluctuationVec, hmean] + +@[simp] theorem cubeFluctuationVec_sub_const {d : ℕ} (Q : TriadicCube d) + (u : Vec d → Vec d) (c : Vec d) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeFluctuationVec Q (fun x => u x - c) = cubeFluctuationVec Q u := by + funext x + ext i + calc + cubeFluctuationVec Q (fun y => u y - c) x i + = (u x i - c i) - cubeAverageVec Q (fun y => u y - c) i := by + rfl + _ = (u x i - c i) - (cubeAverageVec Q u i - c i) := by + rw [cubeAverageVec_sub_const Q u c hu] + simp + _ = cubeFluctuationVec Q u x i := by + simp [cubeFluctuationVec] + +/-- The depth-`j` positive `q = 2` square average for a vector field on a parent cube `Q`. -/ +noncomputable def cubeBesovPositiveVectorDepthAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : ℝ := + descendantsAverage Q j fun R => (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u)) ^ 2 + +/-- Note-normalized positive depth seminorm. For a parent cube of scale `m`, this is the +depth-`j` contribution to `3^(s m) [u]_{\underline{B}^{s}_{2,2}(Q)}`. -/ +noncomputable def cubeBesovPositiveVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : ℝ := + Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q u j) + +/-- Finite-depth note-normalized positive `q = 2` seminorm for vector fields. -/ +noncomputable def cubeBesovPositiveVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : ℝ := + Real.sqrt <| + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + +/-- Full note-normalized positive `q = 2` seminorm for vector fields. -/ +noncomputable def cubeBesovPositiveVectorSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : ℝ := + sSup (Set.range fun N : ℕ => cubeBesovPositiveVectorPartialSeminormTwo Q s N u) + +theorem cubeBesovPositiveVectorDepthAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovPositiveVectorDepthAverage Q u j := by + unfold cubeBesovPositiveVectorDepthAverage + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + +theorem cubeBesovPositiveVectorDepthSeminorm_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeBesovPositiveVectorDepthSeminorm Q s u j := by + unfold cubeBesovPositiveVectorDepthSeminorm + refine mul_nonneg ?_ ?_ + · exact Real.rpow_nonneg (by norm_num : 0 ≤ (3 : ℝ)) _ + · exact Real.sqrt_nonneg _ + +theorem cubeBesovPositiveVectorPartialSeminormTwo_nonneg {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + exact Real.sqrt_nonneg _ + +@[simp] theorem cubeBesovPositiveVectorDepthAverage_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeBesovPositiveVectorDepthAverage Q (0 : Vec d → Vec d) j = 0 := by + unfold cubeBesovPositiveVectorDepthAverage + let D := descendantsAtDepth Q j + change ((D.card : ℝ)⁻¹) * + D.sum + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (0 : Vec d → Vec d)) ^ 2) = + 0 + have hsum : + D.sum + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (cubeFluctuationVec R (0 : Vec d → Vec d)) ^ 2) = + 0 := by + exact Finset.sum_eq_zero fun R hR => by + have hnorm : cubeLpNorm R (2 : ℝ≥0∞) (0 : Vec d → Vec d) = 0 := + cubeLpNorm_zero R (2 : ℝ≥0∞) + simp [hnorm] + rw [hsum] + simp + +@[simp] theorem cubeBesovPositiveVectorDepthSeminorm_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovPositiveVectorDepthSeminorm Q s (0 : Vec d → Vec d) j = 0 := by + simp [cubeBesovPositiveVectorDepthSeminorm] + +@[simp] theorem cubeBesovPositiveVectorPartialSeminormTwo_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (0 : Vec d → Vec d) = 0 := by + simp [cubeBesovPositiveVectorPartialSeminormTwo] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_zero_bddAbove {d : ℕ} + (Q : TriadicCube d) (s : ℝ) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (0 : Vec d → Vec d)) := by + refine ⟨0, ?_⟩ + rintro x ⟨N, rfl⟩ + simp + +@[simp] theorem cubeBesovPositiveVectorSeminormTwo_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) : + cubeBesovPositiveVectorSeminormTwo Q s (0 : Vec d → Vec d) = 0 := by + unfold cubeBesovPositiveVectorSeminormTwo + rw [show Set.range + (fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N + (0 : Vec d → Vec d)) = + ({0} : Set ℝ) by + ext x + constructor + · rintro ⟨N, rfl⟩ + simp + · intro hx + rw [Set.mem_singleton_iff] at hx + exact ⟨0, by simp [hx]⟩] + simp + +@[simp] theorem cubeBesovPositiveVectorDepthAverage_depth_zero {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : + cubeBesovPositiveVectorDepthAverage Q u 0 = + (cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuationVec Q u)) ^ 2 := by + unfold cubeBesovPositiveVectorDepthAverage descendantsAverage + simp + +theorem sq_cubeBesovPositiveVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u j := by + have hA : 0 ≤ cubeBesovPositiveVectorDepthAverage Q u j := + cubeBesovPositiveVectorDepthAverage_nonneg Q u j + calc + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 + = + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovPositiveVectorDepthAverage Q u j)) ^ 2 := by + rfl + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovPositiveVectorDepthAverage Q u j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u j := by + rw [Real.sq_sqrt hA] + +theorem sq_cubeBesovPositiveVectorPartialSeminormTwo {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + (cubeBesovPositiveVectorPartialSeminormTwo Q s N u) ^ 2 = + Finset.sum (Finset.range (N + 1)) fun j => + (cubeBesovPositiveVectorDepthSeminorm Q s u j) ^ 2 := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + simpa [pow_two] using + Real.sq_sqrt + (Finset.sum_nonneg fun j _ => sq_nonneg (cubeBesovPositiveVectorDepthSeminorm Q s u j)) + +theorem cubeBesovPositiveVectorDepthAverage_add_eq_descendantsAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j n : ℕ) : + cubeBesovPositiveVectorDepthAverage Q u (j + n) = + descendantsAverage Q j (fun R => cubeBesovPositiveVectorDepthAverage R u n) := by + simpa [cubeBesovPositiveVectorDepthAverage] using + (descendantsAverage_add_eq_descendantsAverage_descendantsAverage + (Q := Q) (j := j) (n := n) + (F := fun R => (cubeLpNorm R (2 : ℝ≥0∞) (cubeFluctuationVec R u)) ^ 2)) + +theorem descendantsAverage_sq_cubeBesovPositiveVectorDepthSeminorm_eq_shifted {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j n : ℕ) : + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j (fun R => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2) = + (cubeBesovPositiveVectorDepthSeminorm Q s u (j + n)) ^ 2 := by + have h3 : 0 < (3 : ℝ) := by norm_num + have hshift : + Real.rpow (3 : ℝ) (s * (j : ℝ)) * Real.rpow (3 : ℝ) (s * (n : ℝ)) = + Real.rpow (3 : ℝ) (s * ((j + n : ℕ) : ℝ)) := by + calc + Real.rpow (3 : ℝ) (s * (j : ℝ)) * Real.rpow (3 : ℝ) (s * (n : ℝ)) + = Real.rpow (3 : ℝ) (s * (j : ℝ) + s * (n : ℝ)) := by + symm + exact Real.rpow_add h3 _ _ + _ = Real.rpow (3 : ℝ) (s * ((j + n : ℕ) : ℝ)) := by + rw [Nat.cast_add] + ring_nf + calc + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j (fun R => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2) + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage R u n) := by + congr 1 + refine congrArg (descendantsAverage Q j) ?_ + funext R + rw [sq_cubeBesovPositiveVectorDepthSeminorm] + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + ((Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + descendantsAverage Q j (fun R => cubeBesovPositiveVectorDepthAverage R u n)) := by + rw [descendantsAverage_mul_left Q j + ((Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2) + (fun R => cubeBesovPositiveVectorDepthAverage R u n)] + _ = + ((Real.rpow (3 : ℝ) (s * (j : ℝ))) * Real.rpow (3 : ℝ) (s * (n : ℝ))) ^ 2 * + descendantsAverage Q j (fun R => cubeBesovPositiveVectorDepthAverage R u n) := by + ring + _ = + (Real.rpow (3 : ℝ) (s * ((j + n : ℕ) : ℝ))) ^ 2 * + descendantsAverage Q j (fun R => cubeBesovPositiveVectorDepthAverage R u n) := by + congr 1 + exact congrArg (fun x : ℝ => x ^ 2) hshift + _ = + (Real.rpow (3 : ℝ) (s * ((j + n : ℕ) : ℝ))) ^ 2 * + cubeBesovPositiveVectorDepthAverage Q u (j + n) := by + rw [cubeBesovPositiveVectorDepthAverage_add_eq_descendantsAverage] + _ = (cubeBesovPositiveVectorDepthSeminorm Q s u (j + n)) ^ 2 := by + symm + exact sq_cubeBesovPositiveVectorDepthSeminorm Q s u (j + n) + +theorem descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j N : ℕ) : + descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) ≤ + (cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u) ^ 2 := by + calc + descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) + = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) := by + calc + descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) + = + descendantsAverage Q j + (fun R => + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + (cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring_nf + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) := by + rw [descendantsAverage_mul_left Q j + ((Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2) + (fun R => (cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2)] + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j + (fun R => Finset.sum (Finset.range (N + 1)) + (fun n => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2)) := by + congr 1 + refine congrArg (descendantsAverage Q j) ?_ + funext R + exact sq_cubeBesovPositiveVectorPartialSeminormTwo R s N u + _ = + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + Finset.sum (Finset.range (N + 1)) + (fun n => + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2)) := by + rw [descendantsAverage_sum Q j (Finset.range (N + 1)) + (fun R n => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2)] + _ = + Finset.sum (Finset.range (N + 1)) + (fun n => + (Real.rpow (3 : ℝ) (s * (j : ℝ))) ^ 2 * + descendantsAverage Q j + (fun R => (cubeBesovPositiveVectorDepthSeminorm R s u n) ^ 2)) := by + rw [Finset.mul_sum] + _ = + Finset.sum (Finset.range (N + 1)) + (fun n => (cubeBesovPositiveVectorDepthSeminorm Q s u (j + n)) ^ 2) := by + refine Finset.sum_congr rfl ?_ + intro n hn + exact descendantsAverage_sq_cubeBesovPositiveVectorDepthSeminorm_eq_shifted + Q s u j n + _ = Finset.sum (Finset.Ico j (j + N + 1)) + (fun n => (cubeBesovPositiveVectorDepthSeminorm Q s u n) ^ 2) := by + simpa [Nat.add_assoc] using + (Finset.sum_Ico_eq_sum_range + (f := fun n => (cubeBesovPositiveVectorDepthSeminorm Q s u n) ^ 2) + (m := j) (n := j + N + 1)).symm + _ ≤ Finset.sum (Finset.range (j + N + 1)) + (fun n => (cubeBesovPositiveVectorDepthSeminorm Q s u n) ^ 2) := by + refine Finset.sum_le_sum_of_subset_of_nonneg ?_ ?_ + · intro n hn + exact Finset.mem_range.mpr (Finset.mem_Ico.mp hn).2 + · intro n hn hnot + exact sq_nonneg (cubeBesovPositiveVectorDepthSeminorm Q s u n) + _ = (cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u) ^ 2 := by + symm + exact sq_cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u + +theorem descendantsAverage_scaled_cubeBesovPositiveVectorPartialSeminormTwo_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j N : ℕ) : + (descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2)) ^ (1 / 2 : ℝ) ≤ + cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u := by + have hsq := + descendantsAverage_sq_scaled_cubeBesovPositiveVectorPartialSeminormTwo_le Q s u j N + have hleft_nonneg : + 0 ≤ descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hroot : + (descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2)) ^ (1 / 2 : ℝ) ≤ + ((cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u) ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft_nonneg hsq (by positivity) + have hright_nonneg : + 0 ≤ cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u := + cubeBesovPositiveVectorPartialSeminormTwo_nonneg Q s (j + N) u + calc + (descendantsAverage Q j + (fun R => (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + cubeBesovPositiveVectorPartialSeminormTwo R s N u) ^ 2)) ^ (1 / 2 : ℝ) + ≤ ((cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u) ^ 2) ^ (1 / 2 : ℝ) := hroot + _ = cubeBesovPositiveVectorPartialSeminormTwo Q s (j + N) u := by + exact sq_rpow_half_eq_of_nonneg hright_nonneg + +theorem cubeBesovPositiveVectorSeminormTwo_le_of_partialBound {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) {B : ℝ} + (hB : ∀ N : ℕ, cubeBesovPositiveVectorPartialSeminormTwo Q s N u ≤ B) : + cubeBesovPositiveVectorSeminormTwo Q s u ≤ B := by + unfold cubeBesovPositiveVectorSeminormTwo + refine csSup_le ?_ ?_ + · exact ⟨cubeBesovPositiveVectorPartialSeminormTwo Q s 0 u, ⟨0, rfl⟩⟩ + · rintro x ⟨N, rfl⟩ + exact hB N + +theorem cubeBesovPositiveVectorDepthSeminorm_le_of_exponent_le {d : ℕ} + (Q : TriadicCube d) {s t : ℝ} (u : Vec d → Vec d) (j : ℕ) + (hst : s ≤ t) : + cubeBesovPositiveVectorDepthSeminorm Q s u j ≤ + cubeBesovPositiveVectorDepthSeminorm Q t u j := by + unfold cubeBesovPositiveVectorDepthSeminorm + have hpow : + Real.rpow (3 : ℝ) (s * (j : ℝ)) ≤ + Real.rpow (3 : ℝ) (t * (j : ℝ)) := by + exact Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) + (mul_le_mul_of_nonneg_right hst (by positivity)) + exact mul_le_mul_of_nonneg_right hpow (Real.sqrt_nonneg _) + +theorem cubeBesovPositiveVectorPartialSeminormTwo_le_of_exponent_le {d : ℕ} + (Q : TriadicCube d) {s t : ℝ} (u : Vec d → Vec d) (N : ℕ) + (hst : s ≤ t) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N u ≤ + cubeBesovPositiveVectorPartialSeminormTwo Q t N u := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + refine Real.sqrt_le_sqrt ?_ + refine Finset.sum_le_sum ?_ + intro j _hj + exact pow_le_pow_left₀ + (cubeBesovPositiveVectorDepthSeminorm_nonneg Q s u j) + (cubeBesovPositiveVectorDepthSeminorm_le_of_exponent_le Q u j hst) + 2 + +theorem cubeBesovPositiveVectorSeminormTwo_le_of_exponent_le_of_bddAbove {d : ℕ} + (Q : TriadicCube d) {s t : ℝ} (u : Vec d → Vec d) + (hst : s ≤ t) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N u)) : + cubeBesovPositiveVectorSeminormTwo Q s u ≤ + cubeBesovPositiveVectorSeminormTwo Q t u := by + refine cubeBesovPositiveVectorSeminormTwo_le_of_partialBound Q s u ?_ + intro N + calc + cubeBesovPositiveVectorPartialSeminormTwo Q s N u + ≤ cubeBesovPositiveVectorPartialSeminormTwo Q t N u := + cubeBesovPositiveVectorPartialSeminormTwo_le_of_exponent_le Q u N hst + _ ≤ cubeBesovPositiveVectorSeminormTwo Q t u := by + unfold cubeBesovPositiveVectorSeminormTwo + exact le_csSup hBdd ⟨N, rfl⟩ + +theorem cubeBesovPositiveVectorPartialSeminormTwo_bddAbove_of_exponent_le {d : ℕ} + (Q : TriadicCube d) {s t : ℝ} (u : Vec d → Vec d) + (hst : s ≤ t) + (hBdd : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q t N u)) : + BddAbove (Set.range fun N : ℕ => + cubeBesovPositiveVectorPartialSeminormTwo Q s N u) := by + rcases hBdd with ⟨B, hB⟩ + refine ⟨B, ?_⟩ + rintro x ⟨N, rfl⟩ + exact + (cubeBesovPositiveVectorPartialSeminormTwo_le_of_exponent_le + Q u N hst).trans (hB ⟨N, rfl⟩) + +theorem cubeBesovPositiveVectorDepthAverage_sub_const {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (c : Vec d) (j : ℕ) + (hmem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveVectorDepthAverage Q (fun x => u x - c) j = + cubeBesovPositiveVectorDepthAverage Q u j := by + unfold cubeBesovPositiveVectorDepthAverage descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + congr 1 + apply cubeLpNorm_congr_on_cubeSet_generic R (2 : ℝ≥0∞) + intro x hx + simpa using congrFun (cubeFluctuationVec_sub_const R u c (hmem R hR)) x + +theorem cubeBesovPositiveVectorDepthSeminorm_sub_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (c : Vec d) (j : ℕ) + (hmem : ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveVectorDepthSeminorm Q s (fun x => u x - c) j = + cubeBesovPositiveVectorDepthSeminorm Q s u j := by + unfold cubeBesovPositiveVectorDepthSeminorm + rw [cubeBesovPositiveVectorDepthAverage_sub_const Q u c j hmem] + +theorem cubeBesovPositiveVectorPartialSeminormTwo_sub_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) (c : Vec d) + (hmem : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x - c) = + cubeBesovPositiveVectorPartialSeminormTwo Q s N u := by + unfold cubeBesovPositiveVectorPartialSeminormTwo + congr 1 + refine Finset.sum_congr rfl ?_ + intro j hj + rw [cubeBesovPositiveVectorDepthSeminorm_sub_const Q s u c j (hmem j hj)] + +theorem cubeBesovPositiveVectorSeminormTwo_sub_const {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (c : Vec d) + (hmem : ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeBesovPositiveVectorSeminormTwo Q s (fun x => u x - c) = + cubeBesovPositiveVectorSeminormTwo Q s u := by + unfold cubeBesovPositiveVectorSeminormTwo + have hrange : + Set.range (fun N : ℕ => cubeBesovPositiveVectorPartialSeminormTwo Q s N (fun x => u x - c)) = + Set.range (fun N : ℕ => cubeBesovPositiveVectorPartialSeminormTwo Q s N u) := by + ext x + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, (cubeBesovPositiveVectorPartialSeminormTwo_sub_const Q s N u c + (fun j _ R hR => hmem j R hR)).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, cubeBesovPositiveVectorPartialSeminormTwo_sub_const Q s N u c + (fun j _ R hR => hmem j R hR)⟩ + simp [hrange] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesQTwo.lean b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesQTwo.lean new file mode 100644 index 0000000000..d42f690afd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Deterministic/WeakNormInterfacesQTwo.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfaces +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Descendants +public import LeanPool.CoarseGraining.Homogenization.Deterministic.MultiscaleQuantitiesBasic.Foundation + +/-! # Weak Norm Interfaces QTwo -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +open scoped BigOperators + +/-! +# `q = 2` deterministic weak-norm recursion lemmas + +This file records the first note-facing scale-splitting identities for the +vector-valued negative Besov wrappers used in the deterministic Chapter-3 right- +hand-side argument. +-/ + +@[simp] theorem cubeBesovNegativeVectorDepthAverage_depth_zero {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) : + cubeBesovNegativeVectorDepthAverage Q u 0 = vecNormSq (cubeAverageVec Q u) := by + unfold cubeBesovNegativeVectorDepthAverage descendantsAverage + simp + +theorem sq_cubeBesovNegativeVectorDepthSeminorm {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j := by + have hA : 0 ≤ cubeBesovNegativeVectorDepthAverage Q u j := + cubeBesovNegativeVectorDepthAverage_nonneg Q u j + calc + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * (j : ℝ)) * + Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j)) ^ 2 := by + rfl + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (Real.sqrt (cubeBesovNegativeVectorDepthAverage Q u j)) ^ 2 := by + ring + _ = + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u j := by + rw [Real.sq_sqrt hA] + +/-- +Squared depth contribution controlled by a descendant-average upper bound. +This is the weighted `q = 2` analogue of the finite `q = 1` estimate in +`WeakNormInterfaces`. +-/ +theorem sq_cubeBesovNegativeVectorDepthSeminorm_le_of_depthAverage_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) {A : ℝ} + (hA : cubeBesovNegativeVectorDepthAverage Q u j ≤ A) : + (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2 ≤ + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * A := by + rw [sq_cubeBesovNegativeVectorDepthSeminorm] + exact mul_le_mul_of_nonneg_left hA (sq_nonneg _) + +/-- +Finite `q = 2` weak-norm control from depthwise descendant-average controls, +kept in squared form to match the Cauchy/energy estimates used in Section 5.3. +-/ +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_le_of_depthAverage_le {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) {A : ℕ → ℝ} + (hA : ∀ j ∈ Finset.range (N + 1), + cubeBesovNegativeVectorDepthAverage Q u j ≤ A j) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * A j := by + rw [sq_cubeBesovNegativeVectorPartialSeminormTwo] + refine Finset.sum_le_sum ?_ + intro j hj + exact sq_cubeBesovNegativeVectorDepthSeminorm_le_of_depthAverage_le Q s u j (hA j hj) + +/-- +Squared finite `q = 2` negative weak-norm bound from a four-term decomposition +of the descendant cube averages at every depth. +-/ +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_le_of_four_term_depthAverage_decomposition + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) + (predictor additivity lowScale tail : ℕ → TriadicCube d → Vec d) + (hdecomp : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeAverageVec R u = + predictor j R + additivity j R + lowScale j R + tail j R) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s N u) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + (descendantsAverage Q j fun R => + 4 * + (vecNormSq (predictor j R) + vecNormSq (additivity j R) + + vecNormSq (lowScale j R) + vecNormSq (tail j R))) := by + refine sq_cubeBesovNegativeVectorPartialSeminormTwo_le_of_depthAverage_le Q s N u ?_ + intro j hj + exact + cubeBesovNegativeVectorDepthAverage_le_four_mul_sum_of_cubeAverageVec_eq + Q u j (predictor j) (additivity j) (lowScale j) (tail j) + (hdecomp j hj) + +@[simp] theorem sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) : + (cubeBesovNegativeVectorDepthSeminorm Q s u 0) ^ 2 = + vecNormSq (cubeAverageVec Q u) := by + rw [sq_cubeBesovNegativeVectorDepthSeminorm, cubeBesovNegativeVectorDepthAverage_depth_zero] + simp + +theorem cubeBesovNegativeVectorDepthAverage_succ_eq_descendantsAverage {d : ℕ} + (Q : TriadicCube d) (u : Vec d → Vec d) (j : ℕ) : + cubeBesovNegativeVectorDepthAverage Q u (j + 1) = + descendantsAverage Q 1 + (fun R => cubeBesovNegativeVectorDepthAverage R u j) := by + simpa [Nat.add_comm, cubeBesovNegativeVectorDepthAverage] using + (descendantsAverage_add_eq_descendantsAverage_descendantsAverage + (Q := Q) (j := 1) (n := j) + (F := fun R => vecNormSq (cubeAverageVec R u))) + +theorem sq_cubeBesovNegativeVectorDepthSeminorm_succ_eq_discount_mul_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) (j : ℕ) : + (cubeBesovNegativeVectorDepthSeminorm Q s u (j + 1)) ^ 2 = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2) := by + calc + (cubeBesovNegativeVectorDepthSeminorm Q s u (j + 1)) ^ 2 + = + (Real.rpow (3 : ℝ) (-s * ((j + 1 : ℕ) : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage Q u (j + 1) := by + exact sq_cubeBesovNegativeVectorDepthSeminorm Q s u (j + 1) + _ = + (Real.rpow (3 : ℝ) (-s)) ^ 2 * + ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + descendantsAverage Q 1 + (fun R => cubeBesovNegativeVectorDepthAverage R u j)) := by + rw [rpow_neg_mul_nat_succ_eq, + cubeBesovNegativeVectorDepthAverage_succ_eq_descendantsAverage] + ring + _ = + (Real.rpow (3 : ℝ) (-s)) ^ 2 * + descendantsAverage Q 1 + (fun R => + (Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2 * + cubeBesovNegativeVectorDepthAverage R u j) := by + rw [← descendantsAverage_mul_left Q 1 + ((Real.rpow (3 : ℝ) (-s * (j : ℝ))) ^ 2) + (fun R => cubeBesovNegativeVectorDepthAverage R u j)] + _ = + (Real.rpow (3 : ℝ) (-s)) ^ 2 * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2) := by + congr 1 + refine congrArg (descendantsAverage Q 1) ?_ + funext R + symm + exact sq_cubeBesovNegativeVectorDepthSeminorm R s u j + _ = + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2) := by + congr 1 + calc + (Real.rpow (3 : ℝ) (-s)) ^ 2 + = Real.rpow (3 : ℝ) ((-s : ℝ) * 2) := by + simpa [Real.rpow_natCast] using + (Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ)) (-s) (2 : ℝ)).symm + _ = Real.rpow (3 : ℝ) (-2 * s) := by ring_nf + +theorem sq_cubeBesovNegativeVectorPartialSeminormTwo_succ_eq_top_add_descendantsAverage + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (u : Vec d → Vec d) : + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 = + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + have hsplit : + Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) = + vecNormSq (cubeAverageVec Q u) + + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u (j + 1)) ^ 2) := by + convert + (Finset.sum_range_succ' + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) + (N + 1)) using 1 + · simp [add_comm, sq_cubeBesovNegativeVectorDepthSeminorm_depth_zero] + calc + (cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u) ^ 2 + = Finset.sum (Finset.range (N + 2)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u j) ^ 2) := by + exact sq_cubeBesovNegativeVectorPartialSeminormTwo Q s (N + 1) u + _ = + vecNormSq (cubeAverageVec Q u) + + Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm Q s u (j + 1)) ^ 2) := by + exact hsplit + _ = + vecNormSq (cubeAverageVec Q u) + + Finset.sum (Finset.range (N + 1)) + (fun j => + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2)) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro j hj + exact sq_cubeBesovNegativeVectorDepthSeminorm_succ_eq_discount_mul_descendantsAverage + Q s u j + _ = + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * + Finset.sum (Finset.range (N + 1)) + (fun j => + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2)) := by + rw [← Finset.mul_sum] + _ = + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => Finset.sum (Finset.range (N + 1)) + (fun j => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2)) := by + simpa using + congrArg + (fun x => + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * x) + (descendantsAverage_sum Q 1 (Finset.range (N + 1)) + (fun R j => (cubeBesovNegativeVectorDepthSeminorm R s u j) ^ 2)).symm + _ = + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * + descendantsAverage Q 1 + (fun R => (cubeBesovNegativeVectorPartialSeminormTwo R s N u) ^ 2) := by + simpa using + congrArg + (fun x => + vecNormSq (cubeAverageVec Q u) + + Real.rpow (3 : ℝ) (-2 * s) * x) + (congrArg (descendantsAverage Q 1) <| + funext fun R => + (sq_cubeBesovNegativeVectorPartialSeminormTwo R s N u).symm) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples.lean b/LeanPool/CoarseGraining/Homogenization/Examples.lean new file mode 100644 index 0000000000..37272deba4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic.lean new file mode 100644 index 0000000000..1c7f0b6caf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.DiracBridge +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.MField +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicConcreteComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicGeneralComparison +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicSmoothComparison + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/DiracBridge.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/DiracBridge.lean new file mode 100644 index 0000000000..6c0e99136a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/DiracBridge.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.Duality +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSupport + +/-! +# Dirac-law bridge for deterministic periodic examples + +**Shared foundation.** Builds the periodic stochastic `Setup` from a deterministic +coefficient field (`periodicSetup`), the engine consumed by all three periodic +comparators (`PeriodicGeneralComparison`, `PeriodicConcreteComparison`, +`PeriodicSmoothComparison`). See `Audit/README.md` for the comparator map. + +Following the carrier redesign, the deterministic field is carried as an honest +`RegCoeffField d` (a constant/periodic smooth field is trivially entrywise +measurable and locally integrable), and the law is the Dirac point mass on the +carrier. The pushforward invariance fields of the stochastic setup reduce to +pointwise invariance of the deterministic coefficient field through the carrier +endomorphisms (`Measure.map_dirac'`); unit-range dependence is formal because +`RestrictionSigmaR` events are *genuinely* measurable on the carrier; and the +uniform-ellipticity support event is the genuinely measurable fixed-constant +event of `RegCoeffField/EllipticSupport.lean`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace Periodic + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The deterministic law concentrated at a carrier coefficient field. -/ +abbrev diracCoeffLaw {d : ℕ} (a₀ : RegCoeffField d) : Book.Ch04.RestrictionCoeffLaw d := + Measure.dirac a₀ + +/-- Integer-periodicity of a deterministic coefficient field. -/ +def IsPeriodicCoeffField {d : ℕ} (a₀ : CoeffField d) : Prop := + ∀ z : Fin d → ℤ, translateByInt z a₀ = a₀ + +/-- Signed-permutation invariance of a deterministic coefficient field. -/ +def IsIsotropicCoeffField {d : ℕ} (a₀ : CoeffField d) : Prop := + ∀ R : Mat d, IsSignedPermutationMatrix R → rotateCoeffField R a₀ = a₀ + +/-- Adjoint invariance of a deterministic coefficient field. -/ +def IsAdjointInvariantCoeffField {d : ℕ} (a₀ : CoeffField d) : Prop := + adjointCoeffField a₀ = a₀ + +/-- Pointwise periodicity lifts to the carrier translation endomorphism. -/ +theorem translateReg_eq_self_of_periodic {d : ℕ} {a₀ : RegCoeffField d} + (hper : IsPeriodicCoeffField a₀.toFun) (z : Fin d → ℤ) : + translateReg (intVecToRealVec z) a₀ = a₀ := by + apply RegCoeffField.ext + intro x + have h := congrFun (hper z) x + simpa [translateByInt, translateCoeffField, intVecToRealVec] using! h + +/-- Pointwise signed-permutation invariance lifts to the carrier rotation +endomorphism. -/ +theorem rotateReg_eq_self_of_isotropic {d : ℕ} {a₀ : RegCoeffField d} + (hiso : IsIsotropicCoeffField a₀.toFun) {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + rotateReg R hR a₀ = a₀ := by + apply RegCoeffField.ext + intro x + have h := congrFun (hiso R hR) x + simpa [rotateCoeffField] using h + +/-- Pointwise adjoint invariance lifts to the carrier adjoint endomorphism. -/ +theorem adjointReg_eq_self_of_adjointInvariant {d : ℕ} {a₀ : RegCoeffField d} + (hadj : IsAdjointInvariantCoeffField a₀.toFun) : + adjointReg a₀ = a₀ := by + apply RegCoeffField.ext + intro x + have h := congrFun hadj x + simpa [adjointCoeffField, matTranspose] using h + +/-- Pointwise periodicity gives stationarity of the Dirac law. -/ +theorem dirac_stationary {d : ℕ} {a₀ : RegCoeffField d} + (hper : IsPeriodicCoeffField a₀.toFun) : + Book.Ch04.RestrictionStationaryLaw (diracCoeffLaw a₀) := by + intro z + rw [diracCoeffLaw, Measure.map_dirac' (measurable_translateReg (intVecToRealVec z)), + translateReg_eq_self_of_periodic hper z] + +/-- Pointwise signed-permutation invariance gives isotropy of the Dirac law. -/ +theorem dirac_isotropic {d : ℕ} {a₀ : RegCoeffField d} + (hiso : IsIsotropicCoeffField a₀.toFun) : + Book.Ch04.RestrictionIsotropicLaw (diracCoeffLaw a₀) := by + intro R hR + rw [diracCoeffLaw, Measure.map_dirac' (measurable_rotateReg R hR), + rotateReg_eq_self_of_isotropic hiso hR] + +/-- Pointwise adjoint invariance gives adjoint invariance of the Dirac law. -/ +theorem dirac_adjointInvariant {d : ℕ} {a₀ : RegCoeffField d} + (hadj : IsAdjointInvariantCoeffField a₀.toFun) : + Book.Ch04.RestrictionAdjointInvariantLaw (diracCoeffLaw a₀) := by + show Measure.map adjointReg (Measure.dirac a₀) = Measure.dirac a₀ + rw [Measure.map_dirac' measurable_adjointReg, + adjointReg_eq_self_of_adjointInvariant hadj] + +/-- **Restriction-unit-range dependence of a deterministic Dirac law is +automatic**, and on the carrier it is *genuine*: `RestrictionSigmaR` events are +genuinely measurable, so the Dirac law evaluates them by membership. -/ +theorem dirac_restrictionUnitRangeDependent {d : ℕ} (a₀ : RegCoeffField d) : + Book.Ch04.RestrictionUnitRangeDependentLaw (diracCoeffLaw a₀) := by + intro U V hU hV _hsep + rw [ProbabilityTheory.Indep_iff] + intro s t hs ht + have hs' : MeasurableSet s := restrictionSigmaR_le U hU s hs + have ht' : MeasurableSet t := restrictionSigmaR_le V hV t ht + rw [Measure.dirac_apply' _ (hs'.inter ht'), Measure.dirac_apply' _ hs', + Measure.dirac_apply' _ ht'] + by_cases hsa : a₀ ∈ s <;> by_cases hta : a₀ ∈ t <;> + simp [hsa, hta] + +/-- Uniform ellipticity for the deterministic field gives the law-level uniform +ellipticity statement for the Dirac law, through the genuinely measurable +fixed-constant support event. -/ +theorem dirac_uniformEllipticityBounds {d : ℕ} + {a₀ : RegCoeffField d} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) + (hell : ∀ Q : TriadicCube d, + Book.Ch04.AEEllipticOn lam Lam (openCubeSet Q) a₀) : + Book.MainResults.UniformEllipticityBounds (diracCoeffLaw a₀) lam Lam where + lam_pos := hlam + lam_le_Lam := hle + aee_elliptic := by + refine (MeasureTheory.ae_dirac_iff ?_).2 hell + exact measurableSet_forall_openCubeSet_isAEEllipticFieldOn lam Lam + +/-- The law-carrier part of the Dirac bridge follows from law-level uniform +ellipticity support. -/ +theorem dirac_lawCarrier {d : ℕ} {a₀ : RegCoeffField d} {lam Lam : ℝ} + (hUE : Book.MainResults.UniformEllipticityBounds (diracCoeffLaw a₀) lam Lam) : + Book.Ch04.RestrictionLawCarrier (diracCoeffLaw a₀) := + Book.Ch04.lawCarrier_of_aeLocallyUniformlyElliptic + hUE.toAELocallyUniformlyEllipticLaw + +/-- +The structural-law part of the Dirac bridge. Stationarity, isotropy, and +adjoint invariance reduce to pointwise deterministic invariance, while +restriction-unit-range dependence is automatic for a Dirac law. +-/ +theorem dirac_structuralLaw {d : ℕ} {a₀ : RegCoeffField d} + (hper : IsPeriodicCoeffField a₀.toFun) + (hiso : IsIsotropicCoeffField a₀.toFun) + (hadj : IsAdjointInvariantCoeffField a₀.toFun) : + Book.Ch04.RestrictionStructuralLaw (diracCoeffLaw a₀) where + stationary := dirac_stationary hper + unit_range := dirac_restrictionUnitRangeDependent a₀ + isotropic := dirac_isotropic hiso + adjoint_invariant := dirac_adjointInvariant hadj + +/-- Assemble a `MainResults.Setup` from a deterministic carrier field. -/ +def dirac_setup {d : ℕ} [NeZero d] + (two_le_dim : 2 ≤ d) (a₀ : RegCoeffField d) (lam Lam : ℝ) + (hper : IsPeriodicCoeffField a₀.toFun) + (hiso : IsIsotropicCoeffField a₀.toFun) + (hadj : IsAdjointInvariantCoeffField a₀.toFun) + (hlam : 0 < lam) (hle : lam ≤ Lam) + (hell : ∀ Q : TriadicCube d, + Book.Ch04.AEEllipticOn lam Lam (openCubeSet Q) a₀) : + Book.MainResults.Setup d where + two_le_dim := two_le_dim + P := diracCoeffLaw a₀ + hP := dirac_lawCarrier + (dirac_uniformEllipticityBounds (a₀ := a₀) hlam hle hell) + hStruct := dirac_structuralLaw hper hiso hadj + lam := lam + Lam := Lam + hUE := dirac_uniformEllipticityBounds (a₀ := a₀) hlam hle hell + +/-- Public periodic deterministic setup constructor. -/ +def periodicSetup {d : ℕ} [NeZero d] + (two_le_dim : 2 ≤ d) (a₀ : RegCoeffField d) (lam Lam : ℝ) + (hper : IsPeriodicCoeffField a₀.toFun) + (hiso : IsIsotropicCoeffField a₀.toFun) + (hadj : IsAdjointInvariantCoeffField a₀.toFun) + (hlam : 0 < lam) (hle : lam ≤ Lam) + (hell : ∀ Q : TriadicCube d, + Book.Ch04.AEEllipticOn lam Lam (openCubeSet Q) a₀) : + Book.MainResults.Setup d := + dirac_setup two_le_dim a₀ lam Lam hper hiso hadj hlam hle hell + +/-! ## A concrete constant scalar periodic witness -/ + +/-- The constant scalar coefficient field `x ↦ σ I` (raw sample). -/ +abbrev constantScalarCoeffField {d : ℕ} (σ : ℝ) : CoeffField d := + constantCoeffField (scalarMatrix (d := d) σ) + +/-- The constant scalar coefficient field as a carrier element. -/ +abbrev constantScalarRegField {d : ℕ} (σ : ℝ) : RegCoeffField d := + RegCoeffField.constRegCoeffField (scalarMatrix (d := d) σ) + +@[simp] theorem constantScalarRegField_toFun {d : ℕ} (σ : ℝ) : + (constantScalarRegField (d := d) σ).toFun = constantScalarCoeffField σ := rfl + +/-- Constant scalar fields are integer-periodic. -/ +theorem constantScalarCoeffField_periodic {d : ℕ} (σ : ℝ) : + IsPeriodicCoeffField (constantScalarCoeffField (d := d) σ) := by + intro z + ext x i j + simp [constantScalarCoeffField, constantCoeffField, translateByInt, translateCoeffField] + +/-- Rotating a constant scalar field by a signed permutation leaves it unchanged. -/ +theorem constantScalarCoeffField_isotropic {d : ℕ} (σ : ℝ) : + IsIsotropicCoeffField (constantScalarCoeffField (d := d) σ) := by + intro R hR + ext x i j + simp [constantScalarCoeffField, constantCoeffField, rotateCoeffField, scalarMatrix, + hR.transpose_mul_self] + +/-- Constant scalar fields are adjoint-invariant. -/ +theorem constantScalarCoeffField_adjointInvariant {d : ℕ} (σ : ℝ) : + IsAdjointInvariantCoeffField (constantScalarCoeffField (d := d) σ) := by + ext x i j + by_cases hij : i = j + · subst j + simp [constantScalarCoeffField, constantCoeffField, adjointCoeffField, + matTranspose, scalarMatrix] + · have hji : j ≠ i := Ne.symm hij + simp [constantScalarCoeffField, constantCoeffField, adjointCoeffField, + matTranspose, scalarMatrix, hij, hji] + +/-- A positive constant scalar field is a.e. elliptic on every measurable set. -/ +theorem constantScalarRegField_aeeEllipticOn {d : ℕ} {U : Set (Vec d)} {σ : ℝ} + (hU : MeasurableSet U) (hσ : 0 < σ) : + Book.Ch04.AEEllipticOn σ σ U (constantScalarRegField (d := d) σ) := by + exact IsAEEllipticFieldOn.of_isEllipticFieldOn + (isEllipticFieldOn_constantCoeffField hU (isEllipticMatrix_scalarMatrix hσ)) + +/-- +Concrete non-vacuity witness for the public main-theorem setup: the Dirac law +concentrated on the constant scalar coefficient field `x ↦ σ I`. +-/ +def constantScalarPeriodicSetup {d : ℕ} [NeZero d] + (two_le_dim : 2 ≤ d) {σ : ℝ} (hσ : 0 < σ) : + Book.MainResults.Setup d := + periodicSetup two_le_dim (constantScalarRegField (d := d) σ) σ σ + (constantScalarCoeffField_periodic σ) + (constantScalarCoeffField_isotropic σ) + (constantScalarCoeffField_adjointInvariant σ) + hσ le_rfl + (fun Q => constantScalarRegField_aeeEllipticOn (measurableSet_openCubeSet Q) hσ) + +end + +end Periodic +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/MField.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/MField.lean new file mode 100644 index 0000000000..e872322fd3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/MField.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicGeneralComparison +public import Mathlib.Analysis.SpecialFunctions.Trigonometric.Basic + +/-! +# A concrete periodic scalar coefficient field + +This file defines the deterministic periodic coefficient field +`a(x) = m(x) I`, where `m(x) = d + 2 + sum_i cos (2 pi x_i)`, and proves it is +periodic, isotropic, adjoint-invariant, and uniformly elliptic (`λ = 2`, +`Λ = 2d + 2`). These structural facts are *consumed by* +`PeriodicConcreteComparison` (and, through it, `PeriodicSmoothComparison`) to +instantiate the periodic comparison corollary. +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace Periodic + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The scalar multiplier `m(x) = d + 2 + sum_i cos (2 pi x_i)`. -/ +noncomputable def mField {d : ℕ} (x : Vec d) : ℝ := + ((d : ℝ) + 2) + ∑ i : Fin d, Real.cos (2 * Real.pi * x i) + +/-- The coefficient field `a(x) = m(x) I`. -/ +noncomputable def mFieldCoeff {d : ℕ} : CoeffField d := + fun x => scalarMatrix (d := d) (mField x) + +theorem measurable_mField {d : ℕ} : + Measurable (mField (d := d)) := by + unfold mField + fun_prop + +theorem mField_sum_cos_le {d : ℕ} (x : Vec d) : + (∑ i : Fin d, Real.cos (2 * Real.pi * x i)) ≤ (d : ℝ) := by + calc + (∑ i : Fin d, Real.cos (2 * Real.pi * x i)) + ≤ ∑ _i : Fin d, (1 : ℝ) := by + exact Finset.sum_le_sum fun i _hi => Real.cos_le_one _ + _ = (d : ℝ) := by simp + +theorem neg_card_le_mField_sum_cos {d : ℕ} (x : Vec d) : + -((d : ℝ)) ≤ ∑ i : Fin d, Real.cos (2 * Real.pi * x i) := by + calc + -((d : ℝ)) = ∑ _i : Fin d, (-1 : ℝ) := by simp + _ ≤ ∑ i : Fin d, Real.cos (2 * Real.pi * x i) := by + exact Finset.sum_le_sum fun i _hi => Real.neg_one_le_cos _ + +theorem two_le_mField {d : ℕ} (x : Vec d) : + (2 : ℝ) ≤ mField x := by + have hsum := neg_card_le_mField_sum_cos (d := d) x + dsimp [mField] + nlinarith + +theorem mField_le_two_mul_dim_add_two {d : ℕ} (x : Vec d) : + mField x ≤ 2 * (d : ℝ) + 2 := by + have hsum := mField_sum_cos_le (d := d) x + dsimp [mField] + nlinarith + +theorem abs_mField_le {d : ℕ} (x : Vec d) : + |mField x| ≤ 2 * (d : ℝ) + 2 := by + have hlo := two_le_mField (d := d) x + have hhi := mField_le_two_mul_dim_add_two (d := d) x + have hd0 : (0 : ℝ) ≤ (d : ℝ) := by positivity + rw [abs_le] + constructor <;> nlinarith + +/-- The explicit periodic field `a(x) = m(x) I` as a carrier element: each entry +is measurable (a cosine sum) and bounded, hence locally integrable. -/ +noncomputable def mFieldReg {d : ℕ} : RegCoeffField d where + toFun := mFieldCoeff + entry_measurable := fun i j => by + by_cases hij : i = j + · subst j + simpa [mFieldCoeff, scalarMatrix] using measurable_mField (d := d) + · simp [mFieldCoeff, scalarMatrix, hij] + entry_locInt := fun i j => by + by_cases hij : i = j + · subst j + have hmeas : Measurable (fun x : Vec d => mFieldCoeff (d := d) x i i) := by + simpa [mFieldCoeff, scalarMatrix] using measurable_mField (d := d) + refine RegCoeffField.locallyIntegrable_of_bounded_measurable hmeas + (C := 2 * (d : ℝ) + 2) fun x => ?_ + simpa [mFieldCoeff, scalarMatrix] using abs_mField_le (d := d) x + · have hzero : (fun x : Vec d => mFieldCoeff (d := d) x i j) + = fun _ : Vec d => (0 : ℝ) := by + funext x + simp [mFieldCoeff, scalarMatrix, hij] + rw [hzero] + exact MeasureTheory.locallyIntegrable_const (0 : ℝ) + +@[simp] theorem mFieldReg_toFun {d : ℕ} : + (mFieldReg (d := d)).toFun = mFieldCoeff := rfl + +theorem isEllipticMatrix_scalarMatrix_of_bounds {d : ℕ} {lam Lam sigma : ℝ} + (hlam : 0 < lam) (hlo : lam ≤ sigma) (hhi : sigma ≤ Lam) : + IsEllipticMatrix lam Lam (scalarMatrix (d := d) sigma) := by + exact (isEllipticMatrix_scalarMatrix (lt_of_lt_of_le hlam hlo)).mono hlam hlo hhi + +theorem mFieldCoeff_isEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + IsEllipticFieldOn (2 : ℝ) (2 * (d : ℝ) + 2) U (mFieldCoeff (d := d)) := by + classical + refine ⟨?_, ?_⟩ + · refine (measurable_pi_iff).2 ?_ + intro i + refine (measurable_pi_iff).2 ?_ + intro j + have hentry : Measurable fun x : Vec d => mFieldCoeff (d := d) x i j := by + by_cases hij : i = j + · subst j + simpa [mFieldCoeff, scalarMatrix] using measurable_mField (d := d) + · have hzero : + (fun x : Vec d => mFieldCoeff (d := d) x i j) = fun _x => (0 : ℝ) := by + funext x + simp [mFieldCoeff, scalarMatrix, hij] + rw [hzero] + exact measurable_const + have hpiece : + Measurable + (U.piecewise (fun x : Vec d => mFieldCoeff (d := d) x i j) (fun _ => 0)) := + hentry.piecewise hU measurable_const + have hEq : + (U.piecewise (fun x : Vec d => mFieldCoeff (d := d) x i j) (fun _ => 0)) = + (fun x : Vec d => if x ∈ U then mFieldCoeff (d := d) x i j else 0) := by + funext x + by_cases hx : x ∈ U <;> simp [Set.piecewise, hx] + simpa [hEq] using hpiece + · intro x _hx + exact isEllipticMatrix_scalarMatrix_of_bounds + (d := d) (lam := 2) (Lam := 2 * (d : ℝ) + 2) + (sigma := mField x) (by norm_num) + (two_le_mField (d := d) x) + (mField_le_two_mul_dim_add_two (d := d) x) + +theorem mFieldReg_aeeEllipticOn {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) : + Book.Ch04.AEEllipticOn (2 : ℝ) (2 * (d : ℝ) + 2) U (mFieldReg (d := d)) := by + exact IsAEEllipticFieldOn.of_isEllipticFieldOn (mFieldCoeff_isEllipticFieldOn hU) + +theorem mField_translate_int {d : ℕ} (z : Fin d → ℤ) (x : Vec d) : + mField (fun i => x i + (z i : ℝ)) = mField x := by + unfold mField + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + have harg : + 2 * Real.pi * (x i + (z i : ℝ)) = + 2 * Real.pi * x i + (z i : ℝ) * (2 * Real.pi) := by + ring + rw [harg, Real.cos_add_int_mul_two_pi] + +theorem mFieldCoeff_periodic {d : ℕ} : + IsPeriodicCoeffField (mFieldCoeff (d := d)) := by + intro z + ext x i j + simp [mFieldCoeff, translateByInt, translateCoeffField, intVecToRealVec, + mField_translate_int] + +private theorem matVecMul_signedPermutation_apply {d : ℕ} {R : Mat d} + {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (hRdef : ∀ i j, R i j = if i = σ j then s j else 0) + (x : Vec d) (i : Fin d) : + matVecMul R x i = s (σ.symm i) * x (σ.symm i) := by + rw [matVecMul, Finset.sum_eq_single (σ.symm i)] + · rw [hRdef i (σ.symm i)] + simp + · intro j _hj hj + rw [hRdef i j] + have hij : i ≠ σ j := by + intro h + apply hj + have hsymm : σ.symm i = j := by + rw [h] + simp + exact hsymm.symm + simp [hij] + · intro hnot + exact (hnot (Finset.mem_univ _)).elim + +theorem mField_signedPermutation {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) (x : Vec d) : + mField (matVecMul R x) = mField x := by + classical + rcases hR with ⟨σ, s, hs, hRdef⟩ + unfold mField + congr 1 + calc + (∑ i : Fin d, Real.cos (2 * Real.pi * matVecMul R x i)) + = ∑ i : Fin d, Real.cos (2 * Real.pi * (s (σ.symm i) * x (σ.symm i))) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [matVecMul_signedPermutation_apply (hRdef := hRdef)] + _ = ∑ i : Fin d, Real.cos (2 * Real.pi * x (σ.symm i)) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rcases hs (σ.symm i) with hsign | hsign + · simp [hsign] + · rw [hsign] + have harg : + 2 * Real.pi * ((-1 : ℝ) * x (σ.symm i)) = + -(2 * Real.pi * x (σ.symm i)) := by + ring + rw [harg, Real.cos_neg] + _ = ∑ i : Fin d, Real.cos (2 * Real.pi * x i) := by + simpa using (Equiv.sum_comp σ.symm + (fun i : Fin d => Real.cos (2 * Real.pi * x i))) + +theorem mFieldCoeff_isotropic {d : ℕ} : + IsIsotropicCoeffField (mFieldCoeff (d := d)) := by + intro R hR + ext x i j + have hm : mField (matVecMul R x) = mField x := + mField_signedPermutation hR x + simp [mFieldCoeff, rotateCoeffField, scalarMatrix, hm, hR.transpose_mul_self] + +theorem mFieldCoeff_adjointInvariant {d : ℕ} : + IsAdjointInvariantCoeffField (mFieldCoeff (d := d)) := by + ext x i j + by_cases hij : i = j + · subst j + simp [mFieldCoeff, adjointCoeffField, matTranspose, scalarMatrix] + · have hji : j ≠ i := Ne.symm hij + simp [mFieldCoeff, adjointCoeffField, matTranspose, scalarMatrix, hij, hji] + +end + +end Periodic +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicConcreteComparison.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicConcreteComparison.lean new file mode 100644 index 0000000000..d5f0a70db7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicConcreteComparison.lean @@ -0,0 +1,85 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.MField + +/-! +# Concrete periodic comparison corollary + +**Proves.** `periodicConcrete_comparison` — the periodic comparison estimate for +the *explicit* scalar field `a(x) = m(x) • I`, where +`m(x) = d + 2 + ∑ i, cos (2 * π * x i)` (defined and shown periodic, isotropic, +adjoint-invariant, and uniformly elliptic with `λ = 2`, `Λ = 2d + 2` in `MField`). +It instantiates `periodicGeneral_comparison` at this field. + +**Comparator.** `Audit/PeriodicConcrete` checks a Mathlib-only restatement of this +theorem against the proof below. See `Audit/README.md` for the comparator map. + +**Progression.** abstract theorem (`Audit/QuenchedComparison`) → general periodic +(`PeriodicGeneralComparison`, `Audit/PeriodicGeneral`) → *explicit field (this +file)* → classical data (`PeriodicSmoothComparison`, `Audit/PeriodicSmooth`). +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace Periodic + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- +Fixed-exponent quenched homogenization comparison for the explicit periodic +coefficient field `mFieldCoeff`. The constants are chosen before the dimension +data and before the deterministic Dirac setup. +-/ +theorem periodicConcrete_comparison {d : ℕ} [NeZero d] : + ∃ C alpha Cscale : ℝ, + 0 < C ∧ 0 < alpha ∧ 0 < Cscale ∧ + ∀ (two_le_dim : 2 ≤ d), + let Lam : ℝ := 2 * (d : ℝ) + 2 + let S : Book.MainResults.Setup d := + periodicSetup two_le_dim (mFieldReg (d := d)) 2 Lam + mFieldCoeff_periodic mFieldCoeff_isotropic mFieldCoeff_adjointInvariant + (by norm_num) + (by + nlinarith [show 0 ≤ (d : ℝ) by exact_mod_cast Nat.zero_le d]) + (fun Q => mFieldReg_aeeEllipticOn (measurableSet_openCubeSet Q)) + ∃ sigmaBar : ℝ, + 0 < sigmaBar ∧ + ∃ X : RegCoeffField d → ℝ, + S.IsMinimalScale X Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (ha : Book.Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Book.Ch03.Legacy.ForceSobolevRegularity + (Book.MainResults.originCube d m) Book.MainResults.fixedComparisonS g → + S.comparisonDefect Book.MainResults.fixedComparisonS pair ≤ + C * ((3 : ℝ) ^ m / X aω) ^ (-alpha) * + S.comparisonData Book.MainResults.fixedComparisonS pair := by + obtain ⟨C, alpha, Cscale, hC, halpha, hCscale, hmain⟩ := + periodicGeneral_comparison (d := d) + refine ⟨C, alpha, Cscale, hC, halpha, hCscale, ?_⟩ + intro two_le_dim + exact hmain two_le_dim (mFieldReg (d := d)) 2 (2 * (d : ℝ) + 2) + mFieldCoeff_periodic mFieldCoeff_isotropic mFieldCoeff_adjointInvariant + (by norm_num) + (by + nlinarith [show 0 ≤ (d : ℝ) by exact_mod_cast Nat.zero_le d]) + (fun Q => mFieldReg_aeeEllipticOn (measurableSet_openCubeSet Q)) + +end + +end Periodic +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicGeneralComparison.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicGeneralComparison.lean new file mode 100644 index 0000000000..e88edba959 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicGeneralComparison.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.DiracBridge + +/-! +# Periodic deterministic comparison corollary + +**Proves.** `periodicGeneral_comparison` — the public uniformly elliptic quenched +comparison estimate, specialized to the Dirac law concentrated at an *arbitrary* +periodic, isotropic, adjoint-invariant, uniformly elliptic deterministic +coefficient field, via the `periodicSetup` constructor in `DiracBridge`. + +**Comparator.** `Audit/PeriodicGeneral` checks a Mathlib-only restatement of this +theorem against the proof below. See `Audit/README.md` for the comparator map. + +**Progression.** abstract theorem (`Audit/QuenchedComparison`) → *general periodic +(this file)* → explicit field (`PeriodicConcreteComparison`, `Audit/PeriodicConcrete`) +→ classical data (`PeriodicSmoothComparison`, `Audit/PeriodicSmooth`). +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace Periodic + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- +Fixed-exponent quenched homogenization comparison for a deterministic periodic +coefficient field. The constants are chosen before the periodic field and its +ellipticity bounds; the stochastic setup is the Dirac law produced by +`periodicSetup`. +-/ +theorem periodicGeneral_comparison {d : ℕ} [NeZero d] : + ∃ C alpha Cscale : ℝ, + 0 < C ∧ 0 < alpha ∧ 0 < Cscale ∧ + ∀ (two_le_dim : 2 ≤ d) (a₀ : RegCoeffField d) (lam Lam : ℝ) + (hper : IsPeriodicCoeffField a₀.toFun) + (hiso : IsIsotropicCoeffField a₀.toFun) + (hadj : IsAdjointInvariantCoeffField a₀.toFun) + (hlam : 0 < lam) (hle : lam ≤ Lam) + (hell : ∀ Q : TriadicCube d, + Book.Ch04.AEEllipticOn lam Lam (openCubeSet Q) a₀), + let S : Book.MainResults.Setup d := + periodicSetup two_le_dim a₀ lam Lam hper hiso hadj hlam hle hell + ∃ sigmaBar : ℝ, + 0 < sigmaBar ∧ + ∃ X : RegCoeffField d → ℝ, + S.IsMinimalScale X Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (ha : Book.Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Book.Ch03.Legacy.ForceSobolevRegularity + (Book.MainResults.originCube d m) Book.MainResults.fixedComparisonS g → + S.comparisonDefect Book.MainResults.fixedComparisonS pair ≤ + C * ((3 : ℝ) ^ m / X aω) ^ (-alpha) * + S.comparisonData Book.MainResults.fixedComparisonS pair := by + obtain ⟨C, alpha, Cscale, hC, halpha, hCscale, hmain⟩ := + Book.MainResults.homogenizationComparison_uniformEllipticity (d := d) + refine ⟨C, alpha, Cscale, hC, halpha, hCscale, ?_⟩ + intro two_le_dim a₀ lam Lam hper hiso hadj hlam hle hell + let S : Book.MainResults.Setup d := + periodicSetup two_le_dim a₀ lam Lam hper hiso hadj hlam hle hell + exact hmain S + +end + +end Periodic +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicSmoothComparison.lean b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicSmoothComparison.lean new file mode 100644 index 0000000000..eb5d307703 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/Periodic/PeriodicSmoothComparison.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.Periodic.PeriodicConcreteComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.FaceVanishCollar +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 + +/-! +# Classical flux periodic comparison corollary + +**Proves.** `periodicSmooth_comparison` — the periodic comparison estimate stated +entirely in *classical* terms over the explicit field `a(x) = m(x) • I`. The +solutions `u`, `v` are smooth (`ContDiff ℝ ⊤`) scalar fields solving the +divergence-form equations `∇·(a∇u) = ∇·g` and `∇·(ā∇v) = ∇·g` pointwise, with +`u − v` vanishing on the cube faces; the defect and data are written with the +classical gradient. The weak `H¹` comparison datum required by the public theorem +is *constructed* from this classical data (`classicalFluxComparisonPair`) by +genuine integration by parts (`integral_vecDot_grad_eq_neg_integral_euclideanDivergence`), +so no weak-solution hypothesis is assumed. + +**Comparator.** `Audit/PeriodicSmooth` checks a Mathlib-only restatement of this +theorem against the proof below. See `Audit/README.md` for the comparator map. + +**Progression.** abstract theorem (`Audit/QuenchedComparison`) → general periodic +(`PeriodicGeneralComparison`, `Audit/PeriodicGeneral`) → explicit field +(`PeriodicConcreteComparison`, `Audit/PeriodicConcrete`) → *classical data (this +file)*. +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace Periodic + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- Package a smooth scalar field as an `H¹` function on the public origin +cube. -/ +noncomputable def classicalH1OnOriginCube {d : ℕ} [NeZero d] (m : ℕ) + (u : Vec d → ℝ) (hu : ContDiff ℝ 1 u) : + H1Function (Book.Ch02.cubeDomain (Book.MainResults.originCube d m) : Set (Vec d)) := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (by + simpa [Book.Ch02.cubeDomain_coe] using + isOpenBoundedConvexDomain_openCubeSet (Book.MainResults.originCube d m)) + hu + +@[simp] theorem classicalH1OnOriginCube_toFun {d : ℕ} [NeZero d] (m : ℕ) + (u : Vec d → ℝ) (hu : ContDiff ℝ 1 u) : + (classicalH1OnOriginCube (d := d) m u hu).toFun = u := by + simp [classicalH1OnOriginCube, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + +@[simp] theorem classicalH1OnOriginCube_grad {d : ℕ} [NeZero d] (m : ℕ) + (u : Vec d → ℝ) (hu : ContDiff ℝ 1 u) : + (classicalH1OnOriginCube (d := d) m u hu).grad = euclideanGradient u := by + funext x i + simp [classicalH1OnOriginCube, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, euclideanGradient, euclideanCoordDeriv] + +/-- Classical pointwise divergence of a smooth vector field, +`(∇·F)(x) = ∑ᵢ ∂ᵢ Fᵢ(x)`. -/ +def euclideanDivergence {d : ℕ} (F : Vec d → Vec d) : Vec d → ℝ := + fun x => ∑ i : Fin d, euclideanCoordDeriv i (fun y => F y i) x + +/-- Package a `C¹` vector field as a coordinatewise `H¹` competitor on the +public origin cube. -/ +noncomputable def classicalCubeVectorH1 {d : ℕ} [NeZero d] (m : ℕ) + (F : Vec d → Vec d) (hF : ContDiff ℝ 1 F) : + CubeVectorH1Function (Book.MainResults.originCube d m) where + coord i := classicalH1OnOriginCube (d := d) m (fun x => F x i) (contDiff_pi.mp hF i) + +@[simp] theorem classicalCubeVectorH1_toField {d : ℕ} [NeZero d] (m : ℕ) + (F : Vec d → Vec d) (hF : ContDiff ℝ 1 F) : + (classicalCubeVectorH1 (d := d) m F hF).toField = F := by + funext x i + simp [classicalCubeVectorH1, CubeVectorH1Function.toField] + +@[simp] theorem classicalCubeVectorH1_divergence {d : ℕ} [NeZero d] (m : ℕ) + (F : Vec d → Vec d) (hF : ContDiff ℝ 1 F) : + (classicalCubeVectorH1 (d := d) m F hF).divergence = euclideanDivergence F := by + funext x + simp only [CubeVectorH1Function.divergence, classicalCubeVectorH1, + euclideanDivergence] + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [classicalH1OnOriginCube_grad] + rfl + +/-- Integration by parts against a zero-trace test function: for a `C¹` vector +field `F` and `φ ∈ H¹₀`, `∫ F·∇φ = − ∫ (∇·F) φ` on the public origin cube. -/ +theorem integral_vecDot_grad_eq_neg_integral_euclideanDivergence + {d : ℕ} [NeZero d] (m : ℕ) (F : Vec d → Vec d) (hF : ContDiff ℝ 1 F) + (φ : H10Function (openCubeSet (Book.MainResults.originCube d m))) : + ∫ x in openCubeSet (Book.MainResults.originCube d m), + vecDot (F x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + -∫ x in openCubeSet (Book.MainResults.originCube d m), + euclideanDivergence F x * φ.toH1Function x ∂MeasureTheory.volume := by + have h := + (classicalCubeVectorH1 (d := d) m F hF).integral_divergence_mul_zeroTrace_eq_neg_integral_vecDot φ + rw [classicalCubeVectorH1_divergence, classicalCubeVectorH1_toField] at h + linarith [h] + +/-- Classical pointwise divergence data packaged as the weak comparison pair used +by the homogenization comparison theorem. The two scalar solutions are smooth and +satisfy the divergence-form equations `∇·(a∇u) = ∇·g` and `∇·(ā∇v) = ∇·g` +pointwise; the weak `H¹` datum is obtained by integration by parts. -/ +noncomputable def classicalFluxComparisonPair {d : ℕ} [NeZero d] + (S : Book.MainResults.Setup d) + (aω : RegCoeffField d) (ha : Book.Ch04.AELocallyUniformlyEllipticField aω) + (m : ℕ) (u v : Vec d → ℝ) (g : Vec d → Vec d) + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hv : ContDiff ℝ (⊤ : ℕ∞) v) + (hg : ContDiff ℝ 1 g) + (haflux : ContDiff ℝ 1 (fun x => matVecMul (aω x) (euclideanGradient u x))) + (hvflux : ContDiff ℝ 1 + (fun x => matVecMul S.homogenizedMatrix.matrix (euclideanGradient v x))) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + (u - v) (cubeLowerFaceProjection (Book.MainResults.originCube d m) i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + (u - v) (cubeUpperFaceProjection (Book.MainResults.originCube d m) i x) = 0) + (hu_div : ∀ x : Vec d, + euclideanDivergence (fun y => matVecMul (aω y) (euclideanGradient u y)) x = + euclideanDivergence g x) + (hv_div : ∀ x : Vec d, + euclideanDivergence + (fun y => matVecMul S.homogenizedMatrix.matrix (euclideanGradient v y)) x = + euclideanDivergence g x) : + S.ComparisonPair aω ha m g := by + let Q := Book.MainResults.originCube d m + let uH1 : + H1Function (Book.Ch02.cubeDomain Q : Set (Vec d)) := + classicalH1OnOriginCube (d := d) m u (hu.of_le (by simp)) + let vH1 : + H1Function (Book.Ch02.cubeDomain Q : Set (Vec d)) := + classicalH1OnOriginCube (d := d) m v (hv.of_le (by simp)) + refine + { u := uH1 + v := vH1 + uWeakSolution := ?_ + vWeakSolution := ?_ + zeroTraceDifference := ?_ } + · intro φ + simp only [Book.Ch02.cubeDomain_coe] + have key1 := integral_vecDot_grad_eq_neg_integral_euclideanDivergence (d := d) m + (fun x => matVecMul (aω x) (euclideanGradient u x)) haflux φ + have keyg := integral_vecDot_grad_eq_neg_integral_euclideanDivergence (d := d) m g hg φ + have hdiv : + (∫ x in openCubeSet Q, + euclideanDivergence (fun y => matVecMul (aω y) (euclideanGradient u y)) x * + φ.toH1Function x ∂MeasureTheory.volume) + = ∫ x in openCubeSet Q, + euclideanDivergence g x * φ.toH1Function x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards with x + rw [hu_div x] + trans (∫ x in openCubeSet Q, + vecDot (matVecMul (aω x) (euclideanGradient u x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume) + · refine MeasureTheory.integral_congr_ae ?_ + filter_upwards with x + simp [uH1, Book.Ch05.Section57.assemblyCoeffFamily] + · rw [key1, hdiv, ← keyg] + · intro φ + simp only [Book.Ch02.cubeDomain_coe] + have key1 := integral_vecDot_grad_eq_neg_integral_euclideanDivergence (d := d) m + (fun x => matVecMul S.homogenizedMatrix.matrix (euclideanGradient v x)) hvflux φ + have keyg := integral_vecDot_grad_eq_neg_integral_euclideanDivergence (d := d) m g hg φ + have hdiv : + (∫ x in openCubeSet Q, + euclideanDivergence + (fun y => matVecMul S.homogenizedMatrix.matrix (euclideanGradient v y)) x * + φ.toH1Function x ∂MeasureTheory.volume) + = ∫ x in openCubeSet Q, + euclideanDivergence g x * φ.toH1Function x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards with x + rw [hv_div x] + trans (∫ x in openCubeSet Q, + vecDot (matVecMul S.homogenizedMatrix.matrix (euclideanGradient v x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume) + · refine MeasureTheory.integral_congr_ae ?_ + filter_upwards with x + simp [vH1, Book.MainResults.Setup.homogenizedMatrix, + Book.Ch05.Section57.assemblyConstantCoeffMatrixOfScalar, + Book.Ch05.Section57.scalarConstantCoeffMatrix_matrix] + · rw [key1, hdiv, ← keyg] + · let w : H10Function (Book.Ch02.cubeDomain Q : Set (Vec d)) := by + simpa [Book.Ch02.cubeDomain_coe, Q] using + H10Function.ofContDiffFaceZeroOnOpenCubeSetNoCompact Q + (hu.sub hv) hlower_zero hupper_zero + refine ⟨w, ?_⟩ + simpa [w, uH1, vH1, Q, sub_eq_add_neg, Book.Ch02.cubeDomain_coe] using + H10Function.ofContDiffFaceZeroOnOpenCubeSetNoCompact_toFun_ae + Q (hu.sub hv) hlower_zero hupper_zero + +/-- The constant-coefficient part of the classical comparison defect. -/ +noncomputable def classicalComparisonConstantGradientField {d : ℕ} + (abar : Mat d) (u v : Vec d → ℝ) : Vec d → Vec d := + fun x => matVecMul abar (euclideanGradient u x - euclideanGradient v x) + +/-- The flux part of the classical comparison defect. -/ +noncomputable def classicalComparisonFluxField {d : ℕ} + (a : CoeffField d) (abar : Mat d) (u v : Vec d → ℝ) : Vec d → Vec d := + fun x => matVecMul (a x) (euclideanGradient u x) - + matVecMul abar (euclideanGradient v x) + +/-- The legacy dual-Besov classical compatibility defect appearing in the smooth +periodic corollary. -/ +noncomputable def classicalComparisonDefect {d : ℕ} [NeZero d] + (abar : Mat d) (s : ℝ) (a : CoeffField d) (m : ℕ) + (u v : Vec d → ℝ) : ℝ := + Book.Ch03.Legacy.scaleNormalizedNegativeSobolevVectorNormTwo + (Book.MainResults.originCube d m) s + (classicalComparisonConstantGradientField abar u v) + + Book.Ch03.Legacy.scaleNormalizedNegativeSobolevVectorNormTwo + (Book.MainResults.originCube d m) s + (classicalComparisonFluxField a abar u v) + +/-- The energy norm of a smooth classical field on a cube. -/ +noncomputable def classicalH1EnergyNormOnCube {d : ℕ} + (Q : TriadicCube d) (a : CoeffField d) (u : Vec d → ℝ) : ℝ := + Real.sqrt <| + volumeAverage (openCubeSet Q) fun x => + vecDot (euclideanGradient u x) + (matVecMul (symmPart (a x)) (euclideanGradient u x)) + +/-- The classical data norm controlling the smooth periodic compatibility +defect; its force term is legacy fractional-Sobolev. -/ +noncomputable def classicalComparisonData {d : ℕ} [NeZero d] + (sigmaBar : ℝ) (s : ℝ) (a : CoeffField d) (m : ℕ) + (g : Vec d → Vec d) (u : Vec d → ℝ) : ℝ := + Real.sqrt sigmaBar * + classicalH1EnergyNormOnCube (Book.MainResults.originCube d m) a u + + Book.Ch03.Legacy.scaleNormalizedPositiveSobolevVectorSeminormTwo + (Book.MainResults.originCube d m) s g + +/-- +Fixed-exponent quenched homogenization comparison for smooth classical flux +data over the explicit periodic coefficient field. +-/ +theorem periodicSmooth_comparison {d : ℕ} [NeZero d] : + ∃ C alpha Cscale : ℝ, + 0 < C ∧ 0 < alpha ∧ 0 < Cscale ∧ + ∀ (two_le_dim : 2 ≤ d), + let Lam : ℝ := 2 * (d : ℝ) + 2 + let S : Book.MainResults.Setup d := + periodicSetup two_le_dim (mFieldReg (d := d)) 2 Lam + mFieldCoeff_periodic mFieldCoeff_isotropic mFieldCoeff_adjointInvariant + (by norm_num) + (by + nlinarith [show 0 ≤ (d : ℝ) by exact_mod_cast Nat.zero_le d]) + (fun Q => mFieldReg_aeeEllipticOn (measurableSet_openCubeSet Q)) + ∃ sigmaBar : ℝ, + 0 < sigmaBar ∧ + ∃ X : RegCoeffField d → ℝ, + S.IsMinimalScale X Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (_ha : Book.Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {u v : Vec d → ℝ} {g : Vec d → Vec d} + (_hu : ContDiff ℝ (⊤ : ℕ∞) u) + (_hv : ContDiff ℝ (⊤ : ℕ∞) v) + (_hg : ContDiff ℝ 1 g) + (_haflux : ContDiff ℝ 1 + (fun x => matVecMul (aω x) (euclideanGradient u x))) + (_hvflux : ContDiff ℝ 1 + (fun x => matVecMul (scalarMatrix (d := d) sigmaBar) (euclideanGradient v x))) + (_hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + (u - v) (cubeLowerFaceProjection (Book.MainResults.originCube d m) i x) = 0) + (_hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + (u - v) (cubeUpperFaceProjection (Book.MainResults.originCube d m) i x) = 0) + (_hu_div : ∀ x : Vec d, + euclideanDivergence (fun y => matVecMul (aω y) (euclideanGradient u y)) x = + euclideanDivergence g x) + (_hv_div : ∀ x : Vec d, + euclideanDivergence + (fun y => + matVecMul (scalarMatrix (d := d) sigmaBar) (euclideanGradient v y)) x = + euclideanDivergence g x), + X aω ≤ (3 : ℝ) ^ m → + Book.Ch03.Legacy.ForceSobolevRegularity + (Book.MainResults.originCube d m) Book.MainResults.fixedComparisonS g → + classicalComparisonDefect (scalarMatrix (d := d) sigmaBar) + Book.MainResults.fixedComparisonS aω.toFun m u v ≤ + C * ((3 : ℝ) ^ m / X aω) ^ (-alpha) * + classicalComparisonData sigmaBar + Book.MainResults.fixedComparisonS aω.toFun m g u := by + obtain ⟨C, alpha, Cscale, hC, halpha, hCscale, hmain⟩ := + periodicConcrete_comparison (d := d) + refine ⟨C, alpha, Cscale, hC, halpha, hCscale, ?_⟩ + intro two_le_dim + let Lam : ℝ := 2 * (d : ℝ) + 2 + let S : Book.MainResults.Setup d := + periodicSetup two_le_dim (mFieldReg (d := d)) 2 Lam + mFieldCoeff_periodic mFieldCoeff_isotropic mFieldCoeff_adjointInvariant + (by norm_num) + (by + nlinarith [show 0 ≤ (d : ℝ) by exact_mod_cast Nat.zero_le d]) + (fun Q => mFieldReg_aeeEllipticOn (measurableSet_openCubeSet Q)) + let sigmaBar : ℝ := Book.Ch05.Section57.barSigmaLimit S.hP S.hStruct + have hsigma : 0 < sigmaBar := by + dsimp [sigmaBar] + exact S.barSigmaLimit_pos + obtain ⟨_sigmaBar, _hsigma, X, hX, hmainS⟩ := hmain two_le_dim + refine ⟨sigmaBar, hsigma, X, hX, ?_⟩ + filter_upwards [hmainS] with aω hmain_aω + intro ha m u v g hu hv hg haflux hvflux hlower_zero hupper_zero hu_div hv_div hXm hgsob + have hMat : S.homogenizedMatrix.matrix = scalarMatrix (d := d) sigmaBar := by + simp [sigmaBar, Book.MainResults.Setup.homogenizedMatrix, + Book.Ch05.Section57.assemblyConstantCoeffMatrixOfScalar, + Book.Ch05.Section57.scalarConstantCoeffMatrix_matrix] + let pair : S.ComparisonPair aω ha m g := + classicalFluxComparisonPair S aω ha m u v g hu hv hg haflux + (by rw [hMat]; exact hvflux) + hlower_zero hupper_zero hu_div + (by intro x; rw [hMat]; exact hv_div x) + have hstep := hmain_aω ha pair hXm hgsob + simpa [pair, Book.MainResults.Setup.comparisonDefect, + Book.MainResults.Setup.comparisonData, Book.MainResults.Setup.homogenizedMatrix, + Book.Ch03.Legacy.homogenizationComparisonNegativeSobolevLHS, + Book.Ch03.homogenizationComparisonConstantGradientField, + Book.Ch03.homogenizationComparisonFluxField, + Book.Ch03.h1EnergyNormOnCube, Book.Ch03.localizedCoeffEnergyValue, + Book.Ch03.normalizedSetAverage, + Book.Ch05.Section57.assemblyCoeffFamily, + Book.Ch05.Section57.assemblyConstantCoeffMatrixOfScalar, + Book.Ch05.Section57.scalarConstantCoeffMatrix_matrix, + Book.Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField, + Book.Ch04.coeffOnOfAEEllipticOn, + Book.Ch02.cubeDomain_coe, + classicalComparisonDefect, classicalComparisonData, + classicalComparisonConstantGradientField, classicalComparisonFluxField, + classicalH1EnergyNormOnCube, classicalFluxComparisonPair, + classicalH1OnOriginCube, volumeAverage] using! hstep + +end + +end Periodic +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard.lean b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard.lean new file mode 100644 index 0000000000..c96f808a99 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.AKLLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.CarrierLaw +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.SourceLaw + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/AKLLaw.lean b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/AKLLaw.lean new file mode 100644 index 0000000000..bab76850f6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/AKLLaw.lean @@ -0,0 +1,211 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL.RegQuotientAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge + +/-! +# The AKL Bernoulli checkerboard law + +The Bernoulli checkerboard, viewed through AKL's a.e.-quotient carrier. The +regular checkerboard is only used in the forward, measurable direction supplied +by `regularToAKL`; no quotient representative is chosen here. +-/ + +@[expose] public section + +namespace Homogenization.Examples.RandomCheckerboard.AKL + +open MeasureTheory ProbabilityTheory +open scoped ENNReal NNReal + +noncomputable section + +attribute [local instance] Classical.propDecidable + +/-- The regular checkerboard realization with the fixed `(1, Θ)` a.e. +ellipticity witness required to enter AKL's quotient carrier. -/ +private def regularCheckerCarrier {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) : + Sample d → Source.AKL.RegularAKLCarrier d Θ := + fun ω => ⟨checkerRegField 1 Θ ω, Filter.Eventually.of_forall fun x => + scalarMatrix_isEllipticMatrix_between (d := d) one_pos hΘ + (scalarAt_eq_lam_or_Lam (lam := (1 : ℝ)) (Lam := Θ) ω x)⟩ + +/-- The literal AKL quotient-carrier realization of a checkerboard sample. -/ +def checkerCarrier {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) : + Sample d → Source.AKL.Carrier d Θ := + Source.AKL.regularToAKL ∘ regularCheckerCarrier hΘ + +private theorem measurable_regularCheckerCarrier_local {d : ℕ} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (U : Source.AKL.BorelRegion d) : + @Measurable (Sample d) (Source.AKL.RegularAKLCarrier d Θ) + (sampleCellsSigma (cellsMeeting U.1)) (Source.AKL.regularLocalSigma U) + (regularCheckerCarrier hΘ) := by + have hregular : @Measurable (Sample d) (RegCoeffField d) + (sampleCellsSigma (cellsMeeting U.1)) (LocalSigmaR U.1) + (checkerRegField 1 Θ) := + (measurable_checkerRegField_restrictionSigmaR 1 Θ U.1 U.2).mono le_rfl + (localSigmaR_le_restrictionSigmaR U.1 U.2) + rw [measurable_iff_comap_le, Source.AKL.regularLocalSigma] + have hcomp : + MeasurableSpace.comap (regularCheckerCarrier hΘ) + (MeasurableSpace.comap + (Subtype.val : Source.AKL.RegularAKLCarrier d Θ → RegCoeffField d) + (LocalSigmaR U.1)) = + MeasurableSpace.comap + ((Subtype.val : Source.AKL.RegularAKLCarrier d Θ → RegCoeffField d) ∘ + regularCheckerCarrier hΘ) + (LocalSigmaR U.1) := + MeasurableSpace.comap_comp + rw [hcomp] + exact hregular.comap_le + +private theorem measurable_checkerCarrier_local {d : ℕ} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (U : Source.AKL.BorelRegion d) : + @Measurable (Sample d) (Source.AKL.Carrier d Θ) + (sampleCellsSigma (cellsMeeting U.1)) (Source.AKL.localSigma U) + (checkerCarrier hΘ) := by + exact (Source.AKL.regularToAKL_measurable_local U).comp + (measurable_regularCheckerCarrier_local hΘ U) + +private theorem measurable_checkerCarrier {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) : + @Measurable (Sample d) (Source.AKL.Carrier d Θ) inferInstance + (Source.AKL.globalSigma d Θ) (checkerCarrier hΘ) := by + simpa only [Source.AKL.globalSigma] using! + (measurable_checkerCarrier_local hΘ + (⟨Set.univ, MeasurableSet.univ⟩ : Source.AKL.BorelRegion d)).mono + (sampleCellsSigma_le _) le_rfl + +/-- The AKL law obtained by pushing the Bernoulli product measure forward +through the exact quotient carrier. -/ +def law (d : ℕ) (Θ : ℝ) (hΘ : 1 ≤ Θ) (p : ℝ≥0) (hp : p ≤ 1) : + Source.AKL.Law d Θ := + letI : MeasurableSpace (Source.AKL.Carrier d Θ) := Source.AKL.globalSigma d Θ + Measure.map (checkerCarrier hΘ) (sampleMeasure d p hp) + +instance instIsProbabilityMeasure_law (d : ℕ) (Θ : ℝ) (hΘ : 1 ≤ Θ) + (p : ℝ≥0) (hp : p ≤ 1) : + @IsProbabilityMeasure (Source.AKL.Carrier d Θ) (Source.AKL.globalSigma d Θ) + (law d Θ hΘ p hp) := by + let : MeasurableSpace (Source.AKL.Carrier d Θ) := Source.AKL.globalSigma d Θ + rw [law] + infer_instance + +theorem isProbabilityMeasure_law (d : ℕ) (Θ : ℝ) (hΘ : 1 ≤ Θ) + (p : ℝ≥0) (hp : p ≤ 1) : + @IsProbabilityMeasure (Source.AKL.Carrier d Θ) (Source.AKL.globalSigma d Θ) + (law d Θ hΘ p hp) := + inferInstance + +private theorem translate_checkerCarrier {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) + (z : Fin d → ℤ) (ω : Sample d) : + Source.AKL.translate z (checkerCarrier hΘ ω) = + checkerCarrier hΘ (shiftSample z ω) := by + apply Subtype.ext + apply AEEqFun.ext + have hregular_shift : ∀ᵐ x ∂volume, + (checkerCarrier hΘ ω).1 (x + Source.AKL.intTranslation z) = + (regularCheckerCarrier hΘ ω).1 (x + Source.AKL.intTranslation z) := + (measurePreserving_add_right (volume : Measure (Vec d)) + (Source.AKL.intTranslation z)).quasiMeasurePreserving.tendsto_ae + (Source.AKL.regularToAKL_ae_eq (regularCheckerCarrier hΘ ω)) + filter_upwards [Source.AKL.translateField_ae z (checkerCarrier hΘ ω).1, + hregular_shift, + Source.AKL.regularToAKL_ae_eq (regularCheckerCarrier hΘ (shiftSample z ω))] + with x htranslate hregular hshift + change Source.AKL.translateField z (checkerCarrier hΘ ω).1 x = + (checkerCarrier hΘ (shiftSample z ω)).1 x + rw [htranslate] + calc + (checkerCarrier hΘ ω).1 (x + Source.AKL.intTranslation z) = + (regularCheckerCarrier hΘ ω).1 (x + Source.AKL.intTranslation z) := hregular + _ = (regularCheckerCarrier hΘ (shiftSample z ω)).1 x := + congrArg (fun a : RegCoeffField d => a x) + (translateReg_checkerRegField (lam := (1 : ℝ)) (Lam := Θ) z ω) + _ = (Source.AKL.regularToAKL (regularCheckerCarrier hΘ (shiftSample z ω))).1 x := + hshift.symm + _ = (checkerCarrier hΘ (shiftSample z ω)).1 x := rfl + +/-- The AKL quotient checkerboard law is invariant under integer translations. -/ +theorem stationary_law {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) + (p : ℝ≥0) (hp : p ≤ 1) : Source.AKL.Stationary (law d Θ hΘ p hp) := by + let : MeasurableSpace (Source.AKL.Carrier d Θ) := Source.AKL.globalSigma d Θ + intro z + rw [law] + calc + Measure.map (Source.AKL.translate z) + (Measure.map (checkerCarrier hΘ) (sampleMeasure d p hp)) = + Measure.map (fun ω : Sample d => Source.AKL.translate z (checkerCarrier hΘ ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp] using! Measure.map_map + (Source.AKL.measurable_translate_global z) (measurable_checkerCarrier hΘ) + (μ := sampleMeasure d p hp) + _ = Measure.map (fun ω : Sample d => checkerCarrier hΘ (shiftSample z ω)) + (sampleMeasure d p hp) := by + congr 1 + funext ω + exact translate_checkerCarrier hΘ z ω + _ = Measure.map (checkerCarrier hΘ) + (Measure.map (shiftSample z) (sampleMeasure d p hp)) := by + symm + simpa [Function.comp] using! Measure.map_map (measurable_checkerCarrier hΘ) + (measurable_shiftSample z) (μ := sampleMeasure d p hp) + _ = Measure.map (checkerCarrier hΘ) (sampleMeasure d p hp) := by + rw [sampleMeasure_map_shiftSample z p hp] + +/-- The AKL quotient checkerboard law has unit range for AKL's sup-metric +separation relation. -/ +theorem unitRangeDependent_law {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) + (p : ℝ≥0) (hp : p ≤ 1) : Source.AKL.UnitRangeDependent (law d Θ hΘ p hp) := by + let : MeasurableSpace (Source.AKL.Carrier d Θ) := Source.AKL.globalSigma d Θ + intro U V hUV + rw [law] + have hcells : Disjoint (cellsMeeting U.1) (cellsMeeting V.1) := + disjoint_cellsMeeting_of_areUnitSeparated (by + intro x y hx hy + simpa only [Source.AKL.unitSeparated, Source.AKL.supDist, dist_eq_norm] using + hUV hx hy) + have hIndCells : Indep (sampleCellsSigma (cellsMeeting U.1)) + (sampleCellsSigma (cellsMeeting V.1)) (sampleMeasure d p hp) := + indep_sampleCellsSigma_of_disjoint hcells p hp + rw [Indep_iff] + intro s t hs ht + have hmeas := measurable_checkerCarrier (d := d) hΘ + have hs_ambient : @MeasurableSet (Source.AKL.Carrier d Θ) + (Source.AKL.globalSigma d Θ) s := + (Source.AKL.localSigma_mono (Set.subset_univ _)) s hs + have ht_ambient : @MeasurableSet (Source.AKL.Carrier d Θ) + (Source.AKL.globalSigma d Θ) t := + (Source.AKL.localSigma_mono (Set.subset_univ _)) t ht + have hst_ambient : @MeasurableSet (Source.AKL.Carrier d Θ) + (Source.AKL.globalSigma d Θ) (s ∩ t) := hs_ambient.inter ht_ambient + have hs_pre : @MeasurableSet (Sample d) (sampleCellsSigma (cellsMeeting U.1)) + (checkerCarrier hΘ ⁻¹' s) := + (measurable_checkerCarrier_local hΘ U) hs + have ht_pre : @MeasurableSet (Sample d) (sampleCellsSigma (cellsMeeting V.1)) + (checkerCarrier hΘ ⁻¹' t) := + (measurable_checkerCarrier_local hΘ V) ht + have hpre_ind := (Indep_iff + (sampleCellsSigma (cellsMeeting U.1)) (sampleCellsSigma (cellsMeeting V.1)) + (sampleMeasure d p hp)).1 hIndCells (checkerCarrier hΘ ⁻¹' s) + (checkerCarrier hΘ ⁻¹' t) hs_pre ht_pre + rw [Measure.map_apply hmeas hst_ambient, Measure.map_apply hmeas hs_ambient, + Measure.map_apply hmeas ht_ambient] + simpa [Set.preimage_inter] using hpre_ind + +/-- The exact AKL probability package for the Bernoulli checkerboard. -/ +theorem probabilisticAssumptions {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) + (p : ℝ≥0) (hp : p ≤ 1) : Source.AKL.ProbabilisticAssumptions (law d Θ hΘ p hp) where + stationary := stationary_law hΘ p hp + unitRange := unitRangeDependent_law hΘ p hp + +end + +end Homogenization.Examples.RandomCheckerboard.AKL diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/Basic.lean new file mode 100644 index 0000000000..d0b9a9c497 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/Basic.lean @@ -0,0 +1,975 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSupport +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Probability.Independence.InfinitePi +public import Mathlib.Probability.ProbabilityMassFunction.Constructions + +/-! +# Bernoulli checkerboard: the honest carrier-valued sample map + +This file constructs the scalar Bernoulli checkerboard as a *carrier-valued* +random field. The random medium is indexed by `ℤ^d`; each open unit cube +centered at an integer lattice point receives conductance `lam` or `Lam`, while +cell walls are assigned the deterministic value `lam`. The deterministic wall +convention keeps stationarity and signed-permutation invariance exact for +pointwise coefficient fields. + +Following the carrier redesign, the sample map `checkerRegField lam Lam` lands +in the honest-fields carrier `RegCoeffField d`: every realization is entrywise +Borel measurable (piecewise-constant on the Borel cell decomposition) and +locally integrable (bounded by `max |lam| |Lam|`). The sample map is +**genuinely measurable** for the canonical carrier σ-algebra +`pointwiseSigmaR ⊔ entryTestSigmaR`: the pointwise lane is the coin evaluation +at the cell of the point, and the entry-test lane is a *finite-cell +decomposition* — the entry integral against a compactly supported probe is an +affine function of the finitely many coins whose cells meet the probe's +support. The same decomposition, restricted through `restrictReg`, gives +measurability into the restriction σ-algebra `RestrictionSigmaR U` from the +coins of the cells meeting `U`, the input for unit-range dependence of the +checkerboard law (`CarrierLaw.lean`). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace RandomCheckerboard + +open MeasureTheory +open scoped ENNReal NNReal + +noncomputable section + +attribute [local instance] Classical.propDecidable + +/-- Integer lattice indices for checkerboard cells. -/ +abbrev Lattice (d : ℕ) := + Fin d → ℤ + +/-- A checkerboard environment: one coin at each lattice cell. -/ +abbrev Sample (d : ℕ) := + Lattice d → Bool + +/-- The open unit cube centered at `z`. -/ +def openUnitCell {d : ℕ} (z : Lattice d) : Set (Vec d) := + {x | ∀ i : Fin d, |x i - (z i : ℝ)| < (1 / 2 : ℝ)} + +/-- Open checkerboard cells are Borel-measurable. -/ +theorem measurableSet_openUnitCell {d : ℕ} (z : Lattice d) : + MeasurableSet (openUnitCell z : Set (Vec d)) := by + classical + have hopen : IsOpen (openUnitCell z : Set (Vec d)) := by + unfold openUnitCell + have hset : + {x : Vec d | ∀ i : Fin d, |x i - (z i : ℝ)| < (1 / 2 : ℝ)} = + ⋂ i : Fin d, {x : Vec d | |x i - (z i : ℝ)| < (1 / 2 : ℝ)} := by + ext x + simp + rw [hset] + refine isOpen_iInter_of_finite fun i : Fin d => ?_ + have hleft : Continuous fun x : Vec d => |x i - (z i : ℝ)| := + ((continuous_apply i).sub continuous_const).abs + have hright : Continuous fun _ : Vec d => (1 / 2 : ℝ) := + continuous_const + exact isOpen_lt hleft hright + exact hopen.measurableSet + +/-- The set of lattice cells whose open interiors meet `U`. -/ +def cellsMeeting {d : ℕ} (U : Set (Vec d)) : Set (Lattice d) := + {z | ∃ x ∈ U, x ∈ openUnitCell z} + +/-- Monotonicity of `cellsMeeting` under set inclusion. -/ +theorem cellsMeeting_mono {d : ℕ} {U V : Set (Vec d)} (hUV : U ⊆ V) : + cellsMeeting U ⊆ cellsMeeting V := by + rintro z ⟨x, hxU, hxz⟩ + exact ⟨x, hUV hxU, hxz⟩ + +/-- A point belongs to at most one open unit cell. -/ +theorem openUnitCell_unique {d : ℕ} {x : Vec d} {z w : Lattice d} + (hz : x ∈ openUnitCell z) (hw : x ∈ openUnitCell w) : + z = w := by + funext i + by_contra hne + have hzw_int : (1 : ℤ) ≤ |z i - w i| := + Int.one_le_abs (sub_ne_zero.mpr hne) + have hzw : (1 : ℝ) ≤ |(z i : ℝ) - (w i : ℝ)| := by + rw [← Int.cast_sub, ← Int.cast_abs] + exact_mod_cast hzw_int + have hz_i := hz i + have hw_i := hw i + have hsplit : + (z i : ℝ) - (w i : ℝ) = + - (x i - (z i : ℝ)) + (x i - (w i : ℝ)) := by ring + have htriangle : + |(z i : ℝ) - (w i : ℝ)| < + (1 / 2 : ℝ) + (1 / 2 : ℝ) := by + calc + |(z i : ℝ) - (w i : ℝ)| + = |- (x i - (z i : ℝ)) + (x i - (w i : ℝ))| := by rw [hsplit] + _ ≤ |-(x i - (z i : ℝ))| + |x i - (w i : ℝ)| := abs_add_le _ _ + _ = |x i - (z i : ℝ)| + |x i - (w i : ℝ)| := by rw [abs_neg] + _ < (1 / 2 : ℝ) + (1 / 2 : ℝ) := add_lt_add hz_i hw_i + norm_num at htriangle + linarith + +/-- Bounded observation sets meet only finitely many open checkerboard cells. -/ +theorem finite_cellsMeeting_of_isBounded {d : ℕ} {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : + (cellsMeeting U).Finite := by + classical + rcases Bornology.IsBounded.isBoundedDomain hU with ⟨R, hRpos, hR⟩ + let N : ℤ := ⌈R + 1⌉ + have hfiniteBox : + ({z : Lattice d | ∀ i : Fin d, z i ∈ Set.Icc (-N) N}).Finite := by + simpa using + (Set.Finite.pi' (fun _ : Fin d => (Set.finite_Icc (-N) N))) + refine hfiniteBox.subset ?_ + intro z hz i + rcases hz with ⟨x, hxU, hxz⟩ + have hxR : |x i| ≤ R := hR x hxU i + have hxz_i : |x i - (z i : ℝ)| < (1 / 2 : ℝ) := hxz i + have hz_abs : |(z i : ℝ)| ≤ R + 1 := by + calc + |(z i : ℝ)| + = |x i - (x i - (z i : ℝ))| := by congr 1; ring + _ ≤ |x i| + |x i - (z i : ℝ)| := by + have htri := abs_sub_le (x i) 0 (x i - (z i : ℝ)) + simpa [abs_sub_comm (z i : ℝ) (x i)] using htri + _ ≤ R + 1 := by linarith + have hceil : R + 1 ≤ (N : ℝ) := by + simpa [N] using (Int.le_ceil (R + 1)) + have hleN_real : (z i : ℝ) ≤ (N : ℝ) := + (le_abs_self (z i : ℝ)).trans (hz_abs.trans hceil) + have hnegN_real : (-(N : ℤ) : ℝ) ≤ (z i : ℝ) := by + have hneg : -(R + 1) ≤ (z i : ℝ) := by + have hnegabs : -|(z i : ℝ)| ≤ (z i : ℝ) := by + have h := le_abs_self (-(z i : ℝ)) + rw [abs_neg] at h + linarith + linarith + have hN : (-(N : ℤ) : ℝ) ≤ -(R + 1) := by + norm_num [Int.cast_neg] + linarith + exact hN.trans hneg + constructor + · exact_mod_cast hnegN_real + · exact_mod_cast hleN_real + +/-- Conductance value associated with a coin. `true` is heads and gives +`lam`; `false` gives `Lam`. -/ +def coinConductance (lam Lam : ℝ) (b : Bool) : ℝ := + if b then lam else Lam + +/-- A deterministic representative on walls and a random scalar value in the +unique open unit cell containing the point. -/ +def scalarAt (lam Lam : ℝ) {d : ℕ} (ω : Sample d) (x : Vec d) : ℝ := + by + classical + exact + if h : ∃ z : Lattice d, x ∈ openUnitCell z then + coinConductance lam Lam (ω (Classical.choose h)) + else + lam + +/-- The scalar Bernoulli checkerboard coefficient field (raw sample). -/ +def coeffField (lam Lam : ℝ) {d : ℕ} (ω : Sample d) : CoeffField d := + fun x => scalarMatrix (d := d) (scalarAt lam Lam ω x) + +theorem scalarAt_of_mem_openUnitCell {d : ℕ} {lam Lam : ℝ} + {ω : Sample d} {x : Vec d} {z : Lattice d} + (hz : x ∈ openUnitCell z) : + scalarAt lam Lam ω x = coinConductance lam Lam (ω z) := by + classical + unfold scalarAt + let h : ∃ w : Lattice d, x ∈ openUnitCell w := ⟨z, hz⟩ + rw [dif_pos h] + congr 1 + exact congrArg ω (openUnitCell_unique (Classical.choose_spec h) hz) + +theorem scalarAt_of_not_mem_any_openUnitCell {d : ℕ} {lam Lam : ℝ} + {ω : Sample d} {x : Vec d} + (hx : ¬ ∃ z : Lattice d, x ∈ openUnitCell z) : + scalarAt lam Lam ω x = lam := by + classical + unfold scalarAt + rw [dif_neg hx] + +/-- The region where the checkerboard scalar takes the upper value `Lam`. -/ +def upperConductanceRegion {d : ℕ} (ω : Sample d) : Set (Vec d) := + ⋃ z : {z : Lattice d // ω z = false}, openUnitCell z.1 + +theorem measurableSet_upperConductanceRegion {d : ℕ} (ω : Sample d) : + MeasurableSet (upperConductanceRegion ω : Set (Vec d)) := by + classical + unfold upperConductanceRegion + exact MeasurableSet.iUnion fun z => measurableSet_openUnitCell z.1 + +theorem scalarAt_eq_if_upperConductanceRegion {d : ℕ} {lam Lam : ℝ} + {ω : Sample d} {x : Vec d} : + scalarAt lam Lam ω x = + if x ∈ upperConductanceRegion ω then Lam else lam := by + classical + by_cases hxUpper : x ∈ upperConductanceRegion ω + · rcases Set.mem_iUnion.mp hxUpper with ⟨z, hxz⟩ + have hcell : x ∈ openUnitCell z.1 := hxz + have hz : ω z.1 = false := z.2 + simp [scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hcell, + coinConductance, hz, hxUpper] + · by_cases hx : ∃ z : Lattice d, x ∈ openUnitCell z + · let z : Lattice d := Classical.choose hx + have hzcell : x ∈ openUnitCell z := Classical.choose_spec hx + have hztrue : ω z = true := by + cases hωz : ω z + · exact False.elim (hxUpper (Set.mem_iUnion.2 ⟨⟨z, hωz⟩, hzcell⟩)) + · rfl + simp [scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hzcell, + coinConductance, hztrue, hxUpper] + · simp [scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hx, + hxUpper] + +/-- For each sample, the scalar checkerboard representative is Borel-measurable +in space. -/ +theorem measurable_scalarAt_spatial {d : ℕ} {lam Lam : ℝ} (ω : Sample d) : + Measurable (fun x : Vec d => scalarAt lam Lam ω x) := by + classical + have hpiece : + Measurable + ((upperConductanceRegion ω).piecewise + (fun _ : Vec d => Lam) (fun _ : Vec d => lam)) := + Measurable.piecewise (measurableSet_upperConductanceRegion ω) + measurable_const measurable_const + convert hpiece using 1 + funext x + simp [Set.piecewise, scalarAt_eq_if_upperConductanceRegion] + +theorem measurable_coeffField_spatial {d : ℕ} {lam Lam : ℝ} (ω : Sample d) : + Measurable (fun x : Vec d => coeffField lam Lam ω x) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + by_cases hij : i = j + · subst j + simpa [coeffField, scalarMatrix] using measurable_scalarAt_spatial (lam := lam) (Lam := Lam) ω + · simp [coeffField, scalarMatrix, hij] + +theorem scalarAt_eq_lam_or_Lam {d : ℕ} {lam Lam : ℝ} (ω : Sample d) (x : Vec d) : + scalarAt lam Lam ω x = lam ∨ scalarAt lam Lam ω x = Lam := by + rw [scalarAt_eq_if_upperConductanceRegion] + by_cases hx : x ∈ upperConductanceRegion ω <;> simp [hx] + +theorem abs_scalarAt_le {d : ℕ} {lam Lam : ℝ} (ω : Sample d) (x : Vec d) : + |scalarAt lam Lam ω x| ≤ max |lam| |Lam| := by + rcases scalarAt_eq_lam_or_Lam (lam := lam) (Lam := Lam) ω x with h | h + · rw [h]; exact le_max_left _ _ + · rw [h]; exact le_max_right _ _ + +theorem scalarMatrix_isEllipticMatrix_between {d : ℕ} {lam Lam sigma : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (hsigma : sigma = lam ∨ sigma = Lam) : + IsEllipticMatrix lam Lam (scalarMatrix (d := d) sigma) := by + rcases hsigma with hsigma | hsigma + · subst sigma + exact (isEllipticMatrix_scalarMatrix (d := d) hlam).mono hlam le_rfl hle + · subst sigma + have hLam : 0 < Lam := lt_of_lt_of_le hlam hle + exact (isEllipticMatrix_scalarMatrix (d := d) hLam).mono hlam hle le_rfl + +/-! ## The sample-side σ-algebras and the Bernoulli product law -/ +/-- The sigma-algebra generated by one lattice coin. -/ +def sampleCoordinateSigma {d : ℕ} (z : Lattice d) : MeasurableSpace (Sample d) := + MeasurableSpace.comap (fun ω : Sample d => ω z) inferInstance +/-- The sigma-algebra generated by all coins in a set of lattice cells. -/ +def sampleCellsSigma {d : ℕ} (S : Set (Lattice d)) : MeasurableSpace (Sample d) := + ⨆ z : Lattice d, ⨆ _ : z ∈ S, sampleCoordinateSigma z + +theorem measurable_eval_sampleCellsSigma {d : ℕ} {S : Set (Lattice d)} + {z : Lattice d} (hz : z ∈ S) : + @Measurable (Sample d) Bool (sampleCellsSigma S) inferInstance (fun ω => ω z) := by + let : MeasurableSpace (Sample d) := sampleCellsSigma S + change Measurable (fun ω : Sample d => ω z) + rw [measurable_iff_comap_le] + exact le_iSup_of_le z (le_iSup_of_le hz le_rfl) + +/-- Every cells σ-algebra is coarser than the ambient product σ-algebra. -/ +theorem sampleCellsSigma_le {d : ℕ} (S : Set (Lattice d)) : + sampleCellsSigma S ≤ (inferInstance : MeasurableSpace (Sample d)) := by + refine iSup_le fun z => iSup_le fun _ => ?_ + exact (measurable_pi_apply z).comap_le + +/-- The Bernoulli measure on a single coin. -/ +def coinMeasure (p : ℝ≥0) (hp : p ≤ 1) : Measure Bool := + ProbabilityTheory.bernoulliMeasure true false ⟨(p : ℝ), NNReal.coe_nonneg p, by exact_mod_cast hp⟩ + +instance instIsProbabilityMeasure_coinMeasure (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (coinMeasure p hp) := by + unfold coinMeasure + infer_instance + +/-- The product Bernoulli law on all lattice coins. -/ +def sampleMeasure (d : ℕ) (p : ℝ≥0) (hp : p ≤ 1) : Measure (Sample d) := + Measure.infinitePi (fun _ : Lattice d => coinMeasure p hp) + +instance instIsProbabilityMeasure_sampleMeasure (d : ℕ) (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (sampleMeasure d p hp) := by + rw [sampleMeasure] + infer_instance + +/-! ## The carrier-valued sample map -/ + +/-- **The checkerboard realization as a carrier element.** Entrywise Borel +measurability is the shipped spatial measurability of the piecewise-constant +sample; local integrability holds because every entry is bounded by +`max |lam| |Lam|` (`RegCoeffField.locallyIntegrable_of_bounded_measurable`). +This discharges gate obligation (i) of the carrier design gate. -/ +def checkerRegField (lam Lam : ℝ) {d : ℕ} (ω : Sample d) : RegCoeffField d where + toFun := coeffField lam Lam ω + entry_measurable := fun i j => by + by_cases hij : i = j + · subst j + simpa [coeffField, scalarMatrix] using + measurable_scalarAt_spatial (lam := lam) (Lam := Lam) ω + · simp [coeffField, scalarMatrix, hij] + entry_locInt := fun i j => by + by_cases hij : i = j + · subst j + have hmeas : Measurable (fun x : Vec d => coeffField lam Lam ω x i i) := by + simpa [coeffField, scalarMatrix] using + measurable_scalarAt_spatial (lam := lam) (Lam := Lam) ω + refine RegCoeffField.locallyIntegrable_of_bounded_measurable hmeas + (C := max |lam| |Lam|) fun x => ?_ + simpa [coeffField, scalarMatrix] using + abs_scalarAt_le (lam := lam) (Lam := Lam) ω x + · have hzero : (fun x : Vec d => coeffField lam Lam ω x i j) + = fun _ : Vec d => (0 : ℝ) := by + funext x + simp [coeffField, scalarMatrix, hij] + rw [hzero] + exact locallyIntegrable_const (0 : ℝ) + +@[simp] theorem checkerRegField_toFun {d : ℕ} (lam Lam : ℝ) (ω : Sample d) : + (checkerRegField lam Lam ω).toFun = coeffField lam Lam ω := rfl + +@[simp] theorem checkerRegField_apply {d : ℕ} (lam Lam : ℝ) (ω : Sample d) (x : Vec d) : + checkerRegField lam Lam ω x = coeffField lam Lam ω x := rfl + +/-- Every checkerboard realization is spatially a.e. (in fact everywhere) +`(lam, Lam)`-elliptic on any measurable observation set — the regularity +conjuncts are free by the carrier type. -/ +theorem checkerRegField_isAEEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} (hU : MeasurableSet U) (hlam : 0 < lam) (hle : lam ≤ Lam) + (ω : Sample d) : + IsAEEllipticFieldOn lam Lam U (checkerRegField lam Lam ω).toFun := by + rw [isAEEllipticFieldOn_carrier_iff hU lam Lam] + exact Filter.Eventually.of_forall fun x => + scalarMatrix_isEllipticMatrix_between (d := d) hlam hle + (scalarAt_eq_lam_or_Lam (lam := lam) (Lam := Lam) ω x) + +/-! ## Genuine measurability of the sample map (entry-test lane) + +The entry integral of a checkerboard sample against a compactly supported probe +is an affine function of the finitely many coins whose cells meet the probe's +support: the **finite-cell decomposition**. This is the honest carrier +replacement of the raw generator-trick route, and discharges gate obligation (ii) +of the carrier design gate. -/ + +/-- Probes are integrable (bounded, measurable, compactly supported). -/ +private theorem integrable_of_isProbeR {d : ℕ} {ψ : Vec d → ℝ} (hψ : IsProbeR ψ) : + Integrable ψ (volume : Measure (Vec d)) := by + set K := tsupport ψ with hK + have hKcpt : IsCompact K := hψ.hasCompactSupport + obtain ⟨C, hC⟩ := hψ.bounded + have hOn : IntegrableOn ψ K volume := by + refine Measure.integrableOn_of_bounded hKcpt.measure_lt_top.ne + hψ.measurable.aestronglyMeasurable (M := C) ?_ + filter_upwards with x + simpa [Real.norm_eq_abs] using hC x + have hself : K.indicator ψ = ψ := + Set.indicator_eq_self.2 (subset_tsupport ψ) + rw [← hself, integrable_indicator_iff hKcpt.measurableSet] + exact hOn + +/-- **The pointwise finite-cell decomposition** of the scalar sample against a +probe: over any finset `F` containing all cells meeting the probe's support, +`scalarAt ω · ψ = lam ψ + ∑_{z ∈ F} (coin(ω z) − lam) · 1_{cell z} ψ`. -/ +private theorem scalarAt_mul_probe_decomp {d : ℕ} (lam Lam : ℝ) + {ψ : Vec d → ℝ} {F : Finset (Lattice d)} + (hF : cellsMeeting (Function.support ψ) ⊆ (F : Set (Lattice d))) + (ω : Sample d) (x : Vec d) : + scalarAt lam Lam ω x * ψ x = + lam * ψ x + ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + Set.indicator (openUnitCell z) ψ x := by + classical + by_cases hψx : ψ x = 0 + · simp [hψx, Set.indicator_apply] + · have hx : x ∈ Function.support ψ := hψx + by_cases hcell : ∃ z : Lattice d, x ∈ openUnitCell z + · obtain ⟨z0, hz0⟩ := hcell + have hz0F : z0 ∈ F := hF ⟨x, hx, hz0⟩ + rw [scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hz0, + Finset.sum_eq_single z0] + · rw [Set.indicator_of_mem hz0] + ring + · intro z _ hzne + have hxz : x ∉ openUnitCell z := fun hxz => + hzne (openUnitCell_unique hxz hz0) + rw [Set.indicator_of_notMem hxz, mul_zero] + · intro habs + exact absurd hz0F habs + · rw [scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) + (ω := ω) hcell, Finset.sum_eq_zero, add_zero] + intro z _ + have hxz : x ∉ openUnitCell z := fun hxz => hcell ⟨z, hxz⟩ + rw [Set.indicator_of_notMem hxz, mul_zero] + +/-- **The integrated finite-cell decomposition**: the diagonal entry test of a +checkerboard sample is an affine function of the coins in any finset containing +the cells meeting the probe's support. -/ +theorem entryTestR_checkerRegField_diag {d : ℕ} (lam Lam : ℝ) (i : Fin d) + {ψ : Vec d → ℝ} (hψ : IsProbeR ψ) {F : Finset (Lattice d)} + (hF : cellsMeeting (Function.support ψ) ⊆ (F : Set (Lattice d))) + (ω : Sample d) : + entryTestR i i ψ (checkerRegField lam Lam ω) = + lam * ∫ x, ψ x ∂volume + + ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + ∫ x, Set.indicator (openUnitCell z) ψ x ∂volume := by + classical + have hint_ψ : Integrable (fun x => lam * ψ x) volume := + (integrable_of_isProbeR hψ).const_mul lam + have hint_z : ∀ z ∈ F, Integrable + (fun x => (coinConductance lam Lam (ω z) - lam) * + Set.indicator (openUnitCell z) ψ x) volume := fun z _ => + (integrable_of_isProbeR (hψ.indicator (measurableSet_openUnitCell z))).const_mul _ + have hint_sum : Integrable + (fun x => ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + Set.indicator (openUnitCell z) ψ x) volume := + integrable_finsetSum F hint_z + calc + entryTestR i i ψ (checkerRegField lam Lam ω) + = ∫ x, scalarAt lam Lam ω x * ψ x ∂volume := by + unfold entryTestR + refine integral_congr_ae (Filter.Eventually.of_forall fun x => ?_) + simp [coeffField, scalarMatrix] + _ = ∫ x, (lam * ψ x + ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + Set.indicator (openUnitCell z) ψ x) ∂volume := by + refine integral_congr_ae (Filter.Eventually.of_forall fun x => ?_) + exact scalarAt_mul_probe_decomp lam Lam hF ω x + _ = lam * ∫ x, ψ x ∂volume + + ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + ∫ x, Set.indicator (openUnitCell z) ψ x ∂volume := by + rw [integral_add hint_ψ hint_sum, integral_const_mul, + integral_finsetSum F hint_z] + congr 1 + exact Finset.sum_congr rfl fun z _ => integral_const_mul _ _ + +/-- **Master entry-test measurability**: the entry test of the checkerboard +sample map against a probe is measurable for any σ-algebra on the sample space +that measures the coins of the cells meeting the probe's support. -/ +theorem measurable_entryTestR_checkerRegField {d : ℕ} (lam Lam : ℝ) + {m : MeasurableSpace (Sample d)} (i j : Fin d) {ψ : Vec d → ℝ} + (hψ : IsProbeR ψ) + (hcoin : ∀ z ∈ cellsMeeting (Function.support ψ), + @Measurable (Sample d) Bool m inferInstance (fun ω => ω z)) : + @Measurable (Sample d) ℝ m inferInstance + (fun ω => entryTestR i j ψ (checkerRegField lam Lam ω)) := by + classical + by_cases hij : i = j + · subst j + have hbdd : Bornology.IsBounded (Function.support ψ) := + hψ.hasCompactSupport.isBounded.subset (subset_tsupport ψ) + have hfin := finite_cellsMeeting_of_isBounded (d := d) hbdd + set F : Finset (Lattice d) := hfin.toFinset with hFdef + have hF : cellsMeeting (Function.support ψ) ⊆ (F : Set (Lattice d)) := + fun z hz => hfin.mem_toFinset.2 hz + have hEq : (fun ω : Sample d => entryTestR i i ψ (checkerRegField lam Lam ω)) + = fun ω => lam * ∫ x, ψ x ∂volume + + ∑ z ∈ F, (coinConductance lam Lam (ω z) - lam) * + ∫ x, Set.indicator (openUnitCell z) ψ x ∂volume := + funext fun ω => entryTestR_checkerRegField_diag lam Lam i hψ hF ω + rw [hEq] + refine Measurable.add measurable_const ?_ + refine Finset.measurable_sum F fun z hz => ?_ + have hzS : z ∈ cellsMeeting (Function.support ψ) := hfin.mem_toFinset.1 hz + have hcz : @Measurable (Sample d) ℝ m inferInstance + (fun ω => coinConductance lam Lam (ω z)) := + (measurable_of_finite (coinConductance lam Lam)).comp (hcoin z hzS) + exact (hcz.sub measurable_const).mul_const _ + · have hEq : (fun ω : Sample d => entryTestR i j ψ (checkerRegField lam Lam ω)) + = fun _ => (0 : ℝ) := by + funext ω + unfold entryTestR + have hzero : ∀ x : Vec d, checkerRegField lam Lam ω x i j * ψ x = 0 := by + intro x + simp [coeffField, scalarMatrix, hij] + simp only [hzero, integral_zero] + rw [hEq] + exact measurable_const + +/-- **Master pointwise-lane measurability**: evaluation of the checkerboard +sample map at a spatial point is measurable for any σ-algebra measuring the +coin of the cell of that point (walls are deterministic). -/ +theorem measurable_apply_checkerRegField {d : ℕ} (lam Lam : ℝ) + {m : MeasurableSpace (Sample d)} (x : Vec d) (i j : Fin d) + (hcoin : ∀ z : Lattice d, x ∈ openUnitCell z → + @Measurable (Sample d) Bool m inferInstance (fun ω => ω z)) : + @Measurable (Sample d) ℝ m inferInstance + (fun ω => checkerRegField lam Lam ω x i j) := by + classical + by_cases hx : ∃ z : Lattice d, x ∈ openUnitCell z + · let z : Lattice d := Classical.choose hx + have hzcell : x ∈ openUnitCell z := Classical.choose_spec hx + have hcz : @Measurable (Sample d) ℝ m inferInstance + (fun ω => coinConductance lam Lam (ω z)) := + (measurable_of_finite (coinConductance lam Lam)).comp (hcoin z hzcell) + by_cases hij : i = j + · subst j + simpa [coeffField, scalarAt, hx, scalarMatrix] using hcz + · simp [coeffField, scalarAt, hx, scalarMatrix, hij] + · by_cases hij : i = j + · subst j + simp [coeffField, scalarAt, hx, scalarMatrix] + · simp [coeffField, scalarAt, hx, scalarMatrix, hij] + +/-- **The checkerboard sample map is genuinely measurable into the carrier** +(canonical σ-algebra, both lanes). Gate obligation (ii) discharged: the entry-test +lane is the finite-cell decomposition, the pointwise lane the coin evaluation. -/ +theorem measurable_checkerRegField {d : ℕ} (lam Lam : ℝ) : + Measurable (checkerRegField lam Lam (d := d)) := by + refine measurable_into_regCoeffField' ?_ ?_ + · intro y i j + exact measurable_apply_checkerRegField lam Lam y i j + (fun z _ => measurable_pi_apply z) + · intro i j φ hφ + exact measurable_entryTestR_checkerRegField lam Lam i j hφ + (fun z _ => measurable_pi_apply z) + +/-- The `U`-restricted checkerboard sample map is measurable into the carrier +from the σ-algebra of the coins whose cells meet `U`. -/ +theorem measurable_restrictReg_checkerRegField_sampleCellsSigma {d : ℕ} + (lam Lam : ℝ) (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable (Sample d) (RegCoeffField d) + (sampleCellsSigma (cellsMeeting U)) inferInstance + (fun ω => restrictReg U hU (checkerRegField lam Lam ω)) := by + classical + let : MeasurableSpace (Sample d) := sampleCellsSigma (cellsMeeting U) + change Measurable (fun ω : Sample d => restrictReg U hU (checkerRegField lam Lam ω)) + refine measurable_into_regCoeffField' ?_ ?_ + · intro y i j + have hEq : (fun ω : Sample d => restrictReg U hU (checkerRegField lam Lam ω) y i j) + = fun ω => Set.indicator U (fun y' => checkerRegField lam Lam ω y' i j) y := + funext fun ω => restrictReg_apply_entry U hU (checkerRegField lam Lam ω) y i j + rw [hEq] + by_cases hyU : y ∈ U + · simp only [Set.indicator_of_mem hyU] + refine measurable_apply_checkerRegField lam Lam y i j fun z hz => ?_ + exact measurable_eval_sampleCellsSigma (S := cellsMeeting U) ⟨y, hyU, hz⟩ + · simp only [Set.indicator_of_notMem hyU] + exact measurable_const + · intro i j φ hφ + have hEq : (fun ω : Sample d => + entryTestR i j φ (restrictReg U hU (checkerRegField lam Lam ω))) + = fun ω => entryTestR i j (Set.indicator U φ) (checkerRegField lam Lam ω) := + funext fun ω => entryTestR_restrictReg i j φ U hU (checkerRegField lam Lam ω) + rw [hEq] + refine measurable_entryTestR_checkerRegField lam Lam i j (hφ.indicator hU) + fun z hz => ?_ + have hsupp : Function.support (Set.indicator U φ) ⊆ U := by + intro x hxs + by_contra hxU + exact hxs (Set.indicator_of_notMem hxU φ) + exact measurable_eval_sampleCellsSigma (S := cellsMeeting U) + (cellsMeeting_mono hsupp hz) + +/-- The checkerboard sample map is measurable into the carrier restriction +σ-algebra `RestrictionSigmaR U` from the coins whose cells meet `U` — the +unit-range dependence input. -/ +theorem measurable_checkerRegField_restrictionSigmaR {d : ℕ} + (lam Lam : ℝ) (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable (Sample d) (RegCoeffField d) + (sampleCellsSigma (cellsMeeting U)) (RestrictionSigmaR U hU) + (checkerRegField lam Lam) := by + let : MeasurableSpace (Sample d) := sampleCellsSigma (cellsMeeting U) + rw [measurable_iff_comap_le, RestrictionSigmaR, MeasurableSpace.comap_comp] + exact (measurable_restrictReg_checkerRegField_sampleCellsSigma + lam Lam U hU).comap_le + +/-! ## Sample-space symmetries and carrier commutations -/ + +/-- Translate lattice indices by an integer vector. -/ +def translateLattice {d : ℕ} (z : Lattice d) (w : Lattice d) : Lattice d := + fun i => w i + z i + +/-- Translation of lattice indices is a bijection. -/ +def translateLatticeEquiv {d : ℕ} (z : Lattice d) : Lattice d ≃ Lattice d where + toFun := translateLattice z + invFun := fun w i => w i - z i + left_inv := by + intro w + funext i + simp [translateLattice] + right_inv := by + intro w + funext i + simp [translateLattice] + +/-- Shift a sample so that cell `w` reads the old coin at `w + z`. -/ +def shiftSample {d : ℕ} (z : Lattice d) (ω : Sample d) : Sample d := + fun w => ω (translateLattice z w) + +theorem shiftSample_eq_piCongrLeft {d : ℕ} (z : Lattice d) : + shiftSample z = + (MeasurableEquiv.piCongrLeft (fun _ : Lattice d => Bool) + (translateLatticeEquiv z).symm) := by + funext ω w + have h := + MeasurableEquiv.piCongrLeft_apply_apply + (e := (translateLatticeEquiv z).symm) + (β := fun _ : Lattice d => Bool) ω ((translateLatticeEquiv z) w) + simpa [shiftSample] using! h.symm + +theorem measurable_shiftSample {d : ℕ} (z : Lattice d) : + Measurable (shiftSample z : Sample d → Sample d) := by + rw [shiftSample_eq_piCongrLeft] + exact (MeasurableEquiv.piCongrLeft (fun _ : Lattice d => Bool) + (translateLatticeEquiv z).symm).measurable + +theorem sampleMeasure_map_shiftSample {d : ℕ} (z : Lattice d) + (p : ℝ≥0) (hp : p ≤ 1) : + Measure.map (shiftSample z) (sampleMeasure d p hp) = sampleMeasure d p hp := by + rw [shiftSample_eq_piCongrLeft] + have h := + Measure.infinitePi_map_piCongrLeft + (X := fun _ : Lattice d => Bool) + (μ := fun _ : Lattice d => coinMeasure p hp) + (e := (translateLatticeEquiv z).symm) + simpa [sampleMeasure] using h + +theorem openUnitCell_translateLattice_iff {d : ℕ} (z w : Lattice d) (x : Vec d) : + (fun i : Fin d => x i + (z i : ℝ)) ∈ openUnitCell (translateLattice z w) ↔ + x ∈ openUnitCell w := by + constructor + · intro hx i + have hi := hx i + simpa [translateLattice] using hi + · intro hx i + have hi := hx i + simpa [translateLattice] using hi + +theorem scalarAt_translate_intVec {d : ℕ} {lam Lam : ℝ} + (z : Lattice d) (ω : Sample d) (x : Vec d) : + scalarAt lam Lam ω (fun i : Fin d => x i + (z i : ℝ)) = + scalarAt lam Lam (shiftSample z ω) x := by + classical + by_cases hx : ∃ w : Lattice d, x ∈ openUnitCell w + · let w : Lattice d := Classical.choose hx + have hxw : x ∈ openUnitCell w := Classical.choose_spec hx + have hxshift : + (fun i : Fin d => x i + (z i : ℝ)) ∈ openUnitCell (translateLattice z w) := + (openUnitCell_translateLattice_iff z w x).2 hxw + simp [scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hxshift, + scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := shiftSample z ω) hxw, + shiftSample] + · have hxshift : + ¬ ∃ w : Lattice d, + (fun i : Fin d => x i + (z i : ℝ)) ∈ openUnitCell w := by + rintro ⟨w, hw⟩ + let w0 : Lattice d := (translateLatticeEquiv z).symm w + have hw_eq : translateLattice z w0 = w := by + exact (translateLatticeEquiv z).apply_symm_apply w + have hxw0 : x ∈ openUnitCell w0 := by + exact (openUnitCell_translateLattice_iff z w0 x).1 (by simpa [hw_eq] using hw) + exact hx ⟨w0, hxw0⟩ + simp [scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hxshift, + scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) (ω := shiftSample z ω) hx] + +/-- **Carrier commutation for translation**: the carrier translation +endomorphism intertwines the sample map with the lattice shift. -/ +theorem translateReg_checkerRegField {d : ℕ} {lam Lam : ℝ} + (z : Lattice d) (ω : Sample d) : + translateReg (intVecToRealVec z) (checkerRegField lam Lam ω) = + checkerRegField lam Lam (shiftSample z ω) := by + apply RegCoeffField.ext + intro x + show coeffField lam Lam ω (x + intVecToRealVec z) = + coeffField lam Lam (shiftSample z ω) x + have h : scalarAt lam Lam ω (x + intVecToRealVec z) = + scalarAt lam Lam (shiftSample z ω) x := by + simpa [intVecToRealVec] using! + scalarAt_translate_intVec (lam := lam) (Lam := Lam) z ω x + simp only [coeffField, h] + +/-! ## Unit-separation and coin independence -/ + +theorem dist_lt_one_of_mem_same_openUnitCell {d : ℕ} {x y : Vec d} {z : Lattice d} + (hx : x ∈ openUnitCell z) (hy : y ∈ openUnitCell z) : + dist x y < 1 := by + refine (dist_pi_lt_iff (by norm_num : (0 : ℝ) < 1)).2 fun i => ?_ + have hx_i := hx i + have hy_i := hy i + have hsplit : x i - y i = (x i - (z i : ℝ)) - (y i - (z i : ℝ)) := by ring + calc + dist (x i) (y i) = |x i - y i| := by rw [Real.dist_eq] + _ = |(x i - (z i : ℝ)) - (y i - (z i : ℝ))| := by rw [hsplit] + _ ≤ |x i - (z i : ℝ)| + |y i - (z i : ℝ)| := by + simpa [abs_sub_comm (z i : ℝ) (y i)] using + abs_sub_le (x i - (z i : ℝ)) 0 (y i - (z i : ℝ)) + _ < (1 / 2 : ℝ) + (1 / 2 : ℝ) := add_lt_add hx_i hy_i + _ = 1 := by norm_num + +theorem disjoint_cellsMeeting_of_areUnitSeparated {d : ℕ} {U V : Set (Vec d)} + (hUV : AreUnitSeparated U V) : + Disjoint (cellsMeeting U) (cellsMeeting V) := by + rw [Set.disjoint_left] + intro z hzU hzV + rcases hzU with ⟨x, hxU, hxz⟩ + rcases hzV with ⟨y, hyV, hyz⟩ + have hsep : 1 ≤ dist x y := hUV hxU hyV + have hlt : dist x y < 1 := dist_lt_one_of_mem_same_openUnitCell hxz hyz + exact not_le_of_gt hlt hsep + +theorem iIndep_sampleCoordinateSigma {d : ℕ} (p : ℝ≥0) (hp : p ≤ 1) : + ProbabilityTheory.iIndep + (fun z : Lattice d => sampleCoordinateSigma z) (sampleMeasure d p hp) := by + have hfun : + ProbabilityTheory.iIndepFun + (fun z : Lattice d => fun ω : Sample d => (fun b : Bool => b) (ω z)) + (sampleMeasure d p hp) := by + simpa [sampleMeasure] using + (ProbabilityTheory.iIndepFun_infinitePi + (P := fun _ : Lattice d => coinMeasure p hp) + (X := fun _ : Lattice d => fun b : Bool => b) + (mX := fun _ => measurable_id)) + have hraw := + (ProbabilityTheory.iIndepFun_iff_iIndep + (m := fun _ : Lattice d => inferInstance) + (f := fun z : Lattice d => fun ω : Sample d => (fun b : Bool => b) (ω z)) + (μ := sampleMeasure d p hp)).1 hfun + simpa [sampleCoordinateSigma] using hraw + +theorem indep_sampleCellsSigma_of_disjoint {d : ℕ} {S T : Set (Lattice d)} + (hST : Disjoint S T) (p : ℝ≥0) (hp : p ≤ 1) : + ProbabilityTheory.Indep (sampleCellsSigma S) (sampleCellsSigma T) (sampleMeasure d p hp) := by + have hle : + ∀ z : Lattice d, + sampleCoordinateSigma z ≤ (inferInstance : MeasurableSpace (Sample d)) := by + intro z + exact (measurable_pi_apply z).comap_le + have hInd := iIndep_sampleCoordinateSigma (d := d) p hp + simpa [sampleCellsSigma] using + (ProbabilityTheory.indep_iSup_of_disjoint + (m := fun z : Lattice d => sampleCoordinateSigma z) + (μ := sampleMeasure d p hp) hle hInd (S := S) (T := T) hST) + +/-! ## Signed-permutation symmetry -/ + +def signInt (r : ℝ) : ℤ := + if r = 1 then 1 else -1 + +theorem signInt_cast_eq {r : ℝ} (hr : r = 1 ∨ r = -1) : + (signInt r : ℝ) = r := by + rcases hr with h | h + · subst r + norm_num [signInt] + · subst r + norm_num [signInt] + +theorem signInt_mul_self {r : ℝ} (hr : r = 1 ∨ r = -1) : + signInt r * signInt r = 1 := by + rcases hr with h | h + · subst r + norm_num [signInt] + · subst r + norm_num [signInt] + +def signedLatticeEquiv {d : ℕ} (σ : Equiv.Perm (Fin d)) (s : Fin d → ℝ) + (hs : ∀ i, s i = 1 ∨ s i = -1) : Lattice d ≃ Lattice d where + toFun := fun w i => signInt (s (σ.symm i)) * w (σ.symm i) + invFun := fun w i => signInt (s i) * w (σ i) + left_inv := by + intro w + funext i + have hsq := signInt_mul_self (hs i) + dsimp + rw [Equiv.symm_apply_apply] + calc + signInt (s i) * (signInt (s i) * w i) + = (signInt (s i) * signInt (s i)) * w i := by ring + _ = w i := by simp [hsq] + right_inv := by + intro w + funext i + have hsq := signInt_mul_self (hs (σ.symm i)) + dsimp + rw [Equiv.apply_symm_apply] + calc + signInt (s (σ.symm i)) * (signInt (s (σ.symm i)) * w i) + = (signInt (s (σ.symm i)) * signInt (s (σ.symm i))) * w i := by ring + _ = w i := by simp [hsq] + +theorem signedLatticeEquiv_apply_sigma {d : ℕ} (σ : Equiv.Perm (Fin d)) + (s : Fin d → ℝ) (hs : ∀ i, s i = 1 ∨ s i = -1) + (w : Lattice d) (i : Fin d) : + signedLatticeEquiv σ s hs w (σ i) = signInt (s i) * w i := by + simp [signedLatticeEquiv] + +def reindexSample {d : ℕ} (e : Lattice d ≃ Lattice d) (ω : Sample d) : Sample d := + fun w => ω (e w) + +theorem reindexSample_eq_piCongrLeft {d : ℕ} (e : Lattice d ≃ Lattice d) : + reindexSample e = + (MeasurableEquiv.piCongrLeft (fun _ : Lattice d => Bool) e.symm) := by + funext ω w + have h := + MeasurableEquiv.piCongrLeft_apply_apply + (e := e.symm) (β := fun _ : Lattice d => Bool) ω (e w) + simpa [reindexSample] using h.symm + +theorem measurable_reindexSample {d : ℕ} (e : Lattice d ≃ Lattice d) : + Measurable (reindexSample e : Sample d → Sample d) := by + rw [reindexSample_eq_piCongrLeft] + exact (MeasurableEquiv.piCongrLeft (fun _ : Lattice d => Bool) e.symm).measurable + +theorem sampleMeasure_map_reindexSample {d : ℕ} (e : Lattice d ≃ Lattice d) + (p : ℝ≥0) (hp : p ≤ 1) : + Measure.map (reindexSample e) (sampleMeasure d p hp) = sampleMeasure d p hp := by + rw [reindexSample_eq_piCongrLeft] + have h := + Measure.infinitePi_map_piCongrLeft + (X := fun _ : Lattice d => Bool) + (μ := fun _ : Lattice d => coinMeasure p hp) + (e := e.symm) + simpa [sampleMeasure] using h + +theorem matVecMul_signedPermutation_apply {d : ℕ} {R : Mat d} + {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (_hs : ∀ i, s i = 1 ∨ s i = -1) + (hR : ∀ i j, R i j = if i = σ j then s j else 0) + (x : Vec d) (i : Fin d) : + matVecMul R x i = s (σ.symm i) * x (σ.symm i) := by + unfold matVecMul + rw [Finset.sum_eq_single (σ.symm i)] + · rw [hR i (σ.symm i)] + simp + · intro j _ hj + rw [hR i j] + have hij : i ≠ σ j := by + intro hij + apply hj + exact σ.injective (by simpa using hij.symm) + simp [hij] + · intro hnot + exact (hnot (Finset.mem_univ _)).elim + +theorem openUnitCell_signedPermutation_iff {d : ℕ} {R : Mat d} + {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (hs : ∀ i, s i = 1 ∨ s i = -1) + (hR : ∀ i j, R i j = if i = σ j then s j else 0) + (w : Lattice d) (x : Vec d) : + matVecMul R x ∈ openUnitCell (signedLatticeEquiv σ s hs w) ↔ + x ∈ openUnitCell w := by + constructor + · intro hx i + have hcoord := hx (σ i) + have hmul := signInt_cast_eq (hs i) + have hrewrite : + matVecMul R x (σ i) - (signedLatticeEquiv σ s hs w (σ i) : ℝ) = + s i * (x i - (w i : ℝ)) := by + rw [matVecMul_signedPermutation_apply hs hR] + simp [signedLatticeEquiv_apply_sigma, hmul] + ring + rw [hrewrite] at hcoord + rcases hs i with hsi | hsi + · simpa [hsi] using hcoord + · simpa [hsi, abs_sub_comm] using hcoord + · intro hx i + let j : Fin d := σ.symm i + have hxj := hx j + have hmul := signInt_cast_eq (hs j) + have hrewrite : + matVecMul R x i - (signedLatticeEquiv σ s hs w i : ℝ) = + s j * (x j - (w j : ℝ)) := by + rw [matVecMul_signedPermutation_apply hs hR] + simp [j, signedLatticeEquiv, hmul] + ring + rw [hrewrite] + rcases hs j with hsj | hsj + · simpa [hsj] using hxj + · simpa [hsj, abs_sub_comm] using hxj + +theorem scalarAt_signedPermutation {d : ℕ} {lam Lam : ℝ} {R : Mat d} + {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (hs : ∀ i, s i = 1 ∨ s i = -1) + (hR : ∀ i j, R i j = if i = σ j then s j else 0) + (ω : Sample d) (x : Vec d) : + scalarAt lam Lam ω (matVecMul R x) = + scalarAt lam Lam (reindexSample (signedLatticeEquiv σ s hs) ω) x := by + classical + by_cases hx : ∃ w : Lattice d, x ∈ openUnitCell w + · let w : Lattice d := Classical.choose hx + have hxw : x ∈ openUnitCell w := Classical.choose_spec hx + have hRx : + matVecMul R x ∈ openUnitCell (signedLatticeEquiv σ s hs w) := + (openUnitCell_signedPermutation_iff hs hR w x).2 hxw + simp [scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hRx, + scalarAt_of_mem_openUnitCell (lam := lam) (Lam := Lam) + (ω := reindexSample (signedLatticeEquiv σ s hs) ω) hxw, + reindexSample] + · have hRx : + ¬ ∃ w : Lattice d, matVecMul R x ∈ openUnitCell w := by + rintro ⟨w, hw⟩ + let w0 : Lattice d := (signedLatticeEquiv σ s hs).symm w + have hw_eq : signedLatticeEquiv σ s hs w0 = w := + (signedLatticeEquiv σ s hs).apply_symm_apply w + have hxw0 : x ∈ openUnitCell w0 := + (openUnitCell_signedPermutation_iff hs hR w0 x).1 (by simpa [hw_eq] using hw) + exact hx ⟨w0, hxw0⟩ + simp [scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) (ω := ω) hRx, + scalarAt_of_not_mem_any_openUnitCell (lam := lam) (Lam := Lam) + (ω := reindexSample (signedLatticeEquiv σ s hs) ω) hx] + +/-- **Carrier commutation for rotation**: the carrier signed-permutation +endomorphism intertwines the sample map with the lattice reindexing. -/ +theorem rotateReg_checkerRegField {d : ℕ} {lam Lam : ℝ} {R : Mat d} + {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (hs : ∀ i, s i = 1 ∨ s i = -1) + (hRdef : ∀ i j, R i j = if i = σ j then s j else 0) + (hR : IsSignedPermutationMatrix R) (ω : Sample d) : + rotateReg R hR (checkerRegField lam Lam ω) = + checkerRegField lam Lam (reindexSample (signedLatticeEquiv σ s hs) ω) := by + apply RegCoeffField.ext + intro x + show (matTranspose R) * (coeffField lam Lam ω (matVecMul R x)) * R = + coeffField lam Lam (reindexSample (signedLatticeEquiv σ s hs) ω) x + have hscalar : + scalarAt lam Lam ω (matVecMul R x) = + scalarAt lam Lam (reindexSample (signedLatticeEquiv σ s hs) ω) x := + scalarAt_signedPermutation hs hRdef ω x + simp [coeffField, scalarMatrix, hscalar, hR.transpose_mul_self] + +/-- **Carrier commutation for the adjoint**: every checkerboard realization is +symmetric (a scalar matrix field), so the carrier adjoint fixes it. -/ +theorem adjointReg_checkerRegField {d : ℕ} {lam Lam : ℝ} (ω : Sample d) : + adjointReg (checkerRegField lam Lam ω) = checkerRegField lam Lam ω := by + apply RegCoeffField.ext + intro x + show (coeffField lam Lam ω x).transpose = coeffField lam Lam ω x + funext i j + by_cases hij : i = j + · subst j + simp [coeffField, scalarMatrix] + · have hji : j ≠ i := Ne.symm hij + simp [coeffField, Matrix.transpose_apply, scalarMatrix, + Matrix.one_apply_ne hij, Matrix.one_apply_ne hji] + +end + +end RandomCheckerboard +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/CarrierLaw.lean b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/CarrierLaw.lean new file mode 100644 index 0000000000..daa8b315fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/CarrierLaw.lean @@ -0,0 +1,359 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.DilationLaw +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity + +/-! +# The Bernoulli checkerboard carrier law and its instances + +This file packages the carrier-valued checkerboard sample map of `Basic.lean` +as a law on the honest-fields carrier and re-proves the full law-level +instance stack on the carrier: + +* `law` — the pushforward `Measure.map (checkerRegField lam Lam)` of the + Bernoulli product measure, a probability measure on `RegCoeffField d`; +* `lawCarrier` — via `lawCarrier_of_aeLocallyUniformlyElliptic` (a.e. + ellipticity holds per sample, everywhere, with deterministic constants); +* `structuralLaw` — stationarity/isotropy/adjoint invariance from the carrier + endomorphism commutations of `Basic.lean`, and genuine restriction-unit-range + dependence (`IsRestrictionUnitRangeDependentR`) through `RestrictionSigmaR` + and the coin σ-algebras; +* `thetaEllipticLaw` — the conjunct-free `Θ`-ellipticity class membership; +* the triadically scaled family (`scaledLaw`, `checkerboardSetup`) and the + public quenched-comparison corollary. +-/ + +@[expose] public section + +namespace Homogenization +namespace Examples +namespace RandomCheckerboard + +open MeasureTheory +open scoped ENNReal NNReal + +noncomputable section + +/-- The unscaled checkerboard law on the honest-fields carrier. -/ +def law (d : ℕ) (lam Lam : ℝ) (p : ℝ≥0) (hp : p ≤ 1) : Book.Ch04.RestrictionCoeffLaw d := + Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp) + +instance instIsProbabilityMeasure_law (d : ℕ) (lam Lam : ℝ) (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (law d lam Lam p hp) := by + rw [law] + exact Measure.isProbabilityMeasure_map + (measurable_checkerRegField (d := d) lam Lam).aemeasurable + +theorem isProbabilityMeasure_law (d : ℕ) (lam Lam : ℝ) (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (law d lam Lam p hp) := + inferInstance + +/-! ## Uniform ellipticity and the law carrier -/ + +theorem law_uniformEllipticityBounds {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Book.MainResults.UniformEllipticityBounds (law d lam Lam p hp) lam Lam where + lam_pos := hlam + lam_le_Lam := hle + aee_elliptic := by + rw [law] + refine (ae_map_iff (measurable_checkerRegField (d := d) lam Lam).aemeasurable + ?_).2 ?_ + · exact measurableSet_forall_openCubeSet_isAEEllipticFieldOn lam Lam + · exact Filter.Eventually.of_forall fun ω Q => + checkerRegField_isAEEllipticFieldOn (measurableSet_openCubeSet Q) hlam hle ω + +theorem lawCarrier {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionLawCarrier (law d lam Lam p hp) := + Book.Ch04.lawCarrier_of_aeLocallyUniformlyElliptic + (law_uniformEllipticityBounds (d := d) hlam hle p hp).toAELocallyUniformlyEllipticLaw + +/-! ## Structural law -/ + +theorem stationary_law {d : ℕ} {lam Lam : ℝ} (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionStationaryLaw (law d lam Lam p hp) := by + intro z + rw [law] + calc + Measure.map (translateReg (intVecToRealVec z)) + (Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp)) + = + Measure.map + (fun ω : Sample d => translateReg (intVecToRealVec z) (checkerRegField lam Lam ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp_def] using! + (Measure.map_map + (measurable_translateReg (d := d) (intVecToRealVec z)) + (measurable_checkerRegField (d := d) lam Lam) + (μ := sampleMeasure d p hp)) + _ = + Measure.map + (fun ω : Sample d => checkerRegField lam Lam (shiftSample z ω)) + (sampleMeasure d p hp) := by + congr 1 + funext ω + exact translateReg_checkerRegField z ω + _ = + Measure.map (checkerRegField lam Lam) + (Measure.map (shiftSample z) (sampleMeasure d p hp)) := by + symm + simpa [Function.comp_def] using! + (Measure.map_map + (measurable_checkerRegField (d := d) lam Lam) + (measurable_shiftSample z) + (μ := sampleMeasure d p hp)) + _ = Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp) := by + rw [sampleMeasure_map_shiftSample z p hp] + +theorem adjointInvariant_law {d : ℕ} {lam Lam : ℝ} (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionAdjointInvariantLaw (law d lam Lam p hp) := by + show Measure.map adjointReg (law d lam Lam p hp) = law d lam Lam p hp + rw [law] + calc + Measure.map adjointReg (Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp)) + = + Measure.map + (fun ω : Sample d => adjointReg (checkerRegField lam Lam ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp_def] using! + (Measure.map_map + (measurable_adjointReg (d := d)) + (measurable_checkerRegField (d := d) lam Lam) + (μ := sampleMeasure d p hp)) + _ = Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp) := by + congr 1 + funext ω + exact adjointReg_checkerRegField ω + +theorem isotropic_law {d : ℕ} {lam Lam : ℝ} (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionIsotropicLaw (law d lam Lam p hp) := by + intro R hR + obtain ⟨σ, s, hs, hRdef⟩ := id hR + rw [law] + let e : Lattice d ≃ Lattice d := signedLatticeEquiv σ s hs + calc + Measure.map (rotateReg R hR) + (Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp)) + = + Measure.map + (fun ω : Sample d => rotateReg R hR (checkerRegField lam Lam ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp_def] using! + (Measure.map_map + (measurable_rotateReg (d := d) R hR) + (measurable_checkerRegField (d := d) lam Lam) + (μ := sampleMeasure d p hp)) + _ = + Measure.map + (fun ω : Sample d => checkerRegField lam Lam (reindexSample e ω)) + (sampleMeasure d p hp) := by + congr 1 + funext ω + exact rotateReg_checkerRegField (lam := lam) (Lam := Lam) hs hRdef hR ω + _ = + Measure.map (checkerRegField lam Lam) + (Measure.map (reindexSample e) (sampleMeasure d p hp)) := by + symm + simpa [Function.comp_def, e] using! + (Measure.map_map + (measurable_checkerRegField (d := d) lam Lam) + (measurable_reindexSample e) + (μ := sampleMeasure d p hp)) + _ = Measure.map (checkerRegField lam Lam) (sampleMeasure d p hp) := by + rw [sampleMeasure_map_reindexSample e p hp] + +/-- **Genuine restriction-unit-range dependence on the carrier**: the restriction +σ-algebras of unit-separated measurable sets pull back through the sample map +into the coin σ-algebras of disjoint cell families, which are independent under +the Bernoulli product law. -/ +theorem restrictionUnitRangeDependent_law {d : ℕ} {lam Lam : ℝ} + (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionUnitRangeDependentLaw (law d lam Lam p hp) := by + intro U V hU hV hUV + rw [law] + have hcells : Disjoint (cellsMeeting U) (cellsMeeting V) := + disjoint_cellsMeeting_of_areUnitSeparated hUV + have hIndCells : + ProbabilityTheory.Indep + (sampleCellsSigma (cellsMeeting U)) + (sampleCellsSigma (cellsMeeting V)) + (sampleMeasure d p hp) := + indep_sampleCellsSigma_of_disjoint hcells p hp + rw [ProbabilityTheory.Indep_iff] + intro s t hs ht + have hmeas := measurable_checkerRegField (d := d) lam Lam + have hs_ambient : MeasurableSet s := restrictionSigmaR_le U hU s hs + have ht_ambient : MeasurableSet t := restrictionSigmaR_le V hV t ht + have hst_ambient : MeasurableSet (s ∩ t) := hs_ambient.inter ht_ambient + have hs_pre : + @MeasurableSet (Sample d) (sampleCellsSigma (cellsMeeting U)) + (checkerRegField lam Lam ⁻¹' s) := + (measurable_checkerRegField_restrictionSigmaR lam Lam U hU) hs + have ht_pre : + @MeasurableSet (Sample d) (sampleCellsSigma (cellsMeeting V)) + (checkerRegField lam Lam ⁻¹' t) := + (measurable_checkerRegField_restrictionSigmaR lam Lam V hV) ht + have hpre_ind := + (ProbabilityTheory.Indep_iff + (sampleCellsSigma (cellsMeeting U)) + (sampleCellsSigma (cellsMeeting V)) + (sampleMeasure d p hp)).1 hIndCells + (checkerRegField lam Lam ⁻¹' s) + (checkerRegField lam Lam ⁻¹' t) + hs_pre ht_pre + rw [Measure.map_apply hmeas hst_ambient, + Measure.map_apply hmeas hs_ambient, + Measure.map_apply hmeas ht_ambient] + simpa [Set.preimage_inter] using hpre_ind + +/-- The unscaled Bernoulli checkerboard law satisfies all structural +assumptions used by the public main results. -/ +theorem structuralLaw {d : ℕ} {lam Lam : ℝ} (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.RestrictionStructuralLaw (law d lam Lam p hp) where + stationary := stationary_law p hp + unit_range := restrictionUnitRangeDependent_law p hp + isotropic := isotropic_law p hp + adjoint_invariant := adjointInvariant_law p hp + +/-! ## The `Θ`-ellipticity class -/ + +/-- **Conjunct-free `Θ`-ellipticity of the checkerboard law**: when +`1 ≤ lam ≤ Lam ≤ Θ`, almost every realization lies a.e. (in fact everywhere) +in the `(1, Θ)` ellipticity class. The measurability conjunct of the paper's +class `Ω_Θ` is free by the carrier type (decision E-2). -/ +theorem thetaEllipticLaw {d : ℕ} {lam Lam Θ : ℝ} + (h1 : 1 ≤ lam) (hle : lam ≤ Lam) (hΘ : Lam ≤ Θ) (p : ℝ≥0) (hp : p ≤ 1) : + Homogenization.ThetaEllipticLaw Θ (law d lam Lam p hp) := by + unfold Homogenization.ThetaEllipticLaw + rw [law] + refine (ae_map_iff (measurable_checkerRegField (d := d) lam Lam).aemeasurable + (measurableSet_ae_isEllipticMatrix_univ 1 Θ)).2 ?_ + refine Filter.Eventually.of_forall fun ω => ?_ + refine Filter.Eventually.of_forall fun x => ?_ + exact (scalarMatrix_isEllipticMatrix_between (d := d) + (lt_of_lt_of_le one_pos h1) hle + (scalarAt_eq_lam_or_Lam (lam := lam) (Lam := Lam) ω x)).mono + one_pos h1 hΘ + +/-! ## The scaled law and the public setup -/ + +/-- The scaled checkerboard law used by the public corollary. -/ +def scaledLaw (d : ℕ) (lam Lam : ℝ) (p : ℝ≥0) (hp : p ≤ 1) (k : ℕ) : + Book.Ch04.RestrictionCoeffLaw d := + Book.Ch04.restrictionScaleNormalizedLaw k (law d lam Lam p hp) + +/-- The reader-facing checkerboard scale. A single triadic downscaling already +makes the application visibly a scaled law while preserving all constants as +dimension-only constants in the main theorem. -/ +def publicScale : ℕ := 1 + +/-- The scaled checkerboard law has the Chapter 4 law carrier. -/ +theorem scaledLawCarrier {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) (k : ℕ) : + Book.Ch04.RestrictionLawCarrier (scaledLaw d lam Lam p hp k) := by + simpa [scaledLaw] using + (lawCarrier (d := d) (lam := lam) (Lam := Lam) hlam hle p hp).scaleNormalized k + +/-- Every triadically rescaled checkerboard realization keeps the deterministic +ellipticity constants. -/ +theorem rescaleReg_checkerRegField_isAEEllipticFieldOn {d : ℕ} {lam Lam : ℝ} + (k : ℕ) {U : Set (Vec d)} (hU : MeasurableSet U) + (hlam : 0 < lam) (hle : lam ≤ Lam) (ω : Sample d) : + IsAEEllipticFieldOn lam Lam U (rescaleReg k (checkerRegField lam Lam ω)).toFun := by + rw [isAEEllipticFieldOn_carrier_iff hU lam Lam] + refine Filter.Eventually.of_forall fun x => ?_ + exact scalarMatrix_isEllipticMatrix_between (d := d) hlam hle + (scalarAt_eq_lam_or_Lam (lam := lam) (Lam := Lam) ω (((3 : ℝ) ^ k) • x)) + +/-- The scaled checkerboard law remains uniformly elliptic with the same +deterministic constants. -/ +theorem scaledUniformEllipticityBounds {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) (k : ℕ) : + Book.MainResults.UniformEllipticityBounds (scaledLaw d lam Lam p hp k) lam Lam where + lam_pos := hlam + lam_le_Lam := hle + aee_elliptic := by + rw [scaledLaw, Book.Ch04.restrictionScaleNormalizedLaw_eq_map_rescaleReg, law, + Measure.map_map (measurable_rescaleReg (d := d) k) + (measurable_checkerRegField (d := d) lam Lam)] + have hcomp : Measurable (rescaleReg (d := d) k ∘ checkerRegField lam Lam) := + (measurable_rescaleReg (d := d) k).comp (measurable_checkerRegField (d := d) lam Lam) + refine (ae_map_iff hcomp.aemeasurable ?_).2 ?_ + · exact measurableSet_forall_openCubeSet_isAEEllipticFieldOn lam Lam + · exact Filter.Eventually.of_forall fun ω Q => + rescaleReg_checkerRegField_isAEEllipticFieldOn k + (measurableSet_openCubeSet Q) hlam hle ω + +/-- The scaled checkerboard law satisfies the structural assumptions. -/ +theorem scaledStructuralLaw {d : ℕ} {lam Lam : ℝ} + (p : ℝ≥0) (hp : p ≤ 1) (k : ℕ) : + Book.Ch04.RestrictionStructuralLaw (scaledLaw d lam Lam p hp k) := by + simpa [scaledLaw] using + (structuralLaw (d := d) (lam := lam) (Lam := Lam) p hp).scaleNormalized k + +/-- The main-result setup associated with the scaled Bernoulli checkerboard. -/ +def checkerboardSetup {d : ℕ} [NeZero d] + (two_le_dim : 2 ≤ d) (lam Lam : ℝ) (hlam : 0 < lam) (hle : lam ≤ Lam) + (p : ℝ≥0) (hp : p ≤ 1) : Book.MainResults.Setup d where + two_le_dim := two_le_dim + P := scaledLaw d lam Lam p hp publicScale + hP := scaledLawCarrier (d := d) (lam := lam) (Lam := Lam) + hlam hle p hp publicScale + hStruct := scaledStructuralLaw (d := d) (lam := lam) (Lam := Lam) + p hp publicScale + lam := lam + Lam := Lam + hUE := scaledUniformEllipticityBounds (d := d) (lam := lam) (Lam := Lam) + hlam hle p hp publicScale + +/-- **Quenched comparison for the Bernoulli checkerboard.** + +For the triadically scaled Bernoulli checkerboard with coin parameter `p` and +conductances `lam`, `Lam`, all law assumptions in the public uniform-ellipticity +comparison theorem are discharged by the construction. The constants are chosen +before `lam`, `Lam`, `p`, the realization, the cube, the forcing, and the +solutions. -/ +theorem randomCheckerboard_quenchedComparison + {d : ℕ} [NeZero d] : + ∃ C α Cscale : ℝ, + 0 < C ∧ 0 < α ∧ 0 < Cscale ∧ + ∀ (two_le_dim : 2 ≤ d) (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) + (p : ℝ≥0) (hp : p ≤ 1), + let S : Book.MainResults.Setup d := + checkerboardSetup two_le_dim lam Lam hlam hle p hp + ∃ sigmaBar : ℝ, + 0 < sigmaBar ∧ + ∃ X : RegCoeffField d → ℝ, + S.IsMinimalScale X Cscale ∧ + ∀ᵐ aω ∂S.P, + ∀ (ha : Book.Ch04.AELocallyUniformlyEllipticField aω) + {m : ℕ} {g : Vec d → Vec d} + (pair : S.ComparisonPair aω ha m g), + X aω ≤ (3 : ℝ) ^ m → + Book.Ch03.Legacy.ForceSobolevRegularity + (Book.MainResults.originCube d m) Book.MainResults.fixedComparisonS g → + S.comparisonDefect Book.MainResults.fixedComparisonS pair ≤ + C * ((3 : ℝ) ^ m / X aω) ^ (-α) * + S.comparisonData Book.MainResults.fixedComparisonS pair := by + classical + obtain ⟨C, α, Cscale, hC, hα, hCscale, hmain⟩ := + Book.MainResults.homogenizationComparison_uniformEllipticity (d := d) + refine ⟨C, α, Cscale, hC, hα, hCscale, ?_⟩ + intro two_le_dim lam Lam hlam hle p hp + exact hmain (checkerboardSetup two_le_dim lam Lam hlam hle p hp) + +end + +end RandomCheckerboard +end Examples +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/SourceLaw.lean b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/SourceLaw.lean new file mode 100644 index 0000000000..2875a83611 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Examples/RandomCheckerboard/SourceLaw.lean @@ -0,0 +1,433 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Examples.RandomCheckerboard.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.SourceLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RescaledLaws +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.RegIntegralAdapter +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.RestrictionBridge + +/-! +# Exact-source law for the refined Bernoulli checkerboard + +The unit-cell checkerboard is only a restriction-local example: in dimension +at least two, sup-metric cell separation is weaker than Euclidean separation. +Here we use the dimension-safe refinement `d + 1`; after triadic rescaling, +Euclidean unit separation forces the two observations to use disjoint families +of Bernoulli coins. +-/ + +@[expose] public section + +namespace Homogenization.Examples.RandomCheckerboard.Source + +open MeasureTheory +open scoped ENNReal NNReal + +noncomputable section + +attribute [local instance] Classical.propDecidable + +/-- The dimension-safe triadic refinement used by the exact-source checkerboard. -/ +def refinementScale (d : ℕ) : ℕ := d + 1 + +private def ellipticityConstant (lam Lam : ℝ) : ℝ := min lam (min 1 Lam⁻¹) + +private theorem ellipticityConstant_pos {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) : + 0 < ellipticityConstant lam Lam := by + unfold ellipticityConstant + refine lt_min hlam ?_ + refine lt_min zero_lt_one ?_ + exact inv_pos.mpr (lt_of_lt_of_le hlam hle) + +private theorem ellipticityConstant_le_one (lam Lam : ℝ) : + ellipticityConstant lam Lam ≤ 1 := by + unfold ellipticityConstant + exact le_trans (min_le_right _ _) (min_le_left _ _) + +private theorem ellipticityConstant_le_lam (lam Lam : ℝ) : + ellipticityConstant lam Lam ≤ lam := by + exact min_le_left _ _ + +private theorem Lam_le_ellipticityConstant_inv {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) : + Lam ≤ (ellipticityConstant lam Lam)⁻¹ := by + apply (le_inv_comm₀ (lt_of_lt_of_le hlam hle) (ellipticityConstant_pos hlam hle)).2 + exact le_trans (min_le_right _ _) (min_le_right _ _) + +/-- The literal exact-source carrier realization of one checkerboard sample. -/ +def checkerCarrier {d : ℕ} (lam Lam : ℝ) (hlam : 0 < lam) (hle : lam ≤ Lam) + (ω : Sample d) : Source.Coarse.Carrier d where + val := coeffField lam Lam ω + property := by + constructor + · intro i j + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (measurable_coeffField_spatial (lam := lam) (Lam := Lam) ω) i)) j + · intro R _hR + refine ⟨ellipticityConstant lam Lam, ellipticityConstant_pos hlam hle, + ellipticityConstant_le_one lam Lam, ?_⟩ + intro x _hx + exact (scalarMatrix_isEllipticMatrix_between (d := d) hlam hle + (scalarAt_eq_lam_or_Lam (lam := lam) (Lam := Lam) ω x)).mono + (ellipticityConstant_pos hlam hle) + (ellipticityConstant_le_lam lam Lam) + (Lam_le_ellipticityConstant_inv hlam hle) + +/-- The refined exact-source carrier realization. -/ +def refinedCheckerCarrier {d : ℕ} (lam Lam : ℝ) (hlam : 0 < lam) (hle : lam ≤ Lam) + (ω : Sample d) : Source.Coarse.Carrier d := + Source.Coarse.Carrier.rescale (refinementScale d) (checkerCarrier lam Lam hlam hle ω) + +/-- The base source realization has the existing checkerboard as its regular realization. -/ +private theorem coarseToRegular_checkerCarrier {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) (ω : Sample d) : + Source.Coarse.coarseToRegular (checkerCarrier lam Lam hlam hle ω) = + checkerRegField lam Lam ω := by + apply RegCoeffField.ext + intro x + rfl + +private theorem measurable_checkerCarrier_local {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable (Sample d) (Source.Coarse.Carrier d) + (sampleCellsSigma (cellsMeeting U)) (Source.Coarse.localSigma U hU) + (checkerCarrier lam Lam hlam hle) := by + have hregular : @Measurable (Sample d) (RegCoeffField d) + (sampleCellsSigma (cellsMeeting U)) (LocalSigmaR U) + (checkerRegField lam Lam) := + (measurable_checkerRegField_restrictionSigmaR lam Lam U hU).mono le_rfl + (localSigmaR_le_restrictionSigmaR U hU) + have hcomposite : @Measurable (Sample d) (RegCoeffField d) + (sampleCellsSigma (cellsMeeting U)) (LocalSigmaR U) + (Source.Coarse.coarseToRegular ∘ checkerCarrier lam Lam hlam hle) := by + simpa only [Function.comp_apply, coarseToRegular_checkerCarrier] using! hregular + rw [measurable_iff_comap_le] + calc + MeasurableSpace.comap (checkerCarrier lam Lam hlam hle) (Source.Coarse.localSigma U hU) + ≤ MeasurableSpace.comap (checkerCarrier lam Lam hlam hle) + (MeasurableSpace.comap Source.Coarse.coarseToRegular (LocalSigmaR U)) := + MeasurableSpace.comap_mono (Source.Coarse.coarseLocalSigma_le_comap_localSigmaR U hU) + _ = MeasurableSpace.comap + (Source.Coarse.coarseToRegular ∘ checkerCarrier lam Lam hlam hle) (LocalSigmaR U) := + MeasurableSpace.comap_comp + _ ≤ sampleCellsSigma (cellsMeeting U) := hcomposite.comap_le + +private theorem measurable_refinedCheckerCarrier_local {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable (Sample d) (Source.Coarse.Carrier d) + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) U))) + (Source.Coarse.localSigma U hU) + (refinedCheckerCarrier lam Lam hlam hle) := by + let hDU : MeasurableSet (triadicDilateSet (refinementScale d) U) := + Source.Coarse.measurableSet_triadicDilateSet (refinementScale d) hU + have hbase := measurable_checkerCarrier_local lam Lam hlam hle + (triadicDilateSet (refinementScale d) U) hDU + exact (Source.Coarse.measurable_rescale_localSigma (refinementScale d) U hU).comp hbase + +private theorem euclideanNorm_lt_dim_succ_of_abs_lt_one {d : ℕ} {x : Vec d} + (hx : ∀ i : Fin d, |x i| < 1) : + euclideanNorm x < (d : ℝ) + 1 := by + have hsq : ∀ i : Fin d, x i ^ 2 ≤ 1 := by + intro i + have hleft : -1 < x i := (abs_lt.mp (hx i)).1 + have hright : x i < 1 := (abs_lt.mp (hx i)).2 + have hmul : 0 < (1 - x i) * (1 + x i) := + mul_pos (by linarith) (by linarith) + nlinarith + have hsum : (∑ i : Fin d, x i ^ 2) ≤ (d : ℝ) := by + calc + ∑ i : Fin d, x i ^ 2 ≤ ∑ _i : Fin d, (1 : ℝ) := + Finset.sum_le_sum fun i _ => hsq i + _ = d := by simp + have hsum_nonneg : 0 ≤ ∑ i : Fin d, |x i| ^ 2 := by positivity + have hsum_abs : (∑ i : Fin d, |x i| ^ 2) ≤ (d : ℝ) := by + simpa [sq_abs] using hsum + have htarget : (∑ i : Fin d, |x i| ^ 2) < ((d : ℝ) + 1) ^ 2 := by + nlinarith [show (0 : ℝ) ≤ d by positivity] + unfold euclideanNorm + change Real.sqrt (vecNormSq x) < (d : ℝ) + 1 + by_contra hnot + have hle : (d : ℝ) + 1 ≤ Real.sqrt (vecNormSq x) := + le_of_not_gt hnot + have hvec : vecNormSq x ≤ (d : ℝ) := by + simpa [vecNormSq, vecDot, pow_two, sq_abs] using hsum_abs + nlinarith [Real.sq_sqrt (vecNormSq_nonneg x), Real.sqrt_nonneg (vecNormSq x)] + +private theorem euclideanDist_lt_dim_succ_of_mem_same_openUnitCell {d : ℕ} + {x y : Vec d} {z : Lattice d} (hx : x ∈ openUnitCell z) (hy : y ∈ openUnitCell z) : + euclideanDist x y < (d : ℝ) + 1 := by + apply euclideanNorm_lt_dim_succ_of_abs_lt_one + intro i + have hx_i := hx i + have hy_i := hy i + have hsplit : x i - y i = (x i - (z i : ℝ)) - (y i - (z i : ℝ)) := by ring + calc + |(x - y) i| = |x i - y i| := rfl + _ = |(x i - (z i : ℝ)) - (y i - (z i : ℝ))| := by rw [hsplit] + _ ≤ |x i - (z i : ℝ)| + |y i - (z i : ℝ)| := by + simpa [abs_sub_comm (z i : ℝ) (y i : ℝ)] using + abs_sub_le (x i - (z i : ℝ)) 0 (y i - (z i : ℝ)) + _ < (1 / 2 : ℝ) + (1 / 2 : ℝ) := add_lt_add hx_i hy_i + _ = 1 := by norm_num + +private theorem dim_succ_le_triadicScale (d : ℕ) : + (d : ℝ) + 1 ≤ (3 : ℝ) ^ refinementScale d := by + have hnat : d + 1 ≤ 3 ^ (d + 1) := by + induction d with + | zero => norm_num + | succ d hd => + calc + d.succ + 1 = (d + 1) + 1 := by omega + _ ≤ 3 ^ (d + 1) + 3 ^ (d + 1) := + Nat.add_le_add hd (Nat.one_le_pow (d + 1) 3 (by omega)) + _ = 3 ^ (d + 1) * 2 := by omega + _ ≤ 3 ^ (d + 1) * 3 := Nat.mul_le_mul_left _ (by omega) + _ = 3 ^ (d.succ + 1) := by + simp [pow_succ, Nat.succ_eq_add_one] + change (d : ℝ) + 1 ≤ (3 : ℝ) ^ (d + 1) + exact_mod_cast hnat + +private theorem disjoint_cellsMeeting_triadicDilate_of_euclideanUnitSeparated {d : ℕ} + {U V : Set (Vec d)} (hUV : Source.Coarse.EuclideanUnitSeparated U V) : + Disjoint (cellsMeeting (triadicDilateSet (refinementScale d) U)) + (cellsMeeting (triadicDilateSet (refinementScale d) V)) := by + rw [Set.disjoint_left] + intro z hzU hzV + rcases hzU with ⟨x, hx, hxz⟩ + rcases hzV with ⟨y, hy, hyz⟩ + rcases hx with ⟨x0, hx0, rfl⟩ + rcases hy with ⟨y0, hy0, rfl⟩ + have hsep : 1 ≤ euclideanDist x0 y0 := hUV hx0 hy0 + have hscale : (d : ℝ) + 1 ≤ (3 : ℝ) ^ refinementScale d := + dim_succ_le_triadicScale d + have hscaled : (d : ℝ) + 1 ≤ + euclideanDist (triadicDilateVec (refinementScale d) x0) + (triadicDilateVec (refinementScale d) y0) := by + rw [Source.Coarse.euclideanDist_triadicDilateVec] + calc + (d : ℝ) + 1 ≤ (3 : ℝ) ^ refinementScale d := hscale + _ = (3 : ℝ) ^ refinementScale d * 1 := by ring + _ ≤ (3 : ℝ) ^ refinementScale d * euclideanDist x0 y0 := + mul_le_mul_of_nonneg_left hsep (by positivity) + have hsmall := euclideanDist_lt_dim_succ_of_mem_same_openUnitCell hxz hyz + exact (not_le_of_gt hsmall) hscaled + +private theorem measurable_checkerCarrier {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) : + Measurable (checkerCarrier (d := d) lam Lam hlam hle) := by + simpa [Source.Coarse.globalSigma] using! + (measurable_checkerCarrier_local (d := d) lam Lam hlam hle Set.univ MeasurableSet.univ).mono + (sampleCellsSigma_le _) le_rfl + +private theorem translate_checkerCarrier {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (z : Lattice d) (ω : Sample d) : + Source.Coarse.Carrier.translate z (checkerCarrier lam Lam hlam hle ω) = + checkerCarrier lam Lam hlam hle (shiftSample z ω) := by + apply Subtype.ext + funext x i j + exact congrArg (fun a : RegCoeffField d => a x i j) + (translateReg_checkerRegField (lam := lam) (Lam := Lam) z ω) + +private theorem rotate_checkerCarrier {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (R : Mat d) (σ : Equiv.Perm (Fin d)) + (s : Fin d → ℝ) (hs : ∀ i, s i = 1 ∨ s i = -1) + (hRdef : ∀ i j, R i j = if i = σ j then s j else 0) (ω : Sample d) : + Source.Coarse.Carrier.rotate R ⟨σ, s, hs, hRdef⟩ + (checkerCarrier lam Lam hlam hle ω) = + checkerCarrier lam Lam hlam hle (reindexSample (signedLatticeEquiv σ s hs) ω) := by + apply Subtype.ext + funext x i j + exact congrArg (fun a : RegCoeffField d => a x i j) + (rotateReg_checkerRegField (lam := lam) (Lam := Lam) hs hRdef ⟨σ, s, hs, hRdef⟩ ω) + +private theorem adjoint_checkerCarrier {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (ω : Sample d) : + Source.Coarse.Carrier.adjoint (checkerCarrier lam Lam hlam hle ω) = + checkerCarrier lam Lam hlam hle ω := by + apply Subtype.ext + funext x i j + exact congrArg (fun a : RegCoeffField d => a x i j) + (adjointReg_checkerRegField (lam := lam) (Lam := Lam) ω) + +/-- The Bernoulli checkerboard measure before spatial refinement. -/ +def baseLaw (d : ℕ) (lam Lam : ℝ) (hlam : 0 < lam) (hle : lam ≤ Lam) + (p : ℝ≥0) (hp : p ≤ 1) : Measure (Source.Coarse.Carrier d) := + Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp) + +/-- The exact-source Bernoulli checkerboard law at the refined spatial scale. -/ +def law (d : ℕ) (lam Lam : ℝ) (hlam : 0 < lam) (hle : lam ≤ Lam) + (p : ℝ≥0) (hp : p ≤ 1) : Book.Ch04.SourceCoeffLaw d := + Source.Coarse.scaleNormalizedLaw (refinementScale d) (baseLaw d lam Lam hlam hle p hp) + +private theorem baseLaw_stationary {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Source.Coarse.IsStationary (baseLaw d lam Lam hlam hle p hp) := by + intro z + rw [baseLaw] + calc + Measure.map (Source.Coarse.Carrier.translate z) + (Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp)) = + Measure.map (fun ω : Sample d => + Source.Coarse.Carrier.translate z (checkerCarrier lam Lam hlam hle ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp] using! Measure.map_map + (Source.Coarse.measurable_translate_globalSigma z) + (measurable_checkerCarrier (d := d) lam Lam hlam hle) + (μ := sampleMeasure d p hp) + _ = Measure.map (fun ω : Sample d => + checkerCarrier lam Lam hlam hle (shiftSample z ω)) (sampleMeasure d p hp) := by + congr 1 + funext ω + exact translate_checkerCarrier hlam hle z ω + _ = Measure.map (checkerCarrier lam Lam hlam hle) + (Measure.map (shiftSample z) (sampleMeasure d p hp)) := by + symm + simpa [Function.comp] using! Measure.map_map + (measurable_checkerCarrier (d := d) lam Lam hlam hle) (measurable_shiftSample z) + (μ := sampleMeasure d p hp) + _ = Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp) := by + rw [sampleMeasure_map_shiftSample z p hp] + +private theorem baseLaw_isotropic_adjoint {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Source.Coarse.IsIsotropicAndAdjointInvariant (baseLaw d lam Lam hlam hle p hp) := by + constructor + · intro R hR + obtain ⟨σ, s, hs, hRdef⟩ := hR + let hR : IsSignedPermutationMatrix R := ⟨σ, s, hs, hRdef⟩ + let e : Lattice d ≃ Lattice d := signedLatticeEquiv σ s hs + rw [baseLaw] + calc + Measure.map (Source.Coarse.Carrier.rotate R hR) + (Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp)) = + Measure.map (fun ω : Sample d => + Source.Coarse.Carrier.rotate R hR (checkerCarrier lam Lam hlam hle ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp] using! Measure.map_map + (Source.Coarse.measurable_rotate_globalSigma R hR) + (measurable_checkerCarrier (d := d) lam Lam hlam hle) + (μ := sampleMeasure d p hp) + _ = Measure.map (fun ω : Sample d => checkerCarrier lam Lam hlam hle (reindexSample e ω)) + (sampleMeasure d p hp) := by + congr 1 + funext ω + exact rotate_checkerCarrier hlam hle R σ s hs hRdef ω + _ = Measure.map (checkerCarrier lam Lam hlam hle) + (Measure.map (reindexSample e) (sampleMeasure d p hp)) := by + symm + simpa [Function.comp, e] using! Measure.map_map + (measurable_checkerCarrier (d := d) lam Lam hlam hle) (measurable_reindexSample e) + (μ := sampleMeasure d p hp) + _ = Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp) := by + rw [sampleMeasure_map_reindexSample e p hp] + · rw [baseLaw] + calc + Measure.map Source.Coarse.Carrier.adjoint + (Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp)) = + Measure.map (fun ω : Sample d => + Source.Coarse.Carrier.adjoint (checkerCarrier lam Lam hlam hle ω)) + (sampleMeasure d p hp) := by + simpa [Function.comp] using! Measure.map_map + Source.Coarse.measurable_adjoint_globalSigma + (measurable_checkerCarrier (d := d) lam Lam hlam hle) + (μ := sampleMeasure d p hp) + _ = Measure.map (checkerCarrier lam Lam hlam hle) (sampleMeasure d p hp) := by + congr 1 + funext ω + exact adjoint_checkerCarrier hlam hle ω + +instance instIsProbabilityMeasure_law (d : ℕ) (lam Lam : ℝ) (hlam : 0 < lam) + (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (law d lam Lam hlam hle p hp) := by + let : IsProbabilityMeasure (baseLaw d lam Lam hlam hle p hp) := by + unfold baseLaw + infer_instance + unfold law + exact Source.Coarse.isProbabilityMeasure_scaleNormalizedLaw _ _ + +theorem isProbabilityMeasure_law (d : ℕ) (lam Lam : ℝ) (hlam : 0 < lam) + (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + IsProbabilityMeasure (law d lam Lam hlam hle p hp) := inferInstance + +theorem stationary_law {d : ℕ} {lam Lam : ℝ} (hlam : 0 < lam) (hle : lam ≤ Lam) + (p : ℝ≥0) (hp : p ≤ 1) : Book.Ch04.SourceStationaryLaw (law d lam Lam hlam hle p hp) := by + exact (baseLaw_stationary hlam hle p hp).scaleNormalized (refinementScale d) + +theorem isotropicAndAdjointInvariant_law {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.SourceIsotropicAndAdjointInvariantLaw (law d lam Lam hlam hle p hp) := by + exact (baseLaw_isotropic_adjoint hlam hle p hp).scaleNormalized (refinementScale d) + +private theorem law_eq_map_refinedCheckerCarrier {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + law d lam Lam hlam hle p hp = + Measure.map (refinedCheckerCarrier lam Lam hlam hle) (sampleMeasure d p hp) := by + unfold law Source.Coarse.scaleNormalizedLaw baseLaw + rw [Measure.map_map (Source.Coarse.measurable_rescale_globalSigma _) + (measurable_checkerCarrier (d := d) lam Lam hlam hle)] + rfl + +private theorem measurable_refinedCheckerCarrier {d : ℕ} (lam Lam : ℝ) + (hlam : 0 < lam) (hle : lam ≤ Lam) : + Measurable (refinedCheckerCarrier (d := d) lam Lam hlam hle) := by + simpa only [refinedCheckerCarrier, Function.comp_apply] using! + (Source.Coarse.measurable_rescale_globalSigma (d := d) (refinementScale d)).comp + (measurable_checkerCarrier (d := d) lam Lam hlam hle) + +theorem unitRangeDependent_law {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.SourceUnitRangeDependentLaw (law d lam Lam hlam hle p hp) := by + intro U V hU hV hUV + rw [law_eq_map_refinedCheckerCarrier lam Lam hlam hle p hp] + have hcells : Disjoint + (cellsMeeting (triadicDilateSet (refinementScale d) U)) + (cellsMeeting (triadicDilateSet (refinementScale d) V)) := + disjoint_cellsMeeting_triadicDilate_of_euclideanUnitSeparated hUV + have hIndCells : ProbabilityTheory.Indep + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) U))) + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) V))) + (sampleMeasure d p hp) := + indep_sampleCellsSigma_of_disjoint hcells p hp + rw [ProbabilityTheory.Indep_iff] + intro s t hs ht + have hs_ambient : MeasurableSet s := + Source.Coarse.localSigma_mono hU MeasurableSet.univ (Set.subset_univ _) s hs + have ht_ambient : MeasurableSet t := + Source.Coarse.localSigma_mono hV MeasurableSet.univ (Set.subset_univ _) t ht + have hst_ambient : MeasurableSet (s ∩ t) := hs_ambient.inter ht_ambient + have hs_pre : @MeasurableSet (Sample d) + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) U))) + ((refinedCheckerCarrier lam Lam hlam hle) ⁻¹' s) := + (measurable_refinedCheckerCarrier_local lam Lam hlam hle U hU) hs + have ht_pre : @MeasurableSet (Sample d) + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) V))) + ((refinedCheckerCarrier lam Lam hlam hle) ⁻¹' t) := + (measurable_refinedCheckerCarrier_local lam Lam hlam hle V hV) ht + have hpre_ind := + (ProbabilityTheory.Indep_iff + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) U))) + (sampleCellsSigma (cellsMeeting (triadicDilateSet (refinementScale d) V))) + (sampleMeasure d p hp)).1 hIndCells + ((refinedCheckerCarrier lam Lam hlam hle) ⁻¹' s) + ((refinedCheckerCarrier lam Lam hlam hle) ⁻¹' t) hs_pre ht_pre + have hmeas := measurable_refinedCheckerCarrier (d := d) lam Lam hlam hle + rw [Measure.map_apply hmeas hst_ambient, + Measure.map_apply hmeas hs_ambient, + Measure.map_apply hmeas ht_ambient] + simpa [Set.preimage_inter] using hpre_ind + +theorem structuralLaw {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hle : lam ≤ Lam) (p : ℝ≥0) (hp : p ≤ 1) : + Book.Ch04.SourceStructuralLaw (law d lam Lam hlam hle p hp) where + stationary := stationary_law hlam hle p hp + unit_range := unitRangeDependent_law hlam hle p hp + isotropic_and_adjoint_invariant := isotropicAndAdjointInvariant_law hlam hle p hp + +end +end Homogenization.Examples.RandomCheckerboard.Source diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry.lean b/LeanPool/CoarseGraining/Homogenization/Geometry.lean new file mode 100644 index 0000000000..5e9450b978 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry.lean @@ -0,0 +1,30 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/BoundaryLayer.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundaryLayer.lean new file mode 100644 index 0000000000..df976d0a39 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundaryLayer.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition + +/-! # Boundary Layer -/ + +@[expose] public section + +namespace Homogenization + +/-- The geometric boundary of a half-open cube, encoded as the difference between the half-open +realization and its open core. -/ +def cubeBoundary {d : ℕ} (Q : TriadicCube d) : Set (Vec d) := + cubeSet Q \ openCubeSet Q + +/-- The cube obtained by shrinking each face inward by the normalized amount `t`. For `t = 0` this +recovers the original half-open cube. -/ +def cubeShrunkSet {d : ℕ} (Q : TriadicCube d) (t : ℝ) : Set (Vec d) := + { x | ∀ i, + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q ≤ x i) ∧ + (x i < ((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q)) } + +/-- The boundary layer of thickness `t`, defined as the part of the cube left after removing the +shrunk core. -/ +def cubeBoundaryLayer {d : ℕ} (Q : TriadicCube d) (t : ℝ) : Set (Vec d) := + cubeSet Q \ cubeShrunkSet Q t + +@[simp] theorem mem_cubeBoundary_iff {d : ℕ} {Q : TriadicCube d} {x : Vec d} : + x ∈ cubeBoundary Q ↔ x ∈ cubeSet Q ∧ x ∉ openCubeSet Q := by + rfl + +@[simp] theorem mem_cubeShrunkSet_iff {d : ℕ} {Q : TriadicCube d} {t : ℝ} {x : Vec d} : + x ∈ cubeShrunkSet Q t ↔ + ∀ i, + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q ≤ x i) ∧ + (x i < ((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q)) := by + rfl + +@[simp] theorem mem_cubeBoundaryLayer_iff {d : ℕ} {Q : TriadicCube d} {t : ℝ} {x : Vec d} : + x ∈ cubeBoundaryLayer Q t ↔ x ∈ cubeSet Q ∧ x ∉ cubeShrunkSet Q t := by + rfl + +@[simp] theorem cubeShrunkSet_zero {d : ℕ} (Q : TriadicCube d) : + cubeShrunkSet Q 0 = cubeSet Q := by + ext x + simp [cubeShrunkSet, cubeSet] + +@[simp] theorem cubeBoundaryLayer_zero {d : ℕ} (Q : TriadicCube d) : + cubeBoundaryLayer Q 0 = ∅ := by + ext x + simp [cubeBoundaryLayer] + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +theorem cubeBoundary_subset_cubeSet {d : ℕ} (Q : TriadicCube d) : + cubeBoundary Q ⊆ cubeSet Q := + Set.sdiff_subset + +theorem cubeBoundaryLayer_subset_cubeSet {d : ℕ} (Q : TriadicCube d) (t : ℝ) : + cubeBoundaryLayer Q t ⊆ cubeSet Q := + Set.sdiff_subset + +theorem cubeShrunkSet_anti {d : ℕ} (Q : TriadicCube d) : + Antitone (cubeShrunkSet Q) := by + intro s t hst x hx i + rcases hx i with ⟨hlo, hhi⟩ + have hscale_nonneg : 0 ≤ cubeScaleFactor Q := le_of_lt (cubeScaleFactor_pos Q) + have hlo_coeff : + (((Q.index i : ℝ) - (1 / 2 : ℝ)) + s) * cubeScaleFactor Q ≤ + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q) := by + refine mul_le_mul_of_nonneg_right ?_ hscale_nonneg + linarith + have hhi_coeff : + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q) ≤ + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) - s) * cubeScaleFactor Q) := by + refine mul_le_mul_of_nonneg_right ?_ hscale_nonneg + linarith + exact ⟨le_trans hlo_coeff hlo, lt_of_lt_of_le hhi hhi_coeff⟩ + +theorem cubeShrunkSet_subset_cubeSet {d : ℕ} (Q : TriadicCube d) {t : ℝ} (ht : 0 ≤ t) : + cubeShrunkSet Q t ⊆ cubeSet Q := by + simpa using cubeShrunkSet_anti Q ht + +theorem cubeBoundaryLayer_mono {d : ℕ} (Q : TriadicCube d) : + Monotone (cubeBoundaryLayer Q) := by + intro s t hst x hx + rcases hx with ⟨hxQ, hx_not_mem⟩ + refine ⟨hxQ, ?_⟩ + intro hxt + exact hx_not_mem ((cubeShrunkSet_anti Q hst) hxt) + +theorem openCubeSet_subset_cubeSet {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q ⊆ cubeSet Q := by + intro x hx i + rcases hx i with ⟨hlo, hhi⟩ + exact ⟨le_of_lt hlo, hhi⟩ + +theorem pairwiseDisjoint_openCubeSet_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + (descendantsAtDepth Q n : Set (TriadicCube d)).PairwiseDisjoint openCubeSet := by + intro R hR S hS hneq + exact (pairwiseDisjoint_descendantsAtDepth Q n hR hS hneq).mono + (openCubeSet_subset_cubeSet R) (openCubeSet_subset_cubeSet S) + +theorem openCubeSet_union_cubeBoundary_eq_cubeSet {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q ∪ cubeBoundary Q = cubeSet Q := by + ext x + constructor + · rintro (hx | ⟨hx, _⟩) + · exact openCubeSet_subset_cubeSet Q hx + · exact hx + · intro hx + by_cases hopen : x ∈ openCubeSet Q + · exact Or.inl hopen + · exact Or.inr ⟨hx, hopen⟩ + +theorem cubeShrunkSet_eq_empty_of_half_le {d : ℕ} [NeZero d] (Q : TriadicCube d) {t : ℝ} + (ht : (1 / 2 : ℝ) ≤ t) : + cubeShrunkSet Q t = ∅ := by + ext x + constructor + · intro hx + have hx0 := hx 0 + exfalso + have hscale_pos := cubeScaleFactor_pos Q + nlinarith [hx0.1, hx0.2, hscale_pos, ht] + · intro hx + simp at hx + +theorem cubeBoundaryLayer_eq_cubeSet_of_half_le {d : ℕ} [NeZero d] (Q : TriadicCube d) {t : ℝ} + (ht : (1 / 2 : ℝ) ≤ t) : + cubeBoundaryLayer Q t = cubeSet Q := by + rw [cubeBoundaryLayer, cubeShrunkSet_eq_empty_of_half_le Q ht, Set.sdiff_empty] + +theorem center_mem_cubeShrunkSet_of_lt_half {d : ℕ} (Q : TriadicCube d) {t : ℝ} + (ht : t < (1 / 2 : ℝ)) : + (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) ∈ cubeShrunkSet Q t := by + intro i + have hscale_pos := cubeScaleFactor_pos Q + constructor + · nlinarith + · nlinarith + +theorem cubeShrunkSet_nonempty_of_lt_half {d : ℕ} (Q : TriadicCube d) {t : ℝ} + (ht : t < (1 / 2 : ℝ)) : + (cubeShrunkSet Q t).Nonempty := by + refine ⟨fun i => (Q.index i : ℝ) * cubeScaleFactor Q, ?_⟩ + exact center_mem_cubeShrunkSet_of_lt_half Q ht + +theorem cubeShrunkSet_nonempty_iff {d : ℕ} [NeZero d] {Q : TriadicCube d} {t : ℝ} : + (cubeShrunkSet Q t).Nonempty ↔ t < (1 / 2 : ℝ) := by + constructor + · rintro ⟨x, hx⟩ + by_contra ht + have hempty : cubeShrunkSet Q t = ∅ := + cubeShrunkSet_eq_empty_of_half_le Q (le_of_not_gt ht) + rw [hempty] at hx + simp at hx + · exact cubeShrunkSet_nonempty_of_lt_half Q + +theorem cubeShrunkSet_eq_empty_iff {d : ℕ} [NeZero d] {Q : TriadicCube d} {t : ℝ} : + cubeShrunkSet Q t = ∅ ↔ (1 / 2 : ℝ) ≤ t := by + constructor + · intro h + by_contra ht + rcases cubeShrunkSet_nonempty_of_lt_half Q (lt_of_not_ge ht) with ⟨x, hx⟩ + rw [h] at hx + simp at hx + · exact cubeShrunkSet_eq_empty_of_half_le Q + +theorem cubeSet_middleChild_subset_cubeShrunkSet {d : ℕ} (Q : TriadicCube d) {t : ℝ} + (ht : t ≤ (1 / 3 : ℝ)) : + cubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i } : TriadicCube d) ⊆ + cubeShrunkSet Q t := by + let middle : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i } + intro x hx i + have hx' := hx i + have hscale_pos := cubeScaleFactor_pos Q + have hchild_scale : + cubeScaleFactor middle = cubeScaleFactor Q / 3 := by + simpa [middle] using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + rw [hchild_scale] at hx' + have hindex_cast : ((3 * Q.index i : ℤ) : ℝ) = 3 * (Q.index i : ℝ) := by + norm_num + constructor + · nlinarith [hx'.1, hindex_cast, hscale_pos, ht] + · nlinarith [hx'.2, hindex_cast, hscale_pos, ht] + +theorem cubeSet_childCube_subset_cubeShrunkSet_of_digits_eq_one {d : ℕ} (Q : TriadicCube d) + (digits : Fin d → Fin 3) (hdigits : ∀ i, digits i = 1) {t : ℝ} + (ht : t ≤ (1 / 3 : ℝ)) : + cubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d) ⊆ + cubeShrunkSet Q t := by + simpa [hdigits] using cubeSet_middleChild_subset_cubeShrunkSet Q ht + +@[simp] theorem descendantsAtScale_pred {d : ℕ} (Q : TriadicCube d) : + descendantsAtScale Q (Q.scale - 1) = childCubes Q := by + rw [descendantsAtScale_eq_descendantsAtDepth Q (by omega)] + simp + +theorem middleChild_mem_childCubes {d : ℕ} (Q : TriadicCube d) : + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i } : TriadicCube d) ∈ childCubes Q := by + refine Finset.mem_image.mpr ?_ + refine ⟨fun _ => (1 : Fin 3), Finset.mem_univ _, ?_⟩ + cases Q + simp + +theorem middleChild_mem_descendantsAtScale_pred {d : ℕ} (Q : TriadicCube d) : + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i } : TriadicCube d) ∈ + descendantsAtScale Q (Q.scale - 1) := by + rw [descendantsAtScale_pred] + exact middleChild_mem_childCubes Q + +@[simp] theorem descendantsAtScale_pred_card {d : ℕ} (Q : TriadicCube d) : + (descendantsAtScale Q (Q.scale - 1)).card = 3 ^ d := by + rw [descendantsAtScale_pred] + exact childCubes_card Q + +theorem cubeBoundaryLayer_subset_iUnion_childCubes_except_middle {d : ℕ} (Q : TriadicCube d) + {t : ℝ} (ht : t ≤ (1 / 3 : ℝ)) : + cubeBoundaryLayer Q t ⊆ + ⋃ R ∈ ({S : TriadicCube d | S ∈ childCubes Q ∧ + S ≠ ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i } : TriadicCube d)} : Set (TriadicCube d)), + cubeSet R := by + let middle : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i } + intro x hx + rcases hx with ⟨hxQ, hx_not_shrunk⟩ + rcases exists_mem_childCubes_of_mem_cubeSet hxQ with ⟨R, hR, hxR⟩ + have hmid : cubeSet middle ⊆ cubeShrunkSet Q t := cubeSet_middleChild_subset_cubeShrunkSet Q ht + have hneq : R ≠ middle := by + intro hEq + apply hx_not_shrunk + exact hmid (hEq ▸ hxR) + exact Set.mem_iUnion.mpr ⟨R, Set.mem_iUnion.mpr ⟨by simpa [middle] using And.intro hR hneq, hxR⟩⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedConvexDomain.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedConvexDomain.lean new file mode 100644 index 0000000000..4568a3e8de --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedConvexDomain.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Topology.Sets.Opens + +/-! +# Open bounded convex domain adapters + +This module keeps the repository's existing set-based predicate +`IsOpenBoundedConvexDomain U` as the domain carrier. Given a nonempty carrier, +it supplies the positive-volume bounded measurable domain and open-set adapters +needed by normalized and Sobolev constructions. +-/ + +@[expose] public section + +namespace Homogenization + +open TopologicalSpace + +namespace IsOpenBoundedConvexDomain + +/-- A nonempty open bounded convex set is a bounded measurable domain of +strictly positive Lebesgue volume. -/ +noncomputable def toBoundedMeasurableDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + BoundedMeasurableDomain d where + carrier := U + measurableSet := hU.isOpen.measurableSet + isBoundedDomain := hU.isBoundedDomain + volume_pos := IsOpen.measure_pos MeasureTheory.volume hU.isOpen hne + +@[simp] theorem coe_toBoundedMeasurableDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) : + (hU.toBoundedMeasurableDomain hne : Set (Vec d)) = U := + rfl + +/-- The open-set carrier associated with an open bounded convex domain. -/ +def toOpens {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + Opens (Vec d) := + ⟨U, hU.isOpen⟩ + +@[simp] theorem coe_toOpens {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) : + (hU.toOpens : Set (Vec d)) = U := + rfl + +end IsOpenBoundedConvexDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedMeasurableDomain.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedMeasurableDomain.lean new file mode 100644 index 0000000000..b889161d4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/BoundedMeasurableDomain.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import Mathlib.MeasureTheory.Function.L1Space.Integrable +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.Topology.MetricSpace.Bounded + +/-! +# Bounded measurable domains with normalized volume + +This module packages the minimum geometric data needed to use volume-normalized +integrals on a bounded measurable domain of strictly positive Lebesgue volume. +The normalization is an `ENNReal` rescaling of restricted Lebesgue measure, so +it has no zero-volume fallback and does not use `ENNReal.toReal` to define a +measure. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-- A bounded measurable subset of `R^d` with strictly positive Lebesgue volume. -/ +structure BoundedMeasurableDomain (d : ℕ) where + /-- The underlying measurable subset of `R^d`. -/ + carrier : Set (Vec d) + measurableSet : MeasurableSet carrier + isBoundedDomain : IsBoundedDomain carrier + volume_pos : 0 < MeasureTheory.volume carrier + +namespace BoundedMeasurableDomain + +instance {d : ℕ} : SetLike (BoundedMeasurableDomain d) (Vec d) where + coe U := U.carrier + coe_injective := by + intro U V hUV + cases U + cases V + cases hUV + rfl + +@[simp] theorem coe_mk {d : ℕ} (U : Set (Vec d)) (hU_meas : MeasurableSet U) + (hU_bounded : IsBoundedDomain U) (hU_pos : 0 < MeasureTheory.volume U) : + ((BoundedMeasurableDomain.mk U hU_meas hU_bounded hU_pos : + BoundedMeasurableDomain d) : Set (Vec d)) = U := + rfl + +/-- The bounded-domain witness gives a bounded set in the ambient norm. -/ +theorem isBounded {d : ℕ} (U : BoundedMeasurableDomain d) : + Bornology.IsBounded (U : Set (Vec d)) := by + rcases U.isBoundedDomain with ⟨R, hR_pos, hR⟩ + refine isBounded_iff_forall_norm_le.2 ⟨R, ?_⟩ + intro x hx + refine (pi_norm_le_iff_of_nonneg hR_pos.le).2 ?_ + intro i + simpa [Real.norm_eq_abs] using hR x hx i + +/-- Lebesgue measure of a bounded measurable domain is finite. -/ +theorem volume_lt_top {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.volume (U : Set (Vec d)) < ∞ := + U.isBounded.measure_lt_top + +theorem volume_ne_zero {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.volume (U : Set (Vec d)) ≠ 0 := + ne_of_gt U.volume_pos + +theorem volume_ne_top {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.volume (U : Set (Vec d)) ≠ ∞ := + ne_of_lt U.volume_lt_top + +/-- Restricted Lebesgue measure on a bounded measurable domain. -/ +noncomputable def restrictedVolume {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.Measure (Vec d) := + MeasureTheory.volume.restrict U + +@[simp] theorem restrictedVolume_apply_univ {d : ℕ} (U : BoundedMeasurableDomain d) : + U.restrictedVolume Set.univ = MeasureTheory.volume (U : Set (Vec d)) := by + simp [restrictedVolume] + +/-- The probability measure obtained by normalizing restricted Lebesgue measure. -/ +noncomputable def normalizedVolume {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.Measure (Vec d) := + (MeasureTheory.volume (U : Set (Vec d)))⁻¹ • U.restrictedVolume + +@[simp] theorem normalizedVolume_apply_univ {d : ℕ} (U : BoundedMeasurableDomain d) : + U.normalizedVolume Set.univ = 1 := by + rw [normalizedVolume, MeasureTheory.Measure.smul_apply, U.restrictedVolume_apply_univ] + exact ENNReal.inv_mul_cancel U.volume_ne_zero U.volume_ne_top + +theorem normalizedVolume_ne_zero {d : ℕ} (U : BoundedMeasurableDomain d) : + U.normalizedVolume ≠ 0 := by + intro hU + have hzero : U.normalizedVolume Set.univ = 0 := by + rw [hU] + simp + simp at hzero + +/-- Restricted volume is finite on a bounded measurable domain. -/ +theorem restrictedVolume_isFiniteMeasure {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.IsFiniteMeasure U.restrictedVolume where + measure_univ_lt_top := by + rw [U.restrictedVolume_apply_univ] + exact U.volume_lt_top + +/-- Normalized volume is a finite measure, without registering a global instance. -/ +theorem normalizedVolume_isFiniteMeasure {d : ℕ} (U : BoundedMeasurableDomain d) : + MeasureTheory.IsFiniteMeasure U.normalizedVolume where + measure_univ_lt_top := by + rw [U.normalizedVolume_apply_univ] + norm_num + +/-- Integrability is unchanged by the strictly positive finite normalization factor. -/ +theorem integrable_normalizedVolume_iff {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [NormedAddCommGroup E] (f : Vec d → E) : + MeasureTheory.Integrable f U.normalizedVolume ↔ + MeasureTheory.Integrable f U.restrictedVolume := by + rw [normalizedVolume] + exact MeasureTheory.integrable_smul_measure + (ENNReal.inv_ne_zero.2 U.volume_ne_top) (ENNReal.inv_ne_top.2 U.volume_ne_zero) + +/-- The integrability witness required by `average` is valid for normalized volume. -/ +theorem integrable_normalizedVolume {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [NormedAddCommGroup E] (f : Vec d → E) + (hf : MeasureTheory.Integrable f U.restrictedVolume) : + MeasureTheory.Integrable f U.normalizedVolume := + (U.integrable_normalizedVolume_iff f).2 hf + +/-- The volume-normalized Bochner average of an integrable function. + +The explicit proof is transported to `normalizedVolume` by +`integrable_normalizedVolume`; thus its integral body is integrable. -/ +noncomputable def average {d : ℕ} (U : BoundedMeasurableDomain d) {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] (f : Vec d → E) + (_hf : MeasureTheory.Integrable f U.restrictedVolume) : E := + ∫ x, f x ∂U.normalizedVolume + +/-- The normalized Bochner average is inverse volume times the set integral. -/ +theorem average_eq_volume_toReal_inv_smul_setIntegral {d : ℕ} + (U : BoundedMeasurableDomain d) {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (f : Vec d → E) (hf : MeasureTheory.Integrable f U.restrictedVolume) : + U.average f hf = (MeasureTheory.volume (U : Set (Vec d))).toReal⁻¹ • + ∫ x in (U : Set (Vec d)), f x ∂MeasureTheory.volume := by + rw [average, normalizedVolume, MeasureTheory.integral_smul_measure, ENNReal.toReal_inv] + rfl + +/-- The source-style scalar average formula. -/ +theorem average_eq_volume_toReal_inv_mul_setIntegral {d : ℕ} + (U : BoundedMeasurableDomain d) (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f U.restrictedVolume) : + U.average f hf = (MeasureTheory.volume (U : Set (Vec d))).toReal⁻¹ * + ∫ x in (U : Set (Vec d)), f x ∂MeasureTheory.volume := by + simpa [smul_eq_mul] using U.average_eq_volume_toReal_inv_smul_setIntegral f hf + +/-- The volume-normalized scalar pairing of an integrable product. -/ +noncomputable def pairing {d : ℕ} (U : BoundedMeasurableDomain d) + (f g : Vec d → ℝ) + (hfg : MeasureTheory.Integrable (fun x => f x * g x) U.restrictedVolume) : ℝ := + U.average (fun x => f x * g x) hfg + +/-- The scalar pairing is the source-style normalized set integral. -/ +theorem pairing_eq_volume_toReal_inv_mul_setIntegral {d : ℕ} + (U : BoundedMeasurableDomain d) (f g : Vec d → ℝ) + (hfg : MeasureTheory.Integrable (fun x => f x * g x) U.restrictedVolume) : + U.pairing f g hfg = (MeasureTheory.volume (U : Set (Vec d))).toReal⁻¹ * + ∫ x in (U : Set (Vec d)), f x * g x ∂MeasureTheory.volume := by + simpa [pairing] using + U.average_eq_volume_toReal_inv_mul_setIntegral (fun x => f x * g x) hfg + +end BoundedMeasurableDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/ConvexDomain.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/ConvexDomain.lean new file mode 100644 index 0000000000..73bb0f48fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/ConvexDomain.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import Mathlib.Analysis.Normed.Module.Convex +public import Mathlib.MeasureTheory.Measure.Typeclasses.Finite +public import Mathlib.Topology.MetricSpace.Bounded + +/-! # Convex Domain -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Bounded Open Convex Domains + +This file bridges the repository's custom bounded-domain predicate +`IsBoundedDomain` with Mathlib's bounded-set API, records the resulting finite +measure consequences for Lebesgue measure, and packages the domain class +`IsOpenBoundedConvexDomain`. + +The intended analytic use is to give future Sobolev/Hodge results a stable +geometric target class that already contains the open cubes and metric balls +used downstream. +-/ + +theorem Bornology.IsBounded.isBoundedDomain {d : ℕ} {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : IsBoundedDomain U := by + classical + by_cases hd : d = 0 + · refine ⟨1, zero_lt_one, ?_⟩ + subst hd + intro x hx i + exact Fin.elim0 i + · have : NeZero d := ⟨hd⟩ + have hcoord : + ∀ i : Fin d, Bornology.IsBounded (Function.eval i '' U) := fun i => hU.image_eval i + have hcoord_bound : + ∀ i : Fin d, ∃ R : ℝ, 0 < R ∧ ∀ y ∈ Function.eval i '' U, ‖y‖ ≤ R := by + intro i + rcases isBounded_iff_forall_norm_le.1 (hcoord i) with ⟨R, hR⟩ + refine ⟨max R 1, zero_lt_one.trans_le (le_max_right _ _), ?_⟩ + intro y hy + exact (hR y hy).trans (le_max_left _ _) + choose R hRpos hR using hcoord_bound + let Rmax : ℝ := Finset.univ.sup' Finset.univ_nonempty R + have hRmax_pos : 0 < Rmax := by + let i0 : Fin d := 0 + have hi0 : i0 ∈ (Finset.univ : Finset (Fin d)) := by simp + have hle : R i0 ≤ Rmax := + Finset.le_sup' (s := Finset.univ) (f := R) hi0 + exact lt_of_lt_of_le (hRpos i0) hle + refine ⟨Rmax, hRmax_pos, ?_⟩ + intro x hx i + have hxi : ‖x i‖ ≤ R i := hR i (x i) ⟨x, hx, rfl⟩ + have hRi : R i ≤ Rmax := + Finset.le_sup' (s := Finset.univ) (f := R) (by simp : i ∈ Finset.univ) + exact by simpa [Real.norm_eq_abs] using hxi.trans hRi + +theorem IsBoundedDomain.isBounded {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) : + Bornology.IsBounded U := by + rcases hU with ⟨R, hRpos, hR⟩ + refine isBounded_iff_forall_norm_le.2 ⟨R, ?_⟩ + intro x hx + refine (pi_norm_le_iff_of_nonneg (le_of_lt hRpos)).2 ?_ + intro i + simpa [Real.norm_eq_abs] using hR x hx i + +theorem IsBoundedDomain.volume_lt_top {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) : + MeasureTheory.volume U < ⊤ := + hU.isBounded.measure_lt_top + +theorem IsBoundedDomain.isFiniteMeasure_restrict_volume + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) : + MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) := by + let : Fact (MeasureTheory.volume U < ⊤) := ⟨hU.volume_lt_top⟩ + infer_instance + +theorem IsBoundedDomain.norm_le_choose + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) {x : Vec d} + (hx : x ∈ U) : + ‖x‖ ≤ Classical.choose hU := by + have hRpos : 0 < Classical.choose hU := (Classical.choose_spec hU).1 + have hR : ∀ z ∈ U, ∀ i, |z i| ≤ Classical.choose hU := (Classical.choose_spec hU).2 + refine (pi_norm_le_iff_of_nonneg (le_of_lt hRpos)).2 ?_ + intro i + simpa [Real.norm_eq_abs] using hR x hx i + +theorem IsBoundedDomain.norm_sub_le_two_mul_choose + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) {x y : Vec d} + (hx : x ∈ U) (hy : y ∈ U) : + ‖x - y‖ ≤ 2 * Classical.choose hU := by + calc + ‖x - y‖ ≤ ‖x‖ + ‖y‖ := norm_sub_le _ _ + _ ≤ Classical.choose hU + Classical.choose hU := by + exact add_le_add (hU.norm_le_choose hx) (hU.norm_le_choose hy) + _ = 2 * Classical.choose hU := by ring + +theorem IsBoundedDomain.rayParameter_le_two_mul_choose_of_mem_of_norm_eq_one + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) {x ω : Vec d} {s : ℝ} + (hx : x ∈ U) (hs : x + s • ω ∈ U) (hs0 : 0 ≤ s) (hω : ‖ω‖ = 1) : + s ≤ 2 * Classical.choose hU := by + have hnorm : + ‖(x + s • ω) - x‖ ≤ 2 * Classical.choose hU := + hU.norm_sub_le_two_mul_choose hs hx + simpa [norm_smul, hω, abs_of_nonneg hs0] using hnorm + +/-- Bounded open convex domains in the ambient space `Vec d = Fin d → ℝ`. -/ +def IsOpenBoundedConvexDomain {d : ℕ} (U : Set (Vec d)) : Prop := + IsOpen U ∧ IsBoundedDomain U ∧ Convex ℝ U + +namespace IsOpenBoundedConvexDomain + +theorem isOpen {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + IsOpen U := + hU.1 + +theorem isBoundedDomain {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + IsBoundedDomain U := + hU.2.1 + +theorem convex {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + Convex ℝ U := + hU.2.2 + +theorem volume_lt_top {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + MeasureTheory.volume U < ⊤ := + hU.isBoundedDomain.volume_lt_top + +theorem isFiniteMeasure_restrict_volume {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) : + MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + +theorem isSobolevRegularDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) : + IsSobolevRegularDomain U := + ⟨hU.isOpen.measurableSet, hU.isBoundedDomain⟩ + +theorem translateSet {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (z : Vec d) : + IsOpenBoundedConvexDomain (translateSet z U) := by + refine ⟨?_, ?_, ?_⟩ + · have hopen : + IsOpen ((fun x : Vec d => x - z) ⁻¹' U) := + hU.isOpen.preimage (continuous_id.sub continuous_const) + simpa [preimage_subRight_eq_translateSet] using hopen + · rcases hU.isBoundedDomain with ⟨R, hRpos, hR⟩ + refine ⟨R + ‖z‖ + 1, ?_, ?_⟩ + · positivity + · intro x hx i + have hxpre : x - z ∈ U := (mem_translateSet_iff_sub_mem).1 hx + have hcoord : |(x - z) i| ≤ R := hR (x - z) hxpre i + have hzcoord : |z i| ≤ ‖z‖ := by + simpa [Real.norm_eq_abs] using norm_le_pi_norm z i + have hxi : x i = (x - z) i + z i := by + simp + calc + |x i| = |(x - z) i + z i| := by rw [hxi] + _ ≤ |(x - z) i| + |z i| := abs_add_le _ _ + _ ≤ R + ‖z‖ := add_le_add hcoord hzcoord + _ ≤ R + ‖z‖ + 1 := by linarith + · have hconv : Convex ℝ ((fun x : Vec d => x + -z) ⁻¹' U) := by + simpa using hU.convex.translate_preimage_left (-z) + simpa [preimage_addNeg_eq_translateSet] using hconv + +end IsOpenBoundedConvexDomain + +namespace IsSobolevRegularDomain + +theorem volume_lt_top {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) : + MeasureTheory.volume U < ⊤ := + hU.isBoundedDomain.volume_lt_top + +theorem isFiniteMeasure_restrict_volume {d : ℕ} {U : Set (Vec d)} + (hU : IsSobolevRegularDomain U) : + MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + +end IsSobolevRegularDomain + +theorem isOpenBoundedConvexDomain_ball {d : ℕ} (x : Vec d) {r : ℝ} (_hr : 0 < r) : + IsOpenBoundedConvexDomain (Metric.ball x r) := by + refine ⟨Metric.isOpen_ball, ?_, convex_ball x r⟩ + exact Bornology.IsBounded.isBoundedDomain + (show Bornology.IsBounded (Metric.ball x r) from Metric.isBounded_ball) + +theorem isBoundedDomain_openCubeSet {d : ℕ} (Q : TriadicCube d) : + IsBoundedDomain (openCubeSet Q) := by + rw [openCubeSet_eq_pi_Ioo] + exact Bornology.IsBounded.isBoundedDomain <| + Bornology.IsBounded.pi fun i => + show Bornology.IsBounded + (Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) from + Metric.isBounded_Ioo _ _ + +theorem convex_openCubeSet {d : ℕ} (Q : TriadicCube d) : + Convex ℝ (openCubeSet Q) := by + rw [openCubeSet_eq_pi_Ioo] + refine convex_pi ?_ + intro i hi + exact convex_Ioo _ _ + +theorem isOpenBoundedConvexDomain_openCubeSet {d : ℕ} (Q : TriadicCube d) : + IsOpenBoundedConvexDomain (openCubeSet Q) := by + exact ⟨isOpen_openCubeSet Q, isBoundedDomain_openCubeSet Q, convex_openCubeSet Q⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/CubeColoring.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeColoring.lean new file mode 100644 index 0000000000..69920407c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeColoring.lean @@ -0,0 +1,301 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition + +/-! # Cube Coloring -/ + +@[expose] public section + +namespace Homogenization + +/-- A triadic color is a choice of residue class modulo `3` in each coordinate. -/ +abbrev CubeColor (d : ℕ) := Fin d → Fin 3 + +/-- The color of a triadic cube, given by the coordinatewise residue class of its lattice index +modulo `3`. -/ +def cubeColor {d : ℕ} (Q : TriadicCube d) : CubeColor d := fun i => + ⟨Int.toNat (Q.index i % 3), by + have hnonneg : 0 ≤ Q.index i % 3 := Int.emod_nonneg _ (by norm_num) + have hlt : Q.index i % 3 < 3 := Int.emod_lt_of_pos _ (by norm_num) + rw [Int.toNat_lt hnonneg] + exact hlt⟩ + +/-- The descendants of `Q` at scale `k` with the prescribed triadic color `c`. -/ +def descendantsAtScaleColorClass {d : ℕ} (Q : TriadicCube d) (k : ℤ) (c : CubeColor d) : + Finset (TriadicCube d) := + (descendantsAtScale Q k).filter fun R => cubeColor R = c + +@[simp] theorem cubeColor_val {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + (cubeColor Q i : ℕ) = Int.toNat (Q.index i % 3) := + rfl + +theorem cubeColor_eq_iff_modEq {d : ℕ} {R S : TriadicCube d} : + cubeColor R = cubeColor S ↔ ∀ i, R.index i ≡ S.index i [ZMOD 3] := by + constructor + · intro h i + change R.index i % 3 = S.index i % 3 + have hval : Int.toNat (R.index i % 3) = Int.toNat (S.index i % 3) := by + simpa [cubeColor] using + congrArg Fin.val (congrArg (fun c : CubeColor d => c i) h) + have hcast : (((Int.toNat (R.index i % 3) : ℕ) : ℤ)) = Int.toNat (S.index i % 3) := by + exact_mod_cast hval + have hR_nonneg : 0 ≤ R.index i % 3 := Int.emod_nonneg _ (by norm_num) + have hS_nonneg : 0 ≤ S.index i % 3 := Int.emod_nonneg _ (by norm_num) + simpa [Int.toNat_of_nonneg hR_nonneg, Int.toNat_of_nonneg hS_nonneg] using hcast + · intro h + funext i + apply Fin.ext + have hmod : R.index i % 3 = S.index i % 3 := by + simpa [Int.ModEq] using h i + have hR_nonneg : 0 ≤ R.index i % 3 := Int.emod_nonneg _ (by norm_num) + have hS_nonneg : 0 ≤ S.index i % 3 := Int.emod_nonneg _ (by norm_num) + simpa [cubeColor, Int.toNat_of_nonneg hR_nonneg, Int.toNat_of_nonneg hS_nonneg] using + congrArg Int.toNat hmod + +@[simp] theorem mem_descendantsAtScaleColorClass_iff {d : ℕ} {Q R : TriadicCube d} + {k : ℤ} {c : CubeColor d} : + R ∈ descendantsAtScaleColorClass Q k c ↔ R ∈ descendantsAtScale Q k ∧ cubeColor R = c := by + simp [descendantsAtScaleColorClass] + +theorem mem_descendantsAtScaleColorClass_self {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + R ∈ descendantsAtScaleColorClass Q k (cubeColor R) := by + simp [descendantsAtScaleColorClass, hR] + +@[simp] theorem card_cubeColor (d : ℕ) : Fintype.card (CubeColor d) = 3 ^ d := by + simp [CubeColor] + +theorem card_image_cubeColor_descendantsAtScale_le {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + ((descendantsAtScale Q k).image cubeColor).card ≤ 3 ^ d := by + have hsubset : + (descendantsAtScale Q k).image cubeColor ⊆ (Finset.univ : Finset (CubeColor d)) := by + intro c hc + simp + simpa [card_cubeColor] using Finset.card_le_card hsubset + +theorem descendantsAtScale_eq_biUnion_colorClass {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + (Finset.univ : Finset (CubeColor d)).biUnion (descendantsAtScaleColorClass Q k) = + descendantsAtScale Q k := by + ext R + constructor + · intro hR + rcases Finset.mem_biUnion.mp hR with ⟨c, -, hRc⟩ + exact (mem_descendantsAtScaleColorClass_iff.mp hRc).1 + · intro hR + exact Finset.mem_biUnion.mpr + ⟨cubeColor R, by simp, mem_descendantsAtScaleColorClass_self hR⟩ + +theorem descendantsAtScale_eq_biUnion_image_cubeColor {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + ((descendantsAtScale Q k).image cubeColor).biUnion (descendantsAtScaleColorClass Q k) = + descendantsAtScale Q k := by + ext R + constructor + · intro hR + rcases Finset.mem_biUnion.mp hR with ⟨c, -, hRc⟩ + exact (mem_descendantsAtScaleColorClass_iff.mp hRc).1 + · intro hR + exact Finset.mem_biUnion.mpr + ⟨cubeColor R, Finset.mem_image.mpr ⟨R, hR, rfl⟩, mem_descendantsAtScaleColorClass_self hR⟩ + +theorem disjoint_descendantsAtScaleColorClass_of_ne {d : ℕ} (Q : TriadicCube d) (k : ℤ) + {c₁ c₂ : CubeColor d} (hneq : c₁ ≠ c₂) : + Disjoint (descendantsAtScaleColorClass Q k c₁) (descendantsAtScaleColorClass Q k c₂) := by + rw [Finset.disjoint_left] + intro R hR₁ hR₂ + have hc₁ : cubeColor R = c₁ := (mem_descendantsAtScaleColorClass_iff.mp hR₁).2 + have hc₂ : cubeColor R = c₂ := (mem_descendantsAtScaleColorClass_iff.mp hR₂).2 + exact hneq (hc₁.symm.trans hc₂) + +theorem card_descendantsAtScale_eq_sum_card_colorClass_image {d : ℕ} (Q : TriadicCube d) + (k : ℤ) : + (descendantsAtScale Q k).card = + ((descendantsAtScale Q k).image cubeColor).sum + (fun c => (descendantsAtScaleColorClass Q k c).card) := by + classical + calc + (descendantsAtScale Q k).card = + (((descendantsAtScale Q k).image cubeColor).biUnion (descendantsAtScaleColorClass Q k)).card := by + rw [descendantsAtScale_eq_biUnion_image_cubeColor Q k] + _ = ((descendantsAtScale Q k).image cubeColor).sum + (fun c => (descendantsAtScaleColorClass Q k c).card) := by + exact Finset.card_biUnion (by + intro c hc c' hc' hne + exact disjoint_descendantsAtScaleColorClass_of_ne Q k hne) + +theorem scale_le_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + k ≤ Q.scale := by + by_contra hk + exact (not_mem_descendantsAtScale_of_lt (lt_of_not_ge hk)) hR + +theorem scale_eq_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + R.scale = k := by + have hk : k ≤ Q.scale := scale_le_of_mem_descendantsAtScale hR + have hdepth := scale_eq_sub_of_mem_descendantsAtScale hk hR + have hnonneg : 0 ≤ Q.scale - k := sub_nonneg.mpr hk + calc + R.scale = Q.scale - (Int.toNat (Q.scale - k) : ℕ) := hdepth + _ = Q.scale - (Q.scale - k) := by rw [Int.toNat_of_nonneg hnonneg] + _ = k := sub_sub_cancel _ _ + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +private theorem index_add_three_le_of_cubeColor_eq_of_lt {d : ℕ} {R S : TriadicCube d} + {i : Fin d} (hcolor : cubeColor R = cubeColor S) (hlt : R.index i < S.index i) : + R.index i + 3 ≤ S.index i := by + have hmod : R.index i ≡ S.index i [ZMOD 3] := (cubeColor_eq_iff_modEq.mp hcolor) i + rw [Int.modEq_iff_dvd] at hmod + rcases hmod with ⟨n, hn⟩ + omega + +theorem disjoint_cubeSet_of_scale_eq_of_ne {d : ℕ} {R S : TriadicCube d} + (hscale : R.scale = S.scale) (hneq : R ≠ S) : + Disjoint (cubeSet R) (cubeSet S) := by + rw [Set.disjoint_left] + intro x hxR hxS + have hindex_ne : ∃ i, R.index i ≠ S.index i := by + by_contra h + push Not at h + apply hneq + cases R with + | mk scaleR indexR => + cases S with + | mk scaleS indexS => + simp at hscale ⊢ + exact ⟨hscale, funext h⟩ + rcases hindex_ne with ⟨i, hi⟩ + have hfactor : cubeScaleFactor S = cubeScaleFactor R := by + simp [cubeScaleFactor, hscale] + have hfactor_nonneg : 0 ≤ cubeScaleFactor R := le_of_lt (cubeScaleFactor_pos R) + have hxRi := hxR i + have hxSi := hxS i + rcases lt_or_gt_of_ne hi with hlt | hgt + · have hidx' : (R.index i : ℝ) + 1 ≤ S.index i := by + exact_mod_cast (Int.add_one_le_iff.mpr hlt) + have hsep : + (((R.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor R) ≤ + (((S.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor S) := by + rw [hfactor] + have hcoeff : (R.index i : ℝ) + (1 / 2 : ℝ) ≤ (S.index i : ℝ) - (1 / 2 : ℝ) := by + nlinarith + exact mul_le_mul_of_nonneg_right hcoeff hfactor_nonneg + exact not_lt_of_ge (le_trans hsep (by simpa [hfactor] using hxSi.1)) hxRi.2 + · have hidx' : (S.index i : ℝ) + 1 ≤ R.index i := by + exact_mod_cast (Int.add_one_le_iff.mpr hgt) + have hsep : + (((S.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor S) ≤ + (((R.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor R) := by + rw [hfactor] + have hcoeff : (S.index i : ℝ) + (1 / 2 : ℝ) ≤ (R.index i : ℝ) - (1 / 2 : ℝ) := by + nlinarith + exact mul_le_mul_of_nonneg_right hcoeff hfactor_nonneg + exact not_lt_of_ge (le_trans hsep hxRi.1) (by simpa [hfactor] using hxSi.2) + +theorem disjoint_cubeSet_of_ne_of_mem_descendantsAtScale {d : ℕ} {Q R S : TriadicCube d} + {k : ℤ} (hR : R ∈ descendantsAtScale Q k) (hS : S ∈ descendantsAtScale Q k) (hneq : R ≠ S) : + Disjoint (cubeSet R) (cubeSet S) := by + refine disjoint_cubeSet_of_scale_eq_of_ne ?_ hneq + rw [scale_eq_of_mem_descendantsAtScale hR, scale_eq_of_mem_descendantsAtScale hS] + +theorem disjoint_cubeSet_of_ne_of_mem_descendantsAtScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : CubeColor d} + (hR : R ∈ descendantsAtScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleColorClass Q k c) (hneq : R ≠ S) : + Disjoint (cubeSet R) (cubeSet S) := by + exact disjoint_cubeSet_of_ne_of_mem_descendantsAtScale + (mem_descendantsAtScaleColorClass_iff.mp hR).1 + (mem_descendantsAtScaleColorClass_iff.mp hS).1 hneq + +theorem cubeScaleFactor_le_dist_of_ne_of_mem_descendantsAtScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : CubeColor d} + (hR : R ∈ descendantsAtScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleColorClass Q k c) (hneq : R ≠ S) + {x y : Vec d} (hx : x ∈ cubeSet R) (hy : y ∈ cubeSet S) : + cubeScaleFactor R ≤ dist x y := by + have hcolor : cubeColor R = cubeColor S := by + calc + cubeColor R = c := (mem_descendantsAtScaleColorClass_iff.mp hR).2 + _ = cubeColor S := ((mem_descendantsAtScaleColorClass_iff.mp hS).2).symm + have hindex_ne : ∃ i, R.index i ≠ S.index i := by + by_contra h + push Not at h + apply hneq + cases R with + | mk scaleR indexR => + cases S with + | mk scaleS indexS => + simp at h ⊢ + refine ⟨?_, funext h⟩ + have hscaleR : scaleR = k := by + simpa using + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleColorClass_iff.mp hR).1 + have hscaleS : scaleS = k := by + simpa using + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleColorClass_iff.mp hS).1 + exact hscaleR.trans hscaleS.symm + rcases hindex_ne with ⟨i, hi⟩ + have hscale : + cubeScaleFactor S = cubeScaleFactor R := by + calc + cubeScaleFactor S = (3 : ℝ) ^ k := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleColorClass_iff.mp hS).1] + _ = cubeScaleFactor R := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleColorClass_iff.mp hR).1] + have hscale_nonneg : 0 ≤ cubeScaleFactor R := le_of_lt (cubeScaleFactor_pos R) + have hxR := hx i + have hyS := hy i + rw [hscale] at hyS + rcases lt_or_gt_of_ne hi with hlt | hgt + · have hgap : R.index i + 3 ≤ S.index i := + index_add_three_le_of_cubeColor_eq_of_lt hcolor hlt + have hgap_real : ((R.index i : ℝ) + 3 : ℝ) ≤ (S.index i : ℝ) := by + exact_mod_cast hgap + have hcoord : cubeScaleFactor R ≤ ‖(y - x) i‖ := by + rw [Pi.sub_apply, Real.norm_eq_abs, abs_of_nonneg] + · nlinarith [hyS.1, hxR.2, hgap_real, hscale_nonneg] + · nlinarith [hyS.1, hxR.2, hgap_real, hscale_nonneg] + have hnorm : cubeScaleFactor R ≤ ‖y - x‖ := by + exact le_trans hcoord (norm_le_pi_norm (y - x) i) + simpa [dist_eq_norm, norm_sub_rev] using hnorm + · have hgap : S.index i + 3 ≤ R.index i := + index_add_three_le_of_cubeColor_eq_of_lt hcolor.symm hgt + have hgap_real : ((S.index i : ℝ) + 3 : ℝ) ≤ (R.index i : ℝ) := by + exact_mod_cast hgap + have hcoord : cubeScaleFactor R ≤ ‖(x - y) i‖ := by + rw [Pi.sub_apply, Real.norm_eq_abs, abs_of_nonneg] + · nlinarith [hxR.1, hyS.2, hgap_real, hscale_nonneg] + · nlinarith [hxR.1, hyS.2, hgap_real, hscale_nonneg] + have hnorm : cubeScaleFactor R ≤ ‖x - y‖ := by + exact le_trans hcoord (norm_le_pi_norm (x - y) i) + simpa [dist_eq_norm] using hnorm + +theorem one_le_dist_of_ne_of_mem_descendantsAtScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : CubeColor d} (hk : 0 ≤ k) + (hR : R ∈ descendantsAtScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleColorClass Q k c) (hneq : R ≠ S) + {x y : Vec d} (hx : x ∈ cubeSet R) (hy : y ∈ cubeSet S) : + 1 ≤ dist x y := by + have hscale_nonneg : 1 ≤ cubeScaleFactor R := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleColorClass_iff.mp hR).1] + exact one_le_zpow₀ (show (1 : ℝ) ≤ 3 by norm_num) hk + exact hscale_nonneg.trans + (cubeScaleFactor_le_dist_of_ne_of_mem_descendantsAtScaleColorClass hR hS hneq hx hy) + +theorem pairwiseDisjoint_descendantsAtScaleColorClass {d : ℕ} (Q : TriadicCube d) (k : ℤ) + (c : CubeColor d) : + (descendantsAtScaleColorClass Q k c : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + intro R hR S hS hneq + exact disjoint_cubeSet_of_ne_of_mem_descendantsAtScaleColorClass hR hS hneq + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMeasure.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMeasure.lean new file mode 100644 index 0000000000..b41dc19b82 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMeasure.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer + +/-! # Cube Measure -/ + +@[expose] public section + +namespace Homogenization + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +private theorem measurableSet_coord_halfOpenStrip {d : ℕ} (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a ≤ x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isClosed_le continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +private theorem measurableSet_coord_openStrip {d : ℕ} (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a < x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +theorem measurableSet_cubeSet {d : ℕ} (Q : TriadicCube d) : + MeasurableSet (cubeSet Q) := by + classical + simpa [cubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_halfOpenStrip i + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) + +theorem measurableSet_openCubeSet {d : ℕ} (Q : TriadicCube d) : + MeasurableSet (openCubeSet Q) := by + classical + simpa [openCubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_openStrip i + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) + +theorem measurableSet_cubeBoundary {d : ℕ} (Q : TriadicCube d) : + MeasurableSet (cubeBoundary Q) := by + simpa [cubeBoundary] using (measurableSet_cubeSet Q).diff (measurableSet_openCubeSet Q) + +theorem measurableSet_cubeShrunkSet {d : ℕ} (Q : TriadicCube d) (t : ℝ) : + MeasurableSet (cubeShrunkSet Q t) := by + classical + simpa [cubeShrunkSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_halfOpenStrip i + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q) + (((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q))) + +theorem measurableSet_cubeBoundaryLayer {d : ℕ} (Q : TriadicCube d) (t : ℝ) : + MeasurableSet (cubeBoundaryLayer Q t) := by + simpa [cubeBoundaryLayer] using + (measurableSet_cubeSet Q).diff (measurableSet_cubeShrunkSet Q t) + +theorem cubeSet_eq_pi_Ico {d : ℕ} (Q : TriadicCube d) : + cubeSet Q = + Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) := by + ext x + simp [cubeSet] + +theorem openCubeSet_eq_pi_Ioo {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q = + Set.pi Set.univ + (fun i : Fin d => + Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) := by + ext x + simp [openCubeSet] + +theorem cubeShrunkSet_eq_pi_Ico {d : ℕ} (Q : TriadicCube d) (t : ℝ) : + cubeShrunkSet Q t = + Set.pi Set.univ + (fun i : Fin d => + Set.Ico + (((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q)) + (((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q))) := by + ext x + simp [cubeShrunkSet] + +theorem cubeSet_ae_eq_openCubeSet {d : ℕ} (Q : TriadicCube d) : + cubeSet Q =ᵐ[MeasureTheory.volume] openCubeSet Q := by + rw [cubeSet_eq_pi_Ico, openCubeSet_eq_pi_Ioo] + exact (MeasureTheory.Measure.univ_pi_Ico_ae_eq_Icc (f := fun i : Fin d => + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + (g := fun i : Fin d => + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))).trans + (MeasureTheory.Measure.univ_pi_Ioo_ae_eq_Icc (f := fun i : Fin d => + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + (g := fun i : Fin d => + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))).symm + +theorem volume_restrict_cubeSet_eq_volume_restrict_openCubeSet {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume.restrict (cubeSet Q) = + MeasureTheory.volume.restrict (openCubeSet Q) := + MeasureTheory.Measure.restrict_congr_set (cubeSet_ae_eq_openCubeSet Q) + +theorem ae_restrict_cubeSet_iff {d : ℕ} {Q : TriadicCube d} {p : Vec d → Prop} : + (∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet Q), p x) ↔ + ∀ᵐ x ∂MeasureTheory.volume.restrict (openCubeSet Q), p x := by + exact MeasureTheory.ae_restrict_congr_set (cubeSet_ae_eq_openCubeSet Q) + +theorem ae_eq_cubeSet_of_mem_descendantsAtDepth_of_ae_eq_openCubeSet + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} {α : Type*} + {f g : Vec d → α} + (hR : R ∈ descendantsAtDepth Q j) + (hfg : f =ᵐ[MeasureTheory.volume.restrict (openCubeSet Q)] g) : + f =ᵐ[MeasureTheory.volume.restrict (cubeSet R)] g := by + have hle : + MeasureTheory.volume.restrict (openCubeSet R) ≤ + MeasureTheory.volume.restrict (openCubeSet Q) := + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + have hchildOpen : f =ᵐ[MeasureTheory.volume.restrict (openCubeSet R)] g := + hfg.filter_mono (MeasureTheory.ae_mono hle) + exact (ae_restrict_cubeSet_iff (Q := R)).2 hchildOpen + +theorem volume_cubeBoundary_le_cubeSet {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (cubeBoundary Q) ≤ MeasureTheory.volume (cubeSet Q) := by + exact MeasureTheory.measure_mono (cubeBoundary_subset_cubeSet Q) + +theorem cubeVolume_eq_scaleFactor_pow {d : ℕ} (Q : TriadicCube d) : + cubeVolume Q = (cubeScaleFactor Q) ^ d := rfl + +theorem cubeVolume_eq_pow_scale {d : ℕ} (Q : TriadicCube d) : + cubeVolume Q = ((3 : ℝ) ^ Q.scale) ^ d := by + simp [cubeVolume, cubeScaleFactor] + +@[simp] theorem volume_cubeSet_toReal {d : ℕ} (Q : TriadicCube d) : + (MeasureTheory.volume (cubeSet Q)).toReal = cubeVolume Q := by + let a : Fin d → ℝ := fun i => ((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + let b : Fin d → ℝ := fun i => ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith [cubeScaleFactor_pos Q] + rw [cubeSet_eq_pi_Ico] + have hside : ∀ i : Fin d, b i - a i = cubeScaleFactor Q := by + intro i + dsimp [a, b] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))))).toReal + = ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ico_toReal (ι := Fin d) hab + _ = cubeVolume Q := by + calc + ∏ i : Fin d, (b i - a i) = ∏ _i : Fin d, cubeScaleFactor Q := by + refine Finset.prod_congr rfl ?_ + intro i hi + exact hside i + _ = cubeVolume Q := by + simp [cubeVolume] + +@[simp] theorem volume_openCubeSet_toReal {d : ℕ} (Q : TriadicCube d) : + (MeasureTheory.volume (openCubeSet Q)).toReal = cubeVolume Q := by + let a : Fin d → ℝ := fun i => ((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + let b : Fin d → ℝ := fun i => ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith [cubeScaleFactor_pos Q] + rw [openCubeSet_eq_pi_Ioo] + have hside : ∀ i : Fin d, b i - a i = cubeScaleFactor Q := by + intro i + dsimp [a, b] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ + (fun i : Fin d => + Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))))).toReal + = ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ioo_toReal (ι := Fin d) hab + _ = cubeVolume Q := by + calc + ∏ i : Fin d, (b i - a i) = ∏ _i : Fin d, cubeScaleFactor Q := by + refine Finset.prod_congr rfl ?_ + intro i hi + exact hside i + _ = cubeVolume Q := by + simp [cubeVolume] + +theorem volume_cubeShrunkSet_toReal_of_le_half {d : ℕ} (Q : TriadicCube d) {t : ℝ} + (ht : t ≤ (1 / 2 : ℝ)) : + (MeasureTheory.volume (cubeShrunkSet Q t)).toReal = + ((1 - 2 * t) * cubeScaleFactor Q) ^ d := by + let a : Fin d → ℝ := + fun i => (((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q + let b : Fin d → ℝ := + fun i => (((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith [cubeScaleFactor_pos Q, ht] + rw [cubeShrunkSet_eq_pi_Ico] + have hside : ∀ i : Fin d, b i - a i = (1 - 2 * t) * cubeScaleFactor Q := by + intro i + dsimp [a, b] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ + (fun i : Fin d => + Set.Ico + (((((Q.index i : ℝ) - (1 / 2 : ℝ)) + t) * cubeScaleFactor Q)) + (((((Q.index i : ℝ) + (1 / 2 : ℝ)) - t) * cubeScaleFactor Q))))).toReal + = ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ico_toReal (ι := Fin d) hab + _ = ((1 - 2 * t) * cubeScaleFactor Q) ^ d := by + calc + ∏ i : Fin d, (b i - a i) = + ∏ _i : Fin d, ((1 - 2 * t) * cubeScaleFactor Q) := by + refine Finset.prod_congr rfl ?_ + intro i hi + exact hside i + _ = ((1 - 2 * t) * cubeScaleFactor Q) ^ d := by + simp + +theorem cubeVolume_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeVolume Q := by + have hscale : 0 < cubeScaleFactor Q := cubeScaleFactor_pos Q + simpa [cubeVolume] using pow_pos hscale d + +theorem cubeVolume_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeVolume Q := by + exact le_of_lt (cubeVolume_pos Q) + +theorem volume_cubeSet_lt_top {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (cubeSet Q) < ⊤ := by + refine lt_of_le_of_ne le_top ?_ + intro htop + have htoReal : (MeasureTheory.volume (cubeSet Q)).toReal = 0 := by + simp [htop] + rw [volume_cubeSet_toReal] at htoReal + exact (cubeVolume_pos Q).ne' htoReal + +theorem volume_openCubeSet_lt_top {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (openCubeSet Q) < ⊤ := by + exact lt_of_le_of_lt + (MeasureTheory.measure_mono (openCubeSet_subset_cubeSet Q)) + (volume_cubeSet_lt_top Q) + +theorem volume_openCubeSet_eq_volume_cubeSet {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (openCubeSet Q) = MeasureTheory.volume (cubeSet Q) := by + exact MeasureTheory.measure_congr (cubeSet_ae_eq_openCubeSet Q).symm + +theorem volume_cubeBoundaryLayer_toReal_of_nonneg_le_half {d : ℕ} + (Q : TriadicCube d) {t : ℝ} (ht_nonneg : 0 ≤ t) (ht_half : t ≤ (1 / 2 : ℝ)) : + (MeasureTheory.volume (cubeBoundaryLayer Q t)).toReal = + cubeVolume Q - ((1 - 2 * t) * cubeScaleFactor Q) ^ d := by + have hsub : cubeShrunkSet Q t ⊆ cubeSet Q := + cubeShrunkSet_subset_cubeSet Q ht_nonneg + have hmeas : MeasureTheory.NullMeasurableSet (cubeShrunkSet Q t) MeasureTheory.volume := + (measurableSet_cubeShrunkSet Q t).nullMeasurableSet + have hfinite : + MeasureTheory.volume (cubeShrunkSet Q t) ≠ ⊤ := + MeasureTheory.measure_ne_top_of_subset hsub (volume_cubeSet_lt_top Q).ne + have hmeasure : + MeasureTheory.volume (cubeBoundaryLayer Q t) = + MeasureTheory.volume (cubeSet Q) - MeasureTheory.volume (cubeShrunkSet Q t) := by + simpa [cubeBoundaryLayer] using + MeasureTheory.measure_sdiff hsub hmeas hfinite + have hle : + MeasureTheory.volume (cubeShrunkSet Q t) ≤ MeasureTheory.volume (cubeSet Q) := + MeasureTheory.measure_mono hsub + rw [hmeasure, ENNReal.toReal_sub_of_le hle (volume_cubeSet_lt_top Q).ne, + volume_cubeSet_toReal, volume_cubeShrunkSet_toReal_of_le_half Q ht_half] + +theorem integrableOn_cubeSet_iff_integrableOn_openCubeSet + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {Q : TriadicCube d} {f : Vec d → E} : + MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume ↔ + MeasureTheory.IntegrableOn f (openCubeSet Q) MeasureTheory.volume := by + exact MeasureTheory.integrableOn_congr_set_ae (cubeSet_ae_eq_openCubeSet Q) + +theorem setIntegral_cubeSet_eq_setIntegral_openCubeSet + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {Q : TriadicCube d} {f : Vec d → E} : + ∫ x in cubeSet Q, f x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_congr_set (cubeSet_ae_eq_openCubeSet Q) + +theorem volume_cubeBoundary_eq_zero {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (cubeBoundary Q) = 0 := by + have hAE : cubeSet Q =ᵐ[MeasureTheory.volume] openCubeSet Q := cubeSet_ae_eq_openCubeSet Q + have hdiff : MeasureTheory.volume (cubeSet Q \ openCubeSet Q) = 0 := + (MeasureTheory.ae_eq_set.mp hAE).1 + simpa [cubeBoundary] using hdiff + +theorem volume_cubeBoundaryLayer_zero {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.volume (cubeBoundaryLayer Q 0) = 0 := by + simp + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMetric.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMetric.lean new file mode 100644 index 0000000000..3282b64b13 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/CubeMetric.lean @@ -0,0 +1,141 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import Mathlib.MeasureTheory.Integral.Average +public import Mathlib.Topology.MetricSpace.Pseudo.Pi + +/-! # Cube Metric -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable def cubeCenter {d : ℕ} (Q : TriadicCube d) : Vec d := + fun i => (Q.index i : ℝ) * cubeScaleFactor Q + +noncomputable def cubeRadius {d : ℕ} (Q : TriadicCube d) : ℝ := + (1 / 2 : ℝ) * cubeScaleFactor Q + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +theorem cubeRadius_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeRadius Q := by + unfold cubeRadius + exact mul_pos (by norm_num) (cubeScaleFactor_pos Q) + +theorem cubeRadius_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeRadius Q := le_of_lt (cubeRadius_pos Q) + +theorem cubeScaleFactor_eq_two_mul_cubeRadius {d : ℕ} (Q : TriadicCube d) : + cubeScaleFactor Q = 2 * cubeRadius Q := by + unfold cubeRadius + ring + +theorem cubeScaleFactor_eq_one_of_scale_eq_zero {d : ℕ} {Q : TriadicCube d} + (hQ : Q.scale = 0) : + cubeScaleFactor Q = 1 := by + simp [cubeScaleFactor, hQ] + +theorem cubeRadius_eq_half_of_scale_eq_zero {d : ℕ} {Q : TriadicCube d} + (hQ : Q.scale = 0) : + cubeRadius Q = (1 / 2 : ℝ) := by + unfold cubeRadius + rw [cubeScaleFactor_eq_one_of_scale_eq_zero hQ] + norm_num + +private theorem cubeCenter_sub_cubeRadius {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + cubeCenter Q i - cubeRadius Q = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + simp [cubeCenter, cubeRadius] + ring_nf + +private theorem cubeCenter_add_cubeRadius {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + cubeCenter Q i + cubeRadius Q = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + simp [cubeCenter, cubeRadius] + ring_nf + +theorem closedBall_cubeCenter_eq_pi_Icc {d : ℕ} (Q : TriadicCube d) : + Metric.closedBall (cubeCenter Q) (cubeRadius Q) = + Set.pi Set.univ + (fun i : Fin d => + Set.Icc + (cubeCenter Q i - cubeRadius Q) + (cubeCenter Q i + cubeRadius Q)) := by + rw [closedBall_pi (cubeCenter Q) (cubeRadius_nonneg Q)] + ext x + constructor + · intro hx + simpa [Set.mem_pi, Set.mem_univ, true_implies, cubeCenter, cubeRadius, + Real.closedBall_eq_Icc, cubeCenter_sub_cubeRadius, + cubeCenter_add_cubeRadius] using hx + · intro hx + simpa [Set.mem_pi, Set.mem_univ, true_implies, cubeCenter, cubeRadius, + Real.closedBall_eq_Icc, cubeCenter_sub_cubeRadius, + cubeCenter_add_cubeRadius] using hx + +theorem ball_cubeCenter_eq_openCubeSet {d : ℕ} (Q : TriadicCube d) : + Metric.ball (cubeCenter Q) (cubeRadius Q) = openCubeSet Q := by + have hball_pi : + Metric.ball (cubeCenter Q) (cubeRadius Q) = + Set.pi Set.univ + (fun i : Fin d => Set.Ioo (cubeCenter Q i - cubeRadius Q) (cubeCenter Q i + cubeRadius Q)) := by + rw [ball_pi (cubeCenter Q) (cubeRadius_pos Q)] + ext x + simp [Real.ball_eq_Ioo] + rw [hball_pi, openCubeSet_eq_pi_Ioo] + simp [cubeCenter_sub_cubeRadius, cubeCenter_add_cubeRadius] + +theorem cubeSet_subset_closedBall {d : ℕ} (Q : TriadicCube d) : + cubeSet Q ⊆ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := by + intro x hx + rw [closedBall_cubeCenter_eq_pi_Icc] + rw [cubeSet_eq_pi_Ico] at hx + intro i hi + have hxi := hx i hi + refine ⟨?_, le_of_lt ?_⟩ + · dsimp [cubeCenter, cubeRadius] + nlinarith [hxi.1] + · dsimp [cubeCenter, cubeRadius] + nlinarith [hxi.2] + +theorem cubeSet_ae_eq_closedBall {d : ℕ} (Q : TriadicCube d) : + cubeSet Q =ᵐ[MeasureTheory.volume] Metric.closedBall (cubeCenter Q) (cubeRadius Q) := by + rw [cubeSet_eq_pi_Ico, closedBall_cubeCenter_eq_pi_Icc] + simpa [cubeCenter_sub_cubeRadius, cubeCenter_add_cubeRadius] using! + (MeasureTheory.Measure.univ_pi_Ico_ae_eq_Icc + (μ := fun _ : Fin d => (MeasureTheory.volume : MeasureTheory.Measure ℝ)) + (f := fun i : Fin d => (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + (g := fun i : Fin d => (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) + +theorem cubeAverage_eq_setAverage_cubeSet {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage Q f = ⨍ x in cubeSet Q, f x ∂MeasureTheory.volume := by + have hreal : MeasureTheory.volume.real (cubeSet Q) = cubeVolume Q := by + rw [MeasureTheory.measureReal_def] + exact volume_cubeSet_toReal (Q := Q) + calc + cubeAverage Q f = (cubeVolume Q)⁻¹ * ∫ x in cubeSet Q, f x ∂MeasureTheory.volume := rfl + _ = (MeasureTheory.volume.real (cubeSet Q))⁻¹ * + ∫ x in cubeSet Q, f x ∂MeasureTheory.volume := by rw [hreal] + _ = ⨍ x in cubeSet Q, f x ∂MeasureTheory.volume := by + rw [MeasureTheory.setAverage_eq] + simp + +theorem cubeAverage_eq_setAverage_closedBall {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage Q f = + ⨍ x in Metric.closedBall (cubeCenter Q) (cubeRadius Q), f x ∂MeasureTheory.volume := by + rw [cubeAverage_eq_setAverage_cubeSet] + exact MeasureTheory.setAverage_congr (cubeSet_ae_eq_closedBall Q) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/Domain.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/Domain.lean new file mode 100644 index 0000000000..715c12def6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/Domain.lean @@ -0,0 +1,43 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Domain -/ + +@[expose] public section + +namespace Homogenization + +def IsBoundedDomain {d : ℕ} (U : Set (Vec d)) : Prop := + ∃ R : ℝ, 0 < R ∧ ∀ x ∈ U, ∀ i, |x i| ≤ R + +/-- +Working domain-regularity predicate for the current Sobolev layer. + +At this stage of the development, the reusable geometric input needed by the +mean-zero and affine-average arguments is exactly measurability together with +the repository's bounded-domain predicate. +-/ +def IsSobolevRegularDomain {d : ℕ} (U : Set (Vec d)) : Prop := + MeasurableSet U ∧ IsBoundedDomain U + +namespace IsSobolevRegularDomain + +theorem measurableSet {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) : + MeasurableSet U := + hU.1 + +theorem isBoundedDomain {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) : + IsBoundedDomain U := + hU.2 + +end IsSobolevRegularDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeBoundaryPush.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeBoundaryPush.lean new file mode 100644 index 0000000000..29f8448ff0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeBoundaryPush.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import Mathlib.Topology.Constructions +public import Mathlib.Topology.Order.Compact + +/-! # Origin Cube Boundary Push -/ + +@[expose] public section + +namespace Homogenization + +/-- +The open realization of a triadic cube is open in `\R^d`. +-/ +theorem isOpen_openCubeSet {d : ℕ} (Q : TriadicCube d) : + IsOpen (openCubeSet Q) := by + rw [openCubeSet_eq_pi_Ioo] + exact isOpen_set_pi Set.finite_univ (fun _ _ => isOpen_Ioo) + +/-- +If a compact set `K` is contained in the half-open centered cube `\square_n`, +then every sufficiently small positive diagonal translation pushes `K` into the +open centered cube. + +This is the geometric input behind later boundary-pushing arguments for smooth +test functions on `cubeSet (originCube d n)`. +-/ +theorem IsCompact.exists_pos_forall_uniformTranslate_subset_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {K : Set (Vec d)} (hK : IsCompact K) + (hKsub : K ⊆ cubeSet (originCube d n)) : + ∃ ε₀ : ℝ, 0 < ε₀ ∧ + ∀ {ε : ℝ}, 0 < ε → ε < ε₀ → + (fun x : Vec d => x + (fun _ => ε)) '' K ⊆ openCubeSet (originCube d n) := by + by_cases hKempty : K = ∅ + · refine ⟨1, zero_lt_one, ?_⟩ + intro ε hε hεle + simp [hKempty] + · have hKne : K.Nonempty := by + exact Set.nonempty_iff_ne_empty.mpr hKempty + let R : ℝ := (1 / 2 : ℝ) * (3 : ℝ) ^ n + let coordImage : Fin d → Set ℝ := fun i => (fun x : Vec d => x i) '' K + let m : Fin d → ℝ := fun i => + Classical.choose ((hK.image (continuous_apply i)).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨x i, ⟨x, hx, rfl⟩⟩)) + have hm_mem : ∀ i : Fin d, m i ∈ coordImage i := by + intro i + exact (Classical.choose_spec ((hK.image (continuous_apply i)).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨x i, ⟨x, hx, rfl⟩⟩))).1 + have hm_ge : ∀ i : Fin d, ∀ y ∈ coordImage i, y ≤ m i := by + intro i + exact (Classical.choose_spec ((hK.image (continuous_apply i)).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨x i, ⟨x, hx, rfl⟩⟩))).2 + let δ : Fin d → ℝ := fun i => R - m i + have hδpos : ∀ i : Fin d, 0 < δ i := by + intro i + rcases hm_mem i with ⟨x, hx, hxeq⟩ + have hxR : x i < R := by + have hxCube := (mem_cubeSet_originCube_iff.mp (hKsub hx)) i + simpa [R] using hxCube.2 + have hmR : m i < R := by + simpa [hxeq] using hxR + dsimp [δ] + linarith + let values : Finset ℝ := Finset.univ.image δ + have hvalues_nonempty : values.Nonempty := (Finset.univ_nonempty.image δ) + let ε₀ : ℝ := values.min' hvalues_nonempty + have hε₀pos : 0 < ε₀ := by + rcases Finset.mem_image.mp (Finset.min'_mem values hvalues_nonempty) with ⟨i, _, hi_eq⟩ + have : 0 < values.min' hvalues_nonempty := by + rw [← hi_eq] + exact hδpos i + simpa [ε₀] using this + refine ⟨ε₀, hε₀pos, ?_⟩ + intro ε hεpos hεlt y hy + rcases hy with ⟨x, hx, rfl⟩ + rw [mem_openCubeSet_originCube_iff] + intro i + have hxCube := (mem_cubeSet_originCube_iff.mp (hKsub hx)) i + have hxle : x i ≤ m i := hm_ge i (x i) ⟨x, hx, rfl⟩ + have hε₀_le : ε₀ ≤ δ i := by + exact Finset.min'_le values (δ i) + (by + refine Finset.mem_image.mpr ?_ + exact ⟨i, Finset.mem_univ i, rfl⟩) + have hεδ : ε < δ i := lt_of_lt_of_le hεlt hε₀_le + constructor + · change (-(1 / 2 : ℝ)) * (3 : ℝ) ^ n < x i + ε + have hxlow : (-(1 / 2 : ℝ)) * (3 : ℝ) ^ n ≤ x i := hxCube.1 + have hlt : x i < x i + ε := by linarith + exact lt_of_le_of_lt hxlow hlt + · change x i + ε < (1 / 2 : ℝ) * (3 : ℝ) ^ n + have hupper : x i + ε ≤ m i + ε := by + simpa [add_comm] using add_le_add_right hxle ε + have hmε : m i + ε < R := by + dsimp [δ, R] at hεδ + linarith + exact lt_of_le_of_lt hupper hmε + +/-- +If a compact set `K` is contained in the half-open centered cube `\square_n`, +then some positive diagonal translation pushes `K` into the open centered cube. +-/ +theorem IsCompact.exists_pos_uniformTranslate_subset_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {K : Set (Vec d)} (hK : IsCompact K) + (hKsub : K ⊆ cubeSet (originCube d n)) : + ∃ ε : ℝ, 0 < ε ∧ (fun x : Vec d => x + (fun _ => ε)) '' K ⊆ openCubeSet (originCube d n) := by + rcases IsCompact.exists_pos_forall_uniformTranslate_subset_openCubeSet_originCube + (d := d) (n := n) (K := K) hK hKsub with ⟨ε₀, hε₀pos, htranslate⟩ + exact ⟨ε₀ / 2, by linarith, htranslate (by linarith) (by linarith)⟩ + +/-- +If a smooth test has compact support in the half-open centered cube, then every +sufficiently small positive precomposition by a negative diagonal translation +pushes its support into the open centered cube. +-/ +theorem HasCompactSupport.exists_pos_forall_precomp_subRight_tsupport_subset_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (hφsub : tsupport φ ⊆ cubeSet (originCube d n)) : + ∃ ε₀ : ℝ, 0 < ε₀ ∧ + ∀ {ε : ℝ}, 0 < ε → ε < ε₀ → + tsupport (fun x : Vec d => φ (x - (fun _ => ε))) ⊆ openCubeSet (originCube d n) := by + rcases IsCompact.exists_pos_forall_uniformTranslate_subset_openCubeSet_originCube + (d := d) (n := n) (K := tsupport φ) hφ.isCompact hφsub with ⟨ε₀, hε₀pos, htranslate⟩ + refine ⟨ε₀, hε₀pos, ?_⟩ + intro ε hεpos hεlt x hx + have hts : + tsupport (fun x : Vec d => φ (x - (fun _ => ε))) = + (Homeomorph.subRight (fun _ => ε)) ⁻¹' tsupport φ := by + simpa using! tsupport_comp_eq_preimage φ (Homeomorph.subRight (fun _ => ε)) + have hxmem : x - (fun _ => ε) ∈ tsupport φ := by + rw [hts] at hx + exact hx + refine htranslate hεpos hεlt ?_ + exact ⟨x - (fun _ => ε), hxmem, by + ext i + simp⟩ + +/-- +If a smooth test has compact support in the half-open centered cube, then after +precomposing with a small negative diagonal translation, its support lies in the +open centered cube. +-/ +theorem HasCompactSupport.exists_pos_precomp_subRight_tsupport_subset_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (hφsub : tsupport φ ⊆ cubeSet (originCube d n)) : + ∃ ε : ℝ, 0 < ε ∧ + tsupport (fun x : Vec d => φ (x - (fun _ => ε))) ⊆ openCubeSet (originCube d n) := by + rcases HasCompactSupport.exists_pos_forall_precomp_subRight_tsupport_subset_openCubeSet_originCube + (d := d) (n := n) (φ := φ) hφ hφsub with ⟨ε₀, hε₀pos, hpush⟩ + exact ⟨ε₀ / 2, by linarith, hpush (by linarith) (by linarith)⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeMeasureBridge.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeMeasureBridge.lean new file mode 100644 index 0000000000..8c263e7cf2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/OriginCubeMeasureBridge.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import Mathlib.MeasureTheory.Integral.Bochner.Set + +/-! # Origin Cube Measure Bridge -/ + +@[expose] public section + +namespace Homogenization + +/-- +The half-open and open realizations of the centered cube at scale `n` agree +almost everywhere for Lebesgue measure. +-/ +theorem cubeSet_originCube_ae_eq_openCubeSet {d : ℕ} (n : ℤ) : + cubeSet (originCube d n) =ᵐ[MeasureTheory.volume] openCubeSet (originCube d n) := + cubeSet_ae_eq_openCubeSet (originCube d n) + +/-- +Restricted Lebesgue measure on the half-open centered cube agrees with the +restriction to the corresponding open cube. +-/ +theorem volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube + {d : ℕ} (n : ℤ) : + MeasureTheory.volume.restrict (cubeSet (originCube d n)) = + MeasureTheory.volume.restrict (openCubeSet (originCube d n)) := + MeasureTheory.Measure.restrict_congr_set (cubeSet_originCube_ae_eq_openCubeSet (d := d) n) + +/-- +Almost-everywhere statements over the half-open centered cube are equivalent to +the corresponding statements over the open centered cube. +-/ +theorem ae_restrict_cubeSet_originCube_iff {d : ℕ} {n : ℤ} {p : Vec d → Prop} : + (∀ᵐ x ∂MeasureTheory.volume.restrict (cubeSet (originCube d n)), p x) ↔ + ∀ᵐ x ∂MeasureTheory.volume.restrict (openCubeSet (originCube d n)), p x := by + exact MeasureTheory.ae_restrict_congr_set (cubeSet_originCube_ae_eq_openCubeSet (d := d) n) + +/-- +Integrability on the half-open centered cube is equivalent to integrability on +the corresponding open cube. +-/ +theorem integrableOn_cubeSet_originCube_iff_integrableOn_openCubeSet_originCube + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {n : ℤ} {f : Vec d → E} : + MeasureTheory.IntegrableOn f (cubeSet (originCube d n)) MeasureTheory.volume ↔ + MeasureTheory.IntegrableOn f (openCubeSet (originCube d n)) MeasureTheory.volume := by + exact MeasureTheory.integrableOn_congr_set_ae + (cubeSet_originCube_ae_eq_openCubeSet (d := d) n) + +/-- +Set integrals over the half-open centered cube and the corresponding open cube +agree. +-/ +theorem setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {n : ℤ} {f : Vec d → E} : + ∫ x in cubeSet (originCube d n), f x ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), f x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_congr_set + (cubeSet_originCube_ae_eq_openCubeSet (d := d) n) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCenters.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCenters.lean new file mode 100644 index 0000000000..bfb5775b32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCenters.lean @@ -0,0 +1,352 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCube + +/-! # Overlap Centers -/ + +@[expose] public section + +namespace Homogenization + +namespace ScalarOverlap + +noncomputable section + +open scoped BigOperators ENNReal + +private theorem cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth' {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) : + cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := by + rw [cubeScaleFactor, scale_eq_sub_of_mem_descendantsAtDepth hR, zpow_sub₀] + · simp [cubeScaleFactor, div_eq_mul_inv] + · norm_num + +/-- Fine-grid centers used by the overlapping norm at depth `j`. + +The centers are descendants one generation below the cube scale. We retain only +those centers whose overlapping cube lies inside the parent cube. -/ +noncomputable def centersAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : Finset (TriadicCube d) := by + classical + exact (descendantsAtDepth Q (j + 1)).filter + (fun S => cubeSet S ⊆ Homogenization.cubeSet Q) + +theorem mem_centersAtDepth_iff {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} : + S ∈ centersAtDepth Q j ↔ + S ∈ descendantsAtDepth Q (j + 1) ∧ cubeSet S ⊆ Homogenization.cubeSet Q := by + classical + simp [centersAtDepth] + +theorem mem_descendantsAtDepth_of_mem_centersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + S ∈ descendantsAtDepth Q (j + 1) := + (mem_centersAtDepth_iff.mp hS).1 + +theorem cubeSet_subset_cubeSet_of_mem_centersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + cubeSet S ⊆ Homogenization.cubeSet Q := + (mem_centersAtDepth_iff.mp hS).2 + +theorem openCubeSet_subset_openCubeSet_of_mem_centersAtDepth {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + openCubeSet S ⊆ Homogenization.openCubeSet Q := by + have hsub : openCubeSet S ⊆ Homogenization.cubeSet Q := + (openCubeSet_subset_cubeSet S).trans + (cubeSet_subset_cubeSet_of_mem_centersAtDepth hS) + have hsub_int : openCubeSet S ⊆ interior (Homogenization.cubeSet Q) := + (isOpen_openCubeSet S).subset_interior_iff.2 hsub + simpa [interior_cubeSet_eq_openCubeSet Q] using hsub_int + +theorem scaleFactor_eq_cubeScaleFactor_div_pow_of_mem_centersAtDepth + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + scaleFactor S = cubeScaleFactor Q / (3 : ℝ) ^ j := by + have hdesc : S ∈ descendantsAtDepth Q (j + 1) := + mem_descendantsAtDepth_of_mem_centersAtDepth hS + unfold scaleFactor + rw [cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth' hdesc] + have hpow_succ : (3 : ℝ) ^ (j + 1) = (3 : ℝ) ^ j * 3 := by + rw [pow_succ] + rw [hpow_succ] + field_simp [pow_ne_zero j (show (3 : ℝ) ≠ 0 by norm_num)] + +private theorem parent_center_coord_mem_overlap_child {d : ℕ} + (Q : TriadicCube d) (digits : Fin d → Fin 3) (i : Fin d) : + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } + ((((child.index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor child ≤ + (Q.index i : ℝ) * cubeScaleFactor Q) ∧ + ((Q.index i : ℝ) * cubeScaleFactor Q < + ((((child.index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor child)) := by + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } + have hscale : cubeScaleFactor child = cubeScaleFactor Q / 3 := by + simp [child] + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hd_nonneg : 0 ≤ ((digits i : ℤ) : ℝ) := by + exact_mod_cast (Nat.zero_le (digits i).val) + have hd_le_two : ((digits i : ℤ) : ℝ) ≤ 2 := by + have hd_le_two_int : (digits i : ℤ) ≤ 2 := by + exact_mod_cast (Nat.le_of_lt_succ (digits i).isLt) + exact_mod_cast hd_le_two_int + have hindex : + (((child.index i : ℤ) : ℝ)) = + 3 * (Q.index i : ℝ) + ((digits i : ℤ) : ℝ) - 1 := by + simp [child] + constructor + · rw [hscale, hindex] + nlinarith + · rw [hscale, hindex] + nlinarith + +theorem eq_middleChildCube_of_mem_childCubes_of_cubeSet_subset + {d : ℕ} {Q S : TriadicCube d} (hS : S ∈ childCubes Q) + (hsub : cubeSet S ⊆ Homogenization.cubeSet Q) : + S = middleChildCube Q := by + classical + rcases mem_childCubes_iff.mp hS with ⟨digits, rfl⟩ + unfold middleChildCube + apply congrArg₂ TriadicCube.mk + · rfl + · funext i + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + by_cases h0 : digits i = (0 : Fin 3) + · exfalso + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } + let center : Vec d := fun k => (Q.index k : ℝ) * cubeScaleFactor Q + let x : Vec d := + Function.update center i (((Q.index i : ℝ) - (5 / 6 : ℝ)) * cubeScaleFactor Q) + have hscale : cubeScaleFactor child = cubeScaleFactor Q / 3 := by + simp [child] + have hx_overlap : x ∈ cubeSet child := by + intro k + by_cases hk : k = i + · subst k + have hindex : + (((child.index i : ℤ) : ℝ)) = 3 * (Q.index i : ℝ) - 1 := by + simp [child, h0] + have hxcoord : + x i = ((Q.index i : ℝ) - (5 / 6 : ℝ)) * cubeScaleFactor Q := by + simp [x] + constructor + · rw [hxcoord, hscale, hindex] + nlinarith + · rw [hxcoord, hscale, hindex] + nlinarith + · have hcenter := parent_center_coord_mem_overlap_child Q digits k + have hxcoord : x k = center k := by + simp [x, hk] + simpa [child, center, hxcoord] using hcenter + have hx_parent := hsub hx_overlap + have hxcoord : + x i = ((Q.index i : ℝ) - (5 / 6 : ℝ)) * cubeScaleFactor Q := by + simp [x] + have hparent_lower : + ((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q ≤ + ((Q.index i : ℝ) - (5 / 6 : ℝ)) * cubeScaleFactor Q := by + simpa [Homogenization.cubeSet, hxcoord] using (hx_parent i).1 + nlinarith + · by_cases h1 : digits i = (1 : Fin 3) + · simp [h1] + · have h2 : digits i = (2 : Fin 3) := by + apply Fin.ext + have hval_le : (digits i).val ≤ 2 := + Nat.le_of_lt_succ (digits i).isLt + have hval_ne_zero : (digits i).val ≠ 0 := by + intro hval + exact h0 (Fin.ext hval) + have hval_ne_one : (digits i).val ≠ 1 := by + intro hval + exact h1 (Fin.ext hval) + omega + exfalso + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun k => 3 * Q.index k + (digits k : ℤ) - 1 } + let center : Vec d := fun k => (Q.index k : ℝ) * cubeScaleFactor Q + let x : Vec d := + Function.update center i (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + have hscale : cubeScaleFactor child = cubeScaleFactor Q / 3 := by + simp [child] + have hx_overlap : x ∈ cubeSet child := by + intro k + by_cases hk : k = i + · subst k + have hindex : + (((child.index i : ℤ) : ℝ)) = 3 * (Q.index i : ℝ) + 1 := by + simp [child, h2] + ring + have hxcoord : + x i = ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + simp [x] + constructor + · rw [hxcoord, hscale, hindex] + nlinarith + · rw [hxcoord, hscale, hindex] + nlinarith + · have hcenter := parent_center_coord_mem_overlap_child Q digits k + have hxcoord : x k = center k := by + simp [x, hk] + simpa [child, center, hxcoord] using hcenter + have hx_parent := hsub hx_overlap + have hxcoord : + x i = ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + simp [x] + have hparent_upper : + ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q < + ((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + simpa [Homogenization.cubeSet, hxcoord] using (hx_parent i).2 + exact (lt_irrefl _ hparent_upper) + +theorem middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + middleChildCube R ∈ centersAtDepth Q j := by + rw [mem_centersAtDepth_iff] + refine ⟨?_, ?_⟩ + · rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr + ⟨R, hR, middleChildCube_mem_childCubes R⟩ + · intro x hx + have hxR : x ∈ Homogenization.cubeSet R := by + simpa [cubeSet_middleChildCube_eq_cubeSet R] using hx + exact cubeSet_subset_of_mem_descendantsAtDepth hR hxR + +@[simp] theorem centersAtDepth_zero {d : ℕ} + (Q : TriadicCube d) : + centersAtDepth Q 0 = {middleChildCube Q} := by + classical + ext S + constructor + · intro hS + have hdesc : S ∈ descendantsAtDepth Q 1 := + mem_descendantsAtDepth_of_mem_centersAtDepth (j := 0) hS + have hchild : S ∈ childCubes Q := by + simpa using hdesc + have hsub : cubeSet S ⊆ Homogenization.cubeSet Q := + cubeSet_subset_cubeSet_of_mem_centersAtDepth (j := 0) hS + have hEq : S = middleChildCube Q := + eq_middleChildCube_of_mem_childCubes_of_cubeSet_subset hchild hsub + simp [hEq] + · intro hS + have hEq : S = middleChildCube Q := by + simpa using hS + rw [hEq] + exact middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth (by simp) + +theorem exists_mem_centersAtDepth_of_mem_cubeSet {d : ℕ} + {Q : TriadicCube d} {x : Vec d} (j : ℕ) + (hx : x ∈ Homogenization.cubeSet Q) : + ∃ S ∈ centersAtDepth Q j, x ∈ cubeSet S := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet j hx with ⟨R, hR, hxR⟩ + refine ⟨middleChildCube R, + middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth hR, ?_⟩ + simpa [cubeSet_middleChildCube_eq_cubeSet R] using hxR + +theorem centersAtDepth_nonempty {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (centersAtDepth Q j).Nonempty := by + rcases descendantsAtDepth_nonempty Q j with ⟨R, hR⟩ + exact ⟨middleChildCube R, + middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth hR⟩ + +theorem centersAtDepth_card_pos {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + 0 < (centersAtDepth Q j).card := + Finset.card_pos.mpr (centersAtDepth_nonempty Q j) + +theorem centersAtDepth_card_ne_zero {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (centersAtDepth Q j).card ≠ 0 := + ne_of_gt (centersAtDepth_card_pos Q j) + +theorem centersAtDepth_card_le_descendantsAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (centersAtDepth Q j).card ≤ + (descendantsAtDepth Q (j + 1)).card := by + classical + unfold centersAtDepth + exact Finset.card_filter_le _ _ + +theorem centersAtDepth_card_le_pow {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (centersAtDepth Q j).card ≤ (3 ^ d) ^ (j + 1) := by + rw [← descendantsAtDepth_card Q (j + 1)] + exact centersAtDepth_card_le_descendantsAtDepth_card Q j + +theorem descendantsAtDepth_card_le_centersAtDepth_card {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + (descendantsAtDepth Q j).card ≤ (centersAtDepth Q j).card := by + classical + refine Finset.card_le_card_of_injOn (fun R => middleChildCube R) ?_ ?_ + · intro R hR + exact middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth hR + · intro R _hR S _hS hRS + exact middleChildCube_injective hRS + +/-- Average over the overlapping centers at a fixed depth. -/ +noncomputable def centersAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) : ℝ := + let D := centersAtDepth Q j + ((D.card : ℝ)⁻¹) * D.sum F + +theorem centersAverage_le_centersAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) {F G : TriadicCube d → ℝ} + (hFG : ∀ S ∈ centersAtDepth Q j, F S ≤ G S) : + centersAverage Q j F ≤ centersAverage Q j G := by + classical + unfold centersAverage + exact mul_le_mul_of_nonneg_left + (Finset.sum_le_sum hFG) + (inv_nonneg.mpr (by positivity)) + +theorem centersAverage_const_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) + (hD : (centersAtDepth Q j).Nonempty) : + centersAverage Q j (fun _ => c) = c := by + classical + let D := centersAtDepth Q j + change ((D.card : ℝ)⁻¹) * D.sum (fun _ => c) = c + have hD' : D.Nonempty := by + simpa [D] using hD + have hcard : (((D.card : ℕ) : ℝ) ≠ 0) := by + exact_mod_cast (Finset.card_ne_zero.mpr hD') + rw [Finset.sum_const, nsmul_eq_mul] + rw [← mul_assoc, inv_mul_cancel₀ hcard, one_mul] + +theorem centersAverage_const {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + centersAverage Q j (fun _ => c) = c := + centersAverage_const_eq Q j c (centersAtDepth_nonempty Q j) + +theorem centersAverage_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (F : TriadicCube d → ℝ) + (hF : ∀ S ∈ centersAtDepth Q j, 0 ≤ F S) : + 0 ≤ centersAverage Q j F := by + unfold centersAverage + exact mul_nonneg (inv_nonneg.mpr (by positivity)) + (Finset.sum_nonneg hF) + +end + +end ScalarOverlap + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCube.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCube.lean new file mode 100644 index 0000000000..4642180f01 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/OverlapCube.lean @@ -0,0 +1,392 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure + +/-! # Overlap Cube -/ + +@[expose] public section + +namespace Homogenization + +namespace ScalarOverlap + +noncomputable section + +open MeasureTheory +open scoped ENNReal Pointwise + +/-- Side length of the overlapping cube centered at the fine-grid cube `S`. +If `S` has scale `k - 1`, this overlapping cube has side length `3^k`. -/ +noncomputable def scaleFactor {d : ℕ} (S : TriadicCube d) : ℝ := + 3 * cubeScaleFactor S + +theorem scaleFactor_pos {d : ℕ} (S : TriadicCube d) : + 0 < scaleFactor S := by + unfold scaleFactor + exact mul_pos (by norm_num) + (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale)) + +theorem scaleFactor_nonneg {d : ℕ} (S : TriadicCube d) : + 0 ≤ scaleFactor S := + (scaleFactor_pos S).le + +/-- The half-open overlapping cube centered at `cubeCenter S` with side length +`3 * cubeScaleFactor S`. -/ +def cubeSet {d : ℕ} (S : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S ≤ x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S)) } + +/-- The open overlapping cube with the same center and side length as `cubeSet`. -/ +def openCubeSet {d : ℕ} (S : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S)) } + +theorem measurableSet_coord_halfOpenStrip {d : ℕ} + (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a ≤ x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isClosed_le continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +theorem measurableSet_coord_openStrip {d : ℕ} + (i : Fin d) (a b : ℝ) : + MeasurableSet {x : Vec d | a < x i ∧ x i < b} := by + refine MeasurableSet.inter ?_ ?_ + · exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet + · exact (isOpen_lt (continuous_apply i) continuous_const).measurableSet + +theorem measurableSet_cubeSet {d : ℕ} (S : TriadicCube d) : + MeasurableSet (cubeSet S) := by + classical + simpa [cubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_halfOpenStrip i + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) + +theorem measurableSet_openCubeSet {d : ℕ} (S : TriadicCube d) : + MeasurableSet (openCubeSet S) := by + classical + simpa [openCubeSet, Set.iInter_ofPred] using + (MeasurableSet.iInter fun i : Fin d => + measurableSet_coord_openStrip i + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) + +theorem isOpen_openCubeSet {d : ℕ} (S : TriadicCube d) : + IsOpen (openCubeSet S) := by + classical + rw [openCubeSet] + have hEq : + {x : Vec d | + ∀ i : Fin d, + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))} = + (⋂ i : Fin d, + {x : Vec d | + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S < x i) ∧ + (x i < (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))}) := by + ext x + simp + rw [hEq] + exact + (isOpen_iInter_of_finite fun i : Fin d => + (isOpen_lt + (show Continuous fun _x : Vec d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S) from continuous_const) + (continuous_apply i)).inter + (isOpen_lt (continuous_apply i) + (show Continuous fun _x : Vec d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S) from continuous_const))) + +theorem cubeSet_eq_pi_Ico {d : ℕ} (S : TriadicCube d) : + cubeSet S = + Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) := by + ext x + simp [cubeSet] + +theorem openCubeSet_eq_pi_Ioo {d : ℕ} (S : TriadicCube d) : + openCubeSet S = + Set.pi Set.univ + (fun i : Fin d => + Set.Ioo + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))) := by + ext x + simp [openCubeSet] + +theorem cubeSet_ae_eq_openCubeSet {d : ℕ} (S : TriadicCube d) : + cubeSet S =ᵐ[MeasureTheory.volume] openCubeSet S := by + rw [cubeSet_eq_pi_Ico, openCubeSet_eq_pi_Ioo] + exact (MeasureTheory.Measure.univ_pi_Ico_ae_eq_Icc (f := fun i : Fin d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + (g := fun i : Fin d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))).trans + (MeasureTheory.Measure.univ_pi_Ioo_ae_eq_Icc (f := fun i : Fin d => + (((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + (g := fun i : Fin d => + (((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))).symm + +theorem volume_restrict_cubeSet_eq_volume_restrict_openCubeSet + {d : ℕ} (S : TriadicCube d) : + MeasureTheory.volume.restrict (cubeSet S) = + MeasureTheory.volume.restrict (openCubeSet S) := + MeasureTheory.Measure.restrict_congr_set (cubeSet_ae_eq_openCubeSet S) + +theorem openCubeSet_subset_cubeSet {d : ℕ} (S : TriadicCube d) : + openCubeSet S ⊆ cubeSet S := by + intro x hx i + exact ⟨le_of_lt (hx i).1, (hx i).2⟩ + +theorem interior_cubeSet_eq_openCubeSet {d : ℕ} (Q : TriadicCube d) : + interior (Homogenization.cubeSet Q) = Homogenization.openCubeSet Q := by + rw [Homogenization.cubeSet_eq_pi_Ico, Homogenization.openCubeSet_eq_pi_Ioo, + interior_pi_set Set.finite_univ] + simp [interior_Ico] + +def middleChildCube {d : ℕ} (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i } + +theorem middleChildCube_mem_childCubes {d : ℕ} (Q : TriadicCube d) : + middleChildCube Q ∈ childCubes Q := by + simpa [middleChildCube] using middleChild_mem_childCubes Q + +@[simp] theorem scaleFactor_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + scaleFactor (middleChildCube Q) = cubeScaleFactor Q := by + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + unfold scaleFactor + rw [hscale] + ring + +theorem cubeSet_middleChildCube_eq_cubeSet {d : ℕ} (Q : TriadicCube d) : + cubeSet (middleChildCube Q) = Homogenization.cubeSet Q := by + ext x + constructor + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by + simp [middleChildCube] + have hlower : + (((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + (((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa [hlower] using hlo, by simpa [hupper] using hhi⟩ + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + have hscale : + cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by + simp [middleChildCube] + have hlower : + (((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + (((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q)) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa [hlower] using hlo, by simpa [hupper] using hhi⟩ + +theorem cubeSet_middleChildCube_subset_cubeSet {d : ℕ} + (Q : TriadicCube d) : + cubeSet (middleChildCube Q) ⊆ Homogenization.cubeSet Q := by + rw [cubeSet_middleChildCube_eq_cubeSet] + +theorem middleChildCube_injective {d : ℕ} : + Function.Injective (middleChildCube : TriadicCube d → TriadicCube d) := by + intro Q R hQR + cases Q with + | mk scaleQ indexQ => + cases R with + | mk scaleR indexR => + simp [middleChildCube] at hQR ⊢ + rcases hQR with ⟨hscale, hindex⟩ + constructor + · omega + · funext i + exact mul_right_cancel₀ (show (3 : ℤ) ≠ 0 by norm_num) + (by simpa [mul_comm] using congrFun hindex i) + +/-- Volume of an overlapping cube. -/ +noncomputable def cubeVolume {d : ℕ} (S : TriadicCube d) : ℝ := + (scaleFactor S) ^ d + +@[simp] theorem cubeVolume_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + cubeVolume (middleChildCube Q) = Homogenization.cubeVolume Q := by + simp [cubeVolume, Homogenization.cubeVolume_eq_scaleFactor_pow] + +theorem cubeVolume_pos {d : ℕ} (S : TriadicCube d) : + 0 < cubeVolume S := by + unfold cubeVolume + exact pow_pos (scaleFactor_pos S) d + +theorem cubeVolume_nonneg {d : ℕ} (S : TriadicCube d) : + 0 ≤ cubeVolume S := + (cubeVolume_pos S).le + +@[simp] theorem volume_cubeSet_toReal {d : ℕ} (S : TriadicCube d) : + (MeasureTheory.volume (cubeSet S)).toReal = cubeVolume S := by + let a : Fin d → ℝ := + fun i => ((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S + let b : Fin d → ℝ := + fun i => ((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S + have hscale_pos : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + have hab : a ≤ b := by + intro i + dsimp [a, b] + nlinarith + rw [cubeSet_eq_pi_Ico] + have hside : ∀ i : Fin d, b i - a i = scaleFactor S := by + intro i + dsimp [a, b, scaleFactor] + ring + calc + (MeasureTheory.volume + (Set.pi Set.univ + (fun i : Fin d => + Set.Ico + ((((S.index i : ℝ) - (3 / 2 : ℝ)) * cubeScaleFactor S)) + ((((S.index i : ℝ) + (3 / 2 : ℝ)) * cubeScaleFactor S))))).toReal + = ∏ i : Fin d, (b i - a i) := by + simpa [a, b] using Real.volume_pi_Ico_toReal (ι := Fin d) hab + _ = cubeVolume S := by + calc + ∏ i : Fin d, (b i - a i) = + ∏ _i : Fin d, scaleFactor S := by + refine Finset.prod_congr rfl ?_ + intro i hi + exact hside i + _ = cubeVolume S := by + simp [cubeVolume] + +@[simp] theorem volume_openCubeSet_toReal {d : ℕ} (S : TriadicCube d) : + (MeasureTheory.volume (openCubeSet S)).toReal = cubeVolume S := by + have hmeasure : + MeasureTheory.volume (cubeSet S) = + MeasureTheory.volume (openCubeSet S) := + MeasureTheory.measure_congr (cubeSet_ae_eq_openCubeSet S) + rw [← hmeasure, volume_cubeSet_toReal] + +theorem volume_cubeSet_lt_top {d : ℕ} (S : TriadicCube d) : + MeasureTheory.volume (cubeSet S) < ⊤ := by + refine lt_of_le_of_ne le_top ?_ + intro htop + have htoReal : (MeasureTheory.volume (cubeSet S)).toReal = 0 := by + simp [htop] + rw [volume_cubeSet_toReal] at htoReal + exact (cubeVolume_pos S).ne' htoReal + +/-- Unnormalized measure on an overlapping cube. -/ +noncomputable def cubeMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.Measure (Vec d) := + volume.restrict (cubeSet S) + +/-- Normalized measure on an overlapping cube. -/ +noncomputable def normalizedCubeMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.Measure (Vec d) := + ENNReal.ofReal ((cubeVolume S)⁻¹) • cubeMeasure S + +@[simp] theorem cubeMeasure_apply_univ {d : ℕ} (S : TriadicCube d) : + cubeMeasure S Set.univ = MeasureTheory.volume (cubeSet S) := by + rw [cubeMeasure, MeasureTheory.Measure.restrict_apply_univ] + +@[simp] theorem cubeMeasure_apply_univ_toReal {d : ℕ} (S : TriadicCube d) : + (cubeMeasure S Set.univ).toReal = cubeVolume S := by + simp [cubeMeasure] + +theorem cubeMeasure_apply_univ_ne_top {d : ℕ} (S : TriadicCube d) : + cubeMeasure S Set.univ ≠ ∞ := by + intro htop + have hzero : (cubeMeasure S Set.univ).toReal = 0 := by + simp [htop] + have hvol : (cubeMeasure S Set.univ).toReal = cubeVolume S := + cubeMeasure_apply_univ_toReal S + have : cubeVolume S = 0 := by + simpa [hvol] using hzero + exact (cubeVolume_pos S).ne' this + +@[simp] theorem cubeMeasure_apply_univ_eq {d : ℕ} (S : TriadicCube d) : + cubeMeasure S Set.univ = ENNReal.ofReal (cubeVolume S) := by + exact (ENNReal.toReal_eq_toReal_iff' (cubeMeasure_apply_univ_ne_top S) + ENNReal.ofReal_ne_top).1 (by + rw [cubeMeasure_apply_univ_toReal S, + ENNReal.toReal_ofReal (cubeVolume_nonneg S)]) + +@[simp] theorem normalizedCubeMeasure_apply_univ {d : ℕ} (S : TriadicCube d) : + normalizedCubeMeasure S Set.univ = 1 := by + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply, + cubeMeasure_apply_univ_eq S] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos S)] + have hvol : ENNReal.ofReal (cubeVolume S) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos S) + simpa [smul_eq_mul] using ENNReal.inv_mul_cancel hvol ENNReal.ofReal_ne_top + +instance normalizedCubeMeasure.instIsFiniteMeasure {d : ℕ} (S : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (normalizedCubeMeasure S) where + measure_univ_lt_top := by + simp [normalizedCubeMeasure_apply_univ S] + +theorem normalizedCubeMeasure_ne_zero {d : ℕ} (S : TriadicCube d) : + normalizedCubeMeasure S ≠ 0 := by + intro hzero + have huniv : normalizedCubeMeasure S Set.univ = 0 := by + rw [hzero] + simp + simp at huniv + +theorem lintegral_normalizedCubeMeasure_eq {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ≥0∞) : + ∫⁻ x, f x ∂(normalizedCubeMeasure S) = + ENNReal.ofReal ((cubeVolume S)⁻¹) * + ∫⁻ x in cubeSet S, f x ∂MeasureTheory.volume := by + rw [normalizedCubeMeasure, cubeMeasure] + rw [MeasureTheory.lintegral_smul_measure] + rfl + +end + +end ScalarOverlap + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/ScaleColoring.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/ScaleColoring.lean new file mode 100644 index 0000000000..d82f859a5b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/ScaleColoring.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring + +/-! # Scale Coloring -/ + +@[expose] public section + +namespace Homogenization + +/-- The Chapter 4 scale-dependent coloring period +`r_k = 1 + \lceil 3^{-k} \rceil`. -/ +noncomputable def scaleColorPeriod (k : ℤ) : ℕ := + 1 + Nat.ceil ((3 : ℝ) ^ (-k)) + +/-- The scale-dependent triadic colors attached to cubes at scale `k`. -/ +abbrev ScaleColor (d : ℕ) (k : ℤ) := Fin d → Fin (scaleColorPeriod k) + +lemma scaleColorPeriod_pos (k : ℤ) : 0 < scaleColorPeriod k := by + simp [scaleColorPeriod] + +lemma scaleColorPeriod_int_pos (k : ℤ) : 0 < (scaleColorPeriod k : ℤ) := by + exact_mod_cast scaleColorPeriod_pos k + +lemma scaleColorPeriod_int_ne_zero (k : ℤ) : (scaleColorPeriod k : ℤ) ≠ 0 := by + exact_mod_cast (Nat.ne_of_gt (scaleColorPeriod_pos k)) + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +/-- The scale-dependent color of a triadic cube, given by its coordinatewise +residue class modulo `r_k`. -/ +noncomputable def cubeScaleColor {d : ℕ} (k : ℤ) (Q : TriadicCube d) : ScaleColor d k := fun i => + ⟨Int.toNat (Q.index i % (scaleColorPeriod k : ℤ)), by + have hnonneg : 0 ≤ Q.index i % (scaleColorPeriod k : ℤ) := + Int.emod_nonneg _ (scaleColorPeriod_int_ne_zero k) + have hlt : Q.index i % (scaleColorPeriod k : ℤ) < (scaleColorPeriod k : ℤ) := + Int.emod_lt_of_pos _ (scaleColorPeriod_int_pos k) + rw [Int.toNat_lt hnonneg] + exact hlt⟩ + +/-- The descendants of `Q` at scale `k` with prescribed scale-dependent color +`c`. -/ +noncomputable def descendantsAtScaleScaleColorClass {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (c : ScaleColor d k) : + Finset (TriadicCube d) := + (descendantsAtScale Q k).filter fun R => cubeScaleColor k R = c + +@[simp] theorem cubeScaleColor_val {d : ℕ} (k : ℤ) (Q : TriadicCube d) (i : Fin d) : + (cubeScaleColor k Q i : ℕ) = Int.toNat (Q.index i % (scaleColorPeriod k : ℤ)) := + rfl + +theorem cubeScaleColor_eq_iff_modEq {d : ℕ} {k : ℤ} {R S : TriadicCube d} : + cubeScaleColor k R = cubeScaleColor k S ↔ + ∀ i, R.index i ≡ S.index i [ZMOD (scaleColorPeriod k : ℤ)] := by + constructor + · intro h i + change R.index i % (scaleColorPeriod k : ℤ) = S.index i % (scaleColorPeriod k : ℤ) + have hval : + Int.toNat (R.index i % (scaleColorPeriod k : ℤ)) = + Int.toNat (S.index i % (scaleColorPeriod k : ℤ)) := by + simpa [cubeScaleColor] using + congrArg Fin.val (congrArg (fun c : ScaleColor d k => c i) h) + have hcast : + (((Int.toNat (R.index i % (scaleColorPeriod k : ℤ)) : ℕ) : ℤ)) = + Int.toNat (S.index i % (scaleColorPeriod k : ℤ)) := by + exact_mod_cast hval + have hR_nonneg : 0 ≤ R.index i % (scaleColorPeriod k : ℤ) := + Int.emod_nonneg _ (scaleColorPeriod_int_ne_zero k) + have hS_nonneg : 0 ≤ S.index i % (scaleColorPeriod k : ℤ) := + Int.emod_nonneg _ (scaleColorPeriod_int_ne_zero k) + simpa [Int.ModEq, Int.toNat_of_nonneg hR_nonneg, Int.toNat_of_nonneg hS_nonneg] using hcast + · intro h + funext i + apply Fin.ext + have hmod : R.index i % (scaleColorPeriod k : ℤ) = S.index i % (scaleColorPeriod k : ℤ) := by + simpa [Int.ModEq] using h i + have hR_nonneg : 0 ≤ R.index i % (scaleColorPeriod k : ℤ) := + Int.emod_nonneg _ (scaleColorPeriod_int_ne_zero k) + have hS_nonneg : 0 ≤ S.index i % (scaleColorPeriod k : ℤ) := + Int.emod_nonneg _ (scaleColorPeriod_int_ne_zero k) + simpa [cubeScaleColor, Int.toNat_of_nonneg hR_nonneg, Int.toNat_of_nonneg hS_nonneg] using + congrArg Int.toNat hmod + +@[simp] theorem mem_descendantsAtScaleScaleColorClass_iff {d : ℕ} {Q R : TriadicCube d} + {k : ℤ} {c : ScaleColor d k} : + R ∈ descendantsAtScaleScaleColorClass Q k c ↔ + R ∈ descendantsAtScale Q k ∧ cubeScaleColor k R = c := by + simp [descendantsAtScaleScaleColorClass] + +theorem mem_descendantsAtScaleScaleColorClass_self {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hR : R ∈ descendantsAtScale Q k) : + R ∈ descendantsAtScaleScaleColorClass Q k (cubeScaleColor k R) := by + simp [descendantsAtScaleScaleColorClass, hR] + +@[simp] theorem card_scaleColor (d : ℕ) (k : ℤ) : + Fintype.card (ScaleColor d k) = scaleColorPeriod k ^ d := by + simp [ScaleColor] + +theorem card_image_cubeScaleColor_descendantsAtScale_le {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + ((descendantsAtScale Q k).image (cubeScaleColor k)).card ≤ scaleColorPeriod k ^ d := by + have hsubset : + (descendantsAtScale Q k).image (cubeScaleColor k) ⊆ (Finset.univ : Finset (ScaleColor d k)) := by + intro c hc + simp + simpa [card_scaleColor] using Finset.card_le_card hsubset + +theorem descendantsAtScale_eq_biUnion_scaleColorClass {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + (Finset.univ : Finset (ScaleColor d k)).biUnion (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k := by + ext R + constructor + · intro hR + rcases Finset.mem_biUnion.mp hR with ⟨c, -, hRc⟩ + exact (mem_descendantsAtScaleScaleColorClass_iff.mp hRc).1 + · intro hR + exact Finset.mem_biUnion.mpr + ⟨cubeScaleColor k R, by simp, mem_descendantsAtScaleScaleColorClass_self hR⟩ + +theorem descendantsAtScale_eq_biUnion_image_cubeScaleColor {d : ℕ} (Q : TriadicCube d) (k : ℤ) : + ((descendantsAtScale Q k).image (cubeScaleColor k)).biUnion + (descendantsAtScaleScaleColorClass Q k) = + descendantsAtScale Q k := by + ext R + constructor + · intro hR + rcases Finset.mem_biUnion.mp hR with ⟨c, -, hRc⟩ + exact (mem_descendantsAtScaleScaleColorClass_iff.mp hRc).1 + · intro hR + exact Finset.mem_biUnion.mpr + ⟨cubeScaleColor k R, Finset.mem_image.mpr ⟨R, hR, rfl⟩, + mem_descendantsAtScaleScaleColorClass_self hR⟩ + +theorem disjoint_descendantsAtScaleScaleColorClass_of_ne {d : ℕ} (Q : TriadicCube d) (k : ℤ) + {c₁ c₂ : ScaleColor d k} (hneq : c₁ ≠ c₂) : + Disjoint (descendantsAtScaleScaleColorClass Q k c₁) + (descendantsAtScaleScaleColorClass Q k c₂) := by + rw [Finset.disjoint_left] + intro R hR₁ hR₂ + have hc₁ : cubeScaleColor k R = c₁ := (mem_descendantsAtScaleScaleColorClass_iff.mp hR₁).2 + have hc₂ : cubeScaleColor k R = c₂ := (mem_descendantsAtScaleScaleColorClass_iff.mp hR₂).2 + exact hneq (hc₁.symm.trans hc₂) + +theorem card_descendantsAtScale_eq_sum_card_scaleColorClass_image {d : ℕ} + (Q : TriadicCube d) (k : ℤ) : + (descendantsAtScale Q k).card = + ((descendantsAtScale Q k).image (cubeScaleColor k)).sum + (fun c => (descendantsAtScaleScaleColorClass Q k c).card) := by + classical + calc + (descendantsAtScale Q k).card = + ((((descendantsAtScale Q k).image (cubeScaleColor k)).biUnion + (descendantsAtScaleScaleColorClass Q k)).card) := by + rw [descendantsAtScale_eq_biUnion_image_cubeScaleColor Q k] + _ = ((descendantsAtScale Q k).image (cubeScaleColor k)).sum + (fun c => (descendantsAtScaleScaleColorClass Q k c).card) := by + exact Finset.card_biUnion (by + intro c hc c' hc' hne + exact disjoint_descendantsAtScaleScaleColorClass_of_ne Q k hne) + +private theorem index_add_scaleColorPeriod_le_of_cubeScaleColor_eq_of_lt {d : ℕ} + {k : ℤ} {R S : TriadicCube d} {i : Fin d} + (hcolor : cubeScaleColor k R = cubeScaleColor k S) (hlt : R.index i < S.index i) : + R.index i + scaleColorPeriod k ≤ S.index i := by + have hmod : + R.index i ≡ S.index i [ZMOD (scaleColorPeriod k : ℤ)] := + (cubeScaleColor_eq_iff_modEq.mp hcolor) i + rw [Int.modEq_iff_dvd] at hmod + rcases hmod with ⟨n, hn⟩ + have hperiod_pos : 0 < (scaleColorPeriod k : ℤ) := scaleColorPeriod_int_pos k + have hdiff_pos : 0 < (scaleColorPeriod k : ℤ) * n := by + rw [← hn] + exact sub_pos.mpr hlt + have hn_pos : 0 < n := by + nlinarith + have hperiod_le : (scaleColorPeriod k : ℤ) ≤ (scaleColorPeriod k : ℤ) * n := by + nlinarith + nlinarith [hn, hperiod_le] + +lemma one_le_scaleColorPeriod_pred_mul_zpow (k : ℤ) : + 1 ≤ (((scaleColorPeriod k : ℝ) - 1) * (3 : ℝ) ^ k) := by + have hpow_nonneg : 0 ≤ (3 : ℝ) ^ k := by positivity + have hceil_ge : (3 : ℝ) ^ (-k) ≤ (Nat.ceil ((3 : ℝ) ^ (-k)) : ℝ) := + Nat.le_ceil ((3 : ℝ) ^ (-k)) + have hmul := mul_le_mul_of_nonneg_right hceil_ge hpow_nonneg + calc + 1 = (3 : ℝ) ^ (-k) * (3 : ℝ) ^ k := by + rw [← zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + simp + _ ≤ (Nat.ceil ((3 : ℝ) ^ (-k)) : ℝ) * (3 : ℝ) ^ k := hmul + _ = (((scaleColorPeriod k : ℝ) - 1) * (3 : ℝ) ^ k) := by + simp [scaleColorPeriod] + +lemma scaleColorPeriod_le_three_mul_one_add_zpow_neg (k : ℤ) : + (scaleColorPeriod k : ℝ) ≤ 3 * (1 + (3 : ℝ) ^ (-k)) := by + have hnonneg : 0 ≤ (3 : ℝ) ^ (-k) := by positivity + have hceil_le : (Nat.ceil ((3 : ℝ) ^ (-k)) : ℝ) ≤ (3 : ℝ) ^ (-k) + 1 := + (Nat.ceil_lt_add_one hnonneg).le + calc + (scaleColorPeriod k : ℝ) = 1 + (Nat.ceil ((3 : ℝ) ^ (-k)) : ℝ) := by + simp [scaleColorPeriod] + _ ≤ 2 + (3 : ℝ) ^ (-k) := by linarith + _ ≤ 3 * (1 + (3 : ℝ) ^ (-k)) := by nlinarith + +theorem one_le_dist_of_ne_of_mem_descendantsAtScaleScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hR : R ∈ descendantsAtScaleScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleScaleColorClass Q k c) (hneq : R ≠ S) + {x y : Vec d} (hx : x ∈ cubeSet R) (hy : y ∈ cubeSet S) : + 1 ≤ dist x y := by + have hcolor : cubeScaleColor k R = cubeScaleColor k S := by + calc + cubeScaleColor k R = c := (mem_descendantsAtScaleScaleColorClass_iff.mp hR).2 + _ = cubeScaleColor k S := ((mem_descendantsAtScaleScaleColorClass_iff.mp hS).2).symm + have hindex_ne : ∃ i, R.index i ≠ S.index i := by + by_contra h + push Not at h + apply hneq + cases R with + | mk scaleR indexR => + cases S with + | mk scaleS indexS => + simp at h ⊢ + refine ⟨?_, funext h⟩ + have hscaleR : scaleR = k := by + simpa using + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1 + have hscaleS : scaleS = k := by + simpa using + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleScaleColorClass_iff.mp hS).1 + exact hscaleR.trans hscaleS.symm + rcases hindex_ne with ⟨i, hi⟩ + have hscale : + cubeScaleFactor S = cubeScaleFactor R := by + calc + cubeScaleFactor S = (3 : ℝ) ^ k := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleScaleColorClass_iff.mp hS).1] + _ = cubeScaleFactor R := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1] + have hscale_nonneg : 0 ≤ cubeScaleFactor R := le_of_lt (cubeScaleFactor_pos R) + have hperiod_scale : + 1 ≤ (((scaleColorPeriod k : ℝ) - 1) * cubeScaleFactor R) := by + rw [cubeScaleFactor, + scale_eq_of_mem_descendantsAtScale (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1] + simpa using one_le_scaleColorPeriod_pred_mul_zpow k + have hxR := hx i + have hyS := hy i + rw [hscale] at hyS + rcases lt_or_gt_of_ne hi with hlt | hgt + · have hgap : R.index i + scaleColorPeriod k ≤ S.index i := + index_add_scaleColorPeriod_le_of_cubeScaleColor_eq_of_lt hcolor hlt + have hgap_real : ((R.index i : ℝ) + scaleColorPeriod k : ℝ) ≤ (S.index i : ℝ) := by + exact_mod_cast hgap + have hcoord : + (((scaleColorPeriod k : ℝ) - 1) * cubeScaleFactor R) ≤ ‖(y - x) i‖ := by + rw [Pi.sub_apply, Real.norm_eq_abs, abs_of_nonneg] + · nlinarith [hyS.1, hxR.2, hgap_real, hscale_nonneg] + · nlinarith [hyS.1, hxR.2, hgap_real, hscale_nonneg] + have hnorm : 1 ≤ ‖y - x‖ := by + exact le_trans hperiod_scale (le_trans hcoord (norm_le_pi_norm (y - x) i)) + simpa [dist_eq_norm, norm_sub_rev] using hnorm + · have hgap : S.index i + scaleColorPeriod k ≤ R.index i := + index_add_scaleColorPeriod_le_of_cubeScaleColor_eq_of_lt hcolor.symm hgt + have hgap_real : ((S.index i : ℝ) + scaleColorPeriod k : ℝ) ≤ (R.index i : ℝ) := by + exact_mod_cast hgap + have hcoord : + (((scaleColorPeriod k : ℝ) - 1) * cubeScaleFactor R) ≤ ‖(x - y) i‖ := by + rw [Pi.sub_apply, Real.norm_eq_abs, abs_of_nonneg] + · nlinarith [hxR.1, hyS.2, hgap_real, hscale_nonneg] + · nlinarith [hxR.1, hyS.2, hgap_real, hscale_nonneg] + have hnorm : 1 ≤ ‖x - y‖ := by + exact le_trans hperiod_scale (le_trans hcoord (norm_le_pi_norm (x - y) i)) + simpa [dist_eq_norm] using hnorm + +theorem pairwiseDisjoint_descendantsAtScaleScaleColorClass {d : ℕ} + (Q : TriadicCube d) (k : ℤ) (c : ScaleColor d k) : + (descendantsAtScaleScaleColorClass Q k c : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + intro R hR S hS hneq + exact disjoint_cubeSet_of_ne_of_mem_descendantsAtScale + (mem_descendantsAtScaleScaleColorClass_iff.mp hR).1 + (mem_descendantsAtScaleScaleColorClass_iff.mp hS).1 hneq + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/SignedPermutation.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/SignedPermutation.lean new file mode 100644 index 0000000000..3286472a03 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/SignedPermutation.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Signed Permutation -/ + +@[expose] public section + +namespace Homogenization + +/-- The real-vector representation of an integer lattice vector. -/ +def intVecToRealVec {d : ℕ} (z : Fin d → ℤ) : Vec d := + fun i => (z i : ℝ) + +/-- A coordinate permutation with independent sign changes. -/ +def IsSignedPermutationMatrix {d : ℕ} (R : Mat d) : Prop := + ∃ σ : Equiv.Perm (Fin d), ∃ s : Fin d → ℝ, + (∀ i, s i = 1 ∨ s i = -1) ∧ + ∀ i j, R i j = if i = σ j then s j else 0 + +private theorem matVecMul_one {d : ℕ} (x : Vec d) : + matVecMul (1 : Mat d) x = x := by + ext i + unfold matVecMul + rw [Finset.sum_eq_single i] + · simp + · intro j _ hji + have hij : i ≠ j := fun h => hji h.symm + simp [hij] + · intro hi + exact (hi (Finset.mem_univ i)).elim + +theorem IsSignedPermutationMatrix.transpose_mul_self {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + matTranspose R * R = 1 := by + classical + rcases hR with ⟨σ, s, hs, hR⟩ + ext i j + by_cases hij : i = j + · subst j + rw [Matrix.mul_apply] + calc + ∑ k, matTranspose R i k * R k i = + matTranspose R i (σ i) * R (σ i) i := by + refine Finset.sum_eq_single (a := σ i) + (f := fun k : Fin d => matTranspose R i k * R k i) ?_ ?_ + · intro k _ hk + change R k i * R k i = 0 + rw [hR k i] + simp [hk] + · intro hnot + exact (hnot (Finset.mem_univ _)).elim + _ = s i * s i := by + change R (σ i) i * R (σ i) i = s i * s i + rw [hR (σ i) i] + simp + _ = 1 := by + rcases hs i with hsi | hsi <;> simp [hsi] + _ = (1 : Mat d) i i := by simp + · rw [Matrix.mul_apply] + calc + ∑ k, matTranspose R i k * R k j = 0 := by + refine Finset.sum_eq_zero fun k _ => ?_ + rw [matTranspose, Matrix.transpose_apply, hR k i, hR k j] + have hσij : σ i ≠ σ j := fun h => hij (σ.injective h) + by_cases hki : k = σ i + · have hkj : k ≠ σ j := by + intro h + apply hij + exact σ.injective (hki.symm.trans h) + simp [hki, hσij] + · simp [hki] + _ = (1 : Mat d) i j := by simp [hij] + +theorem IsSignedPermutationMatrix.mul_transpose_self {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + R * matTranspose R = 1 := by + classical + rcases hR with ⟨σ, s, hs, hR⟩ + ext i j + by_cases hij : i = j + · subst j + rw [Matrix.mul_apply] + calc + ∑ k, R i k * matTranspose R k i = + R i (σ.symm i) * matTranspose R (σ.symm i) i := by + refine Finset.sum_eq_single (a := σ.symm i) + (f := fun k : Fin d => R i k * matTranspose R k i) ?_ ?_ + · intro k _ hk + change R i k * R i k = 0 + rw [hR i k] + have hik : i ≠ σ k := by + intro h + apply hk + have hsymm : σ.symm i = k := by + rw [h] + simp + exact hsymm.symm + rw [if_neg hik] + simp + · intro hnot + exact (hnot (Finset.mem_univ _)).elim + _ = s (σ.symm i) * s (σ.symm i) := by + change R i (σ.symm i) * R i (σ.symm i) = + s (σ.symm i) * s (σ.symm i) + rw [hR i (σ.symm i)] + have hi : i = σ (σ.symm i) := by simp + rw [if_pos hi] + _ = 1 := by + rcases hs (σ.symm i) with hsi | hsi <;> simp [hsi] + _ = (1 : Mat d) i i := by simp + · rw [Matrix.mul_apply] + calc + ∑ k, R i k * matTranspose R k j = 0 := by + refine Finset.sum_eq_zero fun k _ => ?_ + rw [matTranspose, Matrix.transpose_apply, hR i k, hR j k] + by_cases hik : i = σ k + · have hjk : j ≠ σ k := by + intro h + exact hij (hik.trans h.symm) + simp [hik, hjk] + · simp [hik] + _ = (1 : Mat d) i j := by simp [hij] + +theorem IsSignedPermutationMatrix.transpose {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + IsSignedPermutationMatrix (matTranspose R) := by + classical + rcases hR with ⟨σ, s, hs, hRdef⟩ + refine ⟨σ.symm, fun i => s (σ.symm i), ?_, ?_⟩ + · intro i + exact hs (σ.symm i) + · intro i j + rw [matTranspose, Matrix.transpose_apply, hRdef j i] + by_cases h : i = σ.symm j + · subst i + simp + · have hji : j ≠ σ i := by + intro hji + apply h + rw [hji] + simp + rw [if_neg hji, if_neg h] + +theorem IsSignedPermutationMatrix.det_ne_zero {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + Matrix.det R ≠ 0 := by + have hdet := congrArg Matrix.det hR.transpose_mul_self + have hprod : Matrix.det R * Matrix.det R = 1 := by + simpa [matTranspose, Matrix.det_mul, Matrix.det_transpose] using hdet + intro hzero + simp [hzero] at hprod + +theorem IsSignedPermutationMatrix.abs_det_eq_one {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + |Matrix.det R| = 1 := by + have hdet := congrArg Matrix.det hR.transpose_mul_self + have hsquare : Matrix.det R * Matrix.det R = 1 := by + simpa [matTranspose, Matrix.det_mul, Matrix.det_transpose] using hdet + have hnonneg : 0 ≤ |Matrix.det R| := abs_nonneg _ + have habs_square : |Matrix.det R| * |Matrix.det R| = 1 := by + rw [← abs_mul, hsquare, abs_one] + nlinarith + +private theorem continuous_matVecMul {d : ℕ} (R : Mat d) : + Continuous (fun x : Vec d => matVecMul R x) := by + change Continuous fun x : Fin d → ℝ => fun i => ∑ j, R i j * x j + exact continuous_pi fun i => + continuous_finsetSum Finset.univ fun j _ => continuous_const.mul (continuous_apply j) + +noncomputable def signedPermutationHomeomorph {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) : Vec d ≃ₜ Vec d where + toEquiv := + { toFun := matVecMul R + invFun := matVecMul (matTranspose R) + left_inv := by + intro x + rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one] + right_inv := by + intro x + rw [matVecMul_mul, hR.mul_transpose_self, matVecMul_one] } + continuous_toFun := by exact continuous_matVecMul R + continuous_invFun := by exact continuous_matVecMul (matTranspose R) + +theorem measurePreserving_matVecMul_signedPermutation {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) : + MeasureTheory.MeasurePreserving (fun x : Vec d => matVecMul R x) + MeasureTheory.volume MeasureTheory.volume := by + refine ⟨(continuous_matVecMul R).measurable, ?_⟩ + have hscale : + ENNReal.ofReal |(Matrix.det R)⁻¹| = 1 := by + rw [abs_inv, hR.abs_det_eq_one] + norm_num + change MeasureTheory.Measure.map (Matrix.toLin' R) MeasureTheory.volume = MeasureTheory.volume + rw [Real.map_matrix_volume_pi_eq_smul_volume_pi hR.det_ne_zero, hscale, one_smul] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/Translation.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/Translation.lean new file mode 100644 index 0000000000..0eec38a7a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/Translation.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Dynamics.Ergodic.MeasurePreserving +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Group.Measure +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Translation -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +/-- Translate a set in `Vec d` by the vector `z`. -/ +def translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : Set (Vec d) := + { x | ∃ y ∈ U, x = y + z } + +theorem mem_translateSet_iff_sub_mem {d : ℕ} {z x : Vec d} {U : Set (Vec d)} : + x ∈ translateSet z U ↔ x - z ∈ U := by + constructor + · rintro ⟨y, hy, rfl⟩ + simpa [sub_eq_add_neg, add_assoc] + · intro hx + refine ⟨x - z, hx, ?_⟩ + ext i + simp [sub_eq_add_neg, add_assoc] + +theorem preimage_subRight_eq_translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + (fun x : Vec d => x - z) ⁻¹' U = translateSet z U := by + ext x + simp [mem_translateSet_iff_sub_mem] + +theorem preimage_addNeg_eq_translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + (fun x : Vec d => x + -z) ⁻¹' U = translateSet z U := by + ext x + simp [mem_translateSet_iff_sub_mem, sub_eq_add_neg] + +theorem preimage_addRight_translateSet_eq {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + (fun x : Vec d => x + z) ⁻¹' translateSet z U = U := by + ext x + simp [mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] + +theorem image_addRight_eq_translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + (fun x : Vec d => x + z) '' U = translateSet z U := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + exact ⟨y, hy, rfl⟩ + · rintro ⟨y, hy, rfl⟩ + exact ⟨y, hy, rfl⟩ + +theorem translateSet_inter {d : ℕ} (z : Vec d) (U V : Set (Vec d)) : + translateSet z (U ∩ V) = translateSet z U ∩ translateSet z V := by + ext y + simp [mem_translateSet_iff_sub_mem] + +@[simp] theorem translateSet_zero {d : ℕ} (U : Set (Vec d)) : + translateSet (0 : Vec d) U = U := by + ext x + simp [translateSet] + +theorem translateSet_translateSet {d : ℕ} (z w : Vec d) (U : Set (Vec d)) : + translateSet w (translateSet z U) = translateSet (z + w) U := by + ext x + constructor + · rintro ⟨y, ⟨u, hu, rfl⟩, rfl⟩ + exact ⟨u, hu, by simp [add_assoc]⟩ + · rintro ⟨u, hu, rfl⟩ + exact ⟨u + z, ⟨u, hu, rfl⟩, by simp [add_assoc]⟩ + +theorem measurePreserving_subRight_restrict_translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + MeasurePreserving (fun x : Vec d => x - z) + (MeasureTheory.volume.restrict (translateSet z U)) + (MeasureTheory.volume.restrict U) := by + let hμ : + MeasurePreserving (fun x : Vec d => x + -z) + (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) + MeasureTheory.volume := + measurePreserving_add_right (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) (-z) + simpa [preimage_addNeg_eq_translateSet (z := z) U, sub_eq_add_neg] using + MeasurePreserving.restrict_preimage_emb hμ (Homeomorph.subRight z).measurableEmbedding U + +theorem measurePreserving_addRight_restrict_translateSet {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + MeasurePreserving (fun x : Vec d => x + z) + (MeasureTheory.volume.restrict U) + (MeasureTheory.volume.restrict (translateSet z U)) := by + let hμ : + MeasurePreserving (fun x : Vec d => x + z) + (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) + MeasureTheory.volume := + measurePreserving_add_right (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) z + simpa [preimage_addNeg_eq_translateSet (z := z) U, image_addRight_eq_translateSet (z := z) U, + sub_eq_add_neg] using + MeasurePreserving.restrict_image_emb hμ (Homeomorph.addRight z).measurableEmbedding U + +theorem setIntegral_comp_subRight_translateSet {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (z : Vec d) (U : Set (Vec d)) (f : Vec d → E) : + ∫ x in translateSet z U, f (x - z) ∂MeasureTheory.volume = + ∫ y in U, f y ∂MeasureTheory.volume := by + simpa using + (measurePreserving_subRight_restrict_translateSet (d := d) z U).integral_comp + (Homeomorph.subRight z).measurableEmbedding f + +theorem setIntegral_comp_addRight_translateSet {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (z : Vec d) (U : Set (Vec d)) (f : Vec d → E) : + ∫ y in U, f (y + z) ∂MeasureTheory.volume = + ∫ x in translateSet z U, f x ∂MeasureTheory.volume := by + simpa using + (measurePreserving_addRight_restrict_translateSet (d := d) z U).integral_comp + (Homeomorph.addRight z).measurableEmbedding f + +theorem volume_translateSet_eq {d : ℕ} (z : Vec d) (U : Set (Vec d)) : + MeasureTheory.volume (translateSet z U) = MeasureTheory.volume U := by + have h := + MeasurePreserving.measure_preimage_emb + (measurePreserving_add_right (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) z) + (Homeomorph.addRight z).measurableEmbedding + (translateSet z U) + simpa [preimage_addRight_translateSet_eq] using h.symm + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCube.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCube.lean new file mode 100644 index 0000000000..a720ad4829 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCube.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import Mathlib.Topology.MetricSpace.Bounded + +/-! # Triadic Cube -/ + +@[expose] public section + +namespace Homogenization + +structure TriadicCube (d : ℕ) where + scale : ℤ + index : Fin d → ℤ +deriving DecidableEq, Repr + +instance instCountableTriadicCube (d : ℕ) : Countable (TriadicCube d) := by + classical + have h : + Function.Injective (fun Q : TriadicCube d => (Q.scale, Q.index)) := by + intro Q R hQR + cases Q + cases R + simp at hQR ⊢ + exact hQR + exact h.countable + +noncomputable def cubeScaleFactor {d : ℕ} (Q : TriadicCube d) : ℝ := + (3 : ℝ) ^ Q.scale + +/-- Half-open realization of a triadic cube, used for exact cube partitions. -/ +def cubeSet {d : ℕ} (Q : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q ≤ x i) ∧ + (x i < (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q)) } + +/-- Open realization of a triadic cube, used when analytic lemmas require open domains. -/ +def openCubeSet {d : ℕ} (Q : TriadicCube d) : Set (Vec d) := + { x | ∀ i, + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q < x i) ∧ + (x i < (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q)) } + +/-- A triadic cube is bounded as a subset of the ambient finite-dimensional space. -/ +theorem isBounded_cubeSet {d : ℕ} (Q : TriadicCube d) : + Bornology.IsBounded (cubeSet Q) := by + let box : Set (Vec d) := + Set.pi Set.univ fun i : Fin d => + Set.Ico + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q)) + have hbox : Bornology.IsBounded box := by + exact Bornology.IsBounded.pi (S := fun i : Fin d => + Set.Ico + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) fun i => + Metric.isBounded_Ico _ _ + exact hbox.subset (by + intro x hx + change x ∈ Set.pi Set.univ (fun i : Fin d => + Set.Ico + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) + intro i _hi + exact hx i) + +/-- An open triadic cube is bounded as a subset of the ambient finite-dimensional space. -/ +theorem isBounded_openCubeSet {d : ℕ} (Q : TriadicCube d) : + Bornology.IsBounded (openCubeSet Q) := by + let box : Set (Vec d) := + Set.pi Set.univ fun i : Fin d => + Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q)) + have hbox : Bornology.IsBounded box := by + exact Bornology.IsBounded.pi (S := fun i : Fin d => + Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) fun i => + Metric.isBounded_Ioo _ _ + exact hbox.subset (by + intro x hx + change x ∈ Set.pi Set.univ (fun i : Fin d => + Set.Ioo + ((((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q)) + ((((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q))) + intro i _hi + exact hx i) + +/-- The centered triadic cube descriptor at scale `3^m`. + +Its source-facing realization `openCubeSet (originCube d m)` is +`(-3^m / 2, 3^m / 2)^d`. The half-open `cubeSet` realization is the internal +partition representative. -/ +def originCube (d : ℕ) (m : ℤ) : TriadicCube d := + { scale := m + index := 0 } + +def translateCube {d : ℕ} (shift : Fin d → ℤ) (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale + index := fun i => Q.index i + shift i } + +@[simp] theorem cubeScaleFactor_originCube {d : ℕ} (m : ℤ) : + cubeScaleFactor (originCube d m) = (3 : ℝ) ^ m := + rfl + +@[simp] theorem cubeScaleFactor_translateCube {d : ℕ} (shift : Fin d → ℤ) (Q : TriadicCube d) : + cubeScaleFactor (translateCube shift Q) = cubeScaleFactor Q := + rfl + +@[simp] theorem mem_cubeSet_originCube_iff {d : ℕ} {m : ℤ} {x : Vec d} : + x ∈ cubeSet (originCube d m) ↔ + ∀ i, ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m ≤ x i) ∧ (x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m) := by + constructor + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg] using hx i + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg] using hx i + +@[simp] theorem mem_openCubeSet_originCube_iff {d : ℕ} {m : ℤ} {x : Vec d} : + x ∈ openCubeSet (originCube d m) ↔ + ∀ i, ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m < x i) ∧ (x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m) := by + constructor + · intro hx i + simpa [openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg] using hx i + · intro hx i + simpa [openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg] using hx i + +@[simp] theorem mem_cubeSet_translateCube_iff {d : ℕ} {shift : Fin d → ℤ} + {Q : TriadicCube d} {x : Vec d} : + x ∈ cubeSet (translateCube shift Q) ↔ + x - (fun i => (shift i : ℝ) * cubeScaleFactor Q) ∈ cubeSet Q := by + simp only [cubeSet, translateCube, cubeScaleFactor] + constructor + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + constructor + · refine le_sub_iff_add_le.mpr ?_ + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hlo + · refine sub_lt_iff_lt_add.mpr ?_ + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hhi + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + constructor + · have hlo' : + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + + (shift i : ℝ) * cubeScaleFactor Q ≤ + x i := + le_sub_iff_add_le.mp hlo + simpa [cubeScaleFactor, sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] + using hlo' + · have hhi' : + x i < + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + + (shift i : ℝ) * cubeScaleFactor Q := + sub_lt_iff_lt_add.mp hhi + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hhi + +@[simp] theorem mem_openCubeSet_translateCube_iff {d : ℕ} {shift : Fin d → ℤ} + {Q : TriadicCube d} {x : Vec d} : + x ∈ openCubeSet (translateCube shift Q) ↔ + x - (fun i => (shift i : ℝ) * cubeScaleFactor Q) ∈ openCubeSet Q := by + simp only [openCubeSet, translateCube, cubeScaleFactor] + constructor + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + constructor + · refine lt_sub_iff_add_lt.mpr ?_ + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hlo + · refine sub_lt_iff_lt_add.mpr ?_ + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hhi + · intro hx i + rcases hx i with ⟨hlo, hhi⟩ + constructor + · have hlo' : + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + + (shift i : ℝ) * cubeScaleFactor Q < + x i := + lt_sub_iff_add_lt.mp hlo + simpa [cubeScaleFactor, sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] + using hlo' + · have hhi' : + x i < + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + + (shift i : ℝ) * cubeScaleFactor Q := + sub_lt_iff_lt_add.mp hhi + simpa [sub_eq_add_neg, add_assoc, add_left_comm, add_comm, add_mul] using hhi + +def parentCube {d : ℕ} (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale + 1 + index := fun i => Int.ediv (Q.index i + 1) 3 } + +def childCubes {d : ℕ} (Q : TriadicCube d) : Finset (TriadicCube d) := + Finset.univ.image fun digits : Fin d → Fin 3 => + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + +def descendantsAtDepth {d : ℕ} (Q : TriadicCube d) : ℕ → Finset (TriadicCube d) + | 0 => {Q} + | n + 1 => (descendantsAtDepth Q n).biUnion childCubes + +def descendantsAtScale {d : ℕ} (Q : TriadicCube d) (k : ℤ) : Finset (TriadicCube d) := + if _h : k ≤ Q.scale then + descendantsAtDepth Q (Int.toNat (Q.scale - k)) + else + ∅ + +noncomputable def cubeVolume {d : ℕ} (Q : TriadicCube d) : ℝ := + (cubeScaleFactor Q) ^ d + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCubeTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCubeTranslation.lean new file mode 100644 index 0000000000..10c3e9d9c6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicCubeTranslation.lean @@ -0,0 +1,115 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation + +/-! # Triadic Cube Translation -/ + +@[expose] public section + +open scoped Pointwise + +/-! +# Translations from centered triadic cubes + +This file records the elementary geometry identifying an arbitrary triadic cube +with a translate of the centered cube at the same scale, and the centered cube +at any scale with a positive dilation of the unit centered cube. +-/ + +namespace Homogenization + +/-- Translation vector carrying the centered cube of scale `Q.scale` to `Q`. -/ +noncomputable def triadicCubeShift {d : ℕ} (Q : TriadicCube d) : Vec d := + fun i => (Q.index i : ℝ) * cubeScaleFactor Q + +theorem cubeSet_eq_translateSet_originCube_of_triadicCube {d : ℕ} + (Q : TriadicCube d) : + cubeSet Q = + translateSet (triadicCubeShift Q) (cubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [triadicCubeShift, cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [triadicCubeShift, cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + +theorem openCubeSet_eq_translateSet_originCube_of_triadicCube {d : ℕ} + (Q : TriadicCube d) : + openCubeSet Q = + translateSet (triadicCubeShift Q) (openCubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [triadicCubeShift, openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [triadicCubeShift, openCubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + +theorem openCubeSet_originCube_eq_smul_originCube_zero {d : ℕ} (m : ℤ) : + openCubeSet (originCube d m) = + cubeScaleFactor (originCube d m) • openCubeSet (originCube d 0) := by + ext y + let r : ℝ := cubeScaleFactor (originCube d m) + have hr_pos : 0 < r := by + simpa [r, cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) m) + constructor + · intro hy + rw [Set.mem_smul_set] + refine ⟨r⁻¹ • y, ?_, ?_⟩ + · intro i + have hyi := hy i + have hlo_scaled : (-(1 / 2 : ℝ)) * r < y i := by + simpa [r, originCube, cubeScaleFactor] using hyi.1 + have hhi_scaled : y i < (1 / 2 : ℝ) * r := by + simpa [r, originCube, cubeScaleFactor] using hyi.2 + constructor + · have hlo : (-(1 / 2 : ℝ)) < y i / r := + (lt_div_iff₀ hr_pos).mpr hlo_scaled + simpa [r, originCube, cubeScaleFactor, mul_comm, div_eq_mul_inv] using hlo + · have hhi : y i / r < (1 / 2 : ℝ) := + (div_lt_iff₀ hr_pos).mpr hhi_scaled + simpa [r, originCube, cubeScaleFactor, mul_comm, div_eq_mul_inv] using hhi + · ext i + simp only [Pi.smul_apply, smul_eq_mul] + change r * (r⁻¹ * y i) = y i + rw [← mul_assoc, mul_inv_cancel₀ hr_pos.ne', one_mul] + · intro hy + rw [Set.mem_smul_set] at hy + rcases hy with ⟨x, hx, rfl⟩ + intro i + have hxi := hx i + constructor + · have hlo := mul_lt_mul_of_pos_left hxi.1 hr_pos + simpa [r, originCube, cubeScaleFactor, mul_comm, mul_left_comm, mul_assoc] using hlo + · have hhi := mul_lt_mul_of_pos_left hxi.2 hr_pos + simpa [r, originCube, cubeScaleFactor, mul_comm, mul_left_comm, mul_assoc] using hhi + +theorem openCubeSet_eq_translateSet_smul_originCube_zero {d : ℕ} + (Q : TriadicCube d) : + openCubeSet Q = + translateSet (triadicCubeShift Q) + (cubeScaleFactor Q • openCubeSet (originCube d 0)) := by + rw [openCubeSet_eq_translateSet_originCube_of_triadicCube Q, + openCubeSet_originCube_eq_smul_originCube_zero (d := d) Q.scale] + simp [originCube, cubeScaleFactor] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicPartition.lean b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicPartition.lean new file mode 100644 index 0000000000..a0fae873be --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Geometry/TriadicPartition.lean @@ -0,0 +1,760 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube + +/-! # Triadic Partition -/ + +@[expose] public section + +namespace Homogenization + +@[simp] theorem parentCube_scale {d : ℕ} (Q : TriadicCube d) : + (parentCube Q).scale = Q.scale + 1 := rfl + +@[simp] theorem childCube_scale {d : ℕ} (Q : TriadicCube d) (digits : Fin d → Fin 3) : + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d).scale = Q.scale - 1 := + rfl + +theorem mem_childCubes_iff {d : ℕ} {Q R : TriadicCube d} : + R ∈ childCubes Q ↔ + ∃ digits : Fin d → Fin 3, + R = + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } := by + constructor + · intro hR + rcases Finset.mem_image.mp hR with ⟨digits, -, rfl⟩ + exact ⟨digits, rfl⟩ + · rintro ⟨digits, rfl⟩ + exact Finset.mem_image.mpr ⟨digits, Finset.mem_univ _, rfl⟩ + +theorem childCube_parent {d : ℕ} (Q : TriadicCube d) (digits : Fin d → Fin 3) : + parentCube + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d) = Q := by + cases Q with + | mk scale index => + unfold parentCube + apply congrArg₂ TriadicCube.mk + · simp + · funext i + calc + ((3 * index i + (digits i : ℤ) - 1 + 1) / 3 : ℤ) + = (((digits i : ℤ) + 3 * index i) / 3 : ℤ) := by ring_nf + _ = ((digits i : ℤ) / 3 : ℤ) + index i := by + have h3 : (3 : ℤ) ≠ 0 := by decide + simpa [mul_comm, mul_left_comm, mul_assoc] using + (Int.add_mul_ediv_left (a := (digits i : ℤ)) (b := (3 : ℤ)) (c := index i) h3) + _ = index i := by + have hdigits_nonneg : 0 ≤ (digits i : ℤ) := by + exact_mod_cast (Nat.zero_le (digits i).val) + have hdigits_lt : (digits i : ℤ) < (3 : ℤ) := by + exact_mod_cast (digits i).isLt + have hdigits_div : ((digits i : ℤ) / 3 : ℤ) = 0 := by + exact Int.ediv_eq_zero_of_lt_abs hdigits_nonneg (by simp [hdigits_lt]) + rw [hdigits_div] + simp + +@[simp] theorem cubeScaleFactor_childCube {d : ℕ} (Q : TriadicCube d) (digits : Fin d → Fin 3) : + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d) = + cubeScaleFactor Q / 3 := by + simp [cubeScaleFactor, sub_eq_add_neg, zpow_add₀, div_eq_mul_inv, + show (3 : ℝ) ≠ 0 by norm_num] + +theorem cubeSet_childCube_subset {d : ℕ} (Q : TriadicCube d) (digits : Fin d → Fin 3) : + cubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d) ⊆ + cubeSet Q := by + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + intro x hx i + change x ∈ cubeSet child at hx + rcases hx i with ⟨hlo, hhi⟩ + have hscale : cubeScaleFactor child = cubeScaleFactor Q / 3 := by + simp [child] + rw [hscale] at hlo hhi + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hscale_div_nonneg : 0 ≤ cubeScaleFactor Q / 3 := by positivity + have hd_nonneg : 0 ≤ ((digits i : ℤ) : ℝ) := by + exact_mod_cast (Nat.zero_le (digits i).val) + have hd_le_two : ((digits i : ℤ) : ℝ) ≤ 2 := by + have hd_le_two_int : (digits i : ℤ) ≤ 2 := by + exact_mod_cast (Nat.le_of_lt_succ (digits i).isLt) + exact_mod_cast hd_le_two_int + have hcast : + ((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) + ((digits i : ℤ) : ℝ) - 1 := by + norm_num + have hlo' : + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (cubeScaleFactor Q / 3)) ≤ + x i := by + simpa [child] using hlo + have hhi' : + x i < + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (cubeScaleFactor Q / 3)) := by + simpa [child] using hhi + have hcoeff_lower : + 3 * ((Q.index i : ℝ) - 1 / 2) ≤ + (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) := by + rw [hcast] + linarith [hd_nonneg] + have hcoeff_upper : + (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) ≤ + 3 * ((Q.index i : ℝ) + 1 / 2) := by + rw [hcast] + linarith [hd_le_two] + refine ⟨?_, ?_⟩ + · have hlower : + ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q ≤ + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (cubeScaleFactor Q / 3)) := by + calc + ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q + = (3 * ((Q.index i : ℝ) - 1 / 2)) * (cubeScaleFactor Q / 3) := by ring + _ ≤ (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (cubeScaleFactor Q / 3) := by + exact mul_le_mul_of_nonneg_right hcoeff_lower hscale_div_nonneg + exact le_trans hlower hlo' + · have hupper : + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (cubeScaleFactor Q / 3)) ≤ + ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q := by + calc + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (cubeScaleFactor Q / 3)) + ≤ (3 * ((Q.index i : ℝ) + 1 / 2)) * (cubeScaleFactor Q / 3) := by + exact mul_le_mul_of_nonneg_right hcoeff_upper hscale_div_nonneg + _ = ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q := by ring + exact lt_of_lt_of_le hhi' hupper + +theorem openCubeSet_childCube_subset {d : ℕ} (Q : TriadicCube d) (digits : Fin d → Fin 3) : + openCubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } : TriadicCube d) ⊆ + openCubeSet Q := by + let child : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + intro x hx i + change x ∈ openCubeSet child at hx + rcases hx i with ⟨hlo, hhi⟩ + have hscale : cubeScaleFactor child = cubeScaleFactor Q / 3 := by + simp [child] + rw [hscale] at hlo hhi + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hscale_div_nonneg : 0 ≤ cubeScaleFactor Q / 3 := by positivity + have hd_nonneg : 0 ≤ ((digits i : ℤ) : ℝ) := by + exact_mod_cast (Nat.zero_le (digits i).val) + have hd_le_two : ((digits i : ℤ) : ℝ) ≤ 2 := by + have hd_le_two_int : (digits i : ℤ) ≤ 2 := by + exact_mod_cast (Nat.le_of_lt_succ (digits i).isLt) + exact_mod_cast hd_le_two_int + have hcast : + ((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) + ((digits i : ℤ) : ℝ) - 1 := by + norm_num + have hcoeff_lower : + 3 * ((Q.index i : ℝ) - 1 / 2) ≤ + (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) := by + rw [hcast] + linarith [hd_nonneg] + have hcoeff_upper : + (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) ≤ + 3 * ((Q.index i : ℝ) + 1 / 2) := by + rw [hcast] + linarith [hd_le_two] + refine ⟨?_, ?_⟩ + · have hlower : + ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q ≤ + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (cubeScaleFactor Q / 3)) := by + calc + ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q + = (3 * ((Q.index i : ℝ) - 1 / 2)) * (cubeScaleFactor Q / 3) := by ring + _ ≤ (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (cubeScaleFactor Q / 3) := by + exact mul_le_mul_of_nonneg_right hcoeff_lower hscale_div_nonneg + exact lt_of_le_of_lt hlower hlo + · have hupper : + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (cubeScaleFactor Q / 3)) ≤ + ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q := by + calc + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (cubeScaleFactor Q / 3)) + ≤ (3 * ((Q.index i : ℝ) + 1 / 2)) * (cubeScaleFactor Q / 3) := by + exact mul_le_mul_of_nonneg_right hcoeff_upper hscale_div_nonneg + _ = ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q := by ring + exact lt_of_lt_of_le hhi hupper + +theorem childCubes_nonempty {d : ℕ} (Q : TriadicCube d) : + (childCubes Q).Nonempty := by + refine ⟨{ scale := Q.scale - 1, index := fun i => 3 * Q.index i + ((0 : Fin d → Fin 3) i : ℤ) - 1 }, ?_⟩ + exact Finset.mem_image.mpr ⟨0, Finset.mem_univ _, rfl⟩ + +theorem childCubes_card {d : ℕ} (Q : TriadicCube d) : + (childCubes Q).card = 3 ^ d := by + classical + unfold childCubes + rw [Finset.card_image_of_injective] + · simp + · intro a b hab + funext i + apply Fin.ext + have hindex : + 3 * Q.index i + (a i : ℤ) - 1 = 3 * Q.index i + (b i : ℤ) - 1 := by + simpa using congrArg (fun R : TriadicCube d => R.index i) hab + have hcast : (a i : ℤ) = (b i : ℤ) := by + linarith [hindex] + exact Int.ofNat_inj.mp (by simpa using hcast) + +/-- Translating a depth-`n` descendant by parent cube indices requires the +integer shift to be multiplied by `3^n`, because each descendant step lowers +the physical scale by a factor of three. -/ +def descendantTranslationShift {d : ℕ} (n : ℕ) (z : Fin d → ℤ) : Fin d → ℤ := + fun i => (3 : ℤ) ^ n * z i + +@[simp] theorem descendantTranslationShift_zero {d : ℕ} (z : Fin d → ℤ) : + descendantTranslationShift 0 z = z := by + funext i + simp [descendantTranslationShift] + +theorem descendantTranslationShift_succ {d : ℕ} (n : ℕ) (z : Fin d → ℤ) : + descendantTranslationShift (n + 1) z = + fun i => 3 * descendantTranslationShift n z i := by + funext i + simp [descendantTranslationShift, pow_succ, mul_left_comm, mul_comm] + +theorem childCubes_translateCube {d : ℕ} (z : Fin d → ℤ) (Q : TriadicCube d) : + childCubes (translateCube z Q) = + (childCubes Q).image (translateCube fun i => 3 * z i) := by + classical + ext R + constructor + · intro hR + rcases mem_childCubes_iff.mp hR with ⟨digits, rfl⟩ + let S : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + refine Finset.mem_image.mpr ⟨S, ?_, ?_⟩ + · exact Finset.mem_image.mpr ⟨digits, Finset.mem_univ _, rfl⟩ + · apply congrArg₂ TriadicCube.mk + · rfl + · funext i + simp [S, translateCube] + ring + · intro hR + rcases Finset.mem_image.mp hR with ⟨S, hS, rfl⟩ + rcases mem_childCubes_iff.mp hS with ⟨digits, rfl⟩ + exact mem_childCubes_iff.mpr ⟨digits, by + apply congrArg₂ TriadicCube.mk + · rfl + · funext i + simp [translateCube] + ring⟩ + +theorem disjoint_childCubes_of_ne {d : ℕ} {Q R : TriadicCube d} (hQR : Q ≠ R) : + Disjoint (childCubes Q) (childCubes R) := by + rw [Finset.disjoint_left] + intro S hSQ hSR + have hparentQ : parentCube S = Q := by + rcases mem_childCubes_iff.mp hSQ with ⟨digits, rfl⟩ + exact childCube_parent Q digits + have hparentR : parentCube S = R := by + rcases mem_childCubes_iff.mp hSR with ⟨digits, rfl⟩ + exact childCube_parent R digits + exact hQR (hparentQ.symm.trans hparentR) + +@[simp] theorem descendantsAtDepth_zero {d : ℕ} (Q : TriadicCube d) : + descendantsAtDepth Q 0 = ({Q} : Finset (TriadicCube d)) := rfl + +@[simp] theorem descendantsAtDepth_succ {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + descendantsAtDepth Q (n + 1) = (descendantsAtDepth Q n).biUnion childCubes := rfl + +@[simp] theorem descendantsAtDepth_one {d : ℕ} (Q : TriadicCube d) : + descendantsAtDepth Q 1 = childCubes Q := by + simp [descendantsAtDepth_succ] + +theorem descendantsAtDepth_translateCube {d : ℕ} (z : Fin d → ℤ) + (Q : TriadicCube d) : + ∀ n : ℕ, + descendantsAtDepth (translateCube z Q) n = + (descendantsAtDepth Q n).image + (translateCube (descendantTranslationShift n z)) + | 0 => by + simp [descendantsAtDepth] + | n + 1 => by + rw [descendantsAtDepth_succ, + descendantsAtDepth_translateCube z Q n, + descendantsAtDepth_succ] + rw [Finset.image_biUnion, Finset.biUnion_image] + apply Finset.biUnion_congr rfl + intro R _hR + rw [childCubes_translateCube, descendantTranslationShift_succ] + +theorem mem_descendantsAtDepth_succ_iff {d : ℕ} {Q R : TriadicCube d} {n : ℕ} : + R ∈ descendantsAtDepth Q (n + 1) ↔ + ∃ S ∈ descendantsAtDepth Q n, R ∈ childCubes S := by + rw [descendantsAtDepth_succ] + constructor + · intro hR + rcases Finset.mem_biUnion.mp hR with ⟨S, hS, hR⟩ + exact ⟨S, hS, hR⟩ + · rintro ⟨S, hS, hR⟩ + exact Finset.mem_biUnion.mpr ⟨S, hS, hR⟩ + +/-- Converse to descendant-depth transitivity: a depth `m + n` descendant +factors through a depth-`m` ancestor. -/ +theorem exists_descendant_ancestor_at_depth {d : ℕ} + {Q R : TriadicCube d} (m n : ℕ) + (hR : R ∈ descendantsAtDepth Q (m + n)) : + ∃ U ∈ descendantsAtDepth Q m, R ∈ descendantsAtDepth U n := by + induction n generalizing R with + | zero => + exact ⟨R, by simpa using hR, by simp⟩ + | succ n ih => + have hRsucc : R ∈ descendantsAtDepth Q ((m + n) + 1) := by + simpa [Nat.add_assoc] using hR + rw [mem_descendantsAtDepth_succ_iff] at hRsucc + rcases hRsucc with ⟨S, hS, hRS⟩ + rcases ih hS with ⟨U, hU, hSU⟩ + refine ⟨U, hU, ?_⟩ + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨S, hSU, hRS⟩ + +theorem descendantsAtDepth_nonempty {d : ℕ} (Q : TriadicCube d) : + ∀ n : ℕ, (descendantsAtDepth Q n).Nonempty + | 0 => by + exact ⟨Q, by simp⟩ + | n + 1 => by + rcases descendantsAtDepth_nonempty Q n with ⟨S, hS⟩ + rcases childCubes_nonempty S with ⟨R, hR⟩ + exact ⟨R, by + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨S, hS, hR⟩⟩ + +theorem descendantsAtDepth_card_succ {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + (descendantsAtDepth Q (n + 1)).card = (descendantsAtDepth Q n).card * 3 ^ d := by + classical + rw [descendantsAtDepth_succ, Finset.card_biUnion] + · simp [childCubes_card] + · intro R hR S hS hRS + exact disjoint_childCubes_of_ne hRS + +theorem descendantsAtDepth_card {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + (descendantsAtDepth Q n).card = (3 ^ d) ^ n := by + induction n with + | zero => + simp + | succ n ih => + rw [descendantsAtDepth_card_succ, ih, pow_succ] + +theorem descendantsAtScale_eq_descendantsAtDepth {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + descendantsAtScale Q k = descendantsAtDepth Q (Int.toNat (Q.scale - k)) := by + simp [descendantsAtScale, hk] + +theorem descendantsAtScale_eq_empty {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : Q.scale < k) : + descendantsAtScale Q k = ∅ := by + simp [descendantsAtScale, not_le_of_gt hk] + +theorem descendantsAtScale_translateCube {d : ℕ} (z : Fin d → ℤ) + (Q : TriadicCube d) {k : ℤ} (hk : k ≤ Q.scale) : + descendantsAtScale (translateCube z Q) k = + (descendantsAtScale Q k).image + (translateCube (descendantTranslationShift (Int.toNat (Q.scale - k)) z)) := by + have hk' : k ≤ (translateCube z Q).scale := by + simpa [translateCube] using hk + rw [descendantsAtScale_eq_descendantsAtDepth (translateCube z Q) hk', + descendantsAtScale_eq_descendantsAtDepth Q hk, + descendantsAtDepth_translateCube] + simp [translateCube] + +@[simp] theorem descendantsAtScale_self {d : ℕ} (Q : TriadicCube d) : + descendantsAtScale Q Q.scale = ({Q} : Finset (TriadicCube d)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q le_rfl] + simp + +theorem mem_descendantsAtScale_iff {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) : + R ∈ descendantsAtScale Q k ↔ + R ∈ descendantsAtDepth Q (Int.toNat (Q.scale - k)) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + +theorem descendantsAtScale_nonempty {d : ℕ} (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + (descendantsAtScale Q k).Nonempty := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + exact descendantsAtDepth_nonempty Q (Int.toNat (Q.scale - k)) + +theorem not_mem_descendantsAtScale_of_lt {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hk : Q.scale < k) : + R ∉ descendantsAtScale Q k := by + rw [descendantsAtScale_eq_empty Q hk] + simp + +@[simp] theorem child_scale_of_mem_childCubes {d : ℕ} {Q R : TriadicCube d} + (hR : R ∈ childCubes Q) : R.scale = Q.scale - 1 := by + rcases (mem_childCubes_iff.mp hR) with ⟨digits, rfl⟩ + simp + +@[simp] theorem parent_scale_of_mem_childCubes {d : ℕ} {Q R : TriadicCube d} + (hR : R ∈ childCubes Q) : (parentCube R).scale = Q.scale := by + simp [child_scale_of_mem_childCubes hR] + +theorem cubeSet_subset_of_mem_childCubes {d : ℕ} {Q R : TriadicCube d} + (hR : R ∈ childCubes Q) : + cubeSet R ⊆ cubeSet Q := by + rcases mem_childCubes_iff.mp hR with ⟨digits, rfl⟩ + exact cubeSet_childCube_subset Q digits + +theorem openCubeSet_subset_of_mem_childCubes {d : ℕ} {Q R : TriadicCube d} + (hR : R ∈ childCubes Q) : + openCubeSet R ⊆ openCubeSet Q := by + rcases mem_childCubes_iff.mp hR with ⟨digits, rfl⟩ + exact openCubeSet_childCube_subset Q digits + +theorem disjoint_cubeSet_childCube_of_ne {d : ℕ} (Q : TriadicCube d) + {digits₁ digits₂ : Fin d → Fin 3} (hneq : digits₁ ≠ digits₂) : + Disjoint + (cubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits₁ i : ℤ) - 1 } : TriadicCube d)) + (cubeSet + ({ scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits₂ i : ℤ) - 1 } : TriadicCube d)) := by + rw [Set.disjoint_left] + intro x hx₁ hx₂ + have hdiff : ∃ i, digits₁ i ≠ digits₂ i := by + by_contra h + push Not at h + apply hneq + funext i + exact h i + rcases hdiff with ⟨i, hdi⟩ + have hx₁i := hx₁ i + have hx₂i := hx₂ i + change + ((((3 * Q.index i + (digits₁ i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun j => 3 * Q.index j + (digits₁ j : ℤ) - 1 } : TriadicCube d) ≤ + x i) ∧ + (x i < + ((((3 * Q.index i + (digits₁ i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun j => 3 * Q.index j + (digits₁ j : ℤ) - 1 } : TriadicCube d))) at hx₁i + rw [cubeScaleFactor_childCube Q digits₁] at hx₁i + change + ((((3 * Q.index i + (digits₂ i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun j => 3 * Q.index j + (digits₂ j : ℤ) - 1 } : TriadicCube d) ≤ + x i) ∧ + (x i < + ((((3 * Q.index i + (digits₂ i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * + cubeScaleFactor + ({ scale := Q.scale - 1 + index := fun j => 3 * Q.index j + (digits₂ j : ℤ) - 1 } : TriadicCube d))) at hx₂i + rw [cubeScaleFactor_childCube Q digits₂] at hx₂i + have hscale_nonneg : 0 ≤ cubeScaleFactor Q / 3 := by + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact div_nonneg hscale_pos.le (by norm_num) + have hcast₁ : + ((3 * Q.index i + (digits₁ i : ℤ) - 1 : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) + ((digits₁ i : ℤ) : ℝ) - 1 := by + norm_num + have hcast₂ : + ((3 * Q.index i + (digits₂ i : ℤ) - 1 : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) + ((digits₂ i : ℤ) : ℝ) - 1 := by + norm_num + rcases Fin.lt_or_lt_of_ne hdi with hlt | hlt + · have hdsep_nat : (digits₁ i).val + 1 ≤ (digits₂ i).val := by + exact Nat.succ_le_of_lt (by simpa using hlt) + have hdsep : ((digits₁ i : ℤ) : ℝ) + 1 ≤ ((digits₂ i : ℤ) : ℝ) := by + exact_mod_cast hdsep_nat + have hsep : + (((((3 * Q.index i + (digits₁ i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * + (cubeScaleFactor Q / 3))) ≤ + ((((3 * Q.index i + (digits₂ i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * + (cubeScaleFactor Q / 3)) := by + apply mul_le_mul_of_nonneg_right ?_ hscale_nonneg + rw [hcast₁, hcast₂] + linarith [hdsep] + exact not_lt_of_ge (le_trans hsep hx₂i.1) hx₁i.2 + · have hdsep_nat : (digits₂ i).val + 1 ≤ (digits₁ i).val := by + exact Nat.succ_le_of_lt (by simpa using hlt) + have hdsep : ((digits₂ i : ℤ) : ℝ) + 1 ≤ ((digits₁ i : ℤ) : ℝ) := by + exact_mod_cast hdsep_nat + have hsep : + (((((3 * Q.index i + (digits₂ i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * + (cubeScaleFactor Q / 3))) ≤ + ((((3 * Q.index i + (digits₁ i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * + (cubeScaleFactor Q / 3)) := by + apply mul_le_mul_of_nonneg_right ?_ hscale_nonneg + rw [hcast₁, hcast₂] + linarith [hdsep] + exact not_lt_of_ge (le_trans hsep hx₁i.1) hx₂i.2 + +theorem disjoint_cubeSet_of_ne_mem_childCubes {d : ℕ} {Q R S : TriadicCube d} + (hR : R ∈ childCubes Q) (hS : S ∈ childCubes Q) (hneq : R ≠ S) : + Disjoint (cubeSet R) (cubeSet S) := by + rcases mem_childCubes_iff.mp hR with ⟨digits₁, rfl⟩ + rcases mem_childCubes_iff.mp hS with ⟨digits₂, rfl⟩ + have hdigits : digits₁ ≠ digits₂ := by + intro hdigits + apply hneq + simp [hdigits] + exact disjoint_cubeSet_childCube_of_ne Q hdigits + +theorem pairwiseDisjoint_childCubes {d : ℕ} (Q : TriadicCube d) : + (childCubes Q : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + intro R hR S hS hneq + exact disjoint_cubeSet_of_ne_mem_childCubes hR hS hneq + +theorem pairwiseDisjoint_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) : + ∀ n : ℕ, (descendantsAtDepth Q n : Set (TriadicCube d)).PairwiseDisjoint cubeSet + | 0 => by + simp [descendantsAtDepth_zero] + | n + 1 => by + intro R hR S hS hneq + rcases mem_descendantsAtDepth_succ_iff.mp hR with ⟨P, hP, hRchild⟩ + rcases mem_descendantsAtDepth_succ_iff.mp hS with ⟨T, hT, hSchild⟩ + by_cases hPT : P = T + · subst hPT + exact disjoint_cubeSet_of_ne_mem_childCubes hRchild hSchild hneq + · exact (pairwiseDisjoint_descendantsAtDepth Q n hP hT hPT).mono + (cubeSet_subset_of_mem_childCubes hRchild) + (cubeSet_subset_of_mem_childCubes hSchild) + +theorem cubeSet_subset_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} : + ∀ {n : ℕ}, R ∈ descendantsAtDepth Q n → cubeSet R ⊆ cubeSet Q + | 0, hR => by + rw [descendantsAtDepth_zero] at hR + rcases Finset.mem_singleton.mp hR with rfl + exact Set.Subset.rfl + | n + 1, hR => by + rw [descendantsAtDepth_succ] at hR + rcases Finset.mem_biUnion.mp hR with ⟨S, hS, hR⟩ + have hRS : cubeSet R ⊆ cubeSet S := cubeSet_subset_of_mem_childCubes hR + have hSQ : cubeSet S ⊆ cubeSet Q := cubeSet_subset_of_mem_descendantsAtDepth hS + exact fun x hx => hSQ (hRS hx) + +theorem openCubeSet_subset_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} : + ∀ {n : ℕ}, R ∈ descendantsAtDepth Q n → openCubeSet R ⊆ openCubeSet Q + | 0, hR => by + rw [descendantsAtDepth_zero] at hR + rcases Finset.mem_singleton.mp hR with rfl + exact Set.Subset.rfl + | n + 1, hR => by + rw [descendantsAtDepth_succ] at hR + rcases Finset.mem_biUnion.mp hR with ⟨S, hS, hR⟩ + have hRS : openCubeSet R ⊆ openCubeSet S := openCubeSet_subset_of_mem_childCubes hR + have hSQ : openCubeSet S ⊆ openCubeSet Q := openCubeSet_subset_of_mem_descendantsAtDepth hS + exact fun x hx => hSQ (hRS hx) + +theorem cubeSet_subset_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + cubeSet R ⊆ cubeSet Q := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact cubeSet_subset_of_mem_descendantsAtDepth hR + +theorem scale_eq_sub_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} : + ∀ {n : ℕ}, R ∈ descendantsAtDepth Q n → R.scale = Q.scale - n + | 0, hR => by + rw [descendantsAtDepth_zero] at hR + simpa using congrArg TriadicCube.scale (Finset.mem_singleton.mp hR) + | n + 1, hR => by + rw [descendantsAtDepth_succ] at hR + rcases Finset.mem_biUnion.mp hR with ⟨S, hS, hR⟩ + calc + R.scale = S.scale - 1 := child_scale_of_mem_childCubes hR + _ = (Q.scale - n) - 1 := by rw [scale_eq_sub_of_mem_descendantsAtDepth hS] + _ = Q.scale - (n + 1) := by + simp [sub_eq_add_neg, add_assoc, add_comm] + +theorem cubeScaleFactor_descendant_eq_div_pow {d : ℕ} + {Q R : TriadicCube d} {n : ℕ} (hR : R ∈ descendantsAtDepth Q n) : + cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ n := by + have hscale := scale_eq_sub_of_mem_descendantsAtDepth hR + simp [cubeScaleFactor, hscale, zpow_sub₀, zpow_natCast] + +theorem scale_eq_sub_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} {k : ℤ} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) : + R.scale = Q.scale - Int.toNat (Q.scale - k) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact scale_eq_sub_of_mem_descendantsAtDepth hR + +theorem exists_mem_childCubes_of_mem_cubeSet {d : ℕ} {Q : TriadicCube d} {x : Vec d} + (hx : x ∈ cubeSet Q) : + ∃ R ∈ childCubes Q, x ∈ cubeSet R := by + let s : ℝ := cubeScaleFactor Q + let b1 : Fin d → ℝ := fun i => ((Q.index i : ℝ) - (1 / 6 : ℝ)) * s + let b2 : Fin d → ℝ := fun i => ((Q.index i : ℝ) + (1 / 6 : ℝ)) * s + let digits : Fin d → Fin 3 := fun i => + if h0 : x i < b1 i then 0 + else if h1 : x i < b2 i then 1 + else 2 + let R : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i + (digits i : ℤ) - 1 } + refine ⟨R, ?_, ?_⟩ + · exact Finset.mem_image.mpr ⟨digits, Finset.mem_univ _, by simp [R]⟩ + · intro i + rcases hx i with ⟨hloQ, hhiQ⟩ + have hloQ' : ((Q.index i : ℝ) - 1 / 2) * s ≤ x i := by + simpa [s] using hloQ + have hhiQ' : x i < ((Q.index i : ℝ) + 1 / 2) * s := by + simpa [s] using hhiQ + have hscaleR : cubeScaleFactor R = s / 3 := by + simp [R, s] + rw [hscaleR] + change + ((((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (s / 3) ≤ x i) ∧ + (x i < (((3 * Q.index i + (digits i : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (s / 3)) + have hcast0 : + (((3 * Q.index i + (0 : ℤ) - 1 : ℤ) : ℝ)) = 3 * (Q.index i : ℝ) - 1 := by + norm_num + have hcast1 : + (((3 * Q.index i + (1 : ℤ) - 1 : ℤ) : ℝ)) = 3 * (Q.index i : ℝ) := by + norm_num + have hcast2 : + (((3 * Q.index i + (2 : ℤ) - 1 : ℤ) : ℝ)) = 3 * (Q.index i : ℝ) + 1 := by + calc + (((3 * Q.index i + (2 : ℤ) - 1 : ℤ) : ℝ)) + = (((1 + Q.index i * 3 : ℤ) : ℝ)) := by ring_nf + _ = 1 + (Q.index i : ℝ) * 3 := by norm_num + _ = 3 * (Q.index i : ℝ) + 1 := by ring_nf + by_cases h0 : x i < b1 i + · have h0' : x i < ((Q.index i : ℝ) - (1 / 6 : ℝ)) * s := by + simpa [b1] using h0 + have hdz : (digits i : ℤ) = 0 := by simp [digits, h0] + rw [hdz] + refine ⟨?_, ?_⟩ + · calc + ((((3 * Q.index i + (0 : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (s / 3)) + = ((Q.index i : ℝ) - 1 / 2) * s := by + rw [hcast0] + ring + _ ≤ x i := hloQ' + · calc + x i < ((Q.index i : ℝ) - (1 / 6 : ℝ)) * s := h0' + _ = (((3 * Q.index i + (0 : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (s / 3) := by + rw [hcast0] + ring + · by_cases h1 : x i < b2 i + · have h1' : x i < ((Q.index i : ℝ) + (1 / 6 : ℝ)) * s := by + simpa [b2] using h1 + have hb1_le : ((Q.index i : ℝ) - (1 / 6 : ℝ)) * s ≤ x i := by + exact le_of_not_gt (by simpa [b1] using h0) + have hdz : (digits i : ℤ) = 1 := by simp [digits, h0, h1] + rw [hdz] + refine ⟨?_, ?_⟩ + · calc + ((((3 * Q.index i + (1 : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (s / 3)) + = ((Q.index i : ℝ) - (1 / 6 : ℝ)) * s := by + rw [hcast1] + ring + _ ≤ x i := hb1_le + · calc + x i < ((Q.index i : ℝ) + (1 / 6 : ℝ)) * s := h1' + _ = (((3 * Q.index i + (1 : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (s / 3) := by + rw [hcast1] + ring + · have hb2_le : ((Q.index i : ℝ) + (1 / 6 : ℝ)) * s ≤ x i := by + exact le_of_not_gt (by simpa [b2] using h1) + have hdz : (digits i : ℤ) = 2 := by simp [digits, h0, h1] + rw [hdz] + refine ⟨?_, ?_⟩ + · calc + ((((3 * Q.index i + (2 : ℤ) - 1 : ℤ) : ℝ) - 1 / 2) * (s / 3)) + = ((Q.index i : ℝ) + (1 / 6 : ℝ)) * s := by + rw [hcast2] + ring + _ ≤ x i := hb2_le + · calc + x i < ((Q.index i : ℝ) + 1 / 2) * s := hhiQ' + _ = (((3 * Q.index i + (2 : ℤ) - 1 : ℤ) : ℝ) + 1 / 2) * (s / 3) := by + rw [hcast2] + ring + +theorem cubeSet_subset_iUnion_childCubes {d : ℕ} (Q : TriadicCube d) : + cubeSet Q ⊆ ⋃ R ∈ (childCubes Q : Set (TriadicCube d)), cubeSet R := by + intro x hx + rcases exists_mem_childCubes_of_mem_cubeSet hx with ⟨R, hR, hxR⟩ + exact Set.mem_iUnion.mpr ⟨R, Set.mem_iUnion.mpr ⟨hR, hxR⟩⟩ + +theorem iUnion_childCubes_subset_cubeSet {d : ℕ} (Q : TriadicCube d) : + (⋃ R ∈ (childCubes Q : Set (TriadicCube d)), cubeSet R) ⊆ cubeSet Q := by + intro x hx + rcases Set.mem_iUnion.mp hx with ⟨R, hxR⟩ + rcases Set.mem_iUnion.mp hxR with ⟨hR, hxR⟩ + exact cubeSet_subset_of_mem_childCubes hR hxR + +theorem cubeSet_eq_iUnion_childCubes {d : ℕ} (Q : TriadicCube d) : + cubeSet Q = ⋃ R ∈ (childCubes Q : Set (TriadicCube d)), cubeSet R := by + exact Set.Subset.antisymm (cubeSet_subset_iUnion_childCubes Q) (iUnion_childCubes_subset_cubeSet Q) + +theorem exists_mem_descendantsAtDepth_of_mem_cubeSet {d : ℕ} {Q : TriadicCube d} {x : Vec d} : + ∀ n : ℕ, x ∈ cubeSet Q → ∃ R ∈ descendantsAtDepth Q n, x ∈ cubeSet R + | 0, hx => ⟨Q, by simp, hx⟩ + | n + 1, hx => by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet n hx with ⟨S, hS, hxS⟩ + rcases exists_mem_childCubes_of_mem_cubeSet hxS with ⟨R, hR, hxR⟩ + refine ⟨R, ?_, hxR⟩ + rw [descendantsAtDepth_succ] + exact Finset.mem_biUnion.mpr ⟨S, hS, hR⟩ + +theorem cubeSet_subset_iUnion_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeSet Q ⊆ ⋃ R ∈ (descendantsAtDepth Q n : Set (TriadicCube d)), cubeSet R := by + intro x hx + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet n hx with ⟨R, hR, hxR⟩ + exact Set.mem_iUnion.mpr ⟨R, Set.mem_iUnion.mpr ⟨hR, hxR⟩⟩ + +theorem iUnion_descendantsAtDepth_subset_cubeSet {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + (⋃ R ∈ (descendantsAtDepth Q n : Set (TriadicCube d)), cubeSet R) ⊆ cubeSet Q := by + intro x hx + rcases Set.mem_iUnion.mp hx with ⟨R, hxR⟩ + rcases Set.mem_iUnion.mp hxR with ⟨hR, hxR⟩ + exact cubeSet_subset_of_mem_descendantsAtDepth hR hxR + +theorem cubeSet_eq_iUnion_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeSet Q = ⋃ R ∈ (descendantsAtDepth Q n : Set (TriadicCube d)), cubeSet R := by + exact Set.Subset.antisymm + (cubeSet_subset_iUnion_descendantsAtDepth Q n) + (iUnion_descendantsAtDepth_subset_cubeSet Q n) + +theorem cubeSet_subset_iUnion_descendantsAtScale {d : ℕ} (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + cubeSet Q ⊆ ⋃ R ∈ (descendantsAtScale Q k : Set (TriadicCube d)), cubeSet R := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + exact cubeSet_subset_iUnion_descendantsAtDepth Q (Int.toNat (Q.scale - k)) + +theorem iUnion_descendantsAtScale_subset_cubeSet {d : ℕ} (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + (⋃ R ∈ (descendantsAtScale Q k : Set (TriadicCube d)), cubeSet R) ⊆ cubeSet Q := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + exact iUnion_descendantsAtDepth_subset_cubeSet Q (Int.toNat (Q.scale - k)) + +theorem cubeSet_eq_iUnion_descendantsAtScale {d : ℕ} (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + cubeSet Q = ⋃ R ∈ (descendantsAtScale Q k : Set (TriadicCube d)), cubeSet R := by + exact Set.Subset.antisymm + (cubeSet_subset_iUnion_descendantsAtScale Q hk) + (iUnion_descendantsAtScale_subset_cubeSet Q hk) + +theorem pairwiseDisjoint_descendantsAtScale {d : ℕ} (Q : TriadicCube d) {k : ℤ} + (hk : k ≤ Q.scale) : + (descendantsAtScale Q k : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + exact pairwiseDisjoint_descendantsAtDepth Q (Int.toNat (Q.scale - k)) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast.lean new file mode 100644 index 0000000000..cf8c918f81 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor.lean new file mode 100644 index 0000000000..ffb49db8a0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase.lean new file mode 100644 index 0000000000..92983e1a2b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase.lean @@ -0,0 +1,24 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CarrierObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.ClampedObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CorePatchEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CutoffData +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinAE +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.MeasurableObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.PerCoreEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Recombination +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Resample +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Variance +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.VarianceFinal + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CarrierObservable.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CarrierObservable.lean new file mode 100644 index 0000000000..cd32341d99 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CarrierObservable.lean @@ -0,0 +1,621 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.ClampedObservable +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Internal.AEESliceAssembly.CarrierMuFamily +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability + +/-! +# The carrier-measurable clamped observable + +The shipped fixed-phase Efron–Stein chain exhibited a product-measurable +observable on the **raw** tuple space `(↥K → CoeffField d)` via the fine +`PointwiseLocalSigma` generator trick (`measurable_coreLocalEnergy`). On the honest +carrier that trick is unavailable (fine local events are not carrier events), +and the truncated per-core energy is a genuinely nonlinear functional of the +field, so its entry-test lane is not a transported generator. + +This file replaces that measurability heart with an **honest carrier +construction**: + +* `coreWindow` — the open core window (open interior box ∩ open cube), whose + difference from the half-open core piece `coreBox ∩ cubeSet` is Lebesgue-null; +* `coreGoodSet` — the genuinely measurable event (a `slicePart` rational-ball + intersection, Packet P4b) that the field is a.e. `(1,Θ)`-elliptic on the core + window; +* `coreLocalEnergyR` — the per-core energy of the truncated glued field, + totalized by `0` off `coreGoodSet`; +* `measurable_coreLocalEnergyR` — **the measurability heart**: on `coreGoodSet` + the truncation is a.e. invisible, so the energy decomposes as a corridor + constant plus an indicator-weighted block-coefficient integral over the open + window, measurable through the carrier `L²` realization engine of + `CarrierMuFamily` (dense-probe inner products = localized `entryTestR` + generators); +* `phaseSplitEnergyR`, `rawPhaseObservableR`, `clampedPhaseObservableR` — the + assembled genuinely product-measurable clamped observable on carrier tuples; +* `clampedPhaseObservableR_restrict_eq_of_field` — the diagonal identity: on the + carrier restriction tuple of a measurable, a.e. `(1,Θ)`-elliptic field it + reproduces the fixed-phase observable exactly (via the shipped raw five-link + identity). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory BigOperators +open MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The open core window and its null boundary -/ + +/-- The open interior box of `coreBox` (product of open intervals). -/ +def coreBoxIoo (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Set (Vec d) := + Set.pi Set.univ + (fun i => Set.Ioo (σ i + k i * ℓ + 1) (σ i + (k i + 1) * ℓ - 1)) + +theorem coreBoxIoo_subset_coreBox {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} : + coreBoxIoo ℓ σ k ⊆ coreBox ℓ σ k := + Set.pi_mono (fun _ _ => Set.Ioo_subset_Icc_self) + +theorem isOpen_coreBoxIoo (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + IsOpen (coreBoxIoo ℓ σ k) := + isOpen_set_pi Set.finite_univ (fun _ _ => isOpen_Ioo) + +/-- The closed core box agrees with its open interior box up to a null set. -/ +theorem coreBox_ae_eq_coreBoxIoo (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + coreBox ℓ σ k =ᵐ[MeasureTheory.volume] coreBoxIoo ℓ σ k := by + unfold coreBox coreBoxIoo + rw [Set.pi_univ_Icc] + exact (MeasureTheory.Measure.univ_pi_Ioo_ae_eq_Icc + (f := fun i : Fin d => σ i + k i * ℓ + 1) + (g := fun i : Fin d => σ i + (k i + 1) * ℓ - 1)).symm + +/-- The open core window: interior box ∩ open cube. -/ +def coreWindow (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (m : ℤ) : Set (Vec d) := + coreBoxIoo ℓ σ k ∩ openCubeSet (originCube d m) + +theorem isOpen_coreWindow (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (m : ℤ) : + IsOpen (coreWindow ℓ σ k m) := + (isOpen_coreBoxIoo ℓ σ k).inter (isOpen_openCubeSet (originCube d m)) + +theorem measurableSet_coreWindow (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (m : ℤ) : + MeasurableSet (coreWindow ℓ σ k m) := + (isOpen_coreWindow ℓ σ k m).measurableSet + +theorem coreWindow_subset_cubeSet {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} {m : ℤ} : + coreWindow ℓ σ k m ⊆ cubeSet (originCube d m) := + fun _ hx => openCubeSet_subset_cubeSet (originCube d m) hx.2 + +theorem coreWindow_subset_coreBox {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} {m : ℤ} : + coreWindow ℓ σ k m ⊆ coreBox ℓ σ k := + fun _ hx => coreBoxIoo_subset_coreBox hx.1 + +/-- The half-open core piece agrees with the open core window up to a null +set. -/ +theorem corePiece_ae_eq_coreWindow (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (m : ℤ) : + ((coreBox ℓ σ k ∩ cubeSet (originCube d m) : Set (Vec d))) + =ᵐ[MeasureTheory.volume] coreWindow ℓ σ k m := + MeasureTheory.ae_eq_set_inter (coreBox_ae_eq_coreBoxIoo ℓ σ k) + (cubeSet_ae_eq_openCubeSet (originCube d m)) + +theorem isFiniteMeasure_volumeMeasureOn_coreWindow (ℓ : ℝ) (σ : Vec d) + (k : Fin d → ℤ) (m : ℤ) : + IsFiniteMeasure (volumeMeasureOn (coreWindow ℓ σ k m)) := by + refine ⟨?_⟩ + rw [Measure.restrict_apply_univ] + exact lt_of_le_of_lt (measure_mono coreWindow_subset_cubeSet) + (volume_cubeSet_lt_top (originCube d m)) + +theorem isFiniteMeasure_volumeMeasureOn_corePiece (ℓ : ℝ) (σ : Vec d) + (k : Fin d → ℤ) (m : ℤ) : + IsFiniteMeasure (volumeMeasureOn (coreBox ℓ σ k ∩ cubeSet (originCube d m))) := by + refine ⟨?_⟩ + rw [Measure.restrict_apply_univ] + exact lt_of_le_of_lt (measure_mono Set.inter_subset_right) + (volume_cubeSet_lt_top (originCube d m)) + +/-! ## The good event -/ + +/-- The genuinely measurable good event: the field is a.e. `(1,Θ)`-elliptic on +the open core window (as a `slicePart` rational-ball intersection). -/ +def coreGoodSet (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (k : Fin d → ℤ) (m : ℤ) : + Set (RegCoeffField d) := + slicePart (coreWindow ℓ σ k m) 1 Θ + +theorem measurableSet_coreGoodSet (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (k : Fin d → ℤ) + (m : ℤ) : MeasurableSet (coreGoodSet ℓ σ Θ k m) := + LocalSigmaR_le (coreWindow ℓ σ k m) _ (measurableSet_slicePart 1 Θ) + +/-- Membership in the good event is exactly a.e. `(1,Θ)`-ellipticity on the open +core window. -/ +theorem mem_coreGoodSet_iff {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {k : Fin d → ℤ} {m : ℤ} + {b : RegCoeffField d} : + b ∈ coreGoodSet ℓ σ Θ k m ↔ + ∀ᵐ x ∂(volume.restrict (coreWindow ℓ σ k m)), IsEllipticMatrix 1 Θ (b x) := by + rw [coreGoodSet, ← setOf_aeRestrict_isEllipticMatrix_eq_slicePart + (isOpen_coreWindow ℓ σ k m) 1 Θ] + rfl + +/-- On the good event, the field is a.e. `(1,Θ)`-elliptic on the half-open core +piece as well (null boundary). -/ +theorem ae_isEllipticMatrix_corePiece_of_mem_coreGoodSet {ℓ : ℝ} {σ : Vec d} + {Θ : ℝ} {k : Fin d → ℤ} {m : ℤ} {b : RegCoeffField d} + (hb : b ∈ coreGoodSet ℓ σ Θ k m) : + ∀ᵐ x ∂(volume.restrict (coreBox ℓ σ k ∩ cubeSet (originCube d m))), + IsEllipticMatrix 1 Θ (b x) := by + rw [Measure.restrict_congr_set (corePiece_ae_eq_coreWindow ℓ σ k m)] + exact mem_coreGoodSet_iff.1 hb + +/-- The slice level attached to the ellipticity constant `Θ`. -/ +noncomputable def thetaSliceLevel (Θ : ℝ) : ℕ := ⌈Θ⌉₊ + +/-- On the good event, the field lies in the AEE quantitative slice of the open +core window at level `⌈Θ⌉₊`. -/ +theorem aeeSlice_coreWindow_of_mem_coreGoodSet {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} + {k : Fin d → ℤ} {m : ℤ} {b : RegCoeffField d} + (hb : b ∈ coreGoodSet ℓ σ Θ k m) : + AEEQuantitativeEllipticSlice (coreWindow ℓ σ k m) (thetaSliceLevel Θ) b.toFun := by + rw [aeeQuantitativeEllipticSlice_carrier_iff _ (measurableSet_coreWindow ℓ σ k m)] + filter_upwards [mem_coreGoodSet_iff.1 hb] with x hx + have h1 : (0 : ℝ) < ((thetaSliceLevel Θ : ℝ) + 1)⁻¹ := by positivity + have h2 : ((thetaSliceLevel Θ : ℝ) + 1)⁻¹ ≤ 1 := by + rw [inv_le_one₀ (by positivity)] + have : (0 : ℝ) ≤ (thetaSliceLevel Θ : ℝ) := by positivity + linarith + have h3 : Θ ≤ (thetaSliceLevel Θ : ℝ) + 1 := by + have := Nat.le_ceil Θ + have hcast : (⌈Θ⌉₊ : ℝ) ≤ (thetaSliceLevel Θ : ℝ) := le_of_eq rfl + unfold thetaSliceLevel + linarith [Nat.le_ceil Θ] + exact hx.mono h1 h2 h3 + +/-! ## The totalized per-core energy -/ + +/-- The per-core energy of the truncated glued field, totalized by `0` off the +genuinely measurable good event. -/ +noncomputable def coreLocalEnergyR (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (X : BlockState d) (k : Fin d → ℤ) (b : RegCoeffField d) : ℝ := by + classical + exact if b ∈ coreGoodSet ℓ σ Θ k m then + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X b.toFun + else 0 + +theorem coreLocalEnergyR_of_mem {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + {X : BlockState d} {k : Fin d → ℤ} {b : RegCoeffField d} + (hb : b ∈ coreGoodSet ℓ σ Θ k m) : + coreLocalEnergyR ℓ σ Θ m X k b + = coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X b.toFun := by + classical + simp [coreLocalEnergyR, hb] + +/-! ## The decomposition on the good event -/ + +/-- The truncated glued field of an entrywise-measurable field is genuinely +`(1,Θ)`-elliptic on any measurable set (general-`W` version of the cube +statement in `ClampedObservable`). -/ +theorem isEllipticFieldOn_glueField_of_field_set {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} + {W : Set (Vec d)} (hW : MeasurableSet W) (hΘ : 1 ≤ Θ) {b : CoeffField d} + (hbmeas : ∀ i j : Fin d, Measurable fun x : Vec d => b x i j) : + IsEllipticFieldOn 1 Θ W (glueField ℓ σ Θ b) := by + classical + have hcorrM : MeasurableSet (corridorSet ℓ σ) := measurableSet_corridorSet ℓ σ + have hmeasField : + Measurable (fun x : Vec d => fun i j => + if x ∈ W then (corridorField ℓ σ b) x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + have hrw : + (fun x : Vec d => if x ∈ W then (corridorField ℓ σ b) x i j else 0) + = fun x : Vec d => + if x ∈ W then + (if x ∈ corridorSet ℓ σ then (1 : Mat d) i j else b x i j) else 0 := by + funext x + by_cases hxW : x ∈ W + · simp only [hxW, if_true] + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc]; simp [hxc] + · rw [corridorField_apply_of_not_mem hxc]; simp [hxc] + · simp [hxW] + rw [hrw] + exact Measurable.ite hW + (Measurable.ite hcorrM measurable_const (hbmeas i j)) measurable_const + exact isEllipticFieldOn_ellipticTruncate hW hΘ hmeasField + +/-- **The decomposition of the per-core energy on the good event.** The +truncation is invisible off the corridor, so the energy is a corridor constant +plus an indicator-weighted sum of block-coefficient entry integrals over the +open core window. -/ +theorem coreLocalEnergy_eq_corridorPiece_add_sum {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) {m : ℤ} (X : BlockState d) + (hX : MemBlockL2 (cubeSet (originCube d m)) X.eval) + {k : Fin d → ℤ} {b : RegCoeffField d} (hb : b ∈ coreGoodSet ℓ σ Θ k m) : + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X b.toFun + = (∫ x in (coreBox ℓ σ k ∩ cubeSet (originCube d m)) ∩ corridorSet ℓ σ, + blockEnergyDensity (fun _ => (1 : Mat d)) X x ∂volume) + + ∑ α, ∑ β, + ∫ x in coreWindow ℓ σ k m, + Set.indicator + ((coreBox ℓ σ k ∩ cubeSet (originCube d m)) \ corridorSet ℓ σ) + (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField b.toFun x) α β ∂volume := by + classical + set W : Set (Vec d) := coreBox ℓ σ k ∩ cubeSet (originCube d m) with hWdef + set V : Set (Vec d) := coreWindow ℓ σ k m with hVdef + set T : Set (Vec d) := W \ corridorSet ℓ σ with hTdef + have hWmeas : MeasurableSet W := + (measurableSet_coreBox ℓ σ k).inter (measurableSet_cubeSet (originCube d m)) + have hcorrM : MeasurableSet (corridorSet ℓ σ) := measurableSet_corridorSet ℓ σ + have hTmeas : MeasurableSet T := hWmeas.diff hcorrM + have : IsFiniteMeasure (volumeMeasureOn W) := + isFiniteMeasure_volumeMeasureOn_corePiece ℓ σ k m + have : IsFiniteMeasure (volumeMeasureOn V) := + isFiniteMeasure_volumeMeasureOn_coreWindow ℓ σ k m + -- L² membership on the core piece and the window + have hXW : MemBlockL2 W X.eval := + hX.mono_measure (Measure.restrict_mono Set.inter_subset_right le_rfl) + have hXV : MemBlockL2 V X.eval := + hX.mono_measure (Measure.restrict_mono coreWindow_subset_cubeSet le_rfl) + -- a.e. ellipticity on the core piece + have hbW : ∀ᵐ x ∂(volume.restrict W), IsEllipticMatrix 1 Θ (b x) := + ae_isEllipticMatrix_corePiece_of_mem_coreGoodSet hb + -- integrability of the glued density on the core piece + have hglueEll : IsEllipticFieldOn 1 Θ W (glueField ℓ σ Θ b.toFun) := + isEllipticFieldOn_glueField_of_field_set hWmeas hΘ + (fun i j => b.entry_measurable i j) + have hIntOn : IntegrableOn (blockEnergyDensity (glueField ℓ σ Θ b.toFun) X) W := by + have hpair := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (a := glueField ℓ σ Θ b.toFun) hXW hXW hglueEll + have hEq : blockEnergyDensity (glueField ℓ σ Θ b.toFun) X + = fun x => (1 / 2 : ℝ) * + blockPairingIntegrand (glueField ℓ σ Θ b.toFun) X X x := by + funext x; rfl + rw [hEq] + exact hpair.const_mul (1 / 2) + -- split off the corridor + have hsplit : + (∫ x in W, blockEnergyDensity (glueField ℓ σ Θ b.toFun) X x ∂volume) + = (∫ x in W ∩ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ b.toFun) X x ∂volume) + + ∫ x in T, blockEnergyDensity (glueField ℓ σ Θ b.toFun) X x ∂volume := + (MeasureTheory.integral_inter_add_sdiff hcorrM hIntOn).symm + -- corridor piece: the glued field is the identity there + have hcorrEq : + (∫ x in W ∩ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ b.toFun) X x ∂volume) + = ∫ x in W ∩ corridorSet ℓ σ, + blockEnergyDensity (fun _ => (1 : Mat d)) X x ∂volume := by + refine MeasureTheory.setIntegral_congr_fun (hWmeas.inter hcorrM) (fun x hx => ?_) + have hval : glueField ℓ σ Θ b.toFun x = (1 : Mat d) := + glueField_apply_of_mem_corridor hΘ hx.2 + simp only [blockEnergyDensity, blockCoeffField, hval] + -- off the corridor the truncation is a.e. invisible + have hbT : ∀ᵐ x ∂(volume.restrict T), IsEllipticMatrix 1 Θ (b x) := + ae_restrict_of_ae_restrict_of_subset Set.sdiff_subset hbW + have hTglue : + (∫ x in T, blockEnergyDensity (glueField ℓ σ Θ b.toFun) X x ∂volume) + = ∫ x in T, blockEnergyDensity b.toFun X x ∂volume := by + refine integral_congr_ae ?_ + filter_upwards [hbT, ae_restrict_mem hTmeas] with x hxEll hxT + have hcorr : corridorField ℓ σ b.toFun x = b.toFun x := + corridorField_apply_of_not_mem hxT.2 + have hval : glueField ℓ σ Θ b.toFun x = b.toFun x := by + unfold glueField + rw [ellipticTruncate_of_elliptic (by rw [hcorr]; exact hxEll), hcorr] + simp only [blockEnergyDensity, blockCoeffField, hval] + -- move to the open window + have hWVnull : volume (W \ V) = 0 := + ((MeasureTheory.ae_eq_set.1 (corePiece_ae_eq_coreWindow ℓ σ k m)).1) + have hTV : T =ᵐ[MeasureTheory.volume] ((T ∩ V : Set (Vec d))) := by + rw [MeasureTheory.ae_eq_set] + constructor + · refine measure_mono_null ?_ hWVnull + intro x hx + exact ⟨hx.1.1, fun hxV => hx.2 ⟨hx.1, hxV⟩⟩ + · exact measure_mono_null + (fun x hx => absurd hx.1.1 hx.2) hWVnull + have hTwindow : + (∫ x in T, blockEnergyDensity b.toFun X x ∂volume) + = ∫ x in V, Set.indicator T (fun x => blockEnergyDensity b.toFun X x) x ∂volume := by + rw [MeasureTheory.setIntegral_congr_set hTV, + MeasureTheory.setIntegral_indicator hTmeas, Set.inter_comm V T] + -- the pointwise entry-weight expansion under the indicator + have hpoint : (fun x => Set.indicator T (fun x => blockEnergyDensity b.toFun X x) x) + = fun x => ∑ α, ∑ β, + Set.indicator T (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField b.toFun x) α β := by + funext x + by_cases hx : x ∈ T + · rw [Set.indicator_of_mem hx, blockEnergyDensity_eq_sum_entryWeights] + refine Finset.sum_congr rfl (fun α _ => Finset.sum_congr rfl (fun β _ => ?_)) + rw [Set.indicator_of_mem hx] + · rw [Set.indicator_of_notMem hx] + symm + refine Finset.sum_eq_zero (fun α _ => Finset.sum_eq_zero (fun β _ => ?_)) + rw [Set.indicator_of_notMem hx, zero_mul] + -- slice membership and integrability of the weighted entries on the window + have hSliceb : AEEQuantitativeEllipticSlice V (thetaSliceLevel Θ) b.toFun := + aeeSlice_coreWindow_of_mem_coreGoodSet hb + have hInt_αβ : ∀ α β : BlockCoord d, + Integrable + (fun x => Set.indicator T (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField b.toFun x) α β) (volumeMeasureOn V) := by + intro α β + exact hSliceb.integrable_weightedFullBlockCoeffEntry_of_integrable + ((integrable_blockEnergyEntryWeight_of_memBlockL2 hXV α β).indicator hTmeas) α β + have hsum : + (∫ x in V, (∑ α, ∑ β, + Set.indicator T (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField b.toFun x) α β) ∂volume) + = ∑ α, ∑ β, + ∫ x in V, Set.indicator T (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField b.toFun x) α β ∂volume := by + rw [integral_finsetSum _ (fun α _ => integrable_finsetSum _ (fun β _ => hInt_αβ α β))] + exact Finset.sum_congr rfl + (fun α _ => integral_finsetSum _ (fun β _ => hInt_αβ α β)) + -- assemble + unfold coreLocalEnergy + rw [hsplit, hcorrEq, hTglue, hTwindow, hpoint, hsum] + +/-! ## The measurability heart -/ + +/-- **The totalized per-core energy is genuinely measurable on the carrier.** +On the good event the energy is a corridor constant plus indicator-weighted +block-coefficient entry integrals over the open core window, each measurable +through the carrier `L²` realization engine; off the good event it is `0`, and +the good event itself is genuinely measurable (`slicePart`). -/ +theorem measurable_coreLocalEnergyR {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} (X : BlockState d) + (hX : MemBlockL2 (cubeSet (originCube d m)) X.eval) (k : Fin d → ℤ) : + Measurable (coreLocalEnergyR ℓ σ Θ m X k) := by + classical + set V : Set (Vec d) := coreWindow ℓ σ k m with hVdef + set T : Set (Vec d) := + (coreBox ℓ σ k ∩ cubeSet (originCube d m)) \ corridorSet ℓ σ with hTdef + have hTmeas : MeasurableSet T := + ((measurableSet_coreBox ℓ σ k).inter + (measurableSet_cubeSet (originCube d m))).diff (measurableSet_corridorSet ℓ σ) + have : IsFiniteMeasure (volumeMeasureOn V) := + isFiniteMeasure_volumeMeasureOn_coreWindow ℓ σ k m + have hXV : MemBlockL2 V X.eval := + hX.mono_measure (Measure.restrict_mono coreWindow_subset_cubeSet le_rfl) + -- the carrier L² realization on the good-event subtype + set G : Set (RegCoeffField d) := coreGoodSet ℓ σ Θ k m with hGdef + have hGmeas : MeasurableSet G := measurableSet_coreGoodSet ℓ σ Θ k m + have hSlice : ∀ ω : ↥G, + AEEQuantitativeEllipticSlice V (thetaSliceLevel Θ) ((ω : RegCoeffField d)).toFun := + fun ω => aeeSlice_coreWindow_of_mem_coreGoodSet ω.2 + have hEntry : ∀ (i j : Fin d) {φ : Vec d → ℝ}, IsProbeR φ → + Function.support φ ⊆ V → + Measurable (fun ω : ↥G => entryTestR i j φ (ω : RegCoeffField d)) := + fun i j φ hφ _ => (measurable_entryTestR i j hφ).comp measurable_subtype_coe + have hEntrySmooth : ∀ (i j : Fin d) {φ : Vec d → ℝ}, + ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → tsupport φ ⊆ V → + Measurable (fun ω : ↥G => entryTestR i j φ (ω : RegCoeffField d)) := by + intro i j φ hcont hcompact htsupport + exact hEntry i j (IsProbeR.of_smooth hcont hcompact) + ((Function.support_subset_iff.2 (fun x hx => subset_tsupport φ hx)).trans htsupport) + have hF := measurable_toHilbertMatrixL2_carrier + (A := fun ω : ↥G => (ω : RegCoeffField d)) (hSlice := hSlice) + (measurableSet_coreWindow ℓ σ k m) hEntrySmooth (isOpen_coreWindow ℓ σ k m) + (by + have := isFiniteMeasure_volumeMeasureOn_coreWindow ℓ σ k m + have hlt : volume V < ⊤ := + lt_of_le_of_lt (measure_mono coreWindow_subset_cubeSet) + (volume_cubeSet_lt_top (originCube d m)) + exact hlt.ne) + -- the branch function on the subtype + have hbranch : Measurable (fun ω : ↥G => + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X + ((ω : RegCoeffField d)).toFun) := by + have hrw : (fun ω : ↥G => + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X + ((ω : RegCoeffField d)).toFun) + = fun ω : ↥G => + (∫ x in (coreBox ℓ σ k ∩ cubeSet (originCube d m)) ∩ corridorSet ℓ σ, + blockEnergyDensity (fun _ => (1 : Mat d)) X x ∂volume) + + ∑ α, ∑ β, + ∫ x in V, + Set.indicator T (blockEnergyEntryWeight X α β) x + * toFullBlockMat (blockCoeffField ((ω : RegCoeffField d)).toFun x) α β + ∂volume := by + funext ω + exact coreLocalEnergy_eq_corridorPiece_add_sum hΘ X hX ω.2 + rw [hrw] + refine measurable_const.add ?_ + refine Finset.measurable_sum _ (fun α _ => Finset.measurable_sum _ (fun β _ => ?_)) + exact measurable_integrableWeightedFullBlockCoeffEntry_carrier hF + ((integrable_blockEnergyEntryWeight_of_memBlockL2 hXV α β).indicator hTmeas) α β + -- assemble the dite + have hrwR : coreLocalEnergyR ℓ σ Θ m X k + = fun b : RegCoeffField d => + if h : b ∈ G then + (fun ω : ↥G => + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k ∩ cubeSet (originCube d m)) X + ((ω : RegCoeffField d)).toFun) ⟨b, h⟩ + else (fun _ : ↥(Gᶜ) => (0 : ℝ)) ⟨b, h⟩ := by + funext b + by_cases hb : b ∈ G + · simp [coreLocalEnergyR, hGdef] + · simp [coreLocalEnergyR, hGdef] + rw [hrwR] + exact Measurable.dite hbranch measurable_const hGmeas + +/-! ## The assembled carrier observables -/ + +/-- The carrier split observable: corridor constant plus totalized per-core +energies, normalized by the cube volume. -/ +noncomputable def phaseSplitEnergyR (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (X : BlockState d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → RegCoeffField d) : ℝ := + (volume (cubeSet (originCube d m))).toReal⁻¹ * + (corridorConst ℓ σ (cubeSet (originCube d m)) X + + ∑ k : {k // k ∈ K}, coreLocalEnergyR ℓ σ Θ m X k.1 (y k)) + +theorem measurable_phaseSplitEnergyR {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} (X : BlockState d) + (hX : MemBlockL2 (cubeSet (originCube d m)) X.eval) (K : Finset (Fin d → ℤ)) : + Measurable + (fun y : {k // k ∈ K} → RegCoeffField d => phaseSplitEnergyR ℓ σ Θ m X K y) := by + unfold phaseSplitEnergyR + refine measurable_const.mul (measurable_const.add ?_) + refine Finset.measurable_sum _ (fun k _ => ?_) + exact (measurable_coreLocalEnergyR hΘ X hX k.1).comp (measurable_pi_apply k) + +/-- On tuples of good coordinates the carrier split observable agrees with the +raw split observable of the underlying fields. -/ +theorem phaseSplitEnergyR_eq_of_good {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (X : BlockState d) {K : Finset (Fin d → ℤ)} + {y : {k // k ∈ K} → RegCoeffField d} + (hy : ∀ k : {k // k ∈ K}, y k ∈ coreGoodSet ℓ σ Θ k.1 m) : + phaseSplitEnergyR ℓ σ Θ m X K y + = phaseSplitEnergy ℓ σ Θ (cubeSet (originCube d m)) X K + (fun k => (y k).toFun) := by + unfold phaseSplitEnergyR phaseSplitEnergy + have hsum : (∑ k : {k // k ∈ K}, coreLocalEnergyR ℓ σ Θ m X k.1 (y k)) + = ∑ k : {k // k ∈ K}, + coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k.1 ∩ cubeSet (originCube d m)) X + (y k).toFun := + Finset.sum_congr rfl (fun k _ => coreLocalEnergyR_of_mem (hy k)) + rw [hsum] + +/-- The carrier raw observable: twice the infimum over the canonical competitor +family of the carrier split energies. -/ +noncomputable def rawPhaseObservableR (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → RegCoeffField d) : ℝ := + 2 * ⨅ n : ℕ, + phaseSplitEnergyR ℓ σ Θ m (phaseCompetitor (originCube d m) P n) K y + +theorem measurable_rawPhaseObservableR {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} (P : BlockVec d) (K : Finset (Fin d → ℤ)) : + Measurable + (fun y : {k // k ∈ K} → RegCoeffField d => rawPhaseObservableR ℓ σ Θ m P K y) := by + unfold rawPhaseObservableR + refine measurable_const.mul (Measurable.iInf (fun n => ?_)) + exact measurable_phaseSplitEnergyR hΘ _ + (canonicalMuGeneratorAffineField_memBlockL2 (U := cubeSet (originCube d m)) P _) K + +/-- On tuples of good coordinates the carrier raw observable agrees with the raw +one. -/ +theorem rawPhaseObservableR_eq_of_good {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (P : BlockVec d) {K : Finset (Fin d → ℤ)} + {y : {k // k ∈ K} → RegCoeffField d} + (hy : ∀ k : {k // k ∈ K}, y k ∈ coreGoodSet ℓ σ Θ k.1 m) : + rawPhaseObservableR ℓ σ Θ m P K y + = rawPhaseObservable ℓ σ Θ m P K (fun k => (y k).toFun) := by + unfold rawPhaseObservableR rawPhaseObservable + congr 1 + exact iInf_congr (fun n => phaseSplitEnergyR_eq_of_good _ hy) + +/-- The carrier clamped observable. -/ +noncomputable def clampedPhaseObservableR (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → RegCoeffField d) : ℝ := + max 0 (min (phaseBound Θ P) (rawPhaseObservableR ℓ σ Θ m P K y)) + +theorem measurable_clampedPhaseObservableR {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) {m : ℤ} (P : BlockVec d) (K : Finset (Fin d → ℤ)) : + Measurable + (fun y : {k // k ∈ K} → RegCoeffField d => + clampedPhaseObservableR ℓ σ Θ m P K y) := by + unfold clampedPhaseObservableR + exact measurable_const.max + (measurable_const.min (measurable_rawPhaseObservableR hΘ P K)) + +/-- The carrier clamped observable is globally bounded by `phaseBound Θ P`. -/ +theorem abs_clampedPhaseObservableR_le {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (hΘ : 1 ≤ Θ) (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → RegCoeffField d) : + |clampedPhaseObservableR ℓ σ Θ m P K y| ≤ phaseBound Θ P := by + unfold clampedPhaseObservableR + rw [abs_le] + refine ⟨le_trans (by linarith [phaseBound_nonneg hΘ P]) (le_max_left _ _), + max_le (phaseBound_nonneg hΘ P) (min_le_left _ _)⟩ + +/-- On tuples of good coordinates the carrier clamped observable agrees with the +raw clamped observable of the underlying fields. -/ +theorem clampedPhaseObservableR_eq_of_good {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (P : BlockVec d) {K : Finset (Fin d → ℤ)} + {y : {k // k ∈ K} → RegCoeffField d} + (hy : ∀ k : {k // k ∈ K}, y k ∈ coreGoodSet ℓ σ Θ k.1 m) : + clampedPhaseObservableR ℓ σ Θ m P K y + = clampedPhaseObservable ℓ σ Θ m P K (fun k => (y k).toFun) := by + unfold clampedPhaseObservableR clampedPhaseObservable + rw [rawPhaseObservableR_eq_of_good P hy] + +/-! ## The diagonal identity -/ + +/-- The `toFun` of the carrier restriction is the raw restriction of the +`toFun`. -/ +theorem restrictReg_toFun_eq (U : Set (Vec d)) (hU : MeasurableSet U) + (b : RegCoeffField d) : + (restrictReg U hU b).toFun = restrictCoeffField U b.toFun := by + funext x + by_cases hx : x ∈ U + · rw [restrictCoeffField_apply_of_mem hx] + exact Set.indicator_of_mem hx _ + · rw [restrictCoeffField_apply_of_not_mem hx] + exact Set.indicator_of_notMem hx _ + +/-- The carrier restriction of a globally a.e.-`(1,Θ)`-elliptic field to a core +box lies in the good event of that core. -/ +theorem restrictReg_mem_coreGoodSet {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + {k : Fin d → ℤ} {b : RegCoeffField d} + (hbell : ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (b x)) : + restrictReg (coreBox ℓ σ k) (measurableSet_coreBox ℓ σ k) b + ∈ coreGoodSet ℓ σ Θ k m := by + rw [mem_coreGoodSet_iff] + filter_upwards [ae_restrict_of_ae hbell, + ae_restrict_mem (measurableSet_coreWindow ℓ σ k m)] with x hxEll hxV + have hxk : x ∈ coreBox ℓ σ k := coreWindow_subset_coreBox hxV + have hval : restrictReg (coreBox ℓ σ k) (measurableSet_coreBox ℓ σ k) b x = b x := by + rw [restrictReg_apply, Set.indicator_of_mem hxk] + rw [hval] + exact hxEll + +/-- **The diagonal identity.** On the carrier restriction tuple of a (globally) +a.e.-`(1,Θ)`-elliptic carrier field, the carrier clamped observable reproduces +the fixed-phase observable exactly. -/ +theorem clampedPhaseObservableR_restrict_eq_of_field [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (b : RegCoeffField d) + (hbell : ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (b x)) : + clampedPhaseObservableR ℓ σ Θ m P K + (fun k : {k // k ∈ K} => + restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) b) + = phaseObservable ℓ σ m P b.toFun := by + have hy : ∀ k : {k // k ∈ K}, + restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) b + ∈ coreGoodSet ℓ σ Θ k.1 m := + fun k => restrictReg_mem_coreGoodSet hbell + have hraw : rawPhaseObservableR ℓ σ Θ m P K + (fun k : {k // k ∈ K} => + restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) b) + = rawPhaseObservable ℓ σ Θ m P K + (fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) b.toFun) := by + rw [rawPhaseObservableR_eq_of_good P hy, + show (fun k : {k // k ∈ K} => + (restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) b).toFun) + = fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) b.toFun from + funext fun k => restrictReg_toFun_eq _ _ b] + unfold clampedPhaseObservableR + rw [hraw, + rawPhaseObservable_restrict_eq_of_field hℓ hΘ P K hK b.toFun + (fun i j => b.entry_measurable i j) hbell] + obtain ⟨hlo, hhi⟩ := phaseObservable_mem_Icc hΘ P + (fun i j => b.entry_measurable i j) hbell + rw [min_eq_right (by simpa [phaseBound] using hhi), max_eq_right hlo] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/ClampedObservable.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/ClampedObservable.lean new file mode 100644 index 0000000000..c42ae7b819 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/ClampedObservable.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.MeasurableObservable +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich + +/-! +# The globally bounded clamped observable + +`efronStein_transfer_ae_restriction` requires the product observable to be **globally** +bounded (`∀ y, |G y| ≤ M`), not merely a.e. bounded. The raw product observable +`rawPhaseObservable` is only bounded on the a.e. event where the recombined field +is elliptic, so we clamp it to `[0, C]` with `C := 2(Θ‖p‖² + ‖q‖²)` — the exact +`C1′` sandwich bound for the coarse quadratic of a `(1,Θ)`-elliptic field. + +The clamp is the identity exactly where it matters: for any measurable, a.e.- +`(1,Θ)`-elliptic field `b` the truncated glued field `glueField ℓ σ Θ b` is +genuinely `(1,Θ)`-elliptic on the cube, so `phaseObservable ℓ σ m P b ∈ [0, C]` +(`phaseObservable_mem_Icc`), and hence `clampedPhaseObservable (R b) = phaseObservable b`. +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## Per-field ellipticity and boundedness of the fixed-phase observable -/ + +/-- The truncated glued field of a measurable field is genuinely `(1,Θ)`-elliptic +on the cube. -/ +theorem isEllipticFieldOn_glueField_of_field {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (hΘ : 1 ≤ Θ) {b : CoeffField d} + (hbmeas : ∀ i j : Fin d, Measurable fun x : Vec d => b x i j) : + IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) (glueField ℓ σ Θ b) := by + classical + have hcorrM : MeasurableSet (corridorSet ℓ σ) := measurableSet_corridorSet ℓ σ + have hUmeas : MeasurableSet (cubeSet (originCube d m)) := + measurableSet_cubeSet (originCube d m) + have hmeasField : + Measurable (fun x : Vec d => fun i j => + if x ∈ cubeSet (originCube d m) then (corridorField ℓ σ b) x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + have hrw : + (fun x : Vec d => + if x ∈ cubeSet (originCube d m) then (corridorField ℓ σ b) x i j else 0) + = fun x : Vec d => + if x ∈ cubeSet (originCube d m) then + (if x ∈ corridorSet ℓ σ then (1 : Mat d) i j else b x i j) else 0 := by + funext x + by_cases hxU : x ∈ cubeSet (originCube d m) + · simp only [hxU, if_true] + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc]; simp [hxc] + · rw [corridorField_apply_of_not_mem hxc]; simp [hxc] + · simp [hxU] + rw [hrw] + exact Measurable.ite hUmeas + (Measurable.ite hcorrM measurable_const (hbmeas i j)) measurable_const + exact isEllipticFieldOn_ellipticTruncate hUmeas hΘ hmeasField + +/-- The truncated glued field agrees a.e. on the cube with the corridor field. -/ +theorem glueField_ae_eq_corridorField {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (hΘ : 1 ≤ Θ) {b : CoeffField d} + (hbell : ∀ᵐ x ∂(MeasureTheory.volume : MeasureTheory.Measure (Vec d)), + IsEllipticMatrix 1 Θ (b x)) : + glueField ℓ σ Θ b + =ᵐ[MeasureTheory.volume.restrict (cubeSet (originCube d m))] + corridorField ℓ σ b := by + refine ellipticTruncate_ae_eq ?_ + filter_upwards [MeasureTheory.ae_restrict_of_ae hbell] with x hx + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc]; exact isEllipticMatrix_one hΘ + · rw [corridorField_apply_of_not_mem hxc]; exact hx + +/-- The fixed-phase observable equals the coarse quadratic of the truncated glued +field (they agree a.e., so the coarse matrices coincide). -/ +theorem phaseObservable_eq_blockVecDot_glueField {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (hΘ : 1 ≤ Θ) (P : BlockVec d) {b : CoeffField d} + (hbell : ∀ᵐ x ∂(MeasureTheory.volume : MeasureTheory.Measure (Vec d)), + IsEllipticMatrix 1 Θ (b x)) : + phaseObservable ℓ σ m P b + = blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (glueField ℓ σ Θ b)) P) := by + unfold phaseObservable + rw [coarseBlockMatrix_congr_of_ae_eq (glueField_ae_eq_corridorField hΘ hbell).symm] + +/-- **C1′ bounds for the fixed-phase observable.** For any measurable, a.e. +`(1,Θ)`-elliptic field, the observable lands in `[0, 2(Θ‖p‖² + ‖q‖²)]`. -/ +theorem phaseObservable_mem_Icc [NeZero d] {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (hΘ : 1 ≤ Θ) (P : BlockVec d) {b : CoeffField d} + (hbmeas : ∀ i j : Fin d, Measurable fun x : Vec d => b x i j) + (hbell : ∀ᵐ x ∂(MeasureTheory.volume : MeasureTheory.Measure (Vec d)), + IsEllipticMatrix 1 Θ (b x)) : + 0 ≤ phaseObservable ℓ σ m P b + ∧ phaseObservable ℓ σ m P b ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + rw [phaseObservable_eq_blockVecDot_glueField hΘ P hbell] + refine ⟨zero_le_blockVecDot_coarseBlockMatrix_cube + (isEllipticFieldOn_glueField_of_field hΘ hbmeas) P, + blockVecDot_coarseBlockMatrix_cube_le + (isEllipticFieldOn_glueField_of_field hΘ hbmeas) P⟩ + +/-! ## The clamped observable -/ + +/-- The bound constant `C = 2(Θ‖p‖² + ‖q‖²)` for the coarse quadratic. -/ +noncomputable def phaseBound (Θ : ℝ) (P : BlockVec d) : ℝ := + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) + +theorem phaseBound_nonneg {Θ : ℝ} (hΘ : 1 ≤ Θ) (P : BlockVec d) : + 0 ≤ phaseBound Θ P := by + have h1 : (0 : ℝ) ≤ Θ * vecNormSq P.1 := + mul_nonneg (by linarith) (vecNormSq_nonneg _) + have h2 : (0 : ℝ) ≤ vecNormSq P.2 := vecNormSq_nonneg _ + unfold phaseBound; linarith + +/-- The globally bounded product observable: `rawPhaseObservable` clamped to +`[0, phaseBound Θ P]`. -/ +noncomputable def clampedPhaseObservable (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → CoeffField d) : ℝ := + max 0 (min (phaseBound Θ P) (rawPhaseObservable ℓ σ Θ m P K y)) + +theorem measurable_clampedPhaseObservable {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (P : BlockVec d) (K : Finset (Fin d → ℤ)) : + Measurable + (fun y : {k // k ∈ K} → CoeffField d => clampedPhaseObservable ℓ σ Θ m P K y) := by + unfold clampedPhaseObservable + exact measurable_const.max (measurable_const.min (measurable_rawPhaseObservable P K)) + +/-- The clamped observable is globally bounded by `phaseBound Θ P`. -/ +theorem abs_clampedPhaseObservable_le {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hΘ : 1 ≤ Θ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) (y : {k // k ∈ K} → CoeffField d) : + |clampedPhaseObservable ℓ σ Θ m P K y| ≤ phaseBound Θ P := by + unfold clampedPhaseObservable + rw [abs_le] + refine ⟨le_trans (by linarith [phaseBound_nonneg hΘ P]) (le_max_left _ _), + max_le (phaseBound_nonneg hΘ P) (min_le_left _ _)⟩ + +/-- **Clamp is the identity on the diagonal.** For any measurable, a.e. +`(1,Θ)`-elliptic field `b`, the clamped observable on the restriction tuple `R b` +equals the fixed-phase observable of `b`. -/ +theorem clampedPhaseObservable_restrict_eq_of_field [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (b : CoeffField d) + (hbmeas : ∀ i j : Fin d, Measurable fun x : Vec d => b x i j) + (hbell : ∀ᵐ x ∂(MeasureTheory.volume : MeasureTheory.Measure (Vec d)), + IsEllipticMatrix 1 Θ (b x)) : + clampedPhaseObservable ℓ σ Θ m P K + (fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) b) + = phaseObservable ℓ σ m P b := by + unfold clampedPhaseObservable + rw [rawPhaseObservable_restrict_eq_of_field hℓ hΘ P K hK b hbmeas hbell] + obtain ⟨hlo, hhi⟩ := phaseObservable_mem_Icc hΘ P hbmeas hbell + rw [min_eq_right (by simpa [phaseBound] using hhi), max_eq_right hlo] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CorePatchEnergy.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CorePatchEnergy.lean new file mode 100644 index 0000000000..e95be3a9f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CorePatchEnergy.lean @@ -0,0 +1,293 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Resample +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuQuadratic +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.CoeffOperator + +/-! +# The per-core energy split and its pi-measurability + +For the Efron–Stein transfer of the fixed-phase observable we must exhibit a +genuinely **product-measurable** observable on the tuple space +`(↥K → CoeffField d)` that agrees `Π`-almost-everywhere with `F_σ ∘ corePatch`. + +The reconstruction map `corePatch` is *not* measurable into the ambient +σ-algebra (a raw local event over `cubeSet` can couple two coordinates through a +non-measurable set), so the coarse observable of the glued field cannot be +obtained by composing `corePatch` with a measurable coarse map. The way out is +that the coarse observable only sees the glued field through *fixed-competitor* +block-energy integrals, and such an integral **splits across the core +partition**: on the corridor the truncated glued field is the identity +(a constant, independent of the tuple), and on each core `coreBox ℓ σ k` it reads +only the single coordinate `y k`. + +This file builds that split. The energy is measured against the **elliptically +truncated** glued field + +`glueField ℓ σ Θ a := ellipticTruncate Θ (corridorField ℓ σ a)`, + +which is `(1, Θ)`-elliptic *everywhere* (needed later for the uniform global +bound and the AEE slice) and is a *pointwise* self-map of coefficient fields. + +Main definitions/results: +* `glueField`, its corridor value and pointwise congruence; +* `coreLocalEnergy W X` — the block-energy of the glued field over a bounded + set `W`, shown **ambient-measurable** via the `PointwiseLocalSigma W` generator trick + (this is the measurability heart, using only single-field local events); +* `phaseSplitEnergy` — the manifestly pi-measurable assembled observable + (corridor constant `+` a finite sum of single-coordinate core energies); +* `measurable_phaseSplitEnergy`; +* `blockEnergyAverage_glueField_corePatch_eq_phaseSplitEnergy` — the exact split + identity, valid whenever the glued field is `(1, Θ)`-elliptic on `U` + (which holds `Π`-a.e. after truncation; supplied by the caller). +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The elliptically truncated glued field -/ + +/-- The truncated corridor field fed to the coarse observable: the corridor +field `corridorField ℓ σ a`, then clamped by `ellipticTruncate Θ` so that every +value is `(1, Θ)`-elliptic. It is a *pointwise* self-map: its value at `x` +depends on `a` only through `a x`. -/ +noncomputable def glueField (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (a : CoeffField d) : CoeffField d := + ellipticTruncate Θ (corridorField ℓ σ a) + +/-- On the corridor the truncated glued field is the identity (the identity +matrix is `(1, Θ)`-elliptic for `Θ ≥ 1`). -/ +theorem glueField_apply_of_mem_corridor {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} (hΘ : 1 ≤ Θ) + {a : CoeffField d} {x : Vec d} (hx : x ∈ corridorSet ℓ σ) : + glueField ℓ σ Θ a x = (1 : Mat d) := by + have he : IsEllipticMatrix 1 Θ (corridorField ℓ σ a x) := by + rw [corridorField_apply_of_mem hx]; exact isEllipticMatrix_one hΘ + unfold glueField + rw [ellipticTruncate_of_elliptic he, corridorField_apply_of_mem hx] + +/-- Pointwise congruence: the value of the glued field at `x` depends only on +`a x`. -/ +theorem glueField_congr_apply {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {a b : CoeffField d} + {x : Vec d} (h : a x = b x) : + glueField ℓ σ Θ a x = glueField ℓ σ Θ b x := by + have hcorr : corridorField ℓ σ a x = corridorField ℓ σ b x := by + by_cases hx : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hx, corridorField_apply_of_mem hx] + · rw [corridorField_apply_of_not_mem hx, corridorField_apply_of_not_mem hx, h] + unfold glueField + by_cases he : IsEllipticMatrix 1 Θ (corridorField ℓ σ a x) + · rw [ellipticTruncate_of_elliptic he, + ellipticTruncate_of_elliptic (by rw [← hcorr]; exact he)] + exact hcorr + · rw [ellipticTruncate_of_not_elliptic he, + ellipticTruncate_of_not_elliptic (by rw [← hcorr]; exact he)] + +/-! ## The single-core block energy of the glued field -/ + +/-- The block energy of the truncated glued field of `a`, integrated over a set +`W`. When `W = coreBox ℓ σ k ∩ U` this is the per-core contribution to the +coarse energy; it depends on `a` only through `a` on `W`. -/ +noncomputable def coreLocalEnergy (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (W : Set (Vec d)) + (X : BlockState d) (a : CoeffField d) : ℝ := + ∫ x in W, blockEnergyDensity (glueField ℓ σ Θ a) X x ∂MeasureTheory.volume + +/-- `coreLocalEnergy` depends on the field only through its values on `W`. -/ +theorem coreLocalEnergy_congr {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {W : Set (Vec d)} + (hW : MeasurableSet W) {X : BlockState d} {a b : CoeffField d} + (hab : LocalAgreementOn W a b) : + coreLocalEnergy ℓ σ Θ W X a = coreLocalEnergy ℓ σ Θ W X b := by + unfold coreLocalEnergy + refine MeasureTheory.setIntegral_congr_fun hW (fun x hx => ?_) + have h1 : glueField ℓ σ Θ a x = glueField ℓ σ Θ b x := glueField_congr_apply (hab x hx) + simp only [blockEnergyDensity, blockCoeffField, h1] + +/-- **Measurability heart.** `coreLocalEnergy` is ambient-measurable in the +field: it is a single-field bounded-local observable, hence measurable into +`PointwiseLocalSigma W` (via the generator trick) and thus into the ambient σ-algebra. +No cross-coordinate coupling is involved — this uses only single-field local +events. -/ +theorem measurable_coreLocalEnergy {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {W : Set (Vec d)} + (hWmeas : MeasurableSet W) (hWbdd : Bornology.IsBounded W) (X : BlockState d) : + Measurable (fun a : CoeffField d => coreLocalEnergy ℓ σ Θ W X a) := by + have hloc : @Measurable (CoeffField d) ℝ (PointwiseLocalSigma W) (borel ℝ) + (fun a : CoeffField d => coreLocalEnergy ℓ σ Θ W X a) := by + intro t _ht + refine MeasurableSpace.measurableSet_generateFrom ?_ + intro a b hab + have hEq : coreLocalEnergy ℓ σ Θ W X a = coreLocalEnergy ℓ σ Θ W X b := + coreLocalEnergy_congr hWmeas hab + simp only [Set.mem_preimage, hEq] + exact hloc.mono (localSigma_le_coeffField_of_isBounded hWbdd) le_rfl + +/-! ## The corridor constant and the assembled pi-measurable observable -/ + +/-- The corridor contribution to the coarse energy: the block energy of the +identity field over `U ∩ corridorSet`. Independent of the tuple. -/ +noncomputable def corridorConst (ℓ : ℝ) (σ : Vec d) (U : Set (Vec d)) + (X : BlockState d) : ℝ := + ∫ x in U ∩ corridorSet ℓ σ, blockEnergyDensity (fun _ => (1 : Mat d)) X x + ∂MeasureTheory.volume + +/-- The assembled split observable on the tuple space: the corridor constant +plus a finite sum of single-coordinate core energies, normalized by `1 / vol U`. +It is manifestly product-measurable. -/ +noncomputable def phaseSplitEnergy (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (U : Set (Vec d)) + (X : BlockState d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → CoeffField d) : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * + (corridorConst ℓ σ U X + + ∑ k : {k // k ∈ K}, coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k.1 ∩ U) X (y k)) + +/-- **Product-measurability of the assembled observable.** Each core term is a +single-coordinate composition of the ambient-measurable `coreLocalEnergy`, so +the finite sum is measurable for the product σ-algebra `MeasurableSpace.pi`. -/ +theorem measurable_phaseSplitEnergy {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {U : Set (Vec d)} + (hUmeas : MeasurableSet U) (hUbdd : Bornology.IsBounded U) (X : BlockState d) + (K : Finset (Fin d → ℤ)) : + Measurable (fun y : {k // k ∈ K} → CoeffField d => phaseSplitEnergy ℓ σ Θ U X K y) := by + unfold phaseSplitEnergy + refine measurable_const.mul (measurable_const.add ?_) + refine Finset.measurable_sum _ (fun k _ => ?_) + have hWm : MeasurableSet (coreBox ℓ σ k.1 ∩ U) := + (measurableSet_coreBox ℓ σ k.1).inter hUmeas + have hWb : Bornology.IsBounded (coreBox ℓ σ k.1 ∩ U) := + hUbdd.subset Set.inter_subset_right + exact (measurable_coreLocalEnergy hWm hWb X).comp (measurable_pi_apply k) + +/-! ## The exact split identity -/ + +/-- The complement of the corridor, intersected with `U`, is the disjoint union +of the core boxes meeting `U`. -/ +theorem inter_compl_corridorSet_eq_iUnion_coreBox {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) + {U : Set (Vec d)} {K : Finset (Fin d → ℤ)} + (hK : ∀ k : Fin d → ℤ, (coreBox ℓ σ k ∩ U).Nonempty → k ∈ K) : + U \ corridorSet ℓ σ = ⋃ k : {k // k ∈ K}, (U ∩ coreBox ℓ σ k.1) := by + ext x + simp only [Set.mem_sdiff, Set.mem_iUnion, Set.mem_inter_iff] + constructor + · rintro ⟨hxU, hxnc⟩ + have hxc : x ∈ (corridorSet ℓ σ)ᶜ := hxnc + rw [compl_corridorSet_eq_iUnion_coreBox hℓ σ, Set.mem_iUnion] at hxc + obtain ⟨k, hxk⟩ := hxc + have hkK : k ∈ K := hK k ⟨x, hxk, hxU⟩ + exact ⟨⟨k, hkK⟩, hxU, hxk⟩ + · rintro ⟨k, hxU, hxk⟩ + refine ⟨hxU, ?_⟩ + have hxc : x ∈ (corridorSet ℓ σ)ᶜ := by + rw [compl_corridorSet_eq_iUnion_coreBox hℓ σ, Set.mem_iUnion] + exact ⟨k.1, hxk⟩ + exact hxc + +/-- **Exact energy split.** Whenever the truncated glued field of +`corePatch ℓ σ K y` is `(1, Θ)`-elliptic on `U` (so its coarse energy integral +converges), the block-energy average splits as the corridor constant plus the +per-core single-coordinate energies — i.e. it equals `phaseSplitEnergy`. -/ +theorem blockEnergyAverage_glueField_corePatch_eq_phaseSplitEnergy + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {U : Set (Vec d)} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) + (hUmeas : MeasurableSet U) [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (X : BlockState d) (hXbl : MemBlockL2 U X.eval) + (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, (coreBox ℓ σ k ∩ U).Nonempty → k ∈ K) + (y : {k // k ∈ K} → CoeffField d) + (hEll : IsEllipticFieldOn 1 Θ U (glueField ℓ σ Θ (corePatch ℓ σ K y))) : + blockEnergyAverage U (glueField ℓ σ Θ (corePatch ℓ σ K y)) X + = phaseSplitEnergy ℓ σ Θ U X K y := by + classical + have hcorrM : MeasurableSet (corridorSet ℓ σ) := measurableSet_corridorSet ℓ σ + -- integrability of the block-energy density + have hfint : MeasureTheory.IntegrableOn + (blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X) U := by + have hpair := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (a := glueField ℓ σ Θ (corePatch ℓ σ K y)) hXbl hXbl hEll + have hEq : blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X + = fun x => (1 / 2 : ℝ) * + blockPairingIntegrand (glueField ℓ σ Θ (corePatch ℓ σ K y)) X X x := by + funext x; rfl + rw [hEq] + exact hpair.const_mul (1 / 2) + -- split `∫_U = ∫_{U∩corr} + ∫_{U\corr}` + have hsplit1 : + ∫ x in U, blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume + = (∫ x in U ∩ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume) + + ∫ x in U \ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume := + (MeasureTheory.integral_inter_add_sdiff hcorrM hfint).symm + -- corridor piece equals the corridor constant + have hcorrEq : + (∫ x in U ∩ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume) + = corridorConst ℓ σ U X := by + refine MeasureTheory.setIntegral_congr_fun (hUmeas.inter hcorrM) (fun x hx => ?_) + have hxc : x ∈ corridorSet ℓ σ := hx.2 + have hval : glueField ℓ σ Θ (corePatch ℓ σ K y) x = (1 : Mat d) := + glueField_apply_of_mem_corridor hΘ hxc + simp only [blockEnergyDensity, blockCoeffField, hval] + -- core pieces: rewrite `U \ corr` as the disjoint biUnion over the cores of `K` + have hUdiff : U \ corridorSet ℓ σ = ⋃ k : {k // k ∈ K}, (U ∩ coreBox ℓ σ k.1) := + inter_compl_corridorSet_eq_iUnion_coreBox hℓ σ hK + have hmeasW : ∀ k : {k // k ∈ K}, MeasurableSet (U ∩ coreBox ℓ σ k.1) := + fun k => hUmeas.inter (measurableSet_coreBox ℓ σ k.1) + have hdisjW : Set.Pairwise (↑(Finset.univ : Finset {k // k ∈ K})) + (Function.onFun Disjoint fun k : {k // k ∈ K} => U ∩ coreBox ℓ σ k.1) := by + intro k _ k' _ hkk' + have hne : k.1 ≠ k'.1 := fun h => hkk' (Subtype.ext h) + exact (Disjoint.inter_left' _ (Disjoint.inter_right' _ + (disjoint_coreBox hℓ.le σ hne))) + have hintW : ∀ k : {k // k ∈ K}, MeasureTheory.IntegrableOn + (blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X) (U ∩ coreBox ℓ σ k.1) := + fun k => hfint.mono_set Set.inter_subset_left + have hset : (⋃ k : {k // k ∈ K}, U ∩ coreBox ℓ σ k.1) + = ⋃ k ∈ (Finset.univ : Finset {k // k ∈ K}), U ∩ coreBox ℓ σ k.1 := by + simp only [Finset.mem_univ, Set.iUnion_true] + have hbiUnion : + (∫ x in U \ corridorSet ℓ σ, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume) + = ∑ k : {k // k ∈ K}, + ∫ x in U ∩ coreBox ℓ σ k.1, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume := by + rw [hUdiff, hset] + exact MeasureTheory.integral_biUnion_finset (Finset.univ) + (fun k _ => hmeasW k) hdisjW (fun k _ => hintW k) + -- each core piece equals the single-coordinate core energy of `y k` + have hcoreEq : ∀ k : {k // k ∈ K}, + (∫ x in U ∩ coreBox ℓ σ k.1, + blockEnergyDensity (glueField ℓ σ Θ (corePatch ℓ σ K y)) X x + ∂MeasureTheory.volume) + = coreLocalEnergy ℓ σ Θ (coreBox ℓ σ k.1 ∩ U) X (y k) := by + intro k + have hWeq : U ∩ coreBox ℓ σ k.1 = coreBox ℓ σ k.1 ∩ U := Set.inter_comm _ _ + rw [hWeq] + unfold coreLocalEnergy + refine MeasureTheory.setIntegral_congr_fun + ((measurableSet_coreBox ℓ σ k.1).inter hUmeas) (fun x hx => ?_) + have hxk : x ∈ coreBox ℓ σ k.1 := hx.1 + have hval : corePatch ℓ σ K y x = y k x := + corePatch_apply_of_mem hℓ.le σ y k.2 hxk + have h1 : glueField ℓ σ Θ (corePatch ℓ σ K y) x = glueField ℓ σ Θ (y k) x := + glueField_congr_apply hval + simp only [blockEnergyDensity, blockCoeffField, h1] + -- assemble + unfold blockEnergyAverage volumeAverage phaseSplitEnergy + rw [hsplit1, hcorrEq, hbiUnion] + rw [Finset.sum_congr rfl (fun k _ => hcoreEq k)] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CutoffData.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CutoffData.lean new file mode 100644 index 0000000000..1cb9ee2ed8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/CutoffData.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Resample + +/-! +# The per-core cutoff datum + +For the per-core energy bound (`local_block_energy`, T2) behind the fixed-phase +variance (Proposition 4.3) we need, for each core `coreBox ℓ σ k`, a smooth +cutoff `η` that is `1` on the core, supported in the `ℓ`-enlargement, with the +two integral estimates of `e.corridor.cutoff`: + +* support-volume bound `(vol (supp η ∩ U)).toReal ≤ (3ℓ)^d`; +* squared-gradient bound `∫_U Σᵢ (∂ᵢ η)² ≤ d · (16/ℓ)² · (3ℓ)^d`. + +The cutoff is the `boxCutoff` for the closed core box (which is exactly +`Set.Icc (coreLo ℓ σ k) (coreHi ℓ σ k)`) with margin `ℓ`. The gradient integral +is finite because the gradient is supported in the (closed, bounded) enlargement +`Set.Icc (coreLo − ℓ) (coreHi + ℓ)`: off that enlargement `η` vanishes on an open +set, so its Fréchet derivative is zero there. +-/ + +@[expose] public section + +open Homogenization MeasureTheory +open scoped BigOperators + +namespace Homogenization + +variable {d : ℕ} {ℓ : ℝ} + +/-! ## The core box as a closed axis box -/ + +/-- The lower corner of the closed core box. -/ +def coreLo (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Vec d := + fun i => σ i + (k i : ℝ) * ℓ + 1 + +/-- The upper corner of the closed core box. -/ +def coreHi (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Vec d := + fun i => σ i + ((k i : ℝ) + 1) * ℓ - 1 + +theorem coreBox_eq_Icc (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + coreBox ℓ σ k = Set.Icc (coreLo ℓ σ k) (coreHi ℓ σ k) := by + rw [coreBox, ← Set.pi_univ_Icc]; rfl + +/-- Side length `hi − lo = ℓ − 2` in every coordinate. -/ +theorem coreHi_sub_coreLo (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (i : Fin d) : + coreHi ℓ σ k i - coreLo ℓ σ k i = ℓ - 2 := by + simp only [coreHi, coreLo]; ring + +theorem coreLo_le_coreHi (hℓ : (2 : ℝ) ≤ ℓ) (σ : Vec d) (k : Fin d → ℤ) : + coreLo ℓ σ k ≤ coreHi ℓ σ k := by + intro i + have := coreHi_sub_coreLo ℓ σ k i + linarith + +/-! ## The per-core cutoff -/ + +/-- The per-core smooth cutoff: `boxCutoff` of the closed core box with +margin `ℓ`. -/ +noncomputable def coreCutoff (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Vec d → ℝ := + boxCutoff (coreLo ℓ σ k) (coreHi ℓ σ k) ℓ + +theorem coreCutoff_contDiff (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + ContDiff ℝ (⊤ : ℕ∞) (coreCutoff ℓ σ k) := boxCutoff_contDiff + +theorem coreCutoff_mem_Icc (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (x : Vec d) : + coreCutoff ℓ σ k x ∈ Set.Icc (0 : ℝ) 1 := + Set.mem_Icc.2 ⟨boxCutoff_nonneg x, boxCutoff_le_one x⟩ + +theorem coreCutoff_deriv_bound (hℓ : 0 < ℓ) (σ : Vec d) (k : Fin d → ℤ) + (x : Vec d) (i : Fin d) : + |fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)| ≤ 16 / ℓ := + boxCutoff_deriv_bound hℓ x i + +/-- On the core box the cutoff is identically `1`. -/ +theorem coreCutoff_eq_one_of_mem_coreBox (hℓ : 0 < ℓ) (σ : Vec d) (k : Fin d → ℤ) + {x : Vec d} (hx : x ∈ coreBox ℓ σ k) : coreCutoff ℓ σ k x = 1 := by + rw [coreBox_eq_Icc] at hx + exact boxCutoff_eq_one hℓ hx + +/-! ## The closed enlargement and the support of the gradient -/ + +/-- The closed `ℓ`-enlargement of the core box. -/ +def coreEnlarge (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Set (Vec d) := + Set.Icc (fun i => coreLo ℓ σ k i - ℓ) (fun i => coreHi ℓ σ k i + ℓ) + +theorem measurableSet_coreEnlarge (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + MeasurableSet (coreEnlarge ℓ σ k) := measurableSet_Icc + +/-- Off the enlargement, `η` vanishes on an open set, so its Fréchet derivative +is zero. -/ +theorem coreCutoff_fderiv_eq_zero_of_notMem (hℓ : 0 < ℓ) (σ : Vec d) (k : Fin d → ℤ) + {x : Vec d} (hx : x ∉ coreEnlarge ℓ σ k) : + fderiv ℝ (coreCutoff ℓ σ k) x = 0 := by + have hopen : IsOpen (coreEnlarge ℓ σ k)ᶜ := (isClosed_Icc).isOpen_compl + have hmem : (coreEnlarge ℓ σ k)ᶜ ∈ nhds x := hopen.mem_nhds hx + have heq : coreCutoff ℓ σ k =ᶠ[nhds x] fun _ => (0 : ℝ) := by + filter_upwards [hmem] with y hy + exact boxCutoff_eq_zero hℓ hy + rw [heq.fderiv_eq, fderiv_const_apply] + +/-- The squared gradient vanishes off the enlargement. -/ +theorem coreCutoff_sqGrad_eq_zero_of_notMem (hℓ : 0 < ℓ) (σ : Vec d) (k : Fin d → ℤ) + {x : Vec d} (hx : x ∉ coreEnlarge ℓ σ k) : + (∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2) = 0 := by + rw [coreCutoff_fderiv_eq_zero_of_notMem hℓ σ k hx] + simp + +/-! ## The two integral estimates -/ + +/-- Volume of the closed enlargement, as a real number: `(3ℓ − 2)^d`. -/ +theorem volume_coreEnlarge_toReal (hℓ : 2 ≤ ℓ) (σ : Vec d) (k : Fin d → ℤ) : + (volume (coreEnlarge ℓ σ k)).toReal = (3 * ℓ - 2) ^ d := by + have hpos : (0 : ℝ) ≤ 3 * ℓ - 2 := by linarith + rw [coreEnlarge, Real.volume_Icc_pi] + rw [ENNReal.toReal_prod] + have hterm : ∀ i : Fin d, + (ENNReal.ofReal ((coreHi ℓ σ k i + ℓ) - (coreLo ℓ σ k i - ℓ))).toReal = 3 * ℓ - 2 := by + intro i + have := coreHi_sub_coreLo ℓ σ k i + rw [ENNReal.toReal_ofReal (by linarith)] + linarith + rw [Finset.prod_congr rfl (fun i _ => hterm i)] + rw [Finset.prod_const, Finset.card_univ, Fintype.card_fin] + +/-- **Support-volume bound.** `(vol (supp η ∩ U)).toReal ≤ (3ℓ)^d` for any set `U`. -/ +theorem coreCutoff_support_volume_le (hℓ : 4 ≤ ℓ) (σ : Vec d) (k : Fin d → ℤ) + (U : Set (Vec d)) : + (volume (Function.support (coreCutoff ℓ σ k) ∩ U)).toReal ≤ (3 * ℓ) ^ d := by + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hle : coreLo ℓ σ k ≤ coreHi ℓ σ k := coreLo_le_coreHi (by linarith) σ k + have hsub : Function.support (coreCutoff ℓ σ k) ∩ U ⊆ coreEnlarge ℓ σ k := by + intro x hx + by_contra hxn + have : coreCutoff ℓ σ k x = 0 := boxCutoff_eq_zero hℓ0 hxn + exact hx.1 this + have hmono : volume (Function.support (coreCutoff ℓ σ k) ∩ U) ≤ volume (coreEnlarge ℓ σ k) := + measure_mono hsub + have hfin : volume (coreEnlarge ℓ σ k) ≠ (⊤ : ENNReal) := by + rw [coreEnlarge, Real.volume_Icc_pi] + exact ENNReal.prod_ne_top (fun i _ => ENNReal.ofReal_ne_top) + calc (volume (Function.support (coreCutoff ℓ σ k) ∩ U)).toReal + ≤ (volume (coreEnlarge ℓ σ k)).toReal := ENNReal.toReal_mono hfin hmono + _ = (3 * ℓ - 2) ^ d := volume_coreEnlarge_toReal (by linarith) σ k + _ ≤ (3 * ℓ) ^ d := by + gcongr + · linarith + · linarith + +/-- The squared gradient, as a function. -/ +noncomputable def coreSqGrad (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Vec d → ℝ := + fun x => ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2 + +theorem coreSqGrad_nonneg (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (x : Vec d) : + 0 ≤ coreSqGrad ℓ σ k x := + Finset.sum_nonneg (fun _ _ => sq_nonneg _) + +theorem continuous_coreSqGrad (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + Continuous (coreSqGrad ℓ σ k) := by + have hf : Continuous (fderiv ℝ (coreCutoff ℓ σ k)) := + (coreCutoff_contDiff ℓ σ k).continuous_fderiv (by simp) + refine continuous_finsetSum _ (fun i _ => ?_) + exact (hf.clm_apply continuous_const).pow 2 + +/-- The squared gradient is supported in the closed enlargement, hence globally +integrable. -/ +theorem integrable_coreSqGrad (hℓ : 4 ≤ ℓ) (σ : Vec d) (k : Fin d → ℤ) : + Integrable (coreSqGrad ℓ σ k) := by + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hEmeas : MeasurableSet (coreEnlarge ℓ σ k) := measurableSet_coreEnlarge ℓ σ k + have hIntOn : IntegrableOn (coreSqGrad ℓ σ k) (coreEnlarge ℓ σ k) := + (continuous_coreSqGrad ℓ σ k).continuousOn.integrableOn_compact + (isCompact_Icc (a := fun i => coreLo ℓ σ k i - ℓ) (b := fun i => coreHi ℓ σ k i + ℓ)) + have hg_eq : coreSqGrad ℓ σ k = (coreEnlarge ℓ σ k).indicator (coreSqGrad ℓ σ k) := by + funext x + by_cases hx : x ∈ coreEnlarge ℓ σ k + · rw [Set.indicator_of_mem hx] + · rw [Set.indicator_of_notMem hx] + exact coreCutoff_sqGrad_eq_zero_of_notMem hℓ0 σ k hx + rw [hg_eq] + exact (integrable_indicator_iff hEmeas).2 hIntOn + +/-- **Squared-gradient integral bound.** `∫_U Σᵢ (∂ᵢ η)² ≤ d · (16/ℓ)² · (3ℓ)^d`. -/ +theorem coreCutoff_sqGrad_integral_le (hℓ : 4 ≤ ℓ) (σ : Vec d) (k : Fin d → ℤ) + (U : Set (Vec d)) : + (∫ x in U, ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2) + ≤ (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d := by + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hEmeas : MeasurableSet (coreEnlarge ℓ σ k) := measurableSet_coreEnlarge ℓ σ k + have hInt : Integrable (coreSqGrad ℓ σ k) := integrable_coreSqGrad hℓ σ k + have hIntOn : IntegrableOn (coreSqGrad ℓ σ k) (coreEnlarge ℓ σ k) := + hInt.integrableOn + set C : ℝ := (d : ℝ) * (16 / ℓ) ^ 2 with hCdef + have hC0 : 0 ≤ C := by rw [hCdef]; positivity + -- restrict ≤ global + have h1 : (∫ x in U, coreSqGrad ℓ σ k x) ≤ ∫ x, coreSqGrad ℓ σ k x := + setIntegral_le_integral hInt (ae_of_all _ (coreSqGrad_nonneg ℓ σ k)) + -- global = integral over the enlargement + have hg_eq : coreSqGrad ℓ σ k = (coreEnlarge ℓ σ k).indicator (coreSqGrad ℓ σ k) := by + funext x + by_cases hx : x ∈ coreEnlarge ℓ σ k + · rw [Set.indicator_of_mem hx] + · rw [Set.indicator_of_notMem hx] + exact coreCutoff_sqGrad_eq_zero_of_notMem hℓ0 σ k hx + have h2 : (∫ x, coreSqGrad ℓ σ k x) = ∫ x in coreEnlarge ℓ σ k, coreSqGrad ℓ σ k x := by + conv_lhs => rw [hg_eq] + exact integral_indicator hEmeas + have hfin : volume (coreEnlarge ℓ σ k) ≠ (⊤ : ENNReal) := by + simp only [coreEnlarge, Real.volume_Icc_pi] + exact ENNReal.prod_ne_top (fun i _ => ENNReal.ofReal_ne_top) + -- pointwise bound by `C` on the enlargement + have h3 : (∫ x in coreEnlarge ℓ σ k, coreSqGrad ℓ σ k x) + ≤ ∫ _x in coreEnlarge ℓ σ k, C := by + refine setIntegral_mono_on hIntOn (integrableOn_const hfin) hEmeas + (fun x _ => ?_) + exact boxCutoff_sq_grad_bound hℓ0 x + have h4 : (∫ _x in coreEnlarge ℓ σ k, C) = (volume (coreEnlarge ℓ σ k)).toReal * C := by + rw [setIntegral_const, smul_eq_mul]; rfl + have h5 : (volume (coreEnlarge ℓ σ k)).toReal = (3 * ℓ - 2) ^ d := + volume_coreEnlarge_toReal (by linarith) σ k + have h6 : (3 * ℓ - 2) ^ d * C ≤ (3 * ℓ) ^ d * C := by + apply mul_le_mul_of_nonneg_right _ hC0 + gcongr + · linarith + · linarith + calc (∫ x in U, ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2) + = ∫ x in U, coreSqGrad ℓ σ k x := rfl + _ ≤ ∫ x, coreSqGrad ℓ σ k x := h1 + _ = ∫ x in coreEnlarge ℓ σ k, coreSqGrad ℓ σ k x := h2 + _ ≤ ∫ _x in coreEnlarge ℓ σ k, C := h3 + _ = (volume (coreEnlarge ℓ σ k)).toReal * C := h4 + _ = (3 * ℓ - 2) ^ d * C := by rw [h5] + _ ≤ (3 * ℓ) ^ d * C := h6 + _ = C * (3 * ℓ) ^ d := by ring + _ = (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d := by rw [hCdef] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinAE.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinAE.lean new file mode 100644 index 0000000000..a4212ece8f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinAE.lean @@ -0,0 +1,240 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Transfer + +/-! +# The a.e.-measurable Efron–Stein transfer wrapper + +The landed `efronStein_transfer_restriction` requires a *genuinely measurable* bounded +observable `G`. The fixed-phase observable of Proposition 4.3, being a coarse +quadratic, is only *a.e.-strongly-measurable* under the resampled product law +`Π := Measure.pi (fun i => P.map (restrictReg (C i) (hC i)))`. This file relaxes +the measurability hypothesis to `AEStronglyMeasurable G Π`, keeping the identical +Efron–Stein conclusion. + +The plumbing: +* clamp a measurable modification `Gt` of `G` (via `hG.mk`) to `[-M, M]`, so it is + measurable, everywhere bounded by `M`, and `Gt =ᵐ[Π] G`; +* run the landed `efronStein_transfer_restriction` on `Gt`; +* transfer the variance (LHS) and each resampling energy (RHS) back to `G` using + the pushforward identities `Measure.map R P = Π`, + `Measure.map (·.1 ↦ R) (P ⊗ P) = Π`, and the update-resample identity + `map_update_prod_pi`. + +The single genuinely new measure-theoretic input is `map_update_prod_pi`: updating +one coordinate of `Measure.pi μ` by an independent `μ i`-draw preserves `Measure.pi μ`. +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory ProbabilityTheory BigOperators +open MeasureTheory ProbabilityTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The update-resample pushforward -/ + +/-- Updating coordinate `i` of a product measure `Measure.pi μ` by an independent +`μ i`-distributed draw preserves the product measure. -/ +theorem map_update_prod_pi {ι : Type*} [Fintype ι] [DecidableEq ι] + {α : ι → Type*} [∀ i, MeasurableSpace (α i)] (μ : ∀ i, Measure (α i)) + [∀ i, IsProbabilityMeasure (μ i)] (i : ι) : + Measure.map (fun p : (∀ j, α j) × α i => Function.update p.1 i p.2) + ((Measure.pi μ).prod (μ i)) = Measure.pi μ := by + classical + refine (Measure.pi_eq (fun s hs => ?_)).symm + rw [Measure.map_apply (measurable_update' (a := i)) (MeasurableSet.univ_pi hs)] + have hpre : + (fun p : (∀ j, α j) × α i => Function.update p.1 i p.2) ⁻¹' (Set.univ.pi s) + = (Set.univ.pi (Function.update s i Set.univ)) ×ˢ (s i) := by + ext p + obtain ⟨x, y⟩ := p + simp only [Set.mem_preimage, Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_prod] + constructor + · intro h + refine ⟨fun j => ?_, ?_⟩ + · rcases eq_or_ne j i with rfl | hj + · simp only [Function.update_self]; exact Set.mem_univ _ + · simp only [Function.update_of_ne hj]; have hj2 := h j + simpa only [Function.update_of_ne hj] using hj2 + · have hi2 := h i; simpa only [Function.update_self] using hi2 + · rintro ⟨hx, hy⟩ j + rcases eq_or_ne j i with rfl | hj + · simpa only [Function.update_self] using hy + · simp only [Function.update_of_ne hj]; have hxj := hx j + simpa only [Function.update_of_ne hj] using hxj + rw [hpre, Measure.prod_prod, Measure.pi_pi] + have h1 : (fun j => μ j (Function.update s i Set.univ j)) + = Function.update (fun j => μ j (s j)) i 1 := by + funext j + rcases eq_or_ne j i with rfl | hj + · simp [Function.update_self, measure_univ] + · simp [Function.update_of_ne hj] + rw [h1, Finset.prod_update_of_mem (Finset.mem_univ i), one_mul, + Finset.sdiff_singleton_eq_erase, Finset.prod_erase_mul _ _ (Finset.mem_univ i)] + +/-! ## The a.e.-measurable Efron–Stein transfer -/ + +/-- **Restriction Efron–Stein transfer (a.e. variant).** Identical to +`efronStein_transfer_restriction`, but the observable `G` need only be +`AEStronglyMeasurable` under the +resampled product law `Π := Measure.pi (fun i => P.map (restrictReg (C i) (hC i)))`, +not genuinely measurable. This is the form consumed by the fixed-phase variance +step, whose coarse observable is only a.e.-measurable under a `RestrictionLawCarrier`. -/ +theorem efronStein_transfer_ae_restriction + {ι : Type*} [Fintype ι] [DecidableEq ι] + {C : ι → Set (Vec d)} (hC : ∀ i, MeasurableSet (C i)) + (hsep : Pairwise fun i j => AreUnitSeparated (C i) (C j)) + {P : Measure (RegCoeffField d)} [IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependentR P) + {G : (ι → RegCoeffField d) → ℝ} + (hG : AEStronglyMeasurable G (Measure.pi (fun i => P.map (restrictReg (C i) (hC i))))) + {M : ℝ} (hMG : ∀ x, |G x| ≤ M) + (R : RegCoeffField d → (ι → RegCoeffField d)) + (hRdef : R = fun a i => restrictReg (C i) (hC i) a) : + Var[G ∘ R; P] + ≤ (1 / 2) * ∑ i, ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) - G (R a)) ^ 2 ∂P ∂P := by + classical + set μ : ι → Measure (RegCoeffField d) := fun i => P.map (restrictReg (C i) (hC i)) with hμ + have hμprob : ∀ i, IsProbabilityMeasure (μ i) := fun i => + (Measure.isProbabilityMeasure_map_iff + (measurable_restrictReg (C i) (hC i)).aemeasurable).mpr inferInstance + have hRmeas : Measurable R := by + rw [hRdef]; exact measurable_pi_iff.2 (fun i => measurable_restrictReg (C i) (hC i)) + -- Map identity `Measure.map R P = Measure.pi μ` (re-derived via the carrier bridge). + have hmap : Measure.map R P = Measure.pi μ := by + set X : ι → RegCoeffField d → RegCoeffField d := + fun i => restrictObservable (C i) (hC i) with hX + have hf : ∀ i, AEMeasurable (fun a => X i a) P := fun i => + (measurable_restrictObservable (C i) (hC i)).aemeasurable + have hindep : ProbabilityTheory.iIndepFun X P := + Book.Ch04.iIndepFun_of_restrictionUnitRangeDependentLaw_of_pairwise_separated + (P := P) (U := C) (X := X) hC hP + (fun i => isRestrictionLocalRandomVariable_restrictObservable (C i) (hC i)) hsep + have h := (ProbabilityTheory.iIndepFun_iff_map_fun_eq_pi_map hf).1 hindep + rw [hRdef]; exact h + -- Clamp a measurable modification of `G` to `[-M, M]`. + have hM0 : (0 : ℝ) ≤ M := le_trans (abs_nonneg _) (hMG (fun _ => (0 : RegCoeffField d))) + have hG'meas : Measurable (hG.mk G) := hG.stronglyMeasurable_mk.measurable + have hGG' : G =ᵐ[Measure.pi μ] hG.mk G := hG.ae_eq_mk + set Gt : (ι → RegCoeffField d) → ℝ := fun x => max (-M) (min M (hG.mk G x)) with hGtdef + have hGtmeas : Measurable Gt := + measurable_const.max (measurable_const.min hG'meas) + have hGtbound : ∀ x, |Gt x| ≤ M := by + intro x + rw [hGtdef] + refine abs_le.2 ⟨le_max_left _ _, max_le (by linarith) (min_le_left _ _)⟩ + have hGtG : Gt =ᵐ[Measure.pi μ] G := by + filter_upwards [hGG'] with x hx + rw [hGtdef] + dsimp only + rw [← hx, min_eq_right (abs_le.1 (hMG x)).2, max_eq_right (abs_le.1 (hMG x)).1] + -- Run the landed transfer on the measurable, bounded `Gt`. + have key := efronStein_transfer_restriction hC hsep hP hGtmeas hGtbound R hRdef + -- LHS: `Var[G ∘ R] = Var[Gt ∘ R]`. + have hLHS : Var[G ∘ R; P] = Var[Gt ∘ R; P] := by + refine variance_congr ?_ + have hae : ∀ᵐ b ∂(Measure.map R P), G b = Gt b := by rw [hmap]; exact hGtG.symm + exact ae_of_ae_map hRmeas.aemeasurable hae + -- RHS: each resampling energy transfers back to `G`. + have hRHS : ∀ i, + (∫ a, ∫ a', + (Gt (Function.update (R a) i (restrictReg (C i) (hC i) a')) - Gt (R a)) ^ 2 ∂P ∂P) + = ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) - G (R a)) ^ 2 ∂P ∂P := by + intro i + -- Pushforward of the resampling map `p ↦ update (R p.1) i (restrict p.2)`. + have hi_meas : + Measurable (fun p : RegCoeffField d × RegCoeffField d => + Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) := + (measurable_update' (a := i)).comp + ((hRmeas.comp measurable_fst).prodMk + ((measurable_restrictReg (C i) (hC i)).comp measurable_snd)) + have hpairmeas : Measurable (Prod.map R (restrictReg (C i) (hC i))) := + hRmeas.prodMap (measurable_restrictReg (C i) (hC i)) + have hmap_hi : + Measure.map (fun p : RegCoeffField d × RegCoeffField d => + Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) (P.prod P) + = Measure.pi μ := by + have hpair : + Measure.map (Prod.map R (restrictReg (C i) (hC i))) (P.prod P) + = (Measure.pi μ).prod (μ i) := by + rw [← Measure.map_prod_map P P hRmeas (measurable_restrictReg (C i) (hC i)), hmap] + have hcomp : + (fun p : RegCoeffField d × RegCoeffField d => + Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + = (fun q : (ι → RegCoeffField d) × RegCoeffField d => Function.update q.1 i q.2) + ∘ (Prod.map R (restrictReg (C i) (hC i))) := rfl + rw [hcomp, ← Measure.map_map (measurable_update' (a := i)) hpairmeas, + hpair, map_update_prod_pi μ i] + -- Pushforward of the outer map `p ↦ R p.1`. + have hfst : Measure.map (R ∘ Prod.fst) (P.prod P) = Measure.pi μ := by + rw [← Measure.map_map hRmeas measurable_fst, Measure.map_fst_prod, measure_univ, + one_smul, hmap] + -- a.e. equalities of the two evaluation points + have hAe_hi : ∀ᵐ p ∂(P.prod P), + Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + = G (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) := + ae_of_ae_map hi_meas.aemeasurable (by rw [hmap_hi]; exact hGtG) + have hAe_R : ∀ᵐ p ∂(P.prod P), Gt (R p.1) = G (R p.1) := + ae_of_ae_map ((hRmeas.comp measurable_fst).aemeasurable) (by rw [hfst]; exact hGtG) + -- integrand a.e. equal on the product + have hInteg : + (fun p : RegCoeffField d × RegCoeffField d => + (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - Gt (R p.1)) ^ 2) + =ᵐ[P.prod P] + (fun p : RegCoeffField d × RegCoeffField d => + (G (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - G (R p.1)) ^ 2) := by + filter_upwards [hAe_hi, hAe_R] with p h1 h2 + rw [h1, h2] + -- integrability of the (bounded, measurable) truncated integrand + have hFt_meas : + Measurable (fun p : RegCoeffField d × RegCoeffField d => + (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - Gt (R p.1)) ^ 2) := + ((hGtmeas.comp hi_meas).sub (hGtmeas.comp (hRmeas.comp measurable_fst))).pow_const 2 + have hFt_int : + Integrable (fun p : RegCoeffField d × RegCoeffField d => + (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - Gt (R p.1)) ^ 2) + (P.prod P) := by + refine (integrable_const ((2 * M) ^ 2)).mono' hFt_meas.aestronglyMeasurable ?_ + filter_upwards with p + rw [Real.norm_eq_abs, abs_of_nonneg (sq_nonneg _)] + have hb : |Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - Gt (R p.1)| + ≤ 2 * M := by + have h := abs_add_le (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2))) + (-(Gt (R p.1))) + rw [← sub_eq_add_neg, abs_neg] at h + have := h.trans (add_le_add (hGtbound _) (hGtbound _)); linarith + nlinarith [hb, abs_nonneg (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + - Gt (R p.1)), + sq_abs (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - Gt (R p.1))] + have hFg_int : + Integrable (fun p : RegCoeffField d × RegCoeffField d => + (G (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) - G (R p.1)) ^ 2) + (P.prod P) := hFt_int.congr hInteg + calc (∫ a, ∫ a', + (Gt (Function.update (R a) i (restrictReg (C i) (hC i) a')) - Gt (R a)) ^ 2 ∂P ∂P) + = ∫ p, (Gt (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + - Gt (R p.1)) ^ 2 ∂(P.prod P) := (integral_prod _ hFt_int).symm + _ = ∫ p, (G (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + - G (R p.1)) ^ 2 ∂(P.prod P) := integral_congr_ae hInteg + _ = ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) - G (R a)) ^ 2 ∂P ∂P := + integral_prod _ hFg_int + -- Assemble. + rw [hLHS] + refine le_trans key (le_of_eq ?_) + congr 1 + exact Finset.sum_congr rfl (fun i _ => hRHS i) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinPhase.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinPhase.lean new file mode 100644 index 0000000000..329d46ee5e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/EfronSteinPhase.lean @@ -0,0 +1,288 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.ClampedObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CarrierObservable +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinAE + +/-! +# The Efron–Stein bound for the fixed-phase observable + +The capstone. Combining the product-measurable clamped observable +(`ClampedObservable`) with the landed a.e.-measurable Efron–Stein transfer +(`efronStein_transfer_ae_restriction`), we obtain the Efron–Stein variance bound for the +fixed-phase observable `F_σ` in the **two-field surgery** (`patchCore`) form that +the fixed-phase variance assembly consumes. + +The two evaluation-point identities are *exact* tuple identities (no a.e. +reasoning): with `patchCore` the two-field core surgery, +`Function.update (R a) k (a'|_{coreBox k}) = R (patchCore k a a')`, so the +resampled observable is literally the diagonal observable of the surgered field. +All a.e. reasoning is confined to the single truncation-congruence layer: +`clampedPhaseObservable (R b) = F_σ(b)` for measurable, a.e.-elliptic `b` +(`clampedPhaseObservable_restrict_eq_of_field`), instantiated at `b = a` and at +`b = patchCore k a a'` under `ThetaEllipticLaw` for both draws. +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory ProbabilityTheory BigOperators +open MeasureTheory ProbabilityTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The two-field core surgery -/ + +/-- The two-field core surgery: `a'` on the core `coreBox ℓ σ j`, `a` off it. -/ +noncomputable def patchCore (ℓ : ℝ) (σ : Vec d) (j : Fin d → ℤ) (a a' : CoeffField d) : + CoeffField d := by + classical + exact fun x => if x ∈ coreBox ℓ σ j then a' x else a x + +@[simp] theorem patchCore_apply_of_mem {ℓ : ℝ} {σ : Vec d} {j : Fin d → ℤ} + {a a' : CoeffField d} {x : Vec d} (hx : x ∈ coreBox ℓ σ j) : + patchCore ℓ σ j a a' x = a' x := by simp [patchCore, hx] + +@[simp] theorem patchCore_apply_of_not_mem {ℓ : ℝ} {σ : Vec d} {j : Fin d → ℤ} + {a a' : CoeffField d} {x : Vec d} (hx : x ∉ coreBox ℓ σ j) : + patchCore ℓ σ j a a' x = a x := by simp [patchCore, hx] + +theorem measurable_patchCore_entry {ℓ : ℝ} {σ : Vec d} {j : Fin d → ℤ} + {a a' : CoeffField d} + (ha : ∀ i j' : Fin d, Measurable fun x : Vec d => a x i j') + (ha' : ∀ i j' : Fin d, Measurable fun x : Vec d => a' x i j') : + ∀ i j' : Fin d, Measurable fun x : Vec d => patchCore ℓ σ j a a' x i j' := by + classical + intro i j' + have hrw : (fun x : Vec d => patchCore ℓ σ j a a' x i j') + = fun x : Vec d => if x ∈ coreBox ℓ σ j then a' x i j' else a x i j' := by + funext x + by_cases hx : x ∈ coreBox ℓ σ j + · rw [patchCore_apply_of_mem hx, if_pos hx] + · rw [patchCore_apply_of_not_mem hx, if_neg hx] + rw [hrw] + exact Measurable.ite (measurableSet_coreBox ℓ σ j) (ha' i j') (ha i j') + +theorem ae_isEllipticMatrix_patchCore {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {j : Fin d → ℤ} + {a a' : CoeffField d} + (ha : ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (a x)) + (ha' : ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (a' x)) : + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (patchCore ℓ σ j a a' x) := by + filter_upwards [ha, ha'] with x hxa hxa' + by_cases hx : x ∈ coreBox ℓ σ j + · rw [patchCore_apply_of_mem hx]; exact hxa' + · rw [patchCore_apply_of_not_mem hx]; exact hxa + +/-! ## The exact update identity -/ + +theorem restrictCoeffField_congr {U : Set (Vec d)} {f g : CoeffField d} + (h : ∀ x ∈ U, f x = g x) : restrictCoeffField U f = restrictCoeffField U g := by + funext x + by_cases hx : x ∈ U + · rw [restrictCoeffField_apply_of_mem hx, restrictCoeffField_apply_of_mem hx, h x hx] + · rw [restrictCoeffField_apply_of_not_mem hx, restrictCoeffField_apply_of_not_mem hx] + +/-- **Exact update identity.** Updating the `k`-th coordinate of the diagonal +restriction tuple by a fresh core-restriction of `a'` equals the diagonal +restriction tuple of the surgered field `patchCore k a a'` (using core +disjointness off `k`). -/ +theorem update_restrict_eq_restrict_patchCore {ℓ : ℝ} (hℓ : 0 ≤ ℓ) {σ : Vec d} + {K : Finset (Fin d → ℤ)} (k : {k // k ∈ K}) (a a' : CoeffField d) : + Function.update + (fun k' : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k'.val) a) k + (restrictCoeffField (coreBox ℓ σ k.val) a') + = fun k' : {k // k ∈ K} => + restrictCoeffField (coreBox ℓ σ k'.val) (patchCore ℓ σ k.val a a') := by + classical + funext k' + rcases eq_or_ne k' k with rfl | hkk' + · rw [Function.update_self] + refine restrictCoeffField_congr (fun x hx => ?_) + rw [patchCore_apply_of_mem hx] + · rw [Function.update_of_ne hkk'] + refine restrictCoeffField_congr (fun x hx => ?_) + have hne : k.val ≠ k'.val := fun h => hkk' (Subtype.ext h.symm) + have hxnk : x ∉ coreBox ℓ σ k.val := not_mem_coreBox_of_mem hℓ σ hne hx + rw [patchCore_apply_of_not_mem hxnk] + +/-! ## The Efron–Stein bound -/ + +/-- **Abstract Efron–Stein patch transfer (opaque-observable core).** For an +abstract bounded measurable product observable `G` on carrier tuples whose +diagonal agrees a.e. with `Φ` and whose single-coordinate resampling agrees +a.e. (on the product) with the two-field surgery values `Ψ`, the Efron–Stein +transfer yields the variance bound in surgery form. Keeping `G`, `Φ`, `Ψ` +opaque here keeps elaboration at default heartbeats; the fixed-phase +instantiation is below. -/ +theorem efronStein_patch_abstract + {ι : Type*} [Fintype ι] [DecidableEq ι] + {C : ι → Set (Vec d)} (hC : ∀ i, MeasurableSet (C i)) + (hsep : Pairwise fun i j => AreUnitSeparated (C i) (C j)) + {L : Measure (RegCoeffField d)} [IsProbabilityMeasure L] + (hURD : IsRestrictionUnitRangeDependentR L) + {G : (ι → RegCoeffField d) → ℝ} (hG : Measurable G) + {M : ℝ} (hMG : ∀ y, |G y| ≤ M) + {Φ : RegCoeffField d → ℝ} {Ψ : ι → RegCoeffField d → RegCoeffField d → ℝ} + (hdiag : (G ∘ fun a i => restrictReg (C i) (hC i) a) =ᵐ[L] Φ) + (hupd : ∀ i : ι, ∀ᵐ p ∂(L.prod L), + G (Function.update ((fun a j => restrictReg (C j) (hC j) a) p.1) i + (restrictReg (C i) (hC i) p.2)) + = Ψ i p.1 p.2) : + Var[Φ; L] + ≤ (1 / 2) * ∑ i : ι, ∫ a, ∫ a', (Ψ i a a' - Φ a) ^ 2 ∂L ∂L := by + classical + set R : RegCoeffField d → (ι → RegCoeffField d) := + fun a i => restrictReg (C i) (hC i) a with hRdef + have key := efronStein_transfer_restriction hC hsep hURD hG hMG R hRdef + have hRae_prod : ∀ᵐ p ∂(L.prod L), G (R p.1) = Φ p.1 := + (Measure.quasiMeasurePreserving_fst).ae hdiag + have hterm : ∀ i : ι, + (∫ a, ∫ a', (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) + - G (R a)) ^ 2 ∂L ∂L) + = ∫ a, ∫ a', (Ψ i a a' - Φ a) ^ 2 ∂L ∂L := by + intro i + have hprodae : + (fun p : RegCoeffField d × RegCoeffField d => + (G (Function.update (R p.1) i (restrictReg (C i) (hC i) p.2)) + - G (R p.1)) ^ 2) + =ᵐ[L.prod L] + (fun p : RegCoeffField d × RegCoeffField d => + (Ψ i p.1 p.2 - Φ p.1) ^ 2) := by + filter_upwards [hupd i, hRae_prod] with p h1 h2 + rw [h1, h2] + refine integral_congr_ae ?_ + filter_upwards [Measure.ae_ae_of_ae_prod hprodae] with a haa + exact integral_congr_ae haa + calc Var[Φ; L] + = Var[G ∘ R; L] := (variance_congr hdiag).symm + _ ≤ (1 / 2) * ∑ i : ι, ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) + - G (R a)) ^ 2 ∂L ∂L := key + _ = (1 / 2) * ∑ i : ι, ∫ a, ∫ a', (Ψ i a a' - Φ a) ^ 2 ∂L ∂L := by + congr 1 + exact Finset.sum_congr rfl (fun i _ => hterm i) + +/-- The diagonal a.e. identity for the carrier clamped observable, in the +composed form consumed by `efronStein_patch_abstract`. -/ +theorem clampedPhaseObservableR_diag_ae [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} (hL : ThetaEllipticLaw Θ L) + (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) : + ((fun y : {k // k ∈ K} → RegCoeffField d => clampedPhaseObservableR ℓ σ Θ m P K y) ∘ + fun a k => restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) a) + =ᵐ[L] fun a => phaseObservable ℓ σ m P a.toFun := by + filter_upwards [hL] with a ha + exact clampedPhaseObservableR_restrict_eq_of_field hℓ hΘ P K hK a ha + +/-- The single-coordinate resampling identity for the carrier clamped +observable: a.e. on the product it equals the fixed-phase observable of the +two-field core surgery. -/ +theorem clampedPhaseObservableR_update_ae [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} [IsProbabilityMeasure L] + (hL : ThetaEllipticLaw Θ L) + (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (k : {k // k ∈ K}) : + ∀ᵐ p ∂(L.prod L), + clampedPhaseObservableR ℓ σ Θ m P K + (Function.update + ((fun a j => restrictReg (coreBox ℓ σ j.val) + (measurableSet_coreBox ℓ σ j.val) a) p.1) k + (restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) p.2)) + = phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun) := by + classical + have hL1 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.1 x) := + (Measure.quasiMeasurePreserving_fst).ae hL + have hL2 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.2 x) := + (Measure.quasiMeasurePreserving_snd).ae hL + filter_upwards [hL1, hL2] with p hp1 hp2 + -- every coordinate of the updated tuple lies in its good event + have hy : ∀ k' : {k // k ∈ K}, + (Function.update + (fun k'' : {k // k ∈ K} => restrictReg (coreBox ℓ σ k''.val) + (measurableSet_coreBox ℓ σ k''.val) p.1) k + (restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) p.2)) k' + ∈ coreGoodSet ℓ σ Θ k'.1 m := by + intro k' + rcases eq_or_ne k' k with rfl | hkk' + · rw [Function.update_self] + exact restrictReg_mem_coreGoodSet hp2 + · rw [Function.update_of_ne hkk'] + exact restrictReg_mem_coreGoodSet hp1 + -- the raw tuple of the updated carrier tuple is the updated raw tuple + have htoFun : + (fun k' : {k // k ∈ K} => + ((Function.update + (fun k'' : {k // k ∈ K} => restrictReg (coreBox ℓ σ k''.val) + (measurableSet_coreBox ℓ σ k''.val) p.1) k + (restrictReg (coreBox ℓ σ k.val) + (measurableSet_coreBox ℓ σ k.val) p.2)) k').toFun) + = Function.update + (fun k' : {k // k ∈ K} => + restrictCoeffField (coreBox ℓ σ k'.val) p.1.toFun) k + (restrictCoeffField (coreBox ℓ σ k.val) p.2.toFun) := by + funext k' + rcases eq_or_ne k' k with rfl | hkk' + · rw [Function.update_self, Function.update_self] + exact restrictReg_toFun_eq _ _ p.2 + · rw [Function.update_of_ne hkk', Function.update_of_ne hkk'] + exact restrictReg_toFun_eq _ _ p.1 + exact (clampedPhaseObservableR_eq_of_good P hy).trans + ((congrArg (clampedPhaseObservable ℓ σ Θ m P K) + (htoFun.trans + (update_restrict_eq_restrict_patchCore hℓ.le k p.1.toFun p.2.toFun))).trans + (clampedPhaseObservable_restrict_eq_of_field hℓ hΘ P K hK + (patchCore ℓ σ k.val p.1.toFun p.2.toFun) + (measurable_patchCore_entry (fun i j => p.1.entry_measurable i j) + (fun i j => p.2.entry_measurable i j)) + (ae_isEllipticMatrix_patchCore hp1 hp2))) + +/-- **Efron–Stein for the fixed-phase observable.** +Under a restriction-unit-range-dependent, `Θ`-elliptic probability law on the +carrier, the +variance of the fixed-phase observable is controlled by the sum, over the cores +meeting the cube, of the two-field core-resampling energies — the `patchCore` +form consumed by the fixed-phase variance assembly. The product-measurable +witness is the genuinely carrier-measurable clamped observable +`clampedPhaseObservableR` (`CarrierObservable.lean`), so the *genuine* +`efronStein_transfer_restriction` applies (no a.e.-measurability relaxation +needed). -/ +theorem efronStein_phaseObservable [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} [IsProbabilityMeasure L] + (hURD : IsRestrictionUnitRangeDependentR L) (hL : ThetaEllipticLaw Θ L) + (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) : + Var[fun a => phaseObservable ℓ σ m P a.toFun; L] + ≤ (1 / 2) * ∑ k : {k // k ∈ K}, + ∫ a, ∫ a', + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a.toFun a'.toFun) + - phaseObservable ℓ σ m P a.toFun) ^ 2 ∂L ∂L := by + classical + have hsep : Pairwise fun i j : {k // k ∈ K} => + AreUnitSeparated (coreBox ℓ σ i.val) (coreBox ℓ σ j.val) := + pairwise_areUnitSeparated_coreBox hℓ.le σ (Subtype.val_injective) + exact efronStein_patch_abstract + (C := fun i : {k // k ∈ K} => coreBox ℓ σ i.val) + (fun i => measurableSet_coreBox ℓ σ i.val) hsep hURD + (measurable_clampedPhaseObservableR hΘ P K) + (abs_clampedPhaseObservableR_le hΘ P K) + (clampedPhaseObservableR_diag_ae hℓ hΘ P hL K hK) + (fun k => clampedPhaseObservableR_update_ae hℓ hΘ P hL K hK k) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/MeasurableObservable.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/MeasurableObservable.lean new file mode 100644 index 0000000000..5afb313a67 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/MeasurableObservable.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CorePatchEnergy +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuOperator.AEEOperator.CanonicalCubeSet + +/-! +# The product-measurable observable and its a.e. identity + +Building on the per-core split of `CorePatchEnergy`, this file assembles the +genuinely product-measurable observable + +`rawPhaseObservable … y := 2 · ⨅ n, phaseSplitEnergy … (compₙ) y` + +where `compₙ = canonicalMuGeneratorAffineField P (denseSeq … n)` is the canonical +countable competitor family used by the Chapter-4 `Mu`-variational representation. +The `⨅` of the pi-measurable per-competitor split energies is pi-measurable, so +`rawPhaseObservable` is measurable for `MeasurableSpace.pi` — **without** any +measurability of `corePatch` itself. + +The main result is the **five-link a.e. identity**: for `P`-a.e. field `a`, + +`rawPhaseObservable … (fun k => a|_{coreBox k}) = F_σ(a)`, + +i.e. the product observable, evaluated on the diagonal restriction tuple `R a`, +reproduces the fixed-phase observable exactly. The chain is +1. `phaseSplitEnergy compₙ (R a) = blockEnergyAverage U (glued) compₙ` (split, `CorePatchEnergy`), +2. `⨅ₙ blockEnergyAverage U (glued) compₙ = Mu U P glued` (`mu_eq_iInf …`), +3. `Mu U P glued = ½ P·𝐀(U; glued) P` (`mu_eq_half_coarseBlockMatrix_cube`, glued is `(1,Θ)`-elliptic), +4. `𝐀(U; glued) = 𝐀(U; corridorField (corePatch (R a)))` (`coarseBlockMatrix_congr_of_ae_eq`, truncation a.e.), +5. `P·𝐀(U; corridorField (corePatch (R a))) P = F_σ(a)` (landed `phaseObservable_corePatch_restrict_eq`). + +The genuine spatial measurability of the underlying field — required for the +`IsEllipticFieldOn` hypotheses of links 1 and 3 — is exactly the measurability +conjunct of `ThetaEllipticLaw` (amended 2026-07-22). +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The canonical competitor family and the raw product observable -/ + +/-- The `n`-th canonical `Mu`-generator competitor on the cube `cubeSet Q`, the +countable dense family used by `mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator`. -/ +noncomputable def phaseCompetitor (Q : TriadicCube d) (P : BlockVec d) (n : ℕ) : BlockState d := + canonicalMuGeneratorAffineField (U := cubeSet Q) P + (TopologicalSpace.denseSeq (canonicalMuBlockCorrectionGeneratorSubmodule (cubeSet Q)) n) + +/-- The raw product-measurable observable: twice the infimum, over the canonical +competitor family, of the per-competitor split energies. -/ +noncomputable def rawPhaseObservable (ℓ : ℝ) (σ : Vec d) (Θ : ℝ) (m : ℤ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → CoeffField d) : ℝ := + 2 * ⨅ n : ℕ, + phaseSplitEnergy ℓ σ Θ (cubeSet (originCube d m)) (phaseCompetitor (originCube d m) P n) K y + +/-- The fixed-phase observable `F_σ(a) = P · 𝐀(U; corridorField ℓ σ a) P`. -/ +noncomputable def phaseObservable (ℓ : ℝ) (σ : Vec d) (m : ℤ) (P : BlockVec d) + (a : CoeffField d) : ℝ := + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ a)) P) + +/-! ## Product-measurability -/ + +/-- **Product-measurability of the raw observable.** A countable infimum of the +pi-measurable per-competitor split energies (`measurable_phaseSplitEnergy`). -/ +theorem measurable_rawPhaseObservable {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} + (P : BlockVec d) (K : Finset (Fin d → ℤ)) : + Measurable + (fun y : {k // k ∈ K} → CoeffField d => rawPhaseObservable ℓ σ Θ m P K y) := by + unfold rawPhaseObservable + refine measurable_const.mul (Measurable.iInf (fun n => ?_)) + exact measurable_phaseSplitEnergy (measurableSet_cubeSet _) (isBounded_cubeSet _) + (phaseCompetitor (originCube d m) P n) K + +/-! ## The five-link a.e. identity -/ + +/-- **The a.e. identity.** For `P`-a.e. field `a` (measurable and a.e. `(1,Θ)`- +elliptic, from `ThetaEllipticLaw`), evaluating the product observable on the +diagonal restriction tuple reproduces the fixed-phase observable exactly. -/ +theorem rawPhaseObservable_restrict_eq_of_field [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) + (P : BlockVec d) (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (b : CoeffField d) + (hbmeas : ∀ i j : Fin d, Measurable fun x : Vec d => b x i j) + (hbell : ∀ᵐ x ∂(MeasureTheory.volume : MeasureTheory.Measure (Vec d)), + IsEllipticMatrix 1 Θ (b x)) : + rawPhaseObservable ℓ σ Θ m P K + (fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) b) + = phaseObservable ℓ σ m P b := by + classical + have hUmeas : MeasurableSet (cubeSet (originCube d m)) := + measurableSet_cubeSet (originCube d m) + have hcorrM : MeasurableSet (corridorSet ℓ σ) := measurableSet_corridorSet ℓ σ + have hcoreUnionM : MeasurableSet (coreUnion ℓ σ K) := by + unfold coreUnion + exact MeasurableSet.iUnion fun k => + MeasurableSet.iUnion fun _ => measurableSet_coreBox ℓ σ k + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet (originCube d m))) := + inferInstance + set Ra : {k // k ∈ K} → CoeffField d := + fun k => restrictCoeffField (coreBox ℓ σ k.val) b with hRa + -- the diagonal reconstruction is the identity-extension of `a` off the cores + have hgfield : + corridorField ℓ σ (corePatch ℓ σ K Ra) + = corridorField ℓ σ (extendByIdCoeffField (coreUnion ℓ σ K) b) := by + rw [hRa, corePatch_restrict_eq_extendById hℓ.le σ K b] + -- entrywise spatial measurability of the corridor field of the reconstruction + have hmeasField : + Measurable (fun x : Vec d => fun i j => + if x ∈ cubeSet (originCube d m) then + (corridorField ℓ σ (corePatch ℓ σ K Ra)) x i j else 0) := by + rw [hgfield] + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + have hrw : + (fun x : Vec d => + if x ∈ cubeSet (originCube d m) then + (corridorField ℓ σ (extendByIdCoeffField (coreUnion ℓ σ K) b)) x i j else 0) + = fun x : Vec d => + if x ∈ cubeSet (originCube d m) then + (if x ∈ corridorSet ℓ σ then (1 : Mat d) i j + else if x ∈ coreUnion ℓ σ K then b x i j else (1 : Mat d) i j) + else 0 := by + funext x + by_cases hxU : x ∈ cubeSet (originCube d m) + · simp only [hxU, if_true] + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc]; simp [hxc] + · rw [corridorField_apply_of_not_mem hxc] + by_cases hxk : x ∈ coreUnion ℓ σ K + · rw [extendByIdCoeffField_apply_of_mem hxk]; simp [hxc, hxk] + · rw [extendByIdCoeffField_apply_of_not_mem hxk]; simp [hxc, hxk] + · simp [hxU] + rw [hrw] + refine Measurable.ite hUmeas ?_ measurable_const + refine Measurable.ite hcorrM measurable_const ?_ + exact Measurable.ite hcoreUnionM (hbmeas i j) measurable_const + -- genuine ellipticity of the glued (truncated) field on the cube + have hEllGlued : + IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) + (glueField ℓ σ Θ (corePatch ℓ σ K Ra)) := + isEllipticFieldOn_ellipticTruncate hUmeas hΘ hmeasField + -- truncation a.e. identity on the cube + have haeCorr : + ∀ᵐ x ∂(MeasureTheory.volume.restrict (cubeSet (originCube d m))), + IsEllipticMatrix 1 Θ (corridorField ℓ σ (corePatch ℓ σ K Ra) x) := by + rw [hgfield] + filter_upwards [MeasureTheory.ae_restrict_of_ae hbell] with x hx + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc]; exact isEllipticMatrix_one hΘ + · rw [corridorField_apply_of_not_mem hxc] + by_cases hxk : x ∈ coreUnion ℓ σ K + · rw [extendByIdCoeffField_apply_of_mem hxk]; exact hx + · rw [extendByIdCoeffField_apply_of_not_mem hxk]; exact isEllipticMatrix_one hΘ + have haeGlued : + glueField ℓ σ Θ (corePatch ℓ σ K Ra) + =ᵐ[MeasureTheory.volume.restrict (cubeSet (originCube d m))] + corridorField ℓ σ (corePatch ℓ σ K Ra) := + ellipticTruncate_ae_eq haeCorr + -- the AEE quantitative slice + obtain ⟨kslice, hkslice⟩ : + ∃ k : ℕ, AEEQuantitativeEllipticSlice (cubeSet (originCube d m)) k + (glueField ℓ σ Θ (corePatch ℓ σ K Ra)) := + AEEQuantitativeEllipticSlice.exists_of_aeeEllipticOn (by norm_num) + (IsAEEllipticFieldOn.of_isEllipticFieldOn hEllGlued) + -- link 1: per-competitor split + have hsplit : ∀ n : ℕ, + phaseSplitEnergy ℓ σ Θ (cubeSet (originCube d m)) + (phaseCompetitor (originCube d m) P n) K Ra + = blockEnergyAverage (cubeSet (originCube d m)) + (glueField ℓ σ Θ (corePatch ℓ σ K Ra)) (phaseCompetitor (originCube d m) P n) := by + intro n + exact (blockEnergyAverage_glueField_corePatch_eq_phaseSplitEnergy hℓ hΘ hUmeas + (phaseCompetitor (originCube d m) P n) + (canonicalMuGeneratorAffineField_memBlockL2 P _) K hK Ra hEllGlued).symm + -- links 1–2: infimum equals `Mu` + have hInf : + (⨅ n : ℕ, phaseSplitEnergy ℓ σ Θ (cubeSet (originCube d m)) + (phaseCompetitor (originCube d m) P n) K Ra) + = Mu (cubeSet (originCube d m)) P (glueField ℓ σ Θ (corePatch ℓ σ K Ra)) := by + rw [iInf_congr hsplit] + exact (mu_eq_iInf_blockEnergyAverage_canonicalAEEMuGenerator (originCube d m) kslice + ⟨glueField ℓ σ Θ (corePatch ℓ σ K Ra), hkslice⟩ P).symm + -- links 3–5: assemble + rw [rawPhaseObservable, hInf, mu_eq_half_coarseBlockMatrix_cube hEllGlued P, + coarseBlockMatrix_congr_of_ae_eq haeGlued] + have hland := phaseObservable_corePatch_restrict_eq hℓ P hK b + rw [phaseObservable] + rw [show (fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) b) = Ra from rfl] at hland + rw [hland] + ring + +/-- **The a.e. identity (law form).** Corollary of `rawPhaseObservable_restrict_eq_of_field` +under `ThetaEllipticLaw`, whose measurability + a.e.-ellipticity conjuncts supply +the per-field hypotheses. -/ +theorem rawPhaseObservable_restrict_ae_eq [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) + (P : BlockVec d) {L : MeasureTheory.Measure (RegCoeffField d)} + (hL : ThetaEllipticLaw Θ L) (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) : + ∀ᵐ a ∂L, + rawPhaseObservable ℓ σ Θ m P K + (fun k : {k // k ∈ K} => restrictCoeffField (coreBox ℓ σ k.val) a.toFun) + = phaseObservable ℓ σ m P a.toFun := by + filter_upwards [hL] with a ha + exact rawPhaseObservable_restrict_eq_of_field hℓ hΘ P K hK a.toFun + (fun i j => a.entry_measurable i j) ha + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/PerCoreEnergy.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/PerCoreEnergy.lean new file mode 100644 index 0000000000..d367a4eb11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/PerCoreEnergy.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CutoffData +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Representation +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge + +/-! +# The per-core minimizer energy bound + +For a coefficient field `c` that is `(1, Θ)`-elliptic on the closed cube +`U := cubeSet (originCube d m)`, we produce a single block minimizer `Z` +for `(c, P)` together with, for every core `coreBox ℓ σ k` meeting a finite index +set `K`, the per-core energy bound of `e.fixed.phase.max.energy`: + +`∫_{coreBox ℓ σ k ∩ U} Z·𝐁(c)Z ≤ Cd · Θ · (3^m)² · ℓ^{d−2} · (Θ|p|² + |q|²)`. + +The proof follows §4.3: the coupled representation (`exists_coupledRepresentation`) +supplies `Z, v, v*`; the coupled Stampacchia estimate (`coupled_stampacchia`) +supplies the sup-norm `K∞ = C_d·3^m·√M²`; the per-core smooth cutoff +(`CutoffData`) plus `local_block_energy` (T2) supplies the energy bound, whose two +terms `M²·|supp η ∩ U|` and `Θ·K∞²·∫_U|∇η|²` are collapsed by the uniform cutoff +estimates `(3ℓ)^d` and `d·(16/ℓ)²·(3ℓ)^d` and the power identity +`ℓ^d = ℓ^{d−2}·ℓ²`. The energy is stated on the closed cube by transporting the +open-cube integrals through the null-boundary bridge +`cubeSet_originCube_ae_eq_openCubeSet`. +-/ + +@[expose] public section + +open Homogenization MeasureTheory +open scoped BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The numeric combination of the two `local_block_energy` terms -/ + +private theorem perCore_numeric {d : ℕ} (hd : 3 ≤ d) + {Θ ℓ R Msq CdT CdS suppvol gradint Kinf : ℝ} + (hΘ : 1 ≤ Θ) (hℓ4 : 4 ≤ ℓ) (hℓR : ℓ ≤ R) (hMsq : 0 ≤ Msq) + (hCdT : 0 ≤ CdT) + (hsupp : suppvol ≤ (3 * ℓ) ^ d) + (hgrad : gradint ≤ (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d) + (hKinf : Kinf = CdS * R * Real.sqrt Msq) : + CdT * (Msq * suppvol + Θ * Kinf ^ 2 * gradint) + ≤ (CdT * 3 ^ d + CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ (d - 2) * Msq := by + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have he : d = (d - 2) + 2 := by omega + set e := d - 2 with hedef + have hℓd : ℓ ^ d = ℓ ^ e * ℓ ^ 2 := by rw [he, pow_add] + have h3ℓd : (3 * ℓ) ^ d = 3 ^ d * ℓ ^ d := by rw [mul_pow] + have hKsq : Kinf ^ 2 = CdS ^ 2 * R ^ 2 * Msq := by + rw [hKinf, mul_pow, mul_pow, Real.sq_sqrt hMsq] + have h16 : (16 / ℓ) ^ 2 * ℓ ^ 2 = 256 := by field_simp; norm_num + have hkey : (16 / ℓ) ^ 2 * ℓ ^ d = 256 * ℓ ^ e := by + rw [hℓd, show (16 / ℓ) ^ 2 * (ℓ ^ e * ℓ ^ 2) = ((16 / ℓ) ^ 2 * ℓ ^ 2) * ℓ ^ e from by ring, h16] + have hℓe0 : 0 ≤ ℓ ^ e := by positivity + have h3d0 : (0 : ℝ) ≤ 3 ^ d := by positivity + have hℓ2R2 : ℓ ^ 2 ≤ R ^ 2 := by nlinarith [hℓR, hℓ0.le] + have hT1 : CdT * (Msq * suppvol) ≤ (CdT * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := by + have h1 : Msq * suppvol ≤ Msq * (3 ^ d * (ℓ ^ e * ℓ ^ 2)) := by + apply mul_le_mul_of_nonneg_left _ hMsq + calc suppvol ≤ (3 * ℓ) ^ d := hsupp + _ = 3 ^ d * ℓ ^ d := h3ℓd + _ = 3 ^ d * (ℓ ^ e * ℓ ^ 2) := by rw [hℓd] + calc CdT * (Msq * suppvol) ≤ CdT * (Msq * (3 ^ d * (ℓ ^ e * ℓ ^ 2))) := + mul_le_mul_of_nonneg_left h1 hCdT + _ ≤ CdT * (Msq * (3 ^ d * (ℓ ^ e * R ^ 2))) := by + apply mul_le_mul_of_nonneg_left _ hCdT + apply mul_le_mul_of_nonneg_left _ hMsq + apply mul_le_mul_of_nonneg_left _ h3d0 + exact mul_le_mul_of_nonneg_left hℓ2R2 hℓe0 + _ ≤ CdT * (Msq * (3 ^ d * (ℓ ^ e * R ^ 2))) * Θ := by + nlinarith [mul_nonneg (mul_nonneg hCdT hMsq) + (mul_nonneg h3d0 (mul_nonneg hℓe0 (by positivity : (0:ℝ) ≤ R ^ 2))), hΘ] + _ = (CdT * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := by ring + have hT2 : CdT * (Θ * Kinf ^ 2 * gradint) + ≤ (CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := by + have hgbound : gradint ≤ (d : ℝ) * 256 * 3 ^ d * ℓ ^ e := by + calc gradint ≤ (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d := hgrad + _ = (d : ℝ) * ((16 / ℓ) ^ 2 * (3 ^ d * ℓ ^ d)) := by rw [h3ℓd]; ring + _ = (d : ℝ) * (3 ^ d * ((16 / ℓ) ^ 2 * ℓ ^ d)) := by ring + _ = (d : ℝ) * (3 ^ d * (256 * ℓ ^ e)) := by rw [hkey] + _ = (d : ℝ) * 256 * 3 ^ d * ℓ ^ e := by ring + have hΘK0 : 0 ≤ Θ * Kinf ^ 2 := mul_nonneg (by linarith) (sq_nonneg _) + calc CdT * (Θ * Kinf ^ 2 * gradint) + ≤ CdT * (Θ * Kinf ^ 2 * ((d : ℝ) * 256 * 3 ^ d * ℓ ^ e)) := + mul_le_mul_of_nonneg_left (mul_le_mul_of_nonneg_left hgbound hΘK0) hCdT + _ = CdT * (Θ * (CdS ^ 2 * R ^ 2 * Msq) * ((d : ℝ) * 256 * 3 ^ d * ℓ ^ e)) := by rw [hKsq] + _ = (CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := by ring + calc CdT * (Msq * suppvol + Θ * Kinf ^ 2 * gradint) + = CdT * (Msq * suppvol) + CdT * (Θ * Kinf ^ 2 * gradint) := by ring + _ ≤ (CdT * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq + + (CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := + add_le_add hT1 hT2 + _ = (CdT * 3 ^ d + CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ e * Msq := by ring + +/-! ## The null-boundary energy bridge -/ + +/-- Set integrals over `coreBox ∩ cubeSet` and `coreBox ∩ openCubeSet` coincide: +the two cubes differ only by the null boundary. -/ +theorem setIntegral_coreBox_inter_cubeSet_eq_openCubeSet {m : ℤ} + (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) (f : Vec d → ℝ) : + (∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), f x) + = ∫ x in coreBox ℓ σ k ∩ openCubeSet (originCube d m), f x := by + refine setIntegral_congr_set ?_ + exact (Filter.EventuallyEq.refl _ _).inter (cubeSet_originCube_ae_eq_openCubeSet (d := d) m) + + +/-! ## The per-core minimizer energy bound -/ + +/-- **Per-core energy bound (`e.fixed.phase.max.energy`).** For `c` elliptic on +the closed cube there is a block minimizer `Z` for `(c, P)` and a +dimensional constant `Cd ≥ 0` such that every core meeting `K` has normalized +energy `≤ Cd · Θ · (3^m)² · ℓ^{d−2} · (Θ|p|² + |q|²)`. -/ +theorem exists_perCore_minimizer_energy_le [NeZero d] (hd : 3 ≤ d) {m : ℤ} {Θ : ℝ} + (hΘ : 1 ≤ Θ) {ℓ : ℝ} (hℓ4 : 4 ≤ ℓ) (hℓL : ℓ ≤ (3 : ℝ) ^ m) (σ : Vec d) (P : BlockVec d) + {c : CoeffField d} (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) c) + (K : Finset (Fin d → ℤ)) : + ∃ (Z : BlockState d) (Cd : ℝ), 0 ≤ Cd ∧ + IsBlockMuAdmissible (cubeSet (originCube d m)) P Z ∧ + BlockResponseSpace c (cubeSet (originCube d m)) Z ∧ + Mu (cubeSet (originCube d m)) P c = blockEnergyAverage (cubeSet (originCube d m)) c Z ∧ + ∀ k ∈ K, + (∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ Cd * Θ * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + classical + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + set R : ℝ := (3 : ℝ) ^ m with hRdef + set Msq : ℝ := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hUmeasO : MeasurableSet (openCubeSet (originCube d m)) := measurableSet_openCubeSet _ + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) c := + hEll.mono hUmeasO (openCubeSet_subset_cubeSet (originCube d m)) + -- the coupled representation + obtain ⟨Z, v, vstar, hAdmO, hEngO, hRespO, hTrace, _hgp, _hgf, hWeak, hEnergyId⟩ := + exists_coupledRepresentation hEll P + -- the coupled Stampacchia estimate + obtain ⟨CdS, cval, hCdS0, hvb, hvsb⟩ := coupled_stampacchia hd hEll hWeak hTrace + set Kinf : ℝ := CdS * R * Real.sqrt Msq with hKinfdef + -- the two sup-norm bounds in `centeredPotential` form + have hKv : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |(centeredPotential m v P.1 cval).toFun x| ≤ Kinf := by + filter_upwards [hvb] with x hx + rw [centeredPotential_toFun]; exact hx + have hKvs : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |(centeredPotential m vstar P.1 (-cval)).toFun x| ≤ Kinf := by + filter_upwards [hvsb] with x hx + rw [centeredPotential_toFun] + simpa using hx + set W : ℝ := Θ * R ^ 2 * ℓ ^ (d - 2) * Msq with hWdef + have hW0 : (0 : ℝ) ≤ W := by + rw [hWdef]; positivity + -- per-core existential bound + have hperk : ∀ k : Fin d → ℤ, ∃ e : ℝ, 0 ≤ e ∧ + (∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ e * W := by + intro k + set C : Set (Vec d) := coreBox ℓ σ k ∩ openCubeSet (originCube d m) with hCdef + have hCmeas : MeasurableSet C := + (measurableSet_coreBox ℓ σ k).inter hUmeasO + have hCU : C ⊆ (openCubeSet (originCube d m) : Set (Vec d)) := Set.inter_subset_right + have hηC : ∀ᵐ x ∂(volumeMeasureOn C), coreCutoff ℓ σ k x = 1 := by + refine (ae_restrict_iff' hCmeas).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + exact coreCutoff_eq_one_of_mem_coreBox hℓ0 σ k hx.1 + -- T2 + obtain ⟨CdT, hCdT0, hbound⟩ := + local_block_energy hEllO hWeak hTrace hKv hKvs (coreCutoff_contDiff ℓ σ k) + (coreCutoff_mem_Icc ℓ σ k) (fun x i => coreCutoff_deriv_bound hℓ0 σ k x i) + hEnergyId hCmeas hCU hηC + -- the two uniform cutoff estimates + have hsupp : (volume (Function.support (coreCutoff ℓ σ k) ∩ + openCubeSet (originCube d m))).toReal ≤ (3 * ℓ) ^ d := + coreCutoff_support_volume_le hℓ4 σ k _ + have hgrad : (∫ x in openCubeSet (originCube d m), + ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2) + ≤ (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d := + coreCutoff_sqGrad_integral_le hℓ4 σ k _ + refine ⟨CdT * 3 ^ d + CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d, by positivity, ?_⟩ + rw [setIntegral_coreBox_inter_cubeSet_eq_openCubeSet] + calc (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ CdT * ((Θ * vecNormSq P.1 + vecNormSq P.2) * + (volume (Function.support (coreCutoff ℓ σ k) ∩ + openCubeSet (originCube d m))).toReal + + Θ * Kinf ^ 2 * (∫ x in openCubeSet (originCube d m), + ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2)) := hbound + _ ≤ (CdT * 3 ^ d + CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ * R ^ 2 * ℓ ^ (d - 2) * Msq := + perCore_numeric hd hΘ hℓ4 hℓL hMsq0 hCdT0 hsupp hgrad hKinfdef + _ = (CdT * 3 ^ d + CdT * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * W := by rw [hWdef]; ring + choose f hf0 hfb using hperk + -- uniform constant over the finite `K` + refine ⟨Z, ∑ k ∈ K, |f k|, + Finset.sum_nonneg (fun k _ => abs_nonneg _), + (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).2 hAdmO, + (blockResponseSpace_cubeSet_originCube_iff_openCubeSet).2 hRespO, ?_, ?_⟩ + · rw [Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P c, hEngO] + unfold blockEnergyAverage + exact (volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) m + (blockEnergyDensity c Z)).symm + · intro k hk + have hfkle : f k ≤ ∑ k' ∈ K, |f k'| := + le_trans (le_abs_self _) + (Finset.single_le_sum (f := fun k' => |f k'|) (fun k' _ => abs_nonneg _) hk) + calc (∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ f k * W := hfb k + _ ≤ (∑ k' ∈ K, |f k'|) * W := mul_le_mul_of_nonneg_right hfkle hW0 + _ = (∑ k' ∈ K, |f k'|) * Θ * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) := by rw [hWdef, hRdef, hMsqdef]; ring + +/-- **Uniform per-core energy bound.** The constant-outside form of +`exists_perCore_minimizer_energy_le`: a single dimensional constant `Cd`, +independent of the realization `c` and the core family `K`, bounds every per-core +normalized energy. Uniformity comes from `coupled_stampacchia_uniform` (single +sup-norm constant `CdS`) and `local_block_energy_uniform` (literal `514`); the +per-core numeric collapse is `perCore_numeric` with `CdT := 514`. -/ +theorem exists_perCore_minimizer_energy_le_uniform [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} {Θ : ℝ} (_hΘ : 1 ≤ Θ) {ℓ : ℝ} (_hℓ4 : 4 ≤ ℓ) (_hℓL : ℓ ≤ (3 : ℝ) ^ m) + (σ : Vec d) (P : BlockVec d) {c : CoeffField d} + (_hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) c) (K : Finset (Fin d → ℤ)), + ∃ (Z : BlockState d), + IsBlockMuAdmissible (cubeSet (originCube d m)) P Z ∧ + BlockResponseSpace c (cubeSet (originCube d m)) Z ∧ + Mu (cubeSet (originCube d m)) P c = blockEnergyAverage (cubeSet (originCube d m)) c Z ∧ + ∀ k ∈ K, + (∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ Cd * Θ * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + classical + obtain ⟨CdS, hCdS0, hstampU⟩ := coupled_stampacchia_uniform hd + refine ⟨514 * 3 ^ d + 514 * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d, by positivity, ?_⟩ + intro m Θ hΘ ℓ hℓ4 hℓL σ P c hEll K + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + set R : ℝ := (3 : ℝ) ^ m with hRdef + set Msq : ℝ := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hUmeasO : MeasurableSet (openCubeSet (originCube d m)) := measurableSet_openCubeSet _ + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) c := + hEll.mono hUmeasO (openCubeSet_subset_cubeSet (originCube d m)) + obtain ⟨Z, v, vstar, hAdmO, hEngO, hRespO, hTrace, _hgp, _hgf, hWeak, hEnergyId⟩ := + exists_coupledRepresentation hEll P + obtain ⟨cval, hvb, hvsb⟩ := hstampU hEll hWeak hTrace + set Kinf : ℝ := CdS * R * Real.sqrt Msq with hKinfdef + have hKv : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |(centeredPotential m v P.1 cval).toFun x| ≤ Kinf := by + filter_upwards [hvb] with x hx + rw [centeredPotential_toFun]; exact hx + have hKvs : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |(centeredPotential m vstar P.1 (-cval)).toFun x| ≤ Kinf := by + filter_upwards [hvsb] with x hx + rw [centeredPotential_toFun]; simpa using hx + refine ⟨Z, (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).2 hAdmO, + (blockResponseSpace_cubeSet_originCube_iff_openCubeSet).2 hRespO, ?_, ?_⟩ + · rw [Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P c, hEngO] + unfold blockEnergyAverage + exact (volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) m + (blockEnergyDensity c Z)).symm + · intro k hk + set C : Set (Vec d) := coreBox ℓ σ k ∩ openCubeSet (originCube d m) with hCdef + have hCmeas : MeasurableSet C := (measurableSet_coreBox ℓ σ k).inter hUmeasO + have hCU : C ⊆ (openCubeSet (originCube d m) : Set (Vec d)) := Set.inter_subset_right + have hηC : ∀ᵐ x ∂(volumeMeasureOn C), coreCutoff ℓ σ k x = 1 := by + refine (ae_restrict_iff' hCmeas).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + exact coreCutoff_eq_one_of_mem_coreBox hℓ0 σ k hx.1 + have hbound := local_block_energy_uniform hEllO hWeak hTrace hKv hKvs + (coreCutoff_contDiff ℓ σ k) (coreCutoff_mem_Icc ℓ σ k) + (fun x i => coreCutoff_deriv_bound hℓ0 σ k x i) hEnergyId hCmeas hCU hηC + have hsupp : (volume (Function.support (coreCutoff ℓ σ k) ∩ + openCubeSet (originCube d m))).toReal ≤ (3 * ℓ) ^ d := + coreCutoff_support_volume_le hℓ4 σ k _ + have hgrad : (∫ x in openCubeSet (originCube d m), + ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2) + ≤ (d : ℝ) * (16 / ℓ) ^ 2 * (3 * ℓ) ^ d := + coreCutoff_sqGrad_integral_le hℓ4 σ k _ + rw [setIntegral_coreBox_inter_cubeSet_eq_openCubeSet] + calc (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ 514 * ((Θ * vecNormSq P.1 + vecNormSq P.2) * + (volume (Function.support (coreCutoff ℓ σ k) ∩ + openCubeSet (originCube d m))).toReal + + Θ * Kinf ^ 2 * (∫ x in openCubeSet (originCube d m), + ∑ i, (fderiv ℝ (coreCutoff ℓ σ k) x (basisVec i)) ^ 2)) := hbound + _ ≤ (514 * 3 ^ d + 514 * CdS ^ 2 * (d : ℝ) * 256 * 3 ^ d) * Θ + * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) * (Θ * vecNormSq P.1 + vecNormSq P.2) := + perCore_numeric hd hΘ hℓ4 hℓL hMsq0 (by norm_num) hsupp hgrad hKinfdef + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Recombination.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Recombination.lean new file mode 100644 index 0000000000..fbd0b1c3e3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Recombination.lean @@ -0,0 +1,240 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions + +/-! +# The `G`-factorization of the fixed-phase observable + +For the Efron–Stein step of Proposition 4.3 (`p.fixed.phase.variance`) the fixed +phase observable + +`F_σ(a) = P · 𝐀(U; a_σ) P`, `U := cubeSet (originCube d m)`, `a_σ := corridorField ℓ σ a` + +must be exhibited as a *measurable function of the independent core restrictions* +`Y_k := a|_{coreBox ℓ σ k}` for the finitely many cores `k` meeting `U`. This file +builds the reconstruction map `corePatch` from a tuple of per-core fields, and +proves the exact factorization + +`F_σ (corePatch K (fun k => a|_{coreBox k})) = F_σ a`. + +The reconstruction has a clean closed form on the diagonal input: for +`R a k := restrictCoeffField (coreBox ℓ σ k) a`, + +`corePatch K (fun k => R a k) = extendByIdCoeffField (⋃ k ∈ K, coreBox ℓ σ k) a`, + +an ambient-measurable *self*-map (`measurable_extendByIdCoeffField`). The coarse +matrix only sees `U`, and on `U` the corridor of this glued field agrees with the +corridor of `a` (corridors are `1`; the residual `U ∖ corridor` is covered by the +cores in `K`), so the two coarse matrices coincide. + +The cores are pairwise disjoint (`disjoint_coreBox`, from the `2`-separation +`areUnitSeparated_coreBox`), which makes the indicator-sum reconstruction +well-defined. +-/ + +@[expose] public section + +open Homogenization +open scoped BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## Pairwise disjointness of the cores -/ + +/-- Distinct cores are disjoint: they are `2`-separated (`areUnitSeparated_coreBox`), +so a common point would have self-distance `≥ 1 > 0`. -/ +theorem disjoint_coreBox {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) {k k' : Fin d → ℤ} + (hne : k ≠ k') : Disjoint (coreBox ℓ σ k) (coreBox ℓ σ k') := by + rw [Set.disjoint_left] + intro x hxk hxk' + have h := areUnitSeparated_coreBox hℓ σ hne hxk hxk' + simp only [dist_self] at h + linarith + +/-- A point of a core is in no other core. -/ +theorem not_mem_coreBox_of_mem {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) {k k' : Fin d → ℤ} + (hne : k' ≠ k) {x : Vec d} (hx : x ∈ coreBox ℓ σ k) : x ∉ coreBox ℓ σ k' := + fun hx' => (Set.disjoint_left.1 (disjoint_coreBox hℓ σ hne)) hx' hx + +/-! ## The finite index set of cores meeting `U` -/ + +/-- The finite set of core indices whose core meets the bounded region `U`. -/ +noncomputable def coreMeetsFinset {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : Finset (Fin d → ℤ) := + (finite_coreBox_meets hℓ σ hU).toFinset + +@[simp] theorem mem_coreMeetsFinset {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) {U : Set (Vec d)} + (hU : Bornology.IsBounded U) (k : Fin d → ℤ) : + k ∈ coreMeetsFinset hℓ σ hU ↔ (coreBox ℓ σ k ∩ U).Nonempty := by + simp [coreMeetsFinset, Set.Finite.mem_toFinset] + +/-! ## The core-restriction reconstruction map -/ + +/-- Reconstruct an ambient coefficient field from a tuple of per-core fields +`y : ↥K → CoeffField d`. On the (disjoint) core `coreBox ℓ σ k` it reads `y k`; +off every core it is the identity. The indicator-sum form is well-defined because +the cores are pairwise disjoint (at most one summand is nonzero). -/ +noncomputable def corePatch (ℓ : ℝ) (σ : Vec d) (K : Finset (Fin d → ℤ)) + (y : {k // k ∈ K} → CoeffField d) : CoeffField d := + fun x => (1 : Mat d) + + ∑ k : {k // k ∈ K}, (coreBox ℓ σ k.val).indicator (fun z => y k z - 1) x + +/-- On the core `coreBox ℓ σ k₀` (with `k₀ ∈ K`) the reconstruction reads `y ⟨k₀⟩`. -/ +theorem corePatch_apply_of_mem {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) + {K : Finset (Fin d → ℤ)} (y : {k // k ∈ K} → CoeffField d) + {k₀ : Fin d → ℤ} (hk₀ : k₀ ∈ K) {x : Vec d} (hx : x ∈ coreBox ℓ σ k₀) : + corePatch ℓ σ K y x = y ⟨k₀, hk₀⟩ x := by + classical + have hsum : (∑ k : {k // k ∈ K}, + (coreBox ℓ σ k.val).indicator (fun z => y k z - 1) x) + = y ⟨k₀, hk₀⟩ x - 1 := by + rw [Finset.sum_eq_single (⟨k₀, hk₀⟩ : {k // k ∈ K})] + · rw [Set.indicator_of_mem hx] + · intro k' _ hk'ne + have hval : k'.val ≠ k₀ := by + intro h; exact hk'ne (Subtype.ext h) + exact Set.indicator_of_notMem (not_mem_coreBox_of_mem hℓ σ hval hx) _ + · intro hnot; exact absurd (Finset.mem_univ _) hnot + rw [corePatch, hsum]; abel + +/-- Off every core in `K`, the reconstruction is the identity. -/ +theorem corePatch_apply_of_not_mem {ℓ : ℝ} (σ : Vec d) + {K : Finset (Fin d → ℤ)} (y : {k // k ∈ K} → CoeffField d) + {x : Vec d} (hx : ∀ k ∈ K, x ∉ coreBox ℓ σ k) : + corePatch ℓ σ K y x = 1 := by + classical + have hsum : (∑ k : {k // k ∈ K}, + (coreBox ℓ σ k.val).indicator (fun z => y k z - 1) x) = 0 := by + refine Finset.sum_eq_zero (fun k _ => ?_) + exact Set.indicator_of_notMem (hx k.val k.property) _ + rw [corePatch, hsum, add_zero] + +/-! ## The closed form of the reconstruction on core restrictions -/ + +/-- The union of the cores in `K`. -/ +def coreUnion (ℓ : ℝ) (σ : Vec d) (K : Finset (Fin d → ℤ)) : Set (Vec d) := + ⋃ k ∈ K, coreBox ℓ σ k + +theorem mem_coreUnion {ℓ : ℝ} {σ : Vec d} {K : Finset (Fin d → ℤ)} {x : Vec d} : + x ∈ coreUnion ℓ σ K ↔ ∃ k ∈ K, x ∈ coreBox ℓ σ k := by + simp [coreUnion] + +/-- **Closed form.** Feeding the core-restrictions of a single field `a` to the +reconstruction yields the identity-extension of `a` off the union of the cores. +This is the key identity: the reconstruction of a *diagonal* tuple is a genuine +ambient-measurable self-map (`extendByIdCoeffField`). -/ +theorem corePatch_restrict_eq_extendById {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) + (K : Finset (Fin d → ℤ)) (a : CoeffField d) : + corePatch ℓ σ K (fun k => restrictCoeffField (coreBox ℓ σ k.val) a) + = extendByIdCoeffField (coreUnion ℓ σ K) a := by + classical + funext x + by_cases hx : x ∈ coreUnion ℓ σ K + · rw [mem_coreUnion] at hx + obtain ⟨k₀, hk₀, hxk₀⟩ := hx + rw [corePatch_apply_of_mem hℓ σ _ hk₀ hxk₀, + restrictCoeffField_apply_of_mem hxk₀, + extendByIdCoeffField_apply_of_mem (by rw [mem_coreUnion]; exact ⟨k₀, hk₀, hxk₀⟩)] + · have hxnot : ∀ k ∈ K, x ∉ coreBox ℓ σ k := by + intro k hk hxk; exact hx (by rw [mem_coreUnion]; exact ⟨k, hk, hxk⟩) + rw [corePatch_apply_of_not_mem σ _ hxnot, + extendByIdCoeffField_apply_of_not_mem hx] + +/-! ## The `extendByIdCoeffField` self-map is measurable -/ + +/-- The identity-extension self-map is ambient-measurable, by the same +pointwise/local case-split as `measurable_corridorField`: each entry is a +`by_cases x ∈ W` between a coordinate evaluation and the constant `1`, and the +map is spatially local. -/ +theorem measurable_extendByIdCoeffField (W : Set (Vec d)) : + Measurable (extendByIdCoeffField (d := d) W) := by + classical + refine measurable_coeffField_to_ambient ?_ (fun U hU => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + by_cases hx : x ∈ W + · simp only [extendByIdCoeffField_apply_of_mem hx] + exact measurable_coeffField_entry (d := d) x i j + · simp only [extendByIdCoeffField_apply_of_not_mem hx] + exact measurable_const + · refine measurable_localSigma_of_local (T := extendByIdCoeffField W) ?_ U hU + intro V hV + refine ⟨V, hV, ?_⟩ + intro a b hab x hxV + by_cases hx : x ∈ W + · rw [extendByIdCoeffField_apply_of_mem hx, extendByIdCoeffField_apply_of_mem hx, hab x hxV] + · rw [extendByIdCoeffField_apply_of_not_mem hx, extendByIdCoeffField_apply_of_not_mem hx] + +/-! ## The coarse matrix sees only `U` -/ + +/-- If two fields agree pointwise on the measurable set `U`, their coarse block +matrices on `U` coincide (both equal the coarse matrix of the common +`U`-restriction). -/ +theorem coarseBlockMatrix_eq_of_eqOn {U : Set (Vec d)} (hU : MeasurableSet U) + {a b : CoeffField d} (hab : Set.EqOn a b U) : + coarseBlockMatrix U a = coarseBlockMatrix U b := by + have hr : restrictCoeffField U a = restrictCoeffField U b := by + funext x + by_cases hx : x ∈ U + · rw [restrictCoeffField_apply_of_mem hx, restrictCoeffField_apply_of_mem hx, hab hx] + · rw [restrictCoeffField_apply_of_not_mem hx, restrictCoeffField_apply_of_not_mem hx] + calc coarseBlockMatrix U a + = coarseBlockMatrix U (restrictCoeffField U a) := + (coarseBlockMatrix_restrictCoeffField_eq hU a).symm + _ = coarseBlockMatrix U (restrictCoeffField U b) := by rw [hr] + _ = coarseBlockMatrix U b := coarseBlockMatrix_restrictCoeffField_eq hU b + +/-! ## The exact factorization (Part 1c) -/ + +/-- On `U`, the corridor of the identity-extension `extendByIdCoeffField W a` +(with `W ⊇ U ∖ corridorSet`) agrees pointwise with the corridor of `a`: on the +corridor both are `1`; off the corridor inside `U` the point lies in some core +of `K`, so the extension reads `a`. -/ +theorem corridorField_extendById_eqOn {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) + {K : Finset (Fin d → ℤ)} {U : Set (Vec d)} + (hK : ∀ k : Fin d → ℤ, (coreBox ℓ σ k ∩ U).Nonempty → k ∈ K) + (a : CoeffField d) : + Set.EqOn (corridorField ℓ σ (extendByIdCoeffField (coreUnion ℓ σ K) a)) + (corridorField ℓ σ a) U := by + intro x hxU + by_cases hxS : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxS, corridorField_apply_of_mem hxS] + · rw [corridorField_apply_of_not_mem hxS, corridorField_apply_of_not_mem hxS] + -- `x ∈ U ∖ corridorSet`, so `x` lies in some core, whose index meets `U`. + have hxCompl : x ∈ (corridorSet ℓ σ)ᶜ := hxS + rw [compl_corridorSet_eq_iUnion_coreBox hℓ σ, Set.mem_iUnion] at hxCompl + obtain ⟨k₁, hxk₁⟩ := hxCompl + have hk₁K : k₁ ∈ K := hK k₁ ⟨x, hxk₁, hxU⟩ + exact extendByIdCoeffField_apply_of_mem (by rw [mem_coreUnion]; exact ⟨k₁, hk₁K, hxk₁⟩) + +/-- **Part 1c (exact `G`-factorization).** With `U := cubeSet (originCube d m)` +and `K` the core indices meeting `U`, reconstructing the fixed-phase observable +from the per-core restrictions of `a` reproduces `F_σ(a)` exactly. -/ +theorem phaseObservable_corePatch_restrict_eq [NeZero d] {ℓ : ℝ} (hℓ : 0 < ℓ) + {m : ℤ} {σ : Vec d} (P : BlockVec d) {K : Finset (Fin d → ℤ)} + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (a : CoeffField d) : + blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ σ + (corePatch ℓ σ K + (fun k => restrictCoeffField (coreBox ℓ σ k.val) a)))) P) + = blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ a)) P) := by + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + rw [corePatch_restrict_eq_extendById hℓ.le σ K a] + rw [coarseBlockMatrix_eq_of_eqOn hU (corridorField_extendById_eqOn hℓ σ hK a)] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Resample.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Resample.lean new file mode 100644 index 0000000000..3686d6d42e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Resample.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Recombination + +/-! +# One-core resampling stability + +The deterministic sensitivity estimate `e.fixed.phase.sensitivity` behind the +Efron–Stein step of Proposition 4.3. Resampling the coefficient field on a +single core `coreBox ℓ σ k` moves the fixed-phase observable +`F_σ(b) = P · 𝐀(U; b_σ) P` by at most a normalized energy over that core: + +`|F_σ(b) − F_σ(b')| ≤ 48 Θ (vol U)⁻¹ ∫_{coreBox ℓ σ k ∩ U} Z · 𝐀_σ(b) Z`, + +where `Z` is a minimizer for `corridorField ℓ σ b` and `b, b'` are two fields, +`(1, Θ)`-elliptic on `U`, agreeing off the core. + +The proof is exactly the B′3 assembly of +`abs_phaseObservable_sub_le_of_minimizer`, with the corridor +comparison replaced by the resampling comparison: instead of comparing `a` with +`corridorField ℓ σ a` (agreeing off `corridorSet`), we compare +`corridorField ℓ σ b` with `corridorField ℓ σ b'` (agreeing off `coreBox ℓ σ k`). +We factor out the corridor-independent core as the general lemma +`abs_coarseObservable_sub_le_of_minimizer`. +-/ + +@[expose] public section + +open Homogenization +open MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## Measurability of a core box -/ + +/-- Each core box is measurable (a finite product of closed intervals). -/ +theorem measurableSet_coreBox (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : + MeasurableSet (coreBox ℓ σ k) := by + rw [coreBox] + exact MeasurableSet.univ_pi (fun i => measurableSet_Icc) + +/-! ## The general two-field coarse-stability lemma (B′3 core) -/ + +/-- **General coarse stability.** For two fields `c, c'` that are `(1, Θ)`-elliptic +on `U := cubeSet (originCube d m)` and agree on `U ∖ S`, the coarse observable +moves by at most `48 Θ (vol U)⁻¹` times the `S`-energy of any minimizer `Z` +for `c`. This is the corridor-independent heart of +`abs_phaseObservable_sub_le_of_minimizer`. -/ +theorem abs_coarseObservable_sub_le_of_minimizer [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {S : Set (Vec d)} (P : BlockVec d) {c c' : CoeffField d} + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) c) + (hEll' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) c') + (hS : MeasurableSet S) (hSU : S ⊆ cubeSet (originCube d m)) + (hagreeOff : Set.EqOn c c' (cubeSet (originCube d m) \ S)) + {Z : BlockState d} + (hZadm : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z) + (hZresp : BlockResponseSpace c (cubeSet (originCube d m)) Z) + (hZeng : Mu (cubeSet (originCube d m)) P c + = blockEnergyAverage (cubeSet (originCube d m)) c Z) : + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) c') P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) c) P)| ≤ + 48 * Θ * (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in S, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) := by + classical + set U := cubeSet (originCube d m) with hUdef + have hU : MeasurableSet U := measurableSet_cubeSet (originCube d m) + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by rw [hUdef]; infer_instance + have hΘpos : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + obtain ⟨Zσ, hZσadm, hZσeng, hZσresp⟩ := exists_cubeBlockMinimizer hEll' P + -- energy-integral forms of both `Mu`-quadratics + have hFc : blockVecDot P (blockMatVecMul (coarseBlockMatrix U c) P) + = (volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEll hZeng + have hFc' : blockVecDot P (blockMatVecMul (coarseBlockMatrix U c') P) + = (volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (Zσ.eval x) (blockMatVecMul (blockCoeffField c' x) (Zσ.eval x)) := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEll' hZσeng + have hK : (1 : ℝ) ≤ 4 * Θ := by linarith + have hZbl : MemBlockL2 U Z.eval := hZadm.memBlockL2_eval + have hZσbl : MemBlockL2 U Zσ.eval := hZσadm.memBlockL2_eval + set W : BlockState d := + { potential := fun x => Zσ.potential x - Z.potential x + flux := fun x => Zσ.flux x - Z.flux x } with hWdef + have hWeval : ∀ x, W.eval x = Zσ.eval x - Z.eval x := fun x => rfl + have hWbl : MemBlockL2 U W.eval := hZσbl.sub hZbl + have hae : ∀ᵐ x ∂(volume.restrict U), + IsSymmetricBlockMat (blockCoeffField c x) ∧ IsSymmetricBlockMat (blockCoeffField c' x) ∧ + (∀ V : BlockVec d, 0 ≤ blockVecDot V (blockMatVecMul (blockCoeffField c x) V)) ∧ + (∀ V : BlockVec d, 0 ≤ blockVecDot V (blockMatVecMul (blockCoeffField c' x) V)) ∧ + BlockMatLoewnerLE (blockCoeffField c' x) ((4 * Θ) • blockCoeffField c x) ∧ + BlockMatLoewnerLE (blockCoeffField c x) ((4 * Θ) • blockCoeffField c' x) := by + refine (ae_restrict_iff' hU).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + have hAx : IsEllipticMatrix 1 Θ (c x) := hEll.2 x hx + have hAσx : IsEllipticMatrix 1 Θ (c' x) := hEll'.2 x hx + exact ⟨isSymmetricBlockMat_blockMatrixOfCoeff (c x), + isSymmetricBlockMat_blockMatrixOfCoeff (c' x), + fun V => blockMatrixOfCoeff_quadratic_nonneg hAx V, + fun V => blockMatrixOfCoeff_quadratic_nonneg hAσx V, + blockMatrixOfCoeff_blockMatLoewnerLE_smul_of_isThetaElliptic hAx hAσx, + blockMatrixOfCoeff_blockMatLoewnerLE_smul_of_isThetaElliptic hAσx hAx⟩ + have hagree : ∀ᵐ x ∂(volume.restrict (U \ S)), + blockCoeffField c x = blockCoeffField c' x := by + refine (ae_restrict_iff' (hU.diff hS)).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + have hcc' : c x = c' x := hagreeOff hx + unfold blockCoeffField; rw [hcc'] + have hIntBZZ : IntegrableOn + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) U := by + simpa [blockPairingIntegrand] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZbl hZbl hEll + have hIntBtZZ : IntegrableOn + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c' x) (Z.eval x))) U := by + simpa [blockPairingIntegrand] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZbl hZbl hEll' + have hIntBtYY : IntegrableOn + (fun x => blockVecDot (Zσ.eval x - Z.eval x) + (blockMatVecMul (blockCoeffField c' x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := W) (Y := W) hWbl hWbl hEll' + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hIntBtZY : IntegrableOn + (fun x => blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField c' x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := W) hZbl hWbl hEll' + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hIntBZY : IntegrableOn + (fun x => blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField c x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := W) hZbl hWbl hEll + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hEulerB : ∫ x in U, + blockVecDot (Zσ.eval x - Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) = 0 := + cubeBlockMinimizer_euler_orthogonality_sub hZresp hZσadm hZadm + have hEulerBt : ∫ x in U, + blockVecDot (Zσ.eval x - Z.eval x) (blockMatVecMul (blockCoeffField c' x) (Zσ.eval x)) = 0 := + cubeBlockMinimizer_euler_orthogonality_sub hZσresp hZσadm hZadm + have hB3 := abs_setIntegral_energy_sub_le (U := U) (S := S) + (B := blockCoeffField c) (Bt := blockCoeffField c') + (Z := Z.eval) (Zt := Zσ.eval) (K := 4 * Θ) + hU hS hSU hK hae hagree + hIntBZZ hIntBtZZ hIntBtYY hIntBtZY hIntBZY hEulerB hEulerBt + rw [hFc', hFc] + have hc0 : (0 : ℝ) ≤ (volume U).toReal⁻¹ := inv_nonneg.mpr ENNReal.toReal_nonneg + have hES0 : (0 : ℝ) ≤ ∫ x in S, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) := + setIntegral_nonneg hS + (fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEll.2 x (hSU hx)) (Z.eval x)) + set cst := (volume U).toReal⁻¹ with hcstdef + set Iσ := ∫ x in U, + blockVecDot (Zσ.eval x) (blockMatVecMul (blockCoeffField c' x) (Zσ.eval x)) with hIσdef + set I := ∫ x in U, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) with hIdef + set ES := ∫ x in S, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) with hESdef + have hprod : (0 : ℝ) ≤ cst * Θ * ES := mul_nonneg (mul_nonneg hc0 hΘpos.le) hES0 + calc |cst * Iσ - cst * I| + = cst * |Iσ - I| := by rw [← mul_sub, abs_mul, abs_of_nonneg hc0] + _ ≤ cst * (6 * (4 * Θ) * ES) := mul_le_mul_of_nonneg_left hB3 hc0 + _ ≤ 48 * Θ * cst * ES := by nlinarith [hprod] + +/-! ## The one-core resampling specialization -/ + +/-- **Part 3 (one-core resampling stability), minimizer form.** For a fixed grid +phase `σ` and two fields `b, b'` that are `(1, Θ)`-elliptic on +`U := cubeSet (originCube d m)` and agree off the core `coreBox ℓ σ k`, the +fixed-phase observable moves by at most a normalized core-energy of the +minimizer `Z` for `corridorField ℓ σ b`. -/ +theorem abs_phaseObservable_resample_sub_le_of_minimizer [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} (P : BlockVec d) + {b b' : CoeffField d} + (hEllb : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) b) + (hEllb' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) b') + (hbb' : Set.EqOn b b' (coreBox ℓ σ k)ᶜ) + {Z : BlockState d} + (hZadm : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z) + (hZresp : BlockResponseSpace (corridorField ℓ σ b) (cubeSet (originCube d m)) Z) + (hZeng : Mu (cubeSet (originCube d m)) P (corridorField ℓ σ b) + = blockEnergyAverage (cubeSet (originCube d m)) (corridorField ℓ σ b) Z) : + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ b')) P) - + blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ b)) P)| ≤ + 48 * Θ * (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField (corridorField ℓ σ b) x) (Z.eval x)) := by + set U := cubeSet (originCube d m) with hUdef + have hU : MeasurableSet U := measurableSet_cubeSet (originCube d m) + -- the two corridor-modified fields are elliptic on `U` + have hEllc : IsEllipticFieldOn 1 Θ U (corridorField ℓ σ b) := + isEllipticFieldOn_corridorField hU hΘ hEllb + have hEllc' : IsEllipticFieldOn 1 Θ U (corridorField ℓ σ b') := + isEllipticFieldOn_corridorField hU hΘ hEllb' + set S : Set (Vec d) := coreBox ℓ σ k ∩ U with hSdef + have hS : MeasurableSet S := (measurableSet_coreBox ℓ σ k).inter hU + have hSU : S ⊆ U := Set.inter_subset_right + -- corridor fields agree on `U ∖ S = U ∖ coreBox k` + have hagreeOff : Set.EqOn (corridorField ℓ σ b) (corridorField ℓ σ b') (U \ S) := by + intro x hx + have hxnc : x ∉ coreBox ℓ σ k := by + intro hc; exact hx.2 ⟨hc, hx.1⟩ + by_cases hxS : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxS, corridorField_apply_of_mem hxS] + · rw [corridorField_apply_of_not_mem hxS, corridorField_apply_of_not_mem hxS] + exact hbb' hxnc + exact abs_coarseObservable_sub_le_of_minimizer hΘ P hEllc hEllc' hS hSU hagreeOff + hZadm hZresp hZeng + +/-- **Part 3 (one-core resampling stability).** Existential-minimizer wrapper. -/ +theorem abs_phaseObservable_resample_sub_le [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} (P : BlockVec d) + {b b' : CoeffField d} + (hEllb : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) b) + (hEllb' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) b') + (hbb' : Set.EqOn b b' (coreBox ℓ σ k)ᶜ) : + ∃ Z : BlockState d, + IsBlockMuAdmissible (cubeSet (originCube d m)) P Z ∧ + BlockResponseSpace (corridorField ℓ σ b) (cubeSet (originCube d m)) Z ∧ + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ b')) P) - + blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ b)) P)| ≤ + 48 * Θ * (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in coreBox ℓ σ k ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField (corridorField ℓ σ b) x) (Z.eval x)) := by + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + have hEllc : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) (corridorField ℓ σ b) := + isEllipticFieldOn_corridorField hU hΘ hEllb + obtain ⟨Z, hZadm, hZeng, hZresp⟩ := exists_cubeBlockMinimizer hEllc P + exact ⟨Z, hZadm, hZresp, + abs_phaseObservable_resample_sub_le_of_minimizer hΘ P hEllb hEllb' hbb' hZadm hZresp hZeng⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Variance.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Variance.lean new file mode 100644 index 0000000000..e4e1a1c218 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/Variance.lean @@ -0,0 +1,390 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.PerCoreEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.EfronSteinPhase +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich + +/-! +# The fixed-phase variance (Proposition 4.3), realization bound + +The Efron–Stein sensitivity step of `p.fixed.phase.variance` assembled at the +level of a single (everywhere-`(1,Θ)`-elliptic) realization pair `a, a'`. + +For two fields elliptic on the closed cube `U := cubeSet (originCube d m)`, the +summed squared resampling deviation over any finite family of cores obeys the +`max·sum` estimate of §4.3: + +`Σ_k (F_σ(patchCore k a a') − F_σ(a))² ≤ C_d · 4608 · Θ³ · (ℓ/3^m)^{d−2} · (Θ|p|² + |q|²)²`, + +with the per-core energies bounded by `exists_perCore_minimizer_energy_le` +(Part B) and the total energy by the C1′ sandwich +(`blockVecDot_coarseBlockMatrix_cube_le`). The single minimizer `Z` for the +corridor field serves both the sensitivity (via +`abs_phaseObservable_resample_sub_le_of_minimizer`) and the energies. + +This is the deterministic, measurability-free core of Proposition 4.3. +-/ + +@[expose] public section + +open Homogenization MeasureTheory +open scoped BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The ratio power identity -/ + +private theorem ratio_pow_identity {d : ℕ} (hd : 3 ≤ d) {R ℓ : ℝ} (hR : 0 < R) : + R ^ 2 * (R ^ d)⁻¹ * ℓ ^ (d - 2) = (ℓ / R) ^ (d - 2) := by + have hRd : R ^ d = R ^ (d - 2) * R ^ 2 := by + rw [← pow_add]; congr 1; omega + have hne : (R : ℝ) ^ (d - 2) ≠ 0 := by positivity + rw [div_pow, hRd] + field_simp + +/-! ## Ellipticity of the two-field patch -/ + +/-- The two-field core patch of two fields elliptic on the cube is elliptic on +the cube. -/ +theorem isEllipticFieldOn_patchCore {Θ : ℝ} {m : ℤ} {ℓ : ℝ} {σ : Vec d} {k : Fin d → ℤ} + {a a' : CoeffField d} + (hElla : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) + (hElla' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a') : + IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) (patchCore ℓ σ k a a') := by + classical + refine ⟨?_, fun x hx => ?_⟩ + · refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + have ha := (measurable_pi_iff.mp (measurable_pi_iff.mp hElla.1 i)) j + have ha' := (measurable_pi_iff.mp (measurable_pi_iff.mp hElla'.1 i)) j + have heq : (fun x : Vec d => if x ∈ cubeSet (originCube d m) + then patchCore ℓ σ k a a' x i j else 0) + = fun x => if x ∈ coreBox ℓ σ k + then (if x ∈ cubeSet (originCube d m) then a' x i j else 0) + else (if x ∈ cubeSet (originCube d m) then a x i j else 0) := by + funext x + by_cases hc : x ∈ coreBox ℓ σ k + · simp only [patchCore_apply_of_mem hc, if_pos hc] + · simp only [patchCore_apply_of_not_mem hc, if_neg hc] + rw [heq] + exact Measurable.ite (measurableSet_coreBox ℓ σ k) ha' ha + · by_cases hc : x ∈ coreBox ℓ σ k + · rw [patchCore_apply_of_mem hc]; exact hElla'.2 x hx + · rw [patchCore_apply_of_not_mem hc]; exact hElla.2 x hx + +/-! ## The total energy of the cores -/ + +/-- The summed core energy is bounded by the whole-cube energy `≤ 2 M² · (3^m)^d`. -/ +theorem sum_coreEnergy_le [NeZero d] {Θ : ℝ} {m : ℤ} {ℓ : ℝ} (hℓ : 0 ≤ ℓ) + (σ : Vec d) + (P : BlockVec d) {c : CoeffField d} + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) c) + {Z : BlockState d} (hZadm : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z) + (hZeng : Mu (cubeSet (originCube d m)) P c + = blockEnergyAverage (cubeSet (originCube d m)) c Z) + (K : Finset (Fin d → ℤ)) : + ∑ k : {k // k ∈ K}, + (∫ x in coreBox ℓ σ k.val ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x))) + ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) + * ((volume (cubeSet (originCube d m))).toReal) := by + classical + set U := cubeSet (originCube d m) with hUdef + have hU : MeasurableSet U := measurableSet_cubeSet (originCube d m) + set g : Vec d → ℝ := fun x => + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField c x) (Z.eval x)) with hgdef + have hZbl : MemBlockL2 U Z.eval := hZadm.memBlockL2_eval + have hgint : IntegrableOn g U := by + simpa [blockPairingIntegrand, hgdef] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZbl hZbl hEll + have hg0 : ∀ x ∈ U, 0 ≤ g x := + fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEll.2 x hx) (Z.eval x) + -- disjoint core boxes intersected with `U` + have hmeasS : ∀ k : {k // k ∈ K}, MeasurableSet (coreBox ℓ σ k.val ∩ U) := + fun k => (measurableSet_coreBox ℓ σ k.val).inter hU + have hdisjS : Set.Pairwise (↑(Finset.univ : Finset {k // k ∈ K})) + (Function.onFun Disjoint fun k : {k // k ∈ K} => coreBox ℓ σ k.val ∩ U) := by + intro k _ k' _ hkk' + have hne : k.val ≠ k'.val := fun h => hkk' (Subtype.ext h) + exact ((disjoint_coreBox hℓ σ hne).inter_left U).inter_right U + have hintS : ∀ k : {k // k ∈ K}, IntegrableOn g (coreBox ℓ σ k.val ∩ U) := + fun k => hgint.mono_set Set.inter_subset_right + have hbiUnion : ∑ k : {k // k ∈ K}, + (∫ x in coreBox ℓ σ k.val ∩ U, g x) + = ∫ x in ⋃ k : {k // k ∈ K}, (coreBox ℓ σ k.val ∩ U), g x := by + rw [show (⋃ k : {k // k ∈ K}, coreBox ℓ σ k.val ∩ U) + = ⋃ k ∈ (Finset.univ : Finset {k // k ∈ K}), (coreBox ℓ σ k.val ∩ U) by + simp only [Finset.mem_univ, Set.iUnion_true]] + exact (integral_biUnion_finset Finset.univ (fun k _ => hmeasS k) hdisjS + (fun k _ => hintS k)).symm + have hsub : (⋃ k : {k // k ∈ K}, (coreBox ℓ σ k.val ∩ U)) ⊆ U := + Set.iUnion_subset (fun k => Set.inter_subset_right) + have hunionle : (∫ x in ⋃ k : {k // k ∈ K}, (coreBox ℓ σ k.val ∩ U), g x) + ≤ ∫ x in U, g x := by + refine setIntegral_mono_set hgint ?_ (LE.le.eventuallyLE hsub) + exact (ae_restrict_iff' hU).2 (Filter.Eventually.of_forall (fun x hx => hg0 x hx)) + -- whole-cube energy `= (vol U)·F(c) ≤ (vol U)·2M²` + have hFeq : blockVecDot P (blockMatVecMul (coarseBlockMatrix U c) P) + = (volume U).toReal⁻¹ * ∫ x in U, g x := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEll hZeng + have hFle : blockVecDot P (blockMatVecMul (coarseBlockMatrix U c) P) + ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := + blockVecDot_coarseBlockMatrix_cube_le hEll P + have hvolpos : (0 : ℝ) < (volume U).toReal := + volume_cubeSet_originCube_toReal_pos_recovery (d := d) m + have hcubeint : (∫ x in U, g x) ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (volume U).toReal := by + have h : (volume U).toReal⁻¹ * ∫ x in U, g x ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + rw [← hFeq]; exact hFle + have := mul_le_mul_of_nonneg_left h hvolpos.le + rw [← mul_assoc, mul_inv_cancel₀ hvolpos.ne', one_mul] at this + linarith [this] + calc ∑ k : {k // k ∈ K}, + (∫ x in coreBox ℓ σ k.val ∩ U, g x) + = ∫ x in ⋃ k : {k // k ∈ K}, (coreBox ℓ σ k.val ∩ U), g x := hbiUnion + _ ≤ ∫ x in U, g x := hunionle + _ ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (volume U).toReal := hcubeint + + +/-! ## The per-realization summed-square bound -/ + +/-- **Realization bound for `p.fixed.phase.variance`.** For two fields elliptic +on the closed cube, the summed squared resampling deviation over any finite core +family satisfies the `max·sum` estimate of §4.3, with an explicit +`(ℓ/3^m)^{d−2}` scaling. -/ +theorem summed_sq_le_of_ellipticFieldOn [NeZero d] (hd : 3 ≤ d) {m : ℤ} {Θ : ℝ} + (hΘ : 1 ≤ Θ) {ℓ : ℝ} (hℓ4 : 4 ≤ ℓ) (hℓL : ℓ ≤ (3 : ℝ) ^ m) (σ : Vec d) (P : BlockVec d) + {a a' : CoeffField d} + (hElla : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) + (hElla' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a') + (K : Finset (Fin d → ℤ)) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') + - phaseObservable ℓ σ m P a) ^ 2 + ≤ Cd * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hR0 : (0 : ℝ) < (3 : ℝ) ^ m := by positivity + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + set Msq : ℝ := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + set nrm : ℝ := (volume (cubeSet (originCube d m))).toReal⁻¹ with hnrmdef + set volReal : ℝ := (volume (cubeSet (originCube d m))).toReal with hvolRealdef + have hvolR : volReal = ((3 : ℝ) ^ m) ^ d := by + rw [hvolRealdef, volume_cubeSet_toReal, cubeVolume_eq_pow_scale]; rfl + have hvolpos : (0 : ℝ) < volReal := + volume_cubeSet_originCube_toReal_pos_recovery (d := d) m + have hnrm0 : (0 : ℝ) ≤ nrm := by rw [hnrmdef]; positivity + -- the corridor field, its ellipticity, and the per-core package + have hEllc : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) (corridorField ℓ σ a) := + isEllipticFieldOn_corridorField hU hΘ hElla + obtain ⟨Z, Cd, hCd0, hZadm, hZresp, hZeng, hpercore⟩ := + exists_perCore_minimizer_energy_le hd hΘ hℓ4 hℓL σ P hEllc K + -- per-core energy abbreviation and its two bounds + set E : {k // k ∈ K} → ℝ := fun k => + ∫ x in coreBox ℓ σ k.val ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField (corridorField ℓ σ a) x) (Z.eval x)) + with hEdef + have hE0 : ∀ k : {k // k ∈ K}, 0 ≤ E k := by + intro k + exact setIntegral_nonneg ((measurableSet_coreBox ℓ σ k.val).inter hU) + (fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEllc.2 x hx.2) (Z.eval x)) + set Mbound : ℝ := Cd * Θ * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) * Msq with hMbounddef + have hEle : ∀ k : {k // k ∈ K}, E k ≤ Mbound := fun k => hpercore k.val k.2 + have hMbound0 : (0 : ℝ) ≤ Mbound := by + rw [hMbounddef] + exact mul_nonneg (mul_nonneg (mul_nonneg (mul_nonneg hCd0 hΘ0.le) + (by positivity)) (by positivity)) hMsq0 + -- total energy + have htotal : ∑ k : {k // k ∈ K}, E k ≤ 2 * Msq * volReal := + sum_coreEnergy_le hℓ0.le σ P hEllc hZadm hZeng K + -- per-core sensitivity + have hsens : ∀ k : {k // k ∈ K}, + |phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a| + ≤ 48 * Θ * nrm * E k := by + intro k + have hbb' : Set.EqOn a (patchCore ℓ σ k.val a a') (coreBox ℓ σ k.val)ᶜ := + fun x hx => (patchCore_apply_of_not_mem hx).symm + exact abs_phaseObservable_resample_sub_le_of_minimizer hΘ P hElla + (isEllipticFieldOn_patchCore hElla hElla') hbb' hZadm hZresp hZeng + -- each squared deviation is bounded by `(48 Θ nrm)² E_k²` + have hfk : ∀ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm) ^ 2 * E k ^ 2 := by + intro k + have hM0 : (0 : ℝ) ≤ 48 * Θ * nrm * E k := + mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hΘ0.le) hnrm0) (hE0 k) + have h := hsens k + have hsq : (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') + - phaseObservable ℓ σ m P a) ^ 2 ≤ (48 * Θ * nrm * E k) ^ 2 := by + rw [← sq_abs] + exact pow_le_pow_left₀ (abs_nonneg _) h 2 + calc (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm * E k) ^ 2 := hsq + _ = (48 * Θ * nrm) ^ 2 * E k ^ 2 := by ring + -- assemble the max·sum estimate + have hstep : ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) := by + have hsum1 : ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ ∑ k : {k // k ∈ K}, (48 * Θ * nrm) ^ 2 * E k ^ 2 := + Finset.sum_le_sum (fun k _ => hfk k) + have hEsq : ∀ k : {k // k ∈ K}, E k ^ 2 ≤ Mbound * E k := by + intro k + have := mul_le_mul_of_nonneg_right (hEle k) (hE0 k) + calc E k ^ 2 = E k * E k := by ring + _ ≤ Mbound * E k := this + have hsum2 : ∑ k : {k // k ∈ K}, E k ^ 2 ≤ Mbound * ∑ k : {k // k ∈ K}, E k := by + calc ∑ k : {k // k ∈ K}, E k ^ 2 ≤ ∑ k : {k // k ∈ K}, Mbound * E k := + Finset.sum_le_sum (fun k _ => hEsq k) + _ = Mbound * ∑ k : {k // k ∈ K}, E k := by rw [Finset.mul_sum] + have hcoef0 : (0 : ℝ) ≤ (48 * Θ * nrm) ^ 2 := sq_nonneg _ + calc ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ ∑ k : {k // k ∈ K}, (48 * Θ * nrm) ^ 2 * E k ^ 2 := hsum1 + _ = (48 * Θ * nrm) ^ 2 * ∑ k : {k // k ∈ K}, E k ^ 2 := by rw [Finset.mul_sum] + _ ≤ (48 * Θ * nrm) ^ 2 * (Mbound * ∑ k : {k // k ∈ K}, E k) := + mul_le_mul_of_nonneg_left hsum2 hcoef0 + _ ≤ (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left htotal hMbound0) hcoef0 + -- close: rewrite the constant into `(ℓ/3^m)^{d−2}` form + refine ⟨4608 * Cd, mul_nonneg (by norm_num) hCd0, le_trans hstep (le_of_eq ?_)⟩ + have hRdne : ((3 : ℝ) ^ m) ^ d ≠ 0 := by positivity + have hnrmR : nrm = (((3 : ℝ) ^ m) ^ d)⁻¹ := by rw [hnrmdef, hvolR] + have key : (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) + = 4608 * Cd * Θ ^ 3 + * (((3 : ℝ) ^ m) ^ 2 * (((3 : ℝ) ^ m) ^ d)⁻¹ * ℓ ^ (d - 2)) * Msq ^ 2 := by + rw [hMbounddef, hnrmR, hvolR] + field_simp + ring + rw [key, ratio_pow_identity hd hR0] + +/-! ## The per-realization summed-square bound, uniform constant -/ + +/-- **Uniform realization bound.** The constant-outside form of +`summed_sq_le_of_ellipticFieldOn`: a single dimensional constant `B`, independent +of the realization pair `(a, a')` and the core family `K`, bounds the summed +squared resampling deviation. Uniformity is inherited from +`exists_perCore_minimizer_energy_le_uniform`. -/ +theorem summed_sq_le_of_ellipticFieldOn_uniform [NeZero d] (hd : 3 ≤ d) : + ∃ B : ℝ, 0 ≤ B ∧ + ∀ {m : ℤ} {Θ : ℝ} (_hΘ : 1 ≤ Θ) {ℓ : ℝ} (_hℓ4 : 4 ≤ ℓ) (_hℓL : ℓ ≤ (3 : ℝ) ^ m) + (σ : Vec d) (P : BlockVec d) {a a' : CoeffField d} + (_hElla : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) + (_hElla' : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a') + (K : Finset (Fin d → ℤ)), + ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') + - phaseObservable ℓ σ m P a) ^ 2 + ≤ B * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + obtain ⟨CdPC, hCdPC0, hpercoreU⟩ := exists_perCore_minimizer_energy_le_uniform hd + refine ⟨4608 * CdPC, mul_nonneg (by norm_num) hCdPC0, ?_⟩ + intro m Θ hΘ ℓ hℓ4 hℓL σ P a a' hElla hElla' K + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hR0 : (0 : ℝ) < (3 : ℝ) ^ m := by positivity + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + set Msq : ℝ := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + set nrm : ℝ := (volume (cubeSet (originCube d m))).toReal⁻¹ with hnrmdef + set volReal : ℝ := (volume (cubeSet (originCube d m))).toReal with hvolRealdef + have hvolR : volReal = ((3 : ℝ) ^ m) ^ d := by + rw [hvolRealdef, volume_cubeSet_toReal, cubeVolume_eq_pow_scale]; rfl + have hvolpos : (0 : ℝ) < volReal := + volume_cubeSet_originCube_toReal_pos_recovery (d := d) m + have hnrm0 : (0 : ℝ) ≤ nrm := by rw [hnrmdef]; positivity + have hEllc : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) (corridorField ℓ σ a) := + isEllipticFieldOn_corridorField hU hΘ hElla + obtain ⟨Z, hZadm, hZresp, hZeng, hpercore⟩ := hpercoreU hΘ hℓ4 hℓL σ P hEllc K + set E : {k // k ∈ K} → ℝ := fun k => + ∫ x in coreBox ℓ σ k.val ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField (corridorField ℓ σ a) x) (Z.eval x)) + with hEdef + have hE0 : ∀ k : {k // k ∈ K}, 0 ≤ E k := by + intro k + exact setIntegral_nonneg ((measurableSet_coreBox ℓ σ k.val).inter hU) + (fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEllc.2 x hx.2) (Z.eval x)) + set Mbound : ℝ := CdPC * Θ * ((3 : ℝ) ^ m) ^ 2 * ℓ ^ (d - 2) * Msq with hMbounddef + have hEle : ∀ k : {k // k ∈ K}, E k ≤ Mbound := fun k => hpercore k.val k.2 + have hMbound0 : (0 : ℝ) ≤ Mbound := by + rw [hMbounddef] + exact mul_nonneg (mul_nonneg (mul_nonneg (mul_nonneg hCdPC0 hΘ0.le) + (by positivity)) (by positivity)) hMsq0 + have htotal : ∑ k : {k // k ∈ K}, E k ≤ 2 * Msq * volReal := + sum_coreEnergy_le hℓ0.le σ P hEllc hZadm hZeng K + have hsens : ∀ k : {k // k ∈ K}, + |phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a| + ≤ 48 * Θ * nrm * E k := by + intro k + have hbb' : Set.EqOn a (patchCore ℓ σ k.val a a') (coreBox ℓ σ k.val)ᶜ := + fun x hx => (patchCore_apply_of_not_mem hx).symm + exact abs_phaseObservable_resample_sub_le_of_minimizer hΘ P hElla + (isEllipticFieldOn_patchCore hElla hElla') hbb' hZadm hZresp hZeng + have hfk : ∀ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm) ^ 2 * E k ^ 2 := by + intro k + have hM0 : (0 : ℝ) ≤ 48 * Θ * nrm * E k := + mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hΘ0.le) hnrm0) (hE0 k) + have h := hsens k + have hsq : (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') + - phaseObservable ℓ σ m P a) ^ 2 ≤ (48 * Θ * nrm * E k) ^ 2 := by + rw [← sq_abs] + exact pow_le_pow_left₀ (abs_nonneg _) h 2 + calc (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm * E k) ^ 2 := hsq + _ = (48 * Θ * nrm) ^ 2 * E k ^ 2 := by ring + have hstep : ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) := by + have hsum1 : ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ ∑ k : {k // k ∈ K}, (48 * Θ * nrm) ^ 2 * E k ^ 2 := + Finset.sum_le_sum (fun k _ => hfk k) + have hEsq : ∀ k : {k // k ∈ K}, E k ^ 2 ≤ Mbound * E k := by + intro k + have := mul_le_mul_of_nonneg_right (hEle k) (hE0 k) + calc E k ^ 2 = E k * E k := by ring + _ ≤ Mbound * E k := this + have hsum2 : ∑ k : {k // k ∈ K}, E k ^ 2 ≤ Mbound * ∑ k : {k // k ∈ K}, E k := by + calc ∑ k : {k // k ∈ K}, E k ^ 2 ≤ ∑ k : {k // k ∈ K}, Mbound * E k := + Finset.sum_le_sum (fun k _ => hEsq k) + _ = Mbound * ∑ k : {k // k ∈ K}, E k := by rw [Finset.mul_sum] + have hcoef0 : (0 : ℝ) ≤ (48 * Θ * nrm) ^ 2 := sq_nonneg _ + calc ∑ k : {k // k ∈ K}, + (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a a') - phaseObservable ℓ σ m P a) ^ 2 + ≤ ∑ k : {k // k ∈ K}, (48 * Θ * nrm) ^ 2 * E k ^ 2 := hsum1 + _ = (48 * Θ * nrm) ^ 2 * ∑ k : {k // k ∈ K}, E k ^ 2 := by rw [Finset.mul_sum] + _ ≤ (48 * Θ * nrm) ^ 2 * (Mbound * ∑ k : {k // k ∈ K}, E k) := + mul_le_mul_of_nonneg_left hsum2 hcoef0 + _ ≤ (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left htotal hMbound0) hcoef0 + refine le_trans hstep (le_of_eq ?_) + have hnrmR : nrm = (((3 : ℝ) ^ m) ^ d)⁻¹ := by rw [hnrmdef, hvolR] + have key : (48 * Θ * nrm) ^ 2 * (Mbound * (2 * Msq * volReal)) + = 4608 * CdPC * Θ ^ 3 + * (((3 : ℝ) ^ m) ^ 2 * (((3 : ℝ) ^ m) ^ d)⁻¹ * ℓ ^ (d - 2)) * Msq ^ 2 := by + rw [hMbounddef, hnrmR, hvolR] + field_simp + ring + rw [key, ratio_pow_identity hd hR0] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/VarianceFinal.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/VarianceFinal.lean new file mode 100644 index 0000000000..abce7f5be8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/FixedPhase/VarianceFinal.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Variance +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.Recombination +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.CarrierObservable + +/-! +# The fixed-phase variance (Proposition 4.3), final assembly + +This file closes `p.fixed.phase.variance`. It supplies the two remaining +statement-plumbing inputs and chains them with the landed mathematics: + +* **Joint measurability** (Obstruction 2). + `aestronglyMeasurable_phaseObservable_patchCore` shows the two-field resampled + observable `(a, a') ↦ F_σ(patchCore k a a')` is a.e.-strongly-measurable for the + product law `L ⊗ L`. The approach is the one already used in `EfronSteinPhase`: + `clampedPhaseObservable` is genuinely measurable on the product tuple space, + the resampling-update map is measurable, and the exact update identity + `update_restrict_eq_restrict_patchCore` together with the a.s. field congruence + `clampedPhaseObservable_restrict_eq_of_field` (applied at the patched field, + which is entrywise-measurable + a.e.-elliptic when both draws are) transfers + measurability across the a.e. equality. The diagonal term `a ↦ F_σ(a)` gets the + same treatment (`aestronglyMeasurable_phaseObservable_of_thetaLaw`). + +* **Uniform deterministic bound** (Obstruction 1, consumed). + `summed_sq_le_of_ellipticFieldOn_uniform` (a single dimensional constant `B`, + independent of the realization pair and the core family) is applied a.s. after a + C2-bridge of each realization to everywhere-elliptic representatives; the + fixed-phase observable is unchanged under the bridge + (`phaseObservable_congr_ae`). + +The chain is `efronStein_phaseObservable` → integrable per-core terms (bounded +a.s. by the uniform `B`-term + AESM) → sum/integral exchange (`integral_prod`, +`integral_finset_sum`) → `∫∫ Σ ≤ B`-term. +-/ + +@[expose] public section + +open Homogenization MeasureTheory ProbabilityTheory +open scoped MeasureTheory ProbabilityTheory BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-! ## a.e.-congruence of the fixed-phase observable -/ + +/-- The fixed-phase observable depends on the coefficient field only through a +null-set: if `b =ᵐ b'` on the cube, the observables agree. -/ +theorem phaseObservable_congr_ae {ℓ : ℝ} {σ : Vec d} {m : ℤ} {P : BlockVec d} + {b b' : CoeffField d} + (hbb' : b =ᵐ[volume.restrict (cubeSet (originCube d m))] b') : + phaseObservable ℓ σ m P b = phaseObservable ℓ σ m P b' := by + have hcorr : corridorField ℓ σ b + =ᵐ[volume.restrict (cubeSet (originCube d m))] corridorField ℓ σ b' := by + filter_upwards [hbb'] with x hx + by_cases hxc : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hxc, corridorField_apply_of_mem hxc] + · rw [corridorField_apply_of_not_mem hxc, corridorField_apply_of_not_mem hxc, hx] + unfold phaseObservable + rw [coarseBlockMatrix_congr_of_ae_eq hcorr] + +/-! ## Obstruction 2 — joint measurability -/ + +/-- The single-field fixed-phase observable is a.e.-strongly-measurable under any +`Θ`-elliptic law (via the genuinely measurable clamped observable on the diagonal +restriction tuple). -/ +theorem aestronglyMeasurable_phaseObservable_of_thetaLaw [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} (hLaw : ThetaEllipticLaw Θ L) (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) : + AEStronglyMeasurable (fun a => phaseObservable ℓ σ m P a.toFun) L := by + classical + have hmeas : Measurable (fun a : RegCoeffField d => + clampedPhaseObservableR ℓ σ Θ m P K + (fun k : {k // k ∈ K} => + restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) a)) := + (measurable_clampedPhaseObservableR hΘ P K).comp + (measurable_pi_iff.2 (fun k => + measurable_restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val))) + refine hmeas.aestronglyMeasurable.congr ?_ + filter_upwards [hLaw] with a ha + exact clampedPhaseObservableR_restrict_eq_of_field hℓ hΘ P K hK a ha + +/-- **Obstruction 2 — joint measurability for the sum/integral exchange.** For +each core `k`, the two-field resampled observable +`(a, a') ↦ F_σ(patchCore k a a')` is a.e.-strongly-measurable for the product law +`L ⊗ L`. -/ +theorem aestronglyMeasurable_phaseObservable_patchCore [NeZero d] + {ℓ : ℝ} {σ : Vec d} {Θ : ℝ} {m : ℤ} (hℓ : 0 < ℓ) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} [IsProbabilityMeasure L] (hLaw : ThetaEllipticLaw Θ L) + (K : Finset (Fin d → ℤ)) + (hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K) + (k : {k // k ∈ K}) : + AEStronglyMeasurable + (fun p : RegCoeffField d × RegCoeffField d => + phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun)) (L.prod L) := by + classical + have hRmeas : Measurable + (fun a : RegCoeffField d => fun k' : {k // k ∈ K} => + restrictReg (coreBox ℓ σ k'.val) (measurableSet_coreBox ℓ σ k'.val) a) := + measurable_pi_iff.2 (fun k' => + measurable_restrictReg (coreBox ℓ σ k'.val) (measurableSet_coreBox ℓ σ k'.val)) + have hi_meas : Measurable + (fun p : RegCoeffField d × RegCoeffField d => + Function.update + (fun k' : {k // k ∈ K} => restrictReg (coreBox ℓ σ k'.val) + (measurableSet_coreBox ℓ σ k'.val) p.1) k + (restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) p.2)) := + (measurable_update' (a := k)).comp + ((hRmeas.comp measurable_fst).prodMk + ((measurable_restrictReg (coreBox ℓ σ k.val) + (measurableSet_coreBox ℓ σ k.val)).comp measurable_snd)) + have hmeasG : Measurable + (fun p : RegCoeffField d × RegCoeffField d => + clampedPhaseObservableR ℓ σ Θ m P K + (Function.update + (fun k' : {k // k ∈ K} => restrictReg (coreBox ℓ σ k'.val) + (measurableSet_coreBox ℓ σ k'.val) p.1) k + (restrictReg (coreBox ℓ σ k.val) (measurableSet_coreBox ℓ σ k.val) p.2))) := + (measurable_clampedPhaseObservableR hΘ P K).comp hi_meas + exact hmeasG.aestronglyMeasurable.congr + (clampedPhaseObservableR_update_ae hℓ hΘ P hLaw K hK k) + +/-! ## The fixed-phase variance (Proposition 4.3) -/ + +/-- **`p.fixed.phase.variance` (Proposition 4.3).** Under a +restriction-unit-range-dependent, `Θ`-elliptic probability law, the variance +of the fixed-phase observable obeys the `O((ℓ/3^m)^{d−2})` bound with a single +dimensional constant. -/ +theorem fixed_phase_variance [NeZero d] (hd : 3 ≤ d) {m : ℤ} {ℓ Θ : ℝ} {σ : Vec d} + (hℓ4 : 4 ≤ ℓ) (hℓL : ℓ ≤ (3 : ℝ) ^ m) (hΘ : 1 ≤ Θ) (P : BlockVec d) + {L : Measure (RegCoeffField d)} [IsProbabilityMeasure L] + (hURD : IsRestrictionUnitRangeDependentR L) (hLaw : ThetaEllipticLaw Θ L) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + Var[fun a => phaseObservable ℓ σ m P a.toFun; L] + ≤ Cd * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + -- the finite core family meeting the cube, and its covering property + set K : Finset (Fin d → ℤ) := + coreMeetsFinset hℓ0 σ (isBounded_cubeSet (originCube d m)) with hKdef + have hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K := by + intro k hne + rw [hKdef, mem_coreMeetsFinset]; exact hne + -- the uniform deterministic bound + obtain ⟨B, hB0, hsummedU⟩ := summed_sq_le_of_ellipticFieldOn_uniform (d := d) hd + set Bterm : ℝ := B * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 with hBtermdef + have hBterm0 : (0 : ℝ) ≤ Bterm := by + rw [hBtermdef]; positivity + -- the two-field resampled squared deviation as a product-space function + set g : {k // k ∈ K} → RegCoeffField d × RegCoeffField d → ℝ := + fun k p => (phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun) + - phaseObservable ℓ σ m P p.1.toFun) ^ 2 with hgdef + -- a.e. (over L ⊗ L) summed bound, via the C2 bridge to everywhere-elliptic reps + have haeBound : ∀ᵐ p ∂(L.prod L), ∑ k : {k // k ∈ K}, g k p ≤ Bterm := by + have hL1 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.1 x) := + (Measure.quasiMeasurePreserving_fst).ae hLaw + have hL2 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.2 x) := + (Measure.quasiMeasurePreserving_snd).ae hLaw + filter_upwards [hL1, hL2] with p hp1 hp2 + -- bridge each draw to an everywhere-elliptic representative on the cube + have hmeasA1 : Measurable (fun x => fun i j => if x ∈ cubeSet (originCube d m) + then p.1 x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (p.1.entry_measurable i j).indicator hU + have hmeasA2 : Measurable (fun x => fun i j => if x ∈ cubeSet (originCube d m) + then p.2 x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (p.2.entry_measurable i j).indicator hU + obtain ⟨ā1, hEll1, hā1ae, _, _⟩ := + exists_ellipticFieldOn_ae_eq hU hΘ hmeasA1 (ae_restrict_of_ae hp1) + obtain ⟨ā2, hEll2, hā2ae, _, _⟩ := + exists_ellipticFieldOn_ae_eq hU hΘ hmeasA2 (ae_restrict_of_ae hp2) + -- the fixed-phase observable is unchanged under the bridge + have hphase_a : phaseObservable ℓ σ m P p.1.toFun = phaseObservable ℓ σ m P ā1 := + (phaseObservable_congr_ae hā1ae.symm) + have hpatch_ae : ∀ k : Fin d → ℤ, (patchCore ℓ σ k p.1.toFun p.2.toFun) + =ᵐ[volume.restrict (cubeSet (originCube d m))] (patchCore ℓ σ k ā1 ā2) := by + intro k + filter_upwards [hā1ae, hā2ae] with x hx1 hx2 + by_cases hc : x ∈ coreBox ℓ σ k + · rw [patchCore_apply_of_mem hc, patchCore_apply_of_mem hc, hx2] + · rw [patchCore_apply_of_not_mem hc, patchCore_apply_of_not_mem hc, hx1] + have hphase_patch : ∀ k : {k // k ∈ K}, + phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun) + = phaseObservable ℓ σ m P (patchCore ℓ σ k.val ā1 ā2) := + fun k => phaseObservable_congr_ae (hpatch_ae k.val) + have hsum_eq : (∑ k : {k // k ∈ K}, g k p) + = ∑ k : {k // k ∈ K}, (phaseObservable ℓ σ m P (patchCore ℓ σ k.val ā1 ā2) + - phaseObservable ℓ σ m P ā1) ^ 2 := by + refine Finset.sum_congr rfl (fun k _ => ?_) + rw [hgdef]; simp only [hphase_patch k, hphase_a] + rw [hsum_eq, hBtermdef] + exact hsummedU hΘ hℓ4 hℓL σ P hEll1 hEll2 K + -- AESM of each product-space term + have hAESM_diag : AEStronglyMeasurable + (fun p : RegCoeffField d × RegCoeffField d => + phaseObservable ℓ σ m P p.1.toFun) (L.prod L) := + (aestronglyMeasurable_phaseObservable_of_thetaLaw hℓ0 hΘ P hLaw K hK).comp_quasiMeasurePreserving + (Measure.quasiMeasurePreserving_fst) + have hAESM_g : ∀ k : {k // k ∈ K}, AEStronglyMeasurable (g k) (L.prod L) := by + intro k + have hpatch := aestronglyMeasurable_phaseObservable_patchCore hℓ0 hΘ P hLaw K hK k + have hsub := hpatch.sub hAESM_diag + rw [hgdef] + simpa only [pow_two] using! hsub.mul hsub + -- integrability of each product-space term + have hg_int : ∀ k : {k // k ∈ K}, Integrable (g k) (L.prod L) := by + intro k + refine (integrable_const Bterm).mono' (hAESM_g k) ?_ + filter_upwards [haeBound] with p hp + rw [Real.norm_eq_abs, abs_of_nonneg (by rw [hgdef]; exact sq_nonneg _)] + have hle : g k p ≤ ∑ k' : {k // k ∈ K}, g k' p := + Finset.single_le_sum (f := fun k' => g k' p) + (fun k' _ => by rw [hgdef]; exact sq_nonneg _) (Finset.mem_univ k) + linarith [hle, hp] + -- the sum/integral exchange and bound + have hexchange : (∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L)) + = ∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L) := + (integral_finsetSum Finset.univ (fun k _ => hg_int k)).symm + have hint_le : (∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L)) ≤ Bterm := by + calc (∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L)) + ≤ ∫ _p, Bterm ∂(L.prod L) := + integral_mono_ae (integrable_finsetSum _ (fun k _ => hg_int k)) + (integrable_const _) haeBound + _ = Bterm := by rw [integral_const]; simp + -- relate the Efron–Stein iterated integrals to the product integrals + have hRHS_eq : (∑ k : {k // k ∈ K}, + ∫ a, ∫ a', (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a.toFun a'.toFun) + - phaseObservable ℓ σ m P a.toFun) ^ 2 ∂L ∂L) + = ∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L) := by + refine Finset.sum_congr rfl (fun k _ => ?_) + rw [hgdef] + exact (integral_prod _ (hg_int k)).symm + -- assemble + refine ⟨B / 2, by linarith [hB0], ?_⟩ + calc Var[fun a => phaseObservable ℓ σ m P a.toFun; L] + ≤ (1 / 2) * ∑ k : {k // k ∈ K}, + ∫ a, ∫ a', (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a.toFun a'.toFun) + - phaseObservable ℓ σ m P a.toFun) ^ 2 ∂L ∂L := + efronStein_phaseObservable hℓ0 hΘ P hURD hLaw K hK + _ = (1 / 2) * ∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L) := by rw [hRHS_eq] + _ = (1 / 2) * ∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L) := by rw [hexchange] + _ ≤ (1 / 2) * Bterm := + mul_le_mul_of_nonneg_left hint_le (by norm_num) + _ = B / 2 * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by rw [hBtermdef]; ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/Geometry.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/Geometry.lean new file mode 100644 index 0000000000..a8371555e6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/Geometry.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable + +/-! +# Corridor geometry + +Formalization of the corridor geometry underlying Lemma 4.2 +(`l.corridor.geometry`) of the high-moment paper (Armstrong–Kuusi–Loher, in +preparation). + +Fix a mesh size `ℓ` and a phase `σ : Vec d`. The *corridor set* +`corridorSet ℓ σ` is the union over coordinates `i` of the width-`2` slabs +around the shifted lattice `σ i + ℓ • ℤ`. Its complement is the disjoint +union of the *core boxes* `coreBox ℓ σ k`, `k : Fin d → ℤ`. This file +records: + +* `corridorSet`, `coreBox`; +* the exhaustion `(corridorSet ℓ σ)ᶜ = ⋃ k, coreBox ℓ σ k`; +* the sup-metric `2`-separation of distinct core boxes, packaged as + `AreUnitSeparated`; +* finiteness of the cores meeting a bounded set; +* the corridor-modified coefficient field `corridorField` and its algebra; +* the independence bridge to the unit-range dependence machinery. +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## J1–J2: the corridor set and the core boxes -/ + +/-- The corridor set `S_σ` of `e.corridor.definition`: the points that are +within (sup-)distance `1` of the shifted lattice `σ i + ℓ • ℤ` in some +coordinate `i`. -/ +def corridorSet (ℓ : ℝ) (σ : Vec d) : Set (Vec d) := + {x | ∃ i : Fin d, ∃ n : ℤ, |x i - σ i - n * ℓ| < 1} + +/-- The core box indexed by `k : Fin d → ℤ`: the product of the intervals +`I_{i,k_i} = [σ_i + k_i ℓ + 1, σ_i + (k_i+1) ℓ − 1]`. -/ +def coreBox (ℓ : ℝ) (σ : Vec d) (k : Fin d → ℤ) : Set (Vec d) := + Set.pi Set.univ + (fun i => Set.Icc (σ i + k i * ℓ + 1) (σ i + (k i + 1) * ℓ - 1)) + +theorem mem_corridorSet {ℓ : ℝ} {σ x : Vec d} : + x ∈ corridorSet ℓ σ ↔ ∃ i : Fin d, ∃ n : ℤ, |x i - σ i - n * ℓ| < 1 := + Iff.rfl + +theorem mem_coreBox {ℓ : ℝ} {σ x : Vec d} {k : Fin d → ℤ} : + x ∈ coreBox ℓ σ k ↔ + ∀ i : Fin d, σ i + k i * ℓ + 1 ≤ x i ∧ x i ≤ σ i + (k i + 1) * ℓ - 1 := by + simp only [coreBox, Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_Icc] + +/-! ## J3: exhaustion of the complement by core boxes -/ + +/-- One-dimensional heart of the exhaustion: a real number `t` is at +(sup-)distance `≥ 1` from every point of `ℓ • ℤ` iff it lies in one of the +core intervals `[m ℓ + 1, (m+1) ℓ − 1]`. Needs only `0 < ℓ`. -/ +theorem forall_one_le_abs_iff {ℓ : ℝ} (hℓ : 0 < ℓ) (t : ℝ) : + (∀ n : ℤ, 1 ≤ |t - n * ℓ|) ↔ + ∃ m : ℤ, m * ℓ + 1 ≤ t ∧ t ≤ (m + 1) * ℓ - 1 := by + constructor + · intro h + refine ⟨⌊t / ℓ⌋, ?_, ?_⟩ + · have hle : (⌊t / ℓ⌋ : ℝ) * ℓ ≤ t := (le_div_iff₀ hℓ).1 (Int.floor_le _) + have hnn : 0 ≤ t - (⌊t / ℓ⌋ : ℝ) * ℓ := by linarith + have := h ⌊t / ℓ⌋ + rw [abs_of_nonneg hnn] at this + linarith + · have hlt : t < ((⌊t / ℓ⌋ : ℝ) + 1) * ℓ := by + have := Int.lt_floor_add_one (t / ℓ) + rw [div_lt_iff₀ hℓ] at this + linarith [this] + have hnp : t - ((⌊t / ℓ⌋ : ℝ) + 1) * ℓ ≤ 0 := by nlinarith + have hkey := h (⌊t / ℓ⌋ + 1) + have hcast : ((⌊t / ℓ⌋ + 1 : ℤ) : ℝ) = (⌊t / ℓ⌋ : ℝ) + 1 := by push_cast; ring + rw [hcast, abs_of_nonpos hnp] at hkey + linarith + · rintro ⟨m, hlo, hhi⟩ n + rcases le_or_gt n m with hnm | hmn + · have hcast : (n : ℝ) ≤ (m : ℝ) := by exact_mod_cast hnm + have hmul : (n : ℝ) * ℓ ≤ (m : ℝ) * ℓ := + mul_le_mul_of_nonneg_right hcast hℓ.le + have : (1 : ℝ) ≤ t - n * ℓ := by linarith + calc (1 : ℝ) ≤ t - n * ℓ := this + _ ≤ |t - n * ℓ| := le_abs_self _ + · have hcast : (m : ℝ) + 1 ≤ (n : ℝ) := by exact_mod_cast hmn + have hmul : ((m : ℝ) + 1) * ℓ ≤ (n : ℝ) * ℓ := + mul_le_mul_of_nonneg_right hcast hℓ.le + have : (1 : ℝ) ≤ n * ℓ - t := by nlinarith + calc (1 : ℝ) ≤ -(t - n * ℓ) := by linarith + _ ≤ |t - n * ℓ| := neg_le_abs _ + +/-- Exhaustion (J3): the complement of the corridor set is the union of the +core boxes. Needs only `0 < ℓ`. -/ +theorem compl_corridorSet_eq_iUnion_coreBox {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) : + (corridorSet ℓ σ)ᶜ = ⋃ k : Fin d → ℤ, coreBox ℓ σ k := by + ext x + simp only [Set.mem_compl_iff, mem_corridorSet, Set.mem_iUnion, mem_coreBox] + push Not + have key : ∀ i : Fin d, + (∀ n : ℤ, 1 ≤ |x i - σ i - n * ℓ|) ↔ + ∃ m : ℤ, σ i + m * ℓ + 1 ≤ x i ∧ x i ≤ σ i + (m + 1) * ℓ - 1 := by + intro i + have h := forall_one_le_abs_iff hℓ (x i - σ i) + simp only [sub_sub] at h ⊢ + rw [h] + constructor + · rintro ⟨m, h1, h2⟩; exact ⟨m, by linarith, by linarith⟩ + · rintro ⟨m, h1, h2⟩; exact ⟨m, by linarith, by linarith⟩ + calc (∀ i : Fin d, ∀ n : ℤ, 1 ≤ |x i - σ i - n * ℓ|) + ↔ ∀ i : Fin d, ∃ m : ℤ, σ i + m * ℓ + 1 ≤ x i ∧ x i ≤ σ i + (m + 1) * ℓ - 1 := + forall_congr' key + _ ↔ ∃ k : Fin d → ℤ, ∀ i : Fin d, + σ i + k i * ℓ + 1 ≤ x i ∧ x i ≤ σ i + (k i + 1) * ℓ - 1 := + Classical.skolem + +/-! ## J4: sup-metric separation of distinct core boxes -/ + +/-- Two distinct core boxes are separated by a gap of at least `2` in some +coordinate, hence (in the sup metric on `Vec d`) by `AreUnitSeparated`. +Needs `0 ≤ ℓ`. -/ +theorem areUnitSeparated_coreBox {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) + {k k' : Fin d → ℤ} (hne : k ≠ k') : + AreUnitSeparated (coreBox ℓ σ k) (coreBox ℓ σ k') := by + obtain ⟨i, hi⟩ := Function.ne_iff.1 hne + intro x y hx hy + rw [mem_coreBox] at hx hy + obtain ⟨hx1, hx2⟩ := hx i + obtain ⟨hy1, hy2⟩ := hy i + have hgap : 2 ≤ |x i - y i| := by + rcases lt_or_gt_of_ne hi with hlt | hgt + · -- k i < k' i : the `k'`-box lies to the right of the `k`-box + have hc : (k i : ℝ) + 1 ≤ (k' i : ℝ) := by exact_mod_cast hlt + have hmul : ((k i : ℝ) + 1) * ℓ ≤ (k' i : ℝ) * ℓ := + mul_le_mul_of_nonneg_right hc hℓ + have : x i - y i ≤ -2 := by nlinarith + rw [abs_of_nonpos (by linarith)]; linarith + · -- k' i < k i : the `k`-box lies to the right of the `k'`-box + have hc : (k' i : ℝ) + 1 ≤ (k i : ℝ) := by exact_mod_cast hgt + have hmul : ((k' i : ℝ) + 1) * ℓ ≤ (k i : ℝ) * ℓ := + mul_le_mul_of_nonneg_right hc hℓ + have : (2 : ℝ) ≤ x i - y i := by nlinarith + rw [abs_of_nonneg (by linarith)]; linarith + have hxi : |x i - y i| ≤ dist x y := by + have := dist_le_pi_dist x y i + rwa [Real.dist_eq] at this + linarith + +/-! ## J5: finiteness of the cores meeting a bounded set -/ + +/-- Finiteness (J5): only finitely many core boxes meet a bounded set `U`. +Provided as `Set.Finite`; consumers can take `.toFinset`. Needs `0 < ℓ`. -/ +theorem finite_coreBox_meets {ℓ : ℝ} (hℓ : 0 < ℓ) (σ : Vec d) {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : + {k : Fin d → ℤ | (coreBox ℓ σ k ∩ U).Nonempty}.Finite := by + obtain ⟨R, hR⟩ := hU.subset_closedBall 0 + -- per-coordinate integer bounds for the admissible indices + set B : Fin d → ℤ := fun i => ⌊(R - σ i - 1) / ℓ⌋ with hB + set A : Fin d → ℤ := fun i => ⌈(-R - σ i + 1) / ℓ - 1⌉ with hA + apply Set.Finite.subset + (Set.Finite.pi (fun i => Set.finite_Icc (A i) (B i))) + rintro k ⟨z, hz_core, hz_U⟩ i - + rw [mem_coreBox] at hz_core + obtain ⟨hlo, hhi⟩ := hz_core i + -- `|z i| ≤ R` from `z ∈ closedBall 0 R` + have hzR : |z i| ≤ R := by + have hdist : dist z 0 ≤ R := by + have := hR hz_U + rwa [Metric.mem_closedBall] at this + have := dist_le_pi_dist z 0 i + rw [Real.dist_eq] at this + simp only [Pi.zero_apply, sub_zero] at this + linarith + have hziR : z i ≤ R := (abs_le.1 hzR).2 + have hzRi : -R ≤ z i := (abs_le.1 hzR).1 + refine Set.mem_Icc.2 ⟨?_, ?_⟩ + · -- lower bound `A i ≤ k i` + rw [hA, Int.ceil_le] + have hstep : -R - σ i + 1 ≤ (k i + 1) * ℓ := by nlinarith + have : (-R - σ i + 1) / ℓ ≤ (k i : ℝ) + 1 := by + rw [div_le_iff₀ hℓ]; linarith + linarith + · -- upper bound `k i ≤ B i` + rw [hB, Int.le_floor] + have hstep : (k i : ℝ) * ℓ ≤ R - σ i - 1 := by nlinarith + rw [le_div_iff₀ hℓ]; linarith + +/-! ## J7: the corridor-modified coefficient field -/ + +variable {Θ : ℝ} + +/-- The identity matrix is `(1, Θ)`-elliptic for every `Θ ≥ 1`. -/ +theorem isEllipticMatrix_one (hΘ : 1 ≤ Θ) : + IsEllipticMatrix (d := d) 1 Θ (1 : Mat d) := by + have hmv : ∀ ξ : Vec d, matVecMul (1 : Mat d) ξ = ξ := by + intro ξ; funext i + simp only [matVecMul, Matrix.one_apply] + rw [Finset.sum_eq_single i] + · simp + · intro j _ hji; rw [if_neg (Ne.symm hji), zero_mul] + · intro hi; exact absurd (Finset.mem_univ i) hi + refine ⟨one_pos, hΘ, ?_, ?_⟩ + · intro ξ + rw [hmv]; simp [vecNormSq] + · intro ξ + rw [inv_one, hmv] + have hnn : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + have hΘinv : Θ⁻¹ ≤ 1 := by + rw [inv_le_one_iff₀]; right; exact hΘ + calc Θ⁻¹ * vecNormSq ξ ≤ 1 * vecNormSq ξ := + mul_le_mul_of_nonneg_right hΘinv hnn + _ = vecDot ξ ξ := by simp [vecNormSq] + +/-- The corridor-modified coefficient (`e.corridor.coefficient`): the identity +on the corridor set, and `a` off it. -/ +noncomputable def corridorField (ℓ : ℝ) (σ : Vec d) (a : CoeffField d) : + CoeffField d := by + classical + exact fun x => if x ∈ corridorSet ℓ σ then (1 : Mat d) else a x + +@[simp] theorem corridorField_apply_of_mem {ℓ : ℝ} {σ : Vec d} {a : CoeffField d} + {x : Vec d} (hx : x ∈ corridorSet ℓ σ) : + corridorField ℓ σ a x = (1 : Mat d) := by + simp [corridorField, hx] + +@[simp] theorem corridorField_apply_of_not_mem {ℓ : ℝ} {σ : Vec d} + {a : CoeffField d} {x : Vec d} (hx : x ∉ corridorSet ℓ σ) : + corridorField ℓ σ a x = a x := by + simp [corridorField, hx] + +/-- (J7.iii) Off the corridor set, `corridorField ℓ σ a` agrees with `a`. -/ +theorem corridorField_eqOn_compl (ℓ : ℝ) (σ : Vec d) (a : CoeffField d) : + Set.EqOn (corridorField ℓ σ a) a (corridorSet ℓ σ)ᶜ := + fun _ hx => corridorField_apply_of_not_mem hx + +/-- (J7.i) Pointwise preservation of the ellipticity class: wherever `a x` is +`(1, Θ)`-elliptic (and `Θ ≥ 1`), so is `corridorField ℓ σ a x`. -/ +theorem corridorField_isEllipticMatrix {ℓ : ℝ} {σ : Vec d} {a : CoeffField d} + {x : Vec d} (hΘ : 1 ≤ Θ) (hx : IsEllipticMatrix 1 Θ (a x)) : + IsEllipticMatrix 1 Θ (corridorField ℓ σ a x) := by + by_cases hmem : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hmem]; exact isEllipticMatrix_one hΘ + · rw [corridorField_apply_of_not_mem hmem]; exact hx + +/-- (J7.ii) Additive/indicator normal form, convenient for later joint +measurability arguments: +`a_σ = a + 𝟙_{S_σ} · (Id − a)`. -/ +theorem corridorField_eq_add_indicator (ℓ : ℝ) (σ : Vec d) (a : CoeffField d) : + corridorField ℓ σ a = + fun x => a x + (corridorSet ℓ σ).indicator (fun y => (1 : Mat d) - a y) x := by + funext x + by_cases hmem : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hmem, Set.indicator_of_mem hmem]; abel + · rw [corridorField_apply_of_not_mem hmem, Set.indicator_of_notMem hmem, add_zero] + +/-- (J7, restriction compatibility) `corridorField ℓ σ a` depends on `a` only +through its values off the corridor set. -/ +theorem corridorField_congr_of_eqOn_compl {ℓ : ℝ} {σ : Vec d} {a a' : CoeffField d} + (h : Set.EqOn a a' (corridorSet ℓ σ)ᶜ) : + corridorField ℓ σ a = corridorField ℓ σ a' := by + funext x + by_cases hmem : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hmem, corridorField_apply_of_mem hmem] + · rw [corridorField_apply_of_not_mem hmem, corridorField_apply_of_not_mem hmem] + exact h hmem + +/-! ## J8: independence bridge to unit-range dependence -/ + +/-- (J8, geometric input) The core boxes of an injective family of indices are +pairwise `AreUnitSeparated`. Needs `0 ≤ ℓ`. -/ +theorem pairwise_areUnitSeparated_coreBox {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) + {ι : Type*} {k : ι → (Fin d → ℤ)} (hk : Function.Injective k) : + Pairwise fun i j => AreUnitSeparated (coreBox ℓ σ (k i)) (coreBox ℓ σ (k j)) := + fun _ _ hij => areUnitSeparated_coreBox hℓ σ (fun h => hij (hk h)) + +/-- For an injective family of core indices, any measurable local observables +supported on the corresponding cores are jointly independent under a +unit-range-dependent (in the restriction sense) probability measure. This is +the shape consumed by the Efron–Stein step: combine +`pairwise_areUnitSeparated_coreBox` with the unit-range dependence machinery. -/ +theorem iIndepFun_coreBox_observable {ℓ : ℝ} (hℓ : 0 ≤ ℓ) (σ : Vec d) + {ι : Type*} [DecidableEq ι] {γ : ι → Type*} [∀ i, MeasurableSpace (γ i)] + {k : ι → (Fin d → ℤ)} (hk : Function.Injective k) + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : ∀ i, MeasurableRestrictionLocalObservable d (coreBox ℓ σ (k i)) (γ i)) : + ProbabilityTheory.iIndepFun (fun i => X i) P := + MeasurableRestrictionLocalObservable.iIndepFun_of_isRestrictionUnitRangeDependent hP + (pairwise_areUnitSeparated_coreBox hℓ σ hk) X + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison.lean new file mode 100644 index 0000000000..43f679736b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Averaging +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.GridCoverage +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Measurability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Averaging.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Averaging.lean new file mode 100644 index 0000000000..a39108c6f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Averaging.lean @@ -0,0 +1,368 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Stability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.GridCoverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.AeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich + +/-! +# Grid averaging + choice + +Statement of `p.phase.comparison`'s conclusions `e.phase.comparison.average` / +`e.phase.comparison.choice` in the discrete-grid setting, plus the C4-glue lemma. + +## C4 glue + +`ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw` turns the amended +`ThetaEllipticLaw Θ L` (whose measurability conjunct is exactly what makes this +possible) into the a.s. C1′ two-sided bound on the coarse observable, by routing +each realization through the C2 truncation bridge `exists_ellipticFieldOn_ae_eq` +to an everywhere-`(1,Θ)`-elliptic representative with the **same** coarse block +matrix, then applying the deterministic C1′ sandwich. + +## The averaging argument + +M2 pointwise-in-`a`; exchange `∫ ∂L` with the finite grid sum +(`integral_finset_sum`); M0 coverage `sum_indicator_gridPhase_corridor_le` +(constant `3d/ℓ`); the C4-glue `F ≤ 2M²`; `|F_σ − F|² ≤ 4M²·|F_σ − F|`; below-average +member of the nonempty grid (`N ≥ ℓ ≥ 4 > 0`). `M² := Θ·|p|² + |q|²`. +-/ + +@[expose] public section + +open Homogenization +open Homogenization.Book.Ch04 (RestrictionCoeffLaw RestrictionLawCarrier) +open MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-- **C4 glue.** Under the amended `ThetaEllipticLaw Θ L`, the coarse block +observable a.s. satisfies the C1′ two-sided bound `0 ≤ F ≤ 2(Θ|p|² + |q|²)`. + +The measurability conjunct of `ThetaEllipticLaw` supplies the entrywise +measurability that the C2 bridge `exists_ellipticFieldOn_ae_eq` needs; that +bridge produces, from each a.s. realization, an everywhere-`(1,Θ)`-elliptic +representative `a'` with `coarseBlockMatrix U a' = coarseBlockMatrix U a`, whence +the deterministic C1′ sandwich (`zero_le_blockVecDot_coarseBlockMatrix_cube`, +`blockVecDot_coarseBlockMatrix_cube_le`) transfers. -/ +theorem ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw [NeZero d] {L : RestrictionCoeffLaw d} + {Θ : ℝ} (hΘ : 1 ≤ Θ) (hell : ThetaEllipticLaw Θ L) (m : ℤ) (P : BlockVec d) : + ∀ᵐ a ∂L, + 0 ≤ blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) ∧ + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) ≤ + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) := by + classical + filter_upwards [hell] with a haeEll + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + have hmeasA : + Measurable (fun x => fun i j => + if x ∈ cubeSet (originCube d m) then a x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (a.entry_measurable i j).indicator hU + have haeU : ∀ᵐ x ∂(volume.restrict (cubeSet (originCube d m))), + IsEllipticMatrix 1 Θ (a x) := ae_restrict_of_ae haeEll + obtain ⟨a', hEll', _, hcoarse, _⟩ := exists_ellipticFieldOn_ae_eq hU hΘ hmeasA haeU + rw [← hcoarse] + exact ⟨zero_le_blockVecDot_coarseBlockMatrix_cube hEll' P, + blockVecDot_coarseBlockMatrix_cube_le hEll' P⟩ + +/-! ## Per-realization summed bound + +For a single measurable, a.e.-`(1,Θ)`-elliptic realization `a`, pass it through +the C2 bridge to an everywhere-elliptic representative `a'` with the same coarse +block matrices, take the minimizer `Z` for `a'` (one `Z` serves every phase), +apply M2-core per phase, and sum with the M0 grid-coverage count `3d/ℓ` and the +C1′ energy bound `F ≤ 2M²`. -/ + +/-- The finite-grid summed square deviation, bounded pointwise-in-`a` by +`576 d Θ N^d (M²)² / ℓ`, together with the per-phase bound `≤ 2M²`, for any +measurable a.e.-`(1,Θ)`-elliptic realization. -/ +theorem gridPhase_summed_sq_le_of_realization [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {ℓ : ℝ} (hℓ : 4 ≤ ℓ) {N : ℕ} (hN : (ℓ : ℝ) ≤ (N : ℝ)) (P : BlockVec d) + {a : CoeffField d} + (hmeas : ∀ i j : Fin d, Measurable fun x : Vec d => a x i j) + (haeEll : ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (a x)) : + (∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P)| + ≤ 2 * (Θ * vecNormSq P.1 + vecNormSq P.2)) ∧ + ∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P)| ^ 2 + ≤ 576 * (d : ℝ) * Θ * (N : ℝ) ^ d * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 / ℓ := by + classical + set U := cubeSet (originCube d m) with hUdef + have hU : MeasurableSet U := measurableSet_cubeSet (originCube d m) + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by rw [hUdef]; infer_instance + have hΘpos : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hℓ0 : (0 : ℝ) < ℓ := by linarith + set Msq := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘpos.le (vecNormSq_nonneg P.1)) (vecNormSq_nonneg P.2) + -- C2 bridge to an everywhere-elliptic representative + have hmeasA : Measurable (fun x => fun i j => if x ∈ U then a x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (hmeas i j).indicator hU + have haeU : ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix 1 Θ (a x) := ae_restrict_of_ae haeEll + obtain ⟨a', hEll', ha'ae, hcoarse, _hblockae⟩ := exists_ellipticFieldOn_ae_eq hU hΘ hmeasA haeU + obtain ⟨Z, hZadm, hZeng, hZresp⟩ := exists_cubeBlockMinimizer hEll' P + -- transport the corridor coarse matrices from `a` to `a'` + have hcorreq : ∀ σ : Fin d → Fin N, + coarseBlockMatrix U (corridorField ℓ (gridPhase ℓ N σ) a) + = coarseBlockMatrix U (corridorField ℓ (gridPhase ℓ N σ) a') := by + intro σ + refine coarseBlockMatrix_congr_of_ae_eq ?_ + filter_upwards [ha'ae] with x hx + by_cases hxc : x ∈ corridorSet ℓ (gridPhase ℓ N σ) + · rw [corridorField_apply_of_mem hxc, corridorField_apply_of_mem hxc] + · rw [corridorField_apply_of_not_mem hxc, corridorField_apply_of_not_mem hxc]; exact hx.symm + simp_rw [hcorreq, ← hcoarse] + -- per-phase `≤ 2 M²` + have hle2 : ∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| ≤ 2 * Msq := by + intro σ + have hEllφ : IsEllipticFieldOn 1 Θ U (corridorField ℓ (gridPhase ℓ N σ) a') := + isEllipticFieldOn_corridorField hU hΘ hEll' + have hFa'0 : 0 ≤ blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P) := + zero_le_blockVecDot_coarseBlockMatrix_cube hEll' P + have hFa'le : blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P) ≤ 2 * Msq := + blockVecDot_coarseBlockMatrix_cube_le hEll' P + have hFφ0 : 0 ≤ blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) := + zero_le_blockVecDot_coarseBlockMatrix_cube hEllφ P + have hFφle : blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) ≤ 2 * Msq := + blockVecDot_coarseBlockMatrix_cube_le hEllφ P + rw [abs_le]; exact ⟨by linarith, by linarith⟩ + refine ⟨hle2, ?_⟩ + -- energy machinery for the second conjunct + set c := (volume U).toReal⁻¹ with hcdef + set G := fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a' x) (Z.eval x)) + with hGdef + have hc0 : (0 : ℝ) ≤ c := inv_nonneg.mpr ENNReal.toReal_nonneg + have hGint : IntegrableOn G U := + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZadm.memBlockL2_eval hZadm.memBlockL2_eval hEll' + have hG0 : ∀ x ∈ U, 0 ≤ G x := + fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEll'.2 x hx) (Z.eval x) + have hFa'eq : blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P) = c * ∫ x in U, G x := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEll' hZeng + have hFa'le : blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P) ≤ 2 * Msq := + blockVecDot_coarseBlockMatrix_cube_le hEll' P + -- M2-core per phase (single minimizer `Z` for `a'`) + have hcore : ∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| + ≤ 48 * Θ * c * ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x := fun σ => + abs_phaseObservable_sub_le_of_minimizer hΘ P hEll' hZadm hZresp hZeng + -- coverage: Σ_σ ∫_{S_σ∩U} G ≤ (3d/ℓ) N^d ∫_U G + have hcov : ∑ σ : Fin d → Fin N, ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x + ≤ 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d * ∫ x in U, G x := by + have hrw : ∀ σ : Fin d → Fin N, + (∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x) + = ∫ x in U, (corridorSet ℓ (gridPhase ℓ N σ)).indicator G x := by + intro σ + rw [setIntegral_indicator (measurableSet_corridorSet ℓ (gridPhase ℓ N σ)), + Set.inter_comm U (corridorSet ℓ (gridPhase ℓ N σ))] + simp_rw [hrw] + rw [← integral_finsetSum _ + (fun σ _ => hGint.indicator (measurableSet_corridorSet ℓ (gridPhase ℓ N σ)))] + rw [show 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d * ∫ x in U, G x + = ∫ x in U, 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d * G x from (integral_const_mul _ _).symm] + refine setIntegral_mono_on + (integrable_finsetSum _ + (fun σ _ => hGint.indicator (measurableSet_corridorSet ℓ (gridPhase ℓ N σ)))) + (hGint.const_mul _) hU (fun x hx => ?_) + have hGx : 0 ≤ G x := hG0 x hx + have hfact : (∑ σ : Fin d → Fin N, (corridorSet ℓ (gridPhase ℓ N σ)).indicator G x) + = G x * ∑ σ : Fin d → Fin N, + (corridorSet ℓ (gridPhase ℓ N σ)).indicator (fun _ => (1 : ℝ)) x := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl (fun σ _ => ?_) + by_cases hxc : x ∈ corridorSet ℓ (gridPhase ℓ N σ) + · simp [Set.indicator_of_mem hxc] + · simp [Set.indicator_of_notMem hxc] + rw [hfact] + calc G x * ∑ σ : Fin d → Fin N, + (corridorSet ℓ (gridPhase ℓ N σ)).indicator (fun _ => (1 : ℝ)) x + ≤ G x * (3 * (d : ℝ) / ℓ * (N : ℝ) ^ d) := + mul_le_mul_of_nonneg_left (sum_indicator_gridPhase_corridor_le hℓ hN x) hGx + _ = 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d * G x := by ring + -- combine + have hcoef0 : (0 : ℝ) ≤ 2 * Msq * (48 * Θ * c) := + mul_nonneg (by linarith [hMsq0]) + (mul_nonneg (mul_nonneg (by norm_num) hΘpos.le) hc0) + have hcoef2 : (0 : ℝ) ≤ 2 * Msq * 48 * Θ * (3 * (d : ℝ) / ℓ) * (N : ℝ) ^ d := by + have h1 : (0 : ℝ) ≤ 2 * Msq := by linarith [hMsq0] + have h2 : (0 : ℝ) ≤ 3 * (d : ℝ) / ℓ := div_nonneg (by positivity) hℓ0.le + exact mul_nonneg (mul_nonneg (mul_nonneg (mul_nonneg h1 (by norm_num)) hΘpos.le) h2) + (by positivity) + have hkey : ∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| ^ 2 + ≤ 2 * Msq * (48 * Θ * c) * ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x := by + intro σ + have hd0 := abs_nonneg (blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)) + calc |blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| ^ 2 + = |blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| * + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| := by ring + _ ≤ (2 * Msq) * + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| := + mul_le_mul_of_nonneg_right (hle2 σ) hd0 + _ ≤ (2 * Msq) * (48 * Θ * c * ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x) := + mul_le_mul_of_nonneg_left (hcore σ) (by linarith [hMsq0]) + _ = 2 * Msq * (48 * Θ * c) * ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x := by ring + calc ∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix U + (corridorField ℓ (gridPhase ℓ N σ) a')) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P)| ^ 2 + ≤ ∑ σ : Fin d → Fin N, + 2 * Msq * (48 * Θ * c) * ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x := + Finset.sum_le_sum (fun σ _ => hkey σ) + _ = 2 * Msq * (48 * Θ * c) * + ∑ σ : Fin d → Fin N, ∫ x in corridorSet ℓ (gridPhase ℓ N σ) ∩ U, G x := by + rw [Finset.mul_sum] + _ ≤ 2 * Msq * (48 * Θ * c) * (3 * (d : ℝ) / ℓ * (N : ℝ) ^ d * ∫ x in U, G x) := + mul_le_mul_of_nonneg_left hcov hcoef0 + _ = 2 * Msq * 48 * Θ * (3 * (d : ℝ) / ℓ) * (N : ℝ) ^ d * (c * ∫ x in U, G x) := by ring + _ = 2 * Msq * 48 * Θ * (3 * (d : ℝ) / ℓ) * (N : ℝ) ^ d * + blockVecDot P (blockMatVecMul (coarseBlockMatrix U a') P) := by rw [← hFa'eq] + _ ≤ 2 * Msq * 48 * Θ * (3 * (d : ℝ) / ℓ) * (N : ℝ) ^ d * (2 * Msq) := + mul_le_mul_of_nonneg_left hFa'le hcoef2 + _ = 576 * (d : ℝ) * Θ * (N : ℝ) ^ d * Msq ^ 2 / ℓ := by ring + +/-- **M3 (averaging + choice).** Under a `RestrictionLawCarrier` `Θ`-elliptic law and +`4 ≤ ℓ ≤ N`, there is a deterministic grid phase `σ_*` whose mean-square coarse +deviation is `O(ℓ⁻¹)`, with an explicit dimensional constant `Cd = 576 d`. The +per-realization summed bound `gridPhase_summed_sq_le_of_realization` is averaged +over the probability law and a below-average phase is selected. -/ +theorem exists_gridPhase_meanSq_le [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {L : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier L) (hell : ThetaEllipticLaw Θ L) + {m : ℤ} {ℓ : ℝ} (hℓ : 4 ≤ ℓ) {N : ℕ} (hN : (ℓ : ℝ) ≤ (N : ℝ)) + (P : BlockVec d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∃ σ ∈ (Finset.univ : Finset (Fin d → Fin N)), + ∫ a, + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L ≤ + Cd * Θ * ℓ⁻¹ * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + have : IsProbabilityMeasure L := hP.isProbability + set Msq := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hΘpos : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hN0 : (0 : ℝ) < (N : ℝ) := lt_of_lt_of_le hℓ0 hN + have hNpow0 : (0 : ℝ) < (N : ℝ) ^ d := by positivity + set B := 576 * (d : ℝ) * Θ * (N : ℝ) ^ d * Msq ^ 2 / ℓ with hBdef + -- a.e. per-realization bounds + have hAE : ∀ᵐ a ∂L, + (∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| + ≤ 2 * Msq) ∧ + (∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ≤ B) := by + filter_upwards [hell] with a ha + exact gridPhase_summed_sq_le_of_realization hΘ hℓ hN P + (fun i j => a.entry_measurable i j) ha + -- integrability of each squared deviation + have hInt : ∀ σ : Fin d → Fin N, + Integrable (fun a => + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2) + L := by + intro σ + have hFφ := aestronglyMeasurable_phaseObservable hP m ℓ (gridPhase ℓ N σ) P + have hF := aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP m P + have hmeas : AEStronglyMeasurable (fun a => + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2) + L := by + have h2 : AEStronglyMeasurable (fun a => + (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) ^ 2) + L := by simpa [pow_two] using! (hFφ.sub hF).mul (hFφ.sub hF) + simpa [sq_abs] using h2 + refine (integrable_const (4 * Msq ^ 2)).mono' hmeas ?_ + filter_upwards [hAE] with a ha + have h1 := ha.1 σ + have h0 := abs_nonneg (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) + rw [Real.norm_eq_abs, abs_of_nonneg (by positivity)] + nlinarith [h1, h0] + -- exchange the finite sum with the integral, bound by the constant `B` + have hsum : ∑ σ : Fin d → Fin N, + ∫ a, |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L + ≤ B := by + rw [← integral_finsetSum _ (fun σ _ => hInt σ)] + calc ∫ a, ∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L + ≤ ∫ _a, B ∂L := + integral_mono_ae (integrable_finsetSum _ (fun σ _ => hInt σ)) (integrable_const B) + (by filter_upwards [hAE] with a ha; exact ha.2) + _ = B := by rw [integral_const]; simp + -- choose a below-average phase + have hcard : (Finset.univ : Finset (Fin d → Fin N)).card = N ^ d := by + rw [Finset.card_univ, Fintype.card_fun, Fintype.card_fin, Fintype.card_fin] + have hne : (Finset.univ : Finset (Fin d → Fin N)).Nonempty := by + have hNpos : 0 < N := by exact_mod_cast hN0 + have : Nonempty (Fin N) := ⟨⟨0, hNpos⟩⟩ + exact Finset.univ_nonempty + refine ⟨576 * (d : ℝ), by positivity, ?_⟩ + have hgsum : (∑ _σ : Fin d → Fin N, B / (N : ℝ) ^ d) = B := by + rw [Finset.sum_const, hcard, nsmul_eq_mul] + push_cast + field_simp + obtain ⟨σ, hσuniv, hσ⟩ := Finset.exists_le_of_sum_le hne + (show (∑ σ : Fin d → Fin N, + ∫ a, |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L) + ≤ ∑ _σ : Fin d → Fin N, B / (N : ℝ) ^ d from by rw [hgsum]; exact hsum) + refine ⟨σ, hσuniv, ?_⟩ + have hBdiv : B / (N : ℝ) ^ d = 576 * (d : ℝ) * Θ * ℓ⁻¹ * Msq ^ 2 := by + rw [hBdef]; field_simp + rw [← hBdiv]; exact hσ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/GridCoverage.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/GridCoverage.lean new file mode 100644 index 0000000000..f91bb8afdf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/GridCoverage.lean @@ -0,0 +1,245 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry + +/-! +# Discrete uniform-grid corridor coverage count + +Phase comparison (Prop 4.4 of the high-moment paper, Armstrong–Kuusi–Loher, in +preparation) is proved with the continuum `σ`-average replaced by a finite +uniform grid `gridPhase ℓ N j i = (j i) · ℓ / N` for `j : Fin d → Fin N`. This +file records the elementary grid-counting coverage bound that replaces the +continuum corridor-coverage estimate `e.corridor.coverage`: + +* `card_gridHits_le` (**1-d heart**): for `4 ≤ ℓ` and `ℓ ≤ N`, at most `3N/ℓ` + of the `N` grid points `c ↦ c·ℓ/N` land within (sup-)distance `1` of a fixed + real `t` modulo `ℓ`. The bound is via an injection of the admissible grid + indices into the integer points of an open interval of length `2N/ℓ`. +* `sum_indicator_gridPhase_corridor_le` (**d-dim corollary**): for a fixed `x`, + the number of grid phases `σ_j` whose corridor set contains `x`, summed as + indicators over `Finset.univ : Finset (Fin d → Fin N)`, is at most + `(3d/ℓ)·N^d`; i.e. the average of the corridor indicators over the grid is at + most `3d/ℓ`. + +Only `4 ≤ ℓ` and `ℓ ≤ N` are used; the constant `3` is not sharp (any +`C·N/ℓ` is acceptable, absorbed into `C_d` downstream). +-/ + +@[expose] public section + +open Homogenization +open scoped MeasureTheory +open Classical + +namespace Homogenization + +variable {d : ℕ} + +/-- The finite uniform phase grid: `gridPhase ℓ N j` is the phase vector with +`i`-th coordinate `(j i)·ℓ/N`. -/ +noncomputable def gridPhase (ℓ : ℝ) (N : ℕ) (j : Fin d → Fin N) : Vec d := + fun i => (j i : ℝ) * ℓ / N + +@[simp] theorem gridPhase_apply (ℓ : ℝ) (N : ℕ) (j : Fin d → Fin N) (i : Fin d) : + gridPhase ℓ N j i = (j i : ℝ) * ℓ / N := rfl + +/-- Cast bound: `(k.toNat : ℝ) ≤ r` whenever `(k:ℝ) ≤ r` and `0 ≤ r`. -/ +private theorem toNat_cast_le {k : ℤ} {r : ℝ} (h : (k : ℝ) ≤ r) (hr : 0 ≤ r) : + ((k.toNat : ℕ) : ℝ) ≤ r := by + rcases le_or_gt 0 k with hk | hk + · have : ((k.toNat : ℤ) : ℝ) = (k : ℝ) := by + rw [Int.toNat_of_nonneg hk] + rw [show ((k.toNat : ℕ) : ℝ) = ((k.toNat : ℤ) : ℝ) by push_cast; ring, this] + exact h + · rw [Int.toNat_of_nonpos hk.le] + simpa using hr + +/-! ## 1-d heart -/ + +/-- **M0 (1-d count).** For `4 ≤ ℓ` and `ℓ ≤ N`, at most `3N/ℓ` of the grid +points `c ↦ c·ℓ/N`, `c : Fin N`, lie within sup-distance `1` of `t` modulo the +lattice `ℓ·ℤ`. -/ +theorem card_gridHits_le {ℓ : ℝ} (hℓ : 4 ≤ ℓ) {N : ℕ} (hN : (ℓ : ℝ) ≤ (N : ℝ)) + (t : ℝ) : + ((Finset.univ.filter + (fun c : Fin N => ∃ n : ℤ, |t - (c : ℝ) * ℓ / N - n * ℓ| < 1)).card : ℝ) + ≤ 3 * N / ℓ := by + classical + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hN0 : (0 : ℝ) < (N : ℝ) := lt_of_lt_of_le hℓ0 hN + have hNne : (N : ℝ) ≠ 0 := hN0.ne' + set a : ℝ := (t - 1) * N / ℓ with ha + set b : ℝ := (t + 1) * N / ℓ with hb + set A : Finset (Fin N) := + Finset.univ.filter (fun c : Fin N => ∃ n : ℤ, |t - (c : ℝ) * ℓ / N - n * ℓ| < 1) + with hA + -- choice of shift for each admissible index + set ncf : Fin N → ℤ := + fun c => if h : ∃ n : ℤ, |t - (c : ℝ) * ℓ / N - n * ℓ| < 1 then Classical.choose h else 0 + with hncf + set g : Fin N → ℤ := fun c => (c : ℤ) + ncf c * N with hg + -- the injection lands in the integer points of the open interval `(a, b)` + have hmaps : ∀ c ∈ A, g c ∈ Finset.Ioo ⌊a⌋ ⌈b⌉ := by + intro c hc + rw [hA, Finset.mem_filter] at hc + have hex := hc.2 + have hncfc : ncf c = Classical.choose hex := by + simp only [hncf]; exact dif_pos hex + have hspec : |t - (c : ℝ) * ℓ / N - (ncf c) * ℓ| < 1 := by + rw [hncfc]; exact Classical.choose_spec hex + -- rewrite the argument as `t - (g c)·ℓ/N` + have hgcR : (g c : ℝ) = (c : ℝ) + (ncf c : ℝ) * (N : ℝ) := by + rw [hg]; push_cast; ring + have hkey : t - (c : ℝ) * ℓ / N - (ncf c) * ℓ = t - (g c : ℝ) * ℓ / N := by + rw [hgcR]; field_simp; ring + rw [hkey, abs_lt] at hspec + obtain ⟨hlo, hhi⟩ := hspec + -- clear denominators + have hhi' : (t - 1) * (N : ℝ) < (g c : ℝ) * ℓ := by + have h : t - 1 < (g c : ℝ) * ℓ / N := by linarith + rw [lt_div_iff₀ hN0] at h; linarith + have hlo' : (g c : ℝ) * ℓ < (t + 1) * (N : ℝ) := by + have h : (g c : ℝ) * ℓ / N < t + 1 := by linarith + rw [div_lt_iff₀ hN0] at h; linarith + -- `a < g c < b` + have hgc_lo : a < (g c : ℝ) := by + rw [ha, div_lt_iff₀ hℓ0]; linarith + have hgc_hi : (g c : ℝ) < b := by + rw [hb, lt_div_iff₀ hℓ0]; linarith + rw [Finset.mem_Ioo] + exact ⟨Int.floor_lt.2 hgc_lo, Int.lt_ceil.2 hgc_hi⟩ + -- the injection is injective on `A` + have hinj : Set.InjOn g A := by + intro c hc c' hc' hgg + have hgg2 : (c : ℤ) + ncf c * (N : ℤ) = (c' : ℤ) + ncf c' * (N : ℤ) := hgg + have hdvd : (N : ℤ) ∣ ((c : ℤ) - (c' : ℤ)) := + ⟨ncf c' - ncf c, by linear_combination hgg2⟩ + have h1 : (c : ℤ) < N := by exact_mod_cast c.isLt + have h2 : (c' : ℤ) < N := by exact_mod_cast c'.isLt + have h3 : (0 : ℤ) ≤ (c : ℤ) := by positivity + have h4 : (0 : ℤ) ≤ (c' : ℤ) := by positivity + have habs : |(c : ℤ) - (c' : ℤ)| < (N : ℤ) := by rw [abs_lt]; constructor <;> omega + have hzero : (c : ℤ) - (c' : ℤ) = 0 := Int.eq_zero_of_abs_lt_dvd hdvd habs + have hcc : (c : ℤ) = (c' : ℤ) := by omega + exact Fin.ext (by exact_mod_cast hcc) + -- card comparison + have hcard : A.card ≤ (Finset.Ioo ⌊a⌋ ⌈b⌉).card := + Finset.card_le_card_of_injOn g hmaps hinj + rw [Int.card_Ioo] at hcard + -- pass to reals + have hcardR : (A.card : ℝ) ≤ ((⌈b⌉ - ⌊a⌋ - 1).toNat : ℝ) := by exact_mod_cast hcard + -- `((⌈b⌉ - ⌊a⌋ - 1).toNat : ℝ) ≤ b - a + 1` + have hba : b - a = 2 * N / ℓ := by rw [ha, hb]; field_simp; ring + have hintbound : ((⌈b⌉ - ⌊a⌋ - 1 : ℤ) : ℝ) ≤ b - a + 1 := by + have hc1 : (⌈b⌉ : ℝ) < b + 1 := Int.ceil_lt_add_one b + have hc2 : a - 1 < (⌊a⌋ : ℝ) := Int.sub_one_lt_floor a + push_cast + linarith + have hrb : (0 : ℝ) ≤ b - a + 1 := by rw [hba]; positivity + have hfin : (A.card : ℝ) ≤ b - a + 1 := + le_trans hcardR (toNat_cast_le hintbound hrb) + -- `b - a + 1 = 2N/ℓ + 1 ≤ 3N/ℓ` since `ℓ ≤ N` + have hfinal : b - a + 1 ≤ 3 * N / ℓ := by + rw [hba] + rw [div_add' _ _ _ hℓ0.ne', div_le_div_iff_of_pos_right hℓ0] + nlinarith [hN] + calc (A.card : ℝ) ≤ b - a + 1 := hfin + _ ≤ 3 * N / ℓ := hfinal + +/-! ## d-dim corollary -/ + +/-- Marginal count: the number of grid multi-indices `j : Fin d → Fin N` with a +constraint on a single coordinate `j i` factors through `N^{d-1}`. -/ +private theorem sum_eval_eq {N : ℕ} (i : Fin d) (f : Fin N → ℝ) : + (∑ j : Fin d → Fin N, f (j i)) = (N : ℝ) ^ (d - 1) * ∑ c : Fin N, f c := by + classical + have hcard : Fintype.card ({ k : Fin d // k ≠ i } → Fin N) = N ^ (d - 1) := by + rw [Fintype.card_fun, Fintype.card_fin] + congr 1 + rw [Fintype.card_subtype_compl, Fintype.card_fin, Fintype.card_subtype_eq] + rw [← Equiv.sum_comp (Equiv.funSplitAt i (Fin N)).symm (fun j => f (j i))] + rw [Fintype.sum_prod_type] + have hval : ∀ (a : Fin N) (b : { k : Fin d // k ≠ i } → Fin N), + f (((Equiv.funSplitAt i (Fin N)).symm (a, b)) i) = f a := by + intro a b + congr 1 + simp [Equiv.funSplitAt, Equiv.piSplitAt] + simp_rw [hval, Finset.sum_const, Finset.card_univ, hcard, nsmul_eq_mul] + rw [← Finset.mul_sum] + push_cast + ring + +/-- **M0 (d-dim coverage).** For a fixed `x` and `4 ≤ ℓ ≤ N`, the sum over the +finite grid `j : Fin d → Fin N` of the corridor indicators of the phases +`gridPhase ℓ N j` at `x` is at most `(3d/ℓ)·N^d`. Dividing by `N^d`, the grid +average of `𝟙_{corridorSet}` at any point is at most `3d/ℓ`. -/ +theorem sum_indicator_gridPhase_corridor_le [NeZero d] {ℓ : ℝ} (hℓ : 4 ≤ ℓ) + {N : ℕ} (hN : (ℓ : ℝ) ≤ (N : ℝ)) (x : Vec d) : + (∑ j : Fin d → Fin N, + (corridorSet ℓ (gridPhase ℓ N j)).indicator (fun _ => (1 : ℝ)) x) + ≤ 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d := by + classical + have hd1 : 1 ≤ d := Nat.one_le_iff_ne_zero.2 (NeZero.ne d) + -- per-coordinate hit indicator + set gcoord : Fin d → Fin N → ℝ := + fun i c => if (∃ n : ℤ, |x i - (c : ℝ) * ℓ / N - n * ℓ| < 1) then (1 : ℝ) else 0 + with hgcoord + -- union bound pointwise + have hunion : ∀ j : Fin d → Fin N, + (corridorSet ℓ (gridPhase ℓ N j)).indicator (fun _ => (1 : ℝ)) x + ≤ ∑ i : Fin d, gcoord i (j i) := by + intro j + by_cases hmem : x ∈ corridorSet ℓ (gridPhase ℓ N j) + · rw [Set.indicator_of_mem hmem] + rw [mem_corridorSet] at hmem + obtain ⟨i, n, hin⟩ := hmem + have hgi : gcoord i (j i) = 1 := by + simp only [hgcoord] + rw [if_pos ⟨n, by simpa [gridPhase_apply] using hin⟩] + calc (1 : ℝ) = gcoord i (j i) := hgi.symm + _ ≤ ∑ i : Fin d, gcoord i (j i) := by + apply Finset.single_le_sum (f := fun i => gcoord i (j i)) + · intro k _ + rw [hgcoord]; positivity + · exact Finset.mem_univ i + · rw [Set.indicator_of_notMem hmem] + apply Finset.sum_nonneg + intro k _ + rw [hgcoord]; positivity + -- sum the union bound and swap order + calc + (∑ j : Fin d → Fin N, + (corridorSet ℓ (gridPhase ℓ N j)).indicator (fun _ => (1 : ℝ)) x) + ≤ ∑ j : Fin d → Fin N, ∑ i : Fin d, gcoord i (j i) := + Finset.sum_le_sum (fun j _ => hunion j) + _ = ∑ i : Fin d, ∑ j : Fin d → Fin N, gcoord i (j i) := Finset.sum_comm + _ = ∑ i : Fin d, (N : ℝ) ^ (d - 1) * ∑ c : Fin N, gcoord i c := by + apply Finset.sum_congr rfl + intro i _ + exact sum_eval_eq i (gcoord i) + _ ≤ ∑ i : Fin d, (N : ℝ) ^ (d - 1) * (3 * N / ℓ) := by + apply Finset.sum_le_sum + intro i _ + apply mul_le_mul_of_nonneg_left _ (by positivity) + -- `∑_c gcoord i c = card of the 1-d hit set ≤ 3N/ℓ` + have hcard : (∑ c : Fin N, gcoord i c) + = ((Finset.univ.filter + (fun c : Fin N => ∃ n : ℤ, |x i - (c : ℝ) * ℓ / N - n * ℓ| < 1)).card : ℝ) := by + simp only [hgcoord] + rw [Finset.sum_boole] + rw [hcard] + exact card_gridHits_le hℓ hN (x i) + _ = 3 * (d : ℝ) / ℓ * (N : ℝ) ^ d := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + have hpow : (N : ℝ) ^ (d - 1) * N = (N : ℝ) ^ d := by + rw [← pow_succ]; congr 1; omega + rw [show (d : ℝ) * ((N : ℝ) ^ (d - 1) * (3 * N / ℓ)) + = 3 * (d : ℝ) / ℓ * ((N : ℝ) ^ (d - 1) * N) by ring, hpow] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Measurability.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Measurability.lean new file mode 100644 index 0000000000..8ba30c1636 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Measurability.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.Geometry +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.LawObservable +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability + +/-! +# Per-phase measurability of the corridor observable + +The coarse observable is only +a.e.-measurable under a `RestrictionLawCarrier` (the C3 wrap +`aestronglyMeasurable_coarseBlockQuadratic_cubeSet`), so `comp_measurable` +cannot be applied against `L` directly. Instead: + +1. The corridor modification is packaged as the carrier endomorphism + `corridorReg ℓ σ : RegCoeffField d → RegCoeffField d` — the corridor + indicator is a fixed spatial set, so each entry of the modified field is a + Borel case-split between a constant and the original entry, preserving both + carrier regularity conjuncts. The endomorphism is *genuinely* `Measurable` + at the join (`measurable_corridorReg`): the pointwise lane is a case-split + between a constant and an evaluation, and the entry-test lane is **affine** + in the generators — `entryTestR i j φ (corridorReg ℓ σ a)` is a constant + plus the entry test of `a` against the complementary-masked probe + `Set.indicator (corridorSet ℓ σ)ᶜ φ` (the spatial case-split is + `a`-independent, unlike the elliptic truncation, so both lanes are honest). +2. The pushforward `L.map (corridorReg ℓ σ)` is again a `RestrictionLawCarrier` + (`lawCarrier_map_corridorReg`): probability is preserved by measurability, + and a.e. local uniform ellipticity is preserved by the pointwise corridor + modification (`aeLocallyUniformlyEllipticField_corridorReg`); the a.e. + pushforward uses `MeasureTheory.ae_map_iff`, whose measurable-set side + condition is `measurableSet_aeLocallyUniformlyEllipticField` (the countable + `⋂_Q ⋃_k` of the AEE quantitative-slice sets, each genuinely + `LocalSigmaR`-measurable on the carrier). +3. The C3 wrap on the pushforward pulls back along the measurable corridor + endomorphism via `AEStronglyMeasurable.comp_measurable` + (`aestronglyMeasurable_phaseObservable`). +-/ + +@[expose] public section + +open Homogenization +open Homogenization.Book.Ch04 (RestrictionCoeffLaw RestrictionLawCarrier AELocallyUniformlyEllipticField + AELocallyUniformlyEllipticLaw lawCarrier_of_aeLocallyUniformlyElliptic) +open MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## The corridor set is open, hence measurable -/ + +/-- The corridor set is open: it is a countable union over `(i, n)` of the open +slabs `{x | |x i − σ i − n·ℓ| < 1}`. -/ +theorem isOpen_corridorSet (ℓ : ℝ) (σ : Vec d) : IsOpen (corridorSet ℓ σ) := by + have hset : corridorSet ℓ σ + = ⋃ i : Fin d, ⋃ n : ℤ, {x : Vec d | |x i - σ i - n * ℓ| < 1} := by + ext x + simp only [mem_corridorSet, Set.mem_iUnion, Set.mem_ofPred_eq] + rw [hset] + refine isOpen_iUnion fun i => isOpen_iUnion fun n => ?_ + have hcont : Continuous (fun x : Vec d => |x i - σ i - n * ℓ|) := + (((continuous_apply i).sub continuous_const).sub continuous_const).abs + exact isOpen_lt hcont continuous_const + +/-- The corridor set is measurable. -/ +theorem measurableSet_corridorSet (ℓ : ℝ) (σ : Vec d) : + MeasurableSet (corridorSet ℓ σ) := + (isOpen_corridorSet ℓ σ).measurableSet + +/-! ## M1.1 — the corridor carrier endomorphism and its genuine measurability -/ + +/-- The corridor modification as a carrier endomorphism (identity matrix on the +corridor set, the original field off it). Both regularity conjuncts are +preserved: each entry is a Borel case-split between a constant and the original +entry over the measurable corridor set. -/ +noncomputable def corridorReg (ℓ : ℝ) (σ : Vec d) (a : RegCoeffField d) : + RegCoeffField d where + toFun := corridorField ℓ σ a.toFun + entry_measurable := fun i j => by + classical + have hEq : (fun x => corridorField ℓ σ a.toFun x i j) + = fun x => if x ∈ corridorSet ℓ σ then (1 : Mat d) i j else a x i j := by + funext x + by_cases hx : x ∈ corridorSet ℓ σ + · rw [corridorField_apply_of_mem hx, if_pos hx] + · rw [corridorField_apply_of_not_mem hx, if_neg hx] + rw [hEq] + exact Measurable.ite (measurableSet_corridorSet ℓ σ) measurable_const + (a.entry_measurable i j) + entry_locInt := fun i j => by + classical + have hEq : (fun x => corridorField ℓ σ a.toFun x i j) + = fun x => (corridorSet ℓ σ).indicator (fun _ => (1 : Mat d) i j) x + + ((corridorSet ℓ σ)ᶜ).indicator (fun x => a x i j) x := by + funext x + by_cases hx : x ∈ corridorSet ℓ σ + · simp [corridorField_apply_of_mem hx, Set.indicator_of_mem hx, + Set.indicator_of_notMem (by simpa using hx : x ∉ (corridorSet ℓ σ)ᶜ)] + · simp [corridorField_apply_of_not_mem hx, Set.indicator_of_notMem hx, + Set.indicator_of_mem (by simpa using hx : x ∈ (corridorSet ℓ σ)ᶜ)] + rw [hEq] + refine LocallyIntegrable.add ?_ ?_ + · exact (locallyIntegrable_const ((1 : Mat d) i j)).indicator + (measurableSet_corridorSet ℓ σ) + · rw [locallyIntegrable_iff] + intro K hK + exact ((a.entry_locInt i j).integrableOn_isCompact hK).indicator + (measurableSet_corridorSet ℓ σ).compl + +@[simp] theorem corridorReg_toFun (ℓ : ℝ) (σ : Vec d) (a : RegCoeffField d) : + (corridorReg ℓ σ a).toFun = corridorField ℓ σ a.toFun := rfl + +@[simp] theorem corridorReg_apply (ℓ : ℝ) (σ : Vec d) (a : RegCoeffField d) + (x : Vec d) : + corridorReg ℓ σ a x = corridorField ℓ σ a.toFun x := rfl + +/-- Affine generator transport for the corridor endomorphism: the entry test of +the modified field is a constant plus the entry test of the original field +against the complementary-masked probe. -/ +theorem entryTestR_corridorReg (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) + (ℓ : ℝ) (σ : Vec d) (a : RegCoeffField d) : + entryTestR i j φ (corridorReg ℓ σ a) + = (∫ x, (corridorSet ℓ σ).indicator (fun x => (1 : Mat d) i j * φ x) x) + + entryTestR i j (Set.indicator (corridorSet ℓ σ)ᶜ φ) a := by + classical + have hint1 : + Integrable ((corridorSet ℓ σ).indicator (fun x => (1 : Mat d) i j * φ x)) volume := by + have h1 : Integrable (fun x => (1 : RegCoeffField d) x i j * φ x) volume := + integrable_entry_mul_probe i j hφ (1 : RegCoeffField d) + exact h1.indicator (measurableSet_corridorSet ℓ σ) + have hint2 : + Integrable (fun x => a x i j * Set.indicator (corridorSet ℓ σ)ᶜ φ x) volume := + integrable_entry_mul_probe i j (hφ.indicator (measurableSet_corridorSet ℓ σ).compl) a + have hEq : (fun x => corridorReg ℓ σ a x i j * φ x) + = fun x => (corridorSet ℓ σ).indicator (fun x => (1 : Mat d) i j * φ x) x + + a x i j * Set.indicator (corridorSet ℓ σ)ᶜ φ x := by + funext x + by_cases hx : x ∈ corridorSet ℓ σ + · simp [corridorField_apply_of_mem hx, Set.indicator_of_mem hx, + Set.indicator_of_notMem (by simpa using hx : x ∉ (corridorSet ℓ σ)ᶜ)] + · simp [corridorField_apply_of_not_mem hx, Set.indicator_of_notMem hx, + Set.indicator_of_mem (by simpa using hx : x ∈ (corridorSet ℓ σ)ᶜ)] + unfold entryTestR + rw [hEq, integral_add hint1 hint2] + +/-- **The corridor endomorphism is genuinely measurable at the join.** The +pointwise lane is a case-split between a constant and an evaluation; the +entry-test lane is affine in the carrier generators (the spatial case-split is +independent of the field, unlike the elliptic truncation). -/ +theorem measurable_corridorReg (ℓ : ℝ) (σ : Vec d) : + Measurable (corridorReg (d := d) ℓ σ) := by + classical + refine measurable_into_regCoeffField' ?_ ?_ + · intro y i j + by_cases hy : y ∈ corridorSet ℓ σ + · have hfun : (fun a : RegCoeffField d => corridorReg ℓ σ a y i j) + = fun _ => (1 : Mat d) i j := by + funext a; simp [corridorField_apply_of_mem hy] + rw [hfun]; exact measurable_const + · have hfun : (fun a : RegCoeffField d => corridorReg ℓ σ a y i j) + = fun a => a y i j := by + funext a; simp [corridorField_apply_of_not_mem hy] + rw [hfun]; exact measurable_apply_entry y i j + · intro i j φ hφ + have hfun : (fun a => entryTestR i j φ (corridorReg ℓ σ a)) + = fun a => + (∫ x, (corridorSet ℓ σ).indicator (fun x => (1 : Mat d) i j * φ x) x) + + entryTestR i j (Set.indicator (corridorSet ℓ σ)ᶜ φ) a := by + funext a; exact entryTestR_corridorReg i j hφ ℓ σ a + rw [hfun] + exact measurable_const.add + (measurable_entryTestR i j (hφ.indicator (measurableSet_corridorSet ℓ σ).compl)) + +/-! ## M1.2 — ellipticity transport through the corridor -/ + +/-- The corridor modification preserves a.e. local uniform ellipticity. On the +corridor set the field is the identity, elliptic with any constants +`lam'' ≤ 1 ≤ Lam''`; off it the field is unchanged. On each triadic cube, with +original constants `(lam, Lam)`, the modified field is a.e. +`(min lam 1, max Lam 1)`-elliptic; its spatial a.e.-strong measurability is the +piecewise combination of the original coordinate map and a constant, gated by +the measurable `corridorSet`. -/ +theorem aeLocallyUniformlyEllipticField_corridorReg {ℓ : ℝ} {σ : Vec d} + {a : RegCoeffField d} (ha : AELocallyUniformlyEllipticField a) : + AELocallyUniformlyEllipticField (corridorReg ℓ σ a) := by + classical + intro Q + obtain ⟨lam, Lam, hlam, hle, hAOn⟩ := ha Q + have hAOn' : IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun := hAOn + set U : Set (Vec d) := openCubeSet Q with hUdef + refine ⟨min lam 1, max Lam 1, lt_min hlam one_pos, ?_, ?_, ?_, ?_⟩ + · exact le_trans (min_le_left lam 1) (le_trans hle (le_max_left Lam 1)) + · exact hAOn'.measurableSet + · -- spatial a.e.-strong measurability (piecewise) + intro i j + have hEq : + (fun x => restrictCoeffField U (corridorField ℓ σ a.toFun) x i j) + = (corridorSet ℓ σ).piecewise + (fun x => restrictCoeffField U (fun _ => (1 : Mat d)) x i j) + (fun x => restrictCoeffField U a.toFun x i j) := by + funext x + by_cases hxU : x ∈ U <;> by_cases hxS : x ∈ corridorSet ℓ σ <;> + simp [Set.piecewise, restrictCoeffField, corridorField, hxU, hxS] + rw [corridorReg_toFun, hEq] + refine AEStronglyMeasurable.piecewise (measurableSet_corridorSet ℓ σ) ?_ ?_ + · have hb1 : + (fun x : Vec d => restrictCoeffField U (fun _ => (1 : Mat d)) x i j) + = U.indicator (fun _ => (1 : Mat d) i j) := by + funext x; by_cases hxU : x ∈ U <;> simp [restrictCoeffField, hxU] + rw [hb1] + exact (measurable_const.indicator hAOn'.measurableSet).aestronglyMeasurable.restrict + · exact (hAOn'.aestronglyMeasurable_restrictCoeffField_apply i j).restrict + · -- pointwise ellipticity a.e. + have hminpos : (0 : ℝ) < min lam 1 := lt_min hlam one_pos + filter_upwards [hAOn'.ae_isEllipticMatrix] with x hx + by_cases hxS : x ∈ corridorSet ℓ σ + · rw [corridorReg_toFun, corridorField_apply_of_mem hxS] + exact (isEllipticMatrix_one (le_max_right Lam 1)).mono hminpos + (min_le_right lam 1) le_rfl + · rw [corridorReg_toFun, corridorField_apply_of_not_mem hxS] + exact hx.mono hminpos (min_le_left lam 1) (le_max_left Lam 1) + +/-! ## M1.3 — measurability of the local-uniform-ellipticity support -/ + +/-- The set of locally a.e.-uniformly elliptic carrier fields is genuinely +measurable: it equals the countable `⋂_Q ⋃_k` of the AEE quantitative-slice +sets (`AELocallyUniformlyEllipticField.exists_aeeQuantitativeEllipticSlice_cubeSet` +forward; the definition `AEEQuantitativeEllipticSlice = IsAEEllipticFieldOn (k+1)⁻¹ (k+1)` +plus `IsAEEllipticFieldOn.mono` to the open core backward), each slice set being +genuinely `LocalSigmaR`-measurable on the carrier +(`measurableSet_localSigmaR_aeeQuantitativeEllipticSlice`, Packet P4b) and +`LocalSigmaR ≤` the canonical carrier σ-algebra. -/ +theorem measurableSet_aeLocallyUniformlyEllipticField : + MeasurableSet {b : RegCoeffField d | AELocallyUniformlyEllipticField b} := by + classical + have hEq : {b : RegCoeffField d | AELocallyUniformlyEllipticField b} + = ⋂ Q : TriadicCube d, ⋃ k : ℕ, + {b : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k b.toFun} := by + ext b + simp only [Set.mem_ofPred_eq, Set.mem_iInter, Set.mem_iUnion] + constructor + · intro hb Q + exact hb.exists_aeeQuantitativeEllipticSlice_cubeSet Q + · intro hb Q + obtain ⟨k, hk⟩ := hb Q + have hkpos : (0 : ℝ) < ((k : ℝ) + 1)⁻¹ := by positivity + have h1le : (1 : ℝ) ≤ (k : ℝ) + 1 := by + have : (0 : ℝ) ≤ (k : ℝ) := by positivity + linarith + have hle : ((k : ℝ) + 1)⁻¹ ≤ (k : ℝ) + 1 := + le_trans ((inv_le_one₀ (by positivity)).2 h1le) h1le + refine ⟨((k : ℝ) + 1)⁻¹, (k : ℝ) + 1, hkpos, hle, ?_⟩ + have hslice : IsAEEllipticFieldOn ((k : ℝ) + 1)⁻¹ ((k : ℝ) + 1) (cubeSet Q) b.toFun := hk + exact hslice.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + rw [hEq] + refine MeasurableSet.iInter fun Q => MeasurableSet.iUnion fun k => ?_ + exact LocalSigmaR_le (cubeSet Q) _ + (Book.Ch04.measurableSet_localSigmaR_aeeQuantitativeEllipticSlice Q k) + +/-! ## M1.4 — pushforward `RestrictionLawCarrier` transport -/ + +/-- The pushforward of a `RestrictionLawCarrier` law along the corridor endomorphism is +again a `RestrictionLawCarrier` law. -/ +theorem lawCarrier_map_corridorReg {L : RestrictionCoeffLaw d} (hP : RestrictionLawCarrier L) + (ℓ : ℝ) (σ : Vec d) : + RestrictionLawCarrier (L.map (corridorReg ℓ σ)) := by + have hT : Measurable (corridorReg (d := d) ℓ σ) := measurable_corridorReg ℓ σ + have : IsProbabilityMeasure L := hP.isProbability + have : IsProbabilityMeasure (L.map (corridorReg ℓ σ)) := + L.isProbabilityMeasure_map hT.aemeasurable + refine lawCarrier_of_aeLocallyUniformlyElliptic ?_ + rw [AELocallyUniformlyEllipticLaw, + ae_map_iff hT.aemeasurable measurableSet_aeLocallyUniformlyEllipticField] + filter_upwards [hP.ae_locally_uniformly_elliptic] with a ha + exact aeLocallyUniformlyEllipticField_corridorReg ha + +/-! ## M1 — the per-phase measurability theorem -/ + +/-- **M1 (per-phase measurability).** For a fixed grid phase `σ`, the coarse +observable at the corridor-modified coefficient is a.e.-strongly-measurable under +any `RestrictionLawCarrier` law. -/ +theorem aestronglyMeasurable_phaseObservable [NeZero d] {L : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier L) (m : ℤ) (ℓ : ℝ) (σ : Vec d) (P : BlockVec d) : + AEStronglyMeasurable + (fun a : RegCoeffField d => + blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ a.toFun)) P)) L := by + have hT : Measurable (corridorReg (d := d) ℓ σ) := measurable_corridorReg ℓ σ + have hPush : RestrictionLawCarrier (L.map (corridorReg ℓ σ)) := lawCarrier_map_corridorReg hP ℓ σ + have hG : + AEStronglyMeasurable + (fun b : RegCoeffField d => + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) b.toFun) P)) + (L.map (corridorReg ℓ σ)) := + aestronglyMeasurable_coarseBlockQuadratic_cubeSet hPush m P + exact hG.comp_measurable hT + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Stability.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Stability.lean new file mode 100644 index 0000000000..e3d7ef3e86 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Corridor/PhaseComparison/Stability.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Measurability +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.QuadraticStability.Integral +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.DiagonalSandwich + +/-! +# Per-phase stability of the corridor observable + +Statement of `p.phase.comparison`'s stability estimate `e.phase.comparison.stability` +in the discrete-grid setting. With `U := cubeSet (originCube d m)`, +`S := corridorSet ℓ σ`, and `Z` the minimizer for `(a, P)` +(`exists_cubeBlockMinimizer`, which supplies `Mu U P a = blockEnergyAverage U a Z`): + +* `F := P·𝐀(U; a)P = 2·Mu U P a`, and `2·Mu U P a = (vol U)⁻¹ ∫_U Z·(blockCoeffField a)Z` + (`coarseBlockMatrix_quadratic_eq_energyIntegral`); the sharp constant is + `24Θ = (vol U)⁻¹·6·(4Θ)`. We state the (weaker, still true) `48Θ`, valid + because the corridor energy integrand is `≥ 0` + (`blockMatrixOfCoeff_quadratic_nonneg`). +* B′3 `abs_setIntegral_energy_sub_le` with `B := blockCoeffField a`, + `Bt := blockCoeffField (corridorField ℓ σ a)`, `S := corridorSet ℓ σ ∩ U`, + minimizers `Z` (for `a`), `Zσ` (for `corridorField ℓ σ a`, elliptic via + `corridorField_isEllipticMatrix`). + +The core B′3 assembly is packaged as `abs_phaseObservable_sub_le_of_minimizer` +(taking the minimizer `Z` for `a` as input); `abs_phaseObservable_sub_le` +(M2) is the existential wrapper. The `Z`-as-input form is what the grid-averaging +step M3 needs, since a single `a`-minimizer serves every phase `σ`. +-/ + +@[expose] public section + +open Homogenization +open MeasureTheory + +namespace Homogenization + +variable {d : ℕ} + +/-! ## Field-level ellipticity transport through the corridor -/ + +/-- The corridor self-map preserves everywhere-`(1, Θ)`-ellipticity on `U`: the +pointwise ellipticity is `corridorField_isEllipticMatrix`, and the entrywise +measurability of the `U`-truncated modified field is the corridor-gated +piecewise of the constant `(1 : Mat d)` and the original truncated field. -/ +theorem isEllipticFieldOn_corridorField {Θ : ℝ} {U : Set (Vec d)} + (hU : MeasurableSet U) (hΘ : 1 ≤ Θ) {ℓ : ℝ} {σ : Vec d} {a : CoeffField d} + (hEll : IsEllipticFieldOn 1 Θ U a) : + IsEllipticFieldOn 1 Θ U (corridorField ℓ σ a) := by + classical + refine ⟨?_, fun x hx => corridorField_isEllipticMatrix hΘ (hEll.2 x hx)⟩ + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + have hcomp : Measurable (fun x => if x ∈ U then a x i j else 0) := by + have := (measurable_pi_iff.mp (measurable_pi_iff.mp hEll.1 i)) j + simpa using this + have hind : Measurable (fun x : Vec d => if x ∈ U then (1 : Mat d) i j else 0) := + Measurable.ite hU measurable_const measurable_const + have heq : (fun x => if x ∈ U then corridorField ℓ σ a x i j else 0) + = fun x => if x ∈ corridorSet ℓ σ then (if x ∈ U then (1 : Mat d) i j else 0) + else (if x ∈ U then a x i j else 0) := by + funext x + by_cases hxS : x ∈ corridorSet ℓ σ + · rw [if_pos hxS, corridorField_apply_of_mem hxS] + · rw [if_neg hxS, corridorField_apply_of_not_mem hxS] + rw [heq] + exact Measurable.ite (measurableSet_corridorSet ℓ σ) hind hcomp + +/-! ## The `Mu`-quadratic as a normalized energy integral -/ + +/-- `P·𝐀(U; a)P = (vol U)⁻¹ ∫_U Z·(blockCoeffField a)Z` for any minimizer `Z` +of `(a, P)` on the half-open triadic cube. This is `Mu = ½ P·𝐀 P` combined with +`Mu = blockEnergyAverage`, the `½` cancelling the density's `½`. -/ +theorem coarseBlockMatrix_quadratic_eq_energyIntegral [NeZero d] {Θ : ℝ} {m : ℤ} + {a : CoeffField d} (P : BlockVec d) + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) + {Z : BlockState d} + (hZeng : Mu (cubeSet (originCube d m)) P a + = blockEnergyAverage (cubeSet (originCube d m)) a Z) : + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P) + = (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := by + set U := cubeSet (originCube d m) with hUdef + have h1 : Mu U P a = (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) := + mu_eq_half_coarseBlockMatrix_cube hEll P + have hg : (∫ x in U, blockEnergyDensity a Z x) + = (1 / 2 : ℝ) * + ∫ x in U, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := by + rw [show (∫ x in U, blockEnergyDensity a Z x) + = ∫ x in U, (1 / 2 : ℝ) * + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) from rfl] + exact integral_const_mul _ _ + have e1 : blockEnergyAverage U a Z + = (volume U).toReal⁻¹ * ((1 / 2 : ℝ) * + ∫ x in U, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) := by + unfold blockEnergyAverage volumeAverage; rw [hg] + have e2 : (1 / 2 : ℝ) * blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) + = (1 / 2 : ℝ) * ((volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) := by + rw [← h1, hZeng, e1]; ring + exact mul_left_cancel₀ (by norm_num : (1 / 2 : ℝ) ≠ 0) e2 + +/-! ## M2 core: the B′3 assembly with the minimizer as input -/ + +/-- **M2 core.** Given the minimizer `Z` for `(a, P)` (its admissibility, +response-space membership and energy-realizing identity), the corridor-phase +comparison bound holds with the corridor energy of that specific `Z`. This is +the B′3 assembly; `abs_phaseObservable_sub_le` obtains `Z` and calls this. -/ +theorem abs_phaseObservable_sub_le_of_minimizer [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {ℓ : ℝ} {σ : Vec d} {a : CoeffField d} (P : BlockVec d) + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) + {Z : BlockState d} + (hZadm : IsBlockMuAdmissible (cubeSet (originCube d m)) P Z) + (hZresp : BlockResponseSpace a (cubeSet (originCube d m)) Z) + (hZeng : Mu (cubeSet (originCube d m)) P a + = blockEnergyAverage (cubeSet (originCube d m)) a Z) : + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ a)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P)| ≤ + 48 * Θ * (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in corridorSet ℓ σ ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := by + classical + set U := cubeSet (originCube d m) with hUdef + have hU : MeasurableSet U := measurableSet_cubeSet (originCube d m) + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + rw [hUdef]; infer_instance + have hΘpos : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + set aσ := corridorField ℓ σ a with haσdef + have hEllσ : IsEllipticFieldOn 1 Θ U aσ := isEllipticFieldOn_corridorField hU hΘ hEll + obtain ⟨Zσ, hZσadm, hZσeng, hZσresp⟩ := exists_cubeBlockMinimizer hEllσ P + -- energy-integral forms of both `Mu`-quadratics + have hFa : blockVecDot P (blockMatVecMul (coarseBlockMatrix U a) P) + = (volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEll hZeng + have hFσ : blockVecDot P (blockMatVecMul (coarseBlockMatrix U aσ) P) + = (volume U).toReal⁻¹ * + ∫ x in U, blockVecDot (Zσ.eval x) (blockMatVecMul (blockCoeffField aσ x) (Zσ.eval x)) := + coarseBlockMatrix_quadratic_eq_energyIntegral P hEllσ hZσeng + -- B′3 data + set S : Set (Vec d) := corridorSet ℓ σ ∩ U with hSdef + have hS : MeasurableSet S := (measurableSet_corridorSet ℓ σ).inter hU + have hSU : S ⊆ U := Set.inter_subset_right + have hK : (1 : ℝ) ≤ 4 * Θ := by linarith + have hZbl : MemBlockL2 U Z.eval := hZadm.memBlockL2_eval + have hZσbl : MemBlockL2 U Zσ.eval := hZσadm.memBlockL2_eval + set W : BlockState d := + { potential := fun x => Zσ.potential x - Z.potential x + flux := fun x => Zσ.flux x - Z.flux x } with hWdef + have hWeval : ∀ x, W.eval x = Zσ.eval x - Z.eval x := fun x => rfl + have hWbl : MemBlockL2 U W.eval := hZσbl.sub hZbl + have hae : ∀ᵐ x ∂(volume.restrict U), + IsSymmetricBlockMat (blockCoeffField a x) ∧ IsSymmetricBlockMat (blockCoeffField aσ x) ∧ + (∀ V : BlockVec d, 0 ≤ blockVecDot V (blockMatVecMul (blockCoeffField a x) V)) ∧ + (∀ V : BlockVec d, 0 ≤ blockVecDot V (blockMatVecMul (blockCoeffField aσ x) V)) ∧ + BlockMatLoewnerLE (blockCoeffField aσ x) ((4 * Θ) • blockCoeffField a x) ∧ + BlockMatLoewnerLE (blockCoeffField a x) ((4 * Θ) • blockCoeffField aσ x) := by + refine (ae_restrict_iff' hU).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + have hAx : IsEllipticMatrix 1 Θ (a x) := hEll.2 x hx + have hAσx : IsEllipticMatrix 1 Θ (aσ x) := corridorField_isEllipticMatrix hΘ hAx + exact ⟨isSymmetricBlockMat_blockMatrixOfCoeff (a x), + isSymmetricBlockMat_blockMatrixOfCoeff (aσ x), + fun V => blockMatrixOfCoeff_quadratic_nonneg hAx V, + fun V => blockMatrixOfCoeff_quadratic_nonneg hAσx V, + blockMatrixOfCoeff_blockMatLoewnerLE_smul_of_isThetaElliptic hAx hAσx, + blockMatrixOfCoeff_blockMatLoewnerLE_smul_of_isThetaElliptic hAσx hAx⟩ + have hagree : ∀ᵐ x ∂(volume.restrict (U \ S)), + blockCoeffField a x = blockCoeffField aσ x := by + refine (ae_restrict_iff' (hU.diff hS)).2 (Filter.Eventually.of_forall (fun x hx => ?_)) + have hxnc : x ∉ corridorSet ℓ σ := fun hc => hx.2 ⟨hc, hx.1⟩ + have haσx : aσ x = a x := by rw [haσdef]; exact corridorField_apply_of_not_mem hxnc + unfold blockCoeffField; rw [haσx] + have hIntBZZ : IntegrableOn + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) U := by + simpa [blockPairingIntegrand] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZbl hZbl hEll + have hIntBtZZ : IntegrableOn + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField aσ x) (Z.eval x))) U := by + simpa [blockPairingIntegrand] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := Z) hZbl hZbl hEllσ + have hIntBtYY : IntegrableOn + (fun x => blockVecDot (Zσ.eval x - Z.eval x) + (blockMatVecMul (blockCoeffField aσ x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := W) (Y := W) hWbl hWbl hEllσ + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hIntBtZY : IntegrableOn + (fun x => blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField aσ x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := W) hZbl hWbl hEllσ + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hIntBZY : IntegrableOn + (fun x => blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField a x) (Zσ.eval x - Z.eval x))) U := by + have h := blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (X := Z) (Y := W) hZbl hWbl hEll + refine h.congr (Filter.Eventually.of_forall (fun x => ?_)) + simp only [blockPairingIntegrand, hWeval] + have hEulerB : ∫ x in U, + blockVecDot (Zσ.eval x - Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) = 0 := + cubeBlockMinimizer_euler_orthogonality_sub hZresp hZσadm hZadm + have hEulerBt : ∫ x in U, + blockVecDot (Zσ.eval x - Z.eval x) (blockMatVecMul (blockCoeffField aσ x) (Zσ.eval x)) = 0 := + cubeBlockMinimizer_euler_orthogonality_sub hZσresp hZσadm hZadm + have hB3 := abs_setIntegral_energy_sub_le (U := U) (S := S) + (B := blockCoeffField a) (Bt := blockCoeffField aσ) + (Z := Z.eval) (Zt := Zσ.eval) (K := 4 * Θ) + hU hS hSU hK hae hagree + hIntBZZ hIntBtZZ hIntBtYY hIntBtZY hIntBZY hEulerB hEulerBt + rw [hFσ, hFa] + have hc0 : (0 : ℝ) ≤ (volume U).toReal⁻¹ := inv_nonneg.mpr ENNReal.toReal_nonneg + have hES0 : (0 : ℝ) ≤ ∫ x in S, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := + setIntegral_nonneg hS + (fun x hx => blockMatrixOfCoeff_quadratic_nonneg (hEll.2 x (hSU hx)) (Z.eval x)) + set c := (volume U).toReal⁻¹ with hcdef + set Iσ := ∫ x in U, + blockVecDot (Zσ.eval x) (blockMatVecMul (blockCoeffField aσ x) (Zσ.eval x)) with hIσdef + set I := ∫ x in U, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) with hIdef + set ES := ∫ x in S, + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) with hESdef + have hprod : (0 : ℝ) ≤ c * Θ * ES := mul_nonneg (mul_nonneg hc0 hΘpos.le) hES0 + calc |c * Iσ - c * I| + = c * |Iσ - I| := by rw [← mul_sub, abs_mul, abs_of_nonneg hc0] + _ ≤ c * (6 * (4 * Θ) * ES) := mul_le_mul_of_nonneg_left hB3 hc0 + _ ≤ 48 * Θ * c * ES := by nlinarith [hprod] + +/-- **M2 (per-phase stability).** For a fixed grid phase `σ` and a coefficient +`a` that is `(1, Θ)`-elliptic on `U := cubeSet (originCube d m)`, the coarse +observable moves by at most a normalized corridor energy of the minimizer +`Z` for `(a, P)`. -/ +theorem abs_phaseObservable_sub_le [NeZero d] {Θ : ℝ} (hΘ : 1 ≤ Θ) + {m : ℤ} {ℓ : ℝ} {σ : Vec d} {a : CoeffField d} (P : BlockVec d) + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) : + ∃ Z : BlockState d, + IsBlockMuAdmissible (cubeSet (originCube d m)) P Z ∧ + BlockResponseSpace a (cubeSet (originCube d m)) Z ∧ + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) (corridorField ℓ σ a)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) P)| ≤ + 48 * Θ * (volume (cubeSet (originCube d m))).toReal⁻¹ * + ∫ x in corridorSet ℓ σ ∩ cubeSet (originCube d m), + blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) := by + obtain ⟨Z, hZadm, hZeng, hZresp⟩ := exists_cubeBlockMinimizer hEll P + exact ⟨Z, hZadm, hZresp, + abs_phaseObservable_sub_le_of_minimizer hΘ P hEll hZadm hZresp hZeng⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled.lean new file mode 100644 index 0000000000..22f17ac0fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.IterationLemma +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Median +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Representation +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/IterationLemma.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/IterationLemma.lean new file mode 100644 index 0000000000..6a961c58bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/IterationLemma.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Analysis.SpecificLimits.Basic + +/-! +# Fast geometric-decay iteration lemma + +A standalone real-analysis prelude for a De Giorgi / Stampacchia iteration. If a +nonnegative sequence `Y` starting below `1` satisfies a superlinear recursion +`Y (n+1) ≤ A · Bⁿ · (Y n)^{1+β}` with the compatibility bound +`A ≤ B^{-1/β}`, then `Y n ≤ B^{-n/β}` for every `n`, and (when `1 < B`) `Y → 0`. + +All exponents are real (`Real.rpow`). No `sorry`, no axioms, no heartbeat +overrides. +-/ + +@[expose] public section + +namespace Homogenization + +open Filter Topology + +/-- **Fast geometric decay.** A nonnegative sequence obeying a +superlinear recursion with a compatible leading constant decays at least like the +geometric rate `B^{-n/β}`. -/ +theorem iteration_geometric_decay + {Y : ℕ → ℝ} {A B β : ℝ} + (hY0 : Y 0 ≤ 1) (hYnn : ∀ n, 0 ≤ Y n) (hβ : 0 < β) + (hB : 1 ≤ B) (hA : 0 ≤ A) (hAB : A ≤ B ^ (-(1 / β))) + (hrec : ∀ n, Y (n + 1) ≤ A * B ^ (n : ℝ) * Y n ^ (1 + β)) : + ∀ n, Y n ≤ B ^ (-(n : ℝ) / β) := by + have hB0 : (0 : ℝ) < B := lt_of_lt_of_le one_pos hB + have hB0' : (0 : ℝ) ≤ B := hB0.le + have hβ0 : β ≠ 0 := ne_of_gt hβ + intro n + induction n with + | zero => + simp only [Nat.cast_zero, neg_zero, zero_div, Real.rpow_zero] + exact hY0 + | succ n ih => + have h1β : (0 : ℝ) ≤ 1 + β := by linarith + -- monotonicity of `t ↦ t^{1+β}` applied to the inductive hypothesis + have hstep : Y n ^ (1 + β) ≤ (B ^ (-(n : ℝ) / β)) ^ (1 + β) := + Real.rpow_le_rpow (hYnn n) ih h1β + have hpow : (B ^ (-(n : ℝ) / β)) ^ (1 + β) = B ^ ((-(n : ℝ) / β) * (1 + β)) := + (Real.rpow_mul hB0' _ _).symm + have hfac : 0 ≤ A * B ^ (n : ℝ) := mul_nonneg hA (Real.rpow_nonneg hB0' _) + have hexp : (n : ℝ) + (-(n : ℝ) / β) * (1 + β) = -(n : ℝ) / β := by + field_simp + ring + calc + Y (n + 1) ≤ A * B ^ (n : ℝ) * Y n ^ (1 + β) := hrec n + _ ≤ A * B ^ (n : ℝ) * (B ^ (-(n : ℝ) / β)) ^ (1 + β) := + mul_le_mul_of_nonneg_left hstep hfac + _ = A * B ^ (-(n : ℝ) / β) := by + rw [hpow, mul_assoc, ← Real.rpow_add hB0, hexp] + _ ≤ B ^ (-(1 / β)) * B ^ (-(n : ℝ) / β) := + mul_le_mul_of_nonneg_right hAB (Real.rpow_nonneg hB0' _) + _ = B ^ (-((n + 1 : ℕ) : ℝ) / β) := by + rw [← Real.rpow_add hB0] + congr 1 + push_cast + ring + +/-- **Fast geometric decay (corollary).** Under the same recursion with a genuine +contraction rate `1 < B`, the sequence tends to `0`. -/ +theorem iteration_geometric_decay_tendsto_zero + {Y : ℕ → ℝ} {A B β : ℝ} + (hY0 : Y 0 ≤ 1) (hYnn : ∀ n, 0 ≤ Y n) (hβ : 0 < β) + (hB : 1 < B) (hA : 0 ≤ A) (hAB : A ≤ B ^ (-(1 / β))) + (hrec : ∀ n, Y (n + 1) ≤ A * B ^ (n : ℝ) * Y n ^ (1 + β)) : + Tendsto Y atTop (𝓝 0) := by + have hbound := iteration_geometric_decay hY0 hYnn hβ hB.le hA hAB hrec + have hB0' : (0 : ℝ) ≤ B := (lt_trans one_pos hB).le + set r : ℝ := B ^ (-(1 / β)) with hr + have hr0 : 0 ≤ r := Real.rpow_nonneg hB0' _ + have hr1 : r < 1 := by + rw [hr] + refine Real.rpow_lt_one_of_one_lt_of_neg hB ?_ + have : (0 : ℝ) < 1 / β := by positivity + linarith + have hgeom : Tendsto (fun n : ℕ => r ^ n) atTop (𝓝 0) := + tendsto_pow_atTop_nhds_zero_of_lt_one hr0 hr1 + have hEq : ∀ n : ℕ, B ^ (-(n : ℝ) / β) = r ^ n := by + intro n + rw [hr, ← Real.rpow_natCast (B ^ (-(1 / β))) n, ← Real.rpow_mul hB0'] + congr 1 + ring + refine squeeze_zero hYnn (fun n => ?_) hgeom + rw [← hEq n] + exact hbound n + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy.lean new file mode 100644 index 0000000000..fa2e8d1283 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy.lean @@ -0,0 +1,686 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Bounds + +/-! +# Local block energy (Prop 3.4) + +The two consumer theorems, assembled from the test +identity (`energyIntegral_eq_bulk_add_cutoff`) and the pointwise bulk/cutoff +estimates (`bulkIntegrand_le`, `cutoffIntegrand_le`). + +* `centered_local_block_energy` (T1): the `𝓔`-level bound + `𝓔 ≤ C_d (M²·|supp η ∩ U| + Θ·K∞²·∫_U Σᵢ(∂ᵢη)²)`. +* `local_block_energy` (T2): the consumer shape + `∫_C Z·𝐁Z ≤ C_d (M²·|supp η ∩ U| + Θ·K∞²·∫_U Σᵢ(∂ᵢη)²)`. + +`M² = Θ|p|² + |q|²`. No `EuclideanSpace`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} [NeZero d] {m : ℤ} + +local notation "U" => openCubeSet (originCube d m) + +/-! ## Integrability of the two elementary weights -/ + +omit [NeZero d] in +theorem integrableOn_sqCutoff {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + IntegrableOn (sqCutoff η) U := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + exact (sqCutoff_memLpTop (m := m) hη hIcc).integrable le_top + +omit [NeZero d] in +/-- The squared-gradient norm is integrable on the cube. -/ +theorem integrableOn_gradEtaSq {η : Vec d → ℝ} {Gη : ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) : + IntegrableOn (fun x => vecNormSq (fun i => fderiv ℝ η x (basisVec i))) U := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hcont : Continuous (fun x => vecNormSq (fun i => fderiv ℝ η x (basisVec i))) := by + have hfd : Continuous (fun x => fderiv ℝ η x) := hη.continuous_fderiv (by simp) + have hco : Continuous (fun x => (fun i => fderiv ℝ η x (basisVec i))) := + continuous_pi (fun i => hfd.clm_apply continuous_const) + unfold vecNormSq vecDot + exact continuous_finsetSum _ (fun i _ => + ((continuous_apply i).comp hco).mul ((continuous_apply i).comp hco)) + have hmem : MemLp (fun x => vecNormSq (fun i => fderiv ℝ η x (basisVec i))) (⊤ : ENNReal) + (volumeMeasureOn (openCubeSet (originCube d m))) := by + refine MeasureTheory.memLp_top_of_bound hcont.aestronglyMeasurable + ((d : ℝ) * Gη ^ 2) ?_ + refine Filter.Eventually.of_forall (fun x => ?_) + rw [Real.norm_eq_abs, abs_of_nonneg (vecNormSq_nonneg _)] + calc vecNormSq (fun i => fderiv ℝ η x (basisVec i)) + = ∑ i, (fderiv ℝ η x (basisVec i)) * (fderiv ℝ η x (basisVec i)) := rfl + _ ≤ ∑ _i : Fin d, Gη ^ 2 := by + refine Finset.sum_le_sum (fun i _ => ?_) + nlinarith [hGη x i, abs_nonneg (fderiv ℝ η x (basisVec i)), + sq_abs (fderiv ℝ η x (basisVec i))] + _ = (d : ℝ) * Gη ^ 2 := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + exact hmem.integrable le_top + +/-! ## `∫ η² ≤ |supp η ∩ U|` -/ + +omit [NeZero d] in +theorem setIntegral_sqCutoff_le {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + (∫ x in U, sqCutoff η x) ≤ (volume (Function.support η ∩ U)).toReal := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hsuppOpen : IsOpen (Function.support η) := by + have hpre : Function.support η = η ⁻¹' {0}ᶜ := by + ext x; simp [Function.mem_support] + rw [hpre]; exact isOpen_compl_singleton.preimage hη.continuous + have hsuppMeas : MeasurableSet (Function.support η) := hsuppOpen.measurableSet + have hUmeas : MeasurableSet (openCubeSet (originCube d m)) := measurableSet_openCubeSet _ + have hsq_int : IntegrableOn (sqCutoff η) U := integrableOn_sqCutoff hη hIcc + have hind_int : IntegrableOn (Set.indicator (Function.support η) (fun _ => (1:ℝ))) + (openCubeSet (originCube d m)) := + (integrable_const (1:ℝ)).indicator hsuppMeas + have hbound : ∀ x ∈ (openCubeSet (originCube d m) : Set (Vec d)), + sqCutoff η x ≤ Set.indicator (Function.support η) (fun _ => (1:ℝ)) x := by + intro x _ + by_cases hx : x ∈ Function.support η + · rw [Set.indicator_of_mem hx]; exact sqCutoff_le_one hIcc x + · rw [Set.indicator_of_notMem hx] + simp only [Function.mem_support, not_not] at hx + rw [sqCutoff_apply, hx]; norm_num + calc (∫ x in U, sqCutoff η x) + ≤ ∫ x in U, Set.indicator (Function.support η) (fun _ => (1:ℝ)) x := + setIntegral_mono_on hsq_int hind_int hUmeas hbound + _ = ∫ _ in (U ∩ Function.support η), (1:ℝ) := setIntegral_indicator hsuppMeas + _ = (volume (U ∩ Function.support η)).toReal := by + rw [setIntegral_const, smul_eq_mul, mul_one]; rfl + _ = (volume (Function.support η ∩ U)).toReal := by rw [Set.inter_comm] + +/-! ## The two integral estimates -/ + +omit [NeZero d] in +theorem setIntegral_bulkIntegrand_le {a : CoeffField d} {Θ : ℝ} {v vstar : H1Function U} + {P : BlockVec d} {η : Vec d → ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + (∫ x in U, bulkIntegrand a v vstar P η x) + ≤ 5 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (∫ x in U, sqCutoff η x) + + (1/8) * (∫ x in U, energyIntegrand a v vstar P η x) := by + have hib : IntegrableOn (bulkIntegrand a v vstar P η) U := integrableOn_bulkIntegrand hEllO hη hIcc + have hisq := integrableOn_sqCutoff (m := m) hη hIcc + have hie : IntegrableOn (energyIntegrand a v vstar P η) U := + integrableOn_energyIntegrand hEllO hη hIcc + have hbnd : IntegrableOn (fun x => 5 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + (1/8) * energyIntegrand a v vstar P η x) U := + (hisq.const_mul _).add (hie.const_mul _) + calc (∫ x in U, bulkIntegrand a v vstar P η x) + ≤ ∫ x in U, (5 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + (1/8) * energyIntegrand a v vstar P η x) := + setIntegral_mono_on hib hbnd (measurableSet_openCubeSet _) + (fun x hx => bulkIntegrand_le hEllO hx) + _ = 5 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (∫ x in U, sqCutoff η x) + + (1/8) * (∫ x in U, energyIntegrand a v vstar P η x) := by + rw [integral_add (hisq.const_mul _) (hie.const_mul _), integral_const_mul, + integral_const_mul] + +omit [NeZero d] in +theorem setIntegral_cutoffIntegrand_le {a : CoeffField d} {Θ : ℝ} {v vstar : H1Function U} + {P : BlockVec d} {η : Vec d → ℝ} {Gη c Kinf : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (hKv : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) : + (∫ x in U, cutoffIntegrand a v vstar P c η x) + ≤ (1/16) * (∫ x in U, energyIntegrand a v vstar P η x) + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (∫ x in U, sqCutoff η x) + + 67 * Θ * Kinf ^ 2 + * (∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i))) := by + have hic : IntegrableOn (cutoffIntegrand a v vstar P c η) U := + integrableOn_cutoffIntegrand hEllO hη hIcc hGη c + have hisq := integrableOn_sqCutoff (m := m) hη hIcc + have hie : IntegrableOn (energyIntegrand a v vstar P η) U := + integrableOn_energyIntegrand hEllO hη hIcc + have hig := integrableOn_gradEtaSq (m := m) hη hGη + have hbnd : IntegrableOn (fun x => (1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i))) U := + ((hie.const_mul _).add (hisq.const_mul _)).add (hig.const_mul _) + have hae : (fun x => cutoffIntegrand a v vstar P c η x) ≤ᵐ[volumeMeasureOn U] + (fun x => (1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i))) := by + have hmem : ∀ᵐ x ∂(volumeMeasureOn U), x ∈ (openCubeSet (originCube d m) : Set (Vec d)) := + ae_restrict_mem (measurableSet_openCubeSet _) + filter_upwards [hmem, hKv, hKvs] with x hx hxv hxvs + exact cutoffIntegrand_le hEllO hη hx hxv hxvs + calc (∫ x in U, cutoffIntegrand a v vstar P c η x) + ≤ ∫ x in U, ((1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i))) := + setIntegral_mono_ae_restrict hic hbnd hae + _ = (1/16) * (∫ x in U, energyIntegrand a v vstar P η x) + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * (∫ x in U, sqCutoff η x) + + 67 * Θ * Kinf ^ 2 + * (∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i))) := by + have e1 : (∫ x in U, ((1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i)))) + = (∫ x in U, ((1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x)) + + ∫ x in U, 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i)) := + integral_add ((hie.const_mul _).add (hisq.const_mul _)) (hig.const_mul _) + have e2 : (∫ x in U, ((1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x)) + = (∫ x in U, (1/16) * energyIntegrand a v vstar P η x) + + ∫ x in U, 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x := + integral_add (hie.const_mul _) (hisq.const_mul _) + rw [e1, e2, integral_const_mul, integral_const_mul, integral_const_mul] + +/-! ## `∑ᵢ(∂ᵢη)² = |∇η|²` bridge -/ + +omit [NeZero d] in +/-- The coordinate expression of `|∇η|²` equals its vector norm. -/ +theorem gradEtaSq_eq_vecNormSq {η : Vec d → ℝ} (x : Vec d) : + (∑ i, (fderiv ℝ η x (basisVec i)) ^ 2) + = vecNormSq (fun i => fderiv ℝ η x (basisVec i)) := by + unfold vecNormSq vecDot + exact Finset.sum_congr rfl (fun i _ => by rw [pow_two]) + +/-! ## Θ ≥ 0 from ellipticity on the (nonempty) cube -/ + +omit [NeZero d] in +/-- The ellipticity parameter is nonnegative on the nonempty cube. -/ +theorem theta_nonneg_of_isEllipticFieldOn {a : CoeffField d} {Θ : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) : 0 ≤ Θ := by + have hne : Set.Nonempty (openCubeSet (originCube d m)) := by + refine ⟨cubeCenter (originCube d m), ?_⟩ + rw [← ball_cubeCenter_eq_openCubeSet] + exact Metric.mem_ball_self (cubeRadius_pos _) + obtain ⟨x0, hx0⟩ := hne + exact le_trans zero_le_one (hEllO.2 x0 hx0).2.1 + +/-! ## T1 — the centered energy bound -/ + +omit [NeZero d] in +/-- **T1 — `centered_local_block_energy`.** The `𝓔`-level bound of `p.local.block.energy`. -/ +theorem centered_local_block_energy {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} {Gη c Kinf : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hWeak : CoupledWeakForm a U P.2 v vstar) + (hTrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x)) + (hKv : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + ≤ Cd * ((Θ * vecNormSq P.1 + vecNormSq P.2) + * (volume (Function.support η ∩ U)).toReal + + Θ * Kinf ^ 2 * (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2)) := by + -- rewrite the `𝓔`-integrand to `energyIntegrand` + have hEeq : (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + = ∫ x in U, energyIntegrand a v vstar P η x := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + simp only [energyIntegrand, centeredPotential_grad, sqCutoff_apply] + -- rewrite the gradient-squared integral to `vecNormSq` + have hIGeq : (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2) + = ∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i)) := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + exact gradEtaSq_eq_vecNormSq x + rw [hEeq, hIGeq] + -- abbreviations + set 𝓔 := ∫ x in U, energyIntegrand a v vstar P η x with h𝓔 + set Isq := ∫ x in U, sqCutoff η x with hIsq + set IG := ∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i)) with hIG + set M2 := Θ * vecNormSq P.1 + vecNormSq P.2 with hM2 + have hΘ0 : 0 ≤ Θ := theta_nonneg_of_isEllipticFieldOn (m := m) hEllO + have hM20 : 0 ≤ M2 := by + rw [hM2]; exact add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hvol0 : 0 ≤ (volume (Function.support η ∩ U)).toReal := ENNReal.toReal_nonneg + have hIG0 : 0 ≤ IG := by + rw [hIG] + exact setIntegral_nonneg (measurableSet_openCubeSet _) (fun x _ => vecNormSq_nonneg _) + have hIsqvol : Isq ≤ (volume (Function.support η ∩ U)).toReal := by + rw [hIsq]; exact setIntegral_sqCutoff_le hη hIcc + -- the test identity and the two integral estimates + have hsplit : 𝓔 = (∫ x in U, bulkIntegrand a v vstar P η x) + + (∫ x in U, cutoffIntegrand a v vstar P c η x) := by + rw [h𝓔]; exact energyIntegral_eq_bulk_add_cutoff hEllO hη hIcc hGη hWeak hTrace + have hbulk : (∫ x in U, bulkIntegrand a v vstar P η x) ≤ 5 * M2 * Isq + (1/8) * 𝓔 := by + rw [hM2, hIsq, h𝓔]; exact setIntegral_bulkIntegrand_le hEllO hη hIcc + have hcut : (∫ x in U, cutoffIntegrand a v vstar P c η x) + ≤ (1/16) * 𝓔 + 2 * M2 * Isq + 67 * Θ * Kinf ^ 2 * IG := by + rw [hM2, hIsq, h𝓔, hIG]; exact setIntegral_cutoffIntegrand_le hEllO hη hIcc hGη hKv hKvs + -- combine and absorb + have hKinf2 : 0 ≤ Kinf ^ 2 := sq_nonneg _ + have hMsqvol : 5 * M2 * Isq ≤ 5 * M2 * (volume (Function.support η ∩ U)).toReal := + mul_le_mul_of_nonneg_left hIsqvol (by positivity) + have hMsqvol2 : 2 * M2 * Isq ≤ 2 * M2 * (volume (Function.support η ∩ U)).toReal := + mul_le_mul_of_nonneg_left hIsqvol (by positivity) + refine ⟨128, by norm_num, ?_⟩ + have hΘKIG : 0 ≤ Θ * Kinf ^ 2 * IG := + mul_nonneg (mul_nonneg hΘ0 hKinf2) hIG0 + have hMvol0 : 0 ≤ M2 * (volume (Function.support η ∩ U)).toReal := + mul_nonneg hM20 hvol0 + nlinarith [hsplit, hbulk, hcut, hMsqvol, hMsqvol2, hΘKIG, hMvol0] + +/-! ## T2 — the consumer shape -/ + +omit [NeZero d] in +/-- Adding back the affine part: `2∇v·s∇v ≤ 4V·sV + Θ|p|²` with `V = ∇v − ½p`. -/ +theorem two_symmPart_grad_le {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) (gv p : Vec d) : + 2 * vecDot gv (matVecMul (symmPart A) gv) + ≤ 4 * vecDot (gv - (1/2:ℝ)•p) (matVecMul (symmPart A) (gv - (1/2:ℝ)•p)) + + Θ * vecNormSq p := by + set s := symmPart A with hs + set V := gv - (1/2:ℝ)•p with hVd + set b := (1/2:ℝ)•p with hbd + have hgvVb : gv = V + b := by rw [hVd, hbd]; abel + have hpsd : 0 ≤ vecDot (V - b) (matVecMul s (V - b)) := + vecDot_matVecMul_symmPart_nonneg hA _ + have hpar : vecDot (V + b) (matVecMul s (V + b)) + vecDot (V - b) (matVecMul s (V - b)) + = 2 * vecDot V (matVecMul s V) + 2 * vecDot b (matVecMul s b) := by + have e2 : matVecMul s (V - b) = matVecMul s V - matVecMul s b := by + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg, ← sub_eq_add_neg] + rw [matVecMul_add, e2] + simp only [sub_eq_add_neg, vecDot_add_left, vecDot_add_right, vecDot_neg_left, + vecDot_neg_right] + ring + have hbsb : vecDot b (matVecMul s b) = (1/4) * vecDot p (matVecMul s p) := by + rw [hbd, matVecMul_smul, vecDot_smul_left, vecDot_smul_right]; ring + have hupper : vecDot p (matVecMul s p) ≤ Θ * vecNormSq p := + upperBound_symmPart_of_isEllipticMatrix hA p + rw [hgvVb] + nlinarith [hpar, hpsd, hbsb, hupper] + +omit [NeZero d] in +/-- **T2 — `local_block_energy`.** The consumer shape of `p.local.block.energy`: +the block energy on `C` is controlled by `M²·|supp η ∩ U| + Θ·K∞²·∫_U Σᵢ(∂ᵢη)²`. -/ +theorem local_block_energy {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} {Gη c Kinf : ℝ} + {Z : BlockState d} {C : Set (Vec d)} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hWeak : CoupledWeakForm a U P.2 v vstar) + (hTrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x)) + (hKv : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (hEnergyId : + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + =ᵐ[volumeMeasureOn U] + (fun x => 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x)))) + (hCmeas : MeasurableSet C) (hCU : C ⊆ (openCubeSet (originCube d m) : Set (Vec d))) + (hηC : ∀ᵐ x ∂(volumeMeasureOn C), η x = 1) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + ≤ Cd * ((Θ * vecNormSq P.1 + vecNormSq P.2) + * (volume (Function.support η ∩ U)).toReal + + Θ * Kinf ^ 2 * (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2)) := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hUfin : volume (openCubeSet (originCube d m)) ≠ (⊤ : ENNReal) := + (volume_openCubeSet_originCube_lt_top m).ne + have hCfin : volume C ≠ (⊤ : ENNReal) := + (lt_of_le_of_lt (measure_mono hCU) (volume_openCubeSet_originCube_lt_top m)).ne + set M2 := Θ * vecNormSq P.1 + vecNormSq P.2 with hM2 + set vol := (volume (Function.support η ∩ U)).toReal with hvoldef + set IG := ∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2 with hIGdef + have hΘ0 : 0 ≤ Θ := theta_nonneg_of_isEllipticFieldOn (m := m) hEllO + have hM20 : 0 ≤ M2 := by + rw [hM2]; exact add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + -- abbreviation for the centered energy density + set ced : Vec d → ℝ := fun x => + vecDot (v.grad x - (1/2:ℝ)•P.1) (matVecMul (symmPart (a x)) (v.grad x - (1/2:ℝ)•P.1)) + + vecDot (vstar.grad x - (1/2:ℝ)•P.1) (matVecMul (symmPart (a x)) (vstar.grad x - (1/2:ℝ)•P.1)) + with hced + set gEd : Vec d → ℝ := fun x => + 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x)) with hgEd + -- L² integrability facts on `U` + have hVL2 : MemVectorL2 U (fun x => v.grad x - (1/2:ℝ)•P.1) := memVectorL2_centeredGrad v P + have hVsL2 : MemVectorL2 U (fun x => vstar.grad x - (1/2:ℝ)•P.1) := + memVectorL2_centeredGrad vstar P + have hced_int : IntegrableOn ced U := by + refine (integrableOn_vecDot_of_memVectorL2 hVL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO hVL2)).add + (integrableOn_vecDot_of_memVectorL2 hVsL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO hVsL2)) + have hgEd_int : IntegrableOn gEd U := by + refine (Integrable.const_mul (integrableOn_vecDot_of_memVectorL2 v.grad_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO v.grad_memVectorL2)) 2).add + (Integrable.const_mul (integrableOn_vecDot_of_memVectorL2 vstar.grad_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO vstar.grad_memVectorL2)) 2) + have hbnd_int : IntegrableOn (fun x => 4 * ced x + 2 * M2) U := + (hced_int.const_mul 4).add (integrableOn_const hUfin) + -- Step 1: block energy = grad energy on `C` + have hstep1 : (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + = ∫ x in C, gEd x := by + refine integral_congr_ae ?_ + exact hEnergyId.filter_mono (ae_mono (Measure.restrict_mono hCU le_rfl)) + -- Step 2: grad energy ≤ 4·ced + 2M² a.e. on `C` + have hstep2 : (∫ x in C, gEd x) ≤ ∫ x in C, (4 * ced x + 2 * M2) := by + refine setIntegral_mono_ae_restrict (hgEd_int.mono_set hCU) (hbnd_int.mono_set hCU) ?_ + have hmem : ∀ᵐ x ∂(volumeMeasureOn C), x ∈ (openCubeSet (originCube d m) : Set (Vec d)) := + (ae_restrict_mem hCmeas).mono (fun x hx => hCU hx) + filter_upwards [hmem] with x hx + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + have h1 := two_symmPart_grad_le hA (v.grad x) P.1 + have h2 := two_symmPart_grad_le hA (vstar.grad x) P.1 + have hup : Θ * vecNormSq P.1 ≤ M2 := by + rw [hM2]; nlinarith [vecNormSq_nonneg P.2] + simp only [hgEd, hced] + nlinarith [h1, h2, hup] + -- Step 3: `∫_C (4ced + 2M²) = 4·∫_C ced + 2M²·|C|` + have hcst : (∫ _x in C, (2 * M2 : ℝ)) = 2 * M2 * (volume C).toReal := by + rw [setIntegral_const, smul_eq_mul, mul_comm]; rfl + have hstep3 : (∫ x in C, (4 * ced x + 2 * M2)) + = 4 * (∫ x in C, ced x) + 2 * M2 * (volume C).toReal := by + rw [integral_add ((hced_int.mono_set hCU).const_mul 4) (integrableOn_const hCfin), + integral_const_mul, hcst] + -- Step 4: `∫_C ced = ∫_C energyIntegrand ≤ 𝓔` + have hcedC : (∫ x in C, ced x) = ∫ x in C, energyIntegrand a v vstar P η x := by + refine integral_congr_ae ?_ + filter_upwards [hηC] with x hx + simp only [hced, energyIntegrand, sqCutoff_apply, hx]; ring + have hEnonneg : 0 ≤ᵐ[volumeMeasureOn U] energyIntegrand a v vstar P η := by + have hmem : ∀ᵐ x ∂(volumeMeasureOn U), x ∈ (openCubeSet (originCube d m) : Set (Vec d)) := + ae_restrict_mem (measurableSet_openCubeSet _) + filter_upwards [hmem] with x hx + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + have hnn1 := vecDot_matVecMul_symmPart_nonneg hA (v.grad x - (1/2:ℝ)•P.1) + have hnn2 := vecDot_matVecMul_symmPart_nonneg hA (vstar.grad x - (1/2:ℝ)•P.1) + have hη2 := sqCutoff_nonneg η x + simp only [energyIntegrand] + exact mul_nonneg hη2 (add_nonneg hnn1 hnn2) + have hie : IntegrableOn (energyIntegrand a v vstar P η) U := + integrableOn_energyIntegrand hEllO hη hIcc + have hcedle : (∫ x in C, ced x) ≤ ∫ x in U, energyIntegrand a v vstar P η x := by + rw [hcedC] + exact setIntegral_mono_set hie hEnonneg (LE.le.eventuallyLE hCU) + -- T1 bound on `𝓔` + obtain ⟨Cd1, hCd1, hT1⟩ := + centered_local_block_energy (m := m) (c := c) hEllO hWeak hTrace hKv hKvs hη hIcc hGη + have hEeq : (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + = ∫ x in U, energyIntegrand a v vstar P η x := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + simp only [energyIntegrand, centeredPotential_grad, sqCutoff_apply] + rw [hEeq] at hT1 + -- volume of `C` + have hvolC : (volume C).toReal ≤ vol := by + rw [hvoldef] + have hsub : ∀ᵐ x ∂volume, x ∈ C → + x ∈ (Function.support η ∩ (openCubeSet (originCube d m)) : Set (Vec d)) := by + have hη1 : ∀ᵐ x ∂volume, x ∈ C → η x = 1 := by + rw [← ae_restrict_iff' hCmeas]; exact hηC + filter_upwards [hη1] with x hx hxC + refine ⟨?_, hCU hxC⟩ + rw [Function.mem_support, hx hxC]; norm_num + have hSUfin : volume (Function.support η ∩ (openCubeSet (originCube d m) : Set (Vec d))) + ≠ (⊤ : ENNReal) := + (lt_of_le_of_lt (measure_mono Set.inter_subset_right) + (volume_openCubeSet_originCube_lt_top m)).ne + exact ENNReal.toReal_mono hSUfin (measure_mono_ae hsub) + -- assemble + refine ⟨4 * Cd1 + 2, by linarith [hCd1], ?_⟩ + have hIG0 : 0 ≤ IG := by + rw [hIGdef] + refine setIntegral_nonneg (measurableSet_openCubeSet _) (fun x _ => ?_) + exact Finset.sum_nonneg (fun i _ => sq_nonneg _) + have hΘKIG : 0 ≤ Θ * Kinf ^ 2 * IG := mul_nonneg (mul_nonneg hΘ0 (sq_nonneg _)) hIG0 + have hvol0 : 0 ≤ vol := by rw [hvoldef]; exact ENNReal.toReal_nonneg + have hMvol0 : 0 ≤ M2 * vol := mul_nonneg hM20 hvol0 + have hMvolC : 2 * M2 * (volume C).toReal ≤ 2 * M2 * vol := + mul_le_mul_of_nonneg_left hvolC (by linarith [hM20]) + have hfinal : (∫ x in C, blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + ≤ 4 * (∫ x in U, energyIntegrand a v vstar P η x) + 2 * M2 * (volume C).toReal := by + rw [hstep1] + calc (∫ x in C, gEd x) ≤ ∫ x in C, (4 * ced x + 2 * M2) := hstep2 + _ = 4 * (∫ x in C, ced x) + 2 * M2 * (volume C).toReal := hstep3 + _ ≤ 4 * (∫ x in U, energyIntegrand a v vstar P η x) + 2 * M2 * (volume C).toReal := by + have := mul_le_mul_of_nonneg_left hcedle (by norm_num : (0:ℝ) ≤ 4) + linarith [this] + nlinarith [hfinal, hT1, hMvolC, hΘKIG, hMvol0, hCd1] + +/-! ## T1 and T2 — explicit-numeral (uniform-constant) restatements -/ + +omit [NeZero d] in +/-- **T1 with the explicit numeral `128`.** The witness of +`centered_local_block_energy` is the fixed dimensional constant `128`; this is the +same bound stated with that literal so the consumer can see a field-independent +constant. -/ +theorem centered_local_block_energy_num {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} {Gη c Kinf : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hWeak : CoupledWeakForm a U P.2 v vstar) + (hTrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x)) + (hKv : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) : + (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + ≤ 128 * ((Θ * vecNormSq P.1 + vecNormSq P.2) + * (volume (Function.support η ∩ U)).toReal + + Θ * Kinf ^ 2 * (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2)) := by + have hEeq : (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + = ∫ x in U, energyIntegrand a v vstar P η x := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + simp only [energyIntegrand, centeredPotential_grad, sqCutoff_apply] + have hIGeq : (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2) + = ∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i)) := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + exact gradEtaSq_eq_vecNormSq x + rw [hEeq, hIGeq] + set 𝓔 := ∫ x in U, energyIntegrand a v vstar P η x with h𝓔 + set Isq := ∫ x in U, sqCutoff η x with hIsq + set IG := ∫ x in U, vecNormSq (fun i => fderiv ℝ η x (basisVec i)) with hIG + set M2 := Θ * vecNormSq P.1 + vecNormSq P.2 with hM2 + have hΘ0 : 0 ≤ Θ := theta_nonneg_of_isEllipticFieldOn (m := m) hEllO + have hM20 : 0 ≤ M2 := by + rw [hM2]; exact add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hvol0 : 0 ≤ (volume (Function.support η ∩ U)).toReal := ENNReal.toReal_nonneg + have hIG0 : 0 ≤ IG := by + rw [hIG] + exact setIntegral_nonneg (measurableSet_openCubeSet _) (fun x _ => vecNormSq_nonneg _) + have hIsqvol : Isq ≤ (volume (Function.support η ∩ U)).toReal := by + rw [hIsq]; exact setIntegral_sqCutoff_le hη hIcc + have hsplit : 𝓔 = (∫ x in U, bulkIntegrand a v vstar P η x) + + (∫ x in U, cutoffIntegrand a v vstar P c η x) := by + rw [h𝓔]; exact energyIntegral_eq_bulk_add_cutoff hEllO hη hIcc hGη hWeak hTrace + have hbulk : (∫ x in U, bulkIntegrand a v vstar P η x) ≤ 5 * M2 * Isq + (1/8) * 𝓔 := by + rw [hM2, hIsq, h𝓔]; exact setIntegral_bulkIntegrand_le hEllO hη hIcc + have hcut : (∫ x in U, cutoffIntegrand a v vstar P c η x) + ≤ (1/16) * 𝓔 + 2 * M2 * Isq + 67 * Θ * Kinf ^ 2 * IG := by + rw [hM2, hIsq, h𝓔, hIG]; exact setIntegral_cutoffIntegrand_le hEllO hη hIcc hGη hKv hKvs + have hKinf2 : 0 ≤ Kinf ^ 2 := sq_nonneg _ + have hMsqvol : 5 * M2 * Isq ≤ 5 * M2 * (volume (Function.support η ∩ U)).toReal := + mul_le_mul_of_nonneg_left hIsqvol (by positivity) + have hMsqvol2 : 2 * M2 * Isq ≤ 2 * M2 * (volume (Function.support η ∩ U)).toReal := + mul_le_mul_of_nonneg_left hIsqvol (by positivity) + have hΘKIG : 0 ≤ Θ * Kinf ^ 2 * IG := + mul_nonneg (mul_nonneg hΘ0 hKinf2) hIG0 + have hMvol0 : 0 ≤ M2 * (volume (Function.support η ∩ U)).toReal := + mul_nonneg hM20 hvol0 + nlinarith [hsplit, hbulk, hcut, hMsqvol, hMsqvol2, hΘKIG, hMvol0] + +omit [NeZero d] in +/-- **T2 with the explicit numeral `514 = 4·128 + 2`.** The uniform-constant +restatement of `local_block_energy`: its witness is the field-independent +dimensional constant `514`, exposed here as a literal so the per-core energy +bound can be made uniform over realizations. -/ +theorem local_block_energy_uniform {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} {Gη c Kinf : ℝ} + {Z : BlockState d} {C : Set (Vec d)} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hWeak : CoupledWeakForm a U P.2 v vstar) + (hTrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x)) + (hKv : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : ∀ᵐ x ∂(volumeMeasureOn U), |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (hEnergyId : + (fun x => blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + =ᵐ[volumeMeasureOn U] + (fun x => 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x)))) + (hCmeas : MeasurableSet C) (hCU : C ⊆ (openCubeSet (originCube d m) : Set (Vec d))) + (hηC : ∀ᵐ x ∂(volumeMeasureOn C), η x = 1) : + (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + ≤ 514 * ((Θ * vecNormSq P.1 + vecNormSq P.2) + * (volume (Function.support η ∩ U)).toReal + + Θ * Kinf ^ 2 * (∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2)) := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hUfin : volume (openCubeSet (originCube d m)) ≠ (⊤ : ENNReal) := + (volume_openCubeSet_originCube_lt_top m).ne + have hCfin : volume C ≠ (⊤ : ENNReal) := + (lt_of_le_of_lt (measure_mono hCU) (volume_openCubeSet_originCube_lt_top m)).ne + set M2 := Θ * vecNormSq P.1 + vecNormSq P.2 with hM2 + set vol := (volume (Function.support η ∩ U)).toReal with hvoldef + set IG := ∫ x in U, ∑ i, (fderiv ℝ η x (basisVec i)) ^ 2 with hIGdef + have hΘ0 : 0 ≤ Θ := theta_nonneg_of_isEllipticFieldOn (m := m) hEllO + have hM20 : 0 ≤ M2 := by + rw [hM2]; exact add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + set ced : Vec d → ℝ := fun x => + vecDot (v.grad x - (1/2:ℝ)•P.1) (matVecMul (symmPart (a x)) (v.grad x - (1/2:ℝ)•P.1)) + + vecDot (vstar.grad x - (1/2:ℝ)•P.1) (matVecMul (symmPart (a x)) (vstar.grad x - (1/2:ℝ)•P.1)) + with hced + set gEd : Vec d → ℝ := fun x => + 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x)) with hgEd + have hVL2 : MemVectorL2 U (fun x => v.grad x - (1/2:ℝ)•P.1) := memVectorL2_centeredGrad v P + have hVsL2 : MemVectorL2 U (fun x => vstar.grad x - (1/2:ℝ)•P.1) := + memVectorL2_centeredGrad vstar P + have hced_int : IntegrableOn ced U := by + refine (integrableOn_vecDot_of_memVectorL2 hVL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO hVL2)).add + (integrableOn_vecDot_of_memVectorL2 hVsL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO hVsL2)) + have hgEd_int : IntegrableOn gEd U := by + refine (Integrable.const_mul (integrableOn_vecDot_of_memVectorL2 v.grad_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO v.grad_memVectorL2)) 2).add + (Integrable.const_mul (integrableOn_vecDot_of_memVectorL2 vstar.grad_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO vstar.grad_memVectorL2)) 2) + have hbnd_int : IntegrableOn (fun x => 4 * ced x + 2 * M2) U := + (hced_int.const_mul 4).add (integrableOn_const hUfin) + have hstep1 : (∫ x in C, blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + = ∫ x in C, gEd x := by + refine integral_congr_ae ?_ + exact hEnergyId.filter_mono (ae_mono (Measure.restrict_mono hCU le_rfl)) + have hstep2 : (∫ x in C, gEd x) ≤ ∫ x in C, (4 * ced x + 2 * M2) := by + refine setIntegral_mono_ae_restrict (hgEd_int.mono_set hCU) (hbnd_int.mono_set hCU) ?_ + have hmem : ∀ᵐ x ∂(volumeMeasureOn C), x ∈ (openCubeSet (originCube d m) : Set (Vec d)) := + (ae_restrict_mem hCmeas).mono (fun x hx => hCU hx) + filter_upwards [hmem] with x hx + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + have h1 := two_symmPart_grad_le hA (v.grad x) P.1 + have h2 := two_symmPart_grad_le hA (vstar.grad x) P.1 + have hup : Θ * vecNormSq P.1 ≤ M2 := by + rw [hM2]; nlinarith [vecNormSq_nonneg P.2] + simp only [hgEd, hced] + nlinarith [h1, h2, hup] + have hcst : (∫ _x in C, (2 * M2 : ℝ)) = 2 * M2 * (volume C).toReal := by + rw [setIntegral_const, smul_eq_mul, mul_comm]; rfl + have hstep3 : (∫ x in C, (4 * ced x + 2 * M2)) + = 4 * (∫ x in C, ced x) + 2 * M2 * (volume C).toReal := by + rw [integral_add ((hced_int.mono_set hCU).const_mul 4) (integrableOn_const hCfin), + integral_const_mul, hcst] + have hcedC : (∫ x in C, ced x) = ∫ x in C, energyIntegrand a v vstar P η x := by + refine integral_congr_ae ?_ + filter_upwards [hηC] with x hx + simp only [hced, energyIntegrand, sqCutoff_apply, hx]; ring + have hEnonneg : 0 ≤ᵐ[volumeMeasureOn U] energyIntegrand a v vstar P η := by + have hmem : ∀ᵐ x ∂(volumeMeasureOn U), x ∈ (openCubeSet (originCube d m) : Set (Vec d)) := + ae_restrict_mem (measurableSet_openCubeSet _) + filter_upwards [hmem] with x hx + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + have hnn1 := vecDot_matVecMul_symmPart_nonneg hA (v.grad x - (1/2:ℝ)•P.1) + have hnn2 := vecDot_matVecMul_symmPart_nonneg hA (vstar.grad x - (1/2:ℝ)•P.1) + have hη2 := sqCutoff_nonneg η x + simp only [energyIntegrand] + exact mul_nonneg hη2 (add_nonneg hnn1 hnn2) + have hie : IntegrableOn (energyIntegrand a v vstar P η) U := + integrableOn_energyIntegrand hEllO hη hIcc + have hcedle : (∫ x in C, ced x) ≤ ∫ x in U, energyIntegrand a v vstar P η x := by + rw [hcedC] + exact setIntegral_mono_set hie hEnonneg (LE.le.eventuallyLE hCU) + have hT1 := + centered_local_block_energy_num (m := m) (c := c) hEllO hWeak hTrace hKv hKvs hη hIcc hGη + have hEeq : (∫ x in U, (η x) ^ 2 + * (vecDot ((centeredPotential m v P.1 c).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m v P.1 c).grad x)) + + vecDot ((centeredPotential m vstar P.1 (-c)).grad x) + (matVecMul (symmPart (a x)) ((centeredPotential m vstar P.1 (-c)).grad x)))) + = ∫ x in U, energyIntegrand a v vstar P η x := by + refine setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => ?_) + simp only [energyIntegrand, centeredPotential_grad, sqCutoff_apply] + rw [hEeq] at hT1 + have hvolC : (volume C).toReal ≤ vol := by + rw [hvoldef] + have hsub : ∀ᵐ x ∂volume, x ∈ C → + x ∈ (Function.support η ∩ (openCubeSet (originCube d m)) : Set (Vec d)) := by + have hη1 : ∀ᵐ x ∂volume, x ∈ C → η x = 1 := by + rw [← ae_restrict_iff' hCmeas]; exact hηC + filter_upwards [hη1] with x hx hxC + refine ⟨?_, hCU hxC⟩ + rw [Function.mem_support, hx hxC]; norm_num + have hSUfin : volume (Function.support η ∩ (openCubeSet (originCube d m) : Set (Vec d))) + ≠ (⊤ : ENNReal) := + (lt_of_le_of_lt (measure_mono Set.inter_subset_right) + (volume_openCubeSet_originCube_lt_top m)).ne + exact ENNReal.toReal_mono hSUfin (measure_mono_ae hsub) + have hIG0 : 0 ≤ IG := by + rw [hIGdef] + refine setIntegral_nonneg (measurableSet_openCubeSet _) (fun x _ => ?_) + exact Finset.sum_nonneg (fun i _ => sq_nonneg _) + have hΘKIG : 0 ≤ Θ * Kinf ^ 2 * IG := mul_nonneg (mul_nonneg hΘ0 (sq_nonneg _)) hIG0 + have hvol0 : 0 ≤ vol := by rw [hvoldef]; exact ENNReal.toReal_nonneg + have hMvol0 : 0 ≤ M2 * vol := mul_nonneg hM20 hvol0 + have hMvolC : 2 * M2 * (volume C).toReal ≤ 2 * M2 * vol := + mul_le_mul_of_nonneg_left hvolC (by linarith [hM20]) + have hfinal : (∫ x in C, blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x))) + ≤ 4 * (∫ x in U, energyIntegrand a v vstar P η x) + 2 * M2 * (volume C).toReal := by + rw [hstep1] + calc (∫ x in C, gEd x) ≤ ∫ x in C, (4 * ced x + 2 * M2) := hstep2 + _ = 4 * (∫ x in C, ced x) + 2 * M2 * (volume C).toReal := hstep3 + _ ≤ 4 * (∫ x in U, energyIntegrand a v vstar P η x) + 2 * M2 * (volume C).toReal := by + have := mul_le_mul_of_nonneg_left hcedle (by norm_num : (0:ℝ) ≤ 4) + linarith [this] + nlinarith [hfinal, hT1, hMvolC, hΘKIG, hMvol0] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Bounds.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Bounds.lean new file mode 100644 index 0000000000..9749408e8f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Bounds.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Identity + +/-! +# Local block energy: the bulk and cutoff estimates + +Pointwise upper bounds on the bulk and cutoff densities of the test identity, +absorbed against the energy density, following `e.local.block.bulk` and +`e.local.block.cutoff`. Integrating gives the centered energy bound +(`e.local.block.centered.energy`), the analytic core of `T1`. + +* bulk: `bulk x ≤ 5M²·η² + ⅛·𝓔-density`; +* cutoff: `cutoff x ≤ 5M²·η² + ⅟₁₆·𝓔-density + 67Θ·K∞²·|∇η|²` (a.e.), + +where `M² = Θ|p|² + |q|²`. No `EuclideanSpace`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## Elementary scalar helpers -/ + +/-- Cauchy–Schwarz for the dot product in square-root form. -/ +theorem abs_vecDot_le_sqrt_mul_sqrt (x y : Vec d) : + |vecDot x y| ≤ Real.sqrt (vecNormSq x) * Real.sqrt (vecNormSq y) := by + have hcs : vecDot x y ^ 2 ≤ vecNormSq x * vecNormSq y := + sq_vecDot_le_vecNormSq_mul_vecNormSq x y + have h1 : |vecDot x y| = Real.sqrt (vecDot x y ^ 2) := by + rw [Real.sqrt_sq_eq_abs] + rw [h1, ← Real.sqrt_mul (vecNormSq_nonneg x)] + exact Real.sqrt_le_sqrt hcs + +/-- `a·b ≤ ½a² + ½b²`. -/ +theorem mul_le_half_sq_add_half_sq (a b : ℝ) : a * b ≤ a ^ 2 / 2 + b ^ 2 / 2 := by + nlinarith [sq_nonneg (a - b)] + +/-- AM–GM from a squared bound: if `x² ≤ 4c₁c₂` with `x, c₁, c₂ ≥ 0` then +`x ≤ c₁ + c₂`. -/ +theorem amgm_of_sq_le {x c1 c2 : ℝ} (hx : 0 ≤ x) (hc1 : 0 ≤ c1) (hc2 : 0 ≤ c2) + (hsq : x ^ 2 ≤ 4 * c1 * c2) : x ≤ c1 + c2 := by + have h1 : x ^ 2 ≤ (c1 + c2) ^ 2 := by nlinarith [sq_nonneg (c1 - c2)] + have h2 := Real.sqrt_le_sqrt h1 + rwa [Real.sqrt_sq hx, Real.sqrt_sq (by linarith)] at h2 + +/-- Cauchy–Schwarz + AM–GM packaged: from a dot-product Cauchy–Schwarz bound +and a matching product bound, `K·|D| ≤ A + B`. -/ +theorem amgm_term {K D nX nG A B : ℝ} (hK : 0 ≤ K) (hCS : D ^ 2 ≤ nX * nG) + (hA : 0 ≤ A) (hB : 0 ≤ B) (hkey : K ^ 2 * (nX * nG) ≤ 4 * A * B) : + K * |D| ≤ A + B := by + have hx : 0 ≤ K * |D| := mul_nonneg hK (abs_nonneg _) + have hsq : (K * |D|) ^ 2 ≤ 4 * A * B := by + have he : (K * |D|) ^ 2 = K ^ 2 * D ^ 2 := by rw [mul_pow, sq_abs] + rw [he] + have := mul_le_mul_of_nonneg_left hCS (sq_nonneg K) + linarith [hkey] + exact amgm_of_sq_le hx hA hB hsq + +/-- A single cutoff dot-product term: Cauchy–Schwarz against `∇(η²)` plus AM–GM. +`|∇(η²)|² = 4η²N`, `|X|² ≤ Q`, and `4K²η²N·Q = 4AB` give `K·|X·∇(η²)| ≤ A + B`. -/ +theorem cutoff_amgm_dot {K ηx N Q A B : ℝ} {X gS : Vec d} + (hK : 0 ≤ K) (hgSN : vecNormSq gS = 4 * ηx ^ 2 * N) (hnX : vecNormSq X ≤ Q) + (hA : 0 ≤ A) (hB : 0 ≤ B) (hfac : 0 ≤ 4 * K ^ 2 * ηx ^ 2 * N) + (hkey : 4 * K ^ 2 * ηx ^ 2 * N * Q ≤ 4 * A * B) : + K * |vecDot X gS| ≤ A + B := by + refine amgm_term hK (sq_vecDot_le_vecNormSq_mul_vecNormSq X gS) hA hB ?_ + rw [hgSN] + nlinarith [mul_le_mul_of_nonneg_left hnX hfac, hkey] + +/-- The absolute-value decomposition of the cutoff density into five scalar +terms, each dominated by `K = K∞`. -/ +theorem cutoff_abs_split {uu uus K t1 t2 t3 t4 t5 : ℝ} + (hK : 0 ≤ K) (huu : |uu| ≤ K) (huus : |uus| ≤ K) : + uu * (t1 - t2 - (1/2) * t3) - uus * (t4 + (1/2) * t5) + ≤ K * |t1| + K * |t2| + (1/2) * (K * |t3|) + + K * |t4| + (1/2) * (K * |t5|) := by + have hD1abs : |t1 - t2 - (1/2) * t3| ≤ |t1| + |t2| + (1/2) * |t3| := by + have h1 := abs_sub (t1 - t2) ((1/2) * t3) + have h2 := abs_sub t1 t2 + have h3 : |(1/2) * t3| = (1/2) * |t3| := by rw [abs_mul]; norm_num + linarith [h1, h2, h3.le, h3.ge] + have hD2abs : |t4 + (1/2) * t5| ≤ |t4| + (1/2) * |t5| := by + have h1 := abs_add_le t4 ((1/2) * t5) + have h3 : |(1/2) * t5| = (1/2) * |t5| := by rw [abs_mul]; norm_num + linarith [h1, h3.le, h3.ge] + have huu1 : |uu * (t1 - t2 - (1/2) * t3)| + ≤ K * |t1| + K * |t2| + (1/2) * (K * |t3|) := by + rw [abs_mul] + calc |uu| * |t1 - t2 - (1/2) * t3| + ≤ K * (|t1| + |t2| + (1/2) * |t3|) := mul_le_mul huu hD1abs (abs_nonneg _) hK + _ = _ := by ring + have huu2 : |uus * (t4 + (1/2) * t5)| + ≤ K * |t4| + (1/2) * (K * |t5|) := by + rw [abs_mul] + calc |uus| * |t4 + (1/2) * t5| + ≤ K * (|t4| + (1/2) * |t5|) := mul_le_mul huus hD2abs (abs_nonneg _) hK + _ = _ := by ring + have hself := le_abs_self (uu * (t1 - t2 - (1/2) * t3) - uus * (t4 + (1/2) * t5)) + have ha2 := abs_sub (uu * (t1 - t2 - (1/2) * t3)) (uus * (t4 + (1/2) * t5)) + linarith [hself, ha2, huu1, huu2] + +section Cube + +variable [NeZero d] {m : ℤ} + +local notation "U" => openCubeSet (originCube d m) + +/-! ## The bulk estimate -/ + +omit [NeZero d] in +/-- **Bulk density bound.** For `x ∈ U`, +`bulk x ≤ 5M²·η²(x) + ⅛·(energy density)(x)`. -/ +theorem bulkIntegrand_le {a : CoeffField d} {Θ : ℝ} {v vstar : H1Function U} + {P : BlockVec d} {η : Vec d → ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) {x : Vec d} (hx : x ∈ U) : + bulkIntegrand a v vstar P η x + ≤ 5 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + (1/8) * energyIntegrand a v vstar P η x := by + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + set V := v.grad x - (1/2:ℝ)•P.1 with hVdef + set Vstar := vstar.grad x - (1/2:ℝ)•P.1 with hVsdef + set Msq := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + -- nonnegativity of the two `s`-forms + have hVsV : 0 ≤ vecDot V (matVecMul (symmPart (a x)) V) := + vecDot_matVecMul_symmPart_nonneg hA V + have hVsVs : 0 ≤ vecDot Vstar (matVecMul (symmPart (a x)) Vstar) := + vecDot_matVecMul_symmPart_nonneg hA Vstar + -- term 1 : `(q − ½ap)·V` + have hy1 := symmForm_young hA (t := (1/4:ℝ)) (by norm_num) + (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) V + have hb1 := symmPartInv_bulkV_le hA P.1 P.2 + have hterm1 : vecDot (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) V + ≤ 4 * Msq + (1/8) * vecDot V (matVecMul (symmPart (a x)) V) := by + nlinarith [hy1, hb1] + -- term 2 : `−½(aᵀp)·V*` + set ξ2 : Vec d := -(matVecMul (matTranspose (a x)) P.1) with hξ2 + have hy2 := symmForm_young hA (t := (1/4:ℝ)) (by norm_num) ξ2 Vstar + have hb2raw := symmPartInv_imageTranspose_le hA P.1 + have hb2 : vecDot ξ2 (matVecMul (symmPart (a x))⁻¹ ξ2) ≤ Msq := by + have heq : vecDot ξ2 (matVecMul (symmPart (a x))⁻¹ ξ2) + = vecDot (matVecMul (matTranspose (a x)) P.1) + (matVecMul (symmPart (a x))⁻¹ (matVecMul (matTranspose (a x)) P.1)) := by + simp only [hξ2, matVecMul_neg, vecDot_neg_left, vecDot_neg_right, neg_neg] + rw [heq] + have : Θ * vecNormSq P.1 ≤ Msq := by + rw [hMsqdef]; nlinarith [vecNormSq_nonneg P.2] + exact le_trans hb2raw this + have hterm2 : -(1/2:ℝ) * vecDot (matVecMul (matTranspose (a x)) P.1) Vstar + ≤ Msq + (1/16) * vecDot Vstar (matVecMul (symmPart (a x)) Vstar) := by + have hneg : -(1/2:ℝ) * vecDot (matVecMul (matTranspose (a x)) P.1) Vstar + = (1/2:ℝ) * vecDot ξ2 Vstar := by + rw [hξ2, vecDot_neg_left]; ring + rw [hneg] + nlinarith [hy2, hb2] + -- combine and multiply by `η² ≥ 0` + have hinner : vecDot (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) V + - (1/2:ℝ) * vecDot (matVecMul (matTranspose (a x)) P.1) Vstar + ≤ 5 * Msq + + (1/8) * (vecDot V (matVecMul (symmPart (a x)) V) + + vecDot Vstar (matVecMul (symmPart (a x)) Vstar)) := by + nlinarith [hterm1, hterm2, hVsVs] + have hη2 : 0 ≤ sqCutoff η x := sqCutoff_nonneg η x + calc bulkIntegrand a v vstar P η x + = sqCutoff η x * (vecDot (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) V + - (1/2:ℝ) * vecDot (matVecMul (matTranspose (a x)) P.1) Vstar) := rfl + _ ≤ sqCutoff η x * (5 * Msq + + (1/8) * (vecDot V (matVecMul (symmPart (a x)) V) + + vecDot Vstar (matVecMul (symmPart (a x)) Vstar))) := + mul_le_mul_of_nonneg_left hinner hη2 + _ = 5 * Msq * sqCutoff η x + (1/8) * energyIntegrand a v vstar P η x := by + simp only [energyIntegrand, hVdef, hVsdef]; ring + +/-! ## The cutoff estimate -/ + +omit [NeZero d] in +/-- **Cutoff density bound** (a.e.). For `x ∈ U` with `|u|, |u*| ≤ K∞`, +requiring no range condition on the cutoff, +`cutoff x ≤ ⅟₁₆·(energy density)(x) + 2M²·η²(x) + 67Θ·K∞²·|∇η(x)|²`. -/ +theorem cutoffIntegrand_le {a : CoeffField d} {Θ : ℝ} {v vstar : H1Function U} + {P : BlockVec d} {η : Vec d → ℝ} {c Kinf : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) (hη : ContDiff ℝ (⊤ : ℕ∞) η) + {x : Vec d} (hx : x ∈ U) + (hKv : |(centeredPotential m v P.1 c).toFun x| ≤ Kinf) + (hKvs : |(centeredPotential m vstar P.1 (-c)).toFun x| ≤ Kinf) : + cutoffIntegrand a v vstar P c η x + ≤ (1/16) * energyIntegrand a v vstar P η x + + 2 * (Θ * vecNormSq P.1 + vecNormSq P.2) * sqCutoff η x + + 67 * Θ * Kinf ^ 2 * vecNormSq (fun i => fderiv ℝ η x (basisVec i)) := by + have hA : IsThetaElliptic Θ (a x) := hEllO.2 x hx + have hΘ1 : (1 : ℝ) ≤ Θ := hA.2.1 + have hΘ0 : (0 : ℝ) ≤ Θ := by linarith + have hKinf0 : (0 : ℝ) ≤ Kinf := le_trans (abs_nonneg _) hKv + set V := v.grad x - (1/2:ℝ)•P.1 with hVdef + set Vstar := vstar.grad x - (1/2:ℝ)•P.1 with hVsdef + set EV := vecDot V (matVecMul (symmPart (a x)) V) with hEVdef + set EVs := vecDot Vstar (matVecMul (symmPart (a x)) Vstar) with hEVsdef + have hEV0 : 0 ≤ EV := vecDot_matVecMul_symmPart_nonneg hA V + have hEVs0 : 0 ≤ EVs := vecDot_matVecMul_symmPart_nonneg hA Vstar + set Msq := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : 0 ≤ Msq := + add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + set N := vecNormSq (fun i => fderiv ℝ η x (basisVec i)) with hNdef + have hN0 : 0 ≤ N := vecNormSq_nonneg _ + have hgSN : vecNormSq (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) + = 4 * (η x) ^ 2 * N := by + have hgSeq : (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) + = (2 * η x) • (fun i => fderiv ℝ η x (basisVec i)) := by + funext i; rw [fderiv_sqCutoff hη x i]; simp [Pi.smul_apply, mul_comm, mul_assoc] + rw [hgSeq, vecNormSq_smul, hNdef]; ring + set gS := fun i => fderiv ℝ (sqCutoff η) x (basisVec i) with hgSdef + -- squared-norm bounds + have hnP2 : vecNormSq P.2 ≤ Msq := by + rw [hMsqdef]; exact le_add_of_nonneg_left (mul_nonneg hΘ0 (vecNormSq_nonneg P.1)) + have hnaV : vecNormSq (matVecMul (a x) V) ≤ 2 * Θ * EV := vecNormSq_image_le hA V + have hnaVs : vecNormSq (matVecMul (matTranspose (a x)) Vstar) ≤ 2 * Θ * EVs := + vecNormSq_imageTranspose_le hA Vstar + have hnaP1 : vecNormSq (matVecMul (a x) P.1) ≤ 2 * Θ * Msq := by + have h1 := vecNormSq_image_le hA P.1 + have h2 := upperBound_symmPart_of_isEllipticMatrix hA P.1 + have h3 : 2 * Θ * vecDot P.1 (matVecMul (symmPart (a x)) P.1) + ≤ 2 * Θ * (Θ * vecNormSq P.1) := + mul_le_mul_of_nonneg_left h2 (by linarith) + have h4 : 0 ≤ 2 * Θ * vecNormSq P.2 := + mul_nonneg (by linarith) (vecNormSq_nonneg P.2) + rw [hMsqdef]; linarith [h1, h3, h4] + have hnaTP1 : vecNormSq (matVecMul (matTranspose (a x)) P.1) ≤ 2 * Θ * Msq := by + have h1 := vecNormSq_imageTranspose_le hA P.1 + have h2 := upperBound_symmPart_of_isEllipticMatrix hA P.1 + have h3 : 2 * Θ * vecDot P.1 (matVecMul (symmPart (a x)) P.1) + ≤ 2 * Θ * (Θ * vecNormSq P.1) := + mul_le_mul_of_nonneg_left h2 (by linarith) + have h4 : 0 ≤ 2 * Θ * vecNormSq P.2 := + mul_nonneg (by linarith) (vecNormSq_nonneg P.2) + rw [hMsqdef]; linarith [h1, h3, h4] + -- nonnegativity of the AM–GM operands + have hfac : 0 ≤ 4 * Kinf ^ 2 * (η x) ^ 2 * N := + mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) (sq_nonneg _)) (sq_nonneg _)) hN0 + have hAMsq : 0 ≤ (η x) ^ 2 * Msq := mul_nonneg (sq_nonneg _) hMsq0 + have hB1 : 0 ≤ Kinf ^ 2 * N := mul_nonneg (sq_nonneg _) hN0 + have hB32 : 0 ≤ 32 * Θ * Kinf ^ 2 * N := + mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hΘ0) (sq_nonneg _)) hN0 + have hB2 : 0 ≤ 2 * Θ * Kinf ^ 2 * N := + mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hΘ0) (sq_nonneg _)) hN0 + have hAEV : 0 ≤ (1/16) * ((η x) ^ 2 * EV) := + mul_nonneg (by norm_num) (mul_nonneg (sq_nonneg _) hEV0) + have hAEVs : 0 ≤ (1/16) * ((η x) ^ 2 * EVs) := + mul_nonneg (by norm_num) (mul_nonneg (sq_nonneg _) hEVs0) + -- the five per-term bounds (each a term-mode application) + have bP2 : Kinf * |vecDot P.2 gS| ≤ (η x) ^ 2 * Msq + Kinf ^ 2 * N := + cutoff_amgm_dot hKinf0 hgSN hnP2 hAMsq hB1 hfac (le_of_eq (by ring)) + have baV : Kinf * |vecDot (matVecMul (a x) V) gS| + ≤ (1/16) * ((η x) ^ 2 * EV) + 32 * Θ * Kinf ^ 2 * N := + cutoff_amgm_dot hKinf0 hgSN hnaV hAEV hB32 hfac (le_of_eq (by ring)) + have baP1 : Kinf * |vecDot (matVecMul (a x) P.1) gS| + ≤ (η x) ^ 2 * Msq + 2 * Θ * Kinf ^ 2 * N := + cutoff_amgm_dot hKinf0 hgSN hnaP1 hAMsq hB2 hfac (le_of_eq (by ring)) + have baVs : Kinf * |vecDot (matVecMul (matTranspose (a x)) Vstar) gS| + ≤ (1/16) * ((η x) ^ 2 * EVs) + 32 * Θ * Kinf ^ 2 * N := + cutoff_amgm_dot hKinf0 hgSN hnaVs hAEVs hB32 hfac (le_of_eq (by ring)) + have baTP1 : Kinf * |vecDot (matVecMul (matTranspose (a x)) P.1) gS| + ≤ (η x) ^ 2 * Msq + 2 * Θ * Kinf ^ 2 * N := + cutoff_amgm_dot hKinf0 hgSN hnaTP1 hAMsq hB2 hfac (le_of_eq (by ring)) + -- the abs decomposition (delegated to `cutoff_abs_split`) + have vsub : ∀ (a1 b1 c1 : Vec d), vecDot (a1 - b1) c1 = vecDot a1 c1 - vecDot b1 c1 := by + intro a1 b1 c1 + rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left, ← sub_eq_add_neg] + have hgv : v.grad x = V + (1/2:ℝ)•P.1 := by rw [hVdef]; abel + have hgvs : vstar.grad x = Vstar + (1/2:ℝ)•P.1 := by rw [hVsdef]; abel + have hD1 : vecDot (P.2 - matVecMul (a x) (v.grad x)) gS + = vecDot P.2 gS - vecDot (matVecMul (a x) V) gS + - (1/2) * vecDot (matVecMul (a x) P.1) gS := by + rw [hgv, matVecMul_add, matVecMul_smul, sub_add_eq_sub_sub, vsub, vsub, vecDot_smul_left] + have hD2 : vecDot (matVecMul (matTranspose (a x)) (vstar.grad x)) gS + = vecDot (matVecMul (matTranspose (a x)) Vstar) gS + + (1/2) * vecDot (matVecMul (matTranspose (a x)) P.1) gS := by + rw [hgvs, matVecMul_add, matVecMul_smul, vecDot_add_left, vecDot_smul_left] + set uu := (centeredPotential m v P.1 c).toFun x with huudef + set uus := (centeredPotential m vstar P.1 (-c)).toFun x with huusdef + have he : cutoffIntegrand a v vstar P c η x + = uu * (vecDot P.2 gS - vecDot (matVecMul (a x) V) gS + - (1/2) * vecDot (matVecMul (a x) P.1) gS) + - uus * (vecDot (matVecMul (matTranspose (a x)) Vstar) gS + + (1/2) * vecDot (matVecMul (matTranspose (a x)) P.1) gS) := by + simp only [cutoffIntegrand] + rw [← hgSdef, ← huudef, ← huusdef, hD1, hD2] + have hcut_le : cutoffIntegrand a v vstar P c η x + ≤ Kinf * |vecDot P.2 gS| + Kinf * |vecDot (matVecMul (a x) V) gS| + + (1/2) * (Kinf * |vecDot (matVecMul (a x) P.1) gS|) + + Kinf * |vecDot (matVecMul (matTranspose (a x)) Vstar) gS| + + (1/2) * (Kinf * |vecDot (matVecMul (matTranspose (a x)) P.1) gS|) := by + rw [he]; exact cutoff_abs_split hKinf0 hKv hKvs + -- energy identity and final combination + have henergy : energyIntegrand a v vstar P η x = (η x) ^ 2 * (EV + EVs) := by + rw [energyIntegrand, hEVdef, hEVsdef, sqCutoff_apply] + have hΘN : Kinf ^ 2 * N ≤ Θ * (Kinf ^ 2 * N) := by + have h := mul_le_mul_of_nonneg_right hΘ1 hB1 + rwa [one_mul] at h + clear_value EV EVs Msq N + rw [henergy, sqCutoff_apply] + have H3 := mul_le_mul_of_nonneg_left baP1 (by norm_num : (0:ℝ) ≤ 1/2) + have H5 := mul_le_mul_of_nonneg_left baTP1 (by norm_num : (0:ℝ) ≤ 1/2) + refine le_trans hcut_le + (le_trans (add_le_add (add_le_add (add_le_add (add_le_add bP2 baV) H3) baVs) H5) ?_) + linarith [hΘN] + +end Cube + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Cutoff.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Cutoff.lean new file mode 100644 index 0000000000..a79574692f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Cutoff.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function + +/-! +# Local block energy: the squared cutoff `η²` + +Smoothness, `[0,1]`-bounds, and the product-rule gradient +`∂ᵢ(η²) = 2 η ∂ᵢη` for the squared cutoff, together with the `L^∞` +memberships (on a finite-measure domain) needed to feed the library's smooth×`H¹` +product constructions. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-- The squared cutoff. -/ +def sqCutoff (η : Vec d → ℝ) : Vec d → ℝ := fun x => (η x) ^ 2 + +@[simp] theorem sqCutoff_apply (η : Vec d → ℝ) (x : Vec d) : + sqCutoff η x = (η x) ^ 2 := rfl + +theorem sqCutoff_contDiff {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) : + ContDiff ℝ (⊤ : ℕ∞) (sqCutoff η) := by + have : sqCutoff η = fun x => η x * η x := by funext x; rw [sqCutoff_apply, pow_two] + rw [this]; exact hη.mul hη + +theorem sqCutoff_nonneg (η : Vec d → ℝ) (x : Vec d) : 0 ≤ sqCutoff η x := by + rw [sqCutoff_apply]; positivity + +theorem sqCutoff_le_one {η : Vec d → ℝ} (hη : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (x : Vec d) : sqCutoff η x ≤ 1 := by + rw [sqCutoff_apply] + have h := hη x + rw [Set.mem_Icc] at h + nlinarith [h.1, h.2] + +theorem abs_sqCutoff_le_one {η : Vec d → ℝ} (hη : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (x : Vec d) : |sqCutoff η x| ≤ 1 := by + rw [abs_of_nonneg (sqCutoff_nonneg η x)] + exact sqCutoff_le_one hη x + +/-- The product-rule gradient of `η²`: `∂ᵢ(η²) = 2 η ∂ᵢη`. -/ +theorem fderiv_sqCutoff {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) (x : Vec d) + (i : Fin d) : + fderiv ℝ (sqCutoff η) x (basisVec i) = 2 * η x * fderiv ℝ η x (basisVec i) := by + have hdiff : DifferentiableAt ℝ η x := (hη.contDiffAt).differentiableAt (by simp) + have hd : HasFDerivAt η (fderiv ℝ η x) x := hdiff.hasFDerivAt + have hsq : HasFDerivAt (sqCutoff η) + (η x • fderiv ℝ η x + η x • fderiv ℝ η x) x := by + have hrw : sqCutoff η = fun y => η y * η y := by funext y; rw [sqCutoff_apply, pow_two] + rw [hrw]; exact hd.mul hd + rw [hsq.fderiv] + simp only [add_apply, smul_apply, smul_eq_mul] + ring + +/-- The support of `η²` equals the support of `η`. -/ +theorem support_sqCutoff (η : Vec d → ℝ) : + Function.support (sqCutoff η) = Function.support η := by + ext x + simp only [Function.mem_support, sqCutoff_apply, ne_eq, pow_eq_zero_iff, OfNat.ofNat_ne_zero, + not_false_eq_true] + +/-! ## `L^∞` memberships on a finite-measure domain -/ + +variable {U : Set (Vec d)} + +theorem memLpTop_sqCutoff {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + MemLp (sqCutoff η) (⊤ : ENNReal) (volume.restrict U) := by + refine MeasureTheory.memLp_top_of_bound + (sqCutoff_contDiff hη).continuous.aestronglyMeasurable 1 ?_ + exact Filter.Eventually.of_forall (fun x => abs_sqCutoff_le_one hIcc x) + +theorem memLpTop_fderiv_sqCutoff {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) {Gη : ℝ} + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) (i : Fin d) : + MemLp (fun x => (fderiv ℝ (sqCutoff η) x) (basisVec i)) (⊤ : ENNReal) + (volume.restrict U) := by + have hcont : Continuous (fun x => (fderiv ℝ (sqCutoff η) x) (basisVec i)) := by + have := (sqCutoff_contDiff hη).continuous_fderiv (by simp) + exact this.clm_apply continuous_const + refine MeasureTheory.memLp_top_of_bound hcont.aestronglyMeasurable (2 * Gη) ?_ + refine Filter.Eventually.of_forall (fun x => ?_) + rw [fderiv_sqCutoff hη x i] + have hη1 : |η x| ≤ 1 := by + have h := hIcc x; rw [Set.mem_Icc] at h + rw [abs_of_nonneg h.1]; exact h.2 + calc |2 * η x * fderiv ℝ η x (basisVec i)| + = 2 * |η x| * |fderiv ℝ η x (basisVec i)| := by + rw [abs_mul, abs_mul]; simp + _ ≤ 2 * 1 * Gη := by + have hGnn : 0 ≤ Gη := le_trans (abs_nonneg _) (hGη x i) + apply mul_le_mul + · apply mul_le_mul_of_nonneg_left hη1 (by norm_num) + · exact hGη x i + · exact abs_nonneg _ + · positivity + _ = 2 * Gη := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Identity.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Identity.lean new file mode 100644 index 0000000000..029d13da1e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Identity.lean @@ -0,0 +1,330 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Integrability +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Pointwise +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Representation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! +# Local block energy: the test identity + +Testing the coupled weak form `CoupledWeakForm` at the smooth pair +`(η²u, η²u*)` and expanding both sides gives the paper's +`e.local.block.test.identity`: + +`𝓔 := ∫_U η²(V·sV + V*·sV*) + = ∫_U η²(q − ½ap)·V − ½∫_U η²(aᵀp)·V* + + ∫_U u(q − a∇v)·∇(η²) − ∫_U u*(aᵀ∇v*)·∇(η²)`, + +where `V = ∇v − ½p`, `V* = ∇v* − ½p`, `u = v − ½p·x − c`, `u* = v* − ½p·x + c`. + +The engine is a single *pointwise* algebraic identity +(`pointwise_energy_test_identity`) that rewrites the energy density as the sum +of the bulk density, the cutoff density and the weak-form defect +`(a∇v·∇φ + aᵀ∇v*·∇φ*) − q·∇φ`; integrating and cancelling the defect via the +weak form yields the identity. No `EuclideanSpace`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## The pointwise test-identity density -/ + +/-- Pointwise algebraic identity underlying `e.local.block.test.identity`. +With `V = gv − ½p`, `V* = gvs − ½p` the energy density equals the bulk density +plus the cutoff density plus the weak-form defect. -/ +theorem pointwise_energy_test_identity (A : Mat d) (gv gvs p q gS : Vec d) + (η2 uu uus : ℝ) : + η2 * (vecDot (gv - (1/2:ℝ)•p) (matVecMul (symmPart A) (gv - (1/2:ℝ)•p)) + + vecDot (gvs - (1/2:ℝ)•p) (matVecMul (symmPart A) (gvs - (1/2:ℝ)•p))) + = (η2 * (vecDot (q - (1/2:ℝ)•matVecMul A p) (gv - (1/2:ℝ)•p) + - (1/2:ℝ) * vecDot (matVecMul (matTranspose A) p) (gvs - (1/2:ℝ)•p))) + + (uu * vecDot (q - matVecMul A gv) gS + - uus * vecDot (matVecMul (matTranspose A) gvs) gS) + + (vecDot (η2•(gv - (1/2:ℝ)•p) + uu•gS) (matVecMul A gv) + + vecDot (η2•(gvs - (1/2:ℝ)•p) + uus•gS) (matVecMul (matTranspose A) gvs) + - vecDot q (η2•(gv - (1/2:ℝ)•p) + uu•gS)) := by + rw [← vecDot_matVecMul_eq_symmPart A (gv - (1/2:ℝ)•p)] + rw [show vecDot (gvs - (1/2:ℝ)•p) (matVecMul (symmPart A) (gvs - (1/2:ℝ)•p)) + = vecDot (gvs - (1/2:ℝ)•p) (matVecMul (matTranspose A) (gvs - (1/2:ℝ)•p)) from by + rw [← symmPart_matTranspose A] + exact (vecDot_matVecMul_eq_symmPart (matTranspose A) _).symm] + have hfluxV : matVecMul A gv + = matVecMul A (gv - (1/2:ℝ)•p) + (1/2:ℝ)•matVecMul A p := by + rw [← matVecMul_smul, ← matVecMul_add]; congr 1; abel + have hfluxVs : matVecMul (matTranspose A) gvs + = matVecMul (matTranspose A) (gvs - (1/2:ℝ)•p) + + (1/2:ℝ)•matVecMul (matTranspose A) p := by + rw [← matVecMul_smul, ← matVecMul_add]; congr 1; abel + rw [hfluxV, hfluxVs] + set V := gv - (1/2:ℝ)•p with hVdef + set Vstar := gvs - (1/2:ℝ)•p with hVsdef + simp only [sub_eq_add_neg, vecDot_add_left, vecDot_add_right, + vecDot_smul_left, vecDot_smul_right, vecDot_neg_left] + rw [vecDot_comm (matVecMul A p) V, vecDot_comm (matVecMul (matTranspose A) p) Vstar, + vecDot_comm (matVecMul A V) gS, vecDot_comm (matVecMul A p) gS, + vecDot_comm (matVecMul (matTranspose A) Vstar) gS, + vecDot_comm (matVecMul (matTranspose A) p) gS] + ring + +section Integral + +variable [NeZero d] {m : ℤ} + +local notation "U" => openCubeSet (originCube d m) + +/-- The energy density `η²(V·sV + V*·sV*)` with `V = ∇v − ½p`, `s = symmPart a`. -/ +def energyIntegrand (a : CoeffField d) (v vstar : H1Function U) (P : BlockVec d) + (η : Vec d → ℝ) : Vec d → ℝ := fun x => + sqCutoff η x + * (vecDot (v.grad x - (1/2:ℝ)•P.1) (matVecMul (symmPart (a x)) (v.grad x - (1/2:ℝ)•P.1)) + + vecDot (vstar.grad x - (1/2:ℝ)•P.1) + (matVecMul (symmPart (a x)) (vstar.grad x - (1/2:ℝ)•P.1))) + +/-- The bulk density `η²((q − ½ap)·V − ½(aᵀp)·V*)`. -/ +def bulkIntegrand (a : CoeffField d) (v vstar : H1Function U) (P : BlockVec d) + (η : Vec d → ℝ) : Vec d → ℝ := fun x => + sqCutoff η x + * (vecDot (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) (v.grad x - (1/2:ℝ)•P.1) + - (1/2:ℝ) * vecDot (matVecMul (matTranspose (a x)) P.1) (vstar.grad x - (1/2:ℝ)•P.1)) + +/-- The cutoff density `u(q − a∇v)·∇(η²) − u*(aᵀ∇v*)·∇(η²)`. -/ +def cutoffIntegrand (a : CoeffField d) (v vstar : H1Function U) (P : BlockVec d) + (c : ℝ) (η : Vec d → ℝ) : Vec d → ℝ := fun x => + (centeredPotential m v P.1 c).toFun x + * vecDot (P.2 - matVecMul (a x) (v.grad x)) + (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) + - (centeredPotential m vstar P.1 (-c)).toFun x + * vecDot (matVecMul (matTranspose (a x)) (vstar.grad x)) + (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) + +/-! ## Integrability of the four densities -/ + +section Integrability + +omit [NeZero d] in +/-- `L∞` control of `η²`. -/ +theorem memLpTop_sqCutoff_cube {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + MemLp (sqCutoff η) (⊤ : ENNReal) (volumeMeasureOn (openCubeSet (originCube d m))) := + sqCutoff_memLpTop hη hIcc + +omit [NeZero d] in +/-- `L∞` control of `∂ᵢ(η²)`. -/ +theorem memLpTop_fderiv_sqCutoff_cube {η : Vec d → ℝ} {Gη : ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) (i : Fin d) : + MemLp (fun x => fderiv ℝ (sqCutoff η) x (basisVec i)) (⊤ : ENNReal) + (volumeMeasureOn (openCubeSet (originCube d m))) := + sqCutoff_fderiv_memLpTop hη hIcc hGη i + +omit [NeZero d] in +/-- `V = ∇v − ½p ∈ L²`. -/ +theorem memVectorL2_centeredGrad (v : H1Function U) (P : BlockVec d) : + MemVectorL2 U (fun x => v.grad x - (1/2:ℝ)•P.1) := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + exact v.grad_memVectorL2.sub (memVectorL2_const ((1/2:ℝ)•P.1)) + +omit [NeZero d] in +theorem integrableOn_energyIntegrand {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + IntegrableOn (energyIntegrand a v vstar P η) U := by + have hE : energyIntegrand a v vstar P η + = fun x => sqCutoff η x + * vecDot (v.grad x - (1/2:ℝ)•P.1) + (matVecMul (symmPart (a x)) (v.grad x - (1/2:ℝ)•P.1)) + + sqCutoff η x + * vecDot (vstar.grad x - (1/2:ℝ)•P.1) + (matVecMul (symmPart (a x)) (vstar.grad x - (1/2:ℝ)•P.1)) := by + funext x; simp only [energyIntegrand]; ring + rw [hE] + refine (integrableOn_memLpTop_mul_vecDot (memLpTop_sqCutoff_cube hη hIcc) + (memVectorL2_centeredGrad v P) + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO + (memVectorL2_centeredGrad v P))).add ?_ + exact integrableOn_memLpTop_mul_vecDot (memLpTop_sqCutoff_cube hη hIcc) + (memVectorL2_centeredGrad vstar P) + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO + (memVectorL2_centeredGrad vstar P)) + +omit [NeZero d] in +theorem integrableOn_bulkIntegrand {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + IntegrableOn (bulkIntegrand a v vstar P η) U := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hE : bulkIntegrand a v vstar P η + = fun x => sqCutoff η x + * vecDot (P.2 - (1/2:ℝ)•matVecMul (a x) P.1) (v.grad x - (1/2:ℝ)•P.1) + - sqCutoff η x + * vecDot ((1/2:ℝ)•matVecMul (matTranspose (a x)) P.1) (vstar.grad x - (1/2:ℝ)•P.1) := by + funext x; simp only [bulkIntegrand, vecDot_smul_left]; ring + rw [hE] + have hF1 : MemVectorL2 U (fun x => P.2 - (1/2:ℝ)•matVecMul (a x) P.1) := by + have h2 : MemVectorL2 U (fun x => (1/2:ℝ)•matVecMul (a x) P.1) := by + simpa using! + (memVectorL2_matVecMul_of_isEllipticFieldOn hEllO (memVectorL2_const P.1)).const_smul (1/2:ℝ) + simpa using! (memVectorL2_const P.2).sub h2 + have hF2 : MemVectorL2 U (fun x => (1/2:ℝ)•matVecMul (matTranspose (a x)) P.1) := by + have hEllAdj : IsEllipticFieldOn 1 Θ U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEllO + have hb : MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) P.1) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj (memVectorL2_const P.1) + simpa using! hb.const_smul (1/2:ℝ) + refine (integrableOn_memLpTop_mul_vecDot (memLpTop_sqCutoff_cube hη hIcc) hF1 + (memVectorL2_centeredGrad v P)).sub ?_ + exact integrableOn_memLpTop_mul_vecDot (memLpTop_sqCutoff_cube hη hIcc) hF2 + (memVectorL2_centeredGrad vstar P) + +omit [NeZero d] in +theorem integrableOn_cutoffIntegrand {a : CoeffField d} {Θ : ℝ} + {v vstar : H1Function U} {P : BlockVec d} {η : Vec d → ℝ} {Gη : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) (c : ℝ) : + IntegrableOn (cutoffIntegrand a v vstar P c η) U := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hEllAdj : IsEllipticFieldOn 1 Θ U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEllO + have hu : MemScalarL2 U (centeredPotential m v P.1 c).toFun := (centeredPotential m v P.1 c).memL2 + have hus : MemScalarL2 U (centeredPotential m vstar P.1 (-c)).toFun := + (centeredPotential m vstar P.1 (-c)).memL2 + have hF1 : MemVectorL2 U (fun x => P.2 - matVecMul (a x) (v.grad x)) := + (memVectorL2_const P.2).sub (memVectorL2_matVecMul_of_isEllipticFieldOn hEllO v.grad_memVectorL2) + have hF2 : MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) (vstar.grad x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj vstar.grad_memVectorL2 + refine (integrableOn_scalarL2_mul_vecDot_memLpTop hu hF1 + (fun i => memLpTop_fderiv_sqCutoff_cube hη hIcc hGη i)).sub ?_ + exact integrableOn_scalarL2_mul_vecDot_memLpTop hus hF2 + (fun i => memLpTop_fderiv_sqCutoff_cube hη hIcc hGη i) + +end Integrability + +/-! ## The integral test identity -/ + +omit [NeZero d] in +/-- **The test identity.** With the weak form and the +`η²·u` test pair, the energy integral equals the bulk integral plus the cutoff +integral. -/ +theorem energyIntegral_eq_bulk_add_cutoff + {a : CoeffField d} {Θ : ℝ} {v vstar : H1Function U} {P : BlockVec d} + {η : Vec d → ℝ} {Gη : ℝ} {c : ℝ} + (hEllO : IsEllipticFieldOn 1 Θ U a) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (hWeak : CoupledWeakForm a U P.2 v vstar) + (hTrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x)) : + (∫ x in U, energyIntegrand a v vstar P η x) + = (∫ x in U, bulkIntegrand a v vstar P η x) + + (∫ x in U, cutoffIntegrand a v vstar P c η x) := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + classical + -- the smooth test pair and its admissibility + set φ := testFun hη hIcc hGη (centeredPotential m v P.1 c) with hφdef + set φstar := testFun hη hIcc hGη (centeredPotential m vstar P.1 (-c)) with hφsdef + have hadm : MemH10 U (fun x => φ.toFun x + φstar.toFun x) := + memH10_testPair_sum hη hIcc hGη hTrace + have hweak := hWeak φ φstar hadm + -- the gradient of the test functions as explicit vectors + have hφg : ∀ x, φ.grad x + = sqCutoff η x • (v.grad x - (1/2:ℝ)•P.1) + + (centeredPotential m v P.1 c).toFun x + • (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) := by + intro x; funext i + rw [hφdef, testFun_grad, centeredPotential_grad] + simp only [Pi.add_apply, Pi.smul_apply, smul_eq_mul, Pi.sub_apply] + have hφsg : ∀ x, φstar.grad x + = sqCutoff η x • (vstar.grad x - (1/2:ℝ)•P.1) + + (centeredPotential m vstar P.1 (-c)).toFun x + • (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) := by + intro x; funext i + rw [hφsdef, testFun_grad, centeredPotential_grad] + simp only [Pi.add_apply, Pi.smul_apply, smul_eq_mul, Pi.sub_apply] + -- pointwise identity: energy = bulk + cutoff + weak-form defect + have hpt : ∀ x, energyIntegrand a v vstar P η x + = bulkIntegrand a v vstar P η x + cutoffIntegrand a v vstar P c η x + + (vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) + + vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)) + - vecDot P.2 (φ.grad x)) := by + intro x + have h := pointwise_energy_test_identity (a x) (v.grad x) (vstar.grad x) P.1 P.2 + (fun i => fderiv ℝ (sqCutoff η) x (basisVec i)) (sqCutoff η x) + ((centeredPotential m v P.1 c).toFun x) ((centeredPotential m vstar P.1 (-c)).toFun x) + rw [hφg x, hφsg x] + simpa only [energyIntegrand, bulkIntegrand, cutoffIntegrand] using h + -- integrability of the pieces + have hIe : IntegrableOn (energyIntegrand a v vstar P η) U := + integrableOn_energyIntegrand hEllO hη hIcc + have hIb : IntegrableOn (bulkIntegrand a v vstar P η) U := + integrableOn_bulkIntegrand hEllO hη hIcc + have hIc : IntegrableOn (cutoffIntegrand a v vstar P c η) U := + integrableOn_cutoffIntegrand hEllO hη hIcc hGη c + have hIL1 : IntegrableOn (fun x => vecDot (φ.grad x) (matVecMul (a x) (v.grad x))) U := + integrableOn_vecDot_of_memVectorL2 φ.grad_memVectorL2 + (memVectorL2_matVecMul_of_isEllipticFieldOn hEllO v.grad_memVectorL2) + have hIL2 : IntegrableOn + (fun x => vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x))) U := by + have hEllAdj : IsEllipticFieldOn 1 Θ U (Homogenization.adjointCoeffField a) := + isEllipticFieldOn_adjointCoeffField hEllO + have hF : MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) (vstar.grad x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj vstar.grad_memVectorL2 + exact integrableOn_vecDot_of_memVectorL2 φstar.grad_memVectorL2 hF + have hIR : IntegrableOn (fun x => vecDot P.2 (φ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 (memVectorL2_const P.2) φ.grad_memVectorL2 + -- the weak-form defect density and its vanishing integral + set F : Vec d → ℝ := fun x => vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) + + vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)) + - vecDot P.2 (φ.grad x) with hFdef + have hdefect : IntegrableOn F U := (hIL1.add hIL2).sub hIR + have hFzero : (∫ x in U, F x) = 0 := by + have h1 : (∫ x in U, F x) + = (∫ x in U, (vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) + + vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)))) + - ∫ x in U, vecDot P.2 (φ.grad x) := by + rw [hFdef]; exact integral_sub (hIL1.add hIL2) hIR + have h2 : (∫ x in U, (vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) + + vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)))) + = (∫ x in U, vecDot (φ.grad x) (matVecMul (a x) (v.grad x))) + + ∫ x in U, vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)) := + integral_add hIL1 hIL2 + rw [h1, h2, hweak]; ring + -- integrate the pointwise identity and split + have hcongr : (∫ x in U, energyIntegrand a v vstar P η x) + = ∫ x in U, (bulkIntegrand a v vstar P η x + cutoffIntegrand a v vstar P c η x + F x) := + setIntegral_congr_fun (measurableSet_openCubeSet _) (fun x _ => hpt x) + have hsplit1 : (∫ x in U, + (bulkIntegrand a v vstar P η x + cutoffIntegrand a v vstar P c η x + F x)) + = (∫ x in U, (bulkIntegrand a v vstar P η x + cutoffIntegrand a v vstar P c η x)) + + ∫ x in U, F x := + integral_add (hIb.add hIc) hdefect + have hsplit2 : (∫ x in U, (bulkIntegrand a v vstar P η x + cutoffIntegrand a v vstar P c η x)) + = (∫ x in U, bulkIntegrand a v vstar P η x) + + ∫ x in U, cutoffIntegrand a v vstar P c η x := + integral_add hIb hIc + rw [hcongr, hsplit1, hsplit2, hFzero, add_zero] + +end Integral + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Integrability.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Integrability.lean new file mode 100644 index 0000000000..1bbe77ae0a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Integrability.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.TestPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! +# Local block energy: integrability workhorses + +Two small `IntegrableOn` workhorses used throughout the test-identity expansion +and the bulk/cutoff estimates. Every integrand appearing in the coupled +weak-form expansion is either + +* `h · (F · G)` with `h ∈ L∞` and `F, G ∈ L²` (bulk / energy integrands), or +* `u · (F · g)` with `u ∈ L²`, `F ∈ L²` and `g ∈ L∞` (cutoff integrands). + +Both are `L¹` on the finite-measure cube; the two lemmas below package the +Hölder/`L∞` bookkeeping so the downstream files never touch it directly. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-- **Bulk-type integrability.** `h · (F · G)` is `L¹` when `h ∈ L∞` and +`F, G ∈ L²`. -/ +theorem integrableOn_memLpTop_mul_vecDot {U : Set (Vec d)} {h : Vec d → ℝ} + {F G : Vec d → Vec d} + (hh : MemLp h (⊤ : ENNReal) (volumeMeasureOn U)) + (hF : MemVectorL2 U F) (hG : MemVectorL2 U G) : + IntegrableOn (fun x => h x * vecDot (F x) (G x)) U := by + have hvd : IntegrableOn (fun x => vecDot (F x) (G x)) U := + integrableOn_vecDot_of_memVectorL2 hF hG + have hmul : Integrable (h * fun x => vecDot (F x) (G x)) (volumeMeasureOn U) := + hvd.mul_of_top_right hh + simpa [Pi.mul_apply] using! hmul + +/-- **Cutoff-type integrability.** `u · (F · g)` is `L¹` when `u, F ∈ L²` +and every coordinate of `g` lies in `L∞`. -/ +theorem integrableOn_scalarL2_mul_vecDot_memLpTop {U : Set (Vec d)} {u : Vec d → ℝ} + {F g : Vec d → Vec d} + (hu : MemScalarL2 U u) (hF : MemVectorL2 U F) + (hg : ∀ i, MemLp (fun x => g x i) (⊤ : ENNReal) (volumeMeasureOn U)) : + IntegrableOn (fun x => u x * vecDot (F x) (g x)) U := by + classical + have hrw : (fun x => u x * vecDot (F x) (g x)) + = fun x => ∑ i, (u x * F x i) * g x i := by + funext x + rw [vecDot, Finset.mul_sum] + exact Finset.sum_congr rfl (fun i _ => by ring) + rw [hrw] + refine MeasureTheory.integrable_finsetSum Finset.univ (fun i _ => ?_) + have hi : Integrable (fun x => u x * F x i) (volumeMeasureOn U) := + hu.integrable_mul (memScalarL2_coord_of_memVectorL2 hF i) + have := hi.mul_of_top_left (hg i) + simpa [Pi.mul_apply] using! this + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Pointwise.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Pointwise.lean new file mode 100644 index 0000000000..e011a9dc22 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/Pointwise.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.SharpBlockBounds.Basic + +/-! +# Local block energy: pointwise algebra + +Pointwise (single-matrix) inequalities feeding the local-energy estimate of +`p.local.block.energy` (the high-moment paper (Armstrong–Kuusi–Loher, in +preparation), §3.4). Everything here is elementary linear algebra on +`Vec d = Fin d → ℝ`; +no `EuclideanSpace`. + +The central tool is the *Young inequality in the `s`-metric* +(`symmForm_young`): for the symmetric part `s = symmPart A` of an elliptic +matrix and `t > 0`, + +`ξ · V ≤ (2t)⁻¹ (ξ · s⁻¹ ξ) + (t/2) (V · s V)`, + +with no square roots. Combined with the coefficient bounds +`q · s⁻¹ q ≤ |q|²`, `(a p) · s⁻¹ (a p) ≤ Θ |p|²`, and the flux corollary +`‖a e‖² ≤ 2Θ (e · s e)` this drives the bulk and cutoff estimates. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization + +noncomputable section + +variable {d : ℕ} + +/-! ## The symmetric form is nonnegative and equals the full quadratic form -/ + +/-- `V · a V = V · s V`: the skew part drops out of the diagonal quadratic form. -/ +theorem vecDot_matVecMul_eq_symmPart (A : Mat d) (V : Vec d) : + vecDot V (matVecMul A V) = vecDot V (matVecMul (symmPart A) V) := + (vecDot_matVecMul_symmPart A V).symm + +/-- Nonnegativity of the `s`-form for an elliptic matrix. -/ +theorem vecDot_matVecMul_symmPart_nonneg {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (V : Vec d) : + 0 ≤ vecDot V (matVecMul (symmPart A) V) := + le_trans (by simpa using vecNormSq_nonneg V) + (lowerBound_symmPart_of_isEllipticMatrix hA V) + +/-! ## The Young inequality in the `s`-metric -/ + +/-- **`s`-metric Young.** For the symmetric part `s = symmPart A` of a +`(1, Θ)`-elliptic matrix and any `t > 0`, +`ξ · V ≤ (2t)⁻¹ (ξ · s⁻¹ ξ) + (t/2) (V · s V)`. -/ +theorem symmForm_young {Θ : ℝ} {A : Mat d} (hA : IsThetaElliptic Θ A) + {t : ℝ} (ht : 0 < t) (ξ V : Vec d) : + vecDot ξ V ≤ (2 * t)⁻¹ * vecDot ξ (matVecMul ((symmPart A)⁻¹) ξ) + + (t / 2) * vecDot V (matVecMul (symmPart A) V) := by + set s := symmPart A with hs + have hsdet : IsUnit s.det := + (Matrix.isUnit_iff_isUnit_det (A := s)).mp (isUnit_symmPart_of_isEllipticMatrix hA) + set a := matVecMul s⁻¹ ξ with ha + have hsa : matVecMul s a = ξ := by + rw [ha, matVecMul_mul, Matrix.mul_nonsing_inv _ hsdet, matVecMul_one] + -- ξ · V = a · s V + have hxV : vecDot a (matVecMul s V) = vecDot ξ V := by + have := vecDot_matVecMul_transpose a V s + rw [matTranspose_symmPart] at this + rw [this, hsa] + -- a · ξ = ξ · s⁻¹ ξ + have hxinv : vecDot a ξ = vecDot ξ (matVecMul s⁻¹ ξ) := by + rw [ha, vecDot_comm] + have eVξ : vecDot V ξ = vecDot ξ V := vecDot_comm V ξ + -- PSD of the perturbation + set W : Vec d := t • V - a with hW + have hWpsd : 0 ≤ vecDot W (matVecMul s W) := + vecDot_matVecMul_symmPart_nonneg hA W + have hsW : matVecMul s W = t • matVecMul s V - ξ := by + rw [hW, sub_eq_add_neg, matVecMul_add, matVecMul_neg, matVecMul_smul, hsa, + ← sub_eq_add_neg] + have hexpand : + vecDot W (matVecMul s W) = + t ^ 2 * vecDot V (matVecMul s V) - 2 * t * vecDot ξ V + + vecDot ξ (matVecMul s⁻¹ ξ) := by + rw [hsW, hW] + simp only [sub_eq_add_neg, vecDot_add_left, vecDot_add_right, vecDot_smul_left, + vecDot_smul_right, vecDot_neg_left, vecDot_neg_right] + rw [hxV, eVξ, hxinv] + ring + rw [hexpand] at hWpsd + -- clear the denominator + set B := vecDot ξ (matVecMul s⁻¹ ξ) with hB + set C := vecDot V (matVecMul s V) with hC + set X := vecDot ξ V with hX + have hkey : 2 * t * X ≤ B + t ^ 2 * C := by nlinarith [hWpsd] + have he : (2 * t)⁻¹ * B + t / 2 * C = (2 * t)⁻¹ * (B + t ^ 2 * C) := by + field_simp + rw [he] + calc X = (2 * t)⁻¹ * (2 * t * X) := by field_simp + _ ≤ (2 * t)⁻¹ * (B + t ^ 2 * C) := + mul_le_mul_of_nonneg_left hkey (by positivity) + +/-! ## Coefficient bounds in the `s⁻¹`-metric -/ + +/-- `q · s⁻¹ q ≤ |q|²`. -/ +theorem symmPartInv_quadratic_le_normSq {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (q : Vec d) : + vecDot q (matVecMul ((symmPart A)⁻¹) q) ≤ vecNormSq q := by + simpa using symmPart_inv_upperBound_of_isEllipticMatrix hA q + +/-- `(a p) · s⁻¹ (a p) ≤ Θ |p|²`. -/ +theorem symmPartInv_image_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (p : Vec d) : + vecDot (matVecMul A p) (matVecMul ((symmPart A)⁻¹) (matVecMul A p)) ≤ + Θ * vecNormSq p := + image_symmPartInv_le hA p + +/-- `(aᵀ p) · s⁻¹ (aᵀ p) ≤ Θ |p|²`, using `symmPart Aᵀ = symmPart A`. -/ +theorem symmPartInv_imageTranspose_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (p : Vec d) : + vecDot (matVecMul (matTranspose A) p) + (matVecMul ((symmPart A)⁻¹) (matVecMul (matTranspose A) p)) ≤ + Θ * vecNormSq p := by + have hAT : IsThetaElliptic Θ (matTranspose A) := isEllipticMatrix_transpose hA + have h := image_symmPartInv_le hAT p + rwa [symmPart_matTranspose] at h + +/-! ## The bulk coefficient vectors -/ + +/-- `(q − ½ a p) · s⁻¹ (q − ½ a p) ≤ 2 (Θ|p|² + |q|²)`. -/ +theorem symmPartInv_bulkV_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (p q : Vec d) : + vecDot (q - (1 / 2 : ℝ) • matVecMul A p) + (matVecMul ((symmPart A)⁻¹) (q - (1 / 2 : ℝ) • matVecMul A p)) ≤ + 2 * (Θ * vecNormSq p + vecNormSq q) := by + have hN : ∀ x : Vec d, 0 ≤ vecDot x (matVecMul ((symmPart A)⁻¹) x) := + fun x => symmPart_inv_nonneg_of_isEllipticMatrix hA x + have hpar := vecDot_matVecMul_sub_le_two hN q ((1 / 2 : ℝ) • matVecMul A p) + have hq := symmPartInv_quadratic_le_normSq hA q + have hap := symmPartInv_image_le hA p + -- b · s⁻¹ b with b = ½ (a p) + have hb : vecDot ((1 / 2 : ℝ) • matVecMul A p) + (matVecMul ((symmPart A)⁻¹) ((1 / 2 : ℝ) • matVecMul A p)) = + (1 / 4 : ℝ) * vecDot (matVecMul A p) + (matVecMul ((symmPart A)⁻¹) (matVecMul A p)) := by + rw [matVecMul_smul, vecDot_smul_left, vecDot_smul_right] + ring + rw [hb] at hpar + have hΘ : (0 : ℝ) ≤ Θ := le_trans zero_le_one hA.2.1 + nlinarith [hpar, hq, hap, vecNormSq_nonneg p, mul_nonneg hΘ (vecNormSq_nonneg p)] + +/-- `(½ aᵀ p) · s⁻¹ (½ aᵀ p) ≤ Θ|p|² + |q|²`. -/ +theorem symmPartInv_bulkVstar_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (p q : Vec d) : + vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose A) p) + (matVecMul ((symmPart A)⁻¹) ((1 / 2 : ℝ) • matVecMul (matTranspose A) p)) ≤ + Θ * vecNormSq p + vecNormSq q := by + have haTp := symmPartInv_imageTranspose_le hA p + have hval : vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose A) p) + (matVecMul ((symmPart A)⁻¹) ((1 / 2 : ℝ) • matVecMul (matTranspose A) p)) = + (1 / 4 : ℝ) * vecDot (matVecMul (matTranspose A) p) + (matVecMul ((symmPart A)⁻¹) (matVecMul (matTranspose A) p)) := by + rw [matVecMul_smul, vecDot_smul_left, vecDot_smul_right] + ring + rw [hval] + have hΘ : (0 : ℝ) ≤ Θ := le_trans zero_le_one hA.2.1 + nlinarith [haTp, vecNormSq_nonneg p, vecNormSq_nonneg q, mul_nonneg hΘ (vecNormSq_nonneg p)] + +/-! ## The flux corollary `‖a e‖² ≤ 2Θ (e · s e)` -/ + +/-- `‖a e‖² ≤ 2Θ (e · s e)`. -/ +theorem vecNormSq_image_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (e : Vec d) : + vecNormSq (matVecMul A e) ≤ 2 * Θ * vecDot e (matVecMul (symmPart A) e) := by + have h := vecNormSq_image_add_transpose_le_of_isThetaElliptic hA e + nlinarith [h, vecNormSq_nonneg (matVecMul (matTranspose A) e)] + +/-- `‖aᵀ e‖² ≤ 2Θ (e · s e)`. -/ +theorem vecNormSq_imageTranspose_le {Θ : ℝ} {A : Mat d} + (hA : IsThetaElliptic Θ A) (e : Vec d) : + vecNormSq (matVecMul (matTranspose A) e) ≤ + 2 * Θ * vecDot e (matVecMul (symmPart A) e) := by + have h := vecNormSq_image_add_transpose_le_of_isThetaElliptic hA e + nlinarith [h, vecNormSq_nonneg (matVecMul A e)] + +/-! ## An AM-GM helper with square roots -/ + +/-- `2 √A √B ≤ t A + t⁻¹ B` for `A, B ≥ 0` and `t > 0`. -/ +theorem two_mul_sqrt_mul_sqrt_le {A B t : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (ht : 0 < t) : + 2 * Real.sqrt A * Real.sqrt B ≤ t * A + t⁻¹ * B := by + have hsqA : Real.sqrt A ^ 2 = A := Real.sq_sqrt hA + have hsqB : Real.sqrt B ^ 2 = B := Real.sq_sqrt hB + have hnn : 0 ≤ (Real.sqrt t * Real.sqrt A - Real.sqrt t⁻¹ * Real.sqrt B) ^ 2 := + sq_nonneg _ + have hst : Real.sqrt t ^ 2 = t := Real.sq_sqrt ht.le + have hsti : Real.sqrt t⁻¹ ^ 2 = t⁻¹ := Real.sq_sqrt (by positivity) + have hcross : Real.sqrt t * Real.sqrt t⁻¹ = 1 := by + rw [← Real.sqrt_mul ht.le, mul_inv_cancel₀ ht.ne', Real.sqrt_one] + have hexp : (Real.sqrt t * Real.sqrt A - Real.sqrt t⁻¹ * Real.sqrt B) ^ 2 = + t * A - 2 * (Real.sqrt A * Real.sqrt B) + t⁻¹ * B := by + have hrw : (Real.sqrt t * Real.sqrt A - Real.sqrt t⁻¹ * Real.sqrt B) ^ 2 = + Real.sqrt t ^ 2 * Real.sqrt A ^ 2 + - 2 * (Real.sqrt t * Real.sqrt t⁻¹) * (Real.sqrt A * Real.sqrt B) + + Real.sqrt t⁻¹ ^ 2 * Real.sqrt B ^ 2 := by ring + rw [hrw, hst, hsqA, hsti, hsqB, hcross]; ring + rw [hexp] at hnn + nlinarith [hnn] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/TestPair.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/TestPair.lean new file mode 100644 index 0000000000..25a7bd73ae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/LocalEnergy/TestPair.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Cutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero + +/-! +# Local block energy: the centered potentials and the test pair + +The centered potentials `u = v − ½p·x − c`, `u* = v* − ½p·x + c` as +`H¹` functions (with constant gradients `V = ∇v − ½p`, `V* = ∇v* − ½p`), and +the smooth test pair `(η²u, η²u*)` built from the library's smooth×`H¹` product +`H1Function.mulContDiffMemLpTop`. The admissibility +`MemH10 (η²u + η²u*)` is obtained from `η²·(v+v*−p·x) ∈ H¹₀` via +`H10Function.mulContDiffMemLpTop`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} [NeZero d] {m : ℤ} + +/-- Abbreviation for the centered open cube. -/ +local notation "U" => openCubeSet (originCube d m) + +/-! ## The centered potentials -/ + +/-- `u = v − ½ p·x − c` as an `H¹` function. -/ +def centeredPotential (m : ℤ) (v : H1Function (openCubeSet (originCube d m))) + (p : Vec d) (c : ℝ) : H1Function (openCubeSet (originCube d m)) := + letI := isFiniteMeasure_openCubeSet_originCube (d := d) m + v + (-(1 / 2 : ℝ)) • affineH1 m p + H1Function.const (-c) + +omit [NeZero d] in +/-- Evaluation formula for the centered potential. -/ +@[simp] theorem centeredPotential_toFun (v : H1Function (openCubeSet (originCube d m))) + (p : Vec d) (c : ℝ) (x : Vec d) : + (centeredPotential m v p c).toFun x = v.toFun x - (1 / 2 : ℝ) * vecDot p x - c := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + show (v + (-(1 / 2 : ℝ)) • affineH1 m p + H1Function.const (-c)).toFun x = _ + simp only [Homogenization.H1Function.add_toFun, Homogenization.H1Function.smul_toFun, + affineH1_toFun, H1Function.const_apply] + ring + +omit [NeZero d] in +/-- Gradient formula for the centered potential. -/ +@[simp] theorem centeredPotential_grad (v : H1Function (openCubeSet (originCube d m))) + (p : Vec d) (c : ℝ) (x : Vec d) : + (centeredPotential m v p c).grad x = v.grad x - (1 / 2 : ℝ) • p := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + show (v + (-(1 / 2 : ℝ)) • affineH1 m p + H1Function.const (-c)).grad x = _ + simp only [Homogenization.H1Function.add_grad, Homogenization.H1Function.smul_grad, + affineH1_grad, H1Function.grad_const, add_zero] + module + +omit [NeZero d] in +/-- The sum of the two centered potentials is `v + v* − p·x`. -/ +theorem centeredPotential_add_toFun (v vstar : H1Function (openCubeSet (originCube d m))) + (p : Vec d) (c : ℝ) (x : Vec d) : + (centeredPotential m v p c).toFun x + (centeredPotential m vstar p (-c)).toFun x = + v.toFun x + vstar.toFun x - vecDot p x := by + rw [centeredPotential_toFun, centeredPotential_toFun] + ring + +/-! ## `L^∞` data for `η²` -/ + +variable {η : Vec d → ℝ} + +omit [NeZero d] in +/-- Packaged `L^∞` data for `η²` on the finite-measure cube. -/ +theorem sqCutoff_memLpTop (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) : + MemLp (sqCutoff η) (⊤ : ENNReal) (volume.restrict (openCubeSet (originCube d m))) := + memLpTop_sqCutoff hη hIcc + +omit [NeZero d] in +/-- Packaged `L∞` data for a partial derivative of `η²`. -/ +theorem sqCutoff_fderiv_memLpTop (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) {Gη : ℝ} + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) (i : Fin d) : + MemLp (fun x => (fderiv ℝ (sqCutoff η) x) (basisVec i)) (⊤ : ENNReal) + (volume.restrict (openCubeSet (originCube d m))) := + memLpTop_fderiv_sqCutoff hη hIcc hGη i + +/-! ## The test function `η²·u` -/ + +/-- `η² · u` as an `H¹` function via the library's smooth×`H¹` product. -/ +def testFun (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) + {Gη : ℝ} (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (u : H1Function (openCubeSet (originCube d m))) : + H1Function (openCubeSet (originCube d m)) := + u.mulContDiffMemLpTop (sqCutoff_contDiff hη) (sqCutoff_memLpTop (m := m) hη hIcc) + (fun i => sqCutoff_fderiv_memLpTop (m := m) hη hIcc hGη i) + +omit [NeZero d] in +/-- Evaluation formula for the cutoff test function. -/ +@[simp] theorem testFun_toFun (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) {Gη : ℝ} + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (u : H1Function (openCubeSet (originCube d m))) (x : Vec d) : + (testFun hη hIcc hGη u).toFun x = sqCutoff η x * u.toFun x := by + rw [testFun, Homogenization.H1Function.mulContDiffMemLpTop_toFun] + +omit [NeZero d] in +/-- Gradient formula for the cutoff test function. -/ +@[simp] theorem testFun_grad (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) {Gη : ℝ} + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + (u : H1Function (openCubeSet (originCube d m))) (x : Vec d) (i : Fin d) : + (testFun hη hIcc hGη u).grad x i = + sqCutoff η x * u.grad x i + u.toFun x * (fderiv ℝ (sqCutoff η) x) (basisVec i) := by + rw [testFun, Homogenization.H1Function.mulContDiffMemLpTop_grad] + +/-! ## Admissibility of the test pair -/ + +omit [NeZero d] in +/-- `MemH10 (η² u + η² u*)`, from `η² · (u + u*) ∈ H¹₀` and the library's +`H10Function` smooth product. The input `hTrace` is the trace fact +`v + v* − p·x ∈ H¹₀(U)`. -/ +theorem memH10_testPair_sum (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hIcc : ∀ x, η x ∈ Set.Icc (0 : ℝ) 1) {Gη : ℝ} + (hGη : ∀ x i, |fderiv ℝ η x (basisVec i)| ≤ Gη) + {v vstar : H1Function (openCubeSet (originCube d m))} {p : Vec d} {c : ℝ} + (hTrace : MemH10 (openCubeSet (originCube d m)) + (fun x => v.toFun x + vstar.toFun x - vecDot p x)) : + MemH10 (openCubeSet (originCube d m)) + (fun x => (testFun hη hIcc hGη (centeredPotential m v p c)).toFun x + + (testFun hη hIcc hGη (centeredPotential m vstar p (-c))).toFun x) := by + obtain ⟨w0, hw0⟩ := hTrace + refine ⟨w0.mulContDiffMemLpTop (sqCutoff_contDiff hη) (sqCutoff_memLpTop (m := m) hη hIcc) + (fun i => sqCutoff_fderiv_memLpTop (m := m) hη hIcc hGη i), ?_⟩ + funext x + rw [Homogenization.H10Function.mulContDiffMemLpTop_toFun] + show sqCutoff η x * w0.toH1Function.toFun x = _ + rw [hw0] + simp only [testFun_toFun, centeredPotential_toFun] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Median.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Median.lean new file mode 100644 index 0000000000..e1b1394b24 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Median.lean @@ -0,0 +1,278 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Measure.MeasureSpace +public import Mathlib.MeasureTheory.Measure.NullMeasurable +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Order + +/-! +# Two-function median + +A standalone measure-theory prelude. For a finite measure `μ` on `α` and two +almost-everywhere measurable real functions `f g`, there is a real level `m` +such that both the total upper mass and the total lower mass of the pair `(f, g)` +across the *two* copies of `α` stay below `μ univ`: + +`μ {m < f} + μ {m < g} ≤ μ univ` and `μ {f < m} + μ {g < m} ≤ μ univ`. + +This is exactly the statement that `m` is a median of the combined function on the +disjoint union of two copies of `α`, phrased without sum types. + +No `sorry`, no axioms, no heartbeat overrides. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology Set + +variable {α : Type*} [MeasurableSpace α] {μ : Measure α} + +/-- **Two-function median.** For a finite measure and two +a.e.-measurable real functions, there is a common level `m` at which the combined +upper mass and the combined lower mass are each at most the total mass. -/ +theorem exists_two_function_median [IsFiniteMeasure μ] + {f g : α → ℝ} (hf : AEMeasurable f μ) (hg : AEMeasurable g μ) : + ∃ m : ℝ, + μ {x | m < f x} + μ {x | m < g x} ≤ μ Set.univ ∧ + μ {x | f x < m} + μ {x | g x < m} ≤ μ Set.univ := by + classical + have hμfin : μ Set.univ ≠ ⊤ := measure_ne_top μ _ + -- null-measurability of the strict upper level sets + have hNMf : ∀ t : ℝ, NullMeasurableSet {x | t < f x} μ := fun t => + nullMeasurableSet_lt aemeasurable_const hf + have hNMg : ∀ t : ℝ, NullMeasurableSet {x | t < g x} μ := fun t => + nullMeasurableSet_lt aemeasurable_const hg + -- antitonicity of the combined "upper mass" + have hUanti : ∀ {s t : ℝ}, s ≤ t → + μ {x | t < f x} + μ {x | t < g x} ≤ μ {x | s < f x} + μ {x | s < g x} := by + intro s t hst + exact add_le_add + (measure_mono fun x hx => lt_of_le_of_lt hst hx) + (measure_mono fun x hx => lt_of_le_of_lt hst hx) + -- Trivial case: the total mass vanishes. + rcases eq_or_ne (μ Set.univ) 0 with hzero | hpos0 + · have hz : ∀ s : Set α, μ s = 0 := fun s => measure_mono_null (Set.subset_univ s) hzero + exact ⟨0, by simp [hz], by simp [hz]⟩ + have hpos : 0 < μ Set.univ := zero_lt_iff.mpr hpos0 + -- The lower-mass control: whenever the upper mass at `t` reaches the total mass, + -- the lower mass at `t` stays below it. + have hLowerMass : ∀ t : ℝ, + μ Set.univ ≤ μ {x | t < f x} + μ {x | t < g x} → + μ {x | f x < t} + μ {x | g x < t} ≤ μ Set.univ := by + intro t hle + have hcf : μ {x | t < f x} + μ {x | t < f x}ᶜ = μ Set.univ := + measure_add_measure_compl₀ (hNMf t) + have hcg : μ {x | t < g x} + μ {x | t < g x}ᶜ = μ Set.univ := + measure_add_measure_compl₀ (hNMg t) + have hsubf : {x | f x < t} ⊆ {x | t < f x}ᶜ := by + intro x hx + simp only [Set.mem_compl_iff, Set.mem_ofPred_eq, not_lt] + exact hx.le + have hsubg : {x | g x < t} ⊆ {x | t < g x}ᶜ := by + intro x hx + simp only [Set.mem_compl_iff, Set.mem_ofPred_eq, not_lt] + exact hx.le + have hUt_ne : μ {x | t < f x} + μ {x | t < g x} ≠ ⊤ := + ENNReal.add_ne_top.mpr ⟨measure_ne_top μ _, measure_ne_top μ _⟩ + have hrearrange : + (μ {x | t < f x}ᶜ + μ {x | t < g x}ᶜ) + (μ {x | t < f x} + μ {x | t < g x}) + = (μ {x | t < f x} + μ {x | t < f x}ᶜ) + (μ {x | t < g x} + μ {x | t < g x}ᶜ) := by + ring + have hsum : + (μ {x | t < f x}ᶜ + μ {x | t < g x}ᶜ) + (μ {x | t < f x} + μ {x | t < g x}) + = μ Set.univ + μ Set.univ := by + rw [hrearrange, hcf, hcg] + have hXle : μ {x | t < f x}ᶜ + μ {x | t < g x}ᶜ ≤ μ Set.univ := by + rw [← ENNReal.add_le_add_iff_right hUt_ne, hsum] + exact add_le_add le_rfl hle + calc + μ {x | f x < t} + μ {x | g x < t} + ≤ μ {x | t < f x}ᶜ + μ {x | t < g x}ᶜ := + add_le_add (measure_mono hsubf) (measure_mono hsubg) + _ ≤ μ Set.univ := hXle + -- The candidate set of levels whose upper mass is already at most the total mass. + set S : Set ℝ := + {t : ℝ | μ {x | t < f x} + μ {x | t < g x} ≤ μ Set.univ} with hSdef + have hmemS : ∀ t : ℝ, + (t ∈ S ↔ μ {x | t < f x} + μ {x | t < g x} ≤ μ Set.univ) := by + intro t; rw [hSdef]; exact Iff.rfl + have hSupClosed : ∀ {s t : ℝ}, s ∈ S → s ≤ t → t ∈ S := by + intro s t hs hst + rw [hmemS] at hs ⊢ + exact le_trans (hUanti hst) hs + -- `S` is nonempty: the upper mass tends to `0` as the level tends to `+∞`. + have hSne : S.Nonempty := by + have hInterEmptyF : ⋂ n : ℕ, {x | (n : ℝ) < f x} = ∅ := by + rw [Set.eq_empty_iff_forall_notMem] + intro x hx + rw [Set.mem_iInter] at hx + obtain ⟨n, hn⟩ := exists_nat_gt (f x) + exact absurd (hx n) (not_lt.mpr hn.le) + have hInterEmptyG : ⋂ n : ℕ, {x | (n : ℝ) < g x} = ∅ := by + rw [Set.eq_empty_iff_forall_notMem] + intro x hx + rw [Set.mem_iInter] at hx + obtain ⟨n, hn⟩ := exists_nat_gt (g x) + exact absurd (hx n) (not_lt.mpr hn.le) + have hAntiF : Antitone (fun n : ℕ => {x | (n : ℝ) < f x}) := by + intro a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + have hAntiG : Antitone (fun n : ℕ => {x | (n : ℝ) < g x}) := by + intro a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + have htf : Tendsto (fun n : ℕ => μ {x | (n : ℝ) < f x}) atTop (𝓝 0) := by + have hconv := tendsto_measure_iInter_atTop (μ := μ) + (s := fun n : ℕ => {x | (n : ℝ) < f x}) (fun n => hNMf _) hAntiF + ⟨0, measure_ne_top μ _⟩ + rwa [hInterEmptyF, measure_empty] at hconv + have htg : Tendsto (fun n : ℕ => μ {x | (n : ℝ) < g x}) atTop (𝓝 0) := by + have hconv := tendsto_measure_iInter_atTop (μ := μ) + (s := fun n : ℕ => {x | (n : ℝ) < g x}) (fun n => hNMg _) hAntiG + ⟨0, measure_ne_top μ _⟩ + rwa [hInterEmptyG, measure_empty] at hconv + have htU : Tendsto (fun n : ℕ => μ {x | (n : ℝ) < f x} + μ {x | (n : ℝ) < g x}) + atTop (𝓝 0) := by simpa using htf.add htg + obtain ⟨n, hn⟩ := (htU.eventually_lt_const hpos).exists + exact ⟨(n : ℝ), (hmemS _).mpr hn.le⟩ + -- `S` is bounded below: the upper mass tends to `2 μ univ > μ univ` as the level + -- tends to `-∞`. + have hbdd : BddBelow S := by + have hUnionUnivF : ⋃ n : ℕ, {x | -(n : ℝ) < f x} = Set.univ := by + rw [Set.eq_univ_iff_forall] + intro x + rw [Set.mem_iUnion] + obtain ⟨n, hn⟩ := exists_nat_gt (-(f x)) + exact ⟨n, by simp only [Set.mem_ofPred_eq]; linarith⟩ + have hUnionUnivG : ⋃ n : ℕ, {x | -(n : ℝ) < g x} = Set.univ := by + rw [Set.eq_univ_iff_forall] + intro x + rw [Set.mem_iUnion] + obtain ⟨n, hn⟩ := exists_nat_gt (-(g x)) + exact ⟨n, by simp only [Set.mem_ofPred_eq]; linarith⟩ + have hmonoF : Monotone (fun n : ℕ => {x | -(n : ℝ) < f x}) := by + intro a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have : -(b : ℝ) ≤ -(a : ℝ) := by + have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + linarith + have hmonoG : Monotone (fun n : ℕ => {x | -(n : ℝ) < g x}) := by + intro a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have : -(b : ℝ) ≤ -(a : ℝ) := by + have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + linarith + have htf : Tendsto (fun n : ℕ => μ {x | -(n : ℝ) < f x}) atTop (𝓝 (μ Set.univ)) := by + have hconv := tendsto_measure_iUnion_atTop (μ := μ) hmonoF + rwa [hUnionUnivF] at hconv + have htg : Tendsto (fun n : ℕ => μ {x | -(n : ℝ) < g x}) atTop (𝓝 (μ Set.univ)) := by + have hconv := tendsto_measure_iUnion_atTop (μ := μ) hmonoG + rwa [hUnionUnivG] at hconv + have h2 : Tendsto (fun n : ℕ => μ {x | -(n : ℝ) < f x} + μ {x | -(n : ℝ) < g x}) + atTop (𝓝 (μ Set.univ + μ Set.univ)) := htf.add htg + have hlt : μ Set.univ < μ Set.univ + μ Set.univ := ENNReal.lt_add_right hμfin hpos0 + obtain ⟨n, hn⟩ := (h2.eventually (Ioi_mem_nhds hlt)).exists + refine ⟨-(n : ℝ), ?_⟩ + intro t ht + by_contra hcon + push Not at hcon + rw [hmemS] at ht + have hcmp := hUanti hcon.le + exact absurd (lt_of_lt_of_le hn (le_trans hcmp ht)) (lt_irrefl _) + -- The median: the infimum of the candidate set. + set m : ℝ := sInf S with hmdef + -- Any level strictly above `m` already lies in `S`. + have hAbove : ∀ t : ℝ, m < t → t ∈ S := by + intro t hmt + obtain ⟨s, hsS, hst⟩ := exists_lt_of_csInf_lt hSne (hmdef ▸ hmt) + exact hSupClosed hsS hst.le + -- Any level strictly below `m` has upper mass exceeding the total mass. + have hBelow : ∀ t : ℝ, t < m → + μ Set.univ < μ {x | t < f x} + μ {x | t < g x} := by + intro t htm + have htnotin : t ∉ S := by + intro htS + have hle : m ≤ t := by rw [hmdef]; exact csInf_le hbdd htS + exact absurd (lt_of_lt_of_le htm hle) (lt_irrefl _) + rw [hmemS] at htnotin + exact not_le.mp htnotin + -- Continuity-from-below scaffolding for the two-sided limits at `m`. + have hUnionUpper : ∀ h : α → ℝ, + (⋃ k : ℕ, {x | m + 1 / ((k : ℝ) + 1) < h x}) = {x | m < h x} := by + intro h + ext x + simp only [Set.mem_iUnion, Set.mem_ofPred_eq] + constructor + · rintro ⟨k, hk⟩ + have hpk : (0 : ℝ) < 1 / ((k : ℝ) + 1) := by positivity + linarith + · intro hx + obtain ⟨k, hk⟩ := exists_nat_one_div_lt (sub_pos.mpr hx) + exact ⟨k, by linarith⟩ + have hMonoUpper : ∀ h : α → ℝ, + Monotone (fun k : ℕ => {x | m + 1 / ((k : ℝ) + 1) < h x}) := by + intro h a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have hle : 1 / ((b : ℝ) + 1) ≤ 1 / ((a : ℝ) + 1) := by + apply one_div_le_one_div_of_le + · positivity + · have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + linarith + have hUnionLower : ∀ h : α → ℝ, + (⋃ k : ℕ, {x | h x < m - 1 / ((k : ℝ) + 1)}) = {x | h x < m} := by + intro h + ext x + simp only [Set.mem_iUnion, Set.mem_ofPred_eq] + constructor + · rintro ⟨k, hk⟩ + have hpk : (0 : ℝ) < 1 / ((k : ℝ) + 1) := by positivity + linarith + · intro hx + obtain ⟨k, hk⟩ := exists_nat_one_div_lt (sub_pos.mpr hx) + exact ⟨k, by linarith⟩ + have hMonoLower : ∀ h : α → ℝ, + Monotone (fun k : ℕ => {x | h x < m - 1 / ((k : ℝ) + 1)}) := by + intro h a b hab x hx + simp only [Set.mem_ofPred_eq] at hx ⊢ + have hle : 1 / ((b : ℝ) + 1) ≤ 1 / ((a : ℝ) + 1) := by + apply one_div_le_one_div_of_le + · positivity + · have : (a : ℝ) ≤ b := by exact_mod_cast hab + linarith + linarith + refine ⟨m, ?_, ?_⟩ + · -- Upper condition at `m`. + have htf := tendsto_measure_iUnion_atTop (μ := μ) (hMonoUpper f) + have htg := tendsto_measure_iUnion_atTop (μ := μ) (hMonoUpper g) + rw [hUnionUpper f] at htf + rw [hUnionUpper g] at htg + refine le_of_tendsto' (htf.add htg) (fun k => ?_) + have hin : m + 1 / ((k : ℝ) + 1) ∈ S := + hAbove _ (lt_add_of_pos_right m (by positivity)) + rw [hmemS] at hin + exact hin + · -- Lower condition at `m`. + have htf := tendsto_measure_iUnion_atTop (μ := μ) (hMonoLower f) + have htg := tendsto_measure_iUnion_atTop (μ := μ) (hMonoLower g) + rw [hUnionLower f] at htf + rw [hUnionLower g] at htg + refine le_of_tendsto' (htf.add htg) (fun k => ?_) + have hlt : m - 1 / ((k : ℝ) + 1) < m := by + have : (0 : ℝ) < 1 / ((k : ℝ) + 1) := by positivity + linarith + exact hLowerMass _ (hBelow _ hlt).le + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Representation.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Representation.lean new file mode 100644 index 0000000000..a5af52d925 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Representation.lean @@ -0,0 +1,503 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CubeMinimizer + +/-! +# Coupled representation (Proposition 3.1, existence direction) + +Formalization of the EXISTENCE direction of `p.coupled.representation` +(the high-moment paper (Armstrong–Kuusi–Loher, to appear), §3.1) for the +pair constructed from the block minimizer, on the centered open triadic +cube `U = openCubeSet (originCube d m)`. + +The converse (weak solution ⟹ minimizer) and uniqueness-mod-constants are out of +scope. + +The weak-form predicate `CoupledWeakForm` (G0) and all algebraic scaffolding live +in `Coupled/WeakForm.lean`. This file assembles the existence package `G1`: +`exists_coupledRepresentation`. + +Vectors are `Vec d = Fin d → ℝ`; no `EuclideanSpace`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} [NeZero d] {m : ℤ} {Θ : ℝ} {a : CoeffField d} + +/-! ## Weak-gradient uniqueness under a.e.-equal values -/ + +omit [NeZero d] in +/-- Weak partial derivatives are unique a.e. even when the scalar +representatives agree only a.e. on the open domain (Sobolev-level restatement, +avoiding the heavier `Book.Ch03` bridge import). -/ +private theorem hasWeakPartial_ae_eq_of_toFun_ae_eq {U : Set (Vec d)} (hU : IsOpen U) + {i : Fin d} {u v gi hi : Vec d → ℝ} + (huv : u =ᵐ[volume.restrict U] v) + (hgiLoc : MeasureTheory.LocallyIntegrableOn gi U volume) + (hhiLoc : MeasureTheory.LocallyIntegrableOn hi U volume) + (hgi : HasWeakPartialDerivOn U i u gi) + (hhi : HasWeakPartialDerivOn U i v hi) : + gi =ᵐ[volume.restrict U] hi := by + refine HasWeakPartialDerivOn.ae_eq hU hgiLoc hhiLoc hgi ?_ + intro φ hφ_smooth hφ_compact hφ_sub + calc + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume + = ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂volume := + MeasureTheory.integral_congr_ae (huv.mono fun x hx => by simp [hx]) + _ = -∫ x in U, hi x * φ x ∂volume := hhi φ hφ_smooth hφ_compact hφ_sub + +omit [NeZero d] in +/-- On an open domain, two `H¹` representatives with a.e.-equal values have +a.e.-equal weak gradients. -/ +private theorem h1grad_ae_eq_of_toFun_ae_eq {U : Set (Vec d)} (hU : IsOpen U) + {u v : H1Function U} + (huv : u.toFun =ᵐ[volume.restrict U] v.toFun) : + u.grad =ᵐ[volume.restrict U] v.grad := by + have hcoord : ∀ i : Fin d, + (fun x => u.grad x i) =ᵐ[volume.restrict U] fun x => v.grad x i := by + intro i + exact hasWeakPartial_ae_eq_of_toFun_ae_eq hU huv + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((u.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2))) + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((v.gradMemL2 i).locallyIntegrable (by norm_num : (1 : ENNReal) ≤ 2))) + (u.hasWeakGradient i) (v.hasWeakGradient i) + have hall : ∀ᵐ x ∂volume.restrict U, ∀ i : Fin d, u.grad x i = v.grad x i := + MeasureTheory.ae_all_iff.mpr hcoord + filter_upwards [hall] with x hx + ext i; exact hx i + +/-! ## Solenoidality of the constructed field `h = a∇v + aᵀ∇v*` -/ + +omit [NeZero d] in +/-- The field `h`, being (a.e.) the first component of `𝐁 Z`, is solenoidal: +pairing against potential-zero-trace test fields via `BlockResponseSpace`. -/ +private theorem isSolenoidalOn_of_eq_fst + {Z : BlockState d} + (hRespO : BlockResponseSpace a (openCubeSet (originCube d m)) Z) + {hfield : Vec d → Vec d} + (hfield_eq : ∀ x, + hfield x = (blockMatVecMul (blockCoeffField a x) (Z.eval x)).1) : + IsSolenoidalOn (openCubeSet (originCube d m)) hfield := by + intro φ0 + have hYtest : + IsBlockTestOn (openCubeSet (originCube d m)) + { potential := φ0.toH1Function.grad, flux := 0 } := + ⟨φ0.isPotentialZeroTraceOn, isSolenoidalZeroNormalTraceOn_zero⟩ + have hint := hRespO.2.2 { potential := φ0.toH1Function.grad, flux := 0 } hYtest + have hfun : + (fun x => vecDot (hfield x) (φ0.toH1Function.grad x)) = + (fun x => + blockVecDot + (({ potential := φ0.toH1Function.grad, flux := 0 } : BlockState d).eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x))) := by + funext x + have hval : + blockVecDot + (({ potential := φ0.toH1Function.grad, flux := 0 } : BlockState d).eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x)) = + vecDot (φ0.toH1Function.grad x) (hfield x) := by + rw [hfield_eq] + simp [BlockState.eval, blockVecDot, vecDot_zero_left] + rw [hval, vecDot_comm] + rw [hfun]; exact hint + +/-! ## Mean-zero of `H¹₀` gradients paired with a constant -/ + +/-- For an `H¹₀` function on the open cube, the pairing of its gradient against +any constant vector integrates to zero (the C0(i) mean-zero fact). -/ +private theorem integral_vecDot_grad_const_eq_zero + (α10 : H10Function (openCubeSet (originCube d m))) (c : Vec d) : + ∫ x in openCubeSet (originCube d m), + vecDot (α10.toH1Function.grad x) c ∂volume = 0 := by + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hmz : + (fun i => ∫ x in openCubeSet (originCube d m), + α10.toH1Function.grad x i ∂volume) = 0 := + IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + α10.isPotentialZeroTraceOn + have hInt : ∀ i : Fin d, + MeasureTheory.Integrable (fun x => α10.toH1Function.grad x i * c i) + (volume.restrict (openCubeSet (originCube d m))) := by + intro i + exact ((α10.toH1Function.gradMemL2 i).integrable (by norm_num)).mul_const (c i) + calc + ∫ x in openCubeSet (originCube d m), vecDot (α10.toH1Function.grad x) c ∂volume + = ∫ x in openCubeSet (originCube d m), + ∑ i, α10.toH1Function.grad x i * c i ∂volume := rfl + _ = ∑ i, ∫ x in openCubeSet (originCube d m), + α10.toH1Function.grad x i * c i ∂volume := + MeasureTheory.integral_finsetSum _ (fun i _ => hInt i) + _ = ∑ i, (∫ x in openCubeSet (originCube d m), + α10.toH1Function.grad x i ∂volume) * c i := by + refine Finset.sum_congr rfl (fun i _ => ?_) + rw [MeasureTheory.integral_mul_const] + _ = 0 := by + have hz : ∀ i, (∫ x in openCubeSet (originCube d m), + α10.toH1Function.grad x i ∂volume) = 0 := + fun i => congrFun hmz i + simp [hz] + +/-! ## The weak form of the constructed pair -/ + +/-- The constructed pair `(v, v*)` satisfies the weak form of the coupled +problem. The proof is the paper's `α/β` split: +`α := ½(φ+φ*) ∈ H¹₀` pairs to zero against the solenoidal field +`h = a∇v + aᵀ∇v*`, `β := ½(φ−φ*)` pairs against `j − q` (admissibility), and the +constant `q` integrates to zero against `∇α`. -/ +private theorem coupledWeakForm_aux {P : BlockVec d} + {Z : BlockState d} {v vstar : H1Function (openCubeSet (originCube d m))} + (hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a) + (hAdmO : IsBlockMuAdmissible (openCubeSet (originCube d m)) P Z) + (hRespO : BlockResponseSpace a (openCubeSet (originCube d m)) Z) + (hf_fst : ∀ x, + matVecMul (a x) (v.grad x) + matVecMul (matTranspose (a x)) (vstar.grad x) = + (blockMatVecMul (blockCoeffField a x) (Z.eval x)).1) + (hj_flux : ∀ x, x ∈ openCubeSet (originCube d m) → + matVecMul (a x) (v.grad x) - matVecMul (matTranspose (a x)) (vstar.grad x) = + Z.flux x) : + CoupledWeakForm a (openCubeSet (originCube d m)) P.2 v vstar := by + intro φ φstar hMemSum + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + -- abbreviations + set Av : Vec d → Vec d := fun x => matVecMul (a x) (v.grad x) with hAv + set As : Vec d → Vec d := fun x => matVecMul (matTranspose (a x)) (vstar.grad x) with hAs + set hf : Vec d → Vec d := fun x => Av x + As x with hhf + set jf : Vec d → Vec d := fun x => Av x - As x with hjf + set αg : Vec d → Vec d := fun x => (1 / 2 : ℝ) • (φ.grad x + φstar.grad x) with hαg + set βg : Vec d → Vec d := fun x => (1 / 2 : ℝ) • (φ.grad x - φstar.grad x) with hβg + -- L² memberships + have hvgL2 : MemVectorL2 (openCubeSet (originCube d m)) v.grad := v.grad_memVectorL2 + have hvsgL2 : MemVectorL2 (openCubeSet (originCube d m)) vstar.grad := vstar.grad_memVectorL2 + have hφgL2 : MemVectorL2 (openCubeSet (originCube d m)) φ.grad := φ.grad_memVectorL2 + have hφsgL2 : MemVectorL2 (openCubeSet (originCube d m)) φstar.grad := φstar.grad_memVectorL2 + have hAvL2 : MemVectorL2 (openCubeSet (originCube d m)) Av := memVectorL2_matVecMul_of_isEllipticFieldOn hEllO hvgL2 + have hAsL2 : MemVectorL2 (openCubeSet (originCube d m)) As := by + have heq : As = fun x => matVecMul (symmPart (a x)) (vstar.grad x) - + matVecMul (skewPart (a x)) (vstar.grad x) := by + funext x; exact matVecMul_matTranspose_eq (a x) (vstar.grad x) + rw [heq] + exact (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEllO hvsgL2).sub + (memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEllO hvsgL2) + have hfL2 : MemVectorL2 (openCubeSet (originCube d m)) hf := hAvL2.add hAsL2 + have hjfL2 : MemVectorL2 (openCubeSet (originCube d m)) jf := hAvL2.sub hAsL2 + have hαgL2 : MemVectorL2 (openCubeSet (originCube d m)) αg := (hφgL2.add hφsgL2).const_smul (1 / 2 : ℝ) + have hβgL2 : MemVectorL2 (openCubeSet (originCube d m)) βg := (hφgL2.sub hφsgL2).const_smul (1 / 2 : ℝ) + have hZfluxL2 : MemVectorL2 (openCubeSet (originCube d m)) Z.flux := by + have h := (memVectorL2_const (U := (openCubeSet (originCube d m))) P.2).add hAdmO.fluxCorrection_memL2 + have heq : ((fun _ : Vec d => P.2) + fun x => Z.flux x - P.2) = Z.flux := by + funext x; simp only [Pi.add_apply]; abel + rwa [heq] at h + -- integrability shortcuts + have hInt : ∀ {f g : Vec d → Vec d}, MemVectorL2 (openCubeSet (originCube d m)) f → MemVectorL2 (openCubeSet (originCube d m)) g → + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (g x)) (openCubeSet (originCube d m)) := + fun hf hg => integrableOn_vecDot_of_memVectorL2 hf hg + -- α as an H¹₀ competitor (via the trace hypothesis) + obtain ⟨w0, hw0⟩ := hMemSum + set α10 : H10Function (openCubeSet (originCube d m)) := (1 / 2 : ℝ) • w0 with hα10 + have hα10grad_ae : α10.toH1Function.grad =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] αg := by + have hgrad_w0 : w0.toH1Function.grad =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => φ.grad x + φstar.grad x) := by + have htoFun : w0.toH1Function.toFun =ᵐ[volume.restrict (openCubeSet (originCube d m))] (φ + φstar).toFun := by + rw [hw0] + exact MeasureTheory.ae_of_all _ (fun x => rfl) + have := h1grad_ae_eq_of_toFun_ae_eq (isOpen_openCubeSet _) htoFun + simpa using this + have hα10grad : α10.toH1Function.grad = fun x => (1 / 2 : ℝ) • w0.toH1Function.grad x := rfl + rw [hα10grad] + filter_upwards [hgrad_w0] with x hx + show (1 / 2 : ℝ) • w0.toH1Function.grad x = αg x + rw [hx] + -- pointwise α/β split of the integrand + have hsplit : ∀ x, + vecDot (φ.grad x) (Av x) + vecDot (φstar.grad x) (As x) = + vecDot (αg x) (hf x) + vecDot (βg x) (jf x) := by + intro x + exact vecDot_alpha_beta_split (φ.grad x) (φstar.grad x) (Av x) (As x) + -- h is solenoidal + have hSol : IsSolenoidalOn (openCubeSet (originCube d m)) hf := + isSolenoidalOn_of_eq_fst (hfield := hf) hRespO (fun x => hf_fst x) + -- ∫ ∇α·h = 0 + have hIhf : ∫ x in (openCubeSet (originCube d m)), vecDot (αg x) (hf x) ∂volume = 0 := by + have hae : (fun x => vecDot (αg x) (hf x)) =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => vecDot (hf x) (α10.toH1Function.grad x)) := by + filter_upwards [hα10grad_ae] with x hx + rw [← hx, vecDot_comm] + rw [MeasureTheory.integral_congr_ae hae] + exact hSol α10 + -- ∫ ∇β·j = ∫ ∇β·q + have hIjf : ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) (jf x) ∂volume = + ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) P.2 ∂volume := by + have hjf_flux : (fun x => vecDot (βg x) (jf x)) =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => vecDot (βg x) (Z.flux x)) := by + have hmemU : ∀ᵐ x ∂volume.restrict (openCubeSet (originCube d m)), x ∈ (openCubeSet (originCube d m)) := + MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet _) + filter_upwards [hmemU] with x hx + show vecDot (βg x) (jf x) = vecDot (βg x) (Z.flux x) + have hjx : jf x = Z.flux x := hj_flux x hx + rw [hjx] + rw [MeasureTheory.integral_congr_ae hjf_flux] + -- admissibility: ∫ (Z.flux − q)·∇β = 0 + set β : H1Function (openCubeSet (originCube d m)) := (1 / 2 : ℝ) • (φ - φstar) with hβ + have hβgrad : ∀ x, β.grad x = βg x := by + intro x + show (1 / 2 : ℝ) • ((φ - φstar).grad x) = βg x + rw [hβg, Homogenization.H1Function.sub_grad] + have hadm := hAdmO.isSolenoidalZeroNormalTrace β + have hexp : (fun x => vecDot ((fun y => Z.flux y - P.2) x) (β.grad x)) = + (fun x => vecDot (Z.flux x) (βg x) - vecDot P.2 (βg x)) := by + funext x + rw [hβgrad x] + show vecDot (Z.flux x - P.2) (βg x) = vecDot (Z.flux x) (βg x) - vecDot P.2 (βg x) + rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left, ← sub_eq_add_neg] + rw [hexp] at hadm + have hsub := MeasureTheory.integral_sub + (hInt hZfluxL2 hβgL2) (hInt (memVectorL2_const (U := (openCubeSet (originCube d m))) P.2) hβgL2) + rw [hsub] at hadm + have : ∫ x in (openCubeSet (originCube d m)), vecDot (Z.flux x) (βg x) ∂volume = + ∫ x in (openCubeSet (originCube d m)), vecDot P.2 (βg x) ∂volume := by linarith [hadm] + calc + ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) (Z.flux x) ∂volume + = ∫ x in (openCubeSet (originCube d m)), vecDot (Z.flux x) (βg x) ∂volume := by + apply MeasureTheory.integral_congr_ae; apply MeasureTheory.ae_of_all + intro x; exact vecDot_comm _ _ + _ = ∫ x in (openCubeSet (originCube d m)), vecDot P.2 (βg x) ∂volume := this + _ = ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) P.2 ∂volume := by + apply MeasureTheory.integral_congr_ae; apply MeasureTheory.ae_of_all + intro x; exact vecDot_comm _ _ + -- ∫ ∇α·q = 0 + have hIαq : ∫ x in (openCubeSet (originCube d m)), vecDot (αg x) P.2 ∂volume = 0 := by + have hae : (fun x => vecDot (αg x) P.2) =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => vecDot (α10.toH1Function.grad x) P.2) := by + filter_upwards [hα10grad_ae] with x hx + rw [hx] + rw [MeasureTheory.integral_congr_ae hae] + exact integral_vecDot_grad_const_eq_zero α10 P.2 + -- assemble + have hLHS : (∫ x in (openCubeSet (originCube d m)), vecDot (φ.grad x) (Av x) ∂volume) + + (∫ x in (openCubeSet (originCube d m)), vecDot (φstar.grad x) (As x) ∂volume) = + ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) P.2 ∂volume := by + rw [← MeasureTheory.integral_add (hInt hφgL2 hAvL2) (hInt hφsgL2 hAsL2)] + rw [MeasureTheory.integral_congr_ae (MeasureTheory.ae_of_all _ hsplit)] + rw [MeasureTheory.integral_add (hInt hαgL2 hfL2) (hInt hβgL2 hjfL2)] + rw [hIhf, hIjf, zero_add] + have hRHS : (∫ x in (openCubeSet (originCube d m)), vecDot P.2 (φ.grad x) ∂volume) = + ∫ x in (openCubeSet (originCube d m)), vecDot (βg x) P.2 ∂volume := by + have hφ : (fun x => vecDot P.2 (φ.grad x)) =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => vecDot (αg x) P.2 + vecDot (βg x) P.2) := by + apply MeasureTheory.ae_of_all + intro x + show vecDot P.2 (φ.grad x) = vecDot (αg x) P.2 + vecDot (βg x) P.2 + rw [vecDot_comm P.2 (φ.grad x), ← vecDot_add_left] + congr 1 + show φ.grad x = αg x + βg x + rw [hαg, hβg]; module + rw [MeasureTheory.integral_congr_ae hφ] + rw [MeasureTheory.integral_add (hInt hαgL2 (memVectorL2_const (U := (openCubeSet (originCube d m))) P.2)) + (hInt hβgL2 (memVectorL2_const (U := (openCubeSet (originCube d m))) P.2))] + rw [hIαq, zero_add] + rw [hLHS, hRHS] + +/-! ## G1 — the coupled representation existence package -/ + +/-- **G1.** Existence direction of the coupled representation +(`p.coupled.representation`) on the centered open triadic cube. + +For `P = (p, q)` there exist the block minimizer `Z` (transferred to the +open cube) and `H¹` functions `v, v*` such that: + +* **(i)** `Z` is admissible for `P`, energy-realizing, and in the block response + space; +* **(ii)** trace: `v + v* − p·x ∈ H¹₀(U)`; +* **(iii)** gradient dictionary a.e.: `Z.potential = ∇v + ∇v*` and + `Z.flux = a∇v − aᵗ∇v*`; +* **(iv)** the weak form `CoupledWeakForm`; +* **(v)** energy identity a.e.: + `Z·𝐁 Z = 2∇v·s∇v + 2∇v*·s∇v*`. -/ +theorem exists_coupledRepresentation + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) (P : BlockVec d) : + ∃ (Z : BlockState d) (v vstar : H1Function (openCubeSet (originCube d m))), + IsBlockMuAdmissible (openCubeSet (originCube d m)) P Z ∧ + Mu (openCubeSet (originCube d m)) P a = + blockEnergyAverage (openCubeSet (originCube d m)) a Z ∧ + BlockResponseSpace a (openCubeSet (originCube d m)) Z ∧ + MemH10 (openCubeSet (originCube d m)) + (fun x => v.toFun x + vstar.toFun x - vecDot P.1 x) ∧ + Z.potential =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + (fun x => v.grad x + vstar.grad x) ∧ + Z.flux =ᵐ[volumeMeasureOn (openCubeSet (originCube d m))] + (fun x => matVecMul (a x) (v.grad x) - + matVecMul (matTranspose (a x)) (vstar.grad x)) ∧ + CoupledWeakForm a (openCubeSet (originCube d m)) P.2 v vstar ∧ + (fun x => blockVecDot (Z.eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x))) =ᵐ[volumeMeasureOn + (openCubeSet (originCube d m))] + (fun x => 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x))) := by + classical + set U := openCubeSet (originCube d m) with hUdef + let := isFiniteMeasure_openCubeSet_originCube (d := d) m + have hUopen : IsOpen U := isOpen_openCubeSet (originCube d m) + -- Ellipticity transferred to the open cube. + have hEllO : IsEllipticFieldOn 1 Θ U a := + hEll.mono (measurableSet_openCubeSet (originCube d m)) + (openCubeSet_subset_cubeSet (originCube d m)) + -- The block minimizer, transferred to the open cube. + obtain ⟨Z, hAdmC, hEnergyC, hRespC⟩ := exists_cubeBlockMinimizer hEll P + have hAdmO : IsBlockMuAdmissible U P Z := + (isBlockMuAdmissible_cubeSet_originCube_iff_openCubeSet).1 hAdmC + have hRespO : BlockResponseSpace a U Z := + (blockResponseSpace_cubeSet_originCube_iff_openCubeSet).1 hRespC + have hEnergyO : Mu U P a = blockEnergyAverage U a Z := by + rw [← Mu_cubeSet_originCube_eq_openCubeSet (d := d) m P a, hEnergyC] + unfold blockEnergyAverage + exact volumeAverage_cubeSet_originCube_eq_openCubeSet (d := d) m (blockEnergyDensity a Z) + -- L² memberships of the minimizer fields. + have hPotL2 : MemVectorL2 U Z.potential := by + have h := (memVectorL2_const (U := U) P.1).add hAdmO.potentialCorrection_memL2 + have heq : ((fun _ : Vec d => P.1) + fun x => Z.potential x - P.1) = Z.potential := by + funext x; simp only [Pi.add_apply]; abel + rwa [heq] at h + have hFluxL2 : MemVectorL2 U Z.flux := by + have h := (memVectorL2_const (U := U) P.2).add hAdmO.fluxCorrection_memL2 + have heq : ((fun _ : Vec d => P.2) + fun x => Z.flux x - P.2) = Z.flux := by + funext x; simp only [Pi.add_apply]; abel + rwa [heq] at h + -- τ := second component of `𝐁 Z`. + set τ : Vec d → Vec d := + fun x => matVecMul ((symmPart (a x))⁻¹) + (Z.flux x - matVecMul (skewPart (a x)) (Z.potential x)) with hτdef + have hsnd : ∀ x, (blockMatVecMul (blockCoeffField a x) (Z.eval x)).2 = τ x := fun x => + blockMatVecMul_blockMatrixOfCoeff_snd (a x) (Z.potential x) (Z.flux x) + have hfst : ∀ x, (blockMatVecMul (blockCoeffField a x) (Z.eval x)).1 = + matVecMul (symmPart (a x)) (Z.potential x) + matVecMul (skewPart (a x)) (τ x) := fun x => + blockMatVecMul_blockMatrixOfCoeff_fst (a x) (Z.potential x) (Z.flux x) + -- τ ∈ L². + have hτL2 : MemVectorL2 U τ := by + have hk : MemVectorL2 U (fun x => matVecMul (skewPart (a x)) (Z.potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEllO hPotL2 + exact memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEllO (hFluxL2.sub hk) + -- Hodge converse: τ is a potential field. + have hτorth : ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (τ x) ∂volume = 0 := by + intro g hgL2 hgSol + have hYtest : IsBlockTestOn U { potential := 0, flux := g } := + ⟨isPotentialZeroTraceOn_zero, hgSol⟩ + have hint := hRespO.2.2 { potential := 0, flux := g } hYtest + have hfun : (fun x => vecDot (g x) (τ x)) = + (fun x => blockVecDot (({ potential := 0, flux := g } : BlockState d).eval x) + (blockMatVecMul (blockCoeffField a x) (Z.eval x))) := by + funext x + rw [show (({ potential := 0, flux := g } : BlockState d).eval x) = (0, g x) from rfl] + simp only [blockVecDot, vecDot_zero_left, zero_add] + rw [hsnd x] + rw [hfun]; exact hint + have hpotτ : IsPotentialOn U τ := + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet (originCube d m))) hτL2 hτorth + obtain ⟨ψ, hψ⟩ := hpotτ + -- The `H¹₀` potential witness `w`; the affine part; `u := w + p·x`. + obtain ⟨w, hw⟩ := hAdmO.isPotentialZeroTrace + set u : H1Function U := w.toH1Function + affineH1 m P.1 with hudef + have hugrad : ∀ x, u.grad x = Z.potential x := by + intro x + show w.toH1Function.grad x + (affineH1 m P.1).grad x = Z.potential x + rw [hw, affineH1_grad] + show (Z.potential x - P.1) + P.1 = Z.potential x + abel + have hutoFun : ∀ x, u.toFun x = w.toH1Function.toFun x + vecDot P.1 x := by + intro x + show w.toH1Function.toFun x + (affineH1 m P.1).toFun x = + w.toH1Function.toFun x + vecDot P.1 x + rw [affineH1_toFun] + -- The pair `v = (u+ψ)/2`, `v* = (u−ψ)/2`. + set v : H1Function U := (1 / 2 : ℝ) • (u + ψ) with hvdef + set vstar : H1Function U := (1 / 2 : ℝ) • (u - ψ) with hvsdef + have hvg : ∀ x, v.grad x = (1 / 2 : ℝ) • (Z.potential x + τ x) := by + intro x + have hstep : v.grad x = (1 / 2 : ℝ) • (u.grad x + ψ.grad x) := by + show ((1 / 2 : ℝ) • (u + ψ)).grad x = (1 / 2 : ℝ) • (u.grad x + ψ.grad x) + rw [Homogenization.H1Function.smul_grad, Homogenization.H1Function.add_grad] + rw [hstep, hugrad, hψ] + have hvsg : ∀ x, vstar.grad x = (1 / 2 : ℝ) • (Z.potential x - τ x) := by + intro x + have hstep : vstar.grad x = (1 / 2 : ℝ) • (u.grad x - ψ.grad x) := by + show ((1 / 2 : ℝ) • (u - ψ)).grad x = (1 / 2 : ℝ) • (u.grad x - ψ.grad x) + rw [Homogenization.H1Function.smul_grad, Homogenization.H1Function.sub_grad] + rw [hstep, hugrad, hψ] + have hsumg : ∀ x, v.grad x + vstar.grad x = Z.potential x := by + intro x; rw [hvg, hvsg]; module + have hdiffg : ∀ x, v.grad x - vstar.grad x = τ x := by + intro x; rw [hvg, hvsg]; module + -- The two flux identities. + have hf_fst : ∀ x, matVecMul (a x) (v.grad x) + + matVecMul (matTranspose (a x)) (vstar.grad x) = + (blockMatVecMul (blockCoeffField a x) (Z.eval x)).1 := by + intro x + rw [matVecMul_add_matTranspose_eq, hsumg x, hdiffg x, hfst x] + have hj_flux : ∀ x, x ∈ U → matVecMul (a x) (v.grad x) - + matVecMul (matTranspose (a x)) (vstar.grad x) = Z.flux x := by + intro x hx + rw [matVecMul_sub_matTranspose_eq, hsumg x, hdiffg x] + have hdet : IsUnit (symmPart (a x)).det := + isUnit_det_symmPart_of_isEllipticMatrix (hEllO.2 x hx) + have hsτ : matVecMul (symmPart (a x)) (τ x) = + Z.flux x - matVecMul (skewPart (a x)) (Z.potential x) := by + show matVecMul (symmPart (a x)) (matVecMul ((symmPart (a x))⁻¹) + (Z.flux x - matVecMul (skewPart (a x)) (Z.potential x))) = _ + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hdet, matVecMul_one] + rw [hsτ]; abel + -- assemble the package + refine ⟨Z, v, vstar, hAdmO, hEnergyO, hRespO, ?_, ?_, ?_, ?_, ?_⟩ + · -- (ii) trace + refine ⟨w, ?_⟩ + funext x + show w.toH1Function.toFun x = v.toFun x + vstar.toFun x - vecDot P.1 x + have hvtf : v.toFun x + vstar.toFun x = u.toFun x := by + show ((1 / 2 : ℝ) • (u + ψ)).toFun x + ((1 / 2 : ℝ) • (u - ψ)).toFun x = u.toFun x + rw [Homogenization.H1Function.smul_toFun, Homogenization.H1Function.smul_toFun, + Homogenization.H1Function.add_toFun, Homogenization.H1Function.sub_toFun] + ring + rw [hvtf, hutoFun x]; ring + · -- (iii-a) potential dictionary + exact MeasureTheory.ae_of_all _ (fun x => (hsumg x).symm) + · -- (iii-b) flux dictionary + refine (MeasureTheory.ae_restrict_iff' (measurableSet_openCubeSet _)).2 ?_ + exact MeasureTheory.ae_of_all _ (fun x hx => (hj_flux x hx).symm) + · -- (iv) weak form + exact coupledWeakForm_aux hEllO hAdmO hRespO hf_fst hj_flux + · -- (v) energy identity + refine (MeasureTheory.ae_restrict_iff' (measurableSet_openCubeSet _)).2 ?_ + refine MeasureTheory.ae_of_all _ (fun x hx => ?_) + have hdet : IsUnit (symmPart (a x)).det := + isUnit_det_symmPart_of_isEllipticMatrix (hEllO.2 x hx) + show blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) = + 2 * vecDot (v.grad x) (matVecMul (symmPart (a x)) (v.grad x)) + + 2 * vecDot (vstar.grad x) (matVecMul (symmPart (a x)) (vstar.grad x)) + rw [hvg x, hvsg x] + have hLHS : blockVecDot (Z.eval x) (blockMatVecMul (blockCoeffField a x) (Z.eval x)) = + vecDot (Z.potential x) (matVecMul (symmPart (a x)) (Z.potential x)) + + vecDot (τ x) (matVecMul (symmPart (a x)) (τ x)) := by + show blockVecDot (Z.potential x, Z.flux x) + (blockMatVecMul (blockMatrixOfCoeff (a x)) (Z.potential x, Z.flux x)) = _ + rw [blockEnergy_pointwise_eq hdet] + rw [hLHS, ← two_vecDot_symmPart_half_add_sub (symmPart (a x)) (Z.potential x) (τ x)] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia.lean new file mode 100644 index 0000000000..e1fe0d877f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelEnergy +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.DeGiorgiCore +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Median + +/-! +# The coupled Stampacchia estimate (Proposition 3.3) + +The `H1` assembly. Given the coupled weak form on the centered open +triadic cube `U = openCubeSet (originCube d m)`, there is a constant `c` (the +median of the pair `(v − ½p·x, −v* + ½p·x)`) such that, almost everywhere on `U`, +`|v − ½p·x − c| ≤ C_d · L · M` and `|v* − ½p·x + c| ≤ C_d · L · M`, +with `L = 3^m`, `M = √(Θ|p|² + |q|²)`. + +The proof: +* Part C (`coupled_levelEnergy`) supplies the measurable representatives + `w₁ ≈ v − ½p·x`, `w₂ ≈ −v* + ½p·x` and, for the *negated* problem, + `w₁' ≈ −(v − ½p·x)`, `w₂' ≈ −(−v* + ½p·x)`, together with the level-energy + estimate in the De Giorgi core's shape. +* `exists_two_function_median` produces a single median `m`. +* `deGiorgi_one_sided_core` is applied four times — to `(w₁,w₂)`, `(w₂,w₁)` + (upper tails, median `m`) and `(w₁',w₂')`, `(w₂',w₁')` (lower tails, median + `−m`) — after transporting the core from `axisCube` to `openCubeSet` through the + set identity `openCubeSet (originCube d m) = axisCube (fun _ => −½·3^m) (3^m)`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal NNReal BigOperators + +noncomputable section + +variable {d : ℕ} + +/-- Commuting the two summands inside the level-energy predicate. -/ +private theorem le_sqrt_add_comm {S1 S2 V1 V2 E : ℝ} + (h : S1 + S2 ≤ E * Real.sqrt (V1 + V2)) : + S2 + S1 ≤ E * Real.sqrt (V2 + V1) := by + rw [add_comm S2 S1, add_comm V2 V1]; exact h + +/-- `vecNormSq` is even. -/ +private theorem vecNormSq_neg (r : Vec d) : vecNormSq (-r) = vecNormSq r := by + simp only [vecNormSq, vecDot, Pi.neg_apply, neg_mul_neg] + +/-- The centered open triadic cube is the axis cube with corner `−½·3^m` and side +`3^m`. -/ +theorem openCubeSet_originCube_eq_axisCube (m : ℤ) : + openCubeSet (originCube d m) + = axisCube (fun _ => (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m) ((3 : ℝ) ^ m) := by + have harith : (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m + (3 : ℝ) ^ m = (1 / 2 : ℝ) * (3 : ℝ) ^ m := by + ring + ext x + simp only [mem_openCubeSet_originCube_iff, axisCube, Set.mem_pi, Set.mem_univ, + forall_true_left, Set.mem_Ioo, harith] + +/-- **Coupled Stampacchia estimate (Prop 3.3).** + +Given `hEll` and the coupled weak form + shared trace (the consumed conjuncts of +the representation package), there is a dimensional constant `Cd ≥ 0` and a level `c` with, +almost everywhere on `U = openCubeSet (originCube d m)`, +`|v.toFun x − ½ p·x − c| ≤ Cd · 3^m · √(Θ|p|² + |q|²)` and the mirror bound for +`v*`. -/ +theorem coupled_stampacchia (hd : 3 ≤ d) {m : ℤ} {Θ : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) {p q : Vec d} + {v vstar : H1Function (openCubeSet (originCube d m))} + (hCWF : CoupledWeakForm a (openCubeSet (originCube d m)) q v vstar) + (htrace : MemH10 (openCubeSet (originCube d m)) + (fun x => v.toFun x + vstar.toFun x - vecDot p x)) : + ∃ (Cd c : ℝ), 0 ≤ Cd ∧ + (∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |v.toFun x - (1 / 2 : ℝ) * vecDot p x - c| + ≤ Cd * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q)) ∧ + (∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |vstar.toFun x - (1 / 2 : ℝ) * vecDot p x + c| + ≤ Cd * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q)) := by + classical + have : NeZero d := ⟨by omega⟩ + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := + isFiniteMeasure_openCubeSet_originCube (d := d) m + have hUbcd : IsOpenBoundedConvexDomain (openCubeSet (originCube d m)) := + isOpenBoundedConvexDomain_openCubeSet (originCube d m) + have hUmeas : MeasurableSet (openCubeSet (originCube d m)) := + measurableSet_openCubeSet (originCube d m) + -- ellipticity transferred to the open cube + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a := + hEll.mono hUmeas (openCubeSet_subset_cubeSet (originCube d m)) + -- `Θ ≥ 0` via ellipticity at the cube's center `0` + have h3pos : (0 : ℝ) < (3 : ℝ) ^ m := by positivity + have hΘ : 0 ≤ Θ := by + have hmem0 : (0 : Vec d) ∈ cubeSet (originCube d m) := by + rw [mem_cubeSet_originCube_iff] + intro i; refine ⟨by simp; linarith, by simp; linarith⟩ + exact le_trans zero_le_one (hEll.2 (0 : Vec d) hmem0).2.1 + set M2 : ℝ := Θ * vecNormSq p + vecNormSq q with hM2_def + have hM2 : 0 ≤ M2 := add_nonneg (mul_nonneg hΘ (vecNormSq_nonneg p)) (vecNormSq_nonneg q) + set E₀ : ℝ := 2 * Real.sqrt d * Real.sqrt M2 with hE0_def + have hE₀ : 0 ≤ E₀ := by rw [hE0_def]; positivity + -- Part C for `(v, v*, p, q)` + obtain ⟨w₁, w₂, hw1meas, hw2meas, hw1ae, hw2ae, hmatch, hlevel⟩ := + coupled_levelEnergy hUbcd hΘ hEllO hCWF htrace + -- Part C for the negated problem `(−v, −v*, −p, −q)` + have hCWF' : CoupledWeakForm a (openCubeSet (originCube d m)) (-q) (-v) (-vstar) := + coupledWeakForm_neg hCWF + have htrace' : MemH10 (openCubeSet (originCube d m)) + (fun x => (-v).toFun x + (-vstar).toFun x - vecDot (-p) x) := by + have hfun : (fun x => (-v).toFun x + (-vstar).toFun x - vecDot (-p) x) + = (fun x => -(v.toFun x + vstar.toFun x - vecDot p x)) := by + funext x + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hfun]; exact memH10_neg htrace + obtain ⟨w₁', w₂', hw1'meas, hw2'meas, hw1'ae, hw2'ae, hmatch', hlevel'⟩ := + coupled_levelEnergy hUbcd hΘ hEllO hCWF' htrace' + -- median of `(w₁, w₂)` + obtain ⟨m₀, hup, hlow⟩ := + exists_two_function_median (μ := volumeMeasureOn (openCubeSet (originCube d m))) + hw1meas.aemeasurable hw2meas.aemeasurable + -- the core, transported to the open cube + obtain ⟨Cd, hCd0, hcore⟩ := deGiorgi_one_sided_core (d := d) hd + have hset := openCubeSet_originCube_eq_axisCube (d := d) m + have hcore' := hcore (fun _ => (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m) ((3 : ℝ) ^ m) h3pos + rw [← hset] at hcore' + -- measure conversions + have hμconv : ∀ (w : Vec d → ℝ), Measurable w → ∀ t : ℝ, + (volumeMeasureOn (openCubeSet (originCube d m))) {x | t < w x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ t < w x} := by + intro w hw t + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply + (measurableSet_lt measurable_const hw)] + congr 1; ext x; simp only [Set.mem_inter_iff, Set.mem_ofPred_eq]; tauto + have hμconv_lt : ∀ (w : Vec d → ℝ), Measurable w → ∀ t : ℝ, + (volumeMeasureOn (openCubeSet (originCube d m))) {x | w x < t} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w x < t} := by + intro w hw t + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply + (measurableSet_lt hw measurable_const)] + congr 1; ext x; simp only [Set.mem_inter_iff, Set.mem_ofPred_eq]; tauto + have hunivvol : + (volumeMeasureOn (openCubeSet (originCube d m))) Set.univ + = volume (openCubeSet (originCube d m)) := by + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply MeasurableSet.univ, Set.univ_inter] + -- volume of a level set is invariant under a.e.-equal functions + have hvol_ae : ∀ (f g : Vec d → ℝ), f =ᵐ[volume.restrict (openCubeSet (originCube d m))] g → + ∀ t : ℝ, volume {x | x ∈ openCubeSet (originCube d m) ∧ t < f x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ t < g x} := by + intro f g hfg t + refine measure_congr ?_ + have hfg' : ∀ᵐ x ∂volume, x ∈ openCubeSet (originCube d m) → f x = g x := + (MeasureTheory.ae_restrict_iff' hUmeas).1 hfg + filter_upwards [hfg'] with x hx + simp only [eq_iff_iff] + constructor <;> rintro ⟨hxU, hlt⟩ <;> exact ⟨hxU, by rw [hx hxU] at *; assumption⟩ + -- normalise the negated-problem level energy to `p`, `q` + simp only [vecNormSq_neg] at hlevel' + -- `w₁' ≈ −w₁`, `w₂' ≈ −w₂` + have hw1'neg : w₁'.toFun =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => -w₁.toFun x) := by + filter_upwards [hw1'ae, hw1ae] with x hx' hx + rw [hx'] + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left] + rw [hx]; ring + have hw2'neg : w₂'.toFun =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => -w₂.toFun x) := by + filter_upwards [hw2'ae, hw2ae] with x hx' hx + rw [hx'] + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left] + rw [hx]; ring + -- the bound `K = Cd · L · E₀` + set K : ℝ := Cd * (3 : ℝ) ^ m * E₀ with hK_def + -- median hypotheses in the core's shape + have hmed12 : volume {x | x ∈ openCubeSet (originCube d m) ∧ m₀ < w₁.toFun x} + + volume {x | x ∈ openCubeSet (originCube d m) ∧ m₀ < w₂.toFun x} + ≤ volume (openCubeSet (originCube d m)) := by + rw [← hμconv w₁.toFun hw1meas m₀, ← hμconv w₂.toFun hw2meas m₀, ← hunivvol]; exact hup + have hmed12' : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₁'.toFun x} + + volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₂'.toFun x} + ≤ volume (openCubeSet (originCube d m)) := by + have e1 : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₁'.toFun x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w₁.toFun x < m₀} := by + rw [hvol_ae w₁'.toFun (fun x => -w₁.toFun x) hw1'neg (-m₀)] + congr 1; ext x; simp only [Set.mem_ofPred_eq] + constructor <;> rintro ⟨h1, h2⟩ <;> exact ⟨h1, by linarith⟩ + have e2 : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₂'.toFun x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w₂.toFun x < m₀} := by + rw [hvol_ae w₂'.toFun (fun x => -w₂.toFun x) hw2'neg (-m₀)] + congr 1; ext x; simp only [Set.mem_ofPred_eq] + constructor <;> rintro ⟨h1, h2⟩ <;> exact ⟨h1, by linarith⟩ + rw [e1, e2, ← hμconv_lt w₁.toFun hw1meas m₀, ← hμconv_lt w₂.toFun hw2meas m₀, ← hunivvol] + exact hlow + -- matched traces for the swapped pairs + have hmatch21 : MemH10 (openCubeSet (originCube d m)) (fun x => w₂.toFun x - w₁.toFun x) := by + have h := memH10_neg hmatch + have hfun : (fun x => -(w₁.toFun x - w₂.toFun x)) = fun x => w₂.toFun x - w₁.toFun x := by + funext x; ring + rwa [hfun] at h + have hmatch21' : MemH10 (openCubeSet (originCube d m)) (fun x => w₂'.toFun x - w₁'.toFun x) := by + have h := memH10_neg hmatch' + have hfun : (fun x => -(w₁'.toFun x - w₂'.toFun x)) = fun x => w₂'.toFun x - w₁'.toFun x := by + funext x; ring + rwa [hfun] at h + -- the four core applications + have hA : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₁.toFun x ≤ m₀ + K := + hcore' w₁ w₂ hw1meas hw2meas hmatch m₀ E₀ hE₀ hmed12 (fun k hk => hlevel m₀ k hk) + have hB : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₂.toFun x ≤ m₀ + K := + hcore' w₂ w₁ hw2meas hw1meas hmatch21 m₀ E₀ hE₀ + (by rw [add_comm]; exact hmed12) (fun k hk => le_sqrt_add_comm (hlevel m₀ k hk)) + have hC : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₁'.toFun x ≤ -m₀ + K := + hcore' w₁' w₂' hw1'meas hw2'meas hmatch' (-m₀) E₀ hE₀ hmed12' + (fun k hk => hlevel' (-m₀) k hk) + have hD : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₂'.toFun x ≤ -m₀ + K := + hcore' w₂' w₁' hw2'meas hw1'meas hmatch21' (-m₀) E₀ hE₀ + (by rw [add_comm]; exact hmed12') (fun k hk => le_sqrt_add_comm (hlevel' (-m₀) k hk)) + -- assemble the two-sided bounds + refine ⟨2 * Real.sqrt d * Cd, m₀, by positivity, ?_, ?_⟩ + · -- bound for `v` + have hKeq : (2 * Real.sqrt d * Cd) * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q) + = K := by rw [hK_def, hE0_def, hM2_def]; ring + rw [hKeq] + filter_upwards [hA, hC, hw1ae, hw1'ae] with x hxA hxC hx1 hx1' + rw [hx1] at hxA + have hx1'' : w₁'.toFun x = -v.toFun x + (1 / 2 : ℝ) * vecDot p x := by + rw [hx1']; simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hx1''] at hxC + rw [abs_le]; constructor <;> linarith + · -- bound for `v*` + have hKeq : (2 * Real.sqrt d * Cd) * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q) + = K := by rw [hK_def, hE0_def, hM2_def]; ring + rw [hKeq] + filter_upwards [hB, hD, hw2ae, hw2'ae] with x hxB hxD hx2 hx2' + rw [hx2] at hxB + have hx2'' : w₂'.toFun x = vstar.toFun x - (1 / 2 : ℝ) * vecDot p x := by + rw [hx2']; simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hx2''] at hxD + rw [abs_le]; constructor <;> linarith + +/-- **Uniform coupled Stampacchia estimate (Prop 3.3, constant-outside form).** + +Identical to `coupled_stampacchia` but with the dimensional constant `Cd` +quantified *outside* all field data. The De Giorgi core's constant is already +uniform (`deGiorgi_one_sided_core` has the shape `∃ Cd, ∀ …`), so we obtain it +once at the top and then quantify over the coupled weak-form data; the body is the +same four core applications as `coupled_stampacchia`. Consumed by the uniform +per-core energy bound. -/ +theorem coupled_stampacchia_uniform (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} {Θ : ℝ} {a : CoeffField d} + (_hEll : IsEllipticFieldOn 1 Θ (cubeSet (originCube d m)) a) {p q : Vec d} + {v vstar : H1Function (openCubeSet (originCube d m))} + (_hCWF : CoupledWeakForm a (openCubeSet (originCube d m)) q v vstar) + (_htrace : MemH10 (openCubeSet (originCube d m)) + (fun x => v.toFun x + vstar.toFun x - vecDot p x)), + ∃ c : ℝ, + (∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |v.toFun x - (1 / 2 : ℝ) * vecDot p x - c| + ≤ Cd * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q)) ∧ + (∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), + |vstar.toFun x - (1 / 2 : ℝ) * vecDot p x + c| + ≤ Cd * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q)) := by + classical + -- obtain the uniform De Giorgi core constant ONCE, before quantifying field data + obtain ⟨Cd, hCd0, hcore⟩ := deGiorgi_one_sided_core (d := d) hd + refine ⟨2 * Real.sqrt d * Cd, by positivity, ?_⟩ + intro m Θ a hEll p q v vstar hCWF htrace + have : NeZero d := ⟨by omega⟩ + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := + isFiniteMeasure_openCubeSet_originCube (d := d) m + have hUbcd : IsOpenBoundedConvexDomain (openCubeSet (originCube d m)) := + isOpenBoundedConvexDomain_openCubeSet (originCube d m) + have hUmeas : MeasurableSet (openCubeSet (originCube d m)) := + measurableSet_openCubeSet (originCube d m) + have hEllO : IsEllipticFieldOn 1 Θ (openCubeSet (originCube d m)) a := + hEll.mono hUmeas (openCubeSet_subset_cubeSet (originCube d m)) + have h3pos : (0 : ℝ) < (3 : ℝ) ^ m := by positivity + have hΘ : 0 ≤ Θ := by + have hmem0 : (0 : Vec d) ∈ cubeSet (originCube d m) := by + rw [mem_cubeSet_originCube_iff] + intro i; refine ⟨by simp; linarith, by simp; linarith⟩ + exact le_trans zero_le_one (hEll.2 (0 : Vec d) hmem0).2.1 + set M2 : ℝ := Θ * vecNormSq p + vecNormSq q with hM2_def + have hM2 : 0 ≤ M2 := add_nonneg (mul_nonneg hΘ (vecNormSq_nonneg p)) (vecNormSq_nonneg q) + set E₀ : ℝ := 2 * Real.sqrt d * Real.sqrt M2 with hE0_def + have hE₀ : 0 ≤ E₀ := by rw [hE0_def]; positivity + obtain ⟨w₁, w₂, hw1meas, hw2meas, hw1ae, hw2ae, hmatch, hlevel⟩ := + coupled_levelEnergy hUbcd hΘ hEllO hCWF htrace + have hCWF' : CoupledWeakForm a (openCubeSet (originCube d m)) (-q) (-v) (-vstar) := + coupledWeakForm_neg hCWF + have htrace' : MemH10 (openCubeSet (originCube d m)) + (fun x => (-v).toFun x + (-vstar).toFun x - vecDot (-p) x) := by + have hfun : (fun x => (-v).toFun x + (-vstar).toFun x - vecDot (-p) x) + = (fun x => -(v.toFun x + vstar.toFun x - vecDot p x)) := by + funext x + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hfun]; exact memH10_neg htrace + obtain ⟨w₁', w₂', hw1'meas, hw2'meas, hw1'ae, hw2'ae, hmatch', hlevel'⟩ := + coupled_levelEnergy hUbcd hΘ hEllO hCWF' htrace' + obtain ⟨m₀, hup, hlow⟩ := + exists_two_function_median (μ := volumeMeasureOn (openCubeSet (originCube d m))) + hw1meas.aemeasurable hw2meas.aemeasurable + have hset := openCubeSet_originCube_eq_axisCube (d := d) m + have hcore' := hcore (fun _ => (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m) ((3 : ℝ) ^ m) h3pos + rw [← hset] at hcore' + have hμconv : ∀ (w : Vec d → ℝ), Measurable w → ∀ t : ℝ, + (volumeMeasureOn (openCubeSet (originCube d m))) {x | t < w x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ t < w x} := by + intro w hw t + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply + (measurableSet_lt measurable_const hw)] + congr 1; ext x; simp only [Set.mem_inter_iff, Set.mem_ofPred_eq]; tauto + have hμconv_lt : ∀ (w : Vec d → ℝ), Measurable w → ∀ t : ℝ, + (volumeMeasureOn (openCubeSet (originCube d m))) {x | w x < t} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w x < t} := by + intro w hw t + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply + (measurableSet_lt hw measurable_const)] + congr 1; ext x; simp only [Set.mem_inter_iff, Set.mem_ofPred_eq]; tauto + have hunivvol : + (volumeMeasureOn (openCubeSet (originCube d m))) Set.univ + = volume (openCubeSet (originCube d m)) := by + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply MeasurableSet.univ, Set.univ_inter] + have hvol_ae : ∀ (f g : Vec d → ℝ), f =ᵐ[volume.restrict (openCubeSet (originCube d m))] g → + ∀ t : ℝ, volume {x | x ∈ openCubeSet (originCube d m) ∧ t < f x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ t < g x} := by + intro f g hfg t + refine measure_congr ?_ + have hfg' : ∀ᵐ x ∂volume, x ∈ openCubeSet (originCube d m) → f x = g x := + (MeasureTheory.ae_restrict_iff' hUmeas).1 hfg + filter_upwards [hfg'] with x hx + simp only [eq_iff_iff] + constructor <;> rintro ⟨hxU, hlt⟩ <;> exact ⟨hxU, by rw [hx hxU] at *; assumption⟩ + simp only [vecNormSq_neg] at hlevel' + have hw1'neg : w₁'.toFun =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => -w₁.toFun x) := by + filter_upwards [hw1'ae, hw1ae] with x hx' hx + rw [hx'] + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left] + rw [hx]; ring + have hw2'neg : w₂'.toFun =ᵐ[volume.restrict (openCubeSet (originCube d m))] + (fun x => -w₂.toFun x) := by + filter_upwards [hw2'ae, hw2ae] with x hx' hx + rw [hx'] + simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left] + rw [hx]; ring + set K : ℝ := Cd * (3 : ℝ) ^ m * E₀ with hK_def + have hmed12 : volume {x | x ∈ openCubeSet (originCube d m) ∧ m₀ < w₁.toFun x} + + volume {x | x ∈ openCubeSet (originCube d m) ∧ m₀ < w₂.toFun x} + ≤ volume (openCubeSet (originCube d m)) := by + rw [← hμconv w₁.toFun hw1meas m₀, ← hμconv w₂.toFun hw2meas m₀, ← hunivvol]; exact hup + have hmed12' : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₁'.toFun x} + + volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₂'.toFun x} + ≤ volume (openCubeSet (originCube d m)) := by + have e1 : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₁'.toFun x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w₁.toFun x < m₀} := by + rw [hvol_ae w₁'.toFun (fun x => -w₁.toFun x) hw1'neg (-m₀)] + congr 1; ext x; simp only [Set.mem_ofPred_eq] + constructor <;> rintro ⟨h1, h2⟩ <;> exact ⟨h1, by linarith⟩ + have e2 : volume {x | x ∈ openCubeSet (originCube d m) ∧ -m₀ < w₂'.toFun x} + = volume {x | x ∈ openCubeSet (originCube d m) ∧ w₂.toFun x < m₀} := by + rw [hvol_ae w₂'.toFun (fun x => -w₂.toFun x) hw2'neg (-m₀)] + congr 1; ext x; simp only [Set.mem_ofPred_eq] + constructor <;> rintro ⟨h1, h2⟩ <;> exact ⟨h1, by linarith⟩ + rw [e1, e2, ← hμconv_lt w₁.toFun hw1meas m₀, ← hμconv_lt w₂.toFun hw2meas m₀, ← hunivvol] + exact hlow + have hmatch21 : MemH10 (openCubeSet (originCube d m)) (fun x => w₂.toFun x - w₁.toFun x) := by + have h := memH10_neg hmatch + have hfun : (fun x => -(w₁.toFun x - w₂.toFun x)) = fun x => w₂.toFun x - w₁.toFun x := by + funext x; ring + rwa [hfun] at h + have hmatch21' : MemH10 (openCubeSet (originCube d m)) (fun x => w₂'.toFun x - w₁'.toFun x) := by + have h := memH10_neg hmatch' + have hfun : (fun x => -(w₁'.toFun x - w₂'.toFun x)) = fun x => w₂'.toFun x - w₁'.toFun x := by + funext x; ring + rwa [hfun] at h + have hA : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₁.toFun x ≤ m₀ + K := + hcore' w₁ w₂ hw1meas hw2meas hmatch m₀ E₀ hE₀ hmed12 (fun k hk => hlevel m₀ k hk) + have hB : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₂.toFun x ≤ m₀ + K := + hcore' w₂ w₁ hw2meas hw1meas hmatch21 m₀ E₀ hE₀ + (by rw [add_comm]; exact hmed12) (fun k hk => le_sqrt_add_comm (hlevel m₀ k hk)) + have hC : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₁'.toFun x ≤ -m₀ + K := + hcore' w₁' w₂' hw1'meas hw2'meas hmatch' (-m₀) E₀ hE₀ hmed12' + (fun k hk => hlevel' (-m₀) k hk) + have hD : ∀ᵐ x ∂(volumeMeasureOn (openCubeSet (originCube d m))), w₂'.toFun x ≤ -m₀ + K := + hcore' w₂' w₁' hw2'meas hw1'meas hmatch21' (-m₀) E₀ hE₀ + (by rw [add_comm]; exact hmed12') (fun k hk => le_sqrt_add_comm (hlevel' (-m₀) k hk)) + refine ⟨m₀, ?_, ?_⟩ + · have hKeq : (2 * Real.sqrt d * Cd) * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q) + = K := by rw [hK_def, hE0_def, hM2_def]; ring + rw [hKeq] + filter_upwards [hA, hC, hw1ae, hw1'ae] with x hxA hxC hx1 hx1' + rw [hx1] at hxA + have hx1'' : w₁'.toFun x = -v.toFun x + (1 / 2 : ℝ) * vecDot p x := by + rw [hx1']; simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hx1''] at hxC + rw [abs_le]; constructor <;> linarith + · have hKeq : (2 * Real.sqrt d * Cd) * (3 : ℝ) ^ m * Real.sqrt (Θ * vecNormSq p + vecNormSq q) + = K := by rw [hK_def, hE0_def, hM2_def]; ring + rw [hKeq] + filter_upwards [hB, hD, hw2ae, hw2'ae] with x hxB hxD hx2 hx2' + rw [hx2] at hxB + have hx2'' : w₂'.toFun x = vstar.toFun x - (1 / 2 : ℝ) * vecDot p x := by + rw [hx2']; simp only [Homogenization.H1Function.neg_toFun, vecDot_neg_left]; ring + rw [hx2''] at hxD + rw [abs_le]; constructor <;> linarith + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Admissibility.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Admissibility.lean new file mode 100644 index 0000000000..17c28488d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Admissibility.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real + +/-! +# The De Giorgi admissibility algebra + +The scalar inequality feeding `deGiorgi_levelVolume_tendsto_zero`'s `hKcond`. +With `α = q/2`, `β = α − 1`, `B = 4^α`, `Crec = C_F²·E₀²`, `K = Cd·L·E₀`, +`Ld = L^d`, and the critical-exponent relation `d·β = 2·α` (equivalently +`q = 2d/(d−2)`), the powers of `L` and `E₀` cancel and the admissibility +condition reduces to a choice of `Cd ≥ C_F·B^{1/(2β)}`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped NNReal + +/-- **Admissibility algebra.** Given the critical relation `(d:ℝ)·β = 2·α` +(with `α, β > 0`, `β = α − 1`), `B = 4^α`, and `Cd ≥ C_F·B^{1/(2β)}` with +`Cd > 0`, `C_F ≥ 0`, `E₀ > 0`, `L > 0`, the De Giorgi leading constant is +admissible: +`((C_F²·E₀²)/(Cd·L·E₀)²)^α · B · (L^d)^β ≤ B^{−(1/β)}`. -/ +theorem deGiorgi_admissible + {d : ℕ} {C_F E₀ L Cd α β : ℝ} + (hα : 0 < α) (hβ : 0 < β) (hβeq : β = α - 1) (hB : (d : ℝ) * β = 2 * α) + (hCF : 0 ≤ C_F) (hE₀ : 0 < E₀) (hL : 0 < L) (hCd : 0 < Cd) + (hchoice : C_F * ((4 : ℝ) ^ α) ^ (1 / (2 * β)) ≤ Cd) : + (((C_F ^ 2 * E₀ ^ 2) / (Cd * L * E₀) ^ 2) ^ α) * ((4 : ℝ) ^ α) * ((L ^ d) ^ β) + ≤ ((4 : ℝ) ^ α) ^ (-(1 / β)) := by + set B : ℝ := (4 : ℝ) ^ α with hBdef + have hBpos : 0 < B := Real.rpow_pos_of_pos (by norm_num) _ + -- Abbreviate `t := C_F / Cd`. + set t : ℝ := C_F / Cd with htdef + have ht0 : 0 ≤ t := div_nonneg hCF hCd.le + -- Step 1: `Crec/K² = t² / L²`. + have hK2 : (Cd * L * E₀) ^ 2 = Cd ^ 2 * L ^ 2 * E₀ ^ 2 := by ring + have hCd0 : Cd ≠ 0 := hCd.ne' + have hL0 : L ≠ 0 := hL.ne' + have hE00 : E₀ ≠ 0 := hE₀.ne' + have hstep1 : (C_F ^ 2 * E₀ ^ 2) / (Cd * L * E₀) ^ 2 = t ^ 2 / L ^ 2 := by + rw [hK2, htdef, div_pow] + field_simp + rw [hstep1] + -- Step 2: `(t²/L²)^α = t^{2α} · L^{-2α}`. + have hL2 : (0 : ℝ) ≤ L ^ 2 := by positivity + have ht2 : (0 : ℝ) ≤ t ^ 2 := by positivity + have hdiv : (t ^ 2 / L ^ 2) ^ α = (t ^ 2) ^ α / (L ^ 2) ^ α := + Real.div_rpow ht2 hL2 α + -- `(t²)^α = t^{2α}`, `(L²)^α = L^{2α}`. + have hLd : ((L ^ d) ^ β) = L ^ ((d : ℝ) * β) := by + rw [← Real.rpow_natCast L d, ← Real.rpow_mul hL.le] + have hL2a : ((L ^ 2) ^ α) = L ^ (2 * α) := by + rw [← Real.rpow_natCast L 2, ← Real.rpow_mul hL.le] + norm_num + have ht2a : ((t ^ 2) ^ α) = t ^ (2 * α) := by + rw [← Real.rpow_natCast t 2, ← Real.rpow_mul ht0] + norm_num + -- Assemble the `L`-cancellation. + rw [hdiv, hLd, hL2a, ht2a, hB] + -- Goal: `t^{2α} / L^{2α} * B * L^{2α} ≤ B^{−1/β}`. + have hLα_pos : (0 : ℝ) < L ^ (2 * α) := Real.rpow_pos_of_pos hL _ + have hcollapse : + t ^ (2 * α) / L ^ (2 * α) * B * L ^ (2 * α) = B * t ^ (2 * α) := by + have hne : L ^ (2 * α) ≠ 0 := hLα_pos.ne' + field_simp + rw [hcollapse] + -- Step 3: `t ≤ B^{-1/(2β)}`, hence `B · t^{2α} ≤ B^{-1/β}`. + have hBpow : (0 : ℝ) < B ^ (1 / (2 * β)) := Real.rpow_pos_of_pos hBpos _ + have ht_le : t ≤ B ^ (-(1 / (2 * β))) := by + have h1 : t * B ^ (1 / (2 * β)) ≤ 1 := by + rw [htdef, div_mul_eq_mul_div, div_le_one hCd] + exact hchoice + rw [Real.rpow_neg hBpos.le, ← one_div] + exact (le_div_iff₀ hBpow).mpr h1 + -- Raise to `2α`. + have h2α : (0 : ℝ) < 2 * α := by positivity + have htpow : t ^ (2 * α) ≤ (B ^ (-(1 / (2 * β)))) ^ (2 * α) := + Real.rpow_le_rpow ht0 ht_le h2α.le + have hRHSpow : (B ^ (-(1 / (2 * β)))) ^ (2 * α) = B ^ (-(1 / β) - 1) := by + rw [← Real.rpow_mul hBpos.le] + congr 1 + -- `-(1/(2β)) · 2α = -(1/β) - 1`, using `α = β + 1`. + have hαβ : α = β + 1 := by rw [hβeq]; ring + rw [hαβ] + field_simp + ring + calc B * t ^ (2 * α) + ≤ B * (B ^ (-(1 / (2 * β)))) ^ (2 * α) := + mul_le_mul_of_nonneg_left htpow hBpos.le + _ = B * B ^ (-(1 / β) - 1) := by rw [hRHSpow] + _ = B ^ (1 + (-(1 / β) - 1)) := by + rw [Real.rpow_add hBpos, Real.rpow_one] + _ = B ^ (-(1 / β)) := by congr 1; ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/DeGiorgiCore.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/DeGiorgiCore.lean new file mode 100644 index 0000000000..258b72c189 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/DeGiorgiCore.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Iteration +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.LevelRecursion +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.Stampacchia.Admissibility +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding + +/-! +# The generic one-sided De Giorgi core + +The purely analytic heart of the coupled Stampacchia estimate on an axis cube +`U = axisCube z L`. Given two `H¹` functions `w₁, w₂` sharing a boundary trace, +a median `m₀` with the one-sided median inequality, and the level-energy estimate +in `F4`-RHS shape, the essential supremum of `w₁ − m₀` over `U` is bounded by +`C_d · L · E₀`. + +The proof combines the truncation toolbox (`D1`, `D4`), the matched-pair Sobolev +inequality (`F4`), Chebyshev (`real_chebyshev_level`), the squared level recursion +(`sq_level_recursion_of_le`), the admissibility algebra (`deGiorgi_admissible`) +and the iteration engine (`deGiorgi_levelVolume_tendsto_zero`). +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal NNReal BigOperators + +/-- **Generic one-sided De Giorgi core.** + +There is a dimensional constant `Cd ≥ 0` such that: for every axis cube +`U = axisCube z L` of side `L > 0`, every pair `w₁ w₂ : H1Function U` with +measurable representatives sharing a trace (`w₁ − w₂ ∈ H¹₀`), every median level +`m₀` obeying the one-sided median inequality, and every level-energy bound with +constant `E₀ ≥ 0` in `F4`-RHS shape, one has `w₁ ≤ m₀ + Cd·L·E₀` almost +everywhere on `U`. -/ +theorem deGiorgi_one_sided_core {d : ℕ} (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ (z : Vec d) (L : ℝ), 0 < L → + ∀ (w₁ w₂ : H1Function (axisCube z L)), + Measurable w₁.toFun → Measurable w₂.toFun → + MemH10 (axisCube z L) (fun x => w₁.toFun x - w₂.toFun x) → + ∀ (m₀ E₀ : ℝ), 0 ≤ E₀ → + MeasureTheory.volume {x | x ∈ axisCube z L ∧ m₀ < w₁.toFun x} + + MeasureTheory.volume {x | x ∈ axisCube z L ∧ m₀ < w₂.toFun x} + ≤ MeasureTheory.volume (axisCube z L) → + (∀ k : ℝ, 0 ≤ k → + (∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}.indicator + (fun x => w₁.grad x i)) 2 (volumeMeasureOn (axisCube z L))).toReal) + + (∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}.indicator + (fun x => w₂.grad x i)) 2 (volumeMeasureOn (axisCube z L))).toReal) + ≤ E₀ * Real.sqrt + ((MeasureTheory.volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (MeasureTheory.volume + {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal)) → + ∀ᵐ x ∂(volumeMeasureOn (axisCube z L)), w₁.toFun x ≤ m₀ + Cd * L * E₀ := by + classical + have : NeZero d := ⟨by omega⟩ + -- Sobolev constants (dimensional). + obtain ⟨C_F, hC_F0, hF⟩ := matchedPair_sobolev hd + obtain ⟨CE, hCEpos, hEmb⟩ := cube_sobolev_embedding hd + -- Exponent bookkeeping. + set p : ℝ≥0∞ := (twoStar d : ℝ≥0∞) with hp_def + have hdR : (2 : ℝ) < (d : ℝ) := by exact_mod_cast (by omega : 2 < d) + have hd2pos : (0 : ℝ) < (d : ℝ) - 2 := by linarith + have hp_ne_top : p ≠ ⊤ := by rw [hp_def]; exact ENNReal.coe_ne_top + have h2led : (2 : ℝ≥0) ≤ (d : ℝ≥0) := by exact_mod_cast (by omega : 2 ≤ d) + have hq_val : p.toReal = 2 * (d : ℝ) / ((d : ℝ) - 2) := by + rw [hp_def, ENNReal.coe_toReal, twoStar, NNReal.coe_div, NNReal.coe_sub h2led, + NNReal.coe_mul] + norm_num + have hq_pos : 0 < p.toReal := by rw [hq_val]; positivity + have hp_ne_zero : p ≠ 0 := fun h => by rw [h] at hq_pos; simp at hq_pos + -- Real exponents `α = q/2`, `β = α − 1`, `γ = 2/q`, `B = 4^α`. + set q : ℝ := p.toReal with hq_def + have hqne : q ≠ 0 := hq_pos.ne' + set α : ℝ := q / 2 with hα_def + set β : ℝ := α - 1 with hβ_def + set γ : ℝ := 2 / q with hγ_def + set B : ℝ := (4 : ℝ) ^ α with hB_def + have hq2 : 2 < q := by rw [hq_val, lt_div_iff₀ hd2pos]; linarith + have hα1 : 1 < α := by rw [hα_def]; linarith + have hαpos : 0 < α := lt_trans one_pos hα1 + have hβpos : 0 < β := by rw [hβ_def]; linarith + have hγα : γ * α = 1 := by + rw [hγ_def, hα_def]; field_simp + have hdβ : (d : ℝ) * β = 2 * α := by + rw [hβ_def, hα_def, hq_val]; field_simp; ring + have hBpos : 0 < B := by rw [hB_def]; exact Real.rpow_pos_of_pos (by norm_num) _ + -- The final dimensional constant. + set Cd : ℝ := C_F * B ^ (1 / (2 * β)) + 1 with hCd_def + have hCd_pos : 0 < Cd := by + rw [hCd_def] + have : 0 ≤ C_F * B ^ (1 / (2 * β)) := + mul_nonneg hC_F0 (Real.rpow_nonneg hBpos.le _) + linarith + refine ⟨Cd, hCd_pos.le, ?_⟩ + intro z L hL w₁ w₂ hw₁meas hw₂meas hmatch m₀ E₀ hE₀ hmedian hlevel + -- Domain facts (spelled out to keep defeq with `hF`/`hmatch`). + have hUdom : IsOpenBoundedConvexDomain (axisCube z L) := + isOpenBoundedConvexDomain_axisCube z L + have hUmeas : MeasurableSet (axisCube z L) := (isOpen_axisCube z L).measurableSet + have hμfinI : IsFiniteMeasure (volumeMeasureOn (axisCube z L)) := + hUdom.isBoundedDomain.isFiniteMeasure_restrict_volume + have hab : (z : Vec d) ≤ fun i => z i + L := fun i => le_add_of_nonneg_right hL.le + have hVolU_top : volume (axisCube z L) ≠ ⊤ := by + rw [axisCube, Real.volume_pi_Ioo] + exact ENNReal.prod_ne_top fun i _ => ENNReal.ofReal_ne_top + have hVolU_toReal : (volume (axisCube z L)).toReal = L ^ d := by + rw [axisCube, Real.volume_pi_Ioo_toReal hab, + show (fun i => (z i + L) - z i) = (fun _ : Fin d => L) from by funext i; ring, + Finset.prod_const] + simp + have hSub_top : ∀ (S : Set (Vec d)), S ⊆ axisCube z L → volume S ≠ ⊤ := + fun S hSU => ne_top_of_le_ne_top hVolU_top (measure_mono hSU) + have hμvol : ∀ S : Set (Vec d), S ⊆ axisCube z L → + (volumeMeasureOn (axisCube z L)) S = volume S := by + intro S hSU + show (volume.restrict (axisCube z L)) S = volume S + rw [Measure.restrict_apply' hUmeas, Set.inter_eq_left.mpr hSU] + -- Finiteness of the critical-exponent norm via the Sobolev embedding (E1). + have hfin_2star : ∀ (u : H1Function (axisCube z L)), + eLpNorm u.toFun p (volumeMeasureOn (axisCube z L)) ≠ ⊤ := by + intro u + have hEu := hEmb z L hL u + have hgrad_ne : ∀ i : Fin d, + eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L)) ≠ ⊤ := + fun i => (u.gradMemL2 i).eLpNorm_lt_top.ne + have hval_ne : eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L)) ≠ ⊤ := + u.memL2.eLpNorm_lt_top.ne + have hRHS_ne : + (CE : ℝ≥0∞) * ((∑ i : Fin d, + eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))) ≠ ⊤ := + ENNReal.mul_ne_top ENNReal.coe_ne_top + (ENNReal.add_ne_top.2 + ⟨(ENNReal.sum_lt_top.2 fun i _ => (hgrad_ne i).lt_top).ne, + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hval_ne⟩) + exact (lt_of_le_of_lt hEu hRHS_ne.lt_top).ne + -- The truncation package: `F4` gives the Sobolev level bound for each `k ≥ 0`. + have htrunc : ∀ k : ℝ, 0 ≤ k → ∃ (fk gk : H1Function (axisCube z L)), + fk.toFun = (fun x => max (w₁.toFun x - (m₀ + k)) 0) ∧ + gk.toFun = (fun x => max (w₂.toFun x - (m₀ + k)) 0) ∧ + (eLpNorm fk.toFun p (volumeMeasureOn (axisCube z L))).toReal + + (eLpNorm gk.toFun p (volumeMeasureOn (axisCube z L))).toReal + ≤ C_F * E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) := by + intro k hk + obtain ⟨fk, hfk_tf, hfk_grad⟩ := exists_h1_max_sub_const hUdom w₁ (m₀ + k) + obtain ⟨gk, hgk_tf, hgk_grad⟩ := exists_h1_max_sub_const hUdom w₂ (m₀ + k) + refine ⟨fk, gk, hfk_tf, hgk_tf, ?_⟩ + have hfk_meas : Measurable fk.toFun := by + rw [hfk_tf]; exact (hw₁meas.sub measurable_const).max measurable_const + have hgk_meas : Measurable gk.toFun := by + rw [hgk_tf]; exact (hw₂meas.sub measurable_const).max measurable_const + have hmatch_fg : MemH10 (axisCube z L) (fun x => fk.toFun x - gk.toFun x) := by + have hfun_eq : (fun x => fk.toFun x - gk.toFun x) + = (fun x => max (w₁.toFun x - (m₀ + k)) 0 - max (w₂.toFun x - (m₀ + k)) 0) := by + funext x; rw [hfk_tf, hgk_tf] + rw [hfun_eq]; exact memH10_max_sub_matched hUdom w₁ w₂ hmatch (m₀ + k) + have hmaxne : ∀ (w : ℝ), (max (w - (m₀ + k)) 0 ≠ 0) ↔ m₀ + k < w := by + intro w; rw [ne_eq, max_eq_right_iff, not_le]; constructor <;> intro h <;> linarith + have hset1 : {x | x ∈ axisCube z L ∧ fk.toFun x ≠ 0} + = {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x} := by + ext x; simp only [Set.mem_ofPred_eq, hfk_tf] + exact and_congr_right fun _ => hmaxne (w₁.toFun x) + have hset2 : {x | x ∈ axisCube z L ∧ gk.toFun x ≠ 0} + = {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x} := by + ext x; simp only [Set.mem_ofPred_eq, hgk_tf] + exact and_congr_right fun _ => hmaxne (w₂.toFun x) + have hzero : volume {x | x ∈ axisCube z L ∧ fk.toFun x ≠ 0} + + volume {x | x ∈ axisCube z L ∧ gk.toFun x ≠ 0} ≤ volume (axisCube z L) := by + rw [hset1, hset2] + refine le_trans (add_le_add (measure_mono ?_) (measure_mono ?_)) hmedian + · intro x hx; exact ⟨hx.1, by have := hx.2; linarith⟩ + · intro x hx; exact ⟨hx.1, by have := hx.2; linarith⟩ + have hF4 := hF z L hL fk gk hfk_meas hgk_meas hmatch_fg hzero + have hcongr1 : + (∑ i : Fin d, (eLpNorm (fun x => fk.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) + = ∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}.indicator (fun x => w₁.grad x i)) + 2 (volumeMeasureOn (axisCube z L))).toReal := by + refine Finset.sum_congr rfl (fun i _ => ?_) + congr 1 + refine eLpNorm_congr_ae ?_ + filter_upwards [hfk_grad, ae_restrict_mem hUmeas] with x hgx hxU + show fk.grad x i + = {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}.indicator (fun x => w₁.grad x i) x + rw [hgx] + by_cases hc : m₀ + k < w₁.toFun x + · rw [Set.indicator_of_mem (show x ∈ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_mem + (show x ∈ {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x} from ⟨hxU, hc⟩)] + · rw [Set.indicator_of_notMem (show x ∉ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_notMem + (show x ∉ {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x} from fun h => hc h.2)] + rfl + have hcongr2 : + (∑ i : Fin d, (eLpNorm (fun x => gk.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) + = ∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}.indicator (fun x => w₂.grad x i)) + 2 (volumeMeasureOn (axisCube z L))).toReal := by + refine Finset.sum_congr rfl (fun i _ => ?_) + congr 1 + refine eLpNorm_congr_ae ?_ + filter_upwards [hgk_grad, ae_restrict_mem hUmeas] with x hgx hxU + show gk.grad x i + = {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}.indicator (fun x => w₂.grad x i) x + rw [hgx] + by_cases hc : m₀ + k < w₂.toFun x + · rw [Set.indicator_of_mem (show x ∈ {y | m₀ + k < w₂.toFun y} from hc), + Set.indicator_of_mem + (show x ∈ {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x} from ⟨hxU, hc⟩)] + · rw [Set.indicator_of_notMem (show x ∉ {y | m₀ + k < w₂.toFun y} from hc), + Set.indicator_of_notMem + (show x ∉ {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x} from fun h => hc h.2)] + rfl + rw [hcongr1, hcongr2] at hF4 + calc (eLpNorm fk.toFun p (volumeMeasureOn (axisCube z L))).toReal + + (eLpNorm gk.toFun p (volumeMeasureOn (axisCube z L))).toReal + ≤ C_F * ((∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}.indicator (fun x => w₁.grad x i)) + 2 (volumeMeasureOn (axisCube z L))).toReal) + + ∑ i : Fin d, (eLpNorm + ({x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}.indicator (fun x => w₂.grad x i)) + 2 (volumeMeasureOn (axisCube z L))).toReal) := hF4 + _ ≤ C_F * (E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal)) := + mul_le_mul_of_nonneg_left (hlevel k hk) hC_F0 + _ = C_F * E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) := by ring + -- Chebyshev exponent facts. + have hr0 : (0 : ℝ) ≤ 1 / q := by positivity + have hr1 : (1 : ℝ) / q ≤ 1 := by rw [div_le_one hq_pos]; linarith + -- The geometric level recursion for the combined level volume. + have hrec : ∀ k l : ℝ, 0 ≤ k → k < l → + (l - k) ^ 2 * ((volume {x | x ∈ axisCube z L ∧ m₀ + l < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + l < w₂.toFun x}).toReal) ^ γ + ≤ (C_F ^ 2 * E₀ ^ 2) * ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) := by + intro k l hk hkl + obtain ⟨fk, gk, hfk_tf, hgk_tf, hSob⟩ := htrunc k hk + have hεnn : (0 : ℝ) ≤ l - k := by linarith + have hfk_meas : Measurable fk.toFun := by + rw [hfk_tf]; exact (hw₁meas.sub measurable_const).max measurable_const + have hgk_meas : Measurable gk.toFun := by + rw [hgk_tf]; exact (hw₂meas.sub measurable_const).max measurable_const + have hSsub1 : ∀ x ∈ {x | x ∈ axisCube z L ∧ m₀ + l < w₁.toFun x}, (l - k) ≤ fk.toFun x := by + intro x hx; rw [hfk_tf]; have hxlt : m₀ + l < w₁.toFun x := hx.2 + rw [le_max_iff]; left; linarith + have hSsub2 : ∀ x ∈ {x | x ∈ axisCube z L ∧ m₀ + l < w₂.toFun x}, (l - k) ≤ gk.toFun x := by + intro x hx; rw [hgk_tf]; have hxlt : m₀ + l < w₂.toFun x := hx.2 + rw [le_max_iff]; left; linarith + have hcheb1 := real_chebyshev_level hp_ne_zero hp_ne_top hfk_meas.aestronglyMeasurable + (hfin_2star fk) hεnn hSsub1 + have hcheb2 := real_chebyshev_level hp_ne_zero hp_ne_top hgk_meas.aestronglyMeasurable + (hfin_2star gk) hεnn hSsub2 + rw [hμvol _ (fun x hx => hx.1), ← hq_def] at hcheb1 + rw [hμvol _ (fun x hx => hx.1), ← hq_def] at hcheb2 + have hkey := sq_level_recursion_of_le (ε := l - k) (r := 1 / q) + (a := (volume {x | x ∈ axisCube z L ∧ m₀ + l < w₁.toFun x}).toReal) + (b := (volume {x | x ∈ axisCube z L ∧ m₀ + l < w₂.toFun x}).toReal) hεnn hr0 hr1 + ENNReal.toReal_nonneg ENNReal.toReal_nonneg hcheb1 hcheb2 hSob (by positivity) + have hexp : (2 : ℝ) * (1 / q) = γ := by rw [hγ_def]; ring + have hRsq : (C_F * E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal)) ^ 2 + = (C_F ^ 2 * E₀ ^ 2) * ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) := by + rw [mul_pow, Real.sq_sqrt (by positivity)]; ring + calc (l - k) ^ 2 * ((volume {x | x ∈ axisCube z L ∧ m₀ + l < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + l < w₂.toFun x}).toReal) ^ γ + = (l - k) ^ 2 * ((volume {x | x ∈ axisCube z L ∧ m₀ + l < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + l < w₂.toFun x}).toReal) ^ (2 * (1 / q)) := by + rw [← hexp] + _ ≤ (C_F * E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal)) ^ 2 := hkey + _ = (C_F ^ 2 * E₀ ^ 2) * ((volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) := hRsq + -- Split on `E₀ = 0`. + rcases eq_or_lt_of_le hE₀ with hE0 | hE0pos + · -- `E₀ = 0`: the level energy vanishes, so `w₁ ≤ m₀` a.e. + obtain ⟨f0, g0, hf0_tf, hg0_tf, hSob0⟩ := htrunc 0 le_rfl + have hf0nn : 0 ≤ (eLpNorm f0.toFun p (volumeMeasureOn (axisCube z L))).toReal := + ENNReal.toReal_nonneg + have hg0nn : 0 ≤ (eLpNorm g0.toFun p (volumeMeasureOn (axisCube z L))).toReal := + ENNReal.toReal_nonneg + have hzeroRHS : C_F * E₀ * Real.sqrt + ((volume {x | x ∈ axisCube z L ∧ m₀ + 0 < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + 0 < w₂.toFun x}).toReal) = 0 := by + rw [← hE0]; ring + rw [hzeroRHS] at hSob0 + have hf0z : (eLpNorm f0.toFun p (volumeMeasureOn (axisCube z L))).toReal = 0 := + le_antisymm (by linarith) hf0nn + have hf0eLp : eLpNorm f0.toFun p (volumeMeasureOn (axisCube z L)) = 0 := + (ENNReal.toReal_eq_zero_iff _).mp hf0z |>.resolve_right (hfin_2star f0) + have hf0ae : f0.toFun =ᵐ[volumeMeasureOn (axisCube z L)] 0 := + (eLpNorm_eq_zero_iff f0.memL2.1 hp_ne_zero).mp hf0eLp + filter_upwards [hf0ae] with x hx + simp only [Pi.zero_apply] at hx + rw [hf0_tf] at hx + have hxmax : max (w₁.toFun x - (m₀ + 0)) 0 = 0 := hx + have hle0 : w₁.toFun x - (m₀ + 0) ≤ 0 := by + by_contra h; push Not at h; rw [max_eq_left h.le] at hxmax; linarith + rw [← hE0]; simp only [mul_zero, add_zero]; linarith + · -- `0 < E₀`: run the iteration engine. + set K : ℝ := Cd * L * E₀ with hK_def + have hK_pos : 0 < K := by rw [hK_def]; positivity + have hLd_pos : 0 < (volume (axisCube z L)).toReal := by rw [hVolU_toReal]; positivity + have ha0 : (volume {x | x ∈ axisCube z L ∧ m₀ + deGiorgiLevel K 0 < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + deGiorgiLevel K 0 < w₂.toFun x}).toReal + ≤ (volume (axisCube z L)).toReal := by + rw [deGiorgiLevel_zero] + have hmed' : + volume {x | x ∈ axisCube z L ∧ m₀ + (0 : ℝ) < w₁.toFun x} + + volume {x | x ∈ axisCube z L ∧ m₀ + (0 : ℝ) < w₂.toFun x} + ≤ volume (axisCube z L) := by + rw [show (fun x => x ∈ axisCube z L ∧ m₀ + (0 : ℝ) < w₁.toFun x) + = (fun x => x ∈ axisCube z L ∧ m₀ < w₁.toFun x) from by funext x; rw [add_zero], + show (fun x => x ∈ axisCube z L ∧ m₀ + (0 : ℝ) < w₂.toFun x) + = (fun x => x ∈ axisCube z L ∧ m₀ < w₂.toFun x) from by funext x; rw [add_zero]] + exact hmedian + have hmono := ENNReal.toReal_mono hVolU_top hmed' + rwa [ENNReal.toReal_add (hSub_top _ (fun x hx => hx.1)) (hSub_top _ (fun x hx => hx.1))] + at hmono + have hchoice : C_F * ((4 : ℝ) ^ α) ^ (1 / (2 * β)) ≤ Cd := by + rw [hCd_def, ← hB_def]; linarith + have hKcond : + ((C_F ^ 2 * E₀ ^ 2) / K ^ 2) ^ α * B * ((volume (axisCube z L)).toReal) ^ β + ≤ B ^ (-(1 / β)) := by + rw [hVolU_toReal, hK_def, hB_def] + exact deGiorgi_admissible hαpos hβpos hβ_def hdβ hC_F0 hE0pos hL hCd_pos hchoice + have hlimit := deGiorgi_levelVolume_tendsto_zero + (a := fun k => (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ axisCube z L ∧ m₀ + k < w₂.toFun x}).toReal) + (Ld := (volume (axisCube z L)).toReal) (Crec := C_F ^ 2 * E₀ ^ 2) (K := K) + (α := α) (β := β) (γ := γ) (B := B) + (hnn := fun k => by positivity) (hLd := hLd_pos) (hCrec := by positivity) + (hK := hK_pos) (hα1 := hα1) (hβ := hβ_def) (hγα := hγα) (hB := hB_def) + (ha0 := ha0) (hrec := hrec) (hKcond := hKcond) + set T : Set (Vec d) := {x | x ∈ axisCube z L ∧ m₀ + K < w₁.toFun x} with hT_def + have hT_top : volume T ≠ ⊤ := hSub_top _ (fun x hx => hx.1) + have hT0 : volume T = 0 := by + refine measure_eq_zero_of_toReal_tendsto hT_top ?_ hlimit + intro n + have hTsub : T ⊆ {x | x ∈ axisCube z L ∧ m₀ + deGiorgiLevel K n < w₁.toFun x} := by + intro x hx + refine ⟨hx.1, ?_⟩ + have hlt : deGiorgiLevel K n < K := deGiorgiLevel_lt hK_pos n + have := hx.2; linarith + have h1 : (volume T).toReal + ≤ (volume {x | x ∈ axisCube z L ∧ m₀ + deGiorgiLevel K n < w₁.toFun x}).toReal := + ENNReal.toReal_mono (hSub_top _ (fun x hx => hx.1)) (measure_mono hTsub) + have h2 : (0 : ℝ) + ≤ (volume {x | x ∈ axisCube z L ∧ m₀ + deGiorgiLevel K n < w₂.toFun x}).toReal := + ENNReal.toReal_nonneg + linarith + refine (MeasureTheory.ae_iff).mpr ?_ + have hset : {x | ¬ (w₁.toFun x ≤ m₀ + Cd * L * E₀)} = {x | m₀ + K < w₁.toFun x} := by + ext x; rw [hK_def]; simp only [Set.mem_ofPred_eq, not_le] + rw [hset] + show (volume.restrict (axisCube z L)) {x | m₀ + K < w₁.toFun x} = 0 + rw [Measure.restrict_apply' hUmeas] + have hTeq : {x | m₀ + K < w₁.toFun x} ∩ axisCube z L = T := by + rw [hT_def]; ext x; exact ⟨fun h => ⟨h.2, h.1⟩, fun h => ⟨h.2, h.1⟩⟩ + rw [hTeq]; exact hT0 diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Iteration.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Iteration.lean new file mode 100644 index 0000000000..7052cc78c2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/Iteration.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.IterationLemma +public import Mathlib.MeasureTheory.Measure.Typeclasses.Finite + +/-! +# Generic De Giorgi iteration (level-volume decay) + +This file isolates the purely analytic heart of the coupled Stampacchia estimate: +starting from the geometric *level-recursion* inequality on the combined upper +level volumes + +`(l − k)² · (a l)^{(d−2)/d} ≤ Crec · a k` (for `0 ≤ k < l`), + +the combined level volume `a` tends to `0` along the truncation levels +`k_n := K (1 − 2^{-n})` as soon as the threshold `K` is chosen large enough. + +The statement is fully abstract in the nonnegative "level-volume" function +`a : ℝ → ℝ`; the geometric bookkeeping (`α = d/(d−2)`, `B = 4^α`, +`Y_n = L^{-d} a(k_n)`) reduces the recursion to the toolbox lemma +`iteration_geometric_decay_tendsto_zero`. +-/ + +@[expose] public section + +namespace Homogenization + +open Filter Topology + +/-- The truncation levels `k_n = K (1 − 2^{-n})` used by the De Giorgi iteration. -/ +noncomputable def deGiorgiLevel (K : ℝ) (n : ℕ) : ℝ := K * (1 - (2 : ℝ) ^ (-(n : ℝ))) + +@[simp] theorem deGiorgiLevel_zero (K : ℝ) : deGiorgiLevel K 0 = 0 := by + simp [deGiorgiLevel] + +theorem deGiorgiLevel_nonneg {K : ℝ} (hK : 0 ≤ K) (n : ℕ) : 0 ≤ deGiorgiLevel K n := by + have h2n : (0 : ℝ) < (2 : ℝ) ^ (-(n : ℝ)) := Real.rpow_pos_of_pos (by norm_num) _ + have h2n1 : (2 : ℝ) ^ (-(n : ℝ)) ≤ 1 := by + rw [Real.rpow_neg (by norm_num), inv_le_one_iff₀] + right + exact Real.one_le_rpow (by norm_num) (by positivity) + have : 0 ≤ 1 - (2 : ℝ) ^ (-(n : ℝ)) := by linarith + exact mul_nonneg hK this + +theorem deGiorgiLevel_lt {K : ℝ} (hK : 0 < K) (n : ℕ) : deGiorgiLevel K n < K := by + have h2n : (0 : ℝ) < (2 : ℝ) ^ (-(n : ℝ)) := Real.rpow_pos_of_pos (by norm_num) _ + have : deGiorgiLevel K n = K - K * (2 : ℝ) ^ (-(n : ℝ)) := by + simp only [deGiorgiLevel]; ring + rw [this] + have : 0 < K * (2 : ℝ) ^ (-(n : ℝ)) := by positivity + linarith + +theorem deGiorgiLevel_strictMono {K : ℝ} (hK : 0 < K) : StrictMono (deGiorgiLevel K) := by + intro n m hnm + simp only [deGiorgiLevel] + have hbase : (0 : ℝ) < 2 := by norm_num + have hmono : (2 : ℝ) ^ (-(m : ℝ)) < (2 : ℝ) ^ (-(n : ℝ)) := by + apply Real.rpow_lt_rpow_of_exponent_lt (by norm_num) + have : (n : ℝ) < (m : ℝ) := by exact_mod_cast hnm + linarith + have h2m : (0 : ℝ) < (2 : ℝ) ^ (-(m : ℝ)) := Real.rpow_pos_of_pos hbase _ + nlinarith [hmono, hK] + +/-- The successive gap between De Giorgi levels: `k_{n+1} − k_n = K·2^{-(n+1)}`. -/ +theorem deGiorgiLevel_succ_sub {K : ℝ} (n : ℕ) : + deGiorgiLevel K (n + 1) - deGiorgiLevel K n = K * (2 : ℝ) ^ (-((n : ℝ) + 1)) := by + simp only [deGiorgiLevel] + have h : (2 : ℝ) ^ (-((n : ℝ) + 1)) = (2 : ℝ) ^ (-(n : ℝ)) / 2 := by + rw [show (-((n : ℝ) + 1)) = (-(n : ℝ)) + (-1) by ring, Real.rpow_add (by norm_num)] + rw [Real.rpow_neg_one] + ring + push_cast + rw [h] + ring + +/-- Auxiliary: `(4 : ℝ) ^ y = 2 ^ (2 * y)` for real exponents. -/ +theorem four_rpow_eq (y : ℝ) : (4 : ℝ) ^ y = (2 : ℝ) ^ (2 * y) := by + have h4 : (2 : ℝ) ^ (2 : ℝ) = 4 := by + have e : (2 : ℝ) = ((2 : ℕ) : ℝ) := by norm_num + rw [e, Real.rpow_natCast]; norm_num + rw [← h4, ← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 2)] + +/-- The squared gap between successive De Giorgi levels, in `4`-power form. -/ +theorem deGiorgiLevel_succ_sub_sq {K : ℝ} (n : ℕ) : + (deGiorgiLevel K (n + 1) - deGiorgiLevel K n) ^ 2 + = K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1)) := by + rw [deGiorgiLevel_succ_sub] + rw [mul_pow] + congr 1 + rw [← Real.rpow_natCast ((2 : ℝ) ^ (-((n : ℝ) + 1))) 2, ← Real.rpow_mul (by norm_num), + four_rpow_eq] + congr 1 + push_cast + ring + +/-- **Generic De Giorgi iteration.** If the combined upper-level volume `a` +obeys the geometric level recursion and the threshold `K` is chosen so the +leading iteration constant is admissible, then `a` tends to `0` along the +truncation levels `k_n = K(1 − 2^{-n})`. + +Here `γ = (d−2)/d` is the recursion exponent, `α = d/(d−2) = 1/γ`, `β = α − 1`, +and `B = 4^α`. -/ +theorem deGiorgi_levelVolume_tendsto_zero + {a : ℝ → ℝ} {Ld Crec K α β γ B : ℝ} + (hnn : ∀ k, 0 ≤ a k) + (hLd : 0 < Ld) + (hCrec : 0 ≤ Crec) + (hK : 0 < K) + (hα1 : 1 < α) + (hβ : β = α - 1) + (hγα : γ * α = 1) + (hB : B = (4 : ℝ) ^ α) + (ha0 : a (deGiorgiLevel K 0) ≤ Ld) + (hrec : ∀ k l : ℝ, 0 ≤ k → k < l → + (l - k) ^ 2 * (a l) ^ γ ≤ Crec * a k) + (hKcond : (Crec / K ^ 2) ^ α * B * Ld ^ β ≤ B ^ (-(1 / β))) : + Tendsto (fun n => a (deGiorgiLevel K n)) atTop (𝓝 0) := by + have hαpos : 0 < α := lt_trans one_pos hα1 + have hβpos : 0 < β := by rw [hβ]; linarith + have hBpos : 0 < B := by rw [hB]; exact Real.rpow_pos_of_pos (by norm_num) _ + -- normalized sequence + set Y : ℕ → ℝ := fun n => a (deGiorgiLevel K n) / Ld with hY_def + -- leading iteration constant + set A : ℝ := (Crec / K ^ 2) ^ α * B * Ld ^ β with hA_def + have hYnn : ∀ n, 0 ≤ Y n := fun n => div_nonneg (hnn _) hLd.le + have hY0 : Y 0 ≤ 1 := by + rw [hY_def] + rw [div_le_one hLd] + exact ha0 + have hA0 : 0 ≤ A := by + rw [hA_def] + have h1 : 0 ≤ (Crec / K ^ 2) ^ α := Real.rpow_nonneg (by positivity) _ + have h2 : 0 ≤ Ld ^ β := Real.rpow_nonneg hLd.le _ + positivity + -- the Y-recursion + have hrecY : ∀ n, Y (n + 1) ≤ A * B ^ (n : ℝ) * Y n ^ (1 + β) := by + intro n + have hkn0 : 0 ≤ deGiorgiLevel K n := deGiorgiLevel_nonneg hK.le n + have hknlt : deGiorgiLevel K n < deGiorgiLevel K (n + 1) := + deGiorgiLevel_strictMono hK (Nat.lt_succ_self n) + have H1 := hrec (deGiorgiLevel K n) (deGiorgiLevel K (n + 1)) hkn0 hknlt + -- abbreviations for the two consecutive level volumes + set aN : ℝ := a (deGiorgiLevel K n) with haN + set aN1 : ℝ := a (deGiorgiLevel K (n + 1)) with haN1 + have haNnn : 0 ≤ aN := hnn _ + have haN1nn : 0 ≤ aN1 := hnn _ + -- rewrite the gap square + rw [deGiorgiLevel_succ_sub_sq] at H1 + -- (a_{n+1})^γ ≤ Crec * a_n / (K^2 * 4^{-(n+1)}) + have hgap_pos : 0 < K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1)) := by + have : 0 < (4 : ℝ) ^ (-((n : ℝ) + 1)) := Real.rpow_pos_of_pos (by norm_num) _ + positivity + have hpow_le : aN1 ^ γ ≤ Crec * aN / (K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1))) := by + rw [le_div_iff₀ hgap_pos] + calc aN1 ^ γ * (K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1))) + = K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1)) * aN1 ^ γ := by ring + _ ≤ Crec * aN := H1 + -- raise to power α + have hRHSnn : 0 ≤ Crec * aN / (K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1))) := + div_nonneg (mul_nonneg hCrec haNnn) hgap_pos.le + have hpowα : aN1 ≤ (Crec * aN / (K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1)))) ^ α := by + have hmono := Real.rpow_le_rpow (Real.rpow_nonneg haN1nn γ) hpow_le hαpos.le + rwa [← Real.rpow_mul haN1nn, hγα, Real.rpow_one] at hmono + -- rewrite `Crec*aN/(K²·4^{-(n+1)}) = (Crec/K²)·aN·4^{n+1}` + have hrw : Crec * aN / (K ^ 2 * (4 : ℝ) ^ (-((n : ℝ) + 1))) + = (Crec / K ^ 2) * aN * (4 : ℝ) ^ ((n : ℝ) + 1) := by + rw [Real.rpow_neg (by norm_num)] + have h4pos : (0 : ℝ) < (4 : ℝ) ^ ((n : ℝ) + 1) := Real.rpow_pos_of_pos (by norm_num) _ + field_simp + -- `4^{n+1}` raised to `α` equals `B · Bⁿ` + have hpow4 : ((4 : ℝ) ^ ((n : ℝ) + 1)) ^ α = B * B ^ (n : ℝ) := by + rw [hB, ← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 4), + ← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 4), + ← Real.rpow_add (by norm_num : (0 : ℝ) < 4)] + congr 1 + ring + -- assemble `key : aN1 ≤ (Crec/K²)^α · (B·Bⁿ) · aN^α` + have key : aN1 ≤ (Crec / K ^ 2) ^ α * (B * B ^ (n : ℝ)) * aN ^ α := by + refine le_trans hpowα ?_ + rw [hrw, Real.mul_rpow (by positivity) (by positivity), + Real.mul_rpow (by positivity) haNnn, hpow4] + apply le_of_eq; ring + -- convert `key` into the `Y`-recursion + show aN1 / Ld ≤ A * B ^ (n : ℝ) * (aN / Ld) ^ (1 + β) + have h1β : (1 : ℝ) + β = α := by rw [hβ]; ring + rw [h1β, hA_def, Real.div_rpow haNnn hLd.le] + have hLdα : Ld ^ α = Ld ^ β * Ld := by + rw [hβ, Real.rpow_sub hLd, Real.rpow_one] + field_simp + have hLdβpos : (0 : ℝ) < Ld ^ β := Real.rpow_pos_of_pos hLd _ + have hRHSeq : + (Crec / K ^ 2) ^ α * B * Ld ^ β * B ^ (n : ℝ) * (aN ^ α / Ld ^ α) + = ((Crec / K ^ 2) ^ α * (B * B ^ (n : ℝ)) * aN ^ α) / Ld := by + rw [hLdα] + field_simp + rw [hRHSeq] + have := mul_le_mul_of_nonneg_right key (le_of_lt (by positivity : (0 : ℝ) < Ld⁻¹)) + simpa [div_eq_mul_inv] using this + -- apply the geometric-decay corollary + have hBB : 1 < B := by + rw [hB] + exact (Real.one_lt_rpow_iff_of_pos (by norm_num)).mpr (Or.inl ⟨by norm_num, hαpos⟩) + have hdecay := iteration_geometric_decay_tendsto_zero hY0 hYnn hβpos hBB hA0 + (by rw [hA_def]; exact hKcond) hrecY + -- transfer back to `a` + have : (fun n => a (deGiorgiLevel K n)) = fun n => Ld * Y n := by + funext n; rw [hY_def]; field_simp + rw [this] + have := hdecay.const_mul Ld + simpa using this + +open MeasureTheory in +/-- A finite-measure set whose real mass is dominated by a null-tending sequence +is null. Used to convert the level-volume decay into `|{w > m + K}| = 0`. -/ +theorem measure_eq_zero_of_toReal_tendsto {α : Type*} {m0 : MeasurableSpace α} + {μ : Measure α} {T : Set α} (hT : μ T ≠ ⊤) {b : ℕ → ℝ} + (hle : ∀ n, (μ T).toReal ≤ b n) (hb : Tendsto b atTop (𝓝 0)) : μ T = 0 := by + have hc : (μ T).toReal ≤ 0 := ge_of_tendsto hb (Filter.Eventually.of_forall hle) + have hnn : 0 ≤ (μ T).toReal := ENNReal.toReal_nonneg + have hzero : (μ T).toReal = 0 := le_antisymm hc hnn + exact (ENNReal.toReal_eq_zero_iff _).mp hzero |>.resolve_right hT + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelEnergy.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelEnergy.lean new file mode 100644 index 0000000000..1a049d040f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelEnergy.lean @@ -0,0 +1,668 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.WeakForm +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Coupled.LocalEnergy.Pointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ThetaEllipticity +public import Mathlib.Algebra.Order.Chebyshev + +/-! +# The coupled level-energy estimate + +Derivation of the generic De Giorgi core's *level-energy hypothesis* from the +coupled weak form. Given the representation package `(v, v*)` solving `CoupledWeakForm` +on a cube `U`, the measurable representatives `w₁ ≈ v − ½p·x`, +`w₂ ≈ −v* + ½p·x` share a trace and satisfy, for every median level `m₀` and +every `k ≥ 0`, +`∑ᵢ‖1_{A_k¹}∂ᵢw₁‖₂ + ∑ᵢ‖1_{A_k²}∂ᵢw₂‖₂ ≤ E₀·√(|A_k¹|+|A_k²|)`, +with `E₀ = 2√d·M`, `M = √(Θ|p|²+|q|²)`. + +The core mechanism: testing `CoupledWeakForm` at the truncation pair +`(f_k, −g_k)` (D1/D4) produces the level energy identity +`E_k = ∫_{A¹}(q−½ap)·∇w₁ + ∫_{A²}(½aᵗp)·∇w₂`, which the `s`-metric Young +inequality (`symmForm_young`, `t = 1`) and the coefficient bounds +(`symmPartInv_bulkV_le`, `symmPartInv_bulkVstar_le`) drive to +`E_k ≤ 2M²|A_k|`; then `s ≥ 1` and a Cauchy–Schwarz on the `2d` +coordinate norms give the `√`-shaped conclusion. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal NNReal BigOperators + +noncomputable section + +variable {d : ℕ} + +/-! ## Measurable representative of an `H¹` function -/ + +/-- Every `H¹` function has a **measurable representative**: an `H¹` function with +the same weak gradient and a measurable value function almost everywhere equal to +the original. This is the swap needed to feed the De Giorgi core, whose +truncation toolbox requires `Measurable toFun`. -/ +theorem exists_measurableRep {U : Set (Vec d)} (u : H1Function U) : + ∃ w : H1Function U, Measurable w.toFun ∧ + w.toFun =ᵐ[volume.restrict U] u.toFun ∧ w.grad = u.grad := by + classical + set f : Vec d → ℝ := u.memL2.1.mk u.toFun with hf_def + have hf_meas : Measurable f := u.memL2.1.stronglyMeasurable_mk.measurable + have hae : u.toFun =ᵐ[volume.restrict U] f := u.memL2.1.ae_eq_mk + have hf_memL2 : MemL2On U f := (MeasureTheory.memLp_congr_ae hae).mp u.memL2 + have hf_weak : HasWeakGradientOn U f u.grad := by + intro i φ hφ hφc hφsub + have hu := u.hasWeakGradient i φ hφ hφc hφsub + have hcongr : + ∫ x in U, f x * (fderiv ℝ φ x) (basisVec i) ∂volume + = ∫ x in U, u.toFun x * (fderiv ℝ φ x) (basisVec i) ∂volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hae] with x hx + rw [hx] + rw [hcongr, hu] + refine ⟨⟨f, u.grad, hf_memL2, u.gradMemL2, hf_weak⟩, hf_meas, hae.symm, rfl⟩ + +/-! ## `H¹₀` membership transfers along a.e.-equality -/ + +/-- Uniqueness of weak gradients under a.e.-equal values (open domain). -/ +theorem h1grad_ae_eq_of_toFun_ae_eq {U : Set (Vec d)} (hU : IsOpen U) + {u v : H1Function U} + (huv : u.toFun =ᵐ[volume.restrict U] v.toFun) : + u.grad =ᵐ[volume.restrict U] v.grad := by + have hloc : ∀ (z : H1Function U) (i : Fin d), + MeasureTheory.LocallyIntegrableOn (fun x => z.grad x i) U volume := fun z i => + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((z.gradMemL2 i).locallyIntegrable (by norm_num)) + have hcoord : ∀ i : Fin d, + (fun x => u.grad x i) =ᵐ[volume.restrict U] fun x => v.grad x i := by + intro i + refine HasWeakPartialDerivOn.ae_eq hU (hloc u i) (hloc v i) (u.hasWeakGradient i) ?_ + intro φ hφ hφc hφsub + have hv := v.hasWeakGradient i φ hφ hφc hφsub + have hcongr : + ∫ x in U, u.toFun x * (fderiv ℝ φ x) (basisVec i) ∂volume + = ∫ x in U, v.toFun x * (fderiv ℝ φ x) (basisVec i) ∂volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [huv] with x hx + rw [hx] + rw [hcongr, hv] + have hall : ∀ᵐ x ∂volume.restrict U, ∀ i : Fin d, u.grad x i = v.grad x i := + MeasureTheory.ae_all_iff.mpr hcoord + filter_upwards [hall] with x hx + ext i; exact hx i + +/-- **`H¹₀` a.e.-transfer.** If `h : H¹(U)` is a.e. equal to the value function +of an `H¹₀(U)` witness `W`, then `h.toFun ∈ H¹₀(U)`. (Constant-sequence +application of the `H¹₀`-limit closure.) -/ +theorem memH10_of_ae_eq_h10 {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (h : H1Function U) (W : H10Function U) + (hae : h.toFun =ᵐ[volume.restrict U] W.toH1Function.toFun) : + MemH10 U h.toFun := by + have hgrad : h.grad =ᵐ[volume.restrict U] W.toH1Function.grad := + h1grad_ae_eq_of_toFun_ae_eq hU.isOpen hae + refine memH10_of_tendsto_H1 hU h (fun _ => W.toH1Function) (fun _ => ⟨W, rfl⟩) ?_ ?_ + · have hz : (fun _ : ℕ => eLpNorm (fun x => h.toFun x - W.toH1Function.toFun x) 2 + (volumeMeasureOn U)) = fun _ => 0 := by + funext n + refine (eLpNorm_eq_zero_of_ae_zero ?_) + filter_upwards [hae] with x hx + simp [hx] + rw [hz]; exact tendsto_const_nhds + · intro i + have hz : (fun _ : ℕ => eLpNorm (fun x => h.grad x i - W.toH1Function.grad x i) 2 + (volumeMeasureOn U)) = fun _ => 0 := by + funext n + refine (eLpNorm_eq_zero_of_ae_zero ?_) + have hgi : (fun x => h.grad x i) =ᵐ[volume.restrict U] fun x => W.toH1Function.grad x i := by + filter_upwards [hgrad] with x hx; rw [hx] + filter_upwards [hgi] with x hx + simp [hx] + rw [hz]; exact tendsto_const_nhds + +/-! ## Sign flip of the coupled weak form -/ + +/-- The coupled weak form is odd in `(q, v, v*)`. -/ +theorem coupledWeakForm_neg {a : CoeffField d} {U : Set (Vec d)} {q : Vec d} + {v vstar : H1Function U} (h : CoupledWeakForm a U q v vstar) : + CoupledWeakForm a U (-q) (-v) (-vstar) := by + intro φ φstar hsum + have hbase := h φ φstar hsum + have e1 : ∀ x, vecDot (φ.grad x) (matVecMul (a x) ((-v).grad x)) + = -vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) := by + intro x + simp only [Homogenization.H1Function.neg_grad] + rw [matVecMul_neg, vecDot_neg_right] + have e2 : ∀ x, vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) ((-vstar).grad x)) + = -vecDot (φstar.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)) := by + intro x + simp only [Homogenization.H1Function.neg_grad] + rw [matVecMul_neg, vecDot_neg_right] + have e3 : ∀ x, vecDot (-q) (φ.grad x) = -vecDot q (φ.grad x) := by + intro x; rw [vecDot_neg_left] + simp only [e1, e2, e3] + rw [MeasureTheory.integral_neg, MeasureTheory.integral_neg, MeasureTheory.integral_neg, + ← neg_add] + rw [hbase] + +/-! ## The affine `H¹` function `x ↦ ½ p·x` on a bounded domain -/ + +/-- `x ↦ ½ p·x` as an `H¹` function on a bounded measurable domain, assembled from +the coordinate `H¹` functions. Constant gradient `½ p`. -/ +def affineHalfOn {U : Set (Vec d)} (hUm : MeasurableSet U) (hUb : IsBoundedDomain U) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (p : Vec d) : H1Function U := + ∑ i : Fin d, ((1 / 2 : ℝ) * p i) • H1Function.coordOnIsBoundedDomain hUm hUb i + +@[simp] theorem affineHalfOn_grad {U : Set (Vec d)} (hUm : MeasurableSet U) + (hUb : IsBoundedDomain U) [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (p : Vec d) : + (affineHalfOn hUm hUb p).grad = fun _ => (1 / 2 : ℝ) • p := by + rw [affineHalfOn, H1Function.sum_grad] + funext x + simp only [Homogenization.H1Function.smul_grad, H1Function.coordOnIsBoundedDomain_grad] + funext j + rw [Finset.sum_apply] + simp only [Pi.smul_apply, smul_eq_mul, basisVec, Pi.single_apply, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq Finset.univ j (fun i => (1 / 2 : ℝ) * p i)] + simp + +@[simp] theorem affineHalfOn_toFun {U : Set (Vec d)} (hUm : MeasurableSet U) + (hUb : IsBoundedDomain U) [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (p : Vec d) : + (affineHalfOn hUm hUb p).toFun = fun x => (1 / 2 : ℝ) * vecDot p x := by + rw [affineHalfOn, H1Function.sum_toFun] + funext x + simp only [Homogenization.H1Function.smul_toFun, H1Function.coordOnIsBoundedDomain_apply] + rw [vecDot] + rw [Finset.mul_sum] + refine Finset.sum_congr rfl (fun i _ => ?_) + ring + +/-! ## A subset-restricted indicator integral -/ + +/-- For `A ⊆ U` measurable, integrating `A.indicator f` over `U` is the same as +integrating `f` over `A`. -/ +theorem setIntegral_indicator_subset {U A : Set (Vec d)} + (hAm : MeasurableSet A) (hAU : A ⊆ U) (f : Vec d → ℝ) : + ∫ x in U, A.indicator f x ∂volume = ∫ x in A, f x ∂volume := by + rw [MeasureTheory.integral_indicator hAm, MeasureTheory.Measure.restrict_restrict hAm, + Set.inter_eq_left.mpr hAU] + +/-! ## The level-energy identity -/ + +/-- **Level-energy identity.** Testing the coupled weak form at the truncation +pair `(f_k, −g_k)` yields +`E_k = ∫_{A₁}(q−½ap)·∇w₁ + ∫_{A₂}(½aᵗp)·∇w₂`, where +`E_k = ∫_{A₁}∇w₁·s∇w₁ + ∫_{A₂}∇w₂·s∇w₂` and `Aᵢ = {wᵢ > m₀+k}`. -/ +theorem levelEnergy_identity {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {Θ : ℝ} {a : CoeffField d} (hEll : IsEllipticFieldOn 1 Θ U a) + {p q : Vec d} {v vstar : H1Function U} + (hCWF : CoupledWeakForm a U q v vstar) + {w₁ w₂ : H1Function U} (hw1meas : Measurable w₁.toFun) (hw2meas : Measurable w₂.toFun) + (hw1g : ∀ x, w₁.grad x = v.grad x - (1 / 2 : ℝ) • p) + (hw2g : ∀ x, w₂.grad x = -vstar.grad x + (1 / 2 : ℝ) • p) + (hmatch : MemH10 U (fun x => w₁.toFun x - w₂.toFun x)) + (m₀ k : ℝ) : + (∫ x in {x | x ∈ U ∧ m₀ + k < w₁.toFun x}, + vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) ∂volume) + + (∫ x in {x | x ∈ U ∧ m₀ + k < w₂.toFun x}, + vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) ∂volume) + = (∫ x in {x | x ∈ U ∧ m₀ + k < w₁.toFun x}, + vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x) ∂volume) + + (∫ x in {x | x ∈ U ∧ m₀ + k < w₂.toFun x}, + vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x) ∂volume) := by + classical + have vsubr : ∀ (u y z : Vec d), vecDot u (y - z) = vecDot u y - vecDot u z := by + intro u y z; rw [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, ← sub_eq_add_neg] + have vsubl : ∀ (y z u : Vec d), vecDot (y - z) u = vecDot y u - vecDot z u := by + intro y z u; rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left, ← sub_eq_add_neg] + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + have hUmeas : MeasurableSet U := hU.isOpen.measurableSet + set A₁ : Set (Vec d) := {x | x ∈ U ∧ m₀ + k < w₁.toFun x} with hA1_def + set A₂ : Set (Vec d) := {x | x ∈ U ∧ m₀ + k < w₂.toFun x} with hA2_def + have hA1m : MeasurableSet A₁ := + hUmeas.inter (measurableSet_lt measurable_const hw1meas) + have hA2m : MeasurableSet A₂ := + hUmeas.inter (measurableSet_lt measurable_const hw2meas) + have hA1U : A₁ ⊆ U := fun x hx => hx.1 + have hA2U : A₂ ⊆ U := fun x hx => hx.1 + -- gradient dictionaries + have hvg : ∀ x, v.grad x = w₁.grad x + (1 / 2 : ℝ) • p := by + intro x; rw [hw1g x]; module + have hvsg : ∀ x, vstar.grad x = (1 / 2 : ℝ) • p - w₂.grad x := by + intro x; rw [hw2g x]; module + -- L² memberships + have hw1L2 : MemVectorL2 U w₁.grad := w₁.grad_memVectorL2 + have hw2L2 : MemVectorL2 U w₂.grad := w₂.grad_memVectorL2 + have hsw1 : MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (w₁.grad x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hw1L2 + have hsw2 : MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (w₂.grad x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hw2L2 + have hAp : MemVectorL2 U (fun x => matVecMul (a x) p) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll (memVectorL2_const p) + have hATp : MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) p) := by + have heq : (fun x => matVecMul (matTranspose (a x)) p) + = fun x => matVecMul (symmPart (a x)) p - matVecMul (skewPart (a x)) p := by + funext x; exact matVecMul_matTranspose_eq (a x) p + rw [heq] + exact (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll (memVectorL2_const p)).sub + (memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll (memVectorL2_const p)) + have hqc : MemVectorL2 U (fun _ => q) := memVectorL2_const q + -- IntegrableOn shortcuts over `A₁`, `A₂` + have iE1 : MeasureTheory.IntegrableOn + (fun x => vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x))) A₁ := + (integrableOn_vecDot_of_memVectorL2 hw1L2 hsw1).mono_set hA1U + have iE2 : MeasureTheory.IntegrableOn + (fun x => vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x))) A₂ := + (integrableOn_vecDot_of_memVectorL2 hw2L2 hsw2).mono_set hA2U + have iAp : MeasureTheory.IntegrableOn (fun x => vecDot (w₁.grad x) (matVecMul (a x) p)) A₁ := + (integrableOn_vecDot_of_memVectorL2 hw1L2 hAp).mono_set hA1U + have iATp : MeasureTheory.IntegrableOn + (fun x => vecDot (w₂.grad x) (matVecMul (matTranspose (a x)) p)) A₂ := + (integrableOn_vecDot_of_memVectorL2 hw2L2 hATp).mono_set hA2U + have iq : MeasureTheory.IntegrableOn (fun x => vecDot q (w₁.grad x)) A₁ := + (integrableOn_vecDot_of_memVectorL2 hqc hw1L2).mono_set hA1U + -- truncations `f_k`, `g_k` + obtain ⟨fk, hfk_tf, hfk_grad⟩ := exists_h1_max_sub_const hU w₁ (m₀ + k) + obtain ⟨gk, hgk_tf, hgk_grad⟩ := exists_h1_max_sub_const hU w₂ (m₀ + k) + have hsum : MemH10 U (fun x => fk.toFun x + (-gk).toFun x) := by + have hD4 := memH10_max_sub_matched hU w₁ w₂ hmatch (m₀ + k) + have heq : (fun x => fk.toFun x + (-gk).toFun x) + = (fun x => max (w₁.toFun x - (m₀ + k)) 0 - max (w₂.toFun x - (m₀ + k)) 0) := by + funext x + rw [Homogenization.H1Function.neg_toFun] + show fk.toFun x + -gk.toFun x = _ + rw [congrFun hfk_tf x, congrFun hgk_tf x]; ring + rw [heq]; exact hD4 + have hkey := hCWF fk (-gk) hsum + -- first CWF integral as `∫_{A₁}(∇w₁·s∇w₁ + ½ ∇w₁·ap)` + have hT1 : (∫ x in U, vecDot (fk.grad x) (matVecMul (a x) (v.grad x)) ∂volume) + = ∫ x in A₁, + (vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) + + (1 / 2 : ℝ) * vecDot (w₁.grad x) (matVecMul (a x) p)) ∂volume := by + rw [← setIntegral_indicator_subset hA1m hA1U] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hfk_grad, MeasureTheory.ae_restrict_mem hUmeas] with x hgx hxU + rw [hgx, hvg x] + by_cases hc : m₀ + k < w₁.toFun x + · rw [Set.indicator_of_mem (show x ∈ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_mem (show x ∈ A₁ from ⟨hxU, hc⟩)] + have hs := vecDot_matVecMul_eq_symmPart (a x) (w₁.grad x) + rw [matVecMul_add, matVecMul_smul, vecDot_add_right, vecDot_smul_right, hs] + · rw [Set.indicator_of_notMem (show x ∉ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_notMem (show x ∉ A₁ from fun h => hc h.2)] + simp [vecDot_zero_left] + have hT1split : (∫ x in U, vecDot (fk.grad x) (matVecMul (a x) (v.grad x)) ∂volume) + = (∫ x in A₁, vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) ∂volume) + + (1 / 2 : ℝ) * ∫ x in A₁, vecDot (w₁.grad x) (matVecMul (a x) p) ∂volume := by + rw [hT1, MeasureTheory.integral_add iE1 (iAp.const_mul _), + MeasureTheory.integral_const_mul] + -- second CWF integral as `∫_{A₂}(∇w₂·s∇w₂ − ½ ∇w₂·aᵗp)` + have hT2 : (∫ x in U, vecDot ((-gk).grad x) + (matVecMul (matTranspose (a x)) (vstar.grad x)) ∂volume) + = ∫ x in A₂, + (vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) + - (1 / 2 : ℝ) * vecDot (w₂.grad x) (matVecMul (matTranspose (a x)) p)) ∂volume := by + rw [← setIntegral_indicator_subset hA2m hA2U] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgk_grad, MeasureTheory.ae_restrict_mem hUmeas] with x hgx hxU + rw [Homogenization.H1Function.neg_grad] + show vecDot (-gk.grad x) (matVecMul (matTranspose (a x)) (vstar.grad x)) = _ + rw [hgx, hvsg x] + by_cases hc : m₀ + k < w₂.toFun x + · rw [Set.indicator_of_mem (show x ∈ {y | m₀ + k < w₂.toFun y} from hc), + Set.indicator_of_mem (show x ∈ A₂ from ⟨hxU, hc⟩)] + have hs := vecDot_matVecMul_eq_symmPart (matTranspose (a x)) (w₂.grad x) + rw [symmPart_matTranspose] at hs + rw [matVecMul_sub_vec, matVecMul_smul, vecDot_neg_left, vsubr, vecDot_smul_right, hs] + ring + · rw [Set.indicator_of_notMem (show x ∉ {y | m₀ + k < w₂.toFun y} from hc), + Set.indicator_of_notMem (show x ∉ A₂ from fun h => hc h.2)] + simp [vecDot_zero_left] + have hT2split : (∫ x in U, vecDot ((-gk).grad x) + (matVecMul (matTranspose (a x)) (vstar.grad x)) ∂volume) + = (∫ x in A₂, vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) ∂volume) + - (1 / 2 : ℝ) * ∫ x in A₂, vecDot (w₂.grad x) (matVecMul (matTranspose (a x)) p) ∂volume := by + rw [hT2, MeasureTheory.integral_sub iE2 (iATp.const_mul _), + MeasureTheory.integral_const_mul] + -- RHS integral as `∫_{A₁} q·∇w₁` + have hR : (∫ x in U, vecDot q (fk.grad x) ∂volume) + = ∫ x in A₁, vecDot q (w₁.grad x) ∂volume := by + rw [← setIntegral_indicator_subset hA1m hA1U] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hfk_grad, MeasureTheory.ae_restrict_mem hUmeas] with x hgx hxU + rw [hgx] + by_cases hc : m₀ + k < w₁.toFun x + · rw [Set.indicator_of_mem (show x ∈ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_mem (show x ∈ A₁ from ⟨hxU, hc⟩)] + · rw [Set.indicator_of_notMem (show x ∉ {y | m₀ + k < w₁.toFun y} from hc), + Set.indicator_of_notMem (show x ∉ A₁ from fun h => hc h.2)] + simp [vecDot_zero_right] + rw [hT1split, hT2split, hR] at hkey + -- convert the two target integrals + have hxi1 : (∫ x in A₁, vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x) ∂volume) + = (∫ x in A₁, vecDot q (w₁.grad x) ∂volume) + - (1 / 2 : ℝ) * ∫ x in A₁, vecDot (w₁.grad x) (matVecMul (a x) p) ∂volume := by + have hpt : ∀ x, vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x) + = vecDot q (w₁.grad x) - (1 / 2 : ℝ) * vecDot (w₁.grad x) (matVecMul (a x) p) := by + intro x + rw [vsubl, vecDot_smul_left, vecDot_comm (matVecMul (a x) p) (w₁.grad x)] + simp only [hpt] + rw [MeasureTheory.integral_sub iq (iAp.const_mul _), MeasureTheory.integral_const_mul] + have hxi2 : (∫ x in A₂, vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x) ∂volume) + = (1 / 2 : ℝ) * ∫ x in A₂, vecDot (w₂.grad x) (matVecMul (matTranspose (a x)) p) ∂volume := by + have hpt : ∀ x, vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x) + = (1 / 2 : ℝ) * vecDot (w₂.grad x) (matVecMul (matTranspose (a x)) p) := by + intro x + rw [vecDot_smul_left, vecDot_comm (matVecMul (matTranspose (a x)) p) (w₂.grad x)] + simp only [hpt] + rw [MeasureTheory.integral_const_mul] + rw [hxi1, hxi2] + linarith [hkey] + +/-! ## The squared level-energy bound -/ + +/-- **Squared level-energy bound.** `E_k ≤ 2M²·|A_k|`, obtained from the identity +by the `s`-metric Young inequality (`t = 1`) and the coefficient bounds. -/ +theorem levelEnergy_sq_bound {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {Θ : ℝ} (hΘ : 0 ≤ Θ) {a : CoeffField d} (hEll : IsEllipticFieldOn 1 Θ U a) + {p q : Vec d} {v vstar : H1Function U} + (hCWF : CoupledWeakForm a U q v vstar) + {w₁ w₂ : H1Function U} (hw1meas : Measurable w₁.toFun) (hw2meas : Measurable w₂.toFun) + (hw1g : ∀ x, w₁.grad x = v.grad x - (1 / 2 : ℝ) • p) + (hw2g : ∀ x, w₂.grad x = -vstar.grad x + (1 / 2 : ℝ) • p) + (hmatch : MemH10 U (fun x => w₁.toFun x - w₂.toFun x)) + (m₀ k : ℝ) : + (∫ x in {x | x ∈ U ∧ m₀ + k < w₁.toFun x}, + vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) ∂volume) + + (∫ x in {x | x ∈ U ∧ m₀ + k < w₂.toFun x}, + vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) ∂volume) + ≤ 2 * (Θ * vecNormSq p + vecNormSq q) + * ((volume {x | x ∈ U ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ U ∧ m₀ + k < w₂.toFun x}).toReal) := by + classical + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + have hUmeas : MeasurableSet U := hU.isOpen.measurableSet + have hUtop : volume U ≠ ⊤ := by + have h := measure_ne_top (volumeMeasureOn U) Set.univ + rwa [volumeMeasureOn, MeasureTheory.Measure.restrict_apply MeasurableSet.univ, + Set.univ_inter] at h + set A₁ : Set (Vec d) := {x | x ∈ U ∧ m₀ + k < w₁.toFun x} with hA1_def + set A₂ : Set (Vec d) := {x | x ∈ U ∧ m₀ + k < w₂.toFun x} with hA2_def + have hA1m : MeasurableSet A₁ := hUmeas.inter (measurableSet_lt measurable_const hw1meas) + have hA2m : MeasurableSet A₂ := hUmeas.inter (measurableSet_lt measurable_const hw2meas) + have hA1U : A₁ ⊆ U := fun x hx => hx.1 + have hA2U : A₂ ⊆ U := fun x hx => hx.1 + set M2 : ℝ := Θ * vecNormSq p + vecNormSq q with hM2_def + have hM2 : 0 ≤ M2 := by + rw [hM2_def]; have := vecNormSq_nonneg p; have := vecNormSq_nonneg q; positivity + -- L² memberships + have hw1L2 : MemVectorL2 U w₁.grad := w₁.grad_memVectorL2 + have hw2L2 : MemVectorL2 U w₂.grad := w₂.grad_memVectorL2 + have hsw1 : MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (w₁.grad x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hw1L2 + have hsw2 : MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (w₂.grad x)) := + memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hw2L2 + have hAp : MemVectorL2 U (fun x => matVecMul (a x) p) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll (memVectorL2_const p) + have hATp : MemVectorL2 U (fun x => matVecMul (matTranspose (a x)) p) := by + have heq : (fun x => matVecMul (matTranspose (a x)) p) + = fun x => matVecMul (symmPart (a x)) p - matVecMul (skewPart (a x)) p := by + funext x; exact matVecMul_matTranspose_eq (a x) p + rw [heq] + exact (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll (memVectorL2_const p)).sub + (memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll (memVectorL2_const p)) + have hξ1L2 : MemVectorL2 U (fun x => q - (1 / 2 : ℝ) • matVecMul (a x) p) := + (memVectorL2_const q).sub (hAp.const_smul (1 / 2 : ℝ)) + have hξ2L2 : MemVectorL2 U (fun x => (1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) := + hATp.const_smul (1 / 2 : ℝ) + have hsinv1 : MemVectorL2 U + (fun x => matVecMul ((symmPart (a x))⁻¹) (q - (1 / 2 : ℝ) • matVecMul (a x) p)) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hξ1L2 + have hsinv2 : MemVectorL2 U (fun x => + matVecMul ((symmPart (a x))⁻¹) ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p)) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hξ2L2 + -- IntegrableOn on the two level sets + have iJ1 : MeasureTheory.IntegrableOn + (fun x => vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x)) A₁ := + (integrableOn_vecDot_of_memVectorL2 hξ1L2 hw1L2).mono_set hA1U + have iJ2 : MeasureTheory.IntegrableOn + (fun x => vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x)) A₂ := + (integrableOn_vecDot_of_memVectorL2 hξ2L2 hw2L2).mono_set hA2U + have iE1 : MeasureTheory.IntegrableOn + (fun x => vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x))) A₁ := + (integrableOn_vecDot_of_memVectorL2 hw1L2 hsw1).mono_set hA1U + have iE2 : MeasureTheory.IntegrableOn + (fun x => vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x))) A₂ := + (integrableOn_vecDot_of_memVectorL2 hw2L2 hsw2).mono_set hA2U + have iK1 : MeasureTheory.IntegrableOn (fun x => vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) + (matVecMul ((symmPart (a x))⁻¹) (q - (1 / 2 : ℝ) • matVecMul (a x) p))) A₁ := + (integrableOn_vecDot_of_memVectorL2 hξ1L2 hsinv1).mono_set hA1U + have iK2 : MeasureTheory.IntegrableOn (fun x => vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) + (matVecMul ((symmPart (a x))⁻¹) ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p))) A₂ := + (integrableOn_vecDot_of_memVectorL2 hξ2L2 hsinv2).mono_set hA2U + set E1 : ℝ := ∫ x in A₁, vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) ∂volume + with hE1_def + set E2 : ℝ := ∫ x in A₂, vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) ∂volume + with hE2_def + set J1 : ℝ := ∫ x in A₁, vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x) ∂volume + with hJ1_def + set J2 : ℝ := ∫ x in A₂, vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x) ∂volume + with hJ2_def + set K1 : ℝ := ∫ x in A₁, vecDot (q - (1 / 2 : ℝ) • matVecMul (a x) p) + (matVecMul ((symmPart (a x))⁻¹) (q - (1 / 2 : ℝ) • matVecMul (a x) p)) ∂volume with hK1_def + set K2 : ℝ := ∫ x in A₂, vecDot ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) + (matVecMul ((symmPart (a x))⁻¹) ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p)) ∂volume + with hK2_def + -- identity `E1 + E2 = J1 + J2` + have hid : E1 + E2 = J1 + J2 := + levelEnergy_identity hU hEll hCWF hw1meas hw2meas hw1g hw2g hmatch m₀ k + -- Young: `J1 ≤ ½K1 + ½E1`, `J2 ≤ ½K2 + ½E2` + have hyoung1 : J1 ≤ (2 * (1 : ℝ))⁻¹ * K1 + (1 / 2 : ℝ) * E1 := by + rw [hJ1_def, hK1_def, hE1_def, ← MeasureTheory.integral_const_mul, + ← MeasureTheory.integral_const_mul, ← MeasureTheory.integral_add + (iK1.const_mul _) (iE1.const_mul _)] + refine MeasureTheory.setIntegral_mono_ae_restrict iJ1 + ((iK1.const_mul _).add (iE1.const_mul _)) ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hA1m] with x hx + exact symmForm_young (hEll.2 x hx.1) one_pos (q - (1 / 2 : ℝ) • matVecMul (a x) p) (w₁.grad x) + have hyoung2 : J2 ≤ (2 * (1 : ℝ))⁻¹ * K2 + (1 / 2 : ℝ) * E2 := by + rw [hJ2_def, hK2_def, hE2_def, ← MeasureTheory.integral_const_mul, + ← MeasureTheory.integral_const_mul, ← MeasureTheory.integral_add + (iK2.const_mul _) (iE2.const_mul _)] + refine MeasureTheory.setIntegral_mono_ae_restrict iJ2 + ((iK2.const_mul _).add (iE2.const_mul _)) ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hA2m] with x hx + exact symmForm_young (hEll.2 x hx.1) one_pos + ((1 / 2 : ℝ) • matVecMul (matTranspose (a x)) p) (w₂.grad x) + -- coefficient bounds `K1 ≤ 2M²·vol A₁`, `K2 ≤ M²·vol A₂` + have hvol1 : (0 : ℝ) ≤ (volume A₁).toReal := ENNReal.toReal_nonneg + have hvol2 : (0 : ℝ) ≤ (volume A₂).toReal := ENNReal.toReal_nonneg + have hK1bd : K1 ≤ 2 * M2 * (volume A₁).toReal := by + have hle : K1 ≤ ∫ _ in A₁, (2 * M2) ∂volume := by + refine MeasureTheory.setIntegral_mono_ae_restrict iK1 + (MeasureTheory.integrableOn_const + (lt_of_le_of_lt (measure_mono hA1U) hUtop.lt_top).ne) ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hA1m] with x hx + simpa [hM2_def] using symmPartInv_bulkV_le (hEll.2 x hx.1) p q + rwa [MeasureTheory.setIntegral_const, smul_eq_mul, mul_comm] at hle + have hK2bd : K2 ≤ M2 * (volume A₂).toReal := by + have hle : K2 ≤ ∫ _ in A₂, M2 ∂volume := by + refine MeasureTheory.setIntegral_mono_ae_restrict iK2 + (MeasureTheory.integrableOn_const + (lt_of_le_of_lt (measure_mono hA2U) hUtop.lt_top).ne) ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hA2m] with x hx + simpa [hM2_def] using symmPartInv_bulkVstar_le (hEll.2 x hx.1) p q + rwa [MeasureTheory.setIntegral_const, smul_eq_mul, mul_comm] at hle + have hc : (2 * (1 : ℝ))⁻¹ = 1 / 2 := by norm_num + rw [hc] at hyoung1 hyoung2 + nlinarith [hid, hyoung1, hyoung2, hK1bd, hK2bd, hM2, hvol1, hvol2, + mul_nonneg hM2 hvol2] + +/-! ## From the squared bound to the `√`-shaped level-energy estimate -/ + +/-- **Coordinate-norm packaging.** Given `E_k ≤ 2M²·|A_k|`, the sum of the +coordinate `L²` norms of the truncated gradients is bounded by `2√d·M·√|A_k|`, +via `s ≥ 1` and a Cauchy–Schwarz on the `2d` coordinate norms. -/ +theorem sumCoordNorm_le {U : Set (Vec d)} + {Θ : ℝ} {a : CoeffField d} (hEll : IsEllipticFieldOn 1 Θ U a) + (w₁ w₂ : H1Function U) {A₁ A₂ : Set (Vec d)} + (hA1m : MeasurableSet A₁) (hA2m : MeasurableSet A₂) (hA1U : A₁ ⊆ U) (hA2U : A₂ ⊆ U) + {M2 : ℝ} (hM2 : 0 ≤ M2) + (hEbound : (∫ x in A₁, vecDot (w₁.grad x) (matVecMul (symmPart (a x)) (w₁.grad x)) ∂volume) + + (∫ x in A₂, vecDot (w₂.grad x) (matVecMul (symmPart (a x)) (w₂.grad x)) ∂volume) + ≤ 2 * M2 * ((volume A₁).toReal + (volume A₂).toReal)) : + (∑ i : Fin d, (eLpNorm (A₁.indicator (fun x => w₁.grad x i)) 2 (volumeMeasureOn U)).toReal) + + (∑ i : Fin d, (eLpNorm (A₂.indicator (fun x => w₂.grad x i)) 2 (volumeMeasureOn U)).toReal) + ≤ 2 * Real.sqrt d * Real.sqrt M2 + * Real.sqrt ((volume A₁).toReal + (volume A₂).toReal) := by + classical + -- `∑ᵢ ‖1_A ∂ᵢw‖² ≤ ∫_A ∇w·s∇w` + have key : ∀ (A : Set (Vec d)) (w : H1Function U), MeasurableSet A → A ⊆ U → + (∑ i : Fin d, ((eLpNorm (A.indicator (fun x => w.grad x i)) 2 (volumeMeasureOn U)).toReal) ^ 2) + ≤ ∫ x in A, vecDot (w.grad x) (matVecMul (symmPart (a x)) (w.grad x)) ∂volume := by + intro A w hAm hAU + have hsq : ∀ i : Fin d, + ((eLpNorm (A.indicator (fun x => w.grad x i)) 2 (volumeMeasureOn U)).toReal) ^ 2 + = ∫ x in A, (w.grad x i) ^ 2 ∂volume := by + intro i + rw [toReal_eLpNorm_two_sq_eq_integral_sq ((w.gradMemL2 i).indicator hAm)] + have hind : (fun x => (A.indicator (fun y => w.grad y i) x) ^ 2) + = A.indicator (fun x => (w.grad x i) ^ 2) := by + funext x + by_cases h : x ∈ A <;> + simp [Set.indicator_of_mem, Set.indicator_of_notMem, h] + show ∫ x, (A.indicator (fun y => w.grad y i) x) ^ 2 ∂(volumeMeasureOn U) = _ + rw [hind] + exact setIntegral_indicator_subset hAm hAU (fun x => (w.grad x i) ^ 2) + have hsum : (∑ i : Fin d, + ((eLpNorm (A.indicator (fun x => w.grad x i)) 2 (volumeMeasureOn U)).toReal) ^ 2) + = ∫ x in A, vecNormSq (w.grad x) ∂volume := by + rw [Finset.sum_congr rfl (fun i _ => hsq i), ← MeasureTheory.integral_finsetSum] + · refine MeasureTheory.setIntegral_congr_fun hAm ?_ + intro x hx + simp only [vecNormSq, vecDot, pow_two] + · intro i _ + have hint : MeasureTheory.IntegrableOn + (fun x => w.grad x i * w.grad x i) U volume := + (w.gradMemL2 i).integrable_mul (w.gradMemL2 i) + refine (hint.mono_set hAU).congr ?_ + filter_upwards with x; rw [pow_two] + rw [hsum] + refine MeasureTheory.setIntegral_mono_ae_restrict + ((integrableOn_vecDot_of_memVectorL2 w.grad_memVectorL2 w.grad_memVectorL2).mono_set hAU) + ((integrableOn_vecDot_of_memVectorL2 w.grad_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll w.grad_memVectorL2)).mono_set hAU) + ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hAm] with x hx + have hle := (matLoewnerLE_iff (1 : Mat d) (symmPart (a x))).1 + (one_matLoewnerLE_symmPart_of_isThetaElliptic (hEll.2 x (hAU hx))) (w.grad x) + rw [matVecMul_one] at hle + exact hle + -- the two squared-norm sums + have ha2E := key A₁ w₁ hA1m hA1U + have hb2E := key A₂ w₂ hA2m hA2U + set Sa : ℝ := ∑ i : Fin d, + (eLpNorm (A₁.indicator (fun x => w₁.grad x i)) 2 (volumeMeasureOn U)).toReal with hSa_def + set Sb : ℝ := ∑ i : Fin d, + (eLpNorm (A₂.indicator (fun x => w₂.grad x i)) 2 (volumeMeasureOn U)).toReal with hSb_def + have hSa0 : 0 ≤ Sa := Finset.sum_nonneg fun i _ => ENNReal.toReal_nonneg + have hSb0 : 0 ≤ Sb := Finset.sum_nonneg fun i _ => ENNReal.toReal_nonneg + have hSa2 : Sa ^ 2 ≤ (d : ℝ) * + (∑ i : Fin d, ((eLpNorm (A₁.indicator (fun x => w₁.grad x i)) 2 (volumeMeasureOn U)).toReal) ^ 2) := by + have h := sq_sum_le_card_mul_sum_sq (s := (Finset.univ : Finset (Fin d))) + (f := fun i => (eLpNorm (A₁.indicator (fun x => w₁.grad x i)) 2 (volumeMeasureOn U)).toReal) + simpa [hSa_def, Finset.card_univ, Fintype.card_fin] using h + have hSb2 : Sb ^ 2 ≤ (d : ℝ) * + (∑ i : Fin d, ((eLpNorm (A₂.indicator (fun x => w₂.grad x i)) 2 (volumeMeasureOn U)).toReal) ^ 2) := by + have h := sq_sum_le_card_mul_sum_sq (s := (Finset.univ : Finset (Fin d))) + (f := fun i => (eLpNorm (A₂.indicator (fun x => w₂.grad x i)) 2 (volumeMeasureOn U)).toReal) + simpa [hSb_def, Finset.card_univ, Fintype.card_fin] using h + have hd0 : (0 : ℝ) ≤ (d : ℝ) := Nat.cast_nonneg d + have hV : (0 : ℝ) ≤ (volume A₁).toReal + (volume A₂).toReal := by positivity + have hcomb : (Sa + Sb) ^ 2 ≤ 4 * (d : ℝ) * M2 * ((volume A₁).toReal + (volume A₂).toReal) := by + nlinarith [hSa2, hSb2, ha2E, hb2E, hEbound, sq_nonneg (Sa - Sb), hd0, hM2, hV, + mul_le_mul_of_nonneg_left hEbound hd0] + have hstep : Sa + Sb ≤ Real.sqrt (4 * (d : ℝ) * M2 * ((volume A₁).toReal + (volume A₂).toReal)) := by + rw [show Sa + Sb = Real.sqrt ((Sa + Sb) ^ 2) from (Real.sqrt_sq (by linarith)).symm] + exact Real.sqrt_le_sqrt hcomb + refine le_trans hstep (le_of_eq ?_) + rw [show (4 : ℝ) * (d : ℝ) * M2 * ((volume A₁).toReal + (volume A₂).toReal) + = (2 : ℝ) ^ 2 * ((d : ℝ) * (M2 * ((volume A₁).toReal + (volume A₂).toReal))) from by ring, + Real.sqrt_mul (by positivity), Real.sqrt_sq (by norm_num), + Real.sqrt_mul hd0, Real.sqrt_mul hM2] + ring + +/-! ## Part C deliverable — the coupled level-energy estimate -/ + +/-- **Coupled level-energy estimate.** From the coupled weak form, the measurable representatives +`w₁ ≈ v − ½p·x`, `w₂ ≈ −v* + ½p·x` share a trace and satisfy the De Giorgi core's +level-energy hypothesis with `E₀ = 2√d·√(Θ|p|²+|q|²)`. -/ +theorem coupled_levelEnergy {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {Θ : ℝ} (hΘ : 0 ≤ Θ) {a : CoeffField d} (hEll : IsEllipticFieldOn 1 Θ U a) + {p q : Vec d} {v vstar : H1Function U} + (hCWF : CoupledWeakForm a U q v vstar) + (htrace : MemH10 U (fun x => v.toFun x + vstar.toFun x - vecDot p x)) : + ∃ (w₁ w₂ : H1Function U), + Measurable w₁.toFun ∧ Measurable w₂.toFun ∧ + (w₁.toFun =ᵐ[volume.restrict U] fun x => v.toFun x - (1 / 2 : ℝ) * vecDot p x) ∧ + (w₂.toFun =ᵐ[volume.restrict U] fun x => -vstar.toFun x + (1 / 2 : ℝ) * vecDot p x) ∧ + MemH10 U (fun x => w₁.toFun x - w₂.toFun x) ∧ + ∀ (m₀ k : ℝ), 0 ≤ k → + (∑ i : Fin d, (eLpNorm ({x | x ∈ U ∧ m₀ + k < w₁.toFun x}.indicator + (fun x => w₁.grad x i)) 2 (volumeMeasureOn U)).toReal) + + (∑ i : Fin d, (eLpNorm ({x | x ∈ U ∧ m₀ + k < w₂.toFun x}.indicator + (fun x => w₂.grad x i)) 2 (volumeMeasureOn U)).toReal) + ≤ (2 * Real.sqrt d * Real.sqrt (Θ * vecNormSq p + vecNormSq q)) * Real.sqrt + ((volume {x | x ∈ U ∧ m₀ + k < w₁.toFun x}).toReal + + (volume {x | x ∈ U ∧ m₀ + k < w₂.toFun x}).toReal) := by + classical + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + have hUm : MeasurableSet U := hU.isOpen.measurableSet + obtain ⟨w₁, hw1meas, hw1ae, hw1grad⟩ := + exists_measurableRep (v - affineHalfOn hUm hU.isBoundedDomain p) + obtain ⟨w₂, hw2meas, hw2ae, hw2grad⟩ := + exists_measurableRep (-vstar + affineHalfOn hUm hU.isBoundedDomain p) + have hw1g : ∀ x, w₁.grad x = v.grad x - (1 / 2 : ℝ) • p := by + intro x; rw [hw1grad] + simp only [Homogenization.H1Function.sub_grad, affineHalfOn_grad] + have hw2g : ∀ x, w₂.grad x = -vstar.grad x + (1 / 2 : ℝ) • p := by + intro x; rw [hw2grad] + simp only [Homogenization.H1Function.add_grad, Homogenization.H1Function.neg_grad, + affineHalfOn_grad] + have hw1ae' : w₁.toFun =ᵐ[volume.restrict U] fun x => v.toFun x - (1 / 2 : ℝ) * vecDot p x := by + refine hw1ae.trans (Filter.Eventually.of_forall (fun x => ?_)) + simp only [Homogenization.H1Function.sub_toFun, affineHalfOn_toFun] + have hw2ae' : w₂.toFun =ᵐ[volume.restrict U] fun x => -vstar.toFun x + (1 / 2 : ℝ) * vecDot p x := by + refine hw2ae.trans (Filter.Eventually.of_forall (fun x => ?_)) + simp only [Homogenization.H1Function.add_toFun, Homogenization.H1Function.neg_toFun, + affineHalfOn_toFun] + obtain ⟨W, hW⟩ := htrace + have hmatch : MemH10 U (fun x => w₁.toFun x - w₂.toFun x) := by + have hae : (w₁ - w₂).toFun =ᵐ[volume.restrict U] W.toH1Function.toFun := by + filter_upwards [hw1ae', hw2ae'] with x hx1 hx2 + rw [Homogenization.H1Function.sub_toFun] + show w₁.toFun x - w₂.toFun x = W.toH1Function.toFun x + rw [hx1, hx2, congrFun hW x]; ring + have hmem := memH10_of_ae_eq_h10 hU (w₁ - w₂) W hae + rwa [Homogenization.H1Function.sub_toFun] at hmem + refine ⟨w₁, w₂, hw1meas, hw2meas, hw1ae', hw2ae', hmatch, ?_⟩ + intro m₀ k _hk + have hEbound := levelEnergy_sq_bound hU hΘ hEll hCWF hw1meas hw2meas hw1g hw2g hmatch m₀ k + exact sumCoordNorm_le hEll w₁ w₂ + (hUm.inter (measurableSet_lt measurable_const hw1meas)) + (hUm.inter (measurableSet_lt measurable_const hw2meas)) + (fun x hx => hx.1) (fun x hx => hx.1) + (add_nonneg (mul_nonneg hΘ (vecNormSq_nonneg p)) (vecNormSq_nonneg q)) hEbound + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelRecursion.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelRecursion.lean new file mode 100644 index 0000000000..a28ce8cd69 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/Stampacchia/LevelRecursion.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.ChebyshevMarkov +public import Mathlib.Analysis.MeanInequalitiesPow + +/-! +# Chebyshev level bound and the recursion assembly + +Two purely analytic helpers used by the generic De Giorgi core +(`Stampacchia/DeGiorgiCore.lean`): + +* `real_chebyshev_level`: the real-valued Chebyshev/Markov inequality + `ε · (μ S)^{1/p} ≤ ‖h‖_{L^p}` whenever `S ⊆ {ε ≤ h}` and `‖h‖_{L^p} < ∞`. +* `sq_level_recursion_of_le`: the elementary squaring/superadditivity step turning + `ε · |A_l|^{1/p} ≤ R` into `ε² · |A_l|^{2/p} ≤ R²`, combined with the + subadditivity `(a+b)^{γ} ≤ a^{γ} + b^{γ}` for the two-copy volume. + +Both are proved at default heartbeats, no `sorry`. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal NNReal + +/-- **Real Chebyshev level bound.** If `S ⊆ {x | ε ≤ h x}` with `ε ≥ 0` and +`‖h‖_{L^p(μ)} < ∞`, then +`ε · (μ S)^{1/p} ≤ ‖h‖_{L^p(μ)}` in real numbers. -/ +theorem real_chebyshev_level {α : Type*} {m0 : MeasurableSpace α} {μ : Measure α} + {p : ℝ≥0∞} (hp0 : p ≠ 0) (hptop : p ≠ ⊤) + {h : α → ℝ} (hmeas : AEStronglyMeasurable h μ) + (hfin : eLpNorm h p μ ≠ ⊤) + {ε : ℝ} (hε : 0 ≤ ε) {S : Set α} + (hSsub : ∀ x ∈ S, ε ≤ h x) : + ε * (μ S).toReal ^ (1 / p.toReal) ≤ (eLpNorm h p μ).toReal := by + set q : ℝ := p.toReal with hq_def + have hq : 0 < q := ENNReal.toReal_pos hp0 hptop + -- The ENNReal Chebyshev inequality. + have hstep := mul_meas_ge_le_pow_eLpNorm' μ hp0 hptop (f := h) (ENNReal.ofReal ε) + have hSsub' : S ⊆ {x | ENNReal.ofReal ε ≤ ‖h x‖ₑ} := by + intro x hx + have hεx : ε ≤ h x := hSsub x hx + have henorm : ‖h x‖ₑ = ENNReal.ofReal (h x) := Real.enorm_eq_ofReal (le_trans hε hεx) + rw [Set.mem_ofPred_eq, henorm] + exact ENNReal.ofReal_le_ofReal hεx + have hcombined : + (ENNReal.ofReal ε) ^ q * μ S ≤ eLpNorm h p μ ^ q := by + refine le_trans ?_ hstep + exact mul_le_mul_right (measure_mono hSsub') _ + -- Move to reals. + have hNfin : eLpNorm h p μ ^ q ≠ ⊤ := by + simpa using ENNReal.rpow_ne_top_of_nonneg hq.le hfin + have htoReal := ENNReal.toReal_mono hNfin hcombined + rw [ENNReal.toReal_mul, ← ENNReal.toReal_rpow, ← ENNReal.toReal_rpow, + ENNReal.toReal_ofReal hε] at htoReal + -- `htoReal : ε ^ q * (μ S).toReal ≤ (eLpNorm h p μ).toReal ^ q` + set m : ℝ := (μ S).toReal with hm_def + have hm0 : 0 ≤ m := ENNReal.toReal_nonneg + set N : ℝ := (eLpNorm h p μ).toReal with hN_def + have hN0 : 0 ≤ N := ENNReal.toReal_nonneg + -- Raise both sides to the power `1/q`. + have hLHSnn : 0 ≤ ε ^ q * m := mul_nonneg (Real.rpow_nonneg hε _) hm0 + have hmono := Real.rpow_le_rpow hLHSnn htoReal (le_of_lt (by positivity : (0:ℝ) < 1 / q)) + rw [Real.mul_rpow (Real.rpow_nonneg hε _) hm0] at hmono + rw [← Real.rpow_mul hε, ← Real.rpow_mul hN0, mul_one_div, div_self hq.ne', + Real.rpow_one, Real.rpow_one] at hmono + exact hmono + +/-- **Squaring step of the level recursion.** From the two per-copy Chebyshev +bounds `ε · (vol S₁)^{1/p} ≤ N₁`, `ε · (vol S₂)^{1/p} ≤ N₂` and a bound +`N₁ + N₂ ≤ R`, together with `0 ≤ ε` and `0 < 1/p ≤ 1`, we obtain +`ε² · (vol S₁ + vol S₂)^{2/p} ≤ R²`. -/ +theorem sq_level_recursion_of_le + {ε r a b N₁ N₂ R : ℝ} (hε : 0 ≤ ε) + (hr0 : 0 ≤ r) (hr1 : r ≤ 1) (ha : 0 ≤ a) (hb : 0 ≤ b) + (hN₁ : ε * a ^ r ≤ N₁) (hN₂ : ε * b ^ r ≤ N₂) + (hsum : N₁ + N₂ ≤ R) (hR : 0 ≤ R) : + ε ^ 2 * (a + b) ^ (2 * r) ≤ R ^ 2 := by + -- Superadditivity of `t ↦ t^r`. + have hsuper : (a + b) ^ r ≤ a ^ r + b ^ r := Real.rpow_add_le_add_rpow ha hb hr0 hr1 + have hlow : ε * (a + b) ^ r ≤ R := by + calc ε * (a + b) ^ r ≤ ε * (a ^ r + b ^ r) := by + exact mul_le_mul_of_nonneg_left hsuper hε + _ = ε * a ^ r + ε * b ^ r := by ring + _ ≤ N₁ + N₂ := add_le_add hN₁ hN₂ + _ ≤ R := hsum + have hAB0 : 0 ≤ (a + b) ^ r := Real.rpow_nonneg (add_nonneg ha hb) _ + have hlow0 : 0 ≤ ε * (a + b) ^ r := mul_nonneg hε hAB0 + have hsq := mul_le_mul hlow hlow hlow0 hR + have hAB2 : (a + b) ^ (2 * r) = (a + b) ^ r * (a + b) ^ r := by + rw [show (2 * r) = r + r by ring, + Real.rpow_add_of_nonneg (add_nonneg ha hb) hr0 hr0] + calc ε ^ 2 * (a + b) ^ (2 * r) + = (ε * (a + b) ^ r) * (ε * (a + b) ^ r) := by rw [hAB2]; ring + _ ≤ R * R := hsq + _ = R ^ 2 := by ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/WeakForm.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/WeakForm.lean new file mode 100644 index 0000000000..af350995b9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Coupled/WeakForm.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.MatrixIdentities + +/-! +# Coupled representation: weak-form definition and algebraic scaffolding + +This module holds the `G0` weak-form definition together with the +pointwise matrix/vector algebra and Sobolev scaffolding consumed by the `G1` +existence package in `Coupled/Representation.lean`. + +All coefficients act on `Vec d = Fin d → ℝ`; no `EuclideanSpace`. The file is +deliberately factored into small named lemmas. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## G0 — the weak-form predicate -/ + +/-- **G0.** The variational-identity component of the coupled boundary problem +`e.coupled.weak`, to be paired with its affine trace condition. For flux data +`q`, the identity requires that every test pair `(φ, φ*)` of `H¹(U)` functions +whose sum lies in `H¹₀(U)` satisfy +`∫_U ∇φ·(a ∇v) + ∫_U ∇φ*·(aᵗ ∇v*) = ∫_U q·∇φ`. -/ +def CoupledWeakForm (a : CoeffField d) (U : Set (Vec d)) (q : Vec d) + (v vstar : H1Function U) : Prop := + ∀ (φ φstar : H1Function U), MemH10 U (fun x => φ.toFun x + φstar.toFun x) → + (∫ x in U, vecDot (φ.grad x) (matVecMul (a x) (v.grad x)) ∂volume) + + (∫ x in U, vecDot (φstar.grad x) + (matVecMul (matTranspose (a x)) (vstar.grad x)) ∂volume) + = ∫ x in U, vecDot q (φ.grad x) ∂volume + +/-! ## Finite-measure instance on the open cube -/ + +/-- The restricted Lebesgue measure on a centered open triadic cube is finite. -/ +theorem isFiniteMeasure_openCubeSet_originCube (m : ℤ) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := by + let : Fact (MeasureTheory.volume (openCubeSet (originCube d m)) < ⊤) := + ⟨volume_openCubeSet_originCube_lt_top (d := d) m⟩ + change MeasureTheory.IsFiniteMeasure + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) + infer_instance + +/-! ## Sums of `H¹` functions -/ + +theorem H1Function.sum_grad {ι : Type*} {U : Set (Vec d)} (s : Finset ι) + (f : ι → H1Function U) : + (∑ i ∈ s, f i).grad = fun x => ∑ i ∈ s, (f i).grad x := by + classical + induction s using Finset.induction with + | empty => funext x; simp + | insert a s ha ih => + rw [Finset.sum_insert ha] + funext x + simp only [Homogenization.H1Function.add_grad, Finset.sum_insert ha, ih] + +theorem H1Function.sum_toFun {ι : Type*} {U : Set (Vec d)} (s : Finset ι) + (f : ι → H1Function U) : + (∑ i ∈ s, f i).toFun = fun x => ∑ i ∈ s, (f i).toFun x := by + classical + induction s using Finset.induction with + | empty => funext x; simp + | insert a s ha ih => + rw [Finset.sum_insert ha] + funext x + simp only [Homogenization.H1Function.add_toFun, Finset.sum_insert ha, ih] + +/-! ## The affine coordinate `H¹` function `x ↦ p·x` -/ + +/-- The affine map `x ↦ p·x` as an `H¹` function on the centered open cube, with +constant gradient `p`. This is the coordinate construction assembled from +the library's coordinate projections `coordOnOpenCubeSetOriginCube`. -/ +def affineH1 (m : ℤ) (p : Vec d) : H1Function (openCubeSet (originCube d m)) := + ∑ i : Fin d, p i • H1Function.coordOnOpenCubeSetOriginCube (n := m) i + +@[simp] theorem affineH1_grad (m : ℤ) (p : Vec d) : + (affineH1 m p).grad = fun _ => p := by + rw [affineH1, H1Function.sum_grad] + funext x + simp only [Homogenization.H1Function.smul_grad] + show (∑ i : Fin d, p i • basisVec i) = p + funext j + rw [Finset.sum_apply] + simp only [Pi.smul_apply, smul_eq_mul, basisVec, Pi.single_apply, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq Finset.univ j (fun i => p i)] + simp + +@[simp] theorem affineH1_toFun (m : ℤ) (p : Vec d) : + (affineH1 m p).toFun = fun x => vecDot p x := by + rw [affineH1, H1Function.sum_toFun] + funext x + simp only [Homogenization.H1Function.smul_toFun] + rfl + +/-! ## Symmetric/skew decomposition of the transpose action -/ + +/-- `matVecMul Aᵀ w = matVecMul s w − matVecMul k w` where `s = symmPart A`, +`k = skewPart A`. -/ +theorem matVecMul_matTranspose_eq (A : Mat d) (w : Vec d) : + matVecMul (matTranspose A) w = + matVecMul (symmPart A) w - matVecMul (skewPart A) w := by + have h := matVecMul_eq_symmPart_add_skewPart (matTranspose A) w + rw [symmPart_matTranspose, skewPart_matTranspose, neg_matVecMul, ← sub_eq_add_neg] at h + exact h + +/-- Symmetric-part regrouping of `a∇v + aᵀ∇v*`: +`A vg + Aᵀ vsg = s (vg + vsg) + k (vg − vsg)`. -/ +theorem matVecMul_sub_vec (A : Mat d) (x y : Vec d) : + matVecMul A (x - y) = matVecMul A x - matVecMul A y := by + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg, ← sub_eq_add_neg] + +theorem matVecMul_add_matTranspose_eq (A : Mat d) (vg vsg : Vec d) : + matVecMul A vg + matVecMul (matTranspose A) vsg = + matVecMul (symmPart A) (vg + vsg) + matVecMul (skewPart A) (vg - vsg) := by + rw [matVecMul_add (symmPart A) vg vsg, matVecMul_sub_vec (skewPart A) vg vsg, + matVecMul_eq_symmPart_add_skewPart A vg, matVecMul_matTranspose_eq] + abel + +/-- Symmetric-part regrouping of `a∇v − aᵀ∇v*`: +`A vg − Aᵀ vsg = s (vg − vsg) + k (vg + vsg)`. -/ +theorem matVecMul_sub_matTranspose_eq (A : Mat d) (vg vsg : Vec d) : + matVecMul A vg - matVecMul (matTranspose A) vsg = + matVecMul (symmPart A) (vg - vsg) + matVecMul (skewPart A) (vg + vsg) := by + rw [matVecMul_sub_vec (symmPart A) vg vsg, matVecMul_add (skewPart A) vg vsg, + matVecMul_eq_symmPart_add_skewPart A vg, matVecMul_matTranspose_eq] + abel + +/-! ## The `α/β` bilinear split of the weak-form integrand -/ + +/-- Bilinear `α/β` split: `Pv·X + Ps·Y = α·(X+Y) + β·(X−Y)` where +`α = ½(Pv+Ps)`, `β = ½(Pv−Ps)`. -/ +theorem vecDot_alpha_beta_split (Pv Ps X Y : Vec d) : + vecDot Pv X + vecDot Ps Y = + vecDot ((1 / 2 : ℝ) • (Pv + Ps)) (X + Y) + + vecDot ((1 / 2 : ℝ) • (Pv - Ps)) (X - Y) := by + simp only [vecDot, Pi.add_apply, Pi.sub_apply, Pi.smul_apply, smul_eq_mul, + ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl (fun i _ => ?_) + ring + +/-! ## The symmetric parallelogram identity -/ + +/-- Bilinear parallelogram identity: +`2 (½(p+τ))·(½(A+B)) + 2 (½(p−τ))·(½(A−B)) = p·A + τ·B`. -/ +theorem vecDot_half_parallelogram (p τ A B : Vec d) : + 2 * vecDot ((1 / 2 : ℝ) • (p + τ)) ((1 / 2 : ℝ) • (A + B)) + + 2 * vecDot ((1 / 2 : ℝ) • (p - τ)) ((1 / 2 : ℝ) • (A - B)) = + vecDot p A + vecDot τ B := by + simp only [vecDot, Pi.add_apply, Pi.sub_apply, Pi.smul_apply, smul_eq_mul, + Finset.mul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl (fun i _ => ?_) + ring + +/-- Parallelogram identity for the symmetric form `s`: +`2 (½(p+τ))·s(½(p+τ)) + 2 (½(p−τ))·s(½(p−τ)) = p·s p + τ·s τ`. -/ +theorem two_vecDot_symmPart_half_add_sub (s : Mat d) (p τ : Vec d) : + 2 * vecDot ((1 / 2 : ℝ) • (p + τ)) (matVecMul s ((1 / 2 : ℝ) • (p + τ))) + + 2 * vecDot ((1 / 2 : ℝ) • (p - τ)) (matVecMul s ((1 / 2 : ℝ) • (p - τ))) = + vecDot p (matVecMul s p) + vecDot τ (matVecMul s τ) := by + have h1 : matVecMul s ((1 / 2 : ℝ) • (p + τ)) = + (1 / 2 : ℝ) • (matVecMul s p + matVecMul s τ) := by + rw [matVecMul_smul, matVecMul_add] + have h2 : matVecMul s ((1 / 2 : ℝ) • (p - τ)) = + (1 / 2 : ℝ) • (matVecMul s p - matVecMul s τ) := by + rw [matVecMul_smul, sub_eq_add_neg, matVecMul_add, matVecMul_neg, ← sub_eq_add_neg] + rw [h1, h2] + exact vecDot_half_parallelogram p τ (matVecMul s p) (matVecMul s τ) + +/-! ## The pointwise energy identity (A7 + Schur inverse) -/ + +/-- The doubled quadratic form of `bfA` equals `p·s p + τ·s τ` with +`τ := s⁻¹(j − k p)`. This is the `A7` factorization with the Schur term +rewritten through `s s⁻¹ = 1`. -/ +theorem blockEnergy_pointwise_eq {A : Mat d} (hdet : IsUnit (symmPart A).det) + (p j : Vec d) : + blockVecDot (p, j) (blockMatVecMul (blockMatrixOfCoeff A) (p, j)) = + vecDot p (matVecMul (symmPart A) p) + + vecDot (matVecMul (symmPart A)⁻¹ (j - matVecMul (skewPart A) p)) + (matVecMul (symmPart A) + (matVecMul (symmPart A)⁻¹ (j - matVecMul (skewPart A) p))) := by + set w := j - matVecMul (skewPart A) p with hw + have hsτ : matVecMul (symmPart A) (matVecMul (symmPart A)⁻¹ w) = w := by + rw [matVecMul_mul, Matrix.mul_nonsing_inv _ hdet, matVecMul_one] + rw [blockMatrixOfCoeff_quadratic A p j, hsτ] + rw [vecDot_comm (matVecMul (symmPart A)⁻¹ w) w] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale.lean new file mode 100644 index 0000000000..fe07ec12a8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.BadMaximal +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Basic +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal.lean new file mode 100644 index 0000000000..b78a196d53 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.BadMaximal.P1 + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal/P1.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal/P1.lean new file mode 100644 index 0000000000..327d0dd7ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/BadMaximal/P1.lean @@ -0,0 +1,933 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Continuity +public import Mathlib.Analysis.CStarAlgebra.Matrix +public import Mathlib.Analysis.Matrix.HermitianFunctionalCalculus +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section56.VarianceEstimateQuadratic.Triangle +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P2 + +/-! # P1 -/ + +@[expose] public section + +open MeasureTheory +open scoped ENNReal +open scoped Matrix.Norms.Elementwise +open scoped MatrixOrder + + +/-! +# Bad maximal observable + +This file isolates the manuscript bad-event maximal slot from the scalar +post-split bound used in the no-drop response estimate. +-/ + + +namespace Homogenization.HighContrast.EntryScale + +noncomputable section + +/-- Threshold a nonnegative maximal observable to the bad event `{1 < M}`. -/ +noncomputable def badEventTruncation {Ω : Type*} (M : Ω → ℝ) : Ω → ℝ := + fun ω => if 1 < M ω then M ω else 0 + +/-- Nonnegativity of the bad-event truncation for a nonnegative observable. -/ +theorem badEventTruncation_nonneg + {Ω : Type*} {M : Ω → ℝ} {ω : Ω} + (hM_nonneg : 0 ≤ M ω) : + 0 ≤ badEventTruncation M ω := by + by_cases hbad : 1 < M ω + · simp only [badEventTruncation, hbad, ↓reduceIte, hM_nonneg] + · simp only [badEventTruncation, hbad, ↓reduceIte, le_refl] + +/-- The bad-event truncation is bounded by the original nonnegative observable. -/ +theorem badEventTruncation_le_self_of_nonneg + {Ω : Type*} {M : Ω → ℝ} {ω : Ω} + (hM_nonneg : 0 ≤ M ω) : + badEventTruncation M ω ≤ M ω := by + by_cases hbad : 1 < M ω + · simp only [badEventTruncation, hbad, ↓reduceIte, le_refl] + · simp only [badEventTruncation, hbad, ↓reduceIte, hM_nonneg] + +/-- +Sharp good/bad split of a nonnegative maximal observable: on the good event +`{M <= 1}` the observable equals `min M 1`, and on the bad event `{1 < M}` it +is paid by the bad-event truncation at first power (with the harmless extra +`min M 1 = 1`). This is the first-power replacement for the crude split +`M <= 1 + badEventTruncation M`. +-/ +theorem le_min_one_add_badEventTruncation + {Ω : Type*} {M : Ω → ℝ} {ω : Ω} : + M ω ≤ min (M ω) 1 + badEventTruncation M ω := by + by_cases hbad : 1 < M ω + · have hmin : min (M ω) 1 = 1 := min_eq_right hbad.le + simp only [hmin, badEventTruncation, hbad, ↓reduceIte, le_add_iff_nonneg_left, zero_le_one] + · have hle : M ω ≤ 1 := le_of_not_gt hbad + have hmin : min (M ω) 1 = M ω := min_eq_left hle + simp only [hmin, badEventTruncation, hbad, ↓reduceIte, add_zero, le_refl] + +/-- +First-power good/bad split of a nonnegative maximal factor against a +nonnegative response: `M * J` is paid by `min M 1 * J` on the good event and +by `badEventTruncation M * J` on the bad event. No squaring and no +deterministic cap on `J` is introduced. +-/ +theorem maximal_mul_le_min_one_mul_add_badEventTruncation_mul + {Ω : Type*} {M : Ω → ℝ} {ω : Ω} {J : ℝ} + (hJ_nonneg : 0 ≤ J) : + M ω * J ≤ min (M ω) 1 * J + badEventTruncation M ω * J := by + have hsplit : M ω ≤ min (M ω) 1 + badEventTruncation M ω := + le_min_one_add_badEventTruncation + calc + M ω * J ≤ (min (M ω) 1 + badEventTruncation M ω) * J := + mul_le_mul_of_nonneg_right hsplit hJ_nonneg + _ = min (M ω) 1 * J + badEventTruncation M ω * J := by ring + +/-- The bad-event truncation of an a.e. strongly measurable observable is a.e. strongly measurable. -/ +theorem aestronglyMeasurable_badEventTruncation + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} {M : Ω → ℝ} + (hM : AEStronglyMeasurable M μ) : + AEStronglyMeasurable (badEventTruncation M) μ := by + classical + have hset : NullMeasurableSet {ω | 1 < M ω} μ := + aestronglyMeasurable_const.nullMeasurableSet_lt hM + simpa only [badEventTruncation, Set.indicator_apply, Set.mem_ofPred_eq] using! + hM.indicator₀ hset + +/-- +The deterministic weighted drift supremum in the manuscript split of +`\mathcal M_m`. +-/ +noncomputable def terminalBadMaximalDriftSup + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) {N m : ℕ} (hNm : N ≤ m) : ℝ := + (Finset.Icc N m).sup' + ⟨N, Finset.mem_Icc.mpr ⟨le_rfl, hNm⟩⟩ + (fun j => + (3 : ℝ) ^ (-(hc.rhoM * ((m - j : ℕ) : ℝ))) * + terminalAnnealedFullBlockDriftAtScales hP hStruct j m) + +/-- +The stochastic/subthreshold/deterministic random envelope that appears after +the manuscript positive-part split. This is not the source observable itself; +it is the pointwise upper envelope whose square is later integrated. +-/ +noncomputable def terminalBadMaximalSplitEnvelope + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) {N m : ℕ} (hNm : N ≤ m) + (Q : Homogenization.TriadicCube d) + (a : Ω → Homogenization.RegCoeffField d) (M_sub : ℕ → Ω → ℝ) : Ω → ℝ := + fun ω => + terminalCoarseBlockStochasticMax hP hStruct hc N m Q a ω + + |M_sub m ω| + + terminalBadMaximalDriftSup hP hStruct hc hNm + +theorem terminalCoarseBlockStochasticMax_nonneg + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) (N m : ℕ) + (Q : Homogenization.TriadicCube d) + (a : Ω → Homogenization.RegCoeffField d) : + ∀ ω, 0 ≤ terminalCoarseBlockStochasticMax hP hStruct hc N m Q a ω := by + intro ω + dsimp [terminalCoarseBlockStochasticMax, terminalCoarseBlockStochasticMaxOfWeak] + exact ENNReal.toReal_nonneg + +theorem terminalBadMaximalDriftSup_nonneg + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) {N m : ℕ} (hNm : N ≤ m) : + 0 ≤ terminalBadMaximalDriftSup hP hStruct hc hNm := by + classical + let f : ℕ → ℝ := fun j => + (3 : ℝ) ^ (-(hc.rhoM * ((m - j : ℕ) : ℝ))) * + terminalAnnealedFullBlockDriftAtScales hP hStruct j m + have hNmem : N ∈ Finset.Icc N m := Finset.mem_Icc.mpr ⟨le_rfl, hNm⟩ + have hterm_nonneg : 0 ≤ f N := by + dsimp [f] + exact mul_nonneg + (le_of_lt (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) + (-(hc.rhoM * ((m - N : ℕ) : ℝ))))) + (terminalAnnealedFullBlockDriftAtScales_nonneg hP hStruct N m) + have hle : f N ≤ (Finset.Icc N m).sup' ⟨N, hNmem⟩ f := + Finset.le_sup' (s := Finset.Icc N m) (f := f) hNmem + exact hterm_nonneg.trans hle + +/-- +Any scale term in the deterministic drift split is selected by the drift +supremum over the high-scale window. +-/ +theorem weighted_terminalAnnealedFullBlockDriftAtScales_le_terminalBadMaximalDriftSup + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) {N m j : ℕ} (hNm : N ≤ m) + (hj : j ∈ Finset.Icc N m) : + (3 : ℝ) ^ (-(hc.rhoM * ((m - j : ℕ) : ℝ))) * + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ + terminalBadMaximalDriftSup hP hStruct hc hNm := by + classical + let f : ℕ → ℝ := fun i => + (3 : ℝ) ^ (-(hc.rhoM * ((m - i : ℕ) : ℝ))) * + terminalAnnealedFullBlockDriftAtScales hP hStruct i m + have hNmem : N ∈ Finset.Icc N m := Finset.mem_Icc.mpr ⟨le_rfl, hNm⟩ + have hle : f j ≤ (Finset.Icc N m).sup' ⟨N, hNmem⟩ f := + Finset.le_sup' (s := Finset.Icc N m) (f := f) hj + simpa only [terminalBadMaximalDriftSup, Finset.le_sup'_iff, Finset.mem_Icc] using hle + +theorem fullBlockOperatorNorm_add_le {d : ℕ} + (A B : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm (A + B) ≤ + fullBlockOperatorNorm A + fullBlockOperatorNorm B := by + calc + fullBlockOperatorNorm (A + B) + = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) (A + B)‖ := rfl + _ = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A + + Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := by + rw [map_add] + _ ≤ ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A‖ + + ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := + norm_add_le _ _ + _ = fullBlockOperatorNorm A + fullBlockOperatorNorm B := rfl + +section L2OperatorNorm + +open scoped Matrix.Norms.L2Operator + +open ContinuousFunctionalCalculus + +/-- Negation is isometric for the L2 operator norm on square matrices. Stated +via `Matrix.cstar_norm_def` (bundling through `toEuclideanCLM`) rather than the +generic `norm_neg`, because this file has both `Matrix.Norms.Elementwise` and +`Matrix.Norms.L2Operator` open and a bare typeclass-inferred norm lemma can +resolve against the wrong scoped instance. -/ +private lemma l2OpMatrixNormNeg + {n : Type*} [Fintype n] [DecidableEq n] (B : Matrix n n ℝ) : + ‖(-B : Matrix n n ℝ)‖ = ‖B‖ := by + rw [Matrix.cstar_norm_def, Matrix.cstar_norm_def, map_neg, norm_neg] + +private lemma Matrix.IsHermitian.isometry_cfcAux_l2 + {n : Type*} [Fintype n] [DecidableEq n] + {A : Matrix n n ℝ} (hA : Matrix.IsHermitian A) : + Isometry hA.cfcAux := by + rw [isometry_iff_dist_eq] + intro f g + let u : C(spectrum ℝ A, ℝ) := f - g + have hnorm : ‖hA.cfcAux u‖ = ‖u‖ := by + let eigVals : n → ℝ := fun i => + u ⟨hA.eigenvalues i, hA.eigenvalues_mem_spectrum_real i⟩ + let D : Matrix n n ℝ := Matrix.diagonal eigVals + have hunit : + ‖((Unitary.conjStarAlgAut ℝ (Matrix n n ℝ)) hA.eigenvectorUnitary) D‖ = ‖D‖ := by + calc + ‖((Unitary.conjStarAlgAut ℝ (Matrix n n ℝ)) hA.eigenvectorUnitary) D‖ = + ‖(hA.eigenvectorUnitary : Matrix n n ℝ) * D * + star (hA.eigenvectorUnitary : Matrix n n ℝ)‖ := by + simp only [Unitary.conjStarAlgAut_apply] + _ = ‖D * star (hA.eigenvectorUnitary : Matrix n n ℝ)‖ := by + rw [mul_assoc, CStarRing.norm_coe_unitary_mul] + _ = ‖D * (star hA.eigenvectorUnitary : unitary (Matrix n n ℝ))‖ := by + simp only [Unitary.coe_star] + _ = ‖D‖ := by + rw [CStarRing.norm_mul_coe_unitary] + have hfiniteSup : ‖eigVals‖ = ‖u‖ := by + apply le_antisymm + · rw [pi_norm_le_iff_of_nonneg (norm_nonneg u)] + intro i + simpa only [Real.norm_eq_abs] using + ContinuousMap.norm_coe_le_norm u + (⟨hA.eigenvalues i, hA.eigenvalues_mem_spectrum_real i⟩ : + spectrum ℝ A) + · rw [ContinuousMap.norm_le u (norm_nonneg _)] + intro x + rcases x with ⟨x, hx⟩ + obtain ⟨i, hi⟩ : ∃ i, hA.eigenvalues i = x := by + simpa only [hA.spectrum_real_eq_range_eigenvalues, Set.mem_range] using hx + subst x + simpa only [Real.norm_eq_abs] using norm_le_pi_norm eigVals i + rw [Matrix.IsHermitian.cfcAux_apply] + simpa only [RCLike.ofReal_real_eq_id, CompTriple.comp_eq, Unitary.conjStarAlgAut_apply, + Function.comp_def] using! + (calc + ‖((Unitary.conjStarAlgAut ℝ (Matrix n n ℝ)) hA.eigenvectorUnitary) D‖ = + ‖D‖ := hunit + _ = ‖eigVals‖ := by + change ‖Matrix.diagonal eigVals‖ = ‖eigVals‖ + rw [Matrix.l2_opNorm_diagonal] + _ = ‖u‖ := hfiniteSup) + calc + dist (hA.cfcAux f) (hA.cfcAux g) = + ‖hA.cfcAux f - hA.cfcAux g‖ := by + rw [Matrix.instL2OpNormedRing.dist_eq] + have hstep : -hA.cfcAux f + hA.cfcAux g = -(hA.cfcAux f - hA.cfcAux g) := by abel + rw [hstep, l2OpMatrixNormNeg] + _ = ‖hA.cfcAux (f - g)‖ := by rw [map_sub] + _ = ‖f - g‖ := by simpa only [Matrix.IsHermitian.cfcAux_apply, RCLike.ofReal_real_eq_id, ContinuousMap.coe_sub, CompTriple.comp_eq, Unitary.conjStarAlgAut_apply, u] using hnorm + _ = dist f g := (dist_eq_norm _ _).symm + +private noncomputable local instance fullBlockMat_isometricContinuousFunctionalCalculus + {d : ℕ} : + IsometricContinuousFunctionalCalculus ℝ (Homogenization.FullBlockMat d) IsSelfAdjoint where + isometric M hM := by + have hHerm : Matrix.IsHermitian M := hM + have hcfc : + cfcHom hM = hHerm.cfcAux := + cfcHom_eq_of_continuous_of_map_id hM hHerm.cfcAux + hHerm.isClosedEmbedding_cfcAux.continuous hHerm.cfcAux_id + simpa only [hcfc] using Matrix.IsHermitian.isometry_cfcAux_l2 hHerm + +/-- +The operator norm of the C-star positive part is bounded by the operator norm +of the original full-block matrix. + +This is the local analytic bridge behind the manuscript step +`|(X)_+| ≤ |X|`. It is proved by diagonalizing self-adjoint matrices and +using unitary invariance of the C-star norm; non-self-adjoint matrices have +zero positive part by the Mathlib definition. +-/ +theorem fullBlockOperatorNorm_posPart_le {d : ℕ} + (M : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm (M⁺) ≤ fullBlockOperatorNorm M := by + rw [fullBlockOperatorNorm_eq_l2_opNorm, fullBlockOperatorNorm_eq_l2_opNorm] + by_cases hsa : IsSelfAdjoint M + · classical + let hHerm : M.IsHermitian := hsa + let Dpos : Homogenization.FullBlockMat d := + Matrix.diagonal (fun i : Homogenization.BlockCoord d => (hHerm.eigenvalues i)⁺) + let D : Homogenization.FullBlockMat d := + Matrix.diagonal hHerm.eigenvalues + have hpos_eq : + M⁺ = + Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary Dpos := by + dsimp [Dpos] + rw [CFC.posPart_def] + rw [cfcₙ_eq_cfc] + rw [Matrix.IsHermitian.cfc_eq] + rfl + have hM_eq : + M = Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D := by + simpa only [Unitary.conjStarAlgAut_apply, RCLike.ofReal_real_eq_id, CompTriple.comp_eq] using hHerm.spectral_theorem + have hunit_pos : + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary Dpos‖ = + ‖Dpos‖ := by + calc + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary Dpos‖ = + ‖(hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d) * Dpos * + star (hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d)‖ := by + simp only [Unitary.conjStarAlgAut_apply] + _ = ‖Dpos * star (hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d)‖ := by + rw [mul_assoc, CStarRing.norm_coe_unitary_mul] + _ = ‖Dpos * (star hHerm.eigenvectorUnitary : + unitary (Homogenization.FullBlockMat d))‖ := by + simp only [Unitary.coe_star] + _ = ‖Dpos‖ := by + rw [CStarRing.norm_mul_coe_unitary] + have hunit : + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ = + ‖D‖ := by + calc + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ = + ‖(hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d) * D * + star (hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d)‖ := by + simp only [Unitary.conjStarAlgAut_apply] + _ = ‖D * star (hHerm.eigenvectorUnitary : Homogenization.FullBlockMat d)‖ := by + rw [mul_assoc, CStarRing.norm_coe_unitary_mul] + _ = ‖D * (star hHerm.eigenvectorUnitary : + unitary (Homogenization.FullBlockMat d))‖ := by + simp only [Unitary.coe_star] + _ = ‖D‖ := by + rw [CStarRing.norm_mul_coe_unitary] + have hdiag_le : ‖Dpos‖ ≤ ‖D‖ := by + have heig_le : + ‖(fun i : Homogenization.BlockCoord d => (hHerm.eigenvalues i)⁺)‖ ≤ + ‖hHerm.eigenvalues‖ := by + rw [pi_norm_le_iff_of_nonneg (norm_nonneg _)] + intro i + have hreal : ‖(hHerm.eigenvalues i)⁺‖ ≤ ‖hHerm.eigenvalues i‖ := by + by_cases hx : 0 ≤ hHerm.eigenvalues i + · rw [posPart_eq_self.mpr hx] + · have hxle : hHerm.eigenvalues i ≤ 0 := le_of_not_ge hx + rw [posPart_eq_zero.mpr hxle] + simp only [norm_zero, Real.norm_eq_abs, abs_nonneg] + exact hreal.trans (norm_le_pi_norm hHerm.eigenvalues i) + calc + ‖Dpos‖ = + ‖(fun i : Homogenization.BlockCoord d => (hHerm.eigenvalues i)⁺)‖ := by + simp only [Matrix.l2_opNorm_diagonal, Dpos] + _ ≤ ‖hHerm.eigenvalues‖ := heig_le + _ = ‖D‖ := by + simp only [Matrix.l2_opNorm_diagonal, D] + calc + ‖M⁺‖ = + ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary Dpos‖ := + congrArg norm hpos_eq + _ = ‖Dpos‖ := hunit_pos + _ ≤ ‖D‖ := hdiag_le + _ = ‖Unitary.conjStarAlgAut ℝ _ hHerm.eigenvectorUnitary D‖ := hunit.symm + _ = ‖M‖ := congrArg norm hM_eq.symm + · rw [CFC.posPart_eq_zero_of_not_isSelfAdjoint hsa] + rw [Matrix.cstar_norm_def] + rw [Matrix.cstar_norm_def] + simp only [map_zero, norm_zero, norm_nonneg] + +private theorem measurable_fullBlockOperatorNorm_posPart {d : ℕ} : + Measurable fun M : Homogenization.FullBlockMat d => + fullBlockOperatorNorm (M⁺) := by + classical + let selfAdjointSet : Set (Homogenization.FullBlockMat d) := + {M | IsSelfAdjoint M} + have hself_closed : IsClosed selfAdjointSet := by + have hstar : Continuous fun M : Homogenization.FullBlockMat d => star M := by + fun_prop + have hid : Continuous fun M : Homogenization.FullBlockMat d => M := continuous_id + have hclosed : IsClosed {M : Homogenization.FullBlockMat d | star M = M} := + isClosed_eq hstar hid + simpa only [selfAdjointSet, isSelfAdjoint_iff] using hclosed + have hself_meas : MeasurableSet selfAdjointSet := hself_closed.measurableSet + have hpos_cont : + ContinuousOn (fun M : Homogenization.FullBlockMat d => M⁺) selfAdjointSet := by + have hpos_cont_cfc : + ContinuousOn + (fun M : Homogenization.FullBlockMat d => cfcₙ (fun x : ℝ => x⁺) M) + selfAdjointSet := + ContinuousOn.cfcₙ + (f := fun x : ℝ => x⁺) + (a := fun M : Homogenization.FullBlockMat d => M) + (s := fun M : Homogenization.FullBlockMat d => + Metric.closedBall (0 : ℝ) (‖M‖ + 1)) + (t := selfAdjointSet) + (hs := by + intro M _hM + exact isCompact_closedBall (0 : ℝ) (‖M‖ + 1)) + (ha_cont := continuous_id.continuousOn) + (ha := by + intro M _hM + have hpos : 0 < (1 : ℝ) := by norm_num + filter_upwards [inter_mem_nhdsWithin selfAdjointSet (Metric.ball_mem_nhds M hpos)] + with M' hnear + intro y hy + have hdist_near : dist M' M < 1 := by + simpa only [dist_comm, Metric.mem_ball] using hnear.2 + have hM'_norm : ‖M'‖ ≤ ‖M‖ + 1 := by + have htri : ‖M'‖ ≤ dist M' M + ‖M‖ := by + let distL2 := + @dist (Homogenization.FullBlockMat d) Matrix.instL2OpMetricSpace.toDist + let normL2 := + @norm (Homogenization.FullBlockMat d) Matrix.instL2OpNormedRing.toNorm + have htri_dist : + distL2 M' 0 ≤ distL2 M' M + distL2 M 0 := + @dist_triangle (Homogenization.FullBlockMat d) + Matrix.instL2OpMetricSpace.toPseudoMetricSpace M' M 0 + have hM'0 : distL2 M' 0 = normL2 M' := by + change dist M' 0 = ‖M'‖ + rw [Matrix.instL2OpNormedRing.dist_eq, add_zero, l2OpMatrixNormNeg] + have hM0 : distL2 M 0 = normL2 M := by + change dist M 0 = ‖M‖ + rw [Matrix.instL2OpNormedRing.dist_eq, add_zero, l2OpMatrixNormNeg] + simpa only [ge_iff_le, hM'0, hM0] using htri_dist + linarith only [htri, hdist_near] + have hM'_self : IsSelfAdjoint M' := by + simpa only [Set.mem_ofPred_eq, selfAdjointSet] using hnear.1 + have hy_norm : ‖y‖ ≤ ‖M'‖ := + NonUnitalIsometricContinuousFunctionalCalculus.norm_quasispectrum_le + (𝕜 := ℝ) (A := Homogenization.FullBlockMat d) + (p := IsSelfAdjoint) M' hy hM'_self + have hy_bound : ‖y‖ ≤ ‖M‖ + 1 := hy_norm.trans hM'_norm + simpa only [Metric.mem_closedBall, dist_eq_norm, sub_zero, Real.norm_eq_abs, ge_iff_le] using hy_bound) + (ha' := by + intro M hM + exact hM) + (hf := by + intro M _hM + exact continuous_posPart.continuousOn) + (hf0 := by simp only [posPart_zero]) + simpa only [CFC.posPart_def] using hpos_cont_cfc + have hnorm_cont : + Continuous fun M : Homogenization.FullBlockMat d => + fullBlockOperatorNorm M := by + let L : Homogenization.FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (Homogenization.BlockCoord d) →L[ℝ] + EuclideanSpace ℝ (Homogenization.BlockCoord d)) := { + toFun := fun M => + Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ) M + map_add' := by + intro A B + exact map_add + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ)) A B + map_smul' := by + intro r A + exact map_smul + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ)) r A + } + have hcont : Continuous fun M : Homogenization.FullBlockMat d => ‖L M‖ := + L.continuous_of_finiteDimensional.norm + simpa only [fullBlockOperatorNorm, L, LinearMap.coe_mk, AddHom.coe_mk] using hcont + have hf_cont : + ContinuousOn + (fun M : Homogenization.FullBlockMat d => fullBlockOperatorNorm (M⁺)) + selfAdjointSet := + hnorm_cont.comp_continuousOn hpos_cont + have hzero_cont : + ContinuousOn (fun _ : Homogenization.FullBlockMat d => (0 : ℝ)) + selfAdjointSetᶜ := + continuous_const.continuousOn + have hpw_meas : + Measurable + (selfAdjointSet.piecewise + (fun M : Homogenization.FullBlockMat d => fullBlockOperatorNorm (M⁺)) + (fun _ : Homogenization.FullBlockMat d => (0 : ℝ))) := + hf_cont.measurable_piecewise hzero_cont hself_meas + have hpw_eq : + selfAdjointSet.piecewise + (fun M : Homogenization.FullBlockMat d => fullBlockOperatorNorm (M⁺)) + (fun _ : Homogenization.FullBlockMat d => (0 : ℝ)) = + (fun M : Homogenization.FullBlockMat d => fullBlockOperatorNorm (M⁺)) := by + funext M + by_cases hM : M ∈ selfAdjointSet + · simp only [hM, Set.piecewise_eq_of_mem] + · have hnot : ¬ IsSelfAdjoint M := by + simpa only [Set.mem_ofPred_eq, selfAdjointSet] using hM + simp only [fullBlockOperatorNorm, hM, not_false_eq_true, Set.piecewise_eq_of_notMem, CFC.posPart_eq_zero_of_not_isSelfAdjoint hnot, map_zero, norm_zero] + simpa only [hpw_eq] using hpw_meas + +end L2OperatorNorm + +/-- +The literal terminally-normalized spectral positive part on one block. + +This uses the library's normalized full-block fluctuation matrix for +`Ahom_m^{-1/2} (bfA(Q) - Ahom_m) Ahom_m^{-1/2}` and mathlib's C-star +positive part `M⁺`. +-/ +noncomputable def terminalSpectralPositivePartAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) : ℝ := + fullBlockOperatorNorm + ((Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct (m : ℤ) + (Homogenization.cubeSet Q) a)⁺) + +theorem terminalSpectralPositivePartAtScale_nonneg + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) : + 0 ≤ terminalSpectralPositivePartAtScale hP hStruct m Q a := by + dsimp [terminalSpectralPositivePartAtScale] + exact fullBlockOperatorNorm_nonneg _ + +theorem aemeasurable_terminalFullBlockNormalizedFluctuationMatrixAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (Q : Homogenization.TriadicCube d) : + AEMeasurable + (fun a : Homogenization.RegCoeffField d => + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct (m : ℤ) (Homogenization.cubeSet Q) a) P := + Homogenization.Book.Ch05.Section56.aemeasurable_fullBlockNormalizedFluctuationMatrix_cubeSet + hP hStruct (m : ℤ) Q + +theorem aemeasurable_terminalSpectralPositivePartAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (Q : Homogenization.TriadicCube d) : + AEMeasurable + (fun a : Homogenization.RegCoeffField d => + terminalSpectralPositivePartAtScale hP hStruct m Q a) P := by + exact + (measurable_fullBlockOperatorNorm_posPart.comp_aemeasurable + (aemeasurable_terminalFullBlockNormalizedFluctuationMatrixAtScale + hP hStruct m Q)).congr (by + filter_upwards with a + rfl) + +private theorem fullBlockQuadratic_le_fullBlockOperatorNorm_mul_dotProduct + {d : ℕ} (M : Homogenization.FullBlockMat d) + (x : Homogenization.FullBlockVec d) : + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M x ≤ + fullBlockOperatorNorm M * dotProduct x x := by + let X : PiLp 2 (fun _ : Homogenization.BlockCoord d => ℝ) := WithLp.toLp 2 x + let Y : PiLp 2 (fun _ : Homogenization.BlockCoord d => ℝ) := + WithLp.toLp 2 (Matrix.mulVec M x) + have hY : + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) M) X = Y := by + simp only [Matrix.toEuclideanCLM_toLp, X, Y] + have hinner : + inner ℝ X Y = + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M x := by + simp only [PiLp.inner_apply, RCLike.inner_apply, conj_trivial, mul_comm, Fintype.sum_sum_type, Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic, dotProduct, X, Y] + have hnormY : + ‖Y‖ ≤ fullBlockOperatorNorm M * ‖X‖ := by + simpa only [fullBlockOperatorNorm, hY] using + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) M).le_opNorm X + have hnormX_sq : + ‖X‖ ^ 2 = dotProduct x x := by + rw [PiLp.norm_sq_eq_of_L2] + simp only [Real.norm_eq_abs, sq, abs_mul_abs_self, Fintype.sum_sum_type, dotProduct, X] + calc + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M x + ≤ |Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M x| := + le_abs_self _ + _ = |inner ℝ X Y| := by rw [hinner] + _ ≤ ‖X‖ * ‖Y‖ := abs_real_inner_le_norm X Y + _ ≤ ‖X‖ * (fullBlockOperatorNorm M * ‖X‖) := by + exact mul_le_mul_of_nonneg_left hnormY (norm_nonneg X) + _ = fullBlockOperatorNorm M * dotProduct x x := by + rw [← hnormX_sq] + ring + +private theorem fullBlockQuadratic_le_posPart_of_isSymm + {d : ℕ} {M : Homogenization.FullBlockMat d} + (hM : M.IsSymm) (x : Homogenization.FullBlockVec d) : + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M x ≤ + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M⁺ x := by + have hsa : IsSelfAdjoint M := Matrix.isHermitian_iff_isSymm.mpr hM + let _ : PartialOrder (Homogenization.FullBlockMat d) := Matrix.instPartialOrder + let _ : StarOrderedRing (Homogenization.FullBlockMat d) := Matrix.instStarOrderedRing + have horder : M ≤ M⁺ := CFC.le_posPart (a := M) hsa + have hdiff : (M⁺ - M).PosSemidef := Matrix.le_iff.mp horder + have hdiff_quad : + 0 ≤ + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic + (M⁺ - M) x := by + simpa only [Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic, star_trivial] + using hdiff.dotProduct_mulVec_nonneg x + have hsub := + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic_sub + M⁺ M x + linarith only [hdiff_quad, hsub] + +theorem fullBlockNormalizedQuadraticObservable_sub_dotProduct_le_terminalSpectralPositivePartAtScale_mul_dotProduct + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) + (hSymm : Homogenization.IsSymmetricBlockMat + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a)) + (q : Homogenization.FullBlockVec d) : + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) q (Homogenization.cubeSet Q) a - + dotProduct q q ≤ + terminalSpectralPositivePartAtScale hP hStruct m Q a * dotProduct q q := by + let M := + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix + hP hStruct (m : ℤ) (Homogenization.cubeSet Q) a + have hM_symm : M.IsSymm := by + dsimp [M] + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedFluctuationMatrix_isSymm_of_isSymmetricBlockMat + hP hStruct (m : ℤ) hSymm + have hcenter : + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) q (Homogenization.cubeSet Q) a - + dotProduct q q = + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M q := by + dsimp [M] + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable_sub_dotProduct_eq_fluctuationQuadratic + hP hStruct hP4 m q (Homogenization.cubeSet Q) a + calc + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) q (Homogenization.cubeSet Q) a - + dotProduct q q = + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M q := hcenter + _ ≤ Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic M⁺ q := + fullBlockQuadratic_le_posPart_of_isSymm hM_symm q + _ ≤ fullBlockOperatorNorm M⁺ * dotProduct q q := + fullBlockQuadratic_le_fullBlockOperatorNorm_mul_dotProduct M⁺ q + _ = terminalSpectralPositivePartAtScale hP hStruct m Q a * dotProduct q q := by + rfl + +theorem upperLeft_posSemidef_of_isSymmetricBlockMat_of_blockPosDef + {d : ℕ} {A : Homogenization.BlockMat d} + (hSymm : Homogenization.IsSymmetricBlockMat A) + (hPos : Homogenization.Book.Ch02.BlockPosDef A) : + A.upperLeft.PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · ext i j + simp only [Matrix.conjTranspose, RCLike.star_def, Matrix.map_apply, Matrix.transpose_apply, conj_trivial] + simpa only [Homogenization.blockMatEntry] using hSymm (Sum.inl j) (Sum.inl i) + · intro x + by_cases hx : x = 0 + · simp only [hx, star_trivial, Matrix.mulVec_zero, dotProduct_zero, le_refl] + · have hX : ((x, 0) : Homogenization.BlockVec d) ≠ 0 := by + intro hzero + exact hx (congrArg Prod.fst hzero) + have hquad := (hPos ((x, 0) : Homogenization.BlockVec d) hX).le + simpa only [star_trivial, ge_iff_le, Homogenization.blockVecDot, Homogenization.blockMatVecMul, Homogenization.matVecMul_zero, add_zero, Homogenization.vecDot_zero_left] + using! hquad + +theorem lowerRight_posSemidef_of_isSymmetricBlockMat_of_blockPosDef + {d : ℕ} {A : Homogenization.BlockMat d} + (hSymm : Homogenization.IsSymmetricBlockMat A) + (hPos : Homogenization.Book.Ch02.BlockPosDef A) : + A.lowerRight.PosSemidef := by + refine Matrix.PosSemidef.of_dotProduct_mulVec_nonneg ?_ ?_ + · ext i j + simp only [Matrix.conjTranspose, RCLike.star_def, Matrix.map_apply, Matrix.transpose_apply, conj_trivial] + simpa only [Homogenization.blockMatEntry] using hSymm (Sum.inr j) (Sum.inr i) + · intro x + by_cases hx : x = 0 + · simp only [hx, star_trivial, Matrix.mulVec_zero, dotProduct_zero, le_refl] + · have hX : ((0, x) : Homogenization.BlockVec d) ≠ 0 := by + intro hzero + exact hx (congrArg Prod.snd hzero) + have hquad := (hPos ((0, x) : Homogenization.BlockVec d) hX).le + simpa only [star_trivial, ge_iff_le, Homogenization.blockVecDot, Homogenization.blockMatVecMul, Homogenization.matVecMul_zero, zero_add, Homogenization.vecDot_zero_left] + using! hquad + +theorem scalar_one_posSemidef_of_nonneg + {d : ℕ} {c : ℝ} (hc : 0 ≤ c) : + (c • (1 : Homogenization.Mat d)).PosSemidef := + Matrix.PosSemidef.smul Matrix.PosSemidef.one hc + +theorem vecDot_matVecMul_smul_one + {d : ℕ} (c : ℝ) (x : Homogenization.Vec d) : + Homogenization.vecDot x + (Homogenization.matVecMul (c • (1 : Homogenization.Mat d)) x) = + c * Homogenization.vecDot x x := by + classical + simp only [Homogenization.vecDot, Homogenization.matVecMul, Matrix.smul_apply, Matrix.one_apply, smul_eq_mul, mul_ite, mul_one, mul_zero, mul_comm, Finset.sum_ite_eq, Finset.mem_univ, ↓reduceIte, mul_left_comm, Finset.mul_sum] + +theorem coarseBlockMatrix_cubeSet_symm_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] (Q : Homogenization.TriadicCube d) + {a : Homogenization.RegCoeffField d} + (ha : Homogenization.Book.Ch04.AELocallyUniformlyEllipticField a) : + Homogenization.IsSymmetricBlockMat + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a) := by + let F : Homogenization.Book.Ch02.TriadicCoeffFamily d := + Homogenization.Book.Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a = + Homogenization.Book.Ch02.coarseBlockMatrix + (Homogenization.Book.Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa only using + Homogenization.Book.Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hEq] + exact + Homogenization.Book.Ch02.isSymmetricBlockMat_coarseBlockMatrix + (Homogenization.Book.Ch02.cubeDomain Q) (F.coeffOn Q) + +theorem coarseBlockMatrix_cubeSet_blockPosDef_of_aelocallyUniformlyEllipticField + {d : ℕ} [NeZero d] (Q : Homogenization.TriadicCube d) + {a : Homogenization.RegCoeffField d} + (ha : Homogenization.Book.Ch04.AELocallyUniformlyEllipticField a) : + Homogenization.Book.Ch02.BlockPosDef + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a) := by + let F : Homogenization.Book.Ch02.TriadicCoeffFamily d := + Homogenization.Book.Ch04.triadicCoeffFamilyOfAELocallyUniformlyEllipticField a ha + have hEq : + Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a = + Homogenization.Book.Ch02.coarseBlockMatrix + (Homogenization.Book.Ch02.cubeDomain Q) (F.coeffOn Q) := by + simpa only using + Homogenization.Book.Ch04.RestrictionLawCarrier.coarseBlockMatrix_cubeSet_eq_ch02_coarseBlockMatrix_of_aelocallyUniformlyEllipticField + ha Q + rw [hEq] + exact + (Homogenization.Book.Ch02.blockCoarseMatrixTheory + (Homogenization.Book.Ch02.cubeDomain Q) (F.coeffOn Q)).block_matrix_posDef + +theorem fullBlockNormalizedQuadraticObservable_upperLift_eq + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) (e : Homogenization.Vec d) : + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let xu : Homogenization.FullBlockVec d := + Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0) + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) xu (Homogenization.cubeSet Q) a = + Homogenization.vecDot e + (Homogenization.matVecMul + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a).upperLeft e) := by + classical + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : Homogenization.FullBlockMat d := + Matrix.diagonal (Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag b c) + let A := Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a + let xu : Homogenization.FullBlockVec d := + Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0) + have hb : 0 < b := by + simpa only using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hDxu : + Matrix.mulVec D xu = Homogenization.toFullBlockVec (e, 0) := by + funext α + cases α with + | inl i => + dsimp [D] + rw [Matrix.mulVec_diagonal] + simp only [Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, Homogenization.toFullBlockVec, Pi.smul_apply, smul_eq_mul, b, xu] + field_simp [ne_of_gt (Real.sqrt_pos.mpr (by simpa only [b] using hb))] + | inr i => + dsimp [D] + rw [Matrix.mulVec_diagonal] + simp only [Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, Homogenization.toFullBlockVec, Pi.zero_apply, mul_zero, xu] + calc + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) xu (Homogenization.cubeSet Q) a = + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic + (D * Homogenization.toFullBlockMat A * D) xu := by + rfl + _ = + Homogenization.blockVecDot + (Homogenization.ofFullBlockVec (Matrix.mulVec D xu)) + (Homogenization.blockMatVecMul A + (Homogenization.ofFullBlockVec (Matrix.mulVec D xu))) := by + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag b c) A xu + _ = + Homogenization.blockVecDot (e, 0) + (Homogenization.blockMatVecMul A (e, 0)) := by + rw [hDxu] + simp only [Homogenization.ofFullBlockVec_toFullBlockVec] + _ = + Homogenization.vecDot e + (Homogenization.matVecMul + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a).upperLeft e) := by + simp only [Homogenization.blockVecDot, Homogenization.blockMatVecMul, Homogenization.matVecMul_zero, add_zero, Homogenization.vecDot_zero_left, A] + +theorem fullBlockNormalizedQuadraticObservable_lowerLift_eq + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) (e : Homogenization.Vec d) : + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let xl : Homogenization.FullBlockVec d := + Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e) + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) xl (Homogenization.cubeSet Q) a = + Homogenization.vecDot e + (Homogenization.matVecMul + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a).lowerRight e) := by + classical + dsimp only + let b := hP.barSigmaAtScale hStruct (m : ℤ) + let c := hP.barSigmaStarAtScale hStruct (m : ℤ) + let D : Homogenization.FullBlockMat d := + Matrix.diagonal (Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag b c) + let A := Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a + let xl : Homogenization.FullBlockVec d := + Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e) + have hc : 0 < c := by + simpa only using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hDxl : + Matrix.mulVec D xl = Homogenization.toFullBlockVec (0, e) := by + funext α + cases α with + | inl i => + dsimp [D] + rw [Matrix.mulVec_diagonal] + simp only [Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, Homogenization.toFullBlockVec, Pi.zero_apply, mul_zero, xl] + | inr i => + dsimp [D] + rw [Matrix.mulVec_diagonal] + simp only [Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, Homogenization.toFullBlockVec, Pi.smul_apply, smul_eq_mul, c, xl] + field_simp [ne_of_gt (Real.sqrt_pos.mpr (by simpa only [c] using hc))] + calc + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockNormalizedQuadraticObservable + hP hStruct (m : ℤ) xl (Homogenization.cubeSet Q) a = + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic + (D * Homogenization.toFullBlockMat A * D) xl := by + rfl + _ = + Homogenization.blockVecDot + (Homogenization.ofFullBlockVec (Matrix.mulVec D xl)) + (Homogenization.blockMatVecMul A + (Homogenization.ofFullBlockVec (Matrix.mulVec D xl))) := by + exact + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot + (Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag b c) A xl + _ = + Homogenization.blockVecDot (0, e) + (Homogenization.blockMatVecMul A (0, e)) := by + rw [hDxl] + simp only [Homogenization.ofFullBlockVec_toFullBlockVec] + _ = + Homogenization.vecDot e + (Homogenization.matVecMul + (Homogenization.coarseBlockMatrix (Homogenization.cubeSet Q) a).lowerRight e) := by + simp only [Homogenization.blockVecDot, Homogenization.blockMatVecMul, Homogenization.matVecMul_zero, zero_add, Homogenization.vecDot_zero_left, A] + +theorem upperLift_dotProduct_eq + {d : ℕ} {b : ℝ} (hb : 0 ≤ b) (e : Homogenization.Vec d) : + dotProduct (Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0)) + (Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0)) = + b * Homogenization.vecDot e e := by + calc + dotProduct (Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0)) + (Homogenization.toFullBlockVec ((Real.sqrt b) • e, 0)) = + Homogenization.blockVecDot ((Real.sqrt b) • e, 0) ((Real.sqrt b) • e, 0) := by + exact Homogenization.dotProduct_toFullBlockVec _ _ + _ = Homogenization.vecNormSq ((Real.sqrt b) • e) := by + simp only [Homogenization.blockVecDot, Homogenization.vecDot_zero_left, add_zero, Homogenization.vecNormSq] + _ = b * Homogenization.vecDot e e := by + rw [Homogenization.vecNormSq_smul, Real.sq_sqrt hb] + simp only [Homogenization.vecNormSq] + +theorem lowerLift_dotProduct_eq + {d : ℕ} {c : ℝ} (hc : 0 ≤ c) (e : Homogenization.Vec d) : + dotProduct (Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e)) + (Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e)) = + c⁻¹ * Homogenization.vecDot e e := by + calc + dotProduct (Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e)) + (Homogenization.toFullBlockVec (0, (Real.sqrt c)⁻¹ • e)) = + Homogenization.blockVecDot (0, (Real.sqrt c)⁻¹ • e) + (0, (Real.sqrt c)⁻¹ • e) := by + exact Homogenization.dotProduct_toFullBlockVec _ _ + _ = Homogenization.vecNormSq ((Real.sqrt c)⁻¹ • e) := by + simp only [Homogenization.blockVecDot, Homogenization.vecDot_zero_left, zero_add, Homogenization.vecNormSq] + _ = c⁻¹ * Homogenization.vecDot e e := by + rw [Homogenization.vecNormSq_smul] + have hsqrt_sq : (Real.sqrt c) ^ 2 = c := Real.sq_sqrt hc + rw [inv_pow, hsqrt_sq] + simp only [Homogenization.vecNormSq] + +end + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Basic.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Basic.lean new file mode 100644 index 0000000000..5dc1a23d1f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Basic.lean @@ -0,0 +1,34 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +/-! +# Basic metadata for the entry-scale assembly + +This file contains only source-control metadata for the development. +Mathematical theorem statements should be introduced only after their source +labels and dependency role are recorded. +-/ + +@[expose] public section + +namespace Homogenization.HighContrast.EntryScale + +/-- A stable label referencing a statement in the source document. -/ +structure SourceLabel where + file : String + label : String + line : Nat +deriving DecidableEq, Repr + +namespace SourceLabel + +/-- A label from the high-moment paper (Armstrong–Kuusi–Loher, to appear). -/ +def highMomentPaper (label : String) (line : Nat) : SourceLabel := + { file := "high-moment-paper", label, line } +end SourceLabel +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra.lean new file mode 100644 index 0000000000..7c01c01b96 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P2 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P3 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P4 + +/-! # Deterministic Algebra -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P1.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P1.lean new file mode 100644 index 0000000000..62541fc874 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P1.lean @@ -0,0 +1,943 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.SpecialFunctions.Sqrt +public import Mathlib.Tactic.Abel +public import Mathlib.Tactic.FieldSimp +public import Mathlib.Tactic.Linarith +public import Mathlib.Tactic.Ring +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds + +/-! # P1 -/ + +@[expose] public section + +open scoped BigOperators Matrix.Norms.Elementwise +open scoped Matrix.Norms.L2Operator + + +/-! +# Deterministic contrast algebra + +Pure-real deterministic algebra from the high-moment paper +(Armstrong–Kuusi–Loher, to appear), Section "Deterministic contrast +algebra". The scalar drop estimates are paired with the library's operator-norm API +for the normalization comparison in `e.norm.compare`. +-/ + + +namespace Homogenization.HighContrast.EntryScale + +/-- The scalar contrast drop `r_m^2 (a b - 1)`. + +Source label: `e.F.drop`. +-/ +def contrastDrop (r_m a b : ℝ) : ℝ := + r_m ^ 2 * (a * b - 1) + +/-- The terminal additivity defect `tau`. + +Source label: `e.tau.terminal`. +-/ +noncomputable def terminalTau (r_m a b : ℝ) : ℝ := + r_m * ((a - 1) + (b - 1)) / 2 + +/-- A no-drop window, written only in terms of the endpoint contrasts. + +Source label: `e.nodrop`. +-/ +def noDropWindow (rho F_k F_m : ℝ) : Prop := + F_k - F_m ≤ rho * F_m + +/-- The scalar contrast excess `F_m = Theta_m - 1`. + +Source label: `e.F.drop`. +-/ +noncomputable def contrastExcessAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) : ℝ := + Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1 + +/-- +Source label `e.J.moment.bound`: conversion from the library's +`sqrt(theta_m)` scalar to the manuscript's `r_m` normalization, under the +source hypothesis `r_m^2 = 1 + F_m`. +-/ +theorem sqrt_thetaAtScale_eq_r_m_of_sq_contrastExcess + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) {r_m : ℝ} + (hr_nonneg : 0 ≤ r_m) + (hr_sq : r_m ^ 2 = 1 + contrastExcessAtScale hP hStruct m) : + Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) = r_m := by + let θ := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have hθ_eq : θ = 1 + contrastExcessAtScale hP hStruct m := by + dsimp [θ, contrastExcessAtScale] + ring + have hθ_nonneg : 0 ≤ θ := by + rw [hθ_eq, ← hr_sq] + exact sq_nonneg r_m + exact (Real.sqrt_eq_iff_eq_sq hθ_nonneg hr_nonneg).2 + (by rw [hθ_eq, ← hr_sq]) + +/-- +Source labels `p.HC.CR` and `e.HC.CR`: the library's centered coarse-fluctuation +term `(sqrt(theta_m) - 1)^2` is controlled by the manuscript contrast excess +`F_m = theta_m - 1`. +-/ +theorem sqrt_thetaAtScale_sub_one_sq_le_contrastExcessAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) : + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) - 1) ^ + (2 : ℕ) ≤ + contrastExcessAtScale hP hStruct m := by + let θ := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have hθ_one : 1 ≤ θ := by + simpa [θ] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have hθ_nonneg : 0 ≤ θ := le_trans zero_le_one hθ_one + let a := Real.sqrt θ + have ha_sq : a ^ (2 : ℕ) = θ := Real.sq_sqrt hθ_nonneg + have ha_sub_nonneg : 0 ≤ a - 1 := by + have ha_one : 1 ≤ a := by + simpa [a] using Real.one_le_sqrt.mpr hθ_one + linarith + have hdiff_nonneg : 0 ≤ a ^ (2 : ℕ) - 1 - (a - 1) ^ (2 : ℕ) := by + have hdiff_eq : a ^ (2 : ℕ) - 1 - (a - 1) ^ (2 : ℕ) = 2 * (a - 1) := by + ring + rw [hdiff_eq] + nlinarith + calc + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) - 1) ^ + (2 : ℕ) = (a - 1) ^ (2 : ℕ) := by + rfl + _ ≤ a ^ (2 : ℕ) - 1 := by linarith + _ = contrastExcessAtScale hP hStruct m := by + rw [ha_sq] + rfl + +/-- The terminal scalar prefactor `P_{k,m}`. + +Source label: `e.P.bound`. +-/ +def terminalP (r_m a b : ℝ) : ℝ := + r_m * (a + b) + +/-- +The concrete terminal scalar prefactor at scales `k <= m`: +`P_{k,m} = r_m (a_{k,m} + b_{k,m})`. + +Source label: `e.P.bound`. +-/ +noncomputable def terminalPAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (k m : ℕ) : ℝ := + terminalP + (Real.sqrt (1 + contrastExcessAtScale hP hStruct m)) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + +/-- +Local weak-norm scalar weight at the left edge of the window. This is the +coefficient produced by the raw high-contrast computation before the library's final +scale-zero baseline conversion. + +Source labels: `p.HC.CR` and `e.P.bound`. +-/ +noncomputable def localWeakNormScalarWeightAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (k m : ℕ) : ℝ := + let σ := Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) + σ * (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ + + σ⁻¹ * hP.barSigmaAtScale hStruct (k : ℤ) + +/-- Source label `e.F.drop`: the contrast drop is `r_m^2 (a b - 1)`. -/ +@[simp] +theorem contrast_drop_eq (r_m a b : ℝ) : + contrastDrop r_m a b = r_m ^ 2 * (a * b - 1) := + rfl + +/-- +Source label `e.tau.terminal`: real algebra rewriting the library's special-vector +tau scalar formula into the paper's `r_m`, `a_{j,m}`, `b_{j,m}` notation. +-/ +theorem terminalTau_eq_of_barSigma_ratios {sigma theta bm cm bk ck : ℝ} + (hbm : 0 < bm) (hcm : 0 < cm) (hck : 0 < ck) + (hsigma : sigma = Real.sqrt (bm * cm)) + (htheta : theta = bm * cm⁻¹) : + (1 / 2 : ℝ) * sigma⁻¹ * (bk - bm) + + (1 / 2 : ℝ) * sigma * (ck⁻¹ - cm⁻¹) = + terminalTau (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) := by + have hsigma_inv : bm * sigma⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.barSigma_mul_inv_sigma_eq_sqrt_theta + hbm hcm hsigma htheta + have hsigma_star : sigma * cm⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.sigma_mul_inv_star_eq_sqrt_theta + hbm hcm hsigma htheta + have hbm_ne : bm ≠ 0 := ne_of_gt hbm + have hcm_ne : cm ≠ 0 := ne_of_gt hcm + have hck_ne : ck ≠ 0 := ne_of_gt hck + have hfirst : + sigma⁻¹ * (bk - bm) = Real.sqrt theta * (bk / bm - 1) := by + calc + sigma⁻¹ * (bk - bm) = (bm * sigma⁻¹) * (bk / bm - 1) := by + field_simp [hbm_ne] + _ = Real.sqrt theta * (bk / bm - 1) := by rw [hsigma_inv] + have hsecond : + sigma * (ck⁻¹ - cm⁻¹) = Real.sqrt theta * (ck⁻¹ / cm⁻¹ - 1) := by + calc + sigma * (ck⁻¹ - cm⁻¹) = + (sigma * cm⁻¹) * (ck⁻¹ / cm⁻¹ - 1) := by + field_simp [hcm_ne, hck_ne] + _ = Real.sqrt theta * (ck⁻¹ / cm⁻¹ - 1) := by rw [hsigma_star] + rw [terminalTau] + calc + (1 / 2 : ℝ) * sigma⁻¹ * (bk - bm) + + (1 / 2 : ℝ) * sigma * (ck⁻¹ - cm⁻¹) + = (1 / 2 : ℝ) * (sigma⁻¹ * (bk - bm)) + + (1 / 2 : ℝ) * (sigma * (ck⁻¹ - cm⁻¹)) := by ring + _ = (1 / 2 : ℝ) * (Real.sqrt theta * (bk / bm - 1)) + + (1 / 2 : ℝ) * (Real.sqrt theta * (ck⁻¹ / cm⁻¹ - 1)) := by + rw [hfirst, hsecond] + _ = Real.sqrt theta * (bk / bm - 1 + (ck⁻¹ / cm⁻¹ - 1)) / 2 := by + ring + +/-- +Source label `e.sqrt.tau.absorb`: real algebra rewriting the library's special-vector +expected-response scalar formula into the paper's terminal prefactor notation. +-/ +theorem half_terminalP_sub_one_eq_of_barSigma_ratios {sigma theta bm cm bk ck : ℝ} + (hbm : 0 < bm) (hcm : 0 < cm) (hck : 0 < ck) + (hsigma : sigma = Real.sqrt (bm * cm)) + (htheta : theta = bm * cm⁻¹) : + (1 / 2 : ℝ) * sigma⁻¹ * bk + + (1 / 2 : ℝ) * sigma * ck⁻¹ - 1 = + (1 / 2 : ℝ) * + terminalP (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) - 1 := by + have hsigma_inv : bm * sigma⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.barSigma_mul_inv_sigma_eq_sqrt_theta + hbm hcm hsigma htheta + have hsigma_star : sigma * cm⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.sigma_mul_inv_star_eq_sqrt_theta + hbm hcm hsigma htheta + have hbm_ne : bm ≠ 0 := ne_of_gt hbm + have hcm_ne : cm ≠ 0 := ne_of_gt hcm + have hck_ne : ck ≠ 0 := ne_of_gt hck + have hfirst : + sigma⁻¹ * bk = Real.sqrt theta * (bk / bm) := by + calc + sigma⁻¹ * bk = (bm * sigma⁻¹) * (bk / bm) := by + field_simp [hbm_ne] + _ = Real.sqrt theta * (bk / bm) := by rw [hsigma_inv] + have hsecond : + sigma * ck⁻¹ = Real.sqrt theta * (ck⁻¹ / cm⁻¹) := by + calc + sigma * ck⁻¹ = (sigma * cm⁻¹) * (ck⁻¹ / cm⁻¹) := by + field_simp [hcm_ne, hck_ne] + _ = Real.sqrt theta * (ck⁻¹ / cm⁻¹) := by rw [hsigma_star] + rw [terminalP] + calc + (1 / 2 : ℝ) * sigma⁻¹ * bk + + (1 / 2 : ℝ) * sigma * ck⁻¹ - 1 + = (1 / 2 : ℝ) * (sigma⁻¹ * bk) + + (1 / 2 : ℝ) * (sigma * ck⁻¹) - 1 := by ring + _ = (1 / 2 : ℝ) * (Real.sqrt theta * (bk / bm)) + + (1 / 2 : ℝ) * (Real.sqrt theta * (ck⁻¹ / cm⁻¹)) - 1 := by + rw [hfirst, hsecond] + _ = (1 / 2 : ℝ) * + (Real.sqrt theta * (bk / bm + ck⁻¹ / cm⁻¹)) - 1 := by + ring + +/-- +Source label `e.tau.terminal`: library-facing terminal-pair formula. For the +special vectors `p_e,q_e`, `tauAtScale` is exactly the local scalar +`terminalTau` with `r_m = sqrt Theta_m` and the paper ratios +`a_{k,m}`, `b_{k,m}`. +-/ +theorem tauAtScale_special_eq_terminalTau_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m k : ℕ) (_hk_le_m : k ≤ m) (e : Homogenization.Vec d) + (he : Homogenization.Book.Ch02.vecNorm e = 1) : + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (k : ℤ) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) = + terminalTau + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + have he_sq : Homogenization.vecNormSq e = 1 := + Homogenization.Book.Ch05.Section54.GoodScale.vecNormSq_eq_one_of_vecNorm_eq_one + he + let p_e := Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e + let q_e := Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e + have hBlock_m : + MeasureTheory.Integrable + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube + (Homogenization.originCube d (m : ℤ))) P := + Homogenization.Book.Ch05.Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 m + have hBlock_k : + MeasureTheory.Integrable + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube + (Homogenization.originCube d (k : ℤ))) P := + Homogenization.Book.Ch05.Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 k + have htau : + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (k : ℤ) p_e q_e = + Homogenization.Book.Ch05.tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) + p_e q_e := + Homogenization.Book.Ch05.Section52.tauAtScale_eq_tauScalarFormula + hP hStruct (m : ℤ) (k : ℤ) p_e q_e hBlock_m hBlock_k + have hspecial : + Homogenization.Book.Ch05.tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) + p_e q_e = + (1 / 2 : ℝ) * + (Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + (hP.barSigmaAtScale hStruct (k : ℤ) - + hP.barSigmaAtScale hStruct (m : ℤ)) + + (1 / 2 : ℝ) * + Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) * + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + simpa [p_e, q_e] using + Homogenization.Book.Ch05.Section54.GoodScale.tauScalarFormula_special_eq_of_P4 + hP hStruct hP4 m k e he_sq + let sigma := Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) + let theta := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bk := hP.barSigmaAtScale hStruct (k : ℤ) + let ck := hP.barSigmaStarAtScale hStruct (k : ℤ) + have hbm : 0 < bm := by + simpa [bm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm : 0 < cm := by + simpa [cm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hck : 0 < ck := by + simpa [ck] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 k + have halg : + (1 / 2 : ℝ) * sigma⁻¹ * (bk - bm) + + (1 / 2 : ℝ) * sigma * (ck⁻¹ - cm⁻¹) = + terminalTau (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) := + terminalTau_eq_of_barSigma_ratios hbm hcm hck rfl rfl + calc + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (k : ℤ) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) + = Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (k : ℤ) p_e q_e := rfl + _ = Homogenization.Book.Ch05.tauScalarFormula hP hStruct (m : ℤ) (k : ℤ) + p_e q_e := htau + _ = (1 / 2 : ℝ) * sigma⁻¹ * (bk - bm) + + (1 / 2 : ℝ) * sigma * (ck⁻¹ - cm⁻¹) := by + simpa [sigma, bm, cm, bk, ck] using hspecial + _ = terminalTau (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) := halg + _ = terminalTau + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) := by + rfl + +/-- +Source label `l.union.bound`: the library's Section 52 scalar preliminaries compare the +scale-`m` scalar contrast to the corrected note's initial budget +`T = widetildeTheta_0`. +-/ +theorem thetaAtScale_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) : + Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + have hprelim := + Homogenization.Book.Ch05.Section52.scalarPreliminaries_homogenizationScale + hP hStruct hP4 (n := 0) (m := m) (k := 0) (p := 0) (q := 0) + (Nat.zero_le m) (Nat.zero_le 0) + exact hprelim.2.1.trans hprelim.2.2.1 + +/-- +Source label `l.union.bound`: the corrected initial contrast budget +`T = widetildeTheta_0` is at least one under `(P4)`. +-/ +theorem one_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) : + 1 ≤ Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + have htheta : + 1 ≤ Homogenization.Book.Ch05.thetaAtScale hP hStruct (0 : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 0 + exact htheta.trans (thetaAtScale_le_initialWidetildeTheta_of_P4 hP hStruct hP4 0) + +/-- Source label `e.F.drop`: `F_m = Theta_m - 1` is nonnegative under `(P4)`. -/ +theorem contrastExcessAtScale_nonneg_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) : + 0 ≤ contrastExcessAtScale hP hStruct m := by + have htheta : + 1 ≤ Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + change 0 ≤ Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1 + linarith + +/-- +Source label `l.det.memory`: the manuscript contrast sequence +`F_m = Theta_m - 1` is nonincreasing in the scale. +-/ +theorem contrastExcessAtScale_antitone_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) : + Antitone fun m : ℕ => contrastExcessAtScale hP hStruct m := by + intro j m hjm + have htheta : + Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) ≤ + Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := j) (m := m) hjm + change + Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1 ≤ + Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) - 1 + linarith + +/-- +Source label `l.union.bound`: real algebra for the product of the two scalar +normalization ratios. In source notation this is +`a_{j,m} b_{j,m} = Theta_j / Theta_m`. +-/ +theorem terminalScalarRatioProduct_eq_theta_ratio + {barSigma_j barSigma_m barSigmaStar_j barSigmaStar_m : ℝ} + (hbarSigma_m : barSigma_m ≠ 0) + (hbarSigmaStar_j : barSigmaStar_j ≠ 0) + (hbarSigmaStar_m : barSigmaStar_m ≠ 0) : + (barSigma_j / barSigma_m) * + (barSigmaStar_j⁻¹ / barSigmaStar_m⁻¹) = + (barSigma_j * barSigmaStar_j⁻¹) / + (barSigma_m * barSigmaStar_m⁻¹) := by + field_simp [hbarSigma_m, hbarSigmaStar_j, hbarSigmaStar_m] + +/-- +Source label `l.union.bound`: for `j <= m`, the product of the upper and +inverse-star scalar normalization ratios is controlled by the corrected initial +budget `T = widetildeTheta_0`. +-/ +theorem terminalScalarRatioProduct_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (_hjm : j ≤ m) : + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + let theta_j := Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) + let theta_m := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : + 0 < hP.barSigmaStarAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have htheta_m_one : 1 ≤ theta_m := by + simpa [theta_m] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have htheta_j_nonneg : 0 ≤ theta_j := by + have htheta_j_one : + 1 ≤ theta_j := by + simpa [theta_j] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 j + linarith + have htheta_m_pos : 0 < theta_m := by linarith + have htheta_j_le_T : + theta_j ≤ Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [theta_j] using + thetaAtScale_le_initialWidetildeTheta_of_P4 hP hStruct hP4 j + have hratio_le_theta_j : theta_j / theta_m ≤ theta_j := by + rw [div_le_iff₀ htheta_m_pos] + nlinarith + have hprod_eq : + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) = + theta_j / theta_m := by + rw [terminalScalarRatioProduct_eq_theta_ratio + (ne_of_gt hbm_pos) (ne_of_gt hcj_pos) (ne_of_gt hcm_pos)] + rfl + rw [hprod_eq] + exact hratio_le_theta_j.trans htheta_j_le_T + +/-- +Source label `l.union.bound`: the upper scalar block of the terminal/intermediate +normalization change is controlled by the initial budget +`T = widetildeTheta_0`. +-/ +theorem terminalUpperScalarRatio_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) : + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + let upper := + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let lower := + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hjm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 + hP hStruct hP4 m + have hupper_ge_one : 1 ≤ upper := by + rw [show upper = + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) by rfl] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hlower_ge_one : 1 ≤ lower := by + rw [show lower = + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ by rfl] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hupper_le_product : upper ≤ upper * lower := by + have hupper_nonneg : 0 ≤ upper := le_trans zero_le_one hupper_ge_one + simpa [one_mul] using + mul_le_mul_of_nonneg_left hlower_ge_one hupper_nonneg + have hproduct : + upper * lower ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [upper, lower] using + terminalScalarRatioProduct_le_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm + exact hupper_le_product.trans hproduct + +/-- +Source label `l.union.bound`: the inverse-star scalar block of the +terminal/intermediate normalization change is controlled by the initial budget +`T = widetildeTheta_0`. +-/ +theorem terminalInvStarScalarRatio_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) : + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + let upper := + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let lower := + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hjm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 + hP hStruct hP4 m + have hupper_ge_one : 1 ≤ upper := by + rw [show upper = + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) by rfl] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hlower_ge_one : 1 ≤ lower := by + rw [show lower = + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ by rfl] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hlower_le_product : lower ≤ upper * lower := by + have hlower_nonneg : 0 ≤ lower := le_trans zero_le_one hlower_ge_one + simpa [mul_comm, one_mul] using + mul_le_mul_of_nonneg_right hupper_ge_one hlower_nonneg + have hproduct : + upper * lower ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 := by + simpa [upper, lower] using + terminalScalarRatioProduct_le_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm + exact hlower_le_product.trans hproduct + +/-- Source label `e.nodrop`: unfolding the no-drop condition. -/ +@[simp] +theorem no_drop_window_iff (rho F_k F_m : ℝ) : + noDropWindow rho F_k F_m ↔ F_k - F_m ≤ rho * F_m := + Iff.rfl + +/-- +Source label `e.rtau.drop`: if `a,b ≥ 1`, the terminal additivity defect is +absorbed by half of the deterministic contrast drop. +-/ +theorem rtau_drop (r_m a b : ℝ) (ha : 1 ≤ a) (hb : 1 ≤ b) : + r_m * terminalTau r_m a b ≤ (1 / 2 : ℝ) * contrastDrop r_m a b := by + have hprod_nonneg : 0 ≤ (a - 1) * (b - 1) := + mul_nonneg (sub_nonneg.mpr ha) (sub_nonneg.mpr hb) + have hsquare_nonneg : 0 ≤ r_m ^ 2 := sq_nonneg r_m + have hmain : 0 ≤ r_m ^ 2 * ((a - 1) * (b - 1)) := + mul_nonneg hsquare_nonneg hprod_nonneg + rw [contrastDrop, terminalTau] + nlinarith + +/-- +Source label `e.rtau.drop`: formula-facing version using explicit contrast and +terminal-tau hypotheses. +-/ +theorem rtau_drop_of_eq {r_m a b F_j F_m tau : ℝ} + (hF : F_j - F_m = contrastDrop r_m a b) + (htau : tau = terminalTau r_m a b) + (ha : 1 ≤ a) (hb : 1 ≤ b) : + r_m * tau ≤ (1 / 2 : ℝ) * (F_j - F_m) := by + rw [htau, hF] + exact rtau_drop r_m a b ha hb + +/-- +Source label `e.rtau.drop`: library-facing terminal-pair version. The special +vectors `p_e,q_e` identify `tauAtScale` with the terminal scalar `tau`, and the +contrast excesses give the deterministic drop `F_j - F_m`. +-/ +theorem sqrt_contrastExcess_mul_tauAtScale_special_le_half_contrastExcess_drop_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) (e : Homogenization.Vec d) + (he : Homogenization.Book.Ch02.vecNorm e = 1) : + Real.sqrt (1 + contrastExcessAtScale hP hStruct m) * + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (j : ℤ) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) ≤ + (1 / 2 : ℝ) * + (contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m) := by + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + let theta_j := Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) + let theta_m := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + let tau : ℝ := + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (j : ℤ) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hjm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : + 0 < hP.barSigmaStarAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have htheta_m_one : 1 ≤ theta_m := by + simpa [theta_m] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have htheta_m_pos : 0 < theta_m := by linarith + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_sq : r_m ^ 2 = theta_m := by + have harg_nonneg : 0 ≤ 1 + contrastExcessAtScale hP hStruct m := by + have harg_eq : + 1 + contrastExcessAtScale hP hStruct m = theta_m := by + dsimp [contrastExcessAtScale, theta_m] + ring + rw [harg_eq] + exact le_of_lt htheta_m_pos + dsimp [r_m] + rw [Real.sq_sqrt harg_nonneg] + dsimp [contrastExcessAtScale, theta_m] + ring + have hprod_eq : a * b = theta_j / theta_m := by + dsimp [a, b, theta_j, theta_m] + rw [terminalScalarRatioProduct_eq_theta_ratio + (ne_of_gt hbm_pos) (ne_of_gt hcj_pos) (ne_of_gt hcm_pos)] + rfl + have hF : + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m = + contrastDrop r_m a b := by + calc + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m + = theta_j - theta_m := by + dsimp [contrastExcessAtScale, theta_j, theta_m] + ring + _ = theta_m * (theta_j / theta_m - 1) := by + field_simp [ne_of_gt htheta_m_pos] + _ = r_m ^ 2 * (a * b - 1) := by + rw [hr_sq, hprod_eq] + _ = contrastDrop r_m a b := rfl + have hr_eq : + Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) = + r_m := by + dsimp [r_m, contrastExcessAtScale] + congr 1 + ring + have htau0 := + tauAtScale_special_eq_terminalTau_of_P4 hP hStruct hP4 m j hjm e he + have htau : tau = terminalTau r_m a b := by + calc + tau = + Homogenization.Book.Ch05.tauAtScale P (m : ℤ) (j : ℤ) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) := rfl + _ = terminalTau + (Real.sqrt + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + a b := by + simpa [a, b] using htau0 + _ = terminalTau r_m a b := by rw [hr_eq] + have hbase : + r_m * tau ≤ + (1 / 2 : ℝ) * + (contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m) := + rtau_drop_of_eq hF htau ha hb + simpa [r_m, tau] using hbase + +/-- +Source label `e.sqrt.tau.absorb`: library-facing formula for the lower-scale +expected response of the special terminal pair. +-/ +theorem expectedResponseJCubeSet_special_eq_half_terminalP_sub_one_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m k : ℕ) (e : Homogenization.Vec d) + (he : Homogenization.Book.Ch02.vecNorm e = 1) : + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) = + (1 / 2 : ℝ) * + terminalP + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - 1 := by + have he_sq : Homogenization.vecNormSq e = 1 := + Homogenization.Book.Ch05.Section54.GoodScale.vecNormSq_eq_one_of_vecNorm_eq_one + he + let p_e := Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e + let q_e := Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e + have hBlock_k : + MeasureTheory.Integrable + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube + (Homogenization.originCube d (k : ℤ))) P := + Homogenization.Book.Ch05.Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 k + have hresp : + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) p_e q_e = + Homogenization.Book.Ch05.expectedJScalarFormula hP hStruct (k : ℤ) + p_e q_e := by + have h := + Homogenization.Book.Ch05.Section52.annealedResponseJAtScale_eq_expectedJScalarFormula + hP hStruct (k : ℤ) p_e q_e hBlock_k + simpa [Homogenization.Book.Ch04.expectedResponseJCubeSet, + Homogenization.Book.Ch04.annealedResponseJAtScale, + Homogenization.Book.Ch04.responseJAtScale, + Homogenization.Book.Ch04.restrictionResponseJObservableCubeSet] using h + have hspecial : + Homogenization.Book.Ch05.expectedJScalarFormula hP hStruct (k : ℤ) + p_e q_e = + (1 / 2 : ℝ) * + (Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ))⁻¹ * + hP.barSigmaAtScale hStruct (k : ℤ) + + (1 / 2 : ℝ) * + Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) * + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ - 1 := by + simpa [p_e, q_e] using + Homogenization.Book.Ch05.Section54.GoodScale.expectedJScalarFormula_special_eq_of_P4 + hP hStruct hP4 m k e he_sq + let sigma := Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) + let theta := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bk := hP.barSigmaAtScale hStruct (k : ℤ) + let ck := hP.barSigmaStarAtScale hStruct (k : ℤ) + have hbm : 0 < bm := by + simpa [bm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm : 0 < cm := by + simpa [cm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hck : 0 < ck := by + simpa [ck] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 k + have halg : + (1 / 2 : ℝ) * sigma⁻¹ * bk + (1 / 2 : ℝ) * sigma * ck⁻¹ - 1 = + (1 / 2 : ℝ) * + terminalP (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) - 1 := + half_terminalP_sub_one_eq_of_barSigma_ratios hbm hcm hck rfl rfl + calc + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) + = Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) p_e q_e := rfl + _ = Homogenization.Book.Ch05.expectedJScalarFormula hP hStruct (k : ℤ) + p_e q_e := hresp + _ = (1 / 2 : ℝ) * sigma⁻¹ * bk + (1 / 2 : ℝ) * sigma * ck⁻¹ - 1 := by + simpa [sigma, bk, ck] using hspecial + _ = (1 / 2 : ℝ) * + terminalP (Real.sqrt theta) (bk / bm) (ck⁻¹ / cm⁻¹) - 1 := halg + _ = (1 / 2 : ℝ) * + terminalP + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - 1 := by + rfl + +/-- +Source label `e.no.drop.ab`: on a no-drop window, the product excess satisfies +`a * b ≤ 1 + rho`. +-/ +theorem mul_le_one_add_rho_of_no_drop {r_m a b F_j F_k F_m rho : ℝ} + (hno : noDropWindow rho F_k F_m) + (hj_le_k : F_j - F_m ≤ F_k - F_m) + (hF : F_j - F_m = contrastDrop r_m a b) + (hFm_le_sq : F_m ≤ r_m ^ 2) + (hr_sq_pos : 0 < r_m ^ 2) + (hrho_pos : 0 < rho) : + a * b ≤ 1 + rho := by + have hdrop_le : contrastDrop r_m a b ≤ rho * F_m := by + rw [← hF] + exact le_trans hj_le_k hno + have hrho_nonneg : 0 ≤ rho := le_of_lt hrho_pos + have hscale_le : rho * F_m ≤ rho * r_m ^ 2 := + mul_le_mul_of_nonneg_left hFm_le_sq hrho_nonneg + have hcontrast_le : contrastDrop r_m a b ≤ rho * r_m ^ 2 := + le_trans hdrop_le hscale_le + have hmul : + (a * b - 1) * r_m ^ 2 ≤ rho * r_m ^ 2 := by + simpa [contrastDrop, mul_comm, mul_left_comm, mul_assoc] using hcontrast_le + have hab_minus_le : a * b - 1 ≤ rho := + le_of_mul_le_mul_right hmul hr_sq_pos + linarith + +/-- +Source label `e.no.drop.ab`: on a no-drop window, scalar terminal ratios stay +between `1` and `1 + rho`. +-/ +theorem no_drop_ab_bounds {r_m a b F_j F_k F_m rho : ℝ} + (hno : noDropWindow rho F_k F_m) + (hj_le_k : F_j - F_m ≤ F_k - F_m) + (hF : F_j - F_m = contrastDrop r_m a b) + (hFm_le_sq : F_m ≤ r_m ^ 2) + (hr_sq_pos : 0 < r_m ^ 2) + (hrho_pos : 0 < rho) + (ha : 1 ≤ a) (hb : 1 ≤ b) : + 1 ≤ a ∧ a ≤ 1 + rho ∧ 1 ≤ b ∧ b ≤ 1 + rho := by + have hab : a * b ≤ 1 + rho := + mul_le_one_add_rho_of_no_drop hno hj_le_k hF hFm_le_sq hr_sq_pos hrho_pos + have ha_nonneg : 0 ≤ a := le_trans zero_le_one ha + have hb_nonneg : 0 ≤ b := le_trans zero_le_one hb + have ha_le_mul : a ≤ a * b := by + have h := mul_le_mul_of_nonneg_left hb ha_nonneg + simpa using h + have hb_le_mul : b ≤ a * b := by + have h := mul_le_mul_of_nonneg_right ha hb_nonneg + simpa [one_mul] using h + exact ⟨ha, le_trans ha_le_mul hab, hb, le_trans hb_le_mul hab⟩ + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P2.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P2.lean new file mode 100644 index 0000000000..dd45d916cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P2.lean @@ -0,0 +1,949 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.SpecialFunctions.Sqrt +public import Mathlib.Tactic.Abel +public import Mathlib.Tactic.FieldSimp +public import Mathlib.Tactic.Linarith +public import Mathlib.Tactic.Ring +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P1 + +/-! # P2 -/ + +@[expose] public section + +open scoped BigOperators Matrix.Norms.Elementwise +open scoped Matrix.Norms.L2Operator + +namespace Homogenization.HighContrast.EntryScale + +/-- +Source label `e.drift.general`: if both scalar ratios are at least one, then +each diagonal drift entry is bounded by the product excess `a b - 1`. +-/ +theorem abs_sub_one_le_mul_sub_one_of_one_le {a b : ℝ} + (ha : 1 ≤ a) (hb : 1 ≤ b) : + |a - 1| ≤ a * b - 1 ∧ |b - 1| ≤ a * b - 1 := by + have ha_nonneg : 0 ≤ a := le_trans zero_le_one ha + have hb_nonneg : 0 ≤ b := le_trans zero_le_one hb + have ha_sub_nonneg : 0 ≤ a - 1 := sub_nonneg.mpr ha + have hb_sub_nonneg : 0 ≤ b - 1 := sub_nonneg.mpr hb + have ha_le_mul : a ≤ a * b := by + have h := mul_le_mul_of_nonneg_left hb ha_nonneg + simpa using h + have hb_le_mul : b ≤ a * b := by + have h := mul_le_mul_of_nonneg_right ha hb_nonneg + simpa [one_mul] using h + constructor + · rw [abs_of_nonneg ha_sub_nonneg] + linarith + · rw [abs_of_nonneg hb_sub_nonneg] + linarith + +/-- +Euclidean/L2 operator norm of a full block matrix. This is the matrix norm +used by the full `Ahom_m^{-1/2} (...) Ahom_m^{-1/2}` observable in source +label `l.union.bound`. +-/ +noncomputable def fullBlockOperatorNorm {d : ℕ} + (A : Homogenization.FullBlockMat d) : ℝ := + ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ) A‖ + +theorem fullBlockOperatorNorm_eq_l2_opNorm {d : ℕ} + (A : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm A = ‖A‖ := by + exact Matrix.l2_opNorm_toEuclideanCLM + (n := Homogenization.BlockCoord d) (𝕜 := ℝ) A + +theorem fullBlockOperatorNorm_nonneg {d : ℕ} + (A : Homogenization.FullBlockMat d) : + 0 ≤ fullBlockOperatorNorm A := by + exact norm_nonneg _ + +theorem fullBlockOperatorNorm_mul_le {d : ℕ} + (A B : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm (A * B) ≤ + fullBlockOperatorNorm A * fullBlockOperatorNorm B := by + calc + fullBlockOperatorNorm (A * B) + = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) (A * B)‖ := rfl + _ = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A * + Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := by + rw [map_mul] + _ ≤ ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A‖ * + ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := norm_mul_le _ _ + _ = fullBlockOperatorNorm A * fullBlockOperatorNorm B := rfl + +/-- +Source label `l.S.and.J`: squared triangle inequality for the full-block +operator norm, in the form used to split +`A(cu_j) - Ahom_m = (A(cu_j) - Ahom_j) + (Ahom_j - Ahom_m)`. +-/ +theorem fullBlockOperatorNorm_add_sq_le_two_mul_add {d : ℕ} + (A B : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm (A + B) ^ 2 ≤ + 2 * fullBlockOperatorNorm A ^ 2 + 2 * fullBlockOperatorNorm B ^ 2 := by + let a := fullBlockOperatorNorm A + let b := fullBlockOperatorNorm B + have hnorm : fullBlockOperatorNorm (A + B) ≤ a + b := by + calc + fullBlockOperatorNorm (A + B) + = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) (A + B)‖ := rfl + _ = ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A + + Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := by + rw [map_add] + _ ≤ ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) A‖ + + ‖Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) + (𝕜 := ℝ) B‖ := + norm_add_le _ _ + _ = a + b := rfl + have hleft_nonneg : 0 ≤ fullBlockOperatorNorm (A + B) := + fullBlockOperatorNorm_nonneg (A + B) + have hright_nonneg : 0 ≤ a + b := by + exact add_nonneg (fullBlockOperatorNorm_nonneg A) (fullBlockOperatorNorm_nonneg B) + have hsquare : + fullBlockOperatorNorm (A + B) ^ 2 ≤ (a + b) ^ 2 := + (sq_le_sq₀ hleft_nonneg hright_nonneg).2 hnorm + nlinarith [sq_nonneg (a - b)] + +theorem fullBlockOperatorNorm_diagonal {d : ℕ} + (v : Homogenization.BlockCoord d → ℝ) : + fullBlockOperatorNorm (Matrix.diagonal v : Homogenization.FullBlockMat d) = + ‖v‖ := by + rw [fullBlockOperatorNorm_eq_l2_opNorm] + exact Matrix.l2_opNorm_diagonal (𝕜 := ℝ) v + +theorem fullBlockOperatorNorm_diagonal_le_of_forall_norm_le {d : ℕ} + {v : Homogenization.BlockCoord d → ℝ} {R : ℝ} + (hR : 0 ≤ R) (hv : ∀ α, ‖v α‖ ≤ R) : + fullBlockOperatorNorm (Matrix.diagonal v : Homogenization.FullBlockMat d) ≤ R := by + rw [fullBlockOperatorNorm_diagonal] + exact (pi_norm_le_iff_of_nonneg hR).mpr hv + +theorem fullBlockOperatorNorm_diagonal_le_of_forall_abs_le {d : ℕ} + {v : Homogenization.BlockCoord d → ℝ} {R : ℝ} + (hR : 0 ≤ R) (hv : ∀ α, |v α| ≤ R) : + fullBlockOperatorNorm (Matrix.diagonal v : Homogenization.FullBlockMat d) ≤ R := by + exact fullBlockOperatorNorm_diagonal_le_of_forall_norm_le hR + (fun α => by simpa [Real.norm_eq_abs] using hv α) + +/-- +Source label `l.union.bound`: full-block operator-norm bridge for changing +both sides of the terminal normalization. Once the two diagonal change +matrices have norm bounds, this converts them into the corresponding bound for +the full centered block observable. +-/ +theorem fullBlockOperatorNorm_two_sided_mul_le {d : ℕ} + (L X R : Homogenization.FullBlockMat d) {CL CR : ℝ} + (hCL_nonneg : 0 ≤ CL) + (hL : fullBlockOperatorNorm L ≤ CL) + (hR : fullBlockOperatorNorm R ≤ CR) : + fullBlockOperatorNorm (L * X * R) ≤ + CL * CR * fullBlockOperatorNorm X := by + have hX_nonneg : 0 ≤ fullBlockOperatorNorm X := + fullBlockOperatorNorm_nonneg X + have hR_nonneg : 0 ≤ fullBlockOperatorNorm R := + fullBlockOperatorNorm_nonneg R + have hLX : + fullBlockOperatorNorm (L * X) ≤ + fullBlockOperatorNorm L * fullBlockOperatorNorm X := + fullBlockOperatorNorm_mul_le L X + have hLX_bound : + fullBlockOperatorNorm (L * X) ≤ + CL * fullBlockOperatorNorm X := + hLX.trans (mul_le_mul_of_nonneg_right hL hX_nonneg) + have hmain : + fullBlockOperatorNorm (L * X) * fullBlockOperatorNorm R ≤ + (CL * fullBlockOperatorNorm X) * CR := + mul_le_mul hLX_bound hR hR_nonneg (mul_nonneg hCL_nonneg hX_nonneg) + calc + fullBlockOperatorNorm (L * X * R) + ≤ fullBlockOperatorNorm (L * X) * fullBlockOperatorNorm R := + fullBlockOperatorNorm_mul_le (L * X) R + _ ≤ (CL * fullBlockOperatorNorm X) * CR := hmain + _ = CL * CR * fullBlockOperatorNorm X := by ring + +/-- +Source label `l.union.bound`: diagonal entries of the full-block +terminal/intermediate normalization-change matrix, written in terms of the two +scalar ratios +`barSigma_j / barSigma_m` and +`barSigmaStar_j^{-1} / barSigmaStar_m^{-1}`. +-/ +noncomputable def terminalNormalizerChangeDiag {d : ℕ} + (upperRatio invStarRatio : ℝ) : + Homogenization.BlockCoord d → ℝ + | Sum.inl _ => Real.sqrt upperRatio + | Sum.inr _ => Real.sqrt invStarRatio + +/-- +Source label `l.union.bound`: concrete diagonal entries of +`Ahom_m^{-1/2} Ahom_j^{1/2}` in the scalar-block coordinates. +-/ +noncomputable def terminalNormalizerChangeDiagAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) : + Homogenization.BlockCoord d → ℝ := + terminalNormalizerChangeDiag + (d := d) + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) + +/-- +Source label `l.union.bound`: concrete full-block diagonal matrix for +`Ahom_m^{-1/2} Ahom_j^{1/2}`. +-/ +noncomputable def terminalNormalizerChangeMatrixAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) : Homogenization.FullBlockMat d := + Matrix.diagonal (terminalNormalizerChangeDiagAtScales hP hStruct j m) + +/-- +Source label `l.union.bound`: the library's scalar full-block normalizer at one scale, +as the diagonal matrix `Ahom_n^{-1/2}`. +-/ +noncomputable def scalarFullBlockNormalizerMatrixAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (n : ℕ) : Homogenization.FullBlockMat d := + Matrix.diagonal + (Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag + (d := d) + (hP.barSigmaAtScale hStruct (n : ℤ)) + (hP.barSigmaStarAtScale hStruct (n : ℤ))) + +/-- +Source label `l.union.bound`: full-block matrix centered by the scalar +annealed block at scale `center`. +-/ +noncomputable def scalarCenteredFullBlockMatrixAtScale + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (center : ℕ) (Y : Homogenization.FullBlockMat d) : + Homogenization.FullBlockMat d := + Y - Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (center : ℤ)) + +/-- +Source label `e.drift.general`: diagonal entries of the terminal-normalized +annealed drift `Ahom_m^{-1/2} (Ahom_j - Ahom_m) Ahom_m^{-1/2}`. +-/ +noncomputable def terminalAnnealedFullBlockDriftDiagAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) : + Homogenization.BlockCoord d → ℝ + | Sum.inl _ => + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) - 1 + | Sum.inr _ => + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ - 1 + +/-- +Source label `e.drift.general`: the deterministic annealed-drift matrix is +exactly diagonal after terminal scalar normalization. +-/ +theorem terminalAnnealedFullBlockDriftMatrix_eq_diagonal + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) : + scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + (Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (j : ℤ)) - + Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (m : ℤ))) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m = + Matrix.diagonal + (terminalAnnealedFullBlockDriftDiagAtScales hP hStruct j m) := by + classical + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bj := hP.barSigmaAtScale hStruct (j : ℤ) + let cj := hP.barSigmaStarAtScale hStruct (j : ℤ) + have hbm_pos : 0 < bm := by + simpa [bm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : 0 < cm := by + simpa [cm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : 0 < cj := by + simpa [cj] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hbm_sqrt_ne : Real.sqrt bm ≠ 0 := + (Real.sqrt_ne_zero').2 hbm_pos + have hcm_sqrt_ne : Real.sqrt cm ≠ 0 := + (Real.sqrt_ne_zero').2 hcm_pos + have hcm_ne : cm ≠ 0 := ne_of_gt hcm_pos + have hcj_ne : cj ≠ 0 := ne_of_gt hcj_pos + have hcm_inv_ne : cm⁻¹ ≠ 0 := inv_ne_zero hcm_ne + ext α β + by_cases hαβ : α = β + · subst β + cases α with + | inl i => + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal] + field_simp [hbm_sqrt_ne] + rw [Real.sq_sqrt hbm_pos.le] + change (bj - bm) / bm = bj / bm - 1 + field_simp [ne_of_gt hbm_pos] + | inr i => + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal] + field_simp [hcm_sqrt_ne, hcm_ne, hcm_inv_ne] + rw [Real.sq_sqrt hcm_pos.le] + change cm * (1 / cj - 1 / cm) = cm / cj - 1 + field_simp [hcm_ne, hcj_ne] + · cases α with + | inl i => + cases β with + | inl i' => + have hii' : i ≠ i' := by + intro hii' + exact hαβ (by simp [hii']) + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal, hii'] + | inr i' => + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal] + | inr i => + cases β with + | inl i' => + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal] + | inr i' => + have hii' : i ≠ i' := by + intro hii' + exact hαβ (by simp [hii']) + simp [scalarFullBlockNormalizerMatrixAtScale, + terminalAnnealedFullBlockDriftDiagAtScales, + Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale, + Homogenization.Book.Ch02.blockDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + Homogenization.toFullBlockMat, Matrix.mul_apply, Matrix.diagonal, hii'] + +/-- +Source label `e.drift.general`: deterministic annealed-drift norm +`D_{j,m}` from the source proof. +-/ +noncomputable def terminalAnnealedFullBlockDriftAtScales + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) : ℝ := + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + (Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (j : ℤ)) - + Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (m : ℤ))) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) + +/-- Source label `e.drift.general`: `D_{j,m}` is nonnegative. -/ +theorem terminalAnnealedFullBlockDriftAtScales_nonneg + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) : + 0 ≤ terminalAnnealedFullBlockDriftAtScales hP hStruct j m := + fullBlockOperatorNorm_nonneg _ + +/-- +Source label `e.drift.general`: bound `D_{j,m}` by uniform bounds on the two +scalar diagonal entries. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_of_diag_bounds + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) {R : ℝ} + (hR : 0 ≤ R) + (hdiag : + ∀ α, |terminalAnnealedFullBlockDriftDiagAtScales hP hStruct j m α| ≤ R) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ R := by + unfold terminalAnnealedFullBlockDriftAtScales + rw [terminalAnnealedFullBlockDriftMatrix_eq_diagonal hP hStruct hP4 j m] + exact fullBlockOperatorNorm_diagonal_le_of_forall_abs_le hR hdiag + +/-- +Source label `e.drift.general`: source-facing scalar-ratio form of the +pointwise deterministic drift bound. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_of_scalar_ratio_bounds + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) {R : ℝ} + (hR : 0 ≤ R) + (hupper : + |hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) - 1| ≤ R) + (hlower : + |(hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ - 1| ≤ R) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ R := by + refine terminalAnnealedFullBlockDriftAtScales_le_of_diag_bounds + hP hStruct hP4 j m hR ?_ + intro α + cases α with + | inl i => + simpa [terminalAnnealedFullBlockDriftDiagAtScales] using hupper + | inr i => + simpa [terminalAnnealedFullBlockDriftDiagAtScales] using hlower + +/-- +Source label `e.drift.general`: the pointwise deterministic drift is bounded +by the product excess of the two scalar terminal ratios. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_scalar_ratio_product_sub_one + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) + (hupper_one : + 1 ≤ hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + (hlower_one : + 1 ≤ (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - + 1 := by + let upper := + hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let lower := + (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hbounds : |upper - 1| ≤ upper * lower - 1 ∧ + |lower - 1| ≤ upper * lower - 1 := + abs_sub_one_le_mul_sub_one_of_one_le + (by simpa [upper] using hupper_one) + (by simpa [lower] using hlower_one) + have hproduct_one : 1 ≤ upper * lower := by + have hupper_ge_one : 1 ≤ upper := by simpa [upper] using hupper_one + have hlower_ge_one : 1 ≤ lower := by simpa [lower] using hlower_one + have hupper_nonneg : 0 ≤ upper := le_trans zero_le_one hupper_ge_one + have hmul : (1 : ℝ) * 1 ≤ upper * lower := + mul_le_mul hupper_ge_one hlower_ge_one (by norm_num) hupper_nonneg + simpa using hmul + have hR_nonneg : 0 ≤ upper * lower - 1 := sub_nonneg.mpr hproduct_one + refine terminalAnnealedFullBlockDriftAtScales_le_of_scalar_ratio_bounds + hP hStruct hP4 j m (by simpa [upper, lower] using hR_nonneg) ?_ ?_ + · simpa [upper, lower] using hbounds.1 + · simpa [upper, lower] using hbounds.2 + +/-- +Source label `e.drift.general`: under `(P4)` and `j <= m`, the scalar-chain +monotonicity supplies the hypotheses for the product-excess drift bound. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_scalar_ratio_product_sub_one_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - + 1 := by + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hjm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_inv_pos_of_P4 + hP hStruct hP4 m + have hupper_one : + 1 ≤ hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) := by + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hlower_one : + 1 ≤ (hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := by + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + exact + terminalAnnealedFullBlockDriftAtScales_le_scalar_ratio_product_sub_one + hP hStruct hP4 j m hupper_one hlower_one + +/-- +Source label `e.drift.general`: library-facing pointwise drift bound in the +paper's scalar excess notation `F_n = Theta_n - 1`. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_contrastExcess_drop_div_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ + (contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m) / + (1 + contrastExcessAtScale hP hStruct m) := by + let theta_j := Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) + let theta_m := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have htheta_m_one : 1 ≤ theta_m := by + simpa [theta_m] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have htheta_m_pos : 0 < theta_m := by linarith + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : + 0 < hP.barSigmaStarAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hprod_eq : + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) = + theta_j / theta_m := by + rw [terminalScalarRatioProduct_eq_theta_ratio + (ne_of_gt hbm_pos) (ne_of_gt hcj_pos) (ne_of_gt hcm_pos)] + rfl + have hD := + terminalAnnealedFullBlockDriftAtScales_le_scalar_ratio_product_sub_one_of_P4 + hP hStruct hP4 hjm + calc + terminalAnnealedFullBlockDriftAtScales hP hStruct j m + ≤ + (hP.barSigmaAtScale hStruct (j : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) * + ((hP.barSigmaStarAtScale hStruct (j : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - + 1 := hD + _ = theta_j / theta_m - 1 := by rw [hprod_eq] + _ = (theta_j - theta_m) / theta_m := by + field_simp [ne_of_gt htheta_m_pos] + _ = + (contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m) / + (1 + contrastExcessAtScale hP hStruct m) := by + dsimp [contrastExcessAtScale, theta_j, theta_m] + ring + +/-- +Source label `e.tau.sum.absorb`: on a no-drop window `[k,m]`, every +intermediate contrast drop is bounded by the endpoint no-drop budget. +-/ +theorem contrastExcess_drop_le_noDrop_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {rho : ℝ} {k j m : ℕ} + (hno : + noDropWindow rho + (contrastExcessAtScale hP hStruct k) + (contrastExcessAtScale hP hStruct m)) + (hkj : k ≤ j) : + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m ≤ + rho * contrastExcessAtScale hP hStruct m := by + have htheta_jk : + Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) ≤ + Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := k) (m := j) hkj + have hdrop_le : + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m ≤ + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m := by + change + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) - 1) - + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1) ≤ + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) - 1) - + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1) + linarith + exact hdrop_le.trans hno + +/-- +Source label `e.drift.general`: on a no-drop window, the pointwise drift +bound becomes the paper's no-drop form with `F_m = Theta_m - 1`. +-/ +theorem terminalAnnealedFullBlockDriftAtScales_le_noDrop_contrastExcess_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {rho : ℝ} {k j m : ℕ} + (hno : + noDropWindow rho + (contrastExcessAtScale hP hStruct k) + (contrastExcessAtScale hP hStruct m)) + (hkj : k ≤ j) (hjm : j ≤ m) : + terminalAnnealedFullBlockDriftAtScales hP hStruct j m ≤ + rho * contrastExcessAtScale hP hStruct m / + (1 + contrastExcessAtScale hP hStruct m) := by + have hD := + terminalAnnealedFullBlockDriftAtScales_le_contrastExcess_drop_div_of_P4 + hP hStruct hP4 hjm + have htheta_jk : + Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) ≤ + Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.thetaAtScale_mono_of_P4 + hP hStruct hP4 (n := k) (m := j) hkj + have hdrop_le : + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m ≤ + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m := by + change + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (j : ℤ) - 1) - + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1) ≤ + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) - 1) - + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1) + linarith + have hdrop_no : + contrastExcessAtScale hP hStruct j - + contrastExcessAtScale hP hStruct m ≤ + rho * contrastExcessAtScale hP hStruct m := + hdrop_le.trans hno + have hden_pos : 0 < 1 + contrastExcessAtScale hP hStruct m := by + have htheta_one : + 1 ≤ Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + change 0 < 1 + (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) - 1) + linarith + exact hD.trans + (div_le_div_of_nonneg_right hdrop_no (le_of_lt hden_pos)) + +private theorem sqrt_div_mul_inv_sqrt_eq_inv_sqrt {a b : ℝ} + (ha : 0 < a) (hb : 0 < b) : + Real.sqrt (a / b) * (Real.sqrt a)⁻¹ = (Real.sqrt b)⁻¹ := by + have hsa : Real.sqrt a ≠ 0 := (Real.sqrt_ne_zero').2 ha + have hsb : Real.sqrt b ≠ 0 := (Real.sqrt_ne_zero').2 hb + rw [Real.sqrt_div ha.le b] + field_simp [hsa, hsb] + +private theorem sqrt_inv_mul_mul_sqrt_eq_sqrt {a b : ℝ} + (ha : 0 < a) (hb : 0 < b) : + Real.sqrt (a⁻¹ * b) * Real.sqrt a = Real.sqrt b := by + have hsa : Real.sqrt a ≠ 0 := (Real.sqrt_ne_zero').2 ha + have hratio : a⁻¹ * b = b / a := by + field_simp [ha.ne'] + rw [hratio, Real.sqrt_div hb.le a] + field_simp [hsa] + +theorem terminalNormalizerChangeMatrixAtScales_mul_scalarFullBlockNormalizerMatrixAtScale_eq + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) : + terminalNormalizerChangeMatrixAtScales hP hStruct j m * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j = + scalarFullBlockNormalizerMatrixAtScale hP hStruct m := by + have hbj_pos : + 0 < hP.barSigmaAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 j + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : + 0 < hP.barSigmaStarAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + unfold terminalNormalizerChangeMatrixAtScales + unfold scalarFullBlockNormalizerMatrixAtScale + rw [Matrix.diagonal_mul_diagonal] + ext α β + by_cases hαβ : α = β + · subst β + cases α with + | inl i => + simp [terminalNormalizerChangeDiagAtScales, terminalNormalizerChangeDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + sqrt_div_mul_inv_sqrt_eq_inv_sqrt hbj_pos hbm_pos] + | inr i => + simp [terminalNormalizerChangeDiagAtScales, terminalNormalizerChangeDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, + sqrt_inv_mul_mul_sqrt_eq_sqrt hcj_pos hcm_pos] + · simp [Matrix.diagonal, hαβ] + +theorem scalarFullBlockNormalizerMatrixAtScale_mul_terminalNormalizerChangeMatrixAtScales_eq + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (j m : ℕ) : + scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + terminalNormalizerChangeMatrixAtScales hP hStruct j m = + scalarFullBlockNormalizerMatrixAtScale hP hStruct m := by + have hbj_pos : + 0 < hP.barSigmaAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 j + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcj_pos : + 0 < hP.barSigmaStarAtScale hStruct (j : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 j + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + unfold terminalNormalizerChangeMatrixAtScales + unfold scalarFullBlockNormalizerMatrixAtScale + rw [Matrix.diagonal_mul_diagonal] + ext α β + by_cases hαβ : α = β + · subst β + cases α with + | inl i => + simpa [terminalNormalizerChangeDiagAtScales, terminalNormalizerChangeDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, mul_comm] using + sqrt_div_mul_inv_sqrt_eq_inv_sqrt hbj_pos hbm_pos + | inr i => + simpa [terminalNormalizerChangeDiagAtScales, terminalNormalizerChangeDiag, + Homogenization.Book.Ch04.scalarFullBlockInvSqrtDiag, mul_comm] using + sqrt_inv_mul_mul_sqrt_eq_sqrt hcj_pos hcm_pos + · simp [Matrix.diagonal, hαβ] + +theorem fullBlockOperatorNorm_terminalNormalizerChangeDiag_le_sqrt_of_bounds + {d : ℕ} {upperRatio invStarRatio T : ℝ} + (hupper : upperRatio ≤ T) + (hinvStar : invStarRatio ≤ T) : + fullBlockOperatorNorm + (Matrix.diagonal + (terminalNormalizerChangeDiag (d := d) upperRatio invStarRatio) : + Homogenization.FullBlockMat d) ≤ + Real.sqrt T := by + rw [fullBlockOperatorNorm_diagonal] + refine (pi_norm_le_iff_of_nonneg (Real.sqrt_nonneg T)).mpr ?_ + intro α + cases α with + | inl i => + simpa [terminalNormalizerChangeDiag, Real.norm_eq_abs, + abs_of_nonneg (Real.sqrt_nonneg upperRatio)] using + Real.sqrt_le_sqrt hupper + | inr i => + simpa [terminalNormalizerChangeDiag, Real.norm_eq_abs, + abs_of_nonneg (Real.sqrt_nonneg invStarRatio)] using + Real.sqrt_le_sqrt hinvStar + +/-- +Source label `l.union.bound`: the concrete terminal/intermediate diagonal +normalization-change matrix has full-block operator norm at most +`sqrt widetildeTheta_0`. +-/ +theorem fullBlockOperatorNorm_terminalNormalizerChangeMatrixAtScales_le_sqrt_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) : + fullBlockOperatorNorm + (terminalNormalizerChangeMatrixAtScales hP hStruct j m) ≤ + Real.sqrt + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) := by + unfold terminalNormalizerChangeMatrixAtScales + unfold terminalNormalizerChangeDiagAtScales + exact + fullBlockOperatorNorm_terminalNormalizerChangeDiag_le_sqrt_of_bounds + (terminalUpperScalarRatio_le_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm) + (terminalInvStarScalarRatio_le_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm) + +/-- +Source label `l.union.bound`: changing both sides of a full-block observable +from intermediate scale `j` to terminal scale `m` costs at most the corrected +initial contrast budget `T = widetildeTheta_0`. +-/ +theorem fullBlockOperatorNorm_terminalNormalizerChange_two_sided_le_initialWidetildeTheta_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) (X : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm + (terminalNormalizerChangeMatrixAtScales hP hStruct j m * X * + terminalNormalizerChangeMatrixAtScales hP hStruct j m) ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 * + fullBlockOperatorNorm X := by + let T := Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 + let D : Homogenization.FullBlockMat d := + terminalNormalizerChangeMatrixAtScales hP hStruct j m + have hD : fullBlockOperatorNorm D ≤ Real.sqrt T := by + simpa [D, T] using + fullBlockOperatorNorm_terminalNormalizerChangeMatrixAtScales_le_sqrt_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm + have hsqrt_nonneg : 0 ≤ Real.sqrt T := Real.sqrt_nonneg T + have htwo := + fullBlockOperatorNorm_two_sided_mul_le + (L := D) (X := X) (R := D) + (CL := Real.sqrt T) (CR := Real.sqrt T) + hsqrt_nonneg hD hD + have hT_nonneg : 0 ≤ T := by + have hT_one : 1 ≤ T := by + simpa [T] using one_le_initialWidetildeTheta_of_P4 hP hStruct hP4 + linarith + calc + fullBlockOperatorNorm + (terminalNormalizerChangeMatrixAtScales hP hStruct j m * X * + terminalNormalizerChangeMatrixAtScales hP hStruct j m) + = fullBlockOperatorNorm (D * X * D) := by rfl + _ ≤ Real.sqrt T * Real.sqrt T * fullBlockOperatorNorm X := htwo + _ = T * fullBlockOperatorNorm X := by + rw [← pow_two, Real.sq_sqrt hT_nonneg] + +/-- +Source label `l.union.bound`: terminal normalization of a block centered at +scale `j` costs at most `T = widetildeTheta_0` times the same centered block +with its intermediate-scale normalization. +-/ +theorem fullBlockOperatorNorm_terminalNormalizedCenteredFullBlock_le_initialWidetildeTheta_mul_intermediate_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) (Y : Homogenization.FullBlockMat d) : + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) ≤ + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 * + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j) := by + let T := Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 + let E : Homogenization.FullBlockMat d := + terminalNormalizerChangeMatrixAtScales hP hStruct j m + let Dj : Homogenization.FullBlockMat d := + scalarFullBlockNormalizerMatrixAtScale hP hStruct j + let Dm : Homogenization.FullBlockMat d := + scalarFullBlockNormalizerMatrixAtScale hP hStruct m + let C : Homogenization.FullBlockMat d := + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y + have hleft : E * Dj = Dm := by + simpa [E, Dj, Dm] using + terminalNormalizerChangeMatrixAtScales_mul_scalarFullBlockNormalizerMatrixAtScale_eq + hP hStruct hP4 j m + have hright : Dj * E = Dm := by + simpa [E, Dj, Dm] using + scalarFullBlockNormalizerMatrixAtScale_mul_terminalNormalizerChangeMatrixAtScales_eq + hP hStruct hP4 j m + have hfactor : + Dm * C * Dm = E * (Dj * C * Dj) * E := by + calc + Dm * C * Dm = (E * Dj) * C * (Dj * E) := by + rw [hleft, hright] + _ = E * (Dj * C * Dj) * E := by + simp [mul_assoc] + have hnorm := + fullBlockOperatorNorm_terminalNormalizerChange_two_sided_le_initialWidetildeTheta_of_P4 + hP hStruct hP4 hjm (Dj * C * Dj) + calc + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) + = fullBlockOperatorNorm (Dm * C * Dm) := by rfl + _ = fullBlockOperatorNorm (E * (Dj * C * Dj) * E) := by rw [hfactor] + _ ≤ T * fullBlockOperatorNorm (Dj * C * Dj) := by + simpa [T, E] using hnorm + _ = + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 * + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j) := by + rfl + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P3.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P3.lean new file mode 100644 index 0000000000..f19b241be2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P3.lean @@ -0,0 +1,945 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.SpecialFunctions.Sqrt +public import Mathlib.Tactic.Abel +public import Mathlib.Tactic.FieldSimp +public import Mathlib.Tactic.Linarith +public import Mathlib.Tactic.Ring +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P1 +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra.P2 + +/-! # P3 -/ + +@[expose] public section + +open scoped BigOperators Matrix.Norms.Elementwise +open scoped Matrix.Norms.L2Operator + +namespace Homogenization.HighContrast.EntryScale + +/-- +Source label `l.union.bound`: `ENNReal` form of the terminal/intermediate +normalization comparison, ready to combine with the high-moment envelope. +-/ +theorem ofReal_fullBlockOperatorNorm_terminalNormalizedCenteredFullBlock_le_initialWidetildeTheta_mul_intermediate_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {j m : ℕ} (hjm : j ≤ m) (Y : Homogenization.FullBlockMat d) : + ENNReal.ofReal + (fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m)) ≤ + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) * + ENNReal.ofReal + (fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j)) := by + let T := Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 + let terminalNorm : ℝ := + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) + let intermediateNorm : ℝ := + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j) + have hT_nonneg : 0 ≤ T := by + have hT_one : 1 ≤ T := by + simpa [T] using one_le_initialWidetildeTheta_of_P4 hP hStruct hP4 + linarith + have hreal : terminalNorm ≤ T * intermediateNorm := by + simpa [terminalNorm, intermediateNorm, T] using + fullBlockOperatorNorm_terminalNormalizedCenteredFullBlock_le_initialWidetildeTheta_mul_intermediate_of_P4 + hP hStruct hP4 hjm Y + calc + ENNReal.ofReal terminalNorm ≤ ENNReal.ofReal (T * intermediateNorm) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal T * ENNReal.ofReal intermediateNorm := by + rw [ENNReal.ofReal_mul hT_nonneg] + +/-- +Source label `a.HM`: concrete intermediate-scale centered full-block deviation. +The matrix argument `Y j Q ω` is the full-block coarse coefficient matrix +attached to the cube `Q`; the normalization and centering are both at scale `j`. +-/ +noncomputable def intermediateCenteredFullBlockDeviation + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (Y : ℕ → Homogenization.TriadicCube d → Ω → Homogenization.FullBlockMat d) : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal := + fun j Q ω => + ENNReal.ofReal + (fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct j * + scalarCenteredFullBlockMatrixAtScale hP hStruct j (Y j Q ω) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct j)) + +/-- +Source label `l.union.bound`: terminal-scale normalization of the same +full-block matrix centered at scale `j`. +-/ +noncomputable def terminalCenteredFullBlockDeviation + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) + (Y : ℕ → Homogenization.TriadicCube d → Ω → Homogenization.FullBlockMat d) : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal := + fun j Q ω => + ENNReal.ofReal + (fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j (Y j Q ω) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m)) + +/-- +Source labels `a.HM` and `l.union.bound`: the terminal-normalized concrete +centered full-block deviation is bounded by `T = widetildeTheta_0` times the +intermediate-normalized deviation from the high-moment hypothesis. +-/ +theorem terminalCenteredFullBlockDeviation_le_initialWidetildeTheta_mul_intermediate_of_P4 + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (m : ℕ) + (Y : ℕ → Homogenization.TriadicCube d → Ω → Homogenization.FullBlockMat d) + {j : ℕ} (hjm : j ≤ m) (Q : Homogenization.TriadicCube d) (ω : Ω) : + terminalCenteredFullBlockDeviation hP hStruct m Y j Q ω ≤ + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) * + intermediateCenteredFullBlockDeviation hP hStruct Y j Q ω := by + unfold terminalCenteredFullBlockDeviation + unfold intermediateCenteredFullBlockDeviation + exact + ofReal_fullBlockOperatorNorm_terminalNormalizedCenteredFullBlock_le_initialWidetildeTheta_mul_intermediate_of_P4 + hP hStruct hP4 hjm (Y j Q ω) + +/-- +Source label `a.HM`: the library's full-block coarse matrix process on a triadic cube. +The scale parameter is present only to match the high-moment observable shape. +-/ +noncomputable def coarseFullBlockMatrixAtCubeProcess + {Ω : Type*} {d : ℕ} (a : Ω → Homogenization.RegCoeffField d) : + ℕ → Homogenization.TriadicCube d → Ω → Homogenization.FullBlockMat d := + fun _j Q ω => Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube Q (a ω) + +/-- +Source label `a.HM`: the manuscript's intermediate-normalized centered +coarse-block deviation +`|Ahom_j^{-1/2} (bfA(Q)-Ahom_j) Ahom_j^{-1/2}|`. +-/ +noncomputable def intermediateCoarseBlockDeviation + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (a : Ω → Homogenization.RegCoeffField d) : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal := + intermediateCenteredFullBlockDeviation hP hStruct + (coarseFullBlockMatrixAtCubeProcess a) + +/-- +Source label `l.union.bound`: terminal-normalized centered coarse-block +deviation used in the maximal union bound. +-/ +noncomputable def terminalCoarseBlockDeviation + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (a : Ω → Homogenization.RegCoeffField d) : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal := + terminalCenteredFullBlockDeviation hP hStruct m + (coarseFullBlockMatrixAtCubeProcess a) + +/-- +Source label `l.S.and.J`: the library's squared terminal full-block fluctuation +observable is the square of the local full-block operator norm with the same +terminal normalization. +-/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_terminal_norm_sq + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) : + Homogenization.Book.Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a = + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct m + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube Q a) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) ^ 2 := by + simp [Homogenization.Book.Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale, + Homogenization.Book.Ch04.fullBlockNormalizedFluctuationOperatorNormSq, + Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube, + Homogenization.coarseFullBlockMatrixObservable, + scalarFullBlockNormalizerMatrixAtScale, scalarCenteredFullBlockMatrixAtScale, + fullBlockOperatorNorm] + +/-- +Source label `l.S.and.J`: deterministic split of the library's terminal full-block +fluctuation into the stochastic centered-at-`j` block and the deterministic +annealed drift `Ahom_j - Ahom_m`. +-/ +theorem fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_two_stochastic_add_two_drift + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (j m : ℕ) (Q : Homogenization.TriadicCube d) + (a : Homogenization.RegCoeffField d) : + Homogenization.Book.Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale + hP hStruct (m : ℤ) Q a ≤ + 2 * + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube Q a) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) ^ 2 + + 2 * + fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + (Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (j : ℤ)) - + Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (m : ℤ))) * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m) ^ 2 := by + let Dm := scalarFullBlockNormalizerMatrixAtScale hP hStruct m + let A := Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube Q a + let Aj := + Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (j : ℤ)) + let Am := + Homogenization.toFullBlockMat + (Homogenization.Book.Ch04.scalarAnnealedBlockMatrixAtScale + hP hStruct (m : ℤ)) + have hcenter : + scalarCenteredFullBlockMatrixAtScale hP hStruct m A = + scalarCenteredFullBlockMatrixAtScale hP hStruct j A + (Aj - Am) := by + dsimp [scalarCenteredFullBlockMatrixAtScale, A, Aj, Am] + abel + have hsplit : + Dm * scalarCenteredFullBlockMatrixAtScale hP hStruct m A * Dm = + Dm * scalarCenteredFullBlockMatrixAtScale hP hStruct j A * Dm + + Dm * (Aj - Am) * Dm := by + rw [hcenter, mul_add, add_mul] + rw [fullBlockNormalizedFluctuationOperatorNormSqAtScale_eq_terminal_norm_sq + hP hStruct m Q a] + rw [show scalarFullBlockNormalizerMatrixAtScale hP hStruct m = Dm from rfl] + rw [show Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube Q a = A from rfl] + rw [hsplit] + exact fullBlockOperatorNorm_add_sq_le_two_mul_add + (Dm * scalarCenteredFullBlockMatrixAtScale hP hStruct j A * Dm) + (Dm * (Aj - Am) * Dm) + +/-- +Source label `e.P.bound`: if `a,b ≤ 1 + rho` and `rho ≤ 1`, then +`P_{k,m} = r_m(a+b)` is at most `4 r_m`. +-/ +theorem terminal_p_le_four_mul_of_ab_bounds {r_m a b rho : ℝ} + (hr_nonneg : 0 ≤ r_m) + (hrho_le_one : rho ≤ 1) + (ha : a ≤ 1 + rho) (hb : b ≤ 1 + rho) : + terminalP r_m a b ≤ 4 * r_m := by + have hab_sum : a + b ≤ 4 := by + linarith + have hmul := mul_le_mul_of_nonneg_left hab_sum hr_nonneg + simpa [terminalP, mul_comm, mul_left_comm, mul_assoc] using hmul + +/-- +Source label `e.P.bound`: no-drop version of the terminal prefactor bound. +-/ +theorem p_bound_of_no_drop {r_m a b F_k F_m rho P_km : ℝ} + (hno : noDropWindow rho F_k F_m) + (hF : F_k - F_m = contrastDrop r_m a b) + (hP : P_km = terminalP r_m a b) + (hFm_le_sq : F_m ≤ r_m ^ 2) + (hr_sq_pos : 0 < r_m ^ 2) + (hr_nonneg : 0 ≤ r_m) + (hrho_pos : 0 < rho) + (hrho_le_one : rho ≤ 1) + (ha : 1 ≤ a) (hb : 1 ≤ b) : + P_km ≤ 4 * r_m := by + have hbounds : + 1 ≤ a ∧ a ≤ 1 + rho ∧ 1 ≤ b ∧ b ≤ 1 + rho := + no_drop_ab_bounds hno (le_refl (F_k - F_m)) hF hFm_le_sq hr_sq_pos + hrho_pos ha hb + rw [hP] + exact terminal_p_le_four_mul_of_ab_bounds hr_nonneg hrho_le_one hbounds.2.1 + hbounds.2.2.2 + +/-- Source label `e.P.bound`: the concrete terminal prefactor is nonnegative. -/ +theorem terminalPAtScales_nonneg_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) : + 0 ≤ terminalPAtScales hP hStruct k m := by + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hkm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_nonneg : 0 ≤ r_m := by + dsimp [r_m] + exact Real.sqrt_nonneg _ + have hsum_nonneg : 0 ≤ a + b := by linarith + have hmain : 0 ≤ terminalP r_m a b := by + exact mul_nonneg hr_nonneg hsum_nonneg + simpa [terminalPAtScales, terminalP, r_m, a, b] using hmain + +/-- +Source labels `p.HC.CR` and `e.P.bound`: the concrete terminal prefactor +dominates the terminal square-root scale. Under `(P4)`, the scalar ratios +`a_{k,m}` and `b_{k,m}` are each at least one, so +`P_{k,m} = r_m (a_{k,m}+b_{k,m})` is in particular at least `r_m`. +-/ +theorem sqrt_one_add_contrastExcessAtScale_le_terminalPAtScales_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) : + Real.sqrt (1 + contrastExcessAtScale hP hStruct m) ≤ + terminalPAtScales hP hStruct k m := by + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hkm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_nonneg : 0 ≤ r_m := by + dsimp [r_m] + exact Real.sqrt_nonneg _ + have hsum : 1 ≤ a + b := by + linarith + have hmain : r_m ≤ terminalP r_m a b := by + calc + r_m = r_m * 1 := by ring + _ ≤ r_m * (a + b) := mul_le_mul_of_nonneg_left hsum hr_nonneg + _ = terminalP r_m a b := by rfl + simpa [terminalPAtScales, terminalP, r_m, a, b] using hmain + +/-- +Source labels `p.HC.CR` and `e.P.bound`: the terminal prefactor dominates +twice the library's scalar `sqrt(theta_m)`. Under `(P4)` both scalar ratios +`a_{k,m}` and `b_{k,m}` are at least one, so +`P_{k,m} = r_m (a_{k,m} + b_{k,m}) >= 2 r_m = 2 sqrt(theta_m)`. This is the +sharp pricing needed to pay the summed-weight first-power source split with +`2 * r_m` instead of the crude `2 * (1 + F_m)`. +-/ +theorem two_mul_sqrtTheta_le_terminalPAtScales_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) : + 2 * Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) ≤ + terminalPAtScales hP hStruct k m := by + have htheta : + Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) = + 1 + contrastExcessAtScale hP hStruct m := by + dsimp [contrastExcessAtScale] + ring + rw [htheta] + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hkm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_nonneg : 0 ≤ r_m := by + dsimp [r_m] + exact Real.sqrt_nonneg _ + have hsum : 2 ≤ a + b := by + linarith + have hmain : 2 * r_m ≤ terminalP r_m a b := by + calc + 2 * r_m = r_m * 2 := by ring + _ ≤ r_m * (a + b) := mul_le_mul_of_nonneg_left hsum hr_nonneg + _ = terminalP r_m a b := by rfl + simpa [terminalPAtScales, terminalP, r_m, a, b] using hmain + +/-- +Source labels `p.HC.CR` and `e.P.bound`: the local weak-norm scalar +coefficient is exactly the manuscript terminal prefactor `P_{k,m}`. +-/ +theorem localWeakNormScalarWeightAtScales_eq_terminalPAtScales_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (k m : ℕ) : + localWeakNormScalarWeightAtScales hP hStruct k m = + terminalPAtScales hP hStruct k m := by + let sigma := Homogenization.Book.Ch05.sigmaHatAtScale hP hStruct (m : ℤ) + let theta := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + let bm := hP.barSigmaAtScale hStruct (m : ℤ) + let cm := hP.barSigmaStarAtScale hStruct (m : ℤ) + let bk := hP.barSigmaAtScale hStruct (k : ℤ) + let ck := hP.barSigmaStarAtScale hStruct (k : ℤ) + have hbm : 0 < bm := by + simpa [bm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm : 0 < cm := by + simpa [cm] using + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hsigma : sigma = Real.sqrt (bm * cm) := by + rfl + have htheta : theta = bm * cm⁻¹ := by + rfl + have hsqrt_bar : bm * sigma⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.barSigma_mul_inv_sigma_eq_sqrt_theta + hbm hcm hsigma htheta + have hsqrt_star : sigma * cm⁻¹ = Real.sqrt theta := + Homogenization.Book.Ch05.Section54.GoodScale.sigma_mul_inv_star_eq_sqrt_theta + hbm hcm hsigma htheta + have harg : 1 + contrastExcessAtScale hP hStruct m = theta := by + dsimp [contrastExcessAtScale, theta] + ring + have hbar_term : Real.sqrt theta * (bk / bm) = sigma⁻¹ * bk := by + rw [← hsqrt_bar] + field_simp [ne_of_gt hbm] + have hstar_term : Real.sqrt theta * (ck⁻¹ / cm⁻¹) = sigma * ck⁻¹ := by + rw [← hsqrt_star] + rw [div_eq_mul_inv, inv_inv] + field_simp [ne_of_gt hcm] + change + sigma * ck⁻¹ + sigma⁻¹ * bk = + Real.sqrt (1 + contrastExcessAtScale hP hStruct m) * + (bk / bm + ck⁻¹ / cm⁻¹) + rw [harg, mul_add, hbar_term, hstar_term] + ring + +/-- +Source label `e.P.bound`: on a no-drop window, the concrete terminal +prefactor satisfies `P_{k,m} <= 4 r_m`. +-/ +theorem terminalPAtScales_le_four_mul_sqrt_contrastExcess_of_noDrop_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) {rho : ℝ} + (hno : + noDropWindow rho + (contrastExcessAtScale hP hStruct k) + (contrastExcessAtScale hP hStruct m)) + (hrho_pos : 0 < rho) (hrho_le_one : rho ≤ 1) : + terminalPAtScales hP hStruct k m ≤ + 4 * Real.sqrt (1 + contrastExcessAtScale hP hStruct m) := by + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + let theta_k := Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) + let theta_m := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hkm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hck_pos : + 0 < hP.barSigmaStarAtScale hStruct (k : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 k + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have htheta_m_one : 1 ≤ theta_m := by + simpa [theta_m] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have htheta_m_pos : 0 < theta_m := by linarith + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_sq : r_m ^ 2 = theta_m := by + have harg_nonneg : 0 ≤ 1 + contrastExcessAtScale hP hStruct m := by + have harg_eq : + 1 + contrastExcessAtScale hP hStruct m = theta_m := by + dsimp [contrastExcessAtScale, theta_m] + ring + rw [harg_eq] + exact le_of_lt htheta_m_pos + dsimp [r_m] + rw [Real.sq_sqrt harg_nonneg] + dsimp [contrastExcessAtScale, theta_m] + ring + have hprod_eq : a * b = theta_k / theta_m := by + dsimp [a, b, theta_k, theta_m] + rw [terminalScalarRatioProduct_eq_theta_ratio + (ne_of_gt hbm_pos) (ne_of_gt hck_pos) (ne_of_gt hcm_pos)] + rfl + have hF : + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m = + contrastDrop r_m a b := by + calc + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m + = theta_k - theta_m := by + dsimp [contrastExcessAtScale, theta_k, theta_m] + ring + _ = theta_m * (theta_k / theta_m - 1) := by + field_simp [ne_of_gt htheta_m_pos] + _ = r_m ^ 2 * (a * b - 1) := by + rw [hr_sq, hprod_eq] + _ = contrastDrop r_m a b := rfl + have hFm_le_sq : + contrastExcessAtScale hP hStruct m ≤ r_m ^ 2 := by + rw [hr_sq] + dsimp [contrastExcessAtScale, theta_m] + linarith + have hr_sq_pos : 0 < r_m ^ 2 := by + rw [hr_sq] + exact htheta_m_pos + have hr_nonneg : 0 ≤ r_m := by + dsimp [r_m] + exact Real.sqrt_nonneg _ + have hP_le : + terminalP r_m a b ≤ 4 * r_m := + p_bound_of_no_drop hno hF rfl hFm_le_sq hr_sq_pos hr_nonneg + hrho_pos hrho_le_one ha hb + simpa [terminalPAtScales, r_m, a, b] using hP_le + +/-- +Scalar KEY CHECK for the linear edge-memory channel (Layer B). + +The linear residual factor `terminalP / (1 + F_k)` collapses to a bounded +constant `4` whenever `F_m ≤ F_k` (contrast antitonicity on a window with +`k ≤ m`), `0 ≤ F_m`, and `terminalP ≤ 4 √(1 + F_m)`: the `1 / (1 + F_k)` +denominator eats the `√(1 + F_m)` numerator down to at most `1`, because +`√(1 + F_m) ≤ 1 + F_m ≤ 1 + F_k`. Hence the H-linear residual +`(H / (1 + F_k)) · terminalP` is at most `4 · H`, with no leftover `√(1 + F)`. -/ +theorem linearEdgeMemory_factor_le_four_of_le {H terminalP F_k F_m : ℝ} + (hH_nonneg : 0 ≤ H) + (hFm_nonneg : 0 ≤ F_m) + (hFm_le_Fk : F_m ≤ F_k) + (hP_le : terminalP ≤ 4 * Real.sqrt (1 + F_m)) : + (H / (1 + F_k)) * terminalP ≤ 4 * H := by + have hFk_nonneg : 0 ≤ F_k := le_trans hFm_nonneg hFm_le_Fk + have hden_pos : 0 < 1 + F_k := by linarith + have hden_m_pos : 0 < 1 + F_m := by linarith + -- `√(1 + F_m) ≤ 1 + F_k`, since `1 + F_m ≤ (1 + F_k)^2`. + have hsqrt_le : Real.sqrt (1 + F_m) ≤ 1 + F_k := by + rw [Real.sqrt_le_left (le_of_lt hden_pos)] + nlinarith + have hsqrt_nonneg : 0 ≤ Real.sqrt (1 + F_m) := Real.sqrt_nonneg _ + -- `(H / (1+F_k)) · terminalP ≤ (H / (1+F_k)) · 4 √(1+F_m) ≤ 4 H`. + have hdiv_nonneg : 0 ≤ H / (1 + F_k) := + div_nonneg hH_nonneg (le_of_lt hden_pos) + calc + (H / (1 + F_k)) * terminalP + ≤ (H / (1 + F_k)) * (4 * Real.sqrt (1 + F_m)) := + mul_le_mul_of_nonneg_left hP_le hdiv_nonneg + _ = (4 * H) * (Real.sqrt (1 + F_m) / (1 + F_k)) := by + rw [div_mul_eq_mul_div, mul_div_assoc] + ring + _ ≤ (4 * H) * 1 := by + have hratio_le : Real.sqrt (1 + F_m) / (1 + F_k) ≤ 1 := + (div_le_one hden_pos).mpr hsqrt_le + exact mul_le_mul_of_nonneg_left hratio_le (by positivity) + _ = 4 * H := by ring + +/-- +Concrete KEY CHECK for the linear edge-memory channel (Layer B): on a +no-drop window `k = i-1`, `m = i` with `k ≤ m`, the H-linear edge-memory +residual factor `terminalPAtScales / (1 + F_k)` collapses so that +`(H / (1 + F_k)) · terminalPAtScales ≤ 4 · H`. The `terminalPAtScales` +factor is thus **fully absorbable into an `A·H` (linear-memory) channel**: it +reduces to `4·H` up to fixed no-drop constants, leaving no residual `√(1+F)`. -/ +theorem linearEdgeMemory_terminalPAtScales_factor_le_four_of_noDrop_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) {rho H : ℝ} + (hno : + noDropWindow rho + (contrastExcessAtScale hP hStruct k) + (contrastExcessAtScale hP hStruct m)) + (hrho_pos : 0 < rho) (hrho_le_one : rho ≤ 1) + (hH_nonneg : 0 ≤ H) : + (H / (1 + contrastExcessAtScale hP hStruct k)) * + terminalPAtScales hP hStruct k m ≤ + 4 * H := by + have hP_le : + terminalPAtScales hP hStruct k m ≤ + 4 * Real.sqrt (1 + contrastExcessAtScale hP hStruct m) := + terminalPAtScales_le_four_mul_sqrt_contrastExcess_of_noDrop_of_P4 + hP hStruct hP4 hkm hno hrho_pos hrho_le_one + have hFm_nonneg : 0 ≤ contrastExcessAtScale hP hStruct m := + contrastExcessAtScale_nonneg_of_P4 hP hStruct hP4 m + have hFm_le_Fk : + contrastExcessAtScale hP hStruct m ≤ + contrastExcessAtScale hP hStruct k := + contrastExcessAtScale_antitone_of_P4 hP hStruct hP4 hkm + exact linearEdgeMemory_factor_le_four_of_le hH_nonneg hFm_nonneg + hFm_le_Fk hP_le + +/-- +Source label `e.sqrt.tau.absorb`: on a no-drop window, the expected +lower-scale response of the special terminal pair is at most `2 r_m`. +-/ +theorem expectedResponseJCubeSet_special_le_two_mul_sqrt_contrastExcess_of_noDrop_of_P4 + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {k m : ℕ} (hkm : k ≤ m) {rho : ℝ} + (hno : + noDropWindow rho + (contrastExcessAtScale hP hStruct k) + (contrastExcessAtScale hP hStruct m)) + (hrho_pos : 0 < rho) (hrho_le_one : rho ≤ 1) + (e : Homogenization.Vec d) + (he : Homogenization.Book.Ch02.vecNorm e = 1) : + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) ≤ + 2 * Real.sqrt (1 + contrastExcessAtScale hP hStruct m) := by + let r_m : ℝ := Real.sqrt (1 + contrastExcessAtScale hP hStruct m) + let a : ℝ := + hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ) + let b : ℝ := + (hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ + let theta_k := Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) + let theta_m := Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ) + have hchain := + Homogenization.Book.Ch05.Section54.Pigeonhole.scalarChain_of_P4 + hP hStruct hP4 hkm + have hbm_pos : + 0 < hP.barSigmaAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaAtScale_pos_of_P4 + hP hStruct hP4 m + have hck_pos : + 0 < hP.barSigmaStarAtScale hStruct (k : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 k + have hcm_pos : + 0 < hP.barSigmaStarAtScale hStruct (m : ℤ) := + Homogenization.Book.Ch05.Section54.Pigeonhole.barSigmaStarAtScale_pos_of_P4 + hP hStruct hP4 m + have hcm_inv_pos : + 0 < (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹ := + inv_pos.mpr hcm_pos + have htheta_m_one : 1 ≤ theta_m := by + simpa [theta_m] using + Homogenization.Book.Ch05.Section54.GoodScale.one_le_thetaAtScale_of_P4 + hP hStruct hP4 m + have htheta_m_pos : 0 < theta_m := by linarith + have ha : 1 ≤ a := by + dsimp [a] + rw [le_div_iff₀ hbm_pos] + simpa using hchain.2.2 + have hb : 1 ≤ b := by + dsimp [b] + rw [le_div_iff₀ hcm_inv_pos] + simpa using hchain.2.1 + have hr_sq : r_m ^ 2 = theta_m := by + have harg_nonneg : 0 ≤ 1 + contrastExcessAtScale hP hStruct m := by + have harg_eq : + 1 + contrastExcessAtScale hP hStruct m = theta_m := by + dsimp [contrastExcessAtScale, theta_m] + ring + rw [harg_eq] + exact le_of_lt htheta_m_pos + dsimp [r_m] + rw [Real.sq_sqrt harg_nonneg] + dsimp [contrastExcessAtScale, theta_m] + ring + have hprod_eq : a * b = theta_k / theta_m := by + dsimp [a, b, theta_k, theta_m] + rw [terminalScalarRatioProduct_eq_theta_ratio + (ne_of_gt hbm_pos) (ne_of_gt hck_pos) (ne_of_gt hcm_pos)] + rfl + have hF : + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m = + contrastDrop r_m a b := by + calc + contrastExcessAtScale hP hStruct k - + contrastExcessAtScale hP hStruct m + = theta_k - theta_m := by + dsimp [contrastExcessAtScale, theta_k, theta_m] + ring + _ = theta_m * (theta_k / theta_m - 1) := by + field_simp [ne_of_gt htheta_m_pos] + _ = r_m ^ 2 * (a * b - 1) := by + rw [hr_sq, hprod_eq] + _ = contrastDrop r_m a b := rfl + have hFm_le_sq : + contrastExcessAtScale hP hStruct m ≤ r_m ^ 2 := by + rw [hr_sq] + dsimp [contrastExcessAtScale, theta_m] + linarith + have hr_sq_pos : 0 < r_m ^ 2 := by + rw [hr_sq] + exact htheta_m_pos + have hr_nonneg : 0 ≤ r_m := by + dsimp [r_m] + exact Real.sqrt_nonneg _ + have hP_le : + terminalP r_m a b ≤ 4 * r_m := + p_bound_of_no_drop hno hF rfl hFm_le_sq hr_sq_pos hr_nonneg + hrho_pos hrho_le_one ha hb + have hr_eq : + Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ)) = + r_m := by + dsimp [r_m, contrastExcessAtScale] + congr 1 + ring + have hformula := + expectedResponseJCubeSet_special_eq_half_terminalP_sub_one_of_P4 + hP hStruct hP4 m k e he + have hformula' : + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) = + (1 / 2 : ℝ) * terminalP r_m a b - 1 := by + calc + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) + = + (1 / 2 : ℝ) * + terminalP + (Real.sqrt (Homogenization.Book.Ch05.thetaAtScale hP hStruct (m : ℤ))) + (hP.barSigmaAtScale hStruct (k : ℤ) / + hP.barSigmaAtScale hStruct (m : ℤ)) + ((hP.barSigmaStarAtScale hStruct (k : ℤ))⁻¹ / + (hP.barSigmaStarAtScale hStruct (m : ℤ))⁻¹) - 1 := hformula + _ = (1 / 2 : ℝ) * terminalP r_m a b - 1 := by + rw [hr_eq] + calc + Homogenization.Book.Ch04.expectedResponseJCubeSet P + (Homogenization.originCube d (k : ℤ)) + (Homogenization.Book.Ch05.specialPAtScale hP hStruct (m : ℤ) e) + (Homogenization.Book.Ch05.specialQAtScale hP hStruct (m : ℤ) e) + = (1 / 2 : ℝ) * terminalP r_m a b - 1 := hformula' + _ ≤ (1 / 2 : ℝ) * terminalP r_m a b := by linarith + _ ≤ 2 * r_m := by nlinarith + +/-- +Source label `e.tau.sum.absorb`: scalar absorption step behind the weighted +additivity-defect estimate. +-/ +theorem terminal_p_mul_tau_le_two_mul_drop {r_m P tau drop : ℝ} + (hP_le : P ≤ 4 * r_m) + (htau_nonneg : 0 ≤ tau) + (hrt : r_m * tau ≤ (1 / 2 : ℝ) * drop) : + P * tau ≤ 2 * drop := by + have hP_tau_le : P * tau ≤ (4 * r_m) * tau := + mul_le_mul_of_nonneg_right hP_le htau_nonneg + have hfour : (4 * r_m) * tau = 4 * (r_m * tau) := by ring + have hrt_four : 4 * (r_m * tau) ≤ 4 * ((1 / 2 : ℝ) * drop) := by + nlinarith + have htarget : 4 * ((1 / 2 : ℝ) * drop) = 2 * drop := by ring + calc + P * tau ≤ (4 * r_m) * tau := hP_tau_le + _ = 4 * (r_m * tau) := hfour + _ ≤ 4 * ((1 / 2 : ℝ) * drop) := hrt_four + _ = 2 * drop := htarget + +/-- +Source label `e.tau.sum.absorb`: finite weighted version of the no-drop +additivity-defect absorption. The geometric estimate for the concrete weights +is supplied later by the scale iteration. +-/ +theorem weighted_terminal_tau_absorb {ι : Type*} (s : Finset ι) + {w tau drop : ι → ℝ} {r_m P rho F_m Cw : ℝ} + (hP_le : P ≤ 4 * r_m) + (hw_nonneg : ∀ i ∈ s, 0 ≤ w i) + (htau_nonneg : ∀ i ∈ s, 0 ≤ tau i) + (hrt : ∀ i ∈ s, r_m * tau i ≤ (1 / 2 : ℝ) * drop i) + (hdrop : ∀ i ∈ s, drop i ≤ rho * F_m) + (hCw : ∑ i ∈ s, w i ≤ Cw) + (hrhoF_nonneg : 0 ≤ rho * F_m) : + P * (∑ i ∈ s, w i * tau i) ≤ 2 * Cw * (rho * F_m) := by + have hterm : + ∀ i ∈ s, P * (w i * tau i) ≤ w i * (2 * (rho * F_m)) := by + intro i hi + have hPtau_drop : + P * tau i ≤ 2 * drop i := + terminal_p_mul_tau_le_two_mul_drop hP_le (htau_nonneg i hi) (hrt i hi) + have hdrop_bound : 2 * drop i ≤ 2 * (rho * F_m) := by + nlinarith [hdrop i hi] + have hPtau_bound : P * tau i ≤ 2 * (rho * F_m) := + le_trans hPtau_drop hdrop_bound + have hwi_nonneg : 0 ≤ w i := hw_nonneg i hi + have h := mul_le_mul_of_nonneg_left hPtau_bound hwi_nonneg + simpa [mul_comm, mul_left_comm, mul_assoc] using h + calc + P * (∑ i ∈ s, w i * tau i) + = ∑ i ∈ s, P * (w i * tau i) := by + rw [Finset.mul_sum] + _ ≤ ∑ i ∈ s, w i * (2 * (rho * F_m)) := + Finset.sum_le_sum fun i hi => hterm i hi + _ = (∑ i ∈ s, w i) * (2 * (rho * F_m)) := by + rw [Finset.sum_mul] + _ ≤ Cw * (2 * (rho * F_m)) := + mul_le_mul_of_nonneg_right hCw (by nlinarith [hrhoF_nonneg]) + _ = 2 * Cw * (rho * F_m) := by ring + +/-- +Source label `e.sqrt.tau.absorb`: square-root absorption once the product of +the additivity defect and the lower-scale response has the required bound. +-/ +theorem sqrt_tau_response_absorb {tau response B : ℝ} + (htau_nonneg : 0 ≤ tau) + (hresponse_nonneg : 0 ≤ response) + (hB_nonneg : 0 ≤ B) + (hprod : tau * response ≤ B ^ 2) : + Real.sqrt tau * Real.sqrt response ≤ B := by + have hsquare : + (Real.sqrt tau * Real.sqrt response) ^ 2 ≤ B ^ 2 := by + rw [mul_pow, Real.sq_sqrt htau_nonneg, Real.sq_sqrt hresponse_nonneg] + exact hprod + have hleft_nonneg : 0 ≤ Real.sqrt tau * Real.sqrt response := + mul_nonneg (Real.sqrt_nonneg tau) (Real.sqrt_nonneg response) + nlinarith [sq_nonneg (B - Real.sqrt tau * Real.sqrt response)] + +/-- +Source label `e.sqrt.tau.absorb`: formula-facing version with the +`ρ^{1/2} δ^{-1/2} F_m` scale. +-/ +theorem sqrt_tau_response_absorb_delta {tau response C rho delta F_m : ℝ} + (htau_nonneg : 0 ≤ tau) + (hresponse_nonneg : 0 ≤ response) + (hC_nonneg : 0 ≤ C) + (hdelta_pos : 0 < delta) + (hF_nonneg : 0 ≤ F_m) + (hprod : + tau * response ≤ + (C * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m) ^ 2) : + Real.sqrt tau * Real.sqrt response ≤ + C * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m := by + have hdelta_inv_nonneg : 0 ≤ delta⁻¹ := + inv_nonneg.mpr (le_of_lt hdelta_pos) + have hB_nonneg : 0 ≤ C * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m := by + positivity + exact sqrt_tau_response_absorb htau_nonneg hresponse_nonneg hB_nonneg hprod + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P4.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P4.lean new file mode 100644 index 0000000000..f8c33b695e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/DeterministicAlgebra/P4.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.SpecialFunctions.Sqrt +public import Mathlib.Tactic.Abel +public import Mathlib.Tactic.FieldSimp +public import Mathlib.Tactic.Linarith +public import Mathlib.Tactic.Ring +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixOperatorNorm +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.PartitionAveragesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.StationaryExpectations +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.ScalarPreliminaries +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.GoodScale.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Inputs + +/-! # P4 -/ + +@[expose] public section + +open scoped BigOperators Matrix.Norms.Elementwise +open scoped Matrix.Norms.L2Operator + +namespace Homogenization.HighContrast.EntryScale + +/-- +Source label `e.sqrt.tau.absorb`: product estimate obtained from the terminal +tau-drop bound and the linear lower-scale response expectation bound used in +the note. +-/ +theorem tau_mul_response_le_sqrt_budget_sq_of_rtau_response_bounds + {tau response r_m C_response C_sqrt rho delta F_m : ℝ} + (hr_pos : 0 < r_m) + (hresponse_nonneg : 0 ≤ response) + (hrho_nonneg : 0 ≤ rho) + (hdelta_pos : 0 < delta) + (hdelta_le_F : delta ≤ F_m) + (hrt : r_m * tau ≤ (1 / 2 : ℝ) * (rho * F_m)) + (hresponse : response ≤ C_response * r_m) + (hC_response_nonneg : 0 ≤ C_response) + (hC_response_le : C_response ≤ C_sqrt ^ 2) : + tau * response ≤ + (C_sqrt * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m) ^ 2 := by + have hF_pos : 0 < F_m := hdelta_pos.trans_le hdelta_le_F + have hF_nonneg : 0 ≤ F_m := le_of_lt hF_pos + have hrhoF_nonneg : 0 ≤ rho * F_m := + mul_nonneg hrho_nonneg hF_nonneg + have htau_bound : tau ≤ ((1 / 2 : ℝ) * (rho * F_m)) / r_m := by + rw [le_div_iff₀ hr_pos] + simpa [mul_comm, mul_left_comm, mul_assoc] using hrt + have hhalf_rhoF_nonneg : 0 ≤ (1 / 2 : ℝ) * (rho * F_m) := by + nlinarith [hrhoF_nonneg] + have hfactor_nonneg : + 0 ≤ ((1 / 2 : ℝ) * (rho * F_m)) / r_m := + div_nonneg hhalf_rhoF_nonneg (le_of_lt hr_pos) + have hprod_linear : tau * response ≤ C_response * (rho * F_m) := by + calc + tau * response + ≤ (((1 / 2 : ℝ) * (rho * F_m)) / r_m) * response := + mul_le_mul_of_nonneg_right htau_bound hresponse_nonneg + _ ≤ (((1 / 2 : ℝ) * (rho * F_m)) / r_m) * + (C_response * r_m) := + mul_le_mul_of_nonneg_left hresponse hfactor_nonneg + _ = (C_response / 2) * (rho * F_m) := by + field_simp [ne_of_gt hr_pos] + _ ≤ C_response * (rho * F_m) := by + nlinarith [mul_nonneg hC_response_nonneg hrhoF_nonneg] + have hdelta_inv_nonneg : 0 ≤ delta⁻¹ := + inv_nonneg.mpr (le_of_lt hdelta_pos) + have hF_le_delta : + F_m ≤ delta⁻¹ * F_m ^ 2 := by + have hmul : delta * F_m ≤ F_m * F_m := + mul_le_mul_of_nonneg_right hdelta_le_F hF_nonneg + have hmul' : + delta⁻¹ * (delta * F_m) ≤ delta⁻¹ * (F_m * F_m) := + mul_le_mul_of_nonneg_left hmul hdelta_inv_nonneg + calc + F_m = delta⁻¹ * (delta * F_m) := by + field_simp [ne_of_gt hdelta_pos] + _ ≤ delta⁻¹ * (F_m * F_m) := hmul' + _ = delta⁻¹ * F_m ^ 2 := by ring + have hsquare : + (C_sqrt * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m) ^ 2 = + C_sqrt ^ 2 * (rho * (delta⁻¹ * F_m ^ 2)) := by + rw [mul_pow, mul_pow, mul_pow, Real.sq_sqrt hrho_nonneg, + Real.sq_sqrt hdelta_inv_nonneg] + ring + have hC_scale : + C_response * (rho * F_m) ≤ C_sqrt ^ 2 * (rho * F_m) := + mul_le_mul_of_nonneg_right hC_response_le hrhoF_nonneg + have hF_scale : rho * F_m ≤ rho * (delta⁻¹ * F_m ^ 2) := + mul_le_mul_of_nonneg_left hF_le_delta hrho_nonneg + have htail : + C_sqrt ^ 2 * (rho * F_m) ≤ + C_sqrt ^ 2 * (rho * (delta⁻¹ * F_m ^ 2)) := + mul_le_mul_of_nonneg_left hF_scale (sq_nonneg C_sqrt) + calc + tau * response + ≤ C_response * (rho * F_m) := hprod_linear + _ ≤ C_sqrt ^ 2 * (rho * F_m) := hC_scale + _ ≤ C_sqrt ^ 2 * (rho * (delta⁻¹ * F_m ^ 2)) := htail + _ = (C_sqrt * Real.sqrt rho * Real.sqrt delta⁻¹ * F_m) ^ 2 := + hsquare.symm + +/-- +Source labels `e.drift.general` and `e.drift.nodrop`: the pointwise square +bound behind the weighted no-drop drift estimate when +`T_m = (1 + F_m)^2 / F_m`. +-/ +theorem drift_general_square_bound {D C rho F_m T_m : ℝ} + (hD_nonneg : 0 ≤ D) + (hC_nonneg : 0 ≤ C) + (hrho_nonneg : 0 ≤ rho) + (hF_pos : 0 < F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) + (hD : D ≤ C * (rho * F_m) / (1 + F_m)) : + D ^ 2 ≤ C ^ 2 * rho ^ 2 * F_m / T_m := by + have hden_pos : 0 < 1 + F_m := by linarith + let B : ℝ := C * (rho * F_m) / (1 + F_m) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + have hsq : D ^ 2 ≤ B ^ 2 := by + nlinarith [sq_nonneg (B - D)] + calc + D ^ 2 ≤ B ^ 2 := hsq + _ = C ^ 2 * rho ^ 2 * F_m / T_m := by + rw [hT] + dsimp [B] + field_simp [ne_of_gt hF_pos, ne_of_gt hden_pos] + +/-- +Source label `l.S.and.J`, equation `e.S.term.bound`: above the small-contrast +threshold, the terminal weight `T_m = (1 + F_m)^2 / F_m` is bounded by a +threshold-dependent multiple of `F_m`. +-/ +theorem terminal_weight_le_delta_mul {T_m F_m delta : ℝ} + (hdelta_pos : 0 < delta) + (hdelta_le_F : delta ≤ F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) : + T_m ≤ (1 + delta⁻¹) ^ 2 * F_m := by + have hF_pos : 0 < F_m := hdelta_pos.trans_le hdelta_le_F + have hinv_le : F_m⁻¹ ≤ delta⁻¹ := inv_anti₀ hdelta_pos hdelta_le_F + have hbase : 1 + F_m⁻¹ ≤ 1 + delta⁻¹ := add_le_add (le_refl 1) hinv_le + have hleft_nonneg : 0 ≤ 1 + F_m⁻¹ := by positivity + have hright_nonneg : 0 ≤ 1 + delta⁻¹ := by positivity + have hsquare : (1 + F_m⁻¹) ^ 2 ≤ (1 + delta⁻¹) ^ 2 := + (sq_le_sq₀ hleft_nonneg hright_nonneg).2 hbase + have hmul := + mul_le_mul_of_nonneg_right hsquare (le_of_lt hF_pos) + rw [hT] + calc + (1 + F_m) ^ 2 / F_m = (1 + F_m⁻¹) ^ 2 * F_m := by + field_simp [ne_of_gt hF_pos] + ring + _ ≤ (1 + delta⁻¹) ^ 2 * F_m := hmul + +/-- +Source label `l.S.and.J`, equation `e.S.term.bound`: constant-form version of +the small-contrast threshold absorption used for the paper's +`C_{\delta_{\rm sc}}`. +-/ +theorem terminal_weight_le_const_mul {T_m F_m delta C_delta : ℝ} + (hdelta_pos : 0 < delta) + (hdelta_le_F : delta ≤ F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) + (hC_delta : (1 + delta⁻¹) ^ 2 ≤ C_delta) : + T_m ≤ C_delta * F_m := by + have hF_nonneg : 0 ≤ F_m := le_trans (le_of_lt hdelta_pos) hdelta_le_F + exact (terminal_weight_le_delta_mul hdelta_pos hdelta_le_F hT).trans + (mul_le_mul_of_nonneg_right hC_delta hF_nonneg) + +/-- +Source label `l.S.and.J`, equation `e.S.term.bound`: after the terminal +fluctuation sum is made small, the small-contrast threshold converts +`T_m S_{k,m}` into a multiple of `F_m`. +-/ +theorem terminal_weight_mul_term_le_const_mul_contrast_of_le + {T_m F_m delta C_delta term eta : ℝ} + (hdelta_pos : 0 < delta) + (hdelta_le_F : delta ≤ F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) + (hC_delta : (1 + delta⁻¹) ^ 2 ≤ C_delta) + (hterm_nonneg : 0 ≤ term) + (hterm_le : term ≤ eta) : + T_m * term ≤ C_delta * eta * F_m := by + have hT_le : T_m ≤ C_delta * F_m := + terminal_weight_le_const_mul hdelta_pos hdelta_le_F hT hC_delta + have hC_delta_nonneg : 0 ≤ C_delta := by + exact (sq_nonneg (1 + delta⁻¹)).trans hC_delta + have hF_nonneg : 0 ≤ F_m := le_trans (le_of_lt hdelta_pos) hdelta_le_F + have hright_nonneg : 0 ≤ C_delta * F_m := + mul_nonneg hC_delta_nonneg hF_nonneg + calc + T_m * term ≤ (C_delta * F_m) * eta := + mul_le_mul hT_le hterm_le hterm_nonneg hright_nonneg + _ = C_delta * eta * F_m := by ring + +/-- +Source label `l.S.and.J`, equation `e.J.moment.bound`: the terminal weight +dominates the terminal contrast scale `1 + F_m = r_m^2`. +-/ +theorem one_add_contrast_le_terminal_weight {T_m F_m : ℝ} + (hF_pos : 0 < F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) : + 1 + F_m ≤ T_m := by + rw [hT] + have hF_ne : F_m ≠ 0 := ne_of_gt hF_pos + have hdiff : + 0 ≤ (1 + F_m) ^ 2 / F_m - (1 + F_m) := by + have hdiff_eq : + (1 + F_m) ^ 2 / F_m - (1 + F_m) = (1 + F_m) / F_m := by + field_simp [hF_ne] + ring + rw [hdiff_eq] + positivity + linarith + +/-- +Source label `p.HC.CR`: scalar absorption for the raw cutoff geometric tail. +Once the two-beta coefficient has been made at most `decay`, the terminal +weight pays the remaining contrast factor. +-/ +theorem cutoff_contrast_geo_le_decay_terminal_weight + {A geom F_m decay T_m : ℝ} + (hA_nonneg : 0 ≤ A) + (hcoeff : A * geom ≤ decay) + (hgeom_nonneg : 0 ≤ geom) + (hF_pos : 0 < F_m) + (hT : T_m = (1 + F_m) ^ 2 / F_m) : + A * (geom * F_m) ≤ decay * T_m := by + have hF_le_T : F_m ≤ T_m := by + have hle := one_add_contrast_le_terminal_weight hF_pos hT + linarith + have hT_nonneg : 0 ≤ T_m := by + linarith [hF_pos, hF_le_T] + have hAgeom_nonneg : 0 ≤ A * geom := mul_nonneg hA_nonneg hgeom_nonneg + calc + A * (geom * F_m) = (A * geom) * F_m := by ring + _ ≤ (A * geom) * T_m := + mul_le_mul_of_nonneg_left hF_le_T hAgeom_nonneg + _ ≤ decay * T_m := + mul_le_mul_of_nonneg_right hcoeff hT_nonneg + +/-- +Source label `e.drift.nodrop`: finite weighted-square form of the deterministic +drift estimate on a no-drop window. +-/ +theorem weighted_drift_square_bound {ι : Type*} (s : Finset ι) + {w D : ι → ℝ} {T_m C Cw rho F_m : ℝ} + (hT_pos : 0 < T_m) + (hC_nonneg : 0 ≤ C) + (hF_nonneg : 0 ≤ F_m) + (hw_nonneg : ∀ i ∈ s, 0 ≤ w i) + (hDsq : ∀ i ∈ s, D i ^ 2 ≤ C * rho ^ 2 * F_m / T_m) + (hCw : ∑ i ∈ s, w i ≤ Cw) : + T_m * (∑ i ∈ s, w i * D i ^ 2) ≤ C * Cw * rho ^ 2 * F_m := by + have hterm_nonneg : 0 ≤ C * rho ^ 2 * F_m / T_m := by + positivity + have hsum_bound : + ∑ i ∈ s, w i * D i ^ 2 ≤ + (∑ i ∈ s, w i) * (C * rho ^ 2 * F_m / T_m) := by + calc + ∑ i ∈ s, w i * D i ^ 2 + ≤ ∑ i ∈ s, w i * (C * rho ^ 2 * F_m / T_m) := by + refine Finset.sum_le_sum ?_ + intro i hi + exact mul_le_mul_of_nonneg_left (hDsq i hi) (hw_nonneg i hi) + _ = (∑ i ∈ s, w i) * (C * rho ^ 2 * F_m / T_m) := by + rw [Finset.sum_mul] + have hsum_le_Cw : + (∑ i ∈ s, w i) * (C * rho ^ 2 * F_m / T_m) ≤ + Cw * (C * rho ^ 2 * F_m / T_m) := + mul_le_mul_of_nonneg_right hCw hterm_nonneg + have hscaled : + T_m * (∑ i ∈ s, w i * D i ^ 2) ≤ + T_m * (Cw * (C * rho ^ 2 * F_m / T_m)) := + mul_le_mul_of_nonneg_left (le_trans hsum_bound hsum_le_Cw) (le_of_lt hT_pos) + calc + T_m * (∑ i ∈ s, w i * D i ^ 2) + ≤ T_m * (Cw * (C * rho ^ 2 * F_m / T_m)) := hscaled + _ = C * Cw * rho ^ 2 * F_m := by + field_simp [ne_of_gt hT_pos] + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Inputs.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Inputs.lean new file mode 100644 index 0000000000..5d22e414d5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/Inputs.lean @@ -0,0 +1,359 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Data.Real.Basic +public import Mathlib.MeasureTheory.Integral.Lebesgue.Basic +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section53.JUpperBoundCoarseFluctuations.Basic +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section55.ShiftedWidetildeTheta +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.Basic + +/-! +# Source labels and external analytic inputs + +This file is the only place where the development records external +analytic source material. It deliberately records metadata, not theorem +surfaces: precise Lean statements should be added only after the corresponding +provenance has been audited against the source. +-/ + +@[expose] public section + +namespace Homogenization.HighContrast.EntryScale + +open scoped BigOperators + +namespace Sources + +/-- Localization estimate, `e.localization`. -/ +def localization : SourceLabel := + SourceLabel.highMomentPaper "e.localization" 511 +end Sources + + +/-- Exponents fixed by the high-contrast weak-norm machinery. + +This record is indexed by the dimension `d` and carries the manuscript +quantitative coarse-grained ellipticity parameters `params` so that the +source-max edge-loss gaps can be stated as *pure numeric* inequalities on the +record's own parameters (no quantifiers over laws). Consumers recover the +per-`(P4)` form via `sourceMaxLowerGap_of_params`/`sourceMaxUpperGap_of_params` +using `hP4.params = hc.params`. + +Source: the high-moment paper (Armstrong–Kuusi–Loher, to appear), and +ultimately the high-contrast manuscript, label `l.weaknorms.moreproto`. +-/ +structure HighContrastExponents (d : ℕ) where + /-- The manuscript quantitative coarse-grained ellipticity parameters that the + source-max gaps are stated against. -/ + params : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticityParams d + rhoM : ℝ + beta : ℝ + zeta : ℝ + rhoM_pos : 0 < rhoM + beta_pos : 0 < beta + one_lt_zeta : 1 < zeta + zeta_lt_two : zeta < 2 + /-- + Memory decay rate `kappa_H = min{rho_M, beta, beta_edge}` at which the + Lyapunov memory variable `H` contracts. It is bounded above by the union-bound + exponent `rho_M` and the response exponent `beta`, while `rho_M` retains its + other (union-bound / stochastic-decay) roles. + + Source: the high-moment paper (Armstrong–Kuusi–Loher, to appear), + memory-decay discussion `s.memory` and `l.lyapunov`. + -/ + kappaH : ℝ + kappaH_pos : 0 < kappaH + kappaH_le_rhoM : kappaH ≤ rhoM + kappaH_le_beta : kappaH ≤ beta + /-- + Source-max edge-loss compatibility at the lower ellipticity exponent. + + This is the exponent gap used by the faithful `p.HC.CR` source-max argument: + the stochastic source weight must decay strictly slower than the lower + Section 5.2 edge-loss exponent. Stated as a pure numeric inequality on the + record's own parameters. + -/ + sourceMaxLowerGap : + rhoM < + params.sLower + + Homogenization.Book.Ch05.Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBetaParams + params + /-- + Source-max edge-loss compatibility at the upper ellipticity exponent. + + This is the matching upper-edge gap for the same manuscript source-max + argument. + -/ + sourceMaxUpperGap : + rhoM < + params.sUpper + + Homogenization.Book.Ch05.Section53.JUpperBoundCoarseFluctuations.section53CoarseFluctuationBetaParams + params + +namespace HighContrastExponents + +open Homogenization.Book.Ch05.Section53.JUpperBoundCoarseFluctuations + +/-- Per-`(P4)` form of the lower source-max gap: for any law whose `(P4)` +parameters match the record, the gap holds against `section53CoarseFluctuationBeta`. -/ +theorem sourceMaxLowerGap_of_params {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} (hc : HighContrastExponents d) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (h : hP4.params = hc.params) : + hc.rhoM < hP4.sLower + section53CoarseFluctuationBeta hP4 := by + have hg := hc.sourceMaxLowerGap + rw [← h] at hg + simpa using hg + +/-- Per-`(P4)` form of the upper source-max gap. -/ +theorem sourceMaxUpperGap_of_params {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} (hc : HighContrastExponents d) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (h : hP4.params = hc.params) : + hc.rhoM < hP4.sUpper + section53CoarseFluctuationBeta hP4 := by + have hg := hc.sourceMaxUpperGap + rw [← h] at hg + simpa using hg + +end HighContrastExponents + +/-- Constants in the localization and small-contrast handoff. + +Source: `e.localization` and `e.small.contrast`. +-/ +structure LocalizationSmallContrastConstants where + C_loc : ℝ + beta_loc : ℝ + delta0 : ℝ + C_sc : ℝ + alpha0 : ℝ + C_loc_nonneg : 0 ≤ C_loc + beta_loc_pos : 0 < beta_loc + delta0_pos : 0 < delta0 + delta0_le_one : delta0 ≤ 1 + C_sc_pos : 0 < C_sc + alpha0_pos : 0 < alpha0 + +/-- Typed external handoff for localization and the small-contrast theorem. + +Source: `e.localization` and `e.small.contrast`. This is one of the audited +external inputs allowed at final assembly; downstream theorems should consume +this surface rather than assuming already assembled final decay. + +The localization and small-contrast fields are guarded by the requirement +`hP4.params = hc.params`: the fixed constants below are the ones produced by the +Section 5.5/5.6 source theorems at the record's own manuscript parameters, so the +bounds only fire for laws whose `(P4)` parameters agree with `hc.params`. This +guard is exactly what makes the record inhabitable (see `RecordsFinal.lean`). +-/ +structure LocalizationSmallContrastInput + {d : ℕ} [NeZero d] (hc : HighContrastExponents d) + extends LocalizationSmallContrastConstants where + localization : + ∀ {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P), + hP4.params = hc.params → + ∀ {k n : ℕ}, + k ≤ n → + Homogenization.Book.Ch05.thetaAtScale hP hStruct (n : ℤ) ≤ + Homogenization.Book.Ch05.Section55.shiftedWidetildeThetaAtScale P + (n : ℤ) hP4 (2 * hc.beta) ∧ + Homogenization.Book.Ch05.Section55.shiftedWidetildeThetaAtScale P + (n : ℤ) hP4 (2 * hc.beta) ≤ + Homogenization.Book.Ch05.thetaAtScale hP hStruct (k : ℤ) + + C_loc * (3 : ℝ) ^ (-(beta_loc * ((n - k : ℕ) : ℝ))) * + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 + small_contrast : + ∀ {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P), + hP4.params = hc.params → + ∀ {N : ℕ}, + Homogenization.Book.Ch05.Section55.shiftedWidetildeThetaAtScale P + (N : ℤ) hP4 (2 * hc.beta) - 1 ≤ delta0 → + ∀ n : ℕ, + Homogenization.Book.Ch05.thetaAtScale hP hStruct + ((N + n : ℕ) : ℤ) - 1 ≤ + C_sc * (3 : ℝ) ^ (-(alpha0 * (n : ℝ))) + +/-- Parameters in the high centered block moment hypothesis. + +Source: `a.HM`, `e.HM`, and `e.Q.large`. The fields +`holderExponentFloor`, `p4Params`, and `two_mul_p4_xi_le_Q` record the finite +Holder-exponent thresholds from the high-contrast estimate; the TeX +requirement is represented by the concrete inequalities +`holderExponentFloor < Q` and `2 * xi <= Q`. The latter is relative to the +fixed quantitative coarse-grained ellipticity parameters used by the theorem; +it is not quantified over every possible witness for every law. +-/ +structure HighCenteredMomentParameters (d : ℕ) (hc : HighContrastExponents d) where + p_hm : ℝ + Q : ℝ + gamma : ℝ + C_Q : ℝ + holderExponentFloor : ℝ + p4Params : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticityParams d + p_hm_nonneg : 0 ≤ p_hm + two_le_Q : 2 ≤ Q + gamma_pos : 0 < gamma + C_Q_nonneg : 0 ≤ C_Q + Q_mul_rhoM_gt : Q * hc.rhoM > (d : ℝ) + 4 + holderExponentFloor_nonneg : 0 ≤ holderExponentFloor + holderExponentFloor_lt_Q : holderExponentFloor < Q + two_mul_p4_xi_le_Q : 2 * (p4Params.xi : ℝ) ≤ Q + +/-- Constants for the old polynomial subthreshold contribution in `a.HM`. + +Source: the high-moment paper (Armstrong–Kuusi–Loher, to appear). This records +only the polynomial prefactor before the weak-norm weight is used; the +geometric buffer absorption is proved in `MomentConsequences.lean`. +-/ +structure SubthresholdPolynomialMomentParameters where + C_sub : ℝ + A_sub : ℝ + C_sub_nonneg : 0 ≤ C_sub + +/-- The deterministic envelope appearing in the high-moment input `a.HM`. + +The source note writes this as `C_Q 3^{-Q γ (j-N)}` for every `j ≥ N`, +uniformly over triadic translates. We keep the `j - N` dependence explicit +so later results can substitute this exact scale decay into the descendant +union bound. +-/ +noncomputable def highCenteredMomentEnvelope {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (N j : ℕ) : ENNReal := + ENNReal.ofReal + (hm.C_Q * + Real.rpow (3 : ℝ) (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ))) + +/-- Moving the initial scale of the high-moment envelope forward only weakens +the decay requirement. -/ +theorem highCenteredMomentEnvelope_le_of_start_le + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {N k j : ℕ} + (hNk : N ≤ k) : + highCenteredMomentEnvelope hm N j ≤ highCenteredMomentEnvelope hm k j := by + dsimp [highCenteredMomentEnvelope] + have hQ_pos : 0 < hm.Q := lt_of_lt_of_le (by norm_num : (0 : ℝ) < 2) hm.two_le_Q + have hQg_pos : 0 < hm.Q * hm.gamma := mul_pos hQ_pos hm.gamma_pos + have hsub : j - k ≤ j - N := Nat.sub_le_sub_left hNk j + have hsub_real : ((j - k : ℕ) : ℝ) ≤ ((j - N : ℕ) : ℝ) := by + exact_mod_cast hsub + have hexp : + -(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ) ≤ + -(hm.Q * hm.gamma) * ((j - k : ℕ) : ℝ) := by + nlinarith + have hrpow : + Real.rpow (3 : ℝ) (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)) ≤ + Real.rpow (3 : ℝ) (-(hm.Q * hm.gamma) * ((j - k : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 3) hexp + exact ENNReal.ofReal_le_ofReal + (mul_le_mul_of_nonneg_left hrpow hm.C_Q_nonneg) + +/-- The scale-uniform high centered-moment assumption from `a.HM`/`e.HM`. + +Here `centeredBlockDeviation j Q ω` denotes the nonnegative matrix-normalized +observable +`|Ahom_j^{-1/2}(A(Q)-Ahom_j)Ahom_j^{-1/2}|` attached to a triadic cube `Q` of +scale `j`. The hypothesis is intentionally only a one-block input: descendant +counts, weak-norm weights, terminal normalization losses, and union bounds are +proved downstream rather than built into this assumption. +-/ +structure HighCenteredMomentEstimate + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (μ : MeasureTheory.Measure Ω) (N : ℕ) + (centeredBlockDeviation : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal) : Prop where + measurable : + ∀ {j : ℕ}, N ≤ j → ∀ {Q : Homogenization.TriadicCube d}, + Q.scale = (j : ℤ) → + AEMeasurable (fun ω => centeredBlockDeviation j Q ω ^ hm.Q) μ + moment_le : + ∀ {j : ℕ}, N ≤ j → ∀ {Q : Homogenization.TriadicCube d}, + Q.scale = (j : ℤ) → + ∫⁻ ω, centeredBlockDeviation j Q ω ^ hm.Q ∂ μ ≤ + highCenteredMomentEnvelope hm N j + +namespace HighCenteredMomentEstimate + +/-- The high centered-moment hypothesis may be restarted at any later scale. -/ +theorem of_start_le + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + {hm : HighCenteredMomentParameters d hc} {μ : MeasureTheory.Measure Ω} + {N k : ℕ} + {centeredBlockDeviation : + ℕ → Homogenization.TriadicCube d → Ω → ENNReal} + (hNk : N ≤ k) + (hHM : HighCenteredMomentEstimate hm μ N centeredBlockDeviation) : + HighCenteredMomentEstimate hm μ k centeredBlockDeviation where + measurable := by + intro j hkj Q hQ + exact hHM.measurable (hNk.trans hkj) hQ + moment_le := by + intro j hkj Q hQ + exact (hHM.moment_le (hNk.trans hkj) hQ).trans + (highCenteredMomentEnvelope_le_of_start_le hm hNk) + +end HighCenteredMomentEstimate + +/-- The subthreshold second-moment envelope after applying the weak-norm gap. + +The source paragraph says that before the weak-norm weight the old +high-contrast bound contributes at most `C (2+T)^A`. Since the subthreshold +scales have `m - j >= m - N`, the squared weak weight contributes +`3^{-2 rho_M (m-N)}`. +-/ +noncomputable def subthresholdPolynomialMomentEnvelope + {d : ℕ} (hc : HighContrastExponents d) + (sub : SubthresholdPolynomialMomentParameters) (T : ℝ) (n : ℕ) : + ENNReal := + ENNReal.ofReal + (sub.C_sub * (((2 + T : ℝ) ^ sub.A_sub) * + (3 : ℝ) ^ (-(2 * hc.rhoM) * (n : ℝ)))) + +/-- Root-level subthreshold envelope from the old high-contrast input. + +This is the same source paragraph as `subthresholdPolynomialMomentEnvelope`, +but before squaring. It is the shape needed by the lower-edge coefficient +comparison, whose residual local-window terms are controlled as +`L^{xi_edge}` roots rather than by the `L^2` union-bound estimate. +-/ +noncomputable def subthresholdPolynomialRootEnvelope + {d : ℕ} (hc : HighContrastExponents d) + (sub : SubthresholdPolynomialMomentParameters) (T : ℝ) (n : ℕ) : ℝ := + sub.C_sub * (((2 + T : ℝ) ^ sub.A_sub) * + (3 : ℝ) ^ (-(hc.rhoM) * (n : ℝ))) + +/-- Source-facing old polynomial subthreshold input from `a.HM`. + +Here `subthresholdMax m` denotes the already weighted contribution +`\mathcal M_m^{ d + 4` implies the positive +union-bound decay exponent `Q rho_M - d`. +-/ +theorem highCenteredMoment_Q_mul_rhoM_sub_dim_pos + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) : + 0 < hm.Q * hc.rhoM - (d : ℝ) := by + linarith [hm.Q_mul_rhoM_gt] + +/-- +Source label `l.union.bound`: positivity of the convolution decay exponent +`c_Q = min {Q rho_M - d, Q gamma}`. +-/ +theorem highCenteredMoment_min_decay_pos {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) : + 0 < min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma) := by + have hleft : 0 < hm.Q * hc.rhoM - (d : ℝ) := + highCenteredMoment_Q_mul_rhoM_sub_dim_pos hm + have hright : 0 < hm.Q * hm.gamma := + mul_pos (highCenteredMoment_Q_pos hm) hm.gamma_pos + exact lt_min hleft hright + +/-- +Source label `l.union.bound`: the linear prefactor in +`(1 + m - N) 3^{-c(m-N)}` is absorbed by the exponential decay. +-/ +theorem tendsto_linear_mul_rpow_three_neg_atTop_nhds_zero {c : ℝ} + (hc : 0 < c) : + Tendsto (fun n : ℕ => + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) atTop (𝓝 (0 : ℝ)) := by + have hlog_pos : 0 < c * Real.log 3 := by + exact mul_pos hc (Real.log_pos (by norm_num : (1 : ℝ) < 3)) + have hmain_real : + Tendsto (fun x : ℝ => + (x + 1) * Real.exp (-(c * Real.log 3) * x)) atTop (𝓝 (0 : ℝ)) := by + have hlin : + Tendsto (fun x : ℝ => + x ^ (1 : ℝ) * Real.exp (-(c * Real.log 3) * x)) + atTop (𝓝 (0 : ℝ)) := + tendsto_rpow_mul_exp_neg_mul_atTop_nhds_zero + (1 : ℝ) (c * Real.log 3) hlog_pos + have hexp : + Tendsto (fun x : ℝ => Real.exp (-(c * Real.log 3) * x)) + atTop (𝓝 (0 : ℝ)) := by + have harg : + Tendsto (fun x : ℝ => -(c * Real.log 3) * x) atTop atBot := + tendsto_id.const_mul_atTop_of_neg (by linarith) + exact Real.tendsto_exp_atBot.comp harg + have hsum : + Tendsto (fun x : ℝ => + x ^ (1 : ℝ) * Real.exp (-(c * Real.log 3) * x) + + Real.exp (-(c * Real.log 3) * x)) atTop (𝓝 (0 : ℝ)) := by + simpa using hlin.add hexp + simpa [Real.rpow_one, add_mul] using hsum + have hnat : + Tendsto (fun n : ℕ => + (((n : ℝ) + 1) * Real.exp (-(c * Real.log 3) * (n : ℝ)))) + atTop (𝓝 (0 : ℝ)) := + hmain_real.comp tendsto_natCast_atTop_atTop + refine hnat.congr' ?_ + filter_upwards with n + rw [Real.rpow_def_of_pos (by norm_num : (0 : ℝ) < 3)] + congr 1 + ring_nf + +/-- +Source label `l.union.bound`: a concrete threshold after which +`C (n+1) 3^{-c n}` is smaller than any prescribed positive tolerance. +-/ +theorem exists_forall_ge_const_mul_linear_rpow_three_neg_le + {C c η : ℝ} (hc : 0 < c) (hη : 0 < η) : + ∃ K : ℕ, ∀ n : ℕ, K ≤ n → + C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ))) ≤ η := by + have hlim : + Tendsto (fun n : ℕ => + C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) + atTop (𝓝 (0 : ℝ)) := by + simpa using + tendsto_const_nhds.mul (tendsto_linear_mul_rpow_three_neg_atTop_nhds_zero hc) + have hsmall : + ∀ᶠ n : ℕ in atTop, + C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ))) ≤ η := + hlim (Iic_mem_nhds hη) + rcases eventually_atTop.1 hsmall with ⟨K, hK⟩ + exact ⟨K, hK⟩ + +/-- +Source label `l.union.bound`: the logarithmic buffer turns the polynomial +contrast factor `(2+T)^A` into half of the geometric decay. +-/ +theorem buffered_polynomial_geometric_envelope_le_linear_geometric + {C A c B T : ℝ} {n : ℕ} + (hC : 0 ≤ C) (hc : 0 < c) (hT : 1 ≤ T) + (hBlarge : 2 * A ≤ c * B) + (hbuf : B * Real.logb 3 (2 + T) ≤ (n : ℝ)) : + C * (((2 + T : ℝ) ^ A) * + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) ≤ + C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-(c / 2) * (n : ℝ))) := by + let L : ℝ := Real.logb 3 (2 + T) + have hbase_pos : 0 < 2 + T := by linarith + have hL_nonneg : 0 ≤ L := by + exact Real.logb_nonneg (by norm_num : (1 : ℝ) < 3) (by linarith : 1 ≤ 2 + T) + have hL_ge_one : 1 ≤ L := by + have hlog_mono : + Real.logb 3 3 ≤ Real.logb 3 (2 + T) := + Real.logb_le_logb_of_le + (by norm_num : (1 : ℝ) < 3) + (by norm_num : (0 : ℝ) < 3) + (by linarith : (3 : ℝ) ≤ 2 + T) + rwa [Real.logb_self_eq_one (by norm_num : (1 : ℝ) < 3)] at hlog_mono + have hdelta_nonneg : 0 ≤ c / 2 := by positivity + have hA_le_deltaB : A ≤ (c / 2) * B := by nlinarith + have hAL_le_delta_n : A * L ≤ (c / 2) * (n : ℝ) := by + have hleft : A * L ≤ ((c / 2) * B) * L := + mul_le_mul_of_nonneg_right hA_le_deltaB hL_nonneg + have hright : (c / 2) * (B * L) ≤ (c / 2) * (n : ℝ) := + mul_le_mul_of_nonneg_left hbuf hdelta_nonneg + nlinarith + have hexp_le : + A * L + (-c * (n : ℝ)) ≤ -(c / 2) * (n : ℝ) := by + nlinarith + have hpoly_decay : + ((2 + T : ℝ) ^ A) * (3 : ℝ) ^ (-c * (n : ℝ)) ≤ + (3 : ℝ) ^ (-(c / 2) * (n : ℝ)) := by + calc + ((2 + T : ℝ) ^ A) * (3 : ℝ) ^ (-c * (n : ℝ)) + = (3 : ℝ) ^ (A * L) * (3 : ℝ) ^ (-c * (n : ℝ)) := by + have hpow_eq : + (2 + T : ℝ) ^ A = (3 : ℝ) ^ (A * L) := by + calc + (2 + T : ℝ) ^ A + = ((3 : ℝ) ^ L) ^ A := by + rw [Real.rpow_logb (by norm_num : (0 : ℝ) < 3) + (by norm_num : (3 : ℝ) ≠ 1) hbase_pos] + _ = (3 : ℝ) ^ (L * A) := by + rw [← Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3)] + _ = (3 : ℝ) ^ (A * L) := by ring_nf + rw [hpow_eq] + _ = (3 : ℝ) ^ (A * L + (-c * (n : ℝ))) := by + rw [← Real.rpow_add (by norm_num : (0 : ℝ) < 3)] + _ ≤ (3 : ℝ) ^ (-(c / 2) * (n : ℝ)) := + Real.rpow_le_rpow_of_exponent_le + (by norm_num : (1 : ℝ) ≤ 3) hexp_le + have hlin_nonneg : 0 ≤ (n : ℝ) + 1 := by positivity + calc + C * (((2 + T : ℝ) ^ A) * + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) + = C * (((n : ℝ) + 1) * + (((2 + T : ℝ) ^ A) * (3 : ℝ) ^ (-c * (n : ℝ)))) := by + ring + _ ≤ C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-(c / 2) * (n : ℝ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hpoly_decay hlin_nonneg) hC + +/-- +Source label `l.union.bound`: after choosing the buffer exponent large enough, +the manuscript envelope `C (2+T)^A (n+1) 3^{-c n}` is uniformly small for +`n >= B log_3(2+T)` and `T >= 1`. +-/ +theorem exists_bufferExponent_for_polynomial_geometric_envelope_le + {C A c η : ℝ} (hC : 0 ≤ C) (hc : 0 < c) (hη : 0 < η) : + ∃ B : ℝ, 1 ≤ B ∧ ∀ {T : ℝ} {n : ℕ}, 1 ≤ T → + B * Real.logb 3 (2 + T) ≤ (n : ℝ) → + C * (((2 + T : ℝ) ^ A) * + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) ≤ η := by + obtain ⟨K, hK⟩ := + exists_forall_ge_const_mul_linear_rpow_three_neg_le + (C := C) (c := c / 2) (η := η) (by positivity) hη + let B : ℝ := max ((K : ℝ) + 1) (max 1 ((2 * A) / c)) + have hB_ge_one : 1 ≤ B := by + exact le_trans (le_max_left 1 ((2 * A) / c)) (le_max_right ((K : ℝ) + 1) _) + refine ⟨B, hB_ge_one, ?_⟩ + intro T n hT hbuf + have hL_ge_one : 1 ≤ Real.logb 3 (2 + T) := by + have hlog_mono : + Real.logb 3 3 ≤ Real.logb 3 (2 + T) := + Real.logb_le_logb_of_le + (by norm_num : (1 : ℝ) < 3) + (by norm_num : (0 : ℝ) < 3) + (by linarith : (3 : ℝ) ≤ 2 + T) + rwa [Real.logb_self_eq_one (by norm_num : (1 : ℝ) < 3)] at hlog_mono + have hB_nonneg : 0 ≤ B := le_trans zero_le_one hB_ge_one + have hB_le_n : B ≤ (n : ℝ) := by + calc + B ≤ B * Real.logb 3 (2 + T) := + le_mul_of_one_le_right hB_nonneg hL_ge_one + _ ≤ (n : ℝ) := hbuf + have hK_le_n_real : (K : ℝ) ≤ (n : ℝ) := by + have hK_lt_B : (K : ℝ) < B := by + calc + (K : ℝ) < (K : ℝ) + 1 := by linarith + _ ≤ B := le_max_left ((K : ℝ) + 1) (max 1 ((2 * A) / c)) + exact le_of_lt (lt_of_lt_of_le hK_lt_B hB_le_n) + have hK_le_n : K ≤ n := by exact_mod_cast hK_le_n_real + have hBlarge : 2 * A ≤ c * B := by + have hdiv_le_B : (2 * A) / c ≤ B := + (le_max_right 1 ((2 * A) / c)).trans + (le_max_right ((K : ℝ) + 1) (max 1 ((2 * A) / c))) + have hc_nonneg : 0 ≤ c := le_of_lt hc + have hmul := mul_le_mul_of_nonneg_left hdiv_le_B hc_nonneg + field_simp [hc.ne'] at hmul + exact hmul + calc + C * (((2 + T : ℝ) ^ A) * + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) + ≤ C * (((n : ℝ) + 1) * (3 : ℝ) ^ (-(c / 2) * (n : ℝ))) := + buffered_polynomial_geometric_envelope_le_linear_geometric + hC hc hT hBlarge hbuf + _ ≤ η := hK n hK_le_n + +/-- +Source label `l.union.bound`: variant of the logarithmic-buffer absorption +without the harmless linear prefactor. +-/ +theorem exists_bufferExponent_for_polynomial_geometric_envelope_no_linear_le + {C A c η : ℝ} (hC : 0 ≤ C) (hc : 0 < c) (hη : 0 < η) : + ∃ B : ℝ, 1 ≤ B ∧ ∀ {T : ℝ} {n : ℕ}, 1 ≤ T → + B * Real.logb 3 (2 + T) ≤ (n : ℝ) → + C * (((2 + T : ℝ) ^ A) * + (3 : ℝ) ^ (-c * (n : ℝ))) ≤ η := by + obtain ⟨B, hB_one, hB⟩ := + exists_bufferExponent_for_polynomial_geometric_envelope_le + (C := C) (A := A) (c := c) (η := η) hC hc hη + refine ⟨B, hB_one, ?_⟩ + intro T n hT hbuf + have hmain := hB hT hbuf + have hpoly_nonneg : 0 ≤ (2 + T : ℝ) ^ A := by + exact Real.rpow_nonneg (by linarith : 0 ≤ (2 + T : ℝ)) A + have hdecay_nonneg : 0 ≤ (3 : ℝ) ^ (-c * (n : ℝ)) := by + positivity + have hlinear_ge_one : 1 ≤ (n : ℝ) + 1 := by + have hn_nonneg : 0 ≤ (n : ℝ) := by exact_mod_cast Nat.zero_le n + linarith + have hdecay_le_linear : + (3 : ℝ) ^ (-c * (n : ℝ)) ≤ + ((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)) := by + calc + (3 : ℝ) ^ (-c * (n : ℝ)) + = 1 * (3 : ℝ) ^ (-c * (n : ℝ)) := by rw [one_mul] + _ ≤ ((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)) := + mul_le_mul_of_nonneg_right hlinear_ge_one hdecay_nonneg + have hleft_le : + C * (((2 + T : ℝ) ^ A) * + (3 : ℝ) ^ (-c * (n : ℝ))) ≤ + C * (((2 + T : ℝ) ^ A) * + (((n : ℝ) + 1) * (3 : ℝ) ^ (-c * (n : ℝ)))) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hdecay_le_linear hpoly_nonneg) hC + exact hleft_le.trans hmain + +/-- +Source labels `a.HM.subthreshold` and `l.union.bound`: the old polynomial +subthreshold bound is killed by the same logarithmic buffer, with squared +weak-norm decay `3^{-2 rho_M (m-N)}`. +-/ +theorem exists_bufferExponent_subthresholdPolynomialMomentEnvelope_le + {d : ℕ} (hc : HighContrastExponents d) + (sub : SubthresholdPolynomialMomentParameters) {η : ℝ} (hη : 0 < η) : + ∃ B : ℝ, 1 ≤ B ∧ ∀ {T : ℝ} {n : ℕ}, 1 ≤ T → + B * Real.logb 3 (2 + T) ≤ (n : ℝ) → + subthresholdPolynomialMomentEnvelope hc sub T n ≤ ENNReal.ofReal η := by + obtain ⟨B, hB_one, hB⟩ := + exists_bufferExponent_for_polynomial_geometric_envelope_no_linear_le + (C := sub.C_sub) (A := sub.A_sub) (c := 2 * hc.rhoM) + (η := η) sub.C_sub_nonneg (by nlinarith [hc.rhoM_pos]) hη + refine ⟨B, hB_one, ?_⟩ + intro T n hT hbuf + exact ENNReal.ofReal_le_ofReal (hB hT hbuf) + +/-- +Source labels `e.Nstar`, `a.HM.subthreshold`, and `l.union.bound`: manuscript +form of the subthreshold polynomial-envelope absorption with +`m >= N + ceil(B log_3(2+T))`. +-/ +theorem exists_bufferExponent_subthresholdPolynomialMomentEnvelope_le_of_Nstar + {d : ℕ} (hc : HighContrastExponents d) + (sub : SubthresholdPolynomialMomentParameters) {η : ℝ} (hη : 0 < η) : + ∃ B : ℝ, 1 ≤ B ∧ ∀ {T : ℝ} {N m : ℕ}, 1 ≤ T → + N + Nat.ceil (B * Real.logb 3 (2 + T)) ≤ m → + subthresholdPolynomialMomentEnvelope hc sub T (m - N) ≤ + ENNReal.ofReal η := by + obtain ⟨B, hB_one, hB⟩ := + exists_bufferExponent_subthresholdPolynomialMomentEnvelope_le hc sub hη + refine ⟨B, hB_one, ?_⟩ + intro T N m hT hNstar + have hceil_gap : + Nat.ceil (B * Real.logb 3 (2 + T)) ≤ m - N := by + omega + have hbuf : + B * Real.logb 3 (2 + T) ≤ ((m - N : ℕ) : ℝ) := + (Nat.ceil_le).mp hceil_gap + exact hB hT hbuf + +/-- +Source labels `M_m^{= N + ceil(B log_3(2+T))`. +-/ +theorem nstar_le_of_bufferExponent_le {B₀ B T : ℝ} {N m : ℕ} + (hB₀B : B₀ ≤ B) (hT : 1 ≤ T) + (hNstar : N + Nat.ceil (B * Real.logb 3 (2 + T)) ≤ m) : + N + Nat.ceil (B₀ * Real.logb 3 (2 + T)) ≤ m := by + let L : ℝ := Real.logb 3 (2 + T) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.logb_nonneg (by norm_num : (1 : ℝ) < 3) (by linarith : 1 ≤ 2 + T) + have hmul : B₀ * L ≤ B * L := + mul_le_mul_of_nonneg_right hB₀B hL_nonneg + have hceil : Nat.ceil (B₀ * L) ≤ Nat.ceil (B * L) := + Nat.ceil_mono hmul + have hNstarL : N + Nat.ceil (B * L) ≤ m := by + simpa [L] using hNstar + have htarget : N + Nat.ceil (B₀ * L) ≤ m := by + omega + simpa [L] using htarget + +/-- +Source label `l.union.bound`: the terminal high-moment tolerance can be chosen +so that the `2 / Q` moment conversion lands exactly on half of the final +second-moment budget. +-/ +theorem ofReal_highCenteredMoment_halfBudget_rpow_eq + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {η : ℝ} (hη : 0 < η) : + (ENNReal.ofReal ((η / 2) ^ (hm.Q / 2))) ^ ((2 : ℝ) / hm.Q) = + ENNReal.ofReal (η / 2) := by + have hQ_pos : 0 < hm.Q := highCenteredMoment_Q_pos hm + have hhalf_nonneg : 0 ≤ η / 2 := by linarith + have hQhalf_nonneg : 0 ≤ hm.Q / 2 := by linarith + have hbase : + ENNReal.ofReal ((η / 2) ^ (hm.Q / 2)) = + (ENNReal.ofReal (η / 2)) ^ (hm.Q / 2) := + (ENNReal.ofReal_rpow_of_nonneg hhalf_nonneg hQhalf_nonneg).symm + have hprod : hm.Q / 2 * ((2 : ℝ) / hm.Q) = 1 := by + field_simp [(ne_of_gt hQ_pos)] + calc + (ENNReal.ofReal ((η / 2) ^ (hm.Q / 2))) ^ ((2 : ℝ) / hm.Q) + = ((ENNReal.ofReal (η / 2)) ^ (hm.Q / 2)) ^ ((2 : ℝ) / hm.Q) := by + rw [hbase] + _ = (ENNReal.ofReal (η / 2)) ^ (hm.Q / 2 * ((2 : ℝ) / hm.Q)) := by + rw [← ENNReal.rpow_mul] + _ = ENNReal.ofReal (η / 2) := by + rw [hprod, ENNReal.rpow_one] + +/-- +Source label `l.union.bound`: high-moment specialization of the buffer +smallness statement for the convolution envelope +`C_Q (2+T)^Q (n+1) 3^{-c_Q n}`. +-/ +theorem exists_bufferExponent_highCenteredMoment_convolutionEnvelope_le + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {η : ℝ} (hη : 0 < η) : + ∃ B : ℝ, 1 ≤ B ∧ ∀ {T : ℝ} {n : ℕ}, 1 ≤ T → + B * Real.logb 3 (2 + T) ≤ (n : ℝ) → + hm.C_Q * (((2 + T : ℝ) ^ hm.Q) * + (((n : ℝ) + 1) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + (n : ℝ)))) ≤ η := by + exact + exists_bufferExponent_for_polynomial_geometric_envelope_le + (C := hm.C_Q) (A := hm.Q) + (c := min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) + hm.C_Q_nonneg (highCenteredMoment_min_decay_pos hm) hη + +/-- +Source label `l.union.bound`: a single term in the two-scale convolution is +controlled by the minimum decay exponent. Here `α` represents +`Q ρ_M - d`, `β` represents `Q γ`, and `c` will be their minimum. +-/ +theorem rpow_three_two_scale_decay_le_min_decay + {α β c : ℝ} {N j m : ℕ} + (hNj : N ≤ j) (hjm : j ≤ m) + (hcα : c ≤ α) (hcβ : c ≤ β) : + (3 : ℝ) ^ (-α * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-β * ((j - N : ℕ) : ℝ)) ≤ + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := by + let leftGap : ℝ := ((m - j : ℕ) : ℝ) + let rightGap : ℝ := ((j - N : ℕ) : ℝ) + change + (3 : ℝ) ^ (-α * leftGap) * (3 : ℝ) ^ (-β * rightGap) ≤ + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) + have h3_pos : 0 < (3 : ℝ) := by norm_num + have h3_one : (1 : ℝ) ≤ 3 := by norm_num + have hleft_nonneg : 0 ≤ leftGap := by positivity + have hright_nonneg : 0 ≤ rightGap := by positivity + have hgap : + ((m - N : ℕ) : ℝ) = leftGap + rightGap := by + have hnat : m - N = (m - j) + (j - N) := by omega + simpa [leftGap, rightGap, Nat.cast_add] using + congrArg (fun n : ℕ => (n : ℝ)) hnat + have hexp : + -α * leftGap + -β * rightGap ≤ + -c * ((m - N : ℕ) : ℝ) := by + have hα : c * leftGap ≤ α * leftGap := + mul_le_mul_of_nonneg_right hcα hleft_nonneg + have hβ : c * rightGap ≤ β * rightGap := + mul_le_mul_of_nonneg_right hcβ hright_nonneg + rw [hgap] + nlinarith + calc + (3 : ℝ) ^ (-α * leftGap) * (3 : ℝ) ^ (-β * rightGap) + = (3 : ℝ) ^ (-α * leftGap + -β * rightGap) := by + rw [← Real.rpow_add h3_pos] + _ ≤ (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := + Real.rpow_le_rpow_of_exponent_le h3_one hexp + +/-- +Source label `l.union.bound`: finite convolution bound for the two decay +mechanisms before substituting the high-moment exponents. +-/ +theorem sum_Icc_rpow_three_two_scale_decay_le_card_mul_min_decay + {α β c : ℝ} {N m : ℕ} + (hcα : c ≤ α) (hcβ : c ≤ β) : + (∑ j ∈ Finset.Icc N m, + (3 : ℝ) ^ (-α * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-β * ((j - N : ℕ) : ℝ))) ≤ + ((Finset.Icc N m).card : ℝ) * + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := by + let envelope : ℝ := (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) + calc + (∑ j ∈ Finset.Icc N m, + (3 : ℝ) ^ (-α * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-β * ((j - N : ℕ) : ℝ))) ≤ + ∑ _j ∈ Finset.Icc N m, envelope := by + refine Finset.sum_le_sum ?_ + intro j hj + exact rpow_three_two_scale_decay_le_min_decay + (Finset.mem_Icc.mp hj).1 (Finset.mem_Icc.mp hj).2 hcα hcβ + _ = ((Finset.Icc N m).card : ℝ) * + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := by + rw [Finset.sum_const] + simp [envelope, nsmul_eq_mul] + +/-- +Source label `l.union.bound`: finite convolution bound in the manuscript's +`(1 + m - N) 3^{-c_Q(m-N)}` form. +-/ +theorem sum_Icc_rpow_three_two_scale_decay_le_length_mul_min_decay + {α β c : ℝ} {N m : ℕ} + (hNm : N ≤ m) (hcα : c ≤ α) (hcβ : c ≤ β) : + (∑ j ∈ Finset.Icc N m, + (3 : ℝ) ^ (-α * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-β * ((j - N : ℕ) : ℝ))) ≤ + ((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := by + have hcard : (Finset.Icc N m).card = m - N + 1 := by + rw [Nat.card_Icc] + omega + calc + (∑ j ∈ Finset.Icc N m, + (3 : ℝ) ^ (-α * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-β * ((j - N : ℕ) : ℝ))) ≤ + ((Finset.Icc N m).card : ℝ) * + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := + sum_Icc_rpow_three_two_scale_decay_le_card_mul_min_decay hcα hcβ + _ = ((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ (-c * ((m - N : ℕ) : ℝ)) := by + rw [hcard] + +/-- +Source labels `l.union.bound`, `a.HM`: high-moment specialization of the +two-scale convolution estimate appearing in the stochastic maximal union bound. +-/ +theorem sum_Icc_rpow_three_highCenteredMoment_convolution_le + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {N m : ℕ} (hNm : N ≤ m) : + (∑ j ∈ Finset.Icc N m, + (3 : ℝ) ^ + (-(hm.Q * hc.rhoM - (d : ℝ)) * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ))) ≤ + ((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)) := + sum_Icc_rpow_three_two_scale_decay_le_length_mul_min_decay + (α := hm.Q * hc.rhoM - (d : ℝ)) (β := hm.Q * hm.gamma) + (c := min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) + hNm + (min_le_left (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) + (min_le_right (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) + +/-- +Source label `l.union.bound`: the deterministic `Q`-moment envelope for the +product of the terminal-normalization cost and the weak-norm scale weight +`3^{-rho_M(m-j)}`. +-/ +noncomputable def terminalWeakMomentWeight {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (terminalCost : ENNReal) + (m j : ℕ) : ENNReal := + terminalCost ^ hm.Q * + ENNReal.ofReal + ((3 : ℝ) ^ (-(hm.Q * hc.rhoM) * ((m - j : ℕ) : ℝ))) + +/-- +Source label `l.union.bound`: if the deterministic multiplier is bounded by +`terminalCost * 3^{-rho_M(m-j)}`, then its `Q`-moment is bounded by the +factorized terminal weak-moment envelope used in the descendant sum. +-/ +theorem rpow_le_terminalWeakMomentWeight_of_le + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {terminalCost : ENNReal} {m j : ℕ} + {w : Homogenization.TriadicCube d → ENNReal} + {R : Homogenization.TriadicCube d} + (hw : + w R ≤ terminalCost * + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + w R ^ hm.Q ≤ terminalWeakMomentWeight hm terminalCost m j := by + have hq_nonneg : 0 ≤ hm.Q := le_of_lt (highCenteredMoment_Q_pos hm) + have h3_nonneg : 0 ≤ (3 : ℝ) := by norm_num + have hweak_nonneg : + 0 ≤ (3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)) := by + positivity + have hweak_rpow : + (ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) ^ hm.Q = + ENNReal.ofReal + ((3 : ℝ) ^ (-(hm.Q * hc.rhoM) * ((m - j : ℕ) : ℝ))) := by + rw [ENNReal.ofReal_rpow_of_nonneg hweak_nonneg hq_nonneg] + congr 1 + calc + ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ))) ^ hm.Q + = (3 : ℝ) ^ + ((-hc.rhoM * ((m - j : ℕ) : ℝ)) * hm.Q) := by + rw [← Real.rpow_mul h3_nonneg] + _ = (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * ((m - j : ℕ) : ℝ)) := by + ring_nf + calc + w R ^ hm.Q + ≤ (terminalCost * + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) ^ + hm.Q := + ENNReal.rpow_le_rpow hw hq_nonneg + _ = terminalCost ^ hm.Q * + (ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) ^ hm.Q := by + rw [ENNReal.mul_rpow_of_nonneg _ _ hq_nonneg] + _ = terminalWeakMomentWeight hm terminalCost m j := by + rw [hweak_rpow] + rfl + +/-- +Source label `l.union.bound`: real algebra turning descendant counting and +the two decay weights into the manuscript's convolution summand. +-/ +theorem real_descendant_count_mul_highCenteredMoment_decay_eq + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) {N m j : ℕ} : + (((((3 ^ d) ^ (m - j) : ℕ) : ℝ) * + (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * ((m - j : ℕ) : ℝ))) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)))) = + hm.C_Q * + ((3 : ℝ) ^ + (-(hm.Q * hc.rhoM - (d : ℝ)) * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ))) := by + let leftGap : ℝ := ((m - j : ℕ) : ℝ) + let rightGap : ℝ := ((j - N : ℕ) : ℝ) + have h3_pos : 0 < (3 : ℝ) := by norm_num + have hcount : + (((3 ^ d) ^ (m - j) : ℕ) : ℝ) = + (3 : ℝ) ^ ((d : ℝ) * leftGap) := by + rw [Nat.cast_pow, Nat.cast_pow] + norm_num only [Nat.cast_ofNat] + rw [← pow_mul, ← Real.rpow_natCast] + congr 1 + simp [leftGap, Nat.cast_mul] + change + (((((3 ^ d) ^ (m - j) : ℕ) : ℝ) * + (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * leftGap)) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap))) = + hm.C_Q * + ((3 : ℝ) ^ (-(hm.Q * hc.rhoM - (d : ℝ)) * leftGap) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap)) + calc + (((((3 ^ d) ^ (m - j) : ℕ) : ℝ) * + (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * leftGap)) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap))) + = + (((3 : ℝ) ^ ((d : ℝ) * leftGap) * + (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * leftGap)) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap))) := by + rw [hcount] + _ = + ((3 : ℝ) ^ (((d : ℝ) * leftGap) + (-(hm.Q * hc.rhoM) * leftGap)) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap))) := by + rw [← Real.rpow_add h3_pos] + _ = + ((3 : ℝ) ^ (-(hm.Q * hc.rhoM - (d : ℝ)) * leftGap) * + (hm.C_Q * (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap))) := by + congr 2 + ring + _ = + hm.C_Q * + ((3 : ℝ) ^ (-(hm.Q * hc.rhoM - (d : ℝ)) * leftGap) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * rightGap)) := by + ring + +/-- +Source label `l.union.bound`: the explicit `ENNReal` summand produced by +the terminal/weak bridge and `a.HM` is exactly the `C_Q` multiple of the real +two-scale convolution summand, times the terminal normalization cost. +-/ +theorem terminalWeak_highCenteredMoment_summand_eq_convolution + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (terminalCost : ENNReal) + {N m j : ℕ} : + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (terminalWeakMomentWeight hm terminalCost m j * + highCenteredMomentEnvelope hm N j) = + terminalCost ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * + ((3 : ℝ) ^ + (-(hm.Q * hc.rhoM - (d : ℝ)) * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)))) := by + let count : ℝ := (((3 ^ d) ^ (m - j) : ℕ) : ℝ) + let weakDecay : ℝ := + (3 : ℝ) ^ (-(hm.Q * hc.rhoM) * ((m - j : ℕ) : ℝ)) + let momentDecay : ℝ := + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)) + have hcount_nonneg : 0 ≤ count := by + dsimp [count] + positivity + have hweak_nonneg : 0 ≤ weakDecay := by + dsimp [weakDecay] + positivity + have hmoment_nonneg : 0 ≤ hm.C_Q * momentDecay := by + dsimp [momentDecay] + exact mul_nonneg hm.C_Q_nonneg (by positivity) + have hcount_coe : + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) = ENNReal.ofReal count := by + simp [count] + have hreal := + real_descendant_count_mul_highCenteredMoment_decay_eq + (d := d) (hc := hc) hm (N := N) (m := m) (j := j) + calc + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (terminalWeakMomentWeight hm terminalCost m j * + highCenteredMomentEnvelope hm N j) + = + terminalCost ^ hm.Q * + ((ENNReal.ofReal count * ENNReal.ofReal weakDecay) * + ENNReal.ofReal (hm.C_Q * momentDecay)) := by + rw [terminalWeakMomentWeight, highCenteredMomentEnvelope, hcount_coe] + dsimp [weakDecay, momentDecay] + ac_rfl + _ = + terminalCost ^ hm.Q * + ENNReal.ofReal ((count * weakDecay) * (hm.C_Q * momentDecay)) := by + rw [← ENNReal.ofReal_mul hcount_nonneg] + rw [← ENNReal.ofReal_mul (mul_nonneg hcount_nonneg hweak_nonneg)] + _ = + terminalCost ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * + ((3 : ℝ) ^ + (-(hm.Q * hc.rhoM - (d : ℝ)) * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)))) := by + rw [hreal] + +/-- +Source label `l.union.bound`: after substituting `a.HM`, terminal normalization, +weak weights, and the library's descendant counting, the finite `ENNReal` sum is bounded +by the real convolution envelope from the paper. +-/ +theorem sum_Icc_terminalWeak_highCenteredMomentEnvelope_le_convolution + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (terminalCost : ENNReal) + {N m : ℕ} (hNm : N ≤ m) : + (∑ j ∈ Finset.Icc N m, + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (terminalWeakMomentWeight hm terminalCost m j * + highCenteredMomentEnvelope hm N j)) ≤ + terminalCost ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + let convTerm : ℕ → ℝ := fun j => + (3 : ℝ) ^ + (-(hm.Q * hc.rhoM - (d : ℝ)) * ((m - j : ℕ) : ℝ)) * + (3 : ℝ) ^ (-(hm.Q * hm.gamma) * ((j - N : ℕ) : ℝ)) + have hterm_nonneg : + ∀ j, j ∈ Finset.Icc N m → 0 ≤ hm.C_Q * convTerm j := by + intro j _hj + dsimp [convTerm] + exact mul_nonneg hm.C_Q_nonneg (mul_nonneg (by positivity) (by positivity)) + have hconv := + sum_Icc_rpow_three_highCenteredMoment_convolution_le hm hNm + have hscaled : + hm.C_Q * (∑ j ∈ Finset.Icc N m, convTerm j) ≤ + hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ))) := by + exact mul_le_mul_of_nonneg_left hconv hm.C_Q_nonneg + calc + (∑ j ∈ Finset.Icc N m, + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (terminalWeakMomentWeight hm terminalCost m j * + highCenteredMomentEnvelope hm N j)) + = + ∑ j ∈ Finset.Icc N m, + terminalCost ^ hm.Q * ENNReal.ofReal (hm.C_Q * convTerm j) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + exact terminalWeak_highCenteredMoment_summand_eq_convolution + (d := d) (hc := hc) hm terminalCost (N := N) (m := m) (j := j) + _ = + terminalCost ^ hm.Q * + (∑ j ∈ Finset.Icc N m, ENNReal.ofReal (hm.C_Q * convTerm j)) := by + rw [Finset.mul_sum] + _ = + terminalCost ^ hm.Q * + ENNReal.ofReal (∑ j ∈ Finset.Icc N m, hm.C_Q * convTerm j) := by + rw [ENNReal.ofReal_sum_of_nonneg hterm_nonneg] + _ = + terminalCost ^ hm.Q * + ENNReal.ofReal (hm.C_Q * (∑ j ∈ Finset.Icc N m, convTerm j)) := by + rw [Finset.mul_sum] + _ ≤ + terminalCost ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + exact mul_le_mul_right (ENNReal.ofReal_le_ofReal hscaled) + (terminalCost ^ hm.Q) + +/-- +Source label `l.union.bound`: once the terminal-normalization multiplier is +bounded by `(2+T)^A`, its `Q`-moment contribution is bounded by +`(2+T)^{A Q}`. +-/ +theorem terminalCost_rpow_le_polynomial_of_le + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + {terminalCost : ENNReal} {T A : ℝ} + (hT : 1 ≤ T) + (hcost : terminalCost ≤ ENNReal.ofReal ((2 + T : ℝ) ^ A)) : + terminalCost ^ hm.Q ≤ ENNReal.ofReal ((2 + T : ℝ) ^ (A * hm.Q)) := by + have hq_nonneg : 0 ≤ hm.Q := le_of_lt (highCenteredMoment_Q_pos hm) + have hbase_nonneg : 0 ≤ (2 + T : ℝ) := by linarith + have hpoly_nonneg : 0 ≤ (2 + T : ℝ) ^ A := + Real.rpow_nonneg hbase_nonneg A + calc + terminalCost ^ hm.Q + ≤ (ENNReal.ofReal ((2 + T : ℝ) ^ A)) ^ hm.Q := + ENNReal.rpow_le_rpow hcost hq_nonneg + _ = ENNReal.ofReal (((2 + T : ℝ) ^ A) ^ hm.Q) := by + rw [ENNReal.ofReal_rpow_of_nonneg hpoly_nonneg hq_nonneg] + _ = ENNReal.ofReal ((2 + T : ℝ) ^ (A * hm.Q)) := by + rw [← Real.rpow_mul hbase_nonneg] + +/-- +Source label `l.S.and.J`: Lyapunov monotonicity from the high `Q` moment to +the second moment on a probability space. +-/ +theorem eLpNorm_two_le_eLpNorm_of_two_le_real_exponent + {Ω : Type*} [MeasurableSpace Ω] {μ : MeasureTheory.Measure Ω} + [MeasureTheory.IsProbabilityMeasure μ] {X : Ω → ℝ} {Q : ℝ} + (hQ : (2 : ℝ) ≤ Q) + (hX : MeasureTheory.AEStronglyMeasurable X μ) : + MeasureTheory.eLpNorm X (2 : ENNReal) μ ≤ + MeasureTheory.eLpNorm X (ENNReal.ofReal Q) μ := by + have hQenn : (2 : ENNReal) ≤ ENNReal.ofReal Q := by + calc + (2 : ENNReal) = ENNReal.ofReal (2 : ℝ) := by norm_num + _ ≤ ENNReal.ofReal Q := ENNReal.ofReal_le_ofReal hQ + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le hQenn hX + +/-- +Source label `l.union.bound`: the manuscript step "Taking the power `2 / Q`" +from a `Q`-moment estimate to a second-moment estimate. +-/ +theorem lintegral_enorm_rpow_two_le_lintegral_enorm_rpow_rpow_of_two_le + {Ω : Type*} [MeasurableSpace Ω] {μ : MeasureTheory.Measure Ω} + [MeasureTheory.IsProbabilityMeasure μ] {X : Ω → ℝ} {Q : ℝ} {B : ENNReal} + (hQ : (2 : ℝ) ≤ Q) + (hX : MeasureTheory.AEStronglyMeasurable X μ) + (hB : ∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ ≤ B) : + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ ≤ B ^ ((2 : ℝ) / Q) := by + have hQ_pos : 0 < Q := by linarith + have hQ_nonneg : 0 ≤ Q := le_of_lt hQ_pos + have hQ_ne_zero : Q ≠ 0 := ne_of_gt hQ_pos + have hQenn_ne_zero : ENNReal.ofReal Q ≠ 0 := by + simp [ENNReal.ofReal_eq_zero, not_le_of_gt hQ_pos] + have hQenn_ne_top : ENNReal.ofReal Q ≠ ⊤ := + ENNReal.ofReal_ne_top + have htwo_ne_zero : (2 : ENNReal) ≠ 0 := by norm_num + have htwo_ne_top : (2 : ENNReal) ≠ ⊤ := by norm_num + have hnorm : + (∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ) ^ (1 / (2 : ℝ)) ≤ + (∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ (1 / Q) := by + have hmono := + eLpNorm_two_le_eLpNorm_of_two_le_real_exponent + (μ := μ) (X := X) hQ hX + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (p := (2 : ENNReal)) htwo_ne_zero htwo_ne_top, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (p := ENNReal.ofReal Q) hQenn_ne_zero hQenn_ne_top] at hmono + simpa [ENNReal.toReal_ofReal hQ_nonneg] using hmono + have hpow := ENNReal.rpow_le_rpow hnorm (by norm_num : 0 ≤ (2 : ℝ)) + have hleft : + ((∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ) ^ (1 / (2 : ℝ))) ^ (2 : ℝ) = + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ := by + rw [← ENNReal.rpow_mul] + norm_num + have hright : + ((∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ (1 / Q)) ^ (2 : ℝ) = + (∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ ((2 : ℝ) / Q) := by + rw [← ENNReal.rpow_mul] + congr 1 + field_simp [hQ_ne_zero] + have hmoment : + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ ≤ + (∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ ((2 : ℝ) / Q) := by + calc + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ + = ((∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ) ^ + (1 / (2 : ℝ))) ^ (2 : ℝ) := hleft.symm + _ ≤ ((∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ (1 / Q)) ^ (2 : ℝ) := hpow + _ = (∫⁻ ω, ‖X ω‖ₑ ^ Q ∂ μ) ^ ((2 : ℝ) / Q) := hright + exact hmoment.trans <| + ENNReal.rpow_le_rpow hB (div_nonneg (by norm_num) hQ_nonneg) + +/-- +Source labels `a.HM`, `l.union.bound`: high-moment-parameter specialization +of the `2 / Q` power conversion for stochastic maximal variables. +-/ +theorem lintegral_enorm_rpow_two_le_lintegral_enorm_rpow_rpow_highCenteredMoment + {Ω : Type*} [MeasurableSpace Ω] {μ : MeasureTheory.Measure Ω} + [MeasureTheory.IsProbabilityMeasure μ] {X : Ω → ℝ} + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (hX : MeasureTheory.AEStronglyMeasurable X μ) {B : ENNReal} + (hB : ∫⁻ ω, ‖X ω‖ₑ ^ hm.Q ∂ μ ≤ B) : + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ ≤ B ^ ((2 : ℝ) / hm.Q) := + lintegral_enorm_rpow_two_le_lintegral_enorm_rpow_rpow_of_two_le + hm.two_le_Q hX hB + +/-- +Source label `M_m^st`: the coercion from an ENNReal finite maximum to the real +maximum is harmless for upper bounds by the original ENNReal quantity. +-/ +theorem enorm_ennreal_toReal_le (x : ENNReal) : ‖x.toReal‖ₑ ≤ x := by + rw [Real.enorm_eq_ofReal ENNReal.toReal_nonneg] + exact ENNReal.ofReal_toReal_le + +/-- +Source labels `l.union.bound`, `M_m^st`: an ENNReal envelope controlling the +`Q`-th power of a real stochastic maximum also controls its second moment. +-/ +theorem lintegral_enorm_rpow_two_le_of_lintegral_ennreal_envelope_highCenteredMoment + {Ω : Type*} [MeasurableSpace Ω] {μ : MeasureTheory.Measure Ω} + [MeasureTheory.IsProbabilityMeasure μ] {X : Ω → ℝ} {Z : Ω → ENNReal} + {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (hX : MeasureTheory.AEStronglyMeasurable X μ) {B : ENNReal} + (hpoint : ∀ ω, ‖X ω‖ₑ ^ hm.Q ≤ Z ω) + (hB : ∫⁻ ω, Z ω ∂ μ ≤ B) : + ∫⁻ ω, ‖X ω‖ₑ ^ (2 : ℝ) ∂ μ ≤ B ^ ((2 : ℝ) / hm.Q) := by + have hQ : + ∫⁻ ω, ‖X ω‖ₑ ^ hm.Q ∂ μ ≤ B := + (MeasureTheory.lintegral_mono hpoint).trans hB + exact + lintegral_enorm_rpow_two_le_lintegral_enorm_rpow_rpow_highCenteredMoment + hm hX hQ + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/MomentConsequences/P2.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/MomentConsequences/P2.lean new file mode 100644 index 0000000000..a5af278f77 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/EntryScale/MomentConsequences/P2.lean @@ -0,0 +1,934 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.BigOperators.Ring.Finset +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.SpecialFunctions.Pow.Asymptotics +public import Mathlib.Data.Finset.Lattice.Fold +public import Mathlib.Data.NNReal.Basic +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import Mathlib.MeasureTheory.Integral.Lebesgue.Add +public import Mathlib.Order.Interval.Finset.Nat +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section52.GeometrySeries.DescendantCardinality +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarsePoincare.Setup.HarmonicAndData +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.DeterministicAlgebra +public import LeanPool.CoarseGraining.Homogenization.HighContrast.EntryScale.MomentConsequences.P1 + +/-! # P2 -/ + +@[expose] public section + +open scoped BigOperators +open scoped Topology +open Filter + +namespace Homogenization.HighContrast.EntryScale + +/-- File-level typeclass cache: `Matrix` is a plain `def`, so blind instance +search for `PseudoMetrizableSpace (FullBlockMat d)` does not unfold it under +mathlib 4.33; the a.e.-measurability lemmas below need this instance directly. -/ +private instance instPseudoMetrizableSpaceFullBlockMat (d : ℕ) : + TopologicalSpace.PseudoMetrizableSpace (Homogenization.FullBlockMat d) := + inferInstanceAs + (TopologicalSpace.PseudoMetrizableSpace + (Homogenization.BlockCoord d → Homogenization.BlockCoord d → ℝ)) + +/-- +Source label `M_m^st`: for a positive exponent, raising a finite ENNReal +maximum to that exponent commutes with the finite maximum. +-/ +theorem finset_sup_rpow_of_pos {ι : Type*} (s : Finset ι) (x : ι → ENNReal) + {q : ℝ} (hq : 0 < q) : + (s.sup x) ^ q = s.sup (fun i => x i ^ q) := by + classical + refine Finset.induction_on s ?_ ?_ + · rw [Finset.sup_empty, Finset.sup_empty] + exact ENNReal.zero_rpow_of_pos hq + · intro a s ha ih + rw [Finset.sup_insert, Finset.sup_insert, + ENNReal.max_rpow (le_of_lt hq), ih] + +/-- +Source label `l.union.bound`: deterministic finite-max step for `ENNReal` +integrands. +-/ +theorem finset_sup_le_sum_ennreal {ι : Type*} (s : Finset ι) (x : ι → ENNReal) : + s.sup x ≤ ∑ i ∈ s, x i := by + refine Finset.sup_le ?_ + intro i hi + exact Finset.single_le_sum (fun j _hj => zero_le) hi + +/-- +Source label `l.union.bound`: a.e. measurability of the finite maximum +appearing in the stochastic maximal union bound. +-/ +theorem aemeasurable_finset_sup_ennreal + {Ω ι : Type*} [MeasurableSpace Ω] {μ : MeasureTheory.Measure Ω} + (s : Finset ι) (X : ι → Ω → ENNReal) + (hX : ∀ i ∈ s, AEMeasurable (X i) μ) : + AEMeasurable (fun ω => s.sup (fun i => X i ω)) μ := by + classical + induction s using Finset.induction with + | empty => + change AEMeasurable (fun _ω : Ω => (⊥ : ENNReal)) μ + exact aemeasurable_const + | insert a s _ha_not_mem ih => + have ha : AEMeasurable (X a) μ := hX a (Finset.mem_insert_self a s) + have hs : ∀ i ∈ s, AEMeasurable (X i) μ := by + intro i hi + exact hX i (Finset.mem_insert_of_mem hi) + have hsup : AEMeasurable (fun ω => s.sup (fun i => X i ω)) μ := ih hs + simpa [Finset.sup_insert] using! ha.sup hsup + +/-- +Source label `l.union.bound`: finite-max lintegral bound, the measure-theoretic +core of the stochastic maximal union bound. +-/ +theorem lintegral_finset_sup_le_sum_of_lintegral_le + {Ω ι : Type*} [MeasurableSpace Ω] + (μ : MeasureTheory.Measure Ω) (s : Finset ι) + (X : ι → Ω → ENNReal) (B : ι → ENNReal) + (hX : ∀ i ∈ s, AEMeasurable (X i) μ) + (hB : ∀ i ∈ s, ∫⁻ ω, X i ω ∂ μ ≤ B i) : + ∫⁻ ω, s.sup (fun i => X i ω) ∂ μ ≤ ∑ i ∈ s, B i := by + calc + ∫⁻ ω, s.sup (fun i => X i ω) ∂ μ + ≤ ∫⁻ ω, ∑ i ∈ s, X i ω ∂ μ := + MeasureTheory.lintegral_mono fun ω => + finset_sup_le_sum_ennreal s fun i => X i ω + _ = ∑ i ∈ s, ∫⁻ ω, X i ω ∂ μ := + MeasureTheory.lintegral_finsetSum' s hX + _ ≤ ∑ i ∈ s, B i := + Finset.sum_le_sum hB + +/-- +Source label `l.union.bound`: weighted real-exponent finite-maximum bound. +This is the local real-`Q` replacement for the integer-moment finite-sup +pattern available in the library, with the weights kept explicit for the paper's +`3^{-\rho_M(m-j)}` factors. +-/ +theorem lintegral_finset_sup_weighted_rpow_le_sum + {Ω ι : Type*} [MeasurableSpace Ω] + (μ : MeasureTheory.Measure Ω) (s : Finset ι) + (w : ι → ENNReal) (X : ι → Ω → ENNReal) (B : ι → ENNReal) {q : ℝ} + (hq_nonneg : 0 ≤ q) + (hX : ∀ i ∈ s, AEMeasurable (fun ω => X i ω ^ q) μ) + (hB : ∀ i ∈ s, ∫⁻ ω, X i ω ^ q ∂ μ ≤ B i) : + ∫⁻ ω, s.sup (fun i => (w i * X i ω) ^ q) ∂ μ ≤ + ∑ i ∈ s, w i ^ q * B i := by + refine lintegral_finset_sup_le_sum_of_lintegral_le μ s + (fun i ω => (w i * X i ω) ^ q) + (fun i => w i ^ q * B i) ?_ ?_ + · intro i hi + have hfun : + (fun ω => (w i * X i ω) ^ q) = + fun ω => w i ^ q * (X i ω ^ q) := by + funext ω + rw [ENNReal.mul_rpow_of_nonneg _ _ hq_nonneg] + show AEMeasurable (fun ω => (w i * X i ω) ^ q) μ + rw [hfun] + exact (hX i hi).const_mul (w i ^ q) + · intro i hi + calc + ∫⁻ ω, (w i * X i ω) ^ q ∂ μ + = ∫⁻ ω, w i ^ q * (X i ω ^ q) ∂ μ := by + congr 1 + ext ω + rw [ENNReal.mul_rpow_of_nonneg _ _ hq_nonneg] + _ = w i ^ q * ∫⁻ ω, X i ω ^ q ∂ μ := + MeasureTheory.lintegral_const_mul'' (w i ^ q) (hX i hi) + _ ≤ w i ^ q * B i := mul_le_mul_right (hB i hi) (w i ^ q) + +/-- +Source label `l.union.bound`: weighted real-exponent finite-maximum bound +over the library's triadic descendants. The factor `((3 ^ d) ^ n)` is exactly the +descendant count from `Homogenization.descendantsAtDepth_card`. +-/ +theorem lintegral_sup_descendantsAtDepth_weighted_rpow_le_three_pow_mul + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) (n : ℕ) + (w : Homogenization.TriadicCube d → ENNReal) + (X : Homogenization.TriadicCube d → Ω → ENNReal) {B W : ENNReal} {q : ℝ} + (hq_nonneg : 0 ≤ q) + (hX : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + AEMeasurable (fun ω => X R ω ^ q) μ) + (hB : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + ∫⁻ ω, X R ω ^ q ∂ μ ≤ B) + (hwB : ∀ R ∈ Homogenization.descendantsAtDepth Q n, w R ^ q * B ≤ W) : + ∫⁻ ω, (Homogenization.descendantsAtDepth Q n).sup + (fun R => (w R * X R ω) ^ q) ∂ μ ≤ + (((3 ^ d) ^ n : ℕ) : ENNReal) * W := by + calc + ∫⁻ ω, (Homogenization.descendantsAtDepth Q n).sup + (fun R => (w R * X R ω) ^ q) ∂ μ + ≤ ∑ R ∈ Homogenization.descendantsAtDepth Q n, w R ^ q * B := + lintegral_finset_sup_weighted_rpow_le_sum μ + (Homogenization.descendantsAtDepth Q n) w X (fun _ => B) + hq_nonneg hX hB + _ ≤ ∑ R ∈ Homogenization.descendantsAtDepth Q n, W := + Finset.sum_le_sum hwB + _ = (((3 ^ d) ^ n : ℕ) : ENNReal) * W := by + simp [Homogenization.descendantsAtDepth_card Q n] + +/-- +Source label `l.union.bound`: one-scale descendant union estimate with the +paper's two inputs kept separate: a child high-moment bound and a deterministic +weight bound. This is the step producing the factor +`3^{d(m-j)} 3^{-Q rho_M(m-j)} 3^{-Q gamma(j-N)}` before the convolution in +the proof. +-/ +theorem lintegral_sup_descendantsAtDepth_weighted_rpow_le_card_mul_of_bounds + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) (n : ℕ) + (w : Homogenization.TriadicCube d → ENNReal) + (X : Homogenization.TriadicCube d → Ω → ENNReal) {B V : ENNReal} {q : ℝ} + (hq_nonneg : 0 ≤ q) + (hX : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + AEMeasurable (fun ω => X R ω ^ q) μ) + (hB : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + ∫⁻ ω, X R ω ^ q ∂ μ ≤ B) + (hw : ∀ R ∈ Homogenization.descendantsAtDepth Q n, w R ^ q ≤ V) : + ∫⁻ ω, (Homogenization.descendantsAtDepth Q n).sup + (fun R => (w R * X R ω) ^ q) ∂ μ ≤ + (((3 ^ d) ^ n : ℕ) : ENNReal) * (V * B) := by + refine lintegral_sup_descendantsAtDepth_weighted_rpow_le_three_pow_mul μ Q n + w X hq_nonneg hX hB ?_ + intro R hR + exact mul_le_mul_left (hw R hR) B + +/-- +Source labels `a.HM` and `l.union.bound`: high-moment-parameter version of the +one-scale descendant union estimate, using the real exponent `Q` from +Assumption `a.HM`. +-/ +theorem lintegral_sup_descendantsAtDepth_weighted_highCenteredMoment_le + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) (n : ℕ) + (w : Homogenization.TriadicCube d → ENNReal) + (X : Homogenization.TriadicCube d → Ω → ENNReal) {B V : ENNReal} + (hX : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + AEMeasurable (fun ω => X R ω ^ hm.Q) μ) + (hB : ∀ R ∈ Homogenization.descendantsAtDepth Q n, + ∫⁻ ω, X R ω ^ hm.Q ∂ μ ≤ B) + (hw : ∀ R ∈ Homogenization.descendantsAtDepth Q n, w R ^ hm.Q ≤ V) : + ∫⁻ ω, (Homogenization.descendantsAtDepth Q n).sup + (fun R => (w R * X R ω) ^ hm.Q) ∂ μ ≤ + (((3 ^ d) ^ n : ℕ) : ENNReal) * (V * B) := + lintegral_sup_descendantsAtDepth_weighted_rpow_le_card_mul_of_bounds + μ Q n w X (le_of_lt (highCenteredMoment_Q_pos hm)) hX hB hw + +/-- +Source label `l.union.bound`: sum the one-scale descendant maximal estimates +over manuscript scales `j = N, ..., m`. This is the stochastic union-bound +bridge immediately before substituting the explicit decay envelopes. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (w : ℕ → Homogenization.TriadicCube d → ENNReal) + (X : ℕ → Homogenization.TriadicCube d → Ω → ENNReal) + (B V : ℕ → ENNReal) + (hX : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + AEMeasurable (fun ω => X j R ω ^ hm.Q) μ) + (hB : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + ∫⁻ ω, X j R ω ^ hm.Q ∂ μ ≤ B j) + (hw : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + (w j R) ^ hm.Q ≤ V j) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (w j R * X j R ω) ^ hm.Q)) ∂ μ ≤ + ∑ j ∈ Finset.Icc N m, + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * (V j * B j) := by + refine lintegral_finset_sup_le_sum_of_lintegral_le μ (Finset.Icc N m) + (fun j ω => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (w j R * X j R ω) ^ hm.Q)) + (fun j => (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * (V j * B j)) + ?_ ?_ + · intro j hj + refine aemeasurable_finset_sup_ennreal + (Homogenization.descendantsAtDepth Q (m - j)) + (fun R ω => (w j R * X j R ω) ^ hm.Q) ?_ + intro R hR + have hq_nonneg : 0 ≤ hm.Q := le_of_lt (highCenteredMoment_Q_pos hm) + have hfun : + (fun ω => (w j R * X j R ω) ^ hm.Q) = + fun ω => (w j R) ^ hm.Q * (X j R ω ^ hm.Q) := by + funext ω + rw [ENNReal.mul_rpow_of_nonneg _ _ hq_nonneg] + show AEMeasurable (fun ω => (w j R * X j R ω) ^ hm.Q) μ + rw [hfun] + exact (hX j hj R hR).const_mul ((w j R) ^ hm.Q) + · intro j hj + exact lintegral_sup_descendantsAtDepth_weighted_highCenteredMoment_le + hm μ Q (m - j) (w j) (X j) (hX j hj) (hB j hj) (hw j hj) + +/-- +the library's triadic geometry bridge used by `l.union.bound`: a descendant at depth +`m - j` of a terminal scale-`m` cube is a scale-`j` cube. +-/ +theorem scale_eq_of_mem_descendantsAtDepth_terminal + {d : ℕ} {Q R : Homogenization.TriadicCube d} {N j m : ℕ} + (hj : j ∈ Finset.Icc N m) (hQ : Q.scale = (m : ℤ)) + (hR : R ∈ Homogenization.descendantsAtDepth Q (m - j)) : + R.scale = (j : ℤ) := by + have hscale := Homogenization.scale_eq_sub_of_mem_descendantsAtDepth hR + rw [hQ] at hscale + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + have hsub : (m : ℤ) - ((m - j : ℕ) : ℤ) = (j : ℤ) := by + omega + exact hscale.trans hsub + +/-- +Source labels `a.HM` and `l.union.bound`: substitute the scale-uniform +high centered-moment estimate into the scale-summed descendant union bridge. +This is still before terminal normalization losses and weak-norm envelopes are +specialized, so the deterministic weights remain an explicit input. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum_of_estimate + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hQ : Q.scale = (m : ℤ)) + (w : ℕ → Homogenization.TriadicCube d → ENNReal) + (X : ℕ → Homogenization.TriadicCube d → Ω → ENNReal) + (hHM : HighCenteredMomentEstimate hm μ N X) + (V : ℕ → ENNReal) + (hw : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + (w j R) ^ hm.Q ≤ V j) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (w j R * X j R ω) ^ hm.Q)) ∂ μ ≤ + ∑ j ∈ Finset.Icc N m, + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (V j * highCenteredMomentEnvelope hm N j) := by + refine lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum + (N := N) (m := m) hm μ Q w X + (fun j => highCenteredMomentEnvelope hm N j) V ?_ ?_ hw + · intro j hj R hR + exact hHM.measurable (Finset.mem_Icc.mp hj).1 + (scale_eq_of_mem_descendantsAtDepth_terminal hj hQ hR) + · intro j hj R hR + exact hHM.moment_le (Finset.mem_Icc.mp hj).1 + (scale_eq_of_mem_descendantsAtDepth_terminal hj hQ hR) + +/-- +Source labels `a.HM` and `l.union.bound`: substitute both the one-block +high-moment estimate and the deterministic terminal/weak-norm multiplier +`terminalCost * 3^{-rho_M(m-j)}` into the scale-summed descendant union bridge. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum_of_estimate_of_terminalWeak_le + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hQ : Q.scale = (m : ℤ)) + (w : ℕ → Homogenization.TriadicCube d → ENNReal) + (X : ℕ → Homogenization.TriadicCube d → Ω → ENNReal) + (hHM : HighCenteredMomentEstimate hm μ N X) + (terminalCost : ENNReal) + (hw : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + w j R ≤ terminalCost * + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (w j R * X j R ω) ^ hm.Q)) ∂ μ ≤ + ∑ j ∈ Finset.Icc N m, + (((3 ^ d) ^ (m - j) : ℕ) : ENNReal) * + (terminalWeakMomentWeight hm terminalCost m j * + highCenteredMomentEnvelope hm N j) := by + refine + lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum_of_estimate + hm μ Q hQ w X hHM (fun j => terminalWeakMomentWeight hm terminalCost m j) + ?_ + intro j hj R hR + exact rpow_le_terminalWeakMomentWeight_of_le hm + (m := m) (j := j) + (w := fun R => w j R) + (hw j hj R hR) + +/-- +Source labels `a.HM` and `l.union.bound`: full stochastic maximal lintegral +bridge through the manuscript's finite convolution envelope, still with the +terminal-normalization polynomial cost left as the explicit `terminalCost`. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_convolution_of_estimate_of_terminalWeak_le + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hNm : N ≤ m) (hQ : Q.scale = (m : ℤ)) + (w : ℕ → Homogenization.TriadicCube d → ENNReal) + (X : ℕ → Homogenization.TriadicCube d → Ω → ENNReal) + (hHM : HighCenteredMomentEstimate hm μ N X) + (terminalCost : ENNReal) + (hw : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + w j R ≤ terminalCost * + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (w j R * X j R ω) ^ hm.Q)) ∂ μ ≤ + terminalCost ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + exact + (lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_sum_of_estimate_of_terminalWeak_le + hm μ Q hQ w X hHM terminalCost hw).trans + (sum_Icc_terminalWeak_highCenteredMomentEnvelope_le_convolution + hm terminalCost hNm) + +/-- +Source labels `a.HM` and `l.union.bound`: concrete full-block version of the +stochastic maximal union bound above the entry scale. The high-moment +hypothesis is imposed on the intermediate-normalized centered full-block +deviation, while the displayed maximum uses the terminal-normalized deviation; +the deterministic comparison from `DeterministicAlgebra.lean` supplies the +factor `T = widetildeTheta_0`. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weak_terminalCenteredFullBlockDeviation_le_convolution_of_highMoment + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hNm : N ≤ m) (hQ : Q.scale = (m : ℤ)) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (Y : ℕ → Homogenization.TriadicCube d → Ω → Homogenization.FullBlockMat d) + (hHM : + HighCenteredMomentEstimate hm μ N + (intermediateCenteredFullBlockDeviation hP hStruct Y)) + (hweak : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + weak j R ≤ + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCenteredFullBlockDeviation hP hStruct m Y j R ω) ^ hm.Q)) ∂ μ ≤ + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + let T : ENNReal := + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) + let wTerminal : ℕ → Homogenization.TriadicCube d → ENNReal := + fun j R => T * weak j R + let X : ℕ → Homogenization.TriadicCube d → Ω → ENNReal := + intermediateCenteredFullBlockDeviation hP hStruct Y + have hQ_nonneg : 0 ≤ hm.Q := by + linarith [hm.two_le_Q] + have hpoint : + ∀ ω, + (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCenteredFullBlockDeviation hP hStruct m Y j R ω) ^ hm.Q)) ≤ + (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q)) := by + intro ω + refine Finset.sup_le ?_ + intro j hj + refine Finset.sup_le ?_ + intro R hR + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + have hterminal : + terminalCenteredFullBlockDeviation hP hStruct m Y j R ω ≤ + T * X j R ω := by + simpa [T, X] using + terminalCenteredFullBlockDeviation_le_initialWidetildeTheta_mul_intermediate_of_P4 + hP hStruct hP4 m Y hjm R ω + have hmul : + weak j R * terminalCenteredFullBlockDeviation hP hStruct m Y j R ω ≤ + wTerminal j R * X j R ω := by + calc + weak j R * + terminalCenteredFullBlockDeviation hP hStruct m Y j R ω + ≤ weak j R * (T * X j R ω) := + mul_le_mul_right hterminal (weak j R) + _ = wTerminal j R * X j R ω := by + simp [wTerminal, mul_assoc, mul_comm] + have hpow := ENNReal.rpow_le_rpow hmul hQ_nonneg + have hinner : + (wTerminal j R * X j R ω) ^ hm.Q ≤ + (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q) := + Finset.le_sup + (s := Homogenization.descendantsAtDepth Q (m - j)) + (f := fun R => (wTerminal j R * X j R ω) ^ hm.Q) hR + have houter : + (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q) ≤ + (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q)) := + Finset.le_sup + (s := Finset.Icc N m) + (f := fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q)) hj + exact hpow.trans (hinner.trans houter) + have hwTerminal : + ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + wTerminal j R ≤ T * + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ))) := by + intro j hj R hR + simpa [wTerminal] using + mul_le_mul_right (hweak j hj R hR) T + have hconv := + lintegral_sup_Icc_descendantsAtDepth_weighted_highCenteredMoment_le_convolution_of_estimate_of_terminalWeak_le + hm μ Q hNm hQ wTerminal X hHM T hwTerminal + calc + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCenteredFullBlockDeviation hP hStruct m Y j R ω) ^ hm.Q)) ∂ μ + ≤ ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => (wTerminal j R * X j R ω) ^ hm.Q)) ∂ μ := + MeasureTheory.lintegral_mono hpoint + _ ≤ T ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := hconv + _ = + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + rfl + +/-- +Source labels `a.HM` and `l.union.bound`: the library's coarse-block specialization of +the terminal-normalized stochastic maximal union bound. The high-moment +hypothesis is imposed on the concrete intermediate-normalized coarse-block +deviation from `a.HM`. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weak_terminalCoarseBlockDeviation_le_convolution_of_highMoment + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hNm : N ≤ m) (hQ : Q.scale = (m : ℤ)) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (a : Ω → Homogenization.RegCoeffField d) + (hHM : + HighCenteredMomentEstimate hm μ N + (intermediateCoarseBlockDeviation hP hStruct a)) + (hweak : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + weak j R ≤ + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCoarseBlockDeviation hP hStruct m a j R ω) ^ hm.Q)) ∂ μ ≤ + ENNReal.ofReal + (Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) ^ hm.Q * + ENNReal.ofReal + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ)))) := by + simpa [terminalCoarseBlockDeviation, intermediateCoarseBlockDeviation] using + lintegral_sup_Icc_descendantsAtDepth_weak_terminalCenteredFullBlockDeviation_le_convolution_of_highMoment + hP hStruct hP4 hm μ Q hNm hQ weak + (coarseFullBlockMatrixAtCubeProcess a) hHM hweak + +/-- +Source labels `a.HM` and `l.union.bound`: polynomial form of the concrete +terminal coarse-block union bound. The terminal normalization comparison gives +the manuscript polynomial exponent `A = 1`. +-/ +theorem lintegral_sup_Icc_descendantsAtDepth_weak_terminalCoarseBlockDeviation_le_polynomial_convolution_of_highMoment + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) + (μ : MeasureTheory.Measure Ω) (Q : Homogenization.TriadicCube d) {N m : ℕ} + (hNm : N ≤ m) (hQ : Q.scale = (m : ℤ)) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (a : Ω → Homogenization.RegCoeffField d) + (hHM : + HighCenteredMomentEstimate hm μ N + (intermediateCoarseBlockDeviation hP hStruct a)) + (hweak : ∀ j ∈ Finset.Icc N m, + ∀ R ∈ Homogenization.descendantsAtDepth Q (m - j), + weak j R ≤ + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ)))) : + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCoarseBlockDeviation hP hStruct m a j R ω) ^ hm.Q)) ∂ μ ≤ + ENNReal.ofReal + (((2 + + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) ^ hm.Q) * + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ))))) := by + let Treal := Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4 + let envelope : ℝ := + hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ))) + have hT : 1 ≤ Treal := by + simpa [Treal] using one_le_initialWidetildeTheta_of_P4 hP hStruct hP4 + have hcost : + ENNReal.ofReal Treal ≤ ENNReal.ofReal ((2 + Treal : ℝ) ^ (1 : ℝ)) := + ENNReal.ofReal_le_ofReal (by + rw [Real.rpow_one] + linarith) + have hterminalQ : + ENNReal.ofReal Treal ^ hm.Q ≤ + ENNReal.ofReal ((2 + Treal : ℝ) ^ ((1 : ℝ) * hm.Q)) := + terminalCost_rpow_le_polynomial_of_le + (d := d) (hc := hc) hm (terminalCost := ENNReal.ofReal Treal) + (T := Treal) (A := 1) hT hcost + have hpoly_nonneg : 0 ≤ (2 + Treal : ℝ) ^ hm.Q := by + have hbase_nonneg : 0 ≤ (2 + Treal : ℝ) := by linarith + exact Real.rpow_nonneg hbase_nonneg hm.Q + have hconv := + lintegral_sup_Icc_descendantsAtDepth_weak_terminalCoarseBlockDeviation_le_convolution_of_highMoment + hP hStruct hP4 hm μ Q hNm hQ weak a hHM hweak + calc + ∫⁻ ω, (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCoarseBlockDeviation hP hStruct m a j R ω) ^ hm.Q)) ∂ μ + ≤ ENNReal.ofReal Treal ^ hm.Q * ENNReal.ofReal envelope := by + simpa [Treal, envelope] using hconv + _ ≤ ENNReal.ofReal ((2 + Treal : ℝ) ^ ((1 : ℝ) * hm.Q)) * + ENNReal.ofReal envelope := by + simpa [mul_comm] using + mul_le_mul_right hterminalQ (ENNReal.ofReal envelope) + _ = ENNReal.ofReal (((2 + Treal : ℝ) ^ hm.Q) * envelope) := by + rw [one_mul] + rw [← ENNReal.ofReal_mul hpoly_nonneg] + _ = + ENNReal.ofReal + (((2 + + Homogenization.Book.Ch05.widetildeThetaAtScale P (0 : ℤ) hP4) ^ hm.Q) * + (hm.C_Q * (((m - N + 1 : ℕ) : ℝ) * + (3 : ℝ) ^ + (-(min (hm.Q * hc.rhoM - (d : ℝ)) (hm.Q * hm.gamma)) * + ((m - N : ℕ) : ℝ))))) := by + rfl + +/-- +Source label `M_m^st`: the weak-norm scale weight +`3^{-rho_M(m-j)}` from the stochastic maximal term. +-/ +noncomputable def terminalStochasticWeakWeight + {d : ℕ} (hc : HighContrastExponents d) (m : ℕ) : + ℕ → Homogenization.TriadicCube d → ENNReal := + fun j _R => + ENNReal.ofReal ((3 : ℝ) ^ (-hc.rhoM * ((m - j : ℕ) : ℝ))) + +/-- +Source label `M_m^st`: the square of the inverse weak stochastic weight is +the expected positive power of the scale gap. +-/ +theorem terminalStochasticWeakWeight_inv_sq_eq + {d : ℕ} (hc : HighContrastExponents d) (m j : ℕ) + (R : Homogenization.TriadicCube d) : + (terminalStochasticWeakWeight (d := d) hc m j R)⁻¹ ^ 2 = + ENNReal.ofReal + ((3 : ℝ) ^ (2 * hc.rhoM * ((m - j : ℕ) : ℝ))) := by + let gap : ℝ := ((m - j : ℕ) : ℝ) + let x : ℝ := (3 : ℝ) ^ (-hc.rhoM * gap) + have hx_pos : 0 < x := by + dsimp [x] + exact Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) (-hc.rhoM * gap) + have hx_inv_nonneg : 0 ≤ x⁻¹ := inv_nonneg.mpr hx_pos.le + have hreal : + x⁻¹ ^ 2 = (3 : ℝ) ^ (2 * hc.rhoM * gap) := by + calc + x⁻¹ ^ 2 = (x ^ 2)⁻¹ := by + rw [← Real.rpow_two x⁻¹, Real.inv_rpow hx_pos.le 2, Real.rpow_two] + _ = ((3 : ℝ) ^ ((-hc.rhoM * gap) * (2 : ℝ)))⁻¹ := by + dsimp [x] + rw [← Real.rpow_mul_natCast (by norm_num : (0 : ℝ) ≤ 3) + (-hc.rhoM * gap) 2] + norm_num + _ = (3 : ℝ) ^ (-((-hc.rhoM * gap) * (2 : ℝ))) := by + rw [Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3)] + _ = (3 : ℝ) ^ (2 * hc.rhoM * gap) := by + congr 1 + ring + calc + (terminalStochasticWeakWeight (d := d) hc m j R)⁻¹ ^ 2 = + (ENNReal.ofReal x)⁻¹ ^ 2 := by + rfl + _ = ENNReal.ofReal (x⁻¹ ^ 2) := by + rw [← ENNReal.ofReal_inv_of_pos hx_pos, + ← ENNReal.ofReal_pow hx_inv_nonneg 2] + _ = ENNReal.ofReal + ((3 : ℝ) ^ (2 * hc.rhoM * ((m - j : ℕ) : ℝ))) := by + rw [hreal] + +/-- +Source label `M_m^st`: the unpowered ENNReal finite maximum over scales +`N <= j <= m` and the library's descendants of the terminal cube. +-/ +noncomputable def terminalCoarseBlockStochasticEnvelope + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (N m : ℕ) (Q : Homogenization.TriadicCube d) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (a : Ω → Homogenization.RegCoeffField d) : Ω → ENNReal := + fun ω => (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + weak j R * + terminalCoarseBlockDeviation hP hStruct m a j R ω)) + +/-- +Source label `M_m^st`: real-valued version of the terminal stochastic maximum +with a supplied weak-norm weight. For the source weight +`terminalStochasticWeakWeight`, this is the finite maximum in the note written +with the library's descendants in place of `3^j Lat ∩ cu_m`. +-/ +noncomputable def terminalCoarseBlockStochasticMaxOfWeak + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (N m : ℕ) (Q : Homogenization.TriadicCube d) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (a : Ω → Homogenization.RegCoeffField d) : Ω → ℝ := + fun ω => + (terminalCoarseBlockStochasticEnvelope hP hStruct N m Q weak a ω).toReal + +/-- +Source label `M_m^st`: the literal terminal stochastic maximum from the note, +using the source weak weight `3^{-rho_M(m-j)}`. +-/ +noncomputable def terminalCoarseBlockStochasticMax + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hc : HighContrastExponents d) (N m : ℕ) + (Q : Homogenization.TriadicCube d) + (a : Ω → Homogenization.RegCoeffField d) : Ω → ℝ := + terminalCoarseBlockStochasticMaxOfWeak hP hStruct N m Q + (terminalStochasticWeakWeight hc m) a + +/-- +Source label `M_m^st`: the ENNReal envelope appearing in the terminal +coarse-block union bound, with the `Q`-th power already inside the finite max. +-/ +noncomputable def terminalCoarseBlockStochasticQEnvelope + {Ω : Type*} {d : ℕ} [NeZero d] + {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + {hc : HighContrastExponents d} + (hm : HighCenteredMomentParameters d hc) (N m : ℕ) + (Q : Homogenization.TriadicCube d) + (weak : ℕ → Homogenization.TriadicCube d → ENNReal) + (a : Ω → Homogenization.RegCoeffField d) : Ω → ENNReal := + fun ω => (Finset.Icc N m).sup + (fun j => (Homogenization.descendantsAtDepth Q (m - j)).sup + (fun R => + (weak j R * + terminalCoarseBlockDeviation hP hStruct m a j R ω) ^ hm.Q)) + +private theorem measurable_terminalDeviationFunctional + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) (j m : ℕ) : + Measurable fun Y : Homogenization.FullBlockMat d => + ENNReal.ofReal + (fullBlockOperatorNorm + (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m)) := by + refine Measurable.ennreal_ofReal ?_ + let L : Homogenization.FullBlockMat d →ₗ[ℝ] + (EuclideanSpace ℝ (Homogenization.BlockCoord d) →L[ℝ] + EuclideanSpace ℝ (Homogenization.BlockCoord d)) := { + toFun := fun M => + Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ) M + map_add' := by + intro A B + exact map_add + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ)) A B + map_smul' := by + intro r A + exact map_smul + (Matrix.toEuclideanCLM (n := Homogenization.BlockCoord d) (𝕜 := ℝ)) r A + } + have hinner : Continuous fun Y : Homogenization.FullBlockMat d => + scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m := by + dsimp [scalarCenteredFullBlockMatrixAtScale] + fun_prop + have hcont : Continuous fun Y : Homogenization.FullBlockMat d => + ‖L (scalarFullBlockNormalizerMatrixAtScale hP hStruct m * + scalarCenteredFullBlockMatrixAtScale hP hStruct j Y * + scalarFullBlockNormalizerMatrixAtScale hP hStruct m)‖ := + (L.continuous_of_finiteDimensional.comp hinner).norm + simpa [fullBlockOperatorNorm, L] using hcont.measurable +open scoped Matrix.Norms.Elementwise + +/-- +Source labels `M_m^st` and `l.S.and.J`: P4 integrability and stationarity give +a.e. measurability of each terminal-normalized concrete coarse-block deviation +over descendants of the terminal origin cube. +-/ +theorem aemeasurable_terminalCoarseBlockDeviation_origin_descendant + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + {N j m : ℕ} (hj : j ∈ Finset.Icc N m) + {R : Homogenization.TriadicCube d} + (hR : R ∈ Homogenization.descendantsAtDepth + (Homogenization.originCube d (m : ℤ)) (m - j)) : + AEMeasurable + (fun a : Homogenization.RegCoeffField d => + terminalCoarseBlockDeviation hP hStruct m + (fun x : Homogenization.RegCoeffField d => x) j R a) P := by + have hjm : j ≤ m := (Finset.mem_Icc.mp hj).2 + have hRscale : + R ∈ Homogenization.descendantsAtScale + (Homogenization.originCube d (m : ℤ)) (j : ℤ) := by + have h := Homogenization.mem_descendantsAtScale_of_mem_descendantsAtDepth hR + have hscale : + (Homogenization.originCube d (m : ℤ)).scale - ((m - j : ℕ) : ℤ) = + (j : ℤ) := by + simp only [Homogenization.originCube] + omega + simpa [hscale] using h + have hOriginInt : + MeasureTheory.Integrable + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube + (Homogenization.originCube d (j : ℤ))) P := + Homogenization.Book.Ch05.Section52.originBlockIntegrableAtScale_from_P4 + hP hStruct hP4 j + have hRInt : + MeasureTheory.Integrable + (Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube R) P := + hP.integrable_coarseFullBlockMatrixAtCube_of_mem_descendantsAtScale_originCube + hStruct.stationary (by exact_mod_cast Nat.zero_le j) (by exact_mod_cast hjm) + hRscale hOriginInt + have hbase : + AEMeasurable (fun a : Homogenization.RegCoeffField d => + Homogenization.Book.Ch04.coarseFullBlockMatrixAtCube R a) P := + hRInt.aestronglyMeasurable.aemeasurable + have hcomp := + (measurable_terminalDeviationFunctional hP hStruct j m).comp_aemeasurable hbase + simpa [terminalCoarseBlockDeviation, terminalCenteredFullBlockDeviation, + coarseFullBlockMatrixAtCubeProcess, Function.comp_def] using! hcomp + +/-- +Source labels `M_m^st` and `l.S.and.J`: the source-weighted terminal ENNReal +stochastic envelope over the origin terminal cube is a.e. measurable under the +coefficient law. +-/ +theorem aemeasurable_terminalCoarseBlockStochasticEnvelope_origin + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (hc : HighContrastExponents d) (N m : ℕ) : + AEMeasurable + (terminalCoarseBlockStochasticEnvelope hP hStruct N m + (Homogenization.originCube d (m : ℤ)) + (terminalStochasticWeakWeight (d := d) hc m) + (fun x : Homogenization.RegCoeffField d => x)) P := by + classical + unfold terminalCoarseBlockStochasticEnvelope + refine aemeasurable_finset_sup_ennreal (Finset.Icc N m) _ ?_ + intro j hj + refine aemeasurable_finset_sup_ennreal + (Homogenization.descendantsAtDepth (Homogenization.originCube d (m : ℤ)) (m - j)) + _ ?_ + intro R hR + have hdev := + aemeasurable_terminalCoarseBlockDeviation_origin_descendant hP hStruct hP4 hj hR + exact hdev.const_mul (terminalStochasticWeakWeight (d := d) hc m j R) + +/-- +Source labels `M_m^st` and `l.S.and.J`: the literal real terminal stochastic +maximum from the note is a.e. strongly measurable. This discharges the +measurability surface needed for the Lyapunov step in the stochastic window +estimate. +-/ +theorem aestronglyMeasurable_terminalCoarseBlockStochasticMax_origin + {d : ℕ} [NeZero d] {P : Homogenization.Book.Ch04.RestrictionCoeffLaw d} + (hP : Homogenization.Book.Ch04.RestrictionLawCarrier P) + (hStruct : Homogenization.Book.Ch04.RestrictionStructuralLaw P) + (hP4 : Homogenization.Book.Ch05.QuantitativeCoarseGrainedEllipticity P) + (hc : HighContrastExponents d) (N m : ℕ) : + MeasureTheory.AEStronglyMeasurable + (terminalCoarseBlockStochasticMax hP hStruct hc N m + (Homogenization.originCube d (m : ℤ)) + (fun x : Homogenization.RegCoeffField d => x)) P := by + have henv := + aemeasurable_terminalCoarseBlockStochasticEnvelope_origin hP hStruct hP4 hc N m + have hreal := henv.ennreal_toReal + unfold terminalCoarseBlockStochasticMax terminalCoarseBlockStochasticMaxOfWeak + exact hreal.aestronglyMeasurable + +theorem finset_sup_ne_top_of_forall_ne_top {ι : Type*} (s : Finset ι) + (f : ι → ENNReal) (h : ∀ i ∈ s, f i ≠ ⊤) : + s.sup f ≠ ⊤ := by + classical + revert h + refine Finset.induction_on s ?_ ?_ + · intro _h + rw [Finset.sup_empty] + exact bot_ne_top + · intro a s ha ih h + rw [Finset.sup_insert] + exact max_ne_top + (h a (Finset.mem_insert_self a s)) + (ih fun i hi => h i (Finset.mem_insert_of_mem hi)) + +end Homogenization.HighContrast.EntryScale diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance.lean new file mode 100644 index 0000000000..d8a7a8bfc2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.AveragingUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.BlockVarianceBound +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.FixedPhaseUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Polarize +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ProbeMoment +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Projection +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.RpowOpt +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Scalar +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ScalarBounds + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/AveragingUniform.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/AveragingUniform.lean new file mode 100644 index 0000000000..4d08504d60 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/AveragingUniform.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Averaging + +/-! +# Uniform-constant grid-phase averaging + +`exists_gridPhase_meanSq_le` proves the phase-comparison mean-square bound in +`∀ params, ∃ Cd, …` form. Its witness is the explicit dimensional constant +`576·d`, so the same reproduction trick used in `FixedPhaseUniform` pulls it +outside the field quantifiers, giving `∃ Cd, ∀ params`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory ProbabilityTheory +open Homogenization.Book.Ch04 (RestrictionCoeffLaw RestrictionLawCarrier) + +variable {d : ℕ} + +/-- **Uniform-constant grid-phase averaging.** The constant `Cd = 576·d` is +independent of `Θ, L, m, ℓ, N, P`. -/ +theorem exists_gridPhase_meanSq_le_uniform [NeZero d] : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {Θ : ℝ} (_hΘ : 1 ≤ Θ) {L : RestrictionCoeffLaw d} (_hP : RestrictionLawCarrier L) + (_hell : ThetaEllipticLaw Θ L) {m : ℤ} {ℓ : ℝ} (_hℓ : 4 ≤ ℓ) {N : ℕ} + (_hN : (ℓ : ℝ) ≤ (N : ℝ)) (P : BlockVec d), + ∃ σ ∈ (Finset.univ : Finset (Fin d → Fin N)), + ∫ a, + |blockVecDot P + (blockMatVecMul + (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L ≤ + Cd * Θ * ℓ⁻¹ * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + refine ⟨576 * (d : ℝ), by positivity, ?_⟩ + intro Θ hΘ L hP hell m ℓ hℓ N hN P + have : IsProbabilityMeasure L := hP.isProbability + set Msq := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hΘpos : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hN0 : (0 : ℝ) < (N : ℝ) := lt_of_lt_of_le hℓ0 hN + have hNpow0 : (0 : ℝ) < (N : ℝ) ^ d := by positivity + set B := 576 * (d : ℝ) * Θ * (N : ℝ) ^ d * Msq ^ 2 / ℓ with hBdef + have hAE : ∀ᵐ a ∂L, + (∀ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| + ≤ 2 * Msq) ∧ + (∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ≤ B) := by + filter_upwards [hell] with a ha + exact gridPhase_summed_sq_le_of_realization hΘ hℓ hN P + (fun i j => a.entry_measurable i j) ha + have hInt : ∀ σ : Fin d → Fin N, + Integrable (fun a => + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2) + L := by + intro σ + have hFφ := aestronglyMeasurable_phaseObservable hP m ℓ (gridPhase ℓ N σ) P + have hF := aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP m P + have hmeas : AEStronglyMeasurable (fun a => + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2) + L := by + have h2 : AEStronglyMeasurable (fun a => + (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) ^ 2) + L := by simpa [pow_two] using! (hFφ.sub hF).mul (hFφ.sub hF) + simpa [sq_abs] using h2 + refine (integrable_const (4 * Msq ^ 2)).mono' hmeas ?_ + filter_upwards [hAE] with a ha + have h1 := ha.1 σ + have h0 := abs_nonneg (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) + rw [Real.norm_eq_abs, abs_of_nonneg (by positivity)] + nlinarith [h1, h0] + have hsum : ∑ σ : Fin d → Fin N, + ∫ a, |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L + ≤ B := by + rw [← integral_finsetSum _ (fun σ _ => hInt σ)] + calc ∫ a, ∑ σ : Fin d → Fin N, + |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L + ≤ ∫ _a, B ∂L := + integral_mono_ae (integrable_finsetSum _ (fun σ _ => hInt σ)) (integrable_const B) + (by filter_upwards [hAE] with a ha; exact ha.2) + _ = B := by rw [integral_const]; simp + have hcard : (Finset.univ : Finset (Fin d → Fin N)).card = N ^ d := by + rw [Finset.card_univ, Fintype.card_fun, Fintype.card_fin, Fintype.card_fin] + have hne : (Finset.univ : Finset (Fin d → Fin N)).Nonempty := by + have hNpos : 0 < N := by exact_mod_cast hN0 + have : Nonempty (Fin N) := ⟨⟨0, hNpos⟩⟩ + exact Finset.univ_nonempty + have hgsum : (∑ _σ : Fin d → Fin N, B / (N : ℝ) ^ d) = B := by + rw [Finset.sum_const, hcard, nsmul_eq_mul] + push_cast + field_simp + obtain ⟨σ, hσuniv, hσ⟩ := Finset.exists_le_of_sum_le hne + (show (∑ σ : Fin d → Fin N, + ∫ a, |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ (gridPhase ℓ N σ) a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| ^ 2 ∂L) + ≤ ∑ _σ : Fin d → Fin N, B / (N : ℝ) ^ d from by rw [hgsum]; exact hsum) + refine ⟨σ, hσuniv, ?_⟩ + have hBdiv : B / (N : ℝ) ^ d = 576 * (d : ℝ) * Θ * ℓ⁻¹ * Msq ^ 2 := by + rw [hBdef]; field_simp + rw [← hBdiv]; exact hσ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/BlockVarianceBound.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/BlockVarianceBound.lean new file mode 100644 index 0000000000..14a829dd52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/BlockVarianceBound.lean @@ -0,0 +1,223 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ProbeMoment +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.BudgetAbsorption + +/-! +# Block-variance bound (`t.block.variance`) + +This is the final bridge corollary supplying the variance input consumed by the +entry-scale assembly (`Homogenization.HighContrast.EntryScale`). That consumer +integrates the concrete Chapter 4 observable +`Ch04.fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct n (originCube d n)` +over the origin cube at the same centre scale `n`; the theorem below bounds +exactly that integral by `Cd·Θ⁶·(3^n)^{-(d-2)/(d-1)}` under a +`ThetaEllipticLaw Θ P` and the structural law. + +## Proof route + +The observable is controlled a.s. by finitely many quadratic probes of the +normalized fluctuation matrix `H = D·(A_n − Ā_n)·D` +(`fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_probeSqBudget_ae`). Each +probe's second moment is the centered second moment +(`probe_sq_integral_le`), uniformly `≤ 64·Cd·Θ⁶·(3^n)^{-β}`. Summing the +`(2d)`-dimensional finite probe net absorbs the dimensional counting into the +constant `Cd`. RestrictionObservable integrability is *not* required: the pointwise budget +bound is combined through `integral_mono_of_nonneg` since the observable is a +square, hence nonnegative. + +The finite-probe linearity is kept generic in the matrix family so that the +heavy `fullBlockNormalizedFluctuationMatrix` definition is never unfolded during +the summation algebra. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open Homogenization.Book.Ch04 + (RestrictionCoeffLaw RestrictionLawCarrier RestrictionStructuralLaw fullBlockNormalizedFluctuationOperatorNormSqAtScale) +open Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale + (fullBlockNormalizedFluctuationMatrix fullBlockQuadratic fullBlockProbeSqBudget + fullBlockCoordinateProbe fullBlockPlusProbe fullBlockMinusProbe + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_probeSqBudget_ae + fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg + dotProduct_coordinateProbe_self dotProduct_plusProbe_self_le_four + dotProduct_minusProbe_self_le_four) + +variable {d : ℕ} + +/-- Integrability of the finite probe square budget, generic in the matrix +family. -/ +theorem integrable_fullBlockProbeSqBudget {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {M : RegCoeffField d → FullBlockMat d} + (hint : ∀ q : FullBlockVec d, + Integrable (fun a => (fullBlockQuadratic (M a) q) ^ 2) P) : + Integrable (fun a => fullBlockProbeSqBudget (M a)) P := by + unfold fullBlockProbeSqBudget + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro α _hα + refine (MeasureTheory.integrable_finsetSum _ ?_).const_mul _ + intro β _hβ + exact (((hint _).add (hint _)).add (hint _)).const_mul 3 + +/-- The finite probe square budget integrates to a finite sum of per-probe +second moments, generic in the matrix family. -/ +theorem integral_fullBlockProbeSqBudget_eq {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {M : RegCoeffField d → FullBlockMat d} + (hint : ∀ q : FullBlockVec d, + Integrable (fun a => (fullBlockQuadratic (M a) q) ^ 2) P) : + ∫ a, fullBlockProbeSqBudget (M a) ∂P = + (Fintype.card (BlockCoord d) : ℝ) * + ∑ α : BlockCoord d, (Fintype.card (BlockCoord d) : ℝ) * + ∑ β : BlockCoord d, 3 * + (∫ a, (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P) := by + have hterm_int : ∀ α β : BlockCoord d, + Integrable + (fun a : RegCoeffField d => + 3 * ((fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ))) P := + fun α β => (((hint _).add (hint _)).add (hint _)).const_mul 3 + unfold fullBlockProbeSqBudget + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum _ (fun α _ => (MeasureTheory.integrable_finsetSum _ + (fun β _ => hterm_int α β)).const_mul _)] + congr 1 + ext α + rw [integral_const_mul] + congr 1 + rw [integral_finsetSum _ (fun β _ => hterm_int α β)] + congr 1 + ext β + rw [integral_const_mul] + congr 1 + calc + ∫ a, (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P + = ∫ a, ((fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) + + (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ)) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := + integral_add ((hint (fullBlockCoordinateProbe α)).add (hint (fullBlockPlusProbe α β))) + (hint (fullBlockMinusProbe α β)) + _ = (∫ a, (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P) + + ∫ a, (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := by + rw [integral_add (hint (fullBlockCoordinateProbe α)) (hint (fullBlockPlusProbe α β))] + _ = ∫ a, (fullBlockQuadratic (M a) (fullBlockCoordinateProbe α)) ^ (2 : ℕ) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockPlusProbe α β)) ^ (2 : ℕ) ∂P + + ∫ a, (fullBlockQuadratic (M a) (fullBlockMinusProbe α β)) ^ (2 : ℕ) ∂P := by ring + +/-- The finite probe square budget integral is bounded by a uniform per-probe +bound `K` (valid on probes of Euclidean square norm `≤ 4`), generic in `M`. -/ +theorem integral_fullBlockProbeSqBudget_le {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + {M : RegCoeffField d → FullBlockMat d} (K : ℝ) + (hint : ∀ q : FullBlockVec d, + Integrable (fun a => (fullBlockQuadratic (M a) q) ^ 2) P) + (hbd : ∀ q : FullBlockVec d, dotProduct q q ≤ 4 → + (∫ a, (fullBlockQuadratic (M a) q) ^ 2 ∂P) ≤ K) : + ∫ a, fullBlockProbeSqBudget (M a) ∂P ≤ + (Fintype.card (BlockCoord d) : ℝ) * + ∑ _α : BlockCoord d, (Fintype.card (BlockCoord d) : ℝ) * + ∑ _β : BlockCoord d, 3 * (K + K + K) := by + rw [integral_fullBlockProbeSqBudget_eq hint] + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro α _hα + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg _) + refine Finset.sum_le_sum ?_ + intro β _hβ + have hc := hbd (fullBlockCoordinateProbe α) + (by rw [dotProduct_coordinateProbe_self]; norm_num) + have hp := hbd (fullBlockPlusProbe α β) (dotProduct_plusProbe_self_le_four α β) + have hmm := hbd (fullBlockMinusProbe α β) (dotProduct_minusProbe_self_le_four α β) + nlinarith [hc, hp, hmm] + +/-- **Finite-probe assembly for the fluctuation observable.** The observable is +nonnegative and a.s. dominated by the probe square budget, so +`integral_mono_of_nonneg` gives the bound without observable integrability. -/ +theorem integral_observable_le_of_probeBounds [NeZero d] {P : RestrictionCoeffLaw d} + [IsProbabilityMeasure P] (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) + (m : ℤ) (K : ℝ) + (hint : ∀ q : FullBlockVec d, + Integrable (fun a : RegCoeffField d => (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q) + ^ 2) P) + (hbd : ∀ q : FullBlockVec d, dotProduct q q ≤ 4 → + (∫ a : RegCoeffField d, (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q) + ^ 2 ∂P) ≤ K) : + (∫ a, fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m (originCube d m) a ∂P) + ≤ ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ _α : BlockCoord d, (Fintype.card (BlockCoord d) : ℝ) * + ∑ _β : BlockCoord d, 3 * (K + K + K)) := by + have hpoint := + fullBlockNormalizedFluctuationOperatorNormSqAtScale_le_probeSqBudget_ae + hP hStruct m (originCube d m) + have hnonneg : + (0 : RegCoeffField d → ℝ) ≤ᵐ[P] + fun a => fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m + (originCube d m) a := + Filter.Eventually.of_forall fun a => + fullBlockNormalizedFluctuationOperatorNormSqAtScale_nonneg hP hStruct m (originCube d m) a + have hbudget_int := integrable_fullBlockProbeSqBudget + (M := fun a => fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) + hint + calc + (∫ a, fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m + (originCube d m) a ∂P) + ≤ ∫ a, ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + fullBlockProbeSqBudget + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) ∂P := + integral_mono_of_nonneg hnonneg (hbudget_int.const_mul _) hpoint + _ = ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ∫ a, fullBlockProbeSqBudget + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) ∂P := by + rw [integral_const_mul] + _ ≤ ((Fintype.card (BlockCoord d) : ℝ) ^ (2 : ℕ)) * + ((Fintype.card (BlockCoord d) : ℝ) * + ∑ _α : BlockCoord d, (Fintype.card (BlockCoord d) : ℝ) * + ∑ _β : BlockCoord d, 3 * (K + K + K)) := + mul_le_mul_of_nonneg_left (integral_fullBlockProbeSqBudget_le K hint hbd) (sq_nonneg _) + +/-- **Block-variance bound (`t.block.variance`).** The normalized full-block +fluctuation observable at centre scale `m`, integrated over the origin cube at +the same scale, is bounded by `Cd·Θ⁶·(3^m)^{-(d-2)/(d-1)}` under a +`ThetaEllipticLaw Θ P` and the structural law. The constant `Cd` depends only on +the dimension `d`. + +This is the variance input consumed by the entry-scale assembly +(`Homogenization.HighContrast.EntryScale`), which integrates the same observable +at the same origin-cube scale. See the high-moment paper (Armstrong–Kuusi–Loher, +to appear). -/ +theorem integral_fullBlockNormalizedFluctuation_le [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ ∀ {Θ : ℝ} (_hΘ : 1 ≤ Θ) {P : RestrictionCoeffLaw d} [IsProbabilityMeasure P] + (hP : RestrictionLawCarrier P) (hStruct : RestrictionStructuralLaw P) (_hLaw : ThetaEllipticLaw Θ P) + {m : ℤ} (_hm : 0 ≤ m), + ∫ a, fullBlockNormalizedFluctuationOperatorNormSqAtScale hP hStruct m (originCube d m) a ∂P + ≤ Cd * Θ ^ 6 * ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) := by + obtain ⟨Cd, hCd0, hprobe⟩ := probe_sq_integral_le hd + refine ⟨576 * (Fintype.card (BlockCoord d) : ℝ) ^ 6 * Cd, + mul_nonneg (mul_nonneg (by norm_num) (by positivity)) hCd0, ?_⟩ + intro Θ hΘ P _ hP hStruct hLaw m hm + set t : ℝ := ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) with htdef + have hbound := integral_observable_le_of_probeBounds hP hStruct m (64 * Cd * Θ ^ 6 * t) + (fun q => integrable_fluctuation_probe_sq hΘ hP hStruct hLaw m q) + (fun q hq => hprobe hm hΘ hP hStruct hLaw q hq) + refine le_trans hbound (le_of_eq ?_) + simp only [Finset.sum_const, Finset.card_univ, nsmul_eq_mul] + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/FixedPhaseUniform.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/FixedPhaseUniform.lean new file mode 100644 index 0000000000..26ab1224d5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/FixedPhaseUniform.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.FixedPhase.VarianceFinal + +/-! +# Uniform-constant fixed-phase variance + +`Corridor/FixedPhase/VarianceFinal.lean` proves `fixed_phase_variance` in the +form `∀ params, ∃ Cd, 0 ≤ Cd ∧ bound`. The main theorem `t.block.variance` +needs the dimensional constant `Cd` pulled *outside* the field quantifiers, so +that a single constant serves every scale, contrast, law, and block vector. + +The witness of `fixed_phase_variance` is already uniform: it is `B/2` where `B` +comes from `summed_sq_le_of_ellipticFieldOn_uniform` (which quantifies over all +of `m, Θ, ℓ, σ, P` under a single `B`). We therefore reproduce the assembly of +`fixed_phase_variance` with the `obtain B` hoisted above the `∀`, yielding the +`∃ Cd, ∀ params` form directly. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory ProbabilityTheory + +variable {d : ℕ} + +/-- **Uniform-constant fixed-phase variance.** The constant `Cd = B/2` is +independent of `m, ℓ, Θ, σ, P, L`. -/ +theorem fixed_phase_variance_uniform [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} {ℓ Θ : ℝ} {σ : Vec d} (_hℓ4 : 4 ≤ ℓ) (_hℓL : ℓ ≤ (3 : ℝ) ^ m) + (_hΘ : 1 ≤ Θ) (P : BlockVec d) {L : Measure (RegCoeffField d)} + [IsProbabilityMeasure L] (_hURD : IsRestrictionUnitRangeDependentR L) + (_hLaw : ThetaEllipticLaw Θ L), + Var[fun a => phaseObservable ℓ σ m P a.toFun; L] + ≤ Cd * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by + classical + obtain ⟨B, hB0, hsummedU⟩ := summed_sq_le_of_ellipticFieldOn_uniform (d := d) hd + refine ⟨B / 2, by linarith, ?_⟩ + intro m ℓ Θ σ hℓ4 hℓL hΘ P L _ hURD hLaw + have hℓ0 : (0 : ℝ) < ℓ := by linarith + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + set K : Finset (Fin d → ℤ) := + coreMeetsFinset hℓ0 σ (isBounded_cubeSet (originCube d m)) with hKdef + have hK : ∀ k : Fin d → ℤ, + (coreBox ℓ σ k ∩ cubeSet (originCube d m)).Nonempty → k ∈ K := by + intro k hne + rw [hKdef, mem_coreMeetsFinset]; exact hne + set Bterm : ℝ := B * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 with hBtermdef + have hBterm0 : (0 : ℝ) ≤ Bterm := by + rw [hBtermdef]; positivity + set g : {k // k ∈ K} → RegCoeffField d × RegCoeffField d → ℝ := + fun k p => (phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun) + - phaseObservable ℓ σ m P p.1.toFun) ^ 2 with hgdef + have haeBound : ∀ᵐ p ∂(L.prod L), ∑ k : {k // k ∈ K}, g k p ≤ Bterm := by + have hL1 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.1 x) := + (Measure.quasiMeasurePreserving_fst).ae hLaw + have hL2 : ∀ᵐ p ∂(L.prod L), + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix 1 Θ (p.2 x) := + (Measure.quasiMeasurePreserving_snd).ae hLaw + filter_upwards [hL1, hL2] with p hp1 hp2 + have hmeasA1 : Measurable (fun x => fun i j => if x ∈ cubeSet (originCube d m) + then p.1 x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (p.1.entry_measurable i j).indicator hU + have hmeasA2 : Measurable (fun x => fun i j => if x ∈ cubeSet (originCube d m) + then p.2 x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (p.2.entry_measurable i j).indicator hU + obtain ⟨ā1, hEll1, hā1ae, _, _⟩ := + exists_ellipticFieldOn_ae_eq hU hΘ hmeasA1 (ae_restrict_of_ae hp1) + obtain ⟨ā2, hEll2, hā2ae, _, _⟩ := + exists_ellipticFieldOn_ae_eq hU hΘ hmeasA2 (ae_restrict_of_ae hp2) + have hphase_a : phaseObservable ℓ σ m P p.1.toFun = phaseObservable ℓ σ m P ā1 := + (phaseObservable_congr_ae hā1ae.symm) + have hpatch_ae : ∀ k : Fin d → ℤ, (patchCore ℓ σ k p.1.toFun p.2.toFun) + =ᵐ[volume.restrict (cubeSet (originCube d m))] (patchCore ℓ σ k ā1 ā2) := by + intro k + filter_upwards [hā1ae, hā2ae] with x hx1 hx2 + by_cases hc : x ∈ coreBox ℓ σ k + · rw [patchCore_apply_of_mem hc, patchCore_apply_of_mem hc, hx2] + · rw [patchCore_apply_of_not_mem hc, patchCore_apply_of_not_mem hc, hx1] + have hphase_patch : ∀ k : {k // k ∈ K}, + phaseObservable ℓ σ m P (patchCore ℓ σ k.val p.1.toFun p.2.toFun) + = phaseObservable ℓ σ m P (patchCore ℓ σ k.val ā1 ā2) := + fun k => phaseObservable_congr_ae (hpatch_ae k.val) + have hsum_eq : (∑ k : {k // k ∈ K}, g k p) + = ∑ k : {k // k ∈ K}, (phaseObservable ℓ σ m P (patchCore ℓ σ k.val ā1 ā2) + - phaseObservable ℓ σ m P ā1) ^ 2 := by + refine Finset.sum_congr rfl (fun k _ => ?_) + rw [hgdef]; simp only [hphase_patch k, hphase_a] + rw [hsum_eq, hBtermdef] + exact hsummedU hΘ hℓ4 hℓL σ P hEll1 hEll2 K + have hAESM_diag : AEStronglyMeasurable + (fun p : RegCoeffField d × RegCoeffField d => + phaseObservable ℓ σ m P p.1.toFun) (L.prod L) := + (aestronglyMeasurable_phaseObservable_of_thetaLaw hℓ0 hΘ P hLaw K hK).comp_quasiMeasurePreserving + (Measure.quasiMeasurePreserving_fst) + have hAESM_g : ∀ k : {k // k ∈ K}, AEStronglyMeasurable (g k) (L.prod L) := by + intro k + have hpatch := aestronglyMeasurable_phaseObservable_patchCore hℓ0 hΘ P hLaw K hK k + have hsub := hpatch.sub hAESM_diag + rw [hgdef] + simpa only [pow_two] using! hsub.mul hsub + have hg_int : ∀ k : {k // k ∈ K}, Integrable (g k) (L.prod L) := by + intro k + refine (integrable_const Bterm).mono' (hAESM_g k) ?_ + filter_upwards [haeBound] with p hp + rw [Real.norm_eq_abs, abs_of_nonneg (by rw [hgdef]; exact sq_nonneg _)] + have hle : g k p ≤ ∑ k' : {k // k ∈ K}, g k' p := + Finset.single_le_sum (f := fun k' => g k' p) + (fun k' _ => by rw [hgdef]; exact sq_nonneg _) (Finset.mem_univ k) + linarith [hle, hp] + have hexchange : (∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L)) + = ∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L) := + (integral_finsetSum Finset.univ (fun k _ => hg_int k)).symm + have hint_le : (∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L)) ≤ Bterm := by + calc (∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L)) + ≤ ∫ _p, Bterm ∂(L.prod L) := + integral_mono_ae (integrable_finsetSum _ (fun k _ => hg_int k)) + (integrable_const _) haeBound + _ = Bterm := by rw [integral_const]; simp + have hRHS_eq : (∑ k : {k // k ∈ K}, + ∫ a, ∫ a', (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a.toFun a'.toFun) + - phaseObservable ℓ σ m P a.toFun) ^ 2 ∂L ∂L) + = ∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L) := by + refine Finset.sum_congr rfl (fun k _ => ?_) + rw [hgdef] + exact (integral_prod _ (hg_int k)).symm + calc Var[fun a => phaseObservable ℓ σ m P a.toFun; L] + ≤ (1 / 2) * ∑ k : {k // k ∈ K}, + ∫ a, ∫ a', (phaseObservable ℓ σ m P (patchCore ℓ σ k.val a.toFun a'.toFun) + - phaseObservable ℓ σ m P a.toFun) ^ 2 ∂L ∂L := + efronStein_phaseObservable hℓ0 hΘ P hURD hLaw K hK + _ = (1 / 2) * ∑ k : {k // k ∈ K}, ∫ p, g k p ∂(L.prod L) := by rw [hRHS_eq] + _ = (1 / 2) * ∫ p, ∑ k : {k // k ∈ K}, g k p ∂(L.prod L) := by rw [hexchange] + _ ≤ (1 / 2) * Bterm := + mul_le_mul_of_nonneg_left hint_le (by norm_num) + _ = B / 2 * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 := by rw [hBtermdef]; ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Polarize.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Polarize.lean new file mode 100644 index 0000000000..d8d844184d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Polarize.lean @@ -0,0 +1,142 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Scalar +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.AnnealedDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.AnnealedSubadditivity.BlockLoewner +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.NormalizedBlocks + +/-! +# Centered second moments of the block matrix + +From the scalar estimate `scalar_block_variance` we pass to the *centered* +block matrix `A_m − Ā_m`, where `Ā_m = annealedBlockMatrixAtScale L m` is the +entrywise annealed matrix. + +* `integrable_blockMatEntry_coarse` — each entry of the coarse block matrix is + integrable (its a.s. symmetry turns the C4 quadratic bounds at `blockBasis` + vectors into an a.s. entry bound). +* `mean_zero_coarse_blockQuadratic` — `𝔼[w·A_m w] = w·Ā_m w` (integral + linearity of the finite block quadratic form). +* `centered_quadratic_second_moment` — for arbitrary `w`, + `𝔼[(w·(A_m − Ā_m)w)²] = Var[w·A_m w] ≤ Cd·(Θ|w.1|²+|w.2|²)²·min{1, Θ²3^{-βm}}`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory ProbabilityTheory +open Homogenization.Book.Ch04 (RestrictionCoeffLaw RestrictionLawCarrier annealedBlockMatrixAtScale) + +variable {d : ℕ} + +/-- **Entrywise integrability of the coarse block matrix.** Uses a.s. symmetry +plus the C4 quadratic bounds at the `blockBasis` vectors. -/ +theorem integrable_blockMatEntry_coarse [NeZero d] + {L : RestrictionCoeffLaw d} {Θ : ℝ} (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) (α β : BlockCoord d) : + Integrable + (fun a => blockMatEntry (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) α β) L := by + have : IsProbabilityMeasure L := hP.isProbability + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hAEM : AEMeasurable + (fun a => blockMatEntry (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) α β) L := by + cases α with + | inl i => cases β with + | inl j => exact hP.aemeasurable_coarseBlockMatrix_upperLeft_apply_cubeSet (originCube d m) i j + | inr j => exact hP.aemeasurable_coarseBlockMatrix_upperRight_apply_cubeSet (originCube d m) i j + | inr i => cases β with + | inl j => exact hP.aemeasurable_coarseBlockMatrix_lowerLeft_apply_cubeSet (originCube d m) i j + | inr j => exact hP.aemeasurable_coarseBlockMatrix_lowerRight_apply_cubeSet (originCube d m) i j + -- abbreviations for the three `M²` bounds + set Ms : ℝ := Θ * vecNormSq (blockBasis α + blockBasis β).1 + + vecNormSq (blockBasis α + blockBasis β).2 with hMsdef + set Ma : ℝ := Θ * vecNormSq (blockBasis α (d := d)).1 + + vecNormSq (blockBasis α (d := d)).2 with hMadef + set Mb : ℝ := Θ * vecNormSq (blockBasis β (d := d)).1 + + vecNormSq (blockBasis β (d := d)).2 with hMbdef + have hMs0 : (0 : ℝ) ≤ Ms := by + rw [hMsdef]; exact add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hMa0 : (0 : ℝ) ≤ Ma := by + rw [hMadef]; exact add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hMb0 : (0 : ℝ) ≤ Mb := by + rw [hMbdef]; exact add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + refine (integrable_const (Ms + Ma + Mb)).mono' hAEM.aestronglyMeasurable ?_ + filter_upwards [ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m + (blockBasis α + blockBasis β), + ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m (blockBasis α), + ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m (blockBasis β), + Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale.isSymmetricBlockMat_coarseBlockMatrix_cubeSet_ae + hP (originCube d m)] + with a hsum hα hβ hsymm + have hQsum := blockBasis_sum_pairing (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) α β + have hQα := blockBasis_pairing (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) α α + have hQβ := blockBasis_pairing (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) β β + have hsymαβ := hsymm α β + rw [Real.norm_eq_abs, abs_le] + constructor + · linarith [hQsum, hQα, hQβ, hsymαβ, hsum.1, hα.2, hβ.2, hMs0, hMa0, hMb0] + · linarith [hQsum, hQα, hQβ, hsymαβ, hsum.2, hα.1, hβ.1, hMs0, hMa0, hMb0] + +/-- **Mean-zero.** `𝔼[w·A_m w] = w·Ā_m w`. -/ +theorem mean_zero_coarse_blockQuadratic [NeZero d] + {L : RestrictionCoeffLaw d} {Θ : ℝ} (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) (w : BlockVec d) : + (∫ a, blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) w) ∂L) + = blockVecDot w (blockMatVecMul (annealedBlockMatrixAtScale L m) w) := by + rw [Homogenization.Book.Ch04.integral_blockVecDot_blockMatVecMul_eq_of_integrable_entries + (fun α β => integrable_blockMatEntry_coarse hΘ hP hLaw m α β) w w] + rfl + +/-- **Centered second moment for an arbitrary doubled vector.** Equal to +`Var[w·A_m w]`, hence bounded by the scalar estimate. The constant is the one +from `scalar_block_variance`, uniform in all parameters. -/ +theorem centered_quadratic_second_moment [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} (_hm : 0 ≤ m) {Θ : ℝ} (_hΘ : 1 ≤ Θ) {L : RestrictionCoeffLaw d} + [IsProbabilityMeasure L] (_hP : RestrictionLawCarrier L) + (_hURD : IsRestrictionUnitRangeDependentR L) + (_hLaw : ThetaEllipticLaw Θ L) (w : BlockVec d), + (∫ a, (blockVecDot w (blockMatVecMul (ofFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) + - toFullBlockMat (annealedBlockMatrixAtScale L m))) w)) ^ 2 ∂L) + ≤ Cd * (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 + * min 1 (Θ ^ 2 * ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1))) := by + obtain ⟨Cd, hCd0, hN1⟩ := scalar_block_variance (d := d) hd + refine ⟨Cd, hCd0, ?_⟩ + intro m hm Θ hΘ L _ hP hURD hLaw w + set c : ℝ := blockVecDot w (blockMatVecMul (annealedBlockMatrixAtScale L m) w) with hcdef + have hXaem : AEMeasurable + (fun a => blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) w)) L := + (aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP m w).aemeasurable + have hmean := mean_zero_coarse_blockQuadratic hΘ hP hLaw m w + -- the integrand is `(X − c)²` + have hpt : ∀ a : RegCoeffField d, (blockVecDot w (blockMatVecMul (ofFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) + - toFullBlockMat (annealedBlockMatrixAtScale L m))) w)) ^ 2 + = (blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) w) - c) ^ 2 := by + intro a + rw [blockVecDot_blockMatVecMul_ofFullBlockMat_sub, hcdef] + calc (∫ a, (blockVecDot w (blockMatVecMul (ofFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) + - toFullBlockMat (annealedBlockMatrixAtScale L m))) w)) ^ 2 ∂L) + = ∫ a, (blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) w) - c) ^ 2 ∂L := by + exact integral_congr_ae (Filter.Eventually.of_forall hpt) + _ = Var[fun a => blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) w); L] := by + rw [variance_eq_integral hXaem, hmean] + _ ≤ Cd * (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 + * min 1 (Θ ^ 2 * ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1))) := + hN1 hm hΘ hP hURD hLaw w + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ProbeMoment.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ProbeMoment.lean new file mode 100644 index 0000000000..508541d91a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ProbeMoment.lean @@ -0,0 +1,239 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.ScalarBounds +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Section54.VarianceBoundGoodScale.FiniteNet + +/-! +# Per-probe second moments of the normalized fluctuation matrix + +The observable is controlled a.s. by finitely many quadratic probes of the +normalized fluctuation matrix `H = D·(A_m − Ā_m)·D` +(`fullBlock_operatorNorm_sq_le_probeSqBudget`). Here we bound the *second moment* +of each such probe by the centered-second-moment estimate +(`centered_quadratic_second_moment`). + +* `fluctuation_probe_eq_centered_blockQuadratic` — the deterministic identity + turning a probe of `H` into the centered block quadratic form of the + diagonally rescaled probe vector. +* `probe_sq_integral_le` — for any probe `q` with `⟪q,q⟫ ≤ 2`, the second moment + of `fullBlockQuadratic H q` is at most `16·Cd·Θ⁶·(3^m)^{-β}`. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open Homogenization.Book.Ch04 + (RestrictionCoeffLaw RestrictionLawCarrier RestrictionStructuralLaw annealedBlockMatrixAtScale + scalarAnnealedBlockMatrixAtScale scalarFullBlockInvSqrtDiag) +open Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale + (annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale + fullBlockNormalizedFluctuationMatrix fullBlockQuadratic fullBlockQuadratic_sub + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot) + +variable {d : ℕ} + +/-- **Probe → centered block quadratic.** A quadratic probe of the normalized +fluctuation matrix `H = D·(A_m − Ā_m)·D` equals the centered block quadratic +form of the diagonally rescaled probe vector `w = ofFullBlockVec (D q)`. -/ +theorem fluctuation_probe_eq_centered_blockQuadratic [NeZero d] {L : RestrictionCoeffLaw d} + (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) (m : ℤ) (q : FullBlockVec d) + (a : RegCoeffField d) : + fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q + = blockVecDot + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q)) + (blockMatVecMul + (ofFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d m)) a) + - toFullBlockMat (annealedBlockMatrixAtScale L m))) + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q))) := by + classical + set b := hP.barSigmaAtScale hStruct m with hb + set c := hP.barSigmaStarAtScale hStruct m with hc + set r := scalarFullBlockInvSqrtDiag b c with hr + set A := coarseBlockMatrix (cubeSet (originCube d m)) a with hA + set Abar := scalarAnnealedBlockMatrixAtScale hP hStruct m with hAbar + have hunfold : + fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a + = Matrix.diagonal r * (toFullBlockMat A - toFullBlockMat Abar) * Matrix.diagonal r := + rfl + rw [hunfold, Matrix.mul_sub, Matrix.sub_mul, fullBlockQuadratic_sub, + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot r A q, + fullBlockQuadratic_diagonal_toFullBlockMat_eq_blockVecDot r Abar q, + show Abar = annealedBlockMatrixAtScale L m from + (annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct m).symm, + blockVecDot_blockMatVecMul_sub_eq_ofFullBlockMat_sub] + +/-- **M-factor bound.** With `½ ≤ b`, `0 ≤ c ≤ 2Θ`, the centered weight of the +diagonally rescaled probe is at most `2Θ·⟪q,q⟫`. -/ +private theorem mfactor_le [NeZero d] {b c Θ : ℝ} + (hb : (1 / 2 : ℝ) ≤ b) (hc0 : 0 ≤ c) (hc : c ≤ 2 * Θ) (hΘ : 1 ≤ Θ) + (q : FullBlockVec d) : + Θ * vecNormSq (ofFullBlockVec (Matrix.mulVec + (Matrix.diagonal (scalarFullBlockInvSqrtDiag b c)) q)).1 + + vecNormSq (ofFullBlockVec (Matrix.mulVec + (Matrix.diagonal (scalarFullBlockInvSqrtDiag b c)) q)).2 + ≤ 2 * Θ * dotProduct q q := by + have hb0 : (0 : ℝ) < b := lt_of_lt_of_le (by norm_num) hb + have hΘ0 : (0 : ℝ) ≤ Θ := le_trans (by norm_num) hΘ + have hw1 : (ofFullBlockVec (Matrix.mulVec + (Matrix.diagonal (scalarFullBlockInvSqrtDiag b c)) q)).1 + = (Real.sqrt b)⁻¹ • (fun i => q (Sum.inl i)) := by + funext i + simp [ofFullBlockVec, Matrix.mulVec_diagonal, scalarFullBlockInvSqrtDiag] + have hw2 : (ofFullBlockVec (Matrix.mulVec + (Matrix.diagonal (scalarFullBlockInvSqrtDiag b c)) q)).2 + = (Real.sqrt c) • (fun i => q (Sum.inr i)) := by + funext i + simp [ofFullBlockVec, Matrix.mulVec_diagonal, scalarFullBlockInvSqrtDiag] + rw [hw1, hw2, vecNormSq_smul, vecNormSq_smul] + have hsqb : (Real.sqrt b)⁻¹ ^ 2 = b⁻¹ := by rw [inv_pow, Real.sq_sqrt hb0.le] + have hsqc : (Real.sqrt c) ^ 2 = c := Real.sq_sqrt hc0 + rw [hsqb, hsqc] + have hbinv : b⁻¹ ≤ 2 := by + have h := (inv_le_inv₀ hb0 (show (0 : ℝ) < 1 / 2 by norm_num)).mpr hb + norm_num at h; exact h + have hqU : (0 : ℝ) ≤ vecNormSq (fun i => q (Sum.inl i)) := vecNormSq_nonneg _ + have hqL : (0 : ℝ) ≤ vecNormSq (fun i => q (Sum.inr i)) := vecNormSq_nonneg _ + have hdqq : dotProduct q q + = vecNormSq (fun i => q (Sum.inl i)) + vecNormSq (fun i => q (Sum.inr i)) := by + rw [dotProduct, Fintype.sum_sum_type] + simp [vecNormSq, vecDot] + rw [hdqq] + have t1 : (0 : ℝ) ≤ (2 - b⁻¹) * (Θ * vecNormSq (fun i => q (Sum.inl i))) := + mul_nonneg (by linarith) (mul_nonneg hΘ0 hqU) + have t2 : (0 : ℝ) ≤ (2 * Θ - c) * vecNormSq (fun i => q (Sum.inr i)) := + mul_nonneg (by linarith) hqL + nlinarith [t1, t2] + +/-- **Per-probe second moment.** For any full-block probe `q` with +`⟪q,q⟫ ≤ 4`, the second moment of `fullBlockQuadratic H q` is at most +`64·Cd·Θ⁶·(3^m)^{-β}`, with `Cd` the dimension-only centered-moment constant. -/ +theorem probe_sq_integral_le [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} (_hm : 0 ≤ m) {Θ : ℝ} (_hΘ : 1 ≤ Θ) {L : RestrictionCoeffLaw d} + [IsProbabilityMeasure L] (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (_hLaw : ThetaEllipticLaw Θ L) (q : FullBlockVec d) (_hq2 : dotProduct q q ≤ 4), + (∫ a, (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q) + ^ 2 ∂L) + ≤ 64 * Cd * Θ ^ 6 * ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) := by + obtain ⟨Cd, hCd0, hN2⟩ := centered_quadratic_second_moment (d := d) hd + refine ⟨Cd, hCd0, ?_⟩ + intro m hm Θ hΘ L _ hP hStruct hLaw q hq2 + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + set t : ℝ := ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) with htdef + have ht : (0 : ℝ) ≤ t := Real.rpow_nonneg (by positivity) _ + -- rewrite the integrand into the centered block quadratic form + have hcongr : + (∫ a, (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q) + ^ 2 ∂L) + = ∫ a, (blockVecDot + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q)) + (blockMatVecMul + (ofFullBlockMat + (toFullBlockMat (coarseBlockMatrix (cubeSet (originCube d m)) a) + - toFullBlockMat (annealedBlockMatrixAtScale L m))) + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q)))) ^ 2 ∂L := by + refine integral_congr_ae (Filter.Eventually.of_forall (fun a => ?_)) + dsimp only + rw [fluctuation_probe_eq_centered_blockQuadratic hP hStruct m q a] + rw [hcongr] + have key := hN2 hm hΘ hP hStruct.unit_range hLaw + (ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q)) + refine le_trans key ?_ + -- arithmetic + set w : BlockVec d := ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q) with hwdef + have hMnn : 0 ≤ Θ * vecNormSq w.1 + vecNormSq w.2 := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hM : Θ * vecNormSq w.1 + vecNormSq w.2 ≤ 2 * Θ * dotProduct q q := by + rw [hwdef] + exact mfactor_le (half_le_barSigmaAtScale hΘ hP hStruct hLaw m) + (le_of_lt (barSigmaStarAtScale_pos hΘ hP hStruct hLaw m)) + (barSigmaStarAtScale_le_two_mul_Theta hΘ hP hStruct hLaw m) hΘ q + have hM4 : Θ * vecNormSq w.1 + vecNormSq w.2 ≤ 8 * Θ := by + have h : 2 * Θ * dotProduct q q ≤ 2 * Θ * 4 := + mul_le_mul_of_nonneg_left hq2 (by linarith [hΘ0]) + linarith [hM] + have hMsq : (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 ≤ 64 * Θ ^ 2 := by + nlinarith [mul_le_mul hM4 hM4 hMnn (show (0 : ℝ) ≤ 8 * Θ by linarith [hΘ0])] + have hmin : min 1 (Θ ^ 2 * t) ≤ Θ ^ 2 * t := min_le_right _ _ + have hCdM : 0 ≤ Cd * (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 := + mul_nonneg hCd0 (sq_nonneg _) + have hΘ4le6 : Θ ^ 4 ≤ Θ ^ 6 := by + have h2 : (1 : ℝ) ≤ Θ ^ 2 := by nlinarith [hΘ] + have : Θ ^ 4 * 1 ≤ Θ ^ 4 * Θ ^ 2 := + mul_le_mul_of_nonneg_left h2 (pow_nonneg hΘ0.le 4) + nlinarith [this] + have hfac : (0 : ℝ) ≤ 64 * Cd * t := mul_nonneg (mul_nonneg (by norm_num) hCd0) ht + calc Cd * (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 * min 1 (Θ ^ 2 * t) + ≤ Cd * (Θ * vecNormSq w.1 + vecNormSq w.2) ^ 2 * (Θ ^ 2 * t) := + mul_le_mul_of_nonneg_left hmin hCdM + _ ≤ Cd * (64 * Θ ^ 2) * (Θ ^ 2 * t) := + mul_le_mul_of_nonneg_right (mul_le_mul_of_nonneg_left hMsq hCd0) + (mul_nonneg (sq_nonneg _) ht) + _ = 64 * Cd * Θ ^ 4 * t := by ring + _ ≤ 64 * Cd * Θ ^ 6 * t := by nlinarith [mul_nonneg hfac (by linarith [hΘ4le6] : + (0 : ℝ) ≤ Θ ^ 6 - Θ ^ 4)] + +/-- **Probe second-moment integrability.** Each squared probe of the normalized +fluctuation matrix is integrable: it is `(X − c₀)²` for the a.s.-bounded coarse +block quadratic `X` and a constant `c₀`. -/ +theorem integrable_fluctuation_probe_sq [NeZero d] {L : RestrictionCoeffLaw d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) (q : FullBlockVec d) : + Integrable + (fun a : RegCoeffField d => (fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q) + ^ 2) L := by + have : IsProbabilityMeasure L := hP.isProbability + have hΘ0 : (0 : ℝ) ≤ Θ := le_trans (by norm_num) hΘ + set w : BlockVec d := ofFullBlockVec (Matrix.mulVec (Matrix.diagonal + (scalarFullBlockInvSqrtDiag (hP.barSigmaAtScale hStruct m) + (hP.barSigmaStarAtScale hStruct m))) q) with hwdef + set c₀ : ℝ := blockVecDot w (blockMatVecMul (annealedBlockMatrixAtScale L m) w) with hc0def + have hpt : ∀ a : RegCoeffField d, fullBlockQuadratic + (fullBlockNormalizedFluctuationMatrix hP hStruct m (cubeSet (originCube d m)) a) q + = blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) w) - c₀ := by + intro a + rw [fluctuation_probe_eq_centered_blockQuadratic hP hStruct m q a, + blockVecDot_blockMatVecMul_ofFullBlockMat_sub] + have hXint := integrable_coarseBlockQuadratic_of_thetaEllipticLaw hΘ hP hLaw m w + set Mub : ℝ := 2 * (Θ * vecNormSq w.1 + vecNormSq w.2) with hMubdef + have hMub0 : 0 ≤ Mub := by + rw [hMubdef] + exact mul_nonneg (by norm_num) + (add_nonneg (mul_nonneg hΘ0 (vecNormSq_nonneg _)) (vecNormSq_nonneg _)) + have hsqint : Integrable + (fun a : RegCoeffField d => (blockVecDot w + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a) w) - c₀) ^ 2) L := by + refine (integrable_const ((Mub + |c₀|) ^ 2)).mono' ?_ ?_ + · exact (hXint.aestronglyMeasurable.sub aestronglyMeasurable_const).pow 2 + · filter_upwards [ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m w] with a ha + rw [Real.norm_eq_abs, abs_of_nonneg (sq_nonneg _)] + nlinarith [le_abs_self c₀, neg_abs_le c₀, ha.1, ha.2, hMub0, abs_nonneg c₀] + exact hsqint.congr (Filter.Eventually.of_forall (fun a => by dsimp only; rw [hpt a])) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Projection.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Projection.lean new file mode 100644 index 0000000000..3a0812ea06 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Projection.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Probability.Moments.Variance +public import Mathlib.MeasureTheory.Function.L2Space + +/-! +# Variance as the smallest quadratic distance to a constant + +Two elementary `L²` facts underlying the opening step in the proof of +`t.block.variance`: + + `Var[F] ≤ 𝔼[(F − 𝔼[F_σ])²] ≤ 2·𝔼[|F − F_σ|²] + 2·Var[F_σ]`. + +* `variance_le_integral_sub_const` : `Var[F] ≤ ∫ (F − c)²` for any constant `c` + (variance is the smallest mean-square distance to a constant). +* `var_le_two_integral_add_two_var` : the `(x+y)² ≤ 2x² + 2y²` split, taking + `c = 𝔼[G]` so the second term is exactly `Var[G]`. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory ProbabilityTheory + +variable {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + +/-- **Variance is the smallest quadratic distance to a constant.** -/ +theorem variance_le_integral_sub_const {F : Ω → ℝ} (hF : MemLp F 2 μ) (c : ℝ) : + Var[F; μ] ≤ ∫ ω, (F ω - c) ^ 2 ∂μ := by + have hFint : Integrable F μ := hF.integrable (by norm_num) + set e := μ[F] with hedef + have hI1 : Integrable (fun ω => (F ω - e) ^ 2) μ := + (hF.sub (memLp_const e)).integrable_sq + have hI2c : Integrable (fun ω => (e - c) * (2 * F ω - c - e)) μ := + (((hFint.const_mul 2).sub (integrable_const c)).sub (integrable_const e)).const_mul (e - c) + have hlin : (∫ ω, (2 * F ω - c - e) ∂μ) = e - c := by + have h1 : (fun ω => 2 * F ω - c - e) =ᵐ[μ] (fun ω => 2 * F ω - (c + e)) := by + filter_upwards with ω; ring + rw [integral_congr_ae h1, integral_sub (hFint.const_mul 2) (integrable_const _), + integral_const_mul, integral_const, ← hedef] + simp only [measureReal_def, measure_univ, ENNReal.toReal_one, one_smul] + ring + have hexp : (∫ ω, (F ω - c) ^ 2 ∂μ) + = (∫ ω, (F ω - e) ^ 2 ∂μ) + (e - c) ^ 2 := by + have hcongr : (fun ω => (F ω - c) ^ 2) + =ᵐ[μ] (fun ω => (F ω - e) ^ 2 + (e - c) * (2 * F ω - c - e)) := by + filter_upwards with ω; ring + rw [integral_congr_ae hcongr, integral_add hI1 hI2c, integral_const_mul, hlin] + ring + rw [variance_eq_integral hF.aestronglyMeasurable.aemeasurable, hexp] + nlinarith [sq_nonneg (e - c)] + +/-- **The `(x+y)² ≤ 2x² + 2y²` split.** With `c = 𝔼[G]`, the constant-distance +bound of `variance_le_integral_sub_const` becomes `2·∫(F−G)² + 2·Var[G]`. -/ +theorem var_le_two_integral_add_two_var {F G : Ω → ℝ} + (hF : MemLp F 2 μ) (hG : MemLp G 2 μ) : + Var[F; μ] ≤ 2 * (∫ ω, (F ω - G ω) ^ 2 ∂μ) + 2 * Var[G; μ] := by + have h1 : Var[F; μ] ≤ ∫ ω, (F ω - μ[G]) ^ 2 ∂μ := + variance_le_integral_sub_const hF (μ[G]) + have hpt : (fun ω => (F ω - μ[G]) ^ 2) + ≤ fun ω => 2 * (F ω - G ω) ^ 2 + 2 * (G ω - μ[G]) ^ 2 := by + intro ω + nlinarith [sq_nonneg ((F ω - G ω) - (G ω - μ[G]))] + have hFG : Integrable (fun ω => (F ω - G ω) ^ 2) μ := (hF.sub hG).integrable_sq + have hGc : Integrable (fun ω => (G ω - μ[G]) ^ 2) μ := + (hG.sub (memLp_const _)).integrable_sq + have hFc : Integrable (fun ω => (F ω - μ[G]) ^ 2) μ := + (hF.sub (memLp_const _)).integrable_sq + have h2 : (∫ ω, (F ω - μ[G]) ^ 2 ∂μ) + ≤ ∫ ω, (2 * (F ω - G ω) ^ 2 + 2 * (G ω - μ[G]) ^ 2) ∂μ := + integral_mono hFc ((hFG.const_mul 2).add (hGc.const_mul 2)) hpt + rw [integral_add (hFG.const_mul 2) (hGc.const_mul 2), integral_const_mul, + integral_const_mul] at h2 + have hvarG : (∫ ω, (G ω - μ[G]) ^ 2 ∂μ) = Var[G; μ] := + (variance_eq_integral hG.aestronglyMeasurable.aemeasurable).symm + rw [hvarG] at h2 + linarith [h1, h2] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/RpowOpt.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/RpowOpt.lean new file mode 100644 index 0000000000..b5d302d031 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/RpowOpt.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real + +/-! +# Corridor-width optimization (rpow algebra) + +This file isolates the pure real-analysis optimization that turns the two-error +bound + + `Var[F] ≤ C₀·(Θ³·(ℓ/L)^{d-2} + Θ/ℓ)·Msq²` (`4 ≤ ℓ ≤ L`) + +together with the deterministic bound `Var[F] ≤ 4·Msq²` into the `min`-form of +the scalar block variance estimate `e.scalar.block.variance`: + + `Var[F] ≤ C·Msq²·min{1, Θ²·L^{-(d-2)/(d-1)}}`. + +The optimal corridor width is `ℓ₀ = (L^{d-2}/Θ²)^{1/(d-1)}`, put here in the +resolved normal form `ℓ₀ = L^β·Θ^{-2/(d-1)}` with `β = (d-2)/(d-1)`. The two +balancing identities and the bound `Θ^{1+2/(d-1)} ≤ Θ²` are the whole content. + +The `rpow` algebra (`exists_optimal_width`) is separated from the numeric +regime combination (`scalar_opt`) so each declaration elaborates at default +heartbeats. No probability appears. +-/ + +@[expose] public section + +namespace Homogenization + +open Real + +/-- **Optimal corridor width.** For `Θ, L ≥ 1` there is a width `ℓ₀ ∈ (0, L]` +whose two corridor error terms are both bounded by `X := Θ²·L^{-(d-2)/(d-1)}`. +This packages all of the `rpow` balance algebra. -/ +theorem exists_optimal_width {d : ℕ} (hd : 3 ≤ d) {Θ L : ℝ} + (hΘ : 1 ≤ Θ) (hL : 1 ≤ L) : + ∃ ℓ₀ : ℝ, 0 < ℓ₀ ∧ ℓ₀ ≤ L ∧ + Θ ^ 3 * (ℓ₀ / L) ^ (d - 2) ≤ Θ ^ 2 * L ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) ∧ + Θ * ℓ₀⁻¹ ≤ Θ ^ 2 * L ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) := by + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hL0 : (0 : ℝ) < L := lt_of_lt_of_le one_pos hL + have hdR : (3 : ℝ) ≤ (d : ℝ) := by exact_mod_cast hd + set n1 : ℝ := (d : ℝ) - 1 with hn1def + set n2 : ℝ := (d : ℝ) - 2 with hn2def + have hn1pos : (0 : ℝ) < n1 := by rw [hn1def]; linarith + have hn2pos : (0 : ℝ) < n2 := by rw [hn2def]; linarith + have hn2ge1 : (1 : ℝ) ≤ n2 := by rw [hn2def]; linarith + have hn1 : n1 = n2 + 1 := by rw [hn1def, hn2def]; ring + have hn1ne : n1 ≠ 0 := ne_of_gt hn1pos + have hn2p1 : n2 + 1 ≠ 0 := by positivity + set β : ℝ := n2 / n1 with hβdef + have hβpos : (0 : ℝ) < β := div_pos hn2pos hn1pos + have hβle1 : β ≤ 1 := by rw [hβdef, div_le_one hn1pos, hn1]; linarith + set X : ℝ := Θ ^ 2 * L ^ (-n2 / n1) with hXdef + have hnegβ : -n2 / n1 = -β := by rw [hβdef]; ring + have hXeq : X = Θ ^ 2 * L ^ (-β) := by rw [hXdef, hnegβ] + have hLβnn : (0 : ℝ) ≤ L ^ (-β) := (Real.rpow_pos_of_pos hL0 _).le + -- `Θ^{1+2/n1} ≤ Θ²` + have hexp_le : Θ ^ (1 + 2 / n1) ≤ Θ ^ 2 := by + have h1 : (2 : ℝ) / n1 ≤ 1 := by rw [div_le_one hn1pos, hn1]; linarith + have h2 : Θ ^ (1 + 2 / n1) ≤ Θ ^ ((2 : ℕ) : ℝ) := + Real.rpow_le_rpow_of_exponent_le hΘ (by push_cast; linarith) + rwa [Real.rpow_natCast] at h2 + set ℓ₀ : ℝ := L ^ β * Θ ^ (-(2 / n1)) with hℓ₀def + have hℓ₀pos : (0 : ℝ) < ℓ₀ := by + rw [hℓ₀def]; exact mul_pos (Real.rpow_pos_of_pos hL0 _) (Real.rpow_pos_of_pos hΘ0 _) + -- Claim A : Θ·ℓ₀⁻¹ = Θ^{1+2/n1}·L^{-β} + have hClaimA : Θ * ℓ₀⁻¹ = Θ ^ (1 + 2 / n1) * L ^ (-β) := by + have hℓ₀inv : ℓ₀⁻¹ = L ^ (-β) * Θ ^ (2 / n1) := by + rw [hℓ₀def, mul_inv, ← Real.rpow_neg hL0.le, ← Real.rpow_neg hΘ0.le, neg_neg] + rw [hℓ₀inv, Real.rpow_add hΘ0, Real.rpow_one]; ring + -- Claim B : Θ³·(ℓ₀/L)^{d-2} = Θ^{1+2/n1}·L^{-β} + have hcast : ((d - 2 : ℕ) : ℝ) = n2 := by + rw [hn2def, Nat.cast_sub (show 2 ≤ d by omega)]; norm_num + have hClaimB : Θ ^ 3 * (ℓ₀ / L) ^ (d - 2) = Θ ^ (1 + 2 / n1) * L ^ (-β) := by + rw [← Real.rpow_natCast (ℓ₀ / L) (d - 2), hcast] + have hfrac : ℓ₀ / L = L ^ (β - 1) * Θ ^ (-(2 / n1)) := by + rw [hℓ₀def, show L ^ (β - 1) = L ^ β / L by rw [Real.rpow_sub hL0, Real.rpow_one]] + ring + rw [hfrac, Real.mul_rpow (Real.rpow_nonneg hL0.le _) (Real.rpow_nonneg hΘ0.le _), + ← Real.rpow_mul hL0.le, ← Real.rpow_mul hΘ0.le] + have hLexp : (β - 1) * n2 = -β := by rw [hβdef, hn1]; field_simp; ring + have hΘexp : Θ ^ 3 * Θ ^ (-(2 / n1) * n2) = Θ ^ (1 + 2 / n1) := by + rw [← Real.rpow_natCast Θ 3, ← Real.rpow_add hΘ0] + congr 1 + push_cast; rw [hn1]; field_simp; ring + rw [hLexp] + calc Θ ^ 3 * (L ^ (-β) * Θ ^ (-(2 / n1) * n2)) + = (Θ ^ 3 * Θ ^ (-(2 / n1) * n2)) * L ^ (-β) := by ring + _ = Θ ^ (1 + 2 / n1) * L ^ (-β) := by rw [hΘexp] + -- `ℓ₀ ≤ L` + have hℓ₀leL : ℓ₀ ≤ L := by + have h1 : Θ ^ (-(2 / n1)) ≤ 1 := + Real.rpow_le_one_of_one_le_of_nonpos hΘ (neg_nonpos_of_nonneg (by positivity)) + have h2 : L ^ β ≤ L ^ (1 : ℝ) := Real.rpow_le_rpow_of_exponent_le hL hβle1 + calc ℓ₀ = L ^ β * Θ ^ (-(2 / n1)) := hℓ₀def + _ ≤ L ^ β * 1 := mul_le_mul_of_nonneg_left h1 (Real.rpow_nonneg hL0.le _) + _ = L ^ β := mul_one _ + _ ≤ L ^ (1 : ℝ) := h2 + _ = L := Real.rpow_one L + refine ⟨ℓ₀, hℓ₀pos, hℓ₀leL, ?_, ?_⟩ + · rw [hXeq, hClaimB] + exact mul_le_mul_of_nonneg_right hexp_le hLβnn + · rw [hXeq, hClaimA] + exact mul_le_mul_of_nonneg_right hexp_le hLβnn + +/-- **Corridor-width optimization.** From the deterministic bound and the +two-error bound (free `ℓ ∈ [4, L]`), the scalar block variance obeys the +`min`-form with `β = (d-2)/(d-1)` and a `Θ²` upper factor. -/ +theorem scalar_opt {d : ℕ} (hd : 3 ≤ d) {Θ L Msq V C₀ : ℝ} + (hΘ : 1 ≤ Θ) (hL : 1 ≤ L) (hC₀ : 0 ≤ C₀) + (hdet : V ≤ 4 * Msq ^ 2) + (htwo : ∀ ℓ : ℝ, 4 ≤ ℓ → ℓ ≤ L → + V ≤ C₀ * (Θ ^ 3 * (ℓ / L) ^ (d - 2) + Θ * ℓ⁻¹) * Msq ^ 2) : + V ≤ (16 + 2 * C₀) * Msq ^ 2 * + min 1 (Θ ^ 2 * L ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1))) := by + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hL0 : (0 : ℝ) < L := lt_of_lt_of_le one_pos hL + have hMsq2 : (0 : ℝ) ≤ Msq ^ 2 := sq_nonneg _ + obtain ⟨ℓ₀, hℓ₀pos, hℓ₀leL, hBle, hAle⟩ := exists_optimal_width hd hΘ hL + set X : ℝ := Θ ^ 2 * L ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1)) with hXdef + have hXpos : (0 : ℝ) < X := by rw [hXdef]; positivity + have hMX : (0 : ℝ) ≤ Msq ^ 2 * X := mul_nonneg hMsq2 hXpos.le + clear_value X + rcases le_total 1 X with hX1 | hX1 + · rw [min_eq_left hX1, mul_one] + have hge : 4 * Msq ^ 2 ≤ (16 + 2 * C₀) * Msq ^ 2 := by + have h2 : (0 : ℝ) ≤ 2 * C₀ * Msq ^ 2 := + mul_nonneg (mul_nonneg (by norm_num) hC₀) hMsq2 + nlinarith [hMsq2, h2] + linarith [hdet, hge] + · rw [min_eq_right hX1] + rcases le_or_gt 4 ℓ₀ with hℓ₀4 | hℓ₀4 + · have hb := htwo ℓ₀ hℓ₀4 hℓ₀leL + have hsum : Θ ^ 3 * (ℓ₀ / L) ^ (d - 2) + Θ * ℓ₀⁻¹ ≤ 2 * X := by + linarith [hAle, hBle] + have hstep : V ≤ C₀ * (2 * X) * Msq ^ 2 := + hb.trans (mul_le_mul_of_nonneg_right + (mul_le_mul_of_nonneg_left hsum hC₀) hMsq2) + have hge : C₀ * (2 * X) * Msq ^ 2 ≤ (16 + 2 * C₀) * Msq ^ 2 * X := by + nlinarith [hMX] + linarith [hstep, hge] + · have hquarter : (1 : ℝ) / 4 ≤ X := by + have hΘℓ : Θ * ℓ₀⁻¹ * ℓ₀ = Θ := by + rw [mul_assoc, inv_mul_cancel₀ (ne_of_gt hℓ₀pos), mul_one] + have hypos : (0 : ℝ) < Θ * ℓ₀⁻¹ := mul_pos hΘ0 (inv_pos.2 hℓ₀pos) + have hinv : (1 : ℝ) / 4 ≤ Θ * ℓ₀⁻¹ := by + nlinarith [hΘℓ, hΘ, + mul_nonneg hypos.le (by linarith [hℓ₀4] : (0:ℝ) ≤ 4 - ℓ₀)] + linarith [hinv, hAle] + have hA : 4 * Msq ^ 2 ≤ 16 * Msq ^ 2 * X := by + nlinarith [mul_nonneg hMsq2 (by linarith [hquarter] : (0:ℝ) ≤ X - 1 / 4)] + have hB : 16 * Msq ^ 2 * X ≤ (16 + 2 * C₀) * Msq ^ 2 * X := by + nlinarith [mul_nonneg hC₀ hMX] + linarith [hdet, hA, hB] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Scalar.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Scalar.lean new file mode 100644 index 0000000000..5d32d2d6cf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/Scalar.lean @@ -0,0 +1,157 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.RpowOpt +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.FixedPhaseUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.AveragingUniform +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Projection + +/-! +# Scalar block variance (`e.scalar.block.variance`) + +Assembly of the scalar estimate: for any origin cube `𝒰_m` and block +vector `P = (p, q)`, + + `Var[P · 𝐀(𝒰_m) P] ≤ C_d·(Θ|p|² + |q|²)²·min{1, Θ²·3^{-β_d·m}}`, + `β_d = (d-2)/(d-1)`. + +The three ingredients, each with a *uniform* dimensional constant: + +* `fixed_phase_variance_uniform` — `Var[F_σ] ≤ C_fp·Θ³(ℓ/3^m)^{d-2}·Msq²`; +* `exists_gridPhase_meanSq_le_uniform` — a grid phase `σ` with + `∫|F_σ − F|² ≤ C_av·Θ·ℓ⁻¹·Msq²`; +* the deterministic a.s. bound `0 ≤ F ≤ 2·Msq` (`t.coarse.block.ellipticity`). + +Step (i) is the `L²`-projection split `var_le_two_integral_add_two_var`; step (ii) +combines the two errors at a free width `ℓ ∈ [4, 3^m]`; step (iii) is the rpow +optimization `scalar_opt`. The constant is fixed *before* the field quantifiers. +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory ProbabilityTheory +open Homogenization.Book.Ch04 (RestrictionCoeffLaw RestrictionLawCarrier) + +variable {d : ℕ} + +/-- **Scalar block variance.** Dimensional constant `Cd`, uniform in the +scale `m`, contrast `Θ`, law `L`, and block vector `P`. -/ +theorem scalar_block_variance [NeZero d] (hd : 3 ≤ d) : + ∃ Cd : ℝ, 0 ≤ Cd ∧ + ∀ {m : ℤ} (_hm : 0 ≤ m) {Θ : ℝ} (_hΘ : 1 ≤ Θ) {L : RestrictionCoeffLaw d} + [IsProbabilityMeasure L] (_hP : RestrictionLawCarrier L) + (_hURD : IsRestrictionUnitRangeDependentR L) + (_hLaw : ThetaEllipticLaw Θ L) (P : BlockVec d), + Var[fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P); L] + ≤ Cd * (Θ * vecNormSq P.1 + vecNormSq P.2) ^ 2 + * min 1 (Θ ^ 2 * ((3 : ℝ) ^ m) ^ (-((d : ℝ) - 2) / ((d : ℝ) - 1))) := by + obtain ⟨Cfp, hCfp0, hfp⟩ := fixed_phase_variance_uniform (d := d) hd + obtain ⟨Cav, hCav0, hav⟩ := exists_gridPhase_meanSq_le_uniform (d := d) + refine ⟨16 + 2 * (2 * (Cfp + Cav)), by positivity, ?_⟩ + intro m hm Θ hΘ L _ hP hURD hLaw P + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + set Msq : ℝ := Θ * vecNormSq P.1 + vecNormSq P.2 with hMsqdef + have hMsq0 : (0 : ℝ) ≤ Msq := + add_nonneg (mul_nonneg hΘ0.le (vecNormSq_nonneg _)) (vecNormSq_nonneg _) + have hMsq2 : (0 : ℝ) ≤ Msq ^ 2 := sq_nonneg _ + have hL1 : (1 : ℝ) ≤ (3 : ℝ) ^ m := one_le_zpow₀ (by norm_num) hm + -- the coarse observable `F`, its a.s. bounds, `AESM`, and membership in `L²` + have hFaesm : AEStronglyMeasurable + (fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) L := + aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP m P + have hFbd : ∀ᵐ a ∂L, + 0 ≤ blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) ∧ + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) ≤ + 2 * Msq := + ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m P + have hFmem : MemLp + (fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) 2 L := by + refine MemLp.of_bound hFaesm (2 * Msq) ?_ + filter_upwards [hFbd] with a ha + rw [Real.norm_eq_abs, abs_of_nonneg ha.1]; exact ha.2 + -- (deterministic) `Var[F] ≤ 4·Msq²` + have hdet : Var[fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P); L] + ≤ 4 * Msq ^ 2 := by + refine le_trans (variance_le_expectation_sq hFaesm) ?_ + have hbnd : ∀ᵐ a ∂L, + (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) ^ 2 + ≤ 4 * Msq ^ 2 := by + filter_upwards [hFbd] with a ha; nlinarith [ha.1, ha.2, hMsq0] + refine le_trans (integral_mono_ae hFmem.integrable_sq (integrable_const _) hbnd) ?_ + rw [integral_const]; simp + -- (two-error) `Var[F] ≤ 2(Cfp+Cav)·(Θ³(ℓ/3^m)^{d-2} + Θ/ℓ)·Msq²` + have htwo : ∀ ℓ : ℝ, 4 ≤ ℓ → ℓ ≤ (3 : ℝ) ^ m → + Var[fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P); L] + ≤ 2 * (Cfp + Cav) + * (Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + Θ * ℓ⁻¹) * Msq ^ 2 := by + intro ℓ hℓ4 hℓL + have hℓ0 : (0 : ℝ) < ℓ := by linarith + set N : ℕ := ⌈ℓ⌉₊ with hNdef + have hNle : (ℓ : ℝ) ≤ (N : ℝ) := by rw [hNdef]; exact Nat.le_ceil ℓ + obtain ⟨σ, -, havb⟩ := hav (m := m) hΘ hP hLaw hℓ4 hNle P + set φ : Vec d := gridPhase ℓ N σ with hφdef + -- the fixed-phase observable `G = F_σ` + have hGaesm : AEStronglyMeasurable (fun a => phaseObservable ℓ φ m P a.toFun) L := + aestronglyMeasurable_phaseObservable hP m ℓ φ P + have hGbd : ∀ᵐ a ∂L, + 0 ≤ phaseObservable ℓ φ m P a.toFun ∧ phaseObservable ℓ φ m P a.toFun ≤ 2 * Msq := by + filter_upwards [hLaw] with a ha + exact phaseObservable_mem_Icc hΘ P (fun i j => a.entry_measurable i j) ha + have hGmem : MemLp (fun a => phaseObservable ℓ φ m P a.toFun) 2 L := by + refine MemLp.of_bound hGaesm (2 * Msq) ?_ + filter_upwards [hGbd] with a ha + rw [Real.norm_eq_abs, abs_of_nonneg ha.1]; exact ha.2 + -- projection split + have hsplit := var_le_two_integral_add_two_var (μ := L) hFmem hGmem + -- averaging error, rewritten to `∫(F − G)²` + have hIeq : (∫ a, (blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) + - phaseObservable ℓ φ m P a.toFun) ^ 2 ∂L) + = ∫ a, |blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) + (corridorField ℓ φ a.toFun)) P) - + blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)| + ^ 2 ∂L := by + refine integral_congr_ae ?_ + filter_upwards with a + show (blockVecDot P (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) + - phaseObservable ℓ φ m P a.toFun) ^ 2 = _ + rw [phaseObservable, sq_abs]; ring + have h1 : (∫ a, (blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) + - phaseObservable ℓ φ m P a.toFun) ^ 2 ∂L) + ≤ Cav * Θ * ℓ⁻¹ * Msq ^ 2 := by rw [hIeq]; exact havb + have h2 : Var[fun a => phaseObservable ℓ φ m P a.toFun; L] + ≤ Cfp * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) * Msq ^ 2 := + hfp (m := m) (ℓ := ℓ) (Θ := Θ) (σ := φ) hℓ4 hℓL hΘ P hURD hLaw + -- combine + have hA0 : (0 : ℝ) ≤ Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) := by positivity + have hB0 : (0 : ℝ) ≤ Θ * ℓ⁻¹ := by positivity + calc Var[fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P); L] + ≤ 2 * (∫ a, (blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) + - phaseObservable ℓ φ m P a.toFun) ^ 2 ∂L) + + 2 * Var[fun a => phaseObservable ℓ φ m P a.toFun; L] := hsplit + _ ≤ 2 * (Cav * Θ * ℓ⁻¹ * Msq ^ 2) + + 2 * (Cfp * Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) * Msq ^ 2) := by + gcongr + _ ≤ 2 * (Cfp + Cav) + * (Θ ^ 3 * (ℓ / (3 : ℝ) ^ m) ^ (d - 2) + Θ * ℓ⁻¹) * Msq ^ 2 := by + nlinarith [mul_nonneg (mul_nonneg hCfp0 hB0) hMsq2, + mul_nonneg (mul_nonneg hCav0 hA0) hMsq2] + -- rpow optimization + exact scalar_opt hd hΘ hL1 (by positivity) hdet htwo + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ScalarBounds.lean b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ScalarBounds.lean new file mode 100644 index 0000000000..4db9890334 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/HighContrast/Variance/ScalarBounds.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Variance.Polarize +public import LeanPool.CoarseGraining.Homogenization.HighContrast.Corridor.PhaseComparison.Averaging +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.CoarseBounds.Sandwich + +/-! +# Scalar normalization bounds for the fluctuation bridge + +The fluctuation observable normalizes the centered coarse block matrix +by the diagonal `D = diag(scalarFullBlockInvSqrtDiag b c)`, where +`b = barSigmaAtScale` and `c = barSigmaStarAtScale` are the structural-law scalars. + +Here we pin down the two-sided bounds on `b` and `c` that make the diagonal +normalization uniformly bounded: + +* `ae_coarseBlockQuadratic_lower_of_thetaEllipticLaw` — the a.s. lower `C1` + Loewner bound (mirroring the upper bound `ae_coarseBlockQuadratic_bounds_...`). +* `half_le_barSigmaAtScale` — `1/2 ≤ b`. +* `barSigmaStarAtScale_pos` / `barSigmaStarAtScale_le_two_mul_Theta` — `0 < c` and + `c ≤ 2Θ`. + +The `b` and `c` values are read off the isotropic annealed block matrix +(`annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale`), whose diagonal +basis pairings equal `b` and `c⁻¹`, integrated against the a.s. `C1′` sandwich +(`mean_zero_coarse_blockQuadratic`). +-/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open Homogenization.Book.Ch04 + (RestrictionCoeffLaw RestrictionLawCarrier RestrictionStructuralLaw annealedBlockMatrixAtScale + scalarAnnealedBlockMatrixAtScale scalarFullBlockInvSqrtDiag) +open Homogenization.Book.Ch05.Section54.VarianceBoundGoodScale + (annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale) + +variable {d : ℕ} + +/-- **C1 (lower, a.s.).** Under the amended `ThetaEllipticLaw Θ L`, the coarse +block observable a.s. dominates the lower diagonal quadratic form +`½|p|² + (2Θ)⁻¹|q|²`. Proved by routing each realization through the C2 +truncation bridge to an everywhere-`(1,Θ)`-elliptic representative and applying +the deterministic lower Loewner sandwich, exactly as +`ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw` does for the upper bound. -/ +theorem ae_coarseBlockQuadratic_lower_of_thetaEllipticLaw [NeZero d] {L : RestrictionCoeffLaw d} + {Θ : ℝ} (hΘ : 1 ≤ Θ) (hell : ThetaEllipticLaw Θ L) (m : ℤ) (P : BlockVec d) : + ∀ᵐ a ∂L, + (1 / 2 : ℝ) * vecNormSq P.1 + (2 * Θ)⁻¹ * vecNormSq P.2 ≤ + blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P) := by + classical + filter_upwards [hell] with a haeEll + have hU : MeasurableSet (cubeSet (originCube d m)) := measurableSet_cubeSet (originCube d m) + have hmeasA : + Measurable (fun x => fun i j => + if x ∈ cubeSet (originCube d m) then a x i j else 0) := by + refine measurable_pi_iff.2 fun i => measurable_pi_iff.2 fun j => ?_ + simpa only [Set.indicator] using! (a.entry_measurable i j).indicator hU + have haeU : ∀ᵐ x ∂(volume.restrict (cubeSet (originCube d m))), + IsEllipticMatrix 1 Θ (a x) := ae_restrict_of_ae haeEll + obtain ⟨a', hEll', _, hcoarse, _⟩ := exists_ellipticFieldOn_ae_eq hU hΘ hmeasA haeU + rw [← hcoarse] + have hlow := blockDiag_blockMatLoewnerLE_coarseBlockMatrix_cube hEll' P + obtain ⟨p, q⟩ := P + rw [blockVecDot_blockMatVecMul_blockDiag_smul_one (1 / 2 : ℝ) ((2 * Θ)⁻¹) p q] at hlow + simpa using hlow + +/-- Integrability of the coarse block quadratic form for a fixed probe vector, +under any `ThetaEllipticLaw` on a probability law. -/ +theorem integrable_coarseBlockQuadratic_of_thetaEllipticLaw [NeZero d] {L : RestrictionCoeffLaw d} + {Θ : ℝ} (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hLaw : ThetaEllipticLaw Θ L) + (m : ℤ) (P : BlockVec d) : + Integrable + (fun a => blockVecDot P + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P)) L := by + have : IsProbabilityMeasure L := hP.isProbability + refine (integrable_const (2 * (Θ * vecNormSq P.1 + vecNormSq P.2))).mono' + (aestronglyMeasurable_coarseBlockQuadratic_cubeSet hP m P) ?_ + filter_upwards [ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m P] with a ha + rw [Real.norm_eq_abs, abs_of_nonneg ha.1] + exact ha.2 + +private theorem vecNormSq_single_one (i : Fin d) : + vecNormSq (Pi.single i 1 : Vec d) = 1 := by + rw [vecNormSq, vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hij; simp [Pi.single_eq_of_ne hij] + · simp + +/-- **`1/2 ≤ b`.** The structural-law scalar `\bar\sigma_m` is at least `1/2`: +it is the annealed diagonal upper-left entry, which the integrated lower `C1` +sandwich bounds below by `1/2`. -/ +theorem half_le_barSigmaAtScale [NeZero d] {L : RestrictionCoeffLaw d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) : + (1 / 2 : ℝ) ≤ hP.barSigmaAtScale hStruct m := by + have : IsProbabilityMeasure L := hP.isProbability + have i0 : Fin d := ⟨0, NeZero.pos d⟩ + set P0 : BlockVec d := blockBasis (Sum.inl i0) with hP0 + have hmean := mean_zero_coarse_blockQuadratic hΘ hP hLaw m P0 + have hEntry : + blockVecDot P0 (blockMatVecMul (annealedBlockMatrixAtScale L m) P0) + = hP.barSigmaAtScale hStruct m := by + rw [annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct m, + hP0, blockBasis_pairing] + simp [scalarAnnealedBlockMatrixAtScale, Homogenization.Book.Ch02.blockDiag, + blockMatEntry, Matrix.one_apply_eq] + have hInt := integrable_coarseBlockQuadratic_of_thetaEllipticLaw hΘ hP hLaw m P0 + have hlow : ∀ᵐ a ∂L, + (1 / 2 : ℝ) ≤ blockVecDot P0 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P0) := by + filter_upwards [ae_coarseBlockQuadratic_lower_of_thetaEllipticLaw hΘ hLaw m P0] with a ha + have h1 : vecNormSq P0.1 = 1 := by rw [hP0]; simp [blockBasis, vecNormSq_single_one] + have h2 : vecNormSq P0.2 = 0 := by rw [hP0]; simp [blockBasis, vecNormSq, vecDot] + rw [h1, h2] at ha + simpa using ha + calc (1 / 2 : ℝ) = ∫ _a, (1 / 2 : ℝ) ∂L := by simp + _ ≤ ∫ a, blockVecDot P0 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P0) ∂L := + integral_mono_ae (integrable_const _) hInt hlow + _ = blockVecDot P0 (blockMatVecMul (annealedBlockMatrixAtScale L m) P0) := hmean + _ = hP.barSigmaAtScale hStruct m := hEntry + +/-- The annealed diagonal lower-right entry equals `c⁻¹`, and is sandwiched in +`[(2Θ)⁻¹, 2]` by the integrated `C1′` bounds. -/ +private theorem barSigmaStarInv_mem [NeZero d] {L : RestrictionCoeffLaw d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) : + (2 * Θ)⁻¹ ≤ (hP.barSigmaStarAtScale hStruct m)⁻¹ ∧ + (hP.barSigmaStarAtScale hStruct m)⁻¹ ≤ 2 := by + have : IsProbabilityMeasure L := hP.isProbability + have i0 : Fin d := ⟨0, NeZero.pos d⟩ + set P1 : BlockVec d := blockBasis (Sum.inr i0) with hP1 + have hmean := mean_zero_coarse_blockQuadratic hΘ hP hLaw m P1 + have hEntry : + blockVecDot P1 (blockMatVecMul (annealedBlockMatrixAtScale L m) P1) + = (hP.barSigmaStarAtScale hStruct m)⁻¹ := by + rw [annealedBlockMatrixAtScale_eq_scalarAnnealedBlockMatrixAtScale hP hStruct m, + hP1, blockBasis_pairing] + simp [scalarAnnealedBlockMatrixAtScale, Homogenization.Book.Ch02.blockDiag, + blockMatEntry, Matrix.one_apply_eq] + have hInt := integrable_coarseBlockQuadratic_of_thetaEllipticLaw hΘ hP hLaw m P1 + have h1 : vecNormSq P1.1 = 0 := by rw [hP1]; simp [blockBasis, vecNormSq, vecDot] + have h2 : vecNormSq P1.2 = 1 := by rw [hP1]; simp [blockBasis, vecNormSq_single_one] + constructor + · have hlow : ∀ᵐ a ∂L, + (2 * Θ)⁻¹ ≤ blockVecDot P1 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P1) := by + filter_upwards [ae_coarseBlockQuadratic_lower_of_thetaEllipticLaw hΘ hLaw m P1] with a ha + rw [h1, h2] at ha + simpa using ha + calc (2 * Θ)⁻¹ = ∫ _a, (2 * Θ)⁻¹ ∂L := by simp + _ ≤ ∫ a, blockVecDot P1 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P1) ∂L := + integral_mono_ae (integrable_const _) hInt hlow + _ = (hP.barSigmaStarAtScale hStruct m)⁻¹ := by rw [hmean, hEntry] + · have hup : ∀ᵐ a ∂L, + blockVecDot P1 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P1) ≤ 2 := by + filter_upwards [ae_coarseBlockQuadratic_bounds_of_thetaEllipticLaw hΘ hLaw m P1] with a ha + rw [h1, h2] at ha + simpa using ha.2 + calc (hP.barSigmaStarAtScale hStruct m)⁻¹ + = ∫ a, blockVecDot P1 + (blockMatVecMul (coarseBlockMatrix (cubeSet (originCube d m)) a.toFun) P1) ∂L := by + rw [hmean, hEntry] + _ ≤ ∫ _a, (2 : ℝ) ∂L := integral_mono_ae hInt (integrable_const _) hup + _ = 2 := by simp + +/-- **`0 < c`.** -/ +theorem barSigmaStarAtScale_pos [NeZero d] {L : RestrictionCoeffLaw d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) : + 0 < hP.barSigmaStarAtScale hStruct m := by + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + obtain ⟨hlow, _⟩ := barSigmaStarInv_mem hΘ hP hStruct hLaw m + have hpos_inv : 0 < (hP.barSigmaStarAtScale hStruct m)⁻¹ := + lt_of_lt_of_le (by positivity) hlow + exact inv_pos.mp hpos_inv + +/-- **`c ≤ 2Θ`.** -/ +theorem barSigmaStarAtScale_le_two_mul_Theta [NeZero d] {L : RestrictionCoeffLaw d} {Θ : ℝ} + (hΘ : 1 ≤ Θ) (hP : RestrictionLawCarrier L) (hStruct : RestrictionStructuralLaw L) + (hLaw : ThetaEllipticLaw Θ L) (m : ℤ) : + hP.barSigmaStarAtScale hStruct m ≤ 2 * Θ := by + have hΘ0 : (0 : ℝ) < Θ := lt_of_lt_of_le one_pos hΘ + have hc0 : 0 < hP.barSigmaStarAtScale hStruct m := + barSigmaStarAtScale_pos hΘ hP hStruct hLaw m + obtain ⟨hlow, _⟩ := barSigmaStarInv_mem hΘ hP hStruct hLaw m + have h2Θ : (0 : ℝ) < 2 * Θ := by positivity + -- (2Θ)⁻¹ ≤ c⁻¹ ⟹ c ≤ 2Θ + exact (inv_le_inv₀ h2Θ hc0).mp hlow + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/IntegralLpSeminorm.lean b/LeanPool/CoarseGraining/Homogenization/IntegralLpSeminorm.lean new file mode 100644 index 0000000000..33765ac4fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/IntegralLpSeminorm.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.SMul + +/-! # Integral seminorms without measurability assumptions -/ + +@[expose] public section + +namespace Homogenization.Gagliardo + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +variable {E : Type*} [ENorm E] + +/-- The integral seminorm, including nonmeasurable functions, with the essential +supremum at infinity. This keeps the manuscript's integral definition independent +of the measurability convention in Mathlib's `eLpNorm`. -/ +def integralLpSeminorm {α : Type*} [MeasurableSpace α] + (f : α → E) (p : ℝ≥0∞) (μ : Measure α) : ℝ≥0∞ := + if p = 0 then 0 else if p = ∞ then eLpNormEssSup f μ else eLpNorm' f p.toReal μ + +/-- For measurable functions the integral seminorm agrees with Mathlib's norm. -/ +theorem integralLpSeminorm_eq_eLpNorm {α : Type*} [MeasurableSpace α] + (f : α → E) (p : ℝ≥0∞) (μ : Measure α) [TopologicalSpace E] (hf : AEStronglyMeasurable f μ) : + integralLpSeminorm f p μ = eLpNorm f p μ := by + simp only [integralLpSeminorm, eLpNorm, if_pos hf] + +/-- Negation leaves the integral seminorm unchanged, without measurability assumptions. -/ +theorem integralLpSeminorm_neg {E : Type*} [NormedAddCommGroup E] {α : Type*} [MeasurableSpace α] + (f : α → E) (p : ℝ≥0∞) (μ : Measure α) : + integralLpSeminorm (-f) p μ = integralLpSeminorm f p μ := by + simp only [integralLpSeminorm, eLpNormEssSup_eq_essSup_enorm, + Pi.neg_apply, enorm_neg, eLpNorm'_neg] + +/-- Scalar multiplication scales the raw integral seminorm at every exponent, including zero +and infinity, without requiring the function to be measurable. -/ +theorem integralLpSeminorm_const_smul + {𝕜 : Type*} {F : Type*} {α : Type*} + [NormedDivisionRing 𝕜] [NormedAddCommGroup F] + [Module 𝕜 F] [NormSMulClass 𝕜 F] [MeasurableSpace α] + (c : 𝕜) (f : α → F) (p : ℝ≥0∞) (μ : Measure α) : + integralLpSeminorm (c • f) p μ = ‖c‖ₑ * integralLpSeminorm f p μ := by + by_cases hp0 : p = 0 + · simp [integralLpSeminorm, hp0] + by_cases hpt : p = ∞ + · simp only [integralLpSeminorm, if_neg hp0, if_pos hpt, + eLpNormEssSup_const_smul] + · simp only [integralLpSeminorm, if_neg hp0, if_neg hpt] + exact eLpNorm'_const_smul c (ENNReal.toReal_pos hp0 hpt) + +/-- Almost everywhere equal functions have equal integral seminorms. -/ +theorem integralLpSeminorm_congr_ae {α : Type*} [MeasurableSpace α] + {f g : α → E} {p : ℝ≥0∞} {μ : Measure α} (h : f =ᵐ[μ] g) : + integralLpSeminorm f p μ = integralLpSeminorm g p μ := by + simp only [integralLpSeminorm, eLpNormEssSup_congr_ae h, eLpNorm'_congr_ae h] + +/-- Scaling a measure scales the finite-exponent integral seminorm. -/ +theorem integralLpSeminorm_smul_measure {α : Type*} [MeasurableSpace α] + (f : α → E) {p : ℝ≥0∞} (hp : p ≠ ∞) (μ : Measure α) (c : ℝ≥0∞) : + integralLpSeminorm f p (c • μ) = c ^ (1 / p).toReal * integralLpSeminorm f p μ := by + by_cases hp0 : p = 0 + · simp [integralLpSeminorm, hp0] + · simp only [integralLpSeminorm, if_neg hp0, if_neg hp] + simpa only [one_div, ENNReal.toReal_inv] using + eLpNorm'_smul_measure (f := f) (μ := μ) ENNReal.toReal_nonneg c + +/-- Restricting to a set containing the support preserves the integral seminorm, +including for functions that are not measurable. -/ +theorem integralLpSeminorm_restrict_eq_of_support_subset + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {p : ℝ≥0∞} {s : Set α} {f : α → E} + (hsf : f.support ⊆ s) : + integralLpSeminorm f p (μ.restrict s) = integralLpSeminorm f p μ := by + by_cases hp0 : p = 0 + · simp only [integralLpSeminorm, if_pos hp0] + by_cases hpt : p = ∞ + · simp only [integralLpSeminorm, if_neg hp0, if_pos hpt, + eLpNormEssSup_eq_essSup_enorm] + exact ENNReal.essSup_restrict_eq_of_support_subset fun x hx ↦ hsf <| enorm_ne_zero.1 hx + · simp only [integralLpSeminorm, if_neg hp0, if_neg hpt, + eLpNorm'_eq_lintegral_enorm] + congr 1 + apply setLIntegral_eq_of_support_subset + have hp : ¬p.toReal ≤ 0 := not_le.mpr (ENNReal.toReal_pos hp0 hpt) + simpa [hp] using hsf + +/-- The integral seminorm is bounded by Mathlib's norm even without measurability. -/ +theorem integralLpSeminorm_le_eLpNorm {α : Type*} [MeasurableSpace α] + [TopologicalSpace E] (f : α → E) (p : ℝ≥0∞) (μ : Measure α) : + integralLpSeminorm f p μ ≤ eLpNorm f p μ := by + by_cases hf : AEStronglyMeasurable f μ + · exact (integralLpSeminorm_eq_eLpNorm f p μ hf).le + · simp only [eLpNorm, if_neg hf, le_top] + +end + +end Homogenization.Gagliardo diff --git a/LeanPool/CoarseGraining/Homogenization/Internal.lean b/LeanPool/CoarseGraining/Homogenization/Internal.lean new file mode 100644 index 0000000000..a8baae25c2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02 + +/-! # Internal -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02.lean new file mode 100644 index 0000000000..46fe9e8671 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Quadraticity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BasicVariationalIdentities +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockCoarseMatrix + +/-! # Ch02 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Adapters.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Adapters.lean new file mode 100644 index 0000000000..8035717642 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Adapters.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage + +/-! # Adapters -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +/-- The public Chapter 2 average is definitionally the old volume average. -/ +theorem book_average_eq_volumeAverage {d : ℕ} (U : Book.Ch02.Domain d) + (f : Vec d → ℝ) : + Book.Ch02.average U f = volumeAverage (U : Set (Vec d)) f := + rfl + +/-- The public Chapter 2 response integrand is definitionally the old scalar +response integrand. -/ +theorem book_responseIntegrand_eq_scalarResponseIntegrand {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) + (p q : Vec d) (v : Book.Ch02.Solution U a) : + Book.Ch02.responseIntegrand U a p q v = + scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField p q v := + rfl + +/-- Adapter from the new public response value to the old proof-engine value. -/ +theorem book_responseValue_eq_volumeAverage_scalarResponseIntegrand {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) + (p q : Vec d) (v : Book.Ch02.Solution U a) : + Book.Ch02.responseValue U a p q v = + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField p q v) := + rfl + +/-- The public value set is the old value set, behind the internal boundary. -/ +theorem book_responseValueSet_eq_responseJValueSet {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) (p q : Vec d) : + Book.Ch02.responseValueSet U a p q = + responseJValueSet (U : Set (Vec d)) p q a.toCoeffField := by + ext m + constructor + · rintro ⟨v, rfl⟩ + exact ⟨v, rfl⟩ + · rintro ⟨v, rfl⟩ + exact ⟨v, rfl⟩ + +/-- The public response functional is the old response functional, internally. -/ +theorem book_responseJ_eq_ResponseJ {d : ℕ} (U : Book.Ch02.Domain d) + (a : Book.Ch02.CoeffOn U) (p q : Vec d) : + Book.Ch02.responseJ U a p q = + ResponseJ (U : Set (Vec d)) p q a.toCoeffField := by + simp [Book.Ch02.responseJ, ResponseJ, book_responseValueSet_eq_responseJValueSet] + +/-- The public `sigmaStarInv` matrix is the old canonical matrix, internally. -/ +theorem book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.sigmaStarInvCoarse U a = + Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField := by + ext i j + by_cases hij : i = j + · subst j + simp [Book.Ch02.sigmaStarInvCoarse, Book.Ch02.sigmaStarInvEntry, + book_responseJ_eq_ResponseJ] + · simp [Book.Ch02.sigmaStarInvCoarse, Book.Ch02.sigmaStarInvEntry, + hij, book_responseJ_eq_ResponseJ] + +/-- The public mixed-response matrix is the old canonical mixed matrix, +internally. -/ +theorem book_sigmaStarInvKappaCoarse_eq_sigmaStarInvKappaCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.sigmaStarInvKappaCoarse U a = + Homogenization.sigmaStarInvKappaCoarse (U : Set (Vec d)) a.toCoeffField := by + ext i j + simp [Book.Ch02.sigmaStarInvKappaCoarse, Book.Ch02.mixedResponse, + Homogenization.sigmaStarInvKappaCoarse, book_responseJ_eq_ResponseJ] + +/-- The public `sigmaStar` matrix is the old canonical matrix, internally. -/ +theorem book_sigmaStarCoarse_eq_sigmaStarCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.sigmaStarCoarse U a = + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField := by + simp [Book.Ch02.sigmaStarCoarse, Homogenization.sigmaStarCoarse, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse] + +/-- The public `kappa` matrix is the old canonical matrix, internally. -/ +theorem book_kappaCoarse_eq_kappaCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.kappaCoarse U a = + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField := by + simp [Book.Ch02.kappaCoarse, Homogenization.kappaCoarse, + book_sigmaStarCoarse_eq_sigmaStarCoarse, + book_sigmaStarInvKappaCoarse_eq_sigmaStarInvKappaCoarse] + +/-- The public corrected `sigma` response is the old corrected response, +internally. -/ +theorem book_canonicalSigmaCorrectedResponse_eq_sigmaCorrectedResponse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) (p : Vec d) : + Book.Ch02.canonicalSigmaCorrectedResponse U a p = + Homogenization.sigmaCorrectedResponse (U : Set (Vec d)) a.toCoeffField p := by + simp [Book.Ch02.canonicalSigmaCorrectedResponse, + Homogenization.sigmaCorrectedResponse, book_responseJ_eq_ResponseJ, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse, book_kappaCoarse_eq_kappaCoarse] + +/-- The public `sigma` matrix is the old canonical matrix, internally. -/ +theorem book_sigmaCoarse_eq_sigmaCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.sigmaCoarse U a = + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField := by + ext i j + by_cases hij : i = j + · subst j + simp [Book.Ch02.sigmaCoarse, Book.Ch02.sigmaEntry, + book_canonicalSigmaCorrectedResponse_eq_sigmaCorrectedResponse] + · simp [Book.Ch02.sigmaCoarse, Book.Ch02.sigmaEntry, + hij, book_canonicalSigmaCorrectedResponse_eq_sigmaCorrectedResponse] + +/-- The public harmonic-mean average is the old averaged inverse symmetric +part, internally. -/ +theorem book_averagedSymmPartInv_eq_averagedSymmPartInv {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.averagedSymmPartInv U a = + Homogenization.averagedSymmPartInv (U : Set (Vec d)) a.toCoeffField := + rfl + +/-- The public upper coefficient average is the old averaged upper-left +coefficient, internally. -/ +theorem book_averagedSymmPartPlusCorrection_eq_averagedSymmPartPlusCorrection + {d : ℕ} (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) : + Book.Ch02.averagedSymmPartPlusCorrection U a = + Homogenization.averagedSymmPartPlusCorrection (U : Set (Vec d)) a.toCoeffField := + rfl + +/-- The public derived `b` matrix is the old canonical `bCoarse`, once the old +`sigmaStar` witness identifies its inverse with `sigmaStarInvCoarse`. -/ +theorem book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse {d : ℕ} + (U : Book.Ch02.Domain d) (a : Book.Ch02.CoeffOn U) + (hS : + IsSigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)) : + (Book.Ch02.coarseMatrices U a).b = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + change + Book.Ch02.sigmaCoarse U a + + matTranspose (Book.Ch02.kappaCoarse U a) * + Book.Ch02.sigmaStarInvCoarse U a * Book.Ch02.kappaCoarse U a = + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField + + matTranspose (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) * + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)⁻¹ * + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField + rw [book_sigmaCoarse_eq_sigmaCoarse U a, book_kappaCoarse_eq_kappaCoarse U a, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BasicVariationalIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BasicVariationalIdentities.lean new file mode 100644 index 0000000000..a767a66196 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BasicVariationalIdentities.lean @@ -0,0 +1,409 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BasicVariationalIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.HarmonicMean +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.UpperLeftAverage +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaLeBCoarse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarLeSigma +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence + +/-! # Basic Variational Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem matLoewnerLE_zero_dim {A B : Mat 0} : + MatLoewnerLE A B := by + intro p + have hp : p = 0 := Subsingleton.elim p 0 + subst p + simp [vecDot, matVecMul] + +private theorem responseValue_zero_zero_zero_dim (U : Domain 0) + (a : CoeffOn U) (w : Solution U a) : + responseValue U a 0 0 w = 0 := by + change + average U (responseIntegrand U a (0 : Vec 0) (0 : Vec 0) w) = 0 + rw [show responseIntegrand U a (0 : Vec 0) (0 : Vec 0) w = 0 by + funext x + simp [responseIntegrand, vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +private theorem variationEnergyValue_zero_dim (U : Domain 0) + (a : CoeffOn U) (w : Solution U a) : + variationEnergyValue U a w = 0 := by + change average U (variationEnergyIntegrand U a w) = 0 + rw [show variationEnergyIntegrand U a w = 0 by + funext x + simp [variationEnergyIntegrand, vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +private theorem secondVariationEnergyValue_zero_dim (U : Domain 0) + (a : CoeffOn U) (v w : Solution U a) : + secondVariationEnergyValue U a v w = 0 := by + change + average U + (fun x => + (1 / 2 : ℝ) * + vecDot (v.toH1.grad x - w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) + (v.toH1.grad x - w.toH1.grad x))) = 0 + rw [show + (fun x => + (1 / 2 : ℝ) * + vecDot (v.toH1.grad x - w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) + (v.toH1.grad x - w.toH1.grad x))) = (0 : Vec 0 → ℝ) by + funext x + simp [vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +private theorem responseJ_zero_zero_of_canonical_identities (U : Domain 0) + (a : CoeffOn U) : + responseJ U a 0 0 = 0 := by + have hM : CanonicalResponseMatrixIdentities U a := + canonicalResponseMatrixIdentities U a + have h := hM.sigmaStarInv_response (0 : Vec 0) + simpa [vecDot, matVecMul] using h + +private theorem responseBasicVariationalIdentitiesTheory_zero_dim + (U : Domain 0) (a : CoeffOn U) : + ResponseBasicVariationalIdentitiesTheory U a (coarseMatrices U a) := by + have hJ00 : responseJ U a (0 : Vec 0) (0 : Vec 0) = 0 := + responseJ_zero_zero_of_canonical_identities U a + refine + { matrix_identities := canonicalResponseMatrixIdentities U a + sigmaStar_symm := by + simpa using sigmaStarCoarse_isSymm U a + harmonicMean_le_sigmaStar := matLoewnerLE_zero_dim + sigmaStar_le_sigma := matLoewnerLE_zero_dim + sigma_le_b := matLoewnerLE_zero_dim + b_le_averagedSymmPartPlusCorrection := matLoewnerLE_zero_dim + second_variation := ?_ + maximizer_energy := ?_ + average_gradient := ?_ + average_flux := ?_ } + · intro p q v _hv w + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + rw [hJ00, responseValue_zero_zero_zero_dim U a w, + secondVariationEnergyValue_zero_dim U a v w] + ring + · intro p q v _hv + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + rw [hJ00, variationEnergyValue_zero_dim U a v] + ring + · intro p q v _hv + exact Subsingleton.elim _ _ + · intro p q v _hv + exact Subsingleton.elim _ _ + +theorem responseSecondVariation_eq_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) (v : Solution U a) + (hv : Book.Ch02.IsResponseMaximizer U a p q v) (w : Solution U a) : + responseJ U a p q - responseValue U a p q w = + secondVariationEnergyValue U a v w := by + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + let wdiff : Solution U a := + AHarmonicFunction.subOfIntegrable w v (hInt.weakFlux w) (hInt.weakFlux v) + have hsec := + responseJ_second_variation_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p q v hv wdiff + (hInt.weakFlux v) (hInt.weakFlux wdiff) + (hInt.response p q v) (hInt.firstVariation p q v wdiff) + (hInt.energy wdiff) + have hgradPert : + (scalarPerturbation v wdiff 1 (hInt.weakFlux v) + (hInt.weakFlux wdiff)).toH1.grad = w.toH1.grad := by + dsimp [wdiff] + rw [scalarPerturbation_grad, AHarmonicFunction.grad_subOfIntegrable] + funext x + simp [sub_eq_add_neg] + have hresp : + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField p q + (scalarPerturbation v wdiff 1 (hInt.weakFlux v) + (hInt.weakFlux wdiff))) = + responseValue U a p q w := by + change + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField p q + (scalarPerturbation v wdiff 1 (hInt.weakFlux v) + (hInt.weakFlux wdiff))) = + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField p q w) + exact congrArg (volumeAverage (U : Set (Vec d))) + (scalarResponseIntegrand_eq_of_grad_eq hgradPert) + have henergyFun : + ((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a.toCoeffField wdiff) = + fun x => + (1 / 2 : ℝ) * + vecDot (v.toH1.grad x - w.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) + (v.toH1.grad x - w.toH1.grad x)) := by + funext x + dsimp [wdiff, scalarVariationEnergyIntegrand] + rw [AHarmonicFunction.grad_subOfIntegrable] + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, + vecDot_add_right, vecDot_neg_left, vecDot_neg_right] + ring + have henergy : + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField wdiff) = + secondVariationEnergyValue U a v w := by + calc + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField wdiff) + = + volumeAverage (U : Set (Vec d)) + ((1 / 2 : ℝ) • scalarVariationEnergyIntegrand a.toCoeffField wdiff) := by + rw [volumeAverage_smul] + _ = secondVariationEnergyValue U a v w := by + rw [henergyFun] + rfl + rw [hresp] at hsec + rw [book_responseJ_eq_ResponseJ U a p q] + nlinarith [hsec, henergy] + +theorem responseJ_eq_energy_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) (v : Solution U a) + (hv : Book.Ch02.IsResponseMaximizer U a p q v) : + responseJ U a p q = (1 / 2 : ℝ) * variationEnergyValue U a v := by + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rw [book_responseJ_eq_ResponseJ U a p q] + change + ResponseJ (U : Set (Vec d)) p q a.toCoeffField = + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField v) + exact + responseJ_energy_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p q v hv + (hInt.weakFlux v) (hInt.response p q v) + (hInt.firstVariation p q v v) (hInt.energy v) + +theorem averageGradient_eq_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (hS : IsSigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)) + (hK : IsKappaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) + (hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det) + (p q : Vec d) (v : Solution U a) + (hv : Book.Ch02.IsResponseMaximizer U a p q v) : + averageGradient U a v = + -p + matVecMul (coarseMatrices U a).sigmaStarInv + (q + matVecMul (coarseMatrices U a).kappa p) := by + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rcases ScalarCanonicalMaximizer.GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) U.nonempty U.isDomain hEll with + ⟨basis⟩ + have hold := + basic_cg_identities_average_gradient_formula_canonical_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField hS hK hdet p q hInt v hv + (fun i => (basis.grad i : AHarmonicFunction a.toCoeffField (U : Set (Vec d)))) + (fun i => (basis.grad i).isResponseMaximizer) + calc + averageGradient U a v = + (fun i => volumeAverage (U : Set (Vec d)) (fun x => v.toH1.grad x i)) := rfl + _ = + -p + matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) := hold + _ = + -p + matVecMul (coarseMatrices U a).sigmaStarInv + (q + matVecMul (coarseMatrices U a).kappa p) := by + rw [← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a] + rfl + +theorem averageFlux_eq_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (hS : IsSigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)) + (hK : IsKappaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) + {sigma : Mat d} + (hSigma : IsSigmaCoarse (U : Set (Vec d)) a.toCoeffField + sigma + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) + (hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det) + (p q : Vec d) (v : Solution U a) + (hv : Book.Ch02.IsResponseMaximizer U a p q v) : + averageFlux U a v = + q - matVecMul (matTranspose (coarseMatrices U a).kappa) + (matVecMul (coarseMatrices U a).sigmaStarInv q) - + matVecMul (coarseMatrices U a).b p := by + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rcases ScalarCanonicalMaximizer.FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) U.nonempty U.isDomain hEll with + ⟨basis⟩ + have hold := + basic_cg_identities_average_flux_formula_canonical_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField hS hK hSigma hdet p q hInt v hv + (fun i => (basis.flux i : AHarmonicFunction a.toCoeffField (U : Set (Vec d)))) + (fun i => (basis.flux i).isResponseMaximizer) + calc + averageFlux U a v = + (fun i => volumeAverage (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x) i)) := rfl + _ = + q - + matVecMul + (matTranspose (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) q) - + matVecMul + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) p := hold + _ = + q - matVecMul (matTranspose (coarseMatrices U a).kappa) + (matVecMul (coarseMatrices U a).sigmaStarInv q) - + matVecMul (coarseMatrices U a).b p := by + rw [← book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse U a hS, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + rfl + +theorem responseBasicVariationalIdentitiesTheory_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseBasicVariationalIdentitiesTheory U a (coarseMatrices U a) := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, sigma0, compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hdet : IsUnit (Homogenization.sigmaStarCoarse + (U : Set (Vec d)) a.toCoeffField).det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol compat hS + have hb : + (coarseMatrices U a).b = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse U a hS + refine + { matrix_identities := canonicalResponseMatrixIdentities_of_isEllipticFieldOn U a hEll + sigmaStar_symm := by + simpa using sigmaStarCoarse_isSymm U a + harmonicMean_le_sigmaStar := ?_ + sigmaStar_le_sigma := ?_ + sigma_le_b := ?_ + b_le_averagedSymmPartPlusCorrection := ?_ + second_variation := ?_ + maximizer_energy := ?_ + average_gradient := ?_ + average_flux := ?_ } + · have h := + harmonicMeanSymmPart_le_sigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol compat + simpa [book_averagedSymmPartInv_eq_averagedSymmPartInv U a, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] using h + · intro p + have h := + sigmaStarCoarse_le_sigmaCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hA hS hK hSigma p + change + (1 / 2 : ℝ) * + vecDot p (matVecMul (Book.Ch02.sigmaStarCoarse U a) p) ≤ + (1 / 2 : ℝ) * vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + rw [book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a] + nlinarith + · have h := + sigmaCoarse_le_bCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hS hK hSigma + simpa [book_sigmaCoarse_eq_sigmaCoarse U a, hb] using h + · have h := + bCoarse_le_averagedSymmPartPlusCorrection_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hA hS hK hSigma + simpa [hb, book_averagedSymmPartPlusCorrection_eq_averagedSymmPartPlusCorrection U a] + using h + · intro p q v hv w + exact responseSecondVariation_eq_of_isEllipticFieldOn U a hEll p q v hv w + · intro p q v hv + exact responseJ_eq_energy_of_isEllipticFieldOn U a hEll p q v hv + · intro p q v hv + exact averageGradient_eq_of_isEllipticFieldOn U a hEll hS hK hdet p q v hv + · intro p q v hv + exact averageFlux_eq_of_isEllipticFieldOn U a hEll hS hK hSigma hdet p q v hv + +theorem responseBasicVariationalIdentitiesTheory_of_neZero + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) : + ResponseBasicVariationalIdentitiesTheory U a (coarseMatrices U a) := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : + ResponseBasicVariationalIdentitiesTheory U b (coarseMatrices U b) := + responseBasicVariationalIdentitiesTheory_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + simpa [coarseMatrices_eq_ofAEEq hba] using + ResponseBasicVariationalIdentitiesTheory.ofAEEq hba hb + +theorem responseBasicVariationalIdentitiesTheory + {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseBasicVariationalIdentitiesTheory U a (coarseMatrices U a) := by + by_cases hd : d = 0 + · subst d + exact responseBasicVariationalIdentitiesTheory_zero_dim U a + · let : NeZero d := ⟨hd⟩ + exact responseBasicVariationalIdentitiesTheory_of_neZero U a + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockCoarseMatrix.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockCoarseMatrix.lean new file mode 100644 index 0000000000..e9e4be0399 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockCoarseMatrix.lean @@ -0,0 +1,953 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockCoarseMatrixDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponse +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentities +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScaling +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledMu +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.BasicAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics + +/-! # Block Coarse Matrix -/ + +@[expose] public section + +open scoped BigOperators + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem blockMat_eq_of_toFullBlockMat_eq {d : ℕ} {A B : BlockMat d} + (h : toFullBlockMat A = toFullBlockMat B) : A = B := by + calc + A = ofFullBlockMat (toFullBlockMat A) := (ofFullBlockMat_toFullBlockMat A).symm + _ = ofFullBlockMat (toFullBlockMat B) := by rw [h] + _ = B := ofFullBlockMat_toFullBlockMat B + +private theorem toFullBlockMat_blockMatMul {d : ℕ} (A B : BlockMat d) : + toFullBlockMat (Book.Ch02.blockMatMul A B) = + toFullBlockMat A * toFullBlockMat B := by + ext α β + cases α <;> cases β <;> + simp [Book.Ch02.blockMatMul, toFullBlockMat, Matrix.mul_apply, + Fintype.sum_sum_type] + +private theorem toFullBlockMat_blockIdentity {d : ℕ} : + toFullBlockMat (Book.Ch02.blockIdentity d) = 1 := by + ext α β + cases α <;> cases β <;> + simp [Book.Ch02.blockIdentity, Book.Ch02.blockDiag, toFullBlockMat, + Matrix.one_apply] + +private theorem blockMatMul_blockMatInv_right {d : ℕ} (A : BlockMat d) + (hdet : IsUnit (toFullBlockMat A).det) : + Book.Ch02.blockMatMul A (Book.Ch02.blockMatInv A) = + Book.Ch02.blockIdentity d := by + apply blockMat_eq_of_toFullBlockMat_eq + calc + toFullBlockMat (Book.Ch02.blockMatMul A (Book.Ch02.blockMatInv A)) = + toFullBlockMat A * toFullBlockMat (Book.Ch02.blockMatInv A) := by + rw [toFullBlockMat_blockMatMul] + _ = toFullBlockMat A * (toFullBlockMat A)⁻¹ := by + simp [Book.Ch02.blockMatInv] + _ = 1 := Matrix.mul_nonsing_inv (toFullBlockMat A) hdet + _ = toFullBlockMat (Book.Ch02.blockIdentity d) := + (toFullBlockMat_blockIdentity (d := d)).symm + +private theorem blockMatMul_blockMatInv_left {d : ℕ} (A : BlockMat d) + (hdet : IsUnit (toFullBlockMat A).det) : + Book.Ch02.blockMatMul (Book.Ch02.blockMatInv A) A = + Book.Ch02.blockIdentity d := by + apply blockMat_eq_of_toFullBlockMat_eq + calc + toFullBlockMat (Book.Ch02.blockMatMul (Book.Ch02.blockMatInv A) A) = + toFullBlockMat (Book.Ch02.blockMatInv A) * toFullBlockMat A := by + rw [toFullBlockMat_blockMatMul] + _ = (toFullBlockMat A)⁻¹ * toFullBlockMat A := by + simp [Book.Ch02.blockMatInv] + _ = 1 := Matrix.nonsing_inv_mul (toFullBlockMat A) hdet + _ = toFullBlockMat (Book.Ch02.blockIdentity d) := + (toFullBlockMat_blockIdentity (d := d)).symm + +private theorem isUnit_det_toFullBlockMat_of_blockPosDef {d : ℕ} + {A : BlockMat d} (hA : Book.Ch02.BlockPosDef A) : + IsUnit (toFullBlockMat A).det := by + classical + let M : FullBlockMat d := toFullBlockMat A + have hker : ¬ ∃ v : FullBlockVec d, v ≠ 0 ∧ Matrix.mulVec M v = 0 := by + rintro ⟨v, hv, hMv⟩ + let X : BlockVec d := ofFullBlockVec v + have hX : X ≠ 0 := by + intro hX0 + apply hv + calc + v = toFullBlockVec X := by simp [X] + _ = 0 := by + rw [hX0] + funext α + cases α <;> rfl + have hquad : blockVecDot X (blockMatVecMul A X) = 0 := by + rw [← dotProduct_toFullBlockVec X (blockMatVecMul A X)] + rw [toFullBlockVec_blockMatVecMul] + simp [M, X, hMv] + have hpos := hA X hX + linarith + have hdet_ne : (toFullBlockMat A).det ≠ 0 := by + intro hdet + rcases (Matrix.exists_mulVec_eq_zero_iff (M := M)).mpr hdet with ⟨v, hv, hMv⟩ + exact hker ⟨v, hv, by simpa [Matrix.mulVec] using hMv⟩ + exact isUnit_iff_ne_zero.mpr hdet_ne + +private theorem toFullBlockMat_posDef_of_blockPosDef {d : ℕ} {A : BlockMat d} + (hSymm : IsSymmetricBlockMat A) (hPos : Book.Ch02.BlockPosDef A) : + (toFullBlockMat A).PosDef := by + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using + isSymm_toFullBlockMat_of_isSymmetricBlockMat hSymm + · intro v hv + let X : BlockVec d := ofFullBlockVec v + have hX : X ≠ 0 := by + intro hX0 + apply hv + calc + v = toFullBlockVec X := by simp [X] + _ = 0 := by + rw [hX0] + funext α + cases α <;> rfl + have h := hPos X hX + have h' : 0 < dotProduct v (Matrix.mulVec (toFullBlockMat A) v) := by + rw [← dotProduct_toFullBlockVec X (blockMatVecMul A X)] at h + rw [toFullBlockVec_blockMatVecMul] at h + simpa [X] using h + simpa using h' + +private theorem blockMatInv_posDef_of_blockPosDef {d : ℕ} {A : BlockMat d} + (hSymm : IsSymmetricBlockMat A) (hPos : Book.Ch02.BlockPosDef A) : + Book.Ch02.BlockPosDef (Book.Ch02.blockMatInv A) := by + have hFull : (toFullBlockMat A).PosDef := + toFullBlockMat_posDef_of_blockPosDef hSymm hPos + intro X hX + have hFullX : toFullBlockVec X ≠ 0 := by + intro hzero + apply hX + calc + X = ofFullBlockVec (toFullBlockVec X) := (ofFullBlockVec_toFullBlockVec X).symm + _ = 0 := by rw [hzero]; rfl + have h := hFull.inv.dotProduct_mulVec_pos hFullX + rw [← dotProduct_toFullBlockVec X + (blockMatVecMul (Book.Ch02.blockMatInv A) X)] + rw [toFullBlockVec_blockMatVecMul] + simpa [Book.Ch02.blockMatInv] using h + +private theorem blockVec_swap_ne_zero {d : ℕ} {X : BlockVec d} + (hX : X ≠ 0) : (X.2, X.1) ≠ 0 := by + rcases X with ⟨p, q⟩ + intro h + exact hX (Prod.ext (congrArg Prod.snd h) (congrArg Prod.fst h)) + +private theorem blockPosDef_blockReflect {d : ℕ} {A : BlockMat d} + (hA : Book.Ch02.BlockPosDef A) : + Book.Ch02.BlockPosDef (blockReflect A) := by + intro X hX + simpa using hA (X.2, X.1) (blockVec_swap_ne_zero hX) + +private theorem BlockMatLoewnerLE_blockReflect {d : ℕ} {A B : BlockMat d} + (hAB : BlockMatLoewnerLE A B) : + BlockMatLoewnerLE (blockReflect A) (blockReflect B) := by + intro X + simpa using hAB (X.2, X.1) + +private theorem weightedAverage_add_const {d : ℕ} {U : Domain d} + (P : DomainPartition U) (f : P.Cell → ℝ) (c : ℝ) : + P.weightedAverage (fun i => f i + c) = P.weightedAverage f + c := by + classical + let : Fintype P.Cell := P.instFintype + unfold DomainPartition.weightedAverage + calc + ∑ i : P.Cell, P.weight i * (f i + c) = + ∑ i : P.Cell, (P.weight i * f i + P.weight i * c) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + _ = ∑ i : P.Cell, P.weight i * f i + ∑ i : P.Cell, P.weight i * c := by + rw [Finset.sum_add_distrib] + _ = ∑ i : P.Cell, P.weight i * f i + (∑ i : P.Cell, P.weight i) * c := by + rw [Finset.sum_mul] + _ = ∑ i : P.Cell, P.weight i * f i + c := by + rw [P.weight_sum_one, one_mul] + +private theorem weightedAverage_const_mul {d : ℕ} {U : Domain d} + (P : DomainPartition U) (c : ℝ) (f : P.Cell → ℝ) : + P.weightedAverage (fun i => c * f i) = c * P.weightedAverage f := by + classical + let : Fintype P.Cell := P.instFintype + unfold DomainPartition.weightedAverage + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + +private theorem vecDot_matVecMul_weightedMatAverage {d : ℕ} {U : Domain d} + (P : DomainPartition U) (F : P.Cell → Mat d) (x y : Vec d) : + vecDot x (matVecMul (P.weightedMatAverage F) y) = + P.weightedAverage fun i => vecDot x (matVecMul (F i) y) := by + classical + let : Fintype P.Cell := P.instFintype + simp [DomainPartition.weightedMatAverage, DomainPartition.weightedAverage, + vecDot, matVecMul, Finset.mul_sum, mul_assoc, mul_left_comm, mul_comm] + ring_nf + let T : P.Cell → Fin d → Fin d → ℝ := + fun c i j => F c i j * x i * y j * P.weight c + change (∑ i : Fin d, ∑ j : Fin d, ∑ c : P.Cell, T c i j) = + ∑ c : P.Cell, ∑ i : Fin d, ∑ j : Fin d, T c i j + calc + (∑ i : Fin d, ∑ j : Fin d, ∑ c : P.Cell, T c i j) + = ∑ i : Fin d, ∑ c : P.Cell, ∑ j : Fin d, T c i j := by + congr with i + rw [Finset.sum_comm] + _ = ∑ c : P.Cell, ∑ i : Fin d, ∑ j : Fin d, T c i j := by + rw [Finset.sum_comm] + +private theorem blockVecDot_blockMatVecMul_weightedBlockAverage {d : ℕ} + {U : Domain d} (P : DomainPartition U) (F : P.Cell → BlockMat d) + (X : BlockVec d) : + blockVecDot X (blockMatVecMul (P.weightedBlockAverage F) X) = + P.weightedAverage fun i => blockVecDot X (blockMatVecMul (F i) X) := by + classical + let : Fintype P.Cell := P.instFintype + rcases X with ⟨p, q⟩ + rw [blockMatVecMul, blockVecDot, vecDot_add_right, vecDot_add_right] + change + vecDot p (matVecMul (P.weightedMatAverage fun i => (F i).upperLeft) p) + + vecDot p (matVecMul (P.weightedMatAverage fun i => (F i).upperRight) q) + + (vecDot q (matVecMul (P.weightedMatAverage fun i => (F i).lowerLeft) p) + + vecDot q (matVecMul (P.weightedMatAverage fun i => (F i).lowerRight) q)) = + P.weightedAverage fun i => blockVecDot (p, q) (blockMatVecMul (F i) (p, q)) + rw [vecDot_matVecMul_weightedMatAverage P (fun i => (F i).upperLeft)] + rw [vecDot_matVecMul_weightedMatAverage P (fun i => (F i).upperRight)] + rw [vecDot_matVecMul_weightedMatAverage P (fun i => (F i).lowerLeft)] + rw [vecDot_matVecMul_weightedMatAverage P (fun i => (F i).lowerRight)] + simp [DomainPartition.weightedAverage, blockMatVecMul, blockVecDot, + vecDot_add_right, Finset.sum_add_distrib, mul_add, add_assoc] + +private theorem half_blockVecDot_blockMatVecMul_weightedBlockAverage {d : ℕ} + {U : Domain d} (P : DomainPartition U) (F : P.Cell → BlockMat d) + (X : BlockVec d) : + (1 / 2 : ℝ) * + blockVecDot X (blockMatVecMul (P.weightedBlockAverage F) X) = + P.weightedAverage fun i => + (1 / 2 : ℝ) * blockVecDot X (blockMatVecMul (F i) X) := by + rw [blockVecDot_blockMatVecMul_weightedBlockAverage P F X] + rw [weightedAverage_const_mul] + +private theorem weightedBlockAverage_blockReflect {d : ℕ} {U : Domain d} + (P : DomainPartition U) (F : P.Cell → BlockMat d) : + P.weightedBlockAverage (fun i => blockReflect (F i)) = + blockReflect (P.weightedBlockAverage F) := by + rfl + +private theorem cross_transpose {d : ℕ} (K S : Mat d) (hS : S.IsSymm) : + matTranspose (-(matTranspose K * S)) = -(S * K) := by + ext i j + simp [matTranspose, Matrix.mul_apply] + refine Finset.sum_congr rfl ?_ + intro x _hx + rw [hS.apply] + ring + +private theorem isSymmetricBlockMat_blockMatrixOfCoarseMatrices {d : ℕ} + (M : CoarseMatrices d) (hSigma : M.sigma.IsSymm) + (hSigmaStarInv : M.sigmaStarInv.IsSymm) : + IsSymmetricBlockMat (Book.Ch02.blockMatrixOfCoarseMatrices M) := by + have hB : M.b.IsSymm := by + unfold CoarseMatrices.b + exact hSigma.add + (transpose_mul_symm_mul_isSymm M.kappa M.sigmaStarInv hSigmaStarInv) + have hCross : + matTranspose (-(matTranspose M.kappa * M.sigmaStarInv)) = + -(M.sigmaStarInv * M.kappa) := + cross_transpose M.kappa M.sigmaStarInv hSigmaStarInv + intro α β + cases α with + | inl i => + cases β with + | inl j => + simpa [Book.Ch02.blockMatrixOfCoarseMatrices, blockMatEntry, + matTranspose] using (hB.apply i j).symm + | inr j => + have h := congrArg (fun N : Mat d => N j i) hCross + simpa [Book.Ch02.blockMatrixOfCoarseMatrices, blockMatEntry, + matTranspose] using h + | inr i => + cases β with + | inl j => + have h := congrArg (fun N : Mat d => N i j) hCross + simpa [Book.Ch02.blockMatrixOfCoarseMatrices, blockMatEntry, + matTranspose] using h.symm + | inr j => + simpa [Book.Ch02.blockMatrixOfCoarseMatrices, blockMatEntry, + matTranspose] using (hSigmaStarInv.apply i j).symm + +private theorem coarseBlockMatrix_isSymmetricBlockMat {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + IsSymmetricBlockMat (Book.Ch02.coarseBlockMatrix U a) := by + unfold Book.Ch02.coarseBlockMatrix + exact isSymmetricBlockMat_blockMatrixOfCoarseMatrices (Book.Ch02.coarseMatrices U a) + (Book.Ch02.sigmaCoarse_isSymm U a) (Book.Ch02.sigmaStarInvCoarse_isSymm U a) + +private theorem responseJ_eq_block_quadratic_zero_dim + (U : Domain 0) (a : CoeffOn U) (p q : Vec 0) : + responseJ U a p q = + (1 / 2 : ℝ) * + blockVecDot (-p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + have hJ := Book.Ch02.responseJ_zero_q_eq_sigmaStarInvCoarse U a (0 : Vec 0) + simpa [blockVecDot, blockMatVecMul, vecDot, matVecMul] using hJ + +private theorem responseJ_eq_block_quadratic_of_isEllipticFieldOn {d : ℕ} + [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * + blockVecDot (-p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, _sigma0, compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hS + have hBlockEq : + Book.Ch02.coarseBlockMatrix U a = + Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := + book_coarseBlockMatrix_eq_old_coarseBlockMatrix_of_data U a hA hS hK hSigma hdet + have hOld := + magic_identity_responseJ_block_quadratic_coarseBlockMatrix_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hA hS hK hSigma p q + calc + responseJ U a p q = ResponseJ (U : Set (Vec d)) p q a.toCoeffField := + book_responseJ_eq_ResponseJ U a p q + _ = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul + (Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField) + (-p, q)) - + vecDot p q := hOld + _ = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + rw [hBlockEq] + +theorem responseJ_eq_block_quadratic {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + responseJ U a p q = + (1 / 2 : ℝ) * + blockVecDot (-p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + by_cases hd : d = 0 + · subst d + exact responseJ_eq_block_quadratic_zero_dim U a p q + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hbEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + have hb := responseJ_eq_block_quadratic_of_isEllipticFieldOn U b hbEll p q + calc + responseJ U a p q = responseJ U b p q := by + rw [responseJ_eq_ofAEEq hba p q] + _ = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U b) (-p, q)) - + vecDot p q := hb + _ = + (1 / 2 : ℝ) * + blockVecDot (-p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (-p, q)) - + vecDot p q := by + rw [Book.Ch02.coarseBlockMatrix_eq_ofAEEq hba] + +private theorem coarseBlockMatrix_quadratic_split_zero_dim + (U : Domain 0) (a : CoeffOn U) (p q : Vec 0) : + (1 / 2 : ℝ) * + blockVecDot (p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (Book.Ch02.kappaCoarse U a) p) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + (q - matVecMul (Book.Ch02.kappaCoarse U a) p)) := by + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + simp [blockVecDot, blockMatVecMul, vecDot, matVecMul] + +private theorem coarseBlockMatrix_quadratic_split_of_isEllipticFieldOn {d : ℕ} + [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) : + (1 / 2 : ℝ) * + blockVecDot (p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (Book.Ch02.kappaCoarse U a) p) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + (q - matVecMul (Book.Ch02.kappaCoarse U a) p)) := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, _sigma0, compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hS + have hBlockEq : + Book.Ch02.coarseBlockMatrix U a = + Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := + book_coarseBlockMatrix_eq_old_coarseBlockMatrix_of_data U a hA hS hK hSigma hdet + have hOld := + magic_identity_block_quadratic_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat hA hS hK hSigma p q + calc + (1 / 2 : ℝ) * + blockVecDot (p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul + (Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField) + (p, q)) := by + rw [hBlockEq] + _ = + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) p) + + (1 / 2 : ℝ) * + vecDot + (q - matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q - matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + hOld + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (Book.Ch02.kappaCoarse U a) p) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + (q - matVecMul (Book.Ch02.kappaCoarse U a) p)) := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + +private theorem coarseBlockMatrix_quadratic_split {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) : + (1 / 2 : ℝ) * + blockVecDot (p, q) (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) = + (1 / 2 : ℝ) * vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (Book.Ch02.kappaCoarse U a) p) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + (q - matVecMul (Book.Ch02.kappaCoarse U a) p)) := by + by_cases hd : d = 0 + · subst d + exact coarseBlockMatrix_quadratic_split_zero_dim U a p q + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hbEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + have hb := coarseBlockMatrix_quadratic_split_of_isEllipticFieldOn U b hbEll p q + simpa [Book.Ch02.coarseBlockMatrix_eq_ofAEEq hba, + Book.Ch02.sigmaCoarse_eq_ofAEEq hba, Book.Ch02.kappaCoarse_eq_ofAEEq hba, + Book.Ch02.sigmaStarInvCoarse_eq_ofAEEq hba] using hb + +private theorem sigmaCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (Book.Ch02.sigmaCoarse U a).PosDef := by + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using Book.Ch02.sigmaCoarse_isSymm U a + · intro p hp + have hStar : + 0 < vecDot p (matVecMul (Book.Ch02.sigmaStarCoarse U a) p) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + (Book.Ch02.sigmaStarCoarse_posDef U a).dotProduct_mulVec_pos hp + have hLe := (Book.Ch02.responseMagicIdentitiesTheory U a).sigmaStar_le_sigma p + have hSigma : + 0 < vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) := by + nlinarith + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using hSigma + +private theorem coarseBlockMatrix_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Book.Ch02.BlockPosDef (Book.Ch02.coarseBlockMatrix U a) := by + intro X hX + rcases X with ⟨p, q⟩ + let r : Vec d := q - matVecMul (Book.Ch02.kappaCoarse U a) p + have hsplit := coarseBlockMatrix_quadratic_split U a p q + have hp_nonneg : + 0 ≤ vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) := by + by_cases hp : p = 0 + · simp [hp, vecDot, matVecMul] + · exact le_of_lt <| by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + (sigmaCoarse_posDef U a).dotProduct_mulVec_pos hp + have hr_nonneg : + 0 ≤ vecDot r (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) r) := by + by_cases hr : r = 0 + · simp [r, hr, vecDot, matVecMul] + · exact le_of_lt <| by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + (Book.Ch02.sigmaStarInvCoarse_posDef U a).dotProduct_mulVec_pos hr + have hhalf_pos : + 0 < (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) := by + by_cases hp : p = 0 + · have hq : q ≠ 0 := by + intro hq + exact hX (Prod.ext hp hq) + have hr : r ≠ 0 := by + intro hr + apply hq + simpa [r, hp, matVecMul_zero] using hr + have hr_pos : + 0 < vecDot r (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) r) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + (Book.Ch02.sigmaStarInvCoarse_posDef U a).dotProduct_mulVec_pos hr + nlinarith [hsplit] + · have hp_pos : + 0 < vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) := by + simpa [dotProduct, Matrix.mulVec, vecDot, matVecMul] using + (sigmaCoarse_posDef U a).dotProduct_mulVec_pos hp + nlinarith [hsplit, hr_nonneg] + nlinarith + +private theorem adjoint_coarse_matrices_of_isEllipticFieldOn {d : ℕ} + [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + Book.Ch02.sigmaStarInvCoarse U a.transpose = + Book.Ch02.sigmaStarInvCoarse U a ∧ + Book.Ch02.sigmaStarCoarse U a.transpose = + Book.Ch02.sigmaStarCoarse U a ∧ + Book.Ch02.sigmaCoarse U a.transpose = Book.Ch02.sigmaCoarse U a ∧ + Book.Ch02.kappaCoarse U a.transpose = -Book.Ch02.kappaCoarse U a := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨_R, _sigma0, _compat, hA, _hSInv, _hS, _hK, _hSigma, _hSigmaCanonical⟩ + have hEllAdj : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEllAdj hvol with + ⟨_RAdj, _sigmaAdj, _compatAdj, hAAdj, _hSInvAdj, _hSAdj, _hKAdj, + _hSigmaAdj, _hSigmaCanonicalAdj⟩ + have hSInvOld : + Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaStarInvCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hStarOld : + Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaStarCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hSigmaOld : + Homogenization.sigmaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hKappaOld : + Homogenization.kappaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + -(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + kappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + refine ⟨?_, ?_, ?_, ?_⟩ + · calc + Book.Ch02.sigmaStarInvCoarse U a.transpose = + Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := by + simpa [CoeffOn.transpose, adjointCoeffField] using! + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a.transpose + _ = Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField := + hSInvOld + _ = Book.Ch02.sigmaStarInvCoarse U a := by + rw [book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + · calc + Book.Ch02.sigmaStarCoarse U a.transpose = + Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := by + simpa [CoeffOn.transpose, adjointCoeffField] using! + book_sigmaStarCoarse_eq_sigmaStarCoarse U a.transpose + _ = Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField := + hStarOld + _ = Book.Ch02.sigmaStarCoarse U a := by + rw [book_sigmaStarCoarse_eq_sigmaStarCoarse U a] + · calc + Book.Ch02.sigmaCoarse U a.transpose = + Homogenization.sigmaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := by + simpa [CoeffOn.transpose, adjointCoeffField] using! + book_sigmaCoarse_eq_sigmaCoarse U a.transpose + _ = Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField := + hSigmaOld + _ = Book.Ch02.sigmaCoarse U a := by + rw [book_sigmaCoarse_eq_sigmaCoarse U a] + · calc + Book.Ch02.kappaCoarse U a.transpose = + Homogenization.kappaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := by + simpa [CoeffOn.transpose, adjointCoeffField] using! + book_kappaCoarse_eq_kappaCoarse U a.transpose + _ = -(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + hKappaOld + _ = -Book.Ch02.kappaCoarse U a := by + rw [book_kappaCoarse_eq_kappaCoarse U a] + +private theorem adjoint_coarse_matrices {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + Book.Ch02.sigmaStarInvCoarse U a.transpose = + Book.Ch02.sigmaStarInvCoarse U a ∧ + Book.Ch02.sigmaStarCoarse U a.transpose = + Book.Ch02.sigmaStarCoarse U a ∧ + Book.Ch02.sigmaCoarse U a.transpose = Book.Ch02.sigmaCoarse U a ∧ + Book.Ch02.kappaCoarse U a.transpose = -Book.Ch02.kappaCoarse U a := by + by_cases hd : d = 0 + · subst d + refine ⟨Subsingleton.elim _ _, Subsingleton.elim _ _, + Subsingleton.elim _ _, Subsingleton.elim _ _⟩ + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hbEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + rcases adjoint_coarse_matrices_of_isEllipticFieldOn U b hbEll with + ⟨hSInv, hStar, hSigma, hKappa⟩ + refine ⟨?_, ?_, ?_, ?_⟩ + · calc + Book.Ch02.sigmaStarInvCoarse U a.transpose = + Book.Ch02.sigmaStarInvCoarse U b.transpose := by + rw [Book.Ch02.sigmaStarInvCoarse_eq_ofAEEq hba.transpose] + _ = Book.Ch02.sigmaStarInvCoarse U b := hSInv + _ = Book.Ch02.sigmaStarInvCoarse U a := by + rw [Book.Ch02.sigmaStarInvCoarse_eq_ofAEEq hba] + · calc + Book.Ch02.sigmaStarCoarse U a.transpose = + Book.Ch02.sigmaStarCoarse U b.transpose := by + rw [Book.Ch02.sigmaStarCoarse_eq_ofAEEq hba.transpose] + _ = Book.Ch02.sigmaStarCoarse U b := hStar + _ = Book.Ch02.sigmaStarCoarse U a := by + rw [Book.Ch02.sigmaStarCoarse_eq_ofAEEq hba] + · calc + Book.Ch02.sigmaCoarse U a.transpose = + Book.Ch02.sigmaCoarse U b.transpose := by + rw [Book.Ch02.sigmaCoarse_eq_ofAEEq hba.transpose] + _ = Book.Ch02.sigmaCoarse U b := hSigma + _ = Book.Ch02.sigmaCoarse U a := by + rw [Book.Ch02.sigmaCoarse_eq_ofAEEq hba] + · calc + Book.Ch02.kappaCoarse U a.transpose = + Book.Ch02.kappaCoarse U b.transpose := by + rw [Book.Ch02.kappaCoarse_eq_ofAEEq hba.transpose] + _ = -Book.Ch02.kappaCoarse U b := hKappa + _ = -Book.Ch02.kappaCoarse U a := by + rw [Book.Ch02.kappaCoarse_eq_ofAEEq hba] + +private theorem coarseBlockMatrix_transpose_eq_blockMatFlipFlux {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + Book.Ch02.coarseBlockMatrix U a.transpose = + blockMatFlipFlux (Book.Ch02.coarseBlockMatrix U a) := by + rcases adjoint_coarse_matrices U a with ⟨hSInv, _hStar, hSigma, hKappa⟩ + apply blockMat_ext + · ext i j + simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + CoarseMatrices.b, blockMatFlipFlux, hSigma, hSInv, hKappa, matTranspose, + Matrix.mul_apply] + · ext i j + simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + CoarseMatrices.b, blockMatFlipFlux, hSInv, hKappa, matTranspose, + Matrix.mul_apply] + · ext i j + simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + CoarseMatrices.b, blockMatFlipFlux, hSInv, hKappa, matTranspose, + Matrix.mul_apply] + · ext i j + simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + CoarseMatrices.b, blockMatFlipFlux, hSInv] + +private theorem doubled_block_quadratic_algebra {d : ℕ} (A : BlockMat d) + (p q r s : Vec d) : + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * + blockVecDot (s - p, r - q) + (blockMatVecMul A (s - p, r - q)) - + vecDot (p - s) (r - q)) + + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * + blockVecDot (-(s + p), r + q) + (blockMatVecMul (blockMatFlipFlux A) (-(s + p), r + q)) - + vecDot (s + p) (r + q)) = + (1 / 2 : ℝ) * + blockVecDot (p, q) (blockMatVecMul A (p, q)) + + (1 / 2 : ℝ) * + blockVecDot (r, s) + (blockMatVecMul (blockReflect A) (r, s)) - + blockVecDot (p, q) (r, s) := by + rcases A with ⟨ul, ur, ll, lr⟩ + simp [blockMatFlipFlux, blockReflect, blockMatVecMul, blockVecDot, + matVecMul_add, matVecMul_neg, neg_matVecMul, + vecDot_add_left, vecDot_add_right, vecDot_neg_left, vecDot_neg_right, + sub_eq_add_neg] + rw [vecDot_comm s q] + ring_nf + +private theorem doubled_response_splitting {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) : + doubledResponseJ U a P Q = + (1 / 2 : ℝ) * + blockVecDot P (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) P) + + (1 / 2 : ℝ) * + blockVecDot Q + (blockMatVecMul (Book.Ch02.coarseStarredBlockMatrixInv U a) Q) - + blockVecDot P Q := by + rcases P with ⟨p, q⟩ + rcases Q with ⟨r, s⟩ + have hScalar := + (Book.Ch02.doubledResponseTheory U a).doubled_response_by_scalar p s q r + have hJ1 := responseJ_eq_block_quadratic U a (p - s) (r - q) + have hJ2 := responseJ_eq_block_quadratic U a.transpose (s + p) (r + q) + calc + doubledResponseJ U a (p, q) (r, s) = + (1 / 2 : ℝ) * responseJ U a (p - s) (r - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (s + p) (r + q) := hScalar + _ = + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * + blockVecDot (s - p, r - q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (s - p, r - q)) - + vecDot (p - s) (r - q)) + + (1 / 2 : ℝ) * + ((1 / 2 : ℝ) * + blockVecDot (-(s + p), r + q) + (blockMatVecMul (blockMatFlipFlux (Book.Ch02.coarseBlockMatrix U a)) + (-(s + p), r + q)) - + vecDot (s + p) (r + q)) := by + rw [hJ1, hJ2, coarseBlockMatrix_transpose_eq_blockMatFlipFlux] + simp [sub_eq_add_neg, add_comm] + _ = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) + + (1 / 2 : ℝ) * + blockVecDot (r, s) + (blockMatVecMul (blockReflect (Book.Ch02.coarseBlockMatrix U a)) (r, s)) - + blockVecDot (p, q) (r, s) := + doubled_block_quadratic_algebra (Book.Ch02.coarseBlockMatrix U a) p q r s + _ = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) + + (1 / 2 : ℝ) * + blockVecDot (r, s) + (blockMatVecMul (Book.Ch02.coarseStarredBlockMatrixInv U a) (r, s)) - + blockVecDot (p, q) (r, s) := by + rfl + +private theorem block_matrix_subadditive {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)), + (∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) → + BlockMatLoewnerLE (Book.Ch02.coarseBlockMatrix U a) + (P.weightedBlockAverage fun i => Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) := by + intro P aCell hCell X + classical + let : Fintype P.Cell := P.instFintype + rcases X with ⟨p, q⟩ + have hSub := + (Book.Ch02.responseSubadditivityAndScalingTheory U a).responseJ_subadditive + P aCell hCell (-p) q + have hParent := responseJ_eq_block_quadratic U a (-p) q + have hParent' : + responseJ U a (-p) q = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) + + vecDot p q := by + rw [hParent] + rw [vecDot_neg_left] + simp [neg_neg] + have hCells : + ∀ i : P.Cell, + responseJ (P.cell i) (aCell i) (-p) q = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) + (p, q)) + + vecDot p q := by + intro i + have h := responseJ_eq_block_quadratic (P.cell i) (aCell i) (-p) q + rw [h] + rw [vecDot_neg_left] + simp [neg_neg] + have hSub' : + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) + + vecDot p q ≤ + P.weightedAverage + (fun i : P.Cell => + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul + (Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) (p, q)) + + vecDot p q) := by + simpa [hParent', hCells] using hSub + have hAvgConst := + weightedAverage_add_const P + (fun i : P.Cell => + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) (p, q))) + (vecDot p q) + have hClean : + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) ≤ + P.weightedAverage + (fun i : P.Cell => + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) + (p, q))) := by + nlinarith [hSub', hAvgConst] + calc + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) (p, q)) + ≤ P.weightedAverage + (fun i : P.Cell => + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul (Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) + (p, q))) := hClean + _ = + (1 / 2 : ℝ) * + blockVecDot (p, q) + (blockMatVecMul + (P.weightedBlockAverage + fun i => Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i)) (p, q)) := by + rw [← half_blockVecDot_blockMatVecMul_weightedBlockAverage] + +private theorem starred_inverse_subadditive {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)), + (∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) → + BlockMatLoewnerLE (Book.Ch02.coarseStarredBlockMatrixInv U a) + (P.weightedBlockAverage fun i => + Book.Ch02.coarseStarredBlockMatrixInv (P.cell i) (aCell i)) := by + intro P aCell hCell + have hBlock := block_matrix_subadditive U a P aCell hCell + have hReflect := BlockMatLoewnerLE_blockReflect hBlock + rw [← weightedBlockAverage_blockReflect P + (fun i => Book.Ch02.coarseBlockMatrix (P.cell i) (aCell i))] at hReflect + simpa [Book.Ch02.coarseStarredBlockMatrixInv] using hReflect + +theorem blockCoarseMatrixTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + Book.Ch02.BlockCoarseMatrixTheory U a := by + let hBlockPos : Book.Ch02.BlockPosDef (Book.Ch02.coarseBlockMatrix U a) := + coarseBlockMatrix_posDef U a + let hStarInvPos : Book.Ch02.BlockPosDef + (Book.Ch02.coarseStarredBlockMatrixInv U a) := by + simpa [Book.Ch02.coarseStarredBlockMatrixInv] using + blockPosDef_blockReflect hBlockPos + let hStarInvSymm : IsSymmetricBlockMat + (Book.Ch02.coarseStarredBlockMatrixInv U a) := by + simpa [Book.Ch02.coarseStarredBlockMatrixInv] using + isSymmetricBlockMat_blockReflect (coarseBlockMatrix_isSymmetricBlockMat U a) + let hStarDet : IsUnit (toFullBlockMat + (Book.Ch02.coarseStarredBlockMatrixInv U a)).det := + isUnit_det_toFullBlockMat_of_blockPosDef hStarInvPos + rcases adjoint_coarse_matrices U a with ⟨_hSInvAdj, hStarAdj, hSigmaAdj, hKappaAdj⟩ + refine + { doubled_response_splitting := ?_ + block_matrix_formula := ?_ + starred_inverse_formula := ?_ + block_matrix_posDef := hBlockPos + starred_matrix_posDef := ?_ + starred_inverse_posDef := hStarInvPos + starred_left_inverse := ?_ + starred_right_inverse := ?_ + block_matrix_subadditive := block_matrix_subadditive U a + starred_inverse_subadditive := starred_inverse_subadditive U a + adjoint_sigma := hSigmaAdj + adjoint_sigmaStar := hStarAdj + adjoint_kappa := hKappaAdj } + · intro P Q + exact doubled_response_splitting U a P Q + · rfl + · rfl + · simpa [Book.Ch02.coarseStarredBlockMatrix] using + blockMatInv_posDef_of_blockPosDef hStarInvSymm hStarInvPos + · simpa [Book.Ch02.coarseStarredBlockMatrix] using + blockMatMul_blockMatInv_left (Book.Ch02.coarseStarredBlockMatrixInv U a) hStarDet + · simpa [Book.Ch02.coarseStarredBlockMatrix] using + blockMatMul_blockMatInv_right (Book.Ch02.coarseStarredBlockMatrixInv U a) hStarDet + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockMatrixField.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockMatrixField.lean new file mode 100644 index 0000000000..f91d6ddebe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/BlockMatrixField.lean @@ -0,0 +1,118 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.BlockMatrixFieldDefinitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockFormalism.EllipticBounds +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives + +/-! # Block Matrix Field -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +theorem book_blockMatrixField_eq_blockCoeffField {d : ℕ} + {U : Domain d} (a : CoeffOn U) (x : Vec d) : + Book.Ch02.blockMatrixField a x = blockCoeffField a.toCoeffField x := + rfl + +theorem book_blockMatrixInverseField_eq_blockReflect {d : ℕ} + {U : Domain d} (a : CoeffOn U) (x : Vec d) : + Book.Ch02.blockMatrixInverseField a x = + blockReflect (Book.Ch02.blockMatrixField a x) := by + simp [Book.Ch02.blockMatrixInverseField, Book.Ch02.blockMatrixField, blockReflect] + +theorem blockMatrixOfCoeff_factorization {d : ℕ} (A : Mat d) : + blockMatrixOfCoeff A = + Book.Ch02.blockMatMul + (Book.Ch02.blockMatTranspose (Book.Ch02.blockG (-skewPart A))) + (Book.Ch02.blockMatMul + (Book.Ch02.blockDiag (symmPart A) ((symmPart A)⁻¹)) + (Book.Ch02.blockG (-skewPart A))) := by + have hTskew : matTranspose (-skewPart A) = skewPart A := by + ext i j + simp [matTranspose, skewPart] + ring + have hTone : matTranspose (1 : Mat d) = 1 := by + ext i j + by_cases hij : i = j + · subst j + simp [matTranspose] + · have hji : j ≠ i := by + intro hji + exact hij hji.symm + simp [matTranspose, hij, hji] + have hTzero : matTranspose (0 : Mat d) = 0 := by + ext i j + simp [matTranspose] + apply blockMat_ext + · simp [blockMatrixOfCoeff, Book.Ch02.blockMatMul, Book.Ch02.blockMatTranspose, + Book.Ch02.blockDiag, Book.Ch02.blockG, hTskew, hTone, hTzero, Matrix.mul_assoc] + · simp [blockMatrixOfCoeff, Book.Ch02.blockMatMul, Book.Ch02.blockMatTranspose, + Book.Ch02.blockDiag, Book.Ch02.blockG, hTskew, hTone, hTzero, Matrix.mul_assoc] + · simp [blockMatrixOfCoeff, Book.Ch02.blockMatMul, Book.Ch02.blockMatTranspose, + Book.Ch02.blockDiag, Book.Ch02.blockG, hTskew, hTone, hTzero, Matrix.mul_assoc] + · simp [blockMatrixOfCoeff, Book.Ch02.blockMatMul, Book.Ch02.blockMatTranspose, + Book.Ch02.blockDiag, Book.Ch02.blockG, hTskew, hTone, hTzero, Matrix.mul_assoc] + +theorem blockMatrixField_factorization {d : ℕ} + {U : Domain d} (a : CoeffOn U) (x : Vec d) : + Book.Ch02.blockMatrixField a x = + Book.Ch02.blockMatMul + (Book.Ch02.blockMatTranspose + (Book.Ch02.blockG (-skewPart (a.toCoeffField x)))) + (Book.Ch02.blockMatMul + (Book.Ch02.blockDiag (symmPart (a.toCoeffField x)) + ((symmPart (a.toCoeffField x))⁻¹)) + (Book.Ch02.blockG (-skewPart (a.toCoeffField x)))) := by + simpa [book_blockMatrixField_eq_blockCoeffField] using! + blockMatrixOfCoeff_factorization (a.toCoeffField x) + +theorem blockMatrixFieldAlgebraTheory_of_coeffOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + BlockMatrixFieldAlgebraTheory U a where + field_symmetric := by + exact Filter.Eventually.of_forall fun x => by + simpa [book_blockMatrixField_eq_blockCoeffField] using! + isSymmetricBlockMat_blockMatrixOfCoeff (a.toCoeffField x) + field_posDef := by + filter_upwards [a.aeElliptic] with x hx + intro X hX + rcases X with ⟨p, q⟩ + simpa [Book.Ch02.BlockPosDef, book_blockMatrixField_eq_blockCoeffField] using! + blockMatrixOfCoeff_quadratic_pos_of_isEllipticMatrix + (A := a.toCoeffField x) hx hX + factorization := by + exact Filter.Eventually.of_forall fun x => + blockMatrixField_factorization a x + inverse_formula := by + exact Filter.Eventually.of_forall fun x => + book_blockMatrixInverseField_eq_blockReflect a x + energy_density := by + exact Filter.Eventually.of_forall fun _x X => rfl + +theorem blockMatrixFieldAlgebraTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + BlockMatrixFieldAlgebraTheory U a := + blockMatrixFieldAlgebraTheory_of_coeffOn U a + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/CoarseGrainingEstimates.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/CoarseGrainingEstimates.lean new file mode 100644 index 0000000000..b70d51cc85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/CoarseGrainingEstimates.lean @@ -0,0 +1,340 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.CoarseGrainingEstimatesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.CoarseFormulas + +/-! # Coarse Graining Estimates -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem variationEnergyValue_zero_dim (U : Domain 0) + (a : CoeffOn U) (w : Solution U a) : + variationEnergyValue U a w = 0 := by + change average U (variationEnergyIntegrand U a w) = 0 + rw [show variationEnergyIntegrand U a w = 0 by + funext x + simp [variationEnergyIntegrand, vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +private theorem responseCoarseGrainingEstimatesTheory_zero_dim + (U : Domain 0) (a : CoeffOn U) : + ResponseCoarseGrainingEstimatesTheory U a := by + refine + { linear_response := ?_ + coarse_graining := ?_ + average_gradient_energy := ?_ + average_flux_energy := ?_ } + · intro p q w + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + rw [show + average U + (fun x => + vecDot (0 : Vec 0) (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot (0 : Vec 0) (w.toH1.grad x)) = 0 by + change volumeAverage (U : Set (Vec 0)) _ = 0 + rw [show + (fun x => + vecDot (0 : Vec 0) (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot (0 : Vec 0) (w.toH1.grad x)) = (0 : Vec 0 → ℝ) by + funext x + simp [vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0))] + simpa using + mul_nonneg (Real.sqrt_nonneg (variationEnergyValue U a w)) + (Real.sqrt_nonneg ((2 : ℝ) * responseJ U a 0 0)) + · intro p w + have hp : p = 0 := Subsingleton.elim p 0 + subst p + simp [vecDot, matVecMul] + · intro w + rw [variationEnergyValue_zero_dim U a w] + simp [vecDot, matVecMul] + · intro w + rw [variationEnergyValue_zero_dim U a w] + simp [vecDot, matVecMul] + +/-- The linear-response estimate follows from a response maximizer and integrability, +independently of the canonical coarse-matrix constructions. -/ +private theorem linear_response_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) (w : Solution U a) : + |average U + (fun x => + vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot q (w.toH1.grad x))| ≤ + Real.sqrt (variationEnergyValue U a w) * + Real.sqrt ((2 : ℝ) * responseJ U a p q) := by + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rcases (responseExistenceTheory U a).exists_maximizer p q with + ⟨u, _hmean, hmax⟩ + have hOld := + basic_cg_identities_linear_response_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField hEll p q hInt u hmax w + have hAvg : + average U + (fun x => + vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot q (w.toH1.grad x)) = + volumeAverage (U : Set (Vec d)) + (fun x => vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x))) - + volumeAverage (U : Set (Vec d)) + (fun x => vecDot q (w.toH1.grad x)) := by + change + volumeAverage (U : Set (Vec d)) + (fun x => + vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x)) - + vecDot q (w.toH1.grad x)) = + volumeAverage (U : Set (Vec d)) + (fun x => vecDot p (matVecMul (a.toCoeffField x) (w.toH1.grad x))) - + volumeAverage (U : Set (Vec d)) + (fun x => vecDot q (w.toH1.grad x)) + exact volumeAverage_sub (hInt.flux p w) (hInt.grad q w) + rw [hAvg, abs_sub_comm] + simpa [variationEnergyValue, book_responseJ_eq_ResponseJ U a p q] using! hOld + +private theorem responseCoarseGrainingEstimatesTheory_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseCoarseGrainingEstimatesTheory U a := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨_R, _sigma0, _compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hEllAdj : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEllAdj hvol with + ⟨_RAdj, _sigmaAdj, _compatAdj, hAAdj, _hSInvAdj, hSAdj0, hKAdj0, + hSigmaAdj0, _hSigmaCanonicalAdj⟩ + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := by + exact + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) _R U.isDomain hEll hvol + _compat hS + have hStarAdjEq : + Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaStarCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hKappaAdjEq : + Homogenization.kappaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + -(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + kappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hSigmaAdjEq : + Homogenization.sigmaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hdetAdj : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField)).det := by + simpa [hStarAdjEq] using hdet + have hSigmaCanon : + IsSigmaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using hSigma + have hSAdj : + IsSigmaStarCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [hStarAdjEq] using hSAdj0 + have hKAdj : + IsKappaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (-(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) := by + simpa [hStarAdjEq, hKappaAdjEq] using hKAdj0 + have hSigmaAdjCanon0 : + IsSigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) + (Homogenization.kappaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) := by + simpa [sigmaCoarse_eq_of_isSigmaCoarse hSAdj0 hKAdj0 hSigmaAdj0 hdetAdj] + using hSigmaAdj0 + have hSigmaAdj : + IsSigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (-(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) := by + simpa [hSigmaAdjEq, hStarAdjEq, hKappaAdjEq] using hSigmaAdjCanon0 + have hb : + Book.Ch02.bCoarse U a = + Homogenization.bCoarse + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse U a hS + refine + { linear_response := ?_ + coarse_graining := ?_ + average_gradient_energy := ?_ + average_flux_energy := ?_ } + · exact linear_response_of_isEllipticFieldOn U a hEll + · intro p w + let q0 : Vec d := + matVecMul (Book.Ch02.sigmaStarCoarse U a - Book.Ch02.kappaCoarse U a) p + rcases (responseExistenceTheory U a).exists_maximizer p q0 with + ⟨u, _hmean, hmax⟩ + have hmaxOld : + Book.Ch02.IsResponseMaximizer U a p + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) u := by + simpa [q0, book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_kappaCoarse_eq_kappaCoarse U a] using hmax + have hOld := + basic_cg_identities_coarse_graining_average_difference_canonical_of_isSigmaCoarse + (U : Set (Vec d)) a.toCoeffField hEll hS hK hSigmaCanon hSAdj hKAdj + hSigmaAdj hdet p hInt u hmaxOld w + have hDefNonneg : + 0 ≤ vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) := by + have hle := + sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hSAdj hKAdj hSigmaAdj hdet p + have hsplit : + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) = + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) p) - + vecDot p + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) := by + simp [sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, + vecDot_neg_right] + nlinarith + have hRhs : + Real.sqrt + (volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField w)) * + Real.sqrt + (2 * + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p)) = + Real.sqrt (2 : ℝ) * + Real.sqrt + (vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p)) * + Real.sqrt + (volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField w)) := by + rw [Real.sqrt_mul (show 0 ≤ (2 : ℝ) by norm_num)] + ring + rw [hRhs] at hOld + simpa [variationEnergyValue, averageGradient, averageFlux, aStarCoarse, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_kappaCoarse_eq_kappaCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a] using! hOld + · intro w + let q0 : Vec d := + matVecMul (Book.Ch02.sigmaStarCoarse U a) (averageGradient U a w) + rcases (responseExistenceTheory U a).exists_maximizer 0 q0 with + ⟨u, _hmean, hmax⟩ + have hmaxOld : + Book.Ch02.IsResponseMaximizer U a 0 + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (fun i => volumeAverage (U : Set (Vec d)) (fun x => w.toH1.grad x i))) u := by + simpa [q0, averageGradient, averageVec, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] using! hmax + have hOld := + basic_cg_identities_energy_average_gradient_canonical_of_isSigmaStarCoarse + (U : Set (Vec d)) a.toCoeffField hEll hS hdet hInt w u hmaxOld + simpa [variationEnergyValue, averageGradient, averageVec, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] using! hOld + · intro w + let p0 : Vec d := -matVecMul (Book.Ch02.bCoarse U a)⁻¹ (averageFlux U a w) + rcases (responseExistenceTheory U a).exists_maximizer p0 0 with + ⟨u, _hmean, hmax⟩ + have hmaxOld : + Book.Ch02.IsResponseMaximizer U a + (-matVecMul + (Homogenization.bCoarse + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField))⁻¹ + (fun i => + volumeAverage (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (w.toH1.grad x) i))) 0 u := by + simpa [p0, averageFlux, averageVec, hb] using! hmax + have hOld := + basic_cg_identities_energy_average_flux_canonical_of_isSigmaCoarse + (U : Set (Vec d)) a.toCoeffField hEll hS hK hSigmaCanon hdet hInt w u + hmaxOld + simpa [variationEnergyValue, averageFlux, averageVec, hb] using! hOld + +private theorem responseCoarseGrainingEstimatesTheory_of_neZero + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) : + ResponseCoarseGrainingEstimatesTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : ResponseCoarseGrainingEstimatesTheory U b := + responseCoarseGrainingEstimatesTheory_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseCoarseGrainingEstimatesTheory.ofAEEq hba hb + +theorem responseCoarseGrainingEstimatesTheory + {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseCoarseGrainingEstimatesTheory U a := by + by_cases hd : d = 0 + · subst d + exact responseCoarseGrainingEstimatesTheory_zero_dim U a + · let : NeZero d := ⟨hd⟩ + exact responseCoarseGrainingEstimatesTheory_of_neZero U a + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledMu.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledMu.lean new file mode 100644 index 0000000000..028b44b361 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledMu.lean @@ -0,0 +1,809 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledMuDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecovery.RecoveryPackages +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ScalarMaximizers +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives + +/-! # Doubled Mu -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem potentialZeroTraceFieldOn_of_isPotentialZeroTraceOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) : + Book.Ch01.PotentialZeroTraceFieldOn U f := by + rcases hf with ⟨φ, rfl⟩ + exact Book.Ch01.potentialZeroTraceFieldOn_of_h10 φ + +private theorem isBlockMuAdmissible_of_isDoubledMuAdmissible {d : ℕ} + {U : Domain d} {P : BlockVec d} {X : DoubledField d} + (hX : IsDoubledMuAdmissible U P X) : + IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled X) := by + refine ⟨hX.1.1, ?_, hX.2.1, hX.2.2⟩ + exact isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn hX.1 + +private theorem isDoubledMuAdmissible_of_isBlockMuAdmissible {d : ℕ} + {U : Domain d} {P : BlockVec d} {X : BlockState d} + (hX : IsBlockMuAdmissible (U : Set (Vec d)) P X) : + IsDoubledMuAdmissible U P (doubledFieldOfBlockState X) := by + refine ⟨?_, ?_⟩ + · exact potentialZeroTraceFieldOn_of_isPotentialZeroTraceOn hX.isPotentialZeroTrace + · exact ⟨hX.fluxCorrection_memL2, hX.isSolenoidalZeroNormalTrace⟩ + +private theorem book_doubledMuValue_eq_blockEnergyAverage {d : ℕ} + (U : Domain d) (a : CoeffOn U) (X : DoubledField d) : + doubledMuValue U a X = + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField (blockStateOfDoubled X) := by + rfl + +private theorem book_doubledMuValue_ofBlockState_eq_blockEnergyAverage {d : ℕ} + (U : Domain d) (a : CoeffOn U) (X : BlockState d) : + doubledMuValue U a (doubledFieldOfBlockState X) = + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField X := by + rfl + +private theorem book_doubledBlockPairingIntegrand_eq_blockPairingIntegrand {d : ℕ} + (U : Domain d) (a : CoeffOn U) (Y X : DoubledField d) : + doubledBlockPairingIntegrand U a Y X = + blockPairingIntegrand a.toCoeffField (blockStateOfDoubled Y) (blockStateOfDoubled X) := by + rfl + +private theorem book_doubledMuValueSet_eq_muValueSet {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P : BlockVec d) : + doubledMuValueSet U a P = + muValueSet (U : Set (Vec d)) P a.toCoeffField := by + ext m + constructor + · rintro ⟨X, hX, rfl⟩ + exact ⟨blockStateOfDoubled X, isBlockMuAdmissible_of_isDoubledMuAdmissible hX, rfl⟩ + · rintro ⟨X, hX, rfl⟩ + exact ⟨doubledFieldOfBlockState X, isDoubledMuAdmissible_of_isBlockMuAdmissible hX, rfl⟩ + +theorem book_doubledMu_eq_Mu {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P : BlockVec d) : + doubledMu U a P = Mu (U : Set (Vec d)) P a.toCoeffField := by + unfold doubledMu Mu + rw [book_doubledMuValueSet_eq_muValueSet U a P] + +private theorem muValueSet_bddBelow_of_isEllipticFieldOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) (P : BlockVec d) : + BddBelow (muValueSet U P a) := by + refine ⟨vecDot P.1 P.2, ?_⟩ + intro m hm + rcases hm with ⟨X, hX, rfl⟩ + exact + hX.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) + (hX.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll) + hEll + (by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hX.isPotentialZeroTrace)) + (by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU + hX.isSolenoidalZeroNormalTrace)) + hvol + +/-- Internal bridge identifying the public coarse block matrix with the old +coarse-block matrix once the old deterministic coarse data have been produced. -/ +theorem book_coarseBlockMatrix_eq_old_coarseBlockMatrix_of_data {d : ℕ} + (U : Domain d) (a : CoeffOn U) + {sigma sigmaStar kappa : Mat d} + (hA : + IsCoarseBlockMatrix (U : Set (Vec d)) a.toCoeffField + (deterministicCoarseBlockMatrix (U : Set (Vec d)) a.toCoeffField)) + (hS : IsSigmaStarCoarse (U : Set (Vec d)) a.toCoeffField sigmaStar) + (hK : IsKappaCoarse (U : Set (Vec d)) a.toCoeffField sigmaStar kappa) + (hSigma : IsSigmaCoarse (U : Set (Vec d)) a.toCoeffField sigma sigmaStar kappa) + (hdet : IsUnit sigmaStar.det) : + Book.Ch02.coarseBlockMatrix U a = + Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := by + have hSigmaStarEq : + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField = sigmaStar := + eq_sigmaStarCoarse_of_isSigmaStarCoarse hS hdet + have hKappaEq : + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField = kappa := + eq_kappaCoarse_of_isKappaCoarse hS hK hdet + have hSigmaEq : + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField = sigma := + sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet + have hSCanon : + IsSigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [hSigmaStarEq] using hS + have hKCanon : + IsKappaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [hSigmaStarEq, hKappaEq] using hK + have hSigmaCanon : + IsSigmaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [hSigmaEq, hSigmaStarEq, hKappaEq] using hSigma + have hdetCanon : + IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := by + simpa [hSigmaStarEq] using hdet + have hBook : + Book.Ch02.coarseBlockMatrix U a = + blockMatrixOfDeterministicData + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · simpa [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + blockMatrixOfDeterministicData] using + book_coarseMatrices_b_eq_bCoarse_of_isSigmaStarCoarse U a hSCanon + · simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + blockMatrixOfDeterministicData, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + book_kappaCoarse_eq_kappaCoarse U a, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCanon] + · simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + blockMatrixOfDeterministicData, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + book_kappaCoarse_eq_kappaCoarse U a, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCanon] + · simp [Book.Ch02.coarseBlockMatrix, Book.Ch02.blockMatrixOfCoarseMatrices, + blockMatrixOfDeterministicData, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hSCanon] + calc + Book.Ch02.coarseBlockMatrix U a = + blockMatrixOfDeterministicData + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := hBook + _ = deterministicCoarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := by + exact + (deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hSCanon hKCanon hSigmaCanon hdetCanon).symm + _ = Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := + eq_coarseBlockMatrix_of_isCoarseBlockMatrix hA + +private theorem isDoubledMuMinimizer_recoveredField {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal) + (R : PotentialSolenoidalL2RecoveryData (U : Set (Vec d))) + (system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData + (a := a.toCoeffField) R system) + (P : BlockVec d) : + IsDoubledMuMinimizer U a P + (doubledFieldOfBlockState + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P)) := by + let Rc := R.toMuCorrectionSpaceRecoveryData + let Xrec : BlockState d := Rc.recoveredField system P + have hAdmOld : IsBlockMuAdmissible (U : Set (Vec d)) P Xrec := by + simpa [Rc, Xrec] using Rc.recoveredField_admissible system P + refine ⟨isDoubledMuAdmissible_of_isBlockMuAdmissible hAdmOld, ?_⟩ + intro Y hY + have hYOld : + IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled Y) := + isBlockMuAdmissible_of_isDoubledMuAdmissible hY + have hBdd : + BddBelow (muValueSet (U : Set (Vec d)) P a.toCoeffField) := + muValueSet_bddBelow_of_isEllipticFieldOn_of_isSobolevRegularDomain + U.isDomain.isSobolevRegularDomain hEll hvol.ne' P + have hMuLeY : + Mu (U : Set (Vec d)) P a.toCoeffField ≤ + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField (blockStateOfDoubled Y) := + csInf_le hBdd (muValueSet_mem hYOld) + have hRecEnergy : + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xrec = + Mu (U : Set (Vec d)) P a.toCoeffField := by + simpa [Rc, Xrec] using + Rc.recoveredField_blockEnergyAverage_eq_mu system compat.mu_eq_muCandidate P + calc + doubledMuValue U a (doubledFieldOfBlockState Xrec) = + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xrec := + book_doubledMuValue_ofBlockState_eq_blockEnergyAverage U a Xrec + _ = Mu (U : Set (Vec d)) P a.toCoeffField := hRecEnergy + _ ≤ blockEnergyAverage (U : Set (Vec d)) a.toCoeffField (blockStateOfDoubled Y) := + hMuLeY + _ = doubledMuValue U a Y := + (book_doubledMuValue_eq_blockEnergyAverage U a Y).symm + +private theorem hilbert_eq_minimizerMap_of_isDoubledMuMinimizer {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (R : PotentialSolenoidalL2RecoveryData (U : Set (Vec d))) + (system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData + (a := a.toCoeffField) R system) + (P : BlockVec d) {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a P X) : + toHilbertBlockL2OfBlockField + (isBlockMuAdmissible_of_isDoubledMuAdmissible hX.1).memBlockL2_eval = + (R.toMuHilbertRealization system).minimizerMap P := by + let Xold : BlockState d := blockStateOfDoubled X + let hXOld : IsBlockMuAdmissible (U : Set (Vec d)) P Xold := + isBlockMuAdmissible_of_isDoubledMuAdmissible hX.1 + let HX : HilbertBlockL2 (U : Set (Vec d)) := + toHilbertBlockL2OfBlockField hXOld.memBlockL2_eval + let H : MuHilbertRealization (U : Set (Vec d)) a.toCoeffField := + R.toMuHilbertRealization system + have hcorr : + HX - H.constantField P ∈ H.correctionSpace.correctionSpace := by + let Y : CorrectionFieldData (U : Set (Vec d)) := + hXOld.toCorrectionFieldDataOfAdmissible + have hYmem : + Y.toHilbertBlockL2 ∈ + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.correctionSpace := by + exact + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.mem_correctionSpace + Y.potential_memL2 Y.flux_memL2 + Y.isPotentialZeroTrace Y.isSolenoidalZeroNormalTrace + have hsplit : + HX = + blockVecToHilbertBlockL2Const (U := (U : Set (Vec d))) P + + Y.toHilbertBlockL2 := by + simpa [HX, Y] using + hXOld.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + rw [hsplit] + change + blockVecToHilbertBlockL2Const (U := (U : Set (Vec d))) P + + Y.toHilbertBlockL2 - + blockVecToHilbertBlockL2Const (U := (U : Set (Vec d))) P ∈ + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.correctionSpace + convert hYmem using 1 + abel + let Rc := R.toMuCorrectionSpaceRecoveryData + let Xrec : BlockState d := Rc.recoveredField system P + have hRecAdmOld : IsBlockMuAdmissible (U : Set (Vec d)) P Xrec := by + simpa [Rc, Xrec] using Rc.recoveredField_admissible system P + have hMinLeRec : + doubledMuValue U a X ≤ + doubledMuValue U a (doubledFieldOfBlockState Xrec) := + hX.2 (doubledFieldOfBlockState Xrec) + (isDoubledMuAdmissible_of_isBlockMuAdmissible hRecAdmOld) + have hRecEnergy : + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xrec = + Mu (U : Set (Vec d)) P a.toCoeffField := by + simpa [Rc, Xrec] using + Rc.recoveredField_blockEnergyAverage_eq_mu system compat.mu_eq_muCandidate P + have hBlockLeCandidate : + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xold ≤ + H.muCandidate P := by + calc + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xold = + doubledMuValue U a X := + (book_doubledMuValue_eq_blockEnergyAverage U a X).symm + _ ≤ doubledMuValue U a (doubledFieldOfBlockState Xrec) := hMinLeRec + _ = blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xrec := + book_doubledMuValue_ofBlockState_eq_blockEnergyAverage U a Xrec + _ = Mu (U : Set (Vec d)) P a.toCoeffField := hRecEnergy + _ = H.muCandidate P := by + simpa [H] using compat.mu_eq_muCandidate P + have hQuadEq : + quadraticEnergy H.energyBilin HX = + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xold := by + change + quadraticEnergy (energyBilinOfOperator system.toMuOperatorRealization.operator) HX = + blockEnergyAverage (U : Set (Vec d)) a.toCoeffField Xold + simpa [HX, Xold] using + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := Xold) (hX := hXOld.memBlockL2_eval) + have hQuadLe : quadraticEnergy H.energyBilin HX ≤ H.muCandidate P := by + simpa [hQuadEq] using hBlockLeCandidate + have hEq : HX = H.minimizerMap P := + H.eq_minimizerMap_of_quadraticEnergy_le_muCandidate P HX hcorr hQuadLe + simpa [HX, H, hXOld, Xold] using hEq + +private theorem sameAE_of_hilbertBlockL2_eq {d : ℕ} + {U : Domain d} {P : BlockVec d} {X Y : DoubledField d} + (hX : IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled X)) + (hY : IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled Y)) + (hEq : + toHilbertBlockL2OfBlockField hX.memBlockL2_eval = + toHilbertBlockL2OfBlockField hY.memBlockL2_eval) : + DoubledField.SameAE (U := U) X Y := by + have hBlockL2 : + toBlockL2 hX.memBlockL2_eval = toBlockL2 hY.memBlockL2_eval := by + calc + toBlockL2 hX.memBlockL2_eval = + hilbertBlockL2ToBlockL2 + (toHilbertBlockL2OfBlockField hX.memBlockL2_eval) := by + symm + exact hilbertBlockL2ToBlockL2_toHilbertBlockL2OfBlockField hX.memBlockL2_eval + _ = + hilbertBlockL2ToBlockL2 + (toHilbertBlockL2OfBlockField hY.memBlockL2_eval) := by + rw [hEq] + _ = toBlockL2 hY.memBlockL2_eval := + hilbertBlockL2ToBlockL2_toHilbertBlockL2OfBlockField hY.memBlockL2_eval + have hAE : + (blockStateOfDoubled X).eval + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + (blockStateOfDoubled Y).eval := + (toBlockL2_eq_toBlockL2_iff hX.memBlockL2_eval hY.memBlockL2_eval).mp + hBlockL2 + constructor + · filter_upwards [hAE] with x hx + exact congrArg Prod.fst hx + · filter_upwards [hAE] with x hx + exact congrArg Prod.snd hx + +private theorem sameAE_of_isDoubledMuMinimizers {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (R : PotentialSolenoidalL2RecoveryData (U : Set (Vec d))) + (system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField) + (compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData + (a := a.toCoeffField) R system) + (P : BlockVec d) {X Y : DoubledField d} + (hX : IsDoubledMuMinimizer U a P X) + (hY : IsDoubledMuMinimizer U a P Y) : + DoubledField.SameAE (U := U) X Y := by + let hXOld : IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled X) := + isBlockMuAdmissible_of_isDoubledMuAdmissible hX.1 + let hYOld : IsBlockMuAdmissible (U : Set (Vec d)) P (blockStateOfDoubled Y) := + isBlockMuAdmissible_of_isDoubledMuAdmissible hY.1 + have hXEq := + hilbert_eq_minimizerMap_of_isDoubledMuMinimizer U a R system compat P hX + have hYEq := + hilbert_eq_minimizerMap_of_isDoubledMuMinimizer U a R system compat P hY + exact sameAE_of_hilbertBlockL2_eq hXOld hYOld (hXEq.trans hYEq.symm) + +private theorem doubledBlockPairingIntegrand_ae_eq_of_sameAE_right {d : ℕ} + {U : Domain d} (a : CoeffOn U) (Y X Z : DoubledField d) + (hXZ : DoubledField.SameAE (U := U) X Z) : + doubledBlockPairingIntegrand U a Y X + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + doubledBlockPairingIntegrand U a Y Z := by + filter_upwards [hXZ.1, hXZ.2] with x hpot hflux + simp [doubledBlockPairingIntegrand, DoubledField.eval, hpot, hflux] + +private theorem firstVariation_recoveredField {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (R : PotentialSolenoidalL2RecoveryData (U : Set (Vec d))) + (system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField) + (P : BlockVec d) (Y : DoubledField d) + (hY : IsDoubledTestField U Y) + (hvol : (MeasureTheory.volume (U : Set (Vec d))).toReal ≠ 0) : + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y + (doubledFieldOfBlockState + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P)) x + ∂MeasureTheory.volume = 0 := by + let Rc := R.toMuCorrectionSpaceRecoveryData + have hpot : IsPotentialZeroTraceOn (U : Set (Vec d)) Y.potential := + isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn hY.1 + have hOld := + Rc.integral_blockPairingIntegrand_correction_eq_zero + system P hY.1.1 hY.2.1 hpot hY.2.2 hvol + simpa [Rc, doubledFieldOfBlockState, blockStateOfDoubled, + book_doubledBlockPairingIntegrand_eq_blockPairingIntegrand U a Y + (doubledFieldOfBlockState (Rc.recoveredField system P))] using! hOld + +private theorem doubledMuTheory_zero_dim (U : Domain 0) (a : CoeffOn U) : + DoubledMuTheory U a := by + have hAdm : ∀ P : BlockVec 0, ∀ X : DoubledField 0, + IsDoubledMuAdmissible U P X := by + intro P X + have hpotZero : + (fun x => X.potential x - P.1) = (0 : Vec 0 → Vec 0) := by + funext x + exact Subsingleton.elim _ _ + have hfluxZero : + (fun x => X.flux x - P.2) = (0 : Vec 0 → Vec 0) := by + funext x + exact Subsingleton.elim _ _ + refine ⟨?_, ?_⟩ + · rw [hpotZero] + exact Book.Ch01.potentialZeroTraceFieldOn_of_h10 + (0 : H10Function (U : Set (Vec 0))) + · rw [hfluxZero] + refine ⟨MeasureTheory.MemLp.zero, ?_⟩ + intro φ + simp [vecDot] + have hValueZero : ∀ X : DoubledField 0, doubledMuValue U a X = 0 := by + intro X + unfold doubledMuValue average blockEnergyDensityAt + have hfun : + (fun x : Vec 0 => + (1 / 2 : ℝ) * + blockVecDot (X.eval x) (blockMatVecMul (blockMatrixField a x) (X.eval x))) = + 0 := by + funext x + simp [blockVecDot, vecDot] + rw [hfun] + simp + have hMuZero : ∀ P : BlockVec 0, doubledMu U a P = 0 := by + intro P + have hset : doubledMuValueSet U a P = {0} := by + ext m + constructor + · rintro ⟨X, _hX, rfl⟩ + simp [hValueZero X] + · intro hm + rw [Set.mem_singleton_iff] at hm + subst m + exact ⟨0, hAdm P 0, by simp [hValueZero 0]⟩ + unfold doubledMu + rw [hset] + simp + refine + { minimizer_exists := ?_ + minimizer_unique_ae := ?_ + mu_quadratic := ?_ + minimizer_first_variation := ?_ } + · intro P + refine ⟨0, ?_⟩ + refine ⟨hAdm P 0, ?_⟩ + intro Y hY + simp [hValueZero] + · intro P X Y hX hY + constructor + · exact Filter.Eventually.of_forall fun x => Subsingleton.elim _ _ + · exact Filter.Eventually.of_forall fun x => Subsingleton.elim _ _ + · intro P + have hP : P = 0 := Subsingleton.elim P 0 + subst P + simp [hMuZero, blockVecDot, vecDot] + · intro P X hX Y hY + have hfun : + doubledBlockPairingIntegrand U a Y X = 0 := by + funext x + simp [doubledBlockPairingIntegrand, DoubledField.eval, blockVecDot, vecDot, + matVecMul] + rw [hfun] + simp + +private theorem doubledMuTheory_of_isEllipticFieldOn {d : ℕ} [NeZero d] + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + DoubledMuTheory U a := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, _sigma0, compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + let system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := by + exact + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) R U.isDomain hEll hvol + compat (sigmaStar := Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) hS + have hBlockEq : + Book.Ch02.coarseBlockMatrix U a = + Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField := + book_coarseBlockMatrix_eq_old_coarseBlockMatrix_of_data U a hA hS hK hSigma hdet + refine + { minimizer_exists := ?_ + minimizer_unique_ae := ?_ + mu_quadratic := ?_ + minimizer_first_variation := ?_ } + · intro P + exact + ⟨doubledFieldOfBlockState + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P), + isDoubledMuMinimizer_recoveredField U a hEll hvol R system compat P⟩ + · intro P X Y hX hY + exact sameAE_of_isDoubledMuMinimizers U a R system compat P hX hY + · intro P + have hMuOld := + R.mu_eq_half_blockVecDot_coarseBlockMatrixOfIsEllipticFieldOn + (a := a.toCoeffField) hEll hvol compat P + calc + doubledMu U a P = Mu (U : Set (Vec d)) P a.toCoeffField := + book_doubledMu_eq_Mu U a P + _ = + (1 / 2 : ℝ) * + blockVecDot P + (blockMatVecMul + (Homogenization.coarseBlockMatrix (U : Set (Vec d)) a.toCoeffField) P) := + hMuOld + _ = + (1 / 2 : ℝ) * + blockVecDot P (blockMatVecMul (Book.Ch02.coarseBlockMatrix U a) P) := by + rw [hBlockEq] + · intro P X hX Y hY + let Xrec : DoubledField d := + doubledFieldOfBlockState + ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + have hRecMin : IsDoubledMuMinimizer U a P Xrec := + isDoubledMuMinimizer_recoveredField U a hEll hvol R system compat P + have hSame : DoubledField.SameAE (U := U) X Xrec := + sameAE_of_isDoubledMuMinimizers U a R system compat P hX hRecMin + have hFirstRec := + firstVariation_recoveredField U a R system P Y hY hvol.ne' + calc + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y Xrec x ∂MeasureTheory.volume := by + exact MeasureTheory.integral_congr_ae + (doubledBlockPairingIntegrand_ae_eq_of_sameAE_right a Y X Xrec hSame) + _ = 0 := by + simpa [Xrec] using hFirstRec + +private theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, _sigma0, compat, _hA, _hSInv, _hS, _hK, _hSigma, _hSigmaCanonical⟩ + let system : MuOperatorSystemData (U : Set (Vec d)) a.toCoeffField := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + let Rc : MuCorrectionSpaceRecoveryData (U : Set (Vec d)) := + R.toMuCorrectionSpaceRecoveryData + let XrecState : BlockState d := Rc.recoveredField system (-p, q) + let Xrec : DoubledField d := doubledFieldOfBlockState XrecState + have hRecMin : IsDoubledMuMinimizer U a (-p, q) Xrec := + isDoubledMuMinimizer_recoveredField U a hEll hvol R system compat (-p, q) + have hSame : DoubledField.SameAE (U := U) X Xrec := + sameAE_of_isDoubledMuMinimizers U a R system compat (-p, q) hX hRecMin + rcases + Rc.exists_blockResponsePairHalfState_ae_eq_recoveredField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + system U.isDomain hEll hvol.ne' (-p, q) with + ⟨u, v, hPairRec⟩ + have hAdm : IsBlockMuAdmissible (U : Set (Vec d)) (-p, q) XrecState := by + simpa [XrecState, Rc] using Rc.recoveredField_admissible system (-p, q) + have hfirst : + ∀ w : AHarmonicFunction a.toCoeffField (U : Set (Vec d)), + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField p q u w) = 0 := by + intro w + simpa [XrecState, Rc] using + scalarFirstVariation_neg_left_right_of_ae_eq_blockResponsePairHalfState_of_isBlockMuAdmissible + (a := a.toCoeffField) (U := (U : Set (Vec d))) (hU := U.measurableSet) + hEll (-p) q u v XrecState hPairRec hAdm w + have hOldMax : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) p q a.toCoeffField u := + isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + (U := (U : Set (Vec d))) (a := a.toCoeffField) hEll p q u hfirst + have hMax : Book.Ch02.IsResponseMaximizer U a p q u := + public_isResponseMaximizer_of_old U a p q u hOldMax + have hCanonical : + (fun x => u.toH1.grad x) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := + (canonicalMaximizer_sameGradientAE_of_isResponseMaximizer hMax).symm + have hLowerPair : + (fun x => + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockResponsePairHalfState a.toCoeffField u v).eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x) := + blockResponse_lowerImage_pair_half_ae_eq_gradDiff_of_isEllipticFieldOn + (a := a.toCoeffField) hEll u v + have hPairExtract : + (fun x => + (blockResponsePairHalfState a.toCoeffField u v).potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockResponsePairHalfState a.toCoeffField u v).eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => u.toH1.grad x := by + filter_upwards [hLowerPair] with x hLower + rw [hLower] + change ((1 / 2 : ℝ) • (u.toH1.grad x + v.toH1.grad x) + + (1 / 2 : ℝ) • (u.toH1.grad x - v.toH1.grad x)) = u.toH1.grad x + ext i + simp [sub_eq_add_neg] + ring_nf + have hXExtract_eq_pair : + (fun x => + X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (blockResponsePairHalfState a.toCoeffField u v).potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockResponsePairHalfState a.toCoeffField u v).eval x)).2 := by + filter_upwards [hSame.1, hSame.2, hPairRec] with x hPot hFlux hPair + have hPairPot : + (blockResponsePairHalfState a.toCoeffField u v).potential x = + XrecState.potential x := congrArg Prod.fst hPair + have hPairFlux : + (blockResponsePairHalfState a.toCoeffField u v).flux x = + XrecState.flux x := congrArg Prod.snd hPair + have hPotPair : + X.potential x = (blockResponsePairHalfState a.toCoeffField u v).potential x := by + simpa [Xrec, XrecState, doubledFieldOfBlockState] using hPot.trans hPairPot.symm + have hFluxPair : + X.flux x = (blockResponsePairHalfState a.toCoeffField u v).flux x := by + simpa [Xrec, XrecState, doubledFieldOfBlockState] using hFlux.trans hPairFlux.symm + have hEval : + X.eval x = (blockResponsePairHalfState a.toCoeffField u v).eval x := by + exact Prod.ext hPotPair hFluxPair + rw [hPotPair, hEval] + exact hXExtract_eq_pair.trans (hPairExtract.trans hCanonical) + +private theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.flux x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + matVecMul (a.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x) := by + have hGrad := + doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient_of_isEllipticFieldOn + U a hEll p q hX + filter_upwards [MeasureTheory.ae_restrict_mem U.measurableSet, hGrad] with x hx hgrad + have hAlg := + upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (a := a.toCoeffField) hEll (X := blockStateOfDoubled X) hx + calc + X.flux x + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1 = + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1 + X.flux x := by + abel + _ = + matVecMul (a.toCoeffField x) + (X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) := by + simpa [blockStateOfDoubled] using! hAlg + _ = + matVecMul (a.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x) := by + rw [hgrad] + +theorem doubledMuTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + DoubledMuTheory U a := by + by_cases hd : d = 0 + · subst d + exact doubledMuTheory_zero_dim U a + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : DoubledMuTheory U b := + doubledMuTheory_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact DoubledMuTheory.ofAEEq hba hb + +theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient + {d : ℕ} (U : Domain d) (a : CoeffOn U) (p q : Vec d) + {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := by + by_cases hd : d = 0 + · subst d + exact Filter.Eventually.of_forall fun x => Subsingleton.elim _ _ + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + have hXb : IsDoubledMuMinimizer U b (-p, q) X := + hX.ofAEEq hba.symm + have hCoeff : b.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := + hba + have hLeft : + (fun x => + X.potential x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).2) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + X.potential x + + (blockMatVecMul (blockCoeffField b.toCoeffField x) (X.eval x)).2 := by + filter_upwards [hCoeff] with x hx + simp [blockCoeffField, hx] + have hExtractB := + doubledMuMinimizer_neg_left_extracts_canonicalMaximizerGradient_of_isEllipticFieldOn + U b (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) p q hXb + have hCanonical : + (fun x => + (canonicalMaximizer (responseExistenceTheory U b) p q).toSolution.toH1.grad x) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := by + simpa [Solution.SameGradientAE] using + (canonicalMaximizer_sameGradientAE_ofAEEq hba p q) + exact hLeft.trans (hExtractB.trans hCanonical) + +theorem doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux + {d : ℕ} (U : Domain d) (a : CoeffOn U) (p q : Vec d) + {X : DoubledField d} + (hX : IsDoubledMuMinimizer U a (-p, q) X) : + (fun x => + X.flux x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + matVecMul (a.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x) := by + by_cases hd : d = 0 + · subst d + exact Filter.Eventually.of_forall fun x => Subsingleton.elim _ _ + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + have hXb : IsDoubledMuMinimizer U b (-p, q) X := + hX.ofAEEq hba.symm + have hCoeff : b.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := + hba + have hLeft : + (fun x => + X.flux x + + (blockMatVecMul (blockCoeffField a.toCoeffField x) (X.eval x)).1) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + X.flux x + + (blockMatVecMul (blockCoeffField b.toCoeffField x) (X.eval x)).1 := by + filter_upwards [hCoeff] with x hx + simp [blockCoeffField, hx] + have hExtractB := + doubledMuMinimizer_neg_left_extracts_canonicalMaximizerFlux_of_isEllipticFieldOn + U b (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) p q hXb + have hCanonical : + (fun x => + matVecMul (b.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U b) p q).toSolution.toH1.grad x)) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + matVecMul (a.toCoeffField x) + ((canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x) := by + have hGrad : + (fun x => + (canonicalMaximizer (responseExistenceTheory U b) p q).toSolution.toH1.grad x) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => + (canonicalMaximizer (responseExistenceTheory U a) p q).toSolution.toH1.grad x := by + simpa [Solution.SameGradientAE] using + (canonicalMaximizer_sameGradientAE_ofAEEq hba p q) + filter_upwards [hCoeff, hGrad] with x hcoeff hgrad + rw [hcoeff, hgrad] + exact hLeft.trans (hExtractB.trans hCanonical) + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse.lean new file mode 100644 index 0000000000..247a0a5547 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Theory + +/-! # Doubled Response -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Common.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Common.lean new file mode 100644 index 0000000000..f8efd44ff1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Common.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.DoubledResponseDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.BlockResponse +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.BlockMatrixField +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives + +/-! # Common -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Common Doubled-Response Helpers + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +def blockStateOfDoubled {d : ℕ} (X : DoubledField d) : BlockState d := + { potential := X.potential + flux := X.flux } + +def doubledFieldOfBlockState {d : ℕ} (X : BlockState d) : DoubledField d := + { potential := X.potential + flux := X.flux } + +theorem doubledField_ext {d : ℕ} {X Y : DoubledField d} + (hpot : X.potential = Y.potential) (hflux : X.flux = Y.flux) : + X = Y := by + cases X + cases Y + cases hpot + cases hflux + rfl + +theorem doubledSameAE_symm {d : ℕ} {U : Domain d} {X Y : DoubledField d} + (hXY : DoubledField.SameAE (U := U) X Y) : + DoubledField.SameAE (U := U) Y X := + ⟨hXY.1.symm, hXY.2.symm⟩ + +theorem doubledSameAE_refl {d : ℕ} {U : Domain d} (X : DoubledField d) : + DoubledField.SameAE (U := U) X X := + ⟨Filter.EventuallyEq.rfl, Filter.EventuallyEq.rfl⟩ + +theorem doubledSameAE_trans {d : ℕ} {U : Domain d} {X Y Z : DoubledField d} + (hXY : DoubledField.SameAE (U := U) X Y) + (hYZ : DoubledField.SameAE (U := U) Y Z) : + DoubledField.SameAE (U := U) X Z := + ⟨hXY.1.trans hYZ.1, hXY.2.trans hYZ.2⟩ + +theorem doubledSameAE_add {d : ℕ} {U : Domain d} + {X1 X2 Y1 Y2 : DoubledField d} + (hX : DoubledField.SameAE (U := U) X1 X2) + (hY : DoubledField.SameAE (U := U) Y1 Y2) : + DoubledField.SameAE (U := U) (X1 + Y1) (X2 + Y2) := by + constructor + · filter_upwards [hX.1, hY.1] with x hx hy + change (X1.potential + Y1.potential) x = (X2.potential + Y2.potential) x + simp [hx, hy] + · filter_upwards [hX.2, hY.2] with x hx hy + change (X1.flux + Y1.flux) x = (X2.flux + Y2.flux) x + simp [hx, hy] + +theorem doubledSameAE_smul {d : ℕ} {U : Domain d} (c : ℝ) + {X Y : DoubledField d} (hXY : DoubledField.SameAE (U := U) X Y) : + DoubledField.SameAE (U := U) (c • X) (c • Y) := by + constructor + · filter_upwards [hXY.1] with x hx + change (c • X.potential) x = (c • Y.potential) x + simp [hx] + · filter_upwards [hXY.2] with x hx + change (c • X.flux) x = (c • Y.flux) x + simp [hx] + +theorem doubledFieldOfSolutions_sameAE_ofAEEq {d : ℕ} + {U : Domain d} {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (v : Solution U a) (vStar : Solution U a.transpose) : + DoubledField.SameAE (U := U) + (doubledFieldOfSolutions a v vStar) + (doubledFieldOfSolutions b (Solution.ofAEEq h v) + (Solution.ofAEEq h.transpose vStar)) := by + constructor + · exact Filter.EventuallyEq.rfl + · filter_upwards [h] with x hx + simp [doubledFieldOfSolutions, CoeffOn.transpose_apply, hx] + +theorem doubledFieldOfScalarMaximizers_sameAE_ofAEEq {d : ℕ} + {U : Domain d} {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (v : Solution U a) (vStar : Solution U a.transpose) : + DoubledField.SameAE (U := U) + (doubledFieldOfScalarMaximizers a v vStar) + (doubledFieldOfScalarMaximizers b (Solution.ofAEEq h v) + (Solution.ofAEEq h.transpose vStar)) := + doubledSameAE_smul (1 / 2 : ℝ) + (doubledFieldOfSolutions_sameAE_ofAEEq h v vStar) + +noncomputable def solutionSMul {d : ℕ} (U : Domain d) (a : CoeffOn U) + (c : ℝ) (u : Solution U a) : Solution U a := + { toH1 := c • u.toH1 + isHarmonic := by + simpa using! isAHarmonicGradient_smul u.isHarmonic c } + +noncomputable def doubledResponseFirstVariationLeft {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) + (T : DoubledField d) : Vec d → ℝ := + fun x => + blockVecDot Q (T.eval x) - + blockVecDot P (blockMatVecMul (blockMatrixField a x) (T.eval x)) + +noncomputable def doubledResponseFirstVariationRight {d : ℕ} + (U : Domain d) (a : CoeffOn U) (S T : DoubledField d) : Vec d → ℝ := + fun x => + blockVecDot (T.eval x) + (blockMatVecMul (blockMatrixField a x) (S.eval x)) + +theorem average_eq_of_average_sub_eq_zero {d : ℕ} + (U : Domain d) {f g : Vec d → ℝ} + (hf : MeasureTheory.IntegrableOn f (U : Set (Vec d))) + (hg : MeasureTheory.IntegrableOn g (U : Set (Vec d))) + (hzero : average U (fun x => f x - g x) = 0) : + average U f = average U g := by + change volumeAverage (U : Set (Vec d)) f = volumeAverage (U : Set (Vec d)) g + change volumeAverage (U : Set (Vec d)) (f - g) = 0 at hzero + have hsub : + volumeAverage (U : Set (Vec d)) (f - g) = + volumeAverage (U : Set (Vec d)) f - volumeAverage (U : Set (Vec d)) g := + volumeAverage_sub hf hg + rw [hsub] at hzero + linarith + +theorem doubledResponseFirstVariationLeft_average_eq_of_sameAE {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) + {T T' : DoubledField d} + (hTT' : DoubledField.SameAE (U := U) T T') : + average U (doubledResponseFirstVariationLeft U a P Q T) = + average U (doubledResponseFirstVariationLeft U a P Q T') := by + unfold average + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hTT'.1, hTT'.2] with x hpot hflux + simp [doubledResponseFirstVariationLeft, DoubledField.eval, hpot, hflux] + +theorem doubledResponseFirstVariationRight_average_eq_of_sameAE {d : ℕ} + (U : Domain d) (a : CoeffOn U) {S S' T T' : DoubledField d} + (hSS' : DoubledField.SameAE (U := U) S S') + (hTT' : DoubledField.SameAE (U := U) T T') : + average U (doubledResponseFirstVariationRight U a S T) = + average U (doubledResponseFirstVariationRight U a S' T') := by + unfold average + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hSS'.1, hSS'.2, hTT'.1, hTT'.2] with x hSpot hSflux hTpot hTflux + simp [doubledResponseFirstVariationRight, DoubledField.eval, hSpot, hSflux, hTpot, hTflux] + +theorem doubledResponseFirstVariationLeft_average_eq_ofAEEq {d : ℕ} + {U : Domain d} {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (P Q : BlockVec d) (T : DoubledField d) : + average U (doubledResponseFirstVariationLeft U a P Q T) = + average U (doubledResponseFirstVariationLeft U b P Q T) := by + unfold average + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [blockMatrixField_ae_eq_ofAEEq h] with x hx + simp [doubledResponseFirstVariationLeft, hx] + +theorem doubledResponseFirstVariationRight_average_eq_ofAEEq {d : ℕ} + {U : Domain d} {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (S T : DoubledField d) : + average U (doubledResponseFirstVariationRight U a S T) = + average U (doubledResponseFirstVariationRight U b S T) := by + unfold average + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [blockMatrixField_ae_eq_ofAEEq h] with x hx + simp [doubledResponseFirstVariationRight, hx] + +theorem doubledFieldOfSolutions_solutionSMul_half_eq_pairHalf {d : ℕ} + (U : Domain d) (a : CoeffOn U) (u : Solution U a) + (vStar : Solution U a.transpose) : + doubledFieldOfSolutions a (solutionSMul U a (1 / 2 : ℝ) u) + (solutionSMul U a.transpose (1 / 2 : ℝ) vStar) = + doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField u vStar) := by + apply doubledField_ext + · funext x + change + (1 / 2 : ℝ) • u.toH1.grad x + (1 / 2 : ℝ) • vStar.toH1.grad x = + ((1 / 2 : ℝ) • (fun x => u.toH1.grad x + vStar.toH1.grad x)) x + simp [Pi.smul_apply, smul_add] + · funext x + change + matVecMul (a.toCoeffField x) ((1 / 2 : ℝ) • u.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) ((1 / 2 : ℝ) • vStar.toH1.grad x) = + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (u.toH1.grad x) - + matVecMul (matTranspose (a.toCoeffField x)) (vStar.toH1.grad x))) x + simp [CoeffOn.transpose_apply, Pi.smul_apply, matVecMul_smul, sub_eq_add_neg, + smul_add, smul_neg] + +theorem blockStateOfDoubled_scalarMaximizers_eq_pairHalf {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (v : Solution U a) (vStar : Solution U a.transpose) : + blockStateOfDoubled (doubledFieldOfScalarMaximizers a v vStar) = + blockResponsePairHalfState a.toCoeffField v vStar := by + apply BlockState.ext + · funext x + change + ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x)) x = + ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x)) x + rfl + · funext x + change + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x))) x = + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (matTranspose (a.toCoeffField x)) (vStar.toH1.grad x))) x + simp [CoeffOn.transpose_apply] + +theorem blockStateOfDoubled_solutions_eq_pairHalf_two {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (w : Solution U a) (z : Solution U a.transpose) : + blockStateOfDoubled (doubledFieldOfSolutions a w z) = + blockResponsePairHalfState a.toCoeffField + (solutionSMul U a (2 : ℝ) w) + (solutionSMul U a.transpose (2 : ℝ) z) := by + apply BlockState.ext + · funext x + ext i + change + (w.toH1.grad x + z.toH1.grad x) i = + (((1 / 2 : ℝ) • + (fun x => + (solutionSMul U a (2 : ℝ) w).toH1.grad x + + (solutionSMul U a.transpose (2 : ℝ) z).toH1.grad x)) x) i + simp [solutionSMul, Pi.smul_apply] + ring + · funext x + ext i + change + (matVecMul (a.toCoeffField x) (w.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (z.toH1.grad x)) i = + (((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) + ((solutionSMul U a (2 : ℝ) w).toH1.grad x) - + matVecMul (matTranspose (a.toCoeffField x)) + ((solutionSMul U a.transpose (2 : ℝ) z).toH1.grad x))) x) i + simp [CoeffOn.transpose_apply, solutionSMul, Pi.smul_apply, matVecMul_smul, + sub_eq_add_neg] + ring + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/FirstVariation.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/FirstVariation.lean new file mode 100644 index 0000000000..71ed79b03c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/FirstVariation.lean @@ -0,0 +1,248 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.MaximizerAlgebra + +/-! # First Variation -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Doubled Response First Variation + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +theorem first_variation_scalar_representatives_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p pStar q qStar : Vec d) + (v : Solution U a) (vStar : Solution U a.transpose) + (hv : Book.Ch02.IsResponseMaximizer U a (p - pStar) (qStar - q) v) + (hvStar : + Book.Ch02.IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStar) + (w : Solution U a) (z : Solution U a.transpose) : + average U + (doubledResponseFirstVariationLeft U a (p, q) (qStar, pStar) + (doubledFieldOfSolutions a w z)) = + average U + (doubledResponseFirstVariationRight U a + (doubledFieldOfScalarMaximizers a v vStar) + (doubledFieldOfSolutions a w z)) := by + let S : DoubledField d := doubledFieldOfScalarMaximizers a v vStar + let T : DoubledField d := doubledFieldOfSolutions a w z + let w2 : Solution U a := solutionSMul U a (2 : ℝ) w + let z2 : Solution U a.transpose := solutionSMul U a.transpose (2 : ℝ) z + have hEllAdj : + IsEllipticFieldOn a.transpose.lam a.transpose.Lam (U : Set (Vec d)) + a.transpose.toCoeffField := by + simpa [Homogenization.adjointCoeffField] using! + isEllipticFieldOn_adjointCoeffField hEll + have hFirst := responseFirstVariationTheory_of_isEllipticFieldOn U a hEll + have hFirstAdj := responseFirstVariationTheory_of_isEllipticFieldOn U a.transpose hEllAdj + have hfirstPublic := + hFirst.first_variation (p - pStar) (qStar - q) v hv w2 + have hfirst : + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v w2) = 0 := by + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v w2) = 0 at hfirstPublic + exact hfirstPublic + have hfirstStarPublic := + hFirstAdj.first_variation (pStar + p) (qStar + q) vStar hvStar z2 + have hfirstStar : + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) + (pStar + p) (qStar + q) vStar z2) = 0 := by + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.transpose.toCoeffField + (pStar + p) (qStar + q) vStar z2) = 0 at hfirstStarPublic + simpa [Homogenization.adjointCoeffField] using! hfirstStarPublic + have hSplit := + volumeAverage_blockFirstVariationIntegrand_pair_half_eq_scalarFirstVariation_sum_of_isEllipticFieldOn + (a := a.toCoeffField) U.measurableSet hEll p pStar q qStar v w2 vStar z2 + have hBlockZero : + volumeAverage (U : Set (Vec d)) + (blockFirstVariationIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockResponsePairHalfState a.toCoeffField v vStar) + (blockResponsePairHalfState a.toCoeffField w2 z2)) = 0 := by + rw [hSplit, hfirst, hfirstStar] + ring + have hSstate : blockStateOfDoubled S = + blockResponsePairHalfState a.toCoeffField v vStar := by + simpa [S] using blockStateOfDoubled_scalarMaximizers_eq_pairHalf U a v vStar + have hTstate : blockStateOfDoubled T = + blockResponsePairHalfState a.toCoeffField w2 z2 := by + simpa [T, w2, z2] using blockStateOfDoubled_solutions_eq_pairHalf_two U a w z + have hBlockZeroStates : + volumeAverage (U : Set (Vec d)) + (blockFirstVariationIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockStateOfDoubled S) (blockStateOfDoubled T)) = 0 := by + simpa [hSstate, hTstate] using hBlockZero + let f : Vec d → ℝ := doubledResponseFirstVariationLeft U a (p, q) (qStar, pStar) T + let g : Vec d → ℝ := doubledResponseFirstVariationRight U a S T + have hfun : + blockFirstVariationIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockStateOfDoubled S) (blockStateOfDoubled T) = + f - g := by + funext x + simp [f, g, doubledResponseFirstVariationLeft, doubledResponseFirstVariationRight, + blockFirstVariationIntegrand, blockStateOfDoubled, DoubledField.eval, BlockState.eval, + book_blockMatrixField_eq_blockCoeffField, sub_eq_add_neg] + ring + have hzeroFG : average U (fun x => f x - g x) = 0 := by + change volumeAverage (U : Set (Vec d)) (f - g) = 0 + simpa [hfun] using hBlockZeroStates + have hSspace : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled S) := by + simpa [hSstate, blockResponsePairHalfState, blockResponsePairState] using + blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a.toCoeffField) hEll v vStar + have hSint : + BlockResponseIntegrabilityData (U : Set (Vec d)) a.toCoeffField + (blockStateOfDoubled S) := by + simpa [hSstate] using + blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn + (a := a.toCoeffField) hEll v vStar + have hSmem : + MemBlockL2 (U : Set (Vec d)) (blockStateOfDoubled S).eval := + blockResponse_memBlockL2_of_mem_responseSpace_of_integrabilityData hSspace hSint + have hTspace : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled T) := by + simpa [hTstate, blockResponsePairHalfState, blockResponsePairState] using + blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a.toCoeffField) hEll w2 z2 + have hTint : + BlockResponseIntegrabilityData (U : Set (Vec d)) a.toCoeffField + (blockStateOfDoubled T) := by + simpa [hTstate] using + blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn + (a := a.toCoeffField) hEll w2 z2 + have hTmem : + MemBlockL2 (U : Set (Vec d)) (blockStateOfDoubled T).eval := + blockResponse_memBlockL2_of_mem_responseSpace_of_integrabilityData hTspace hTint + let Pconst : BlockState d := { potential := fun _ => p, flux := fun _ => q } + have hPconst : + MemBlockL2 (U : Set (Vec d)) Pconst.eval := by + simpa [Pconst, BlockState.eval, blockField] using! + memBlockL2_blockField + (MeasureTheory.memLp_const (μ := volumeMeasureOn (U : Set (Vec d))) (c := p)) + (MeasureTheory.memLp_const (μ := volumeMeasureOn (U : Set (Vec d))) (c := q)) + have hTpot : MemVectorL2 (U : Set (Vec d)) fun x => ((blockStateOfDoubled T).eval x).1 := + memVectorL2_fst_of_memBlockL2 hTmem + have hTflux : MemVectorL2 (U : Set (Vec d)) fun x => ((blockStateOfDoubled T).eval x).2 := + memVectorL2_snd_of_memBlockL2 hTmem + have hQpot : + MeasureTheory.IntegrableOn + (fun x => vecDot qStar (((blockStateOfDoubled T).eval x).1)) + (U : Set (Vec d)) := + integrableOn_vecDot_of_memVectorL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn (U : Set (Vec d))) (c := qStar)) + hTpot + have hQflux : + MeasureTheory.IntegrableOn + (fun x => vecDot pStar (((blockStateOfDoubled T).eval x).2)) + (U : Set (Vec d)) := + integrableOn_vecDot_of_memVectorL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn (U : Set (Vec d))) (c := pStar)) + hTflux + have hQInt : + MeasureTheory.IntegrableOn + (fun x => blockVecDot (qStar, pStar) ((blockStateOfDoubled T).eval x)) + (U : Set (Vec d)) := by + simpa [MeasureTheory.IntegrableOn, blockVecDot] using! + hQpot.integrable.add hQflux.integrable + have hPInt : + MeasureTheory.IntegrableOn + (fun x => + blockVecDot (p, q) + (blockMatVecMul (blockMatrixField a x) ((blockStateOfDoubled T).eval x))) + (U : Set (Vec d)) := by + simpa [Pconst, blockPairingIntegrand, BlockState.eval, + book_blockMatrixField_eq_blockCoeffField] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := (U : Set (Vec d))) (a := a.toCoeffField) + (X := Pconst) (Y := blockStateOfDoubled T) hPconst hTmem hEll + have hf : MeasureTheory.IntegrableOn f (U : Set (Vec d)) := by + simpa [f, doubledResponseFirstVariationLeft, T, blockStateOfDoubled, + DoubledField.eval, sub_eq_add_neg, MeasureTheory.IntegrableOn] using! + hQInt.integrable.sub hPInt.integrable + have hg : MeasureTheory.IntegrableOn g (U : Set (Vec d)) := by + simpa [g, doubledResponseFirstVariationRight, S, T, blockStateOfDoubled, + DoubledField.eval, blockPairingIntegrand, BlockState.eval, blockMatrixField, + book_blockMatrixField_eq_blockCoeffField] using! + blockPairingIntegrand_integrableOn_of_memBlockL2_of_isEllipticFieldOn + (U := (U : Set (Vec d))) (a := a.toCoeffField) + (X := blockStateOfDoubled T) (Y := blockStateOfDoubled S) + hTmem hSmem hEll + exact average_eq_of_average_sub_eq_zero U hf hg hzeroFG + +theorem first_variation_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ P Q : BlockVec d, ∀ S T : DoubledField d, + IsDoubledResponseMaximizer U a P Q S → + IsDoubledResponseField U a T → + average U + (fun x => + blockVecDot Q (T.eval x) - + blockVecDot P (blockMatVecMul (blockMatrixField a x) (T.eval x))) = + average U + (fun x => + blockVecDot (T.eval x) + (blockMatVecMul (blockMatrixField a x) (S.eval x))) := by + intro P Q S T hS hT + rcases P with ⟨p, q⟩ + rcases Q with ⟨qStar, pStar⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p pStar q qStar S hS with + ⟨v, vStar, hv, hvStar, hSsame⟩ + rcases (response_space_by_solutions_of_isEllipticFieldOn U a hEll T).mp hT with + ⟨w, z, hTsame⟩ + change + average U (doubledResponseFirstVariationLeft U a (p, q) (qStar, pStar) T) = + average U (doubledResponseFirstVariationRight U a S T) + calc + average U (doubledResponseFirstVariationLeft U a (p, q) (qStar, pStar) T) = + average U + (doubledResponseFirstVariationLeft U a (p, q) (qStar, pStar) + (doubledFieldOfSolutions a w z)) := + doubledResponseFirstVariationLeft_average_eq_of_sameAE U a (p, q) (qStar, pStar) hTsame + _ = + average U + (doubledResponseFirstVariationRight U a + (doubledFieldOfScalarMaximizers a v vStar) + (doubledFieldOfSolutions a w z)) := + first_variation_scalar_representatives_of_isEllipticFieldOn + U a hEll p pStar q qStar v vStar hv hvStar w z + _ = average U (doubledResponseFirstVariationRight U a S T) := by + exact + (doubledResponseFirstVariationRight_average_eq_of_sameAE U a hSsame hTsame).symm + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/MaximizerAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/MaximizerAlgebra.lean new file mode 100644 index 0000000000..e0a833f636 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/MaximizerAlgebra.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ScalarMaximizers + +/-! # Maximizer Algebra -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Doubled Maximizer Algebra + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +theorem doubledFieldOfScalarMaximizers_sameAE_of_sameGradient {d : ℕ} + (U : Domain d) (a : CoeffOn U) + {v w : Solution U a} {vStar wStar : Solution U a.transpose} + (hvw : Solution.SameGradientAE v w) + (hvStarwStar : Solution.SameGradientAE vStar wStar) : + DoubledField.SameAE (U := U) + (doubledFieldOfScalarMaximizers a v vStar) + (doubledFieldOfScalarMaximizers a w wStar) := by + constructor + · filter_upwards [hvw, hvStarwStar] with x hx hxStar + change + ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x)) x = + ((1 / 2 : ℝ) • (fun x => w.toH1.grad x + wStar.toH1.grad x)) x + simp [hx, hxStar] + · filter_upwards [hvw, hvStarwStar] with x hx hxStar + change + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x))) x = + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (w.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (wStar.toH1.grad x))) x + simp [CoeffOn.transpose_apply, hx, hxStar] + +theorem doubledFieldOfScalarMaximizers_sameAE_add_of_grad_add {d : ℕ} + (U : Domain d) (a : CoeffOn U) + {v12 v1 v2 : Solution U a} {vStar12 vStar1 vStar2 : Solution U a.transpose} + (hv : + v12.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => v1.toH1.grad x + v2.toH1.grad x) + (hvStar : + vStar12.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => vStar1.toH1.grad x + vStar2.toH1.grad x) : + DoubledField.SameAE (U := U) + (doubledFieldOfScalarMaximizers a v12 vStar12) + (doubledFieldOfScalarMaximizers a v1 vStar1 + + doubledFieldOfScalarMaximizers a v2 vStar2) := by + constructor + · filter_upwards [hv, hvStar] with x hx hxStar + ext i + change + (((1 / 2 : ℝ) • (fun x => v12.toH1.grad x + vStar12.toH1.grad x)) x) i = + ((((1 / 2 : ℝ) • (fun x => v1.toH1.grad x + vStar1.toH1.grad x)) + + ((1 / 2 : ℝ) • (fun x => v2.toH1.grad x + vStar2.toH1.grad x))) x) i + simp [hx, hxStar] + ring + · filter_upwards [hv, hvStar] with x hx hxStar + ext i + change + (((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v12.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar12.toH1.grad x))) x) i = + ((((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v1.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar1.toH1.grad x))) + + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v2.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar2.toH1.grad x)))) x) i + simp [CoeffOn.transpose_apply, hx, hxStar, matVecMul_add, sub_eq_add_neg] + ring + +theorem doubledFieldOfScalarMaximizers_sameAE_smul_of_grad_smul {d : ℕ} + (U : Domain d) (a : CoeffOn U) (c : ℝ) + {vc v : Solution U a} {vStarc vStar : Solution U a.transpose} + (hv : + vc.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • v.toH1.grad x) + (hvStar : + vStarc.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • vStar.toH1.grad x) : + DoubledField.SameAE (U := U) + (doubledFieldOfScalarMaximizers a vc vStarc) + (c • doubledFieldOfScalarMaximizers a v vStar) := by + constructor + · filter_upwards [hv, hvStar] with x hx hxStar + ext i + change + (((1 / 2 : ℝ) • (fun x => vc.toH1.grad x + vStarc.toH1.grad x)) x) i = + ((c • ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x))) x) i + simp [hx, hxStar] + ring + · filter_upwards [hv, hvStar] with x hx hxStar + ext i + change + (((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (vc.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStarc.toH1.grad x))) x) i = + ((c • ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x)))) x) i + simp [CoeffOn.transpose_apply, hx, hxStar, matVecMul_smul, sub_eq_add_neg] + ring + +theorem maximizer_unique_ae_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ P Q : BlockVec d, ∀ X Y : DoubledField d, + IsDoubledResponseMaximizer U a P Q X → + IsDoubledResponseMaximizer U a P Q Y → + DoubledField.SameAE (U := U) X Y := by + intro P Q X Y hX hY + rcases P with ⟨p, q⟩ + rcases Q with ⟨qStar, pStar⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p pStar q qStar X hX with + ⟨vX, vStarX, hvX, hvStarX, hXsame⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p pStar q qStar Y hY with + ⟨vY, vStarY, hvY, hvStarY, hYsame⟩ + have hUnique := responseGradientUniquenessTheory_of_isEllipticFieldOn U a hEll + have hEllAdj : + IsEllipticFieldOn a.transpose.lam a.transpose.Lam (U : Set (Vec d)) + a.transpose.toCoeffField := by + simpa [Homogenization.adjointCoeffField] using! + isEllipticFieldOn_adjointCoeffField hEll + have hUniqueAdj := responseGradientUniquenessTheory_of_isEllipticFieldOn U a.transpose hEllAdj + have hvSame := + hUnique.unique_gradient (p - pStar) (qStar - q) vX vY hvX hvY + have hvStarSame := + hUniqueAdj.unique_gradient (pStar + p) (qStar + q) vStarX vStarY hvStarX hvStarY + have hCandSame := + doubledFieldOfScalarMaximizers_sameAE_of_sameGradient U a hvSame hvStarSame + exact doubledSameAE_trans hXsame + (doubledSameAE_trans hCandSame (doubledSameAE_symm hYsame)) + +theorem maximizer_add_sameAE_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ P1 Q1 P2 Q2 : BlockVec d, ∀ X12 X1 X2 : DoubledField d, + IsDoubledResponseMaximizer U a (P1 + P2) (Q1 + Q2) X12 → + IsDoubledResponseMaximizer U a P1 Q1 X1 → + IsDoubledResponseMaximizer U a P2 Q2 X2 → + DoubledField.SameAE (U := U) X12 (X1 + X2) := by + intro P1 Q1 P2 Q2 X12 X1 X2 h12 h1 h2 + rcases P1 with ⟨p1, q1⟩ + rcases Q1 with ⟨qStar1, pStar1⟩ + rcases P2 with ⟨p2, q2⟩ + rcases Q2 with ⟨qStar2, pStar2⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll (p1 + p2) (pStar1 + pStar2) (q1 + q2) (qStar1 + qStar2) + X12 (by simpa using h12) with + ⟨v12, vStar12, hv12, hvStar12, h12same⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p1 pStar1 q1 qStar1 X1 h1 with + ⟨v1, vStar1, hv1, hvStar1, h1same⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p2 pStar2 q2 qStar2 X2 h2 with + ⟨v2, vStar2, hv2, hvStar2, h2same⟩ + have hLinear := responseGradientLinearityTheory_of_isEllipticFieldOn U a hEll + have hEllAdj : + IsEllipticFieldOn a.transpose.lam a.transpose.Lam (U : Set (Vec d)) + a.transpose.toCoeffField := by + simpa [Homogenization.adjointCoeffField] using! + isEllipticFieldOn_adjointCoeffField hEll + have hLinearAdj := responseGradientLinearityTheory_of_isEllipticFieldOn U a.transpose hEllAdj + have hv12' : + Book.Ch02.IsResponseMaximizer U a + ((p1 - pStar1) + (p2 - pStar2)) + ((qStar1 - q1) + (qStar2 - q2)) v12 := by + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using hv12 + have hvStar12' : + Book.Ch02.IsResponseMaximizer U a.transpose + ((pStar1 + p1) + (pStar2 + p2)) + ((qStar1 + q1) + (qStar2 + q2)) vStar12 := by + simpa [add_comm, add_left_comm, add_assoc] using hvStar12 + have hvAdd := + hLinear.add_gradient (p1 - pStar1) (qStar1 - q1) + (p2 - pStar2) (qStar2 - q2) v12 v1 v2 hv12' hv1 hv2 + have hvStarAdd := + hLinearAdj.add_gradient (pStar1 + p1) (qStar1 + q1) + (pStar2 + p2) (qStar2 + q2) vStar12 vStar1 vStar2 + hvStar12' hvStar1 hvStar2 + have hCandAdd := + doubledFieldOfScalarMaximizers_sameAE_add_of_grad_add U a hvAdd hvStarAdd + have hSum := + doubledSameAE_add (doubledSameAE_symm h1same) (doubledSameAE_symm h2same) + exact doubledSameAE_trans h12same (doubledSameAE_trans hCandAdd hSum) + +theorem maximizer_smul_sameAE_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ c : ℝ, ∀ P Q : BlockVec d, ∀ Xc X : DoubledField d, + IsDoubledResponseMaximizer U a (c • P) (c • Q) Xc → + IsDoubledResponseMaximizer U a P Q X → + DoubledField.SameAE (U := U) Xc (c • X) := by + intro c P Q Xc X hc hX + rcases P with ⟨p, q⟩ + rcases Q with ⟨qStar, pStar⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll (c • p) (c • pStar) (c • q) (c • qStar) + Xc (by simpa using hc) with + ⟨vc, vStarc, hvc, hvStarc, hcsame⟩ + rcases doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn + U a hEll p pStar q qStar X hX with + ⟨v, vStar, hv, hvStar, hsame⟩ + have hLinear := responseGradientLinearityTheory_of_isEllipticFieldOn U a hEll + have hEllAdj : + IsEllipticFieldOn a.transpose.lam a.transpose.Lam (U : Set (Vec d)) + a.transpose.toCoeffField := by + simpa [Homogenization.adjointCoeffField] using! + isEllipticFieldOn_adjointCoeffField hEll + have hLinearAdj := responseGradientLinearityTheory_of_isEllipticFieldOn U a.transpose hEllAdj + have hvc' : + Book.Ch02.IsResponseMaximizer U a (c • (p - pStar)) (c • (qStar - q)) vc := by + simpa [sub_eq_add_neg, smul_add, smul_neg] using hvc + have hvStarc' : + Book.Ch02.IsResponseMaximizer U a.transpose + (c • (pStar + p)) (c • (qStar + q)) vStarc := by + simpa [smul_add] using hvStarc + have hvSmul := + hLinear.smul_gradient c (p - pStar) (qStar - q) vc v hvc' hv + have hvStarSmul := + hLinearAdj.smul_gradient c (pStar + p) (qStar + q) vStarc vStar + hvStarc' hvStar + have hCandSmul := + doubledFieldOfScalarMaximizers_sameAE_smul_of_grad_smul U a c hvSmul hvStarSmul + have hScaled := doubledSameAE_smul c (doubledSameAE_symm hsame) + exact doubledSameAE_trans hcsame (doubledSameAE_trans hCandSmul hScaled) + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ResponseSpace.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ResponseSpace.lean new file mode 100644 index 0000000000..af6c7e93fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ResponseSpace.lean @@ -0,0 +1,548 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.Common + +/-! # Response Space -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Doubled Response Space + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +theorem potentialFieldOn_of_ae_eq {d : ℕ} + {U : Set (Vec d)} {f g : Vec d → Vec d} + (hfg : f =ᵐ[volumeMeasureOn U] g) + (hg : Book.Ch01.PotentialFieldOn U g) : + Book.Ch01.PotentialFieldOn U f := by + rcases hg with ⟨hgMem, u, hgu⟩ + exact ⟨hgMem.ae_eq hfg.symm, u, hfg.trans hgu⟩ + +theorem solenoidalFieldOn_of_ae_eq {d : ℕ} + {U : Set (Vec d)} {f g : Vec d → Vec d} + (hfg : f =ᵐ[volumeMeasureOn U] g) + (hg : Book.Ch01.SolenoidalFieldOn U g) : + Book.Ch01.SolenoidalFieldOn U f := by + refine ⟨hg.1.ae_eq hfg.symm, ?_⟩ + intro φ + calc + ∫ x in U, vecDot (f x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hfg] with x hx + simp [hx] + _ = 0 := hg.2 φ + +theorem isDoubledResponseField_of_sameAE {d : ℕ} + (U : Domain d) (a : CoeffOn U) {X Y : DoubledField d} + (hXY : DoubledField.SameAE (U := U) X Y) + (hY : IsDoubledResponseField U a Y) : + IsDoubledResponseField U a X := by + refine ⟨?_, ?_⟩ + · exact + ⟨potentialFieldOn_of_ae_eq hXY.1 hY.1.1, + solenoidalFieldOn_of_ae_eq hXY.2 hY.1.2⟩ + · intro T hT + calc + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a T X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a T Y x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hXY.1, hXY.2] with x hxPot hxFlux + simp [doubledBlockPairingIntegrand, DoubledField.eval, hxPot, hxFlux] + _ = 0 := hY.2 T hT + +theorem isPotentialOn_congr_ae {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} + (hfg : f =ᵐ[MeasureTheory.volume.restrict U] g) + (hf : IsPotentialOn U f) : + IsPotentialOn U g := by + rcases hf with ⟨u, hgrad⟩ + let v : H1Function U := + { toFun := u.toFun + grad := g + memL2 := u.memL2 + gradMemL2 := by + intro i + have hcoord : + (fun x => u.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := by + filter_upwards [hfg] with x hx + simpa [hgrad] using congrArg (fun y : Vec d => y i) hx + exact (u.gradMemL2 i).ae_eq hcoord + hasWeakGradient := by + intro i ψ hψ_smooth hψ_compact hψ_sub + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_compact hψ_sub + have hcoord : + (fun x => u.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := by + filter_upwards [hfg] with x hx + simpa [hgrad] using congrArg (fun y : Vec d => y i) hx + have hright : + ∫ x in U, g x i * ψ x ∂MeasureTheory.volume = + ∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hcoord] with x hx + rw [← hx] + calc + ∫ x in U, u.toFun x * (fderiv ℝ ψ x) (basisVec i) + ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, g x i * ψ x ∂MeasureTheory.volume := by rw [hright] } + exact ⟨v, rfl⟩ + +theorem potentialFieldOn_of_isPotentialOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialOn U f) : + Book.Ch01.PotentialFieldOn U f := by + rcases hf with ⟨u, rfl⟩ + exact Book.Ch01.potentialFieldOn_of_h1 u + +theorem isPotentialOn_of_potentialFieldOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : Book.Ch01.PotentialFieldOn U f) : + IsPotentialOn U f := by + rcases hf with ⟨_hfMem, u, hu⟩ + exact isPotentialOn_congr_ae hu.symm u.isPotentialOn + +theorem isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : Book.Ch01.PotentialZeroTraceFieldOn U f) : + IsPotentialZeroTraceOn U f := by + rcases hf with ⟨_hfMem, φ, hφ⟩ + exact IsPotentialZeroTraceOn.congr_ae hφ.symm φ.isPotentialZeroTraceOn + +theorem solenoidalFieldOn_of_isSolenoidalOn {d : ℕ} + {U : Set (Vec d)} {g : Vec d → Vec d} + (hg_mem : MemVectorL2 U g) (hg : IsSolenoidalOn U g) : + Book.Ch01.SolenoidalFieldOn U g := + ⟨hg_mem, hg⟩ + +theorem lowerImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {X : BlockState d} + {lam Lam : ℝ} + (hPot : MemVectorL2 U X.potential) (hFlux : MemVectorL2 U X.flux) + (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + have hSkewPot : + MemVectorL2 U (fun x => matVecMul (skewPart (a x)) (X.potential x)) := + memVectorL2_matVecMul_skewPart_of_isEllipticFieldOn hEll hPot + have hShift : + MemVectorL2 U + (fun x => X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [sub_eq_add_neg] using! hFlux.sub hSkewPot + have hInv : + MemVectorL2 U + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := + memVectorL2_matVecMul_symmPartInv_of_isEllipticFieldOn hEll hShift + have hEq : + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) = + (fun x => + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x))) := by + funext x + simpa [BlockState.eval, blockCoeffField] using + (blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) (p := X.potential x) (q := X.flux x)) + simpa [hEq] using hInv + +theorem upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + {X : BlockState d} (hEll : IsEllipticFieldOn lam Lam U a) {x : Vec d} + (hx : x ∈ U) : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + X.flux x = + matVecMul (a x) + (X.potential x + (blockMatVecMul (blockCoeffField a x) (X.eval x)).2) := by + let lower : Vec d := (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hlower : + lower = + matVecMul ((symmPart (a x))⁻¹) + (X.flux x - matVecMul (skewPart (a x)) (X.potential x)) := by + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_snd + (A := a x) (p := X.potential x) (q := X.flux x) + have hupper : + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 = + matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower := by + rw [hlower] + simpa [lower, BlockState.eval, blockCoeffField] using + blockMatVecMul_blockMatrixOfCoeff_fst + (A := a x) (p := X.potential x) (q := X.flux x) + have hrecover : + X.flux x = + matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x) := by + simpa [lower] using! + blockMatVecMul_blockMatrixOfCoeff_snd_recover_flux_of_isEllipticMatrix + (A := a x) (hEll.2 x hx) (p := X.potential x) (q := X.flux x) + have hsplit : a x = symmPart (a x) + skewPart (a x) := by + ext i j + simp [symmPart, skewPart, sub_eq_add_neg] + ring + calc + (blockMatVecMul (blockCoeffField a x) (X.eval x)).1 + X.flux x = + (matVecMul (symmPart (a x)) (X.potential x) + + matVecMul (skewPart (a x)) lower) + + (matVecMul (symmPart (a x)) lower + + matVecMul (skewPart (a x)) (X.potential x)) := by + rw [hupper, hrecover] + _ = + matVecMul (symmPart (a x)) (X.potential x + lower) + + matVecMul (skewPart (a x)) (X.potential x + lower) := by + rw [matVecMul_add, matVecMul_add] + abel + _ = matVecMul ((symmPart (a x)) + skewPart (a x)) (X.potential x + lower) := by + rw [add_matVecMul] + _ = matVecMul (a x) (X.potential x + lower) := by + rw [← hsplit] + +theorem upperImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {X : BlockState d} + {lam Lam : ℝ} + (hPot : MemVectorL2 U X.potential) (hFlux : MemVectorL2 U X.flux) + (hLower : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2)) + (hEll : IsEllipticFieldOn lam Lam U a) : + MemVectorL2 U + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) := by + let lower : Vec d → Vec d := + fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).2 + have hPotLower : MemVectorL2 U (fun x => X.potential x + lower x) := by + simpa [lower, Pi.add_apply] using! hPot.add hLower + have hA : + MemVectorL2 U (fun x => matVecMul (a x) (X.potential x + lower x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hPotLower + have hUpper' : + MemVectorL2 U (fun x => matVecMul (a x) (X.potential x + lower x) - X.flux x) := by + simpa [sub_eq_add_neg] using! hA.sub hFlux + have hEq : + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) + =ᵐ[volumeMeasureOn U] + fun x => matVecMul (a x) (X.potential x + lower x) - X.flux x := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] + with x hx + have hpoint := + upper_add_flux_eq_matVecMul_potential_add_lowerImage_of_isEllipticFieldOn + (a := a) hEll (X := X) hx + exact eq_sub_iff_add_eq.mpr (by simpa [lower] using hpoint) + have hMeas : + MeasureTheory.AEStronglyMeasurable + (fun x => (blockMatVecMul (blockCoeffField a x) (X.eval x)).1) + (volumeMeasureOn U) := + hUpper'.1.congr hEq.symm + refine hUpper'.congr_norm hMeas ?_ + filter_upwards [hEq] with x hx + simpa using congrArg norm hx.symm + +theorem blockResponseSpace_of_isDoubledResponseField_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + {X : DoubledField d} (hX : IsDoubledResponseField U a X) : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled X) := by + let upper : Vec d → Vec d := + fun x => (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockStateOfDoubled X).eval x)).1 + let lower : Vec d → Vec d := + fun x => (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockStateOfDoubled X).eval x)).2 + have hPotMem : MemVectorL2 (U : Set (Vec d)) X.potential := hX.1.1.1 + have hFluxMem : MemVectorL2 (U : Set (Vec d)) X.flux := hX.1.2.1 + have hLowerL2 : MemVectorL2 (U : Set (Vec d)) lower := by + simpa [lower, blockStateOfDoubled] using + lowerImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn + (a := a.toCoeffField) (X := blockStateOfDoubled X) + hPotMem hFluxMem hEll + have hUpperL2 : MemVectorL2 (U : Set (Vec d)) upper := by + simpa [upper, lower, blockStateOfDoubled] using + upperImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn + (a := a.toCoeffField) (X := blockStateOfDoubled X) + hPotMem hFluxMem hLowerL2 hEll + have hUpperSol : IsSolenoidalOn (U : Set (Vec d)) upper := by + intro φ + let Y : DoubledField d := { potential := φ.toH1Function.grad, flux := 0 } + have hY : IsDoubledTestField U Y := by + refine ⟨Book.Ch01.potentialZeroTraceFieldOn_of_h10 φ, ?_⟩ + refine ⟨MeasureTheory.MemLp.zero, ?_⟩ + intro ψ + simp [Y, vecDot] + have hzero := hX.2 Y hY + have hrewrite : + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), vecDot (φ.toH1Function.grad x) (upper x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Y, upper, blockStateOfDoubled, doubledBlockPairingIntegrand, + DoubledField.eval, BlockState.eval, blockMatrixField, blockCoeffField, + blockMatrixOfCoeff, blockVecDot, vecDot_zero_left] + calc + ∫ x in (U : Set (Vec d)), vecDot (upper x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), vecDot (φ.toH1Function.grad x) (upper x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + rw [vecDot_comm] + _ = 0 := by + simpa [hrewrite] using hzero + have hLowerOrth : + ∀ {g : Vec d → Vec d}, MemVectorL2 (U : Set (Vec d)) g → + IsSolenoidalZeroNormalTraceOn (U : Set (Vec d)) g → + ∫ x in (U : Set (Vec d)), vecDot (g x) (lower x) + ∂MeasureTheory.volume = 0 := by + intro g hg hsol + let Y : DoubledField d := { potential := 0, flux := g } + have hY : IsDoubledTestField U Y := by + refine ⟨?_, ⟨hg, hsol⟩⟩ + exact Book.Ch01.potentialZeroTraceFieldOn_of_h10 + (0 : H10Function (U : Set (Vec d))) + have hzero := hX.2 Y hY + have hrewrite : + ∫ x in (U : Set (Vec d)), + doubledBlockPairingIntegrand U a Y X x ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), vecDot (g x) (lower x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Y, lower, blockStateOfDoubled, doubledBlockPairingIntegrand, + DoubledField.eval, BlockState.eval, blockMatrixField, blockCoeffField, + blockMatrixOfCoeff, blockVecDot, vecDot_zero_left] + simpa [hrewrite] using hzero + have hLowerPot : IsPotentialOn (U : Set (Vec d)) lower := + IsPotentialOn.of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain) + hLowerL2 hLowerOrth + refine ⟨isPotentialOn_of_potentialFieldOn hX.1.1, hX.1.2.2, ?_⟩ + intro Y hY + rcases hY.1 with ⟨φ, hφ⟩ + rcases hLowerPot with ⟨ψ, hψ⟩ + have hYpotL2 : MemVectorL2 (U : Set (Vec d)) Y.potential := by + simpa [hφ] using φ.toH1Function.grad_memVectorL2 + have hTerm1Int : + MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (upper x)) (U : Set (Vec d)) := + integrableOn_vecDot_of_memVectorL2 hYpotL2 hUpperL2 + have hTerm1Zero : + ∫ x in (U : Set (Vec d)), vecDot (Y.potential x) (upper x) + ∂MeasureTheory.volume = 0 := by + have hzero := hUpperSol φ + simpa [hφ, vecDot_comm] using hzero + have hTerm2Zero : + ∫ x in (U : Set (Vec d)), vecDot (Y.flux x) (lower x) + ∂MeasureTheory.volume = 0 := by + have hzero := hY.2 ψ + simpa [hψ] using hzero + have hrewrite : + ∫ x in (U : Set (Vec d)), + blockVecDot (Y.eval x) + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockStateOfDoubled X).eval x)) ∂MeasureTheory.volume = + ∫ x in (U : Set (Vec d)), + vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [upper, lower, blockStateOfDoubled, BlockState.eval, blockVecDot] + rw [hrewrite] + by_cases hTerm2Int : + MeasureTheory.IntegrableOn + (fun x => vecDot (Y.flux x) (lower x)) (U : Set (Vec d)) + · rw [MeasureTheory.integral_add hTerm1Int hTerm2Int, hTerm1Zero, hTerm2Zero] + simp + · have hSumNotInt : + ¬MeasureTheory.IntegrableOn + (fun x => vecDot (Y.potential x) (upper x) + vecDot (Y.flux x) (lower x)) + (U : Set (Vec d)) := by + intro hSumInt + exact hTerm2Int + ((MeasureTheory.integrable_add_iff_integrable_right' + (μ := MeasureTheory.volume.restrict (U : Set (Vec d))) hTerm1Int).mp hSumInt) + rw [MeasureTheory.integral_undef hSumNotInt] + +theorem isDoubledResponseField_of_blockResponseSpace {d : ℕ} + (U : Domain d) (a : CoeffOn U) {X : BlockState d} + (hX : BlockResponseSpace a.toCoeffField (U : Set (Vec d)) X) + (hFlux : MemVectorL2 (U : Set (Vec d)) X.flux) : + IsDoubledResponseField U a (doubledFieldOfBlockState X) := by + refine ⟨?_, ?_⟩ + · exact + ⟨potentialFieldOn_of_isPotentialOn hX.1, + solenoidalFieldOn_of_isSolenoidalOn hFlux hX.2.1⟩ + · intro Y hY + have hYOld : IsBlockTestOn (U : Set (Vec d)) (blockStateOfDoubled Y) := by + refine ⟨?_, ?_⟩ + · exact isPotentialZeroTraceOn_of_potentialZeroTraceFieldOn hY.1 + · exact hY.2.2 + simpa [doubledFieldOfBlockState, blockStateOfDoubled, + doubledBlockPairingIntegrand, blockCoeffField] + using! hX.2.2 (blockStateOfDoubled Y) hYOld + +theorem doubledFieldOfSolutions_flux_memL2_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (v : Solution U a) (vStar : Solution U a.transpose) : + MemVectorL2 (U : Set (Vec d)) (doubledFieldOfSolutions a v vStar).flux := by + have hEllAdj : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) := + isEllipticFieldOn_adjointCoeffField hEll + have hv : + MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (a.toCoeffField x) (v.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.toH1.grad_memVectorL2 + have hvStar : + MemVectorL2 (U : Set (Vec d)) + (fun x => matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x)) := by + simpa [Homogenization.adjointCoeffField] using + memVectorL2_matVecMul_of_isEllipticFieldOn hEllAdj vStar.toH1.grad_memVectorL2 + simpa [doubledFieldOfSolutions, sub_eq_add_neg] using! hv.sub hvStar + +theorem doubledFieldOfSolutions_mem_responseField_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (v : Solution U a) (vStar : Solution U a.transpose) : + IsDoubledResponseField U a (doubledFieldOfSolutions a v vStar) := by + have hOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) + (blockResponsePairState a.toCoeffField v vStar) := by + simpa [Homogenization.adjointCoeffField] using! + blockResponse_pair_mem_responseSpace_of_isEllipticFieldOn + (a := a.toCoeffField) hEll v vStar + have hFlux := + doubledFieldOfSolutions_flux_memL2_of_isEllipticFieldOn U a hEll v vStar + simpa [doubledFieldOfBlockState, doubledFieldOfSolutions, blockResponsePairState, + Homogenization.adjointCoeffField] using + isDoubledResponseField_of_blockResponseSpace U a hOld hFlux + +theorem response_space_by_solutions_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ X : DoubledField d, + IsDoubledResponseField U a X ↔ + ∃ v : Solution U a, ∃ vStar : Solution U a.transpose, + DoubledField.SameAE (U := U) X (doubledFieldOfSolutions a v vStar) := by + intro X + constructor + · intro hX + have hOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled X) := + blockResponseSpace_of_isDoubledResponseField_of_isEllipticFieldOn U a hEll hX + have hLowerL2 : + MemVectorL2 (U : Set (Vec d)) + (fun x => + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockStateOfDoubled X).eval x)).2) := by + exact + lowerImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn + (a := a.toCoeffField) (X := blockStateOfDoubled X) + hX.1.1.1 hX.1.2.1 hEll + rcases + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_memVectorL2_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a.toCoeffField) U.isDomain hOld hLowerL2 hEll + with ⟨u, vStarOld, hhalf⟩ + let vStar : Solution U a.transpose := by + simpa [Homogenization.adjointCoeffField] using! vStarOld + refine ⟨solutionSMul U a (1 / 2 : ℝ) u, + solutionSMul U a.transpose (1 / 2 : ℝ) vStar, ?_⟩ + have hEq : + doubledFieldOfSolutions a (solutionSMul U a (1 / 2 : ℝ) u) + (solutionSMul U a.transpose (1 / 2 : ℝ) vStar) = + doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField u vStarOld) := by + simpa [vStar, Homogenization.adjointCoeffField] using + doubledFieldOfSolutions_solutionSMul_half_eq_pairHalf U a u vStar + have hSamePair : + DoubledField.SameAE (U := U) X + (doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField u vStarOld)) := by + constructor + · filter_upwards [hhalf] with x hx + exact (congrArg Prod.fst hx).symm + · filter_upwards [hhalf] with x hx + exact (congrArg Prod.snd hx).symm + rw [hEq] + exact hSamePair + · rintro ⟨v, vStar, hsame⟩ + exact + isDoubledResponseField_of_sameAE U a hsame + (doubledFieldOfSolutions_mem_responseField_of_isEllipticFieldOn U a hEll v vStar) + +theorem book_doubledResponseValue_eq_blockResponseIntegrand {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) (X : DoubledField d) : + doubledResponseValue U a P Q X = + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField P Q (blockStateOfDoubled X)) := + rfl + +theorem book_doubledResponseValue_ofBlockState_eq_blockResponseIntegrand {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) (X : BlockState d) : + doubledResponseValue U a P Q (doubledFieldOfBlockState X) = + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField P Q X) := + rfl + +theorem book_doubledResponseValueSet_eq_blockJValueSet_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (P Q : BlockVec d) : + doubledResponseValueSet U a P Q = + blockJValueSet (U : Set (Vec d)) P Q a.toCoeffField := by + ext m + constructor + · rintro ⟨X, hX, rfl⟩ + have hOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled X) := + blockResponseSpace_of_isDoubledResponseField_of_isEllipticFieldOn U a hEll hX + have hInt : + BlockResponseIntegrabilityData (U : Set (Vec d)) a.toCoeffField + (blockStateOfDoubled X) := + blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + hOld hX.1.2.1 hEll + exact ⟨blockStateOfDoubled X, hOld, hInt, rfl⟩ + · rintro ⟨X, hX, hInt, rfl⟩ + exact + ⟨doubledFieldOfBlockState X, + isDoubledResponseField_of_blockResponseSpace U a hX hInt.flux_memL2, rfl⟩ + +theorem book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (P Q : BlockVec d) : + doubledResponseJ U a P Q = + BlockJ (U : Set (Vec d)) P Q a.toCoeffField := by + unfold doubledResponseJ BlockJ + rw [book_doubledResponseValueSet_eq_blockJValueSet_of_isEllipticFieldOn U a hEll P Q] + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ScalarMaximizers.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ScalarMaximizers.lean new file mode 100644 index 0000000000..56e38de630 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/ScalarMaximizers.lean @@ -0,0 +1,479 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.ResponseSpace + +/-! # Scalar Maximizers -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Scalar Maximizers and Doubled Maximizers + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +theorem doubled_response_by_scalar_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ p pStar q qStar : Vec d, + doubledResponseJ U a (p, q) (qStar, pStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := by + intro p pStar q qStar + have hBlock := + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a.toCoeffField) U.isDomain hEll (domain_volume_pos U).ne' + p pStar q qStar + calc + doubledResponseJ U a (p, q) (qStar, pStar) = + BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField := by + rw [book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn U a hEll] + _ = + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) (p - pStar) (qStar - q) + a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) := hBlock + _ = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := by + rw [book_responseJ_eq_ResponseJ U a, + book_responseJ_eq_ResponseJ U a.transpose] + rfl + +theorem doubledFieldOfScalarMaximizers_eq_pairHalf {d : ℕ} + (U : Domain d) (a : CoeffOn U) (v : Solution U a) + (vStar : Solution U a.transpose) : + doubledFieldOfScalarMaximizers a v vStar = + doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField v vStar) := by + apply doubledField_ext + · funext x + change + ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x)) x = + ((1 / 2 : ℝ) • (fun x => v.toH1.grad x + vStar.toH1.grad x)) x + rfl + · funext x + change + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (a.transpose.toCoeffField x) (vStar.toH1.grad x))) x = + ((1 / 2 : ℝ) • + (fun x => + matVecMul (a.toCoeffField x) (v.toH1.grad x) - + matVecMul (matTranspose (a.toCoeffField x)) (vStar.toH1.grad x))) x + simp [CoeffOn.transpose_apply] + +theorem old_isResponseMaximizer_of_public {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) + (v : Solution U a) (hv : Book.Ch02.IsResponseMaximizer U a p q v) : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) p q a.toCoeffField v := by + intro w + simpa [book_responseValue_eq_volumeAverage_scalarResponseIntegrand] using hv w + +theorem doubledResponseValue_scalarMaximizers_eq_scalar_responseJ_of_isEllipticFieldOn + {d : ℕ} (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p pStar q qStar : Vec d) + (v : Solution U a) (vStar : Solution U a.transpose) + (hv : Book.Ch02.IsResponseMaximizer U a (p - pStar) (qStar - q) v) + (hvStar : Book.Ch02.IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStar) : + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := by + have hEq := doubledFieldOfScalarMaximizers_eq_pairHalf U a v vStar + have hvOld : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (p - pStar) (qStar - q) + a.toCoeffField v := + old_isResponseMaximizer_of_public U a (p - pStar) (qStar - q) v hv + have hvStarOld : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) vStar := by + simpa [Homogenization.adjointCoeffField] using! + old_isResponseMaximizer_of_public U a.transpose (pStar + p) (qStar + q) vStar hvStar + calc + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) = + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockResponsePairHalfState a.toCoeffField v vStar)) := by + rw [hEq] + rfl + _ = + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v) + + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) + (pStar + p) (qStar + q) vStar) := + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a.toCoeffField) U.measurableSet hEll p pStar q qStar v vStar + _ = + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) (p - pStar) (qStar - q) + a.toCoeffField + + (1 / 2 : ℝ) * ResponseJ (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) := by + rw [responseJ_eq_of_isResponseMaximizer (U : Set (Vec d)) (p - pStar) + (qStar - q) a.toCoeffField hvOld, + responseJ_eq_of_isResponseMaximizer (U : Set (Vec d)) (pStar + p) + (qStar + q) (Homogenization.adjointCoeffField a.toCoeffField) hvStarOld] + _ = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := by + rw [book_responseJ_eq_ResponseJ U a, + book_responseJ_eq_ResponseJ U a.transpose] + rfl + +theorem doubledResponseValue_eq_of_sameAE {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) + {X Y : DoubledField d} (hXY : DoubledField.SameAE (U := U) X Y) : + doubledResponseValue U a P Q X = doubledResponseValue U a P Q Y := by + unfold doubledResponseValue average + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards [hXY.1, hXY.2] with x hxPot hxFlux + simp [doubledResponseIntegrand, blockEnergyDensityAt, DoubledField.eval, hxPot, hxFlux] + +theorem isDoubledResponseMaximizer_of_sameAE {d : ℕ} + (U : Domain d) (a : CoeffOn U) (P Q : BlockVec d) + {X Y : DoubledField d} (hXY : DoubledField.SameAE (U := U) X Y) + (hY : IsDoubledResponseMaximizer U a P Q Y) : + IsDoubledResponseMaximizer U a P Q X := by + refine ⟨isDoubledResponseField_of_sameAE U a hXY hY.1, ?_⟩ + intro Z hZ + calc + doubledResponseValue U a P Q Z ≤ doubledResponseValue U a P Q Y := + hY.2 Z hZ + _ = doubledResponseValue U a P Q X := by + exact (doubledResponseValue_eq_of_sameAE U a P Q hXY).symm + +theorem doubledResponseJ_eq_value_of_maximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {P Q : BlockVec d} {X : DoubledField d} + (hX : IsDoubledResponseMaximizer U a P Q X) : + doubledResponseJ U a P Q = doubledResponseValue U a P Q X := by + unfold doubledResponseJ + have hGreatest : + IsGreatest (doubledResponseValueSet U a P Q) (doubledResponseValue U a P Q X) := by + refine ⟨⟨X, hX.1, rfl⟩, ?_⟩ + intro y hy + rcases hy with ⟨Y, hY, rfl⟩ + exact hX.2 Y hY + exact hGreatest.csSup_eq + +theorem doubledResponseValue_scalarPair_eq_scalar_values_of_isEllipticFieldOn + {d : ℕ} (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p pStar q qStar : Vec d) + (v : Solution U a) (vStar : Solution U a.transpose) : + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) = + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v) + + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) + (pStar + p) (qStar + q) vStar) := by + have hEq := doubledFieldOfScalarMaximizers_eq_pairHalf U a v vStar + calc + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) = + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockResponsePairHalfState a.toCoeffField v vStar)) := by + rw [hEq] + rfl + _ = + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v) + + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) + (pStar + p) (qStar + q) vStar) := + volumeAverage_blockResponseIntegrand_pair_half_eq_scalarResponse_sum_of_isEllipticFieldOn + (a := a.toCoeffField) U.measurableSet hEll p pStar q qStar v vStar + +theorem old_isResponseMaximizer_of_value_eq_responseJ {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (p q : Vec d) (v : AHarmonicFunction a U) + (hval : + volumeAverage U (scalarResponseIntegrand U a p q v) = + ResponseJ U p q a) : + Homogenization.IsResponseMaximizer U p q a v := by + intro w + calc + volumeAverage U (scalarResponseIntegrand U a p q w) ≤ + ResponseJ U p q a := + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEll hvol p q (responseJValueSet_mem U p q a w) + _ = volumeAverage U (scalarResponseIntegrand U a p q v) := hval.symm + +theorem public_isResponseMaximizer_of_old {d : ℕ} + (U : Domain d) (a : CoeffOn U) (p q : Vec d) (v : Solution U a) + (hv : Homogenization.IsResponseMaximizer (U : Set (Vec d)) p q a.toCoeffField v) : + Book.Ch02.IsResponseMaximizer U a p q v := by + intro w + simpa [book_responseValue_eq_volumeAverage_scalarResponseIntegrand] using hv w + +theorem doubledFieldOfScalarMaximizers_mem_responseField_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (v : Solution U a) (vStar : Solution U a.transpose) : + IsDoubledResponseField U a (doubledFieldOfScalarMaximizers a v vStar) := by + have hOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) + (blockResponsePairHalfState a.toCoeffField v vStar) := by + simpa [blockResponsePairHalfState, blockResponsePairState, + Homogenization.adjointCoeffField] using + blockResponse_pair_half_mem_responseSpace_of_isEllipticFieldOn + (a := a.toCoeffField) hEll v vStar + have hInt : + BlockResponseIntegrabilityData (U : Set (Vec d)) a.toCoeffField + (blockResponsePairHalfState a.toCoeffField v vStar) := by + simpa [Homogenization.adjointCoeffField] using + blockResponseIntegrabilityData_pair_half_of_isEllipticFieldOn + (a := a.toCoeffField) hEll v vStar + simpa [doubledFieldOfScalarMaximizers, doubledFieldOfSolutions, + doubledFieldOfBlockState, blockResponsePairHalfState, blockResponsePairState, + Homogenization.adjointCoeffField] using! + isDoubledResponseField_of_blockResponseSpace U a hOld hInt.flux_memL2 + +theorem scalar_maximizers_give_doubled_maximizer_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ p pStar q qStar : Vec d, + ∀ v : Solution U a, ∀ vStar : Solution U a.transpose, + Book.Ch02.IsResponseMaximizer U a (p - pStar) (qStar - q) v → + Book.Ch02.IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStar → + IsDoubledResponseMaximizer U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) := by + intro p pStar q qStar v vStar hv hvStar + refine ⟨doubledFieldOfScalarMaximizers_mem_responseField_of_isEllipticFieldOn U a hEll v vStar, ?_⟩ + intro Y hY + have hYOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled Y) := + blockResponseSpace_of_isDoubledResponseField_of_isEllipticFieldOn U a hEll hY + have hYInt : + BlockResponseIntegrabilityData (U : Set (Vec d)) a.toCoeffField + (blockStateOfDoubled Y) := + blockResponseIntegrabilityData_of_flux_memL2_of_mem_responseSpace_of_isEllipticFieldOn + hYOld hY.1.2.1 hEll + have hYmem : + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockStateOfDoubled Y)) ∈ + blockJValueSet (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField := + ⟨blockStateOfDoubled Y, hYOld, hYInt, rfl⟩ + have hYle : + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockStateOfDoubled Y)) ≤ + BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField := + le_blockJ_of_mem_blockJValueSet_of_isEllipticFieldOn + U.measurableSet hEll (domain_volume_pos U).ne' (p, q) (qStar, pStar) hYmem + have hCand : + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + doubledResponseValue_scalarMaximizers_eq_scalar_responseJ_of_isEllipticFieldOn + U a hEll p pStar q qStar v vStar hv hvStar + calc + doubledResponseValue U a (p, q) (qStar, pStar) Y = + volumeAverage (U : Set (Vec d)) + (blockResponseIntegrand a.toCoeffField (p, q) (qStar, pStar) + (blockStateOfDoubled Y)) := by + rfl + _ ≤ BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField := hYle + _ = doubledResponseJ U a (p, q) (qStar, pStar) := by + rw [book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn U a hEll] + _ = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + doubled_response_by_scalar_of_isEllipticFieldOn U a hEll p pStar q qStar + _ = doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) := hCand.symm + +theorem maximizer_exists_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ P Q : BlockVec d, DoubledResponseMaximizerExists U a P Q := by + intro P Q + rcases P with ⟨p, q⟩ + rcases Q with ⟨qStar, pStar⟩ + rcases responseMaximizerExists_of_isEllipticFieldOn U a hEll + (p - pStar) (qStar - q) with + ⟨v, _hvMean, hv⟩ + have hEllAdj : + IsEllipticFieldOn a.transpose.lam a.transpose.Lam (U : Set (Vec d)) + a.transpose.toCoeffField := by + simpa [Homogenization.adjointCoeffField] using! + isEllipticFieldOn_adjointCoeffField hEll + rcases responseMaximizerExists_of_isEllipticFieldOn U a.transpose hEllAdj + (pStar + p) (qStar + q) with + ⟨vStar, _hvStarMean, hvStar⟩ + exact + ⟨doubledFieldOfScalarMaximizers a v vStar, + scalar_maximizers_give_doubled_maximizer_of_isEllipticFieldOn + U a hEll p pStar q qStar v vStar hv hvStar⟩ + +theorem doubled_maximizer_sameAE_scalar_maximizers_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ∀ p pStar q qStar : Vec d, ∀ X : DoubledField d, + IsDoubledResponseMaximizer U a (p, q) (qStar, pStar) X → + ∃ v : Solution U a, ∃ vStar : Solution U a.transpose, + Book.Ch02.IsResponseMaximizer U a (p - pStar) (qStar - q) v ∧ + Book.Ch02.IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStar ∧ + DoubledField.SameAE (U := U) X (doubledFieldOfScalarMaximizers a v vStar) := by + intro p pStar q qStar X hXmax + have hOld : + BlockResponseSpace a.toCoeffField (U : Set (Vec d)) (blockStateOfDoubled X) := + blockResponseSpace_of_isDoubledResponseField_of_isEllipticFieldOn U a hEll hXmax.1 + have hLowerL2 : + MemVectorL2 (U : Set (Vec d)) + (fun x => + (blockMatVecMul (blockCoeffField a.toCoeffField x) + ((blockStateOfDoubled X).eval x)).2) := by + exact + lowerImage_memVectorL2_of_memVectorL2_of_isEllipticFieldOn + (a := a.toCoeffField) (X := blockStateOfDoubled X) + hXmax.1.1.1.1 hXmax.1.1.2.1 hEll + rcases + exists_blockResponsePairHalfState_ae_eq_of_mem_responseSpace_of_lowerImage_memVectorL2_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a.toCoeffField) U.isDomain hOld hLowerL2 hEll with + ⟨v, vStarOld, hhalf⟩ + let vStar : Solution U a.transpose := by + simpa [Homogenization.adjointCoeffField] using! vStarOld + have hEq : + doubledFieldOfScalarMaximizers a v vStar = + doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField v vStarOld) := by + simpa [vStar, Homogenization.adjointCoeffField] using + doubledFieldOfScalarMaximizers_eq_pairHalf U a v vStar + have hSamePair : + DoubledField.SameAE (U := U) X + (doubledFieldOfBlockState + (blockResponsePairHalfState a.toCoeffField v vStarOld)) := by + constructor + · filter_upwards [hhalf] with x hx + exact (congrArg Prod.fst hx).symm + · filter_upwards [hhalf] with x hx + exact (congrArg Prod.snd hx).symm + have hSame : + DoubledField.SameAE (U := U) X (doubledFieldOfScalarMaximizers a v vStar) := by + rw [hEq] + exact hSamePair + have hValueSame : + doubledResponseValue U a (p, q) (qStar, pStar) X = + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) := + doubledResponseValue_eq_of_sameAE U a (p, q) (qStar, pStar) hSame + have hCandScalar := + doubledResponseValue_scalarPair_eq_scalar_values_of_isEllipticFieldOn + U a hEll p pStar q qStar v vStar + have hMaxValue : + doubledResponseJ U a (p, q) (qStar, pStar) = + doubledResponseValue U a (p, q) (qStar, pStar) X := + doubledResponseJ_eq_value_of_maximizer hXmax + have hBlockSplit := + blockJ_eq_half_responseJ_adjoint_sum_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (a := a.toCoeffField) U.isDomain hEll (domain_volume_pos U).ne' + p pStar q qStar + let val := volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField + (p - pStar) (qStar - q) v) + let valStar := volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) + (pStar + p) (qStar + q) vStar) + let J := ResponseJ (U : Set (Vec d)) (p - pStar) (qStar - q) a.toCoeffField + let JStar := ResponseJ (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) + have hSumEq : + (1 / 2 : ℝ) * val + (1 / 2 : ℝ) * valStar = + (1 / 2 : ℝ) * J + (1 / 2 : ℝ) * JStar := by + calc + (1 / 2 : ℝ) * val + (1 / 2 : ℝ) * valStar = + doubledResponseValue U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a v vStar) := by + simpa [val, valStar] using hCandScalar.symm + _ = doubledResponseValue U a (p, q) (qStar, pStar) X := hValueSame.symm + _ = doubledResponseJ U a (p, q) (qStar, pStar) := hMaxValue.symm + _ = BlockJ (U : Set (Vec d)) (p, q) (qStar, pStar) a.toCoeffField := by + rw [book_doubledResponseJ_eq_BlockJ_of_isEllipticFieldOn U a hEll] + _ = (1 / 2 : ℝ) * J + (1 / 2 : ℝ) * JStar := by + simpa [J, JStar] using hBlockSplit + have hValLe : val ≤ J := by + exact + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEll (domain_volume_pos U).ne' (p - pStar) (qStar - q) + (responseJValueSet_mem (U : Set (Vec d)) (p - pStar) (qStar - q) + a.toCoeffField v) + have hEllAdj : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (Homogenization.adjointCoeffField a.toCoeffField) := + isEllipticFieldOn_adjointCoeffField hEll + have hValStarLe : valStar ≤ JStar := by + exact + le_responseJ_of_mem_responseJValueSet_of_isEllipticFieldOn + hEllAdj (domain_volume_pos U).ne' (pStar + p) (qStar + q) + (responseJValueSet_mem (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) vStar) + have hValEq : val = J := by + nlinarith [hSumEq, hValLe, hValStarLe] + have hValStarEq : valStar = JStar := by + nlinarith [hSumEq, hValLe, hValStarLe] + have hvOld : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (p - pStar) (qStar - q) + a.toCoeffField v := + old_isResponseMaximizer_of_value_eq_responseJ + hEll (domain_volume_pos U).ne' (p - pStar) (qStar - q) v + (by simpa [val, J] using hValEq) + have hvStarOld : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (pStar + p) (qStar + q) + (Homogenization.adjointCoeffField a.toCoeffField) vStar := + old_isResponseMaximizer_of_value_eq_responseJ + hEllAdj (domain_volume_pos U).ne' (pStar + p) (qStar + q) vStar + (by simpa [valStar, JStar] using hValStarEq) + refine ⟨v, vStar, ?_, ?_, hSame⟩ + · exact public_isResponseMaximizer_of_old U a (p - pStar) (qStar - q) v hvOld + · exact + public_isResponseMaximizer_of_old U a.transpose (pStar + p) (qStar + q) vStar + (by simpa [Homogenization.adjointCoeffField] using! hvStarOld) + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Theory.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Theory.lean new file mode 100644 index 0000000000..3dec6353a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/DoubledResponse/Theory.lean @@ -0,0 +1,195 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.DoubledResponse.FirstVariation + +/-! # Theory -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Doubled Response Theory Assembly + +This file is split mechanically out of `Internal.Ch02.DoubledResponse`. +-/ + +theorem doubledResponseTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + DoubledResponseTheory U a where + response_space_by_solutions := + response_space_by_solutions_of_isEllipticFieldOn U a hEll + doubled_response_by_scalar := + doubled_response_by_scalar_of_isEllipticFieldOn U a hEll + scalar_maximizers_give_doubled_maximizer := + scalar_maximizers_give_doubled_maximizer_of_isEllipticFieldOn U a hEll + maximizer_exists := + maximizer_exists_of_isEllipticFieldOn U a hEll + maximizer_unique_ae := + maximizer_unique_ae_of_isEllipticFieldOn U a hEll + maximizer_add_sameAE := + maximizer_add_sameAE_of_isEllipticFieldOn U a hEll + maximizer_smul_sameAE := + maximizer_smul_sameAE_of_isEllipticFieldOn U a hEll + first_variation := + first_variation_of_isEllipticFieldOn U a hEll + +theorem doubledResponseTheory_ofAEEq {d : ℕ} + {U : Domain d} {a b : CoeffOn U} (h : CoeffOn.AEEq a b) + (ha : DoubledResponseTheory U a) : + DoubledResponseTheory U b where + response_space_by_solutions := by + intro X + constructor + · intro hXb + have hXa : IsDoubledResponseField U a X := + IsDoubledResponseField.ofAEEq h.symm hXb + rcases (ha.response_space_by_solutions X).mp hXa with + ⟨va, vStara, hXsame⟩ + refine + ⟨Solution.ofAEEq h va, Solution.ofAEEq h.transpose vStara, + doubledSameAE_trans hXsame ?_⟩ + exact doubledFieldOfSolutions_sameAE_ofAEEq h va vStara + · rintro ⟨vb, vStarb, hXsame⟩ + let va : Solution U a := Solution.ofAEEq h.symm vb + let vStara : Solution U a.transpose := Solution.ofAEEq h.symm.transpose vStarb + have hAfield : + IsDoubledResponseField U a (doubledFieldOfSolutions a va vStara) := by + exact + (ha.response_space_by_solutions + (doubledFieldOfSolutions a va vStara)).mpr + ⟨va, vStara, doubledSameAE_refl _⟩ + have hAfield_b : + IsDoubledResponseField U b (doubledFieldOfSolutions a va vStara) := + IsDoubledResponseField.ofAEEq h hAfield + have hSame : + DoubledField.SameAE (U := U) + (doubledFieldOfSolutions a va vStara) + (doubledFieldOfSolutions b (Solution.ofAEEq h va) + (Solution.ofAEEq h.transpose vStara)) := + doubledFieldOfSolutions_sameAE_ofAEEq h va vStara + have hBfield : + IsDoubledResponseField U b (doubledFieldOfSolutions b vb vStarb) := by + have hSame' : + DoubledField.SameAE (U := U) + (doubledFieldOfSolutions b vb vStarb) + (doubledFieldOfSolutions a va vStara) := by + simpa [va, vStara] using! doubledSameAE_symm hSame + exact isDoubledResponseField_of_sameAE U b hSame' hAfield_b + exact isDoubledResponseField_of_sameAE U b hXsame hBfield + doubled_response_by_scalar := by + intro p pStar q qStar + calc + doubledResponseJ U b (p, q) (qStar, pStar) = + doubledResponseJ U a (p, q) (qStar, pStar) := by + exact (doubledResponseJ_eq_ofAEEq h (p, q) (qStar, pStar)).symm + _ = + (1 / 2 : ℝ) * responseJ U a (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U a.transpose (pStar + p) (qStar + q) := + ha.doubled_response_by_scalar p pStar q qStar + _ = + (1 / 2 : ℝ) * responseJ U b (p - pStar) (qStar - q) + + (1 / 2 : ℝ) * responseJ U b.transpose (pStar + p) (qStar + q) := by + rw [responseJ_eq_ofAEEq h (p - pStar) (qStar - q), + responseJ_eq_ofAEEq h.transpose (pStar + p) (qStar + q)] + scalar_maximizers_give_doubled_maximizer := by + intro p pStar q qStar vb vStarb hvb hvStarb + let va : Solution U a := Solution.ofAEEq h.symm vb + let vStara : Solution U a.transpose := Solution.ofAEEq h.symm.transpose vStarb + have hva : + Book.Ch02.IsResponseMaximizer U a (p - pStar) (qStar - q) va := by + simpa [va] using hvb.ofAEEq h.symm + have hvStara : + Book.Ch02.IsResponseMaximizer U a.transpose (pStar + p) (qStar + q) vStara := by + simpa [vStara] using hvStarb.ofAEEq h.symm.transpose + have hAmax : + IsDoubledResponseMaximizer U a (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a va vStara) := + ha.scalar_maximizers_give_doubled_maximizer p pStar q qStar va vStara hva hvStara + have hAmax_b : + IsDoubledResponseMaximizer U b (p, q) (qStar, pStar) + (doubledFieldOfScalarMaximizers a va vStara) := + IsDoubledResponseMaximizer.ofAEEq h hAmax + have hSame : + DoubledField.SameAE (U := U) + (doubledFieldOfScalarMaximizers b vb vStarb) + (doubledFieldOfScalarMaximizers a va vStara) := by + have hAB := doubledFieldOfScalarMaximizers_sameAE_ofAEEq h va vStara + simpa [va, vStara] using! doubledSameAE_symm hAB + exact + isDoubledResponseMaximizer_of_sameAE U b (p, q) (qStar, pStar) + hSame hAmax_b + maximizer_exists := by + intro P Q + rcases ha.maximizer_exists P Q with ⟨X, hX⟩ + exact ⟨X, IsDoubledResponseMaximizer.ofAEEq h hX⟩ + maximizer_unique_ae := by + intro P Q X Y hX hY + exact ha.maximizer_unique_ae P Q X Y + (IsDoubledResponseMaximizer.ofAEEq h.symm hX) + (IsDoubledResponseMaximizer.ofAEEq h.symm hY) + maximizer_add_sameAE := by + intro P1 Q1 P2 Q2 X12 X1 X2 h12 h1 h2 + exact + ha.maximizer_add_sameAE P1 Q1 P2 Q2 X12 X1 X2 + (IsDoubledResponseMaximizer.ofAEEq h.symm h12) + (IsDoubledResponseMaximizer.ofAEEq h.symm h1) + (IsDoubledResponseMaximizer.ofAEEq h.symm h2) + maximizer_smul_sameAE := by + intro c P Q Xc X hc hX + exact + ha.maximizer_smul_sameAE c P Q Xc X + (IsDoubledResponseMaximizer.ofAEEq h.symm hc) + (IsDoubledResponseMaximizer.ofAEEq h.symm hX) + first_variation := by + intro P Q S T hS hT + have hSa : IsDoubledResponseMaximizer U a P Q S := + IsDoubledResponseMaximizer.ofAEEq h.symm hS + have hTa : IsDoubledResponseField U a T := + IsDoubledResponseField.ofAEEq h.symm hT + have hFirstA := ha.first_variation P Q S T hSa hTa + change + average U (doubledResponseFirstVariationLeft U b P Q T) = + average U (doubledResponseFirstVariationRight U b S T) + calc + average U (doubledResponseFirstVariationLeft U b P Q T) = + average U (doubledResponseFirstVariationLeft U a P Q T) := by + exact (doubledResponseFirstVariationLeft_average_eq_ofAEEq h P Q T).symm + _ = average U (doubledResponseFirstVariationRight U a S T) := hFirstA + _ = average U (doubledResponseFirstVariationRight U b S T) := by + exact doubledResponseFirstVariationRight_average_eq_ofAEEq h S T + +theorem doubledResponseTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + DoubledResponseTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : DoubledResponseTheory U b := + doubledResponseTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact doubledResponseTheory_ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Existence.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Existence.lean new file mode 100644 index 0000000000..357a6804f2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Existence.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.ExistenceDefinitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives + +/-! # Existence -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-- Internal bridge from the old canonical maximizer package to the new public +Chapter 2 existence package. -/ +theorem responseMaximizerExists_of_scalarCanonicalMaximizer {d : ℕ} + (U : Domain d) (a : CoeffOn U) {p q : Vec d} + (v : ScalarCanonicalMaximizer (U : Set (Vec d)) p q a.toCoeffField) : + ResponseMaximizerExists U a p q := by + refine ⟨(v : AHarmonicFunction a.toCoeffField (U : Set (Vec d))), ?_, ?_⟩ + · exact v.meanZero + · exact v.isResponseMaximizer + +/-- Internal pointwise-coefficient bridge. This is not the final public +note-facing theorem: it is the adapter that lets the old Hilbert existence +engine feed the new public package whenever an internal representative has +already been upgraded to pointwise ellipticity. -/ +theorem responseMaximizerExists_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p q : Vec d) : + ResponseMaximizerExists U a p q := by + rcases ScalarCanonicalMaximizer.nonempty_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) + (lam := a.lam) (Lam := a.Lam) + U.nonempty U.isDomain hEll p q with + ⟨v⟩ + exact responseMaximizerExists_of_scalarCanonicalMaximizer U a v + +/-- Internal pointwise-coefficient existence theory. The public a.e. theorem is +proved below by changing representatives first. -/ +theorem responseExistenceTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseExistenceTheory U a where + exists_maximizer := responseMaximizerExists_of_isEllipticFieldOn U a hEll + +/-- Note-facing Chapter 2 response-maximizer existence from the public a.e. +coefficient interface. Pointwise ellipticity is used only for the private +representative `pointwiseCoeffOn U a`, and the result is transported back across +a.e. equality of coefficient representatives. -/ +theorem responseExistenceTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseExistenceTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : ResponseExistenceTheory U b := + responseExistenceTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseExistenceTheory.ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/FirstVariation.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/FirstVariation.lean new file mode 100644 index 0000000000..8d8230266b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/FirstVariation.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.FirstVariationDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence + +/-! # First Variation -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-- Internal pointwise-coefficient first-variation theorem. + +This is the proof-engine bridge only. The public theorem below first replaces +the public a.e. coefficient by a pointwise-good representative, uses this +bridge, and transports the result back across a.e. equality. -/ +theorem responseFirstVariationTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseFirstVariationTheory U a where + first_variation := by + intro p q v hv w + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + have hfirst := + basic_cg_identities_first_variation_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p q v hv w + (hInt.weakFlux v) (hInt.weakFlux w) + (hInt.response p q v) (hInt.firstVariation p q v w) (hInt.energy w) + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField p q v w) = 0 + exact hfirst + +/-- Note-facing Chapter 2 first variation from the public a.e. coefficient +interface. No public pointwise ellipticity, integrability package, or +representative choice is exposed. -/ +theorem responseFirstVariationTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseFirstVariationTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : ResponseFirstVariationTheory U b := + responseFirstVariationTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseFirstVariationTheory.ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientLinearity.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientLinearity.lean new file mode 100644 index 0000000000..f874affe27 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientLinearity.lean @@ -0,0 +1,154 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientLinearityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.FirstVariation +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness + +/-! # Gradient Linearity -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem scalarFirstVariationIntegrand_addOfIntegrable {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) + (p1 q1 p2 q2 : Vec d) (v1 v2 w : AHarmonicFunction a U) + (hv1_int : weakFluxIntegrable U a v1) + (hv2_int : weakFluxIntegrable U a v2) : + scalarFirstVariationIntegrand U a (p1 + p2) (q1 + q2) + (AHarmonicFunction.addOfIntegrable v1 v2 hv1_int hv2_int) w = + scalarFirstVariationIntegrand U a p1 q1 v1 w + + scalarFirstVariationIntegrand U a p2 q2 v2 w := by + funext x + simp [scalarFirstVariationIntegrand, matVecMul_add, vecDot_add_left, + vecDot_add_right, sub_eq_add_neg] + ring + +private theorem scalarFirstVariationIntegrand_smul_solution {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) + (c : ℝ) (p q : Vec d) (v w : AHarmonicFunction a U) : + scalarFirstVariationIntegrand U a (c • p) (c • q) (c • v) w = + c • scalarFirstVariationIntegrand U a p q v w := by + funext x + simp [scalarFirstVariationIntegrand, matVecMul_smul, vecDot_smul_left, + vecDot_smul_right, smul_eq_mul] + ring + +theorem addOfIntegrable_isResponseMaximizer_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p1 q1 p2 q2 : Vec d) (v1 v2 : Solution U a) + (h1 : Book.Ch02.IsResponseMaximizer U a p1 q1 v1) + (h2 : Book.Ch02.IsResponseMaximizer U a p2 q2 v2) : + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (p1 + p2) (q1 + q2) + a.toCoeffField (AHarmonicFunction.addOfIntegrable v1 v2 (hInt.weakFlux v1) + (hInt.weakFlux v2)) := by + intro hInt + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll + intro w + let hFirst := responseFirstVariationTheory_of_isEllipticFieldOn U a hEll + have hzero1 := hFirst.first_variation p1 q1 v1 h1 w + have hzero2 := hFirst.first_variation p2 q2 v2 h2 w + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField p1 q1 v1 w) = 0 + at hzero1 + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField p2 q2 v2 w) = 0 + at hzero2 + rw [scalarFirstVariationIntegrand_addOfIntegrable + (U : Set (Vec d)) a.toCoeffField p1 q1 p2 q2 v1 v2 w + (hInt.weakFlux v1) (hInt.weakFlux v2)] + rw [volumeAverage_add (hInt.firstVariation p1 q1 v1 w) + (hInt.firstVariation p2 q2 v2 w)] + rw [hzero1, hzero2] + ring + +private theorem smul_isResponseMaximizer_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (c : ℝ) (p q : Vec d) (v : Solution U a) + (hv : Book.Ch02.IsResponseMaximizer U a p q v) : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (c • p) (c • q) + a.toCoeffField (c • v) := by + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll + intro w + let hFirst := responseFirstVariationTheory_of_isEllipticFieldOn U a hEll + have hzero := hFirst.first_variation p q v hv w + change + volumeAverage (U : Set (Vec d)) + (scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField p q v w) = 0 + at hzero + rw [scalarFirstVariationIntegrand_smul_solution + (U : Set (Vec d)) a.toCoeffField c p q v w] + rw [volumeAverage_smul] + rw [hzero, mul_zero] + +/-- Internal pointwise-coefficient gradient-linearity theorem. -/ +theorem responseGradientLinearityTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseGradientLinearityTheory U a where + add_gradient := by + intro p1 q1 p2 q2 v12 v1 v2 h12 h1 h2 + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + let vsum : Solution U a := + AHarmonicFunction.addOfIntegrable v1 v2 (hInt.weakFlux v1) (hInt.weakFlux v2) + have hsum : + Book.Ch02.IsResponseMaximizer U a (p1 + p2) (q1 + q2) vsum := by + simpa [vsum, hInt] using! + addOfIntegrable_isResponseMaximizer_of_isEllipticFieldOn + U a hEll p1 q1 p2 q2 v1 v2 h1 h2 + have hUnique := responseGradientUniquenessTheory_of_isEllipticFieldOn U a hEll + have hsame := hUnique.unique_gradient (p1 + p2) (q1 + q2) v12 vsum h12 hsum + simpa [vsum, AHarmonicFunction.grad_addOfIntegrable] using! hsame + smul_gradient := by + intro c p q vc v hc hv + let vscaled : Solution U a := c • v + have hscaled : Book.Ch02.IsResponseMaximizer U a (c • p) (c • q) vscaled := by + exact smul_isResponseMaximizer_of_isEllipticFieldOn U a hEll c p q v hv + have hUnique := responseGradientUniquenessTheory_of_isEllipticFieldOn U a hEll + have hsame := hUnique.unique_gradient (c • p) (c • q) vc vscaled hc hscaled + simpa [vscaled, AHarmonicFunction.grad_smul] using! hsame + +/-- Note-facing Chapter 2 gradient linearity from the public a.e. coefficient +interface. -/ +theorem responseGradientLinearityTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseGradientLinearityTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : ResponseGradientLinearityTheory U b := + responseGradientLinearityTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseGradientLinearityTheory.ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientUniqueness.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientUniqueness.lean new file mode 100644 index 0000000000..678c6551f5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/GradientUniqueness.lean @@ -0,0 +1,190 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.GradientUniquenessDefinitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Foundations.Ellipticity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import Mathlib.MeasureTheory.Measure.OpenPos + +/-! # Gradient Uniqueness -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem grad_eq_zero_ae_of_volumeAverage_energy_eq_zero {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (u : Solution U a) + (hEnergyInt : + MeasureTheory.IntegrableOn + (scalarVariationEnergyIntegrand a.toCoeffField u) (U : Set (Vec d))) + (hEnergyAvg : + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) = 0) : + u.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := by + have hvolPos : 0 < MeasureTheory.volume (U : Set (Vec d)) := + U.isOpen.measure_pos MeasureTheory.volume U.nonempty + have hvolNeZero : MeasureTheory.volume (U : Set (Vec d)) ≠ 0 := + ne_of_gt hvolPos + have hvolNeTop : MeasureTheory.volume (U : Set (Vec d)) ≠ ⊤ := by + have htop : + volumeMeasureOn (U : Set (Vec d)) Set.univ ≠ ⊤ := + MeasureTheory.measure_ne_top (μ := volumeMeasureOn (U : Set (Vec d))) Set.univ + simpa [volumeMeasureOn] using htop + have hvolRealPos : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + ENNReal.toReal_pos hvolNeZero hvolNeTop + have hvolRealNe : (MeasureTheory.volume (U : Set (Vec d))).toReal ≠ 0 := + ne_of_gt hvolRealPos + have hIntegral : + ∫ x in (U : Set (Vec d)), + scalarVariationEnergyIntegrand a.toCoeffField u x ∂MeasureTheory.volume = 0 := by + unfold volumeAverage at hEnergyAvg + exact (mul_eq_zero.mp hEnergyAvg).resolve_left (inv_ne_zero hvolRealNe) + have hNonnegAE : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + 0 ≤ scalarVariationEnergyIntegrand a.toCoeffField u x := by + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with x hxU + exact + scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll u x hxU + have hEnergyAE : + scalarVariationEnergyIntegrand a.toCoeffField u + =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := by + exact + (MeasureTheory.integral_eq_zero_iff_of_nonneg_ae + hNonnegAE hEnergyInt.integrable).1 (by + simpa [volumeMeasureOn] using hIntegral) + filter_upwards + [hEnergyAE, + MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with + x hEnergyZero hxU + have hA := hEll.2 x hxU + have hlower := + lowerBound_symmPart_of_isEllipticMatrix hA (u.toH1.grad x) + have hEnergyPoint : + vecDot (u.toH1.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.toH1.grad x)) = 0 := by + simpa [scalarVariationEnergyIntegrand] using hEnergyZero + have hnormNonneg : 0 ≤ vecNormSq (u.toH1.grad x) := + vecNormSq_nonneg (u.toH1.grad x) + have hnormZero : vecNormSq (u.toH1.grad x) = 0 := by + nlinarith [hA.1, hlower, hEnergyPoint, hnormNonneg] + exact vecNormSq_eq_zero hnormZero + +private theorem volumeAverage_energy_eq_zero_of_sub_maximizer_zero {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (u : Solution U a) + (hu : Homogenization.IsResponseMaximizer + (U : Set (Vec d)) 0 0 a.toCoeffField u) : + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) = 0 := by + have hrespNonneg : + 0 ≤ volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 u) := by + simpa using hu (0 : AHarmonicFunction a.toCoeffField (U : Set (Vec d))) + have hrespEq : + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 u) = + (-(1 / 2 : ℝ)) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) := by + have hfun : + scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 u = + (-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a.toCoeffField u := by + funext x + simp [scalarResponseIntegrand, scalarVariationEnergyIntegrand, smul_eq_mul, + vecDot_zero_left] + calc + volumeAverage (U : Set (Vec d)) + (scalarResponseIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 u) + = volumeAverage (U : Set (Vec d)) + ((-(1 / 2 : ℝ)) • scalarVariationEnergyIntegrand a.toCoeffField u) := by + rw [hfun] + _ = (-(1 / 2 : ℝ)) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) := by + exact volumeAverage_smul (U : Set (Vec d)) (-(1 / 2 : ℝ)) + (scalarVariationEnergyIntegrand a.toCoeffField u) + have hEnergyNonneg : + 0 ≤ volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) := + volumeAverage_scalarVariationEnergyIntegrand_nonneg_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll u + have hEnergyLeZero : + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField u) ≤ 0 := by + nlinarith [hrespNonneg, hrespEq] + exact le_antisymm hEnergyLeZero hEnergyNonneg + +/-- Internal pointwise-coefficient gradient uniqueness theorem. -/ +theorem responseGradientUniquenessTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseGradientUniquenessTheory U a where + unique_gradient := by + intro p q v w hv hw + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + let diff : Solution U a := + AHarmonicFunction.subOfIntegrable v w (hInt.weakFlux v) (hInt.weakFlux w) + have hdiffMax : + Homogenization.IsResponseMaximizer + (U : Set (Vec d)) (p - p) (q - q) a.toCoeffField diff := + basic_cg_identities_sub_isResponseMaximizer_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p q p q hInt v w hv hw + have hdiffMaxZero : + Homogenization.IsResponseMaximizer + (U : Set (Vec d)) 0 0 a.toCoeffField diff := by + simpa using hdiffMax + have hEnergyAvg : + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField diff) = 0 := + volumeAverage_energy_eq_zero_of_sub_maximizer_zero U a hEll diff hdiffMaxZero + have hdiffGradZero : + diff.toH1.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := + grad_eq_zero_ae_of_volumeAverage_energy_eq_zero U a hEll diff + (hInt.energy diff) hEnergyAvg + have hsubGradZero : + (fun x => v.toH1.grad x - w.toH1.grad x) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := by + simpa [diff, AHarmonicFunction.grad_subOfIntegrable] using hdiffGradZero + filter_upwards [hsubGradZero] with x hx + exact sub_eq_zero.mp hx + +/-- Note-facing Chapter 2 gradient uniqueness from the public a.e. coefficient +interface. -/ +theorem responseGradientUniquenessTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseGradientUniquenessTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : ResponseGradientUniquenessTheory U b := + responseGradientUniquenessTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseGradientUniquenessTheory.ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MagicIdentities.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MagicIdentities.lean new file mode 100644 index 0000000000..3e7f2152a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MagicIdentities.lean @@ -0,0 +1,427 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MagicIdentitiesDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.AdjointSymmetry.SigmaAdjoint +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.Basics + +/-! # Magic Identities -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem matLoewnerLE_zero_dim {A B : Mat 0} : + MatLoewnerLE A B := by + intro p + have hp : p = 0 := Subsingleton.elim p 0 + subst p + simp [vecDot, matVecMul] + +private theorem responseJ_zero_zero_of_canonical_identities + (U : Domain 0) (a : CoeffOn U) : + responseJ U a 0 0 = 0 := by + have hM : CanonicalResponseMatrixIdentities U a := + canonicalResponseMatrixIdentities U a + have h := hM.sigmaStarInv_response (0 : Vec 0) + simpa [vecDot, matVecMul] using h + +private theorem responseMagicIdentitiesTheory_zero_dim + (U : Domain 0) (a : CoeffOn U) : + ResponseMagicIdentitiesTheory U a := by + have hJ : responseJ U a (0 : Vec 0) (0 : Vec 0) = 0 := + responseJ_zero_zero_of_canonical_identities U a + have hJAdj : responseJ U a.transpose (0 : Vec 0) (0 : Vec 0) = 0 := + responseJ_zero_zero_of_canonical_identities U a.transpose + refine + { completed_square := ?_ + adjoint_quadratic := ?_ + response_adjoint_sum := ?_ + diagonal_magic := ?_ + sigmaStar_le_sigma := matLoewnerLE_zero_dim + kappa_symm_le_defect := matLoewnerLE_zero_dim + neg_kappa_symm_le_defect := matLoewnerLE_zero_dim } + · intro p q + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + simpa [vecDot, matVecMul, hJ] + · intro p q + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + simpa [vecDot, matVecMul, hJAdj] + · intro p q h + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + have hh : h = 0 := Subsingleton.elim h 0 + subst p + subst q + subst h + have hJa : responseJ U a (0 : Vec 0) ((0 : Vec 0) - 0) = 0 := by + simpa using hJ + have hJb : responseJ U a.transpose (0 : Vec 0) ((0 : Vec 0) + 0) = 0 := by + simpa using hJAdj + rw [hJa, hJb] + simp [vecDot, matVecMul] + · intro e + have he : e = 0 := Subsingleton.elim e 0 + subst e + have hJa : + responseJ U a (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaStarCoarse U a - Book.Ch02.kappaCoarse U a) + (0 : Vec 0)) = 0 := by + simpa [matVecMul] using! hJ + have hJb : + responseJ U a.transpose (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaStarCoarse U a + Book.Ch02.kappaCoarse U a) + (0 : Vec 0)) = 0 := by + simpa [matVecMul] using! hJAdj + rw [hJa, hJb] + simp [vecDot, matVecMul] + +private theorem responseMagicIdentitiesTheory_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseMagicIdentitiesTheory U a := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨_R, _sigma0, _compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hEllAdj : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) := + isEllipticFieldOn_adjointCoeffField hEll + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEllAdj hvol with + ⟨_RAdj, _sigmaAdj, _compatAdj, hAAdj, _hSInvAdj, hSAdj0, hKAdj0, + hSigmaAdj0, _hSigmaCanonicalAdj⟩ + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField).det := by + exact + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := a.toCoeffField) _R U.isDomain hEll hvol + _compat hS + have hStarAdjEq : + Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaStarCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hKappaAdjEq : + Homogenization.kappaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + -(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := + kappaCoarse_adjointCoeffField_eq_neg_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hSigmaAdjEq : + Homogenization.sigmaCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField) = + Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField := + sigmaCoarse_adjointCoeffField_eq_of_isCoarseBlockMatrix + (U := (U : Set (Vec d))) (a := a.toCoeffField) hA hAAdj + have hdetAdj : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (adjointCoeffField a.toCoeffField)).det := by + simpa [hStarAdjEq] using hdet + have hSigmaCanon : + IsSigmaCoarse (U : Set (Vec d)) a.toCoeffField + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet] using hSigma + have hSAdj : + IsSigmaStarCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) := by + simpa [hStarAdjEq] using hSAdj0 + have hKAdj : + IsKappaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (-(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) := by + simpa [hStarAdjEq, hKappaAdjEq] using hKAdj0 + have hSigmaAdjCanon0 : + IsSigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) + (Homogenization.kappaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField)) := by + simpa [sigmaCoarse_eq_of_isSigmaCoarse hSAdj0 hKAdj0 hSigmaAdj0 hdetAdj] + using hSigmaAdj0 + have hSigmaAdj : + IsSigmaCoarse (U : Set (Vec d)) (adjointCoeffField a.toCoeffField) + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) + (-(Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) := by + simpa [hSigmaAdjEq, hStarAdjEq, hKappaAdjEq] using hSigmaAdjCanon0 + refine + { completed_square := ?_ + adjoint_quadratic := ?_ + response_adjoint_sum := ?_ + diagonal_magic := ?_ + sigmaStar_le_sigma := ?_ + kappa_symm_le_defect := ?_ + neg_kappa_symm_le_defect := ?_ } + · intro p q + calc + responseJ U a p q = + ResponseJ (U : Set (Vec d)) p q a.toCoeffField := + book_responseJ_eq_ResponseJ U a p q + _ = + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) + + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField + + matTranspose + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField)) p) + + (1 / 2 : ℝ) * + vecDot + (q - + matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q - + matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + magic_identity_responseJ_shifted_square_canonical_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) hS hK hSigmaCanon hdet p q + _ = + (1 / 2 : ℝ) * + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot p + (matVecMul (kappaCoarse U a + matTranspose (kappaCoarse U a)) p) + + (1 / 2 : ℝ) * + vecDot + (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a - kappaCoarse U a) p)) := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + · intro p q + calc + responseJ U a.transpose p q = + ResponseJ (U : Set (Vec d)) p q (adjointCoeffField a.toCoeffField) := by + rw [book_responseJ_eq_ResponseJ U a.transpose p q] + rfl + _ = + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) p) - + vecDot p q + + (1 / 2 : ℝ) * + vecDot + (q - + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)⁻¹ + (q - + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + magic_identity_responseJ_adjoint_completed_square_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hSAdj hKAdj hSigmaAdj hdet p q + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) + + (1 / 2 : ℝ) * + vecDot (q - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (kappaCoarse U a) p)) - + vecDot p q := by + rw [← sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS, + ← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + ring + · intro p q h + calc + responseJ U a p (q - h) + responseJ U a.transpose p (q + h) = + ResponseJ (U : Set (Vec d)) p (q - h) a.toCoeffField + + ResponseJ (U : Set (Vec d)) p (q + h) + (adjointCoeffField a.toCoeffField) := by + rw [book_responseJ_eq_ResponseJ U a p (q - h), + book_responseJ_eq_ResponseJ U a.transpose p (q + h)] + rfl + _ = + vecDot p + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) + + vecDot + (q - + matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q - + matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) p)) + + vecDot + (h - + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (h - + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + magic_identity_responseJ_adjoint_sum_canonical_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hSAdj hKAdj hSigmaAdj hdet p q h + _ = + vecDot p (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) p) + + vecDot (q - matVecMul (sigmaStarCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (q - matVecMul (sigmaStarCoarse U a) p)) + + vecDot (h - matVecMul (kappaCoarse U a) p) + (matVecMul (sigmaStarInvCoarse U a) + (h - matVecMul (kappaCoarse U a) p)) := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + · intro e + calc + responseJ U a e + (matVecMul (Book.Ch02.sigmaStarCoarse U a - Book.Ch02.kappaCoarse U a) e) + + responseJ U a.transpose e + (matVecMul (Book.Ch02.sigmaStarCoarse U a + Book.Ch02.kappaCoarse U a) e) = + ResponseJ (U : Set (Vec d)) e + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) e) + a.toCoeffField + + ResponseJ (U : Set (Vec d)) e + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) e) + (adjointCoeffField a.toCoeffField) := by + rw [book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_kappaCoarse_eq_kappaCoarse U a, + book_responseJ_eq_ResponseJ U a e + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) e), + book_responseJ_eq_ResponseJ U a.transpose e + (matVecMul + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField + + Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) e)] + rfl + _ = + vecDot e + (matVecMul + (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField - + Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField) e) := + magic_identity_responseJ_adjoint_diagonal_canonical_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hSAdj hKAdj hSigmaAdj hdet e + _ = + vecDot e (matVecMul (sigmaCoarse U a - sigmaStarCoarse U a) e) := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_sigmaStarCoarse_eq_sigmaStarCoarse U a] + · intro p + change + (1 / 2 : ℝ) * + vecDot p (matVecMul (Book.Ch02.sigmaStarCoarse U a) p) ≤ + (1 / 2 : ℝ) * + vecDot p (matVecMul (Book.Ch02.sigmaCoarse U a) p) + rw [book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a] + have h := + sigmaStarCoarse_le_sigmaCoarse_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hSAdj hKAdj hSigmaAdj hdet p + nlinarith + · intro p + change + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (Book.Ch02.kappaCoarse U a + matTranspose (Book.Ch02.kappaCoarse U a)) p) ≤ + (1 / 2 : ℝ) * + vecDot p + (matVecMul (Book.Ch02.sigmaCoarse U a - Book.Ch02.sigmaStarCoarse U a) p) + rw [book_kappaCoarse_eq_kappaCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] + have h := + kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hSAdj hKAdj hSigmaAdj hdet p + nlinarith + · intro p + change + (1 / 2 : ℝ) * + vecDot p + (matVecMul + (-(Book.Ch02.kappaCoarse U a + matTranspose (Book.Ch02.kappaCoarse U a))) p) ≤ + (1 / 2 : ℝ) * + vecDot p + (matVecMul (Book.Ch02.sigmaCoarse U a - Book.Ch02.sigmaStarCoarse U a) p) + rw [book_kappaCoarse_eq_kappaCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] + simp only [neg_matVecMul, vecDot_neg_right] + have h := + neg_kappaCoarse_add_transpose_le_sigmaCoarse_sub_sigmaStarCoarse_of_isSigmaCoarse + (U := (U : Set (Vec d))) (a := a.toCoeffField) + hS hK hSigmaCanon hdet p + nlinarith + +private theorem responseMagicIdentitiesTheory_of_neZero + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) : + ResponseMagicIdentitiesTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : ResponseMagicIdentitiesTheory U b := + responseMagicIdentitiesTheory_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseMagicIdentitiesTheory.ofAEEq hba hb + +theorem responseMagicIdentitiesTheory + {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseMagicIdentitiesTheory U a := by + by_cases hd : d = 0 + · subst d + exact responseMagicIdentitiesTheory_zero_dim U a + · let : NeZero d := ⟨hd⟩ + exact responseMagicIdentitiesTheory_of_neZero U a + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixExtraction.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixExtraction.lean new file mode 100644 index 0000000000..94005fa8be --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixExtraction.lean @@ -0,0 +1,571 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Existence +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Adapters +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MuRecoveryBlockResponse +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticWrappers +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.MagicIdentities.MuOrdering.EllipticConsequences.SigmaStarPosDef +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.OriginCubeEllipticRecovery.QuadraticMu +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Matrix Extraction -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +theorem domain_volume_pos {d : ℕ} (U : Domain d) : + 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := by + have hpos : 0 < MeasureTheory.volume (U : Set (Vec d)) := + U.isOpen.measure_pos MeasureTheory.volume U.nonempty + have htop : MeasureTheory.volume (U : Set (Vec d)) ≠ ⊤ := + ne_of_lt U.isDomain.volume_lt_top + exact ENNReal.toReal_pos hpos.ne' htop + +/-- On a bounded open convex domain, the canonical closure-based recovery data +realizes the Hilbert minimizer value `muCandidate`. -/ +theorem exists_recoveryData_of_mu_eq_muCandidate_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ∃ R : PotentialSolenoidalL2RecoveryData U, + ∀ P : BlockVec d, + Mu U P a = + ((R.toMuHilbertRealization + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol)).muCandidate P) := by + let hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + hConv + let R : PotentialSolenoidalL2RecoveryData U := + potentialSolenoidalL2RecoveryData_ofSubmoduleClosures_of_potentialZeroTraceClosureRealization + (U := U) hRealize + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + refine ⟨R, ?_⟩ + intro P + have hCandidateLe : + ∀ X : BlockState d, IsBlockMuAdmissible U P X → + (R.toMuHilbertRealization system).muCandidate P ≤ blockEnergyAverage U a X := by + intro X hX + let Y : CorrectionFieldData U := hX.toCorrectionFieldDataOfAdmissible + have hXmemBlock : MemBlockL2 U X.eval := hX.memBlockL2_eval + have hcorr : + Y.toHilbertBlockL2 ∈ R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.correctionSpace := by + exact + R.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData.mem_correctionSpace + Y.potential_memL2 Y.flux_memL2 Y.isPotentialZeroTrace Y.isSolenoidalZeroNormalTrace + have hconst_add : + toHilbertBlockL2OfBlockField (U := U) hXmemBlock = + blockVecToHilbertBlockL2Const (U := U) P + Y.toHilbertBlockL2 := by + simpa [Y] using hX.toHilbertBlockL2OfBlockField_eq_blockVecToHilbertBlockL2Const_add + have hcorr_mem : + toHilbertBlockL2OfBlockField (U := U) hXmemBlock - + (R.toMuHilbertRealization system).constantField P ∈ + (R.toMuHilbertRealization system).correctionSpace.correctionSpace := by + rw [hconst_add] + simpa [R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator, + sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using hcorr + have hMin : + (R.toMuHilbertRealization system).muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) := by + simpa [R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization, + MuOperatorSystemData.toMuHilbertRealization, + MuOperatorRealization.toMuHilbertRealization, MuHilbertRealization.ofOperator] using + (R.toMuHilbertRealization system).muCandidate_le_quadraticEnergy P + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) hcorr_mem + calc + (R.toMuHilbertRealization system).muCandidate P ≤ + quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) hXmemBlock) := hMin + _ = blockEnergyAverage U a X := by + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := X) hXmemBlock + have hrecEnergy : + blockEnergyAverage U a ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) = + (R.toMuHilbertRealization system).muCandidate P := by + let H : MuHilbertRealization U a := R.toMuHilbertRealization system + have hminim : + toHilbertBlockL2OfBlockField (U := U) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P) = + H.minimizerMap P := by + simpa [H, R, system, PotentialSolenoidalL2RecoveryData.toMuHilbertRealization] using! + (R.toMuCorrectionSpaceRecoveryData).recoveredField_minimizer_eq system P + calc + blockEnergyAverage U a ((R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + = quadraticEnergy + (energyBilinOfOperator system.toMuOperatorRealization.operator) + (toHilbertBlockL2OfBlockField (U := U) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P)) := by + symm + exact + system.toMuOperatorRealization.quadraticEnergy_eq_blockEnergyAverage_of_blockState + (X := (R.toMuCorrectionSpaceRecoveryData).recoveredField system P) + ((R.toMuCorrectionSpaceRecoveryData).recoveredField_memBlockL2 system P) + _ = quadraticEnergy H.energyBilin (H.minimizerMap P) := by + rw [hminim] + rfl + _ = H.muCandidate P := by + rfl + _ = (R.toMuHilbertRealization system).muCandidate P := by + rfl + have hBddBelow : BddBelow (muValueSet U P a) := by + refine ⟨vecDot P.1 P.2, ?_⟩ + intro m hm + rcases hm with ⟨X, hX, rfl⟩ + exact + hX.blockEnergyAverage_ge_vecDot_of_integral_eq_zero_of_isEllipticFieldOn + (a := a) + (hX.toBlockMuIntegrabilityDataOfIsEllipticFieldOn (a := a) hEll) + hEll + (by + simpa [sub_eq_add_neg] using + (IsPotentialZeroTraceOn.integral_eq_zero hX.isPotentialZeroTrace)) + (by + simpa [sub_eq_add_neg] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hConv.isSobolevRegularDomain + hX.isSolenoidalZeroNormalTrace)) + hvol.ne' + have hUpper : + Mu U P a ≤ (R.toMuHilbertRealization system).muCandidate P := by + let Xrec : BlockState d := (R.toMuCorrectionSpaceRecoveryData).recoveredField system P + have hAdm : IsBlockMuAdmissible U P Xrec := by + simpa [Xrec] using (R.toMuCorrectionSpaceRecoveryData).recoveredField_admissible system P + calc + Mu U P a ≤ blockEnergyAverage U a Xrec := by + exact csInf_le hBddBelow (muValueSet_mem hAdm) + _ = (R.toMuHilbertRealization system).muCandidate P := hrecEnergy + have hLower : + (R.toMuHilbertRealization system).muCandidate P ≤ Mu U P a := by + apply le_Mu_of_forall_isBlockMuAdmissible + intro X hX + exact hCandidateLe X hX + exact le_antisymm hUpper hLower + +/-- Internal package of old coarse-matrix data, with all recovery and +compatibility witnesses hidden behind bounded-open-convex domain hypotheses. -/ +theorem exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hConv : IsOpenBoundedConvexDomain U) + {lam Lam : ℝ} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ∃ R : PotentialSolenoidalL2RecoveryData U, + ∃ sigma0 : Mat d, + ∃ _compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R + (R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol), + IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a) ∧ + IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) ∧ + IsSigmaStarCoarse U a (sigmaStarCoarse U a) ∧ + IsKappaCoarse U a (sigmaStarCoarse U a) (kappaCoarse U a) ∧ + IsSigmaCoarse U a sigma0 (sigmaStarCoarse U a) (kappaCoarse U a) ∧ + IsSigmaCanonicalCoarse U a (sigmaCoarse U a) := by + rcases + exists_recoveryData_of_mu_eq_muCandidate_of_isOpenBoundedConvexDomain + (U := U) hConv hEll hvol with + ⟨R, hMuEq⟩ + let system : MuOperatorSystemData U a := + R.toMuOperatorSystemDataOfIsEllipticFieldOn hEll hvol + have compat : + PotentialSolenoidalL2RecoveryData.MuRecoveryCompatibilityData (a := a) R system := by + simpa [system] using! + R.muRecoveryCompatibilityData_of_isEllipticFieldOn_of_mu_eq_muCandidate + hEll hvol hMuEq + have hex : ∃ Abar : BlockMat d, IsCoarseBlockMatrix U a Abar := + R.exists_coarseBlockMatrixOfIsEllipticFieldOn hEll hvol compat + have hAcoarse : IsCoarseBlockMatrix U a (coarseBlockMatrix U a) := + isCoarseBlockMatrix_coarseBlockMatrix hex + have hMuRespQ : + ∀ q : Vec d, Mu U (0, q) a = ResponseJ U 0 q a := by + intro q + exact R.mu_zero_right_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol compat q + have hMuRespP : + ∀ p : Vec d, Mu U (p, 0) a = ResponseJ U p 0 a := by + intro p + exact R.mu_left_zero_eq_responseJ_zero_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol compat p + have hResp : + ∀ p q : Vec d, ResponseJ U p q a = Mu U (-p, q) a - vecDot p q := by + intro p q + exact R.responseJ_eq_mu_neg_left_sub_vecDot_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + hConv hEll hvol compat p q + have hSInvLower : + IsSigmaStarInvCoarse U a (coarseBlockMatrix U a).lowerRight := + isSigmaStarInvCoarse_coarseBlockMatrix_lowerRight_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuRespQ + have hSInv : IsSigmaStarInvCoarse U a (sigmaStarInvCoarse U a) := + isSigmaStarInvCoarse_sigmaStarInvCoarse + ⟨(coarseBlockMatrix U a).lowerRight, hSInvLower⟩ + have hMlower : + IsSigmaStarInvKappaCoarse U a (-(coarseBlockMatrix U a).lowerLeft) := + isSigmaStarInvKappaCoarse_neg_coarseBlockMatrix_lowerLeft_of_exact_slices + (U := U) (a := a) hex hMuRespQ hMuRespP hResp + have hM : IsSigmaStarInvKappaCoarse U a (sigmaStarInvKappaCoarse U a) := + isSigmaStarInvKappaCoarse_sigmaStarInvKappaCoarse + ⟨-(coarseBlockMatrix U a).lowerLeft, hMlower⟩ + have hdetInv : IsUnit (sigmaStarInvCoarse U a).det := by + have hPos : (sigmaStarInvCoarse U a).PosDef := + sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + R hConv hEll hvol compat + exact (Matrix.isUnit_iff_isUnit_det (A := sigmaStarInvCoarse U a)).mp hPos.isUnit + have hS : IsSigmaStarCoarse U a (sigmaStarCoarse U a) := + isSigmaStarCoarse_sigmaStarCoarse_of_isSigmaStarInvCoarse hSInv hdetInv + have hK : IsKappaCoarse U a (sigmaStarCoarse U a) (kappaCoarse U a) := + isKappaCoarse_kappaCoarse_of_isSigmaStarInvKappaCoarse_of_isUnit_det_sigmaStarInvCoarse + hM hdetInv + let sigma0 : Mat d := + (coarseBlockMatrix U a).upperLeft - + (matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * kappaCoarse U a + have hSigma0 : + IsSigmaCoarse U a sigma0 (sigmaStarCoarse U a) (kappaCoarse U a) := by + refine ⟨?_, ?_⟩ + · have hUpperSymm : ((coarseBlockMatrix U a).upperLeft).IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + simpa [blockMatEntry] using (hAcoarse.1 (Sum.inl i) (Sum.inl j)).symm + have hCorrSymm : + (((matTranspose (kappaCoarse U a)) * sigmaStarInvCoarse U a * + kappaCoarse U a)).IsSymm := + transpose_mul_symm_mul_isSymm (kappaCoarse U a) (sigmaStarInvCoarse U a) hSInv.1 + rw [Matrix.IsSymm.ext_iff] + intro i j + simp [sigma0, hUpperSymm.apply i j, hCorrSymm.apply i j] + · intro p + have hRespP : + ResponseJ U p 0 a = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + calc + ResponseJ U p 0 a = Mu U (p, 0) a := (hMuRespP p).symm + _ = + (1 / 2 : ℝ) * blockVecDot (p, 0) + (blockMatVecMul (coarseBlockMatrix U a) (p, 0)) := by + simpa using hAcoarse.2 (p, 0) + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseBlockMatrix U a).upperLeft p) := by + simp [blockMatVecMul, blockVecDot, matVecMul_zero, vecDot_zero_left] + have hInvEq : (sigmaStarCoarse U a)⁻¹ = sigmaStarInvCoarse U a := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + rw [hRespP, hInvEq] + simp [sigma0, sub_eq_add_neg, add_matVecMul, neg_matVecMul, vecDot_add_right, + vecDot_neg_right, matVecMul_mul, Matrix.mul_assoc] + ring_nf + have hdetS : IsUnit (sigmaStarCoarse U a).det := by + unfold sigmaStarCoarse + exact Matrix.isUnit_nonsing_inv_det (A := sigmaStarInvCoarse U a) hdetInv + have hLower : + (coarseBlockMatrix U a).lowerLeft = + -((sigmaStarCoarse U a)⁻¹ * kappaCoarse U a) := by + calc + (coarseBlockMatrix U a).lowerLeft = -(sigmaStarInvKappaCoarse U a) := by + have hEq : + -(coarseBlockMatrix U a).lowerLeft = sigmaStarInvKappaCoarse U a := + eq_sigmaStarInvKappaCoarse_of_isSigmaStarInvKappaCoarse hMlower + simpa using congrArg Neg.neg hEq + _ = -((sigmaStarCoarse U a)⁻¹ * kappaCoarse U a) := by + rw [sigmaStarInvKappaCoarse_eq_mul_of_isKappaCoarse hK] + have hUpper : + (coarseBlockMatrix U a).upperRight = + -((matTranspose (kappaCoarse U a)) * (sigmaStarCoarse U a)⁻¹) := by + have hUpperSymm : + (coarseBlockMatrix U a).upperRight = + matTranspose (coarseBlockMatrix U a).lowerLeft := by + ext i j + simpa [blockMatEntry, matTranspose] using hAcoarse.1 (Sum.inl i) (Sum.inr j) + calc + (coarseBlockMatrix U a).upperRight = + matTranspose (coarseBlockMatrix U a).lowerLeft := hUpperSymm + _ = matTranspose (-((sigmaStarCoarse U a)⁻¹ * kappaCoarse U a)) := by + rw [hLower] + _ = -((matTranspose (kappaCoarse U a)) * (sigmaStarCoarse U a)⁻¹) := by + change Matrix.transpose (-((sigmaStarCoarse U a)⁻¹ * kappaCoarse U a)) = + -((matTranspose (kappaCoarse U a)) * (sigmaStarCoarse U a)⁻¹) + rw [Matrix.transpose_neg, Matrix.transpose_mul, Matrix.transpose_nonsing_inv] + rw [show Matrix.transpose (sigmaStarCoarse U a) = sigmaStarCoarse U a by + simpa [matTranspose] using hS.1.eq] + simp [matTranspose] + have hLowerRight : + (coarseBlockMatrix U a).lowerRight = sigmaStarInvCoarse U a := by + exact + coarseBlockMatrix_lowerRight_eq_sigmaStarInvCoarse_of_mu_zero_right_eq_responseJ_zero + (U := U) (a := a) hex hMuRespQ + have hBlockEq : + blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U a) (kappaCoarse U a) = + coarseBlockMatrix U a := by + refine blockMat_ext ?_ ?_ ?_ ?_ + · simp [blockMatrixOfDeterministicData, bCoarse, sigma0, + sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + · simpa [blockMatrixOfDeterministicData] using hUpper.symm + · simpa [blockMatrixOfDeterministicData] using hLower.symm + · calc + (sigmaStarCoarse U a)⁻¹ = sigmaStarInvCoarse U a := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + _ = (coarseBlockMatrix U a).lowerRight := hLowerRight.symm + have hAblock : + IsCoarseBlockMatrix U a + (blockMatrixOfDeterministicData sigma0 (sigmaStarCoarse U a) (kappaCoarse U a)) := by + rw [hBlockEq] + exact hAcoarse + have hAdet : + IsCoarseBlockMatrix U a (deterministicCoarseBlockMatrix U a) := by + rw [deterministicCoarseBlockMatrix_eq_blockMatrixOfDeterministicData_of_isSigmaCoarse + hS hK hSigma0 hdetS] + exact hAblock + have hSigmaCanonical0 : IsSigmaCanonicalCoarse U a sigma0 := + isSigmaCanonicalCoarse_of_isSigmaCoarse hS hK hSigma0 hdetS + have hSigmaCanonical : IsSigmaCanonicalCoarse U a (sigmaCoarse U a) := + isSigmaCanonicalCoarse_sigmaCoarse ⟨sigma0, hSigmaCanonical0⟩ + exact ⟨R, sigma0, compat, hAdet, hSInv, hS, hK, hSigma0, hSigmaCanonical⟩ + +private theorem responseJ_zero_zero_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseJ (U : Set (Vec d)) 0 0 a.toCoeffField = 0 := by + have hmax0 : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) 0 0 a.toCoeffField + (0 : AHarmonicFunction a.toCoeffField (U : Set (Vec d))) := by + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll + intro w + rw [show + scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 + (0 : AHarmonicFunction a.toCoeffField (U : Set (Vec d))) w = 0 by + funext x + simp [scalarFirstVariationIntegrand, matVecMul_zero, vecDot_zero_left, + vecDot_zero_right]] + exact volumeAverage_zero (U : Set (Vec d)) + have hJ := + responseJ_eq_of_isResponseMaximizer (U : Set (Vec d)) 0 0 a.toCoeffField hmax0 + rw [hJ] + simp [scalarResponseIntegrand_zero] + +private theorem responseJ_zero_zero {d : ℕ} (U : Domain d) (a : CoeffOn U) : + responseJ U a 0 0 = 0 := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : responseJ U b 0 0 = 0 := by + rw [book_responseJ_eq_ResponseJ U b 0 0] + exact responseJ_zero_zero_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + calc + responseJ U a 0 0 = responseJ U b 0 0 := (responseJ_eq_ofAEEq hba 0 0).symm + _ = 0 := hb + +private theorem canonicalResponseMatrixIdentities_zero_dim + (U : Domain 0) (a : CoeffOn U) : + CanonicalResponseMatrixIdentities U a := by + have hJ00 : responseJ U a 0 0 = 0 := responseJ_zero_zero U a + refine + { sigma_symm := coarseMatrices_sigma_isSymm U a + sigmaStarInv_symm := coarseMatrices_sigmaStarInv_isSymm U a + sigmaStarInv_response := ?_ + kappa_response := ?_ + sigma_response := ?_ + full_response := ?_ } + · intro q + have hq : q = 0 := Subsingleton.elim q 0 + subst q + change responseJ U a (0 : Vec 0) (0 : Vec 0) = + (1 / 2 : ℝ) * vecDot (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) (0 : Vec 0)) + simpa [vecDot, matVecMul] using hJ00 + · intro p q + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + change Book.Ch02.mixedResponse U a (0 : Vec 0) (0 : Vec 0) = + vecDot (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + (matVecMul (Book.Ch02.kappaCoarse U a) (0 : Vec 0))) + simpa [Book.Ch02.mixedResponse, vecDot, matVecMul] using hJ00 + · intro p + have hp : p = 0 := Subsingleton.elim p 0 + subst p + change Book.Ch02.sigmaCorrectedResponse U a (coarseMatrices U a) (0 : Vec 0) = + (1 / 2 : ℝ) * vecDot (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaCoarse U a) (0 : Vec 0)) + simpa [Book.Ch02.sigmaCorrectedResponse, vecDot, matVecMul] using hJ00 + · intro p q + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + change responseJ U a (0 : Vec 0) (0 : Vec 0) = + (1 / 2 : ℝ) * vecDot (0 : Vec 0) + (matVecMul (Book.Ch02.sigmaCoarse U a) (0 : Vec 0)) + + (1 / 2 : ℝ) * + vecDot ((0 : Vec 0) + matVecMul (Book.Ch02.kappaCoarse U a) (0 : Vec 0)) + (matVecMul (Book.Ch02.sigmaStarInvCoarse U a) + ((0 : Vec 0) + matVecMul (Book.Ch02.kappaCoarse U a) (0 : Vec 0))) - + vecDot (0 : Vec 0) (0 : Vec 0) + simpa [vecDot, matVecMul] using hJ00 + +theorem canonicalResponseMatrixIdentities_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + CanonicalResponseMatrixIdentities U a := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, sigma0, compat, _hA, hSInv, hS, hK, hSigma, hSigmaCanonical⟩ + refine + { sigma_symm := coarseMatrices_sigma_isSymm U a + sigmaStarInv_symm := coarseMatrices_sigmaStarInv_isSymm U a + sigmaStarInv_response := ?_ + kappa_response := ?_ + sigma_response := ?_ + full_response := ?_ } + · intro q + calc + responseJ U a 0 q = + ResponseJ (U : Set (Vec d)) 0 q a.toCoeffField := + book_responseJ_eq_ResponseJ U a 0 q + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) q) := + hSInv.2 q + _ = (1 / 2 : ℝ) * vecDot q + (matVecMul (coarseMatrices U a).sigmaStarInv q) := by + rw [← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + rfl + · intro p q + calc + mixedResponse U a p q = + ResponseJ (U : Set (Vec d)) p q a.toCoeffField - + ResponseJ (U : Set (Vec d)) p 0 a.toCoeffField - + ResponseJ (U : Set (Vec d)) 0 q a.toCoeffField + vecDot p q := by + simp [mixedResponse, book_responseJ_eq_ResponseJ] + _ = + vecDot q + (matVecMul + ((Homogenization.sigmaStarCoarse (U : Set (Vec d)) a.toCoeffField)⁻¹) + (matVecMul (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + hK p q + _ = + vecDot q + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (matVecMul (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := by + rw [sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + _ = + vecDot q + (matVecMul (coarseMatrices U a).sigmaStarInv + (matVecMul (coarseMatrices U a).kappa p)) := by + rw [← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a] + rfl + · intro p + calc + Book.Ch02.sigmaCorrectedResponse U a (coarseMatrices U a) p = + Homogenization.sigmaCorrectedResponse (U : Set (Vec d)) a.toCoeffField p := by + rw [Book.Ch02.sigmaCorrectedResponse_coarseMatrices] + exact book_canonicalSigmaCorrectedResponse_eq_sigmaCorrectedResponse U a p + _ = + (1 / 2 : ℝ) * vecDot p + (matVecMul (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) p) := + hSigmaCanonical.2 p + _ = + (1 / 2 : ℝ) * vecDot p + (matVecMul (coarseMatrices U a).sigma p) := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a] + rfl + · intro p q + have hOld : + ResponseJ (U : Set (Vec d)) p q a.toCoeffField = + Homogenization.sigmaCorrectedResponse (U : Set (Vec d)) a.toCoeffField p - + vecDot p q + + (1 / 2 : ℝ) * + vecDot + (q + matVecMul (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) := + magic_identity_responseJ_completed_square_canonical_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + R U.isDomain hEll hvol compat hS hK hSigma p q + calc + responseJ U a p q = + ResponseJ (U : Set (Vec d)) p q a.toCoeffField := + book_responseJ_eq_ResponseJ U a p q + _ = + (1 / 2 : ℝ) * vecDot p + (matVecMul (Homogenization.sigmaCoarse (U : Set (Vec d)) a.toCoeffField) p) + + (1 / 2 : ℝ) * + vecDot + (q + matVecMul (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p) + (matVecMul + (Homogenization.sigmaStarInvCoarse (U : Set (Vec d)) a.toCoeffField) + (q + matVecMul + (Homogenization.kappaCoarse (U : Set (Vec d)) a.toCoeffField) p)) - + vecDot p q := by + rw [hOld, hSigmaCanonical.2 p] + ring + _ = + (1 / 2 : ℝ) * vecDot p (matVecMul (coarseMatrices U a).sigma p) + + (1 / 2 : ℝ) * + vecDot (q + matVecMul (coarseMatrices U a).kappa p) + (matVecMul (coarseMatrices U a).sigmaStarInv + (q + matVecMul (coarseMatrices U a).kappa p)) - + vecDot p q := by + rw [← book_sigmaCoarse_eq_sigmaCoarse U a, + ← book_kappaCoarse_eq_kappaCoarse U a, + ← book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] + rfl + +theorem canonicalResponseMatrixIdentities_of_neZero + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) : + CanonicalResponseMatrixIdentities U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : CanonicalResponseMatrixIdentities U b := + canonicalResponseMatrixIdentities_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact CanonicalResponseMatrixIdentities.ofAEEq hba hb + +theorem canonicalResponseMatrixIdentities + {d : ℕ} (U : Domain d) (a : CoeffOn U) : + CanonicalResponseMatrixIdentities U a := by + by_cases hd : d = 0 + · subst d + exact canonicalResponseMatrixIdentities_zero_dim U a + · let : NeZero d := ⟨hd⟩ + exact canonicalResponseMatrixIdentities_of_neZero U a + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixPositivity.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixPositivity.lean new file mode 100644 index 0000000000..a3417937f6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/MatrixPositivity.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction + +/-! # Matrix Positivity -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem sigmaStarInvCoarse_posDef_zero_dim (U : Domain 0) + (a : CoeffOn U) : + (Book.Ch02.sigmaStarInvCoarse U a).PosDef := by + refine Matrix.PosDef.of_dotProduct_mulVec_pos ?_ ?_ + · simpa [Matrix.IsHermitian, Matrix.IsSymm] using + (Book.Ch02.sigmaStarInvCoarse_isSymm U a) + · intro q hq + exact False.elim (hq (Subsingleton.elim q 0)) + +theorem sigmaStarInvCoarse_posDef_of_isEllipticFieldOn {d : ℕ} [NeZero d] + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + (Book.Ch02.sigmaStarInvCoarse U a).PosDef := by + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEll hvol with + ⟨R, _sigma0, compat, _hA, _hSInv, _hS, _hK, _hSigma, _hSigmaCanonical⟩ + have hPos : + (Homogenization.sigmaStarInvCoarse + (U : Set (Vec d)) a.toCoeffField).PosDef := + Homogenization.sigmaStarInvCoarse_posDef_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + R U.isDomain hEll hvol compat + simpa [book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] using hPos + +theorem sigmaStarInvCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (Book.Ch02.sigmaStarInvCoarse U a).PosDef := by + by_cases hd : d = 0 + · subst d + exact sigmaStarInvCoarse_posDef_zero_dim U a + · let : NeZero d := ⟨hd⟩ + let b : CoeffOn U := pointwiseCoeffOn U a + have hb : + (Book.Ch02.sigmaStarInvCoarse U b).PosDef := + sigmaStarInvCoarse_posDef_of_isEllipticFieldOn U b + (by simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + simpa [Book.Ch02.sigmaStarInvCoarse_eq_ofAEEq hba] using hb + +theorem sigmaStarCoarse_posDef {d : ℕ} (U : Domain d) (a : CoeffOn U) : + (Book.Ch02.sigmaStarCoarse U a).PosDef := by + unfold Book.Ch02.sigmaStarCoarse + exact (sigmaStarInvCoarse_posDef U a).inv + +theorem isUnit_det_sigmaStarInvCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + IsUnit (Book.Ch02.sigmaStarInvCoarse U a).det := + (Matrix.isUnit_iff_isUnit_det (A := Book.Ch02.sigmaStarInvCoarse U a)).mp + (sigmaStarInvCoarse_posDef U a).isUnit + +theorem isUnit_det_sigmaStarCoarse {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + IsUnit (Book.Ch02.sigmaStarCoarse U a).det := + (Matrix.isUnit_iff_isUnit_det (A := Book.Ch02.sigmaStarCoarse U a)).mp + (sigmaStarCoarse_posDef U a).isUnit + +theorem responseJ_nonneg {d : ℕ} (U : Domain d) (a : CoeffOn U) + (p q : Vec d) : + 0 ≤ responseJ U a p q := by + rw [book_responseJ_eq_ResponseJ U a p q] + exact Homogenization.responseJ_nonneg (U : Set (Vec d)) p q a.toCoeffField + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Quadraticity.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Quadraticity.lean new file mode 100644 index 0000000000..3b95ce08c1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Quadraticity.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.QuadraticityDefinitions +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientLinearity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.AverageFormulas.BasicVariation + +/-! # Quadraticity -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem responseJ_zero_zero_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseJ (U : Set (Vec d)) 0 0 a.toCoeffField = 0 := by + have hmax0 : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) 0 0 a.toCoeffField + (0 : AHarmonicFunction a.toCoeffField (U : Set (Vec d))) := by + apply isResponseMaximizer_of_firstVariation_eq_zero_of_isEllipticFieldOn + (U : Set (Vec d)) a.toCoeffField hEll + intro w + rw [show + scalarFirstVariationIntegrand (U : Set (Vec d)) a.toCoeffField 0 0 + (0 : AHarmonicFunction a.toCoeffField (U : Set (Vec d))) w = 0 by + funext x + simp [scalarFirstVariationIntegrand, matVecMul_zero, vecDot_zero_left, + vecDot_zero_right]] + exact volumeAverage_zero (U : Set (Vec d)) + have hJ := + responseJ_eq_of_isResponseMaximizer (U : Set (Vec d)) 0 0 a.toCoeffField hmax0 + rw [hJ] + simp [scalarResponseIntegrand_zero] + +private theorem scalarVariationEnergyIntegrand_addOfIntegrable {d : ℕ} + (a : CoeffField d) {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) + (hv_int : weakFluxIntegrable U a v) : + scalarVariationEnergyIntegrand a + (AHarmonicFunction.addOfIntegrable u v hu_int hv_int) = + scalarVariationEnergyIntegrand a u + scalarVariationEnergyIntegrand a v + + (2 : ℝ) • + (fun x => vecDot (v.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + funext x + have hsymm : + vecDot (u.toH1.grad x) (matVecMul (symmPart (a x)) (v.toH1.grad x)) = + vecDot (v.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x)) := by + simpa using vecDot_matVecMul_symmPart_comm (a x) (u.toH1.grad x) (v.toH1.grad x) + unfold scalarVariationEnergyIntegrand + rw [AHarmonicFunction.grad_addOfIntegrable] + simp [matVecMul_add, vecDot_add_left, vecDot_add_right, smul_eq_mul, hsymm] + ring + +private theorem volumeAverage_scalarVariationEnergyIntegrand_addOfIntegrable {d : ℕ} + (U : Set (Vec d)) (a : CoeffField d) (hInt : ResponseLinearIntegrabilityData U a) + (u v : AHarmonicFunction a U) : + volumeAverage U (scalarVariationEnergyIntegrand a + (AHarmonicFunction.addOfIntegrable u v (hInt.weakFlux u) (hInt.weakFlux v))) = + volumeAverage U (scalarVariationEnergyIntegrand a u) + + volumeAverage U (scalarVariationEnergyIntegrand a v) + + 2 * volumeAverage U + (fun x => vecDot (v.toH1.grad x) (matVecMul (symmPart (a x)) (u.toH1.grad x))) := by + rw [scalarVariationEnergyIntegrand_addOfIntegrable a u v (hInt.weakFlux u) (hInt.weakFlux v)] + have hsum : + MeasureTheory.IntegrableOn + (scalarVariationEnergyIntegrand a u + scalarVariationEnergyIntegrand a v) U := by + simpa [MeasureTheory.IntegrableOn] using + (hInt.energy u).integrable.add (hInt.energy v).integrable + rw [volumeAverage_add hsum] + · rw [volumeAverage_add (hInt.energy u) (hInt.energy v)] + rw [volumeAverage_smul] + · simpa [MeasureTheory.IntegrableOn] using (hInt.cross u v).integrable.smul (2 : ℝ) + +theorem responseJ_smul_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (c : ℝ) (p q : Vec d) : + responseJ U a (c • p) (c • q) = c ^ 2 * responseJ U a p q := by + rw [book_responseJ_eq_ResponseJ U a (c • p) (c • q)] + rw [book_responseJ_eq_ResponseJ U a p q] + by_cases hc : c = 0 + · subst c + simp [responseJ_zero_zero_of_isEllipticFieldOn U a hEll] + · exact responseJ_homogeneous (U : Set (Vec d)) p q a.toCoeffField hc + +theorem responseJ_parallelogram_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p1 q1 p2 q2 : Vec d) : + responseJ U a (p1 + p2) (q1 + q2) + + responseJ U a (p1 - p2) (q1 - q2) = + 2 * responseJ U a p1 q1 + 2 * responseJ U a p2 q2 := by + rw [book_responseJ_eq_ResponseJ U a (p1 + p2) (q1 + q2)] + rw [book_responseJ_eq_ResponseJ U a (p1 - p2) (q1 - q2)] + rw [book_responseJ_eq_ResponseJ U a p1 q1] + rw [book_responseJ_eq_ResponseJ U a p2 q2] + let hInt : ResponseLinearIntegrabilityData (U : Set (Vec d)) a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + let hExist : ResponseExistenceTheory U a := + responseExistenceTheory_of_isEllipticFieldOn U a hEll + let v1 : Solution U a := (canonicalMaximizer hExist p1 q1).toSolution + let v2 : Solution U a := (canonicalMaximizer hExist p2 q2).toSolution + let vsum : Solution U a := + AHarmonicFunction.addOfIntegrable v1 v2 (hInt.weakFlux v1) (hInt.weakFlux v2) + have hmax1 : Book.Ch02.IsResponseMaximizer U a p1 q1 v1 := by + simpa [v1] using canonicalMaximizer_isMaximizer hExist p1 q1 + have hmax2 : Book.Ch02.IsResponseMaximizer U a p2 q2 v2 := by + simpa [v2] using canonicalMaximizer_isMaximizer hExist p2 q2 + have hsum : + Homogenization.IsResponseMaximizer (U : Set (Vec d)) (p1 + p2) (q1 + q2) + a.toCoeffField vsum := by + simpa [vsum, hInt] using + addOfIntegrable_isResponseMaximizer_of_isEllipticFieldOn + U a hEll p1 q1 p2 q2 v1 v2 hmax1 hmax2 + have hJplus : + ResponseJ (U : Set (Vec d)) (p1 + p2) (q1 + q2) a.toCoeffField = + (1 / 2 : ℝ) * volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField vsum) := + responseJ_energy_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField (p1 + p2) (q1 + q2) vsum hsum + (hInt.weakFlux vsum) (hInt.response (p1 + p2) (q1 + q2) vsum) + (hInt.firstVariation (p1 + p2) (q1 + q2) vsum vsum) (hInt.energy vsum) + have hJ1 : + ResponseJ (U : Set (Vec d)) p1 q1 a.toCoeffField = + (1 / 2 : ℝ) * volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField v1) := + responseJ_energy_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p1 q1 v1 hmax1 + (hInt.weakFlux v1) (hInt.response p1 q1 v1) + (hInt.firstVariation p1 q1 v1 v1) (hInt.energy v1) + have hJ2 : + ResponseJ (U : Set (Vec d)) p2 q2 a.toCoeffField = + (1 / 2 : ℝ) * volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField v2) := + responseJ_energy_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p2 q2 v2 hmax2 + (hInt.weakFlux v2) (hInt.response p2 q2 v2) + (hInt.firstVariation p2 q2 v2 v2) (hInt.energy v2) + have hsplit : + volumeAverage (U : Set (Vec d)) (scalarVariationEnergyIntegrand a.toCoeffField vsum) = + volumeAverage (U : Set (Vec d)) (scalarVariationEnergyIntegrand a.toCoeffField v1) + + volumeAverage (U : Set (Vec d)) (scalarVariationEnergyIntegrand a.toCoeffField v2) + + 2 * volumeAverage (U : Set (Vec d)) + (fun x => + vecDot (v2.toH1.grad x) (matVecMul (symmPart (a.toCoeffField x)) + (v1.toH1.grad x))) := by + simpa [vsum] using + volumeAverage_scalarVariationEnergyIntegrand_addOfIntegrable + (U : Set (Vec d)) a.toCoeffField hInt v1 v2 + have hpol : + volumeAverage (U : Set (Vec d)) + (fun x => + vecDot (v2.toH1.grad x) (matVecMul (symmPart (a.toCoeffField x)) + (v1.toH1.grad x))) = + ResponseJ (U : Set (Vec d)) p1 q1 a.toCoeffField + + ResponseJ (U : Set (Vec d)) p2 q2 a.toCoeffField - + ResponseJ (U : Set (Vec d)) (p1 - p2) (q1 - q2) a.toCoeffField := + basic_cg_identities_polarization_of_isResponseMaximizer + (U : Set (Vec d)) a.toCoeffField p1 q1 p2 q2 hInt v1 v2 hmax1 hmax2 + nlinarith [hJplus, hJ1, hJ2, hsplit, hpol] + +/-- Internal pointwise-coefficient quadraticity theorem. -/ +theorem responseQuadraticTheory_of_isEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseQuadraticTheory U a where + responseJ_smul := responseJ_smul_of_isEllipticFieldOn U a hEll + responseJ_parallelogram := responseJ_parallelogram_of_isEllipticFieldOn U a hEll + +/-- Note-facing Chapter 2 quadraticity from the public a.e. coefficient +interface. No public pointwise representative or integrability package is +exposed. -/ +theorem responseQuadraticTheory {d : ℕ} (U : Domain d) (a : CoeffOn U) : + ResponseQuadraticTheory U a := by + let b : CoeffOn U := pointwiseCoeffOn U a + have hEll : + IsEllipticFieldOn b.lam b.Lam (U : Set (Vec d)) b.toCoeffField := by + simpa [b] using pointwiseCoeffOn_isEllipticFieldOn U a + have hb : ResponseQuadraticTheory U b := + responseQuadraticTheory_of_isEllipticFieldOn U b hEll + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseCoeffOn_ae_eq U a + exact ResponseQuadraticTheory.ofAEEq hba hb + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Representatives.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Representatives.lean new file mode 100644 index 0000000000..cd460161b9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/Representatives.lean @@ -0,0 +1,452 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Definitions +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Basic +public import Mathlib.MeasureTheory.Function.StronglyMeasurable.AEStronglyMeasurable +public import Mathlib.MeasureTheory.MeasurableSpace.MeasurablyGenerated +public import Mathlib.MeasureTheory.OuterMeasure.AE + +/-! # Representatives -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +theorem matVecMul_smul_one {d : ℕ} (c : ℝ) (x : Vec d) : + matVecMul (c • (1 : Mat d)) x = c • x := by + ext i + simp [matVecMul, Matrix.one_apply] + +theorem isEllipticMatrix_smul_one {d : ℕ} {lam Lam : ℝ} + (hlam : 0 < lam) (hLe : lam ≤ Lam) : + IsEllipticMatrix lam Lam (lam • (1 : Mat d)) := by + refine ⟨hlam, hLe, ?_, ?_⟩ + · intro ξ + rw [matVecMul_smul_one, vecDot_smul_right] + rfl + · intro ξ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam hLe + have hInv_le : Lam⁻¹ ≤ lam⁻¹ := + (inv_le_inv₀ hLam_pos hlam).2 hLe + have hinv : + ((lam • (1 : Mat d))⁻¹ : Mat d) = lam⁻¹ • (1 : Mat d) := by + rw [nonsing_inv_smul lam hlam.ne' (by simp)] + simp + rw [hinv, matVecMul_smul_one, vecDot_smul_right] + exact mul_le_mul_of_nonneg_right hInv_le (vecNormSq_nonneg ξ) + +theorem isSymm_smul_one {d : ℕ} (c : ℝ) : + (c • (1 : Mat d)).IsSymm := by + ext i j + by_cases hij : i = j + · subst j + simp + · have hji : j ≠ i := by + intro hji + exact hij hji.symm + simp [hij, hji] + +/-- A measurable representative of the public coefficient field, assembled +entrywise from the `AEStronglyMeasurable` data. -/ +noncomputable def measurableCoeffField {d : ℕ} (U : Domain d) + (a : CoeffOn U) : CoeffField d := + fun x i j => + (a.aeStronglyMeasurable i j).mk + (fun x : Vec d => restrictCoeffField (U : Set (Vec d)) a.toCoeffField x i j) x + +theorem measurableCoeffField_measurable {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + Measurable (fun x i j => measurableCoeffField U a x i j) := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + exact (a.aeStronglyMeasurable i j).measurable_mk + +theorem measurableCoeffField_entry_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) (i j : Fin d) : + (fun x : Vec d => restrictCoeffField (U : Set (Vec d)) a.toCoeffField x i j) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x : Vec d => measurableCoeffField U a x i j := + (a.aeStronglyMeasurable i j).ae_eq_mk + +theorem measurableCoeffField_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + measurableCoeffField U a =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := by + have hmem : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), x ∈ (U : Set (Vec d)) := + MeasureTheory.ae_restrict_mem U.measurableSet + have hentries : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), ∀ i j : Fin d, + restrictCoeffField (U : Set (Vec d)) a.toCoeffField x i j = + measurableCoeffField U a x i j := by + exact MeasureTheory.ae_all_iff.2 fun i => + MeasureTheory.ae_all_iff.2 fun j => measurableCoeffField_entry_ae_eq U a i j + filter_upwards [hmem, hentries] with x hxU hxentry + ext i j + simpa [restrictCoeffField, hxU] using (hxentry i j).symm + +theorem measurableCoeffField_aeElliptic {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + IsEllipticMatrix a.lam a.Lam (measurableCoeffField U a x) := by + filter_upwards [measurableCoeffField_ae_eq U a, a.aeElliptic] with x hx hEll + simpa [hx] using hEll + +theorem measurableCoeffField_aeSymmetric {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + (measurableCoeffField U a x).IsSymm := by + filter_upwards [measurableCoeffField_ae_eq U a, hsym] with x hx hsymx + simpa [hx] using hsymx + +structure GoodSetData {d : ℕ} (U : Domain d) (a : CoeffOn U) where + set : Set (Vec d) + ae_mem : set ∈ MeasureTheory.ae (volumeMeasureOn (U : Set (Vec d))) + measurableSet : MeasurableSet set + elliptic : ∀ x ∈ set, IsEllipticMatrix a.lam a.Lam (measurableCoeffField U a x) + +theorem exists_goodSetData {d : ℕ} (U : Domain d) + (a : CoeffOn U) : Nonempty (GoodSetData U a) := by + rcases (measurableCoeffField_aeElliptic U a).exists_measurable_mem with + ⟨E, hEae, hEmeas, hEell⟩ + exact ⟨⟨E, hEae, hEmeas, hEell⟩⟩ + +noncomputable def goodSetData {d : ℕ} (U : Domain d) + (a : CoeffOn U) : GoodSetData U a := + Classical.choice (exists_goodSetData U a) + +structure GoodSymmetricSetData {d : ℕ} (U : Domain d) (a : CoeffOn U) + (hsym : CoeffOn.IsSymmetric a) where + set : Set (Vec d) + ae_mem : set ∈ MeasureTheory.ae (volumeMeasureOn (U : Set (Vec d))) + measurableSet : MeasurableSet set + elliptic : ∀ x ∈ set, IsEllipticMatrix a.lam a.Lam (measurableCoeffField U a x) + symmetric : ∀ x ∈ set, (measurableCoeffField U a x).IsSymm + +theorem exists_goodSymmetricSetData {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + Nonempty (GoodSymmetricSetData U a hsym) := by + have hboth : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + IsEllipticMatrix a.lam a.Lam (measurableCoeffField U a x) ∧ + (measurableCoeffField U a x).IsSymm := + (measurableCoeffField_aeElliptic U a).and + (measurableCoeffField_aeSymmetric U a hsym) + rcases hboth.exists_measurable_mem with ⟨E, hEae, hEmeas, hEboth⟩ + exact ⟨⟨E, hEae, hEmeas, fun x hx => (hEboth x hx).1, + fun x hx => (hEboth x hx).2⟩⟩ + +noncomputable def goodSymmetricSetData {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + GoodSymmetricSetData U a hsym := + Classical.choice (exists_goodSymmetricSetData U a hsym) + +/-- Internal pointwise-good representative of the public a.e. coefficient field. +Outside a measurable full-measure good set we insert the scalar matrix +`a.lam • I`, which is uniformly elliptic with the same constants. -/ +noncomputable def pointwiseCoeffField {d : ℕ} (U : Domain d) + (a : CoeffOn U) : CoeffField d := by + classical + exact fun x => + if x ∈ (goodSetData U a).set then + measurableCoeffField U a x + else + a.lam • (1 : Mat d) + +theorem pointwiseCoeffField_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + pointwiseCoeffField U a =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := by + filter_upwards [(goodSetData U a).ae_mem, measurableCoeffField_ae_eq U a] + with x hxGood hxCoeff + simp [pointwiseCoeffField, hxGood, hxCoeff] + +theorem pointwiseCoeffField_measurable {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + Measurable (fun x i j => pointwiseCoeffField U a x i j) := by + classical + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hrep : Measurable fun x : Vec d => measurableCoeffField U a x i j := + (measurable_pi_iff.1 (measurable_pi_iff.1 + (measurableCoeffField_measurable U a) i) j) + have hite : + Measurable fun x : Vec d => + if x ∈ (goodSetData U a).set then + measurableCoeffField U a x i j + else + (a.lam • (1 : Mat d)) i j := + Measurable.ite (by simpa using (goodSetData U a).measurableSet) + hrep measurable_const + convert hite using 1 + funext x + by_cases hxGood : x ∈ (goodSetData U a).set <;> + simp [pointwiseCoeffField, hxGood] + +theorem pointwiseCoeffField_restrict_measurable {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + Measurable + (fun x i j => + restrictCoeffField (U : Set (Vec d)) (pointwiseCoeffField U a) x i j) := by + classical + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hcoeff : Measurable fun x : Vec d => pointwiseCoeffField U a x i j := + (measurable_pi_iff.1 (measurable_pi_iff.1 + (pointwiseCoeffField_measurable U a) i) j) + have hite : + Measurable fun x : Vec d => + if x ∈ (U : Set (Vec d)) then pointwiseCoeffField U a x i j else 0 := + Measurable.ite (by simpa using U.measurableSet) hcoeff measurable_const + convert hite using 1 + funext x + by_cases hxU : x ∈ (U : Set (Vec d)) <;> simp [restrictCoeffField, hxU] + +theorem pointwiseCoeffField_isEllipticFieldOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) (pointwiseCoeffField U a) := by + classical + have hmeas : + Measurable + (fun x i j => + if x ∈ (U : Set (Vec d)) then pointwiseCoeffField U a x i j else 0) := by + convert pointwiseCoeffField_restrict_measurable U a using 1 + funext x i j + by_cases hxU : x ∈ (U : Set (Vec d)) <;> simp [restrictCoeffField, hxU] + refine ⟨hmeas, ?_⟩ + intro x _hxU + by_cases hxGood : x ∈ (goodSetData U a).set + · simpa [pointwiseCoeffField, hxGood] using + (goodSetData U a).elliptic x hxGood + · simpa [pointwiseCoeffField, hxGood] using + isEllipticMatrix_smul_one (d := d) a.lam_pos a.lam_le_Lam + +/-- The pointwise-good representative attached to the public open-cube +coefficient field is pointwise elliptic on the corresponding closed cube. + +The public `CoeffOn` data are a.e.-elliptic on the open cube. The representative +fills the exceptional set by `a.lam • I`, so the same pointwise ellipticity +extends across the half-open/closed cube realization used by the deterministic +proof engines. -/ +theorem pointwiseCoeffField_isEllipticFieldOn_cubeSet {d : ℕ} + (Q : TriadicCube d) (a : CoeffOn (cubeDomain Q)) : + IsEllipticFieldOn a.lam a.Lam (cubeSet Q) + (pointwiseCoeffField (cubeDomain Q) a) := by + classical + have hmeas : + Measurable + (fun x i j => + if x ∈ cubeSet Q then + pointwiseCoeffField (cubeDomain Q) a x i j + else 0) := by + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hcoeff : + Measurable fun x : Vec d => + pointwiseCoeffField (cubeDomain Q) a x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (pointwiseCoeffField_measurable (cubeDomain Q) a) i) j) + exact Measurable.ite (measurableSet_cubeSet Q) hcoeff measurable_const + refine ⟨hmeas, ?_⟩ + intro x _hxQ + by_cases hxGood : x ∈ (goodSetData (cubeDomain Q) a).set + · simpa [pointwiseCoeffField, hxGood] using + (goodSetData (cubeDomain Q) a).elliptic x hxGood + · simpa [pointwiseCoeffField, hxGood] using + isEllipticMatrix_smul_one (d := d) a.lam_pos a.lam_le_Lam + +noncomputable def pointwiseCoeffOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) : CoeffOn U where + toCoeffField := pointwiseCoeffField U a + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + intro i j + have hentry : + Measurable fun x : Vec d => + restrictCoeffField (U : Set (Vec d)) (pointwiseCoeffField U a) x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (pointwiseCoeffField_restrict_measurable U a) i) j) + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards [MeasureTheory.ae_restrict_mem U.measurableSet] with x hxU + exact (pointwiseCoeffField_isEllipticFieldOn U a).2 x hxU + +theorem pointwiseCoeffOn_isEllipticFieldOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + IsEllipticFieldOn (pointwiseCoeffOn U a).lam (pointwiseCoeffOn U a).Lam + (U : Set (Vec d)) (pointwiseCoeffOn U a).toCoeffField := by + simpa [pointwiseCoeffOn] using pointwiseCoeffField_isEllipticFieldOn U a + +theorem pointwiseCoeffOn_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) : + CoeffOn.AEEq (pointwiseCoeffOn U a) a := + pointwiseCoeffField_ae_eq U a + +/-- Pointwise elliptic and pointwise symmetric representative used to consume +old symmetric proof engines while preserving the public a.e. symmetry surface. -/ +noncomputable def pointwiseSymmetricCoeffField {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : CoeffField d := by + classical + exact fun x => + if x ∈ (goodSymmetricSetData U a hsym).set then + measurableCoeffField U a x + else + a.lam • (1 : Mat d) + +theorem pointwiseSymmetricCoeffField_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + pointwiseSymmetricCoeffField U a hsym + =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := by + filter_upwards [(goodSymmetricSetData U a hsym).ae_mem, + measurableCoeffField_ae_eq U a] with x hxGood hxCoeff + simp [pointwiseSymmetricCoeffField, hxGood, hxCoeff] + +theorem pointwiseSymmetricCoeffField_measurable {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + Measurable (fun x i j => pointwiseSymmetricCoeffField U a hsym x i j) := by + classical + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hrep : Measurable fun x : Vec d => measurableCoeffField U a x i j := + (measurable_pi_iff.1 (measurable_pi_iff.1 + (measurableCoeffField_measurable U a) i) j) + have hite : + Measurable fun x : Vec d => + if x ∈ (goodSymmetricSetData U a hsym).set then + measurableCoeffField U a x i j + else + (a.lam • (1 : Mat d)) i j := + Measurable.ite (by simpa using (goodSymmetricSetData U a hsym).measurableSet) + hrep measurable_const + convert hite using 1 + funext x + by_cases hxGood : x ∈ (goodSymmetricSetData U a hsym).set <;> + simp [pointwiseSymmetricCoeffField, hxGood] + +theorem pointwiseSymmetricCoeffField_restrict_measurable {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + Measurable + (fun x i j => + restrictCoeffField (U : Set (Vec d)) + (pointwiseSymmetricCoeffField U a hsym) x i j) := by + classical + refine measurable_pi_iff.2 ?_ + intro i + refine measurable_pi_iff.2 ?_ + intro j + have hcoeff : + Measurable fun x : Vec d => pointwiseSymmetricCoeffField U a hsym x i j := + (measurable_pi_iff.1 (measurable_pi_iff.1 + (pointwiseSymmetricCoeffField_measurable U a hsym) i) j) + have hite : + Measurable fun x : Vec d => + if x ∈ (U : Set (Vec d)) then + pointwiseSymmetricCoeffField U a hsym x i j + else 0 := + Measurable.ite (by simpa using U.measurableSet) hcoeff measurable_const + convert hite using 1 + funext x + by_cases hxU : x ∈ (U : Set (Vec d)) <;> simp [restrictCoeffField, hxU] + +theorem pointwiseSymmetricCoeffField_isEllipticFieldOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) + (pointwiseSymmetricCoeffField U a hsym) := by + classical + have hmeas : + Measurable + (fun x i j => + if x ∈ (U : Set (Vec d)) then + pointwiseSymmetricCoeffField U a hsym x i j + else 0) := by + convert pointwiseSymmetricCoeffField_restrict_measurable U a hsym using 1 + funext x i j + by_cases hxU : x ∈ (U : Set (Vec d)) <;> simp [restrictCoeffField, hxU] + refine ⟨hmeas, ?_⟩ + intro x _hxU + by_cases hxGood : x ∈ (goodSymmetricSetData U a hsym).set + · simpa [pointwiseSymmetricCoeffField, hxGood] using + (goodSymmetricSetData U a hsym).elliptic x hxGood + · simpa [pointwiseSymmetricCoeffField, hxGood] using + isEllipticMatrix_smul_one (d := d) a.lam_pos a.lam_le_Lam + +theorem pointwiseSymmetricCoeffField_isSymmetricCoeffField {d : ℕ} + (U : Domain d) (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + IsSymmetricCoeffField (pointwiseSymmetricCoeffField U a hsym) := by + intro x + by_cases hxGood : x ∈ (goodSymmetricSetData U a hsym).set + · simpa [pointwiseSymmetricCoeffField, hxGood] using + (goodSymmetricSetData U a hsym).symmetric x hxGood + · simp [pointwiseSymmetricCoeffField, hxGood] + +noncomputable def pointwiseSymmetricCoeffOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : CoeffOn U where + toCoeffField := pointwiseSymmetricCoeffField U a hsym + lam := a.lam + Lam := a.Lam + lam_pos := a.lam_pos + lam_le_Lam := a.lam_le_Lam + aeStronglyMeasurable := by + intro i j + have hentry : + Measurable fun x : Vec d => + restrictCoeffField (U : Set (Vec d)) + (pointwiseSymmetricCoeffField U a hsym) x i j := by + exact (measurable_pi_iff.1 (measurable_pi_iff.1 + (pointwiseSymmetricCoeffField_restrict_measurable U a hsym) i) j) + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards [MeasureTheory.ae_restrict_mem U.measurableSet] with x hxU + exact (pointwiseSymmetricCoeffField_isEllipticFieldOn U a hsym).2 x hxU + +theorem pointwiseSymmetricCoeffOn_isEllipticFieldOn {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + IsEllipticFieldOn (pointwiseSymmetricCoeffOn U a hsym).lam + (pointwiseSymmetricCoeffOn U a hsym).Lam + (U : Set (Vec d)) (pointwiseSymmetricCoeffOn U a hsym).toCoeffField := by + simpa [pointwiseSymmetricCoeffOn] using + pointwiseSymmetricCoeffField_isEllipticFieldOn U a hsym + +theorem pointwiseSymmetricCoeffOn_isSymmetricCoeffField {d : ℕ} + (U : Domain d) (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + IsSymmetricCoeffField (pointwiseSymmetricCoeffOn U a hsym).toCoeffField := by + simpa [pointwiseSymmetricCoeffOn] using + pointwiseSymmetricCoeffField_isSymmetricCoeffField U a hsym + +theorem pointwiseSymmetricCoeffOn_ae_eq {d : ℕ} (U : Domain d) + (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + CoeffOn.AEEq (pointwiseSymmetricCoeffOn U a hsym) a := + pointwiseSymmetricCoeffField_ae_eq U a hsym + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SubadditivityScaling.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SubadditivityScaling.lean new file mode 100644 index 0000000000..8b776ac68b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SubadditivityScaling.lean @@ -0,0 +1,398 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SubadditivityScalingDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.MatrixPositivity +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Subadditivity +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.ResponseIdentities.Homogeneity + +/-! # Subadditivity Scaling -/ + +@[expose] public section + +open scoped BigOperators + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +private theorem isEllipticMatrix_smul {d : ℕ} {lam Lam c : ℝ} + {A : Mat d} (hc : 0 < c) (hA : IsEllipticMatrix lam Lam A) : + IsEllipticMatrix (c * lam) (c * Lam) (c • A) := by + rcases hA with ⟨hlam, hlamLam, hlower, hupper⟩ + have hLam : 0 < Lam := lt_of_lt_of_le hlam hlamLam + have hdet : IsUnit A.det := + isUnit_det_of_isEllipticMatrix ⟨hlam, hlamLam, hlower, hupper⟩ + refine ⟨mul_pos hc hlam, mul_le_mul_of_nonneg_left hlamLam (le_of_lt hc), ?_, ?_⟩ + · intro ξ + rw [smul_matVecMul, vecDot_smul_right] + have hmul := mul_le_mul_of_nonneg_left (hlower ξ) (le_of_lt hc) + nlinarith + · intro ξ + have hcne : c ≠ 0 := hc.ne' + have hinv : + ((c • A)⁻¹ : Mat d) = c⁻¹ • A⁻¹ := by + rw [nonsing_inv_smul c hcne hdet] + rw [hinv, smul_matVecMul, vecDot_smul_right] + have hcinv_nonneg : 0 ≤ c⁻¹ := by positivity + have hmul := mul_le_mul_of_nonneg_left (hupper ξ) hcinv_nonneg + have hleft : + (c * Lam)⁻¹ * vecNormSq ξ = + c⁻¹ * (Lam⁻¹ * vecNormSq ξ) := by + field_simp [hcne, hLam.ne'] + rw [hleft] + exact hmul + +private theorem isEllipticFieldOn_smul {d : ℕ} {lam Lam c : ℝ} + {U : Set (Vec d)} {a : CoeffField d} + (hc : 0 < c) (hEll : IsEllipticFieldOn lam Lam U a) : + IsEllipticFieldOn (c * lam) (c * Lam) U (c • a) := by + classical + refine ⟨?_, ?_⟩ + · have hmeas := hEll.1.const_smul c + convert hmeas using 1 + funext x i j + by_cases hx : x ∈ U <;> simp [hx] + · intro x hx + exact isEllipticMatrix_smul hc (hEll.2 x hx) + +/-- Turn an old pointwise elliptic field on a Book domain into a public +`CoeffOn`. This is only an internal bridge from old proof engines to the +a.e.-native public surface. -/ +private noncomputable def coeffOnOfIsEllipticFieldOn {d : ℕ} + (U : Domain d) (a : CoeffField d) {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam (U : Set (Vec d)) a) : CoeffOn U where + toCoeffField := a + lam := lam + Lam := Lam + lam_pos := (hEll.2 (Classical.choose U.nonempty) + (Classical.choose_spec U.nonempty)).1 + lam_le_Lam := (hEll.2 (Classical.choose U.nonempty) + (Classical.choose_spec U.nonempty)).2.1 + aeStronglyMeasurable := by + intro i j + have hentry : + Measurable fun x : Vec d => + restrictCoeffField (U : Set (Vec d)) a x i j := by + classical + have hij := (measurable_pi_iff.1 (measurable_pi_iff.1 hEll.1 i) j) + have heq : + (fun x : Vec d => restrictCoeffField (U : Set (Vec d)) a x i j) + = fun x : Vec d => if x ∈ U.carrier then a x i j else 0 := by + funext x + by_cases hx : x ∈ U.carrier <;> simp [restrictCoeffField, hx] + rw [heq] + exact hij + exact hentry.aestronglyMeasurable + aeElliptic := by + filter_upwards [MeasureTheory.ae_restrict_mem U.measurableSet] with x hx + exact hEll.2 x hx + +private theorem scaled_pointwise_aeeq {d : ℕ} (U : Domain d) + (a b : CoeffOn U) {c : ℝ} (hscaled : CoeffOn.AEScaled c a b) : + let ap : CoeffOn U := pointwiseCoeffOn U a + b.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] + fun x => c • ap.toCoeffField x := by + intro ap + have hap : ap.toCoeffField =ᵐ[volumeMeasureOn (U : Set (Vec d))] a.toCoeffField := by + simpa [ap] using! pointwiseCoeffOn_ae_eq U a + exact hscaled.trans <| hap.symm.mono fun x hx => by + simp [hx] + +private theorem responseJ_homogeneous_public {d : ℕ} + (U : Domain d) (a : CoeffOn U) {c : ℝ} (hc : 0 < c) + {b : CoeffOn U} (hscaled : CoeffOn.AEScaled c a b) (p q : Vec d) : + responseJ U b p q = + responseJ U a ((Real.sqrt c) • p) ((Real.sqrt c)⁻¹ • q) := by + let ap : CoeffOn U := pointwiseCoeffOn U a + have hEllAp : + IsEllipticFieldOn ap.lam ap.Lam (U : Set (Vec d)) ap.toCoeffField := by + simpa [ap] using pointwiseCoeffOn_isEllipticFieldOn U a + let cap : CoeffOn U := + coeffOnOfIsEllipticFieldOn U (c • ap.toCoeffField) + (isEllipticFieldOn_smul hc hEllAp) + have hbcap : CoeffOn.AEEq b cap := by + simpa [cap] using! scaled_pointwise_aeeq U a b hscaled + have hapa : CoeffOn.AEEq ap a := by + simpa [ap] using pointwiseCoeffOn_ae_eq U a + calc + responseJ U b p q = responseJ U cap p q := responseJ_eq_ofAEEq hbcap p q + _ = ResponseJ (U : Set (Vec d)) p q (c • ap.toCoeffField) := by + rw [book_responseJ_eq_ResponseJ U cap p q] + rfl + _ = ResponseJ (U : Set (Vec d)) ((Real.sqrt c) • p) + ((Real.sqrt c)⁻¹ • q) ap.toCoeffField := by + exact responseJ_homogeneous_coeffField (U : Set (Vec d)) p q + ap.toCoeffField hc + _ = responseJ U ap ((Real.sqrt c) • p) ((Real.sqrt c)⁻¹ • q) := by + rw [book_responseJ_eq_ResponseJ U ap ((Real.sqrt c) • p) + ((Real.sqrt c)⁻¹ • q)] + _ = responseJ U a ((Real.sqrt c) • p) ((Real.sqrt c)⁻¹ • q) := by + rw [responseJ_eq_ofAEEq hapa ((Real.sqrt c) • p) ((Real.sqrt c)⁻¹ • q)] + +private theorem oldCanonicalData_of_pointwiseCoeffOn {d : ℕ} [NeZero d] + (U : Domain d) (a : CoeffOn U) : + ∃ sigma0 : Mat d, + IsSigmaStarCoarse (U : Set (Vec d)) (pointwiseCoeffOn U a).toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField) ∧ + IsKappaCoarse (U : Set (Vec d)) (pointwiseCoeffOn U a).toCoeffField + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField) ∧ + IsSigmaCoarse (U : Set (Vec d)) (pointwiseCoeffOn U a).toCoeffField + sigma0 + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField) + (Homogenization.kappaCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField) ∧ + IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) + (pointwiseCoeffOn U a).toCoeffField).det := by + let ap : CoeffOn U := pointwiseCoeffOn U a + have hEllAp : + IsEllipticFieldOn ap.lam ap.Lam (U : Set (Vec d)) ap.toCoeffField := by + simpa [ap] using pointwiseCoeffOn_isEllipticFieldOn U a + let hvol : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) U.isDomain hEllAp hvol with + ⟨R, sigma0, compat, _hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hdet : IsUnit + (Homogenization.sigmaStarCoarse (U : Set (Vec d)) ap.toCoeffField).det := by + exact + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := (U : Set (Vec d))) (a := ap.toCoeffField) R U.isDomain hEllAp hvol + compat hS + exact ⟨sigma0, by simpa [ap] using hS, by simpa [ap] using hK, + by simpa [ap] using hSigma, by simpa [ap] using hdet⟩ + +private theorem coarse_matrices_homogeneous_public_of_neZero {d : ℕ} [NeZero d] + (U : Domain d) (a : CoeffOn U) {c : ℝ} (hc : 0 < c) + {b : CoeffOn U} (hscaled : CoeffOn.AEScaled c a b) : + Book.Ch02.sigmaCoarse U b = c • Book.Ch02.sigmaCoarse U a ∧ + Book.Ch02.sigmaStarCoarse U b = c • Book.Ch02.sigmaStarCoarse U a ∧ + Book.Ch02.kappaCoarse U b = c • Book.Ch02.kappaCoarse U a := by + let ap : CoeffOn U := pointwiseCoeffOn U a + have hEllAp : + IsEllipticFieldOn ap.lam ap.Lam (U : Set (Vec d)) ap.toCoeffField := by + simpa [ap] using pointwiseCoeffOn_isEllipticFieldOn U a + let cap : CoeffOn U := + coeffOnOfIsEllipticFieldOn U (c • ap.toCoeffField) + (isEllipticFieldOn_smul hc hEllAp) + have hbcap : CoeffOn.AEEq b cap := by + simpa [cap] using! scaled_pointwise_aeeq U a b hscaled + have hapa : CoeffOn.AEEq ap a := by + simpa [ap] using pointwiseCoeffOn_ae_eq U a + rcases oldCanonicalData_of_pointwiseCoeffOn U a with + ⟨sigma0, hS, hK, hSigma, hdet⟩ + have hOld := + cg_matrices_homogeneous_coeffField + (U : Set (Vec d)) ap.toCoeffField hS hK hSigma hdet hc + rcases hOld with ⟨hSigmaOld, hStarOld, hKappaOld⟩ + refine ⟨?_, ?_, ?_⟩ + · calc + Book.Ch02.sigmaCoarse U b = + Book.Ch02.sigmaCoarse U cap := sigmaCoarse_eq_ofAEEq hbcap + _ = Homogenization.sigmaCoarse (U : Set (Vec d)) (c • ap.toCoeffField) := by + simpa [cap] using! book_sigmaCoarse_eq_sigmaCoarse U cap + _ = c • Homogenization.sigmaCoarse (U : Set (Vec d)) ap.toCoeffField := + hSigmaOld + _ = c • Book.Ch02.sigmaCoarse U ap := by + rw [book_sigmaCoarse_eq_sigmaCoarse U ap] + _ = c • Book.Ch02.sigmaCoarse U a := by + rw [sigmaCoarse_eq_ofAEEq hapa] + · calc + Book.Ch02.sigmaStarCoarse U b = + Book.Ch02.sigmaStarCoarse U cap := sigmaStarCoarse_eq_ofAEEq hbcap + _ = Homogenization.sigmaStarCoarse (U : Set (Vec d)) (c • ap.toCoeffField) := by + simpa [cap] using! book_sigmaStarCoarse_eq_sigmaStarCoarse U cap + _ = c • Homogenization.sigmaStarCoarse (U : Set (Vec d)) ap.toCoeffField := + hStarOld + _ = c • Book.Ch02.sigmaStarCoarse U ap := by + rw [book_sigmaStarCoarse_eq_sigmaStarCoarse U ap] + _ = c • Book.Ch02.sigmaStarCoarse U a := by + rw [sigmaStarCoarse_eq_ofAEEq hapa] + · calc + Book.Ch02.kappaCoarse U b = + Book.Ch02.kappaCoarse U cap := kappaCoarse_eq_ofAEEq hbcap + _ = Homogenization.kappaCoarse (U : Set (Vec d)) (c • ap.toCoeffField) := by + simpa [cap] using! book_kappaCoarse_eq_kappaCoarse U cap + _ = c • Homogenization.kappaCoarse (U : Set (Vec d)) ap.toCoeffField := + hKappaOld + _ = c • Book.Ch02.kappaCoarse U ap := by + rw [book_kappaCoarse_eq_kappaCoarse U ap] + _ = c • Book.Ch02.kappaCoarse U a := by + rw [kappaCoarse_eq_ofAEEq hapa] + +private theorem coarse_matrices_homogeneous_public {d : ℕ} + (U : Domain d) (a : CoeffOn U) {c : ℝ} (hc : 0 < c) + {b : CoeffOn U} (hscaled : CoeffOn.AEScaled c a b) : + Book.Ch02.sigmaCoarse U b = c • Book.Ch02.sigmaCoarse U a ∧ + Book.Ch02.sigmaStarCoarse U b = c • Book.Ch02.sigmaStarCoarse U a ∧ + Book.Ch02.kappaCoarse U b = c • Book.Ch02.kappaCoarse U a := by + by_cases hd : d = 0 + · subst d + refine ⟨Subsingleton.elim _ _, Subsingleton.elim _ _, Subsingleton.elim _ _⟩ + · let : NeZero d := ⟨hd⟩ + exact coarse_matrices_homogeneous_public_of_neZero U a hc hscaled + +private theorem responseJ_subadditive_public {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ∀ (P : DomainPartition U) (aCell : ∀ i : P.Cell, CoeffOn (P.cell i)), + (∀ i : P.Cell, CoeffOn.RestrictsTo a (aCell i)) → + ∀ p q : Vec d, + responseJ U a p q ≤ + P.weightedAverage fun i => responseJ (P.cell i) (aCell i) p q := by + intro P aCell hCell p q + classical + let : Fintype P.Cell := P.instFintype + rcases P.triadic_realization with ⟨root, depth, hU, e, hcell⟩ + let ap : CoeffOn U := pointwiseCoeffOn U a + have hEllAp : + IsEllipticFieldOn ap.lam ap.Lam (U : Set (Vec d)) ap.toCoeffField := by + simpa [ap] using pointwiseCoeffOn_isEllipticFieldOn U a + have hEllRoot : + IsEllipticFieldOn ap.lam ap.Lam (openCubeSet root) ap.toCoeffField := by + simpa [hU] using hEllAp + have hapa : CoeffOn.AEEq ap a := by + simpa [ap] using pointwiseCoeffOn_ae_eq U a + have hOld : + ResponseJ (openCubeSet root) p q ap.toCoeffField ≤ + descendantsAverage root depth + (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField) := + responseJ_subadditive_openCubeSet_descendantsAtDepth_of_isEllipticFieldOn + depth root ap.toCoeffField hEllRoot p q + have hLeft : + responseJ U a p q = + ResponseJ (openCubeSet root) p q ap.toCoeffField := by + calc + responseJ U a p q = responseJ U ap p q := by + rw [responseJ_eq_ofAEEq hapa p q] + _ = ResponseJ (U : Set (Vec d)) p q ap.toCoeffField := by + rw [book_responseJ_eq_ResponseJ U ap p q] + _ = ResponseJ (openCubeSet root) p q ap.toCoeffField := by + rw [hU] + have hRespCell : + ∀ i : P.Cell, + responseJ (P.cell i) (aCell i) p q = + ResponseJ (openCubeSet ((e i).1)) p q ap.toCoeffField := by + intro i + have hsub : (P.cell i : Set (Vec d)) ⊆ (U : Set (Vec d)) := + P.cell_subset_parent i + have hEllCell : + IsEllipticFieldOn ap.lam ap.Lam (P.cell i : Set (Vec d)) + ap.toCoeffField := + IsEllipticFieldOn.mono hEllAp (P.cell i).measurableSet hsub + let apCell : CoeffOn (P.cell i) := + coeffOnOfIsEllipticFieldOn (P.cell i) ap.toCoeffField hEllCell + have hapaCell : + ap.toCoeffField =ᵐ[volumeMeasureOn (P.cell i : Set (Vec d))] + a.toCoeffField := by + simpa [volumeMeasureOn] using! + (MeasureTheory.ae_restrict_of_ae_restrict_of_subset hsub + (by simpa [volumeMeasureOn, ap] using! pointwiseCoeffOn_ae_eq U a)) + have hAPCell : CoeffOn.AEEq apCell (aCell i) := by + exact hapaCell.trans (hCell i).symm + calc + responseJ (P.cell i) (aCell i) p q = + responseJ (P.cell i) apCell p q := by + rw [responseJ_eq_ofAEEq hAPCell p q] + _ = ResponseJ (P.cell i : Set (Vec d)) p q ap.toCoeffField := by + rw [book_responseJ_eq_ResponseJ (P.cell i) apCell p q] + rfl + _ = ResponseJ (openCubeSet ((e i).1)) p q ap.toCoeffField := by + rw [(hcell i).1] + have hWeighted : + P.weightedAverage (fun i => responseJ (P.cell i) (aCell i) p q) = + descendantsAverage root depth + (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField) := by + let D := descendantsAtDepth root depth + have hcard : Fintype.card P.Cell = D.card := by + calc + Fintype.card P.Cell = Fintype.card {R : TriadicCube d // R ∈ D} := + Fintype.card_congr e + _ = D.card := by + simp [D] + have hsumSubtype : + (∑ s : {R : TriadicCube d // R ∈ D}, + ResponseJ (openCubeSet s.1) p q ap.toCoeffField) = + D.sum (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField) := by + simpa using + (Finset.sum_attach D + (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField)) + have hsumEquiv : + (∑ i : P.Cell, ResponseJ (openCubeSet ((e i).1)) p q ap.toCoeffField) = + ∑ s : {R : TriadicCube d // R ∈ D}, + ResponseJ (openCubeSet s.1) p q ap.toCoeffField := + Fintype.sum_equiv e _ _ fun _ => rfl + unfold DomainPartition.weightedAverage descendantsAverage + calc + ∑ i : P.Cell, P.weight i * responseJ (P.cell i) (aCell i) p q + = ∑ i : P.Cell, + ((Fintype.card P.Cell : ℝ)⁻¹) * + ResponseJ (openCubeSet ((e i).1)) p q ap.toCoeffField := by + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [(hcell i).2, hRespCell i] + _ = (D.card : ℝ)⁻¹ * + ∑ i : P.Cell, + ResponseJ (openCubeSet ((e i).1)) p q ap.toCoeffField := by + rw [hcard] + rw [Finset.mul_sum] + _ = (D.card : ℝ)⁻¹ * + ∑ s : {R : TriadicCube d // R ∈ D}, + ResponseJ (openCubeSet s.1) p q ap.toCoeffField := by + rw [hsumEquiv] + _ = (D.card : ℝ)⁻¹ * + D.sum (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField) := by + rw [hsumSubtype] + calc + responseJ U a p q = + ResponseJ (openCubeSet root) p q ap.toCoeffField := hLeft + _ ≤ descendantsAverage root depth + (fun R => ResponseJ (openCubeSet R) p q ap.toCoeffField) := hOld + _ = P.weightedAverage + (fun i => responseJ (P.cell i) (aCell i) p q) := hWeighted.symm + +theorem responseSubadditivityAndScalingTheory {d : ℕ} + (U : Domain d) (a : CoeffOn U) : + ResponseSubadditivityAndScalingTheory U a := by + refine + { responseJ_subadditive := ?_ + responseJ_homogeneous := ?_ + sigma_homogeneous := ?_ + sigmaStar_homogeneous := ?_ + kappa_homogeneous := ?_ } + · exact responseJ_subadditive_public U a + · intro c hc b hscaled p q + exact responseJ_homogeneous_public U a hc hscaled p q + · intro c hc b hscaled + exact (coarse_matrices_homogeneous_public U a hc hscaled).1 + · intro c hc b hscaled + exact (coarse_matrices_homogeneous_public U a hc hscaled).2.1 + · intro c hc b hscaled + exact (coarse_matrices_homogeneous_public U a hc hscaled).2.2 + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann.lean new file mode 100644 index 0000000000..4cf20bf6d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Theory + +/-! # Symmetric Dirichlet Neumann -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Common.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Common.lean new file mode 100644 index 0000000000..4352ca1e34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Common.lean @@ -0,0 +1,275 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Theorems.SymmetricDirichletNeumannDefinitions +public import LeanPool.CoarseGraining.Homogenization.Book.Ch01.Theorems.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.Bracketing +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.OpenBoundedConvex +public import LeanPool.CoarseGraining.Homogenization.CoarseGraining.Symmetric.VariationalProblems +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.GradientUniqueness +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.MatrixExtraction +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.Representatives +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization + +/-! # Common -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Common Symmetric Dirichlet-Neumann Helpers + +This file is split mechanically out of `Internal.Ch02.SymmetricDirichletNeumann`. +-/ + +theorem memVectorL2_neg_matVecMul_const {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (p : Vec d) : + MemVectorL2 U (fun x => -matVecMul (a x) p) := by + have hp : MemVectorL2 U (fun _ : Vec d => p) := by + simpa using + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (c := p)) + have hbase : MemVectorL2 U (fun x => matVecMul (a x) p) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll hp + simpa [Pi.smul_apply] using! hbase.const_smul (-1 : ℝ) + +theorem memVectorL2_const_vec {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (q : Vec d) : + MemVectorL2 U (fun _ : Vec d => q) := by + simpa using + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (c := q)) + +theorem potentialZeroTraceFieldOn_of_isPotentialZeroTraceOn {d : ℕ} + {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) : + Book.Ch01.PotentialZeroTraceFieldOn U f := by + rcases hf with ⟨φ, rfl⟩ + exact Book.Ch01.potentialZeroTraceFieldOn_of_h10 φ + +theorem isSymmetricDirichletAdmissible_of_isAffineDirichletSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {p : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u) : + IsSymmetricDirichletAdmissible U p u := + potentialZeroTraceFieldOn_of_isPotentialZeroTraceOn + hu.isPotentialZeroTraceOn_grad_sub_const + +theorem exists_zeroTraceGradientAE_of_dirichlet_difference + {d : ℕ} (U : Domain d) (a : CoeffOn U) {p : Vec d} + {u w : H1Function (U : Set (Vec d))} + (hu : IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u) + (hw : IsSymmetricDirichletAdmissible U p w) : + ∃ θ : H10Function (U : Set (Vec d)), + (w - u).grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] + θ.toH1Function.grad := by + rcases hw with ⟨_hwMem, ψ, hψ⟩ + rcases hu.isPotentialZeroTraceOn_grad_sub_const with ⟨φ, hφ⟩ + refine ⟨ψ - φ, ?_⟩ + filter_upwards [hψ] with x hx + have hz : + (w - u).grad x = w.grad x - u.grad x := by + simp + have hθ : + (ψ - φ).toH1Function.grad x = + ψ.toH1Function.grad x - φ.toH1Function.grad x := by + change (ψ.toH1Function - φ.toH1Function).grad x = + ψ.toH1Function.grad x - φ.toH1Function.grad x + simp + rw [hz, hθ, ← hx] + have hφx : + φ.toH1Function.grad x = u.grad x - p := by + simpa using congrFun hφ x + rw [hφx] + ext i + simp [sub_eq_add_neg, add_assoc, add_comm, add_left_comm] + +theorem meanZeroOn_of_h1MeanZeroFunction {d : ℕ} {U : Set (Vec d)} + (u : H1MeanZeroFunction U) : + MeanZeroOn U u.toH1Function.toFun := + u.meanZero + +theorem integrableOn_h1_coefficientEnergyDensity {d : ℕ} + {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (u : H1Function U) : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.grad x) (matVecMul (a x) (u.grad x))) U := by + refine + (integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn + hEll u.grad_memVectorL2).congr_fun ?_ (measurableSet_of_isEllipticFieldOn hEll) + intro x _hx + exact coefficientEnergyDensity_eq_unsymmetrized a u.grad x + +theorem integrableOn_vecDot_const_h1Grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (q : Vec d) (u : H1Function U) : + MeasureTheory.IntegrableOn (fun x => vecDot q (u.grad x)) U := + integrableOn_vecDot_of_memVectorL2 (memVectorL2_const_vec (U := U) q) + u.grad_memVectorL2 + +theorem integrableOn_symmetricNeumannIntegrand_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (q : Vec d) + (u : H1Function U) : + MeasureTheory.IntegrableOn + (fun x => + vecDot q (u.grad x) - + (1 / 2 : ℝ) * vecDot (u.grad x) (matVecMul (a x) (u.grad x))) U := by + exact + (integrableOn_vecDot_const_h1Grad q u).sub + ((integrableOn_h1_coefficientEnergyDensity hEll u).const_mul (1 / 2 : ℝ)) + +theorem integrableOn_symmetricDirichletIntegrand_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (u : H1Function U) : + MeasureTheory.IntegrableOn + (fun x => + (1 / 2 : ℝ) * vecDot (u.grad x) (matVecMul (a x) (u.grad x))) U := + (integrableOn_h1_coefficientEnergyDensity hEll u).const_mul (1 / 2 : ℝ) + +theorem h1_grad_eq_zero_ae_of_volumeAverage_energy_eq_zero {d : ℕ} + (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (u : H1Function (U : Set (Vec d))) + (hEnergyInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x))) + (U : Set (Vec d))) + (hEnergyAvg : + volumeAverage (U : Set (Vec d)) + (fun x => vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x))) = 0) : + u.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := by + have hvolPos : 0 < MeasureTheory.volume (U : Set (Vec d)) := + U.isOpen.measure_pos MeasureTheory.volume U.nonempty + have hvolNeZero : MeasureTheory.volume (U : Set (Vec d)) ≠ 0 := + ne_of_gt hvolPos + have hvolNeTop : MeasureTheory.volume (U : Set (Vec d)) ≠ ⊤ := by + have htop : + volumeMeasureOn (U : Set (Vec d)) Set.univ ≠ ⊤ := + MeasureTheory.measure_ne_top (μ := volumeMeasureOn (U : Set (Vec d))) Set.univ + simpa [volumeMeasureOn] using htop + have hvolRealPos : 0 < (MeasureTheory.volume (U : Set (Vec d))).toReal := + ENNReal.toReal_pos hvolNeZero hvolNeTop + have hvolRealNe : (MeasureTheory.volume (U : Set (Vec d))).toReal ≠ 0 := + ne_of_gt hvolRealPos + have hIntegral : + ∫ x in (U : Set (Vec d)), + vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) + ∂MeasureTheory.volume = 0 := by + unfold volumeAverage at hEnergyAvg + exact (mul_eq_zero.mp hEnergyAvg).resolve_left (inv_ne_zero hvolRealNe) + have hNonnegAE : + ∀ᵐ x ∂ volumeMeasureOn (U : Set (Vec d)), + 0 ≤ vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) := by + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with x hxU + have hnonneg := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll u.grad x hxU + simpa [coefficientEnergyDensity_eq_unsymmetrized] using hnonneg + have hEnergyAE : + (fun x => vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x))) + =ᵐ[volumeMeasureOn (U : Set (Vec d))] 0 := by + exact + (MeasureTheory.integral_eq_zero_iff_of_nonneg_ae + hNonnegAE hEnergyInt.integrable).1 (by + simpa [volumeMeasureOn] using hIntegral) + filter_upwards + [hEnergyAE, + MeasureTheory.ae_restrict_mem (measurableSet_of_isEllipticFieldOn hEll)] with + x hEnergyZero hxU + have hA := hEll.2 x hxU + have hlower := + lowerBound_symmPart_of_isEllipticMatrix hA (u.grad x) + have hEnergyPoint : + vecDot (u.grad x) + (matVecMul (symmPart (a.toCoeffField x)) (u.grad x)) = 0 := by + simpa [vecDot_matVecMul_symmPart] using hEnergyZero + have hnormNonneg : 0 ≤ vecNormSq (u.grad x) := + vecNormSq_nonneg (u.grad x) + have hnormZero : vecNormSq (u.grad x) = 0 := by + nlinarith [hA.1, hlower, hEnergyPoint, hnormNonneg] + exact vecNormSq_eq_zero hnormZero + +theorem h1AverageGradient_eq_of_grad_ae {d : ℕ} (U : Domain d) + {u v : H1Function (U : Set (Vec d))} + (hgrad : + u.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] v.grad) : + h1AverageGradient U u = h1AverageGradient U v := by + ext i + unfold h1AverageGradient averageVec average + congr 1 + exact MeasureTheory.integral_congr_ae <| + hgrad.mono fun x hx => congrArg (fun y : Vec d => y i) hx + +theorem h1AverageFlux_eq_of_grad_ae {d : ℕ} (U : Domain d) + (a : CoeffOn U) {u v : H1Function (U : Set (Vec d))} + (hgrad : + u.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] v.grad) : + h1AverageFlux U a u = h1AverageFlux U a v := by + ext i + unfold h1AverageFlux averageVec average + congr 1 + exact MeasureTheory.integral_congr_ae <| + hgrad.mono fun x hx => by + simp [hx] + +theorem symmetricDirichletNu_eq_of_minimizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {p : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsSymmetricDirichletMinimizer U a p u) : + symmetricDirichletNu U a p = symmetricDirichletEnergyValue U a u := by + unfold symmetricDirichletNu + exact + (show IsLeast (symmetricDirichletValueSet U a p) + (symmetricDirichletEnergyValue U a u) from by + constructor + · exact ⟨u, hu.1, rfl⟩ + · intro y hy + rcases hy with ⟨w, hw, rfl⟩ + exact hu.2 w hw).csInf_eq + +theorem symmetricNeumannNu_eq_of_maximizer {d : ℕ} + {U : Domain d} {a : CoeffOn U} {q : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsSymmetricNeumannMaximizer U a q u) : + symmetricNeumannNu U a q = symmetricNeumannEnergyValue U a q u := by + unfold symmetricNeumannNu + exact + (show IsGreatest (symmetricNeumannValueSet U a q) + (symmetricNeumannEnergyValue U a q u) from by + constructor + · exact ⟨u, rfl⟩ + · intro y hy + rcases hy with ⟨w, rfl⟩ + exact hu w).csSup_eq + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Dirichlet.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Dirichlet.lean new file mode 100644 index 0000000000..861dab10b5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Dirichlet.lean @@ -0,0 +1,361 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Common + +/-! # Dirichlet -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Dirichlet Side + +This file is split mechanically out of `Internal.Ch02.SymmetricDirichletNeumann`. +-/ + +/-- Construct the old affine Dirichlet solution predicate from the zero-trace +Dirichlet RHS solver on a bounded open convex domain. This is an internal +bridge toward the public symmetric Dirichlet minimizer package. -/ +theorem exists_isAffineDirichletSolution_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (p : Vec d) : + ∃ u : H1Function (U : Set (Vec d)), + IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let hSob : IsSobolevRegularDomain Uset := U.isDomain.isSobolevRegularDomain + let uAff : H1Function Uset := + H1Function.affineOnIsSobolevRegularDomain hSob p + let g : Vec d → Vec d := fun x => -matVecMul (a.toCoeffField x) p + have hg : MemVectorL2 Uset g := by + simpa [Uset, g] using memVectorL2_neg_matVecMul_const hEll p + have hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization Uset := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (U := Uset) U.isDomain + let φ : H10Function Uset := + zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a.toCoeffField) (U := Uset) (g := g) (lam := a.lam) (Lam := a.Lam) + hg hRealize (by simpa [Uset] using U.nonempty) hEll + have hφ : + IsZeroTraceDirichletRhsWeakSolution a.toCoeffField Uset φ g := + isZeroTraceDirichletRhsWeakSolution_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a.toCoeffField) (U := Uset) (g := g) (lam := a.lam) (Lam := a.Lam) + hg hRealize (by simpa [Uset] using U.nonempty) hEll + let u : H1Function Uset := uAff + φ.toH1Function + refine ⟨u, ?_⟩ + constructor + · constructor + · exact u.isPotentialOn + · intro ψ + have hpMem : MemVectorL2 Uset (fun x => matVecMul (a.toCoeffField x) p) := by + have hp : MemVectorL2 Uset (fun _ : Vec d => p) := + memVectorL2_const_vec p + exact memVectorL2_matVecMul_of_isEllipticFieldOn hEll hp + have hφFluxMem : + MemVectorL2 Uset + (fun x => matVecMul (a.toCoeffField x) (φ.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + φ.toH1Function.grad_memVectorL2 + have hpInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x)) Uset := + integrableOn_vecDot_of_memVectorL2 hpMem ψ.toH1Function.grad_memVectorL2 + have hφInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a.toCoeffField x) (φ.toH1Function.grad x)) + (ψ.toH1Function.grad x)) Uset := + integrableOn_vecDot_of_memVectorL2 hφFluxMem + ψ.toH1Function.grad_memVectorL2 + have hsplit : + (fun x => + vecDot + (matVecMul (a.toCoeffField x) (u.grad x)) + (ψ.toH1Function.grad x)) = + fun x => + vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x) + + vecDot + (matVecMul (a.toCoeffField x) (φ.toH1Function.grad x)) + (ψ.toH1Function.grad x) := by + funext x + simp [u, uAff, H1Function.affineOnIsSobolevRegularDomain_grad, + matVecMul_add, vecDot_add_left] + calc + ∫ x in Uset, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume + = + ∫ x in Uset, + (vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x) + + vecDot + (matVecMul (a.toCoeffField x) (φ.toH1Function.grad x)) + (ψ.toH1Function.grad x)) ∂MeasureTheory.volume := by + rw [hsplit] + _ = + ∫ x in Uset, + vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume + + ∫ x in Uset, + vecDot + (matVecMul (a.toCoeffField x) (φ.toH1Function.grad x)) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hpInt hφInt] + _ = + ∫ x in Uset, + vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume + + ∫ x in Uset, + vecDot (g x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [hφ ψ] + _ = 0 := by + have hgDef : + (fun x => vecDot (g x) (ψ.toH1Function.grad x)) = + fun x => + -vecDot (matVecMul (a.toCoeffField x) p) + (ψ.toH1Function.grad x) := by + funext x + simp [g, vecDot_neg_left] + rw [hgDef, MeasureTheory.integral_neg] + ring + · have hgrad : + (fun x => u.grad x - p) = φ.toH1Function.grad := by + funext x + simp [u, uAff, H1Function.affineOnIsSobolevRegularDomain_grad, + sub_eq_add_neg, add_assoc] + simpa [hgrad] using φ.isPotentialZeroTraceOn + +theorem symmetricDirichletEnergyValue_eq_of_isAffineDirichletSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {p : Vec d} + {u w : H1Function (U : Set (Vec d))} + (hu : IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u) + (hw : IsSymmetricDirichletAdmissible U p w) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + symmetricDirichletEnergyValue U a w = + symmetricDirichletEnergyValue U a u + + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (fun x => + vecDot ((w - u).grad x) + (matVecMul (a.toCoeffField x) ((w - u).grad x))) := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u + let fU : Vec d → ℝ := + fun x => + (1 / 2 : ℝ) * vecDot (u.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) + let fW : Vec d → ℝ := + fun x => + (1 / 2 : ℝ) * vecDot (w.grad x) (matVecMul (a.toCoeffField x) (w.grad x)) + let fCross : Vec d → ℝ := + fun x => + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) (z.grad x) + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hfU : MeasureTheory.IntegrableOn fU Uset := by + simpa [fU, Uset] using + integrableOn_symmetricDirichletIntegrand_of_isEllipticFieldOn + (U := Uset) hEll u + have hfW : MeasureTheory.IntegrableOn fW Uset := by + simpa [fW, Uset] using + integrableOn_symmetricDirichletIntegrand_of_isEllipticFieldOn + (U := Uset) hEll w + have hfluxMem : + MemVectorL2 Uset + (fun x => matVecMul (a.toCoeffField x) (u.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.grad_memVectorL2 + have hfCross : MeasureTheory.IntegrableOn fCross Uset := by + simpa [fCross, Uset] using + integrableOn_vecDot_of_memVectorL2 hfluxMem z.grad_memVectorL2 + have hfZ : MeasureTheory.IntegrableOn fZ Uset := by + simpa [fZ, Uset] using + integrableOn_h1_coefficientEnergyDensity hEll z + rcases exists_zeroTraceGradientAE_of_dirichlet_difference U a hu hw with + ⟨θ, hθ⟩ + have hcrossZero : volumeAverage Uset fCross = 0 := by + apply volumeAverage_eq_zero_of_integral_eq_zero + calc + ∫ x in Uset, fCross x ∂MeasureTheory.volume = + ∫ x in Uset, + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) + (θ.toH1Function.grad x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact hθ.mono fun x hx => by + have hxz : z.grad x = θ.toH1Function.grad x := by + simpa [z] using hx + simp [fCross, hxz] + _ = 0 := hu.isAHarmonicGradient.2 θ + have hpoint : + fW = + fun x => fU x + fCross x + (1 / 2 : ℝ) * fZ x := by + funext x + have hgradW : w.grad x = u.grad x + z.grad x := by + have hz : + z.grad x = w.grad x - u.grad x := by + simp [z] + rw [hz] + simp [sub_eq_add_neg] + have hsymm : + vecDot (u.grad x) + (matVecMul (a.toCoeffField x) (z.grad x)) = + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) + (z.grad x) := by + calc + vecDot (u.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + = + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) := + vecDot_matVecMul_comm_of_isSymm (ha x) (u.grad x) (z.grad x) + _ = + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) (z.grad x) := by + rw [vecDot_comm] + have hcommZu : + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (u.grad x)) = + vecDot (matVecMul (a.toCoeffField x) (u.grad x)) (z.grad x) := by + rw [vecDot_comm] + simp [fU, fW, fCross, fZ, hgradW, matVecMul_add, vecDot_add_left, + vecDot_add_right, hsymm, hcommZu] + ring_nf + have hvalue : + symmetricDirichletEnergyValue U a w = + symmetricDirichletEnergyValue U a u + + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + calc + symmetricDirichletEnergyValue U a w = + volumeAverage Uset fW := rfl + _ = + volumeAverage Uset + (fun x => fU x + fCross x + (1 / 2 : ℝ) * fZ x) := by + rw [hpoint] + _ = + volumeAverage Uset fU + + volumeAverage Uset fCross + + volumeAverage Uset ((1 / 2 : ℝ) • fZ) := by + have hfU_add_cross : MeasureTheory.IntegrableOn (fU + fCross) Uset := + hfU.add hfCross + have hfZ_smul : + MeasureTheory.IntegrableOn ((1 / 2 : ℝ) • fZ) Uset := by + simpa [Pi.smul_apply, smul_eq_mul] using! + (hfZ.const_mul (1 / 2 : ℝ)) + change + volumeAverage Uset ((fU + fCross) + ((1 / 2 : ℝ) • fZ)) = + volumeAverage Uset fU + + volumeAverage Uset fCross + + volumeAverage Uset ((1 / 2 : ℝ) • fZ) + rw [volumeAverage_add hfU_add_cross hfZ_smul] + rw [volumeAverage_add hfU hfCross] + _ = + symmetricDirichletEnergyValue U a u + + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + rw [hcrossZero, volumeAverage_smul] + change + volumeAverage Uset fU + 0 + (1 / 2 : ℝ) * volumeAverage Uset fZ = + volumeAverage Uset fU + (1 / 2 : ℝ) * volumeAverage Uset fZ + ring + simpa [fZ, z, Uset] using hvalue + +theorem isSymmetricDirichletMinimizer_of_isAffineDirichletSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {p : Vec d} + {u : H1Function (U : Set (Vec d))} + (hu : IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + IsSymmetricDirichletMinimizer U a p u := by + refine ⟨isSymmetricDirichletAdmissible_of_isAffineDirichletSolution U a hu, ?_⟩ + intro w hw + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hvalue := + symmetricDirichletEnergyValue_eq_of_isAffineDirichletSolution + U a hu hw ha hEll + have hvalue' : + symmetricDirichletEnergyValue U a w = + symmetricDirichletEnergyValue U a u + + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + simpa [fZ, z, Uset] using hvalue + have hZNonneg : 0 ≤ volumeAverage Uset fZ := by + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + have hnonneg := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll z.grad x hx + simpa [fZ, coefficientEnergyDensity_eq_unsymmetrized] using hnonneg + nlinarith [hvalue', hZNonneg] + +theorem sameGradientAE_of_isSymmetricDirichletMinimizer_of_isAffineDirichletSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {p : Vec d} + {u w : H1Function (U : Set (Vec d))} + (hu : IsAffineDirichletSolution a.toCoeffField (U : Set (Vec d)) p u) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (hw : IsSymmetricDirichletMinimizer U a p w) : + w.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] u.grad := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hvalue := + symmetricDirichletEnergyValue_eq_of_isAffineDirichletSolution + U a hu hw.1 ha hEll + have hvalue' : + symmetricDirichletEnergyValue U a w = + symmetricDirichletEnergyValue U a u + + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + simpa [fZ, z, Uset] using hvalue + have hselAdm : IsSymmetricDirichletAdmissible U p u := + isSymmetricDirichletAdmissible_of_isAffineDirichletSolution U a hu + have hZNonneg : 0 ≤ volumeAverage Uset fZ := by + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + have hnonneg := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll z.grad x hx + simpa [fZ, coefficientEnergyDensity_eq_unsymmetrized] using hnonneg + have hZLeZero : volumeAverage Uset fZ ≤ 0 := by + have hmin := hw.2 u hselAdm + nlinarith [hvalue'] + have hZZero : volumeAverage Uset fZ = 0 := + le_antisymm hZLeZero hZNonneg + have hfZ : MeasureTheory.IntegrableOn fZ Uset := by + simpa [fZ, z, Uset] using + integrableOn_h1_coefficientEnergyDensity hEll z + have hzZero : z.grad =ᵐ[volumeMeasureOn Uset] 0 := by + simpa [fZ, Uset] using + h1_grad_eq_zero_ae_of_volumeAverage_energy_eq_zero U a hEll z hfZ hZZero + filter_upwards [hzZero] with x hx + have hz : + z.grad x = w.grad x - u.grad x := by + simp [z] + rw [hz] at hx + exact sub_eq_zero.mp hx + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Neumann.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Neumann.lean new file mode 100644 index 0000000000..e6cdff2e29 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Neumann.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Common + +/-! # Neumann -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Neumann Side + +This file is split mechanically out of `Internal.Ch02.SymmetricDirichletNeumann`. +-/ + +/-- Construct the old constant-flux Neumann solution predicate from the +mean-zero Neumann RHS solver on a bounded open convex domain. -/ +theorem exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn + {d : ℕ} (U : Domain d) (a : CoeffOn U) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (q : Vec d) : + ∃ u : H1MeanZeroFunction (U : Set (Vec d)), + IsConstantFluxNeumannSolution a.toCoeffField (U : Set (Vec d)) q u := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let g : Vec d → Vec d := fun _ => q + have hg : MemVectorL2 Uset g := by + simpa [Uset, g] using memVectorL2_const_vec (U := Uset) q + let hC : H1CoerciveEstimate Uset := + h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := Uset) U.isDomain + let u : H1MeanZeroFunction Uset := + H1MeanZeroFunction.coeffGradientProblemSolution + (U := Uset) (a := a.toCoeffField) (lam := a.lam) (Lam := a.Lam) + hg hC (by simpa [Uset] using U.nonempty) hEll + have huWeak : IsMeanZeroNeumannRhsWeakSolution a.toCoeffField Uset u g := + isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + (U := Uset) (a := a.toCoeffField) (lam := a.lam) (Lam := a.Lam) + hg hC (by simpa [Uset] using U.nonempty) hEll + refine ⟨u, ?_⟩ + constructor + · constructor + · exact u.toH1Function.isPotentialOn + · intro φ + have hweak : + ∫ x in Uset, + vecDot + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in Uset, vecDot (g x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := + H1Function.coeffGradientProblemSolution_firstVariation_eq_integral + (U := Uset) (a := a.toCoeffField) (lam := a.lam) (Lam := a.Lam) + hg hC (by simpa [Uset] using U.nonempty) hEll φ.toH1Function + rw [hweak] + simpa [g] using integral_vecDot_const_zeroTraceGrad_eq_zero φ q + · simpa [g] using + huWeak.residual_zeroNormalTrace (hEll := hEll) (hg := hg) + +theorem symmetricNeumannEnergyValue_eq_of_isConstantFluxNeumannSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {q : Vec d} + {u : H1MeanZeroFunction (U : Set (Vec d))} + (hu : IsConstantFluxNeumannSolution a.toCoeffField (U : Set (Vec d)) q u) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + (w : H1Function (U : Set (Vec d))) : + symmetricNeumannEnergyValue U a q w = + symmetricNeumannEnergyValue U a q u.toH1Function - + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (fun x => + vecDot ((w - u.toH1Function).grad x) + (matVecMul (a.toCoeffField x) ((w - u.toH1Function).grad x))) := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u.toH1Function + let fU : Vec d → ℝ := + fun x => + vecDot q (u.toH1Function.grad x) - + (1 / 2 : ℝ) * + vecDot (u.toH1Function.grad x) + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + let fW : Vec d → ℝ := + fun x => + vecDot q (w.grad x) - + (1 / 2 : ℝ) * + vecDot (w.grad x) (matVecMul (a.toCoeffField x) (w.grad x)) + let fRes : Vec d → ℝ := + fun x => + vecDot + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x) - q) + (z.grad x) + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hfU : MeasureTheory.IntegrableOn fU Uset := by + simpa [fU, Uset] using + integrableOn_symmetricNeumannIntegrand_of_isEllipticFieldOn + (U := Uset) hEll q u.toH1Function + have hfW : MeasureTheory.IntegrableOn fW Uset := by + simpa [fW, Uset] using + integrableOn_symmetricNeumannIntegrand_of_isEllipticFieldOn + (U := Uset) hEll q w + have hfluxMem : + MemVectorL2 Uset + (fun x => matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll + u.toH1Function.grad_memVectorL2 + have hresMem : + MemVectorL2 Uset + (fun x => matVecMul (a.toCoeffField x) (u.toH1Function.grad x) - q) := + hfluxMem.sub (memVectorL2_const_vec (U := Uset) q) + have hfRes : MeasureTheory.IntegrableOn fRes Uset := by + simpa [fRes, Uset] using + integrableOn_vecDot_of_memVectorL2 hresMem z.grad_memVectorL2 + have hfZ : MeasureTheory.IntegrableOn fZ Uset := by + simpa [fZ, Uset] using + integrableOn_h1_coefficientEnergyDensity hEll z + have hresZero : + volumeAverage Uset fRes = 0 := by + apply volumeAverage_eq_zero_of_integral_eq_zero + simpa [fRes, z, Uset] using + hu.isSolenoidalZeroNormalTraceOn_flux_sub_const z + have hpoint : + fW = + fun x => fU x - fRes x - (1 / 2 : ℝ) * fZ x := by + funext x + have hgradW : w.grad x = u.toH1Function.grad x + z.grad x := by + have hz : + z.grad x = w.grad x - u.toH1Function.grad x := by + simp [z] + rw [hz] + simp [sub_eq_add_neg] + have hsymm : + vecDot (u.toH1Function.grad x) + (matVecMul (a.toCoeffField x) (z.grad x)) = + vecDot (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + (z.grad x) := by + calc + vecDot (u.toH1Function.grad x) + (matVecMul (a.toCoeffField x) (z.grad x)) + = + vecDot (z.grad x) + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) := + vecDot_matVecMul_comm_of_isSymm (ha x) + (u.toH1Function.grad x) (z.grad x) + _ = + vecDot (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + (z.grad x) := by + rw [vecDot_comm] + have hcommZu : + vecDot (z.grad x) + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) = + vecDot (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + (z.grad x) := by + rw [vecDot_comm] + simp [fU, fW, fRes, fZ, hgradW, matVecMul_add, vecDot_add_left, + vecDot_add_right, hsymm, hcommZu, sub_eq_add_neg, vecDot_neg_left] + ring_nf + have hvalue : + symmetricNeumannEnergyValue U a q w = + symmetricNeumannEnergyValue U a q u.toH1Function - + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + calc + symmetricNeumannEnergyValue U a q w = + volumeAverage Uset fW := rfl + _ = + volumeAverage Uset + (fun x => fU x - fRes x - (1 / 2 : ℝ) * fZ x) := by + rw [hpoint] + _ = + volumeAverage Uset fU - + volumeAverage Uset fRes - + volumeAverage Uset ((1 / 2 : ℝ) • fZ) := by + have hfU_sub_res : MeasureTheory.IntegrableOn (fU - fRes) Uset := + hfU.sub hfRes + have hfZ_smul : + MeasureTheory.IntegrableOn ((1 / 2 : ℝ) • fZ) Uset := by + simpa [Pi.smul_apply, smul_eq_mul] using! + (hfZ.const_mul (1 / 2 : ℝ)) + change + volumeAverage Uset ((fU - fRes) - ((1 / 2 : ℝ) • fZ)) = + volumeAverage Uset fU - + volumeAverage Uset fRes - + volumeAverage Uset ((1 / 2 : ℝ) • fZ) + rw [volumeAverage_sub hfU_sub_res hfZ_smul] + rw [volumeAverage_sub hfU hfRes] + _ = + symmetricNeumannEnergyValue U a q u.toH1Function - + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + rw [hresZero, volumeAverage_smul] + change + volumeAverage Uset fU - 0 - (1 / 2 : ℝ) * volumeAverage Uset fZ = + volumeAverage Uset fU - (1 / 2 : ℝ) * volumeAverage Uset fZ + ring + simpa [fZ, z, Uset] using hvalue + +theorem symmetricNeumannEnergyValue_eq_half_variationEnergy_of_isConstantFluxNeumannSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {q : Vec d} + {u : H1MeanZeroFunction (U : Set (Vec d))} + (hu : IsConstantFluxNeumannSolution a.toCoeffField (U : Set (Vec d)) q u) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + symmetricNeumannEnergyValue U a q u.toH1Function = + (1 / 2 : ℝ) * + volumeAverage (U : Set (Vec d)) + (scalarVariationEnergyIntegrand a.toCoeffField hu.toAHarmonicFunction) := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let fQ : Vec d → ℝ := fun x => vecDot q (u.toH1Function.grad x) + let fE : Vec d → ℝ := + fun x => + vecDot (u.toH1Function.grad x) + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x)) + let fRes : Vec d → ℝ := + fun x => + vecDot + (matVecMul (a.toCoeffField x) (u.toH1Function.grad x) - q) + (u.toH1Function.grad x) + have hfQ : MeasureTheory.IntegrableOn fQ Uset := by + simpa [fQ, Uset] using + integrableOn_vecDot_const_h1Grad (U := Uset) q u.toH1Function + have hfE : MeasureTheory.IntegrableOn fE Uset := by + simpa [fE, Uset] using + integrableOn_h1_coefficientEnergyDensity hEll u.toH1Function + have hresZero : volumeAverage Uset fRes = 0 := by + apply volumeAverage_eq_zero_of_integral_eq_zero + simpa [fRes, Uset] using + hu.isSolenoidalZeroNormalTraceOn_flux_sub_const u.toH1Function + have hresFun : fRes = fE - fQ := by + funext x + simp [fRes, fE, fQ, sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, + vecDot_comm] + have hQE : volumeAverage Uset fQ = volumeAverage Uset fE := by + have hsub : + volumeAverage Uset (fE - fQ) = + volumeAverage Uset fE - volumeAverage Uset fQ := + volumeAverage_sub hfE hfQ + rw [← hresFun, hresZero] at hsub + linarith + have hscalar : + volumeAverage Uset + (scalarVariationEnergyIntegrand a.toCoeffField hu.toAHarmonicFunction) = + volumeAverage Uset fE := by + congr 1 + funext x + simp [fE, scalarVariationEnergyIntegrand, vecDot_matVecMul_symmPart] + calc + symmetricNeumannEnergyValue U a q u.toH1Function = + volumeAverage Uset (fun x => fQ x - (1 / 2 : ℝ) * fE x) := rfl + _ = + volumeAverage Uset fQ - volumeAverage Uset ((1 / 2 : ℝ) • fE) := by + have hfE_smul : + MeasureTheory.IntegrableOn ((1 / 2 : ℝ) • fE) Uset := by + simpa [Pi.smul_apply, smul_eq_mul] using! + (hfE.const_mul (1 / 2 : ℝ)) + change + volumeAverage Uset (fQ - ((1 / 2 : ℝ) • fE)) = + volumeAverage Uset fQ - volumeAverage Uset ((1 / 2 : ℝ) • fE) + rw [volumeAverage_sub hfQ hfE_smul] + _ = + (1 / 2 : ℝ) * volumeAverage Uset fE := by + rw [volumeAverage_smul, hQE] + ring + _ = + (1 / 2 : ℝ) * + volumeAverage Uset + (scalarVariationEnergyIntegrand a.toCoeffField hu.toAHarmonicFunction) := by + rw [hscalar] + +theorem isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {q : Vec d} + {u : H1MeanZeroFunction (U : Set (Vec d))} + (hu : IsConstantFluxNeumannSolution a.toCoeffField (U : Set (Vec d)) q u) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + IsSymmetricNeumannMaximizer U a q u.toH1Function := by + intro w + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u.toH1Function + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hvalue := + symmetricNeumannEnergyValue_eq_of_isConstantFluxNeumannSolution + U a hu ha hEll w + have hvalue' : + symmetricNeumannEnergyValue U a q w = + symmetricNeumannEnergyValue U a q u.toH1Function - + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + simpa [fZ, z, Uset] using hvalue + have hZNonneg : 0 ≤ volumeAverage Uset fZ := by + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + have hnonneg := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll z.grad x hx + simpa [fZ, coefficientEnergyDensity_eq_unsymmetrized] using hnonneg + nlinarith [hvalue', hZNonneg] + +theorem sameGradientAE_of_isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution + {d : ℕ} (U : Domain d) (a : CoeffOn U) {q : Vec d} + {u : H1MeanZeroFunction (U : Set (Vec d))} + (hu : IsConstantFluxNeumannSolution a.toCoeffField (U : Set (Vec d)) q u) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) + {w : H1Function (U : Set (Vec d))} + (hw : IsSymmetricNeumannMaximizer U a q w) : + w.grad =ᵐ[volumeMeasureOn (U : Set (Vec d))] u.toH1Function.grad := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let z : H1Function Uset := w - u.toH1Function + let fZ : Vec d → ℝ := + fun x => + vecDot (z.grad x) (matVecMul (a.toCoeffField x) (z.grad x)) + have hvalue := + symmetricNeumannEnergyValue_eq_of_isConstantFluxNeumannSolution + U a hu ha hEll w + have hvalue' : + symmetricNeumannEnergyValue U a q w = + symmetricNeumannEnergyValue U a q u.toH1Function - + (1 / 2 : ℝ) * volumeAverage Uset fZ := by + simpa [fZ, z, Uset] using hvalue + have hZNonneg : 0 ≤ volumeAverage Uset fZ := by + apply volumeAverage_nonneg_of_nonneg_on + (measurableSet_of_isEllipticFieldOn hEll) + intro x hx + have hnonneg := + coefficientEnergyDensity_nonneg_of_isEllipticFieldOn hEll z.grad x hx + simpa [fZ, coefficientEnergyDensity_eq_unsymmetrized] using hnonneg + have hZLeZero : volumeAverage Uset fZ ≤ 0 := by + have hmax := hw u.toH1Function + nlinarith [hvalue'] + have hZZero : volumeAverage Uset fZ = 0 := + le_antisymm hZLeZero hZNonneg + have hfZ : MeasureTheory.IntegrableOn fZ Uset := by + simpa [fZ, z, Uset] using + integrableOn_h1_coefficientEnergyDensity hEll z + have hzZero : z.grad =ᵐ[volumeMeasureOn Uset] 0 := by + simpa [fZ, Uset] using + h1_grad_eq_zero_ae_of_volumeAverage_energy_eq_zero U a hEll z hfZ hZZero + filter_upwards [hzZero] with x hx + have hz : + z.grad x = w.grad x - u.toH1Function.grad x := by + simp [z] + rw [hz] at hx + exact sub_eq_zero.mp hx + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Theory.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Theory.lean new file mode 100644 index 0000000000..e0890c5771 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/Theory.lean @@ -0,0 +1,323 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Dirichlet +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Neumann +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.ZeroDim + +/-! # Theory -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Symmetric Dirichlet-Neumann Theory Assembly + +This file is split mechanically out of `Internal.Ch02.SymmetricDirichletNeumann`. +-/ + +theorem responseSymmetricDirichletNeumannTheory_of_isEllipticFieldOn + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hsym : CoeffOn.IsSymmetric a) + (ha : IsSymmetricCoeffField a.toCoeffField) + (hEll : IsEllipticFieldOn a.lam a.Lam (U : Set (Vec d)) a.toCoeffField) : + ResponseSymmetricDirichletNeumannTheory U a hsym := by + let Uset : Set (Vec d) := (U : Set (Vec d)) + let hvol : 0 < (MeasureTheory.volume Uset).toReal := domain_volume_pos U + rcases + exists_oldCanonicalMatrixData_of_isOpenBoundedConvexDomain + (U := Uset) U.isDomain hEll hvol with + ⟨R, sigma0, compat, hA, _hSInv, hS, hK, hSigma, _hSigmaCanonical⟩ + have hdet : IsUnit (Homogenization.sigmaStarCoarse Uset a.toCoeffField).det := + isUnit_det_of_isSigmaStarCoarse_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain hEll hvol compat hS + let hInt : ResponseLinearIntegrabilityData Uset a.toCoeffField := + ResponseLinearIntegrabilityData.of_isEllipticFieldOn hEll + rcases ScalarCanonicalMaximizer.GradientBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) U.nonempty U.isDomain hEll with + ⟨basisGrad⟩ + rcases ScalarCanonicalMaximizer.FluxBasisData.nonempty_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) U.nonempty U.isDomain hEll with + ⟨basisFlux⟩ + have hDirValue : + ∀ p : Vec d, + symmetricDirichletNu U a p = + (1 / 2 : ℝ) * vecDot p (matVecMul (sigmaCoarse U a) p) := by + intro p + rcases exists_isAffineDirichletSolution_of_isEllipticFieldOn U a hEll p with + ⟨uD, huD⟩ + have hmin : IsSymmetricDirichletMinimizer U a p uD := + isSymmetricDirichletMinimizer_of_isAffineDirichletSolution U a huD ha hEll + have hnu := symmetricDirichletNu_eq_of_minimizer hmin + have hOld := + huD.energy_eq_vecDot_sigmaCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn + ha hEll hA hS hK hSigma hdet + have hPublicEnergy : + symmetricDirichletEnergyValue U a uD = + (1 / 2 : ℝ) * + volumeAverage Uset + (scalarVariationEnergyIntegrand a.toCoeffField + huD.toAHarmonicFunction) := by + calc + symmetricDirichletEnergyValue U a uD = + volumeAverage Uset + ((1 / 2 : ℝ) • + scalarVariationEnergyIntegrand a.toCoeffField + huD.toAHarmonicFunction) := by + change + volumeAverage Uset + (fun x => + (1 / 2 : ℝ) * + vecDot (uD.grad x) + (matVecMul (a.toCoeffField x) (uD.grad x))) = + volumeAverage Uset + ((1 / 2 : ℝ) • + scalarVariationEnergyIntegrand a.toCoeffField + huD.toAHarmonicFunction) + congr 1 + funext x + simp [scalarVariationEnergyIntegrand, + symmPart_eq_self_of_isSymmetricCoeffField ha x] + _ = + (1 / 2 : ℝ) * + volumeAverage Uset + (scalarVariationEnergyIntegrand a.toCoeffField + huD.toAHarmonicFunction) := + volumeAverage_smul Uset (1 / 2 : ℝ) + (scalarVariationEnergyIntegrand a.toCoeffField + huD.toAHarmonicFunction) + rw [hnu, hPublicEnergy, hOld] + have hNeuValue : + ∀ q : Vec d, + symmetricNeumannNu U a q = + (1 / 2 : ℝ) * + vecDot q (matVecMul (sigmaStarInvCoarse U a) q) := by + intro q + rcases exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn U a hEll q with + ⟨uN, huN⟩ + have hmax : IsSymmetricNeumannMaximizer U a q uN.toH1Function := + isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution U a huN ha hEll + have hnu := symmetricNeumannNu_eq_of_maximizer hmax + have hHalf := + symmetricNeumannEnergyValue_eq_half_variationEnergy_of_isConstantFluxNeumannSolution + U a huN hEll + have hOld := + huN.energy_eq_vecDot_sigmaStarInvCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn + ha hEll hS + rw [hnu, hHalf, hOld] + refine + { dirichlet_minimizer_exists := ?_ + neumann_meanZero_maximizer_exists := ?_ + response_maximizer_split := ?_ + response_dirichlet_neumann_split := ?_ + dirichlet_value_by_sigma := hDirValue + neumann_value_by_sigmaStarInv := hNeuValue + kappa_eq_zero := ?_ + dirichlet_average_gradient := ?_ + dirichlet_average_flux := ?_ + neumann_average_flux := ?_ + neumann_average_gradient := ?_ + response_completed_square := ?_ + derived_matrices := ?_ + dirichlet_neumann_bracketing := ?_ } + · intro p + rcases exists_isAffineDirichletSolution_of_isEllipticFieldOn U a hEll p with + ⟨uD, huD⟩ + exact ⟨uD, isSymmetricDirichletMinimizer_of_isAffineDirichletSolution U a huD ha hEll⟩ + · intro q + rcases exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn U a hEll q with + ⟨uN, huN⟩ + exact + ⟨uN.toH1Function, meanZeroOn_of_h1MeanZeroFunction uN, + isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution U a huN ha hEll⟩ + · intro p q v hv uD uN huD huN + rcases exists_isAffineDirichletSolution_of_isEllipticFieldOn U a hEll p with + ⟨uD0, huD0⟩ + rcases exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn U a hEll q with + ⟨uN0, huN0⟩ + let v0 : Solution U a := + dirichletNeumannSplitOfIsEllipticFieldOn hEll huD0 huN0 + have hv0Old : + Homogenization.IsResponseMaximizer Uset p q a.toCoeffField v0 := + isResponseMaximizer_dirichletNeumannSplitOfIsEllipticFieldOn_of_isSymmetricCoeffField + hEll huD0 huN0 ha + have hv0 : Book.Ch02.IsResponseMaximizer U a p q v0 := by + intro w + exact hv0Old w + have hvAE : + v.toH1.grad =ᵐ[volumeMeasureOn Uset] v0.toH1.grad := + (responseGradientUniquenessTheory_of_isEllipticFieldOn U a hEll).unique_gradient + p q v v0 hv hv0 + have hDAE : + uD.grad =ᵐ[volumeMeasureOn Uset] uD0.grad := + sameGradientAE_of_isSymmetricDirichletMinimizer_of_isAffineDirichletSolution + U a huD0 ha hEll huD + have hNAE : + uN.grad =ᵐ[volumeMeasureOn Uset] uN0.toH1Function.grad := + sameGradientAE_of_isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution + U a huN0 ha hEll huN + filter_upwards [hvAE, hDAE, hNAE] with x hvx hDx hNx + have hv0x : + v0.toH1.grad x = uN0.toH1Function.grad x - uD0.grad x := by + change + (dirichletNeumannSplitOfIsEllipticFieldOn hEll huD0 huN0).toH1.grad x = + uN0.toH1Function.grad x - uD0.grad x + exact congrFun (dirichletNeumannSplitOfIsEllipticFieldOn_grad hEll huD0 huN0) x + rw [hvx, hv0x, ← hNx, ← hDx] + · intro p q + have hOld := + responseJ_eq_half_vecDot_sigmaCoarse_add_half_vecDot_sigmaStarInvCoarse_sub_dot_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain ha hEll hvol compat + hA hS hK hSigma p q + rw [book_responseJ_eq_ResponseJ U a p q, hOld, hDirValue p, hNeuValue q] + · simpa [book_kappaCoarse_eq_kappaCoarse U a] using + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + · intro p uD huD + rcases exists_isAffineDirichletSolution_of_isEllipticFieldOn U a hEll p with + ⟨uD0, huD0⟩ + have hAE := + sameGradientAE_of_isSymmetricDirichletMinimizer_of_isAffineDirichletSolution + U a huD0 ha hEll huD + calc + h1AverageGradient U uD = h1AverageGradient U uD0 := + h1AverageGradient_eq_of_grad_ae U hAE + _ = p := by + simpa [h1AverageGradient, averageVec] using! + huD0.averageGradient_eq (hvol.ne') + · intro p uD huD + rcases exists_isAffineDirichletSolution_of_isEllipticFieldOn U a hEll p with + ⟨uD0, huD0⟩ + have hAE := + sameGradientAE_of_isSymmetricDirichletMinimizer_of_isAffineDirichletSolution + U a huD0 ha hEll huD + have hOld := + huD0.averageFlux_eq_sigmaCoarse_mul_of_isSymmetricCoeffField_of_isEllipticFieldOn + ha hEll hA hS hK hSigma hdet hInt basisFlux.flux + calc + h1AverageFlux U a uD = h1AverageFlux U a uD0 := + h1AverageFlux_eq_of_grad_ae U a hAE + _ = matVecMul (sigmaCoarse U a) p := by + simpa [h1AverageFlux, averageVec, book_sigmaCoarse_eq_sigmaCoarse U a] using! hOld + · intro q uN huN + rcases exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn U a hEll q with + ⟨uN0, huN0⟩ + have hAE := + sameGradientAE_of_isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution + U a huN0 ha hEll huN + have hOld := + huN0.averageFlux_eq hEll U.isDomain.isSobolevRegularDomain hvol.ne' + calc + h1AverageFlux U a uN = h1AverageFlux U a uN0.toH1Function := + h1AverageFlux_eq_of_grad_ae U a hAE + _ = q := by + simpa [h1AverageFlux, averageVec] using! hOld + · intro q uN huN + rcases exists_isConstantFluxNeumannSolution_of_isEllipticFieldOn U a hEll q with + ⟨uN0, huN0⟩ + have hAE := + sameGradientAE_of_isSymmetricNeumannMaximizer_of_isConstantFluxNeumannSolution + U a huN0 ha hEll huN + have hOld := + huN0.averageGradient_eq_sigmaStarInvCoarse_mul_of_isSymmetricCoeffField_of_isEllipticFieldOn + ha hEll hA hS hK hdet hInt basisGrad.grad + calc + h1AverageGradient U uN = h1AverageGradient U uN0.toH1Function := + h1AverageGradient_eq_of_grad_ae U hAE + _ = matVecMul (sigmaStarInvCoarse U a) q := by + simpa [h1AverageGradient, averageVec, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a] using! hOld + · intro p q + have hOld := + responseJ_completedSquare_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain ha hEll hvol compat + hA hS hK hSigma p q + rw [book_responseJ_eq_ResponseJ U a p q, hOld, + book_sigmaCoarse_eq_sigmaCoarse U a, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_sigmaStarInvCoarse_eq_sigmaStarInvCoarse U a, + ← sigmaCoarse_eq_of_isSigmaCoarse hS hK hSigma hdet, + ← sigmaStarInvCoarse_eq_inv_of_isSigmaStarCoarse hS] + · constructor + · have hk : Book.Ch02.kappaCoarse U a = 0 := by + simpa [book_kappaCoarse_eq_kappaCoarse U a] using + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + simp [Book.Ch02.aCoarse, Book.Ch02.CoarseMatrices.coeff, + Book.Ch02.coarseMatrices, hk, matTranspose] + constructor + · have hk : Book.Ch02.kappaCoarse U a = 0 := by + simpa [book_kappaCoarse_eq_kappaCoarse U a] using + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + simp [Book.Ch02.aStarCoarse, hk, matTranspose] + · have hk : Book.Ch02.kappaCoarse U a = 0 := by + simpa [book_kappaCoarse_eq_kappaCoarse U a] using + kappaCoarse_eq_zero_of_isSymmetricCoeffField_of_isCoarseBlockMatrix ha hA + simp [Book.Ch02.bCoarse, Book.Ch02.CoarseMatrices.b, + Book.Ch02.coarseMatrices, hk, matTranspose] + · constructor + · have h := + harmonicMeanCoeffField_le_sigmaStarCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain ha hEll hvol compat + simpa [book_averagedSymmPartInv_eq_averagedSymmPartInv U a, + averagedSymmPartInv_eq_volumeAverageMat_inv_of_isSymmetricCoeffField ha, + book_sigmaStarCoarse_eq_sigmaStarCoarse U a] using h + constructor + · have h := + sigmaStarCoarse_le_sigmaCoarse_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain ha hEll hvol compat + hA hS hK hSigma + simpa [book_sigmaStarCoarse_eq_sigmaStarCoarse U a, + book_sigmaCoarse_eq_sigmaCoarse U a] using h + · have h := + sigmaCoarse_le_volumeAverageMat_of_isSymmetricCoeffField_of_isEllipticFieldOn_of_isOpenBoundedConvexDomain + (U := Uset) (a := a.toCoeffField) R U.isDomain ha hEll hvol compat + hA hS hK hSigma + simpa [book_sigmaCoarse_eq_sigmaCoarse U a, averageMat] using! h + +theorem responseSymmetricDirichletNeumannTheory_of_neZero + {d : ℕ} [NeZero d] (U : Domain d) (a : CoeffOn U) + (hsym : CoeffOn.IsSymmetric a) : + ResponseSymmetricDirichletNeumannTheory U a hsym := by + let b : CoeffOn U := pointwiseSymmetricCoeffOn U a hsym + have hsymb : CoeffOn.IsSymmetric b := by + exact Filter.Eventually.of_forall fun x => + pointwiseSymmetricCoeffOn_isSymmetricCoeffField U a hsym x + have hb : ResponseSymmetricDirichletNeumannTheory U b hsymb := + responseSymmetricDirichletNeumannTheory_of_isEllipticFieldOn U b hsymb + (by simpa [b] using pointwiseSymmetricCoeffOn_isSymmetricCoeffField U a hsym) + (by simpa [b] using pointwiseSymmetricCoeffOn_isEllipticFieldOn U a hsym) + have hba : CoeffOn.AEEq b a := by + simpa [b] using pointwiseSymmetricCoeffOn_ae_eq U a hsym + exact ResponseSymmetricDirichletNeumannTheory.ofAEEq hba hb + +theorem responseSymmetricDirichletNeumannTheory + {d : ℕ} (U : Domain d) (a : CoeffOn U) + (hsym : CoeffOn.IsSymmetric a) : + ResponseSymmetricDirichletNeumannTheory U a hsym := by + by_cases hd : d = 0 + · subst d + exact responseSymmetricDirichletNeumannTheory_zero_dim U a hsym + · let : NeZero d := ⟨hd⟩ + exact responseSymmetricDirichletNeumannTheory_of_neZero U a hsym + + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/ZeroDim.lean b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/ZeroDim.lean new file mode 100644 index 0000000000..1540f0849d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Internal/Ch02/SymmetricDirichletNeumann/ZeroDim.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Internal.Ch02.SymmetricDirichletNeumann.Common + +/-! # Zero Dim -/ + +@[expose] public section + +namespace Homogenization +namespace Internal +namespace Ch02 + +noncomputable section + +namespace BookCh02 + +open Book.Ch02 + +/-! +# Zero-Dimensional Symmetric Dirichlet-Neumann Theory + +This file is split mechanically out of `Internal.Ch02.SymmetricDirichletNeumann`. +-/ + +theorem matLoewnerLE_zero_dim {A B : Mat 0} : + MatLoewnerLE A B := by + intro p + have hp : p = 0 := Subsingleton.elim p 0 + subst p + simp [vecDot, matVecMul] + +theorem symmetricDirichletEnergyValue_zero_dim + (U : Domain 0) (a : CoeffOn U) + (u : H1Function (U : Set (Vec 0))) : + symmetricDirichletEnergyValue U a u = 0 := by + change + volumeAverage (U : Set (Vec 0)) + (fun x => + (1 / 2 : ℝ) * vecDot (u.grad x) + (matVecMul (a.toCoeffField x) (u.grad x))) = 0 + rw [show + (fun x => + (1 / 2 : ℝ) * vecDot (u.grad x) + (matVecMul (a.toCoeffField x) (u.grad x))) = + (0 : Vec 0 → ℝ) by + funext x + simp [vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +theorem symmetricNeumannEnergyValue_zero_dim + (U : Domain 0) (a : CoeffOn U) (q : Vec 0) + (u : H1Function (U : Set (Vec 0))) : + symmetricNeumannEnergyValue U a q u = 0 := by + change + volumeAverage (U : Set (Vec 0)) + (fun x => + vecDot q (u.grad x) - + (1 / 2 : ℝ) * vecDot (u.grad x) + (matVecMul (a.toCoeffField x) (u.grad x))) = 0 + rw [show + (fun x => + vecDot q (u.grad x) - + (1 / 2 : ℝ) * vecDot (u.grad x) + (matVecMul (a.toCoeffField x) (u.grad x))) = + (0 : Vec 0 → ℝ) by + funext x + simp [vecDot, matVecMul]] + exact volumeAverage_zero (U : Set (Vec 0)) + +theorem isSymmetricDirichletAdmissible_zero_dim + (U : Domain 0) (p : Vec 0) + (u : H1Function (U : Set (Vec 0))) : + IsSymmetricDirichletAdmissible U p u := by + have hzero : + (fun x : Vec 0 => u.grad x - p) = (0 : Vec 0 → Vec 0) := by + funext x + exact Subsingleton.elim _ _ + rw [IsSymmetricDirichletAdmissible, hzero] + simpa using! + Book.Ch01.potentialZeroTraceFieldOn_of_h10 + (U := (U : Set (Vec 0))) (0 : H10Function (U : Set (Vec 0))) + +theorem isSymmetricDirichletMinimizer_zero_dim + (U : Domain 0) (a : CoeffOn U) (p : Vec 0) + (u : H1Function (U : Set (Vec 0))) : + IsSymmetricDirichletMinimizer U a p u := by + refine ⟨isSymmetricDirichletAdmissible_zero_dim U p u, ?_⟩ + intro w _hw + rw [symmetricDirichletEnergyValue_zero_dim U a u, + symmetricDirichletEnergyValue_zero_dim U a w] + +theorem isSymmetricNeumannMaximizer_zero_dim + (U : Domain 0) (a : CoeffOn U) (q : Vec 0) + (u : H1Function (U : Set (Vec 0))) : + IsSymmetricNeumannMaximizer U a q u := by + intro w + rw [symmetricNeumannEnergyValue_zero_dim U a q w, + symmetricNeumannEnergyValue_zero_dim U a q u] + +theorem symmetricDirichletNu_zero_dim + (U : Domain 0) (a : CoeffOn U) (p : Vec 0) : + symmetricDirichletNu U a p = 0 := by + have hmin : + IsSymmetricDirichletMinimizer U a p (0 : H1Function (U : Set (Vec 0))) := + isSymmetricDirichletMinimizer_zero_dim U a p 0 + rw [symmetricDirichletNu_eq_of_minimizer hmin, + symmetricDirichletEnergyValue_zero_dim U a] + +theorem symmetricNeumannNu_zero_dim + (U : Domain 0) (a : CoeffOn U) (q : Vec 0) : + symmetricNeumannNu U a q = 0 := by + have hmax : + IsSymmetricNeumannMaximizer U a q (0 : H1Function (U : Set (Vec 0))) := + isSymmetricNeumannMaximizer_zero_dim U a q 0 + rw [symmetricNeumannNu_eq_of_maximizer hmax, + symmetricNeumannEnergyValue_zero_dim U a q] + +theorem responseJ_zero_dim (U : Domain 0) (a : CoeffOn U) + (p q : Vec 0) : + responseJ U a p q = 0 := by + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + have h := + (canonicalResponseMatrixIdentities U a).full_response (0 : Vec 0) (0 : Vec 0) + simpa [vecDot, matVecMul] using h + +theorem responseSymmetricDirichletNeumannTheory_zero_dim + (U : Domain 0) (a : CoeffOn U) (hsym : CoeffOn.IsSymmetric a) : + ResponseSymmetricDirichletNeumannTheory U a hsym := by + refine + { dirichlet_minimizer_exists := ?_ + neumann_meanZero_maximizer_exists := ?_ + response_maximizer_split := ?_ + response_dirichlet_neumann_split := ?_ + dirichlet_value_by_sigma := ?_ + neumann_value_by_sigmaStarInv := ?_ + kappa_eq_zero := ?_ + dirichlet_average_gradient := ?_ + dirichlet_average_flux := ?_ + neumann_average_flux := ?_ + neumann_average_gradient := ?_ + response_completed_square := ?_ + derived_matrices := ?_ + dirichlet_neumann_bracketing := ?_ } + · intro p + exact ⟨0, isSymmetricDirichletMinimizer_zero_dim U a p 0⟩ + · intro q + refine ⟨0, ?_, isSymmetricNeumannMaximizer_zero_dim U a q 0⟩ + unfold MeanZeroOn + simp + · intro p q v hv uD uN huD huN + exact Filter.Eventually.of_forall fun x => Subsingleton.elim _ _ + · intro p q + rw [responseJ_zero_dim U a p q, symmetricDirichletNu_zero_dim U a p, + symmetricNeumannNu_zero_dim U a q] + simp [vecDot] + · intro p + rw [symmetricDirichletNu_zero_dim U a p] + have hp : p = 0 := Subsingleton.elim p 0 + subst p + simp [vecDot, matVecMul] + · intro q + rw [symmetricNeumannNu_zero_dim U a q] + have hq : q = 0 := Subsingleton.elim q 0 + subst q + simp [vecDot, matVecMul] + · exact Subsingleton.elim _ _ + · intro p uD huD + exact Subsingleton.elim _ _ + · intro p uD huD + exact Subsingleton.elim _ _ + · intro q uN huN + exact Subsingleton.elim _ _ + · intro q uN huN + exact Subsingleton.elim _ _ + · intro p q + rw [responseJ_zero_dim U a p q] + have hp : p = 0 := Subsingleton.elim p 0 + have hq : q = 0 := Subsingleton.elim q 0 + subst p + subst q + simp [vecDot, matVecMul] + · refine ⟨Subsingleton.elim _ _, Subsingleton.elim _ _, Subsingleton.elim _ _⟩ + · refine ⟨matLoewnerLE_zero_dim, matLoewnerLE_zero_dim, matLoewnerLE_zero_dim⟩ + + +end BookCh02 + +end + +end Ch02 +end Internal +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Meta.lean b/LeanPool/CoarseGraining/Homogenization/Meta.lean new file mode 100644 index 0000000000..23807989ad --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Meta.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Meta.AxiomsAudit + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Meta/AxiomsAudit.lean b/LeanPool/CoarseGraining/Homogenization/Meta/AxiomsAudit.lean new file mode 100644 index 0000000000..addf896582 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Meta/AxiomsAudit.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch05.Theorems.Public +public import LeanPool.CoarseGraining.Homogenization.Book.MainResults + +/-! +# Axiom audit + +Machine-checked record of the axioms that the public headline theorems depend on. + +This development contains no `sorry` and declares no custom `axiom`, so every +public theorem reduces to mathlib's three standard foundational axioms: +`propext`, `Classical.choice`, and `Quot.sound`. Building this file prints +those dependencies for inspection (see CI logs). +-/ + +@[expose] public section + +-- The uniformly-elliptic headline theorems exposed in `MainResults.lean`. diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale.lean new file mode 100644 index 0000000000..278cbba207 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale.lean @@ -0,0 +1,20 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.FiniteAverage +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionConvergence +public import LeanPool.CoarseGraining.Homogenization.Multiscale.ProjectionLp + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/CubeAverage.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/CubeAverage.lean new file mode 100644 index 0000000000..e6bea485b0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/CubeAverage.lean @@ -0,0 +1,44 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Cube Average -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators + +noncomputable def cubeAverage {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : ℝ := + (cubeVolume Q)⁻¹ * ∫ x in cubeSet Q, f x ∂MeasureTheory.volume + +noncomputable def cubeAverageVec {d : ℕ} (Q : TriadicCube d) (f : Vec d → Vec d) : Vec d := + fun i => cubeAverage Q (fun x => f x i) + +noncomputable def cubeAverageMat {d : ℕ} (Q : TriadicCube d) (f : Vec d → Mat d) : Mat d := + fun i j => cubeAverage Q (fun x => f x i j) + +noncomputable def cubeProjection {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (f : Vec d → ℝ) : Vec d → ℝ := by + classical + exact fun x => + Finset.sum (descendantsAtDepth Q j) fun R => + if x ∈ cubeSet R then cubeAverage R f else 0 + +noncomputable def cubeIncrement {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (f : Vec d → ℝ) : Vec d → ℝ := + match j with + | 0 => cubeProjection Q 0 f + | n + 1 => fun x => cubeProjection Q (n + 1) f x - cubeProjection Q n f x + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/FiniteAverage.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/FiniteAverage.lean new file mode 100644 index 0000000000..14e4ea1363 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/FiniteAverage.lean @@ -0,0 +1,67 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Algebra.GroupWithZero.Action.Units +public import Mathlib.Algebra.Module.BigOperators +public import Mathlib.Algebra.Module.NatInt +public import Mathlib.Data.Real.Basic + +/-! # Finite Average -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators + +/-! +# Nonempty finite averages + +This module provides the source-facing average of a function over a nonempty +finite set. Unlike legacy totalized averages, the definition has no value on +the empty set. +-/ + +/-- The average of `F` over a nonempty finite set. -/ +noncomputable def finiteAverage {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (s : Finset α) (_hs : s.Nonempty) (F : α → E) : E := + (s.card : ℝ)⁻¹ • ∑ a ∈ s, F a + +/-- The defining formula for `finiteAverage`. -/ +theorem finiteAverage_def {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (s : Finset α) (hs : s.Nonempty) (F : α → E) : + finiteAverage s hs F = (s.card : ℝ)⁻¹ • ∑ a ∈ s, F a := + rfl + +@[simp] +theorem finiteAverage_singleton {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (a : α) (F : α → E) : + finiteAverage ({a} : Finset α) (by simp) F = F a := by + classical + simp [finiteAverage] + +@[simp] +theorem finiteAverage_const {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (s : Finset α) (hs : s.Nonempty) (x : E) : + finiteAverage s hs (fun _ => x) = x := by + rw [finiteAverage, Finset.sum_const, ← Nat.cast_smul_eq_nsmul ℝ, + inv_smul_smul₀ (by exact_mod_cast hs.card_ne_zero)] + +theorem finiteAverage_add {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (s : Finset α) (hs : s.Nonempty) (F G : α → E) : + finiteAverage s hs (fun a => F a + G a) = + finiteAverage s hs F + finiteAverage s hs G := by + simp only [finiteAverage, Finset.sum_add_distrib, smul_add] + +theorem finiteAverage_smul {α E : Type*} [AddCommMonoid E] [Module ℝ E] + (s : Finset α) (hs : s.Nonempty) (c : ℝ) (F : α → E) : + finiteAverage s hs (fun a => c • F a) = c • finiteAverage s hs F := by + unfold finiteAverage + rw [← Finset.smul_sum, smul_smul, smul_smul, mul_comm] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedDomainCube.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedDomainCube.lean new file mode 100644 index 0000000000..b795781f4b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedDomainCube.lean @@ -0,0 +1,127 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms + +/-! +# Triadic cubes as bounded measurable domains + +This module packages the operational half-open carrier of a triadic cube as a +`BoundedMeasurableDomain`. The source-facing open cube remains only +almost-everywhere equal to this carrier; no equality of the two sets is used or +claimed here. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The half-open carrier of a triadic cube, packaged with its geometric +regularity and positive volume. -/ +noncomputable def cubeBoundedMeasurableDomain {d : ℕ} (Q : TriadicCube d) : + BoundedMeasurableDomain d where + carrier := cubeSet Q + measurableSet := measurableSet_cubeSet Q + isBoundedDomain := by + refine ⟨‖cubeCenter Q‖ + cubeRadius Q + 1, ?_, ?_⟩ + · have hnonneg : 0 ≤ ‖cubeCenter Q‖ + cubeRadius Q := + add_nonneg (norm_nonneg _) (cubeRadius_nonneg Q) + linarith + · intro x hx i + have hxball : x ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hx + have hdist : ‖x - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hxball + have hxnorm : ‖x‖ ≤ ‖cubeCenter Q‖ + cubeRadius Q + 1 := by + calc + ‖x‖ = ‖(x - cubeCenter Q) + cubeCenter Q‖ := by + congr 1 + abel + _ ≤ ‖x - cubeCenter Q‖ + ‖cubeCenter Q‖ := norm_add_le _ _ + _ ≤ cubeRadius Q + ‖cubeCenter Q‖ := add_le_add hdist le_rfl + _ = ‖cubeCenter Q‖ + cubeRadius Q := by ring + _ ≤ ‖cubeCenter Q‖ + cubeRadius Q + 1 := by linarith + exact (by + simpa [Real.norm_eq_abs] using (norm_le_pi_norm x i).trans hxnorm) + volume_pos := by + rw [← cubeMeasure_apply_univ, cubeMeasure_apply_univ_eq] + exact ENNReal.ofReal_pos.mpr (cubeVolume_pos Q) + +@[simp] theorem coe_cubeBoundedMeasurableDomain {d : ℕ} (Q : TriadicCube d) : + (cubeBoundedMeasurableDomain Q : Set (Vec d)) = cubeSet Q := + rfl + +/-- Restricting volume to the safe cube domain is exactly the existing cube +measure. -/ +@[simp] theorem cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure + {d : ℕ} (Q : TriadicCube d) : + (cubeBoundedMeasurableDomain Q).restrictedVolume = cubeMeasure Q := + rfl + +/-- The safe-domain normalization agrees exactly with the established normalized +cube measure. -/ +theorem cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure + {d : ℕ} (Q : TriadicCube d) : + (cubeBoundedMeasurableDomain Q).normalizedVolume = normalizedCubeMeasure Q := by + change (MeasureTheory.volume (cubeSet Q))⁻¹ • MeasureTheory.volume.restrict (cubeSet Q) = + ENNReal.ofReal ((cubeVolume Q)⁻¹) • MeasureTheory.volume.restrict (cubeSet Q) + rw [← cubeMeasure_apply_univ, cubeMeasure_apply_univ_eq, + ENNReal.ofReal_inv_of_pos (cubeVolume_pos Q)] + +/-- The operational half-open cube and the source-facing open cube induce the +same restricted volume measure. -/ +theorem cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet + {d : ℕ} (Q : TriadicCube d) : + (cubeBoundedMeasurableDomain Q).restrictedVolume = + MeasureTheory.volume.restrict (openCubeSet Q) := by + change MeasureTheory.volume.restrict (cubeSet Q) = + MeasureTheory.volume.restrict (openCubeSet Q) + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + +/-- Almost-everywhere statements for the safe cube domain can equivalently be +read over the source-facing open cube. -/ +theorem ae_cubeBoundedMeasurableDomain_restrictedVolume_iff_openCubeSet + {d : ℕ} (Q : TriadicCube d) {p : Vec d → Prop} : + (∀ᵐ x ∂(cubeBoundedMeasurableDomain Q).restrictedVolume, p x) ↔ + ∀ᵐ x ∂MeasureTheory.volume.restrict (openCubeSet Q), p x := by + rw [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + +/-- The proof-carrying safe-domain average is the existing cube average. -/ +theorem cubeBoundedMeasurableDomain_average_eq_cubeAverage {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f (cubeBoundedMeasurableDomain Q).restrictedVolume) : + (cubeBoundedMeasurableDomain Q).average f hf = cubeAverage Q f := by + change ∫ x, f x ∂(cubeBoundedMeasurableDomain Q).normalizedVolume = cubeAverage Q f + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + ← cubeAverage_eq_integral_normalizedCubeMeasure] + +/-- The safe-domain average has the source-facing open-cube formula. This is +an a.e. bridge, rather than an assertion that the two cube carriers coincide. -/ +theorem cubeBoundedMeasurableDomain_average_eq_openCubeSet_average {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.Integrable f (cubeBoundedMeasurableDomain Q).restrictedVolume) : + (cubeBoundedMeasurableDomain Q).average f hf = + (MeasureTheory.volume (openCubeSet Q)).toReal⁻¹ * + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume := by + rw [BoundedMeasurableDomain.average_eq_volume_toReal_inv_mul_setIntegral] + change (MeasureTheory.volume (cubeSet Q)).toReal⁻¹ * + ∫ x in cubeSet Q, f x ∂MeasureTheory.volume = + (MeasureTheory.volume (openCubeSet Q)).toReal⁻¹ * + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume + rw [volume_openCubeSet_eq_volume_cubeSet, + setIntegral_cubeSet_eq_setIntegral_openCubeSet] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedNorms.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedNorms.lean new file mode 100644 index 0000000000..317e987b01 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/NormalizedNorms.lean @@ -0,0 +1,382 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic + +/-! # Normalized Norms -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-! +Normalized cube `L^p` and `W^{1,p}` quantities used later in the Besov layer. + +The normalization is packaged through a probability measure on `cubeSet Q`, so +the underlined norms match the note conventions without repeatedly rederiving +factors of `cubeVolume Q`. +-/ + +noncomputable def cubeMeasure {d : ℕ} (Q : TriadicCube d) : MeasureTheory.Measure (Vec d) := + MeasureTheory.volume.restrict (cubeSet Q) + +noncomputable def normalizedCubeMeasure {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.Measure (Vec d) := + ENNReal.ofReal ((cubeVolume Q)⁻¹) • cubeMeasure Q + +@[simp] theorem cubeMeasure_apply_univ {d : ℕ} (Q : TriadicCube d) : + cubeMeasure Q Set.univ = MeasureTheory.volume (cubeSet Q) := by + rw [cubeMeasure, MeasureTheory.Measure.restrict_apply_univ] + +@[simp] theorem cubeMeasure_apply_univ_toReal {d : ℕ} (Q : TriadicCube d) : + (cubeMeasure Q Set.univ).toReal = cubeVolume Q := by + simp [cubeMeasure] + +theorem cubeMeasure_apply_univ_ne_top {d : ℕ} (Q : TriadicCube d) : + cubeMeasure Q Set.univ ≠ ∞ := by + intro htop + have hzero : (cubeMeasure Q Set.univ).toReal = 0 := by + simp [htop] + have hvol : (cubeMeasure Q Set.univ).toReal = cubeVolume Q := + cubeMeasure_apply_univ_toReal Q + have : cubeVolume Q = 0 := by + simpa [hvol] using hzero + exact (cubeVolume_pos Q).ne' this + +@[simp] theorem cubeMeasure_apply_univ_eq {d : ℕ} (Q : TriadicCube d) : + cubeMeasure Q Set.univ = ENNReal.ofReal (cubeVolume Q) := by + exact (ENNReal.toReal_eq_toReal_iff' (cubeMeasure_apply_univ_ne_top Q) + ENNReal.ofReal_ne_top).1 (by + rw [cubeMeasure_apply_univ_toReal Q, ENNReal.toReal_ofReal (cubeVolume_nonneg Q)]) + +@[simp] theorem normalizedCubeMeasure_apply_univ {d : ℕ} (Q : TriadicCube d) : + normalizedCubeMeasure Q Set.univ = 1 := by + rw [normalizedCubeMeasure, MeasureTheory.Measure.smul_apply, cubeMeasure_apply_univ_eq Q] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos Q)] + have hvol : ENNReal.ofReal (cubeVolume Q) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos Q) + exact ENNReal.inv_mul_cancel hvol ENNReal.ofReal_ne_top + +instance normalizedCubeMeasure.instIsFiniteMeasure {d : ℕ} (Q : TriadicCube d) : + MeasureTheory.IsFiniteMeasure (normalizedCubeMeasure Q) where + measure_univ_lt_top := by + simp [normalizedCubeMeasure_apply_univ Q] + +theorem normalizedCubeMeasure_ne_zero {d : ℕ} (Q : TriadicCube d) : + normalizedCubeMeasure Q ≠ 0 := by + intro hzero + have huniv : normalizedCubeMeasure Q Set.univ = 0 := by + simp [hzero] + simp at huniv + +theorem cubeAverage_eq_integral_normalizedCubeMeasure {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ) : + cubeAverage Q f = ∫ x, f x ∂ normalizedCubeMeasure Q := by + rw [cubeAverage, normalizedCubeMeasure, cubeMeasure, MeasureTheory.integral_smul_measure] + simp [smul_eq_mul, ENNReal.toReal_ofReal, inv_nonneg, cubeVolume_nonneg] + +noncomputable def cubeLpNorm {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) : ℝ := + (Gagliardo.integralLpSeminorm f p (normalizedCubeMeasure Q)).toReal + +/-- On measurable fields the integral definition of the cube norm agrees with Mathlib. -/ +theorem cubeLpNorm_eq_eLpNorm_toReal {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (normalizedCubeMeasure Q)) : + cubeLpNorm Q p f = (MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q)).toReal := by + rw [cubeLpNorm, Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hf] + +noncomputable def cubeFluctuation {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + Vec d → ℝ := + fun x => f x - cubeAverage Q f + +theorem cubeAverage_sub_const_of_memLp_two {d : ℕ} (Q : TriadicCube d) + {f : Vec d → ℝ} (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (c : ℝ) : + cubeAverage Q (fun x => f x - c) = cubeAverage Q f - c := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + have hf_int : MeasureTheory.Integrable f (normalizedCubeMeasure Q) := + hf.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hc_int : MeasureTheory.Integrable (fun _ : Vec d => c) (normalizedCubeMeasure Q) := + MeasureTheory.integrable_const c + have hreal_univ : (normalizedCubeMeasure Q).real Set.univ = 1 := by + rw [MeasureTheory.Measure.real_def, normalizedCubeMeasure_apply_univ] + norm_num + rw [MeasureTheory.integral_sub hf_int hc_int, MeasureTheory.integral_const, + hreal_univ] + simp + +theorem cubeFluctuation_sub_const_of_memLp_two {d : ℕ} (Q : TriadicCube d) + {f : Vec d → ℝ} (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (c : ℝ) : + cubeFluctuation Q (fun x => f x - c) = cubeFluctuation Q f := by + funext x + calc + cubeFluctuation Q (fun x => f x - c) x + = (f x - c) - (cubeAverage Q f - c) := by + simp [cubeFluctuation, cubeAverage_sub_const_of_memLp_two Q hf c] + _ = f x - cubeAverage Q f := by ring + _ = cubeFluctuation Q f x := by simp [cubeFluctuation] + +theorem cubeFluctuation_cubeFluctuation_of_memLp_two {d : ℕ} (R Q : TriadicCube d) + {f : Vec d → ℝ} (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure R)) : + cubeFluctuation R (cubeFluctuation Q f) = cubeFluctuation R f := by + simpa [cubeFluctuation] using! + cubeFluctuation_sub_const_of_memLp_two R hf (cubeAverage Q f) + +noncomputable def cubeW1pSeminorm {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (Du : Vec d → Vec d) : ℝ := + cubeLpNorm Q p Du + +noncomputable def cubeW1InfinityNorm {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (Du : Vec d → Vec d) : ℝ := + max (cubeLpNorm Q ∞ Du) ((cubeScaleFactor Q)⁻¹ * cubeLpNorm Q ∞ u) + +noncomputable def cubeW1pNorm {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (Du : Vec d → Vec d) : ℝ := + if p = 0 then + 0 + else if p = ∞ then + cubeW1InfinityNorm Q u Du + else + ((cubeW1pSeminorm Q p Du) ^ p.toReal + + (cubeScaleFactor Q) ^ (-p.toReal) * (cubeLpNorm Q p u) ^ p.toReal) ^ (1 / p.toReal) + +theorem cubeLpNorm_nonneg {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) : + 0 ≤ cubeLpNorm Q p f := + ENNReal.toReal_nonneg + +@[simp] theorem cubeLpNorm_zero {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) : + cubeLpNorm Q p (fun _ => (0 : E)) = 0 := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q p _ MeasureTheory.aestronglyMeasurable_const] + simp + +theorem cubeLpNorm_const {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) (c : E) (hp : p ≠ 0) : + cubeLpNorm Q p (fun _ => c) = ‖c‖ := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q p _ MeasureTheory.aestronglyMeasurable_const] + rw [MeasureTheory.eLpNorm_const c hp (normalizedCubeMeasure_ne_zero Q), + normalizedCubeMeasure_apply_univ] + simp + +theorem cubeLpNorm_one_eq_integral_norm {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (normalizedCubeMeasure Q)) : + cubeLpNorm Q 1 f = ∫ x, ‖f x‖ ∂ normalizedCubeMeasure Q := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q 1 f hf] + rw [MeasureTheory.eLpNorm_one_eq_lintegral_enorm hf, + ← MeasureTheory.integral_norm_eq_lintegral_enorm hf] + +theorem cubeLpNorm_rpow_eq_cubeAverage_norm_rpow {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) + (hp0 : p ≠ 0) (hpTop : p ≠ ∞) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + (cubeLpNorm Q p f) ^ p.toReal = + cubeAverage Q (fun x => ‖f x‖ ^ p.toReal) := by + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hpTop + have hnonneg : + 0 ≤ᵐ[normalizedCubeMeasure Q] fun x => ‖f x‖ ^ p.toReal := + Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _ + have hmeas : + MeasureTheory.AEStronglyMeasurable (fun x => ‖f x‖ ^ p.toReal) + (normalizedCubeMeasure Q) := + (hf.aestronglyMeasurable.norm.aemeasurable.pow aemeasurable_const).aestronglyMeasurable + calc + (cubeLpNorm Q p f) ^ p.toReal + = ((MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q)) ^ p.toReal).toReal := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q p f hf.aestronglyMeasurable, + ← ENNReal.toReal_rpow] + _ = (∫⁻ x, ‖f x‖ₑ ^ p.toReal ∂ normalizedCubeMeasure Q).toReal := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal hp0 hpTop hf.aestronglyMeasurable] + let A : ℝ≥0∞ := ∫⁻ x, ‖f x‖ₑ ^ p.toReal ∂ normalizedCubeMeasure Q + change ((A ^ (1 / p.toReal)) ^ p.toReal).toReal = A.toReal + rw [← ENNReal.rpow_mul, one_div, inv_mul_cancel₀ hpPos.ne', ENNReal.rpow_one] + _ = ∫ x, ‖f x‖ ^ p.toReal ∂ normalizedCubeMeasure Q := by + symm + rw [MeasureTheory.integral_eq_lintegral_of_nonneg_ae hnonneg hmeas] + refine congrArg ENNReal.toReal ?_ + apply MeasureTheory.lintegral_congr_ae + filter_upwards with x + rw [← ENNReal.ofReal_rpow_of_nonneg (norm_nonneg (f x)) ENNReal.toReal_nonneg] + simp + _ = cubeAverage Q (fun x => ‖f x‖ ^ p.toReal) := by + symm + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + +theorem cubeLpNorm_mul_le_mul_cubeLpNorm_of_holderConjugate {d : ℕ} + (Q : TriadicCube d) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + [ENNReal.HolderConjugate p q] + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g q (normalizedCubeMeasure Q)) : + cubeLpNorm Q 1 (fun x => f x * g x) ≤ + cubeLpNorm Q p f * cubeLpNorm Q q g := by + have hmul : + MeasureTheory.eLpNorm (fun x => f x * g x) 1 (normalizedCubeMeasure Q) ≤ + 1 * MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm g q (normalizedCubeMeasure Q) := by + simpa using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (fun a b : ℝ => a * b) 1 (continuous_fst.mul continuous_snd) + hf.aestronglyMeasurable hg.aestronglyMeasurable + (Filter.Eventually.of_forall fun x => by + simp)) + have hf_top : MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) ≠ ∞ := ne_of_lt hf.eLpNorm_lt_top + have hg_top : MeasureTheory.eLpNorm g q (normalizedCubeMeasure Q) ≠ ∞ := + ne_of_lt hg.eLpNorm_lt_top + have hmul_top : + 1 * MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm g q (normalizedCubeMeasure Q) ≠ ∞ := by + exact ENNReal.mul_ne_top (ENNReal.mul_ne_top ENNReal.one_ne_top hf_top) hg_top + have htoReal : + (MeasureTheory.eLpNorm (fun x => f x * g x) 1 (normalizedCubeMeasure Q)).toReal ≤ + (1 * MeasureTheory.eLpNorm f p (normalizedCubeMeasure Q) * + MeasureTheory.eLpNorm g q (normalizedCubeMeasure Q)).toReal := + ENNReal.toReal_mono hmul_top hmul + rw [cubeLpNorm_eq_eLpNorm_toReal Q 1 (fun x => f x * g x) + (hf.aestronglyMeasurable.mul hg.aestronglyMeasurable), + cubeLpNorm_eq_eLpNorm_toReal Q p f hf.aestronglyMeasurable, + cubeLpNorm_eq_eLpNorm_toReal Q q g hg.aestronglyMeasurable] + simpa [hf_top, hg_top, mul_assoc] using htoReal + +theorem cubeLpNorm_mul_le_mul_cubeLpNorm_conjExponent {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.conjExponent p) (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + cubeLpNorm Q 1 (fun x => f x * g x) ≤ + cubeLpNorm Q p f * cubeLpNorm Q (ENNReal.conjExponent p) g := by + let : ENNReal.HolderConjugate p (ENNReal.conjExponent p) := + ENNReal.HolderConjugate.conjExponent hp + simpa using cubeLpNorm_mul_le_mul_cubeLpNorm_of_holderConjugate + Q p (ENNReal.conjExponent p) f g hf hg + +theorem abs_cubeAverage_mul_le_mul_cubeLpNorm_of_holderConjugate {d : ℕ} + (Q : TriadicCube d) (p q : ℝ≥0∞) (f g : Vec d → ℝ) + [ENNReal.HolderConjugate p q] + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g q (normalizedCubeMeasure Q)) : + |cubeAverage Q (fun x => f x * g x)| ≤ + cubeLpNorm Q p f * cubeLpNorm Q q g := by + have hfg_meas : MeasureTheory.AEStronglyMeasurable (fun x => f x * g x) (normalizedCubeMeasure Q) := + hf.aestronglyMeasurable.mul hg.aestronglyMeasurable + calc + |cubeAverage Q (fun x => f x * g x)| + = |∫ x, f x * g x ∂ normalizedCubeMeasure Q| := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + _ ≤ ∫ x, |f x * g x| ∂ normalizedCubeMeasure Q := MeasureTheory.abs_integral_le_integral_abs + _ = cubeLpNorm Q 1 (fun x => f x * g x) := by + symm + simpa using cubeLpNorm_one_eq_integral_norm Q (fun x => f x * g x) hfg_meas + _ ≤ cubeLpNorm Q p f * cubeLpNorm Q q g := + cubeLpNorm_mul_le_mul_cubeLpNorm_of_holderConjugate Q p q f g hf hg + +theorem abs_cubeAverage_mul_le_mul_cubeLpNorm_conjExponent {d : ℕ} + (Q : TriadicCube d) (p : ℝ≥0∞) (f g : Vec d → ℝ) + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) + (hg : MeasureTheory.MemLp g (ENNReal.conjExponent p) (normalizedCubeMeasure Q)) + (hp : 1 ≤ p) : + |cubeAverage Q (fun x => f x * g x)| ≤ + cubeLpNorm Q p f * cubeLpNorm Q (ENNReal.conjExponent p) g := by + let : ENNReal.HolderConjugate p (ENNReal.conjExponent p) := + ENNReal.HolderConjugate.conjExponent hp + simpa using abs_cubeAverage_mul_le_mul_cubeLpNorm_of_holderConjugate + Q p (ENNReal.conjExponent p) f g hf hg + +@[simp] theorem cubeFluctuation_apply {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) (x : Vec d) : + cubeFluctuation Q f x = f x - cubeAverage Q f := + rfl + +@[simp] theorem cubeFluctuation_const {d : ℕ} (Q : TriadicCube d) (c : ℝ) : + cubeFluctuation Q (fun _ => c) = 0 := by + funext x + simp [cubeFluctuation, cubeAverage_const] + +@[simp] theorem cubeFluctuation_zero {d : ℕ} (Q : TriadicCube d) : + cubeFluctuation Q (fun _ => (0 : ℝ)) = 0 := by + simp + +@[simp] theorem cubeAverage_cubeFluctuation {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage Q (cubeFluctuation Q f) = 0 := by + by_cases hf : MeasureTheory.Integrable f (normalizedCubeMeasure Q) + · rw [cubeAverage_eq_integral_normalizedCubeMeasure] + unfold cubeFluctuation + have hconst : + MeasureTheory.Integrable (fun _ : Vec d => cubeAverage Q f) (normalizedCubeMeasure Q) := + MeasureTheory.integrable_const _ + have hreal_univ : (normalizedCubeMeasure Q).real Set.univ = 1 := by + rw [MeasureTheory.Measure.real_def, normalizedCubeMeasure_apply_univ] + norm_num + rw [MeasureTheory.integral_sub hf hconst, cubeAverage_eq_integral_normalizedCubeMeasure, + MeasureTheory.integral_const, hreal_univ] + simp + · have havg : cubeAverage Q f = 0 := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, MeasureTheory.integral_undef hf] + have hfluct : cubeFluctuation Q f = f := by + funext x + simp [cubeFluctuation, havg] + rw [hfluct, havg] + +theorem cubeW1pSeminorm_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (Du : Vec d → Vec d) : + 0 ≤ cubeW1pSeminorm Q p Du := + cubeLpNorm_nonneg Q p Du + +@[simp] theorem cubeW1pSeminorm_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) : + cubeW1pSeminorm Q p (fun _ => 0) = 0 := by + simp [cubeW1pSeminorm] + +@[simp] theorem cubeW1pNorm_top {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (Du : Vec d → Vec d) : + cubeW1pNorm Q ∞ u Du = cubeW1InfinityNorm Q u Du := by + simp [cubeW1pNorm] + +theorem cubeW1InfinityNorm_nonneg {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (Du : Vec d → Vec d) : + 0 ≤ cubeW1InfinityNorm Q u Du := by + exact le_trans (cubeLpNorm_nonneg Q ∞ Du) (le_max_left _ _) + +@[simp] theorem cubeW1InfinityNorm_zero {d : ℕ} (Q : TriadicCube d) : + cubeW1InfinityNorm Q (fun _ => 0) (fun _ => 0) = 0 := by + simp [cubeW1InfinityNorm] + +theorem cubeW1pNorm_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) (Du : Vec d → Vec d) : + 0 ≤ cubeW1pNorm Q p u Du := by + unfold cubeW1pNorm + split_ifs with hp0 hp + · positivity + · exact cubeW1InfinityNorm_nonneg Q u Du + · have hgrad : 0 ≤ (cubeW1pSeminorm Q p Du) ^ p.toReal := + Real.rpow_nonneg (cubeW1pSeminorm_nonneg Q p Du) _ + have hscale : 0 ≤ (cubeScaleFactor Q) ^ (-p.toReal) := + Real.rpow_nonneg (le_of_lt (by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale))) _ + have hu : 0 ≤ (cubeLpNorm Q p u) ^ p.toReal := + Real.rpow_nonneg (cubeLpNorm_nonneg Q p u) _ + apply Real.rpow_nonneg + exact add_nonneg hgrad (mul_nonneg hscale hu) + +@[simp] theorem cubeW1pNorm_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) : + cubeW1pNorm Q p (fun _ => 0) (fun _ => 0) = 0 := by + by_cases hp0 : p = 0 + · simp [cubeW1pNorm, hp0] + by_cases hp : p = ∞ + · simp [cubeW1pNorm, hp] + have hpPos : 0 < p.toReal := ENNReal.toReal_pos hp0 hp + simp [cubeW1pNorm, hp0, hp, hpPos.ne'] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/OverlapLp.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/OverlapLp.lean new file mode 100644 index 0000000000..39abe78a00 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/OverlapLp.lean @@ -0,0 +1,134 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCenters +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms + +/-! # Overlap Lp -/ + +@[expose] public section + +namespace Homogenization + +namespace ScalarOverlap + +noncomputable section + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Average of a scalar field on an overlapping cube. -/ +noncomputable def cubeAverage {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : ℝ := + (cubeVolume S)⁻¹ * + ∫ x in cubeSet S, f x ∂volume + +/-- Coordinatewise average of a vector field on an overlapping cube. -/ +noncomputable def cubeAverageVec {d : ℕ} + (S : TriadicCube d) (u : Vec d → Vec d) : Vec d := + fun i => cubeAverage S fun x => u x i + +/-- Normalized `L^p` norm on an overlapping cube. -/ +noncomputable def cubeLpNorm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → E) : ℝ := + (Gagliardo.integralLpSeminorm u p (normalizedCubeMeasure S)).toReal + +theorem cubeAverage_eq_integral_normalizedCubeMeasure {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage S f = ∫ x, f x ∂ normalizedCubeMeasure S := by + rw [cubeAverage, normalizedCubeMeasure, cubeMeasure, + MeasureTheory.integral_smul_measure] + simp [smul_eq_mul, ENNReal.toReal_ofReal, inv_nonneg, cubeVolume_nonneg] + +@[simp] theorem cubeMeasure_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + cubeMeasure (middleChildCube Q) = Homogenization.cubeMeasure Q := by + rw [cubeMeasure, Homogenization.cubeMeasure, cubeSet_middleChildCube_eq_cubeSet] + +@[simp] theorem normalizedCubeMeasure_middleChildCube {d : ℕ} + (Q : TriadicCube d) : + normalizedCubeMeasure (middleChildCube Q) = + Homogenization.normalizedCubeMeasure Q := by + rw [normalizedCubeMeasure, Homogenization.normalizedCubeMeasure] + simp + +@[simp] theorem cubeAverage_middleChildCube {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage (middleChildCube Q) f = Homogenization.cubeAverage Q f := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + Homogenization.cubeAverage_eq_integral_normalizedCubeMeasure] + simp + +theorem cubeAverage_congr_on_cubeSet {d : ℕ} + {S : TriadicCube d} {u v : Vec d → ℝ} + (h : ∀ x ∈ cubeSet S, u x = v x) : + cubeAverage S u = cubeAverage S v := by + unfold cubeAverage + refine congrArg (fun t : ℝ => (cubeVolume S)⁻¹ * t) ?_ + apply MeasureTheory.integral_congr_ae + exact (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet S)).2 <| + Filter.Eventually.of_forall h + +theorem cubeLpNorm_congr_on_cubeSet_generic {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (p : ℝ≥0∞) + {u v : Vec d → E} (h : ∀ x ∈ cubeSet S, u x = v x) : + cubeLpNorm S p u = cubeLpNorm S p v := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae] + rw [normalizedCubeMeasure, cubeMeasure, Filter.EventuallyEq] + exact MeasureTheory.Measure.ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet S)).2 <| + Filter.Eventually.of_forall h) + (ENNReal.ofReal ((cubeVolume S)⁻¹)) + +@[simp] theorem cubeAverage_const {d : ℕ} + (S : TriadicCube d) (c : ℝ) : + cubeAverage S (fun _ : Vec d => c) = c := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + MeasureTheory.integral_const] + simp [MeasureTheory.Measure.real, normalizedCubeMeasure_apply_univ] + +@[simp] theorem cubeAverageVec_const {d : ℕ} + (S : TriadicCube d) (c : Vec d) : + cubeAverageVec S (fun _ : Vec d => c) = c := by + funext i + simp [cubeAverageVec] + +theorem cubeLpNorm_nonneg {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) : + 0 ≤ cubeLpNorm S p f := + ENNReal.toReal_nonneg + +@[simp] theorem cubeLpNorm_middleChildCube {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (Q : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → E) : + cubeLpNorm (middleChildCube Q) p u = Homogenization.cubeLpNorm Q p u := by + unfold cubeLpNorm Homogenization.cubeLpNorm + simp + +theorem cubeLpNorm_const {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (c : E) (hp : p ≠ 0) : + cubeLpNorm S p (fun _ => c) = ‖c‖ := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + rw [MeasureTheory.eLpNorm_const c hp (normalizedCubeMeasure_ne_zero S), + normalizedCubeMeasure_apply_univ] + simp + +theorem cubeLpNorm_zero {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (S : TriadicCube d) (p : ℝ≥0∞) (hp : p ≠ 0) : + cubeLpNorm S p (fun _ : Vec d => (0 : E)) = 0 := by + simpa using cubeLpNorm_const (S := S) (p := p) (c := (0 : E)) hp + +end + +end ScalarOverlap + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/Projection.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/Projection.lean new file mode 100644 index 0000000000..cdef25067a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/Projection.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage + +/-! # Projection -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators + +@[simp] theorem cubeIncrement_zero {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeIncrement Q 0 f = cubeProjection Q 0 f := rfl + +@[simp] theorem cubeIncrement_succ {d : ℕ} (Q : TriadicCube d) (n : ℕ) (f : Vec d → ℝ) : + cubeIncrement Q (n + 1) f = fun x => cubeProjection Q (n + 1) f x - cubeProjection Q n f x := rfl + +theorem existsUnique_descendantAtDepth_mem_cubeSet {d : ℕ} {Q : TriadicCube d} {x : Vec d} + (n : ℕ) (hx : x ∈ cubeSet Q) : + ∃! R : TriadicCube d, R ∈ descendantsAtDepth Q n ∧ x ∈ cubeSet R := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet n hx with ⟨R, hR, hxR⟩ + refine ⟨R, ⟨hR, hxR⟩, ?_⟩ + intro S hS + rcases hS with ⟨hS, hxS⟩ + by_contra hRS + have hdisj : Disjoint (cubeSet R) (cubeSet S) := + pairwiseDisjoint_descendantsAtDepth Q n hR hS fun h => hRS h.symm + exact hdisj.le_bot ⟨hxR, hxS⟩ + +theorem existsUnique_descendantAtScale_mem_cubeSet {d : ℕ} {Q : TriadicCube d} {x : Vec d} + {k : ℤ} (hk : k ≤ Q.scale) (hx : x ∈ cubeSet Q) : + ∃! R : TriadicCube d, R ∈ descendantsAtScale Q k ∧ x ∈ cubeSet R := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] + exact existsUnique_descendantAtDepth_mem_cubeSet (Int.toNat (Q.scale - k)) hx + +theorem cubeProjection_eq_zero_of_not_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (f : Vec d → ℝ) {x : Vec d} (hx : x ∉ cubeSet Q) : + cubeProjection Q j f x = 0 := by + classical + unfold cubeProjection + refine Finset.sum_eq_zero ?_ + intro R hR + have hxR : x ∉ cubeSet R := by + intro hxR + exact hx (cubeSet_subset_of_mem_descendantsAtDepth hR hxR) + simp [hxR] + +theorem cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hxR : x ∈ cubeSet R) : + cubeProjection Q j f x = cubeAverage R f := by + classical + unfold cubeProjection + have hsum : + Finset.sum (descendantsAtDepth Q j) (fun S => if x ∈ cubeSet S then cubeAverage S f else 0) = + if x ∈ cubeSet R then cubeAverage R f else 0 := + Finset.sum_eq_single_of_mem R hR (fun S hS hSR => by + have hdisj : Disjoint (cubeSet R) (cubeSet S) := + pairwiseDisjoint_descendantsAtDepth Q j hR hS fun h => hSR h.symm + have hxS : x ∉ cubeSet S := by + intro hxS + exact hdisj.le_bot ⟨hxR, hxS⟩ + simp [hxS]) + simpa [hxR] using hsum + +theorem cubeProjection_eq_cubeAverage_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (f : Vec d → ℝ) {x : Vec d} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) (hxR : x ∈ cubeSet R) : + cubeProjection Q (Int.toNat (Q.scale - k)) f x = cubeAverage R f := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hR hxR + +theorem cubeProjection_eq_cubeProjection_of_mem_same_descendant {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) {x y : Vec d} + (hR : R ∈ descendantsAtDepth Q j) (hxR : x ∈ cubeSet R) (hyR : y ∈ cubeSet R) : + cubeProjection Q j f x = cubeProjection Q j f y := by + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hR hxR] + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hR hyR] + +theorem cubeProjection_eq_cubeProjection_of_mem_same_descendantAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (f : Vec d → ℝ) {x y : Vec d} + (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) + (hxR : x ∈ cubeSet R) (hyR : y ∈ cubeSet R) : + cubeProjection Q (Int.toNat (Q.scale - k)) f x = + cubeProjection Q (Int.toNat (Q.scale - k)) f y := by + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtScale f hk hR hxR] + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtScale f hk hR hyR] + +theorem cubeProjection_eq_zero_of_not_mem_descendantsAtDepth_union {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ) {x : Vec d} + (hx : x ∉ (⋃ R ∈ (descendantsAtDepth Q j : Set (TriadicCube d)), cubeSet R)) : + cubeProjection Q j f x = 0 := by + apply cubeProjection_eq_zero_of_not_mem_cubeSet Q j f + intro hxQ + exact hx ((cubeSet_eq_iUnion_descendantsAtDepth Q j).symm ▸ hxQ) + +theorem cubeAverage_const {d : ℕ} (Q : TriadicCube d) (c : ℝ) : + cubeAverage Q (fun _ => c) = c := by + have hvol : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + have hreal : MeasureTheory.volume.real (cubeSet Q) = cubeVolume Q := by + simp [MeasureTheory.measureReal_def, volume_cubeSet_toReal] + calc + cubeAverage Q (fun _ => c) + = (cubeVolume Q)⁻¹ * ∫ x in cubeSet Q, c ∂MeasureTheory.volume := rfl + _ = (cubeVolume Q)⁻¹ * (MeasureTheory.volume.real (cubeSet Q) * c) := by + simp [MeasureTheory.integral_const, smul_eq_mul] + _ = (cubeVolume Q)⁻¹ * (cubeVolume Q * c) := by rw [hreal] + _ = ((cubeVolume Q)⁻¹ * cubeVolume Q) * c := by ring + _ = c := by rw [inv_mul_cancel₀ hvol, one_mul] + +theorem cubeProjection_const_of_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) + {x : Vec d} (hx : x ∈ cubeSet Q) : + cubeProjection Q j (fun _ => c) x = c := by + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet j hx with ⟨R, hR, hxR⟩ + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth (fun _ => c) hR hxR, + cubeAverage_const] + +theorem cubeProjection_const_of_not_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) + {x : Vec d} (hx : x ∉ cubeSet Q) : + cubeProjection Q j (fun _ => c) x = 0 := + cubeProjection_eq_zero_of_not_mem_cubeSet Q j (fun _ => c) hx + +theorem cubeIncrement_eq_zero_of_not_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (f : Vec d → ℝ) {x : Vec d} (hx : x ∉ cubeSet Q) : + cubeIncrement Q j f x = 0 := by + cases j with + | zero => + simpa [cubeIncrement] using cubeProjection_eq_zero_of_not_mem_cubeSet Q 0 f hx + | succ n => + simp [cubeIncrement, cubeProjection_eq_zero_of_not_mem_cubeSet Q _ f hx] + +theorem cubeIncrement_eq_sub_cubeProjection_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q (j + 1)) (hxR : x ∈ cubeSet R) : + cubeIncrement Q (j + 1) f x = cubeAverage R f - cubeProjection Q j f x := by + rw [cubeIncrement_succ] + change cubeProjection Q (j + 1) f x - cubeProjection Q j f x = + cubeAverage R f - cubeProjection Q j f x + rw [cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hR hxR] + +theorem cubeIncrement_eq_sub_cubeAverage_of_mem_descendantsAtDepth {d : ℕ} + {Q R S : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) {x : Vec d} + (hR : R ∈ descendantsAtDepth Q (j + 1)) (hS : S ∈ descendantsAtDepth Q j) + (hxR : x ∈ cubeSet R) (hxS : x ∈ cubeSet S) : + cubeIncrement Q (j + 1) f x = cubeAverage R f - cubeAverage S f := by + rw [cubeIncrement_eq_sub_cubeProjection_of_mem_descendantsAtDepth f hR hxR, + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hS hxS] + +theorem cubeIncrement_telescope {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) (x : Vec d) + (n : ℕ) : + Finset.sum (Finset.range (n + 1)) (fun j => cubeIncrement Q j f x) = cubeProjection Q n f x := by + induction n with + | zero => + simp [cubeIncrement] + | succ n ih => + rw [Finset.sum_range_succ, cubeIncrement_succ, ih] + ring + +theorem cubeIncrement_zero_const_of_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (c : ℝ) + {x : Vec d} (hx : x ∈ cubeSet Q) : + cubeIncrement Q 0 (fun _ => c) x = c := by + simpa [cubeIncrement] using cubeProjection_const_of_mem_cubeSet Q 0 c hx + +theorem cubeIncrement_zero_const_of_not_mem_cubeSet {d : ℕ} (Q : TriadicCube d) (c : ℝ) + {x : Vec d} (hx : x ∉ cubeSet Q) : + cubeIncrement Q 0 (fun _ => c) x = 0 := by + simpa [cubeIncrement] using cubeProjection_const_of_not_mem_cubeSet Q 0 c hx + +theorem cubeIncrement_succ_const {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) (x : Vec d) : + cubeIncrement Q (j + 1) (fun _ => c) x = 0 := by + by_cases hx : x ∈ cubeSet Q + · rcases exists_mem_descendantsAtDepth_of_mem_cubeSet (j + 1) hx with ⟨R, hR, hxR⟩ + rcases exists_mem_descendantsAtDepth_of_mem_cubeSet j hx with ⟨S, hS, hxS⟩ + rw [cubeIncrement_eq_sub_cubeAverage_of_mem_descendantsAtDepth (fun _ => c) hR hS hxR hxS, + cubeAverage_const, cubeAverage_const] + ring + · exact cubeIncrement_eq_zero_of_not_mem_cubeSet Q (j + 1) (fun _ => c) hx + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionConvergence.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionConvergence.lean new file mode 100644 index 0000000000..f0ff9d614d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionConvergence.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Multiscale.Projection +public import Mathlib.Analysis.SpecificLimits.Basic +public import Mathlib.MeasureTheory.Covering.DensityTheorem +public import Mathlib.MeasureTheory.Measure.Lebesgue.EqHaar + +/-! # Projection Convergence -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable def descendantContaining {d : ℕ} (Q : TriadicCube d) (x : Vec d) (n : ℕ) + (hx : x ∈ cubeSet Q) : TriadicCube d := + Classical.choose (existsUnique_descendantAtDepth_mem_cubeSet (Q := Q) (x := x) n hx) + +theorem descendantContaining_mem_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) (x : Vec d) + (n : ℕ) (hx : x ∈ cubeSet Q) : + descendantContaining Q x n hx ∈ descendantsAtDepth Q n := + (Classical.choose_spec (existsUnique_descendantAtDepth_mem_cubeSet (Q := Q) (x := x) n hx)).1.1 + +theorem mem_cubeSet_descendantContaining {d : ℕ} (Q : TriadicCube d) (x : Vec d) + (n : ℕ) (hx : x ∈ cubeSet Q) : + x ∈ cubeSet (descendantContaining Q x n hx) := + (Classical.choose_spec (existsUnique_descendantAtDepth_mem_cubeSet (Q := Q) (x := x) n hx)).1.2 + +theorem cubeScaleFactor_descendantContaining {d : ℕ} (Q : TriadicCube d) (x : Vec d) + (n : ℕ) (hx : x ∈ cubeSet Q) : + cubeScaleFactor (descendantContaining Q x n hx) = cubeScaleFactor Q / (3 : ℝ) ^ n := by + have hmem := descendantContaining_mem_descendantsAtDepth Q x n hx + rw [cubeScaleFactor, scale_eq_sub_of_mem_descendantsAtDepth hmem, zpow_sub₀] + · simp [cubeScaleFactor, div_eq_mul_inv] + · norm_num + +theorem cubeRadius_descendantContaining {d : ℕ} (Q : TriadicCube d) (x : Vec d) + (n : ℕ) (hx : x ∈ cubeSet Q) : + cubeRadius (descendantContaining Q x n hx) = + ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n) := by + calc + cubeRadius (descendantContaining Q x n hx) + = (1 / 2 : ℝ) * (cubeScaleFactor Q / (3 : ℝ) ^ n) := by + rw [cubeRadius, cubeScaleFactor_descendantContaining] + _ = ((1 / 2 : ℝ) * cubeScaleFactor Q) / (3 : ℝ) ^ n := by ring + _ = ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n) := by + simp [div_eq_mul_inv] + +theorem ae_tendsto_cubeProjection_of_integrableOn {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.IntegrableOn f (cubeSet Q) MeasureTheory.volume) : + ∀ᵐ x ∂(MeasureTheory.volume.restrict (cubeSet Q)), + Filter.Tendsto (fun n => cubeProjection Q n f x) Filter.atTop (𝓝 (f x)) := by + let fQ : Vec d → ℝ := Set.indicator (cubeSet Q) f + have hfQ : MeasureTheory.Integrable fQ MeasureTheory.volume := by + rw [MeasureTheory.integrable_indicator_iff (measurableSet_cubeSet Q)] + exact hf + have hldt := + IsUnifLocDoublingMeasure.ae_tendsto_average + (μ := MeasureTheory.volume) (f := fQ) (K := (1 : ℝ)) hfQ.locallyIntegrable + refine (MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 ?_ + filter_upwards [hldt] with x hx hxQ + let R : ℕ → TriadicCube d := fun n => descendantContaining Q x n hxQ + have hpow : + Filter.Tendsto (fun n : ℕ => ((1 / 3 : ℝ) ^ n)) Filter.atTop (𝓝 (0 : ℝ)) := by + exact tendsto_pow_atTop_nhds_zero_of_lt_one (by positivity) (by norm_num) + have hrad0 : + Filter.Tendsto (fun n : ℕ => ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n)) + Filter.atTop (𝓝 (0 : ℝ)) := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + hpow.const_mul (((1 / 2 : ℝ) * cubeScaleFactor Q)) + have hrad_pos : + ∀ᶠ n : ℕ in Filter.atTop, + ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n) ∈ Set.Ioi (0 : ℝ) := by + exact Filter.Eventually.of_forall fun n => by + show 0 < ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n) + have hcube : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact mul_pos (mul_pos (by norm_num) hcube) (pow_pos (by norm_num) _) + have hrad : + Filter.Tendsto (fun n : ℕ => ((1 / 2 : ℝ) * cubeScaleFactor Q) * ((1 / 3 : ℝ) ^ n)) + Filter.atTop (𝓝[>] (0 : ℝ)) := by + exact tendsto_nhdsWithin_of_tendsto_nhds_of_eventually_within _ hrad0 hrad_pos + have hδ : + Filter.Tendsto (fun n : ℕ => cubeRadius (R n)) Filter.atTop (𝓝[>] (0 : ℝ)) := by + convert hrad using 1 + funext n + exact cubeRadius_descendantContaining Q x n hxQ + have hxmem : + ∀ᶠ n : ℕ in Filter.atTop, x ∈ Metric.closedBall (cubeCenter (R n)) (cubeRadius (R n)) := by + exact Filter.Eventually.of_forall fun n => + cubeSet_subset_closedBall (R n) (mem_cubeSet_descendantContaining Q x n hxQ) + have hconv : + Filter.Tendsto + (fun n => ⨍ y in Metric.closedBall (cubeCenter (R n)) (cubeRadius (R n)), + fQ y ∂MeasureTheory.volume) + Filter.atTop (𝓝 (fQ x)) := + hx (fun n => cubeCenter (R n)) (fun n => cubeRadius (R n)) hδ <| by + simpa using hxmem + have hproj : + Filter.Tendsto (fun n => cubeProjection Q n f x) Filter.atTop (𝓝 (fQ x)) := by + have hproj_eq : + (fun n => cubeProjection Q n f x) = + (fun n => ⨍ y in Metric.closedBall (cubeCenter (R n)) (cubeRadius (R n)), + fQ y ∂MeasureTheory.volume) := by + funext n + have hRmem : R n ∈ descendantsAtDepth Q n := + descendantContaining_mem_descendantsAtDepth Q x n hxQ + have hxR : x ∈ cubeSet (R n) := + mem_cubeSet_descendantContaining Q x n hxQ + calc + cubeProjection Q n f x = cubeAverage (R n) f := by + exact cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hRmem hxR + _ = ⨍ y in cubeSet (R n), f y ∂MeasureTheory.volume := by + exact cubeAverage_eq_setAverage_cubeSet (R n) f + _ = ⨍ y in cubeSet (R n), fQ y ∂MeasureTheory.volume := by + symm + apply MeasureTheory.setAverage_congr_fun (hs := measurableSet_cubeSet (R n)) + exact Filter.Eventually.of_forall fun y hy => by + simp [fQ, Set.indicator_of_mem, + cubeSet_subset_of_mem_descendantsAtDepth hRmem hy] + _ = ⨍ y in Metric.closedBall (cubeCenter (R n)) (cubeRadius (R n)), + fQ y ∂MeasureTheory.volume := by + exact MeasureTheory.setAverage_congr (cubeSet_ae_eq_closedBall (R n)) + simpa [hproj_eq] using hconv + simpa [fQ, Set.indicator_of_mem hxQ] using hproj + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionLp.lean b/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionLp.lean new file mode 100644 index 0000000000..378332fa85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Multiscale/ProjectionLp.lean @@ -0,0 +1,141 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import Mathlib.MeasureTheory.Measure.MeasureSpace +public import Mathlib.MeasureTheory.Measure.Restrict + +/-! # Projection Lp -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory.Measure +open scoped ENNReal + +/-! +`L^p` wrappers for the projection layer. + +This first checkpoint stays deliberately local: it packages the fact that +`cubeProjection` is constant on each active descendant cube, then converts that +pointwise statement into normalized cube `L^p` identities. It also records the +constant-function behavior of `cubeProjection` and `cubeIncrement`. +-/ + +theorem cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (f : Vec d → ℝ) + (hR : R ∈ descendantsAtDepth Q j) : + cubeProjection Q j f =ᵐ[normalizedCubeMeasure R] (fun _ => cubeAverage R f) := by + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet R)).2 <| + Filter.Eventually.of_forall fun x hx => + cubeProjection_eq_cubeAverage_of_mem_descendantsAtDepth f hR hx) + (ENNReal.ofReal ((cubeVolume R)⁻¹)) + +theorem cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtScale {d : ℕ} + {Q R : TriadicCube d} {k : ℤ} (f : Vec d → ℝ) (hk : k ≤ Q.scale) + (hR : R ∈ descendantsAtScale Q k) : + cubeProjection Q (Int.toNat (Q.scale - k)) f =ᵐ[normalizedCubeMeasure R] + (fun _ => cubeAverage R f) := by + rw [descendantsAtScale_eq_descendantsAtDepth Q hk] at hR + exact cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth f hR + +theorem cubeLpNorm_cubeProjection_eq_abs_cubeAverage_of_mem_descendantsAtDepth {d : ℕ} {Q R : TriadicCube d} + {j : ℕ} (p : ℝ≥0∞) (f : Vec d → ℝ) (hR : R ∈ descendantsAtDepth Q j) (hp : p ≠ 0) : + cubeLpNorm R p (cubeProjection Q j f) = ‖cubeAverage R f‖ := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtDepth f hR)] + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + rw [MeasureTheory.eLpNorm_const (cubeAverage R f) hp (normalizedCubeMeasure_ne_zero R), + normalizedCubeMeasure_apply_univ] + simp [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + +theorem cubeLpNorm_cubeProjection_eq_abs_cubeAverage_of_mem_descendantsAtScale {d : ℕ} {Q R : TriadicCube d} + {k : ℤ} (p : ℝ≥0∞) (f : Vec d → ℝ) (hk : k ≤ Q.scale) (hR : R ∈ descendantsAtScale Q k) + (hp : p ≠ 0) : cubeLpNorm R p (cubeProjection Q (Int.toNat (Q.scale - k)) f) = ‖cubeAverage R f‖ := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae + (cubeProjection_ae_eq_cubeAverage_of_mem_descendantsAtScale f hk hR)] + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + rw [MeasureTheory.eLpNorm_const (cubeAverage R f) hp (normalizedCubeMeasure_ne_zero R), + normalizedCubeMeasure_apply_univ] + simp [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + +theorem cubeProjection_ae_eq_const {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + cubeProjection Q j (fun _ => c) =ᵐ[normalizedCubeMeasure Q] (fun _ => c) := by + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => + cubeProjection_const_of_mem_cubeSet Q j c hx) + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +theorem cubeLpNorm_cubeProjection_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (j : ℕ) + (f : Vec d → ℝ) : 0 ≤ cubeLpNorm Q p (cubeProjection Q j f) := + cubeLpNorm_nonneg Q p (cubeProjection Q j f) + +theorem cubeLpNorm_cubeIncrement_nonneg {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (j : ℕ) + (f : Vec d → ℝ) : 0 ≤ cubeLpNorm Q p (cubeIncrement Q j f) := + cubeLpNorm_nonneg Q p (cubeIncrement Q j f) + +theorem cubeLpNorm_cubeProjection_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) (j : ℕ) + (c : ℝ) (hp : p ≠ 0) : cubeLpNorm Q p (cubeProjection Q j (fun _ => c)) = ‖c‖ := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae (cubeProjection_ae_eq_const Q j c)] + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + rw [MeasureTheory.eLpNorm_const c hp (normalizedCubeMeasure_ne_zero Q), + normalizedCubeMeasure_apply_univ] + simp [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + +@[simp] theorem cubeLpNorm_cubeProjection_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (j : ℕ) : cubeLpNorm Q p (cubeProjection Q j (fun _ => (0 : ℝ))) = 0 := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae (cubeProjection_ae_eq_const Q j (0 : ℝ))] + simp [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + +theorem cubeIncrement_ae_eq_zero_const_succ {d : ℕ} (Q : TriadicCube d) (j : ℕ) (c : ℝ) : + cubeIncrement Q (j + 1) (fun _ => c) =ᵐ[normalizedCubeMeasure Q] (fun _ => (0 : ℝ)) := by + rw [normalizedCubeMeasure, Filter.EventuallyEq] + exact ae_smul_measure + ((MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)).2 <| + Filter.Eventually.of_forall fun x hx => + cubeIncrement_succ_const Q j c x) + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +theorem cubeLpNorm_cubeIncrement_zero_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (c : ℝ) (hp : p ≠ 0) : cubeLpNorm Q p (cubeIncrement Q 0 (fun _ => c)) = ‖c‖ := by + simpa [cubeIncrement] using + cubeLpNorm_cubeProjection_const (Q := Q) (p := p) (j := 0) c hp + +@[simp] theorem cubeLpNorm_cubeIncrement_succ_const {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (j : ℕ) (c : ℝ) : cubeLpNorm Q p (cubeIncrement Q (j + 1) (fun _ => c)) = 0 := by + unfold cubeLpNorm + rw [Gagliardo.integralLpSeminorm_congr_ae (cubeIncrement_ae_eq_zero_const_succ Q j c)] + simp [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + MeasureTheory.aestronglyMeasurable_const] + +@[simp] theorem cubeLpNorm_cubeIncrement_zero {d : ℕ} (Q : TriadicCube d) (p : ℝ≥0∞) + (j : ℕ) : cubeLpNorm Q p (cubeIncrement Q j (fun _ => (0 : ℝ))) = 0 := by + cases j with + | zero => + simp [cubeIncrement, cubeLpNorm_cubeProjection_zero] + | succ n => + simpa [Nat.succ_eq_add_one] using + cubeLpNorm_cubeIncrement_succ_const (Q := Q) (p := p) (j := n) (c := (0 : ℝ)) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE.lean b/LeanPool/CoarseGraining/Homogenization/PDE.lean new file mode 100644 index 0000000000..c3f8f946d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.PDE.EnergyIdentities +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicCube +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicHilbert +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/DirichletRHS.lean b/LeanPool/CoarseGraining/Homogenization/PDE/DirichletRHS.lean new file mode 100644 index 0000000000..8aff5921fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/DirichletRHS.lean @@ -0,0 +1,974 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Dirichlet RHS -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators + +/-! +# Zero-trace Dirichlet problems with right-hand side + +This file records the weak solution surface used by the deterministic +coarse-grained Poincare-with-RHS argument. At this stage it packages the +first-variation identity and the immediate consequences needed in Step 1 of the +notes: invariance under subtracting constants from the forcing, zero average +gradient of the zero-trace corrector, and the basic elliptic energy bound. +-/ + +/-- Weak zero-trace formulation of `- div (a grad u) = div g` on `U`. -/ +def IsZeroTraceDirichletRhsWeakSolution {d : ℕ} + (a : CoeffField d) (U : Set (Vec d)) (u : H10Function U) (g : Vec d → Vec d) : Prop := + ∀ φ : H10Function U, + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +theorem integral_vecDot_const_zeroTraceGrad_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H10Function U) (c : Vec d) : + ∫ x in U, vecDot c (u.toH1Function.grad x) ∂MeasureTheory.volume = 0 := by + have hzero : + (fun i => ∫ x in U, u.toH1Function.grad x i ∂MeasureTheory.volume) = 0 := + IsPotentialZeroTraceOn.integral_eq_zero u.isPotentialZeroTraceOn + calc + ∫ x in U, vecDot c (u.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, ∑ i, c i * u.toH1Function.grad x i ∂MeasureTheory.volume := by + simp [vecDot] + _ = ∑ i, ∫ x in U, c i * u.toH1Function.grad x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro i hi + have hbase : + MeasureTheory.Integrable + (fun x => u.toH1Function.grad x i) (MeasureTheory.volume.restrict U) := + (u.toH1Function.grad_memL2 i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + simpa using hbase.const_mul (c i) + _ = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + have hzeroi : ∫ x in U, u.toH1Function.grad x i ∂MeasureTheory.volume = 0 := by + simpa using congrFun hzero i + rw [MeasureTheory.integral_const_mul, hzeroi] + simp + +theorem integral_vecDot_sub_const_zeroTraceGrad_eq + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (u : H10Function U) (c : Vec d) : + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + have hg_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (g x) (u.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hg u.toH1Function.grad_memVectorL2 + have hc_mem : MemVectorL2 U (fun _ : Vec d => c) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) c + have hc_int : + MeasureTheory.IntegrableOn + (fun x => vecDot c (u.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hc_mem u.toH1Function.grad_memVectorL2 + have hfun : + (fun x => vecDot (g x - c) (u.toH1Function.grad x)) = + fun x => vecDot (g x) (u.toH1Function.grad x) - vecDot c (u.toH1Function.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + rw [hfun, MeasureTheory.integral_sub hg_int hc_int, + integral_vecDot_const_zeroTraceGrad_eq_zero] + simp + +theorem integral_vecDot_add_const_zeroTraceGrad_eq + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (u : H10Function U) (c : Vec d) : + ∫ x in U, vecDot (g x + c) (u.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa [sub_eq_add_neg] using + integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hg u (-c) + +theorem integrableOn_vecNormSq_h1Grad + {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u.grad x)) U := by + simpa [vecNormSq] using + (integrableOn_vecDot_of_memVectorL2 + u.grad_memVectorL2 u.grad_memVectorL2) + +theorem integrableOn_vecNormSq_zeroTraceGrad + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u.toH1Function.grad x)) U := by + simpa using integrableOn_vecNormSq_h1Grad u.toH1Function + +theorem integrableOn_dirichletEnergyDensity_of_isEllipticFieldOn + {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (u : H10Function U) : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x))) U := by + have hflux : MemVectorL2 U (fun x => matVecMul (a x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2 + exact integrableOn_vecDot_of_memVectorL2 u.toH1Function.grad_memVectorL2 hflux + +namespace IsZeroTraceDirichletRhsWeakSolution + +variable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} +variable {u : H10Function U} {g : Vec d → Vec d} + +theorem averageGradient_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (_h : IsZeroTraceDirichletRhsWeakSolution a U u g) : + u.toH1Function.averageGradient = 0 := by + simpa using H10Function.averageGradient_eq_zero u + +theorem sub_const_iff + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hmem : MemVectorL2 U g) (c : Vec d) : + IsZeroTraceDirichletRhsWeakSolution a U u (fun x => g x - c) ↔ + IsZeroTraceDirichletRhsWeakSolution a U u g := by + constructor + · intro h φ + calc + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, vecDot (g x - c) (φ.toH1Function.grad x) ∂MeasureTheory.volume := h φ + _ = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := + integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hmem φ c + · intro h φ + calc + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := h φ + _ = + ∫ x in U, vecDot (g x - c) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + symm + exact integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hmem φ c + +theorem add_const_iff + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hmem : MemVectorL2 U g) (c : Vec d) : + IsZeroTraceDirichletRhsWeakSolution a U u (fun x => g x + c) ↔ + IsZeroTraceDirichletRhsWeakSolution a U u g := by + simpa [sub_eq_add_neg] using sub_const_iff (a := a) (U := U) (u := u) (g := g) hmem (-c) + +theorem energy_identity + (h : IsZeroTraceDirichletRhsWeakSolution a U u g) : + ∫ x in U, vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa [vecDot_comm] using h u + +theorem energy_identity_sub_const + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hmem : MemVectorL2 U g) (c : Vec d) : + ∫ x in U, vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + ∫ x in U, vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume + = + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := + energy_identity h + _ = + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + symm + exact integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hmem u c + +theorem energy_le_rhs_pairing_of_isEllipticFieldOn + {lam Lam : ℝ} (h : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) : + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume ≤ + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + have hsq_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u.toH1Function.grad x)) U := + integrableOn_vecNormSq_zeroTraceGrad u + have hlhs_int : + MeasureTheory.IntegrableOn (fun x => lam * vecNormSq (u.toH1Function.grad x)) U := + hsq_int.const_mul lam + have henergy_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x))) U := + integrableOn_dirichletEnergyDensity_of_isEllipticFieldOn hEll u + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hpoint : + ∀ᵐ x ∂ volumeMeasureOn U, + lam * vecNormSq (u.toH1Function.grad x) ≤ + vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) := by + filter_upwards [hmem] with x hx + exact (hEll.2 x hx).2.2.1 (u.toH1Function.grad x) + calc + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, lam * vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ ≤ + ∫ x in U, vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume := + MeasureTheory.integral_mono_ae hlhs_int henergy_int hpoint + _ = ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := + energy_identity h + +theorem energy_le_sub_const_rhs_pairing_of_isEllipticFieldOn + {lam Lam : ℝ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) + (hmem : MemVectorL2 U g) (c : Vec d) : + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume ≤ + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume + ≤ ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := + energy_le_rhs_pairing_of_isEllipticFieldOn h hEll + _ = + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + symm + exact integral_vecDot_sub_const_zeroTraceGrad_eq (U := U) hmem u c + +theorem of_grad_eq + {v : H10Function U} + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hgrad : v.toH1Function.grad = u.toH1Function.grad) : + IsZeroTraceDirichletRhsWeakSolution a U v g := by + intro φ + simpa [hgrad] using hu φ + +theorem sub_zero + {v : H10Function U} + {lam Lam : ℝ} + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hv : IsZeroTraceDirichletRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + IsZeroTraceDirichletRhsWeakSolution a U (u - v) (0 : Vec d → Vec d) := by + intro φ + have huFlux : MemVectorL2 U (fun x => matVecMul (a x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2 + have hvFlux : MemVectorL2 U (fun x => matVecMul (a x) (v.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.toH1Function.grad_memVectorL2 + have huInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 huFlux φ.toH1Function.grad_memVectorL2 + have hvInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hvFlux φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => + vecDot (matVecMul (a x) ((u - v).toH1Function.grad x)) (φ.toH1Function.grad x)) = + (fun x => + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x)) := by + funext x + have hgradSubX : + ((u - v).toH1Function.grad x) = u.toH1Function.grad x - v.toH1Function.grad x := by + change ((u.toH1Function - v.toH1Function).grad x) = + u.toH1Function.grad x - v.toH1Function.grad x + exact congrArg (fun f => f x) (H1Function.sub_grad u.toH1Function v.toH1Function) + rw [hgradSubX] + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, vecDot_neg_left] + calc + ∫ x in U, + vecDot (matVecMul (a x) ((u - v).toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, + (vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x)) + ∂MeasureTheory.volume := by + rw [hfun] + _ = + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in U, vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub huInt hvInt] + _ = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume - + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [hu φ, hv φ] + _ = ∫ x in U, vecDot (0 : Vec d) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + symm + simp [vecDot] + +theorem gradToVectorL2_eq_of_isEllipticFieldOn + {v : H10Function U} {lam Lam : ℝ} (hne : Set.Nonempty U) + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hv : IsZeroTraceDirichletRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toH1Function.gradToVectorL2 = v.toH1Function.gradToVectorL2 := by + let w : H10Function U := u - v + have hw : IsZeroTraceDirichletRhsWeakSolution a U w (0 : Vec d → Vec d) := + sub_zero hu hv hEll + rcases hne with ⟨x, hx⟩ + have hlam : 0 < lam := (hEll.2 x hx).1 + have henergy : + lam * ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume ≤ 0 := by + calc + lam * ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume + ≤ ∫ y in U, vecDot (0 : Vec d) (w.toH1Function.grad y) ∂MeasureTheory.volume := + energy_le_rhs_pairing_of_isEllipticFieldOn + (u := w) (g := (0 : Vec d → Vec d)) hw hEll + _ = 0 := by + simp [vecDot] + have hsqInt : + MeasureTheory.IntegrableOn (fun y => vecNormSq (w.toH1Function.grad y)) U := + integrableOn_vecNormSq_zeroTraceGrad w + have hsqNonneg : + 0 ≤ ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume := + MeasureTheory.integral_nonneg fun _ => vecNormSq_nonneg _ + have hsqLeZero : + ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume ≤ 0 := by + nlinarith + have hsqZero : + ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume = 0 := + le_antisymm hsqLeZero hsqNonneg + have hsqAe : + (fun y => vecNormSq (w.toH1Function.grad y)) =ᵐ[volumeMeasureOn U] 0 := by + exact + (MeasureTheory.integral_eq_zero_iff_of_nonneg_ae + (Filter.Eventually.of_forall fun _ => vecNormSq_nonneg _) + hsqInt.integrable).1 hsqZero + have hgradAe : + (fun y => w.toH1Function.grad y) =ᵐ[volumeMeasureOn U] 0 := by + filter_upwards [hsqAe] with y hy + exact vecNormSq_eq_zero hy + have hgradZero : w.toH1Function.gradToVectorL2 = 0 := by + apply MeasureTheory.Lp.ext + let hzeroAe := + MeasureTheory.Lp.coeFn_zero (E := Vec d) (p := (2 : ENNReal)) (μ := volumeMeasureOn U) + filter_upwards + [H1Function.coeFn_gradToVectorL2 w.toH1Function, hzeroAe, hgradAe] + with y hwGrad hzero hy + rw [hwGrad, hzero, hy] + have hsub : + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 = 0 := by + have hneg : + (-v.toH1Function).gradToVectorL2 = -v.toH1Function.gradToVectorL2 := by + simpa using H1Function.gradToVectorL2_smul (-1 : ℝ) v.toH1Function + have hgradSubH1 : + (u.toH1Function - v.toH1Function).gradToVectorL2 = + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + calc + (u.toH1Function - v.toH1Function).gradToVectorL2 + = u.toH1Function.gradToVectorL2 + (-v.toH1Function).gradToVectorL2 := by + simpa [sub_eq_add_neg] using + H1Function.gradToVectorL2_add u.toH1Function (-v.toH1Function) + _ = u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + rw [hneg, sub_eq_add_neg] + have hgradSub : + (u - v).toH1Function.gradToVectorL2 = + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + simpa using! hgradSubH1 + calc + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 + = (u - v).toH1Function.gradToVectorL2 := by + symm + exact hgradSub + _ = 0 := hgradZero + exact sub_eq_zero.mp hsub + +theorem gradToVectorL2_eq_of_isOpenBoundedConvexDomain + {v : H10Function U} {lam Lam : ℝ} + (_hU : IsOpenBoundedConvexDomain U) (hne : Set.Nonempty U) + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hv : IsZeroTraceDirichletRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toH1Function.gradToVectorL2 = v.toH1Function.gradToVectorL2 := + gradToVectorL2_eq_of_isEllipticFieldOn hne hu hv hEll + +theorem toScalarL2_eq_of_isOpenBoundedConvexDomain + {v : H10Function U} {lam Lam : ℝ} + (hU : IsOpenBoundedConvexDomain U) [NeZero d] (hne : Set.Nonempty U) + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hv : IsZeroTraceDirichletRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toH1Function.toScalarL2 = v.toH1Function.toScalarL2 := by + let w : H10Function U := u - v + have hgradEq : + u.toH1Function.gradToVectorL2 = v.toH1Function.gradToVectorL2 := + gradToVectorL2_eq_of_isEllipticFieldOn hne hu hv hEll + have hgradZero : w.toH1Function.gradToVectorL2 = 0 := by + have hneg : + (-v.toH1Function).gradToVectorL2 = -v.toH1Function.gradToVectorL2 := by + simpa using H1Function.gradToVectorL2_smul (-1 : ℝ) v.toH1Function + have hgradSubH1 : + (u.toH1Function - v.toH1Function).gradToVectorL2 = + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + calc + (u.toH1Function - v.toH1Function).gradToVectorL2 + = u.toH1Function.gradToVectorL2 + (-v.toH1Function).gradToVectorL2 := by + simpa [sub_eq_add_neg] using + H1Function.gradToVectorL2_add u.toH1Function (-v.toH1Function) + _ = u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + rw [hneg, sub_eq_add_neg] + have hgradSub : + (u - v).toH1Function.gradToVectorL2 = + u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + simpa using! hgradSubH1 + calc + w.toH1Function.gradToVectorL2 + = u.toH1Function.gradToVectorL2 - v.toH1Function.gradToVectorL2 := by + simpa [w] using hgradSub + _ = 0 := sub_eq_zero.mpr hgradEq + have hP : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ z : H10Function U, + ‖z.toH1Function.toScalarL2‖ ≤ C * z.toH1Function.gradientCoordL2NormSum := + H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain hU + have hvalZero : + w.toH1Function.toScalarL2 = 0 := + H10Function.toScalarL2_eq_zero_of_gradToVectorL2_eq_zero_of_exists_poincare_constant + hP w hgradZero + have hsub : + u.toH1Function.toScalarL2 - v.toH1Function.toScalarL2 = 0 := by + have hneg : + (-v.toH1Function).toScalarL2 = -v.toH1Function.toScalarL2 := by + simpa using H1Function.toScalarL2_smul (-1 : ℝ) v.toH1Function + have hvalueSubH1 : + (u.toH1Function - v.toH1Function).toScalarL2 = + u.toH1Function.toScalarL2 - v.toH1Function.toScalarL2 := by + calc + (u.toH1Function - v.toH1Function).toScalarL2 + = u.toH1Function.toScalarL2 + (-v.toH1Function).toScalarL2 := by + simpa [sub_eq_add_neg] using + H1Function.toScalarL2_add u.toH1Function (-v.toH1Function) + _ = u.toH1Function.toScalarL2 - v.toH1Function.toScalarL2 := by + rw [hneg, sub_eq_add_neg] + have hvalueSub : + (u - v).toH1Function.toScalarL2 = + u.toH1Function.toScalarL2 - v.toH1Function.toScalarL2 := by + simpa using! hvalueSubH1 + calc + u.toH1Function.toScalarL2 - v.toH1Function.toScalarL2 + = (u - v).toH1Function.toScalarL2 := by + symm + exact hvalueSub + _ = 0 := hvalZero + exact sub_eq_zero.mp hsub + +end IsZeroTraceDirichletRhsWeakSolution + +namespace PotentialZeroTraceHilbert + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The Hilbert realization of the closed `L²` subspace modeling `\Lpoto(U)`. -/ +noncomputable def closedSubmodule (M : PotentialSolenoidalL2Data U) : + ClosedSubmodule ℝ (HilbertVectorL2 U) := + M.potentialZeroTrace.comap + ((continuousLinearEquivVectorL2 (U := U)).symm.toContinuousLinearMap) + +noncomputable abbrev submodule (M : PotentialSolenoidalL2Data U) : + Submodule ℝ (HilbertVectorL2 U) := + (closedSubmodule (M := M)).toSubmodule + +noncomputable abbrev Space (M : PotentialSolenoidalL2Data U) := + ↥(submodule (M := M)) + +noncomputable instance instSeminormedAddCommGroup (M : PotentialSolenoidalL2Data U) : + SeminormedAddCommGroup (Space M) := by + exact inferInstanceAs (SeminormedAddCommGroup (submodule (M := M))) + +noncomputable instance instNormedAddCommGroup (M : PotentialSolenoidalL2Data U) : + NormedAddCommGroup (Space M) := by + exact inferInstanceAs (NormedAddCommGroup (submodule (M := M))) + +noncomputable instance instNormedSpace (M : PotentialSolenoidalL2Data U) : + NormedSpace ℝ (Space M) := by + exact inferInstanceAs (NormedSpace ℝ (submodule (M := M))) + +noncomputable instance instInnerProductSpace (M : PotentialSolenoidalL2Data U) : + InnerProductSpace ℝ (Space M) := by + exact inferInstanceAs (InnerProductSpace ℝ (submodule (M := M))) + +noncomputable instance instCompleteSpace (M : PotentialSolenoidalL2Data U) : + CompleteSpace (Space M) := by + simpa [Space, submodule, closedSubmodule] using! + (closedSubmodule (M := M)).isClosed.completeSpace_coe + +/-- The ambient Hilbert-vector `L²` field represented by a point of +`\Lpoto(U)`. -/ +abbrev field {M : PotentialSolenoidalL2Data U} (z : Space M) : HilbertVectorL2 U := + z.1 + +/-- The ambient vector `L²` field represented by a point of `\Lpoto(U)`. -/ +noncomputable def vectorFieldCLM (M : PotentialSolenoidalL2Data U) : + Space M →L[ℝ] VectorL2 U := + ((continuousLinearEquivVectorL2 (U := U)).symm.toContinuousLinearMap).comp + (submodule (M := M)).subtypeL + +noncomputable abbrev vectorField {M : PotentialSolenoidalL2Data U} (z : Space M) : VectorL2 U := + vectorFieldCLM M z + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem vectorFieldCLM_apply (M : PotentialSolenoidalL2Data U) (z : Space M) : + vectorFieldCLM M z = vectorField z := + rfl + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem mem_potentialZeroTrace {M : PotentialSolenoidalL2Data U} (z : Space M) : + vectorField z ∈ M.potentialZeroTrace := by + exact (ClosedSubmodule.mem_comap).1 z.2 + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem field_eq_toHilbertVectorL2OfVecField {M : PotentialSolenoidalL2Data U} (z : Space M) : + field z = + toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := by + calc + field z = vectorL2ToHilbertVectorL2 (U := U) (vectorField z) := by + symm + exact vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (U := U) (field z) + _ = + vectorL2ToHilbertVectorL2 (U := U) + (toVectorL2 (MeasureTheory.Lp.memLp (vectorField z))) := by + congr 1 + exact + (MeasureTheory.Lp.toLp_coeFn + (vectorField z) + (MeasureTheory.Lp.memLp (vectorField z))).symm + _ = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := by + rfl + +/-- The Hilbert-space element corresponding to the gradient of an `H¹₀` +function. -/ +noncomputable def ofH10Function (M : PotentialSolenoidalL2Data U) (u : H10Function U) : + Space M := by + refine ⟨u.toH1Function.gradToHilbertVectorL2, ?_⟩ + change + ((continuousLinearEquivVectorL2 (U := U)).symm u.toH1Function.gradToHilbertVectorL2) ∈ + M.potentialZeroTrace + simpa [H1Function.gradToHilbertVectorL2, H1Function.gradToVectorL2] using! + M.mem_potentialZeroTrace u.toH1Function.grad_memVectorL2 u.isPotentialZeroTraceOn + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem vectorField_ofH10Function (M : PotentialSolenoidalL2Data U) (u : H10Function U) : + vectorField (ofH10Function M u) = u.toH1Function.gradToVectorL2 := by + change + ((continuousLinearEquivVectorL2 (U := U)).symm u.toH1Function.gradToHilbertVectorL2) = + u.toH1Function.gradToVectorL2 + simpa [H1Function.gradToHilbertVectorL2, H1Function.gradToVectorL2] using + hilbertVectorL2ToVectorL2_toHilbertVectorL2 + (U := U) (f := u.toH1Function.grad) u.toH1Function.grad_memVectorL2 + +/-- The coefficient-weighted field associated to a point of `\Lpoto(U)`. -/ +noncomputable def coeffFieldCLM (M : PotentialSolenoidalL2Data U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + Space M →L[ℝ] HilbertVectorL2 U := + (hilbertCoeffOperator hEll).comp ((submodule (M := M)).subtypeL) + +/-- The coefficient-weighted bilinear form on the Hilbert realization of +`\Lpoto(U)`. -/ +noncomputable def coeffBilin (M : PotentialSolenoidalL2Data U) + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) : + Space M →L[ℝ] Space M →L[ℝ] ℝ := + ContinuousLinearMap.bilinearComp (isBoundedBilinearMap_inner (𝕜 := ℝ)).toContinuousLinearMap + (coeffFieldCLM (M := M) hEll) ((submodule (M := M)).subtypeL) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem coeffBilin_apply {M : PotentialSolenoidalL2Data U} + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (z w : Space M) : + coeffBilin (M := M) hEll z w = + inner ℝ (hilbertCoeffOperator hEll (field z)) (field w) := by + simp [coeffBilin, coeffFieldCLM, ContinuousLinearMap.bilinearComp_apply, field] + +/-- The forcing functional induced by `g` on the Hilbert realization of +`\Lpoto(U)`. -/ +noncomputable def forcingFunctionalCLM (M : PotentialSolenoidalL2Data U) + {g : Vec d → Vec d} (hg : MemVectorL2 U g) : + Space M →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (toHilbertVectorL2OfVecField hg)).comp + ((submodule (M := M)).subtypeL) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem forcingFunctionalCLM_apply {M : PotentialSolenoidalL2Data U} + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (z : Space M) : + forcingFunctionalCLM (M := M) hg z = + inner ℝ (toHilbertVectorL2OfVecField hg) (field z) := by + simp [forcingFunctionalCLM, field] + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem coeffBilin_apply_eq_integral {M : PotentialSolenoidalL2Data U} + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (z w : Space M) : + coeffBilin (M := M) hEll z w = + ∫ x in U, + vecDot (matVecMul (a x) (vectorField z x)) (vectorField w x) + ∂MeasureTheory.volume := by + have hzField : + field z = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := + field_eq_toHilbertVectorL2OfVecField z + have hwField : + field w = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField w)) := + field_eq_toHilbertVectorL2OfVecField w + have hA : + hilbertCoeffOperator hEll (field z) = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [hzField] + simpa using + hilbertCoeffOperator_toHilbertVectorL2OfVecField + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll + (MeasureTheory.Lp.memLp (vectorField z)) + calc + coeffBilin (M := M) hEll z w + = inner ℝ (hilbertCoeffOperator hEll (field z)) (field w) := by + simp [coeffBilin_apply] + _ = + inner ℝ + (toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z)))) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField w))) := by + rw [hA, hwField] + _ = + ∫ x in U, + vecDot (matVecMul (a x) (vectorField z x)) (vectorField w x) + ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + (MeasureTheory.Lp.memLp (vectorField w)) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem forcingFunctionalCLM_apply_eq_integral {M : PotentialSolenoidalL2Data U} + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (z : Space M) : + forcingFunctionalCLM (M := M) hg z = + ∫ x in U, vecDot (g x) (vectorField z x) ∂MeasureTheory.volume := by + calc + forcingFunctionalCLM (M := M) hg z + = inner ℝ (toHilbertVectorL2OfVecField hg) (field z) := by + simp [forcingFunctionalCLM_apply] + _ = + inner ℝ + (toHilbertVectorL2OfVecField hg) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [field_eq_toHilbertVectorL2OfVecField z] + _ = ∫ x in U, vecDot (g x) (vectorField z x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hg (MeasureTheory.Lp.memLp (vectorField z)) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem coeffBilin_self_ge_lam_mul_norm_sq {M : PotentialSolenoidalL2Data U} + {a : CoeffField d} {lam Lam : ℝ} (hEll : IsEllipticFieldOn lam Lam U a) + (z : Space M) : + lam * ‖z‖ ^ 2 ≤ coeffBilin (M := M) hEll z z := by + have hsqInt : + MeasureTheory.IntegrableOn + (fun x => vecNormSq (vectorField z x)) U := by + simpa [vecNormSq] using + (integrableOn_vecDot_of_memVectorL2 + (MeasureTheory.Lp.memLp (vectorField z)) + (MeasureTheory.Lp.memLp (vectorField z))) + have henergyInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (vectorField z x)) (vectorField z x)) U := by + exact + integrableOn_vecDot_of_memVectorL2 + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + (MeasureTheory.Lp.memLp (vectorField z)) + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hpoint : + ∀ᵐ x ∂ volumeMeasureOn U, + lam * vecNormSq (vectorField z x) ≤ + vecDot (matVecMul (a x) (vectorField z x)) (vectorField z x) := by + filter_upwards [hmem] with x hx + simpa [vecDot_comm] using (hEll.2 x hx).2.2.1 (vectorField z x) + have hnormSq : + ‖z‖ ^ 2 = + ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + calc + ‖z‖ ^ 2 = inner ℝ (field z) (field z) := by + simp [field] + _ = + inner ℝ + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [field_eq_toHilbertVectorL2OfVecField z] + _ = + ∫ x in U, vecDot (vectorField z x) (vectorField z x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (MeasureTheory.Lp.memLp (vectorField z)) + (MeasureTheory.Lp.memLp (vectorField z)) + _ = ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + simp [vecNormSq] + calc + lam * ‖z‖ ^ 2 + = lam * ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + rw [hnormSq] + _ = ∫ x in U, lam * vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ ≤ + ∫ x in U, + vecDot (matVecMul (a x) (vectorField z x)) (vectorField z x) + ∂MeasureTheory.volume := + MeasureTheory.integral_mono_ae (hsqInt.const_mul lam) henergyInt hpoint + _ = coeffBilin (M := M) hEll z z := by + symm + exact coeffBilin_apply_eq_integral (M := M) hEll z z + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem isCoercive_coeffBilin {M : PotentialSolenoidalL2Data U} + {a : CoeffField d} {lam Lam : ℝ} (hne : Set.Nonempty U) + (hEll : IsEllipticFieldOn lam Lam U a) : + IsCoercive (coeffBilin (M := M) hEll) := by + rcases hne with ⟨x, hx⟩ + have hlam : 0 < lam := (hEll.2 x hx).1 + refine ⟨lam, hlam, ?_⟩ + intro z + simpa [pow_two, mul_assoc] using coeffBilin_self_ge_lam_mul_norm_sq (M := M) hEll z + +noncomputable def forcingRieszMap (M : PotentialSolenoidalL2Data U) : + (Space M →L[ℝ] ℝ) → Space M := + fun ℓ => (InnerProductSpace.toDual ℝ (Space M)).symm ℓ + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem inner_forcingRieszMap_apply (M : PotentialSolenoidalL2Data U) + (ℓ : Space M →L[ℝ] ℝ) (z : Space M) : + inner ℝ (forcingRieszMap M ℓ) z = ℓ z := by + change inner ℝ (((InnerProductSpace.toDual ℝ (Space M)).symm) ℓ) z = ℓ z + exact + InnerProductSpace.toDual_symm_apply + (𝕜 := ℝ) + (E := Space M) + (x := z) + (y := (ℓ : StrongDual ℝ (Space M))) + +noncomputable def forcingRieszRep (M : PotentialSolenoidalL2Data U) + {g : Vec d → Vec d} (hg : MemVectorL2 U g) : + Space M := + forcingRieszMap M (forcingFunctionalCLM (M := M) hg) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem inner_forcingRieszRep_apply (M : PotentialSolenoidalL2Data U) + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (z : Space M) : + inner ℝ (forcingRieszRep M hg) z = + forcingFunctionalCLM (M := M) hg z := by + exact inner_forcingRieszMap_apply M (forcingFunctionalCLM (M := M) hg) z + +/-- The unique Hilbert-space element of `\Lpoto(U)` solving the coefficient +problem with forcing `g`. -/ +noncomputable def coeffProblemSolution (M : PotentialSolenoidalL2Data U) + {a : CoeffField d} {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + Space M := by + let hB : IsCoercive (coeffBilin (M := M) hEll) := + isCoercive_coeffBilin (M := M) hne hEll + let e : Space M ≃L[ℝ] Space M := hB.continuousLinearEquivOfBilin + exact e.symm (forcingRieszRep M hg) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem coeffBilin_coeffProblemSolution_apply (M : PotentialSolenoidalL2Data U) + {a : CoeffField d} {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) + (z : Space M) : + coeffBilin (M := M) hEll + (coeffProblemSolution (M := M) hg hne hEll) z = + forcingFunctionalCLM (M := M) hg z := by + let hB : IsCoercive (coeffBilin (M := M) hEll) := + isCoercive_coeffBilin (M := M) hne hEll + let e : Space M ≃L[ℝ] Space M := hB.continuousLinearEquivOfBilin + calc + coeffBilin (M := M) hEll (coeffProblemSolution (M := M) hg hne hEll) z + = inner ℝ (e (coeffProblemSolution (M := M) hg hne hEll)) z := by + symm + simpa [e, hB] using + hB.continuousLinearEquivOfBilin_apply + (coeffProblemSolution (M := M) hg hne hEll) z + _ = inner ℝ (forcingRieszRep M hg) z := by + rw [coeffProblemSolution, e.apply_symm_apply] + _ = forcingFunctionalCLM (M := M) hg z := by + exact inner_forcingRieszRep_apply M hg z + +end PotentialZeroTraceHilbert + +private noncomputable def vectorPairingCLM {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) : + VectorL2 U →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (HilbertVectorL2 U) (toHilbertVectorL2OfVecField hg)).comp + ((continuousLinearEquivVectorL2 (U := U)).toContinuousLinearMap) + +theorem exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + ∃ v : H10Function U, IsZeroTraceDirichletRhsWeakSolution a U v g := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let z : PotentialZeroTraceHilbert.Space M := + PotentialZeroTraceHilbert.coeffProblemSolution (M := M) hg hne hEll + let F : VectorL2 U := PotentialZeroTraceHilbert.vectorField z + have hFsub : F ∈ M.potentialZeroTrace := + PotentialZeroTraceHilbert.mem_potentialZeroTrace z + have hpot0 : IsPotentialZeroTraceOn U F := by + simpa [M] using + PotentialSolenoidalL2Data.isPotentialZeroTraceOn_of_mem_potentialZeroTrace_ofSubmoduleClosures + (U := U) hRealize F hFsub + have hfirst : + ∀ φ : H10Function U, + ∫ x in U, vecDot (matVecMul (a x) (F x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + intro φ + let w : PotentialZeroTraceHilbert.Space M := + PotentialZeroTraceHilbert.ofH10Function (M := M) φ + have hleft : + ∫ x in U, + vecDot (matVecMul (a x) (F x)) + (PotentialZeroTraceHilbert.vectorField w x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (matVecMul (a x) (F x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [H1Function.coeFn_gradToVectorL2 φ.toH1Function] with x hx + simpa [w] using congrArg (fun v : Vec d => vecDot (matVecMul (a x) (F x)) v) hx + have hright : + ∫ x in U, vecDot (g x) (PotentialZeroTraceHilbert.vectorField w x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [H1Function.coeFn_gradToVectorL2 φ.toH1Function] with x hx + simpa [w] using congrArg (fun v : Vec d => vecDot (g x) v) hx + calc + ∫ x in U, vecDot (matVecMul (a x) (F x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + PotentialZeroTraceHilbert.coeffBilin (M := M) hEll z w := by + rw [← hleft] + symm + simpa [F] using + PotentialZeroTraceHilbert.coeffBilin_apply_eq_integral + (M := M) hEll z w + _ = + PotentialZeroTraceHilbert.forcingFunctionalCLM (M := M) hg w := + PotentialZeroTraceHilbert.coeffBilin_coeffProblemSolution_apply (M := M) hg hne hEll w + _ = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [← hright] + exact PotentialZeroTraceHilbert.forcingFunctionalCLM_apply_eq_integral + (M := M) hg w + rcases hpot0 with ⟨v, hv⟩ + refine ⟨v, ?_⟩ + intro φ + simpa [hv] using hfirst φ + +/-- A chosen zero-trace Dirichlet weak solution under the abstract +zero-trace-potential closure realization hypothesis. -/ +noncomputable def zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + H10Function U := + Classical.choose + (exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll) + +theorem + isZeroTraceDirichletRhsWeakSolution_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + IsZeroTraceDirichletRhsWeakSolution a U + (zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll) + g := by + simpa [zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization] + using + (Classical.choose_spec + (exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll)) + +theorem gradToVectorL2_eq_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : H10Function U} {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) + (hne : Set.Nonempty U) + (hu : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toH1Function.gradToVectorL2 = + (zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll).toH1Function.gradToVectorL2 := by + let v : H10Function U := + zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll + have hv : IsZeroTraceDirichletRhsWeakSolution a U v g := + isZeroTraceDirichletRhsWeakSolution_zeroTraceDirichletRhsProblemSolution_of_potentialZeroTraceClosureRealization + (a := a) (U := U) (g := g) (lam := lam) (Lam := Lam) + hg hRealize hne hEll + simpa [v] using + IsZeroTraceDirichletRhsWeakSolution.gradToVectorL2_eq_of_isEllipticFieldOn + (U := U) (a := a) (u := u) (v := v) (g := g) hne hu hv hEll + +theorem exists_isZeroTraceDirichletRhsWeakSolution_of_gradient_firstVariation_eq_integral_of_isPotentialZeroTraceOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f g : Vec d → Vec d} + (hfirst : + ∀ φ : H10Function U, + ∫ x in U, vecDot (matVecMul (a x) (f x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume) + (hpot : IsPotentialZeroTraceOn U f) : + ∃ v : H10Function U, IsZeroTraceDirichletRhsWeakSolution a U v g := by + rcases hpot with ⟨v, hv⟩ + refine ⟨v, ?_⟩ + intro φ + simpa [hv] using hfirst φ + +theorem exists_isZeroTraceDirichletRhsWeakSolution_of_firstVariation_eq_integral_of_isPotentialZeroTraceOn + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {u : H1Function U} {g : Vec d → Vec d} + (hfirst : + ∀ φ : H10Function U, + ∫ x in U, vecDot (matVecMul (a x) (u.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume) + (hpot : IsPotentialZeroTraceOn U u.grad) : + ∃ v : H10Function U, IsZeroTraceDirichletRhsWeakSolution a U v g := by + exact + exists_isZeroTraceDirichletRhsWeakSolution_of_gradient_firstVariation_eq_integral_of_isPotentialZeroTraceOn + (a := a) (U := U) (f := u.grad) (g := g) hfirst hpot + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/EnergyIdentities.lean b/LeanPool/CoarseGraining/Homogenization/PDE/EnergyIdentities.lean new file mode 100644 index 0000000000..fe018e2391 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/EnergyIdentities.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS + +/-! # Energy Identities -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# PDE energy identities + +This file collects coefficient-weighted energy densities and weak-solution +energy identities that are not specific to the Coarse Poincare recurrence. +-/ + +/-- The intrinsic coefficient energy density `F · symm(a) F`. -/ +noncomputable def coefficientEnergyDensity {d : ℕ} + (a : CoeffField d) (F : Vec d → Vec d) : Vec d → ℝ := + fun x => vecDot (F x) (matVecMul (symmPart (a x)) (F x)) + +theorem abs_le_half_add_half_of_sq_le_mul {u A B : ℝ} + (hu_sq : u ^ 2 ≤ A * B) (hA : 0 ≤ A) (hB : 0 ≤ B) : + |u| ≤ A / 2 + B / 2 := by + have habsSq : |u| ^ 2 ≤ A * B := by simpa [sq_abs] using hu_sq + have hsumSq : (2 * |u|) ^ 2 ≤ (A + B) ^ 2 := by + have h0 : 0 ≤ (A - B) ^ 2 := sq_nonneg _ + nlinarith [habsSq, h0] + have hsum_nonneg : 0 ≤ A + B := add_nonneg hA hB + have habs2u : 2 * |u| ≤ A + B := le_of_sq_le_sq hsumSq hsum_nonneg + linarith + +theorem abs_vecDot_matVecMul_symmPart_le_half_add_half_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ η : Vec d) : + |vecDot ξ (matVecMul (symmPart A) η)| ≤ + vecDot ξ (matVecMul (symmPart A) ξ) / 2 + + vecDot η (matVecMul (symmPart A) η) / 2 := by + have hsq := sq_vecDot_matVecMul_symmPart_le_of_isEllipticMatrix hA ξ η + have hξ_nonneg : 0 ≤ vecDot ξ (matVecMul (symmPart A) ξ) := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA ξ + have hnorm : 0 ≤ vecNormSq ξ := vecNormSq_nonneg ξ + have hlam_pos : 0 < lam := hA.1 + nlinarith + have hη_nonneg : 0 ≤ vecDot η (matVecMul (symmPart A) η) := by + have hlower := lowerBound_symmPart_of_isEllipticMatrix hA η + have hnorm : 0 ≤ vecNormSq η := vecNormSq_nonneg η + have hlam_pos : 0 < lam := hA.1 + nlinarith + exact abs_le_half_add_half_of_sq_le_mul hsq hξ_nonneg hη_nonneg + +theorem vecDot_matVecMul_symmPart_sub_le_two_mul_add_of_isEllipticMatrix + {d : ℕ} {lam Lam : ℝ} {A : Mat d} + (hA : IsEllipticMatrix lam Lam A) (ξ η : Vec d) : + vecDot (ξ - η) (matVecMul (symmPart A) (ξ - η)) ≤ + 2 * (vecDot ξ (matVecMul (symmPart A) ξ) + + vecDot η (matVecMul (symmPart A) η)) := by + let S : Mat d := symmPart A + have hsymm : S.IsSymm := by + rw [Matrix.IsSymm.ext_iff] + intro i j + simp [S, symmPart] + ring + have hcomm : vecDot ξ (matVecMul S η) = vecDot η (matVecMul S ξ) := + vecDot_matVecMul_comm_of_isSymm hsymm ξ η + have hquad : + vecDot (ξ - η) (matVecMul S (ξ - η)) = + vecDot ξ (matVecMul S ξ) - 2 * vecDot ξ (matVecMul S η) + + vecDot η (matVecMul S η) := by + rw [sub_eq_add_neg, matVecMul_add, matVecMul_neg] + simp [vecDot_add_left, vecDot_add_right, vecDot_neg_left, vecDot_neg_right, hcomm] + ring + have hcross_abs := + abs_vecDot_matVecMul_symmPart_le_half_add_half_of_isEllipticMatrix hA ξ η + have hcross : + -2 * vecDot ξ (matVecMul S η) ≤ + vecDot ξ (matVecMul S ξ) + vecDot η (matVecMul S η) := by + have hneg : -vecDot ξ (matVecMul S η) ≤ |vecDot ξ (matVecMul S η)| := + neg_le_abs _ + nlinarith [hcross_abs, hneg] + rw [hquad] + nlinarith + +theorem coefficientEnergyDensity_eq_unsymmetrized {d : ℕ} + (a : CoeffField d) (F : Vec d → Vec d) (x : Vec d) : + coefficientEnergyDensity a F x = + vecDot (F x) (matVecMul (a x) (F x)) := by + unfold coefficientEnergyDensity + rw [vecDot_matVecMul_symmPart] + +namespace IsZeroTraceDirichletRhsWeakSolution + +variable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} +variable {u : H10Function U} {g : Vec d → Vec d} + +/-- Zero-trace RHS weak solutions identify the intrinsic coefficient energy +with the forcing pairing after subtracting any constant vector. -/ +theorem coefficientEnergy_identity_sub_const + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : IsZeroTraceDirichletRhsWeakSolution a U u g) + (hmem : MemVectorL2 U g) (c : Vec d) : + ∫ x in U, + coefficientEnergyDensity a (fun x => u.toH1Function.grad x) x + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + ∫ x in U, + coefficientEnergyDensity a (fun x => u.toH1Function.grad x) x + ∂MeasureTheory.volume + = + ∫ x in U, + vecDot (u.toH1Function.grad x) + (matVecMul (a x) (u.toH1Function.grad x)) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun x => by + simpa using + coefficientEnergyDensity_eq_unsymmetrized a + (fun x => u.toH1Function.grad x) x + _ = + ∫ x in U, vecDot (g x - c) (u.toH1Function.grad x) + ∂MeasureTheory.volume := + h.energy_identity_sub_const hmem c + +end IsZeroTraceDirichletRhsWeakSolution + +theorem coefficientEnergyDensity_nonneg_of_isEllipticFieldOn {d : ℕ} + {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) (F : Vec d → Vec d) : + ∀ x ∈ U, 0 ≤ coefficientEnergyDensity a F x := by + intro x hx + unfold coefficientEnergyDensity + have hlower := lowerBound_symmPart_of_isEllipticMatrix (hEll.2 x hx) (F x) + have hnorm : 0 ≤ vecNormSq (F x) := vecNormSq_nonneg (F x) + have hlam_pos : 0 < lam := (hEll.2 x hx).1 + nlinarith + +theorem integrableOn_coefficientEnergyDensity_of_isEllipticFieldOn {d : ℕ} + {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) {F : Vec d → Vec d} + (hF : MemVectorL2 U F) : + MeasureTheory.IntegrableOn (coefficientEnergyDensity a F) U := by + unfold coefficientEnergyDensity + exact integrableOn_vecDot_of_memVectorL2 hF + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll hF) + +theorem coefficientEnergyDensity_sub_le_two_mul_add_of_isEllipticFieldOn + {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (hEll : IsEllipticFieldOn lam Lam U a) (F G : Vec d → Vec d) : + ∀ x ∈ U, + coefficientEnergyDensity a (fun y => F y - G y) x ≤ + 2 * (coefficientEnergyDensity a F x + coefficientEnergyDensity a G x) := by + intro x hx + exact vecDot_matVecMul_symmPart_sub_le_two_mul_add_of_isEllipticMatrix + (hEll.2 x hx) (F x) (G x) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/Harmonic.lean b/LeanPool/CoarseGraining/Homogenization/PDE/Harmonic.lean new file mode 100644 index 0000000000..7262f53788 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/Harmonic.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Harmonic -/ + +@[expose] public section + +namespace Homogenization + +def IsAHarmonicGradient {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) (f : Vec d → Vec d) : Prop := + IsPotentialOn U f ∧ IsSolenoidalOn U (fun x => matVecMul (a x) (f x)) + +theorem IsAHarmonicGradient.of_ae_eq_coeff {d : ℕ} {a b : CoeffField d} + {U : Set (Vec d)} {f : Vec d → Vec d} + (h : a =ᵐ[volumeMeasureOn U] b) (hf : IsAHarmonicGradient a U f) : + IsAHarmonicGradient b U f := by + rcases hf with ⟨hpot, hsol⟩ + refine ⟨hpot, ?_⟩ + intro φ + calc + ∫ x in U, vecDot (matVecMul (b x) (f x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, vecDot (matVecMul (a x) (f x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + exact h.symm.mono fun x hx => by + simp [hx] + _ = 0 := hsol φ + +def IsAHarmonicPair {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) + (f g : Vec d → Vec d) : Prop := + IsPotentialOn U f ∧ + IsSolenoidalOn U g ∧ + ∀ x, g x = matVecMul (a x) (f x) + +def IsAdjointHarmonicPair {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) + (f g : Vec d → Vec d) : Prop := + IsPotentialOn U f ∧ + IsSolenoidalOn U g ∧ + ∀ x, g x = matVecMul (matTranspose (a x)) (f x) + +structure AHarmonicPair {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) where + grad : Vec d → Vec d + flux : Vec d → Vec d + isHarmonicPair : IsAHarmonicPair a U grad flux + +structure AHarmonicFunction {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) where + toH1 : H1Function U + isHarmonic : IsAHarmonicGradient a U toH1.grad + +/-- Integrability of a vector flux paired with every `H10Function` test +gradient. This abbreviation keeps harmonic-combination headers small. -/ +abbrev h10FluxIntegrable {d : ℕ} (U : Set (Vec d)) (F : Vec d → Vec d) : Prop := + ∀ φ : H10Function U, + MeasureTheory.IntegrableOn (fun x => vecDot (F x) (φ.toH1Function.grad x)) U + +/-- Integrability of the weak flux pairing attached to an `AHarmonicFunction`. -/ +abbrev weakFluxIntegrable {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) + (u : AHarmonicFunction a U) : Prop := + h10FluxIntegrable U (fun x => matVecMul (a x) (u.toH1.grad x)) + +/-- Surface notation for adjoint-harmonic functions. This matches the Chapter-2 +notation `𝒜*(U; a)` while reusing the existing `AHarmonicFunction` structure. -/ +abbrev AStarHarmonicFunction {d : ℕ} (U : Set (Vec d)) (a : CoeffField d) := + AHarmonicFunction (fun x => matTranspose (a x)) U + +structure AHarmonicFunctionMeanZero {d : ℕ} (a : CoeffField d) (U : Set (Vec d)) where + toAHarmonicFunction : AHarmonicFunction a U + meanZero : MeanZeroOn U toAHarmonicFunction.toH1.toFun + +namespace AHarmonicFunctionMeanZero + +instance {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + Coe (AHarmonicFunctionMeanZero a U) (AHarmonicFunction a U) where + coe u := u.toAHarmonicFunction + +@[simp] theorem coe_mk {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) (hmean : MeanZeroOn U u.toH1.toFun) : + ((⟨u, hmean⟩ : AHarmonicFunctionMeanZero a U) : AHarmonicFunction a U) = u := + rfl + +theorem meanZero_coe {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunctionMeanZero a U) : + MeanZeroOn U (u : AHarmonicFunction a U).toH1.toFun := + u.meanZero + +end AHarmonicFunctionMeanZero + +private theorem isSolenoidalOn_add_of_integrable {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : IsSolenoidalOn U f) (hg : IsSolenoidalOn U g) + (hf_int : h10FluxIntegrable U f) (hg_int : h10FluxIntegrable U g) : + IsSolenoidalOn U (f + g) := by + intro φ + rw [show (fun x => vecDot ((f + g) x) (φ.toH1Function.grad x)) = + fun x => vecDot (f x) (φ.toH1Function.grad x) + vecDot (g x) (φ.toH1Function.grad x) by + funext x + simp [Pi.add_apply, vecDot_add_left]] + rw [MeasureTheory.integral_add (hf_int φ) (hg_int φ), hf φ, hg φ] + ring + +theorem isAHarmonicGradient_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + IsAHarmonicGradient a U (0 : Vec d → Vec d) := by + constructor + · exact isPotentialOn_zero + · simpa [matVecMul_zero] using! (isSolenoidalOn_zero (U := U)) + +theorem isAHarmonicGradient_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) (c : ℝ) : + IsAHarmonicGradient a U (c • f) := by + rcases hf with ⟨hpot, hsol⟩ + constructor + · exact isPotentialOn_smul hpot c + · simpa [Pi.smul_apply, matVecMul_smul] using! isSolenoidalOn_smul hsol c + +theorem isAHarmonicGradient_add_of_integrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) (hg : IsAHarmonicGradient a U g) + (hf_int : h10FluxIntegrable U (fun x => matVecMul (a x) (f x))) + (hg_int : h10FluxIntegrable U (fun x => matVecMul (a x) (g x))) : + IsAHarmonicGradient a U (f + g) := by + rcases hf with ⟨hpotf, hsolf⟩ + rcases hg with ⟨hpotg, hsolg⟩ + constructor + · exact isPotentialOn_add hpotf hpotg + · have hsum : + IsSolenoidalOn U + ((fun x => matVecMul (a x) (f x)) + fun x => matVecMul (a x) (g x)) := + isSolenoidalOn_add_of_integrable hsolf hsolg hf_int hg_int + simpa [Pi.add_apply, matVecMul_add] using! hsum + +theorem isAHarmonicPair_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + IsAHarmonicPair a U (0 : Vec d → Vec d) 0 := by + refine ⟨isPotentialOn_zero, ?_, ?_⟩ + · simpa using (isSolenoidalOn_zero (U := U)) + · intro x + simp [matVecMul_zero] + +theorem isAHarmonicPair_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hfg : IsAHarmonicPair a U f g) (c : ℝ) : + IsAHarmonicPair a U (c • f) (c • g) := by + rcases hfg with ⟨hpot, hsol, hflux⟩ + refine ⟨isPotentialOn_smul hpot c, isSolenoidalOn_smul hsol c, ?_⟩ + intro x + simp [Pi.smul_apply, hflux x, matVecMul_smul] + +theorem isAHarmonicPair_add_of_integrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f1 g1 f2 g2 : Vec d → Vec d} + (h1 : IsAHarmonicPair a U f1 g1) (h2 : IsAHarmonicPair a U f2 g2) + (hg1_int : h10FluxIntegrable U g1) (hg2_int : h10FluxIntegrable U g2) : + IsAHarmonicPair a U (f1 + f2) (g1 + g2) := by + rcases h1 with ⟨hpot1, hsol1, hflux1⟩ + rcases h2 with ⟨hpot2, hsol2, hflux2⟩ + refine ⟨isPotentialOn_add hpot1 hpot2, ?_, ?_⟩ + · exact isSolenoidalOn_add_of_integrable hsol1 hsol2 hg1_int hg2_int + · intro x + simp [Pi.add_apply, hflux1 x, hflux2 x, matVecMul_add] + +theorem isAHarmonicPair_of_isAHarmonicGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) : + IsAHarmonicPair a U f (fun x => matVecMul (a x) (f x)) := by + rcases hf with ⟨hpot, hsol⟩ + exact ⟨hpot, hsol, fun _ => rfl⟩ + +theorem isAHarmonicGradient_of_isAHarmonicPair {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hfg : IsAHarmonicPair a U f g) : + IsAHarmonicGradient a U f := by + rcases hfg with ⟨hpot, hsol, hflux⟩ + refine ⟨hpot, ?_⟩ + simpa [funext hflux] using hsol + +theorem IsAHarmonicGradient.restrict_of_isOpen_of_memVectorL2 + {d : ℕ} {a : CoeffField d} {U V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) (hU : IsOpen U) (hV : IsOpen V) + (hVU : V ⊆ U) (hfluxV : MemVectorL2 V (fun x => matVecMul (a x) (f x))) : + IsAHarmonicGradient a V f := by + rcases hf with ⟨hpot, hsol⟩ + constructor + · rcases hpot with ⟨u, hu⟩ + refine ⟨u.restrict hV hVU, ?_⟩ + simpa [H1Function.restrict] using hu + · exact hsol.restrict_of_isOpen_of_memVectorL2 hU hV hVU hfluxV + +theorem IsAHarmonicGradient.restrict_of_isOpen_of_isEllipticFieldOn + {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} {U V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) (hU : IsOpen U) (hV : IsOpen V) + (hVU : V ⊆ U) (hEllV : IsEllipticFieldOn lam Lam V a) : + IsAHarmonicGradient a V f := by + rcases hf.1 with ⟨u, hu⟩ + refine hf.restrict_of_isOpen_of_memVectorL2 hU hV hVU ?_ + rw [← hu] + exact memVectorL2_matVecMul_of_isEllipticFieldOn hEllV (u.restrict hV hVU).grad_memVectorL2 + +theorem isAdjointHarmonicPair_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + IsAdjointHarmonicPair a U (0 : Vec d → Vec d) 0 := by + refine ⟨isPotentialOn_zero, ?_, ?_⟩ + · simpa using (isSolenoidalOn_zero (U := U)) + · intro x + simp [matVecMul_zero] + +theorem isAdjointHarmonicPair_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hfg : IsAdjointHarmonicPair a U f g) (c : ℝ) : + IsAdjointHarmonicPair a U (c • f) (c • g) := by + rcases hfg with ⟨hpot, hsol, hflux⟩ + refine ⟨isPotentialOn_smul hpot c, isSolenoidalOn_smul hsol c, ?_⟩ + intro x + simp [Pi.smul_apply, hflux x, matVecMul_smul] + +theorem isAdjointHarmonicPair_add_of_integrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f1 g1 f2 g2 : Vec d → Vec d} + (h1 : IsAdjointHarmonicPair a U f1 g1) (h2 : IsAdjointHarmonicPair a U f2 g2) + (hg1_int : h10FluxIntegrable U g1) (hg2_int : h10FluxIntegrable U g2) : + IsAdjointHarmonicPair a U (f1 + f2) (g1 + g2) := by + rcases h1 with ⟨hpot1, hsol1, hflux1⟩ + rcases h2 with ⟨hpot2, hsol2, hflux2⟩ + refine ⟨isPotentialOn_add hpot1 hpot2, ?_, ?_⟩ + · exact isSolenoidalOn_add_of_integrable hsol1 hsol2 hg1_int hg2_int + · intro x + simp [Pi.add_apply, hflux1 x, hflux2 x, matVecMul_add] + +namespace AHarmonicPair + +@[ext] theorem ext {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {X Y : AHarmonicPair a U} (hgrad : X.grad = Y.grad) (hflux : X.flux = Y.flux) : + X = Y := by + cases X + cases Y + cases hgrad + cases hflux + rfl + +instance {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : Zero (AHarmonicPair a U) where + zero := + { grad := 0 + flux := 0 + isHarmonicPair := isAHarmonicPair_zero } + +instance {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : SMul ℝ (AHarmonicPair a U) where + smul c X := + { grad := c • X.grad + flux := c • X.flux + isHarmonicPair := isAHarmonicPair_smul X.isHarmonicPair c } + +@[simp] theorem grad_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + (0 : AHarmonicPair a U).grad = 0 := + rfl + +@[simp] theorem flux_zero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} : + (0 : AHarmonicPair a U).flux = 0 := + rfl + +@[simp] theorem grad_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (X : AHarmonicPair a U) : + (c • X).grad = c • X.grad := + rfl + +@[simp] theorem flux_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (c : ℝ) (X : AHarmonicPair a U) : + (c • X).flux = c • X.flux := + rfl + +def ofGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsAHarmonicGradient a U f) : AHarmonicPair a U := + { grad := f + flux := fun x => matVecMul (a x) (f x) + isHarmonicPair := isAHarmonicPair_of_isAHarmonicGradient hf } + +@[simp] theorem grad_ofGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) : + (ofGradient hf).grad = f := + rfl + +@[simp] theorem flux_ofGradient {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : IsAHarmonicGradient a U f) : + (ofGradient hf).flux = fun x => matVecMul (a x) (f x) := + rfl + +def addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (X Y : AHarmonicPair a U) (hX_int : h10FluxIntegrable U X.flux) + (hY_int : h10FluxIntegrable U Y.flux) : + AHarmonicPair a U := + { grad := X.grad + Y.grad + flux := X.flux + Y.flux + isHarmonicPair := isAHarmonicPair_add_of_integrable X.isHarmonicPair Y.isHarmonicPair + hX_int hY_int } + +@[simp] theorem grad_addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (X Y : AHarmonicPair a U) (hX_int : h10FluxIntegrable U X.flux) + (hY_int : h10FluxIntegrable U Y.flux) : + (addOfIntegrable X Y hX_int hY_int).grad = X.grad + Y.grad := + rfl + +@[simp] theorem flux_addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (X Y : AHarmonicPair a U) (hX_int : h10FluxIntegrable U X.flux) + (hY_int : h10FluxIntegrable U Y.flux) : + (addOfIntegrable X Y hX_int hY_int).flux = X.flux + Y.flux := + rfl + +end AHarmonicPair + +def AHarmonicFunction.toPair {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) : AHarmonicPair a U := + AHarmonicPair.ofGradient u.isHarmonic + +namespace AHarmonicFunction + +noncomputable def addConst {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (c : ℝ) : AHarmonicFunction a U := + let hgrad : (u.toH1.addConst c).grad = u.toH1.grad := by + funext x + simp + { toH1 := u.toH1.addConst c + isHarmonic := by + simpa [hgrad] using u.isHarmonic } + +@[simp] theorem toH1_addConst {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (c : ℝ) : + (u.addConst c).toH1 = u.toH1.addConst c := + rfl + +@[simp] theorem grad_addConst {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (c : ℝ) (x : Vec d) : + (u.addConst c).toH1.grad x = u.toH1.grad x := by + simp [AHarmonicFunction.addConst] + +@[simp] theorem toPair_addConst {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (c : ℝ) : + (u.addConst c).toPair = u.toPair := by + ext + · simp [AHarmonicFunction.toPair, AHarmonicPair.ofGradient, AHarmonicFunction.addConst] + · simp [AHarmonicFunction.toPair, AHarmonicPair.ofGradient, AHarmonicFunction.addConst] + +noncomputable def normalizeMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : AHarmonicFunction a U := + let hgrad : u.toH1.subAverage.grad = u.toH1.grad := by + funext x + simp + { toH1 := u.toH1.subAverage + isHarmonic := by + simpa [hgrad] using u.isHarmonic } + +@[simp] theorem toH1_normalizeMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : + u.normalizeMeanZero.toH1 = u.toH1.subAverage := + rfl + +theorem meanZeroOn_normalizeMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : + MeanZeroOn U u.normalizeMeanZero.toH1.toFun := by + simpa [AHarmonicFunction.normalizeMeanZero] using u.toH1.meanZeroOn_subAverage + +@[simp] theorem grad_normalizeMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) (x : Vec d) : + u.normalizeMeanZero.toH1.grad x = u.toH1.grad x := by + simp [AHarmonicFunction.normalizeMeanZero] + +noncomputable def toMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : AHarmonicFunctionMeanZero a U := + ⟨u.normalizeMeanZero, u.meanZeroOn_normalizeMeanZero⟩ + +@[simp] theorem coe_toMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : + ((u.toMeanZero : AHarmonicFunctionMeanZero a U) : AHarmonicFunction a U) = + u.normalizeMeanZero := + rfl + +theorem meanZero_toMeanZero {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : AHarmonicFunction a U) : + MeanZeroOn U ((u.toMeanZero : AHarmonicFunctionMeanZero a U) : AHarmonicFunction a U).toH1.toFun := + u.toMeanZero.meanZero + +theorem integrableOn_smul {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u : AHarmonicFunction a U) (hu_int : weakFluxIntegrable U a u) (c : ℝ) : + h10FluxIntegrable U (fun x => matVecMul (a x) ((c • u.toH1).grad x)) := by + intro φ + change MeasureTheory.Integrable + (fun x => vecDot (matVecMul (a x) ((c • u.toH1).grad x)) (φ.toH1Function.grad x)) + (MeasureTheory.volume.restrict U) + rw [show + (fun x => vecDot (matVecMul (a x) ((c • u.toH1).grad x)) (φ.toH1Function.grad x)) = + fun x => c * vecDot (matVecMul (a x) (u.toH1.grad x)) (φ.toH1Function.grad x) by + funext x + change + vecDot (matVecMul (a x) (c • u.toH1.grad x)) (φ.toH1Function.grad x) = + c * vecDot (matVecMul (a x) (u.toH1.grad x)) (φ.toH1Function.grad x) + rw [matVecMul_smul, vecDot_smul_left]] + exact (hu_int φ).integrable.const_mul c + +noncomputable def restrictOfMemVectorL2 {d : ℕ} {a : CoeffField d} {U V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + (u : AHarmonicFunction a U) (hU : IsOpen U) (hV : IsOpen V) (hVU : V ⊆ U) + (hfluxV : MemVectorL2 V (fun x => matVecMul (a x) (u.toH1.grad x))) : + AHarmonicFunction a V := + { toH1 := u.toH1.restrict hV hVU + isHarmonic := u.isHarmonic.restrict_of_isOpen_of_memVectorL2 hU hV hVU hfluxV } + +@[simp] theorem toH1_restrictOfMemVectorL2 {d : ℕ} {a : CoeffField d} {U V : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + (u : AHarmonicFunction a U) (hU : IsOpen U) (hV : IsOpen V) (hVU : V ⊆ U) + (hfluxV : MemVectorL2 V (fun x => matVecMul (a x) (u.toH1.grad x))) : + (u.restrictOfMemVectorL2 hU hV hVU hfluxV).toH1 = u.toH1.restrict hV hVU := + rfl + +noncomputable def restrictOfIsEllipticFieldOn {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} + {U V : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + (u : AHarmonicFunction a U) (hU : IsOpen U) (hV : IsOpen V) (hVU : V ⊆ U) + (hEllV : IsEllipticFieldOn lam Lam V a) : + AHarmonicFunction a V := + u.restrictOfMemVectorL2 hU hV hVU + (memVectorL2_matVecMul_of_isEllipticFieldOn hEllV (u.toH1.restrict hV hVU).grad_memVectorL2) + +@[simp] theorem toH1_restrictOfIsEllipticFieldOn {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} + {U V : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + (u : AHarmonicFunction a U) (hU : IsOpen U) (hV : IsOpen V) (hVU : V ⊆ U) + (hEllV : IsEllipticFieldOn lam Lam V a) : + (u.restrictOfIsEllipticFieldOn hU hV hVU hEllV).toH1 = u.toH1.restrict hV hVU := + rfl + +def addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + AHarmonicFunction a U := + { toH1 := u.toH1 + v.toH1 + isHarmonic := isAHarmonicGradient_add_of_integrable u.isHarmonic v.isHarmonic hu_int hv_int } + +@[simp] theorem toH1_addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + (addOfIntegrable u v hu_int hv_int).toH1 = u.toH1 + v.toH1 := + rfl + +@[simp] theorem grad_addOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u v : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hv_int : weakFluxIntegrable U a v) : + (addOfIntegrable u v hu_int hv_int).toH1.grad = u.toH1.grad + v.toH1.grad := + rfl + +def addSMulOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) (c : ℝ) : + AHarmonicFunction a U := + addOfIntegrable u + { toH1 := c • w.toH1 + isHarmonic := isAHarmonicGradient_smul w.isHarmonic c } + hu_int + (integrableOn_smul w hw_int c) + +@[simp] theorem toH1_addSMulOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) (c : ℝ) : + (addSMulOfIntegrable u w hu_int hw_int c).toH1 = u.toH1 + c • w.toH1 := + rfl + +@[simp] theorem grad_addSMulOfIntegrable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + (u w : AHarmonicFunction a U) + (hu_int : weakFluxIntegrable U a u) (hw_int : weakFluxIntegrable U a w) (c : ℝ) : + (addSMulOfIntegrable u w hu_int hw_int c).toH1.grad = u.toH1.grad + c • w.toH1.grad := + rfl + +end AHarmonicFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicCube.lean b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicCube.lean new file mode 100644 index 0000000000..93d0463c8e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicCube.lean @@ -0,0 +1,254 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.PDE.HarmonicTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge + +/-! +# Harmonic functions on triadic subcubes + +This file packages the general restriction theorem for `AHarmonicFunction` as a +cube-facing API. The half-open `cubeSet` transport layer is intentionally kept +separate; on open cubes the restriction follows directly from descendant +containment and monotonicity of ellipticity. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace AHarmonicFunction + +private noncomputable def castDomain {d : ℕ} {a : CoeffField d} {U V : Set (Vec d)} + (hUV : U = V) (u : AHarmonicFunction a U) : AHarmonicFunction a V := + hUV ▸ u + +private noncomputable def castCoeff {d : ℕ} {a b : CoeffField d} {U : Set (Vec d)} + (hab : a = b) (u : AHarmonicFunction a U) : AHarmonicFunction b U := + hab ▸ u + +@[simp] theorem grad_castDomain {d : ℕ} {a : CoeffField d} {U V : Set (Vec d)} + (hUV : U = V) (u : AHarmonicFunction a U) : + (castDomain hUV u).toH1.grad = u.toH1.grad := by + subst V + rfl + +@[simp] theorem grad_castCoeff {d : ℕ} {a b : CoeffField d} {U : Set (Vec d)} + (hab : a = b) (u : AHarmonicFunction a U) : + (castCoeff hab u).toH1.grad = u.toH1.grad := by + subst b + rfl + +theorem isAHarmonicGradient_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} {f : Vec d → Vec d} : + IsAHarmonicGradient a (cubeSet (originCube d n)) f ↔ + IsAHarmonicGradient a (openCubeSet (originCube d n)) f := by + constructor + · rintro ⟨hpot, hsol⟩ + refine ⟨isPotentialOn_openCubeSet_originCube_of_cubeSet hpot, ?_⟩ + exact isSolenoidalOn_openCubeSet_originCube_of_cubeSet hsol + · rintro ⟨hpot, hsol⟩ + refine ⟨isPotentialOn_cubeSet_originCube_of_openCubeSet hpot, ?_⟩ + exact isSolenoidalOn_cubeSet_originCube_of_openCubeSet hsol + +noncomputable def toCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (u : AHarmonicFunction a (openCubeSet (originCube d n))) : + AHarmonicFunction a (cubeSet (originCube d n)) where + toH1 := u.toH1.toCubeSetOriginCube + isHarmonic := + (isAHarmonicGradient_cubeSet_originCube_iff_openCubeSet (d := d) (n := n) (a := a) + (f := u.toH1.grad)).2 u.isHarmonic + +@[simp] theorem grad_toCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (u : AHarmonicFunction a (openCubeSet (originCube d n))) : + (u.toCubeSetOriginCube (n := n)).toH1.grad = u.toH1.grad := + rfl + +noncomputable def toOpenCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (u : AHarmonicFunction a (cubeSet (originCube d n))) : + AHarmonicFunction a (openCubeSet (originCube d n)) where + toH1 := u.toH1.restrict (isOpen_openCubeSet (originCube d n)) (openCubeSet_subset_cubeSet _) + isHarmonic := + (isAHarmonicGradient_cubeSet_originCube_iff_openCubeSet (d := d) (n := n) (a := a) + (f := u.toH1.grad)).1 u.isHarmonic + +@[simp] theorem grad_toOpenCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} {a : CoeffField d} + (u : AHarmonicFunction a (cubeSet (originCube d n))) : + (u.toOpenCubeSetOriginCube (n := n)).toH1.grad = u.toH1.grad := + rfl + +private noncomputable def toCubeSetOrigin {d : ℕ} [NeZero d] {a : CoeffField d} + (Q : TriadicCube d) (u : AHarmonicFunction a (cubeSet Q)) : + AHarmonicFunction (translateCoeffField (triadicCubeShift Q) a) + (cubeSet (originCube d Q.scale)) := by + let z : Vec d := triadicCubeShift Q + let U : Set (Vec d) := cubeSet (originCube d Q.scale) + have hcube : cubeSet Q = translateSet z U := by + simpa [z, U] using cubeSet_eq_translateSet_originCube_of_triadicCube Q + let uTranslated : AHarmonicFunction a (translateSet z U) := castDomain hcube u + have hcoeff : a = translateCoeffField (-z) (translateCoeffField z a) := by + rw [translateCoeffField_neg_add_cancel] + let uOrigin : + AHarmonicFunction (translateCoeffField z a) (translateSet (-z) (translateSet z U)) := by + exact AHarmonicFunction.translate (-z) (castCoeff hcoeff uTranslated) + have hdomain : translateSet (-z) (translateSet z U) = U := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) U) + exact castDomain hdomain uOrigin + +private noncomputable def toOpenCubeSetOrigin {d : ℕ} [NeZero d] {a : CoeffField d} + (Q : TriadicCube d) (u : AHarmonicFunction a (openCubeSet Q)) : + AHarmonicFunction (translateCoeffField (triadicCubeShift Q) a) + (openCubeSet (originCube d Q.scale)) := by + let z : Vec d := triadicCubeShift Q + let U : Set (Vec d) := openCubeSet (originCube d Q.scale) + have hopen : openCubeSet Q = translateSet z U := by + simpa [z, U] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uTranslated : AHarmonicFunction a (translateSet z U) := castDomain hopen u + have hcoeff : a = translateCoeffField (-z) (translateCoeffField z a) := by + rw [translateCoeffField_neg_add_cancel] + let uOrigin : + AHarmonicFunction (translateCoeffField z a) (translateSet (-z) (translateSet z U)) := by + exact AHarmonicFunction.translate (-z) (castCoeff hcoeff uTranslated) + have hdomain : translateSet (-z) (translateSet z U) = U := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) U) + exact castDomain hdomain uOrigin + +noncomputable def toOpenCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (u : AHarmonicFunction a (cubeSet Q)) : + AHarmonicFunction a (openCubeSet Q) := by + let z : Vec d := triadicCubeShift Q + let U : Set (Vec d) := openCubeSet (originCube d Q.scale) + have hopen : openCubeSet Q = translateSet z U := by + simpa [z, U] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uOrigin : AHarmonicFunction (translateCoeffField z a) (cubeSet (originCube d Q.scale)) := + toCubeSetOrigin Q u + let uOpenOrigin : AHarmonicFunction (translateCoeffField z a) U := by + simpa [U] using uOrigin.toOpenCubeSetOriginCube + let uOpen : AHarmonicFunction a (translateSet z U) := + AHarmonicFunction.translate z uOpenOrigin + exact castDomain hopen.symm uOpen + +noncomputable def toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (u : AHarmonicFunction a (openCubeSet Q)) : + AHarmonicFunction a (cubeSet Q) := by + let z : Vec d := triadicCubeShift Q + let U : Set (Vec d) := cubeSet (originCube d Q.scale) + have hcube : cubeSet Q = translateSet z U := by + simpa [z, U] using cubeSet_eq_translateSet_originCube_of_triadicCube Q + let uOrigin : AHarmonicFunction (translateCoeffField z a) (openCubeSet (originCube d Q.scale)) := + toOpenCubeSetOrigin Q u + let uCubeOrigin : AHarmonicFunction (translateCoeffField z a) U := by + simpa [U] using uOrigin.toCubeSetOriginCube + let uCube : AHarmonicFunction a (translateSet z U) := + AHarmonicFunction.translate z uCubeOrigin + exact castDomain hcube.symm uCube + +/-- Restrict an `A`-harmonic function on an open triadic cube to an open +descendant cube. -/ +noncomputable def restrictToOpenSubcube {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} + {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hEllQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + AHarmonicFunction a (openCubeSet R) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet R).isFiniteMeasure_restrict_volume + exact u.restrictOfIsEllipticFieldOn + (isOpen_openCubeSet Q) + (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + (hEllQ.mono (measurableSet_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + +@[simp] theorem toH1_restrictToOpenSubcube {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} + {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hEllQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hEllQ hR).toH1 = + u.toH1.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) := + rfl + +@[simp] theorem grad_restrictToOpenSubcube {d : ℕ} {a : CoeffField d} {lam Lam : ℝ} + {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (openCubeSet Q)) + (hEllQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hEllQ hR).toH1.grad = u.toH1.grad := + rfl + +noncomputable def restrictToSubcube {d : ℕ} [NeZero d] {a : CoeffField d} {lam Lam : ℝ} + {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (cubeSet Q)) + (hEllQ : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + AHarmonicFunction a (cubeSet R) := by + let uOpen : AHarmonicFunction a (openCubeSet Q) := u.toOpenCubeSet + have hEllOpenQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a := + hEllQ.mono (measurableSet_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + exact (uOpen.restrictToOpenSubcube hEllOpenQ hR).toCubeSet + +@[simp] theorem grad_toOpenCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (u : AHarmonicFunction a (cubeSet Q)) : + u.toOpenCubeSet.toH1.grad = u.toH1.grad := by + funext x + simp [toOpenCubeSet, toCubeSetOrigin, sub_eq_add_neg, add_assoc] + +@[simp] theorem grad_toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} {a : CoeffField d} + (u : AHarmonicFunction a (openCubeSet Q)) : + u.toCubeSet.toH1.grad = u.toH1.grad := by + funext x + simp [toCubeSet, toOpenCubeSetOrigin, sub_eq_add_neg, add_assoc] + +@[simp] theorem grad_restrictToSubcube {d : ℕ} [NeZero d] {a : CoeffField d} {lam Lam : ℝ} + {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (cubeSet Q)) + (hEllQ : IsEllipticFieldOn lam Lam (cubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToSubcube hEllQ hR).toH1.grad = u.toH1.grad := by + simp only [restrictToSubcube, grad_toCubeSet, grad_restrictToOpenSubcube, grad_toOpenCubeSet] + +/-- +Restrict a `cubeSet` harmonic function to a descendant `cubeSet` when +ellipticity is known on the parent open cube. + +This is the a.e.-ellipticity-friendly variant used by Section 5.3: the +restriction proof happens on open cubes, and the result is transported back to +the half-open `cubeSet`. +-/ +noncomputable def restrictToSubcubeOfOpenElliptic {d : ℕ} [NeZero d] + {a : CoeffField d} {lam Lam : ℝ} {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (cubeSet Q)) + (hEllOpenQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + AHarmonicFunction a (cubeSet R) := by + let uOpen : AHarmonicFunction a (openCubeSet Q) := u.toOpenCubeSet + exact (uOpen.restrictToOpenSubcube hEllOpenQ hR).toCubeSet + +@[simp] theorem grad_restrictToSubcubeOfOpenElliptic {d : ℕ} [NeZero d] + {a : CoeffField d} {lam Lam : ℝ} {Q R : TriadicCube d} {j : ℕ} + (u : AHarmonicFunction a (cubeSet Q)) + (hEllOpenQ : IsEllipticFieldOn lam Lam (openCubeSet Q) a) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToSubcubeOfOpenElliptic hEllOpenQ hR).toH1.grad = u.toH1.grad := by + simp only [restrictToSubcubeOfOpenElliptic, grad_toCubeSet, grad_restrictToOpenSubcube, + grad_toOpenCubeSet] + +end AHarmonicFunction + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicHilbert.lean b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicHilbert.lean new file mode 100644 index 0000000000..1145a7be38 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicHilbert.lean @@ -0,0 +1,575 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge + +/-! # Harmonic Hilbert -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Hilbert realization of `A`-harmonic gradients + +This file starts the Stage 6 bridge from the response-maximizer direct method +to the concrete `AHarmonicFunction` API. The closed Hilbert subspace below +models gradients `F` such that `F ∈ Lpot(U)` and `a F ∈ Lsol(U)`. +-/ + +namespace AHarmonicGradientHilbert + +variable {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} {lam Lam : ℝ} +variable {M : PotentialSolenoidalL2Data U} {hEll : IsEllipticFieldOn lam Lam U a} + +private theorem vecDot_matVecMul_symmPart_comm_local (A : Mat d) (ξ η : Vec d) : + vecDot ξ (matVecMul (symmPart A) η) = vecDot η (matVecMul (symmPart A) ξ) := by + calc + vecDot ξ (matVecMul (symmPart A) η) + = vecDot ξ (matVecMul (matTranspose (symmPart A)) η) := by + simp + _ = vecDot (matVecMul (symmPart A) ξ) η := by + rw [vecDot_matVecMul_transpose] + _ = vecDot η (matVecMul (symmPart A) ξ) := by + rw [vecDot_comm] + +/-- The closed Hilbert subspace of vector `L²` fields whose plain representative +lies in the packaged potential space and whose coefficient-weighted +representative lies in the packaged solenoidal space. -/ +noncomputable def closedSubmodule (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : ClosedSubmodule ℝ (HilbertVectorL2 U) := + (M.potential.comap (hilbertVectorL2ToVectorL2 (U := U))) ⊓ + (M.solenoidal.comap + ((hilbertVectorL2ToVectorL2 (U := U)).comp (hilbertCoeffOperator hEll))) + +/-- The Hilbert carrier for `A`-harmonic gradients. -/ +noncomputable abbrev Space (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) := + (closedSubmodule (U := U) (a := a) M hEll).toSubmodule + +noncomputable instance instSeminormedAddCommGroup (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + SeminormedAddCommGroup (Space (U := U) (a := a) M hEll) := + inferInstanceAs + (SeminormedAddCommGroup ((closedSubmodule (U := U) (a := a) M hEll).toSubmodule)) + +noncomputable instance instNormedAddCommGroup (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + NormedAddCommGroup (Space (U := U) (a := a) M hEll) := + inferInstanceAs + (NormedAddCommGroup ((closedSubmodule (U := U) (a := a) M hEll).toSubmodule)) + +noncomputable instance instNormedSpace (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + NormedSpace ℝ (Space (U := U) (a := a) M hEll) := + inferInstanceAs + (NormedSpace ℝ ((closedSubmodule (U := U) (a := a) M hEll).toSubmodule)) + +noncomputable instance instInnerProductSpace (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + InnerProductSpace ℝ (Space (U := U) (a := a) M hEll) := + inferInstanceAs + (InnerProductSpace ℝ ((closedSubmodule (U := U) (a := a) M hEll).toSubmodule)) + +noncomputable instance instCompleteSpace (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + CompleteSpace (Space (U := U) (a := a) M hEll) := by + simpa [Space, closedSubmodule] using! + (closedSubmodule (U := U) (a := a) M hEll).isClosed.completeSpace_coe + +/-- The ambient Hilbert-vector `L²` field represented by a harmonic-gradient +Hilbert element. -/ +abbrev field {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : HilbertVectorL2 U := + z + +/-- The plain vector-valued `L²` representative of a harmonic-gradient Hilbert +element. -/ +noncomputable abbrev vectorField {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : VectorL2 U := + hilbertVectorL2ToVectorL2 (U := U) (field z) + +/-- The coefficient-weighted Hilbert-vector `L²` field associated to a +harmonic-gradient Hilbert element. -/ +noncomputable abbrev coeffField {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : HilbertVectorL2 U := + hilbertCoeffOperator hEll (field z) + +/-- The plain vector-valued representative of the coefficient-weighted field. -/ +noncomputable abbrev coeffVectorField {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : VectorL2 U := + hilbertVectorL2ToVectorL2 (U := U) (coeffField z) + +theorem mem_potential {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : + vectorField z ∈ M.potential := by + have hz := z.2 + change (z : HilbertVectorL2 U) ∈ + (M.potential.comap (hilbertVectorL2ToVectorL2 (U := U))) ⊓ + (M.solenoidal.comap + ((hilbertVectorL2ToVectorL2 (U := U)).comp (hilbertCoeffOperator hEll))) at hz + exact (ClosedSubmodule.mem_comap).1 (ClosedSubmodule.mem_inf.mp hz).1 + +theorem mem_solenoidal {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : + coeffVectorField z ∈ M.solenoidal := by + have hz := z.2 + change (z : HilbertVectorL2 U) ∈ + (M.potential.comap (hilbertVectorL2ToVectorL2 (U := U))) ⊓ + (M.solenoidal.comap + ((hilbertVectorL2ToVectorL2 (U := U)).comp (hilbertCoeffOperator hEll))) at hz + exact (ClosedSubmodule.mem_comap).1 (ClosedSubmodule.mem_inf.mp hz).2 + +/-- A concrete `A`-harmonic function determines an element of the closed +Hilbert realization of `A`-harmonic gradients. -/ +noncomputable def ofAHarmonicFunction (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) (u : AHarmonicFunction a U) : + Space (U := U) (a := a) M hEll := by + refine ⟨u.toH1.gradToHilbertVectorL2, ?_⟩ + change u.toH1.gradToHilbertVectorL2 ∈ + (closedSubmodule (U := U) (a := a) M hEll) + change u.toH1.gradToHilbertVectorL2 ∈ + (M.potential.comap (hilbertVectorL2ToVectorL2 (U := U))) ⊓ + (M.solenoidal.comap + ((hilbertVectorL2ToVectorL2 (U := U)).comp (hilbertCoeffOperator hEll))) + rw [ClosedSubmodule.mem_inf] + constructor + · rw [ClosedSubmodule.mem_comap] + simpa [H1Function.gradToHilbertVectorL2, H1Function.gradToVectorL2] using! + M.mem_potential u.toH1.grad_memVectorL2 u.isHarmonic.1 + · rw [ClosedSubmodule.mem_comap] + let hcoeff : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1.grad_memVectorL2 + have hfield : + hilbertVectorL2ToVectorL2 (U := U) + (hilbertCoeffOperator hEll u.toH1.gradToHilbertVectorL2) = + toVectorL2 hcoeff := by + change hilbertVectorL2ToVectorL2 (U := U) + (hilbertCoeffOperator hEll (toHilbertVectorL2OfVecField u.toH1.grad_memVectorL2)) = + toVectorL2 hcoeff + rw [hilbertCoeffOperator_toHilbertVectorL2OfVecField hEll u.toH1.grad_memVectorL2] + exact hilbertVectorL2ToVectorL2_toHilbertVectorL2 (U := U) hcoeff + change + hilbertVectorL2ToVectorL2 (U := U) + (hilbertCoeffOperator hEll u.toH1.gradToHilbertVectorL2) ∈ + M.solenoidal + rw [hfield] + exact M.mem_solenoidal hcoeff u.isHarmonic.2 + +@[simp] theorem field_ofAHarmonicFunction (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) (u : AHarmonicFunction a U) : + field (ofAHarmonicFunction (U := U) (a := a) M hEll u) = + u.toH1.gradToHilbertVectorL2 := + rfl + +@[simp] theorem vectorField_ofAHarmonicFunction (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) (u : AHarmonicFunction a U) : + vectorField (ofAHarmonicFunction (U := U) (a := a) M hEll u) = + u.toH1.gradToVectorL2 := by + change hilbertVectorL2ToVectorL2 (U := U) u.toH1.gradToHilbertVectorL2 = + u.toH1.gradToVectorL2 + simpa [H1Function.gradToHilbertVectorL2, H1Function.gradToVectorL2] using + hilbertVectorL2ToVectorL2_toHilbertVectorL2 (U := U) u.toH1.grad_memVectorL2 + +/-- The inclusion of the closed harmonic-gradient space into ambient +Hilbert-vector `L²`. -/ +noncomputable def fieldCLM (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Space (U := U) (a := a) M hEll →L[ℝ] HilbertVectorL2 U := + (closedSubmodule (U := U) (a := a) M hEll).toSubmodule.subtypeL + +@[simp] theorem fieldCLM_apply (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) + (z : Space (U := U) (a := a) M hEll) : + fieldCLM (U := U) (a := a) M hEll z = field z := + rfl + +theorem field_eq_toHilbertVectorL2OfVecField {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : + field z = + toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := by + calc + field z = vectorL2ToHilbertVectorL2 (U := U) (vectorField z) := by + symm + exact vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (U := U) (field z) + _ = + vectorL2ToHilbertVectorL2 (U := U) + (toVectorL2 (MeasureTheory.Lp.memLp (vectorField z))) := by + congr 1 + exact + (MeasureTheory.Lp.toLp_coeFn + (vectorField z) + (MeasureTheory.Lp.memLp (vectorField z))).symm + _ = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := by + rfl + +/-- The symmetric coefficient-weighted field associated to a harmonic-gradient +Hilbert element. -/ +noncomputable abbrev symmCoeffField {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : HilbertVectorL2 U := + hilbertSymmCoeffOperator hEll (field z) + +/-- The continuous symmetric-coefficient field map on the closed +harmonic-gradient space. -/ +noncomputable def symmCoeffFieldCLM (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Space (U := U) (a := a) M hEll →L[ℝ] HilbertVectorL2 U := + (hilbertSymmCoeffOperator hEll).comp (fieldCLM (U := U) (a := a) M hEll) + +/-- The symmetric energy bilinear form on the closed `A`-harmonic-gradient +Hilbert space. -/ +noncomputable def symmCoeffBilin (M : PotentialSolenoidalL2Data U) + (hEll : IsEllipticFieldOn lam Lam U a) : + Space (U := U) (a := a) M hEll →L[ℝ] + Space (U := U) (a := a) M hEll →L[ℝ] ℝ := + ContinuousLinearMap.bilinearComp (isBoundedBilinearMap_inner (𝕜 := ℝ)).toContinuousLinearMap + (symmCoeffFieldCLM (U := U) (a := a) M hEll) + (fieldCLM (U := U) (a := a) M hEll) + +@[simp] theorem symmCoeffBilin_apply {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z w : Space (U := U) (a := a) M hEll) : + symmCoeffBilin (U := U) (a := a) M hEll z w = + inner ℝ (hilbertSymmCoeffOperator hEll (field z)) (field w) := by + simp [symmCoeffBilin, symmCoeffFieldCLM, ContinuousLinearMap.bilinearComp_apply, field] + +theorem symmCoeffBilin_apply_eq_integral {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z w : Space (U := U) (a := a) M hEll) : + symmCoeffBilin (U := U) (a := a) M hEll z w = + ∫ x in U, + vecDot (matVecMul (symmPart (a x)) (vectorField z x)) (vectorField w x) + ∂MeasureTheory.volume := by + have hzField : + field z = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z)) := + field_eq_toHilbertVectorL2OfVecField z + have hwField : + field w = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField w)) := + field_eq_toHilbertVectorL2OfVecField w + have hA : + hilbertSymmCoeffOperator hEll (field z) = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [hzField] + exact + hilbertSymmCoeffOperator_toHilbertVectorL2OfVecField + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll + (MeasureTheory.Lp.memLp (vectorField z)) + calc + symmCoeffBilin (U := U) (a := a) M hEll z w + = inner ℝ (hilbertSymmCoeffOperator hEll (field z)) (field w) := by + simp [symmCoeffBilin_apply] + _ = + inner ℝ + (toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z)))) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField w))) := by + rw [hA, hwField] + _ = + ∫ x in U, + vecDot (matVecMul (symmPart (a x)) (vectorField z x)) (vectorField w x) + ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + (MeasureTheory.Lp.memLp (vectorField w)) + +theorem symmCoeffBilin_apply_eq_integral_comm {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z w : Space (U := U) (a := a) M hEll) : + symmCoeffBilin (U := U) (a := a) M hEll z w = + ∫ x in U, + vecDot (vectorField w x) (matVecMul (symmPart (a x)) (vectorField z x)) + ∂MeasureTheory.volume := by + rw [symmCoeffBilin_apply_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [] with x + exact vecDot_comm _ _ + +theorem symmCoeffBilin_symm {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z w : Space (U := U) (a := a) M hEll) : + symmCoeffBilin (U := U) (a := a) M hEll z w = + symmCoeffBilin (U := U) (a := a) M hEll w z := by + rw [symmCoeffBilin_apply_eq_integral_comm, symmCoeffBilin_apply_eq_integral_comm] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [] with x + exact vecDot_matVecMul_symmPart_comm_local (a x) (vectorField w x) (vectorField z x) + +theorem symmCoeffBilin_self_ge_lam_mul_norm_sq {M : PotentialSolenoidalL2Data U} + {hEll : IsEllipticFieldOn lam Lam U a} + (z : Space (U := U) (a := a) M hEll) : + lam * ‖z‖ ^ 2 ≤ symmCoeffBilin (U := U) (a := a) M hEll z z := by + have hsqInt : + MeasureTheory.IntegrableOn + (fun x => vecNormSq (vectorField z x)) U := by + simpa [vecNormSq] using + (integrableOn_vecDot_of_memVectorL2 + (MeasureTheory.Lp.memLp (vectorField z)) + (MeasureTheory.Lp.memLp (vectorField z))) + have henergyInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (symmPart (a x)) (vectorField z x)) (vectorField z x)) U := by + exact + integrableOn_vecDot_of_memVectorL2 + (memVectorL2_matVecMul_symmPart_of_isEllipticFieldOn hEll + (MeasureTheory.Lp.memLp (vectorField z))) + (MeasureTheory.Lp.memLp (vectorField z)) + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hpoint : + ∀ᵐ x ∂ volumeMeasureOn U, + lam * vecNormSq (vectorField z x) ≤ + vecDot (matVecMul (symmPart (a x)) (vectorField z x)) (vectorField z x) := by + filter_upwards [hmem] with x hx + simpa [vecDot_comm] using + lowerBound_symmPart_of_isEllipticMatrix (hEll.2 x hx) (vectorField z x) + have hnormSq : + ‖z‖ ^ 2 = + ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + calc + ‖z‖ ^ 2 = inner ℝ (field z) (field z) := by + simp [field] + _ = + inner ℝ + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp (vectorField z))) := by + rw [field_eq_toHilbertVectorL2OfVecField z] + _ = + ∫ x in U, vecDot (vectorField z x) (vectorField z x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (MeasureTheory.Lp.memLp (vectorField z)) + (MeasureTheory.Lp.memLp (vectorField z)) + _ = ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + simp [vecNormSq] + calc + lam * ‖z‖ ^ 2 + = lam * ∫ x in U, vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + rw [hnormSq] + _ = ∫ x in U, lam * vecNormSq (vectorField z x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ ≤ + ∫ x in U, + vecDot (matVecMul (symmPart (a x)) (vectorField z x)) (vectorField z x) + ∂MeasureTheory.volume := + MeasureTheory.integral_mono_ae (hsqInt.const_mul lam) henergyInt hpoint + _ = symmCoeffBilin (U := U) (a := a) M hEll z z := by + symm + exact symmCoeffBilin_apply_eq_integral (U := U) (a := a) z z + +theorem isCoercive_symmCoeffBilin {M : PotentialSolenoidalL2Data U} + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + IsCoercive (symmCoeffBilin (U := U) (a := a) M hEll) := by + rcases hne with ⟨x, hx⟩ + refine ⟨lam, (hEll.2 x hx).1, ?_⟩ + intro z + simpa [pow_two, mul_assoc] using + symmCoeffBilin_self_ge_lam_mul_norm_sq (U := U) (a := a) (M := M) z + +noncomputable def vectorPairingCLM [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) : + VectorL2 U →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (HilbertVectorL2 U) (toHilbertVectorL2OfVecField hg)).comp + ((continuousLinearEquivVectorL2 (U := U)).toContinuousLinearMap) + +theorem vectorPairingCLM_apply_eq_integral + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (F : VectorL2 U) : + vectorPairingCLM (U := U) hg F = + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume := by + have hF : + (continuousLinearEquivVectorL2 (U := U)) F = + toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F) := by + calc + (continuousLinearEquivVectorL2 (U := U)) F + = vectorL2ToHilbertVectorL2 (U := U) F := by + rfl + _ = + vectorL2ToHilbertVectorL2 (U := U) + (toVectorL2 (MeasureTheory.Lp.memLp F)) := by + congr 1 + exact (MeasureTheory.Lp.toLp_coeFn F (MeasureTheory.Lp.memLp F)).symm + _ = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F) := by + rfl + calc + vectorPairingCLM (U := U) hg F + = inner ℝ + (toHilbertVectorL2OfVecField hg) + ((continuousLinearEquivVectorL2 (U := U)) F) := by + simp [vectorPairingCLM] + _ = + inner ℝ + (toHilbertVectorL2OfVecField hg) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F)) := by + rw [hF] + _ = ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hg (MeasureTheory.Lp.memLp F) + +theorem integral_vecDot_eq_zero_of_mem_potential_closure + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (F : VectorL2 U) + (hF : F ∈ (PotentialSolenoidalL2Data.ofSubmoduleClosures U).potential) + {g : Vec d → Vec d} (hg : MemVectorL2 U g) + (hsol : IsSolenoidalZeroNormalTraceOn U g) : + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume = 0 := by + let ℓ : VectorL2 U →L[ℝ] ℝ := vectorPairingCLM (U := U) hg + have hKClosed : IsClosed ((LinearMap.ker ℓ.toLinearMap : Submodule ℝ (VectorL2 U)) : + Set (VectorL2 U)) := by + simpa [LinearMap.mem_ker] using! + isClosed_singleton.preimage (ContinuousLinearMap.continuous ℓ) + let K : ClosedSubmodule ℝ (VectorL2 U) := + ⟨LinearMap.ker ℓ.toLinearMap, hKClosed⟩ + have hsub : + PotentialSolenoidalL2Data.potentialSubmodule U ≤ LinearMap.ker ℓ.toLinearMap := by + intro X hX + rcases hX with ⟨f, hf, rfl, hpot⟩ + change ℓ (toVectorL2 hf) = 0 + rcases hpot with ⟨u, hu⟩ + have hpair : + ∫ x in U, vecDot (g x) ((toVectorL2 hf) x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toVectorL2 hf] with x hx + rw [hx] + calc + ℓ (toVectorL2 hf) = + ∫ x in U, vecDot (g x) ((toVectorL2 hf) x) ∂MeasureTheory.volume := + vectorPairingCLM_apply_eq_integral (U := U) hg (toVectorL2 hf) + _ = ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume := hpair + _ = 0 := by simpa [hu] using hsol u + have hclosure : + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).potential ≤ + LinearMap.ker ℓ.toLinearMap := by + exact (Submodule.closure_le (s := PotentialSolenoidalL2Data.potentialSubmodule U) + (t := K)).2 hsub + have hkerF : F ∈ LinearMap.ker ℓ.toLinearMap := hclosure hF + have hzero : ℓ F = 0 := by + exact hkerF + calc + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume = ℓ F := by + symm + exact vectorPairingCLM_apply_eq_integral (U := U) hg F + _ = 0 := hzero + +theorem integral_vecDot_eq_zero_of_mem_solenoidal_closure + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (G : VectorL2 U) + (hG : G ∈ (PotentialSolenoidalL2Data.ofSubmoduleClosures U).solenoidal) + (φ : H10Function U) : + ∫ x in U, vecDot (G x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = 0 := by + exact + PotentialSolenoidalL2Data.isSolenoidalOn_of_mem_solenoidal_ofSubmoduleClosures + (U := U) G hG φ + +theorem isPotentialOn_vectorField_of_hodgeConverseCriterion + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hHodge : HodgeConverseCriterion U) + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + IsPotentialOn U (vectorField z) := + hHodge (MeasureTheory.Lp.memLp (vectorField z)) fun hg hsol => + integral_vecDot_eq_zero_of_mem_potential_closure + (U := U) (vectorField z) (mem_potential z) hg hsol + +theorem isSolenoidalOn_coeffVectorField + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + IsSolenoidalOn U (coeffVectorField z) := by + intro φ + exact integral_vecDot_eq_zero_of_mem_solenoidal_closure + (U := U) (coeffVectorField z) (mem_solenoidal z) φ + +theorem ae_coeffVectorField_eq_matVecMul_vectorField + (z : Space (U := U) (a := a) M hEll) : + coeffVectorField z =ᵐ[volumeMeasureOn U] + fun x => matVecMul (a x) (vectorField z x) := by + filter_upwards + [coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := coeffField z), + ae_hilbertCoeffOperator_apply hEll (field z), + coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := field z)] + with x hcoeffVec hcoeff hvec + rw [hcoeffVec, hcoeff, hvec] + simp [HilbertVec.applyMat_apply] + +theorem isSolenoidalOn_matVecMul_vectorField + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + IsSolenoidalOn U (fun x => matVecMul (a x) (vectorField z x)) := by + intro φ + calc + ∫ x in U, vecDot (matVecMul (a x) (vectorField z x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (coeffVectorField z x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [ae_coeffVectorField_eq_matVecMul_vectorField (z := z)] with x hx + rw [hx] + _ = 0 := isSolenoidalOn_coeffVectorField (U := U) (a := a) z φ + +theorem isAHarmonicGradient_vectorField_of_hodgeConverseCriterion + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hHodge : HodgeConverseCriterion U) + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + IsAHarmonicGradient a U (vectorField z) := + ⟨isPotentialOn_vectorField_of_hodgeConverseCriterion (U := U) (a := a) hHodge z, + isSolenoidalOn_matVecMul_vectorField (U := U) (a := a) z⟩ + +/-- Recover a concrete `AHarmonicFunction` from a Hilbert element in the closed +`A`-harmonic gradient space, using the Hodge converse to recover the potential +representative. -/ +noncomputable def toAHarmonicFunction + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hHodge : HodgeConverseCriterion U) + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + AHarmonicFunction a U := by + let hpot : IsPotentialOn U (vectorField z) := + isPotentialOn_vectorField_of_hodgeConverseCriterion (U := U) (a := a) hHodge z + let u : H1Function U := Classical.choose hpot + have hu : u.grad = vectorField z := Classical.choose_spec hpot + exact + { toH1 := u + isHarmonic := by + simpa [u, hu] using + isAHarmonicGradient_vectorField_of_hodgeConverseCriterion + (U := U) (a := a) hHodge z } + +@[simp] theorem grad_toAHarmonicFunction + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hHodge : HodgeConverseCriterion U) + (z : Space (U := U) (a := a) (PotentialSolenoidalL2Data.ofSubmoduleClosures U) hEll) : + (toAHarmonicFunction (U := U) (a := a) hHodge z).toH1.grad = vectorField z := by + unfold toAHarmonicFunction + exact Classical.choose_spec + (isPotentialOn_vectorField_of_hodgeConverseCriterion (U := U) (a := a) hHodge z) + +end AHarmonicGradientHilbert + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicTranslation.lean b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicTranslation.lean new file mode 100644 index 0000000000..e0ec2d565a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/HarmonicTranslation.lean @@ -0,0 +1,57 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.Harmonic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation + +/-! +# Translation of harmonic functions + +This file contains the PDE-level translation API for `AHarmonicFunction`. It is +used by both coarse-graining response identities and cube/open-cube transport. +-/ + +@[expose] public section + +namespace Homogenization + +@[simp] theorem translateCoeffField_neg_add_cancel {d : ℕ} + (z : Vec d) (a : CoeffField d) : + translateCoeffField (-z) (translateCoeffField z a) = a := by + funext x + simp [translateCoeffField, add_assoc] + +theorem isAHarmonicGradient_translateSet {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (z : Vec d) {f : Vec d → Vec d} + (hf : IsAHarmonicGradient (translateCoeffField z a) U f) : + IsAHarmonicGradient a (translateSet z U) (fun x => f (x - z)) := by + rcases hf with ⟨hpot, hsol⟩ + constructor + · exact isPotentialOn_translateSet hpot z + · simpa [translateCoeffField, sub_eq_add_neg, add_assoc] using + isSolenoidalOn_translateSet hsol z + +namespace AHarmonicFunction + +/-- Translate an `a(· + z)`-harmonic function on `U` to an `a`-harmonic +function on `U + z`. -/ +noncomputable def translate {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (z : Vec d) (u : AHarmonicFunction (translateCoeffField z a) U) : + AHarmonicFunction a (translateSet z U) where + toH1 := u.toH1.translate z + isHarmonic := by + simpa [H1Function.translate] using isAHarmonicGradient_translateSet z u.isHarmonic + +@[simp] theorem grad_translate {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + (z : Vec d) (u : AHarmonicFunction (translateCoeffField z a) U) (x : Vec d) : + (AHarmonicFunction.translate z u).toH1.grad x = u.toH1.grad (x - z) := + rfl + +end AHarmonicFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/PDE/NeumannRHS.lean b/LeanPool/CoarseGraining/Homogenization/PDE/NeumannRHS.lean new file mode 100644 index 0000000000..1225338791 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/PDE/NeumannRHS.lean @@ -0,0 +1,788 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Neumann RHS -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +/-! +# Mean-zero Neumann problems with right-hand side + +This file starts the mean-zero Neumann-side RHS development. The current layer +packages the weak formulation, the coefficient-weighted Lax-Milgram solution, +the energy identity, the basic elliptic energy estimate, and the qualitative +uniqueness statement once a mean-zero coercive estimate is supplied. +-/ + +/-- Weak mean-zero Neumann formulation of `- div (a grad u) = div g` on `U`. -/ +def IsMeanZeroNeumannRhsWeakSolution {d : ℕ} + (a : CoeffField d) (U : Set (Vec d)) (u : H1MeanZeroFunction U) + (g : Vec d → Vec d) : Prop := + ∀ φ : H1MeanZeroFunction U, + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume + +theorem integrableOn_vecNormSq_meanZeroGrad + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1MeanZeroFunction U) : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u.toH1Function.grad x)) U := by + simpa [vecNormSq] using + (integrableOn_vecDot_of_memVectorL2 + u.toH1Function.grad_memVectorL2 u.toH1Function.grad_memVectorL2) + +theorem integrableOn_dirichletEnergyDensity_of_isEllipticFieldOn_meanZero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {a : CoeffField d} {lam Lam : ℝ} + (hEll : IsEllipticFieldOn lam Lam U a) (u : H1MeanZeroFunction U) : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) + (matVecMul (a x) (u.toH1Function.grad x))) U := by + have hflux : MemVectorL2 U (fun x => matVecMul (a x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2 + exact integrableOn_vecDot_of_memVectorL2 u.toH1Function.grad_memVectorL2 hflux + +namespace H1CoerciveHilbert + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] +variable {a : CoeffField d} {lam Lam : ℝ} + +/-- The coefficient-weighted gradient projection on the coercive Hilbert graph. -/ +noncomputable def coeffGradientCLM (hEll : IsEllipticFieldOn lam Lam U a) : + H1CoerciveHilbertSpace (U := U) →L[ℝ] HilbertVectorL2 U := + (hilbertCoeffOperator hEll).comp (gradientCLM (U := U)) + +/-- The coefficient-weighted gradient bilinear form on the coercive Hilbert +graph. -/ +noncomputable def coeffGradientBilin (hEll : IsEllipticFieldOn lam Lam U a) : + H1CoerciveHilbertSpace (U := U) →L[ℝ] + H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ := + ContinuousLinearMap.bilinearComp (isBoundedBilinearMap_inner (𝕜 := ℝ)).toContinuousLinearMap + (coeffGradientCLM (U := U) hEll) (gradientCLM (U := U)) + +@[simp] theorem coeffGradientBilin_apply (hEll : IsEllipticFieldOn lam Lam U a) + (z w : H1CoerciveHilbertSpace (U := U)) : + coeffGradientBilin (U := U) hEll z w = + inner ℝ + (hilbertCoeffOperator hEll (gradient (U := U) z)) + (gradient (U := U) w) := by + simp [coeffGradientBilin, coeffGradientCLM, gradient, gradientCLM]; rfl + +theorem coeffGradientBilin_apply_toH1CoerciveHilbertSpace + (hEll : IsEllipticFieldOn lam Lam U a) + (u v : H1MeanZeroFunction U) : + coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) = + ∫ x in U, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (v.toH1Function.grad x) + ∂MeasureTheory.volume := by + have hAu : + hilbertCoeffOperator hEll u.gradToHilbertVectorL2 = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2) := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + hilbertCoeffOperator_toHilbertVectorL2OfVecField + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll u.toH1Function.grad_memVectorL2 + calc + coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + = + inner ℝ (hilbertCoeffOperator hEll u.gradToHilbertVectorL2) v.gradToHilbertVectorL2 := by + simp [coeffGradientBilin_apply] + _ = + inner ℝ + (toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2)) + v.gradToHilbertVectorL2 := by + rw [hAu] + _ = + ∫ x in U, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (v.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2) + v.toH1Function.grad_memVectorL2 + +theorem coeffGradientBilin_apply_eq_integral + (hEll : IsEllipticFieldOn lam Lam U a) + (z w : H1CoerciveHilbertSpace (U := U)) : + coeffGradientBilin (U := U) hEll z w = + ∫ x in U, + vecDot + (matVecMul (a x) ((toH1MeanZeroFunction (U := U) z).toH1Function.grad x)) + ((toH1MeanZeroFunction (U := U) w).toH1Function.grad x) + ∂MeasureTheory.volume := by + let u : H1MeanZeroFunction U := toH1MeanZeroFunction (U := U) z + let v : H1MeanZeroFunction U := toH1MeanZeroFunction (U := U) w + have huGrad : u.gradToHilbertVectorL2 = gradient (U := U) z := by + simp [u] + have hvGrad : v.gradToHilbertVectorL2 = gradient (U := U) w := by + simp [v] + have hAu : + hilbertCoeffOperator hEll u.gradToHilbertVectorL2 = + toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2) := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + hilbertCoeffOperator_toHilbertVectorL2OfVecField + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll u.toH1Function.grad_memVectorL2 + calc + coeffGradientBilin (U := U) hEll z w + = inner ℝ (hilbertCoeffOperator hEll (gradient (U := U) z)) (gradient (U := U) w) := by + simp [coeffGradientBilin_apply] + _ = inner ℝ (hilbertCoeffOperator hEll u.gradToHilbertVectorL2) v.gradToHilbertVectorL2 := by + rw [← huGrad, ← hvGrad] + _ = + inner ℝ + (toHilbertVectorL2OfVecField + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2)) + v.gradToHilbertVectorL2 := by + rw [hAu] + _ = + ∫ x in U, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (v.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + (memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2) + v.toH1Function.grad_memVectorL2 + +theorem coeffGradientBilin_self_ge_lam_mul_norm_gradient_sq + (hEll : IsEllipticFieldOn lam Lam U a) + (z : H1CoerciveHilbertSpace (U := U)) : + lam * ‖gradient (U := U) z‖ ^ 2 ≤ coeffGradientBilin (U := U) hEll z z := by + let u : H1MeanZeroFunction U := toH1MeanZeroFunction (U := U) z + have hsqInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) (u.toH1Function.grad x)) U := by + simpa [vecNormSq] using integrableOn_vecNormSq_meanZeroGrad u + have henergyInt : + MeasureTheory.IntegrableOn + (fun x => + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (u.toH1Function.grad x)) U := + by + simpa [vecDot_comm] using + integrableOn_dirichletEnergyDensity_of_isEllipticFieldOn_meanZero hEll u + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hpoint : + ∀ᵐ x ∂ volumeMeasureOn U, + lam * vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ≤ + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (u.toH1Function.grad x) := by + filter_upwards [hmem] with x hx + simpa [vecNormSq, vecDot_comm] using (hEll.2 x hx).2.2.1 (u.toH1Function.grad x) + have hgradSq : + ‖gradient (U := U) z‖ ^ 2 = + ∫ x in U, vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + have huGrad : u.gradToHilbertVectorL2 = gradient (U := U) z := by + simp [u] + calc + ‖gradient (U := U) z‖ ^ 2 = inner ℝ (gradient (U := U) z) (gradient (U := U) z) := by + symm + exact real_inner_self_eq_norm_sq (gradient (U := U) z) + _ = inner ℝ u.gradToHilbertVectorL2 u.gradToHilbertVectorL2 := by + rw [← huGrad] + _ = + ∫ x in U, vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) u.toH1Function.grad_memVectorL2 u.toH1Function.grad_memVectorL2 + calc + lam * ‖gradient (U := U) z‖ ^ 2 + = lam * + ∫ x in U, vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [hgradSq] + _ = + ∫ x in U, lam * vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ ≤ + ∫ x in U, + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (u.toH1Function.grad x) + ∂MeasureTheory.volume := + MeasureTheory.integral_mono_ae (hsqInt.const_mul lam) henergyInt hpoint + _ = coeffGradientBilin (U := U) hEll z z := by + symm + simpa [u] using coeffGradientBilin_apply_eq_integral + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll z z + +theorem isCoercive_coeffGradientBilin + (hC : H1CoerciveEstimate U) (hne : Set.Nonempty U) + (hEll : IsEllipticFieldOn lam Lam U a) : + IsCoercive (coeffGradientBilin (U := U) hEll) := by + let M : ℝ := hC.fixedValue + 1 + rcases hne with ⟨x, hx⟩ + have hlam : 0 < lam := (hEll.2 x hx).1 + have hM_pos : 0 < M := by + linarith [hC.constant_nonneg] + refine ⟨lam * M⁻¹ * M⁻¹, by positivity, ?_⟩ + intro z + have hbound : ‖z‖ ≤ M * ‖gradient (U := U) z‖ := by + simpa [M] using norm_le_max_constant_one_mul_norm_gradient (d := d) (U := U) hC z + have hscaled : M⁻¹ * ‖z‖ ≤ ‖gradient (U := U) z‖ := by + calc + M⁻¹ * ‖z‖ ≤ M⁻¹ * (M * ‖gradient (U := U) z‖) := by + gcongr + _ = ‖gradient (U := U) z‖ := by + field_simp [hM_pos.ne'] + have hsq : + (M⁻¹ * ‖z‖) ^ 2 ≤ ‖gradient (U := U) z‖ ^ 2 := by + have hleft_nonneg : 0 ≤ M⁻¹ * ‖z‖ := by + exact mul_nonneg (inv_nonneg.mpr (le_of_lt hM_pos)) (norm_nonneg _) + have hright_nonneg : 0 ≤ ‖gradient (U := U) z‖ := norm_nonneg _ + have hM_abs : |M| = M := abs_of_nonneg (le_of_lt hM_pos) + exact sq_le_sq.mpr <| by + simpa [abs_of_nonneg hleft_nonneg, abs_of_nonneg hright_nonneg, abs_inv, hM_abs] using + hscaled + calc + (lam * M⁻¹ * M⁻¹) * ‖z‖ * ‖z‖ = lam * (M⁻¹ * ‖z‖) ^ 2 := by + ring + _ ≤ lam * ‖gradient (U := U) z‖ ^ 2 := by + nlinarith [hsq, le_of_lt hlam] + _ ≤ coeffGradientBilin (U := U) hEll z z := + coeffGradientBilin_self_ge_lam_mul_norm_gradient_sq (U := U) hEll z + +/-- The unique coercive-Hilbert graph element solving the coefficient-weighted +gradient problem with forcing `f`. -/ +noncomputable def coeffGradientProblemSolution {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + H1CoerciveHilbertSpace (U := U) := by + let hB : IsCoercive (coeffGradientBilin (U := U) hEll) := + isCoercive_coeffGradientBilin (U := U) (a := a) (lam := lam) (Lam := Lam) hC hne hEll + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + exact e.symm (forcingRieszRep (U := U) hf) + +theorem coeffGradientBilin_coeffGradientProblemSolution_apply {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) + (z : H1CoerciveHilbertSpace (U := U)) : + coeffGradientBilin (U := U) hEll + (coeffGradientProblemSolution (U := U) (a := a) (lam := lam) (Lam := Lam) + hf hC hne hEll) z = + forcingFunctionalCLM (U := U) hf z := by + let hB : IsCoercive (coeffGradientBilin (U := U) hEll) := + isCoercive_coeffGradientBilin (U := U) (a := a) (lam := lam) (Lam := Lam) hC hne hEll + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + calc + coeffGradientBilin (U := U) hEll + (coeffGradientProblemSolution (U := U) (a := a) (lam := lam) (Lam := Lam) + hf hC hne hEll) z + = inner ℝ (e (coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll)) z := by + symm + simpa [e, hB] using + hB.continuousLinearEquivOfBilin_apply + (coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll) + z + _ = inner ℝ (forcingRieszRep (U := U) hf) z := by + rw [coeffGradientProblemSolution, e.apply_symm_apply] + _ = forcingFunctionalCLM (U := U) hf z := by + exact inner_forcingRieszRep_apply (U := U) hf z + +end H1CoerciveHilbert + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] +variable {a : CoeffField d} {lam Lam : ℝ} + +/-- The mean-zero `H¹` weak solution represented by the coefficient-weighted +coercive Hilbert graph solution. -/ +noncomputable def coeffGradientProblemSolution {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + H1MeanZeroFunction U := + H1CoerciveHilbert.toH1MeanZeroFunction + (H1CoerciveHilbert.coeffGradientProblemSolution + (d := d) (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll) + +theorem coeffGradientProblemSolution_firstVariation_eq_integral {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) + (u : H1MeanZeroFunction U) : + ∫ x in U, + vecDot + (matVecMul (a x) + ((coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll).toH1Function.grad x)) + (u.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (f x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + let zsol : H1CoerciveHilbertSpace (U := U) := + H1CoerciveHilbert.coeffGradientProblemSolution + (d := d) (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll + let v : H1MeanZeroFunction U := coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll + have hzEq : + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + = + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll zsol + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) := by + have hvGrad : + v.gradToHilbertVectorL2 = H1CoerciveHilbert.gradient (U := U) zsol := by + unfold v zsol + simp [coeffGradientProblemSolution] + calc + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + = + inner ℝ + (hilbertCoeffOperator hEll v.gradToHilbertVectorL2) + u.gradToHilbertVectorL2 := by + simp [H1CoerciveHilbert.coeffGradientBilin_apply] + _ = + inner ℝ + (hilbertCoeffOperator hEll (H1CoerciveHilbert.gradient (U := U) zsol)) + u.gradToHilbertVectorL2 := by + rw [hvGrad] + _ = + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll zsol + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) := by + simp [H1CoerciveHilbert.coeffGradientBilin_apply] + have hpair : + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) = + gradientPairing hf u := by + calc + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + = + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll zsol + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) := hzEq + _ = H1CoerciveHilbert.forcingFunctionalCLM (U := U) hf + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) := + H1CoerciveHilbert.coeffGradientBilin_coeffGradientProblemSolution_apply + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) + _ = gradientPairing hf u := by + simpa using + H1MeanZeroFunction.H1CoerciveHilbert_forcingFunctionalCLM_apply_toH1CoerciveHilbertSpace + (U := U) hf u + calc + ∫ x in U, + vecDot + (matVecMul (a x) + ((coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll).toH1Function.grad x)) + (u.toH1Function.grad x) ∂MeasureTheory.volume + = + H1CoerciveHilbert.coeffGradientBilin (U := U) hEll + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) v) + (H1MeanZeroFunction.toH1CoerciveHilbertSpace (U := U) u) := by + symm + simpa [v] using + H1CoerciveHilbert.coeffGradientBilin_apply_toH1CoerciveHilbertSpace + (U := U) (a := a) (lam := lam) (Lam := Lam) hEll v u + _ = gradientPairing hf u := hpair + _ = ∫ x in U, vecDot (f x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + exact gradientPairing_eq_integral (U := U) hf u + +end H1MeanZeroFunction + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] +variable {a : CoeffField d} {lam Lam : ℝ} + +theorem coeffGradientProblemSolution_firstVariation_eq_integral {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) + (u : H1Function U) : + ∫ x in U, + vecDot + (matVecMul (a x) + ((H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll).toH1Function.grad x)) + (u.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (f x) (u.grad x) ∂MeasureTheory.volume := by + simpa using + (H1MeanZeroFunction.coeffGradientProblemSolution_firstVariation_eq_integral + (d := d) (U := U) (a := a) (lam := lam) (Lam := Lam) hf hC hne hEll + u.toMeanZero) + +end H1Function + +namespace IsMeanZeroNeumannRhsWeakSolution + +variable {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] +variable {u : H1MeanZeroFunction U} {g : Vec d → Vec d} + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem energy_identity + (h : IsMeanZeroNeumannRhsWeakSolution a U u g) : + ∫ x in U, + vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa [vecDot_comm] using h u + +theorem energy_le_rhs_pairing_of_isEllipticFieldOn + {lam Lam : ℝ} (h : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) : + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume ≤ + ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + have hsqInt : + MeasureTheory.IntegrableOn (fun x => vecNormSq (u.toH1Function.grad x)) U := + integrableOn_vecNormSq_meanZeroGrad u + have hlhsInt : + MeasureTheory.IntegrableOn (fun x => lam * vecNormSq (u.toH1Function.grad x)) U := + hsqInt.const_mul lam + have henergyInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (u.toH1Function.grad x) + (matVecMul (a x) (u.toH1Function.grad x))) U := + integrableOn_dirichletEnergyDensity_of_isEllipticFieldOn_meanZero hEll u + have hmem : + ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + exact + (MeasureTheory.ae_restrict_iff' (measurableSet_of_isEllipticFieldOn hEll)).2 + (Filter.Eventually.of_forall fun x hx => hx) + have hpoint : + ∀ᵐ x ∂ volumeMeasureOn U, + lam * vecNormSq (u.toH1Function.grad x) ≤ + vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) := by + filter_upwards [hmem] with x hx + exact (hEll.2 x hx).2.2.1 (u.toH1Function.grad x) + calc + lam * ∫ x in U, vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, lam * vecNormSq (u.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ ≤ + ∫ x in U, + vecDot (u.toH1Function.grad x) (matVecMul (a x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume := + MeasureTheory.integral_mono_ae hlhsInt henergyInt hpoint + _ = ∫ x in U, vecDot (g x) (u.toH1Function.grad x) ∂MeasureTheory.volume := + energy_identity h + +/-- The residual flux of a mean-zero Neumann RHS weak solution is solenoidal +with zero normal trace. This is the Neumann counterpart of the Dirichlet RHS +residual bridge, using the mean-zero normalization of an arbitrary `H¹` test +function. -/ +theorem residual_zeroNormalTrace + {lam Lam : ℝ} (h : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) (hg : MemVectorL2 U g) : + IsSolenoidalZeroNormalTraceOn U + (fun x => matVecMul (a x) (u.toH1Function.grad x) - g x) := by + intro φ + have hflux_mem : + MemVectorL2 U (fun x => matVecMul (a x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2 + have hflux_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hflux_mem φ.grad_memVectorL2 + have hg_int : + MeasureTheory.IntegrableOn + (fun x => vecDot (g x) (φ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hg φ.grad_memVectorL2 + have hfun : + (fun x => vecDot (matVecMul (a x) (u.toH1Function.grad x) - g x) (φ.grad x)) = + fun x => + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.grad x) - + vecDot (g x) (φ.grad x) := by + funext x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hweak : + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (φ.grad x) ∂MeasureTheory.volume := by + simpa using h φ.toMeanZero + rw [hfun, MeasureTheory.integral_sub hflux_int hg_int, hweak] + ring + +theorem sub_zero + {v : H1MeanZeroFunction U} + {lam Lam : ℝ} + (hu : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hv : IsMeanZeroNeumannRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + IsMeanZeroNeumannRhsWeakSolution a U (u - v) (0 : Vec d → Vec d) := by + intro φ + have huFlux : MemVectorL2 U (fun x => matVecMul (a x) (u.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll u.toH1Function.grad_memVectorL2 + have hvFlux : MemVectorL2 U (fun x => matVecMul (a x) (v.toH1Function.grad x)) := + memVectorL2_matVecMul_of_isEllipticFieldOn hEll v.toH1Function.grad_memVectorL2 + have huInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (u.toH1Function.grad x)) + (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 huFlux φ.toH1Function.grad_memVectorL2 + have hvInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (matVecMul (a x) (v.toH1Function.grad x)) + (φ.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hvFlux φ.toH1Function.grad_memVectorL2 + have hfun : + (fun x => + vecDot (matVecMul (a x) ((u - v).toH1Function.grad x)) (φ.toH1Function.grad x)) = + (fun x => + vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x)) := by + funext x + have hgradSubX : + ((u - v).toH1Function.grad x) = u.toH1Function.grad x - v.toH1Function.grad x := by + simp + rw [hgradSubX] + simp [sub_eq_add_neg, matVecMul_add, matVecMul_neg, vecDot_add_left, vecDot_neg_left] + calc + ∫ x in U, + vecDot (matVecMul (a x) ((u - v).toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = + ∫ x in U, + (vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) - + vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x)) + ∂MeasureTheory.volume := by + rw [hfun] + _ = + ∫ x in U, vecDot (matVecMul (a x) (u.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume - + ∫ x in U, vecDot (matVecMul (a x) (v.toH1Function.grad x)) (φ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub huInt hvInt] + _ = + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume - + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [hu φ, hv φ] + _ = ∫ x in U, vecDot (0 : Vec d) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + symm + simp [vecDot] + +theorem gradToVectorL2_eq_of_isEllipticFieldOn + {v : H1MeanZeroFunction U} {lam Lam : ℝ} + (hne : Set.Nonempty U) + (hu : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hv : IsMeanZeroNeumannRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.gradToVectorL2 = v.gradToVectorL2 := by + let w : H1MeanZeroFunction U := u - v + have hw : IsMeanZeroNeumannRhsWeakSolution a U w (0 : Vec d → Vec d) := + sub_zero hu hv hEll + have henergy : + lam * ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume ≤ 0 := by + calc + lam * ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume + ≤ ∫ y in U, vecDot (0 : Vec d) (w.toH1Function.grad y) ∂MeasureTheory.volume := + energy_le_rhs_pairing_of_isEllipticFieldOn + (u := w) (g := (0 : Vec d → Vec d)) hw hEll + _ = 0 := by + simp [vecDot] + have hsqInt : + MeasureTheory.IntegrableOn (fun y => vecNormSq (w.toH1Function.grad y)) U := + integrableOn_vecNormSq_meanZeroGrad w + have hsqNonneg : + 0 ≤ ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume := + MeasureTheory.integral_nonneg fun _ => vecNormSq_nonneg _ + rcases hne with ⟨x, hx⟩ + have hlam : 0 < lam := (hEll.2 x hx).1 + have hsqLeZero : + ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume ≤ 0 := by + nlinarith + have hsqZero : + ∫ y in U, vecNormSq (w.toH1Function.grad y) ∂MeasureTheory.volume = 0 := + le_antisymm hsqLeZero hsqNonneg + have hsqAe : + (fun y => vecNormSq (w.toH1Function.grad y)) =ᵐ[volumeMeasureOn U] 0 := by + exact + (MeasureTheory.integral_eq_zero_iff_of_nonneg_ae + (Filter.Eventually.of_forall fun _ => vecNormSq_nonneg _) + hsqInt.integrable).1 hsqZero + have hgradAe : + (fun y => w.toH1Function.grad y) =ᵐ[volumeMeasureOn U] 0 := by + filter_upwards [hsqAe] with y hy + exact vecNormSq_eq_zero hy + have hgradZero : w.gradToVectorL2 = 0 := by + apply MeasureTheory.Lp.ext + let hzeroAe := + MeasureTheory.Lp.coeFn_zero (E := Vec d) (p := (2 : ENNReal)) (μ := volumeMeasureOn U) + filter_upwards + [H1Function.coeFn_gradToVectorL2 w.toH1Function, hzeroAe, hgradAe] + with y hwGrad hzero hy + have hwGrad' : w.gradToVectorL2 y = w.toH1Function.grad y := by + simpa [H1MeanZeroFunction.gradToVectorL2] using hwGrad + calc + w.gradToVectorL2 y = w.toH1Function.grad y := hwGrad' + _ = 0 := hy + _ = (0 : VectorL2 U) y := by + symm + simpa using hzero + have hsub : + u.gradToVectorL2 - v.gradToVectorL2 = 0 := by + have hneg : (-v).gradToVectorL2 = -v.gradToVectorL2 := by + simpa using H1MeanZeroFunction.gradToVectorL2_smul (-1 : ℝ) v + have hgradSub : + (u - v).gradToVectorL2 = u.gradToVectorL2 - v.gradToVectorL2 := by + calc + (u - v).gradToVectorL2 = u.gradToVectorL2 + (-v).gradToVectorL2 := by + simpa [sub_eq_add_neg] using H1MeanZeroFunction.gradToVectorL2_add u (-v) + _ = u.gradToVectorL2 - v.gradToVectorL2 := by + rw [hneg, sub_eq_add_neg] + calc + u.gradToVectorL2 - v.gradToVectorL2 = (u - v).gradToVectorL2 := by + symm + exact hgradSub + _ = 0 := hgradZero + exact sub_eq_zero.mp hsub + +theorem toScalarL2_eq_of_h1CoerciveEstimate + {v : H1MeanZeroFunction U} {lam Lam : ℝ} + (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) + (hu : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hv : IsMeanZeroNeumannRhsWeakSolution a U v g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toScalarL2 = v.toScalarL2 := by + let w : H1MeanZeroFunction U := u - v + have hgradEq : u.gradToVectorL2 = v.gradToVectorL2 := + gradToVectorL2_eq_of_isEllipticFieldOn hne hu hv hEll + have hgradZero : w.gradToVectorL2 = 0 := by + have hneg : (-v).gradToVectorL2 = -v.gradToVectorL2 := by + simpa using H1MeanZeroFunction.gradToVectorL2_smul (-1 : ℝ) v + have hgradSub : + (u - v).gradToVectorL2 = u.gradToVectorL2 - v.gradToVectorL2 := by + calc + (u - v).gradToVectorL2 = u.gradToVectorL2 + (-v).gradToVectorL2 := by + simpa [sub_eq_add_neg] using H1MeanZeroFunction.gradToVectorL2_add u (-v) + _ = u.gradToVectorL2 - v.gradToVectorL2 := by + rw [hneg, sub_eq_add_neg] + calc + w.gradToVectorL2 = u.gradToVectorL2 - v.gradToVectorL2 := by + simpa [w] using hgradSub + _ = 0 := sub_eq_zero.mpr hgradEq + have hbound := hC.bound w + have hvalZeroNorm : + ‖w.toScalarL2‖ = 0 := by + have hgradNorm : w.gradientL2Norm = 0 := by + simp [H1MeanZeroFunction.gradientL2Norm, hgradZero] + have hnonneg : 0 ≤ ‖w.toScalarL2‖ := norm_nonneg _ + have hle : ‖w.toScalarL2‖ ≤ 0 := by + simpa [H1MeanZeroFunction.valueL2Norm, hgradNorm] using hbound + exact le_antisymm hle hnonneg + have hvalZero : w.toScalarL2 = 0 := norm_eq_zero.mp hvalZeroNorm + have hsub : + u.toScalarL2 - v.toScalarL2 = 0 := by + have hneg : (-v).toScalarL2 = -v.toScalarL2 := by + simpa using H1MeanZeroFunction.toScalarL2_smul (-1 : ℝ) v + have hvalueSub : + (u - v).toScalarL2 = u.toScalarL2 - v.toScalarL2 := by + calc + (u - v).toScalarL2 = u.toScalarL2 + (-v).toScalarL2 := by + simpa [sub_eq_add_neg] using H1MeanZeroFunction.toScalarL2_add u (-v) + _ = u.toScalarL2 - v.toScalarL2 := by + rw [hneg, sub_eq_add_neg] + calc + u.toScalarL2 - v.toScalarL2 = (u - v).toScalarL2 := by + symm + exact hvalueSub + _ = 0 := hvalZero + exact sub_eq_zero.mp hsub + +end IsMeanZeroNeumannRhsWeakSolution + +theorem isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + IsMeanZeroNeumannRhsWeakSolution a U + (H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll) + g := by + intro φ + simpa using + H1MeanZeroFunction.coeffGradientProblemSolution_firstVariation_eq_integral + (U := U) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll φ + +theorem gradToVectorL2_eq_coeffGradientProblemSolution_of_h1CoerciveEstimate + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : H1MeanZeroFunction U} {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hC : H1CoerciveEstimate U) (hne : Set.Nonempty U) + (hu : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.gradToVectorL2 = + (H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hg + hC hne hEll).gradToVectorL2 := by + let v : H1MeanZeroFunction U := + H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) (f := g) hg + hC hne hEll + have hv : IsMeanZeroNeumannRhsWeakSolution a U v g := + isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + (U := U) (a := a) (lam := lam) (Lam := Lam) hg + hC hne hEll + simpa [v] using + IsMeanZeroNeumannRhsWeakSolution.gradToVectorL2_eq_of_isEllipticFieldOn + (U := U) (a := a) (u := u) (v := v) (g := g) hne hu hv hEll + +theorem toScalarL2_eq_coeffGradientProblemSolution_of_h1CoerciveEstimate + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : H1MeanZeroFunction U} {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hC : H1CoerciveEstimate U) (hne : Set.Nonempty U) + (hu : IsMeanZeroNeumannRhsWeakSolution a U u g) + (hEll : IsEllipticFieldOn lam Lam U a) : + u.toScalarL2 = + (H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hg + hC hne hEll).toScalarL2 := by + let v : H1MeanZeroFunction U := + H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) (f := g) hg + hC hne hEll + have hv : IsMeanZeroNeumannRhsWeakSolution a U v g := + isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + (U := U) (a := a) (lam := lam) (Lam := Lam) hg + hC hne hEll + simpa [v] using + IsMeanZeroNeumannRhsWeakSolution.toScalarL2_eq_of_h1CoerciveEstimate + (U := U) (a := a) (u := u) (v := v) (g := g) hC hne hu hv hEll + +theorem exists_isMeanZeroNeumannRhsWeakSolution_of_h1CoerciveEstimate + {d : ℕ} {a : CoeffField d} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} {lam Lam : ℝ} + (hg : MemVectorL2 U g) (hC : H1CoerciveEstimate U) + (hne : Set.Nonempty U) (hEll : IsEllipticFieldOn lam Lam U a) : + ∃ u : H1MeanZeroFunction U, IsMeanZeroNeumannRhsWeakSolution a U u g := by + refine ⟨H1MeanZeroFunction.coeffGradientProblemSolution + (U := U) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll, ?_⟩ + exact isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + (U := U) (a := a) (lam := lam) (Lam := Lam) hg hC hne hEll + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability.lean b/LeanPool/CoarseGraining/Homogenization/Probability.lean new file mode 100644 index 0000000000..e28967e172 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import LeanPool.CoarseGraining.Homogenization.Probability.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import LeanPool.CoarseGraining.Homogenization.Probability.SeparableHilbertMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.Source + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein.lean b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein.lean new file mode 100644 index 0000000000..c3aaeee46f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein.lean @@ -0,0 +1,33 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +/- +Copyright (c) 2026. All rights reserved. +-/ +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.TwoPoint +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.ProdDecomp +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Fin + +/-! +# Efron–Stein inequality on finite products + +Facade module gathering the bounded-observable Efron–Stein inequality on a finite +product probability space. The public entry point is + +* `Homogenization.efronStein_pi`: for a bounded measurable `F` on `∀ i, Ω i` + with independent coordinates `μ i`, + `Var[F; Measure.pi μ] ≤ ½ ∑ i, ∫ x ∫ y (F (update x i y) − F x)² dμᵢ dπ`. + +Supporting public lemmas: + +* `Homogenization.variance_eq_half_integral_sub_sq` — two-point variance identity; +* `Homogenization.variance_prod_eq` — two-factor (law-of-total-variance) split; +* `Homogenization.efronStein_fin` — the `Fin n` version proved by induction. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Fin.lean b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Fin.lean new file mode 100644 index 0000000000..3e562d26ee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Fin.lean @@ -0,0 +1,356 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +/- +Copyright (c) 2026. All rights reserved. +-/ +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.ProdDecomp +public import Mathlib.MeasureTheory.Constructions.Pi + +/-! +# Efron–Stein on finite products indexed by `Fin n` + +Elementary induction on the number of coordinates, splitting off coordinate `0` +via `MeasurableEquiv.piFinSuccAbove`. +-/ + +@[expose] public section + +open MeasureTheory Filter Fin Function ProbabilityTheory +open scoped ProbabilityTheory ENNReal BigOperators + +namespace Homogenization + +variable {n : ℕ} {α : Fin (n + 1) → Type*} [∀ i, MeasurableSpace (α i)] + +/-- Updating coordinate `0` of `e.symm p` to `y` re-inserts `y` in the first slot. -/ +theorem update_symm_zero (p : α 0 × (∀ j, α ((0 : Fin (n + 1)).succAbove j))) (y : α 0) : + Function.update ((MeasurableEquiv.piFinSuccAbove α 0).symm p) 0 y + = (MeasurableEquiv.piFinSuccAbove α 0).symm (y, p.2) := by + set e := MeasurableEquiv.piFinSuccAbove α 0 with he + apply e.injective + rw [e.apply_symm_apply] + have happ : ∀ z : ∀ i, α i, e z = (z 0, fun j => z ((0 : Fin (n + 1)).succAbove j)) := by + intro z; rfl + rw [happ] + have hp : e ((MeasurableEquiv.piFinSuccAbove α 0).symm p) = p := e.apply_symm_apply p + rw [happ] at hp + rw [Prod.mk.injEq] + refine ⟨Function.update_self 0 y (e.symm p), ?_⟩ + funext j + have hne : (0 : Fin (n + 1)).succAbove j ≠ 0 := Fin.succAbove_ne 0 j + rw [Function.update_of_ne hne] + exact congrFun (congrArg Prod.snd hp) j + +/-- Updating coordinate `succAbove 0 j` of `e.symm p` corresponds to updating tail slot `j`. -/ +theorem update_symm_succ (p : α 0 × (∀ j, α ((0 : Fin (n + 1)).succAbove j))) (j : Fin n) + (y : α ((0 : Fin (n + 1)).succAbove j)) : + Function.update ((MeasurableEquiv.piFinSuccAbove α 0).symm p) ((0 : Fin (n + 1)).succAbove j) y + = (MeasurableEquiv.piFinSuccAbove α 0).symm (p.1, Function.update p.2 j y) := by + classical + set e := MeasurableEquiv.piFinSuccAbove α 0 with he + apply e.injective + rw [e.apply_symm_apply] + have happ : ∀ z : ∀ i, α i, e z = (z 0, fun k => z ((0 : Fin (n + 1)).succAbove k)) := by + intro z; rfl + rw [happ] + have hp : e ((MeasurableEquiv.piFinSuccAbove α 0).symm p) = p := e.apply_symm_apply p + rw [happ] at hp + rw [Prod.mk.injEq] + refine ⟨?_, ?_⟩ + · rw [Function.update_of_ne (Fin.succAbove_ne 0 j).symm] + exact congrArg Prod.fst hp + · funext k + by_cases hkj : k = j + · subst hkj + rw [Function.update_self, Function.update_self] + · have hne : (0 : Fin (n + 1)).succAbove k ≠ (0 : Fin (n + 1)).succAbove j := by + simpa [Fin.succAbove_right_inj] using hkj + rw [Function.update_of_ne hne, Function.update_of_ne hkj] + exact congrFun (congrArg Prod.snd hp) k + +/-- The coordinate-`0` conditional-variance integral equals half the coordinate-`0` +resampling energy. -/ +theorem term_zero_eq (μ : ∀ i, Measure (α i)) [∀ i, IsProbabilityMeasure (μ i)] + {F : (∀ i, α i) → ℝ} (hF : Measurable F) {M : ℝ} (hM : ∀ x, |F x| ≤ M) : + (∫ t, Var[fun a => F ((MeasurableEquiv.piFinSuccAbove α 0).symm (a, t)); μ 0] + ∂(Measure.pi fun j => μ ((0 : Fin (n + 1)).succAbove j))) + = (1 / 2) * ∫ x, ∫ y, (F (Function.update x 0 y) - F x) ^ 2 ∂(μ 0) ∂(Measure.pi μ) := by + set e := MeasurableEquiv.piFinSuccAbove α 0 with he + set ν : ∀ j, Measure (α ((0 : Fin (n + 1)).succAbove j)) := + fun j => μ ((0 : Fin (n + 1)).succAbove j) with hν + have mp : MeasurePreserving e (Measure.pi μ) ((μ 0).prod (Measure.pi ν)) := + measurePreserving_piFinSuccAbove μ 0 + set φ0 : (∀ i, α i) → ℝ := fun x => ∫ y, (F (Function.update x 0 y) - F x) ^ 2 ∂(μ 0) with hφ0 + -- LHS as a triple integral via the two-point identity + have hLHS : (∫ t, Var[fun a => F (e.symm (a, t)); μ 0] ∂(Measure.pi ν)) + = (1 / 2) * ∫ t, (∫ a, ∫ b, (F (e.symm (a, t)) - F (e.symm (b, t))) ^ 2 + ∂(μ 0) ∂(μ 0)) ∂(Measure.pi ν) := by + rw [← integral_const_mul] + refine integral_congr_ae (Eventually.of_forall fun t => ?_) + exact variance_eq_half_integral_sub_sq (μ 0) + (hF.comp (e.symm.measurable.comp (measurable_id.prodMk measurable_const))) + (fun a => hM _) + -- transport target₀ to the product measure + have htrans : ∫ x, φ0 x ∂(Measure.pi μ) + = ∫ p, φ0 (e.symm p) ∂((μ 0).prod (Measure.pi ν)) := + (mp.symm.integral_comp' φ0).symm + have hφe : ∀ p, φ0 (e.symm p) + = ∫ y, (F (e.symm (y, p.2)) - F (e.symm p)) ^ 2 ∂(μ 0) := by + intro p + have hup : ∀ y, Function.update (e.symm p) 0 y = e.symm (y, p.2) := fun y => by + rw [he]; exact update_symm_zero p y + simp only [hφ0] + refine integral_congr_ae (Eventually.of_forall fun y => ?_) + simp only [hup y] + -- integrability of the transported integrand for Fubini + have hK : Measurable fun q : α 0 × (α 0 × (∀ j, α ((0 : Fin (n + 1)).succAbove j))) => + (F (e.symm (q.1, q.2.2)) - F (e.symm q.2)) ^ 2 := + ((hF.comp (e.symm.measurable.comp (measurable_fst.prodMk (measurable_snd.comp measurable_snd)))).sub + (hF.comp (e.symm.measurable.comp measurable_snd))).pow_const 2 + have hdb : ∀ (p : α 0 × (∀ j, α ((0 : Fin (n + 1)).succAbove j))) (y : α 0), + |F (e.symm (y, p.2)) - F (e.symm p)| ≤ 2 * M := by + intro p y + have h := abs_add_le (F (e.symm (y, p.2))) (-(F (e.symm p))) + rw [← sub_eq_add_neg, abs_neg] at h + have := h.trans (add_le_add (hM _) (hM _)); linarith + have hInt : Integrable (fun p => ∫ y, (F (e.symm (y, p.2)) - F (e.symm p)) ^ 2 ∂(μ 0)) + ((μ 0).prod (Measure.pi ν)) := by + have hsm : StronglyMeasurable + (fun p => ∫ y, (F (e.symm (y, p.2)) - F (e.symm p)) ^ 2 ∂(μ 0)) := + hK.stronglyMeasurable.integral_prod_left' + refine (memLp_top_of_bound hsm.aestronglyMeasurable ((2 * M) ^ 2) + (Eventually.of_forall fun p => ?_)).integrable le_top + rw [Real.norm_eq_abs, abs_of_nonneg (integral_nonneg fun y => sq_nonneg _)] + calc ∫ y, (F (e.symm (y, p.2)) - F (e.symm p)) ^ 2 ∂(μ 0) + ≤ ∫ _y, (2 * M) ^ 2 ∂(μ 0) := by + refine integral_mono ?_ (integrable_const _) (fun y => ?_) + · exact integrable_sq_of_bound (μ 0) (M := 2 * M) + ((hF.comp (e.symm.measurable.comp (measurable_id.prodMk measurable_const))).sub + measurable_const) (fun y => hdb p y) + · nlinarith [sq_abs (F (e.symm (y, p.2)) - F (e.symm p)), hdb p y, + abs_nonneg (F (e.symm (y, p.2)) - F (e.symm p))] + _ = (2 * M) ^ 2 := by simp + -- assemble + rw [hLHS] + have hgoal : (1 / 2) * ∫ x, ∫ y, (F (Function.update x 0 y) - F x) ^ 2 ∂(μ 0) ∂(Measure.pi μ) + = (1 / 2) * ∫ t, (∫ a, ∫ b, (F (e.symm (a, t)) - F (e.symm (b, t))) ^ 2 + ∂(μ 0) ∂(μ 0)) ∂(Measure.pi ν) := by + congr 1 + show ∫ x, φ0 x ∂(Measure.pi μ) = _ + rw [htrans] + simp_rw [hφe] + rw [integral_prod_symm _ hInt] + refine integral_congr_ae (Eventually.of_forall fun t => ?_) + refine integral_congr_ae (Eventually.of_forall fun a => ?_) + refine integral_congr_ae (Eventually.of_forall fun b => ?_) + ring + rw [hgoal] + +/-- The tail (coordinate `succAbove 0 j`) contribution: the resampling energy of the +conditional mean `g'` is bounded by the full resampling energy of `F`. -/ +theorem term_succ_le (μ : ∀ i, Measure (α i)) [∀ i, IsProbabilityMeasure (μ i)] + {F : (∀ i, α i) → ℝ} (hF : Measurable F) {M : ℝ} (hM : ∀ x, |F x| ≤ M) (j : Fin n) : + (∫ t, ∫ w, ((∫ a, F ((MeasurableEquiv.piFinSuccAbove α 0).symm (a, Function.update t j w)) ∂(μ 0)) + - ∫ a, F ((MeasurableEquiv.piFinSuccAbove α 0).symm (a, t)) ∂(μ 0)) ^ 2 + ∂(μ ((0 : Fin (n + 1)).succAbove j)) + ∂(Measure.pi fun k => μ ((0 : Fin (n + 1)).succAbove k))) + ≤ ∫ x, ∫ y, (F (Function.update x ((0 : Fin (n + 1)).succAbove j) y) - F x) ^ 2 + ∂(μ ((0 : Fin (n + 1)).succAbove j)) ∂(Measure.pi μ) := by + classical + set e := MeasurableEquiv.piFinSuccAbove α 0 with he + set ν : ∀ k, Measure (α ((0 : Fin (n + 1)).succAbove k)) := + fun k => μ ((0 : Fin (n + 1)).succAbove k) with hν + have mp : MeasurePreserving e (Measure.pi μ) ((μ 0).prod (Measure.pi ν)) := + measurePreserving_piFinSuccAbove μ 0 + have hGe : Measurable fun p => F (e.symm p) := hF.comp e.symm.measurable + have hdiff : ∀ u v, |F (e.symm u) - F (e.symm v)| ≤ 2 * M := by + intro u v + have h := abs_add_le (F (e.symm u)) (-(F (e.symm v))) + rw [← sub_eq_add_neg, abs_neg] at h + have := h.trans (add_le_add (hM _) (hM _)); linarith + have hDsq : ∀ u v, (F (e.symm u) - F (e.symm v)) ^ 2 ≤ (2 * M) ^ 2 := by + intro u v + nlinarith [hdiff u v, abs_nonneg (F (e.symm u) - F (e.symm v)), sq_abs (F (e.symm u) - F (e.symm v))] + -- Jensen at fixed `(t, w)` + have step1 : ∀ (t : ∀ k, α ((0 : Fin (n + 1)).succAbove k)) w, + ((∫ a, F (e.symm (a, Function.update t j w)) ∂(μ 0)) - ∫ a, F (e.symm (a, t)) ∂(μ 0)) ^ 2 + ≤ ∫ a, (F (e.symm (a, Function.update t j w)) - F (e.symm (a, t))) ^ 2 ∂(μ 0) := by + intro t w + have hfm : Measurable fun a => F (e.symm (a, Function.update t j w)) := by fun_prop + have hgm : Measurable fun a => F (e.symm (a, t)) := by fun_prop + rw [← integral_sub (integrable_of_bound (μ 0) hfm (fun a => hM _)) + (integrable_of_bound (μ 0) hgm (fun a => hM _))] + exact sq_integral_le_integral_sq (μ 0) (hfm.sub hgm) + (fun a => hdiff (a, Function.update t j w) (a, t)) + -- the main product-measure integrand and its integrability + have hKmeas : Measurable fun q : α ((0 : Fin (n + 1)).succAbove j) + × (α 0 × (∀ k, α ((0 : Fin (n + 1)).succAbove k))) => + (F (e.symm (q.2.1, Function.update q.2.2 j q.1)) - F (e.symm (q.2.1, q.2.2))) ^ 2 := by + fun_prop + have hIntTail : Integrable + (fun p : α 0 × (∀ k, α ((0 : Fin (n + 1)).succAbove k)) => + ∫ w, (F (e.symm (p.1, Function.update p.2 j w)) - F (e.symm (p.1, p.2))) ^ 2 ∂(ν j)) + ((μ 0).prod (Measure.pi ν)) := by + have hsm : StronglyMeasurable + (fun p : α 0 × (∀ k, α ((0 : Fin (n + 1)).succAbove k)) => + ∫ w, (F (e.symm (p.1, Function.update p.2 j w)) - F (e.symm (p.1, p.2))) ^ 2 ∂(ν j)) := + hKmeas.stronglyMeasurable.integral_prod_left' + refine (memLp_top_of_bound hsm.aestronglyMeasurable ((2 * M) ^ 2) + (Eventually.of_forall fun p => ?_)).integrable le_top + rw [Real.norm_eq_abs, abs_of_nonneg (integral_nonneg fun w => sq_nonneg _)] + calc ∫ w, (F (e.symm (p.1, Function.update p.2 j w)) - F (e.symm (p.1, p.2))) ^ 2 ∂(ν j) + ≤ ∫ _w, (2 * M) ^ 2 ∂(ν j) := + integral_mono + (integrable_sq_of_bound (ν j) (M := 2 * M) (by fun_prop) + (fun w => hdiff (p.1, Function.update p.2 j w) (p.1, p.2))) + (integrable_const _) (fun w => hDsq _ _) + _ = (2 * M) ^ 2 := by + have hprob : IsProbabilityMeasure (ν j) := by rw [hν]; infer_instance + rw [MeasureTheory.integral_const, MeasureTheory.probReal_univ, one_smul] + -- per-`t` swap integrability + have hSwapInt : ∀ t : ∀ k, α ((0 : Fin (n + 1)).succAbove k), + Integrable (Function.uncurry fun (a : α 0) (w : α ((0 : Fin (n + 1)).succAbove j)) => + (F (e.symm (a, Function.update t j w)) - F (e.symm (a, t))) ^ 2) ((μ 0).prod (ν j)) := by + intro t + refine integrable_of_bound ((μ 0).prod (ν j)) (M := (2 * M) ^ 2) (by fun_prop) (fun q => ?_) + rw [Function.uncurry_apply_pair, abs_of_nonneg (sq_nonneg _)] + exact hDsq _ _ + -- transport the target coordinate onto the product measure + set ψ : (∀ i, α i) → ℝ := + fun x => ∫ y, (F (Function.update x ((0 : Fin (n + 1)).succAbove j) y) - F x) ^ 2 ∂(ν j) with hψ + have htrans : ∫ x, ψ x ∂(Measure.pi μ) = ∫ p, ψ (e.symm p) ∂((μ 0).prod (Measure.pi ν)) := + (mp.symm.integral_comp' ψ).symm + have hψe : ∀ p, ψ (e.symm p) + = ∫ w, (F (e.symm (p.1, Function.update p.2 j w)) - F (e.symm (p.1, p.2))) ^ 2 ∂(ν j) := by + intro p + have hup : ∀ w, Function.update (e.symm p) ((0 : Fin (n + 1)).succAbove j) w + = e.symm (p.1, Function.update p.2 j w) := fun w => by rw [he]; exact update_symm_succ p j w + simp only [hψ] + refine integral_congr_ae (Eventually.of_forall fun w => ?_) + simp only [hup w] + have htgt : (∫ x, ∫ y, (F (Function.update x ((0 : Fin (n + 1)).succAbove j) y) - F x) ^ 2 + ∂(ν j) ∂(Measure.pi μ)) + = ∫ t, ∫ a, ∫ w, (F (e.symm (a, Function.update t j w)) - F (e.symm (a, t))) ^ 2 + ∂(ν j) ∂(μ 0) ∂(Measure.pi ν) := by + show ∫ x, ψ x ∂(Measure.pi μ) = _ + rw [htrans] + simp_rw [hψe] + rw [integral_prod_symm _ hIntTail] + -- assemble + rw [htgt] + refine integral_mono_of_nonneg (Eventually.of_forall fun t => integral_nonneg fun w => sq_nonneg _) + hIntTail.integral_prod_right (Eventually.of_forall fun t => ?_) + dsimp only + rw [integral_integral_swap (hSwapInt t)] + refine integral_mono_of_nonneg (Eventually.of_forall fun w => sq_nonneg _) + (hSwapInt t).integral_prod_right (Eventually.of_forall fun w => step1 t w) + +/-- **Efron–Stein inequality** for bounded measurable observables on a finite +product `Fin m` (proved by induction on `m`). -/ +theorem efronStein_fin : ∀ (m : ℕ) {β : Fin m → Type*} [∀ i, MeasurableSpace (β i)] + (μ : ∀ i, Measure (β i)) [∀ i, IsProbabilityMeasure (μ i)] + {F : (∀ i, β i) → ℝ} (_hF : Measurable F) {M : ℝ} (_hM : ∀ x, |F x| ≤ M), + Var[F; Measure.pi μ] + ≤ (1 / 2) * ∑ i, ∫ x, ∫ y, (F (Function.update x i y) - F x) ^ 2 ∂(μ i) + ∂(Measure.pi μ) := by + intro m + induction m with + | zero => + intro β _ μ _ F hF M hM + simp only [Finset.univ_eq_empty, Finset.sum_empty, mul_zero] + have hsub : ∀ x y : (∀ i : Fin 0, β i), x = y := fun x y => funext fun i => i.elim0 + have hmean : ∫ z, F z ∂(Measure.pi μ) = F default := by + rw [show (fun z => F z) = (fun _ => F default) from funext fun z => by rw [hsub z default]] + simp + have hzero : Var[F; Measure.pi μ] = 0 := by + rw [variance_eq_integral hF.aemeasurable, hmean] + have hz : ∀ x, (F x - F default) ^ 2 = 0 := fun x => by rw [hsub x default]; ring + simp_rw [hz]; simp + rw [hzero] + | succ n ih => + intro β _ μ _ F hF M hM + have mp : MeasurePreserving (MeasurableEquiv.piFinSuccAbove β 0) (Measure.pi μ) + ((μ 0).prod (Measure.pi fun j => μ ((0 : Fin (n + 1)).succAbove j))) := + measurePreserving_piFinSuccAbove μ 0 + have hMG : ∀ t, |∫ a, F ((MeasurableEquiv.piFinSuccAbove β 0).symm (a, t)) ∂(μ 0)| ≤ M := by + intro t + calc |∫ a, F ((MeasurableEquiv.piFinSuccAbove β 0).symm (a, t)) ∂(μ 0)| + ≤ ∫ a, |F ((MeasurableEquiv.piFinSuccAbove β 0).symm (a, t))| ∂(μ 0) := + abs_integral_le_integral_abs + _ ≤ ∫ _a, M ∂(μ 0) := + integral_mono (integrable_of_bound (μ 0) (by fun_prop) (fun a => hM _)).abs + (integrable_const M) (fun a => hM _) + _ = M := by simp + have hG : Measurable fun t => ∫ a, F ((MeasurableEquiv.piFinSuccAbove β 0).symm (a, t)) ∂(μ 0) := + (hF.comp (MeasurableEquiv.piFinSuccAbove β 0).symm.measurable).stronglyMeasurable.integral_prod_left'.measurable + have hFsymm : Measurable fun p => F ((MeasurableEquiv.piFinSuccAbove β 0).symm p) := + hF.comp (MeasurableEquiv.piFinSuccAbove β 0).symm.measurable + have hvar : Var[F; Measure.pi μ] + = Var[fun p => F ((MeasurableEquiv.piFinSuccAbove β 0).symm p); + (μ 0).prod (Measure.pi fun j => μ ((0 : Fin (n + 1)).succAbove j))] := by + rw [← mp.variance_fun_comp (f := fun p => F ((MeasurableEquiv.piFinSuccAbove β 0).symm p)) + hFsymm.aemeasurable] + congr 1 + funext ω + simp only [MeasurableEquiv.symm_apply_apply] + rw [hvar, variance_prod_eq (μ 0) (Measure.pi fun j => μ ((0 : Fin (n + 1)).succAbove j)) + hFsymm (fun p => hM _)] + rw [term_zero_eq μ hF hM, + Fin.sum_univ_succ (f := fun i => ∫ x, ∫ y, (F (Function.update x i y) - F x) ^ 2 ∂(μ i) + ∂(Measure.pi μ)), mul_add] + have hB : Var[fun p => ∫ a, F ((MeasurableEquiv.piFinSuccAbove β 0).symm (a, p)) ∂(μ 0); + Measure.pi fun j => μ ((0 : Fin (n + 1)).succAbove j)] + ≤ (1 / 2) * ∑ j : Fin n, ∫ x, ∫ y, (F (Function.update x (Fin.succ j) y) - F x) ^ 2 + ∂(μ (Fin.succ j)) ∂(Measure.pi μ) := by + refine le_trans (ih (fun j => μ ((0 : Fin (n + 1)).succAbove j)) hG hMG) ?_ + apply mul_le_mul_of_nonneg_left _ (by norm_num : (0 : ℝ) ≤ 1 / 2) + exact Finset.sum_le_sum (fun j _ => term_succ_le μ hF hM j) + linarith [hB] + +/-- **Efron–Stein inequality** for bounded measurable observables on an arbitrary +finite product probability space. -/ +theorem efronStein_pi {ι : Type*} [Fintype ι] [DecidableEq ι] {Ω : ι → Type*} + [∀ i, MeasurableSpace (Ω i)] (μ : ∀ i, Measure (Ω i)) [∀ i, IsProbabilityMeasure (μ i)] + {F : (∀ i, Ω i) → ℝ} (hF : Measurable F) {M : ℝ} (hM : ∀ x, |F x| ≤ M) : + Var[F; Measure.pi μ] + ≤ (1 / 2) * ∑ i, ∫ x, ∫ y, (F (Function.update x i y) - F x) ^ 2 ∂(μ i) + ∂(Measure.pi μ) := by + classical + set f : Fin (Fintype.card ι) ≃ ι := (Fintype.equivFin ι).symm with hf + set Φ := MeasurableEquiv.piCongrLeft Ω f with hΦ + have mp : MeasurePreserving Φ (Measure.pi fun k => μ (f k)) (Measure.pi μ) := + measurePreserving_piCongrLeft μ f + have hvar : Var[F; Measure.pi μ] = Var[fun z => F (Φ z); Measure.pi fun k => μ (f k)] := + (mp.variance_fun_comp hF.aemeasurable).symm + -- `Φ` intertwines coordinate updates + have hupd : ∀ (z : ∀ k, Ω (f k)) (k : Fin (Fintype.card ι)) (y : Ω (f k)), + Φ (Function.update z k y) = Function.update (Φ z) (f k) y := by + intro z k y + funext i + obtain ⟨a, rfl⟩ := f.surjective i + rw [hΦ, MeasurableEquiv.piCongrLeft_apply_apply] + by_cases hak : a = k + · subst hak; rw [Function.update_self, Function.update_self] + · rw [Function.update_of_ne hak, + Function.update_of_ne (fun h => hak (f.injective h)), + MeasurableEquiv.piCongrLeft_apply_apply] + -- apply the `Fin` version to the reindexed family + have hG : Measurable fun z => F (Φ z) := hF.comp Φ.measurable + have key := efronStein_fin (Fintype.card ι) (fun k => μ (f k)) hG (M := M) (fun z => hM _) + rw [hvar] + refine le_trans key ?_ + apply mul_le_mul_of_nonneg_left _ (by norm_num : (0 : ℝ) ≤ 1 / 2) + refine le_of_eq ?_ + rw [← Equiv.sum_comp f (fun i => ∫ x, ∫ y, (F (Function.update x i y) - F x) ^ 2 ∂(μ i) + ∂(Measure.pi μ))] + refine Finset.sum_congr rfl (fun k _ => ?_) + simp_rw [hupd] + exact mp.integral_comp' (fun x => ∫ y, (F (Function.update x (f k) y) - F x) ^ 2 ∂(μ (f k))) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/ProdDecomp.lean b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/ProdDecomp.lean new file mode 100644 index 0000000000..fc25bafbcd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/ProdDecomp.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +/- +Copyright (c) 2026. All rights reserved. +-/ +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.TwoPoint + +/-! +# Two-factor variance decomposition + +The "law of total variance" for a product of two probability measures, proved by +direct Fubini computation for *bounded* observables (no `condExp`). + +* `Homogenization.variance_prod_eq`: for a bounded measurable `F : α × β → ℝ` + and probability measures `P, Q`, + `Var[F; P ⊗ Q] = ∫ b, Var[F(·,b); P] dQ + Var[b ↦ ∫ F(·,b) dP; Q]`. +-/ + +@[expose] public section + +open MeasureTheory Filter ProbabilityTheory +open scoped ProbabilityTheory ENNReal + +namespace Homogenization + +variable {α β : Type*} [MeasurableSpace α] [MeasurableSpace β] + (P : Measure α) (Q : Measure β) [IsProbabilityMeasure P] [IsProbabilityMeasure Q] + +/-- **Two-factor variance decomposition** (law of total variance for a product of +two probability measures), bounded-observable form. Here the first coordinate is +"integrated out": `g b := ∫ a, F (a, b) ∂P` is the conditional mean. -/ +theorem variance_prod_eq {F : α × β → ℝ} (hF : Measurable F) {M : ℝ} + (hM : ∀ p, |F p| ≤ M) : + Var[F; P.prod Q] + = (∫ b, Var[fun a => F (a, b); P] ∂Q) + + Var[fun b => ∫ a, F (a, b) ∂P; Q] := by + classical + set g : β → ℝ := fun b => ∫ a, F (a, b) ∂P with hg_def + set m : ℝ := ∫ p, F p ∂(P.prod Q) with hm_def + -- basic measurability / integrability + have hFab : ∀ b, Measurable fun a => F (a, b) := fun b => + hF.comp (measurable_id.prodMk measurable_const) + have hFab_int : ∀ b, Integrable (fun a => F (a, b)) P := fun b => + integrable_of_bound P (hFab b) (fun a => hM _) + have hg : Measurable g := hF.stronglyMeasurable.integral_prod_left'.measurable + have hgb : ∀ b, g b = ∫ a, F (a, b) ∂P := fun b => by simp only [hg_def] + have hFint : Integrable F (P.prod Q) := integrable_of_bound _ hF hM + -- `g` is bounded by `M` + have hMg : ∀ b, |g b| ≤ M := by + intro b + rw [hgb b] + calc |∫ a, F (a, b) ∂P| ≤ ∫ a, |F (a, b)| ∂P := abs_integral_le_integral_abs + _ ≤ ∫ _a, M ∂P := integral_mono (hFab_int b).abs (integrable_const M) (fun a => hM _) + _ = M := by simp + -- `m = ∫ g` under `Q` + have hmg : m = ∫ b, g b ∂Q := by + rw [hm_def, integral_prod_symm F hFint] + -- pointwise bound on the centred difference + have hdmeas : ∀ b, Measurable fun a => F (a, b) - g b := fun b => + (hFab b).sub measurable_const + have hdbound : ∀ b a, |F (a, b) - g b| ≤ 2 * M := by + intro b a + have h := abs_add_le (F (a, b)) (-(g b)) + rw [← sub_eq_add_neg, abs_neg] at h + calc |F (a, b) - g b| ≤ |F (a, b)| + |g b| := h + _ ≤ M + M := add_le_add (hM _) (hMg b) + _ = 2 * M := by ring + -- key pointwise-in-`b` identity + have key : ∀ b, ∫ a, (F (a, b) - m) ^ 2 ∂P + = (∫ a, (F (a, b) - g b) ^ 2 ∂P) + (g b - m) ^ 2 := by + intro b + have hFdiff : Integrable (fun a => F (a, b) - g b) P := (hFab_int b).sub (integrable_const _) + have hAint : Integrable (fun a => (F (a, b) - g b) ^ 2) P := + integrable_sq_of_bound P (hdmeas b) (hdbound b) + have hBint : Integrable (fun a => (2 * (g b - m)) * (F (a, b) - g b)) P := hFdiff.const_mul _ + have hAB : Integrable + (fun a => (F (a, b) - g b) ^ 2 + (2 * (g b - m)) * (F (a, b) - g b)) P := hAint.add hBint + have hcenter : ∫ a, (F (a, b) - g b) ∂P = 0 := by + rw [integral_sub (hFab_int b) (integrable_const _), integral_const, ← hgb b]; simp + have hexp : ∀ a, (F (a, b) - m) ^ 2 + = (F (a, b) - g b) ^ 2 + (2 * (g b - m)) * (F (a, b) - g b) + (g b - m) ^ 2 := by + intro a; ring + calc + ∫ a, (F (a, b) - m) ^ 2 ∂P + = ∫ a, ((F (a, b) - g b) ^ 2 + (2 * (g b - m)) * (F (a, b) - g b) + + (g b - m) ^ 2) ∂P := by simp_rw [hexp] + _ = (∫ a, (F (a, b) - g b) ^ 2 ∂P) + + (2 * (g b - m)) * (∫ a, (F (a, b) - g b) ∂P) + (g b - m) ^ 2 := by + rw [integral_add hAB (integrable_const _), + integral_add hAint hBint, integral_const_mul, integral_const] + simp + _ = (∫ a, (F (a, b) - g b) ^ 2 ∂P) + (g b - m) ^ 2 := by rw [hcenter]; ring + -- variance rewrites + have hVb : ∀ b, Var[fun a => F (a, b); P] = ∫ a, (F (a, b) - g b) ^ 2 ∂P := by + intro b + rw [variance_eq_integral (hFab b).aemeasurable] + have hVg : Var[g; Q] = ∫ b, (g b - m) ^ 2 ∂Q := by + rw [variance_eq_integral hg.aemeasurable, ← hmg] + -- LHS via Fubini + have hFm_bound : ∀ p, |F p - m| ≤ M + |m| := by + intro p + have h := abs_add_le (F p) (-m) + rw [← sub_eq_add_neg, abs_neg] at h + exact h.trans (add_le_add (hM p) le_rfl) + have hFm_int : Integrable (fun p => (F p - m) ^ 2) (P.prod Q) := + integrable_sq_of_bound _ (hF.sub measurable_const) hFm_bound + have hLHS : Var[F; P.prod Q] = ∫ b, ∫ a, (F (a, b) - m) ^ 2 ∂P ∂Q := by + rw [variance_eq_integral hFint.aemeasurable, ← hm_def, + integral_prod_symm (fun p => (F p - m) ^ 2) hFm_int] + -- integrability of the two `Q`-integrands in the decomposition + have hI2 : Integrable (fun b => (g b - m) ^ 2) Q := + integrable_sq_of_bound Q (hg.sub measurable_const) + (fun b => by + have h := abs_add_le (g b) (-m) + rw [← sub_eq_add_neg, abs_neg] at h + exact h.trans (add_le_add (hMg b) le_rfl)) + have hInnerNonneg : ∀ b, 0 ≤ ∫ a, (F (a, b) - g b) ^ 2 ∂P := fun b => + integral_nonneg fun a => sq_nonneg _ + have hInnerBdd : ∀ b, |∫ a, (F (a, b) - g b) ^ 2 ∂P| ≤ (2 * M) ^ 2 := by + intro b + rw [abs_of_nonneg (hInnerNonneg b)] + calc ∫ a, (F (a, b) - g b) ^ 2 ∂P ≤ ∫ _a, (2 * M) ^ 2 ∂P := + integral_mono (integrable_sq_of_bound P (hdmeas b) (hdbound b)) (integrable_const _) + (fun a => by + have := hdbound b a + nlinarith [abs_nonneg (F (a, b) - g b), sq_abs (F (a, b) - g b)]) + _ = (2 * M) ^ 2 := by simp + have hI1_sm : StronglyMeasurable (fun b => ∫ a, (F (a, b) - g b) ^ 2 ∂P) := by + have hH : Measurable (fun p : α × β => (F p - g p.2) ^ 2) := + ((hF.sub (hg.comp measurable_snd)).pow_const 2) + exact hH.stronglyMeasurable.integral_prod_left' + have hI1 : Integrable (fun b => ∫ a, (F (a, b) - g b) ^ 2 ∂P) Q := + (memLp_top_of_bound hI1_sm.aestronglyMeasurable ((2 * M) ^ 2) + (Eventually.of_forall fun b => by + rw [Real.norm_eq_abs]; exact hInnerBdd b)).integrable le_top + -- assemble + rw [hLHS] + simp_rw [key] + rw [integral_add hI1 hI2, hVg] + simp_rw [hVb] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Transfer.lean b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Transfer.lean new file mode 100644 index 0000000000..a622db66fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/Transfer.lean @@ -0,0 +1,156 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.EfronStein.Fin +public import LeanPool.CoarseGraining.Homogenization.Book.Ch04.Theorems.RestrictionIndependence +public import Mathlib.Probability.Independence.Basic +public import Mathlib.MeasureTheory.Integral.Prod + +/-! +# Efron–Stein transfer to coefficient-field laws + +This file transfers the abstract product-space Efron–Stein inequality +(`Homogenization.efronStein_pi`) to a *single* restriction-unit-range-dependent +probability measure `P` on the honest-fields carrier `RegCoeffField d`, +resampled through a family of restriction endomorphisms. + +Fix a `Fintype ι` and a family of pairwise `AreUnitSeparated` measurable regions +`C : ι → Set (Vec d)` (the `MeasurableSet` side-conditions are the D7-approved +refinement making the carrier restriction σ-algebra `RestrictionSigmaR` well +defined). Writing `R a i := restrictReg (C i) (hC i) a` for the joint +restriction map, each coordinate is a restriction-local random variable for +`RestrictionSigmaR (C i) (hC i)`, so the family is independent under a +restriction-unit-range-dependent `P` and the pushforward `P.map R` factors as the product +measure `Measure.pi (fun i => P.map (restrictReg (C i) (hC i)))`. Efron–Stein +on that product, transported back through the map identity, yields the variance +bound for a bounded measurable observable `G` of the restricted fields. + +The single resampling coordinate is `restrictReg (C i) (hC i) a'`: an +independent copy of `P` re-drawn only on `C i`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +open scoped MeasureTheory ProbabilityTheory BigOperators + +namespace Homogenization + +variable {d : ℕ} + +/-- The restriction endomorphism `restrictReg U hU`, bundled as the identity +observable on the `U`-restricted field. This is the family fed to the carrier +independence bridge in the Efron–Stein transfer. -/ +noncomputable def restrictObservable (U : Set (Vec d)) (hU : MeasurableSet U) : + RegCoeffField d → RegCoeffField d := + restrictReg U hU + +@[simp] theorem restrictObservable_apply (U : Set (Vec d)) (hU : MeasurableSet U) + (a : RegCoeffField d) : + restrictObservable U hU a = restrictReg U hU a := rfl + +/-- The restriction observable is (globally) measurable on the carrier. -/ +theorem measurable_restrictObservable (U : Set (Vec d)) (hU : MeasurableSet U) : + Measurable (restrictObservable U hU) := + measurable_restrictReg U hU + +/-- The restriction observable is a restriction-local random variable on its +observation set: it is measurable for the carrier restriction σ-algebra +`RestrictionSigmaR U hU`. -/ +theorem isRestrictionLocalRandomVariable_restrictObservable (U : Set (Vec d)) + (hU : MeasurableSet U) : + Book.Ch04.IsRestrictionLocalRandomVariable U hU (restrictObservable U hU) := + measurable_restrictReg_restrictionSigmaR U hU + +/-- **Restriction Efron–Stein transfer.** For a finite family of pairwise +`AreUnitSeparated` measurable regions `C i`, a restriction-unit-range-dependent +probability measure `P` on the carrier `RegCoeffField d`, and a bounded +measurable observable `G` of the jointly restricted fields +`R a = fun i => restrictReg (C i) (hC i) a`, the variance of `G ∘ R` is +controlled by the sum of single-region resampling energies, each an independent +copy of `P` re-drawn only on `C i`. -/ +theorem efronStein_transfer_restriction + {ι : Type*} [Fintype ι] [DecidableEq ι] + {C : ι → Set (Vec d)} (hC : ∀ i, MeasurableSet (C i)) + (hsep : Pairwise fun i j => AreUnitSeparated (C i) (C j)) + {P : MeasureTheory.Measure (RegCoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependentR P) + {G : (ι → RegCoeffField d) → ℝ} (hG : Measurable G) {M : ℝ} (hMG : ∀ x, |G x| ≤ M) + (R : RegCoeffField d → (ι → RegCoeffField d)) + (hRdef : R = fun a i => restrictReg (C i) (hC i) a) : + Var[G ∘ R; P] + ≤ (1 / 2) * ∑ i, ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) - G (R a)) ^ 2 ∂P ∂P := by + classical + -- Restriction observables and the resampled per-region laws. + set X : ι → RegCoeffField d → RegCoeffField d := + fun i => restrictObservable (C i) (hC i) with hX + set μ : ι → MeasureTheory.Measure (RegCoeffField d) := + fun i => MeasureTheory.Measure.map (restrictReg (C i) (hC i)) P with hμ + have hμprob : ∀ i, MeasureTheory.IsProbabilityMeasure (μ i) := fun i => + (MeasureTheory.Measure.isProbabilityMeasure_map_iff + (measurable_restrictReg (C i) (hC i)).aemeasurable).mpr inferInstance + -- Measurability of the joint restriction map. + have hRmeas : Measurable R := by + rw [hRdef]; exact measurable_pi_iff.2 (fun i => measurable_restrictReg (C i) (hC i)) + -- Independence (carrier independence bridge) and the product-measure + -- factorisation `P.map R = pi μ`. + have hf : ∀ i, AEMeasurable (fun a => X i a) P := + fun i => (measurable_restrictObservable (C i) (hC i)).aemeasurable + have hindep : ProbabilityTheory.iIndepFun X P := + Book.Ch04.iIndepFun_of_restrictionUnitRangeDependentLaw_of_pairwise_separated + (P := P) (U := C) (X := X) hC hP + (fun i => isRestrictionLocalRandomVariable_restrictObservable (C i) (hC i)) hsep + have hmap : MeasureTheory.Measure.map R P = MeasureTheory.Measure.pi μ := by + have h := (ProbabilityTheory.iIndepFun_iff_map_fun_eq_pi_map hf).1 hindep + rw [hRdef]; exact h + -- Left-hand side: `Var[G ∘ R; P] = Var[G; pi μ]`. + have hLHS : Var[G ∘ R; P] = Var[G; MeasureTheory.Measure.pi μ] := by + rw [← ProbabilityTheory.variance_map (X := G) hG.aemeasurable hRmeas.aemeasurable, hmap] + -- Right-hand side: each resampling term pulled back to a double `P`-integral. + have hRHS : ∀ i, + (∫ x, ∫ y, (G (Function.update x i y) - G x) ^ 2 ∂(μ i) ∂(MeasureTheory.Measure.pi μ)) + = ∫ a, ∫ a', + (G (Function.update (R a) i (restrictReg (C i) (hC i) a')) - G (R a)) ^ 2 ∂P ∂P := by + intro i + -- Inner integral: resample the `i`-th coordinate from `P` through `restrictReg (C i)`. + have hinner : ∀ x : ι → RegCoeffField d, + (∫ y, (G (Function.update x i y) - G x) ^ 2 ∂(μ i)) + = ∫ a', (G (Function.update x i (restrictReg (C i) (hC i) a')) - G x) ^ 2 ∂P := by + intro x + have hg : Measurable + (fun y : RegCoeffField d => (G (Function.update x i y) - G x) ^ 2) := + ((hG.comp (measurable_update x)).sub measurable_const).pow measurable_const + simp only [hμ] + rw [MeasureTheory.integral_map (measurable_restrictReg (C i) (hC i)).aemeasurable + hg.aestronglyMeasurable] + simp_rw [hinner] + -- Outer integral: pull the free field `x` back to `R a` under `P`. + have hjoint : Measurable + (fun p : (ι → RegCoeffField d) × RegCoeffField d => + (G (Function.update p.1 i (restrictReg (C i) (hC i) p.2)) - G p.1) ^ 2) := by + have hupd : Measurable + (fun p : (ι → RegCoeffField d) × RegCoeffField d => + Function.update p.1 i (restrictReg (C i) (hC i) p.2)) := + (measurable_update' (a := i)).comp + (measurable_fst.prodMk + ((measurable_restrictReg (C i) (hC i)).comp measurable_snd)) + exact ((hG.comp hupd).sub (hG.comp measurable_fst)).pow measurable_const + have houter : MeasureTheory.StronglyMeasurable + (fun x : ι → RegCoeffField d => + ∫ a', (G (Function.update x i (restrictReg (C i) (hC i) a')) - G x) ^ 2 ∂P) := + hjoint.stronglyMeasurable.integral_prod_right' + rw [← hmap, MeasureTheory.integral_map hRmeas.aemeasurable houter.aestronglyMeasurable] + -- Assemble. + rw [hLHS] + refine le_trans (Homogenization.efronStein_pi μ hG (M := M) hMG) ?_ + apply mul_le_mul_of_nonneg_left _ (by norm_num : (0 : ℝ) ≤ 1 / 2) + exact le_of_eq (Finset.sum_congr rfl (fun i _ => hRHS i)) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/TwoPoint.lean b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/TwoPoint.lean new file mode 100644 index 0000000000..cbc378247c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/EfronStein/TwoPoint.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +/- +Copyright (c) 2026. All rights reserved. +-/ +public import Mathlib.Probability.Moments.Variance +public import Mathlib.MeasureTheory.Integral.Prod + +/-! +# Two-point variance identity and a Jensen bound + +Building blocks for the Efron–Stein inequality. + +* `Homogenization.variance_eq_half_integral_sub_sq`: for a bounded measurable + real random variable `X` on a probability space, + `Var[X] = ½ ∫∫ (X a − X b)² dμ dμ`. +* `Homogenization.sq_integral_le_integral_sq`: Jensen's inequality in the + form `(∫ X)² ≤ ∫ X²` for a bounded measurable `X` on a probability space. + +Everything is stated for *bounded* observables, which makes all integrability +side conditions immediate; no `L²`-generality is attempted. +-/ + +@[expose] public section + +open MeasureTheory Filter ProbabilityTheory +open scoped ProbabilityTheory ENNReal + +namespace Homogenization + +variable {Ω : Type*} [MeasurableSpace Ω] (μ : Measure Ω) [IsProbabilityMeasure μ] + +section Bounded + +variable {X : Ω → ℝ} (hX : Measurable X) {M : ℝ} (hM : ∀ ω, |X ω| ≤ M) + +include hX hM + +/-- A bounded measurable function is `MemLp 2` on a probability (finite) measure. -/ +theorem memLp_two_of_bound : MemLp X 2 μ := + memLp_of_bounded (Eventually.of_forall fun ω => abs_le.mp (hM ω)) hX.aestronglyMeasurable 2 + +/-- A bounded measurable function is integrable on a probability (finite) measure. -/ +theorem integrable_of_bound : Integrable X μ := + (memLp_two_of_bound μ hX hM).integrable one_le_two + +/-- The square of a bounded measurable function is integrable. -/ +theorem integrable_sq_of_bound : Integrable (fun ω => (X ω) ^ 2) μ := + (memLp_two_iff_integrable_sq hX.aestronglyMeasurable).mp (memLp_two_of_bound μ hX hM) + +end Bounded + +/-- **Two-point variance identity.** For a bounded measurable real random variable +`X` on a probability space, the variance equals one half of the mean squared +difference of two independent samples. -/ +theorem variance_eq_half_integral_sub_sq {X : Ω → ℝ} (hX : Measurable X) {M : ℝ} + (hM : ∀ ω, |X ω| ≤ M) : + Var[X; μ] = (1 / 2) * ∫ a, ∫ b, (X a - X b) ^ 2 ∂μ ∂μ := by + set m : ℝ := ∫ ω, X ω ∂μ with hm + set s : ℝ := ∫ ω, (X ω) ^ 2 ∂μ with hs + have hintX : Integrable X μ := integrable_of_bound μ hX hM + have hintXsq : Integrable (fun ω => (X ω) ^ 2) μ := integrable_sq_of_bound μ hX hM + -- inner integral, for each fixed `a` + have hinner : ∀ a, ∫ b, (X a - X b) ^ 2 ∂μ = (X a) ^ 2 - 2 * (X a) * m + s := by + intro a + have hcongr : ∀ b, (X a - X b) ^ 2 = (X a) ^ 2 - (2 * X a) * X b + (X b) ^ 2 := by + intro b; ring + calc + ∫ b, (X a - X b) ^ 2 ∂μ + = ∫ b, ((X a) ^ 2 - (2 * X a) * X b + (X b) ^ 2) ∂μ := by + simp_rw [hcongr] + _ = (∫ _b, (X a) ^ 2 ∂μ) - (∫ b, (2 * X a) * X b ∂μ) + ∫ b, (X b) ^ 2 ∂μ := by + rw [integral_add, integral_sub] + · exact integrable_const _ + · exact hintX.const_mul _ + · exact (integrable_const _).sub (hintX.const_mul _) + · exact hintXsq + _ = (X a) ^ 2 - 2 * (X a) * m + s := by + rw [integral_const, integral_const_mul] + simp [hm, hs, mul_assoc] + -- outer integral + have houter : + ∫ a, ∫ b, (X a - X b) ^ 2 ∂μ ∂μ = 2 * s - 2 * m ^ 2 := by + simp_rw [hinner] + have hcongr : ∀ a, (X a) ^ 2 - 2 * (X a) * m + s + = (X a) ^ 2 - (2 * m) * X a + s := by intro a; ring + calc + ∫ a, ((X a) ^ 2 - 2 * (X a) * m + s) ∂μ + = ∫ a, ((X a) ^ 2 - (2 * m) * X a + s) ∂μ := by simp_rw [hcongr] + _ = (∫ a, (X a) ^ 2 ∂μ) - (∫ a, (2 * m) * X a ∂μ) + ∫ _a, s ∂μ := by + rw [integral_add, integral_sub] + · exact hintXsq + · exact hintX.const_mul _ + · exact hintXsq.sub (hintX.const_mul _) + · exact integrable_const _ + _ = 2 * s - 2 * m ^ 2 := by + rw [integral_const, integral_const_mul] + simp only [hm, hs, probReal_univ, smul_eq_mul] + ring + rw [houter, variance_eq_sub (memLp_two_of_bound μ hX hM)] + simp only [Pi.pow_apply] + rw [← hs, ← hm] + ring + +/-- **Jensen's inequality**, `(∫ X)² ≤ ∫ X²`, for a bounded measurable function on +a probability space. -/ +theorem sq_integral_le_integral_sq {X : Ω → ℝ} (hX : Measurable X) {M : ℝ} + (hM : ∀ ω, |X ω| ≤ M) : + (∫ ω, X ω ∂μ) ^ 2 ≤ ∫ ω, (X ω) ^ 2 ∂μ := by + have h := variance_nonneg X μ + rw [variance_eq_sub (memLp_two_of_bound μ hX hM)] at h + simp only [Pi.pow_apply] at h + linarith + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums.lean new file mode 100644 index 0000000000..09014cbe4c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.IndependentCopy +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.MomentCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiCalculus +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma.lean new file mode 100644 index 0000000000..d2734f3c49 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Operations + +/-! # Gamma Sigma -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Basic.lean new file mode 100644 index 0000000000..a10232b95f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Basic.lean @@ -0,0 +1,832 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Complex.ExponentialBounds +public import Mathlib.Analysis.SpecialFunctions.ImproperIntegrals +public import Mathlib.Analysis.SpecialFunctions.Pow.Integral +public import Mathlib.MeasureTheory.Integral.Gamma +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The Chapter 4 indicator scale attached to an event of probability `p`: +for `0 < p < 1` this is the quantity `|log p|^{-1/σ}` written as +`(-log p)^(-1/σ)`. -/ +noncomputable def gammaIndicatorScale (σ p : ℝ) : ℝ := + (-Real.log p) ^ (-σ⁻¹) + +/-- An explicit Chapter 4 moment-growth constant for the stretched-exponential +class `Γ_σ`. It is chosen large enough to absorb the elementary gamma-integral +bound used in the tail-to-moment direction. -/ +noncomputable def gammaMomentConst (σ : ℝ) : ℝ := + (2 * Real.exp 1) * max 1 ((2 / (σ * Real.exp 1)) ^ σ⁻¹) + +/-- Absolute `p^{1/σ}` moment growth with witness `M` for the stretched- +exponential Chapter 4 class. -/ +def HasGammaMomentGrowthWith (μ : Measure Ω) (σ : ℝ) (X : Ω → ℝ) (M : ℝ) : Prop := + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => |X ω| ^ p) μ ∧ + ∫ ω, |X ω| ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p + +/-- Existential absolute `Γ_σ` moment growth. -/ +def HasGammaMomentGrowth (μ : Measure Ω) (σ : ℝ) (X : Ω → ℝ) : Prop := + ∃ M > 0, HasGammaMomentGrowthWith μ σ X M + +lemma gammaMomentConst_pos {σ : ℝ} (_hσ : 0 < σ) : 0 < gammaMomentConst σ := by + dsimp [gammaMomentConst] + positivity + +theorem hasGammaMomentGrowthWith_iff_of_nonneg {σ M : ℝ} {Y : Ω → ℝ} + (hY_nonneg : ∀ ω, 0 ≤ Y ω) : + HasGammaMomentGrowthWith μ σ Y M ↔ + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => Y ω ^ p) μ ∧ + ∫ ω, Y ω ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p := by + constructor + · intro h p hp + rcases h hp with ⟨h_int, h_bound⟩ + have hpow : (fun ω => |Y ω| ^ p) = fun ω => Y ω ^ p := by + funext ω + rw [abs_of_nonneg (hY_nonneg ω)] + refine ⟨hpow ▸ h_int, ?_⟩ + simpa [hpow] using h_bound + · intro h p hp + rcases h hp with ⟨h_int, h_bound⟩ + have hpow : (fun ω => |Y ω| ^ p) = fun ω => Y ω ^ p := by + funext ω + rw [abs_of_nonneg (hY_nonneg ω)] + refine ⟨hpow.symm ▸ h_int, ?_⟩ + simpa [hpow] using h_bound + +lemma rpow_mul_exp_neg_half_le {r u : ℝ} (hr : 0 < r) (hu : 0 < u) : + u ^ r * Real.exp (-u / 2) ≤ ((2 * r) / Real.exp 1) ^ r := by + have hx : 0 < u / (2 * r) := by positivity + have hlog : Real.log (u / (2 * r)) ≤ u / (2 * r) - 1 := + Real.log_le_sub_one_of_pos hx + have hmul' : Real.log (u / (2 * r)) * r ≤ (u / (2 * r) - 1) * r := + mul_le_mul_of_nonneg_right hlog hr.le + have hmul : Real.log (u / (2 * r)) * r ≤ u / 2 - r := by + calc + Real.log (u / (2 * r)) * r ≤ (u / (2 * r) - 1) * r := hmul' + _ = u / 2 - r := by + field_simp [hr.ne'] + have hexp : Real.exp (Real.log (u / (2 * r)) * r) ≤ Real.exp (u / 2 - r) := + Real.exp_le_exp.2 hmul + have hpow : + (u / (2 * r)) ^ r ≤ Real.exp (u / 2 - r) := by + simpa [Real.rpow_def_of_pos hx] using hexp + have hmul'' : + (2 * r) ^ r * ((u / (2 * r)) ^ r) ≤ + (2 * r) ^ r * Real.exp (u / 2 - r) := by + exact mul_le_mul_of_nonneg_left hpow (Real.rpow_nonneg (by positivity) _) + have hleft : (2 * r) ^ r * ((u / (2 * r)) ^ r) = u ^ r := by + rw [← Real.mul_rpow (show 0 ≤ 2 * r by positivity) (show 0 ≤ u / (2 * r) by positivity)] + congr 1 + field_simp [hr.ne'] + have hconst : + (2 * r) ^ r * Real.exp (-r) = ((2 * r) / Real.exp 1) ^ r := by + calc + (2 * r) ^ r * Real.exp (-r) = (2 * r) ^ r * (Real.exp 1) ^ (-r) := by + rw [← Real.exp_one_rpow (-r)] + _ = (2 * r) ^ r * ((Real.exp 1)⁻¹) ^ r := by + rw [Real.rpow_neg_eq_inv_rpow] + _ = ((2 * r) * (Real.exp 1)⁻¹) ^ r := by + rw [← Real.mul_rpow (show 0 ≤ 2 * r by positivity) (show 0 ≤ (Real.exp 1)⁻¹ by positivity)] + _ = ((2 * r) / Real.exp 1) ^ r := by + rw [div_eq_mul_inv] + have hright : + (2 * r) ^ r * Real.exp (u / 2 - r) = + (((2 * r) / Real.exp 1) ^ r) * Real.exp (u / 2) := by + calc + (2 * r) ^ r * Real.exp (u / 2 - r) + = (2 * r) ^ r * (Real.exp (u / 2) * Real.exp (-r)) := by + rw [sub_eq_add_neg, Real.exp_add] + _ = ((2 * r) ^ r * Real.exp (-r)) * Real.exp (u / 2) := by + ac_rfl + _ = (((2 * r) / Real.exp 1) ^ r) * Real.exp (u / 2) := by + rw [hconst] + have hupper : u ^ r ≤ (((2 * r) / Real.exp 1) ^ r) * Real.exp (u / 2) := by + exact (hleft ▸ hmul'').trans_eq hright + have hcancel := mul_le_mul_of_nonneg_right hupper (by positivity : 0 ≤ Real.exp (-u / 2)) + calc + u ^ r * Real.exp (-u / 2) + ≤ ((((2 * r) / Real.exp 1) ^ r) * Real.exp (u / 2)) * Real.exp (-u / 2) := hcancel + _ = (((2 * r) / Real.exp 1) ^ r) * (Real.exp (u / 2) * Real.exp (-u / 2)) := by + ac_rfl + _ = (((2 * r) / Real.exp 1) ^ r) * 1 := by + rw [← Real.exp_add, show u / 2 + -u / 2 = 0 by ring, Real.exp_zero] + _ = ((2 * r) / Real.exp 1) ^ r := by ring + +lemma gamma_add_one_le_two_mul_rpow_div_exp {r : ℝ} (hr : 0 < r) : + Real.Gamma (r + 1) ≤ 2 * ((2 * r) / Real.exp 1) ^ r := by + calc + Real.Gamma (r + 1) = ∫ u in Set.Ioi (0 : ℝ), u ^ r * Real.exp (-u) := by + rw [Real.Gamma_eq_integral (by linarith)] + congr with u + rw [show (r + 1) - 1 = r by ring] + ac_rfl + _ = ∫ u in Set.Ioi (0 : ℝ), (u ^ r * Real.exp (-u / 2)) * Real.exp (-u / 2) := by + refine setIntegral_congr_fun measurableSet_Ioi fun u hu => ?_ + rw [show Real.exp (-u) = Real.exp (-u / 2) * Real.exp (-u / 2) by + rw [← Real.exp_add] + ring_nf] + ac_rfl + _ ≤ ∫ u in Set.Ioi (0 : ℝ), (((2 * r) / Real.exp 1) ^ r) * Real.exp (-u / 2) := by + let ν : Measure ℝ := volume.restrict (Set.Ioi 0) + have hν_nonneg : 0 ≤ᵐ[ν] fun u => u ^ r * Real.exp (-u / 2) * Real.exp (-u / 2) := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with u hu + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hu.le _) (by positivity)) + (by positivity) + have hν_int : + Integrable (fun u => (((2 * r) / Real.exp 1) ^ r) * Real.exp (-u / 2)) ν := by + simpa [ν, IntegrableOn, div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using + (integrableOn_exp_mul_Ioi (a := -((1 : ℝ) / 2)) (by norm_num) 0).const_mul + (((2 * r) / Real.exp 1) ^ r) + have hmono : + ∀ᵐ u ∂ν, + u ^ r * Real.exp (-u / 2) * Real.exp (-u / 2) ≤ + (((2 * r) / Real.exp 1) ^ r) * Real.exp (-u / 2) := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with u hu + have h := rpow_mul_exp_neg_half_le hr hu + have h' := mul_le_mul_of_nonneg_right h (by positivity : 0 ≤ Real.exp (-u / 2)) + simpa [mul_assoc, mul_left_comm, mul_comm] using h' + simpa [ν] using integral_mono_of_nonneg hν_nonneg hν_int hmono + _ = (((2 * r) / Real.exp 1) ^ r) * ∫ u in Set.Ioi (0 : ℝ), Real.exp (-u / 2) := by + rw [integral_const_mul] + _ = 2 * ((2 * r) / Real.exp 1) ^ r := by + have hI : + ∫ u in Set.Ioi (0 : ℝ), Real.exp (-u / 2) = 2 := by + simpa [div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using + integral_exp_mul_Ioi (a := -((1 : ℝ) / 2)) (by norm_num) 0 + rw [hI] + ring + +lemma integrableOn_rpow_mul_exp_neg_rpow_of_pos {σ p : ℝ} + (hσ : 0 < σ) (hp : 0 < p) : + IntegrableOn (fun t : ℝ => t ^ (p - 1) * Real.exp (-(t ^ σ))) (Set.Ioi 0) := by + let f : ℝ → ℝ := fun u => u ^ (p / σ - 1) * Real.exp (-u) + have hf : IntegrableOn f (Set.Ioi 0) := by + simpa [f, mul_comm] using (Real.GammaIntegral_convergent (div_pos hp hσ)) + have hcomp : + IntegrableOn (fun t : ℝ => t ^ (σ - 1) * f (t ^ σ)) (Set.Ioi 0) := by + simpa [f, smul_eq_mul, mul_assoc, mul_left_comm, mul_comm] using + (integrableOn_Ioi_comp_rpow_iff' (E := ℝ) f hσ.ne').2 hf + refine (integrableOn_congr_fun ?_ measurableSet_Ioi).1 hcomp + intro t ht + calc + t ^ (σ - 1) * f (t ^ σ) + = t ^ (σ - 1) * ((t ^ σ) ^ (p / σ - 1) * Real.exp (-(t ^ σ))) := by + rfl + _ = (t ^ (σ - 1) * (t ^ σ) ^ (p / σ - 1)) * Real.exp (-(t ^ σ)) := by + ring + _ = (t ^ (σ - 1) * t ^ (σ * (p / σ - 1))) * Real.exp (-(t ^ σ)) := by + rw [← Real.rpow_mul (le_of_lt ht)] + _ = t ^ ((σ - 1) + σ * (p / σ - 1)) * Real.exp (-(t ^ σ)) := by + rw [← Real.rpow_add ht] + _ = t ^ (-1 + σ * (p / σ)) * Real.exp (-(t ^ σ)) := by + congr 1 + ring_nf + _ = t ^ (p - 1) * Real.exp (-(t ^ σ)) := by + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + (by congr 1; field_simp [hσ.ne'] : t ^ (-1 + σ * (p / σ)) = t ^ (-1 + p)) + +lemma gamma_moment_kernel_bound {σ p : ℝ} + (hσ : 0 < σ) (hp : 1 ≤ p) : + Real.exp 1 * p * ((1 / σ) * Real.Gamma (p / σ)) ≤ + (gammaMomentConst σ * p ^ σ⁻¹) ^ p := by + let c : ℝ := (2 / (σ * Real.exp 1)) ^ σ⁻¹ + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp + have hc_nonneg : 0 ≤ c := by + dsimp [c] + exact Real.rpow_nonneg (by positivity) _ + have hppow_nonneg : 0 ≤ p ^ σ⁻¹ := Real.rpow_nonneg hp_nonneg _ + have hmuldiv : (1 / σ) * p = p / σ := by + field_simp [hσ.ne'] + have hGamma : + Real.exp 1 * p * ((1 / σ) * Real.Gamma (p / σ)) = + Real.exp 1 * Real.Gamma (p / σ + 1) := by + calc + Real.exp 1 * p * ((1 / σ) * Real.Gamma (p / σ)) + = Real.exp 1 * (((1 / σ) * p) * Real.Gamma (p / σ)) := by ring + _ = Real.exp 1 * ((p / σ) * Real.Gamma (p / σ)) := by rw [hmuldiv] + _ = Real.exp 1 * Real.Gamma (p / σ + 1) := by + rw [Real.Gamma_add_one (div_ne_zero hp_pos.ne' hσ.ne')] + have hGammaBound : + Real.exp 1 * Real.Gamma (p / σ + 1) ≤ + Real.exp 1 * (2 * ((2 * (p / σ)) / Real.exp 1) ^ (p / σ)) := by + exact mul_le_mul_of_nonneg_left + (gamma_add_one_le_two_mul_rpow_div_exp (r := p / σ) (div_pos hp_pos hσ)) + (by positivity) + have hpow_eq : + ((2 * (p / σ)) / Real.exp 1) ^ (p / σ) = (c * p ^ σ⁻¹) ^ p := by + dsimp [c] + calc + ((2 * (p / σ)) / Real.exp 1) ^ (p / σ) + = (((2 / (σ * Real.exp 1)) * p) ^ σ⁻¹) ^ p := by + have hbase : + ((2 * (p / σ)) / Real.exp 1) = ((2 / (σ * Real.exp 1)) * p) := by + field_simp [hσ.ne'] + rw [hbase, ← Real.rpow_mul (by positivity : 0 ≤ (2 / (σ * Real.exp 1)) * p)] + congr 1 + field_simp [hσ.ne'] + _ = (((2 / (σ * Real.exp 1)) ^ σ⁻¹) * p ^ σ⁻¹) ^ p := by + congr 1 + rw [Real.mul_rpow (by positivity : 0 ≤ 2 / (σ * Real.exp 1)) hp_nonneg] + have hinner : + (c * p ^ σ⁻¹) ^ p ≤ (max 1 c * p ^ σ⁻¹) ^ p := by + refine Real.rpow_le_rpow ?_ ?_ hp_nonneg + · exact mul_nonneg hc_nonneg hppow_nonneg + · gcongr + exact le_max_right 1 c + have htwoe_one : 1 ≤ 2 * Real.exp 1 := by + have hexp_one : 1 ≤ Real.exp 1 := by + exact Real.one_le_exp (by positivity : 0 ≤ (1 : ℝ)) + nlinarith + have htwoe : + 2 * Real.exp 1 ≤ (2 * Real.exp 1) ^ p := by + exact Real.self_le_rpow_of_one_le htwoe_one hp + have hmul : + (2 * Real.exp 1) * (c * p ^ σ⁻¹) ^ p ≤ + (2 * Real.exp 1) ^ p * (max 1 c * p ^ σ⁻¹) ^ p := by + exact mul_le_mul htwoe hinner (by positivity) (by positivity) + calc + Real.exp 1 * p * ((1 / σ) * Real.Gamma (p / σ)) + = Real.exp 1 * Real.Gamma (p / σ + 1) := hGamma + _ ≤ Real.exp 1 * (2 * ((2 * (p / σ)) / Real.exp 1) ^ (p / σ)) := hGammaBound + _ = (2 * Real.exp 1) * (c * p ^ σ⁻¹) ^ p := by + rw [hpow_eq] + ring + _ ≤ (2 * Real.exp 1) ^ p * (max 1 c * p ^ σ⁻¹) ^ p := hmul + _ = ((2 * Real.exp 1) * (max 1 c * p ^ σ⁻¹)) ^ p := by + rw [← Real.mul_rpow (by positivity : 0 ≤ 2 * Real.exp 1) + (mul_nonneg (le_trans zero_le_one (le_max_left 1 c)) hppow_nonneg)] + _ = (gammaMomentConst σ * p ^ σ⁻¹) ^ p := by + dsimp [gammaMomentConst, c] + congr 1 + ring + +/-- Reverse `Γ_σ` moment estimate at unit scale: stretched-exponential upper +tails imply `p^{1/σ}` moment growth for every `p ≥ 1`. -/ +theorem lintegral_rpow_le_of_isBigOWith_gammaSigma_unit + {Y : Ω → ℝ} {σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hp : 1 ≤ p) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hYm : AEMeasurable Y μ) (hY : IsBigOWith μ (gammaSigma σ) Y 1) : + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ ≤ + ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹) ^ p) := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hY_nonneg_ae : 0 ≤ᵐ[μ] Y := Filter.Eventually.of_forall hY_nonneg + have hY_tail := (isBigOWith_gammaSigma_iff (μ := μ) (X := Y) (A := 1) (σ := σ)).1 hY + have hLayer := + MeasureTheory.lintegral_rpow_eq_lintegral_meas_lt_mul (μ := μ) hY_nonneg_ae hYm hp_pos + have hTail : + ∀ ⦃t : ℝ⦄, t ∈ Set.Ioi (0 : ℝ) → + μ {ω | t < Y ω} ≤ ENNReal.ofReal (Real.exp 1 * Real.exp (-(t ^ σ))) := by + intro t ht + let s : Set Ω := upperTailEvent Y t + change μ s ≤ ENNReal.ofReal (Real.exp 1 * Real.exp (-(t ^ σ))) + by_cases ht1 : 1 ≤ t + · have hreal : + μ.real s ≤ Real.exp (-(t ^ σ)) := by + simpa [s, upperTailEvent] using hY_tail ht1 + have hmul : + Real.exp (-(t ^ σ)) ≤ Real.exp 1 * Real.exp (-(t ^ σ)) := by + calc + Real.exp (-(t ^ σ)) = 1 * Real.exp (-(t ^ σ)) := by ring + _ ≤ Real.exp 1 * Real.exp (-(t ^ σ)) := by + gcongr + exact Real.one_le_exp (by positivity : 0 ≤ (1 : ℝ)) + have hfinite := measure_lt_top μ s + have hmeasure_eq : + μ s = ENNReal.ofReal (μ.real s) := by + simp [Measure.real, hfinite.ne] + rw [hmeasure_eq] + exact ENNReal.ofReal_le_ofReal (hreal.trans hmul) + · have hprob : + μ s ≤ 1 := by + calc + μ s ≤ μ Set.univ := measure_mono (Set.subset_univ _) + _ = 1 := by simp + have hpow_le_one : t ^ σ ≤ 1 := by + have ht_lt_one : t < 1 := lt_of_not_ge ht1 + simpa using Real.rpow_le_rpow (le_of_lt ht) ht_lt_one.le hσ.le + have hexp : + (1 : ENNReal) ≤ ENNReal.ofReal (Real.exp 1 * Real.exp (-(t ^ σ))) := by + have hreal : 1 ≤ Real.exp (1 - t ^ σ) := by + exact Real.one_le_exp (sub_nonneg.mpr hpow_le_one) + simpa [sub_eq_add_neg, Real.exp_add] using (ENNReal.ofReal_le_ofReal hreal) + exact hprob.trans hexp + have hdom : + ∀ᵐ t ∂(volume.restrict (Set.Ioi (0 : ℝ))), + μ {ω | t < Y ω} * ENNReal.ofReal (t ^ (p - 1)) ≤ + ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with t ht + have hpow_nonneg : 0 ≤ t ^ (p - 1) := Real.rpow_nonneg ht.le _ + have hmul : + μ {ω | t < Y ω} * ENNReal.ofReal (t ^ (p - 1)) ≤ + ENNReal.ofReal (Real.exp 1 * Real.exp (-(t ^ σ))) * + ENNReal.ofReal (t ^ (p - 1)) := by + exact mul_le_mul_of_nonneg_right (hTail ht) + (by positivity : 0 ≤ ENNReal.ofReal (t ^ (p - 1))) + calc + μ {ω | t < Y ω} * ENNReal.ofReal (t ^ (p - 1)) + ≤ ENNReal.ofReal (Real.exp 1 * Real.exp (-(t ^ σ))) * + ENNReal.ofReal (t ^ (p - 1)) := hmul + _ = ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) := by + rw [← ENNReal.ofReal_mul (by positivity : 0 ≤ Real.exp 1 * Real.exp (-(t ^ σ)))] + congr 1 + ring + have hDomInt : + IntegrableOn (fun t : ℝ => Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) + (Set.Ioi 0) := by + show Integrable (fun t : ℝ => Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) + (volume.restrict (Set.Ioi 0)) + have hraw := + (integrableOn_rpow_mul_exp_neg_rpow_of_pos (σ := σ) (p := p) hσ hp_pos).const_mul + (Real.exp 1) + simp only [mul_assoc, mul_comm] at hraw ⊢ + exact hraw + have hDomNonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi (0 : ℝ))] + fun t : ℝ => Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ))) := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with t ht + have hpow_nonneg : 0 ≤ t ^ (p - 1) := Real.rpow_nonneg ht.le _ + exact mul_nonneg (by positivity) (mul_nonneg hpow_nonneg (by positivity)) + have hDomLin : + ∫⁻ t in Set.Ioi (0 : ℝ), + ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) = + ENNReal.ofReal (Real.exp 1 * ((1 / σ) * Real.Gamma (p / σ))) := by + have hEq : + ENNReal.ofReal + (∫ t in Set.Ioi (0 : ℝ), Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) = + ∫⁻ t in Set.Ioi (0 : ℝ), + ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) := by + simpa [IntegrableOn] using + (MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (μ := volume.restrict (Set.Ioi (0 : ℝ))) hDomInt hDomNonneg) + rw [← hEq] + rw [integral_const_mul, integral_rpow_mul_exp_neg_rpow hσ (by linarith : -1 < p - 1)] + have harg : (p - 1 + 1) / σ = p / σ := by ring + rw [harg] + have hmono : + ∫⁻ t in Set.Ioi (0 : ℝ), μ {ω | t < Y ω} * ENNReal.ofReal (t ^ (p - 1)) ≤ + ∫⁻ t in Set.Ioi (0 : ℝ), + ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) := by + exact lintegral_mono_ae hdom + calc + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ + = ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), μ {ω | t < Y ω} * ENNReal.ofReal (t ^ (p - 1)) := hLayer + _ ≤ ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), + ENNReal.ofReal (Real.exp 1 * (t ^ (p - 1) * Real.exp (-(t ^ σ)))) := by + gcongr + _ = ENNReal.ofReal (Real.exp 1 * p * ((1 / σ) * Real.Gamma (p / σ))) := by + rw [hDomLin, ← ENNReal.ofReal_mul (le_trans zero_le_one hp)] + ring_nf + _ ≤ ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹) ^ p) := by + exact ENNReal.ofReal_le_ofReal (gamma_moment_kernel_bound hσ hp) + +/-- Stretched-exponential upper tails imply `p^{1/σ}` moment growth at an +arbitrary scale. -/ +theorem lintegral_rpow_le_of_isBigOWith_gammaSigma + {Y : Ω → ℝ} {K σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hp : 1 ≤ p) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hYm : AEMeasurable Y μ) (hY : IsBigOWith μ (gammaSigma σ) Y K) : + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ ≤ + ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p) := by + let Z : Ω → ℝ := fun ω => Y ω / K + have hZ_nonneg : ∀ ω, 0 ≤ Z ω := by + intro ω + dsimp [Z] + exact div_nonneg (hY_nonneg ω) hK.le + have hZm : AEMeasurable Z μ := by + simpa [Z, div_eq_mul_inv, mul_comm] using hYm.const_mul K⁻¹ + have hZ : IsBigOWith μ (gammaSigma σ) Z 1 := by + rw [isBigOWith_gammaSigma_iff] at hY ⊢ + intro t ht + have hset : upperTailEvent Z t = upperTailEvent Y (K * t) := by + ext ω + dsimp [Z, upperTailEvent] + rw [lt_div_iff₀ hK, mul_comm] + simpa [hset] using hY ht + have hunit := + lintegral_rpow_le_of_isBigOWith_gammaSigma_unit + (μ := μ) (Y := Z) (σ := σ) (p := p) hσ hp hZ_nonneg hZm hZ + have hZpowm : AEMeasurable (fun ω => Z ω ^ p) μ := + hZm.pow measurable_const.aemeasurable + calc + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ + = ∫⁻ ω, ENNReal.ofReal (K ^ p) * ENNReal.ofReal (Z ω ^ p) ∂μ := by + apply lintegral_congr_ae + refine Filter.Eventually.of_forall ?_ + intro ω + dsimp [Z] + rw [← ENNReal.ofReal_mul (Real.rpow_nonneg hK.le _)] + congr 1 + calc + Y ω ^ p = (K * (Y ω / K)) ^ p := by + congr 1 + symm + field_simp [hK.ne'] + _ = K ^ p * (Y ω / K) ^ p := by + rw [Real.mul_rpow hK.le (hZ_nonneg ω)] + _ = ENNReal.ofReal (K ^ p) * ∫⁻ ω, ENNReal.ofReal (Z ω ^ p) ∂μ := by + simpa using + (MeasureTheory.lintegral_const_mul'' (μ := μ) (r := ENNReal.ofReal (K ^ p)) + (f := fun ω => ENNReal.ofReal (Z ω ^ p)) + (measurable_id.ennreal_ofReal.comp_aemeasurable hZpowm)) + _ ≤ ENNReal.ofReal (K ^ p) * ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹) ^ p) := by + gcongr + _ = ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p) := by + rw [← ENNReal.ofReal_mul (Real.rpow_nonneg hK.le _)] + congr 1 + have hscale_nonneg : 0 ≤ gammaMomentConst σ * p ^ σ⁻¹ := by + exact mul_nonneg (gammaMomentConst_pos hσ).le (Real.rpow_nonneg (le_trans zero_le_one hp) _) + rw [Real.mul_rpow hscale_nonneg hK.le] + ring + +/-- Real-integral version of `lintegral_rpow_le_of_isBigOWith_gammaSigma`. -/ +theorem integral_rpow_le_of_isBigOWith_gammaSigma + {Y : Ω → ℝ} {K σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hp : 1 ≤ p) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hYm : AEMeasurable Y μ) (hY : IsBigOWith μ (gammaSigma σ) Y K) : + ∫ ω, Y ω ^ p ∂μ ≤ (gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p := by + have hlin := + lintegral_rpow_le_of_isBigOWith_gammaSigma + (μ := μ) (Y := Y) (K := K) (σ := σ) (p := p) hσ hK hp hY_nonneg hYm hY + have hpow_nonneg : 0 ≤ᵐ[μ] fun ω => Y ω ^ p := by + exact Filter.Eventually.of_forall fun ω => Real.rpow_nonneg (hY_nonneg ω) _ + have hbound_nonneg : 0 ≤ (gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p := by + have hscale_nonneg : 0 ≤ gammaMomentConst σ * p ^ σ⁻¹ * K := by + exact mul_nonneg + (mul_nonneg (gammaMomentConst_pos hσ).le (Real.rpow_nonneg (le_trans zero_le_one hp) _)) + hK.le + exact Real.rpow_nonneg hscale_nonneg _ + have hfin := lt_of_le_of_lt hlin ENNReal.ofReal_lt_top + rw [MeasureTheory.integral_eq_lintegral_of_nonneg_ae hpow_nonneg + (hYm.pow measurable_const.aemeasurable).aestronglyMeasurable] + have htoReal : + (∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ).toReal ≤ + (ENNReal.ofReal ((gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p)).toReal := + (ENNReal.toReal_le_toReal hfin.ne ENNReal.ofReal_ne_top).2 hlin + simpa [hbound_nonneg] using htoReal + +/-- Integrability consequence of stretched-exponential upper-tail control. -/ +theorem integrable_rpow_of_isBigOWith_gammaSigma + {Y : Ω → ℝ} {K σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hp : 1 ≤ p) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hYm : AEMeasurable Y μ) (hY : IsBigOWith μ (gammaSigma σ) Y K) : + Integrable (fun ω => Y ω ^ p) μ := by + have hlin := + lintegral_rpow_le_of_isBigOWith_gammaSigma + (μ := μ) (Y := Y) (K := K) (σ := σ) (p := p) hσ hK hp hY_nonneg hYm hY + have hpow_nonneg : 0 ≤ᵐ[μ] fun ω => Y ω ^ p := by + exact Filter.Eventually.of_forall fun ω => Real.rpow_nonneg (hY_nonneg ω) _ + have hpow_aesm : + AEStronglyMeasurable (fun ω => Y ω ^ p) μ := + (hYm.pow measurable_const.aemeasurable).aestronglyMeasurable + refine (MeasureTheory.lintegral_ofReal_ne_top_iff_integrable + (μ := μ) hpow_aesm hpow_nonneg).1 ?_ + exact ne_of_lt (lt_of_le_of_lt hlin ENNReal.ofReal_lt_top) + +/-- Symmetric moment estimate for the stretched-exponential class. -/ +theorem integral_abs_rpow_le_of_isBigO_gammaSigma + {X : Ω → ℝ} {K σ p : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hp : 1 ≤ p) + (hXm : AEMeasurable X μ) (hX : IsBigO μ (gammaSigma σ) X K) : + ∫ ω, |X ω| ^ p ∂μ ≤ (gammaMomentConst σ * p ^ σ⁻¹ * K) ^ p := by + rw [IsBigO] at hX + exact integral_rpow_le_of_isBigOWith_gammaSigma + (μ := μ) (Y := fun ω => |X ω|) (K := K) (σ := σ) (p := p) + hσ hK hp (fun ω => abs_nonneg (X ω)) (continuous_abs.measurable.comp_aemeasurable hXm) hX + +/-- Power rule for the stretched-exponential class on nonnegative random +variables. -/ +theorem isBigOWith_gammaSigma_rpow + {X : Ω → ℝ} {A σ p : ℝ} + [IsFiniteMeasure μ] + (hp : 0 < p) (hA : 0 ≤ A) (hX_nonneg : ∀ ω, 0 ≤ X ω) + (hX : IsBigOWith μ (gammaSigma σ) X A) : + IsBigOWith μ (gammaSigma (σ / p)) (fun ω => X ω ^ p) (A ^ p) := by + rw [isBigOWith_gammaSigma_iff] at hX ⊢ + intro t ht + let s : ℝ := t ^ p⁻¹ + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have hs_nonneg : 0 ≤ s := by + exact Real.rpow_nonneg ht0 _ + have hs_one : 1 ≤ s := by + dsimp [s] + exact Real.one_le_rpow ht (inv_nonneg.mpr hp.le) + have hsubset : + upperTailEvent (fun ω => X ω ^ p) (A ^ p * t) ⊆ + upperTailEvent X (A * s) := by + intro ω hω + have hAs_pow : (A * s) ^ p = A ^ p * t := by + calc + (A * s) ^ p = A ^ p * s ^ p := by + rw [Real.mul_rpow hA hs_nonneg] + _ = A ^ p * t := by + rw [show s ^ p = t by + dsimp [s] + rw [Real.rpow_inv_rpow ht0 hp.ne']] + have hω' : (A * s) ^ p < X ω ^ p := by + simpa [hAs_pow] using hω + exact (Real.rpow_lt_rpow_iff (mul_nonneg hA hs_nonneg) (hX_nonneg ω) hp).1 hω' + refine (measureReal_mono hsubset).trans ?_ + have hs_pow : s ^ σ = t ^ (σ / p) := by + dsimp [s] + calc + (t ^ p⁻¹) ^ σ = t ^ (p⁻¹ * σ) := by + rw [← Real.rpow_mul ht0] + _ = t ^ (σ / p) := by + simp [div_eq_mul_inv, mul_comm] + simpa [s, hs_pow, div_eq_mul_inv] using hX hs_one + +/-- Reversible power rule for stretched-exponential upper-tail bounds on +nonnegative random variables. -/ +theorem isBigOWith_gammaSigma_rpow_iff + {X : Ω → ℝ} {A σ p : ℝ} + [IsFiniteMeasure μ] + (hp : 0 < p) (hA : 0 ≤ A) (hX_nonneg : ∀ ω, 0 ≤ X ω) : + IsBigOWith μ (gammaSigma σ) X A ↔ + IsBigOWith μ (gammaSigma (σ / p)) (fun ω => X ω ^ p) (A ^ p) := by + constructor + · exact isBigOWith_gammaSigma_rpow (μ := μ) hp hA hX_nonneg + · intro hXp + have hp_inv : 0 < p⁻¹ := inv_pos.mpr hp + have hApow_nonneg : 0 ≤ A ^ p := Real.rpow_nonneg hA _ + have hXpow_nonneg : ∀ ω, 0 ≤ X ω ^ p := fun ω => Real.rpow_nonneg (hX_nonneg ω) _ + have hback := + isBigOWith_gammaSigma_rpow (μ := μ) (X := fun ω => X ω ^ p) + (A := A ^ p) (σ := σ / p) (p := p⁻¹) + hp_inv hApow_nonneg hXpow_nonneg hXp + have hsigma : (σ / p) / p⁻¹ = σ := by + field_simp [div_eq_mul_inv, hp.ne'] + have hX_id : (fun ω => (X ω ^ p) ^ p⁻¹) = X := by + funext ω + calc + (X ω ^ p) ^ p⁻¹ = X ω ^ (p * p⁻¹) := by + rw [← Real.rpow_mul (hX_nonneg ω)] + _ = X ω := by + rw [mul_inv_cancel₀ hp.ne', Real.rpow_one] + have hA_id : (A ^ p) ^ p⁻¹ = A := by + calc + (A ^ p) ^ p⁻¹ = A ^ (p * p⁻¹) := by + rw [← Real.rpow_mul hA] + _ = A := by + rw [mul_inv_cancel₀ hp.ne', Real.rpow_one] + simpa [hsigma, hX_id, hA_id] using hback + +/-- Symmetric reversible power rule for the stretched-exponential class, +expressed through the note-level quantity `|X|^p`. -/ +theorem isBigO_gammaSigma_rpow_iff + {X : Ω → ℝ} {A σ p : ℝ} + [IsFiniteMeasure μ] + (hp : 0 < p) (hA : 0 ≤ A) : + IsBigO μ (gammaSigma σ) X A ↔ + IsBigO μ (gammaSigma (σ / p)) (fun ω => |X ω| ^ p) (A ^ p) := by + have habs : + (fun ω => |(|X ω| ^ p)|) = (fun ω => |X ω| ^ p) := by + funext ω + rw [abs_of_nonneg] + exact Real.rpow_nonneg (abs_nonneg (X ω)) _ + rw [IsBigO, IsBigO, habs] + simpa [abs_abs] using + isBigOWith_gammaSigma_rpow_iff (μ := μ) (X := fun ω => |X ω|) (A := A) (σ := σ) (p := p) + hp hA (fun ω => abs_nonneg (X ω)) + +/-- Moment growth of order `p^{1/σ}` implies stretched-exponential upper tails +with the Chapter 4 constant `e M`. -/ +theorem isBigOWith_gammaSigma_of_moment_growth + {Y : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hY : + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => Y ω ^ p) μ ∧ + ∫ ω, Y ω ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p) : + IsBigOWith μ (gammaSigma σ) Y (Real.exp 1 * M) := by + rw [isBigOWith_gammaSigma_iff] + intro t ht + let p : ℝ := t ^ σ + have hp_one : 1 ≤ p := by + dsimp [p] + exact Real.one_le_rpow ht hσ.le + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp_one + rcases hY hp_one with ⟨hp_int, hp_bound⟩ + have hbase_pos : 0 < (Real.exp 1 * M) * t := by positivity + have hYpow_nonneg : 0 ≤ᵐ[μ] fun ω => Y ω ^ p := + Filter.Eventually.of_forall fun ω => Real.rpow_nonneg (hY_nonneg ω) _ + have hsubset : + upperTailEvent Y ((Real.exp 1 * M) * t) ⊆ + {ω | (((Real.exp 1 * M) * t) ^ p) ≤ Y ω ^ p} := by + intro ω hω + have hωpow : + (((Real.exp 1 * M) * t) ^ p) < Y ω ^ p := by + exact (Real.rpow_lt_rpow_iff hbase_pos.le (hY_nonneg ω) hp_pos).2 hω + exact le_of_lt hωpow + have hmarkov := + mul_meas_ge_le_integral_of_nonneg (μ := μ) (f := fun ω => Y ω ^ p) + hYpow_nonneg hp_int (((Real.exp 1 * M) * t) ^ p) + have htail_aux : + μ.real {ω | (((Real.exp 1 * M) * t) ^ p) ≤ Y ω ^ p} ≤ + ((M * p ^ σ⁻¹) ^ p) / (((Real.exp 1 * M) * t) ^ p) := by + rw [le_div_iff₀ (Real.rpow_pos_of_pos hbase_pos _)] + simpa [mul_comm] using (hmarkov.trans hp_bound) + have hp_root : p ^ σ⁻¹ = t := by + dsimp [p] + calc + (t ^ σ) ^ σ⁻¹ = t ^ (σ * σ⁻¹) := by + rw [← Real.rpow_mul (le_trans zero_le_one ht)] + _ = t := by + rw [mul_inv_cancel₀ hσ.ne', Real.rpow_one] + have hMt_pos : 0 < M * t := by positivity + calc + μ.real (upperTailEvent Y ((Real.exp 1 * M) * t)) + ≤ μ.real {ω | (((Real.exp 1 * M) * t) ^ p) ≤ Y ω ^ p} := + measureReal_mono hsubset + _ ≤ ((M * p ^ σ⁻¹) ^ p) / (((Real.exp 1 * M) * t) ^ p) := htail_aux + _ = ((M * t) ^ p) / (((Real.exp 1) ^ p) * ((M * t) ^ p)) := by + rw [hp_root] + congr 1 + calc + (((Real.exp 1 * M) * t) ^ p) = ((Real.exp 1) * (M * t)) ^ p := by ring_nf + _ = (Real.exp 1) ^ p * (M * t) ^ p := by + rw [Real.mul_rpow (by positivity) hMt_pos.le] + _ = ((M * t) ^ p * ((M * t) ^ p)⁻¹) * ((Real.exp 1) ^ p)⁻¹ := by + rw [div_eq_mul_inv, mul_inv_rev] + ac_rfl + _ = ((Real.exp 1) ^ p)⁻¹ := by + rw [mul_inv_cancel₀ (Real.rpow_pos_of_pos hMt_pos _).ne', one_mul] + _ = Real.exp (-p) := by + rw [Real.exp_one_rpow, ← Real.exp_neg] + _ = Real.exp (-(t ^ σ)) := by + simp [p] + +/-- Symmetric moment-growth criterion for the stretched-exponential class. -/ +theorem isBigO_gammaSigma_of_moment_growth + {X : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) + (hX : + ∀ ⦃p : ℝ⦄, 1 ≤ p → + Integrable (fun ω => |X ω| ^ p) μ ∧ + ∫ ω, |X ω| ^ p ∂μ ≤ (M * p ^ σ⁻¹) ^ p) : + IsBigO μ (gammaSigma σ) X (Real.exp 1 * M) := by + rw [IsBigO] + exact isBigOWith_gammaSigma_of_moment_growth + (μ := μ) (Y := fun ω => |X ω|) (M := M) (σ := σ) hσ hM + (fun ω => abs_nonneg (X ω)) hX + +/-- Tail control with witness `K` yields `p^{1/σ}` absolute moment growth with +the explicit Chapter 4 witness `gammaMomentConst σ * K`. -/ +theorem hasGammaMomentGrowthWith_of_isBigOWith_gammaSigma + {Y : Ω → ℝ} {K σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hYm : AEMeasurable Y μ) (hY : IsBigOWith μ (gammaSigma σ) Y K) : + HasGammaMomentGrowthWith μ σ Y (gammaMomentConst σ * K) := by + rw [hasGammaMomentGrowthWith_iff_of_nonneg (μ := μ) (σ := σ) + (M := gammaMomentConst σ * K) (Y := Y) hY_nonneg] + intro p hp + refine ⟨?_, ?_⟩ + · exact integrable_rpow_of_isBigOWith_gammaSigma + (μ := μ) (Y := Y) (K := K) (σ := σ) (p := p) + hσ hK hp hY_nonneg hYm hY + · have hbound := + integral_rpow_le_of_isBigOWith_gammaSigma + (μ := μ) (Y := Y) (K := K) (σ := σ) (p := p) + hσ hK hp hY_nonneg hYm hY + have hscale : + gammaMomentConst σ * p ^ σ⁻¹ * K = + (gammaMomentConst σ * K) * p ^ σ⁻¹ := by + ring + simpa [hscale] using hbound + +/-- Absolute `p^{1/σ}` moment growth implies stretched-exponential upper tails +with the Chapter 4 constant `e M`, provided the random variable is +nonnegative. -/ +theorem isBigOWith_gammaSigma_of_hasGammaMomentGrowthWith_of_nonneg + {Y : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) (hY_nonneg : ∀ ω, 0 ≤ Y ω) + (hY : HasGammaMomentGrowthWith μ σ Y M) : + IsBigOWith μ (gammaSigma σ) Y (Real.exp 1 * M) := by + rw [hasGammaMomentGrowthWith_iff_of_nonneg (μ := μ) (σ := σ) + (M := M) (Y := Y) hY_nonneg] at hY + exact isBigOWith_gammaSigma_of_moment_growth + (μ := μ) (Y := Y) (M := M) (σ := σ) hσ hM hY_nonneg hY + +/-- Symmetric tail control with witness `K` yields witness-level absolute +moment growth with the explicit Chapter 4 constant `gammaMomentConst σ * K`. -/ +theorem hasGammaMomentGrowthWith_of_isBigO_gammaSigma + {X : Ω → ℝ} {K σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) + (hXm : AEMeasurable X μ) (hX : IsBigO μ (gammaSigma σ) X K) : + HasGammaMomentGrowthWith μ σ X (gammaMomentConst σ * K) := by + intro p hp + refine ⟨?_, ?_⟩ + · have hX_abs : IsBigOWith μ (gammaSigma σ) (fun ω => |X ω|) K := by + simpa [IsBigO] using hX + exact integrable_rpow_of_isBigOWith_gammaSigma + (μ := μ) (Y := fun ω => |X ω|) (K := K) (σ := σ) (p := p) + hσ hK hp (fun ω => abs_nonneg (X ω)) + (continuous_abs.measurable.comp_aemeasurable hXm) hX_abs + · have hbound := + integral_abs_rpow_le_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) (p := p) hσ hK hp hXm hX + have hscale : + gammaMomentConst σ * p ^ σ⁻¹ * K = + (gammaMomentConst σ * K) * p ^ σ⁻¹ := by + ring + simpa [hscale] using hbound + +/-- Tail control in the symmetric `O_{Γ_σ}` sense yields existential absolute +moment growth. -/ +theorem hasGammaMomentGrowth_of_isBigO_gammaSigma + {X : Ω → ℝ} {K σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hK : 0 < K) + (hXm : AEMeasurable X μ) (hX : IsBigO μ (gammaSigma σ) X K) : + HasGammaMomentGrowth μ σ X := by + refine ⟨gammaMomentConst σ * K, mul_pos (gammaMomentConst_pos hσ) hK, ?_⟩ + exact hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) hσ hK hXm hX + +/-- Witness-level absolute moment growth directly upgrades to the symmetric +`O_{Γ_σ}` relation. -/ +theorem isBigO_gammaSigma_of_hasGammaMomentGrowthWith + {X : Ω → ℝ} {M σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hM : 0 < M) + (hX : HasGammaMomentGrowthWith μ σ X M) : + IsBigO μ (gammaSigma σ) X (Real.exp 1 * M) := by + exact isBigO_gammaSigma_of_moment_growth + (μ := μ) (X := X) (M := M) (σ := σ) hσ hM hX + +/-- For nonnegative random variables, existential `Γ_σ` moment growth is +equivalent to an upper-tail `O_{Γ_σ}` witness. -/ +theorem hasGammaMomentGrowth_iff_exists_isBigOWith_gammaSigma_of_nonneg + {Y : Ω → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hY_nonneg : ∀ ω, 0 ≤ Y ω) (hYm : AEMeasurable Y μ) : + HasGammaMomentGrowth μ σ Y ↔ + ∃ K > 0, IsBigOWith μ (gammaSigma σ) Y K := by + constructor + · rintro ⟨M, hM, hY_growth⟩ + refine ⟨Real.exp 1 * M, by positivity, ?_⟩ + exact isBigOWith_gammaSigma_of_hasGammaMomentGrowthWith_of_nonneg + (μ := μ) (Y := Y) (M := M) (σ := σ) hσ hM hY_nonneg hY_growth + · rintro ⟨K, hK, hY_tail⟩ + refine ⟨gammaMomentConst σ * K, mul_pos (gammaMomentConst_pos hσ) hK, ?_⟩ + exact hasGammaMomentGrowthWith_of_isBigOWith_gammaSigma + (μ := μ) (Y := Y) (K := K) (σ := σ) hσ hK hY_nonneg hYm hY_tail + +/-- Existential `Γ_σ` moment growth is equivalent to the symmetric +stretched-exponential `O_{Γ_σ}` relation. -/ +theorem hasGammaMomentGrowth_iff_exists_isBigO_gammaSigma + {X : Ω → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hXm : AEMeasurable X μ) : + HasGammaMomentGrowth μ σ X ↔ + ∃ K > 0, IsBigO μ (gammaSigma σ) X K := by + constructor + · rintro ⟨M, hM, hX_growth⟩ + refine ⟨Real.exp 1 * M, by positivity, ?_⟩ + exact isBigO_gammaSigma_of_hasGammaMomentGrowthWith + (μ := μ) (X := X) (M := M) (σ := σ) hσ hM hX_growth + · rintro ⟨K, hK, hX_tail⟩ + exact hasGammaMomentGrowth_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) hσ hK hXm hX_tail + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Operations.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Operations.lean new file mode 100644 index 0000000000..ed62c5944b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigma/Operations.lean @@ -0,0 +1,538 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma.Basic + +/-! # Operations -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The explicit `Γ_σ` moment-growth triangle constant obtained by combining +the Chapter 4 tail/moment bridge with the independent-sums `Γ_σ` triangle +inequality. -/ +noncomputable def gammaMomentTriangleConst (σ : ℝ) : ℝ := + gammaMomentConst σ * Real.exp 1 * gammaTriangleConst σ + +lemma gammaTriangleConst_pos {σ : ℝ} : 0 < gammaTriangleConst σ := by + have hGrowthPos : 0 < gammaGrowthConst σ := lt_of_lt_of_le zero_lt_two (two_le_gammaGrowthConst σ) + dsimp [gammaTriangleConst] + positivity + +lemma gammaMomentTriangleConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaMomentTriangleConst σ := by + have hMomentConst : 0 < gammaMomentConst σ := gammaMomentConst_pos hσ + have hTrianglePos : 0 < gammaTriangleConst σ := gammaTriangleConst_pos + dsimp [gammaMomentTriangleConst] + positivity + +/-- Finite-family generalized triangle inequality in witness-level +`Γ_σ` moment-growth form. -/ +theorem hasGammaMomentGrowthWith_finset_sum + {ι : Type*} (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowthWith μ σ (fun ω => Finset.sum s (fun i => X i ω)) + (gammaMomentTriangleConst σ * Finset.sum s a) := by + have hTail : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (Real.exp 1 * a i) := by + intro i hi + exact isBigO_gammaSigma_of_hasGammaMomentGrowthWith + (μ := μ) (X := X i) (M := a i) (σ := σ) hσ (ha i hi) (hX i hi) + have hTailSum : + IsBigO μ (gammaSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * Finset.sum s (fun i => Real.exp 1 * a i)) := by + refine isBigO_finset_sum_of_isBigO_gammaSigma + (μ := μ) (s := s) (X := X) (a := fun i => Real.exp 1 * a i) (σ := σ) + hσ hs ?_ hTail hXm + intro i hi + exact mul_pos (by positivity) (ha i hi) + have hScaledSum_pos : 0 < Finset.sum s (fun i => Real.exp 1 * a i) := by + rcases hs with ⟨i₀, hi₀⟩ + refine Finset.sum_pos' ?_ ?_ + · intro i hi + exact mul_nonneg (by positivity : 0 ≤ Real.exp 1) (ha i hi).le + · refine ⟨i₀, hi₀, ?_⟩ + exact mul_pos (by positivity) (ha i₀ hi₀) + have hTriangle_pos : 0 < gammaTriangleConst σ := gammaTriangleConst_pos + have hTailScale_pos : + 0 < gammaTriangleConst σ * Finset.sum s (fun i => Real.exp 1 * a i) := by + exact mul_pos hTriangle_pos hScaledSum_pos + have hSum_meas : + AEMeasurable (fun ω => Finset.sum s (fun i => X i ω)) μ := + (Finset.measurable_sum (s := s) fun i hi => hXm i hi).aemeasurable + have hMoment := + hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := fun ω => Finset.sum s (fun i => X i ω)) + (K := gammaTriangleConst σ * Finset.sum s (fun i => Real.exp 1 * a i)) + (σ := σ) hσ hTailScale_pos hSum_meas hTailSum + have hScaledSum : + Finset.sum s (fun i => Real.exp 1 * a i) = Real.exp 1 * Finset.sum s a := by + rw [← Finset.mul_sum] + convert hMoment using 1 + rw [gammaMomentTriangleConst, hScaledSum] + ring + +/-- Average version of the witness-level `Γ_σ` moment-growth triangle +inequality. -/ +theorem hasGammaMomentGrowthWith_finsetAverage + {ι : Type*} (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowthWith μ σ + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (gammaMomentTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + have hTail : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (Real.exp 1 * a i) := by + intro i hi + exact isBigO_gammaSigma_of_hasGammaMomentGrowthWith + (μ := μ) (X := X i) (M := a i) (σ := σ) hσ (ha i hi) (hX i hi) + have hTailAvg : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s (fun i => Real.exp 1 * a i))) := by + refine isBigO_finsetAverage_of_isBigO_gammaSigma + (μ := μ) (s := s) (X := X) (a := fun i => Real.exp 1 * a i) (σ := σ) + hσ hs ?_ hTail hXm + intro i hi + exact mul_pos (by positivity) (ha i hi) + have hScaledSum_pos : 0 < Finset.sum s (fun i => Real.exp 1 * a i) := by + rcases hs with ⟨i₀, hi₀⟩ + refine Finset.sum_pos' ?_ ?_ + · intro i hi + exact mul_nonneg (by positivity : 0 ≤ Real.exp 1) (ha i hi).le + · refine ⟨i₀, hi₀, ?_⟩ + exact mul_pos (by positivity) (ha i₀ hi₀) + have hCard_pos : 0 < (s.card : ℝ) := by + exact_mod_cast hs.card_pos + have hAvgScale_pos : + 0 < ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => Real.exp 1 * a i) := by + exact mul_pos (inv_pos.mpr hCard_pos) hScaledSum_pos + have hTriangle_pos : 0 < gammaTriangleConst σ := gammaTriangleConst_pos + have hTailScale_pos : + 0 < gammaTriangleConst σ * + (((s.card : ℝ)⁻¹) * Finset.sum s (fun i => Real.exp 1 * a i)) := by + exact mul_pos hTriangle_pos hAvgScale_pos + have hSum_meas : Measurable (fun ω => Finset.sum s (fun i => X i ω)) := + Finset.measurable_sum (s := s) fun i hi => hXm i hi + have hAvg_meas : + AEMeasurable (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) μ := + (measurable_const.mul hSum_meas).aemeasurable + have hMoment := + hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (K := gammaTriangleConst σ * + (((s.card : ℝ)⁻¹) * Finset.sum s (fun i => Real.exp 1 * a i))) + (σ := σ) hσ hTailScale_pos hAvg_meas hTailAvg + have hScaledSum : + Finset.sum s (fun i => Real.exp 1 * a i) = Real.exp 1 * Finset.sum s a := by + rw [← Finset.mul_sum] + convert hMoment using 1 + rw [gammaMomentTriangleConst, hScaledSum] + ring + +/-- Finite-family generalized triangle inequality for existential +`Γ_σ` moment-growth witnesses. -/ +theorem hasGammaMomentGrowth_finset_sum + {ι : Type*} (s : Finset ι) {X : ι → Ω → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs : s.Nonempty) + (hX : ∀ i ∈ s, HasGammaMomentGrowth μ σ (X i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowth μ σ (fun ω => Finset.sum s (fun i => X i ω)) := by + classical + have hChoice : ∀ i ∈ s, ∃ a, 0 < a ∧ HasGammaMomentGrowthWith μ σ (X i) a := by + intro i hi + simpa [HasGammaMomentGrowth] using hX i hi + let a : ι → ℝ := fun i => + if hi : i ∈ s then Classical.choose (hChoice i hi) else 1 + have ha : ∀ i ∈ s, 0 < a i := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).1 + have hXa : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i) := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).2 + have hSum_pos : 0 < Finset.sum s a := by + rcases hs with ⟨i₀, hi₀⟩ + exact Finset.sum_pos' (fun i hi => (ha i hi).le) ⟨i₀, hi₀, ha i₀ hi₀⟩ + refine ⟨gammaMomentTriangleConst σ * Finset.sum s a, + mul_pos (gammaMomentTriangleConst_pos hσ) hSum_pos, ?_⟩ + exact hasGammaMomentGrowthWith_finset_sum + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hXa hXm + +/-- Average version of the existential `Γ_σ` moment-growth triangle +inequality. -/ +theorem hasGammaMomentGrowth_finsetAverage + {ι : Type*} (s : Finset ι) {X : ι → Ω → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs : s.Nonempty) + (hX : ∀ i ∈ s, HasGammaMomentGrowth μ σ (X i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowth μ σ + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) := by + classical + have hChoice : ∀ i ∈ s, ∃ a, 0 < a ∧ HasGammaMomentGrowthWith μ σ (X i) a := by + intro i hi + simpa [HasGammaMomentGrowth] using hX i hi + let a : ι → ℝ := fun i => + if hi : i ∈ s then Classical.choose (hChoice i hi) else 1 + have ha : ∀ i ∈ s, 0 < a i := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).1 + have hXa : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i) := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).2 + have hSum_pos : 0 < Finset.sum s a := by + rcases hs with ⟨i₀, hi₀⟩ + exact Finset.sum_pos' (fun i hi => (ha i hi).le) ⟨i₀, hi₀, ha i₀ hi₀⟩ + have hCard_pos : 0 < (s.card : ℝ) := by + exact_mod_cast hs.card_pos + have hAvgScale_pos : 0 < ((s.card : ℝ)⁻¹) * Finset.sum s a := by + exact mul_pos (inv_pos.mpr hCard_pos) hSum_pos + refine ⟨gammaMomentTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a), + mul_pos (gammaMomentTriangleConst_pos hσ) hAvgScale_pos, ?_⟩ + exact hasGammaMomentGrowthWith_finsetAverage + (μ := μ) (s := s) (X := X) (a := a) (σ := σ) hσ hs ha hXa hXm + +/-- Event indicators belong to the stretched-exponential class with the +natural logarithmic scale from the Chapter 4 notes. -/ +theorem isBigOWith_gammaSigma_indicator + {E : Set Ω} {σ : ℝ} + (hσ : 0 < σ) (hE_pos : 0 < μ.real E) (hE_lt_one : μ.real E < 1) : + IsBigOWith μ (gammaSigma σ) (E.indicator fun _ => (1 : ℝ)) + (gammaIndicatorScale σ (μ.real E)) := by + rw [isBigOWith_gammaSigma_iff] + intro t ht + let p : ℝ := μ.real E + let B : ℝ := -Real.log p + let A : ℝ := gammaIndicatorScale σ p + have hp_pos : 0 < p := hE_pos + have hB_pos : 0 < B := by + dsimp [B, p] + have hlog_neg : Real.log (μ.real E) < 0 := Real.log_neg hE_pos hE_lt_one + linarith + have hA_pos : 0 < A := by + dsimp [A, gammaIndicatorScale] + exact Real.rpow_pos_of_pos hB_pos _ + have hAt_nonneg : 0 ≤ A * t := mul_nonneg hA_pos.le (le_trans zero_le_one ht) + by_cases hcut : A * t < 1 + · have hset : upperTailEvent (E.indicator fun _ => (1 : ℝ)) (A * t) = E := by + ext ω + by_cases hω : ω ∈ E + · simp [upperTailEvent, hω, hcut] + · simp [upperTailEvent, hω, not_lt.mpr hAt_nonneg] + rw [hset] + have hcut' : t < B ^ σ⁻¹ := by + have hBroot_pos : 0 < B ^ σ⁻¹ := Real.rpow_pos_of_pos hB_pos _ + have hAt_div : A * t = t / (B ^ σ⁻¹) := by + dsimp [A, gammaIndicatorScale] + rw [Real.rpow_neg hB_pos.le, mul_comm, div_eq_mul_inv] + rw [hAt_div, div_lt_iff₀ hBroot_pos] at hcut + simpa [mul_comm, mul_left_comm, mul_assoc] using hcut + have htail : t ^ σ < B := by + exact (Real.lt_rpow_inv_iff_of_pos (le_trans zero_le_one ht) hB_pos.le hσ).1 hcut' + have hp_tail : p < Real.exp (-(t ^ σ)) := by + refine (Real.log_lt_iff_lt_exp hp_pos).1 ?_ + dsimp [B, p] at htail ⊢ + linarith + exact hp_tail.le + · have hAt_ge : 1 ≤ A * t := le_of_not_gt hcut + have hset : upperTailEvent (E.indicator fun _ => (1 : ℝ)) (A * t) = ∅ := by + ext ω + by_cases hω : ω ∈ E + · simp [upperTailEvent, hω, not_lt.mpr hAt_ge] + · simp [upperTailEvent, hω, not_lt.mpr hAt_nonneg] + rw [hset] + simpa using (show (0 : ℝ) ≤ Real.exp (-(t ^ σ)) by positivity) + +/-- Event indicators also satisfy the symmetric `O_{Γ_σ}` relation, since the +indicator is already nonnegative. -/ +theorem isBigO_gammaSigma_indicator + {E : Set Ω} {σ : ℝ} + (hσ : 0 < σ) (hE_pos : 0 < μ.real E) (hE_lt_one : μ.real E < 1) : + IsBigO μ (gammaSigma σ) (E.indicator fun _ => (1 : ℝ)) + (gammaIndicatorScale σ (μ.real E)) := by + have habs : + (fun ω => |E.indicator (fun _ => (1 : ℝ)) ω|) = + E.indicator (fun _ => (1 : ℝ)) := by + funext ω + by_cases hω : ω ∈ E <;> simp [hω] + rw [IsBigO, habs] + exact isBigOWith_gammaSigma_indicator (μ := μ) (E := E) (σ := σ) hσ hE_pos hE_lt_one + +/-- Finite-maximum bound in the stretched-exponential class. This is the +finite-family version of the Chapter 4 maximum lemma with the note-facing +constant `(3 log N)^{1/σ}`. -/ +theorem isBigOWith_gammaSigma_finset_sup' + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {A σ : ℝ} [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigOWith μ (gammaSigma σ) (X i) A) : + IsBigOWith μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * A) := by + rw [isBigOWith_gammaSigma_iff] + intro t ht + let n : ℝ := s.card + let L : ℝ := (3 * Real.log n) ^ σ⁻¹ + have hs_card_real : (2 : ℝ) ≤ n := by + change (2 : ℝ) ≤ (s.card : ℝ) + exact_mod_cast hs_card + have hn_pos : 0 < n := by + dsimp [n] + positivity + have hlog_two_lt : (1 / 2 : ℝ) < Real.log 2 := by + nlinarith [Real.log_two_gt_d9] + have hlog_two_le : Real.log 2 ≤ Real.log n := by + exact Real.log_le_log (by norm_num) hs_card_real + have hone_le_two_log : 1 ≤ 2 * Real.log n := by + nlinarith + have hbase_one : 1 ≤ 3 * Real.log n := by + nlinarith [hone_le_two_log] + have hbase_nonneg : 0 ≤ 3 * Real.log n := le_trans zero_le_one hbase_one + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact Real.rpow_nonneg hbase_nonneg _ + have hL_one : 1 ≤ L := by + dsimp [L] + exact Real.one_le_rpow hbase_one (inv_nonneg.mpr hσ.le) + have hLt_one : 1 ≤ L * t := by + nlinarith + have hsubset : + upperTailEvent (fun ω => s.sup' hs (fun i => X i ω)) ((L * A) * t) ⊆ + ⋃ i ∈ s, upperTailEvent (X i) (A * (L * t)) := by + intro ω hω + have hω' : A * (L * t) < s.sup' hs (fun i => X i ω) := by + simpa [mul_assoc, mul_left_comm, mul_comm] using hω + rcases (Finset.lt_sup'_iff hs).1 hω' with ⟨i, hi, hiω⟩ + exact Set.mem_iUnion.2 ⟨i, Set.mem_iUnion.2 ⟨hi, hiω⟩⟩ + have hLpow : L ^ σ = 3 * Real.log n := by + dsimp [L] + rw [Real.rpow_inv_rpow hbase_nonneg hσ.ne'] + have hmulpow : (L * t) ^ σ = (3 * Real.log n) * t ^ σ := by + calc + (L * t) ^ σ = L ^ σ * t ^ σ := by + rw [Real.mul_rpow hL_nonneg (le_trans zero_le_one ht)] + _ = (3 * Real.log n) * t ^ σ := by + rw [hLpow] + have htpow_one : 1 ≤ t ^ σ := Real.one_le_rpow ht hσ.le + have hunion_ne_top : + μ (⋃ i ∈ s, upperTailEvent (X i) (A * (L * t))) ≠ ⊤ := + measure_ne_top μ _ + calc + μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => X i ω)) (((3 * Real.log n) ^ σ⁻¹ * A) * t)) + ≤ μ.real (⋃ i ∈ s, upperTailEvent (X i) (A * (L * t))) := by + simpa [L, mul_assoc, mul_left_comm, mul_comm] using + (measureReal_mono hsubset hunion_ne_top) + _ ≤ ∑ i ∈ s, μ.real (upperTailEvent (X i) (A * (L * t))) := by + simpa using measureReal_biUnion_finset_le s + (fun i => upperTailEvent (X i) (A * (L * t))) + _ ≤ ∑ _i ∈ s, Real.exp (-((L * t) ^ σ)) := by + refine Finset.sum_le_sum fun i hi => ?_ + simpa [gammaSigma, ← Real.exp_neg] using hX i hi hLt_one + _ = n * Real.exp (-((L * t) ^ σ)) := by + simp [n] + _ = Real.exp (Real.log n - (L * t) ^ σ) := by + calc + n * Real.exp (-((L * t) ^ σ)) = Real.exp (Real.log n) * Real.exp (-((L * t) ^ σ)) := by + rw [Real.exp_log hn_pos] + _ = Real.exp (Real.log n + -((L * t) ^ σ)) := by + rw [← Real.exp_add] + _ = Real.exp (Real.log n - (L * t) ^ σ) := by + simp [sub_eq_add_neg] + _ ≤ Real.exp (-(t ^ σ)) := by + refine (Real.exp_le_exp).2 ?_ + rw [hmulpow] + nlinarith [hone_le_two_log, htpow_one] + _ = Real.exp (-(t ^ σ)) := rfl + +/-- Finite-maximum bound with nonuniform witness scales: the common scale is +the supremum of the individual witnesses. -/ +theorem isBigOWith_gammaSigma_finset_sup'_of_scales + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigOWith μ (gammaSigma σ) (X i) (a i)) : + IsBigOWith μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * s.sup' hs a) := by + refine isBigOWith_gammaSigma_finset_sup' (μ := μ) (s := s) (hs := hs) + (X := X) (A := s.sup' hs a) (σ := σ) hσ hs_card ?_ + intro i hi + exact (hX i hi).mono_scale (Finset.le_sup' a hi) + +/-- Absolute finite-maximum bound with nonuniform witness scales. -/ +theorem isBigOWith_gammaSigma_finset_sup'_abs_of_scales + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) : + IsBigOWith μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => |X i ω|)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * s.sup' hs a) := by + simpa [IsBigO] using + isBigOWith_gammaSigma_finset_sup'_of_scales (μ := μ) (s := s) (hs := hs) + (X := fun i ω => |X i ω|) (a := a) (σ := σ) hσ hs_card hX + +/-- Symmetric finite-maximum bound with nonuniform witness scales. -/ +theorem isBigO_gammaSigma_finset_sup'_of_scales + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} [IsFiniteMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) : + IsBigO μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * s.sup' hs a) := by + let Y : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + have hY : + IsBigOWith μ (gammaSigma σ) Y + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * s.sup' hs a) := by + simpa [Y] using + isBigOWith_gammaSigma_finset_sup'_abs_of_scales + (μ := μ) (s := s) (hs := hs) (X := X) (a := a) (σ := σ) hσ hs_card hX + refine hY.of_le ?_ + intro ω + dsimp [Y] + refine (abs_le.2 ?_) + constructor + · rcases Finset.exists_mem_eq_sup' hs (fun i => X i ω) with ⟨i, hi, hi_eq⟩ + calc + -(s.sup' hs (fun j => |X j ω|)) ≤ -|X i ω| := by + exact neg_le_neg (Finset.le_sup' (fun j => |X j ω|) hi) + _ ≤ X i ω := by + simpa using neg_abs_le (X i ω) + _ ≤ s.sup' hs (fun j => X j ω) := by + simp [hi_eq] + · refine Finset.sup'_le hs _ fun i hi => ?_ + exact (le_abs_self (X i ω)).trans (Finset.le_sup' (fun j => |X j ω|) hi) + +/-- Finite-maximum bound in witness-level `Γ_σ` moment-growth form. -/ +theorem hasGammaMomentGrowthWith_finset_sup'_of_scales + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowthWith μ σ (fun ω => s.sup' hs (fun i => X i ω)) + (gammaMomentConst σ * + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * (Real.exp 1 * s.sup' hs a))) := by + have hTail : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (Real.exp 1 * a i) := by + intro i hi + exact isBigO_gammaSigma_of_hasGammaMomentGrowthWith + (μ := μ) (X := X i) (M := a i) (σ := σ) hσ (ha i hi) (hX i hi) + have hTailSup : + IsBigO μ (gammaSigma σ) (fun ω => s.sup' hs (fun i => X i ω)) + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * + s.sup' hs (fun i => Real.exp 1 * a i)) := by + exact isBigO_gammaSigma_finset_sup'_of_scales + (μ := μ) (s := s) (hs := hs) (X := X) (a := fun i => Real.exp 1 * a i) (σ := σ) + hσ hs_card hTail + have hs_card_real : (2 : ℝ) ≤ (s.card : ℝ) := by + exact_mod_cast hs_card + have hlog_two_le : Real.log 2 ≤ Real.log (s.card : ℝ) := by + exact Real.log_le_log (by norm_num) hs_card_real + have hone_le_two_log : 1 ≤ 2 * Real.log (s.card : ℝ) := by + nlinarith [Real.log_two_gt_d9, hlog_two_le] + have hbase_one : 1 ≤ 3 * Real.log (s.card : ℝ) := by + nlinarith [hone_le_two_log] + have hbase_pos : 0 < 3 * Real.log (s.card : ℝ) := lt_of_lt_of_le zero_lt_one hbase_one + have hCardFactor_pos : 0 < (3 * Real.log (s.card : ℝ)) ^ σ⁻¹ := by + exact Real.rpow_pos_of_pos hbase_pos _ + have hs_nonempty : s.Nonempty := hs + rcases hs with ⟨i₀, hi₀⟩ + have hSupScaled_pos : 0 < s.sup' hs_nonempty (fun i => Real.exp 1 * a i) := by + exact lt_of_lt_of_le (mul_pos (by positivity) (ha i₀ hi₀)) + (Finset.le_sup' (fun i => Real.exp 1 * a i) hi₀) + have hTailScale_pos : + 0 < ((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * + s.sup' hs_nonempty (fun i => Real.exp 1 * a i) := by + exact mul_pos hCardFactor_pos hSupScaled_pos + let Y : Ω → ℝ := s.sup' hs_nonempty X + have hY_eq : Y = fun ω => s.sup' hs_nonempty (fun i => X i ω) := by + funext ω + change (s.sup' hs_nonempty X) ω = s.sup' hs_nonempty (fun i => X i ω) + exact Finset.sup'_apply (C := fun _ => ℝ) hs_nonempty X ω + have hSup_meas : AEMeasurable Y μ := + (Finset.measurable_sup' (hs := hs_nonempty) (f := X) fun i hi => hXm i hi).aemeasurable + have hTailSup' : + IsBigO μ (gammaSigma σ) Y + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * + s.sup' hs_nonempty (fun i => Real.exp 1 * a i)) := by + simpa [hY_eq] using hTailSup + have hMoment := + hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := Y) + (K := ((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * + s.sup' hs_nonempty (fun i => Real.exp 1 * a i)) + (σ := σ) hσ hTailScale_pos hSup_meas hTailSup' + have hScaledSup : + s.sup' hs_nonempty (fun i => a i * Real.exp 1) = s.sup' hs_nonempty a * Real.exp 1 := by + simpa using + (Finset.sup'_mul₀ (a := Real.exp 1) (f := a) (s := s) (hs := hs_nonempty) (by positivity)).symm + simpa [hY_eq, hScaledSup, mul_assoc, mul_left_comm, mul_comm] using hMoment + +/-- Existential finite-maximum bound for the `Γ_σ` moment-growth class. -/ +theorem hasGammaMomentGrowth_finset_sup' + {ι : Type*} (s : Finset ι) (hs : s.Nonempty) + {X : ι → Ω → ℝ} {σ : ℝ} + [IsProbabilityMeasure μ] + (hσ : 0 < σ) (hs_card : 2 ≤ s.card) + (hX : ∀ i ∈ s, HasGammaMomentGrowth μ σ (X i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + HasGammaMomentGrowth μ σ (fun ω => s.sup' hs (fun i => X i ω)) := by + classical + have hChoice : ∀ i ∈ s, ∃ a, 0 < a ∧ HasGammaMomentGrowthWith μ σ (X i) a := by + intro i hi + simpa [HasGammaMomentGrowth] using hX i hi + let a : ι → ℝ := fun i => + if hi : i ∈ s then Classical.choose (hChoice i hi) else 1 + have ha : ∀ i ∈ s, 0 < a i := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).1 + have hXa : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (a i) := by + intro i hi + simpa [a, hi] using (Classical.choose_spec (hChoice i hi)).2 + have hs_card_real : (2 : ℝ) ≤ (s.card : ℝ) := by + exact_mod_cast hs_card + have hlog_two_le : Real.log 2 ≤ Real.log (s.card : ℝ) := by + exact Real.log_le_log (by norm_num) hs_card_real + have hone_le_two_log : 1 ≤ 2 * Real.log (s.card : ℝ) := by + nlinarith [Real.log_two_gt_d9, hlog_two_le] + have hbase_one : 1 ≤ 3 * Real.log (s.card : ℝ) := by + nlinarith [hone_le_two_log] + have hbase_pos : 0 < 3 * Real.log (s.card : ℝ) := lt_of_lt_of_le zero_lt_one hbase_one + have hCardFactor_pos : 0 < (3 * Real.log (s.card : ℝ)) ^ σ⁻¹ := by + exact Real.rpow_pos_of_pos hbase_pos _ + have hs_nonempty : s.Nonempty := hs + rcases hs with ⟨i₀, hi₀⟩ + have hSup_pos : 0 < s.sup' hs_nonempty a := by + exact lt_of_lt_of_le (ha i₀ hi₀) (Finset.le_sup' a hi₀) + refine ⟨gammaMomentConst σ * + (((3 * Real.log (s.card : ℝ)) ^ σ⁻¹) * (Real.exp 1 * s.sup' hs_nonempty a)), + mul_pos (gammaMomentConst_pos hσ) (mul_pos hCardFactor_pos (mul_pos (by positivity) hSup_pos)), ?_⟩ + exact hasGammaMomentGrowthWith_finset_sup'_of_scales + (μ := μ) (s := s) (hs := hs_nonempty) (X := X) (a := a) (σ := σ) + hσ hs_card ha hXa hXm + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration.lean new file mode 100644 index 0000000000..fbe7e65865 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.SmallRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.LargeRegime + +/-! # Gamma Sigma Concentration -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/LargeRegime.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/LargeRegime.lean new file mode 100644 index 0000000000..ed2203e604 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/LargeRegime.lean @@ -0,0 +1,567 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.SmallRegime + +/-! # Large Regime -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Large-regime one-sided heavy-tail concentration for centered independent +unit-scale `O_{Γ_σ}` summands. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one_unit_largeRegime + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ t : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) 1) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (ht : 1 ≤ t) + (hlarge : (s.card : ℝ) ^ (σ / (2 * (2 - σ))) ≤ t) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * t)) ≤ + Real.exp (-(t ^ σ)) := by + let R : ℝ := s.card + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let B : ℝ := gammaSigmaHeavyTailConst σ + let q : ℝ := σ / (1 - σ) + let S : ℝ := R ^ (σ / 2) * t ^ σ + have hR_pos : 0 < R := by + dsimp [R] + exact_mod_cast hs.card_pos + have hR_one : 1 ≤ R := by + dsimp [R] + exact_mod_cast (Nat.succ_le_of_lt hs.card_pos) + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have hsqrtR_nonneg : 0 ≤ Real.sqrt R := hsqrtR_pos.le + have hD_pos : 0 < D := by + simpa [D] using gammaSigmaHeavyTailRoundedConst_pos (σ := σ) hσ₀ + have hsqrtD_pos : 0 < Real.sqrt D := Real.sqrt_pos.2 hD_pos + have hsqrtD_two : 2 ≤ Real.sqrt D := by + simpa [D] using two_le_sqrt_gammaSigmaHeavyTailRoundedConst (σ := σ) hσ₀ + have hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (gammaMomentConst σ) := by + intro i hi + simpa [mul_assoc, mul_left_comm, mul_comm] using + (hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X i) (K := 1) (σ := σ) + hσ₀ zero_lt_one (h_meas i).aemeasurable (hX i hi)) + have h_int : ∀ i ∈ s, Integrable (X i) μ := by + intro i hi + have hXone := + gammaMomentGrowth_natCast_bound + (μ := μ) (X := X i) (σ := σ) (M := gammaMomentConst σ) (n := 1) + (by norm_num) (hXmom i hi) + have hX_abs_int : Integrable (fun ω => |X i ω|) μ := by + simpa using hXone.1 + have hX_norm_int : Integrable (fun ω => ‖X i ω‖) μ := by + simpa [Real.norm_eq_abs] using hX_abs_int + exact (integrable_norm_iff ((h_meas i).aemeasurable.aestronglyMeasurable)).1 hX_norm_int + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have ht_nonneg : 0 ≤ t := ht_pos.le + have hS_nonneg : 0 ≤ S := by + dsimp [S] + positivity + have hS_tpow : t ^ σ ≤ S := by + have hRpow_one : 1 ≤ R ^ (σ / 2) := by + exact Real.one_le_rpow hR_one (by positivity : 0 ≤ σ / 2) + calc + t ^ σ ≤ R ^ (σ / 2) * t ^ σ := by + calc + t ^ σ = 1 * t ^ σ := by ring + _ ≤ R ^ (σ / 2) * t ^ σ := + mul_le_mul_of_nonneg_right hRpow_one + (Real.rpow_nonneg ht_nonneg σ) + _ = S := by rfl + let l : ℝ := R ^ ((σ - 1) / 2) * t ^ (σ - 1) / (4 * Real.sqrt D) + let L : ℝ := (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R * t + have hl_nonneg : 0 ≤ l := by + dsimp [l] + positivity + have hRpow_le_one : R ^ ((σ - 1) / 2) ≤ 1 := by + have hExp_nonpos : (σ - 1) / 2 ≤ 0 := by linarith + exact Real.rpow_le_one_of_one_le_of_nonpos hR_one hExp_nonpos + have htpow_le_one : t ^ (σ - 1) ≤ 1 := by + exact Real.rpow_le_one_of_one_le_of_nonpos ht (by linarith) + have hl_half : l ≤ 1 / 2 := by + dsimp [l] + have hle : + R ^ ((σ - 1) / 2) * t ^ (σ - 1) / (4 * Real.sqrt D) ≤ + 1 / (4 * Real.sqrt D) := by + have hprod : + R ^ ((σ - 1) / 2) * t ^ (σ - 1) ≤ 1 := by + have hnonneg : 0 ≤ t ^ (σ - 1) := Real.rpow_nonneg ht_nonneg _ + calc + R ^ ((σ - 1) / 2) * t ^ (σ - 1) ≤ 1 * t ^ (σ - 1) := by + gcongr + _ ≤ 1 := by simpa using htpow_le_one + have hden_pos : 0 < 4 * Real.sqrt D := by positivity + exact div_le_div_of_nonneg_right hprod hden_pos.le + calc + l = R ^ ((σ - 1) / 2) * t ^ (σ - 1) / (4 * Real.sqrt D) := rfl + _ ≤ 1 / (4 * Real.sqrt D) := hle + _ ≤ 1 / 2 := by + have hden : (8 : ℝ) ≤ 4 * Real.sqrt D := by + have hden' := + mul_le_mul_of_nonneg_left hsqrtD_two + (by norm_num : 0 ≤ (4 : ℝ)) + norm_num at hden' + exact hden' + have hinv : 1 / (4 * Real.sqrt D) ≤ 1 / (8 : ℝ) := by + exact one_div_le_one_div_of_le (by positivity : 0 < (8 : ℝ)) hden + exact hinv.trans (by norm_num : (1 / (8 : ℝ)) ≤ 1 / 2) + have hl_one : l ≤ 1 := by linarith + have hL_one : 1 ≤ L := by + have hconst_one : 1 ≤ (2 * Real.sqrt D) ^ (1 / (1 - σ)) := by + have hbase_one : 1 ≤ 2 * Real.sqrt D := by + calc + (1 : ℝ) ≤ Real.sqrt D := le_trans (by norm_num) hsqrtD_two + _ ≤ 2 * Real.sqrt D := by + exact le_mul_of_one_le_left hsqrtD_pos.le (by norm_num : (1 : ℝ) ≤ 2) + have hexp_nonneg : 0 ≤ 1 / (1 - σ) := by + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + positivity + exact Real.one_le_rpow hbase_one hexp_nonneg + have hsqrtR_one : 1 ≤ Real.sqrt R := by + refine (Real.one_le_sqrt).2 ?_ + exact hR_one + dsimp [L] + calc + 1 ≤ (2 * Real.sqrt D) ^ (1 / (1 - σ)) := hconst_one + _ ≤ (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R := by + calc + (2 * Real.sqrt D) ^ (1 / (1 - σ)) + = + (2 * Real.sqrt D) ^ (1 / (1 - σ)) * 1 := by ring + _ ≤ (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R := + mul_le_mul_of_nonneg_left hsqrtR_one + (Real.rpow_nonneg (by positivity : 0 ≤ 2 * Real.sqrt D) _) + _ ≤ (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R * t := by + calc + (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R + = ((2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R) * 1 := by ring + _ ≤ ((2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R) * t := by + gcongr + _ = (2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R * t := by ring + have hlL_eq : (1 / 2) * L ^ (σ - 1) = l := by + have hconst_pow : + ((2 * Real.sqrt D) ^ (1 / (1 - σ))) ^ (σ - 1) = (2 * Real.sqrt D) ^ (-1 : ℝ) := by + rw [← Real.rpow_mul (show 0 ≤ 2 * Real.sqrt D by positivity)] + congr 2 + field_simp [sub_ne_zero.mpr hσ₁.ne.symm] + ring + have hsqrtR_pow : + (Real.sqrt R) ^ (σ - 1) = R ^ ((σ - 1) / 2) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_mul hR_nonneg] + congr 1 + ring + calc + (1 / 2) * L ^ (σ - 1) + = (1 / 2) * + (((2 * Real.sqrt D) ^ (1 / (1 - σ)) * (Real.sqrt R * t))) ^ (σ - 1) := by + simp [L, mul_assoc] + _ = (1 / 2) * + ((2 * Real.sqrt D) ^ (1 / (1 - σ))) ^ (σ - 1) * + (Real.sqrt R * t) ^ (σ - 1) := by + rw [Real.mul_rpow (by positivity) (by positivity)] + ring + _ = (1 / 2) * (2 * Real.sqrt D) ^ (-1 : ℝ) * (Real.sqrt R * t) ^ (σ - 1) := by + rw [hconst_pow] + _ = (1 / 2) * (1 / (2 * Real.sqrt D)) * + ((Real.sqrt R) ^ (σ - 1) * t ^ (σ - 1)) := by + rw [Real.rpow_neg_one, inv_eq_one_div, Real.mul_rpow hsqrtR_nonneg ht_nonneg] + _ = l := by + rw [hsqrtR_pow] + dsimp [l] + ring_nf + have hlL : l ≤ (1 / 2) * L ^ (σ - 1) := by + rw [hlL_eq] + have htail := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) + (a := B * Real.sqrt R * t) (l := l) (L := L) + h_indep h_meas h_int h_mean hσ₀ hσ₁ hX hl_nonneg hl_one hL_one hlL + have hmgf : + Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + ≤ Real.exp (-2 * t ^ σ) := by + apply (Real.exp_le_exp).2 + have hRpow : R ^ ((σ - 1) / 2) * Real.sqrt R = R ^ (σ / 2) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_add hR_pos] + congr 1 + ring + have htpow : t ^ (σ - 1) * t = t ^ σ := by + calc + t ^ (σ - 1) * t = t ^ (σ - 1) * t ^ (1 : ℝ) := by rw [Real.rpow_one] + _ = t ^ σ := by + rw [← Real.rpow_add ht_pos] + congr 1 + ring + have hla : l * (B * Real.sqrt R * t) = 4 * S := by + calc + l * (B * Real.sqrt R * t) + = (R ^ ((σ - 1) / 2) * t ^ (σ - 1) / (4 * Real.sqrt D)) * + (16 * Real.sqrt D * Real.sqrt R * t) := by + dsimp [l, B, gammaSigmaHeavyTailConst] + _ = 4 * (R ^ ((σ - 1) / 2) * Real.sqrt R) * (t ^ (σ - 1) * t) := by + field_simp [hsqrtD_pos.ne'] + ring + _ = 4 * S := by + rw [hRpow, htpow] + ring + have hquad : R * (l ^ (2 : ℕ) * D) = (1 / 16 : ℝ) * (R ^ σ * t ^ (2 * σ - 2)) := by + have hRpow_sq : + (R ^ ((σ - 1) / 2)) ^ (2 : ℕ) = R ^ (σ - 1) := by + rw [show (2 : ℝ) = (2 : ℕ) by norm_num, ← Real.rpow_natCast, ← Real.rpow_mul hR_nonneg] + congr 1 + ring + have htpow_sq : + (t ^ (σ - 1)) ^ (2 : ℕ) = t ^ (2 * σ - 2) := by + rw [show (2 : ℝ) = (2 : ℕ) by norm_num, ← Real.rpow_natCast, ← Real.rpow_mul ht_nonneg] + congr 1 + ring + have hR_sigma : R * R ^ (σ - 1) = R ^ σ := by + calc + R * R ^ (σ - 1) = R ^ (1 : ℝ) * R ^ (σ - 1) := by rw [Real.rpow_one] + _ = R ^ σ := by + rw [← Real.rpow_add hR_pos] + congr 1 + ring + dsimp [l] + field_simp [hsqrtD_pos.ne', pow_two] + rw [Real.sq_sqrt hD_pos.le, hRpow_sq, htpow_sq] + rw [hR_sigma] + ring_nf + have hscale : + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) + ≤ -4 * S + (1 / 16 : ℝ) * S := by + calc + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) + = -(l * (B * Real.sqrt R * t)) + R * (l ^ (2 : ℕ) * D) := by ring + _ = -(4 : ℝ) * S + (1 / 16 : ℝ) * (R ^ σ * t ^ (2 * σ - 2)) := by + rw [hla, hquad] + ring + _ ≤ -(4 : ℝ) * S + (1 / 16 : ℝ) * S := by + have hcorr : + R ^ σ * t ^ (2 * σ - 2) ≤ S := by + simpa [S] using + largeRegime_correction_le_gammaSigmaScale (σ := σ) (R := R) (t := t) + hσ₀ hσ₁ hR_pos ht_pos (by simpa [R] using hlarge) + have hscaled : + (1 / 16 : ℝ) * (R ^ σ * t ^ (2 * σ - 2)) ≤ + (1 / 16 : ℝ) * S := by + exact mul_le_mul_of_nonneg_left hcorr (by norm_num) + linarith + calc + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) + ≤ -4 * S + (1 / 16 : ℝ) * S := hscale + _ = (-(63 / 16 : ℝ)) * S := by ring + _ ≤ -(2 : ℝ) * S := + mul_le_mul_of_nonneg_right + (by norm_num : (-(63 / 16 : ℝ)) ≤ -2) hS_nonneg + _ ≤ -(2 : ℝ) * t ^ σ := by + have hscaled : + (2 : ℝ) * t ^ σ ≤ (2 : ℝ) * S := by + exact mul_le_mul_of_nonneg_left hS_tpow (by positivity) + have hneg := neg_le_neg hscaled + simpa [two_mul] using hneg + have hx_card : + R ^ (σ / (2 - σ)) ≤ S := by + simpa [S] using + largeRegime_cardPow_le_gammaSigmaScale (σ := σ) (R := R) (t := t) + hσ₀ hσ₁ hR_pos ht_pos (by simpa [R] using hlarge) + have hLpow : + L ^ σ = gammaSigmaHeavyTailUnionConst σ * S := by + have hq_eq : (1 / (1 - σ)) * σ = q := by + dsimp [q] + field_simp [sub_ne_zero.mpr hσ₁.ne.symm] + have hsqrtR_sigma : (Real.sqrt R) ^ σ = R ^ (σ / 2) := by + rw [Real.sqrt_eq_rpow, ← Real.rpow_mul hR_nonneg] + congr 1 + ring + calc + L ^ σ + = (((2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R * t) ^ σ) := by + simp [L] + _ = (((2 * Real.sqrt D) ^ (1 / (1 - σ)) * Real.sqrt R) ^ σ) * t ^ σ := by + rw [Real.mul_rpow (by positivity) ht_nonneg] + _ = ((2 * Real.sqrt D) ^ (1 / (1 - σ))) ^ σ * (Real.sqrt R) ^ σ * t ^ σ := by + rw [Real.mul_rpow (by positivity) hsqrtR_nonneg] + _ = (2 * Real.sqrt D) ^ q * (R ^ (σ / 2) * t ^ σ) := by + rw [← Real.rpow_mul (show 0 ≤ 2 * Real.sqrt D by positivity)] + rw [hsqrtR_sigma] + rw [hq_eq] + simp [mul_assoc, mul_comm] + _ = gammaSigmaHeavyTailUnionConst σ * S := by + rfl + have hunion : + R * Real.exp (-(L ^ σ)) ≤ Real.exp (-2 * t ^ σ) := by + rw [hLpow] + calc + R * Real.exp (-(gammaSigmaHeavyTailUnionConst σ * S)) + ≤ Real.exp (-2 * S) := by + exact card_mul_exp_neg_gammaSigmaHeavyTailUnionConst_mul_le_exp_neg_two_mul + (σ := σ) (R := R) (x := S) hσ₀ hσ₁ hR_one hS_nonneg hx_card + _ ≤ Real.exp (-2 * t ^ σ) := by + have hscaled : + (2 : ℝ) * t ^ σ ≤ (2 : ℝ) * S := + mul_le_mul_of_nonneg_left hS_tpow (by norm_num) + have hneg := neg_le_neg hscaled + exact (Real.exp_le_exp).2 (by + simpa [mul_comm, mul_left_comm, mul_assoc] using hneg) + have htail' : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * t)) ≤ + Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + + R * Real.exp (-(L ^ σ)) := by + simpa [B, R] using htail + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * t)) + ≤ Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + + R * Real.exp (-(L ^ σ)) := htail' + _ ≤ Real.exp (-2 * t ^ σ) + Real.exp (-2 * t ^ σ) := by + exact add_le_add hmgf hunion + _ = 2 * Real.exp (-2 * t ^ σ) := by ring + _ ≤ Real.exp (-(t ^ σ)) := by + exact two_mul_exp_neg_two_mul_le_exp_neg + (x := t ^ σ) (Real.one_le_rpow ht hσ₀.le) + +/-- One-sided heavy-tail concentration for centered independent unit-scale +`O_{Γ_σ}` summands on the range `0 < σ < 1`. -/ +theorem isBigOWith_gammaSigma_finset_sum_unit_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) 1) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigOWith μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ)) := by + rw [isBigOWith_gammaSigma_iff] + intro t ht + by_cases hsmall : t ≤ (s.card : ℝ) ^ (σ / (2 * (2 - σ))) + · simpa [mul_assoc, mul_left_comm, mul_comm] using + measureReal_upperTailEvent_finset_sum_le_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one_unit_smallRegime + (μ := μ) (X := X) (s := s) (σ := σ) (t := t) + h_indep h_meas hs hσ₀ hσ₁ hX h_mean ht hsmall + · have hlarge : (s.card : ℝ) ^ (σ / (2 * (2 - σ))) ≤ t := le_of_not_ge hsmall + simpa [mul_assoc, mul_left_comm, mul_comm] using + measureReal_upperTailEvent_finset_sum_le_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one_unit_largeRegime + (μ := μ) (X := X) (s := s) (σ := σ) (t := t) + h_indep h_meas hs hσ₀ hσ₁ hX h_mean ht hlarge + +/-- One-sided heavy-tail concentration for centered independent `O_{Γ_σ}` +summands on the range `0 < σ < 1`. -/ +theorem isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigOWith μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * K) := by + let Y : ι → Ω → ℝ := fun i ω => K⁻¹ * X i ω + have h_indep_Y : iIndepFun Y μ := by + simpa [Y, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => K⁻¹ * x) + (fun _ => measurable_const.mul measurable_id) + have h_meas_Y : ∀ i, Measurable (Y i) := by + intro i + simpa [Y, mul_comm] using (h_meas i).const_mul K⁻¹ + have hX_Y : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Y i) 1 := by + intro i hi + have hscaled := + IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) (X := X i) (A := K) (c := K⁻¹) + (inv_nonneg.mpr hK.le) (hX i hi) + have hscale : K⁻¹ * K = (1 : ℝ) := by + field_simp [hK.ne'] + simpa [Y, hscale] using hscaled + have h_mean_Y : ∀ i ∈ s, ∫ ω, Y i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Y i ω ∂μ = K⁻¹ * ∫ ω, X i ω ∂μ := by + simpa [Y] using integral_const_mul K⁻¹ (X i) + _ = 0 := by rw [h_mean i hi]; ring + have hsum_Y := + isBigOWith_gammaSigma_finset_sum_unit_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := Y) (s := s) (σ := σ) + h_indep_Y h_meas_Y hs hσ₀ hσ₁ hX_Y h_mean_Y + have hsum_X := + IsBigOWith.const_mul (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => ∑ i ∈ s, Y i ω) + (A := gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ)) + (c := K) hK.le hsum_Y + have hk : K * K⁻¹ = (1 : ℝ) := by + field_simp [hK.ne'] + have hsum_eq : + (fun ω => K * ∑ i ∈ s, Y i ω) = fun ω => ∑ i ∈ s, X i ω := by + funext ω + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i hi + dsimp [Y] + rw [← mul_assoc, hk, one_mul] + simpa [hsum_eq, mul_assoc, mul_left_comm, mul_comm] using hsum_X + +/-- Symmetric heavy-tail concentration for centered independent `O_{Γ_σ}` +summands on the range `0 < σ < 1`. -/ +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailEndpointConst σ * Real.sqrt (s.card : ℝ) * K) := by + let C : ℝ := (2 : ℝ) ^ (1 / σ) + let A : ℝ := gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * K + rw [isBigO_gammaSigma_iff] + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hC_one : 1 ≤ C := by + dsimp [C] + exact Real.one_le_rpow (by norm_num : 1 ≤ (2 : ℝ)) (by positivity : 0 ≤ 1 / σ) + have hCt : 1 ≤ C * t := by + simpa using + mul_le_mul hC_one ht (by norm_num : 0 ≤ (1 : ℝ)) hC_nonneg + have hC_pow : C ^ σ = 2 := by + dsimp [C] + rw [one_div, Real.rpow_inv_rpow (show 0 ≤ (2 : ℝ) by norm_num) hσ₀.ne'] + have hCt_pow : (C * t) ^ σ = 2 * t ^ σ := by + calc + (C * t) ^ σ = C ^ σ * t ^ σ := by + rw [Real.mul_rpow hC_nonneg ht_nonneg] + _ = 2 * t ^ σ := by + rw [hC_pow] + have hfinal : 2 * Real.exp (-(2 * t ^ σ)) ≤ Real.exp (-(t ^ σ)) := by + simpa [mul_comm, mul_left_comm, mul_assoc, neg_mul] using + (two_mul_exp_neg_two_mul_le_exp_neg (x := t ^ σ) (Real.one_le_rpow ht hσ₀.le)) + have hsum : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t)) ⊆ + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (C * t)) := by + intro ω hω + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by + simpa [A, absTailEvent, upperTailEvent, mul_assoc, mul_left_comm, mul_comm] using hω) + have hupper : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t))) ≤ + Real.exp (-((C * t) ^ σ)) := by + have hone := + isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₀ hσ₁ hK hX h_mean + simpa [A] using + (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := A) (σ := σ)).1 hone hCt + let Xneg : ι → Ω → ℝ := fun i ω => -X i ω + have h_indep_neg : iIndepFun Xneg μ := by + simpa [Xneg, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => -x) (fun _ => measurable_neg) + have h_meas_neg : ∀ i, Measurable (Xneg i) := by + intro i + simpa [Xneg] using h_meas i + have hX_neg : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Xneg i) K := by + intro i hi + simpa [Xneg] using (hX i hi).neg + have h_mean_neg : ∀ i ∈ s, ∫ ω, Xneg i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Xneg i ω ∂μ = -∫ ω, X i ω ∂μ := by + simpa [Xneg] using integral_neg (X i) + _ = 0 := by rw [h_mean i hi, neg_zero] + have hupper_neg : + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (C * t))) ≤ + Real.exp (-((C * t) ^ σ)) := by + have hone := + isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := Xneg) (s := s) (σ := σ) (K := K) + h_indep_neg h_meas_neg hs hσ₀ hσ₁ hK hX_neg h_mean_neg + simpa [Xneg, Finset.sum_apply, A] using + (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, Xneg i ω) + (A := A) (σ := σ)).1 hone hCt + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) + ((gammaSigmaHeavyTailEndpointConst σ * Real.sqrt (s.card : ℝ) * K) * t)) + = μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t))) := by + congr 1 + simp [A, C, gammaSigmaHeavyTailEndpointConst, mul_assoc, mul_left_comm, mul_comm] + _ ≤ μ.real + (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (C * t))) := by + exact measureReal_mono hsum + _ ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (C * t))) + + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (C * t))) := by + exact measureReal_union_le _ _ + _ ≤ Real.exp (-((C * t) ^ σ)) + Real.exp (-((C * t) ^ σ)) := by + exact add_le_add hupper hupper_neg + _ = 2 * Real.exp (-(2 * t ^ σ)) := by + rw [hCt_pow] + ring + _ ≤ Real.exp (-(t ^ σ)) := by + exact hfinal + +/-- Averaging preserves the heavy-tail `Γ_σ` concentration scale in the range +`0 < σ < 1`. -/ +theorem isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailEndpointConst σ * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + have hsum := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ₀ hσ₁ hK hX h_mean + have hcard_inv_nonneg : 0 ≤ ((s.card : ℝ)⁻¹) := by positivity + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := gammaSigmaHeavyTailEndpointConst σ * Real.sqrt (s.card : ℝ) * K) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/Preliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/Preliminaries.lean new file mode 100644 index 0000000000..3052f50a32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/Preliminaries.lean @@ -0,0 +1,478 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration + +/-! # Preliminaries -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Explicit upper bound for the Chapter 4 tail integral +`∫_1^∞ t e^{-t^σ} dt`. We use the full `(0, ∞)` Gamma-integral value because +it is simpler to package and still sufficient for the generic heavy-tail +backend. -/ +noncomputable def gammaSigmaTailIntegralConst (σ : ℝ) : ℝ := + (1 / σ) * Real.Gamma (2 / σ) + +/-- Explicit logarithmic-control constant for the `Γ_σ` specialization. -/ +noncomputable def gammaSigmaLogControlConst (σ : ℝ) : ℝ := + Real.exp (32 / σ ^ (2 : ℕ)) + +/-- Rounded scalar constant appearing in the specialized `Γ_σ` heavy-tail mgf +bound after feeding `gammaSigmaTailIntegralConst` and +`gammaSigmaLogControlConst` into the generic rounded backend. -/ +noncomputable def gammaSigmaHeavyTailRoundedConst (σ : ℝ) : ℝ := + 3 + gammaSigmaLogControlConst σ + gammaSigmaTailIntegralConst σ + +/-- Auxiliary union-term constant for the corrected small-`σ` Chapter 4 +concentration split. -/ +noncomputable def gammaSigmaHeavyTailUnionConst (σ : ℝ) : ℝ := + (2 * Real.sqrt (gammaSigmaHeavyTailRoundedConst σ)) ^ (σ / (1 - σ)) + +/-- Explicit one-sided `sqrt(card)` scale for the heavy-tail `Γ_σ` +concentration theorem on the range `σ ∈ (0, 1)`. -/ +noncomputable def gammaSigmaHeavyTailConst (σ : ℝ) : ℝ := + 16 * Real.sqrt (gammaSigmaHeavyTailRoundedConst σ) + +/-- Symmetric `sqrt(card)` scale for the heavy-tail `Γ_σ` concentration theorem +on the range `σ ∈ (0, 1)`. The factor `2^(1/σ)` absorbs the two-sided tail +union. -/ +noncomputable def gammaSigmaHeavyTailEndpointConst (σ : ℝ) : ℝ := + (2 : ℝ) ^ (1 / σ) * gammaSigmaHeavyTailConst σ + +lemma gammaSigmaTailIntegralConst_nonneg {σ : ℝ} (hσ : 0 < σ) : + 0 ≤ gammaSigmaTailIntegralConst σ := by + dsimp [gammaSigmaTailIntegralConst] + exact mul_nonneg (by positivity) (Real.Gamma_nonneg_of_nonneg (by positivity)) + +lemma gammaSigmaHeavyTailRoundedConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaSigmaHeavyTailRoundedConst σ := by + have hlog_one : 1 ≤ gammaSigmaLogControlConst σ := by + have hnonneg : 0 ≤ 32 / σ ^ (2 : ℕ) := by + exact div_nonneg (by positivity) (pow_two_nonneg σ) + simpa [gammaSigmaLogControlConst] using Real.one_le_exp hnonneg + dsimp [gammaSigmaHeavyTailRoundedConst] + nlinarith [gammaSigmaTailIntegralConst_nonneg hσ, hlog_one] + +lemma one_le_gammaSigmaLogControlConst (σ : ℝ) : + 1 ≤ gammaSigmaLogControlConst σ := by + have hnonneg : 0 ≤ 32 / σ ^ (2 : ℕ) := by + exact div_nonneg (by positivity) (pow_two_nonneg σ) + simpa [gammaSigmaLogControlConst] using Real.one_le_exp hnonneg + +lemma two_add_two_div_le_gammaSigmaHeavyTailUnionConst + {σ : ℝ} (hσ₀ : 0 < σ) (hσ₁ : σ < 1) : + 2 + 2 / σ ≤ gammaSigmaHeavyTailUnionConst σ := by + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let q : ℝ := σ / (1 - σ) + have hD_pos : 0 < D := by + simpa [D] using gammaSigmaHeavyTailRoundedConst_pos (σ := σ) hσ₀ + have hD_ge_log : gammaSigmaLogControlConst σ ≤ D := by + dsimp [D, gammaSigmaHeavyTailRoundedConst] + nlinarith [gammaSigmaTailIntegralConst_nonneg (σ := σ) hσ₀, + one_le_gammaSigmaLogControlConst σ] + have hσ_ne : σ ≠ 0 := hσ₀.ne' + have hone_sub_ne : 1 - σ ≠ 0 := sub_ne_zero.mpr hσ₁.ne.symm + have hq_pos : 0 < q := by + dsimp [q] + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + exact div_pos hσ₀ hone_sub_pos + have hsqrt_lower : Real.exp (16 / σ ^ (2 : ℕ)) ≤ Real.sqrt D := by + calc + Real.exp (16 / σ ^ (2 : ℕ)) + = Real.sqrt (gammaSigmaLogControlConst σ) := by + rw [gammaSigmaLogControlConst, Real.sqrt_eq_rpow] + rw [show (16 / σ ^ (2 : ℕ)) = (32 / σ ^ (2 : ℕ)) * (1 / 2 : ℝ) by + field_simp [hσ_ne] + ring] + rw [Real.exp_mul] + _ ≤ Real.sqrt D := Real.sqrt_le_sqrt hD_ge_log + have hbase_lower : Real.exp (16 / σ ^ (2 : ℕ)) ≤ 2 * Real.sqrt D := by + calc + Real.exp (16 / σ ^ (2 : ℕ)) ≤ Real.sqrt D := hsqrt_lower + _ ≤ 2 * Real.sqrt D := by nlinarith [Real.sqrt_nonneg D] + have hunion_lower : + Real.exp (16 / (σ * (1 - σ))) ≤ gammaSigmaHeavyTailUnionConst σ := by + calc + Real.exp (16 / (σ * (1 - σ))) + = (Real.exp (16 / σ ^ (2 : ℕ))) ^ q := by + dsimp [q] + rw [← Real.exp_mul] + congr 1 + field_simp [hσ_ne, hone_sub_ne] + _ ≤ (2 * Real.sqrt D) ^ q := by + exact Real.rpow_le_rpow (by positivity) hbase_lower hq_pos.le + _ = gammaSigmaHeavyTailUnionConst σ := by + rfl + have hone_inv : 1 ≤ 1 / σ := by + simpa [one_div] using (one_le_inv₀ hσ₀).2 hσ₁.le + have htwo_le_exp : (2 : ℝ) ≤ Real.exp (1 / σ) := by + have htwo_exp_one : (2 : ℝ) < Real.exp 1 := by + exact lt_trans (by norm_num) Real.exp_one_gt_d9 + exact le_trans htwo_exp_one.le ((Real.exp_le_exp).2 hone_inv) + have hone_add_le_exp : 1 + 1 / σ ≤ Real.exp (1 / σ) := by + simpa [add_comm] using Real.add_one_le_exp (1 / σ) + have htwo_add_le_exp : 2 + 2 / σ ≤ Real.exp (2 / σ) := by + calc + 2 + 2 / σ = 2 * (1 + 1 / σ) := by ring + _ ≤ Real.exp (1 / σ) * Real.exp (1 / σ) := by + gcongr + _ = Real.exp (2 / σ) := by + rw [← Real.exp_add] + congr 1 + ring + have hexp_mono : + Real.exp (2 / σ) ≤ Real.exp (16 / (σ * (1 - σ))) := by + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + have hone_sub_inv : 1 ≤ (1 - σ)⁻¹ := by + have hone_sub_le_one : 1 - σ ≤ 1 := by linarith + exact (one_le_inv₀ hone_sub_pos).2 hone_sub_le_one + have hineq : + 2 / σ ≤ 16 / (σ * (1 - σ)) := by + have htwo_sixteen : (2 : ℝ) ≤ 16 := by norm_num + calc + 2 / σ = 2 * (1 / σ) := by ring + _ ≤ 16 * (1 / σ) := by + exact mul_le_mul_of_nonneg_right htwo_sixteen (by positivity) + _ = (16 * (1 / σ)) * 1 := by ring + _ ≤ (16 * (1 / σ)) * (1 - σ)⁻¹ := by + gcongr + _ = 16 / (σ * (1 - σ)) := by + field_simp [hσ_ne, hone_sub_ne] + exact (Real.exp_le_exp).2 hineq + exact htwo_add_le_exp.trans (le_trans hexp_mono hunion_lower) + +/-- The concrete logarithmic control from the Chapter 4 notes, with an explicit +choice of constant that is convenient in Lean. -/ +theorem four_mul_log_le_half_rpow_add_log_gammaSigmaLogControlConst + {σ t : ℝ} (hσ : 0 < σ) (ht : 1 ≤ t) : + 4 * Real.log t ≤ (1 / 2) * t ^ σ + Real.log (gammaSigmaLogControlConst σ) := by + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hσ_half : 0 < σ / 2 := by positivity + have hlog : + Real.log t ≤ t ^ (σ / 2) / (σ / 2) := by + exact Real.log_le_rpow_div ht0 hσ_half + have hlog' : 4 * Real.log t ≤ (8 / σ) * t ^ (σ / 2) := by + have hσ_ne : σ ≠ 0 := hσ.ne' + have hlog'' : Real.log t ≤ (2 / σ) * t ^ (σ / 2) := by + have hrewrite : t ^ (σ / 2) / (σ / 2) = (2 / σ) * t ^ (σ / 2) := by + field_simp [hσ_ne] + rw [hrewrite] at hlog + exact hlog + have hscaled := mul_le_mul_of_nonneg_left hlog'' (by positivity : 0 ≤ (4 : ℝ)) + ring_nf at hscaled ⊢ + exact hscaled + have hpow : (t ^ (σ / 2)) ^ (2 : ℕ) = t ^ σ := by + rw [show (2 : ℝ) = (2 : ℕ) by norm_num, ← Real.rpow_natCast, ← Real.rpow_mul ht0] + ring_nf + have hquad : (8 / σ) * t ^ (σ / 2) ≤ (1 / 2) * t ^ σ + 32 / σ ^ (2 : ℕ) := by + have hσ_ne : σ ≠ 0 := hσ.ne' + let u : ℝ := t ^ (σ / 2) + have hsquare : 0 ≤ (σ * u - 8) ^ (2 : ℕ) := by + dsimp [u] + positivity + have hu_sq : u ^ (2 : ℕ) = t ^ σ := by + dsimp [u] + exact hpow + have hquad' : 16 * σ * u ≤ σ ^ (2 : ℕ) * t ^ σ + 64 := by + have htmp := hsquare + rw [pow_two] at htmp + ring_nf at htmp + rw [hu_sq] at htmp + nlinarith + calc + (8 / σ) * t ^ (σ / 2) + = (16 * σ * u) / (2 * σ ^ (2 : ℕ)) := by + dsimp [u] + field_simp [hσ_ne] + ring + _ ≤ (σ ^ (2 : ℕ) * t ^ σ + 64) / (2 * σ ^ (2 : ℕ)) := by + exact div_le_div_of_nonneg_right hquad' (by positivity) + _ = (1 / 2) * t ^ σ + 32 / σ ^ (2 : ℕ) := by + field_simp [hσ_ne] + ring + have hmain : + 4 * Real.log t ≤ (1 / 2) * t ^ σ + 32 / σ ^ (2 : ℕ) := by + exact hlog'.trans hquad + simpa [gammaSigmaLogControlConst] using hmain + +/-- The `Γ_σ` tail integral on `(1, ∞)` is controlled by the explicit Gamma +constant `gammaSigmaTailIntegralConst σ`. -/ +theorem lintegral_Ioi_one_gammaSigma_le_gammaSigmaTailIntegralConst + {σ : ℝ} (hσ : 0 < σ) : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / gammaSigma σ t) ∂volume ≤ + ENNReal.ofReal (gammaSigmaTailIntegralConst σ) := by + have hmono : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / gammaSigma σ t) ∂volume ≤ + ∫⁻ t in Set.Ioi 0, ENNReal.ofReal (t / gammaSigma σ t) ∂volume := by + refine lintegral_mono_set ?_ + intro t ht + simpa using (lt_trans zero_lt_one ht) + have hInt : + IntegrableOn (fun t : ℝ => t * Real.exp (-(t ^ σ))) (Set.Ioi 0) volume := by + convert + (integrableOn_rpow_mul_exp_neg_rpow_of_pos (σ := σ) (p := 2) hσ (by norm_num : 0 < (2 : ℝ))) + using 1 + ext t + rw [show (2 : ℝ) - 1 = (1 : ℝ) by norm_num, Real.rpow_one] + have hNonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi 0)] fun t : ℝ => t * Real.exp (-(t ^ σ)) := by + refine (ae_restrict_iff' measurableSet_Ioi).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + exact mul_nonneg (le_of_lt ht) (by positivity) + have hLin : + ∫⁻ t in Set.Ioi 0, ENNReal.ofReal (t * Real.exp (-(t ^ σ))) ∂volume = + ENNReal.ofReal (gammaSigmaTailIntegralConst σ) := by + have hEq : + ENNReal.ofReal (∫ t in Set.Ioi 0, t * Real.exp (-(t ^ σ)) ∂volume) = + ∫⁻ t in Set.Ioi 0, ENNReal.ofReal (t * Real.exp (-(t ^ σ))) ∂volume := by + simpa [IntegrableOn] using + (MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (μ := volume.restrict (Set.Ioi (0 : ℝ))) hInt hNonneg) + have hIntEq : + ∫ t in Set.Ioi 0, t * Real.exp (-(t ^ σ)) ∂volume = + gammaSigmaTailIntegralConst σ := by + have harg : (1 + 1) / σ = 2 / σ := by + ring + simpa [gammaSigmaTailIntegralConst, harg] using + (integral_rpow_mul_exp_neg_rpow hσ (by norm_num : -1 < (1 : ℝ))) + rw [← hEq] + rw [hIntEq] + calc + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / gammaSigma σ t) ∂volume + ≤ ∫⁻ t in Set.Ioi 0, ENNReal.ofReal (t / gammaSigma σ t) ∂volume := hmono + _ = ∫⁻ t in Set.Ioi 0, ENNReal.ofReal (t * Real.exp (-(t ^ σ))) ∂volume := by + congr with t + simp [gammaSigma, div_eq_mul_inv, ← Real.exp_neg] + _ = ENNReal.ofReal (gammaSigmaTailIntegralConst σ) := hLin + +/-- If `λ ≤ (1/2) L^(σ - 1)` and `1 ≤ t ≤ L`, then the deterministic part of +the `Γ_σ` logarithmic kernel constraint holds. -/ +theorem gammaSigma_log_constraint + {σ l L t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hlL : l ≤ (1 / 2) * L ^ (σ - 1)) + (ht : t ∈ Set.Icc 1 L) : + l * t ≤ Real.log (gammaSigma σ t) - 4 * Real.log t + + Real.log (gammaSigmaLogControlConst σ) := by + have ht0 : 0 ≤ t := le_trans zero_le_one ht.1 + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht.1 + have hL_pos : 0 < L := lt_of_lt_of_le zero_lt_one (le_trans ht.1 ht.2) + have hanti := Real.antitoneOn_rpow_Ioi_of_exponent_nonpos (show σ - 1 ≤ 0 by linarith) + have hpow_mono : L ^ (σ - 1) ≤ t ^ (σ - 1) := by + exact hanti (show t ∈ Set.Ioi (0 : ℝ) by exact ht_pos) + (show L ∈ Set.Ioi (0 : ℝ) by exact hL_pos) ht.2 + have hlt : l * t ≤ (1 / 2) * t ^ σ := by + calc + l * t ≤ ((1 / 2) * L ^ (σ - 1)) * t := by + gcongr + _ ≤ ((1 / 2) * t ^ (σ - 1)) * t := by + have hscaled : (1 / 2 : ℝ) * L ^ (σ - 1) ≤ (1 / 2 : ℝ) * t ^ (σ - 1) := by + exact mul_le_mul_of_nonneg_left hpow_mono (by positivity) + exact mul_le_mul_of_nonneg_right hscaled ht0 + _ = (1 / 2) * t ^ σ := by + rw [show ((1 / 2 : ℝ) * t ^ (σ - 1)) * t = (1 / 2 : ℝ) * (t ^ (σ - 1) * t) by ring] + congr 1 + calc + t ^ (σ - 1) * t = t ^ (σ - 1) * t ^ (1 : ℝ) := by rw [Real.rpow_one] + _ = t ^ σ := by + rw [← Real.rpow_add ht_pos] + congr 1 + ring + have hlog := + four_mul_log_le_half_rpow_add_log_gammaSigmaLogControlConst (σ := σ) (t := t) hσ₀ ht.1 + have hmain : l * t ≤ t ^ σ - 4 * Real.log t + Real.log (gammaSigmaLogControlConst σ) := by + nlinarith + simpa [gammaSigma] using hmain + +lemma smallRegime_sq_le_gammaSigmaTailPower + {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_pos : 0 < R) (ht_pos : 0 < t) + (hsmall : t ≤ R ^ (σ / (2 * (2 - σ)))) : + t ^ (2 : ℝ) ≤ (Real.sqrt R / t) ^ (σ / (1 - σ)) := by + let q : ℝ := σ / (1 - σ) + let γ : ℝ := σ / (2 * (2 - σ)) + have hR_nonneg : 0 ≤ R := hR_pos.le + have ht_nonneg : 0 ≤ t := ht_pos.le + have htwo_sub_ne : 2 - σ ≠ 0 := by linarith + have hq_nonneg : 0 ≤ q := by + dsimp [q] + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + exact div_nonneg hσ₀.le hone_sub_pos.le + have hgamma_q_two : γ * (q + 2) = q / 2 := by + have hone_sub_ne : 1 - σ ≠ 0 := sub_ne_zero.mpr hσ₁.ne.symm + dsimp [γ, q] + field_simp [hone_sub_ne, htwo_sub_ne] + nlinarith + have hq_two : + t ^ (q + 2) ≤ R ^ (q / 2) := by + calc + t ^ (q + 2) ≤ (R ^ γ) ^ (q + 2) := by + exact Real.rpow_le_rpow ht_nonneg hsmall (by positivity) + _ = R ^ (γ * (q + 2)) := by + rw [← Real.rpow_mul hR_nonneg] + _ = R ^ (q / 2) := by rw [hgamma_q_two] + have htq_pos : 0 < t ^ q := Real.rpow_pos_of_pos ht_pos q + have hpow_add : t ^ (2 : ℝ) * t ^ q = t ^ (q + 2) := by + rw [← Real.rpow_add ht_pos] + congr 1 + ring + have hdiv_eq : + (Real.sqrt R / t) ^ q = R ^ (q / 2) / t ^ q := by + calc + (Real.sqrt R / t) ^ q = (Real.sqrt R) ^ q / t ^ q := by + rw [Real.div_rpow (Real.sqrt_nonneg _) ht_nonneg] + _ = R ^ (q / 2) / t ^ q := by + congr 1 + rw [Real.sqrt_eq_rpow, ← Real.rpow_mul hR_nonneg] + congr 1 + ring_nf + rw [hdiv_eq] + have hmul : t ^ (2 : ℝ) * t ^ q ≤ R ^ (q / 2) := by + rw [hpow_add] + exact hq_two + exact (le_div_iff₀ htq_pos).2 hmul + +lemma smallRegime_cardPow_le_gammaSigmaTailPower + {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_pos : 0 < R) (ht_pos : 0 < t) + (hsmall : t ≤ R ^ (σ / (2 * (2 - σ)))) : + R ^ (σ / (2 - σ)) ≤ (Real.sqrt R / t) ^ (σ / (1 - σ)) := by + let q : ℝ := σ / (1 - σ) + let β : ℝ := σ / (2 - σ) + let γ : ℝ := σ / (2 * (2 - σ)) + have hR_nonneg : 0 ≤ R := hR_pos.le + have ht_nonneg : 0 ≤ t := ht_pos.le + have htwo_sub_ne : 2 - σ ≠ 0 := by linarith + have hq_nonneg : 0 ≤ q := by + dsimp [q] + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + exact div_nonneg hσ₀.le hone_sub_pos.le + have hgamma_q : γ * q = q / 2 - β := by + have hone_sub_ne : 1 - σ ≠ 0 := sub_ne_zero.mpr hσ₁.ne.symm + dsimp [γ, q, β] + field_simp [hone_sub_ne, htwo_sub_ne] + nlinarith + have htq_le : + t ^ q ≤ R ^ (q / 2 - β) := by + calc + t ^ q ≤ (R ^ γ) ^ q := by + exact Real.rpow_le_rpow ht_nonneg hsmall hq_nonneg + _ = R ^ (γ * q) := by + rw [← Real.rpow_mul hR_nonneg] + _ = R ^ (q / 2 - β) := by rw [hgamma_q] + have hβ_nonneg : 0 ≤ R ^ β := Real.rpow_nonneg hR_nonneg β + have htq_pos : 0 < t ^ q := Real.rpow_pos_of_pos ht_pos q + have hmul : + R ^ β * t ^ q ≤ R ^ (q / 2) := by + calc + R ^ β * t ^ q ≤ R ^ β * R ^ (q / 2 - β) := by + gcongr + _ = R ^ (q / 2) := by + rw [← Real.rpow_add hR_pos] + congr 1 + ring + have hdiv_eq : + (Real.sqrt R / t) ^ q = R ^ (q / 2) / t ^ q := by + calc + (Real.sqrt R / t) ^ q = (Real.sqrt R) ^ q / t ^ q := by + rw [Real.div_rpow (Real.sqrt_nonneg _) ht_nonneg] + _ = R ^ (q / 2) / t ^ q := by + congr 1 + rw [Real.sqrt_eq_rpow, ← Real.rpow_mul hR_nonneg] + congr 1 + ring_nf + rw [hdiv_eq] + exact (le_div_iff₀ htq_pos).2 hmul + +lemma largeRegime_cardPow_le_gammaSigmaScale + {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_pos : 0 < R) (ht_pos : 0 < t) + (hlarge : R ^ (σ / (2 * (2 - σ))) ≤ t) : + R ^ (σ / (2 - σ)) ≤ R ^ (σ / 2) * t ^ σ := by + let γ : ℝ := σ / (2 * (2 - σ)) + let β : ℝ := σ / (2 - σ) + have hR_nonneg : 0 ≤ R := hR_pos.le + have ht_nonneg : 0 ≤ t := ht_pos.le + have hσ_nonneg : 0 ≤ σ := hσ₀.le + have htwo_sub_ne : 2 - σ ≠ 0 := by linarith + have hgamma_sigma : σ / 2 + γ * σ = β := by + dsimp [γ, β] + field_simp [htwo_sub_ne] + ring + have hpow : + R ^ (γ * σ) ≤ t ^ σ := by + have hpow' : (R ^ γ) ^ σ ≤ t ^ σ := by + exact Real.rpow_le_rpow (Real.rpow_nonneg hR_nonneg _) hlarge hσ_nonneg + simpa [Real.rpow_mul hR_nonneg] using hpow' + calc + R ^ β = R ^ (σ / 2 + γ * σ) := by rw [hgamma_sigma] + _ = R ^ (σ / 2) * R ^ (γ * σ) := by + rw [Real.rpow_add hR_pos] + _ ≤ R ^ (σ / 2) * t ^ σ := by + gcongr + +lemma largeRegime_correction_le_gammaSigmaScale + {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_pos : 0 < R) (ht_pos : 0 < t) + (hlarge : R ^ (σ / (2 * (2 - σ))) ≤ t) : + R ^ σ * t ^ (2 * σ - 2) ≤ R ^ (σ / 2) * t ^ σ := by + let γ : ℝ := σ / (2 * (2 - σ)) + have hR_nonneg : 0 ≤ R := hR_pos.le + have htwo_sub_pos : 0 < 2 - σ := by linarith + have htwo_sub_ne : 2 - σ ≠ 0 := by linarith + have hR_half_le : R ^ (σ / 2) ≤ t ^ (2 - σ) := by + calc + R ^ (σ / 2) = (R ^ γ) ^ (2 - σ) := by + dsimp [γ] + rw [← Real.rpow_mul hR_nonneg] + congr 1 + field_simp [htwo_sub_ne] + _ ≤ t ^ (2 - σ) := by + simpa [γ] using + Real.rpow_le_rpow (Real.rpow_nonneg hR_nonneg _) hlarge htwo_sub_pos.le + have hRσ : R ^ σ = R ^ (σ / 2) * R ^ (σ / 2) := by + rw [← Real.rpow_add hR_pos] + congr 1 + ring + calc + R ^ σ * t ^ (2 * σ - 2) + = R ^ (σ / 2) * (R ^ (σ / 2) * t ^ (2 * σ - 2)) := by + rw [hRσ] + ring + _ ≤ R ^ (σ / 2) * (t ^ (2 - σ) * t ^ (2 * σ - 2)) := by + gcongr + _ = R ^ (σ / 2) * t ^ σ := by + congr 1 + rw [← Real.rpow_add ht_pos] + congr 1 + ring + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/SmallRegime.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/SmallRegime.lean new file mode 100644 index 0000000000..ad42b818e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaConcentration/SmallRegime.lean @@ -0,0 +1,489 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaConcentration.Preliminaries + +/-! # Small Regime -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Specialized rounded heavy-tail concentration estimate for `Γ_σ` on the +range `σ ∈ (0, 1)`. This is the concrete `Γ_σ` wrapper around the generic +rounded truncation-Chernoff theorem from `PsiConcentration.lean`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ a l L : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) + (hlL : l ≤ (1 / 2) * L ^ (σ - 1)) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * gammaSigmaHeavyTailRoundedConst σ)) + + (s.card : ℝ) * Real.exp (-(L ^ σ)) := by + have hmain := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (Ψ := gammaSigma σ) (X := X) (s := s) (a := a) (l := l) (L := L) + (CΨ := gammaSigmaTailIntegralConst σ) (M := gammaSigmaLogControlConst σ) + h_indep h_meas h_int h_mean + (admissiblePsi_gammaSigma hσ₀.le) + (gammaSigmaTailIntegralConst_nonneg hσ₀) + (lintegral_Ioi_one_gammaSigma_le_gammaSigmaTailIntegralConst hσ₀) + hX hl hl1 hL (one_le_gammaSigmaLogControlConst σ) ?_ + · simpa [gammaSigmaHeavyTailRoundedConst, gammaSigmaTailIntegralConst, + gammaSigmaLogControlConst, gammaSigma, ← Real.exp_neg] using hmain + · intro i hi t ht + exact gammaSigma_log_constraint (σ := σ) (l := l) (L := L) (t := t) + hσ₀ hσ₁ hlL ht + +/-- The rounded heavy-tail scale is uniformly at least `4`, so its square root +is at least `2`. -/ +lemma four_le_gammaSigmaHeavyTailRoundedConst {σ : ℝ} (hσ : 0 < σ) : + 4 ≤ gammaSigmaHeavyTailRoundedConst σ := by + dsimp [gammaSigmaHeavyTailRoundedConst] + linarith [gammaSigmaTailIntegralConst_nonneg (σ := σ) hσ, + one_le_gammaSigmaLogControlConst σ] + +lemma two_le_sqrt_gammaSigmaHeavyTailRoundedConst {σ : ℝ} (hσ : 0 < σ) : + 2 ≤ Real.sqrt (gammaSigmaHeavyTailRoundedConst σ) := by + have hfour : + (4 : ℝ) ≤ gammaSigmaHeavyTailRoundedConst σ := + four_le_gammaSigmaHeavyTailRoundedConst (σ := σ) hσ + have hsqrt : + Real.sqrt 4 ≤ Real.sqrt (gammaSigmaHeavyTailRoundedConst σ) := + Real.sqrt_le_sqrt hfour + have hsqrt4 : Real.sqrt (4 : ℝ) = 2 := by + rw [Real.sqrt_eq_iff_eq_sq (by norm_num : (0 : ℝ) ≤ 4) (by norm_num : (0 : ℝ) ≤ 2)] + norm_num + simpa [hsqrt4] using hsqrt + +lemma gammaSigmaHeavyTailConst_pos {σ : ℝ} (hσ : 0 < σ) : + 0 < gammaSigmaHeavyTailConst σ := by + dsimp [gammaSigmaHeavyTailConst] + exact mul_pos (by positivity) (Real.sqrt_pos.2 (gammaSigmaHeavyTailRoundedConst_pos hσ)) + +lemma heavyTail_rpow_choice_eq {σ l : ℝ} + (hσ₁ : σ < 1) (hl : 0 < l) : + let L : ℝ := (2 * l) ^ (-(1 / (1 - σ))) + (1 / 2) * L ^ (σ - 1) = l := by + let L : ℝ := (2 * l) ^ (-(1 / (1 - σ))) + have hbase_nonneg : 0 ≤ 2 * l := by positivity + have hone_sub_ne : 1 - σ ≠ 0 := sub_ne_zero.mpr hσ₁.ne.symm + calc + (1 / 2) * L ^ (σ - 1) + = (1 / 2) * ((2 * l) ^ (-(1 / (1 - σ)))) ^ (σ - 1) := by + rfl + _ = (1 / 2) * (2 * l) ^ ((-(1 / (1 - σ))) * (σ - 1)) := by + rw [← Real.rpow_mul hbase_nonneg] + _ = (1 / 2) * (2 * l) ^ (1 : ℝ) := by + congr 2 + field_simp [hone_sub_ne] + ring + _ = l := by + rw [Real.rpow_one] + ring + +lemma one_le_heavyTail_rpow_choice {σ l : ℝ} + (hσ₁ : σ < 1) (hl : 0 < l) (hl_half : l ≤ 1 / 2) : + 1 ≤ (2 * l) ^ (-(1 / (1 - σ))) := by + have hbase_le_one : 2 * l ≤ 1 := by + calc + 2 * l ≤ 2 * (1 / 2 : ℝ) := mul_le_mul_of_nonneg_left hl_half (by norm_num) + _ = 1 := by norm_num + have hexp_nonpos : -(1 / (1 - σ)) ≤ 0 := by + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + have hnonneg : 0 ≤ 1 / (1 - σ) := by positivity + exact neg_nonpos.mpr hnonneg + exact Real.one_le_rpow_of_pos_of_le_one_of_nonpos + (by positivity : 0 < 2 * l) hbase_le_one hexp_nonpos + +lemma card_mul_exp_neg_gammaSigmaHeavyTailUnionConst_mul_le_exp_neg_two_mul + {σ R x : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_one : 1 ≤ R) (hx_nonneg : 0 ≤ x) + (hcardPow : R ^ (σ / (2 - σ)) ≤ x) : + R * Real.exp (-(gammaSigmaHeavyTailUnionConst σ * x)) ≤ + Real.exp (-2 * x) := by + let β : ℝ := σ / (2 - σ) + have hR_pos : 0 < R := lt_of_lt_of_le zero_lt_one hR_one + have hβ_pos : 0 < β := by + dsimp [β] + have htwo_sub_pos : 0 < 2 - σ := by linarith + exact div_pos hσ₀ htwo_sub_pos + have hlog_le_pow_div : Real.log R ≤ R ^ β / β := by + simpa [β] using Real.log_le_rpow_div (show 0 ≤ R by linarith) hβ_pos + have hpow_div_le : R ^ β / β ≤ x / β := by + exact div_le_div_of_nonneg_right hcardPow hβ_pos.le + have hx_scaled : x / β ≤ (2 / σ) * x := by + have hcoef : + (2 - σ) / σ ≤ 2 / σ := by + have hσ_ne : σ ≠ 0 := hσ₀.ne' + field_simp [hσ_ne] + linarith + have hrewrite : x / β = ((2 - σ) / σ) * x := by + have htwo_sub_ne : 2 - σ ≠ 0 := by linarith + dsimp [β] + field_simp [hσ₀.ne', htwo_sub_ne] + rw [hrewrite] + exact mul_le_mul_of_nonneg_right hcoef hx_nonneg + have hlog_le_scaled : Real.log R ≤ (2 / σ) * x := by + exact hlog_le_pow_div.trans (hpow_div_le.trans hx_scaled) + have hR_le_exp : R ≤ Real.exp ((2 / σ) * x) := by + calc + R = Real.exp (Real.log R) := by rw [Real.exp_log hR_pos] + _ ≤ Real.exp ((2 / σ) * x) := by + exact (Real.exp_le_exp).2 hlog_le_scaled + have hU : + 2 + 2 / σ ≤ gammaSigmaHeavyTailUnionConst σ := + two_add_two_div_le_gammaSigmaHeavyTailUnionConst (σ := σ) hσ₀ hσ₁ + calc + R * Real.exp (-(gammaSigmaHeavyTailUnionConst σ * x)) + ≤ Real.exp ((2 / σ) * x) * + Real.exp (-(gammaSigmaHeavyTailUnionConst σ * x)) := by + exact mul_le_mul_of_nonneg_right hR_le_exp (by positivity) + _ = Real.exp (((2 / σ) - gammaSigmaHeavyTailUnionConst σ) * x) := by + rw [← Real.exp_add] + congr 1 + ring + _ ≤ Real.exp (-2 * x) := by + apply (Real.exp_le_exp).2 + have hcoef : (2 / σ) - gammaSigmaHeavyTailUnionConst σ ≤ -2 := by + linarith + exact mul_le_mul_of_nonneg_right hcoef hx_nonneg + +lemma two_mul_exp_neg_two_mul_le_exp_neg {x : ℝ} (hx : 1 ≤ x) : + 2 * Real.exp (-2 * x) ≤ Real.exp (-x) := by + have htwo_exp_one : (2 : ℝ) < Real.exp 1 := by + exact lt_trans (by norm_num) Real.exp_one_gt_d9 + have htwo_le_exp : (2 : ℝ) ≤ Real.exp x := by + have hexp_mono : Real.exp 1 ≤ Real.exp x := by + exact (Real.exp_le_exp).2 hx + exact le_trans htwo_exp_one.le hexp_mono + calc + 2 * Real.exp (-2 * x) ≤ Real.exp x * Real.exp (-2 * x) := by + exact mul_le_mul_of_nonneg_right htwo_le_exp (by positivity) + _ = Real.exp (-x) := by + rw [← Real.exp_add] + congr 1 + ring + +/-- The small-regime heavy-tail choice gives the desired quadratic mgf decay. -/ +lemma smallRegime_heavyTail_mgf_le {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) (hR_pos : 0 < R) (ht : 1 ≤ t) : + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let B : ℝ := gammaSigmaHeavyTailConst σ + let l : ℝ := t / (4 * Real.sqrt D * Real.sqrt R) + Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + ≤ Real.exp (-2 * t ^ σ) := by + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let B : ℝ := gammaSigmaHeavyTailConst σ + let l : ℝ := t / (4 * Real.sqrt D * Real.sqrt R) + have hD_pos : 0 < D := by + simpa [D] using gammaSigmaHeavyTailRoundedConst_pos (σ := σ) hσ₀ + have hsqrtD_pos : 0 < Real.sqrt D := Real.sqrt_pos.2 hD_pos + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have hsqrtR_sq : (Real.sqrt R) ^ (2 : ℕ) = R := by + simpa [pow_two] using Real.sq_sqrt hR_nonneg + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have ht_nonneg : 0 ≤ t := ht_pos.le + have htpow_sigma_le_two : t ^ σ ≤ t ^ (2 : ℝ) := by + have hσ_two : σ ≤ 2 := by linarith + exact Real.rpow_le_rpow_of_exponent_le ht hσ_two + apply (Real.exp_le_exp).2 + have hB_eq : B = 16 * Real.sqrt D := by + dsimp [B, D, gammaSigmaHeavyTailConst] + have hla : l * (B * Real.sqrt R * t) = 4 * t ^ (2 : ℕ) := by + rw [hB_eq] + dsimp [l] + field_simp [hsqrtR_pos.ne', hsqrtD_pos.ne', pow_two] + ring_nf + have hquad : R * (l ^ (2 : ℕ) * D) = t ^ (2 : ℕ) / 16 := by + dsimp [l] + field_simp [hsqrtR_pos.ne', hsqrtD_pos.ne', pow_two] + rw [hsqrtR_sq, Real.sq_sqrt hD_pos.le] + ring_nf + have hexpr : + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) = + -(4 * t ^ (2 : ℕ)) + t ^ (2 : ℕ) / 16 := by + calc + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) + = -(l * (B * Real.sqrt R * t)) + R * (l ^ (2 : ℕ) * D) := by ring + _ = -(4 * t ^ (2 : ℕ)) + t ^ (2 : ℕ) / 16 := by rw [hla, hquad] + calc + -l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D) + = -(4 * t ^ (2 : ℕ)) + t ^ (2 : ℕ) / 16 := hexpr + _ ≤ -(2 : ℝ) * t ^ (2 : ℕ) := by + have ht_sq_nonneg : 0 ≤ t ^ (2 : ℕ) := by positivity + calc + -(4 * t ^ (2 : ℕ)) + t ^ (2 : ℕ) / 16 + = -(2 : ℝ) * t ^ (2 : ℕ) - ((31 : ℝ) / 16) * t ^ (2 : ℕ) := by + ring + _ ≤ -(2 : ℝ) * t ^ (2 : ℕ) := + sub_le_self _ (mul_nonneg (by norm_num) ht_sq_nonneg) + _ ≤ -(2 : ℝ) * t ^ σ := by + have hscaled : + (2 : ℝ) * t ^ σ ≤ (2 : ℝ) * t ^ (2 : ℝ) := by + exact mul_le_mul_of_nonneg_left htpow_sigma_le_two (by positivity) + have hneg := neg_le_neg hscaled + simpa [two_mul, Real.rpow_natCast] using hneg + +/-- The small-regime heavy-tail cutoff gives the desired tail decay for the +union term. -/ +lemma smallRegime_heavyTail_union_le {σ R t : ℝ} + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hR_pos : 0 < R) (hR_one : 1 ≤ R) (ht : 1 ≤ t) + (hsmall : t ≤ R ^ (σ / (2 * (2 - σ)))) : + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let L : ℝ := ((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (1 / (1 - σ)) + R * Real.exp (-(L ^ σ)) ≤ Real.exp (-2 * t ^ σ) := by + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let q : ℝ := σ / (1 - σ) + let L : ℝ := ((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (1 / (1 - σ)) + have hD_pos : 0 < D := by + simpa [D] using gammaSigmaHeavyTailRoundedConst_pos (σ := σ) hσ₀ + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have ht_nonneg : 0 ≤ t := ht_pos.le + have htpow_sigma_le_two : t ^ σ ≤ t ^ (2 : ℝ) := by + have hσ_two : σ ≤ 2 := by linarith + exact Real.rpow_le_rpow_of_exponent_le ht hσ_two + let x : ℝ := (Real.sqrt R / t) ^ q + have hx_nonneg : 0 ≤ x := by + dsimp [x, q] + positivity + have hx_card : + R ^ (σ / (2 - σ)) ≤ x := by + simpa [x, q] using + smallRegime_cardPow_le_gammaSigmaTailPower (σ := σ) (R := R) (t := t) + hσ₀ hσ₁ hR_pos ht_pos hsmall + have hx_tpow : t ^ σ ≤ x := by + have hx_sq : + t ^ (2 : ℝ) ≤ x := by + simpa [x, q] using + smallRegime_sq_le_gammaSigmaTailPower (σ := σ) (R := R) (t := t) + hσ₀ hσ₁ hR_pos ht_pos hsmall + exact le_trans htpow_sigma_le_two hx_sq + have hLpow : + L ^ σ = gammaSigmaHeavyTailUnionConst σ * x := by + have hq_eq : (1 / (1 - σ)) * σ = q := by + dsimp [q] + field_simp [sub_ne_zero.mpr hσ₁.ne.symm] + calc + L ^ σ + = ((((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (1 / (1 - σ))) ^ σ) := by + rfl + _ = (((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ ((1 / (1 - σ)) * σ)) := by + rw [← Real.rpow_mul (show 0 ≤ (2 * Real.sqrt D) * (Real.sqrt R / t) by positivity)] + _ = (((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ q) := by rw [hq_eq] + _ = (2 * Real.sqrt D) ^ q * (Real.sqrt R / t) ^ q := by + rw [Real.mul_rpow (by positivity) (by positivity)] + _ = gammaSigmaHeavyTailUnionConst σ * x := by + dsimp [D, x, gammaSigmaHeavyTailUnionConst] + have hrewrite : + R * Real.exp (-(L ^ σ)) = + R * Real.exp (-(gammaSigmaHeavyTailUnionConst σ * x)) := by + simpa using congrArg (fun y => R * Real.exp (-y)) hLpow + calc + R * Real.exp (-(L ^ σ)) + = R * Real.exp (-(gammaSigmaHeavyTailUnionConst σ * x)) := hrewrite + _ + ≤ Real.exp (-2 * x) := by + exact card_mul_exp_neg_gammaSigmaHeavyTailUnionConst_mul_le_exp_neg_two_mul + (σ := σ) (R := R) (x := x) hσ₀ hσ₁ hR_one hx_nonneg hx_card + _ ≤ Real.exp (-2 * t ^ σ) := by + apply (Real.exp_le_exp).2 + have hscaled : (2 : ℝ) * t ^ σ ≤ (2 : ℝ) * x := + mul_le_mul_of_nonneg_left hx_tpow (by norm_num) + simpa [mul_comm, mul_left_comm, mul_assoc] using neg_le_neg hscaled + +/-- Small-regime one-sided heavy-tail concentration for centered independent +unit-scale `O_{Γ_σ}` summands. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one_unit_smallRegime + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ t : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₀ : 0 < σ) (hσ₁ : σ < 1) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) 1) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (ht : 1 ≤ t) + (hsmall : t ≤ (s.card : ℝ) ^ (σ / (2 * (2 - σ)))) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * t)) ≤ + Real.exp (-(t ^ σ)) := by + let R : ℝ := s.card + let D : ℝ := gammaSigmaHeavyTailRoundedConst σ + let B : ℝ := gammaSigmaHeavyTailConst σ + let q : ℝ := σ / (1 - σ) + have hR_pos : 0 < R := by + dsimp [R] + exact_mod_cast hs.card_pos + have hR_one : 1 ≤ R := by + dsimp [R] + exact_mod_cast (Nat.succ_le_of_lt hs.card_pos) + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have hsqrtR_nonneg : 0 ≤ Real.sqrt R := hsqrtR_pos.le + have hsqrtR_sq : (Real.sqrt R) ^ (2 : ℕ) = R := by + simpa [pow_two] using Real.sq_sqrt hR_nonneg + have hD_pos : 0 < D := by + simpa [D] using gammaSigmaHeavyTailRoundedConst_pos (σ := σ) hσ₀ + have hsqrtD_pos : 0 < Real.sqrt D := Real.sqrt_pos.2 hD_pos + have hsqrtD_two : 2 ≤ Real.sqrt D := by + simpa [D] using two_le_sqrt_gammaSigmaHeavyTailRoundedConst (σ := σ) hσ₀ + have hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (gammaMomentConst σ) := by + intro i hi + simpa [mul_assoc, mul_left_comm, mul_comm] using + (hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X i) (K := 1) (σ := σ) + hσ₀ zero_lt_one (h_meas i).aemeasurable (hX i hi)) + have h_int : ∀ i ∈ s, Integrable (X i) μ := by + intro i hi + have hXone := + gammaMomentGrowth_natCast_bound + (μ := μ) (X := X i) (σ := σ) (M := gammaMomentConst σ) (n := 1) + (by norm_num) (hXmom i hi) + have hX_abs_int : Integrable (fun ω => |X i ω|) μ := by + simpa using hXone.1 + have hX_norm_int : Integrable (fun ω => ‖X i ω‖) μ := by + simpa [Real.norm_eq_abs] using hX_abs_int + exact (integrable_norm_iff ((h_meas i).aemeasurable.aestronglyMeasurable)).1 hX_norm_int + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have ht_nonneg : 0 ≤ t := ht_pos.le + have htpow_sigma_le_two : t ^ σ ≤ t ^ (2 : ℝ) := by + have hσ_two : σ ≤ 2 := by linarith + exact Real.rpow_le_rpow_of_exponent_le ht hσ_two + let l : ℝ := t / (4 * Real.sqrt D * Real.sqrt R) + let L : ℝ := ((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (1 / (1 - σ)) + let x : ℝ := (Real.sqrt R / t) ^ q + have hl_nonneg : 0 ≤ l := by + dsimp [l] + positivity + have hγ_le_half : σ / (2 * (2 - σ)) ≤ (1 / 2 : ℝ) := by + have hden_pos : 0 < 2 * (2 - σ) := by + exact mul_pos (by norm_num) (by linarith) + refine (div_le_iff₀ hden_pos).2 ?_ + linarith + have ht_le_sqrtR : t ≤ Real.sqrt R := by + calc + t ≤ R ^ (σ / (2 * (2 - σ))) := by simpa [R] using hsmall + _ ≤ R ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le hR_one hγ_le_half + _ = Real.sqrt R := by rw [Real.sqrt_eq_rpow] + have hl_half : l ≤ 1 / 2 := by + dsimp [l] + have hbound : + t / (4 * Real.sqrt D * Real.sqrt R) ≤ + Real.sqrt R / (4 * Real.sqrt D * Real.sqrt R) := by + gcongr + have hcancel : + Real.sqrt R / (4 * Real.sqrt D * Real.sqrt R) = + 1 / (4 * Real.sqrt D) := by + field_simp [hsqrtR_pos.ne'] + calc + l = t / (4 * Real.sqrt D * Real.sqrt R) := rfl + _ ≤ Real.sqrt R / (4 * Real.sqrt D * Real.sqrt R) := hbound + _ = 1 / (4 * Real.sqrt D) := hcancel + _ ≤ 1 / 2 := by + have hden : (8 : ℝ) ≤ 4 * Real.sqrt D := by + calc + (8 : ℝ) = 4 * 2 := by norm_num + _ ≤ 4 * Real.sqrt D := + mul_le_mul_of_nonneg_left hsqrtD_two (by norm_num) + have hinv : 1 / (4 * Real.sqrt D) ≤ 1 / (8 : ℝ) := by + exact one_div_le_one_div_of_le (by positivity : 0 < (8 : ℝ)) hden + exact hinv.trans (by norm_num) + have hl_one : l ≤ 1 := by linarith + have hL_one : 1 ≤ L := by + have hratio_one : 1 ≤ Real.sqrt R / t := by + have htmp : t / t ≤ Real.sqrt R / t := by + exact div_le_div_of_nonneg_right ht_le_sqrtR ht_nonneg + simpa [ht_pos.ne'] using htmp + have hbase_one : 1 ≤ (2 * Real.sqrt D) * (Real.sqrt R / t) := by + have hleft : (1 : ℝ) ≤ 2 * Real.sqrt D := by + calc + (1 : ℝ) ≤ 4 := by norm_num + _ = 2 * 2 := by norm_num + _ ≤ 2 * Real.sqrt D := mul_le_mul_of_nonneg_left hsqrtD_two (by norm_num) + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ (2 * Real.sqrt D) * (Real.sqrt R / t) := + mul_le_mul hleft hratio_one zero_le_one (le_trans zero_le_one hleft) + have hexp_nonneg : 0 ≤ 1 / (1 - σ) := by + have hone_sub_pos : 0 < 1 - σ := sub_pos.mpr hσ₁ + positivity + dsimp [L] + exact Real.one_le_rpow hbase_one hexp_nonneg + have hlL_eq : (1 / 2) * L ^ (σ - 1) = l := by + calc + (1 / 2) * L ^ (σ - 1) + = (1 / 2) * ((((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (1 / (1 - σ))) ^ (σ - 1)) := by + rfl + _ = (1 / 2) * (((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ ((1 / (1 - σ)) * (σ - 1))) := by + rw [← Real.rpow_mul (show 0 ≤ (2 * Real.sqrt D) * (Real.sqrt R / t) by positivity)] + _ = (1 / 2) * (((2 * Real.sqrt D) * (Real.sqrt R / t)) ^ (-1 : ℝ)) := by + congr 2 + field_simp [sub_ne_zero.mpr hσ₁.ne.symm] + ring + _ = (1 / 2) * (t / (2 * Real.sqrt D * Real.sqrt R)) := by + rw [Real.rpow_neg_one] + field_simp [ht_pos.ne', hsqrtD_pos.ne', hsqrtR_pos.ne'] + _ = l := by + dsimp [l] + ring + have hlL : l ≤ (1 / 2) * L ^ (σ - 1) := by + rw [hlL_eq] + have htail := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_exp_neg_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_lt_one + (μ := μ) (X := X) (s := s) (σ := σ) + (a := B * Real.sqrt R * t) (l := l) (L := L) + h_indep h_meas h_int h_mean hσ₀ hσ₁ hX hl_nonneg hl_one hL_one hlL + have hmgf : + Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + ≤ Real.exp (-2 * t ^ σ) := by + simpa [D, B, l] using + smallRegime_heavyTail_mgf_le (σ := σ) (R := R) (t := t) hσ₀ hσ₁ hR_pos ht + have hunion : + R * Real.exp (-(L ^ σ)) ≤ Real.exp (-2 * t ^ σ) := by + simpa [D, q, L] using + smallRegime_heavyTail_union_le (σ := σ) (R := R) (t := t) + hσ₀ hσ₁ hR_pos hR_one ht (by simpa [R] using hsmall) + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaHeavyTailConst σ * Real.sqrt (s.card : ℝ) * t)) + = μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (B * Real.sqrt R * t)) := by + simp [B, R] + _ ≤ Real.exp (-l * (B * Real.sqrt R * t) + R * (l ^ (2 : ℕ) * D)) + + R * Real.exp (-(L ^ σ)) := htail + _ ≤ Real.exp (-2 * t ^ σ) + Real.exp (-2 * t ^ σ) := by + exact add_le_add hmgf hunion + _ = 2 * Real.exp (-2 * t ^ σ) := by ring + _ ≤ Real.exp (-(t ^ σ)) := by + exact two_mul_exp_neg_two_mul_le_exp_neg + (x := t ^ σ) (Real.one_le_rpow ht hσ₀.le) +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime.lean new file mode 100644 index 0000000000..ba6d11e32e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.OneVariable +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.FiniteSums + +/-! # Gamma Sigma Exp Regime -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/FiniteSums.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/FiniteSums.lean new file mode 100644 index 0000000000..429fc45fbf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/FiniteSums.lean @@ -0,0 +1,1039 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.OneVariable + +/-! # Finite Sums -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Finite independent sums inherit exponential mgf bounds when each summand +has one. -/ +theorem mgf_finset_sum_le_exp_of_iIndepFun + {ι : Type*} {X : ι → Ω → ℝ} {v : ι → ℝ} {s : Finset ι} {l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hmgf : ∀ i ∈ s, mgf (X i) μ l ≤ Real.exp (v i)) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ Real.exp (∑ i ∈ s, v i) := by + calc + mgf (fun ω => ∑ i ∈ s, X i ω) μ l = ∏ i ∈ s, mgf (X i) μ l := by + have hsumfun : (fun ω => ∑ i ∈ s, X i ω) = ∑ i ∈ s, X i := by + funext ω + simp [Finset.sum_apply] + rw [hsumfun] + exact h_indep.mgf_sum (t := l) h_meas s + _ ≤ ∏ i ∈ s, Real.exp (v i) := by + refine Finset.prod_le_prod₀ ?_ hmgf + intro i hi + exact mgf_nonneg + _ = Real.exp (∑ i ∈ s, v i) := by + rw [← Real.exp_sum] + +/-- Finite independent sums inherit the large-`λ` exponential mgf bound in the +note-facing `O_{Γ_σ}` language when `σ > 1`. -/ +theorem mgf_finset_sum_le_exp_card_mul_of_iIndepFun_of_isBigO_gammaSigma_of_one_lt + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 < σ) (hK : 0 < K) (hl : 0 ≤ l) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ + Real.exp ((s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ)) := by + let v : ι → ℝ := fun _ => + Real.log 2 + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ + have hmain := + mgf_finset_sum_le_exp_of_iIndepFun (μ := μ) (X := X) (v := v) (s := s) (l := l) + h_indep h_meas ?_ + · have hsum : ∑ i ∈ s, v i = + (s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := by + rw [Finset.sum_const, nsmul_eq_mul] + calc + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ Real.exp (∑ i ∈ s, v i) := hmain + _ = Real.exp ((s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ)) := by + rw [hsum] + · intro i hi + have hlarge := + mgf_le_two_mul_exp_of_isBigO_gammaSigma_of_one_lt + (μ := μ) (X := X i) (σ := σ) (K := K) (l := l) + (h_meas i).aemeasurable hσ hK hl (hX i hi) + calc + mgf (X i) μ l ≤ + 2 * Real.exp + (gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := hlarge + _ = Real.exp + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := by + calc + 2 * Real.exp + (gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) + = Real.exp (Real.log 2) * + Real.exp + (gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := by + rw [Real.exp_log (by norm_num : (0 : ℝ) < 2)] + _ = Real.exp + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := by + rw [Real.exp_add] + +/-- Large-`λ` Chernoff bound for finite sums of independent +`O_{Γ_σ}` variables when `σ > 1`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_of_iIndepFun_of_isBigO_gammaSigma_of_one_lt + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K l a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 < σ) (hK : 0 < K) (hl : 0 ≤ l) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp + (-l * a + (s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ)) := by + have hsumfun : (fun ω => ∑ i ∈ s, X i ω) = ∑ i ∈ s, X i := by + funext ω + simp [Finset.sum_apply] + have h_int : ∀ i ∈ s, Integrable (fun ω => Real.exp (l * X i ω)) μ := by + intro i hi + exact integrable_exp_mul_of_isBigO_gammaSigma_of_one_lt + (μ := μ) (X := X i) (σ := σ) (K := K) (l := l) + (h_meas i).aemeasurable hσ hK hl (hX i hi) + have hsum_int : Integrable (fun ω => Real.exp (l * (∑ i ∈ s, X i ω))) μ := by + simpa [hsumfun] using h_indep.integrable_exp_mul_sum (t := l) h_meas h_int + have hsubset : upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a ⊆ {ω | a ≤ ∑ i ∈ s, X i ω} := by + intro ω hω + simpa [upperTailEvent] using le_of_lt hω + refine (measureReal_mono (s₂ := {ω | a ≤ ∑ i ∈ s, X i ω}) hsubset).trans ?_ + calc + μ.real {ω | a ≤ ∑ i ∈ s, X i ω} + ≤ Real.exp (-l * a) * mgf (fun ω => ∑ i ∈ s, X i ω) μ l := by + exact measure_ge_le_exp_mul_mgf + (μ := μ) (X := fun ω => ∑ i ∈ s, X i ω) (ε := a) (t := l) hl hsum_int + _ ≤ Real.exp (-l * a) * + Real.exp ((s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ)) := by + gcongr + exact mgf_finset_sum_le_exp_card_mul_of_iIndepFun_of_isBigO_gammaSigma_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (l := l) + h_indep h_meas hσ hK hl hX + _ = Real.exp + (-l * a + (s.card : ℝ) * + (Real.log 2 + + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ)) := by + rw [← Real.exp_add] + +/-- Small-`λ` exponential mgf bound for finite independent sums of centered +`Γ_σ` variables. -/ +theorem mgf_finset_sum_le_exp_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {M : ι → ℝ} {s : Finset ι} {σ l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 ≤ σ) (hl : 0 ≤ l) + (hM : ∀ i ∈ s, 0 ≤ M i) + (hl_small : ∀ i ∈ s, l ≤ (2 * Real.exp 1 * M i)⁻¹) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (M i)) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ + Real.exp (∑ i ∈ s, 2 * (Real.exp 1 * M i * l) ^ (2 : ℕ)) := by + refine mgf_finset_sum_le_exp_of_iIndepFun (μ := μ) (X := X) (v := fun i => 2 * (Real.exp 1 * M i * l) ^ (2 : ℕ)) + h_indep h_meas ?_ + intro i hi + exact mgf_le_exp_two_mul_sq_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X i) (σ := σ) (M := M i) (l := l) + (h_meas i).aemeasurable hσ (hM i hi) hl (hl_small i hi) (hXmean i hi) (hXmom i hi) + +/-- Chernoff upper-tail estimate for finite independent sums of centered +`Γ_σ` variables in the small-`λ` regime. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {M : ι → ℝ} {s : Finset ι} {σ l a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 ≤ σ) (hl : 0 ≤ l) + (hM : ∀ i ∈ s, 0 ≤ M i) + (hl_small : ∀ i ∈ s, l ≤ (2 * Real.exp 1 * M i)⁻¹) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) (M i)) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + ∑ i ∈ s, 2 * (Real.exp 1 * M i * l) ^ (2 : ℕ)) := by + have hsumfun : (fun ω => ∑ i ∈ s, X i ω) = ∑ i ∈ s, X i := by + funext ω + simp [Finset.sum_apply] + have h_int : + ∀ i ∈ s, Integrable (fun ω => Real.exp (l * X i ω)) μ := by + intro i hi + exact integrable_exp_mul_of_gammaMomentGrowth_small + (μ := μ) (X := X i) (σ := σ) (M := M i) (l := l) + (h_meas i).aemeasurable hσ (hM i hi) hl (hl_small i hi) (hXmom i hi) + have hsum_int : Integrable (fun ω => Real.exp (l * (∑ i ∈ s, X i ω))) μ := by + simpa [hsumfun] using h_indep.integrable_exp_mul_sum (t := l) h_meas h_int + have hsubset : upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a ⊆ {ω | a ≤ ∑ i ∈ s, X i ω} := by + intro ω hω + simpa [upperTailEvent] using le_of_lt hω + refine (measureReal_mono (s₂ := {ω | a ≤ ∑ i ∈ s, X i ω}) hsubset).trans ?_ + calc + μ.real {ω | a ≤ ∑ i ∈ s, X i ω} + ≤ Real.exp (-l * a) * mgf (fun ω => ∑ i ∈ s, X i ω) μ l := by + exact measure_ge_le_exp_mul_mgf + (μ := μ) (X := fun ω => ∑ i ∈ s, X i ω) (ε := a) (t := l) hl hsum_int + _ ≤ Real.exp (-l * a) * Real.exp (∑ i ∈ s, 2 * (Real.exp 1 * M i * l) ^ (2 : ℕ)) := by + gcongr + exact mgf_finset_sum_le_exp_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (M := M) (s := s) (σ := σ) (l := l) + h_indep h_meas hσ hl hM hl_small hXmean hXmom + _ = Real.exp (-l * a + ∑ i ∈ s, 2 * (Real.exp 1 * M i * l) ^ (2 : ℕ)) := by + rw [← Real.exp_add] + +/-- Uniform-witness version of the finite-sum small-`λ` exponential mgf +estimate. -/ +theorem mgf_finset_sum_le_exp_card_mul_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ M l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) M) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ + Real.exp (2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + have hmain := + mgf_finset_sum_le_exp_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (M := fun _ : ι => M) (s := s) (σ := σ) (l := l) + h_indep h_meas hσ hl + (fun _ _ => hM) + (fun _ _ => hl_small) + hXmean + hXmom + have hsum : + (∑ i ∈ s, 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) = + 2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ) := by + rw [Finset.sum_const, nsmul_eq_mul] + ring + calc + mgf (fun ω => ∑ i ∈ s, X i ω) μ l + ≤ Real.exp (∑ i ∈ s, 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := hmain + _ = Real.exp (2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + rw [hsum] + +/-- Uniform-witness version of the finite-sum small-`λ` Chernoff estimate. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ M l a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + 2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + have hmain := + measureReal_upperTailEvent_finset_sum_le_exp_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (M := fun _ : ι => M) (s := s) (σ := σ) (l := l) (a := a) + h_indep h_meas hσ hl + (fun _ _ => hM) + (fun _ _ => hl_small) + hXmean + hXmom + have hsum : + -l * a + (∑ i ∈ s, 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) = + -l * a + 2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ) := by + rw [Finset.sum_const, nsmul_eq_mul] + ring + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) + ≤ Real.exp (-l * a + ∑ i ∈ s, 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := hmain + _ = Real.exp (-l * a + 2 * (s.card : ℝ) * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + rw [hsum] + +/-- Explicit witness for the direct exponential-regime concentration theorem in +the range `1 < σ ≤ 2`. -/ +noncomputable def gammaSigmaExpRegimeConst (σ : ℝ) : ℝ := + max (8 * Real.exp 1 * gammaMomentConst σ) (2 + gammaSigmaLargeMgfConst σ) + +lemma gammaExpLargeLambdaConst_pos {σ : ℝ} (hσ : 1 < σ) : + 0 < gammaExpLargeLambdaConst σ := by + dsimp [gammaExpLargeLambdaConst] + have hden : 0 < 4 * Real.exp 1 * gammaMomentConst 1 := by + have hfour_exp : 0 < 4 * Real.exp 1 := by positivity + exact mul_pos hfour_exp (gammaMomentConst_pos zero_lt_one) + exact gammaExpYoungScaleConst_pos hσ (inv_pos.mpr hden) + +lemma gammaSigmaLargeMgfConst_pos {σ : ℝ} (hσ : 1 < σ) : + 0 < gammaSigmaLargeMgfConst σ := by + have hσ_pos : 0 < σ := by linarith + dsimp [gammaSigmaLargeMgfConst] + exact mul_pos + (gammaExpLargeLambdaConst_pos hσ) + (Real.rpow_pos_of_pos + (mul_pos (Real.exp_pos 1) (gammaMomentConst_pos hσ_pos)) _) + +/-- One-sided direct concentration in the exponential regime `1 < σ ≤ 2`. -/ +theorem isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ : 1 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigOWith μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaExpRegimeConst σ * Real.sqrt (s.card : ℝ) * K) := by + let R : ℝ := s.card + let A : ℝ := gammaSigmaExpRegimeConst σ + let M : ℝ := gammaMomentConst σ * K + let B : ℝ := Real.exp 1 * M + let C : ℝ := gammaSigmaLargeMgfConst σ + have hσ_pos : 0 < σ := by linarith + have hσ_sub_nonneg : 0 ≤ σ - 1 := by linarith + have htwo_sub_nonneg : 0 ≤ 2 - σ := by linarith + have hR_pos : 0 < R := by + dsimp [R] + exact_mod_cast hs.card_pos + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have hsqrtR_nonneg : 0 ≤ Real.sqrt R := hsqrtR_pos.le + have hsqrtR_sq : (Real.sqrt R) ^ (2 : ℕ) = R := by + simpa [pow_two] using Real.sq_sqrt hR_nonneg + have hsqrtR_one_le : 1 ≤ Real.sqrt R := by + have hcard_one : (1 : ℝ) ≤ (s.card : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hs.card_pos) + refine (Real.one_le_sqrt).2 ?_ + simpa [R] using hcard_one + have hM_pos : 0 < M := by + dsimp [M] + exact mul_pos (gammaMomentConst_pos hσ_pos) hK + have hB_pos : 0 < B := by + dsimp [B] + exact mul_pos (Real.exp_pos 1) hM_pos + have hC_pos : 0 < C := gammaSigmaLargeMgfConst_pos hσ + have hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ σ (X i) M := by + intro i hi + simpa [M, mul_assoc, mul_left_comm, mul_comm] using + (hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X i) (K := K) (σ := σ) + hσ_pos hK (h_meas i).aemeasurable (hX i hi)) + rw [isBigOWith_gammaSigma_iff] + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + by_cases hsmall : t ≤ 2 * Real.sqrt R + · let l : ℝ := t / (4 * B * Real.sqrt R) + have hl_nonneg : 0 ≤ l := by + dsimp [l] + positivity + have hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹ := by + calc + l = t / (4 * B * Real.sqrt R) := rfl + _ ≤ (2 * Real.sqrt R) / (4 * B * Real.sqrt R) := by + gcongr + _ = (2 * Real.exp 1 * M)⁻¹ := by + dsimp [B] + field_simp [hM_pos.ne', hsqrtR_pos.ne'] + norm_num + have htail := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (σ := σ) (M := M) (l := l) + (a := A * Real.sqrt R * K * t) + h_indep h_meas hσ.le hM_pos.le hl_nonneg hl_small hXmean hXmom + refine htail.trans ?_ + apply (Real.exp_le_exp).2 + have hA_small : 8 * Real.exp 1 * gammaMomentConst σ ≤ A := by + dsimp [A, gammaSigmaExpRegimeConst] + exact le_max_left _ _ + have hA_ratio : 2 ≤ A / (4 * Real.exp 1 * gammaMomentConst σ) := by + have hden_pos : 0 < 4 * Real.exp 1 * gammaMomentConst σ := by + have hfour_exp : 0 < 4 * Real.exp 1 := by positivity + exact mul_pos hfour_exp (gammaMomentConst_pos hσ_pos) + refine (le_div_iff₀ hden_pos).2 ?_ + have hA_small' : 2 * (4 * Real.exp 1 * gammaMomentConst σ) ≤ A := by + calc + 2 * (4 * Real.exp 1 * gammaMomentConst σ) + = 8 * Real.exp 1 * gammaMomentConst σ := by ring + _ ≤ A := hA_small + exact hA_small' + have hpow_sigma_le_two : t ^ σ ≤ t ^ (2 : ℕ) := by + have htmp : t ^ σ ≤ t ^ (2 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le ht hσ₂ + simpa [Real.rpow_natCast] using htmp + calc + -l * (A * Real.sqrt R * K * t) + + 2 * R * (Real.exp 1 * M * l) ^ (2 : ℕ) + = -(A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) + + t ^ (2 : ℕ) / 8 := by + dsimp [l, A, B, M, R] + field_simp [hK.ne', (gammaMomentConst_pos hσ_pos).ne', + hsqrtR_pos.ne', Real.exp_ne_zero, pow_two] + rw [hsqrtR_sq] + ring + _ ≤ -(2 : ℝ) * t ^ (2 : ℕ) + t ^ (2 : ℕ) / 8 := by + have ht_sq_nonneg : 0 ≤ t ^ (2 : ℕ) := by positivity + have hmul : + (2 : ℝ) * t ^ (2 : ℕ) ≤ + (A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hA_ratio ht_sq_nonneg + have hneg : + -(A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) ≤ + -(2 : ℝ) * t ^ (2 : ℕ) := by + calc + -(A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) + = -((A / (4 * Real.exp 1 * gammaMomentConst σ)) * + t ^ (2 : ℕ)) := by ring + _ ≤ -((2 : ℝ) * t ^ (2 : ℕ)) := neg_le_neg hmul + _ = -(2 : ℝ) * t ^ (2 : ℕ) := by ring + calc + -(A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) + + t ^ (2 : ℕ) / 8 + = t ^ (2 : ℕ) / 8 + + -(A / (4 * Real.exp 1 * gammaMomentConst σ)) * t ^ (2 : ℕ) := by + ring + _ ≤ t ^ (2 : ℕ) / 8 + -(2 : ℝ) * t ^ (2 : ℕ) := + add_le_add_right hneg (t ^ (2 : ℕ) / 8) + _ = -(2 : ℝ) * t ^ (2 : ℕ) + t ^ (2 : ℕ) / 8 := by ring + _ ≤ -(t ^ (2 : ℕ)) := by + have ht_sq_nonneg : 0 ≤ t ^ (2 : ℕ) := by positivity + calc + -(2 : ℝ) * t ^ (2 : ℕ) + t ^ (2 : ℕ) / 8 + = -(t ^ (2 : ℕ)) - ((7 : ℝ) / 8) * t ^ (2 : ℕ) := by ring + _ ≤ -(t ^ (2 : ℕ)) := + sub_le_self _ (mul_nonneg (by norm_num) ht_sq_nonneg) + _ ≤ -(t ^ σ) := by + exact neg_le_neg hpow_sigma_le_two + · let l : ℝ := (t / Real.sqrt R) ^ (σ - 1) / K + let S : ℝ := R * (t / Real.sqrt R) ^ σ + have hl_nonneg : 0 ≤ l := by + dsimp [l] + positivity + have htail := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_of_iIndepFun_of_isBigO_gammaSigma_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (l := l) + (a := A * Real.sqrt R * K * t) + h_indep h_meas hσ hK hl_nonneg hX + refine htail.trans ?_ + apply (Real.exp_le_exp).2 + have hbase_nonneg : 0 ≤ t / Real.sqrt R := by positivity + have hbase_gt_two : 2 < t / Real.sqrt R := by + exact (lt_div_iff₀ hsqrtR_pos).2 (lt_of_not_ge hsmall) + have hbase_one : 1 ≤ t / Real.sqrt R := by + linarith + have hA_large : 2 + C ≤ A := by + dsimp [A, C, gammaSigmaExpRegimeConst] + exact le_max_right _ _ + have hS_nonneg : 0 ≤ S := by + dsimp [S] + positivity + have hS_ge_log : R * Real.log 2 ≤ S := by + have hlog_le_one : Real.log 2 ≤ 1 := by + refine (Real.log_le_iff_le_exp (by norm_num : 0 < (2 : ℝ))).2 ?_ + have htwo_exp_one : (2 : ℝ) < Real.exp 1 := by + exact lt_trans (by norm_num) Real.exp_one_gt_d9 + simpa using htwo_exp_one.le + have hone_le : 1 ≤ (t / Real.sqrt R) ^ σ := by + exact Real.one_le_rpow hbase_one hσ_pos.le + have hlog_le : Real.log 2 ≤ (t / Real.sqrt R) ^ σ := by + exact le_trans hlog_le_one hone_le + have hmul := mul_le_mul_of_nonneg_left hlog_le hR_nonneg + simpa [S] using hmul + have hS_ge_tpow : t ^ σ ≤ S := by + have hsqrt_pow_le : (Real.sqrt R) ^ σ ≤ R := by + calc + (Real.sqrt R) ^ σ ≤ (Real.sqrt R) ^ (2 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le hsqrtR_one_le hσ₂ + _ = R := by + simpa [Real.rpow_natCast] using hsqrtR_sq + calc + t ^ σ = (Real.sqrt R * (t / Real.sqrt R)) ^ σ := by + congr 1 + field_simp [hsqrtR_pos.ne'] + _ = (Real.sqrt R) ^ σ * (t / Real.sqrt R) ^ σ := by + rw [Real.mul_rpow hsqrtR_nonneg hbase_nonneg] + _ ≤ R * (t / Real.sqrt R) ^ σ := by + gcongr + _ = S := by + rfl + have hpow_q : + (K * l) ^ gammaExpConjExponent σ = (t / Real.sqrt R) ^ σ := by + calc + (K * l) ^ gammaExpConjExponent σ + = ((t / Real.sqrt R) ^ (σ - 1)) ^ gammaExpConjExponent σ := by + dsimp [l] + congr 1 + field_simp [hK.ne'] + _ = (t / Real.sqrt R) ^ ((σ - 1) * gammaExpConjExponent σ) := by + rw [← Real.rpow_mul hbase_nonneg] + _ = (t / Real.sqrt R) ^ σ := by + dsimp [gammaExpConjExponent] + congr 2 + field_simp [sub_ne_zero.mpr hσ.ne'] + have hla : l * (A * Real.sqrt R * K * t) = A * S := by + calc + l * (A * Real.sqrt R * K * t) + = A * (((t / Real.sqrt R) ^ (σ - 1)) * (Real.sqrt R * t)) := by + dsimp [l] + field_simp [hK.ne'] + _ = A * (R * (t / Real.sqrt R) ^ σ) := by + congr 1 + calc + (t / Real.sqrt R) ^ (σ - 1) * (Real.sqrt R * t) + = (t / Real.sqrt R) ^ (σ - 1) * (R * (t / Real.sqrt R)) := by + have hRt : R * (t / Real.sqrt R) = Real.sqrt R * t := by + field_simp [hsqrtR_pos.ne'] + rw [hsqrtR_sq] + rw [hRt] + _ = R * ((t / Real.sqrt R) ^ (σ - 1) * (t / Real.sqrt R)) := by ring + _ = R * (t / Real.sqrt R) ^ σ := by + have hpow_base : + (t / Real.sqrt R) ^ (σ - 1) * (t / Real.sqrt R) = + (t / Real.sqrt R) ^ σ := by + calc + (t / Real.sqrt R) ^ (σ - 1) * (t / Real.sqrt R) + = (t / Real.sqrt R) ^ (σ - 1) * (t / Real.sqrt R) ^ (1 : ℝ) := by + rw [Real.rpow_one] + _ = (t / Real.sqrt R) ^ σ := by + rw [← Real.rpow_add' hbase_nonneg] + · ring_nf + · linarith + rw [hpow_base] + _ = A * S := by + rfl + calc + -l * (A * Real.sqrt R * K * t) + + R * (Real.log 2 + C * (K * l) ^ gammaExpConjExponent σ) + = -(l * (A * Real.sqrt R * K * t)) + + R * (Real.log 2 + C * (K * l) ^ gammaExpConjExponent σ) := by + ring + _ = -(A * S) + + R * (Real.log 2 + C * (K * l) ^ gammaExpConjExponent σ) := by + rw [hla] + _ = -(A - C) * S + R * Real.log 2 := by + rw [hpow_q] + dsimp [S] + ring + _ ≤ -(2 : ℝ) * S + R * Real.log 2 := by + have htwo_le : (2 : ℝ) ≤ A - C := by + rwa [le_sub_iff_add_le] + have hmul : (2 : ℝ) * S ≤ (A - C) * S := + mul_le_mul_of_nonneg_right htwo_le hS_nonneg + have hneg : -(A - C) * S ≤ -(2 : ℝ) * S := by + calc + -(A - C) * S = -((A - C) * S) := by ring + _ ≤ -((2 : ℝ) * S) := neg_le_neg hmul + _ = -(2 : ℝ) * S := by ring + calc + -(A - C) * S + R * Real.log 2 = R * Real.log 2 + -(A - C) * S := by + ring + _ ≤ R * Real.log 2 + -(2 : ℝ) * S := + add_le_add_right hneg (R * Real.log 2) + _ = -(2 : ℝ) * S + R * Real.log 2 := by ring + _ ≤ -S := by + calc + -(2 : ℝ) * S + R * Real.log 2 ≤ S + -(2 : ℝ) * S := by + rw [add_comm (-(2 : ℝ) * S)] + exact add_le_add_left hS_ge_log (-(2 : ℝ) * S) + _ = -S := by ring + _ ≤ -(t ^ σ) := by + exact neg_le_neg hS_ge_tpow + +/-- Symmetric direct concentration in the exponential regime `1 < σ ≤ 2`. -/ +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ : 1 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (2 * gammaSigmaExpRegimeConst σ * Real.sqrt (s.card : ℝ) * K) := by + let A : ℝ := gammaSigmaExpRegimeConst σ * Real.sqrt (s.card : ℝ) * K + rw [isBigO_gammaSigma_iff] + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have htwo_t : 1 ≤ 2 * t := by + have ht_le_two_t : t ≤ 2 * t := by + simpa using + mul_le_mul_of_nonneg_right (show (1 : ℝ) ≤ 2 by norm_num) ht_nonneg + exact ht.trans ht_le_two_t + have hsum : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ⊆ + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t)) := by + intro ω hω + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by + simpa [A, absTailEvent, upperTailEvent, mul_assoc, mul_left_comm, mul_comm] using hω) + have hupper : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) ≤ + Real.exp (-((2 * t) ^ σ)) := by + have hone := + isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ hσ₂ hK hX hXmean + simpa [A] using + (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := A) (σ := σ)).1 hone htwo_t + let Xneg : ι → Ω → ℝ := fun i ω => -X i ω + have h_indep_neg : iIndepFun Xneg μ := by + simpa [Xneg, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => -x) (fun _ => measurable_neg) + have h_meas_neg : ∀ i, Measurable (Xneg i) := by + intro i + simpa [Xneg] using h_meas i + have hX_neg : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (Xneg i) K := by + intro i hi + simpa [Xneg] using (hX i hi).neg + have hXmean_neg : ∀ i ∈ s, ∫ ω, Xneg i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Xneg i ω ∂μ = -∫ ω, X i ω ∂μ := by + simpa [Xneg] using integral_neg (X i) + _ = 0 := by rw [hXmean i hi, neg_zero] + have hupper_neg : + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) ≤ + Real.exp (-((2 * t) ^ σ)) := by + have hone := + isBigOWith_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + (μ := μ) (X := Xneg) (s := s) (σ := σ) (K := K) + h_indep_neg h_meas_neg hs hσ hσ₂ hK hX_neg hXmean_neg + simpa [Xneg, Finset.sum_apply, A] using + (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, Xneg i ω) + (A := A) (σ := σ)).1 hone htwo_t + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) + ((2 * gammaSigmaExpRegimeConst σ * Real.sqrt (s.card : ℝ) * K) * t)) + = μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) := by + congr 1 + simp [A, mul_assoc, mul_left_comm, mul_comm] + _ ≤ μ.real + (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) := by + exact measureReal_mono hsum + _ ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) + + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) := by + exact measureReal_union_le _ _ + _ ≤ Real.exp (-((2 * t) ^ σ)) + Real.exp (-((2 * t) ^ σ)) := by + exact add_le_add hupper hupper_neg + _ ≤ Real.exp (-(t ^ σ)) := by + have htwo_sigma_ge_two : (2 : ℝ) ≤ (2 : ℝ) ^ σ := by + have htmp : (2 : ℝ) ^ (1 : ℝ) ≤ (2 : ℝ) ^ σ := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num : 1 ≤ (2 : ℝ)) hσ.le + simpa [Real.rpow_one] using htmp + have htpow_one : 1 ≤ t ^ σ := by + have hσ_nonneg : 0 ≤ σ := by linarith + exact Real.one_le_rpow ht hσ_nonneg + have hextra_one : 1 ≤ ((2 : ℝ) ^ σ - 1) * t ^ σ := by + have hfactor_one : 1 ≤ (2 : ℝ) ^ σ - 1 := by + rw [le_sub_iff_add_le] + norm_num + exact htwo_sigma_ge_two + have hfactor_nonneg : 0 ≤ (2 : ℝ) ^ σ - 1 := + zero_le_one.trans hfactor_one + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ ((2 : ℝ) ^ σ - 1) * t ^ σ := + mul_le_mul hfactor_one htpow_one zero_le_one hfactor_nonneg + have htwo_le_exp : (2 : ℝ) ≤ Real.exp (((2 : ℝ) ^ σ - 1) * t ^ σ) := by + have htwo_exp_one : (2 : ℝ) < Real.exp 1 := by + exact lt_trans (by norm_num) Real.exp_one_gt_d9 + have hexp_mono : Real.exp 1 ≤ Real.exp (((2 : ℝ) ^ σ - 1) * t ^ σ) := by + exact (Real.exp_le_exp).2 hextra_one + exact le_trans htwo_exp_one.le hexp_mono + have hpow2t : (2 * t) ^ σ = (2 : ℝ) ^ σ * t ^ σ := by + rw [Real.mul_rpow (by norm_num) ht_nonneg] + calc + Real.exp (-((2 * t) ^ σ)) + Real.exp (-((2 * t) ^ σ)) + = 2 * Real.exp (-((2 * t) ^ σ)) := by ring + _ ≤ Real.exp (((2 : ℝ) ^ σ - 1) * t ^ σ) * Real.exp (-((2 * t) ^ σ)) := by + exact mul_le_mul_of_nonneg_right htwo_le_exp (by positivity) + _ = Real.exp (-(t ^ σ)) := by + rw [hpow2t, ← Real.exp_add] + congr 1 + ring + +/-- Averaging preserves the direct exponential-regime concentration scale in +the range `1 < σ ≤ 2`. -/ +theorem isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ : 1 < σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (2 * gammaSigmaExpRegimeConst σ * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + have hsum := + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ hσ₂ hK hX hXmean + have hcard_inv_nonneg : 0 ≤ ((s.card : ℝ)⁻¹) := by positivity + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := 2 * gammaSigmaExpRegimeConst σ * Real.sqrt (s.card : ℝ) * K) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + +/-- Explicit `Γ₁` witness extracted from the small-`λ` exponential-regime +argument. -/ +noncomputable def gammaOneExpRegimeConst : ℝ := + 4 * Real.exp 1 * gammaMomentConst 1 + +lemma gammaOneExpRegimeConst_pos : 0 < gammaOneExpRegimeConst := by + dsimp [gammaOneExpRegimeConst] + exact mul_pos (by positivity) (gammaMomentConst_pos zero_lt_one) + +/-- Centered independent `O_{Γ₁}` summands satisfy the one-sided `Γ₁` +concentration estimate with the expected `sqrt(card)` scaling. -/ +theorem isBigOWith_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma 1) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigOWith μ (gammaSigma 1) (fun ω => ∑ i ∈ s, X i ω) + (gammaOneExpRegimeConst * Real.sqrt (s.card : ℝ) * K) := by + let R : ℝ := s.card + let M : ℝ := gammaMomentConst 1 * K + let B : ℝ := Real.exp 1 * M + have hR_pos : 0 < R := by + dsimp [R] + exact_mod_cast hs.card_pos + have hR_nonneg : 0 ≤ R := hR_pos.le + have hsqrtR_pos : 0 < Real.sqrt R := Real.sqrt_pos.2 hR_pos + have hsqrtR_nonneg : 0 ≤ Real.sqrt R := hsqrtR_pos.le + have hsqrtR_sq : (Real.sqrt R) ^ (2 : ℕ) = R := by + simpa [pow_two] using Real.sq_sqrt hR_nonneg + have hsqrtR_one_le : 1 ≤ Real.sqrt R := by + have hcard_one : (1 : ℝ) ≤ (s.card : ℝ) := by + exact_mod_cast (Nat.succ_le_of_lt hs.card_pos) + refine (Real.one_le_sqrt).2 ?_ + simpa [R] using hcard_one + have hM_pos : 0 < M := by + dsimp [M] + exact mul_pos (gammaMomentConst_pos zero_lt_one) hK + have hM_nonneg : 0 ≤ M := hM_pos.le + have hB_pos : 0 < B := by + dsimp [B] + exact mul_pos (Real.exp_pos 1) hM_pos + have hXmom : ∀ i ∈ s, HasGammaMomentGrowthWith μ 1 (X i) M := by + intro i hi + simpa [M, mul_assoc, mul_left_comm, mul_comm] using + (hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X i) (K := K) (σ := 1) + zero_lt_one hK (h_meas i).aemeasurable (hX i hi)) + rw [isBigOWith_gammaSigma_iff] + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + let l : ℝ := min ((2 * B)⁻¹) (t / (B * Real.sqrt R)) + have hl_nonneg : 0 ≤ l := by + dsimp [l] + positivity + have htail := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_of_iIndepFun_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (σ := 1) (M := M) (l := l) + (a := gammaOneExpRegimeConst * Real.sqrt R * K * t) + h_indep h_meas le_rfl hM_nonneg hl_nonneg + (by + dsimp [l, B] + simp [M, mul_assoc, mul_left_comm, mul_comm]) + hXmean hXmom + refine htail.trans ?_ + apply (Real.exp_le_exp).2 + have hB_ne : B ≠ 0 := hB_pos.ne' + have hsqrtR_ne : Real.sqrt R ≠ 0 := hsqrtR_pos.ne' + have hA_eq : + gammaOneExpRegimeConst * Real.sqrt R * K = 4 * B * Real.sqrt R := by + dsimp [gammaOneExpRegimeConst, B, M] + ring + by_cases hcase : (2 * B)⁻¹ ≤ t / (B * Real.sqrt R) + · have hl_eq : l = (2 * B)⁻¹ := by + dsimp [l] + rw [min_eq_left hcase] + have hbranch : Real.sqrt R / 2 ≤ t := by + have hden_nonneg : 0 ≤ B * Real.sqrt R := + (mul_pos hB_pos hsqrtR_pos).le + calc + Real.sqrt R / 2 = (2 * B)⁻¹ * (B * Real.sqrt R) := by + field_simp [hB_ne] + _ ≤ (t / (B * Real.sqrt R)) * (B * Real.sqrt R) := + mul_le_mul_of_nonneg_right hcase hden_nonneg + _ = t := by + field_simp [hB_ne, hsqrtR_ne] + have hRm : R / 2 ≤ Real.sqrt R * t := by + have htmp := mul_le_mul_of_nonneg_left hbranch hsqrtR_nonneg + have hR_half : R / 2 = (Real.sqrt R) ^ (2 : ℕ) / 2 := by + rw [hsqrtR_sq] + calc + R / 2 = (Real.sqrt R) ^ (2 : ℕ) / 2 := hR_half + _ = Real.sqrt R * (Real.sqrt R / 2) := by ring + _ ≤ Real.sqrt R * t := htmp + calc + -l * (gammaOneExpRegimeConst * Real.sqrt R * K * t) + + 2 * R * (Real.exp 1 * M * l) ^ (2 : ℕ) + = -(2 * Real.sqrt R * t) + R / 2 := by + rw [hl_eq, hA_eq] + field_simp [hB_ne, pow_two] + ring + _ ≤ -(Real.sqrt R * t) := by + calc + -(2 * Real.sqrt R * t) + R / 2 + ≤ -(2 * Real.sqrt R * t) + Real.sqrt R * t := + add_le_add_right hRm (-(2 * Real.sqrt R * t)) + _ = -(Real.sqrt R * t) := by ring + _ ≤ -t := by + have hle : t ≤ Real.sqrt R * t := by + simpa using mul_le_mul_of_nonneg_right hsqrtR_one_le ht_nonneg + exact neg_le_neg hle + _ = -(t ^ (1 : ℝ)) := by simp [Real.rpow_one] + · have hl_eq : l = t / (B * Real.sqrt R) := by + dsimp [l] + rw [min_eq_right (le_of_not_ge hcase)] + calc + -l * (gammaOneExpRegimeConst * Real.sqrt R * K * t) + + 2 * R * (Real.exp 1 * M * l) ^ (2 : ℕ) + = -2 * t ^ (2 : ℕ) := by + rw [hl_eq, hA_eq] + field_simp [hB_ne, hsqrtR_ne, pow_two] + rw [hsqrtR_sq] + ring + _ ≤ -t := by + have ht_sq_nonneg : 0 ≤ t ^ (2 : ℕ) := by positivity + have ht_le_sq : t ≤ t ^ (2 : ℕ) := by + have hmul := mul_le_mul_of_nonneg_right ht ht_nonneg + simpa [pow_two] using hmul + calc + -2 * t ^ (2 : ℕ) ≤ -(t ^ (2 : ℕ)) := by + calc + -2 * t ^ (2 : ℕ) + = -(t ^ (2 : ℕ)) - t ^ (2 : ℕ) := by ring + _ ≤ -(t ^ (2 : ℕ)) := sub_le_self _ ht_sq_nonneg + _ ≤ -t := neg_le_neg ht_le_sq + _ = -(t ^ (1 : ℝ)) := by simp [Real.rpow_one] + +/-- Centered independent `O_{Γ₁}` summands satisfy the symmetric `Γ₁` +concentration estimate with the expected `sqrt(card)` scaling. -/ +theorem isBigO_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma 1) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma 1) (fun ω => ∑ i ∈ s, X i ω) + (2 * gammaOneExpRegimeConst * Real.sqrt (s.card : ℝ) * K) := by + let A : ℝ := gammaOneExpRegimeConst * Real.sqrt (s.card : ℝ) * K + rw [isBigO_gammaSigma_iff] + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have htwo_t : 1 ≤ 2 * t := by + have ht_le_two_t : t ≤ 2 * t := by + simpa using + mul_le_mul_of_nonneg_right (show (1 : ℝ) ≤ 2 by norm_num) ht_nonneg + exact ht.trans ht_le_two_t + have hsum : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ⊆ + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t)) := by + intro ω hω + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by simpa [A, absTailEvent, upperTailEvent, mul_assoc, mul_left_comm, mul_comm] using hω) + have hupper : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) ≤ + Real.exp (-((2 * t) ^ (1 : ℝ))) := by + have hone := + isBigOWith_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (K := K) + h_indep h_meas hs hK hX hXmean + simpa [Real.rpow_one] using (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) (A := A) (σ := 1)).1 hone htwo_t + let Xneg : ι → Ω → ℝ := fun i ω => -X i ω + have h_indep_neg : iIndepFun Xneg μ := by + simpa [Xneg, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => -x) (fun _ => measurable_neg) + have h_meas_neg : ∀ i, Measurable (Xneg i) := by + intro i + simpa [Xneg] using h_meas i + have hX_neg : ∀ i ∈ s, IsBigO μ (gammaSigma 1) (Xneg i) K := by + intro i hi + simpa [Xneg] using (hX i hi).neg + have hXmean_neg : ∀ i ∈ s, ∫ ω, Xneg i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Xneg i ω ∂μ = -∫ ω, X i ω ∂μ := by + simpa [Xneg] using integral_neg (X i) + _ = 0 := by rw [hXmean i hi, neg_zero] + have hupper_neg : + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) ≤ + Real.exp (-((2 * t) ^ (1 : ℝ))) := by + have hone := + isBigOWith_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := Xneg) (s := s) (K := K) + h_indep_neg h_meas_neg hs hK hX_neg hXmean_neg + simpa [Xneg, Finset.sum_apply] using + (isBigOWith_gammaSigma_iff (μ := μ) + (X := fun ω => ∑ i ∈ s, Xneg i ω) (A := A) (σ := 1)).1 hone htwo_t + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) + ((2 * gammaOneExpRegimeConst * Real.sqrt (s.card : ℝ) * K) * t)) + = μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) := by + congr 1 + simp [A, mul_assoc, mul_left_comm, mul_comm] + _ + ≤ μ.real + (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t)) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) := by + exact measureReal_mono hsum + _ ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (A * (2 * t))) + + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (A * (2 * t))) := by + exact measureReal_union_le _ _ + _ ≤ Real.exp (-((2 * t) ^ (1 : ℝ))) + Real.exp (-((2 * t) ^ (1 : ℝ))) := by + exact add_le_add hupper hupper_neg + _ ≤ Real.exp (-(t ^ (1 : ℝ))) := by + have haux : 2 * Real.exp (-((2 * t) ^ (1 : ℝ))) ≤ Real.exp (-(t ^ (1 : ℝ))) := by + have htwo_exp : (2 : ℝ) ≤ Real.exp t := by + have htwo_exp_one : (2 : ℝ) < Real.exp 1 := by + exact lt_trans (by norm_num) Real.exp_one_gt_d9 + have hexp_mono : Real.exp 1 ≤ Real.exp t := by + exact (Real.exp_le_exp).2 ht + exact le_trans htwo_exp_one.le hexp_mono + calc + 2 * Real.exp (-((2 * t) ^ (1 : ℝ))) + = 2 * Real.exp (-(2 * t)) := by rw [Real.rpow_one] + _ ≤ Real.exp t * Real.exp (-(2 * t)) := by + exact mul_le_mul_of_nonneg_right htwo_exp (by positivity) + _ = Real.exp (-(t ^ (1 : ℝ))) := by + rw [← Real.exp_add] + have hExp : + t + -(2 * t) = -(t ^ (1 : ℝ)) := by + rw [Real.rpow_one] + ring + rw [hExp] + simpa [two_mul] using haux + +/-- Averaging preserves the `Γ₁` concentration scale of centered independent +`O_{Γ₁}` summands. -/ +theorem isBigO_gammaOne_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma 1) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma 1) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (2 * gammaOneExpRegimeConst * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + have hsum := + isBigO_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (K := K) + h_indep h_meas hs hK hX hXmean + have hcard_inv_nonneg : 0 ≤ ((s.card : ℝ)⁻¹) := by positivity + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := gammaSigma 1) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := 2 * gammaOneExpRegimeConst * Real.sqrt (s.card : ℝ) * K) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + +/-- Unified endpoint constant for the Chapter 4 direct exponential-regime +concentration theorem on the range `σ ∈ [1, 2]`. -/ +noncomputable def gammaSigmaExpRegimeEndpointConst (σ : ℝ) : ℝ := + if σ = 1 then 2 * gammaOneExpRegimeConst else 2 * gammaSigmaExpRegimeConst σ + +/-- Note-facing direct concentration theorem in the exponential regime +`σ ∈ [1, 2]`. -/ +theorem isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₁ : 1 ≤ σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (gammaSigmaExpRegimeEndpointConst σ * Real.sqrt (s.card : ℝ) * K) := by + by_cases hσ_eq : σ = 1 + · subst hσ_eq + simpa [gammaSigmaExpRegimeEndpointConst] using + isBigO_gammaOne_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (K := K) + h_indep h_meas hs hK hX hXmean + · have hσ_gt : 1 < σ := by + exact lt_of_le_of_ne hσ₁ (fun h => hσ_eq h.symm) + simpa [gammaSigmaExpRegimeEndpointConst, hσ_eq] using + isBigO_gammaSigma_finset_sum_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ_gt hσ₂ hK hX hXmean + +/-- Averaged version of the direct exponential-regime concentration theorem on +the range `σ ∈ [1, 2]`. -/ +theorem isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_expRegime + [IsProbabilityMeasure μ] + {ι : Type*} {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hs : s.Nonempty) + (hσ₁ : 1 ≤ σ) (hσ₂ : σ ≤ 2) + (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) K) + (hXmean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (gammaSigmaExpRegimeEndpointConst σ * (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + by_cases hσ_eq : σ = 1 + · subst hσ_eq + simpa [gammaSigmaExpRegimeEndpointConst] using + isBigO_gammaOne_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (K := K) + h_indep h_meas hs hK hX hXmean + · have hσ_gt : 1 < σ := by + exact lt_of_le_of_ne hσ₁ (fun h => hσ_eq h.symm) + simpa [gammaSigmaExpRegimeEndpointConst, hσ_eq] using + isBigO_gammaSigma_finsetAverage_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_one_lt + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas hs hσ_gt hσ₂ hK hX hXmean + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/OneVariable.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/OneVariable.lean new file mode 100644 index 0000000000..d90b96d5e6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/OneVariable.lean @@ -0,0 +1,769 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigmaExpRegime.Preliminaries + +/-! # One Variable -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +private lemma exp_mul_mul_le_half_of_le_inv_two_exp_mul {M l : ℝ} + (hM : 0 ≤ M) (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) : + Real.exp 1 * M * l ≤ (1 / 2 : ℝ) := by + by_cases hM0 : M = 0 + · simp [hM0] + · let C : ℝ := 2 * Real.exp 1 * M + have hM_pos : 0 < M := lt_of_le_of_ne hM (Ne.symm hM0) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (mul_nonneg (by norm_num : 0 ≤ (2 : ℝ)) (Real.exp_pos 1).le) + hM + have htmp := mul_le_mul_of_nonneg_left hl_small hC_nonneg + have hC_ne : C ≠ 0 := by + dsimp [C] + positivity + have hbound : C * l ≤ 1 := by + calc + C * l ≤ C * C⁻¹ := by simpa [C] using htmp + _ = 1 := by field_simp [hC_ne] + dsimp [C] at hbound ⊢ + linarith + +private lemma exp_mul_mul_le_quarter_of_le_inv_four_exp_mul {M l : ℝ} + (hM : 0 ≤ M) (hl_small : l ≤ (4 * Real.exp 1 * M)⁻¹) : + Real.exp 1 * M * l ≤ (1 / 4 : ℝ) := by + by_cases hM0 : M = 0 + · simp [hM0] + · let C : ℝ := 4 * Real.exp 1 * M + have hM_pos : 0 < M := lt_of_le_of_ne hM (Ne.symm hM0) + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact mul_nonneg (mul_nonneg (by norm_num : 0 ≤ (4 : ℝ)) (Real.exp_pos 1).le) + hM + have htmp := mul_le_mul_of_nonneg_left hl_small hC_nonneg + have hC_ne : C ≠ 0 := by + dsimp [C] + positivity + have hbound : C * l ≤ 1 := by + calc + C * l ≤ C * C⁻¹ := by simpa [C] using htmp + _ = 1 := by field_simp [hC_ne] + dsimp [C] at hbound ⊢ + linarith + +/-- Small-`λ` mgf bound for a centered `Γ_σ` random variable, in the raw +geometric-tail form that comes directly from the exponential power series. -/ +theorem mgf_le_one_add_tsum_geometric_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ 1 + ∑' n : ℕ, (Real.exp 1 * M * l) ^ (n + 2) := by + let F : ℕ → Ω → ℝ := gammaExpSeriesTerm l X + let r : ℝ := Real.exp 1 * M * l + have hF_int : ∀ n : ℕ, Integrable (F n) μ := by + intro n + exact integrable_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hXm hl hXmom + have hF_sum_norm : Summable (fun n : ℕ => ∫ ω, ‖F n ω‖ ∂μ) := by + simpa [F] using summable_integral_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hσ hM hl hl_small hXmom + have hF_sum_int : Summable (fun n : ℕ => ∫ ω, F n ω ∂μ) := by + exact hF_sum_norm.of_norm_bounded (fun n => norm_integral_le_integral_norm _) + have h_exp_series : + (fun ω => Real.exp (l * X ω)) = fun ω => ∑' n : ℕ, F n ω := by + funext ω + rw [Real.exp_eq_exp_ℝ, NormedSpace.exp_eq_tsum_div] + simp [F, gammaExpSeriesTerm] + have hmgf_series : + mgf X μ l = ∑' n : ℕ, ∫ ω, F n ω ∂μ := by + rw [mgf, h_exp_series] + symm + exact integral_tsum_of_summable_integral_norm hF_int hF_sum_norm + have hhead0 : ∫ ω, F 0 ω ∂μ = 1 := by + simp [F, gammaExpSeriesTerm] + have hhead1 : ∫ ω, F 1 ω ∂μ = 0 := by + calc + ∫ ω, F 1 ω ∂μ = l * (∫ ω, X ω ∂μ) := by + simpa [F, gammaExpSeriesTerm] using integral_const_mul l X + _ = 0 := by rw [hXmean]; ring + have htail_sum_int : Summable (fun n : ℕ => ∫ ω, F (n + 2) ω ∂μ) := by + exact (summable_nat_add_iff (f := fun n : ℕ => ∫ ω, F n ω ∂μ) 2).2 hF_sum_int + have hr_nonneg : 0 ≤ r := by + dsimp [r] + positivity + have hr_le_half : r ≤ 1 / 2 := by + dsimp [r] + exact exp_mul_mul_le_half_of_le_inv_two_exp_mul hM hl_small + have hr_lt_one : r < 1 := lt_of_le_of_lt hr_le_half (by norm_num) + have hgeom : Summable (fun n : ℕ => r ^ (n + 2)) := by + have hs : Summable (fun n : ℕ => r ^ n) := + summable_geometric_of_lt_one hr_nonneg hr_lt_one + simpa [pow_add, pow_two, mul_assoc, mul_left_comm, mul_comm] using + hs.mul_left (r ^ (2 : ℕ)) + have htail_le : + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ ≤ ∑' n : ℕ, r ^ (n + 2) := by + refine htail_sum_int.tsum_le_tsum (fun n => ?_) hgeom + have hnorm_le : ∫ ω, F (n + 2) ω ∂μ ≤ ∫ ω, ‖F (n + 2) ω‖ ∂μ := by + calc + ∫ ω, F (n + 2) ω ∂μ ≤ |∫ ω, F (n + 2) ω ∂μ| := by + exact le_abs_self _ + _ = ‖∫ ω, F (n + 2) ω ∂μ‖ := by rw [Real.norm_eq_abs] + _ ≤ ∫ ω, ‖F (n + 2) ω‖ ∂μ := norm_integral_le_integral_norm _ + have hgeom_le : ∫ ω, ‖F (n + 2) ω‖ ∂μ ≤ r ^ (n + 2) := by + simpa [F, r, gammaExpTaylorTail_eq_gammaExpSeriesTerm_add_two] using + integral_norm_gammaExpTaylorTail_le_geometric + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hσ hM hl hXmom + exact hnorm_le.trans hgeom_le + calc + mgf X μ l + = (∑ i ∈ Finset.range 2, ∫ ω, F i ω ∂μ) + + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ := by + rw [hmgf_series, ← hF_sum_int.sum_add_tsum_nat_add 2] + _ = 1 + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ := by + rw [Finset.sum_range_succ, Finset.sum_range_one, hhead0, hhead1] + ring + _ ≤ 1 + ∑' n : ℕ, r ^ (n + 2) := by + gcongr + _ = 1 + ∑' n : ℕ, (Real.exp 1 * M * l) ^ (n + 2) := by + simp [r] + +/-- Small-`λ` mgf bound without the centering hypothesis. The linear term is +controlled by the first absolute moment. -/ +theorem mgf_le_one_add_linear_add_tsum_geometric_of_gammaMomentGrowth_small + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ 1 + l * M + ∑' n : ℕ, (Real.exp 1 * M * l) ^ (n + 2) := by + let F : ℕ → Ω → ℝ := gammaExpSeriesTerm l X + let r : ℝ := Real.exp 1 * M * l + have hF_int : ∀ n : ℕ, Integrable (F n) μ := by + intro n + exact integrable_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hXm hl hXmom + have hF_sum_norm : Summable (fun n : ℕ => ∫ ω, ‖F n ω‖ ∂μ) := by + simpa [F] using summable_integral_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hσ hM hl hl_small hXmom + have hF_sum_int : Summable (fun n : ℕ => ∫ ω, F n ω ∂μ) := by + exact hF_sum_norm.of_norm_bounded (fun n => norm_integral_le_integral_norm _) + have h_exp_series : + (fun ω => Real.exp (l * X ω)) = fun ω => ∑' n : ℕ, F n ω := by + funext ω + rw [Real.exp_eq_exp_ℝ, NormedSpace.exp_eq_tsum_div] + simp [F, gammaExpSeriesTerm] + have hmgf_series : + mgf X μ l = ∑' n : ℕ, ∫ ω, F n ω ∂μ := by + rw [mgf, h_exp_series] + symm + exact integral_tsum_of_summable_integral_norm hF_int hF_sum_norm + have hhead0 : ∫ ω, F 0 ω ∂μ = 1 := by + simp [F, gammaExpSeriesTerm] + have hXone := + gammaMomentGrowth_natCast_bound + (μ := μ) (X := X) (σ := σ) (M := M) (n := 1) (by norm_num) hXmom + have hX_abs_int : Integrable (fun ω => |X ω|) μ := by + simpa using hXone.1 + have hX_int : Integrable X μ := by + have hX_norm_int : Integrable (fun ω => ‖X ω‖) μ := by + simpa [Real.norm_eq_abs] using hX_abs_int + exact (integrable_norm_iff hXm.aestronglyMeasurable).1 hX_norm_int + have hX_abs_bound : ∫ ω, |X ω| ∂μ ≤ M := by + simpa using hXone.2 + have hhead1_le : ∫ ω, F 1 ω ∂μ ≤ l * M := by + calc + ∫ ω, F 1 ω ∂μ = l * (∫ ω, X ω ∂μ) := by + simpa [F, gammaExpSeriesTerm] using integral_const_mul l X + _ ≤ l * (∫ ω, |X ω| ∂μ) := by + exact mul_le_mul_of_nonneg_left + (integral_mono_ae hX_int hX_abs_int + (Filter.Eventually.of_forall fun ω => le_abs_self (X ω))) hl + _ ≤ l * M := by + gcongr + have htail_sum_int : Summable (fun n : ℕ => ∫ ω, F (n + 2) ω ∂μ) := by + exact (summable_nat_add_iff (f := fun n : ℕ => ∫ ω, F n ω ∂μ) 2).2 hF_sum_int + have hr_nonneg : 0 ≤ r := by + dsimp [r] + positivity + have hr_le_half : r ≤ 1 / 2 := by + dsimp [r] + exact exp_mul_mul_le_half_of_le_inv_two_exp_mul hM hl_small + have hr_lt_one : r < 1 := lt_of_le_of_lt hr_le_half (by norm_num) + have hgeom : Summable (fun n : ℕ => r ^ (n + 2)) := by + have hs : Summable (fun n : ℕ => r ^ n) := + summable_geometric_of_lt_one hr_nonneg hr_lt_one + simpa [pow_add, pow_two, mul_assoc, mul_left_comm, mul_comm] using + hs.mul_left (r ^ (2 : ℕ)) + have htail_le : + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ ≤ ∑' n : ℕ, r ^ (n + 2) := by + refine htail_sum_int.tsum_le_tsum (fun n => ?_) hgeom + have hnorm_le : ∫ ω, F (n + 2) ω ∂μ ≤ ∫ ω, ‖F (n + 2) ω‖ ∂μ := by + calc + ∫ ω, F (n + 2) ω ∂μ ≤ |∫ ω, F (n + 2) ω ∂μ| := by + exact le_abs_self _ + _ = ‖∫ ω, F (n + 2) ω ∂μ‖ := by rw [Real.norm_eq_abs] + _ ≤ ∫ ω, ‖F (n + 2) ω‖ ∂μ := norm_integral_le_integral_norm _ + have hgeom_le : ∫ ω, ‖F (n + 2) ω‖ ∂μ ≤ r ^ (n + 2) := by + simpa [F, r, gammaExpTaylorTail_eq_gammaExpSeriesTerm_add_two] using + integral_norm_gammaExpTaylorTail_le_geometric + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hσ hM hl hXmom + exact hnorm_le.trans hgeom_le + calc + mgf X μ l + = (∑ i ∈ Finset.range 2, ∫ ω, F i ω ∂μ) + + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ := by + rw [hmgf_series, ← hF_sum_int.sum_add_tsum_nat_add 2] + _ = 1 + ∫ ω, F 1 ω ∂μ + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ := by + rw [Finset.sum_range_succ, Finset.sum_range_one, hhead0] + _ ≤ 1 + l * M + ∑' n : ℕ, ∫ ω, F (n + 2) ω ∂μ := by + gcongr + _ ≤ 1 + l * M + ∑' n : ℕ, r ^ (n + 2) := by + gcongr + _ = 1 + l * M + ∑' n : ℕ, (Real.exp 1 * M * l) ^ (n + 2) := by + simp [r] + +/-- Clean small-`λ` mgf estimate for centered `Γ_σ` random variables in the +exponential regime `σ ≥ 1`. -/ +theorem mgf_le_one_add_two_mul_sq_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ 1 + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ) := by + let r : ℝ := Real.exp 1 * M * l + have hbase := + mgf_le_one_add_tsum_geometric_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmean hXmom + have hr_nonneg : 0 ≤ r := by + dsimp [r] + positivity + have hr_le_half : r ≤ 1 / 2 := by + dsimp [r] + exact exp_mul_mul_le_half_of_le_inv_two_exp_mul hM hl_small + have hr_lt_one : r < 1 := lt_of_le_of_lt hr_le_half (by norm_num) + have hsum : + ∑' n : ℕ, r ^ (n + 2) = r ^ (2 : ℕ) * (1 - r)⁻¹ := by + calc + ∑' n : ℕ, r ^ (n + 2) = ∑' n : ℕ, (r ^ (2 : ℕ)) * r ^ n := by + congr with n + rw [pow_add, pow_two] + ring + _ = r ^ (2 : ℕ) * ∑' n : ℕ, r ^ n := by rw [tsum_mul_left] + _ = r ^ (2 : ℕ) * (1 - r)⁻¹ := by + rw [tsum_geometric_of_lt_one hr_nonneg hr_lt_one] + have hgeom_le : ∑' n : ℕ, r ^ (n + 2) ≤ 2 * r ^ (2 : ℕ) := by + rw [hsum] + have hhalf_le : (1 : ℝ) / 2 ≤ 1 - r := by + linarith + have hden_pos : 0 < 1 - r := by + linarith + have hinv_le : (1 - r)⁻¹ ≤ 2 := by + have := one_div_le_one_div_of_le (by norm_num : 0 < (1 : ℝ) / 2) hhalf_le + simpa using this + calc + r ^ (2 : ℕ) * (1 - r)⁻¹ ≤ r ^ (2 : ℕ) * 2 := by + gcongr + _ = 2 * r ^ (2 : ℕ) := by ring + calc + mgf X μ l ≤ 1 + ∑' n : ℕ, r ^ (n + 2) := by + simpa [r] using hbase + _ ≤ 1 + 2 * r ^ (2 : ℕ) := by + gcongr + _ = 1 + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ) := by + simp [r] + +/-- Exponential small-`λ` mgf estimate for centered `Γ_σ` random variables in +the regime `σ ≥ 1`. -/ +theorem mgf_le_exp_two_mul_sq_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ Real.exp (2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + calc + mgf X μ l ≤ 1 + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ) := by + exact mgf_le_one_add_two_mul_sq_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmean hXmom + _ ≤ Real.exp (2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + simpa [add_comm] using Real.add_one_le_exp (2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) + +/-- Under the stronger quarter-scale hypothesis `e M λ ≤ 1/4`, the small-`λ` +mgf is universally bounded by `2`. -/ +theorem mgf_le_two_of_gammaMomentGrowth_quarter_small + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 < M) (hl : 0 ≤ l) + (hl_quarter : l ≤ (4 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ 2 := by + have hsmall : + l ≤ (2 * Real.exp 1 * M)⁻¹ := by + have hden : + 0 < 2 * Real.exp 1 * M := by + positivity + have hfour_le : + (4 * Real.exp 1 * M)⁻¹ ≤ (2 * Real.exp 1 * M)⁻¹ := by + have haux : 2 * Real.exp 1 * M ≤ 4 * Real.exp 1 * M := by + have hbase_nonneg : 0 ≤ Real.exp 1 * M := + mul_nonneg (Real.exp_pos 1).le hM.le + calc + 2 * Real.exp 1 * M = 2 * (Real.exp 1 * M) := by ring + _ ≤ 4 * (Real.exp 1 * M) := + mul_le_mul_of_nonneg_right (by norm_num : (2 : ℝ) ≤ 4) hbase_nonneg + _ = 4 * Real.exp 1 * M := by ring + simpa [one_div] using (one_div_le_one_div_of_le hden haux) + exact hl_quarter.trans hfour_le + have hmain := + mgf_le_one_add_linear_add_tsum_geometric_of_gammaMomentGrowth_small + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM.le hl hsmall hXmom + let r : ℝ := Real.exp 1 * M * l + have hr_nonneg : 0 ≤ r := by + dsimp [r] + positivity + have hr_le_quarter : r ≤ (1 / 4 : ℝ) := by + dsimp [r] + exact exp_mul_mul_le_quarter_of_le_inv_four_exp_mul hM.le hl_quarter + have hr_lt_one : r < 1 := lt_of_le_of_lt hr_le_quarter (by norm_num) + have hsum : + ∑' n : ℕ, r ^ (n + 2) = r ^ (2 : ℕ) * (1 - r)⁻¹ := by + calc + ∑' n : ℕ, r ^ (n + 2) = ∑' n : ℕ, (r ^ (2 : ℕ)) * r ^ n := by + congr with n + rw [pow_add, pow_two] + ring + _ = r ^ (2 : ℕ) * ∑' n : ℕ, r ^ n := by rw [tsum_mul_left] + _ = r ^ (2 : ℕ) * (1 - r)⁻¹ := by + rw [tsum_geometric_of_lt_one hr_nonneg hr_lt_one] + have htail_le : ∑' n : ℕ, r ^ (n + 2) ≤ 1 / 2 := by + rw [hsum] + have hhalf_le : (1 : ℝ) / 2 ≤ 1 - r := by + linarith + have hinv_le : (1 - r)⁻¹ ≤ 2 := by + have := one_div_le_one_div_of_le (by norm_num : 0 < (1 : ℝ) / 2) hhalf_le + simpa using this + have hr_sq_le : r ^ (2 : ℕ) ≤ (1 / 4 : ℝ) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hr_nonneg hr_le_quarter 2 + calc + r ^ (2 : ℕ) * (1 - r)⁻¹ ≤ r ^ (2 : ℕ) * 2 := by + gcongr + _ ≤ (1 / 4 : ℝ) ^ (2 : ℕ) * 2 := by + gcongr + _ ≤ 1 / 2 := by norm_num + have hlin_le : l * M ≤ 1 / 2 := by + have htmp := mul_le_mul_of_nonneg_left hl_quarter hM.le + have hcalc : M * (4 * Real.exp 1 * M)⁻¹ = (4 * Real.exp 1)⁻¹ := by + field_simp [hM.ne', Real.exp_ne_zero] + calc + l * M = M * l := by ring + _ ≤ M * (4 * Real.exp 1 * M)⁻¹ := htmp + _ = (4 * Real.exp 1)⁻¹ := hcalc + _ ≤ 1 / 2 := by + have hexp : (1 : ℝ) ≤ Real.exp 1 := by + exact Real.one_le_exp (show (0 : ℝ) ≤ 1 by norm_num) + have hden : (2 : ℝ) ≤ 4 * Real.exp 1 := by + calc + (2 : ℝ) = 2 * 1 := by ring + _ ≤ 2 * Real.exp 1 := + mul_le_mul_of_nonneg_left hexp (by norm_num : 0 ≤ (2 : ℝ)) + _ ≤ 4 * Real.exp 1 := + mul_le_mul_of_nonneg_right (by norm_num : (2 : ℝ) ≤ 4) + (Real.exp_pos 1).le + have hinv : (4 * Real.exp 1)⁻¹ ≤ (2 : ℝ)⁻¹ := by + simpa [one_div] using + (one_div_le_one_div_of_le (show 0 < (2 : ℝ) by norm_num) hden) + simpa using hinv + calc + mgf X μ l ≤ 1 + l * M + ∑' n : ℕ, (Real.exp 1 * M * l) ^ (n + 2) := hmain + _ = 1 + l * M + ∑' n : ℕ, r ^ (n + 2) := by simp [r] + _ ≤ 2 := by + have hsum_le : + l * M + (∑' n : ℕ, r ^ (n + 2)) ≤ (1 / 2 : ℝ) + 1 / 2 := + add_le_add hlin_le htail_le + calc + 1 + l * M + (∑' n : ℕ, r ^ (n + 2)) + ≤ 1 + ((1 / 2 : ℝ) + 1 / 2) := + by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hsum_le (1 : ℝ) + _ = 2 := by norm_num + +private theorem gammaExpLargeLambdaControl + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 < σ) (hM : 0 < M) (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + let B : ℝ := Real.exp 1 * M + let Y : Ω → ℝ := fun ω => |B⁻¹ * X ω| ^ σ + let δ : ℝ := (4 * Real.exp 1 * gammaMomentConst 1)⁻¹ + let C : ℝ := gammaExpLargeLambdaConst σ * (B * l) ^ gammaExpConjExponent σ + Integrable (fun ω => Real.exp (C + δ * Y ω)) μ ∧ + (∀ ω, l * X ω ≤ C + δ * Y ω) ∧ + mgf Y μ δ ≤ 2 := by + let B : ℝ := Real.exp 1 * M + let Y : Ω → ℝ := fun ω => |B⁻¹ * X ω| ^ σ + let δ : ℝ := (4 * Real.exp 1 * gammaMomentConst 1)⁻¹ + let C : ℝ := gammaExpLargeLambdaConst σ * (B * l) ^ gammaExpConjExponent σ + change + Integrable (fun ω => Real.exp (C + δ * Y ω)) μ ∧ + (∀ ω, l * X ω ≤ C + δ * Y ω) ∧ + mgf Y μ δ ≤ 2 + have hσ_pos : 0 < σ := by linarith + have hσ_ne : σ ≠ 0 := by linarith + have hB_pos : 0 < B := by + dsimp [B] + positivity + have hscaled : IsBigO μ (gammaSigma σ) (fun ω => B⁻¹ * X ω) 1 := by + have hX_bigO : + IsBigO μ (gammaSigma σ) X B := by + exact isBigO_gammaSigma_of_hasGammaMomentGrowthWith + (μ := μ) (X := X) (M := M) (σ := σ) hσ_pos hM hXmom + have hscaled' := + IsBigO.const_mul (μ := μ) (Ψ := gammaSigma σ) (X := X) (A := B) (c := B⁻¹) + (inv_nonneg.mpr hB_pos.le) hX_bigO + have hscale : B⁻¹ * B = (1 : ℝ) := by + field_simp [hB_pos.ne'] + simpa [hscale] using hscaled' + have hYm : AEMeasurable Y μ := by + dsimp [Y] + have hscaledm : AEMeasurable (fun ω => B⁻¹ * X ω) μ := by + simpa [mul_comm] using hXm.const_mul B⁻¹ + exact (Real.continuous_rpow_const hσ_pos.le).measurable.comp_aemeasurable + (continuous_abs.measurable.comp_aemeasurable hscaledm) + have hY_bigO : IsBigO μ (gammaSigma 1) Y 1 := by + have hpow_bigO := + (isBigO_gammaSigma_rpow_iff + (μ := μ) (X := fun ω => B⁻¹ * X ω) (A := 1) (σ := σ) (p := σ) + hσ_pos (by norm_num : 0 ≤ (1 : ℝ))).1 hscaled + have hσ_div : σ / σ = (1 : ℝ) := by + field_simp [hσ_ne] + simpa [Y, hσ_div] using hpow_bigO + have hYmom : HasGammaMomentGrowthWith μ 1 Y (gammaMomentConst 1) := by + simpa using hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := Y) (K := 1) (σ := 1) + zero_lt_one zero_lt_one hYm hY_bigO + have hγone_pos : 0 < gammaMomentConst 1 := gammaMomentConst_pos zero_lt_one + have hδ_pos : 0 < δ := by + dsimp [δ] + have hden_pos : 0 < 4 * Real.exp 1 * gammaMomentConst 1 := by + positivity + exact inv_pos.mpr hden_pos + have hδ_small : δ ≤ (2 * Real.exp 1 * gammaMomentConst 1)⁻¹ := by + have hden : 0 < 2 * Real.exp 1 * gammaMomentConst 1 := by + positivity + have haux : 2 * Real.exp 1 * gammaMomentConst 1 ≤ 4 * Real.exp 1 * gammaMomentConst 1 := by + have hbase_nonneg : 0 ≤ Real.exp 1 * gammaMomentConst 1 := + mul_nonneg (Real.exp_pos 1).le hγone_pos.le + calc + 2 * Real.exp 1 * gammaMomentConst 1 = 2 * (Real.exp 1 * gammaMomentConst 1) := by + ring + _ ≤ 4 * (Real.exp 1 * gammaMomentConst 1) := + mul_le_mul_of_nonneg_right (by norm_num : (2 : ℝ) ≤ 4) hbase_nonneg + _ = 4 * Real.exp 1 * gammaMomentConst 1 := by ring + simpa [δ, one_div] using (one_div_le_one_div_of_le hden haux) + have hYint : Integrable (fun ω => Real.exp (δ * Y ω)) μ := by + exact integrable_exp_mul_of_gammaMomentGrowth_small + (μ := μ) (X := Y) (σ := 1) (M := gammaMomentConst 1) (l := δ) + hYm (by norm_num) hγone_pos.le hδ_pos.le hδ_small hYmom + have hYmgf : mgf Y μ δ ≤ 2 := by + exact mgf_le_two_of_gammaMomentGrowth_quarter_small + (μ := μ) (X := Y) (σ := 1) (M := gammaMomentConst 1) (l := δ) + hYm (by norm_num) hγone_pos hδ_pos.le (by simp [δ]) hYmom + have hpointwise : ∀ ω, l * X ω ≤ C + δ * Y ω := by + intro ω + have habs : l * X ω ≤ l * |X ω| := by + exact mul_le_mul_of_nonneg_left (le_abs_self (X ω)) hl + have hyoung := + gammaExp_young_scale_delta (σ := σ) (B := B) (l := l) + (t := |B⁻¹ * X ω|) (δ := δ) hσ hB_pos.le hl (abs_nonneg _) hδ_pos + have habs_scaled : B * |B⁻¹ * X ω| = |X ω| := by + calc + B * |B⁻¹ * X ω| = B * (|B⁻¹| * |X ω|) := by rw [abs_mul] + _ = B * (B⁻¹ * |X ω|) := by + rw [abs_of_nonneg (inv_nonneg.mpr hB_pos.le)] + _ = (B * B⁻¹) * |X ω| := by ring + _ = |X ω| := by rw [mul_inv_cancel₀ hB_pos.ne', one_mul] + have hyoung1 : l * (B * |B⁻¹ * X ω|) ≤ δ * Y ω + C := by + simpa [C, Y, δ, gammaExpLargeLambdaConst, add_comm, add_left_comm, add_assoc] using hyoung + have hyoung' : l * |X ω| ≤ C + δ * Y ω := by + calc + l * |X ω| = l * (B * |B⁻¹ * X ω|) := by rw [habs_scaled] + _ ≤ δ * Y ω + C := hyoung1 + _ = C + δ * Y ω := by ring + exact le_trans habs hyoung' + have hUpperInt : Integrable (fun ω => Real.exp (C + δ * Y ω)) μ := by + have hmul : Integrable (fun ω => Real.exp C * Real.exp (δ * Y ω)) μ := by + exact hYint.const_mul (Real.exp C) + simpa [Real.exp_add, add_comm, add_left_comm, add_assoc, + mul_comm, mul_left_comm, mul_assoc] using hmul + exact ⟨hUpperInt, hpointwise, hYmgf⟩ + +/-- One-variable exponential mgf bound in the Chapter 4 regime `σ > 1`. +The proof reduces `|X|^σ` to a unit-scale `Γ₁` random variable and feeds it +through the small-parameter `Γ₁` mgf estimate. -/ +theorem mgf_le_two_mul_exp_of_gammaMomentGrowth_of_one_lt + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 < σ) (hM : 0 < M) (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + mgf X μ l ≤ + 2 * Real.exp + (gammaExpLargeLambdaConst σ * + (Real.exp 1 * M * l) ^ gammaExpConjExponent σ) := by + let B : ℝ := Real.exp 1 * M + let Y : Ω → ℝ := fun ω => |B⁻¹ * X ω| ^ σ + let δ : ℝ := (4 * Real.exp 1 * gammaMomentConst 1)⁻¹ + let C : ℝ := gammaExpLargeLambdaConst σ * (B * l) ^ gammaExpConjExponent σ + have hcontrol := gammaExpLargeLambdaControl + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hXmom + change + Integrable (fun ω => Real.exp (C + δ * Y ω)) μ ∧ + (∀ ω, l * X ω ≤ C + δ * Y ω) ∧ + mgf Y μ δ ≤ 2 at hcontrol + obtain ⟨hUpperInt, hpointwise, hYmgf⟩ := hcontrol + have hUpperInt' : Integrable (fun ω => Real.exp (1 * (C + δ * Y ω))) μ := by + simpa using hUpperInt + have hmgf_le : + mgf (fun ω => l * X ω) μ 1 ≤ mgf (fun ω => C + δ * Y ω) μ 1 := by + exact mgf_mono_of_nonneg + (μ := μ) (X := fun ω => l * X ω) (Y := fun ω => C + δ * Y ω) + (Filter.Eventually.of_forall hpointwise) (by norm_num) hUpperInt' + calc + mgf X μ l = mgf (fun ω => l * X ω) μ 1 := by + simpa using (mgf_const_mul (X := X) (μ := μ) (t := (1 : ℝ)) l).symm + _ ≤ mgf (fun ω => C + δ * Y ω) μ 1 := hmgf_le + _ = Real.exp C * mgf Y μ δ := by + rw [mgf_const_add, mgf_const_mul] + simp + _ ≤ Real.exp C * 2 := by + gcongr + _ = 2 * Real.exp C := by ring + _ = 2 * Real.exp + (gammaExpLargeLambdaConst σ * + (Real.exp 1 * M * l) ^ gammaExpConjExponent σ) := by + simp [C, B] + +/-- Exponential integrability in the Chapter 4 large-`λ` regime `σ > 1`. -/ +theorem integrable_exp_mul_of_gammaMomentGrowth_of_one_lt + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 < σ) (hM : 0 < M) (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (fun ω => Real.exp (l * X ω)) μ := by + let B : ℝ := Real.exp 1 * M + let Y : Ω → ℝ := fun ω => |B⁻¹ * X ω| ^ σ + let δ : ℝ := (4 * Real.exp 1 * gammaMomentConst 1)⁻¹ + let C : ℝ := gammaExpLargeLambdaConst σ * (B * l) ^ gammaExpConjExponent σ + have hcontrol := gammaExpLargeLambdaControl + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hXmom + change + Integrable (fun ω => Real.exp (C + δ * Y ω)) μ ∧ + (∀ ω, l * X ω ≤ C + δ * Y ω) ∧ + mgf Y μ δ ≤ 2 at hcontrol + obtain ⟨hUpperInt, hpointwise, _hYmgf⟩ := hcontrol + have hExpMeas : AEStronglyMeasurable (fun ω => Real.exp (l * X ω)) μ := by + have hmul : AEMeasurable (fun ω => l * X ω) μ := by + simpa [mul_comm] using hXm.const_mul l + exact hmul.exp.aestronglyMeasurable + refine Integrable.mono' hUpperInt hExpMeas ?_ + refine Filter.Eventually.of_forall ?_ + intro ω + have hle : l * X ω ≤ C + δ * Y ω := hpointwise ω + have hexp_le : Real.exp (l * X ω) ≤ Real.exp (C + δ * Y ω) := by + exact Real.exp_le_exp.2 hle + have hleft_nonneg : 0 ≤ Real.exp (l * X ω) := by positivity + have hright_nonneg : 0 ≤ Real.exp (C + δ * Y ω) := by positivity + simpa [Real.norm_eq_abs, abs_of_nonneg hleft_nonneg, abs_of_nonneg hright_nonneg] using + hexp_le + +/-- Explicit coefficient after pushing the large-`λ` mgf estimate from +moment-growth witnesses back to the note-facing `O_{Γ_σ}` scale. -/ +noncomputable def gammaSigmaLargeMgfConst (σ : ℝ) : ℝ := + gammaExpLargeLambdaConst σ * + (Real.exp 1 * gammaMomentConst σ) ^ gammaExpConjExponent σ + +/-- Large-`λ` one-variable mgf bound stated directly for `O_{Γ_σ}` random +variables with `σ > 1`. -/ +theorem mgf_le_two_mul_exp_of_isBigO_gammaSigma_of_one_lt + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ K l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 < σ) (hK : 0 < K) (hl : 0 ≤ l) + (hX : IsBigO μ (gammaSigma σ) X K) : + mgf X μ l ≤ + 2 * Real.exp + (gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ) := by + have hσ_pos : 0 < σ := by linarith + have hmom : + HasGammaMomentGrowthWith μ σ X (gammaMomentConst σ * K) := by + exact hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) hσ_pos hK hXm hX + have hM_pos : 0 < gammaMomentConst σ * K := by + exact mul_pos (gammaMomentConst_pos hσ_pos) hK + have hmain := + mgf_le_two_mul_exp_of_gammaMomentGrowth_of_one_lt + (μ := μ) (X := X) (σ := σ) (M := gammaMomentConst σ * K) (l := l) + hXm hσ hM_pos hl hmom + have hscale : + gammaExpLargeLambdaConst σ * + (Real.exp 1 * (gammaMomentConst σ * K) * l) ^ gammaExpConjExponent σ = + gammaSigmaLargeMgfConst σ * (K * l) ^ gammaExpConjExponent σ := by + let q : ℝ := gammaExpConjExponent σ + have hconst_pos : 0 < Real.exp 1 * gammaMomentConst σ := by + exact mul_pos (Real.exp_pos 1) (gammaMomentConst_pos hσ_pos) + have hKl_nonneg : 0 ≤ K * l := mul_nonneg hK.le hl + calc + gammaExpLargeLambdaConst σ * + (Real.exp 1 * (gammaMomentConst σ * K) * l) ^ q + = gammaExpLargeLambdaConst σ * + (((Real.exp 1 * gammaMomentConst σ) * (K * l)) ^ q) := by + congr 2 + ring + _ = gammaExpLargeLambdaConst σ * + ((Real.exp 1 * gammaMomentConst σ) ^ q * (K * l) ^ q) := by + rw [Real.mul_rpow hconst_pos.le hKl_nonneg] + _ = gammaSigmaLargeMgfConst σ * (K * l) ^ q := by + dsimp [gammaSigmaLargeMgfConst, q] + ring + simpa [hscale] using hmain + +/-- Exponential integrability in the note-facing `O_{Γ_σ}` language for +`σ > 1`. -/ +theorem integrable_exp_mul_of_isBigO_gammaSigma_of_one_lt + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ K l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 < σ) (hK : 0 < K) (hl : 0 ≤ l) + (hX : IsBigO μ (gammaSigma σ) X K) : + Integrable (fun ω => Real.exp (l * X ω)) μ := by + have hσ_pos : 0 < σ := by linarith + have hmom : + HasGammaMomentGrowthWith μ σ X (gammaMomentConst σ * K) := by + exact hasGammaMomentGrowthWith_of_isBigO_gammaSigma + (μ := μ) (X := X) (K := K) (σ := σ) hσ_pos hK hXm hX + have hM_pos : 0 < gammaMomentConst σ * K := by + exact mul_pos (gammaMomentConst_pos hσ_pos) hK + exact integrable_exp_mul_of_gammaMomentGrowth_of_one_lt + (μ := μ) (X := X) (σ := σ) (M := gammaMomentConst σ * K) (l := l) + hXm hσ hM_pos hl hmom + +/-- Chernoff upper-tail estimate coming from the small-`λ` `Γ_σ` mgf bound. -/ +theorem measureReal_upperTailEvent_le_exp_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l a : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + μ.real (upperTailEvent X a) ≤ + Real.exp (-l * a + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + have hsubset : upperTailEvent X a ⊆ {ω | a ≤ X ω} := by + intro ω hω + simpa [upperTailEvent] using le_of_lt hω + refine (measureReal_mono (s₂ := {ω | a ≤ X ω}) hsubset).trans ?_ + calc + μ.real {ω | a ≤ X ω} + ≤ Real.exp (-l * a) * mgf X μ l := by + exact measure_ge_le_exp_mul_mgf + (μ := μ) (X := X) (ε := a) (t := l) hl + (integrable_exp_mul_of_gammaMomentGrowth_small + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmom) + _ ≤ Real.exp (-l * a) * Real.exp (2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + gcongr + exact mgf_le_exp_two_mul_sq_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmean hXmom + _ = Real.exp (-l * a + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + rw [← Real.exp_add] + +/-- Absolute-tail version of the small-`λ` `Γ_σ` Chernoff estimate. -/ +theorem measureReal_absTailEvent_le_two_mul_exp_of_gammaMomentGrowth_small_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l a : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + μ.real (absTailEvent X a) ≤ + 2 * Real.exp (-l * a + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + let B : ℝ := Real.exp (-l * a + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) + have hsubset : + absTailEvent X a ⊆ upperTailEvent X a ∪ upperTailEvent (fun ω => -X ω) a := by + intro ω hω + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by simpa [absTailEvent, upperTailEvent] using hω) + have hXmean_neg : ∫ ω, -X ω ∂μ = 0 := by + calc + ∫ ω, -X ω ∂μ = -∫ ω, X ω ∂μ := by simpa using integral_neg X + _ = 0 := by rw [hXmean, neg_zero] + have hXmom_neg : HasGammaMomentGrowthWith μ σ (fun ω => -X ω) M := by + intro p hp + simpa using hXmom (p := p) hp + have hupper : + μ.real (upperTailEvent X a) ≤ B := by + simpa [B] using + measureReal_upperTailEvent_le_exp_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) (a := a) + hXm hσ hM hl hl_small hXmean hXmom + have hupper_neg : + μ.real (upperTailEvent (fun ω => -X ω) a) ≤ B := by + simpa [B] using + measureReal_upperTailEvent_le_exp_of_gammaMomentGrowth_small_of_integral_eq_zero + (μ := μ) (X := fun ω => -X ω) (σ := σ) (M := M) (l := l) (a := a) + hXm.neg hσ hM hl hl_small hXmean_neg hXmom_neg + calc + μ.real (absTailEvent X a) + ≤ μ.real (upperTailEvent X a ∪ upperTailEvent (fun ω => -X ω) a) := by + exact measureReal_mono hsubset + _ ≤ μ.real (upperTailEvent X a) + μ.real (upperTailEvent (fun ω => -X ω) a) := by + exact measureReal_union_le _ _ + _ ≤ B + B := by + gcongr + _ = 2 * Real.exp (-l * a + 2 * (Real.exp 1 * M * l) ^ (2 : ℕ)) := by + simp [B, two_mul] + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/Preliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/Preliminaries.lean new file mode 100644 index 0000000000..f3b514150c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/GammaSigmaExpRegime/Preliminaries.lean @@ -0,0 +1,668 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Real.Pi.Bounds +public import Mathlib.Analysis.MeanInequalities +public import Mathlib.Analysis.SpecialFunctions.Stirling +public import Mathlib.Probability.Moments.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.GammaSigma + +/-! # Preliminaries -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The Hölder-conjugate exponent `σ / (σ - 1)` used in the large-`λ` +exponential regime when `1 < σ`. -/ +noncomputable def gammaExpConjExponent (σ : ℝ) : ℝ := + σ / (σ - 1) + +lemma gammaExpConjExponent_pos {σ : ℝ} (hσ : 1 < σ) : + 0 < gammaExpConjExponent σ := by + have hσ_pos : 0 < σ := by linarith + have hσ_sub_pos : 0 < σ - 1 := by linarith + dsimp [gammaExpConjExponent] + exact div_pos hσ_pos hσ_sub_pos + +lemma gammaExpConjExponent_holderConjugate {σ : ℝ} (hσ : 1 < σ) : + σ.HolderConjugate (gammaExpConjExponent σ) := by + simpa [gammaExpConjExponent] using + (Real.holderConjugate_iff_eq_conjExponent hσ).2 rfl + +lemma inv_gammaExpConjExponent {σ : ℝ} (hσ : 1 < σ) : + (gammaExpConjExponent σ)⁻¹ = (σ - 1) / σ := by + have hσ_ne : σ ≠ 0 := by linarith + have hσ_sub_ne : σ - 1 ≠ 0 := sub_ne_zero.mpr hσ.ne' + dsimp [gammaExpConjExponent] + field_simp [hσ_ne, hσ_sub_ne] + +/-- Young's inequality in the Chapter 4 large-`λ` shape. -/ +lemma gammaExp_young {σ l t : ℝ} (hσ : 1 < σ) (hl : 0 ≤ l) (ht : 0 ≤ t) : + l * t ≤ t ^ σ / σ + ((σ - 1) / σ) * l ^ gammaExpConjExponent σ := by + have hyoung := + Real.young_inequality_of_nonneg ht hl + (gammaExpConjExponent_holderConjugate hσ) + have hq : + l ^ gammaExpConjExponent σ / gammaExpConjExponent σ = + ((σ - 1) / σ) * l ^ gammaExpConjExponent σ := by + rw [div_eq_mul_inv, inv_gammaExpConjExponent hσ] + ring + calc + l * t = t * l := by ring + _ ≤ t ^ σ / σ + l ^ gammaExpConjExponent σ / gammaExpConjExponent σ := hyoung + _ = t ^ σ / σ + ((σ - 1) / σ) * l ^ gammaExpConjExponent σ := by + rw [hq] + +/-- Scaled Young inequality matching the tail parameterization `x = B t`. -/ +lemma gammaExp_young_scale {σ B l t : ℝ} + (hσ : 1 < σ) (hB : 0 ≤ B) (hl : 0 ≤ l) (ht : 0 ≤ t) : + l * (B * t) ≤ t ^ σ / σ + ((σ - 1) / σ) * (B * l) ^ gammaExpConjExponent σ := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + gammaExp_young (σ := σ) (l := B * l) (t := t) hσ (mul_nonneg hB hl) ht + +/-- Exponent comparison extracted from `gammaExp_young`. This is the basic +kernel estimate behind the large-`λ` regime. -/ +lemma gammaExp_largeLambda_exponent_le {σ l t : ℝ} + (hσ : 1 < σ) (hl : 0 ≤ l) (ht : 0 ≤ t) : + l * t - t ^ σ ≤ + ((σ - 1) / σ) * l ^ gammaExpConjExponent σ - + ((σ - 1) / σ) * t ^ σ := by + have hyoung := gammaExp_young (σ := σ) (l := l) (t := t) hσ hl ht + have hσ_ne : σ ≠ 0 := by linarith + calc + l * t - t ^ σ ≤ (t ^ σ / σ + ((σ - 1) / σ) * l ^ gammaExpConjExponent σ) - t ^ σ := by + exact sub_le_sub_right hyoung _ + _ = ((σ - 1) / σ) * l ^ gammaExpConjExponent σ - + ((σ - 1) / σ) * t ^ σ := by + field_simp [hσ_ne] + ring + +/-- Exponential form of the Chapter 4 large-`λ` kernel comparison. -/ +lemma exp_gammaExp_largeLambda_exponent_le {σ l t : ℝ} + (hσ : 1 < σ) (hl : 0 ≤ l) (ht : 0 ≤ t) : + Real.exp (l * t - t ^ σ) ≤ + Real.exp (((σ - 1) / σ) * l ^ gammaExpConjExponent σ) * + Real.exp (-((σ - 1) / σ) * t ^ σ) := by + have hle := Real.exp_le_exp.2 + (gammaExp_largeLambda_exponent_le (σ := σ) (l := l) (t := t) hσ hl ht) + calc + Real.exp (l * t - t ^ σ) + ≤ Real.exp (((σ - 1) / σ) * l ^ gammaExpConjExponent σ - + ((σ - 1) / σ) * t ^ σ) := hle + _ = Real.exp (((σ - 1) / σ) * l ^ gammaExpConjExponent σ) * + Real.exp (-((σ - 1) / σ) * t ^ σ) := by + rw [sub_eq_add_neg, Real.exp_add] + congr 2 + ring + +lemma gammaExpSlope_pos {σ : ℝ} (hσ : 1 < σ) : + 0 < (σ - 1) / σ := by + have hσ_pos : 0 < σ := by linarith + have hσ_sub_pos : 0 < σ - 1 := by linarith + exact div_pos hσ_sub_pos hσ_pos + +/-- The large-`λ` shell kernel is summable after comparison with an +exponentially decaying sequence. -/ +lemma summable_nat_sq_mul_exp_gammaExpKernel {σ α : ℝ} + (hσ : 1 < σ) (hα : 0 ≤ α) : + Summable (fun n : ℕ => (n : ℝ) ^ (2 : ℕ) * Real.exp (α * n - (n : ℝ) ^ σ)) := by + let c : ℝ := (σ - 1) / σ + have hc_pos : 0 < c := gammaExpSlope_pos hσ + have hbase : + Summable (fun n : ℕ => (n : ℝ) ^ (2 : ℕ) * Real.exp (-c * n)) := by + simpa [c] using Real.summable_pow_mul_exp_neg_nat_mul 2 hc_pos + refine Summable.of_nonneg_of_le + (fun _ => mul_nonneg (by positivity) (by positivity)) + (fun n => ?_) + (hbase.mul_left (Real.exp (c * α ^ gammaExpConjExponent σ))) + have hn_nonneg : 0 ≤ (n : ℝ) := by positivity + have hkernel := + exp_gammaExp_largeLambda_exponent_le (σ := σ) (l := α) (t := n) hσ hα hn_nonneg + have hnpow_ge : (n : ℝ) ≤ (n : ℝ) ^ σ := by + rcases Nat.eq_zero_or_pos n with rfl | hn + · simpa using (Real.rpow_nonneg (show 0 ≤ (0 : ℝ) by positivity) σ) + · have hn_one : (1 : ℝ) ≤ n := by exact_mod_cast hn + exact Real.self_le_rpow_of_one_le hn_one hσ.le + have hExpMono : + Real.exp (-c * (n : ℝ) ^ σ) ≤ Real.exp (-c * n) := by + apply Real.exp_le_exp.2 + exact mul_le_mul_of_nonpos_left hnpow_ge (by linarith [hc_pos]) + have hkernel' : + Real.exp (α * n - (n : ℝ) ^ σ) ≤ + Real.exp (c * α ^ gammaExpConjExponent σ) * Real.exp (-c * n) := by + calc + Real.exp (α * n - (n : ℝ) ^ σ) + ≤ Real.exp (c * α ^ gammaExpConjExponent σ) * Real.exp (-c * (n : ℝ) ^ σ) := hkernel + _ ≤ Real.exp (c * α ^ gammaExpConjExponent σ) * Real.exp (-c * n) := by + exact mul_le_mul_of_nonneg_left hExpMono (by positivity) + have hmul := + mul_le_mul_of_nonneg_left hkernel' (by positivity : 0 ≤ (n : ℝ) ^ (2 : ℕ)) + simpa [mul_assoc, mul_left_comm, mul_comm] using hmul + +/-- The scaling constant produced by the `δ`-version of Young's inequality in +the exponential regime `σ > 1`. -/ +noncomputable def gammaExpYoungScaleConst (σ δ : ℝ) : ℝ := + ((σ - 1) / σ) * ((((σ * δ) ^ σ⁻¹)⁻¹) ^ gammaExpConjExponent σ) + +lemma gammaExpYoungScaleConst_pos {σ δ : ℝ} (hσ : 1 < σ) (hδ : 0 < δ) : + 0 < gammaExpYoungScaleConst σ δ := by + dsimp [gammaExpYoungScaleConst] + have hleft : 0 < (σ - 1) / σ := gammaExpSlope_pos hσ + have hσδ_pos : 0 < σ * δ := by positivity + have hbase_pos : 0 < (((σ * δ) ^ σ⁻¹)⁻¹) := by + exact inv_pos.mpr (Real.rpow_pos_of_pos hσδ_pos _) + exact mul_pos hleft (Real.rpow_pos_of_pos hbase_pos _) + +/-- `δ`-scaled Young inequality in the Chapter 4 exponential regime. -/ +lemma gammaExp_young_scale_delta {σ B l t δ : ℝ} + (hσ : 1 < σ) (hB : 0 ≤ B) (hl : 0 ≤ l) (ht : 0 ≤ t) (hδ : 0 < δ) : + l * (B * t) ≤ + δ * t ^ σ + gammaExpYoungScaleConst σ δ * (B * l) ^ gammaExpConjExponent σ := by + let c : ℝ := (((σ * δ) ^ σ⁻¹)⁻¹) + have hσ_pos : 0 < σ := by linarith + have hσ_ne : σ ≠ 0 := by linarith + have hσδ_pos : 0 < σ * δ := by positivity + have hc_pos : 0 < c := by + dsimp [c] + exact inv_pos.mpr (Real.rpow_pos_of_pos hσδ_pos _) + have hc_nonneg : 0 ≤ c := hc_pos.le + have hc_inv : c⁻¹ = (σ * δ) ^ σ⁻¹ := by + dsimp [c] + simp + have hyoung := + gammaExp_young (σ := σ) (l := c * (B * l)) (t := c⁻¹ * t) + hσ (mul_nonneg hc_nonneg (mul_nonneg hB hl)) + (mul_nonneg (inv_nonneg.mpr hc_nonneg) ht) + have hfirst : (c⁻¹ * t) ^ σ / σ = δ * t ^ σ := by + calc + (c⁻¹ * t) ^ σ / σ = (((σ * δ) ^ σ⁻¹) * t) ^ σ / σ := by + rw [hc_inv] + _ = ((((σ * δ) ^ σ⁻¹) ^ σ) * t ^ σ) / σ := by + rw [Real.mul_rpow (by positivity) ht] + _ = ((σ * δ) * t ^ σ) / σ := by + rw [Real.rpow_inv_rpow (show 0 ≤ σ * δ by positivity) hσ_ne] + _ = δ * t ^ σ := by + field_simp [hσ_ne] + have hsecond : + ((σ - 1) / σ) * (c * (B * l)) ^ gammaExpConjExponent σ = + gammaExpYoungScaleConst σ δ * (B * l) ^ gammaExpConjExponent σ := by + have hBl_nonneg : 0 ≤ B * l := mul_nonneg hB hl + calc + ((σ - 1) / σ) * (c * (B * l)) ^ gammaExpConjExponent σ + = ((σ - 1) / σ) * + (c ^ gammaExpConjExponent σ * (B * l) ^ gammaExpConjExponent σ) := by + rw [Real.mul_rpow hc_nonneg hBl_nonneg] + _ = gammaExpYoungScaleConst σ δ * (B * l) ^ gammaExpConjExponent σ := by + dsimp [gammaExpYoungScaleConst, c] + ring + have hleft : (c * (B * l)) * (c⁻¹ * t) = l * (B * t) := by + calc + (c * (B * l)) * (c⁻¹ * t) = (c * c⁻¹) * ((B * l) * t) := by ring + _ = (B * l) * t := by rw [mul_inv_cancel₀ hc_pos.ne', one_mul] + _ = l * (B * t) := by ring + calc + l * (B * t) = (c * (B * l)) * (c⁻¹ * t) := hleft.symm + _ ≤ (c⁻¹ * t) ^ σ / σ + ((σ - 1) / σ) * (c * (B * l)) ^ gammaExpConjExponent σ := hyoung + _ = δ * t ^ σ + gammaExpYoungScaleConst σ δ * (B * l) ^ gammaExpConjExponent σ := by + rw [hfirst, hsecond] + +/-- Fixed coefficient appearing in the one-variable large-`λ` mgf estimate for +the Chapter 4 exponential regime `σ > 1`. -/ +noncomputable def gammaExpLargeLambdaConst (σ : ℝ) : ℝ := + gammaExpYoungScaleConst σ ((4 * Real.exp 1 * gammaMomentConst 1)⁻¹) + +/-- The Taylor tail used in the small-`λ` mgf expansion. -/ +def gammaExpTaylorTail (l : ℝ) (X : Ω → ℝ) (n : ℕ) : Ω → ℝ := + fun ω => (l * X ω) ^ (n + 2) / (Nat.factorial (n + 2) : ℝ) + +/-- The full exponential-series term attached to `l * X`. -/ +def gammaExpSeriesTerm (l : ℝ) (X : Ω → ℝ) (n : ℕ) : Ω → ℝ := + fun ω => (l * X ω) ^ n / (Nat.factorial n : ℝ) + +omit [MeasurableSpace Ω] in +lemma gammaExpTaylorTail_eq_gammaExpSeriesTerm_add_two + (l : ℝ) (X : Ω → ℝ) (n : ℕ) : + gammaExpTaylorTail l X n = gammaExpSeriesTerm l X (n + 2) := by + rfl + +lemma nat_div_exp_pow_le_factorial (n : ℕ) : + (((n : ℝ) / Real.exp 1) ^ n) ≤ (Nat.factorial n : ℝ) := by + obtain rfl | hn := eq_or_ne n 0 + · simp + have hstirling := Stirling.le_factorial_stirling n + have hsqrt_one : 1 ≤ Real.sqrt (2 * Real.pi * n) := by + have hinner : 1 ≤ 2 * Real.pi * n := by + have hpi : 1 ≤ Real.pi := by + linarith [Real.pi_gt_three] + have htwo_pi : 1 ≤ 2 * Real.pi := by + nlinarith + have hn_real : (1 : ℝ) ≤ n := by + exact_mod_cast Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero hn) + nlinarith + exact (Real.one_le_sqrt).2 hinner + have hnonneg : 0 ≤ (((n : ℝ) / Real.exp 1) ^ n) := by positivity + calc + (((n : ℝ) / Real.exp 1) ^ n) + ≤ Real.sqrt (2 * Real.pi * n) * (((n : ℝ) / Real.exp 1) ^ n) := by + nlinarith + _ ≤ (Nat.factorial n : ℝ) := hstirling + +lemma nat_pow_div_factorial_le_exp_nat (n : ℕ) : + ((n : ℝ) ^ n) / (Nat.factorial n : ℝ) ≤ Real.exp n := by + have hfac_pos : 0 < (Nat.factorial n : ℝ) := by positivity + have hmain := nat_div_exp_pow_le_factorial n + have hexp_nat : (Real.exp 1) ^ n = Real.exp n := by + calc + (Real.exp 1) ^ n = Real.exp ((n : ℝ) * 1) := by + rw [(Real.exp_nat_mul 1 n).symm] + _ = Real.exp n := by simp + have hmain' : + ((n : ℝ) / Real.exp 1) ^ n * (Real.exp 1) ^ n ≤ + (Nat.factorial n : ℝ) * (Real.exp 1) ^ n := by + exact mul_le_mul_of_nonneg_right hmain (by positivity) + have hleft : + (((n : ℝ) / Real.exp 1) ^ n) * (Real.exp 1) ^ n = (n : ℝ) ^ n := by + rw [div_pow] + field_simp [Real.exp_pos 1] + refine (div_le_iff₀ hfac_pos).2 ?_ + calc + (n : ℝ) ^ n = (((n : ℝ) / Real.exp 1) ^ n) * (Real.exp 1) ^ n := hleft.symm + _ ≤ (Nat.factorial n : ℝ) * (Real.exp 1) ^ n := hmain' + _ = (Nat.factorial n : ℝ) * Real.exp n := by + rw [hexp_nat] + _ = Real.exp n * (Nat.factorial n : ℝ) := by ring + +lemma gammaMomentGrowth_natCast_bound + {σ M : ℝ} {X : Ω → ℝ} {n : ℕ} + (hn : 1 ≤ n) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (fun ω => |X ω| ^ (n : ℕ)) μ ∧ + ∫ ω, |X ω| ^ (n : ℕ) ∂μ ≤ (M * (n : ℝ) ^ σ⁻¹) ^ (n : ℕ) := by + have h := hXmom (by exact_mod_cast hn : 1 ≤ (n : ℝ)) + simpa [Real.rpow_natCast] using h + +lemma gammaMomentGrowth_natCast_term_le + {σ M l : ℝ} {n : ℕ} + (hn : 1 ≤ n) + (hσ : 1 ≤ σ) (hM_nonneg : 0 ≤ M) (hl_nonneg : 0 ≤ l) : + ((M * l * (n : ℝ) ^ σ⁻¹) ^ n) / (Nat.factorial n : ℝ) ≤ + (Real.exp 1 * M * l) ^ n := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hexp_le_one : σ⁻¹ ≤ (1 : ℝ) := by + rw [inv_eq_one_div] + simpa using one_div_le_one_div_of_le zero_lt_one hσ + have hn_real : (1 : ℝ) ≤ n := by exact_mod_cast hn + have hrpow_le : + (n : ℝ) ^ σ⁻¹ ≤ (n : ℝ) := by + simpa [Real.rpow_one] using + Real.rpow_le_rpow_of_exponent_le hn_real hexp_le_one + have hmul_le : + M * l * (n : ℝ) ^ σ⁻¹ ≤ M * l * (n : ℝ) := by + gcongr + have hmul_pow : + (M * l * (n : ℝ)) ^ n = (M * l) ^ n * (n : ℝ) ^ n := by + rw [show M * l * (n : ℝ) = (M * l) * (n : ℝ) by ring] + rw [mul_pow] + have hexp_nat : Real.exp n = (Real.exp 1) ^ n := by + calc + Real.exp n = Real.exp ((n : ℝ) * 1) := by simp + _ = (Real.exp 1) ^ n := by rw [Real.exp_nat_mul 1 n] + calc + ((M * l * (n : ℝ) ^ σ⁻¹) ^ n) / (Nat.factorial n : ℝ) + ≤ ((M * l * (n : ℝ)) ^ n) / (Nat.factorial n : ℝ) := by + exact div_le_div_of_nonneg_right + (pow_le_pow_left₀ (by positivity) hmul_le n) + (by positivity) + _ = ((M * l) ^ n * (n : ℝ) ^ n) / (Nat.factorial n : ℝ) := by + rw [hmul_pow] + _ = (M * l) ^ n * (((n : ℝ) ^ n) / (Nat.factorial n : ℝ)) := by + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + _ ≤ (M * l) ^ n * Real.exp n := by + gcongr + exact nat_pow_div_factorial_le_exp_nat n + _ = (Real.exp 1 * M * l) ^ n := by + rw [hexp_nat] + calc + (M * l) ^ n * (Real.exp 1) ^ n = ((M * l) * Real.exp 1) ^ n := by + rw [← mul_pow] + _ = (Real.exp 1 * M * l) ^ n := by + congr 1 + ring + +/-- The normed Taylor tail is controlled by the geometric scale +`(e M λ)^(n+2)` once `Γ_σ` moment growth is available with `σ ≥ 1`. -/ +theorem integral_norm_gammaExpTaylorTail_le_geometric + {X : Ω → ℝ} {σ M l : ℝ} (n : ℕ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + ∫ ω, ‖gammaExpTaylorTail l X n ω‖ ∂μ ≤ + (Real.exp 1 * M * l) ^ (n + 2) := by + rcases gammaMomentGrowth_natCast_bound + (μ := μ) (X := X) (σ := σ) (M := M) (n := n + 2) (by omega) hXmom with + ⟨h_int, h_bound⟩ + have hnorm_fun : + (fun ω => ‖gammaExpTaylorTail l X n ω‖) = + fun ω => ((l ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ)) * |X ω| ^ (n + 2) := by + funext ω + have hfact_pos : 0 < (Nat.factorial (n + 2) : ℝ) := by positivity + calc + ‖gammaExpTaylorTail l X n ω‖ + = |(l * X ω) ^ (n + 2)| / (Nat.factorial (n + 2) : ℝ) := by + simp [gammaExpTaylorTail, Real.norm_eq_abs] + _ = (l ^ (n + 2) * |X ω| ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ) := by + rw [abs_pow, abs_mul, abs_of_nonneg hl, mul_pow] + _ = ((l ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ)) * |X ω| ^ (n + 2) := by + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + calc + ∫ ω, ‖gammaExpTaylorTail l X n ω‖ ∂μ + = ((l ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ)) * + ∫ ω, |X ω| ^ (n + 2) ∂μ := by + rw [hnorm_fun, integral_const_mul] + _ ≤ ((l ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ)) * + (M * ((n + 2 : ℕ) : ℝ) ^ σ⁻¹) ^ (n + 2) := by + gcongr + _ = (((M * l * ((n + 2 : ℕ) : ℝ) ^ σ⁻¹) ^ (n + 2)) / + (Nat.factorial (n + 2) : ℝ)) := by + field_simp [div_eq_mul_inv] + ring + _ ≤ (Real.exp 1 * M * l) ^ (n + 2) := by + exact gammaMomentGrowth_natCast_term_le + (n := n + 2) (by omega) hσ hM hl + +/-- Under the Chapter 4 small-`λ` hypothesis `e M λ ≤ 1/2`, the Taylor tails +form a summable family in `L¹`. This is the summability input needed to +interchange the mgf integral with the exponential power series. -/ +theorem summable_integral_norm_gammaExpTaylorTail + {X : Ω → ℝ} {σ M l : ℝ} + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Summable (fun n : ℕ => ∫ ω, ‖gammaExpTaylorTail l X n ω‖ ∂μ) := by + let r : ℝ := Real.exp 1 * M * l + have hr_nonneg : 0 ≤ r := by positivity + have hr_le_half : r ≤ 1 / 2 := by + by_cases hM0 : M = 0 + · have hl_zero : l = 0 := by + have hl_nonpos : l ≤ 0 := by simpa [hM0] using hl_small + linarith + simp [r, hM0, hl_zero] + · let C : ℝ := 2 * Real.exp 1 * M + have htmp := mul_le_mul_of_nonneg_left hl_small (show 0 ≤ C by + dsimp [C] + positivity) + have hC_ne : C ≠ 0 := by + dsimp [C] + positivity + have hbound : C * l ≤ 1 := by + calc + C * l ≤ C * C⁻¹ := by simpa [C] using htmp + _ = 1 := by field_simp [hC_ne] + dsimp [r, C] at hbound ⊢ + nlinarith + have hr_lt_one : r < 1 := lt_of_le_of_lt hr_le_half (by norm_num) + have hgeom : Summable (fun n : ℕ => r ^ (n + 2)) := by + have hs : Summable (fun n : ℕ => r ^ n) := + summable_geometric_of_lt_one hr_nonneg hr_lt_one + simpa [pow_add, pow_two, mul_assoc, mul_left_comm, mul_comm] using + hs.mul_left (r ^ (2 : ℕ)) + refine Summable.of_nonneg_of_le + (fun _ => integral_nonneg fun _ => norm_nonneg _) + (fun n => ?_) + hgeom + exact integral_norm_gammaExpTaylorTail_le_geometric + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hσ hM hl hXmom + +lemma integrable_gammaExpSeriesTerm_of_one_le + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} {n : ℕ} + (hn : 1 ≤ n) + (hXm : AEMeasurable X μ) + (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (gammaExpSeriesTerm l X n) μ := by + rcases gammaMomentGrowth_natCast_bound + (μ := μ) (X := X) (σ := σ) (M := M) (n := n) hn hXmom with + ⟨hpow_int, _⟩ + have hterm_meas : AEStronglyMeasurable (gammaExpSeriesTerm l X n) μ := by + simpa [gammaExpSeriesTerm, div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using! + (((hXm.aestronglyMeasurable.const_mul l).pow n).const_mul + ((Nat.factorial n : ℝ)⁻¹)) + have hnorm_eq : + (fun ω => ‖gammaExpSeriesTerm l X n ω‖) = + fun ω => ((l ^ n) / (Nat.factorial n : ℝ)) * |X ω| ^ n := by + funext ω + calc + ‖gammaExpSeriesTerm l X n ω‖ + = |(l * X ω) ^ n| / (Nat.factorial n : ℝ) := by + simp [gammaExpSeriesTerm, Real.norm_eq_abs] + _ = (l ^ n * |X ω| ^ n) / (Nat.factorial n : ℝ) := by + rw [abs_pow, abs_mul, abs_of_nonneg hl, mul_pow] + _ = ((l ^ n) / (Nat.factorial n : ℝ)) * |X ω| ^ n := by + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + have hnorm_int : + Integrable (fun ω => ‖gammaExpSeriesTerm l X n ω‖) μ := by + rw [hnorm_eq] + exact hpow_int.const_mul ((l ^ n) / (Nat.factorial n : ℝ)) + exact (integrable_norm_iff hterm_meas).1 hnorm_int + +lemma integrable_gammaExpSeriesTerm + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} (n : ℕ) + (hXm : AEMeasurable X μ) + (hl : 0 ≤ l) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (gammaExpSeriesTerm l X n) μ := by + rcases n with _ | n + · have hzero : gammaExpSeriesTerm l X 0 = fun _ : Ω => (1 : ℝ) := by + funext ω + simp [gammaExpSeriesTerm] + rw [hzero] + exact integrable_const (μ := μ) (c := (1 : ℝ)) + · exact integrable_gammaExpSeriesTerm_of_one_le + (n := n.succ) (by exact Nat.succ_le_succ (Nat.zero_le _)) + hXm hl hXmom + +theorem summable_integral_norm_gammaExpSeriesTerm + {X : Ω → ℝ} {σ M l : ℝ} + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Summable (fun n : ℕ => ∫ ω, ‖gammaExpSeriesTerm l X n ω‖ ∂μ) := by + have htail : + Summable + (fun n : ℕ => ∫ ω, ‖gammaExpSeriesTerm l X (n + 2) ω‖ ∂μ) := by + simpa [gammaExpTaylorTail_eq_gammaExpSeriesTerm_add_two] using + summable_integral_norm_gammaExpTaylorTail + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hσ hM hl hl_small hXmom + exact (summable_nat_add_iff 2).1 htail + +lemma ae_summable_norm_gammaExpSeriesTerm + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + ∀ᵐ ω ∂μ, Summable (fun n : ℕ => ‖gammaExpSeriesTerm l X n ω‖) := by + let F : ℕ → Ω → ℝ := gammaExpSeriesTerm l X + have hF_int : ∀ n : ℕ, Integrable (F n) μ := by + intro n + exact integrable_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hXm hl hXmom + have hF_sum : + Summable (fun n : ℕ => ∫ ω, ‖F n ω‖ ∂μ) := by + simpa [F] using summable_integral_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hσ hM hl hl_small hXmom + have hF_meas : ∀ n : ℕ, AEMeasurable (fun ω => ‖F n ω‖ₑ) μ := by + intro n + exact (hF_int n).1.enorm + have hlin : + (∑' n : ℕ, ∫⁻ ω : Ω, ‖F n ω‖ₑ ∂μ) ≠ (⊤ : ENNReal) := by + have haux (n : ℕ) : ∫⁻ ω : Ω, ‖F n ω‖ₑ ∂μ = ‖∫ ω, ‖F n ω‖ ∂μ‖ₑ := by + dsimp [enorm] + rw [MeasureTheory.lintegral_coe_eq_integral _ (hF_int n).norm] + rw [ENNReal.coe_nnreal_eq] + congr 1 + rw [coe_nnnorm, Real.norm_eq_abs, + abs_of_nonneg (integral_nonneg fun ω => by simp [abs_nonneg (F n ω)])] + rfl + rw [funext haux] + exact ENNReal.tsum_coe_ne_top_iff_summable.2 <| NNReal.summable_coe.1 hF_sum.abs + have hlin' : ∫⁻ ω : Ω, ∑' n : ℕ, ‖F n ω‖ₑ ∂μ ≠ (⊤ : ENNReal) := by + rw [lintegral_tsum hF_meas] + exact hlin + refine (ae_lt_top' (AEMeasurable.tsum hF_meas) hlin').mono ?_ + intro ω hω + have hωsum : Summable (fun n : ℕ => ((‖F n ω‖₊ : NNReal) : ℝ)) := by + rw [← ENNReal.tsum_coe_ne_top_iff_summable_coe] + simpa [enorm_eq_nnnorm] using hω.ne + simpa [F] using hωsum + +lemma integrable_tsum_norm_gammaExpSeriesTerm + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (fun ω => ∑' n : ℕ, ‖gammaExpSeriesTerm l X n ω‖) μ := by + let F : ℕ → Ω → ℝ := gammaExpSeriesTerm l X + have hF_int : ∀ n : ℕ, Integrable (F n) μ := by + intro n + exact integrable_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) n hXm hl hXmom + have hF_sum : + Summable (fun n : ℕ => ∫ ω, ‖F n ω‖ ∂μ) := by + simpa [F] using summable_integral_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hσ hM hl hl_small hXmom + have hsum_ae : + ∀ᵐ ω ∂μ, Summable (fun n : ℕ => ‖F n ω‖) := by + simpa [F] using ae_summable_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmom + let G : Ω → NNReal := fun ω => ∑' n : ℕ, ‖F n ω‖₊ + have hG_real : + (fun ω => ∑' n : ℕ, ‖gammaExpSeriesTerm l X n ω‖) = fun ω => (G ω : ℝ) := by + funext ω + calc + ∑' n : ℕ, ‖gammaExpSeriesTerm l X n ω‖ + = ∑' n : ℕ, ((‖F n ω‖₊ : NNReal) : ℝ) := by + simp [F] + _ = (G ω : ℝ) := by + simp [G, NNReal.coe_tsum] + refine ⟨?_, ?_⟩ + · rw [hG_real] + rw [aestronglyMeasurable_iff_aemeasurable] + apply AEMeasurable.coe_nnreal_real + apply AEMeasurable.tsum + intro n + exact (hF_int n).1.nnnorm.aemeasurable + · rw [hG_real] + rw [MeasureTheory.hasFiniteIntegral_iff_ofNNReal] + have hF_meas : ∀ n : ℕ, AEMeasurable (fun ω => ‖F n ω‖ₑ) μ := by + intro n + exact (hF_int n).1.enorm + have hlin : + ∫⁻ ω : Ω, ∑' n : ℕ, ‖F n ω‖ₑ ∂μ < ⊤ := by + have htop : + (∑' n : ℕ, ∫⁻ ω : Ω, ‖F n ω‖ₑ ∂μ) ≠ (⊤ : ENNReal) := by + have haux (n : ℕ) : ∫⁻ ω : Ω, ‖F n ω‖ₑ ∂μ = ‖∫ ω, ‖F n ω‖ ∂μ‖ₑ := by + dsimp [enorm] + rw [MeasureTheory.lintegral_coe_eq_integral _ (hF_int n).norm] + rw [ENNReal.coe_nnreal_eq] + congr 1 + rw [coe_nnnorm, Real.norm_eq_abs, + abs_of_nonneg (integral_nonneg fun ω => by simp [abs_nonneg (F n ω)])] + rfl + rw [funext haux] + exact ENNReal.tsum_coe_ne_top_iff_summable.2 <| NNReal.summable_coe.1 hF_sum.abs + have htop' : ∫⁻ ω : Ω, ∑' n : ℕ, ‖F n ω‖ₑ ∂μ ≠ (⊤ : ENNReal) := by + rw [lintegral_tsum hF_meas] + exact htop + exact lt_top_iff_ne_top.2 htop' + have hG_enn_ae : + (fun ω => (G ω : ENNReal)) =ᵐ[μ] fun ω => ∑' n : ℕ, ‖F n ω‖ₑ := by + filter_upwards [hsum_ae] with ω hω + have hωnn : Summable (fun n : ℕ => ‖F n ω‖₊) := by + apply NNReal.summable_coe.1 + simpa [F, Real.norm_eq_abs] using hω + calc + (G ω : ENNReal) = (↑(∑' n : ℕ, ‖F n ω‖₊) : ENNReal) := by rfl + _ = ∑' n : ℕ, ((‖F n ω‖₊ : NNReal) : ENNReal) := by + simpa using (ENNReal.coe_tsum hωnn) + _ = ∑' n : ℕ, ‖F n ω‖ₑ := by + simp [enorm_eq_nnnorm] + rw [lintegral_congr_ae hG_enn_ae] + exact hlin + +theorem integrable_exp_mul_of_gammaMomentGrowth_small + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + Integrable (fun ω => Real.exp (l * X ω)) μ := by + let F : ℕ → Ω → ℝ := gammaExpSeriesTerm l X + have hbound_int : + Integrable (fun ω => ∑' n : ℕ, ‖F n ω‖) μ := by + simpa [F] using integrable_tsum_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmom + have hsum_ae : + ∀ᵐ ω ∂μ, Summable (fun n : ℕ => ‖F n ω‖) := by + simpa [F] using ae_summable_norm_gammaExpSeriesTerm + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmom + have hmeas_exp : AEStronglyMeasurable (fun ω => Real.exp (l * X ω)) μ := by + exact (hXm.const_mul l).exp.aestronglyMeasurable + refine Integrable.mono' hbound_int hmeas_exp ?_ + filter_upwards [hsum_ae] with ω hω + have hsum_exp : + HasSum (fun n : ℕ => F n ω) (Real.exp (l * X ω)) := by + simpa [F, gammaExpSeriesTerm, Real.exp_eq_exp_ℝ] using + (NormedSpace.expSeries_div_hasSum_exp (l * X ω)) + calc + ‖Real.exp (l * X ω)‖ = ‖∑' n : ℕ, F n ω‖ := by + rw [hsum_exp.tsum_eq] + _ ≤ ∑' n : ℕ, ‖F n ω‖ := norm_tsum_le_tsum_norm hω + +theorem mgf_pos_of_gammaMomentGrowth_small + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {σ M l : ℝ} + (hXm : AEMeasurable X μ) + (hσ : 1 ≤ σ) (hM : 0 ≤ M) (hl : 0 ≤ l) + (hl_small : l ≤ (2 * Real.exp 1 * M)⁻¹) + (hXmom : HasGammaMomentGrowthWith μ σ X M) : + 0 < mgf X μ l := by + exact mgf_pos + (integrable_exp_mul_of_gammaMomentGrowth_small + (μ := μ) (X := X) (σ := σ) (M := M) (l := l) + hXm hσ hM hl hl_small hXmom) + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/IndependentCopy.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/IndependentCopy.lean new file mode 100644 index 0000000000..329e95e145 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/IndependentCopy.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Probability.IdentDistrib + +/-! # Independent Copy -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι 𝓧 𝓨 : Type*} +variable [MeasurableSpace Ω] [MeasurableSpace 𝓧] [MeasurableSpace 𝓨] +variable {μ : Measure Ω} + +/-- On the product probability space `Ω × Ω`, the two coordinate copies of a +random variable have the same law. This is the basic independent-copy package +used later in the symmetrization step of Rosenthal's inequality. -/ +theorem identDistrib_comp_fst_comp_snd_prod + [IsProbabilityMeasure μ] {X : Ω → 𝓧} (hX : AEMeasurable X μ) : + IdentDistrib + (fun ω : Ω × Ω => X ω.1) + (fun ω : Ω × Ω => X ω.2) + (μ.prod μ) + (μ.prod μ) := by + refine + { aemeasurable_fst := hX.comp_quasiMeasurePreserving + measurePreserving_fst.quasiMeasurePreserving + aemeasurable_snd := hX.comp_quasiMeasurePreserving + measurePreserving_snd.quasiMeasurePreserving + map_eq := ?_ } + have hXfst : AEMeasurable X ((μ.prod μ).map Prod.fst) := by + rw [measurePreserving_fst.map_eq] + exact hX + have hXsnd : AEMeasurable X ((μ.prod μ).map Prod.snd) := by + rw [measurePreserving_snd.map_eq] + exact hX + calc + Measure.map (fun ω : Ω × Ω => X ω.1) (μ.prod μ) + = Measure.map X ((μ.prod μ).map Prod.fst) := by + symm + exact AEMeasurable.map_map_of_aemeasurable hXfst measurable_fst.aemeasurable + _ = Measure.map X μ := by rw [measurePreserving_fst.map_eq] + _ = Measure.map X ((μ.prod μ).map Prod.snd) := by rw [measurePreserving_snd.map_eq] + _ = Measure.map (fun ω : Ω × Ω => X ω.2) (μ.prod μ) := by + exact AEMeasurable.map_map_of_aemeasurable hXsnd measurable_snd.aemeasurable + +/-- On the product probability space `Ω × Ω`, functions of the first +coordinate are independent from functions of the second coordinate. -/ +theorem indepFun_comp_fst_comp_snd_prod + [IsProbabilityMeasure μ] {X : Ω → 𝓧} {Y : Ω → 𝓨} + (hX : AEMeasurable X μ) (hY : AEMeasurable Y μ) : + (fun ω : Ω × Ω => X ω.1) ⟂ᵢ[μ.prod μ] (fun ω => Y ω.2) := by + exact indepFun_prod₀ (μ := μ) (ν := μ) hX hY + +variable {X : ι → Ω → ℝ} + +/-- The finite-sum copy obtained from the first coordinate and the corresponding +copy obtained from the second coordinate are identically distributed on +`Ω × Ω`. -/ +theorem identDistrib_finset_sum_comp_fst_comp_snd_prod + [IsProbabilityMeasure μ] {s : Finset ι} + (hX : ∀ i, Measurable (X i)) : + IdentDistrib + (fun ω : Ω × Ω => ∑ i ∈ s, X i ω.1) + (fun ω : Ω × Ω => ∑ i ∈ s, X i ω.2) + (μ.prod μ) + (μ.prod μ) := by + have hsum : Measurable (fun ω => ∑ i ∈ s, X i ω) := by + exact Finset.measurable_sum s fun i _ => hX i + simpa [Finset.sum_apply] using + (identDistrib_comp_fst_comp_snd_prod + (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) + hsum.aemeasurable) + +/-- Finite sums formed from the first and second coordinate copies are +independent on `Ω × Ω`. -/ +theorem indepFun_finset_sum_comp_fst_comp_snd_prod + [IsProbabilityMeasure μ] {s t : Finset ι} + (hX : ∀ i, Measurable (X i)) : + (fun ω : Ω × Ω => ∑ i ∈ s, X i ω.1) ⟂ᵢ[μ.prod μ] + (fun ω => ∑ i ∈ t, X i ω.2) := by + have hs : Measurable (fun ω => ∑ i ∈ s, X i ω) := by + exact Finset.measurable_sum s fun i _ => hX i + have ht : Measurable (fun ω => ∑ i ∈ t, X i ω) := by + exact Finset.measurable_sum t fun i _ => hX i + exact indepFun_comp_fst_comp_snd_prod + (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) + (Y := fun ω => ∑ i ∈ t, X i ω) + hs.aemeasurable + ht.aemeasurable + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/MomentCalculus.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/MomentCalculus.lean new file mode 100644 index 0000000000..9397f8f291 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/MomentCalculus.lean @@ -0,0 +1,239 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import Mathlib.MeasureTheory.Function.L1Space.Integrable +public import Mathlib.MeasureTheory.Integral.Bochner.Basic + +/-! +# Finite real-exponent moment calculus + +This module collects source-neutral real-exponent `L^p` aggregation bounds for +finite families of real random variables. +-/ + +@[expose] public section + +namespace Homogenization.IndependentSums + +open MeasureTheory + +noncomputable section + +private theorem memLp_of_integrable_abs_rpow + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + {f : Ω → ℝ} {p : ℝ} (hp : 0 < p) + (hf : Measurable f) + (hfp : Integrable (fun ω => |f ω| ^ p) μ) : + MemLp f (ENNReal.ofReal p) μ := by + rw [← integrable_norm_rpow_iff hf.aestronglyMeasurable + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp]) ENNReal.ofReal_ne_top] + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp.le] using hfp + +private theorem toReal_eLpNorm_eq_integral_abs_rpow_rpow_inv + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + {f : Ω → ℝ} {p : ℝ} (hp : 0 < p) + (hfp : MemLp f (ENNReal.ofReal p) μ) : + ENNReal.toReal (eLpNorm f (ENNReal.ofReal p) μ) = + (∫ ω, |f ω| ^ p ∂μ) ^ p⁻¹ := by + have hnonneg : + 0 ≤ (∫ ω, ‖f ω‖ ^ (ENNReal.ofReal p).toReal ∂μ) ^ + (ENNReal.ofReal p).toReal⁻¹ := by + positivity + rw [hfp.eLpNorm_eq_integral_rpow_norm + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp]) ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal hnonneg] + simp [Real.norm_eq_abs, ENNReal.toReal_ofReal hp.le] + +/-- A finite real `p`-moment on a probability space implies integrability. -/ +theorem integrable_of_integrable_abs_rpow + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {f : Ω → ℝ} {p : ℝ} (hp : 1 ≤ p) + (hf : Measurable f) + (hfp : Integrable (fun ω => |f ω| ^ p) μ) : + Integrable f μ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hmem : MemLp f (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow hp_pos hf hfp + exact hmem.integrable (ENNReal.one_le_ofReal.mpr hp) + +/-- Centering a real random variable preserves integrability of a finite real +`p`-moment on a probability space. -/ +theorem integrable_abs_sub_integral_rpow_of_integrable_abs_rpow + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {f : Ω → ℝ} {p : ℝ} (hp : 1 ≤ p) + (hf : Measurable f) + (hfp : Integrable (fun ω => |f ω| ^ p) μ) : + Integrable (fun ω => |f ω - ∫ z, f z ∂μ| ^ p) μ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hp_enn_ne_zero : ENNReal.ofReal p ≠ 0 := + ne_of_gt (ENNReal.ofReal_pos.mpr hp_pos) + have hmem : MemLp f (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow hp_pos hf hfp + have hcenter : MemLp (fun ω => f ω - ∫ z, f z ∂μ) (ENNReal.ofReal p) μ := by + show MemLp (f - fun _ => ∫ z, f z ∂μ) (ENNReal.ofReal p) μ + exact hmem.sub (memLp_const (∫ z, f z ∂μ)) + have hcenter_int : + Integrable (fun ω => ‖f ω - ∫ z, f z ∂μ‖ ^ (ENNReal.ofReal p).toReal) μ := + (integrable_norm_rpow_iff hcenter.aestronglyMeasurable hp_enn_ne_zero ENNReal.ofReal_ne_top).mpr hcenter + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] using hcenter_int + +/-- On a probability space, a finite real `p`-moment gives any lower real +moment at exponent at least one. -/ +theorem integrable_abs_rpow_of_integrable_abs_rpow_of_le + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {f : Ω → ℝ} {q p : ℝ} (hq : 1 ≤ q) (hqp : q ≤ p) + (hf : Measurable f) + (hfp : Integrable (fun ω => |f ω| ^ p) μ) : + Integrable (fun ω => |f ω| ^ q) μ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one (hq.trans hqp) + have hq_pos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hmem_p : MemLp f (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow hp_pos hf hfp + have hmem_q : MemLp f (ENNReal.ofReal q) μ := + hmem_p.mono_exponent (ENNReal.ofReal_le_ofReal hqp) + have hq_int : Integrable (fun ω => ‖f ω‖ ^ (ENNReal.ofReal q).toReal) μ := + hmem_q.integrable_norm_rpow + (ne_of_gt (ENNReal.ofReal_pos.mpr hq_pos)) ENNReal.ofReal_ne_top + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hq_pos.le] using hq_int + +/-- On a probability space, normalized real `L^q` moments are monotone in +the exponent. -/ +theorem integral_abs_rpow_rpow_inv_le_of_le + {Ω : Type*} [MeasurableSpace Ω] {μ : Measure Ω} [IsProbabilityMeasure μ] + {f : Ω → ℝ} {q p : ℝ} (hq : 1 ≤ q) (hqp : q ≤ p) + (hf : Measurable f) + (hfp : Integrable (fun ω => |f ω| ^ p) μ) : + (∫ ω, |f ω| ^ q ∂μ) ^ q⁻¹ ≤ (∫ ω, |f ω| ^ p ∂μ) ^ p⁻¹ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one (hq.trans hqp) + have hq_pos : 0 < q := lt_of_lt_of_le zero_lt_one hq + have hmem_p : MemLp f (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow hp_pos hf hfp + have hmem_q : MemLp f (ENNReal.ofReal q) μ := + hmem_p.mono_exponent (ENNReal.ofReal_le_ofReal hqp) + have hcmp : eLpNorm f (ENNReal.ofReal q) μ ≤ eLpNorm f (ENNReal.ofReal p) μ := + eLpNorm_le_eLpNorm_of_exponent_le (ENNReal.ofReal_le_ofReal hqp) + have hcmp_toReal : + ENNReal.toReal (eLpNorm f (ENNReal.ofReal q) μ) ≤ + ENNReal.toReal (eLpNorm f (ENNReal.ofReal p) μ) := + ENNReal.toReal_mono hmem_p.eLpNorm_ne_top hcmp + calc + (∫ ω, |f ω| ^ q ∂μ) ^ q⁻¹ = + ENNReal.toReal (eLpNorm f (ENNReal.ofReal q) μ) := by + symm + exact toReal_eLpNorm_eq_integral_abs_rpow_rpow_inv hq_pos hmem_q + _ ≤ ENNReal.toReal (eLpNorm f (ENNReal.ofReal p) μ) := hcmp_toReal + _ = (∫ ω, |f ω| ^ p ∂μ) ^ p⁻¹ := + toReal_eLpNorm_eq_integral_abs_rpow_rpow_inv hp_pos hmem_p + +/-- A finite sum of real random variables with integrable real `p` moments +has an integrable real `p` moment. -/ +theorem integrable_abs_finsetSum_rpow + {Ω ι : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + {f : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (h_meas : ∀ i ∈ s, Measurable (f i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |f i ω| ^ p) μ) : + Integrable (fun ω => |∑ i ∈ s, f i ω| ^ p) μ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have h_memLp : ∀ i ∈ s, MemLp (f i) (ENNReal.ofReal p) μ := by + intro i hi + exact memLp_of_integrable_abs_rpow hp_pos (h_meas i hi) (hLp_int i hi) + have hsum_memLp : + MemLp (fun ω => ∑ i ∈ s, f i ω) (ENNReal.ofReal p) μ := + memLp_finsetSum s h_memLp + have hsum_int := hsum_memLp.integrable_norm_rpow + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp_pos]) ENNReal.ofReal_ne_top + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le] using hsum_int + +/-- The real-exponent `L^p` root of a finite sum is at most the sum of the +individual roots. -/ +theorem integral_abs_finsetSum_rpow_rpow_inv_le_sum + {Ω ι : Type*} [MeasurableSpace Ω] {μ : Measure Ω} + {f : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (h_meas : ∀ i ∈ s, Measurable (f i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |f i ω| ^ p) μ) : + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ p⁻¹ ≤ + ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ p⁻¹ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + let g : Ω → ℝ := fun ω => ∑ i ∈ s, f i ω + have h_memLp : ∀ i ∈ s, MemLp (f i) (ENNReal.ofReal p) μ := by + intro i hi + exact memLp_of_integrable_abs_rpow hp_pos (h_meas i hi) (hLp_int i hi) + have hg_memLp : MemLp g (ENNReal.ofReal p) μ := by + simpa [g] using memLp_finsetSum s h_memLp + have hg_eq : g = ∑ i ∈ s, f i := by + funext ω + simp [g] + have hg_eLp : + eLpNorm g (ENNReal.ofReal p) μ ≤ + ∑ i ∈ s, eLpNorm (f i) (ENNReal.ofReal p) μ := by + rw [hg_eq] + refine eLpNorm_sum_le ?_ + rw [← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal hp + have hg_toReal_le : + ENNReal.toReal (eLpNorm g (ENNReal.ofReal p) μ) ≤ + ENNReal.toReal (∑ i ∈ s, eLpNorm (f i) (ENNReal.ofReal p) μ) := by + exact ENNReal.toReal_mono + (ENNReal.sum_ne_top.2 fun i hi => (h_memLp i hi).eLpNorm_ne_top) hg_eLp + have hsum_toReal : + ENNReal.toReal (∑ i ∈ s, eLpNorm (f i) (ENNReal.ofReal p) μ) = + ∑ i ∈ s, ENNReal.toReal (eLpNorm (f i) (ENNReal.ofReal p) μ) := by + exact ENNReal.toReal_sum fun i hi => (h_memLp i hi).eLpNorm_ne_top + calc + (∫ ω, |∑ i ∈ s, f i ω| ^ p ∂μ) ^ p⁻¹ + = (∫ ω, |g ω| ^ p ∂μ) ^ p⁻¹ := by simp [g] + _ = ENNReal.toReal (eLpNorm g (ENNReal.ofReal p) μ) := by + rw [toReal_eLpNorm_eq_integral_abs_rpow_rpow_inv hp_pos hg_memLp] + _ ≤ ENNReal.toReal (∑ i ∈ s, eLpNorm (f i) (ENNReal.ofReal p) μ) := hg_toReal_le + _ = ∑ i ∈ s, ENNReal.toReal (eLpNorm (f i) (ENNReal.ofReal p) μ) := hsum_toReal + _ = ∑ i ∈ s, (∫ ω, |f i ω| ^ p ∂μ) ^ p⁻¹ := by + refine Finset.sum_congr rfl fun i hi => ?_ + exact toReal_eLpNorm_eq_integral_abs_rpow_rpow_inv hp_pos (h_memLp i hi) + +/-- A finite family of nonnegative real numbers satisfies the cardinality +form of Hölder's inequality at a real exponent. -/ +theorem sum_rpow_inv_le_card_rpow_mul_rpow_sum + {ι : Type*} {s : Finset ι} {p : ℝ} {f : ι → ℝ} + (hp : 1 ≤ p) + (hf : ∀ i ∈ s, 0 ≤ f i) : + ∑ i ∈ s, f i ^ p⁻¹ ≤ + (s.card : ℝ) ^ (1 - p⁻¹) * (∑ i ∈ s, f i) ^ p⁻¹ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + let g : ι → ℝ := fun i => (max (f i) 0) ^ p⁻¹ + have hroot := + Real.inner_le_weight_mul_Lp_of_nonneg + (s := s) (p := p) hp + (w := fun _ => (1 : ℝ)) (f := g) + (fun _ => by positivity) + (fun i => Real.rpow_nonneg (le_max_right _ _) _) + have hleft : + ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i = ∑ i ∈ s, f i ^ p⁻¹ := by + refine Finset.sum_congr rfl fun i hi => ?_ + simp [g, max_eq_left (hf i hi)] + have hright : + ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i ^ p = ∑ i ∈ s, f i := by + refine Finset.sum_congr rfl fun i hi => ?_ + simp only [one_mul] + dsimp [g] + rw [max_eq_left (hf i hi), ← Real.rpow_mul (hf i hi), inv_mul_cancel₀ hp_pos.ne', + Real.rpow_one] + calc + ∑ i ∈ s, f i ^ p⁻¹ = ∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i := by + simpa using hleft.symm + _ ≤ (∑ i ∈ s, (fun _ => (1 : ℝ)) i) ^ (1 - p⁻¹) * + (∑ i ∈ s, (fun _ => (1 : ℝ)) i * g i ^ p) ^ p⁻¹ := hroot + _ = (s.card : ℝ) ^ (1 - p⁻¹) * (∑ i ∈ s, f i) ^ p⁻¹ := by + rw [hright] + simp + +end + +end Homogenization.IndependentSums diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiCalculus.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiCalculus.lean new file mode 100644 index 0000000000..b8c6c4b475 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiCalculus.lean @@ -0,0 +1,761 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.ImproperIntegrals +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz + +/-! # Psi Calculus -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +/-! +The first abstract calculus for Chapter 4 weak-Orlicz tails. + +This file begins the formalization of the growth-condition arguments from the +notes. The immediate goal is Step 1 of the `O_Ψ` calculus: polynomial factors +can be absorbed into a dilation of the argument of `Ψ`. +-/ + +/-- The Chapter 4 growth hypothesis `t Ψ(t) ≤ Ψ(K t)` for `t ≥ 1`. -/ +def HasPsiGrowth (Ψ : ℝ → ℝ) (K : ℝ) : Prop := + ∀ ⦃t : ℝ⦄, 1 ≤ t → t * Ψ t ≤ Ψ (K * t) + +/-- The abstract doubling condition used in Step 5 of the Chapter 4 +generalized triangle inequality argument. -/ +def HasPsiAbstractDoubling (Ψ : ℝ → ℝ) (q C₀ : ℝ) : Prop := + ∀ ⦃t s : ℝ⦄, 1 ≤ t → 1 ≤ s → s ^ q ≤ C₀ * (Ψ (t * s) / Ψ t) + +/-- The recursive triangular-number exponent that appears in the inductive +polynomial-absorption estimate. -/ +def natTriangular : ℕ → ℕ + | 0 => 0 + | n + 1 => natTriangular n + n + +@[simp] theorem natTriangular_zero : natTriangular 0 = 0 := + rfl + +@[simp] theorem natTriangular_succ (n : ℕ) : + natTriangular (n + 1) = natTriangular n + n := + rfl + +theorem one_le_pow_of_one_le_real {x : ℝ} (hx : 1 ≤ x) (n : ℕ) : + 1 ≤ x ^ n := by + simpa using (one_le_pow₀ hx : 1 ≤ x ^ n) + +theorem hasPsiGrowth_nat_polyAbsorptionPre + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) : + ∀ n : ℕ, ∀ ⦃t : ℝ⦄, 1 ≤ t → + t ^ n * Ψ t ≤ (K ^ natTriangular n)⁻¹ * Ψ ((K ^ n) * t) + | 0, t, ht => by + simp [natTriangular] + | n + 1, t, ht => by + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have hKn_one : 1 ≤ K ^ n := by + exact one_le_pow_of_one_le_real hK n + have hKn_pos : 0 < K ^ n := by + have hK0 : 0 < K := lt_of_lt_of_le zero_lt_one hK + exact pow_pos hK0 n + have hKn_t_one : 1 ≤ (K ^ n) * t := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ (K ^ n) * t := + mul_le_mul hKn_one ht (by norm_num : (0 : ℝ) ≤ 1) + (le_trans zero_le_one hKn_one) + have hstep := hΨ (t := (K ^ n) * t) hKn_t_one + have hstep' : t * Ψ ((K ^ n) * t) ≤ (K ^ n)⁻¹ * Ψ ((K ^ (n + 1)) * t) := by + have hscaled : + (K ^ n)⁻¹ * (((K ^ n) * t) * Ψ ((K ^ n) * t)) + ≤ (K ^ n)⁻¹ * Ψ ((K ^ (n + 1)) * t) := by + have := + mul_le_mul_of_nonneg_left hstep (inv_nonneg.mpr (le_of_lt hKn_pos)) + simpa [pow_succ, mul_assoc, mul_left_comm, mul_comm] using this + have hleft : + (K ^ n)⁻¹ * (((K ^ n) * t) * Ψ ((K ^ n) * t)) = t * Ψ ((K ^ n) * t) := by + field_simp [hKn_pos.ne'] + simpa [hleft] using hscaled + calc + t ^ (n + 1) * Ψ t = t * (t ^ n * Ψ t) := by + ring_nf + _ ≤ t * ((K ^ natTriangular n)⁻¹ * Ψ ((K ^ n) * t)) := by + exact mul_le_mul_of_nonneg_left (hasPsiGrowth_nat_polyAbsorptionPre hK hΨ n ht) ht0 + _ = (K ^ natTriangular n)⁻¹ * (t * Ψ ((K ^ n) * t)) := by + ring + _ ≤ (K ^ natTriangular n)⁻¹ * ((K ^ n)⁻¹ * Ψ ((K ^ (n + 1)) * t)) := by + exact mul_le_mul_of_nonneg_left hstep' (by positivity) + _ = (K ^ natTriangular (n + 1))⁻¹ * Ψ ((K ^ (n + 1)) * t) := by + rw [natTriangular_succ, pow_add] + ring + +/-- A weaker but convenient corollary of the pre-absorption estimate: +natural polynomial factors can be absorbed into the argument of `Ψ` without +tracking the sharpening prefactor from the notes. -/ +theorem hasPsiGrowth_nat_polyAbsorption + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) : + ∀ n : ℕ, ∀ ⦃t : ℝ⦄, 1 ≤ t → + t ^ n * Ψ t ≤ Ψ ((K ^ n) * t) := by + intro n t ht + have hpre := hasPsiGrowth_nat_polyAbsorptionPre hK hΨ n ht + have hfac : (K ^ natTriangular n)⁻¹ ≤ 1 := by + have hpow : 1 ≤ K ^ natTriangular n := by + exact one_le_pow_of_one_le_real hK (natTriangular n) + exact inv_le_one_of_one_le₀ hpow + have hPsi_nonneg : 0 ≤ Ψ ((K ^ n) * t) := by + have hKn_nonneg : 0 ≤ K ^ n := by positivity + exact le_trans zero_le_one (hAdmissible.2 (mul_nonneg hKn_nonneg (le_trans zero_le_one ht))) + exact hpre.trans <| by + calc + (K ^ natTriangular n)⁻¹ * Ψ ((K ^ n) * t) + ≤ 1 * Ψ ((K ^ n) * t) := by + exact mul_le_mul_of_nonneg_right hfac hPsi_nonneg + _ = Ψ ((K ^ n) * t) := by ring + +theorem admissiblePsi_lowerBound_pow_natTriangular + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) : + ∀ n : ℕ, K ^ natTriangular n ≤ Ψ (K ^ n) + | n => by + have hpre := hasPsiGrowth_nat_polyAbsorptionPre hK hΨ n (show 1 ≤ (1 : ℝ) by norm_num) + have hΨone : 1 ≤ Ψ 1 := hAdmissible.2 zero_le_one + have hKtri_pos : 0 < K ^ natTriangular n := by positivity + have hmul := mul_le_mul_of_nonneg_left hpre (le_of_lt hKtri_pos) + calc + K ^ natTriangular n ≤ K ^ natTriangular n * Ψ 1 := by + have hKtri_nonneg : 0 ≤ K ^ natTriangular n := le_of_lt hKtri_pos + calc + K ^ natTriangular n = K ^ natTriangular n * 1 := by ring + _ ≤ K ^ natTriangular n * Ψ 1 := + mul_le_mul_of_nonneg_left hΨone hKtri_nonneg + _ ≤ Ψ (K ^ n) := by + simpa [hKtri_pos.ne', mul_assoc, mul_left_comm, mul_comm] using hmul + +/-- Note-facing Step 1: polynomial powers with a real exponent can be absorbed +by replacing the exponent with its ceiling. -/ +theorem hasPsiGrowth_rpow_absorption + {Ψ : ℝ → ℝ} {K p t : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) : + t ^ p * Ψ t ≤ Ψ ((K ^ Nat.ceil p) * t) := by + let n : ℕ := Nat.ceil p + have hpceil : p ≤ n := Nat.le_ceil p + have htpow : t ^ p ≤ t ^ (n : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le ht hpceil + have hPsi_nonneg : 0 ≤ Ψ t := by + exact le_trans zero_le_one (hAdmissible.2 (le_trans zero_le_one ht)) + calc + t ^ p * Ψ t ≤ t ^ (n : ℝ) * Ψ t := by + exact mul_le_mul_of_nonneg_right htpow hPsi_nonneg + _ = t ^ n * Ψ t := by rw [Real.rpow_natCast] + _ ≤ Ψ ((K ^ n) * t) := by + exact hasPsiGrowth_nat_polyAbsorption hK hΨ hAdmissible n ht + +/-- Step 2 pre-estimate from the notes: once `t` dominates a power of `K`, +the discrete lower bound for `Ψ(K^m)` propagates to `Ψ(t)` by monotonicity. -/ +theorem admissiblePsi_minimalGrowthPre + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (m : ℕ) {t : ℝ} (ht : K ^ m ≤ t) : + K ^ natTriangular m ≤ Ψ t := by + have hKm_nonneg : 0 ≤ K ^ m := by + positivity + have ht_nonneg : 0 ≤ t := le_trans hKm_nonneg ht + have hmono : Ψ (K ^ m) ≤ Ψ t := by + exact hAdmissible.1 hKm_nonneg ht_nonneg ht + exact (admissiblePsi_lowerBound_pow_natTriangular hK hΨ hAdmissible m).trans hmono + +theorem two_mul_natTriangular (n : ℕ) : + 2 * natTriangular n = n * (n - 1) := by + induction n with + | zero => + simp [natTriangular] + | succ n ih => + rw [natTriangular_succ] + calc + 2 * (natTriangular n + n) = 2 * natTriangular n + 2 * n := by ring + _ = n * (n - 1) + 2 * n := by rw [ih] + _ = (n - 1) * n + 2 * n := by rw [Nat.mul_comm n (n - 1)] + _ = ((n - 1) + 2) * n := by rw [Nat.add_mul] + _ = (n + 1) * n := by + cases n with + | zero => + simp + | succ n => + simp [add_left_comm, add_comm] + _ = (n + 1) * ((n + 1) - 1) := by simp + +theorem natTriangular_real_eq (n : ℕ) : + (natTriangular n : ℝ) = (n : ℝ) * ((n - 1 : ℕ) : ℝ) / 2 := by + have hcast : (2 : ℝ) * (natTriangular n : ℝ) = (n : ℝ) * ((n - 1 : ℕ) : ℝ) := by + exact_mod_cast (two_mul_natTriangular n) + apply (eq_div_iff (show (2 : ℝ) ≠ 0 by norm_num)).2 + linarith + +private theorem exists_pow_le_and_exp_log_sq_div_le_pow_natTriangular + {K x : ℝ} (hK : 2 ≤ K) (hx : K ^ (2 : ℕ) ≤ x) : + ∃ n : ℕ, + K ^ n ≤ x ∧ + Real.exp (Real.log x ^ (2 : ℕ) / (9 * Real.log K)) ≤ K ^ natTriangular n := by + have hK_one_le : 1 ≤ K := le_trans one_le_two hK + have hK_one : 1 < K := lt_of_lt_of_le one_lt_two hK + have hK_pos : 0 < K := lt_trans zero_lt_one hK_one + have hlogK_pos : 0 < Real.log K := Real.log_pos hK_one + have hx_pos : 0 < x := lt_of_lt_of_le (pow_pos hK_pos 2) hx + have hx_one : 1 ≤ x := by + have hKsq_one : 1 ≤ K ^ (2 : ℕ) := by + simpa using one_le_pow_of_one_le_real hK_one_le 2 + exact hKsq_one.trans hx + have hlogx_nonneg : 0 ≤ Real.log x := Real.log_nonneg hx_one + let n : ℕ := Nat.floor (Real.log x / Real.log K) + have hdiv_nonneg : 0 ≤ Real.log x / Real.log K := by + exact div_nonneg hlogx_nonneg hlogK_pos.le + have hn_le : (n : ℝ) ≤ Real.log x / Real.log K := by + simpa [n] using (Nat.floor_le hdiv_nonneg : + (Nat.floor (Real.log x / Real.log K) : ℝ) ≤ _) + have hdiv_lt : Real.log x / Real.log K < n + 1 := by + simpa [n] using + (Nat.lt_floor_add_one (Real.log x / Real.log K) : + Real.log x / Real.log K < (Nat.floor (Real.log x / Real.log K) : ℕ) + 1) + have hlog_lower : (n : ℝ) * Real.log K ≤ Real.log x := by + exact (le_div_iff₀ hlogK_pos).1 hn_le + have hlog_upper_lt : Real.log x < (n + 1 : ℝ) * Real.log K := by + exact (div_lt_iff₀ hlogK_pos).1 hdiv_lt + have hpow_lower : K ^ n ≤ x := by + have : K ^ (n : ℝ) ≤ x := by + exact (Real.rpow_le_iff_le_log hK_pos hx_pos).2 hlog_lower + simpa [Real.rpow_natCast] using this + have htwo_log : (2 : ℝ) * Real.log K ≤ Real.log x := by + exact Real.le_log_of_pow_le hK_pos (by simpa using hx) + have htwo_div : (2 : ℝ) ≤ Real.log x / Real.log K := by + exact (le_div_iff₀ hlogK_pos).2 htwo_log + have hn_two : 2 ≤ n := by + exact Nat.le_floor htwo_div + have htri_lb : (((n : ℝ) + 1) ^ (2 : ℕ)) / 9 ≤ (natTriangular n : ℝ) := by + rw [natTriangular_real_eq] + have hn_one : 1 ≤ n := le_trans (by decide : 1 ≤ 2) hn_two + rw [Nat.cast_sub hn_one] + have hn_two_real : (2 : ℝ) ≤ n := by + exact_mod_cast hn_two + nlinarith only [hn_two_real] + have hsq : + Real.log x ^ (2 : ℕ) ≤ (((n : ℝ) + 1) * Real.log K) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hlogx_nonneg hlog_upper_lt.le 2 + have hfirst : + Real.log x ^ (2 : ℕ) / (9 * Real.log K) + ≤ (((n : ℝ) + 1) * Real.log K) ^ (2 : ℕ) / (9 * Real.log K) := by + exact div_le_div_of_nonneg_right hsq (by positivity) + have hsecond : + (((n : ℝ) + 1) * Real.log K) ^ (2 : ℕ) / (9 * Real.log K) + ≤ (natTriangular n : ℝ) * Real.log K := by + have := mul_le_mul_of_nonneg_right htri_lb hlogK_pos.le + have hlogK_ne : Real.log K ≠ 0 := ne_of_gt hlogK_pos + simpa [pow_two, div_eq_mul_inv, hlogK_ne, mul_assoc, mul_left_comm, mul_comm] using this + have hexp_le : + Real.exp (Real.log x ^ (2 : ℕ) / (9 * Real.log K)) + ≤ K ^ natTriangular n := by + have hKpow : + K ^ natTriangular n = Real.exp ((natTriangular n : ℝ) * Real.log K) := by + rw [← Real.rpow_natCast, Real.rpow_def_of_pos hK_pos] + simp [mul_comm] + rw [hKpow] + exact (Real.exp_le_exp).2 (hfirst.trans hsecond) + exact ⟨n, hpow_lower, hexp_le⟩ + +/-- Step 2 of the Chapter 4 `O_Ψ` calculus: the growth hypothesis forces at +least log-squared growth of `Ψ`. -/ +theorem admissiblePsi_minimalGrowth + {Ψ : ℝ → ℝ} {K t : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : K ^ (2 : ℕ) ≤ t) : + Real.exp (Real.log t ^ (2 : ℕ) / (9 * Real.log K)) ≤ Ψ t := by + have hK_one_le : 1 ≤ K := le_trans one_le_two hK + obtain ⟨n, hpow_lower, hexp_le⟩ := + exists_pow_le_and_exp_log_sq_div_le_pow_natTriangular hK ht + exact hexp_le.trans (admissiblePsi_minimalGrowthPre hK_one_le hΨ hAdmissible n hpow_lower) + +/-- Discrete lower bounds for the normalized ratio `Ψ(t K^m) / Ψ(t)`. -/ +theorem admissiblePsi_ratioLowerBound_pow_natTriangular + {Ψ : ℝ → ℝ} {K t : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) : + ∀ m : ℕ, K ^ natTriangular m ≤ Ψ (t * K ^ m) / Ψ t + | m => by + let Φ : ℝ → ℝ := fun s => Ψ (t * s) + have hΦ : HasPsiGrowth Φ K := by + intro s hs + have hts : 1 ≤ t * s := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ t * s := mul_le_mul ht hs (by norm_num : (0 : ℝ) ≤ 1) + (le_trans zero_le_one ht) + have hΨ_nonneg : 0 ≤ Ψ (t * s) := by + exact le_trans zero_le_one (hAdmissible.2 (le_trans zero_le_one hts)) + have hscale : s * Ψ (t * s) ≤ (t * s) * Ψ (t * s) := by + have hmul : s ≤ t * s := by + calc + s = 1 * s := by ring + _ ≤ t * s := mul_le_mul_of_nonneg_right ht (le_trans zero_le_one hs) + exact mul_le_mul_of_nonneg_right hmul hΨ_nonneg + exact hscale.trans <| by + simpa [Φ, mul_assoc, mul_left_comm, mul_comm] using hΨ (t := t * s) hts + have hpre := hasPsiGrowth_nat_polyAbsorptionPre hK hΦ m (show 1 ≤ (1 : ℝ) by norm_num) + have hpre' : Ψ t ≤ (K ^ natTriangular m)⁻¹ * Ψ (t * K ^ m) := by + simpa [Φ, mul_assoc, mul_left_comm, mul_comm] using hpre + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 (le_trans zero_le_one ht) + have hΨt_pos : 0 < Ψ t := lt_of_lt_of_le zero_lt_one hΨt_one + have hKtri_pos : 0 < K ^ natTriangular m := by + positivity + have hmul : K ^ natTriangular m * Ψ t ≤ Ψ (t * K ^ m) := by + have := + mul_le_mul_of_nonneg_left hpre' (le_of_lt hKtri_pos) + simpa [hKtri_pos.ne', mul_assoc, mul_left_comm, mul_comm] using this + exact (le_div_iff₀ hΨt_pos).2 hmul + +/-- The discrete ratio lower bound extends from `K^m` to every larger `s` by +monotonicity of `Ψ`. -/ +theorem admissiblePsi_ratioMinimalGrowthPre + {Ψ : ℝ → ℝ} {K t : ℝ} (hK : 1 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) (m : ℕ) {s : ℝ} (hs : K ^ m ≤ s) : + K ^ natTriangular m ≤ Ψ (t * s) / Ψ t := by + have hratio := + admissiblePsi_ratioLowerBound_pow_natTriangular hK hΨ hAdmissible ht m + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have hKs_nonneg : 0 ≤ K ^ m := by positivity + have hs_nonneg : 0 ≤ s := le_trans hKs_nonneg hs + have harg : t * K ^ m ≤ t * s := by + exact mul_le_mul_of_nonneg_left hs ht0 + have hmono : Ψ (t * K ^ m) ≤ Ψ (t * s) := by + exact hAdmissible.1 (mul_nonneg ht0 hKs_nonneg) (mul_nonneg ht0 hs_nonneg) harg + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 (le_trans zero_le_one ht) + have hΨt_nonneg : 0 ≤ Ψ t := le_trans zero_le_one hΨt_one + have hdiv : + Ψ (t * K ^ m) / Ψ t ≤ Ψ (t * s) / Ψ t := by + rw [div_eq_mul_inv, div_eq_mul_inv] + exact mul_le_mul_of_nonneg_right hmono (inv_nonneg.mpr hΨt_nonneg) + exact hratio.trans hdiv + +/-- The log-squared minimal-growth bound for the normalized ratio +`Ψ(ts) / Ψ(t)`. -/ +theorem admissiblePsi_ratioMinimalGrowth + {Ψ : ℝ → ℝ} {K t s : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) (hs : K ^ (2 : ℕ) ≤ s) : + Real.exp (Real.log s ^ (2 : ℕ) / (9 * Real.log K)) ≤ Ψ (t * s) / Ψ t := by + have hK_one_le : 1 ≤ K := le_trans one_le_two hK + obtain ⟨n, hpow_lower, hexp_le⟩ := + exists_pow_le_and_exp_log_sq_div_le_pow_natTriangular hK hs + exact hexp_le.trans (admissiblePsi_ratioMinimalGrowthPre hK_one_le hΨ hAdmissible ht n hpow_lower) + +/-- Step 4 in the Chapter 4 proof: the growth condition implies a doubling +estimate for `Ψ`. -/ +theorem admissiblePsi_doubling + {Ψ : ℝ → ℝ} {K q t s : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (hq : 2 ≤ q) (ht : 1 ≤ t) (hs : 1 ≤ s) : + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) * (Ψ (t * s) / Ψ t) := by + have hK_one_le : 1 ≤ K := le_trans one_le_two hK + have hK_one : 1 < K := lt_of_lt_of_le one_lt_two hK + have hK_pos : 0 < K := lt_trans zero_lt_one hK_one + have hs_pos : 0 < s := lt_of_lt_of_le zero_lt_one hs + have hq_nonneg : 0 ≤ q := le_trans zero_le_two hq + by_cases hs_large : K ^ (2 : ℕ) ≤ s + · have hratio := + admissiblePsi_ratioMinimalGrowth hK hΨ hAdmissible ht hs_large + have hlogs_nonneg : 0 ≤ Real.log s := Real.log_nonneg hs + have hlogK_pos : 0 < Real.log K := Real.log_pos hK_one + have hpoly : + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) * + Real.exp (Real.log s ^ (2 : ℕ) / (9 * Real.log K)) := by + have haux : + Real.log s * q - (3 * q ^ (2 : ℕ)) * Real.log K + ≤ Real.log s ^ (2 : ℕ) / (9 * Real.log K) := by + have hnine : 0 < 9 * Real.log K := by positivity + refine (le_div_iff₀ hnine).2 ?_ + have hsqnonneg : 0 ≤ (Real.log s - (9 / 2 : ℝ) * q * Real.log K) ^ (2 : ℕ) := by + exact sq_nonneg _ + nlinarith only [hsqnonneg, hlogK_pos] + have hexpArg : + Real.log s * q + ≤ (3 * q ^ (2 : ℕ)) * Real.log K + + Real.log s ^ (2 : ℕ) / (9 * Real.log K) := by + linarith [haux] + rw [Real.rpow_def_of_pos hs_pos, Real.rpow_def_of_pos hK_pos, ← Real.exp_add] + refine (Real.exp_le_exp).2 ?_ + simpa [mul_assoc, mul_left_comm, mul_comm] using hexpArg + calc + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) * + Real.exp (Real.log s ^ (2 : ℕ) / (9 * Real.log K)) := hpoly + _ ≤ K ^ (3 * q ^ (2 : ℕ)) * (Ψ (t * s) / Ψ t) := by + exact mul_le_mul_of_nonneg_left hratio (by positivity) + · have hs_upper : s ≤ K ^ (2 : ℕ) := le_of_not_ge hs_large + have hsmall : + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) := by + have hs_two : + s ^ q ≤ (K ^ (2 : ℕ) : ℝ) ^ q := by + exact Real.rpow_le_rpow (le_trans zero_le_one hs) hs_upper hq_nonneg + have hK_nonneg : 0 ≤ K := le_trans zero_le_one hK_one_le + have hpow_two : (K ^ (2 : ℕ) : ℝ) ^ q = K ^ ((2 : ℕ) * q) := by + symm + simpa [mul_comm] using (Real.rpow_natCast_mul hK_nonneg 2 q) + have hs_bound : s ^ q ≤ K ^ ((2 : ℕ) * q) := by + simpa [hpow_two] using hs_two + have hpow_mono : K ^ ((2 : ℝ) * q) ≤ K ^ (3 * q ^ (2 : ℕ)) := by + refine Real.rpow_le_rpow_of_exponent_le hK_one_le ?_ + have htwo_le_threeq : (2 : ℝ) ≤ 3 * q := by + calc + (2 : ℝ) ≤ q := hq + _ = 1 * q := by ring + _ ≤ 3 * q := mul_le_mul_of_nonneg_right (by norm_num : (1 : ℝ) ≤ 3) hq_nonneg + calc + (2 : ℝ) * q ≤ (3 * q) * q := mul_le_mul_of_nonneg_right htwo_le_threeq hq_nonneg + _ = 3 * q ^ (2 : ℕ) := by ring + exact hs_bound.trans hpow_mono + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have hnum : Ψ t ≤ Ψ (t * s) := by + have harg : t ≤ t * s := by + simpa using (mul_le_mul_of_nonneg_left hs ht0 : t * 1 ≤ t * s) + exact hAdmissible.1 ht0 (mul_nonneg ht0 (le_trans zero_le_one hs)) harg + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 ht0 + have hΨt_pos : 0 < Ψ t := lt_of_lt_of_le zero_lt_one hΨt_one + have hratio_one : 1 ≤ Ψ (t * s) / Ψ t := by + exact (le_div_iff₀ hΨt_pos).2 (by simpa using hnum) + have hKpow_nonneg : 0 ≤ K ^ (3 * q ^ (2 : ℕ)) := by + positivity + calc + s ^ q ≤ K ^ (3 * q ^ (2 : ℕ)) := hsmall + _ ≤ K ^ (3 * q ^ (2 : ℕ)) * (Ψ (t * s) / Ψ t) := by + calc + K ^ (3 * q ^ (2 : ℕ)) = + K ^ (3 * q ^ (2 : ℕ)) * 1 := by ring + _ ≤ K ^ (3 * q ^ (2 : ℕ)) * (Ψ (t * s) / Ψ t) := + mul_le_mul_of_nonneg_left hratio_one hKpow_nonneg + +theorem admissiblePsi_hasPsiAbstractDoubling + {Ψ : ℝ → ℝ} {K q : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) (hq : 2 ≤ q) : + HasPsiAbstractDoubling Ψ q (K ^ (3 * q ^ (2 : ℕ))) := by + intro t s ht hs + exact admissiblePsi_doubling hK hΨ hAdmissible hq ht hs + +theorem admissiblePsi_hasPsiAbstractDoubling_two + {Ψ : ℝ → ℝ} {K : ℝ} (hK : 2 ≤ K) (hΨ : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) : + HasPsiAbstractDoubling Ψ 2 (K ^ (12 : ℝ)) := by + convert + (admissiblePsi_hasPsiAbstractDoubling (K := K) (q := (2 : ℝ)) + hK hΨ hAdmissible (by norm_num : (2 : ℝ) ≤ 2)) + norm_num + +/-- Under the abstract doubling hypothesis, the doubling constant is at least `1`. -/ +theorem hasPsiAbstractDoubling_one_le_const + {Ψ : ℝ → ℝ} {q C₀ : ℝ} (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) : + 1 ≤ C₀ := by + have hΨone : 1 ≤ Ψ 1 := hAdmissible.2 zero_le_one + have hΨone_pos : 0 < Ψ 1 := lt_of_lt_of_le zero_lt_one hΨone + simpa [hΨone_pos.ne'] using hD (t := 1) (s := 1) (by norm_num) (by norm_num) + +/-- Step 5 helper: the abstract doubling estimate can be rewritten as an upper +bound on the inverse tail profile. -/ +theorem hasPsiAbstractDoubling_inv_mul_le + {Ψ : ℝ → ℝ} {q C₀ u v : ℝ} (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hu : 1 ≤ u) (hv : 1 ≤ v) : + (Ψ (u * v))⁻¹ ≤ C₀ * v ^ (-q) * (Ψ u)⁻¹ := by + have hC₀_one : 1 ≤ C₀ := hasPsiAbstractDoubling_one_le_const hD hAdmissible + have hC₀_pos : 0 < C₀ := lt_of_lt_of_le zero_lt_one hC₀_one + have hv_pos : 0 < v := lt_of_lt_of_le zero_lt_one hv + have hΨu_one : 1 ≤ Ψ u := hAdmissible.2 (le_trans zero_le_one hu) + have hΨu_pos : 0 < Ψ u := lt_of_lt_of_le zero_lt_one hΨu_one + have huv_one : 1 ≤ u * v := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ u * v := mul_le_mul hu hv (by norm_num : (0 : ℝ) ≤ 1) (le_trans zero_le_one hu) + have hΨuv_one : 1 ≤ Ψ (u * v) := hAdmissible.2 (le_trans zero_le_one huv_one) + have hΨuv_pos : 0 < Ψ (u * v) := lt_of_lt_of_le zero_lt_one hΨuv_one + have hdiv : v ^ q * Ψ u / C₀ ≤ Ψ (u * v) := by + have htmp := hD hu hv + field_simp [hC₀_pos.ne', hΨu_pos.ne'] at htmp ⊢ + simpa [mul_assoc, mul_left_comm, mul_comm] using htmp + have hdiv_pos : 0 < v ^ q * Ψ u / C₀ := by + have hvq_pos : 0 < v ^ q := Real.rpow_pos_of_pos hv_pos q + positivity + have hrhs : + C₀ * v ^ (-q) * (Ψ u)⁻¹ = (v ^ q * Ψ u / C₀)⁻¹ := by + rw [Real.rpow_neg (le_of_lt hv_pos)] + field_simp [hC₀_pos.ne', hΨu_pos.ne', (Real.rpow_pos_of_pos hv_pos q).ne'] + rw [hrhs] + exact (inv_le_inv₀ hΨuv_pos hdiv_pos).2 hdiv + +/-- Note-facing Step 5 helper: specialize abstract doubling to the tail profile +`s ↦ Ψ (s / a)⁻¹` on the half-line `s ≥ ta / 2`. -/ +theorem hasPsiAbstractDoubling_scaledInvTail + {Ψ : ℝ → ℝ} {q C₀ a t s : ℝ} (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (ha : 0 < a) (ht : 2 ≤ t) + (hs : t * a / 2 ≤ s) : + (Ψ (s / a))⁻¹ ≤ + C₀ * (Ψ (t / 2))⁻¹ * ((2 * s) / (a * t)) ^ (-q) := by + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_two ht + have hu : 1 ≤ t / 2 := by + calc + (1 : ℝ) = 2 / 2 := by norm_num + _ ≤ t / 2 := div_le_div_of_nonneg_right ht (by norm_num) + have hv : 1 ≤ (2 * s) / (a * t) := by + rw [one_le_div_iff] + left + constructor + · positivity + · calc + a * t = 2 * (t * a / 2) := by ring + _ ≤ 2 * s := mul_le_mul_of_nonneg_left hs (by norm_num) + have hmain := + hasPsiAbstractDoubling_inv_mul_le (hD := hD) (hAdmissible := hAdmissible) + (u := t / 2) (v := (2 * s) / (a * t)) hu hv + have harg : (t / 2) * (s * 2 / (a * t)) = s / a := by + field_simp [ha.ne', ht_pos.ne'] + simpa [harg, mul_assoc, mul_left_comm, mul_comm] using hmain + +/-- The power-tail integral appearing in Step 5 of the Chapter 4 +generalized triangle inequality proof. -/ +theorem integral_Ioi_div_rpow_neg + {q c : ℝ} (hq : 1 < q) (hc : 0 < c) : + ∫ s : ℝ in Set.Ioi c, (s / c) ^ (-q) = c / (q - 1) := by + calc + ∫ s : ℝ in Set.Ioi c, (s / c) ^ (-q) + = ∫ s : ℝ in Set.Ioi c, c ^ q * s ^ (-q) := by + apply MeasureTheory.setIntegral_congr_fun measurableSet_Ioi + intro s hs + have hs_pos : 0 < s := lt_trans hc hs + calc + (s / c) ^ (-q) = s ^ (-q) / c ^ (-q) := by + rw [Real.div_rpow (le_of_lt hs_pos) hc.le] + _ = s ^ (-q) / (c ^ q)⁻¹ := by + rw [Real.rpow_neg (le_of_lt hc)] + _ = s ^ (-q) * c ^ q := by + rw [div_eq_mul_inv, inv_inv] + _ = c ^ q * s ^ (-q) := by ring + _ = c ^ q * ∫ s : ℝ in Set.Ioi c, s ^ (-q) := by + rw [MeasureTheory.integral_const_mul] + _ = c ^ q * (-c ^ (-q + 1) / (-q + 1)) := by + rw [integral_Ioi_rpow_of_lt (by linarith : -q < -1) hc] + _ = c / (q - 1) := by + have hpow : c ^ q * c ^ (-q + 1) = c := by + calc + c ^ q * c ^ (-q + 1) = c ^ (q + (-q + 1)) := by + rw [← Real.rpow_add hc q (-q + 1)] + _ = c ^ (1 : ℝ) := by ring_nf + _ = c := by rw [Real.rpow_one] + calc + c ^ q * (-c ^ (-q + 1) / (-q + 1)) + = -(c ^ q * c ^ (-q + 1)) / (-q + 1) := by ring + _ = -c / (-q + 1) := by rw [hpow] + _ = c / (q - 1) := by + rw [show -q + 1 = -(q - 1) by ring, div_neg, neg_div, neg_neg] + +/-- A concrete growth constant for the stretched-exponential model class +`Γ_σ`, chosen so that the Chapter 4 growth hypothesis holds for every +`σ > 0`. -/ +noncomputable def gammaGrowthConst (σ : ℝ) : ℝ := + max 2 ((1 + σ⁻¹) ^ (σ⁻¹)) + +theorem two_le_gammaGrowthConst (σ : ℝ) : + 2 ≤ gammaGrowthConst σ := by + exact le_max_left _ _ + +theorem hasPsiGrowth_gammaSigma {σ : ℝ} (hσ : 0 < σ) : + HasPsiGrowth (gammaSigma σ) (gammaGrowthConst σ) := by + intro t ht + have ht0 : 0 ≤ t := le_trans zero_le_one ht + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hσinv_pos : 0 < σ⁻¹ := inv_pos.mpr hσ + have hbase_pos : 0 < 1 + σ⁻¹ := by positivity + have hbase_nonneg : 0 ≤ 1 + σ⁻¹ := hbase_pos.le + have hK_nonneg : 0 ≤ gammaGrowthConst σ := le_trans zero_le_two (two_le_gammaGrowthConst σ) + have hpow_nonneg : 0 ≤ t ^ σ := Real.rpow_nonneg ht0 σ + have hlog : + Real.log t ≤ σ⁻¹ * t ^ σ := by + simpa [div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using + (Real.log_le_rpow_div ht0 hσ) + have harg_le : + Real.log t + t ^ σ ≤ (1 + σ⁻¹) * t ^ σ := by + calc + Real.log t + t ^ σ ≤ σ⁻¹ * t ^ σ + t ^ σ := by + simpa [add_comm, add_left_comm, add_assoc] using add_le_add_right hlog (t ^ σ) + _ = (1 + σ⁻¹) * t ^ σ := by ring + have hKpow_lower : + 1 + σ⁻¹ ≤ gammaGrowthConst σ ^ σ := by + have hcandidate_le : + ((1 + σ⁻¹) ^ (σ⁻¹)) ^ σ ≤ gammaGrowthConst σ ^ σ := by + exact Real.rpow_le_rpow + (Real.rpow_nonneg hbase_nonneg _) + (le_max_right 2 ((1 + σ⁻¹) ^ (σ⁻¹))) + hσ.le + rw [← Real.rpow_mul hbase_nonneg, inv_mul_cancel₀ hσ.ne', Real.rpow_one] at hcandidate_le + exact hcandidate_le + have htarget : + (1 + σ⁻¹) * t ^ σ ≤ ((gammaGrowthConst σ) * t) ^ σ := by + calc + (1 + σ⁻¹) * t ^ σ ≤ (gammaGrowthConst σ ^ σ) * t ^ σ := by + exact mul_le_mul_of_nonneg_right hKpow_lower hpow_nonneg + _ = ((gammaGrowthConst σ) * t) ^ σ := by + rw [Real.mul_rpow hK_nonneg ht0] + calc + t * gammaSigma σ t = Real.exp (Real.log t) * Real.exp (t ^ σ) := by + rw [Real.exp_log ht_pos, gammaSigma] + _ = Real.exp (Real.log t + t ^ σ) := by + rw [← Real.exp_add] + _ ≤ Real.exp (((gammaGrowthConst σ) * t) ^ σ) := by + exact (Real.exp_le_exp).2 (harg_le.trans htarget) + _ = gammaSigma σ (gammaGrowthConst σ * t) := by + simp [gammaSigma] + +/-- The explicit Chapter 4 growth constant for the log-normal model class +`Ψ_σ`. -/ +noncomputable def psiGrowthConst (σ : ℝ) : ℝ := + 2 * Real.exp (2 * σ ^ (2 : ℕ)) + +theorem two_le_psiGrowthConst (σ : ℝ) : + 2 ≤ psiGrowthConst σ := by + have hexp_one : 1 ≤ Real.exp (2 * σ ^ (2 : ℕ)) := by + apply Real.one_le_exp + positivity + dsimp [psiGrowthConst] + calc + (2 : ℝ) = 2 * 1 := by ring + _ ≤ 2 * Real.exp (2 * σ ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hexp_one (by norm_num) + +theorem hasPsiGrowth_psiSigma {σ : ℝ} (hσ : 1 ≤ σ) : + HasPsiGrowth (psiSigma σ) (psiGrowthConst σ) := by + intro t ht + let K : ℝ := psiGrowthConst σ + let A : ℝ := Real.log (1 + σ * (K * t)) + let B : ℝ := Real.log (1 + σ * t) + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hσsq_pos : 0 < σ ^ (2 : ℕ) := by positivity + have hK_two : 2 ≤ K := by + simpa [K] using two_le_psiGrowthConst σ + have hKσ_one : 1 ≤ K * σ := by + have hK_nonneg : 0 ≤ K := le_trans zero_le_two hK_two + calc + (1 : ℝ) ≤ 2 * 1 := by norm_num + _ ≤ K * σ := mul_le_mul hK_two hσ (by norm_num : (0 : ℝ) ≤ 1) hK_nonneg + have hargA_pos : 0 < 1 + σ * (K * t) := by positivity + have hargB_pos : 0 < 1 + σ * t := by positivity + have hargA_ge_t : t ≤ 1 + σ * (K * t) := by + have hKt : t ≤ K * σ * t := by + have hmul : 1 * t ≤ (K * σ) * t := by + exact mul_le_mul_of_nonneg_right hKσ_one (le_of_lt ht_pos) + simpa using hmul + calc + t ≤ K * σ * t := hKt + _ = σ * (K * t) := by ring + _ ≤ 1 + σ * (K * t) := le_add_of_nonneg_left zero_le_one + have hA_ge_logt : Real.log t ≤ A := by + exact Real.log_le_log ht_pos (by simpa [A] using hargA_ge_t) + have hlogt_nonneg : 0 ≤ Real.log t := Real.log_nonneg ht + have hargB_one : 1 ≤ 1 + σ * t := by + exact le_add_of_nonneg_right (mul_nonneg hσ_pos.le ht_pos.le) + have hB_nonneg : 0 ≤ B := by + exact Real.log_nonneg (by simpa [B] using hargB_one) + have hden_le : 1 + σ * t ≤ 2 * σ * t := by + have hσt_one : 1 ≤ σ * t := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ σ * t := mul_le_mul hσ ht (by norm_num : (0 : ℝ) ≤ 1) hσ_pos.le + calc + 1 + σ * t ≤ σ * t + σ * t := by + simpa [add_comm] using add_le_add_right hσt_one (σ * t) + _ = 2 * σ * t := by ring + have hratio_lower : K / 2 ≤ (1 + σ * (K * t)) / (1 + σ * t) := by + rw [le_div_iff₀ hargB_pos] + calc + (K / 2) * (1 + σ * t) ≤ (K / 2) * (2 * σ * t) := by + refine mul_le_mul_of_nonneg_left hden_le ?_ + positivity + _ = K * σ * t := by ring + _ = σ * (K * t) := by ring + _ ≤ 1 + σ * (K * t) := le_add_of_nonneg_left zero_le_one + have hK_div_two_pos : 0 < K / 2 := by + have hK_pos : 0 < K := lt_of_lt_of_le zero_lt_two hK_two + positivity + have hlog_gap : + Real.log (K / 2) ≤ A - B := by + calc + Real.log (K / 2) ≤ Real.log ((1 + σ * (K * t)) / (1 + σ * t)) := by + exact Real.log_le_log hK_div_two_pos hratio_lower + _ = A - B := by + simp [A, B, Real.log_div, hargA_pos.ne', hargB_pos.ne'] + have hlog_K_div_two : + Real.log (K / 2) = 2 * σ ^ (2 : ℕ) := by + calc + Real.log (K / 2) = Real.log (Real.exp (2 * σ ^ (2 : ℕ))) := by + rw [show K / 2 = Real.exp (2 * σ ^ (2 : ℕ)) by + dsimp [K, psiGrowthConst] + field_simp] + _ = 2 * σ ^ (2 : ℕ) := by rw [Real.log_exp] + have hgap : 2 * σ ^ (2 : ℕ) ≤ A - B := by + rw [← hlog_K_div_two] + exact hlog_gap + have hgap_nonneg : 0 ≤ A - B := by + have : 0 ≤ 2 * σ ^ (2 : ℕ) := by positivity + exact this.trans hgap + have hA_nonneg : 0 ≤ A := le_trans hlogt_nonneg hA_ge_logt + have hprod : + Real.log t * (2 * σ ^ (2 : ℕ)) ≤ A * (A - B) := by + calc + Real.log t * (2 * σ ^ (2 : ℕ)) ≤ A * (2 * σ ^ (2 : ℕ)) := by + exact mul_le_mul_of_nonneg_right hA_ge_logt (by positivity) + _ ≤ A * (A - B) := by + exact mul_le_mul_of_nonneg_left hgap hA_nonneg + have hsum_prod : + A * (A - B) ≤ (A + B) * (A - B) := by + have hA_le : A ≤ A + B := le_add_of_nonneg_right hB_nonneg + exact mul_le_mul_of_nonneg_right hA_le hgap_nonneg + have hsqdiff : + σ ^ (2 : ℕ) * Real.log t ≤ A ^ (2 : ℕ) - B ^ (2 : ℕ) := by + calc + σ ^ (2 : ℕ) * Real.log t ≤ (2 * σ ^ (2 : ℕ)) * Real.log t := by + have hprod_nonneg : 0 ≤ σ ^ (2 : ℕ) * Real.log t := + mul_nonneg (sq_nonneg σ) hlogt_nonneg + calc + σ ^ (2 : ℕ) * Real.log t = + 1 * (σ ^ (2 : ℕ) * Real.log t) := by ring + _ ≤ 2 * (σ ^ (2 : ℕ) * Real.log t) := + mul_le_mul_of_nonneg_right (by norm_num : (1 : ℝ) ≤ 2) hprod_nonneg + _ = (2 * σ ^ (2 : ℕ)) * Real.log t := by ring + _ = Real.log t * (2 * σ ^ (2 : ℕ)) := by ring + _ ≤ A * (A - B) := hprod + _ ≤ (A + B) * (A - B) := hsum_prod + _ = A ^ (2 : ℕ) - B ^ (2 : ℕ) := by ring + have harg_main : + Real.log t + (σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ) ≤ + (σ ^ (2 : ℕ))⁻¹ * A ^ (2 : ℕ) := by + have hsqdiff_div : + Real.log t ≤ (σ ^ (2 : ℕ))⁻¹ * (A ^ (2 : ℕ) - B ^ (2 : ℕ)) := by + have hmul := + mul_le_mul_of_nonneg_left hsqdiff (inv_nonneg.mpr (sq_nonneg σ)) + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm, hσsq_pos.ne'] using hmul + calc + Real.log t + (σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ) ≤ + (σ ^ (2 : ℕ))⁻¹ * (A ^ (2 : ℕ) - B ^ (2 : ℕ)) + + (σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right hsqdiff_div ((σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ)) + _ = (σ ^ (2 : ℕ))⁻¹ * A ^ (2 : ℕ) := by ring + calc + t * psiSigma σ t = + Real.exp (Real.log t) * + Real.exp ((σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ)) := by + rw [Real.exp_log ht_pos, psiSigma] + _ = Real.exp (Real.log t + (σ ^ (2 : ℕ))⁻¹ * B ^ (2 : ℕ)) := by + rw [← Real.exp_add] + _ ≤ Real.exp ((σ ^ (2 : ℕ))⁻¹ * A ^ (2 : ℕ)) := by + exact (Real.exp_le_exp).2 harg_main + _ = psiSigma σ (K * t) := by + simp [psiSigma, A] + +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration.lean new file mode 100644 index 0000000000..c5f81b3dda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.TailKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Concentration + +/-! # Psi Concentration -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Concentration.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Concentration.lean new file mode 100644 index 0000000000..ea6265a2e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Concentration.lean @@ -0,0 +1,957 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.TailKernel + +/-! # Concentration -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Taylor plus the nonpositive mean of the truncation gives the one-variable +mgf bound in the natural `1 + A` form before the note-facing tail estimates +are inserted. -/ +theorem mgf_upperTruncation_le_one_add_half_mul_sq_mul_integral_abs_sq_add_integral_Ioc_tail_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) + (hXint : Integrable X μ) + (hXsq : Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hl : 0 ≤ l) (hL : 0 ≤ L) : + mgf (upperTruncation X L) μ l ≤ + 1 + (l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume) := by + let Y : Ω → ℝ := upperTruncation X L + let Yp : Ω → ℝ := fun ω => max (Y ω) 0 + let W : Ω → ℝ := fun ω => Y ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + let c : ℝ := l ^ (2 : ℕ) / 2 + have hYint : Integrable Y μ := by + simpa [Y] using integrable_upperTruncation_of_integrable (μ := μ) (X := X) (L := L) hXm hXint + have hWint : Integrable W μ := by + simpa [Y, Yp, W] using + integrable_upperTruncation_sq_mul_exp_max_of_integrable_abs_sq + (μ := μ) (X := X) (l := l) (L := L) hXm hXsq hl hL + have hExp_int : Integrable (fun ω => Real.exp (l * Y ω)) μ := by + simpa [Y] using integrable_exp_mul_upperTruncation (μ := μ) (X := X) (l := l) (L := L) hXm hl + have hlin_int : Integrable (fun ω => l * Y ω) μ := hYint.const_mul l + have hquad_int : Integrable (fun ω => c * W ω) μ := hWint.const_mul c + have hrhs_int : Integrable (fun ω => 1 + l * Y ω + c * W ω) μ := by + have hsplit : + (fun ω => 1 + l * Y ω + c * W ω) = + (fun _ : Ω => (1 : ℝ)) + ((fun ω => l * Y ω) + fun ω => c * W ω) := by + funext ω + simp [add_assoc] + rw [hsplit] + exact (integrable_const (1 : ℝ)).add (hlin_int.add hquad_int) + have hpoint : + ∀ᵐ ω ∂μ, Real.exp (l * Y ω) ≤ 1 + l * Y ω + c * W ω := by + filter_upwards with ω + simpa [Y, Yp, W, c, mul_assoc, mul_left_comm, mul_comm] using + exp_mul_le_one_add_mul_add_half_mul_sq_mul_exp_max_zero_of_nonneg + (l := l) (x := Y ω) hl + have hYmean_nonpos : ∫ ω, Y ω ∂μ ≤ 0 := by + simpa [Y] using + integral_upperTruncation_le_zero_of_integral_eq_zero + (μ := μ) (X := X) (L := L) hXm hXint hXmean + have hc_nonneg : 0 ≤ c := by + positivity + calc + mgf (upperTruncation X L) μ l = ∫ ω, Real.exp (l * Y ω) ∂μ := by + rfl + _ ≤ ∫ ω, 1 + l * Y ω + c * W ω ∂μ := + integral_mono_ae hExp_int hrhs_int hpoint + _ = 1 + l * ∫ ω, Y ω ∂μ + c * ∫ ω, W ω ∂μ := by + calc + ∫ ω, 1 + l * Y ω + c * W ω ∂μ + = ∫ ω, ((fun _ : Ω => (1 : ℝ)) + (fun ω => l * Y ω) + fun ω => c * W ω) ω ∂μ := by + simp [add_assoc] + _ = ∫ ω, (1 : ℝ) + l * Y ω ∂μ + ∫ ω, c * W ω ∂μ := by + simpa [Pi.add_apply] using + integral_add ((integrable_const (1 : ℝ)).add hlin_int) hquad_int + _ = (∫ ω, (fun _ : Ω => (1 : ℝ)) ω ∂μ + ∫ ω, l * Y ω ∂μ) + ∫ ω, c * W ω ∂μ := by + congr 1 + simpa [Pi.add_apply] using integral_add (integrable_const (1 : ℝ)) hlin_int + _ = 1 + l * ∫ ω, Y ω ∂μ + c * ∫ ω, W ω ∂μ := by + have hscaled : ∫ ω, c * W ω ∂μ = c * ∫ ω, W ω ∂μ := by + simpa using integral_const_mul c W + rw [integral_const, integral_const_mul, hscaled] + simp [smul_eq_mul, c, add_assoc] + _ ≤ 1 + c * ∫ ω, W ω ∂μ := by + nlinarith + _ ≤ 1 + c * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume) := by + have hscaled := + add_le_add_left + (mul_le_mul_of_nonneg_left + (integral_upperTruncation_sq_mul_exp_max_le_integral_abs_sq_add_integral_Ioc_tail + (μ := μ) (X := X) (l := l) (L := L) hXm hXsq hl hL) + hc_nonneg) + 1 + simpa [Y, W, add_assoc] using! hscaled + +/-- Exponential form of the one-variable truncated mgf bound. This is the +direct input used by the generic Chernoff reduction for sums of truncated +variables. -/ +theorem mgf_upperTruncation_le_exp_of_integral_abs_sq_add_integral_Ioc_tail_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) + (hXint : Integrable X μ) + (hXsq : Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hl : 0 ≤ l) (hL : 0 ≤ L) : + mgf (upperTruncation X L) μ l ≤ + Real.exp + ((l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume)) := by + calc + mgf (upperTruncation X L) μ l + ≤ 1 + (l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume) := + mgf_upperTruncation_le_one_add_half_mul_sq_mul_integral_abs_sq_add_integral_Ioc_tail_of_integral_eq_zero + (μ := μ) (X := X) (l := l) (L := L) hXm hXint hXsq hXmean hl hL + _ ≤ Real.exp + ((l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume)) := by + simpa [add_comm] using + (Real.add_one_le_exp + ((l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume))) + +/-- A symmetric `O_Ψ(1)` tail bound together with the integrability of +`t / Ψ(t)` controls the second moment. This is the scalar moment estimate used +later in the heavy-tail Chernoff argument. -/ +theorem lintegral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {CΨ : ℝ} + (hXm : Measurable X) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : IsBigO μ Ψ X 1) : + ∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ ≤ ENNReal.ofReal (2 + 2 * CΨ) := by + let Y : Ω → ℝ := fun ω => |X ω| + let g : ℝ → ENNReal := fun t => μ {ω | t < Y ω} * ENNReal.ofReal t + have hY_nonneg : ∀ ω, 0 ≤ Y ω := by + intro ω + simp [Y] + have hY_nonneg_ae : 0 ≤ᵐ[μ] Y := Filter.Eventually.of_forall hY_nonneg + have hYm : AEMeasurable Y μ := (hXm.aemeasurable.norm : AEMeasurable Y μ) + have hLayer := + MeasureTheory.lintegral_rpow_eq_lintegral_meas_lt_mul + (μ := μ) hY_nonneg_ae hYm (p := (2 : ℝ)) (by positivity : 0 < (2 : ℝ)) + have hLayer' : + ∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ = + ENNReal.ofReal (2 : ℝ) * ∫⁻ t in Set.Ioi 0, g t ∂volume := by + simpa [Y, g, Real.rpow_natCast, show (2 : ℝ) - 1 = 1 by norm_num] using hLayer + have hsplit : + ∫⁻ t in Set.Ioi 0, g t ∂volume = + ∫⁻ t in Set.Ioc 0 1, g t ∂volume + ∫⁻ t in Set.Ioi 1, g t ∂volume := by + have hunion : Set.Ioc (0 : ℝ) 1 ∪ Set.Ioi 1 = Set.Ioi 0 := by + ext t + constructor + · intro ht + rcases ht with ht | ht + · exact ht.1 + · exact lt_trans zero_lt_one (by simpa using ht) + · intro ht + by_cases ht1 : t ≤ 1 + · exact Or.inl ⟨ht, ht1⟩ + · exact Or.inr (lt_of_not_ge ht1) + rw [← hunion] + exact MeasureTheory.lintegral_union measurableSet_Ioi + (Set.disjoint_left.2 fun t ht0 ht1 => not_lt_of_ge ht0.2 ht1) + have hpart0 : + ∫⁻ t in Set.Ioc 0 1, g t ∂volume ≤ 1 := by + have hmono : + g ≤ᵐ[volume.restrict (Set.Ioc 0 1)] fun _ => (1 : ENNReal) := by + rw [Filter.EventuallyLE, ae_restrict_iff' measurableSet_Ioc] + refine Filter.Eventually.of_forall ?_ + intro t ht + have hmeasure_le : μ {ω | t < Y ω} ≤ 1 := by + calc + μ {ω | t < Y ω} ≤ μ Set.univ := measure_mono (Set.subset_univ _) + _ = 1 := by simp + have ht_le_one : ENNReal.ofReal t ≤ 1 := by + exact le_trans (ENNReal.ofReal_le_ofReal ht.2) (by simp) + calc + g t = μ {ω | t < Y ω} * ENNReal.ofReal t := by rfl + _ ≤ 1 * 1 := by + exact mul_le_mul hmeasure_le ht_le_one (by positivity) (by positivity) + _ = 1 := by simp + calc + ∫⁻ t in Set.Ioc 0 1, g t ∂volume ≤ ∫⁻ t : ℝ in Set.Ioc 0 1, (1 : ENNReal) ∂volume := by + exact lintegral_mono_ae hmono + _ = 1 * volume (Set.Ioc (0 : ℝ) 1) := by simp + _ = 1 := by norm_num [Real.volume_Ioc] + have hpart1 : + ∫⁻ t in Set.Ioi 1, g t ∂volume ≤ ENNReal.ofReal CΨ := by + have hmono : + g ≤ᵐ[volume.restrict (Set.Ioi 1)] fun t => ENNReal.ofReal (t / Ψ t) := by + rw [Filter.EventuallyLE, ae_restrict_iff' measurableSet_Ioi] + refine Filter.Eventually.of_forall ?_ + intro t ht + have htail_real : + μ.real {ω | t < Y ω} ≤ (Ψ t)⁻¹ := by + simpa [IsBigO, IsBigOWith, Y, upperTailEvent] using hX ht.le + have hmeasure_eq : + μ {ω | t < Y ω} = ENNReal.ofReal (μ.real {ω | t < Y ω}) := by + simp [Measure.real, (measure_lt_top μ {ω | t < Y ω}).ne] + have hmeasure_le : + μ {ω | t < Y ω} ≤ ENNReal.ofReal ((Ψ t)⁻¹) := by + rw [hmeasure_eq] + exact ENNReal.ofReal_le_ofReal htail_real + have ht_one : 1 < t := by simpa using ht + have ht_nonneg : 0 ≤ t := le_of_lt (lt_trans zero_lt_one ht_one) + have hΨ_one : 1 ≤ Ψ t := hAdmissible.2 ht_nonneg + have hΨ_inv_nonneg : 0 ≤ (Ψ t)⁻¹ := by + exact inv_nonneg.mpr (le_trans zero_le_one hΨ_one) + calc + g t = μ {ω | t < Y ω} * ENNReal.ofReal t := by rfl + _ ≤ ENNReal.ofReal ((Ψ t)⁻¹) * ENNReal.ofReal t := by + exact mul_le_mul_of_nonneg_right hmeasure_le (by positivity) + _ = ENNReal.ofReal (((Ψ t)⁻¹) * t) := by + rw [← ENNReal.ofReal_mul hΨ_inv_nonneg] + _ = ENNReal.ofReal (t / Ψ t) := by + rw [div_eq_mul_inv, mul_comm] + exact (lintegral_mono_ae hmono).trans hCΨ + calc + ∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ + = ENNReal.ofReal (2 : ℝ) * ∫⁻ t in Set.Ioi 0, g t ∂volume := hLayer' + _ ≤ ENNReal.ofReal (2 : ℝ) * (1 + ENNReal.ofReal CΨ) := by + gcongr + rw [hsplit] + exact add_le_add hpart0 hpart1 + _ = ENNReal.ofReal (2 : ℝ) * (ENNReal.ofReal 1 + ENNReal.ofReal CΨ) := by + norm_num + _ = ENNReal.ofReal (2 : ℝ) * ENNReal.ofReal (1 + CΨ) := by + rw [← ENNReal.ofReal_add (show 0 ≤ (1 : ℝ) by norm_num) hCΨ_nonneg] + _ = ENNReal.ofReal ((2 : ℝ) * (1 + CΨ)) := by + rw [← ENNReal.ofReal_mul (by positivity : 0 ≤ (2 : ℝ))] + _ = ENNReal.ofReal (2 + 2 * CΨ) := by + congr 1 + ring + +/-- Real-integral version of +`lintegral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail`. -/ +theorem integral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {CΨ : ℝ} + (hXm : Measurable X) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : IsBigO μ Ψ X 1) : + ∫ ω, |X ω| ^ (2 : ℕ) ∂μ ≤ 2 + 2 * CΨ := by + have hlin := + lintegral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail + (μ := μ) (Ψ := Ψ) (X := X) (CΨ := CΨ) + hXm hAdmissible hCΨ_nonneg hCΨ hX + have hsq_meas : AEStronglyMeasurable (fun ω => |X ω| ^ (2 : ℕ)) μ := + ((hXm.aemeasurable.norm.pow_const 2).aestronglyMeasurable) + have hsq_nonneg : + 0 ≤ᵐ[μ] fun ω => |X ω| ^ (2 : ℕ) := by + refine Filter.Eventually.of_forall ?_ + intro ω + positivity + have hlin_ne_top : + ∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ ≠ (⊤ : ENNReal) := by + exact lt_top_iff_ne_top.mp (lt_of_le_of_lt hlin (by simp)) + have hbound_nonneg : 0 ≤ 2 + 2 * CΨ := by + nlinarith + calc + ∫ ω, |X ω| ^ (2 : ℕ) ∂μ + = ENNReal.toReal (∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ) := by + exact MeasureTheory.integral_eq_lintegral_of_nonneg_ae hsq_nonneg hsq_meas + _ ≤ ENNReal.toReal (ENNReal.ofReal (2 + 2 * CΨ)) := by + exact ENNReal.toReal_mono (by simp) hlin + _ = 2 + 2 * CΨ := by + simpa using ENNReal.toReal_ofReal hbound_nonneg + +/-- Generic Chernoff reduction for a finite independent family once each +one-variable mgf is bounded by `exp (vᵢ)`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_of_iIndepFun_of_mgf_le_exp + [IsProbabilityMeasure μ] + {Y : ι → Ω → ℝ} {v : ι → ℝ} {s : Finset ι} {a l : ℝ} + (h_indep : iIndepFun Y μ) + (h_meas : ∀ i, Measurable (Y i)) + (hl : 0 ≤ l) + (h_int : ∀ i ∈ s, Integrable (fun ω => Real.exp (l * Y i ω)) μ) + (hmgf : ∀ i ∈ s, mgf (Y i) μ l ≤ Real.exp (v i)) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, Y i ω) a) ≤ + Real.exp (-l * a + ∑ i ∈ s, v i) := by + have h_int_sum : Integrable (fun ω => Real.exp (l * (∑ i ∈ s, Y i ω))) μ := by + have hsumfun : (fun ω => ∑ i ∈ s, Y i ω) = ∑ i ∈ s, Y i := by + funext ω + simp [Finset.sum_apply] + simpa [hsumfun] using h_indep.integrable_exp_mul_sum (t := l) h_meas h_int + have hsubset : + upperTailEvent (fun ω => ∑ i ∈ s, Y i ω) a ⊆ {ω | a ≤ ∑ i ∈ s, Y i ω} := by + intro ω hω + exact le_of_lt (by simpa [upperTailEvent] using hω) + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, Y i ω) a) + ≤ Real.exp (-l * a) * mgf (fun ω => ∑ i ∈ s, Y i ω) μ l := by + refine (measureReal_mono hsubset).trans ?_ + simpa using measure_ge_le_exp_mul_mgf (μ := μ) (X := fun ω => ∑ i ∈ s, Y i ω) + (ε := a) (t := l) hl h_int_sum + _ = Real.exp (-l * a) * ∏ i ∈ s, mgf (Y i) μ l := by + have hsumfun : (fun ω => ∑ i ∈ s, Y i ω) = ∑ i ∈ s, Y i := by + funext ω + simp [Finset.sum_apply] + rw [hsumfun, h_indep.mgf_sum (t := l) h_meas s] + _ ≤ Real.exp (-l * a) * ∏ i ∈ s, Real.exp (v i) := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + refine Finset.prod_le_prod₀ ?_ hmgf + intro i hi + exact mgf_nonneg + _ = Real.exp (-l * a) * Real.exp (∑ i ∈ s, v i) := by + rw [← Real.exp_sum] + _ = Real.exp (-l * a + ∑ i ∈ s, v i) := by + rw [← Real.exp_add] + +/-- Chernoff reduction specialized to the one-sided upper truncation +`min (Xᵢ, L)`. -/ +theorem measureReal_upperTailEvent_finset_sum_upperTruncation_le_exp_of_iIndepFun_of_mgf_le_exp + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {v : ι → ℝ} {s : Finset ι} {a l L : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hl : 0 ≤ l) + (hmgf : ∀ i ∈ s, mgf (upperTruncation (X i) L) μ l ≤ Real.exp (v i)) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) ≤ + Real.exp (-l * a + ∑ i ∈ s, v i) := by + let Y : ι → Ω → ℝ := fun i => upperTruncation (X i) L + have h_indepY : iIndepFun Y μ := by + simpa [Y] using! iIndepFun_upperTruncation (μ := μ) (X := X) (L := L) h_indep + have h_measY : ∀ i, Measurable (Y i) := by + intro i + simpa [Y] using upperTruncation_measurable (X := X i) (L := L) (h_meas i) + have h_intY : ∀ i ∈ s, Integrable (fun ω => Real.exp (l * Y i ω)) μ := by + intro i hi + simpa [Y] using + integrable_exp_mul_upperTruncation (μ := μ) (X := X i) (l := l) (L := L) (h_meas i) hl + simpa [Y] using + measureReal_upperTailEvent_finset_sum_le_exp_of_iIndepFun_of_mgf_le_exp + (μ := μ) + (Y := Y) + (v := v) + (s := s) + (a := a) + (l := l) + h_indepY + h_measY + hl + h_intY + hmgf + +/-- Uniform one-variable mgf bounds produce the expected `card(s)` factor in +the exponent for the truncated sum. -/ +theorem measureReal_upperTailEvent_finset_sum_upperTruncation_le_exp_card_mul_of_iIndepFun_of_mgf_le_exp + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {a l L v : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hl : 0 ≤ l) + (hmgf : ∀ i ∈ s, mgf (upperTruncation (X i) L) μ l ≤ Real.exp v) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * v) := by + let w : ι → ℝ := fun _ => v + have hmain := + measureReal_upperTailEvent_finset_sum_upperTruncation_le_exp_of_iIndepFun_of_mgf_le_exp + (μ := μ) + (X := X) + (v := w) + (s := s) + (a := a) + (l := l) + (L := L) + h_indep + h_meas + hl + (by + intro i hi + simpa [w] using hmgf i hi) + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + ≤ Real.exp (-l * a + ∑ i ∈ s, w i) := hmain + _ = Real.exp (-l * a + (s.card : ℝ) * v) := by + congr 1 + rw [Finset.sum_const, nsmul_eq_mul] + +/-- The symmetric `O_Ψ(1)` hypothesis immediately controls the one-sided upper +tail needed by the truncation split. -/ +theorem measureReal_upperTailEvent_le_inv_of_isBigO + [IsFiniteMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {t : ℝ} + (hX : IsBigO μ Ψ X 1) (ht : 1 ≤ t) : + μ.real (upperTailEvent X t) ≤ (Ψ t)⁻¹ := by + have hsubset : upperTailEvent X t ⊆ absTailEvent X t := by + intro ω hω + exact lt_of_lt_of_le hω (le_abs_self (X ω)) + have hfinite : μ (absTailEvent X t) ≠ (⊤ : ENNReal) := + ne_of_lt (measure_lt_top _ _) + exact (measureReal_mono hsubset hfinite).trans <| by + simpa [IsBigO, IsBigOWith, absTailEvent] using hX ht + +/-- The natural `Set.Ioc 0 L` tail integrand is integrable on finite intervals, +because the tail factor is bounded by `1` and the polynomial-exponential weight +is bounded on `[0, L]`. -/ +theorem integrableOn_integrand_Ioc_tail + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hl : 0 ≤ l) (hL : 0 ≤ L) : + IntegrableOn + (fun t => + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω}) + (Set.Ioc 0 L) volume := by + let f : ℝ → ℝ := fun t => + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} + let C : ℝ := ((2 * L + l * L ^ (2 : ℕ)) * Real.exp (l * L)) + have htail_meas_enn : Measurable fun t : ℝ => μ {ω | t ≤ X ω} := by + refine Antitone.measurable ?_ + intro s t hst + exact measure_mono fun ω hω => hst.trans hω + have htail_meas : Measurable fun t : ℝ => μ.real {ω | t ≤ X ω} := by + simpa [Measure.real] using htail_meas_enn.ennreal_toReal + have hf_meas : AEStronglyMeasurable f (volume.restrict (Set.Ioc 0 L)) := by + refine (((measurable_id.const_mul 2).add + ((measurable_id.pow_const 2).const_mul l)).mul + ((measurable_id.const_mul l).exp)).mul htail_meas |>.aestronglyMeasurable + have hC_nonneg : 0 ≤ C := by + have hpoly_nonneg : 0 ≤ 2 * L + l * L ^ (2 : ℕ) := by + nlinarith [sq_nonneg L, hL, hl] + exact mul_nonneg hpoly_nonneg (Real.exp_pos _).le + change Integrable f (volume.restrict (Set.Ioc 0 L)) + refine Integrable.mono' (integrable_const C) hf_meas ?_ + refine (ae_restrict_iff' measurableSet_Ioc).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + have ht_nonneg : 0 ≤ t := le_of_lt ht.1 + have ht_le_L : t ≤ L := ht.2 + have hmeasure_le : μ.real {ω | t ≤ X ω} ≤ 1 := by + calc + μ.real {ω | t ≤ X ω} ≤ μ.real Set.univ := measureReal_mono (Set.subset_univ _) + _ = 1 := by simp + have hpoly_nonneg : 0 ≤ 2 * t + l * t ^ (2 : ℕ) := by + nlinarith [sq_nonneg t, ht_nonneg, hl] + have hsq_le : t ^ (2 : ℕ) ≤ L ^ (2 : ℕ) := by + nlinarith [ht_nonneg, hL, ht_le_L] + have hpoly_le : 2 * t + l * t ^ (2 : ℕ) ≤ 2 * L + l * L ^ (2 : ℕ) := by + nlinarith + have hexp_le : Real.exp (l * t) ≤ Real.exp (l * L) := by + exact Real.exp_le_exp.2 (mul_le_mul_of_nonneg_left ht_le_L hl) + have hnonneg : 0 ≤ f t := by + have hmeasure_nonneg : 0 ≤ μ.real {ω | t ≤ X ω} := by positivity + exact mul_nonneg (mul_nonneg hpoly_nonneg (Real.exp_pos _).le) hmeasure_nonneg + have hweight_le : + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) + ≤ ((2 * L + l * L ^ (2 : ℕ)) * Real.exp (l * L)) := by + exact mul_le_mul hpoly_le hexp_le (by positivity) (by positivity) + have hbound : + f t ≤ C := by + calc + f t + ≤ ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * 1 := by + exact mul_le_mul_of_nonneg_left hmeasure_le + (mul_nonneg hpoly_nonneg (Real.exp_pos _).le) + _ ≤ ((2 * L + l * L ^ (2 : ℕ)) * Real.exp (l * L)) * 1 := by + gcongr + _ = C := by simp [C] + simpa [f, C, Real.norm_of_nonneg hnonneg] using hbound + +/-- The small interval `(0, 1]` contributes a universal bounded term to the +truncated mgf exponent. -/ +theorem integral_Ioc_zero_one_tail_le_exp_one + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {l : ℝ} + (hXm : Measurable X) (hl : 0 ≤ l) (hl1 : l ≤ 1) : + ∫ t in Set.Ioc 0 1, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume ≤ + Real.exp 1 := by + let Yp : Ω → ℝ := fun ω => max (upperTruncation X 1 ω) 0 + have hYp_int : + Integrable + (fun ω => + Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω)) μ := by + simpa [Yp] using + integrable_upperTruncation_posPart_sq_mul_exp + (μ := μ) (X := X) (l := l) (L := 1) hXm hl zero_le_one + calc + ∫ t in Set.Ioc 0 1, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume + = ∫ ω, Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ∂μ := by + simpa [Yp] using + (integral_upperTruncation_posPart_sq_mul_exp_eq_integral_Ioc_tail + (μ := μ) (X := X) (l := l) (L := 1) hXm hl zero_le_one).symm + _ ≤ ∫ ω, Real.exp 1 ∂μ := by + refine integral_mono_ae hYp_int (integrable_const (Real.exp 1)) ?_ + filter_upwards with ω + have hYp_nonneg : 0 ≤ Yp ω := by + exact le_max_right _ _ + have hYp_le_one : Yp ω ≤ 1 := by + change max (upperTruncation X 1 ω) 0 ≤ (1 : ℝ) + exact upperTruncation_posPart_le (X := X) (L := 1) (ω := ω) zero_le_one + have hsq_le : Yp ω ^ (2 : ℕ) ≤ 1 := by + have hsq_le' : Yp ω ^ (2 : ℕ) ≤ (1 : ℝ) ^ (2 : ℕ) := by + exact (sq_le_sq₀ hYp_nonneg zero_le_one).2 hYp_le_one + simpa using hsq_le' + have hmul_le_one : l * Yp ω ≤ 1 := by + nlinarith + have hexp_le : Real.exp (l * Yp ω) ≤ Real.exp 1 := by + exact Real.exp_le_exp.2 hmul_le_one + have hbound : + Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ≤ Real.exp 1 := by + calc + Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + ≤ 1 * Real.exp 1 := by + exact mul_le_mul hsq_le hexp_le (by positivity) (by positivity) + _ = Real.exp 1 := by simp + exact hbound + _ = Real.exp 1 := by simp + +/-- The Chapter 4 logarithmic constraint implies the deterministic kernel +bound `exp (λ t) / Ψ(t) ≤ M t^{-4}` on `[1, L]`. -/ +theorem exp_mul_div_psi_le_mul_rpow_neg_four_of_log_constraint + {Ψ : ℝ → ℝ} {l L M t : ℝ} + (hAdmissible : AdmissiblePsi Ψ) + (hM : 1 ≤ M) + (ht : t ∈ Set.Icc 1 L) + (hconstraint : + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + Real.exp (l * t) / Ψ t ≤ M * t ^ (-4 : ℝ) := by + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht.1 + have hΨ_pos : 0 < Ψ t := lt_of_lt_of_le zero_lt_one (hAdmissible.2 (le_trans zero_le_one ht.1)) + have hM_pos : 0 < M := lt_of_lt_of_le zero_lt_one hM + rw [div_le_iff₀ hΨ_pos] + calc + Real.exp (l * t) + ≤ Real.exp (Real.log (Ψ t) - 4 * Real.log t + Real.log M) := by + exact Real.exp_le_exp.2 hconstraint + _ = M * t ^ (-4 : ℝ) * Ψ t := by + rw [sub_eq_add_neg, Real.exp_add, Real.exp_add, Real.exp_log hΨ_pos, Real.exp_log hM_pos] + rw [show Real.exp (-(4 * Real.log t)) = t ^ (-4 : ℝ) by + rw [show -(4 * Real.log t) = Real.log t * (-4 : ℝ) by ring, + Real.exp_mul, Real.exp_log ht_pos]] + ring + +/-- The large interval `[1, L]` tail contribution is controlled by the +deterministic kernel coming from the Chapter 4 logarithmic constraint. -/ +theorem integral_Ioc_one_L_tail_le_two_mul_M_of_isBigO_of_log_constraint + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {l L M : ℝ} + (hAdmissible : AdmissiblePsi Ψ) + (hX : IsBigO μ Ψ X 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hM : 1 ≤ M) + (hconstraint : ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + ∫ t in Set.Ioc 1 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume ≤ + 2 * M := by + let f : ℝ → ℝ := fun t => + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} + let g : ℝ → ℝ := fun t => M * (2 * t ^ (-3 : ℝ) + t ^ (-2 : ℝ)) + have htail_eq : + (fun t : ℝ => μ.real {ω | t ≤ X ω}) =ᵐ[volume.restrict (Set.Ioc 1 L)] + fun t => μ.real {ω | t < X ω} := by + refine (MeasureTheory.meas_le_ae_eq_meas_lt μ (volume.restrict (Set.Ioc 1 L)) X).mono ?_ + intro t ht + exact congrArg ENNReal.toReal ht + have hf_meas : AEStronglyMeasurable f (volume.restrict (Set.Ioc 1 L)) := by + have htail_meas_enn : Measurable fun t : ℝ => μ {ω | t ≤ X ω} := by + refine Antitone.measurable ?_ + intro s t hst + exact measure_mono fun ω hω => hst.trans hω + have htail_meas : Measurable fun t : ℝ => μ.real {ω | t ≤ X ω} := by + simpa [Measure.real] using htail_meas_enn.ennreal_toReal + refine (((measurable_id.const_mul 2).add + ((measurable_id.pow_const 2).const_mul l)).mul + ((measurable_id.const_mul l).exp)).mul htail_meas |>.aestronglyMeasurable + have hpow3_Ioi : IntegrableOn (fun t : ℝ => t ^ (-3 : ℝ)) (Set.Ioi 1) volume := + integrableOn_Ioi_rpow_of_lt (a := (-3 : ℝ)) (by norm_num) zero_lt_one + have hpow2_Ioi : IntegrableOn (fun t : ℝ => t ^ (-2 : ℝ)) (Set.Ioi 1) volume := + integrableOn_Ioi_rpow_of_lt (a := (-2 : ℝ)) (by norm_num) zero_lt_one + have hg_Ioi : IntegrableOn g (Set.Ioi 1) volume := by + refine ((hpow3_Ioi.const_mul 2).add hpow2_Ioi).const_mul M + have hg_nonneg_Ioi : + 0 ≤ᵐ[volume.restrict (Set.Ioi 1)] g := by + refine (ae_restrict_iff' measurableSet_Ioi).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one (le_of_lt ht) + have hrpow_nonneg3 : 0 ≤ t ^ (-3 : ℝ) := Real.rpow_nonneg ht_nonneg _ + have hrpow_nonneg2 : 0 ≤ t ^ (-2 : ℝ) := Real.rpow_nonneg ht_nonneg _ + have hinner_nonneg : 0 ≤ 2 * t ^ (-3 : ℝ) + t ^ (-2 : ℝ) := by + positivity + exact mul_nonneg (le_trans zero_le_one hM) hinner_nonneg + have hg : IntegrableOn g (Set.Ioc 1 L) volume := hg_Ioi.mono_set Set.Ioc_subset_Ioi_self + have hf_bound : + ∀ᵐ t ∂volume.restrict (Set.Ioc 1 L), f t ≤ g t := by + filter_upwards [htail_eq, self_mem_ae_restrict measurableSet_Ioc] with t htail ht + have ht_mem : t ∈ Set.Icc 1 L := ⟨ht.1.le, ht.2⟩ + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht.1.le + have ht_pos : 0 < t := lt_trans zero_lt_one ht.1 + have htail_le : + μ.real {ω | t < X ω} ≤ (Ψ t)⁻¹ := by + simpa [upperTailEvent] using + measureReal_upperTailEvent_le_inv_of_isBigO (μ := μ) (Ψ := Ψ) (X := X) hX ht.1.le + have hpoly_nonneg : 0 ≤ 2 * t + l * t ^ (2 : ℕ) := by + nlinarith [sq_nonneg t, ht_nonneg, hl] + have hkernel : + Real.exp (l * t) / Ψ t ≤ M * t ^ (-4 : ℝ) := by + exact exp_mul_div_psi_le_mul_rpow_neg_four_of_log_constraint + (Ψ := Ψ) (l := l) (L := L) (M := M) hAdmissible hM ht_mem (hconstraint ht_mem) + have hpoly_le : 2 * t + l * t ^ (2 : ℕ) ≤ 2 * t + t ^ (2 : ℕ) := by + nlinarith [sq_nonneg t, ht_nonneg, hl1] + have hkernel_nonneg : 0 ≤ M * t ^ (-4 : ℝ) := by + exact mul_nonneg (le_trans zero_le_one hM) (Real.rpow_nonneg ht_nonneg _) + have hrpow_mul₁ : t * t ^ (-4 : ℝ) = t ^ (-3 : ℝ) := by + calc + t * t ^ (-4 : ℝ) = t ^ (1 : ℝ) * t ^ (-4 : ℝ) := by simp [Real.rpow_one] + _ = t ^ ((1 : ℝ) + (-4 : ℝ)) := by + rw [← Real.rpow_add ht_pos] + _ = t ^ (-3 : ℝ) := by norm_num + have hrpow_mul₂ : t ^ (2 : ℕ) * t ^ (-4 : ℝ) = t ^ (-2 : ℝ) := by + calc + t ^ (2 : ℕ) * t ^ (-4 : ℝ) = t * (t * t ^ (-4 : ℝ)) := by ring + _ = t * t ^ (-3 : ℝ) := by rw [hrpow_mul₁] + _ = t ^ (1 : ℝ) * t ^ (-3 : ℝ) := by simp [Real.rpow_one] + _ = t ^ ((1 : ℝ) + (-3 : ℝ)) := by + rw [← Real.rpow_add ht_pos] + _ = t ^ (-2 : ℝ) := by norm_num + have hPsi_nonneg : 0 ≤ Ψ t := by + exact le_trans zero_le_one (hAdmissible.2 (le_trans zero_le_one ht_mem.1)) + have hexp_div_nonneg : 0 ≤ Real.exp (l * t) / Ψ t := by + exact div_nonneg (Real.exp_pos _).le hPsi_nonneg + calc + f t = ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * μ.real {ω | t ≤ X ω} := by + rfl + _ = ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * μ.real {ω | t < X ω} := by + rw [htail] + _ ≤ ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * (Ψ t)⁻¹ := by + exact mul_le_mul_of_nonneg_left htail_le (mul_nonneg hpoly_nonneg (Real.exp_pos _).le) + _ = (2 * t + l * t ^ (2 : ℕ)) * (Real.exp (l * t) / Ψ t) := by + rw [div_eq_mul_inv] + ring + _ ≤ (2 * t + t ^ (2 : ℕ)) * (M * t ^ (-4 : ℝ)) := by + exact mul_le_mul hpoly_le hkernel hexp_div_nonneg + (by nlinarith [sq_nonneg t, ht_nonneg]) + _ = g t := by + calc + (2 * t + t ^ (2 : ℕ)) * (M * t ^ (-4 : ℝ)) + = M * ((2 * t) * t ^ (-4 : ℝ) + t ^ (2 : ℕ) * t ^ (-4 : ℝ)) := by + ring + _ = M * (2 * (t * t ^ (-4 : ℝ)) + t ^ (2 : ℕ) * t ^ (-4 : ℝ)) := by + ring + _ = M * (2 * t ^ (-3 : ℝ) + t ^ (-2 : ℝ)) := by + rw [hrpow_mul₁, hrpow_mul₂] + _ = g t := by + rfl + have hf : IntegrableOn f (Set.Ioc 1 L) volume := by + change Integrable f (volume.restrict (Set.Ioc 1 L)) + refine Integrable.mono' hg hf_meas ?_ + filter_upwards [hf_bound, self_mem_ae_restrict measurableSet_Ioc] with t ht ht_mem + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht_mem.1.le + have hf_nonneg : 0 ≤ f t := by + have hmeasure_nonneg : 0 ≤ μ.real {ω | t ≤ X ω} := by positivity + have hpoly_nonneg : 0 ≤ 2 * t + l * t ^ (2 : ℕ) := by + nlinarith [sq_nonneg t, ht_nonneg, hl] + exact mul_nonneg (mul_nonneg hpoly_nonneg (Real.exp_pos _).le) hmeasure_nonneg + simpa [Real.norm_of_nonneg hf_nonneg] using ht + have hmono_set : + ∫ t in Set.Ioc 1 L, g t ∂volume ≤ ∫ t in Set.Ioi 1, g t ∂volume := by + exact setIntegral_mono_set hg_Ioi hg_nonneg_Ioi Set.Ioc_subset_Ioi_self.eventuallyLE + have hI3 := integral_Ioi_rpow_of_lt (a := (-3 : ℝ)) (by norm_num) zero_lt_one + have hI2 := integral_Ioi_rpow_of_lt (a := (-2 : ℝ)) (by norm_num) zero_lt_one + calc + ∫ t in Set.Ioc 1 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume + = ∫ t in Set.Ioc 1 L, f t ∂volume := by rfl + _ ≤ ∫ t in Set.Ioc 1 L, g t ∂volume := by + exact setIntegral_mono_on_ae hf hg measurableSet_Ioc + ((ae_restrict_iff' measurableSet_Ioc).1 hf_bound) + _ ≤ ∫ t in Set.Ioi 1, g t ∂volume := hmono_set + _ = 2 * M := by + rw [show ∫ t in Set.Ioi 1, g t ∂volume = + M * ∫ t in Set.Ioi 1, (2 * t ^ (-3 : ℝ) + t ^ (-2 : ℝ)) ∂volume by + simp [g, integral_const_mul]] + rw [integral_add (hpow3_Ioi.const_mul 2) hpow2_Ioi, integral_const_mul, hI3, hI2] + ring + +/-- Exact one-variable truncated mgf estimate under the Chapter 4 admissible +weak-Orlicz hypotheses. The constant reflects the currently formalized +`Set.Ioc 0 1` cleanup term. -/ +theorem mgf_upperTruncation_le_exp_of_isBigO_of_lintegral_tail_of_log_constraint + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {CΨ l L M : ℝ} + (hXm : Measurable X) + (hXint : Integrable X μ) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : IsBigO μ Ψ X 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + mgf (upperTruncation X L) μ l ≤ + Real.exp (l ^ (2 : ℕ) * (1 + Real.exp 1 / 2 + M + CΨ)) := by + let tailIntegrand : ℝ → ℝ := fun t => + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} + have hsq_nonneg : + 0 ≤ᵐ[μ] fun ω => |X ω| ^ (2 : ℕ) := by + refine Filter.Eventually.of_forall ?_ + intro ω + positivity + have hlin_sq := + lintegral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail + (μ := μ) (Ψ := Ψ) (X := X) (CΨ := CΨ) + hXm hAdmissible hCΨ_nonneg hCΨ hX + have hlin_sq_ne_top : + ∫⁻ ω, ENNReal.ofReal (|X ω| ^ (2 : ℕ)) ∂μ ≠ (⊤ : ENNReal) := by + exact lt_top_iff_ne_top.mp (lt_of_le_of_lt hlin_sq (by simp)) + have hXsq : + Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ := by + exact (lintegral_ofReal_ne_top_iff_integrable + ((hXm.aemeasurable.norm.pow_const 2).aestronglyMeasurable) hsq_nonneg).1 hlin_sq_ne_top + have htail_int : + IntegrableOn tailIntegrand (Set.Ioc 0 L) volume := + integrableOn_integrand_Ioc_tail (μ := μ) (X := X) (l := l) (L := L) hl (le_trans zero_le_one hL) + have htail_split : + ∫ t in Set.Ioc 0 L, tailIntegrand t ∂volume = + ∫ t in Set.Ioc 0 1, tailIntegrand t ∂volume + + ∫ t in Set.Ioc 1 L, tailIntegrand t ∂volume := by + have hdisj : Disjoint (Set.Ioc (0 : ℝ) 1) (Set.Ioc 1 L) := by + refine Set.disjoint_left.2 ?_ + intro t ht0 ht1 + exact not_lt_of_ge ht0.2 ht1.1 + have hunion : Set.Ioc (0 : ℝ) 1 ∪ Set.Ioc 1 L = Set.Ioc 0 L := by + exact Set.Ioc_union_Ioc_eq_Ioc zero_le_one hL + rw [← hunion] + exact setIntegral_union hdisj measurableSet_Ioc + (htail_int.mono_set (by + intro t ht + exact ⟨ht.1, le_trans ht.2 hL⟩)) + (htail_int.mono_set (by + intro t ht + exact ⟨lt_trans zero_lt_one ht.1, ht.2⟩)) + have hmoment : + ∫ ω, |X ω| ^ (2 : ℕ) ∂μ ≤ 2 + 2 * CΨ := + integral_abs_sq_le_two_add_two_mul_of_isBigO_of_lintegral_tail + (μ := μ) (Ψ := Ψ) (X := X) (CΨ := CΨ) + hXm hAdmissible hCΨ_nonneg hCΨ hX + have hsmall : + ∫ t in Set.Ioc 0 1, tailIntegrand t ∂volume ≤ Real.exp 1 := + integral_Ioc_zero_one_tail_le_exp_one (μ := μ) (X := X) (l := l) hXm hl hl1 + have hlarge : + ∫ t in Set.Ioc 1 L, tailIntegrand t ∂volume ≤ 2 * M := + integral_Ioc_one_L_tail_le_two_mul_M_of_isBigO_of_log_constraint + (μ := μ) (Ψ := Ψ) (X := X) (l := l) (L := L) (M := M) + hAdmissible hX hl hl1 hM hconstraint + have htail_total : + ∫ t in Set.Ioc 0 L, tailIntegrand t ∂volume ≤ Real.exp 1 + 2 * M := by + rw [htail_split] + exact add_le_add hsmall hlarge + calc + mgf (upperTruncation X L) μ l + ≤ Real.exp + ((l ^ (2 : ℕ) / 2) * + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, tailIntegrand t ∂volume)) := + by + simpa [tailIntegrand] using + mgf_upperTruncation_le_exp_of_integral_abs_sq_add_integral_Ioc_tail_of_integral_eq_zero + (μ := μ) (X := X) (l := l) (L := L) hXm hXint hXsq hXmean hl (le_trans zero_le_one hL) + _ ≤ Real.exp + ((l ^ (2 : ℕ) / 2) * + ((2 + 2 * CΨ) + (Real.exp 1 + 2 * M))) := by + apply Real.exp_le_exp.2 + exact mul_le_mul_of_nonneg_left + (add_le_add hmoment htail_total) (by positivity) + _ = Real.exp (l ^ (2 : ℕ) * (1 + Real.exp 1 / 2 + M + CΨ)) := by + congr 1 + ring + +/-- Rounded one-variable truncated mgf estimate with the cleaner constant +`3 + M + C_Ψ`. -/ +theorem mgf_upperTruncation_le_exp_of_isBigO_of_lintegral_tail_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {CΨ l L M : ℝ} + (hXm : Measurable X) + (hXint : Integrable X μ) + (hXmean : ∫ ω, X ω ∂μ = 0) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : IsBigO μ Ψ X 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + mgf (upperTruncation X L) μ l ≤ + Real.exp (l ^ (2 : ℕ) * (3 + M + CΨ)) := by + have hmain := + mgf_upperTruncation_le_exp_of_isBigO_of_lintegral_tail_of_log_constraint + (μ := μ) (Ψ := Ψ) (X := X) (CΨ := CΨ) (l := l) (L := L) (M := M) + hXm hXint hXmean hAdmissible hCΨ_nonneg hCΨ hX hl hl1 hL hM hconstraint + have hexp_half_le_two : Real.exp 1 / 2 ≤ 2 := by + have hexp_lt_four : Real.exp 1 < 4 := by + exact lt_trans Real.exp_one_lt_d9 (by norm_num) + nlinarith + refine hmain.trans ?_ + apply Real.exp_le_exp.2 + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + nlinarith + +/-- Generic heavy-tail concentration estimate for centered finite independent +families under the Chapter 4 admissibility and logarithmic-kernel hypotheses. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : ι → Ω → ℝ} {s : Finset ι} {a l L CΨ M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp + (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (1 + Real.exp 1 / 2 + M + CΨ))) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + let v : ℝ := l ^ (2 : ℕ) * (1 + Real.exp 1 / 2 + M + CΨ) + have hX_with : ∀ i ∈ s, IsBigOWith μ Ψ (X i) 1 := by + intro i hi + exact IsBigOWith.of_le (μ := μ) (Ψ := Ψ) (X := fun ω => |X i ω|) (Y := X i) (A := 1) + (by simpa [IsBigO] using hX i hi) (fun ω => le_abs_self (X i ω)) + have hsplit := + measureReal_upperTailEvent_finset_sum_le_upperTruncation_add_card_mul_of_isBigOWith + (μ := μ) (Ψ := Ψ) (X := X) (s := s) (L := L) (a := a) hX_with hL + have htrunc : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * v) := by + refine measureReal_upperTailEvent_finset_sum_upperTruncation_le_exp_card_mul_of_iIndepFun_of_mgf_le_exp + (μ := μ) (X := X) (s := s) (a := a) (l := l) (L := L) (v := v) + h_indep h_meas hl ?_ + intro i hi + exact mgf_upperTruncation_le_exp_of_isBigO_of_lintegral_tail_of_log_constraint + (μ := μ) (Ψ := Ψ) (X := X i) (CΨ := CΨ) (l := l) (L := L) (M := M) + (h_meas i) (h_int i hi) (h_mean i hi) hAdmissible hCΨ_nonneg hCΨ (hX i hi) + hl hl1 hL hM (hconstraint i hi) + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) + ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + (s.card : ℝ) * (Ψ L)⁻¹ := hsplit + _ ≤ Real.exp (-l * a + (s.card : ℝ) * v) + (s.card : ℝ) * (Ψ L)⁻¹ := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left htrunc ((s.card : ℝ) * (Ψ L)⁻¹) + _ = Real.exp + (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (1 + Real.exp 1 / 2 + M + CΨ))) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + simp [v] + +/-- Rounded generic heavy-tail concentration estimate with the cleaner +constant `3 + M + C_Ψ`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {Ψ : ℝ → ℝ} {X : ι → Ω → ℝ} {s : Finset ι} {a l L CΨ M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hAdmissible : AdmissiblePsi Ψ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / Ψ t) ∂volume ≤ ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (Ψ t) - 4 * Real.log t + Real.log M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + let v : ℝ := l ^ (2 : ℕ) * (3 + M + CΨ) + have hX_with : ∀ i ∈ s, IsBigOWith μ Ψ (X i) 1 := by + intro i hi + exact IsBigOWith.of_le (μ := μ) (Ψ := Ψ) (X := fun ω => |X i ω|) (Y := X i) (A := 1) + (by simpa [IsBigO] using hX i hi) (fun ω => le_abs_self (X i ω)) + have hsplit := + measureReal_upperTailEvent_finset_sum_le_upperTruncation_add_card_mul_of_isBigOWith + (μ := μ) (Ψ := Ψ) (X := X) (s := s) (L := L) (a := a) hX_with hL + have htrunc : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * v) := by + refine measureReal_upperTailEvent_finset_sum_upperTruncation_le_exp_card_mul_of_iIndepFun_of_mgf_le_exp + (μ := μ) (X := X) (s := s) (a := a) (l := l) (L := L) (v := v) + h_indep h_meas hl ?_ + intro i hi + exact mgf_upperTruncation_le_exp_of_isBigO_of_lintegral_tail_of_log_constraint_rounded + (μ := μ) (Ψ := Ψ) (X := X i) (CΨ := CΨ) (l := l) (L := L) (M := M) + (h_meas i) (h_int i hi) (h_mean i hi) hAdmissible hCΨ_nonneg hCΨ (hX i hi) + hl hl1 hL hM (hconstraint i hi) + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) + ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + (s.card : ℝ) * (Ψ L)⁻¹ := hsplit + _ ≤ Real.exp (-l * a + (s.card : ℝ) * v) + (s.card : ℝ) * (Ψ L)⁻¹ := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left htrunc ((s.card : ℝ) * (Ψ L)⁻¹) + _ = Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + simp [v] + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/TailKernel.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/TailKernel.lean new file mode 100644 index 0000000000..a99c063a89 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/TailKernel.lean @@ -0,0 +1,398 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration.Truncation + +/-! # Tail Kernel -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Primitive used in the weighted layer-cake estimate for +`t ↦ t² e^{λt}`. -/ +theorem integral_sq_exp_weight (l s : ℝ) : + ∫ t in 0..s, ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) = + s ^ (2 : ℕ) * Real.exp (l * s) := by + have hderiv : + ∀ t ∈ Set.uIcc (0 : ℝ) s, + HasDerivAt (fun u : ℝ => u ^ (2 : ℕ) * Real.exp (l * u)) + (((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t))) t := by + intro t ht + have hpow : HasDerivAt (fun u : ℝ => u ^ (2 : ℕ)) (2 * t) t := by + simpa using (hasDerivAt_pow 2 t) + have hexp : HasDerivAt (fun u : ℝ => Real.exp (l * u)) (l * Real.exp (l * t)) t := by + simpa [mul_comm] using ((hasDerivAt_id t).const_mul l).exp + convert hpow.mul hexp using 1 + all_goals first | rfl | ring + have hint : + IntervalIntegrable + (fun t : ℝ => ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t))) + volume 0 s := by + refine Continuous.intervalIntegrable ?_ 0 s + fun_prop + rw [intervalIntegral.integral_eq_sub_of_hasDerivAt hderiv hint] + simp + +omit [MeasurableSpace Ω] in +/-- On the positive slice `0 < t ≤ L`, the event +`{t ≤ max(min(X, L), 0)}` agrees exactly with `{t ≤ X}`. -/ +theorem upperTruncation_posPart_tailSet_eq + {X : Ω → ℝ} {t L : ℝ} + (ht : 0 < t) (htL : t ≤ L) : + {ω | t ≤ max (upperTruncation X L ω) 0} = {ω | t ≤ X ω} := by + ext ω + constructor + · intro hω + change t ≤ max (upperTruncation X L ω) 0 at hω + have htrunc_pos : 0 < upperTruncation X L ω := by + by_contra hnonpos + have hmaxeq : max (upperTruncation X L ω) 0 = 0 := max_eq_right (le_of_not_gt hnonpos) + rw [hmaxeq] at hω + exact not_le_of_gt ht hω + have hmaxeq : max (upperTruncation X L ω) 0 = upperTruncation X L ω := max_eq_left htrunc_pos.le + rw [hmaxeq] at hω + exact hω.trans (upperTruncation_le_self X L ω) + · intro hω + change t ≤ max (upperTruncation X L ω) 0 + have htrunc : t ≤ upperTruncation X L ω := by + simpa [upperTruncation] using (show t ≤ min (X ω) L from le_min hω htL) + exact htrunc.trans (le_max_left _ _) + +omit [MeasurableSpace Ω] in +theorem upperTruncation_posPart_le + {X : Ω → ℝ} {L : ℝ} {ω : Ω} + (hL : 0 ≤ L) : + max (upperTruncation X L ω) 0 ≤ L := by + exact max_le (upperTruncation_le X L ω) hL + +omit [MeasurableSpace Ω] in +theorem abs_upperTruncation_le_abs_self + {X : Ω → ℝ} {L : ℝ} {ω : Ω} + (hL : 0 ≤ L) : + |upperTruncation X L ω| ≤ |X ω| := by + by_cases hω : X ω ≤ L + · rw [upperTruncation_of_le hω] + · have hω' : L < X ω := lt_of_not_ge hω + rw [upperTruncation_of_lt hω'] + have hX_nonneg : 0 ≤ X ω := le_trans hL hω'.le + simpa [abs_of_nonneg hL, abs_of_nonneg hX_nonneg] using hω'.le + +omit [MeasurableSpace Ω] in +theorem upperTruncation_sq_mul_exp_max_le_abs_sq_add_posPart_sq_mul_exp + {X : Ω → ℝ} {l L : ℝ} {ω : Ω} + (hL : 0 ≤ L) : + upperTruncation X L ω ^ (2 : ℕ) * Real.exp (l * max (upperTruncation X L ω) 0) ≤ + |X ω| ^ (2 : ℕ) + + (max (upperTruncation X L ω) 0) ^ (2 : ℕ) * + Real.exp (l * max (upperTruncation X L ω) 0) := by + by_cases hpos : 0 ≤ upperTruncation X L ω + · have hmax : max (upperTruncation X L ω) 0 = upperTruncation X L ω := max_eq_left hpos + rw [hmax] + exact le_add_of_nonneg_left (by positivity) + · have hneg : upperTruncation X L ω < 0 := lt_of_not_ge hpos + have hmax : max (upperTruncation X L ω) 0 = 0 := max_eq_right hneg.le + have habs : + |upperTruncation X L ω| ≤ |X ω| := abs_upperTruncation_le_abs_self (X := X) (L := L) (ω := ω) hL + have hsq : + upperTruncation X L ω ^ (2 : ℕ) ≤ |X ω| ^ (2 : ℕ) := by + exact sq_le_sq.2 (by simpa using habs) + rw [hmax] + simpa using hsq + +/-- Layer-cake identity for the weighted positive part of the upper truncation +`max(min(X, L), 0)`. This is the natural `Set.Ioc 0 L` version that precedes +the note-facing `[1, L]` estimate. -/ +theorem integral_upperTruncation_posPart_sq_mul_exp_eq_integral_Ioc_tail + [IsFiniteMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) (hl : 0 ≤ l) (hL : 0 ≤ L) : + ∫ ω, + (max (upperTruncation X L ω) 0) ^ (2 : ℕ) * + Real.exp (l * max (upperTruncation X L ω) 0) ∂μ = + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume := by + let Yp : Ω → ℝ := fun ω => max (upperTruncation X L ω) 0 + let g : ℝ → ℝ := fun t => ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) + have hYpm : Measurable Yp := by + exact (upperTruncation_measurable (X := X) (L := L) hXm).max measurable_const + have hYp_nonneg : ∀ ω, 0 ≤ Yp ω := by + intro ω + exact le_max_right _ _ + have hYp_nonneg_ae : 0 ≤ᵐ[μ] Yp := Filter.Eventually.of_forall hYp_nonneg + have hYpae : AEMeasurable Yp μ := hYpm.aemeasurable + have hYp_le : ∀ ω, Yp ω ≤ L := by + intro ω + simpa [Yp] using upperTruncation_posPart_le (X := X) (L := L) (ω := ω) hL + have hweight_nonneg : + 0 ≤ᵐ[μ] fun ω => + Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) := by + refine Filter.Eventually.of_forall ?_ + intro ω + positivity + have hweight_meas : + AEStronglyMeasurable + (fun ω => Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω)) μ := by + exact ((hYpm.pow_const 2).mul ((hYpm.const_mul l).exp)).aemeasurable.aestronglyMeasurable + have hg_nonneg_of_pos : ∀ {t : ℝ}, 0 < t → 0 ≤ g t := by + intro t ht0 + have hpoly : 0 ≤ 2 * t + l * t ^ (2 : ℕ) := by + nlinarith [sq_nonneg t, ht0, hl] + exact mul_nonneg hpoly (Real.exp_pos _).le + have hleft_enn : + ∫⁻ ω, ENNReal.ofReal (Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω)) ∂μ = + ∫⁻ ω, ENNReal.ofReal (∫ t in 0..Yp ω, g t) ∂μ := by + apply lintegral_congr_ae + exact Filter.Eventually.of_forall fun ω => by + simpa [Yp, g] using (congrArg ENNReal.ofReal (integral_sq_exp_weight l (Yp ω))).symm + have hleft : + ∫ ω, Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ∂μ = + ENNReal.toReal (∫⁻ ω, ENNReal.ofReal (∫ t in 0..Yp ω, g t) ∂μ) := by + rw [integral_eq_lintegral_of_nonneg_ae hweight_nonneg hweight_meas, hleft_enn] + have hg_intble : ∀ t > 0, IntervalIntegrable g volume 0 t := by + intro t ht + refine Continuous.intervalIntegrable ?_ 0 t + fun_prop + have hg_nonneg : ∀ᵐ t ∂volume.restrict (Set.Ioi 0), 0 ≤ g t := by + rw [ae_restrict_iff' measurableSet_Ioi] + refine Filter.Eventually.of_forall ?_ + intro t ht + have ht0 : 0 < t := by simpa using ht + have hpoly : 0 ≤ 2 * t + l * t ^ (2 : ℕ) := by + nlinarith [ht0, hl] + exact mul_nonneg hpoly (Real.exp_pos _).le + have hlayer : + ∫⁻ ω, ENNReal.ofReal (∫ t in 0..Yp ω, g t) ∂μ = + ∫⁻ t in Set.Ioi 0, μ {ω | t ≤ Yp ω} * ENNReal.ofReal (g t) ∂volume := by + exact lintegral_comp_eq_lintegral_meas_le_mul μ hYp_nonneg_ae hYpae hg_intble hg_nonneg + have htail_meas_enn : Measurable fun t : ℝ => μ {ω | t ≤ Yp ω} := by + refine Antitone.measurable ?_ + intro s t hst + exact measure_mono fun ω hω => hst.trans hω + have htail_meas : Measurable fun t : ℝ => μ.real {ω | t ≤ Yp ω} := by + simpa [Measure.real] using htail_meas_enn.ennreal_toReal + have hg_meas : Measurable g := by + fun_prop + have htail_real_nonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi 0)] fun t => g t * μ.real {ω | t ≤ Yp ω} := by + refine (ae_restrict_iff' measurableSet_Ioi).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + exact mul_nonneg (hg_nonneg_of_pos ht) (by positivity) + have htail_real_meas : + AEStronglyMeasurable (fun t => g t * μ.real {ω | t ≤ Yp ω}) + (volume.restrict (Set.Ioi 0)) := by + exact (hg_meas.mul htail_meas).aestronglyMeasurable + have hright_Ioi : + ∫ t in Set.Ioi 0, g t * μ.real {ω | t ≤ Yp ω} ∂volume = + ENNReal.toReal (∫⁻ t in Set.Ioi 0, μ {ω | t ≤ Yp ω} * ENNReal.ofReal (g t) ∂volume) := by + have aux := @integral_eq_lintegral_of_nonneg_ae _ _ + ((volume : Measure ℝ).restrict (Set.Ioi 0)) + (fun t => g t * μ.real {ω | t ≤ Yp ω}) htail_real_nonneg htail_real_meas + rw [aux] + congr 1 + apply setLIntegral_congr_fun measurableSet_Ioi + intro t ht + have hmeasure_eq : + ENNReal.ofReal (μ.real {ω | t ≤ Yp ω}) = μ {ω | t ≤ Yp ω} := by + simp [measureReal_def, (measure_lt_top μ {ω | t ≤ Yp ω}).ne] + calc + ENNReal.ofReal (g t * μ.real {ω | t ≤ Yp ω}) = + ENNReal.ofReal (g t) * ENNReal.ofReal (μ.real {ω | t ≤ Yp ω}) := by + rw [ENNReal.ofReal_mul (hg_nonneg_of_pos ht)] + _ = ENNReal.ofReal (g t) * μ {ω | t ≤ Yp ω} := by rw [hmeasure_eq] + _ = μ {ω | t ≤ Yp ω} * ENNReal.ofReal (g t) := by rw [mul_comm] + have hIoi : + ∫ ω, Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ∂μ = + ∫ t in Set.Ioi 0, g t * μ.real {ω | t ≤ Yp ω} ∂volume := by + calc + ∫ ω, Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ∂μ = + ENNReal.toReal (∫⁻ ω, ENNReal.ofReal (∫ t in 0..Yp ω, g t) ∂μ) := hleft + _ = ENNReal.toReal + (∫⁻ t in Set.Ioi 0, μ {ω | t ≤ Yp ω} * ENNReal.ofReal (g t) ∂volume) := by + rw [hlayer] + _ = ∫ t in Set.Ioi 0, g t * μ.real {ω | t ≤ Yp ω} ∂volume := hright_Ioi.symm + have hrestrict : + ∫ t in Set.Ioi 0, g t * μ.real {ω | t ≤ Yp ω} ∂volume = + ∫ t in Set.Ioc 0 L, g t * μ.real {ω | t ≤ Yp ω} ∂volume := by + rw [setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + measurableSet_Ioi Set.Ioc_subset_Ioi_self] + intro t ht + have ht0 : 0 < t := ht.1 + have htL : L < t := by + by_contra hle + exact ht.2 ⟨ht0, le_of_not_gt hle⟩ + have hsubset : {ω | t ≤ Yp ω} ⊆ ∅ := by + intro ω hω + exact False.elim (not_le_of_gt htL (hω.trans (hYp_le ω))) + have hmeas0 : μ {ω | t ≤ Yp ω} = 0 := measure_mono_null hsubset (by simp) + have hzero : μ.real {ω | t ≤ Yp ω} = 0 := by + simp [measureReal_def, hmeas0] + simp [g, hzero] + have hreplace : + ∫ t in Set.Ioc 0 L, g t * μ.real {ω | t ≤ Yp ω} ∂volume = + ∫ t in Set.Ioc 0 L, g t * μ.real {ω | t ≤ X ω} ∂volume := by + apply integral_congr_ae + refine (ae_restrict_iff' measurableSet_Ioc).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + have ht0 : 0 < t := by simpa using ht.1 + have htL : t ≤ L := ht.2 + have htail_eq : μ.real {ω | t ≤ Yp ω} = μ.real {ω | t ≤ X ω} := by + simpa [Yp] using congrArg μ.real (upperTruncation_posPart_tailSet_eq (X := X) ht0 htL) + simpa using congrArg (fun s : ℝ => g t * s) htail_eq + simpa [Yp, g] using hIoi.trans (hrestrict.trans hreplace) + +/-- The weighted positive-part term in the heavy-tail Taylor remainder is +integrable on a finite measure space because `max(min(X, L), 0)` is bounded by +`L`. -/ +theorem integrable_upperTruncation_posPart_sq_mul_exp + [IsFiniteMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) (hl : 0 ≤ l) (hL : 0 ≤ L) : + Integrable + (fun ω => + (max (upperTruncation X L ω) 0) ^ (2 : ℕ) * + Real.exp (l * max (upperTruncation X L ω) 0)) μ := by + let Yp : Ω → ℝ := fun ω => max (upperTruncation X L ω) 0 + have hYpm : Measurable Yp := by + exact (upperTruncation_measurable (X := X) (L := L) hXm).max measurable_const + refine Integrable.mono' + (integrable_const (L ^ (2 : ℕ) * Real.exp (l * L))) + (((hYpm.pow_const 2).mul ((hYpm.const_mul l).exp)).aemeasurable.aestronglyMeasurable) + ?_ + filter_upwards with ω + have hYp_nonneg : 0 ≤ Yp ω := le_max_right _ _ + have hYp_le : Yp ω ≤ L := by + simpa [Yp] using upperTruncation_posPart_le (X := X) (L := L) (ω := ω) hL + have hsq_le : Yp ω ^ (2 : ℕ) ≤ L ^ (2 : ℕ) := by + exact (sq_le_sq₀ hYp_nonneg hL).2 hYp_le + have hexp_le : Real.exp (l * Yp ω) ≤ Real.exp (l * L) := by + apply Real.exp_le_exp.2 + exact mul_le_mul_of_nonneg_left hYp_le hl + have hbound : + Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) ≤ L ^ (2 : ℕ) * Real.exp (l * L) := by + exact mul_le_mul hsq_le hexp_le (by positivity) (by positivity) + have hnonneg : + 0 ≤ Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) := by + positivity + simpa [Yp, Real.norm_of_nonneg hnonneg] using hbound + +/-- The weighted truncation term is controlled by the square moment of `X` plus +the weighted positive-part term, hence by the natural `Set.Ioc 0 L` tail +integral from the layer-cake formula. -/ +theorem integral_upperTruncation_sq_mul_exp_max_le_integral_abs_sq_add_integral_Ioc_tail + [IsFiniteMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) + (hXsq : Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ) + (hl : 0 ≤ l) (hL : 0 ≤ L) : + ∫ ω, + upperTruncation X L ω ^ (2 : ℕ) * + Real.exp (l * max (upperTruncation X L ω) 0) ∂μ ≤ + ∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume := by + let Y : Ω → ℝ := upperTruncation X L + let Yp : Ω → ℝ := fun ω => max (Y ω) 0 + let W : Ω → ℝ := fun ω => Y ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + let Wp : Ω → ℝ := fun ω => Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + have hYm : Measurable Y := upperTruncation_measurable (X := X) (L := L) hXm + have hYpm : Measurable Yp := by + exact hYm.max measurable_const + have hWp_int : Integrable Wp μ := by + simpa [Y, Yp, Wp] using + integrable_upperTruncation_posPart_sq_mul_exp (μ := μ) (X := X) (l := l) (L := L) hXm hl hL + have hsum_int : Integrable (fun ω => |X ω| ^ (2 : ℕ) + Wp ω) μ := + hXsq.add hWp_int + have hW_meas : AEStronglyMeasurable W μ := by + exact ((hYm.pow_const 2).mul ((hYpm.const_mul l).exp)).aemeasurable.aestronglyMeasurable + have hW_int : Integrable W μ := by + refine Integrable.mono' hsum_int hW_meas ?_ + filter_upwards with ω + have hbound : + W ω ≤ |X ω| ^ (2 : ℕ) + Wp ω := by + simpa [Y, Yp, W, Wp] using + upperTruncation_sq_mul_exp_max_le_abs_sq_add_posPart_sq_mul_exp + (X := X) (l := l) (L := L) (ω := ω) hL + have hnonneg : 0 ≤ W ω := by + positivity + simpa [Real.norm_of_nonneg hnonneg] using hbound + have hmono : + ∀ᵐ ω ∂μ, W ω ≤ |X ω| ^ (2 : ℕ) + Wp ω := + Filter.Eventually.of_forall fun ω => by + simpa [Y, Yp, W, Wp] using + upperTruncation_sq_mul_exp_max_le_abs_sq_add_posPart_sq_mul_exp + (X := X) (l := l) (L := L) (ω := ω) hL + calc + ∫ ω, W ω ∂μ ≤ ∫ ω, |X ω| ^ (2 : ℕ) + Wp ω ∂μ := + integral_mono_ae hW_int hsum_int hmono + _ = ∫ ω, |X ω| ^ (2 : ℕ) ∂μ + ∫ ω, Wp ω ∂μ := by + simpa [Pi.add_apply] using integral_add hXsq hWp_int + _ = ∫ ω, |X ω| ^ (2 : ℕ) ∂μ + + ∫ t in Set.Ioc 0 L, + ((2 * t + l * t ^ (2 : ℕ)) * Real.exp (l * t)) * + μ.real {ω | t ≤ X ω} ∂volume := by + rw [integral_upperTruncation_posPart_sq_mul_exp_eq_integral_Ioc_tail + (μ := μ) (X := X) (l := l) (L := L) hXm hl hL] + +/-- The full weighted truncation term is integrable once `|X|²` is integrable, +because it is pointwise dominated by `|X|²` plus the bounded positive-part +weight. -/ +theorem integrable_upperTruncation_sq_mul_exp_max_of_integrable_abs_sq + [IsFiniteMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) + (hXsq : Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ) + (hl : 0 ≤ l) (hL : 0 ≤ L) : + Integrable + (fun ω => + upperTruncation X L ω ^ (2 : ℕ) * + Real.exp (l * max (upperTruncation X L ω) 0)) μ := by + let Y : Ω → ℝ := upperTruncation X L + let Yp : Ω → ℝ := fun ω => max (Y ω) 0 + let W : Ω → ℝ := fun ω => Y ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + let Wp : Ω → ℝ := fun ω => Yp ω ^ (2 : ℕ) * Real.exp (l * Yp ω) + have hYm : Measurable Y := upperTruncation_measurable (X := X) (L := L) hXm + have hYpm : Measurable Yp := by + exact hYm.max measurable_const + have hWp_int : Integrable Wp μ := by + simpa [Y, Yp, Wp] using + integrable_upperTruncation_posPart_sq_mul_exp (μ := μ) (X := X) (l := l) (L := L) hXm hl hL + have hsum_int : Integrable (fun ω => |X ω| ^ (2 : ℕ) + Wp ω) μ := + hXsq.add hWp_int + have hW_meas : AEStronglyMeasurable W μ := by + exact ((hYm.pow_const 2).mul ((hYpm.const_mul l).exp)).aemeasurable.aestronglyMeasurable + refine Integrable.mono' hsum_int hW_meas ?_ + filter_upwards with ω + have hbound : + W ω ≤ |X ω| ^ (2 : ℕ) + Wp ω := by + simpa [Y, Yp, W, Wp] using + upperTruncation_sq_mul_exp_max_le_abs_sq_add_posPart_sq_mul_exp + (X := X) (l := l) (L := L) (ω := ω) hL + have hnonneg : 0 ≤ W ω := by + positivity + simpa [Real.norm_of_nonneg hnonneg] using! hbound + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Truncation.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Truncation.lean new file mode 100644 index 0000000000..e69337ec59 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiConcentration/Truncation.lean @@ -0,0 +1,326 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Integral +public import Mathlib.Analysis.SpecialFunctions.ImproperIntegrals +public import Mathlib.Analysis.Calculus.Taylor +public import Mathlib.Analysis.Complex.ExponentialBounds +public import Mathlib.Analysis.SpecialFunctions.ExpDeriv +public import Mathlib.MeasureTheory.Integral.IntervalIntegral.FundThmCalculus +public import Mathlib.MeasureTheory.Integral.Layercake +public import Mathlib.Probability.Moments.Basic +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz + +/-! # Truncation -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The one-sided bounded truncation `min (X, L)` used in the Chapter 4 +heavy-tail concentration argument. -/ +def upperTruncation (X : Ω → ℝ) (L : ℝ) : Ω → ℝ := + fun ω => min (X ω) L + +omit [MeasurableSpace Ω] in +@[simp] theorem upperTruncation_apply (X : Ω → ℝ) (L : ℝ) (ω : Ω) : + upperTruncation X L ω = min (X ω) L := + rfl + +omit [MeasurableSpace Ω] in +@[simp] theorem upperTruncation_of_le {X : Ω → ℝ} {L : ℝ} {ω : Ω} + (h : X ω ≤ L) : + upperTruncation X L ω = X ω := by + simp [upperTruncation, min_eq_left h] + +omit [MeasurableSpace Ω] in +@[simp] theorem upperTruncation_of_lt {X : Ω → ℝ} {L : ℝ} {ω : Ω} + (h : L < X ω) : + upperTruncation X L ω = L := by + simp [upperTruncation, min_eq_right (le_of_lt h)] + +omit [MeasurableSpace Ω] in +theorem upperTruncation_le_self (X : Ω → ℝ) (L : ℝ) (ω : Ω) : + upperTruncation X L ω ≤ X ω := by + simp [upperTruncation] + +omit [MeasurableSpace Ω] in +theorem upperTruncation_le (X : Ω → ℝ) (L : ℝ) (ω : Ω) : + upperTruncation X L ω ≤ L := by + simp [upperTruncation] + +theorem upperTruncation_measurable {X : Ω → ℝ} {L : ℝ} + (hX : Measurable X) : + Measurable (upperTruncation X L) := by + exact hX.min measurable_const + +theorem iIndepFun_upperTruncation {X : ι → Ω → ℝ} {L : ℝ} + (h_indep : iIndepFun X μ) : + iIndepFun (fun i ω => upperTruncation (X i) L ω) μ := by + let g : ι → ℝ → ℝ := fun _ x => min x L + have hg : ∀ i, Measurable (g i) := by + intro i + simpa [g] using (measurable_id.min measurable_const) + exact h_indep.comp g hg + +omit [MeasurableSpace Ω] in +/-- If a finite sum exceeds `a`, then either the corresponding upper-truncated +sum still exceeds `a`, or one of the summands exceeded the truncation level. -/ +theorem upperTailEvent_finset_sum_subset_upperTailEvent_finset_sum_upperTruncation_union + (s : Finset ι) {X : ι → Ω → ℝ} {L a : ℝ} : + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a ⊆ + upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a ∪ + ⋃ i ∈ s, upperTailEvent (X i) L := by + intro ω hω + by_cases htail : ∃ i ∈ s, L < X i ω + · rcases htail with ⟨i, hi, hXi⟩ + right + refine Set.mem_iUnion.2 ?_ + exact ⟨i, Set.mem_iUnion.2 ⟨hi, hXi⟩⟩ + · left + have hEq : + (∑ i ∈ s, upperTruncation (X i) L ω) = ∑ i ∈ s, X i ω := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hle : X i ω ≤ L := le_of_not_gt (fun hXi => htail ⟨i, hi, hXi⟩) + simp [upperTruncation, min_eq_left hle] + change a < ∑ i ∈ s, upperTruncation (X i) L ω + rw [hEq] + exact hω + +/-- Measure-theoretic form of the basic truncation split used in the Chapter 4 +heavy-tail concentration proof. -/ +theorem measureReal_upperTailEvent_finset_sum_le_upperTruncation_add + [IsFiniteMeasure μ] + (s : Finset ι) {X : ι → Ω → ℝ} {L a : ℝ} : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + ∑ i ∈ s, μ.real (upperTailEvent (X i) L) := by + refine le_trans + (measureReal_mono + (upperTailEvent_finset_sum_subset_upperTailEvent_finset_sum_upperTruncation_union + (s := s) (X := X) (L := L) (a := a))) ?_ + calc + μ.real + (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a ∪ + ⋃ i ∈ s, upperTailEvent (X i) L) + ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + μ.real (⋃ i ∈ s, upperTailEvent (X i) L) := by + exact measureReal_union_le _ _ + _ ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + ∑ i ∈ s, μ.real (upperTailEvent (X i) L) := by + gcongr + exact measureReal_biUnion_finset_le s (fun i => upperTailEvent (X i) L) + +/-- If each summand satisfies the note-facing upper-tail bound with unit scale, +the large-value part of the truncation split is bounded by +`card(s) / Ψ(L)`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_upperTruncation_add_card_mul_of_isBigOWith + [IsFiniteMeasure μ] + {Ψ : ℝ → ℝ} {X : ι → Ω → ℝ} {s : Finset ι} {L a : ℝ} + (hX : ∀ i ∈ s, IsBigOWith μ Ψ (X i) 1) + (hL : 1 ≤ L) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + calc + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) + ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + ∑ i ∈ s, μ.real (upperTailEvent (X i) L) := + measureReal_upperTailEvent_finset_sum_le_upperTruncation_add + (μ := μ) (s := s) (X := X) (L := L) (a := a) + _ ≤ + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + ∑ i ∈ s, (Ψ L)⁻¹ := by + have hsum : + ∑ i ∈ s, μ.real (upperTailEvent (X i) L) ≤ ∑ i ∈ s, (Ψ L)⁻¹ := by + exact Finset.sum_le_sum fun i hi => by + simpa using hX i hi hL + simpa using add_le_add_left hsum + (μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a)) + _ = + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, upperTruncation (X i) L ω) a) + + (s.card : ℝ) * (Ψ L)⁻¹ := by + rw [Finset.sum_const, nsmul_eq_mul] + +/-- A measurable random variable bounded above by `B` has finite exponential +moment `E[e^{λY}]` for every `λ ≥ 0` on a finite measure space. -/ +theorem integrable_exp_mul_of_le_const [IsFiniteMeasure μ] + {Y : Ω → ℝ} {l B : ℝ} + (hYm : Measurable Y) (hl : 0 ≤ l) (hYB : ∀ ω, Y ω ≤ B) : + Integrable (fun ω => Real.exp (l * Y ω)) μ := by + refine Integrable.mono' (integrable_const (Real.exp (l * B))) + ((hYm.const_mul l).exp.aemeasurable.aestronglyMeasurable) ?_ + filter_upwards with ω + have hmul : l * Y ω ≤ l * B := mul_le_mul_of_nonneg_left (hYB ω) hl + have hexp : Real.exp (l * Y ω) ≤ Real.exp (l * B) := Real.exp_le_exp.2 hmul + simpa [Real.norm_eq_abs, abs_of_nonneg (Real.exp_pos _).le] using hexp + +/-- The exponential moment of an upper-truncated variable is always defined for +nonnegative `λ`. -/ +theorem integrable_exp_mul_upperTruncation [IsFiniteMeasure μ] + {X : Ω → ℝ} {l L : ℝ} + (hXm : Measurable X) (hl : 0 ≤ l) : + Integrable (fun ω => Real.exp (l * upperTruncation X L ω)) μ := by + refine integrable_exp_mul_of_le_const + (μ := μ) + (Y := upperTruncation X L) + (l := l) + (B := L) + (upperTruncation_measurable hXm) + hl + ?_ + intro ω + exact upperTruncation_le X L ω + +private theorem exp_sub_one_sub_id_le_half_sq_mul_exp_max (z : ℝ) : + Real.exp z - (1 + z) ≤ (z ^ (2 : ℕ) / 2) * Real.exp (max z 0) := by + by_cases hz : 0 ≤ z + · rcases eq_or_lt_of_le hz with rfl | hzpos + · norm_num + have hu : UniqueDiffOn ℝ (Set.Icc 0 z) := uniqueDiffOn_Icc hzpos + obtain ⟨ξ, hξ, hξeq⟩ := + taylor_mean_remainder_lagrange_iteratedDeriv + (f := Real.exp) (x₀ := 0) (x := z) (n := 1) hzpos.ne + (Real.contDiff_exp.contDiffOn) + rw [Set.uIoo_of_le hz] at hξ + rw [Set.uIcc_of_le hz] at hξeq + have hderiv0 : derivWithin Real.exp (Set.Icc 0 z) 0 = 1 := by + simpa using ((Real.hasDerivAt_exp 0).hasDerivWithinAt).derivWithin + (hu.uniqueDiffWithinAt (by exact ⟨le_rfl, hzpos.le⟩)) + have htaylor : taylorWithinEval Real.exp 1 (Set.Icc 0 z) 0 z = 1 + z := by + simp [taylor_within_apply, hderiv0] + have hiter : iteratedDeriv 2 Real.exp ξ = Real.exp ξ := by + rw [iteratedDeriv_eq_iterate] + exact congrFun (Real.iter_deriv_exp 2) ξ + have hformula : Real.exp z - (1 + z) = Real.exp ξ * z ^ (2 : ℕ) / 2 := by + rw [← htaylor, hξeq, hiter] + norm_num [Nat.factorial] + have hξexp : Real.exp ξ ≤ Real.exp z := Real.exp_le_exp.2 hξ.2.le + have hzsq_nonneg : 0 ≤ z ^ (2 : ℕ) / 2 := by positivity + calc + Real.exp z - (1 + z) = Real.exp ξ * z ^ (2 : ℕ) / 2 := hformula + _ = (z ^ (2 : ℕ) / 2) * Real.exp ξ := by ring + _ ≤ (z ^ (2 : ℕ) / 2) * Real.exp z := mul_le_mul_of_nonneg_left hξexp hzsq_nonneg + _ = (z ^ (2 : ℕ) / 2) * Real.exp (max z 0) := by simp [max_eq_left hz] + · have hzneg : z < 0 := lt_of_not_ge hz + let u : ℝ := -z + have hupos : 0 < u := by simpa [u] using neg_pos.mpr hzneg + have hu : UniqueDiffOn ℝ (Set.Icc 0 u) := uniqueDiffOn_Icc hupos + obtain ⟨ξ, hξ, hξeq⟩ := + taylor_mean_remainder_lagrange_iteratedDeriv + (f := fun s : ℝ => Real.exp (-s)) (x₀ := 0) (x := u) (n := 1) hupos.ne + ((Real.contDiff_exp.comp (by fun_prop)).contDiffOn : + ContDiffOn ℝ (1 + 1) (fun s : ℝ => Real.exp (-s)) (Set.uIcc 0 u)) + rw [Set.uIoo_of_le hupos.le] at hξ + rw [Set.uIcc_of_le hupos.le] at hξeq + have hderiv0 : derivWithin (fun s : ℝ => Real.exp (-s)) (Set.Icc 0 u) 0 = -1 := by + have hderivAt : HasDerivAt (fun s : ℝ => Real.exp (-s)) (-1) 0 := by + simpa using ((hasDerivAt_id 0).neg.exp) + exact hderivAt.hasDerivWithinAt.derivWithin + (hu.uniqueDiffWithinAt (by exact ⟨le_rfl, hupos.le⟩)) + have htaylor : + taylorWithinEval (fun s : ℝ => Real.exp (-s)) 1 (Set.Icc 0 u) 0 u = 1 - u := by + simp [taylor_within_apply, hderiv0] + ring + have hiter : iteratedDeriv 2 (fun s : ℝ => Real.exp (-s)) ξ = Real.exp (-ξ) := by + simpa [pow_two] using congrFun (iteratedDeriv_exp_const_mul (n := 2) (-1)) ξ + have hξle : Real.exp (-ξ) ≤ 1 := by + exact Real.exp_le_one_iff.mpr (by linarith [hξ.1]) + have hformula0 : Real.exp (-u) - (1 - u) = Real.exp (-ξ) * u ^ (2 : ℕ) / 2 := by + rw [← htaylor, hξeq, hiter] + norm_num [Nat.factorial] + have hformula : Real.exp (-u) - (1 + -u) = Real.exp (-ξ) * u ^ (2 : ℕ) / 2 := by + simpa [sub_eq_add_neg] using hformula0 + have husq_nonneg : 0 ≤ u ^ (2 : ℕ) / 2 := by positivity + have haux : Real.exp z - (1 + z) ≤ u ^ (2 : ℕ) / 2 := by + calc + Real.exp z - (1 + z) = Real.exp (-u) - (1 + -u) := by simp [u] + _ = Real.exp (-ξ) * u ^ (2 : ℕ) / 2 := hformula + _ = (u ^ (2 : ℕ) / 2) * Real.exp (-ξ) := by ring + _ ≤ (u ^ (2 : ℕ) / 2) * 1 := mul_le_mul_of_nonneg_left hξle husq_nonneg + _ = u ^ (2 : ℕ) / 2 := by ring + have hmax : max z 0 = 0 := max_eq_right (le_of_lt hzneg) + have hzsq : z ^ (2 : ℕ) = u ^ (2 : ℕ) := by + simp [u, pow_two] + rw [hmax, Real.exp_zero, hzsq] + simpa using haux + +/-- A scaled Taylor-remainder bound for `exp (λx)` with a global exponential +weight on the positive part of `x`. -/ +theorem exp_mul_le_one_add_mul_add_half_mul_sq_mul_exp_max_zero_of_nonneg + {l x : ℝ} (hl : 0 ≤ l) : + Real.exp (l * x) ≤ + 1 + l * x + (l ^ (2 : ℕ) / 2) * x ^ (2 : ℕ) * Real.exp (l * max x 0) := by + have hbase := exp_sub_one_sub_id_le_half_sq_mul_exp_max (z := l * x) + have hmax : max (l * x) 0 = l * max x 0 := by + symm + simpa [mul_comm] using (mul_max_of_nonneg x 0 hl) + have hstep : + Real.exp (l * x) ≤ + 1 + l * x + ((l * x) ^ (2 : ℕ) / 2) * Real.exp (l * max x 0) := by + have hbase' : + Real.exp (l * x) - (1 + l * x) ≤ + ((l * x) ^ (2 : ℕ) / 2) * Real.exp (l * max x 0) := by + simpa [hmax] using hbase + linarith + calc + Real.exp (l * x) + ≤ 1 + l * x + ((l * x) ^ (2 : ℕ) / 2) * Real.exp (l * max x 0) := hstep + _ = 1 + l * x + (l ^ (2 : ℕ) / 2) * x ^ (2 : ℕ) * Real.exp (l * max x 0) := by + ring + +/-- The upper truncation `min (X, L)` is integrable whenever `X` is integrable +on a finite measure space. -/ +theorem integrable_upperTruncation_of_integrable [IsFiniteMeasure μ] + {X : Ω → ℝ} {L : ℝ} + (hXm : Measurable X) (hXint : Integrable X μ) : + Integrable (upperTruncation X L) μ := by + refine Integrable.mono' + ((hXint.norm).add (integrable_const |L|)) + ((upperTruncation_measurable (X := X) (L := L) hXm).aemeasurable.aestronglyMeasurable) + ?_ + filter_upwards with ω + by_cases hω : X ω ≤ L + · rw [upperTruncation_of_le hω] + exact le_add_of_nonneg_right (abs_nonneg L) + · have hω' : L < X ω := lt_of_not_ge hω + rw [upperTruncation_of_lt hω'] + exact le_add_of_nonneg_left (abs_nonneg (X ω)) + +/-- If `X` is centered, then its upper truncation `min (X, L)` has +nonpositive expectation. -/ +theorem integral_upperTruncation_le_zero_of_integral_eq_zero + [IsFiniteMeasure μ] + {X : Ω → ℝ} {L : ℝ} + (hXm : Measurable X) (hXint : Integrable X μ) + (hXmean : ∫ ω, X ω ∂μ = 0) : + ∫ ω, upperTruncation X L ω ∂μ ≤ 0 := by + have hYint := + integrable_upperTruncation_of_integrable (μ := μ) (X := X) (L := L) hXm hXint + exact (integral_mono_ae hYint hXint + (Filter.Eventually.of_forall fun ω => upperTruncation_le_self X L ω)).trans_eq hXmean + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma.lean new file mode 100644 index 0000000000..8a9c5e04d7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.TailAndLogControl +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Parameters +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Calculus + +/-! # Psi Sigma -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Calculus.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Calculus.lean new file mode 100644 index 0000000000..e8a094d297 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Calculus.lean @@ -0,0 +1,265 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Endpoint + +/-! # Calculus -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Subgaussian upper tails at scale `σ` imply log-normal upper tails for +`exp(X) - 1`, with the explicit witness `exp(σ) - 1`. This is the forward +bridge from the Chapter 4 log-normal remark in the `t ≥ 1` weak-tail +convention used by the project. -/ +theorem isBigOWith_psiSigma_exp_sub_one_of_isBigOWith_gammaTwo + {X : Ω → ℝ} {σ : ℝ} + (hσ : 1 ≤ σ) + (hX : IsBigOWith μ (gammaSigma 2) X σ) : + IsBigOWith μ (psiSigma σ) (fun ω => Real.exp (X ω) - 1) (Real.exp σ - 1) := by + rw [isBigOWith_psiSigma_iff] + rw [isBigOWith_gammaSigma_iff] at hX + intro t ht + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + let A : ℝ := Real.exp σ - 1 + let u : ℝ := Real.log (1 + A * t) / σ + have hA_ge_sigma : σ ≤ A := by + dsimp [A] + nlinarith [Real.add_one_le_exp σ] + have hA_pos : 0 < A := lt_of_lt_of_le hσ_pos hA_ge_sigma + have hu_eq : σ * u = Real.log (1 + A * t) := by + dsimp [u] + field_simp [hσ_pos.ne'] + have hu_one : 1 ≤ u := by + refine (le_div_iff₀ hσ_pos).2 ?_ + have hA_mul : A ≤ A * t := by + simpa using mul_le_mul_of_nonneg_left ht hA_pos.le + have harg_ge : Real.exp σ ≤ 1 + A * t := by + calc + Real.exp σ = 1 + A := by + dsimp [A] + ring + _ ≤ 1 + A * t := by + linarith + have hlog_ge : σ ≤ Real.log (1 + A * t) := by + calc + σ = Real.log (Real.exp σ) := by rw [Real.log_exp] + _ ≤ Real.log (1 + A * t) := by + exact Real.log_le_log (Real.exp_pos σ) harg_ge + simpa [one_mul] using hlog_ge + have harg_pos : 0 < 1 + A * t := by positivity + have hset : + upperTailEvent (fun ω => Real.exp (X ω) - 1) (A * t) = + upperTailEvent X (σ * u) := by + ext ω + rw [hu_eq] + constructor + · intro hω + change A * t < Real.exp (X ω) - 1 at hω + change Real.log (1 + A * t) < X ω + have hlt : 1 + A * t < Real.exp (X ω) := by + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + add_lt_add_right hω 1 + exact (Real.log_lt_iff_lt_exp harg_pos).2 hlt + · intro hω + change Real.log (1 + A * t) < X ω at hω + change A * t < Real.exp (X ω) - 1 + have hlt : 1 + A * t < Real.exp (X ω) := by + exact (Real.log_lt_iff_lt_exp harg_pos).1 hω + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + sub_lt_sub_right hlt 1 + have harg_small_pos : 0 < 1 + σ * t := by positivity + have harg_small_one : 1 ≤ 1 + σ * t := by + have hσt_nonneg : 0 ≤ σ * t := mul_nonneg (le_trans zero_le_one hσ) (le_trans zero_le_one ht) + linarith + have harg_big_one : 1 ≤ 1 + A * t := by + have hAt_nonneg : 0 ≤ A * t := mul_nonneg hA_pos.le (le_trans zero_le_one ht) + linarith + have harg_le : 1 + σ * t ≤ 1 + A * t := by + have hmul : σ * t ≤ A * t := by + exact mul_le_mul_of_nonneg_right hA_ge_sigma (le_trans zero_le_one ht) + linarith + have hlog_le : Real.log (1 + σ * t) ≤ Real.log (1 + A * t) := by + exact Real.log_le_log harg_small_pos harg_le + have hlog_small_nonneg : 0 ≤ Real.log (1 + σ * t) := Real.log_nonneg harg_small_one + have hlog_big_nonneg : 0 ≤ Real.log (1 + A * t) := Real.log_nonneg harg_big_one + have hlog_sq_le : + (Real.log (1 + σ * t)) ^ (2 : ℕ) ≤ (Real.log (1 + A * t)) ^ (2 : ℕ) := by + nlinarith + have hu_sq : + u ^ (2 : ℕ) = (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + A * t)) ^ (2 : ℕ) := by + calc + u ^ (2 : ℕ) = (Real.log (1 + A * t) / σ) ^ (2 : ℕ) := by rfl + _ = (Real.log (1 + A * t)) ^ (2 : ℕ) / σ ^ (2 : ℕ) := by rw [div_pow] + _ = (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + A * t)) ^ (2 : ℕ) := by + rw [div_eq_mul_inv, mul_comm] + have htarget_le : + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) ≤ u ^ (2 : ℕ) := by + rw [hu_sq] + exact mul_le_mul_of_nonneg_left hlog_sq_le (inv_nonneg.mpr (sq_nonneg σ)) + have hX_u : + μ.real (upperTailEvent X (σ * u)) ≤ Real.exp (-(u ^ (2 : ℕ))) := by + simpa [Real.rpow_natCast] using hX hu_one + have hbound : + μ.real (upperTailEvent (fun ω => Real.exp (X ω) - 1) (A * t)) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + calc + μ.real (upperTailEvent (fun ω => Real.exp (X ω) - 1) (A * t)) + = μ.real (upperTailEvent X (σ * u)) := by rw [hset] + _ ≤ Real.exp (-(u ^ (2 : ℕ))) := hX_u + _ ≤ Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + exact (Real.exp_le_exp).2 (neg_le_neg htarget_le) + simpa [A] using hbound + +/-- Log-normal upper tails for `exp(X) - 1` at scale `σ` imply the +subgaussian upper-tail relation for `X` at the same scale. This is the exact +reverse implication from the Chapter 4 log-normal remark. -/ +theorem isBigOWith_gammaTwo_of_isBigOWith_psiSigma_exp_sub_one + {X : Ω → ℝ} {σ : ℝ} + (hσ : 1 ≤ σ) + (hX : IsBigOWith μ (psiSigma σ) (fun ω => Real.exp (X ω) - 1) σ) : + IsBigOWith μ (gammaSigma 2) X σ := by + rw [isBigOWith_gammaSigma_iff] + rw [isBigOWith_psiSigma_iff] at hX + intro t ht + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + let u : ℝ := (Real.exp (σ * t) - 1) / σ + have hu_eq : σ * u = Real.exp (σ * t) - 1 := by + dsimp [u] + field_simp [hσ_pos.ne'] + have hu_one : 1 ≤ u := by + refine (le_div_iff₀ hσ_pos).2 ?_ + have hσ_le : σ ≤ σ * t := by + nlinarith + have hst_le : σ * t ≤ Real.exp (σ * t) - 1 := by + nlinarith [Real.add_one_le_exp (σ * t)] + simpa [one_mul] using hσ_le.trans hst_le + have hset : + upperTailEvent X (σ * t) = + upperTailEvent (fun ω => Real.exp (X ω) - 1) (σ * u) := by + ext ω + rw [hu_eq] + constructor + · intro hω + change σ * t < X ω at hω + change Real.exp (σ * t) - 1 < Real.exp (X ω) - 1 + have hlt : Real.exp (σ * t) < Real.exp (X ω) := by + exact (Real.exp_lt_exp).2 hω + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + sub_lt_sub_right hlt 1 + · intro hω + change Real.exp (σ * t) - 1 < Real.exp (X ω) - 1 at hω + change σ * t < X ω + have hlt : Real.exp (σ * t) < Real.exp (X ω) := by + simpa [sub_eq_add_neg, add_comm, add_left_comm, add_assoc] using + add_lt_add_right hω 1 + exact (Real.exp_lt_exp).1 hlt + have hlog_u : Real.log (1 + σ * u) = σ * t := by + rw [hu_eq] + have htmp : 1 + (Real.exp (σ * t) - 1) = Real.exp (σ * t) := by ring + rw [htmp, Real.log_exp] + have hexponent : + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * u)) ^ (2 : ℕ) = t ^ (2 : ℕ) := by + rw [hlog_u] + calc + (σ ^ (2 : ℕ))⁻¹ * (σ * t) ^ (2 : ℕ) + = (σ ^ (2 : ℕ))⁻¹ * (σ ^ (2 : ℕ) * t ^ (2 : ℕ)) := by + rw [mul_pow] + _ = t ^ (2 : ℕ) := by + field_simp [pow_two, hσ_pos.ne'] + have hbound : + μ.real (upperTailEvent X (σ * t)) ≤ Real.exp (-(t ^ (2 : ℕ))) := by + calc + μ.real (upperTailEvent X (σ * t)) + = μ.real (upperTailEvent (fun ω => Real.exp (X ω) - 1) (σ * u)) := by + rw [hset] + _ ≤ Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * u)) ^ (2 : ℕ))) := hX hu_one + _ = Real.exp (-(t ^ (2 : ℕ))) := by rw [hexponent] + simpa [Real.rpow_natCast] using hbound + +/-- Constant-scale finite-family log-normal triangle inequality. -/ +theorem isBigO_finset_sum_of_isBigO_psiSigma_const + (s : Finset ι) {X : ι → Ω → ℝ} {A σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (hA : 0 < A) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) A) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * ((s.card : ℝ) * A)) := by + simpa [Finset.sum_const, nsmul_eq_mul, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finset_sum_of_isBigO_psiSigma + (μ := μ) (s := s) (X := X) (a := fun _ => A) (σ := σ) + hσ hs (fun _ _ => hA) hX hXm + +/-- Constant-scale average log-normal triangle inequality. -/ +theorem isBigO_finsetAverage_of_isBigO_psiSigma_const + (s : Finset ι) {X : ι → Ω → ℝ} {A σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (hA : 0 < A) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) A) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * A) := by + have hcard_ne : (s.card : ℝ) ≠ 0 := by + exact_mod_cast hs.card_ne_zero + simpa [Finset.sum_const, nsmul_eq_mul, hcard_ne, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finsetAverage_of_isBigO_psiSigma + (μ := μ) (s := s) (X := X) (a := fun _ => A) (σ := σ) + hσ hs (fun _ _ => hA) hX hXm + +/-- Unit-scale finite-family log-normal triangle inequality. -/ +theorem isBigO_finset_sum_of_isBigO_psiSigma_unit + (s : Finset ι) {X : ι → Ω → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) 1) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * (s.card : ℝ)) := by + simpa using + isBigO_finset_sum_of_isBigO_psiSigma_const + (μ := μ) (s := s) (X := X) (A := 1) (σ := σ) + hσ hs zero_lt_one hX hXm + +/-- Unit-scale average log-normal triangle inequality. -/ +theorem isBigO_finsetAverage_of_isBigO_psiSigma_unit + (s : Finset ι) {X : ι → Ω → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) 1) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ) := by + simpa using + isBigO_finsetAverage_of_isBigO_psiSigma_const + (μ := μ) (s := s) (X := X) (A := 1) (σ := σ) + hσ hs zero_lt_one hX hXm + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Endpoint.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Endpoint.lean new file mode 100644 index 0000000000..a5f2dd14d8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Endpoint.lean @@ -0,0 +1,586 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.Parameters + +/-! # Endpoint -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The simple logarithmic-control constant satisfies the generic raw +truncation-Chernoff log constraint for `Ψ_σ` on `[1, L]`. -/ +lemma psiSigma_log_constraint_of_le {σ l L t : ℝ} + (hl : 0 ≤ l) (ht : t ∈ Set.Icc 1 L) : + l * t ≤ + Real.log (psiSigma σ t) - 4 * Real.log t + + Real.log (psiSigmaLogControlConst l L) := by + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht.1 + have hlogψ_nonneg : 0 ≤ Real.log (psiSigma σ t) := + Real.log_nonneg one_le_psiSigma + have hltL : l * t ≤ l * L := mul_le_mul_of_nonneg_left ht.2 hl + have hlogt_le_logL : Real.log t ≤ Real.log L := + Real.log_le_log ht_pos ht.2 + have hfourdiff : 0 ≤ 4 * Real.log L - 4 * Real.log t := by + nlinarith + rw [psiSigmaLogControlConst, Real.log_exp] + nlinarith + +/-- Raw truncation-Chernoff concentration for independent centered +`O_{Ψ_σ}(1)` summands, with the analytic `Ψ_σ` tail-integral and logarithmic +constraint hypotheses left explicit. + +This is the specialization point for the log-normal independent-sum endpoint. +The remaining endpoint proof will choose `l`, `L`, `M`, and `CΨ` as functions +of `σ`, the family size, and the tail parameter, then optimize this raw bound +to obtain the clean `sqrt(card)` weak-`Ψ_σ` scale. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ a l L CΨ M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume ≤ + ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) 1) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (psiSigma σ t) - 4 * Real.log t + Real.log M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + (s.card : ℝ) * (psiSigma σ L)⁻¹ := by + exact + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (Ψ := psiSigma σ) (X := X) (s := s) (a := a) (l := l) (L := L) + (CΨ := CΨ) (M := M) + h_indep h_meas h_int h_mean + (admissiblePsi_psiSigma (le_trans zero_le_one hσ)) + hCΨ_nonneg hCΨ hX hl hl1 hL hM hconstraint + +/-- Scaled raw truncation-Chernoff concentration for independent centered +`O_{Ψ_σ}(K)` summands. The conclusion is written at threshold `K * a`, so the +right-hand side is exactly the unit-scale raw bound. -/ +theorem measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K a l L CΨ M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume ≤ + ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (psiSigma σ t) - 4 * Real.log t + Real.log M) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ + Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + (s.card : ℝ) * (psiSigma σ L)⁻¹ := by + let Y : ι → Ω → ℝ := fun i ω => K⁻¹ * X i ω + have h_indep_Y : iIndepFun Y μ := by + simpa [Y, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => K⁻¹ * x) + (fun _ => measurable_const.mul measurable_id) + have h_meas_Y : ∀ i, Measurable (Y i) := by + intro i + simpa [Y, mul_comm] using (h_meas i).const_mul K⁻¹ + have h_int_Y : ∀ i ∈ s, Integrable (Y i) μ := by + intro i hi + simpa [Y] using (h_int i hi).const_mul K⁻¹ + have h_mean_Y : ∀ i ∈ s, ∫ ω, Y i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Y i ω ∂μ = K⁻¹ * ∫ ω, X i ω ∂μ := by + simpa [Y] using integral_const_mul K⁻¹ (X i) + _ = 0 := by rw [h_mean i hi]; ring + have hX_Y : ∀ i ∈ s, IsBigO μ (psiSigma σ) (Y i) 1 := by + intro i hi + have hscaled := + IsBigO.const_mul (μ := μ) (Ψ := psiSigma σ) (X := X i) (A := K) (c := K⁻¹) + (inv_nonneg.mpr hK.le) (hX i hi) + have hscale : K⁻¹ * K = (1 : ℝ) := by + field_simp [hK.ne'] + simpa [Y, hscale] using hscaled + have htail_Y := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (X := Y) (s := s) (σ := σ) (a := a) (l := l) (L := L) + (CΨ := CΨ) (M := M) + h_indep_Y h_meas_Y h_int_Y h_mean_Y hσ hCΨ_nonneg hCΨ hX_Y hl hl1 hL hM + hconstraint + have hk : K * K⁻¹ = (1 : ℝ) := by + field_simp [hK.ne'] + have hsum_eq : + (fun ω => K * ∑ i ∈ s, Y i ω) = fun ω => ∑ i ∈ s, X i ω := by + funext ω + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i hi + dsimp [Y] + rw [← mul_assoc, hk, one_mul] + have hset : + upperTailEvent (fun ω => ∑ i ∈ s, Y i ω) a = + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a) := by + ext ω + constructor + · intro hω + change a < ∑ i ∈ s, Y i ω at hω + have hmul : K * a < K * ∑ i ∈ s, Y i ω := + mul_lt_mul_of_pos_left hω hK + have hpoint : + K * ∑ i ∈ s, Y i ω = ∑ i ∈ s, X i ω := + congrFun hsum_eq ω + simpa [upperTailEvent, hpoint] using hmul + · intro hω + change K * a < ∑ i ∈ s, X i ω at hω + have hmul : K * a < K * ∑ i ∈ s, Y i ω := by + have hpoint : + K * ∑ i ∈ s, Y i ω = ∑ i ∈ s, X i ω := + congrFun hsum_eq ω + simpa [hpoint] using hω + exact lt_of_mul_lt_mul_left hmul hK.le + simpa [hset] using htail_Y + +/-- Symmetric raw truncation-Chernoff concentration for independent centered +`O_{Ψ_σ}(K)` summands. This is just the scaled upper-tail estimate applied to +`X` and `-X`, before the final log-normal absorption step. -/ +theorem measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K a l L CΨ M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume ≤ + ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (psiSigma σ t) - 4 * Real.log t + Real.log M) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ + 2 * Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := by + let B : ℝ := Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + let U : ℝ := (s.card : ℝ) * (psiSigma σ L)⁻¹ + have hsum : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a) ⊆ + upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (K * a) := by + intro ω hω + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by + simpa [absTailEvent, upperTailEvent] using hω) + have hupper : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ B + U := by + simpa [B, U] using + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := a) (l := l) + (L := L) (CΨ := CΨ) (M := M) + h_indep h_meas h_int h_mean hσ hK hCΨ_nonneg hCΨ hX + hl hl1 hL hM hconstraint + let Xneg : ι → Ω → ℝ := fun i ω => -X i ω + have h_indep_neg : iIndepFun Xneg μ := by + simpa [Xneg, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => -x) (fun _ => measurable_neg) + have h_meas_neg : ∀ i, Measurable (Xneg i) := by + intro i + simpa [Xneg] using h_meas i + have h_int_neg : ∀ i ∈ s, Integrable (Xneg i) μ := by + intro i hi + dsimp [Xneg] + exact (h_int i hi).neg + have h_mean_neg : ∀ i ∈ s, ∫ ω, Xneg i ω ∂μ = 0 := by + intro i hi + calc + ∫ ω, Xneg i ω ∂μ = -∫ ω, X i ω ∂μ := by + simpa [Xneg] using integral_neg (X i) + _ = 0 := by rw [h_mean i hi, neg_zero] + have hX_neg : ∀ i ∈ s, IsBigO μ (psiSigma σ) (Xneg i) K := by + intro i hi + simpa [Xneg] using (hX i hi).neg + have hupper_neg : + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (K * a)) ≤ B + U := by + have hraw := + measureReal_upperTailEvent_finset_sum_le_exp_card_mul_add_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (X := Xneg) (s := s) (σ := σ) (K := K) (a := a) (l := l) + (L := L) (CΨ := CΨ) (M := M) + h_indep_neg h_meas_neg h_int_neg h_mean_neg hσ hK hCΨ_nonneg hCΨ hX_neg + hl hl1 hL hM hconstraint + simpa [Xneg, B, U, Finset.sum_neg_distrib] using hraw + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) + ≤ μ.real + (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a) ∪ + upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (K * a)) := by + exact measureReal_mono hsum + _ ≤ μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) + + μ.real (upperTailEvent (fun ω => -∑ i ∈ s, X i ω) (K * a)) := by + exact measureReal_union_le _ _ + _ ≤ (B + U) + (B + U) := by + exact add_le_add hupper hupper_neg + _ = 2 * B + 2 * U := by ring + _ = 2 * Real.exp (-l * a + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + M + CΨ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := by + simp [B, U] + +/-- Symmetric raw `Ψ_σ` concentration with the scalar tail-integral input +discharged, but with an arbitrary logarithmic-control constant `M`. This is +the preferred backend for the final optimized log-normal endpoint: the +deterministic optimizer can choose `M` sharply instead of using the simple +fallback `exp(l L + 4 log L)`. -/ +theorem measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_tail_const_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K a l L M : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) (hM : 1 ≤ M) + (hconstraint : ∀ i ∈ s, ∀ ⦃t : ℝ⦄, t ∈ Set.Icc 1 L → + l * t ≤ Real.log (psiSigma σ t) - 4 * Real.log t + Real.log M) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ + 2 * Real.exp + (-l * a + + (s.card : ℝ) * + (l ^ (2 : ℕ) * (3 + M + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := by + exact + measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := a) (l := l) (L := L) + (CΨ := psiSigmaTailIntegralConst σ) (M := M) + h_indep h_meas h_int h_mean hσ hK + (psiSigmaTailIntegralConst_nonneg σ) + (lintegral_Ioi_one_psiSigma_le_psiSigmaTailIntegralConst hσ) + hX hl hl1 hL hM hconstraint + +/-- Symmetric raw `Ψ_σ` concentration with the simple log-control constant +already plugged into the generic log-constraint slot. The only analytic input +still explicit is the tail-integral bound for `t / Ψ_σ(t)`. -/ +theorem measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_simple_log_control_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K a l L CΨ : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hCΨ_nonneg : 0 ≤ CΨ) + (hCΨ : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume ≤ + ENNReal.ofReal CΨ) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ + 2 * Real.exp + (-l * a + + (s.card : ℝ) * (l ^ (2 : ℕ) * (3 + psiSigmaLogControlConst l L + CΨ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := by + exact + measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := a) (l := l) (L := L) + (CΨ := CΨ) (M := psiSigmaLogControlConst l L) + h_indep h_meas h_int h_mean hσ hK hCΨ_nonneg hCΨ hX hl hl1 hL + (one_le_psiSigmaLogControlConst hl hL) + (fun i hi t ht => psiSigma_log_constraint_of_le (σ := σ) (l := l) (L := L) hl ht) + +/-- Symmetric raw `Ψ_σ` concentration with both scalar analytic inputs +discharged by the packaged log-control and tail-integral constants. -/ +theorem measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_simple_log_control_tail_const_rounded + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K a l L : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (hl : 0 ≤ l) (hl1 : l ≤ 1) (hL : 1 ≤ L) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * a)) ≤ + 2 * Real.exp + (-l * a + + (s.card : ℝ) * + (l ^ (2 : ℕ) * + (3 + psiSigmaLogControlConst l L + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := by + exact + measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_simple_log_control_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := a) (l := l) (L := L) + (CΨ := psiSigmaTailIntegralConst σ) + h_indep h_meas h_int h_mean hσ hK + (psiSigmaTailIntegralConst_nonneg σ) + (lintegral_Ioi_one_psiSigma_le_psiSigmaTailIntegralConst hσ) + hX hl hl1 hL + +/-- Scalar independent-sum `Ψ_σ` endpoint reduced to the remaining +deterministic choice of truncation/Chernoff parameters. This isolates the +probability part of the log-normal endpoint: after this theorem, the only +missing input is the optimization/absorption inequality for the raw bound. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_simple_log_control_tail_const_absorption + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K B : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (h_absorb : ∀ ⦃t : ℝ⦄, 1 ≤ t → + ∃ l L : ℝ, + 0 ≤ l ∧ l ≤ 1 ∧ 1 ≤ L ∧ + 2 * Real.exp + (-l * (B * t) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * + (3 + psiSigmaLogControlConst l L + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) ≤ + Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * + (Real.log (1 + σ * t)) ^ (2 : ℕ)))) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) (B * K) := by + rw [isBigO_psiSigma_iff] + intro t ht + rcases h_absorb ht with ⟨l, L, hl, hl1, hL, hbound⟩ + have hraw := + measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_simple_log_control_tail_const_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := B * t) (l := l) (L := L) + h_indep h_meas h_int h_mean hσ hK hX hl hl1 hL + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) ((B * K) * t)) + = μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * (B * t))) := by + ring_nf + _ ≤ + 2 * Real.exp + (-l * (B * t) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * + (3 + psiSigmaLogControlConst l L + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := hraw + _ ≤ Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := hbound + +/-- Scalar independent-sum `Ψ_σ` endpoint reduced to deterministic +optimization with an arbitrary logarithmic-control constant. This is the +general note-facing staging theorem for the final log-normal scalar endpoint: +the probability and analytic tail-integral parts are fully discharged, while +the remaining hypothesis is exactly the deterministic parameter choice +`(l, L, M)` and absorption of the raw bound. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_tail_const_absorption + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K B : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (h_absorb : ∀ ⦃t : ℝ⦄, 1 ≤ t → + ∃ l L M : ℝ, + 0 ≤ l ∧ l ≤ 1 ∧ 1 ≤ L ∧ 1 ≤ M ∧ + (∀ i ∈ s, ∀ ⦃u : ℝ⦄, u ∈ Set.Icc 1 L → + l * u ≤ Real.log (psiSigma σ u) - 4 * Real.log u + Real.log M) ∧ + 2 * Real.exp + (-l * (B * t) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * (3 + M + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) ≤ + Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * + (Real.log (1 + σ * t)) ^ (2 : ℕ)))) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) (B * K) := by + rw [isBigO_psiSigma_iff] + intro t ht + rcases h_absorb ht with + ⟨l, L, M, hl, hl1, hL, hM, hconstraint, hbound⟩ + have hraw := + measureReal_absTailEvent_finset_sum_le_two_mul_exp_add_two_mul_card_mul_invPsi_psiSigma_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_tail_const_rounded + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (a := B * t) (l := l) (L := L) + (M := M) + h_indep h_meas h_int h_mean hσ hK hX hl hl1 hL hM hconstraint + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) ((B * K) * t)) + = μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) (K * (B * t))) := by + ring_nf + _ ≤ + 2 * Real.exp + (-l * (B * t) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * (3 + M + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) := hraw + _ ≤ Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := hbound + +/-- Scalar independent-sum `Ψ_σ` endpoint reduced to a linear-control +parameter choice. The helper +`four_mul_log_le_half_log_psiSigma_add_const` absorbs the polynomial factor in +the raw theorem, so the deterministic optimizer only needs to find +`l, L, C` such that `l u ≤ (1/2) log Ψ_σ(u) + C` on `[1,L]` and the resulting +raw bound is absorbed by the target `Ψ_σ` tail. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_linear_control_tail_const_absorption + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K B : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (h_absorb : ∀ ⦃t : ℝ⦄, 1 ≤ t → + ∃ l L C : ℝ, + 0 ≤ l ∧ l ≤ 1 ∧ 1 ≤ L ∧ 0 ≤ C ∧ + (∀ ⦃u : ℝ⦄, u ∈ Set.Icc 1 L → + l * u ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + C) ∧ + 2 * Real.exp + (-l * (B * t) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * + (3 + psiSigmaPolynomialLogControlConst σ C + + psiSigmaTailIntegralConst σ))) + + 2 * ((s.card : ℝ) * (psiSigma σ L)⁻¹) ≤ + Real.exp + (-((σ ^ (2 : ℕ))⁻¹ * + (Real.log (1 + σ * t)) ^ (2 : ℕ)))) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) (B * K) := by + refine + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_log_constraint_tail_const_absorption + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (B := B) + h_indep h_meas h_int h_mean hσ hK hX ?_ + intro t ht + rcases h_absorb ht with ⟨l, L, C, hl, hl1, hL, hC, hlinear, hbound⟩ + refine ⟨l, L, psiSigmaPolynomialLogControlConst σ C, hl, hl1, hL, + one_le_psiSigmaPolynomialLogControlConst hC, ?_, ?_⟩ + · intro i hi u hu + exact psiSigma_log_constraint_of_linear_control (σ := σ) (l := l) (L := L) (C := C) + hσ hu hlinear + · exact hbound + +/-- Scalar independent-sum `Ψ_σ` endpoint reduced to three deterministic +logarithmic inequalities: local linear control, mgf-term absorption, and +union-term absorption. This is the preferred staging point for the final +parameter-choice proof. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_linear_control_tail_const_mgf_union_log + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K B : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hs : s.Nonempty) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) + (h_absorb : ∀ ⦃t : ℝ⦄, 1 ≤ t → + ∃ l L C : ℝ, + 0 ≤ l ∧ l ≤ 1 ∧ 1 ≤ L ∧ 0 ≤ C ∧ + (∀ ⦃u : ℝ⦄, u ∈ Set.Icc 1 L → + l * u ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + C) ∧ + Real.log 2 + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + + Real.log 2) + + (s.card : ℝ) * + (l ^ (2 : ℕ) * + (3 + psiSigmaPolynomialLogControlConst σ C + + psiSigmaTailIntegralConst σ)) ≤ + l * (B * t) ∧ + Real.log (2 * (s.card : ℝ)) + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + + Real.log 2) ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ)) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) (B * K) := by + refine + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_linear_control_tail_const_absorption + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) (B := B) + h_indep h_meas h_int h_mean hσ hK hX ?_ + intro t ht + rcases h_absorb ht with ⟨l, L, C, hl, hl1, hL, hC, hlinear, hmgf, hunion⟩ + refine ⟨l, L, C, hl, hl1, hL, hC, hlinear, ?_⟩ + have hR_pos : 0 < (s.card : ℝ) := by + exact_mod_cast hs.card_pos + exact + psiSigma_raw_bound_le_exp_neg_of_mgf_and_union_log + (σ := σ) (R := (s.card : ℝ)) (l := l) (B := B) (t := t) + (D := 3 + psiSigmaPolynomialLogControlConst σ C + psiSigmaTailIntegralConst σ) + (L := L) hR_pos hmgf hunion + +/-- Note-facing scalar independent-sum endpoint for the log-normal class +`Ψ_σ`: centered independent summands with common `O_{Ψ_σ}` scale `K` +concentrate at the square-root cardinality scale. -/ +theorem isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hs : s.Nonempty) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) : + IsBigO μ (psiSigma σ) (fun ω => ∑ i ∈ s, X i ω) + (psiSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) := by + refine + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero_of_linear_control_tail_const_mgf_union_log + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + (B := psiSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ)) + h_indep h_meas h_int h_mean hs hσ hK hX ?_ + intro t ht + have hR : 1 ≤ (s.card : ℝ) := by + exact_mod_cast hs.card_pos + simpa [psiSigmaLogExponent, psiSigmaIndependentSumRawConst] using + psiSigma_independentSum_parameter_choice + (σ := σ) (R := (s.card : ℝ)) (t := t) hσ hR ht + +/-- Average version of the log-normal centered independent-sum endpoint. -/ +theorem isBigO_psiSigma_finsetAverage_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {σ K : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_mean : ∀ i ∈ s, ∫ ω, X i ω ∂μ = 0) + (hs : s.Nonempty) + (hσ : 1 ≤ σ) (hK : 0 < K) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) K) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * ∑ i ∈ s, X i ω) + (psiSigmaIndependentSumConst σ * + (Real.sqrt (s.card : ℝ) / (s.card : ℝ)) * K) := by + have hsum := + isBigO_psiSigma_finset_sum_of_iIndepFun_of_isBigO_scale_of_integral_eq_zero + (μ := μ) (X := X) (s := s) (σ := σ) (K := K) + h_indep h_meas h_int h_mean hs hσ hK hX + have hcard_inv_nonneg : 0 ≤ ((s.card : ℝ)⁻¹) := by positivity + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := psiSigma σ) + (X := fun ω => ∑ i ∈ s, X i ω) + (A := psiSigmaIndependentSumConst σ * Real.sqrt (s.card : ℝ) * K) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Parameters.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Parameters.lean new file mode 100644 index 0000000000..951c701395 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/Parameters.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiSigma.TailAndLogControl + +/-! # Parameters -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- A fixed-constant local-control lemma for the optimized log-normal +parameter choice. The condition is the note-facing admissibility scale +`l ≲ log Ψ_σ(L) / L`; the proof avoids differentiating +`log(1 + σ t)^2 / t` by using Mathlib's monotonicity of +`log x / sqrt x` on `[exp 2, ∞)`, and handles the small range with the +additive constant `exp 2`. -/ +lemma psiSigma_linear_control_of_le_half_log_sq_div {σ l L u : ℝ} + (hσ : 1 ≤ σ) (hl_one : l ≤ 1) (hL : 1 ≤ L) + (hl : l ≤ + (1 / 2 : ℝ) * + (((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ)) / L)) + (hu : u ∈ Set.Icc 1 L) : + l * u ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + Real.exp 2 := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσsq_pos : 0 < σ ^ (2 : ℕ) := by positivity + have hu_nonneg : 0 ≤ u := le_trans zero_le_one hu.1 + have hu_pos : 0 < u := lt_of_lt_of_le zero_lt_one hu.1 + have hL_pos : 0 < L := lt_of_lt_of_le zero_lt_one hL + let x : ℝ := 1 + σ * u + let y : ℝ := 1 + σ * L + have hx_pos : 0 < x := by positivity + have hy_pos : 0 < y := by positivity + have hx_one : 1 ≤ x := by + dsimp [x] + exact le_add_of_nonneg_right (mul_nonneg hσ_pos.le hu_nonneg) + have hy_one : 1 ≤ y := by + dsimp [y] + exact le_add_of_nonneg_right + (mul_nonneg hσ_pos.le (le_trans zero_le_one hL)) + have hxy : x ≤ y := by + dsimp [x, y] + have hmul : σ * u ≤ σ * L := mul_le_mul_of_nonneg_left hu.2 hσ_pos.le + linarith + have hlogψ : + (1 / 2 : ℝ) * Real.log (psiSigma σ u) = + (1 / 2 : ℝ) * ((σ ^ (2 : ℕ))⁻¹ * (Real.log x) ^ (2 : ℕ)) := by + simp [psiSigma, x] + by_cases hlarge : Real.exp 2 ≤ x + · have hy_large : Real.exp 2 ≤ y := hlarge.trans hxy + have hanti : Real.log y / Real.sqrt y ≤ Real.log x / Real.sqrt x := + Real.log_div_sqrt_antitoneOn hlarge hy_large hxy + have hleft_nonneg : 0 ≤ Real.log y / Real.sqrt y := + div_nonneg (Real.log_nonneg hy_one) (Real.sqrt_nonneg y) + have hsq_mono : + (Real.log y / Real.sqrt y) ^ (2 : ℕ) ≤ + (Real.log x / Real.sqrt x) ^ (2 : ℕ) := by + simpa using (pow_le_pow_left₀ hleft_nonneg hanti 2) + have hratio : + (Real.log y) ^ (2 : ℕ) / y ≤ (Real.log x) ^ (2 : ℕ) / x := by + calc + (Real.log y) ^ (2 : ℕ) / y = (Real.log y / Real.sqrt y) ^ (2 : ℕ) := by + rw [show (Real.log y / Real.sqrt y) ^ (2 : ℕ) = + (Real.log y) ^ (2 : ℕ) / (Real.sqrt y) ^ (2 : ℕ) by ring] + rw [Real.sq_sqrt hy_pos.le] + _ ≤ (Real.log x / Real.sqrt x) ^ (2 : ℕ) := hsq_mono + _ = (Real.log x) ^ (2 : ℕ) / x := by + rw [show (Real.log x / Real.sqrt x) ^ (2 : ℕ) = + (Real.log x) ^ (2 : ℕ) / (Real.sqrt x) ^ (2 : ℕ) by ring] + rw [Real.sq_sqrt hx_pos.le] + have hylxu : y / L ≤ x / u := by + rw [div_le_div_iff₀ hL_pos hu_pos] + dsimp [x, y] + ring_nf + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hu.2 (σ * L * u) + have hcoef : (y / L) * (u / x) ≤ 1 := by + calc + (y / L) * (u / x) ≤ (x / u) * (u / x) := by + exact mul_le_mul_of_nonneg_right hylxu (by positivity) + _ = 1 := by + field_simp [hu_pos.ne', hx_pos.ne'] + have hscale : + ((Real.log y) ^ (2 : ℕ) / L) * u ≤ (Real.log x) ^ (2 : ℕ) := by + calc + ((Real.log y) ^ (2 : ℕ) / L) * u + = (y / L) * (u * ((Real.log y) ^ (2 : ℕ) / y)) := by + field_simp [hy_pos.ne'] + _ ≤ (y / L) * (u * ((Real.log x) ^ (2 : ℕ) / x)) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hratio hu_nonneg) (by positivity) + _ = ((y / L) * (u / x)) * (Real.log x) ^ (2 : ℕ) := by + field_simp [hx_pos.ne'] + _ ≤ 1 * (Real.log x) ^ (2 : ℕ) := by + exact mul_le_mul_of_nonneg_right hcoef (sq_nonneg (Real.log x)) + _ = (Real.log x) ^ (2 : ℕ) := by ring + have hscale_div : + (((σ ^ (2 : ℕ))⁻¹ * (Real.log y) ^ (2 : ℕ)) / L) * u ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log x) ^ (2 : ℕ) := by + have hmul := mul_le_mul_of_nonneg_left hscale (inv_nonneg.mpr (sq_nonneg σ)) + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using hmul + have hl_u : + l * u ≤ + ((1 / 2 : ℝ) * + (((σ ^ (2 : ℕ))⁻¹ * (Real.log y) ^ (2 : ℕ)) / L)) * u := by + dsimp [y] at hl ⊢ + exact mul_le_mul_of_nonneg_right hl hu_nonneg + rw [hlogψ] + calc + l * u ≤ + ((1 / 2 : ℝ) * + (((σ ^ (2 : ℕ))⁻¹ * (Real.log y) ^ (2 : ℕ)) / L)) * u := + hl_u + _ ≤ + (1 / 2 : ℝ) * ((σ ^ (2 : ℕ))⁻¹ * (Real.log x) ^ (2 : ℕ)) := by + calc + ((1 / 2 : ℝ) * + (((σ ^ (2 : ℕ))⁻¹ * (Real.log y) ^ (2 : ℕ)) / L)) * u = + (1 / 2 : ℝ) * + ((((σ ^ (2 : ℕ))⁻¹ * (Real.log y) ^ (2 : ℕ)) / L) * u) := by + ring + _ ≤ (1 / 2 : ℝ) * + ((σ ^ (2 : ℕ))⁻¹ * (Real.log x) ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hscale_div (by norm_num : 0 ≤ (1 / 2 : ℝ)) + _ ≤ + (1 / 2 : ℝ) * ((σ ^ (2 : ℕ))⁻¹ * (Real.log x) ^ (2 : ℕ)) + + Real.exp 2 := + le_add_of_nonneg_right (Real.exp_pos 2).le + · have hx_le_exp : x ≤ Real.exp 2 := le_of_not_ge hlarge + have hu_le_exp : u ≤ Real.exp 2 := by + dsimp [x] at hx_le_exp + have hσu_ge_u : u ≤ σ * u := by + simpa [one_mul] using mul_le_mul_of_nonneg_right hσ hu_nonneg + exact (hσu_ge_u.trans (le_add_of_nonneg_left zero_le_one)).trans hx_le_exp + have hlu : l * u ≤ u := by + simpa [one_mul] using mul_le_mul_of_nonneg_right hl_one hu_nonneg + have hlog_nonneg : 0 ≤ Real.log (psiSigma σ u) := + Real.log_nonneg one_le_psiSigma + calc + l * u ≤ u := hlu + _ ≤ Real.exp 2 := hu_le_exp + _ ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + Real.exp 2 := + le_add_of_nonneg_left + (mul_nonneg (by norm_num : 0 ≤ (1 / 2 : ℝ)) hlog_nonneg) + +lemma psiSigmaIndependentSumLambda_linear_control {σ R t u : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) + (hu : u ∈ Set.Icc 1 (psiSigmaIndependentSumCutoff σ R t)) : + psiSigmaIndependentSumLambda σ R t * u ≤ + (1 / 2 : ℝ) * Real.log (psiSigma σ u) + Real.exp 2 := by + exact + psiSigma_linear_control_of_le_half_log_sq_div + (σ := σ) (l := psiSigmaIndependentSumLambda σ R t) + (L := psiSigmaIndependentSumCutoff σ R t) (u := u) + hσ + (psiSigmaIndependentSumLambda_le_one (σ := σ) (R := R) (t := t) hσ hR ht) + (one_le_psiSigmaIndependentSumCutoff (σ := σ) (R := R) (t := t) hσ hR ht) + (psiSigmaIndependentSumLambda_le_half_cutoff_logExponent_div + (σ := σ) (R := R) (t := t) hσ hR ht) + hu + +lemma psiSigma_independentSum_parameter_choice {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + ∃ l L C : ℝ, + 0 ≤ l ∧ l ≤ 1 ∧ 1 ≤ L ∧ 0 ≤ C ∧ + (∀ ⦃u : ℝ⦄, u ∈ Set.Icc 1 L → + l * u ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + C) ∧ + Real.log 2 + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + + Real.log 2) + + R * (l ^ (2 : ℕ) * + (3 + psiSigmaPolynomialLogControlConst σ C + psiSigmaTailIntegralConst σ)) ≤ + l * ((psiSigmaIndependentSumConst σ * Real.sqrt R) * t) ∧ + Real.log (2 * R) + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + + Real.log 2) ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ) := by + refine ⟨psiSigmaIndependentSumLambda σ R t, psiSigmaIndependentSumCutoff σ R t, + Real.exp 2, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · exact psiSigmaIndependentSumLambda_nonneg (σ := σ) (R := R) (t := t) hσ hR ht + · exact psiSigmaIndependentSumLambda_le_one (σ := σ) (R := R) (t := t) hσ hR ht + · exact one_le_psiSigmaIndependentSumCutoff (σ := σ) (R := R) (t := t) hσ hR ht + · exact (Real.exp_pos 2).le + · intro u hu + exact psiSigmaIndependentSumLambda_linear_control + (σ := σ) (R := R) (t := t) (u := u) hσ hR ht hu + · simpa [psiSigmaLogExponent, psiSigmaIndependentSumRawConst] using + psiSigmaIndependentSumLambda_mgf_log (σ := σ) (R := R) (t := t) hσ hR ht + · simpa [psiSigmaLogExponent] using + psiSigmaIndependentSumCutoff_union_log (σ := σ) (R := R) (t := t) hσ hR ht + +lemma psiSigma_log_constraint_of_mul_le_const {σ l L C u : ℝ} + (hσ : 1 ≤ σ) (hl : 0 ≤ l) (hC : l * L ≤ C) (hu : u ∈ Set.Icc 1 L) : + l * u ≤ + Real.log (psiSigma σ u) - 4 * Real.log u + + Real.log (psiSigmaPolynomialLogControlConst σ C) := by + refine psiSigma_log_constraint_of_linear_control (σ := σ) (l := l) (L := L) (C := C) + hσ hu ?_ + intro v hv + exact psiSigma_linear_control_of_mul_le_const (σ := σ) (l := l) (L := L) (C := C) + hl hC hv + +lemma two_mul_card_mul_inv_psiSigma_le_exp_neg_of_log_le {σ R L t : ℝ} + (hR_pos : 0 < R) + (hlog : + Real.log (2 * R) + + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ)) : + 2 * (R * (psiSigma σ L)⁻¹) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + let qt : ℝ := (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + let qL : ℝ := (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ) + have htwoR_pos : 0 < 2 * R := by + positivity + have hexp_rewrite : + 2 * (R * (psiSigma σ L)⁻¹) = Real.exp (Real.log (2 * R) - qL) := by + calc + 2 * (R * (psiSigma σ L)⁻¹) = (2 * R) * Real.exp (-qL) := by + change 2 * (R * (Real.exp qL)⁻¹) = (2 * R) * Real.exp (-qL) + rw [← Real.exp_neg] + ring + _ = Real.exp (Real.log (2 * R)) * Real.exp (-qL) := by + rw [Real.exp_log htwoR_pos] + _ = Real.exp (Real.log (2 * R) - qL) := by + rw [← Real.exp_add] + ring_nf + rw [hexp_rewrite] + exact Real.exp_le_exp.2 (by dsimp [qt, qL] at hlog ⊢; linarith) + +lemma two_mul_card_mul_inv_psiSigma_le_exp_neg_of_log_add_le {σ R L q : ℝ} + (hR_pos : 0 < R) + (hlog : + Real.log (2 * R) + q ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ)) : + 2 * (R * (psiSigma σ L)⁻¹) ≤ Real.exp (-q) := by + let qL : ℝ := (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ) + have htwoR_pos : 0 < 2 * R := by + positivity + have hexp_rewrite : + 2 * (R * (psiSigma σ L)⁻¹) = Real.exp (Real.log (2 * R) - qL) := by + calc + 2 * (R * (psiSigma σ L)⁻¹) = (2 * R) * Real.exp (-qL) := by + change 2 * (R * (Real.exp qL)⁻¹) = (2 * R) * Real.exp (-qL) + rw [← Real.exp_neg] + ring + _ = Real.exp (Real.log (2 * R)) * Real.exp (-qL) := by + rw [Real.exp_log htwoR_pos] + _ = Real.exp (Real.log (2 * R) - qL) := by + rw [← Real.exp_add] + ring_nf + rw [hexp_rewrite] + exact Real.exp_le_exp.2 (by dsimp [qL] at hlog ⊢; linarith) + +lemma two_mul_exp_neg_add_le_exp_neg_of_log_two_add_le {x y q : ℝ} + (h : Real.log 2 + q + y ≤ x) : + 2 * Real.exp (-x + y) ≤ Real.exp (-q) := by + have htwo_pos : 0 < (2 : ℝ) := by + norm_num + have hrewrite : 2 * Real.exp (-x + y) = Real.exp (Real.log 2 - x + y) := by + calc + 2 * Real.exp (-x + y) = Real.exp (Real.log 2) * Real.exp (-x + y) := by + rw [Real.exp_log htwo_pos] + _ = Real.exp (Real.log 2 + (-x + y)) := by + rw [← Real.exp_add] + _ = Real.exp (Real.log 2 - x + y) := by + ring_nf + rw [hrewrite] + exact Real.exp_le_exp.2 (by linarith) + +lemma psiSigma_raw_bound_le_exp_neg_of_mgf_and_union_log {σ R l B t D L : ℝ} + (hR_pos : 0 < R) + (hmgf : + Real.log 2 + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + Real.log 2) + + R * (l ^ (2 : ℕ) * D) ≤ l * (B * t)) + (hunion : + Real.log (2 * R) + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + Real.log 2) ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * L)) ^ (2 : ℕ)) : + 2 * Real.exp (-l * (B * t) + R * (l ^ (2 : ℕ) * D)) + + 2 * (R * (psiSigma σ L)⁻¹) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + let q : ℝ := (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + have hmgf_bound : + 2 * Real.exp (-l * (B * t) + R * (l ^ (2 : ℕ) * D)) ≤ + Real.exp (-(q + Real.log 2)) := by + simpa [neg_mul] using + two_mul_exp_neg_add_le_exp_neg_of_log_two_add_le + (x := l * (B * t)) (y := R * (l ^ (2 : ℕ) * D)) (q := q + Real.log 2) + (by simpa [q, add_assoc] using hmgf) + have hunion_bound : + 2 * (R * (psiSigma σ L)⁻¹) ≤ Real.exp (-(q + Real.log 2)) := + two_mul_card_mul_inv_psiSigma_le_exp_neg_of_log_add_le + (σ := σ) (R := R) (L := L) (q := q + Real.log 2) + hR_pos (by simpa [q, add_assoc] using hunion) + have hhalf : + Real.exp (-(q + Real.log 2)) + Real.exp (-(q + Real.log 2)) = + Real.exp (-q) := by + have htwo_pos : 0 < (2 : ℝ) := by + norm_num + rw [neg_add, Real.exp_add] + have hlog_two : Real.exp (-Real.log 2) = (2 : ℝ)⁻¹ := by + rw [Real.exp_neg, Real.exp_log htwo_pos] + rw [hlog_two] + ring + calc + 2 * Real.exp (-l * (B * t) + R * (l ^ (2 : ℕ) * D)) + + 2 * (R * (psiSigma σ L)⁻¹) + ≤ Real.exp (-(q + Real.log 2)) + Real.exp (-(q + Real.log 2)) := by + exact add_le_add hmgf_bound hunion_bound + _ = Real.exp (-q) := hhalf + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/TailAndLogControl.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/TailAndLogControl.lean new file mode 100644 index 0000000000..c3d2bcd435 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/PsiSigma/TailAndLogControl.lean @@ -0,0 +1,879 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Log.Monotone +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Triangle +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiConcentration + +/-! # Tail And Log Control -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +private lemma measurable_psiSigma_tail_integrand (σ : ℝ) : + Measurable fun t : ℝ => t / psiSigma σ t := by + unfold psiSigma + measurability + +private lemma psiSigma_pow_three_le_of_exp_three_mul_sq_le {σ t : ℝ} + (hσ : 1 ≤ σ) (ht : Real.exp (3 * σ ^ (2 : ℕ)) ≤ t) : + t ^ (3 : ℝ) ≤ psiSigma σ t := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσsq_pos : 0 < σ ^ (2 : ℕ) := sq_pos_of_pos hσ_pos + have hT_pos : 0 < Real.exp (3 * σ ^ (2 : ℕ)) := Real.exp_pos _ + have ht_pos : 0 < t := lt_of_lt_of_le hT_pos ht + have hlogT : + Real.log (Real.exp (3 * σ ^ (2 : ℕ))) ≤ Real.log t := + Real.log_le_log hT_pos ht + have hlog_t_ge : 3 * σ ^ (2 : ℕ) ≤ Real.log t := by + simpa [Real.log_exp] using hlogT + have hlog_t_nonneg : 0 ≤ Real.log t := by + exact le_trans (by positivity : 0 ≤ 3 * σ ^ (2 : ℕ)) hlog_t_ge + have harg_le : t ≤ 1 + σ * t := by + have ht_nonneg : 0 ≤ t := le_of_lt ht_pos + have hσt_ge_t : t ≤ σ * t := by + simpa [one_mul] using mul_le_mul_of_nonneg_right hσ ht_nonneg + linarith + have harg_pos : 0 < 1 + σ * t := by + linarith + have hlog_le : + Real.log t ≤ Real.log (1 + σ * t) := + Real.log_le_log ht_pos harg_le + have hlog_arg_nonneg : 0 ≤ Real.log (1 + σ * t) := by + exact le_trans hlog_t_nonneg hlog_le + have hsq_le : + (Real.log t) ^ (2 : ℕ) ≤ (Real.log (1 + σ * t)) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hlog_t_nonneg hlog_le 2 + have hmain : + 3 * Real.log t ≤ + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) := by + have hfirst : + 3 * Real.log t ≤ (σ ^ (2 : ℕ))⁻¹ * (Real.log t) ^ (2 : ℕ) := by + rw [le_inv_mul_iff₀ hσsq_pos] + calc + σ ^ (2 : ℕ) * (3 * Real.log t) + = (3 * σ ^ (2 : ℕ)) * Real.log t := by ring + _ ≤ Real.log t * Real.log t := + mul_le_mul_of_nonneg_right hlog_t_ge hlog_t_nonneg + _ = (Real.log t) ^ (2 : ℕ) := by ring + exact hfirst.trans (mul_le_mul_of_nonneg_left hsq_le (inv_nonneg.mpr (sq_nonneg σ))) + have hexp : Real.exp (3 * Real.log t) ≤ psiSigma σ t := by + simpa [psiSigma] using Real.exp_le_exp.2 hmain + have hpoweq : Real.exp (3 * Real.log t) = t ^ (3 : ℝ) := by + rw [mul_comm 3 (Real.log t), Real.exp_mul, Real.exp_log ht_pos] + rwa [hpoweq] at hexp + +private lemma psiSigma_tail_integrand_le_rpow_neg_two_of_exp_three_mul_sq_le + {σ t : ℝ} (hσ : 1 ≤ σ) (ht : Real.exp (3 * σ ^ (2 : ℕ)) ≤ t) : + t / psiSigma σ t ≤ t ^ (-2 : ℝ) := by + have hT_pos : 0 < Real.exp (3 * σ ^ (2 : ℕ)) := Real.exp_pos _ + have ht_pos : 0 < t := lt_of_lt_of_le hT_pos ht + have ht_nonneg : 0 ≤ t := le_of_lt ht_pos + have hψ_lower : t ^ (3 : ℝ) ≤ psiSigma σ t := + psiSigma_pow_three_le_of_exp_three_mul_sq_le hσ ht + have ht3_pos : 0 < t ^ (3 : ℝ) := Real.rpow_pos_of_pos ht_pos _ + calc + t / psiSigma σ t ≤ t / t ^ (3 : ℝ) := by + exact div_le_div_of_nonneg_left ht_nonneg ht3_pos hψ_lower + _ = t ^ (-2 : ℝ) := by + calc + t / t ^ (3 : ℝ) = t ^ (1 : ℝ) / t ^ (3 : ℝ) := by + rw [Real.rpow_one] + _ = t ^ ((1 : ℝ) - 3) := by + rw [Real.rpow_sub ht_pos (1 : ℝ) 3] + _ = t ^ (-2 : ℝ) := by + norm_num + +/-- The log-normal tail-integral kernel is integrable on `(1, ∞)` for +`σ ≥ 1`. The proof is intentionally non-sharp: after the cutoff +`exp(3 σ^2)`, `Ψ_σ(t)` dominates `t^3`, so the kernel is bounded by `t⁻²`. -/ +theorem integrableOn_Ioi_one_psiSigma_tail_integrand {σ : ℝ} (hσ : 1 ≤ σ) : + IntegrableOn (fun t : ℝ => t / psiSigma σ t) (Set.Ioi 1) volume := by + let T : ℝ := Real.exp (3 * σ ^ (2 : ℕ)) + have hT_pos : 0 < T := by + positivity + have hT : 1 ≤ T := by + have hexp : 0 ≤ 3 * σ ^ (2 : ℕ) := by + positivity + simpa [T] using Real.one_le_exp hexp + have hmeas_Ioc : + AEStronglyMeasurable (fun t : ℝ => t / psiSigma σ t) + (volume.restrict (Set.Ioc 1 T)) := + (measurable_psiSigma_tail_integrand σ).aestronglyMeasurable + have hmeas_IoiT : + AEStronglyMeasurable (fun t : ℝ => t / psiSigma σ t) + (volume.restrict (Set.Ioi T)) := + (measurable_psiSigma_tail_integrand σ).aestronglyMeasurable + have hcompact_id : IntegrableOn (fun t : ℝ => t) (Set.Ioc 1 T) volume := by + rw [← intervalIntegrable_iff_integrableOn_Ioc_of_le hT] + exact intervalIntegral.intervalIntegrable_id + have hcompact : + IntegrableOn (fun t : ℝ => t / psiSigma σ t) (Set.Ioc 1 T) volume := by + change Integrable (fun t : ℝ => t / psiSigma σ t) (volume.restrict (Set.Ioc 1 T)) + change Integrable (fun t : ℝ => t) (volume.restrict (Set.Ioc 1 T)) at hcompact_id + refine hcompact_id.mono hmeas_Ioc ?_ + filter_upwards [MeasureTheory.ae_restrict_mem measurableSet_Ioc] with t ht + have ht_nonneg : 0 ≤ t := le_trans zero_le_one (le_of_lt ht.1) + have hψ_one : 1 ≤ psiSigma σ t := one_le_psiSigma + have hψ_pos : 0 < psiSigma σ t := lt_of_lt_of_le zero_lt_one hψ_one + have hdiv_nonneg : 0 ≤ t / psiSigma σ t := div_nonneg ht_nonneg hψ_pos.le + have hdiv_le : t / psiSigma σ t ≤ t := by + calc + t / psiSigma σ t ≤ t / 1 := by + exact div_le_div_of_nonneg_left ht_nonneg zero_lt_one hψ_one + _ = t := by + rw [div_one] + simpa [Real.norm_eq_abs, abs_of_nonneg hdiv_nonneg, abs_of_nonneg ht_nonneg] + using hdiv_le + have hpow : IntegrableOn (fun t : ℝ => t ^ (-2 : ℝ)) (Set.Ioi T) volume := + integrableOn_Ioi_rpow_of_lt (a := (-2 : ℝ)) (by norm_num) hT_pos + have htail : + IntegrableOn (fun t : ℝ => t / psiSigma σ t) (Set.Ioi T) volume := by + change Integrable (fun t : ℝ => t / psiSigma σ t) (volume.restrict (Set.Ioi T)) + change Integrable (fun t : ℝ => t ^ (-2 : ℝ)) (volume.restrict (Set.Ioi T)) at hpow + refine hpow.mono hmeas_IoiT ?_ + filter_upwards [MeasureTheory.ae_restrict_mem measurableSet_Ioi] with t ht + have ht_ge : T ≤ t := le_of_lt ht + have ht_pos : 0 < t := lt_of_lt_of_le hT_pos ht_ge + have ht_nonneg : 0 ≤ t := le_of_lt ht_pos + have hle := + psiSigma_tail_integrand_le_rpow_neg_two_of_exp_three_mul_sq_le (σ := σ) hσ ht_ge + have hdiv_nonneg : 0 ≤ t / psiSigma σ t := + div_nonneg ht_nonneg (Real.exp_pos _).le + have hrpow_nonneg : 0 ≤ t ^ (-2 : ℝ) := Real.rpow_nonneg ht_nonneg _ + simpa [Real.norm_eq_abs, abs_of_nonneg hdiv_nonneg, abs_of_nonneg hrpow_nonneg, + abs_of_nonneg ht_nonneg, abs_of_nonneg (Real.exp_pos _).le] using hle + have hsplit : Set.Ioi (1 : ℝ) = Set.Ioc (1 : ℝ) T ∪ Set.Ioi T := by + exact (Set.Ioc_union_Ioi_eq_Ioi (a := (1 : ℝ)) (b := T) hT).symm + rw [hsplit, integrableOn_union] + exact ⟨hcompact, htail⟩ + +/-- A non-sharp finite constant for the `Ψ_σ` analytic tail-integral input. -/ +noncomputable def psiSigmaTailIntegralConst (σ : ℝ) : ℝ := + (∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume).toReal + +lemma psiSigmaTailIntegralConst_nonneg (σ : ℝ) : + 0 ≤ psiSigmaTailIntegralConst σ := + ENNReal.toReal_nonneg + +/-- Note-facing discharge of the analytic `Ψ_σ` tail-integral hypothesis. -/ +theorem lintegral_Ioi_one_psiSigma_le_psiSigmaTailIntegralConst {σ : ℝ} + (hσ : 1 ≤ σ) : + ∫⁻ t in Set.Ioi 1, ENNReal.ofReal (t / psiSigma σ t) ∂volume ≤ + ENNReal.ofReal (psiSigmaTailIntegralConst σ) := by + let f : ℝ → ℝ := fun t => t / psiSigma σ t + have hmeas : + AEStronglyMeasurable f (volume.restrict (Set.Ioi 1)) := + (measurable_psiSigma_tail_integrand σ).aestronglyMeasurable + have hnonneg : 0 ≤ᵐ[volume.restrict (Set.Ioi 1)] f := by + refine (ae_restrict_iff' measurableSet_Ioi).2 ?_ + refine Filter.Eventually.of_forall ?_ + intro t ht + exact div_nonneg (le_trans zero_le_one (le_of_lt ht)) (Real.exp_pos _).le + have hfinite : + (∫⁻ t, ENNReal.ofReal (f t) ∂(volume.restrict (Set.Ioi 1))) ≠ ⊤ := + (MeasureTheory.lintegral_ofReal_ne_top_iff_integrable hmeas hnonneg).2 + (integrableOn_Ioi_one_psiSigma_tail_integrand hσ) + rw [psiSigmaTailIntegralConst] + change (∫⁻ t, ENNReal.ofReal (f t) ∂(volume.restrict (Set.Ioi 1))) ≤ + ENNReal.ofReal + ((∫⁻ t, ENNReal.ofReal (f t) ∂(volume.restrict (Set.Ioi 1))).toReal) + rw [ENNReal.ofReal_toReal hfinite] + +/-- A simple non-sharp logarithmic-control constant for the raw `Ψ_σ` +truncation-Chernoff theorem on the interval `[1, L]`. It is intentionally +allowed to depend on the Chernoff parameter `l` and cutoff `L`; later endpoint +optimization can replace this with a sharper `σ`-dependent package. -/ +noncomputable def psiSigmaLogControlConst (l L : ℝ) : ℝ := + Real.exp (l * L + 4 * Real.log L) + +lemma one_le_psiSigmaLogControlConst {l L : ℝ} (hl : 0 ≤ l) (hL : 1 ≤ L) : + 1 ≤ psiSigmaLogControlConst l L := by + have hL_nonneg : 0 ≤ L := le_trans zero_le_one hL + have hlogL_nonneg : 0 ≤ Real.log L := Real.log_nonneg hL + have hexp_nonneg : 0 ≤ l * L + 4 * Real.log L := by + exact add_nonneg (mul_nonneg hl hL_nonneg) + (mul_nonneg (by norm_num) hlogL_nonneg) + simpa [psiSigmaLogControlConst] using Real.one_le_exp hexp_nonneg + +/-- A sharper reusable logarithmic-control constant for the optimized +`Ψ_σ` endpoint. If the optimizer can prove +`l t ≤ (1/2) log Ψ_σ(t) + C`, this constant absorbs the remaining polynomial +factor `t^4` in the raw Chernoff theorem. -/ +noncomputable def psiSigmaPolynomialLogControlConst (σ C : ℝ) : ℝ := + Real.exp (C + 8 * σ ^ (2 : ℕ)) + +noncomputable def psiSigmaLogExponent (σ t : ℝ) : ℝ := + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + +noncomputable def psiSigmaIndependentSumRawConst (σ : ℝ) : ℝ := + 3 + psiSigmaPolynomialLogControlConst σ (Real.exp 2) + psiSigmaTailIntegralConst σ + +noncomputable def psiSigmaIndependentSumConst (σ : ℝ) : ℝ := + 128 * Real.exp (σ ^ (2 : ℕ) / 2) * + Real.sqrt (psiSigmaIndependentSumRawConst σ) + +noncomputable def psiSigmaIndependentSumCutoff (σ R t : ℝ) : ℝ := + ((1 + σ * t) * Real.exp (σ * Real.sqrt (Real.log (4 * R))) - 1) / σ + +noncomputable def psiSigmaIndependentSumLambda (σ R t : ℝ) : ℝ := + 4 * (psiSigmaLogExponent σ t + Real.log 2) / + (psiSigmaIndependentSumConst σ * Real.sqrt R * t) + +lemma one_le_psiSigmaPolynomialLogControlConst {σ C : ℝ} (hC : 0 ≤ C) : + 1 ≤ psiSigmaPolynomialLogControlConst σ C := by + have hexp_nonneg : 0 ≤ C + 8 * σ ^ (2 : ℕ) := by + exact add_nonneg hC (mul_nonneg (by norm_num) (sq_nonneg σ)) + simpa [psiSigmaPolynomialLogControlConst] using Real.one_le_exp hexp_nonneg + +lemma one_le_psiSigmaIndependentSumRawConst (σ : ℝ) : + 1 ≤ psiSigmaIndependentSumRawConst σ := by + have hpoly : 1 ≤ psiSigmaPolynomialLogControlConst σ (Real.exp 2) := + one_le_psiSigmaPolynomialLogControlConst (Real.exp_pos 2).le + have htail : 0 ≤ psiSigmaTailIntegralConst σ := + psiSigmaTailIntegralConst_nonneg σ + dsimp [psiSigmaIndependentSumRawConst] + linarith + +lemma psiSigmaIndependentSumRawConst_pos (σ : ℝ) : + 0 < psiSigmaIndependentSumRawConst σ := + lt_of_lt_of_le zero_lt_one (one_le_psiSigmaIndependentSumRawConst σ) + +lemma psiSigmaIndependentSumConst_pos (σ : ℝ) : + 0 < psiSigmaIndependentSumConst σ := by + have hraw : 0 < Real.sqrt (psiSigmaIndependentSumRawConst σ) := + Real.sqrt_pos.2 (psiSigmaIndependentSumRawConst_pos σ) + dsimp [psiSigmaIndependentSumConst] + positivity + +lemma one_add_mul_psiSigmaIndependentSumCutoff {σ R t : ℝ} + (hσ : σ ≠ 0) : + 1 + σ * psiSigmaIndependentSumCutoff σ R t = + (1 + σ * t) * Real.exp (σ * Real.sqrt (Real.log (4 * R))) := by + dsimp [psiSigmaIndependentSumCutoff] + field_simp [hσ] + ring + +lemma one_le_psiSigmaIndependentSumCutoff {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + 1 ≤ psiSigmaIndependentSumCutoff σ R t := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hR_nonneg : 0 ≤ R := le_trans zero_le_one hR + have hlog_nonneg : 0 ≤ Real.log (4 * R) := by + have hfourR : 1 ≤ 4 * R := by + calc + (1 : ℝ) ≤ 4 := by norm_num + _ = 4 * 1 := by ring + _ ≤ 4 * R := mul_le_mul_of_nonneg_left hR (by norm_num) + exact Real.log_nonneg hfourR + have hexp_one : 1 ≤ Real.exp (σ * Real.sqrt (Real.log (4 * R))) := by + exact Real.one_le_exp (mul_nonneg hσ_pos.le (Real.sqrt_nonneg _)) + have harg : + 1 + σ * t ≤ + (1 + σ * t) * Real.exp (σ * Real.sqrt (Real.log (4 * R))) := by + have harg_nonneg : 0 ≤ 1 + σ * t := by positivity + simpa [mul_one] using mul_le_mul_of_nonneg_left hexp_one harg_nonneg + have hcut := + one_add_mul_psiSigmaIndependentSumCutoff (σ := σ) (R := R) (t := t) hσ_pos.ne' + rw [← hcut] at harg + have hmul : σ * t ≤ σ * psiSigmaIndependentSumCutoff σ R t := by linarith + exact ht.trans (le_of_mul_le_mul_left hmul hσ_pos) + +lemma psiSigmaIndependentSumCutoff_union_log {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + Real.log (2 * R) + + ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + + Real.log 2) ≤ + (σ ^ (2 : ℕ))⁻¹ * + (Real.log (1 + σ * psiSigmaIndependentSumCutoff σ R t)) ^ (2 : ℕ) := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσsq_pos : 0 < σ ^ (2 : ℕ) := by positivity + have hR_pos : 0 < R := lt_of_lt_of_le zero_lt_one hR + have hfourR_pos : 0 < 4 * R := by positivity + have htwoR_pos : 0 < 2 * R := by positivity + let A : ℝ := Real.log (4 * R) + let a : ℝ := Real.log (1 + σ * t) + have hA_nonneg : 0 ≤ A := by + have hfourR : 1 ≤ 4 * R := by + calc + (1 : ℝ) ≤ 4 := by norm_num + _ = 4 * 1 := by ring + _ ≤ 4 * R := mul_le_mul_of_nonneg_left hR (by norm_num) + exact Real.log_nonneg hfourR + have ha_nonneg : 0 ≤ a := by + have harg : 1 ≤ 1 + σ * t := + le_add_of_nonneg_right (mul_nonneg hσ_pos.le (le_trans zero_le_one ht)) + exact Real.log_nonneg harg + have hcut : + 1 + σ * psiSigmaIndependentSumCutoff σ R t = + (1 + σ * t) * Real.exp (σ * Real.sqrt A) := by + simpa [A] using + one_add_mul_psiSigmaIndependentSumCutoff (σ := σ) (R := R) (t := t) hσ_pos.ne' + have hlog_cut : + Real.log (1 + σ * psiSigmaIndependentSumCutoff σ R t) = + a + σ * Real.sqrt A := by + rw [hcut] + have harg_pos : 0 < 1 + σ * t := by positivity + rw [Real.log_mul harg_pos.ne' (Real.exp_pos _).ne', Real.log_exp] + have hlog_four : + Real.log (2 * R) + Real.log 2 = A := by + calc + Real.log (2 * R) + Real.log 2 = Real.log ((2 * R) * 2) := by + rw [Real.log_mul htwoR_pos.ne' (by norm_num : (2 : ℝ) ≠ 0)] + _ = A := by + congr 1 + ring + have hquad : + (σ ^ (2 : ℕ))⁻¹ * a ^ (2 : ℕ) + A ≤ + (σ ^ (2 : ℕ))⁻¹ * (a + σ * Real.sqrt A) ^ (2 : ℕ) := by + have hsqrt_sq : (Real.sqrt A) ^ (2 : ℕ) = A := by + rw [Real.sq_sqrt hA_nonneg] + field_simp [hσsq_pos.ne'] + conv_lhs => rw [← hsqrt_sq] + ring_nf + have hcross : 0 ≤ a * (σ * Real.sqrt A) := + mul_nonneg ha_nonneg (mul_nonneg hσ_pos.le (Real.sqrt_nonneg A)) + linarith + rw [hlog_cut] + calc + Real.log (2 * R) + ((σ ^ (2 : ℕ))⁻¹ * a ^ (2 : ℕ) + Real.log 2) + = (σ ^ (2 : ℕ))⁻¹ * a ^ (2 : ℕ) + A := by + rw [← hlog_four] + ring + _ ≤ (σ ^ (2 : ℕ))⁻¹ * (a + σ * Real.sqrt A) ^ (2 : ℕ) := hquad + +lemma exp_mul_sqrt_log_four_mul_le {σ R : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) : + Real.exp (σ * Real.sqrt (Real.log (4 * R))) ≤ + 2 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R := by + have hσ_nonneg : 0 ≤ σ := le_trans zero_le_one hσ + have hR_nonneg : 0 ≤ R := le_trans zero_le_one hR + have hfourR_pos : 0 < 4 * R := by positivity + let A : ℝ := Real.log (4 * R) + have hA_nonneg : 0 ≤ A := by + have hfourR : 1 ≤ 4 * R := by + calc + (1 : ℝ) ≤ 4 := by norm_num + _ = 4 * 1 := by ring + _ ≤ 4 * R := mul_le_mul_of_nonneg_left hR (by norm_num) + exact Real.log_nonneg hfourR + have hyoung : σ * Real.sqrt A ≤ σ ^ (2 : ℕ) / 2 + A / 2 := by + have hsqrt_sq : (Real.sqrt A) ^ (2 : ℕ) = A := by + rw [Real.sq_sqrt hA_nonneg] + have hdiff : 0 ≤ σ ^ (2 : ℕ) / 2 + A / 2 - σ * Real.sqrt A := by + calc + 0 ≤ (σ - Real.sqrt A) ^ (2 : ℕ) / 2 := + div_nonneg (sq_nonneg _) (by norm_num) + _ = σ ^ (2 : ℕ) / 2 + (Real.sqrt A) ^ (2 : ℕ) / 2 - + σ * Real.sqrt A := by + ring + _ = σ ^ (2 : ℕ) / 2 + A / 2 - σ * Real.sqrt A := by + rw [hsqrt_sq] + exact sub_nonneg.mp hdiff + have hexp := + Real.exp_le_exp.2 hyoung + have hhalf : + Real.exp (A / 2) = Real.sqrt (4 * R) := by + rw [Real.sqrt_eq_rpow, Real.rpow_def_of_pos hfourR_pos] + congr 1 + ring + have hsqrt_four : Real.sqrt (4 * R) = 2 * Real.sqrt R := by + have hleft_nonneg : 0 ≤ 4 * R := by positivity + have hright_nonneg : 0 ≤ 2 * Real.sqrt R := by positivity + rw [Real.sqrt_eq_iff_eq_sq hleft_nonneg hright_nonneg] + rw [mul_pow, Real.sq_sqrt hR_nonneg] + norm_num + calc + Real.exp (σ * Real.sqrt (Real.log (4 * R))) + = Real.exp (σ * Real.sqrt A) := by simp [A] + _ ≤ Real.exp (σ ^ (2 : ℕ) / 2 + A / 2) := hexp + _ = Real.exp (σ ^ (2 : ℕ) / 2) * Real.exp (A / 2) := by + rw [Real.exp_add] + _ = 2 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R := by + rw [hhalf, hsqrt_four] + ring + +lemma psiSigmaIndependentSumCutoff_le_four_mul_exp_mul_sqrt_mul {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + psiSigmaIndependentSumCutoff σ R t ≤ + 4 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have harg_bound : 1 + σ * t ≤ 2 * σ * t := by + have hone_le_σt : (1 : ℝ) ≤ σ * t := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ σ * t := mul_le_mul hσ ht zero_le_one hσ_pos.le + linarith + have hexp_bound := + exp_mul_sqrt_log_four_mul_le (σ := σ) (R := R) hσ hR + calc + psiSigmaIndependentSumCutoff σ R t + ≤ ((1 + σ * t) * + Real.exp (σ * Real.sqrt (Real.log (4 * R)))) / σ := by + dsimp [psiSigmaIndependentSumCutoff] + rw [div_le_div_iff₀ hσ_pos hσ_pos] + linarith + _ ≤ (2 * σ * t * + (2 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R)) / σ := by + exact div_le_div_of_nonneg_right + (mul_le_mul harg_bound hexp_bound (by positivity) (by positivity)) + hσ_pos.le + _ = 4 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t := by + field_simp [hσ_pos.ne'] + ring + +lemma eight_mul_psiSigmaIndependentSumCutoff_le_const_mul_sqrt_mul {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + 8 * psiSigmaIndependentSumCutoff σ R t ≤ + psiSigmaIndependentSumConst σ * Real.sqrt R * t := by + have hcut := + psiSigmaIndependentSumCutoff_le_four_mul_exp_mul_sqrt_mul + (σ := σ) (R := R) (t := t) hσ hR ht + have hraw_sqrt : 1 ≤ Real.sqrt (psiSigmaIndependentSumRawConst σ) := by + rw [← Real.sqrt_one] + exact Real.sqrt_le_sqrt (one_le_psiSigmaIndependentSumRawConst σ) + have hnonneg : 0 ≤ Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t := by + positivity + calc + 8 * psiSigmaIndependentSumCutoff σ R t + ≤ 8 * (4 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t) := by + exact mul_le_mul_of_nonneg_left hcut (by norm_num) + _ ≤ psiSigmaIndependentSumConst σ * Real.sqrt R * t := by + dsimp [psiSigmaIndependentSumConst] + have hfactor : + (32 : ℝ) ≤ 128 * Real.sqrt (psiSigmaIndependentSumRawConst σ) := by + calc + (32 : ℝ) ≤ 128 * 1 := by norm_num + _ ≤ 128 * Real.sqrt (psiSigmaIndependentSumRawConst σ) := + mul_le_mul_of_nonneg_left hraw_sqrt (by norm_num) + have hmul := mul_le_mul_of_nonneg_right hfactor hnonneg + calc + 8 * (4 * Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t) + = 32 * (Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t) := by + ring + _ ≤ (128 * Real.sqrt (psiSigmaIndependentSumRawConst σ)) * + (Real.exp (σ ^ (2 : ℕ) / 2) * Real.sqrt R * t) := hmul + _ = 128 * Real.exp (σ ^ (2 : ℕ) / 2) * + Real.sqrt (psiSigmaIndependentSumRawConst σ) * Real.sqrt R * t := by + ring + +lemma four_mul_log_le_half_log_psiSigma_add_const {σ t : ℝ} + (hσ : 1 ≤ σ) (ht : 1 ≤ t) : + 4 * Real.log t ≤ + (1 / 2 : ℝ) * Real.log (psiSigma σ t) + 8 * σ ^ (2 : ℕ) := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσsq_pos : 0 < σ ^ (2 : ℕ) := sq_pos_of_pos hσ_pos + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have harg_le : t ≤ 1 + σ * t := by + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have hσt_ge_t : t ≤ σ * t := by + simpa [one_mul] using mul_le_mul_of_nonneg_right hσ ht_nonneg + linarith + have hlog_le : Real.log t ≤ Real.log (1 + σ * t) := + Real.log_le_log ht_pos harg_le + have hlogt_nonneg : 0 ≤ Real.log t := Real.log_nonneg ht + have hlogarg_nonneg : 0 ≤ Real.log (1 + σ * t) := by + exact le_trans hlogt_nonneg hlog_le + have hsq_le : + (Real.log t) ^ (2 : ℕ) ≤ (Real.log (1 + σ * t)) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ hlogt_nonneg hlog_le 2 + have hquad : + 4 * Real.log t ≤ + (Real.log t) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) + 8 * σ ^ (2 : ℕ) := by + let s : ℝ := σ ^ (2 : ℕ) + have hs_pos : 0 < s := by + simpa [s] using hσsq_pos + have hsq_nonneg : 0 ≤ (Real.log t - 4 * s) ^ (2 : ℕ) := sq_nonneg _ + have hsq_expand : + (Real.log t - 4 * s) ^ (2 : ℕ) = + (Real.log t) ^ (2 : ℕ) - 8 * s * Real.log t + 16 * s ^ (2 : ℕ) := by + ring + have hquad : 8 * s * Real.log t ≤ (Real.log t) ^ (2 : ℕ) + 16 * s ^ (2 : ℕ) := by + rw [hsq_expand] at hsq_nonneg + linarith + have hrewrite : + (Real.log t) ^ (2 : ℕ) / (2 * s) + 8 * s = + ((Real.log t) ^ (2 : ℕ) + 16 * s ^ (2 : ℕ)) / (2 * s) := by + field_simp [hs_pos.ne'] + ring + change 4 * Real.log t ≤ (Real.log t) ^ (2 : ℕ) / (2 * s) + 8 * s + rw [hrewrite] + rw [le_div_iff₀ (show 0 < 2 * s by positivity)] + linarith + have hhalf_le : + (Real.log t) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) ≤ + (Real.log (1 + σ * t)) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) := by + exact div_le_div_of_nonneg_right hsq_le (by positivity : 0 ≤ 2 * σ ^ (2 : ℕ)) + have hmain : + 4 * Real.log t ≤ + (Real.log (1 + σ * t)) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) + + 8 * σ ^ (2 : ℕ) := by + calc + 4 * Real.log t ≤ + (Real.log t) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) + 8 * σ ^ (2 : ℕ) := hquad + _ = 8 * σ ^ (2 : ℕ) + (Real.log t) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) := by + ring + _ ≤ 8 * σ ^ (2 : ℕ) + + (Real.log (1 + σ * t)) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) := + add_le_add_right hhalf_le (8 * σ ^ (2 : ℕ)) + _ = (Real.log (1 + σ * t)) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) + + 8 * σ ^ (2 : ℕ) := by ring + have hrewrite : + (1 / 2 : ℝ) * Real.log (psiSigma σ t) = + (Real.log (1 + σ * t)) ^ (2 : ℕ) / (2 * σ ^ (2 : ℕ)) := by + rw [psiSigma, Real.log_exp] + field_simp [hσsq_pos.ne'] + rwa [hrewrite] + +lemma log_sq_le_four_mul_self_of_one_le {x : ℝ} (hx : 1 ≤ x) : + (Real.log x) ^ (2 : ℕ) ≤ 4 * x := by + have hx_nonneg : 0 ≤ x := le_trans zero_le_one hx + have hlog_nonneg : 0 ≤ Real.log x := Real.log_nonneg hx + have hlog_le : Real.log x ≤ 2 * Real.sqrt x := by + have h := Real.log_le_rpow_div hx_nonneg (by norm_num : (0 : ℝ) < 1 / 2) + simpa [Real.sqrt_eq_rpow, div_eq_mul_inv, mul_assoc, mul_comm] using h + have hsq := mul_le_mul hlog_le hlog_le hlog_nonneg (by positivity : 0 ≤ 2 * Real.sqrt x) + calc + (Real.log x) ^ (2 : ℕ) ≤ (2 * Real.sqrt x) ^ (2 : ℕ) := by + simpa [pow_two] using hsq + _ = 4 * x := by + rw [mul_pow, Real.sq_sqrt hx_nonneg] + ring + +lemma psiSigma_log_exponent_le_eight_mul_self {σ t : ℝ} + (hσ : 1 ≤ σ) (ht : 1 ≤ t) : + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) ≤ 8 * t := by + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσsq_pos : 0 < σ ^ (2 : ℕ) := by positivity + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have harg_one : 1 ≤ 1 + σ * t := + le_add_of_nonneg_right (mul_nonneg hσ_pos.le ht_nonneg) + have hlogsq : + (Real.log (1 + σ * t)) ^ (2 : ℕ) ≤ 4 * (1 + σ * t) := + log_sq_le_four_mul_self_of_one_le harg_one + have hσ_le_sq : σ ≤ σ ^ (2 : ℕ) := by + calc + σ = σ * 1 := by ring + _ ≤ σ * σ := mul_le_mul_of_nonneg_left hσ hσ_pos.le + _ = σ ^ (2 : ℕ) := by ring + have harg_bound : 4 * (1 + σ * t) ≤ 8 * (σ ^ (2 : ℕ) * t) := by + have hone_le_σt : (1 : ℝ) ≤ σ * t := by + calc + (1 : ℝ) = 1 * 1 := by ring + _ ≤ σ * t := mul_le_mul hσ ht zero_le_one hσ_pos.le + have harg_le : 1 + σ * t ≤ 2 * (σ * t) := by linarith + have hσt_le : σ * t ≤ σ ^ (2 : ℕ) * t := + mul_le_mul_of_nonneg_right hσ_le_sq ht_nonneg + calc + 4 * (1 + σ * t) ≤ 4 * (2 * (σ * t)) := + mul_le_mul_of_nonneg_left harg_le (by norm_num) + _ = 8 * (σ * t) := by ring + _ ≤ 8 * (σ ^ (2 : ℕ) * t) := + mul_le_mul_of_nonneg_left hσt_le (by norm_num) + calc + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + ≤ (σ ^ (2 : ℕ))⁻¹ * (8 * (σ ^ (2 : ℕ) * t)) := by + exact mul_le_mul_of_nonneg_left (hlogsq.trans harg_bound) + (inv_nonneg.mpr (sq_nonneg σ)) + _ = 8 * t := by + field_simp [hσsq_pos.ne'] + +lemma psiSigma_log_exponent_add_log_two_le_nine_mul_self {σ t : ℝ} + (hσ : 1 ≤ σ) (ht : 1 ≤ t) : + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + Real.log 2 ≤ + 9 * t := by + have hq := psiSigma_log_exponent_le_eight_mul_self (σ := σ) (t := t) hσ ht + have hlog_two : Real.log 2 ≤ (1 : ℝ) := by + have h := Real.log_le_sub_one_of_pos (by norm_num : (0 : ℝ) < 2) + norm_num at h + exact h + calc + (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) + Real.log 2 + ≤ 8 * t + 1 := add_le_add hq hlog_two + _ ≤ 8 * t + t := by + calc + 8 * t + 1 = 1 + 8 * t := by ring + _ ≤ t + 8 * t := add_le_add_left ht (8 * t) + _ = 8 * t + t := by ring + _ = 9 * t := by ring + +lemma psiSigmaIndependentSumLambda_nonneg {σ R t : ℝ} + (_hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + 0 ≤ psiSigmaIndependentSumLambda σ R t := by + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have hR_nonneg : 0 ≤ R := le_trans zero_le_one hR + have hq_nonneg : 0 ≤ psiSigmaLogExponent σ t := by + dsimp [psiSigmaLogExponent] + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg σ)) (sq_nonneg _) + have hlog_two_nonneg : 0 ≤ Real.log 2 := + Real.log_nonneg (by norm_num : (1 : ℝ) ≤ 2) + have hnum_nonneg : 0 ≤ 4 * (psiSigmaLogExponent σ t + Real.log 2) := by + exact mul_nonneg (by norm_num) (add_nonneg hq_nonneg hlog_two_nonneg) + have hden_nonneg : + 0 ≤ psiSigmaIndependentSumConst σ * Real.sqrt R * t := by + exact mul_nonneg + (mul_nonneg (psiSigmaIndependentSumConst_pos σ).le (Real.sqrt_nonneg R)) + ht_nonneg + dsimp [psiSigmaIndependentSumLambda] + exact div_nonneg hnum_nonneg hden_nonneg + +lemma psiSigmaIndependentSumLambda_le_one {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + psiSigmaIndependentSumLambda σ R t ≤ 1 := by + let Q : ℝ := psiSigmaLogExponent σ t + Real.log 2 + let B : ℝ := psiSigmaIndependentSumConst σ * Real.sqrt R + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hQ_le : Q ≤ 9 * t := by + dsimp [Q, psiSigmaLogExponent] + exact psiSigma_log_exponent_add_log_two_le_nine_mul_self (σ := σ) (t := t) hσ ht + have hExp_one : 1 ≤ Real.exp (σ ^ (2 : ℕ) / 2) := by + exact Real.one_le_exp (by positivity) + have hraw_one : 1 ≤ Real.sqrt (psiSigmaIndependentSumRawConst σ) := by + rw [← Real.sqrt_one] + exact Real.sqrt_le_sqrt (one_le_psiSigmaIndependentSumRawConst σ) + have hsqrtR_one : 1 ≤ Real.sqrt R := by + rw [← Real.sqrt_one] + exact Real.sqrt_le_sqrt hR + have hprod1 : + 1 ≤ Real.exp (σ ^ (2 : ℕ) / 2) * + Real.sqrt (psiSigmaIndependentSumRawConst σ) := by + simpa using + mul_le_mul hExp_one hraw_one (by norm_num : (0 : ℝ) ≤ 1) + (le_trans zero_le_one hExp_one) + have hprod2 : + 1 ≤ Real.exp (σ ^ (2 : ℕ) / 2) * + Real.sqrt (psiSigmaIndependentSumRawConst σ) * Real.sqrt R := by + simpa [mul_assoc] using + mul_le_mul hprod1 hsqrtR_one (by norm_num : (0 : ℝ) ≤ 1) + (le_trans zero_le_one hprod1) + have hB_ge : 36 ≤ B := by + have h128_le : 128 ≤ B := by + dsimp [B, psiSigmaIndependentSumConst] + simpa [mul_assoc] using + mul_le_mul_of_nonneg_left hprod2 (by norm_num : (0 : ℝ) ≤ 128) + exact (by norm_num : (36 : ℝ) ≤ 128).trans h128_le + have hB_pos : 0 < B := lt_of_lt_of_le (by norm_num : (0 : ℝ) < 36) hB_ge + have hnum_le : 4 * Q ≤ B * t := by + have h4Q : 4 * Q ≤ 36 * t := by + calc + 4 * Q ≤ 4 * (9 * t) := mul_le_mul_of_nonneg_left hQ_le (by norm_num) + _ = 36 * t := by ring + have h36 : 36 * t ≤ B * t := mul_le_mul_of_nonneg_right hB_ge ht_nonneg + exact h4Q.trans h36 + dsimp [psiSigmaIndependentSumLambda, Q, B] + rw [div_le_iff₀ (mul_pos hB_pos ht_pos)] + simpa [Q, B, mul_assoc] using hnum_le + +lemma psiSigmaIndependentSumLambda_le_half_cutoff_logExponent_div {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + psiSigmaIndependentSumLambda σ R t ≤ + (1 / 2 : ℝ) * + (psiSigmaLogExponent σ (psiSigmaIndependentSumCutoff σ R t) / + psiSigmaIndependentSumCutoff σ R t) := by + let Q : ℝ := psiSigmaLogExponent σ t + Real.log 2 + let B : ℝ := psiSigmaIndependentSumConst σ * Real.sqrt R + let L : ℝ := psiSigmaIndependentSumCutoff σ R t + let qL : ℝ := psiSigmaLogExponent σ L + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hL_one : 1 ≤ L := by + simpa [L] using + one_le_psiSigmaIndependentSumCutoff (σ := σ) (R := R) (t := t) hσ hR ht + have hL_pos : 0 < L := lt_of_lt_of_le zero_lt_one hL_one + have hB_pos : 0 < B := by + dsimp [B] + exact mul_pos (psiSigmaIndependentSumConst_pos σ) + (Real.sqrt_pos.2 (lt_of_lt_of_le zero_lt_one hR)) + have h8 : 8 * L ≤ B * t := by + simpa [B, L] using + eight_mul_psiSigmaIndependentSumCutoff_le_const_mul_sqrt_mul + (σ := σ) (R := R) (t := t) hσ hR ht + have hcoef : 4 / (B * t) ≤ 1 / (2 * L) := by + rw [div_le_div_iff₀ (mul_pos hB_pos ht_pos) (mul_pos (by norm_num) hL_pos)] + calc + 4 * (2 * L) = 8 * L := by ring + _ ≤ B * t := h8 + _ = 1 * (B * t) := by ring + have hQ_nonneg : 0 ≤ Q := by + have hq_nonneg : 0 ≤ psiSigmaLogExponent σ t := by + dsimp [psiSigmaLogExponent] + positivity + have hlog_two_nonneg : 0 ≤ Real.log 2 := + Real.log_nonneg (by norm_num : (1 : ℝ) ≤ 2) + dsimp [Q] + exact add_nonneg hq_nonneg hlog_two_nonneg + have hQ_le_qL : Q ≤ qL := by + have hunion := + psiSigmaIndependentSumCutoff_union_log (σ := σ) (R := R) (t := t) hσ hR ht + have hlog_nonneg : 0 ≤ Real.log (2 * R) := by + have htwoR : 1 ≤ 2 * R := by + calc + (1 : ℝ) ≤ 2 := by norm_num + _ = 2 * 1 := by ring + _ ≤ 2 * R := mul_le_mul_of_nonneg_left hR (by norm_num) + exact Real.log_nonneg htwoR + calc + Q ≤ Real.log (2 * R) + Q := by + exact (le_add_of_nonneg_left hlog_nonneg : Q ≤ Real.log (2 * R) + Q) + _ ≤ qL := by + simpa [Q, qL, psiSigmaLogExponent, add_assoc, add_comm, add_left_comm] using hunion + calc + psiSigmaIndependentSumLambda σ R t + = Q * (4 / (B * t)) := by + dsimp [psiSigmaIndependentSumLambda, Q, B, psiSigmaLogExponent] + ring + _ ≤ Q * (1 / (2 * L)) := by + exact mul_le_mul_of_nonneg_left hcoef hQ_nonneg + _ ≤ qL * (1 / (2 * L)) := by + exact mul_le_mul_of_nonneg_right hQ_le_qL (by positivity) + _ = (1 / 2 : ℝ) * (qL / L) := by + field_simp [hL_pos.ne'] + +lemma psiSigmaIndependentSumLambda_mgf_log {σ R t : ℝ} + (hσ : 1 ≤ σ) (hR : 1 ≤ R) (ht : 1 ≤ t) : + Real.log 2 + (psiSigmaLogExponent σ t + Real.log 2) + + R * (psiSigmaIndependentSumLambda σ R t ^ (2 : ℕ) * + psiSigmaIndependentSumRawConst σ) ≤ + psiSigmaIndependentSumLambda σ R t * + ((psiSigmaIndependentSumConst σ * Real.sqrt R) * t) := by + let Q : ℝ := psiSigmaLogExponent σ t + Real.log 2 + let D : ℝ := psiSigmaIndependentSumRawConst σ + let B : ℝ := psiSigmaIndependentSumConst σ * Real.sqrt R + let l : ℝ := psiSigmaIndependentSumLambda σ R t + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hR_nonneg : 0 ≤ R := le_trans zero_le_one hR + have hR_pos : 0 < R := lt_of_lt_of_le zero_lt_one hR + have hD_pos : 0 < D := by + dsimp [D] + exact psiSigmaIndependentSumRawConst_pos σ + have hD_nonneg : 0 ≤ D := hD_pos.le + have hB_pos : 0 < B := by + dsimp [B] + exact mul_pos (psiSigmaIndependentSumConst_pos σ) + (Real.sqrt_pos.2 hR_pos) + have hC_pos : 0 < psiSigmaIndependentSumConst σ := + psiSigmaIndependentSumConst_pos σ + have hQ_nonneg : 0 ≤ Q := by + have hq_nonneg : 0 ≤ psiSigmaLogExponent σ t := by + dsimp [psiSigmaLogExponent] + positivity + have hlog_two_nonneg : 0 ≤ Real.log 2 := + Real.log_nonneg (by norm_num : (1 : ℝ) ≤ 2) + dsimp [Q] + exact add_nonneg hq_nonneg hlog_two_nonneg + have hQ_le : Q ≤ 9 * t := by + dsimp [Q, psiSigmaLogExponent] + exact psiSigma_log_exponent_add_log_two_le_nine_mul_self (σ := σ) (t := t) hσ ht + have hlog_two_le_Q : Real.log 2 ≤ Q := by + have hq_nonneg : 0 ≤ psiSigmaLogExponent σ t := by + dsimp [psiSigmaLogExponent] + positivity + dsimp [Q] + exact (le_add_of_nonneg_left hq_nonneg : + Real.log 2 ≤ psiSigmaLogExponent σ t + Real.log 2) + have hlBt : l * (B * t) = 4 * Q := by + dsimp [l, B, Q, psiSigmaIndependentSumLambda] + field_simp [hB_pos.ne', hC_pos.ne', ht_pos.ne'] + have hvar_le_Q : R * (l ^ (2 : ℕ) * D) ≤ Q := by + have hQ_le_big : Q ≤ 1024 * t ^ (2 : ℕ) := by + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have ht_le_sq : t ≤ t ^ (2 : ℕ) := by + calc + t = t * 1 := by ring + _ ≤ t * t := mul_le_mul_of_nonneg_left ht ht_nonneg + _ = t ^ (2 : ℕ) := by ring + calc + Q ≤ 9 * t := hQ_le + _ ≤ 1024 * t := mul_le_mul_of_nonneg_right (by norm_num : (9 : ℝ) ≤ 1024) ht_nonneg + _ ≤ 1024 * t ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left ht_le_sq (by norm_num) + have hvar_eq : + R * (l ^ (2 : ℕ) * D) = + (Q ^ (2 : ℕ)) / + (1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * t ^ (2 : ℕ)) := by + subst D + dsimp [l, B, Q, psiSigmaIndependentSumLambda, psiSigmaIndependentSumConst] + field_simp [hR_pos.ne', (psiSigmaIndependentSumRawConst_pos σ).ne', + hC_pos.ne', ht_pos.ne', + (Real.exp_pos (σ ^ (2 : ℕ) / 2)).ne'] + rw [Real.sq_sqrt hR_nonneg, + Real.sq_sqrt (psiSigmaIndependentSumRawConst_pos σ).le] + ring_nf + rw [hvar_eq] + have hden_ge : 1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * t ^ (2 : ℕ) ≥ + Q := by + have hexp_sq_one : 1 ≤ (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) := by + have hone : 1 ≤ Real.exp (σ ^ (2 : ℕ) / 2) := Real.one_le_exp (by positivity) + exact one_le_pow₀ hone + have hbase_nonneg : 0 ≤ 1024 * t ^ (2 : ℕ) := by positivity + have hbase_le : + 1024 * t ^ (2 : ℕ) ≤ + 1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * t ^ (2 : ℕ) := by + calc + 1024 * t ^ (2 : ℕ) = 1 * (1024 * t ^ (2 : ℕ)) := by ring + _ ≤ (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * + (1024 * t ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_right hexp_sq_one hbase_nonneg + _ = 1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * + t ^ (2 : ℕ) := by ring + exact hQ_le_big.trans hbase_le + have hden_pos : + 0 < 1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * t ^ (2 : ℕ) := by + positivity + rw [div_le_iff₀ hden_pos] + calc + Q ^ (2 : ℕ) = Q * Q := by ring + _ ≤ Q * + (1024 * (Real.exp (σ ^ (2 : ℕ) / 2)) ^ (2 : ℕ) * t ^ (2 : ℕ)) := + mul_le_mul_of_nonneg_left hden_ge hQ_nonneg + rw [hlBt] + calc + Real.log 2 + Q + R * (l ^ (2 : ℕ) * D) ≤ Q + Q + Q := by + exact add_le_add (add_le_add hlog_two_le_Q le_rfl) hvar_le_Q + _ = 3 * Q := by ring + _ ≤ 4 * Q := + mul_le_mul_of_nonneg_right (by norm_num : (3 : ℝ) ≤ 4) hQ_nonneg + +/-- Turn a local linear-control estimate into the generic logarithmic +constraint needed by the raw `Ψ_σ` Chernoff theorem. -/ +lemma psiSigma_log_constraint_of_linear_control {σ l L C u : ℝ} + (hσ : 1 ≤ σ) (hu : u ∈ Set.Icc 1 L) + (hlinear : ∀ ⦃v : ℝ⦄, v ∈ Set.Icc 1 L → + l * v ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ v) + C) : + l * u ≤ + Real.log (psiSigma σ u) - 4 * Real.log u + + Real.log (psiSigmaPolynomialLogControlConst σ C) := by + have hlin := hlinear hu + have hpoly := four_mul_log_le_half_log_psiSigma_add_const (σ := σ) (t := u) hσ hu.1 + rw [psiSigmaPolynomialLogControlConst, Real.log_exp] + linarith + +lemma psiSigma_linear_control_of_mul_le_const {σ l L C u : ℝ} + (hl : 0 ≤ l) (hC : l * L ≤ C) (hu : u ∈ Set.Icc 1 L) : + l * u ≤ (1 / 2 : ℝ) * Real.log (psiSigma σ u) + C := by + have hlog_nonneg : 0 ≤ Real.log (psiSigma σ u) := + Real.log_nonneg one_le_psiSigma + have hlu : l * u ≤ l * L := mul_le_mul_of_nonneg_left hu.2 hl + linarith + + +end + +end IndependentSums + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal.lean new file mode 100644 index 0000000000..e3c7378c80 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettFunction +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettKernel +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Truncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ScalarBennett +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.CenteredTruncation +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetric +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetrization +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ProductDifference +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Endpoint +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Corollaries + +/-! # Rosenthal -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettFunction.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettFunction.lean new file mode 100644 index 0000000000..648e783c02 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettFunction.lean @@ -0,0 +1,280 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Log.NegMulLog +public import Mathlib.Analysis.SpecialFunctions.Integrals.Basic +public import Mathlib.Analysis.SpecialFunctions.ImproperIntegrals +public import Mathlib.Algebra.Order.BigOperators.Group.Finset +public import Mathlib.Analysis.Convex.Integral +public import Mathlib.Analysis.Convex.Mul +public import Mathlib.Analysis.Normed.Module.Convex +public import Mathlib.Analysis.SpecialFunctions.Pow.Integral +public import Mathlib.Probability.Moments.Basic +public import Mathlib.MeasureTheory.Integral.Layercake +public import Mathlib.MeasureTheory.Integral.Prod +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.IndependentCopy +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz + +/-! # Bennett Function -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The Bennett function `h(r) = (1 + r) log (1 + r) - r`. -/ +noncomputable def bennettH (r : ℝ) : ℝ := + (1 + r) * Real.log (1 + r) - r + +/-- The Bennett quotient `β(r) = h(r) / r` on `(0, ∞)`. -/ +noncomputable def bennettBeta (r : ℝ) : ℝ := + bennettH r / r + +/-- An explicit universal threshold for the large-scale Bennett lower bound. -/ +noncomputable def bennettLargeScaleThreshold : ℝ := + Real.exp 4 + +@[simp] theorem bennettH_zero : bennettH 0 = 0 := by + simp [bennettH] + +theorem hasDerivAt_bennettH {r : ℝ} (hr : r ≠ -1) : + HasDerivAt bennettH (Real.log (1 + r)) r := by + have h1r : 1 + r ≠ 0 := by + intro h + apply hr + linarith + have hshift' : + HasDerivAt (((fun x : ℝ => x * Real.log x) ∘ HAdd.hAdd 1)) + ((Real.log (1 + r) + 1) * 1) r := by + exact (Real.hasDerivAt_mul_log (x := 1 + r) h1r).comp r + ((hasDerivAt_id r).const_add 1) + have hshift : + HasDerivAt (fun t : ℝ => (1 + t) * Real.log (1 + t)) + (Real.log (1 + r) + 1) r := by + have h2 := hshift' + simp only [mul_one] at h2 + exact h2 + have hsub := hshift.sub (hasDerivAt_id r) + have hval : Real.log (1 + r) + 1 - 1 = Real.log (1 + r) := by ring + rw [hval] at hsub + exact hsub + +theorem differentiableAt_bennettH {r : ℝ} (hr : r ≠ -1) : + DifferentiableAt ℝ bennettH r := + (hasDerivAt_bennettH hr).differentiableAt + +theorem deriv_bennettH {r : ℝ} (hr : r ≠ -1) : + deriv bennettH r = Real.log (1 + r) := + (hasDerivAt_bennettH hr).deriv + +theorem differentiableOn_bennettH : + DifferentiableOn ℝ bennettH (Set.Ioi (-1 : ℝ)) := by + intro r hr + have hr' : (-1 : ℝ) < r := hr + exact (differentiableAt_bennettH (by + intro h + rw [h] at hr' + exact (lt_irrefl (-1 : ℝ)) hr')).differentiableWithinAt + +theorem deriv2_bennettH {r : ℝ} (hr : r ≠ -1) : + deriv^[2] bennettH r = (1 + r)⁻¹ := by + simp only [Function.iterate_succ, Function.iterate_zero, Function.id_comp, Function.comp_apply] + suffices hEq : ∀ᶠ y in 𝓝 r, deriv bennettH y = Real.log (1 + y) by + have h1r : 1 + r ≠ 0 := by + intro h + apply hr + linarith + refine (Filter.EventuallyEq.deriv_eq hEq).trans ?_ + have hlog' : + HasDerivAt (Real.log ∘ HAdd.hAdd 1) ((1 + r)⁻¹ * 1) r := by + exact (Real.hasDerivAt_log h1r).comp r ((hasDerivAt_id r).const_add 1) + have h2 := hlog'.deriv + simp only [mul_one] at h2 + exact h2 + filter_upwards [eventually_ne_nhds hr] with y hy + exact deriv_bennettH hy + +theorem bennettBeta_eq_slope_mul_log_sub_one {r : ℝ} (hr : r ≠ 0) : + bennettBeta r = slope (fun x : ℝ => x * Real.log x) 1 (1 + r) - 1 := by + rw [bennettBeta, slope_def_field, bennettH, Real.log_one] + field_simp [hr] + ring + +theorem monotoneOn_bennettBeta : MonotoneOn bennettBeta (Set.Ioi 0) := by + intro r hr s hs hrs + have hr' : 0 < r := hr + have hs' : 0 < s := hs + have hmem_r : 1 + r ∈ {y ∈ Set.Ici (0 : ℝ) | 1 < y} := by + constructor + · show 0 ≤ 1 + r + linarith + · show 1 < 1 + r + linarith + have hmem_s : 1 + s ∈ {y ∈ Set.Ici (0 : ℝ) | 1 < y} := by + constructor + · show 0 ≤ 1 + s + linarith + · show 1 < 1 + s + linarith + have hslope : + slope (fun x : ℝ => x * Real.log x) 1 (1 + r) ≤ + slope (fun x : ℝ => x * Real.log x) 1 (1 + s) := by + exact Real.convexOn_mul_log.monotoneOn_slope_gt (by simp) + hmem_r + hmem_s + (by linarith) + rw [bennettBeta_eq_slope_mul_log_sub_one hr.ne', + bennettBeta_eq_slope_mul_log_sub_one hs.ne'] + linarith + +theorem bennettBeta_nonneg {r : ℝ} (hr : 0 < r) : + 0 ≤ bennettBeta r := by + have hslope : 1 ≤ slope (fun x : ℝ => x * Real.log x) 1 (1 + r) := by + have hderiv : HasDerivAt (fun x : ℝ => x * Real.log x) 1 1 := by + simpa using (Real.hasDerivAt_mul_log (x := 1) one_ne_zero) + simpa [Real.log_one] using + (Real.convexOn_mul_log.le_slope_of_hasDerivAt + (hx := by simp) + (hy := by + show 0 ≤ 1 + r + linarith) + (hxy := by + show 1 < 1 + r + linarith) + hderiv) + rw [bennettBeta_eq_slope_mul_log_sub_one hr.ne'] + linarith + +theorem bennettH_nonneg {r : ℝ} (hr : 0 ≤ r) : + 0 ≤ bennettH r := by + by_cases hzero : r = 0 + · simp [hzero, bennettH] + · have hr_pos : 0 < r := lt_of_le_of_ne hr (by simpa [eq_comm] using hzero) + have hbeta : 0 ≤ bennettBeta r := bennettBeta_nonneg hr_pos + calc + 0 ≤ r * bennettBeta r := mul_nonneg hr hbeta + _ = bennettH r := by + rw [bennettBeta] + field_simp [hzero] + +theorem one_quarter_sq_le_bennettH_of_mem_Icc {r : ℝ} (hr : r ∈ Set.Icc 0 1) : + r ^ (2 : ℕ) / 4 ≤ bennettH r := by + let k : ℝ → ℝ := fun t => bennettH t - t ^ (2 : ℕ) / 4 + have hk_cont : ContinuousOn k (Set.Icc 0 1) := by + refine (((Real.continuous_mul_log.comp (continuous_const.add continuous_id')).sub + continuous_id).sub ((continuous_id.pow 2).div_const (4 : ℝ))).continuousOn + have hk_diff : DifferentiableOn ℝ k (interior (Set.Icc (0 : ℝ) 1)) := by + intro x hx + have hx' : x ∈ Set.Ioo (0 : ℝ) 1 := by + simpa using hx + have hxne : x ≠ -1 := by + intro h + have : (0 : ℝ) < -1 := by simpa [h] using hx'.1 + linarith + exact ((differentiableAt_bennettH hxne).sub + ((differentiableAt_id.pow 2).div_const (4 : ℝ))).differentiableWithinAt + have hk_deriv_nonneg : + ∀ x ∈ interior (Set.Icc (0 : ℝ) 1), 0 ≤ deriv k x := by + intro x hx + have hx' : x ∈ Set.Ioo (0 : ℝ) 1 := by + simpa using hx + have hxne : x ≠ -1 := by + intro h + have : (0 : ℝ) < -1 := by simpa [h] using hx'.1 + linarith + have hx_nonneg : 0 ≤ x := le_of_lt hx'.1 + have hx_two_pos : 0 < x + 2 := by linarith + have hquad : deriv (fun t : ℝ => t ^ (2 : ℕ) / 4) x = x / 2 := by + rw [deriv_div_const] + rw [deriv_fun_pow (f := fun t : ℝ => t) (x := x) differentiableAt_id 2] + simp [pow_one, deriv_id''] + ring + have hk_deriv : deriv k x = Real.log (1 + x) - x / 2 := by + have hsub : + deriv k x = deriv bennettH x - deriv (fun t : ℝ => t ^ (2 : ℕ) / 4) x := by + show deriv (bennettH - fun t : ℝ => t ^ (2 : ℕ) / 4) x = + deriv bennettH x - deriv (fun t : ℝ => t ^ (2 : ℕ) / 4) x + exact deriv_sub (f := bennettH) (g := fun t : ℝ => t ^ (2 : ℕ) / 4) + (x := x) (hf := differentiableAt_bennettH hxne) + (hg := (differentiableAt_id.pow 2).div_const (4 : ℝ)) + rw [hsub, deriv_bennettH hxne, hquad] + have hlog_lower : x / 2 ≤ Real.log (1 + x) := by + refine le_trans ?_ (Real.le_log_one_add_of_nonneg hx_nonneg) + field_simp [hx_two_pos.ne'] + nlinarith [hx'.1, hx'.2] + rw [hk_deriv] + linarith + have hk_mono : MonotoneOn k (Set.Icc 0 1) := by + refine monotoneOn_of_deriv_nonneg (convex_Icc 0 1) hk_cont hk_diff hk_deriv_nonneg + have hk_nonneg : 0 ≤ k r := by + have hmono := hk_mono (by simp) hr hr.1 + simpa [k, bennettH] using hmono + dsimp [k] at hk_nonneg + linarith + +theorem log_sub_one_le_bennettBeta {r : ℝ} (hr : 0 < r) : + Real.log r - 1 ≤ bennettBeta r := by + have hcoef : 1 ≤ (1 + r) / r := by + field_simp [hr.ne'] + nlinarith + have hlog_mono : Real.log r ≤ Real.log (1 + r) := by + exact Real.log_le_log hr (by linarith) + have hlog_nonneg : 0 ≤ Real.log (1 + r) := by + exact Real.log_nonneg (by linarith) + have hmul : + Real.log (1 + r) ≤ ((1 + r) / r) * Real.log (1 + r) := by + simpa using mul_le_mul_of_nonneg_right hcoef hlog_nonneg + calc + Real.log r - 1 ≤ Real.log (1 + r) - 1 := by linarith + _ ≤ ((1 + r) / r) * Real.log (1 + r) - 1 := by linarith + _ = bennettBeta r := by + unfold bennettBeta bennettH + ring_nf + field_simp [hr.ne'] + +theorem two_le_bennettLargeScaleThreshold : + 2 ≤ bennettLargeScaleThreshold := by + dsimp [bennettLargeScaleThreshold] + have h : (4 : ℝ) + 1 < Real.exp 4 := by + exact Real.add_one_lt_exp (show (4 : ℝ) ≠ 0 by norm_num) + linarith + +theorem three_quarters_log_le_bennettBeta_of_bennettLargeScaleThreshold_le {r : ℝ} + (hr : bennettLargeScaleThreshold ≤ r) : + (3 / 4 : ℝ) * Real.log r ≤ bennettBeta r := by + have hr' : Real.exp 4 ≤ r := by + simpa [bennettLargeScaleThreshold] using hr + have hr_pos : 0 < r := lt_of_lt_of_le (Real.exp_pos 4) hr' + have hlog_ge_four : 4 ≤ Real.log r := by + simpa using (Real.log_le_log (Real.exp_pos 4) hr') + have hmain : Real.log r - 1 ≤ bennettBeta r := + log_sub_one_le_bennettBeta hr_pos + have hcomp : (3 / 4 : ℝ) * Real.log r ≤ Real.log r - 1 := by + linarith + exact hcomp.trans hmain + +theorem exists_bennettBeta_ge_three_quarters_log : + ∃ r0 ∈ Set.Ici (2 : ℝ), ∀ {r : ℝ}, r0 ≤ r → + (3 / 4 : ℝ) * Real.log r ≤ bennettBeta r := by + refine ⟨bennettLargeScaleThreshold, two_le_bennettLargeScaleThreshold, ?_⟩ + intro r hr + exact three_quarters_log_le_bennettBeta_of_bennettLargeScaleThreshold_le hr + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettKernel.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettKernel.lean new file mode 100644 index 0000000000..f6b4dca004 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/BennettKernel.lean @@ -0,0 +1,591 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettFunction + +/-! # Bennett Kernel -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The Bennett kernel is pointwise dominated by the pure power `r^(p-1)` on +the nonnegative half-line. -/ +theorem bennettKernel_le_rpow + {p r : ℝ} (hp : 0 ≤ p) (hr : 0 ≤ r) : + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) ≤ r ^ (p - 1) := by + by_cases hr0 : r = 0 + · simp [hr0, bennettBeta, bennettH_zero] + · have hr_pos : 0 < r := lt_of_le_of_ne hr (Ne.symm hr0) + have hbeta : 0 ≤ bennettBeta (r ^ (2 : ℕ)) := by + exact bennettBeta_nonneg (by positivity) + have hexp_le_one : Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) ≤ 1 := by + rw [Real.exp_le_one_iff] + exact neg_nonpos.mpr (mul_nonneg hp hbeta) + have hpow_nonneg : 0 ≤ r ^ (p - 1) := Real.rpow_nonneg hr _ + simpa [mul_comm, mul_left_comm, mul_assoc] using + mul_le_mul_of_nonneg_left hexp_le_one hpow_nonneg + +/-- Beyond the large-scale Bennett threshold `exp 2`, the Rosenthal kernel is +dominated by the integrable tail power `r^(-p/2 - 1)`. -/ +theorem bennettKernel_le_rpowTail + {p r : ℝ} (hp : 2 ≤ p) (hr : Real.exp 2 ≤ r) : + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) ≤ r ^ (-p / 2 - 1) := by + have hp_nonneg : 0 ≤ p := le_trans zero_le_two hp + have hr_pos : 0 < r := lt_of_lt_of_le (by positivity : 0 < Real.exp 2) hr + have hr_sq : + bennettLargeScaleThreshold ≤ r ^ (2 : ℕ) := by + calc + bennettLargeScaleThreshold = (Real.exp 2) ^ (2 : ℕ) := by + rw [bennettLargeScaleThreshold, show (4 : ℝ) = 2 + 2 by norm_num, Real.exp_add, pow_two] + _ ≤ r ^ (2 : ℕ) := by + gcongr + have hbeta : + (3 / 2 : ℝ) * Real.log r ≤ bennettBeta (r ^ (2 : ℕ)) := by + have hmain := three_quarters_log_le_bennettBeta_of_bennettLargeScaleThreshold_le hr_sq + have hlog : Real.log (r ^ (2 : ℕ)) = 2 * Real.log r := by + rw [pow_two, Real.log_mul hr_pos.ne' hr_pos.ne'] + ring + have hrewrite : (3 / 4 : ℝ) * Real.log (r ^ (2 : ℕ)) = (3 / 2 : ℝ) * Real.log r := by + rw [hlog] + ring + calc + (3 / 2 : ℝ) * Real.log r = (3 / 4 : ℝ) * Real.log (r ^ (2 : ℕ)) := by + exact hrewrite.symm + _ ≤ bennettBeta (r ^ (2 : ℕ)) := hmain + have hexp_le : + Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) ≤ + Real.exp (-(p * ((3 / 2 : ℝ) * Real.log r))) := by + apply Real.exp_monotone + linarith [mul_le_mul_of_nonneg_left hbeta hp_nonneg] + calc + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + ≤ r ^ (p - 1) * Real.exp (-(p * ((3 / 2 : ℝ) * Real.log r))) := by + gcongr + _ = r ^ (p - 1) * r ^ (-(3 / 2 : ℝ) * p) := by + have hexp_eq : + Real.exp (-(p * ((3 / 2 : ℝ) * Real.log r))) = r ^ (-(3 / 2 : ℝ) * p) := by + rw [Real.rpow_def_of_pos hr_pos] + congr 1 + ring + rw [hexp_eq] + _ = r ^ (-p / 2 - 1) := by + rw [← Real.rpow_add hr_pos] + congr 1 + ring + +private theorem bennett_kernel_integrable_regions + {p : ℝ} (hp : 2 ≤ p) : + let f : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + IntegrableOn f (Set.Icc (0 : ℝ) 1) volume ∧ + IntegrableOn f (Set.Icc (1 : ℝ) (Real.exp 2)) volume ∧ + IntegrableOn (fun r : ℝ => r ^ (-p / 2 - 1)) (Set.Ioi (Real.exp 2)) volume ∧ + IntegrableOn f (Set.Ioi (Real.exp 2)) volume := by + let f : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_two hp + have hp_nonneg : 0 ≤ p := hp_pos.le + have hp_sub_nonneg : 0 ≤ p - 1 := by linarith + have hf_meas : Measurable f := by + dsimp [f] + have hpow_meas : Measurable (fun r : ℝ => r ^ (p - 1)) := + (Real.continuous_rpow_const hp_sub_nonneg).measurable + have hbeta_meas : Measurable (fun r : ℝ => bennettBeta (r ^ (2 : ℕ))) := by + dsimp [bennettBeta, bennettH] + measurability + exact hpow_meas.mul (Real.measurable_exp.comp ((measurable_const.mul hbeta_meas).neg)) + have hsmall_const : + Integrable (fun _ : ℝ => (1 : ℝ)) (volume.restrict (Set.Icc (0 : ℝ) 1)) := by + exact integrableOn_const (μ := volume) (s := Set.Icc (0 : ℝ) 1) (C := (1 : ℝ)) + isCompact_Icc.measure_ne_top + have hsmall_Icc : + Integrable f (volume.restrict (Set.Icc (0 : ℝ) 1)) := by + refine Integrable.mono' hsmall_const hf_meas.aestronglyMeasurable ?_ + filter_upwards [self_mem_ae_restrict measurableSet_Icc] with r hr + have hfr_le : f r ≤ r ^ (p - 1) := bennettKernel_le_rpow hp_nonneg hr.1 + have hrpow_le_one : r ^ (p - 1) ≤ 1 := Real.rpow_le_one hr.1 hr.2 hp_sub_nonneg + have hnonneg : 0 ≤ f r := by + dsimp [f] + exact mul_nonneg (Real.rpow_nonneg hr.1 _) (by positivity) + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hfr_le.trans hrpow_le_one + have hmid_const : + Integrable (fun _ : ℝ => (Real.exp 2) ^ (p - 1)) + (volume.restrict (Set.Icc (1 : ℝ) (Real.exp 2))) := by + exact integrableOn_const (μ := volume) (s := Set.Icc (1 : ℝ) (Real.exp 2)) + (C := (Real.exp 2) ^ (p - 1)) isCompact_Icc.measure_ne_top + have hmid_Icc : + Integrable f (volume.restrict (Set.Icc (1 : ℝ) (Real.exp 2))) := by + refine Integrable.mono' hmid_const hf_meas.aestronglyMeasurable ?_ + filter_upwards [self_mem_ae_restrict measurableSet_Icc] with r hr + have hr_nonneg : 0 ≤ r := le_trans zero_le_one hr.1 + have hfr_le : f r ≤ r ^ (p - 1) := bennettKernel_le_rpow hp_nonneg hr_nonneg + have hrpow_le : + r ^ (p - 1) ≤ (Real.exp 2) ^ (p - 1) := by + exact Real.rpow_le_rpow hr_nonneg hr.2 hp_sub_nonneg + have hnonneg : 0 ≤ f r := by + dsimp [f] + exact mul_nonneg (Real.rpow_nonneg hr_nonneg _) (by positivity) + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hfr_le.trans hrpow_le + have htail_dom : + Integrable (fun r : ℝ => r ^ (-p / 2 - 1)) + (volume.restrict (Set.Ioi (Real.exp 2))) := by + simpa using! + (integrableOn_Ioi_rpow_of_lt (a := -p / 2 - 1) (by linarith) (by positivity : 0 < Real.exp 2)) + have htail_Ioi : + Integrable f (volume.restrict (Set.Ioi (Real.exp 2))) := by + refine Integrable.mono' htail_dom hf_meas.aestronglyMeasurable ?_ + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with r hr + have hfr_le : f r ≤ r ^ (-p / 2 - 1) := bennettKernel_le_rpowTail hp (le_of_lt hr) + have hr_nonneg : 0 ≤ r := le_trans (le_of_lt (by positivity : 0 < Real.exp 2)) (le_of_lt hr) + have hnonneg : 0 ≤ f r := by + dsimp [f] + exact mul_nonneg (Real.rpow_nonneg hr_nonneg _) (by positivity) + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using hfr_le + exact ⟨hsmall_Icc, hmid_Icc, htail_dom, htail_Ioi⟩ + +/-- A universal bound for the Bennett kernel integral appearing in the +tail-integration step of Rosenthal's inequality. -/ +noncomputable def rosenthalBennettIntegralConst : ℝ := + 4 * Real.exp 2 + +theorem rosenthal_bennett_kernel_integral_le + {p : ℝ} (hp : 2 ≤ p) : + p * ∫ r in Set.Ioi (0 : ℝ), + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) ≤ + rosenthalBennettIntegralConst ^ p := by + let f : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_two hp + have hp_nonneg : 0 ≤ p := hp_pos.le + have h_one_exp_two : (1 : ℝ) ≤ Real.exp 2 := by + exact le_of_lt ((Real.one_lt_exp_iff).2 (by norm_num)) + obtain ⟨hsmall_Icc, hmid_Icc, htail_dom, htail_Ioi⟩ := + bennett_kernel_integrable_regions hp + have hsmall : + IntegrableOn f (Set.Ioc (0 : ℝ) 1) volume := by + change Integrable f (volume.restrict (Set.Ioc (0 : ℝ) 1)) + exact hsmall_Icc.mono_set Ioc_subset_Icc_self + have hmid : + IntegrableOn f (Set.Ioc (1 : ℝ) (Real.exp 2)) volume := by + change Integrable f (volume.restrict (Set.Ioc (1 : ℝ) (Real.exp 2))) + exact hmid_Icc.mono_set Ioc_subset_Icc_self + have htail : + IntegrableOn f (Set.Ioi (Real.exp 2)) volume := by + simpa [IntegrableOn] using htail_Ioi + have hpow_small : + IntervalIntegrable (fun r : ℝ => r ^ (p - 1)) volume 0 1 := by + exact intervalIntegral.intervalIntegrable_rpow' (by linarith) + have hpow_mid : + IntervalIntegrable (fun r : ℝ => r ^ (p - 1)) volume 1 (Real.exp 2) := by + exact intervalIntegral.intervalIntegrable_rpow' (by linarith) + have hsmall_bound : + p * ∫ r in Set.Ioc (0 : ℝ) 1, f r ≤ 1 := by + have hsmall_Icc_on : IntegrableOn f (Set.Icc (0 : ℝ) 1) volume := by + simpa [IntegrableOn] using hsmall_Icc + have hle : + ∫ r in Set.Ioc (0 : ℝ) 1, f r ≤ ∫ r in (0 : ℝ)..1, r ^ (p - 1) := by + have hsmall_interval : + IntervalIntegrable f volume (0 : ℝ) 1 := + (intervalIntegrable_iff_integrableOn_Icc_of_le zero_le_one).2 hsmall_Icc_on + rw [← intervalIntegral.integral_of_le zero_le_one] + exact intervalIntegral.integral_mono_on zero_le_one hsmall_interval hpow_small + (fun r hr => bennettKernel_le_rpow hp_nonneg hr.1) + have hcalc : + ∫ r in (0 : ℝ)..1, r ^ (p - 1) = 1 / p := by + rw [integral_rpow (a := (0 : ℝ)) (b := 1) (r := p - 1) (Or.inl (by linarith))] + simp [hp_pos.ne'] + have hmul := mul_le_mul_of_nonneg_left hle hp_nonneg + simpa [hcalc, div_eq_mul_inv, hp_pos.ne'] using hmul + have hmid_bound : + p * ∫ r in Set.Ioc (1 : ℝ) (Real.exp 2), f r ≤ (Real.exp 2) ^ p := by + have hmid_Icc_on : IntegrableOn f (Set.Icc (1 : ℝ) (Real.exp 2)) volume := by + simpa [IntegrableOn] using hmid_Icc + have hle : + ∫ r in Set.Ioc (1 : ℝ) (Real.exp 2), f r ≤ ∫ r in (1 : ℝ)..Real.exp 2, r ^ (p - 1) := by + have hmid_interval : + IntervalIntegrable f volume (1 : ℝ) (Real.exp 2) := + (intervalIntegrable_iff_integrableOn_Icc_of_le h_one_exp_two).2 hmid_Icc_on + rw [← intervalIntegral.integral_of_le h_one_exp_two] + exact intervalIntegral.integral_mono_on h_one_exp_two hmid_interval hpow_mid + (fun r hr => bennettKernel_le_rpow hp_nonneg (le_trans zero_le_one hr.1)) + have hcalc : + ∫ r in (1 : ℝ)..Real.exp 2, r ^ (p - 1) = ((Real.exp 2) ^ p - 1) / p := by + rw [integral_rpow (a := (1 : ℝ)) (b := Real.exp 2) (r := p - 1) + (Or.inl (by linarith))] + simp + have hmul := mul_le_mul_of_nonneg_left hle hp_nonneg + rw [hcalc] at hmul + have hbase : p * (((Real.exp 2) ^ p - 1) / p) = (Real.exp 2) ^ p - 1 := by + field_simp [hp_pos.ne'] + rw [hbase] at hmul + exact hmul.trans (by linarith) + have htail_dom_nonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi (1 : ℝ))] fun r : ℝ => r ^ (-p / 2 - 1) := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with r hr + exact Real.rpow_nonneg (le_trans zero_le_one hr.le) _ + have htail_bound : + p * ∫ r in Set.Ioi (Real.exp 2), f r ≤ 2 := by + have htail_dom_on : + IntegrableOn (fun r : ℝ => r ^ (-p / 2 - 1)) (Set.Ioi (Real.exp 2)) volume := by + simpa [IntegrableOn] using htail_dom + have hle : + ∫ r in Set.Ioi (Real.exp 2), f r ≤ + ∫ r in Set.Ioi (Real.exp 2), r ^ (-p / 2 - 1) := by + exact setIntegral_mono_on (f := f) (g := fun r : ℝ => r ^ (-p / 2 - 1)) + htail htail_dom_on measurableSet_Ioi + (fun r hr => bennettKernel_le_rpowTail hp (le_of_lt hr)) + have hmono : + ∫ r in Set.Ioi (Real.exp 2), r ^ (-p / 2 - 1) ≤ + ∫ r in Set.Ioi (1 : ℝ), r ^ (-p / 2 - 1) := by + exact setIntegral_mono_set + (f := fun r : ℝ => r ^ (-p / 2 - 1)) + (s := Set.Ioi (Real.exp 2)) (t := Set.Ioi (1 : ℝ)) + (μ := volume) + (by simpa using (integrableOn_Ioi_rpow_of_lt (a := -p / 2 - 1) (by linarith) zero_lt_one)) + htail_dom_nonneg + (Filter.Eventually.of_forall (fun r hr => lt_trans ((Real.one_lt_exp_iff).2 (by norm_num)) hr)) + have hcalc : + ∫ r in Set.Ioi (1 : ℝ), r ^ (-p / 2 - 1) = 2 / p := by + rw [integral_Ioi_rpow_of_lt (a := -p / 2 - 1) (by linarith) zero_lt_one] + simp [div_eq_mul_inv] + have hmul := mul_le_mul_of_nonneg_left (hle.trans hmono) hp_nonneg + rw [hcalc] at hmul + have hbase : p * (2 / p) = 2 := by + field_simp [hp_pos.ne'] + rw [hbase] at hmul + exact hmul + have hsplit1 : + Set.Ioi (0 : ℝ) = Set.Ioc (0 : ℝ) 1 ∪ Set.Ioi (1 : ℝ) := by + exact (Set.Ioc_union_Ioi_eq_Ioi (a := (0 : ℝ)) (b := 1) zero_le_one).symm + have hsplit2 : + Set.Ioi (1 : ℝ) = Set.Ioc (1 : ℝ) (Real.exp 2) ∪ Set.Ioi (Real.exp 2) := by + exact (Set.Ioc_union_Ioi_eq_Ioi (a := (1 : ℝ)) (b := Real.exp 2) h_one_exp_two).symm + have hIoi_one : + IntegrableOn f (Set.Ioi (1 : ℝ)) volume := by + rw [hsplit2, integrableOn_union] + exact ⟨hmid, htail⟩ + have hdecomp : + ∫ r in Set.Ioi (0 : ℝ), f r = + (∫ r in Set.Ioc (0 : ℝ) 1, f r) + + ((∫ r in Set.Ioc (1 : ℝ) (Real.exp 2), f r) + + (∫ r in Set.Ioi (Real.exp 2), f r)) := by + calc + ∫ r in Set.Ioi (0 : ℝ), f r + = (∫ r in Set.Ioc (0 : ℝ) 1, f r) + ∫ r in Set.Ioi (1 : ℝ), f r := by + rw [hsplit1] + rw [setIntegral_union Set.Ioc_disjoint_Ioi_same measurableSet_Ioi hsmall hIoi_one] + _ = (∫ r in Set.Ioc (0 : ℝ) 1, f r) + + ((∫ r in Set.Ioc (1 : ℝ) (Real.exp 2), f r) + + (∫ r in Set.Ioi (Real.exp 2), f r)) := by + rw [hsplit2] + rw [setIntegral_union Set.Ioc_disjoint_Ioi_same measurableSet_Ioi hmid htail] + have hsum : + p * ∫ r in Set.Ioi (0 : ℝ), f r ≤ 1 + (Real.exp 2) ^ p + 2 := by + calc + p * ∫ r in Set.Ioi (0 : ℝ), f r + = (p * ∫ r in Set.Ioc (0 : ℝ) 1, f r) + + ((p * ∫ r in Set.Ioc (1 : ℝ) (Real.exp 2), f r) + + (p * ∫ r in Set.Ioi (Real.exp 2), f r)) := by + rw [hdecomp] + ring + _ ≤ 1 + (Real.exp 2) ^ p + 2 := by + linarith [hsmall_bound, hmid_bound, htail_bound] + have hexp_two_pow_one : 1 ≤ (Real.exp 2) ^ p := by + exact Real.one_le_rpow h_one_exp_two hp_nonneg + have hsum' : 1 + (Real.exp 2) ^ p + 2 ≤ 4 * (Real.exp 2) ^ p := by + linarith + have hfour_le : (4 : ℝ) ≤ (4 : ℝ) ^ p := by + exact Real.self_le_rpow_of_one_le (by norm_num) (by linarith) + have hfinal : + 4 * (Real.exp 2) ^ p ≤ rosenthalBennettIntegralConst ^ p := by + calc + 4 * (Real.exp 2) ^ p ≤ (4 : ℝ) ^ p * (Real.exp 2) ^ p := by + gcongr + _ = rosenthalBennettIntegralConst ^ p := by + rw [rosenthalBennettIntegralConst, ← Real.mul_rpow (by positivity) (by positivity)] + exact hsum.trans (hsum'.trans hfinal) + +/-- The universal Bennett kernel appearing in the Rosenthal proof is +integrable on `(0, ∞)`. -/ +theorem integrableOn_rosenthal_bennett_kernel + {p : ℝ} (hp : 2 ≤ p) : + IntegrableOn + (fun r : ℝ => r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ))))) + (Set.Ioi (0 : ℝ)) volume := by + let f : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + have h_one_exp_two : (1 : ℝ) ≤ Real.exp 2 := by + exact le_of_lt ((Real.one_lt_exp_iff).2 (by norm_num)) + obtain ⟨hsmall_Icc, hmid_Icc, _htail_dom, htail_Ioi⟩ := + bennett_kernel_integrable_regions hp + have hsmall : + IntegrableOn f (Set.Ioc (0 : ℝ) 1) volume := by + change Integrable f (volume.restrict (Set.Ioc (0 : ℝ) 1)) + exact hsmall_Icc.mono_set Ioc_subset_Icc_self + have hmid : + IntegrableOn f (Set.Ioc (1 : ℝ) (Real.exp 2)) volume := by + change Integrable f (volume.restrict (Set.Ioc (1 : ℝ) (Real.exp 2))) + exact hmid_Icc.mono_set Ioc_subset_Icc_self + have htail : + IntegrableOn f (Set.Ioi (Real.exp 2)) volume := by + simpa [IntegrableOn] using htail_Ioi + have hsplit1 : + Set.Ioi (0 : ℝ) = Set.Ioc (0 : ℝ) 1 ∪ Set.Ioi (1 : ℝ) := by + exact (Set.Ioc_union_Ioi_eq_Ioi (a := (0 : ℝ)) (b := 1) zero_le_one).symm + have hsplit2 : + Set.Ioi (1 : ℝ) = Set.Ioc (1 : ℝ) (Real.exp 2) ∪ Set.Ioi (Real.exp 2) := by + exact (Set.Ioc_union_Ioi_eq_Ioi (a := (1 : ℝ)) (b := Real.exp 2) h_one_exp_two).symm + have hIoi_one : + IntegrableOn f (Set.Ioi (1 : ℝ)) volume := by + rw [hsplit2, integrableOn_union] + exact ⟨hmid, htail⟩ + rw [hsplit1, integrableOn_union] + exact ⟨hsmall, hIoi_one⟩ + +/-- After the moment-adapted truncation choice, the Bennett tail integral at +variance scale `σ²` is exactly a scaled copy of the universal Bennett kernel +integral. -/ +theorem rosenthal_bennett_scaled_integral_le + {p sigmaSq : ℝ} (hp : 2 ≤ p) (hSigma_pos : 0 < sigmaSq) : + p * ∫ t in Set.Ioi (0 : ℝ), + t ^ (p - 1) * + Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) ≤ + (rosenthalBennettIntegralConst * (Real.sqrt p * Real.sqrt sigmaSq)) ^ p := by + let b : ℝ := Real.sqrt p * Real.sqrt sigmaSq + let g : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + let f : ℝ → ℝ := fun t => + t ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_two hp + have hp_nonneg : 0 ≤ p := hp_pos.le + have hb_pos : 0 < b := by + dsimp [b] + exact mul_pos (Real.sqrt_pos.2 hp_pos) (Real.sqrt_pos.2 hSigma_pos) + have hb_nonneg : 0 ≤ b := hb_pos.le + have hb_sq : b ^ (2 : ℕ) = p * sigmaSq := by + dsimp [b] + rw [pow_two] + nlinarith [Real.sq_sqrt hp_nonneg, Real.sq_sqrt hSigma_pos.le] + have hcomp : + ∫ t in Set.Ioi (0 : ℝ), f (b * t) = + ∫ t in Set.Ioi (0 : ℝ), b ^ (p - 1) * g t := by + apply MeasureTheory.setIntegral_congr_fun measurableSet_Ioi + intro t ht + have ht_nonneg : 0 ≤ t := ht.le + have harg : (b * t) ^ (2 : ℕ) / (p * sigmaSq) = t ^ (2 : ℕ) := by + calc + (b * t) ^ (2 : ℕ) / (p * sigmaSq) + = (b ^ (2 : ℕ) * t ^ (2 : ℕ)) / (p * sigmaSq) := by + rw [pow_two, pow_two] + ring + _ = t ^ (2 : ℕ) := by + rw [hb_sq] + field_simp [hp_pos.ne', hSigma_pos.ne'] + calc + f (b * t) + = (b * t) ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ)))) := by + dsimp [f] + rw [harg] + _ = (b ^ (p - 1) * t ^ (p - 1)) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ)))) := by + rw [Real.mul_rpow hb_nonneg ht_nonneg] + _ = b ^ (p - 1) * g t := by + dsimp [g] + ring + have hscale : + ∫ t in Set.Ioi (0 : ℝ), f t = + b ^ p * ∫ r in Set.Ioi (0 : ℝ), g r := by + calc + ∫ t in Set.Ioi (0 : ℝ), f t + = b * ∫ t in Set.Ioi (0 : ℝ), f (b * t) := by + have hmul : + b * ∫ t in Set.Ioi (0 : ℝ), f (b * t) = ∫ t in Set.Ioi (0 : ℝ), f t := by + rw [MeasureTheory.integral_comp_mul_left_Ioi (g := f) (a := (0 : ℝ)) hb_pos] + simp [smul_eq_mul, hb_pos.ne'] + exact hmul.symm + _ = b * ∫ t in Set.Ioi (0 : ℝ), b ^ (p - 1) * g t := by rw [hcomp] + _ = b * (b ^ (p - 1) * ∫ t in Set.Ioi (0 : ℝ), g t) := by + rw [MeasureTheory.integral_const_mul] + _ = b ^ p * ∫ r in Set.Ioi (0 : ℝ), g r := by + have hpow : b * b ^ (p - 1) = b ^ p := by + simpa [mul_comm] using (Real.rpow_add hb_pos (1 : ℝ) (p - 1)).symm + calc + b * (b ^ (p - 1) * ∫ t in Set.Ioi (0 : ℝ), g t) + = (b * b ^ (p - 1)) * ∫ t in Set.Ioi (0 : ℝ), g t := by ring + _ = b ^ p * ∫ r in Set.Ioi (0 : ℝ), g r := by rw [hpow] + calc + p * ∫ t in Set.Ioi (0 : ℝ), f t + = b ^ p * (p * ∫ r in Set.Ioi (0 : ℝ), g r) := by + rw [hscale] + ring + _ ≤ b ^ p * rosenthalBennettIntegralConst ^ p := by + gcongr + exact rosenthal_bennett_kernel_integral_le hp + _ = (rosenthalBennettIntegralConst * b) ^ p := by + have hC_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + rw [mul_comm, ← Real.mul_rpow hC_nonneg hb_nonneg] + _ = (rosenthalBennettIntegralConst * (Real.sqrt p * Real.sqrt sigmaSq)) ^ p := by + rfl + +/-- The Bennett kernel at variance scale `σ²` is integrable on `(0, ∞)`. -/ +theorem integrableOn_rosenthal_bennett_scaled_kernel + {p sigmaSq : ℝ} (hp : 2 ≤ p) (hSigma_pos : 0 < sigmaSq) : + IntegrableOn + (fun t : ℝ => + t ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))))) + (Set.Ioi (0 : ℝ)) volume := by + let b : ℝ := Real.sqrt p * Real.sqrt sigmaSq + let g : ℝ → ℝ := fun r => + r ^ (p - 1) * Real.exp (-(p * bennettBeta (r ^ (2 : ℕ)))) + let f : ℝ → ℝ := fun t => + t ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_two hp + have hb_pos : 0 < b := by + dsimp [b] + exact mul_pos (Real.sqrt_pos.2 hp_pos) (Real.sqrt_pos.2 hSigma_pos) + have hg : IntegrableOn g (Set.Ioi (0 : ℝ)) volume := + integrableOn_rosenthal_bennett_kernel hp + have hcomp : + IntegrableOn (fun t : ℝ => f (b * t)) (Set.Ioi (0 : ℝ)) volume := by + have hg' : IntegrableOn (fun t : ℝ => b ^ (p - 1) * g t) (Set.Ioi (0 : ℝ)) volume := by + exact hg.const_mul (b ^ (p - 1)) + refine (integrableOn_congr_fun ?_ measurableSet_Ioi).2 hg' + intro t ht + have ht_nonneg : 0 ≤ t := ht.le + have hb_sq : b ^ (2 : ℕ) = p * sigmaSq := by + dsimp [b] + rw [pow_two] + nlinarith [Real.sq_sqrt hp_pos.le, Real.sq_sqrt hSigma_pos.le] + have harg : (b * t) ^ (2 : ℕ) / (p * sigmaSq) = t ^ (2 : ℕ) := by + calc + (b * t) ^ (2 : ℕ) / (p * sigmaSq) + = (b ^ (2 : ℕ) * t ^ (2 : ℕ)) / (p * sigmaSq) := by + rw [pow_two, pow_two] + ring + _ = t ^ (2 : ℕ) := by + rw [hb_sq] + field_simp [hp_pos.ne', hSigma_pos.ne'] + calc + f (b * t) + = (b * t) ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ)))) := by + dsimp [f] + rw [harg] + _ = (b ^ (p - 1) * t ^ (p - 1)) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ)))) := by + rw [Real.mul_rpow hb_pos.le ht_nonneg] + _ = b ^ (p - 1) * g t := by + dsimp [g] + ring + simpa using (MeasureTheory.integrableOn_Ioi_comp_mul_left_iff f 0 hb_pos).mp hcomp + +/-- Layer cake for the Rosenthal maximum term: applying the standard `L^p` +tail formula to the scaled maximum `p M` gives the exact `p^p E[M^p]` +contribution. -/ +theorem lintegral_rpow_sup'_abs_eq_scaled_tail + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 0 < p) (h_meas : ∀ i, Measurable (X i)) : + ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), + μ {ω | t / p < s.sup' hs (fun i => |X i ω|)} * ENNReal.ofReal (t ^ (p - 1)) = + ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ := by + let Mfun : ι → Ω → ℝ := fun i ω => |X i ω| + let M : Ω → ℝ := s.sup' hs Mfun + let Y : Ω → ℝ := fun ω => p * M ω + have hM_eq : M = fun ω => s.sup' hs (fun i => |X i ω|) := by + funext ω + change (s.sup' hs Mfun) ω = s.sup' hs (fun i => |X i ω|) + exact Finset.sup'_apply (C := fun _ => ℝ) hs Mfun ω + have hM_meas : Measurable M := by + refine Finset.measurable_sup' (hs := hs) (f := Mfun) ?_ + intro i hi + exact continuous_abs.measurable.comp (h_meas i) + have hM_aemeas : AEMeasurable M μ := hM_meas.aemeasurable + have hM_nonneg : ∀ ω, 0 ≤ M ω := by + intro ω + have hnonneg : 0 ≤ Mfun hs.choose ω := by + simp [Mfun] + have hle : Mfun hs.choose ω ≤ M ω := by + rw [hM_eq] + exact Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec + exact le_trans hnonneg hle + have hY_nonneg : ∀ ω, 0 ≤ Y ω := by + intro ω + exact mul_nonneg hp.le (hM_nonneg ω) + have hY_aemeas : AEMeasurable Y μ := by + simpa [Y] using hM_aemeas.const_mul p + have hLayer := + MeasureTheory.lintegral_rpow_eq_lintegral_meas_lt_mul + (μ := μ) (f := Y) (Filter.Eventually.of_forall hY_nonneg) hY_aemeas hp + have hLayer' : + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ = + ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), + μ {ω | t / p < s.sup' hs (fun i => |X i ω|)} * ENNReal.ofReal (t ^ (p - 1)) := by + rw [hLayer] + congr 1 + refine setLIntegral_congr_fun measurableSet_Ioi ?_ + intro t ht + have hset : {a | t < Y a} = {ω | t / p < s.sup' hs (fun i => |X i ω|)} := by + ext ω + simp [Y, hM_eq, div_lt_iff₀ hp, mul_comm] + change μ {a | t < Y a} * ENNReal.ofReal (t ^ (p - 1)) = + μ {ω | t / p < s.sup' hs (fun i => |X i ω|)} * ENNReal.ofReal (t ^ (p - 1)) + rw [hset] + have hMp_aemeas : AEMeasurable (fun ω => M ω ^ p) μ := + (Real.continuous_rpow_const hp.le).measurable.comp_aemeasurable hM_aemeas + have hLeft : + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ = + ENNReal.ofReal (p ^ p) * ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ := by + calc + ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ + = ∫⁻ ω, ENNReal.ofReal (p ^ p) * ENNReal.ofReal (M ω ^ p) ∂μ := by + apply lintegral_congr_ae + refine Filter.Eventually.of_forall ?_ + intro ω + dsimp [Y] + rw [Real.mul_rpow hp.le (hM_nonneg ω)] + rw [← ENNReal.ofReal_mul (Real.rpow_nonneg hp.le _)] + _ = ENNReal.ofReal (p ^ p) * ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ := by + simpa using + (MeasureTheory.lintegral_const_mul'' + (μ := μ) (r := ENNReal.ofReal (p ^ p)) + (f := fun ω => ENNReal.ofReal (M ω ^ p)) + (measurable_id.ennreal_ofReal.comp_aemeasurable hMp_aemeas)) + calc + ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), + μ {ω | t / p < s.sup' hs (fun i => |X i ω|)} * ENNReal.ofReal (t ^ (p - 1)) + = ∫⁻ ω, ENNReal.ofReal (Y ω ^ p) ∂μ := by + rw [hLayer'] + _ = ENNReal.ofReal (p ^ p) * ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ := hLeft + _ = ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ := by + congr 2 + funext ω + simp [hM_eq] + +/-- The optimizing Chernoff parameter in the Bennett exponent. -/ +noncomputable def bennettOptimalLambda (v y t : ℝ) : ℝ := + Real.log (1 + t * y / v) / y + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/CenteredTruncation.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/CenteredTruncation.lean new file mode 100644 index 0000000000..1a166a955a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/CenteredTruncation.lean @@ -0,0 +1,336 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ScalarBennett + +/-! # Centered Truncation -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Bennett mgf bound for the finite sum of centered bounded truncations. -/ +theorem mgf_centeredFinsetSum_absTruncation_le_bennett + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {y l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (hy : 0 < y) (hl : 0 ≤ l) + (hr_nonneg : ∀ i ∈ s, 0 ≤ r i) + (hr_bdd : ∀ i ∈ s, 2 * r i ≤ y) : + mgf (centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s) μ l ≤ + Real.exp + (((∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) / + y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y)) := by + let Y : ι → Ω → ℝ := centeredAbsTruncationFamily X r μ + have h_indepY : iIndepFun Y μ := + centeredAbsTruncationFamily_iIndepFun (μ := μ) (X := X) (r := r) h_indep + have h_measY : ∀ i, Measurable (Y i) := + centeredAbsTruncationFamily_measurable (μ := μ) (X := X) (r := r) h_meas + have h_bddY : ∀ i ∈ s, ∀ᵐ ω ∂μ, |Y i ω| ≤ y := by + intro i hi + exact Filter.Eventually.of_forall fun ω => + (abs_centeredAbsTruncationFamily_le_two_mul + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) (hr_nonneg i hi) ω).trans + (hr_bdd i hi) + have h_meanY : ∀ i ∈ s, μ[Y i] = 0 := by + intro i hi + exact centeredAbsTruncationFamily_integral_eq_zero + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) + have hsum_eq : + (fun ω => ∑ i ∈ s, Y i ω) = + centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s := by + simpa [Y] using + (sum_centeredAbsTruncationFamily_eq_centeredFinsetSum_absTruncation + (μ := μ) (X := X) (r := r) (s := s)) + rw [← hsum_eq] + exact + (mgf_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) (y := y) (l := l) + h_indepY h_measY hy hl h_bddY h_meanY) + +/-- Bennett upper-tail bound for the finite sum of centered bounded truncations. -/ +theorem measureReal_upperTailEvent_centeredFinsetSum_absTruncation_le_bennett + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {y a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) + (ha : 0 ≤ a) + (hr_nonneg : ∀ i ∈ s, 0 ≤ r i) + (hr_bdd : ∀ i ∈ s, 2 * r i ≤ y) : + μ.real (upperTailEvent (centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s) a) ≤ + Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) / + y ^ (2 : ℕ)) * + bennettH + (a * y / + (∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ)))) := by + let Y : ι → Ω → ℝ := centeredAbsTruncationFamily X r μ + have h_indepY : iIndepFun Y μ := + centeredAbsTruncationFamily_iIndepFun (μ := μ) (X := X) (r := r) h_indep + have h_measY : ∀ i, Measurable (Y i) := + centeredAbsTruncationFamily_measurable (μ := μ) (X := X) (r := r) h_meas + have h_bddY : ∀ i ∈ s, ∀ᵐ ω ∂μ, |Y i ω| ≤ y := by + intro i hi + exact Filter.Eventually.of_forall fun ω => + (abs_centeredAbsTruncationFamily_le_two_mul + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) (hr_nonneg i hi) ω).trans + (hr_bdd i hi) + have h_meanY : ∀ i ∈ s, μ[Y i] = 0 := by + intro i hi + exact centeredAbsTruncationFamily_integral_eq_zero + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) + have hsum_eq : + (fun ω => ∑ i ∈ s, Y i ω) = + centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s := by + simpa [Y] using + (sum_centeredAbsTruncationFamily_eq_centeredFinsetSum_absTruncation + (μ := μ) (X := X) (r := r) (s := s)) + rw [← hsum_eq] + exact + (measureReal_upperTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) (y := y) (a := a) + h_indepY h_measY hy hv ha h_bddY h_meanY) + +/-- Bennett absolute-tail bound for the finite sum of centered bounded truncations. -/ +theorem measureReal_absTailEvent_centeredFinsetSum_absTruncation_le_bennett + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {y a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) + (ha : 0 ≤ a) + (hr_nonneg : ∀ i ∈ s, 0 ≤ r i) + (hr_bdd : ∀ i ∈ s, 2 * r i ≤ y) : + μ.real (absTailEvent (centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s) a) ≤ + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) / + y ^ (2 : ℕ)) * + bennettH + (a * y / + (∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ)))) := by + let Y : ι → Ω → ℝ := centeredAbsTruncationFamily X r μ + have h_indepY : iIndepFun Y μ := + centeredAbsTruncationFamily_iIndepFun (μ := μ) (X := X) (r := r) h_indep + have h_measY : ∀ i, Measurable (Y i) := + centeredAbsTruncationFamily_measurable (μ := μ) (X := X) (r := r) h_meas + have h_bddY : ∀ i ∈ s, ∀ᵐ ω ∂μ, |Y i ω| ≤ y := by + intro i hi + exact Filter.Eventually.of_forall fun ω => + (abs_centeredAbsTruncationFamily_le_two_mul + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) (hr_nonneg i hi) ω).trans + (hr_bdd i hi) + have h_meanY : ∀ i ∈ s, μ[Y i] = 0 := by + intro i hi + exact centeredAbsTruncationFamily_integral_eq_zero + (μ := μ) (X := X) (r := r) (i := i) (h_meas i) (h_int i hi) + have hsum_eq : + (fun ω => ∑ i ∈ s, Y i ω) = + centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s := by + simpa [Y] using + (sum_centeredAbsTruncationFamily_eq_centeredFinsetSum_absTruncation + (μ := μ) (X := X) (r := r) (s := s)) + rw [← hsum_eq] + exact + (measureReal_absTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) (y := y) (a := a) + h_indepY h_measY hy hv ha h_bddY h_meanY) + +/-- Splitting the centered sum into bounded truncation plus tail yields an +absolute-tail bound with a Bennett term for the truncation piece and a residual +tail term for the large-value part. -/ +theorem measureReal_absTailEvent_centeredFinsetSum_le_bennett_add_tail + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {y a b : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) + (ha : 0 ≤ a) + (hr_nonneg : ∀ i ∈ s, 0 ≤ r i) + (hr_bdd : ∀ i ∈ s, 2 * r i ≤ y) : + μ.real (absTailEvent (centeredFinsetSum X μ s) (a + b)) ≤ + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) / + y ^ (2 : ℕ)) * + bennettH + (a * y / + (∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ)))) + + μ.real + (absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b) := by + have hTrunc_int : ∀ i ∈ s, Integrable (absTruncation (X i) (r i)) μ := by + intro i hi + exact integrable_absTruncation_of_integrable (h_meas i) (h_int i hi) + have hTail_int : ∀ i ∈ s, Integrable (absTailIndicator (X i) (r i)) μ := by + intro i hi + exact integrable_absTailIndicator_of_integrable (h_meas i) (h_int i hi) + refine (measureReal_absTailEvent_centeredFinsetSum_le_truncation_add_tail + (μ := μ) (X := X) (r := r) (s := s) hTrunc_int hTail_int).trans ?_ + gcongr + exact measureReal_absTailEvent_centeredFinsetSum_absTruncation_le_bennett + (μ := μ) (X := X) (r := r) (s := s) (y := y) (a := a) + h_indep h_meas h_int hy hv ha hr_nonneg hr_bdd + +/-- The residual centered tail piece is controlled by the first moments of the +large-value tails via Markov's inequality and the bound +`∫ |Y - E[Y]| ≤ 2 ∫ |Y|`. -/ +theorem measureReal_absTailEvent_centeredFinsetSum_absTailIndicator_le_two_mul_div + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {b : ℝ} + (hb : 0 < b) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) : + μ.real (absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b) ≤ + (2 * ∑ i ∈ s, ∫ ω, |absTailIndicator (X i) (r i) ω| ∂μ) / b := by + let Z : ι → Ω → ℝ := + fun i ω => absTailIndicator (X i) (r i) ω - μ[absTailIndicator (X i) (r i)] + let Y : ι → Ω → ℝ := fun i ω => |Z i ω| + let F : Ω → ℝ := Finset.sum s Y + have hY_nonneg : ∀ i ∈ s, ∀ ω, 0 ≤ Y i ω := by + intro i hi ω + exact abs_nonneg _ + have hY_int : ∀ i ∈ s, Integrable (Y i) μ := by + intro i hi + have hTail_int : Integrable (absTailIndicator (X i) (r i)) μ := + integrable_absTailIndicator_of_integrable (h_meas i) (h_int i hi) + exact (hTail_int.sub (integrable_const _)).norm + have hsubset : + absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b ⊆ + upperTailEvent F b := by + intro ω hω + change b < |∑ i ∈ s, Z i ω| at hω + change b < F ω + exact lt_of_lt_of_le hω + (by simpa [F, Y, Z] using (Finset.abs_sum_le_sum_abs (f := fun i => Z i ω) (s := s))) + have hF_nonneg : 0 ≤ᵐ[μ] F := by + refine Filter.Eventually.of_forall ?_ + intro ω + simpa [F] using Finset.sum_nonneg fun i hi => hY_nonneg i hi ω + have hF_int : Integrable F μ := by + simpa [F] using integrable_finsetSum' s hY_int + have hmarkov : + μ.real (upperTailEvent F b) ≤ + (∑ i ∈ s, ∫ ω, Y i ω ∂μ) / b := by + have hmono : + μ.real (upperTailEvent F b) ≤ + μ.real {ω | b ≤ F ω} := by + refine measureReal_mono ?_ + intro ω hω + show b ≤ F ω + exact le_of_lt (by simpa [F, upperTailEvent] using hω) + have hmul : + b * μ.real (upperTailEvent F b) ≤ + ∑ i ∈ s, ∫ ω, Y i ω ∂μ := by + calc + b * μ.real (upperTailEvent F b) + ≤ b * μ.real {ω | b ≤ F ω} := by + exact mul_le_mul_of_nonneg_left hmono hb.le + _ ≤ ∫ ω, ∑ i ∈ s, Y i ω ∂μ := by + simpa [F] using + (mul_meas_ge_le_integral_of_nonneg (μ := μ) hF_nonneg hF_int b) + _ = ∑ i ∈ s, ∫ ω, Y i ω ∂μ := by + rw [integral_finsetSum s hY_int] + exact (le_div_iff₀' hb).2 hmul + have hsum_le : + ∑ i ∈ s, ∫ ω, Y i ω ∂μ ≤ + ∑ i ∈ s, 2 * ∫ ω, |absTailIndicator (X i) (r i) ω| ∂μ := by + refine Finset.sum_le_sum ?_ + intro i hi + have hTail_int : Integrable (absTailIndicator (X i) (r i)) μ := + integrable_absTailIndicator_of_integrable (h_meas i) (h_int i hi) + simpa [Y, Z] using + (integral_abs_sub_integral_le_two_mul + (μ := μ) (Y := absTailIndicator (X i) (r i)) hTail_int) + calc + μ.real (absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b) + ≤ μ.real (upperTailEvent F b) := by + exact measureReal_mono hsubset + _ ≤ (∑ i ∈ s, ∫ ω, Y i ω ∂μ) / b := hmarkov + _ ≤ (∑ i ∈ s, 2 * ∫ ω, |absTailIndicator (X i) (r i) ω| ∂μ) / b := by + exact div_le_div_of_nonneg_right hsum_le hb.le + _ = (2 * ∑ i ∈ s, ∫ ω, |absTailIndicator (X i) (r i) ω| ∂μ) / b := by + congr 1 + rw [Finset.mul_sum] + +/-- Combined note-facing tail estimate: the centered sum is bounded by the +Bennett truncation term plus an explicit first-moment tail contribution. -/ +theorem measureReal_absTailEvent_centeredFinsetSum_le_bennett_add_tailIntegrals + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {y a b : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) + (ha : 0 ≤ a) + (hb : 0 < b) + (hr_nonneg : ∀ i ∈ s, 0 ≤ r i) + (hr_bdd : ∀ i ∈ s, 2 * r i ≤ y) : + μ.real (absTailEvent (centeredFinsetSum X μ s) (a + b)) ≤ + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ) / + y ^ (2 : ℕ)) * + bennettH + (a * y / + (∑ i ∈ s, ProbabilityTheory.moment (centeredAbsTruncationFamily X r μ i) 2 μ)))) + + (2 * ∑ i ∈ s, ∫ ω, |absTailIndicator (X i) (r i) ω| ∂μ) / b := by + refine (measureReal_absTailEvent_centeredFinsetSum_le_bennett_add_tail + (μ := μ) (X := X) (r := r) (s := s) (y := y) (a := a) (b := b) + h_indep h_meas h_int hy hv ha hr_nonneg hr_bdd).trans ?_ + gcongr + exact measureReal_absTailEvent_centeredFinsetSum_absTailIndicator_le_two_mul_div + (μ := μ) (X := X) (r := r) (s := s) (b := b) hb h_meas h_int + +section + +omit [MeasurableSpace Ω] + +@[simp] theorem absTailIndicator_neg + {X : Ω → ℝ} {r : ℝ} : + absTailIndicator (fun ω => -X ω) r = -absTailIndicator X r := by + funext ω + by_cases hω : r < |X ω| + · simp [absTailIndicator, hω, abs_neg] + · simp [absTailIndicator, hω, abs_neg] + +@[simp] theorem absTruncation_neg + {X : Ω → ℝ} {r : ℝ} : + absTruncation (fun ω => -X ω) r = -absTruncation X r := by + funext ω + by_cases hω : r < |X ω| + · simp [absTruncation, absTailIndicator, hω, abs_neg] + · simp [absTruncation, absTailIndicator, hω, abs_neg] + +end + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Corollaries.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Corollaries.lean new file mode 100644 index 0000000000..dff0c5fc4e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Corollaries.lean @@ -0,0 +1,793 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Endpoint + +/-! # Corollaries -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +private theorem integrable_sum_abs_pow + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := by + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi hs => + have hi_int : Integrable (fun ω => |X i ω| ^ p) μ := hLp_int i (by simp) + have hs_int : Integrable (fun ω => ∑ j ∈ s, |X j ω| ^ p) μ := by + exact hs (fun j hj => hLp_int j (by simp [hj])) + simpa [Finset.sum_insert, hi] using! hi_int.add hs_int + +omit [MeasurableSpace Ω] in +private theorem sup'_abs_pow_le_sum_abs_pow + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (ω : Ω) : + (s.sup' hs (fun i => |X i ω|)) ^ p ≤ ∑ i ∈ s, |X i ω| ^ p := by + obtain ⟨i, hi, hi_le⟩ : + ∃ i ∈ s, s.sup' hs (fun i => |X i ω|) ≤ |X i ω| := by + simpa only [Finset.le_sup'_iff] using + (show s.sup' hs (fun i => |X i ω|) ≤ s.sup' hs (fun i => |X i ω|) by exact le_rfl) + have hi_ge : |X i ω| ≤ s.sup' hs (fun i => |X i ω|) := by + exact Finset.le_sup' (f := fun j => |X j ω|) hi + have hEq : s.sup' hs (fun i => |X i ω|) = |X i ω| := le_antisymm hi_le hi_ge + calc + (s.sup' hs (fun i => |X i ω|)) ^ p = |X i ω| ^ p := by rw [hEq] + _ ≤ ∑ i ∈ s, |X i ω| ^ p := by + exact Finset.single_le_sum (f := fun j => |X j ω| ^ p) (fun j hj => by positivity) hi + +private theorem integrable_sup'_abs_pow_of_integrable_abs_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := by + have hsum_int : + Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := + integrable_sum_abs_pow (μ := μ) (X := X) (s := s) (p := p) hLp_int + refine Integrable.mono' hsum_int ?_ ?_ + · + have hsup_meas : Measurable (fun ω => s.sup' hs (fun i => |X i ω|)) := by + convert + (Finset.measurable_sup' (s := s) (hs := hs) (f := fun i => abs ∘ X i) + (fun i _ => continuous_abs.measurable.comp (h_meas i))) using 1 + ext ω + simp [Function.comp_apply] + exact (hsup_meas.pow_const p).aemeasurable.aestronglyMeasurable + · filter_upwards with ω + have hsup_base_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := by + exact le_trans (abs_nonneg _) (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + have hsup_nonneg : 0 ≤ (s.sup' hs (fun i => |X i ω|)) ^ p := by + exact pow_nonneg hsup_base_nonneg _ + simpa [Real.norm_eq_abs, abs_of_nonneg hsup_nonneg, abs_of_nonneg hsup_base_nonneg] using + sup'_abs_pow_le_sum_abs_pow (X := X) (s := s) hs (p := p) ω + +private theorem integral_sup'_abs_pow_le_sum_integral_abs_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ ≤ + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + have hsup_int : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := + integrable_sup'_abs_pow_of_integrable_abs_pow + (μ := μ) (X := X) (s := s) hs (p := p) h_meas hLp_int + have hsum_int : + Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := + integrable_sum_abs_pow (μ := μ) (X := X) (s := s) (p := p) hLp_int + calc + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + ≤ ∫ ω, ∑ i ∈ s, |X i ω| ^ p ∂μ := by + refine integral_mono hsup_int hsum_int ?_ + intro ω + exact sup'_abs_pow_le_sum_abs_pow (X := X) (s := s) hs (p := p) ω + _ = ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + simpa using integral_finsetSum (μ := μ) s hLp_int + +private theorem abs_le_one_add_abs_pow {x : ℝ} {p : ℕ} (hp : 1 ≤ p) : + |x| ≤ 1 + |x| ^ p := by + by_cases hx : |x| ≤ 1 + · have hpow_nonneg : 0 ≤ |x| ^ p := by positivity + linarith + · have h1 : 1 ≤ |x| := le_of_lt (lt_of_not_ge hx) + have hpow : |x| ≤ |x| ^ p := by + simpa [pow_one] using (pow_le_pow_right₀ h1 hp) + have hpow_nonneg : 0 ≤ |x| ^ p := by positivity + linarith + +private theorem sq_le_one_add_abs_pow {x : ℝ} {p : ℕ} (hp : 2 ≤ p) : + x ^ (2 : ℕ) ≤ 1 + |x| ^ p := by + by_cases hx : |x| ≤ 1 + · have hsq : x ^ (2 : ℕ) ≤ 1 := by + simpa [sq_abs] using (pow_le_pow_left₀ (abs_nonneg x) hx 2) + have hpow_nonneg : 0 ≤ |x| ^ p := by positivity + linarith + · have h1 : 1 ≤ |x| := le_of_lt (lt_of_not_ge hx) + have hsq : x ^ (2 : ℕ) ≤ |x| ^ p := by + simpa [sq_abs] using (pow_le_pow_right₀ h1 hp) + have hpow_nonneg : 0 ≤ |x| ^ p := by positivity + linarith + +private theorem integrable_of_integrable_abs_pow + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℕ} + (hp : 1 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + Integrable X μ := by + have hdom : Integrable (fun ω => (1 : ℝ) + |X ω| ^ p) μ := + (integrable_const (1 : ℝ)).add hLp_int + have habs_int : Integrable (fun ω => |X ω|) μ := by + refine Integrable.mono' hdom ?_ ?_ + · exact (continuous_abs.measurable.comp h_meas).aemeasurable.aestronglyMeasurable + · filter_upwards with ω + simpa [Real.norm_eq_abs, abs_of_nonneg (abs_nonneg _)] using + abs_le_one_add_abs_pow (x := X ω) hp + rw [← integrable_norm_iff h_meas.aestronglyMeasurable] + simpa [Real.norm_eq_abs] using habs_int + +private theorem integrable_sq_of_integrable_abs_pow + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℕ} + (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + Integrable (fun ω => X ω ^ (2 : ℕ)) μ := by + have hdom : Integrable (fun ω => (1 : ℝ) + |X ω| ^ p) μ := + (integrable_const (1 : ℝ)).add hLp_int + have habs_sq_int : Integrable (fun ω => |X ω| ^ (2 : ℕ)) μ := by + refine Integrable.mono' hdom ?_ ?_ + · exact + (((continuous_abs.measurable.comp h_meas).pow_const 2).aemeasurable.aestronglyMeasurable) + · filter_upwards with ω + have hnonneg : 0 ≤ |X ω| ^ (2 : ℕ) := by positivity + simpa [Real.norm_eq_abs, abs_of_nonneg hnonneg] using + sq_le_one_add_abs_pow (x := X ω) hp + simpa [sq_abs] using habs_sq_int + +private theorem integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℕ} + (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |X ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + have hp_ne_zero : p ≠ 0 := by omega + have hX_ae : AEStronglyMeasurable X μ := h_meas.aestronglyMeasurable + have h_memLp_p : MemLp X (p : ENNReal) μ := by + rw [← integrable_norm_rpow_iff hX_ae (by exact_mod_cast hp_ne_zero) (by simp)] + simpa [Real.norm_eq_abs] using hLp_int + have h_memLp_two : MemLp X (2 : ENNReal) μ := by + exact h_memLp_p.mono_exponent (by exact_mod_cast hp) + have hcmp : + eLpNorm X (2 : ENNReal) μ ≤ eLpNorm X (p : ENNReal) μ := by + exact eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := X) (by exact_mod_cast hp) + rw [h_memLp_two.eLpNorm_eq_integral_rpow_norm (by norm_num) (by simp), + h_memLp_p.eLpNorm_eq_integral_rpow_norm (by exact_mod_cast hp_ne_zero) (by simp)] at hcmp + exact (ENNReal.ofReal_le_ofReal_iff (by positivity)).1 (by + simpa [Real.norm_eq_abs, one_div] using hcmp) + +private theorem moment_two_le_sq_of_integral_abs_pow_rpow_inv_le + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℕ} + (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) + {K : ℝ} + (hK : (∫ ω, |X ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + ProbabilityTheory.moment X 2 μ ≤ K ^ 2 := by + have hroot : + (ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ)) ≤ K := by + have hLp : + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |X ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := + integral_abs_sq_rpow_half_le_integral_abs_pow_rpow_inv + (μ := μ) (X := X) hp h_meas hLp_int + have hmoment_lp : + (ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |X ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + simpa [ProbabilityTheory.moment, sq_abs] using hLp + exact hmoment_lp.trans hK + have hmoment_nonneg : 0 ≤ ProbabilityTheory.moment X 2 μ := by + simp [ProbabilityTheory.moment] + positivity + have hpow : + ((ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ))) ^ (2 : ℕ) ≤ K ^ 2 := by + exact pow_le_pow_left₀ (by positivity) hroot 2 + have hmoment_eq : + ((ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ))) ^ (2 : ℕ) = + ProbabilityTheory.moment X 2 μ := by + rw [← Real.rpow_natCast, ← Real.rpow_mul hmoment_nonneg] + norm_num + exact hmoment_eq ▸ hpow + +private theorem integral_sum_abs_pow_rpow_inv_le_card_rpow_mul + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + {K : ℝ} (hK_nonneg : 0 ≤ K) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + (s.card : ℝ) ^ (1 / (p : ℝ)) * K := by + have hp_ne_zero : p ≠ 0 := by omega + have hsum_le : + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ ≤ (s.card : ℝ) * K ^ p := by + calc + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ ≤ ∑ i ∈ s, K ^ p := by + refine Finset.sum_le_sum ?_ + intro i hi + have hroot := hK i hi + have hroot_nonneg : 0 ≤ (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by positivity + have hpow : ((∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ))) ^ p ≤ K ^ p := by + exact pow_le_pow_left₀ hroot_nonneg hroot p + have hint_nonneg : 0 ≤ ∫ ω, |X i ω| ^ p ∂μ := by positivity + have hint_eq : + ((∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ))) ^ p = + ∫ ω, |X i ω| ^ p ∂μ := by + rw [← Real.rpow_natCast, ← Real.rpow_mul hint_nonneg, one_div, + inv_mul_cancel₀ (show (p : ℝ) ≠ 0 by exact_mod_cast hp_ne_zero), Real.rpow_one] + exact hint_eq ▸ hpow + _ = (s.card : ℝ) * K ^ p := by + simp [Finset.sum_const, nsmul_eq_mul, mul_comm] + have hsum_nonneg : 0 ≤ ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + refine Finset.sum_nonneg ?_ + intro i hi + positivity + have hroot : + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + ((s.card : ℝ) * K ^ p) ^ (1 / (p : ℝ)) := by + exact Real.rpow_le_rpow hsum_nonneg hsum_le (by positivity) + have htarget_eq : + ((s.card : ℝ) * K ^ p) ^ (1 / (p : ℝ)) = + (s.card : ℝ) ^ (1 / (p : ℝ)) * K := by + rw [one_div, Real.mul_rpow (by positivity) (pow_nonneg hK_nonneg _), + Real.pow_rpow_inv_natCast hK_nonneg hp_ne_zero] + exact hroot.trans_eq htarget_eq + +private theorem sum_moment_two_le_card_mul_sq_of_integral_abs_pow_rpow_inv_le + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 2 ≤ p) + (h_meas : ∀ i, Measurable (X i)) + {K : ℝ} + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ (s.card : ℝ) * K ^ 2 := by + calc + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ ∑ i ∈ s, K ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i hi + exact moment_two_le_sq_of_integral_abs_pow_rpow_inv_le + (μ := μ) (X := X i) hp (h_meas i) (hLp_int i hi) (hK i hi) + _ = (s.card : ℝ) * K ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + +/-- Note-facing polynomial-moment Rosenthal bound with the maximal term +replaced by the sum of the individual `L^p` moments. -/ +theorem integral_abs_centeredFinsetSum_pow_rpow_inv_le_rosenthal_polynomial + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + have hp_one : 1 ≤ p := by omega + have h_int : ∀ i ∈ s, Integrable (X i) μ := by + intro i hi + exact integrable_of_integrable_abs_pow + (μ := μ) (X := X i) hp_one (h_meas i) (hLp_int i hi) + have h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ := by + intro i hi + exact integrable_sq_of_integrable_abs_pow + (μ := μ) (X := X i) hp (h_meas i) (hLp_int i hi) + have hbase : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + exact integral_abs_centeredFinsetSum_pow_rpow_inv_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_int h_sq_int + (integrable_sup'_abs_pow_of_integrable_abs_pow + (μ := μ) (X := X) (s := s) hs (p := p) h_meas hLp_int) + have hsup_le : + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ ≤ + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + exact integral_sup'_abs_pow_le_sum_integral_abs_pow + (μ := μ) (X := X) (s := s) hs (p := p) h_meas hLp_int + have hsup_nonneg : 0 ≤ ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + refine integral_nonneg ?_ + intro ω + have hsup_base_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := by + exact le_trans (abs_nonneg _) (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + exact pow_nonneg hsup_base_nonneg _ + have hsum_nonneg : 0 ≤ ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + refine Finset.sum_nonneg ?_ + intro i hi + positivity + have hsup_root_le : + (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) := by + exact Real.rpow_le_rpow hsup_nonneg hsup_le (by positivity) + calc + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + ≤ 2 * (p : ℝ) * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := hbase + _ ≤ 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + refine add_le_add ?_ le_rfl + exact mul_le_mul_of_nonneg_left hsup_root_le (by positivity) + +/-- Rosenthal's polynomial-moment corollary for finite sums of centered +independent real random variables. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, μ[X i] = 0) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + have hcenter_eq : centeredFinsetSum X μ s = fun ω => ∑ i ∈ s, X i ω := by + have hmean_sum : ∑ i ∈ s, μ[X i] = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + exact hXmean i hi + funext ω + rw [centeredFinsetSum, Finset.sum_sub_distrib, hmean_sum, sub_zero] + simpa [hcenter_eq] using + integral_abs_centeredFinsetSum_pow_rpow_inv_le_rosenthal_polynomial + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas hLp_int + +/-- Uniform-`K` polynomial-moment Rosenthal corollary in the note-facing +finite-sum form. -/ +theorem integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} {K : ℝ} + (hp : 2 ≤ p) + (hK_nonneg : 0 ≤ K) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, μ[X i] = 0) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ K) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * ((s.card : ℝ) ^ (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + have hpoly : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + exact integral_abs_finsetSum_pow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas hLp_int hXmean + have hLp_sum : + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + (s.card : ℝ) ^ (1 / (p : ℝ)) * K := by + exact integral_sum_abs_pow_rpow_inv_le_card_rpow_mul + (μ := μ) (X := X) (s := s) (p := p) (by omega) hK_nonneg hK + have hmoment_sum : + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ (s.card : ℝ) * K ^ 2 := by + exact sum_moment_two_le_card_mul_sq_of_integral_abs_pow_rpow_inv_le + (μ := μ) (X := X) (s := s) (p := p) hp h_meas hLp_int hK + have hsqrt_sum_le : + Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) ≤ + Real.sqrt (s.card : ℝ) * K := by + have hsqrt : + Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) ≤ + Real.sqrt ((s.card : ℝ) * K ^ 2) := by + exact Real.sqrt_le_sqrt hmoment_sum + have hsqrt_eq : + Real.sqrt ((s.card : ℝ) * K ^ 2) = Real.sqrt (s.card : ℝ) * K := by + rw [Real.sqrt_mul (by positivity) (K ^ 2), Real.sqrt_sq hK_nonneg] + exact hsqrt.trans_eq hsqrt_eq + calc + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + ≤ 2 * (p : ℝ) * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := hpoly + _ ≤ 2 * (p : ℝ) * ((s.card : ℝ) ^ (1 / (p : ℝ)) * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + refine add_le_add ?_ ?_ + · exact mul_le_mul_of_nonneg_left hLp_sum (by positivity) + · refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact mul_le_mul_of_nonneg_left hsqrt_sum_le (by positivity) + · + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + positivity + +private theorem integrable_sum_abs_rpow + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi hs => + have hi_int : Integrable (fun ω => |X i ω| ^ p) μ := hLp_int i (by simp) + have hs_int : Integrable (fun ω => ∑ j ∈ s, |X j ω| ^ p) μ := by + exact hs (fun j hj => hLp_int j (by simp [hj])) + simpa [Finset.sum_insert, hi] using! hi_int.add hs_int + +omit [MeasurableSpace Ω] in +private theorem sup'_abs_rpow_le_sum_abs_rpow + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (ω : Ω) : + (s.sup' hs (fun i => |X i ω|)) ^ p ≤ ∑ i ∈ s, |X i ω| ^ p := by + obtain ⟨i, hi, hi_le⟩ : + ∃ i ∈ s, s.sup' hs (fun i => |X i ω|) ≤ |X i ω| := by + simpa only [Finset.le_sup'_iff] using + (show s.sup' hs (fun i => |X i ω|) ≤ s.sup' hs (fun i => |X i ω|) by exact le_rfl) + have hi_ge : |X i ω| ≤ s.sup' hs (fun i => |X i ω|) := by + exact Finset.le_sup' (f := fun j => |X j ω|) hi + have hEq : s.sup' hs (fun i => |X i ω|) = |X i ω| := le_antisymm hi_le hi_ge + calc + (s.sup' hs (fun i => |X i ω|)) ^ p = |X i ω| ^ p := by rw [hEq] + _ ≤ ∑ i ∈ s, |X i ω| ^ p := by + exact Finset.single_le_sum (f := fun j => |X j ω| ^ p) + (fun j hj => Real.rpow_nonneg (abs_nonneg _) _) hi + +private theorem integrable_sup'_abs_rpow_of_integrable_abs_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 0 ≤ p) (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := by + have hsum_int : Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := + integrable_sum_abs_rpow (μ := μ) (X := X) (s := s) (p := p) hLp_int + refine Integrable.mono' hsum_int ?_ ?_ + · have hsup_meas : Measurable (fun ω => s.sup' hs (fun i => |X i ω|)) := by + convert + (Finset.measurable_sup' (s := s) (hs := hs) (f := fun i => abs ∘ X i) + (fun i _ => continuous_abs.measurable.comp (h_meas i))) using 1 + ext ω + simp [Function.comp_apply] + exact ((Real.continuous_rpow_const hp).measurable.comp hsup_meas).aemeasurable.aestronglyMeasurable + · filter_upwards with ω + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := by + exact le_trans (abs_nonneg _) (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + have hrpow_nonneg : 0 ≤ (s.sup' hs (fun i => |X i ω|)) ^ p := + Real.rpow_nonneg hsup_nonneg _ + simpa [Real.norm_eq_abs, abs_of_nonneg hrpow_nonneg] using + sup'_abs_rpow_le_sum_abs_rpow (X := X) (s := s) hs ω + +private theorem integral_sup'_abs_rpow_le_sum_integral_abs_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 0 ≤ p) (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ ≤ + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + have hsup_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := + integrable_sup'_abs_rpow_of_integrable_abs_rpow + (μ := μ) (X := X) (s := s) hs hp h_meas hLp_int + have hsum_int : Integrable (fun ω => ∑ i ∈ s, |X i ω| ^ p) μ := + integrable_sum_abs_rpow (μ := μ) (X := X) (s := s) (p := p) hLp_int + calc + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + ≤ ∫ ω, ∑ i ∈ s, |X i ω| ^ p ∂μ := by + refine integral_mono hsup_int hsum_int ?_ + intro ω + exact sup'_abs_rpow_le_sum_abs_rpow (X := X) (s := s) hs ω + _ = ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + simpa using integral_finsetSum (μ := μ) s hLp_int + +private theorem memLp_of_integrable_abs_rpow + {X : Ω → ℝ} {p : ℝ} (hp : 0 < p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + MemLp X (ENNReal.ofReal p) μ := by + rw [← integrable_norm_rpow_iff h_meas.aestronglyMeasurable + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp]) ENNReal.ofReal_ne_top] + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp.le] using hLp_int + +private theorem integrable_of_integrable_abs_rpow + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℝ} (hp : 1 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + Integrable X μ := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have h_memLp : MemLp X (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow (μ := μ) hp_pos h_meas hLp_int + refine h_memLp.integrable ?_ + rw [← ENNReal.ofReal_one] + exact ENNReal.ofReal_le_ofReal hp + +private theorem integrable_sq_of_integrable_abs_rpow + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℝ} (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + Integrable (fun ω => X ω ^ (2 : ℕ)) μ := by + have hp_pos : 0 < p := by linarith + have h_memLp_p : MemLp X (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow (μ := μ) hp_pos h_meas hLp_int + have h_memLp_two : MemLp X (2 : ENNReal) μ := by + apply h_memLp_p.mono_exponent + calc + (2 : ENNReal) = ENNReal.ofReal (2 : ℝ) := by norm_num + _ ≤ ENNReal.ofReal p := ENNReal.ofReal_le_ofReal hp + have htwo_int := h_memLp_two.integrable_norm_rpow (by norm_num) (by simp) + simpa [Real.norm_eq_abs, Real.rpow_natCast, sq_abs] using htwo_int + +private theorem integral_abs_sq_rpow_half_le_integral_abs_rpow_rpow_inv + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℝ} (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) : + (∫ ω, |X ω| ^ (2 : ℕ) ∂μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |X ω| ^ p ∂μ) ^ p⁻¹ := by + have hp_pos : 0 < p := by linarith + have h_memLp_p : MemLp X (ENNReal.ofReal p) μ := + memLp_of_integrable_abs_rpow (μ := μ) hp_pos h_meas hLp_int + have h_memLp_two : MemLp X (2 : ENNReal) μ := by + apply h_memLp_p.mono_exponent + calc + (2 : ENNReal) = ENNReal.ofReal (2 : ℝ) := by norm_num + _ ≤ ENNReal.ofReal p := ENNReal.ofReal_le_ofReal hp + have hcmp : eLpNorm X (2 : ENNReal) μ ≤ eLpNorm X (ENNReal.ofReal p) μ := + eLpNorm_le_eLpNorm_of_exponent_le + (μ := μ) (f := X) (by + calc + (2 : ENNReal) = ENNReal.ofReal (2 : ℝ) := by norm_num + _ ≤ ENNReal.ofReal p := ENNReal.ofReal_le_ofReal hp) + rw [h_memLp_two.eLpNorm_eq_integral_rpow_norm (by norm_num) (by simp), + h_memLp_p.eLpNorm_eq_integral_rpow_norm + (by simp [ENNReal.ofReal_eq_zero, not_le.mpr hp_pos]) ENNReal.ofReal_ne_top] at hcmp + exact (ENNReal.ofReal_le_ofReal_iff (by positivity)).1 (by + simpa [Real.norm_eq_abs, ENNReal.toReal_ofReal hp_pos.le, one_div] using hcmp) + +private theorem moment_two_le_sq_of_integral_abs_rpow_rpow_inv_le + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {p : ℝ} (hp : 2 ≤ p) + (h_meas : Measurable X) + (hLp_int : Integrable (fun ω => |X ω| ^ p) μ) + {K : ℝ} (hK : (∫ ω, |X ω| ^ p ∂μ) ^ p⁻¹ ≤ K) : + ProbabilityTheory.moment X 2 μ ≤ K ^ 2 := by + have hroot : (ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ)) ≤ K := by + have hLp := integral_abs_sq_rpow_half_le_integral_abs_rpow_rpow_inv + (μ := μ) (X := X) hp h_meas hLp_int + have hmoment_lp : + (ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ)) ≤ + (∫ ω, |X ω| ^ p ∂μ) ^ p⁻¹ := by + simpa [ProbabilityTheory.moment, sq_abs] using hLp + exact hmoment_lp.trans hK + have hmoment_nonneg : 0 ≤ ProbabilityTheory.moment X 2 μ := by + simp [ProbabilityTheory.moment] + positivity + have hpow : ((ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ))) ^ (2 : ℕ) ≤ K ^ 2 := by + exact pow_le_pow_left₀ (by positivity) hroot 2 + have hmoment_eq : + ((ProbabilityTheory.moment X 2 μ) ^ (1 / (2 : ℝ))) ^ (2 : ℕ) = + ProbabilityTheory.moment X 2 μ := by + rw [← Real.rpow_natCast, ← Real.rpow_mul hmoment_nonneg] + norm_num + exact hmoment_eq ▸ hpow + +private theorem integral_sum_abs_rpow_rpow_inv_le_card_rpow_mul + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} (hp : 1 ≤ p) + {K : ℝ} (hK_nonneg : 0 ≤ K) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ ≤ K) : + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ ≤ + (s.card : ℝ) ^ p⁻¹ * K := by + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hsum_le : + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ ≤ (s.card : ℝ) * K ^ p := by + calc + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ ≤ ∑ i ∈ s, K ^ p := by + refine Finset.sum_le_sum ?_ + intro i hi + have hroot := hK i hi + have hroot_nonneg : 0 ≤ (∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ := by positivity + have hpow : ((∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹) ^ p ≤ K ^ p := + Real.rpow_le_rpow hroot_nonneg hroot hp_pos.le + have hint_nonneg : 0 ≤ ∫ ω, |X i ω| ^ p ∂μ := by positivity + simpa [one_div] using (Real.rpow_inv_rpow hint_nonneg hp_pos.ne') ▸ hpow + _ = (s.card : ℝ) * K ^ p := by + simp [Finset.sum_const, nsmul_eq_mul, mul_comm] + have hsum_nonneg : 0 ≤ ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := by + refine Finset.sum_nonneg ?_ + intro i hi + positivity + have hroot := Real.rpow_le_rpow hsum_nonneg hsum_le (by positivity : 0 ≤ p⁻¹) + have htarget_eq : ((s.card : ℝ) * K ^ p) ^ p⁻¹ = (s.card : ℝ) ^ p⁻¹ * K := by + rw [Real.mul_rpow (by positivity) (Real.rpow_nonneg hK_nonneg _), + ← Real.rpow_mul hK_nonneg] + field_simp + simp + exact hroot.trans_eq htarget_eq + +private theorem sum_moment_two_le_card_mul_sq_of_integral_abs_rpow_rpow_inv_le + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} (hp : 2 ≤ p) + (h_meas : ∀ i, Measurable (X i)) + {K : ℝ} (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ ≤ K) : + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ (s.card : ℝ) * K ^ 2 := by + calc + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ ∑ i ∈ s, K ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i hi + exact moment_two_le_sq_of_integral_abs_rpow_rpow_inv_le + (μ := μ) (X := X i) hp (h_meas i) (hLp_int i hi) (hK i hi) + _ = (s.card : ℝ) * K ^ 2 := by + simp [Finset.sum_const, nsmul_eq_mul] + +/-- Real-exponent polynomial-moment Rosenthal bound with the maximal term +replaced by the sum of the individual `L^p` moments. -/ +theorem integral_abs_centeredFinsetSum_rpow_rpow_inv_le_rosenthal_polynomial + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ p⁻¹ ≤ + 2 * p * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp_one + have h_int : ∀ i ∈ s, Integrable (X i) μ := by + intro i hi + exact integrable_of_integrable_abs_rpow + (μ := μ) (X := X i) hp_one (h_meas i) (hLp_int i hi) + have h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ := by + intro i hi + exact integrable_sq_of_integrable_abs_rpow + (μ := μ) (X := X i) hp (h_meas i) (hLp_int i hi) + have hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ := + integrable_sup'_abs_rpow_of_integrable_abs_rpow + (μ := μ) (X := X) (s := s) hs hp_nonneg h_meas hLp_int + have hbase : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ p⁻¹ ≤ + 2 * p * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + simpa [one_div] using + integral_abs_centeredFinsetSum_rpow_rpow_inv_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_int h_sq_int hmax_int + have hsup_le : + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ ≤ + ∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ := + integral_sup'_abs_rpow_le_sum_integral_abs_rpow + (μ := μ) (X := X) (s := s) hs hp_nonneg h_meas hLp_int + have hsup_nonneg : 0 ≤ ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + refine integral_nonneg fun ω => ?_ + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω|) := by + exact le_trans (abs_nonneg _) (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + exact Real.rpow_nonneg hsup_nonneg _ + have hsup_root_le : + (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ p⁻¹ ≤ + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ := by + exact Real.rpow_le_rpow hsup_nonneg hsup_le (by positivity) + calc + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ p⁻¹ + ≤ 2 * p * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := hbase + _ ≤ 2 * p * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + refine add_le_add ?_ le_rfl + exact mul_le_mul_of_nonneg_left hsup_root_le (by positivity) + +/-- Real-exponent Rosenthal polynomial-moment corollary for centered +independent finite sums. -/ +theorem integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, μ[X i] = 0) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ p⁻¹ ≤ + 2 * p * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + have hcenter_eq : centeredFinsetSum X μ s = fun ω => ∑ i ∈ s, X i ω := by + have hmean_sum : ∑ i ∈ s, μ[X i] = 0 := by + refine Finset.sum_eq_zero fun i hi => hXmean i hi + funext ω + rw [centeredFinsetSum, Finset.sum_sub_distrib, hmean_sum, sub_zero] + simpa [hcenter_eq] using + integral_abs_centeredFinsetSum_rpow_rpow_inv_le_rosenthal_polynomial + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas hLp_int + +/-- Uniform real-exponent polynomial-moment Rosenthal corollary in the +finite-sum form. -/ +theorem integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_uniform_polynomial_of_iIndepFun_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p K : ℝ} + (hp : 2 ≤ p) + (hK_nonneg : 0 ≤ K) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hLp_int : ∀ i ∈ s, Integrable (fun ω => |X i ω| ^ p) μ) + (hXmean : ∀ i ∈ s, μ[X i] = 0) + (hK : ∀ i ∈ s, (∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ ≤ K) : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ p⁻¹ ≤ + 2 * p * ((s.card : ℝ) ^ p⁻¹ * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + have hpoly : + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ p⁻¹ ≤ + 2 * p * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := + integral_abs_finsetSum_rpow_rpow_inv_le_rosenthal_polynomial_of_iIndepFun_of_integral_eq_zero + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas hLp_int hXmean + have hLp_sum : + (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ ≤ (s.card : ℝ) ^ p⁻¹ * K := + integral_sum_abs_rpow_rpow_inv_le_card_rpow_mul + (μ := μ) (X := X) (s := s) (p := p) (le_trans (by norm_num) hp) hK_nonneg hK + have hmoment_sum : + ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ ≤ (s.card : ℝ) * K ^ 2 := + sum_moment_two_le_card_mul_sq_of_integral_abs_rpow_rpow_inv_le + (μ := μ) (X := X) (s := s) (p := p) hp h_meas hLp_int hK + have hsqrt_sum_le : + Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) ≤ + Real.sqrt (s.card : ℝ) * K := by + have hsqrt := Real.sqrt_le_sqrt hmoment_sum + have hsqrt_eq : Real.sqrt ((s.card : ℝ) * K ^ 2) = Real.sqrt (s.card : ℝ) * K := by + rw [Real.sqrt_mul (by positivity) (K ^ 2), Real.sqrt_sq hK_nonneg] + exact hsqrt.trans_eq hsqrt_eq + calc + (∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ) ^ p⁻¹ + ≤ 2 * p * (∑ i ∈ s, ∫ ω, |X i ω| ^ p ∂μ) ^ p⁻¹ + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := hpoly + _ ≤ 2 * p * ((s.card : ℝ) ^ p⁻¹ * K) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * (Real.sqrt (s.card : ℝ) * K)) := by + refine add_le_add ?_ ?_ + · exact mul_le_mul_of_nonneg_left hLp_sum (by positivity) + · refine mul_le_mul_of_nonneg_left ?_ ?_ + · exact mul_le_mul_of_nonneg_left hsqrt_sum_le (by positivity) + · have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + positivity + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Endpoint.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Endpoint.lean new file mode 100644 index 0000000000..6472429894 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Endpoint.lean @@ -0,0 +1,814 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.ProductDifference + +/-! # Endpoint -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- Rosenthal bound for the symmetrized difference sum on the product +probability space. -/ +theorem integral_abs_symmetrizedFinsetSum_pow_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) ≤ + ((p : ℝ) ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + classical + let : Nonempty ↥s := ⟨⟨hs.choose, hs.choose_spec⟩⟩ + let Y : ↥s → Ω × Ω → ℝ := fun i ω => X i ω.1 - X i ω.2 + have hs_univ : (Finset.univ : Finset ↥s).Nonempty := Finset.univ_nonempty + have hp_real : 2 ≤ (p : ℝ) := by exact_mod_cast hp + have hp_one : 1 ≤ p := by omega + have h_indep_sub : iIndepFun (fun i : ↥s => X i) μ := by + simpa using h_indep.precomp (g := ((↑) : ↥s → ι)) Subtype.val_injective + have h_meas_sub : ∀ i : ↥s, Measurable (X i) := by + intro i + exact h_meas i + have h_indepY : iIndepFun Y (μ.prod μ) := by + simpa [Y] using + iIndepFun_sub_comp_fst_comp_snd_prod + (μ := μ) (X := fun i : ↥s => X i) h_indep_sub h_meas_sub + have h_sq_intY : + ∀ i ∈ (Finset.univ : Finset ↥s), + Integrable (fun ω => Y i ω ^ (2 : ℕ)) (μ.prod μ) := by + intro i hi + simpa [Y] using integrable_pow_two_sub_comp_fst_comp_snd + (μ := μ) (h_meas i) (h_sq_int i i.property) + have h_symmY : + ∀ i ∈ (Finset.univ : Finset ↥s), + IdentDistrib (Y i) (fun ω => -Y i ω) (μ.prod μ) (μ.prod μ) := by + intro i hi + simpa [Y] using identDistrib_sub_comp_fst_comp_snd_prod_neg + (μ := μ) (h_meas i) + have hmax_int_sub : + Integrable (fun ω => ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p)) μ := by + convert hmax_int using 1 + ext ω + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + have hmax_intY_nat : + Integrable + (fun ω : Ω × Ω => ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p)) (μ.prod μ) := by + simpa [Y] using + integrable_sup'_abs_sub_pow_of_integrable_sup'_abs_pow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ h_meas_sub hmax_int_sub + have hmax_intY : + Integrable + (fun ω : Ω × Ω => (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ (p : ℝ)) (μ.prod μ) := by + simpa [Real.rpow_natCast, Y] using hmax_intY_nat + have hlin := + integral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + (μ := μ.prod μ) (X := Y) (s := Finset.univ) hs_univ hp_real h_indepY + (fun i => by simpa [Y] using! ((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + h_sq_intY h_symmY hmax_intY + have hmax_bound : + ∫ ω : Ω × Ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + have hmax_bound_univ : + ∫ ω : Ω × Ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) ∂μ := by + simpa [Y] using + (integral_sup'_abs_sub_pow_le_two_pow_mul_integral_sup'_abs_pow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ hp_one h_meas_sub + hmax_int_sub) + have hmax_int_eq : + ∫ ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) ∂μ = + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun ω => by + change ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) = + ((s.sup' hs fun i => |X i ω|) ^ p) + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + calc + ∫ ω : Ω × Ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) ∂(μ.prod μ) + ≤ (2 : ℝ) ^ p * ∫ ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) ∂μ := + hmax_bound_univ + _ = (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + rw [hmax_int_eq] + have hSigma_le : + ∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ) ≤ + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + calc + ∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ) + ≤ ∑ i ∈ (Finset.univ : Finset ↥s), 4 * ProbabilityTheory.moment (X i) 2 μ := by + refine Finset.sum_le_sum ?_ + intro i hi + simpa [Y] using moment_sub_comp_fst_comp_snd_le_four_mul + (μ := μ) (h_meas i) (h_sq_int i i.property) + _ = 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + simpa [Finset.univ_eq_attach, Finset.mul_sum] using + (s.sum_attach (fun i => 4 * ProbabilityTheory.moment (X i) 2 μ)) + have hSigma_nonneg : 0 ≤ ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have hsqrt_le : + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)) ≤ + 2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := by + have hsqrt_eq : + Real.sqrt (4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) = + 2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := by + have hsq : + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ = + (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by + calc + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ + = 4 * (Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by + rw [Real.sq_sqrt hSigma_nonneg] + _ = (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by + ring + rw [hsq, Real.sqrt_sq (by positivity)] + calc + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)) + ≤ Real.sqrt (4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := by + exact Real.sqrt_le_sqrt hSigma_le + _ = 2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := hsqrt_eq + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + have hpow_le : + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p + ≤ + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + have hbase_le : + rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) + ≤ + 2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + calc + rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) + ≤ + rosenthalBennettIntegralConst * + (Real.sqrt p * (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) := by + refine mul_le_mul_of_nonneg_left ?_ hRB_nonneg + refine mul_le_mul_of_nonneg_left hsqrt_le (Real.sqrt_nonneg _) + _ = 2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + ring + have hbase_nonneg : + 0 ≤ rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) := by + refine mul_nonneg hRB_nonneg ?_ + exact mul_nonneg (Real.sqrt_nonneg _) (Real.sqrt_nonneg _) + exact pow_le_pow_left₀ hbase_nonneg hbase_le p + have hmax_term_le : + (p : ℝ) ^ p * ∫ ω : Ω × Ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) ∂(μ.prod μ) ≤ + (p : ℝ) ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) := by + exact mul_le_mul_of_nonneg_left hmax_bound (by positivity) + have htail_term_le : + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p + ≤ + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + exact mul_le_mul_of_nonneg_left hpow_le (by positivity) + have hsum_eq : + ∀ ω : Ω × Ω, ∑ i ∈ (Finset.univ : Finset ↥s), Y i ω = symmetrizedFinsetSum X s ω := by + intro ω + simpa [Y] using sum_univ_subtype_eq_symmetrizedFinsetSum (X := X) (s := s) ω + calc + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) + = ∫ ω : Ω × Ω, |∑ i ∈ (Finset.univ : Finset ↥s), Y i ω| ^ p ∂(μ.prod μ) := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun ω => by + change |symmetrizedFinsetSum X s ω| ^ p = + |∑ i ∈ (Finset.univ : Finset ↥s), Y i ω| ^ p + rw [← hsum_eq ω] + _ ≤ (p : ℝ) ^ p * + ∫ ω : Ω × Ω, ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) ∂(μ.prod μ) + + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p := by + simpa [Real.rpow_natCast] using hlin + _ ≤ (p : ℝ) ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) + + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p := by + exact add_le_add hmax_term_le le_rfl + _ ≤ ((p : ℝ) ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + have hmul : + (p : ℝ) ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) = + ((p : ℝ) ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + ring_nf + rw [hmul] + exact add_le_add le_rfl htail_term_le + +/-- Integrability of the symmetrized sum under the Rosenthal assumptions. -/ +theorem integrable_abs_symmetrizedFinsetSum_pow_of_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + classical + let : Nonempty ↥s := ⟨⟨hs.choose, hs.choose_spec⟩⟩ + let Y : ↥s → Ω × Ω → ℝ := fun i ω => X i ω.1 - X i ω.2 + have hs_univ : (Finset.univ : Finset ↥s).Nonempty := Finset.univ_nonempty + have hp_real : 2 ≤ (p : ℝ) := by exact_mod_cast hp + have h_indep_sub : iIndepFun (fun i : ↥s => X i) μ := by + simpa using h_indep.precomp (g := ((↑) : ↥s → ι)) Subtype.val_injective + have h_meas_sub : ∀ i : ↥s, Measurable (X i) := by + intro i + exact h_meas i + have h_indepY : iIndepFun Y (μ.prod μ) := by + simpa [Y] using + iIndepFun_sub_comp_fst_comp_snd_prod + (μ := μ) (X := fun i : ↥s => X i) h_indep_sub h_meas_sub + have h_sq_intY : + ∀ i ∈ (Finset.univ : Finset ↥s), + Integrable (fun ω => Y i ω ^ (2 : ℕ)) (μ.prod μ) := by + intro i hi + simpa [Y] using integrable_pow_two_sub_comp_fst_comp_snd + (μ := μ) (h_meas i) (h_sq_int i i.property) + have h_symmY : + ∀ i ∈ (Finset.univ : Finset ↥s), + IdentDistrib (Y i) (fun ω => -Y i ω) (μ.prod μ) (μ.prod μ) := by + intro i hi + simpa [Y] using identDistrib_sub_comp_fst_comp_snd_prod_neg + (μ := μ) (h_meas i) + have hmax_int_sub : + Integrable (fun ω => ((Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p)) μ := by + convert hmax_int using 1 + ext ω + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + have hmax_intY_nat : + Integrable + (fun ω : Ω × Ω => ((Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p)) (μ.prod μ) := by + simpa [Y] using + integrable_sup'_abs_sub_pow_of_integrable_sup'_abs_pow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ h_meas_sub hmax_int_sub + have hmax_intY : + Integrable + (fun ω : Ω × Ω => (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ (p : ℝ)) (μ.prod μ) := by + simpa [Real.rpow_natCast, Y] using hmax_intY_nat + have hint := + integrable_abs_finsetSum_rpow_of_identDistrib_neg + (μ := μ.prod μ) (X := Y) (s := Finset.univ) hs_univ hp_real h_indepY + (fun i => by simpa [Y] using! ((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + h_sq_intY h_symmY hmax_intY + have hsum_eq : + ∀ ω : Ω × Ω, ∑ i ∈ (Finset.univ : Finset ↥s), Y i ω = symmetrizedFinsetSum X s ω := by + intro ω + simpa [Y] using sum_univ_subtype_eq_symmetrizedFinsetSum (X := X) (s := s) ω + convert hint using 1 + ext ω + rw [show |symmetrizedFinsetSum X s ω| ^ p = |symmetrizedFinsetSum X s ω| ^ (p : ℝ) by + rw [Real.rpow_natCast]] + rw [← hsum_eq ω] + +/-- Rosenthal bound for the centered finite sum on the original probability +space. -/ +theorem integral_abs_centeredFinsetSum_pow_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + ((p : ℝ) ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + exact integrable_abs_symmetrizedFinsetSum_pow_of_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int hmax_int + exact + (integral_abs_centeredFinsetSum_pow_le_integral_abs_symmetrizedFinsetSum_pow + (μ := μ) (X := X) (s := s) (p := p) (by omega) h_int hsymm_int).trans + (integral_abs_symmetrizedFinsetSum_pow_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int hmax_int) + +/-- Note-facing `L^p`-scale form of Rosenthal's inequality: taking the +`1 / p` power of the moment estimate yields the standard sum of the maximal +`L^p` term and the square-function term. -/ +theorem integral_abs_centeredFinsetSum_pow_rpow_inv_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ (1 / (p : ℝ)) ≤ + 2 * (p : ℝ) * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + let L : ℝ := ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ + let M : ℝ := ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + let σ : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ + let V : ℝ := Real.sqrt p * Real.sqrt σ + have hp_one : 1 ≤ p := by omega + have hp_ne_zero : p ≠ 0 := by omega + have hp_real_one : (1 : ℝ) ≤ p := by exact_mod_cast hp_one + have hp_inv_nonneg : 0 ≤ 1 / (p : ℝ) := by positivity + have hp_inv_le_one : 1 / (p : ℝ) ≤ 1 := by + simpa [one_div] using (inv_le_one_of_one_le₀ hp_real_one) + have hL_nonneg : 0 ≤ L := by + dsimp [L] + positivity + have hsup_nonneg : ∀ ω, 0 ≤ s.sup' hs (fun i => |X i ω|) := by + intro ω + have hnonneg : 0 ≤ |X hs.choose ω| := abs_nonneg _ + exact le_trans hnonneg (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact integral_nonneg fun ω => by + exact pow_nonneg (hsup_nonneg ω) _ + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ] + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have hV_nonneg : 0 ≤ V := by + dsimp [V] + positivity + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + have hbase_nonneg : 0 ≤ 2 * rosenthalBennettIntegralConst * V := by + dsimp [V] + positivity + have hmoment : + L ≤ ((p : ℝ) ^ p * (2 : ℝ) ^ p) * M + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p := by + simpa [L, M, σ, V] using + integral_abs_centeredFinsetSum_pow_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_int h_sq_int hmax_int + have hroot : + L ^ (1 / (p : ℝ)) ≤ + ((((p : ℝ) ^ p * (2 : ℝ) ^ p) * M) + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / (p : ℝ)) := by + exact Real.rpow_le_rpow hL_nonneg hmoment hp_inv_nonneg + have hfirst_root : + ((((p : ℝ) ^ p * (2 : ℝ) ^ p) * M) ^ (1 / (p : ℝ))) = + 2 * (p : ℝ) * M ^ (1 / (p : ℝ)) := by + rw [show (1 / (p : ℝ)) = (p⁻¹ : ℝ) by rw [one_div]] + rw [Real.mul_rpow (by positivity) hM_nonneg] + rw [show (p : ℝ) ^ p * (2 : ℝ) ^ p = ((p : ℝ) * 2) ^ p by rw [← mul_pow]] + rw [Real.pow_rpow_inv_natCast (by positivity) hp_ne_zero] + ring + have htwo_rpow_le : (2 : ℝ) ^ (1 / (p : ℝ)) ≤ 2 := by + have hpow : + (2 : ℝ) ^ (1 / (p : ℝ)) ≤ (2 : ℝ) ^ (1 : ℝ) := by + exact Real.rpow_le_rpow_of_exponent_le (by norm_num) hp_inv_le_one + simpa using hpow + have hsecond_root : + (2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / (p : ℝ)) ≤ + 4 * rosenthalBennettIntegralConst * V := by + have htwo_rpow_le' : (2 : ℝ) ^ (p⁻¹ : ℝ) ≤ 2 := by + simpa [one_div] using htwo_rpow_le + rw [show (1 / (p : ℝ)) = (p⁻¹ : ℝ) by rw [one_div]] + calc + (2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (p⁻¹ : ℝ) + = (2 : ℝ) ^ (p⁻¹ : ℝ) * + ((2 * rosenthalBennettIntegralConst * V) ^ p) ^ (p⁻¹ : ℝ) := by + rw [Real.mul_rpow (by positivity) (by positivity)] + _ = (2 : ℝ) ^ (p⁻¹ : ℝ) * (2 * rosenthalBennettIntegralConst * V) := by + rw [Real.pow_rpow_inv_natCast hbase_nonneg hp_ne_zero] + _ ≤ 2 * (2 * rosenthalBennettIntegralConst * V) := by + refine mul_le_mul_of_nonneg_right htwo_rpow_le' hbase_nonneg + _ = 4 * rosenthalBennettIntegralConst * V := by ring + calc + L ^ (1 / (p : ℝ)) + ≤ ((((p : ℝ) ^ p * (2 : ℝ) ^ p) * M) + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / (p : ℝ)) := hroot + _ ≤ ((((p : ℝ) ^ p * (2 : ℝ) ^ p) * M) ^ (1 / (p : ℝ))) + + (2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / (p : ℝ)) := by + refine Real.rpow_add_le_add_rpow ?_ ?_ hp_inv_nonneg hp_inv_le_one + · positivity + · positivity + _ ≤ 2 * (p : ℝ) * M ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * V := by + rw [hfirst_root] + exact add_le_add le_rfl hsecond_root + _ = 2 * (p : ℝ) * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / (p : ℝ)) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + simp [M, V, σ] + +/-- Real-exponent Rosenthal bound for the symmetrized difference sum on the +product probability space. -/ +theorem integral_abs_symmetrizedFinsetSum_rpow_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) ≤ + (p ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + classical + let : Nonempty ↥s := ⟨⟨hs.choose, hs.choose_spec⟩⟩ + let Y : ↥s → Ω × Ω → ℝ := fun i ω => X i ω.1 - X i ω.2 + have hs_univ : (Finset.univ : Finset ↥s).Nonempty := Finset.univ_nonempty + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp_one + have h_indep_sub : iIndepFun (fun i : ↥s => X i) μ := by + simpa using h_indep.precomp (g := ((↑) : ↥s → ι)) Subtype.val_injective + have h_meas_sub : ∀ i : ↥s, Measurable (X i) := fun i => h_meas i + have h_indepY : iIndepFun Y (μ.prod μ) := by + simpa [Y] using + iIndepFun_sub_comp_fst_comp_snd_prod + (μ := μ) (X := fun i : ↥s => X i) h_indep_sub h_meas_sub + have h_sq_intY : + ∀ i ∈ (Finset.univ : Finset ↥s), + Integrable (fun ω => Y i ω ^ (2 : ℕ)) (μ.prod μ) := by + intro i hi + simpa [Y] using integrable_pow_two_sub_comp_fst_comp_snd + (μ := μ) (h_meas i) (h_sq_int i i.property) + have h_symmY : + ∀ i ∈ (Finset.univ : Finset ↥s), + IdentDistrib (Y i) (fun ω => -Y i ω) (μ.prod μ) (μ.prod μ) := by + intro i hi + simpa [Y] using identDistrib_sub_comp_fst_comp_snd_prod_neg + (μ := μ) (h_meas i) + have hmax_int_sub : + Integrable (fun ω => (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) μ := by + convert hmax_int using 1 + ext ω + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + have hmax_intY : + Integrable + (fun ω : Ω × Ω => (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) (μ.prod μ) := by + simpa [Y] using + integrable_sup'_abs_sub_rpow_of_integrable_sup'_abs_rpow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ hp_one h_meas_sub hmax_int_sub + have hlin := + integral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + (μ := μ.prod μ) (X := Y) (s := Finset.univ) hs_univ hp h_indepY + (fun i => by simpa [Y] using! ((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + h_sq_intY h_symmY hmax_intY + have hmax_bound : + ∫ ω : Ω × Ω, (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + have hmax_bound_univ : + ∫ ω : Ω × Ω, (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * + ∫ ω, (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p ∂μ := by + simpa [Y] using + (integral_sup'_abs_sub_rpow_le_two_rpow_mul_integral_sup'_abs_rpow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ hp_one h_meas_sub + hmax_int_sub) + have hmax_int_eq : + ∫ ω, (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p ∂μ = + ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun ω => by + change (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p = + (s.sup' hs fun i => |X i ω|) ^ p + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + calc + ∫ ω : Ω × Ω, (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p ∂(μ.prod μ) + ≤ (2 : ℝ) ^ p * + ∫ ω, (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p ∂μ := hmax_bound_univ + _ = (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by rw [hmax_int_eq] + have hSigma_le : + ∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ) ≤ + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + calc + ∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ) + ≤ ∑ i ∈ (Finset.univ : Finset ↥s), 4 * ProbabilityTheory.moment (X i) 2 μ := by + refine Finset.sum_le_sum ?_ + intro i hi + simpa [Y] using moment_sub_comp_fst_comp_snd_le_four_mul + (μ := μ) (h_meas i) (h_sq_int i i.property) + _ = 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + simpa [Finset.univ_eq_attach, Finset.mul_sum] using + (s.sum_attach (fun i => 4 * ProbabilityTheory.moment (X i) 2 μ)) + have hSigma_nonneg : 0 ≤ ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have hsqrt_le : + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)) ≤ + 2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := by + have hsqrt_eq : + Real.sqrt (4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) = + 2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) := by + have hsq : + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ = + (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by + calc + 4 * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ = + 4 * (Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by + rw [Real.sq_sqrt hSigma_nonneg] + _ = (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) ^ 2 := by ring + rw [hsq, Real.sqrt_sq (by positivity)] + exact (Real.sqrt_le_sqrt hSigma_le).trans_eq hsqrt_eq + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + have hbase_le : + rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) ≤ + 2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + calc + rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) + ≤ rosenthalBennettIntegralConst * + (Real.sqrt p * (2 * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) := by + refine mul_le_mul_of_nonneg_left ?_ hRB_nonneg + exact mul_le_mul_of_nonneg_left hsqrt_le (Real.sqrt_nonneg _) + _ = 2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by ring + have hbase_nonneg : + 0 ≤ rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ))) := by + positivity + have hpow_le : + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p ≤ + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + exact Real.rpow_le_rpow hbase_nonneg hbase_le hp_nonneg + have hmax_term_le : + p ^ p * ∫ ω : Ω × Ω, (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p ∂(μ.prod μ) ≤ + p ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) := by + exact mul_le_mul_of_nonneg_left hmax_bound (Real.rpow_nonneg hp_nonneg _) + have htail_term_le : + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p ≤ + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + exact mul_le_mul_of_nonneg_left hpow_le (by positivity) + have hsum_eq : + ∀ ω : Ω × Ω, ∑ i ∈ (Finset.univ : Finset ↥s), Y i ω = symmetrizedFinsetSum X s ω := by + intro ω + simpa [Y] using sum_univ_subtype_eq_symmetrizedFinsetSum (X := X) (s := s) ω + calc + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) + = ∫ ω : Ω × Ω, |∑ i ∈ (Finset.univ : Finset ↥s), Y i ω| ^ p ∂(μ.prod μ) := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun ω => by + change |symmetrizedFinsetSum X s ω| ^ p = + |∑ i ∈ (Finset.univ : Finset ↥s), Y i ω| ^ p + rw [← hsum_eq ω] + _ ≤ p ^ p * + ∫ ω : Ω × Ω, (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p ∂(μ.prod μ) + + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p := hlin + _ ≤ p ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) + + 2 * + (rosenthalBennettIntegralConst * + (Real.sqrt p * + Real.sqrt + (∑ i ∈ (Finset.univ : Finset ↥s), ProbabilityTheory.moment (Y i) 2 (μ.prod μ)))) ^ p := + add_le_add hmax_term_le le_rfl + _ ≤ (p ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + rw [show p ^ p * ((2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) = + (p ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ by ring] + exact add_le_add le_rfl htail_term_le + +/-- Integrability of the symmetrized real-exponent sum under the Rosenthal +assumptions. -/ +theorem integrable_abs_symmetrizedFinsetSum_rpow_of_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + classical + let : Nonempty ↥s := ⟨⟨hs.choose, hs.choose_spec⟩⟩ + let Y : ↥s → Ω × Ω → ℝ := fun i ω => X i ω.1 - X i ω.2 + have hs_univ : (Finset.univ : Finset ↥s).Nonempty := Finset.univ_nonempty + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have h_indep_sub : iIndepFun (fun i : ↥s => X i) μ := by + simpa using h_indep.precomp (g := ((↑) : ↥s → ι)) Subtype.val_injective + have h_meas_sub : ∀ i : ↥s, Measurable (X i) := fun i => h_meas i + have h_indepY : iIndepFun Y (μ.prod μ) := by + simpa [Y] using + iIndepFun_sub_comp_fst_comp_snd_prod + (μ := μ) (X := fun i : ↥s => X i) h_indep_sub h_meas_sub + have h_sq_intY : + ∀ i ∈ (Finset.univ : Finset ↥s), + Integrable (fun ω => Y i ω ^ (2 : ℕ)) (μ.prod μ) := by + intro i hi + simpa [Y] using integrable_pow_two_sub_comp_fst_comp_snd + (μ := μ) (h_meas i) (h_sq_int i i.property) + have h_symmY : + ∀ i ∈ (Finset.univ : Finset ↥s), + IdentDistrib (Y i) (fun ω => -Y i ω) (μ.prod μ) (μ.prod μ) := by + intro i hi + simpa [Y] using identDistrib_sub_comp_fst_comp_snd_prod_neg + (μ := μ) (h_meas i) + have hmax_int_sub : + Integrable (fun ω => (Finset.univ.sup' hs_univ fun i : ↥s => |X i ω|) ^ p) μ := by + convert hmax_int using 1 + ext ω + rw [sup'_univ_subtype_eq_sup' (hs := hs) (hs_univ := hs_univ) (f := fun i => |X i ω|)] + have hmax_intY : + Integrable + (fun ω : Ω × Ω => (Finset.univ.sup' hs_univ fun i : ↥s => |Y i ω|) ^ p) (μ.prod μ) := by + simpa [Y] using + integrable_sup'_abs_sub_rpow_of_integrable_sup'_abs_rpow + (μ := μ) (X := fun i : ↥s => X i) (s := Finset.univ) hs_univ hp_one h_meas_sub hmax_int_sub + have hint := + integrable_abs_finsetSum_rpow_of_identDistrib_neg + (μ := μ.prod μ) (X := Y) (s := Finset.univ) hs_univ hp h_indepY + (fun i => by simpa [Y] using! ((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + h_sq_intY h_symmY hmax_intY + have hsum_eq : + ∀ ω : Ω × Ω, ∑ i ∈ (Finset.univ : Finset ↥s), Y i ω = symmetrizedFinsetSum X s ω := by + intro ω + simpa [Y] using sum_univ_subtype_eq_symmetrizedFinsetSum (X := X) (s := s) ω + simpa only [hsum_eq] using hint + +/-- Real-exponent Rosenthal bound for the centered finite sum on the original +probability space. -/ +theorem integral_abs_centeredFinsetSum_rpow_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + (p ^ p * (2 : ℝ) ^ p) * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * + (2 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := + integrable_abs_symmetrizedFinsetSum_rpow_of_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int hmax_int + exact + (integral_abs_centeredFinsetSum_rpow_le_integral_abs_symmetrizedFinsetSum_rpow + (μ := μ) (X := X) (s := s) (p := p) (le_trans (by norm_num) hp) h_int hsymm_int).trans + (integral_abs_symmetrizedFinsetSum_rpow_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int hmax_int) + +/-- Real-exponent `L^p`-scale Rosenthal bound for the centered finite sum. -/ +theorem integral_abs_centeredFinsetSum_rpow_rpow_inv_le_rosenthal + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_int : ∀ i ∈ s, Integrable (X i) μ) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + (∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ) ^ (1 / p) ≤ + 2 * p * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / p) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + let L : ℝ := ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ + let M : ℝ := ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + let σ : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ + let V : ℝ := Real.sqrt p * Real.sqrt σ + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp_one + have hp_ne_zero : p ≠ 0 := ne_of_gt (lt_of_lt_of_le zero_lt_one hp_one) + have hp_inv_nonneg : 0 ≤ 1 / p := by positivity + have hp_inv_le_one : 1 / p ≤ 1 := by + simpa [one_div] using inv_le_one_of_one_le₀ hp_one + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact integral_nonneg fun _ => Real.rpow_nonneg (abs_nonneg _) _ + have hsup_nonneg : ∀ ω, 0 ≤ s.sup' hs (fun i => |X i ω|) := by + intro ω + exact le_trans (abs_nonneg _) (Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec) + have hM_nonneg : 0 ≤ M := by + dsimp [M] + exact integral_nonneg fun ω => Real.rpow_nonneg (hsup_nonneg ω) _ + have hσ_nonneg : 0 ≤ σ := by + dsimp [σ] + refine Finset.sum_nonneg fun i hi => ?_ + simp [ProbabilityTheory.moment] + positivity + have hV_nonneg : 0 ≤ V := by + dsimp [V] + positivity + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + have hbase_nonneg : 0 ≤ 2 * rosenthalBennettIntegralConst * V := by positivity + have hmoment : + L ≤ (p ^ p * (2 : ℝ) ^ p) * M + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p := by + simpa [L, M, σ, V] using + integral_abs_centeredFinsetSum_rpow_le_rosenthal + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_int h_sq_int hmax_int + have hroot : + L ^ (1 / p) ≤ + ((p ^ p * (2 : ℝ) ^ p) * M + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / p) := + Real.rpow_le_rpow hL_nonneg hmoment hp_inv_nonneg + have hfirst_root : + ((p ^ p * (2 : ℝ) ^ p) * M) ^ (1 / p) = 2 * p * M ^ (1 / p) := by + rw [show (1 / p) = p⁻¹ by rw [one_div]] + rw [show p ^ p * (2 : ℝ) ^ p = (p * 2) ^ p by + rw [Real.mul_rpow hp_nonneg (by norm_num)]] + rw [Real.mul_rpow (Real.rpow_nonneg (mul_nonneg hp_nonneg (by norm_num)) _) hM_nonneg] + rw [Real.rpow_rpow_inv (mul_nonneg hp_nonneg (by norm_num)) hp_ne_zero] + ring + have htwo_rpow_le : (2 : ℝ) ^ (1 / p) ≤ 2 := by + simpa using Real.rpow_le_rpow_of_exponent_le (by norm_num : (1 : ℝ) ≤ 2) hp_inv_le_one + have hsecond_root : + (2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / p) ≤ + 4 * rosenthalBennettIntegralConst * V := by + rw [show (1 / p) = p⁻¹ by rw [one_div]] + rw [Real.mul_rpow (by positivity) (Real.rpow_nonneg hbase_nonneg _)] + rw [Real.rpow_rpow_inv hbase_nonneg hp_ne_zero] + calc + (2 : ℝ) ^ p⁻¹ * (2 * rosenthalBennettIntegralConst * V) + ≤ 2 * (2 * rosenthalBennettIntegralConst * V) := by + exact mul_le_mul_of_nonneg_right (by simpa using htwo_rpow_le) hbase_nonneg + _ = 4 * rosenthalBennettIntegralConst * V := by ring + calc + L ^ (1 / p) + ≤ ((p ^ p * (2 : ℝ) ^ p) * M + + 2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / p) := hroot + _ ≤ ((p ^ p * (2 : ℝ) ^ p) * M) ^ (1 / p) + + (2 * (2 * rosenthalBennettIntegralConst * V) ^ p) ^ (1 / p) := by + exact Real.rpow_add_le_add_rpow (by positivity) (by positivity) hp_inv_nonneg hp_inv_le_one + _ ≤ 2 * p * M ^ (1 / p) + 4 * rosenthalBennettIntegralConst * V := by + rw [hfirst_root] + exact add_le_add le_rfl hsecond_root + _ = 2 * p * (∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ) ^ (1 / p) + + 4 * rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)) := by + simp [M, V, σ] + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ProductDifference.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ProductDifference.lean new file mode 100644 index 0000000000..fe57599bc0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ProductDifference.lean @@ -0,0 +1,681 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetrization +public import Mathlib.Analysis.MeanInequalitiesPow + +/-! # Product Difference -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- For a finite independent family, pairing the first and second coordinate +copies on the product probability space preserves independence across the +index set. -/ +theorem iIndepFun_prodMk_comp_fst_comp_snd_prod + [Fintype ι] [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) : + iIndepFun (fun i => fun ω : Ω × Ω => (X i ω.1, X i ω.2)) (μ.prod μ) := by + classical + let XT : Ω → ι → ℝ := fun ω i => X i ω + let P : Ω × Ω → ι → ℝ × ℝ := fun ω i => (X i ω.1, X i ω.2) + let Q : Ω × Ω → (ι → ℝ) × (ι → ℝ) := fun ω => (fun i => X i ω.1, fun i => X i ω.2) + have hXT_meas : Measurable XT := by + exact measurable_pi_lambda h_meas + have hXT_map : μ.map XT = Measure.pi (fun i => μ.map (X i)) := by + simpa [XT] using + (ProbabilityTheory.iIndepFun_iff_map_fun_eq_pi_map + (μ := μ) (f := X) (hf := fun i => (h_meas i).aemeasurable)).1 h_indep + have hQfst_meas : Measurable (fun ω : Ω × Ω => fun i => X i ω.1) := by + exact measurable_pi_lambda fun i => (h_meas i).comp measurable_fst + have hQsnd_meas : Measurable (fun ω : Ω × Ω => fun i => X i ω.2) := by + exact measurable_pi_lambda fun i => (h_meas i).comp measurable_snd + have hQ_map : + (μ.prod μ).map Q = + (Measure.pi (fun i => μ.map (X i))).prod + (Measure.pi (fun i => μ.map (X i))) := by + have hQ_indep : + (fun ω : Ω × Ω => fun i => X i ω.1) ⟂ᵢ[μ.prod μ] + (fun ω => fun i => X i ω.2) := by + exact indepFun_comp_fst_comp_snd_prod + (μ := μ) (X := XT) (Y := XT) hXT_meas.aemeasurable hXT_meas.aemeasurable + have hQ_map' := + (ProbabilityTheory.indepFun_iff_map_prod_eq_prod_map_map + (μ := μ.prod μ) + (f := fun ω : Ω × Ω => fun i => X i ω.1) + (g := fun ω : Ω × Ω => fun i => X i ω.2) + hQfst_meas.aemeasurable hQsnd_meas.aemeasurable).1 hQ_indep + have hfst_map : + (μ.prod μ).map (fun ω : Ω × Ω => fun i => X i ω.1) = μ.map XT := by + have hXTfst : AEMeasurable XT ((μ.prod μ).map Prod.fst) := by + rw [measurePreserving_fst.map_eq] + exact hXT_meas.aemeasurable + calc + (μ.prod μ).map (fun ω : Ω × Ω => XT ω.1) + = Measure.map XT ((μ.prod μ).map Prod.fst) := by + symm + exact AEMeasurable.map_map_of_aemeasurable hXTfst measurable_fst.aemeasurable + _ = μ.map XT := by rw [measurePreserving_fst.map_eq] + have hsnd_map : + (μ.prod μ).map (fun ω : Ω × Ω => fun i => X i ω.2) = μ.map XT := by + have hXTsnd : AEMeasurable XT ((μ.prod μ).map Prod.snd) := by + rw [measurePreserving_snd.map_eq] + exact hXT_meas.aemeasurable + calc + (μ.prod μ).map (fun ω : Ω × Ω => XT ω.2) + = Measure.map XT ((μ.prod μ).map Prod.snd) := by + symm + exact AEMeasurable.map_map_of_aemeasurable hXTsnd measurable_snd.aemeasurable + _ = μ.map XT := by rw [measurePreserving_snd.map_eq] + calc + (μ.prod μ).map Q + = ((μ.prod μ).map (fun ω : Ω × Ω => fun i => X i ω.1)).prod + ((μ.prod μ).map (fun ω : Ω × Ω => fun i => X i ω.2)) := hQ_map' + _ = (μ.map XT).prod (μ.map XT) := by rw [hfst_map, hsnd_map] + _ = (Measure.pi (fun i => μ.map (X i))).prod + (Measure.pi (fun i => μ.map (X i))) := by rw [hXT_map] + have hP_meas : Measurable P := by + exact measurable_pi_lambda fun i => + ((h_meas i).comp measurable_fst).prodMk ((h_meas i).comp measurable_snd) + have hP_map : + (μ.prod μ).map P = Measure.pi (fun i => (μ.map (X i)).prod (μ.map (X i))) := by + let e : (ι → ℝ × ℝ) ≃ᵐ (ι → ℝ) × (ι → ℝ) := + MeasurableEquiv.arrowProdEquivProdArrow ℝ ℝ ι + apply (MeasurableEquiv.map_measurableEquiv_injective e) + calc + Measure.map e ((μ.prod μ).map P) + = (μ.prod μ).map Q := by + rw [Measure.map_map e.measurable hP_meas] + rfl + _ = (Measure.pi (fun i => μ.map (X i))).prod + (Measure.pi (fun i => μ.map (X i))) := hQ_map + _ = Measure.map e (Measure.pi (fun i => (μ.map (X i)).prod (μ.map (X i)))) := by + symm + exact + (measurePreserving_arrowProdEquivProdArrow ℝ ℝ ι + (fun i => μ.map (X i)) (fun i => μ.map (X i))).map_eq + have hpair_map : + ∀ i, Measure.map (fun ω : Ω × Ω => (X i ω.1, X i ω.2)) (μ.prod μ) = + (Measure.map (X i) μ).prod (Measure.map (X i) μ) := by + intro i + have hXi_indep : + (fun ω : Ω × Ω => X i ω.1) ⟂ᵢ[μ.prod μ] (fun ω => X i ω.2) := by + exact indepFun_comp_fst_comp_snd_prod + (μ := μ) (X := X i) (Y := X i) (h_meas i).aemeasurable (h_meas i).aemeasurable + have hpair_map' := + (ProbabilityTheory.indepFun_iff_map_prod_eq_prod_map_map + (μ := μ.prod μ) + (f := fun ω : Ω × Ω => X i ω.1) + (g := fun ω : Ω × Ω => X i ω.2) + ((h_meas i).aemeasurable.comp_fst) + ((h_meas i).aemeasurable.comp_snd)).1 hXi_indep + have hfst_i : Measure.map (fun ω : Ω × Ω => X i ω.1) (μ.prod μ) = Measure.map (X i) μ := by + have hXi_fst : AEMeasurable (X i) ((μ.prod μ).map Prod.fst) := by + rw [measurePreserving_fst.map_eq] + exact (h_meas i).aemeasurable + calc + Measure.map (fun ω : Ω × Ω => X i ω.1) (μ.prod μ) + = Measure.map (X i) ((μ.prod μ).map Prod.fst) := by + symm + exact AEMeasurable.map_map_of_aemeasurable hXi_fst measurable_fst.aemeasurable + _ = Measure.map (X i) μ := by rw [measurePreserving_fst.map_eq] + have hsnd_i : Measure.map (fun ω : Ω × Ω => X i ω.2) (μ.prod μ) = Measure.map (X i) μ := by + have hXi_snd : AEMeasurable (X i) ((μ.prod μ).map Prod.snd) := by + rw [measurePreserving_snd.map_eq] + exact (h_meas i).aemeasurable + calc + Measure.map (fun ω : Ω × Ω => X i ω.2) (μ.prod μ) + = Measure.map (X i) ((μ.prod μ).map Prod.snd) := by + symm + exact AEMeasurable.map_map_of_aemeasurable hXi_snd measurable_snd.aemeasurable + _ = Measure.map (X i) μ := by rw [measurePreserving_snd.map_eq] + rw [hfst_i, hsnd_i] at hpair_map' + exact hpair_map' + have hP_aemeas : + ∀ i, AEMeasurable (fun ω : Ω × Ω => (X i ω.1, X i ω.2)) (μ.prod μ) := by + intro i + exact ((h_meas i).aemeasurable.comp_fst).prodMk ((h_meas i).aemeasurable.comp_snd) + exact + (ProbabilityTheory.iIndepFun_iff_map_fun_eq_pi_map + (μ := μ.prod μ) + (f := fun i => fun ω : Ω × Ω => (X i ω.1, X i ω.2)) + (hf := hP_aemeas)).2 <| + hP_map.trans <| by + congr + funext i + exact (hpair_map i).symm + +/-- The symmetrized difference family on the product probability space is +independent across the index set. -/ +theorem iIndepFun_sub_comp_fst_comp_snd_prod + [Fintype ι] [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) : + iIndepFun (fun i => fun ω : Ω × Ω => X i ω.1 - X i ω.2) (μ.prod μ) := by + let g : ι → ℝ × ℝ → ℝ := fun _ z => z.1 - z.2 + have hg : ∀ i, Measurable (g i) := by + intro i + exact measurable_fst.sub measurable_snd + simpa [g] using! + (iIndepFun_prodMk_comp_fst_comp_snd_prod (μ := μ) (X := X) h_indep h_meas).comp g hg + +/-- A first-minus-second coordinate difference is symmetric on the product +probability space. -/ +theorem identDistrib_sub_comp_fst_comp_snd_prod_neg + [IsProbabilityMeasure μ] {X : Ω → ℝ} + (h_meas : Measurable X) : + IdentDistrib + (fun ω : Ω × Ω => X ω.1 - X ω.2) + (fun ω : Ω × Ω => -(X ω.1 - X ω.2)) + (μ.prod μ) (μ.prod μ) := by + let Y : Ω × Ω → ℝ := fun ω => X ω.1 - X ω.2 + have hY_meas : Measurable Y := by + exact (h_meas.comp measurable_fst).sub (h_meas.comp measurable_snd) + have hswap : IdentDistrib Y (fun ω : Ω × Ω => Y (Prod.swap ω)) (μ.prod μ) (μ.prod μ) := by + refine + { aemeasurable_fst := hY_meas.aemeasurable + aemeasurable_snd := hY_meas.aemeasurable.comp_measurable measurable_swap + map_eq := ?_ } + have hYswap : AEMeasurable Y ((μ.prod μ).map Prod.swap) := by + rw [Measure.prod_swap] + exact hY_meas.aemeasurable + calc + Measure.map Y (μ.prod μ) + = Measure.map Y ((μ.prod μ).map Prod.swap) := by rw [Measure.prod_swap] + _ = Measure.map (fun ω : Ω × Ω => Y (Prod.swap ω)) (μ.prod μ) := by + exact AEMeasurable.map_map_of_aemeasurable hYswap measurable_swap.aemeasurable + have hswap_eq : + (fun ω : Ω × Ω => Y (Prod.swap ω)) = fun ω : Ω × Ω => -Y ω := by + funext ω + simp [Y] + refine + { aemeasurable_fst := hY_meas.aemeasurable + aemeasurable_snd := hY_meas.neg.aemeasurable + map_eq := ?_ } + calc + Measure.map Y (μ.prod μ) + = Measure.map (fun ω : Ω × Ω => Y (Prod.swap ω)) (μ.prod μ) := hswap.map_eq + _ = Measure.map (fun ω : Ω × Ω => -Y ω) (μ.prod μ) := by rw [hswap_eq] + _ = Measure.map (fun ω : Ω × Ω => -(X ω.1 - X ω.2)) (μ.prod μ) := by rfl + +section + +omit [MeasurableSpace Ω] + +/-- Pointwise `L^p` control of the finite maximum of the symmetrized family by +the maxima of the two coordinate copies. -/ +theorem sup'_abs_sub_pow_le + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (ω : Ω × Ω) : + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ + (2 ^ (p - 1) : ℝ) * + ((s.sup' hs (fun i => |X i ω.1|)) ^ p + (s.sup' hs (fun i => |X i ω.2|)) ^ p) := by + let A : ℝ := s.sup' hs (fun i => |X i ω.1|) + let B : ℝ := s.sup' hs (fun i => |X i ω.2|) + have hA_nonneg : 0 ≤ A := by + have hnonneg : 0 ≤ |X hs.choose ω.1| := abs_nonneg _ + have hle : |X hs.choose ω.1| ≤ A := by + exact Finset.le_sup' (f := fun i => |X i ω.1|) hs.choose_spec + exact le_trans hnonneg hle + have hB_nonneg : 0 ≤ B := by + have hnonneg : 0 ≤ |X hs.choose ω.2| := abs_nonneg _ + have hle : |X hs.choose ω.2| ≤ B := by + exact Finset.le_sup' (f := fun i => |X i ω.2|) hs.choose_spec + exact le_trans hnonneg hle + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + have hnonneg : 0 ≤ |X hs.choose ω.1 - X hs.choose ω.2| := abs_nonneg _ + have hle : + |X hs.choose ω.1 - X hs.choose ω.2| ≤ + s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + exact Finset.le_sup' (f := fun i => |X i ω.1 - X i ω.2|) hs.choose_spec + exact le_trans hnonneg hle + have hsup : + s.sup' hs (fun i => |X i ω.1 - X i ω.2|) ≤ A + B := by + refine Finset.sup'_le hs _ ?_ + intro i hi + have hAi : |X i ω.1| ≤ A := by + exact Finset.le_sup' (f := fun i => |X i ω.1|) hi + have hBi : |X i ω.2| ≤ B := by + exact Finset.le_sup' (f := fun i => |X i ω.2|) hi + calc + |X i ω.1 - X i ω.2| ≤ |X i ω.1| + |X i ω.2| := by + simpa [sub_eq_add_neg] using abs_add_le (X i ω.1) (-X i ω.2) + _ ≤ A + B := add_le_add hAi hBi + have hpow : + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ (A + B) ^ p := by + exact pow_le_pow_left₀ hsup_nonneg hsup p + have hadd : + (A + B) ^ p ≤ (2 ^ (p - 1) : ℝ) * (A ^ p + B ^ p) := by + exact add_pow_le hA_nonneg hB_nonneg p + exact le_trans hpow (by simpa [A, B] using hadd) + +/-- Real-exponent pointwise `L^p` control of the finite maximum of the +symmetrized family by the maxima of the two coordinate copies. -/ +theorem sup'_abs_sub_rpow_le + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 1 ≤ p) (ω : Ω × Ω) : + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ + (2 : ℝ) ^ (p - 1) * + ((s.sup' hs (fun i => |X i ω.1|)) ^ p + (s.sup' hs (fun i => |X i ω.2|)) ^ p) := by + let A : ℝ := s.sup' hs (fun i => |X i ω.1|) + let B : ℝ := s.sup' hs (fun i => |X i ω.2|) + have hA_nonneg : 0 ≤ A := by + have hnonneg : 0 ≤ |X hs.choose ω.1| := abs_nonneg _ + have hle : |X hs.choose ω.1| ≤ A := by + exact Finset.le_sup' (f := fun i => |X i ω.1|) hs.choose_spec + exact le_trans hnonneg hle + have hB_nonneg : 0 ≤ B := by + have hnonneg : 0 ≤ |X hs.choose ω.2| := abs_nonneg _ + have hle : |X hs.choose ω.2| ≤ B := by + exact Finset.le_sup' (f := fun i => |X i ω.2|) hs.choose_spec + exact le_trans hnonneg hle + have hsup_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + have hnonneg : 0 ≤ |X hs.choose ω.1 - X hs.choose ω.2| := abs_nonneg _ + have hle : + |X hs.choose ω.1 - X hs.choose ω.2| ≤ + s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + exact Finset.le_sup' (f := fun i => |X i ω.1 - X i ω.2|) hs.choose_spec + exact le_trans hnonneg hle + have hsup : + s.sup' hs (fun i => |X i ω.1 - X i ω.2|) ≤ A + B := by + refine Finset.sup'_le hs _ ?_ + intro i hi + have hAi : |X i ω.1| ≤ A := by + exact Finset.le_sup' (f := fun i => |X i ω.1|) hi + have hBi : |X i ω.2| ≤ B := by + exact Finset.le_sup' (f := fun i => |X i ω.2|) hi + calc + |X i ω.1 - X i ω.2| ≤ |X i ω.1| + |X i ω.2| := by + simpa [sub_eq_add_neg] using abs_add_le (X i ω.1) (-X i ω.2) + _ ≤ A + B := add_le_add hAi hBi + have hpow : + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ (A + B) ^ p := by + exact Real.rpow_le_rpow hsup_nonneg hsup (by linarith) + have hadd : + (A + B) ^ p ≤ (2 : ℝ) ^ (p - 1) * (A ^ p + B ^ p) := by + exact_mod_cast NNReal.rpow_add_le_mul_rpow_add_rpow ⟨A, hA_nonneg⟩ ⟨B, hB_nonneg⟩ hp + exact le_trans hpow (by simpa [A, B] using hadd) + +end + +/-- Product-space `L^p` control of the finite maximum of the symmetrized family +by the original maximum. -/ +theorem integral_sup'_abs_sub_pow_le_two_pow_mul_integral_sup'_abs_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (hp : 1 ≤ p) + (h_meas : ∀ i, Measurable (X i)) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω : Ω × Ω, (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let G : Ω × Ω → ℝ := fun ω => (2 ^ (p - 1) : ℝ) * (M ω.1 ^ p + M ω.2 ^ p) + have hfst : Integrable (fun ω : Ω × Ω => M ω.1 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => M ω.2 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 ^ (p - 1) : ℕ) : ℝ) + have hleft_meas : + Measurable (fun ω : Ω × Ω => s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) := by + have hsup_meas : + Measurable (s.sup' hs (fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|)) := by + refine Finset.measurable_sup' (hs := hs) (f := fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|) ?_ + intro i hi + exact + continuous_abs.measurable.comp + (((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + convert hsup_meas using 1 + ext ω + simp + have hleft_aesm : + AEStronglyMeasurable + (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + exact (hleft_meas.aemeasurable.pow_const p).aestronglyMeasurable + have hleft_int : + Integrable + (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + refine hG_int.mono' hleft_aesm ?_ + filter_upwards with ω + have hω := sup'_abs_sub_pow_le (X := X) (s := s) hs (p := p) ω + have hbase_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + have hnonneg : 0 ≤ |X hs.choose ω.1 - X hs.choose ω.2| := abs_nonneg _ + exact le_trans hnonneg (Finset.le_sup' (f := fun i => |X i ω.1 - X i ω.2|) hs.choose_spec) + simpa [G, M, abs_of_nonneg hbase_nonneg] using hω + have hpoint : + ∀ᵐ ω : Ω × Ω ∂(μ.prod μ), + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ G ω := + Filter.Eventually.of_forall fun ω => by + simpa [G, M] using sup'_abs_sub_pow_le (X := X) (s := s) hs (p := p) ω + have hM_meas : Measurable M := by + dsimp [M] + convert + (Finset.measurable_sup' (hs := hs) (f := fun i ω => |X i ω|) fun i _ => + continuous_abs.measurable.comp (h_meas i)) using 1 + ext ω + simp + have hid : + IdentDistrib + (fun ω : Ω × Ω => M ω.1 ^ p) + (fun ω : Ω × Ω => M ω.2 ^ p) + (μ.prod μ) (μ.prod μ) := by + simpa [M, Function.comp_def] using + (identDistrib_comp_fst_comp_snd_prod (μ := μ) (X := M) hM_meas.aemeasurable).comp + (measurable_id.pow_const p) + have hfst_eq : + ∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) = ∫ ω, M ω ^ p ∂μ := by + simpa [M] using + (integral_fun_fst (μ := μ) (ν := μ) (f := fun ω : Ω => M ω ^ p)) + have hsnd_eq : + ∫ ω : Ω × Ω, M ω.2 ^ p ∂(μ.prod μ) = ∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) := by + simpa using hid.integral_eq.symm + have hpow_two : (2 : ℝ) ^ (p - 1) * 2 = (2 : ℝ) ^ p := by + rcases Nat.exists_eq_add_of_le hp with ⟨n, rfl⟩ + simpa [Nat.add_comm, mul_comm] using (pow_succ' (2 : ℝ) n).symm + calc + ∫ ω : Ω × Ω, (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ∂(μ.prod μ) + ≤ ∫ ω : Ω × Ω, G ω ∂(μ.prod μ) := by + exact integral_mono_ae hleft_int hG_int hpoint + _ = (2 ^ (p - 1) : ℝ) * + (∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) + + ∫ ω : Ω × Ω, M ω.2 ^ p ∂(μ.prod μ)) := by + rw [show (∫ ω : Ω × Ω, G ω ∂(μ.prod μ)) = + ∫ ω : Ω × Ω, (2 ^ (p - 1) : ℝ) * (M ω.1 ^ p + M ω.2 ^ p) ∂(μ.prod μ) by rfl] + rw [integral_const_mul] + congr 1 + exact integral_add hfst hsnd + _ = (2 ^ (p - 1) : ℝ) * (2 * ∫ ω, M ω ^ p ∂μ) := by + rw [hsnd_eq, two_mul, hfst_eq] + _ = (2 : ℝ) ^ p * ∫ ω, M ω ^ p ∂μ := by + calc + (2 ^ (p - 1) : ℝ) * (2 * ∫ ω, M ω ^ p ∂μ) + = (((2 : ℝ) ^ (p - 1)) * 2) * ∫ ω, M ω ^ p ∂μ := by ring_nf + _ = (2 : ℝ) ^ p * ∫ ω, M ω ^ p ∂μ := by rw [hpow_two] + _ = (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + rfl + +/-- Square-integrability of the symmetrized copy follows from square +integrability of the original variable. -/ +theorem integrable_pow_two_sub_comp_fst_comp_snd + [IsProbabilityMeasure μ] {X : Ω → ℝ} + (h_meas : Measurable X) + (h_sq_int : Integrable (fun ω => X ω ^ (2 : ℕ)) μ) : + Integrable (fun ω : Ω × Ω => (X ω.1 - X ω.2) ^ (2 : ℕ)) (μ.prod μ) := by + let Y : Ω × Ω → ℝ := fun ω => X ω.1 - X ω.2 + let G : Ω × Ω → ℝ := fun ω => 2 * (X ω.1 ^ (2 : ℕ) + X ω.2 ^ (2 : ℕ)) + have hfst : Integrable (fun ω : Ω × Ω => X ω.1 ^ (2 : ℕ)) (μ.prod μ) := h_sq_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => X ω.2 ^ (2 : ℕ)) (μ.prod μ) := h_sq_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul (2 : ℝ) + have hY_meas : Measurable Y := by + exact (h_meas.comp measurable_fst).sub (h_meas.comp measurable_snd) + have hY_aesm : + AEStronglyMeasurable (fun ω : Ω × Ω => Y ω ^ (2 : ℕ)) (μ.prod μ) := by + exact (hY_meas.aemeasurable.pow_const 2).aestronglyMeasurable + refine hG_int.mono' hY_aesm ?_ + filter_upwards with ω + have hpoint : (X ω.1 - X ω.2) ^ (2 : ℕ) ≤ 2 * (X ω.1 ^ (2 : ℕ) + X ω.2 ^ (2 : ℕ)) := by + nlinarith [sq_nonneg (X ω.1 + X ω.2)] + simpa [Y, G] using hpoint + +/-- The second moment of the symmetrized copy is controlled by the original +second moment. -/ +theorem moment_sub_comp_fst_comp_snd_le_four_mul + [IsProbabilityMeasure μ] {X : Ω → ℝ} + (h_meas : Measurable X) + (h_sq_int : Integrable (fun ω => X ω ^ (2 : ℕ)) μ) : + ProbabilityTheory.moment (fun ω : Ω × Ω => X ω.1 - X ω.2) 2 (μ.prod μ) ≤ + 4 * ProbabilityTheory.moment X 2 μ := by + let Y : Ω × Ω → ℝ := fun ω => X ω.1 - X ω.2 + let G : Ω × Ω → ℝ := fun ω => 2 * (X ω.1 ^ (2 : ℕ) + X ω.2 ^ (2 : ℕ)) + have hY_int : Integrable (fun ω : Ω × Ω => Y ω ^ (2 : ℕ)) (μ.prod μ) := + integrable_pow_two_sub_comp_fst_comp_snd (μ := μ) h_meas h_sq_int + have hfst : Integrable (fun ω : Ω × Ω => X ω.1 ^ (2 : ℕ)) (μ.prod μ) := h_sq_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => X ω.2 ^ (2 : ℕ)) (μ.prod μ) := h_sq_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul (2 : ℝ) + have hpoint : + ∀ᵐ ω : Ω × Ω ∂(μ.prod μ), Y ω ^ (2 : ℕ) ≤ G ω := + Filter.Eventually.of_forall fun ω => by + have hω : (X ω.1 - X ω.2) ^ (2 : ℕ) ≤ 2 * (X ω.1 ^ (2 : ℕ) + X ω.2 ^ (2 : ℕ)) := by + nlinarith [sq_nonneg (X ω.1 + X ω.2)] + simpa [Y, G] using hω + have hfst_eq : + ∫ ω : Ω × Ω, X ω.1 ^ (2 : ℕ) ∂(μ.prod μ) = ProbabilityTheory.moment X 2 μ := by + simpa [ProbabilityTheory.moment] using + (integral_fun_fst (μ := μ) (ν := μ) (f := fun ω : Ω => X ω ^ (2 : ℕ))) + have hsnd_eq : + ∫ ω : Ω × Ω, X ω.2 ^ (2 : ℕ) ∂(μ.prod μ) = ProbabilityTheory.moment X 2 μ := by + simpa [ProbabilityTheory.moment] using + (integral_fun_snd (μ := μ) (ν := μ) (f := fun ω : Ω => X ω ^ (2 : ℕ))) + calc + ProbabilityTheory.moment (fun ω : Ω × Ω => X ω.1 - X ω.2) 2 (μ.prod μ) + = ∫ ω : Ω × Ω, Y ω ^ (2 : ℕ) ∂(μ.prod μ) := by rfl + _ ≤ ∫ ω : Ω × Ω, G ω ∂(μ.prod μ) := by + exact integral_mono_ae hY_int hG_int hpoint + _ = 2 * (∫ ω : Ω × Ω, X ω.1 ^ (2 : ℕ) ∂(μ.prod μ) + + ∫ ω : Ω × Ω, X ω.2 ^ (2 : ℕ) ∂(μ.prod μ)) := by + rw [show (∫ ω : Ω × Ω, G ω ∂(μ.prod μ)) = + ∫ ω : Ω × Ω, 2 * (X ω.1 ^ (2 : ℕ) + X ω.2 ^ (2 : ℕ)) ∂(μ.prod μ) by rfl] + rw [integral_const_mul] + congr 1 + exact integral_add hfst hsnd + _ = 4 * ProbabilityTheory.moment X 2 μ := by + rw [hfst_eq, hsnd_eq] + ring + +/-- Integrability of the symmetrized finite maximum follows from integrability +of the original finite maximum. -/ +theorem integrable_sup'_abs_sub_pow_of_integrable_sup'_abs_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℕ} + (h_meas : ∀ i, Measurable (X i)) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + Integrable (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let G : Ω × Ω → ℝ := fun ω => (2 ^ (p - 1) : ℝ) * (M ω.1 ^ p + M ω.2 ^ p) + have hfst : Integrable (fun ω : Ω × Ω => M ω.1 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => M ω.2 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 ^ (p - 1) : ℕ) : ℝ) + have hleft_meas : + Measurable (fun ω : Ω × Ω => s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) := by + have hsup_meas : + Measurable (s.sup' hs (fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|)) := by + refine Finset.measurable_sup' (hs := hs) (f := fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|) ?_ + intro i hi + exact + continuous_abs.measurable.comp + (((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + convert hsup_meas using 1 + ext ω + simp + have hleft_aesm : + AEStronglyMeasurable + (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + exact (hleft_meas.aemeasurable.pow_const p).aestronglyMeasurable + refine hG_int.mono' hleft_aesm ?_ + filter_upwards with ω + have hω := sup'_abs_sub_pow_le (X := X) (s := s) hs (p := p) ω + have hbase_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + have hnonneg : 0 ≤ |X hs.choose ω.1 - X hs.choose ω.2| := abs_nonneg _ + exact le_trans hnonneg (Finset.le_sup' (f := fun i => |X i ω.1 - X i ω.2|) hs.choose_spec) + simpa [G, M, abs_of_nonneg hbase_nonneg] using hω + +/-- Real-exponent integrability of the symmetrized finite maximum follows +from integrability of the original finite maximum. -/ +theorem integrable_sup'_abs_sub_rpow_of_integrable_sup'_abs_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 1 ≤ p) + (h_meas : ∀ i, Measurable (X i)) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + Integrable (fun ω : Ω × Ω => + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let G : Ω × Ω → ℝ := fun ω => + (2 : ℝ) ^ (p - 1) * (M ω.1 ^ p + M ω.2 ^ p) + have hfst : Integrable (fun ω : Ω × Ω => M ω.1 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => M ω.2 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 : ℝ) ^ (p - 1)) + have hleft_meas : + Measurable (fun ω : Ω × Ω => s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) := by + have hsup_meas : + Measurable (s.sup' hs (fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|)) := by + refine Finset.measurable_sup' (hs := hs) + (f := fun i (ω : Ω × Ω) => |X i ω.1 - X i ω.2|) ?_ + intro i hi + exact continuous_abs.measurable.comp + (((h_meas i).comp measurable_fst).sub ((h_meas i).comp measurable_snd)) + convert hsup_meas using 1 + ext ω + simp + have hleft_aesm : + AEStronglyMeasurable + (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + exact (hleft_meas.pow_const p).aestronglyMeasurable + refine hG_int.mono' hleft_aesm ?_ + filter_upwards with ω + have hω := sup'_abs_sub_rpow_le (X := X) (s := s) hs hp ω + have hbase_nonneg : 0 ≤ s.sup' hs (fun i => |X i ω.1 - X i ω.2|) := by + have hnonneg : 0 ≤ |X hs.choose ω.1 - X hs.choose ω.2| := abs_nonneg _ + exact le_trans hnonneg + (Finset.le_sup' (f := fun i => |X i ω.1 - X i ω.2|) hs.choose_spec) + simpa [G, M, abs_of_nonneg (Real.rpow_nonneg hbase_nonneg p)] using hω + +/-- Product-space real-exponent `L^p` control of the finite maximum of the +symmetrized family by the original maximum. -/ +theorem integral_sup'_abs_sub_rpow_le_two_rpow_mul_integral_sup'_abs_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 1 ≤ p) + (h_meas : ∀ i, Measurable (X i)) + (hmax_int : Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω : Ω × Ω, (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let G : Ω × Ω → ℝ := fun ω => + (2 : ℝ) ^ (p - 1) * (M ω.1 ^ p + M ω.2 ^ p) + have hfst : Integrable (fun ω : Ω × Ω => M ω.1 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => M ω.2 ^ p) (μ.prod μ) := by + simpa [M] using hmax_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 : ℝ) ^ (p - 1)) + have hleft_int : + Integrable + (fun ω : Ω × Ω => (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p) (μ.prod μ) := by + exact integrable_sup'_abs_sub_rpow_of_integrable_sup'_abs_rpow + (μ := μ) (X := X) hs hp h_meas hmax_int + have hpoint : + ∀ᵐ ω : Ω × Ω ∂(μ.prod μ), + (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ≤ G ω := + Filter.Eventually.of_forall fun ω => by + simpa [G, M] using sup'_abs_sub_rpow_le (X := X) (s := s) hs hp ω + have hM_meas : Measurable M := by + dsimp [M] + convert + (Finset.measurable_sup' (hs := hs) (f := fun i ω => |X i ω|) fun i _ => + continuous_abs.measurable.comp (h_meas i)) using 1 + ext ω + simp + have hid : + IdentDistrib + (fun ω : Ω × Ω => M ω.1 ^ p) + (fun ω : Ω × Ω => M ω.2 ^ p) + (μ.prod μ) (μ.prod μ) := by + simpa [M, Function.comp_def] using + (identDistrib_comp_fst_comp_snd_prod (μ := μ) (X := M) hM_meas.aemeasurable).comp + (measurable_id.pow_const p) + have hfst_eq : + ∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) = ∫ ω, M ω ^ p ∂μ := by + simpa [M] using + (integral_fun_fst (μ := μ) (ν := μ) (f := fun ω : Ω => M ω ^ p)) + have hsnd_eq : + ∫ ω : Ω × Ω, M ω.2 ^ p ∂(μ.prod μ) = + ∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) := by + simpa using hid.integral_eq.symm + have hpow_two : (2 : ℝ) ^ (p - 1) * 2 = (2 : ℝ) ^ p := by + calc + (2 : ℝ) ^ (p - 1) * 2 = + (2 : ℝ) ^ (p - 1) * (2 : ℝ) ^ (1 : ℝ) := by rw [Real.rpow_one] + _ = (2 : ℝ) ^ ((p - 1) + 1) := (Real.rpow_add (by norm_num) _ _).symm + _ = (2 : ℝ) ^ p := by + congr 1 + ring + calc + ∫ ω : Ω × Ω, (s.sup' hs (fun i => |X i ω.1 - X i ω.2|)) ^ p ∂(μ.prod μ) + ≤ ∫ ω : Ω × Ω, G ω ∂(μ.prod μ) := by + exact integral_mono_ae hleft_int hG_int hpoint + _ = (2 : ℝ) ^ (p - 1) * + (∫ ω : Ω × Ω, M ω.1 ^ p ∂(μ.prod μ) + + ∫ ω : Ω × Ω, M ω.2 ^ p ∂(μ.prod μ)) := by + rw [show (∫ ω : Ω × Ω, G ω ∂(μ.prod μ)) = + ∫ ω : Ω × Ω, (2 : ℝ) ^ (p - 1) * (M ω.1 ^ p + M ω.2 ^ p) ∂(μ.prod μ) by rfl] + rw [integral_const_mul] + congr 1 + exact integral_add hfst hsnd + _ = (2 : ℝ) ^ (p - 1) * (2 * ∫ ω, M ω ^ p ∂μ) := by + rw [hsnd_eq, two_mul, hfst_eq] + _ = (2 : ℝ) ^ p * ∫ ω, M ω ^ p ∂μ := by + calc + (2 : ℝ) ^ (p - 1) * (2 * ∫ ω, M ω ^ p ∂μ) = + (((2 : ℝ) ^ (p - 1)) * 2) * ∫ ω, M ω ^ p ∂μ := by ring_nf + _ = (2 : ℝ) ^ p * ∫ ω, M ω ^ p ∂μ := by rw [hpow_two] + _ = (2 : ℝ) ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ := by + rfl + +/-- Computing `sup'` over the subtype attached to a nonempty finset agrees with +computing `sup'` over the original finset. -/ +theorem sup'_univ_subtype_eq_sup' + {α : Type*} [SemilatticeSup α] {s : Finset ι} + (hs : s.Nonempty) (hs_univ : (Finset.univ : Finset ↥s).Nonempty) (f : ι → α) : + (Finset.univ : Finset ↥s).sup' hs_univ (fun i : ↥s => f i) = s.sup' hs f := by + simpa [Finset.univ_eq_attach, Finset.attach_map_val] using! + (Finset.sup'_comp_eq_map + (s := s.attach) + (f := Function.Embedding.subtype fun x => x ∈ s) + (g := f) + (hs := by simpa [Finset.univ_eq_attach] using hs_univ)) + +section + +omit [MeasurableSpace Ω] + +/-- The finite symmetrized sum can be rewritten as a sum over the subtype +indexed by the ambient finite set. -/ +theorem sum_univ_subtype_eq_symmetrizedFinsetSum + {X : ι → Ω → ℝ} {s : Finset ι} (ω : Ω × Ω) : + (∑ i ∈ (Finset.univ : Finset ↥s), (X i ω.1 - X i ω.2)) = symmetrizedFinsetSum X s ω := by + rw [Finset.univ_eq_attach, symmetrizedFinsetSum] + simpa using (Finset.sum_attach s (fun i => X i ω.1 - X i ω.2)) + +end + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ScalarBennett.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ScalarBennett.lean new file mode 100644 index 0000000000..f7725c3f1d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/ScalarBennett.lean @@ -0,0 +1,597 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Truncation + +/-! # Scalar Bennett -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +theorem bennettOptimalLambda_nonneg {v y t : ℝ} + (hy : 0 < y) (hv : 0 < v) (ht : 0 ≤ t) : + 0 ≤ bennettOptimalLambda v y t := by + unfold bennettOptimalLambda + have hratio_nonneg : 0 ≤ t * y / v := by + exact div_nonneg (mul_nonneg ht hy.le) hv.le + have hlog_nonneg : 0 ≤ Real.log (1 + t * y / v) := by + apply Real.log_nonneg + linarith + exact div_nonneg hlog_nonneg hy.le + +theorem bennettOptimalExponent_eq {v y t : ℝ} + (hy : 0 < y) (hv : 0 < v) (ht : 0 ≤ t) : + -bennettOptimalLambda v y t * t + + (v / y ^ (2 : ℕ)) + * (Real.exp (bennettOptimalLambda v y t * y) - 1 - bennettOptimalLambda v y t * y) + = -(v / y ^ (2 : ℕ)) * bennettH (t * y / v) := by + unfold bennettOptimalLambda bennettH + have hy_ne : y ≠ 0 := hy.ne' + have hv_ne : v ≠ 0 := hv.ne' + have harg_pos : 0 < 1 + t * y / v := by + have : 0 ≤ t * y / v := by + exact div_nonneg (mul_nonneg ht hy.le) hv.le + linarith + have hmuly : + (Real.log (1 + t * y / v) / y) * y = Real.log (1 + t * y / v) := by + field_simp [hy_ne] + rw [hmuly, Real.exp_log harg_pos] + field_simp [hy_ne, hv_ne] + ring + +theorem integrable_of_abs_le_const + [IsFiniteMeasure μ] + {X : Ω → ℝ} {C : ℝ} + (hXm : AEMeasurable X μ) + (hXbdd : ∀ᵐ ω ∂μ, |X ω| ≤ C) : + Integrable X μ := by + refine Integrable.mono' (integrable_const C) hXm.aestronglyMeasurable ?_ + filter_upwards [hXbdd] with ω hω + simpa using hω + +theorem integrable_pow_two_of_abs_le_const + [IsFiniteMeasure μ] + {X : Ω → ℝ} {C : ℝ} + (hXm : AEMeasurable X μ) + (hXbdd : ∀ᵐ ω ∂μ, |X ω| ≤ C) : + Integrable (fun ω => X ω ^ (2 : ℕ)) μ := by + refine Integrable.mono' (integrable_const (C ^ (2 : ℕ))) + (by + fun_prop : AEStronglyMeasurable (fun ω => X ω ^ (2 : ℕ)) μ) ?_ + filter_upwards [hXbdd] with ω hω + have hsq : X ω ^ (2 : ℕ) ≤ C ^ (2 : ℕ) := by + exact sq_le_sq' (abs_le.mp hω).1 (abs_le.mp hω).2 + simpa [Real.norm_eq_abs, abs_of_nonneg (by positivity : 0 ≤ X ω ^ (2 : ℕ))] using hsq + +theorem integrable_exp_mul_of_abs_le_const + [IsFiniteMeasure μ] + {X : Ω → ℝ} {l y : ℝ} + (hl : 0 ≤ l) + (hXm : AEMeasurable X μ) + (hXbdd : ∀ᵐ ω ∂μ, |X ω| ≤ y) : + Integrable (fun ω => Real.exp (l * X ω)) μ := by + refine Integrable.mono' (integrable_const (Real.exp (l * y))) + (Real.continuous_exp.comp_aestronglyMeasurable + (hXm.aestronglyMeasurable.const_mul l)) ?_ + filter_upwards [hXbdd] with ω hω + have hx_le : X ω ≤ y := le_trans (le_abs_self (X ω)) hω + have hle : l * X ω ≤ l * y := by + exact mul_le_mul_of_nonneg_left hx_le hl + have hexp_le : Real.exp (l * X ω) ≤ Real.exp (l * y) := Real.exp_monotone hle + simpa [Real.norm_eq_abs, abs_of_nonneg (Real.exp_pos _).le] using hexp_le + +/-- The tail term in the second-order exponential remainder series. -/ +noncomputable def bennettTailTerm (a : ℝ) (n : ℕ) : ℝ := + a ^ (n + 2) / (Nat.factorial (n + 2) : ℝ) + +theorem summable_bennettTailTerm (a : ℝ) : Summable (bennettTailTerm a) := by + simpa [bennettTailTerm] using! + ((_root_.summable_nat_add_iff 2).2 (Real.summable_pow_div_factorial a)) + +/-- Scalar Bennett envelope on `[-y, y]`, proved by comparing the exponential +tail series termwise against the quadratic remainder at the endpoint `y`. -/ +theorem exp_mul_le_bennettEnvelope_of_abs_le + {x y l : ℝ} + (hy : 0 < y) (hl : 0 ≤ l) (hxy : |x| ≤ y) : + Real.exp (l * x) ≤ + 1 + l * x + (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y) := by + let tailX : ℕ → ℝ := bennettTailTerm (l * x) + let tailY : ℕ → ℝ := bennettTailTerm (l * y) + have htailx_summable : Summable tailX := by + simpa [tailX] using summable_bennettTailTerm (l * x) + have htaily_summable : Summable tailY := by + simpa [tailY] using summable_bennettTailTerm (l * y) + have htaily_scaled_summable : + Summable (fun n : ℕ => (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * tailY n) := by + exact Summable.mul_left (x ^ (2 : ℕ) / y ^ (2 : ℕ)) htaily_summable + have hx_series : + Real.exp (l * x) = + (∑ i ∈ Finset.range 2, (l * x) ^ i / (Nat.factorial i : ℝ)) + + ∑' n : ℕ, tailX n := by + rw [Real.exp_eq_exp_ℝ, NormedSpace.exp_eq_tsum_div] + symm + exact (Real.summable_pow_div_factorial (l * x)).sum_add_tsum_nat_add 2 + have hy_series : + Real.exp (l * y) = + (∑ i ∈ Finset.range 2, (l * y) ^ i / (Nat.factorial i : ℝ)) + + ∑' n : ℕ, tailY n := by + rw [Real.exp_eq_exp_ℝ, NormedSpace.exp_eq_tsum_div] + symm + exact (Real.summable_pow_div_factorial (l * y)).sum_add_tsum_nat_add 2 + have hheadx : + (∑ i ∈ Finset.range 2, (l * x) ^ i / (Nat.factorial i : ℝ)) = 1 + l * x := by + norm_num [Finset.sum_range_succ] + have hheady : + (∑ i ∈ Finset.range 2, (l * y) ^ i / (Nat.factorial i : ℝ)) = 1 + l * y := by + norm_num [Finset.sum_range_succ] + have hterm : + ∀ n : ℕ, tailX n ≤ (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * tailY n := by + intro n + have habs_mul_le : |l * x| ≤ l * y := by + rw [abs_mul, abs_of_nonneg hl] + exact mul_le_mul_of_nonneg_left hxy hl + have habs_pow_le : |l * x| ^ n ≤ (l * y) ^ n := by + exact pow_le_pow_left₀ (abs_nonneg (l * x)) habs_mul_le n + have hnum : + (l * x) ^ (n + 2) ≤ + (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (l * y) ^ (n + 2) := by + have hnum_abs : + |l * x| ^ (n + 2) ≤ + (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (l * y) ^ (n + 2) := by + calc + |l * x| ^ (n + 2) = |l * x| ^ n * |l * x| ^ (2 : ℕ) := by + rw [pow_add] + _ ≤ (l * y) ^ n * |l * x| ^ (2 : ℕ) := by + gcongr + _ = (l * y) ^ n * ((l * x) ^ (2 : ℕ)) := by + rw [sq_abs] + _ = (l * y) ^ n * (l ^ (2 : ℕ) * x ^ (2 : ℕ)) := by + ring + _ = (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (l * y) ^ (n + 2) := by + field_simp [hy.ne'] + ring + have hpow_abs : (l * x) ^ (n + 2) ≤ |l * x| ^ (n + 2) := by + rw [← abs_pow] + exact le_abs_self _ + exact le_trans hpow_abs hnum_abs + have hfac_pos : 0 < (Nat.factorial (n + 2) : ℝ) := by positivity + calc + tailX n + = (l * x) ^ (n + 2) / (Nat.factorial (n + 2) : ℝ) := by + simp [tailX, bennettTailTerm] + _ + ≤ ((x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (l * y) ^ (n + 2)) / (Nat.factorial (n + 2) : ℝ) := by + exact div_le_div_of_nonneg_right hnum hfac_pos.le + _ = (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * tailY n := by + simp [tailY, bennettTailTerm, div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] + calc + Real.exp (l * x) + = 1 + l * x + ∑' n : ℕ, tailX n := by + rw [hx_series, hheadx] + _ ≤ 1 + l * x + + ∑' n : ℕ, (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * tailY n := by + have htsum_le : + ∑' n : ℕ, tailX n ≤ ∑' n : ℕ, (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * tailY n := + htailx_summable.tsum_le_tsum hterm htaily_scaled_summable + linarith + _ = 1 + l * x + + (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * + ∑' n : ℕ, tailY n := by + rw [← Summable.tsum_mul_left _ htaily_summable] + _ = 1 + l * x + (x ^ (2 : ℕ) / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y) := by + rw [hy_series, hheady] + ring + +/-- One-variable Bennett mgf estimate in the pre-exponential `1 + A` form. -/ +theorem mgf_le_one_add_bennett_of_abs_le_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {y l : ℝ} + (hy : 0 < y) (hl : 0 ≤ l) + (hXm : AEMeasurable X μ) + (hXbdd : ∀ᵐ ω ∂μ, |X ω| ≤ y) + (hXmean : μ[X] = 0) : + mgf X μ l ≤ + 1 + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y) := by + let C : ℝ := Real.exp (l * y) - 1 - l * y + let quad : Ω → ℝ := fun ω => X ω ^ (2 : ℕ) / y ^ (2 : ℕ) + let rhs : Ω → ℝ := fun ω => 1 + l * X ω + quad ω * C + have hX_int : Integrable X μ := + integrable_of_abs_le_const (μ := μ) hXm hXbdd + have hX2_int : Integrable (fun ω => X ω ^ (2 : ℕ)) μ := + integrable_pow_two_of_abs_le_const (μ := μ) hXm hXbdd + have hquad_int : Integrable quad μ := by + simpa [quad, div_eq_mul_inv] using hX2_int.mul_const ((y ^ (2 : ℕ))⁻¹) + have hExp_int : Integrable (fun ω => Real.exp (l * X ω)) μ := + integrable_exp_mul_of_abs_le_const (μ := μ) hl hXm hXbdd + have hrhs_int : Integrable rhs μ := by + have hsplit_rhs : + rhs = (fun _ : Ω => (1 : ℝ)) + ((fun ω => l * X ω) + fun ω => quad ω * C) := by + funext ω + simp [rhs, add_assoc] + rw [hsplit_rhs] + exact (integrable_const (1 : ℝ)).add ((hX_int.const_mul l).add (hquad_int.mul_const C)) + have hpointwise : + ∀ᵐ ω ∂μ, Real.exp (l * X ω) ≤ rhs ω := by + filter_upwards [hXbdd] with ω hω + simpa [rhs, quad] using exp_mul_le_bennettEnvelope_of_abs_le hy hl hω + calc + mgf X μ l = ∫ ω, Real.exp (l * X ω) ∂μ := rfl + _ ≤ ∫ ω, rhs ω ∂μ := integral_mono_ae hExp_int hrhs_int hpointwise + _ = 1 + l * μ[X] + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * C := by + have hlin_int : Integrable (fun ω => l * X ω) μ := hX_int.const_mul l + have hquadC_int : Integrable (fun ω => C * quad ω) μ := hquad_int.const_mul C + have hcalc : + ∫ ω, 1 + l * X ω + C * quad ω ∂μ = + 1 + l * μ[X] + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * C := by + calc + ∫ ω, 1 + l * X ω + C * quad ω ∂μ + = ∫ ω, ((fun ω => (1 : ℝ) + l * X ω) + fun ω => C * quad ω) ω ∂μ := by + simp [add_assoc] + _ = ∫ ω, (1 : ℝ) + l * X ω ∂μ + ∫ ω, C * quad ω ∂μ := by + simpa [Pi.add_apply] using + (integral_add ((integrable_const (1 : ℝ)).add hlin_int) hquadC_int) + _ = (∫ ω, (fun _ : Ω => (1 : ℝ)) ω ∂μ + ∫ ω, l * X ω ∂μ) + ∫ ω, C * quad ω ∂μ := by + congr 1 + simpa [Pi.add_apply] using + (integral_add (integrable_const (1 : ℝ)) hlin_int) + _ = 1 + l * μ[X] + C * ∫ ω, quad ω ∂μ := by + have hquad_scaled : ∫ ω, C * quad ω ∂μ = C * ∫ ω, quad ω ∂μ := by + simpa using integral_const_mul C quad + rw [integral_const, integral_const_mul, hquad_scaled] + simp [smul_eq_mul] + _ = 1 + l * μ[X] + C * (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) := by + congr 1 + simp [quad, ProbabilityTheory.moment, integral_div] + _ = 1 + l * μ[X] + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * C := by + ring + simpa [rhs, mul_comm, mul_left_comm, mul_assoc] using hcalc + _ = 1 + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * C := by + rw [hXmean] + ring + +/-- One-variable Bennett mgf estimate for a centered variable bounded by `y`. -/ +theorem mgf_le_exp_bennett_of_abs_le_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {y l : ℝ} + (hy : 0 < y) (hl : 0 ≤ l) + (hXm : AEMeasurable X μ) + (hXbdd : ∀ᵐ ω ∂μ, |X ω| ≤ y) + (hXmean : μ[X] = 0) : + mgf X μ l ≤ + Real.exp + ((ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y)) := by + have hmoment_nonneg : 0 ≤ ProbabilityTheory.moment X 2 μ := by + simp [ProbabilityTheory.moment] + positivity + have hgap_nonneg : 0 ≤ Real.exp (l * y) - 1 - l * y := by + have h := Real.add_one_le_exp (l * y) + linarith + have hA_nonneg : + 0 ≤ + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y) := by + refine mul_nonneg ?_ hgap_nonneg + exact div_nonneg hmoment_nonneg (pow_nonneg hy.le _) + calc + mgf X μ l + ≤ 1 + (ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y) := by + exact mgf_le_one_add_bennett_of_abs_le_of_integral_eq_zero + (μ := μ) hy hl hXm hXbdd hXmean + _ ≤ Real.exp + ((ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y)) := by + simpa [add_comm] using Real.add_one_le_exp + ((ProbabilityTheory.moment X 2 μ / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y)) + +/-- A Bennett-type moment-generating-function bound implies the corresponding +upper-tail estimate after Chernoff optimization. -/ +theorem measureReal_upperTailEvent_le_of_mgf_le_bennett + [IsFiniteMeasure μ] + {X : Ω → ℝ} {v y a : ℝ} + (hy : 0 < y) (hv : 0 < v) (ha : 0 ≤ a) + (h_int : ∀ l, 0 ≤ l → Integrable (fun ω => Real.exp (l * X ω)) μ) + (hmgf : ∀ l, 0 ≤ l → + mgf X μ l ≤ + Real.exp ((v / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y))) : + μ.real (upperTailEvent X a) ≤ + Real.exp (-(v / y ^ (2 : ℕ)) * bennettH (a * y / v)) := by + let l : ℝ := bennettOptimalLambda v y a + have hl_nonneg : 0 ≤ l := bennettOptimalLambda_nonneg hy hv ha + have hsubset : upperTailEvent X a ⊆ {ω | a ≤ X ω} := by + intro ω hω + simpa [upperTailEvent] using (le_of_lt hω) + refine (measureReal_mono (s₂ := {ω | a ≤ X ω}) hsubset).trans ?_ + calc + μ.real {ω | a ≤ X ω} + ≤ Real.exp (-l * a) * mgf X μ l := by + exact measure_ge_le_exp_mul_mgf + (μ := μ) (X := X) (ε := a) (t := l) hl_nonneg (h_int l hl_nonneg) + _ ≤ Real.exp (-l * a) * + Real.exp ((v / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y)) := by + gcongr + exact hmgf l hl_nonneg + _ = Real.exp (-(v / y ^ (2 : ℕ)) * bennettH (a * y / v)) := by + rw [← Real.exp_add] + congr 1 + simpa [l] using bennettOptimalExponent_eq hy hv ha + +/-- Finite independent sums inherit Bennett-form mgf bounds with the variances +adding linearly. -/ +theorem mgf_finset_sum_le_of_iIndepFun_of_mgf_le_bennett + {X : ι → Ω → ℝ} {v : ι → ℝ} {s : Finset ι} {y l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hmgf : ∀ i ∈ s, + mgf (X i) μ l ≤ + Real.exp ((v i / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y))) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ + Real.exp (((∑ i ∈ s, v i) / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y)) := by + calc + mgf (fun ω => ∑ i ∈ s, X i ω) μ l = ∏ i ∈ s, mgf (X i) μ l := by + have hsumfun : (fun ω => ∑ i ∈ s, X i ω) = ∑ i ∈ s, X i := by + funext ω + simp [Finset.sum_apply] + rw [hsumfun] + exact h_indep.mgf_sum (t := l) h_meas s + _ ≤ ∏ i ∈ s, + Real.exp ((v i / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y)) := by + refine Finset.prod_le_prod₀ ?_ hmgf + intro i hi + exact mgf_nonneg + _ = Real.exp (∑ i ∈ s, + (v i / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y)) := by + rw [← Real.exp_sum] + _ = Real.exp (((∑ i ∈ s, v i) / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y)) := by + let C : ℝ := Real.exp (l * y) - 1 - l * y + congr 1 + calc + ∑ i ∈ s, v i / y ^ (2 : ℕ) * (Real.exp (l * y) - 1 - l * y) + = ∑ i ∈ s, v i * ((y ^ (2 : ℕ))⁻¹ * C) := by + refine Finset.sum_congr rfl ?_ + intro i hi + simp [C, div_eq_mul_inv] + ring + _ = (∑ i ∈ s, v i) * ((y ^ (2 : ℕ))⁻¹ * C) := by + rw [Finset.sum_mul] + _ = ((∑ i ∈ s, v i) / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y) := by + simp [C, div_eq_mul_inv] + ring + +/-- Bennett tail bounds for finite independent sums, assuming Bennett-form mgf +bounds for each summand. -/ +theorem measureReal_upperTailEvent_finset_sum_le_of_iIndepFun_of_mgf_le_bennett + [IsFiniteMeasure μ] + {X : ι → Ω → ℝ} {v : ι → ℝ} {s : Finset ι} {y a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, v i) + (ha : 0 ≤ a) + (h_int : ∀ i ∈ s, ∀ l, 0 ≤ l → Integrable (fun ω => Real.exp (l * X i ω)) μ) + (hmgf : ∀ i ∈ s, ∀ l, 0 ≤ l → + mgf (X i) μ l ≤ + Real.exp ((v i / y ^ (2 : ℕ)) * (Real.exp (l * y) - 1 - l * y))) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp (- + (((∑ i ∈ s, v i) / y ^ (2 : ℕ)) * bennettH (a * y / (∑ i ∈ s, v i)))) := by + simpa [neg_mul] using + (measureReal_upperTailEvent_le_of_mgf_le_bennett + (μ := μ) + (X := fun ω => ∑ i ∈ s, X i ω) + (v := ∑ i ∈ s, v i) + (y := y) + (a := a) + hy hv ha + (by + intro l hl + simpa [Finset.sum_apply] using + (ProbabilityTheory.iIndepFun.integrable_exp_mul_sum + (μ := μ) (X := X) (t := l) h_indep h_meas (s := s) + (fun i hi => h_int i hi l hl))) + (by + intro l hl + exact mgf_finset_sum_le_of_iIndepFun_of_mgf_le_bennett + (μ := μ) (X := X) (v := v) (s := s) (y := y) (l := l) + h_indep h_meas (fun i hi => hmgf i hi l hl))) + +/-- Bounded centered independent summands satisfy the project Bennett mgf bound +with variance proxy given by the sum of second moments. -/ +theorem mgf_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {y l : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hy : 0 < y) (hl : 0 ≤ l) + (hXbdd : ∀ i ∈ s, ∀ᵐ ω ∂μ, |X i ω| ≤ y) + (hXmean : ∀ i ∈ s, μ[X i] = 0) : + mgf (fun ω => ∑ i ∈ s, X i ω) μ l ≤ + Real.exp + (((∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) / y ^ (2 : ℕ)) * + (Real.exp (l * y) - 1 - l * y)) := by + exact mgf_finset_sum_le_of_iIndepFun_of_mgf_le_bennett + (μ := μ) + (X := X) + (v := fun i => ProbabilityTheory.moment (X i) 2 μ) + (s := s) + (y := y) + (l := l) + h_indep + h_meas + (fun i hi => + mgf_le_exp_bennett_of_abs_le_of_integral_eq_zero + (μ := μ) + (X := X i) + (y := y) + (l := l) + hy + hl + (h_meas i).aemeasurable + (hXbdd i hi) + (hXmean i hi)) + +/-- Bennett upper-tail estimate for finite sums of bounded centered independent +real random variables. -/ +theorem measureReal_upperTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {y a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) + (ha : 0 ≤ a) + (hXbdd : ∀ i ∈ s, ∀ᵐ ω ∂μ, |X i ω| ≤ y) + (hXmean : ∀ i ∈ s, μ[X i] = 0) : + μ.real (upperTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) / y ^ (2 : ℕ)) * + bennettH (a * y / (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)))) := by + exact measureReal_upperTailEvent_finset_sum_le_of_iIndepFun_of_mgf_le_bennett + (μ := μ) + (X := X) + (v := fun i => ProbabilityTheory.moment (X i) 2 μ) + (s := s) + (y := y) + (a := a) + h_indep + h_meas + hy + hv + ha + (by + intro i hi l hl + exact integrable_exp_mul_of_abs_le_const + (μ := μ) + (X := X i) + (l := l) + (y := y) + hl + (h_meas i).aemeasurable + (hXbdd i hi)) + (by + intro i hi l hl + exact mgf_le_exp_bennett_of_abs_le_of_integral_eq_zero + (μ := μ) + (X := X i) + (y := y) + (l := l) + hy + hl + (h_meas i).aemeasurable + (hXbdd i hi) + (hXmean i hi)) + +/-- Bennett absolute-tail estimate for finite sums of bounded centered independent +real random variables. -/ +theorem measureReal_absTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {y a : ℝ} + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (hy : 0 < y) + (hv : 0 < ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) + (ha : 0 ≤ a) + (hXbdd : ∀ i ∈ s, ∀ᵐ ω ∂μ, |X i ω| ≤ y) + (hXmean : ∀ i ∈ s, μ[X i] = 0) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) a) ≤ + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) / y ^ (2 : ℕ)) * + bennettH (a * y / (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)))) := by + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let Xneg : ι → Ω → ℝ := fun i ω => -X i ω + let B : ℝ := + Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) / y ^ (2 : ℕ)) * + bennettH (a * y / (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)))) + have hsubset : + absTailEvent S a ⊆ upperTailEvent S a ∪ upperTailEvent (fun ω => -S ω) a := by + intro ω hω + rw [mem_union, mem_upperTailEvent, mem_upperTailEvent] + exact lt_abs.mp (by simpa [absTailEvent, upperTailEvent] using hω) + have h_indep_neg : iIndepFun Xneg μ := by + simpa [Xneg, Function.comp] using! + h_indep.comp (fun _ => fun x : ℝ => -x) (fun _ => measurable_neg) + have h_meas_neg : ∀ i, Measurable (Xneg i) := by + intro i + simpa [Xneg] using h_meas i + have hv_neg : 0 < ∑ i ∈ s, ProbabilityTheory.moment (Xneg i) 2 μ := by + simpa [Xneg, ProbabilityTheory.moment] using hv + have hXbdd_neg : ∀ i ∈ s, ∀ᵐ ω ∂μ, |Xneg i ω| ≤ y := by + intro i hi + simpa [Xneg] using hXbdd i hi + have hXmean_neg : ∀ i ∈ s, μ[Xneg i] = 0 := by + intro i hi + simpa [Xneg, integral_neg] using congrArg Neg.neg (hXmean i hi) + have hupper : μ.real (upperTailEvent S a) ≤ B := by + simpa [S, B] using + (measureReal_upperTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) + (X := X) + (s := s) + (y := y) + (a := a) + h_indep + h_meas + hy + hv + ha + hXbdd + hXmean) + have hupper_neg : μ.real (upperTailEvent (fun ω => -S ω) a) ≤ B := by + simpa [S, Xneg, B, ProbabilityTheory.moment, Finset.sum_neg_distrib] using + (measureReal_upperTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) + (X := Xneg) + (s := s) + (y := y) + (a := a) + h_indep_neg + h_meas_neg + hy + hv_neg + ha + hXbdd_neg + hXmean_neg) + have hsum : + μ.real (upperTailEvent S a) + μ.real (upperTailEvent (fun ω => -S ω) a) ≤ B + B := + add_le_add hupper hupper_neg + calc + μ.real (absTailEvent S a) ≤ + μ.real (upperTailEvent S a ∪ upperTailEvent (fun ω => -S ω) a) := by + exact measureReal_mono hsubset + _ ≤ μ.real (upperTailEvent S a) + μ.real (upperTailEvent (fun ω => -S ω) a) := by + exact measureReal_union_le _ _ + _ ≤ B + B := hsum + _ = 2 * B := by ring + _ = + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) / y ^ (2 : ℕ)) * + bennettH (a * y / (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)))) := by + rfl + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetric.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetric.lean new file mode 100644 index 0000000000..eecbf3846a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetric.lean @@ -0,0 +1,803 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.CenteredTruncation + +/-! # Symmetric -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- A symmetric variable keeps zero mean after absolute truncation. -/ +theorem integral_absTruncation_eq_zero_of_identDistrib_neg + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {r : ℝ} + (hX_symm : IdentDistrib X (fun ω => -X ω) μ μ) : + μ[absTruncation X r] = 0 := by + let φ : ℝ → ℝ := absTruncation (fun t : ℝ => t) r + have hφ : Measurable φ := + absTruncation_measurable (X := fun t : ℝ => t) (r := r) measurable_id + have htr : IdentDistrib (φ ∘ X) (φ ∘ fun ω => -X ω) μ μ := + hX_symm.comp hφ + have hodd : ∀ x : ℝ, φ (-x) = -φ x := by + intro x + by_cases hx : r < |x| + · simp [φ, hx, abs_neg] + · simp [φ, hx, abs_neg] + have hEq : ∫ ω, φ (X ω) ∂μ = -∫ ω, φ (X ω) ∂μ := by + simpa [hodd, integral_neg, Function.comp] using htr.integral_eq + have hzero : ∫ ω, φ (X ω) ∂μ = 0 := + CharZero.eq_neg_self_iff.mp hEq + simpa [φ] using hzero + +section + +omit [MeasurableSpace Ω] + +/-- If the absolute maximum of a finite family is below the truncation scale, +each truncated variable agrees with the original one. -/ +theorem absTruncation_eq_self_of_sup'_abs_le + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {r : ℝ} {ω : Ω} + (hω : s.sup' hs (fun i => |X i ω|) ≤ r) : + ∀ i ∈ s, absTruncation (X i) r ω = X i ω := by + intro i hi + exact absTruncation_of_abs_le ((Finset.sup'_le_iff hs _).mp hω i hi) + +/-- In the symmetric Rosenthal proof, the tail of the finite sum splits into the +tail of the finite maximum and the tail of the bounded truncation sum. -/ +theorem absTailEvent_finsetSum_subset_sup'_abs_union_absTruncation + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {r t : ℝ} : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) t ⊆ + upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r ∪ + absTailEvent (fun ω => ∑ i ∈ s, absTruncation (X i) r ω) t := by + intro ω hω + by_cases hsup : r < s.sup' hs (fun i => |X i ω|) + · exact Or.inl hsup + · have hsup_le : s.sup' hs (fun i => |X i ω|) ≤ r := le_of_not_gt hsup + have hω' : ω ∈ absTailEvent (fun ω => ∑ i ∈ s, absTruncation (X i) r ω) t := by + have hω'' : t < |∑ i ∈ s, X i ω| := by + simpa [absTailEvent] using hω + have hsmall : ∀ i ∈ s, ¬ r < |X i ω| := by + intro i hi + exact not_lt_of_ge ((Finset.sup'_le_iff hs _).mp hsup_le i hi) + have htail_zero : ∑ i ∈ s, (if r < |X i ω| then X i ω else 0) = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + simp [hsmall i hi] + rw [absTailEvent, upperTailEvent] + simpa [absTruncation, absTailIndicator, Finset.sum_sub_distrib, htail_zero] using hω'' + exact Or.inr hω' + +theorem abs_absTruncation_le_abs + {X : Ω → ℝ} {r : ℝ} (ω : Ω) : + |absTruncation X r ω| ≤ |X ω| := by + by_cases hω : r < |X ω| + · simp [absTruncation, absTailIndicator, hω] + · simp [absTruncation, absTailIndicator, hω] + +end + +/-- Truncating a variable can only decrease its second moment. -/ +theorem moment_absTruncation_two_le + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {r : ℝ} + (hX_meas : Measurable X) + (hX_sq_int : Integrable (fun ω => X ω ^ (2 : ℕ)) μ) : + ProbabilityTheory.moment (absTruncation X r) 2 μ ≤ ProbabilityTheory.moment X 2 μ := by + have htrunc_sq_meas : Measurable (fun ω => absTruncation X r ω ^ (2 : ℕ)) := + (absTruncation_measurable (X := X) (r := r) hX_meas).pow_const 2 + have htrunc_sq_int : Integrable (fun ω => absTruncation X r ω ^ (2 : ℕ)) μ := by + refine Integrable.mono' hX_sq_int htrunc_sq_meas.aemeasurable.aestronglyMeasurable ?_ + filter_upwards with ω + have hpow : + |absTruncation X r ω| ^ (2 : ℕ) ≤ |X ω| ^ (2 : ℕ) := + pow_le_pow_left₀ (abs_nonneg _) (abs_absTruncation_le_abs (X := X) (r := r) ω) 2 + simpa [Real.norm_eq_abs, sq_abs, + abs_of_nonneg (show 0 ≤ absTruncation X r ω ^ (2 : ℕ) by positivity), + abs_of_nonneg (show 0 ≤ X ω ^ (2 : ℕ) by positivity)] using hpow + refine integral_mono_ae htrunc_sq_int hX_sq_int ?_ + filter_upwards with ω + have hpow : + |absTruncation X r ω| ^ (2 : ℕ) ≤ |X ω| ^ (2 : ℕ) := + pow_le_pow_left₀ (abs_nonneg _) (abs_absTruncation_le_abs (X := X) (r := r) ω) 2 + simpa [ProbabilityTheory.moment, sq_abs] using hpow + +/-- Symmetric truncation tail bound: split off the event where the finite +maximum exceeds the truncation scale, and apply Bennett to the bounded +truncation sum. -/ +theorem measureReal_absTailEvent_finsetSum_le_sup'_abs_add_bennett + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {r t : ℝ} + (hr : 0 < r) (ht : 0 ≤ t) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_symm : ∀ i ∈ s, IdentDistrib (X i) (fun ω => -X i ω) μ μ) + (hv_pos : 0 < ∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) t) ≤ + μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r) + + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ) / + r ^ (2 : ℕ)) * + bennettH + (t * r / + (∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ)))) := by + let Y : ι → Ω → ℝ := fun i => absTruncation (X i) r + have hsubset : + absTailEvent (fun ω => ∑ i ∈ s, X i ω) t ⊆ + upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r ∪ + absTailEvent (fun ω => ∑ i ∈ s, Y i ω) t := by + simpa [Y] using + (absTailEvent_finsetSum_subset_sup'_abs_union_absTruncation + (X := X) (s := s) hs (r := r) (t := t)) + have h_indepY : iIndepFun Y μ := by + let g : ι → ℝ → ℝ := fun _ x => absTruncation (fun t : ℝ => t) r x + have hg : ∀ i, Measurable (g i) := by + intro i + exact absTruncation_measurable (X := fun t : ℝ => t) (r := r) measurable_id + simpa [Y, g, Function.comp] using! h_indep.comp g hg + have h_measY : ∀ i, Measurable (Y i) := by + intro i + exact absTruncation_measurable (X := X i) (r := r) (h_meas i) + have h_meanY : ∀ i ∈ s, μ[Y i] = 0 := by + intro i hi + exact integral_absTruncation_eq_zero_of_identDistrib_neg + (μ := μ) (X := X i) (r := r) (h_symm i hi) + have h_bddY : ∀ i ∈ s, ∀ᵐ ω ∂μ, |Y i ω| ≤ r := by + intro i hi + exact Filter.Eventually.of_forall fun ω => + abs_absTruncation_le (X := X i) (r := r) hr.le ω + have htailY := + measureReal_absTailEvent_finset_sum_le_bennett_of_iIndepFun_of_abs_le_of_integral_eq_zero + (μ := μ) (X := Y) (s := s) (y := r) (a := t) + h_indepY h_measY hr hv_pos ht h_bddY h_meanY + have htailY' : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, Y i ω) t) ≤ + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ) / + r ^ (2 : ℕ)) * + bennettH + (t * r / + (∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ)))) := by + simpa [Y] using! htailY + calc + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) t) + ≤ μ.real + (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r ∪ + absTailEvent (fun ω => ∑ i ∈ s, Y i ω) t) := by + exact measureReal_mono hsubset + _ ≤ μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r) + + μ.real (absTailEvent (fun ω => ∑ i ∈ s, Y i ω) t) := by + exact measureReal_union_le _ _ + _ ≤ μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r) + + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ) / + r ^ (2 : ℕ)) * + bennettH + (t * r / + (∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ)))) := by + exact add_le_add_right htailY' _ + _ = μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) r) + + 2 * Real.exp + (- + (((∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ) / + r ^ (2 : ℕ)) * + bennettH + (t * r / + (∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ)))) := by + rfl + +theorem bennett_truncation_exponent_eq_beta + {v r t : ℝ} (hr : r ≠ 0) (hv : v ≠ 0) : + ((v / r ^ (2 : ℕ)) * bennettH (t * r / v)) = (t / r) * bennettBeta (t * r / v) := by + by_cases ht : t = 0 + · simp [ht, bennettH_zero, bennettBeta] + · have hcoeff : v / r ^ (2 : ℕ) = (t / r) / (t * r / v) := by + field_simp [hr, hv, ht] + calc + (v / r ^ (2 : ℕ)) * bennettH (t * r / v) + = (((t / r) / (t * r / v)) * bennettH (t * r / v)) := by rw [hcoeff] + _ = (t / r) * (bennettH (t * r / v) / (t * r / v)) := by + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + _ = (t / r) * bennettBeta (t * r / v) := by rw [bennettBeta] + +/-- Moment-adapted truncation choice in the symmetric Rosenthal proof: +specializing the truncation scale to `r = t / p` converts the Bennett term to +the exact note-facing `p β(t² / (p σ²))` form. -/ +theorem measureReal_absTailEvent_finsetSum_le_sup'_abs_add_bennettBeta_of_scale + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p t : ℝ} + (hp : 1 ≤ p) (ht : 0 < t) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (h_symm : ∀ i ∈ s, IdentDistrib (X i) (fun ω => -X i ω) μ μ) + (hv_pos : + 0 < ∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) (t / p) ω) 2 μ) + (hSigma_pos : 0 < ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ) : + μ.real (absTailEvent (fun ω => ∑ i ∈ s, X i ω) t) ≤ + μ.real (upperTailEvent (fun ω => s.sup' hs (fun i => |X i ω|)) (t / p)) + + 2 * Real.exp + (-(p * bennettBeta + (t ^ (2 : ℕ) / (p * ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ)))) := by + let r : ℝ := t / p + let v : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) r ω) 2 μ + let sigmaSq : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_one hp + have hr_pos : 0 < r := div_pos ht hp_pos + have hv_le : v ≤ sigmaSq := by + dsimp [v, sigmaSq] + refine Finset.sum_le_sum ?_ + intro i hi + simpa [r] using! moment_absTruncation_two_le + (μ := μ) (X := X i) (r := t / p) (h_meas i) (h_sq_int i hi) + have hmaster := + measureReal_absTailEvent_finsetSum_le_sup'_abs_add_bennett + (μ := μ) (X := X) (s := s) hs hr_pos (le_of_lt ht) + h_indep h_meas h_symm (by simpa [v, r] using hv_pos) + have harg_le : t * r / sigmaSq ≤ t * r / v := by + have htr_nonneg : 0 ≤ t * r := mul_nonneg ht.le hr_pos.le + have hinv : sigmaSq⁻¹ ≤ v⁻¹ := by + simpa [one_div] using! one_div_le_one_div_of_le hv_pos hv_le + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + mul_le_mul_of_nonneg_left hinv htr_nonneg + have hleft_pos : 0 < t * r / sigmaSq := by + exact div_pos (mul_pos ht hr_pos) hSigma_pos + have hright_pos : 0 < t * r / v := by + exact div_pos (mul_pos ht hr_pos) hv_pos + have hbeta_mono : bennettBeta (t * r / sigmaSq) ≤ bennettBeta (t * r / v) := + monotoneOn_bennettBeta hleft_pos hright_pos harg_le + have hscale_mul : p * r = t := by + dsimp [r] + field_simp [hp_pos.ne'] + have hscale : t / r = p := by + rw [div_eq_iff hr_pos.ne'] + simpa [mul_comm] using hscale_mul.symm + have harg_eq : t * r / sigmaSq = t ^ (2 : ℕ) / (p * sigmaSq) := by + dsimp [r] + field_simp [hp_pos.ne', hSigma_pos.ne'] + have hbeta_mono' : + bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)) ≤ bennettBeta (t * r / v) := by + calc + bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)) + = bennettBeta (t * r / sigmaSq) := by rw [harg_eq] + _ ≤ bennettBeta (t * r / v) := hbeta_mono + have hexponent : + -(((v / r ^ (2 : ℕ)) * bennettH (t * r / v))) ≤ + -(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))) := by + rw [bennett_truncation_exponent_eq_beta (hr := hr_pos.ne') (hv := (by simpa [v] using hv_pos.ne'))] + rw [hscale] + exact neg_le_neg (mul_le_mul_of_nonneg_left hbeta_mono' hp_pos.le) + refine hmaster.trans ?_ + gcongr + +/-- Vanishing second moment forces a real random variable to vanish almost +everywhere. This is the degenerate case used in the Rosenthal proof when the +variance proxy is zero. -/ +theorem ae_eq_zero_of_moment_two_eq_zero + {X : Ω → ℝ} + (hX_sq_int : Integrable (fun ω => X ω ^ (2 : ℕ)) μ) + (hX_moment_zero : ProbabilityTheory.moment X 2 μ = 0) : + X =ᵐ[μ] 0 := by + have hsq_nonneg : 0 ≤ᵐ[μ] fun ω => X ω ^ (2 : ℕ) := + Filter.Eventually.of_forall fun ω => by positivity + have hsq_zero : (fun ω => X ω ^ (2 : ℕ)) =ᵐ[μ] 0 := by + refine (MeasureTheory.integral_eq_zero_iff_of_nonneg_ae hsq_nonneg hX_sq_int).1 ?_ + simpa [ProbabilityTheory.moment] using hX_moment_zero + filter_upwards [hsq_zero] with ω hω + rw [pow_two] at hω + exact mul_self_eq_zero.mp hω + +/-- A finite sum of almost-everywhere vanishing functions vanishes almost +everywhere. -/ +theorem ae_eq_zero_finsetSum_of_forall + {Y : ι → Ω → ℝ} {s : Finset ι} + (hY_zero : ∀ i ∈ s, Y i =ᵐ[μ] 0) : + (fun ω => ∑ i ∈ s, Y i ω) =ᵐ[μ] 0 := by + classical + induction s using Finset.induction_on with + | empty => + exact Filter.Eventually.of_forall (fun _ => by simp) + | @insert a s ha ih => + have hae : Y a =ᵐ[μ] 0 := hY_zero a (by simp) + have hrest : (fun ω => ∑ i ∈ s, Y i ω) =ᵐ[μ] 0 := by + apply ih + intro i hi + exact hY_zero i (by simp [hi]) + simpa [Finset.sum_insert, ha] using! hae.add hrest + +/-- Symmetric Rosenthal bound in `lintegral` form. This is the exact +tail-integration endpoint coming from the Chapter 4 Bennett-plus-maximum split. -/ +theorem lintegral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (h_symm : ∀ i ∈ s, IdentDistrib (X i) (fun ω => -X i ω) μ μ) : + ∫⁻ ω, ENNReal.ofReal (|∑ i ∈ s, X i ω| ^ p) ∂μ ≤ + ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ + + ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p) := by + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let sigmaSq : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ + have hp_pos : 0 < p := lt_of_lt_of_le zero_lt_two hp + have hp_one : 1 ≤ p := le_trans (by norm_num) hp + have hSigma_nonneg : 0 ≤ sigmaSq := by + dsimp [sigmaSq] + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have hS_meas : Measurable S := by + dsimp [S] + refine Finset.measurable_sum s ?_ + intro i hi + exact h_meas i + have hLayerS := + MeasureTheory.lintegral_rpow_eq_lintegral_meas_lt_mul + (μ := μ) (f := fun ω => |S ω|) + (Filter.Eventually.of_forall fun ω => abs_nonneg (S ω)) + (continuous_abs.measurable.comp_aemeasurable hS_meas.aemeasurable) hp_pos + by_cases hSigma_pos : 0 < sigmaSq + · let kernel : ℝ → ℝ := fun t => + t ^ (p - 1) * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) + let A : ℝ → ENNReal := fun t => + μ {ω | t / p < M ω} * ENNReal.ofReal (t ^ (p - 1)) + let B : ℝ → ENNReal := fun t => + ENNReal.ofReal (2 * kernel t) + have hB_aemeas : + AEMeasurable B (volume.restrict (Set.Ioi (0 : ℝ))) := by + have hB_int : + Integrable (fun t => 2 * kernel t) (volume.restrict (Set.Ioi (0 : ℝ))) := by + simpa [kernel, IntegrableOn] using + ((integrableOn_rosenthal_bennett_scaled_kernel (p := p) (sigmaSq := sigmaSq) hp hSigma_pos)).const_mul + (2 : ℝ) + exact measurable_id.ennreal_ofReal.comp_aemeasurable hB_int.aestronglyMeasurable.aemeasurable + have hdom : + ∀ᵐ t ∂(volume.restrict (Set.Ioi (0 : ℝ))), + μ {ω | t < |S ω|} * ENNReal.ofReal (t ^ (p - 1)) ≤ A t + B t := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with t ht + let truncVar : ℝ := ∑ i ∈ s, ProbabilityTheory.moment (fun ω => absTruncation (X i) (t / p) ω) 2 μ + have htail_real : + μ.real (absTailEvent S t) ≤ + μ.real (upperTailEvent M (t / p)) + + 2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) := by + by_cases hTrunc_pos : 0 < truncVar + · simpa [S, M, sigmaSq, truncVar] using + measureReal_absTailEvent_finsetSum_le_sup'_abs_add_bennettBeta_of_scale + (μ := μ) (X := X) (s := s) hs hp_one ht + h_indep h_meas h_sq_int h_symm hTrunc_pos hSigma_pos + · let T : Ω → ℝ := fun ω => ∑ i ∈ s, absTruncation (X i) (t / p) ω + have htrunc_nonneg : 0 ≤ truncVar := by + dsimp [truncVar] + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have htrunc_zero : truncVar = 0 := le_antisymm (le_of_not_gt hTrunc_pos) htrunc_nonneg + have htrunc_term_zero : + ∀ i ∈ s, + ProbabilityTheory.moment (fun ω => absTruncation (X i) (t / p) ω) 2 μ = 0 := by + intro i hi + have hnonneg_terms : + ∀ j ∈ s, 0 ≤ ProbabilityTheory.moment (fun ω => absTruncation (X j) (t / p) ω) 2 μ := by + intro j hj + simp [ProbabilityTheory.moment] + positivity + exact (Finset.sum_eq_zero_iff_of_nonneg hnonneg_terms).1 + (by simpa [truncVar] using htrunc_zero) i hi + have htrunc_sq_int : + ∀ i ∈ s, Integrable (fun ω => absTruncation (X i) (t / p) ω ^ (2 : ℕ)) μ := by + intro i hi + refine Integrable.mono' (h_sq_int i hi) + ((absTruncation_measurable (X := X i) (r := t / p) (h_meas i)).pow_const 2).aemeasurable.aestronglyMeasurable ?_ + filter_upwards with ω + have hpow : + |absTruncation (X i) (t / p) ω| ^ (2 : ℕ) ≤ |X i ω| ^ (2 : ℕ) := + pow_le_pow_left₀ (abs_nonneg _) + (abs_absTruncation_le_abs (X := X i) (r := t / p) ω) 2 + simpa [Real.norm_eq_abs, sq_abs, + abs_of_nonneg (show 0 ≤ absTruncation (X i) (t / p) ω ^ (2 : ℕ) by positivity), + abs_of_nonneg (show 0 ≤ X i ω ^ (2 : ℕ) by positivity)] using hpow + have hT_zero_ae : T =ᵐ[μ] 0 := by + dsimp [T] + apply ae_eq_zero_finsetSum_of_forall + intro i hi + exact ae_eq_zero_of_moment_two_eq_zero (μ := μ) + (htrunc_sq_int i hi) (htrunc_term_zero i hi) + have hT_meas : Measurable T := by + dsimp [T] + refine Finset.measurable_sum s ?_ + intro i hi + exact absTruncation_measurable (X := X i) (r := t / p) (h_meas i) + have htail_T_zero : μ.real (absTailEvent T t) = 0 := by + have hsubset_nonzero : absTailEvent T t ⊆ {ω | T ω ≠ 0} := by + intro ω hω hzero + have : ¬ t < |T ω| := by simpa [hzero] using not_lt.mpr ht.le + exact this hω + have hnonzero_null : μ {ω | T ω ≠ 0} = 0 := by + simpa [ae_iff] using (ae_iff.mp hT_zero_ae) + have hnonzero_real : μ.real {ω | T ω ≠ 0} = 0 := by + exact (measureReal_eq_zero_iff).2 hnonzero_null + exact measureReal_mono_null hsubset_nonzero hnonzero_real + have hsubset : + absTailEvent S t ⊆ + upperTailEvent M (t / p) ∪ absTailEvent T t := by + simpa [S, M, T] using + (absTailEvent_finsetSum_subset_sup'_abs_union_absTruncation + (X := X) (s := s) hs (r := t / p) (t := t)) + calc + μ.real (absTailEvent S t) + ≤ μ.real (upperTailEvent M (t / p) ∪ absTailEvent T t) := by + exact measureReal_mono hsubset + _ ≤ μ.real (upperTailEvent M (t / p)) + μ.real (absTailEvent T t) := by + exact measureReal_union_le _ _ + _ = μ.real (upperTailEvent M (t / p)) := by rw [htail_T_zero, add_zero] + _ ≤ μ.real (upperTailEvent M (t / p)) + + 2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) := by + have hconst_nonneg : + 0 ≤ 2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) := by + positivity + linarith + have hset_abs : {ω | t < |S ω|} = absTailEvent S t := by + ext ω + simp [S, absTailEvent] + have hset_max : {ω | t / p < M ω} = upperTailEvent M (t / p) := by + ext ω + simp [M, upperTailEvent] + have htail : + μ {ω | t < |S ω|} ≤ + μ {ω | t / p < M ω} + + ENNReal.ofReal (2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))))) := by + calc + μ {ω | t < |S ω|} + = ENNReal.ofReal (μ.real (absTailEvent S t)) := by + rw [hset_abs] + simp [Measure.real, (measure_lt_top μ (absTailEvent S t)).ne] + _ ≤ ENNReal.ofReal + (μ.real (upperTailEvent M (t / p)) + + 2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))))) := by + exact ENNReal.ofReal_le_ofReal (by simpa [sigmaSq] using htail_real) + _ = ENNReal.ofReal (μ.real (upperTailEvent M (t / p))) + + ENNReal.ofReal (2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))))) := by + rw [ENNReal.ofReal_add] + · exact MeasureTheory.measureReal_nonneg + · positivity + _ = μ {ω | t / p < M ω} + + ENNReal.ofReal (2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq))))) := by + rw [hset_max] + simp [Measure.real, (measure_lt_top μ (upperTailEvent M (t / p))).ne] + have hexp_nonneg : + 0 ≤ 2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) := by + positivity + have htpow_nonneg : 0 ≤ t ^ (p - 1) := Real.rpow_nonneg ht.le _ + calc + μ {ω | t < |S ω|} * ENNReal.ofReal (t ^ (p - 1)) + ≤ (μ {ω | t / p < M ω} + + ENNReal.ofReal + (2 * Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))))) * + ENNReal.ofReal (t ^ (p - 1)) := by + exact mul_le_mul_of_nonneg_right htail (by positivity) + _ = A t + B t := by + dsimp [A, B] + rw [add_mul, ← ENNReal.ofReal_mul hexp_nonneg] + congr 1 + dsimp [kernel] + ring_nf + have hmono : + ∫⁻ t in Set.Ioi (0 : ℝ), μ {ω | t < |S ω|} * ENNReal.ofReal (t ^ (p - 1)) ≤ + ∫⁻ t in Set.Ioi (0 : ℝ), A t + B t := by + exact lintegral_mono_ae hdom + have hB_bound : + ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), B t ≤ + ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * (Real.sqrt p * Real.sqrt sigmaSq)) ^ p) := by + have hB_int : + Integrable (fun t => 2 * kernel t) (volume.restrict (Set.Ioi (0 : ℝ))) := by + simpa [kernel, IntegrableOn] using + ((integrableOn_rosenthal_bennett_scaled_kernel (p := p) (sigmaSq := sigmaSq) hp hSigma_pos)).const_mul + (2 : ℝ) + have hB_nonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi (0 : ℝ))] fun t => 2 * kernel t := by + filter_upwards [self_mem_ae_restrict measurableSet_Ioi] with t ht + have hpow_nonneg : 0 ≤ t ^ (p - 1) := Real.rpow_nonneg ht.le _ + have hexp_nonneg : + 0 ≤ Real.exp (-(p * bennettBeta (t ^ (2 : ℕ) / (p * sigmaSq)))) := by + positivity + dsimp [kernel] + nlinarith + have hB_lintegral : + ∫⁻ t in Set.Ioi (0 : ℝ), B t = + ENNReal.ofReal (∫ t in Set.Ioi (0 : ℝ), 2 * kernel t) := by + dsimp [B] + symm + simpa using + (MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (μ := volume.restrict (Set.Ioi (0 : ℝ))) hB_int hB_nonneg) + have hB_integral_nonneg : 0 ≤ ∫ t in Set.Ioi (0 : ℝ), 2 * kernel t := by + exact integral_nonneg_of_ae hB_nonneg + calc + ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), B t + = ENNReal.ofReal p * ENNReal.ofReal (∫ t in Set.Ioi (0 : ℝ), 2 * kernel t) := by + rw [hB_lintegral] + _ = ENNReal.ofReal (p * ∫ t in Set.Ioi (0 : ℝ), 2 * kernel t) := by + rw [← ENNReal.ofReal_mul (show 0 ≤ p by linarith)] + _ = ENNReal.ofReal (2 * (p * ∫ t in Set.Ioi (0 : ℝ), kernel t)) := by + congr 1 + rw [integral_const_mul] + ring + _ ≤ ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * (Real.sqrt p * Real.sqrt sigmaSq)) ^ p) := by + refine ENNReal.ofReal_le_ofReal ?_ + have hscaled := + rosenthal_bennett_scaled_integral_le (p := p) (sigmaSq := sigmaSq) hp hSigma_pos + linarith + calc + ∫⁻ ω, ENNReal.ofReal (|∑ i ∈ s, X i ω| ^ p) ∂μ + = ENNReal.ofReal p * + ∫⁻ t in Set.Ioi (0 : ℝ), μ {ω | t < |S ω|} * ENNReal.ofReal (t ^ (p - 1)) := by + simpa [S] using hLayerS + _ ≤ ENNReal.ofReal p * (∫⁻ t in Set.Ioi (0 : ℝ), A t + B t) := by + exact mul_le_mul_right hmono _ + _ = (ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), A t) + + (ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), B t) := by + rw [lintegral_add_right' (f := A) hB_aemeas, mul_add] + _ = ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ + + (ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), B t) := by + have hA : + ENNReal.ofReal p * ∫⁻ t in Set.Ioi (0 : ℝ), A t = + ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ := by + dsimp [A, M] + simpa using + (lintegral_rpow_sup'_abs_eq_scaled_tail + (μ := μ) (X := X) (s := s) hs hp_pos h_meas) + simp [hA] + _ ≤ ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ + + ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt sigmaSq)) ^ p) := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left hB_bound + (ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ) + · have hSigma_zero : sigmaSq = 0 := by + exact le_antisymm (le_of_not_gt hSigma_pos) hSigma_nonneg + have hmom_zero : ∀ i ∈ s, ProbabilityTheory.moment (X i) 2 μ = 0 := by + intro i hi + have hnonneg_terms : ∀ j ∈ s, 0 ≤ ProbabilityTheory.moment (X j) 2 μ := by + intro j hj + simp [ProbabilityTheory.moment] + positivity + exact (Finset.sum_eq_zero_iff_of_nonneg hnonneg_terms).1 (by simpa [sigmaSq] using hSigma_zero) i hi + have hsum_zero_ae : S =ᵐ[μ] 0 := by + dsimp [S] + apply ae_eq_zero_finsetSum_of_forall + intro i hi + exact ae_eq_zero_of_moment_two_eq_zero (μ := μ) (h_sq_int i hi) (hmom_zero i hi) + calc + ∫⁻ ω, ENNReal.ofReal (|∑ i ∈ s, X i ω| ^ p) ∂μ + = 0 := by + calc + ∫⁻ ω, ENNReal.ofReal (|∑ i ∈ s, X i ω| ^ p) ∂μ + = ∫⁻ ω, (0 : ENNReal) ∂μ := by + refine lintegral_congr_ae ?_ + filter_upwards [hsum_zero_ae] with ω hω + have hsum : ∑ i ∈ s, X i ω = 0 := by + simpa [S] using hω + rw [hsum] + simp [hp_pos.ne'] + _ = 0 := by simp + _ ≤ ENNReal.ofReal (p ^ p) * + ∫⁻ ω, ENNReal.ofReal ((s.sup' hs (fun i => |X i ω|)) ^ p) ∂μ + + ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt sigmaSq)) ^ p) := by + positivity + +/-- Integrability consequence of the symmetric Rosenthal `lintegral` bound. -/ +theorem integrable_abs_finsetSum_rpow_of_identDistrib_neg + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (h_symm : ∀ i ∈ s, IdentDistrib (X i) (fun ω => -X i ω) μ μ) + (hmax_int : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ := by + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + have hlin := + lintegral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int h_symm + have hS_meas : Measurable S := by + dsimp [S] + exact Finset.measurable_sum s fun i _ => h_meas i + have hSpow_nonneg : 0 ≤ᵐ[μ] fun ω => |S ω| ^ p := by + exact Filter.Eventually.of_forall fun ω => by positivity + have hSpow_aesm : AEStronglyMeasurable (fun ω => |S ω| ^ p) μ := by + exact + ((Real.continuous_rpow_const (show 0 ≤ p by linarith)).measurable.comp + (continuous_abs.measurable.comp hS_meas)).aemeasurable.aestronglyMeasurable + have hM_meas : Measurable M := by + dsimp [M] + convert + (Finset.measurable_sup' (hs := hs) (f := fun i ω => |X i ω|) fun i _ => + continuous_abs.measurable.comp (h_meas i)) using 1 + ext ω + simp + have hM_nonneg : ∀ ω, 0 ≤ M ω := by + intro ω + have hnonneg : 0 ≤ |X hs.choose ω| := abs_nonneg _ + have hle : |X hs.choose ω| ≤ M ω := by + show |X hs.choose ω| ≤ s.sup' hs (fun i => |X i ω|) + exact Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec + exact le_trans hnonneg hle + have hMpow_nonneg : 0 ≤ᵐ[μ] fun ω => M ω ^ p := by + exact Filter.Eventually.of_forall fun ω => Real.rpow_nonneg (hM_nonneg ω) _ + have hMpow_aesm : AEStronglyMeasurable (fun ω => M ω ^ p) μ := by + exact + ((Real.continuous_rpow_const (show 0 ≤ p by linarith)).measurable.comp + hM_meas).aemeasurable.aestronglyMeasurable + have hMpow_ne_top : + (∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ) ≠ ⊤ := by + refine (MeasureTheory.lintegral_ofReal_ne_top_iff_integrable + (μ := μ) hMpow_aesm hMpow_nonneg).2 ?_ + simpa [M] using hmax_int + have hbound_lt_top : + ENNReal.ofReal (p ^ p) * ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ + + ENNReal.ofReal + (2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p) < ⊤ := by + refine ENNReal.add_lt_top.mpr ?_ + constructor + · exact ENNReal.mul_lt_top ENNReal.ofReal_lt_top (lt_of_le_of_ne le_top hMpow_ne_top) + · exact ENNReal.ofReal_lt_top + refine (MeasureTheory.lintegral_ofReal_ne_top_iff_integrable + (μ := μ) hSpow_aesm hSpow_nonneg).1 ?_ + refine ne_of_lt (lt_of_le_of_lt ?_ hbound_lt_top) + simpa [S, M] using hlin + +/-- Real-integral version of the symmetric Rosenthal bound. -/ +theorem integral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} (hs : s.Nonempty) {p : ℝ} + (hp : 2 ≤ p) + (h_indep : iIndepFun X μ) + (h_meas : ∀ i, Measurable (X i)) + (h_sq_int : ∀ i ∈ s, Integrable (fun ω => X i ω ^ (2 : ℕ)) μ) + (h_symm : ∀ i ∈ s, IdentDistrib (X i) (fun ω => -X i ω) μ μ) + (hmax_int : + Integrable (fun ω => (s.sup' hs (fun i => |X i ω|)) ^ p) μ) : + ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ ≤ + p ^ p * ∫ ω, (s.sup' hs (fun i => |X i ω|)) ^ p ∂μ + + 2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p := by + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let M : Ω → ℝ := fun ω => s.sup' hs (fun i => |X i ω|) + let C : ℝ := + 2 * (rosenthalBennettIntegralConst * + (Real.sqrt p * Real.sqrt (∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ))) ^ p + have hlin := + lintegral_abs_finsetSum_rpow_le_rosenthal_of_identDistrib_neg + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int h_symm + have hsum_int : + Integrable (fun ω => |S ω| ^ p) μ := by + simpa [S] using + (integrable_abs_finsetSum_rpow_of_identDistrib_neg + (μ := μ) (X := X) (s := s) hs hp h_indep h_meas h_sq_int h_symm hmax_int) + have hS_meas : Measurable S := by + dsimp [S] + exact Finset.measurable_sum s fun i _ => h_meas i + have hSpow_nonneg : 0 ≤ᵐ[μ] fun ω => |S ω| ^ p := by + exact Filter.Eventually.of_forall fun ω => by positivity + have hSpow_aesm : AEStronglyMeasurable (fun ω => |S ω| ^ p) μ := by + exact + ((Real.continuous_rpow_const (show 0 ≤ p by linarith)).measurable.comp + (continuous_abs.measurable.comp hS_meas)).aemeasurable.aestronglyMeasurable + have hM_meas : Measurable M := by + dsimp [M] + convert + (Finset.measurable_sup' (hs := hs) (f := fun i ω => |X i ω|) fun i _ => + continuous_abs.measurable.comp (h_meas i)) using 1 + ext ω + simp + have hM_nonneg : ∀ ω, 0 ≤ M ω := by + intro ω + have hnonneg : 0 ≤ |X hs.choose ω| := abs_nonneg _ + have hle : |X hs.choose ω| ≤ M ω := by + show |X hs.choose ω| ≤ s.sup' hs (fun i => |X i ω|) + exact Finset.le_sup' (f := fun i => |X i ω|) hs.choose_spec + exact le_trans hnonneg hle + have hMpow_nonneg : 0 ≤ᵐ[μ] fun ω => M ω ^ p := by + exact Filter.Eventually.of_forall fun ω => Real.rpow_nonneg (hM_nonneg ω) _ + have hM_integral_nonneg : 0 ≤ ∫ ω, M ω ^ p ∂μ := by + exact integral_nonneg_of_ae hMpow_nonneg + have hM_lintegral : + ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ = ENNReal.ofReal (∫ ω, M ω ^ p ∂μ) := by + symm + exact + MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (μ := μ) (by simpa [M] using hmax_int) hMpow_nonneg + have hSigma_nonneg : 0 ≤ ∑ i ∈ s, ProbabilityTheory.moment (X i) 2 μ := by + refine Finset.sum_nonneg ?_ + intro i hi + simp [ProbabilityTheory.moment] + positivity + have hC_nonneg : 0 ≤ C := by + have hRB_nonneg : 0 ≤ rosenthalBennettIntegralConst := by + dsimp [rosenthalBennettIntegralConst] + positivity + dsimp [C] + refine mul_nonneg (by positivity : 0 ≤ (2 : ℝ)) + (Real.rpow_nonneg + (mul_nonneg hRB_nonneg + (mul_nonneg (Real.sqrt_nonneg p) (Real.sqrt_nonneg _))) _) + have hlin' : + ∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ ≤ + ENNReal.ofReal (p ^ p * ∫ ω, M ω ^ p ∂μ + C) := by + calc + ∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ + ≤ ENNReal.ofReal (p ^ p) * ∫⁻ ω, ENNReal.ofReal (M ω ^ p) ∂μ + + ENNReal.ofReal C := by + simpa [S, M, C] using hlin + _ = ENNReal.ofReal (p ^ p * ∫ ω, M ω ^ p ∂μ) + ENNReal.ofReal C := by + rw [hM_lintegral, ← ENNReal.ofReal_mul (Real.rpow_nonneg (show 0 ≤ p by linarith) _)] + _ = ENNReal.ofReal (p ^ p * ∫ ω, M ω ^ p ∂μ + C) := by + rw [← ENNReal.ofReal_add] + · exact mul_nonneg (Real.rpow_nonneg (show 0 ≤ p by linarith) _) hM_integral_nonneg + · exact hC_nonneg + have hfin : (∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ) < ⊤ := by + exact lt_of_le_of_lt hlin' ENNReal.ofReal_lt_top + have hleft : + ∫ ω, |S ω| ^ p ∂μ = + (∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ).toReal := by + rw [← ENNReal.toReal_ofReal (integral_nonneg_of_ae hSpow_nonneg)] + rw [MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (μ := μ) hsum_int hSpow_nonneg] + have htoReal : + (∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ).toReal ≤ + (ENNReal.ofReal (p ^ p * ∫ ω, M ω ^ p ∂μ + C)).toReal := + (ENNReal.toReal_le_toReal hfin.ne ENNReal.ofReal_ne_top).2 hlin' + have hrhs_nonneg : 0 ≤ p ^ p * ∫ ω, M ω ^ p ∂μ + C := by + exact add_nonneg + (mul_nonneg (Real.rpow_nonneg (show 0 ≤ p by linarith) _) hM_integral_nonneg) + hC_nonneg + calc + ∫ ω, |S ω| ^ p ∂μ = (∫⁻ ω, ENNReal.ofReal (|S ω| ^ p) ∂μ).toReal := hleft + _ ≤ (ENNReal.ofReal (p ^ p * ∫ ω, M ω ^ p ∂μ + C)).toReal := htoReal + _ = p ^ p * ∫ ω, M ω ^ p ∂μ + C := by + rw [ENNReal.toReal_ofReal hrhs_nonneg] + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetrization.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetrization.lean new file mode 100644 index 0000000000..8ecb3f7ef5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Symmetrization.lean @@ -0,0 +1,525 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.Symmetric + +/-! # Symmetrization -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- First symmetrization step for Rosenthal's inequality: the absolute `L^p` +norm of the centered finite sum is bounded by the corresponding `L^p` norm of +the symmetrized difference sum on the product probability space. -/ +theorem integral_abs_centeredFinsetSum_pow_le_integral_abs_symmetrizedFinsetSum_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + (hX_int : ∀ i ∈ s, Integrable (X i) μ) + (hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ)) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) := by + have hp_pos : 0 < p := Nat.succ_le_iff.mp hp + let F : Ω → Ω → ℝ := fun x y => symmetrizedFinsetSum X s (x, y) + have hconv : + ConvexOn ℝ Set.univ (fun t : ℝ => ‖t‖ ^ p) := by + simpa using! + (convexOn_univ_norm : ConvexOn ℝ Set.univ (norm : ℝ → ℝ)).pow + (fun _ _ => norm_nonneg _) p + have hcont : + ContinuousOn (fun t : ℝ => ‖t‖ ^ p) Set.univ := + (continuous_norm.pow p).continuousOn + have hF_int : Integrable (Function.uncurry F) (μ.prod μ) := by + change Integrable (symmetrizedFinsetSum X s) (μ.prod μ) + refine integrable_finsetSum s ?_ + intro i hi + exact ((hX_int i hi).comp_fst μ).sub ((hX_int i hi).comp_snd μ) + have hF_int_right : ∀ x, Integrable (fun y => F x y) μ := by + intro x + refine integrable_finsetSum s ?_ + intro i hi + exact (integrable_const (X i x)).sub (hX_int i hi) + have hF_integral : + ∀ x, ∫ y, F x y ∂μ = centeredFinsetSum X μ s x := by + intro x + change ∫ y, ∑ i ∈ s, (X i x - X i y) ∂μ = centeredFinsetSum X μ s x + rw [centeredFinsetSum, integral_finsetSum] + · refine Finset.sum_congr rfl ?_ + intro i hi + rw [integral_sub (integrable_const _) (hX_int i hi), integral_const] + simp + · intro i hi + exact (integrable_const (X i x)).sub (hX_int i hi) + have hjensen : + ∀ᵐ x ∂μ, |∫ y, F x y ∂μ| ^ p ≤ ∫ y, |F x y| ^ p ∂μ := by + filter_upwards [hsymm_int.prod_right_ae] with x hx + have hmem : ∀ᵐ y ∂μ, F x y ∈ (Set.univ : Set ℝ) := by + exact Filter.Eventually.of_forall (fun _ => Set.mem_univ _) + have hpoint := + hconv.map_integral_le + hcont + isClosed_univ + hmem + (hF_int_right x) + (by simpa [F, symmetrizedFinsetSum, Real.norm_eq_abs] using! hx) + simpa [Real.norm_eq_abs] using hpoint + have hright_int : + Integrable (fun x => ∫ y, |F x y| ^ p ∂μ) μ := by + simpa [Function.uncurry, F, symmetrizedFinsetSum] using hsymm_int.integral_prod_left + have hleft_ae : + AEStronglyMeasurable (fun x => |∫ y, F x y ∂μ| ^ p) μ := by + simpa [Function.uncurry, F, Real.norm_eq_abs] using! + (hF_int.integral_prod_left.aestronglyMeasurable.norm.pow p) + have hleft_int : + Integrable (fun x => |∫ y, F x y ∂μ| ^ p) μ := by + refine hright_int.mono' hleft_ae ?_ + filter_upwards [hjensen] with x hx + simpa using hx + calc + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ + = ∫ x, |∫ y, F x y ∂μ| ^ p ∂μ := by + apply integral_congr_ae + exact Filter.Eventually.of_forall (fun x => by simp [hF_integral x]) + _ ≤ ∫ x, ∫ y, |F x y| ^ p ∂μ ∂μ := by + exact integral_mono_ae hleft_int hright_int hjensen + _ = ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) := by + have hpowF_int : + Integrable (Function.uncurry (fun x y => |F x y| ^ p)) (μ.prod μ) := by + simpa [Function.uncurry, F, symmetrizedFinsetSum] using! hsymm_int + simpa [Function.uncurry, F, symmetrizedFinsetSum] using + (integral_integral (f := fun x y => |F x y| ^ p) hpowF_int) + +section + +omit [MeasurableSpace Ω] + +/-- Pointwise `L^p` control of the symmetrized finite sum by the two coordinate +copies of the original finite sum. -/ +theorem abs_symmetrizedFinsetSum_pow_le + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} (ω : Ω × Ω) : + |symmetrizedFinsetSum X s ω| ^ p ≤ + (2 ^ (p - 1) : ℝ) * + (|∑ i ∈ s, X i ω.1| ^ p + |∑ i ∈ s, X i ω.2| ^ p) := by + let A : ℝ := ∑ i ∈ s, X i ω.1 + let B : ℝ := ∑ i ∈ s, X i ω.2 + have hsymm : symmetrizedFinsetSum X s ω = A - B := by + simp [symmetrizedFinsetSum, A, B, Finset.sum_sub_distrib] + have habs : |A - B| ≤ |A| + |B| := by + simpa [sub_eq_add_neg] using abs_add_le A (-B) + have hpow : + |A - B| ^ p ≤ (|A| + |B|) ^ p := by + exact pow_le_pow_left₀ (abs_nonneg _) habs p + have hadd : + (|A| + |B|) ^ p ≤ (2 ^ (p - 1) : ℝ) * (|A| ^ p + |B| ^ p) := by + exact add_pow_le (abs_nonneg A) (abs_nonneg B) p + rw [hsymm] + exact le_trans hpow hadd + +end + +/-- Integrability of the symmetrized `p`-moment follows from integrability of +the original finite-sum `p`-moment. -/ +theorem integrable_abs_symmetrizedFinsetSum_pow_of_integrable_abs_finsetSum_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + let G : Ω × Ω → ℝ := fun ω => + (2 ^ (p - 1) : ℝ) * (|∑ i ∈ s, X i ω.1| ^ p + |∑ i ∈ s, X i ω.2| ^ p) + have hfst : Integrable (fun ω : Ω × Ω => |∑ i ∈ s, X i ω.1| ^ p) (μ.prod μ) := + hsum_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => |∑ i ∈ s, X i ω.2| ^ p) (μ.prod μ) := + hsum_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 ^ (p - 1) : ℕ) : ℝ) + have hsymm_meas : Measurable (symmetrizedFinsetSum X s) := by + refine Finset.measurable_sum s ?_ + intro i hi + exact ((hX_meas i hi).comp measurable_fst).sub ((hX_meas i hi).comp measurable_snd) + have hsymm_ae : + AEStronglyMeasurable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + simpa [Real.norm_eq_abs] using + ((hsymm_meas.aemeasurable.norm.pow_const p).aestronglyMeasurable) + refine hG_int.mono' hsymm_ae ?_ + filter_upwards with ω + have hω := abs_symmetrizedFinsetSum_pow_le (X := X) (s := s) (p := p) ω + have hnonneg : 0 ≤ |symmetrizedFinsetSum X s ω| ^ p := by positivity + simpa [G, Real.norm_eq_abs, abs_of_nonneg hnonneg] using hω + +/-- Product-space `L^p` control of the symmetrized finite sum by the original +finite sum. This is the note-facing symmetrization estimate with the standard +`2^p` factor. -/ +theorem integral_abs_symmetrizedFinsetSum_pow_le_two_pow_mul_integral_abs_finsetSum_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let G : Ω × Ω → ℝ := fun ω => + (2 ^ (p - 1) : ℝ) * (|S ω.1| ^ p + |S ω.2| ^ p) + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := + integrable_abs_symmetrizedFinsetSum_pow_of_integrable_abs_finsetSum_pow + (μ := μ) hX_meas hsum_int + have hfst : Integrable (fun ω : Ω × Ω => |S ω.1| ^ p) (μ.prod μ) := + hsum_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => |S ω.2| ^ p) (μ.prod μ) := + hsum_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 ^ (p - 1) : ℕ) : ℝ) + have hpoint : + ∀ᵐ ω : Ω × Ω ∂(μ.prod μ), + |symmetrizedFinsetSum X s ω| ^ p ≤ G ω := + Filter.Eventually.of_forall fun ω => by + simpa [G, S] using abs_symmetrizedFinsetSum_pow_le (X := X) (s := s) (p := p) ω + have hS_meas : Measurable S := by + refine Finset.measurable_sum s ?_ + intro i hi + exact hX_meas i hi + have hid : + IdentDistrib + (fun ω : Ω × Ω => |S ω.1| ^ p) + (fun ω : Ω × Ω => |S ω.2| ^ p) + (μ.prod μ) + (μ.prod μ) := by + simpa [S, Function.comp_def] using + (identDistrib_comp_fst_comp_snd_prod (μ := μ) (X := S) hS_meas.aemeasurable).comp + (continuous_abs.measurable.pow_const p) + have hfst_eq : + ∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) = ∫ ω, |S ω| ^ p ∂μ := by + simpa [S] using + (integral_fun_fst (μ := μ) (ν := μ) (f := fun ω : Ω => |S ω| ^ p)) + have hsnd_eq : ∫ ω : Ω × Ω, |S ω.2| ^ p ∂(μ.prod μ) = ∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) := by + simpa using hid.integral_eq.symm + have hpow_two : (2 : ℝ) ^ (p - 1) * 2 = (2 : ℝ) ^ p := by + rcases Nat.exists_eq_add_of_le hp with ⟨n, rfl⟩ + simpa [Nat.add_comm, mul_comm] using (pow_succ' (2 : ℝ) n).symm + calc + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) + ≤ ∫ ω : Ω × Ω, G ω ∂(μ.prod μ) := by + exact integral_mono_ae hsymm_int hG_int hpoint + _ = (2 ^ (p - 1) : ℝ) * + (∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) + + ∫ ω : Ω × Ω, |S ω.2| ^ p ∂(μ.prod μ)) := by + rw [show (∫ ω : Ω × Ω, G ω ∂(μ.prod μ)) = + ∫ ω : Ω × Ω, + (2 ^ (p - 1) : ℝ) * (|S ω.1| ^ p + |S ω.2| ^ p) ∂(μ.prod μ) by rfl] + rw [integral_const_mul] + congr 1 + exact integral_add hfst hsnd + _ = (2 ^ (p - 1) : ℝ) * + (2 * ∫ ω, |S ω| ^ p ∂μ) := by + rw [hsnd_eq, two_mul, hfst_eq] + _ = (2 : ℝ) ^ p * ∫ ω, |S ω| ^ p ∂μ := by + calc + (2 ^ (p - 1) : ℝ) * (2 * ∫ ω, |S ω| ^ p ∂μ) + = (((2 : ℝ) ^ (p - 1)) * 2) * ∫ ω, |S ω| ^ p ∂μ := by + ring_nf + _ = (2 : ℝ) ^ p * ∫ ω, |S ω| ^ p ∂μ := by rw [hpow_two] + _ = (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + rfl + +/-- Moment symmetrization inequality for the centered finite sum. -/ +theorem integral_abs_centeredFinsetSum_pow_le_two_pow_mul_integral_abs_finsetSum_pow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℕ} + (hp : 1 ≤ p) + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hX_int : ∀ i ∈ s, Integrable (X i) μ) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := + integrable_abs_symmetrizedFinsetSum_pow_of_integrable_abs_finsetSum_pow + (μ := μ) hX_meas hsum_int + exact + (integral_abs_centeredFinsetSum_pow_le_integral_abs_symmetrizedFinsetSum_pow + (μ := μ) (X := X) (s := s) (p := p) hp hX_int hsymm_int).trans + (integral_abs_symmetrizedFinsetSum_pow_le_two_pow_mul_integral_abs_finsetSum_pow + (μ := μ) (X := X) (s := s) (p := p) hp hX_meas hsum_int) + +/-- First symmetrization step for real `L^p` exponents. -/ +theorem integral_abs_centeredFinsetSum_rpow_le_integral_abs_symmetrizedFinsetSum_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (hX_int : ∀ i ∈ s, Integrable (X i) μ) + (hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ)) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) := by + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp + let F : Ω → Ω → ℝ := fun x y => symmetrizedFinsetSum X s (x, y) + have hconv : + ConvexOn ℝ Set.univ (fun t : ℝ => |t| ^ p) := by + have hnorm : ConvexOn ℝ Set.univ (fun t : ℝ => |t|) := by + simpa [Real.norm_eq_abs] using! + (convexOn_univ_norm : ConvexOn ℝ Set.univ (norm : ℝ → ℝ)) + have hrpow : ConvexOn ℝ (Set.Ici 0) (fun t : ℝ => t ^ p) := convexOn_rpow hp + have hmono : MonotoneOn (fun t : ℝ => t ^ p) (Set.Ici 0) := by + intro a ha b hb hab + exact Real.rpow_le_rpow ha hab hp_nonneg + have himage : (fun t : ℝ => |t|) '' Set.univ ⊆ Set.Ici 0 := by + rintro t ⟨u, -, rfl⟩ + exact abs_nonneg u + have himage_convex : Convex ℝ ((fun t : ℝ => |t|) '' Set.univ) := by + have heq : (fun t : ℝ => |t|) '' Set.univ = Set.Ici 0 := by + ext t + simp only [Set.mem_image, Set.mem_univ, true_and, Set.mem_Ici] + constructor + · rintro ⟨u, rfl⟩ + exact abs_nonneg u + · intro ht + exact ⟨t, abs_of_nonneg ht⟩ + rw [heq] + exact convex_Ici 0 + exact (hrpow.subset himage himage_convex).comp hnorm (hmono.mono himage) + have hcont : + ContinuousOn (fun t : ℝ => |t| ^ p) Set.univ := by + exact (continuous_abs.rpow_const fun _ => Or.inr hp_nonneg).continuousOn + have hF_int : Integrable (Function.uncurry F) (μ.prod μ) := by + change Integrable (symmetrizedFinsetSum X s) (μ.prod μ) + refine integrable_finsetSum s ?_ + intro i hi + exact ((hX_int i hi).comp_fst μ).sub ((hX_int i hi).comp_snd μ) + have hF_int_right : ∀ x, Integrable (fun y => F x y) μ := by + intro x + refine integrable_finsetSum s ?_ + intro i hi + exact (integrable_const (X i x)).sub (hX_int i hi) + have hF_integral : + ∀ x, ∫ y, F x y ∂μ = centeredFinsetSum X μ s x := by + intro x + change ∫ y, ∑ i ∈ s, (X i x - X i y) ∂μ = centeredFinsetSum X μ s x + rw [centeredFinsetSum, integral_finsetSum] + · refine Finset.sum_congr rfl ?_ + intro i hi + rw [integral_sub (integrable_const _) (hX_int i hi), integral_const] + simp + · intro i hi + exact (integrable_const (X i x)).sub (hX_int i hi) + have hjensen : + ∀ᵐ x ∂μ, |∫ y, F x y ∂μ| ^ p ≤ ∫ y, |F x y| ^ p ∂μ := by + filter_upwards [hsymm_int.prod_right_ae] with x hx + have hmem : ∀ᵐ y ∂μ, F x y ∈ (Set.univ : Set ℝ) := by + exact Filter.Eventually.of_forall (fun _ => Set.mem_univ _) + exact hconv.map_integral_le hcont isClosed_univ hmem (hF_int_right x) (by simpa [F] using! hx) + have hright_int : + Integrable (fun x => ∫ y, |F x y| ^ p ∂μ) μ := by + simpa [Function.uncurry, F, symmetrizedFinsetSum] using hsymm_int.integral_prod_left + have hleft_ae : + AEStronglyMeasurable (fun x => |∫ y, F x y ∂μ| ^ p) μ := by + apply AEMeasurable.aestronglyMeasurable + exact AEMeasurable.comp_aemeasurable + ((continuous_abs.rpow_const fun _ => Or.inr hp_nonneg).measurable.aemeasurable) + hF_int.integral_prod_left.aestronglyMeasurable.aemeasurable + have hleft_int : + Integrable (fun x => |∫ y, F x y ∂μ| ^ p) μ := by + refine hright_int.mono' hleft_ae ?_ + filter_upwards [hjensen] with x hx + simpa only [Real.norm_eq_abs, abs_of_nonneg (Real.rpow_nonneg (abs_nonneg _) _)] using hx + calc + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ + = ∫ x, |∫ y, F x y ∂μ| ^ p ∂μ := by + apply integral_congr_ae + exact Filter.Eventually.of_forall (fun x => by + change |centeredFinsetSum X μ s x| ^ p = |∫ y, F x y ∂μ| ^ p + rw [← hF_integral x]) + _ ≤ ∫ x, ∫ y, |F x y| ^ p ∂μ ∂μ := by + exact integral_mono_ae hleft_int hright_int hjensen + _ = ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) := by + have hpowF_int : + Integrable (Function.uncurry (fun x y => |F x y| ^ p)) (μ.prod μ) := by + simpa [Function.uncurry, F, symmetrizedFinsetSum] using! hsymm_int + simpa [Function.uncurry, F, symmetrizedFinsetSum] using + (integral_integral (f := fun x y => |F x y| ^ p) hpowF_int) + +section + +omit [MeasurableSpace Ω] + +/-- Pointwise real-`L^p` control of the symmetrized finite sum by the two +coordinate copies of the original finite sum. -/ +theorem abs_symmetrizedFinsetSum_rpow_le + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} (hp : 1 ≤ p) (ω : Ω × Ω) : + |symmetrizedFinsetSum X s ω| ^ p ≤ + (2 : ℝ) ^ (p - 1) * + (|∑ i ∈ s, X i ω.1| ^ p + |∑ i ∈ s, X i ω.2| ^ p) := by + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp + let A : ℝ := ∑ i ∈ s, X i ω.1 + let B : ℝ := ∑ i ∈ s, X i ω.2 + have hsymm : symmetrizedFinsetSum X s ω = A - B := by + simp [symmetrizedFinsetSum, A, B, Finset.sum_sub_distrib] + have habs : |A - B| ≤ |A| + |B| := by + simpa [sub_eq_add_neg] using abs_add_le A (-B) + have hrpow : + |A - B| ^ p ≤ (|A| + |B|) ^ p := by + exact Real.rpow_le_rpow (abs_nonneg _) habs hp_nonneg + have hadd : + (|A| + |B|) ^ p ≤ (2 : ℝ) ^ (p - 1) * (|A| ^ p + |B| ^ p) := by + have hnn := NNReal.rpow_add_le_mul_rpow_add_rpow (⟨|A|, abs_nonneg A⟩ : NNReal) + (⟨|B|, abs_nonneg B⟩ : NNReal) hp + exact_mod_cast hnn + rw [hsymm] + exact hrpow.trans hadd + +end + +/-- Integrability of the symmetrized real `p`-moment follows from integrability +of the original finite-sum real `p`-moment. -/ +theorem integrable_abs_symmetrizedFinsetSum_rpow_of_integrable_abs_finsetSum_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp + let G : Ω × Ω → ℝ := fun ω => + (2 : ℝ) ^ (p - 1) * (|∑ i ∈ s, X i ω.1| ^ p + |∑ i ∈ s, X i ω.2| ^ p) + have hfst : Integrable (fun ω : Ω × Ω => |∑ i ∈ s, X i ω.1| ^ p) (μ.prod μ) := + hsum_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => |∑ i ∈ s, X i ω.2| ^ p) (μ.prod μ) := + hsum_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 : ℝ) ^ (p - 1)) + have hsymm_meas : Measurable (symmetrizedFinsetSum X s) := by + refine Finset.measurable_sum s ?_ + intro i hi + exact ((hX_meas i hi).comp measurable_fst).sub ((hX_meas i hi).comp measurable_snd) + have hsymm_ae : + AEStronglyMeasurable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := by + exact ((continuous_abs.rpow_const fun _ => Or.inr hp_nonneg).measurable.comp + hsymm_meas).aestronglyMeasurable + refine hG_int.mono' hsymm_ae ?_ + filter_upwards with ω + have hω := abs_symmetrizedFinsetSum_rpow_le (X := X) (s := s) (p := p) hp ω + have hnonneg : 0 ≤ |symmetrizedFinsetSum X s ω| ^ p := + Real.rpow_nonneg (abs_nonneg _) _ + simpa [G, abs_of_nonneg hnonneg] using hω + +/-- Product-space real-`L^p` control of the symmetrized finite sum by the +original finite sum. -/ +theorem integral_abs_symmetrizedFinsetSum_rpow_le_two_rpow_mul_integral_abs_finsetSum_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) ≤ + (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + have hp_nonneg : 0 ≤ p := le_trans zero_le_one hp + let S : Ω → ℝ := fun ω => ∑ i ∈ s, X i ω + let G : Ω × Ω → ℝ := fun ω => + (2 : ℝ) ^ (p - 1) * (|S ω.1| ^ p + |S ω.2| ^ p) + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := + integrable_abs_symmetrizedFinsetSum_rpow_of_integrable_abs_finsetSum_rpow + (μ := μ) hp hX_meas hsum_int + have hfst : Integrable (fun ω : Ω × Ω => |S ω.1| ^ p) (μ.prod μ) := + hsum_int.comp_fst μ + have hsnd : Integrable (fun ω : Ω × Ω => |S ω.2| ^ p) (μ.prod μ) := + hsum_int.comp_snd μ + have hG_int : Integrable G (μ.prod μ) := by + simpa [G] using (hfst.add hsnd).const_mul ((2 : ℝ) ^ (p - 1)) + have hpoint : + ∀ᵐ ω : Ω × Ω ∂(μ.prod μ), + |symmetrizedFinsetSum X s ω| ^ p ≤ G ω := + Filter.Eventually.of_forall fun ω => by + simpa [G, S] using abs_symmetrizedFinsetSum_rpow_le (X := X) (s := s) (p := p) hp ω + have hS_meas : Measurable S := by + refine Finset.measurable_sum s ?_ + intro i hi + exact hX_meas i hi + have hid : + IdentDistrib + (fun ω : Ω × Ω => |S ω.1| ^ p) + (fun ω : Ω × Ω => |S ω.2| ^ p) + (μ.prod μ) + (μ.prod μ) := by + simpa [S, Function.comp_def] using + (identDistrib_comp_fst_comp_snd_prod (μ := μ) (X := S) hS_meas.aemeasurable).comp + ((continuous_abs.rpow_const fun _ => Or.inr hp_nonneg).measurable) + have hfst_eq : + ∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) = ∫ ω, |S ω| ^ p ∂μ := by + simpa [S] using + (integral_fun_fst (μ := μ) (ν := μ) (f := fun ω : Ω => |S ω| ^ p)) + have hsnd_eq : + ∫ ω : Ω × Ω, |S ω.2| ^ p ∂(μ.prod μ) = + ∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) := by + simpa using hid.integral_eq.symm + have htwo_rpow : (2 : ℝ) ^ (p - 1) * 2 = (2 : ℝ) ^ p := by + calc + (2 : ℝ) ^ (p - 1) * 2 = (2 : ℝ) ^ (p - 1) * (2 : ℝ) ^ (1 : ℝ) := by + rw [Real.rpow_one] + _ = (2 : ℝ) ^ ((p - 1) + 1) := by + rw [← Real.rpow_add (by norm_num : 0 < (2 : ℝ))] + _ = (2 : ℝ) ^ p := by ring_nf + calc + ∫ ω : Ω × Ω, |symmetrizedFinsetSum X s ω| ^ p ∂(μ.prod μ) + ≤ ∫ ω : Ω × Ω, G ω ∂(μ.prod μ) := by + exact integral_mono_ae hsymm_int hG_int hpoint + _ = (2 : ℝ) ^ (p - 1) * + (∫ ω : Ω × Ω, |S ω.1| ^ p ∂(μ.prod μ) + + ∫ ω : Ω × Ω, |S ω.2| ^ p ∂(μ.prod μ)) := by + rw [show (∫ ω : Ω × Ω, G ω ∂(μ.prod μ)) = + ∫ ω : Ω × Ω, (2 : ℝ) ^ (p - 1) * (|S ω.1| ^ p + |S ω.2| ^ p) ∂(μ.prod μ) by rfl] + rw [integral_const_mul] + congr 1 + exact integral_add hfst hsnd + _ = (2 : ℝ) ^ (p - 1) * (2 * ∫ ω, |S ω| ^ p ∂μ) := by + rw [hsnd_eq, two_mul, hfst_eq] + _ = (2 : ℝ) ^ p * ∫ ω, |S ω| ^ p ∂μ := by + calc + (2 : ℝ) ^ (p - 1) * (2 * ∫ ω, |S ω| ^ p ∂μ) = + ((2 : ℝ) ^ (p - 1) * 2) * ∫ ω, |S ω| ^ p ∂μ := by ring_nf + _ = (2 : ℝ) ^ p * ∫ ω, |S ω| ^ p ∂μ := by rw [htwo_rpow] + _ = (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + rfl + +/-- Real-exponent moment symmetrization inequality for the centered finite sum. -/ +theorem integral_abs_centeredFinsetSum_rpow_le_two_rpow_mul_integral_abs_finsetSum_rpow + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {s : Finset ι} {p : ℝ} + (hp : 1 ≤ p) + (hX_meas : ∀ i ∈ s, Measurable (X i)) + (hX_int : ∀ i ∈ s, Integrable (X i) μ) + (hsum_int : Integrable (fun ω => |∑ i ∈ s, X i ω| ^ p) μ) : + ∫ ω, |centeredFinsetSum X μ s ω| ^ p ∂μ ≤ + (2 : ℝ) ^ p * ∫ ω, |∑ i ∈ s, X i ω| ^ p ∂μ := by + have hsymm_int : + Integrable (fun ω : Ω × Ω => |symmetrizedFinsetSum X s ω| ^ p) (μ.prod μ) := + integrable_abs_symmetrizedFinsetSum_rpow_of_integrable_abs_finsetSum_rpow + (μ := μ) hp hX_meas hsum_int + exact + (integral_abs_centeredFinsetSum_rpow_le_integral_abs_symmetrizedFinsetSum_rpow + (μ := μ) (X := X) (s := s) (p := p) hp hX_int hsymm_int).trans + (integral_abs_symmetrizedFinsetSum_rpow_le_two_rpow_mul_integral_abs_finsetSum_rpow + (μ := μ) (X := X) (s := s) (p := p) hp hX_meas hsum_int) + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Truncation.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Truncation.lean new file mode 100644 index 0000000000..9e8865bd68 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Rosenthal/Truncation.lean @@ -0,0 +1,394 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.Rosenthal.BennettKernel + +/-! # Truncation -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory ProbabilityTheory +open Set +open scoped Topology + +noncomputable section + +variable {Ω ι : Type*} [MeasurableSpace Ω] +variable {μ : Measure Ω} + +/-- The centered finite sum `∑ (Xᵢ - E[Xᵢ])` attached to a family `X`. -/ +def centeredFinsetSum (X : ι → Ω → ℝ) (μ : Measure Ω) (s : Finset ι) : Ω → ℝ := + fun ω => ∑ i ∈ s, (X i ω - μ[X i]) + +/-- The symmetrized finite sum `∑ (Xᵢ(ω₁) - Xᵢ(ω₂))` on the product space. -/ +def symmetrizedFinsetSum (X : ι → Ω → ℝ) (s : Finset ι) : Ω × Ω → ℝ := + fun ω => ∑ i ∈ s, (X i ω.1 - X i ω.2) + +/-- The signed absolute-tail piece `X 1_{|X| > r}` used in the Rosenthal +truncation argument. -/ +def absTailIndicator (X : Ω → ℝ) (r : ℝ) : Ω → ℝ := + fun ω => if r < |X ω| then X ω else 0 + +/-- The bounded truncation `X - X 1_{|X| > r}`. -/ +def absTruncation (X : Ω → ℝ) (r : ℝ) : Ω → ℝ := + fun ω => X ω - absTailIndicator X r ω + +section + +omit [MeasurableSpace Ω] + +@[simp] theorem absTailIndicator_apply (X : Ω → ℝ) (r : ℝ) (ω : Ω) : + absTailIndicator X r ω = if r < |X ω| then X ω else 0 := + rfl + +@[simp] theorem absTruncation_apply (X : Ω → ℝ) (r : ℝ) (ω : Ω) : + absTruncation X r ω = X ω - absTailIndicator X r ω := + rfl + +@[simp] theorem absTailIndicator_of_lt_abs {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : r < |X ω|) : + absTailIndicator X r ω = X ω := by + simp [absTailIndicator, h] + +@[simp] theorem absTailIndicator_of_not_lt_abs {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : ¬ r < |X ω|) : + absTailIndicator X r ω = 0 := by + simp [absTailIndicator, h] + +theorem absTruncation_add_absTailIndicator (X : Ω → ℝ) (r : ℝ) : + absTruncation X r + absTailIndicator X r = X := by + funext ω + simp [absTruncation] + +theorem abs_absTailIndicator_le {X : Ω → ℝ} {r : ℝ} (ω : Ω) : + |absTailIndicator X r ω| ≤ |X ω| := by + by_cases h : r < |X ω| + · simp [absTailIndicator, h] + · simp [absTailIndicator, h] + +@[simp] theorem absTruncation_of_abs_le {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : |X ω| ≤ r) : + absTruncation X r ω = X ω := by + have h' : ¬ r < |X ω| := not_lt_of_ge h + simp [absTruncation, absTailIndicator, h'] + +@[simp] theorem absTruncation_of_lt_abs {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : r < |X ω|) : + absTruncation X r ω = 0 := by + simp [absTruncation, absTailIndicator, h] + +theorem abs_absTruncation_le {X : Ω → ℝ} {r : ℝ} (hr : 0 ≤ r) (ω : Ω) : + |absTruncation X r ω| ≤ r := by + by_cases h : r < |X ω| + · simp [absTruncation, absTailIndicator, h, hr] + · have hle : |X ω| ≤ r := le_of_not_gt h + rw [absTruncation_of_abs_le hle] + exact hle + +end + +theorem absTailIndicator_measurable {X : Ω → ℝ} {r : ℝ} + (hX : Measurable X) : + Measurable (absTailIndicator X r) := by + refine hX.piecewise ?_ measurable_const + exact measurableSet_lt measurable_const (continuous_abs.measurable.comp hX) + +theorem absTruncation_measurable {X : Ω → ℝ} {r : ℝ} + (hX : Measurable X) : + Measurable (absTruncation X r) := by + exact hX.sub (absTailIndicator_measurable hX) + +theorem integrable_absTailIndicator_of_integrable + {X : Ω → ℝ} {r : ℝ} + (hX_meas : Measurable X) (hX_int : Integrable X μ) : + Integrable (absTailIndicator X r) μ := by + refine Integrable.mono' hX_int.norm + (absTailIndicator_measurable hX_meas).aemeasurable.aestronglyMeasurable ?_ + filter_upwards with ω + simpa [Real.norm_eq_abs, abs_of_nonneg (abs_nonneg _)] using abs_absTailIndicator_le (X := X) + (r := r) ω + +theorem integrable_absTruncation_of_integrable + {X : Ω → ℝ} {r : ℝ} + (hX_meas : Measurable X) (hX_int : Integrable X μ) : + Integrable (absTruncation X r) μ := by + exact hX_int.sub (integrable_absTailIndicator_of_integrable hX_meas hX_int) + +/-- The finite sum of signed absolute-tail pieces. -/ +def absTailIndicatorFinsetSum (X : ι → Ω → ℝ) (r : ι → ℝ) (s : Finset ι) : Ω → ℝ := + fun ω => ∑ i ∈ s, absTailIndicator (X i) (r i) ω + +/-- The finite sum of bounded absolute-truncation pieces. -/ +def absTruncationFinsetSum (X : ι → Ω → ℝ) (r : ι → ℝ) (s : Finset ι) : Ω → ℝ := + fun ω => ∑ i ∈ s, absTruncation (X i) (r i) ω + +section + +omit [MeasurableSpace Ω] + +theorem absTruncationFinsetSum_add_absTailIndicatorFinsetSum + (X : ι → Ω → ℝ) (r : ι → ℝ) (s : Finset ι) : + absTruncationFinsetSum X r s + absTailIndicatorFinsetSum X r s = + fun ω => ∑ i ∈ s, X i ω := by + funext ω + simp [absTruncationFinsetSum, absTailIndicatorFinsetSum] + +theorem abs_absTruncationFinsetSum_le_sum + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} + (hr : ∀ i ∈ s, 0 ≤ r i) (ω : Ω) : + |absTruncationFinsetSum X r s ω| ≤ ∑ i ∈ s, r i := by + change |∑ i ∈ s, absTruncation (X i) (r i) ω| ≤ ∑ i ∈ s, r i + calc + |∑ i ∈ s, absTruncation (X i) (r i) ω| + ≤ ∑ i ∈ s, |absTruncation (X i) (r i) ω| := by + exact Finset.abs_sum_le_sum_abs (f := fun i => absTruncation (X i) (r i) ω) (s := s) + _ ≤ ∑ i ∈ s, r i := by + exact Finset.sum_le_sum fun i hi => + abs_absTruncation_le (X := X i) (r := r i) (hr i hi) ω + +end + +theorem absTailIndicatorFinsetSum_measurable + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} + (hX : ∀ i ∈ s, Measurable (X i)) : + Measurable (absTailIndicatorFinsetSum X r s) := by + refine Finset.measurable_sum s ?_ + intro i hi + exact absTailIndicator_measurable (hX i hi) + +theorem absTruncationFinsetSum_measurable + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} + (hX : ∀ i ∈ s, Measurable (X i)) : + Measurable (absTruncationFinsetSum X r s) := by + refine Finset.measurable_sum s ?_ + intro i hi + exact absTruncation_measurable (hX i hi) + +/-- The centered bounded-truncation family used in the Rosenthal proof. -/ +def centeredAbsTruncationFamily + (X : ι → Ω → ℝ) (r : ι → ℝ) (μ : Measure Ω) : ι → Ω → ℝ := + fun i ω => absTruncation (X i) (r i) ω - μ[absTruncation (X i) (r i)] + +@[simp] theorem centeredAbsTruncationFamily_apply + (X : ι → Ω → ℝ) (r : ι → ℝ) (μ : Measure Ω) (i : ι) (ω : Ω) : + centeredAbsTruncationFamily X r μ i ω = + absTruncation (X i) (r i) ω - μ[absTruncation (X i) (r i)] := + rfl + +theorem centeredAbsTruncationFamily_measurable + {X : ι → Ω → ℝ} {r : ι → ℝ} + (hX : ∀ i, Measurable (X i)) : + ∀ i, Measurable (centeredAbsTruncationFamily X r μ i) := by + intro i + exact (absTruncation_measurable (X := X i) (r := r i) (hX i)).sub measurable_const + +theorem centeredAbsTruncationFamily_iIndepFun + {X : ι → Ω → ℝ} {r : ι → ℝ} + (h_indep : iIndepFun X μ) : + iIndepFun (centeredAbsTruncationFamily X r μ) μ := by + let g : ι → ℝ → ℝ := + fun i x => absTruncation (fun t : ℝ => t) (r i) x - μ[absTruncation (X i) (r i)] + have hg : ∀ i, Measurable (g i) := by + intro i + exact + (absTruncation_measurable (X := fun t : ℝ => t) (r := r i) measurable_id).sub + measurable_const + simpa [centeredAbsTruncationFamily, g, Function.comp, absTruncation] using! h_indep.comp g hg + +theorem centeredAbsTruncationFamily_integral_eq_zero + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {i : ι} + (hXi_meas : Measurable (X i)) (hXi_int : Integrable (X i) μ) : + μ[centeredAbsTruncationFamily X r μ i] = 0 := by + have hTrunc_int : Integrable (absTruncation (X i) (r i)) μ := + integrable_absTruncation_of_integrable (μ := μ) hXi_meas hXi_int + have hconst_int : Integrable (fun _ : Ω => μ[absTruncation (X i) (r i)]) μ := + integrable_const _ + change ∫ ω, (absTruncation (X i) (r i) ω - μ[absTruncation (X i) (r i)]) ∂μ = 0 + rw [integral_sub hTrunc_int hconst_int, integral_const] + simp + +theorem sum_centeredAbsTruncationFamily_eq_centeredFinsetSum_absTruncation + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} : + (fun ω => ∑ i ∈ s, centeredAbsTruncationFamily X r μ i ω) = + centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s := by + funext ω + simp [centeredAbsTruncationFamily, centeredFinsetSum] + +theorem centeredFinsetSum_eq_absTruncationFinsetSum_add_absTailIndicatorFinsetSum + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} + (hTrunc_int : ∀ i ∈ s, Integrable (absTruncation (X i) (r i)) μ) + (hTail_int : ∀ i ∈ s, Integrable (absTailIndicator (X i) (r i)) μ) : + centeredFinsetSum X μ s = + fun ω => + centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s ω + + centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s ω := by + have hIntegral : + ∀ i ∈ s, + μ[X i] = + μ[absTruncation (X i) (r i)] + μ[absTailIndicator (X i) (r i)] := by + intro i hi + calc + μ[X i] = ∫ ω, absTruncation (X i) (r i) ω + absTailIndicator (X i) (r i) ω ∂μ := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun ω => + (congr_fun (absTruncation_add_absTailIndicator (X i) (r i)) ω).symm + _ = μ[absTruncation (X i) (r i)] + μ[absTailIndicator (X i) (r i)] := by + simpa using + (integral_add' (f := absTruncation (X i) (r i)) + (g := absTailIndicator (X i) (r i)) (hTrunc_int i hi) (hTail_int i hi)) + funext ω + rw [centeredFinsetSum, centeredFinsetSum, centeredFinsetSum] + calc + ∑ i ∈ s, (X i ω - μ[X i]) + = ∑ i ∈ s, + ((absTruncation (X i) (r i) ω + absTailIndicator (X i) (r i) ω) - + (μ[absTruncation (X i) (r i)] + μ[absTailIndicator (X i) (r i)])) := by + refine Finset.sum_congr rfl ?_ + intro i hi + rw [← congr_fun (absTruncation_add_absTailIndicator (X i) (r i)) ω, hIntegral i hi] + simp + _ = ∑ i ∈ s, + ((absTruncation (X i) (r i) ω - μ[absTruncation (X i) (r i)]) + + (absTailIndicator (X i) (r i) ω - μ[absTailIndicator (X i) (r i)])) := by + refine Finset.sum_congr rfl ?_ + intro i hi + ring + _ = (∑ i ∈ s, (absTruncation (X i) (r i) ω - μ[absTruncation (X i) (r i)])) + + ∑ i ∈ s, (absTailIndicator (X i) (r i) ω - μ[absTailIndicator (X i) (r i)]) := by + rw [Finset.sum_add_distrib] + +omit [MeasurableSpace Ω] in +theorem upperTailEvent_add_subset_union + {X Y : Ω → ℝ} {a b : ℝ} : + upperTailEvent (fun ω => X ω + Y ω) (a + b) ⊆ + upperTailEvent X a ∪ upperTailEvent Y b := by + intro ω hω + by_contra hUnion + rw [Set.mem_union, mem_upperTailEvent, mem_upperTailEvent, not_or] at hUnion + have hX_le : X ω ≤ a := le_of_not_gt hUnion.1 + have hY_le : Y ω ≤ b := le_of_not_gt hUnion.2 + exact not_lt_of_ge (add_le_add hX_le hY_le) (by simpa [upperTailEvent] using hω) + +omit [MeasurableSpace Ω] in +theorem absTailEvent_add_subset_union + {X Y : Ω → ℝ} {a b : ℝ} : + absTailEvent (fun ω => X ω + Y ω) (a + b) ⊆ + absTailEvent X a ∪ absTailEvent Y b := by + intro ω hω + by_contra hUnion + rw [Set.mem_union, mem_absTailEvent, mem_absTailEvent, not_or] at hUnion + have hX_le : |X ω| ≤ a := le_of_not_gt hUnion.1 + have hY_le : |Y ω| ≤ b := le_of_not_gt hUnion.2 + have hsum_le : |X ω + Y ω| ≤ a + b := by + exact le_trans (abs_add_le (X ω) (Y ω)) (add_le_add hX_le hY_le) + exact not_lt_of_ge hsum_le (by simpa [absTailEvent] using hω) + +theorem absTailEvent_centeredFinsetSum_subset_union + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {a b : ℝ} + (hTrunc_int : ∀ i ∈ s, Integrable (absTruncation (X i) (r i)) μ) + (hTail_int : ∀ i ∈ s, Integrable (absTailIndicator (X i) (r i)) μ) : + absTailEvent (centeredFinsetSum X μ s) (a + b) ⊆ + absTailEvent (centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s) a ∪ + absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b := by + let F : Ω → ℝ := centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s + let G : Ω → ℝ := centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s + have hdecomp : + centeredFinsetSum X μ s = fun ω => F ω + G ω := by + simpa [F, G] using + (centeredFinsetSum_eq_absTruncationFinsetSum_add_absTailIndicatorFinsetSum + (μ := μ) (X := X) (r := r) (s := s) hTrunc_int hTail_int) + intro ω hω + have hω' : ω ∈ absTailEvent (fun ω => F ω + G ω) (a + b) := by + simpa [hdecomp] using hω + exact absTailEvent_add_subset_union (X := F) (Y := G) hω' + +theorem measureReal_absTailEvent_centeredFinsetSum_le_truncation_add_tail + [IsFiniteMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {s : Finset ι} {a b : ℝ} + (hTrunc_int : ∀ i ∈ s, Integrable (absTruncation (X i) (r i)) μ) + (hTail_int : ∀ i ∈ s, Integrable (absTailIndicator (X i) (r i)) μ) : + μ.real (absTailEvent (centeredFinsetSum X μ s) (a + b)) ≤ + μ.real (absTailEvent (centeredFinsetSum (fun i => absTruncation (X i) (r i)) μ s) a) + + μ.real (absTailEvent (centeredFinsetSum (fun i => absTailIndicator (X i) (r i)) μ s) b) := by + refine le_trans ?_ (measureReal_union_le _ _) + exact measureReal_mono + (absTailEvent_centeredFinsetSum_subset_union + (μ := μ) (X := X) (r := r) (s := s) hTrunc_int hTail_int) + +theorem integral_abs_sub_integral_le_two_mul + [IsProbabilityMeasure μ] + {Y : Ω → ℝ} + (hY_int : Integrable Y μ) : + ∫ ω, |Y ω - μ[Y]| ∂μ ≤ 2 * ∫ ω, |Y ω| ∂μ := by + have hcentered_int : Integrable (fun ω => Y ω - μ[Y]) μ := + hY_int.sub (integrable_const _) + have hpoint : + ∀ᵐ ω ∂μ, |Y ω - μ[Y]| ≤ |Y ω| + |μ[Y]| := by + exact Filter.Eventually.of_forall fun ω => + by simpa [sub_eq_add_neg] using abs_add_le (Y ω) (-μ[Y]) + calc + ∫ ω, |Y ω - μ[Y]| ∂μ ≤ ∫ ω, (|Y ω| + |μ[Y]|) ∂μ := by + refine integral_mono_ae hcentered_int.norm ?_ hpoint + exact hY_int.norm.add (integrable_const _) + _ = ∫ ω, |Y ω| ∂μ + ∫ ω, |μ[Y]| ∂μ := by + rw [integral_add (f := fun ω => |Y ω|) (g := fun _ : Ω => |μ[Y]|) + (hY_int.norm) (integrable_const _)] + _ = ∫ ω, |Y ω| ∂μ + |μ[Y]| := by simp + _ ≤ ∫ ω, |Y ω| ∂μ + ∫ ω, |Y ω| ∂μ := by + gcongr + exact abs_integral_le_integral_abs + _ = 2 * ∫ ω, |Y ω| ∂μ := by ring + +theorem abs_integral_absTruncation_le + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {r : ℝ} + (hX_meas : Measurable X) (hX_int : Integrable X μ) (hr : 0 ≤ r) : + |μ[absTruncation X r]| ≤ r := by + have hTrunc_int : Integrable (absTruncation X r) μ := + integrable_absTruncation_of_integrable hX_meas hX_int + have hpoint : ∀ᵐ ω ∂μ, |absTruncation X r ω| ≤ r := by + exact Filter.Eventually.of_forall (abs_absTruncation_le (X := X) (r := r) hr) + calc + |μ[absTruncation X r]| = ‖∫ ω, absTruncation X r ω ∂μ‖ := by + simp [Real.norm_eq_abs] + _ ≤ ∫ ω, ‖absTruncation X r ω‖ ∂μ := norm_integral_le_integral_norm _ + _ = ∫ ω, |absTruncation X r ω| ∂μ := by simp [Real.norm_eq_abs] + _ ≤ ∫ ω, r ∂μ := by + exact integral_mono_ae hTrunc_int.norm (integrable_const r) hpoint + _ = r := by simp + +theorem abs_sub_integral_absTruncation_le_two_mul + [IsProbabilityMeasure μ] + {X : Ω → ℝ} {r : ℝ} + (hX_meas : Measurable X) (hX_int : Integrable X μ) (hr : 0 ≤ r) (ω : Ω) : + |absTruncation X r ω - μ[absTruncation X r]| ≤ 2 * r := by + calc + |absTruncation X r ω - μ[absTruncation X r]| + ≤ |absTruncation X r ω| + |μ[absTruncation X r]| := by + simpa [sub_eq_add_neg] using abs_add_le (absTruncation X r ω) (-μ[absTruncation X r]) + _ ≤ r + r := add_le_add (abs_absTruncation_le (X := X) (r := r) hr ω) + (abs_integral_absTruncation_le hX_meas hX_int hr) + _ = 2 * r := by ring + +theorem abs_centeredAbsTruncationFamily_le_two_mul + [IsProbabilityMeasure μ] + {X : ι → Ω → ℝ} {r : ι → ℝ} {i : ι} + (hXi_meas : Measurable (X i)) (hXi_int : Integrable (X i) μ) (hri : 0 ≤ r i) (ω : Ω) : + |centeredAbsTruncationFamily X r μ i ω| ≤ 2 * r i := by + simpa [centeredAbsTruncationFamily] using + abs_sub_integral_absTruncation_le_two_mul + (μ := μ) (X := X i) (r := r i) hXi_meas hXi_int hri ω + + +end +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Triangle.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Triangle.lean new file mode 100644 index 0000000000..e5b0e64428 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/Triangle.lean @@ -0,0 +1,906 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Integral.Layercake +public import Mathlib.MeasureTheory.Function.L1Space.Integrable +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.PsiCalculus + +/-! # Triangle -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory +open scoped BigOperators + +noncomputable section + +variable {Ω ι : Type*} + +/-! +Finite-sum reduction lemmas for the Chapter 4 weak-Orlicz triangle inequality. + +This file formalizes the deterministic truncation step and the finite-family +Markov reduction from Step 5 of the notes. The one-variable tail integral bound +will plug into these lemmas downstream. +-/ + +/-- The truncated upper-tail variable `X 1_{X > r}` used in the Step 5 proof +of the generalized triangle inequality. -/ +def upperTailIndicator (X : Ω → ℝ) (r : ℝ) : Ω → ℝ := + (upperTailEvent X r).indicator X + +@[simp] theorem upperTailIndicator_apply (X : Ω → ℝ) (r : ℝ) (ω : Ω) : + upperTailIndicator X r ω = if r < X ω then X ω else 0 := + rfl + +@[simp] theorem upperTailIndicator_of_lt {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : r < X ω) : + upperTailIndicator X r ω = X ω := by + simp [upperTailIndicator, upperTailEvent, h] + +@[simp] theorem upperTailIndicator_of_not_lt {X : Ω → ℝ} {r : ℝ} {ω : Ω} + (h : ¬ r < X ω) : + upperTailIndicator X r ω = 0 := by + simp [upperTailIndicator, upperTailEvent, h] + +theorem upperTailIndicator_nonneg {X : Ω → ℝ} {r : ℝ} + (hr : 0 ≤ r) (ω : Ω) : + 0 ≤ upperTailIndicator X r ω := by + by_cases h : r < X ω + · simpa [upperTailIndicator, upperTailEvent, h] using le_trans hr (le_of_lt h) + · simp [upperTailIndicator, upperTailEvent, h] + +theorem le_upperTailIndicator_add {X : Ω → ℝ} {r : ℝ} + (hr : 0 ≤ r) (ω : Ω) : + X ω ≤ upperTailIndicator X r ω + r := by + by_cases h : r < X ω + · simp [upperTailIndicator, upperTailEvent, h, hr] + · simp [upperTailIndicator, upperTailEvent, h] + exact not_lt.mp h + +theorem sum_le_sum_upperTailIndicator_add_sum + (s : Finset ι) {X : ι → Ω → ℝ} {r : ι → ℝ} + (hr : ∀ i ∈ s, 0 ≤ r i) (ω : Ω) : + Finset.sum s (fun i => X i ω) ≤ + Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω) + Finset.sum s r := by + calc + Finset.sum s (fun i => X i ω) ≤ + Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω + r i) := by + exact Finset.sum_le_sum fun i hi => le_upperTailIndicator_add (hr i hi) ω + _ = Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω) + Finset.sum s r := by + rw [Finset.sum_add_distrib] + +/-- If a finite sum exceeds `b + Σ rᵢ`, then the sum of the corresponding +upper-tail truncations exceeds `b`. -/ +theorem upperTailEvent_finset_sum_subset_upperTailIndicator_finset_sum + (s : Finset ι) {X : ι → Ω → ℝ} {r : ι → ℝ} {b : ℝ} + (hr : ∀ i ∈ s, 0 ≤ r i) : + upperTailEvent (fun ω => Finset.sum s (fun i => X i ω)) (b + Finset.sum s r) ⊆ + upperTailEvent (fun ω => Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω)) b := by + intro ω hω + have hle := + sum_le_sum_upperTailIndicator_add_sum (Ω := Ω) (ι := ι) (X := X) (r := r) s hr ω + change b < Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω) + change b + Finset.sum s r < Finset.sum s (fun i => X i ω) at hω + linarith + +/-- The absolute tail of a finite sum is controlled by the one-sided tail of +the sum of the absolute values. -/ +theorem absTailEvent_finset_sum_subset_upperTailEvent_sum_abs + (s : Finset ι) {X : ι → Ω → ℝ} {b : ℝ} : + absTailEvent (fun ω => Finset.sum s (fun i => X i ω)) b ⊆ + upperTailEvent (fun ω => Finset.sum s (fun i => |X i ω|)) b := by + intro ω hω + change b < Finset.sum s (fun i => |X i ω|) + change b < |Finset.sum s (fun i => X i ω)| at hω + exact lt_of_lt_of_le hω (Finset.abs_sum_le_sum_abs (fun i => X i ω) s) + +theorem upperTailEvent_upperTailIndicator_eq_upperTailEvent_left + {X : Ω → ℝ} {c s : ℝ} (hs : 0 < s) (hsc : s ≤ c) : + upperTailEvent (upperTailIndicator X c) s = upperTailEvent X c := by + ext ω + by_cases hω : c < X ω + · have hsX : s < X ω := lt_of_le_of_lt hsc hω + simp [upperTailIndicator, upperTailEvent, hω, hsX] + · have hs0 : ¬ s < (0 : ℝ) := not_lt.mpr hs.le + simp [upperTailIndicator, upperTailEvent, hω, hs0] + +theorem upperTailEvent_upperTailIndicator_eq_upperTailEvent_right + {X : Ω → ℝ} {c s : ℝ} (hc : 0 ≤ c) (hcs : c ≤ s) : + upperTailEvent (upperTailIndicator X c) s = upperTailEvent X s := by + ext ω + by_cases hω : c < X ω + · simp [upperTailIndicator, upperTailEvent, hω] + · have hs0 : ¬ s < (0 : ℝ) := not_lt.mpr (le_trans hc hcs) + have hsX : ¬ s < X ω := by + exact not_lt_of_ge ((not_lt.mp hω).trans hcs) + simp [upperTailIndicator, upperTailEvent, hω, hs0, hsX] + +section Measure + +variable [MeasurableSpace Ω] +variable {μ : Measure Ω} + +theorem upperTailIndicator_measurable {X : Ω → ℝ} {r : ℝ} + (hX : Measurable X) : + Measurable (upperTailIndicator X r) := by + exact hX.indicator (measurableSet_lt measurable_const hX) + +theorem measureReal_upperTailEvent_upperTailIndicator_eq_upperTailEvent_left + {X : Ω → ℝ} {c s : ℝ} (hs : 0 < s) (hsc : s ≤ c) : + μ.real (upperTailEvent (upperTailIndicator X c) s) = + μ.real (upperTailEvent X c) := by + rw [upperTailEvent_upperTailIndicator_eq_upperTailEvent_left hs hsc] + +theorem measureReal_upperTailEvent_upperTailIndicator_eq_upperTailEvent_right + {X : Ω → ℝ} {c s : ℝ} (hc : 0 ≤ c) (hcs : c ≤ s) : + μ.real (upperTailEvent (upperTailIndicator X c) s) = + μ.real (upperTailEvent X s) := by + rw [upperTailEvent_upperTailIndicator_eq_upperTailEvent_right hc hcs] + +theorem lintegral_upperTailIndicator_le_of_isBigOWith + [IsFiniteMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {a q C₀ t : ℝ} + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) (ha : 0 < a) (ht : 1 ≤ t) + (hX : IsBigOWith μ Ψ X a) (hXm : Measurable X) : + ∫⁻ ω, ENNReal.ofReal (upperTailIndicator X (a * t) ω) ∂μ ≤ + ENNReal.ofReal (a * t * (1 + C₀ / (q - 1)) * (Ψ t)⁻¹) := by + let c : ℝ := a * t + let Y : Ω → ℝ := upperTailIndicator X c + let C : ℝ := C₀ * (Ψ t)⁻¹ + have ht_pos : 0 < t := lt_of_lt_of_le zero_lt_one ht + have hc_pos : 0 < c := by + simp [c, mul_pos ha ht_pos] + have hc_nonneg : 0 ≤ c := hc_pos.le + have hq_sub_pos : 0 < q - 1 := sub_pos.mpr hq + have hq_sub_ne : q - 1 ≠ 0 := hq_sub_pos.ne' + have hC₀_one : 1 ≤ C₀ := hasPsiAbstractDoubling_one_le_const hD hAdmissible + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 (le_trans zero_le_one ht) + have hΨt_pos : 0 < Ψ t := lt_of_lt_of_le zero_lt_one hΨt_one + have hΨt_inv_nonneg : 0 ≤ (Ψ t)⁻¹ := inv_nonneg.mpr (le_of_lt hΨt_pos) + have hC_nonneg : 0 ≤ C := by + exact mul_nonneg (le_trans zero_le_one hC₀_one) hΨt_inv_nonneg + have hY_nonneg : 0 ≤ᵐ[μ] Y := by + refine Filter.Eventually.of_forall ?_ + intro ω + simpa [Y, c] using upperTailIndicator_nonneg (X := X) (r := c) hc_nonneg ω + have hY_meas : Measurable Y := by + simpa [Y, c] using upperTailIndicator_measurable (X := X) (r := c) hXm + have hLayer := + MeasureTheory.lintegral_eq_lintegral_meas_lt (μ := μ) (f := Y) hY_nonneg hY_meas.aemeasurable + have hLayer' : + ∫⁻ ω, ENNReal.ofReal (Y ω) ∂μ = + ∫⁻ s in Set.Ioi 0, ENNReal.ofReal (μ.real (upperTailEvent Y s)) := by + rw [hLayer] + refine setLIntegral_congr_fun measurableSet_Ioi ?_ + intro s hs + have htail_ne_top : μ (upperTailEvent Y s) ≠ ⊤ := by finiteness + change μ (upperTailEvent Y s) = ENNReal.ofReal (μ.real (upperTailEvent Y s)) + simp [Measure.real, htail_ne_top] + have hIoc_eq : + ∫⁻ s in Set.Ioc 0 c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume = + ENNReal.ofReal (c * μ.real (upperTailEvent X c)) := by + calc + ∫⁻ s in Set.Ioc 0 c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume + = ∫⁻ _ in Set.Ioc 0 c, ENNReal.ofReal (μ.real (upperTailEvent X c)) ∂volume := by + refine setLIntegral_congr_fun measurableSet_Ioc ?_ + intro s hs + change ENNReal.ofReal (μ.real (upperTailEvent Y s)) = + ENNReal.ofReal (μ.real (upperTailEvent X c)) + rw [measureReal_upperTailEvent_upperTailIndicator_eq_upperTailEvent_left + (μ := μ) (X := X) (c := c) hs.1 hs.2] + _ = ENNReal.ofReal (μ.real (upperTailEvent X c)) * volume (Set.Ioc 0 c) := by + rw [setLIntegral_const] + _ = ENNReal.ofReal (μ.real (upperTailEvent X c)) * ENNReal.ofReal c := by + congr 1 + simp [Real.volume_Ioc] + _ = ENNReal.ofReal (c * μ.real (upperTailEvent X c)) := by + rw [← ENNReal.ofReal_mul (by positivity : 0 ≤ μ.real (upperTailEvent X c))] + ring_nf + have hpow_nonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi c)] fun s : ℝ => (s / c) ^ (-q) := by + rw [Filter.EventuallyLE, ae_restrict_iff' measurableSet_Ioi] + refine Filter.Eventually.of_forall ?_ + intro s hs + exact Real.rpow_nonneg (div_nonneg (le_of_lt (lt_trans hc_pos hs)) hc_nonneg) _ + have hpow_integrable_base : + IntegrableOn (fun s : ℝ => s ^ (-q)) (Set.Ioi c) volume := by + exact integrableOn_Ioi_rpow_of_lt (a := -q) (by linarith) hc_pos + have hpow_integrable : + IntegrableOn (fun s : ℝ => (s / c) ^ (-q)) (Set.Ioi c) volume := by + have hscaled : + IntegrableOn (fun s : ℝ => c ^ q * s ^ (-q)) (Set.Ioi c) volume := + hpow_integrable_base.const_mul _ + refine hscaled.congr_fun ?_ measurableSet_Ioi + intro s hs + have hs_pos : 0 < s := lt_trans hc_pos hs + have hdiv : + (s / c) ^ (-q) = c ^ q * s ^ (-q) := by + calc + (s / c) ^ (-q) = s ^ (-q) / c ^ (-q) := by + rw [Real.div_rpow (le_of_lt hs_pos) hc_nonneg] + _ = s ^ (-q) / (c ^ q)⁻¹ := by + rw [Real.rpow_neg hc_nonneg] + _ = s ^ (-q) * c ^ q := by + rw [div_eq_mul_inv, inv_inv] + _ = c ^ q * s ^ (-q) := by ring + simp [hdiv] + have htail_nonneg : + 0 ≤ᵐ[volume.restrict (Set.Ioi c)] fun s : ℝ => C * (s / c) ^ (-q) := by + rw [Filter.EventuallyLE, ae_restrict_iff' measurableSet_Ioi] + refine Filter.Eventually.of_forall ?_ + intro s hs + exact mul_nonneg hC_nonneg <| + Real.rpow_nonneg (div_nonneg (le_of_lt (lt_trans hc_pos hs)) hc_nonneg) _ + have htail_integrable : + IntegrableOn (fun s : ℝ => C * (s / c) ^ (-q)) (Set.Ioi c) volume := + hpow_integrable.const_mul C + have hIoi_bound : + ∫⁻ s in Set.Ioi c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume ≤ + ENNReal.ofReal (C * (c / (q - 1))) := by + have hmono : + ∀ s ∈ Set.Ioi c, + ENNReal.ofReal (μ.real (upperTailEvent Y s)) ≤ + ENNReal.ofReal (C * (s / c) ^ (-q)) := by + intro s hs + have hs' : c < s := hs + have hs_tail : + μ.real (upperTailEvent X s) ≤ (Ψ (s / a))⁻¹ := by + have hs_div_one : 1 ≤ s / a := by + rw [one_le_div_iff] + left + constructor + · exact ha + · nlinarith [ht, hs'.le] + have hs_mul : a * (s / a) = s := by + field_simp [ha.ne'] + simpa [hs_mul] using hX hs_div_one + have hscaled := + hasPsiAbstractDoubling_scaledInvTail (hD := hD) (hAdmissible := hAdmissible) + (a := a) (t := 2 * t) (s := s) ha (by nlinarith [ht]) ?_ + · have hratio : (2 * s) / (a * (2 * t)) = s / c := by + field_simp [c, ha.ne', ht_pos.ne'] + ring + have hratio' : s * 2 / (a * (t * 2)) = s / c := by + field_simp [c, ha.ne', ht_pos.ne'] + ring + have htail : + μ.real (upperTailEvent Y s) ≤ C * (s / c) ^ (-q) := by + calc + μ.real (upperTailEvent Y s) = μ.real (upperTailEvent X s) := by + rw [measureReal_upperTailEvent_upperTailIndicator_eq_upperTailEvent_right + (μ := μ) (X := X) (c := c) hc_nonneg hs'.le] + _ ≤ (Ψ (s / a))⁻¹ := hs_tail + _ ≤ C₀ * ((Ψ t)⁻¹ * (s / c) ^ (-q)) := by + simpa [c, hratio', mul_assoc, mul_left_comm, mul_comm] using hscaled + _ = C * (s / c) ^ (-q) := by + simp [C, mul_assoc] + exact ENNReal.ofReal_le_ofReal htail + · nlinarith [hs'.le] + refine (setLIntegral_mono' measurableSet_Ioi hmono).trans ?_ + rw [← MeasureTheory.ofReal_integral_eq_lintegral_ofReal + (show Integrable (fun s : ℝ => C * (s / c) ^ (-q)) (volume.restrict (Set.Ioi c)) by + simpa [IntegrableOn] using htail_integrable) + htail_nonneg] + rw [integral_const_mul, integral_Ioi_div_rpow_neg hq hc_pos] + have hfirst : + ENNReal.ofReal (c * μ.real (upperTailEvent X c)) ≤ + ENNReal.ofReal (c * (Ψ t)⁻¹) := by + refine ENNReal.ofReal_le_ofReal ?_ + have htail : μ.real (upperTailEvent X c) ≤ (Ψ t)⁻¹ := by + simpa [c] using hX ht + exact mul_le_mul_of_nonneg_left htail hc_nonneg + have hsplit : + ∫⁻ s in Set.Ioi 0, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume = + ∫⁻ s in Set.Ioc 0 c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume + + ∫⁻ s in Set.Ioi c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume := by + have hUnion : Set.Ioi 0 = Set.Ioc 0 c ∪ Set.Ioi c := by + ext s + constructor + · intro hs + by_cases hsc : s ≤ c + · exact Or.inl ⟨hs, hsc⟩ + · exact Or.inr (lt_of_not_ge hsc) + · intro hs + rcases hs with hs | hs + · exact hs.1 + · exact lt_trans hc_pos hs + rw [hUnion] + rw [MeasureTheory.lintegral_union (μ := volume) + (f := fun s : ℝ => ENNReal.ofReal (μ.real (upperTailEvent Y s))) + measurableSet_Ioi + (Set.disjoint_left.2 fun s hs hIoi => hs.2.not_gt hIoi)] + calc + ∫⁻ ω, ENNReal.ofReal (upperTailIndicator X (a * t) ω) ∂μ + = ∫⁻ ω, ENNReal.ofReal (Y ω) ∂μ := by simp [Y, c] + _ = ∫⁻ s in Set.Ioi 0, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume := hLayer' + _ = ∫⁻ s in Set.Ioc 0 c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume + + ∫⁻ s in Set.Ioi c, ENNReal.ofReal (μ.real (upperTailEvent Y s)) ∂volume := hsplit + _ ≤ ENNReal.ofReal (c * (Ψ t)⁻¹) + ENNReal.ofReal (C * (c / (q - 1))) := by + gcongr + exact hIoc_eq.trans_le hfirst + _ = ENNReal.ofReal (a * t * (1 + C₀ / (q - 1)) * (Ψ t)⁻¹) := by + have hterm1_nonneg : 0 ≤ c * (Ψ t)⁻¹ := mul_nonneg hc_nonneg hΨt_inv_nonneg + have hterm2_nonneg : 0 ≤ C * (c / (q - 1)) := by + refine mul_nonneg hC_nonneg ?_ + positivity + rw [← ENNReal.ofReal_add hterm1_nonneg hterm2_nonneg] + congr 1 + simp [C, c] + field_simp [hΨt_pos.ne', hq_sub_ne] + +theorem integrable_upperTailIndicator_of_isBigOWith + [IsFiniteMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {a q C₀ t : ℝ} + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) (ha : 0 < a) (ht : 1 ≤ t) + (hX : IsBigOWith μ Ψ X a) (hXm : Measurable X) : + Integrable (upperTailIndicator X (a * t)) μ := by + have hY_nonneg : + 0 ≤ᵐ[μ] fun ω => upperTailIndicator X (a * t) ω := by + refine Filter.Eventually.of_forall ?_ + intro ω + exact upperTailIndicator_nonneg (X := X) (r := a * t) (by positivity) ω + refine ⟨(upperTailIndicator_measurable (X := X) (r := a * t) hXm).aestronglyMeasurable, ?_⟩ + rw [hasFiniteIntegral_iff_ofReal hY_nonneg] + exact lt_of_le_of_lt + (lintegral_upperTailIndicator_le_of_isBigOWith (μ := μ) hD hAdmissible hq ha ht hX hXm) + ENNReal.ofReal_lt_top + +theorem integral_upperTailIndicator_le_of_isBigOWith + [IsFiniteMeasure μ] + {Ψ : ℝ → ℝ} {X : Ω → ℝ} {a q C₀ t : ℝ} + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) (ha : 0 < a) (ht : 1 ≤ t) + (hX : IsBigOWith μ Ψ X a) (hXm : Measurable X) : + ∫ ω, upperTailIndicator X (a * t) ω ∂μ ≤ + a * t * (1 + C₀ / (q - 1)) * (Ψ t)⁻¹ := by + have hInt := + integrable_upperTailIndicator_of_isBigOWith (μ := μ) hD hAdmissible hq ha ht hX hXm + have hY_nonneg : + 0 ≤ᵐ[μ] fun ω => upperTailIndicator X (a * t) ω := by + refine Filter.Eventually.of_forall ?_ + intro ω + exact upperTailIndicator_nonneg (X := X) (r := a * t) (by positivity) ω + have hlin := + lintegral_upperTailIndicator_le_of_isBigOWith + (μ := μ) hD hAdmissible hq ha ht hX hXm + rw [← MeasureTheory.ofReal_integral_eq_lintegral_ofReal hInt hY_nonneg] at hlin + have hbound_nonneg : 0 ≤ a * t * (1 + C₀ / (q - 1)) * (Ψ t)⁻¹ := by + have hC₀_one : 1 ≤ C₀ := hasPsiAbstractDoubling_one_le_const hD hAdmissible + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 (le_trans zero_le_one ht) + have hq_sub_pos : 0 < q - 1 := sub_pos.mpr hq + have hinner_nonneg : 0 ≤ 1 + C₀ / (q - 1) := by + positivity + have ht_nonneg : 0 ≤ t := le_trans zero_le_one ht + have hat_nonneg : 0 ≤ a * t := mul_nonneg ha.le ht_nonneg + have htail_nonneg : 0 ≤ (1 + C₀ / (q - 1)) * (Ψ t)⁻¹ := by + exact mul_nonneg hinner_nonneg (inv_nonneg.mpr (le_trans zero_le_one hΨt_one)) + exact mul_nonneg (mul_nonneg hat_nonneg hinner_nonneg) + (inv_nonneg.mpr (le_trans zero_le_one hΨt_one)) + exact (ENNReal.ofReal_le_ofReal_iff hbound_nonneg).1 hlin + +theorem mul_measureReal_upperTailEvent_finset_sum_le_integral_finset_sum + (s : Finset ι) {Y : ι → Ω → ℝ} {b : ℝ} + [IsFiniteMeasure μ] + (hb : 0 ≤ b) + (hY_nonneg : ∀ i ∈ s, ∀ ω, 0 ≤ Y i ω) + (hY_int : ∀ i ∈ s, Integrable (Y i) μ) : + b * μ.real (upperTailEvent (fun ω => Finset.sum s (fun i => Y i ω)) b) ≤ + Finset.sum s (fun i => ∫ ω, Y i ω ∂μ) := by + let F : Ω → ℝ := Finset.sum s Y + have hF_eq : F = fun ω => Finset.sum s (fun i => Y i ω) := by + funext ω + simp [F] + have hF_nonneg : 0 ≤ᵐ[μ] F := by + refine Filter.Eventually.of_forall ?_ + intro ω + show 0 ≤ F ω + simpa [F] using Finset.sum_nonneg (fun i hi => hY_nonneg i hi ω) + have hF_int : Integrable F μ := by + simpa [F] using integrable_finsetSum' s hY_int + have hmono : + μ.real (upperTailEvent F b) ≤ μ.real {ω | b ≤ F ω} := by + refine measureReal_mono ?_ + intro ω hω + show b ≤ F ω + exact le_of_lt hω + have hmain : b * μ.real (upperTailEvent F b) ≤ Finset.sum s (fun i => ∫ ω, Y i ω ∂μ) := by + calc + b * μ.real (upperTailEvent F b) ≤ b * μ.real {ω | b ≤ F ω} := by + exact mul_le_mul_of_nonneg_left hmono hb + _ ≤ ∫ ω, F ω ∂μ := by + simpa [F, upperTailEvent] using + (mul_meas_ge_le_integral_of_nonneg (μ := μ) hF_nonneg hF_int b) + _ = Finset.sum s (fun i => ∫ ω, Y i ω ∂μ) := by + rw [hF_eq] + rw [integral_finsetSum s hY_int] + simpa [hF_eq] using hmain + +theorem measureReal_upperTailEvent_finset_sum_le_div + (s : Finset ι) {Y : ι → Ω → ℝ} {b : ℝ} + [IsFiniteMeasure μ] + (hb : 0 < b) + (hY_nonneg : ∀ i ∈ s, ∀ ω, 0 ≤ Y i ω) + (hY_int : ∀ i ∈ s, Integrable (Y i) μ) : + μ.real (upperTailEvent (fun ω => Finset.sum s (fun i => Y i ω)) b) ≤ + (Finset.sum s (fun i => ∫ ω, Y i ω ∂μ) / b) := by + exact (le_div_iff₀' hb).2 + (mul_measureReal_upperTailEvent_finset_sum_le_integral_finset_sum + (μ := μ) s hb.le hY_nonneg hY_int) + +/-- The finite-sum Step 5 reduction: after truncating each variable at level +`rᵢ`, the upper tail of the original sum is controlled by Markov's inequality +applied to the truncated sum. -/ +theorem measureReal_upperTailEvent_finset_sum_le_div_of_upperTailIndicator + (s : Finset ι) {X : ι → Ω → ℝ} {r : ι → ℝ} {b : ℝ} + [IsFiniteMeasure μ] + (hr : ∀ i ∈ s, 0 ≤ r i) (hb : 0 < b) + (hInt : ∀ i ∈ s, Integrable (upperTailIndicator (X i) (r i)) μ) : + μ.real (upperTailEvent (fun ω => Finset.sum s (fun i => X i ω)) (b + Finset.sum s r)) ≤ + (Finset.sum s (fun i => ∫ ω, upperTailIndicator (X i) (r i) ω ∂μ) / b) := by + have hsubset : + upperTailEvent (fun ω => Finset.sum s (fun i => X i ω)) (b + Finset.sum s r) ⊆ + upperTailEvent (fun ω => Finset.sum s (fun i => upperTailIndicator (X i) (r i) ω)) b := + upperTailEvent_finset_sum_subset_upperTailIndicator_finset_sum + (Ω := Ω) (ι := ι) s hr + refine (measureReal_mono hsubset).trans ?_ + refine measureReal_upperTailEvent_finset_sum_le_div (μ := μ) s hb ?_ hInt + intro i hi ω + exact upperTailIndicator_nonneg (hr i hi) ω + +/-- Step 5 pre-triangle estimate in weak-Orlicz form: after truncating each +variable at level `aᵢ * (t / 2)`, the finite-sum Markov reduction and the +one-variable truncation bound combine into the tail estimate at scale +`(∑ aᵢ) * t`. -/ +theorem measureReal_upperTailEvent_finset_sum_le_of_isBigOWith + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {q C₀ t : ℝ} + [IsFiniteMeasure μ] + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) + (hs : s.Nonempty) (ht : 2 ≤ t) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigOWith μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + μ.real (upperTailEvent (fun ω => Finset.sum s (fun i => X i ω)) ((Finset.sum s a) * t)) ≤ + (1 + C₀ / (q - 1)) * (Ψ (t / 2))⁻¹ := by + let r : ι → ℝ := fun i => a i * (t / 2) + let b : ℝ := (Finset.sum s a) * (t / 2) + let K : ℝ := (1 + C₀ / (q - 1)) * (Ψ (t / 2))⁻¹ + have ht_half : 1 ≤ t / 2 := by + nlinarith + have ht_half_pos : 0 < t / 2 := by + nlinarith + have hr : ∀ i ∈ s, 0 ≤ r i := by + intro i hi + simpa [r] using mul_nonneg (ha i hi).le ht_half_pos.le + have hsuma_pos : 0 < Finset.sum s a := by + rcases hs with ⟨i₀, hi₀⟩ + exact Finset.sum_pos' (fun i hi => (ha i hi).le) ⟨i₀, hi₀, ha i₀ hi₀⟩ + have hb : 0 < b := by + exact mul_pos hsuma_pos ht_half_pos + have hInt : ∀ i ∈ s, Integrable (upperTailIndicator (X i) (r i)) μ := by + intro i hi + simpa [r] using + integrable_upperTailIndicator_of_isBigOWith + (μ := μ) (Ψ := Ψ) (X := X i) (a := a i) (q := q) (C₀ := C₀) (t := t / 2) + hD hAdmissible hq (ha i hi) ht_half (hX i hi) (hXm i hi) + have hmain := + measureReal_upperTailEvent_finset_sum_le_div_of_upperTailIndicator + (μ := μ) (s := s) (X := X) (r := r) (b := b) hr hb hInt + have hsum_r : Finset.sum s r = b := by + simp [b, r, Finset.sum_mul] + have hthreshold : b + Finset.sum s r = (Finset.sum s a) * t := by + rw [hsum_r] + change (Finset.sum s a * (t / 2)) + (Finset.sum s a * (t / 2)) = (Finset.sum s a) * t + ring_nf + rw [hthreshold] at hmain + have hsum_bound : + Finset.sum s (fun i => ∫ ω, upperTailIndicator (X i) (r i) ω ∂μ) ≤ b * K := by + calc + Finset.sum s (fun i => ∫ ω, upperTailIndicator (X i) (r i) ω ∂μ) + ≤ Finset.sum s (fun i => a i * (t / 2) * K) := by + refine Finset.sum_le_sum ?_ + intro i hi + simpa [r, K, mul_assoc, mul_left_comm, mul_comm] using + integral_upperTailIndicator_le_of_isBigOWith + (μ := μ) (Ψ := Ψ) (X := X i) (a := a i) (q := q) (C₀ := C₀) (t := t / 2) + hD hAdmissible hq (ha i hi) ht_half (hX i hi) (hXm i hi) + _ = (Finset.sum s (fun i => a i * (t / 2))) * K := by + rw [Finset.sum_mul] + _ = b * K := by + simp [b, Finset.sum_mul] + have hquot : + (Finset.sum s (fun i => ∫ ω, upperTailIndicator (X i) (r i) ω ∂μ) / b) ≤ K := by + calc + (Finset.sum s (fun i => ∫ ω, upperTailIndicator (X i) (r i) ω ∂μ) / b) + ≤ (b * K) / b := by + exact div_le_div_of_nonneg_right hsum_bound hb.le + _ = K := by + field_simp [hb.ne'] + exact hmain.trans hquot + +/-- The symmetric Step 5 estimate used for the weak-Orlicz triangle +inequality: control the absolute tail of a finite sum from `IsBigO` data on +the summands. -/ +theorem measureReal_absTailEvent_finset_sum_le_of_isBigO + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {q C₀ t : ℝ} + [IsFiniteMeasure μ] + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) + (hs : s.Nonempty) (ht : 2 ≤ t) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + μ.real (absTailEvent (fun ω => Finset.sum s (fun i => X i ω)) ((Finset.sum s a) * t)) ≤ + (1 + C₀ / (q - 1)) * (Ψ (t / 2))⁻¹ := by + have hsubset : + absTailEvent (fun ω => Finset.sum s (fun i => X i ω)) ((Finset.sum s a) * t) ⊆ + upperTailEvent (fun ω => Finset.sum s (fun i => |X i ω|)) ((Finset.sum s a) * t) := + absTailEvent_finset_sum_subset_upperTailEvent_sum_abs (Ω := Ω) (ι := ι) (s := s) + refine (measureReal_mono hsubset).trans ?_ + simpa [IsBigO] using + measureReal_upperTailEvent_finset_sum_le_of_isBigOWith + (μ := μ) (s := s) (X := fun i ω => |X i ω|) (a := a) + (Ψ := Ψ) (q := q) (C₀ := C₀) (t := t) + hD hAdmissible hq hs ht ha hX + (fun i hi => by + simpa [Real.norm_eq_abs] using (hXm i hi).norm) + +/-- The explicit Chapter 4 dilation constant produced by the abstract +doubling-based triangle inequality. -/ +def psiTriangleConst (q C₀ : ℝ) : ℝ := + 2 * (C₀ * (1 + C₀ / (q - 1))) ^ (1 / q) + +theorem psiTriangleConst_two_le_four_mul {C : ℝ} (hC : 1 ≤ C) : + psiTriangleConst 2 C ≤ 4 * C := by + have hC_nonneg : 0 ≤ C := le_trans zero_le_one hC + have hinner_nonneg : 0 ≤ C * (1 + C) := by positivity + have hinner : + C * (1 + C) ≤ (2 * C) ^ 2 := by + nlinarith + have hrpow_two : ((2 * C) ^ (2 : ℝ)) = (2 * C) ^ 2 := by + simp + calc + psiTriangleConst 2 C = 2 * (C * (1 + C)) ^ (1 / 2 : ℝ) := by + norm_num [psiTriangleConst] + _ ≤ 2 * ((2 * C) ^ (2 : ℝ)) ^ (1 / 2 : ℝ) := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + exact Real.rpow_le_rpow hinner_nonneg (by simpa [hrpow_two] using hinner) (by positivity) + _ = 2 * (2 * C) := by + rw [hrpow_two, ← Real.sqrt_eq_rpow, Real.sqrt_sq_eq_abs, abs_of_nonneg (by positivity)] + _ = 4 * C := by ring + +/-- A prefactor in front of an inverse `Ψ` tail can be absorbed into a +dilation witness `σ`, provided the abstract doubling estimate makes the factor +small enough. -/ +theorem prefactor_mul_inv_le_inv_of_hasPsiAbstractDoubling + {Ψ : ℝ → ℝ} {q C₀ B σ t : ℝ} + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (ht : 1 ≤ t) (hσ : 1 ≤ σ) + (hB_nonneg : 0 ≤ B) (hfac : B * (C₀ * σ ^ (-q)) ≤ 1) : + B * (Ψ (σ * t))⁻¹ ≤ (Ψ t)⁻¹ := by + have htail : + (Ψ (σ * t))⁻¹ ≤ C₀ * σ ^ (-q) * (Ψ t)⁻¹ := by + simpa [mul_assoc, mul_left_comm, mul_comm] using + hasPsiAbstractDoubling_inv_mul_le (hD := hD) (hAdmissible := hAdmissible) + (u := t) (v := σ) ht hσ + have hΨt_one : 1 ≤ Ψ t := hAdmissible.2 (le_trans zero_le_one ht) + have hΨt_inv_nonneg : 0 ≤ (Ψ t)⁻¹ := inv_nonneg.mpr (le_trans zero_le_one hΨt_one) + calc + B * (Ψ (σ * t))⁻¹ ≤ B * (C₀ * σ ^ (-q) * (Ψ t)⁻¹) := by + exact mul_le_mul_of_nonneg_left htail hB_nonneg + _ = (B * (C₀ * σ ^ (-q))) * (Ψ t)⁻¹ := by ring + _ ≤ 1 * (Ψ t)⁻¹ := by + exact mul_le_mul_of_nonneg_right hfac hΨt_inv_nonneg + _ = (Ψ t)⁻¹ := by ring + +/-- The finite-family weak-Orlicz triangle inequality with an explicit +dilation witness `σ`. The witness is carried as data rather than hidden inside +the scale, so later model-specific choices of `σ` can be formalized +independently. -/ +theorem isBigO_finset_sum_of_hasPsiAbstractDoubling + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {q C₀ σ : ℝ} + [IsFiniteMeasure μ] + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) + (hσ : 1 ≤ σ) + (hσ_small : (1 + C₀ / (q - 1)) * (C₀ * σ ^ (-q)) ≤ 1) : + IsBigO μ Ψ (fun ω => Finset.sum s (fun i => X i ω)) ((2 * σ) * Finset.sum s a) := by + intro t ht + have ht_pre : 2 ≤ 2 * σ * t := by + nlinarith + have hpre := + measureReal_absTailEvent_finset_sum_le_of_isBigO + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (q := q) (C₀ := C₀) (t := 2 * σ * t) + hD hAdmissible hq hs ht_pre ha hX hXm + have hthreshold : + (Finset.sum s a) * (2 * σ * t) = (((2 * σ) * Finset.sum s a) * t) := by + ring + have hhalf : (2 * σ * t) / 2 = σ * t := by + ring + rw [hthreshold, hhalf] at hpre + have hB_nonneg : 0 ≤ 1 + C₀ / (q - 1) := by + have hC₀_one : 1 ≤ C₀ := hasPsiAbstractDoubling_one_le_const hD hAdmissible + have hq_sub_pos : 0 < q - 1 := sub_pos.mpr hq + have hfrac_nonneg : 0 ≤ C₀ / (q - 1) := by + exact div_nonneg (le_trans zero_le_one hC₀_one) hq_sub_pos.le + nlinarith + have habsorb : + (1 + C₀ / (q - 1)) * (Ψ (σ * t))⁻¹ ≤ (Ψ t)⁻¹ := by + exact prefactor_mul_inv_le_inv_of_hasPsiAbstractDoubling + (hD := hD) (hAdmissible := hAdmissible) (q := q) (C₀ := C₀) + (B := 1 + C₀ / (q - 1)) (σ := σ) (t := t) ht hσ hB_nonneg hσ_small + exact hpre.trans habsorb + +/-- The first finished finite-family weak-Orlicz triangle theorem. The scale +constant is expressed explicitly in terms of the abstract doubling data, while +the witness-based theorem above remains available for later refinements. -/ +theorem isBigO_finset_sum_of_isBigO + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {q C₀ : ℝ} + [IsFiniteMeasure μ] + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ (fun ω => Finset.sum s (fun i => X i ω)) + (psiTriangleConst q C₀ * Finset.sum s a) := by + let B : ℝ := 1 + C₀ / (q - 1) + let σ : ℝ := (C₀ * B) ^ (1 / q) + have hq_ne : q ≠ 0 := by + linarith + have hC₀_one : 1 ≤ C₀ := hasPsiAbstractDoubling_one_le_const hD hAdmissible + have hq_sub_pos : 0 < q - 1 := sub_pos.mpr hq + have hfrac_nonneg : 0 ≤ C₀ / (q - 1) := by + exact div_nonneg (le_trans zero_le_one hC₀_one) hq_sub_pos.le + have hB_nonneg : 0 ≤ B := by + dsimp [B] + nlinarith + have hB_one : 1 ≤ B := by + dsimp [B] + nlinarith + have hA_nonneg : 0 ≤ C₀ * B := mul_nonneg (le_trans zero_le_one hC₀_one) hB_nonneg + have hA_one : 1 ≤ C₀ * B := by + exact one_le_mul_of_one_le_of_one_le hC₀_one hB_one + have hA_pos : 0 < C₀ * B := lt_of_lt_of_le zero_lt_one hA_one + have hσ : 1 ≤ σ := by + dsimp [σ] + exact Real.one_le_rpow hA_one (by positivity : 0 ≤ (1 / q : ℝ)) + have hσ_pos : 0 < σ := lt_of_lt_of_le zero_lt_one hσ + have hσ_pow : σ ^ q = C₀ * B := by + dsimp [σ] + rw [show (1 / q : ℝ) = q⁻¹ by field_simp [hq_ne]] + simpa using (Real.rpow_inv_rpow hA_nonneg hq_ne) + have hσ_small : B * (C₀ * σ ^ (-q)) ≤ 1 := by + have hσ_negq : σ ^ (-q) = (C₀ * B)⁻¹ := by + rw [Real.rpow_neg hσ_pos.le, hσ_pow] + calc + B * (C₀ * σ ^ (-q)) = B * (C₀ * (C₀ * B)⁻¹) := by rw [hσ_negq] + _ = 1 := by + field_simp [hA_pos.ne'] + _ ≤ 1 := by rfl + have hmain := + isBigO_finset_sum_of_hasPsiAbstractDoubling + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (q := q) (C₀ := C₀) (σ := σ) + hD hAdmissible hq hs ha hX hXm hσ hσ_small + simpa [psiTriangleConst, B, σ, mul_assoc, mul_left_comm, mul_comm] using hmain + +/-- Growth-hypothesis specialization of the finite-family weak-Orlicz triangle +inequality, using the abstract doubling constant already derived in +`PsiCalculus.lean`. -/ +theorem isBigO_finset_sum_of_isBigO_growth + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {K : ℝ} + [IsFiniteMeasure μ] + (hK : 2 ≤ K) (hGrowth : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ (fun ω => Finset.sum s (fun i => X i ω)) + (psiTriangleConst 2 (K ^ (12 : ℝ)) * Finset.sum s a) := by + have hD : HasPsiAbstractDoubling Ψ 2 (K ^ (12 : ℝ)) := by + simpa using admissiblePsi_hasPsiAbstractDoubling_two + (K := K) hK hGrowth hAdmissible + simpa using + isBigO_finset_sum_of_isBigO + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (q := (2 : ℝ)) + (C₀ := K ^ (12 : ℝ)) hD hAdmissible (by norm_num) hs ha hX hXm + +/-- A note-facing simplification of the growth-based triangle theorem: +the explicit abstract constant is bounded by `4 K^12`. -/ +theorem isBigO_finset_sum_of_isBigO_growth_four_mul + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {K : ℝ} + [IsFiniteMeasure μ] + (hK : 2 ≤ K) (hGrowth : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ (fun ω => Finset.sum s (fun i => X i ω)) + ((4 * K ^ (12 : ℝ)) * Finset.sum s a) := by + have hmain := + isBigO_finset_sum_of_isBigO_growth + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (K := K) + hK hGrowth hAdmissible hs ha hX hXm + have hK_one : 1 ≤ K := le_trans one_le_two hK + have hKpow_one : 1 ≤ K ^ (12 : ℝ) := by + exact Real.one_le_rpow hK_one (by positivity : 0 ≤ (12 : ℝ)) + have hsuma_nonneg : 0 ≤ Finset.sum s a := by + exact Finset.sum_nonneg fun i hi => (ha i hi).le + refine IsBigO.mono_scale (μ := μ) (Ψ := Ψ) + (X := fun ω => Finset.sum s (fun i => X i ω)) + (A := psiTriangleConst 2 (K ^ (12 : ℝ)) * Finset.sum s a) + (B := (4 * K ^ (12 : ℝ)) * Finset.sum s a) hmain ?_ + exact mul_le_mul_of_nonneg_right (psiTriangleConst_two_le_four_mul hKpow_one) hsuma_nonneg + +/-- Average version of the finite-family weak-Orlicz triangle theorem. -/ +theorem isBigO_finsetAverage_of_isBigO + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {q C₀ : ℝ} + [IsFiniteMeasure μ] + (hD : HasPsiAbstractDoubling Ψ q C₀) + (hAdmissible : AdmissiblePsi Ψ) (hq : 1 < q) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiTriangleConst q C₀ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + have hsum := + isBigO_finset_sum_of_isBigO + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (q := q) (C₀ := C₀) + hD hAdmissible hq hs ha hX hXm + have hcard_inv_nonneg : 0 ≤ (s.card : ℝ)⁻¹ := by positivity + simpa [mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := Ψ) + (X := fun ω => Finset.sum s (fun i => X i ω)) + (A := psiTriangleConst q C₀ * Finset.sum s a) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + +/-- Note-facing average version of the growth-based triangle theorem with the +coarse constant simplified to `4 K^12`. -/ +theorem isBigO_finsetAverage_of_isBigO_growth_four_mul + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {Ψ : ℝ → ℝ} {K : ℝ} + [IsFiniteMeasure μ] + (hK : 2 ≤ K) (hGrowth : HasPsiGrowth Ψ K) + (hAdmissible : AdmissiblePsi Ψ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ Ψ (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ Ψ + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + ((4 * K ^ (12 : ℝ)) * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + have hsum := + isBigO_finset_sum_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := Ψ) (K := K) + hK hGrowth hAdmissible hs ha hX hXm + have hcard_inv_nonneg : 0 ≤ (s.card : ℝ)⁻¹ := by positivity + simpa [mul_assoc, mul_left_comm, mul_comm] using + IsBigO.const_mul (μ := μ) (Ψ := Ψ) + (X := fun ω => Finset.sum s (fun i => X i ω)) + (A := (4 * K ^ (12 : ℝ)) * Finset.sum s a) + (c := (s.card : ℝ)⁻¹) hcard_inv_nonneg hsum + +/-- The explicit stretched-exponential triangle constant obtained by feeding +the concrete `Γ_σ` growth witness into the general `O_Ψ` calculus. -/ +noncomputable def gammaTriangleConst (σ : ℝ) : ℝ := + 4 * gammaGrowthConst σ ^ (12 : ℝ) + +/-- Finite-family generalized triangle inequality specialized to the +stretched-exponential class `Γ_σ`. -/ +theorem isBigO_finset_sum_of_isBigO_gammaSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (gammaSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * Finset.sum s a) := by + have hK : 2 ≤ gammaGrowthConst σ := two_le_gammaGrowthConst σ + have hGrowth : HasPsiGrowth (gammaSigma σ) (gammaGrowthConst σ) := + hasPsiGrowth_gammaSigma hσ + have hAdmissible : AdmissiblePsi (gammaSigma σ) := + admissiblePsi_gammaSigma hσ.le + simpa [gammaTriangleConst, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finset_sum_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := gammaSigma σ) + (K := gammaGrowthConst σ) hK hGrowth hAdmissible hs ha hX hXm + +/-- Average version of the stretched-exponential generalized triangle +inequality. -/ +theorem isBigO_finsetAverage_of_isBigO_gammaSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 0 < σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (gammaSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (gammaSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (gammaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + have hK : 2 ≤ gammaGrowthConst σ := two_le_gammaGrowthConst σ + have hGrowth : HasPsiGrowth (gammaSigma σ) (gammaGrowthConst σ) := + hasPsiGrowth_gammaSigma hσ + have hAdmissible : AdmissiblePsi (gammaSigma σ) := + admissiblePsi_gammaSigma hσ.le + simpa [gammaTriangleConst, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finsetAverage_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := gammaSigma σ) + (K := gammaGrowthConst σ) hK hGrowth hAdmissible hs ha hX hXm + +/-- The explicit Chapter 4 triangle constant for the log-normal model class +`Ψ_σ`, obtained from the growth constant `K_{Ψ_σ} = 2 exp(2σ²)`. -/ +noncomputable def psiSigmaTriangleConst (σ : ℝ) : ℝ := + 4 * psiGrowthConst σ ^ (12 : ℝ) + +/-- Finite-family generalized triangle inequality specialized to the +log-normal class `Ψ_σ`. -/ +theorem isBigO_finset_sum_of_isBigO_psiSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) (fun ω => Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * Finset.sum s a) := by + have hK : 2 ≤ psiGrowthConst σ := two_le_psiGrowthConst σ + have hGrowth : HasPsiGrowth (psiSigma σ) (psiGrowthConst σ) := + hasPsiGrowth_psiSigma hσ + have hAdmissible : AdmissiblePsi (psiSigma σ) := + admissiblePsi_psiSigma (le_trans zero_le_one hσ) + simpa [psiSigmaTriangleConst, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finset_sum_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := psiSigma σ) + (K := psiGrowthConst σ) hK hGrowth hAdmissible hs ha hX hXm + +/-- Average version of the log-normal generalized triangle inequality. -/ +theorem isBigO_finsetAverage_of_isBigO_psiSigma + (s : Finset ι) {X : ι → Ω → ℝ} {a : ι → ℝ} {σ : ℝ} + [IsFiniteMeasure μ] + (hσ : 1 ≤ σ) + (hs : s.Nonempty) + (ha : ∀ i ∈ s, 0 < a i) + (hX : ∀ i ∈ s, IsBigO μ (psiSigma σ) (X i) (a i)) + (hXm : ∀ i ∈ s, Measurable (X i)) : + IsBigO μ (psiSigma σ) + (fun ω => ((s.card : ℝ)⁻¹) * Finset.sum s (fun i => X i ω)) + (psiSigmaTriangleConst σ * (((s.card : ℝ)⁻¹) * Finset.sum s a)) := by + have hK : 2 ≤ psiGrowthConst σ := two_le_psiGrowthConst σ + have hGrowth : HasPsiGrowth (psiSigma σ) (psiGrowthConst σ) := + hasPsiGrowth_psiSigma hσ + have hAdmissible : AdmissiblePsi (psiSigma σ) := + admissiblePsi_psiSigma (le_trans zero_le_one hσ) + simpa [psiSigmaTriangleConst, mul_assoc, mul_left_comm, mul_comm] using + isBigO_finsetAverage_of_isBigO_growth_four_mul + (μ := μ) (s := s) (X := X) (a := a) (Ψ := psiSigma σ) + (K := psiGrowthConst σ) hK hGrowth hAdmissible hs ha hX hXm + +end Measure + +end + +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/WeakOrlicz.lean b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/WeakOrlicz.lean new file mode 100644 index 0000000000..7083e2cc27 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/IndependentSums/WeakOrlicz.lean @@ -0,0 +1,279 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Log.Basic +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.MeasureTheory.Measure.ProbabilityMeasure +public import Mathlib.MeasureTheory.Measure.Real + +/-! # Weak Orlicz -/ + +@[expose] public section + +namespace Homogenization +namespace IndependentSums + +open MeasureTheory + +variable {Ω : Type*} + +/-! +Weak-Orlicz tail notation for the independent-sums probability mini-library. + +This file follows the Chapter 4 note-facing convention directly: + +- `X ≤ O_Ψ(A)` means `P[X > A t] ≤ Ψ(t)⁻¹` for every `t ≥ 1`; +- `X = O_Ψ(A)` means the same bound for `|X|`; +- `Γ_σ` and `Ψ_σ` are the stretched-exponential and log-normal model classes. + +The definitions are intentionally tail-based rather than Banach-space based: +the notes use a weak-tail calculus, and this is the theorem surface needed for +the later concentration arguments. +-/ + +/-- The upper-tail event `{X > a}`. -/ +def upperTailEvent (X : Ω → ℝ) (a : ℝ) : Set Ω := + {ω | a < X ω} + +/-- The absolute upper-tail event `{|X| > a}`. -/ +def absTailEvent (X : Ω → ℝ) (a : ℝ) : Set Ω := + upperTailEvent (fun ω => |X ω|) a + +@[simp] theorem mem_upperTailEvent {X : Ω → ℝ} {a : ℝ} {ω : Ω} : + ω ∈ upperTailEvent X a ↔ a < X ω := + Iff.rfl + +@[simp] theorem mem_absTailEvent {X : Ω → ℝ} {a : ℝ} {ω : Ω} : + ω ∈ absTailEvent X a ↔ a < |X ω| := + Iff.rfl + +theorem upperTailEvent_mono_right {X : Ω → ℝ} {a b : ℝ} (hab : a ≤ b) : + upperTailEvent X b ⊆ upperTailEvent X a := by + intro ω hω + show a < X ω + exact lt_of_le_of_lt hab hω + +theorem absTailEvent_mono_right {X : Ω → ℝ} {a b : ℝ} (hab : a ≤ b) : + absTailEvent X b ⊆ absTailEvent X a := + upperTailEvent_mono_right (X := fun ω => |X ω|) hab + +variable [MeasurableSpace Ω] + +/-- The weak-Orlicz upper-tail relation `X ≤ O_Ψ(A)` from the notes. -/ +def IsBigOWith (μ : Measure Ω) (Ψ : ℝ → ℝ) (X : Ω → ℝ) (A : ℝ) : Prop := + ∀ ⦃t : ℝ⦄, 1 ≤ t → μ.real (upperTailEvent X (A * t)) ≤ (Ψ t)⁻¹ + +/-- The symmetric weak-Orlicz relation `X = O_Ψ(A)`, defined through `|X|`. -/ +def IsBigO (μ : Measure Ω) (Ψ : ℝ → ℝ) (X : Ω → ℝ) (A : ℝ) : Prop := + IsBigOWith μ Ψ (fun ω => |X ω|) A + +/-- The baseline regularity package for a weak-Orlicz tail function: +monotonicity on `[0, ∞)` and the lower bound `Ψ ≥ 1` there. -/ +def AdmissiblePsi (Ψ : ℝ → ℝ) : Prop := + MonotoneOn Ψ (Set.Ici 0) ∧ ∀ ⦃t : ℝ⦄, 0 ≤ t → 1 ≤ Ψ t + +theorem IsBigOWith.of_le {μ : Measure Ω} [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} + {X Y : Ω → ℝ} {A : ℝ} + (hX : IsBigOWith μ Ψ X A) (hYX : ∀ ω, Y ω ≤ X ω) : + IsBigOWith μ Ψ Y A := by + intro t ht + refine (measureReal_mono ?_).trans (hX ht) + intro ω hω + exact lt_of_lt_of_le hω (hYX ω) + +theorem IsBigO.of_abs_le {μ : Measure Ω} [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} + {X Y : Ω → ℝ} {A : ℝ} + (hX : IsBigO μ Ψ X A) (hYX : ∀ ω, |Y ω| ≤ |X ω|) : + IsBigO μ Ψ Y A := + hX.of_le hYX + +theorem IsBigOWith.mono_scale {μ : Measure Ω} [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} + {X : Ω → ℝ} {A B : ℝ} + (hX : IsBigOWith μ Ψ X A) (hAB : A ≤ B) : + IsBigOWith μ Ψ X B := by + intro t ht + have ht0 : 0 ≤ t := le_trans zero_le_one ht + refine (measureReal_mono ?_).trans (hX ht) + exact upperTailEvent_mono_right (mul_le_mul_of_nonneg_right hAB ht0) + +theorem IsBigO.mono_scale {μ : Measure Ω} [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} + {X : Ω → ℝ} {A B : ℝ} + (hX : IsBigO μ Ψ X A) (hAB : A ≤ B) : + IsBigO μ Ψ X B := by + exact IsBigOWith.mono_scale (μ := μ) (Ψ := Ψ) (X := fun ω => |X ω|) + (A := A) (B := B) hX hAB + +theorem IsBigOWith.const_mul {μ : Measure Ω} {Ψ : ℝ → ℝ} + {X : Ω → ℝ} {A c : ℝ} (hc : 0 ≤ c) + (hX : IsBigOWith μ Ψ X A) : + IsBigOWith μ Ψ (fun ω => c * X ω) (c * A) := by + by_cases hc0 : c = 0 + · intro t ht + have hrhs_nonneg : 0 ≤ (Ψ t)⁻¹ := by + have hμ_nonneg : 0 ≤ μ.real (upperTailEvent X (A * t)) := by positivity + exact le_trans hμ_nonneg (hX ht) + simpa [upperTailEvent, hc0] using hrhs_nonneg + · have hc_pos : 0 < c := lt_of_le_of_ne hc (Ne.symm hc0) + intro t ht + have hset : + upperTailEvent (fun ω => c * X ω) ((c * A) * t) = upperTailEvent X (A * t) := by + ext ω + constructor + · intro hω + change ((c * A) * t) < c * X ω at hω + have hω' : c * (A * t) < c * X ω := by + simpa [mul_assoc] using hω + exact lt_of_mul_lt_mul_left hω' hc + · intro hω + change ((c * A) * t) < c * X ω + have hmul : c * (A * t) < c * X ω := by + exact mul_lt_mul_of_pos_left hω hc_pos + simpa [mul_assoc] using hmul + rw [hset] + exact hX ht + +theorem IsBigO.const_mul {μ : Measure Ω} {Ψ : ℝ → ℝ} + {X : Ω → ℝ} {A c : ℝ} (hc : 0 ≤ c) + (hX : IsBigO μ Ψ X A) : + IsBigO μ Ψ (fun ω => c * X ω) (c * A) := by + simpa [IsBigO, abs_mul, abs_of_nonneg hc] using + IsBigOWith.const_mul (μ := μ) (Ψ := Ψ) (X := fun ω => |X ω|) (A := A) (c := c) hc hX + +theorem IsBigO.neg {μ : Measure Ω} [IsFiniteMeasure μ] {Ψ : ℝ → ℝ} {X : Ω → ℝ} + {A : ℝ} + (hX : IsBigO μ Ψ X A) : + IsBigO μ Ψ (fun ω => -X ω) A := by + exact hX.of_abs_le fun ω => by simp + +/-- The stretched-exponential model tail function `Γ_σ(t) = exp(t^σ)`. -/ +noncomputable def gammaSigma (σ : ℝ) : ℝ → ℝ := + fun t => Real.exp (t ^ σ) + +/-- The log-normal model tail function +`Ψ_σ(t) = exp((σ⁻¹)^2 log(1 + σ t)^2)`. -/ +noncomputable def psiSigma (σ : ℝ) : ℝ → ℝ := + fun t => Real.exp ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ)) + +@[simp] theorem gammaSigma_apply (σ t : ℝ) : + gammaSigma σ t = Real.exp (t ^ σ) := + rfl + +@[simp] theorem psiSigma_apply (σ t : ℝ) : + psiSigma σ t = Real.exp ((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ)) := + rfl + +@[simp] theorem gammaSigma_inv (σ t : ℝ) : + (gammaSigma σ t)⁻¹ = Real.exp (-(t ^ σ)) := by + simp [gammaSigma, Real.exp_neg] + +@[simp] theorem psiSigma_inv (σ t : ℝ) : + (psiSigma σ t)⁻¹ = + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + simp [psiSigma, Real.exp_neg] + +theorem one_le_gammaSigma {σ t : ℝ} (ht : 0 ≤ t) : + 1 ≤ gammaSigma σ t := by + have hpow : 0 ≤ t ^ σ := Real.rpow_nonneg ht σ + simpa [gammaSigma] using (Real.exp_le_exp).2 hpow + +theorem one_le_psiSigma {σ t : ℝ} : + 1 ≤ psiSigma σ t := by + have hexp : 0 ≤ (σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ) := by + exact mul_nonneg (inv_nonneg.mpr (sq_nonneg σ)) (sq_nonneg _) + simpa [psiSigma] using (Real.exp_le_exp).2 hexp + +theorem gammaSigma_monotoneOn {σ : ℝ} (hσ : 0 ≤ σ) : + MonotoneOn (gammaSigma σ) (Set.Ici 0) := by + intro x hx y hy hxy + exact (Real.exp_le_exp).2 (Real.rpow_le_rpow hx hxy hσ) + +theorem admissiblePsi_gammaSigma {σ : ℝ} (hσ : 0 ≤ σ) : + AdmissiblePsi (gammaSigma σ) := by + refine ⟨gammaSigma_monotoneOn hσ, ?_⟩ + intro t ht + exact one_le_gammaSigma ht + +theorem psiSigma_monotoneOn {σ : ℝ} (hσ : 0 ≤ σ) : + MonotoneOn (psiSigma σ) (Set.Ici 0) := by + intro x hx y hy hxy + have hargx_pos : 0 < 1 + σ * x := by + have hσx_nonneg : 0 ≤ σ * x := mul_nonneg hσ hx + linarith + have hargy_pos : 0 < 1 + σ * y := by + have hσy_nonneg : 0 ≤ σ * y := mul_nonneg hσ hy + linarith + have hargx_one : 1 ≤ 1 + σ * x := by + have hσx_nonneg : 0 ≤ σ * x := mul_nonneg hσ hx + linarith + have hargy_one : 1 ≤ 1 + σ * y := by + have hσy_nonneg : 0 ≤ σ * y := mul_nonneg hσ hy + linarith + have hargxy : 1 + σ * x ≤ 1 + σ * y := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_left (mul_le_mul_of_nonneg_left hxy hσ) 1 + have hlog_le : + Real.log (1 + σ * x) ≤ Real.log (1 + σ * y) := by + exact Real.log_le_log hargx_pos hargxy + have hlogx_nonneg : 0 ≤ Real.log (1 + σ * x) := Real.log_nonneg hargx_one + have hlogy_nonneg : 0 ≤ Real.log (1 + σ * y) := Real.log_nonneg hargy_one + have hlog_sq : + (Real.log (1 + σ * x)) ^ (2 : ℕ) ≤ (Real.log (1 + σ * y)) ^ (2 : ℕ) := by + nlinarith + exact (Real.exp_le_exp).2 <| + mul_le_mul_of_nonneg_left hlog_sq (inv_nonneg.mpr (sq_nonneg σ)) + +theorem admissiblePsi_psiSigma {σ : ℝ} (hσ : 0 ≤ σ) : + AdmissiblePsi (psiSigma σ) := by + refine ⟨psiSigma_monotoneOn hσ, ?_⟩ + intro t ht + exact one_le_psiSigma + +theorem isBigOWith_gammaSigma_iff {μ : Measure Ω} {X : Ω → ℝ} {A σ : ℝ} : + IsBigOWith μ (gammaSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (upperTailEvent X (A * t)) ≤ Real.exp (-(t ^ σ)) := by + constructor + · intro h t ht + simpa [gammaSigma, ← Real.exp_neg] using h ht + · intro h t ht + simpa [gammaSigma, ← Real.exp_neg] using h ht + +theorem isBigO_gammaSigma_iff {μ : Measure Ω} {X : Ω → ℝ} {A σ : ℝ} : + IsBigO μ (gammaSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (absTailEvent X (A * t)) ≤ Real.exp (-(t ^ σ)) := by + constructor + · intro h t ht + simpa [IsBigO, IsBigOWith, absTailEvent, gammaSigma, ← Real.exp_neg] using h ht + · intro h t ht + simpa [IsBigO, IsBigOWith, absTailEvent, gammaSigma, ← Real.exp_neg] using h ht + +theorem isBigOWith_psiSigma_iff {μ : Measure Ω} {X : Ω → ℝ} {A σ : ℝ} : + IsBigOWith μ (psiSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (upperTailEvent X (A * t)) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + constructor + · intro h t ht + simpa [psiSigma, ← Real.exp_neg] using h ht + · intro h t ht + simpa [psiSigma, ← Real.exp_neg] using h ht + +theorem isBigO_psiSigma_iff {μ : Measure Ω} {X : Ω → ℝ} {A σ : ℝ} : + IsBigO μ (psiSigma σ) X A ↔ + ∀ ⦃t : ℝ⦄, 1 ≤ t → + μ.real (absTailEvent X (A * t)) ≤ + Real.exp (-((σ ^ (2 : ℕ))⁻¹ * (Real.log (1 + σ * t)) ^ (2 : ℕ))) := by + constructor + · intro h t ht + simpa [IsBigO, IsBigOWith, absTailEvent, psiSigma, ← Real.exp_neg] using h ht + · intro h t ht + simpa [IsBigO, IsBigOWith, absTailEvent, psiSigma, ← Real.exp_neg] using h ht + +end IndependentSums +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices.lean b/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices.lean new file mode 100644 index 0000000000..45ff2feca8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices.lean @@ -0,0 +1,1286 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundaryLayer +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.SeparableHilbertMeasurability +public import Mathlib.MeasureTheory.Function.LpSpace.Complete +public import Mathlib.MeasureTheory.MeasurableSpace.Constructions +public import Mathlib.MeasureTheory.Measure.SeparableMeasure + +/-! # Local Ellipticity Slices -/ + +@[expose] public section + +namespace Homogenization + +/-- The `k`-th countable quantitative ellipticity slice on a fixed spatial set. + +This is the countable surface used by the probability layer after a qualitative +locally uniformly elliptic field has been restricted to a bounded observation +domain. -/ +def QuantitativeEllipticSlice {d : ℕ} (U : Set (Vec d)) (k : ℕ) + (a : CoeffField d) : Prop := + IsEllipticFieldOn ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) U a + +/-- Essential/a.e. ellipticity on a deterministic observation set. + +This is the probability-facing version of `IsEllipticFieldOn`: the restricted +coefficient field is measurable, but ellipticity is required only +`volumeMeasureOn U`-almost everywhere. This is the legacy essential variant +used by constructions that identify coefficient fields up to spatial a.e. +agreement. -/ +def IsEssentiallyEllipticFieldOn {d : ℕ} (lam Lam : ℝ) (U : Set (Vec d)) + (a : CoeffField d) : Prop := + by + classical + exact + MeasurableSet U ∧ + Measurable (fun x i j => if x ∈ U then a x i j else 0) ∧ + ∀ᵐ x ∂ volumeMeasureOn U, IsEllipticMatrix lam Lam (a x) + +/-- +Spatial a.e. ellipticity on a deterministic observation set, with only an +a.e.-strongly-measurable coefficient representative. + +This is the boundary-stable variant needed by Ch. 5: unlike +`IsEssentiallyEllipticFieldOn`, it is insensitive to changing the coefficient +field on a null boundary layer. +-/ +def IsAEEllipticFieldOn {d : ℕ} (lam Lam : ℝ) (U : Set (Vec d)) + (a : CoeffField d) : Prop := + MeasurableSet U ∧ + (∀ i j : Fin d, + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField U a x i j) (volumeMeasureOn U)) ∧ + ∀ᵐ x ∂ volumeMeasureOn U, IsEllipticMatrix lam Lam (a x) + +/-- The `k`-th essential quantitative ellipticity slice. Unlike +`QuantitativeEllipticSlice`, this records the quantitative ellipticity bounds +only a.e. on `U`, matching the probability sigma lane generated by local +integral tests. -/ +def EssentialQuantitativeEllipticSlice {d : ℕ} (U : Set (Vec d)) (k : ℕ) + (a : CoeffField d) : Prop := + IsEssentiallyEllipticFieldOn ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) U a + +/-- The `k`-th quantitative slice for the boundary-stable spatial-a.e. +ellipticity predicate. This is the countable version of +`IsAEEllipticFieldOn`, intended for law-relative Chapter 4/5 plumbing where +only a.e.-strong measurability is available. -/ +def AEEQuantitativeEllipticSlice {d : ℕ} (U : Set (Vec d)) (k : ℕ) + (a : CoeffField d) : Prop := + IsAEEllipticFieldOn ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) U a + +namespace IsEllipticFieldOn + +/-- +Transport pointwise ellipticity of the translated coefficient field on `U` +back to pointwise ellipticity of the original coefficient field on the +translated set. The a.e. Ch5 law-data lane uses this only as a deterministic +translation step before weakening to `IsAEEllipticFieldOn`; it does not add any +quantitative ellipticity input beyond the original constants. +-/ +theorem translateSet_of_translateCoeffField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (z : Vec d) + (hEll : IsEllipticFieldOn lam Lam U (translateCoeffField z a)) : + IsEllipticFieldOn lam Lam (translateSet z U) a := by + classical + refine ⟨?_, ?_⟩ + · have hshift : Measurable fun x : Vec d => x - z := + (continuous_id.sub continuous_const).measurable + have hcomp : + Measurable + (((fun y : Vec d => fun i j => + if y ∈ U then (translateCoeffField z a) y i j else 0) ∘ + fun x : Vec d => x - z)) := + hEll.1.comp hshift + have hEq : + (((fun y : Vec d => fun i j => + if y ∈ U then (translateCoeffField z a) y i j else 0) ∘ + fun x : Vec d => x - z)) = + (fun x i j => if x ∈ translateSet z U then a x i j else 0) := by + funext x i j + dsimp [translateCoeffField] + have hmem : x ∈ translateSet z U ↔ x - z ∈ U := + mem_translateSet_iff_sub_mem + by_cases hxU : x - z ∈ U + · have hxT : x ∈ translateSet z U := hmem.mpr hxU + simp [hxU, hxT] + · have hxT : x ∉ translateSet z U := fun hx => hxU (hmem.mp hx) + simp [hxU, hxT] + rw [hEq] at hcomp + exact hcomp + · intro x hx + have hxU : x - z ∈ U := mem_translateSet_iff_sub_mem.mp hx + have hmat := hEll.2 (x - z) hxU + have hsub_add : x - z + z = x := by + ext k + simp [sub_eq_add_neg, add_assoc] + simpa [translateCoeffField, hsub_add] using hmat + +end IsEllipticFieldOn + +namespace IsEssentiallyEllipticFieldOn + +theorem measurableSet {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (h : IsEssentiallyEllipticFieldOn lam Lam U a) : + MeasurableSet U := + h.1 + +theorem ae_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsEssentiallyEllipticFieldOn lam Lam U a) : + ∀ᵐ x ∂ volumeMeasureOn U, IsEllipticMatrix lam Lam (a x) := + h.2.2 + +theorem of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsEllipticFieldOn lam Lam U a) : + IsEssentiallyEllipticFieldOn lam Lam U a := by + have hU : MeasurableSet U := measurableSet_of_isEllipticFieldOn h + refine ⟨hU, h.1, ?_⟩ + exact (MeasureTheory.ae_restrict_iff' hU).2 + (Filter.Eventually.of_forall fun x hx => h.2 x hx) + +theorem mono_constants {d : ℕ} {lam Lam lam' Lam' : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsEssentiallyEllipticFieldOn lam Lam U a) + (hlam'_pos : 0 < lam') (hlam'_le : lam' ≤ lam) (hLam_le : Lam ≤ Lam') : + IsEssentiallyEllipticFieldOn lam' Lam' U a := by + refine ⟨h.measurableSet, h.2.1, ?_⟩ + exact h.ae_isEllipticMatrix.mono fun _x hx => + hx.mono hlam'_pos hlam'_le hLam_le + +end IsEssentiallyEllipticFieldOn + +namespace IsAEEllipticFieldOn + +theorem measurableSet {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} {a : CoeffField d} + (h : IsAEEllipticFieldOn lam Lam U a) : + MeasurableSet U := + h.1 + +theorem aestronglyMeasurable_restrictCoeffField_apply {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} + (h : IsAEEllipticFieldOn lam Lam U a) (i j : Fin d) : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField U a x i j) (volumeMeasureOn U) := + h.2.1 i j + +theorem ae_isEllipticMatrix {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsAEEllipticFieldOn lam Lam U a) : + ∀ᵐ x ∂ volumeMeasureOn U, IsEllipticMatrix lam Lam (a x) := + h.2.2 + +theorem of_isEssentiallyEllipticFieldOn {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsEssentiallyEllipticFieldOn lam Lam U a) : + IsAEEllipticFieldOn lam Lam U a := by + classical + have hmeas : + ∀ i j : Fin d, + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField U a x i j) (volumeMeasureOn U) := by + intro i j + have hcoord : + Measurable fun x : Vec d => if x ∈ U then a x i j else 0 := by + simpa using (measurable_pi_iff.mp (measurable_pi_iff.mp h.2.1 i) j) + have hcoord' : + Measurable fun x : Vec d => restrictCoeffField U a x i j := by + convert hcoord using 1 + funext x + by_cases hx : x ∈ U <;> simp [restrictCoeffField, hx] + exact hcoord'.aestronglyMeasurable + exact ⟨h.1, hmeas, h.2.2⟩ + +theorem of_isEllipticFieldOn {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsEllipticFieldOn lam Lam U a) : + IsAEEllipticFieldOn lam Lam U a := + of_isEssentiallyEllipticFieldOn + (IsEssentiallyEllipticFieldOn.of_isEllipticFieldOn h) + +theorem mono_constants {d : ℕ} {lam Lam lam' Lam' : ℝ} {U : Set (Vec d)} + {a : CoeffField d} (h : IsAEEllipticFieldOn lam Lam U a) + (hlam'_pos : 0 < lam') (hlam'_le : lam' ≤ lam) (hLam_le : Lam ≤ Lam') : + IsAEEllipticFieldOn lam' Lam' U a := by + refine ⟨h.measurableSet, h.2.1, ?_⟩ + exact h.ae_isEllipticMatrix.mono fun _x hx => + hx.mono hlam'_pos hlam'_le hLam_le + +theorem mono {d : ℕ} {lam Lam : ℝ} {U V : Set (Vec d)} {a : CoeffField d} + (h : IsAEEllipticFieldOn lam Lam U a) (hV : MeasurableSet V) (hVU : V ⊆ U) : + IsAEEllipticFieldOn lam Lam V a := by + classical + refine ⟨hV, ?_, ?_⟩ + · intro i j + have hsub : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField U a x i j) (volumeMeasureOn V) := by + simpa [volumeMeasureOn] using + (h.aestronglyMeasurable_restrictCoeffField_apply i j).mono_set hVU + refine hsub.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hV] with x hxV + have hxU : x ∈ U := hVU hxV + simp [restrictCoeffField, hxV, hxU] + · exact + Filter.Eventually.filter_mono + (MeasureTheory.ae_mono + (by simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_mono hVU le_rfl)) + h.ae_isEllipticMatrix + +/-- Finite unions preserve spatial a.e. ellipticity when the same quantitative +constants work on every member of the finite family. -/ +theorem biUnion_finset {d : ℕ} {ι : Type*} {lam Lam : ℝ} + (s : Finset ι) {U : ι → Set (Vec d)} {a : CoeffField d} + (h : ∀ i ∈ s, IsAEEllipticFieldOn lam Lam (U i) a) : + IsAEEllipticFieldOn lam Lam (⋃ i ∈ s, U i) a := by + classical + let V : Set (Vec d) := ⋃ i ∈ s, U i + have hVmeas : MeasurableSet V := by + dsimp [V] + exact Finset.measurableSet_biUnion s fun i hi => (h i hi).measurableSet + refine ⟨hVmeas, ?_, ?_⟩ + · intro p q + change MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField V a x p q) (MeasureTheory.volume.restrict V) + have hEach : + ∀ i : {i // i ∈ s}, + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField V a x p q) + (MeasureTheory.volume.restrict (U i.1)) := by + intro i + have hAEM : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField (U i.1) a x p q) + (MeasureTheory.volume.restrict (U i.1)) := by + simpa [volumeMeasureOn] using + (h i.1 i.2).aestronglyMeasurable_restrictCoeffField_apply p q + refine hAEM.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem (h i.1 i.2).measurableSet] with x hx + have hxV : x ∈ V := by + exact Set.mem_iUnion.mpr ⟨i.1, Set.mem_iUnion.mpr ⟨i.2, hx⟩⟩ + simp [restrictCoeffField, hx, hxV] + have hUnion : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField V a x p q) + (MeasureTheory.volume.restrict (⋃ i : {i // i ∈ s}, U i.1)) := + MeasureTheory.AEStronglyMeasurable.iUnion hEach + have hSet : (⋃ i : {i // i ∈ s}, U i.1) = V := by + ext x + constructor + · intro hx + rcases Set.mem_iUnion.mp hx with ⟨i, hxU⟩ + exact Set.mem_iUnion.mpr ⟨i.1, Set.mem_iUnion.mpr ⟨i.2, hxU⟩⟩ + · intro hx + rcases Set.mem_iUnion.mp hx with ⟨i, hxi⟩ + rcases Set.mem_iUnion.mp hxi with ⟨hi, hxU⟩ + exact Set.mem_iUnion.mpr ⟨⟨i, hi⟩, hxU⟩ + simpa only [hSet] using hUnion + · change ∀ᵐ x ∂ MeasureTheory.volume.restrict V, + IsEllipticMatrix lam Lam (a x) + have hEach : + ∀ i ∈ s, + ∀ᵐ x ∂ MeasureTheory.volume.restrict (U i), + IsEllipticMatrix lam Lam (a x) := by + intro i hi + simpa [volumeMeasureOn] using (h i hi).ae_isEllipticMatrix + have hUnion := + (MeasureTheory.ae_restrict_biUnion_finset_iff + (μ := MeasureTheory.volume) U s + (fun x : Vec d => IsEllipticMatrix lam Lam (a x))).2 hEach + simpa [V] using hUnion + +/-- Finite unions preserve spatial a.e. ellipticity with explicit combined +constants: the lower constant is the finite infimum of the local lower +constants, and the upper constant is the finite supremum of the local upper +constants. -/ +theorem exists_biUnion_finset {d : ℕ} {ι : Type*} (s : Finset ι) + (hs : s.Nonempty) {U : ι → Set (Vec d)} {a : CoeffField d} + (h : ∀ i ∈ s, + ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ IsAEEllipticFieldOn lam Lam (U i) a) : + ∃ lam Lam : ℝ, + 0 < lam ∧ lam ≤ Lam ∧ + IsAEEllipticFieldOn lam Lam (⋃ i ∈ s, U i) a := by + classical + let t : Finset {i // i ∈ s} := s.attach + have ht : t.Nonempty := hs.attach + let lamOf : {i // i ∈ s} → ℝ := fun i => Classical.choose (h i.1 i.2) + let LamOf : {i // i ∈ s} → ℝ := fun i => + Classical.choose (Classical.choose_spec (h i.1 i.2)) + let lam : ℝ := t.inf' ht lamOf + let Lam : ℝ := t.sup' ht LamOf + have hdata : + ∀ i : {i // i ∈ s}, + 0 < lamOf i ∧ lamOf i ≤ LamOf i ∧ + IsAEEllipticFieldOn (lamOf i) (LamOf i) (U i.1) a := by + intro i + simpa [lamOf, LamOf] using + Classical.choose_spec (Classical.choose_spec (h i.1 i.2)) + have hlam_pos : 0 < lam := by + refine (Finset.lt_inf'_iff (s := t) (H := ht) (f := lamOf)).2 ?_ + intro i _hi + exact (hdata i).1 + have hlam_le_Lam : lam ≤ Lam := by + rcases ht with ⟨i, hi⟩ + exact + le_trans (Finset.inf'_le (s := t) (f := lamOf) hi) + (le_trans (hdata i).2.1 + (Finset.le_sup' (s := t) (f := LamOf) hi)) + refine ⟨lam, Lam, hlam_pos, hlam_le_Lam, ?_⟩ + refine biUnion_finset (lam := lam) (Lam := Lam) s ?_ + intro i hi + let I : {i // i ∈ s} := ⟨i, hi⟩ + have hI : I ∈ t := by + simp [t] + have hlam_le : lam ≤ lamOf I := + Finset.inf'_le (s := t) (f := lamOf) hI + have hLam_le : LamOf I ≤ Lam := + Finset.le_sup' (s := t) (f := LamOf) hI + simpa [I] using + (hdata I).2.2.mono_constants hlam_pos hlam_le hLam_le + +theorem translateSet_of_translateCoeffField {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (z : Vec d) + (h : IsAEEllipticFieldOn lam Lam U (translateCoeffField z a)) : + IsAEEllipticFieldOn lam Lam (translateSet z U) a := by + classical + have hUtrans : MeasurableSet (translateSet z U) := by + have hpre : + MeasurableSet ((fun x : Vec d => x - z) ⁻¹' U) := + h.measurableSet.preimage (continuous_id.sub continuous_const).measurable + simpa [preimage_subRight_eq_translateSet] using hpre + refine ⟨hUtrans, ?_, ?_⟩ + · intro i j + have hcomp : + MeasureTheory.AEStronglyMeasurable + ((fun y : Vec d => restrictCoeffField U (translateCoeffField z a) y i j) ∘ + fun x : Vec d => x - z) + (volumeMeasureOn (translateSet z U)) := + (h.aestronglyMeasurable_restrictCoeffField_apply i j).comp_measurePreserving + (measurePreserving_subRight_restrict_translateSet (d := d) z U) + refine hcomp.congr ?_ + filter_upwards with x + have hmem : x ∈ translateSet z U ↔ x - z ∈ U := + mem_translateSet_iff_sub_mem + have hsub_add : x - z + z = x := by + ext k + simp [sub_eq_add_neg, add_assoc] + by_cases hxU : x - z ∈ U + · have hxT : x ∈ translateSet z U := hmem.mpr hxU + simp [Function.comp, restrictCoeffField, translateCoeffField, hxU, hxT] + · have hxT : x ∉ translateSet z U := fun hx => hxU (hmem.mp hx) + simp [Function.comp, restrictCoeffField, hxU, hxT] + · have hmap : + MeasureTheory.Measure.map (fun x : Vec d => x - z) + (volumeMeasureOn (translateSet z U)) = + volumeMeasureOn U := by + simpa [volumeMeasureOn] using + (measurePreserving_subRight_restrict_translateSet (d := d) z U).map_eq + have haeMap : + ∀ᵐ y ∂MeasureTheory.Measure.map (fun x : Vec d => x - z) + (volumeMeasureOn (translateSet z U)), + IsEllipticMatrix lam Lam ((translateCoeffField z a) y) := by + simpa [hmap] using h.ae_isEllipticMatrix + have haeSub : + ∀ᵐ x ∂volumeMeasureOn (translateSet z U), + IsEllipticMatrix lam Lam ((translateCoeffField z a) (x - z)) := + MeasureTheory.ae_of_ae_map + ((Homeomorph.subRight z).measurable.aemeasurable) haeMap + filter_upwards [haeSub] with x hx + have hsub_add : x - z + z = x := by + ext k + simp [sub_eq_add_neg, add_assoc] + simpa [translateCoeffField, hsub_add] using hx + +theorem memVectorL2_matVecMul {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (h : IsAEEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul (a x) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => a x i j * f x j) ?_ + intro j _hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + have hcoeff_aesm : + MeasureTheory.AEStronglyMeasurable (fun x : Vec d => a x i j) + (volumeMeasureOn U) := by + refine (h.aestronglyMeasurable_restrictCoeffField_apply i j).congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem h.measurableSet] with x hx + simp [restrictCoeffField, hx] + have hterm_meas : + MeasureTheory.AEStronglyMeasurable (fun x => a x i j * f x j) + (volumeMeasureOn U) := + hcoeff_aesm.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, ‖a x i j * f x j‖ ≤ Lam * ‖f x j‖ := by + filter_upwards [h.ae_isEllipticMatrix] with x hxEll + have hcoeff_le : |a x i j| ≤ Lam := abs_apply_le_of_isEllipticMatrix hxEll i j + calc + ‖a x i j * f x j‖ = |a x i j| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ Lam * ‖f x j‖ := mul_le_mul_of_nonneg_right hcoeff_le (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +/-- Spatial a.e. ellipticity on the open core of a triadic cube extends to the +half-open cube, since the two restricted volume measures agree. -/ +theorem cubeSet_of_openCubeSet {d : ℕ} {lam Lam : ℝ} + {Q : TriadicCube d} {a : CoeffField d} + (h : IsAEEllipticFieldOn lam Lam (openCubeSet Q) a) : + IsAEEllipticFieldOn lam Lam (cubeSet Q) a := by + classical + have hMeasure : + volumeMeasureOn (cubeSet Q) = volumeMeasureOn (openCubeSet Q) := by + simpa [volumeMeasureOn] using volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + refine ⟨measurableSet_cubeSet Q, ?_, ?_⟩ + · intro i j + rw [hMeasure] + have hEq : + (fun x : Vec d => restrictCoeffField (openCubeSet Q) a x i j) =ᵐ[ + volumeMeasureOn (openCubeSet Q)] + (fun x : Vec d => restrictCoeffField (cubeSet Q) a x i j) := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + have hxCube : x ∈ cubeSet Q := openCubeSet_subset_cubeSet Q hx + simp [restrictCoeffField, hx, hxCube] + exact (h.aestronglyMeasurable_restrictCoeffField_apply i j).congr hEq + · rw [hMeasure] + exact h.ae_isEllipticMatrix + +theorem cubeSet_of_isEllipticFieldOn_openCubeSet {d : ℕ} {lam Lam : ℝ} + {Q : TriadicCube d} {a : CoeffField d} + (h : IsEllipticFieldOn lam Lam (openCubeSet Q) a) : + IsAEEllipticFieldOn lam Lam (cubeSet Q) a := by + classical + have hOpen : IsAEEllipticFieldOn lam Lam (openCubeSet Q) a := + of_isEllipticFieldOn h + have hMeasure : + volumeMeasureOn (cubeSet Q) = volumeMeasureOn (openCubeSet Q) := by + simpa [volumeMeasureOn] using volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + refine ⟨measurableSet_cubeSet Q, ?_, ?_⟩ + · intro i j + rw [hMeasure] + have hEq : + (fun x : Vec d => restrictCoeffField (openCubeSet Q) a x i j) =ᵐ[ + volumeMeasureOn (openCubeSet Q)] + (fun x : Vec d => restrictCoeffField (cubeSet Q) a x i j) := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + have hxCube : x ∈ cubeSet Q := openCubeSet_subset_cubeSet Q hx + simp [restrictCoeffField, hx, hxCube] + exact (hOpen.aestronglyMeasurable_restrictCoeffField_apply i j).congr hEq + · rw [hMeasure] + exact hOpen.ae_isEllipticMatrix + +theorem cubeSet_originCube_of_isEllipticFieldOn_openCubeSet_originCube {d : ℕ} + {lam Lam : ℝ} {n : ℤ} {a : CoeffField d} + (h : IsEllipticFieldOn lam Lam (openCubeSet (originCube d n)) a) : + IsAEEllipticFieldOn lam Lam (cubeSet (originCube d n)) a := + cubeSet_of_isEllipticFieldOn_openCubeSet h + +theorem of_localAgreementOn {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a b : CoeffField d} (hab : LocalAgreementOn U a b) + (h : IsAEEllipticFieldOn lam Lam U a) : + IsAEEllipticFieldOn lam Lam U b := by + refine ⟨h.1, ?_, ?_⟩ + · intro i j + have hfun : + (fun x : Vec d => restrictCoeffField U b x i j) = + fun x : Vec d => restrictCoeffField U a x i j := by + funext x + by_cases hx : x ∈ U + · simp [restrictCoeffField, hx, (hab x hx).symm] + · simp [restrictCoeffField, hx] + simpa [hfun] using h.2.1 i j + · filter_upwards [h.2.2, MeasureTheory.ae_restrict_mem h.1] with x hxEll hxU + simpa [hab x hxU] using hxEll + +theorem iff_of_localAgreementOn {d : ℕ} {lam Lam : ℝ} {U : Set (Vec d)} + {a b : CoeffField d} (hab : LocalAgreementOn U a b) : + IsAEEllipticFieldOn lam Lam U a ↔ IsAEEllipticFieldOn lam Lam U b := by + constructor + · exact of_localAgreementOn hab + · intro h + exact of_localAgreementOn (fun x hx => (hab x hx).symm) h + +theorem measurableSet_localSigma {d : ℕ} (lam Lam : ℝ) (U : Set (Vec d)) : + @MeasurableSet (CoeffField d) (PointwiseLocalSigma U) + {a : CoeffField d | IsAEEllipticFieldOn lam Lam U a} := + MeasurableSpace.measurableSet_generateFrom + (by + intro a b hab + exact iff_of_localAgreementOn (lam := lam) (Lam := Lam) hab) + +end IsAEEllipticFieldOn + +namespace QuantitativeEllipticSlice + +theorem mono {d : ℕ} {U V : Set (Vec d)} {k : ℕ} {a : CoeffField d} + (h : QuantitativeEllipticSlice U k a) (hV : MeasurableSet V) (hVU : V ⊆ U) : + QuantitativeEllipticSlice V k a := by + exact IsEllipticFieldOn.mono h hV hVU + +/-- A raw pointwise quantitative slice set can be `PointwiseLocalSigma U`-measurable only if +membership in that slice is invariant under pointwise changes outside `U`. +This records the exact compatibility condition imposed by the local +coefficient-field sigma algebra. -/ +theorem eqOn_saturated_of_measurableSet_localSigma {d : ℕ} {U : Set (Vec d)} + {k : ℕ} {a b : CoeffField d} + (hmeas : @MeasurableSet (CoeffField d) (PointwiseLocalSigma U) + {c : CoeffField d | QuantitativeEllipticSlice U k c}) + (h : ∀ x, x ∈ U → a x = b x) : + QuantitativeEllipticSlice U k a ↔ QuantitativeEllipticSlice U k b := by + simpa using + (mem_iff_of_measurableSet_localSigma_of_eqOn + (U := U) (s := {c : CoeffField d | QuantitativeEllipticSlice U k c}) + hmeas h) +/-- The subtype sigma algebra inherited from the local coefficient-field sigma +algebra. We keep this as an explicit definition, rather than an instance, so +theorem statements choose the local lane deliberately. -/ +def localMeasurableSpace {d : ℕ} (U : Set (Vec d)) (k : ℕ) : + MeasurableSpace {a : CoeffField d // QuantitativeEllipticSlice U k a} := + MeasurableSpace.comap Subtype.val (PointwiseLocalSigma U) + +theorem measurable_val_localMeasurableSpace {d : ℕ} {U : Set (Vec d)} {k : ℕ} : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (CoeffField d) (localMeasurableSpace U k) (PointwiseLocalSigma U) Subtype.val := + comap_measurable Subtype.val + +theorem memLp_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : QuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x i j => restrictCoeffField U a x i j) 2 (volumeMeasureOn U) := by + classical + rw [MeasureTheory.memLp_pi_iff] + intro i + rw [MeasureTheory.memLp_pi_iff] + intro j + have hmeas : + Measurable fun x : Vec d => restrictCoeffField U a x i j := by + convert (measurable_pi_iff.1 (measurable_pi_iff.1 h.1 i) j) using 1 + all_goals first + | rfl + | (funext x; by_cases hx : x ∈ U <;> simp [restrictCoeffField, hx]) + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖restrictCoeffField U a x i j‖ ≤ (k + 1 : ℝ) := by + filter_upwards with x + by_cases hx : x ∈ U + · simpa [restrictCoeffField, hx, Real.norm_eq_abs] using + abs_apply_le_of_isEllipticFieldOn h hx i j + · have hk_nonneg : 0 ≤ (k + 1 : ℝ) := by positivity + simp [restrictCoeffField, hx, hk_nonneg] + exact MeasureTheory.MemLp.of_bound hmeas.aestronglyMeasurable (k + 1 : ℝ) hbound + +noncomputable def toMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + MeasureTheory.Lp (Fin d → Fin d → ℝ) 2 (volumeMeasureOn U) := + a.2.memLp_restrictCoeffField.toLp (fun x i j => restrictCoeffField U a.1 x i j) + +theorem memLp_hilbertMatrix_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : QuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a x)) 2 (volumeMeasureOn U) := by + let T : Mat d →L[ℝ] HilbertMat d := + ((HilbertMat.continuousLinearEquivMat d).symm).toContinuousLinearMap + simpa [T] using! T.comp_memLp' h.memLp_restrictCoeffField + +noncomputable def toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) := + a.2.memLp_hilbertMatrix_restrictCoeffField.toLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x)) + +/-- Strong Borel measurability of the coefficient-field `L²` realization follows from a +countable probe family that both separates the Hilbert norm and has measurable scalar +coordinates on the local slice sigma algebra. -/ +theorem measurable_toHilbertMatrixL2_of_norm_eq_iSup_abs_inner {d : ℕ} {U : Set (Vec d)} + {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (hu : DenseRange u) + (hNormEq : ∀ f : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U), + ‖f‖ = ⨆ n : ℕ, |inner ℝ (u n) f|) + (hInner : ∀ n : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} ℝ + (localMeasurableSpace U k) (borel ℝ) + (fun a => inner ℝ (u n) (toHilbertMatrixL2 a))) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (localMeasurableSpace U k) (borel _) toHilbertMatrixL2 := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let : MeasurableSpace H := borel H + have : BorelSpace H := ⟨rfl⟩ + exact + @measurable_of_measurable_inner_denseRange_of_norm_eq_iSup_abs_inner + {a : CoeffField d // QuantitativeEllipticSlice U k a} H + (localMeasurableSpace U k) _ _ _ _ _ u hu + (F := toHilbertMatrixL2) hNormEq hInner + +/-- Strong Borel measurability of the coefficient-field `L²` realization follows from +measurable scalar coordinates against any dense probe sequence in the Hilbert `L²` target. This +is the non-circular endpoint used by the fixed-competitor measurability cleanup. -/ +theorem measurable_toHilbertMatrixL2_of_dense_inner {d : ℕ} {U : Set (Vec d)} + {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : ℕ → MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (hu : DenseRange u) + (hInner : ∀ n : ℕ, + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} ℝ + (localMeasurableSpace U k) (borel ℝ) + (fun a => inner ℝ (u n) (toHilbertMatrixL2 a))) : + @Measurable {a : CoeffField d // QuantitativeEllipticSlice U k a} + (MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) + (localMeasurableSpace U k) (borel _) toHilbertMatrixL2 := by + have : Fact ((2 : ENNReal) ≠ ⊤) := ⟨ENNReal.ofNat_ne_top⟩ + let H := MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) + let : MeasurableSpace H := borel H + have : BorelSpace H := ⟨rfl⟩ + exact + @measurable_of_measurable_inner_denseRange_polish + {a : CoeffField d // QuantitativeEllipticSlice U k a} H + (localMeasurableSpace U k) _ _ _ _ _ u hu + (F := toHilbertMatrixL2) hInner + +theorem coeFn_toMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + toMatrixL2 a =ᵐ[volumeMeasureOn U] fun x i j => restrictCoeffField U a.1 x i j := + MeasureTheory.MemLp.coeFn_toLp a.2.memLp_restrictCoeffField + +theorem coeFn_toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + toHilbertMatrixL2 a =ᵐ[volumeMeasureOn U] + fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x) := + MeasureTheory.MemLp.coeFn_toLp a.2.memLp_hilbertMatrix_restrictCoeffField + +noncomputable def matrixL2Entry {d : ℕ} {U : Set (Vec d)} (i j : Fin d) : + MeasureTheory.Lp (Fin d → Fin d → ℝ) 2 (volumeMeasureOn U) →L[ℝ] ScalarL2 U := by + let row : (Fin d → Fin d → ℝ) →L[ℝ] (Fin d → ℝ) := + ContinuousLinearMap.proj (R := ℝ) i + let entry : (Fin d → ℝ) →L[ℝ] ℝ := + ContinuousLinearMap.proj (R := ℝ) j + exact (entry.comp row).compLpL 2 (volumeMeasureOn U) + +noncomputable def hilbertMatrixL2Entry {d : ℕ} {U : Set (Vec d)} (i j : Fin d) : + MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) →L[ℝ] ScalarL2 U := + (HilbertMat.entryL i j).compLpL 2 (volumeMeasureOn U) + +theorem coeFn_matrixL2Entry_toMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + matrixL2Entry (U := U) i j (toMatrixL2 a) =ᵐ[volumeMeasureOn U] + fun x => restrictCoeffField U a.1 x i j := by + let row : (Fin d → Fin d → ℝ) →L[ℝ] (Fin d → ℝ) := + ContinuousLinearMap.proj (R := ℝ) i + let entry : (Fin d → ℝ) →L[ℝ] ℝ := + ContinuousLinearMap.proj (R := ℝ) j + have hcomp : + matrixL2Entry (U := U) i j (toMatrixL2 a) =ᵐ[volumeMeasureOn U] + fun x => (entry.comp row) (toMatrixL2 a x) := by + simpa [matrixL2Entry, row, entry] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := entry.comp row) + (f := toMatrixL2 a)) + filter_upwards [hcomp, coeFn_toMatrixL2 a] with x hcompx hcoeff + rw [hcompx, hcoeff] + simp [row, entry] + +theorem coeFn_hilbertMatrixL2Entry_toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} + {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (i j : Fin d) (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + hilbertMatrixL2Entry (U := U) i j (toHilbertMatrixL2 a) =ᵐ[volumeMeasureOn U] + fun x => restrictCoeffField U a.1 x i j := by + have hcomp : + hilbertMatrixL2Entry (U := U) i j (toHilbertMatrixL2 a) =ᵐ[volumeMeasureOn U] + fun x => HilbertMat.entryL i j (toHilbertMatrixL2 a x) := by + simpa [hilbertMatrixL2Entry] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := HilbertMat.entryL i j) + (f := toHilbertMatrixL2 a)) + filter_upwards [hcomp, coeFn_toHilbertMatrixL2 a] with x hcompx hcoeff + rw [hcompx, hcoeff] + simp + +theorem inner_toScalarL2_matrixL2Entry_toMatrixL2_eq_setIntegral {d : ℕ} + {U : Set (Vec d)} {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (i j : Fin d) + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + inner ℝ (toScalarL2 hw) (matrixL2Entry (U := U) i j (toMatrixL2 a)) = + ∫ x in U, w x * a.1 x i j ∂MeasureTheory.volume := by + rw [MeasureTheory.L2.inner_def] + trans ∫ x, w x * restrictCoeffField U a.1 x i j ∂volumeMeasureOn U + · refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [coeFn_toScalarL2 hw, + coeFn_matrixL2Entry_toMatrixL2 i j a] + with x hweight hcoeff + rw [hweight, hcoeff] + change restrictCoeffField U a.1 x i j * w x = w x * restrictCoeffField U a.1 x i j + ring + · unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_of_isEllipticFieldOn a.2)] with x hx + simp [restrictCoeffField, hx] + +theorem inner_toScalarL2_hilbertMatrixL2Entry_toHilbertMatrixL2_eq_setIntegral {d : ℕ} + {U : Set (Vec d)} {k : ℕ} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {w : Vec d → ℝ} (hw : MemScalarL2 U w) (i j : Fin d) + (a : {a : CoeffField d // QuantitativeEllipticSlice U k a}) : + inner ℝ (toScalarL2 hw) (hilbertMatrixL2Entry (U := U) i j (toHilbertMatrixL2 a)) = + ∫ x in U, w x * a.1 x i j ∂MeasureTheory.volume := by + rw [MeasureTheory.L2.inner_def] + trans ∫ x, w x * restrictCoeffField U a.1 x i j ∂volumeMeasureOn U + · refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [coeFn_toScalarL2 hw, + coeFn_hilbertMatrixL2Entry_toHilbertMatrixL2 i j a] + with x hweight hcoeff + rw [hweight, hcoeff] + change restrictCoeffField U a.1 x i j * w x = w x * restrictCoeffField U a.1 x i j + ring + · unfold volumeMeasureOn + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_of_isEllipticFieldOn a.2)] with x hx + simp [restrictCoeffField, hx] + +theorem memScalarL2_hilbertMatrix_entry_of_memLp {d : ℕ} {U : Set (Vec d)} + {g : Vec d → HilbertMat d} + (hg : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) (i j : Fin d) : + MemScalarL2 U (fun x => HilbertMat.entryL i j (g x)) := by + simpa [MemScalarL2, Function.comp_def] using + (HilbertMat.entryL i j).comp_memLp' hg + +theorem inner_toScalarL2_hilbertMatrixL2Entry_eq_integral {d : ℕ} + {U : Set (Vec d)} {w : Vec d → ℝ} (hw : MemScalarL2 U w) (i j : Fin d) + (A : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) : + inner ℝ (toScalarL2 hw) (hilbertMatrixL2Entry (U := U) i j A) = + ∫ x, w x * A x i j ∂volumeMeasureOn U := by + rw [MeasureTheory.L2.inner_def] + have hentry : + hilbertMatrixL2Entry (U := U) i j A =ᵐ[volumeMeasureOn U] + fun x => HilbertMat.entryL i j (A x) := by + simpa [hilbertMatrixL2Entry] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := HilbertMat.entryL i j) + (f := A)) + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toScalarL2 hw, hentry] with x hweight hentryx + rw [hweight, hentryx] + change A x i j * w x = w x * A x i j + ring + +theorem integrable_hilbertMatrix_entry_mul {d : ℕ} {U : Set (Vec d)} + {g : Vec d → HilbertMat d} (hg : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (A : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) (i j : Fin d) : + MeasureTheory.Integrable (fun x => g x i j * A x i j) (volumeMeasureOn U) := by + have hgij : MeasureTheory.MemLp (fun x => HilbertMat.entryL i j (g x)) 2 + (volumeMeasureOn U) := by + simpa [Function.comp_def] using (HilbertMat.entryL i j).comp_memLp' hg + have hAij : MeasureTheory.MemLp (fun x => HilbertMat.entryL i j (A x)) 2 + (volumeMeasureOn U) := by + simpa [Function.comp_def] using + (HilbertMat.entryL i j).comp_memLp' (MeasureTheory.Lp.memLp A) + simpa using! hgij.integrable_mul hAij + +theorem integrable_hilbertMatrix_entry_sum {d : ℕ} {U : Set (Vec d)} + {g : Vec d → HilbertMat d} (hg : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (A : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) (i : Fin d) : + MeasureTheory.Integrable (fun x => ∑ j : Fin d, g x i j * A x i j) + (volumeMeasureOn U) := by + exact MeasureTheory.integrable_finsetSum _ fun j _ => + integrable_hilbertMatrix_entry_mul hg A i j + +theorem inner_hilbertMatrixL2_eq_sum_entry_inner {d : ℕ} {U : Set (Vec d)} + {g : Vec d → HilbertMat d} + (hg : MeasureTheory.MemLp g 2 (volumeMeasureOn U)) + (A : MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U)) : + inner ℝ (hg.toLp g) A = + ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 (memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hg i j)) + (hilbertMatrixL2Entry (U := U) i j A) := by + rw [MeasureTheory.L2.inner_def] + trans ∫ x, inner ℝ (g x) (A x) ∂volumeMeasureOn U + · refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.MemLp.coeFn_toLp hg] with x hx + rw [hx] + calc + ∫ x, inner ℝ (g x) (A x) ∂volumeMeasureOn U + = ∫ x, ∑ i : Fin d, ∑ j : Fin d, g x i j * A x i j ∂volumeMeasureOn U := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [HilbertMat.inner_def] + _ = ∑ i : Fin d, ∫ x, ∑ j : Fin d, g x i j * A x i j ∂volumeMeasureOn U := by + rw [MeasureTheory.integral_finsetSum] + intro i _ + exact integrable_hilbertMatrix_entry_sum hg A i + _ = ∑ i : Fin d, ∑ j : Fin d, ∫ x, g x i j * A x i j ∂volumeMeasureOn U := by + congr with i + rw [MeasureTheory.integral_finsetSum] + intro j _ + exact integrable_hilbertMatrix_entry_mul hg A i j + _ = ∑ i : Fin d, ∑ j : Fin d, + inner ℝ (toScalarL2 (memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hg i j)) + (hilbertMatrixL2Entry (U := U) i j A) := by + congr with i + congr with j + exact (inner_toScalarL2_hilbertMatrixL2Entry_eq_integral + (memScalarL2_hilbertMatrix_entry_of_memLp (U := U) hg i j) i j A).symm + +/-- Any positive quantitative ellipticity constants can be relaxed to one of +the countable natural-number slices. -/ +theorem exists_of_isEllipticFieldOn {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {ε : ℝ} (hε_pos : 0 < ε) (hEll : IsEllipticFieldOn ε ε⁻¹ U a) : + ∃ k : ℕ, QuantitativeEllipticSlice U k a := by + obtain ⟨k, hk⟩ := exists_nat_gt ε⁻¹ + have hε_inv_le_k : ε⁻¹ ≤ (k : ℝ) := le_of_lt hk + have hk_le_succ : (k : ℝ) ≤ (k + 1 : ℝ) := by + exact_mod_cast Nat.le_succ k + have hε_inv_le_succ : ε⁻¹ ≤ (k + 1 : ℝ) := hε_inv_le_k.trans hk_le_succ + have hslice_lam_pos : 0 < ((k + 1 : ℝ)⁻¹) := by positivity + have hslice_lam_le : ((k + 1 : ℝ)⁻¹) ≤ ε := + inv_le_of_inv_le₀ hε_pos hε_inv_le_succ + exact ⟨k, hEll.mono_constants hslice_lam_pos hslice_lam_le hε_inv_le_succ⟩ + +end QuantitativeEllipticSlice + +namespace EssentialQuantitativeEllipticSlice + +theorem of_quantitative {d : ℕ} {U : Set (Vec d)} {k : ℕ} {a : CoeffField d} + (h : QuantitativeEllipticSlice U k a) : + EssentialQuantitativeEllipticSlice U k a := + IsEssentiallyEllipticFieldOn.of_isEllipticFieldOn h +/-- The subtype sigma algebra inherited from the local coefficient-field sigma +algebra, now for essential/a.e. quantitative slices. -/ +def localMeasurableSpace {d : ℕ} (U : Set (Vec d)) (k : ℕ) : + MeasurableSpace {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} := + MeasurableSpace.comap Subtype.val (PointwiseLocalSigma U) + +theorem measurable_val_localMeasurableSpace {d : ℕ} {U : Set (Vec d)} {k : ℕ} : + @Measurable {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a} + (CoeffField d) (localMeasurableSpace U k) (PointwiseLocalSigma U) Subtype.val := + comap_measurable Subtype.val + +theorem measurableSet {d : ℕ} {U : Set (Vec d)} {k : ℕ} {a : CoeffField d} + (h : EssentialQuantitativeEllipticSlice U k a) : + MeasurableSet U := + h.1 + +theorem ae_isEllipticMatrix {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} (h : EssentialQuantitativeEllipticSlice U k a) : + ∀ᵐ x ∂ volumeMeasureOn U, + IsEllipticMatrix ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) (a x) := + h.2.2 + +theorem memLp_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : EssentialQuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x i j => restrictCoeffField U a x i j) 2 (volumeMeasureOn U) := by + classical + rw [MeasureTheory.memLp_pi_iff] + intro i + rw [MeasureTheory.memLp_pi_iff] + intro j + have hmeas : + Measurable fun x : Vec d => restrictCoeffField U a x i j := by + convert (measurable_pi_iff.1 (measurable_pi_iff.1 h.2.1 i) j) + using 1 + funext x + by_cases hx : x ∈ U <;> simp [restrictCoeffField, hx] + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖restrictCoeffField U a x i j‖ ≤ (k + 1 : ℝ) := by + filter_upwards + [h.2.2, + MeasureTheory.ae_restrict_mem h.1] + with x hxEll hxU + simpa [restrictCoeffField, hxU, Real.norm_eq_abs] using + abs_apply_le_of_isEllipticMatrix hxEll i j + exact MeasureTheory.MemLp.of_bound hmeas.aestronglyMeasurable (k + 1 : ℝ) hbound + +theorem memLp_hilbertMatrix_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : EssentialQuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a x)) 2 (volumeMeasureOn U) := by + let T : Mat d →L[ℝ] HilbertMat d := + ((HilbertMat.continuousLinearEquivMat d).symm).toContinuousLinearMap + simpa [T] using! T.comp_memLp' h.memLp_restrictCoeffField + +noncomputable def toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a}) : + MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) := + a.2.memLp_hilbertMatrix_restrictCoeffField.toLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x)) + +theorem coeFn_toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // EssentialQuantitativeEllipticSlice U k a}) : + toHilbertMatrixL2 a =ᵐ[volumeMeasureOn U] + fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x) := + MeasureTheory.MemLp.coeFn_toLp a.2.memLp_hilbertMatrix_restrictCoeffField + +/-- Any positive essential ellipticity constants can be relaxed to one of the +countable essential natural-number slices. -/ +theorem exists_of_isEssentiallyEllipticFieldOn {d : ℕ} {U : Set (Vec d)} + {a : CoeffField d} {ε : ℝ} (hε_pos : 0 < ε) + (hEll : IsEssentiallyEllipticFieldOn ε ε⁻¹ U a) : + ∃ k : ℕ, EssentialQuantitativeEllipticSlice U k a := by + obtain ⟨k, hk⟩ := exists_nat_gt ε⁻¹ + have hε_inv_le_k : ε⁻¹ ≤ (k : ℝ) := le_of_lt hk + have hk_le_succ : (k : ℝ) ≤ (k + 1 : ℝ) := by + exact_mod_cast Nat.le_succ k + have hε_inv_le_succ : ε⁻¹ ≤ (k + 1 : ℝ) := hε_inv_le_k.trans hk_le_succ + have hslice_lam_pos : 0 < ((k + 1 : ℝ)⁻¹) := by positivity + have hslice_lam_le : ((k + 1 : ℝ)⁻¹) ≤ ε := + inv_le_of_inv_le₀ hε_pos hε_inv_le_succ + exact ⟨k, hEll.mono_constants hslice_lam_pos hslice_lam_le hε_inv_le_succ⟩ + +end EssentialQuantitativeEllipticSlice + +namespace AEEQuantitativeEllipticSlice +/-- The subtype sigma algebra inherited from the local coefficient-field sigma +algebra, for the boundary-stable AEE quantitative slices. -/ +def localMeasurableSpace {d : ℕ} (U : Set (Vec d)) (k : ℕ) : + MeasurableSpace {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} := + MeasurableSpace.comap Subtype.val (PointwiseLocalSigma U) + +theorem measurable_val_localMeasurableSpace {d : ℕ} {U : Set (Vec d)} {k : ℕ} : + @Measurable {a : CoeffField d // AEEQuantitativeEllipticSlice U k a} + (CoeffField d) (localMeasurableSpace U k) (PointwiseLocalSigma U) Subtype.val := + comap_measurable Subtype.val + +theorem measurableSet {d : ℕ} {U : Set (Vec d)} {k : ℕ} {a : CoeffField d} + (h : AEEQuantitativeEllipticSlice U k a) : + MeasurableSet U := + h.1 + +theorem aestronglyMeasurable_restrictCoeffField_apply {d : ℕ} {U : Set (Vec d)} + {k : ℕ} {a : CoeffField d} (h : AEEQuantitativeEllipticSlice U k a) + (i j : Fin d) : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => restrictCoeffField U a x i j) (volumeMeasureOn U) := + h.2.1 i j + +theorem ae_isEllipticMatrix {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} (h : AEEQuantitativeEllipticSlice U k a) : + ∀ᵐ x ∂ volumeMeasureOn U, + IsEllipticMatrix ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) (a x) := + h.2.2 + +theorem of_localAgreementOn {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a b : CoeffField d} (hab : LocalAgreementOn U a b) + (h : AEEQuantitativeEllipticSlice U k a) : + AEEQuantitativeEllipticSlice U k b := by + refine ⟨h.1, ?_, ?_⟩ + · intro i j + have hfun : + (fun x : Vec d => restrictCoeffField U b x i j) = + fun x : Vec d => restrictCoeffField U a x i j := by + funext x + by_cases hx : x ∈ U + · simp [restrictCoeffField, hx, (hab x hx).symm] + · simp [restrictCoeffField, hx] + simpa [hfun] using h.2.1 i j + · filter_upwards [h.2.2, MeasureTheory.ae_restrict_mem h.1] with x hxEll hxU + simpa [hab x hxU] using hxEll + +theorem iff_of_localAgreementOn {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a b : CoeffField d} (hab : LocalAgreementOn U a b) : + AEEQuantitativeEllipticSlice U k a ↔ AEEQuantitativeEllipticSlice U k b := by + constructor + · exact of_localAgreementOn hab + · intro h + exact of_localAgreementOn (fun x hx => (hab x hx).symm) h + +theorem measurableSet_localSigma {d : ℕ} (U : Set (Vec d)) (k : ℕ) : + @MeasurableSet (CoeffField d) (PointwiseLocalSigma U) + {a : CoeffField d | AEEQuantitativeEllipticSlice U k a} := + MeasurableSpace.measurableSet_generateFrom + (by + intro a b hab + exact iff_of_localAgreementOn (k := k) hab) + +/-- AEE quantitative slices still give an `L²` coefficient realization: the +coordinate functions are only a.e.-strongly measurable, but the quantitative +ellipticity bound supplies the uniform `L²` estimate. -/ +theorem memLp_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : AEEQuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x i j => restrictCoeffField U a x i j) 2 (volumeMeasureOn U) := by + classical + rw [MeasureTheory.memLp_pi_iff] + intro i + rw [MeasureTheory.memLp_pi_iff] + intro j + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖restrictCoeffField U a x i j‖ ≤ (k + 1 : ℝ) := by + filter_upwards + [h.ae_isEllipticMatrix, + MeasureTheory.ae_restrict_mem h.measurableSet] + with x hxEll hxU + simpa [restrictCoeffField, hxU, Real.norm_eq_abs] using + abs_apply_le_of_isEllipticMatrix hxEll i j + exact + MeasureTheory.MemLp.of_bound + (h.aestronglyMeasurable_restrictCoeffField_apply i j) + (k + 1 : ℝ) hbound + +theorem memLp_hilbertMatrix_restrictCoeffField {d : ℕ} {U : Set (Vec d)} {k : ℕ} + {a : CoeffField d} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : AEEQuantitativeEllipticSlice U k a) : + MeasureTheory.MemLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a x)) 2 (volumeMeasureOn U) := by + let T : Mat d →L[ℝ] HilbertMat d := + ((HilbertMat.continuousLinearEquivMat d).symm).toContinuousLinearMap + simpa [T] using! T.comp_memLp' h.memLp_restrictCoeffField + +noncomputable def toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}) : + MeasureTheory.Lp (HilbertMat d) 2 (volumeMeasureOn U) := + a.2.memLp_hilbertMatrix_restrictCoeffField.toLp + (fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x)) + +theorem coeFn_toHilbertMatrixL2 {d : ℕ} {U : Set (Vec d)} {k : ℕ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (a : {a : CoeffField d // AEEQuantitativeEllipticSlice U k a}) : + toHilbertMatrixL2 a =ᵐ[volumeMeasureOn U] + fun x => HilbertMat.ofMat (restrictCoeffField U a.1 x) := + MeasureTheory.MemLp.coeFn_toLp a.2.memLp_hilbertMatrix_restrictCoeffField + +/-- Any positive spatial-a.e. ellipticity constants can be relaxed to one of +the countable AEE quantitative slices. -/ +theorem exists_of_aeeEllipticOn {d : ℕ} {U : Set (Vec d)} {a : CoeffField d} + {lam Lam : ℝ} (hlam_pos : 0 < lam) + (hEll : IsAEEllipticFieldOn lam Lam U a) : + ∃ k : ℕ, AEEQuantitativeEllipticSlice U k a := by + obtain ⟨k, hk⟩ := exists_nat_gt (max lam⁻¹ Lam) + have hmax_le_k : max lam⁻¹ Lam ≤ (k : ℝ) := le_of_lt hk + have hlam_inv_le_k : lam⁻¹ ≤ (k : ℝ) := + (le_max_left lam⁻¹ Lam).trans hmax_le_k + have hLam_le_k : Lam ≤ (k : ℝ) := + (le_max_right lam⁻¹ Lam).trans hmax_le_k + have hk_le_succ : (k : ℝ) ≤ (k + 1 : ℝ) := by + exact_mod_cast Nat.le_succ k + have hlam_inv_le_succ : lam⁻¹ ≤ (k + 1 : ℝ) := + hlam_inv_le_k.trans hk_le_succ + have hLam_le_succ : Lam ≤ (k + 1 : ℝ) := + hLam_le_k.trans hk_le_succ + have hslice_lam_pos : 0 < ((k + 1 : ℝ)⁻¹) := by positivity + have hslice_lam_le : ((k + 1 : ℝ)⁻¹) ≤ lam := + inv_le_of_inv_le₀ hlam_pos hlam_inv_le_succ + exact ⟨k, hEll.mono_constants hslice_lam_pos hslice_lam_le hLam_le_succ⟩ + +end AEEQuantitativeEllipticSlice + +namespace IsLocallyUniformlyElliptic + +/-- Restrict local uniform ellipticity from a centered closed ball to a measurable +subset of that ball. -/ +theorem exists_isEllipticFieldOn_of_subset_closedBall {d : ℕ} {a : CoeffField d} + {U : Set (Vec d)} {R : ℝ} (hloc : IsLocallyUniformlyElliptic a) (hR : 1 ≤ R) + (hU : MeasurableSet U) (hsub : U ⊆ Metric.closedBall (0 : Vec d) R) : + ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ IsEllipticFieldOn ε ε⁻¹ U a := by + obtain ⟨ε, hε_pos, hε_le_one, hEll⟩ := hloc R hR + exact ⟨ε, hε_pos, hε_le_one, hEll.mono hU hsub⟩ + +theorem exists_isEllipticFieldOn_cubeSet_originCube {d : ℕ} {a : CoeffField d} + (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ + IsEllipticFieldOn ε ε⁻¹ (cubeSet (originCube d n)) a := by + refine hloc.exists_isEllipticFieldOn_of_subset_closedBall + (R := max 1 (cubeRadius (originCube d n))) (le_max_left _ _) + (measurableSet_cubeSet (originCube d n)) ?_ + intro x hx + have hx_ball : + x ∈ Metric.closedBall (cubeCenter (originCube d n)) (cubeRadius (originCube d n)) := + cubeSet_subset_closedBall (originCube d n) hx + have hx_ball_zero : + x ∈ Metric.closedBall (0 : Vec d) (cubeRadius (originCube d n)) := by + have hcenter : cubeCenter (originCube d n) = (0 : Vec d) := by + ext i + simp [cubeCenter, originCube] + simpa [hcenter] using hx_ball + exact Metric.closedBall_subset_closedBall + (le_max_right (1 : ℝ) (cubeRadius (originCube d n))) hx_ball_zero + +theorem exists_isEllipticFieldOn_openCubeSet_originCube {d : ℕ} {a : CoeffField d} + (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ + IsEllipticFieldOn ε ε⁻¹ (openCubeSet (originCube d n)) a := by + obtain ⟨ε, hε_pos, hε_le_one, hEll⟩ := + hloc.exists_isEllipticFieldOn_cubeSet_originCube n + exact ⟨ε, hε_pos, hε_le_one, + hEll.mono (measurableSet_openCubeSet (originCube d n)) + (openCubeSet_subset_cubeSet (originCube d n))⟩ + +theorem exists_quantitativeEllipticSlice_cubeSet_originCube {d : ℕ} {a : CoeffField d} + (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ k : ℕ, QuantitativeEllipticSlice (cubeSet (originCube d n)) k a := by + obtain ⟨ε, hε_pos, -, hEll⟩ := hloc.exists_isEllipticFieldOn_cubeSet_originCube n + exact QuantitativeEllipticSlice.exists_of_isEllipticFieldOn hε_pos hEll + +theorem exists_quantitativeEllipticSlice_openCubeSet_originCube {d : ℕ} + {a : CoeffField d} (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ k : ℕ, QuantitativeEllipticSlice (openCubeSet (originCube d n)) k a := by + obtain ⟨ε, hε_pos, -, hEll⟩ := hloc.exists_isEllipticFieldOn_openCubeSet_originCube n + exact QuantitativeEllipticSlice.exists_of_isEllipticFieldOn hε_pos hEll + +theorem exists_essentialQuantitativeEllipticSlice_cubeSet_originCube {d : ℕ} + {a : CoeffField d} (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ k : ℕ, EssentialQuantitativeEllipticSlice (cubeSet (originCube d n)) k a := by + obtain ⟨k, hk⟩ := hloc.exists_quantitativeEllipticSlice_cubeSet_originCube n + exact ⟨k, EssentialQuantitativeEllipticSlice.of_quantitative hk⟩ + +theorem exists_essentialQuantitativeEllipticSlice_openCubeSet_originCube {d : ℕ} + {a : CoeffField d} (hloc : IsLocallyUniformlyElliptic a) (n : ℤ) : + ∃ k : ℕ, EssentialQuantitativeEllipticSlice (openCubeSet (originCube d n)) k a := by + obtain ⟨k, hk⟩ := hloc.exists_quantitativeEllipticSlice_openCubeSet_originCube n + exact ⟨k, EssentialQuantitativeEllipticSlice.of_quantitative hk⟩ + +end IsLocallyUniformlyElliptic + +theorem ae_exists_quantitativeEllipticSlice_cubeSet_originCube + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + (hloc : ∀ᵐ a ∂P, IsLocallyUniformlyElliptic a) (n : ℤ) : + ∀ᵐ a ∂P, ∃ k : ℕ, QuantitativeEllipticSlice (cubeSet (originCube d n)) k a := + hloc.mono fun _a ha => ha.exists_quantitativeEllipticSlice_cubeSet_originCube n + +theorem ae_exists_quantitativeEllipticSlice_openCubeSet_originCube + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + (hloc : ∀ᵐ a ∂P, IsLocallyUniformlyElliptic a) (n : ℤ) : + ∀ᵐ a ∂P, ∃ k : ℕ, QuantitativeEllipticSlice (openCubeSet (originCube d n)) k a := + hloc.mono fun _a ha => ha.exists_quantitativeEllipticSlice_openCubeSet_originCube n + +theorem ae_exists_essentialQuantitativeEllipticSlice_cubeSet_originCube + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + (hloc : ∀ᵐ a ∂P, IsLocallyUniformlyElliptic a) (n : ℤ) : + ∀ᵐ a ∂P, ∃ k : ℕ, + EssentialQuantitativeEllipticSlice (cubeSet (originCube d n)) k a := + hloc.mono fun _a ha => ha.exists_essentialQuantitativeEllipticSlice_cubeSet_originCube n + +theorem ae_exists_essentialQuantitativeEllipticSlice_openCubeSet_originCube + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + (hloc : ∀ᵐ a ∂P, IsLocallyUniformlyElliptic a) (n : ℤ) : + ∀ᵐ a ∂P, ∃ k : ℕ, + EssentialQuantitativeEllipticSlice (openCubeSet (originCube d n)) k a := + hloc.mono fun _a ha => ha.exists_essentialQuantitativeEllipticSlice_openCubeSet_originCube n + +/-- The least quantitative slice index selected from a total countable +slice-cover proof. This is intentionally just the measurable-selection +bookkeeping; proving that raw slice membership sets are measurable is a +separate input. -/ +noncomputable def quantitativeEllipticSliceIndex + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) : + Ω → ℕ := by + classical + exact fun ω => Nat.find (hcover ω) + +theorem quantitativeEllipticSliceIndex_spec + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (ω : Ω) : + QuantitativeEllipticSlice U (quantitativeEllipticSliceIndex U A hcover ω) (A ω) := by + classical + unfold quantitativeEllipticSliceIndex + exact Nat.find_spec (hcover ω) + +theorem measurable_quantitativeEllipticSliceIndex_of_measurableSet + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, QuantitativeEllipticSlice U k (A ω)) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | QuantitativeEllipticSlice U k (A ω)}) : + Measurable (quantitativeEllipticSliceIndex U A hcover) := by + classical + unfold quantitativeEllipticSliceIndex + exact measurable_find hcover hSliceMeas + +/-- The least essential quantitative slice index selected from a total +countable cover. This is the a.e.-elliptic replacement for +`quantitativeEllipticSliceIndex` in the probability handoff. -/ +noncomputable def essentialQuantitativeEllipticSliceIndex + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, EssentialQuantitativeEllipticSlice U k (A ω)) : + Ω → ℕ := by + classical + exact fun ω => Nat.find (hcover ω) + +theorem essentialQuantitativeEllipticSliceIndex_spec + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, EssentialQuantitativeEllipticSlice U k (A ω)) + (ω : Ω) : + EssentialQuantitativeEllipticSlice U + (essentialQuantitativeEllipticSliceIndex U A hcover ω) (A ω) := by + classical + unfold essentialQuantitativeEllipticSliceIndex + exact Nat.find_spec (hcover ω) + +theorem measurable_essentialQuantitativeEllipticSliceIndex_of_measurableSet + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, EssentialQuantitativeEllipticSlice U k (A ω)) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | EssentialQuantitativeEllipticSlice U k (A ω)}) : + Measurable (essentialQuantitativeEllipticSliceIndex U A hcover) := by + classical + unfold essentialQuantitativeEllipticSliceIndex + exact measurable_find hcover hSliceMeas + +/-- The least AEE quantitative slice index selected from a total countable +cover. This is the boundary-stable analogue of +`essentialQuantitativeEllipticSliceIndex`; applications to Chapter 4 laws first +restrict to the full-measure support on which the cover is available. -/ +noncomputable def aeeQuantitativeEllipticSliceIndex + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) : + Ω → ℕ := by + classical + exact fun ω => Nat.find (hcover ω) + +theorem aeeQuantitativeEllipticSliceIndex_spec + {Ω : Type*} {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (ω : Ω) : + AEEQuantitativeEllipticSlice U + (aeeQuantitativeEllipticSliceIndex U A hcover ω) (A ω) := by + classical + unfold aeeQuantitativeEllipticSliceIndex + exact Nat.find_spec (hcover ω) + +theorem measurable_aeeQuantitativeEllipticSliceIndex_of_measurableSet + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} (U : Set (Vec d)) (A : Ω → CoeffField d) + (hcover : ∀ ω : Ω, ∃ k : ℕ, AEEQuantitativeEllipticSlice U k (A ω)) + (hSliceMeas : + ∀ k : ℕ, MeasurableSet {ω : Ω | AEEQuantitativeEllipticSlice U k (A ω)}) : + Measurable (aeeQuantitativeEllipticSliceIndex U A hcover) := by + classical + unfold aeeQuantitativeEllipticSliceIndex + exact measurable_find hcover hSliceMeas + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices/SymmetricL2.lean b/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices/SymmetricL2.lean new file mode 100644 index 0000000000..85034e089f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/LocalEllipticitySlices/SymmetricL2.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices + +/-! # Symmetric L2 -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace IsAEEllipticFieldOn + +/-- +Spatial a.e. ellipticity sends `L²` vector fields to `L²` vector fields after +multiplication by the symmetric part of the coefficient matrix. +-/ +theorem memVectorL2_matVecMul_symmPart {d : ℕ} {lam Lam : ℝ} + {U : Set (Vec d)} {a : CoeffField d} (h : IsAEEllipticFieldOn lam Lam U a) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemVectorL2 U (fun x => matVecMul (symmPart (a x)) (f x)) := by + classical + rw [MemVectorL2] at hf ⊢ + refine (MeasureTheory.memLp_pi_iff).2 ?_ + intro i + refine MeasureTheory.memLp_finsetSum + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => symmPart (a x) i j * f x j) ?_ + intro j _hj + have hfj : MeasureTheory.MemLp (fun x => f x j) 2 (volumeMeasureOn U) := + (MeasureTheory.memLp_pi_iff.mp hf) j + have hcoeff_i : + MeasureTheory.AEStronglyMeasurable (fun x : Vec d => a x i j) + (volumeMeasureOn U) := by + refine (h.aestronglyMeasurable_restrictCoeffField_apply i j).congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem h.measurableSet] with x hx + simp [restrictCoeffField, hx] + have hcoeff_j : + MeasureTheory.AEStronglyMeasurable (fun x : Vec d => a x j i) + (volumeMeasureOn U) := by + refine (h.aestronglyMeasurable_restrictCoeffField_apply j i).congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem h.measurableSet] with x hx + simp [restrictCoeffField, hx] + have hcoeff_symm : + MeasureTheory.AEStronglyMeasurable (fun x : Vec d => symmPart (a x) i j) + (volumeMeasureOn U) := by + have hsum : + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => a x i j + a x j i) (volumeMeasureOn U) := by + simpa using! hcoeff_i.add hcoeff_j + simpa [symmPart, div_eq_mul_inv] using hsum.mul_const ((2 : ℝ)⁻¹) + have hterm_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => symmPart (a x) i j * f x j) (volumeMeasureOn U) := + hcoeff_symm.mul hfj.aestronglyMeasurable + have hbound : + ∀ᵐ x ∂ volumeMeasureOn U, + ‖symmPart (a x) i j * f x j‖ ≤ Lam * ‖f x j‖ := by + filter_upwards [h.ae_isEllipticMatrix] with x hxEll + have hcoeff_ij : |a x i j| ≤ Lam := abs_apply_le_of_isEllipticMatrix hxEll i j + have hcoeff_ji : |a x j i| ≤ Lam := abs_apply_le_of_isEllipticMatrix hxEll j i + have hsymm : |symmPart (a x) i j| ≤ Lam := by + calc + |symmPart (a x) i j| + = |a x i j + a x j i| * (1 / 2 : ℝ) := by + simp [symmPart, div_eq_mul_inv, abs_mul] + _ = (1 / 2 : ℝ) * |a x i j + a x j i| := by ring + _ ≤ (1 / 2 : ℝ) * (|a x i j| + |a x j i|) := by + gcongr + exact abs_add_le _ _ + _ ≤ Lam := by + nlinarith + calc + ‖symmPart (a x) i j * f x j‖ = + |symmPart (a x) i j| * ‖f x j‖ := by + rw [norm_mul, Real.norm_eq_abs] + _ ≤ Lam * ‖f x j‖ := mul_le_mul_of_nonneg_right hsymm (norm_nonneg _) + simpa using MeasureTheory.MemLp.of_le_mul hfj hterm_meas hbound + +end IsAEEllipticFieldOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/LocalObservable.lean b/LeanPool/CoarseGraining/Homogenization/Probability/LocalObservable.lean new file mode 100644 index 0000000000..a22b876fc4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/LocalObservable.lean @@ -0,0 +1,889 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomCoeffField +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.MeasureTheory.Measure.AEMeasurable + +/-! # Local Observable -/ + +@[expose] public section + +namespace Homogenization + +/-! +Generic measurable local observables on coefficient space. + +This file packages the common probability-theoretic pattern: + +- a coefficient-space observable is measurable; +- it depends only on the coefficient field inside a deterministic region `U`; +- therefore its law and its Bochner integrals depend only on the restricted + law `Measure.map (restrictCoeffField U) P`. + +Concrete coarse observables such as `Mu U P`, the coarse matrix entries, and +their matrix-valued packages should be bundled as instances of +`MeasurableLocalObservable` in downstream files. +-/ + +theorem restrictCoeffField_eq_of_forall_mem_eq {d : ℕ} {U : Set (Vec d)} + {a₁ a₂ : CoeffField d} (h : ∀ x ∈ U, a₁ x = a₂ x) : + restrictCoeffField U a₁ = restrictCoeffField U a₂ := by + funext x + by_cases hx : x ∈ U + · simp [restrictCoeffField, hx, h x hx] + · simp [restrictCoeffField, hx] + +theorem comp_restrictCoeffField_eq_of_isRestrictionLocalObservable {β : Type*} {d : ℕ} + {U : Set (Vec d)} {X : CoeffField d → β} (hX : IsRestrictionLocalObservable U X) : + X ∘ restrictCoeffField U = X := by + funext a + exact hX (by + intro x hx + simp [restrictCoeffField, hx]) + +/-- Compatibility spelling for the restriction-local restriction identity. -/ +theorem comp_restrictCoeffField_eq_of_isLocalObservable {β : Type*} {d : ℕ} + {U : Set (Vec d)} {X : CoeffField d → β} (hX : IsLocalObservable U X) : + X ∘ restrictCoeffField U = X := + comp_restrictCoeffField_eq_of_isRestrictionLocalObservable hX + +theorem map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {P : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) P) = + MeasureTheory.Measure.map X P := by + calc + MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) P) = + MeasureTheory.Measure.map (X ∘ restrictCoeffField U) P := by + simpa [Function.comp] using + (MeasureTheory.Measure.map_map hX_meas (measurable_restrictCoeffField U) (μ := P)) + _ = MeasureTheory.Measure.map X P := by + rw [comp_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_local] + +/-- Compatibility spelling for the restriction-local map identity. -/ +theorem map_eq_map_restrictCoeffField_of_isLocalObservable + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {P : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) P) = + MeasureTheory.Measure.map X P := + map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable hX_meas hX_local + +theorem map_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {P Q : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + MeasureTheory.Measure.map X P = MeasureTheory.Measure.map X Q := by + calc + MeasureTheory.Measure.map X P = + MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) P) := by + symm + exact map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable + (P := P) hX_meas hX_local + _ = MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) Q) := by + rw [hPQ] + _ = MeasureTheory.Measure.map X Q := + map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable + (P := Q) hX_meas hX_local + +/-- Compatibility spelling for the restriction-local map comparison. -/ +theorem map_eq_of_map_restrictCoeffField_eq_of_isLocalObservable + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {P Q : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsLocalObservable U X) + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + MeasureTheory.Measure.map X P = MeasureTheory.Measure.map X Q := + map_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_meas hX_local hPQ + +theorem integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {U : Set (Vec d)} {P : MeasureTheory.Measure (CoeffField d)} + {X : CoeffField d → E} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + ∫ a, X a ∂(MeasureTheory.Measure.map (restrictCoeffField U) P) = ∫ a, X a ∂P := by + rw [MeasureTheory.integral_map (measurable_restrictCoeffField U).aemeasurable] + · apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall <| fun a => + congrFun (comp_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_local) a + · exact hX_meas.aestronglyMeasurable + +/-- Compatibility spelling for the restriction-local integral identity. -/ +theorem integral_map_restrictCoeffField_eq_of_isLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {U : Set (Vec d)} {P : MeasureTheory.Measure (CoeffField d)} + {X : CoeffField d → E} + (hX_meas : Measurable X) (hX_local : IsLocalObservable U X) : + ∫ a, X a ∂(MeasureTheory.Measure.map (restrictCoeffField U) P) = ∫ a, X a ∂P := + integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_meas hX_local + +theorem integral_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {U : Set (Vec d)} + {P Q : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → E} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + ∫ a, X a ∂P = ∫ a, X a ∂Q := by + calc + ∫ a, X a ∂P = ∫ a, X a ∂(MeasureTheory.Measure.map (restrictCoeffField U) P) := by + symm + exact integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + (P := P) hX_meas hX_local + _ = ∫ a, X a ∂(MeasureTheory.Measure.map (restrictCoeffField U) Q) := by + rw [hPQ] + _ = ∫ a, X a ∂Q := + integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + (P := Q) hX_meas hX_local + +/-- Compatibility spelling for the restriction-local integral comparison. -/ +theorem integral_eq_of_map_restrictCoeffField_eq_of_isLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {U : Set (Vec d)} + {P Q : MeasureTheory.Measure (CoeffField d)} {X : CoeffField d → E} + (hX_meas : Measurable X) (hX_local : IsLocalObservable U X) + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + ∫ a, X a ∂P = ∫ a, X a ∂Q := + integral_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_meas hX_local hPQ + +theorem measurable_of_isRestrictionLocalObservable_restrictionSigma + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + @Measurable (CoeffField d) β (RestrictionSigma U) _ X := by + simpa [Function.comp, comp_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_local] using + hX_meas.comp (measurable_restrictCoeffField_restrictionSigma (d := d) U) + +theorem IsRestrictionLocalObservable.mono {β : Type*} {d : ℕ} {U V : Set (Vec d)} + {X : CoeffField d → β} (hX : IsRestrictionLocalObservable U X) (hUV : U ⊆ V) : + IsRestrictionLocalObservable V X := by + intro a₁ a₂ hagree + exact hX fun x hx => hagree x (hUV hx) + +/-- Compatibility spelling for `IsRestrictionLocalObservable.mono`. -/ +theorem IsLocalObservable.mono {β : Type*} {d : ℕ} {U V : Set (Vec d)} + {X : CoeffField d → β} (hX : IsLocalObservable U X) (hUV : U ⊆ V) : + IsLocalObservable V X := + IsRestrictionLocalObservable.mono hX hUV + +/-- Compatibility spelling for the restriction-local measurability theorem. -/ +theorem measurable_of_isLocalObservable_restrictionSigma + {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsLocalObservable U X) : + @Measurable (CoeffField d) β (RestrictionSigma U) _ X := + measurable_of_isRestrictionLocalObservable_restrictionSigma hX_meas hX_local + +theorem measurable_of_isRestrictionLocalObservable_restrictionSigma_mono + {β : Type*} [MeasurableSpace β] {d : ℕ} {U V : Set (Vec d)} + {X : CoeffField d → β} (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) + (hUV : U ⊆ V) : + @Measurable (CoeffField d) β (RestrictionSigma V) _ X := + measurable_of_isRestrictionLocalObservable_restrictionSigma hX_meas (hX_local.mono hUV) + +/-- Compatibility spelling for the monotone restriction-local measurability theorem. -/ +theorem measurable_of_isLocalObservable_restrictionSigma_mono + {β : Type*} [MeasurableSpace β] {d : ℕ} {U V : Set (Vec d)} + {X : CoeffField d → β} (hX_meas : Measurable X) (hX_local : IsLocalObservable U X) + (hUV : U ⊆ V) : + @Measurable (CoeffField d) β (RestrictionSigma V) _ X := + measurable_of_isRestrictionLocalObservable_restrictionSigma_mono hX_meas hX_local hUV + +theorem comp_translateByInt_eq_of_isTranslationCovariant + {β : Type*} {d : ℕ} {X : Set (Vec d) → CoeffField d → β} + (hX : IsTranslationCovariant X) (U : Set (Vec d)) (z : Fin d → ℤ) : + X (translateSet (intVecToRealVec z) U) = X U ∘ translateByInt z := by + funext a + exact hX U z a + +theorem map_eq_map_translateByInt_of_isTranslationCovariant + {β : Type*} [MeasurableSpace β] {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} + {X : Set (Vec d) → CoeffField d → β} + (hP : IsStationary P) {U : Set (Vec d)} (hX_meas : Measurable (X U)) + (hX_cov : IsTranslationCovariant X) (z : Fin d → ℤ) : + MeasureTheory.Measure.map (X (translateSet (intVecToRealVec z) U)) P = + MeasureTheory.Measure.map (X U) P := by + calc + MeasureTheory.Measure.map (X (translateSet (intVecToRealVec z) U)) P = + MeasureTheory.Measure.map ((X U) ∘ translateByInt z) P := by + rw [comp_translateByInt_eq_of_isTranslationCovariant hX_cov U z] + _ = MeasureTheory.Measure.map (X U) (MeasureTheory.Measure.map (translateByInt z) P) := by + symm + simpa [Function.comp] using + (MeasureTheory.Measure.map_map hX_meas (measurable_translateByInt z) (μ := P)) + _ = MeasureTheory.Measure.map (X U) P := by + rw [hP z] + +/-- A.e.-measurable version of +`map_eq_map_translateByInt_of_isTranslationCovariant`. -/ +theorem map_eq_map_translateByInt_of_isTranslationCovariant_aemeasurable + {β : Type*} [MeasurableSpace β] {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} + {X : Set (Vec d) → CoeffField d → β} + (hP : IsStationary P) {U : Set (Vec d)} + (hX_aemeas : AEMeasurable (X U) P) + (hX_cov : IsTranslationCovariant X) (z : Fin d → ℤ) : + MeasureTheory.Measure.map (X (translateSet (intVecToRealVec z) U)) P = + MeasureTheory.Measure.map (X U) P := by + calc + MeasureTheory.Measure.map (X (translateSet (intVecToRealVec z) U)) P = + MeasureTheory.Measure.map ((X U) ∘ translateByInt z) P := by + rw [comp_translateByInt_eq_of_isTranslationCovariant hX_cov U z] + _ = MeasureTheory.Measure.map (X U) (MeasureTheory.Measure.map (translateByInt z) P) := by + symm + exact AEMeasurable.map_map_of_aemeasurable + (by simpa [hP z] using hX_aemeas) + (measurable_translateByInt z).aemeasurable + _ = MeasureTheory.Measure.map (X U) P := by + rw [hP z] + +theorem integral_eq_of_isTranslationCovariant_of_isStationary + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + {X : Set (Vec d) → CoeffField d → E} + (hP : IsStationary P) {U : Set (Vec d)} (hX_meas : Measurable (X U)) + (hX_cov : IsTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := by + rw [comp_translateByInt_eq_of_isTranslationCovariant hX_cov U z] + exact integral_comp_eq_of_map_eq + (measurable_translateByInt z) (hP z) (X U) hX_meas.aestronglyMeasurable + +theorem integral_eq_of_isTranslationCovariant_of_isStationary_aestronglyMeasurable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {d : ℕ} {P : MeasureTheory.Measure (CoeffField d)} + {X : Set (Vec d) → CoeffField d → E} + (hP : IsStationary P) {U : Set (Vec d)} + (hX_aemeas : MeasureTheory.AEStronglyMeasurable (X U) P) + (hX_cov : IsTranslationCovariant X) (z : Fin d → ℤ) : + ∫ a, X (translateSet (intVecToRealVec z) U) a ∂P = ∫ a, X U a ∂P := by + rw [comp_translateByInt_eq_of_isTranslationCovariant hX_cov U z] + exact integral_comp_eq_of_map_eq + (measurable_translateByInt z) (hP z) (X U) hX_aemeas + +/-- A coefficient-space observable that is both measurable and pointwise +restriction-local on `U`. -/ +structure MeasurableLocalObservable (d : ℕ) (U : Set (Vec d)) (β : Type*) + [MeasurableSpace β] where + toFun : CoeffField d → β + measurable_toFun : Measurable toFun + isLocal_toFun : IsRestrictionLocalObservable U toFun + +namespace MeasurableLocalObservable + +variable {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + +instance : CoeFun (MeasurableLocalObservable d U β) (fun _ => CoeffField d → β) := ⟨toFun⟩ + +theorem measurable (X : MeasurableLocalObservable d U β) : Measurable X := + X.measurable_toFun + +theorem isLocal (X : MeasurableLocalObservable d U β) : IsLocalObservable U X := + X.isLocal_toFun + +/-- The explicit restriction-local spelling of the bundled locality field. -/ +theorem isRestrictionLocal (X : MeasurableLocalObservable d U β) : + IsRestrictionLocalObservable U X := + X.isLocal_toFun + +theorem measurable_restrictionSigma (X : MeasurableLocalObservable d U β) : + @Measurable (CoeffField d) β (RestrictionSigma U) _ X := + measurable_of_isRestrictionLocalObservable_restrictionSigma X.measurable X.isRestrictionLocal + +theorem measurable_restrictionSigma_mono {V : Set (Vec d)} + (X : MeasurableLocalObservable d U β) (hUV : U ⊆ V) : + @Measurable (CoeffField d) β (RestrictionSigma V) _ X := + measurable_of_isRestrictionLocalObservable_restrictionSigma_mono X.measurable X.isRestrictionLocal hUV + +def mono {V : Set (Vec d)} (X : MeasurableLocalObservable d U β) (hUV : U ⊆ V) : + MeasurableLocalObservable d V β where + toFun := X + measurable_toFun := X.measurable + isLocal_toFun := X.isRestrictionLocal.mono hUV + +@[simp] theorem mono_apply {V : Set (Vec d)} (X : MeasurableLocalObservable d U β) + (hUV : U ⊆ V) (a : CoeffField d) : + X.mono hUV a = X a := + rfl + +def const (c : β) : MeasurableLocalObservable d U β where + toFun := fun _ => c + measurable_toFun := measurable_const + isLocal_toFun := by intro _ _ _; rfl + +def comp {γ : Type*} [MeasurableSpace γ] (X : MeasurableLocalObservable d U β) + (f : β → γ) (hf : Measurable f) : MeasurableLocalObservable d U γ where + toFun := f ∘ X + measurable_toFun := hf.comp X.measurable + isLocal_toFun := by + intro a₁ a₂ hagree + simpa [Function.comp] using congrArg f (X.isRestrictionLocal hagree) + +def prod {γ : Type*} [MeasurableSpace γ] + (X : MeasurableLocalObservable d U β) (Y : MeasurableLocalObservable d U γ) : + MeasurableLocalObservable d U (β × γ) where + toFun := fun a => (X a, Y a) + measurable_toFun := by + simpa using (X.measurable).prodMk Y.measurable + isLocal_toFun := by + intro a₁ a₂ hagree + simp [X.isRestrictionLocal hagree, Y.isRestrictionLocal hagree] + +def pi {ι : Type*} {γ : ι → Type*} [∀ i, MeasurableSpace (γ i)] + (X : ∀ i, MeasurableLocalObservable d U (γ i)) : + MeasurableLocalObservable d U (∀ i, γ i) where + toFun := fun a i => X i a + measurable_toFun := by + rw [measurable_pi_iff] + intro i + exact (X i).measurable + isLocal_toFun := by + intro a₁ a₂ hagree + funext i + exact (X i).isRestrictionLocal hagree + +def neg {β : Type*} [MeasurableSpace β] [Neg β] [MeasurableNeg β] + (X : MeasurableLocalObservable d U β) : + MeasurableLocalObservable d U β := + X.comp (fun x => -x) measurable_neg + +def add {β : Type*} [MeasurableSpace β] [Add β] [MeasurableAdd₂ β] + (X Y : MeasurableLocalObservable d U β) : + MeasurableLocalObservable d U β where + toFun := fun a => X a + Y a + measurable_toFun := X.measurable.add Y.measurable + isLocal_toFun := by + intro a₁ a₂ hagree + simp [X.isRestrictionLocal hagree, Y.isRestrictionLocal hagree] + +def sub {β : Type*} [MeasurableSpace β] [Sub β] [MeasurableSub₂ β] + (X Y : MeasurableLocalObservable d U β) : + MeasurableLocalObservable d U β where + toFun := fun a => X a - Y a + measurable_toFun := X.measurable.sub Y.measurable + isLocal_toFun := by + intro a₁ a₂ hagree + simp [X.isRestrictionLocal hagree, Y.isRestrictionLocal hagree] + +def const_smul {M : Type*} [SMul M β] [MeasurableConstSMul M β] + (c : M) (X : MeasurableLocalObservable d U β) : + MeasurableLocalObservable d U β where + toFun := fun a => c • X a + measurable_toFun := X.measurable.const_smul c + isLocal_toFun := by + intro a₁ a₂ hagree + simp [X.isRestrictionLocal hagree] + +def finsetPi {ι : Type*} [DecidableEq ι] {γ : ι → Type*} [∀ i, MeasurableSpace (γ i)] + (s : Finset ι) {V : ι → Set (Vec d)} + (X : ∀ i, MeasurableLocalObservable d (V i) (γ i)) : + MeasurableLocalObservable d (⋃ i ∈ s, V i) (∀ i : s, γ i) where + toFun := fun a i => X i a + measurable_toFun := by + rw [measurable_pi_iff] + intro i + exact (X i).measurable + isLocal_toFun := by + intro a₁ a₂ hagree + funext i + exact (X i).isRestrictionLocal fun x hx => hagree x <| by + refine Set.mem_iUnion.2 ?_ + refine ⟨(i : ι), ?_⟩ + refine Set.mem_iUnion.2 ?_ + exact ⟨i.property, hx⟩ + +theorem measurable_subtypeFinsetSum {ι : Type*} (s : Finset ι) + {γ : Type*} [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] : + Measurable (fun y : s → γ => ∑ i, y i) := by + exact Finset.univ.measurable_sum fun i _ => measurable_pi_apply i + +noncomputable def finsetSum {ι : Type*} [DecidableEq ι] {γ : Type*} + [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + (s : Finset ι) {V : ι → Set (Vec d)} + (X : ∀ i, MeasurableLocalObservable d (V i) γ) : + MeasurableLocalObservable d (⋃ i ∈ s, V i) γ := + (finsetPi (d := d) (s := s) X).comp (fun y : s → γ => ∑ i, y i) + (measurable_subtypeFinsetSum s) + +noncomputable def finsetAverage {ι : Type*} [DecidableEq ι] {γ : Type*} + [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + [SMul ℝ γ] [MeasurableConstSMul ℝ γ] + (s : Finset ι) {V : ι → Set (Vec d)} + (X : ∀ i, MeasurableLocalObservable d (V i) γ) : + MeasurableLocalObservable d (⋃ i ∈ s, V i) γ := + (finsetSum (d := d) (s := s) X).const_smul ((s.card : ℝ)⁻¹) + +theorem comp_restrictCoeffField_eq (X : MeasurableLocalObservable d U β) : + X ∘ restrictCoeffField U = X := + comp_restrictCoeffField_eq_of_isRestrictionLocalObservable X.isRestrictionLocal + +theorem map_eq_map_restrictCoeffField + (X : MeasurableLocalObservable d U β) + {P : MeasureTheory.Measure (CoeffField d)} : + MeasureTheory.Measure.map X (MeasureTheory.Measure.map (restrictCoeffField U) P) = + MeasureTheory.Measure.map X P := + map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable X.measurable X.isRestrictionLocal + +theorem map_eq_of_map_restrictCoeffField_eq + (X : MeasurableLocalObservable d U β) + {P Q : MeasureTheory.Measure (CoeffField d)} + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + MeasureTheory.Measure.map X P = MeasureTheory.Measure.map X Q := + map_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + X.measurable X.isRestrictionLocal hPQ + +theorem measurable_comp_randomCoeffField + {Ω : Type*} [MeasurableSpace Ω] (X : MeasurableLocalObservable d U β) + (A : RandomCoeffField Ω d) : + Measurable fun ω => X (A ω) := + X.measurable.comp A.measurable + +theorem measurable_comp_randomCoeffField_restrictionSigma + {Ω : Type*} [MeasurableSpace Ω] (X : MeasurableLocalObservable d U β) + (A : RandomCoeffField Ω d) : + @Measurable Ω β (A.restrictionSigma U) _ (fun ω => X (A ω)) := by + exact X.measurable_restrictionSigma.comp (A.measurable_restrictionSigma U) + +theorem indepFun_of_indep_restrictionSigma + {γ : Type*} [MeasurableSpace γ] {V : Set (Vec d)} + {P : MeasureTheory.Measure (CoeffField d)} + (hP : ProbabilityTheory.Indep (RestrictionSigma U) (RestrictionSigma V) P) + (X : MeasurableLocalObservable d U β) (Y : MeasurableLocalObservable d V γ) : + ProbabilityTheory.IndepFun X Y P := by + exact ProbabilityTheory.indep_of_indep_of_le_right + (m₃ := MeasurableSpace.comap Y inferInstance) + (ProbabilityTheory.indep_of_indep_of_le_left + (m₃ := MeasurableSpace.comap X inferInstance) hP + (Measurable.comap_le X.measurable_restrictionSigma)) + (Measurable.comap_le Y.measurable_restrictionSigma) + +theorem integral_map_restrictCoeffField_eq + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {U : Set (Vec d)} (X : MeasurableLocalObservable d U E) + {P : MeasureTheory.Measure (CoeffField d)} : + ∫ a, X a ∂(MeasureTheory.Measure.map (restrictCoeffField U) P) = ∫ a, X a ∂P := + integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable X.measurable X.isRestrictionLocal + +theorem integral_eq_of_map_restrictCoeffField_eq + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {U : Set (Vec d)} (X : MeasurableLocalObservable d U E) + {P Q : MeasureTheory.Measure (CoeffField d)} + (hPQ : MeasureTheory.Measure.map (restrictCoeffField U) P = + MeasureTheory.Measure.map (restrictCoeffField U) Q) : + ∫ a, X a ∂P = ∫ a, X a ∂Q := + integral_eq_of_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + X.measurable X.isRestrictionLocal hPQ + +theorem iIndepFun_of_isRestrictionUnitRangeDependent + {ι : Type*} [DecidableEq ι] {γ : ι → Type*} [∀ i, MeasurableSpace (γ i)] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {V : ι → Set (Vec d)} (hP : IsRestrictionUnitRangeDependent P) + (hsep : Pairwise fun i j => AreUnitSeparated (V i) (V j)) + (X : ∀ i, MeasurableLocalObservable d (V i) (γ i)) : + ProbabilityTheory.iIndepFun (fun i => X i) P := by + rw [ProbabilityTheory.iIndepFun_iff_iIndep] + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + exact (ProbabilityTheory.iIndep_iff (fun i => RestrictionSigma (V i)) P).1 + (iIndep_restrictionSigma_of_isRestrictionUnitRangeDependent (d := d) hP hsep) s + (fun i hi => (Measurable.comap_le (X i).measurable_restrictionSigma) (f i) (hf i hi)) + +theorem indepFun_finset_of_isRestrictionUnitRangeDependent + {ι : Type*} [DecidableEq ι] {γ : ι → Type*} [∀ i, MeasurableSpace (γ i)] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {V : ι → Set (Vec d)} (hP : IsRestrictionUnitRangeDependent P) + (hsep : Pairwise fun i j => AreUnitSeparated (V i) (V j)) + (X : ∀ i, MeasurableLocalObservable d (V i) (γ i)) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun (fun a (i : S) => X i a) (fun a (i : T) => X i a) P := by + exact (iIndepFun_of_isRestrictionUnitRangeDependent (d := d) hP hsep X).indepFun_finset S T hST + (fun i => (X i).measurable) + +theorem indepFun_finsetSum_of_isRestrictionUnitRangeDependent + {ι : Type*} [DecidableEq ι] {γ : Type*} [MeasurableSpace γ] + [AddCommMonoid γ] [MeasurableAdd₂ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {V : ι → Set (Vec d)} (hP : IsRestrictionUnitRangeDependent P) + (hsep : Pairwise fun i j => AreUnitSeparated (V i) (V j)) + (X : ∀ i, MeasurableLocalObservable d (V i) γ) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetSum (d := d) (s := S) X) (finsetSum (d := d) (s := T) X) P := by + simpa [finsetSum] using! + (indepFun_finset_of_isRestrictionUnitRangeDependent (d := d) hP hsep X S T hST).comp + (measurable_subtypeFinsetSum S) (measurable_subtypeFinsetSum T) + +theorem indepFun_finsetAverage_of_isRestrictionUnitRangeDependent + {ι : Type*} [DecidableEq ι] {γ : Type*} [MeasurableSpace γ] + [AddCommMonoid γ] [MeasurableAdd₂ γ] [SMul ℝ γ] [MeasurableConstSMul ℝ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {V : ι → Set (Vec d)} (hP : IsRestrictionUnitRangeDependent P) + (hsep : Pairwise fun i j => AreUnitSeparated (V i) (V j)) + (X : ∀ i, MeasurableLocalObservable d (V i) γ) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetAverage (d := d) (s := S) X) (finsetAverage (d := d) (s := T) X) P := by + simpa [finsetAverage] using! + (indepFun_finsetSum_of_isRestrictionUnitRangeDependent (d := d) hP hsep X S T hST).comp + (measurable_const_smul ((S.card : ℝ)⁻¹)) (measurable_const_smul ((T.card : ℝ)⁻¹)) + +theorem iIndepFun_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} (hk : 0 ≤ k) {c : CubeColor d} + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {γ : + {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} → Type*} + [∀ R, MeasurableSpace (γ R)] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) (γ R)) : + ProbabilityTheory.iIndepFun (fun R => X R) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass (Q := Q) hk c + simpa [I, V] using + (iIndepFun_of_isRestrictionUnitRangeDependent (d := d) (V := V) hP hsep X) + +theorem indepFun_finset_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} (hk : 0 ≤ k) {c : CubeColor d} + {γ : Type*} [MeasurableSpace γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (fun a (R : S) => X R a) (fun a (R : T) => X R a) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass (Q := Q) hk c + simpa [I, V] using + (indepFun_finset_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +theorem indepFun_finsetSum_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} (hk : 0 ≤ k) {c : CubeColor d} + {γ : Type*} [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetSum (d := d) (s := S) X) (finsetSum (d := d) (s := T) X) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass (Q := Q) hk c + simpa [I, V] using + (indepFun_finsetSum_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +theorem indepFun_finsetAverage_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} (hk : 0 ≤ k) {c : CubeColor d} + {γ : Type*} [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + [SMul ℝ γ] [MeasurableConstSMul ℝ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetAverage (d := d) (s := S) X) (finsetAverage (d := d) (s := T) X) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass (Q := Q) hk c + simpa [I, V] using + (indepFun_finsetAverage_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +theorem iIndepFun_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + {γ : + {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} → Type*} + [∀ R, MeasurableSpace (γ R)] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) (γ R)) : + ProbabilityTheory.iIndepFun (fun R => X R) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass (Q := Q) c + simpa [I, V] using + (iIndepFun_of_isRestrictionUnitRangeDependent (d := d) (V := V) hP hsep X) + +theorem indepFun_finset_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {γ : Type*} [MeasurableSpace γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (fun a (R : S) => X R a) (fun a (R : T) => X R a) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass (Q := Q) c + simpa [I, V] using + (indepFun_finset_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +theorem indepFun_finsetSum_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {γ : Type*} [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetSum (d := d) (s := S) X) (finsetSum (d := d) (s := T) X) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass (Q := Q) c + simpa [I, V] using + (indepFun_finsetSum_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +theorem indepFun_finsetAverage_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {γ : Type*} [MeasurableSpace γ] [AddCommMonoid γ] [MeasurableAdd₂ γ] + [SMul ℝ γ] [MeasurableConstSMul ℝ γ] + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) + (X : + ∀ R : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}, + MeasurableLocalObservable d (cubeSet R.1) γ) + (S T : Finset {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c}) + (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (finsetAverage (d := d) (s := S) X) (finsetAverage (d := d) (s := T) X) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let V : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (V R) (V S) := by + simpa [I, V] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass (Q := Q) c + simpa [I, V] using + (indepFun_finsetAverage_of_isRestrictionUnitRangeDependent + (d := d) (V := V) hP hsep X S T hST) + +end MeasurableLocalObservable + +/-- Explicit restriction-local spelling for the unchanged raw coefficient-field +observable bundle. -/ +abbrev MeasurableRestrictionLocalObservable (d : ℕ) (U : Set (Vec d)) (β : Type*) + [MeasurableSpace β] := + MeasurableLocalObservable d U β + +namespace MeasurableRestrictionLocalObservable + +export MeasurableLocalObservable (measurable measurable_restrictionSigma + measurable_restrictionSigma_mono mono mono_apply const comp prod pi neg add sub const_smul + finsetPi measurable_subtypeFinsetSum finsetSum finsetAverage comp_restrictCoeffField_eq + map_eq_map_restrictCoeffField map_eq_of_map_restrictCoeffField_eq + measurable_comp_randomCoeffField measurable_comp_randomCoeffField_restrictionSigma + indepFun_of_indep_restrictionSigma integral_map_restrictCoeffField_eq + integral_eq_of_map_restrictCoeffField_eq iIndepFun_of_isRestrictionUnitRangeDependent + indepFun_finset_of_isRestrictionUnitRangeDependent + indepFun_finsetSum_of_isRestrictionUnitRangeDependent + indepFun_finsetAverage_of_isRestrictionUnitRangeDependent + iIndepFun_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finset_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finsetSum_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finsetAverage_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + iIndepFun_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finset_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finsetSum_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + indepFun_finsetAverage_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent) + +variable {β : Type*} [MeasurableSpace β] {d : ℕ} {U : Set (Vec d)} + +/-- The explicit restriction-local spelling of the bundled locality field. -/ +theorem isRestrictionLocal (X : MeasurableRestrictionLocalObservable d U β) : + IsRestrictionLocalObservable U X := + MeasurableLocalObservable.isRestrictionLocal X + +end MeasurableRestrictionLocalObservable + +namespace RandomCoeffField + +variable {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} (A : RandomCoeffField Ω d) + +@[simp] theorem restrictSet_apply (U : Set (Vec d)) (ω : Ω) : + A.restrictSet U ω = restrictCoeffField U (A ω) := + rfl + +theorem law_eq_law_restrictSet_of_isLocalObservable + {β : Type*} [MeasurableSpace β] (μ : MeasureTheory.Measure Ω) + {U : Set (Vec d)} {X : CoeffField d → β} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + MeasureTheory.Measure.map X ((A.restrictSet U).law μ) = + MeasureTheory.Measure.map X (A.law μ) := by + rw [A.law_restrictSet μ U] + exact map_eq_map_restrictCoeffField_of_isRestrictionLocalObservable + (P := A.law μ) hX_meas hX_local + +theorem integral_comp_restrictSet_eq_of_isLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + (μ : MeasureTheory.Measure Ω) {U : Set (Vec d)} {X : CoeffField d → E} + (hX_local : IsRestrictionLocalObservable U X) : + ∫ ω, X ((A.restrictSet U) ω) ∂μ = ∫ ω, X (A ω) ∂μ := by + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall <| fun ω => by + have h := congrFun (comp_restrictCoeffField_eq_of_isRestrictionLocalObservable hX_local) (A ω) + simpa [A.restrictSet_apply] using h + +theorem integral_law_restrictSet_eq_of_isLocalObservable + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + (μ : MeasureTheory.Measure Ω) {U : Set (Vec d)} {X : CoeffField d → E} + (hX_meas : Measurable X) (hX_local : IsRestrictionLocalObservable U X) : + ∫ a, X a ∂((A.restrictSet U).law μ) = ∫ a, X a ∂(A.law μ) := by + rw [A.law_restrictSet μ U] + exact integral_map_restrictCoeffField_eq_of_isRestrictionLocalObservable + (P := A.law μ) hX_meas hX_local + +theorem law_eq_law_restrictSet + {β : Type*} [MeasurableSpace β] (μ : MeasureTheory.Measure Ω) + {U : Set (Vec d)} (X : MeasurableLocalObservable d U β) : + MeasureTheory.Measure.map X ((A.restrictSet U).law μ) = + MeasureTheory.Measure.map X (A.law μ) := by + rw [A.law_restrictSet μ U] + exact X.map_eq_map_restrictCoeffField (P := A.law μ) + +theorem integral_comp_restrictSet_eq + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + (μ : MeasureTheory.Measure Ω) {U : Set (Vec d)} + (X : MeasurableLocalObservable d U E) : + ∫ ω, X ((A.restrictSet U) ω) ∂μ = ∫ ω, X (A ω) ∂μ := by + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall <| fun ω => by + have h := congrFun X.comp_restrictCoeffField_eq (A ω) + simpa [A.restrictSet_apply] using h + +theorem integral_law_restrictSet_eq + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + (μ : MeasureTheory.Measure Ω) {U : Set (Vec d)} + (X : MeasurableLocalObservable d U E) : + ∫ a, X a ∂((A.restrictSet U).law μ) = ∫ a, X a ∂(A.law μ) := by + rw [A.law_restrictSet μ U] + exact X.integral_map_restrictCoeffField_eq (P := A.law μ) + +theorem indepFun_comp_of_indep_restrictionSigma + {β γ : Type*} [MeasurableSpace β] [MeasurableSpace γ] + {μ : MeasureTheory.Measure Ω} {U V : Set (Vec d)} + (hμ : ProbabilityTheory.Indep (A.restrictionSigma U) (A.restrictionSigma V) μ) + (X : MeasurableLocalObservable d U β) (Y : MeasurableLocalObservable d V γ) : + ProbabilityTheory.IndepFun (fun ω => X (A ω)) (fun ω => Y (A ω)) μ := by + exact ProbabilityTheory.indep_of_indep_of_le_right + (m₃ := MeasurableSpace.comap (fun ω => Y (A ω)) inferInstance) + (ProbabilityTheory.indep_of_indep_of_le_left + (m₃ := MeasurableSpace.comap (fun ω => X (A ω)) inferInstance) hμ + (Measurable.comap_le (X.measurable_comp_randomCoeffField_restrictionSigma A))) + (Measurable.comap_le (Y.measurable_comp_randomCoeffField_restrictionSigma A)) + +theorem iIndepFun_comp_of_iIndep_restrictionSigma + {ι : Type*} [DecidableEq ι] {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {μ : MeasureTheory.Measure Ω} {U : ι → Set (Vec d)} + (hμ : ProbabilityTheory.iIndep (fun i => A.restrictionSigma (U i)) μ) + (X : ∀ i, MeasurableLocalObservable d (U i) (β i)) : + ProbabilityTheory.iIndepFun (fun i => fun ω => X i (A ω)) μ := by + rw [ProbabilityTheory.iIndepFun_iff_iIndep] + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + exact (ProbabilityTheory.iIndep_iff (fun i => A.restrictionSigma (U i)) μ).1 hμ s + (fun i hi => + (Measurable.comap_le ((X i).measurable_comp_randomCoeffField_restrictionSigma A)) + (f i) (hf i hi)) + +theorem indepFun_comp_finset_of_iIndep_restrictionSigma + {ι : Type*} [DecidableEq ι] {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {μ : MeasureTheory.Measure Ω} {U : ι → Set (Vec d)} + (hμ : ProbabilityTheory.iIndep (fun i => A.restrictionSigma (U i)) μ) + (X : ∀ i, MeasurableLocalObservable d (U i) (β i)) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (fun ω (i : S) => X i (A ω)) (fun ω (i : T) => X i (A ω)) μ := by + exact (iIndepFun_comp_of_iIndep_restrictionSigma (A := A) hμ X).indepFun_finset S T hST + (fun i => (X i).measurable_comp_randomCoeffField A) + +theorem indepFun_comp_finsetSum_of_iIndep_restrictionSigma + {ι : Type*} [DecidableEq ι] {β : Type*} [MeasurableSpace β] + [AddCommMonoid β] [MeasurableAdd₂ β] + {μ : MeasureTheory.Measure Ω} {U : ι → Set (Vec d)} + (hμ : ProbabilityTheory.iIndep (fun i => A.restrictionSigma (U i)) μ) + (X : ∀ i, MeasurableLocalObservable d (U i) β) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (fun ω => MeasurableLocalObservable.finsetSum (d := d) (s := S) (V := U) X (A ω)) + (fun ω => MeasurableLocalObservable.finsetSum (d := d) (s := T) (V := U) X (A ω)) μ := by + simpa [MeasurableLocalObservable.finsetSum] using! + (indepFun_comp_finset_of_iIndep_restrictionSigma (A := A) hμ X S T hST).comp + (MeasurableLocalObservable.measurable_subtypeFinsetSum S) + (MeasurableLocalObservable.measurable_subtypeFinsetSum T) + +theorem indepFun_comp_finsetAverage_of_iIndep_restrictionSigma + {ι : Type*} [DecidableEq ι] {β : Type*} [MeasurableSpace β] + [AddCommMonoid β] [MeasurableAdd₂ β] [SMul ℝ β] [MeasurableConstSMul ℝ β] + {μ : MeasureTheory.Measure Ω} {U : ι → Set (Vec d)} + (hμ : ProbabilityTheory.iIndep (fun i => A.restrictionSigma (U i)) μ) + (X : ∀ i, MeasurableLocalObservable d (U i) β) + (S T : Finset ι) (hST : Disjoint S T) : + ProbabilityTheory.IndepFun + (fun ω => MeasurableLocalObservable.finsetAverage (d := d) (s := S) (V := U) X (A ω)) + (fun ω => MeasurableLocalObservable.finsetAverage (d := d) (s := T) (V := U) X (A ω)) μ := by + simpa [MeasurableLocalObservable.finsetAverage] using! + (indepFun_comp_finsetSum_of_iIndep_restrictionSigma (A := A) hμ X S T hST).comp + (measurable_const_smul ((S.card : ℝ)⁻¹)) (measurable_const_smul ((T.card : ℝ)⁻¹)) + +end RandomCoeffField + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/OriginCubeSymmetry.lean b/LeanPool/CoarseGraining/Homogenization/Probability/OriginCubeSymmetry.lean new file mode 100644 index 0000000000..fcb80da8ce --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/OriginCubeSymmetry.lean @@ -0,0 +1,76 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCube +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization + +/-! # Origin Cube Symmetry -/ + +@[expose] public section + +namespace Homogenization + +/-- +Coordinate formula for the action of a sign-flip matrix on a vector. +-/ +theorem matVecMul_signFlipMatrix_apply {d : ℕ} (i j : Fin d) (x : Vec d) : + matVecMul (signFlipMatrix i) x j = + (if j = i then (-1 : ℝ) else 1) * x j := by + simpa [signFlipMatrix, matVecMul] using! + (Matrix.mulVec_diagonal (fun k => if k = i then (-1 : ℝ) else 1) x j) + +/-- +Coordinate formula for the action of a swap matrix on a vector. +-/ +theorem matVecMul_swap_eq_comp {d : ℕ} (i j : Fin d) (x : Vec d) : + matVecMul (Matrix.swap ℝ i j) x = x ∘ Equiv.swap i j := by + simpa [matVecMul] using! (Matrix.swap_mulVec (R := ℝ) i j x) + +/-- +The centered open cube `(-3^m/2, 3^m/2)^d` is invariant under coordinate sign flips. + +We record this for `openCubeSet`; the half-open `cubeSet` realization is not literally +sign-flip invariant on boundary points. +-/ +theorem mem_openCubeSet_originCube_signFlipMatrix_iff {d : ℕ} {m : ℤ} {x : Vec d} + (i : Fin d) : + matVecMul (signFlipMatrix i) x ∈ openCubeSet (originCube d m) ↔ + x ∈ openCubeSet (originCube d m) := by + rw [mem_openCubeSet_originCube_iff, mem_openCubeSet_originCube_iff] + constructor + · intro hx j + by_cases hji : j = i + · have hj := hx j + rw [matVecMul_signFlipMatrix_apply, if_pos hji] at hj + constructor <;> nlinarith [hj.1, hj.2] + · simpa [matVecMul_signFlipMatrix_apply, hji] using hx j + · intro hx j + by_cases hji : j = i + · have hj := hx j + have hneg : + ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m < (-1 : ℝ) * x j) ∧ + (((-1 : ℝ) * x j) < (1 / 2 : ℝ) * (3 : ℝ) ^ m) := by + constructor <;> nlinarith [hj.1, hj.2] + simpa [matVecMul_signFlipMatrix_apply, hji] using hneg + · simpa [matVecMul_signFlipMatrix_apply, hji] using hx j + +/-- +The centered open cube `(-3^m/2, 3^m/2)^d` is invariant under coordinate swaps. +-/ +theorem mem_openCubeSet_originCube_swap_iff {d : ℕ} {m : ℤ} {x : Vec d} + (i j : Fin d) : + matVecMul (Matrix.swap ℝ i j) x ∈ openCubeSet (originCube d m) ↔ + x ∈ openCubeSet (originCube d m) := by + rw [mem_openCubeSet_originCube_iff, mem_openCubeSet_originCube_iff, matVecMul_swap_eq_comp] + constructor + · intro hx k + simpa using hx (Equiv.swap i j k) + · intro hx k + simpa using hx (Equiv.swap i j k) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RandomCoeffField.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RandomCoeffField.lean new file mode 100644 index 0000000000..818c28e87f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RandomCoeffField.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomFieldMeasurability + +/-! # Random Coeff Field -/ + +@[expose] public section + +namespace Homogenization + +/-! +Actual random coefficient fields over a sample space. + +The probability layer in the rest of the project is law-centric: the main +objects are measures on `CoeffField d`. This file adds the lightweight bundled +object `RandomCoeffField Ω d` so we can also speak cleanly about measurable +sample-space-valued coefficient fields and the local sigma-algebras they induce +on `Ω`. +-/ + +/-- A coefficient field valued random object on a sample space `Ω`. -/ +structure RandomCoeffField (Ω : Type*) [MeasurableSpace Ω] (d : ℕ) where + /-- The sample-space realization of the coefficient field. -/ + toFun : Ω → CoeffField d + /-- Measurability into the ambient product sigma-algebra on `CoeffField d`. -/ + measurable_toFun : Measurable toFun + +namespace RandomCoeffField + +variable {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + +instance : CoeFun (RandomCoeffField Ω d) (fun _ => Ω → CoeffField d) := ⟨toFun⟩ + +theorem measurable (A : RandomCoeffField Ω d) : Measurable A := + A.measurable_toFun + +@[ext] theorem ext {A B : RandomCoeffField Ω d} (h : ∀ ω, A ω = B ω) : A = B := by + cases A + cases B + simp only [RandomCoeffField.mk.injEq] + exact funext h + +/-- The law of a random coefficient field under a base measure `μ`. -/ +noncomputable def law (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) : + MeasureTheory.Measure (CoeffField d) := + MeasureTheory.Measure.map A μ + +theorem map_law_eq {A : RandomCoeffField Ω d} (μ : MeasureTheory.Measure Ω) + {β : Type*} [MeasurableSpace β] (f : CoeffField d → β) (hf : Measurable f) : + MeasureTheory.Measure.map f (A.law μ) = + MeasureTheory.Measure.map (fun ω => f (A ω)) μ := by + simpa [RandomCoeffField.law, Function.comp] using! + (MeasureTheory.Measure.map_map hf A.measurable (μ := μ)) + +/-- Apply a measurable coefficient-field transform pointwise to a random +coefficient field. -/ +def map (A : RandomCoeffField Ω d) (f : CoeffField d → CoeffField d) + (hf : Measurable f) : RandomCoeffField Ω d where + toFun := fun ω => f (A ω) + measurable_toFun := hf.comp A.measurable + +/-- Integer-translate a random coefficient field. -/ +def translateByInt (A : RandomCoeffField Ω d) (z : Fin d → ℤ) : RandomCoeffField Ω d where + toFun := (A.map (Homogenization.translateByInt z) (measurable_translateByInt z)).toFun + measurable_toFun := + (A.map (Homogenization.translateByInt z) (measurable_translateByInt z)).measurable_toFun + +/-- Rotate a random coefficient field by a signed permutation matrix. -/ +def rotate (A : RandomCoeffField Ω d) (R : Mat d) + (hR : IsSignedPermutationMatrix R) : RandomCoeffField Ω d where + toFun := (A.map (rotateCoeffField R) (measurable_rotateCoeffField R hR)).toFun + measurable_toFun := + (A.map (rotateCoeffField R) (measurable_rotateCoeffField R hR)).measurable_toFun + +/-- Take the adjoint random coefficient field. -/ +def adjoint (A : RandomCoeffField Ω d) : RandomCoeffField Ω d where + toFun := (A.map adjointCoeffField measurable_adjointCoeffField).toFun + measurable_toFun := (A.map adjointCoeffField measurable_adjointCoeffField).measurable_toFun + +/-- Restrict a random coefficient field to a deterministic domain. -/ +noncomputable def restrictSet (A : RandomCoeffField Ω d) (U : Set (Vec d)) : + RandomCoeffField Ω d := + A.map (restrictCoeffField U) (measurable_restrictCoeffField U) + +/-- Take the symmetric part of a random coefficient field. -/ +noncomputable def symmPart (A : RandomCoeffField Ω d) : RandomCoeffField Ω d := + A.map symmCoeffField measurable_symmCoeffField + +/-- Take the skew part of a random coefficient field. -/ +noncomputable def skewPart (A : RandomCoeffField Ω d) : RandomCoeffField Ω d := + A.map skewCoeffField measurable_skewCoeffField + +theorem law_map (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) + (f : CoeffField d → CoeffField d) (hf : Measurable f) : + (A.map f hf).law μ = MeasureTheory.Measure.map f (A.law μ) := by + simpa [RandomCoeffField.map] using! + (A.map_law_eq μ f hf).symm + +theorem law_restrictSet (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) + (U : Set (Vec d)) : + (A.restrictSet U).law μ = MeasureTheory.Measure.map (restrictCoeffField U) (A.law μ) := by + simpa [RandomCoeffField.restrictSet] using + A.law_map μ (restrictCoeffField U) (measurable_restrictCoeffField U) + +theorem law_translateByInt (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) + (z : Fin d → ℤ) : + (A.translateByInt z).law μ = MeasureTheory.Measure.map (Homogenization.translateByInt z) (A.law μ) := by + simpa [RandomCoeffField.translateByInt] using! + (A.map_law_eq μ (Homogenization.translateByInt z) (measurable_translateByInt z)).symm + +theorem law_rotate (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) (R : Mat d) + (hR : IsSignedPermutationMatrix R) : + (A.rotate R hR).law μ = MeasureTheory.Measure.map (rotateCoeffField R) (A.law μ) := by + simpa [RandomCoeffField.rotate] using! + (A.map_law_eq μ (rotateCoeffField R) (measurable_rotateCoeffField R hR)).symm + +theorem law_adjoint (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) : + (A.adjoint).law μ = MeasureTheory.Measure.map adjointCoeffField (A.law μ) := by + simpa [RandomCoeffField.adjoint] using! + (A.map_law_eq μ adjointCoeffField measurable_adjointCoeffField).symm + +theorem law_symmPart (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) : + (A.symmPart).law μ = MeasureTheory.Measure.map symmCoeffField (A.law μ) := by + simpa [RandomCoeffField.symmPart] using + A.law_map μ symmCoeffField measurable_symmCoeffField + +theorem law_skewPart (A : RandomCoeffField Ω d) (μ : MeasureTheory.Measure Ω) : + (A.skewPart).law μ = MeasureTheory.Measure.map skewCoeffField (A.law μ) := by + simpa [RandomCoeffField.skewPart] using + A.law_map μ skewCoeffField measurable_skewCoeffField +/-- The pointwise-local sigma-algebra on the sample space induced by a random +coefficient field and the deterministic region `U`. This belongs to the +retained restriction engineering lane. -/ +def pointwiseLocalSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : MeasurableSpace Ω := + (PointwiseLocalSigma U).comap A + +/-- Compatibility name for `pointwiseLocalSigma`. -/ +abbrev localSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : MeasurableSpace Ω := + A.pointwiseLocalSigma U +/-- The restriction sigma-algebra on the sample space induced by a random +coefficient field and the deterministic region `U`. This is the pullback of +`RestrictionSigma U`, hence the sigma-algebra naturally matched to pointwise +local observables. -/ +noncomputable def restrictionSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : + MeasurableSpace Ω := + (RestrictionSigma U).comap A + +theorem measurable_pointwiseLocalSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : + @Measurable Ω (CoeffField d) (A.pointwiseLocalSigma U) (PointwiseLocalSigma U) A := + comap_measurable A + +/-- Compatibility spelling for `measurable_pointwiseLocalSigma`. -/ +theorem measurable_localSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : + @Measurable Ω (CoeffField d) (A.localSigma U) (LocalSigma U) A := + A.measurable_pointwiseLocalSigma U + +theorem measurable_restrictionSigma (A : RandomCoeffField Ω d) (U : Set (Vec d)) : + @Measurable Ω (CoeffField d) (A.restrictionSigma U) (RestrictionSigma U) A := + comap_measurable A + +theorem measurable_localTestObservable_pointwiseLocalSigma + (A : RandomCoeffField Ω d) (U : Set (Vec d)) + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable Ω ℝ (A.pointwiseLocalSigma U) (borel ℝ) + (fun ω => localTestObservable e e' φ (A ω)) := by + exact + (measurable_localTestObservable_localSigma (U := U) e e' hφ_cont hφ_compact hφ_support).comp + (measurable_pointwiseLocalSigma (A := A) U) + +/-- Compatibility spelling for the pointwise-local test-observable theorem. -/ +theorem measurable_localTestObservable (A : RandomCoeffField Ω d) (U : Set (Vec d)) + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable Ω ℝ (A.localSigma U) (borel ℝ) + (fun ω => localTestObservable e e' φ (A ω)) := + A.measurable_localTestObservable_pointwiseLocalSigma U e e' hφ_cont hφ_compact hφ_support + +end RandomCoeffField + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RandomField.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RandomField.lean new file mode 100644 index 0000000000..d8f0c769a3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RandomField.lean @@ -0,0 +1,579 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Probability.Scalarization +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +public import Mathlib.LinearAlgebra.Matrix.Symmetric +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Integral.Bochner.Basic +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic +public import Mathlib.Probability.Independence.Basic +public import Mathlib.Topology.Algebra.Support +public import Mathlib.Topology.MetricSpace.Bounded + +/-! # Random Field -/ + +@[expose] public section + +namespace Homogenization + +instance instMeasurableSpaceVec (d : ℕ) : MeasurableSpace (Vec d) := by + change MeasurableSpace (Fin d → ℝ) + infer_instance + +instance instMeasurableSpaceMat (d : ℕ) : MeasurableSpace (Mat d) := by + change MeasurableSpace (Fin d → Fin d → ℝ) + infer_instance + +def IsLocallyUniformlyElliptic {d : ℕ} (a : CoeffField d) : Prop := + ∀ R : ℝ, 1 ≤ R → + ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ + IsEllipticFieldOn ε ε⁻¹ (Metric.closedBall (0 : Vec d) R) a + +noncomputable def localTestObservable {d : ℕ} (e e' : Vec d) (φ : Vec d → ℝ) + (a : CoeffField d) : ℝ := + ∫ x, (vecDot e' (matVecMul (a x) e) * φ x) ∂MeasureTheory.volume + +/-- A finite local test observable, with the finite sum kept inside the +integral. This avoids using additivity of the Bochner integral for arbitrary +coefficient fields. -/ +noncomputable def localFiniteTestObservable {d : ℕ} {ι : Type} (s : Finset ι) + (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) (a : CoeffField d) : ℝ := + ∫ x, (∑ k ∈ s, vecDot (e' k) (matVecMul (a x) (e k)) * φ k x) + ∂MeasureTheory.volume + +/-- Two coefficient fields agree on all points of an observation set. This is +the pointwise locality relation retained by the restriction engineering lane. -/ +def PointwiseAgreementOn {d : ℕ} (U : Set (Vec d)) (a b : CoeffField d) : Prop := + ∀ x, x ∈ U → a x = b x + +/-- Compatibility name for `PointwiseAgreementOn`. -/ +abbrev LocalAgreementOn {d : ℕ} (U : Set (Vec d)) (a b : CoeffField d) : Prop := + PointwiseAgreementOn U a b + +/-- A coefficient-field event determined by the values of the field on `U`. +This is pointwise-local information in the retained restriction lane. -/ +def IsPointwiseLocalEvent {d : ℕ} (U : Set (Vec d)) (s : Set (CoeffField d)) : Prop := + ∀ ⦃a b : CoeffField d⦄, PointwiseAgreementOn U a b → (a ∈ s ↔ b ∈ s) + +/-- Compatibility name for `IsPointwiseLocalEvent`. -/ +abbrev IsLocalEvent {d : ℕ} (U : Set (Vec d)) (s : Set (CoeffField d)) : Prop := + IsPointwiseLocalEvent U s +/-- The sigma-algebra generated by pointwise-local events on `U`. It belongs +to the retained restriction engineering lane and remains distinct from the +restriction-comap sigma-algebra `RestrictionSigma U`. -/ +def PointwiseLocalSigma {d : ℕ} (U : Set (Vec d)) : MeasurableSpace (CoeffField d) := + MeasurableSpace.generateFrom {s | IsPointwiseLocalEvent U s} + +/-- Compatibility name for `PointwiseLocalSigma`. -/ +abbrev LocalSigma {d : ℕ} (U : Set (Vec d)) : MeasurableSpace (CoeffField d) := + PointwiseLocalSigma U +/-- The pointwise (product) σ-algebra on coefficient fields: the smallest σ-algebra +making every coordinate evaluation `a ↦ a x` measurable. -/ +def pointwiseCoeffFieldMeasurableSpace (d : ℕ) : MeasurableSpace (CoeffField d) := + MeasurableSpace.pi +/-- The bounded-local σ-algebra on coefficient fields: local events over +bounded observation sets. This deliberately excludes unbounded regions such as +`Set.univ`; including `LocalSigma Set.univ` would make the ambient coefficient +space discrete and would rule out genuine infinite-product random fields. -/ +def boundedLocalCoeffFieldMeasurableSpace (d : ℕ) : MeasurableSpace (CoeffField d) := + ⨆ U : {U : Set (Vec d) // Bornology.IsBounded U}, LocalSigma U.1 + +/-- The ambient σ-algebra on coefficient fields: the pointwise σ-algebra joined +with bounded local coefficient-field information. This keeps every coordinate +evaluation measurable while making the bounded local events used by compact +tests and triadic cubes measurable. -/ +instance instMeasurableSpaceCoeffField (d : ℕ) : MeasurableSpace (CoeffField d) := + pointwiseCoeffFieldMeasurableSpace d ⊔ boundedLocalCoeffFieldMeasurableSpace d +/-- The sigma-algebra on coefficient space induced by restricting the field to +the deterministic set `U`. This is the measurable local sigma algebra used for +unit-range dependence of genuine random fields. -/ +noncomputable def RestrictionSigma {d : ℕ} (U : Set (Vec d)) : MeasurableSpace (CoeffField d) := + MeasurableSpace.comap (restrictCoeffField U) inferInstance + +theorem pointwise_le_coeffField (d : ℕ) : + pointwiseCoeffFieldMeasurableSpace d ≤ instMeasurableSpaceCoeffField d := + le_sup_left + +/-- The ambient→bounded-local bridge: every local event over a bounded +observation set is ambient-measurable. -/ +theorem localSigma_le_coeffField_of_isBounded {d : ℕ} {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : + LocalSigma U ≤ instMeasurableSpaceCoeffField d := + le_trans + (le_iSup (fun U : {U : Set (Vec d) // Bornology.IsBounded U} => + LocalSigma U.1) ⟨U, hU⟩) + le_sup_right + +/-- Coordinate evaluation is ambient-measurable (it factors through the pointwise +σ-algebra). -/ +theorem measurable_coeffField_eval {d : ℕ} (y : Vec d) : + Measurable (fun a : CoeffField d => a y) := + (measurable_pi_apply y).mono (pointwise_le_coeffField d) le_rfl + +/-- A self-map of coefficient fields is ambient-measurable if it is measurable +into the pointwise σ-algebra and into every local sigma algebra. -/ +theorem measurable_coeffField_to_ambient {d : ℕ} {f : CoeffField d → CoeffField d} + (hpt : @Measurable _ _ (instMeasurableSpaceCoeffField d) + (pointwiseCoeffFieldMeasurableSpace d) f) + (hloc : ∀ U : Set (Vec d), Bornology.IsBounded U → + @Measurable _ _ (instMeasurableSpaceCoeffField d) (LocalSigma U) f) : + Measurable f := by + rw [measurable_iff_comap_le] + show (pointwiseCoeffFieldMeasurableSpace d ⊔ boundedLocalCoeffFieldMeasurableSpace d).comap f + ≤ instMeasurableSpaceCoeffField d + rw [MeasurableSpace.comap_sup, boundedLocalCoeffFieldMeasurableSpace, + MeasurableSpace.comap_iSup] + exact sup_le hpt.comap_le (iSup_le fun U => (hloc U.1 U.2).comap_le) + +/-- A map from an arbitrary measurable space into coefficient fields is +ambient-measurable if it is pointwise-measurable and measurable into every +bounded local sigma algebra. -/ +theorem measurable_to_coeffField_ambient {α : Type*} [mα : MeasurableSpace α] {d : ℕ} + {f : α → CoeffField d} + (hpt : @Measurable _ _ mα (pointwiseCoeffFieldMeasurableSpace d) f) + (hloc : ∀ U : Set (Vec d), Bornology.IsBounded U → + @Measurable _ _ mα (LocalSigma U) f) : + Measurable f := by + rw [measurable_iff_comap_le] + show (pointwiseCoeffFieldMeasurableSpace d ⊔ boundedLocalCoeffFieldMeasurableSpace d).comap f + ≤ mα + rw [MeasurableSpace.comap_sup, boundedLocalCoeffFieldMeasurableSpace, + MeasurableSpace.comap_iSup] + exact sup_le hpt.comap_le (iSup_le fun U => (hloc U.1 U.2).comap_le) + +theorem localTestObservable_eq_localFiniteTestObservable {d : ℕ} + (e e' : Vec d) (φ : Vec d → ℝ) : + localTestObservable e e' φ = + localFiniteTestObservable ({()} : Finset Unit) (fun _ => e) (fun _ => e') + (fun _ => φ) := by + funext a + simp [localTestObservable, localFiniteTestObservable] + +/-- A finite test observable is measurable for the local sigma algebra on any +set containing the supports of all scalar probes in the finite sum. -/ +theorem measurable_localFiniteTestObservable_localSigma {d : ℕ} {U : Set (Vec d)} + {ι : Type} {I : Finset ι} {e e' : ι → Vec d} {φ : ι → Vec d → ℝ} + (hφ_support : ∀ k ∈ I, Function.support (φ k) ⊆ U) : + @Measurable (CoeffField d) ℝ (LocalSigma U) (borel ℝ) + (localFiniteTestObservable I e e' φ) := by + intro t _ht + refine MeasurableSpace.measurableSet_generateFrom ?_ + intro a b hab + simp only [Set.mem_preimage] + have hEq : + localFiniteTestObservable I e e' φ a = + localFiniteTestObservable I e e' φ b := by + unfold localFiniteTestObservable + apply MeasureTheory.integral_congr_ae + filter_upwards with x + by_cases hxU : x ∈ U + · simp [hab x hxU] + · have hzero : ∀ k ∈ I, φ k x = 0 := by + intro k hk + by_contra hkx + exact hxU (hφ_support k hk (by simpa [Function.support] using hkx)) + apply Finset.sum_congr rfl + intro k hk + rw [hzero k hk] + ring + rw [hEq] + +theorem PointwiseAgreementOn.mono {d : ℕ} {U V : Set (Vec d)} {a b : CoeffField d} + (hUV : U ⊆ V) (h : PointwiseAgreementOn V a b) : + PointwiseAgreementOn U a b := + fun x hx => h x (hUV hx) + +/-- Compatibility spelling for `PointwiseAgreementOn.mono`. -/ +theorem LocalAgreementOn.mono {d : ℕ} {U V : Set (Vec d)} {a b : CoeffField d} + (hUV : U ⊆ V) (h : LocalAgreementOn V a b) : + LocalAgreementOn U a b := + PointwiseAgreementOn.mono hUV h + +theorem isBounded_image_of_continuous_vec {d : ℕ} + {f : Vec d → Vec d} (hf : Continuous f) {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : + Bornology.IsBounded (f '' U) := by + have hcompact : IsCompact (closure U) := hU.isCompact_closure + exact (hcompact.image hf).isBounded.subset (Set.image_mono subset_closure) + +/-- A self-map `T` of coefficient fields is measurable into `LocalSigma U` when +its values on `U` are determined by the input field on some source region. -/ +theorem measurable_localSigma_of_local {d : ℕ} {T : CoeffField d → CoeffField d} + (h : ∀ U : Set (Vec d), Bornology.IsBounded U → + ∃ V : Set (Vec d), Bornology.IsBounded V ∧ + ∀ ⦃a b : CoeffField d⦄, LocalAgreementOn V a b → + LocalAgreementOn U (T a) (T b)) + (U : Set (Vec d)) (hU : Bornology.IsBounded U) : + @Measurable _ _ (instMeasurableSpaceCoeffField d) (LocalSigma U) T := by + refine measurable_generateFrom fun s hs => ?_ + rcases h U hU with ⟨V, hV_bdd, hV⟩ + have hpre : @MeasurableSet (CoeffField d) (LocalSigma V) (T ⁻¹' s) := + MeasurableSpace.measurableSet_generateFrom + (by + intro a b hab + exact hs (hV hab)) + exact localSigma_le_coeffField_of_isBounded hV_bdd _ hpre + +/-- `localTestObservable e e' φ` is `LocalSigma U`-measurable when `tsupport φ ⊆ U`. -/ +theorem measurable_localTestObservable_localSigma {d : ℕ} {U : Set (Vec d)} + (e e' : Vec d) {φ : Vec d → ℝ} (_hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (_hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable (CoeffField d) ℝ (LocalSigma U) (borel ℝ) (localTestObservable e e' φ) := by + rw [localTestObservable_eq_localFiniteTestObservable] + refine measurable_localFiniteTestObservable_localSigma ?_ + intro k hk x hx + exact hφ_support (subset_tsupport φ hx) + +/-- The generator set `localTestObservable e e' φ ⁻¹' t` is `LocalSigma U`-measurable. -/ +theorem preimage_localTestObservable_mem_localSigma {d : ℕ} {U : Set (Vec d)} + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) + {t : Set ℝ} (ht : MeasurableSet t) : + @MeasurableSet (CoeffField d) (LocalSigma U) (localTestObservable e e' φ ⁻¹' t) := + measurable_localTestObservable_localSigma e e' hφ_cont hφ_compact hφ_support ht + +/-- `localTestObservable e e' φ` is ambient-measurable. -/ +theorem measurable_localTestObservable {d : ℕ} + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) : + Measurable (localTestObservable (d := d) e e' φ) := + (measurable_localTestObservable_localSigma (U := tsupport φ) e e' hφ_cont hφ_compact + subset_rfl).mono + (localSigma_le_coeffField_of_isBounded hφ_compact.isCompact.isBounded) le_rfl + +def translateByInt {d : ℕ} (z : Fin d → ℤ) : CoeffField d → CoeffField d := + translateCoeffField (intVecToRealVec z) + +def IsStationary {d : ℕ} (P : MeasureTheory.Measure (CoeffField d)) : Prop := + ∀ z : Fin d → ℤ, MeasureTheory.Measure.map (translateByInt z) P = P + +def AreUnitSeparated {d : ℕ} (U V : Set (Vec d)) : Prop := + ∀ ⦃x y : Vec d⦄, x ∈ U → y ∈ V → 1 ≤ dist x y + +def IsRestrictionUnitRangeDependent {d : ℕ} + (P : MeasureTheory.Measure (CoeffField d)) : Prop := + ∀ U V : Set (Vec d), AreUnitSeparated U V → + ProbabilityTheory.Indep (RestrictionSigma U) (RestrictionSigma V) P + +/-- Compatibility name for `IsRestrictionUnitRangeDependent`. -/ +abbrev IsUnitRangeDependent {d : ℕ} (P : MeasureTheory.Measure (CoeffField d)) : Prop := + IsRestrictionUnitRangeDependent P + +private theorem matVecMul_one {d : ℕ} (x : Vec d) : + matVecMul (1 : Mat d) x = x := by + ext i + unfold matVecMul + rw [Finset.sum_eq_single i] + · simp + · intro j _ hji + have hij : i ≠ j := fun h => hji h.symm + simp [hij] + · intro hi + exact (hi (Finset.mem_univ i)).elim + +def rotateCoeffField {d : ℕ} (R : Mat d) (a : CoeffField d) : CoeffField d := + fun x => (matTranspose R) * (a (matVecMul R x)) * R + +def adjointCoeffField {d : ℕ} (a : CoeffField d) : CoeffField d := + fun x => matTranspose (a x) + +private theorem localTestObservable_rotateCoeffField_signedPermutation {d : ℕ} + {R : Mat d} (hR : IsSignedPermutationMatrix R) (e e' : Vec d) (φ : Vec d → ℝ) + (a : CoeffField d) : + localTestObservable e e' φ (rotateCoeffField R a) = + localTestObservable (matVecMul R e) (matVecMul R e') + (fun y : Vec d => φ (matVecMul (matTranspose R) y)) a := by + let g : Vec d → ℝ := fun y => + vecDot (matVecMul R e') (matVecMul (a y) (matVecMul R e)) * + φ (matVecMul (matTranspose R) y) + have hcv := (measurePreserving_matVecMul_signedPermutation hR).integral_comp + (signedPermutationHomeomorph R hR).measurableEmbedding g + have hleft : + (∫ x, (vecDot e' (matVecMul (rotateCoeffField R a x) e) * φ x) + ∂MeasureTheory.volume) = + ∫ x, g (matVecMul R x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hback : matVecMul (matTranspose R) (matVecMul R x) = x := by + rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one] + have halg : + vecDot e' (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) e) = + vecDot (matVecMul R e') (matVecMul (a (matVecMul R x)) (matVecMul R e)) := by + calc + vecDot e' (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) e) + = vecDot e' + (matVecMul ((matTranspose R) * (a (matVecMul R x))) (matVecMul R e)) := by + rw [← matVecMul_mul] + _ = vecDot e' + (matVecMul (matTranspose R) + (matVecMul (a (matVecMul R x)) (matVecMul R e))) := by + rw [← matVecMul_mul] + _ = vecDot (matVecMul R e') + (matVecMul (a (matVecMul R x)) (matVecMul R e)) := by + rw [vecDot_matVecMul_transpose] + simp [g, rotateCoeffField, hback, halg] + unfold localTestObservable + calc + ∫ x, (vecDot e' (matVecMul (rotateCoeffField R a x) e) * φ x) + ∂MeasureTheory.volume + = ∫ x, g (matVecMul R x) ∂MeasureTheory.volume := hleft + _ = ∫ y, g y ∂MeasureTheory.volume := hcv + _ = ∫ y, (vecDot (matVecMul R e') (matVecMul (a y) (matVecMul R e)) * + φ (matVecMul (matTranspose R) y)) ∂MeasureTheory.volume := rfl + +private theorem localFiniteTestObservable_rotateCoeffField_signedPermutation {d : ℕ} + {ι : Type} {R : Mat d} (hR : IsSignedPermutationMatrix R) (I : Finset ι) + (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) (a : CoeffField d) : + localFiniteTestObservable I e e' φ (rotateCoeffField R a) = + localFiniteTestObservable I + (fun k => matVecMul R (e k)) + (fun k => matVecMul R (e' k)) + (fun k y => φ k (matVecMul (matTranspose R) y)) a := by + let g : Vec d → ℝ := fun y => + ∑ k ∈ I, + vecDot (matVecMul R (e' k)) (matVecMul (a y) (matVecMul R (e k))) * + φ k (matVecMul (matTranspose R) y) + have hcv := (measurePreserving_matVecMul_signedPermutation hR).integral_comp + (signedPermutationHomeomorph R hR).measurableEmbedding g + have hleft : + (∫ x, (∑ k ∈ I, + vecDot (e' k) (matVecMul (rotateCoeffField R a x) (e k)) * φ k x) + ∂MeasureTheory.volume) = + ∫ x, g (matVecMul R x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hback : matVecMul (matTranspose R) (matVecMul R x) = x := by + rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one] + have hterm : ∀ k : ι, + vecDot (e' k) + (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) (e k)) = + vecDot (matVecMul R (e' k)) + (matVecMul (a (matVecMul R x)) (matVecMul R (e k))) := by + intro k + calc + vecDot (e' k) + (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) (e k)) + = vecDot (e' k) + (matVecMul ((matTranspose R) * (a (matVecMul R x))) + (matVecMul R (e k))) := by + rw [← matVecMul_mul] + _ = vecDot (e' k) + (matVecMul (matTranspose R) + (matVecMul (a (matVecMul R x)) (matVecMul R (e k)))) := by + rw [← matVecMul_mul] + _ = vecDot (matVecMul R (e' k)) + (matVecMul (a (matVecMul R x)) (matVecMul R (e k))) := by + rw [vecDot_matVecMul_transpose] + simp [g, rotateCoeffField, hback, hterm] + unfold localFiniteTestObservable + calc + ∫ x, (∑ k ∈ I, vecDot (e' k) (matVecMul (rotateCoeffField R a x) (e k)) * φ k x) + ∂MeasureTheory.volume + = ∫ x, g (matVecMul R x) ∂MeasureTheory.volume := hleft + _ = ∫ y, g y ∂MeasureTheory.volume := hcv + _ = ∫ y, (∑ k ∈ I, + vecDot (matVecMul R (e' k)) (matVecMul (a y) (matVecMul R (e k))) * + φ k (matVecMul (matTranspose R) y)) ∂MeasureTheory.volume := rfl + +theorem measurable_rotateCoeffField {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) : + Measurable (rotateCoeffField (d := d) R) := by + refine measurable_coeffField_to_ambient ?_ ?_ + · -- into the pointwise σ-algebra: each coordinate is a (matrix-algebra) combination + -- of evaluations of `a` at `R x`. + refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + let f : Fin d → CoeffField d → ℝ := + fun l a => ∑ k ∈ Finset.univ, (matTranspose R) i k * (a (matVecMul R x) k l * R l j) + have hf : ∀ l ∈ Finset.univ, Measurable (f l) := by + intro l hl + refine Finset.measurable_sum (s := Finset.univ) + (f := fun k => fun a : CoeffField d => + (matTranspose R) i k * (a (matVecMul R x) k l * R l j)) ?_ + intro k hk + have hEval : Measurable (fun a : CoeffField d => a (matVecMul R x) k l) := + ((measurable_coeffField_eval (matVecMul R x)).eval).eval + exact measurable_const.mul (hEval.mul measurable_const) + simpa [rotateCoeffField, f, Matrix.mul_apply, Finset.mul_sum, Finset.sum_mul, mul_assoc] + using (Finset.measurable_sum (s := Finset.univ) (f := f) hf) + · -- into each `LocalSigma U`: values on `U` depend only on the input field + -- on the signed-permutation image of `U`. + intro U hU + refine measurable_localSigma_of_local (T := rotateCoeffField R) ?_ U hU + intro V hV + refine ⟨{y : Vec d | matVecMul (matTranspose R) y ∈ V}, ?_, ?_⟩ + · have himage : + Bornology.IsBounded ((fun x : Vec d => matVecMul R x) '' V) := + isBounded_image_of_continuous_vec (signedPermutationHomeomorph R hR).continuous_toFun hV + refine himage.subset ?_ + intro y hy + refine ⟨matVecMul (matTranspose R) y, hy, ?_⟩ + change matVecMul R (matVecMul (matTranspose R) y) = y + rw [matVecMul_mul, hR.mul_transpose_self, matVecMul_one] + intro a b hab x hx + have hback : matVecMul (matTranspose R) (matVecMul R x) = x := by + rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one] + have hpoint : a (matVecMul R x) = b (matVecMul R x) := by + exact hab (matVecMul R x) (by simpa [hback] using hx) + simp [rotateCoeffField, hpoint] + +/-- The adjoint pulls a local test back to the test with `e, e'` swapped (same +test function, same region). -/ +theorem localTestObservable_adjoint {d : ℕ} (e e' : Vec d) (φ : Vec d → ℝ) + (a : CoeffField d) : + localTestObservable e e' φ (adjointCoeffField a) = localTestObservable e' e φ a := by + unfold localTestObservable + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall fun x => ?_) + simp only [adjointCoeffField] + rw [vecDot_matVecMul_transpose, vecDot_comm] + +theorem localFiniteTestObservable_adjoint {d : ℕ} {ι : Type} (I : Finset ι) + (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) (a : CoeffField d) : + localFiniteTestObservable I e e' φ (adjointCoeffField a) = + localFiniteTestObservable I e' e φ a := by + unfold localFiniteTestObservable + apply MeasureTheory.integral_congr_ae + filter_upwards with x + apply Finset.sum_congr rfl + intro k _hk + congr 1 + simp only [adjointCoeffField] + rw [vecDot_matVecMul_transpose, vecDot_comm] + +theorem measurable_adjointCoeffField {d : ℕ} : + Measurable (adjointCoeffField (d := d)) := by + refine measurable_coeffField_to_ambient ?_ ?_ + · -- into the pointwise σ-algebra: each coordinate is an evaluation + refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + have hx : Measurable (fun a : CoeffField d => a x) := measurable_coeffField_eval x + simpa [adjointCoeffField, matTranspose] using hx.eval.eval + · -- into each `LocalSigma U`: adjoint is pointwise in the same spatial variable. + intro U hU + refine measurable_localSigma_of_local (T := adjointCoeffField) ?_ U hU + intro V hV + refine ⟨V, hV, ?_⟩ + intro a b hab x hx + simp [adjointCoeffField, hab x hx] + +def IsIsotropicInLaw {d : ℕ} (P : MeasureTheory.Measure (CoeffField d)) : Prop := + ∀ R : Mat d, IsSignedPermutationMatrix R → + MeasureTheory.Measure.map (rotateCoeffField R) P = P + +def IsAdjointInvariantInLaw {d : ℕ} (P : MeasureTheory.Measure (CoeffField d)) : Prop := + MeasureTheory.Measure.map adjointCoeffField P = P + +theorem integral_comp_eq_of_map_eq {α : Type*} [MeasurableSpace α] + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : MeasureTheory.Measure α} {f : α → α} (hf : Measurable f) + (hmap : MeasureTheory.Measure.map f P = P) (g : α → E) + (hg : MeasureTheory.AEStronglyMeasurable g P) : + ∫ a, g (f a) ∂P = ∫ a, g a ∂P := by + have hgm : MeasureTheory.AEStronglyMeasurable g (MeasureTheory.Measure.map f P) := by + simpa [hmap] using hg + rw [← MeasureTheory.integral_map hf.aemeasurable hgm, hmap] + +theorem isSignedPermutationMatrix_signFlipMatrix {d : ℕ} (i : Fin d) : + IsSignedPermutationMatrix (signFlipMatrix i) := by + refine ⟨Equiv.refl _, fun j => if j = i then (-1 : ℝ) else 1, ?_, ?_⟩ + · intro j + by_cases h : j = i <;> simp [h] + · intro r c + by_cases h : r = c + · subst c + by_cases hi : r = i <;> simp [signFlipMatrix, hi] + · simp [signFlipMatrix, h] + +theorem isSignedPermutationMatrix_swap {d : ℕ} (i j : Fin d) : + IsSignedPermutationMatrix (Matrix.swap ℝ i j) := by + refine ⟨Equiv.swap i j, fun _ => (1 : ℝ), ?_, ?_⟩ + · intro k + exact Or.inl rfl + · intro r c + by_cases h : r = Equiv.swap i j c + · have h' : c = Equiv.swap i j r := by + simpa using congrArg (Equiv.swap i j) h.symm + rw [if_pos h] + subst h' + simp [Matrix.swap] + · have hSwap : (Equiv.swap i j) r ≠ c := by + intro hrc + apply h + simpa using (congrArg (Equiv.swap i j) hrc.symm).symm + rw [if_neg h] + simp [Matrix.swap, hSwap] + +theorem IsIsotropicInLaw.map_rotateCoeffField_signFlipMatrix {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsIsotropicInLaw P) (i : Fin d) : + MeasureTheory.Measure.map (rotateCoeffField (signFlipMatrix i)) P = P := + hP _ (isSignedPermutationMatrix_signFlipMatrix i) + +theorem IsIsotropicInLaw.map_rotateCoeffField_swap {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsIsotropicInLaw P) + (i j : Fin d) : + MeasureTheory.Measure.map (rotateCoeffField (Matrix.swap ℝ i j)) P = P := + hP _ (isSignedPermutationMatrix_swap i j) + +theorem integral_comp_rotateCoeffField_eq_of_isIsotropicInLaw {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsIsotropicInLaw P) + {R : Mat d} (hR : IsSignedPermutationMatrix R) (f : CoeffField d → E) + (hf : MeasureTheory.AEStronglyMeasurable f P) : + ∫ a, f (rotateCoeffField R a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq (measurable_rotateCoeffField R hR) (hP R hR) f hf + +theorem integrable_comp_rotateCoeffField_of_isIsotropicInLaw {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsIsotropicInLaw P) + {R : Mat d} (hR : IsSignedPermutationMatrix R) (f : CoeffField d → E) + (hf : MeasureTheory.Integrable f P) : + MeasureTheory.Integrable (fun a => f (rotateCoeffField R a)) P := by + have hfMap : MeasureTheory.Integrable f (MeasureTheory.Measure.map (rotateCoeffField R) P) := by + simpa [hP R hR] using hf + exact hfMap.comp_measurable (measurable_rotateCoeffField R hR) + +theorem integral_comp_adjointCoeffField_eq_of_isAdjointInvariantInLaw {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsAdjointInvariantInLaw P) + (f : CoeffField d → E) (hf : MeasureTheory.AEStronglyMeasurable f P) : + ∫ a, f (adjointCoeffField a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq measurable_adjointCoeffField hP f hf + +theorem integrable_comp_adjointCoeffField_of_isAdjointInvariantInLaw {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsAdjointInvariantInLaw P) + (f : CoeffField d → E) (hf : MeasureTheory.Integrable f P) : + MeasureTheory.Integrable (fun a => f (adjointCoeffField a)) P := by + have hfMap : MeasureTheory.Integrable f (MeasureTheory.Measure.map adjointCoeffField P) := by + exact hP.symm ▸ hf + exact hfMap.comp_measurable measurable_adjointCoeffField + +def IsRestrictionLocalObservable {β : Type*} {d : ℕ} (U : Set (Vec d)) + (X : CoeffField d → β) : Prop := + ∀ ⦃a₁ a₂ : CoeffField d⦄, (∀ x ∈ U, a₁ x = a₂ x) → X a₁ = X a₂ + +/-- Compatibility name for `IsRestrictionLocalObservable`. -/ +abbrev IsLocalObservable {β : Type*} {d : ℕ} (U : Set (Vec d)) + (X : CoeffField d → β) : Prop := + IsRestrictionLocalObservable U X + +def IsTranslationCovariant {β : Type*} {d : ℕ} + (X : Set (Vec d) → CoeffField d → β) : Prop := + ∀ (U : Set (Vec d)) (z : Fin d → ℤ) (a : CoeffField d), + X (translateSet (intVecToRealVec z) U) a = X U (translateByInt z a) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RandomFieldMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RandomFieldMeasurability.lean new file mode 100644 index 0000000000..2b7edd6751 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RandomFieldMeasurability.lean @@ -0,0 +1,545 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeColoring +public import LeanPool.CoarseGraining.Homogenization.Geometry.ScaleColoring +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import Mathlib.Analysis.Calculus.ContDiff.Operations + +/-! # Random Field Measurability -/ + +@[expose] public section + +namespace Homogenization + +/-! +Foundational measurability lemmas for coefficient fields viewed as the sample +space of the probability layer. + +This file stays deliberately law-centric: the primitive random object remains a +measure on `CoeffField d`. The role of the present API is to expose the basic +measurable coefficient-field transforms and the `LocalSigma` measurability of +the generator observables used to define locality in law. +-/ + +theorem measurable_coeffField_entry {d : ℕ} (x : Vec d) (i j : Fin d) : + Measurable (fun a : CoeffField d => a x i j) := by + have hMat : Measurable (fun a : CoeffField d => a x) := + measurable_coeffField_eval (d := d) x + have hRow : Measurable (fun a : CoeffField d => (a x) i) := Measurable.eval hMat + exact Measurable.eval hRow + +theorem measurable_restrictCoeffField {d : ℕ} (U : Set (Vec d)) : + Measurable (restrictCoeffField (d := d) U) := by + classical + refine measurable_coeffField_to_ambient ?_ (fun V hV => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + by_cases hx : x ∈ U + · simpa [restrictCoeffField, hx] using measurable_coeffField_entry (d := d) x i j + · simp [restrictCoeffField, hx] + · refine measurable_localSigma_of_local (T := restrictCoeffField U) ?_ V hV + intro W hW + refine ⟨U ∩ W, hW.subset Set.inter_subset_right, ?_⟩ + intro a b hab x hxW + by_cases hxU : x ∈ U + · simp [restrictCoeffField, hxU, hab x ⟨hxU, hxW⟩] + · simp [restrictCoeffField, hxU] + +theorem restrictionSigma_le_coeffField {d : ℕ} (U : Set (Vec d)) : + RestrictionSigma U ≤ instMeasurableSpaceCoeffField d := + measurable_iff_comap_le.mp (measurable_restrictCoeffField U) + +theorem measurable_restrictCoeffField_restrictionSigma {d : ℕ} (U : Set (Vec d)) : + @Measurable (CoeffField d) (CoeffField d) (RestrictionSigma U) _ (restrictCoeffField U) := + comap_measurable (restrictCoeffField U) + +theorem restrictCoeffField_comp_restrictCoeffField_of_subset {d : ℕ} + {U V : Set (Vec d)} (hUV : U ⊆ V) : + restrictCoeffField U ∘ restrictCoeffField V = restrictCoeffField U := by + funext a x + by_cases hx : x ∈ U + · have hxV : x ∈ V := hUV hx + simp [Function.comp, restrictCoeffField, hx, hxV] + · simp [Function.comp, restrictCoeffField, hx] + +theorem measurable_restrictCoeffField_restrictionSigma_of_subset {d : ℕ} + {U V : Set (Vec d)} (hUV : U ⊆ V) : + @Measurable (CoeffField d) (CoeffField d) (RestrictionSigma V) _ + (restrictCoeffField U) := by + simpa [restrictCoeffField_comp_restrictCoeffField_of_subset hUV, Function.comp] using + (measurable_restrictCoeffField U).comp + (measurable_restrictCoeffField_restrictionSigma (d := d) V) + +theorem RestrictionSigma_mono {d : ℕ} {U V : Set (Vec d)} (hUV : U ⊆ V) : + RestrictionSigma U ≤ RestrictionSigma V := by + simpa [RestrictionSigma] using + (measurable_iff_comap_le.mp + (measurable_restrictCoeffField_restrictionSigma_of_subset (d := d) hUV)) + +theorem localTestObservable_translateCoeffField {d : ℕ} (z e e' : Vec d) + (φ : Vec d → ℝ) (a : CoeffField d) : + localTestObservable e e' φ (translateCoeffField z a) = + localTestObservable e e' (fun y : Vec d => φ (y - z)) a := by + let f : Vec d → ℝ := fun y => vecDot e' (matVecMul (a y) e) * φ (y - z) + have hcv := setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z Set.univ f + have huniv : translateSet z (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨y - z, trivial, ?_⟩ + ext i + simp [sub_eq_add_neg, add_assoc] + unfold localTestObservable + calc + ∫ x, (vecDot e' (matVecMul (translateCoeffField z a x) e) * φ x) + ∂MeasureTheory.volume + = ∫ x, f (x + z) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hx : (x + z) - z = x := by + ext i + simp [sub_eq_add_neg, add_assoc] + have hvec : (fun i => x i + z i) = x + z := by + ext i + rfl + simp [f, translateCoeffField, hx, hvec] + _ = ∫ x in (Set.univ : Set (Vec d)), f (x + z) ∂MeasureTheory.volume := by + simp + _ = ∫ y in translateSet z (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := + hcv + _ = ∫ y, (vecDot e' (matVecMul (a y) e) * φ (y - z)) ∂MeasureTheory.volume := by + simp [f, huniv] + +theorem localFiniteTestObservable_translateCoeffField {d : ℕ} {ι : Type} + (z : Vec d) (I : Finset ι) (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) + (a : CoeffField d) : + localFiniteTestObservable I e e' φ (translateCoeffField z a) = + localFiniteTestObservable I e e' (fun k y => φ k (y - z)) a := by + let f : Vec d → ℝ := fun y => + ∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * φ k (y - z) + have hcv := setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z Set.univ f + have huniv : translateSet z (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨y - z, trivial, ?_⟩ + ext i + simp [sub_eq_add_neg, add_assoc] + unfold localFiniteTestObservable + calc + ∫ x, (∑ k ∈ I, vecDot (e' k) (matVecMul (translateCoeffField z a x) (e k)) * + φ k x) ∂MeasureTheory.volume + = ∫ x, f (x + z) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hx : (x + z) - z = x := by + ext i + simp [sub_eq_add_neg, add_assoc] + have hvec : (fun i => x i + z i) = x + z := by + ext i + rfl + simp [f, translateCoeffField, hx, hvec] + _ = ∫ x in (Set.univ : Set (Vec d)), f (x + z) ∂MeasureTheory.volume := by + simp + _ = ∫ y in translateSet z (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := + hcv + _ = ∫ y, (∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * + φ k (y - z)) ∂MeasureTheory.volume := by + simp [f, huniv] + +theorem measurable_translateCoeffField {d : ℕ} (z : Vec d) : + Measurable (translateCoeffField (d := d) z) := by + refine measurable_coeffField_to_ambient ?_ (fun V hV => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + simpa [translateCoeffField] using + measurable_coeffField_entry (d := d) (fun k => x k + z k) i j + · refine measurable_localSigma_of_local (T := translateCoeffField z) ?_ V hV + intro W hW + refine ⟨{y : Vec d | y - z ∈ W}, ?_, ?_⟩ + · have htranslate : + Bornology.IsBounded ((fun y : Vec d => y + z) '' W) := + isBounded_image_of_continuous_vec (continuous_id.add continuous_const) hW + refine htranslate.subset ?_ + intro y hy + refine ⟨y - z, hy, ?_⟩ + ext i + simp [sub_eq_add_neg, add_assoc] + intro a b hab x hxW + have hx_pre : (fun i => x i + z i) ∈ {y : Vec d | y - z ∈ W} := by + have hsub : (fun i => x i + z i) - z = x := by + ext i + simp [sub_eq_add_neg, add_assoc] + simpa [hsub] using hxW + simp [translateCoeffField, hab (fun i => x i + z i) hx_pre] + +theorem measurable_translateByInt {d : ℕ} (z : Fin d → ℤ) : + Measurable (translateByInt (d := d) z) := by + simpa [translateByInt] using + measurable_translateCoeffField (d := d) (intVecToRealVec z) + +theorem vecDot_matVecMul_symmPart_cross {d : ℕ} (A : Mat d) (e e' : Vec d) : + vecDot e' (matVecMul (symmPart A) e) = + (1 / 2 : ℝ) * + (vecDot e' (matVecMul A e) + vecDot e (matVecMul A e')) := by + rw [symmPart_eq_smul_add_transpose, smul_matVecMul, add_matVecMul, + vecDot_smul_right, vecDot_add_right, vecDot_matVecMul_transpose, vecDot_comm] + rw [vecDot_comm (matVecMul A e') e] + +theorem vecDot_matVecMul_skewPart_cross {d : ℕ} (A : Mat d) (e e' : Vec d) : + vecDot e' (matVecMul (skewPart A) e) = + (1 / 2 : ℝ) * + (vecDot e' (matVecMul A e) - vecDot e (matVecMul A e')) := by + rw [skewPart_eq_smul_sub_transpose, smul_matVecMul, sub_matVecMul, + vecDot_smul_right] + simp [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right, + vecDot_matVecMul_transpose, vecDot_comm] + +theorem localFiniteTestObservable_symmCoeffField {d : ℕ} {ι : Type} + (I : Finset ι) (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) (a : CoeffField d) : + localFiniteTestObservable I e e' φ (symmCoeffField a) = + localFiniteTestObservable (I.product (Finset.univ : Finset Bool)) + (fun kb => if kb.2 then e' kb.1 else e kb.1) + (fun kb => if kb.2 then e kb.1 else e' kb.1) + (fun kb x => (1 / 2 : ℝ) * φ kb.1 x) a := by + classical + unfold localFiniteTestObservable + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Finset.product_eq_sprod, Finset.sum_product] + refine Finset.sum_congr rfl ?_ + intro k hk + change vecDot (e' k) (matVecMul (symmPart (a x)) (e k)) * φ k x = + vecDot (e k) (matVecMul (a x) (e' k)) * (2⁻¹ * φ k x) + + vecDot (e' k) (matVecMul (a x) (e k)) * (2⁻¹ * φ k x) + rw [vecDot_matVecMul_symmPart_cross] + ring_nf + +theorem localFiniteTestObservable_skewCoeffField {d : ℕ} {ι : Type} + (I : Finset ι) (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) (a : CoeffField d) : + localFiniteTestObservable I e e' φ (skewCoeffField a) = + localFiniteTestObservable (I.product (Finset.univ : Finset Bool)) + (fun kb => if kb.2 then e' kb.1 else e kb.1) + (fun kb => if kb.2 then e kb.1 else e' kb.1) + (fun kb x => if kb.2 then -(1 / 2 : ℝ) * φ kb.1 x else (1 / 2 : ℝ) * φ kb.1 x) a := by + classical + unfold localFiniteTestObservable + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [Finset.product_eq_sprod, Finset.sum_product] + refine Finset.sum_congr rfl ?_ + intro k hk + change vecDot (e' k) (matVecMul (skewPart (a x)) (e k)) * φ k x = + -(vecDot (e k) (matVecMul (a x) (e' k)) * (2⁻¹ * φ k x)) + + vecDot (e' k) (matVecMul (a x) (e k)) * (2⁻¹ * φ k x) + rw [vecDot_matVecMul_skewPart_cross] + ring_nf + +theorem measurable_symmCoeffField {d : ℕ} : + Measurable (symmCoeffField (d := d)) := by + refine measurable_coeffField_to_ambient ?_ (fun V hV => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + have hij : Measurable (fun a : CoeffField d => a x i j) := + measurable_coeffField_entry (d := d) x i j + have hji : Measurable (fun a : CoeffField d => a x j i) := + measurable_coeffField_entry (d := d) x j i + simpa [symmCoeffField, symmPart_eq_smul_add_transpose, matTranspose] using! + (measurable_const.mul (hij.add hji)) + · refine measurable_localSigma_of_local (T := symmCoeffField) ?_ V hV + intro W hW + refine ⟨W, hW, ?_⟩ + intro a b hab x hxW + simp [symmCoeffField, hab x hxW] + +theorem measurable_skewCoeffField {d : ℕ} : + Measurable (skewCoeffField (d := d)) := by + refine measurable_coeffField_to_ambient ?_ (fun V hV => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + have hij : Measurable (fun a : CoeffField d => a x i j) := + measurable_coeffField_entry (d := d) x i j + have hji : Measurable (fun a : CoeffField d => a x j i) := + measurable_coeffField_entry (d := d) x j i + simpa [skewCoeffField, skewPart_eq_smul_sub_transpose, matTranspose] using! + (measurable_const.mul (hij.sub hji)) + · refine measurable_localSigma_of_local (T := skewCoeffField) ?_ V hV + intro W hW + refine ⟨W, hW, ?_⟩ + intro a b hab x hxW + simp [skewCoeffField, hab x hxW] + +theorem IsStationary.map_translateByInt {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsStationary P) (z : Fin d → ℤ) : + MeasureTheory.Measure.map (translateByInt z) P = P := + hP z + +theorem integral_comp_translateByInt_eq_of_isStationary {d : ℕ} + {P : MeasureTheory.Measure (CoeffField d)} (hP : IsStationary P) + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + (z : Fin d → ℤ) (f : CoeffField d → E) + (hf : MeasureTheory.AEStronglyMeasurable f P) : + ∫ a, f (translateByInt z a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq (measurable_translateByInt z) (hP z) f hf + +theorem localTestObservable_eq_of_ae_eq {d : ℕ} {a b : CoeffField d} + (h : a =ᵐ[MeasureTheory.volume] b) (e e' : Vec d) (φ : Vec d → ℝ) : + localTestObservable e e' φ a = localTestObservable e e' φ b := by + unfold localTestObservable + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [h] with x hx + simp [hx] + +theorem localFiniteTestObservable_eq_of_ae_eq {d : ℕ} {ι : Type} {a b : CoeffField d} + (h : a =ᵐ[MeasureTheory.volume] b) (I : Finset ι) + (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) : + localFiniteTestObservable I e e' φ a = localFiniteTestObservable I e e' φ b := by + unfold localFiniteTestObservable + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [h] with x hx + simp [hx] + +theorem mem_iff_of_measurableSet_pointwiseLocalSigma_of_pointwiseAgreementOn {d : ℕ} + {U : Set (Vec d)} {s : Set (CoeffField d)} + (hs : @MeasurableSet (CoeffField d) (PointwiseLocalSigma U) s) {a b : CoeffField d} + (hab : PointwiseAgreementOn U a b) : + a ∈ s ↔ b ∈ s := by + let C : Set (Set (CoeffField d)) := + {s | IsPointwiseLocalEvent U s} + have hC : ∀ t ∈ C, a ∈ t ↔ b ∈ t := by + intro t ht + exact ht hab + have hsC : @MeasurableSet (CoeffField d) (MeasurableSpace.generateFrom C) s := by + simpa [PointwiseLocalSigma, C] using! hs + exact (MeasurableSpace.forall_generateFrom_mem_iff_mem_iff (S := C) (x := a) (y := b)).2 + hC s hsC + +theorem mem_iff_of_measurableSet_localSigma_of_localAgreementOn {d : ℕ} + {U : Set (Vec d)} {s : Set (CoeffField d)} + (hs : @MeasurableSet (CoeffField d) (LocalSigma U) s) {a b : CoeffField d} + (hab : LocalAgreementOn U a b) : + a ∈ s ↔ b ∈ s := + mem_iff_of_measurableSet_pointwiseLocalSigma_of_pointwiseAgreementOn hs hab + +theorem mem_iff_of_measurableSet_pointwiseLocalSigma_of_eqOn {d : ℕ} {U : Set (Vec d)} + {s : Set (CoeffField d)} (hs : @MeasurableSet (CoeffField d) (PointwiseLocalSigma U) s) + {a b : CoeffField d} (h : ∀ x, x ∈ U → a x = b x) : + a ∈ s ↔ b ∈ s := + mem_iff_of_measurableSet_pointwiseLocalSigma_of_pointwiseAgreementOn hs h + +theorem mem_iff_of_measurableSet_localSigma_of_eqOn {d : ℕ} {U : Set (Vec d)} + {s : Set (CoeffField d)} (hs : @MeasurableSet (CoeffField d) (LocalSigma U) s) + {a b : CoeffField d} (h : ∀ x, x ∈ U → a x = b x) : + a ∈ s ↔ b ∈ s := + mem_iff_of_measurableSet_pointwiseLocalSigma_of_eqOn hs h + +/-- A sample-space-valued coefficient field is pointwise-locally measurable on +`U` if it is measurable with codomain `PointwiseLocalSigma U`. -/ +def IsPointwiseLocalSigmaMeasurableOn {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + (A : Ω → CoeffField d) (U : Set (Vec d)) : Prop := + @Measurable Ω (CoeffField d) _ (PointwiseLocalSigma U) A + +/-- Compatibility name for `IsPointwiseLocalSigmaMeasurableOn`. -/ +abbrev IsLocalSigmaMeasurableOn {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + (A : Ω → CoeffField d) (U : Set (Vec d)) : Prop := + IsPointwiseLocalSigmaMeasurableOn A U + +/-- A sample-space-valued coefficient field is restriction-measurable on `U` if +it is measurable with codomain `RestrictionSigma U`. -/ +def IsRestrictionSigmaMeasurableOn {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} + (A : Ω → CoeffField d) (U : Set (Vec d)) : Prop := + @Measurable Ω (CoeffField d) _ (RestrictionSigma U) A + +theorem AreUnitSeparated.symm {d : ℕ} {U V : Set (Vec d)} + (hUV : AreUnitSeparated U V) : + AreUnitSeparated V U := by + intro x y hx hy + simpa [dist_comm] using hUV hy hx + +theorem areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : CubeColor d} (hk : 0 ≤ k) + (hR : R ∈ descendantsAtScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleColorClass Q k c) (hneq : R ≠ S) : + AreUnitSeparated (cubeSet R) (cubeSet S) := by + intro x y hx hy + exact one_le_dist_of_ne_of_mem_descendantsAtScaleColorClass hk hR hS hneq hx hy + +theorem pairwise_areUnitSeparated_cubeSet_descendantsAtScaleColorClass {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : 0 ≤ k) (c : CubeColor d) : + (descendantsAtScaleColorClass Q k c : Set (TriadicCube d)).Pairwise + (fun R S => AreUnitSeparated (cubeSet R) (cubeSet S)) := by + intro R hR S hS hneq + exact areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleColorClass hk hR hS hneq + +theorem pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (hk : 0 ≤ k) (c : CubeColor d) : + Pairwise + (fun R S : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} => + AreUnitSeparated (cubeSet R.1) (cubeSet S.1)) := by + intro R S hRS + exact areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleColorClass hk R.2 S.2 + (by + intro h + apply hRS + exact Subtype.ext h) + +theorem areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleScaleColorClass {d : ℕ} + {Q R S : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + (hR : R ∈ descendantsAtScaleScaleColorClass Q k c) + (hS : S ∈ descendantsAtScaleScaleColorClass Q k c) (hneq : R ≠ S) : + AreUnitSeparated (cubeSet R) (cubeSet S) := by + intro x y hx hy + exact one_le_dist_of_ne_of_mem_descendantsAtScaleScaleColorClass hR hS hneq hx hy + +theorem pairwise_areUnitSeparated_cubeSet_descendantsAtScaleScaleColorClass {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (c : ScaleColor d k) : + (descendantsAtScaleScaleColorClass Q k c : Set (TriadicCube d)).Pairwise + (fun R S => AreUnitSeparated (cubeSet R) (cubeSet S)) := by + intro R hR S hS hneq + exact areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleScaleColorClass hR hS hneq + +theorem pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass {d : ℕ} + (Q : TriadicCube d) {k : ℤ} (c : ScaleColor d k) : + Pairwise + (fun R S : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} => + AreUnitSeparated (cubeSet R.1) (cubeSet S.1)) := by + intro R S hRS + exact areUnitSeparated_cubeSet_of_ne_of_mem_descendantsAtScaleScaleColorClass R.2 S.2 + (by + intro h + apply hRS + exact Subtype.ext h) + +theorem areUnitSeparated_biUnion_right {d : ℕ} {ι : Type*} [DecidableEq ι] {U : Set (Vec d)} + {V : ι → Set (Vec d)} {s : Finset ι} + (h : ∀ i ∈ s, AreUnitSeparated U (V i)) : + AreUnitSeparated U (⋃ i ∈ s, V i) := by + intro x y hx hy + simp only [Set.mem_iUnion] at hy + rcases hy with ⟨i, hi, hyi⟩ + exact h i hi hx hyi + +theorem measurableSet_biInter_restrictionSigma_biUnion {d : ℕ} {ι : Type*} + [DecidableEq ι] {U : ι → Set (Vec d)} {f : ι → Set (CoeffField d)} + {s : Finset ι} + (hf : ∀ i ∈ s, @MeasurableSet (CoeffField d) (RestrictionSigma (U i)) (f i)) : + @MeasurableSet (CoeffField d) (RestrictionSigma (⋃ i ∈ s, U i)) (⋂ i ∈ s, f i) := by + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi ih => + have hsubset_i : U i ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hi_meas : + @MeasurableSet (CoeffField d) (RestrictionSigma (⋃ j ∈ insert i s, U j)) (f i) := by + exact (RestrictionSigma_mono (d := d) hsubset_i) (f i) (hf i (by simp)) + have hsubset_s : (⋃ j ∈ s, U j) ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hs_meas : + @MeasurableSet (CoeffField d) (RestrictionSigma (⋃ j ∈ insert i s, U j)) + (⋂ j ∈ s, f j) := by + exact (RestrictionSigma_mono (d := d) hsubset_s) (⋂ j ∈ s, f j) + (ih (fun j hj => hf j (by simp [hj]))) + simpa [Finset.set_biInter_insert, hi] using hi_meas.inter hs_meas + +theorem iIndep_restrictionSigma_of_isRestrictionUnitRangeDependent {d : ℕ} {ι : Type*} + [DecidableEq ι] {P : MeasureTheory.Measure (CoeffField d)} + [MeasureTheory.IsProbabilityMeasure P] {U : ι → Set (Vec d)} + (hP : IsRestrictionUnitRangeDependent P) + (hsep : Pairwise fun i j => AreUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndep (fun i => RestrictionSigma (U i)) P := by + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + classical + induction s using Finset.induction_on with + | empty => + simp + | @insert i s hi ih => + have hsep_union : AreUnitSeparated (U i) (⋃ j ∈ s, U j) := by + refine areUnitSeparated_biUnion_right (U := U i) (V := U) ?_ + intro j hj + exact hsep (by + intro hij + exact hi (hij ▸ hj)) + have hs_meas : + @MeasurableSet (CoeffField d) (RestrictionSigma (⋃ j ∈ s, U j)) (⋂ j ∈ s, f j) := + measurableSet_biInter_restrictionSigma_biUnion (U := U) + (f := f) (s := s) fun j hj => hf j (by simp [hj]) + have h_inter : + P (f i ∩ ⋂ j ∈ s, f j) = P (f i) * P (⋂ j ∈ s, f j) := by + exact (ProbabilityTheory.Indep_iff + (RestrictionSigma (U i)) (RestrictionSigma (⋃ j ∈ s, U j)) P).1 + (hP (U i) (⋃ j ∈ s, U j) hsep_union) + (f i) (⋂ j ∈ s, f j) (hf i (by simp)) hs_meas + calc + P (⋂ j ∈ insert i s, f j) = P (f i ∩ ⋂ j ∈ s, f j) := by + simp + _ = P (f i) * P (⋂ j ∈ s, f j) := h_inter + _ = P (f i) * ∏ j ∈ s, P (f j) := by rw [ih (fun j hj => hf j (by simp [hj]))] + _ = ∏ j ∈ insert i s, P (f j) := by simp [Finset.prod_insert, hi] + +theorem iIndep_restrictionSigma_descendantsAtScaleColorClass_of_isRestrictionUnitRangeDependent + {d : ℕ} {Q : TriadicCube d} {k : ℤ} (hk : 0 ≤ k) {c : CubeColor d} + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) : + ProbabilityTheory.iIndep + (fun R : {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} => + RestrictionSigma (cubeSet R.1)) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleColorClass Q k c} + let U : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (U R) (U S) := by + simpa [I, U] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleColorClass (Q := Q) hk c + simpa [I, U] using + (iIndep_restrictionSigma_of_isRestrictionUnitRangeDependent + (d := d) (ι := I) (U := U) hP hsep) + +theorem iIndep_restrictionSigma_descendantsAtScaleScaleColorClass_of_isRestrictionUnitRangeDependent + {d : ℕ} {Q : TriadicCube d} {k : ℤ} {c : ScaleColor d k} + {P : MeasureTheory.Measure (CoeffField d)} [MeasureTheory.IsProbabilityMeasure P] + (hP : IsRestrictionUnitRangeDependent P) : + ProbabilityTheory.iIndep + (fun R : {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} => + RestrictionSigma (cubeSet R.1)) P := by + let I : Type := {R : TriadicCube d // R ∈ descendantsAtScaleScaleColorClass Q k c} + let U : I → Set (Vec d) := fun R => cubeSet R.1 + have hsep : Pairwise fun R S : I => AreUnitSeparated (U R) (U S) := by + simpa [I, U] using + pairwise_areUnitSeparated_cubeSet_subtype_descendantsAtScaleScaleColorClass (Q := Q) c + simpa [I, U] using + (iIndep_restrictionSigma_of_isRestrictionUnitRangeDependent + (d := d) (ι := I) (U := U) hP hsep) + +theorem IsPointwiseLocalSigmaMeasurableOn.measurable_localTestObservable + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {A : Ω → CoeffField d} {U : Set (Vec d)} + (hA : IsPointwiseLocalSigmaMeasurableOn A U) + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + Measurable fun ω => localTestObservable e e' φ (A ω) := by + exact + (measurable_localTestObservable_localSigma (U := U) e e' hφ_cont hφ_compact hφ_support).comp + hA + +/-- Compatibility spelling for the pointwise-local measurability theorem. -/ +theorem IsLocalSigmaMeasurableOn.measurable_localTestObservable + {Ω : Type*} [MeasurableSpace Ω] {d : ℕ} {A : Ω → CoeffField d} {U : Set (Vec d)} + (hA : IsLocalSigmaMeasurableOn A U) + (e e' : Vec d) {φ : Vec d → ℝ} (hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + Measurable fun ω => localTestObservable e e' φ (A ω) := + IsPointwiseLocalSigmaMeasurableOn.measurable_localTestObservable hA e e' hφ_cont + hφ_compact hφ_support + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField.lean new file mode 100644 index 0000000000..e497642c84 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField.lean @@ -0,0 +1,194 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import Mathlib.MeasureTheory.Function.LocallyIntegrable +public import Mathlib.MeasureTheory.Integral.Bochner.Basic +public import Mathlib.MeasureTheory.Integral.IntegrableOn +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.Topology.Algebra.Support + +/-! +# The regular-coefficient-field carrier + +This file introduces `RegCoeffField d`, the carrier of *honest* coefficient +fields on which the probabilistic layer of the homogenization development is +based. A `RegCoeffField d` is a map `Vec d → Mat d` whose entries are Borel +measurable and locally integrable — the minimal regularity level at which the +linear entry-test integral (see `RegCoeffField/Sigma.lean`) is genuinely +additive and at which a.e.-regularity hypotheses become free by type. + +The deterministic layers (Sobolev/PDE/coarse-graining algebra) continue to work +with the raw `CoeffField d = Vec d → Mat d`; they receive `a.toFun` through the +coercion `RegCoeffField.toCoeffField`. + +The carrier is a commutative monoid under pointwise addition, is closed under +real scaling and finite sums, and contains the constant fields +(`constRegCoeffField`, including `1`); each closure property is witnessed by the +corresponding closure of measurability and local integrability. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +/-- The regular-fields carrier: entrywise-Borel-measurable, locally-integrable +coefficient fields. Regularity is now free by type: every element carries a +proof that each of its scalar entries is measurable and locally integrable +(the paper, Armstrong–Kuusi–Loher, to appear). -/ +structure RegCoeffField (d : ℕ) where + /-- The underlying raw coefficient field. -/ + toFun : Vec d → Mat d + /-- Each scalar entry is Borel measurable. -/ + entry_measurable : ∀ i j, Measurable (fun x : Vec d => toFun x i j) + /-- Each scalar entry is locally integrable for the Lebesgue measure. -/ + entry_locInt : ∀ i j, LocallyIntegrable (fun x : Vec d => toFun x i j) volume + +namespace RegCoeffField + +variable {d : ℕ} + +instance : CoeFun (RegCoeffField d) (fun _ => Vec d → Mat d) := ⟨toFun⟩ + +@[simp] theorem coe_mk (f h₁ h₂) (x : Vec d) : + (⟨f, h₁, h₂⟩ : RegCoeffField d) x = f x := rfl + +@[simp] theorem toFun_eq_coe (a : RegCoeffField d) : a.toFun = a := rfl + +/-- Coercion back to the raw deterministic carrier `CoeffField d`. Deterministic +layers receive `a.toCoeffField = a.toFun` and are untouched by the carrier. -/ +def toCoeffField (a : RegCoeffField d) : CoeffField d := a.toFun + +@[simp] theorem toCoeffField_apply (a : RegCoeffField d) (x : Vec d) : + a.toCoeffField x = a x := rfl + +@[ext] theorem ext {a b : RegCoeffField d} (h : ∀ x, a x = b x) : a = b := by + cases a; cases b; simp only [mk.injEq]; funext x; exact h x + +/-! ### Zero -/ + +instance : Zero (RegCoeffField d) where + zero := + { toFun := 0 + entry_measurable := fun i j => by + simp only [Pi.zero_apply, Matrix.zero_apply]; exact measurable_const + entry_locInt := fun i j => by + simp only [Pi.zero_apply, Matrix.zero_apply] + exact MeasureTheory.locallyIntegrable_const (0 : ℝ) } + +@[simp] theorem zero_toFun : (0 : RegCoeffField d).toFun = 0 := rfl + +@[simp] theorem zero_apply (x : Vec d) : (0 : RegCoeffField d) x = 0 := rfl + +/-! ### Addition -/ + +instance : Add (RegCoeffField d) where + add a b := + { toFun := a.toFun + b.toFun + entry_measurable := fun i j => + (a.entry_measurable i j).add (b.entry_measurable i j) + entry_locInt := fun i j => (a.entry_locInt i j).add (b.entry_locInt i j) } + +@[simp] theorem add_toFun (a b : RegCoeffField d) : + (a + b).toFun = a.toFun + b.toFun := rfl + +@[simp] theorem add_apply (a b : RegCoeffField d) (x : Vec d) : + (a + b) x = a x + b x := rfl + +@[simp] theorem coe_add (a b : RegCoeffField d) : + ⇑(a + b) = ⇑a + ⇑b := rfl + +/-! ### Real scaling -/ + +instance : SMul ℝ (RegCoeffField d) where + smul c a := + { toFun := fun x => c • a x + entry_measurable := fun i j => by + simpa using! (a.entry_measurable i j).const_smul c + entry_locInt := fun i j => by + show LocallyIntegrable (fun x => c • a.toFun x i j) volume + exact (a.entry_locInt i j).smul c } + +@[simp] theorem smul_toFun (c : ℝ) (a : RegCoeffField d) : + (c • a).toFun = fun x => c • a x := rfl + +@[simp] theorem smul_apply (c : ℝ) (a : RegCoeffField d) (x : Vec d) : + (c • a) x = c • a x := rfl + +/-! ### Commutative monoid structure -/ + +instance : AddCommMonoid (RegCoeffField d) where + add_assoc a b c := by ext x; simp [add_assoc] + zero_add a := by ext x; simp + add_zero a := by ext x; simp + add_comm a b := by ext x; simp [add_comm] + nsmul := nsmulRec + +/-- Evaluation of a finite sum of carrier elements is the finite sum of the +evaluations. -/ +@[simp] theorem finset_sum_apply {ι : Type*} (s : Finset ι) (g : ι → RegCoeffField d) + (x : Vec d) : (∑ l ∈ s, g l) x = ∑ l ∈ s, g l x := by + classical + induction s using Finset.induction with + | empty => simp + | insert l s hl ih => rw [Finset.sum_insert hl, Finset.sum_insert hl, add_apply, ih] + +theorem finset_sum_toFun {ι : Type*} (s : Finset ι) (g : ι → RegCoeffField d) : + (∑ l ∈ s, g l).toFun = ∑ l ∈ s, (g l).toFun := by + funext x; simp [Finset.sum_apply] + +/-! ### Constant fields -/ + +/-- The constant regular field with value the matrix `M`. Constant maps are +measurable and locally integrable, so this is a genuine carrier element. -/ +def constRegCoeffField (M : Mat d) : RegCoeffField d where + toFun := fun _ => M + entry_measurable := fun _ _ => measurable_const + entry_locInt := fun i j => MeasureTheory.locallyIntegrable_const (M i j) + +@[simp] theorem constRegCoeffField_apply (M : Mat d) (x : Vec d) : + constRegCoeffField M x = M := rfl + +@[simp] theorem constRegCoeffField_zero : + constRegCoeffField (0 : Mat d) = 0 := by ext x; simp + +/-- The constant identity-matrix field. -/ +instance : One (RegCoeffField d) := ⟨constRegCoeffField 1⟩ + +@[simp] theorem one_apply (x : Vec d) : (1 : RegCoeffField d) x = 1 := rfl + +@[simp] theorem one_toFun : (1 : RegCoeffField d).toFun = fun _ => (1 : Mat d) := rfl + +/-! ### A regularity utility: bounded measurable ⟹ locally integrable -/ + +/-- A bounded measurable scalar field on `Vec d` is locally integrable for the +Lebesgue measure. This discharges the local-integrability obligation for +carriers built from bounded data (e.g. the checkerboard). The Lebesgue measure +on `Vec d = Fin d → ℝ` is finite on compacts and the space is locally compact, +so integrability on every compact set follows from the uniform bound. -/ +theorem locallyIntegrable_of_bounded_measurable {f : Vec d → ℝ} (hf : Measurable f) + {C : ℝ} (hC : ∀ x, |f x| ≤ C) : LocallyIntegrable f volume := by + rw [locallyIntegrable_iff] + intro k hk + refine Measure.integrableOn_of_bounded (hk.measure_lt_top).ne hf.aestronglyMeasurable + (M := C) ?_ + filter_upwards with x + simpa [Real.norm_eq_abs] using hC x + +end RegCoeffField + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Differentiation.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Differentiation.lean new file mode 100644 index 0000000000..4ac92aac4f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Differentiation.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSet +public import Mathlib.MeasureTheory.Covering.DensityTheorem +public import Mathlib.MeasureTheory.Measure.Lebesgue.EqHaar +public import Mathlib.Analysis.Convex.Integral +public import Mathlib.MeasureTheory.SpecificCodomains.Pi + +/-! +# Ball averages of carrier fields and Lebesgue differentiation + +This file is the analytic core of the honest slice-measurability route (Packet +P4b of the carrier redesign). For a carrier field `a : RegCoeffField d` and a +measurable set `B` it introduces the matrix of scalar entry averages + +`avgMat B a = fun i j => (volume B)⁻¹ • ∫_B a(·)_{ij}`, + +records the **entry-test bridge** + +`avgMat B a i j = (volume B)⁻¹ • entryTestR i j (indicator B 1) a` + +(so that on rational balls `B ⊆ U` the average is an honest function of the +local entry-test generators — used for `LocalSigmaR U`-measurability in +`SliceMeasurability.lean`), and proves the two-directional characterization of +spatial a.e. ellipticity in terms of rational-ball averages: + +* forward (Jensen): the average of an a.e.-elliptic field over a ball stays in + the closed convex elliptic locus (`isEllipticMatrix_avgMat_of_aeRestrict`, + built on `Convex.set_average_mem`); +* backward (Lebesgue differentiation): if all rational-ball averages of `a` + inside an open set `U` are elliptic, then `a` is a.e.-elliptic on `U` + (`aeRestrict_isEllipticMatrix_of_forall_ratBall`), built on the + centre-free Lebesgue differentiation theorem + `IsUnifLocDoublingMeasure.ae_tendsto_average` (whose Vitali family provides + the differentiation basis of closed metric balls on `Vec d = Fin d → ℝ`, + whose Lebesgue `volume` is a doubling additive Haar measure). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric Filter Topology + +noncomputable section + +variable {d : ℕ} + +/-! ## The matrix of entry averages -/ + +/-- The matrix of scalar entry averages of a carrier field over a set `B`. Its +`(i, j)` entry is the average of `a(·)_{ij}` over `B` for the Lebesgue measure. -/ +def avgMat (B : Set (Vec d)) (a : RegCoeffField d) : Mat d := + fun i j => (volume B).toReal⁻¹ • ∫ x in B, a x i j ∂volume + +/-- The entry average is the corresponding scalar set-average. -/ +theorem avgMat_entry_eq_setAverage (B : Set (Vec d)) (a : RegCoeffField d) (i j : Fin d) : + avgMat B a i j = ⨍ x in B, a x i j ∂volume := by + rw [avgMat, setAverage_eq, MeasureTheory.Measure.real] + +/-! ## The entry-test bridge -/ + +/-- The constant-one indicator of a compact measurable set is an enriched +probe. -/ +theorem isProbeR_indicator {B : Set (Vec d)} (hBcpt : IsCompact B) (hBmeas : MeasurableSet B) : + IsProbeR (Set.indicator B (fun _ => (1 : ℝ))) := by + refine ⟨(measurable_const).indicator hBmeas, ⟨1, fun x => ?_⟩, ?_⟩ + · by_cases hx : x ∈ B <;> simp [Set.indicator, hx] + · apply HasCompactSupport.intro hBcpt + intro x hx; simp [Set.indicator_of_notMem hx] + +/-- The support of the constant-one indicator of `B` is contained in `B`. -/ +theorem support_indicator_one_subset (B : Set (Vec d)) : + Function.support (Set.indicator B (fun _ => (1 : ℝ))) ⊆ B := by + intro x hx + rw [Function.mem_support] at hx + by_contra hxB + exact hx (by simp [Set.indicator_of_notMem hxB]) + +/-- **The entry-test bridge (integral form).** The entry test of a carrier +field against the constant-one indicator of a measurable set is the set integral +of that entry. -/ +theorem entryTestR_indicator_one (i j : Fin d) (B : Set (Vec d)) (hBmeas : MeasurableSet B) + (a : RegCoeffField d) : + entryTestR i j (Set.indicator B (fun _ => (1 : ℝ))) a = ∫ x in B, a x i j ∂volume := by + unfold entryTestR + rw [← integral_indicator hBmeas] + refine integral_congr_ae (Filter.Eventually.of_forall (fun x => ?_)) + by_cases hx : x ∈ B <;> simp [Set.indicator, hx] + +/-- **The entry-test bridge.** Each entry of the ball average is a scalar +multiple of the localized entry-test generator against the ball indicator. -/ +theorem avgMat_entry_eq_smul_entryTestR (i j : Fin d) (B : Set (Vec d)) + (hBmeas : MeasurableSet B) (a : RegCoeffField d) : + avgMat B a i j + = (volume B).toReal⁻¹ • entryTestR i j (Set.indicator B (fun _ => (1 : ℝ))) a := by + rw [avgMat, entryTestR_indicator_one i j B hBmeas] + +/-! ## Integrability and the pi realization -/ + +/-- The pi realization `x ↦ (a(x)_{ij})_{ij}` of a carrier field, valued in the +genuine finite pi space `Fin d → Fin d → ℝ` (which — unlike `Mat d` — carries the +`NormedSpace`/`CompleteSpace` structure needed by the Bochner–Jensen average). -/ +def matPi (a : RegCoeffField d) (x : Vec d) : Fin d → Fin d → ℝ := fun i j => a x i j + +/-- The elliptic locus, realized natively on the pi space (defeq to the +`Mat d` locus of `EllipticSet.lean`, but stated so the Bochner average unifies +without triggering the blocked `Matrix` norm instances). -/ +def elliptPi (lam Lam : ℝ) : Set (Fin d → Fin d → ℝ) := + {M | IsEllipticMatrix lam Lam M} + +theorem convex_elliptPi (lam Lam : ℝ) : Convex ℝ (elliptPi (d := d) lam Lam) := + convex_isEllipticMatrix + +theorem isClosed_elliptPi (lam Lam : ℝ) : IsClosed (elliptPi (d := d) lam Lam) := + isClosed_isEllipticMatrix + +/-- The eval continuous-linear map picking out the `(i, j)` entry of a pi +matrix. -/ +def entryCLM (i j : Fin d) : (Fin d → Fin d → ℝ) →L[ℝ] ℝ := + let row : (Fin d → Fin d → ℝ) →L[ℝ] (Fin d → ℝ) := ContinuousLinearMap.proj (R := ℝ) i + let entry : (Fin d → ℝ) →L[ℝ] ℝ := ContinuousLinearMap.proj (R := ℝ) j + entry.comp row + +/-- The pi realization is integrable on compact sets. -/ +theorem integrableOn_matPi (a : RegCoeffField d) {B : Set (Vec d)} (hB : IsCompact B) : + IntegrableOn (matPi a) B volume := by + rw [IntegrableOn, integrable_pi_iff]; intro i + rw [integrable_pi_iff]; intro j + exact (a.entry_locInt i j).integrableOn_isCompact hB + +/-- The `Mat d` entry average agrees with the Bochner set-average of the pi +realization. -/ +theorem avgMat_eq_setAverage (a : RegCoeffField d) {B : Set (Vec d)} (hB : IsCompact B) : + avgMat B a = ⨍ x in B, matPi a x ∂volume := by + funext i j + have hInt := integrableOn_matPi a hB + have heval : (∫ x in B, matPi a x ∂volume) i j = ∫ x in B, a x i j ∂volume := by + have h := (entryCLM (d := d) i j).integral_comp_comm hInt + simpa [entryCLM, matPi] using h.symm + rw [avgMat, setAverage_eq] + simp only [Pi.smul_apply] + rw [heval, MeasureTheory.Measure.real] + +/-! ## Forward direction (Jensen) -/ + +/-- **Forward (Jensen).** If a carrier field is a.e.-elliptic on the restricted +measure of `U`, then its average over any compact ball `B ⊆ U` of positive finite +volume is elliptic. Immediate from `Convex.set_average_mem` on the closed convex +elliptic locus. -/ +theorem isEllipticMatrix_avgMat_of_aeRestrict {U : Set (Vec d)} {lam Lam : ℝ} + {a : RegCoeffField d} + (hae : ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix lam Lam (a x)) + {B : Set (Vec d)} (hBcpt : IsCompact B) (hBU : B ⊆ U) + (hB0 : volume B ≠ 0) (hBfin : volume B ≠ ⊤) : + IsEllipticMatrix lam Lam (avgMat B a) := by + have hfs : ∀ᵐ x ∂(volume.restrict B), matPi a x ∈ elliptPi lam Lam := + hae.filter_mono (ae_mono (Measure.restrict_mono hBU le_rfl)) + have hmem := + (convex_elliptPi lam Lam).set_average_mem (isClosed_elliptPi lam Lam) hB0 hBfin hfs + (integrableOn_matPi a hBcpt) + rw [avgMat_eq_setAverage a hBcpt] + exact hmem + +/-! ## Rational balls -/ + +/-- The real point with rational coordinates `q`. -/ +def ratPt (q : Fin d → ℚ) : Vec d := fun i => (q i : ℝ) + +/-- **Rational balls are cofinal in an open set.** For a point `x` of an open set +`U` and any positive tolerance `ε`, there is a rational-centre rational-radius +closed ball of radius below `ε` that contains `x` and lies in `U`. -/ +theorem exists_ratBall {U : Set (Vec d)} (hU : IsOpen U) {x : Vec d} (hx : x ∈ U) + {ε : ℝ} (hε : 0 < ε) : + ∃ (q : Fin d → ℚ) (r : ℚ), 0 < (r : ℝ) ∧ (r : ℝ) < ε ∧ + x ∈ closedBall (ratPt q) (r : ℝ) ∧ closedBall (ratPt q) (r : ℝ) ⊆ U := by + obtain ⟨ρ, hρpos, hρsub⟩ := Metric.isOpen_iff.mp hU x hx + have hclosed_sub : closedBall x (ρ / 2) ⊆ U := + (closedBall_subset_ball (by linarith)).trans hρsub + set t : ℝ := min (ρ / 3) (ε / 2) with ht + have htpos : 0 < t := lt_min (by linarith) (by linarith) + obtain ⟨r, hr0, hrt⟩ := exists_rat_btwn htpos + have hrpos : 0 < (r : ℝ) := hr0 + have hcoord : ∀ i : Fin d, ∃ q : ℚ, |x i - (q : ℝ)| < (r : ℝ) / 2 := by + intro i + obtain ⟨q, hq1, hq2⟩ := + exists_rat_btwn (show x i - (r : ℝ) / 2 < x i + (r : ℝ) / 2 by linarith) + exact ⟨q, by rw [abs_lt]; constructor <;> linarith⟩ + choose qf hqf using hcoord + refine ⟨qf, r, hrpos, ?_, ?_, ?_⟩ + · exact hrt.trans (by rw [ht]; exact (min_le_right _ _).trans_lt (by linarith)) + · rw [mem_closedBall, dist_comm, dist_pi_le_iff hrpos.le] + intro i + rw [Real.dist_eq] + have hi : |ratPt qf i - x i| < (r : ℝ) / 2 := by + rw [abs_sub_comm]; simpa [ratPt] using hqf i + linarith + · intro y hy + apply hclosed_sub + rw [mem_closedBall] at hy ⊢ + have hcx : dist (ratPt qf) x ≤ (r : ℝ) / 2 := by + rw [dist_pi_le_iff (by linarith)] + intro i + rw [Real.dist_eq, abs_sub_comm]; exact (hqf i).le + have hstep : dist y x ≤ (r : ℝ) + (r : ℝ) / 2 := + le_trans (dist_triangle y (ratPt qf) x) (by linarith) + have hrle : (r : ℝ) ≤ ρ / 3 := + le_of_lt (hrt.trans_le (by rw [ht]; exact min_le_left _ _)) + linarith + +/-! ## Backward direction (Lebesgue differentiation) -/ + +/-- **Backward (Lebesgue differentiation).** If every rational ball `B ⊆ U` +(with `U` open) has elliptic average, then the carrier field is a.e.-elliptic on +`U`. For a.e. `x` the centre-free Lebesgue differentiation theorem provides a +sequence of rational balls containing `x` and shrinking to it whose averages +converge to `a x`; each average is elliptic and the locus is closed, so `a x` is +elliptic. -/ +theorem aeRestrict_isEllipticMatrix_of_forall_ratBall {U : Set (Vec d)} + (hUopen : IsOpen U) {lam Lam : ℝ} {a : RegCoeffField d} + (H : ∀ (q : Fin d → ℚ) (r : ℚ), 0 < (r : ℝ) → closedBall (ratPt q) (r : ℝ) ⊆ U → + IsEllipticMatrix lam Lam (avgMat (closedBall (ratPt q) (r : ℝ)) a)) : + ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix lam Lam (a x) := by + have hdiff : ∀ᵐ x ∂volume, ∀ i j : Fin d, + ∀ {ι : Type} {l : Filter ι} (w : ι → Vec d) (δ : ι → ℝ) + (_ : Tendsto δ l (𝓝[>] 0)) (_ : ∀ᶠ n in l, x ∈ closedBall (w n) (1 * δ n)), + Tendsto (fun n => ⨍ y in closedBall (w n) (δ n), a y i j ∂volume) l (𝓝 (a x i j)) := by + rw [MeasureTheory.ae_all_iff]; intro i + rw [MeasureTheory.ae_all_iff]; intro j + exact IsUnifLocDoublingMeasure.ae_tendsto_average volume (a.entry_locInt i j) 1 + filter_upwards [ae_restrict_of_ae hdiff, ae_restrict_mem hUopen.measurableSet] + with x hx_diff hxU + -- rational balls shrinking to `x` + choose qf rf hpos hlt hxin hsub using + (fun n : ℕ => exists_ratBall hUopen hxU (show (0 : ℝ) < 1 / (n + 1) by positivity)) + set w : ℕ → Vec d := fun n => ratPt (qf n) with hw + set δ : ℕ → ℝ := fun n => (rf n : ℝ) with hδ + set B : ℕ → Set (Vec d) := fun n => closedBall (w n) (δ n) with hB + have hδtend : Tendsto δ atTop (𝓝[>] 0) := by + rw [tendsto_nhdsWithin_iff] + refine ⟨?_, Filter.Eventually.of_forall (fun n => hpos n)⟩ + exact squeeze_zero (fun n => (hpos n).le) (fun n => (hlt n).le) + tendsto_one_div_add_atTop_nhds_zero_nat + have hxmem : ∀ᶠ n in atTop, x ∈ closedBall (w n) (1 * δ n) := + Filter.Eventually.of_forall (fun n => by simpa [hw, hδ, one_mul] using hxin n) + have hentry : ∀ i j, Tendsto (fun n => avgMat (B n) a i j) atTop (𝓝 (a x i j)) := by + intro i j + have hb := hx_diff i j (l := atTop) w δ hδtend hxmem + simpa [avgMat_entry_eq_setAverage, hB, hw, hδ] using hb + have htend : Tendsto (fun n => avgMat (B n) a) atTop (𝓝 (a x)) := + tendsto_pi_nhds.2 fun i => tendsto_pi_nhds.2 fun j => hentry i j + refine (isClosed_isEllipticMatrix (lam := lam) (Lam := Lam)).mem_of_tendsto htend + (Filter.Eventually.of_forall (fun n => ?_)) + exact H (qf n) (rf n) (hpos n) (hsub n) + +/-! ## The characterization -/ + +/-- **The rational-ball characterization of spatial a.e. ellipticity.** For an +open set `U`, a carrier field is a.e.-elliptic on the restricted measure of `U` +iff all its rational-ball averages inside `U` are elliptic. This is the exact +set equality behind the honest `LocalSigmaR U`-measurability of the slice +event. -/ +theorem aeRestrict_isEllipticMatrix_iff_forall_ratBall {U : Set (Vec d)} + (hUopen : IsOpen U) (lam Lam : ℝ) (a : RegCoeffField d) : + (∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix lam Lam (a x)) ↔ + ∀ (q : Fin d → ℚ) (r : ℚ), 0 < (r : ℝ) → closedBall (ratPt q) (r : ℝ) ⊆ U → + IsEllipticMatrix lam Lam (avgMat (closedBall (ratPt q) (r : ℝ)) a) := by + refine ⟨fun hae q r hr hsub => ?_, aeRestrict_isEllipticMatrix_of_forall_ratBall hUopen⟩ + refine isEllipticMatrix_avgMat_of_aeRestrict hae (isCompact_closedBall _ _) hsub ?_ ?_ + · exact (measure_closedBall_pos volume (ratPt q) hr).ne' + · exact measure_closedBall_lt_top.ne + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSet.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSet.lean new file mode 100644 index 0000000000..a4ef4edfff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSet.lean @@ -0,0 +1,273 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import Mathlib.Analysis.Convex.Basic +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Basic +public import Mathlib.Topology.Instances.Matrix + +/-! +# The elliptic-matrix locus is closed, convex and measurable + +This file ports the finite-dimensional closed/convex description of the elliptic +matrix locus `{A : Mat d | IsEllipticMatrix lam Lam A}` from the coarse-graining +salvage (`Homogenization.Book.Ch04.Internal.SliceNullMeasurability`), adapted to +the shipped tree's imports. It is the ingredient that makes the carrier +truncation `ellipticTruncateReg` a genuine carrier element: the pointwise +predicate `IsEllipticMatrix 1 Θ (a x)` cuts out a Borel set of matrices, so the +pullback `{x | IsEllipticMatrix 1 Θ (a x)}` is measurable. + +The fourth ellipticity inequality `Lam⁻¹ |ξ|² ≤ ξ · A⁻¹ ξ` is replaced by an +inverse-free image bound `|A η|² ≤ Lam (η · A η)` (`IsEllipticEntryLU`), whose +sublevel description is a countable-free intersection of closed half-spaces, +hence closed and convex. + +The `Mat d = Fin d → Fin d → ℝ` matrix-entry space carries the product Borel +structure; we record the corresponding `BorelSpace` instance transferred from the +genuine pi type so that closed matrix sets are measurable for the carrier's +`instMatMeasurableSpace`. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## Local copy of the identity action -/ + +/-- The identity matrix acts as the identity on vectors (local copy, kept private +to avoid depending on the raw random-field layer). -/ +private theorem matVecMul_one_local (x : Vec d) : matVecMul (1 : Mat d) x = x := by + funext i + simp [matVecMul, Matrix.one_apply, Finset.sum_ite_eq] + +/-- The flux inequality `‖B η‖² ≤ Lam · η · (symmPart B) η` for an elliptic +matrix `B` (local copy of the coarse-graining fact). -/ +private theorem vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix + {lam Lam : ℝ} {B : Mat d} (hB : IsEllipticMatrix lam Lam B) (η : Vec d) : + vecNormSq (matVecMul B η) ≤ Lam * vecDot η (matVecMul (symmPart B) η) := by + have hdet : IsUnit B.det := isUnit_det_of_isEllipticMatrix hB + set ξ := matVecMul B η with hξ + have hBinv : matVecMul B⁻¹ ξ = η := by + rw [hξ, matVecMul_mul, Matrix.nonsing_inv_mul B hdet, matVecMul_one_local] + have hident : + vecDot ξ (matVecMul B⁻¹ ξ) = vecDot η (matVecMul (symmPart B) η) := by + rw [hBinv, vecDot_comm, vecDot_matVecMul_symmPart, hξ] + have hLam_pos : 0 < Lam := lt_of_lt_of_le hB.1 hB.2.1 + have hsecond : Lam⁻¹ * vecNormSq ξ ≤ vecDot ξ (matVecMul B⁻¹ ξ) := hB.2.2.2 ξ + rw [hident] at hsecond + have hscaled := mul_le_mul_of_nonneg_left hsecond hLam_pos.le + have hcancel : Lam * (Lam⁻¹ * vecNormSq ξ) = vecNormSq ξ := by + field_simp [hLam_pos.ne'] + rw [hcancel] at hscaled + exact hscaled + +/-! ## The inverse-free ellipticity predicate -/ + +/-- The two inverse-free ellipticity inequalities for general constants +`(lam, Lam)`, as a predicate on the matrix-entry space `Mat d`. Coercivity is a +linear inequality in the matrix; the image bound is a convex-quadratic `≤ affine` +inequality. Both loci are closed and convex. -/ +def IsEllipticEntryLU (lam Lam : ℝ) (v : Mat d) : Prop := + (∀ ξ : Vec d, lam * vecNormSq ξ ≤ vecDot ξ (matVecMul v ξ)) ∧ + (∀ η : Vec d, vecNormSq (matVecMul v η) ≤ Lam * vecDot η (matVecMul v η)) + +/-- **Inverse-free characterization for general `(lam, Lam)`.** Given coercivity, +the fourth ellipticity inequality is equivalent to the inverse-free image bound. -/ +theorem isEllipticMatrix_iff_isEllipticEntryLU {lam Lam : ℝ} (A : Mat d) : + IsEllipticMatrix lam Lam A ↔ + 0 < lam ∧ lam ≤ Lam ∧ IsEllipticEntryLU lam Lam A := by + constructor + · intro hA + refine ⟨hA.1, hA.2.1, fun ξ => hA.2.2.1 ξ, fun η => ?_⟩ + have h := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hA η + rwa [vecDot_matVecMul_symmPart] at h + · rintro ⟨hlam, hle, hc, himg⟩ + have hLam_pos : 0 < Lam := lt_of_lt_of_le hlam hle + have hlin : ∀ x y : Vec d, matVecMul A (x - y) = matVecMul A x - matVecMul A y := by + intro x y; funext i + simp [matVecMul, mul_sub, Finset.sum_sub_distrib, Pi.sub_apply] + have hinj : Function.Injective (matVecMul A) := by + intro x y hxy + have hz : matVecMul A (x - y) = 0 := by rw [hlin, hxy]; simp + have hcz := hc (x - y) + rw [hz, vecDot_zero_right] at hcz + have hnn : lam * vecNormSq (x - y) ≤ 0 := hcz + have hznn : vecNormSq (x - y) ≤ 0 := by + by_contra hcon + push Not at hcon + exact absurd hnn (not_le.mpr (mul_pos hlam hcon)) + have hzero : vecNormSq (x - y) = 0 := le_antisymm hznn (vecNormSq_nonneg _) + exact sub_eq_zero.mp (vecNormSq_eq_zero hzero) + have hunit : IsUnit A := Matrix.mulVec_injective_iff_isUnit.mp hinj + have hdet : IsUnit A.det := (Matrix.isUnit_iff_isUnit_det A).mp hunit + refine ⟨hlam, hle, fun ξ => hc ξ, fun ξ => ?_⟩ + set η := matVecMul A⁻¹ ξ with hη + have hAη : matVecMul A η = ξ := by + rw [hη, matVecMul_mul, Matrix.mul_nonsing_inv A hdet, matVecMul_one_local] + have himgη := himg η + rw [hAη] at himgη + have hdot : vecDot η ξ = vecDot ξ (matVecMul A⁻¹ ξ) := by rw [hη, vecDot_comm] + rw [hdot] at himgη + have hthis := mul_le_mul_of_nonneg_left himgη (le_of_lt (inv_pos.mpr hLam_pos)) + rw [← mul_assoc, inv_mul_cancel₀ hLam_pos.ne', one_mul] at hthis + exact hthis + +/-! ## Closedness -/ + +/-- The inverse-free `(lam, Lam)`-ellipticity locus is closed in `Mat d`. -/ +theorem isClosed_isEllipticEntryLU {lam Lam : ℝ} : + IsClosed {v : Mat d | IsEllipticEntryLU lam Lam v} := by + have h1 : IsClosed + {v : Mat d | ∀ ξ : Vec d, lam * vecNormSq ξ ≤ vecDot ξ (matVecMul v ξ)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter (fun ξ => ?_) + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le continuous_const (by fun_prop) + have h2 : IsClosed + {v : Mat d | + ∀ η : Vec d, vecNormSq (matVecMul v η) ≤ Lam * vecDot η (matVecMul v η)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter (fun η => ?_) + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le (by fun_prop) (by fun_prop) + exact h1.inter h2 + +/-! ## Convexity -/ + +/-- Convexity of the squared vector energy along convex combinations. -/ +theorem vecNormSq_convex_le {V W : Vec d} {a b : ℝ} + (ha : 0 ≤ a) (hb : 0 ≤ b) (hab : a + b = 1) : + vecNormSq (a • V + b • W) ≤ a * vecNormSq V + b * vecNormSq W := by + set P := vecDot V V with hP + set Q := vecDot W W with hQ + set R := vecDot V W with hR + have hWV : vecDot W V = R := by rw [hR, vecDot_comm] + have hLHS : vecNormSq (a • V + b • W) = a * a * P + a * b * R + b * a * R + b * b * Q := by + simp only [vecNormSq, vecDot_add_left, vecDot_add_right, vecDot_smul_left, + vecDot_smul_right, hWV, ← hP, ← hQ, ← hR] + ring + have hPQR : (0 : ℝ) ≤ P + Q - 2 * R := by + have hnn := vecNormSq_nonneg (V - W) + have hexp : vecNormSq (V - W) = P + Q - 2 * R := by + simp only [vecNormSq, sub_eq_add_neg, vecDot_add_left, vecDot_add_right, + vecDot_neg_left, vecDot_neg_right, hWV, ← hP, ← hQ, ← hR] + ring + linarith [hexp ▸ hnn] + have hid : + a * P + b * Q - (a * a * P + a * b * R + b * a * R + b * b * Q) = + a * b * (P + Q - 2 * R) := by + have hb' : b = 1 - a := by linarith + subst hb'; ring + have hnnprod : 0 ≤ a * b * (P + Q - 2 * R) := + mul_nonneg (mul_nonneg ha hb) hPQR + have hnV : vecNormSq V = P := hP.symm + have hnW : vecNormSq W = Q := hQ.symm + rw [hLHS, hnV, hnW]; linarith [hid ▸ hnnprod] + +/-- The inverse-free `(lam, Lam)`-ellipticity locus is convex in `Mat d`. -/ +theorem convex_isEllipticEntryLU {lam Lam : ℝ} : + Convex ℝ {v : Mat d | IsEllipticEntryLU lam Lam v} := by + intro v hv w hw a b ha hb hab + refine ⟨fun ξ => ?_, fun η => ?_⟩ + · have hpv := hv.1 ξ + have hpw := hw.1 ξ + have hstep : matVecMul (a • v + b • w) ξ = a • matVecMul v ξ + b • matVecMul w ξ := by + rw [add_matVecMul, smul_matVecMul, smul_matVecMul] + rw [hstep, vecDot_add_right, vecDot_smul_right, vecDot_smul_right] + have hsplit : lam * vecNormSq ξ = a * (lam * vecNormSq ξ) + b * (lam * vecNormSq ξ) := by + rw [← add_mul, hab, one_mul] + rw [hsplit] + have h1 : a * (lam * vecNormSq ξ) ≤ a * vecDot ξ (matVecMul v ξ) := + mul_le_mul_of_nonneg_left hpv ha + have h2 : b * (lam * vecNormSq ξ) ≤ b * vecDot ξ (matVecMul w ξ) := + mul_le_mul_of_nonneg_left hpw hb + linarith + · set V := matVecMul v η with hV + set W := matVecMul w η with hW + have hstep : matVecMul (a • v + b • w) η = a • V + b • W := by + rw [hV, hW, add_matVecMul, smul_matVecMul, smul_matVecMul] + have hconv : vecNormSq (a • V + b • W) ≤ a * vecNormSq V + b * vecNormSq W := + vecNormSq_convex_le ha hb hab + have hqv : a * vecNormSq V ≤ a * (Lam * vecDot η V) := + mul_le_mul_of_nonneg_left (hv.2 η) ha + have hqw : b * vecNormSq W ≤ b * (Lam * vecDot η W) := + mul_le_mul_of_nonneg_left (hw.2 η) hb + have hrhs : + a * (Lam * vecDot η V) + b * (Lam * vecDot η W) = + Lam * vecDot η (a • V + b • W) := by + rw [vecDot_add_right, vecDot_smul_right, vecDot_smul_right]; ring + calc + vecNormSq (matVecMul (a • v + b • w) η) + = vecNormSq (a • V + b • W) := by rw [hstep] + _ ≤ a * vecNormSq V + b * vecNormSq W := hconv + _ ≤ a * (Lam * vecDot η V) + b * (Lam * vecDot η W) := by linarith + _ = Lam * vecDot η (a • V + b • W) := hrhs + _ = Lam * vecDot η (matVecMul (a • v + b • w) η) := by rw [hstep] + +/-! ## The elliptic matrix locus is closed and convex -/ + +/-- The set characterization: for admissible constants, the `IsEllipticMatrix` +locus is exactly the inverse-free `IsEllipticEntryLU` locus. -/ +private theorem isEllipticMatrix_setOf_eq {lam Lam : ℝ} (h : 0 < lam ∧ lam ≤ Lam) : + {A : Mat d | IsEllipticMatrix lam Lam A} = {v : Mat d | IsEllipticEntryLU lam Lam v} := by + ext A + simp only [Set.mem_ofPred_eq] + rw [isEllipticMatrix_iff_isEllipticEntryLU] + exact ⟨fun hA => hA.2.2, fun hA => ⟨h.1, h.2, hA⟩⟩ + +private theorem isEllipticMatrix_setOf_eq_empty {lam Lam : ℝ} (h : ¬ (0 < lam ∧ lam ≤ Lam)) : + {A : Mat d | IsEllipticMatrix lam Lam A} = ∅ := by + ext A + simp only [Set.mem_ofPred_eq, Set.mem_empty_iff_false, iff_false] + intro hA + exact h ⟨hA.1, hA.2.1⟩ + +/-- The `(lam, Lam)`-elliptic matrix locus is closed in `Mat d`. -/ +theorem isClosed_isEllipticMatrix {lam Lam : ℝ} : + IsClosed {A : Mat d | IsEllipticMatrix lam Lam A} := by + by_cases h : 0 < lam ∧ lam ≤ Lam + · rw [isEllipticMatrix_setOf_eq h]; exact isClosed_isEllipticEntryLU + · rw [isEllipticMatrix_setOf_eq_empty h]; exact isClosed_empty + +/-- The `(lam, Lam)`-elliptic matrix locus is convex in `Mat d`. -/ +theorem convex_isEllipticMatrix {lam Lam : ℝ} : + Convex ℝ {A : Mat d | IsEllipticMatrix lam Lam A} := by + by_cases h : 0 < lam ∧ lam ≤ Lam + · rw [isEllipticMatrix_setOf_eq h]; exact convex_isEllipticEntryLU + · rw [isEllipticMatrix_setOf_eq_empty h]; exact convex_empty + +/-! ## Measurability of the matrix locus -/ + +/-- The matrix-entry space `Mat d = Fin d → Fin d → ℝ` carries the product Borel +structure: its carrier σ-algebra `instMatMeasurableSpace` agrees with the Borel +σ-algebra of the product topology. Transferred from the genuine pi type. + +Named distinctly from the raw-`CoeffField` layer's `instBorelSpaceMat` +(`Ch04.Internal.CoarseObservableMeasurability.Basic`) so that the carrier and raw +layers coexist in a single import closure; both witness the same (defeq) product +Borel structure and are found by instance resolution, never by name. -/ +instance instBorelSpaceMatEntry : BorelSpace (Mat d) := + ⟨BorelSpace.measurable_eq (α := Fin d → Fin d → ℝ)⟩ + +/-- **The elliptic matrix locus is measurable.** Being closed in the product +topology, it is Borel, hence measurable for the carrier's matrix σ-algebra. -/ +theorem measurableSet_isEllipticMatrix {lam Lam : ℝ} : + MeasurableSet {A : Mat d | IsEllipticMatrix lam Lam A} := + isClosed_isEllipticMatrix.measurableSet + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSupport.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSupport.lean new file mode 100644 index 0000000000..42efff2255 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/EllipticSupport.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability + +/-! +# Measurability of fixed-constant elliptic support events on the carrier + +This file complements `SliceMeasurability.lean` (which treats the countable +quantitative slices with constants `((k+1)⁻¹, k+1)`) with the fixed-constant +support events used by the Examples layer: + +* `isAEEllipticFieldOn_carrier_iff` — on a carrier element, the raw + `IsAEEllipticFieldOn lam Lam U` predicate reduces to its spatial a.e. + ellipticity conjunct (the two measurability conjuncts are free by type); +* `measurableSet_isAEEllipticFieldOn_of_isOpen` — for an *open* observation set + the fixed-constant a.e.-ellipticity event is genuinely measurable for the + canonical carrier σ-algebra (via the rational-ball intersection `slicePart`); +* `measurableSet_forall_openCubeSet_isAEEllipticFieldOn` — the uniform support + event `{a | ∀ Q, IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun}`, a + countable intersection over triadic cubes; +* `measurableSet_ae_isEllipticMatrix_univ` — the global (`Θ`-ellipticity class) + event `{a | ∀ᵐ x, IsEllipticMatrix lam Lam (a x)}` (the case `U = univ`). + +These are the measurable witness sets through which pushforward and Dirac laws +of honest fields verify `UniformEllipticityBounds` and `ThetaEllipticLaw` +(the paper, Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-- On a carrier element, `IsAEEllipticFieldOn lam Lam U` reduces to its spatial +a.e.-ellipticity conjunct: the domain-measurability and entry-measurability +conjuncts are free by the carrier type (general-constants version of +`aeeQuantitativeEllipticSlice_carrier_iff`). -/ +theorem isAEEllipticFieldOn_carrier_iff {U : Set (Vec d)} (hU : MeasurableSet U) + (lam Lam : ℝ) (a : RegCoeffField d) : + IsAEEllipticFieldOn lam Lam U a.toFun ↔ + ∀ᵐ x ∂(volumeMeasureOn U), IsEllipticMatrix lam Lam (a x) := by + constructor + · exact fun h => h.2.2 + · intro h + exact ⟨hU, fun i j => aestronglyMeasurable_restrictCoeffField_carrier U hU a i j, h⟩ + +/-- **The fixed-constant a.e.-ellipticity event on an open set is genuinely +measurable** for the canonical carrier σ-algebra: it equals the countable +rational-ball intersection `slicePart U lam Lam`, which is +`LocalSigmaR U`-measurable. -/ +theorem measurableSet_isAEEllipticFieldOn_of_isOpen {U : Set (Vec d)} + (hUopen : IsOpen U) (lam Lam : ℝ) : + MeasurableSet {a : RegCoeffField d | IsAEEllipticFieldOn lam Lam U a.toFun} := by + have h1 : {a : RegCoeffField d | IsAEEllipticFieldOn lam Lam U a.toFun} + = {a : RegCoeffField d | + ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix lam Lam (a x)} := by + ext a + exact isAEEllipticFieldOn_carrier_iff hUopen.measurableSet lam Lam a + rw [h1, setOf_aeRestrict_isEllipticMatrix_eq_slicePart hUopen lam Lam] + exact LocalSigmaR_le U _ (measurableSet_slicePart lam Lam) + +/-- **The uniform fixed-constant support event is genuinely measurable**: the +countable intersection over triadic cubes of the open-core a.e.-ellipticity +events. -/ +theorem measurableSet_forall_openCubeSet_isAEEllipticFieldOn (lam Lam : ℝ) : + MeasurableSet {a : RegCoeffField d | + ∀ Q : TriadicCube d, IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun} := by + have h1 : {a : RegCoeffField d | + ∀ Q : TriadicCube d, IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun} + = ⋂ Q : TriadicCube d, + {a : RegCoeffField d | IsAEEllipticFieldOn lam Lam (openCubeSet Q) a.toFun} := by + ext a + simp only [Set.mem_ofPred_eq, Set.mem_iInter] + rw [h1] + exact MeasurableSet.iInter fun Q => + measurableSet_isAEEllipticFieldOn_of_isOpen (isOpen_openCubeSet Q) lam Lam + +/-- **The global a.e.-ellipticity event is genuinely measurable** (the case +`U = univ` of the rational-ball route): this is the membership event of the +`Θ`-ellipticity class `Ω_Θ` on the carrier. -/ +theorem measurableSet_ae_isEllipticMatrix_univ (lam Lam : ℝ) : + MeasurableSet {a : RegCoeffField d | + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix lam Lam (a x)} := by + have h1 : {a : RegCoeffField d | + ∀ᵐ x ∂(volume : Measure (Vec d)), IsEllipticMatrix lam Lam (a x)} + = {a : RegCoeffField d | + ∀ᵐ x ∂(volume.restrict (Set.univ : Set (Vec d))), + IsEllipticMatrix lam Lam (a x)} := by + simp only [Measure.restrict_univ] + rw [h1, setOf_aeRestrict_isEllipticMatrix_eq_slicePart isOpen_univ lam Lam] + exact LocalSigmaR_le _ _ (measurableSet_slicePart lam Lam) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Endomorphisms.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Endomorphisms.lean new file mode 100644 index 0000000000..2628ba62ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Endomorphisms.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.EllipticSet +public import LeanPool.CoarseGraining.Homogenization.Probability.RandomField +public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace + +/-! +# Carrier endomorphisms + +This file equips the regular-fields carrier `RegCoeffField d` with the structural +self-maps used by the law layer of the homogenization development: spatial +translation, signed-permutation rotation (isotropy), triadic rescaling and +dilation, restriction to a measurable set, and elliptic truncation. Each map is +shown to preserve the carrier (entrywise Borel measurability and local +integrability are stable) and, where possible, to be genuinely measurable for the +canonical carrier σ-algebra `pointwiseSigmaR ⊔ entryTestSigmaR`. + +The measurability proofs go through the P1 probe-transport criterion +`measurable_of_entryTestR_transport`: each entry generator on the transformed +field equals a scalar multiple of a relabelled entry generator on the input, the +scalar being the Jacobian factor of the underlying change of variables. + +`translateReg`, `rotateReg`, `rescaleReg`, `dilateReg` and `restrictReg` are +genuinely measurable at the join. `ellipticTruncateReg` is a genuine carrier +element and is measurable for the *pointwise* lane; its entry-test lane is a +nonlinear integral functional that is not a transported generator (see the note +at that declaration). + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Classical + +noncomputable section + +variable {d : ℕ} + +/-! ## Local-integrability transport under a homeomorphism -/ + +/-- **Local integrability is stable under precomposition with a homeomorphism +whose pushforward of Lebesgue measure is a finite nonzero rescaling of Lebesgue +measure.** This covers translation and rotation (`c = 1`) and triadic +rescaling/dilation (`c` the Jacobian factor). -/ +theorem locallyIntegrable_comp_homeomorph_of_map_smul {f : Vec d → ℝ} + (hf : LocallyIntegrable f volume) (e : Vec d ≃ₜ Vec d) {c : ℝ≥0∞} + (hc0 : c ≠ 0) (hctop : c ≠ ∞) (hmap : Measure.map e volume = c • volume) : + LocallyIntegrable (fun x => f (e x)) volume := by + have hcv : LocallyIntegrable f (c • (volume : Measure (Vec d))) := by + intro x + obtain ⟨U, hU, hint⟩ := hf x + refine ⟨U, hU, ?_⟩ + rw [IntegrableOn, Measure.restrict_smul] + exact (integrable_smul_measure hc0 hctop).2 hint + have hmapInt : LocallyIntegrable f (Measure.map e volume) := by rw [hmap]; exact hcv + exact (locallyIntegrable_map_homeomorph e).mp hmapInt + +/-- Local-integrability transport under a measure-preserving homeomorphism. -/ +theorem locallyIntegrable_comp_homeomorph_of_measurePreserving {f : Vec d → ℝ} + (hf : LocallyIntegrable f volume) (e : Vec d ≃ₜ Vec d) + (hmp : MeasurePreserving e volume volume) : + LocallyIntegrable (fun x => f (e x)) volume := + locallyIntegrable_comp_homeomorph_of_map_smul hf e (c := 1) one_ne_zero ENNReal.one_ne_top + (by rw [hmp.map_eq, one_smul]) + +/-! ## Matrix-action infrastructure (re-derived, public) -/ + +/-- Continuity of the linear action `x ↦ R x` (local copy of the raw-layer +private lemma). -/ +theorem continuous_matVecMul (R : Mat d) : Continuous (fun x : Vec d => matVecMul R x) := by + change Continuous fun x : Fin d → ℝ => fun i => ∑ j, R i j * x j + exact continuous_pi fun i => + continuous_finsetSum Finset.univ fun j _ => continuous_const.mul (continuous_apply j) + +private theorem matVecMul_one' (x : Vec d) : matVecMul (1 : Mat d) x = x := by + funext i; simp [matVecMul, Matrix.one_apply, Finset.sum_ite_eq] + +/-- A signed permutation acts as a homeomorphism of the base space. -/ +def matVecMulHomeomorph (R : Mat d) (hR : IsSignedPermutationMatrix R) : Vec d ≃ₜ Vec d where + toEquiv := + { toFun := matVecMul R + invFun := matVecMul (matTranspose R) + left_inv := fun x => by rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one'] + right_inv := fun x => by rw [matVecMul_mul, hR.mul_transpose_self, matVecMul_one'] } + continuous_toFun := continuous_matVecMul R + continuous_invFun := continuous_matVecMul (matTranspose R) + +@[simp] theorem matVecMulHomeomorph_apply (R : Mat d) (hR : IsSignedPermutationMatrix R) + (x : Vec d) : matVecMulHomeomorph R hR x = matVecMul R x := rfl + +/-- The signed-permutation action preserves Lebesgue measure (`|det R| = 1`). -/ +theorem measurePreserving_matVecMul (R : Mat d) (hR : IsSignedPermutationMatrix R) : + MeasurePreserving (fun x : Vec d => matVecMul R x) volume volume := by + refine ⟨(continuous_matVecMul R).measurable, ?_⟩ + have hscale : ENNReal.ofReal |(Matrix.det R)⁻¹| = 1 := by + rw [abs_inv, hR.abs_det_eq_one]; norm_num + change Measure.map (Matrix.toLin' R) volume = volume + rw [Real.map_matrix_volume_pi_eq_smul_volume_pi hR.det_ne_zero, hscale, one_smul] + +/-! ## Translation -/ + +/-- Precomposition with the spatial translation `x ↦ x + z` is a carrier +endomorphism (mirrors `translateCoeffField` on the raw carrier). -/ +def translateReg (z : Vec d) (a : RegCoeffField d) : RegCoeffField d where + toFun := fun x => a (x + z) + entry_measurable := fun i j => + (a.entry_measurable i j).comp ((measurable_id.add measurable_const)) + entry_locInt := fun i j => + locallyIntegrable_comp_homeomorph_of_measurePreserving (a.entry_locInt i j) + (Homeomorph.addRight z) (by + simpa [Homeomorph.coe_addRight] using + measurePreserving_add_right (volume : Measure (Vec d)) z) + +@[simp] theorem translateReg_apply (z : Vec d) (a : RegCoeffField d) (x : Vec d) : + translateReg z a x = a (x + z) := rfl + +/-- Generator transport for translation: the entry test of a translated field is +the entry test against the back-translated probe (Jacobian factor `1`). -/ +theorem entryTestR_translateReg (i j : Fin d) (φ : Vec d → ℝ) (z : Vec d) + (a : RegCoeffField d) : + entryTestR i j φ (translateReg z a) = entryTestR i j (fun y => φ (y - z)) a := by + unfold entryTestR + have hcomp := (measurePreserving_add_right (volume : Measure (Vec d)) z).integral_comp + (Homeomorph.addRight z).measurableEmbedding (fun y => a y i j * φ (y - z)) + rw [← hcomp] + refine integral_congr_ae ?_ + filter_upwards with x + simp only [translateReg_apply, add_sub_cancel_right] + +/-- **Translation is genuinely measurable at the join.** -/ +theorem measurable_translateReg (z : Vec d) : Measurable (translateReg (d := d) z) := by + refine measurable_of_entryTestR_transport ?_ ?_ + · intro y i j + have hfun : (fun a : RegCoeffField d => translateReg z a y i j) + = fun a => a (y + z) i j := rfl + rw [hfun]; exact measurable_apply_entry (y + z) i j + · intro i j φ hφ + exact ⟨1, i, j, (fun y => φ (y - z)), + hφ.comp_homeomorph (Homeomorph.subRight z), fun a => by + rw [entryTestR_translateReg]; ring⟩ + +/-! ## Signed-permutation rotation (isotropy) -/ + +/-- The conjugation-by-`R` collapse for a signed permutation `R` with underlying +permutation `σ` and signs `s`: `(Rᵀ M R)_{ij} = s_i s_j M_{σ i, σ j}`. This is +the algebraic heart of the isotropy endomorphism. -/ +theorem matTranspose_mul_mul_apply {R : Mat d} {σ : Equiv.Perm (Fin d)} {s : Fin d → ℝ} + (hRdef : ∀ i j, R i j = if i = σ j then s j else 0) (M : Mat d) (i j : Fin d) : + (matTranspose R * M * R) i j = s i * s j * M (σ i) (σ j) := by + classical + rw [Matrix.mul_apply, Finset.sum_eq_single (σ j)] + · rw [hRdef (σ j) j, if_pos rfl, Matrix.mul_apply, Finset.sum_eq_single (σ i)] + · rw [matTranspose, Matrix.transpose_apply, hRdef (σ i) i, if_pos rfl]; ring + · intro l _ hl + rw [matTranspose, Matrix.transpose_apply, hRdef l i, if_neg hl, zero_mul] + · intro hnot; exact absurd (Finset.mem_univ (σ i)) hnot + · intro k _ hk; rw [hRdef k j, if_neg hk, mul_zero] + · intro hnot; exact absurd (Finset.mem_univ (σ j)) hnot + +/-- Precomposition-and-conjugation with a signed permutation `R` is a carrier +endomorphism (mirrors `rotateCoeffField`). The signed-permutation hypothesis is +what makes local integrability stable: `matVecMul R` is a measure-preserving +homeomorphism. -/ +def rotateReg (R : Mat d) (hR : IsSignedPermutationMatrix R) (a : RegCoeffField d) : + RegCoeffField d where + toFun := fun x => (matTranspose R) * (a (matVecMul R x)) * R + entry_measurable := fun i j => by + obtain ⟨σ, s, _hs, hRdef⟩ := id hR + have hcollapse : (fun x => (matTranspose R * a (matVecMul R x) * R) i j) + = fun x => s i * s j * a (matVecMul R x) (σ i) (σ j) := + funext fun x => matTranspose_mul_mul_apply hRdef _ i j + rw [hcollapse] + exact (((a.entry_measurable (σ i) (σ j)).comp + (continuous_matVecMul R).measurable).const_mul _) + entry_locInt := fun i j => by + obtain ⟨σ, s, _hs, hRdef⟩ := id hR + have hcollapse : (fun x => (matTranspose R * a (matVecMul R x) * R) i j) + = fun x => s i * s j * a (matVecMul R x) (σ i) (σ j) := + funext fun x => matTranspose_mul_mul_apply hRdef _ i j + rw [hcollapse] + have hg : LocallyIntegrable + (fun x => a (matVecMul R x) (σ i) (σ j)) volume := + locallyIntegrable_comp_homeomorph_of_measurePreserving (a.entry_locInt (σ i) (σ j)) + (matVecMulHomeomorph R hR) (measurePreserving_matVecMul R hR) + show LocallyIntegrable + (fun x => (s i * s j) • a (matVecMul R x) (σ i) (σ j)) volume + exact hg.smul (s i * s j) + +@[simp] theorem rotateReg_apply (R : Mat d) (hR : IsSignedPermutationMatrix R) + (a : RegCoeffField d) (x : Vec d) : + rotateReg R hR a x = (matTranspose R) * (a (matVecMul R x)) * R := rfl + +/-- **Signed-permutation rotation is genuinely measurable at the join.** -/ +theorem measurable_rotateReg (R : Mat d) (hR : IsSignedPermutationMatrix R) : + Measurable (rotateReg R hR) := by + obtain ⟨σ, s, _hs, hRdef⟩ := id hR + refine measurable_of_entryTestR_transport ?_ ?_ + · intro y i j + have hcollapse : (fun a : RegCoeffField d => rotateReg R hR a y i j) + = fun a => s i * s j * a (matVecMul R y) (σ i) (σ j) := + funext fun a => matTranspose_mul_mul_apply hRdef _ i j + rw [hcollapse] + exact ((measurable_apply_entry (matVecMul R y) (σ i) (σ j)).const_mul _) + · intro i j φ hφ + refine ⟨s i * s j, σ i, σ j, (fun y => φ (matVecMul (matTranspose R) y)), + hφ.comp_homeomorph (matVecMulHomeomorph (matTranspose R) hR.transpose), fun a => ?_⟩ + unfold entryTestR + have hcv := (measurePreserving_matVecMul R hR).integral_comp + (matVecMulHomeomorph R hR).measurableEmbedding + (fun y => a y (σ i) (σ j) * φ (matVecMul (matTranspose R) y)) + have hleft : (∫ x, rotateReg R hR a x i j * φ x ∂volume) + = s i * s j * ∫ x, (a (matVecMul R x) (σ i) (σ j) * + φ (matVecMul (matTranspose R) (matVecMul R x))) ∂volume := by + rw [← integral_const_mul] + refine integral_congr_ae ?_ + filter_upwards with x + rw [rotateReg_apply, matTranspose_mul_mul_apply hRdef] + have hback : matVecMul (matTranspose R) (matVecMul R x) = x := by + rw [matVecMul_mul, hR.transpose_mul_self, matVecMul_one'] + rw [hback]; ring + rw [hleft, hcv] + +/-! ## Spatial scaling (rescale / dilate) -/ + +/-- Precomposition with a nonzero spatial scaling `x ↦ r • x` is a carrier +endomorphism. Local integrability is stable because the scaling is a +homeomorphism whose Jacobian is the finite nonzero factor `|r|^{-d}`; the entry +generators transport with exactly this scalar. -/ +def smulReg (r : ℝ) (hr : r ≠ 0) (a : RegCoeffField d) : RegCoeffField d where + toFun := fun x => a (r • x) + entry_measurable := fun i j => + (a.entry_measurable i j).comp (measurable_id.const_smul r) + entry_locInt := fun i j => + locallyIntegrable_comp_homeomorph_of_map_smul (a.entry_locInt i j) + (Homeomorph.smulOfNeZero r hr) + (c := ENNReal.ofReal |(r ^ Module.finrank ℝ (Vec d))⁻¹|) + (by + rw [Ne, ENNReal.ofReal_eq_zero, not_le, abs_pos] + exact inv_ne_zero (pow_ne_zero _ hr)) + ENNReal.ofReal_ne_top + (Measure.map_addHaar_smul volume hr) + +@[simp] theorem smulReg_apply (r : ℝ) (hr : r ≠ 0) (a : RegCoeffField d) (x : Vec d) : + smulReg r hr a x = a (r • x) := rfl + +/-- Generator transport for a spatial scaling: the entry test of a scaled field is +the Jacobian factor `|r|^{-d}` times the entry test against the inverse-scaled +probe. -/ +theorem entryTestR_smulReg (i j : Fin d) (φ : Vec d → ℝ) (r : ℝ) (hr : r ≠ 0) + (a : RegCoeffField d) : + entryTestR i j φ (smulReg r hr a) + = |(r ^ Module.finrank ℝ (Vec d))⁻¹| * entryTestR i j (fun y => φ (r⁻¹ • y)) a := by + unfold entryTestR + have hcv := Measure.integral_comp_smul (volume : Measure (Vec d)) + (fun y => a y i j * φ (r⁻¹ • y)) r + have hleft : (∫ x, smulReg r hr a x i j * φ x ∂volume) + = ∫ x, (a (r • x) i j * φ (r⁻¹ • (r • x))) ∂volume := by + refine integral_congr_ae ?_ + filter_upwards with x + rw [smulReg_apply, inv_smul_smul₀ hr] + rw [hleft, hcv, smul_eq_mul] + +/-- **Spatial scaling is genuinely measurable at the join.** -/ +theorem measurable_smulReg (r : ℝ) (hr : r ≠ 0) : Measurable (smulReg (d := d) r hr) := by + refine measurable_of_entryTestR_transport ?_ ?_ + · intro y i j + have hfun : (fun a : RegCoeffField d => smulReg r hr a y i j) + = fun a => a (r • y) i j := rfl + rw [hfun]; exact measurable_apply_entry (r • y) i j + · intro i j φ hφ + exact ⟨|(r ^ Module.finrank ℝ (Vec d))⁻¹|, i, j, (fun y => φ (r⁻¹ • y)), + hφ.comp_homeomorph (Homeomorph.smulOfNeZero r⁻¹ (inv_ne_zero hr)), + fun a => entryTestR_smulReg i j φ r hr a⟩ + +/-- Triadic rescaling by `3^n` (mirrors `rescaleCoeffField`): the rescaled field +is `x ↦ a(3^n • x)`. -/ +def rescaleReg (n : ℕ) : RegCoeffField d → RegCoeffField d := + smulReg ((3 : ℝ) ^ n) (pow_ne_zero n (by norm_num)) + +@[simp] theorem rescaleReg_apply (n : ℕ) (a : RegCoeffField d) (x : Vec d) : + rescaleReg n a x = a (((3 : ℝ) ^ n) • x) := rfl + +theorem measurable_rescaleReg (n : ℕ) : Measurable (rescaleReg (d := d) n) := + measurable_smulReg _ _ + +/-- Triadic dilation by `3^k` (mirrors `dilateCoeffField`): the dilated field is +`x ↦ a(3^{-k} • x)`. -/ +def dilateReg (k : ℤ) : RegCoeffField d → RegCoeffField d := + smulReg (((3 : ℝ) ^ k)⁻¹) (inv_ne_zero (zpow_ne_zero k (by norm_num))) + +@[simp] theorem dilateReg_apply (k : ℤ) (a : RegCoeffField d) (x : Vec d) : + dilateReg k a x = a ((((3 : ℝ) ^ k)⁻¹) • x) := rfl + +theorem measurable_dilateReg (k : ℤ) : Measurable (dilateReg (d := d) k) := + measurable_smulReg _ _ + +/-! ## Restriction to a measurable set -/ + +/-- Restriction of a carrier field to a measurable set `U` (zero outside `U`; +mirrors `restrictCoeffField`). Both regularity conjuncts are stable: the +restricted entries are indicator products. -/ +def restrictReg (U : Set (Vec d)) (hU : MeasurableSet U) (a : RegCoeffField d) : + RegCoeffField d where + toFun := Set.indicator U a.toFun + entry_measurable := fun i j => by + have hEq : (fun x => Set.indicator U a.toFun x i j) + = Set.indicator U (fun x => a x i j) := by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · simp [Set.indicator_of_notMem hx] + rw [hEq]; exact (a.entry_measurable i j).indicator hU + entry_locInt := fun i j => by + have hEq : (fun x => Set.indicator U a.toFun x i j) + = Set.indicator U (fun x => a x i j) := by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · simp [Set.indicator_of_notMem hx] + rw [hEq, locallyIntegrable_iff] + intro K hK + exact ((a.entry_locInt i j).integrableOn_isCompact hK).indicator hU + +@[simp] theorem restrictReg_apply (U : Set (Vec d)) (hU : MeasurableSet U) + (a : RegCoeffField d) (x : Vec d) : + restrictReg U hU a x = Set.indicator U a.toFun x := rfl + +theorem restrictReg_apply_entry (U : Set (Vec d)) (hU : MeasurableSet U) + (a : RegCoeffField d) (x : Vec d) (i j : Fin d) : + restrictReg U hU a x i j = Set.indicator U (fun x => a x i j) x := by + by_cases hx : x ∈ U + · simp [restrictReg, Set.indicator_of_mem hx] + · simp [restrictReg, Set.indicator_of_notMem hx] + +/-- Generator transport for restriction: the entry test of a restricted field is +the entry test against the indicator-masked probe (Jacobian factor `1`). -/ +theorem entryTestR_restrictReg (i j : Fin d) (φ : Vec d → ℝ) (U : Set (Vec d)) + (hU : MeasurableSet U) (a : RegCoeffField d) : + entryTestR i j φ (restrictReg U hU a) = entryTestR i j (Set.indicator U φ) a := by + unfold entryTestR + refine integral_congr_ae ?_ + filter_upwards with x + rw [restrictReg_apply_entry] + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · simp [Set.indicator_of_notMem hx] + +/-- **Restriction is genuinely measurable at the join.** -/ +theorem measurable_restrictReg (U : Set (Vec d)) (hU : MeasurableSet U) : + Measurable (restrictReg U hU) := by + refine measurable_of_entryTestR_transport ?_ ?_ + · intro y i j + by_cases hy : y ∈ U + · have hfun : (fun a : RegCoeffField d => restrictReg U hU a y i j) + = fun a => a y i j := by + funext a; rw [restrictReg_apply_entry, Set.indicator_of_mem hy] + rw [hfun]; exact measurable_apply_entry y i j + · have hfun : (fun a : RegCoeffField d => restrictReg U hU a y i j) + = fun _ => (0 : ℝ) := by + funext a; rw [restrictReg_apply_entry, Set.indicator_of_notMem hy] + rw [hfun]; exact measurable_const + · intro i j φ hφ + exact ⟨1, i, j, Set.indicator U φ, hφ.indicator hU, fun a => by + rw [entryTestR_restrictReg]; ring⟩ + +/-! ## Elliptic truncation + +`ellipticTruncateReg Θ a` keeps `a x` where it is `(1, Θ)`-elliptic and replaces +it by the identity elsewhere (mirrors the coarse-graining a.e.-bridge +truncation). It is a genuine carrier element: on the elliptic branch the entries +are bounded by `Θ` (`abs_apply_le_of_isEllipticMatrix`), off it they are entries +of the identity matrix, so each entry is bounded and measurable, hence locally +integrable. + +**Measurability (research item).** The *pointwise* lane is genuinely measurable +(`measurable_pointwiseSigmaR_ellipticTruncateReg`): the elliptic locus is Borel +(`measurableSet_isEllipticMatrix`), so each coordinate `a ↦ (trunc a) y_{ij}` is a +piecewise-measurable function of the evaluations of `a`. The *entry-test* lane, +however, is **not** a transported generator: `entryTestR i j φ (trunc a)` is the +integral of a genuinely nonlinear (piecewise) function of the matrix values +`a x`, not a scalar multiple of a linear entry generator of `a`. On the carrier +the joint map `(a, x) ↦ a x` is not measurable for the pointwise product +σ-algebra (uncountably many coordinates), and no monotone-class approximation is +available for merely locally-integrable `a` (Riemann sums need not converge), so +the entry-test lane cannot be discharged from the P1 generators. We therefore +land `ellipticTruncateReg` with pointwise-lane measurability only and flag the +join measurability as a design signal for the consumer packets (P5/P7). -/ +def ellipticTruncateReg (Θ : ℝ) (a : RegCoeffField d) : RegCoeffField d where + toFun := fun x => if IsEllipticMatrix 1 Θ (a x) then a x else 1 + entry_measurable := fun i j => by + have hay : Measurable (fun x : Vec d => a x) := + measurable_matrix_of_entries (fun i' j' => a.entry_measurable i' j') + have hSet : MeasurableSet {x : Vec d | IsEllipticMatrix 1 Θ (a x)} := + hay measurableSet_isEllipticMatrix + have hEq : (fun x => (if IsEllipticMatrix 1 Θ (a x) then a x else 1) i j) + = fun x => if x ∈ {x | IsEllipticMatrix 1 Θ (a x)} + then a x i j else (1 : Mat d) i j := by + funext x; by_cases hx : IsEllipticMatrix 1 Θ (a x) <;> simp [hx, Set.mem_ofPred_eq] + rw [hEq] + exact Measurable.ite hSet (a.entry_measurable i j) measurable_const + entry_locInt := fun i j => by + have hay : Measurable (fun x : Vec d => a x) := + measurable_matrix_of_entries (fun i' j' => a.entry_measurable i' j') + have hSet : MeasurableSet {x : Vec d | IsEllipticMatrix 1 Θ (a x)} := + hay measurableSet_isEllipticMatrix + have hEq : (fun x => (if IsEllipticMatrix 1 Θ (a x) then a x else 1) i j) + = fun x => if x ∈ {x | IsEllipticMatrix 1 Θ (a x)} + then a x i j else (1 : Mat d) i j := by + funext x; by_cases hx : IsEllipticMatrix 1 Θ (a x) <;> simp [hx, Set.mem_ofPred_eq] + have hmeas : Measurable + (fun x => (if IsEllipticMatrix 1 Θ (a x) then a x else 1) i j) := by + rw [hEq]; exact Measurable.ite hSet (a.entry_measurable i j) measurable_const + refine RegCoeffField.locallyIntegrable_of_bounded_measurable hmeas + (C := max Θ 1) (fun x => ?_) + by_cases hx : IsEllipticMatrix 1 Θ (a x) + · rw [if_pos hx] + exact le_trans (abs_apply_le_of_isEllipticMatrix hx i j) (le_max_left _ _) + · rw [if_neg hx] + have h1 : |(1 : Mat d) i j| ≤ 1 := by + rcases eq_or_ne i j with hij | hij + · subst hij; rw [Matrix.one_apply_eq]; norm_num + · rw [Matrix.one_apply_ne hij]; norm_num + exact le_trans h1 (le_max_right Θ 1) + +@[simp] theorem ellipticTruncateReg_apply (Θ : ℝ) (a : RegCoeffField d) (x : Vec d) : + ellipticTruncateReg Θ a x = if IsEllipticMatrix 1 Θ (a x) then a x else 1 := rfl + +/-- **The elliptic truncation is measurable for the pointwise lane.** See the +declaration docstring: the entry-test lane is a design signal (nonlinear integral +functional, no monotone-class route on the carrier), so join measurability is +deliberately not claimed here. -/ +theorem measurable_pointwiseSigmaR_ellipticTruncateReg (Θ : ℝ) : + @Measurable (RegCoeffField d) (RegCoeffField d) _ (pointwiseSigmaR d) + (ellipticTruncateReg Θ) := by + refine measurable_into_pointwiseSigmaR (measurable_toFun_of_entries ?_) + intro y i j + have hay : Measurable (fun a : RegCoeffField d => a y) := + measurable_matrix_of_entries (fun i' j' => measurable_apply_entry y i' j') + have hSet : MeasurableSet {a : RegCoeffField d | IsEllipticMatrix 1 Θ (a y)} := + hay measurableSet_isEllipticMatrix + have hEq : (fun a : RegCoeffField d => ellipticTruncateReg Θ a y i j) + = fun a => if a ∈ {a : RegCoeffField d | IsEllipticMatrix 1 Θ (a y)} + then a y i j else (1 : Mat d) i j := by + funext a; by_cases ha : IsEllipticMatrix 1 Θ (a y) <;> + simp [ellipticTruncateReg_apply, ha, Set.mem_ofPred_eq] + rw [hEq] + exact Measurable.ite hSet (measurable_apply_entry y i j) measurable_const + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Laws.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Laws.lean new file mode 100644 index 0000000000..2544dfb2f7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Laws.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction +public import Mathlib.Probability.Independence.Basic + +/-! +# Structural laws on the carrier + +This file restates the law-level structural predicates of +`Homogenization.Probability.RandomField` on the honest-fields carrier +`RegCoeffLaw d = Measure (RegCoeffField d)`, using the carrier endomorphisms of +`Endomorphisms.lean` in place of the raw-`CoeffField` ones. The semantic shapes +are preserved: + +* `IsStationaryR` — invariance under integer translations; +* `IsRestrictionUnitRangeDependentR` — independence of the restriction + σ-algebras of unit-separated measurable sets (the `MeasurableSet` + side-conditions are the D7-approved refinement making `RestrictionSigmaR` + well defined); +* `IsIsotropicInLawR` — invariance under signed-permutation rotations; +* `IsAdjointInvariantInLawR` — invariance under the entrywise adjoint. + +Each `Measure.map` is well formed: the underlying endomorphism is measurable +(`measurable_translateReg`, `measurable_rotateReg`, `measurable_adjointReg`), and +we record the corresponding integral/integrable transfer lemmas. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## Stationarity -/ + +/-- A carrier law is **stationary** if it is invariant under every integer +translation (mirrors `IsStationary`). -/ +def IsStationaryR (P : RegCoeffLaw d) : Prop := + ∀ z : Fin d → ℤ, Measure.map (translateReg (intVecToRealVec z)) P = P + +/-- Integral transfer under integer translation for a stationary carrier law. -/ +theorem IsStationaryR.integral_comp_translateReg + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : RegCoeffLaw d} (hP : IsStationaryR P) (z : Fin d → ℤ) + (f : RegCoeffField d → E) (hf : AEStronglyMeasurable f P) : + ∫ a, f (translateReg (intVecToRealVec z) a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq (measurable_translateReg (intVecToRealVec z)) (hP z) f hf + +/-! ## Unit-range dependence -/ + +/-- A carrier law is **restriction-unit-range dependent** if the restriction +σ-algebras of any two sup-unit-separated measurable sets are independent. +This is the pointwise-restriction lane, with the `MeasurableSet` refinement, +and is distinct from the exact source-integral/Euclidean locality assumption; +the differing separation predicates preclude a generic P2 implication. -/ +def IsRestrictionUnitRangeDependentR (P : RegCoeffLaw d) : Prop := + ∀ (U V : Set (Vec d)) (hU : MeasurableSet U) (hV : MeasurableSet V), + AreUnitSeparated U V → + ProbabilityTheory.Indep (RestrictionSigmaR U hU) (RestrictionSigmaR V hV) P + +/-! ## Isotropy -/ + +/-- A carrier law is **isotropic** if it is invariant under every +signed-permutation rotation (mirrors `IsIsotropicInLaw`). -/ +def IsIsotropicInLawR (P : RegCoeffLaw d) : Prop := + ∀ (R : Mat d) (hR : IsSignedPermutationMatrix R), Measure.map (rotateReg R hR) P = P + +/-- Integral transfer under a signed-permutation rotation for an isotropic law. -/ +theorem IsIsotropicInLawR.integral_comp_rotateReg + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : RegCoeffLaw d} (hP : IsIsotropicInLawR P) {R : Mat d} + (hR : IsSignedPermutationMatrix R) (f : RegCoeffField d → E) + (hf : AEStronglyMeasurable f P) : + ∫ a, f (rotateReg R hR a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq (measurable_rotateReg R hR) (hP R hR) f hf + +/-! ## Adjoint invariance -/ + +/-- A carrier law is **adjoint invariant** if it is invariant under the entrywise +adjoint (mirrors `IsAdjointInvariantInLaw`). -/ +def IsAdjointInvariantInLawR (P : RegCoeffLaw d) : Prop := + Measure.map adjointReg P = P + +/-- Integral transfer under the adjoint for an adjoint-invariant law. -/ +theorem IsAdjointInvariantInLawR.integral_comp_adjointReg + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + [MeasurableSpace E] [BorelSpace E] [SecondCountableTopology E] + {P : RegCoeffLaw d} (hP : IsAdjointInvariantInLawR P) + (f : RegCoeffField d → E) (hf : AEStronglyMeasurable f P) : + ∫ a, f (adjointReg a) ∂P = ∫ a, f a ∂P := + integral_comp_eq_of_map_eq measurable_adjointReg hP f hf + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Restriction.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Restriction.lean new file mode 100644 index 0000000000..0e5da4c702 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Restriction.lean @@ -0,0 +1,101 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Endomorphisms + +/-! +# The restriction σ-algebra on the carrier + +The restriction σ-algebra `RestrictionSigmaR U hU` is the σ-algebra of carrier +events determined by the values of the field on the measurable set `U`: the +comap of the canonical carrier σ-algebra along the restriction endomorphism +`restrictReg U hU`. It is the measurable local σ-algebra used in the explicit +pointwise-restriction law lane (see `Laws.lean`). + +`RestrictionSigmaR` is coarser than the canonical carrier σ-algebra, and monotone +under set inclusion (with the `MeasurableSet` discipline that both restriction +maps be well defined, matching the D7-approved coarsening interface). The +separation predicate `AreUnitSeparated` is the ambient sup-norm raw-set +predicate of `Homogenization.Probability.RandomField`, reused unchanged. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} +/-- The restriction σ-algebra on the carrier: the comap of the canonical carrier +σ-algebra along the restriction endomorphism `restrictReg U hU`. -/ +def RestrictionSigmaR (U : Set (Vec d)) (hU : MeasurableSet U) : + MeasurableSpace (RegCoeffField d) := + MeasurableSpace.comap (restrictReg U hU) inferInstance + +/-- The restriction endomorphism is measurable from the restriction σ-algebra. -/ +theorem measurable_restrictReg_restrictionSigmaR (U : Set (Vec d)) (hU : MeasurableSet U) : + @Measurable _ _ (RestrictionSigmaR U hU) _ (restrictReg U hU) := + measurable_iff_comap_le.mpr le_rfl + +/-- Point evaluation inside `U` remains observable for the restriction +σ-algebra: it factors through the restricted field. -/ +theorem measurable_apply_entry_restrictionSigmaR_of_mem {U : Set (Vec d)} + (hU : MeasurableSet U) {x : Vec d} (hx : x ∈ U) (i j : Fin d) : + @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ + (fun a : RegCoeffField d => a x i j) := by + have hfactor : (fun a : RegCoeffField d => a x i j) = + fun a => restrictReg U hU a x i j := by + funext a + rw [restrictReg_apply_entry, Set.indicator_of_mem hx] + rw [hfactor] + exact (measurable_apply_entry x i j).comp + (measurable_restrictReg_restrictionSigmaR U hU) + +/-- The restriction σ-algebra is coarser than the canonical carrier σ-algebra. -/ +theorem restrictionSigmaR_le (U : Set (Vec d)) (hU : MeasurableSet U) : + RestrictionSigmaR U hU ≤ instMeasurableSpaceRegCoeffField d := + measurable_iff_comap_le.mp (measurable_restrictReg U hU) + +/-- Composition identity for nested restrictions: restricting to `V` and then to +`U ⊆ V` is the same as restricting to `U`. -/ +theorem restrictReg_comp_restrictReg_of_subset {U V : Set (Vec d)} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) : + restrictReg U hU ∘ restrictReg V hV = restrictReg U hU := by + funext a + apply RegCoeffField.ext + intro x + by_cases hx : x ∈ U + · have hxV : x ∈ V := hUV hx + simp only [Function.comp_apply, restrictReg_apply, + Set.indicator_of_mem hx, Set.indicator_of_mem hxV] + · simp only [Function.comp_apply, restrictReg_apply, + Set.indicator_of_notMem hx] + +/-- The `U`-restriction endomorphism is measurable from the coarser `V`-restriction +σ-algebra when `U ⊆ V`. -/ +theorem measurable_restrictReg_restrictionSigmaR_of_subset {U V : Set (Vec d)} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) : + @Measurable _ _ (RestrictionSigmaR V hV) _ (restrictReg U hU) := by + simpa [restrictReg_comp_restrictReg_of_subset hU hV hUV, Function.comp] using + (measurable_restrictReg U hU).comp (measurable_restrictReg_restrictionSigmaR V hV) + +/-- **Monotonicity of the restriction σ-algebra under set inclusion.** -/ +theorem RestrictionSigmaR_mono {U V : Set (Vec d)} (hU : MeasurableSet U) + (hV : MeasurableSet V) (hUV : U ⊆ V) : + RestrictionSigmaR U hU ≤ RestrictionSigmaR V hV := by + simpa [RestrictionSigmaR] using + measurable_iff_comap_le.mp + (measurable_restrictReg_restrictionSigmaR_of_subset hU hV hUV) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/RestrictionBridge.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/RestrictionBridge.lean new file mode 100644 index 0000000000..50c4fb10cb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/RestrictionBridge.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Restriction + +/-! +# The local-to-restriction σ-algebra bridge + +This file supplies the σ-algebra comparison + +`LocalSigmaR U ≤ RestrictionSigmaR U hU` + +(`localSigmaR_le_restrictionSigmaR`), the P5 gate of the carrier redesign. It is +the missing link between the two local carrier σ-algebras: + +* `LocalSigmaR U` — generated by entry-test preimages against probes supported in + `U` — is where the honest AEE-slice measurability lives + (`SliceMeasurability.lean`); +* `RestrictionSigmaR U hU` — the comap along the restriction endomorphism + `restrictReg U hU` — is the measurable local σ-algebra defining + `IsRestrictionLocalRandomVariable`. + +The comparison holds because a localized entry-test generator factors through the +restriction endomorphism: for a probe supported in `U`, the restriction leaves the +entry test unchanged (`entryTestR_eq_restrictReg_of_support`), so the generator is +`RestrictionSigmaR`-measurable. Consequently every `LocalSigmaR U`-measurable +observable is a genuine restriction-local random variable — in particular the AEE +slice event, and (once its raw measurability machinery is re-aimed onto the +carrier) the coarse-grained energy `Mu`. + +The final section connects the entry-test generators to the set-integral form +`∫_U w · a(·)_{ij}` in which the raw `Mu`/`toHilbertMatrixL2` measurability +machinery expresses its dense-probe inner products +(`entryTestR_eq_setIntegral_of_support`), so that those inner products are +`LocalSigmaR U`-measurable — hence restriction-local — functions of the carrier +field. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-! ## Restriction leaves supported entry tests unchanged -/ + +/-- For a probe supported in `U`, the restriction endomorphism leaves the entry +test unchanged: the entry integrand `a(·)_{ij} · φ` only sees the values of `a` on +`U`, where `restrictReg U hU a` agrees with `a`. -/ +theorem entryTestR_eq_restrictReg_of_support {U : Set (Vec d)} (hU : MeasurableSet U) + (i j : Fin d) {φ : Vec d → ℝ} (hsupp : Function.support φ ⊆ U) (a : RegCoeffField d) : + entryTestR i j φ a = entryTestR i j φ (restrictReg U hU a) := by + rw [entryTestR_restrictReg] + have hEq : Set.indicator U φ = φ := by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · have hx0 : x ∉ Function.support φ := fun h => hx (hsupp h) + rw [Function.mem_support, not_not] at hx0 + simp [Set.indicator_of_notMem hx, hx0] + rw [hEq] + +/-- A localized entry-test generator is `RestrictionSigmaR U hU`-measurable: it +factors through the (restriction-local-measurable) restriction endomorphism. -/ +theorem measurable_entryTestR_restrictionSigmaR {U : Set (Vec d)} (hU : MeasurableSet U) + (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) (hsupp : Function.support φ ⊆ U) : + @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ (entryTestR i j φ) := by + have hfac : (entryTestR i j φ) = fun a => entryTestR i j φ (restrictReg U hU a) := by + funext a; exact entryTestR_eq_restrictReg_of_support hU i j hsupp a + rw [hfac] + exact (measurable_entryTestR i j hφ).comp (measurable_restrictReg_restrictionSigmaR U hU) + +/-! ## The bridge -/ + +/-- **The local entry-test σ-algebra is coarser than the restriction σ-algebra.** +Each `LocalSigmaR U` generator is a supported entry-test preimage, hence +`RestrictionSigmaR U hU`-measurable. This is the P5 gate: every +`LocalSigmaR U`-measurable observable is a restriction-local random variable. -/ +theorem localSigmaR_le_restrictionSigmaR (U : Set (Vec d)) (hU : MeasurableSet U) : + LocalSigmaR U ≤ RestrictionSigmaR U hU := by + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨i, j, φ, hφ, hsupp, t, ht, rfl⟩ + exact measurable_entryTestR_restrictionSigmaR hU i j hφ hsupp ht + +/-- A carrier observable that is `LocalSigmaR U`-measurable is +`RestrictionSigmaR U hU`-measurable. (For `β = ℝ` this is exactly the +`IsRestrictionLocalRandomVariable` predicate of Chapter 4.) -/ +theorem measurable_restrictionSigmaR_of_measurable_localSigmaR {β : Type*} [MeasurableSpace β] + {U : Set (Vec d)} (hU : MeasurableSet U) {X : RegCoeffField d → β} + (hX : @Measurable (RegCoeffField d) β (LocalSigmaR U) _ X) : + @Measurable (RegCoeffField d) β (RestrictionSigmaR U hU) _ X := + hX.mono (localSigmaR_le_restrictionSigmaR U hU) le_rfl + +/-! ## Entry tests as set integrals (the `Mu`/`toHilbertMatrixL2` orientation) -/ + +/-- For a probe supported in `U`, the entry test equals the set integral +`∫_U φ · a(·)_{ij}` — the exact orientation in which the raw +`Mu`/`toHilbertMatrixL2` measurability machinery expresses its dense-probe inner +products (`inner_toScalarL2_hilbertMatrixL2Entry_eq_setIntegral`). Hence each such +inner product is a `LocalSigmaR U`-measurable — and so restriction-local — +function of the carrier field. -/ +theorem entryTestR_eq_setIntegral_of_support {U : Set (Vec d)} (hU : MeasurableSet U) + (i j : Fin d) {φ : Vec d → ℝ} (hsupp : Function.support φ ⊆ U) (a : RegCoeffField d) : + entryTestR i j φ a = ∫ x in U, φ x * a x i j ∂volume := by + unfold entryTestR + rw [← integral_indicator hU] + refine integral_congr_ae (Filter.Eventually.of_forall (fun x => ?_)) + by_cases hx : x ∈ U + · simp only [Set.indicator_of_mem hx]; ring + · have hx0 : x ∉ Function.support φ := fun h => hx (hsupp h) + rw [Function.mem_support, not_not] at hx0 + simp [Set.indicator_of_notMem hx, hx0] + +/-- The supported set-integral functional `a ↦ ∫_U φ · a(·)_{ij}` is +`RestrictionSigmaR U hU`-measurable. -/ +theorem measurable_setIntegral_restrictionSigmaR {U : Set (Vec d)} (hU : MeasurableSet U) + (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) (hsupp : Function.support φ ⊆ U) : + @Measurable (RegCoeffField d) ℝ (RestrictionSigmaR U hU) _ + (fun a => ∫ x in U, φ x * a x i j ∂volume) := by + have hEq : (fun a : RegCoeffField d => ∫ x in U, φ x * a x i j ∂volume) + = entryTestR i j φ := by + funext a; exact (entryTestR_eq_setIntegral_of_support hU i j hsupp a).symm + rw [hEq] + exact measurable_entryTestR_restrictionSigmaR hU i j hφ hsupp + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Sigma.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Sigma.lean new file mode 100644 index 0000000000..8b3b7818ee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/Sigma.lean @@ -0,0 +1,389 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField +public import Mathlib.MeasureTheory.MeasurableSpace.Prod +public import Mathlib.MeasureTheory.Measure.MeasureSpace +public import Mathlib.MeasureTheory.Integral.Bochner.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Basic + +/-! +# The carrier σ-algebra, its additive structure, and the layered builder + +This file equips the carrier `RegCoeffField d` (see `RegCoeffField.lean`) with a +measurable structure and proves the facts that make it usable as a probability +carrier for the homogenization development. + +* `IsProbeR` — the enriched probe class (bounded, measurable, compactly + supported scalar test functions), adapted from the raw-`CoeffField` + `IsProbe` of the salvage branch; the closure lemmas `of_smooth`, `indicator`, + `comp_homeomorph` are carried over. +* `entryTestR i j φ a = ∫ a(x)_{ij} · φ(x) dx` — the linear single-entry + generator, which is **genuinely additive** on the carrier + (`entryTestR_add`): the integrand `a(·)_{ij} · φ` is honestly integrable + because `a(·)_{ij}` is locally integrable and `φ` is a probe. +* `pointwiseSigmaR`, `entryTestSigmaR`, and the canonical instance + `instMeasurableSpaceRegCoeffField = pointwiseSigmaR ⊔ entryTestSigmaR`. +* the builder criterion `measurable_into_regCoeffField'`, and the crux + `instMeasurableAdd₂`: **addition is genuinely measurable at the join**. +* `measurable_layeredBuilder`: base plus a finite sum of measurable layer maps + is a genuinely measurable carrier-valued map — the acceptance theorem. +* endomorphism transport (`adjointReg`, `measurable_adjointReg`, and the general + `measurable_of_entryTestR_transport`), and `RegCoeffLaw d = Measure ...`. + +The raw `CoeffField`'s ambient σ-algebra is deliberately kept out of scope here, +so the pi structure on `Vec d → Mat d` is the one used throughout (the paper, +Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} + +/-- The entrywise (pi) measurable space on `Mat d`. Declared here — rather than +importing the raw-`CoeffField` layer — so that the raw ambient σ-algebra on +`Vec d → Mat d` stays out of scope and coordinate evaluation is governed by the +pi structure. -/ +instance instMatMeasurableSpace (d : ℕ) : MeasurableSpace (Mat d) := by + change MeasurableSpace (Fin d → Fin d → ℝ); infer_instance + +/-! ## Probes -/ + +/-- The enriched probe class: bounded, measurable, compactly supported scalar +test functions on `Vec d`. Bounded measurability (rather than continuity) is +what keeps the class closed under multiplication by indicators, and is exactly +enough to make the entry generator additive on the carrier (the paper, +Armstrong–Kuusi–Loher, to appear). -/ +structure IsProbeR (φ : Vec d → ℝ) : Prop where + /-- The probe is Borel measurable. -/ + measurable : Measurable φ + /-- The probe is uniformly bounded. -/ + bounded : ∃ C : ℝ, ∀ x, |φ x| ≤ C + /-- The probe has compact support. -/ + hasCompactSupport : HasCompactSupport φ + +/-- The support of `Set.indicator U φ` is contained in the support of `φ`. -/ +private theorem support_indicator_subset_support (U : Set (Vec d)) (φ : Vec d → ℝ) : + Function.support (Set.indicator U φ) ⊆ Function.support φ := by + classical + intro x hx + simp only [Function.mem_support] at hx ⊢ + intro h; apply hx; rw [Set.indicator_apply]; simp [h] + +/-- Smooth compactly-supported probes are enriched probes. -/ +theorem IsProbeR.of_smooth {φ : Vec d → ℝ} (hcont : ContDiff ℝ (⊤ : ℕ∞) φ) + (hcs : HasCompactSupport φ) : IsProbeR φ := by + refine ⟨hcont.continuous.measurable, ?_, hcs⟩ + obtain ⟨C, hC⟩ := hcs.exists_bound_of_continuous hcont.continuous + exact ⟨C, fun x => by simpa [Real.norm_eq_abs] using hC x⟩ + +/-- The enriched probe class is closed under multiplication by the indicator of a +measurable set. -/ +theorem IsProbeR.indicator {φ : Vec d → ℝ} (hφ : IsProbeR φ) {U : Set (Vec d)} + (hU : MeasurableSet U) : IsProbeR (Set.indicator U φ) := by + refine ⟨hφ.measurable.indicator hU, ?_, ?_⟩ + · obtain ⟨C, hC⟩ := hφ.bounded + refine ⟨C, fun x => ?_⟩ + by_cases hx : x ∈ U + · simpa [Set.indicator_of_mem hx] using hC x + · simp only [Set.indicator_of_notMem hx, abs_zero] + exact le_trans (abs_nonneg _) (hC x) + · exact HasCompactSupport.mono hφ.hasCompactSupport (support_indicator_subset_support U φ) + +/-- The enriched probe class is closed under precomposition with a homeomorphism +of the base space (translation/signed-permutation/rescaling transport). -/ +theorem IsProbeR.comp_homeomorph {φ : Vec d → ℝ} (hφ : IsProbeR φ) + (h : Vec d ≃ₜ Vec d) : IsProbeR (φ ∘ h) := by + obtain ⟨C, hC⟩ := hφ.bounded + exact ⟨hφ.measurable.comp h.continuous.measurable, ⟨C, fun x => hC (h x)⟩, + hφ.hasCompactSupport.comp_homeomorph h⟩ + +/-! ## The linear entry generator and its additivity -/ + +/-- The linear single-entry generator on the carrier: `∫ a(x)_{ij} · φ(x) dx`. -/ +def entryTestR (i j : Fin d) (φ : Vec d → ℝ) (a : RegCoeffField d) : ℝ := + ∫ x, a x i j * φ x ∂volume + +/-- On the carrier, the integrand `a(·)_{ij} · φ` of a probe is genuinely +integrable: `a(·)_{ij}` is locally integrable and `φ` is bounded, measurable and +compactly supported, so the product is integrable on the (compact) support of +`φ` and vanishes off it. -/ +theorem integrable_entry_mul_probe (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) + (a : RegCoeffField d) : Integrable (fun x => a x i j * φ x) volume := by + set K := tsupport φ with hKdef + have hK : IsCompact K := hφ.hasCompactSupport + obtain ⟨C, hC⟩ := hφ.bounded + have hIntOn : IntegrableOn (fun x => a x i j) K volume := + (a.entry_locInt i j).integrableOn_isCompact hK + have hmulOn : IntegrableOn (fun x => a x i j * φ x) K volume := by + refine hIntOn.mul_bdd (c := C) hφ.measurable.aestronglyMeasurable.restrict ?_ + filter_upwards with x + simpa [Real.norm_eq_abs] using hC x + have hself : K.indicator (fun x => a x i j * φ x) = fun x => a x i j * φ x := by + apply Set.indicator_eq_self.2 + apply Function.support_subset_iff'.2 + intro x hx + simp [image_eq_zero_of_notMem_tsupport hx] + rw [← hself, integrable_indicator_iff hK.measurableSet] + exact hmulOn + +/-- **Genuine additivity of the entry generator on the carrier.** -/ +theorem entryTestR_add (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) + (a b : RegCoeffField d) : + entryTestR i j φ (a + b) = entryTestR i j φ a + entryTestR i j φ b := by + unfold entryTestR + rw [← integral_add (integrable_entry_mul_probe i j hφ a) + (integrable_entry_mul_probe i j hφ b)] + refine integral_congr_ae ?_ + filter_upwards with x + simp only [RegCoeffField.add_apply, Matrix.add_apply] + ring + +@[simp] theorem entryTestR_zero (i j : Fin d) (φ : Vec d → ℝ) : + entryTestR i j φ (0 : RegCoeffField d) = 0 := by + unfold entryTestR; simp + +theorem entryTestR_smul (i j : Fin d) {φ : Vec d → ℝ} (c : ℝ) (a : RegCoeffField d) : + entryTestR i j φ (c • a) = c * entryTestR i j φ a := by + unfold entryTestR + simp only [RegCoeffField.smul_apply, Matrix.smul_apply, smul_eq_mul] + rw [← integral_const_mul] + refine integral_congr_ae ?_ + filter_upwards with x + ring + +/-- `entryTestR` distributes over finite sums on the carrier. -/ +theorem entryTestR_finsetSum {ι : Type*} (i j : Fin d) {φ : Vec d → ℝ} + (hφ : IsProbeR φ) (s : Finset ι) (g : ι → RegCoeffField d) : + entryTestR i j φ (∑ l ∈ s, g l) = ∑ l ∈ s, entryTestR i j φ (g l) := by + classical + induction s using Finset.induction with + | empty => simp + | insert l s hl ih => + rw [Finset.sum_insert hl, Finset.sum_insert hl, entryTestR_add i j hφ, ih] + +/-! ## The carrier σ-algebra -/ +/-- The pointwise (product) σ-algebra: the comap of the underlying map into the +pi σ-algebra on `Vec d → Mat d`. -/ +def pointwiseSigmaR (d : ℕ) : MeasurableSpace (RegCoeffField d) := + MeasurableSpace.comap RegCoeffField.toFun MeasurableSpace.pi +/-- The entry-test σ-algebra: generated by the preimages of the linear entry +generators over the enriched probe class. -/ +def entryTestSigmaR (d : ℕ) : MeasurableSpace (RegCoeffField d) := + MeasurableSpace.generateFrom + {s | ∃ (i j : Fin d) (φ : Vec d → ℝ), IsProbeR φ ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = entryTestR i j φ ⁻¹' t} + +/-- The canonical measurable structure on the carrier: the join of the pointwise +and entry-test σ-algebras. Both generating families are additive, so this join +supports a genuine `MeasurableAdd₂` (see `instMeasurableAdd₂`). -/ +instance instMeasurableSpaceRegCoeffField (d : ℕ) : MeasurableSpace (RegCoeffField d) := + pointwiseSigmaR d ⊔ entryTestSigmaR d + +theorem pointwiseSigmaR_le (d : ℕ) : + pointwiseSigmaR d ≤ instMeasurableSpaceRegCoeffField d := le_sup_left + +theorem entryTestSigmaR_le (d : ℕ) : + entryTestSigmaR d ≤ instMeasurableSpaceRegCoeffField d := le_sup_right +/-- The **local** carrier σ-algebra on an observation set `U`: generated by the +entry-test preimages using only probes supported in `U`. This is the honest +carrier analog of the raw-`CoeffField` `PointwiseLocalSigma U`: it records exactly the +information about a field carried by linear entry tests localized to `U`. Unlike +the raw fine `PointwiseLocalSigma`, it is coarser than the canonical carrier σ-algebra +(`LocalSigmaR_le`), so bounded local events are genuinely measurable — the +carrier win over the powerset-fine raw local σ-algebra (the paper, +Armstrong–Kuusi–Loher, to appear). -/ +def LocalSigmaR (U : Set (Vec d)) : MeasurableSpace (RegCoeffField d) := + MeasurableSpace.generateFrom + {s | ∃ (i j : Fin d) (φ : Vec d → ℝ), IsProbeR φ ∧ Function.support φ ⊆ U ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = entryTestR i j φ ⁻¹' t} + +/-! ## Measurability infrastructure -/ + +/-- Measurability into a join reduces to measurability into each summand. -/ +theorem measurable_into_sup {α β : Type*} {dom : MeasurableSpace α} + {m1 m2 : MeasurableSpace β} {f : α → β} + (h1 : @Measurable α β dom m1 f) (h2 : @Measurable α β dom m2 f) : + @Measurable α β dom (m1 ⊔ m2) f := by + rw [measurable_iff_comap_le, MeasurableSpace.comap_sup] + exact sup_le h1.comap_le h2.comap_le + +/-- A map into `Mat d` is measurable iff every scalar entry is measurable. -/ +theorem measurable_matrix_of_entries {α : Type*} [MeasurableSpace α] {h : α → Mat d} + (H : ∀ i j, Measurable (fun a => h a i j)) : Measurable h := + measurable_pi_lambda (fun i => measurable_pi_lambda (fun j => H i j)) + +/-- A carrier-valued map is pointwise (pi-)measurable iff every scalar entry +evaluation is measurable. -/ +theorem measurable_toFun_of_entries {α : Type*} [MeasurableSpace α] + {F : α → RegCoeffField d} (H : ∀ (y : Vec d) (i j : Fin d), Measurable (fun a => F a y i j)) : + @Measurable α (Vec d → Mat d) _ MeasurableSpace.pi (fun a => (F a).toFun) := + measurable_pi_lambda (fun y => measurable_matrix_of_entries (fun i j => H y i j)) + +/-- Builder for the pointwise lane. -/ +theorem measurable_into_pointwiseSigmaR {α : Type*} [MeasurableSpace α] + {F : α → RegCoeffField d} + (h : @Measurable α (Vec d → Mat d) _ MeasurableSpace.pi (fun a => (F a).toFun)) : + @Measurable α (RegCoeffField d) _ (pointwiseSigmaR d) F := by + rw [measurable_iff_comap_le, pointwiseSigmaR, MeasurableSpace.comap_comp] + exact h.comap_le + +/-- Builder for the entry-test lane: measurable into `entryTestSigmaR` iff every +generator functional is measurable after the map. -/ +theorem measurable_into_entryTestSigmaR {α : Type*} [MeasurableSpace α] + {F : α → RegCoeffField d} + (h : ∀ (i j : Fin d) (φ : Vec d → ℝ), IsProbeR φ → + Measurable (fun a => entryTestR i j φ (F a))) : + @Measurable α (RegCoeffField d) _ (entryTestSigmaR d) F := by + refine measurable_generateFrom ?_ + rintro s ⟨i, j, φ, hφ, t, ht, rfl⟩ + exact h i j φ hφ ht + +/-- **Builder criterion at the join.** A map into the carrier is measurable for +the canonical σ-algebra iff every scalar entry evaluation is measurable +(pointwise lane) and every entry generator functional is measurable (entry-test +lane). -/ +theorem measurable_into_regCoeffField' {α : Type*} [MeasurableSpace α] + {F : α → RegCoeffField d} + (hpt : ∀ (y : Vec d) (i j : Fin d), Measurable (fun a => F a y i j)) + (hgen : ∀ (i j : Fin d) (φ : Vec d → ℝ), IsProbeR φ → + Measurable (fun a => entryTestR i j φ (F a))) : + Measurable F := + measurable_into_sup + (measurable_into_pointwiseSigmaR (measurable_toFun_of_entries hpt)) + (measurable_into_entryTestSigmaR hgen) + +/-- Scalar entry evaluation is measurable for the canonical σ-algebra (pointwise +information is recovered from the pointwise lane). -/ +theorem measurable_apply_entry (y : Vec d) (i j : Fin d) : + Measurable (fun a : RegCoeffField d => a y i j) := by + have htoFun : @Measurable (RegCoeffField d) (Vec d → Mat d) (pointwiseSigmaR d) + MeasurableSpace.pi RegCoeffField.toFun := Measurable.of_comap_le le_rfl + have hentry : Measurable (fun f : Vec d → Mat d => f y i j) := + ((measurable_pi_apply y).eval).eval + exact (hentry.comp htoFun).mono (pointwiseSigmaR_le d) le_rfl + +/-- The entry generator functional is measurable for the canonical σ-algebra. -/ +theorem measurable_entryTestR (i j : Fin d) {φ : Vec d → ℝ} (hφ : IsProbeR φ) : + Measurable (entryTestR i j φ) := by + have h : @Measurable (RegCoeffField d) ℝ (entryTestSigmaR d) _ (entryTestR i j φ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom ⟨i, j, φ, hφ, t, ht, rfl⟩ + exact h.mono (entryTestSigmaR_le d) le_rfl + +/-- **The local carrier σ-algebra is coarser than the canonical one.** Each +generator of `LocalSigmaR U` is an entry-test preimage of a measurable set, hence +measurable for the canonical σ-algebra. -/ +theorem LocalSigmaR_le (U : Set (Vec d)) : + LocalSigmaR U ≤ instMeasurableSpaceRegCoeffField d := by + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨i, j, φ, hφ, _hsupp, t, ht, rfl⟩ + exact measurable_entryTestR i j hφ ht + +/-! ## The crux: `MeasurableAdd₂` at the join -/ + +/-- **Addition is genuinely measurable at the join.** Both lanes are handled by +additivity of their generators: the pointwise lane by coordinatewise additivity +of evaluations, the entry-test lane by `entryTestR_add`. This is exactly what +fails on the raw junk-field space. -/ +instance instMeasurableAdd₂ : MeasurableAdd₂ (RegCoeffField d) := by + refine ⟨measurable_into_regCoeffField' ?_ ?_⟩ + · intro y i j + have hfun : (fun p : RegCoeffField d × RegCoeffField d => (p.1 + p.2) y i j) + = fun p => p.1 y i j + p.2 y i j := by + funext p; simp only [RegCoeffField.add_apply, Matrix.add_apply] + rw [hfun] + exact ((measurable_apply_entry y i j).comp measurable_fst).add + ((measurable_apply_entry y i j).comp measurable_snd) + · intro i j φ hφ + have hfun : (fun p : RegCoeffField d × RegCoeffField d => entryTestR i j φ (p.1 + p.2)) + = fun p => entryTestR i j φ p.1 + entryTestR i j φ p.2 := + funext fun p => entryTestR_add i j hφ p.1 p.2 + rw [hfun] + exact ((measurable_entryTestR i j hφ).comp measurable_fst).add + ((measurable_entryTestR i j hφ).comp measurable_snd) + +/-! ## The layered builder (acceptance theorem) -/ + +/-- **The layered Superdiffusion builder is a genuinely measurable carrier-valued +map.** Once addition is measurable at the join, a base field-map plus a finite +sum of measurable layer maps is measurable — no a.e. qualification needed. -/ +theorem measurable_layeredBuilder {α ι : Type*} [MeasurableSpace α] {s : Finset ι} + {base : α → RegCoeffField d} {A : ι → α → RegCoeffField d} + (hbase : Measurable base) (hA : ∀ l ∈ s, Measurable (A l)) : + Measurable (fun ω => base ω + ∑ l ∈ s, A l ω) := + hbase.add (Finset.measurable_sum s hA) + +/-! ## Endomorphism transport -/ + +/-- The adjoint (entrywise transpose) is a carrier endomorphism. -/ +def adjointReg (a : RegCoeffField d) : RegCoeffField d where + toFun := fun x => (a x).transpose + entry_measurable := fun i j => by + simpa [Matrix.transpose_apply] using a.entry_measurable j i + entry_locInt := fun i j => by + simpa [Matrix.transpose_apply] using a.entry_locInt j i + +@[simp] theorem adjointReg_apply (a : RegCoeffField d) (x : Vec d) : + adjointReg a x = (a x).transpose := rfl + +/-- Generator transport for the adjoint. -/ +theorem entryTestR_adjointReg (i j : Fin d) (φ : Vec d → ℝ) (a : RegCoeffField d) : + entryTestR i j φ (adjointReg a) = entryTestR j i φ a := by + unfold entryTestR + simp only [adjointReg_apply, Matrix.transpose_apply] + +/-- **The adjoint is genuinely measurable at the join** — the model endomorphism, +measurable by generator transport in both lanes. -/ +theorem measurable_adjointReg : Measurable (adjointReg (d := d)) := by + refine measurable_into_regCoeffField' ?_ ?_ + · intro y i j + have hfun : (fun a : RegCoeffField d => adjointReg a y i j) + = fun a => a y j i := by + funext a; simp only [adjointReg_apply, Matrix.transpose_apply] + rw [hfun]; exact measurable_apply_entry y j i + · intro i j φ hφ + have hfun : (fun a : RegCoeffField d => entryTestR i j φ (adjointReg a)) + = fun a => entryTestR j i φ a := funext fun a => entryTestR_adjointReg i j φ a + rw [hfun]; exact measurable_entryTestR j i hφ + +/-- **General probe-transport criterion for endomorphisms.** A self-map `T` of +the carrier is measurable at the join if every scalar entry of `T a` is a +measurable function of `a`, and each entry generator on `T a` equals a scalar +multiple of a (possibly relabelled) entry generator on `a`. Translation, +rotation, adjoint and dilation all fit this pattern (the paper, +Armstrong–Kuusi–Loher, to appear). -/ +theorem measurable_of_entryTestR_transport {T : RegCoeffField d → RegCoeffField d} + (hpt : ∀ (y : Vec d) (i j : Fin d), Measurable (fun a => T a y i j)) + (htrans : ∀ (i j : Fin d) (φ : Vec d → ℝ), IsProbeR φ → + ∃ (c : ℝ) (i' j' : Fin d) (ψ : Vec d → ℝ), IsProbeR ψ ∧ + ∀ a, entryTestR i j φ (T a) = c * entryTestR i' j' ψ a) : + Measurable T := by + refine measurable_into_regCoeffField' hpt ?_ + intro i j φ hφ + obtain ⟨c, i', j', ψ, hψ, hEq⟩ := htrans i j φ hφ + have hfun : (fun a => entryTestR i j φ (T a)) = fun a => c * entryTestR i' j' ψ a := + funext hEq + rw [hfun] + exact (measurable_entryTestR i' j' hψ).const_mul c + +/-! ## Laws on the carrier -/ + +/-- A **law** on the carrier is a measure on `RegCoeffField d` (for the canonical +σ-algebra). Packet P3 retargets `RestrictionCoeffLaw` to this type. -/ +abbrev RegCoeffLaw (d : ℕ) := Measure (RegCoeffField d) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SliceMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SliceMeasurability.lean new file mode 100644 index 0000000000..e2b98079fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SliceMeasurability.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Differentiation +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalEllipticitySlices +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush + +/-! +# Genuine `LocalSigmaR`-measurability of the AEE quantitative-slice event + +This file completes the honest slice-measurability route (Packet P4b). Using the +rational-ball characterization of spatial a.e. ellipticity +(`RegCoeffField/Differentiation.lean`), it proves that the carrier slice event + +`{a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun}` + +is genuinely measurable for the **local entry-test carrier σ-algebra** +`LocalSigmaR (cubeSet Q)` — not merely null-measurable, and with **no hypothesis +on any law**. This is the P4 report's honest replacement for the comap slice +field, which could not descend to null-measurability. + +The event is written as a countable intersection, over rational balls inside the +open core `openCubeSet Q`, of preimages of the closed elliptic matrix locus under +the `LocalSigmaR`-measurable ball-average maps `avgMat B` +(`measurable_avgMat`). The two free conjuncts of the raw +`IsAEEllipticFieldOn` predicate (measurability of the domain and a.e.-strong +measurability of the coefficient entries) hold for *every* carrier element, by +type (`aeeQuantitativeEllipticSlice_carrier_iff`); the boundary of the half-open +cube is Lebesgue-null, so rational balls in the open core suffice, and +`LocalSigmaR (openCubeSet Q) ≤ LocalSigmaR (cubeSet Q)` upgrades the result to the +consumer's cube. + +Reference: the paper (Armstrong–Kuusi–Loher, to appear). +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric + +noncomputable section + +variable {d : ℕ} + +/-! ## `LocalSigmaR` generators and monotonicity -/ + +/-- A localized entry-test generator is `LocalSigmaR U`-measurable when its probe +is supported in `U`. -/ +theorem measurable_entryTestR_localSigmaR {U : Set (Vec d)} (i j : Fin d) {φ : Vec d → ℝ} + (hφ : IsProbeR φ) (hsupp : Function.support φ ⊆ U) : + @Measurable (RegCoeffField d) ℝ (LocalSigmaR U) _ (entryTestR i j φ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom ⟨i, j, φ, hφ, hsupp, t, ht, rfl⟩ + +/-- **Monotonicity of the local entry-test σ-algebra under set inclusion.** -/ +theorem localSigmaR_mono {U V : Set (Vec d)} (hUV : U ⊆ V) : + LocalSigmaR U ≤ LocalSigmaR V := by + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨i, j, φ, hφ, hsupp, t, ht, rfl⟩ + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, hφ, hsupp.trans hUV, t, ht, rfl⟩ + +/-! ## `LocalSigmaR`-measurability of the ball averages -/ + +/-- **The ball average is a `LocalSigmaR U`-measurable function of the carrier +field** whenever the (compact measurable) ball lies in `U`. Each entry is a +scalar multiple of a localized entry-test generator (`avgMat_entry_eq_smul_entryTestR`). +This is the measurable-average half of Packet P4b's deliverable 1. -/ +theorem measurable_avgMat {U B : Set (Vec d)} (hBcpt : IsCompact B) (hBmeas : MeasurableSet B) + (hBU : B ⊆ U) : + @Measurable (RegCoeffField d) (Mat d) (LocalSigmaR U) _ (avgMat B) := by + refine @measurable_matrix_of_entries d (RegCoeffField d) (LocalSigmaR U) (avgMat B) ?_ + intro i j + have hsupp : Function.support (Set.indicator B (fun _ => (1 : ℝ))) ⊆ U := + (support_indicator_one_subset B).trans hBU + have hgen : @Measurable (RegCoeffField d) ℝ (LocalSigmaR U) _ + (entryTestR i j (Set.indicator B (fun _ => (1 : ℝ)))) := + measurable_entryTestR_localSigmaR i j (isProbeR_indicator hBcpt hBmeas) hsupp + have heq : (fun a : RegCoeffField d => avgMat B a i j) + = fun a => (volume B).toReal⁻¹ • entryTestR i j (Set.indicator B (fun _ => (1 : ℝ))) a := by + funext a; exact avgMat_entry_eq_smul_entryTestR i j B hBmeas a + rw [heq] + exact hgen.const_smul ((volume B).toReal⁻¹) + +/-! ## The rational-ball intersection -/ + +/-- The rational-ball intersection: over all rational balls inside `U`, the +carrier fields whose ball average is elliptic. This is the countable +`LocalSigmaR U`-measurable presentation of the a.e.-ellipticity event. -/ +def slicePart (U : Set (Vec d)) (lam Lam : ℝ) : Set (RegCoeffField d) := + ⋂ (q : Fin d → ℚ) (r : ℚ) (_ : 0 < (r : ℝ)) (_ : closedBall (ratPt q) (r : ℝ) ⊆ U), + {a | IsEllipticMatrix lam Lam (avgMat (closedBall (ratPt q) (r : ℝ)) a)} + +/-- The rational-ball intersection is `LocalSigmaR U`-measurable: a countable +intersection of preimages of the closed elliptic locus under the measurable +ball-average maps. -/ +theorem measurableSet_slicePart {U : Set (Vec d)} (lam Lam : ℝ) : + MeasurableSet[LocalSigmaR U] (slicePart U lam Lam) := by + refine MeasurableSet.iInter (fun q => ?_) + refine MeasurableSet.iInter (fun r => ?_) + refine MeasurableSet.iInter (fun hpos => ?_) + refine MeasurableSet.iInter (fun hsub => ?_) + have hBcpt : IsCompact (closedBall (ratPt q) (r : ℝ)) := isCompact_closedBall _ _ + have hpre : + {a : RegCoeffField d | IsEllipticMatrix lam Lam (avgMat (closedBall (ratPt q) (r : ℝ)) a)} + = (avgMat (closedBall (ratPt q) (r : ℝ))) ⁻¹' {A : Mat d | IsEllipticMatrix lam Lam A} := + rfl + rw [hpre] + exact (measurable_avgMat hBcpt hBcpt.measurableSet hsub) measurableSet_isEllipticMatrix + +/-- The a.e.-ellipticity event on an open set equals the rational-ball +intersection (the characterization of `Differentiation.lean`, as a set). -/ +theorem setOf_aeRestrict_isEllipticMatrix_eq_slicePart {U : Set (Vec d)} (hUopen : IsOpen U) + (lam Lam : ℝ) : + {a : RegCoeffField d | ∀ᵐ x ∂(volume.restrict U), IsEllipticMatrix lam Lam (a x)} + = slicePart U lam Lam := by + ext a + simp only [slicePart, Set.mem_ofPred_eq, Set.mem_iInter] + exact aeRestrict_isEllipticMatrix_iff_forall_ratBall hUopen lam Lam a + +/-! ## The free conjuncts of the AEE slice on the carrier -/ + +/-- The restricted coefficient entry of a carrier field is a.e.-strongly +measurable — free from the carrier type (entrywise Borel measurability). -/ +theorem aestronglyMeasurable_restrictCoeffField_carrier (U : Set (Vec d)) + (hU : MeasurableSet U) (a : RegCoeffField d) (i j : Fin d) : + AEStronglyMeasurable + (fun x => restrictCoeffField U a.toFun x i j) (volumeMeasureOn U) := by + classical + have hmeas : Measurable (fun x => restrictCoeffField U a.toFun x i j) := by + have heq : (fun x => restrictCoeffField U a.toFun x i j) + = Set.indicator U (fun x => a x i j) := by + funext x + by_cases hx : x ∈ U + · simp [restrictCoeffField, hx] + · simp [restrictCoeffField, hx] + rw [heq] + exact (a.entry_measurable i j).indicator hU + exact hmeas.aestronglyMeasurable + +/-- **The AEE quantitative-slice predicate on a carrier field reduces to its a.e. +ellipticity conjunct.** The two measurability conjuncts of `IsAEEllipticFieldOn` +are free by the carrier type. -/ +theorem aeeQuantitativeEllipticSlice_carrier_iff (U : Set (Vec d)) (hU : MeasurableSet U) + (k : ℕ) (a : RegCoeffField d) : + AEEQuantitativeEllipticSlice U k a.toFun ↔ + ∀ᵐ x ∂(volumeMeasureOn U), IsEllipticMatrix ((k + 1 : ℝ)⁻¹) (k + 1 : ℝ) (a x) := by + constructor + · exact fun h => h.2.2 + · intro h + exact ⟨hU, fun i j => aestronglyMeasurable_restrictCoeffField_carrier U hU a i j, h⟩ + +/-! ## The main theorem -/ + +/-- **Genuine `LocalSigmaR (cubeSet Q)`-measurability of the AEE quantitative-slice +event.** No law hypothesis: the event is a countable intersection of +`LocalSigmaR`-measurable rational-ball average preimages. This is Packet P4b's +deliverable 3, replacing the P4 comap slice field. -/ +theorem measurableSet_localSigmaR_aeeSlice (Q : TriadicCube d) (k : ℕ) : + MeasurableSet[LocalSigmaR (cubeSet Q)] + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} := by + set lam : ℝ := (k + 1 : ℝ)⁻¹ + set Lam : ℝ := (k + 1 : ℝ) + -- rewrite the slice event as the a.e.-ellipticity event on the open core + have hEvent : + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} + = {a : RegCoeffField d | + ∀ᵐ x ∂(volume.restrict (openCubeSet Q)), IsEllipticMatrix lam Lam (a x)} := by + ext a + simp only [Set.mem_ofPred_eq] + rw [aeeQuantitativeEllipticSlice_carrier_iff (cubeSet Q) (measurableSet_cubeSet Q) k a] + show (∀ᵐ x ∂(volume.restrict (cubeSet Q)), IsEllipticMatrix lam Lam (a x)) ↔ _ + exact ae_restrict_cubeSet_iff + rw [hEvent, setOf_aeRestrict_isEllipticMatrix_eq_slicePart (isOpen_openCubeSet Q) lam Lam] + exact localSigmaR_mono (openCubeSet_subset_cubeSet Q) _ (measurableSet_slicePart lam Lam) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSigma.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSigma.lean new file mode 100644 index 0000000000..8de3db9f1b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSigma.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma + +/-! +# Smooth integral sigma algebras on regular coefficient fields + +This file isolates the smooth, compactly supported entry-test information used +by source-facing integral-local probability APIs. It intentionally installs no +ambient measurable-space instance and remains separate from pointwise and +restriction-local constructions. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +variable {d : ℕ} +/-- The local sigma algebra generated by entry tests against globally smooth, +compactly supported probes whose topological support lies in `U`. -/ +def SmoothLocalSigmaR (U : Set (Vec d)) : MeasurableSpace (RegCoeffField d) := + MeasurableSpace.generateFrom + {s | ∃ (i j : Fin d) (φ : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ tsupport φ ⊆ U ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = entryTestR i j φ ⁻¹' t} +/-- The global smooth integral sigma algebra on regular coefficient fields. -/ +def SmoothGlobalSigmaR (d : ℕ) : MeasurableSpace (RegCoeffField d) := + SmoothLocalSigmaR (d := d) Set.univ + +/-- Smooth local integral information is monotone under enlargement of the +observation set. -/ +theorem smoothLocalSigmaR_mono {U V : Set (Vec d)} (hUV : U ⊆ V) : + SmoothLocalSigmaR U ≤ SmoothLocalSigmaR V := by + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨i, j, φ, hφ_smooth, hφ_compact, hφ_support, t, ht, rfl⟩ + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, hφ_smooth, hφ_compact, hφ_support.trans hUV, t, ht, rfl⟩ + +/-- Every smooth local integral event is measurable for the global smooth +integral sigma algebra. -/ +theorem smoothLocalSigmaR_le_smoothGlobalSigmaR (U : Set (Vec d)) : + SmoothLocalSigmaR U ≤ SmoothGlobalSigmaR d := + smoothLocalSigmaR_mono (U := U) (V := Set.univ) (fun _ _ => Set.mem_univ _) + +/-- The smooth support-local entry-test sigma algebra is contained in the +existing enriched entry-test sigma algebra. -/ +theorem smoothLocalSigmaR_le_localSigmaR (U : Set (Vec d)) : + SmoothLocalSigmaR U ≤ LocalSigmaR U := by + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨i, j, φ, hφ_smooth, hφ_compact, hφ_support, t, ht, rfl⟩ + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, IsProbeR.of_smooth hφ_smooth hφ_compact, + (subset_tsupport φ).trans hφ_support, t, ht, rfl⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSliceMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSliceMeasurability.lean new file mode 100644 index 0000000000..9df882c531 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RegCoeffField/SmoothSliceMeasurability.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SliceMeasurability +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSigma +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Metrizable +public import Mathlib.MeasureTheory.Integral.DominatedConvergence +public import Mathlib.Topology.MetricSpace.HausdorffDistance + +/-! +# Smooth-local measurability of quantitative ellipticity slices + +For compact rational balls in an open cube, smooth cutoffs supported in the +cube approximate the ball indicator. Dominated convergence then transfers the +ball-average presentation of the quantitative ellipticity slice to the smooth +local sigma algebra. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric Filter Topology +open scoped Manifold + +noncomputable section + +variable {d : ℕ} + +private theorem exists_smooth_cutoff_seq {U B : Set (Vec d)} + (hUopen : IsOpen U) (hBcpt : IsCompact B) (hBU : B ⊆ U) : + ∃ K : Set (Vec d), ∃ ψ : ℕ → Vec d → ℝ, + IsCompact K ∧ K ⊆ U ∧ + (∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψ n) ∧ HasCompactSupport (ψ n) ∧ + tsupport (ψ n) ⊆ U ∧ Function.support (ψ n) ⊆ K ∧ + ∀ x, ψ n x ∈ Set.Icc 0 1) ∧ + ∀ x, Tendsto (fun n => ψ n x) atTop + (𝓝 (Set.indicator B (fun _ => (1 : ℝ)) x)) := by + classical + obtain ⟨ε, hεpos, hεU⟩ := hBcpt.exists_cthickening_subset_open hUopen hBU + let δ : ℕ → ℝ := fun n => ε / (n + 1) + have hδpos : ∀ n, 0 < δ n := fun n => by + dsimp [δ] + positivity + have hδle : ∀ n, δ n ≤ ε := fun n => by + dsimp [δ] + have hn : 1 ≤ (n : ℝ) + 1 := by + have hn0 : (0 : ℝ) ≤ (n : ℝ) := by positivity + linarith + calc + ε / ((n : ℝ) + 1) ≤ ε / 1 := by + exact div_le_div_of_nonneg_left hεpos.le (by positivity) hn + _ = ε := by rw [div_one] + have hBint : ∀ n, B ⊆ interior (cthickening (δ n) B) := fun n => + (self_subset_thickening (hδpos n) B).trans + (thickening_subset_interior_cthickening (δ n) B) + choose ψ hψone hψzero hψrange using fun n => + exists_contMDiffMap_one_nhds_of_subset_interior (I := 𝓘(ℝ, Vec d)) (n := (⊤ : ℕ∞)) + hBcpt.isClosed (hBint n) + let ψ' : ℕ → Vec d → ℝ := fun n => ψ n + let K : Set (Vec d) := cthickening ε B + refine ⟨K, ψ', hBcpt.cthickening, hεU, ?_, ?_⟩ + · intro n + have hTsub : cthickening (δ n) B ⊆ K := + cthickening_mono (hδle n) B + have hsupp : Function.support (ψ' n) ⊆ cthickening (δ n) B := by + intro x hx + by_contra hxT + exact hx (hψzero n x hxT) + have hcompact : HasCompactSupport (ψ' n) := + HasCompactSupport.of_support_subset_isCompact (hBcpt.cthickening) hsupp + have htsupp : tsupport (ψ' n) ⊆ U := by + have htsuppT : tsupport (ψ' n) ⊆ cthickening (δ n) B := by + simpa [tsupport] using closure_minimal hsupp isClosed_cthickening + exact htsuppT.trans (hTsub.trans hεU) + exact ⟨(ψ n).contMDiff.contDiff, hcompact, htsupp, hsupp.trans hTsub, hψrange n⟩ + · intro x + by_cases hx : x ∈ B + · have hone : ∀ n, ψ' n x = 1 := fun n => + hψone n |>.self_of_nhdsSet x hx + rw [show Set.indicator B (fun _ => (1 : ℝ)) x = 1 by simp [hx]] + simp_rw [hone] + exact tendsto_const_nhds + · have hxcl : x ∉ closure B := by simpa [hBcpt.isClosed.closure_eq] using hx + obtain ⟨ρ, ⟨hρpos, hρlt⟩⟩ := + Metric.exists_real_pos_lt_infEDist_of_notMem_closure hxcl + have hδtend : Tendsto δ atTop (𝓝 0) := by + simpa only [δ, div_eq_mul_inv, one_mul, mul_zero] using + (tendsto_const_nhds.mul tendsto_one_div_add_atTop_nhds_zero_nat : + Tendsto (fun n : ℕ => ε * (1 / ((n : ℝ) + 1))) atTop (𝓝 (ε * 0))) + have hsmall : ∀ᶠ n in atTop, δ n < ρ := by + rw [Metric.tendsto_nhds] at hδtend + specialize hδtend ρ hρpos + filter_upwards [hδtend] with n hn + simpa only [dist_zero_right, Real.norm_eq_abs, abs_of_nonneg (hδpos n).le] using hn + rw [show Set.indicator B (fun _ => (1 : ℝ)) x = 0 by simp [hx]] + rcases (eventually_atTop.1 hsmall) with ⟨N, hN⟩ + apply tendsto_atTop_of_eventually_const (i₀ := N) + intro n hn + apply hψzero n x + intro hxt + rw [mem_cthickening_iff] at hxt + have hδρ : ENNReal.ofReal (δ n) < ENNReal.ofReal ρ := + ENNReal.ofReal_lt_ofReal_iff hρpos |>.mpr (hN n hn) + exact (not_le_of_gt (hδρ.trans hρlt)) hxt + +private theorem exists_smooth_entryTestR_approximation {U B : Set (Vec d)} + (hUopen : IsOpen U) (hBcpt : IsCompact B) (hBU : B ⊆ U) : + ∃ ψ : ℕ → Vec d → ℝ, + (∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψ n) ∧ HasCompactSupport (ψ n) ∧ + tsupport (ψ n) ⊆ U) ∧ + ∀ (i j : Fin d) (a : RegCoeffField d), + Tendsto (fun n => entryTestR i j (ψ n) a) atTop + (𝓝 (entryTestR i j (Set.indicator B (fun _ => (1 : ℝ))) a)) := by + obtain ⟨K, ψ, hKcpt, hKU, hψ, hlim⟩ := + exists_smooth_cutoff_seq hUopen hBcpt hBU + refine ⟨ψ, fun n => ⟨(hψ n).1, (hψ n).2.1, (hψ n).2.2.1⟩, ?_⟩ + intro i j a + have hbound_integrable : Integrable (K.indicator fun x => |a x i j|) volume := by + rw [integrable_indicator_iff hKcpt.measurableSet] + simpa only [Real.norm_eq_abs] using! + ((a.entry_locInt i j).integrableOn_isCompact hKcpt).norm + have hF_measurable : ∀ n, AEStronglyMeasurable (fun x => a x i j * ψ n x) volume := by + intro n + exact ((a.entry_measurable i j).mul (hψ n).1.continuous.measurable).aestronglyMeasurable + have hF_bound : ∀ n, ∀ᵐ x ∂volume, + ‖a x i j * ψ n x‖ ≤ K.indicator (fun x => |a x i j|) x := by + intro n + filter_upwards with x + by_cases hxK : x ∈ K + · rw [Set.indicator_of_mem hxK, norm_mul, Real.norm_eq_abs] + have hψ01 := (hψ n).2.2.2.2 x + rw [Real.norm_eq_abs, abs_of_nonneg hψ01.1] + exact mul_le_of_le_one_right (abs_nonneg _) hψ01.2 + · rw [Set.indicator_of_notMem hxK] + have hxSupp : x ∉ Function.support (ψ n) := fun hx => hxK ((hψ n).2.2.2.1 hx) + have hzero : ψ n x = 0 := by + simpa only [Function.mem_support, not_not] using hxSupp + simp [hzero] + have hF_lim : ∀ᵐ x ∂volume, + Tendsto (fun n => a x i j * ψ n x) atTop + (𝓝 (a x i j * Set.indicator B (fun _ => (1 : ℝ)) x)) := + Filter.Eventually.of_forall fun x => tendsto_const_nhds.mul (hlim x) + simpa only [entryTestR] using + tendsto_integral_of_dominated_convergence (K.indicator fun x => |a x i j|) + hF_measurable hbound_integrable hF_bound hF_lim + +private theorem measurable_entryTestR_smoothLocalSigmaR {U : Set (Vec d)} + (i j : Fin d) {φ : Vec d → ℝ} (hφ_smooth : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_support : tsupport φ ⊆ U) : + @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR U) _ (entryTestR i j φ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, hφ_smooth, hφ_compact, hφ_support, t, ht, rfl⟩ + +private theorem measurable_avgMat_smoothLocalSigmaR {U B : Set (Vec d)} + (hUopen : IsOpen U) (hBcpt : IsCompact B) (hBU : B ⊆ U) : + @Measurable (RegCoeffField d) (Mat d) (SmoothLocalSigmaR U) _ (avgMat B) := by + let : MeasurableSpace (RegCoeffField d) := SmoothLocalSigmaR U + obtain ⟨ψ, hψ, hlim⟩ := exists_smooth_entryTestR_approximation hUopen hBcpt hBU + refine @measurable_matrix_of_entries d (RegCoeffField d) (SmoothLocalSigmaR U) (avgMat B) ?_ + intro i j + have hmeas : ∀ n, @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR U) _ + (entryTestR i j (ψ n)) := fun n => + measurable_entryTestR_smoothLocalSigmaR i j (hψ n).1 (hψ n).2.1 (hψ n).2.2 + have htend : Tendsto (fun n => entryTestR i j (ψ n)) atTop + (𝓝 (entryTestR i j (Set.indicator B (fun _ => (1 : ℝ)))) ) := by + rw [tendsto_pi_nhds] + intro a + exact hlim i j a + have hindicator : @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR U) _ + (entryTestR i j (Set.indicator B (fun _ => (1 : ℝ)))) := + measurable_of_tendsto_metrizable hmeas htend + have heq : (fun a : RegCoeffField d => avgMat B a i j) + = fun a => (volume B).toReal⁻¹ • entryTestR i j (Set.indicator B (fun _ => (1 : ℝ))) a := by + funext a + exact avgMat_entry_eq_smul_entryTestR i j B hBcpt.measurableSet a + rw [heq] + exact hindicator.const_smul ((volume B).toReal⁻¹) + +private theorem measurableSet_slicePart_smoothLocalSigmaR {U : Set (Vec d)} + (hUopen : IsOpen U) (lam Lam : ℝ) : + MeasurableSet[SmoothLocalSigmaR U] (slicePart U lam Lam) := by + refine MeasurableSet.iInter (fun q => ?_) + refine MeasurableSet.iInter (fun r => ?_) + refine MeasurableSet.iInter (fun hpos => ?_) + refine MeasurableSet.iInter (fun hsub => ?_) + have hBcpt : IsCompact (closedBall (ratPt q) (r : ℝ)) := isCompact_closedBall _ _ + have hpre : + {a : RegCoeffField d | IsEllipticMatrix lam Lam (avgMat (closedBall (ratPt q) (r : ℝ)) a)} + = (avgMat (closedBall (ratPt q) (r : ℝ))) ⁻¹' {A : Mat d | IsEllipticMatrix lam Lam A} := + rfl + rw [hpre] + exact (measurable_avgMat_smoothLocalSigmaR hUopen hBcpt hsub) + measurableSet_isEllipticMatrix + +/-- The AEE quantitative ellipticity slice of a triadic cube is measurable for +the smooth support-local integral sigma algebra. -/ +theorem measurableSet_smoothLocalSigmaR_aeeSlice (Q : TriadicCube d) (k : ℕ) : + MeasurableSet[SmoothLocalSigmaR (cubeSet Q)] + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} := by + set lam : ℝ := (k + 1 : ℝ)⁻¹ + set Lam : ℝ := (k + 1 : ℝ) + have hEvent : + {a : RegCoeffField d | AEEQuantitativeEllipticSlice (cubeSet Q) k a.toFun} + = {a : RegCoeffField d | + ∀ᵐ x ∂(volume.restrict (openCubeSet Q)), IsEllipticMatrix lam Lam (a x)} := by + ext a + simp only [Set.mem_ofPred_eq] + rw [aeeQuantitativeEllipticSlice_carrier_iff (cubeSet Q) (measurableSet_cubeSet Q) k a] + show (∀ᵐ x ∂(volume.restrict (cubeSet Q)), IsEllipticMatrix lam Lam (a x)) ↔ _ + exact ae_restrict_cubeSet_iff + rw [hEvent, setOf_aeRestrict_isEllipticMatrix_eq_slicePart (isOpen_openCubeSet Q) lam Lam] + exact smoothLocalSigmaR_mono (openCubeSet_subset_cubeSet Q) _ + (measurableSet_slicePart_smoothLocalSigmaR (isOpen_openCubeSet Q) lam Lam) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/RescaledLaw.lean b/LeanPool/CoarseGraining/Homogenization/Probability/RescaledLaw.lean new file mode 100644 index 0000000000..f022b978eb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/RescaledLaw.lean @@ -0,0 +1,217 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.IndependentSums.WeakOrlicz +public import LeanPool.CoarseGraining.Homogenization.Probability.LocalObservable +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace + +/-! # Rescaled Law -/ + +@[expose] public section + +open scoped Pointwise + +namespace Homogenization + +/-! +Triadically rescaled coefficient laws and random scale parameters. + +The Chapter 4 probability layer is mostly law-centric: coefficient fields are +sampled from a measure on `CoeffField d`. This module adds the basic transport +API for passing from a law to its triadically rescaled law and records the +lightweight random-scale package used by later quenched-scale arguments. +-/ + +/-- Dilate a vector by the triadic factor `3^n`. -/ +noncomputable def triadicDilateVec {d : ℕ} (n : ℕ) (x : Vec d) : Vec d := + fun i => (3 : ℝ) ^ n * x i + +/-- The image of a set under triadic dilation by `3^n`. -/ +noncomputable def triadicDilateSet {d : ℕ} (n : ℕ) (U : Set (Vec d)) : Set (Vec d) := + {x | ∃ y ∈ U, x = triadicDilateVec n y} + +/-- The integer shift in the original variables corresponding to an integer +shift after triadic rescaling. -/ +def triadicScaleIntShift {d : ℕ} (n : ℕ) (z : Fin d → ℤ) : Fin d → ℤ := + fun i => ((3 ^ n : ℕ) : ℤ) * z i + +/-- Rescale a coefficient field by the triadic factor `3^n`. + +The rescaled field is `x ↦ a(3^n x)`. Thus integer translations of the +rescaled field correspond to translations of the original field by integer +vectors multiplied by `3^n`. -/ +noncomputable def rescaleCoeffField {d : ℕ} (n : ℕ) (a : CoeffField d) : CoeffField d := + fun x => a (triadicDilateVec n x) + +@[simp] theorem triadicDilateVec_zero {d : ℕ} (x : Vec d) : + triadicDilateVec (d := d) 0 x = x := by + funext i + simp [triadicDilateVec] + +@[simp] theorem triadicDilateVec_mem_triadicDilateSet {d : ℕ} (n : ℕ) + {U : Set (Vec d)} {x : Vec d} (hx : x ∈ U) : + triadicDilateVec n x ∈ triadicDilateSet n U := + ⟨x, hx, rfl⟩ + +/-- Triadic dilation sends bounded subsets of the ambient space to bounded subsets. -/ +theorem isBounded_triadicDilateSet {d : ℕ} (n : ℕ) {U : Set (Vec d)} + (hU : Bornology.IsBounded U) : + Bornology.IsBounded (triadicDilateSet n U) := by + have hcont : Continuous (triadicDilateVec (d := d) n) := by + change Continuous fun x : Fin d → ℝ => fun i => (3 : ℝ) ^ n * x i + exact continuous_pi fun i => continuous_const.mul (continuous_apply i) + simpa [triadicDilateSet, Set.image, eq_comm] using + isBounded_image_of_continuous_vec hcont hU + +@[simp] theorem rescaleCoeffField_zero {d : ℕ} (a : CoeffField d) : + rescaleCoeffField 0 a = a := by + funext x i j + simp [rescaleCoeffField] + +theorem rescaleCoeffField_add {d : ℕ} (m n : ℕ) (a : CoeffField d) : + rescaleCoeffField (m + n) a = + rescaleCoeffField n (rescaleCoeffField m a) := by + funext x i j + have hvec : + triadicDilateVec (m + n) x = triadicDilateVec m (triadicDilateVec n x) := by + funext k + simp [triadicDilateVec, pow_add] + ring + simp [rescaleCoeffField, hvec] + +theorem localTestObservable_rescaleCoeffField_eq_const_mul + {d : ℕ} (k : ℕ) (e e' : Vec d) (φ : Vec d → ℝ) (a : CoeffField d) : + localTestObservable e e' φ (rescaleCoeffField k a) = + (((3 : ℝ) ^ k) ^ d)⁻¹ * + localTestObservable e e' + (fun y : Vec d => φ (((3 : ℝ) ^ k)⁻¹ • y)) a := by + let r : ℝ := (3 : ℝ) ^ k + have hr : 0 < r := by positivity + let f : Vec d → ℝ := fun y => vecDot e' (matVecMul (a y) e) * φ (r⁻¹ • y) + have hcv : + ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂MeasureTheory.volume = + (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := f) (s := Set.univ) hr) + have huniv : r • (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨r⁻¹ • y, trivial, ?_⟩ + ext i + simp [Pi.smul_apply, smul_eq_mul, hr.ne'] + have htriadic : ∀ x : Vec d, triadicDilateVec k x = r • x := by + intro x + ext i + simp [triadicDilateVec, r, Pi.smul_apply, smul_eq_mul] + unfold localTestObservable + calc + ∫ x, (vecDot e' (matVecMul (rescaleCoeffField k a x) e) * φ x) ∂MeasureTheory.volume + = ∫ x, f (r • x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hrx : r⁻¹ • (r • x) = x := by + ext i + simp [Pi.smul_apply, smul_eq_mul, hr.ne'] + simp [f, rescaleCoeffField, htriadic x, hrx] + _ = ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂MeasureTheory.volume := by + simp + _ = (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := + hcv + _ = (r ^ d)⁻¹ * + ∫ y, (vecDot e' (matVecMul (a y) e) * + φ (((3 : ℝ) ^ k)⁻¹ • y)) ∂MeasureTheory.volume := by + simp [f, r, huniv] + +theorem localFiniteTestObservable_rescaleCoeffField_eq {d : ℕ} {ι : Type} + (n : ℕ) (I : Finset ι) (e e' : ι → Vec d) (φ : ι → Vec d → ℝ) + (a : CoeffField d) : + localFiniteTestObservable I e e' φ (rescaleCoeffField n a) = + localFiniteTestObservable I e e' + (fun k y => (((3 : ℝ) ^ n) ^ d)⁻¹ * φ k (((3 : ℝ) ^ n)⁻¹ • y)) a := by + let r : ℝ := (3 : ℝ) ^ n + have hr : 0 < r := by positivity + let c : ℝ := (r ^ d)⁻¹ + let f : Vec d → ℝ := fun y => + ∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * φ k (r⁻¹ • y) + have hcv : + ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂MeasureTheory.volume = + (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := f) (s := Set.univ) hr) + have huniv : r • (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _; trivial + · intro _ + refine ⟨r⁻¹ • y, trivial, ?_⟩ + ext i + simp [Pi.smul_apply, smul_eq_mul, hr.ne'] + have htriadic : ∀ x : Vec d, triadicDilateVec n x = r • x := by + intro x + ext i + simp [triadicDilateVec, r, Pi.smul_apply, smul_eq_mul] + unfold localFiniteTestObservable + calc + ∫ x, (∑ k ∈ I, vecDot (e' k) (matVecMul (rescaleCoeffField n a x) (e k)) * + φ k x) ∂MeasureTheory.volume + = ∫ x, f (r • x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hrx : r⁻¹ • (r • x) = x := by + ext i + simp [Pi.smul_apply, smul_eq_mul, hr.ne'] + simp [f, rescaleCoeffField, htriadic x, hrx] + _ = ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂MeasureTheory.volume := by + simp + _ = (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂MeasureTheory.volume := + hcv + _ = c * ∫ y, f y ∂MeasureTheory.volume := by + simp [c, huniv] + _ = ∫ y, c * f y ∂MeasureTheory.volume := by + exact (MeasureTheory.integral_const_mul c f).symm + _ = ∫ y, (∑ k ∈ I, vecDot (e' k) (matVecMul (a y) (e k)) * + ((((3 : ℝ) ^ n) ^ d)⁻¹ * φ k (((3 : ℝ) ^ n)⁻¹ • y))) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + simp [f, c, r, Finset.mul_sum] + ring_nf + +theorem measurable_rescaleCoeffField {d : ℕ} (n : ℕ) : + Measurable (rescaleCoeffField (d := d) n) := by + refine measurable_coeffField_to_ambient ?_ (fun V hV => ?_) + · refine measurable_pi_iff.2 fun x => measurable_pi_iff.2 fun i => + measurable_pi_iff.2 fun j => ?_ + exact measurable_coeffField_entry (d := d) (triadicDilateVec n x) i j + · refine measurable_localSigma_of_local (T := rescaleCoeffField n) ?_ V hV + intro W hW + refine ⟨triadicDilateSet n W, ?_, ?_⟩ + · exact isBounded_triadicDilateSet n hW + intro a b hab x hxW + simp [rescaleCoeffField, hab (triadicDilateVec n x) + (triadicDilateVec_mem_triadicDilateSet n hxW)] + +theorem translateByInt_rescaleCoeffField_eq_rescaleCoeffField_translateByInt + {d : ℕ} (n : ℕ) (z : Fin d → ℤ) (a : CoeffField d) : + translateByInt z (rescaleCoeffField n a) = + rescaleCoeffField n (translateByInt (triadicScaleIntShift n z) a) := by + funext x i j + have hvec : + triadicDilateVec n (x + intVecToRealVec z) = + triadicDilateVec n x + intVecToRealVec (triadicScaleIntShift n z) := by + funext k + simp [triadicDilateVec, triadicScaleIntShift, intVecToRealVec] + ring + change a (triadicDilateVec n (x + intVecToRealVec z)) i j = + a (triadicDilateVec n x + intVecToRealVec (triadicScaleIntShift n z)) i j + rw [hvec] diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Scalarization.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Scalarization.lean new file mode 100644 index 0000000000..2a8d8687d0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Scalarization.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Data.Matrix.Mul +public import Mathlib.LinearAlgebra.Matrix.NonsingularInverse +public import Mathlib.LinearAlgebra.Matrix.Swap +public import Mathlib.Tactic.Linarith + +/-! # Scalarization -/ + +@[expose] public section + +namespace Homogenization + +/-- The diagonal sign-flip matrix that changes the sign of the `i`-th coordinate. -/ +noncomputable def signFlipMatrix {d : ℕ} (i : Fin d) : Mat d := + Matrix.diagonal fun j => if j = i then (-1 : ℝ) else 1 + +/-- Invariance under conjugation by every coordinate sign flip. -/ +def IsSignFlipInvariant {d : ℕ} (A : Mat d) : Prop := + ∀ i : Fin d, signFlipMatrix i * A * signFlipMatrix i = A + +/-- Invariance under conjugation by every coordinate transposition matrix. -/ +def IsSwapInvariant {d : ℕ} (A : Mat d) : Prop := + ∀ i j : Fin d, Matrix.swap ℝ i j * A * Matrix.swap ℝ i j = A + +/-- Scalar matrices over `Fin d`, written as multiples of the identity. -/ +def IsScalarMatrix {d : ℕ} (A : Mat d) : Prop := + ∃ c : ℝ, A = c • 1 + +theorem signFlipMatrix_mul_mul_signFlipMatrix_apply {d : ℕ} (i r c : Fin d) (A : Mat d) : + (signFlipMatrix i * A * signFlipMatrix i) r c = + (if r = i then (-1 : ℝ) else 1) * A r c * (if c = i then (-1 : ℝ) else 1) := by + simp [signFlipMatrix, Matrix.diagonal_mul, Matrix.mul_diagonal] + +theorem signFlipMatrix_sq {d : ℕ} (i : Fin d) : + signFlipMatrix i * signFlipMatrix i = 1 := by + ext r c + by_cases hrc : r = c + · subst c + by_cases hri : r = i <;> simp [signFlipMatrix, hri] + · simp [signFlipMatrix, hrc] + +theorem offDiag_eq_zero_of_isSignFlipInvariant {d : ℕ} {A : Mat d} + (hA : IsSignFlipInvariant A) {i j : Fin d} (hij : i ≠ j) : + A i j = 0 := by + have hji : j ≠ i := fun h => hij h.symm + have hentry := congrArg (fun M => M i j) (hA i) + have hneg : -A i j = A i j := by + simpa [signFlipMatrix_mul_mul_signFlipMatrix_apply, hij, hji] using hentry + linarith + +theorem diag_eq_of_isSwapInvariant {d : ℕ} {A : Mat d} (hA : IsSwapInvariant A) + (i j : Fin d) : A i i = A j j := by + have hentry := congrArg (fun M => M i i) (hA i j) + simpa using hentry.symm + +theorem isScalarMatrix_of_isSignFlipInvariant_of_isSwapInvariant {d : ℕ} [NeZero d] + {A : Mat d} (hFlip : IsSignFlipInvariant A) (hSwap : IsSwapInvariant A) : + IsScalarMatrix A := by + refine ⟨A 0 0, ?_⟩ + ext i j + by_cases hij : i = j + · subst j + have hdiag : A i i = A 0 0 := diag_eq_of_isSwapInvariant hSwap i 0 + simpa [Matrix.one_apply] using hdiag + · have hzero : A i j = 0 := offDiag_eq_zero_of_isSignFlipInvariant hFlip hij + simp [hij, hzero] + +theorem isSignFlipInvariant_of_isScalarMatrix {d : ℕ} {A : Mat d} + (hA : IsScalarMatrix A) : + IsSignFlipInvariant A := by + rcases hA with ⟨c, rfl⟩ + intro i + calc + signFlipMatrix i * (c • (1 : Mat d)) * signFlipMatrix i + = c • (signFlipMatrix i * (1 : Mat d) * signFlipMatrix i) := by + simp + _ = c • (1 : Mat d) := by + simp [signFlipMatrix_sq] + +theorem isSwapInvariant_of_isScalarMatrix {d : ℕ} {A : Mat d} + (hA : IsScalarMatrix A) : + IsSwapInvariant A := by + rcases hA with ⟨c, rfl⟩ + intro i j + calc + Matrix.swap ℝ i j * (c • (1 : Mat d)) * Matrix.swap ℝ i j + = c • (Matrix.swap ℝ i j * (1 : Mat d) * Matrix.swap ℝ i j) := by + simp + _ = c • (1 : Mat d) := by + simp [Matrix.swap_mul_self (R := ℝ)] + +theorem isScalarMatrix_inv {d : ℕ} {A : Mat d} (hA : IsScalarMatrix A) : + IsScalarMatrix A⁻¹ := by + rcases hA with ⟨c, hc⟩ + by_cases hc0 : c = 0 + · refine ⟨0, ?_⟩ + simp [hc, hc0] + · refine ⟨c⁻¹, ?_⟩ + rw [hc] + let : Invertible c := invertibleOfNonzero hc0 + have hInv : + (c • (1 : Mat d))⁻¹ = ⅟c • ((1 : Mat d)⁻¹) := + Matrix.inv_smul (A := (1 : Mat d)) c (by simp) + calc + (c • (1 : Mat d))⁻¹ = ⅟c • ((1 : Mat d)⁻¹) := hInv + _ = c⁻¹ • (1 : Mat d) := by simp + +theorem skewPart_eq_zero_of_isScalarMatrix {d : ℕ} {A : Mat d} (hA : IsScalarMatrix A) : + skewPart A = 0 := by + rcases hA with ⟨c, rfl⟩ + ext i j + by_cases hij : i = j + · subst j + simp [skewPart] + · have hji : j ≠ i := fun h => hij h.symm + simp [skewPart, hij, hji] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/SeparableHilbertMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Probability/SeparableHilbertMeasurability.lean new file mode 100644 index 0000000000..541c64b574 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/SeparableHilbertMeasurability.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.InnerProductSpace.Dual +public import Mathlib.MeasureTheory.Constructions.BorelSpace.ContinuousLinearMap +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Metrizable +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Order +public import Mathlib.MeasureTheory.Constructions.Polish.Basic +public import Mathlib.MeasureTheory.Function.SpecialFunctions.Basic +public import Mathlib.Analysis.InnerProductSpace.Basic +public import Mathlib.Topology.MetricSpace.Pseudo.Defs + +/-! # Separable Hilbert Measurability -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Separable Hilbert measurability helpers + +This file isolates the abstract measurable-space facts needed by the +fixed-competitor measurability cleanup. The first lemma is metric rather than +Hilbert-specific: a map into a second-countable metric Borel space is +measurable once its distances to a fixed countable dense sequence are +measurable. +-/ + +theorem measurable_of_measurable_dist_denseRange + {Ω β : Type*} [MeasurableSpace Ω] [PseudoMetricSpace β] + [MeasurableSpace β] [BorelSpace β] [SecondCountableTopology β] + (c : ℕ → β) (hc : DenseRange c) {F : Ω → β} + (hFdist : ∀ n : ℕ, Measurable fun ω => dist (F ω) (c n)) : + Measurable F := by + classical + let r : ℕ → ℝ := fun m => 1 / ((m : ℝ) + 1) + apply measurable_of_isOpen + intro s hs + let ballSet : ℕ × ℕ → Set Ω := fun p => + if Metric.ball (c p.1) (r p.2) ⊆ s then + {ω | dist (F ω) (c p.1) < r p.2} + else + ∅ + have hballSet_meas : ∀ p : ℕ × ℕ, MeasurableSet (ballSet p) := by + intro p + by_cases hp : Metric.ball (c p.1) (r p.2) ⊆ s + · have hdist : Measurable fun ω => dist (F ω) (c p.1) := hFdist p.1 + simpa [ballSet, hp] using measurableSet_lt hdist measurable_const + · simp [ballSet, hp] + have hpre : + F ⁻¹' s = ⋃ p : ℕ × ℕ, ballSet p := by + ext ω + constructor + · intro hω + rw [Metric.isOpen_iff] at hs + obtain ⟨ε, hε_pos, hε_sub⟩ := hs (F ω) hω + obtain ⟨m, hm⟩ := exists_nat_one_div_lt (show 0 < ε / 2 by positivity) + have hr_pos : 0 < r m := by + dsimp [r] + positivity + have htwo_r_lt : 2 * r m < ε := by + dsimp [r] at hm ⊢ + nlinarith + obtain ⟨n, hn⟩ := + (Metric.denseRange_iff.mp hc) (F ω) (r m) hr_pos + refine Set.mem_iUnion.2 ⟨(n, m), ?_⟩ + have hsub : Metric.ball (c n) (r m) ⊆ s := by + intro y hy + rw [Metric.mem_ball] at hy + apply hε_sub + rw [Metric.mem_ball] + have htriangle : dist y (F ω) ≤ dist y (c n) + dist (c n) (F ω) := + dist_triangle y (c n) (F ω) + have hn' : dist (c n) (F ω) < r m := by + simpa [dist_comm] using hn + nlinarith [hy, hn', htriangle, htwo_r_lt] + simpa [ballSet, hsub] using hn + · intro hω + rcases Set.mem_iUnion.1 hω with ⟨p, hp⟩ + by_cases hsub : Metric.ball (c p.1) (r p.2) ⊆ s + · have hdist : dist (F ω) (c p.1) < r p.2 := by + simpa [ballSet, hsub] using hp + exact hsub hdist + · simp [ballSet, hsub] at hp + rw [hpre] + exact MeasurableSet.iUnion hballSet_meas + +theorem measurable_of_measurable_dist_denseSeq + {Ω β : Type*} [MeasurableSpace Ω] [PseudoMetricSpace β] + [MeasurableSpace β] [BorelSpace β] [SecondCountableTopology β] [Nonempty β] + {F : Ω → β} + (hFdist : ∀ n : ℕ, Measurable fun ω => dist (F ω) (TopologicalSpace.denseSeq β n)) : + Measurable F := + measurable_of_measurable_dist_denseRange + (TopologicalSpace.denseSeq β) (TopologicalSpace.denseRange_denseSeq β) hFdist + +theorem measurable_of_measurable_norm_inner_denseRange + {Ω H : Type*} [MeasurableSpace Ω] [NormedAddCommGroup H] [InnerProductSpace ℝ H] + [MeasurableSpace H] [BorelSpace H] [SecondCountableTopology H] + (u : ℕ → H) (hu : DenseRange u) {F : Ω → H} + (hNorm : Measurable fun ω => ‖F ω‖) + (hInner : ∀ n : ℕ, Measurable fun ω => inner ℝ (u n) (F ω)) : + Measurable F := by + refine measurable_of_measurable_dist_denseRange u hu ?_ + intro n + let c : H := u n + have hInner' : Measurable fun ω => inner ℝ (F ω) c := by + simpa [c, real_inner_comm] using hInner n + have hNormSq : Measurable fun ω => ‖F ω‖ ^ 2 := by + simpa [pow_two, Pi.mul_def] using hNorm.mul hNorm + have hExpr : + Measurable fun ω => + ‖F ω‖ ^ 2 - 2 * inner ℝ (F ω) c + ‖c‖ ^ 2 := + (hNormSq.sub (measurable_const.mul hInner')).add measurable_const + have hSqrt : + Measurable fun ω => + √(‖F ω‖ ^ 2 - 2 * inner ℝ (F ω) c + ‖c‖ ^ 2) := + hExpr.sqrt + convert hSqrt using 1 + funext ω + rw [dist_eq_norm] + have hsq : + ‖F ω - c‖ ^ 2 = ‖F ω‖ ^ 2 - 2 * inner ℝ (F ω) c + ‖c‖ ^ 2 := + norm_sub_sq_real (F ω) c + rw [← hsq, Real.sqrt_sq_eq_abs, abs_of_nonneg (norm_nonneg _)] + +theorem measurable_norm_of_norm_eq_iSup_abs_inner + {Ω H : Type*} [MeasurableSpace Ω] [NormedAddCommGroup H] [InnerProductSpace ℝ H] + (u : ℕ → H) {F : Ω → H} + (hNormEq : ∀ x : H, ‖x‖ = ⨆ n : ℕ, |inner ℝ (u n) x|) + (hInner : ∀ n : ℕ, Measurable fun ω => inner ℝ (u n) (F ω)) : + Measurable fun ω => ‖F ω‖ := by + have hSup : Measurable fun ω => ⨆ n : ℕ, |inner ℝ (u n) (F ω)| := + Measurable.iSup fun n => by + simpa [Real.norm_eq_abs] using (hInner n).norm + convert hSup using 1 + funext ω + exact hNormEq (F ω) + +theorem measurable_of_measurable_inner_denseRange_of_norm_eq_iSup_abs_inner + {Ω H : Type*} [MeasurableSpace Ω] [NormedAddCommGroup H] [InnerProductSpace ℝ H] + [MeasurableSpace H] [BorelSpace H] [SecondCountableTopology H] + (u : ℕ → H) (hu : DenseRange u) {F : Ω → H} + (hNormEq : ∀ x : H, ‖x‖ = ⨆ n : ℕ, |inner ℝ (u n) x|) + (hInner : ∀ n : ℕ, Measurable fun ω => inner ℝ (u n) (F ω)) : + Measurable F := + measurable_of_measurable_norm_inner_denseRange u hu + (measurable_norm_of_norm_eq_iSup_abs_inner u hNormEq hInner) hInner + +theorem measurable_of_measurable_inner_denseRange_polish + {Ω H : Type*} [MeasurableSpace Ω] [NormedAddCommGroup H] [InnerProductSpace ℝ H] + [MeasurableSpace H] [BorelSpace H] [PolishSpace H] + (u : ℕ → H) (hu : DenseRange u) {F : Ω → H} + (hInner : ∀ n : ℕ, Measurable fun ω => inner ℝ (u n) (F ω)) : + Measurable F := by + let Φ : H → (ℕ → ℝ) := fun x n => inner ℝ (u n) x + have hΦ_meas : Measurable Φ := by + refine measurable_pi_lambda ?_ + intro n + simpa [Φ, innerSL_apply_apply] using (innerSL ℝ (u n)).measurable + have hΦ_inj : Function.Injective Φ := by + intro x y hxy + apply (innerSL_inj (𝕜 := ℝ)).mp + ext z + have h_on : + Set.EqOn (fun z => inner ℝ x z) (fun z => inner ℝ y z) (Set.range u) := by + rintro z ⟨n, rfl⟩ + have hn := congr_fun hxy n + simpa [Φ, real_inner_comm] using hn + have hfun : (fun z => inner ℝ x z) = fun z => inner ℝ y z := + Continuous.ext_on hu (innerSL ℝ x).continuous (innerSL ℝ y).continuous h_on + exact congr_fun hfun z + exact (hΦ_meas.measurableEmbedding hΦ_inj).measurable_comp_iff.mp + (measurable_pi_lambda hInner) + +theorem measurable_of_measurable_norm_inner_denseSeq + {Ω H : Type*} [MeasurableSpace Ω] [NormedAddCommGroup H] [InnerProductSpace ℝ H] + [MeasurableSpace H] [BorelSpace H] [SecondCountableTopology H] [Nonempty H] + {F : Ω → H} + (hNorm : Measurable fun ω => ‖F ω‖) + (hInner : ∀ n : ℕ, Measurable fun ω => inner ℝ (TopologicalSpace.denseSeq H n) (F ω)) : + Measurable F := + measurable_of_measurable_norm_inner_denseRange + (TopologicalSpace.denseSeq H) (TopologicalSpace.denseRange_denseSeq H) hNorm hInner + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source.lean new file mode 100644 index 0000000000..4eafa0f797 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source.lean @@ -0,0 +1,14 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL.lean new file mode 100644 index 0000000000..8e3433e1df --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL.lean @@ -0,0 +1,511 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.MeasureTheory.Constructions.BorelSpace.Basic +public import Mathlib.MeasureTheory.Function.AEEqFun +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import Mathlib.MeasureTheory.Group.Arithmetic +public import Mathlib.Topology.Instances.Matrix + +/-! +# The AKL a.e.-quotient coefficient-field kernel + +The high-moment manuscript uses uniformly elliptic, measurable coefficient +fields modulo equality almost everywhere. This module gives its fixed-`Θ` +carrier and its integral-only local sigma-algebras. +-/ + +@[expose] public section + +namespace Homogenization.Source.AKL + +open MeasureTheory + +noncomputable section + +local instance matMeasurableSpace {d : ℕ} : MeasurableSpace (Mat d) := + inferInstanceAs (MeasurableSpace (Fin d → Fin d → ℝ)) + +local instance matBorelSpace {d : ℕ} : BorelSpace (Mat d) := + inferInstanceAs (BorelSpace (Fin d → Fin d → ℝ)) + +abbrev Field (d : ℕ) := Vec d →ₘ[volume] Mat d + +def Carrier (d : ℕ) (Θ : ℝ) : Type _ := + {a : Field d // ∀ᵐ x ∂volume, IsEllipticMatrix 1 Θ (a x)} + +abbrev BorelRegion (d : ℕ) := + {U : Set (Vec d) // MeasurableSet U} + +variable {d : ℕ} {Θ : ℝ} + +private theorem matVecMul_one (x : Vec d) : matVecMul (1 : Mat d) x = x := by + funext i + simp [matVecMul, Matrix.one_apply, Finset.sum_ite_eq] + +private theorem vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix + {lam Lam : ℝ} {A : Mat d} (hA : IsEllipticMatrix lam Lam A) (η : Vec d) : + vecNormSq (matVecMul A η) ≤ Lam * vecDot η (matVecMul (symmPart A) η) := by + have hdet : IsUnit A.det := isUnit_det_of_isEllipticMatrix hA + set ξ := matVecMul A η with hξ + have hAinv : matVecMul A⁻¹ ξ = η := by + rw [hξ, matVecMul_mul, Matrix.nonsing_inv_mul A hdet, matVecMul_one] + have hident : + vecDot ξ (matVecMul A⁻¹ ξ) = vecDot η (matVecMul (symmPart A) η) := by + rw [hAinv, vecDot_comm, vecDot_matVecMul_symmPart, hξ] + have hLam_pos : 0 < Lam := lt_of_lt_of_le hA.1 hA.2.1 + have hsecond : Lam⁻¹ * vecNormSq ξ ≤ vecDot ξ (matVecMul A⁻¹ ξ) := hA.2.2.2 ξ + rw [hident] at hsecond + have hscaled := mul_le_mul_of_nonneg_left hsecond hLam_pos.le + have hcancel : Lam * (Lam⁻¹ * vecNormSq ξ) = vecNormSq ξ := by + field_simp [hLam_pos.ne'] + rw [hcancel] at hscaled + exact hscaled + +private def IsEllipticEntry (Θ : ℝ) (A : Mat d) : Prop := + (∀ ξ : Vec d, vecNormSq ξ ≤ vecDot ξ (matVecMul A ξ)) ∧ + (∀ η : Vec d, vecNormSq (matVecMul A η) ≤ Θ * vecDot η (matVecMul A η)) + +private theorem isEllipticMatrix_one_iff (A : Mat d) : + IsEllipticMatrix 1 Θ A ↔ 1 ≤ Θ ∧ IsEllipticEntry Θ A := by + constructor + · intro hA + refine ⟨hA.2.1, fun ξ => by simpa using hA.2.2.1 ξ, fun η => ?_⟩ + have h := vecNormSq_matVecMul_le_mul_vecDot_symmPart_of_isEllipticMatrix hA η + rwa [vecDot_matVecMul_symmPart] at h + · rintro ⟨hΘ, hc, himg⟩ + have hΘpos : 0 < Θ := lt_of_lt_of_le one_pos hΘ + have hlin : ∀ x y : Vec d, matVecMul A (x - y) = matVecMul A x - matVecMul A y := by + intro x y + funext i + simp [matVecMul, mul_sub, Finset.sum_sub_distrib, Pi.sub_apply] + have hinj : Function.Injective (matVecMul A) := by + intro x y hxy + have hz : matVecMul A (x - y) = 0 := by rw [hlin, hxy]; simp + have hcz := hc (x - y) + rw [hz, vecDot_zero_right] at hcz + have hzero : vecNormSq (x - y) = 0 := le_antisymm hcz (vecNormSq_nonneg _) + exact sub_eq_zero.mp (vecNormSq_eq_zero hzero) + have hunit : IsUnit A := Matrix.mulVec_injective_iff_isUnit.mp hinj + have hdet : IsUnit A.det := (Matrix.isUnit_iff_isUnit_det A).mp hunit + refine ⟨one_pos, hΘ, fun ξ => by simpa using hc ξ, fun ξ => ?_⟩ + set η := matVecMul A⁻¹ ξ with hη + have hAη : matVecMul A η = ξ := by + rw [hη, matVecMul_mul, Matrix.mul_nonsing_inv A hdet, matVecMul_one] + have himgη := himg η + rw [hAη] at himgη + have hdot : vecDot η ξ = vecDot ξ (matVecMul A⁻¹ ξ) := by rw [hη, vecDot_comm] + rw [hdot] at himgη + have hthis := mul_le_mul_of_nonneg_left himgη (le_of_lt (inv_pos.mpr hΘpos)) + rw [← mul_assoc, inv_mul_cancel₀ hΘpos.ne', one_mul] at hthis + simpa using hthis + +private theorem isClosed_isEllipticEntry : + IsClosed {A : Mat d | IsEllipticEntry Θ A} := by + have h₁ : IsClosed + {A : Mat d | ∀ ξ : Vec d, vecNormSq ξ ≤ vecDot ξ (matVecMul A ξ)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter fun ξ => ?_ + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le continuous_const (by fun_prop) + have h₂ : IsClosed + {A : Mat d | ∀ η : Vec d, + vecNormSq (matVecMul A η) ≤ Θ * vecDot η (matVecMul A η)} := by + rw [Set.ofPred_forall] + refine isClosed_iInter fun η => ?_ + simp only [vecNormSq, vecDot, matVecMul] + exact isClosed_le (by fun_prop) (by fun_prop) + exact h₁.inter h₂ + +private instance instMeasurableSpaceMat : MeasurableSpace (Mat d) := + inferInstanceAs (MeasurableSpace (Fin d → Fin d → ℝ)) + +private instance instBorelSpaceMat : BorelSpace (Mat d) := + ⟨BorelSpace.measurable_eq (α := Fin d → Fin d → ℝ)⟩ + +private instance instPseudoMetrizableSpaceMat : TopologicalSpace.PseudoMetrizableSpace (Mat d) := + inferInstanceAs (TopologicalSpace.PseudoMetrizableSpace (Fin d → Fin d → ℝ)) + +private theorem measurableSet_isEllipticMatrix : + MeasurableSet {A : Mat d | IsEllipticMatrix 1 Θ A} := by + by_cases hΘ : 1 ≤ Θ + · have hset : + {A : Mat d | IsEllipticMatrix 1 Θ A} = {A : Mat d | IsEllipticEntry Θ A} := by + ext A + simp only [Set.mem_ofPred_eq] + exact (isEllipticMatrix_one_iff A).trans (and_iff_right hΘ) + rw [hset] + exact isClosed_isEllipticEntry.measurableSet + · have hempty : {A : Mat d | IsEllipticMatrix 1 Θ A} = ∅ := by + ext A + simp only [Set.mem_ofPred_eq, Set.mem_empty_iff_false, iff_false] + intro hA + exact hΘ hA.2.1 + rw [hempty] + exact MeasurableSet.empty + +private theorem isEllipticMatrix_one_one (hΘ : 1 ≤ Θ) : + IsEllipticMatrix 1 Θ (1 : Mat d) := by + have hΘpos : 0 < Θ := lt_of_lt_of_le one_pos hΘ + refine ⟨one_pos, hΘ, ?_, ?_⟩ + · intro ξ + simp [matVecMul_one, vecNormSq] + · intro ξ + rw [inv_one, matVecMul_one] + have hinv : Θ⁻¹ ≤ 1 := by + rw [inv_le_one₀ hΘpos] + exact hΘ + have hmul : Θ⁻¹ * vecNormSq ξ ≤ 1 * vecNormSq ξ := + mul_le_mul_of_nonneg_right hinv (vecNormSq_nonneg ξ) + simpa [vecNormSq] using hmul + +theorem field_ae_elliptic_iff_exists_pointwise_representative + {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) (a : Field d) : + (∀ᵐ x ∂volume, IsEllipticMatrix 1 Θ (a x)) ↔ + ∃ f : Vec d → Mat d, Measurable f ∧ + (∀ x, IsEllipticMatrix 1 Θ (f x)) ∧ a =ᵐ[volume] f := by + constructor + · intro ha + classical + let f : Vec d → Mat d := fun x => + if IsEllipticMatrix 1 Θ (a x) then a x else 1 + have hpred : MeasurableSet {x : Vec d | IsEllipticMatrix 1 Θ (a x)} := + measurableSet_isEllipticMatrix.preimage a.measurable + have hf : Measurable f := by + exact a.measurable.ite hpred measurable_const + refine ⟨f, hf, ?_, ?_⟩ + · intro x + by_cases hx : IsEllipticMatrix 1 Θ (a x) + · simp [f, hx] + · simpa [f, hx] using isEllipticMatrix_one_one (d := d) hΘ + · filter_upwards [ha] with x hx + simp [f, hx] + · rintro ⟨f, _hf, hfell, hae⟩ + filter_upwards [hae] with x hx + rw [hx] + exact hfell x + +theorem carrier_exists_pointwise_elliptic_measurable_representative + {d : ℕ} {Θ : ℝ} (hΘ : 1 ≤ Θ) (a : Carrier d Θ) : + ∃ f : Vec d → Mat d, Measurable f ∧ + (∀ x, IsEllipticMatrix 1 Θ (f x)) ∧ a.1 =ᵐ[volume] f := + (field_ae_elliptic_iff_exists_pointwise_representative hΘ a.1).mp a.2 + +def rawGenerator {d : ℕ} (U : BorelRegion d) (e e' : Vec d) + (φ : Vec d → ℝ) (a : Vec d → Mat d) : ℝ := + ∫ x in U.1, vecDot e' (matVecMul (a x) e) * φ x + +def generator {d : ℕ} {Θ : ℝ} (U : BorelRegion d) (e e' : Vec d) + (φ : Vec d → ℝ) (a : Carrier d Θ) : ℝ := + rawGenerator U e e' φ a.1 + +theorem generator_mk_eq_raw {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) (e e' : Vec d) (φ : Vec d → ℝ) + (f : Vec d → Mat d) (hf : AEStronglyMeasurable f volume) + (hEll : ∀ᵐ x ∂volume, + IsEllipticMatrix 1 Θ ((AEEqFun.mk f hf) x)) : + generator U e e' φ ⟨AEEqFun.mk f hf, hEll⟩ = + rawGenerator U e e' φ f := by + unfold generator rawGenerator + apply integral_congr_ae + filter_upwards [ae_restrict_of_ae (AEEqFun.coeFn_mk f hf)] with x hx + rw [hx] +def localSigma {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) : MeasurableSpace (Carrier d Θ) := + MeasurableSpace.generateFrom + {s | ∃ (e e' : Vec d) (φ : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = generator U e e' φ ⁻¹' t} +def globalSigma (d : ℕ) (Θ : ℝ) : MeasurableSpace (Carrier d Θ) := + localSigma (Θ := Θ) + (⟨Set.univ, MeasurableSet.univ⟩ : BorelRegion d) + +abbrev Law (d : ℕ) (Θ : ℝ) := + @Measure (Carrier d Θ) (globalSigma d Θ) + +def IsSourceLocal {d : ℕ} {Θ : ℝ} {E : Type*} + [MeasurableSpace E] (U : BorelRegion d) + (X : Carrier d Θ → E) : Prop := + @Measurable (Carrier d Θ) E (localSigma U) _ X + +private def density {d : ℕ} (e e' : Vec d) (a : Carrier d Θ) : Vec d → ℝ := + fun x => vecDot e' (matVecMul (a.1 x) e) + +private def densityBound {d : ℕ} (Θ : ℝ) (e e' : Vec d) : ℝ := + ∑ i, ∑ j, |e' i| * max Θ 0 * |e j| + +private theorem ae_abs_density_le_densityBound {d : ℕ} {Θ : ℝ} + (e e' : Vec d) (a : Carrier d Θ) : + ∀ᵐ x ∂volume, |density e e' a x| ≤ densityBound Θ e e' := by + filter_upwards [a.2] with x hx + simp only [density, densityBound, vecDot, matVecMul] + calc + |∑ i, e' i * ∑ j, a.1 x i j * e j| ≤ + ∑ i, |e' i * ∑ j, a.1 x i j * e j| := Finset.abs_sum_le_sum_abs _ _ + _ = ∑ i, |e' i| * |∑ j, a.1 x i j * e j| := by + simp only [abs_mul] + _ ≤ ∑ i, |e' i| * ∑ j, |a.1 x i j * e j| := by + apply Finset.sum_le_sum + intro i hi + exact mul_le_mul_of_nonneg_left (Finset.abs_sum_le_sum_abs _ _) (abs_nonneg _) + _ = ∑ i, ∑ j, |e' i| * |a.1 x i j| * |e j| := by + simp only [abs_mul, Finset.mul_sum, mul_assoc] + _ ≤ ∑ i, ∑ j, |e' i| * max Θ 0 * |e j| := by + apply Finset.sum_le_sum + intro i hi + apply Finset.sum_le_sum + intro j hj + have hentry : |a.1 x i j| ≤ max Θ 0 := + (abs_apply_le_of_isEllipticMatrix hx i j).trans (le_max_left _ _) + simpa [mul_assoc] using mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_right hentry (abs_nonneg (e j))) (abs_nonneg (e' i)) + +private theorem aestronglyMeasurable_density {d : ℕ} {Θ : ℝ} + (e e' : Vec d) (a : Carrier d Θ) : + AEStronglyMeasurable (density e e' a) volume := by + unfold density + rw [show (fun x => vecDot e' (matVecMul (a.1 x) e)) = + ∑ i : Fin d, ∑ j : Fin d, fun x => e' i * (a.1 x i j * e j) by + funext x + simp only [vecDot, matVecMul, Finset.mul_sum, Finset.sum_apply]] + apply Finset.aestronglyMeasurable_sum + intro i hi + apply Finset.aestronglyMeasurable_sum + intro j hj + have hentry : AEStronglyMeasurable (fun x => a.1 x i j) volume := by + have hcont : Continuous (fun M : Mat d => M i j) := continuous_apply_apply i j + simpa [Function.comp_def] using! + (hcont.measurable.comp a.1.measurable).aestronglyMeasurable + exact (hentry.mul_const (e j)).const_mul (e' i) + +private theorem memLp_top_density {d : ℕ} {Θ : ℝ} + (e e' : Vec d) (a : Carrier d Θ) : + MemLp (density e e' a) ⊤ volume := by + apply memLp_top_of_bound (aestronglyMeasurable_density e e' a) + (densityBound Θ e e') + simpa [Real.norm_eq_abs] using ae_abs_density_le_densityBound e e' a + +private theorem exists_smoothCompactSupport_L1_sequence {d : ℕ} + (f : Vec d → ℝ) (hf : MemLp f 1 volume) : + ∃ ψ : ℕ → Vec d → ℝ, + (∀ n, HasCompactSupport (ψ n)) ∧ + (∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψ n)) ∧ + Filter.Tendsto (fun n => eLpNorm (f - ψ n) 1 volume) Filter.atTop (nhds 0) := by + choose ψ hψcompact hψsmooth hψerr using fun n : ℕ => + hf.exist_eLpNorm_sub_le (p := (1 : ENNReal)) ENNReal.one_ne_top le_rfl + (show 0 < 1 / ((n : ℝ) + 1) by positivity) + refine ⟨ψ, hψcompact, hψsmooth, ?_⟩ + have hbound : Filter.Tendsto (fun n : ℕ => ENNReal.ofReal (1 / ((n : ℝ) + 1))) + Filter.atTop (nhds (ENNReal.ofReal 0)) := + ENNReal.continuous_ofReal.continuousAt.tendsto.comp + (tendsto_one_div_add_atTop_nhds_zero_nat : + Filter.Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) Filter.atTop (nhds 0)) + have hzero := tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hbound + (fun n => by simp) + (fun n => hψerr n) + simpa using hzero + +private theorem tendsto_density_mul_of_L1 {d : ℕ} {Θ : ℝ} + (e e' : Vec d) (a : Carrier d Θ) (f : Vec d → ℝ) + (ψ : ℕ → Vec d → ℝ) + (hψ : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψ n)) + (hf : MemLp f 1 volume) + (hψtend : Filter.Tendsto (fun n => eLpNorm (f - ψ n) 1 volume) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => + eLpNorm (fun x => density e e' a x * (ψ n x - f x)) 1 volume) + Filter.atTop (nhds 0) := by + have hdiff : Filter.Tendsto (fun n => eLpNorm (ψ n - f) 1 volume) + Filter.atTop (nhds 0) := by + apply hψtend.congr + intro n + rw [eLpNorm_sub_comm] + have hbound : ∀ n, + eLpNorm (fun x => density e e' a x * (ψ n x - f x)) 1 volume ≤ + eLpNorm (density e e' a) ⊤ volume * eLpNorm (ψ n - f) 1 volume := by + intro n + simpa only [ENNReal.coe_one, one_mul, Pi.sub_apply] using + MeasureTheory.eLpNorm_le_eLpNorm_top_mul_eLpNorm + (p := (1 : ENNReal)) (g := ψ n - f) (fun u v : ℝ => u * v) 1 + (continuous_fst.mul continuous_snd) (memLp_top_density e e' a).aestronglyMeasurable + (Filter.Eventually.of_forall fun x => by simp) + have hconst : eLpNorm (density e e' a) ⊤ volume ≠ ⊤ := + (memLp_top_density e e' a).eLpNorm_lt_top.ne + have hscaled : Filter.Tendsto (fun n => + eLpNorm (density e e' a) ⊤ volume * eLpNorm (ψ n - f) 1 volume) + Filter.atTop (nhds 0) := by + simpa using ENNReal.Tendsto.const_mul hdiff (Or.inr hconst) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hscaled + (fun n => by simp) hbound + +private theorem integrable_density_mul {d : ℕ} {Θ : ℝ} + (e e' : Vec d) (a : Carrier d Θ) (f : Vec d → ℝ) + (hf : MemLp f 1 volume) : + Integrable (fun x => density e e' a x * f x) volume := by + rw [← memLp_one_iff_integrable] + exact ((memLp_top_density e e' a).mul hf : + MemLp (fun x => density e e' a x * f x) 1 volume) + +private theorem integral_density_indicator_eq {d : ℕ} {Θ : ℝ} + {U V : BorelRegion d} (hUV : U.1 ⊆ V.1) + (e e' : Vec d) (φ : Vec d → ℝ) (a : Carrier d Θ) : + ∫ x in V.1, density e e' a x * U.1.indicator φ x = + generator U e e' φ a := by + let F : Vec d → ℝ := fun x => density e e' a x * φ x + have hindicator : (fun x => density e e' a x * U.1.indicator φ x) = U.1.indicator F := by + funext x + by_cases hx : x ∈ U.1 <;> simp [F, hx] + rw [hindicator, ← integral_indicator V.2, Set.indicator_indicator, + Set.inter_eq_right.mpr hUV, integral_indicator U.2] + rfl + +private theorem measurable_generator_localSigma {d : ℕ} {Θ : ℝ} + (V : BorelRegion d) (e e' : Vec d) (ψ : Vec d → ℝ) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψcompact : HasCompactSupport ψ) : + @Measurable (Carrier d Θ) ℝ (localSigma V) _ (generator V e e' ψ) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨e, e', ψ, hψ, hψcompact, t, ht, rfl⟩ + +private theorem measurable_generator_of_subset {d : ℕ} {Θ : ℝ} + {U V : BorelRegion d} (hUV : U.1 ⊆ V.1) + (e e' : Vec d) (φ : Vec d → ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφcompact : HasCompactSupport φ) : + @Measurable (Carrier d Θ) ℝ (localSigma V) _ (generator U e e' φ) := by + let f : Vec d → ℝ := U.1.indicator φ + have hfint : Integrable f volume := by + exact (hφ.continuous.integrable_of_hasCompactSupport hφcompact).indicator U.2 + have hf : MemLp f 1 volume := memLp_one_iff_integrable.mpr hfint + obtain ⟨ψ, hψcompact, hψsmooth, hψtend⟩ := + exists_smoothCompactSupport_L1_sequence f hf + let : MeasurableSpace (Carrier d Θ) := localSigma V + apply measurable_of_tendsto_metrizable + · intro n + exact measurable_generator_localSigma V e e' (ψ n) (hψsmooth n) (hψcompact n) + · rw [tendsto_pi_nhds] + intro a + have hprod : Filter.Tendsto (fun n => + eLpNorm (fun x => density e e' a x * (ψ n x - f x)) 1 volume) + Filter.atTop (nhds 0) := + tendsto_density_mul_of_L1 e e' a f ψ hψsmooth hf hψtend + have htarget : Integrable (fun x => density e e' a x * f x) volume := + integrable_density_mul e e' a f hf + have hseqint : ∀ n, Integrable (fun x => density e e' a x * ψ n x) volume := by + intro n + apply integrable_density_mul e e' a (ψ n) + rw [memLp_one_iff_integrable] + exact (hψsmooth n).continuous.integrable_of_hasCompactSupport (hψcompact n) + have hL1 : Filter.Tendsto (fun n => + eLpNorm ((fun x => density e e' a x * ψ n x) - + fun x => density e e' a x * f x) 1 volume) + Filter.atTop (nhds 0) := by + apply hprod.congr + intro n + congr 1 + funext x + simp only [Pi.sub_apply] + ring + have hint := tendsto_setIntegral_of_L1' (fun x => density e e' a x * f x) + (Filter.Eventually.of_forall hseqint) hL1 V.1 + have htarget_eq : (∫ x in V.1, density e e' a x * f x) = + generator U e e' φ a := by + simpa [f] using integral_density_indicator_eq hUV e e' φ a + rw [htarget_eq] at hint + simpa [generator, rawGenerator, density] using hint + +theorem localSigma_mono {d : ℕ} {Θ : ℝ} {U V : BorelRegion d} (hUV : U.1 ⊆ V.1) : + localSigma (Θ := Θ) U ≤ localSigma (Θ := Θ) V := by + unfold localSigma + apply MeasurableSpace.generateFrom_le + rintro s ⟨e, e', φ, hφ, hφcompact, t, ht, rfl⟩ + exact measurable_generator_of_subset hUV e e' φ hφ hφcompact ht + +def intTranslation {d : ℕ} (z : Fin d → ℤ) : Vec d := + fun i => z i + +def translateField {d : ℕ} (z : Fin d → ℤ) (a : Field d) : Field d := + a.compMeasurePreserving (fun x : Vec d => x + intTranslation z) + (measurePreserving_add_right + (volume : Measure (Vec d)) (intTranslation z)) + +theorem translateField_ae {d : ℕ} (z : Fin d → ℤ) (a : Field d) : + translateField z a =ᵐ[volume] + fun x => a (x + intTranslation z) := + AEEqFun.coeFn_compMeasurePreserving _ _ + +def translate {d : ℕ} {Θ : ℝ} (z : Fin d → ℤ) : + Carrier d Θ → Carrier d Θ := + fun a => ⟨translateField z a.1, by + filter_upwards [translateField_ae z a.1, + (measurePreserving_add_right + (volume : Measure (Vec d)) (intTranslation z)).quasiMeasurePreserving.tendsto_ae + a.2] with x hfield hell + rw [hfield] + exact hell⟩ + +private theorem generator_translate_global {d : ℕ} {Θ : ℝ} + (z : Fin d → ℤ) (e e' : Vec d) (φ : Vec d → ℝ) (a : Carrier d Θ) : + generator (⟨Set.univ, MeasurableSet.univ⟩ : BorelRegion d) e e' φ + (translate z a) = + generator (⟨Set.univ, MeasurableSet.univ⟩ : BorelRegion d) e e' + (fun y => φ (y - intTranslation z)) a := by + unfold generator rawGenerator + simp only [Measure.restrict_univ] + have hcomp := (measurePreserving_add_right + (volume : Measure (Vec d)) (intTranslation z)).integral_comp + (Homeomorph.addRight (intTranslation z)).measurableEmbedding + (fun y => vecDot e' (matVecMul (a.1 y) e) * φ (y - intTranslation z)) + rw [← hcomp] + refine integral_congr_ae ?_ + filter_upwards [translateField_ae z a.1] with x hx + change vecDot e' (matVecMul (translateField z a.1 x) e) * φ x = _ + rw [hx] + congr 2 + abel + +theorem measurable_translate_global {d : ℕ} {Θ : ℝ} + (z : Fin d → ℤ) : + @Measurable (Carrier d Θ) (Carrier d Θ) + (globalSigma d Θ) (globalSigma d Θ) (translate (Θ := Θ) z) := by + let U : BorelRegion d := ⟨Set.univ, MeasurableSet.univ⟩ + let : MeasurableSpace (Carrier d Θ) := localSigma U + change @Measurable (Carrier d Θ) (Carrier d Θ) (localSigma U) + (MeasurableSpace.generateFrom + {s | ∃ (e e' : Vec d) (φ : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = generator U e e' φ ⁻¹' t}) + (translate z) + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, hφcompact, t, ht, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (y - intTranslation z) + have hsub : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => y - intTranslation z) := + contDiff_id.sub contDiff_const + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, Function.comp_def] using hφ.comp hsub + have hψcompact : HasCompactSupport ψ := by + simpa [ψ, Function.comp_def] using + hφcompact.comp_homeomorph (Homeomorph.subRight (intTranslation z)) + have hset : + translate (Θ := Θ) z ⁻¹' (generator + U e e' φ ⁻¹' t) = generator U e e' ψ ⁻¹' t := by + ext a + change generator U e e' φ (translate z a) ∈ t ↔ generator U e e' ψ a ∈ t + rw [generator_translate_global] + rw [hset] + exact MeasurableSpace.measurableSet_generateFrom + ⟨e, e', ψ, hψ, hψcompact, t, ht, rfl⟩ + +def supDist {d : ℕ} (x y : Vec d) : ℝ := + ‖x - y‖ + +end + +end Homogenization.Source.AKL diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/Laws.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/Laws.lean new file mode 100644 index 0000000000..1b07879ccd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/Laws.lean @@ -0,0 +1,151 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL +public import Mathlib.Probability.Independence.Basic + +/-! +# AKL laws, locality, and finite independence + +The law-facing AKL assumptions use the integral-generated local sigma algebras +of `AKL.localSigma`. +-/ + +@[expose] public section + +namespace Homogenization.Source.AKL + +open MeasureTheory ProbabilityTheory + +noncomputable section + +variable {d : ℕ} {Θ : ℝ} + +/-- Two Borel regions are unit separated for the finite-P2 hypothesis when all +cross distances in the ambient sup metric are at least one. -/ +def unitSeparated {d : ℕ} (U V : BorelRegion d) : Prop := + ∀ ⦃x y : Vec d⦄, x ∈ U.1 → y ∈ V.1 → 1 ≤ supDist x y + +/-- A law is stationary when every integer translation preserves it. -/ +def Stationary {d : ℕ} {Θ : ℝ} (P : Law d Θ) : Prop := + letI : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + ∀ z : Fin d → ℤ, Measure.map (translate (Θ := Θ) z) P = P + +/-- A law has unit range when the AKL local sigma algebras of any two +unit-separated Borel regions are independent. -/ +def UnitRangeDependent {d : ℕ} {Θ : ℝ} (P : Law d Θ) : Prop := + letI : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + ∀ U V : BorelRegion d, unitSeparated U V → + ProbabilityTheory.Indep (localSigma U) (localSigma V) P + +private def unionRegion {d : ℕ} {ι : Type*} (s : Finset ι) + (U : ι → BorelRegion d) : BorelRegion d := + ⟨⋃ i ∈ s, (U i).1, s.measurableSet_biUnion fun i _ => (U i).2⟩ + +private theorem subset_unionRegion {d : ℕ} {ι : Type*} (s : Finset ι) + (U : ι → BorelRegion d) {i : ι} (hi : i ∈ s) : + (U i).1 ⊆ (unionRegion s U).1 := by + intro x hx + exact Set.mem_iUnion.2 ⟨i, Set.mem_iUnion.2 ⟨hi, hx⟩⟩ + +private theorem unitSeparated_unionRegion {d : ℕ} {ι : Type*} (s : Finset ι) + (U : ι → BorelRegion d) {i : ι} (hi : i ∉ s) + (hsep : Pairwise fun i j => unitSeparated (U i) (U j)) : + unitSeparated (U i) (unionRegion s U) := by + intro x y hxi hy + rcases Set.mem_iUnion.1 hy with ⟨j, hy⟩ + rcases Set.mem_iUnion.1 hy with ⟨hjs, hyj⟩ + have hij : i ≠ j := by + intro h + apply hi + simpa [h] using hjs + exact hsep hij hxi hyj + +private theorem localSigma_le_unionRegion {d : ℕ} {Θ : ℝ} {ι : Type*} + (s : Finset ι) (U : ι → BorelRegion d) {i : ι} (hi : i ∈ s) : + localSigma (Θ := Θ) (U i) ≤ localSigma (Θ := Θ) (unionRegion s U) := + localSigma_mono (subset_unionRegion s U hi) + +private theorem measurableSet_biInter_localSigma_unionRegion {d : ℕ} {Θ : ℝ} + {ι : Type*} (s : Finset ι) (U : ι → BorelRegion d) + {f : ι → Set (Carrier d Θ)} + (hf : ∀ i, i ∈ s → @MeasurableSet (Carrier d Θ) (localSigma (U i)) (f i)) : + @MeasurableSet (Carrier d Θ) (localSigma (unionRegion s U)) (⋂ i ∈ s, f i) := by + apply s.measurableSet_biInter + intro i hi + exact (MeasurableSpace.le_def.mp (localSigma_le_unionRegion s U hi)) (f i) (hf i hi) + +private theorem measure_biInter_eq_prod_of_unitRangeDependent {d : ℕ} {Θ : ℝ} + {ι : Type*} (P : Law d Θ) [IsProbabilityMeasure P] + (hP : UnitRangeDependent P) (U : ι → BorelRegion d) + (hsep : Pairwise fun i j => unitSeparated (U i) (U j)) + (s : Finset ι) {f : ι → Set (Carrier d Θ)} + (hf : ∀ i, i ∈ s → @MeasurableSet (Carrier d Θ) (localSigma (U i)) (f i)) : + P (⋂ i ∈ s, f i) = ∏ i ∈ s, P (f i) := by + classical + induction s using Finset.induction with + | empty => simp + | insert i s hi ih => + have hf_i : @MeasurableSet (Carrier d Θ) (localSigma (U i)) (f i) := + hf i (by simp) + have hf_s : ∀ j, j ∈ s → @MeasurableSet (Carrier d Θ) (localSigma (U j)) (f j) := by + intro j hj + exact hf j (by simp [hj]) + have hintersection : + @MeasurableSet (Carrier d Θ) (localSigma (unionRegion s U)) (⋂ j ∈ s, f j) := + measurableSet_biInter_localSigma_unionRegion s U hf_s + have hindep : ProbabilityTheory.Indep (localSigma (U i)) + (localSigma (unionRegion s U)) P := + hP (U i) (unionRegion s U) (unitSeparated_unionRegion s U hi hsep) + have hfactor := (ProbabilityTheory.Indep_iff (localSigma (U i)) + (localSigma (unionRegion s U)) P).1 hindep (f i) (⋂ j ∈ s, f j) + hf_i hintersection + rw [Finset.set_biInter_insert, Finset.prod_insert hi] + calc + P (f i ∩ ⋂ j ∈ s, f j) = P (f i) * P (⋂ j ∈ s, f j) := hfactor + _ = P (f i) * ∏ j ∈ s, P (f j) := by rw [ih hf_s] + +theorem iIndep_localSigma_of_unitRangeDependent + {d : ℕ} {Θ : ℝ} {ι : Type*} + (P : Law d Θ) [IsProbabilityMeasure P] + (hP : UnitRangeDependent P) {U : ι → BorelRegion d} + (hsep : Pairwise fun i j => unitSeparated (U i) (U j)) : + letI : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + ProbabilityTheory.iIndep (fun i => localSigma (U i)) P := by + let : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + apply (ProbabilityTheory.iIndep_iff (fun i => localSigma (U i)) P).2 + intro s f hf + exact measure_biInter_eq_prod_of_unitRangeDependent P hP U hsep s hf + +theorem iIndepFun_of_sourceLocal_of_unitRangeDependent + {d : ℕ} {Θ : ℝ} {ι : Type*} + (P : Law d Θ) [IsProbabilityMeasure P] + (hP : UnitRangeDependent P) {U : ι → BorelRegion d} + {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {X : ∀ i, Carrier d Θ → β i} + (hX : ∀ i, IsSourceLocal (U i) (X i)) + (hsep : Pairwise fun i j => unitSeparated (U i) (U j)) : + letI : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + ProbabilityTheory.iIndepFun X P := by + let : MeasurableSpace (Carrier d Θ) := globalSigma d Θ + rw [ProbabilityTheory.iIndepFun_iff_iIndep] + apply (ProbabilityTheory.iIndep_iff (fun i => + MeasurableSpace.comap (X i) inferInstance) P).2 + intro s f hf + apply measure_biInter_eq_prod_of_unitRangeDependent P hP U hsep s + intro i hi + exact (MeasurableSpace.le_def.mp (hX i).comap_le) (f i) (hf i hi) + +structure ProbabilisticAssumptions {d : ℕ} {Θ : ℝ} + (law : Law d Θ) [IsProbabilityMeasure law] where + stationary : Stationary law + unitRange : UnitRangeDependent law + +end + +end Homogenization.Source.AKL diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/RegQuotientAdapter.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/RegQuotientAdapter.lean new file mode 100644 index 0000000000..e2ca6b28e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/AKL/RegQuotientAdapter.lean @@ -0,0 +1,229 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.Sigma +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.AKL + +/-! +# Regular-to-AKL quotient adapter + +This module supplies the one-way bridge from regular coefficient fields with a +fixed a.e. ellipticity bound to the AKL a.e.-quotient carrier. It deliberately +does not choose representatives in the reverse direction. +-/ + +@[expose] public section + +namespace Homogenization.Source.AKL + +open MeasureTheory + +noncomputable section + +variable {d : ℕ} {Θ : ℝ} + +private instance instSecondCountableTopologyMat : SecondCountableTopology (Mat d) := + inferInstanceAs (SecondCountableTopology (Fin d → Fin d → ℝ)) + +/-- Regular coefficient fields satisfying the fixed a.e. ellipticity bound +required by the AKL quotient carrier. -/ +def RegularAKLCarrier (d : ℕ) (Θ : ℝ) : Type _ := + {a : RegCoeffField d // ∀ᵐ x ∂volume, IsEllipticMatrix 1 Θ (a x)} +/-- The regular local sigma algebra pulled back to the fixed-contrast subtype. -/ +def regularLocalSigma {d : ℕ} {Θ : ℝ} (U : BorelRegion d) : + MeasurableSpace (RegularAKLCarrier d Θ) := + MeasurableSpace.comap Subtype.val (LocalSigmaR U.1) +/-- The regular global sigma algebra pulled back to the fixed-contrast subtype. -/ +def regularGlobalSigma (d : ℕ) (Θ : ℝ) : MeasurableSpace (RegularAKLCarrier d Θ) := + regularLocalSigma (Θ := Θ) (⟨Set.univ, MeasurableSet.univ⟩ : BorelRegion d) + +private theorem aestronglyMeasurable_regularField {d : ℕ} (a : RegCoeffField d) : + AEStronglyMeasurable (fun x : Vec d => a x) volume := by + letI : TopologicalSpace.PseudoMetrizableSpace (Mat d) := + inferInstanceAs (TopologicalSpace.PseudoMetrizableSpace (Fin d → Fin d → ℝ)) + have hmeas : @Measurable (Vec d) (Mat d) _ _ (fun x => a x) := + measurable_matrix_of_entries (fun i j => a.entry_measurable i j) + exact hmeas.aestronglyMeasurable + +private theorem ae_elliptic_aeeqFun_mk {d : ℕ} {Θ : ℝ} + (a : RegularAKLCarrier d Θ) : + ∀ᵐ x ∂volume, IsEllipticMatrix 1 Θ + ((AEEqFun.mk (fun x : Vec d => a.1 x) + (aestronglyMeasurable_regularField a.1)) x) := by + filter_upwards [a.2, + AEEqFun.coeFn_mk (fun x : Vec d => a.1 x) + (aestronglyMeasurable_regularField a.1)] with x hx hmk + rw [hmk] + exact hx + +/-- The canonical map from a regular a.e.-elliptic field to its AKL quotient +class. -/ +def regularToAKL {d : ℕ} {Θ : ℝ} : RegularAKLCarrier d Θ → Carrier d Θ := + fun a => ⟨AEEqFun.mk (fun x : Vec d => a.1 x) + (by exact aestronglyMeasurable_regularField a.1), by exact ae_elliptic_aeeqFun_mk a⟩ + +/-- The quotient realization agrees almost everywhere with the regular field. -/ +theorem regularToAKL_ae_eq {d : ℕ} {Θ : ℝ} (a : RegularAKLCarrier d Θ) : + (regularToAKL a).1 =ᵐ[volume] fun x => a.1 x := + AEEqFun.coeFn_mk _ (aestronglyMeasurable_regularField a.1) + +/-- AKL generators on the quotient realization equal the corresponding regular +set integrals. -/ +theorem generator_regularToAKL_eq_rawGenerator {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) (e e' : Vec d) (φ : Vec d → ℝ) + (a : RegularAKLCarrier d Θ) : + generator U e e' φ (regularToAKL a) = rawGenerator U e e' φ a.1 := by + simpa [regularToAKL] using generator_mk_eq_raw U e e' φ (fun x : Vec d => a.1 x) + (aestronglyMeasurable_regularField a.1) (ae_elliptic_aeeqFun_mk a) + +private theorem support_indicator_subset {d : ℕ} (U : Set (Vec d)) (φ : Vec d → ℝ) : + Function.support (U.indicator φ) ⊆ U := by + intro x hx + by_contra hxU + have hzero : U.indicator φ x = 0 := Set.indicator_of_notMem hxU φ + exact hx hzero + +private theorem rawGenerator_eq_sum_entryTestR_indicator {d : ℕ} + (U : BorelRegion d) (e e' : Vec d) (φ : Vec d → ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφcompact : HasCompactSupport φ) + (a : RegCoeffField d) : + rawGenerator U e e' φ a = + ∑ i, ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a := by + have hprobe : IsProbeR (U.1.indicator φ) := + (IsProbeR.of_smooth hφ hφcompact).indicator U.2 + have hpoint : ∀ x : Vec d, + U.1.indicator (fun y => vecDot e' (matVecMul (a y) e) * φ y) x = + ∑ i, ∑ j, (e' i * e j) * (a x i j * U.1.indicator φ x) := by + intro x + rw [Set.indicator_mul_right] + unfold vecDot matVecMul + rw [Finset.sum_mul] + apply Finset.sum_congr rfl + intro i _ + rw [Finset.mul_sum, Finset.sum_mul] + apply Finset.sum_congr rfl + intro j _ + ring + unfold rawGenerator entryTestR + rw [← integral_indicator U.2] + rw [show (fun x => U.1.indicator (fun y => vecDot e' (matVecMul (a y) e) * φ y) x) = + fun x => ∑ i, ∑ j, (e' i * e j) * (a x i j * U.1.indicator φ x) by + funext x + exact hpoint x] + rw [integral_finsetSum] + · apply Finset.sum_congr rfl + intro i _ + rw [integral_finsetSum] + · apply Finset.sum_congr rfl + intro j _ + rw [integral_const_mul] + · intro j _ + exact (integrable_entry_mul_probe i j hprobe a).const_mul (e' i * e j) + · intro i _ + apply integrable_finsetSum + intro j _ + exact (integrable_entry_mul_probe i j hprobe a).const_mul (e' i * e j) + +/-- AKL integral generators pull back to finite sums of regular entry-test +generators with indicator-localized probes. -/ +theorem generator_regularToAKL_eq_sum_entryTestR {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) (e e' : Vec d) (φ : Vec d → ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφcompact : HasCompactSupport φ) + (a : RegularAKLCarrier d Θ) : + generator U e e' φ (regularToAKL a) = + ∑ i, ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a.1 := by + rw [generator_regularToAKL_eq_rawGenerator] + exact rawGenerator_eq_sum_entryTestR_indicator U e e' φ hφ hφcompact a.1 + +private theorem measurable_entryTestR_indicator_regularLocalSigma {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) (i j : Fin d) (φ : Vec d → ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφcompact : HasCompactSupport φ) : + @Measurable (RegularAKLCarrier d Θ) ℝ (regularLocalSigma U) _ + (fun a => entryTestR i j (U.1.indicator φ) a.1) := by + have hprobe : IsProbeR (U.1.indicator φ) := + (IsProbeR.of_smooth hφ hφcompact).indicator U.2 + have hsupport : Function.support (U.1.indicator φ) ⊆ U.1 := + support_indicator_subset U.1 φ + have hentry : @Measurable (RegCoeffField d) ℝ (LocalSigmaR U.1) _ + (entryTestR i j (U.1.indicator φ)) := by + intro t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, U.1.indicator φ, hprobe, hsupport, t, ht, rfl⟩ + exact hentry.comp (Measurable.of_comap_le le_rfl) + +private theorem measurable_sum_entryTestR_indicator_localSigmaR {d : ℕ} + (U : BorelRegion d) (e e' : Vec d) (φ : Vec d → ℝ) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφcompact : HasCompactSupport φ) : + @Measurable (RegCoeffField d) ℝ (LocalSigmaR U.1) _ + (fun a => ∑ i, ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a) := by + let : MeasurableSpace (RegCoeffField d) := LocalSigmaR U.1 + have hprobe : IsProbeR (U.1.indicator φ) := + (IsProbeR.of_smooth hφ hφcompact).indicator U.2 + have hsupport : Function.support (U.1.indicator φ) ⊆ U.1 := + support_indicator_subset U.1 φ + have hentry : ∀ i j : Fin d, + Measurable (entryTestR i j (U.1.indicator φ)) := by + intro i j t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, U.1.indicator φ, hprobe, hsupport, t, ht, rfl⟩ + apply (Finset.measurable_sum (s := Finset.univ) (f := fun i => + fun a => ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a)) + intro i _ + apply (Finset.measurable_sum (s := Finset.univ) (f := fun j => + fun a => (e' i * e j) * entryTestR i j (U.1.indicator φ) a)) + intro j _ + exact (hentry i j).const_mul (e' i * e j) + +/-- The quotient map is measurable from the regular local sigma algebra to the +AKL local sigma algebra. This is the valid regular-to-quotient direction. -/ +theorem regularToAKL_measurable_local {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) : + @Measurable (RegularAKLCarrier d Θ) (Carrier d Θ) + (regularLocalSigma U) (localSigma U) regularToAKL := by + change @Measurable (RegularAKLCarrier d Θ) (Carrier d Θ) (regularLocalSigma U) + (MeasurableSpace.generateFrom + {s | ∃ (e e' : Vec d) (φ : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = generator U e e' φ ⁻¹' t}) regularToAKL + let : MeasurableSpace (RegularAKLCarrier d Θ) := regularLocalSigma U + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, hφcompact, t, ht, rfl⟩ + have hfun : (fun a : RegularAKLCarrier d Θ => + generator U e e' φ (regularToAKL a)) = + fun a => ∑ i, ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a.1 := by + funext a + exact generator_regularToAKL_eq_sum_entryTestR U e e' φ hφ hφcompact a + change MeasurableSet ((fun a : RegularAKLCarrier d Θ => + generator U e e' φ (regularToAKL a)) ⁻¹' t) + rw [hfun] + have hsum : Measurable (fun a : RegularAKLCarrier d Θ => + ∑ i, ∑ j, (e' i * e j) * entryTestR i j (U.1.indicator φ) a.1) := + (measurable_sum_entryTestR_indicator_localSigmaR U e e' φ hφ hφcompact).comp + (Measurable.of_comap_le le_rfl) + exact hsum ht + +/-- Pulling back AKL local information along `regularToAKL` is no finer than +the regular subtype's pulled-back `LocalSigmaR` structure. -/ +theorem comap_localSigma_regularToAKL_le_regularLocalSigma {d : ℕ} {Θ : ℝ} + (U : BorelRegion d) : + MeasurableSpace.comap (regularToAKL (d := d) (Θ := Θ)) (localSigma (Θ := Θ) U) ≤ + regularLocalSigma (Θ := Θ) U := + (regularToAKL_measurable_local (d := d) (Θ := Θ) U).comap_le + +/-- At the whole space, the regular-to-AKL map is measurable into AKL's global +sigma algebra from the corresponding regular global local sigma algebra. -/ +theorem regularToAKL_measurable_global {d : ℕ} {Θ : ℝ} : + @Measurable (RegularAKLCarrier d Θ) (Carrier d Θ) + (regularGlobalSigma d Θ) (globalSigma d Θ) regularToAKL := by + simpa [regularGlobalSigma, globalSigma] using! + (regularToAKL_measurable_local + (d := d) (Θ := Θ) (⟨Set.univ, MeasurableSet.univ⟩ : BorelRegion d)) + +end + +end Homogenization.Source.AKL diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse.lean new file mode 100644 index 0000000000..8a88ab1275 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientField +public import LeanPool.CoarseGraining.Homogenization.Geometry.SignedPermutation +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.MeasureTheory.Integral.Bochner.Basic +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic +public import Mathlib.Topology.Algebra.Support + +/-! # Coarse -/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory + +def euclideanBall {d : ℕ} (R : ℝ) : Set (Vec d) := + {x | euclideanNorm x < R} + +structure SmoothCompactProbe {d : ℕ} (φ : Vec d → ℝ) : Prop where + smooth : ContDiff ℝ (⊤ : ℕ∞) φ + compact : HasCompactSupport φ + +def Carrier (d : ℕ) := + {a : CoeffField d // + (∀ i j, Measurable (fun x : Vec d => a x i j)) ∧ + ∀ R : ℝ, 1 ≤ R → ∃ ε : ℝ, 0 < ε ∧ ε ≤ 1 ∧ + ∀ x, x ∈ euclideanBall R → IsEllipticMatrix ε ε⁻¹ (a x)} + +instance instCoeFunCarrier (d : ℕ) : CoeFun (Carrier d) (fun _ => CoeffField d) where + coe a := a.1 + +noncomputable def bilinearTest {d : ℕ} (e e' : Vec d) + (φ : Vec d → ℝ) (a : Carrier d) : ℝ := + ∫ x, vecDot e' (matVecMul (a x) e) * φ x ∂volume +def localSigma {d : ℕ} (U : Set (Vec d)) (_hU : MeasurableSet U) : + MeasurableSpace (Carrier d) := + MeasurableSpace.generateFrom + {s | ∃ (e e' : Vec d) (φ : Vec d → ℝ), + SmoothCompactProbe φ ∧ tsupport φ ⊆ U ∧ + ∃ t : Set ℝ, MeasurableSet t ∧ s = bilinearTest e e' φ ⁻¹' t} +def globalSigma (d : ℕ) : MeasurableSpace (Carrier d) := + localSigma Set.univ MeasurableSet.univ + +instance instMeasurableSpaceCarrier (d : ℕ) : MeasurableSpace (Carrier d) := + globalSigma d + +def IsLocalObservable {d : ℕ} (U : Set (Vec d)) (hU : MeasurableSet U) + {β : Type*} [MeasurableSpace β] (X : Carrier d → β) : Prop := + @Measurable (Carrier d) β (localSigma U hU) _ X + +private theorem euclideanNorm_add_le {d : ℕ} (x y : Vec d) : + euclideanNorm (x + y) ≤ euclideanNorm x + euclideanNorm y := by + rw [euclideanNorm_eq_norm_ofVec, euclideanNorm_eq_norm_ofVec, + euclideanNorm_eq_norm_ofVec] + change ‖WithLp.toLp 2 (x + y)‖ ≤ ‖WithLp.toLp 2 x‖ + ‖WithLp.toLp 2 y‖ + rw [WithLp.toLp_add] + exact norm_add_le _ _ + +private theorem vecNormSq_matVecMul_signedPermutation {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) (x : Vec d) : + vecNormSq (matVecMul R x) = vecNormSq x := by + classical + rcases hR with ⟨σ, s, hs, hR⟩ + have happly : ∀ j, matVecMul R x (σ j) = s j * x j := by + intro j + unfold matVecMul + rw [Finset.sum_eq_single j] + · rw [hR (σ j) j] + simp + · intro k _ hkj + rw [hR (σ j) k] + have hne : σ j ≠ σ k := fun h => hkj (σ.injective h.symm) + simp [hne] + · intro hnot + exact (hnot (Finset.mem_univ _)).elim + have hsq : + ∑ i, (matVecMul R x i) ^ 2 = ∑ i, x i ^ 2 := by + calc + ∑ i, (matVecMul R x i) ^ 2 = + ∑ j, (matVecMul R x (σ j)) ^ 2 := (Equiv.sum_comp σ _).symm + _ = ∑ j, (s j * x j) ^ 2 := by + apply Finset.sum_congr rfl + intro j _ + rw [happly] + _ = ∑ j, x j ^ 2 := by + apply Finset.sum_congr rfl + intro j _ + rcases hs j with hj | hj <;> rw [hj] <;> ring + simpa [vecNormSq, vecDot, pow_two] using hsq + +private theorem euclideanNorm_matVecMul_signedPermutation {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) (x : Vec d) : + euclideanNorm (matVecMul R x) = euclideanNorm x := by + rw [← sq_eq_sq₀ (euclideanNorm_nonneg _) (euclideanNorm_nonneg _), + euclideanNorm_sq, euclideanNorm_sq] + simpa [vecNormSq, vecDot, pow_two] using vecNormSq_matVecMul_signedPermutation hR x + +private theorem isEllipticMatrix_rotate {d : ℕ} {lam Lam : ℝ} {R A : Mat d} + (hR : IsSignedPermutationMatrix R) (hA : IsEllipticMatrix lam Lam A) : + IsEllipticMatrix lam Lam (matTranspose R * A * R) := by + have hdetA : IsUnit A.det := isUnit_det_of_isEllipticMatrix hA + have hdetR : IsUnit R.det := isUnit_iff_ne_zero.mpr hR.det_ne_zero + have hdetRT : IsUnit (matTranspose R).det := by + simpa [matTranspose, Matrix.det_transpose] using hdetR + have hdetB : IsUnit (matTranspose R * A * R).det := by + simpa [Matrix.det_mul] using (hdetRT.mul hdetA).mul hdetR + have hprod : + (matTranspose R * A * R) * (matTranspose R * A⁻¹ * R) = 1 := by + calc + (matTranspose R * A * R) * (matTranspose R * A⁻¹ * R) = + (matTranspose R * A) * (R * matTranspose R) * A⁻¹ * R := by + simp only [Matrix.mul_assoc] + _ = matTranspose R * A * A⁻¹ * R := by + rw [hR.mul_transpose_self] + simp + _ = (matTranspose R * (A * A⁻¹)) * R := by + simp only [Matrix.mul_assoc] + _ = matTranspose R * R := by + rw [Matrix.mul_nonsing_inv A hdetA] + simp + _ = 1 := hR.transpose_mul_self + have hinv : (matTranspose R * A * R)⁻¹ = matTranspose R * A⁻¹ * R := by + calc + (matTranspose R * A * R)⁻¹ = (matTranspose R * A * R)⁻¹ * 1 := + (mul_one _).symm + _ = (matTranspose R * A * R)⁻¹ * + ((matTranspose R * A * R) * (matTranspose R * A⁻¹ * R)) := by rw [hprod] + _ = ((matTranspose R * A * R)⁻¹ * (matTranspose R * A * R)) * + (matTranspose R * A⁻¹ * R) := by rw [← Matrix.mul_assoc] + _ = 1 * (matTranspose R * A⁻¹ * R) := by + rw [Matrix.nonsing_inv_mul _ hdetB] + _ = matTranspose R * A⁻¹ * R := one_mul _ + rcases hA with ⟨hlam, hlamLam, hlower, hinvA⟩ + refine ⟨hlam, hlamLam, ?_, ?_⟩ + · intro ξ + calc + lam * vecNormSq ξ = lam * vecNormSq (matVecMul R ξ) := by + rw [vecNormSq_matVecMul_signedPermutation hR] + _ ≤ vecDot (matVecMul R ξ) (matVecMul A (matVecMul R ξ)) := + hlower (matVecMul R ξ) + _ = vecDot ξ (matVecMul (matTranspose R * A * R) ξ) := by + symm + rw [← matVecMul_mul (matTranspose R * A) R ξ, + ← matVecMul_mul (matTranspose R) A (matVecMul R ξ), + vecDot_matVecMul_transpose] + · intro ξ + calc + Lam⁻¹ * vecNormSq ξ = Lam⁻¹ * vecNormSq (matVecMul R ξ) := by + rw [vecNormSq_matVecMul_signedPermutation hR] + _ ≤ vecDot (matVecMul R ξ) (matVecMul A⁻¹ (matVecMul R ξ)) := + hinvA (matVecMul R ξ) + _ = vecDot ξ (matVecMul (matTranspose R * A⁻¹ * R) ξ) := by + symm + rw [← matVecMul_mul (matTranspose R * A⁻¹) R ξ, + ← matVecMul_mul (matTranspose R) A⁻¹ (matVecMul R ξ), + vecDot_matVecMul_transpose] + _ = vecDot ξ (matVecMul ((matTranspose R * A * R)⁻¹) ξ) := by rw [hinv] + +def Carrier.translate {d : ℕ} (z : Fin d → ℤ) (a : Carrier d) : Carrier d where + val := fun x => a (x + intVecToRealVec z) + property := by + constructor + · intro i j + exact (a.2.1 i j).comp (measurable_id.add measurable_const) + · intro R hR + obtain ⟨ε, hε, hεone, hEll⟩ := + a.2.2 (R + euclideanNorm (intVecToRealVec z) + 1) (by + have hnonneg : 0 ≤ euclideanNorm (intVecToRealVec z) := + euclideanNorm_nonneg _ + linarith) + refine ⟨ε, hε, hεone, ?_⟩ + intro x hx + apply hEll (x + intVecToRealVec z) + change euclideanNorm (x + intVecToRealVec z) < + R + euclideanNorm (intVecToRealVec z) + 1 + calc + euclideanNorm (x + intVecToRealVec z) ≤ + euclideanNorm x + euclideanNorm (intVecToRealVec z) := + euclideanNorm_add_le x _ + _ < R + euclideanNorm (intVecToRealVec z) + 1 := by + change euclideanNorm x < R at hx + linarith + +@[simp] theorem Carrier.translate_apply {d : ℕ} (z : Fin d → ℤ) + (a : Carrier d) (x : Vec d) : + Carrier.translate z a x = a (x + intVecToRealVec z) := + rfl + +def Carrier.adjoint {d : ℕ} (a : Carrier d) : Carrier d where + val := fun x => matTranspose (a x) + property := by + constructor + · intro i j + simpa [matTranspose] using a.2.1 j i + · intro R hR + obtain ⟨ε, hε, hεone, hEll⟩ := a.2.2 R hR + exact ⟨ε, hε, hεone, fun x hx => isEllipticMatrix_transpose (hEll x hx)⟩ + +@[simp] theorem Carrier.adjoint_apply {d : ℕ} (a : Carrier d) (x : Vec d) : + Carrier.adjoint a x = matTranspose (a x) := + rfl + +def Carrier.rotate {d : ℕ} (R : Mat d) (hR : IsSignedPermutationMatrix R) + (a : Carrier d) : Carrier d where + val := fun x => matTranspose R * a (matVecMul R x) * R + property := by + constructor + · intro i j + let f : Fin d → Vec d → ℝ := fun l x => + ∑ k ∈ Finset.univ, (matTranspose R) i k * (a (matVecMul R x) k l * R l j) + have hf : ∀ l ∈ Finset.univ, Measurable (f l) := by + intro l _ + refine Finset.measurable_sum (s := Finset.univ) + (f := fun k => fun x : Vec d => + (matTranspose R) i k * (a (matVecMul R x) k l * R l j)) ?_ + intro k _ + have hEval : Measurable (fun x : Vec d => a (matVecMul R x) k l) := + (a.2.1 k l).comp (signedPermutationHomeomorph R hR).continuous_toFun.measurable + exact measurable_const.mul (hEval.mul measurable_const) + simpa [f, Matrix.mul_apply, Finset.mul_sum, Finset.sum_mul, mul_assoc] using + (Finset.measurable_sum (s := Finset.univ) (f := f) hf) + · intro r hr + obtain ⟨ε, hε, hεone, hEll⟩ := a.2.2 r hr + refine ⟨ε, hε, hεone, ?_⟩ + intro x hx + apply isEllipticMatrix_rotate hR + apply hEll (matVecMul R x) + change euclideanNorm (matVecMul R x) < r + rw [euclideanNorm_matVecMul_signedPermutation hR] + exact hx + +@[simp] theorem Carrier.rotate_apply {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) (a : Carrier d) (x : Vec d) : + Carrier.rotate R hR a x = matTranspose R * a (matVecMul R x) * R := + rfl + +private theorem contDiff_matVecMul {d : ℕ} (R : Mat d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => matVecMul R x) := by + rw [contDiff_pi] + intro i + change ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => ∑ j, R i j * x j) + exact ContDiff.sum fun j _ => contDiff_const.mul (contDiff_apply ℝ ℝ j) + +private theorem smoothCompactProbe_translate {d : ℕ} (z : Vec d) {φ : Vec d → ℝ} + (hφ : SmoothCompactProbe φ) : + SmoothCompactProbe (fun x => φ (x - z)) := by + constructor + · simpa [Function.comp_def] using + hφ.smooth.comp (contDiff_id.sub contDiff_const) + · simpa [Function.comp_def] using hφ.compact.comp_homeomorph (Homeomorph.subRight z) + +private theorem smoothCompactProbe_rotate {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) {φ : Vec d → ℝ} + (hφ : SmoothCompactProbe φ) : + SmoothCompactProbe (fun y => φ (matVecMul (matTranspose R) y)) := by + constructor + · simpa [Function.comp_def] using hφ.smooth.comp (contDiff_matVecMul (matTranspose R)) + · simpa [Function.comp_def] using! + hφ.compact.comp_homeomorph (signedPermutationHomeomorph (matTranspose R) hR.transpose) + +private theorem bilinearTest_translate {d : ℕ} (z : Fin d → ℤ) + (e e' : Vec d) (φ : Vec d → ℝ) (a : Carrier d) : + bilinearTest e e' φ (Carrier.translate z a) = + bilinearTest e e' (fun y => φ (y - intVecToRealVec z)) a := by + let g : Vec d → ℝ := fun y => + vecDot e' (matVecMul (a y) e) * φ (y - intVecToRealVec z) + have hcv := + (measurePreserving_add_right (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) + (intVecToRealVec z)).integral_comp + (Homeomorph.addRight (intVecToRealVec z)).measurableEmbedding g + unfold bilinearTest + calc + ∫ x, vecDot e' (matVecMul (Carrier.translate z a x) e) * φ x ∂volume = + ∫ x, g (x + intVecToRealVec z) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [g, sub_eq_add_neg, add_assoc] + _ = ∫ y, g y ∂volume := hcv + _ = ∫ y, vecDot e' (matVecMul (a y) e) * + (fun y => φ (y - intVecToRealVec z)) y ∂volume := rfl + +private theorem bilinearTest_adjoint {d : ℕ} (e e' : Vec d) (φ : Vec d → ℝ) + (a : Carrier d) : + bilinearTest e e' φ (Carrier.adjoint a) = bilinearTest e' e φ a := by + unfold bilinearTest + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall fun x => ?_) + change vecDot e' (matVecMul (matTranspose (a x)) e) * φ x = + vecDot e (matVecMul (a x) e') * φ x + rw [vecDot_matVecMul_transpose, vecDot_comm] + +private theorem bilinearTest_rotate {d : ℕ} {R : Mat d} + (hR : IsSignedPermutationMatrix R) (e e' : Vec d) (φ : Vec d → ℝ) + (a : Carrier d) : + bilinearTest e e' φ (Carrier.rotate R hR a) = + bilinearTest (matVecMul R e) (matVecMul R e') + (fun y => φ (matVecMul (matTranspose R) y)) a := by + let g : Vec d → ℝ := fun y => + vecDot (matVecMul R e') (matVecMul (a y) (matVecMul R e)) * + φ (matVecMul (matTranspose R) y) + have hcv := (measurePreserving_matVecMul_signedPermutation hR).integral_comp + (signedPermutationHomeomorph R hR).measurableEmbedding g + have hleft : + (∫ x, vecDot e' (matVecMul (Carrier.rotate R hR a x) e) * φ x + ∂volume) = + ∫ x, g (matVecMul R x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hback : matVecMul (matTranspose R) (matVecMul R x) = x := by + rw [matVecMul_mul, hR.transpose_mul_self] + unfold matVecMul + simp [Matrix.one_apply] + have halg : + vecDot e' (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) e) = + vecDot (matVecMul R e') (matVecMul (a (matVecMul R x)) (matVecMul R e)) := by + calc + vecDot e' (matVecMul ((matTranspose R) * (a (matVecMul R x)) * R) e) = + vecDot e' (matVecMul ((matTranspose R) * (a (matVecMul R x))) + (matVecMul R e)) := by rw [← matVecMul_mul] + _ = vecDot e' (matVecMul (matTranspose R) + (matVecMul (a (matVecMul R x)) (matVecMul R e))) := by + rw [← matVecMul_mul] + _ = vecDot (matVecMul R e') + (matVecMul (a (matVecMul R x)) (matVecMul R e)) := by + rw [vecDot_matVecMul_transpose] + simp [g, hback, halg] + unfold bilinearTest + calc + ∫ x, vecDot e' (matVecMul (Carrier.rotate R hR a x) e) * φ x ∂volume = + ∫ x, g (matVecMul R x) ∂volume := hleft + _ = ∫ y, g y ∂volume := hcv + _ = ∫ y, vecDot (matVecMul R e') (matVecMul (a y) (matVecMul R e)) * + φ (matVecMul (matTranspose R) y) ∂volume := rfl + +theorem localSigma_mono {d : ℕ} {U V : Set (Vec d)} + (hU : MeasurableSet U) (hV : MeasurableSet V) (hUV : U ⊆ V) : + localSigma U hU ≤ localSigma V hV := by + unfold localSigma + apply MeasurableSpace.generateFrom_mono + rintro s ⟨e, e', φ, hφ, hφU, t, ht, rfl⟩ + exact ⟨e, e', φ, hφ, hφU.trans hUV, t, ht, rfl⟩ + +/-- Translating coefficients by `z` pulls observables local to `U` back to +observables local to `U + z`. -/ +theorem measurable_translate_localSigma {d : ℕ} (z : Fin d → ℤ) + {U : Set (Vec d)} (hU : MeasurableSet U) : + @Measurable (Carrier d) (Carrier d) + (localSigma (translateSet (intVecToRealVec z) U) (by + rw [← preimage_subRight_eq_translateSet] + exact hU.preimage (Homeomorph.subRight _).continuous.measurable)) + (localSigma U hU) (Carrier.translate z) := by + let : MeasurableSpace (Carrier d) := + localSigma (translateSet (intVecToRealVec z) U) (by + rw [← preimage_subRight_eq_translateSet] + exact hU.preimage (Homeomorph.subRight _).continuous.measurable) + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, hφU, t, ht, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (y - intVecToRealVec z) + have htest : (fun a : Carrier d => bilinearTest e e' φ (Carrier.translate z a)) = + bilinearTest e e' ψ := by + funext a + exact bilinearTest_translate z e e' φ a + have hψsupport_eq : + tsupport ψ = (fun y : Vec d => y - intVecToRealVec z) ⁻¹' tsupport φ := by + simpa [ψ, Function.comp_def] using + (tsupport_comp_eq_preimage φ (Homeomorph.subRight (intVecToRealVec z))) + have hψsupport : tsupport ψ ⊆ translateSet (intVecToRealVec z) U := by + intro y hy + have hy'' : y ∈ (fun y : Vec d => y - intVecToRealVec z) ⁻¹' tsupport φ := by + rw [← hψsupport_eq] + exact hy + have hy' : y - intVecToRealVec z ∈ tsupport φ := by + exact hy'' + exact mem_translateSet_iff_sub_mem.mpr (hφU hy') + change MeasurableSet ((fun a : Carrier d => + bilinearTest e e' φ (Carrier.translate z a)) ⁻¹' t) + rw [htest] + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨e, e', ψ, smoothCompactProbe_translate (intVecToRealVec z) hφ, + hψsupport, t, ht, rfl⟩ + +/-- A local observable remains local after precomposing with a coefficient +translation, with its region translated by the same vector. -/ +theorem IsLocalObservable.comp_translate {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) {β : Type*} [MeasurableSpace β] + {X : Carrier d → β} (hX : IsLocalObservable U hU X) (z : Fin d → ℤ) : + IsLocalObservable (translateSet (intVecToRealVec z) U) (by + rw [← preimage_subRight_eq_translateSet] + exact hU.preimage (Homeomorph.subRight _).continuous.measurable) + (X ∘ Carrier.translate z) := by + exact hX.comp (measurable_translate_localSigma z hU) + +theorem measurable_translate_globalSigma {d : ℕ} (z : Fin d → ℤ) : + Measurable (Carrier.translate (d := d) z) := by + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, _hφ, t, ht, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (y - intVecToRealVec z) + have htest : (fun a : Carrier d => bilinearTest e e' φ (Carrier.translate z a)) = + bilinearTest e e' ψ := by + funext a + exact bilinearTest_translate z e e' φ a + change MeasurableSet ((fun a : Carrier d => + bilinearTest e e' φ (Carrier.translate z a)) ⁻¹' t) + rw [htest] + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨e, e', ψ, smoothCompactProbe_translate (intVecToRealVec z) hφ, + Set.subset_univ _, t, ht, rfl⟩ + +theorem measurable_adjoint_globalSigma {d : ℕ} : + Measurable (Carrier.adjoint : Carrier d → Carrier d) := by + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, _hφ, t, ht, rfl⟩ + have htest : (fun a : Carrier d => bilinearTest e e' φ (Carrier.adjoint a)) = + bilinearTest e' e φ := by + funext a + exact bilinearTest_adjoint e e' φ a + change MeasurableSet ((fun a : Carrier d => + bilinearTest e e' φ (Carrier.adjoint a)) ⁻¹' t) + rw [htest] + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨e', e, φ, hφ, Set.subset_univ _, t, ht, rfl⟩ + +theorem measurable_rotate_globalSigma {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) : + Measurable (Carrier.rotate (d := d) R hR) := by + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, _hφ, t, ht, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (matVecMul (matTranspose R) y) + have htest : + (fun a : Carrier d => bilinearTest e e' φ (Carrier.rotate R hR a)) = + bilinearTest (matVecMul R e) (matVecMul R e') ψ := by + funext a + exact bilinearTest_rotate hR e e' φ a + change MeasurableSet ((fun a : Carrier d => + bilinearTest e e' φ (Carrier.rotate R hR a)) ⁻¹' t) + rw [htest] + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨matVecMul R e, matVecMul R e', ψ, smoothCompactProbe_rotate hR hφ, + Set.subset_univ _, t, ht, rfl⟩ + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Laws.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Laws.lean new file mode 100644 index 0000000000..7c875bfecc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Laws.lean @@ -0,0 +1,132 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse +public import Mathlib.Probability.Independence.Basic + +/-! # Laws -/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory + +def EuclideanUnitSeparated {d : ℕ} + (U V : Set (Vec d)) : Prop := + ∀ ⦃x y : Vec d⦄, x ∈ U → y ∈ V → 1 ≤ euclideanDist x y + +def IsStationary {d : ℕ} (P : Measure (Carrier d)) : Prop := + ∀ z : Fin d → ℤ, Measure.map (Carrier.translate z) P = P + +def IsUnitRangeDependent {d : ℕ} (P : Measure (Carrier d)) : Prop := + ∀ (U V : Set (Vec d)) (hU : MeasurableSet U) (hV : MeasurableSet V), + EuclideanUnitSeparated U V → + ProbabilityTheory.Indep (localSigma U hU) (localSigma V hV) P + +def IsIsotropicAndAdjointInvariant {d : ℕ} + (P : Measure (Carrier d)) : Prop := + (∀ (R : Mat d) (hR : IsSignedPermutationMatrix R), + Measure.map (Carrier.rotate R hR) P = P) ∧ + Measure.map Carrier.adjoint P = P + +private theorem euclideanUnitSeparated_biUnion_right {d : ℕ} {ι : Type*} + {U : Set (Vec d)} {V : ι → Set (Vec d)} {s : Finset ι} + (h : ∀ i ∈ s, EuclideanUnitSeparated U (V i)) : + EuclideanUnitSeparated U (⋃ i ∈ s, V i) := by + intro x y hx hy + simp only [Set.mem_iUnion] at hy + rcases hy with ⟨i, hi, hyi⟩ + exact h i hi hx hyi + +private theorem measurableSet_biInter_localSigma_biUnion {d : ℕ} {ι : Type*} + {U : ι → Set (Vec d)} (hU : ∀ i, MeasurableSet (U i)) + {f : ι → Set (Carrier d)} {s : Finset ι} + (hf : ∀ i ∈ s, @MeasurableSet (Carrier d) (localSigma (U i) (hU i)) (f i)) : + @MeasurableSet (Carrier d) + (localSigma (⋃ i ∈ s, U i) (Finset.measurableSet_biUnion s fun i _ => hU i)) + (⋂ i ∈ s, f i) := by + classical + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + have hUnion : MeasurableSet (⋃ j ∈ insert i s, U j) := + Finset.measurableSet_biUnion _ fun j _ => hU j + have hsubset_i : U i ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hi_meas : + @MeasurableSet (Carrier d) + (localSigma (⋃ j ∈ insert i s, U j) hUnion) (f i) := + (localSigma_mono (hU i) hUnion hsubset_i) (f i) (hf i (by simp)) + have hsubset_s : (⋃ j ∈ s, U j) ⊆ ⋃ j ∈ insert i s, U j := by + intro x hx + simp [hx] + have hs_meas : + @MeasurableSet (Carrier d) + (localSigma (⋃ j ∈ insert i s, U j) hUnion) (⋂ j ∈ s, f j) := + (localSigma_mono + (Finset.measurableSet_biUnion s fun j _ => hU j) hUnion hsubset_s) + (⋂ j ∈ s, f j) (ih fun j hj => hf j (by simp [hj])) + simpa [Finset.set_biInter_insert, hi] using hi_meas.inter hs_meas + +theorem iIndep_localSigma_of_pairwise_euclideanUnitSeparated + {d : ℕ} {ι : Type*} (P : Measure (Carrier d)) + [IsProbabilityMeasure P] (hP2 : IsUnitRangeDependent P) + {U : ι → Set (Vec d)} (hU : ∀ i, MeasurableSet (U i)) + (hsep : Pairwise fun i j => EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndep (fun i => localSigma (U i) (hU i)) P := by + classical + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + induction s using Finset.induction_on with + | empty => simp + | @insert i s hi ih => + have hUnion : MeasurableSet (⋃ j ∈ s, U j) := + Finset.measurableSet_biUnion _ fun j _ => hU j + have hsep_union : EuclideanUnitSeparated (U i) (⋃ j ∈ s, U j) := by + refine euclideanUnitSeparated_biUnion_right (U := U i) (V := U) ?_ + intro j hj + exact hsep (by + intro hij + exact hi (hij ▸ hj)) + have hs_meas : + @MeasurableSet (Carrier d) (localSigma (⋃ j ∈ s, U j) hUnion) + (⋂ j ∈ s, f j) := + measurableSet_biInter_localSigma_biUnion (U := U) hU + (f := f) (s := s) fun j hj => hf j (by simp [hj]) + have h_inter : + P (f i ∩ ⋂ j ∈ s, f j) = P (f i) * P (⋂ j ∈ s, f j) := by + exact (ProbabilityTheory.Indep_iff + (localSigma (U i) (hU i)) (localSigma (⋃ j ∈ s, U j) hUnion) P).1 + (hP2 (U i) (⋃ j ∈ s, U j) (hU i) hUnion hsep_union) + (f i) (⋂ j ∈ s, f j) (hf i (by simp)) hs_meas + calc + P (⋂ j ∈ insert i s, f j) = P (f i ∩ ⋂ j ∈ s, f j) := by simp + _ = P (f i) * P (⋂ j ∈ s, f j) := h_inter + _ = P (f i) * ∏ j ∈ s, P (f j) := by rw [ih (fun j hj => hf j (by simp [hj]))] + _ = ∏ j ∈ insert i s, P (f j) := by simp [Finset.prod_insert, hi] + +theorem iIndepFun_of_localObservable_of_pairwise_euclideanUnitSeparated + {d : ℕ} {ι : Type*} (P : Measure (Carrier d)) + [IsProbabilityMeasure P] (hP2 : IsUnitRangeDependent P) + {U : ι → Set (Vec d)} (hU : ∀ i, MeasurableSet (U i)) + {β : ι → Type*} [∀ i, MeasurableSpace (β i)] + {X : ∀ i, Carrier d → β i} + (hX : ∀ i, IsLocalObservable (U i) (hU i) (X i)) + (hsep : Pairwise fun i j => EuclideanUnitSeparated (U i) (U j)) : + ProbabilityTheory.iIndepFun X P := by + classical + rw [ProbabilityTheory.iIndepFun_iff_iIndep] + rw [ProbabilityTheory.iIndep_iff] + intro s f hf + exact (ProbabilityTheory.iIndep_iff (fun i => localSigma (U i) (hU i)) P).1 + (iIndep_localSigma_of_pairwise_euclideanUnitSeparated (P := P) hP2 hU hsep) s + (fun i hi => (Measurable.comap_le (hX i)) (f i) (hf i hi)) + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RegIntegralAdapter.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RegIntegralAdapter.lean new file mode 100644 index 0000000000..f89766acf6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RegIntegralAdapter.lean @@ -0,0 +1,196 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse +public import LeanPool.CoarseGraining.Homogenization.Probability.RegCoeffField.SmoothSigma + +/-! +# Coarse-to-regular integral adapter + +This module compares the source coarse integral sigma algebra with the smooth +integral sigma algebra on regular coefficient fields. It deliberately does +not equip the adapter with measurability into the canonical regular carrier. +-/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory + +private theorem continuous_euclideanNorm {d : ℕ} : + Continuous (euclideanNorm (d := d)) := by + change Continuous (fun x : Vec d => euclideanNorm x) + simp_rw [euclideanNorm_eq_norm_ofVec] + exact (PiLp.continuous_toLp 2 fun _ : Fin d => ℝ).norm + +private theorem locallyIntegrable_coarse_entry {d : ℕ} (a : Carrier d) + (i j : Fin d) : LocallyIntegrable (fun x : Vec d => a x i j) volume := by + rw [locallyIntegrable_iff] + intro K hK + obtain ⟨C, hC⟩ := hK.exists_bound_of_continuousOn continuous_euclideanNorm.continuousOn + let R : ℝ := max 1 (C + 1) + have hR : 1 ≤ R := le_max_left _ _ + obtain ⟨ε, hε, hεone, hEll⟩ := a.2.2 R hR + refine Measure.integrableOn_of_bounded (M := ε⁻¹) (hK.measure_lt_top).ne + (a.2.1 i j).aestronglyMeasurable ?_ + filter_upwards [ae_restrict_mem hK.measurableSet] with x hx + have hxC : euclideanNorm x ≤ C := by + have h := hC x hx + simpa only [Real.norm_eq_abs] using le_trans (le_abs_self _) h + have hxR : x ∈ euclideanBall R := by + change euclideanNorm x < max 1 (C + 1) + exact hxC.trans_lt ((lt_add_one C).trans_le (le_max_right _ _)) + have hentry := abs_apply_le_of_isEllipticMatrix (hEll x hxR) i j + simpa [Real.norm_eq_abs] using hentry + +/-- The total regular-field realization of a coarse source carrier. -/ +def coarseToRegular {d : ℕ} (a : Carrier d) : RegCoeffField d where + toFun := a + entry_measurable := a.2.1 + entry_locInt := by exact locallyIntegrable_coarse_entry a + +/-- The coarse-to-regular realization preserves every literal field value. -/ +@[simp] theorem coarseToRegular_apply {d : ℕ} (a : Carrier d) (x : Vec d) : + coarseToRegular a x = a x := + rfl + +private theorem entryTestR_coarseToRegular_eq_bilinearTest {d : ℕ} + (i j : Fin d) (φ : Vec d → ℝ) (a : Carrier d) : + entryTestR i j φ (coarseToRegular a) = + bilinearTest (Pi.single j 1) (Pi.single i 1) φ a := by + unfold entryTestR bilinearTest + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [vecDot, matVecMul, Pi.single_apply] + +private noncomputable def regularBilinearTest {d : ℕ} (e e' : Vec d) + (φ : Vec d → ℝ) (a : RegCoeffField d) : ℝ := + ∫ x, vecDot e' (matVecMul (a x) e) * φ x ∂volume + +private theorem regularBilinearTest_eq_sum_entryTestR {d : ℕ} + (e e' : Vec d) (φ : Vec d → ℝ) (hφ : SmoothCompactProbe φ) + (a : RegCoeffField d) : + regularBilinearTest e e' φ a = + ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a := by + have hprobe : IsProbeR φ := IsProbeR.of_smooth hφ.smooth hφ.compact + have hpoint : ∀ x : Vec d, + vecDot e' (matVecMul (a x) e) * φ x = + ∑ i, ∑ j, (e' i * e j) * (a x i j * φ x) := by + intro x + unfold vecDot matVecMul + rw [Finset.sum_mul] + apply Finset.sum_congr rfl + intro i _ + rw [Finset.mul_sum, Finset.sum_mul] + apply Finset.sum_congr rfl + intro j _ + ring + unfold regularBilinearTest + simp_rw [hpoint] + rw [integral_finsetSum] + · apply Finset.sum_congr rfl + intro i _ + rw [integral_finsetSum] + · apply Finset.sum_congr rfl + intro j _ + rw [integral_const_mul] + rfl + · intro j _ + exact (integrable_entry_mul_probe i j hprobe a).const_mul (e' i * e j) + · intro i _ + apply integrable_finsetSum + intro j _ + exact (integrable_entry_mul_probe i j hprobe a).const_mul (e' i * e j) + +private theorem measurable_regularBilinearTest_smooth {d : ℕ} {U : Set (Vec d)} + (e e' : Vec d) (φ : Vec d → ℝ) (hφ : SmoothCompactProbe φ) + (hφU : tsupport φ ⊆ U) : + @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR U) _ + (regularBilinearTest e e' φ) := by + have hentry : ∀ i j : Fin d, + @Measurable (RegCoeffField d) ℝ (SmoothLocalSigmaR U) _ (entryTestR i j φ) := by + intro i j t ht + exact MeasurableSpace.measurableSet_generateFrom + ⟨i, j, φ, hφ.smooth, hφ.compact, hφU, t, ht, rfl⟩ + have hfun : regularBilinearTest e e' φ = + fun a => ∑ i, ∑ j, (e' i * e j) * entryTestR i j φ a := by + funext a + exact regularBilinearTest_eq_sum_entryTestR e e' φ hφ a + rw [hfun] + refine Finset.measurable_sum (s := Finset.univ) (f := fun i => + fun a => ∑ j, (e' i * e j) * entryTestR i j φ a) ?_ + intro i _ + refine Finset.measurable_sum (s := Finset.univ) (f := fun j => + fun a => (e' i * e j) * entryTestR i j φ a) ?_ + intro j _ + exact (hentry i j).const_mul (e' i * e j) + +/-- The coarse-to-regular realization is measurable from coarse local integral +information into the smooth regular local integral sigma algebra. -/ +theorem measurable_coarseToRegular_smoothLocal {d : ℕ} (U : Set (Vec d)) + (hU : MeasurableSet U) : + @Measurable (Carrier d) (RegCoeffField d) (localSigma U hU) + (SmoothLocalSigmaR U) coarseToRegular := by + let : MeasurableSpace (Carrier d) := localSigma U hU + let : MeasurableSpace (RegCoeffField d) := SmoothLocalSigmaR U + apply measurable_generateFrom + rintro s ⟨i, j, φ, hφsmooth, hφcompact, hφU, ⟨t, ht, rfl⟩⟩ + change MeasurableSet ((fun a : Carrier d => entryTestR i j φ (coarseToRegular a)) ⁻¹' t) + have hfun : (fun a : Carrier d => entryTestR i j φ (coarseToRegular a)) = + bilinearTest (Pi.single j 1) (Pi.single i 1) φ := by + funext a + exact entryTestR_coarseToRegular_eq_bilinearTest i j φ a + rw [hfun] + exact MeasurableSpace.measurableSet_generateFrom + ⟨Pi.single j 1, Pi.single i 1, φ, ⟨hφsmooth, hφcompact⟩, hφU, t, ht, rfl⟩ + +/-- The coarse local integral sigma algebra is exactly the pullback of the +smooth compact-support integral sigma algebra on regular coefficient fields. -/ +theorem coarseLocalSigma_eq_comap_smoothLocalSigmaR {d : ℕ} (U : Set (Vec d)) + (hU : MeasurableSet U) : + localSigma U hU = + MeasurableSpace.comap coarseToRegular (SmoothLocalSigmaR U) := by + apply le_antisymm + · refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨e, e', φ, hφ, hφU, t, ht, rfl⟩ + let q : Set (RegCoeffField d) := regularBilinearTest e e' φ ⁻¹' t + have hq : @MeasurableSet (RegCoeffField d) (SmoothLocalSigmaR U) q := + measurable_regularBilinearTest_smooth e e' φ hφ hφU ht + have hfun : bilinearTest e e' φ = regularBilinearTest e e' φ ∘ coarseToRegular := by + funext a + rfl + rw [hfun] + exact MeasurableSpace.measurableSet_comap.mpr ⟨q, hq, rfl⟩ + · exact (measurable_coarseToRegular_smoothLocal U hU).comap_le + +/-- The global coarse integral sigma algebra is the pullback of the global +smooth regular integral sigma algebra. -/ +theorem globalSigma_eq_comap_smoothGlobalSigmaR (d : ℕ) : + globalSigma d = + MeasurableSpace.comap coarseToRegular (SmoothGlobalSigmaR d) := by + simpa [globalSigma, SmoothGlobalSigmaR] using + coarseLocalSigma_eq_comap_smoothLocalSigmaR (d := d) Set.univ MeasurableSet.univ + +/-- The coarse-to-regular realization is measurable for the global smooth +integral sigma algebras. -/ +theorem measurable_coarseToRegular_smoothGlobal {d : ℕ} : + @Measurable (Carrier d) (RegCoeffField d) (globalSigma d) + (SmoothGlobalSigmaR d) coarseToRegular := by + simpa [globalSigma, SmoothGlobalSigmaR] using! + measurable_coarseToRegular_smoothLocal (d := d) Set.univ MeasurableSet.univ + +/-- Coarse local integral information is measurable in the pullback of the +existing enriched regular local sigma algebra. -/ +theorem coarseLocalSigma_le_comap_localSigmaR {d : ℕ} (U : Set (Vec d)) + (hU : MeasurableSet U) : + localSigma U hU ≤ MeasurableSpace.comap coarseToRegular (LocalSigmaR U) := by + rw [coarseLocalSigma_eq_comap_smoothLocalSigmaR U hU] + exact MeasurableSpace.comap_mono (smoothLocalSigmaR_le_localSigmaR U) + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RescaledLaws.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RescaledLaws.lean new file mode 100644 index 0000000000..cc4f4b29dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/RescaledLaws.lean @@ -0,0 +1,161 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Scaling + +/-! +# Triadically rescaled exact coarse-source laws + +The normalized source law is the pushforward by the exact carrier rescaling +`a ↦ (x ↦ a (3^k x))`. +-/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory + +/-- Scale-normalize an exact coarse-source law by triadic rescaling. -/ +noncomputable def scaleNormalizedLaw {d : ℕ} (k : ℕ) (P : Measure (Carrier d)) : + Measure (Carrier d) := + Measure.map (Carrier.rescale k) P + +/-- Triadic scale-normalization preserves probability laws. -/ +theorem isProbabilityMeasure_scaleNormalizedLaw {d : ℕ} (k : ℕ) (P : Measure (Carrier d)) + [IsProbabilityMeasure P] : + IsProbabilityMeasure (scaleNormalizedLaw k P) := by + unfold scaleNormalizedLaw + infer_instance + +private theorem indep_map_measurableEquiv + {α β : Type*} [mα : MeasurableSpace α] [mβ : MeasurableSpace β] + {μ : Measure α} (e : α ≃ᵐ β) {m1 m2 : MeasurableSpace β} + (h : @ProbabilityTheory.Indep α + (MeasurableSpace.comap (fun x : α => e x) m1) + (MeasurableSpace.comap (fun x : α => e x) m2) mα μ) : + @ProbabilityTheory.Indep β m1 m2 mβ + (@Measure.map α β mα mβ (fun x : α => e x) μ) := by + refine (ProbabilityTheory.Indep_iff + (m₁ := m1) (m₂ := m2) (_mΩ := mβ) + (μ := (@Measure.map α β mα mβ (fun x : α => e x) μ))).2 ?_ + intro s t hs ht + have hemb : @MeasurableEmbedding α β mα mβ (fun x : α => e x) := by + exact @MeasurableEquiv.measurableEmbedding α β mα mβ e + have hIndep := (ProbabilityTheory.Indep_iff + (m₁ := MeasurableSpace.comap (fun x : α => e x) m1) + (m₂ := MeasurableSpace.comap (fun x : α => e x) m2) + (_mΩ := mα) (μ := μ)).1 h + have hsPre : @MeasurableSet α + (MeasurableSpace.comap (fun x : α => e x) m1) + ((fun x : α => e x) ⁻¹' s) := + ⟨s, hs, rfl⟩ + have htPre : @MeasurableSet α + (MeasurableSpace.comap (fun x : α => e x) m2) + ((fun x : α => e x) ⁻¹' t) := + ⟨t, ht, rfl⟩ + have hst := hIndep ((fun x : α => e x) ⁻¹' s) + ((fun x : α => e x) ⁻¹' t) hsPre htPre + have hmapInter : + (@Measure.map α β mα mβ (fun x : α => e x) μ) (s ∩ t) = + μ ((fun x : α => e x) ⁻¹' (s ∩ t)) := + @MeasurableEmbedding.map_apply α β mα mβ + (fun x : α => e x) hemb μ (s ∩ t) + have hmapS : + (@Measure.map α β mα mβ (fun x : α => e x) μ) s = + μ ((fun x : α => e x) ⁻¹' s) := + @MeasurableEmbedding.map_apply α β mα mβ (fun x : α => e x) hemb μ s + have hmapT : + (@Measure.map α β mα mβ (fun x : α => e x) μ) t = + μ ((fun x : α => e x) ⁻¹' t) := + @MeasurableEmbedding.map_apply α β mα mβ (fun x : α => e x) hemb μ t + calc + (@Measure.map α β mα mβ (fun x : α => e x) μ) (s ∩ t) + = μ ((fun x : α => e x) ⁻¹' (s ∩ t)) := hmapInter + _ = μ (((fun x : α => e x) ⁻¹' s) ∩ ((fun x : α => e x) ⁻¹' t)) := rfl + _ = μ ((fun x : α => e x) ⁻¹' s) * μ ((fun x : α => e x) ⁻¹' t) := hst + _ = (@Measure.map α β mα mβ (fun x : α => e x) μ) s * + (@Measure.map α β mα mβ (fun x : α => e x) μ) t := by + rw [hmapS, hmapT] + +namespace IsStationary + +/-- Exact source stationarity is preserved by triadic scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : Measure (Carrier d)} + (hP : IsStationary P) (k : ℕ) : + IsStationary (scaleNormalizedLaw k P) := by + intro z + rw [scaleNormalizedLaw, + Measure.map_map (measurable_translate_globalSigma z) (measurable_rescale_globalSigma k), + Carrier.translate_comp_rescale k z, + ← Measure.map_map (measurable_rescale_globalSigma k) + (measurable_translate_globalSigma (triadicScaleIntShift k z)), + hP (triadicScaleIntShift k z)] + +end IsStationary + +namespace IsUnitRangeDependent + +/-- Exact source unit-range dependence is preserved by triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : Measure (Carrier d)} + (hP : IsUnitRangeDependent P) (k : ℕ) : + IsUnitRangeDependent (scaleNormalizedLaw k P) := by + intro U V hU hV hUV + let hDU : MeasurableSet (triadicDilateSet k U) := + measurableSet_triadicDilateSet k hU + let hDV : MeasurableSet (triadicDilateSet k V) := + measurableSet_triadicDilateSet k hV + let e := Carrier.rescaleMeasurableEquiv (d := d) k + have hIndepDilated : ProbabilityTheory.Indep + (localSigma (triadicDilateSet k U) hDU) + (localSigma (triadicDilateSet k V) hDV) P := + hP (triadicDilateSet k U) (triadicDilateSet k V) hDU hDV + (EuclideanUnitSeparated.triadicDilateSet hUV k) + have hUle : MeasurableSpace.comap + (fun a : Carrier d => Carrier.rescale k a) (localSigma U hU) ≤ + localSigma (triadicDilateSet k U) hDU := by + simpa [hDU] using (measurable_rescale_localSigma (d := d) k U hU).comap_le + have hVle : MeasurableSpace.comap + (fun a : Carrier d => Carrier.rescale k a) (localSigma V hV) ≤ + localSigma (triadicDilateSet k V) hDV := by + simpa [hDV] using (measurable_rescale_localSigma (d := d) k V hV).comap_le + have hComap : ProbabilityTheory.Indep + (MeasurableSpace.comap (fun a : Carrier d => Carrier.rescale k a) (localSigma U hU)) + (MeasurableSpace.comap (fun a : Carrier d => Carrier.rescale k a) (localSigma V hV)) P := + ProbabilityTheory.indep_of_indep_of_le_right + (ProbabilityTheory.indep_of_indep_of_le_left hIndepDilated hUle) hVle + have hMap := indep_map_measurableEquiv (μ := P) e hComap + simpa [scaleNormalizedLaw, e] using! hMap + +end IsUnitRangeDependent + +namespace IsIsotropicAndAdjointInvariant + +/-- Exact source isotropy and adjoint invariance are preserved by triadic +scale-normalization. -/ +theorem scaleNormalized {d : ℕ} {P : Measure (Carrier d)} + (hP : IsIsotropicAndAdjointInvariant P) (k : ℕ) : + IsIsotropicAndAdjointInvariant (scaleNormalizedLaw k P) := by + constructor + · intro R hR + rw [scaleNormalizedLaw, + Measure.map_map (measurable_rotate_globalSigma R hR) (measurable_rescale_globalSigma k), + Carrier.rotate_comp_rescale R hR k, + ← Measure.map_map (measurable_rescale_globalSigma k) + (measurable_rotate_globalSigma R hR), + hP.1 R hR] + · rw [scaleNormalizedLaw, + Measure.map_map measurable_adjoint_globalSigma (measurable_rescale_globalSigma k), + Carrier.adjoint_comp_rescale k, + ← Measure.map_map (measurable_rescale_globalSigma k) measurable_adjoint_globalSigma, + hP.2] + +end IsIsotropicAndAdjointInvariant + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Scaling.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Scaling.lean new file mode 100644 index 0000000000..1644f1898f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Scaling.lean @@ -0,0 +1,362 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse.Laws +public import LeanPool.CoarseGraining.Homogenization.Probability.RescaledLaw + +/-! +# Triadic scaling of the exact coarse source carrier + +This module keeps the source-side rescaling kernel independent of the regular +carrier. The normalized action is the pullback `a ↦ (x ↦ a (3^k x))`; hence a +local observable on `U` pulls back to information on `3^k U`. +-/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory +open scoped Pointwise + +theorem euclideanNorm_triadicDilateVec {d : ℕ} (k : ℕ) (x : Vec d) : + euclideanNorm (triadicDilateVec k x) = (3 : ℝ) ^ k * euclideanNorm x := by + have hk : 0 ≤ (3 : ℝ) ^ k := by positivity + change euclideanNorm ((3 : ℝ) ^ k • x) = (3 : ℝ) ^ k * euclideanNorm x + rw [Homogenization.euclideanNorm_smul, abs_of_nonneg hk] + +/-- Precomposition by a positive scalar is an exact coarse-source carrier +endomorphism. -/ +noncomputable def Carrier.smul {d : ℕ} (r : ℝ) (hr : 0 < r) (a : Carrier d) : + Carrier d where + val := fun x => a (r • x) + property := by + constructor + · intro i j + exact (a.2.1 i j).comp (measurable_id.const_smul r) + · intro R hR + let S : ℝ := max 1 (r * R) + have hS : 1 ≤ S := le_max_left _ _ + obtain ⟨ε, hε, hεone, hEll⟩ := a.2.2 S hS + refine ⟨ε, hε, hεone, ?_⟩ + intro x hx + apply hEll (r • x) + change euclideanNorm (r • x) < S + rw [Homogenization.euclideanNorm_smul, abs_of_pos hr] + apply lt_of_lt_of_le (mul_lt_mul_of_pos_left hx hr) + exact le_max_right _ _ + +@[simp] theorem Carrier.smul_apply {d : ℕ} (r : ℝ) (hr : 0 < r) + (a : Carrier d) (x : Vec d) : + Carrier.smul r hr a x = a (r • x) := + rfl + +/-- Exact-source triadic rescaling, with normalized coordinates `x ↦ 3^k x`. -/ +noncomputable def Carrier.rescale {d : ℕ} (k : ℕ) : Carrier d → Carrier d := + Carrier.smul ((3 : ℝ) ^ k) (by positivity) + +@[simp] theorem Carrier.rescale_apply {d : ℕ} (k : ℕ) (a : Carrier d) (x : Vec d) : + Carrier.rescale k a x = a (triadicDilateVec k x) := by + change a (((3 : ℝ) ^ k) • x) = a (triadicDilateVec k x) + congr 1 + +/-- The positive-scale inverse of source triadic rescaling. -/ +noncomputable def Carrier.dilateNat {d : ℕ} (k : ℕ) : Carrier d → Carrier d := + Carrier.smul (((3 : ℝ) ^ k)⁻¹) (inv_pos.mpr (by positivity)) + +@[simp] theorem Carrier.dilateNat_apply {d : ℕ} (k : ℕ) (a : Carrier d) (x : Vec d) : + Carrier.dilateNat k a x = a (((3 : ℝ) ^ k)⁻¹ • x) := + rfl + +private theorem Carrier.smul_dilateNat_rescale {d : ℕ} (k : ℕ) (a : Carrier d) : + Carrier.dilateNat k (Carrier.rescale k a) = a := by + apply Subtype.ext + funext x i j + have hk : ((3 : ℝ) ^ k) ≠ 0 := by positivity + simp only [Carrier.dilateNat, Carrier.rescale, Carrier.smul_apply] + rw [smul_smul, mul_inv_cancel₀ hk, one_smul] + +private theorem Carrier.smul_rescale_dilateNat {d : ℕ} (k : ℕ) (a : Carrier d) : + Carrier.rescale k (Carrier.dilateNat k a) = a := by + apply Subtype.ext + funext x i j + have hk : ((3 : ℝ) ^ k) ≠ 0 := by positivity + simp only [Carrier.dilateNat, Carrier.rescale, Carrier.smul_apply] + rw [smul_smul, inv_mul_cancel₀ hk, one_smul] + +private theorem smoothCompactProbe_inv_smul {d : ℕ} {r : ℝ} (hr : 0 < r) + {φ : Vec d → ℝ} (hφ : SmoothCompactProbe φ) : + SmoothCompactProbe (fun y => φ (r⁻¹ • y)) := by + constructor + · simpa [Function.comp_def] using + hφ.smooth.comp (contDiff_const_smul r⁻¹) + · show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero r⁻¹ (inv_ne_zero hr.ne')) + simpa [Function.comp_def] using + hφ.compact.comp_homeomorph (Homeomorph.smulOfNeZero r⁻¹ (inv_ne_zero hr.ne')) + +private theorem tsupport_inv_smul_subset_smul {d : ℕ} {r : ℝ} (hr : 0 < r) + {U : Set (Vec d)} {φ : Vec d → ℝ} (hφU : tsupport φ ⊆ U) : + tsupport (fun y => φ (r⁻¹ • y)) ⊆ r • U := by + intro y hy + have hy' : r⁻¹ • y ∈ tsupport φ := by + rw [show (fun y : Vec d => φ (r⁻¹ • y)) = + φ ∘ Homeomorph.smulOfNeZero r⁻¹ (inv_ne_zero hr.ne') by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero r⁻¹ (inv_ne_zero hr.ne'))] at hy + exact hy + refine ⟨r⁻¹ • y, hφU hy', ?_⟩ + change r • (r⁻¹ • y) = y + rw [smul_smul, mul_inv_cancel₀ hr.ne', one_smul] + +private theorem bilinearTest_smul {d : ℕ} (r : ℝ) (hr : 0 < r) + (e e' : Vec d) (φ : Vec d → ℝ) (a : Carrier d) : + bilinearTest e e' φ (Carrier.smul r hr a) = + (r ^ d)⁻¹ * bilinearTest e e' (fun y => φ (r⁻¹ • y)) a := by + let f : Vec d → ℝ := fun y => + vecDot e' (matVecMul (a y) e) * φ (r⁻¹ • y) + have hcv : + ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂volume = + (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := volume) (f := f) (s := Set.univ) hr) + have huniv : r • (Set.univ : Set (Vec d)) = Set.univ := by + ext y + constructor + · intro _ + trivial + · intro _ + refine ⟨r⁻¹ • y, trivial, ?_⟩ + change r • (r⁻¹ • y) = y + rw [smul_smul, mul_inv_cancel₀ hr.ne', one_smul] + unfold bilinearTest + calc + ∫ x, (vecDot e' (matVecMul (Carrier.smul r hr a x) e) * φ x) ∂volume = + ∫ x, f (r • x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + rw [Carrier.smul_apply] + have hback : r⁻¹ • (r • x) = x := by + rw [smul_smul, inv_mul_cancel₀ hr.ne', one_smul] + simp only [f, hback] + _ = ∫ x in (Set.univ : Set (Vec d)), f (r • x) ∂volume := by simp + _ = (r ^ d)⁻¹ • ∫ y in r • (Set.univ : Set (Vec d)), f y ∂volume := hcv + _ = (r ^ d)⁻¹ * ∫ y, vecDot e' (matVecMul (a y) e) * φ (r⁻¹ • y) ∂volume := by + simp [f, huniv] + +theorem bilinearTest_rescale {d : ℕ} (k : ℕ) (e e' : Vec d) + (φ : Vec d → ℝ) (a : Carrier d) : + bilinearTest e e' φ (Carrier.rescale k a) = + (((3 : ℝ) ^ k) ^ d)⁻¹ * + bilinearTest e e' (fun y => φ (((3 : ℝ) ^ k)⁻¹ • y)) a := by + exact bilinearTest_smul ((3 : ℝ) ^ k) (by positivity) e e' φ a + +theorem measurableSet_triadicDilateSet {d : ℕ} (k : ℕ) {U : Set (Vec d)} + (hU : MeasurableSet U) : MeasurableSet (triadicDilateSet k U) := by + have hk : ((3 : ℝ) ^ k) ≠ 0 := by positivity + have hInv : Measurable (fun x : Vec d => ((3 : ℝ) ^ k)⁻¹ • x) := by + exact measurable_pi_lambda (fun i => (measurable_pi_apply i).const_mul _) + have hset : triadicDilateSet k U = + (fun x : Vec d => ((3 : ℝ) ^ k)⁻¹ • x) ⁻¹' U := by + ext x + constructor + · rintro ⟨y, hy, rfl⟩ + change ((3 : ℝ) ^ k)⁻¹ • triadicDilateVec k y ∈ U + have hback : ((3 : ℝ) ^ k)⁻¹ • triadicDilateVec k y = y := by + change ((3 : ℝ) ^ k)⁻¹ • (((3 : ℝ) ^ k) • y) = y + rw [smul_smul, inv_mul_cancel₀ hk, one_smul] + rwa [hback] + · intro hx + refine ⟨((3 : ℝ) ^ k)⁻¹ • x, hx, ?_⟩ + change x = ((3 : ℝ) ^ k) • (((3 : ℝ) ^ k)⁻¹ • x) + rw [smul_smul, mul_inv_cancel₀ hk, one_smul] + rw [hset] + exact hU.preimage hInv + +private theorem smoothCompactProbe_rescale {d : ℕ} (k : ℕ) {φ : Vec d → ℝ} + (hφ : SmoothCompactProbe φ) : + SmoothCompactProbe (fun y => φ (((3 : ℝ) ^ k)⁻¹ • y)) := + smoothCompactProbe_inv_smul (by positivity) hφ + +private theorem tsupport_rescale_subset_triadicDilateSet {d : ℕ} (k : ℕ) + {U : Set (Vec d)} {φ : Vec d → ℝ} (hφU : tsupport φ ⊆ U) : + tsupport (fun y => φ (((3 : ℝ) ^ k)⁻¹ • y)) ⊆ triadicDilateSet k U := by + intro y hy + rcases tsupport_inv_smul_subset_smul (r := (3 : ℝ) ^ k) (by positivity) hφU hy + with ⟨x, hx, rfl⟩ + refine ⟨x, hx, ?_⟩ + change ((3 : ℝ) ^ k) • x = triadicDilateVec k x + congr 1 + +private theorem triadicDilateSet_univ {d : ℕ} (k : ℕ) : + triadicDilateSet (d := d) k Set.univ = Set.univ := by + ext x + constructor + · intro _ + trivial + · intro _ + refine ⟨((3 : ℝ) ^ k)⁻¹ • x, trivial, ?_⟩ + change x = ((3 : ℝ) ^ k) • (((3 : ℝ) ^ k)⁻¹ • x) + rw [smul_smul, mul_inv_cancel₀ (by positivity : ((3 : ℝ) ^ k) ≠ 0), one_smul] + +private theorem localSigma_eq_of_eq {d : ℕ} {U V : Set (Vec d)} (h : U = V) + (hU : MeasurableSet U) (hV : MeasurableSet V) : + localSigma U hU = localSigma V hV := by + cases h + rfl + +theorem measurable_rescale_localSigma {d : ℕ} (k : ℕ) (U : Set (Vec d)) + (hU : MeasurableSet U) : + @Measurable (Carrier d) (Carrier d) + (localSigma (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) + (localSigma U hU) + (Carrier.rescale k) := by + rw [measurable_iff_comap_le, localSigma, localSigma, + MeasurableSpace.comap_generateFrom] + apply MeasurableSpace.generateFrom_le + rintro s ⟨t, ⟨e, e', φ, hφ, hφU, q, hq, rfl⟩, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (((3 : ℝ) ^ k)⁻¹ • y) + let c : ℝ := (((3 : ℝ) ^ k) ^ d)⁻¹ + let q' : Set ℝ := (fun z : ℝ => c * z) ⁻¹' q + have hq' : MeasurableSet q' := + hq.preimage ((continuous_const.mul continuous_id).measurable) + have htest : (fun a : Carrier d => bilinearTest e e' φ (Carrier.rescale k a)) = + fun a => c * bilinearTest e e' ψ a := by + funext a + exact bilinearTest_rescale k e e' φ a + change @MeasurableSet (Carrier d) + (localSigma (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) + ((fun a : Carrier d => bilinearTest e e' φ (Carrier.rescale k a)) ⁻¹' q) + rw [htest] + change @MeasurableSet (Carrier d) + (localSigma (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU)) + (bilinearTest e e' ψ ⁻¹' q') + let : MeasurableSpace (Carrier d) := + localSigma (triadicDilateSet k U) (measurableSet_triadicDilateSet k hU) + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨e, e', ψ, smoothCompactProbe_rescale k hφ, + tsupport_rescale_subset_triadicDilateSet k hφU, q', hq', rfl⟩ + +theorem measurable_rescale_globalSigma {d : ℕ} (k : ℕ) : + Measurable (Carrier.rescale (d := d) k) := by + change @Measurable (Carrier d) (Carrier d) + (localSigma Set.univ MeasurableSet.univ) (localSigma Set.univ MeasurableSet.univ) + (Carrier.rescale k) + have heq : localSigma (triadicDilateSet k Set.univ) + (measurableSet_triadicDilateSet k MeasurableSet.univ) + = localSigma Set.univ MeasurableSet.univ := + localSigma_eq_of_eq (triadicDilateSet_univ (d := d) k) _ _ + exact heq ▸ measurable_rescale_localSigma (d := d) k Set.univ MeasurableSet.univ + +private theorem measurable_smul_globalSigma {d : ℕ} (r : ℝ) (hr : 0 < r) : + Measurable (Carrier.smul (d := d) r hr) := by + apply measurable_generateFrom + rintro s ⟨e, e', φ, hφ, _hφU, q, hq, rfl⟩ + let ψ : Vec d → ℝ := fun y => φ (r⁻¹ • y) + let c : ℝ := (r ^ d)⁻¹ + let q' : Set ℝ := (fun z : ℝ => c * z) ⁻¹' q + have hq' : MeasurableSet q' := + hq.preimage ((continuous_const.mul continuous_id).measurable) + have htest : (fun a : Carrier d => bilinearTest e e' φ (Carrier.smul r hr a)) = + fun a => c * bilinearTest e e' ψ a := by + funext a + exact bilinearTest_smul r hr e e' φ a + change MeasurableSet + ((fun a : Carrier d => bilinearTest e e' φ (Carrier.smul r hr a)) ⁻¹' q) + rw [htest] + change MeasurableSet (bilinearTest e e' ψ ⁻¹' q') + apply MeasurableSpace.measurableSet_generateFrom + exact ⟨e, e', ψ, smoothCompactProbe_inv_smul hr hφ, Set.subset_univ _, q', hq', rfl⟩ + +theorem measurable_dilateNat_globalSigma {d : ℕ} (k : ℕ) : + Measurable (Carrier.dilateNat (d := d) k) := + measurable_smul_globalSigma _ (inv_pos.mpr (by positivity)) + +noncomputable def Carrier.rescaleMeasurableEquiv {d : ℕ} (k : ℕ) : + Carrier d ≃ᵐ Carrier d where + toEquiv := + { toFun := Carrier.rescale k + invFun := Carrier.dilateNat k + left_inv := by exact Carrier.smul_dilateNat_rescale k + right_inv := by exact Carrier.smul_rescale_dilateNat k } + measurable_toFun := measurable_rescale_globalSigma k + measurable_invFun := measurable_dilateNat_globalSigma k + +theorem Carrier.translate_comp_rescale {d : ℕ} (k : ℕ) (z : Fin d → ℤ) : + Carrier.translate z ∘ Carrier.rescale k = + Carrier.rescale k ∘ Carrier.translate (triadicScaleIntShift k z) := by + funext a + apply Subtype.ext + funext x i j + change Carrier.translate z (Carrier.rescale k a) x i j = + Carrier.rescale k (Carrier.translate (triadicScaleIntShift k z) a) x i j + rw [Carrier.translate_apply, Carrier.rescale_apply] + rw [Carrier.rescale_apply, Carrier.translate_apply] + have hvec : triadicDilateVec k (x + intVecToRealVec z) = + triadicDilateVec k x + intVecToRealVec (triadicScaleIntShift k z) := by + ext l + simp only [triadicDilateVec, triadicScaleIntShift, intVecToRealVec, Pi.add_apply] + push_cast + ring + rw [hvec] + +theorem Carrier.rotate_comp_rescale {d : ℕ} (R : Mat d) + (hR : IsSignedPermutationMatrix R) (k : ℕ) : + Carrier.rotate R hR ∘ Carrier.rescale k = + Carrier.rescale k ∘ Carrier.rotate R hR := by + funext a + apply Subtype.ext + funext x i j + change Carrier.rotate R hR (Carrier.rescale k a) x i j = + Carrier.rescale k (Carrier.rotate R hR a) x i j + rw [Carrier.rotate_apply, Carrier.rescale_apply] + rw [Carrier.rescale_apply, Carrier.rotate_apply] + have hcomm : triadicDilateVec k (matVecMul R x) = + matVecMul R (triadicDilateVec k x) := by + change ((3 : ℝ) ^ k) • matVecMul R x = + matVecMul R (((3 : ℝ) ^ k) • x) + rw [matVecMul_smul] + rw [hcomm] + +theorem Carrier.adjoint_comp_rescale {d : ℕ} (k : ℕ) : + Carrier.adjoint ∘ Carrier.rescale (d := d) k = + Carrier.rescale k ∘ Carrier.adjoint := by + funext a + apply Subtype.ext + funext x i j + change Carrier.adjoint (Carrier.rescale k a) x i j = + Carrier.rescale k (Carrier.adjoint a) x i j + rw [Carrier.adjoint_apply, Carrier.rescale_apply] + rw [Carrier.rescale_apply, Carrier.adjoint_apply] + +theorem euclideanDist_triadicDilateVec {d : ℕ} (k : ℕ) (x y : Vec d) : + euclideanDist (triadicDilateVec k x) (triadicDilateVec k y) = + (3 : ℝ) ^ k * euclideanDist x y := by + unfold euclideanDist + have hsub : triadicDilateVec k x - triadicDilateVec k y = + triadicDilateVec k (x - y) := by + ext i + simp only [triadicDilateVec, Pi.sub_apply] + ring + rw [hsub, euclideanNorm_triadicDilateVec] + +theorem EuclideanUnitSeparated.triadicDilateSet {d : ℕ} {U V : Set (Vec d)} + (hUV : EuclideanUnitSeparated U V) (k : ℕ) : + EuclideanUnitSeparated (triadicDilateSet k U) (triadicDilateSet k V) := by + intro x y hx hy + rcases hx with ⟨x0, hx0, rfl⟩ + rcases hy with ⟨y0, hy0, rfl⟩ + rw [euclideanDist_triadicDilateVec] + have hsep : 1 ≤ euclideanDist x0 y0 := hUV hx0 hy0 + have hscale : 1 ≤ (3 : ℝ) ^ k := + one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + calc + 1 = (1 : ℝ) * 1 := by ring + _ ≤ (3 : ℝ) ^ k * euclideanDist x0 y0 := + mul_le_mul hscale hsep zero_le_one (by positivity) + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Semantics.lean b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Semantics.lean new file mode 100644 index 0000000000..dd488f7c1e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Probability/Source/Coarse/Semantics.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.Source.Coarse + +/-! +# Null-set semantics of the integral-local σ-algebra + +The coarse source's `localSigma` is generated by integral observables. This +leaf module records the resulting null-set semantics without changing the +foundational definition in `Coarse.lean`. +-/ + +@[expose] public section + +namespace Homogenization.Source.Coarse + +open MeasureTheory + +noncomputable section + +/-- On a volume-null measurable set, every integral generator of `localSigma` +is constant, so the integral-local σ-algebra is bottom. -/ +theorem localSigma_eq_bot_of_volume_eq_zero {d : ℕ} {U : Set (Vec d)} + (hU : MeasurableSet U) (hvol : volume U = 0) : + localSigma U hU = ⊥ := by + apply le_antisymm + · unfold localSigma + refine MeasurableSpace.generateFrom_le ?_ + rintro s ⟨e, e', φ, hφ, hφU, t, ht, rfl⟩ + have hφ_zero : φ =ᵐ[volume] 0 := by + change ∀ᵐ x ∂volume, φ x = 0 + rw [ae_iff] + apply measure_mono_null ?_ hvol + intro x hx + exact hφU (subset_tsupport _ hx) + have htest_zero : ∀ a : Carrier d, bilinearTest e e' φ a = 0 := by + intro a + unfold bilinearTest + apply integral_eq_zero_of_ae + filter_upwards [hφ_zero] with x hx + simp [hx] + by_cases ht0 : (0 : ℝ) ∈ t + · rw [MeasurableSpace.measurableSet_bot_iff] + right + ext a + simp [htest_zero a, ht0] + · rw [MeasurableSpace.measurableSet_bot_iff] + left + ext a + simp [htest_zero a, ht0] + · exact bot_le + +/-- Integral-local singleton information is trivial, while restriction point +evaluation remains observable: a singleton has bottom `localSigma`. -/ +theorem localSigma_singleton_eq_bot {d : ℕ} [NeZero d] (x : Vec d) : + localSigma ({x} : Set (Vec d)) (MeasurableSet.singleton x) = ⊥ := + localSigma_eq_bot_of_volume_eq_zero (MeasurableSet.singleton x) + (measure_singleton x) + +end + +end Homogenization.Source.Coarse diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev.lean new file mode 100644 index 0000000000..239fe4d7d1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev.lean @@ -0,0 +1,36 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NegativeSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalExact +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2OriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.SmoothCompactSupport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding.lean new file mode 100644 index 0000000000..a88ff1b545 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding.lean @@ -0,0 +1,68 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient + +/-! # Cube Embedding -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators + +/-! +# The cube Sobolev embedding + +The single theorem below, `cube_sobolev_embedding`, is the cube Sobolev +embedding at the critical exponent `2* = 2d/(d−2)`, stated against the ambient +`H1Function` / `volumeMeasureOn` / `axisCube` types and proved via +`cubeSobolevEmbedding`. + +For `u ∈ H¹(U)` on an open axis cube `U = axisCube z L` (no boundary vanishing +assumed), the route is: even-reflection extension across each face, a smooth +cutoff to compact support inside the tripled box, mathlib's +Gagliardo–Nirenberg–Sobolev inequality on each smooth compactly supported +approximant, and passage to the limit, with the reflection/cutoff constants and +the `L⁻¹` factor collected into a single dimensional constant. + +Norms are in `eLpNorm` house style against `volumeMeasureOn U`, critical +exponent `twoStar d = 2d/(d−2)`, and gradient term the sum of the coordinate +`L²` norms `∑ i ‖∂ᵢu‖_{L²(U)}`. +-/ + +noncomputable section + +/-- **E1 (cube Sobolev embedding, critical exponent `2* = 2d/(d−2)`).** + +For `d ≥ 3` there is a constant `C = C(d) > 0` such that for every open axis cube +`U = axisCube z L` of side `L > 0` and every `u ∈ H¹(U)` (the library's `H1Function U`, no +boundary vanishing), +`‖u‖_{L^{2*}(U)} ≤ C (‖∇u‖_{L²(U)} + L⁻¹ ‖u‖_{L²(U)})`, +with `‖u‖_{L^{2*}(U)} = eLpNorm u.toFun (twoStar d) (volumeMeasureOn U)` and the +gradient term the sum of the coordinate `L²(U)` norms of `u.grad`. + +Proved via `cubeSobolevEmbedding` (`CubeEmbedding/Limit.lean`). -/ +theorem cube_sobolev_embedding {d : ℕ} (hd : 3 ≤ d) : + ∃ C : ℝ≥0, 0 < C ∧ + ∀ (z : Vec d) (L : ℝ), 0 < L → ∀ u : H1Function (axisCube z L), + eLpNorm u.toFun (twoStar d) (volumeMeasureOn (axisCube z L)) + ≤ (C : ℝ≥0∞) * + ((∑ i : Fin d, + eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ + * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))) := + cubeSobolevEmbedding hd + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Extension.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Extension.lean new file mode 100644 index 0000000000..b0f4b39f03 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Extension.lean @@ -0,0 +1,451 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.WeakGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero + +/-! # Extension -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization Homogenization.H1Function +open scoped ENNReal NNReal BigOperators Topology + +/-! +# Even-fold extension of an `H¹(box)` function + +Given `u ∈ H¹(Box lo hi)`, its even-fold extension `Eu (x) = u (Fold lo hi x)` +(with the signed folded gradient) is an `H¹(Box3 lo hi)` function whose `L²` +norms on the tripled box are controlled by `(3^d)^{1/2}` times the `L²` norms of +`u` on the base box, and which agrees with `u` a.e. on the base box. + +The construction feeds the globally smooth `convexApproxSmoothH1` approximants of +`u`, cut off to compact support, through the per-approximant fold weak-gradient +identity (`hasWeakPartialDerivOn_univ_foldComp`) and closes under `L²` limits +(`HasWeakGradientOn.of_tendsto_eLpNorm_two`); the norm transport is supplied by +`FoldNorm`. +-/ + +noncomputable section + +variable {d : ℕ} + +/-! ## Geometry of the base box -/ + +theorem isOpen_Box (lo hi : Vec d) : IsOpen (Box lo hi) := + isOpen_set_pi Set.finite_univ fun _ _ => isOpen_Ioo + +theorem isOpenBoundedConvexDomain_Box (lo hi : Vec d) : + IsOpenBoundedConvexDomain (Box lo hi) := by + refine ⟨isOpen_Box lo hi, ?_, ?_⟩ + · exact Homogenization.Bornology.IsBounded.isBoundedDomain <| + Bornology.IsBounded.pi fun _ => Metric.isBounded_Ioo _ _ + · exact convex_pi fun _ _ => convex_Ioo _ _ + +/-- The tripled box is the base box for the reflected corners. -/ +theorem Box3_eq_Box (lo hi : Vec d) : + Box3 lo hi = Box (fun k => 2 * lo k - hi k) (fun k => 2 * hi k - lo k) := rfl + +/-- The cutoff with half the cube side as margin is compactly supported in the tripled +box, equals one on the base box, and has coordinate derivatives bounded by `32 / L`. -/ +theorem boxCutoff_halfSide_properties (z hi : Vec d) (L : ℝ) (hL : 0 < L) + (hval : ∀ k, hi k = z k + L) : + HasCompactSupport (boxCutoff z hi (L / 2)) ∧ + (∀ x ∈ Box z hi, boxCutoff z hi (L / 2) x = 1) ∧ + tsupport (boxCutoff z hi (L / 2)) ⊆ Box3 z hi ∧ + (∀ x i, |fderiv ℝ (boxCutoff z hi (L / 2)) x (basisVec i)| ≤ 32 / L) := by + have hℓ : (0 : ℝ) < L / 2 := by linarith + set χ : Vec d → ℝ := boxCutoff z hi (L / 2) with hχ + have hχ_cptsupp : HasCompactSupport χ := by + apply HasCompactSupport.intro + (K := Set.Icc (fun k => z k - L / 2) (fun k => hi k + L / 2)) isCompact_Icc + intro x hx; exact boxCutoff_eq_zero hℓ hx + have hχ_one : ∀ x ∈ Box z hi, χ x = 1 := by + intro x hx + exact boxCutoff_eq_one hℓ (Set.mem_Icc.2 + ⟨fun k => (Set.mem_univ_pi.1 hx k).1.le, fun k => (Set.mem_univ_pi.1 hx k).2.le⟩) + have hχ_sub : tsupport χ ⊆ Box3 z hi := by + have hsupp : Function.support χ ⊆ Set.Icc (fun k => z k - L / 2) (fun k => hi k + L / 2) := + fun x hx => by by_contra hxn; exact hx (boxCutoff_eq_zero hℓ hxn) + refine (closure_minimal hsupp isClosed_Icc).trans ?_ + rw [Box3_eq_Box] + intro x hx + rw [Set.mem_Icc] at hx + refine Set.mem_univ_pi.2 fun k => ?_ + exact ⟨by have := hx.1 k; have := hval k; simp only [] at *; linarith, + by have := hx.2 k; have := hval k; simp only [] at *; linarith⟩ + have hχ_deriv : ∀ x i, |fderiv ℝ χ x (basisVec i)| ≤ 32 / L := by + intro x i + have := boxCutoff_deriv_bound (lo := z) (hi := hi) hℓ x i + have h2 : (16 : ℝ) / (L / 2) = 32 / L := by field_simp; ring + simpa [hχ, basisVec, h2] using this + exact ⟨hχ_cptsupp, hχ_one, hχ_sub, hχ_deriv⟩ + +/-- A concrete closed ball inside a nonempty base box. -/ +theorem exists_ball_subset_Box (lo hi : Vec d) (hlt : ∀ k, lo k < hi k) (hd : 0 < d) : + ∃ (x0 : Vec d) (r : ℝ), 0 < r ∧ Metric.closedBall x0 r ⊆ Box lo hi := by + have : Nonempty (Fin d) := ⟨⟨0, hd⟩⟩ + have hne : (Finset.univ : Finset (Fin d)).Nonempty := Finset.univ_nonempty + set m : ℝ := Finset.univ.inf' hne (fun k => hi k - lo k) with hm + have hm_pos : 0 < m := by + rw [hm, Finset.lt_inf'_iff hne] + exact fun k _ => by linarith [hlt k] + refine ⟨fun k => (lo k + hi k) / 2, m / 3, by linarith, ?_⟩ + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff (by linarith)] at hx + refine Set.mem_univ_pi.2 fun k => ?_ + have hxk : dist (x k) ((lo k + hi k) / 2) ≤ m / 3 := hx k + rw [Real.dist_eq, abs_le] at hxk + have hmk : m ≤ hi k - lo k := Finset.inf'_le _ (Finset.mem_univ k) + constructor <;> [skip; skip] <;> [nlinarith [hxk.1, hxk.2]; nlinarith [hxk.1, hxk.2]] + +/-! ## `eLpNorm` convergence of the smooth approximants -/ + +/-- Convergence in `L²(U)` of the `convexApproxSmoothH1` approximants, in the +`eLpNorm` form the closure lemma consumes. -/ +theorem tendsto_eLpNorm_convexApproxSmoothH1 {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) {x0 : Vec d} {r : ℝ} + (hr : 0 < r) (hball : Metric.closedBall x0 r ⊆ U) : + Filter.Tendsto + (fun n => eLpNorm + (fun x => (convexApproxSmoothH1 hU u x0 hr n).toFun x - u.toFun x) 2 + (volume.restrict U)) + Filter.atTop (nhds 0) := by + set ψ : ℕ → H1Function U := convexApproxSmoothH1 hU u x0 hr with hψ + have hedist : ∀ n, eLpNorm (fun x => (ψ n).toFun x - u.toFun x) 2 (volume.restrict U) + = edist (ψ n).toScalarL2 u.toScalarL2 := by + intro n + rw [MeasureTheory.Lp.edist_def] + refine (MeasureTheory.eLpNorm_congr_ae ?_).symm + filter_upwards [(ψ n).coeFn_toScalarL2, u.coeFn_toScalarL2] with x hu1 hu2 + simp [Pi.sub_apply, hu1, hu2] + have h1 : Filter.Tendsto (fun n => (ψ n).toScalarL2) Filter.atTop (nhds u.toScalarL2) := + tendsto_convexApproxSmoothH1_toScalarL2 hU u hball hr + have h2 : Filter.Tendsto (fun n => edist (ψ n).toScalarL2 u.toScalarL2) + Filter.atTop (nhds 0) := by + simpa using h1.edist (tendsto_const_nhds (x := u.toScalarL2)) + exact h2.congr (fun n => (hedist n).symm) + +/-- Convergence in `L²(U)` of the coordinate gradients of the approximants. -/ +theorem tendsto_eLpNorm_grad_convexApproxSmoothH1 {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) {x0 : Vec d} {r : ℝ} + (hr : 0 < r) (hball : Metric.closedBall x0 r ⊆ U) (i : Fin d) : + Filter.Tendsto + (fun n => eLpNorm + (fun x => (convexApproxSmoothH1 hU u x0 hr n).grad x i - u.grad x i) 2 + (volume.restrict U)) + Filter.atTop (nhds 0) := by + set ψ : ℕ → H1Function U := convexApproxSmoothH1 hU u x0 hr with hψ + have hedist : ∀ n, eLpNorm (fun x => (ψ n).grad x i - u.grad x i) 2 (volume.restrict U) + = edist ((ψ n).gradCoordToScalarL2 i) (u.gradCoordToScalarL2 i) := by + intro n + rw [MeasureTheory.Lp.edist_def] + refine (MeasureTheory.eLpNorm_congr_ae ?_).symm + filter_upwards [(ψ n).coeFn_gradCoordToScalarL2 i, u.coeFn_gradCoordToScalarL2 i] + with x hu1 hu2 + simp [Pi.sub_apply, hu1, hu2] + have h1 : Filter.Tendsto (fun n => (ψ n).gradCoordToScalarL2 i) Filter.atTop + (nhds (u.gradCoordToScalarL2 i)) := + tendsto_convexApproxSmoothH1_gradCoordToScalarL2 hU u hball hr i + have h2 : Filter.Tendsto (fun n => edist ((ψ n).gradCoordToScalarL2 i) + (u.gradCoordToScalarL2 i)) Filter.atTop (nhds 0) := by + simpa using h1.edist (tendsto_const_nhds (x := u.gradCoordToScalarL2 i)) + exact h2.congr (fun n => (hedist n).symm) + +/-! ## The fold extension -/ + +/-- The fold-extension data bundle. -/ +structure FoldExtension (lo hi : Vec d) (u : H1Function (Box lo hi)) where + /-- The extended `H¹` function on the tripled box. -/ + Eu : H1Function (Box3 lo hi) + /-- The extension agrees with `u` a.e. on the base box. -/ + toFun_ae : Eu.toFun =ᵐ[volume.restrict (Box lo hi)] u.toFun + /-- The extension's gradient agrees with `u`'s a.e. on the base box. -/ + grad_ae : ∀ i, (fun x => Eu.grad x i) =ᵐ[volume.restrict (Box lo hi)] fun x => u.grad x i + /-- `L²` control of the extension by the constant `(3^d)^{1/2}`. -/ + eLpNorm_le : eLpNorm Eu.toFun 2 (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ d) ^ ((1 : ℝ) / 2) * eLpNorm u.toFun 2 (volume.restrict (Box lo hi)) + /-- `L²` control of the extension's coordinate gradients. -/ + grad_eLpNorm_le : ∀ i, eLpNorm (fun x => Eu.grad x i) 2 (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ d) ^ ((1 : ℝ) / 2) + * eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box lo hi)) + +/-- `Cd = (3^d)^{1/2}` is finite. -/ +theorem Cd_ne_top : (((3 : ℝ≥0∞) ^ d) ^ ((1 : ℝ) / 2)) ≠ ⊤ := + (ENNReal.rpow_lt_top_of_nonneg (by norm_num) (ENNReal.pow_ne_top (by simp))).ne + +theorem measurable_foldSign_comp (lo hi : Vec d) (i : Fin d) : + Measurable (fun x : Vec d => foldSign (lo i) (hi i) (x i)) := by + have hsign : Measurable (foldSign (lo i) (hi i)) := by + unfold foldSign + refine Measurable.ite (measurableSet_lt measurable_id measurable_const) measurable_const ?_ + exact Measurable.ite (measurableSet_lt measurable_const measurable_id) + measurable_const measurable_const + exact hsign.comp (measurable_pi_apply i) + +theorem norm_foldSign_le_one (lo hi t : ℝ) : ‖foldSign lo hi t‖ ≤ 1 := by + unfold foldSign; split_ifs <;> simp + +/-- **Even-fold extension of an `H¹(box)` function.** -/ +def foldExtension {m : ℕ} (lo hi : Vec (m + 1)) (hlt : ∀ k, lo k < hi k) + (u : H1Function (Box lo hi)) : FoldExtension lo hi u := by + classical + set lo3 : Vec (m + 1) := fun k => 2 * lo k - hi k with hlo3 + set hi3 : Vec (m + 1) := fun k => 2 * hi k - lo k with hhi3 + have hlt3 : ∀ k, lo3 k < hi3 k := fun k => by + simp only [hlo3, hhi3]; linarith [hlt k] + have hbox3 : Box3 lo hi = Box lo3 hi3 := rfl + have hU : IsOpenBoundedConvexDomain (Box lo hi) := isOpenBoundedConvexDomain_Box lo hi + have hFold_cont : Continuous (Fold lo hi) := continuous_Fold lo hi (fun k => (hlt k).le) + have hFold_meas : Measurable (Fold lo hi) := hFold_cont.measurable + -- the finite transport constant + set Cd : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ (m + 1)) ^ ((1 : ℝ) / 2) with hCd + have hCd_lt : Cd < ⊤ := + ENNReal.rpow_lt_top_of_nonneg (by norm_num) (ENNReal.pow_ne_top (by simp)) + -- measurable representatives of `u` and its gradient + have hg_asm : AEStronglyMeasurable u.toFun (volume.restrict (Box lo hi)) := + u.memL2.aestronglyMeasurable + set g : Vec (m + 1) → ℝ := hg_asm.mk u.toFun with hg_def + have hg_meas : Measurable g := hg_asm.stronglyMeasurable_mk.measurable + have hg_ae : u.toFun =ᵐ[volume.restrict (Box lo hi)] g := hg_asm.ae_eq_mk + have hgi_asm : ∀ i, AEStronglyMeasurable (fun x => u.grad x i) (volume.restrict (Box lo hi)) := + fun i => (u.gradMemL2 i).aestronglyMeasurable + set gi : Fin (m + 1) → Vec (m + 1) → ℝ := fun i => (hgi_asm i).mk (fun x => u.grad x i) with hgi_def + have hgi_meas : ∀ i, Measurable (gi i) := fun i => (hgi_asm i).stronglyMeasurable_mk.measurable + have hgi_ae : ∀ i, (fun x => u.grad x i) =ᵐ[volume.restrict (Box lo hi)] gi i := + fun i => (hgi_asm i).ae_eq_mk + -- a concrete ball inside the base box + set x0 : Vec (m + 1) := fun k => (lo k + hi k) / 2 with hx0 + set δ : ℝ := Finset.univ.inf' Finset.univ_nonempty (fun k => hi k - lo k) with hδ + have hδ_pos : 0 < δ := by + rw [hδ, Finset.lt_inf'_iff Finset.univ_nonempty]; exact fun k _ => by linarith [hlt k] + set r : ℝ := δ / 3 with hrdef + have hr : 0 < r := by rw [hrdef]; linarith + have hball : Metric.closedBall x0 r ⊆ Box lo hi := by + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff hr.le] at hx + refine Set.mem_univ_pi.2 fun k => ?_ + have hxk : dist (x k) (x0 k) ≤ r := hx k + rw [Real.dist_eq, abs_le] at hxk + have hmk : δ ≤ hi k - lo k := Finset.inf'_le _ (Finset.mem_univ k) + simp only [hx0, hrdef] at hxk + exact ⟨by nlinarith [hxk.1], by nlinarith [hxk.2]⟩ + -- the approximants and their smoothness + set A : ℕ → H1Function (Box lo hi) := convexApproxSmoothH1 hU u x0 hr with hA + have hφ_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (A n).toFun := by + intro n + rw [hA, convexApproxSmoothH1_toFun] + exact contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet + (isConvexApproxKernel_unitConvexApproxKernel) (by norm_num : (1 : ENNReal) ≤ 2) + u.memL2 hr (by dsimp [unitConvexApproxScale]; positivity) + have hφ_grad : ∀ n x i, (A n).grad x i = fderiv ℝ ((A n).toFun) x (basisVec i) := by + intro n x i + simp only [hA, convexApproxSmoothH1_grad, convexApproxSmoothH1_toFun] + -- the cutoff (identically one on a neighbourhood of the tripled box) + set χ : Vec (m + 1) → ℝ := boxCutoff lo3 hi3 1 with hχ + have hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ := boxCutoff_contDiff + have hχ_cptsupp : HasCompactSupport χ := by + apply HasCompactSupport.intro (K := Set.Icc (fun k => lo3 k - 1) (fun k => hi3 k + 1)) + isCompact_Icc + intro x hx + exact boxCutoff_eq_zero (by norm_num) hx + have hχ_one : ∀ x ∈ Set.Icc lo3 hi3, χ x = 1 := fun x hx => boxCutoff_eq_one (by norm_num) hx + -- membership of `Box lo hi` and `Box3` in the plateau + have hBox_Icc : ∀ x ∈ Box lo hi, x ∈ Set.Icc lo3 hi3 := by + intro x hx + have hx' := Set.mem_univ_pi.1 hx + refine Set.mem_Icc.2 ⟨fun k => ?_, fun k => ?_⟩ + · have := (hx' k).1; simp only [hlo3]; linarith [hlt k] + · have := (hx' k).2; simp only [hhi3]; linarith [hlt k] + -- the cut-off approximants + set wn : ℕ → Vec (m + 1) → ℝ := fun n x => χ x * (A n).toFun x with hwn + have hw_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (wn n) := fun n => hχ_smooth.mul (hφ_smooth n) + have hw_cont : ∀ n, Continuous (wn n) := fun n => (hw_smooth n).continuous + have hw_meas : ∀ n, Measurable (wn n) := fun n => (hw_cont n).measurable + have hw_cptsupp : ∀ n, HasCompactSupport (wn n) := fun n => hχ_cptsupp.mul_right + have hw_memLp : ∀ n, MemLp (wn n) 2 (volume.restrict (Box lo hi)) := fun n => + ((hw_cont n).memLp_of_hasCompactSupport (hw_cptsupp n)).restrict _ + -- `wn = φ` on the plateau, and fderiv agree there + have hw_eq_φ : ∀ n, ∀ x ∈ Set.Icc lo3 hi3, wn n x = (A n).toFun x := by + intro n x hx; simp only [hwn, hχ_one x hx, one_mul] + have hfderiv_eq : ∀ n, ∀ y ∈ Box lo hi, fderiv ℝ (wn n) y = fderiv ℝ ((A n).toFun) y := by + intro n y hy + have hy3 : y ∈ Box3 lo hi := by + rw [hbox3] + refine Set.mem_univ_pi.2 fun k => ?_ + have hyk := (Set.mem_univ_pi.1 hy k) + exact ⟨by have := hyk.1; simp only [hlo3]; linarith [hlt k], + by have := hyk.2; simp only [hhi3]; linarith [hlt k]⟩ + have hnbhd : Box3 lo hi ∈ 𝓝 y := + (by rw [hbox3]; exact isOpen_Box lo3 hi3 : IsOpen (Box3 lo hi)).mem_nhds hy3 + have heq : wn n =ᶠ[𝓝 y] (A n).toFun := by + refine Filter.eventuallyEq_of_mem hnbhd fun x hx => ?_ + refine hw_eq_φ n x ?_ + rw [hbox3] at hx + have hx' := Set.mem_univ_pi.1 hx + exact Set.mem_Icc.2 ⟨fun k => (hx' k).1.le, fun k => (hx' k).2.le⟩ + exact heq.fderiv_eq + -- `L²` membership of the candidate extension and its gradient + have hEu_mem : MemLp (fun x => g (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi)) := by + refine ⟨(hg_meas.comp hFold_meas).aestronglyMeasurable, ?_⟩ + rw [eLpNorm_foldComp hg_meas lo hi hlt, ← eLpNorm_congr_ae hg_ae] + exact ENNReal.mul_lt_top hCd_lt u.memL2.eLpNorm_lt_top + have hEu_grad_mem : ∀ i, MemLp + (fun x => gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) 2 + (volume.restrict (Box3 lo hi)) := by + intro i + refine ⟨(((hgi_meas i).comp hFold_meas).mul + (measurable_foldSign_comp lo hi i)).aestronglyMeasurable, ?_⟩ + refine lt_of_le_of_lt + (b := eLpNorm (fun x => gi i (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi))) + (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_)) ?_ + · rw [norm_mul]; exact mul_le_of_le_one_right (norm_nonneg _) (norm_foldSign_le_one _ _ _) + · rw [eLpNorm_foldComp (hgi_meas i) lo hi hlt, ← eLpNorm_congr_ae (hgi_ae i)] + exact ENNReal.mul_lt_top hCd_lt (u.gradMemL2 i).eLpNorm_lt_top + -- `L²` membership of the approximants and their gradients + have hEn_mem : ∀ n, MemLp (fun x => wn n (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi)) := by + intro n + refine ⟨((hw_cont n).comp hFold_cont).aestronglyMeasurable, ?_⟩ + rw [eLpNorm_foldComp (hw_meas n) lo hi hlt] + exact ENNReal.mul_lt_top hCd_lt (hw_memLp n).eLpNorm_lt_top + have hDEn_mem : ∀ n, GradMemL2On (Box3 lo hi) + (fun x i => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * foldSign (lo i) (hi i) (x i)) := by + intro n i + have hcont : Continuous (fun y => fderiv ℝ (wn n) y (basisVec i)) := + (((hw_smooth n).of_le (by exact_mod_cast le_top) : ContDiff ℝ 1 (wn n)).continuous_fderiv (by simp)).clm_apply + continuous_const + refine ⟨((hcont.measurable.comp hFold_meas).mul + (measurable_foldSign_comp lo hi i)).aestronglyMeasurable, ?_⟩ + refine lt_of_le_of_lt + (b := eLpNorm (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i)) 2 + (volume.restrict (Box3 lo hi))) + (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_)) ?_ + · rw [norm_mul]; exact mul_le_of_le_one_right (norm_nonneg _) (norm_foldSign_le_one _ _ _) + · rw [eLpNorm_foldComp hcont.measurable lo hi hlt] + have hmem : MemLp (fun y => fderiv ℝ (wn n) y (basisVec i)) 2 + (volume.restrict (Box lo hi)) := + (hcont.memLp_of_hasCompactSupport + ((hw_cptsupp n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict _ + exact ENNReal.mul_lt_top hCd_lt hmem.eLpNorm_lt_top + -- the per-approximant weak gradient on the tripled box + have hweak : ∀ n, HasWeakGradientOn (Box3 lo hi) (fun x => wn n (Fold lo hi x)) + (fun x i => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * foldSign (lo i) (hi i) (x i)) := by + intro n i + have huniv := hasWeakPartialDerivOn_univ_foldComp + ((hw_smooth n).of_le (by exact_mod_cast le_top)) (hw_cptsupp n) lo hi + (fun k => (hlt k).le) i + exact huniv.restrict (by rw [hbox3]; exact isOpen_Box lo3 hi3) (Set.subset_univ _) + -- `L²` convergence of the approximants + have htend_u : Filter.Tendsto (fun n => eLpNorm + (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi))) + Filter.atTop (nhds 0) := by + have heq : ∀ n, eLpNorm (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) 2 + (volume.restrict (Box3 lo hi)) + = Cd * eLpNorm (fun x => (A n).toFun x - u.toFun x) 2 (volume.restrict (Box lo hi)) := by + intro n + have hcomp : eLpNorm (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) 2 + (volume.restrict (Box3 lo hi)) + = Cd * eLpNorm (fun y => wn n y - g y) 2 (volume.restrict (Box lo hi)) := + eLpNorm_foldComp ((hw_meas n).sub hg_meas) lo hi hlt + rw [hcomp] + congr 1 + refine eLpNorm_congr_ae ?_ + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hg_ae] with x hxU hgx + have hχ1 : χ x = 1 := hχ_one x (hBox_Icc x hxU) + simp only [hwn, hχ1, one_mul, hgx] + have hmul : Filter.Tendsto + (fun n => Cd * eLpNorm (fun x => (A n).toFun x - u.toFun x) 2 (volume.restrict (Box lo hi))) + Filter.atTop (nhds (Cd * 0)) := + ENNReal.Tendsto.const_mul (tendsto_eLpNorm_convexApproxSmoothH1 hU u hr hball) + (Or.inr hCd_lt.ne) + rw [mul_zero] at hmul + exact hmul.congr (fun n => (heq n).symm) + have htend_Du : ∀ i, Filter.Tendsto (fun n => eLpNorm + (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * foldSign (lo i) (hi i) (x i) + - gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) 2 (volume.restrict (Box3 lo hi))) + Filter.atTop (nhds 0) := by + intro i + have hbound : ∀ n, eLpNorm (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) + * foldSign (lo i) (hi i) (x i) - gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) 2 + (volume.restrict (Box3 lo hi)) + ≤ Cd * eLpNorm (fun x => (A n).grad x i - u.grad x i) 2 (volume.restrict (Box lo hi)) := by + intro n + refine le_trans + (b := eLpNorm (fun x => (fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) (Fold lo hi x)) + 2 (volume.restrict (Box3 lo hi))) + (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_)) ?_ + · show ‖_‖ ≤ ‖(fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) (Fold lo hi x)‖ + rw [show fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * foldSign (lo i) (hi i) (x i) + - gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i) + = (fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) - gi i (Fold lo hi x)) + * foldSign (lo i) (hi i) (x i) by ring, norm_mul] + exact mul_le_of_le_one_right (norm_nonneg _) (norm_foldSign_le_one _ _ _) + · have hcomp : eLpNorm (fun x => (fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) (Fold lo hi x)) + 2 (volume.restrict (Box3 lo hi)) + = Cd * eLpNorm (fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) 2 (volume.restrict (Box lo hi)) := + eLpNorm_foldComp + ((((hw_smooth n).of_le (by exact_mod_cast le_top) : ContDiff ℝ 1 (wn n)).continuous_fderiv (by simp)).clm_apply + continuous_const |>.measurable.sub (hgi_meas i)) lo hi hlt + rw [hcomp] + have hae : (fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) + =ᵐ[volume.restrict (Box lo hi)] (fun x => (A n).grad x i - u.grad x i) := by + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hgi_ae i] + with x hxU hgix + show fderiv ℝ (wn n) x (basisVec i) - gi i x = (A n).grad x i - u.grad x i + rw [hfderiv_eq n x hxU, ← hφ_grad n x i, ← hgix] + rw [eLpNorm_congr_ae hae] + have hrhs : Filter.Tendsto + (fun n => Cd * eLpNorm (fun x => (A n).grad x i - u.grad x i) 2 (volume.restrict (Box lo hi))) + Filter.atTop (nhds 0) := by + have := ENNReal.Tendsto.const_mul (tendsto_eLpNorm_grad_convexApproxSmoothH1 hU u hr hball i) + (Or.inr hCd_lt.ne) + rwa [mul_zero] at this + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun n => zero_le) hbound + -- assemble + exact + { Eu := + { toFun := fun x => g (Fold lo hi x) + grad := fun x i => gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i) + memL2 := hEu_mem + gradMemL2 := hEu_grad_mem + hasWeakGradient := HasWeakGradientOn.of_tendsto_eLpNorm_two hEu_mem hEu_grad_mem + hEn_mem hDEn_mem hweak htend_u htend_Du } + toFun_ae := by + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hg_ae] with x hxU hgx + have hfold : Fold lo hi x = x := + Fold_of_mem fun k => ⟨(Set.mem_univ_pi.1 hxU k).1.le, (Set.mem_univ_pi.1 hxU k).2.le⟩ + show g (Fold lo hi x) = u.toFun x + rw [hfold, hgx] + grad_ae := fun i => by + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hgi_ae i] + with x hxU hgix + have hxk := Set.mem_univ_pi.1 hxU i + have hfold : Fold lo hi x = x := + Fold_of_mem fun k => ⟨(Set.mem_univ_pi.1 hxU k).1.le, (Set.mem_univ_pi.1 hxU k).2.le⟩ + have hsign : foldSign (lo i) (hi i) (x i) = 1 := by + unfold foldSign; rw [if_neg (not_lt.mpr hxk.1.le), if_neg (not_lt.mpr hxk.2.le)] + show gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i) = u.grad x i + rw [hfold, hsign, mul_one, hgix] + eLpNorm_le := le_of_eq (by + rw [eLpNorm_foldComp hg_meas lo hi hlt, ← eLpNorm_congr_ae hg_ae]) + grad_eLpNorm_le := fun i => + le_trans (b := eLpNorm (fun x => gi i (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi))) + (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => by + rw [norm_mul]; exact mul_le_of_le_one_right (norm_nonneg _) (norm_foldSign_le_one _ _ _))) + (le_of_eq (by rw [eLpNorm_foldComp (hgi_meas i) lo hi hlt, + ← eLpNorm_congr_ae (hgi_ae i)])) } + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflection.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflection.lean new file mode 100644 index 0000000000..4c2a292cf1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflection.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionLines +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.OneDimIBP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.PeelFubini +public import Mathlib.MeasureTheory.Function.LocallyIntegrable + +/-! # Face Reflection -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open scoped BigOperators + +/-! +# Single-face even reflection: weak-gradient transport + +Assembles the per-line calculus (`FaceReflectionLines`), the kink integration by +parts (`OneDimIBP`), and coordinate-peeling Fubini (`PeelFubini`) into the weak +gradient of the even reflection `faceReflect v a i`. +-/ + +noncomputable section + +variable {d : ℕ} + +/-- A continuous compactly supported function is bounded. -/ +theorem exists_norm_bound_of_continuous_hasCompactSupport + {w : Vec d → ℝ} (hw : Continuous w) (hwc : HasCompactSupport w) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x, ‖w x‖ ≤ C := by + have hcpt : IsCompact (tsupport w) := hwc + rcases (tsupport w).eq_empty_or_nonempty with hemp | hne + · refine ⟨0, le_refl 0, fun x => ?_⟩ + have : x ∉ tsupport w := by rw [hemp]; exact Set.notMem_empty x + simp [image_eq_zero_of_notMem_tsupport this] + · obtain ⟨x₀, hx₀_mem, hx₀_max⟩ := + hcpt.exists_isMaxOn hne hw.norm.continuousOn + refine ⟨‖w x₀‖, norm_nonneg _, fun x => ?_⟩ + by_cases hx : x ∈ tsupport w + · exact hx₀_max hx + · simp [image_eq_zero_of_notMem_tsupport hx] + +/-- On the face `{x_i = a}` the reflection is the identity. -/ +theorem coordFaceReflection_eq_self_of_face {a : ℝ} {i : Fin d} {x : Vec d} + (hx : x i = a) : coordFaceReflection a i x = x := by + funext j + rw [coordFaceReflection_apply] + rcases eq_or_ne j i with h | h + · subst h; rw [if_pos rfl, hx]; ring + · rw [if_neg h] + +/-- The even reflection of a continuous function is continuous (the two branches +agree on the face). -/ +theorem continuous_faceReflect {v : Vec d → ℝ} (hv : Continuous v) + (a : ℝ) (i : Fin d) : Continuous (faceReflect v a i) := by + refine Continuous.if_le hv (hv.comp (continuous_coordFaceReflection a i)) + continuous_const (continuous_apply i) ?_ + intro x hx + rw [coordFaceReflection_eq_self_of_face hx.symm] + +/-- The even reflection has compact support when `v` does. -/ +theorem hasCompactSupport_faceReflect {v : Vec d → ℝ} + (hvc : HasCompactSupport v) (a : ℝ) (i : Fin d) : + HasCompactSupport (faceReflect v a i) := by + have hcv : IsCompact (tsupport v) := hvc + set K : Set (Vec d) := tsupport v ∪ coordFaceReflection a i ⁻¹' tsupport v with hK + have hpre_eq : coordFaceReflection a i '' (tsupport v) + = coordFaceReflection a i ⁻¹' (tsupport v) := + congrFun (Set.image_eq_preimage_of_inverse (coordFaceReflection_involutive a i) + (coordFaceReflection_involutive a i)) (tsupport v) + have hK_compact : IsCompact K := by + rw [hK, ← hpre_eq] + exact hcv.union (hcv.image (continuous_coordFaceReflection a i)) + have hK_closed : IsClosed K := + (isClosed_tsupport v).union + ((isClosed_tsupport v).preimage (continuous_coordFaceReflection a i)) + have hsupp_sub : Function.support (faceReflect v a i) ⊆ K := by + intro x hx + rw [Function.mem_support] at hx + by_cases h : a ≤ x i + · refine Or.inl (subset_tsupport v ?_) + rw [Function.mem_support]; intro h0; apply hx; unfold faceReflect; rw [if_pos h, h0] + · refine Or.inr ?_ + rw [Set.mem_preimage] + refine subset_tsupport v ?_ + rw [Function.mem_support]; intro h0; apply hx; unfold faceReflect; rw [if_neg h, h0] + exact IsCompact.of_isClosed_subset hK_compact (isClosed_tsupport _) + (closure_minimal hsupp_sub hK_closed) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionLines.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionLines.lean new file mode 100644 index 0000000000..f9a4e5f6ff --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionLines.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Analysis.Calculus.FDeriv.Pi + +/-! # Face Reflection Lines -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open scoped BigOperators + +/-! +# Single-face even reflection: definitions and per-line calculus + +Global (on all of `ℝ^d`) even reflection of a function across the face +`{x_i = a}`, its candidate gradient (sign-flipped in direction `i` on the +reflected side), the geometric fact that the reflection commutes with coordinate +insertion, and the one-dimensional derivatives of the direct and reflected line +functions. These feed the Fubini assembly in `FaceReflection`. +-/ + +noncomputable section + +variable {d : ℕ} + +/-- Even reflection of `v` across the face `{x_i = a}`: unchanged where +`a ≤ x i`, reflected otherwise. -/ +def faceReflect (v : Vec d → ℝ) (a : ℝ) (i : Fin d) : Vec d → ℝ := + fun x => if a ≤ x i then v x else v (coordFaceReflection a i x) + +/-- Candidate gradient of `faceReflect v a i`: the reflected-side gradient carries +a sign flip in direction `i` (and no flip in the other directions). -/ +def faceGrad (v : Vec d → ℝ) (a : ℝ) (i : Fin d) : Vec d → Vec d := + fun x j => + if a ≤ x i then (fderiv ℝ v x) (basisVec j) + else (if j = i then (-1 : ℝ) else 1) * + (fderiv ℝ v (coordFaceReflection a i x)) (basisVec j) + +/-- The face reflection commutes with coordinate insertion at the reflected axis: +inserting `t` at `i` then reflecting is inserting `2a − t`. -/ +theorem coordFaceReflection_insertNth {n : ℕ} (a : ℝ) (i : Fin (n + 1)) + (t : ℝ) (z : Vec n) : + coordFaceReflection a i (i.insertNth t z) = i.insertNth (2 * a - t) z := by + funext j + rw [coordFaceReflection_apply] + rcases eq_or_ne j i with h | h + · subst h; simp + · obtain ⟨k, rfl⟩ := Fin.exists_succAbove_eq h + simp [Fin.insertNth_apply_succAbove, h] + +/-- The insertion line `t ↦ i.insertNth t z` is affine with velocity `basisVec i`. -/ +theorem hasDerivAt_insertNth {n : ℕ} (i : Fin (n + 1)) (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => (i.insertNth t z : Vec (n + 1))) (basisVec i) t₀ := by + have hfun : (fun t : ℝ => (i.insertNth t z : Vec (n + 1))) + = fun t => t • (basisVec i) + i.insertNth 0 z := by + funext t + funext j + rcases eq_or_ne j i with h | h + · subst h + simp [Fin.insertNth_apply_same, basisVec] + · obtain ⟨k, rfl⟩ := Fin.exists_succAbove_eq h + simp [Fin.insertNth_apply_succAbove, basisVec, Fin.succAbove_ne] + rw [hfun] + simpa using ((hasDerivAt_id t₀).smul_const (basisVec i)).add_const (i.insertNth 0 z) + +/-- The reflected insertion line `t ↦ i.insertNth (2a − t) z` has velocity +`-basisVec i`. -/ +theorem hasDerivAt_insertNth_reflect {n : ℕ} (a : ℝ) (i : Fin (n + 1)) + (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => (i.insertNth (2 * a - t) z : Vec (n + 1))) + (-basisVec i) t₀ := by + have hinner : HasDerivAt (fun t : ℝ => 2 * a - t) (-1) t₀ := by + simpa using (hasDerivAt_id t₀).const_sub (2 * a) + have hcomp := (hasDerivAt_insertNth i z (2 * a - t₀)).scomp t₀ hinner + simpa using! hcomp + +/-- Directional derivative of `v` along the insertion line in direction `i`. -/ +theorem hasDerivAt_comp_insertNth {n : ℕ} {v : Vec (n + 1) → ℝ} + (hv : Differentiable ℝ v) (i : Fin (n + 1)) (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => v (i.insertNth t z)) + ((fderiv ℝ v (i.insertNth t₀ z)) (basisVec i)) t₀ := + (hv (i.insertNth t₀ z)).hasFDerivAt.comp_hasDerivAt t₀ (hasDerivAt_insertNth i z t₀) + +/-- Directional derivative of `v` along the reflected insertion line. -/ +theorem hasDerivAt_comp_insertNth_reflect {n : ℕ} {v : Vec (n + 1) → ℝ} + (hv : Differentiable ℝ v) (a : ℝ) (i : Fin (n + 1)) (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => v (i.insertNth (2 * a - t) z)) + ((fderiv ℝ v (i.insertNth (2 * a - t₀) z)) (-basisVec i)) t₀ := + (hv (i.insertNth (2 * a - t₀) z)).hasFDerivAt.comp_hasDerivAt t₀ + (hasDerivAt_insertNth_reflect a i z t₀) + +/-- Velocity of the reflected insertion line in a *tangential* coordinate `j ≠ i`: +inserting `t` at `j` then reflecting across `{x_i = a}` moves with velocity +`basisVec j` (the reflection fixes tangential directions). -/ +theorem hasDerivAt_coordFaceReflection_insertNth {n : ℕ} + (a : ℝ) {i j : Fin (n + 1)} (hji : j ≠ i) (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => coordFaceReflection a i (j.insertNth t z)) + (basisVec j) t₀ := by + have hline : HasDerivAt (fun t : ℝ => (j.insertNth t z : Vec (n + 1))) + (basisVec j) t₀ := hasDerivAt_insertNth j z t₀ + have hA : HasDerivAt + (fun t => coordReflectionLinear i (j.insertNth t z)) + (coordReflectionLinear i (basisVec j)) t₀ := + (coordReflectionLinear i).hasFDerivAt.comp_hasDerivAt t₀ hline + have hvel : coordReflectionLinear i (basisVec j) = basisVec j := by + rw [coordReflectionLinear_basisVec, if_neg hji, one_smul] + rw [hvel] at hA + exact hA.add_const (coordFaceReflectionOffset a i) + +/-- Directional derivative of `v` along the reflected insertion line in a +tangential coordinate `j ≠ i`. -/ +theorem hasDerivAt_comp_coordFaceReflection_insertNth {n : ℕ} {v : Vec (n + 1) → ℝ} + (hv : Differentiable ℝ v) (a : ℝ) {i j : Fin (n + 1)} (hji : j ≠ i) + (z : Vec n) (t₀ : ℝ) : + HasDerivAt (fun t => v (coordFaceReflection a i (j.insertNth t z))) + ((fderiv ℝ v (coordFaceReflection a i (j.insertNth t₀ z))) (basisVec j)) t₀ := + (hv (coordFaceReflection a i (j.insertNth t₀ z))).hasFDerivAt.comp_hasDerivAt t₀ + (hasDerivAt_coordFaceReflection_insertNth a hji z t₀) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionMain.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionMain.lean new file mode 100644 index 0000000000..6933854843 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FaceReflectionMain.lean @@ -0,0 +1,283 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflection +public import Mathlib.MeasureTheory.Integral.Bochner.Set + +/-! # Face Reflection Main -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open scoped BigOperators + +/-! +# Single-face even reflection: weak-gradient transport (main theorem) + +The even reflection `faceReflect v a i` of a globally `C¹`, compactly supported +function `v` on `Vec (n+1)` has weak gradient the piecewise `faceGrad v a i` on +all of `Vec (n+1)` (hence, by restriction, on any open set). +-/ + +noncomputable section + +variable {n : ℕ} + +/-- The restriction of a compactly supported function to an insertion line is +compactly supported. -/ +theorem hasCompactSupport_insertNth_line {φ : Vec (n + 1) → ℝ} + (hφc : HasCompactSupport φ) (j : Fin (n + 1)) (z : Vec n) : + HasCompactSupport (fun t => φ (j.insertNth t z)) := by + have hK : IsCompact (tsupport φ) := hφc + have himg : IsCompact ((fun x : Vec (n + 1) => x j) '' tsupport φ) := + hK.image (continuous_apply j) + obtain ⟨R, hR⟩ := himg.isBounded.subset_closedBall (0 : ℝ) + rw [Real.closedBall_eq_Icc] at hR + simp only [zero_sub, zero_add] at hR + apply HasCompactSupport.intro (K := Set.Icc (-R) R) isCompact_Icc + intro t ht + by_contra h0 + have hmem : (j.insertNth t z) ∈ tsupport φ := + subset_tsupport φ (by rw [Function.mem_support]; exact h0) + have : t ∈ Set.Icc (-R) R := by + have hmem2 : (j.insertNth t z : Vec (n + 1)) j + ∈ (fun x : Vec (n + 1) => x j) '' tsupport φ := + ⟨j.insertNth t z, hmem, rfl⟩ + rw [Fin.insertNth_apply_same] at hmem2 + exact hR hmem2 + exact ht this + +/-- Almost every real number differs from a fixed point. -/ +private theorem ae_ne_point (a : ℝ) : ∀ᵐ t ∂(volume : Measure ℝ), t ≠ a := by + rw [MeasureTheory.ae_iff] + simp + +/-- **Diagonal per-line identity** (reflection direction = differentiation +direction). The reflected line integrates by parts against `φ` with the +sign-flipped candidate derivative, with no boundary term. -/ +private theorem faceReflect_line_integral_diag {v : Vec (n + 1) → ℝ} + (hv : ContDiff ℝ 1 v) {φ : Vec (n + 1) → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφc : HasCompactSupport φ) + (a : ℝ) (j : Fin (n + 1)) (z : Vec n) : + (∫ t, faceReflect v a j (j.insertNth t z) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = -(∫ t, faceGrad v a j (j.insertNth t z) j * φ (j.insertNth t z)) := by + have hvd : Differentiable ℝ v := hv.differentiable (by simp) + have hvf : Continuous (fderiv ℝ v) := hv.continuous_fderiv (by simp) + have hφd : Differentiable ℝ φ := hφ.differentiable (by simp) + have hφf : Continuous (fderiv ℝ φ) := hφ.continuous_fderiv (by simp) + have hlineDir : Continuous (fun t : ℝ => (j.insertNth t z : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => (hasDerivAt_insertNth j z t).continuousAt + have hlineRefl : Continuous (fun t : ℝ => (j.insertNth (2 * a - t) z : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => (hasDerivAt_insertNth_reflect a j z t).continuousAt + -- derivatives of the two branch functions and the line test + have hd₁ : ∀ t, HasDerivAt (fun s => v (j.insertNth (2 * a - s) z)) + ((fderiv ℝ v (j.insertNth (2 * a - t) z)) (-basisVec j)) t := + fun t => hasDerivAt_comp_insertNth_reflect hvd a j z t + have hd₂ : ∀ t, HasDerivAt (fun s => v (j.insertNth s z)) + ((fderiv ℝ v (j.insertNth t z)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hvd j z t + have hφL_deriv : ∀ t, HasDerivAt (fun s => φ (j.insertNth s z)) + ((fderiv ℝ φ (j.insertNth t z)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hφd j z t + have hc₁ : Continuous (fun t => (fderiv ℝ v (j.insertNth (2 * a - t) z)) (-basisVec j)) := + (hvf.comp hlineRefl).clm_apply continuous_const + have hc₂ : Continuous (fun t => (fderiv ℝ v (j.insertNth t z)) (basisVec j)) := + (hvf.comp hlineDir).clm_apply continuous_const + have hcφ : Continuous (fun t => (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) := + (hφf.comp hlineDir).clm_apply continuous_const + have hφL_cs : HasCompactSupport (fun t => φ (j.insertNth t z)) := + hasCompactSupport_insertNth_line hφc j z + have hmatch : v (j.insertNth (2 * a - a) z) = v (j.insertNth a z) := by + rw [show (2 * a - a : ℝ) = a by ring] + -- integration by parts across the kink at `a` + have hkey := integral_mul_deriv_piecewise_eq_neg a hd₁ hc₁ hd₂ hc₂ hmatch hφL_deriv hcφ hφL_cs + -- rewrite the reflection to the piecewise form on the line + have hA : ∀ t, faceReflect v a j (j.insertNth t z) + = (if t ≤ a then v (j.insertNth (2 * a - t) z) else v (j.insertNth t z)) := by + intro t + simp only [faceReflect, Fin.insertNth_apply_same] + rcases lt_trichotomy t a with h | h | h + · rw [if_neg (not_le.mpr h), if_pos (le_of_lt h), coordFaceReflection_insertNth] + · subst h + rw [if_pos (le_refl t), if_pos (le_refl t), show (2 * t - t : ℝ) = t by ring] + · rw [if_pos (le_of_lt h), if_neg (not_le.mpr h)] + -- rewrite the candidate gradient to the piecewise derivative off the kink + have hB : ∀ t, t ≠ a → faceGrad v a j (j.insertNth t z) j + = (if t ≤ a then (fderiv ℝ v (j.insertNth (2 * a - t) z)) (-basisVec j) + else (fderiv ℝ v (j.insertNth t z)) (basisVec j)) := by + intro t ht + unfold faceGrad + rw [Fin.insertNth_apply_same] + rcases lt_trichotomy t a with h | h | h + · rw [if_neg (not_le.mpr h), if_pos (le_of_lt h), if_pos (rfl : j = j), + coordFaceReflection_insertNth, map_neg, neg_one_mul] + · exact absurd h ht + · rw [if_pos (le_of_lt h), if_neg (not_le.mpr h)] + -- assemble + have e1 : (∫ t, faceReflect v a j (j.insertNth t z) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = ∫ t, (if t ≤ a then v (j.insertNth (2 * a - t) z) else v (j.insertNth t z)) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hA t]) + have e2 : (∫ t, (if t ≤ a then (fderiv ℝ v (j.insertNth (2 * a - t) z)) (-basisVec j) + else (fderiv ℝ v (j.insertNth t z)) (basisVec j)) * φ (j.insertNth t z)) + = ∫ t, faceGrad v a j (j.insertNth t z) j * φ (j.insertNth t z) := + integral_congr_ae (by + filter_upwards [ae_ne_point a] with t ht + simp only [hB t ht]) + rw [e1, hkey, e2] + +/-- **Off-diagonal per-line identity** (reflection direction ≠ differentiation +direction). The line meets the reflection face at a single tangential value, so +each line is globally `C¹` and integrates by parts with no boundary term. -/ +private theorem faceReflect_line_integral_offdiag {v : Vec (n + 1) → ℝ} + (hv : ContDiff ℝ 1 v) {φ : Vec (n + 1) → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφc : HasCompactSupport φ) + (a : ℝ) {i j : Fin (n + 1)} (hji : j ≠ i) (z : Vec n) : + (∫ t, faceReflect v a i (j.insertNth t z) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = -(∫ t, faceGrad v a i (j.insertNth t z) j * φ (j.insertNth t z)) := by + have hvd : Differentiable ℝ v := hv.differentiable (by simp) + have hvf : Continuous (fderiv ℝ v) := hv.continuous_fderiv (by simp) + have hφd : Differentiable ℝ φ := hφ.differentiable (by simp) + have hφf : Continuous (fderiv ℝ φ) := hφ.continuous_fderiv (by simp) + have hlineDir : Continuous (fun t : ℝ => (j.insertNth t z : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => (hasDerivAt_insertNth j z t).continuousAt + have hlineReflIdx : + Continuous (fun t : ℝ => coordFaceReflection a i (j.insertNth t z)) := + (continuous_coordFaceReflection a i).comp hlineDir + have hφL_deriv : ∀ t, HasDerivAt (fun s => φ (j.insertNth s z)) + ((fderiv ℝ φ (j.insertNth t z)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hφd j z t + have hcφ : Continuous (fun t => (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) := + (hφf.comp hlineDir).clm_apply continuous_const + have hφL_cs : HasCompactSupport (fun t => φ (j.insertNth t z)) := + hasCompactSupport_insertNth_line hφc j z + -- the `i`-th coordinate is constant along the `j`-line + obtain ⟨k, hk⟩ := Fin.exists_succAbove_eq (show i ≠ j from fun h => hji h.symm) + have hci : ∀ t, (j.insertNth t z : Vec (n + 1)) i = z k := by + intro t; rw [← hk, Fin.insertNth_apply_succAbove] + by_cases hac : a ≤ z k + · -- direct branch on the whole line + have hd : ∀ t, HasDerivAt (fun s => v (j.insertNth s z)) + ((fderiv ℝ v (j.insertNth t z)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hvd j z t + have hc : Continuous (fun t => (fderiv ℝ v (j.insertNth t z)) (basisVec j)) := + (hvf.comp hlineDir).clm_apply continuous_const + have hkey := integral_mul_deriv_eq_neg hd hc hφL_deriv hcφ hφL_cs + have hEv : ∀ t, faceReflect v a i (j.insertNth t z) = v (j.insertNth t z) := by + intro t; simp only [faceReflect]; rw [hci t, if_pos hac] + have hGr : ∀ t, faceGrad v a i (j.insertNth t z) j + = (fderiv ℝ v (j.insertNth t z)) (basisVec j) := by + intro t; simp only [faceGrad]; rw [hci t, if_pos hac] + have e1 : (∫ t, faceReflect v a i (j.insertNth t z) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = ∫ t, v (j.insertNth t z) * (fderiv ℝ φ (j.insertNth t z)) (basisVec j) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hEv t]) + have e2 : (∫ t, (fderiv ℝ v (j.insertNth t z)) (basisVec j) * φ (j.insertNth t z)) + = ∫ t, faceGrad v a i (j.insertNth t z) j * φ (j.insertNth t z) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hGr t]) + rw [e1, hkey, e2] + · -- reflected branch on the whole line + have hd : ∀ t, HasDerivAt (fun s => v (coordFaceReflection a i (j.insertNth s z))) + ((fderiv ℝ v (coordFaceReflection a i (j.insertNth t z))) (basisVec j)) t := + fun t => hasDerivAt_comp_coordFaceReflection_insertNth hvd a hji z t + have hc : Continuous + (fun t => (fderiv ℝ v (coordFaceReflection a i (j.insertNth t z))) (basisVec j)) := + (hvf.comp hlineReflIdx).clm_apply continuous_const + have hkey := integral_mul_deriv_eq_neg hd hc hφL_deriv hcφ hφL_cs + have hEv : ∀ t, faceReflect v a i (j.insertNth t z) + = v (coordFaceReflection a i (j.insertNth t z)) := by + intro t; simp only [faceReflect]; rw [hci t, if_neg hac] + have hGr : ∀ t, faceGrad v a i (j.insertNth t z) j + = (fderiv ℝ v (coordFaceReflection a i (j.insertNth t z))) (basisVec j) := by + intro t; simp only [faceGrad]; rw [hci t, if_neg hac, if_neg hji, one_mul] + have e1 : (∫ t, faceReflect v a i (j.insertNth t z) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = ∫ t, v (coordFaceReflection a i (j.insertNth t z)) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hEv t]) + have e2 : (∫ t, (fderiv ℝ v (coordFaceReflection a i (j.insertNth t z))) (basisVec j) + * φ (j.insertNth t z)) + = ∫ t, faceGrad v a i (j.insertNth t z) j * φ (j.insertNth t z) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hGr t]) + rw [e1, hkey, e2] + +/-- **Single-face weak-gradient transport.** +For `v : Vec (n+1) → ℝ` globally `C¹` with compact support, the even reflection +`faceReflect v a i` across `{x_i = a}` has weak `j`-th partial derivative +`faceGrad v a i · j` on all of `Vec (n+1)`, for every `j`. -/ +theorem hasWeakPartialDerivOn_univ_faceReflect {v : Vec (n + 1) → ℝ} + (hv : ContDiff ℝ 1 v) (hvc : HasCompactSupport v) (a : ℝ) (i j : Fin (n + 1)) : + HasWeakPartialDerivOn Set.univ j (faceReflect v a i) + (fun x => faceGrad v a i x j) := by + intro φ hφ hφc _hφsub + have hvd : Differentiable ℝ v := hv.differentiable (by simp) + have hvf : Continuous (fderiv ℝ v) := hv.continuous_fderiv (by simp) + have hφf : Continuous (fderiv ℝ φ) := hφ.continuous_fderiv (by simp) + -- integrand data + have hEv_cont : Continuous (faceReflect v a i) := continuous_faceReflect hv.continuous a i + have hEv_cs : HasCompactSupport (faceReflect v a i) := hasCompactSupport_faceReflect hvc a i + have hDφ_cont : Continuous (fun x => (fderiv ℝ φ x) (basisVec j)) := + hφf.clm_apply continuous_const + have hDφ_cs : HasCompactSupport (fun x => (fderiv ℝ φ x) (basisVec j)) := + hφc.fderiv_apply (𝕜 := ℝ) (basisVec j) + -- LHS integrand is integrable (continuous, compact support) + have hF_int : Integrable + (fun x => faceReflect v a i x * (fderiv ℝ φ x) (basisVec j)) + (volume : Measure (Vec (n + 1))) := + (hEv_cont.mul hDφ_cont).integrable_of_hasCompactSupport (hEv_cs.mul_right) + -- `faceGrad · j` is measurable and bounded + have hb1_cont : Continuous (fun x => (fderiv ℝ v x) (basisVec j)) := + hvf.clm_apply continuous_const + have hb1_cs : HasCompactSupport (fun x => (fderiv ℝ v x) (basisVec j)) := + hvc.fderiv_apply (𝕜 := ℝ) (basisVec j) + obtain ⟨M, hM0, hMbound⟩ := + exists_norm_bound_of_continuous_hasCompactSupport hb1_cont hb1_cs + have hb2_cont : Continuous + (fun x => (if j = i then (-1 : ℝ) else 1) + * (fderiv ℝ v (coordFaceReflection a i x)) (basisVec j)) := + continuous_const.mul ((hvf.comp (continuous_coordFaceReflection a i)).clm_apply + continuous_const) + have hset : MeasurableSet {x : Vec (n + 1) | a ≤ x i} := + measurableSet_le measurable_const (measurable_pi_apply i) + have hGj_meas : Measurable (fun x => faceGrad v a i x j) := + Measurable.ite hset hb1_cont.measurable hb2_cont.measurable + have hGj_bound : ∀ x, ‖faceGrad v a i x j‖ ≤ M := by + intro x + unfold faceGrad + by_cases h : a ≤ x i + · rw [if_pos h]; exact hMbound x + · rw [if_neg h] + rw [norm_mul] + by_cases hji : j = i + · rw [if_pos hji]; simp only [norm_neg, norm_one, one_mul] + exact hMbound _ + · rw [if_neg hji]; simp only [norm_one, one_mul] + exact hMbound _ + have hφ_int : Integrable φ (volume : Measure (Vec (n + 1))) := + hφ.continuous.integrable_of_hasCompactSupport hφc + have hG_int : Integrable + (fun x => faceGrad v a i x j * φ x) (volume : Measure (Vec (n + 1))) := + hφ_int.bdd_mul hGj_meas.aestronglyMeasurable + (Filter.Eventually.of_forall hGj_bound) + -- peel coordinate `j`, reduce to per-line identities + rw [MeasureTheory.setIntegral_univ, MeasureTheory.setIntegral_univ, + integral_peel_coord j hF_int, integral_peel_coord j hG_int, ← integral_neg] + refine integral_congr_ae (Filter.Eventually.of_forall fun z => ?_) + by_cases hji : j = i + · subst hji + exact faceReflect_line_integral_diag hv hφ hφc a j z + · exact faceReflect_line_integral_offdiag hv hφ hφc a hji z + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Fold.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Fold.lean new file mode 100644 index 0000000000..886ccc930a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Fold.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Topology.Order.OrderClosed +public import Mathlib.Data.Fin.Tuple.Basic + +/-! # Fold -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization +open scoped BigOperators + +/-! +# The even-periodic fold onto a box + +The coordinatewise even fold of `ℝ` onto the interval `[lo, hi]` with margin +equal to the side length: identity on `[lo, hi]`, reflected across `lo` below +and across `hi` above. Applied coordinatewise it gives `Fold : Vec d → Vec d`, +and the extension of a function `v` is `v ∘ Fold`. There are only two kinks per +coordinate; the fold is `1`-Lipschitz and equals the identity on the closed box. +-/ + +noncomputable section + +variable {d : ℕ} + +/-- Scalar even fold of `ℝ` onto `[lo, hi]`: reflected across `lo` below, across +`hi` above, identity in between. -/ +def foldR (lo hi t : ℝ) : ℝ := + if t < lo then 2 * lo - t else if hi < t then 2 * hi - t else t + +/-- The (right) derivative sign of `foldR`: `-1` on the reflected pieces, `+1` in +the interior. -/ +def foldSign (lo hi t : ℝ) : ℝ := + if t < lo then -1 else if hi < t then -1 else 1 + +/-- The coordinatewise fold onto the box `[lo, hi]`. -/ +def Fold (lo hi : Vec d) (x : Vec d) : Vec d := + fun j => foldR (lo j) (hi j) (x j) + +@[simp] theorem foldR_of_mem {lo hi t : ℝ} (h1 : lo ≤ t) (h2 : t ≤ hi) : + foldR lo hi t = t := by + unfold foldR + rw [if_neg (not_lt.mpr h1), if_neg (not_lt.mpr h2)] + +theorem continuous_foldR (lo hi : ℝ) (h : lo ≤ hi) : Continuous (foldR lo hi) := by + have hB : Continuous (fun t => if hi < t then 2 * hi - t else t) := by + have hEq : (fun t => if hi < t then 2 * hi - t else t) + = fun t => if t ≤ hi then t else 2 * hi - t := by + funext t; by_cases ht : hi < t + · rw [if_pos ht, if_neg (not_le.mpr ht)] + · rw [if_neg ht, if_pos (not_lt.mp ht)] + rw [hEq] + exact Continuous.if_le continuous_id (continuous_const.sub continuous_id) + continuous_id continuous_const (fun x hx => by rw [hx]; ring) + have hEq : foldR lo hi + = fun t => if lo ≤ t then (if hi < t then 2 * hi - t else t) else 2 * lo - t := by + funext t; unfold foldR + by_cases ht : t < lo + · rw [if_pos ht, if_neg (not_le.mpr ht)] + · rw [if_neg ht, if_pos (not_lt.mp ht)] + rw [hEq] + refine Continuous.if_le hB (continuous_const.sub continuous_id) continuous_const + continuous_id (fun x hx => ?_) + subst hx + rw [if_neg (not_lt.mpr h)]; ring + +theorem continuous_Fold (lo hi : Vec d) (hlohi : ∀ j, lo j ≤ hi j) : + Continuous (Fold lo hi) := by + refine continuous_pi (fun j => ?_) + exact (continuous_foldR (lo j) (hi j) (hlohi j)).comp (continuous_apply j) + +/-- The fold is the identity on the closed box. -/ +theorem Fold_of_mem {lo hi : Vec d} {x : Vec d} + (h : ∀ j, lo j ≤ x j ∧ x j ≤ hi j) : Fold lo hi x = x := by + funext j + exact foldR_of_mem (h j).1 (h j).2 + +/-- Expansion of the fold along an insertion line: only the `j`-coordinate varies, +through `foldR (lo j) (hi j) t`; the tangential coordinates are frozen. -/ +theorem Fold_insertNth {n : ℕ} (lo hi : Vec (n + 1)) (j : Fin (n + 1)) + (t : ℝ) (z : Vec n) : + Fold lo hi (j.insertNth t z) + = j.insertNth (foldR (lo j) (hi j) t) + (fun m => foldR (lo (j.succAbove m)) (hi (j.succAbove m)) (z m)) := by + funext k + rcases eq_or_ne k j with h | h + · subst h + simp only [Fold, Fin.insertNth_apply_same] + · obtain ⟨m, rfl⟩ := Fin.exists_succAbove_eq h + simp only [Fold, Fin.insertNth_apply_succAbove] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldExtensionFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldExtensionFiniteP.lean new file mode 100644 index 0000000000..79d3ff9b6c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldExtensionFiniteP.lean @@ -0,0 +1,565 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Extension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNormFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.ConvexApproxTendsto +public import Mathlib.MeasureTheory.Function.LpSpace.Complete + +/-! +# Finite-`p` even-fold extension on an axis box + +The `W^{1,p}` companion to `foldExtension`. Smooth convex-domain +approximants are cut off outside the tripled box, transported by the fold, and +closed using finite-exponent Hölder pairings against compactly supported test +functions. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology Homogenization +open scoped ENNReal NNReal BigOperators + +noncomputable section + +variable {d : ℕ} + +private theorem finiteLpExponent_ne_zero' (p : FiniteLpExponent) : p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem tendsto_eLpNorm_convexApproxSmoothW1p {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (p : FiniteLpExponent) + (u : W1pFunction U p.exponent) {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Tendsto + (fun n => eLpNorm + (fun x => (W1pFunction.convexApproxSmoothW1p hU p.one_lt.le u x0 hr n).toFun x - + u.toFun x) p.exponent (volume.restrict U)) + atTop (nhds 0) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → W1pFunction U p.exponent := + W1pFunction.convexApproxSmoothW1p hU p.one_lt.le u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + fun _ hn => hn) + have hraw : + Tendsto + (fun n : ℕ => eLpNorm + (fun x => convexApproxSmoothing ρ u.toFun x0 r (unitConvexApproxScale n) x - + u.toFun x) p.exponent (volume.restrict U)) + atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ p.one_lt.le p.lt_top.ne u.memLp hball hr + tendsto_unitConvexApproxScale_zero + (Eventually.of_forall W1pFunction.unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Tendsto + (fun n : ℕ => eLpNorm + (fun x => convexApproxSmoothRepresentative U ρ u.toFun x0 r + (unitConvexApproxScale n) x - u.toFun x) + p.exponent (volume.restrict U)) + atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply eLpNorm_congr_ae + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := u.toFun) hU hρ hx hball hr + (W1pFunction.unitConvexApproxScale_pos n) hε_lt_one] + refine hrep.congr' ?_ + filter_upwards with n + apply eLpNorm_congr_ae + filter_upwards with x + simp [ρ, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem tendsto_eLpNorm_grad_convexApproxSmoothW1p {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (p : FiniteLpExponent) + (u : W1pFunction U p.exponent) {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (i : Fin d) : + Tendsto + (fun n => eLpNorm + (fun x => (W1pFunction.convexApproxSmoothW1p hU p.one_lt.le u x0 hr n).grad x i - + u.grad x i) p.exponent (volume.restrict U)) + atTop (nhds 0) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → W1pFunction U p.exponent := + W1pFunction.convexApproxSmoothW1p hU p.one_lt.le u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + fun _ hn => hn) + have hraw : + Tendsto + (fun n : ℕ => eLpNorm + (fun x => (1 - unitConvexApproxScale n) * + convexApproxSmoothing ρ (fun y => u.grad y i) x0 r + (unitConvexApproxScale n) x - u.grad x i) + p.exponent (volume.restrict U)) + atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ p.one_lt.le p.lt_top.ne (u.grad_memLp i) hball hr + tendsto_unitConvexApproxScale_zero + (Eventually.of_forall W1pFunction.unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Tendsto + (fun n : ℕ => eLpNorm + (fun x => (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u.toFun x0 r + (unitConvexApproxScale n)) x) (basisVec i) - u.grad x i) + p.exponent (volume.restrict U)) + atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply eLpNorm_congr_ae + have hbridge := ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + (U := U) (ρ := ρ) (u := u.toFun) (gi := fun y => u.grad y i) + (i := i) (p := p.exponent) hU hρ p.one_lt.le u.memLp (u.grad_memLp i) + (u.hasWeakPartialDerivOn i) hball hr + (W1pFunction.unitConvexApproxScale_pos n) hε_lt_one + filter_upwards [hbridge, ae_restrict_mem hU.isOpen.measurableSet] with x hxbridge hxU + rw [hxbridge] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun y => u.grad y i) hU hρ hxU hball hr + (W1pFunction.unitConvexApproxScale_pos n) hε_lt_one] + refine hrep.congr' ?_ + filter_upwards with n + apply eLpNorm_congr_ae + filter_upwards with x + simp [ρ, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp + {U : Set (Vec d)} (p : FiniteLpExponent) {h : Vec d → ℝ} + {f : ℕ → Vec d → ℝ} {g : Vec d → ℝ} + (hh : MemLp h p.conjugate.exponent (volume.restrict U)) + (hf : ∀ n, MemLp (f n) p.exponent (volume.restrict U)) + (hg : MemLp g p.exponent (volume.restrict U)) + (htend : Tendsto + (fun n => eLpNorm (fun x => f n x - g x) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + Tendsto (fun n => ∫ x in U, f n x * h x ∂volume) + atTop (nhds (∫ x in U, g x * h x ∂volume)) := by + let : ENNReal.HolderConjugate p.exponent p.conjugate.exponent := p.holderConjugate + let : ENNReal.HolderConjugate p.conjugate.exponent p.exponent := inferInstance + set μ : Measure (Vec d) := volume.restrict U with hμ + have hfh_int : ∀ n, Integrable (fun x => f n x * h x) μ := by + intro n + simpa [μ, mul_comm] using + (memLp_one_iff_integrable.mp (hh.mul' (hf n))) + have hgh_int : Integrable (fun x => g x * h x) μ := by + simpa [μ, mul_comm] using (memLp_one_iff_integrable.mp (hh.mul' hg)) + rw [← tendsto_sub_nhds_zero_iff] + have hdiff_eq : ∀ n, + (∫ x, f n x * h x ∂μ) - (∫ x, g x * h x ∂μ) + = ∫ x, (f n x - g x) * h x ∂μ := by + intro n + rw [← integral_sub (hfh_int n) hgh_int] + refine integral_congr_ae (Eventually.of_forall fun x => ?_) + ring + set B : ℕ → ℝ≥0∞ := fun n => + eLpNorm (fun x => f n x - g x) p.exponent μ * + eLpNorm h p.conjugate.exponent μ with hB + have hBtend : Tendsto (fun n => (B n).toReal) atTop (nhds 0) := by + have hprod : Tendsto B atTop (nhds (0 * eLpNorm h p.conjugate.exponent μ)) := by + refine ENNReal.Tendsto.mul (by simpa [μ] using htend) (Or.inr hh.2.ne) + tendsto_const_nhds (Or.inr (by simp)) + rw [zero_mul] at hprod + have hreal := (ENNReal.tendsto_toReal (by simp : (0 : ℝ≥0∞) ≠ ⊤)).comp hprod + simpa using! hreal + refine squeeze_zero_norm ?_ hBtend + intro n + rw [hdiff_eq n] + have hbound : ∀ᵐ x ∂μ, + ‖(f n x - g x) * h x‖₊ ≤ 1 * ‖f n x - g x‖₊ * ‖h x‖₊ := + Eventually.of_forall fun x => by rw [nnnorm_mul]; simp + have hHolder : eLpNorm (fun x => (f n x - g x) * h x) 1 μ ≤ B n := by + have h := eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (p := p.exponent) (q := p.conjugate.exponent) (r := 1) + ((hf n).sub hg).1 hh.1 (fun a b => a * b) 1 hbound + simpa [B] using! h + calc + ‖∫ x, (f n x - g x) * h x ∂μ‖ + ≤ (∫⁻ x, ENNReal.ofReal ‖(f n x - g x) * h x‖ ∂μ).toReal := + norm_integral_le_lintegral_norm _ + _ = (eLpNorm (fun x => (f n x - g x) * h x) 1 μ).toReal := by + rw [eLpNorm_one_eq_lintegral_enorm] + simp_rw [ofReal_norm] + _ ≤ (B n).toReal := by + apply ENNReal.toReal_mono _ hHolder + exact ENNReal.mul_ne_top ((hf n).sub hg).2.ne hh.2.ne + +private theorem HasWeakPartialDerivOn.of_tendsto_eLpNorm_finiteLp + {U : Set (Vec d)} (p : FiniteLpExponent) {i : Fin d} + {u gi : Vec d → ℝ} {u_n g_n : ℕ → Vec d → ℝ} + (hu : MemLp u p.exponent (volume.restrict U)) + (hgi : MemLp gi p.exponent (volume.restrict U)) + (hu_n : ∀ n, MemLp (u_n n) p.exponent (volume.restrict U)) + (hg_n : ∀ n, MemLp (g_n n) p.exponent (volume.restrict U)) + (hweak : ∀ n, HasWeakPartialDerivOn U i (u_n n) (g_n n)) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_g : Tendsto + (fun n => eLpNorm (fun x => g_n n x - gi x) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + HasWeakPartialDerivOn U i u gi := by + intro φ hφ hφ_compact hφ_sub + have hDφ : MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) p.conjugate.exponent + (volume.restrict U) := by + have hcont : Continuous (fun x => (fderiv ℝ φ x) (basisVec i)) := + (hφ.continuous_fderiv (by norm_num)).clm_apply continuous_const + have hcs : HasCompactSupport (fun x => (fderiv ℝ φ x) (basisVec i)) := by + apply HasCompactSupport.mono' (hφ_compact.fderiv ℝ) + intro x hx + apply subset_tsupport (fderiv ℝ φ) + rw [Function.mem_support] at hx ⊢ + intro h0 + apply hx + rw [h0] + simp + exact (hcont.memLp_of_hasCompactSupport hcs).restrict U + have hφmem : MemLp φ p.conjugate.exponent (volume.restrict U) := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict U + have hlhs := tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp p hDφ hu_n hu htend_u + have hrhs := tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp p hφmem hg_n hgi htend_g + have heq_n : ∀ n, + (∫ x in U, u_n n x * (fderiv ℝ φ x) (basisVec i) ∂volume) + = -(∫ x in U, g_n n x * φ x ∂volume) := + fun n => hweak n φ hφ hφ_compact hφ_sub + have hlhs' : Tendsto + (fun n => -(∫ x in U, g_n n x * φ x ∂volume)) + atTop (nhds (∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume)) := by + refine hlhs.congr ?_ + intro n + rw [heq_n n] + exact tendsto_nhds_unique hlhs' hrhs.neg + +private theorem HasWeakGradientOn.of_tendsto_eLpNorm_finiteLp + {U : Set (Vec d)} (p : FiniteLpExponent) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + {u_n : ℕ → Vec d → ℝ} {Du_n : ℕ → Vec d → Vec d} + (hu : MemLp u p.exponent (volume.restrict U)) + (hDu : GradMemLpOn U p.exponent Du) + (hu_n : ∀ n, MemLp (u_n n) p.exponent (volume.restrict U)) + (hDu_n : ∀ n, GradMemLpOn U p.exponent (Du_n n)) + (hweak : ∀ n, HasWeakGradientOn U (u_n n) (Du_n n)) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_Du : ∀ i, Tendsto + (fun n => eLpNorm (fun x => Du_n n x i - Du x i) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + HasWeakGradientOn U u Du := by + intro i + exact HasWeakPartialDerivOn.of_tendsto_eLpNorm_finiteLp p hu (hDu i) + hu_n (fun n => hDu_n n i) (fun n => hweak n i) htend_u (htend_Du i) + +/-- Data of the finite-`p` even-fold extension. -/ +structure FoldExtensionFiniteP (lo hi : Vec d) (p : FiniteLpExponent) + (u : W1pFunction (Box lo hi) p.exponent) where + Eu : W1pFunction (Box3 lo hi) p.exponent + toFun_ae : Eu.toFun =ᵐ[volume.restrict (Box lo hi)] u.toFun + grad_ae : ∀ i, (fun x => Eu.grad x i) =ᵐ[volume.restrict (Box lo hi)] + fun x => u.grad x i + eLpNorm_le : eLpNorm Eu.toFun p.exponent (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm u.toFun p.exponent (volume.restrict (Box lo hi)) + grad_eLpNorm_le : ∀ i, + eLpNorm (fun x => Eu.grad x i) p.exponent (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box lo hi)) + +private theorem finiteLpExponent_toReal_pos' (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (finiteLpExponent_ne_zero' p) p.lt_top.ne + +/-- The finite-`p` even-fold extension of a Sobolev function on an open axis +box. -/ +def foldExtensionFiniteP {m : ℕ} (lo hi : Vec (m + 1)) (hlt : ∀ k, lo k < hi k) + (p : FiniteLpExponent) (u : W1pFunction (Box lo hi) p.exponent) : + FoldExtensionFiniteP lo hi p u := by + classical + set lo3 : Vec (m + 1) := fun k => 2 * lo k - hi k with hlo3 + set hi3 : Vec (m + 1) := fun k => 2 * hi k - lo k with hhi3 + have hlt3 : ∀ k, lo3 k < hi3 k := fun k => by + simp only [hlo3, hhi3] + linarith [hlt k] + have hbox3 : Box3 lo hi = Box lo3 hi3 := rfl + have hU : IsOpenBoundedConvexDomain (Box lo hi) := isOpenBoundedConvexDomain_Box lo hi + have hFold_cont : Continuous (Fold lo hi) := continuous_Fold lo hi (fun k => (hlt k).le) + have hFold_meas : Measurable (Fold lo hi) := hFold_cont.measurable + set Cd : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ (m + 1)) ^ (1 / p.exponent.toReal) with hCd + have hCd_lt : Cd < ⊤ := + ENNReal.rpow_lt_top_of_nonneg + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos' p).le) + (ENNReal.pow_ne_top (by simp)) + have hg_asm : AEStronglyMeasurable u.toFun (volume.restrict (Box lo hi)) := + u.memLp.aestronglyMeasurable + set g : Vec (m + 1) → ℝ := hg_asm.mk u.toFun with hg_def + have hg_meas : Measurable g := hg_asm.stronglyMeasurable_mk.measurable + have hg_ae : u.toFun =ᵐ[volume.restrict (Box lo hi)] g := hg_asm.ae_eq_mk + have hgi_asm : ∀ i, AEStronglyMeasurable (fun x => u.grad x i) + (volume.restrict (Box lo hi)) := fun i => (u.grad_memLp i).aestronglyMeasurable + set gi : Fin (m + 1) → Vec (m + 1) → ℝ := + fun i => (hgi_asm i).mk (fun x => u.grad x i) with hgi_def + have hgi_meas : ∀ i, Measurable (gi i) := + fun i => (hgi_asm i).stronglyMeasurable_mk.measurable + have hgi_ae : ∀ i, (fun x => u.grad x i) =ᵐ[volume.restrict (Box lo hi)] gi i := + fun i => (hgi_asm i).ae_eq_mk + set x0 : Vec (m + 1) := fun k => (lo k + hi k) / 2 with hx0 + set δ : ℝ := Finset.univ.inf' Finset.univ_nonempty (fun k => hi k - lo k) with hδ + have hδ_pos : 0 < δ := by + rw [hδ, Finset.lt_inf'_iff Finset.univ_nonempty] + exact fun k _ => by linarith [hlt k] + set r : ℝ := δ / 3 with hrdef + have hr : 0 < r := by + rw [hrdef] + linarith + have hball : Metric.closedBall x0 r ⊆ Box lo hi := by + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff hr.le] at hx + refine Set.mem_univ_pi.2 fun k => ?_ + have hxk : dist (x k) (x0 k) ≤ r := hx k + rw [Real.dist_eq, abs_le] at hxk + have hmk : δ ≤ hi k - lo k := Finset.inf'_le _ (Finset.mem_univ k) + simp only [hx0, hrdef] at hxk + exact ⟨by nlinarith [hxk.1], by nlinarith [hxk.2]⟩ + set A : ℕ → W1pFunction (Box lo hi) p.exponent := + W1pFunction.convexApproxSmoothW1p hU p.one_lt.le u x0 hr with hA + have hφ_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (A n).toFun := by + intro n + simp [A, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + exact contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet + (isConvexApproxKernel_unitConvexApproxKernel) p.one_lt.le u.memLp hr + (W1pFunction.unitConvexApproxScale_pos n) + have hφ_grad : ∀ n x i, (A n).grad x i = fderiv ℝ ((A n).toFun) x (basisVec i) := by + intro n x i + simp [A, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + set χ : Vec (m + 1) → ℝ := boxCutoff lo3 hi3 1 with hχ + have hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ := boxCutoff_contDiff + have hχ_cptsupp : HasCompactSupport χ := by + apply HasCompactSupport.intro (K := Set.Icc (fun k => lo3 k - 1) (fun k => hi3 k + 1)) + isCompact_Icc + intro x hx + exact boxCutoff_eq_zero (by norm_num) hx + have hχ_one : ∀ x ∈ Set.Icc lo3 hi3, χ x = 1 := + fun x hx => boxCutoff_eq_one (by norm_num) hx + have hBox_Icc : ∀ x ∈ Box lo hi, x ∈ Set.Icc lo3 hi3 := by + intro x hx + have hx' := Set.mem_univ_pi.1 hx + refine Set.mem_Icc.2 ⟨fun k => ?_, fun k => ?_⟩ + · have := (hx' k).1 + simp only [hlo3] + linarith [hlt k] + · have := (hx' k).2 + simp only [hhi3] + linarith [hlt k] + set wn : ℕ → Vec (m + 1) → ℝ := fun n x => χ x * (A n).toFun x with hwn + have hw_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (wn n) := + fun n => hχ_smooth.mul (hφ_smooth n) + have hw_cont : ∀ n, Continuous (wn n) := fun n => (hw_smooth n).continuous + have hw_meas : ∀ n, Measurable (wn n) := fun n => (hw_cont n).measurable + have hw_cptsupp : ∀ n, HasCompactSupport (wn n) := fun n => hχ_cptsupp.mul_right + have hw_eq_φ : ∀ n, ∀ x ∈ Set.Icc lo3 hi3, wn n x = (A n).toFun x := by + intro n x hx + simp only [hwn, hχ_one x hx, one_mul] + have hfderiv_eq : ∀ n, ∀ y ∈ Box lo hi, + fderiv ℝ (wn n) y = fderiv ℝ ((A n).toFun) y := by + intro n y hy + have hy3 : y ∈ Box3 lo hi := by + rw [hbox3] + refine Set.mem_univ_pi.2 fun k => ?_ + have hyk := Set.mem_univ_pi.1 hy k + exact ⟨by + simp only [hlo3] + linarith [hyk.1, hlt k], by + simp only [hhi3] + linarith [hyk.2, hlt k]⟩ + have hnbhd : Box3 lo hi ∈ 𝓝 y := + (by rw [hbox3]; exact isOpen_Box lo3 hi3 : IsOpen (Box3 lo hi)).mem_nhds hy3 + have heq : wn n =ᶠ[𝓝 y] (A n).toFun := by + refine eventuallyEq_of_mem hnbhd fun x hx => ?_ + refine hw_eq_φ n x ?_ + rw [hbox3] at hx + have hx' := Set.mem_univ_pi.1 hx + exact Set.mem_Icc.2 ⟨fun k => (hx' k).1.le, fun k => (hx' k).2.le⟩ + exact heq.fderiv_eq + have hEu_mem : MemLp (fun x => g (Fold lo hi x)) p.exponent + (volume.restrict (Box3 lo hi)) := by + refine ⟨(hg_meas.comp hFold_meas).aestronglyMeasurable, ?_⟩ + rw [eLpNorm_foldComp_finiteLp p hg_meas lo hi hlt, ← eLpNorm_congr_ae hg_ae] + exact ENNReal.mul_lt_top hCd_lt u.memLp.eLpNorm_lt_top + have hEu_grad_mem : ∀ i, MemLp + (fun x => gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) p.exponent + (volume.restrict (Box3 lo hi)) := by + intro i + refine ⟨(((hgi_meas i).comp hFold_meas).mul + (measurable_foldSign_comp lo hi i)).aestronglyMeasurable, ?_⟩ + refine lt_of_le_of_lt + (eLpNorm_foldComp_mul_foldSign_le_finiteLp p (hgi_meas i) lo hi hlt i) ?_ + rw [← eLpNorm_congr_ae (hgi_ae i)] + exact ENNReal.mul_lt_top hCd_lt (u.grad_memLp i).eLpNorm_lt_top + have hEn_mem : ∀ n, MemLp (fun x => wn n (Fold lo hi x)) p.exponent + (volume.restrict (Box3 lo hi)) := by + intro n + refine ⟨((hw_cont n).comp hFold_cont).aestronglyMeasurable, ?_⟩ + rw [eLpNorm_foldComp_finiteLp p (hw_meas n) lo hi hlt] + have hmem : MemLp (wn n) p.exponent (volume.restrict (Box lo hi)) := + ((hw_cont n).memLp_of_hasCompactSupport (hw_cptsupp n)).restrict _ + exact ENNReal.mul_lt_top hCd_lt hmem.eLpNorm_lt_top + have hDEn_mem : ∀ n, GradMemLpOn (Box3 lo hi) p.exponent + (fun x i => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * + foldSign (lo i) (hi i) (x i)) := by + intro n i + have hcont : Continuous (fun y => fderiv ℝ (wn n) y (basisVec i)) := + (((hw_smooth n).of_le (by exact_mod_cast le_top) : ContDiff ℝ 1 (wn n)).continuous_fderiv + (by simp)).clm_apply continuous_const + refine ⟨((hcont.measurable.comp hFold_meas).mul + (measurable_foldSign_comp lo hi i)).aestronglyMeasurable, ?_⟩ + refine lt_of_le_of_lt + (eLpNorm_foldComp_mul_foldSign_le_finiteLp p hcont.measurable lo hi hlt i) ?_ + have hmem : MemLp (fun y => fderiv ℝ (wn n) y (basisVec i)) p.exponent + (volume.restrict (Box lo hi)) := + (hcont.memLp_of_hasCompactSupport + ((hw_cptsupp n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict _ + exact ENNReal.mul_lt_top hCd_lt hmem.eLpNorm_lt_top + have hweak : ∀ n, HasWeakGradientOn (Box3 lo hi) (fun x => wn n (Fold lo hi x)) + (fun x i => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * + foldSign (lo i) (hi i) (x i)) := by + intro n i + have huniv := hasWeakPartialDerivOn_univ_foldComp + ((hw_smooth n).of_le (by exact_mod_cast le_top)) (hw_cptsupp n) lo hi + (fun k => (hlt k).le) i + exact huniv.restrict (by rw [hbox3]; exact isOpen_Box lo3 hi3) (Set.subset_univ _) + have htend_u : Tendsto (fun n => eLpNorm + (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) p.exponent + (volume.restrict (Box3 lo hi))) atTop (nhds 0) := by + have heq : ∀ n, eLpNorm (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) p.exponent + (volume.restrict (Box3 lo hi)) + = Cd * eLpNorm (fun x => (A n).toFun x - u.toFun x) p.exponent + (volume.restrict (Box lo hi)) := by + intro n + rw [show (fun x => wn n (Fold lo hi x) - g (Fold lo hi x)) + = fun x => (wn n - g) (Fold lo hi x) from rfl, + eLpNorm_foldComp_finiteLp p ((hw_meas n).sub hg_meas) lo hi hlt] + congr 1 + refine eLpNorm_congr_ae ?_ + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hg_ae] with x hxU hgx + have hχ1 : χ x = 1 := hχ_one x (hBox_Icc x hxU) + simp only [Pi.sub_apply, hwn, hχ1, one_mul, hgx] + have hmul : Tendsto + (fun n => Cd * eLpNorm (fun x => (A n).toFun x - u.toFun x) p.exponent + (volume.restrict (Box lo hi))) atTop (nhds (Cd * 0)) := + ENNReal.Tendsto.const_mul + (tendsto_eLpNorm_convexApproxSmoothW1p hU p u hball hr) (Or.inr hCd_lt.ne) + rw [mul_zero] at hmul + exact hmul.congr (fun n => (heq n).symm) + have htend_Du : ∀ i, Tendsto (fun n => eLpNorm + (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * + foldSign (lo i) (hi i) (x i) - + gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + p.exponent (volume.restrict (Box3 lo hi))) atTop (nhds 0) := by + intro i + have hbound : ∀ n, eLpNorm + (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * + foldSign (lo i) (hi i) (x i) - + gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + p.exponent (volume.restrict (Box3 lo hi)) + ≤ Cd * eLpNorm (fun x => (A n).grad x i - u.grad x i) p.exponent + (volume.restrict (Box lo hi)) := by + intro n + rw [show (fun x => fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) * + foldSign (lo i) (hi i) (x i) - + gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + = fun x => (fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) - + gi i (Fold lo hi x)) * foldSign (lo i) (hi i) (x i) by + funext x + ring] + calc + eLpNorm (fun x => (fderiv ℝ (wn n) (Fold lo hi x) (basisVec i) - + gi i (Fold lo hi x)) * foldSign (lo i) (hi i) (x i)) p.exponent + (volume.restrict (Box3 lo hi)) + ≤ Cd * eLpNorm (fun y => fderiv ℝ (wn n) y (basisVec i) - gi i y) + p.exponent (volume.restrict (Box lo hi)) := + eLpNorm_foldComp_mul_foldSign_le_finiteLp p + ((((hw_smooth n).of_le (by exact_mod_cast le_top) : ContDiff ℝ 1 (wn n)).continuous_fderiv + (by simp)).clm_apply continuous_const |>.measurable.sub (hgi_meas i)) lo hi hlt i + _ = Cd * eLpNorm (fun x => (A n).grad x i - u.grad x i) p.exponent + (volume.restrict (Box lo hi)) := by + congr 1 + refine eLpNorm_congr_ae ?_ + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hgi_ae i] + with x hxU hgix + rw [hfderiv_eq n x hxU, ← hφ_grad n x i, ← hgix] + have hrhs : Tendsto + (fun n => Cd * eLpNorm (fun x => (A n).grad x i - u.grad x i) p.exponent + (volume.restrict (Box lo hi))) atTop (nhds 0) := by + have hmul := ENNReal.Tendsto.const_mul + (tendsto_eLpNorm_grad_convexApproxSmoothW1p hU p u hball hr i) + (Or.inr hCd_lt.ne) + simpa using hmul + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun n => zero_le) hbound + exact + { Eu := + { toFun := fun x => g (Fold lo hi x) + grad := fun x i => gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i) + memLp := hEu_mem + gradMemLp := hEu_grad_mem + hasWeakGradient := HasWeakGradientOn.of_tendsto_eLpNorm_finiteLp p + hEu_mem hEu_grad_mem hEn_mem hDEn_mem hweak htend_u htend_Du } + toFun_ae := by + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hg_ae] with x hxU hgx + have hfold : Fold lo hi x = x := + Fold_of_mem fun k => ⟨(Set.mem_univ_pi.1 hxU k).1.le, + (Set.mem_univ_pi.1 hxU k).2.le⟩ + show g (Fold lo hi x) = u.toFun x + rw [hfold, hgx] + grad_ae := fun i => by + filter_upwards [ae_restrict_mem (isOpen_Box lo hi).measurableSet, hgi_ae i] + with x hxU hgix + have hxk := Set.mem_univ_pi.1 hxU i + have hfold : Fold lo hi x = x := + Fold_of_mem fun k => ⟨(Set.mem_univ_pi.1 hxU k).1.le, + (Set.mem_univ_pi.1 hxU k).2.le⟩ + have hsign : foldSign (lo i) (hi i) (x i) = 1 := by + unfold foldSign + rw [if_neg (not_lt.mpr hxk.1.le), if_neg (not_lt.mpr hxk.2.le)] + show gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i) = u.grad x i + rw [hfold, hsign, mul_one, hgix] + eLpNorm_le := le_of_eq (by + rw [eLpNorm_foldComp_finiteLp p hg_meas lo hi hlt, ← eLpNorm_congr_ae hg_ae]) + grad_eLpNorm_le := fun i => by + calc + eLpNorm (fun x => gi i (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + p.exponent (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ (m + 1)) ^ (1 / p.exponent.toReal) * + eLpNorm (gi i) p.exponent (volume.restrict (Box lo hi)) := + eLpNorm_foldComp_mul_foldSign_le_finiteLp p (hgi_meas i) lo hi hlt i + _ = ((3 : ℝ≥0∞) ^ (m + 1)) ^ (1 / p.exponent.toReal) * + eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box lo hi)) := by + congr 1 + rw [← eLpNorm_congr_ae (hgi_ae i)] } + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNorm.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNorm.lean new file mode 100644 index 0000000000..61e4095e6f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNorm.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Fold +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Integral.Lebesgue.Map +public import Mathlib.MeasureTheory.Group.Measure +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.Analysis.SpecialFunctions.Pow.Continuity + +/-! # Fold Norm -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators + +/-! +# Norm transport under the even fold + +The coordinatewise even fold `Fold lo hi : Vec d → Vec d` maps the tripled open +box `Box3 lo hi` onto the box `Box lo hi` in a `3`-to-`1`, piecewise-affine, +measure-preserving way. The load-bearing consequence is the `lintegral` +transport identity + + `∫⁻ x in Box3, g (Fold lo hi x) = 3 ^ d * ∫⁻ x in Box, g x` + +for measurable `g`, and its `L²` corollary + + `eLpNorm (v ∘ Fold) 2 (vol Box3) = (3 ^ d) ^ (1/2) * eLpNorm v 2 (vol Box)`. + +The proof factors through the product structure: each coordinate fold pushes the +restricted Lebesgue measure on the tripled interval forward to `3` copies of the +restricted Lebesgue measure on the base interval, and `Measure.pi_map_pi` +assembles the coordinatewise pushforwards. +-/ + +noncomputable section + +variable {d : ℕ} + +/-- The open axis box `∏ᵢ (loᵢ, hiᵢ)`. -/ +def Box (lo hi : Vec d) : Set (Vec d) := Set.univ.pi fun k => Set.Ioo (lo k) (hi k) + +/-- The tripled open axis box `∏ᵢ (2loᵢ − hiᵢ, 2hiᵢ − loᵢ)`, i.e. the base box +enlarged by its own side length on each face. -/ +def Box3 (lo hi : Vec d) : Set (Vec d) := + Set.univ.pi fun k => Set.Ioo (2 * lo k - hi k) (2 * hi k - lo k) + +theorem measurableSet_Box (lo hi : Vec d) : MeasurableSet (Box lo hi) := + MeasurableSet.univ_pi fun _ => measurableSet_Ioo + +theorem measurableSet_Box3 (lo hi : Vec d) : MeasurableSet (Box3 lo hi) := + MeasurableSet.univ_pi fun _ => measurableSet_Ioo + +/-! ## One-dimensional pushforward -/ + +/-- Reflection `t ↦ c − t` preimage of an open interval. -/ +private theorem preimage_reflect_Ioo (c lo hi : ℝ) : + (fun t => c - t) ⁻¹' Set.Ioo lo hi = Set.Ioo (c - hi) (c - lo) := by + ext t + simp only [Set.mem_preimage, Set.mem_Ioo] + constructor + · rintro ⟨h1, h2⟩; exact ⟨by linarith, by linarith⟩ + · rintro ⟨h1, h2⟩; exact ⟨by linarith, by linarith⟩ + +/-- **1-D fold pushforward.** The scalar fold pushes the restricted Lebesgue +measure on the tripled interval forward to `3` copies of the restricted +Lebesgue measure on the base interval. -/ +theorem map_foldR_restrict (lo hi : ℝ) (h : lo < hi) : + (volume.restrict (Set.Ioo (2 * lo - hi) (2 * hi - lo))).map (foldR lo hi) + = (3 : ℝ≥0∞) • volume.restrict (Set.Ioo lo hi) := by + have hfold_meas : Measurable (foldR lo hi) := (continuous_foldR lo hi h.le).measurable + -- the tripled interval agrees a.e. with the union of the three affine branches + have hdisjLM : Disjoint (Set.Ioo (2 * lo - hi) lo) (Set.Ioo lo hi) := by + rw [Set.disjoint_left]; rintro t ⟨_, ht2⟩ ⟨ht3, _⟩; exact absurd ht3 (not_lt.mpr ht2.le) + have hdisjMR : Disjoint (Set.Ioo lo hi) (Set.Ioo hi (2 * hi - lo)) := by + rw [Set.disjoint_left]; rintro t ⟨_, ht2⟩ ⟨ht3, _⟩; exact absurd ht3 (not_lt.mpr ht2.le) + have hdisjLMR : Disjoint (Set.Ioo (2 * lo - hi) lo ∪ Set.Ioo lo hi) + (Set.Ioo hi (2 * hi - lo)) := by + rw [Set.disjoint_union_left] + refine ⟨?_, hdisjMR⟩ + rw [Set.disjoint_left]; rintro t ⟨_, ht2⟩ ⟨ht3, _⟩; linarith + have hset : Set.Ioo (2 * lo - hi) (2 * hi - lo) + =ᵐ[volume] ((Set.Ioo (2 * lo - hi) lo ∪ Set.Ioo lo hi ∪ Set.Ioo hi (2 * hi - lo)) : Set ℝ) := by + have hsub1 : (Set.Ioo (2 * lo - hi) lo ∪ Set.Ioo lo hi ∪ Set.Ioo hi (2 * hi - lo)) + ⊆ Set.Ioo (2 * lo - hi) (2 * hi - lo) := by + intro t ht + rcases ht with (h' | h') | h' + · exact ⟨h'.1, by have := h'.2; linarith⟩ + · exact ⟨by have := h'.1; linarith, by have := h'.2; linarith⟩ + · exact ⟨by have := h'.1; linarith, h'.2⟩ + have hsub2 : Set.Ioo (2 * lo - hi) (2 * hi - lo) + \ (Set.Ioo (2 * lo - hi) lo ∪ Set.Ioo lo hi ∪ Set.Ioo hi (2 * hi - lo)) + ⊆ ({lo, hi} : Set ℝ) := by + intro t ht + obtain ⟨⟨htL, htR⟩, htn⟩ := ht + simp only [Set.mem_union, not_or] at htn + obtain ⟨⟨hnL, hnM⟩, hnR⟩ := htn + simp only [Set.mem_Ioo, not_and_or, not_lt] at hnL hnM hnR + rcases hnM with hM | hM + · rcases hnL with hL | hL + · exact absurd hL (not_le.mpr htL) + · simp only [Set.mem_insert_iff, Set.mem_singleton_iff]; left; linarith + · rcases hnR with hR | hR + · simp only [Set.mem_insert_iff, Set.mem_singleton_iff]; right; linarith + · exact absurd hR (not_le.mpr htR) + refine (MeasureTheory.ae_eq_set.2 ⟨?_, ?_⟩).symm + · have hemp : (Set.Ioo (2 * lo - hi) lo ∪ Set.Ioo lo hi ∪ Set.Ioo hi (2 * hi - lo)) + \ Set.Ioo (2 * lo - hi) (2 * hi - lo) = ∅ := Set.sdiff_eq_empty.2 hsub1 + rw [hemp]; simp + · exact measure_mono_null hsub2 + (Set.Finite.measure_zero ((Set.finite_singleton hi).insert lo) volume) + have hrestrict : volume.restrict (Set.Ioo (2 * lo - hi) (2 * hi - lo)) + = volume.restrict (Set.Ioo (2 * lo - hi) lo) + volume.restrict (Set.Ioo lo hi) + + volume.restrict (Set.Ioo hi (2 * hi - lo)) := by + rw [Measure.restrict_congr_set hset, + Measure.restrict_union hdisjLMR measurableSet_Ioo, + Measure.restrict_union hdisjLM measurableSet_Ioo] + -- fold agrees with the affine branch on each piece + have hcongrL : (volume.restrict (Set.Ioo (2 * lo - hi) lo)).map (foldR lo hi) + = (volume.restrict (Set.Ioo (2 * lo - hi) lo)).map (fun t => 2 * lo - t) := by + refine Measure.map_congr ((MeasureTheory.ae_restrict_iff' measurableSet_Ioo).2 + (Filter.Eventually.of_forall ?_)) + intro t ht; unfold foldR; rw [if_pos ht.2] + have hcongrM : (volume.restrict (Set.Ioo lo hi)).map (foldR lo hi) + = (volume.restrict (Set.Ioo lo hi)).map id := by + refine Measure.map_congr ((MeasureTheory.ae_restrict_iff' measurableSet_Ioo).2 + (Filter.Eventually.of_forall ?_)) + intro t ht; simp only [id]; exact foldR_of_mem ht.1.le ht.2.le + have hcongrR : (volume.restrict (Set.Ioo hi (2 * hi - lo))).map (foldR lo hi) + = (volume.restrict (Set.Ioo hi (2 * hi - lo))).map (fun t => 2 * hi - t) := by + refine Measure.map_congr ((MeasureTheory.ae_restrict_iff' measurableSet_Ioo).2 + (Filter.Eventually.of_forall ?_)) + intro t ht; unfold foldR + rw [if_neg (not_lt.mpr (le_of_lt (lt_trans h ht.1))), if_pos ht.1] + -- each affine branch maps onto the base interval + have hmpL : Measure.map (fun t => 2 * lo - t) volume = volume := + (volume.measurePreserving_sub_left (2 * lo)).map_eq + have hmpR : Measure.map (fun t => 2 * hi - t) volume = volume := + (volume.measurePreserving_sub_left (2 * hi)).map_eq + have hmeasL : Measurable (fun t : ℝ => 2 * lo - t) := by fun_prop + have hmeasR : Measurable (fun t : ℝ => 2 * hi - t) := by fun_prop + have hbranchL : (volume.restrict (Set.Ioo (2 * lo - hi) lo)).map (fun t => 2 * lo - t) + = volume.restrict (Set.Ioo lo hi) := by + have hpre : (fun t => 2 * lo - t) ⁻¹' Set.Ioo lo hi = Set.Ioo (2 * lo - hi) lo := by + rw [preimage_reflect_Ioo] + congr + all_goals ring + calc (volume.restrict (Set.Ioo (2 * lo - hi) lo)).map (fun t => 2 * lo - t) + = (volume.restrict ((fun t => 2 * lo - t) ⁻¹' Set.Ioo lo hi)).map (fun t => 2 * lo - t) := by + rw [hpre] + _ = (volume.map (fun t => 2 * lo - t)).restrict (Set.Ioo lo hi) := + (Measure.restrict_map hmeasL measurableSet_Ioo).symm + _ = volume.restrict (Set.Ioo lo hi) := by rw [hmpL] + have hbranchR : (volume.restrict (Set.Ioo hi (2 * hi - lo))).map (fun t => 2 * hi - t) + = volume.restrict (Set.Ioo lo hi) := by + have hpre : (fun t => 2 * hi - t) ⁻¹' Set.Ioo lo hi = Set.Ioo hi (2 * hi - lo) := by + rw [preimage_reflect_Ioo] + congr + all_goals ring + calc (volume.restrict (Set.Ioo hi (2 * hi - lo))).map (fun t => 2 * hi - t) + = (volume.restrict ((fun t => 2 * hi - t) ⁻¹' Set.Ioo lo hi)).map (fun t => 2 * hi - t) := by + rw [hpre] + _ = (volume.map (fun t => 2 * hi - t)).restrict (Set.Ioo lo hi) := + (Measure.restrict_map hmeasR measurableSet_Ioo).symm + _ = volume.restrict (Set.Ioo lo hi) := by rw [hmpR] + have hbranchM : (volume.restrict (Set.Ioo lo hi)).map id = volume.restrict (Set.Ioo lo hi) := by + rw [Measure.map_id] + rw [hrestrict, Measure.map_add _ _ hfold_meas, Measure.map_add _ _ hfold_meas, + hcongrL, hcongrM, hcongrR, hbranchL, hbranchM, hbranchR, + show (3 : ℝ≥0∞) = 1 + 1 + 1 by norm_num, add_smul, add_smul, one_smul] + +/-! ## Product assembly -/ + +/-- Scaling each factor of a finite product measure by `c` scales the product by +`c ^ card`. -/ +theorem pi_smul_const {ι : Type*} [Fintype ι] {α : ι → Type*} + [∀ i, MeasurableSpace (α i)] (ρ : ∀ i, Measure (α i)) [∀ i, SigmaFinite (ρ i)] + {c : ℝ≥0∞} [∀ i, SigmaFinite (c • ρ i)] : + Measure.pi (fun i => c • ρ i) = c ^ (Fintype.card ι) • Measure.pi ρ := by + refine Measure.pi_eq fun s hs => ?_ + rw [Measure.smul_apply, smul_eq_mul, Measure.pi_pi] + simp only [Measure.smul_apply, smul_eq_mul, Finset.prod_mul_distrib, Finset.prod_const, + Finset.card_univ] + +/-- **`d`-dimensional fold pushforward.** The coordinatewise fold pushes the +restricted Lebesgue measure on the tripled box forward to `3 ^ d` copies of the +restricted Lebesgue measure on the base box. -/ +theorem map_Fold_restrict (lo hi : Vec d) (hlt : ∀ k, lo k < hi k) : + (volume.restrict (Box3 lo hi)).map (Fold lo hi) + = (3 : ℝ≥0∞) ^ d • volume.restrict (Box lo hi) := by + have hvol : (volume : Measure (Vec d)) = Measure.pi fun _ => volume := volume_pi + have hFoldEq : Fold lo hi = (fun (x : Vec d) k => foldR (lo k) (hi k) (x k)) := rfl + have hσ3 : ∀ k : Fin d, SigmaFinite ((3 : ℝ≥0∞) • volume.restrict (Set.Ioo (lo k) (hi k))) := + fun k => by + have : IsFiniteMeasure ((3 : ℝ≥0∞) • volume.restrict (Set.Ioo (lo k) (hi k))) := + ⟨by rw [Measure.smul_apply, smul_eq_mul, Measure.restrict_apply_univ, Real.volume_Ioo] + exact ENNReal.mul_lt_top (by simp) ENNReal.ofReal_lt_top⟩ + infer_instance + have hσmap : ∀ k : Fin d, SigmaFinite + ((volume.restrict (Set.Ioo (2 * lo k - hi k) (2 * hi k - lo k))).map (foldR (lo k) (hi k))) := + fun k => by rw [map_foldR_restrict (lo k) (hi k) (hlt k)]; exact hσ3 k + have hfam : (fun k => (volume.restrict + (Set.Ioo (2 * lo k - hi k) (2 * hi k - lo k))).map (foldR (lo k) (hi k))) + = (fun k => (3 : ℝ≥0∞) • volume.restrict (Set.Ioo (lo k) (hi k))) := by + funext k; exact map_foldR_restrict (lo k) (hi k) (hlt k) + calc (volume.restrict (Box3 lo hi)).map (Fold lo hi) + = (Measure.pi (fun k => volume.restrict (Set.Ioo (2 * lo k - hi k) (2 * hi k - lo k)))).map + (fun (x : Vec d) k => foldR (lo k) (hi k) (x k)) := by + rw [Box3, hvol, Measure.restrict_pi_pi, hFoldEq] + _ = Measure.pi (fun k => (volume.restrict + (Set.Ioo (2 * lo k - hi k) (2 * hi k - lo k))).map (foldR (lo k) (hi k))) := + Measure.pi_map_pi (f := fun k => foldR (lo k) (hi k)) + (fun k => (continuous_foldR (lo k) (hi k) (hlt k).le).measurable.aemeasurable) + _ = (3 : ℝ≥0∞) ^ d • Measure.pi (fun k => volume.restrict (Set.Ioo (lo k) (hi k))) := by + rw [hfam, pi_smul_const, Fintype.card_fin] + _ = (3 : ℝ≥0∞) ^ d • volume.restrict (Box lo hi) := by + rw [Box, hvol, Measure.restrict_pi_pi] + +/-! ## `lintegral` and `eLpNorm` transport -/ + +/-- **`lintegral` fold transport.** -/ +theorem lintegral_foldComp {g : Vec d → ℝ≥0∞} (hg : Measurable g) + (lo hi : Vec d) (hlt : ∀ k, lo k < hi k) : + ∫⁻ x in Box3 lo hi, g (Fold lo hi x) + = (3 : ℝ≥0∞) ^ d * ∫⁻ x in Box lo hi, g x := by + have hfold_meas : Measurable (Fold lo hi) := + (continuous_Fold lo hi (fun k => (hlt k).le)).measurable + calc ∫⁻ x in Box3 lo hi, g (Fold lo hi x) + = ∫⁻ y, g y ∂((volume.restrict (Box3 lo hi)).map (Fold lo hi)) := + (lintegral_map hg hfold_meas).symm + _ = ∫⁻ y, g y ∂((3 : ℝ≥0∞) ^ d • volume.restrict (Box lo hi)) := by + rw [map_Fold_restrict lo hi hlt] + _ = (3 : ℝ≥0∞) ^ d * ∫⁻ x in Box lo hi, g x := lintegral_smul_measure _ _ + +/-- **`L²` fold transport.** The `L²(Box3)` norm of `v ∘ Fold` equals +`(3 ^ d) ^ (1/2)` times the `L²(Box)` norm of `v`. -/ +theorem eLpNorm_foldComp {v : Vec d → ℝ} (hv : Measurable v) + (lo hi : Vec d) (hlt : ∀ k, lo k < hi k) : + eLpNorm (fun x => v (Fold lo hi x)) 2 (volume.restrict (Box3 lo hi)) + = ((3 : ℝ≥0∞) ^ d) ^ ((1 : ℝ) / 2) * eLpNorm v 2 (volume.restrict (Box lo hi)) := by + have hcomp : AEStronglyMeasurable (fun x => v (Fold lo hi x)) + (volume.restrict (Box3 lo hi)) := + (hv.comp (continuous_Fold lo hi (fun k => (hlt k).le)).measurable).aestronglyMeasurable + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num) hcomp, + eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num) hv.aestronglyMeasurable] + have hpt : (2 : ℝ≥0∞).toReal = 2 := by norm_num + rw [hpt] + have hgmeas : Measurable (fun x : Vec d => ‖v x‖ₑ ^ (2 : ℝ)) := + (ENNReal.continuous_rpow_const).measurable.comp hv.enorm + have htrans : ∫⁻ x in Box3 lo hi, ‖v (Fold lo hi x)‖ₑ ^ (2 : ℝ) + = (3 : ℝ≥0∞) ^ d * ∫⁻ x in Box lo hi, ‖v x‖ₑ ^ (2 : ℝ) := + lintegral_foldComp (g := fun x => ‖v x‖ₑ ^ (2 : ℝ)) hgmeas lo hi hlt + rw [htrans, ENNReal.mul_rpow_of_nonneg _ _ (by norm_num : (0 : ℝ) ≤ 1 / 2)] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNormFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNormFiniteP.lean new file mode 100644 index 0000000000..adae74ebf3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldNormFiniteP.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Finite-`p` norm transport under the even fold + +This module upgrades the exact `L²` transport in `FoldNorm` to every finite +exponent used by the `W^{1,p}` development. The measure transport itself +remains `lintegral_foldComp`; only the outer `p`-th root is new here. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators + +noncomputable section + +variable {d : ℕ} + +private theorem finiteLpExponent_ne_zero (p : FiniteLpExponent) : p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (finiteLpExponent_ne_zero p) p.lt_top.ne + +/-- Exact finite-`p` norm transport for composition with the coordinatewise +even fold. -/ +theorem eLpNorm_foldComp_finiteLp {v : Vec d → ℝ} (p : FiniteLpExponent) + (hv : Measurable v) (lo hi : Vec d) (hlt : ∀ k, lo k < hi k) : + eLpNorm (fun x => v (Fold lo hi x)) p.exponent (volume.restrict (Box3 lo hi)) + = ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm v p.exponent (volume.restrict (Box lo hi)) := by + have hcomp : AEStronglyMeasurable (fun x => v (Fold lo hi x)) + (volume.restrict (Box3 lo hi)) := + (hv.comp (continuous_Fold lo hi (fun k => (hlt k).le)).measurable).aestronglyMeasurable + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal (finiteLpExponent_ne_zero p) p.lt_top.ne hcomp, + eLpNorm_eq_lintegral_rpow_enorm_toReal (finiteLpExponent_ne_zero p) p.lt_top.ne + hv.aestronglyMeasurable] + have hgmeas : Measurable (fun x : Vec d => ‖v x‖ₑ ^ p.exponent.toReal) := + ENNReal.continuous_rpow_const.measurable.comp hv.enorm + have htrans : ∫⁻ x in Box3 lo hi, ‖v (Fold lo hi x)‖ₑ ^ p.exponent.toReal + = (3 : ℝ≥0∞) ^ d * ∫⁻ x in Box lo hi, ‖v x‖ₑ ^ p.exponent.toReal := + lintegral_foldComp (g := fun x => ‖v x‖ₑ ^ p.exponent.toReal) hgmeas lo hi hlt + rw [htrans, ENNReal.mul_rpow_of_nonneg _ _ + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos p).le)] + +/-- A coordinate derivative transported by the fold, including its reflection +sign, has no larger finite-`p` norm than the exactly scaled original field. -/ +theorem eLpNorm_foldComp_mul_foldSign_le_finiteLp {D : Vec d → ℝ} + (p : FiniteLpExponent) (hD : Measurable D) (lo hi : Vec d) + (hlt : ∀ k, lo k < hi k) (i : Fin d) : + eLpNorm (fun x => D (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + p.exponent (volume.restrict (Box3 lo hi)) + ≤ ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm D p.exponent (volume.restrict (Box lo hi)) := by + calc + eLpNorm (fun x => D (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + p.exponent (volume.restrict (Box3 lo hi)) + ≤ eLpNorm (fun x => D (Fold lo hi x)) p.exponent + (volume.restrict (Box3 lo hi)) := by + have hsign : Measurable (foldSign (lo i) (hi i)) := by + unfold foldSign + refine Measurable.ite (measurableSet_lt measurable_id measurable_const) + measurable_const ?_ + exact Measurable.ite (measurableSet_lt measurable_const measurable_id) + measurable_const measurable_const + have hmeas : AEStronglyMeasurable + (fun x => D (Fold lo hi x) * foldSign (lo i) (hi i) (x i)) + (volume.restrict (Box3 lo hi)) := + ((hD.comp (continuous_Fold lo hi (fun k => (hlt k).le)).measurable).mul + (hsign.comp (measurable_pi_apply i))).aestronglyMeasurable + refine eLpNorm_mono hmeas (fun x => ?_) + rw [norm_mul] + exact mul_le_of_le_one_right (norm_nonneg _) (by + unfold foldSign + split_ifs <;> norm_num) + _ = ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm D p.exponent (volume.restrict (Box lo hi)) := + eLpNorm_foldComp_finiteLp p hD lo hi hlt + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldTransport.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldTransport.lean new file mode 100644 index 0000000000..ba0b0706a2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/FoldTransport.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FaceReflectionMain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Fold + +/-! # Fold Transport -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory +open scoped BigOperators + +/-! +# Weak gradient of the fold extension + +The extension `x ↦ v (Fold lo hi x)` of a globally `C¹`, compactly supported `v` +has weak `j`-th partial derivative `(∂ⱼv)(Fold x) · foldSignⱼ(x)` on all of +`Vec (n+1)`. Along a `j`-line only the `j`-th fold varies (two kinks), so the +`d`-dimensional statement reduces to the single-face reflection with two-kink +integration by parts. +-/ + +noncomputable section + +variable {n : ℕ} + +/-- **Per-line identity for the fold extension.** Along the `j`-line the fold +extension integrates by parts across its two kinks with the signed candidate +derivative and no boundary term. -/ +private theorem foldComp_line_integral {v : Vec (n + 1) → ℝ} + (hv : ContDiff ℝ 1 v) {φ : Vec (n + 1) → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφc : HasCompactSupport φ) + (lo hi : Vec (n + 1)) (hlohi : ∀ k, lo k ≤ hi k) (j : Fin (n + 1)) (z : Vec n) : + (∫ t, v (Fold lo hi (j.insertNth t z)) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = -(∫ t, ((fderiv ℝ v (Fold lo hi (j.insertNth t z))) (basisVec j) + * foldSign (lo j) (hi j) ((j.insertNth t z : Vec (n + 1)) j)) * φ (j.insertNth t z)) := by + have hvd : Differentiable ℝ v := hv.differentiable (by simp) + have hvf : Continuous (fderiv ℝ v) := hv.continuous_fderiv (by simp) + have hφd : Differentiable ℝ φ := hφ.differentiable (by simp) + have hφf : Continuous (fderiv ℝ φ) := hφ.continuous_fderiv (by simp) + set w : Vec n := fun m => foldR (lo (j.succAbove m)) (hi (j.succAbove m)) (z m) with hw + -- line continuities + have hlineDir : Continuous (fun t : ℝ => (j.insertNth t w : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => (hasDerivAt_insertNth j w t).continuousAt + have hlineLo : Continuous (fun t : ℝ => (j.insertNth (2 * lo j - t) w : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => + (hasDerivAt_insertNth_reflect (lo j) j w t).continuousAt + have hlineHi : Continuous (fun t : ℝ => (j.insertNth (2 * hi j - t) w : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => + (hasDerivAt_insertNth_reflect (hi j) j w t).continuousAt + have hlineφ : Continuous (fun t : ℝ => (j.insertNth t z : Vec (n + 1))) := + continuous_iff_continuousAt.2 fun t => (hasDerivAt_insertNth j z t).continuousAt + -- branch derivatives + have hd₂ : ∀ t, HasDerivAt (fun s => v (j.insertNth s w)) + ((fderiv ℝ v (j.insertNth t w)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hvd j w t + have hd₁ : ∀ t, HasDerivAt (fun s => v (j.insertNth (2 * lo j - s) w)) + ((fderiv ℝ v (j.insertNth (2 * lo j - t) w)) (-basisVec j)) t := + fun t => hasDerivAt_comp_insertNth_reflect hvd (lo j) j w t + have hd₃ : ∀ t, HasDerivAt (fun s => v (j.insertNth (2 * hi j - s) w)) + ((fderiv ℝ v (j.insertNth (2 * hi j - t) w)) (-basisVec j)) t := + fun t => hasDerivAt_comp_insertNth_reflect hvd (hi j) j w t + have hc₂ : Continuous (fun t => (fderiv ℝ v (j.insertNth t w)) (basisVec j)) := + (hvf.comp hlineDir).clm_apply continuous_const + have hc₁ : Continuous (fun t => (fderiv ℝ v (j.insertNth (2 * lo j - t) w)) (-basisVec j)) := + (hvf.comp hlineLo).clm_apply continuous_const + have hc₃ : Continuous (fun t => (fderiv ℝ v (j.insertNth (2 * hi j - t) w)) (-basisVec j)) := + (hvf.comp hlineHi).clm_apply continuous_const + have hφL_deriv : ∀ t, HasDerivAt (fun s => φ (j.insertNth s z)) + ((fderiv ℝ φ (j.insertNth t z)) (basisVec j)) t := + fun t => hasDerivAt_comp_insertNth hφd j z t + have hcφ : Continuous (fun t => (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) := + (hφf.comp hlineφ).clm_apply continuous_const + have hφL_cs : HasCompactSupport (fun t => φ (j.insertNth t z)) := + hasCompactSupport_insertNth_line hφc j z + -- matching at the two kinks + have hm₁ : v (j.insertNth (2 * lo j - lo j) w) = v (j.insertNth (lo j) w) := by + rw [show (2 * lo j - lo j : ℝ) = lo j by ring] + have hm₂ : v (j.insertNth (hi j) w) = v (j.insertNth (2 * hi j - hi j) w) := by + rw [show (2 * hi j - hi j : ℝ) = hi j by ring] + -- two-kink integration by parts + have hkey := integral_mul_deriv_two_kink_eq_neg (lo j) (hi j) (hlohi j) + hd₁ hc₁ hd₂ hc₂ hd₃ hc₃ hm₁ hm₂ hφL_deriv hcφ hφL_cs + -- rewrite the fold extension to the two-kink form on the line + have hF : ∀ t, v (Fold lo hi (j.insertNth t z)) + = (if t < lo j then v (j.insertNth (2 * lo j - t) w) + else if hi j < t then v (j.insertNth (2 * hi j - t) w) else v (j.insertNth t w)) := by + intro t + rw [Fold_insertNth, ← hw] + unfold foldR + by_cases h1 : t < lo j + · rw [if_pos h1, if_pos h1] + · rw [if_neg h1, if_neg h1] + by_cases h2 : hi j < t + · rw [if_pos h2, if_pos h2] + · rw [if_neg h2, if_neg h2] + -- rewrite the piecewise derivative to the candidate gradient on the line + have hG : ∀ t, + (if t < lo j then (fderiv ℝ v (j.insertNth (2 * lo j - t) w)) (-basisVec j) + else if hi j < t then (fderiv ℝ v (j.insertNth (2 * hi j - t) w)) (-basisVec j) + else (fderiv ℝ v (j.insertNth t w)) (basisVec j)) + = (fderiv ℝ v (Fold lo hi (j.insertNth t z))) (basisVec j) + * foldSign (lo j) (hi j) ((j.insertNth t z : Vec (n + 1)) j) := by + intro t + rw [Fin.insertNth_apply_same, Fold_insertNth, ← hw] + unfold foldR foldSign + by_cases h1 : t < lo j + · rw [if_pos h1, if_pos h1, if_pos h1, map_neg]; ring + · rw [if_neg h1, if_neg h1, if_neg h1] + by_cases h2 : hi j < t + · rw [if_pos h2, if_pos h2, if_pos h2, map_neg]; ring + · rw [if_neg h2, if_neg h2, if_neg h2]; ring + -- assemble + have e1 : (∫ t, v (Fold lo hi (j.insertNth t z)) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j)) + = ∫ t, (if t < lo j then v (j.insertNth (2 * lo j - t) w) + else if hi j < t then v (j.insertNth (2 * hi j - t) w) else v (j.insertNth t w)) + * (fderiv ℝ φ (j.insertNth t z)) (basisVec j) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hF t]) + have e2 : (∫ t, (if t < lo j then (fderiv ℝ v (j.insertNth (2 * lo j - t) w)) (-basisVec j) + else if hi j < t then (fderiv ℝ v (j.insertNth (2 * hi j - t) w)) (-basisVec j) + else (fderiv ℝ v (j.insertNth t w)) (basisVec j)) * φ (j.insertNth t z)) + = ∫ t, ((fderiv ℝ v (Fold lo hi (j.insertNth t z))) (basisVec j) + * foldSign (lo j) (hi j) ((j.insertNth t z : Vec (n + 1)) j)) * φ (j.insertNth t z) := + integral_congr_ae (Filter.Eventually.of_forall fun t => by simp only [hG t]) + rw [e1, hkey, e2] + +/-- **Weak-gradient transport for the fold extension.** +For `v : Vec (n+1) → ℝ` globally `C¹` with compact support and a box `[lo, hi]`, +the extension `x ↦ v (Fold lo hi x)` has weak `j`-th partial derivative +`(∂ⱼv)(Fold x) · foldSignⱼ(x)` on all of `Vec (n+1)`, for every `j`. -/ +theorem hasWeakPartialDerivOn_univ_foldComp {v : Vec (n + 1) → ℝ} + (hv : ContDiff ℝ 1 v) (hvc : HasCompactSupport v) + (lo hi : Vec (n + 1)) (hlohi : ∀ k, lo k ≤ hi k) (j : Fin (n + 1)) : + HasWeakPartialDerivOn Set.univ j (fun x => v (Fold lo hi x)) + (fun x => (fderiv ℝ v (Fold lo hi x)) (basisVec j) + * foldSign (lo j) (hi j) (x j)) := by + intro φ hφ hφc _hφsub + have hvf : Continuous (fderiv ℝ v) := hv.continuous_fderiv (by simp) + have hφf : Continuous (fderiv ℝ φ) := hφ.continuous_fderiv (by simp) + have hFold_cont : Continuous (Fold lo hi) := continuous_Fold lo hi hlohi + have hvFold_cont : Continuous (fun x => v (Fold lo hi x)) := hv.continuous.comp hFold_cont + have hDφ_cont : Continuous (fun x => (fderiv ℝ φ x) (basisVec j)) := + hφf.clm_apply continuous_const + have hDφ_cs : HasCompactSupport (fun x => (fderiv ℝ φ x) (basisVec j)) := + hφc.fderiv_apply (𝕜 := ℝ) (basisVec j) + -- LHS integrable (product with the compactly supported test derivative) + have hF_int : Integrable + (fun x => v (Fold lo hi x) * (fderiv ℝ φ x) (basisVec j)) + (volume : Measure (Vec (n + 1))) := + (hvFold_cont.mul hDφ_cont).integrable_of_hasCompactSupport hDφ_cs.mul_left + -- candidate gradient: measurable and bounded + have hb1_cont : Continuous (fun x => (fderiv ℝ v x) (basisVec j)) := + hvf.clm_apply continuous_const + have hb1_cs : HasCompactSupport (fun x => (fderiv ℝ v x) (basisVec j)) := + hvc.fderiv_apply (𝕜 := ℝ) (basisVec j) + obtain ⟨M, hM0, hMbound⟩ := + exists_norm_bound_of_continuous_hasCompactSupport hb1_cont hb1_cs + have hfst_cont : Continuous (fun x => (fderiv ℝ v (Fold lo hi x)) (basisVec j)) := + (hvf.comp hFold_cont).clm_apply continuous_const + have hsign_meas : Measurable (foldSign (lo j) (hi j)) := by + unfold foldSign + refine Measurable.ite (measurableSet_lt measurable_id measurable_const) measurable_const ?_ + exact Measurable.ite (measurableSet_lt measurable_const measurable_id) + measurable_const measurable_const + have hGj_meas : Measurable (fun x => (fderiv ℝ v (Fold lo hi x)) (basisVec j) + * foldSign (lo j) (hi j) (x j)) := + hfst_cont.measurable.mul (hsign_meas.comp (measurable_pi_apply j)) + have hGj_bound : ∀ x, ‖(fderiv ℝ v (Fold lo hi x)) (basisVec j) + * foldSign (lo j) (hi j) (x j)‖ ≤ M := by + intro x + rw [norm_mul] + have hsign : ‖foldSign (lo j) (hi j) (x j)‖ ≤ 1 := by + unfold foldSign + by_cases h1 : x j < lo j + · rw [if_pos h1]; simp + · rw [if_neg h1]; by_cases h2 : hi j < x j + · rw [if_pos h2]; simp + · rw [if_neg h2]; simp + calc ‖(fderiv ℝ v (Fold lo hi x)) (basisVec j)‖ * ‖foldSign (lo j) (hi j) (x j)‖ + ≤ M * 1 := by + apply mul_le_mul (hMbound _) hsign (norm_nonneg _) hM0 + _ = M := mul_one M + have hφ_int : Integrable φ (volume : Measure (Vec (n + 1))) := + hφ.continuous.integrable_of_hasCompactSupport hφc + have hG_int : Integrable + (fun x => ((fderiv ℝ v (Fold lo hi x)) (basisVec j) * foldSign (lo j) (hi j) (x j)) + * φ x) (volume : Measure (Vec (n + 1))) := + hφ_int.bdd_mul hGj_meas.aestronglyMeasurable (Filter.Eventually.of_forall hGj_bound) + -- peel coordinate `j`, reduce to per-line identities + rw [MeasureTheory.setIntegral_univ, MeasureTheory.setIntegral_univ, + integral_peel_coord j hF_int, integral_peel_coord j hG_int, ← integral_neg] + refine integral_congr_ae (Filter.Eventually.of_forall fun z => ?_) + exact foldComp_line_integral hv hφ hφc lo hi hlohi j z + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolev.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolev.lean new file mode 100644 index 0000000000..34bcd59068 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolev.lean @@ -0,0 +1,77 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.FunctionalSpaces.SobolevInequality +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic + +/-! # Gagliardo Nirenberg Sobolev -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal NNReal + +/-! +# Gagliardo–Nirenberg–Sobolev at the ambient `Vec d` + +Instantiates mathlib's Gagliardo–Nirenberg–Sobolev inequality +(`MeasureTheory.eLpNorm_le_eLpNorm_fderiv_of_eq`) at the ambient +`Vec d = Fin d → ℝ` with Lebesgue `volume`, codomain `ℝ`, `p = 2`, and target +the critical exponent `2* = 2d/(d−2)`. It records that `Vec d` carries every +typeclass the inequality needs (finite-dimensional, Borel, Haar `volume`) +without any detour through `EuclideanSpace`/`PiLp`, that +`Module.finrank ℝ (Vec d) = d`, and the exponent bookkeeping +`1/2* = 1/2 − 1/d` for `d ≥ 3`. + +This is the form fed to each smooth compactly supported approximant in the cube +Sobolev embedding. +-/ + +noncomputable section + +/-- The critical Sobolev exponent `2* = 2d/(d−2)`, as an `ℝ≥0`. +For `d ≥ 3` this is a genuine exponent `> 2`. -/ +def twoStar (d : ℕ) : ℝ≥0 := (2 * d) / (d - 2) + +/-- `Vec d` has finite rank `d` (sanity fact used to discharge the GNS +finrank side-conditions). -/ +theorem finrank_vec (d : ℕ) : Module.finrank ℝ (Homogenization.Vec d) = d := by + simp [Homogenization.Vec] + +/-- **Gagliardo–Nirenberg–Sobolev at `Vec d`.** +For `d ≥ 3` and a `C¹`, compactly supported real function `u` on `Vec d`, the +`L^{2*}` norm of `u` (w.r.t. Lebesgue `volume`) is controlled by the `L²` norm +of its Fréchet derivative, with the mathlib GNS constant. + +This is the form invoked on each smooth compactly supported approximant in the +reflection route. It certifies the exponent arithmetic `1/2* = 1/2 − 1/d` and +that `Vec d` satisfies every hypothesis of `eLpNorm_le_eLpNorm_fderiv_of_eq` +with no `EuclideanSpace` routing. -/ +theorem gns_contDiff_compactSupport + {d : ℕ} (hd : 3 ≤ d) {u : Homogenization.Vec d → ℝ} + (hu : ContDiff ℝ 1 u) (h2u : HasCompactSupport u) : + eLpNorm u (twoStar d) (volume : Measure (Homogenization.Vec d)) + ≤ SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Homogenization.Vec d)) (2 : ℝ≥0) + * eLpNorm (fderiv ℝ u) 2 (volume : Measure (Homogenization.Vec d)) := by + have hfr : Module.finrank ℝ (Homogenization.Vec d) = d := finrank_vec d + refine eLpNorm_le_eLpNorm_fderiv_of_eq volume hu h2u (p := 2) (p' := twoStar d) + (by norm_num) (by rw [hfr]; omega) ?_ + rw [hfr] + -- exponent bookkeeping: (2*)⁻¹ = 2⁻¹ − d⁻¹ + have hdle : (2 : ℝ≥0) ≤ (d : ℝ≥0) := by exact_mod_cast (by omega : 2 ≤ d) + have hd3 : (3 : ℝ) ≤ (d : ℝ) := by exact_mod_cast (by omega : 3 ≤ d) + have hpos : (0 : ℝ) < (d : ℝ) - 2 := by linarith + rw [twoStar, NNReal.coe_inv, NNReal.coe_div, NNReal.coe_sub hdle] + push_cast + field_simp + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolevFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolevFiniteP.lean new file mode 100644 index 0000000000..5dc643fe02 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/GagliardoNirenbergSobolevFiniteP.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Finite-`p` Gagliardo--Nirenberg--Sobolev on `Vec d` + +This is the ambient compact-support form of the finite-exponent Sobolev +inequality. The cube localization layer can use it without committing to a +particular formula for the critical exponent. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal NNReal + +noncomputable section + +private theorem finiteLpExponent_toNNReal_coe (p : FiniteLpExponent) : + ((p.exponent.toNNReal : ℝ≥0) : ℝ≥0∞) = p.exponent := by + rw [ENNReal.coe_toNNReal p.lt_top.ne] + +/-- Ambient finite-`p` Gagliardo--Nirenberg--Sobolev inequality, with the +Sobolev relation between `p` and `q` supplied exactly in real exponents. -/ +theorem gns_contDiff_compactSupport_finiteLp + {d : ℕ} (hd : 0 < d) (p q : FiniteLpExponent) + (hp : p.exponent.toReal < d) + (hpq : (q.exponent.toReal)⁻¹ = p.exponent.toReal⁻¹ - (d : ℝ)⁻¹) + {u : Vec d → ℝ} (hu : ContDiff ℝ 1 u) (hcs : HasCompactSupport u) : + eLpNorm u q.exponent (volume : Measure (Vec d)) + ≤ SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Vec d)) p.exponent.toNNReal * + eLpNorm (fderiv ℝ u) p.exponent (volume : Measure (Vec d)) := by + have hfr : Module.finrank ℝ (Vec d) = d := finrank_vec d + have hp_one : (1 : ℝ≥0) ≤ p.exponent.toNNReal := by + rw [← ENNReal.coe_le_coe, finiteLpExponent_toNNReal_coe p] + exact p.one_lt.le + have hp_dim : p.exponent.toReal < Module.finrank ℝ (Vec d) := by + rw [hfr] + exact hp + have hp_pos : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne + have hd_real : 0 < (Module.finrank ℝ (Vec d) : ℝ) := by + rw [hfr] + exact_mod_cast hd + have hdim_real : 0 < (Module.finrank ℝ (Vec d) : ℝ) := by + linarith [hd_real, hp_pos, hp_dim] + have hdim : 0 < Module.finrank ℝ (Vec d) := by + exact_mod_cast hdim_real + have hpq' : ((q.exponent.toNNReal : ℝ≥0) : ℝ)⁻¹ = + (p.exponent.toNNReal : ℝ)⁻¹ - (Module.finrank ℝ (Vec d) : ℝ)⁻¹ := by + rw [hfr] + simpa only [ENNReal.coe_toNNReal_eq_toReal] using hpq + have hgns := eLpNorm_le_eLpNorm_fderiv_of_eq + (μ := (volume : Measure (Vec d))) hu hcs (p := p.exponent.toNNReal) + (p' := q.exponent.toNNReal) hp_one hdim hpq' + simpa only [finiteLpExponent_toNNReal_coe p, finiteLpExponent_toNNReal_coe q] using hgns + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Limit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Limit.lean new file mode 100644 index 0000000000..30486890bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/Limit.lean @@ -0,0 +1,342 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.Extension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolev +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import Mathlib.MeasureTheory.Function.ConvergenceInMeasure +public import Mathlib.MeasureTheory.Function.LpSpace.Complete + +/-! # Limit -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization Homogenization.H1Function +open scoped ENNReal NNReal BigOperators Topology + +/-! +# The cube Sobolev embedding endgame + +Cut off the fold extension `Eu` of `u ∈ H¹(axisCube)` to compact support inside +the tripled box, package `χ · Eu` as an `H¹₀` function with smooth compactly +supported approximants `ψ_k`, apply the Gagliardo–Nirenberg–Sobolev inequality +to each `ψ_k`, and pass to the limit (`L^{2*}` lower semicontinuity of `eLpNorm` +along an a.e.-convergent subsequence). The reflection/cutoff constants and the +`L⁻¹` factor are collected into a single dimensional constant. +-/ + +noncomputable section + +/-! ## Operator norm versus coordinate values -/ + +theorem clm_norm_le_sum_basisVec {n : ℕ} (T : (Vec n) →L[ℝ] ℝ) : + ‖T‖ ≤ ∑ i, ‖T (basisVec i)‖ := by + refine T.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) fun x => ?_ + have hx : x = ∑ i, x i • basisVec i := by + funext j + simp only [Finset.sum_apply, Pi.smul_apply, basisVec_apply, smul_eq_mul, mul_ite, + mul_one, mul_zero] + rw [Finset.sum_ite_eq Finset.univ j (fun i => x i)] + simp + calc ‖T x‖ = ‖T (∑ i, x i • basisVec i)‖ := by rw [← hx] + _ = ‖∑ i, x i • T (basisVec i)‖ := by rw [map_sum]; simp only [map_smul] + _ ≤ ∑ i, ‖x i • T (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i, ‖x i‖ * ‖T (basisVec i)‖ := by simp only [norm_smul] + _ ≤ ∑ i, ‖x‖ * ‖T (basisVec i)‖ := + Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i, ‖T (basisVec i)‖) * ‖x‖ := by rw [← Finset.mul_sum]; ring + +/-- **GNS in coordinate form.** For a `C¹`, compactly supported function on +`Vec (m+1)` with `d = m+1 ≥ 3`, the `L^{2*}` norm is controlled by the sum of the +coordinate gradient `L²` norms. -/ +theorem gns_coord {m : ℕ} (hd : 3 ≤ m + 1) {ψ : Vec (m + 1) → ℝ} + (hψ : ContDiff ℝ 1 ψ) (hcs : HasCompactSupport ψ) : + eLpNorm ψ (twoStar (m + 1)) (volume : Measure (Vec (m + 1))) + ≤ (SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Vec (m + 1))) 2 : ℝ≥0∞) + * ∑ i, eLpNorm (fun x => fderiv ℝ ψ x (basisVec i)) 2 + (volume : Measure (Vec (m + 1))) := by + refine (gns_contDiff_compactSupport hd hψ hcs).trans (mul_le_mul_right ?_ _) + have hcont : Continuous (fderiv ℝ ψ) := hψ.continuous_fderiv (by simp) + have hsum_eq : (fun x => ∑ i, ‖fderiv ℝ ψ x (basisVec i)‖) + = ∑ i, (fun x => ‖fderiv ℝ ψ x (basisVec i)‖) := by + funext x; rw [Finset.sum_apply] + calc eLpNorm (fderiv ℝ ψ) 2 (volume : Measure (Vec (m + 1))) + ≤ eLpNorm (fun x => ∑ i, ‖fderiv ℝ ψ x (basisVec i)‖) 2 volume := + eLpNorm_mono (fun x => (clm_norm_le_sum_basisVec (fderiv ℝ ψ x)).trans_eq + (Real.norm_of_nonneg (Finset.sum_nonneg fun i _ => norm_nonneg _)).symm) + _ ≤ ∑ i, eLpNorm (fun x => ‖fderiv ℝ ψ x (basisVec i)‖) 2 volume := by + rw [hsum_eq] + exact eLpNorm_sum_le + (fun i _ => ((hcont.clm_apply continuous_const).norm).aestronglyMeasurable) (by norm_num) + _ = ∑ i, eLpNorm (fun x => fderiv ℝ ψ x (basisVec i)) 2 volume := + Finset.sum_congr rfl (fun i _ => eLpNorm_norm _) + +/-- `eLpNorm` is continuous along `Lᵖ`-convergent sequences (`p ≥ 1`, finite +target norm). -/ +theorem tendsto_eLpNorm_of_tendsto_sub {α : Type*} [MeasurableSpace α] {μ : Measure α} + {p : ℝ≥0∞} (hp : 1 ≤ p) {f : ℕ → α → ℝ} {g : α → ℝ} + (hf : ∀ k, AEStronglyMeasurable (f k) μ) (hg : AEStronglyMeasurable g μ) + (hfin : eLpNorm g p μ ≠ ⊤) + (h : Filter.Tendsto (fun k => eLpNorm (fun x => f k x - g x) p μ) Filter.atTop (nhds 0)) : + Filter.Tendsto (fun k => eLpNorm (f k) p μ) Filter.atTop (nhds (eLpNorm g p μ)) := by + have hupper : ∀ k, eLpNorm (f k) p μ + ≤ eLpNorm g p μ + eLpNorm (fun x => f k x - g x) p μ := by + intro k + refine (le_of_eq ?_).trans (eLpNorm_add_le hg ((hf k).sub hg) hp) + congr 1; funext x; simp only [Pi.add_apply]; ring + have hneg : ∀ k, eLpNorm (fun x => g x - f k x) p μ = eLpNorm (fun x => f k x - g x) p μ := by + intro k + rw [show (fun x => g x - f k x) = -(fun x => f k x - g x) from by + funext x; simp only [Pi.neg_apply]; ring, eLpNorm_neg] + have hlower : ∀ k, eLpNorm g p μ - eLpNorm (fun x => f k x - g x) p μ ≤ eLpNorm (f k) p μ := by + intro k + rw [tsub_le_iff_right] + calc eLpNorm g p μ + = eLpNorm (fun x => f k x + (g x - f k x)) p μ := by + congr 1; funext x; ring + _ ≤ eLpNorm (f k) p μ + eLpNorm (fun x => g x - f k x) p μ := + eLpNorm_add_le (hf k) (hg.sub (hf k)) hp + _ = eLpNorm (f k) p μ + eLpNorm (fun x => f k x - g x) p μ := by rw [hneg] + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + (g := fun k => eLpNorm g p μ - eLpNorm (fun x => f k x - g x) p μ) + (h := fun k => eLpNorm g p μ + eLpNorm (fun x => f k x - g x) p μ) ?_ ?_ hlower hupper + · have := ENNReal.Tendsto.sub + (tendsto_const_nhds : Filter.Tendsto (fun _ : ℕ => eLpNorm g p μ) Filter.atTop + (nhds (eLpNorm g p μ))) h (Or.inl hfin) + simpa using this + · have := Filter.Tendsto.const_add (eLpNorm g p μ) h + simpa using this + +/-! ## The cube Sobolev embedding -/ + +/-- **Cube Sobolev embedding.** Full statement. -/ +theorem cubeSobolevEmbedding {d : ℕ} (hd : 3 ≤ d) : + ∃ C : ℝ≥0, 0 < C ∧ + ∀ (z : Vec d) (L : ℝ), 0 < L → ∀ u : H1Function (axisCube z L), + eLpNorm u.toFun (twoStar d) (volumeMeasureOn (axisCube z L)) + ≤ (C : ℝ≥0∞) * + ((∑ i : Fin d, + eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ + * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))) := by + obtain ⟨m, rfl⟩ : ∃ m, d = m + 1 := ⟨d - 1, by omega⟩ + have hd3 : 3 ≤ m + 1 := hd + set Cgns : ℝ≥0∞ := (SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Vec (m + 1))) 2 : ℝ≥0∞) + with hCgns + set Cd : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ (m + 1)) ^ ((1 : ℝ) / 2) with hCdDef + have hCd_lt : Cd < ⊤ := + ENNReal.rpow_lt_top_of_nonneg (by norm_num) (ENNReal.pow_ne_top (by simp)) + have hCgns_lt : Cgns < ⊤ := by rw [hCgns]; exact ENNReal.coe_lt_top + set C0 : ℝ≥0∞ := Cgns * Cd * ((((m + 1) * 32 : ℕ)) : ℝ≥0∞) with hC0 + have hC0_lt : C0 < ⊤ := by + rw [hC0]; exact ENNReal.mul_lt_top (ENNReal.mul_lt_top hCgns_lt hCd_lt) (ENNReal.natCast_lt_top _) + refine ⟨C0.toNNReal + 1, add_pos_of_nonneg_of_pos (zero_le) one_pos, fun z L hL u => ?_⟩ + -- geometry + set hi : Vec (m + 1) := fun k => z k + L with hhi + have hlt : ∀ k, z k < hi k := fun k => by simp only [hhi]; linarith + have hval : ∀ k, hi k = z k + L := fun k => by simp only [hhi] + show eLpNorm u.toFun (twoStar (m + 1)) (volume.restrict (Box z hi)) + ≤ (↑(C0.toNNReal + 1) : ℝ≥0∞) * + ((∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volume.restrict (Box z hi))) + have hUbox : IsOpenBoundedConvexDomain (Box z hi) := isOpenBoundedConvexDomain_Box z hi + have hU3 : IsOpenBoundedConvexDomain (Box3 z hi) := isOpenBoundedConvexDomain_Box _ _ + have hfin3 : IsFiniteMeasure (volume.restrict (Box3 z hi)) := + hU3.isFiniteMeasure_restrict_volume + have hlf3 : IsLocallyFiniteMeasure (volume.restrict (Box3 z hi)) := inferInstance + -- fold extension + have Ext := foldExtension z hi hlt u + set Eu : H1Function (Box3 z hi) := Ext.Eu with hEu + -- cutoff + set χ : Vec (m + 1) → ℝ := boxCutoff z hi (L / 2) with hχ + have hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ := boxCutoff_contDiff + obtain ⟨hχ_cptsupp, hχ_one, hχ_sub, hχ_deriv⟩ := + boxCutoff_halfSide_properties z hi L hL hval + -- the H¹₀ package and its H¹ twin + set w : H10Function (Box3 z hi) := + Eu.mulContDiffHasCompactSupportToH10 hU3 hχ_smooth hχ_cptsupp hχ_sub with hw + have hw_toFun : w.toH1Function.toFun = fun x => χ x * Eu.toFun x := + Eu.mulContDiffHasCompactSupportToH10_toFun hU3 hχ_smooth hχ_cptsupp hχ_sub + set wH1 : H1Function (Box3 z hi) := Eu.mulContDiffHasCompactSupport hχ_smooth hχ_cptsupp with hwH1 + have hwH1_toFun : wH1.toFun = fun x => χ x * Eu.toFun x := by + rw [hwH1, mulContDiffHasCompactSupport_toFun] + have hwH1_grad : ∀ x i, wH1.grad x i + = χ x * Eu.grad x i + Eu.toFun x * (fderiv ℝ χ x) (basisVec i) := by + intro x i; rw [hwH1]; simp only [mulContDiffHasCompactSupport_grad] + -- w.grad =ᵐ wH1.grad (uniqueness of the weak gradient) + have hgrad_ae : ∀ i, (fun x => w.grad x i) =ᵐ[volume.restrict (Box3 z hi)] + (fun x => wH1.grad x i) := by + intro i + have htoFun : w.toH1Function.toFun = wH1.toFun := by rw [hw_toFun, hwH1_toFun] + have hint_w : IntegrableOn (fun x => w.grad x i) (Box3 z hi) volume := + (w.toH1Function.gradMemL2 i).integrable (by norm_num) + have hint_wH1 : IntegrableOn (fun x => wH1.grad x i) (Box3 z hi) volume := + (wH1.gradMemL2 i).integrable (by norm_num) + have hloc_w := hint_w.locallyIntegrableOn + have hloc_wH1 := hint_wH1.locallyIntegrableOn + refine HasWeakPartialDerivOn.ae_eq hU3.isOpen hloc_w hloc_wH1 + (w.toH1Function.hasWeakGradient i) ?_ + have := wH1.hasWeakGradient i + rwa [← htoFun] at this + -- smooth approximants + set ψ : ℕ → Vec (m + 1) → ℝ := w.approx with hψdef + have hψ_supp : ∀ k, Function.support (ψ k) ⊆ Box3 z hi := + fun k => (subset_tsupport _).trans (w.approx_support_subset k) + have hψ_dsupp : ∀ k i, Function.support (fun x => fderiv ℝ (ψ k) x (basisVec i)) ⊆ Box3 z hi := by + intro k i x hx + by_contra hxb + have hx_nots : x ∉ tsupport (ψ k) := fun hc => hxb (w.approx_support_subset k hc) + have hzero : ψ k =ᶠ[nhds x] 0 := + (isClosed_tsupport (ψ k)).isOpen_compl.eventually_mem hx_nots |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + exact (Function.mem_support.1 hx) (by rw [Filter.EventuallyEq.fderiv_eq hzero]; simp) + -- eLpNorm over the restricted measure equals over volume for these supports + have hrestr : ∀ (f : Vec (m + 1) → ℝ) (p : ℝ≥0∞), Function.support f ⊆ Box3 z hi → + eLpNorm f p (volume.restrict (Box3 z hi)) = eLpNorm f p volume := + fun f p hf => eLpNorm_restrict_eq_of_support_subset hf + -- abbreviations for the sequences + set a : ℕ → ℝ≥0∞ := fun k => eLpNorm (ψ k) (twoStar (m + 1)) (volume.restrict (Box3 z hi)) + with hadef + set b : ℕ → ℝ≥0∞ := fun k => + Cgns * ∑ i, eLpNorm (fun x => fderiv ℝ (ψ k) x (basisVec i)) 2 (volume.restrict (Box3 z hi)) + with hbdef + have hab : ∀ k, a k ≤ b k := by + intro k + show eLpNorm (ψ k) (twoStar (m + 1)) (volume.restrict (Box3 z hi)) + ≤ Cgns * ∑ i, eLpNorm (fun x => fderiv ℝ (ψ k) x (basisVec i)) 2 + (volume.restrict (Box3 z hi)) + rw [hrestr _ _ (hψ_supp k)] + refine (gns_coord hd3 ((w.approx_smooth k).of_le (by exact_mod_cast le_top)) + (w.approx_hasCompactSupport k)).trans ?_ + refine mul_le_mul_right (le_of_eq (Finset.sum_congr rfl fun i _ => ?_)) _ + exact (hrestr _ _ (hψ_dsupp k i)).symm + -- b converges to binf + set binf : ℝ≥0∞ := Cgns * ∑ i, eLpNorm (fun x => w.grad x i) 2 (volume.restrict (Box3 z hi)) + with hbinf + have hb_tend : Filter.Tendsto b Filter.atTop (nhds binf) := by + rw [hbdef, hbinf] + refine ENNReal.Tendsto.const_mul (tendsto_finsetSum _ fun i _ => ?_) (Or.inr hCgns_lt.ne) + refine tendsto_eLpNorm_of_tendsto_sub (by norm_num) + (fun k => ((((w.approx_smooth k).of_le (by exact_mod_cast le_top) : + ContDiff ℝ 1 (ψ k)).continuous_fderiv (by simp)).clm_apply + continuous_const).aestronglyMeasurable) + (w.toH1Function.gradMemL2 i).aestronglyMeasurable + (w.toH1Function.gradMemL2 i).eLpNorm_lt_top.ne ?_ + exact w.tendsto_approx_grad i + -- pointwise cutoff bounds + have hχ_le1 : ∀ x, ‖χ x‖ ≤ 1 := fun x => by + rw [Real.norm_of_nonneg (boxCutoff_nonneg x)]; exact boxCutoff_le_one x + have hBox_sub : Box z hi ⊆ Box3 z hi := by + rw [Box3_eq_Box]; intro x hx + refine Set.mem_univ_pi.2 fun k => ?_ + have := Set.mem_univ_pi.1 hx k + exact ⟨by have := this.1; linarith [hlt k], by have := this.2; linarith [hlt k]⟩ + -- L1 : restrict to the base cube where χ = 1 and Eu = u + have hwu : (fun x => χ x * Eu.toFun x) =ᵐ[volume.restrict (Box z hi)] u.toFun := by + filter_upwards [ae_restrict_mem (isOpen_Box z hi).measurableSet, Ext.toFun_ae] + with x hxU hEux + rw [hχ_one x hxU, one_mul, hEux] + have hL1 : eLpNorm u.toFun (twoStar (m + 1)) (volume.restrict (Box z hi)) + ≤ eLpNorm w.toFun (twoStar (m + 1)) (volume.restrict (Box3 z hi)) := by + rw [show w.toFun = fun x => χ x * Eu.toFun x from hw_toFun, ← eLpNorm_congr_ae hwu] + exact eLpNorm_mono_measure _ (Measure.restrict_mono hBox_sub le_rfl) + -- L2 : Fatou along an a.e.-convergent subsequence + have htim : TendstoInMeasure (volume.restrict (Box3 z hi)) (fun k => ψ k) Filter.atTop w.toFun := + tendstoInMeasure_of_tendsto_eLpNorm (by norm_num) + (fun k => (w.approx_smooth k).continuous.aestronglyMeasurable) + w.toH1Function.memL2.aestronglyMeasurable w.tendsto_approx + obtain ⟨σ, hσ_mono, hσ_ae⟩ := htim.exists_seq_tendsto_ae + have hL2 : eLpNorm w.toFun (twoStar (m + 1)) (volume.restrict (Box3 z hi)) + ≤ Filter.liminf (fun j => a (σ j)) Filter.atTop := + Lp.eLpNorm_lim_le_liminf_eLpNorm + (fun j => (w.approx_smooth (σ j)).continuous.aestronglyMeasurable) w.toFun hσ_ae + -- L3 : liminf (a ∘ σ) ≤ binf + have hbσ : Filter.Tendsto (fun j => b (σ j)) Filter.atTop (nhds binf) := + hb_tend.comp (hσ_mono.tendsto_atTop) + have hL3 : Filter.liminf (fun j => a (σ j)) Filter.atTop ≤ binf := by + calc Filter.liminf (fun j => a (σ j)) Filter.atTop + ≤ Filter.liminf (fun j => b (σ j)) Filter.atTop := + Filter.liminf_le_liminf (Filter.Eventually.of_forall fun j => hab (σ j)) + _ = binf := hbσ.liminf_eq + -- L4 : bound each coordinate weak gradient of χ·Eu + have hb2 : ∀ i, eLpNorm (fun x => Eu.toFun x * (fderiv ℝ χ x) (basisVec i)) 2 + (volume.restrict (Box3 z hi)) + ≤ ENNReal.ofReal (32 / L) * eLpNorm Eu.toFun 2 (volume.restrict (Box3 z hi)) := by + intro i + refine le_trans (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_)) + (le_trans (eLpNorm_const_smul_le (c := (32 / L : ℝ)) (f := Eu.toFun)) (le_of_eq ?_)) + · rw [Pi.smul_apply, smul_eq_mul, norm_mul, norm_mul, + Real.norm_of_nonneg (by positivity : (0:ℝ) ≤ 32 / L)] + calc ‖Eu.toFun x‖ * ‖(fderiv ℝ χ x) (basisVec i)‖ + ≤ ‖Eu.toFun x‖ * (32 / L) := + mul_le_mul_of_nonneg_left (by rw [Real.norm_eq_abs]; exact hχ_deriv x i) (norm_nonneg _) + _ = 32 / L * ‖Eu.toFun x‖ := by ring + · congr 1 + rw [Real.enorm_eq_ofReal (by positivity)] + have hwgrad_bound : ∀ i, eLpNorm (fun x => w.grad x i) 2 (volume.restrict (Box3 z hi)) + ≤ Cd * eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi)) + + ENNReal.ofReal (32 / L) * (Cd * eLpNorm u.toFun 2 (volume.restrict (Box z hi))) := by + intro i + rw [eLpNorm_congr_ae (hgrad_ae i), + show (fun x => wH1.grad x i) + = (fun x => χ x * Eu.grad x i) + fun x => Eu.toFun x * (fderiv ℝ χ x) (basisVec i) from by + funext x; rw [Pi.add_apply, hwH1_grad x i]] + have haesm1 : AEStronglyMeasurable (fun x => χ x * Eu.grad x i) (volume.restrict (Box3 z hi)) := + hχ_smooth.continuous.aestronglyMeasurable.mul (Eu.gradMemL2 i).aestronglyMeasurable + have haesm2 : AEStronglyMeasurable (fun x => Eu.toFun x * (fderiv ℝ χ x) (basisVec i)) + (volume.restrict (Box3 z hi)) := + Eu.memL2.aestronglyMeasurable.mul + (((hχ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const).aestronglyMeasurable) + refine (eLpNorm_add_le haesm1 haesm2 (by norm_num)).trans (add_le_add ?_ ?_) + · refine le_trans (eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_)) + (Ext.grad_eLpNorm_le i) + rw [norm_mul]; exact mul_le_of_le_one_left (norm_nonneg _) (hχ_le1 x) + · exact (hb2 i).trans (mul_le_mul_right Ext.eLpNorm_le _) + -- L4 assembled + have hL4 : binf ≤ (C0 : ℝ≥0∞) + * ((∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volume.restrict (Box z hi))) := by + have hsum : ∑ i, eLpNorm (fun x => w.grad x i) 2 (volume.restrict (Box3 z hi)) + ≤ Cd * (∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi))) + + ((m + 1 : ℕ) : ℝ≥0∞) * (ENNReal.ofReal (32 / L) + * (Cd * eLpNorm u.toFun 2 (volume.restrict (Box z hi)))) := by + refine (Finset.sum_le_sum fun i _ => hwgrad_bound i).trans (le_of_eq ?_) + rw [Finset.sum_add_distrib, ← Finset.mul_sum, Finset.sum_const, Finset.card_univ, + Fintype.card_fin, nsmul_eq_mul] + have hofReal : ENNReal.ofReal (32 / L) = ((32 : ℕ) : ℝ≥0∞) * ENNReal.ofReal L⁻¹ := by + rw [show (32 : ℝ) / L = 32 * L⁻¹ by ring, ENNReal.ofReal_mul (by norm_num)] + norm_num + have hN1 : (1 : ℝ≥0∞) ≤ ((((m + 1) * 32 : ℕ)) : ℝ≥0∞) := by + exact_mod_cast Nat.one_le_iff_ne_zero.2 (by positivity) + rw [hbinf] + refine (mul_le_mul_right hsum Cgns).trans ?_ + rw [hofReal, hC0] + simp only [mul_add] + refine add_le_add ?_ (le_of_eq ?_) + · rw [show Cgns * (Cd * ∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi))) + = (Cgns * Cd) * ∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi)) from by + ring] + exact mul_le_mul_left (le_mul_of_one_le_right' hN1) _ + · push_cast; ring + -- combine + have hmain : eLpNorm u.toFun (twoStar (m + 1)) (volume.restrict (Box z hi)) + ≤ (C0 : ℝ≥0∞) + * ((∑ i, eLpNorm (fun x => u.grad x i) 2 (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volume.restrict (Box z hi))) := + hL1.trans (hL2.trans (hL3.trans hL4)) + have hC0le : (C0 : ℝ≥0∞) ≤ (↑(C0.toNNReal + 1) : ℝ≥0∞) := by + rw [ENNReal.coe_add, ENNReal.coe_toNNReal hC0_lt.ne, ENNReal.coe_one] + exact le_self_add + exact hmain.trans (mul_le_mul_left hC0le _) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/LimitFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/LimitFiniteP.lean new file mode 100644 index 0000000000..ff64b25543 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/LimitFiniteP.lean @@ -0,0 +1,550 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.FoldExtensionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.GagliardoNirenbergSobolevFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import Mathlib.MeasureTheory.Function.ConvergenceInMeasure +public import Mathlib.MeasureTheory.Function.LpSpace.Complete + +/-! +# Finite-`p` coordinate GNS input for cube localization + +This module records the coordinate form of the ambient finite-`p` +Gagliardo--Nirenberg--Sobolev theorem. It is the analytic estimate applied to +compactly supported smooth folded approximants in the cube localization step. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal NNReal BigOperators + +noncomputable section + +private theorem tendsto_eLpNorm_mul_of_norm_le_one + {α : Type*} [MeasurableSpace α] {μ : Measure α} {p : ℝ≥0∞} + {χ : α → ℝ} {F : ℕ → α → ℝ} {f : α → ℝ} (hχ : ∀ x, ‖χ x‖ ≤ 1) + (htend : Filter.Tendsto (fun n => eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => eLpNorm (fun x => χ x * F n x - χ x * f x) p μ) + Filter.atTop (nhds 0) := by + have hbound : ∀ n, eLpNorm (fun x => χ x * F n x - χ x * f x) p μ + ≤ eLpNorm (fun x => F n x - f x) p μ := by + intro n + refine eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_) + rw [show χ x * F n x - χ x * f x = χ x * (F n x - f x) by ring, norm_mul] + simpa [mul_comm] using + (mul_le_of_le_one_right (norm_nonneg (F n x - f x)) (hχ x)) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds htend + (fun n => zero_le) hbound + +private theorem tendsto_eLpNorm_mul_of_norm_le + {α : Type*} [MeasurableSpace α] {μ : Measure α} {p : ℝ≥0∞} + {χ : α → ℝ} {F : ℕ → α → ℝ} {f : α → ℝ} {C : ℝ} + (hC : 0 ≤ C) (hχ : ∀ x, ‖χ x‖ ≤ C) + (htend : Filter.Tendsto (fun n => eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => eLpNorm (fun x => χ x * F n x - χ x * f x) p μ) + Filter.atTop (nhds 0) := by + have hbound : ∀ n, eLpNorm (fun x => χ x * F n x - χ x * f x) p μ + ≤ ENNReal.ofReal C * eLpNorm (fun x => F n x - f x) p μ := by + intro n + have hmono : eLpNorm (fun x => χ x * F n x - χ x * f x) p μ + ≤ eLpNorm (C • fun x => F n x - f x) p μ := + eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => by + rw [show χ x * F n x - χ x * f x = χ x * (F n x - f x) by ring, norm_mul, + Pi.smul_apply, smul_eq_mul, norm_mul, + Real.norm_of_nonneg hC] + exact mul_le_mul_of_nonneg_right (hχ x) (norm_nonneg _)) + refine hmono.trans ?_ + simpa [Real.enorm_eq_ofReal hC] using + (eLpNorm_const_smul_le (c := C) (f := fun x => F n x - f x) (p := p) (μ := μ)) + have hscaled : Filter.Tendsto + (fun n => ENNReal.ofReal C * eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds (ENNReal.ofReal C * 0)) := + ENNReal.Tendsto.const_mul htend (Or.inr ENNReal.ofReal_ne_top) + have hscaled0 : Filter.Tendsto + (fun n => ENNReal.ofReal C * eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds 0) := by + simpa using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hscaled0 + (fun n => zero_le) hbound + +private theorem tendsto_eLpNorm_of_tendsto_sub_finiteLp + {α : Type*} [MeasurableSpace α] {μ : Measure α} {r : ℝ≥0∞} (hr : 1 ≤ r) + {F : ℕ → α → ℝ} {f : α → ℝ} + (hF : ∀ n, AEStronglyMeasurable (F n) μ) (hf : AEStronglyMeasurable f μ) + (hfin : eLpNorm f r μ ≠ ⊤) + (h : Filter.Tendsto (fun n => eLpNorm (fun x => F n x - f x) r μ) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => eLpNorm (F n) r μ) Filter.atTop (nhds (eLpNorm f r μ)) := by + have hupper : ∀ n, eLpNorm (F n) r μ ≤ + eLpNorm f r μ + eLpNorm (fun x => F n x - f x) r μ := by + intro n + refine (le_of_eq ?_).trans (eLpNorm_add_le hf ((hF n).sub hf) hr) + congr 1 + funext x + simp only [Pi.add_apply] + ring + have hneg : ∀ n, eLpNorm (fun x => f x - F n x) r μ = + eLpNorm (fun x => F n x - f x) r μ := by + intro n + rw [show (fun x => f x - F n x) = -(fun x => F n x - f x) by + funext x + simp only [Pi.neg_apply] + ring, eLpNorm_neg] + have hlower : ∀ n, eLpNorm f r μ - eLpNorm (fun x => F n x - f x) r μ ≤ + eLpNorm (F n) r μ := by + intro n + rw [tsub_le_iff_right] + calc eLpNorm f r μ = eLpNorm (fun x => F n x + (f x - F n x)) r μ := by + congr 1 + funext x + ring + _ ≤ eLpNorm (F n) r μ + eLpNorm (fun x => f x - F n x) r μ := + eLpNorm_add_le (hF n) (hf.sub (hF n)) hr + _ = eLpNorm (F n) r μ + eLpNorm (fun x => F n x - f x) r μ := by rw [hneg] + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + (g := fun n => eLpNorm f r μ - eLpNorm (fun x => F n x - f x) r μ) + (h := fun n => eLpNorm f r μ + eLpNorm (fun x => F n x - f x) r μ) ?_ ?_ hlower hupper + · have ht := ENNReal.Tendsto.sub + (tendsto_const_nhds : Filter.Tendsto (fun _ : ℕ => eLpNorm f r μ) Filter.atTop + (nhds (eLpNorm f r μ))) h (Or.inl hfin) + simpa using ht + · simpa using Filter.Tendsto.const_add (eLpNorm f r μ) h + +/-- The operator norm of a scalar functional on `Vec d` is bounded by its +values on the coordinate basis. -/ +theorem clm_norm_le_sum_basisVec_finiteLp {d : ℕ} (T : (Vec d) →L[ℝ] ℝ) : + ‖T‖ ≤ ∑ i, ‖T (basisVec i)‖ := by + refine T.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) fun x => ?_ + have hx : x = ∑ i, x i • basisVec i := by + funext j + simp only [Finset.sum_apply, Pi.smul_apply, basisVec_apply, smul_eq_mul, mul_ite, + mul_one, mul_zero] + rw [Finset.sum_ite_eq Finset.univ j (fun i => x i)] + simp + calc + ‖T x‖ = ‖T (∑ i, x i • basisVec i)‖ := by rw [← hx] + _ = ‖∑ i, x i • T (basisVec i)‖ := by rw [map_sum]; simp only [map_smul] + _ ≤ ∑ i, ‖x i • T (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i, ‖x i‖ * ‖T (basisVec i)‖ := by simp only [norm_smul] + _ ≤ ∑ i, ‖x‖ * ‖T (basisVec i)‖ := + Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i, ‖T (basisVec i)‖) * ‖x‖ := by rw [← Finset.mul_sum]; ring + +/-- Coordinate form of the ambient finite-`p` GNS inequality. -/ +theorem gns_coord_finiteLp {d : ℕ} (hd : 0 < d) (p q : FiniteLpExponent) + (hp : p.exponent.toReal < d) + (hpq : (q.exponent.toReal)⁻¹ = p.exponent.toReal⁻¹ - (d : ℝ)⁻¹) + {ψ : Vec d → ℝ} (hψ : ContDiff ℝ 1 ψ) (hcs : HasCompactSupport ψ) : + eLpNorm ψ q.exponent (volume : Measure (Vec d)) + ≤ SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Vec d)) p.exponent.toNNReal * + ∑ i, eLpNorm (fun x => fderiv ℝ ψ x (basisVec i)) p.exponent + (volume : Measure (Vec d)) := by + refine (gns_contDiff_compactSupport_finiteLp hd p q hp hpq hψ hcs).trans + (mul_le_mul_right ?_ _) + have hcont : Continuous (fderiv ℝ ψ) := hψ.continuous_fderiv (by simp) + have hsum_eq : (fun x => ∑ i, ‖fderiv ℝ ψ x (basisVec i)‖) + = ∑ i, (fun x => ‖fderiv ℝ ψ x (basisVec i)‖) := by + funext x + rw [Finset.sum_apply] + calc + eLpNorm (fderiv ℝ ψ) p.exponent (volume : Measure (Vec d)) + ≤ eLpNorm (fun x => ∑ i, ‖fderiv ℝ ψ x (basisVec i)‖) p.exponent volume := + eLpNorm_mono (fun x => + (clm_norm_le_sum_basisVec_finiteLp (fderiv ℝ ψ x)).trans_eq + (Real.norm_of_nonneg (Finset.sum_nonneg fun i _ => norm_nonneg _)).symm) + _ ≤ ∑ i, eLpNorm (fun x => ‖fderiv ℝ ψ x (basisVec i)‖) p.exponent volume := by + rw [hsum_eq] + exact eLpNorm_sum_le + (fun i _ => ((hcont.clm_apply continuous_const).norm).aestronglyMeasurable) + p.one_lt.le + _ = ∑ i, eLpNorm (fun x => fderiv ℝ ψ x (basisVec i)) p.exponent volume := + Finset.sum_congr rfl fun i _ => eLpNorm_norm _ + +/-- The weak gradient of a bounded smooth cutoff product has the expected norm bound. -/ +private theorem cutoff_gradient_eLpNorm_le {d : ℕ} {U : Set (Vec d)} + (p : FiniteLpExponent) (u : W1pFunction U p.exponent) + (χ : Vec d → ℝ) (hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ) + (C : ℝ) (hC : 0 ≤ C) (hχ_le1 : ∀ x, ‖χ x‖ ≤ 1) + (hχ_deriv : ∀ x i, |fderiv ℝ χ x (basisVec i)| ≤ C) (i : Fin d) : + eLpNorm (fun x => χ x * u.grad x i + u.toFun x * fderiv ℝ χ x (basisVec i)) + p.exponent (volumeMeasureOn U) ≤ + eLpNorm (fun x => u.grad x i) p.exponent (volumeMeasureOn U) + + ENNReal.ofReal C * eLpNorm u.toFun p.exponent (volumeMeasureOn U) := by + have hfirst : eLpNorm (fun x => χ x * u.grad x i) p.exponent (volumeMeasureOn U) ≤ + eLpNorm (fun x => u.grad x i) p.exponent (volumeMeasureOn U) := by + refine eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_) + rw [norm_mul] + exact mul_le_of_le_one_left (norm_nonneg _) (hχ_le1 x) + have hsecond : eLpNorm (fun x => u.toFun x * fderiv ℝ χ x (basisVec i)) p.exponent + (volumeMeasureOn U) ≤ ENNReal.ofReal C * eLpNorm u.toFun p.exponent + (volumeMeasureOn U) := by + have hmono : eLpNorm (fun x => u.toFun x * fderiv ℝ χ x (basisVec i)) p.exponent + (volumeMeasureOn U) ≤ eLpNorm (C • u.toFun) p.exponent (volumeMeasureOn U) := by + refine eLpNorm_mono_ae (Filter.Eventually.of_forall fun x => ?_) + rw [Pi.smul_apply, smul_eq_mul, norm_mul, norm_mul, Real.norm_of_nonneg hC] + calc ‖u.toFun x‖ * ‖fderiv ℝ χ x (basisVec i)‖ + ≤ ‖u.toFun x‖ * C := + mul_le_mul_of_nonneg_left + (by rw [Real.norm_eq_abs]; exact hχ_deriv x i) (norm_nonneg _) + _ = C * ‖u.toFun x‖ := by ring + exact hmono.trans ((eLpNorm_const_smul_le (c := C) (f := u.toFun)).trans + (le_of_eq (by congr 1; rw [Real.enorm_eq_ofReal hC]))) + exact (eLpNorm_add_le + (hχ_smooth.continuous.aestronglyMeasurable.mul (u.grad_memLp i).aestronglyMeasurable) + (u.memLp.aestronglyMeasurable.mul + (((hχ_smooth.continuous_fderiv (by simp)).clm_apply + continuous_const).aestronglyMeasurable)) p.one_lt.le).trans (add_le_add hfirst hsecond) + +/-- Strong Sobolev convergence persists in each derivative of a bounded smooth cutoff product. -/ +private theorem cutoff_gradient_tendsto {d : ℕ} {U : Set (Vec d)} + (p : FiniteLpExponent) (Eu : W1pFunction U p.exponent) + (A : ℕ → W1pFunction U p.exponent) (χ : Vec d → ℝ) + (hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ) + (hA_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (A n).toFun) + (hA_grad : ∀ n x i, (A n).grad x i = fderiv ℝ ((A n).toFun) x (basisVec i)) + (C : ℝ) (hC : 0 ≤ C) (hχ_le1 : ∀ x, ‖χ x‖ ≤ 1) + (hχ_deriv : ∀ x i, |fderiv ℝ χ x (basisVec i)| ≤ C) + (hA_tend : Filter.Tendsto (fun n => eLpNorm (fun x => (A n).toFun x - Eu.toFun x) + p.exponent (volumeMeasureOn U)) Filter.atTop (nhds 0)) + (hAgrad_tend : ∀ i, Filter.Tendsto (fun n => + eLpNorm (fun x => (A n).grad x i - Eu.grad x i) p.exponent (volumeMeasureOn U)) + Filter.atTop (nhds 0)) (i : Fin d) : + Filter.Tendsto (fun n => eLpNorm + (fun x => fderiv ℝ (fun y => χ y * (A n).toFun y) x (basisVec i) - + (χ x * Eu.grad x i + Eu.toFun x * fderiv ℝ χ x (basisVec i))) + p.exponent (volumeMeasureOn U)) Filter.atTop (nhds 0) := by + let ψ : ℕ → Vec d → ℝ := fun n x => χ x * (A n).toFun x + let G : Fin d → Vec d → ℝ := fun i x => + χ x * Eu.grad x i + Eu.toFun x * fderiv ℝ χ x (basisVec i) + change Filter.Tendsto (fun n => eLpNorm + (fun x => fderiv ℝ (ψ n) x (basisVec i) - G i x) p.exponent + (volumeMeasureOn U)) Filter.atTop (nhds 0) + have hDform : ∀ n x i, fderiv ℝ (ψ n) x (basisVec i) = + χ x * (A n).grad x i + (A n).toFun x * fderiv ℝ χ x (basisVec i) := by + intro n x i + rw [show ψ n = χ * (A n).toFun by rfl, + fderiv_mul ((hχ_smooth.differentiable (by simp)) x) + (((hA_smooth n).differentiable (by simp)) x)] + simp only [add_apply, smul_apply, smul_eq_mul, hA_grad] + have hAgrad := hAgrad_tend i + have h1 : Filter.Tendsto (fun n => eLpNorm + (fun x => χ x * ((A n).grad x i - Eu.grad x i)) p.exponent + (volumeMeasureOn U)) Filter.atTop (nhds 0) := by + have hraw := tendsto_eLpNorm_mul_of_norm_le_one hχ_le1 hAgrad + refine hraw.congr' ?_ + filter_upwards with n + apply eLpNorm_congr_ae + filter_upwards with x + ring + have h2 : Filter.Tendsto (fun n => eLpNorm + (fun x => ((A n).toFun x - Eu.toFun x) * fderiv ℝ χ x (basisVec i)) + p.exponent (volumeMeasureOn U)) Filter.atTop (nhds 0) := by + have h := tendsto_eLpNorm_mul_of_norm_le + (C := C) hC (fun x => by + rw [Real.norm_eq_abs] + exact hχ_deriv x i) hA_tend + refine h.congr' ?_ + filter_upwards with n + apply eLpNorm_congr_ae + filter_upwards with x + ring + have hsum : Filter.Tendsto (fun n => + eLpNorm (fun x => χ x * ((A n).grad x i - Eu.grad x i) + + ((A n).toFun x - Eu.toFun x) * fderiv ℝ χ x (basisVec i)) p.exponent + (volumeMeasureOn U)) Filter.atTop (nhds 0) := by + have hbound : ∀ n, eLpNorm + (fun x => χ x * ((A n).grad x i - Eu.grad x i) + + ((A n).toFun x - Eu.toFun x) * fderiv ℝ χ x (basisVec i)) p.exponent + (volumeMeasureOn U) ≤ + eLpNorm (fun x => χ x * ((A n).grad x i - Eu.grad x i)) p.exponent + (volumeMeasureOn U) + + eLpNorm (fun x => ((A n).toFun x - Eu.toFun x) * + fderiv ℝ χ x (basisVec i)) p.exponent (volumeMeasureOn U) := by + intro n + exact eLpNorm_add_le + (hχ_smooth.continuous.aestronglyMeasurable.mul + (((A n).grad_memLp i).aestronglyMeasurable.sub + (Eu.grad_memLp i).aestronglyMeasurable)) + (((A n).memLp.aestronglyMeasurable.sub Eu.memLp.aestronglyMeasurable).mul + (((hχ_smooth.continuous_fderiv (by simp)).clm_apply + continuous_const).aestronglyMeasurable)) p.one_lt.le + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds + (by simpa using h1.add h2) (fun n => zero_le) hbound + refine hsum.congr' ?_ + filter_upwards with n + congr 1 + funext x + rw [hDform n x i] + simp only [G] + ring + +/-- A convergent sequence of upper bounds controls the norm of a limit in measure. -/ +private theorem eLpNorm_le_of_tendstoInMeasure_bound + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {F : ℕ → α → ℝ} {f : α → ℝ} {q : ℝ≥0∞} {b : ℕ → ℝ≥0∞} {B : ℝ≥0∞} + (hF : ∀ n, AEStronglyMeasurable (F n) μ) + (htim : TendstoInMeasure μ F Filter.atTop f) + (hab : ∀ n, eLpNorm (F n) q μ ≤ b n) + (hb : Filter.Tendsto b Filter.atTop (nhds B)) : eLpNorm f q μ ≤ B := by + obtain ⟨σ, hσ_mono, hσ_ae⟩ := htim.exists_seq_tendsto_ae + have hlim : eLpNorm f q μ ≤ + Filter.liminf (fun j => eLpNorm (F (σ j)) q μ) Filter.atTop := + Lp.eLpNorm_lim_le_liminf_eLpNorm (fun j => hF (σ j)) _ hσ_ae + have hbσ : Filter.Tendsto (fun j => b (σ j)) Filter.atTop (nhds B) := + hb.comp hσ_mono.tendsto_atTop + exact hlim.trans ((Filter.liminf_le_liminf + (Filter.Eventually.of_forall fun j => hab (σ j))).trans_eq hbσ.liminf_eq) + +/-- The dimension factor absorbs the sum of cutoff-gradient estimates with constant 32. -/ +private theorem cutoff_gradient_sum_bound (m : ℕ) (Cgns Cd : ℝ≥0∞) (L : ℝ) + (g a : Fin (m + 1) → ℝ≥0∞) (v : ℝ≥0∞) + (hg : ∀ i, g i ≤ Cd * a i + ENNReal.ofReal (32 / L) * (Cd * v)) : + Cgns * ∑ i, g i ≤ (Cgns * Cd * ((((m + 1) * 32 : ℕ)) : ℝ≥0∞)) * + ((∑ i, a i) + ENNReal.ofReal L⁻¹ * v) := by + have hsum : ∑ i, g i ≤ Cd * (∑ i, a i) + + ((m + 1 : ℕ) : ℝ≥0∞) * (ENNReal.ofReal (32 / L) * (Cd * v)) := by + refine (Finset.sum_le_sum fun i _ => hg i).trans (le_of_eq ?_) + rw [Finset.sum_add_distrib, ← Finset.mul_sum, Finset.sum_const, Finset.card_univ, + Fintype.card_fin, nsmul_eq_mul] + have hofReal : ENNReal.ofReal (32 / L) = ((32 : ℕ) : ℝ≥0∞) * ENNReal.ofReal L⁻¹ := by + rw [show (32 : ℝ) / L = 32 * L⁻¹ by ring, ENNReal.ofReal_mul (by norm_num)] + norm_num + have hN1 : (1 : ℝ≥0∞) ≤ ((((m + 1) * 32 : ℕ)) : ℝ≥0∞) := by + exact_mod_cast Nat.one_le_iff_ne_zero.2 (by positivity) + refine (mul_le_mul_right hsum Cgns).trans ?_ + rw [hofReal] + simp only [mul_add] + refine add_le_add ?_ (le_of_eq ?_) + · rw [show Cgns * (Cd * ∑ i, a i) = (Cgns * Cd) * ∑ i, a i by ring] + exact mul_le_mul_left (le_mul_of_one_le_right' hN1) _ + · push_cast + ring + +/-! ## The finite-exponent cube embedding -/ + +/-- The finite-exponent axis-cube Sobolev inequality. The constant is chosen +before the cube, its scale, and the Sobolev function; its displayed formula +uses only the dimension and the input exponent. -/ +theorem cubeSobolevEmbedding_finiteLp {d : ℕ} (hd : 0 < d) + (p : FiniteLpExponent) (hp : p.exponent.toReal < d) : + ∃ C : ℝ≥0, 0 < C ∧ + ∀ (q : FiniteLpExponent), + (q.exponent.toReal)⁻¹ = p.exponent.toReal⁻¹ - (d : ℝ)⁻¹ → + ∀ (z : Vec d) (L : ℝ), 0 < L → ∀ u : W1pFunction (axisCube z L) p.exponent, + eLpNorm u.toFun q.exponent (volumeMeasureOn (axisCube z L)) + ≤ (C : ℝ≥0∞) * + ((∑ i : Fin d, + eLpNorm (fun x => u.grad x i) p.exponent + (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun p.exponent + (volumeMeasureOn (axisCube z L))) := by + obtain ⟨m, rfl⟩ : ∃ m, d = m + 1 := ⟨d - 1, by omega⟩ + have hd' : 0 < m + 1 := hd + set Cgns : ℝ≥0∞ := + (SNormLESNormFDerivOfEqConst ℝ (volume : Measure (Vec (m + 1))) + p.exponent.toNNReal : ℝ≥0∞) with hCgns + set Cd : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ (m + 1)) ^ (1 / p.exponent.toReal) with hCd + have hp_pos : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne + have hCd_lt : Cd < ⊤ := + ENNReal.rpow_lt_top_of_nonneg (one_div_nonneg.mpr hp_pos.le) + (ENNReal.pow_ne_top (by simp)) + have hCgns_lt : Cgns < ⊤ := by + rw [hCgns] + exact ENNReal.coe_lt_top + set C0 : ℝ≥0∞ := Cgns * Cd * ((((m + 1) * 32 : ℕ)) : ℝ≥0∞) with hC0 + have hC0_lt : C0 < ⊤ := by + rw [hC0] + exact ENNReal.mul_lt_top (ENNReal.mul_lt_top hCgns_lt hCd_lt) + (ENNReal.natCast_lt_top _) + refine ⟨C0.toNNReal + 1, add_pos_of_nonneg_of_pos (zero_le) one_pos, + fun q hpq z L hL u => ?_⟩ + set hi : Vec (m + 1) := fun k => z k + L with hhi + have hlt : ∀ k, z k < hi k := fun k => by simp only [hhi]; linarith + have hval : ∀ k, hi k = z k + L := fun k => by simp only [hhi] + show eLpNorm u.toFun q.exponent (volume.restrict (Box z hi)) ≤ + (↑(C0.toNNReal + 1) : ℝ≥0∞) * + ((∑ i, eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun p.exponent (volume.restrict (Box z hi))) + have hV : IsOpenBoundedConvexDomain (Box3 z hi) := + isOpenBoundedConvexDomain_Box _ _ + let : IsFiniteMeasure (volume.restrict (Box3 z hi)) := + hV.isFiniteMeasure_restrict_volume + let : IsLocallyFiniteMeasure (volume.restrict (Box3 z hi)) := inferInstance + set Ext := foldExtensionFiniteP z hi hlt p u + set Eu : W1pFunction (Box3 z hi) p.exponent := Ext.Eu with hEu + set χ : Vec (m + 1) → ℝ := boxCutoff z hi (L / 2) + have hχ_smooth : ContDiff ℝ (⊤ : ℕ∞) χ := boxCutoff_contDiff + obtain ⟨hχ_cptsupp, hχ_one, hχ_sub, hχ_deriv⟩ := + boxCutoff_halfSide_properties z hi L hL hval + have hχ_le1 : ∀ x, ‖χ x‖ ≤ 1 := fun x => by + rw [Real.norm_of_nonneg (boxCutoff_nonneg x)] + exact boxCutoff_le_one x + set x0 : Vec (m + 1) := fun k => (z k + hi k) / 2 with hx0 + set r : ℝ := L / 4 with hrdef + have hr : 0 < r := by rw [hrdef]; linarith + have hball : Metric.closedBall x0 r ⊆ Box3 z hi := by + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff hr.le] at hx + rw [Box3_eq_Box] + refine Set.mem_univ_pi.2 fun k => ?_ + have hxk : dist (x k) (x0 k) ≤ r := hx k + rw [Real.dist_eq, abs_le] at hxk + rw [hx0, hrdef] at hxk + rw [hhi] + constructor <;> nlinarith [hxk.1, hxk.2, hL] + set A : ℕ → W1pFunction (Box3 z hi) p.exponent := + W1pFunction.convexApproxSmoothW1p hV p.one_lt.le Eu x0 hr + have hA_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (A n).toFun := by + intro n + simp [A, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + exact contDiff_convexApproxSmoothRepresentative hV.isOpen.measurableSet + (isConvexApproxKernel_unitConvexApproxKernel) p.one_lt.le Eu.memLp hr + (W1pFunction.unitConvexApproxScale_pos n) + have hA_grad : ∀ n x i, (A n).grad x i = + fderiv ℝ ((A n).toFun) x (basisVec i) := by + intro n x i + simp [A, W1pFunction.convexApproxSmoothW1p, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + set ψ : ℕ → Vec (m + 1) → ℝ := fun n x => χ x * (A n).toFun x + have hψ_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψ n) := + fun n => hχ_smooth.mul (hA_smooth n) + have hψ_cptsupp : ∀ n, HasCompactSupport (ψ n) := + fun n => hχ_cptsupp.mul_right + have hψ_supp : ∀ n, tsupport (ψ n) ⊆ Box3 z hi := by + intro n + exact (tsupport_mul_subset_left (f := χ) (g := (A n).toFun)).trans hχ_sub + have hψ_dsupp : ∀ n i, + Function.support (fun x => fderiv ℝ (ψ n) x (basisVec i)) ⊆ Box3 z hi := by + intro n i + exact (subset_tsupport _).trans + ((tsupport_fderiv_apply_subset (f := ψ n) ℝ (basisVec i)).trans (hψ_supp n)) + have hrestr : ∀ (f : Vec (m + 1) → ℝ) (a : ℝ≥0∞), + Function.support f ⊆ Box3 z hi → + eLpNorm f a (volume.restrict (Box3 z hi)) = eLpNorm f a volume := + fun f a hf => eLpNorm_restrict_eq_of_support_subset hf + set a : ℕ → ℝ≥0∞ := fun n => + eLpNorm (ψ n) q.exponent (volume.restrict (Box3 z hi)) + set b : ℕ → ℝ≥0∞ := fun n => Cgns * ∑ i, + eLpNorm (fun x => fderiv ℝ (ψ n) x (basisVec i)) p.exponent + (volume.restrict (Box3 z hi)) + have hab : ∀ n, a n ≤ b n := by + intro n + show eLpNorm (ψ n) q.exponent (volume.restrict (Box3 z hi)) ≤ + Cgns * ∑ i, eLpNorm (fun x => fderiv ℝ (ψ n) x (basisVec i)) p.exponent + (volume.restrict (Box3 z hi)) + rw [hrestr _ _ ((subset_tsupport _).trans (hψ_supp n))] + refine (gns_coord_finiteLp hd' p q hp hpq + ((hψ_smooth n).of_le (by exact_mod_cast le_top)) (hψ_cptsupp n)).trans ?_ + refine mul_le_mul_right (le_of_eq (Finset.sum_congr rfl fun i _ => ?_)) _ + exact (hrestr _ _ (hψ_dsupp n i)).symm + have hA_tend := W1pFunction.tendsto_convexApproxSmoothW1p_toFun_eLpNorm_sub + hV p.one_lt.le p.lt_top.ne Eu hball hr + have hψ_tend : Filter.Tendsto (fun n => + eLpNorm (fun x => ψ n x - χ x * Eu.toFun x) p.exponent + (volume.restrict (Box3 z hi))) Filter.atTop (nhds 0) := by + simpa [ψ, volumeMeasureOn] using + tendsto_eLpNorm_mul_of_norm_le_one hχ_le1 hA_tend + set G : Fin (m + 1) → Vec (m + 1) → ℝ := fun i x => + χ x * Eu.grad x i + Eu.toFun x * fderiv ℝ χ x (basisVec i) + have hG_meas : ∀ i, AEStronglyMeasurable (G i) (volume.restrict (Box3 z hi)) := by + intro i + exact hχ_smooth.continuous.aestronglyMeasurable.mul + (Eu.grad_memLp i).aestronglyMeasurable |>.add + (Eu.memLp.aestronglyMeasurable.mul + (((hχ_smooth.continuous_fderiv (by simp)).clm_apply + continuous_const).aestronglyMeasurable)) + have hgrad_tend : ∀ i, Filter.Tendsto (fun n => + eLpNorm (fun x => fderiv ℝ (ψ n) x (basisVec i) - G i x) p.exponent + (volume.restrict (Box3 z hi))) Filter.atTop (nhds 0) := by + intro i + exact cutoff_gradient_tendsto p Eu A χ hχ_smooth hA_smooth hA_grad + (32 / L) (by positivity) hχ_le1 hχ_deriv hA_tend + (fun i => W1pFunction.tendsto_convexApproxSmoothW1p_grad_eLpNorm_sub + hV p.one_lt.le p.lt_top.ne Eu hball hr i) i + have hG_bound : ∀ i, eLpNorm (G i) p.exponent (volume.restrict (Box3 z hi)) ≤ + Cd * eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box z hi)) + + ENNReal.ofReal (32 / L) * + (Cd * eLpNorm u.toFun p.exponent (volume.restrict (Box z hi))) := by + intro i + exact (cutoff_gradient_eLpNorm_le p Eu χ hχ_smooth (32 / L) + (by positivity) hχ_le1 hχ_deriv i).trans + (add_le_add (Ext.grad_eLpNorm_le i) (mul_le_mul_right Ext.eLpNorm_le _)) + have hG_fin : ∀ i, eLpNorm (G i) p.exponent (volume.restrict (Box3 z hi)) < ⊤ := by + intro i + exact (hG_bound i).trans_lt (ENNReal.add_lt_top.2 + ⟨ENNReal.mul_lt_top hCd_lt (u.grad_memLp i).eLpNorm_lt_top, + ENNReal.mul_lt_top ENNReal.ofReal_lt_top + (ENNReal.mul_lt_top hCd_lt u.memLp.eLpNorm_lt_top)⟩) + set binf : ℝ≥0∞ := Cgns * ∑ i, + eLpNorm (G i) p.exponent (volume.restrict (Box3 z hi)) + have hb_tend : Filter.Tendsto b Filter.atTop (nhds binf) := by + change Filter.Tendsto + (fun n => Cgns * ∑ i, eLpNorm (fun x => fderiv ℝ (ψ n) x (basisVec i)) + p.exponent (volume.restrict (Box3 z hi))) Filter.atTop + (nhds (Cgns * ∑ i, eLpNorm (G i) p.exponent (volume.restrict (Box3 z hi)))) + refine ENNReal.Tendsto.const_mul (tendsto_finsetSum _ fun i _ => ?_) + (Or.inr hCgns_lt.ne) + exact tendsto_eLpNorm_of_tendsto_sub_finiteLp p.one_lt.le + (fun n => ((hψ_smooth n).continuous_fderiv (by simp) + |>.clm_apply continuous_const).aestronglyMeasurable) + (hG_meas i) (hG_fin i).ne (hgrad_tend i) + have hBox_sub : Box z hi ⊆ Box3 z hi := by + rw [Box3_eq_Box] + intro x hx + refine Set.mem_univ_pi.2 fun k => ?_ + have h := Set.mem_univ_pi.1 hx k + rw [hhi] at h ⊢ + exact ⟨by linarith [h.1, hL], by linarith [h.2, hL]⟩ + have hwu : (fun x => χ x * Eu.toFun x) =ᵐ[volume.restrict (Box z hi)] u.toFun := by + filter_upwards [ae_restrict_mem (isOpen_Box z hi).measurableSet, Ext.toFun_ae] + with x hx hEu + rw [hχ_one x hx, one_mul, hEu] + have hL1 : eLpNorm u.toFun q.exponent (volume.restrict (Box z hi)) ≤ + eLpNorm (fun x => χ x * Eu.toFun x) q.exponent (volume.restrict (Box3 z hi)) := by + rw [← eLpNorm_congr_ae hwu] + exact eLpNorm_mono_measure _ (Measure.restrict_mono hBox_sub le_rfl) + have htim : TendstoInMeasure (volume.restrict (Box3 z hi)) (fun n => ψ n) + Filter.atTop (fun x => χ x * Eu.toFun x) := + tendstoInMeasure_of_tendsto_eLpNorm + (ne_of_gt (zero_lt_one.trans p.one_lt)) + (fun n => (hψ_smooth n).continuous.aestronglyMeasurable) + (hχ_smooth.continuous.aestronglyMeasurable.mul Eu.memLp.aestronglyMeasurable) hψ_tend + have hL23 : eLpNorm (fun x => χ x * Eu.toFun x) q.exponent + (volume.restrict (Box3 z hi)) ≤ binf := + eLpNorm_le_of_tendstoInMeasure_bound + (fun n => (hψ_smooth n).continuous.aestronglyMeasurable) htim hab hb_tend + have hL4 : binf ≤ C0 * + ((∑ i, eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun p.exponent (volume.restrict (Box z hi))) := by + exact cutoff_gradient_sum_bound m Cgns Cd L + (fun i => eLpNorm (G i) p.exponent (volume.restrict (Box3 z hi))) + (fun i => eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box z hi))) + (eLpNorm u.toFun p.exponent (volume.restrict (Box z hi))) hG_bound + have hmain : eLpNorm u.toFun q.exponent (volume.restrict (Box z hi)) ≤ C0 * + ((∑ i, eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict (Box z hi))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun p.exponent (volume.restrict (Box z hi))) := + hL1.trans (hL23.trans hL4) + have hC0le : C0 ≤ (↑(C0.toNNReal + 1) : ℝ≥0∞) := by + rw [ENNReal.coe_add, ENNReal.coe_toNNReal hC0_lt.ne, ENNReal.coe_one] + exact le_self_add + exact hmain.trans (mul_le_mul_left hC0le _) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/OneDimIBP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/OneDimIBP.lean new file mode 100644 index 0000000000..2421419a11 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/OneDimIBP.lean @@ -0,0 +1,333 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Integral.IntervalIntegral.IntegrationByParts +public import Mathlib.MeasureTheory.Integral.IntegralEqImproper +public import Mathlib.Analysis.Calculus.Deriv.Basic + +/-! # One Dim IBP -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory intervalIntegral Set + +/-! +# One-dimensional integration by parts across a kink + +Standalone real-analysis lemma feeding the Fubini assembly of the single-face +even reflection. A function that is `C¹` on each side of a point `a` and +continuous across it integrates by parts against a `C¹` compactly supported test +with no interface term — the two boundary contributions at `a` cancel because +the function matches there. +-/ + +noncomputable section + +/-- **Integration by parts across a kink.** +If `f₁, f₂ : ℝ → ℝ` are `C¹` (globally, via `HasDerivAt` with continuous +derivatives) and agree at `a`, and `φ` is `C¹` with compact support, then the +piecewise function `t ↦ if t ≤ a then f₁ t else f₂ t` integrates by parts against +`φ'` with derivative the piecewise `t ↦ if t ≤ a then f₁' t else f₂' t` and **no** +boundary term. -/ +theorem integral_mul_deriv_piecewise_eq_neg (a : ℝ) + {f₁ f₂ f₁' f₂' φ φ' : ℝ → ℝ} + (hf₁ : ∀ x, HasDerivAt f₁ (f₁' x) x) (hf₁' : Continuous f₁') + (hf₂ : ∀ x, HasDerivAt f₂ (f₂' x) x) (hf₂' : Continuous f₂') + (hmatch : f₁ a = f₂ a) + (hφ : ∀ x, HasDerivAt φ (φ' x) x) (hφ' : Continuous φ') + (hφ_supp : HasCompactSupport φ) : + (∫ t, (if t ≤ a then f₁ t else f₂ t) * φ' t) + = -∫ t, (if t ≤ a then f₁' t else f₂' t) * φ t := by + have hcf₁ : Continuous f₁ := + continuous_iff_continuousAt.2 (fun x => (hf₁ x).continuousAt) + have hcf₂ : Continuous f₂ := + continuous_iff_continuousAt.2 (fun x => (hf₂ x).continuousAt) + have hcφ : Continuous φ := + continuous_iff_continuousAt.2 (fun x => (hφ x).continuousAt) + -- φ' vanishes off the (compact) support of φ + have hφ'_zero : ∀ x, x ∉ tsupport φ → φ' x = 0 := by + intro x hx + have hev : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport φ).isOpen_compl.eventually_mem hx |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + have h0 : HasDerivAt φ 0 x := by + have : HasDerivAt (fun _ : ℝ => (0 : ℝ)) 0 x := hasDerivAt_const x 0 + exact this.congr_of_eventuallyEq hev + exact (hφ x).unique h0 + -- choose R with tsupport φ ⊆ Icc (-R₀) R₀ and a, ±R strictly outside support + obtain ⟨R₀, hR₀⟩ := (hφ_supp.isBounded).subset_closedBall (0 : ℝ) + set R := |R₀| + |a| + 1 with hRdef + have hR_pos : 0 < R := by positivity + have hsub_Icc : tsupport φ ⊆ Icc (-|R₀|) |R₀| := by + intro x hx + have := hR₀ hx + rw [Real.closedBall_eq_Icc] at this + simp only [zero_sub, zero_add] at this + exact ⟨le_trans (neg_le_neg (le_abs_self R₀)) this.1, + le_trans this.2 (le_abs_self R₀)⟩ + have hR₀_lt : |R₀| < R := by rw [hRdef]; have := abs_nonneg a; linarith + have ha_mem : a ∈ Ioo (-R) R := by + constructor + · rw [hRdef]; have := neg_abs_le a; have := abs_nonneg R₀; linarith + · rw [hRdef]; have := le_abs_self a; have := abs_nonneg R₀; linarith + -- φ vanishes at ±R (they lie outside the support) + have hnotin : ∀ y : ℝ, |R₀| < |y| → y ∉ tsupport φ := by + intro y hy hymem + have := hsub_Icc hymem + rw [mem_Icc] at this + have : |y| ≤ |R₀| := abs_le.2 ⟨this.1, this.2⟩ + linarith + have hφR : φ R = 0 := + image_eq_zero_of_notMem_tsupport (hnotin R (by rw [abs_of_pos hR_pos]; exact hR₀_lt)) + have hφnegR : φ (-R) = 0 := + image_eq_zero_of_notMem_tsupport + (hnotin (-R) (by rw [abs_neg, abs_of_pos hR_pos]; exact hR₀_lt)) + -- support of any function that vanishes off tsupport φ lands in Ioc (-R) R + have hIoc : ∀ (F : ℝ → ℝ), (∀ x, x ∉ tsupport φ → F x = 0) → + Function.support F ⊆ Ioc (-R) R := by + intro F hF x hx + rw [Function.mem_support] at hx + have hmem : x ∈ tsupport φ := by + by_contra hc; exact hx (hF x hc) + have hxIcc := hsub_Icc hmem + rw [mem_Icc] at hxIcc + exact ⟨by linarith [hxIcc.1, hR₀_lt], le_of_lt (lt_of_le_of_lt hxIcc.2 hR₀_lt)⟩ + -- piecewise function and its piecewise derivative + set pw : ℝ → ℝ := fun t => if t ≤ a then f₁ t else f₂ t with hpw + set pwd : ℝ → ℝ := fun t => if t ≤ a then f₁' t else f₂' t with hpwd + have hle : -R ≤ a := le_of_lt ha_mem.1 + have hle' : a ≤ R := le_of_lt ha_mem.2 + have hpw_cont : Continuous pw := by + refine Continuous.if_le hcf₁ hcf₂ continuous_id continuous_const ?_ + intro x hx; rw [hx]; exact hmatch + -- integrands vanish off tsupport φ, so ℝ-integrals become interval integrals + have hFsupp : Function.support (fun t => pw t * φ' t) ⊆ Ioc (-R) R := + hIoc _ (fun x hx => by simp [hφ'_zero x hx]) + have hGsupp : Function.support (fun t => pwd t * φ t) ⊆ Ioc (-R) R := + hIoc _ (fun x hx => by simp [image_eq_zero_of_notMem_tsupport hx]) + -- interval-integrability of the four pieces + have hFII1 : IntervalIntegrable (fun t => pw t * φ' t) volume (-R) a := + (hpw_cont.mul hφ').intervalIntegrable _ _ + have hFII2 : IntervalIntegrable (fun t => pw t * φ' t) volume a R := + (hpw_cont.mul hφ').intervalIntegrable _ _ + have hGII1 : IntervalIntegrable (fun t => pwd t * φ t) volume (-R) a := by + refine (intervalIntegrable_congr (f := fun t => f₁' t * φ t) ?_).mp + ((hf₁'.mul hcφ).intervalIntegrable _ _) + intro t ht + rw [uIoc_of_le hle, mem_Ioc] at ht + simp [hpwd, if_pos ht.2] + have hGII2 : IntervalIntegrable (fun t => pwd t * φ t) volume a R := by + refine (intervalIntegrable_congr (f := fun t => f₂' t * φ t) ?_).mp + ((hf₂'.mul hcφ).intervalIntegrable _ _) + intro t ht + rw [uIoc_of_le hle', mem_Ioc] at ht + simp [hpwd, if_neg (not_le.mpr ht.1)] + -- the four interval-integral evaluations + have hL1 : ∫ t in (-R)..a, pw t * φ' t + = f₁ a * φ a - ∫ t in (-R)..a, f₁' t * φ t := by + rw [integral_congr (g := fun t => f₁ t * φ' t) (fun t ht => by + rw [uIcc_of_le hle, mem_Icc] at ht; simp [hpw, if_pos ht.2])] + rw [integral_mul_deriv_eq_deriv_mul_of_hasDerivAt hcf₁.continuousOn hcφ.continuousOn + (fun x _ => hf₁ x) (fun x _ => hφ x) + (hf₁'.intervalIntegrable _ _) (hφ'.intervalIntegrable _ _)] + rw [hφnegR, mul_zero, sub_zero] + have hL2 : ∫ t in a..R, pw t * φ' t + = -(f₂ a * φ a) - ∫ t in a..R, f₂' t * φ t := by + rw [integral_congr (g := fun t => f₂ t * φ' t) (fun t ht => by + rw [uIcc_of_le hle', mem_Icc] at ht + by_cases h : t ≤ a + · have hta : t = a := le_antisymm h ht.1 + subst hta; simp [hpw, if_pos h, hmatch] + · simp [hpw, if_neg h])] + rw [integral_mul_deriv_eq_deriv_mul_of_hasDerivAt hcf₂.continuousOn hcφ.continuousOn + (fun x _ => hf₂ x) (fun x _ => hφ x) + (hf₂'.intervalIntegrable _ _) (hφ'.intervalIntegrable _ _)] + rw [hφR, mul_zero, zero_sub] + have hR1 : ∫ t in (-R)..a, pwd t * φ t = ∫ t in (-R)..a, f₁' t * φ t := + integral_congr (fun t ht => by + rw [uIcc_of_le hle, mem_Icc] at ht; simp [hpwd, if_pos ht.2]) + have hR2 : ∫ t in a..R, pwd t * φ t = ∫ t in a..R, f₂' t * φ t := + integral_congr_ae (Filter.Eventually.of_forall (fun t ht => by + rw [uIoc_of_le hle', mem_Ioc] at ht + simp [hpwd, if_neg (not_le.mpr ht.1)])) + -- assemble + rw [← integral_eq_integral_of_support_subset hFsupp, + ← integral_eq_integral_of_support_subset hGsupp, + ← integral_add_adjacent_intervals hFII1 hFII2, + ← integral_add_adjacent_intervals hGII1 hGII2, + hL1, hL2, hR1, hR2, hmatch] + ring + +/-- **One-dimensional integration by parts** (globally `C¹` special case). +No interface, no boundary term. -/ +theorem integral_mul_deriv_eq_neg + {f f' φ φ' : ℝ → ℝ} + (hf : ∀ x, HasDerivAt f (f' x) x) (hf' : Continuous f') + (hφ : ∀ x, HasDerivAt φ (φ' x) x) (hφ' : Continuous φ') + (hφ_supp : HasCompactSupport φ) : + (∫ t, f t * φ' t) = -∫ t, f' t * φ t := by + have h := integral_mul_deriv_piecewise_eq_neg (a := 0) + hf hf' hf hf' rfl hφ hφ' hφ_supp + simpa only [ite_self] using h + +/-- A dichotomous integrand times a continuous compactly supported test is +integrable (each branch is continuous). -/ +private theorem integrable_ite_mul {p : ℝ → Prop} [DecidablePred p] + (hp : MeasurableSet {t | p t}) {g₁ g₂ φ : ℝ → ℝ} + (hg₁ : Continuous g₁) (hg₂ : Continuous g₂) + (hφ : Continuous φ) (hφc : HasCompactSupport φ) : + Integrable (fun t => (if p t then g₁ t else g₂ t) * φ t) := by + have hsplit : (fun t => (if p t then g₁ t else g₂ t) * φ t) + = fun t => (if p t then g₁ t * φ t else 0) + (if p t then 0 else g₂ t * φ t) := by + funext t; by_cases h : p t <;> simp [h] + rw [hsplit] + refine Integrable.add ?_ ?_ + · rw [show (fun t => if p t then g₁ t * φ t else 0) + = Set.indicator {t | p t} (fun t => g₁ t * φ t) from by + funext t; by_cases h : p t <;> simp [Set.indicator, h]] + exact ((hg₁.mul hφ).integrable_of_hasCompactSupport hφc.mul_left).indicator hp + · rw [show (fun t => if p t then 0 else g₂ t * φ t) + = Set.indicator {t | p t}ᶜ (fun t => g₂ t * φ t) from by + funext t; by_cases h : p t <;> simp [Set.indicator, h]] + exact ((hg₂.mul hφ).integrable_of_hasCompactSupport hφc.mul_left).indicator hp.compl + +/-- Almost every real number differs from a fixed point. -/ +private theorem ae_ne_pt (b : ℝ) : ∀ᵐ t ∂(volume : Measure ℝ), t ≠ b := by + rw [MeasureTheory.ae_iff]; simp + +/-- Additivity of the integral over a three-term pointwise sum. -/ +private theorem integral_add3 {g1 g2 g3 : ℝ → ℝ} + (h1 : Integrable g1) (h2 : Integrable g2) (h3 : Integrable g3) : + (∫ t, g1 t + g2 t + g3 t) = (∫ t, g1 t) + (∫ t, g2 t) + (∫ t, g3 t) := by + rw [show (∫ t, g1 t + g2 t + g3 t) + = (∫ t, g1 t + g2 t) + ∫ t, g3 t from + MeasureTheory.integral_add (h1.add h2) h3, + MeasureTheory.integral_add h1 h2] + +/-- **Integration by parts across two kinks.** +If `f₁, f₂, f₃` are globally `C¹` and match at `b₁ ≤ b₂` (`f₁ b₁ = f₂ b₁`, +`f₂ b₂ = f₃ b₂`), the continuous piecewise function +`t ↦ if t < b₁ then f₁ t else if b₂ < t then f₃ t else f₂ t` integrates by parts +against a `C¹` compactly supported test with the piecewise derivative and **no** +boundary term. -/ +theorem integral_mul_deriv_two_kink_eq_neg (b₁ b₂ : ℝ) (hb : b₁ ≤ b₂) + {f₁ f₂ f₃ f₁' f₂' f₃' φ φ' : ℝ → ℝ} + (hf₁ : ∀ x, HasDerivAt f₁ (f₁' x) x) (hf₁' : Continuous f₁') + (hf₂ : ∀ x, HasDerivAt f₂ (f₂' x) x) (hf₂' : Continuous f₂') + (hf₃ : ∀ x, HasDerivAt f₃ (f₃' x) x) (hf₃' : Continuous f₃') + (hm₁ : f₁ b₁ = f₂ b₁) (hm₂ : f₂ b₂ = f₃ b₂) + (hφ : ∀ x, HasDerivAt φ (φ' x) x) (hφ' : Continuous φ') (hφc : HasCompactSupport φ) : + (∫ t, (if t < b₁ then f₁ t else if b₂ < t then f₃ t else f₂ t) * φ' t) + = -∫ t, (if t < b₁ then f₁' t else if b₂ < t then f₃' t else f₂' t) * φ t := by + classical + have hcφ : Continuous φ := + continuous_iff_continuousAt.2 (fun x => (hφ x).continuousAt) + have hcf₂ : Continuous f₂ := + continuous_iff_continuousAt.2 (fun x => (hf₂ x).continuousAt) + -- `φ'` is compactly supported + have hφ'_zero : ∀ x, x ∉ tsupport φ → φ' x = 0 := by + intro x hx + have hev : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport φ).isOpen_compl.eventually_mem hx |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + exact (hφ x).unique ((hasDerivAt_const x (0 : ℝ)).congr_of_eventuallyEq hev) + have hφ'c : HasCompactSupport φ' := + HasCompactSupport.intro (K := tsupport φ) hφc hφ'_zero + have hcf₁ : Continuous f₁ := + continuous_iff_continuousAt.2 (fun x => (hf₁ x).continuousAt) + have hcf₃ : Continuous f₃ := + continuous_iff_continuousAt.2 (fun x => (hf₃ x).continuousAt) + -- three integration-by-parts identities + have hE0 : (∫ t, f₂ t * φ' t) = -∫ t, f₂' t * φ t := + integral_mul_deriv_eq_neg hf₂ hf₂' hφ hφ' hφc + have hE1 : (∫ t, (if t ≤ b₁ then f₁ t - f₂ t else 0) * φ' t) + = -∫ t, (if t ≤ b₁ then f₁' t - f₂' t else 0) * φ t := by + have h := integral_mul_deriv_piecewise_eq_neg b₁ + (f₁ := fun t => f₁ t - f₂ t) (f₂ := fun _ => (0 : ℝ)) + (f₁' := fun t => f₁' t - f₂' t) (f₂' := fun _ => (0 : ℝ)) + (fun x => (hf₁ x).sub (hf₂ x)) (hf₁'.sub hf₂') + (fun x => hasDerivAt_const x 0) continuous_const + (sub_eq_zero.mpr hm₁) hφ hφ' hφc + simpa using h + have hE2 : (∫ t, (if t ≤ b₂ then (0 : ℝ) else f₃ t - f₂ t) * φ' t) + = -∫ t, (if t ≤ b₂ then (0 : ℝ) else f₃' t - f₂' t) * φ t := by + have h := integral_mul_deriv_piecewise_eq_neg b₂ + (f₁ := fun _ => (0 : ℝ)) (f₂ := fun t => f₃ t - f₂ t) + (f₁' := fun _ => (0 : ℝ)) (f₂' := fun t => f₃' t - f₂' t) + (fun x => hasDerivAt_const x 0) continuous_const + (fun x => (hf₃ x).sub (hf₂ x)) (hf₃'.sub hf₂') + (by simpa using (sub_eq_zero.mpr hm₂.symm).symm) hφ hφ' hφc + simpa using h + -- integrabilities + have hI0 : Integrable (fun t => f₂ t * φ' t) := + (hcf₂.mul hφ').integrable_of_hasCompactSupport hφ'c.mul_left + have hIc1 : Integrable (fun t => (if t ≤ b₁ then f₁ t - f₂ t else 0) * φ' t) := + integrable_ite_mul measurableSet_Iic (hcf₁.sub hcf₂) continuous_const hφ' hφ'c + have hIc2 : Integrable (fun t => (if t ≤ b₂ then (0 : ℝ) else f₃ t - f₂ t) * φ' t) := + integrable_ite_mul measurableSet_Iic continuous_const (hcf₃.sub hcf₂) hφ' hφ'c + have hJ0 : Integrable (fun t => f₂' t * φ t) := + (hf₂'.mul hcφ).integrable_of_hasCompactSupport hφc.mul_left + have hJc1 : Integrable (fun t => (if t ≤ b₁ then f₁' t - f₂' t else 0) * φ t) := + integrable_ite_mul measurableSet_Iic (hf₁'.sub hf₂') continuous_const hcφ hφc + have hJc2 : Integrable (fun t => (if t ≤ b₂ then (0 : ℝ) else f₃' t - f₂' t) * φ t) := + integrable_ite_mul measurableSet_Iic continuous_const (hf₃'.sub hf₂') hcφ hφc + -- pointwise decompositions + have hFsum : ∀ t, (if t < b₁ then f₁ t else if b₂ < t then f₃ t else f₂ t) + = f₂ t + (if t ≤ b₁ then f₁ t - f₂ t else 0) + + (if t ≤ b₂ then (0 : ℝ) else f₃ t - f₂ t) := by + intro t + rcases lt_trichotomy t b₁ with h | h | h + · rw [if_pos h, if_pos (le_of_lt h), if_pos (le_of_lt (lt_of_lt_of_le h hb))]; ring + · subst h + rw [if_neg (lt_irrefl _), if_neg (by linarith : ¬ b₂ < t), + if_pos (le_refl t), if_pos (by linarith : t ≤ b₂), hm₁]; ring + · rw [if_neg (not_lt.mpr (le_of_lt h)), if_neg (by linarith : ¬ t ≤ b₁)] + rcases lt_trichotomy t b₂ with h2 | h2 | h2 + · rw [if_neg (not_lt.mpr (le_of_lt h2)), if_pos (le_of_lt h2)]; ring + · subst h2 + rw [if_neg (lt_irrefl _), if_pos (le_refl t)]; ring + · rw [if_pos h2, if_neg (by linarith : ¬ t ≤ b₂)]; ring + have hPWD : ∀ t, t ≠ b₁ → t ≠ b₂ → + f₂' t + (if t ≤ b₁ then f₁' t - f₂' t else 0) + + (if t ≤ b₂ then (0 : ℝ) else f₃' t - f₂' t) + = (if t < b₁ then f₁' t else if b₂ < t then f₃' t else f₂' t) := by + intro t ht1 ht2 + rcases lt_trichotomy t b₁ with h | h | h + · rw [if_pos (le_of_lt h), if_pos (le_of_lt (lt_of_lt_of_le h hb)), if_pos h]; ring + · exact absurd h ht1 + · rw [if_neg (by linarith : ¬ t ≤ b₁), if_neg (not_lt.mpr (le_of_lt h))] + rcases lt_trichotomy t b₂ with h2 | h2 | h2 + · rw [if_pos (le_of_lt h2), if_neg (not_lt.mpr (le_of_lt h2))]; ring + · exact absurd h2 ht2 + · rw [if_neg (by linarith : ¬ t ≤ b₂), if_pos h2]; ring + -- assemble + calc (∫ t, (if t < b₁ then f₁ t else if b₂ < t then f₃ t else f₂ t) * φ' t) + = ∫ t, (f₂ t * φ' t + (if t ≤ b₁ then f₁ t - f₂ t else 0) * φ' t + + (if t ≤ b₂ then (0 : ℝ) else f₃ t - f₂ t) * φ' t) := + MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall fun t => by + simp only [hFsum t]; ring) + _ = (∫ t, f₂ t * φ' t) + (∫ t, (if t ≤ b₁ then f₁ t - f₂ t else 0) * φ' t) + + (∫ t, (if t ≤ b₂ then (0 : ℝ) else f₃ t - f₂ t) * φ' t) := + integral_add3 hI0 hIc1 hIc2 + _ = -((∫ t, f₂' t * φ t) + (∫ t, (if t ≤ b₁ then f₁' t - f₂' t else 0) * φ t) + + (∫ t, (if t ≤ b₂ then (0 : ℝ) else f₃' t - f₂' t) * φ t)) := by + rw [hE0, hE1, hE2]; ring + _ = -(∫ t, (f₂' t * φ t + (if t ≤ b₁ then f₁' t - f₂' t else 0) * φ t + + (if t ≤ b₂ then (0 : ℝ) else f₃' t - f₂' t) * φ t)) := by + rw [integral_add3 hJ0 hJc1 hJc2] + _ = -∫ t, (if t < b₁ then f₁' t else if b₂ < t then f₃' t else f₂' t) * φ t := by + congr 1 + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [ae_ne_pt b₁, ae_ne_pt b₂] with t ht1 ht2 + simp only [← hPWD t ht1 ht2]; ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/PeelFubini.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/PeelFubini.lean new file mode 100644 index 0000000000..cc712910fc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/CubeEmbedding/PeelFubini.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Integral.Prod +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic + +/-! # Peel Fubini -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization + +/-! +# Coordinate-peeling Fubini on `Vec d` + +Reusable slicing lemma: an integral over `Vec (n+1) = Fin (n+1) → ℝ` against +Lebesgue `volume` equals the iterated integral obtained by peeling off a chosen +coordinate `i` as the inner one-dimensional line integral (the remaining +coordinates outer). The line through `z : Vec n` in direction `i` is +`t ↦ i.insertNth t z`. + +This is the tool into which the single-face reflection transport feeds its +per-line one-dimensional integration by parts. +-/ + +noncomputable section + +/-- **Coordinate-peeling Fubini.** +For `f : Vec (n+1) → ℝ` integrable against `volume` and a coordinate `i`, the +integral equals the iterated integral with the `i`-th coordinate innermost: +`∫ x, f x = ∫ z, ∫ t, f (i.insertNth t z)`. -/ +theorem integral_peel_coord {n : ℕ} (i : Fin (n + 1)) + {f : Vec (n + 1) → ℝ} + (hf : Integrable f (volume : Measure (Vec (n + 1)))) : + (∫ x, f x ∂(volume : Measure (Vec (n + 1)))) + = ∫ z : Vec n, ∫ t : ℝ, f (i.insertNth t z) + ∂(volume : Measure ℝ) ∂(volume : Measure (Vec n)) := by + classical + set μ : ∀ _ : Fin (n + 1), Measure ℝ := fun _ => volume with hμ + have hmp := measurePreserving_piFinSuccAbove μ i + set e := MeasurableEquiv.piFinSuccAbove (fun _ : Fin (n + 1) => ℝ) i with he + have hvol : (volume : Measure (Vec (n + 1))) = Measure.pi μ := volume_pi + -- integrability of the change-of-variables integrand + have hf' : Integrable (fun p => f (e.symm p)) + ((μ i).prod (Measure.pi fun j => μ (i.succAbove j))) := by + have hpi : Integrable f (Measure.pi μ) := by rw [← hvol]; exact hf + exact hmp.symm.integrable_comp_of_integrable hpi + rw [hvol, ← hmp.symm.integral_comp' f, integral_prod_symm _ hf'] + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpCoordinate.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpCoordinate.lean new file mode 100644 index 0000000000..a0c46a6cb7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpCoordinate.lean @@ -0,0 +1,230 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Finite-`p` coordinate bounds for direct Euclidean fields + +These inequalities compare the project-vector coordinate functions with the +Euclidean Hilbert realization `HilbertVec.ofVec`, while leaving the project's +ambient product norm unchanged. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +private theorem finiteLpExponent_one_le (p : FiniteLpExponent) : 1 ≤ p.exponent := + p.one_lt.le + +private theorem finiteLpExponent_toReal_nonneg (p : FiniteLpExponent) : + 0 ≤ p.exponent.toReal := + ENNReal.toReal_nonneg + +private theorem finiteLpExponent_one_le_toReal (p : FiniteLpExponent) : + 1 ≤ p.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.lt_top.ne p.one_lt.le + +/-- For a finite family of extended nonnegative reals and an exponent at +least one, the sum of the powers is bounded by the power of the sum. -/ +theorem ennreal_sum_rpow_le_rpow_sum {ι : Type*} [Fintype ι] + (a : ι → ℝ≥0∞) {p : ℝ} (hp : 1 ≤ p) : + ∑ i, (a i) ^ p ≤ (∑ i, a i) ^ p := by + induction (Finset.univ : Finset ι) using Finset.cons_induction with + | empty => simp + | cons x s hx ih => + rw [Finset.sum_cons, Finset.sum_cons] + calc + a x ^ p + ∑ i ∈ s, (a i) ^ p ≤ a x ^ p + (∑ i ∈ s, a i) ^ p := by + gcongr + _ ≤ (a x + ∑ i ∈ s, a i) ^ p := + ENNReal.add_rpow_le_rpow_add _ _ hp + +/-- For a finite family of extended nonnegative reals and an exponent at +least one, the power of the sum is bounded by the cardinality Hölder factor +times the sum of the powers. -/ +theorem ennreal_rpow_sum_le_card_rpow_mul_sum_rpow {ι : Type*} [Fintype ι] + (a : ι → ℝ≥0∞) {p : ℝ} (hp : 1 ≤ p) : + (∑ i, a i) ^ p ≤ + (Fintype.card ι : ℝ≥0∞) ^ (p - 1) * ∑ i, (a i) ^ p := by + simpa using + ENNReal.rpow_sum_le_const_mul_sum_rpow (s := Finset.univ) (f := a) hp + +/-- The lower finite-dimensional power-sum comparison at a campaign finite +`L^p` exponent. -/ +theorem finiteLpExponent_sum_rpow_le_rpow_sum {ι : Type*} [Fintype ι] + (a : ι → ℝ≥0∞) (p : FiniteLpExponent) : + ∑ i, (a i) ^ p.exponent.toReal ≤ + (∑ i, a i) ^ p.exponent.toReal := + ennreal_sum_rpow_le_rpow_sum a (finiteLpExponent_one_le_toReal p) + +/-- The upper finite-dimensional power-sum comparison at a campaign finite +`L^p` exponent, valid also when one of the summands is infinite. -/ +theorem finiteLpExponent_rpow_sum_le_card_rpow_mul_sum_rpow + {ι : Type*} [Fintype ι] (a : ι → ℝ≥0∞) (p : FiniteLpExponent) : + (∑ i, a i) ^ p.exponent.toReal ≤ + (Fintype.card ι : ℝ≥0∞) ^ (p.exponent.toReal - 1) * + ∑ i, (a i) ^ p.exponent.toReal := + ennreal_rpow_sum_le_card_rpow_mul_sum_rpow a + (finiteLpExponent_one_le_toReal p) + +/-- A coordinate of a project vector is bounded by its explicit Euclidean +magnitude. -/ +theorem abs_coordinate_le_euclideanNorm {d : ℕ} (v : Vec d) (i : Fin d) : + |v i| ≤ euclideanNorm v := by + rw [euclideanNorm_eq_norm_ofVec] + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + HilbertVec.abs_apply_le_norm (HilbertVec.ofVec v) i + +/-- The extended `L^p` norm of a scalar coordinate is bounded by that of the +direct Euclidean Hilbert realization, without a measurability premise. -/ +theorem coordinate_eLpNorm_le_euclidean {α : Type*} [MeasurableSpace α] + {d : ℕ} (μ : Measure α) (p : FiniteLpExponent) + (F : α → Vec d) (i : Fin d) : + eLpNorm (fun x => F x i) p.exponent μ ≤ + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ := by + by_cases hF : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) μ + · have hi : AEStronglyMeasurable (fun x => F x i) μ := by + simpa only [HilbertVec.continuousLinearEquivVec_apply, HilbertVec.toVec_ofVec] using + (continuous_apply i).comp_aestronglyMeasurable + ((HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable hF) + apply eLpNorm_mono_ae hi + filter_upwards [] with x + simpa only [Real.norm_eq_abs, HilbertVec.ofVec, PiLp.toLp_apply] using + HilbertVec.abs_apply_le_norm (HilbertVec.ofVec (F x)) i + · rw [eLpNorm_of_not_aestronglyMeasurable hF] + exact le_top + +/-- The finite sum of coordinate `p`-powers is bounded by `d` times the +direct Euclidean vector `p`-power. -/ +theorem sum_coordinate_eLpNorm_rpow_le_dimension_mul {α : Type*} + [MeasurableSpace α] {d : ℕ} (μ : Measure α) (p : FiniteLpExponent) + (F : α → Vec d) : + ∑ i : Fin d, (eLpNorm (fun x => F x i) p.exponent μ) ^ p.exponent.toReal ≤ + (d : ℝ≥0∞) * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal := by + calc + ∑ i : Fin d, (eLpNorm (fun x => F x i) p.exponent μ) ^ p.exponent.toReal ≤ + ∑ _i : Fin d, + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal := by + apply Finset.sum_le_sum + intro i _ + exact ENNReal.rpow_le_rpow + (coordinate_eLpNorm_le_euclidean μ p F i) + (finiteLpExponent_toReal_nonneg p) + _ = (d : ℝ≥0∞) * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal := by + simp [nsmul_eq_mul] + +/-- A direct Euclidean vector `L^p` norm is bounded by a dimension factor +times the finite sum of coordinate `L^p` norms. -/ +theorem euclidean_eLpNorm_le_dimension_mul_sum_coordinates + {α : Type*} [MeasurableSpace α] {d : ℕ} (μ : Measure α) + (p : FiniteLpExponent) (F : α → Vec d) + (hcoord : ∀ i : Fin d, AEStronglyMeasurable (fun x => F x i) μ) : + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ ≤ + ‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ := by + let D : α → ℝ := fun x => ∑ i : Fin d, ‖F x i‖ + have hcoord_norm_meas : ∀ i : Fin d, + AEStronglyMeasurable (fun x => ‖F x i‖) μ := by + intro i + exact (hcoord i).norm + have hpoint : ∀ᵐ x ∂μ, + ‖HilbertVec.ofVec (F x)‖ ≤ ‖(d : ℝ) * D x‖ := by + filter_upwards [] with x + have hDnonneg : 0 ≤ D x := + Finset.sum_nonneg fun i _ => norm_nonneg (F x i) + have hsup : ‖F x‖ ≤ D x := by + refine (pi_norm_le_iff_of_nonneg hDnonneg).2 ?_ + intro i + simpa only [Real.norm_eq_abs] using! + Finset.single_le_sum (fun j _ => norm_nonneg (F x j)) (Finset.mem_univ i) + have hhilbert : ‖HilbertVec.ofVec (F x)‖ ≤ (d : ℝ) * ‖F x‖ := + HilbertVec.norm_ofVec_le_mul_norm (F x) + have hmain : ‖HilbertVec.ofVec (F x)‖ ≤ (d : ℝ) * D x := + hhilbert.trans (mul_le_mul_of_nonneg_left hsup (by positivity)) + rw [Real.norm_eq_abs, abs_of_nonneg + (mul_nonneg (by positivity) hDnonneg)] + exact hmain + have hvec_le_D : + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ ≤ + eLpNorm (fun x => (d : ℝ) * D x) p.exponent μ := + eLpNorm_mono_ae + ((HilbertVec.continuousLinearEquivVec d).symm.continuous.comp_aestronglyMeasurable + (AEMeasurable.of_eval (fun i => (hcoord i).aemeasurable)).aestronglyMeasurable) hpoint + have hDsum : + eLpNorm D p.exponent μ ≤ + ∑ i : Fin d, eLpNorm (fun x => ‖F x i‖) p.exponent μ := by + have hD : D = ∑ i : Fin d, (fun x => ‖F x i‖) := by + funext x + simp [D] + rw [hD] + exact eLpNorm_sum_le (finiteLpExponent_one_le p) + calc + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ ≤ + eLpNorm ((d : ℝ) • D) p.exponent μ := by + simpa only [Pi.smul_apply, smul_eq_mul] using! hvec_le_D + _ = ‖(d : ℝ)‖ₑ * eLpNorm D p.exponent μ := + eLpNorm_const_smul _ _ _ _ + _ ≤ ‖(d : ℝ)‖ₑ * + ∑ i : Fin d, eLpNorm (fun x => ‖F x i‖) p.exponent μ := by + gcongr + _ = ‖(d : ℝ)‖ₑ * + ∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ := by + congr 1 + apply Finset.sum_congr rfl + intro i _ + exact eLpNorm_norm (f := fun x => F x i) (p := p.exponent) (μ := μ) (hcoord i) + +/-- Raising the coordinate-sum upper bound to the finite `p` power. -/ +theorem euclidean_eLpNorm_rpow_le_dimension_sum_rpow + {α : Type*} [MeasurableSpace α] {d : ℕ} (μ : Measure α) + (p : FiniteLpExponent) (F : α → Vec d) + (hcoord : ∀ i : Fin d, AEStronglyMeasurable (fun x => F x i) μ) : + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal ≤ + (‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ) ^ + p.exponent.toReal := + ENNReal.rpow_le_rpow + (euclidean_eLpNorm_le_dimension_mul_sum_coordinates μ p F hcoord) + (finiteLpExponent_toReal_nonneg p) + +/-- Expanded finite-`p` form of the coordinate-sum upper bound. -/ +theorem euclidean_eLpNorm_rpow_le_dimension_rpow_mul_sum_rpow + {α : Type*} [MeasurableSpace α] {d : ℕ} (μ : Measure α) + (p : FiniteLpExponent) (F : α → Vec d) + (hcoord : ∀ i : Fin d, AEStronglyMeasurable (fun x => F x i) μ) : + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal ≤ + ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + (∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ) ^ + p.exponent.toReal := by + calc + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent μ) ^ + p.exponent.toReal ≤ + (‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ) ^ + p.exponent.toReal := + euclidean_eLpNorm_rpow_le_dimension_sum_rpow μ p F hcoord + _ = ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + (∑ i : Fin d, eLpNorm (fun x => F x i) p.exponent μ) ^ + p.exponent.toReal := + ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_nonneg p) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpExponent.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpExponent.lean new file mode 100644 index 0000000000..9611095523 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/FiniteLpExponent.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 + +/-! +# Finite `L^p` exponents and Euclidean cube fields + +This module provides the exact finite-exponent carrier used by the Chapter 3 +analytic kernels, together with restriction of a Euclidean `L^p` field to a +subcube while retaining its same pointwise representative. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +structure FiniteLpExponent where + exponent : ℝ≥0∞ + one_lt : 1 < exponent + lt_top : exponent < ∞ + +namespace FiniteLpExponent + +private theorem eq_of_exponent_eq (p q : FiniteLpExponent) + (h : p.exponent = q.exponent) : p = q := by + cases p + cases q + simp_all + +noncomputable def conjugate (p : FiniteLpExponent) : FiniteLpExponent where + exponent := ENNReal.conjExponent p.exponent + one_lt := by + have hpq : ENNReal.HolderConjugate p.exponent + (ENNReal.conjExponent p.exponent) := + ENNReal.HolderConjugate.conjExponent p.one_lt.le + exact hpq.lt_top_iff_one_lt.mp p.lt_top + lt_top := by + have hpq : ENNReal.HolderConjugate p.exponent + (ENNReal.conjExponent p.exponent) := + ENNReal.HolderConjugate.conjExponent p.one_lt.le + exact hpq.symm.lt_top_iff_one_lt.mpr p.one_lt + +theorem holderConjugate (p : FiniteLpExponent) : + ENNReal.HolderConjugate p.exponent p.conjugate.exponent := + ENNReal.HolderConjugate.conjExponent p.one_lt.le + +@[simp] theorem conjugate_conjugate (p : FiniteLpExponent) : + p.conjugate.conjugate = p := by + apply eq_of_exponent_eq + change ENNReal.conjExponent (ENNReal.conjExponent p.exponent) = p.exponent + let : ENNReal.HolderConjugate p.exponent + (ENNReal.conjExponent p.exponent) := holderConjugate p + let : ENNReal.HolderConjugate (ENNReal.conjExponent p.exponent) + p.exponent := (holderConjugate p).symm + exact ENNReal.HolderConjugate.conjExponent_eq + +noncomputable def two : FiniteLpExponent where + exponent := 2 + one_lt := by norm_num + lt_top := by norm_num + +@[simp] theorem two_exponent : two.exponent = 2 := rfl + +@[simp] theorem conjugate_two : two.conjugate = two := by + apply eq_of_exponent_eq + change ENNReal.conjExponent 2 = 2 + exact ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) + +end FiniteLpExponent + +/-- Halving preserves the open interval of fractional orders. -/ +noncomputable def fractionalOrderHalf + (s : FractionalOrder) : FractionalOrder := + ⟨s.1 / 2, by constructor <;> nlinarith [s.2.1, s.2.2]⟩ + +@[simp] theorem fractionalOrderHalf_value (s : FractionalOrder) : + (fractionalOrderHalf s).1 = s.1 / 2 := rfl + +structure CubeEuclideanLpField {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) where + toField : Vec d → Vec d + euclideanMemLp : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (toField x)) p.exponent + (normalizedCubeMeasure Q) + +namespace CubeEuclideanLpField + +instance {d : ℕ} {Q : TriadicCube d} {p : FiniteLpExponent} : + CoeFun (CubeEuclideanLpField Q p) (fun _ => Vec d → Vec d) where + coe F := F.toField + +noncomputable def restrictToSubcube {d : ℕ} {Q R : TriadicCube d} + {p : FiniteLpExponent} (F : CubeEuclideanLpField Q p) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : CubeEuclideanLpField R p where + toField := F.toField + euclideanMemLp := by + have hQnormalized : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + simpa only [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using F.euclideanMemLp + have hQrestricted : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (cubeBoundedMeasurableDomain Q).restrictedVolume := + ((cubeBoundedMeasurableDomain Q).memLp_normalizedVolume_iff + p.exponent _).mp hQnormalized + have hOpenQ : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hQrestricted + have hOpenR : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet R)) := + hOpenQ.mono_measure (MeasureTheory.Measure.restrict_mono hRQ le_rfl) + have hRrestricted : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (cubeBoundedMeasurableDomain R).restrictedVolume := by + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hOpenR + have hRnormalized : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (cubeBoundedMeasurableDomain R).normalizedVolume := + ((cubeBoundedMeasurableDomain R).memLp_normalizedVolume_iff + p.exponent _).mpr hRrestricted + simpa only [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hRnormalized + +@[simp] theorem restrictToSubcube_toField {d : ℕ} + {Q R : TriadicCube d} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q p) + (hRQ : openCubeSet R ⊆ openCubeSet Q) : + (F.restrictToSubcube hRQ).toField = F.toField := rfl + +end CubeEuclideanLpField + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations.lean new file mode 100644 index 0000000000..93d3923b2f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AffineAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CenteredCubeCalderonZygmundQTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.HodgeCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AffineAverage.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AffineAverage.lean new file mode 100644 index 0000000000..6228ad5960 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AffineAverage.lean @@ -0,0 +1,155 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Affine Average -/ + +@[expose] public section + +namespace Homogenization + +namespace CorrectionFieldData + +theorem integral_pairing_affine_eq_volume_mul_vecDot + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + (X : CorrectionFieldData U) (p q : Vec d) : + ∫ x in U, vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * vecDot p q := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + exact + X.integral_pairing_affine_eq_volume_mul_vecDot_of_integral_eq_zero p q + (IsPotentialZeroTraceOn.integral_eq_zero X.isPotentialZeroTrace) + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU + X.isSolenoidalZeroNormalTrace) + +theorem integral_potential_affine_eq_volume_smul + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (X : CorrectionFieldData U) (p : Vec d) : + (fun i => ∫ x in U, (p + X.potential x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume U).toReal • p := by + have hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0 := + IsPotentialZeroTraceOn.integral_eq_zero X.isPotentialZeroTrace + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => p i) U := by + simp [MeasureTheory.IntegrableOn] + have hpotInt : + MeasureTheory.IntegrableOn (fun x => X.potential x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.potential_memL2 i + calc + ∫ x in U, (p + X.potential x) i ∂MeasureTheory.volume = + ∫ x in U, p i + X.potential x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (p i) ∂MeasureTheory.volume + + ∫ x in U, X.potential x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hpotInt] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.potential x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hpotZero i] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * p i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +theorem integral_flux_affine_eq_volume_smul + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + (X : CorrectionFieldData U) (q : Vec d) : + (fun i => ∫ x in U, (q + X.flux x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume U).toReal • q := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0 := + IsSolenoidalZeroNormalTraceOn.integral_eq_zero hU + X.isSolenoidalZeroNormalTrace + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => q i) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => X.flux x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.flux_memL2 i + calc + ∫ x in U, (q + X.flux x) i ∂MeasureTheory.volume = + ∫ x in U, q i + X.flux x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (q i) ∂MeasureTheory.volume + + ∫ x in U, X.flux x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.flux x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hfluxZero i] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * q i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +theorem average_potential_affine + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (X : CorrectionFieldData U) (p : Vec d) : + (fun i => integralAverage U (fun x => (p + X.potential x) i)) = p := by + have hint := X.integral_potential_affine_eq_volume_smul p + ext i + unfold integralAverage + rw [show ∫ x in U, (p + X.potential x) i ∂MeasureTheory.volume = + ((MeasureTheory.volume U).toReal • p) i by simpa using congrFun hint i] + have hcancel : + (MeasureTheory.volume U).toReal⁻¹ * ((MeasureTheory.volume U).toReal * p i) = p i := by + field_simp [hvol] + simpa using hcancel + +theorem average_flux_affine + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (X : CorrectionFieldData U) (q : Vec d) : + (fun i => integralAverage U (fun x => (q + X.flux x) i)) = q := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hint := X.integral_flux_affine_eq_volume_smul hU q + ext i + unfold integralAverage + rw [show ∫ x in U, (q + X.flux x) i ∂MeasureTheory.volume = + ((MeasureTheory.volume U).toReal • q) i by simpa using congrFun hint i] + have hcancel : + (MeasureTheory.volume U).toReal⁻¹ * ((MeasureTheory.volume U).toReal * q i) = q i := by + field_simp [hvol] + simpa using hcancel + +theorem average_state_affine + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (X : CorrectionFieldData U) (P : BlockVec d) : + ((fun i => integralAverage U (fun x => (P.1 + X.potential x) i)), + (fun i => integralAverage U (fun x => (P.2 + X.flux x) i))) = P := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + apply Prod.ext + · exact X.average_potential_affine hvol P.1 + · exact X.average_flux_affine hU hvol P.2 + +end CorrectionFieldData + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AxisCube.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AxisCube.lean new file mode 100644 index 0000000000..5320541bfd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/AxisCube.lean @@ -0,0 +1,65 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain + +/-! # Axis Cube -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators + +/-! +# Axis-aligned cube domains + +An axis cube `z + (0,L)^d` is the open box obtained by translating the product +of the open intervals `(0,L)` by a corner point `z`. This file records that +these boxes fit the ambient Sobolev geometry API: they are open, bounded, +convex, and hence open bounded convex domains. These are the reference domains +for the interior harmonic estimates. +-/ + +noncomputable section + +/-- The open axis cube `z + (0,L)^d`. -/ +def axisCube {d : ℕ} (z : Vec d) (L : ℝ) : Set (Vec d) := + Set.pi Set.univ fun j => Set.Ioo (z j) (z j + L) + +/-- Axis cubes are open finite products of open intervals. -/ +theorem isOpen_axisCube {d : ℕ} (z : Vec d) (L : ℝ) : + IsOpen (axisCube z L) := by + dsimp [axisCube] + exact isOpen_set_pi Set.finite_univ fun _ _ => isOpen_Ioo + +/-- Axis cubes are bounded, even in the degenerate or empty cases. -/ +theorem isBoundedDomain_axisCube {d : ℕ} (z : Vec d) (L : ℝ) : + IsBoundedDomain (axisCube z L) := by + dsimp [axisCube] + exact Bornology.IsBounded.isBoundedDomain <| + Bornology.IsBounded.pi fun _ => Metric.isBounded_Ioo _ _ + +/-- Axis cubes are convex finite products of convex intervals. -/ +theorem convex_axisCube {d : ℕ} (z : Vec d) (L : ℝ) : + Convex ℝ (axisCube z L) := by + dsimp [axisCube] + refine convex_pi ?_ + intro _ _ + exact convex_Ioo _ _ + +/-- Axis cubes are bounded open convex domains in the Sobolev geometry API. -/ +theorem isOpenBoundedConvexDomain_axisCube + {d : ℕ} (z : Vec d) (L : ℝ) : + IsOpenBoundedConvexDomain (axisCube z L) := + ⟨isOpen_axisCube z L, isBoundedDomain_axisCube z L, convex_axisCube z L⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CenteredCubeCalderonZygmundQTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CenteredCubeCalderonZygmundQTwo.lean new file mode 100644 index 0000000000..e7693cf1e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CenteredCubeCalderonZygmundQTwo.lean @@ -0,0 +1,113 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EuclideanNormalized +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.EuclideanNormalized + +/-! +# The common centered-cube Calderón--Zygmund `q = 2` constant + +This is the additive source-facing endpoint surface for the two Chapter 1 +classical inputs. It deliberately concerns only centered triadic cubes and +the presently formalized `q = 2` case. The same dimension-only constant is +used for its Dirichlet and mean-zero Neumann branches. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- The two exact centered-cube `q = 2` Calderón--Zygmund branches share the +same nonnegative dimension-only constant. In particular, the constant is +outside every cube-scale, forcing, and supplied-solution binder. -/ +def CenteredCubeCalderonZygmundQTwo (d : ℕ) (C : ℝ) : Prop := + CubeDirichletWeakPoissonProblem.OriginCubeDirichletCalderonZygmundQTwo d C ∧ + OriginCubeNeumannW22CalderonZygmundQTwo (d := d) C + +theorem CenteredCubeCalderonZygmundQTwo.constant_nonneg + {d : ℕ} {C : ℝ} (h : CenteredCubeCalderonZygmundQTwo d C) : + 0 ≤ C := + h.1.constant_nonneg + +/-- Extract the exact centered-cube Dirichlet `q = 2` branch. -/ +theorem CenteredCubeCalderonZygmundQTwo.dirichlet + {d : ℕ} {C : ℝ} (h : CenteredCubeCalderonZygmundQTwo d C) : + CubeDirichletWeakPoissonProblem.OriginCubeDirichletCalderonZygmundQTwo d C := + h.1 + +/-- Extract the exact centered-cube Neumann `q = 2` branch. Its forcing is +centered internally and its estimate applies to every supplied mean-zero +Neumann solution. -/ +theorem CenteredCubeCalderonZygmundQTwo.neumann + {d : ℕ} {C : ℝ} (h : CenteredCubeCalderonZygmundQTwo d C) : + OriginCubeNeumannW22CalderonZygmundQTwo (d := d) C := + h.2 + +private theorem originCube_dirichlet_calderon_zygmund_q_two_mono + {d : ℕ} {C D : ℝ} + (h : CubeDirichletWeakPoissonProblem.OriginCubeDirichletCalderonZygmundQTwo d C) + (hCD : C ≤ D) : + CubeDirichletWeakPoissonProblem.OriginCubeDirichletCalderonZygmundQTwo d D := by + refine ⟨h.constant_nonneg.trans hCD, ?_⟩ + intro m u F hF hweak H + refine (h.apply m u F hF hweak H).trans ?_ + exact mul_le_mul_of_nonneg_right hCD ENNReal.toReal_nonneg + +private theorem originCube_neumann_calderon_zygmund_q_two_mono + {d : ℕ} {C D : ℝ} + (h : OriginCubeNeumannW22CalderonZygmundQTwo (d := d) C) + (hCD : C ≤ D) : + OriginCubeNeumannW22CalderonZygmundQTwo (d := d) D := by + refine ⟨h.constant_nonneg.trans hCD, ?_⟩ + intro m F hF W H + refine (h.apply m F hF W H).trans ?_ + exact mul_le_mul_of_nonneg_right hCD ENNReal.toReal_nonneg + +/-- The explicit common dimension-only constant for the exact centered-cube +`q = 2` Dirichlet and Neumann branches. -/ +noncomputable def centeredCubeCalderonZygmundQTwoConstant (d : ℕ) [NeZero d] : ℝ := + max (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d) + (originCubeNeumannW22CalderonZygmundConstant d) + +theorem centeredCubeCalderonZygmundQTwoConstant_nonneg (d : ℕ) [NeZero d] : + 0 ≤ centeredCubeCalderonZygmundQTwoConstant d := by + unfold centeredCubeCalderonZygmundQTwoConstant + exact le_max_of_le_left + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d) + +/-- The explicit common constant simultaneously proves the exact normalized +Frobenius Dirichlet branch and the internally centered all-solutions Neumann +branch. -/ +theorem centeredCubeCalderonZygmundQTwo_exact + (d : ℕ) [NeZero d] : + CenteredCubeCalderonZygmundQTwo d (centeredCubeCalderonZygmundQTwoConstant d) := by + constructor + · exact originCube_dirichlet_calderon_zygmund_q_two_mono + (CubeDirichletWeakPoissonProblem.originCubeDirichletCalderonZygmundQTwo_exact d) + (by + unfold centeredCubeCalderonZygmundQTwoConstant + exact le_max_left _ _) + · exact originCube_neumann_calderon_zygmund_q_two_mono + (originCubeNeumannW22CalderonZygmund_qTwo d) + (by + unfold centeredCubeCalderonZygmundQTwoConstant + exact le_max_right _ _) + +/-- There is one dimension-only constant for both exact centered-cube +Calderón--Zygmund `q = 2` branches. -/ +theorem exists_centeredCubeCalderonZygmundQTwo + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CenteredCubeCalderonZygmundQTwo d C := + ⟨centeredCubeCalderonZygmundQTwoConstant d, + centeredCubeCalderonZygmundQTwo_exact d⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1.lean new file mode 100644 index 0000000000..ed8b55b1e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1.lean @@ -0,0 +1,727 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient + +/-! # Coercive H1 -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Coercive `H¹` Scaffolding + +This file packages the first reusable coercive layer above the witness-based +`H1Function` API. + +The key objects are: + +- a gauge-fixed mean-zero carrier `H1MeanZeroFunction U`; +- typed `L²(U)` and `L²(U; ℝ^d)` realizations of `u` and `∇u`; +- a bundled coercive estimate on the mean-zero carrier. + +The future bounded-open-convex Poincare theorem should produce +`H1CoerciveEstimate U` data, and the future Hodge proof should consume that +coercive layer rather than the raw witness structures directly. +-/ + +/-- Mean-zero `H¹(U)` functions, represented by a chosen `H¹` witness together +with the zero-average condition. -/ +structure H1MeanZeroFunction {d : ℕ} (U : Set (Vec d)) where + toH1Function : H1Function U + meanZero : MeanZeroOn U toH1Function.toFun + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} + +instance : Coe (H1MeanZeroFunction U) (H1Function U) where + coe u := u.toH1Function + +instance : CoeFun (H1MeanZeroFunction U) (fun _ => Vec d → ℝ) where + coe u := u.toH1Function + +@[simp] theorem coe_mk (u : H1Function U) (hmean : MeanZeroOn U u.toFun) : + ((⟨u, hmean⟩ : H1MeanZeroFunction U) : H1Function U) = u := + rfl + +@[ext] theorem ext {u v : H1MeanZeroFunction U} + (htoH1 : u.toH1Function = v.toH1Function) : u = v := by + cases u + cases v + cases htoH1 + rfl + +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +instance : Zero (H1MeanZeroFunction U) where + zero := + { toH1Function := 0 + meanZero := by + change ∫ x in U, (0 : ℝ) ∂MeasureTheory.volume = 0 + simp } + +instance : Add (H1MeanZeroFunction U) where + add u v := + { toH1Function := u.toH1Function + v.toH1Function + meanZero := by + have huInt : MeasureTheory.IntegrableOn u.toH1Function U := u.toH1Function.integrableOn + have hvInt : MeasureTheory.IntegrableOn v.toH1Function U := v.toH1Function.integrableOn + change ∫ x in U, (u.toH1Function + v.toH1Function) x ∂MeasureTheory.volume = 0 + rw [show (fun x => (u.toH1Function + v.toH1Function) x) = + fun x => u x + v x by rfl] + rw [MeasureTheory.integral_add huInt.integrable hvInt.integrable, u.meanZero, v.meanZero] + ring } + +instance : SMul ℝ (H1MeanZeroFunction U) where + smul c u := + { toH1Function := c • u.toH1Function + meanZero := by + change ∫ x in U, (c • u.toH1Function) x ∂MeasureTheory.volume = 0 + rw [show (fun x => (c • u.toH1Function) x) = fun x => c * u x by rfl] + rw [MeasureTheory.integral_const_mul, u.meanZero] + simp } + +instance : Neg (H1MeanZeroFunction U) where + neg u := (-1 : ℝ) • u + +instance : Sub (H1MeanZeroFunction U) where + sub u v := u + (-v) + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem toH1Function_zero : + ((0 : H1MeanZeroFunction U) : H1Function U) = 0 := + rfl + +@[simp] theorem toH1Function_add + (u v : H1MeanZeroFunction U) : + ((u + v : H1MeanZeroFunction U) : H1Function U) = (u : H1Function U) + (v : H1Function U) := + rfl + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem toH1Function_smul + (c : ℝ) (u : H1MeanZeroFunction U) : + ((c • u : H1MeanZeroFunction U) : H1Function U) = c • (u : H1Function U) := + rfl + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +@[simp] theorem toH1Function_neg + (u : H1MeanZeroFunction U) : + ((-u : H1MeanZeroFunction U) : H1Function U) = -(u : H1Function U) := + rfl + +@[simp] theorem toH1Function_sub + (u v : H1MeanZeroFunction U) : + ((u - v : H1MeanZeroFunction U) : H1Function U) = (u : H1Function U) - (v : H1Function U) := + rfl + +instance : SMul ℕ (H1MeanZeroFunction U) where + smul n u := (n : ℝ) • u + +instance : SMul ℤ (H1MeanZeroFunction U) where + smul n u := (n : ℝ) • u + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem toH1Function_injective : + Function.Injective (fun u : H1MeanZeroFunction U => (u : H1Function U)) := by + intro u v h + exact H1MeanZeroFunction.ext h + +instance : AddCommGroup (H1MeanZeroFunction U) := + Function.Injective.addCommGroup + (fun u : H1MeanZeroFunction U => (u : H1Function U)) + toH1Function_injective + rfl + (fun _ _ => rfl) + (fun _ => rfl) + (fun _ _ => rfl) + (fun u n => by + change ((n : ℝ) • (u : H1Function U)) = n • (u : H1Function U) + rfl) + (fun u n => by + change ((n : ℝ) • (u : H1Function U)) = n • (u : H1Function U) + rfl) + +noncomputable def toH1FunctionAddMonoidHom : + H1MeanZeroFunction U →+ H1Function U where + toFun := fun u => u.toH1Function + map_zero' := rfl + map_add' _ _ := rfl + +noncomputable instance : Module ℝ (H1MeanZeroFunction U) := + Function.Injective.module ℝ + toH1FunctionAddMonoidHom + toH1Function_injective + (fun _ _ => rfl) + +end H1MeanZeroFunction + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The scalar `L²(U)` realization of an `H¹` function. -/ +noncomputable def toScalarL2 (u : H1Function U) : ScalarL2 U := + Homogenization.toScalarL2 u.memL2 + +/-- The vector `L²(U; ℝ^d)` realization of the weak gradient. -/ +noncomputable def gradToVectorL2 (u : H1Function U) : VectorL2 U := + Homogenization.toVectorL2 u.grad_memVectorL2 + +/-- The Hilbert-vector `L²(U; ℝ^d)` realization of the weak gradient. -/ +noncomputable def gradToHilbertVectorL2 (u : H1Function U) : HilbertVectorL2 U := + Homogenization.toHilbertVectorL2OfVecField u.grad_memVectorL2 + +/-- The `i`th scalar `L²(U)` realization of the weak gradient. -/ +noncomputable def gradCoordToScalarL2 (u : H1Function U) (i : Fin d) : ScalarL2 U := + Homogenization.toScalarL2 (u.grad_memL2 i) + +/-- The sum of the scalar `L²` norms of the gradient coordinates. -/ +noncomputable def gradientCoordL2NormSum (u : H1Function U) : ℝ := + ∑ i, ‖u.gradCoordToScalarL2 i‖ + +theorem coeFn_toScalarL2 (u : H1Function U) : + u.toScalarL2 =ᵐ[volumeMeasureOn U] u := + Homogenization.coeFn_toScalarL2 u.memL2 + +theorem coeFn_gradToVectorL2 (u : H1Function U) : + u.gradToVectorL2 =ᵐ[volumeMeasureOn U] u.grad := + Homogenization.coeFn_toVectorL2 u.grad_memVectorL2 + +theorem coeFn_gradToHilbertVectorL2 (u : H1Function U) : + u.gradToHilbertVectorL2 =ᵐ[volumeMeasureOn U] hilbertifyVecField u.grad := + Homogenization.coeFn_toHilbertVectorL2OfVecField u.grad_memVectorL2 + +theorem coeFn_gradCoordToScalarL2 (u : H1Function U) (i : Fin d) : + u.gradCoordToScalarL2 i =ᵐ[volumeMeasureOn U] fun x => u.grad x i := + Homogenization.coeFn_toScalarL2 (u.grad_memL2 i) + +theorem toScalarL2_add (u v : H1Function U) : + (u + v).toScalarL2 = u.toScalarL2 + v.toScalarL2 := by + simpa [H1Function.toScalarL2] using! MeasureTheory.MemLp.toLp_add u.memL2 v.memL2 + +theorem toScalarL2_smul (c : ℝ) (u : H1Function U) : + (c • u).toScalarL2 = c • u.toScalarL2 := by + simpa [H1Function.toScalarL2] using! MeasureTheory.MemLp.toLp_const_smul c u.memL2 + +theorem gradToVectorL2_add (u v : H1Function U) : + (u + v).gradToVectorL2 = u.gradToVectorL2 + v.gradToVectorL2 := by + simpa [H1Function.gradToVectorL2] using! + MeasureTheory.MemLp.toLp_add u.grad_memVectorL2 v.grad_memVectorL2 + +theorem gradToVectorL2_smul (c : ℝ) (u : H1Function U) : + (c • u).gradToVectorL2 = c • u.gradToVectorL2 := by + simpa [H1Function.gradToVectorL2] using! + MeasureTheory.MemLp.toLp_const_smul c u.grad_memVectorL2 + +theorem gradToHilbertVectorL2_add (u v : H1Function U) : + (u + v).gradToHilbertVectorL2 = u.gradToHilbertVectorL2 + v.gradToHilbertVectorL2 := by + let hu : MemHilbertVectorL2 U (hilbertifyVecField u.grad) := + Homogenization.memHilbertVectorL2_hilbertifyVecField u.grad_memVectorL2 + let hv : MemHilbertVectorL2 U (hilbertifyVecField v.grad) := + Homogenization.memHilbertVectorL2_hilbertifyVecField v.grad_memVectorL2 + simpa [H1Function.gradToHilbertVectorL2, hilbertifyVecField] using! + MeasureTheory.MemLp.toLp_add hu hv + +theorem gradToHilbertVectorL2_smul (c : ℝ) (u : H1Function U) : + (c • u).gradToHilbertVectorL2 = c • u.gradToHilbertVectorL2 := by + let hu : MemHilbertVectorL2 U (hilbertifyVecField u.grad) := + Homogenization.memHilbertVectorL2_hilbertifyVecField u.grad_memVectorL2 + simpa [H1Function.gradToHilbertVectorL2, hilbertifyVecField] using! + MeasureTheory.MemLp.toLp_const_smul c hu + +theorem gradCoordToScalarL2_add (u v : H1Function U) (i : Fin d) : + (u + v).gradCoordToScalarL2 i = u.gradCoordToScalarL2 i + v.gradCoordToScalarL2 i := by + simpa [H1Function.gradCoordToScalarL2] using! + MeasureTheory.MemLp.toLp_add (u.grad_memL2 i) (v.grad_memL2 i) + +theorem gradCoordToScalarL2_smul (c : ℝ) (u : H1Function U) (i : Fin d) : + (c • u).gradCoordToScalarL2 i = c • u.gradCoordToScalarL2 i := by + simpa [H1Function.gradCoordToScalarL2] using! + MeasureTheory.MemLp.toLp_const_smul c (u.grad_memL2 i) + +theorem norm_gradCoordToScalarL2_le (u : H1Function U) (i : Fin d) : + ‖u.gradCoordToScalarL2 i‖ ≤ ‖u.gradToVectorL2‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards [coeFn_gradCoordToScalarL2 u i, coeFn_gradToVectorL2 u] with x hcoord hvec + rw [hcoord, hvec] + exact norm_le_pi_norm (u.grad x) i + +theorem gradientCoordL2NormSum_nonneg (u : H1Function U) : + 0 ≤ u.gradientCoordL2NormSum := by + exact Finset.sum_nonneg fun i _ => norm_nonneg _ + +theorem gradientCoordL2NormSum_le (u : H1Function U) : + u.gradientCoordL2NormSum ≤ d * ‖u.gradToVectorL2‖ := by + have hcoord : + ∀ i : Fin d, ‖u.gradCoordToScalarL2 i‖ ≤ ‖u.gradToVectorL2‖ := + norm_gradCoordToScalarL2_le u + calc + u.gradientCoordL2NormSum + = ∑ i : Fin d, ‖u.gradCoordToScalarL2 i‖ := rfl + _ ≤ ∑ _i : Fin d, ‖u.gradToVectorL2‖ := by + exact Finset.sum_le_sum fun i _ => hcoord i + _ = d * ‖u.gradToVectorL2‖ := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + +/-- Normalize an `H¹` function to its mean-zero representative by subtracting +the average. -/ +noncomputable def toMeanZero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : H1MeanZeroFunction U := + ⟨u.subAverage, u.meanZeroOn_subAverage⟩ + +/-- Alias for `toMeanZero`, matching the existing harmonic normalization API. -/ +noncomputable def normalizeMeanZero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : H1MeanZeroFunction U := + u.toMeanZero + +@[simp] theorem toMeanZero_toH1Function + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : + u.toMeanZero.toH1Function = u.subAverage := + rfl + +@[simp] theorem normalizeMeanZero_toH1Function + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : + u.normalizeMeanZero.toH1Function = u.subAverage := + rfl + +@[simp] theorem toMeanZero_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (x : Vec d) : + u.toMeanZero x = u x - integralAverage U u := by + simp [H1Function.toMeanZero] + +@[simp] theorem toMeanZero_grad + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (x : Vec d) : + u.toMeanZero.toH1Function.grad x = u.grad x := by + exact u.grad_subAverage x + +theorem gradToVectorL2_subAverage_eq + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : + u.subAverage.gradToVectorL2 = u.gradToVectorL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_gradToVectorL2 u.subAverage, coeFn_gradToVectorL2 u] + with x hsub hu + rw [hsub, hu] + exact u.grad_subAverage x + +/-- Pair a vector `L²` field with the weak gradient in the Hilbert `L²` +ambient space. -/ +noncomputable def gradientHilbertPairing {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (u : H1Function U) : ℝ := + inner ℝ (Homogenization.toHilbertVectorL2OfVecField hf) u.gradToHilbertVectorL2 + +theorem gradientHilbertPairing_eq_integral {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (u : H1Function U) : + u.gradientHilbertPairing hf = + ∫ x in U, vecDot (f x) (u.grad x) ∂MeasureTheory.volume := by + unfold H1Function.gradientHilbertPairing H1Function.gradToHilbertVectorL2 + rw [MeasureTheory.L2.inner_def] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [Homogenization.coeFn_toHilbertVectorL2OfVecField hf, + Homogenization.coeFn_toHilbertVectorL2OfVecField u.grad_memVectorL2] + with x hfx hux + rw [hfx, hux] + simp [hilbertifyVecField, HilbertVec.inner_def] + +theorem abs_gradientHilbertPairing_le {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (u : H1Function U) : + |u.gradientHilbertPairing hf| ≤ + ‖Homogenization.toHilbertVectorL2OfVecField hf‖ * ‖u.gradToHilbertVectorL2‖ := by + exact abs_real_inner_le_norm (Homogenization.toHilbertVectorL2OfVecField hf) u.gradToHilbertVectorL2 + +theorem norm_gradToHilbertVectorL2_le (u : H1Function U) : + ‖u.gradToHilbertVectorL2‖ ≤ (d : ℝ) * ‖u.gradToVectorL2‖ := by + exact Homogenization.norm_toHilbertVectorL2OfVecField_le + (U := U) (f := u.grad) u.grad_memVectorL2 + +theorem norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 (u : H1Function U) : + ‖u.gradToVectorL2‖ ≤ ‖u.gradToHilbertVectorL2‖ := by + exact Homogenization.norm_toVectorL2_le_toHilbertVectorL2OfVecField + (U := U) (f := u.grad) u.grad_memVectorL2 + +end H1Function + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The scalar `L²(U)` realization of a mean-zero `H¹` function. -/ +noncomputable def toScalarL2 (u : H1MeanZeroFunction U) : ScalarL2 U := + u.toH1Function.toScalarL2 + +/-- The vector `L²(U; ℝ^d)` realization of the weak gradient. -/ +noncomputable def gradToVectorL2 (u : H1MeanZeroFunction U) : VectorL2 U := + u.toH1Function.gradToVectorL2 + +/-- The Hilbert-vector `L²(U; ℝ^d)` realization of a mean-zero `H¹` +function's weak gradient. -/ +noncomputable def gradToHilbertVectorL2 (u : H1MeanZeroFunction U) : HilbertVectorL2 U := + u.toH1Function.gradToHilbertVectorL2 + +theorem toScalarL2_add [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u v : H1MeanZeroFunction U) : + (u + v).toScalarL2 = u.toScalarL2 + v.toScalarL2 := by + simpa [H1MeanZeroFunction.toScalarL2] using + H1Function.toScalarL2_add u.toH1Function v.toH1Function + +theorem toScalarL2_smul [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (c : ℝ) (u : H1MeanZeroFunction U) : + (c • u).toScalarL2 = c • u.toScalarL2 := by + simpa [H1MeanZeroFunction.toScalarL2] using + H1Function.toScalarL2_smul c u.toH1Function + +theorem gradToVectorL2_add [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u v : H1MeanZeroFunction U) : + (u + v).gradToVectorL2 = u.gradToVectorL2 + v.gradToVectorL2 := by + simpa [H1MeanZeroFunction.gradToVectorL2] using + H1Function.gradToVectorL2_add u.toH1Function v.toH1Function + +theorem gradToVectorL2_smul [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (c : ℝ) (u : H1MeanZeroFunction U) : + (c • u).gradToVectorL2 = c • u.gradToVectorL2 := by + simpa [H1MeanZeroFunction.gradToVectorL2] using + H1Function.gradToVectorL2_smul c u.toH1Function + +theorem gradToHilbertVectorL2_add [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u v : H1MeanZeroFunction U) : + (u + v).gradToHilbertVectorL2 = u.gradToHilbertVectorL2 + v.gradToHilbertVectorL2 := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2] using + H1Function.gradToHilbertVectorL2_add u.toH1Function v.toH1Function + +theorem gradToHilbertVectorL2_smul [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (c : ℝ) (u : H1MeanZeroFunction U) : + (c • u).gradToHilbertVectorL2 = c • u.gradToHilbertVectorL2 := by + simpa [H1MeanZeroFunction.gradToHilbertVectorL2] using + H1Function.gradToHilbertVectorL2_smul c u.toH1Function + +end H1MeanZeroFunction + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The scalar `L²` norm of a mean-zero `H¹` function. -/ +noncomputable def valueL2Norm (u : H1MeanZeroFunction U) : ℝ := + ‖u.toScalarL2‖ + +/-- The gradient-only `L²` norm which is the future coercive norm on the +mean-zero layer. -/ +noncomputable def gradientL2Norm (u : H1MeanZeroFunction U) : ℝ := + ‖u.gradToVectorL2‖ + +noncomputable instance [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + Norm (H1MeanZeroFunction U) where + norm u := u.gradientL2Norm + +@[simp] theorem norm_eq_gradientL2Norm + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1MeanZeroFunction U) : + ‖u‖ = u.gradientL2Norm := + rfl + +theorem seminormedSpaceCore [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + SeminormedSpace.Core ℝ (H1MeanZeroFunction U) where + norm_nonneg u := by + show 0 ≤ u.gradientL2Norm + exact norm_nonneg u.gradToVectorL2 + norm_smul c u := by + change ‖(c • u).gradToVectorL2‖ = ‖c‖ * ‖u.gradToVectorL2‖ + rw [H1MeanZeroFunction.gradToVectorL2_smul, norm_smul] + norm_triangle u v := by + change ‖(u + v).gradToVectorL2‖ ≤ ‖u.gradToVectorL2‖ + ‖v.gradToVectorL2‖ + rw [H1MeanZeroFunction.gradToVectorL2_add] + exact norm_add_le u.gradToVectorL2 v.gradToVectorL2 + +noncomputable instance [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + SeminormedAddCommGroup (H1MeanZeroFunction U) := + SeminormedAddCommGroup.ofCore (𝕜 := ℝ) seminormedSpaceCore + +noncomputable instance [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + NormedSpace ℝ (H1MeanZeroFunction U) where + norm_smul_le c u := by + rw [(seminormedSpaceCore (U := U)).norm_smul c u] + +/-- The gradient realization as a linear map into the Hilbert `L²` ambient +space. -/ +noncomputable def gradToHilbertVectorL2Linear [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + H1MeanZeroFunction U →ₗ[ℝ] HilbertVectorL2 U where + toFun := gradToHilbertVectorL2 + map_add' := gradToHilbertVectorL2_add + map_smul' := gradToHilbertVectorL2_smul + +@[simp] theorem gradToHilbertVectorL2Linear_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1MeanZeroFunction U) : + gradToHilbertVectorL2Linear (U := U) u = u.gradToHilbertVectorL2 := + rfl + +/-- The gradient realization as a continuous linear map for the gradient-only +seminorm on the mean-zero coercive layer. -/ +noncomputable def gradToHilbertVectorL2CLM [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + H1MeanZeroFunction U →L[ℝ] HilbertVectorL2 U := + (gradToHilbertVectorL2Linear (U := U)).mkContinuous (d : ℝ) + (fun u => by + change ‖u.toH1Function.gradToHilbertVectorL2‖ ≤ + (d : ℝ) * ‖u.toH1Function.gradToVectorL2‖ + exact H1Function.norm_gradToHilbertVectorL2_le (U := U) u.toH1Function) + +@[simp] theorem gradToHilbertVectorL2CLM_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1MeanZeroFunction U) : + gradToHilbertVectorL2CLM (d := d) (U := U) u = u.gradToHilbertVectorL2 := by + rw [gradToHilbertVectorL2CLM, LinearMap.mkContinuous_apply] + rfl + +/-- The gradient pairing of a mean-zero `H¹` function against an `L²` vector +field, realized through the Hilbert `L²` ambient space. -/ +noncomputable def gradientPairing {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : ℝ := + inner ℝ (Homogenization.toHilbertVectorL2OfVecField hf) u.gradToHilbertVectorL2 + +theorem gradientPairing_eq_integral {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + gradientPairing hf u = + ∫ x in U, vecDot (f x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + exact H1Function.gradientHilbertPairing_eq_integral (hf := hf) (u := u.toH1Function) + +theorem gradientPairing_add {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u v : H1MeanZeroFunction U) : + gradientPairing hf (u + v) = gradientPairing hf u + gradientPairing hf v := by + rw [H1MeanZeroFunction.gradientPairing, H1MeanZeroFunction.gradientPairing, + H1MeanZeroFunction.gradientPairing, H1MeanZeroFunction.gradToHilbertVectorL2_add, + inner_add_right] + +theorem gradientPairing_smul {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (c : ℝ) (u : H1MeanZeroFunction U) : + gradientPairing hf (c • u) = c * gradientPairing hf u := by + simpa [H1MeanZeroFunction.gradientPairing, H1MeanZeroFunction.gradToHilbertVectorL2_smul] using + inner_smul_right (Homogenization.toHilbertVectorL2OfVecField hf) u.gradToHilbertVectorL2 c + +/-- The gradient pairing, packaged as a linear functional on the mean-zero +coercive `H¹` layer. -/ +noncomputable def gradientPairingLinear {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) : H1MeanZeroFunction U →ₗ[ℝ] ℝ where + toFun := gradientPairing hf + map_add' := gradientPairing_add hf + map_smul' c u := by + simpa using gradientPairing_smul hf c u + +@[simp] theorem gradientPairingLinear_apply {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + gradientPairingLinear hf u = gradientPairing hf u := + rfl + +theorem abs_gradientPairing_le {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + |gradientPairing hf u| ≤ + ‖Homogenization.toHilbertVectorL2OfVecField hf‖ * ‖u.gradToHilbertVectorL2‖ := by + exact abs_real_inner_le_norm (Homogenization.toHilbertVectorL2OfVecField hf) u.gradToHilbertVectorL2 + +theorem norm_gradToHilbertVectorL2_le (u : H1MeanZeroFunction U) : + ‖u.gradToHilbertVectorL2‖ ≤ (d : ℝ) * u.gradientL2Norm := by + exact H1Function.norm_gradToHilbertVectorL2_le (U := U) u.toH1Function + +theorem gradientL2Norm_le_norm_gradToHilbertVectorL2 (u : H1MeanZeroFunction U) : + u.gradientL2Norm ≤ ‖u.gradToHilbertVectorL2‖ := by + exact H1Function.norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 (U := U) u.toH1Function + +theorem abs_gradientPairing_le_gradientL2Norm {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + |gradientPairing hf u| ≤ + ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm := by + calc + |gradientPairing hf u| ≤ + ‖Homogenization.toHilbertVectorL2OfVecField hf‖ * ‖u.gradToHilbertVectorL2‖ := + abs_gradientPairing_le hf u + _ ≤ ‖Homogenization.toHilbertVectorL2OfVecField hf‖ * ((d : ℝ) * u.gradientL2Norm) := by + exact mul_le_mul_of_nonneg_left (norm_gradToHilbertVectorL2_le (d := d) u) (norm_nonneg _) + _ = ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm := by + ring + +theorem norm_gradientPairingLinear_apply_le {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + ‖gradientPairingLinear hf u‖ ≤ + ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm := by + change ‖gradientPairing hf u‖ ≤ + ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm + simpa only [Real.norm_eq_abs] using abs_gradientPairing_le_gradientL2Norm (d := d) hf u + +/-- The gradient pairing as a continuous linear functional for the +gradient-only seminorm on the mean-zero coercive layer. -/ +noncomputable def gradientPairingCLM {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) : H1MeanZeroFunction U →L[ℝ] ℝ := by + letI : AddCommGroup (H1MeanZeroFunction U) := + (show SeminormedAddCommGroup (H1MeanZeroFunction U) from inferInstance).toAddCommGroup + letI : Module ℝ (H1MeanZeroFunction U) := inferInstance + exact (gradientPairingLinear hf).mkContinuous + (((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖)) + (fun u => by + change ‖gradientPairingLinear hf u‖ ≤ + ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm + exact norm_gradientPairingLinear_apply_le (d := d) hf u) + +@[simp] theorem gradientPairingCLM_apply {f : Vec d → Vec d} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + gradientPairingCLM hf u = gradientPairing hf u := by + let : AddCommGroup (H1MeanZeroFunction U) := + (show SeminormedAddCommGroup (H1MeanZeroFunction U) from inferInstance).toAddCommGroup + let : Module ℝ (H1MeanZeroFunction U) := inferInstance + show (gradientPairingLinear hf).mkContinuous + (((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖)) + (fun u => by + change ‖gradientPairingLinear hf u‖ ≤ + ((d : ℝ) * ‖Homogenization.toHilbertVectorL2OfVecField hf‖) * u.gradientL2Norm + exact norm_gradientPairingLinear_apply_le (d := d) hf u) u = gradientPairing hf u + rw [LinearMap.mkContinuous_apply] + rfl + +end H1MeanZeroFunction + +/-- Bundled coercive estimate on the mean-zero `H¹` layer. -/ +structure H1CoerciveEstimate {d : ℕ} (U : Set (Vec d)) where + fixedValue : ℝ + constant_nonneg : 0 ≤ fixedValue + bound : + ∀ u : H1MeanZeroFunction U, + u.valueL2Norm ≤ fixedValue * u.gradientL2Norm + +namespace H1CoerciveEstimate + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +theorem bound_subAverage (hC : H1CoerciveEstimate U) (u : H1Function U) : + (u.toMeanZero).valueL2Norm ≤ hC.fixedValue * ‖u.gradToVectorL2‖ := by + calc + (u.toMeanZero).valueL2Norm ≤ hC.fixedValue * (u.toMeanZero).gradientL2Norm := + hC.bound u.toMeanZero + _ = hC.fixedValue * ‖u.gradToVectorL2‖ := by + rw [H1MeanZeroFunction.gradientL2Norm, H1MeanZeroFunction.gradToVectorL2, + H1Function.toMeanZero_toH1Function, H1Function.gradToVectorL2_subAverage_eq] + +end H1CoerciveEstimate + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The value realization as a linear map into scalar `L²(U)`. -/ +noncomputable def toScalarL2Linear : H1MeanZeroFunction U →ₗ[ℝ] ScalarL2 U where + toFun := toScalarL2 + map_add' := toScalarL2_add + map_smul' := toScalarL2_smul + +@[simp] theorem toScalarL2Linear_apply (u : H1MeanZeroFunction U) : + toScalarL2Linear (U := U) u = u.toScalarL2 := + rfl + +theorem norm_toScalarL2Linear_apply_le (hC : H1CoerciveEstimate U) (u : H1MeanZeroFunction U) : + ‖toScalarL2Linear (U := U) u‖ ≤ hC.fixedValue * ‖u‖ := by + change ‖u.toScalarL2‖ ≤ hC.fixedValue * u.gradientL2Norm + exact hC.bound u + +/-- The value realization as a continuous linear map once a coercive estimate +controls `‖u‖_{L²}` by the gradient-only seminorm. -/ +noncomputable def toScalarL2CLM (hC : H1CoerciveEstimate U) : + H1MeanZeroFunction U →L[ℝ] ScalarL2 U := + (toScalarL2Linear (U := U)).mkContinuous hC.fixedValue + (norm_toScalarL2Linear_apply_le (U := U) hC) + +@[simp] theorem toScalarL2CLM_apply (hC : H1CoerciveEstimate U) (u : H1MeanZeroFunction U) : + toScalarL2CLM (U := U) hC u = u.toScalarL2 := by + show (toScalarL2Linear (U := U)).mkContinuous hC.fixedValue + (norm_toScalarL2Linear_apply_le (U := U) hC) u = u.toScalarL2 + rw [LinearMap.mkContinuous_apply] + rfl + +/-- The mean-zero coercive layer packaged in the Hilbert product +`L²(U) × L²(U; ℝᵈ)`. -/ +noncomputable def toHilbertProductLinear : + H1MeanZeroFunction U →ₗ[ℝ] (ScalarL2 U × HilbertVectorL2 U) where + toFun u := (u.toScalarL2, u.gradToHilbertVectorL2) + map_add' u v := by + ext <;> simp [toScalarL2_add, gradToHilbertVectorL2_add] + map_smul' c u := by + ext <;> simp [toScalarL2_smul, gradToHilbertVectorL2_smul] + +@[simp] theorem toHilbertProductLinear_apply (u : H1MeanZeroFunction U) : + toHilbertProductLinear (U := U) u = (u.toScalarL2, u.gradToHilbertVectorL2) := + rfl + +theorem norm_le_norm_toHilbertProductLinear_apply (u : H1MeanZeroFunction U) : + ‖u‖ ≤ ‖toHilbertProductLinear (d := d) (U := U) u‖ := by + calc + ‖u‖ = u.gradientL2Norm := by + rfl + _ ≤ ‖u.gradToHilbertVectorL2‖ := gradientL2Norm_le_norm_gradToHilbertVectorL2 (d := d) u + _ ≤ ‖(u.toScalarL2, u.gradToHilbertVectorL2)‖ := by + exact le_max_right ‖u.toScalarL2‖ ‖u.gradToHilbertVectorL2‖ + _ = ‖toHilbertProductLinear (d := d) (U := U) u‖ := by + rw [toHilbertProductLinear_apply] + +theorem norm_toHilbertProductLinear_apply_le + (hC : H1CoerciveEstimate U) (u : H1MeanZeroFunction U) : + ‖toHilbertProductLinear (d := d) (U := U) u‖ ≤ max hC.fixedValue (d : ℝ) * ‖u‖ := by + rw [toHilbertProductLinear_apply, Prod.norm_def] + refine max_le ?_ ?_ + · calc + ‖u.toScalarL2‖ ≤ hC.fixedValue * ‖u‖ := + norm_toScalarL2Linear_apply_le (U := U) hC u + _ ≤ max hC.fixedValue (d : ℝ) * ‖u‖ := by + exact mul_le_mul_of_nonneg_right (le_max_left _ _) (norm_nonneg _) + · calc + ‖u.gradToHilbertVectorL2‖ ≤ (d : ℝ) * ‖u‖ := by + change ‖u.toH1Function.gradToHilbertVectorL2‖ ≤ + (d : ℝ) * ‖u.toH1Function.gradToVectorL2‖ + exact H1Function.norm_gradToHilbertVectorL2_le (U := U) u.toH1Function + _ ≤ max hC.fixedValue (d : ℝ) * ‖u‖ := by + exact mul_le_mul_of_nonneg_right (le_max_right _ _) (norm_nonneg _) + +/-- The mean-zero coercive layer as a continuous linear map into +`L²(U) × L²(U; ℝᵈ)` once a coercive estimate is available. -/ +noncomputable def toHilbertProductCLM (hC : H1CoerciveEstimate U) : + H1MeanZeroFunction U →L[ℝ] (ScalarL2 U × HilbertVectorL2 U) := + (toHilbertProductLinear (U := U)).mkContinuous (max hC.fixedValue (d : ℝ)) + (norm_toHilbertProductLinear_apply_le (d := d) (U := U) hC) + +@[simp] theorem toHilbertProductCLM_apply + (hC : H1CoerciveEstimate U) (u : H1MeanZeroFunction U) : + toHilbertProductCLM (d := d) (U := U) hC u = (u.toScalarL2, u.gradToHilbertVectorL2) := by + show (toHilbertProductLinear (U := U)).mkContinuous (max hC.fixedValue (d : ℝ)) + (norm_toHilbertProductLinear_apply_le (d := d) (U := U) hC) u = + (u.toScalarL2, u.gradToHilbertVectorL2) + rw [LinearMap.mkContinuous_apply] + rfl + +theorem norm_le_norm_toHilbertProductCLM_apply + (hC : H1CoerciveEstimate U) (u : H1MeanZeroFunction U) : + ‖u‖ ≤ ‖toHilbertProductCLM (d := d) (U := U) hC u‖ := by + rw [toHilbertProductCLM_apply] + exact norm_le_norm_toHilbertProductLinear_apply (d := d) (U := U) u + +end H1MeanZeroFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH10.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH10.lean new file mode 100644 index 0000000000..f494f41644 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH10.lean @@ -0,0 +1,224 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveSmooth + +/-! # Coercive H10 -/ + +@[expose] public section + +namespace Homogenization + +namespace H10Function + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Package an `H¹₀` function's `n`th smooth compactly supported approximation as +an `H¹` function on an open domain. -/ +noncomputable def approxH1 (hU : IsOpen U) (u : H10Function U) (n : ℕ) : H1Function U := + H1Function.ofContDiff hU ((u.approx_smooth n).of_le (by simp)) (u.approx_hasCompactSupport n) + +theorem approx_memL2_sub_toH1_memL2 + (hU : IsOpen U) (u : H10Function U) (n : ℕ) : + MeasureTheory.MemLp (fun x => u.approx n x - u.toH1Function x) 2 (volumeMeasureOn U) := by + simpa [approxH1, H1Function.ofContDiff] using! + ((approxH1 hU u n).memL2.sub u.toH1Function.memL2) + +theorem approx_grad_memL2_sub_toH1_grad_memL2 + (hU : IsOpen U) (u : H10Function U) (n : ℕ) (i : Fin d) : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (volumeMeasureOn U) := by + simpa [approxH1, H1Function.ofContDiff] using! + (((approxH1 hU u n).grad_memL2 i).sub (u.toH1Function.grad_memL2 i)) + +theorem tendsto_approxH1_toScalarL2 + (hU : IsOpen U) (u : H10Function U) : + Filter.Tendsto (fun n => (approxH1 hU u n).toScalarL2) Filter.atTop + (nhds u.toH1Function.toScalarL2) := by + rw [tendsto_iff_dist_tendsto_zero] + have hdist : + (fun n => dist ((approxH1 hU u n).toScalarL2) u.toH1Function.toScalarL2) = + fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function x) 2 (volumeMeasureOn U)) := by + funext n + let v := approxH1 hU u n + have hedist0 : + edist v.toScalarL2 u.toH1Function.toScalarL2 = + MeasureTheory.eLpNorm (u.approx n - u.toH1Function.toFun) 2 (volumeMeasureOn U) := by + simp [v, approxH1, H1Function.toScalarL2, Homogenization.toScalarL2, H1Function.ofContDiff] + have hedist : + edist v.toScalarL2 u.toH1Function.toScalarL2 = + MeasureTheory.eLpNorm (fun x => u.approx n x - u.toH1Function x) 2 (volumeMeasureOn U) := by + calc + edist v.toScalarL2 u.toH1Function.toScalarL2 + = MeasureTheory.eLpNorm (u.approx n - u.toH1Function.toFun) 2 (volumeMeasureOn U) := hedist0 + _ = MeasureTheory.eLpNorm (fun x => u.approx n x - u.toH1Function x) 2 (volumeMeasureOn U) := by + rfl + rw [MeasureTheory.Lp.dist_edist, hedist] + rw [hdist] + exact (ENNReal.tendsto_toReal_zero_iff + (fun n => (approx_memL2_sub_toH1_memL2 (hU := hU) (u := u) n).eLpNorm_lt_top.ne)).2 u.tendsto_approx + +theorem tendsto_approxH1_gradCoordToScalarL2 + (hU : IsOpen U) (u : H10Function U) (i : Fin d) : + Filter.Tendsto (fun n => (approxH1 hU u n).gradCoordToScalarL2 i) Filter.atTop + (nhds (u.toH1Function.gradCoordToScalarL2 i)) := by + rw [tendsto_iff_dist_tendsto_zero] + have hdist : + (fun n => dist ((approxH1 hU u n).gradCoordToScalarL2 i) (u.toH1Function.gradCoordToScalarL2 i)) = + fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (volumeMeasureOn U)) := by + funext n + let v := approxH1 hU u n + have hedist0 : + edist (v.gradCoordToScalarL2 i) (u.toH1Function.gradCoordToScalarL2 i) = + MeasureTheory.eLpNorm + ((fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) - fun x => u.toH1Function.grad x i) + 2 (volumeMeasureOn U) := by + simp [v, approxH1, H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + H1Function.ofContDiff] + have hedist : + edist (v.gradCoordToScalarL2 i) (u.toH1Function.gradCoordToScalarL2 i) = + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (volumeMeasureOn U) := by + calc + edist (v.gradCoordToScalarL2 i) (u.toH1Function.gradCoordToScalarL2 i) + = MeasureTheory.eLpNorm + ((fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) - fun x => u.toH1Function.grad x i) + 2 (volumeMeasureOn U) := hedist0 + _ = MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (volumeMeasureOn U) := by + rfl + rw [MeasureTheory.Lp.dist_edist, hedist] + rw [hdist] + exact (ENNReal.tendsto_toReal_zero_iff + (fun n => (approx_grad_memL2_sub_toH1_grad_memL2 (hU := hU) (u := u) n i).eLpNorm_lt_top.ne)).2 + (u.tendsto_approx_grad i) + +theorem tendsto_approxH1_gradientCoordL2NormSum + (hU : IsOpen U) (u : H10Function U) : + Filter.Tendsto (fun n => (approxH1 hU u n).gradientCoordL2NormSum) Filter.atTop + (nhds u.toH1Function.gradientCoordL2NormSum) := by + simpa [H1Function.gradientCoordL2NormSum] using + tendsto_finsetSum Finset.univ + (fun i _ => + (continuous_norm.tendsto _).comp + (tendsto_approxH1_gradCoordToScalarL2 (hU := hU) (u := u) i)) + +/-- On bounded open convex domains, the `H¹₀` approximation package yields the +coercive estimate proved for smooth compactly supported functions in dimensions +`d ≥ 3`. -/ +theorem valueL2Norm_le_sobolevConst_mul_gradientCoordL2NormSum_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hd : 2 < d) (u : H10Function U) : + ‖u.toH1Function.toScalarL2‖ ≤ + (MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) : ℝ) * + u.toH1Function.gradientCoordL2NormSum := by + let C : ℝ := MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) + let ψ : ℕ → H1Function U := approxH1 hU.isOpen u + have hψ_bound : + ∀ n, ‖(ψ n).toScalarL2‖ ≤ C * (ψ n).gradientCoordL2NormSum := by + intro n + simpa [ψ, C, approxH1] using + (H1Function.valueL2Norm_le_sobolevConst_mul_gradientCoordL2NormSum_ofContDiff + (U := U) hU.isOpen hU.isBoundedDomain + (hf := u.approx_smooth n) + (hf_supp := u.approx_hasCompactSupport n) + (hf_sub := u.approx_support_subset n) + hd) + have hleft : + Filter.Tendsto (fun n => ‖(ψ n).toScalarL2‖) Filter.atTop + (nhds ‖u.toH1Function.toScalarL2‖) := by + simpa [ψ] using! + ((continuous_norm.tendsto _).comp + (tendsto_approxH1_toScalarL2 (hU := hU.isOpen) (u := u))) + have hright_grad : + Filter.Tendsto (fun n => (ψ n).gradientCoordL2NormSum) Filter.atTop + (nhds u.toH1Function.gradientCoordL2NormSum) := by + simpa [ψ] using + (tendsto_approxH1_gradientCoordL2NormSum (hU := hU.isOpen) (u := u)) + have hright : + Filter.Tendsto (fun n => C * (ψ n).gradientCoordL2NormSum) Filter.atTop + (nhds (C * u.toH1Function.gradientCoordL2NormSum)) := + tendsto_const_nhds.mul hright_grad + exact le_of_tendsto_of_tendsto' hleft hright hψ_bound + +/-- A coarser but more directly typed `H¹₀` coercive estimate, obtained by +bounding the coordinate-gradient sum by the repo's existing vector `L²` norm. -/ +theorem valueL2Norm_le_sobolevConst_mul_gradientL2Norm_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hd : 2 < d) (u : H10Function U) : + ‖u.toH1Function.toScalarL2‖ ≤ + ((MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) : ℝ) * d) * + ‖u.toH1Function.gradToVectorL2‖ := by + let C : ℝ := MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) + have hbase := + valueL2Norm_le_sobolevConst_mul_gradientCoordL2NormSum_of_isOpenBoundedConvexDomain hU hd u + have hcoord := u.toH1Function.gradientCoordL2NormSum_le + have hC_nonneg : 0 ≤ C := by + change 0 ≤ (MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) : ℝ) + positivity + calc + ‖u.toH1Function.toScalarL2‖ ≤ C * u.toH1Function.gradientCoordL2NormSum := by + simpa [C] using hbase + _ ≤ C * (d * ‖u.toH1Function.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hcoord hC_nonneg + _ = (C * d) * ‖u.toH1Function.gradToVectorL2‖ := by ring + +/-- On a bounded open convex domain, an `H¹₀` function with zero gradient +`L²` class has zero value `L²` class. -/ +theorem toScalarL2_eq_zero_of_gradToVectorL2_eq_zero_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hd : 2 < d) (u : H10Function U) + (hgrad : u.toH1Function.gradToVectorL2 = 0) : + u.toH1Function.toScalarL2 = 0 := by + have hbound := + valueL2Norm_le_sobolevConst_mul_gradientL2Norm_of_isOpenBoundedConvexDomain hU hd u + rw [hgrad, norm_zero, mul_zero] at hbound + exact norm_eq_zero.mp (le_antisymm hbound (norm_nonneg _)) + +/-- On a bounded open convex domain, an `H¹₀` function with zero weak gradient +has zero value `L²` class. -/ +theorem toScalarL2_eq_zero_of_grad_eq_zero_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hd : 2 < d) (u : H10Function U) + (hgrad : u.toH1Function.grad = 0) : + u.toH1Function.toScalarL2 = 0 := by + apply toScalarL2_eq_zero_of_gradToVectorL2_eq_zero_of_isOpenBoundedConvexDomain hU hd u + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_gradToVectorL2 u.toH1Function, + MeasureTheory.Lp.coeFn_zero (E := Vec d) (p := (2 : ENNReal)) (μ := volumeMeasureOn U)] + with x hx hzero + rw [hx, hgrad, hzero] + +/-- Existential constant form of the bounded-open-convex `H¹₀` coercive +estimate in dimensions `d ≥ 3`. -/ +theorem exists_valueL2_bound_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hd : 2 < d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : H10Function U, + ‖u.toH1Function.toScalarL2‖ ≤ C * u.toH1Function.gradientCoordL2NormSum := by + refine ⟨MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2), by positivity, ?_⟩ + intro u + exact valueL2Norm_le_sobolevConst_mul_gradientCoordL2NormSum_of_isOpenBoundedConvexDomain + hU hd u + +end H10Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Dilation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Dilation.lean new file mode 100644 index 0000000000..52a2b33500 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Dilation.lean @@ -0,0 +1,941 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace + +/-! # Coercive H1Dilation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Pointwise + +noncomputable section + +/-- Scaling by a positive scalar maps restricted Lebesgue measure on `U` to the +corresponding scalar multiple of restricted Lebesgue measure on `a • U`. -/ +theorem map_smul_volume_restrict {d : ℕ} {a : ℝ} (ha : 0 < a) + (U : Set (Vec d)) : + MeasureTheory.Measure.map (fun x : Vec d => a • x) + (MeasureTheory.volume.restrict U) = + ENNReal.ofReal ((a ^ d)⁻¹) • MeasureTheory.volume.restrict (a • U) := by + have ha_ne : a ≠ 0 := ha.ne' + let e : Homeomorph (Vec d) (Vec d) := Homeomorph.smulOfNeZero a ha_ne + have heq : (fun x : Vec d => e x) = fun x : Vec d => a • x := rfl + have hrestrict : + MeasureTheory.Measure.map (fun x : Vec d => a • x) + (MeasureTheory.volume.restrict U) = + (MeasureTheory.Measure.map (fun x : Vec d => a • x) MeasureTheory.volume).restrict + (a • U) := by + have htmp : + (MeasureTheory.volume.restrict U).map e = + (MeasureTheory.volume.map e).restrict (e '' U) := by + have h := + ((e.toMeasurableEquiv.restrict_map + (μ := MeasureTheory.volume) (s := e '' U)).symm) + simpa [Set.preimage_image_eq _ e.injective] using h + simpa [heq] using htmp + have hmap : + MeasureTheory.Measure.map (fun x : Vec d => a • x) MeasureTheory.volume = + ENNReal.ofReal ((a ^ d)⁻¹) • MeasureTheory.volume := by + let f : Vec d →ₗ[ℝ] Vec d := a • (1 : Vec d →ₗ[ℝ] Vec d) + have hf : LinearMap.det f ≠ 0 := by + simp [f, ha_ne] + have hdet : LinearMap.det f = a ^ d := by + simp [f] + have hmapf := + Real.map_linearMap_volume_pi_eq_smul_volume_pi + (ι := Fin d) (f := f) hf + have hpow_inv_nonneg : 0 ≤ (a ^ d)⁻¹ := by + positivity + rw [hdet] at hmapf + simpa [f, abs_of_nonneg hpow_inv_nonneg] using! hmapf + rw [hrestrict, hmap, MeasureTheory.Measure.restrict_smul] + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Push an `H¹(U)` witness forward to `H¹(a • U)` by the dilation +`x ↦ a⁻¹ x`, with the value normalized by the factor `a`. With this +normalization the gradient is the plain pullback of the original gradient. -/ +noncomputable def dilate {a : ℝ} (ha : 0 < a) + (u : H1Function U) : H1Function (a • U) := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a⁻¹ • x + have ha_ne : a ≠ 0 := ha.ne' + have hmap := map_smul_volume_restrict (d := d) (a := a⁻¹) (inv_pos.mpr ha) V + have hpre : a⁻¹ • V = U := by + ext x + simp [V, ha_ne] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict V) := + (measurable_const_smul a⁻¹).aemeasurable + refine + { toFun := fun x => a * u.toFun (T x) + grad := fun x => u.grad (T x) + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · have hu_map : MeasureTheory.MemLp u.toFun 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact u.memL2.smul_measure ENNReal.ofReal_ne_top + exact (MeasureTheory.MemLp.comp_of_map hu_map hT_meas).const_mul a + · intro i + have hgrad_map : MeasureTheory.MemLp (fun x => u.grad x i) 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact (u.gradMemL2 i).smul_measure ENNReal.ofReal_ne_top + exact MeasureTheory.MemLp.comp_of_map hgrad_map hT_meas + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a • y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a ha_ne) + simpa [ψ, Function.comp] using + hφ_supp.comp_homeomorph (Homeomorph.smulOfNeZero a ha_ne) + have hψ_sub : tsupport ψ ⊆ U := by + intro y hy + have hy' : a • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a ha_ne by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a ha_ne)] at hy + exact hy + have hyV : a • y ∈ V := hφ_sub hy' + simpa [V, Set.mem_smul_set_iff_inv_smul_mem, ha_ne] using hyV + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hderivψ : ∀ y : Vec d, + (fderiv ℝ ψ y) (basisVec i) = + a * (fderiv ℝ φ (a • y)) (basisVec i) := by + intro y + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a • z)) y = + a • fderiv ℝ φ (a • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a) + simpa [smul_eq_mul] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hderiv + have hweak_scaled : + a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume = + -∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume := by + have hfun : + (fun y => u.toFun y * (fderiv ℝ ψ y) (basisVec i)) = + fun y => a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) := by + funext y + rw [hderivψ y] + ring + rw [hfun, MeasureTheory.integral_const_mul] at hweak + simpa [ψ] using hweak + have hchange_left : + ∫ y in U, a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, + a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun, mul_assoc] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => + a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i)) + (s := U) ha) + have hchange_right : + ∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => u.grad (T x) i * φ x) + (s := U) ha) + have hscale_left : + ∫ y in U, a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume = + a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + calc + ∫ x in V, a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume + = (a ^ d) * ∫ y in U, + a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume := by + have hpos : (a ^ d) ≠ 0 := (pow_pos ha d).ne' + rw [hchange_left] + field_simp [hpos] + _ = (a ^ d) * + (a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume) := by + rw [hscale_left] + _ = (a ^ d) * (-∫ y in U, u.grad y i * φ (a • y) + ∂MeasureTheory.volume) := by + rw [hweak_scaled] + _ = -((a ^ d) * ∫ y in U, u.grad y i * φ (a • y) + ∂MeasureTheory.volume) := by + ring + _ = -∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume := by + have hpos : (a ^ d) ≠ 0 := (pow_pos ha d).ne' + rw [hchange_right] + field_simp [hpos] + +@[simp] theorem dilate_toFun {a : ℝ} (ha : 0 < a) + (u : H1Function U) (x : Vec d) : + (u.dilate ha).toFun x = a * u.toFun (a⁻¹ • x) := + rfl + +@[simp] theorem dilate_grad {a : ℝ} (ha : 0 < a) + (u : H1Function U) (x : Vec d) : + (u.dilate ha).grad x = u.grad (a⁻¹ • x) := + rfl + +/-- Push an `H¹(U)` witness forward to any domain `V` that is propositionally +equal to `a • U`. This avoids casts when geometric APIs identify the dilated +set by an extensional equality. -/ +noncomputable def dilateSet {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function U) : H1Function V := by + let T : Vec d → Vec d := fun x => a⁻¹ • x + have ha_ne : a ≠ 0 := ha.ne' + have hmap := map_smul_volume_restrict (d := d) (a := a⁻¹) (inv_pos.mpr ha) V + have hpre : a⁻¹ • V = U := by + rw [hV] + ext x + simp [ha_ne] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict V) := + (measurable_const_smul a⁻¹).aemeasurable + refine + { toFun := fun x => a * u.toFun (T x) + grad := fun x => u.grad (T x) + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · have hu_map : MeasureTheory.MemLp u.toFun 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact u.memL2.smul_measure ENNReal.ofReal_ne_top + exact (MeasureTheory.MemLp.comp_of_map hu_map hT_meas).const_mul a + · intro i + have hgrad_map : MeasureTheory.MemLp (fun x => u.grad x i) 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact (u.gradMemL2 i).smul_measure ENNReal.ofReal_ne_top + exact MeasureTheory.MemLp.comp_of_map hgrad_map hT_meas + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a • y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a ha_ne) + simpa [ψ, Function.comp] using + hφ_supp.comp_homeomorph (Homeomorph.smulOfNeZero a ha_ne) + have hψ_sub : tsupport ψ ⊆ U := by + intro y hy + have hy' : a • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a ha_ne by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a ha_ne)] at hy + exact hy + have hyV : a • y ∈ V := hφ_sub hy' + rw [hV] at hyV + simpa [Set.mem_smul_set_iff_inv_smul_mem, ha_ne] using hyV + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hderivψ : ∀ y : Vec d, + (fderiv ℝ ψ y) (basisVec i) = + a * (fderiv ℝ φ (a • y)) (basisVec i) := by + intro y + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a • z)) y = + a • fderiv ℝ φ (a • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a) + simpa [smul_eq_mul] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hderiv + have hweak_scaled : + a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume = + -∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume := by + have hfun : + (fun y => u.toFun y * (fderiv ℝ ψ y) (basisVec i)) = + fun y => a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) := by + funext y + rw [hderivψ y] + ring + rw [hfun, MeasureTheory.integral_const_mul] at hweak + simpa [ψ] using hweak + have hchange_left : + ∫ y in U, a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, + a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume := by + rw [hV] + simpa only [T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun, mul_assoc] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => + a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i)) + (s := U) ha) + have hchange_right : + ∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume := by + rw [hV] + simpa only [T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => u.grad (T x) i * φ x) + (s := U) ha) + have hscale_left : + ∫ y in U, a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume = + a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + calc + ∫ x in V, a * u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume + = (a ^ d) * ∫ y in U, + a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) + ∂MeasureTheory.volume := by + have hpos : (a ^ d) ≠ 0 := (pow_pos ha d).ne' + rw [hchange_left] + field_simp [hpos] + _ = (a ^ d) * + (a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume) := by + rw [hscale_left] + _ = (a ^ d) * (-∫ y in U, u.grad y i * φ (a • y) + ∂MeasureTheory.volume) := by + rw [hweak_scaled] + _ = -((a ^ d) * ∫ y in U, u.grad y i * φ (a • y) + ∂MeasureTheory.volume) := by + ring + _ = -∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume := by + have hpos : (a ^ d) ≠ 0 := (pow_pos ha d).ne' + rw [hchange_right] + field_simp [hpos] + +@[simp] theorem dilateSet_toFun {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function U) (x : Vec d) : + (u.dilateSet ha hV).toFun x = a * u.toFun (a⁻¹ • x) := + rfl + +@[simp] theorem dilateSet_grad {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function U) (x : Vec d) : + (u.dilateSet ha hV).grad x = u.grad (a⁻¹ • x) := + rfl + +/-- Pull an `H¹(a • U)` witness back to `H¹(U)` by precomposition with +`x ↦ a • x`. The weak gradient is `a • ∇u(a x)`. -/ +noncomputable def unscale {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) : H1Function U := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have ha_ne : a ≠ 0 := ha.ne' + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + refine + { toFun := fun x => u (T x) + grad := fun x => a • u.grad (T x) + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · have hu_map : MemL2On V u.toFun := u.memL2 + have hu_smul : + MeasureTheory.MemLp u.toFun 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact hu_map.smul_measure ENNReal.ofReal_ne_top + exact MeasureTheory.MemLp.comp_of_map hu_smul hT_meas + · intro i + have hgrad_map : MemL2On V (fun x => u.grad x i) := u.gradMemL2 i + have hgrad_smul_measure : + MeasureTheory.MemLp (fun x => u.grad x i) 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact hgrad_map.smul_measure ENNReal.ofReal_ne_top + have hcomp : + MeasureTheory.MemLp (fun x => u.grad (T x) i) 2 + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.comp_of_map hgrad_smul_measure hT_meas + have hmul : MeasureTheory.MemLp (fun x => a * u.grad (T x) i) 2 + (MeasureTheory.volume.restrict U) := + hcomp.const_mul a + simpa [Pi.smul_apply, T, smul_eq_mul] using hmul + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a⁻¹ • y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a⁻¹) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne)) + simpa [ψ, Function.comp] using + hφ_supp.comp_homeomorph (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne)) + have hψ_sub : tsupport ψ ⊆ V := by + intro y hy + have hy' : a⁻¹ • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne) by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne))] at hy + exact hy + exact ⟨a⁻¹ • y, hφ_sub hy', by simp [ha_ne, smul_smul]⟩ + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hderivψ : + ∀ y : Vec d, + (fderiv ℝ ψ y) (basisVec i) = + a⁻¹ * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) := by + intro y + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a⁻¹ • z)) y = + a⁻¹ • fderiv ℝ φ (a⁻¹ • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a⁻¹) + simpa [smul_eq_mul] using congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hderiv + have hweak_scaled : + ∫ y in V, + u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume = + -a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + have hfun : + (fun y => u y * (fderiv ℝ ψ y) (basisVec i)) = + fun y => a⁻¹ * (u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i)) := by + funext y + rw [hderivψ y] + ring + have hleft : + ∫ y in V, u y * (fderiv ℝ ψ y) (basisVec i) ∂MeasureTheory.volume = + a⁻¹ * ∫ y in V, + u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume := by + rw [hfun, MeasureTheory.integral_const_mul] + rw [hleft] at hweak + have hmul := congrArg (fun t : ℝ => a * t) hweak + have hcancel : a * (a⁻¹ * + ∫ y in V, u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume) = + ∫ y in V, u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume := by + field_simp [ha_ne] + simpa [hcancel, mul_neg, mul_assoc, mul_comm, mul_left_comm] using hmul + have hchange_left : + ∫ x in U, u (T x) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in V, + u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i)) + (s := U) ha) + have hchange_right : + ∫ x in U, (a • u.grad (T x)) i * φ x ∂MeasureTheory.volume = + (a ^ d)⁻¹ * + ∫ y in V, (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => (a • u.grad y) i * φ (a⁻¹ • y)) + (s := U) ha) + have hgrad_scaled_integral : + ∫ y in V, (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume = + a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + have hfun : + (fun y : Vec d => (a • u.grad y) i * φ (a⁻¹ • y)) = + fun y : Vec d => a * (u.grad y i * φ (a⁻¹ • y)) := by + funext y + simp [Pi.smul_apply, smul_eq_mul] + ring + rw [hfun, MeasureTheory.integral_const_mul] + calc + ∫ x in U, u (T x) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = (a ^ d)⁻¹ * ∫ y in V, + u y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume := + hchange_left + _ = (a ^ d)⁻¹ * + (-a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume) := by + rw [hweak_scaled] + _ = -((a ^ d)⁻¹ * + ∫ y in V, (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume) := by + rw [hgrad_scaled_integral] + ring + _ = -∫ x in U, (a • u.grad (T x)) i * φ x ∂MeasureTheory.volume := by + rw [hchange_right] + +@[simp] theorem unscale_toFun {d : ℕ} {U : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) (x : Vec d) : + (u.unscale ha).toFun x = u.toFun (a • x) := rfl + +@[simp] theorem unscale_grad {d : ℕ} {U : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) (x : Vec d) : + (u.unscale ha).grad x = a • u.grad (a • x) := rfl + +/-- Pull an `H¹(V)` witness back to `H¹(U)` when `V = a • U`, with the +normalization inverse to `H1Function.dilateSet`: `u(a x) / a`. -/ +noncomputable def undilateSet {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function V) : H1Function U := by + subst V + exact a⁻¹ • u.unscale ha + +@[simp] theorem undilateSet_toFun {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function V) (x : Vec d) : + (u.undilateSet ha hV).toFun x = a⁻¹ * u.toFun (a • x) := by + subst V + simp [undilateSet] + +@[simp] theorem undilateSet_grad {V : Set (Vec d)} {a : ℝ} (ha : 0 < a) + (hV : V = a • U) (u : H1Function V) (x : Vec d) : + (u.undilateSet ha hV).grad x = u.grad (a • x) := by + subst V + ext i + simp [undilateSet, Pi.smul_apply, smul_eq_mul, ha.ne'] + +end H1Function + +namespace H10Function + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Pull an `H¹₀(a • U)` witness back to `H¹₀(U)` by precomposition with +`x ↦ a x`. -/ +noncomputable def unscale {a : ℝ} (ha : 0 < a) + (u : H10Function (a • U)) : H10Function U := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have ha_ne : a ≠ 0 := ha.ne' + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + let C : ℝ≥0∞ := ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal) + have hC_ne_top : C ≠ ⊤ := by + simp [C] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + refine + { toH1Function := u.toH1Function.unscale ha + approx := fun m x => u.approx m (T x) + approx_smooth := ?_ + approx_hasCompactSupport := ?_ + approx_support_subset := ?_ + tendsto_approx := ?_ + tendsto_approx_grad := ?_ } + · intro m + simpa [T] using! (u.approx_smooth m).comp (contDiff_const_smul a) + · intro m + show HasCompactSupport (u.approx m ∘ Homeomorph.smulOfNeZero a ha_ne) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph (Homeomorph.smulOfNeZero a ha_ne) + · intro m x hx + have hx' : a • x ∈ tsupport (u.approx m) := by + rw [show (fun y => u.approx m (T y)) = + u.approx m ∘ Homeomorph.smulOfNeZero a ha_ne by rfl, + tsupport_comp_eq_preimage (u.approx m) (Homeomorph.smulOfNeZero a ha_ne)] at hx + exact hx + have hV : a • x ∈ V := u.approx_support_subset m hx' + simpa [V, Set.mem_smul_set_iff_inv_smul_mem, ha_ne] using hV + · have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m (T x) - (u.toH1Function.unscale ha).toFun x) + 2 (MeasureTheory.volume.restrict U)) = + fun m => C * MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict V) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toH1Function.toFun x + have hg_map : MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact ((u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toH1Function.memL2.aestronglyMeasurable).mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm g 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => g (T x)) 2 + (MeasureTheory.volume.restrict U) := by + exact (MeasureTheory.eLpNorm_map_measure + (g := g) (f := T) hg_map hT_meas) + have hfun : + (fun x => u.approx m (T x) - (u.toH1Function.unscale ha).toFun x) = + fun x => g (T x) := by + funext x + simp [g, T] + rw [hfun, ← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · rfl + · simp [pow_pos ha d] + rw [hEq] + simpa [V] using ENNReal.Tendsto.const_mul u.tendsto_approx (Or.inr hC_ne_top) + · intro k + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.unscale ha).grad x k) + 2 (MeasureTheory.volume.restrict U)) = + fun m => (ENNReal.ofReal a * C) * MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - + u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict V) := by + funext m + let g : Vec d → ℝ := + fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k + have hg_map : MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact (((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable).mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm g 2 + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => g (T x)) 2 + (MeasureTheory.volume.restrict U) := by + exact (MeasureTheory.eLpNorm_map_measure + (g := g) (f := T) hg_map hT_meas) + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.unscale ha).grad x k) = + fun x => a * g (T x) := by + funext x + have hderiv : + fderiv ℝ (fun y : Vec d => u.approx m (a • y)) x = + a • fderiv ℝ (u.approx m) (a • x) := by + simpa [T] using (fderiv_comp_smul (𝕜 := ℝ) (f := u.approx m) (x := x) a) + simp [g, T, hderiv, Pi.smul_apply, smul_eq_mul] + ring + rw [hfun] + change MeasureTheory.eLpNorm (a • fun x => g (T x)) 2 + (MeasureTheory.volume.restrict U) = + ENNReal.ofReal a * C * MeasureTheory.eLpNorm g 2 + (MeasureTheory.volume.restrict V) + rw [MeasureTheory.eLpNorm_const_smul] + rw [Real.enorm_eq_ofReal ha.le] + rw [← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · simp [C, V, smul_eq_mul, mul_assoc] + · simp [pow_pos ha d] + rw [hEq] + have hconst_ne_top : ENNReal.ofReal a * C ≠ ⊤ := by + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top hC_ne_top + simpa [V] using + ENNReal.Tendsto.const_mul (u.tendsto_approx_grad k) (Or.inr hconst_ne_top) + +@[simp] theorem unscale_toH1Function {a : ℝ} (ha : 0 < a) + (u : H10Function (a • U)) : + (u.unscale ha).toH1Function = u.toH1Function.unscale ha := + rfl + +end H10Function + +/-- The common `L²` measure factor produced by pulling back along +`x ↦ a • x`. -/ +noncomputable def dilationL2Factor (d : ℕ) (a : ℝ) : ℝ := + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal + +theorem dilationL2Factor_eq {d : ℕ} {a : ℝ} (ha : 0 < a) : + dilationL2Factor d a = ((a ^ d)⁻¹) ^ (1 / 2 : ℝ) := by + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hbase_nonneg : 0 ≤ (a ^ d)⁻¹ := by + positivity + unfold dilationL2Factor + rw [hhalf] + rw [ENNReal.ofReal_rpow_of_nonneg hbase_nonneg (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal (Real.rpow_nonneg hbase_nonneg _)] + +theorem dilationL2Factor_pos {d : ℕ} {a : ℝ} (ha : 0 < a) : + 0 < dilationL2Factor d a := by + rw [dilationL2Factor_eq (d := d) ha] + exact Real.rpow_pos_of_pos (inv_pos.mpr (pow_pos ha d)) _ + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The scalar `L²` norm of an `H¹` function after dilation pullback. -/ +theorem norm_toScalarL2_unscale_eq {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) : + ‖(u.unscale ha).toScalarL2‖ = + dilationL2Factor d a * ‖u.toScalarL2‖ := by + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + have hu_aesm_map : + MeasureTheory.AEStronglyMeasurable u.toFun + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact u.memL2.aestronglyMeasurable.mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm u.toFun (2 : ℝ≥0∞) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => u.toFun (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := by + exact + (MeasureTheory.eLpNorm_map_measure + (g := u.toFun) (f := T) hu_aesm_map hT_meas) + unfold H1Function.toScalarL2 Homogenization.toScalarL2 dilationL2Factor + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + change + (MeasureTheory.eLpNorm (fun x => u.toFun (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U)).toReal = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toFun (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · change + ((ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm u.toFun (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (a • U))).toReal) = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toFun (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [ENNReal.toReal_mul] + · simp [pow_pos ha d] + +/-- The coordinate-gradient `L²` norm of an `H¹` function after dilation +pullback. -/ +theorem norm_gradCoordToScalarL2_unscale_eq {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) (i : Fin d) : + ‖(u.unscale ha).gradCoordToScalarL2 i‖ = + a * dilationL2Factor d a * ‖u.gradCoordToScalarL2 i‖ := by + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + have hgrad_aesm_map : + MeasureTheory.AEStronglyMeasurable (fun x => u.grad x i) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact (u.grad_memL2 i).aestronglyMeasurable.mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm (fun x => u.grad x i) (2 : ℝ≥0∞) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => u.grad (T x) i) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := by + exact + (MeasureTheory.eLpNorm_map_measure + (g := fun x => u.grad x i) (f := T) hgrad_aesm_map hT_meas) + unfold H1Function.gradCoordToScalarL2 Homogenization.toScalarL2 dilationL2Factor + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + change + (MeasureTheory.eLpNorm (fun x => (a • u.grad (T x)) i) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U)).toReal = + a * (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm (fun x => u.grad x i) (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + have hfun : + (fun x : Vec d => (a • u.grad (T x)) i) = + a • fun x : Vec d => u.grad (T x) i := rfl + rw [hfun] + rw [MeasureTheory.eLpNorm_const_smul] + rw [Real.enorm_eq_ofReal (le_of_lt ha)] + rw [← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · change + ((ENNReal.ofReal a * + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm (fun x => u.grad x i) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (a • U)))).toReal) = + a * (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm (fun x => u.grad x i) (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [ENNReal.toReal_mul, ENNReal.toReal_mul, ENNReal.toReal_ofReal ha.le] + ring + · simp [pow_pos ha d] + +/-- The coordinate-gradient norm sum after dilation pullback. -/ +theorem gradientCoordL2NormSum_unscale_eq {a : ℝ} (ha : 0 < a) + (u : H1Function (a • U)) : + (u.unscale ha).gradientCoordL2NormSum = + a * dilationL2Factor d a * u.gradientCoordL2NormSum := by + unfold H1Function.gradientCoordL2NormSum + calc + ∑ i, ‖(u.unscale ha).gradCoordToScalarL2 i‖ = + ∑ i, a * dilationL2Factor d a * ‖u.gradCoordToScalarL2 i‖ := by + apply Finset.sum_congr rfl + intro i _ + exact H1Function.norm_gradCoordToScalarL2_unscale_eq ha u i + _ = a * dilationL2Factor d a * ∑ i, ‖u.gradCoordToScalarL2 i‖ := by + rw [← Finset.mul_sum] + +end H1Function + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Pull a mean-zero `H¹(a • U)` witness back to `H¹(U)`. -/ +noncomputable def unscale {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) : H1MeanZeroFunction U where + toH1Function := u.toH1Function.unscale ha + meanZero := by + change ∫ x in U, u.toH1Function.toFun (a • x) ∂MeasureTheory.volume = 0 + rw [MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := u.toH1Function.toFun) (s := U) ha] + rw [u.meanZero] + simp + +@[simp] theorem unscale_toH1Function {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) : + (u.unscale ha).toH1Function = u.toH1Function.unscale ha := + rfl + +@[simp] theorem unscale_apply {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) (x : Vec d) : + u.unscale ha x = u (a • x) := + rfl + +@[simp] theorem unscale_grad {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) (x : Vec d) : + (u.unscale ha).toH1Function.grad x = a • u.toH1Function.grad (a • x) := + rfl + +/-- The scalar `L²` norm after dilation pullback. -/ +theorem valueL2Norm_unscale_eq {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) : + (u.unscale ha).valueL2Norm = + dilationL2Factor d a * u.valueL2Norm := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + have hu_aesm_map : + MeasureTheory.AEStronglyMeasurable u.toH1Function.toFun + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact u.toH1Function.memL2.aestronglyMeasurable.mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm u.toH1Function.toFun (2 : ℝ≥0∞) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => u.toH1Function.toFun (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := by + exact + (MeasureTheory.eLpNorm_map_measure + (g := u.toH1Function.toFun) (f := T) + hu_aesm_map hT_meas) + unfold H1MeanZeroFunction.valueL2Norm H1MeanZeroFunction.toScalarL2 + H1Function.toScalarL2 Homogenization.toScalarL2 dilationL2Factor + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + change + (MeasureTheory.eLpNorm (fun x => u.toH1Function.toFun (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U)).toReal = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toH1Function.toFun (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · change + ((ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm u.toH1Function.toFun (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (a • U))).toReal) = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toH1Function.toFun (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [ENNReal.toReal_mul] + · simp [pow_pos ha d] + +/-- The gradient `L²` norm after dilation pullback. -/ +theorem gradientL2Norm_unscale_eq {a : ℝ} (ha : 0 < a) + (u : H1MeanZeroFunction (a • U)) : + (u.unscale ha).gradientL2Norm = + a * dilationL2Factor d a * u.gradientL2Norm := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + have hgrad_aesm_map : + MeasureTheory.AEStronglyMeasurable u.toH1Function.grad + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact u.toH1Function.grad_memVectorL2.aestronglyMeasurable.mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm u.toH1Function.grad (2 : ℝ≥0∞) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => u.toH1Function.grad (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := by + exact + (MeasureTheory.eLpNorm_map_measure + (g := u.toH1Function.grad) (f := T) + hgrad_aesm_map hT_meas) + unfold H1MeanZeroFunction.gradientL2Norm H1MeanZeroFunction.gradToVectorL2 + H1Function.gradToVectorL2 Homogenization.toVectorL2 dilationL2Factor + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + change + (MeasureTheory.eLpNorm (fun x => a • u.toH1Function.grad (T x)) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U)).toReal = + a * (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toH1Function.grad (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + have hfun : + (fun x : Vec d => a • u.toH1Function.grad (T x)) = + a • fun x : Vec d => u.toH1Function.grad (T x) := rfl + rw [hfun] + rw [MeasureTheory.eLpNorm_const_smul] + rw [Real.enorm_eq_ofReal (le_of_lt ha)] + rw [← hmap_eLp, hmap] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero] + · change + ((ENNReal.ofReal a * + (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm u.toH1Function.grad (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (a • U)))).toReal) = + a * (ENNReal.ofReal ((a ^ d)⁻¹) ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + (MeasureTheory.eLpNorm u.toH1Function.grad (2 : ℝ≥0∞) + (volumeMeasureOn (a • U))).toReal + rw [ENNReal.toReal_mul, ENNReal.toReal_mul, ENNReal.toReal_ofReal ha.le] + ring + · simp [pow_pos ha d] + +end H1MeanZeroFunction + +namespace H1CoerciveEstimate + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Dilation transports a mean-zero coercive `H¹` estimate from `U` to +`a • U`, multiplying the constant by the dilation factor `a`. -/ +noncomputable def dilate {a : ℝ} (ha : 0 < a) + (hC : H1CoerciveEstimate U) : H1CoerciveEstimate (a • U) where + fixedValue := a * hC.fixedValue + constant_nonneg := mul_nonneg ha.le hC.constant_nonneg + bound := by + intro u + let v : H1MeanZeroFunction U := u.unscale ha + have hv := hC.bound v + have hvalue := H1MeanZeroFunction.valueL2Norm_unscale_eq (U := U) ha u + have hgrad := H1MeanZeroFunction.gradientL2Norm_unscale_eq (U := U) ha u + have hFpos : 0 < dilationL2Factor d a := dilationL2Factor_pos (d := d) ha + have hscaled : + dilationL2Factor d a * u.valueL2Norm ≤ + hC.fixedValue * (a * dilationL2Factor d a * u.gradientL2Norm) := by + simpa [v, hvalue, hgrad] using hv + have hscaled' : + dilationL2Factor d a * u.valueL2Norm ≤ + dilationL2Factor d a * ((a * hC.fixedValue) * u.gradientL2Norm) := by + calc + dilationL2Factor d a * u.valueL2Norm + ≤ hC.fixedValue * (a * dilationL2Factor d a * u.gradientL2Norm) := hscaled + _ = dilationL2Factor d a * ((a * hC.fixedValue) * u.gradientL2Norm) := by + ring + exact (mul_le_mul_iff_right₀ hFpos).1 hscaled' + +@[simp] theorem dilate_constant {d : ℕ} {U : Set (Vec d)} {a : ℝ} + (ha : 0 < a) (hC : H1CoerciveEstimate U) : + (hC.dilate ha).fixedValue = a * hC.fixedValue := + rfl + +end H1CoerciveEstimate + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Translation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Translation.lean new file mode 100644 index 0000000000..a1de05ebb8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveH1Translation.lean @@ -0,0 +1,137 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation + +/-! # Coercive H1Translation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace H1MeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Translate a mean-zero `H¹(U)` witness to `H¹(U + z)`. -/ +noncomputable def translate (u : H1MeanZeroFunction U) (z : Vec d) : + H1MeanZeroFunction (translateSet z U) where + toH1Function := u.toH1Function.translate z + meanZero := by + change ∫ x in translateSet z U, u.toH1Function.toFun (x - z) ∂MeasureTheory.volume = 0 + rw [setIntegral_comp_subRight_translateSet] + exact u.meanZero + +@[simp] theorem translate_toH1Function (u : H1MeanZeroFunction U) (z : Vec d) : + (u.translate z).toH1Function = u.toH1Function.translate z := + rfl + +@[simp] theorem translate_apply (u : H1MeanZeroFunction U) (z : Vec d) (x : Vec d) : + u.translate z x = u (x - z) := + rfl + +@[simp] theorem translate_grad (u : H1MeanZeroFunction U) (z : Vec d) (x : Vec d) : + (u.translate z).toH1Function.grad x = u.toH1Function.grad (x - z) := + rfl + +/-- Pull a mean-zero `H¹(U + z)` witness back to `H¹(U)`. -/ +noncomputable def untranslate (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) : H1MeanZeroFunction U where + toH1Function := H1Function.untranslate z u.toH1Function + meanZero := by + change ∫ x in U, u.toH1Function.toFun (x + z) ∂MeasureTheory.volume = 0 + rw [setIntegral_comp_addRight_translateSet] + exact u.meanZero + +@[simp] theorem untranslate_toH1Function (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) : + (u.untranslate z).toH1Function = H1Function.untranslate z u.toH1Function := + rfl + +@[simp] theorem untranslate_apply (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) (x : Vec d) : + u.untranslate z x = u (x + z) := + rfl + +@[simp] theorem untranslate_grad (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) (x : Vec d) : + (u.untranslate z).toH1Function.grad x = u.toH1Function.grad (x + z) := + rfl + +/-- Translation preserves the scalar `L²` norm of a mean-zero `H¹` witness. -/ +theorem valueL2Norm_untranslate_eq (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) : + (u.untranslate z).valueL2Norm = u.valueL2Norm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + unfold H1MeanZeroFunction.valueL2Norm H1MeanZeroFunction.toScalarL2 + H1Function.toScalarL2 Homogenization.toScalarL2 + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + exact congrArg ENNReal.toReal (by + simpa [H1MeanZeroFunction.untranslate, H1Function.untranslate, V, T, Function.comp, + volumeMeasureOn] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := u.toH1Function.toFun) (p := (2 : ℝ≥0∞)) + u.toH1Function.memL2.aestronglyMeasurable hμ)) + +/-- Translation preserves the gradient `L²` norm of a mean-zero `H¹` witness. -/ +theorem gradientL2Norm_untranslate_eq (z : Vec d) + (u : H1MeanZeroFunction (translateSet z U)) : + (u.untranslate z).gradientL2Norm = u.gradientL2Norm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + unfold H1MeanZeroFunction.gradientL2Norm H1MeanZeroFunction.gradToVectorL2 + H1Function.gradToVectorL2 Homogenization.toVectorL2 + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + exact congrArg ENNReal.toReal (by + simpa [H1MeanZeroFunction.untranslate, H1Function.untranslate, V, T, Function.comp, + volumeMeasureOn] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := u.toH1Function.grad) (p := (2 : ℝ≥0∞)) + u.toH1Function.grad_memVectorL2.aestronglyMeasurable hμ)) + +end H1MeanZeroFunction + +namespace H1CoerciveEstimate + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Translate a coercive `H¹` estimate from `U` to `U + z` without changing its +constant. -/ +noncomputable def translate [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hC : H1CoerciveEstimate U) (z : Vec d) : + H1CoerciveEstimate (translateSet z U) where + fixedValue := hC.fixedValue + constant_nonneg := hC.constant_nonneg + bound := by + intro u + let v : H1MeanZeroFunction U := u.untranslate z + calc + u.valueL2Norm = v.valueL2Norm := by + simpa [v] using (H1MeanZeroFunction.valueL2Norm_untranslate_eq (U := U) z u).symm + _ ≤ hC.fixedValue * v.gradientL2Norm := hC.bound v + _ = hC.fixedValue * u.gradientL2Norm := by + rw [H1MeanZeroFunction.gradientL2Norm_untranslate_eq (U := U) z u] + +@[simp] theorem translate_constant [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hC : H1CoerciveEstimate U) (z : Vec d) : + (hC.translate z).fixedValue = hC.fixedValue := + rfl + +end H1CoerciveEstimate + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveMeanZero.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveMeanZero.lean new file mode 100644 index 0000000000..3e2f70f59b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveMeanZero.lean @@ -0,0 +1,405 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 + +/-! # Coercive Mean Zero -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Mean-zero coercive helpers + +This file starts the quantitative helper layer for the future mean-zero `H¹` +coercive estimate on bounded open convex domains. + +The current pass records the first bound we will need later: an `L²` control of +the affine correction coming from `averageGradient`. +-/ + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- Finite-measure `L²` control constant for the componentwise average +gradient. -/ +noncomputable def averageGradientL2ControlConst : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * + ((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +/-- Nonnegativity of `averageGradientL2ControlConst`. -/ +theorem averageGradientL2ControlConst_nonneg : + 0 ≤ H1Function.averageGradientL2ControlConst (U := U) := by + unfold H1Function.averageGradientL2ControlConst + positivity + +/-- Domain-side `L²` control constant for affine functions on a Sobolev-regular +domain. -/ +noncomputable def affineValueL2ControlConst (hU : IsSobolevRegularDomain U) : ℝ := by + classical + let R : ℝ := Classical.choose hU.isBoundedDomain + exact ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * (d : ℝ) * R + +omit [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] in +theorem affineValueL2ControlConst_nonneg (hU : IsSobolevRegularDomain U) : + 0 ≤ H1Function.affineValueL2ControlConst hU := by + unfold H1Function.affineValueL2ControlConst + have hR_nonneg : 0 ≤ Classical.choose hU.isBoundedDomain := + le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + have hleft : 0 ≤ ((MeasureTheory.volume U ^ ((1 : ℝ) / 2)).toReal * (d : ℝ)) := by + positivity + exact mul_nonneg hleft hR_nonneg + +/-- The affine function with gradient `p` has `L²` norm controlled by a +domain-dependent constant times `‖p‖`. -/ +theorem norm_toScalarL2_affineOnIsSobolevRegularDomain_le + (hU : IsSobolevRegularDomain U) (p : Vec d) : + ‖(H1Function.affineOnIsSobolevRegularDomain hU p).toScalarL2‖ ≤ + H1Function.affineValueL2ControlConst hU * ‖p‖ := by + classical + let R : ℝ := Classical.choose hU.isBoundedDomain + have hR : ∀ x ∈ U, ∀ i, |x i| ≤ R := (Classical.choose_spec hU.isBoundedDomain).2 + have hR_nonneg : 0 ≤ R := le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + let C : ℝ := (d : ℝ) * R * ‖p‖ + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hbound : + ∀ᵐ x ∂volumeMeasureOn U, + ‖(H1Function.affineOnIsSobolevRegularDomain hU p) x‖ ≤ C := by + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + refine Filter.Eventually.of_forall ?_ + intro x hx + calc + ‖(H1Function.affineOnIsSobolevRegularDomain hU p) x‖ + = ‖∑ i : Fin d, p i * x i‖ := by + simp [H1Function.affineOnIsSobolevRegularDomain_apply] + _ ≤ ∑ i : Fin d, ‖p i * x i‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖p i‖ * ‖x i‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖p‖ * R := by + refine Finset.sum_le_sum ?_ + intro i hi + have hxi : ‖x i‖ ≤ R := by + simpa [Real.norm_eq_abs] using hR x hx i + calc + ‖p i‖ * ‖x i‖ ≤ ‖p i‖ * R := by + exact mul_le_mul_of_nonneg_left hxi (norm_nonneg _) + _ ≤ ‖p‖ * R := by + exact mul_le_mul_of_nonneg_right (norm_le_pi_norm p i) hR_nonneg + _ = (d : ℝ) * R * ‖p‖ := by + simp [mul_left_comm, mul_comm] + have hnorm : + MeasureTheory.eLpNorm + (fun x => (H1Function.affineOnIsSobolevRegularDomain hU p) x) + (2 : ENNReal) (volumeMeasureOn U) ≤ + (volumeMeasureOn U) Set.univ ^ ((2 : ENNReal).toReal⁻¹) * ENNReal.ofReal C := + MeasureTheory.eLpNorm_le_of_ae_bound (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (H1Function.affineOnIsSobolevRegularDomain hU p).memL2.aestronglyMeasurable hbound + have hpow_ne_top : + (volumeMeasureOn U) Set.univ ^ ((2 : ENNReal).toReal⁻¹) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + simpa [volumeMeasureOn] using (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ).ne + have hmul_ne_top : + (volumeMeasureOn U) Set.univ ^ ((2 : ENNReal).toReal⁻¹) * ENNReal.ofReal C ≠ ⊤ := + ENNReal.mul_ne_top hpow_ne_top ENNReal.ofReal_ne_top + calc + ‖(H1Function.affineOnIsSobolevRegularDomain hU p).toScalarL2‖ + = ENNReal.toReal + (MeasureTheory.eLpNorm + (fun x => (H1Function.affineOnIsSobolevRegularDomain hU p) x) + (2 : ENNReal) (volumeMeasureOn U)) := by + rw [H1Function.toScalarL2, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + _ ≤ ENNReal.toReal + ((volumeMeasureOn U) Set.univ ^ ((2 : ENNReal).toReal⁻¹) * ENNReal.ofReal C) := by + exact ENNReal.toReal_mono hmul_ne_top hnorm + _ = ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * C := by + rw [ENNReal.toReal_mul, ENNReal.toReal_ofReal hC_nonneg] + simp [volumeMeasureOn] + _ = H1Function.affineValueL2ControlConst hU * ‖p‖ := by + unfold H1Function.affineValueL2ControlConst + simp [R, C, mul_assoc, mul_left_comm, mul_comm] + +/-- Specialization of the affine `L²` bound to the affine correction with +gradient `u.averageGradient`. -/ +theorem norm_toScalarL2_averageGradientAffineOnIsSobolevRegularDomain_le + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ ≤ + H1Function.affineValueL2ControlConst hU * ‖u.averageGradient‖ := by + simpa [H1Function.averageGradientAffineOnIsSobolevRegularDomain] using + H1Function.norm_toScalarL2_affineOnIsSobolevRegularDomain_le + (hU := hU) (p := u.averageGradient) + +/-- On a finite-measure domain, the componentwise average gradient is +controlled by the vector `L²` norm of the weak gradient. -/ +theorem norm_averageGradient_le_averageGradientL2ControlConst_mul + (u : H1Function U) : + ‖u.averageGradient‖ ≤ + H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖ := by + let μ := volumeMeasureOn U + have hnonneg : + 0 ≤ H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖ := by + exact mul_nonneg (H1Function.averageGradientL2ControlConst_nonneg (U := U)) (norm_nonneg _) + refine (pi_norm_le_iff_of_nonneg hnonneg).2 ?_ + intro i + have hgrad_int : MeasureTheory.Integrable (fun x => u.grad x i) μ := by + simpa [μ] using (u.grad_memL2 i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + have hgrad_norm : + ∫ x, |u.grad x i| ∂μ = + ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 1 μ) := by + calc + ∫ x, |u.grad x i| ∂μ = ∫ x, ‖u.grad x i‖ ∂μ := by + simp + _ = (∫⁻ x, ‖u.grad x i‖ₑ ∂μ).toReal := by + exact MeasureTheory.integral_norm_eq_lintegral_enorm hgrad_int.aestronglyMeasurable + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 1 μ) := by + rw [MeasureTheory.eLpNorm_one_eq_lintegral_enorm hgrad_int.aestronglyMeasurable] + have hL1_bound : + MeasureTheory.eLpNorm (fun x => u.grad x i) 1 μ ≤ + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2) := by + simpa using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ + (μ := μ) + (f := fun x => u.grad x i) + (p := (1 : ENNReal)) + (q := (2 : ENNReal)) + (by norm_num) + (u.grad_memL2 i).aestronglyMeasurable) + have hConst_ne_top : μ Set.univ ^ ((1 : ℝ) - 1 / 2) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by norm_num) ?_).ne + simpa [μ] using (MeasureTheory.measure_lt_top μ Set.univ).ne + have hMul_ne_top : + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 μ * μ Set.univ ^ ((1 : ℝ) - 1 / 2) ≠ ⊤ := + ENNReal.mul_ne_top (u.grad_memL2 i).eLpNorm_lt_top.ne hConst_ne_top + have hL1_toReal : + ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 1 μ) ≤ + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => u.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) := + ENNReal.toReal_mono hMul_ne_top hL1_bound + have hcoord_int_bound : + |∫ x in U, u.grad x i ∂MeasureTheory.volume| ≤ + ((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal * ‖u.gradToVectorL2‖ := by + have habs : + |∫ x, u.grad x i ∂μ| ≤ ∫ x, |u.grad x i| ∂μ := by + simpa using MeasureTheory.abs_integral_le_integral_abs (f := fun x => u.grad x i) (μ := μ) + calc + |∫ x in U, u.grad x i ∂MeasureTheory.volume| + = |∫ x, u.grad x i ∂μ| := by + simp [μ] + _ ≤ ∫ x, |u.grad x i| ∂μ := habs + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 1 μ) := hgrad_norm + _ ≤ ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => u.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) := hL1_toReal + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 2 μ) * + (μ Set.univ ^ ((1 : ℝ) - 1 / 2)).toReal := by + rw [ENNReal.toReal_mul] + _ = ‖u.gradCoordToScalarL2 i‖ * ((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal := by + rw [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp] + simp [μ] + _ = ((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal * ‖u.gradCoordToScalarL2 i‖ := by + ring + _ ≤ ((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal * ‖u.gradToVectorL2‖ := by + refine mul_le_mul_of_nonneg_left (u.norm_gradCoordToScalarL2_le i) ?_ + positivity + have hvolinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have hcoord : + |u.averageGradient i| ≤ + H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖ := by + calc + |u.averageGradient i| + = |(MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, u.grad x i ∂MeasureTheory.volume| := by + unfold H1Function.averageGradient integralAverage + rfl + _ = (MeasureTheory.volume U).toReal⁻¹ * + |∫ x in U, u.grad x i ∂MeasureTheory.volume| := by + rw [abs_mul, abs_of_nonneg hvolinv_nonneg] + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + (((MeasureTheory.volume U) ^ ((1 : ℝ) - 1 / 2)).toReal * ‖u.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hcoord_int_bound hvolinv_nonneg + _ = H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖ := by + unfold H1Function.averageGradientL2ControlConst + ring + simpa [Real.norm_eq_abs] using hcoord + +private theorem norm_toVectorL2_const (p : Vec d) : + ‖Homogenization.toVectorL2 + (U := U) + (show MemVectorL2 U (fun _ : Vec d => p) from + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) p)‖ = + ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * ‖p‖ := by + rw [Homogenization.toVectorL2, MeasureTheory.Lp.norm_toLp] + rw [MeasureTheory.eLpNorm_const'] + · simp [volumeMeasureOn, mul_comm] + · norm_num + · norm_num + +private theorem averageGradientAffineOnIsSobolevRegularDomain_gradToVectorL2_eq + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + (u.averageGradientAffineOnIsSobolevRegularDomain hU).gradToVectorL2 = + Homogenization.toVectorL2 + (U := U) + (show MemVectorL2 U (fun _ : Vec d => u.averageGradient) from + MeasureTheory.memLp_const + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) u.averageGradient) := by + let hconst_mem : MemVectorL2 U (fun _ : Vec d => u.averageGradient) := + MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) u.averageGradient + apply + (Homogenization.toVectorL2_eq_toVectorL2_iff + ((u.averageGradientAffineOnIsSobolevRegularDomain hU).grad_memVectorL2) hconst_mem).2 + filter_upwards + [H1Function.coeFn_gradToVectorL2 (u.averageGradientAffineOnIsSobolevRegularDomain hU), + Homogenization.coeFn_toVectorL2 (U := U) (f := fun _ : Vec d => u.averageGradient) hconst_mem] + with x hgrad hconst + simp [H1Function.averageGradientAffineOnIsSobolevRegularDomain] + +/-- The affine correction with gradient `u.averageGradient` has gradient `L²` +norm equal to the finite-measure `L²` norm of the constant vector field +`u.averageGradient`. -/ +theorem norm_gradToVectorL2_averageGradientAffineOnIsSobolevRegularDomain + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).gradToVectorL2‖ = + ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * ‖u.averageGradient‖ := by + rw [averageGradientAffineOnIsSobolevRegularDomain_gradToVectorL2_eq] + exact norm_toVectorL2_const (U := U) u.averageGradient + +/-- On a finite-measure Sobolev-regular domain, the gradient `L²` norm of the +affine correction is controlled by the gradient `L²` norm of `u`. -/ +theorem norm_gradToVectorL2_averageGradientAffineOnIsSobolevRegularDomain_le + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).gradToVectorL2‖ ≤ + (((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + calc + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).gradToVectorL2‖ + = ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * ‖u.averageGradient‖ := by + exact H1Function.norm_gradToVectorL2_averageGradientAffineOnIsSobolevRegularDomain + (hU := hU) (u := u) + _ ≤ ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + (H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖) := by + refine mul_le_mul_of_nonneg_left + (H1Function.norm_averageGradient_le_averageGradientL2ControlConst_mul (U := U) u) ?_ + positivity + _ = (((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + ring + +/-- The gradient `L²` norm of the affine-corrected `H¹` function is controlled +by the gradient `L²` norm of `u`. -/ +theorem norm_gradToVectorL2_sub_averageGradientAffineOnIsSobolevRegularDomain_le + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).gradToVectorL2‖ ≤ + (1 + ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + let a := u.averageGradientAffineOnIsSobolevRegularDomain hU + have hsub : + (u - a).gradToVectorL2 = u.gradToVectorL2 - a.gradToVectorL2 := by + calc + (u - a).gradToVectorL2 = (u + (-1 : ℝ) • a).gradToVectorL2 := by rfl + _ = u.gradToVectorL2 + (-1 : ℝ) • a.gradToVectorL2 := by + rw [H1Function.gradToVectorL2_add, H1Function.gradToVectorL2_smul] + _ = u.gradToVectorL2 - a.gradToVectorL2 := by + simp [sub_eq_add_neg] + have ha : + ‖a.gradToVectorL2‖ ≤ + (((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + simpa [a] using + H1Function.norm_gradToVectorL2_averageGradientAffineOnIsSobolevRegularDomain_le + (hU := hU) (u := u) + calc + ‖(u - a).gradToVectorL2‖ = ‖u.gradToVectorL2 - a.gradToVectorL2‖ := by + rw [hsub] + _ ≤ ‖u.gradToVectorL2‖ + ‖a.gradToVectorL2‖ := norm_sub_le _ _ + _ ≤ ‖u.gradToVectorL2‖ + + ((((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖) := by + simpa [add_comm] using add_le_add_right ha ‖u.gradToVectorL2‖ + _ = (1 + ((MeasureTheory.volume U) ^ ((1 : ℝ) / 2)).toReal * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + ring + +/-- The `L²` norm of `u` is bounded by the `L²` norm of the affine-corrected +remainder plus the `L²` norm of the affine correction. -/ +theorem norm_toScalarL2_le_norm_toScalarL2_sub_averageGradientAffineOnIsSobolevRegularDomain_add + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖u.toScalarL2‖ ≤ + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ := by + let a := u.averageGradientAffineOnIsSobolevRegularDomain hU + have hsum : (u - a).toScalarL2 + a.toScalarL2 = u.toScalarL2 := by + calc + (u - a).toScalarL2 + a.toScalarL2 + = (u.toScalarL2 + (-1 : ℝ) • a.toScalarL2) + a.toScalarL2 := by + rw [show u - a = u + (-1 : ℝ) • a by rfl, H1Function.toScalarL2_add, + H1Function.toScalarL2_smul] + _ = u.toScalarL2 + (((-1 : ℝ) • a.toScalarL2) + a.toScalarL2) := by + abel_nf + _ = u.toScalarL2 := by + simp + calc + ‖u.toScalarL2‖ = ‖(u - a).toScalarL2 + a.toScalarL2‖ := by + rw [← hsum] + _ ≤ ‖(u - a).toScalarL2‖ + ‖a.toScalarL2‖ := norm_add_le _ _ + +/-- The affine-correction part of `‖u.toScalarL2‖` is controlled by +`‖u.gradToVectorL2‖`, leaving only the `L²` norm of the affine-corrected +remainder as the future zero-trace coercive input. -/ +theorem norm_toScalarL2_le_norm_toScalarL2_sub_averageGradientAffineOnIsSobolevRegularDomain_add_mul + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ‖u.toScalarL2‖ ≤ + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + (H1Function.affineValueL2ControlConst hU * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖ := by + have haffine := + H1Function.norm_toScalarL2_averageGradientAffineOnIsSobolevRegularDomain_le + (hU := hU) (u := u) + have havg := + H1Function.norm_averageGradient_le_averageGradientL2ControlConst_mul (U := U) u + calc + ‖u.toScalarL2‖ ≤ + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + ‖(u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ := by + exact + H1Function.norm_toScalarL2_le_norm_toScalarL2_sub_averageGradientAffineOnIsSobolevRegularDomain_add + (hU := hU) (u := u) + _ ≤ ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + (H1Function.affineValueL2ControlConst hU * ‖u.averageGradient‖) := by + have hsum := + add_le_add_right haffine + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + simpa [add_comm] using hsum + _ ≤ ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + (H1Function.affineValueL2ControlConst hU * + (H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖)) := by + have hmul : + H1Function.affineValueL2ControlConst hU * ‖u.averageGradient‖ ≤ + H1Function.affineValueL2ControlConst hU * + (H1Function.averageGradientL2ControlConst (U := U) * ‖u.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left havg + (H1Function.affineValueL2ControlConst_nonneg hU) + have hsum := + add_le_add_right hmul + ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + simpa [add_comm] using hsum + _ = ‖(u - u.averageGradientAffineOnIsSobolevRegularDomain hU).toScalarL2‖ + + ((H1Function.affineValueL2ControlConst hU * + H1Function.averageGradientL2ControlConst (U := U)) * ‖u.gradToVectorL2‖) := by + ring + +end H1Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveSmooth.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveSmooth.lean new file mode 100644 index 0000000000..10787cf492 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CoerciveSmooth.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Analysis.FunctionalSpaces.SobolevInequality +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import Mathlib.LinearAlgebra.Pi + +/-! # Coercive Smooth -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Smooth coercive core + +This file records the derivative-side smooth compact-support estimate that +compares the full `L²` norm of the Fréchet derivative with the coordinate +gradient sum already packaged in `gradientCoordL2NormSum`. +-/ + +open scoped ENNReal + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} + +private theorem norm_fderiv_le_sum_basisVec_apply + (L : Vec d →L[ℝ] ℝ) : + ‖L‖ ≤ ∑ i : Fin d, ‖L (basisVec i)‖ := by + refine L.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) ?_ + intro x + have hx : + L x = ∑ i : Fin d, x i * L (basisVec i) := by + calc + L x = ∑ i : Fin d, x i • L (fun j => if i = j then 1 else 0) := by + simpa using (LinearMap.pi_apply_eq_sum_univ (f := L.toLinearMap) x) + _ = ∑ i : Fin d, x i • L (basisVec i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hfun : (fun j => if i = j then 1 else 0) = basisVec i := by + funext j + simp [basisVec_apply, eq_comm] + rw [hfun] + _ = ∑ i : Fin d, x i * L (basisVec i) := by + simp [smul_eq_mul] + calc + ‖L x‖ = ‖∑ i : Fin d, x i * L (basisVec i)‖ := by rw [hx] + _ ≤ ∑ i : Fin d, ‖x i * L (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖x i‖ * ‖L (basisVec i)‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖x‖ * ‖L (basisVec i)‖ := by + exact Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i : Fin d, ‖L (basisVec i)‖) * ‖x‖ := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (Finset.mul_sum (s := Finset.univ) (f := fun i : Fin d => ‖L (basisVec i)‖) ‖x‖).symm + +private theorem support_fderiv_apply_basisVec_subset_of_tsupport_subset + {f : Vec d → ℝ} (i : Fin d) (hsub : tsupport f ⊆ U) : + Function.support (fun x => (fderiv ℝ f x) (basisVec i)) ⊆ U := by + intro x hx + exact hsub <| + (support_fderiv_subset (𝕜 := ℝ) (f := f)) <| by + change fderiv ℝ f x ≠ 0 + intro hzero + apply hx + simp [hzero] + +private theorem support_sum_basisVec_apply_subset_tsupport + {f : Vec d → ℝ} : + Function.support (fun x => ∑ i : Fin d, ‖(fderiv ℝ f x) (basisVec i)‖) ⊆ tsupport f := by + intro x hx + by_contra hxt + have hzero : + ∀ i : Fin d, (fderiv ℝ f x) (basisVec i) = 0 := by + intro i + have hi : x ∉ Function.support (fderiv ℝ f) := by + exact fun hx' => hxt ((support_fderiv_subset (𝕜 := ℝ) (f := f)) hx') + have hfx : fderiv ℝ f x = 0 := by + simpa [Function.notMem_support] using hi + simp [hfx] + apply hx + simp [hzero] + +private theorem eLpNorm_basisVec_apply_eq_gradCoordToScalarL2_norm + (hU : IsOpen U) {f : Vec d → ℝ} (hf1 : ContDiff ℝ 1 f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) (i : Fin d) : + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) 2 MeasureTheory.volume) = + ‖(H1Function.ofContDiff hU hf1 hf_supp).gradCoordToScalarL2 i‖ := by + let u : H1Function U := H1Function.ofContDiff hU hf1 hf_supp + let dg : Vec d → ℝ := fun x => (fderiv ℝ f x) (basisVec i) + have hsupport : Function.support dg ⊆ U := + support_fderiv_apply_basisVec_subset_of_tsupport_subset (U := U) i hf_sub + calc + ENNReal.toReal (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) + 2 MeasureTheory.volume) + = ENNReal.toReal (MeasureTheory.eLpNorm dg 2 MeasureTheory.volume) := by + rw [MeasureTheory.eLpNorm_norm _ + ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).aestronglyMeasurable] + _ = ENNReal.toReal (MeasureTheory.eLpNorm dg 2 (volumeMeasureOn U)) := by + rw [← MeasureTheory.eLpNorm_restrict_eq_of_support_subset + ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).aestronglyMeasurable hsupport] + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn U)) := by + simp [u, dg, H1Function.ofContDiff] + _ = ‖u.gradCoordToScalarL2 i‖ := by + rw [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp] + +/-- Smooth compactly supported functions supported in `U` have full Fréchet +derivative `L²` norm controlled by the coordinate-gradient sum in the project's +`H¹` API. -/ +theorem fderivL2Norm_le_gradientCoordL2NormSum_ofContDiff + (hU : IsOpen U) {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) : + let u : H1Function U := H1Function.ofContDiff hU (hf.of_le (by simp)) hf_supp + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume) ≤ + u.gradientCoordL2NormSum := by + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let u : H1Function U := H1Function.ofContDiff hU hf1 hf_supp + let dg : Fin d → Vec d → ℝ := fun i x => (fderiv ℝ f x) (basisVec i) + let D : Vec d → ℝ := fun x => ∑ i : Fin d, ‖dg i x‖ + let dLp : MeasureTheory.Lp (Vec d →L[ℝ] ℝ) 2 MeasureTheory.volume := + ((hf1.continuous_fderiv (by simp)).memLp_of_hasCompactSupport (hf_supp.fderiv (𝕜 := ℝ))).toLp + (fderiv ℝ f) + have hd_cont : Continuous D := by + refine continuous_finsetSum _ fun i _ => ?_ + exact ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).norm + have hd_mem : MeasureTheory.MemLp D 2 MeasureTheory.volume := + hd_cont.memLp_of_hasCompactSupport <| + HasCompactSupport.of_support_subset_isCompact + hf_supp.isCompact (support_sum_basisVec_apply_subset_tsupport (f := f)) + let dCoordLp : MeasureTheory.Lp ℝ 2 MeasureTheory.volume := hd_mem.toLp D + have hderiv_le_sum : + ‖dLp‖ ≤ ‖dCoordLp‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards + [MeasureTheory.MemLp.coeFn_toLp + ((hf1.continuous_fderiv (by simp)).memLp_of_hasCompactSupport (hf_supp.fderiv (𝕜 := ℝ))), + MeasureTheory.MemLp.coeFn_toLp hd_mem] + with x hxD hxCoord + rw [hxD, hxCoord] + have hnonneg : 0 ≤ D x := Finset.sum_nonneg fun i _ => norm_nonneg _ + calc + ‖fderiv ℝ f x‖ ≤ D x := norm_fderiv_le_sum_basisVec_apply (fderiv ℝ f x) + _ = ‖D x‖ := by simp [abs_of_nonneg hnonneg] + have hsum_le : + ‖dCoordLp‖ ≤ ∑ i : Fin d, ‖u.gradCoordToScalarL2 i‖ := by + let di : Fin d → Vec d → ℝ := fun i x => ‖dg i x‖ + have hdi_mem : + ∀ i : Fin d, MeasureTheory.MemLp (di i) 2 MeasureTheory.volume := by + intro i + have hcont : Continuous (di i) := by + exact ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).norm + exact hcont.memLp_of_hasCompactSupport + ((hf_supp.fderiv_apply (𝕜 := ℝ) (basisVec i)).norm) + have hsum_eLp : + MeasureTheory.eLpNorm D 2 MeasureTheory.volume ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm (di i) 2 MeasureTheory.volume := by + have hD : D = ∑ i : Fin d, di i := by + funext x + simp [D, di] + rw [hD] + simpa using + (MeasureTheory.eLpNorm_sum_le + (μ := MeasureTheory.volume) + (s := Finset.univ) + (f := di) + + (by norm_num : (1 : ℝ≥0∞) ≤ 2)) + calc + ‖dCoordLp‖ = ENNReal.toReal (MeasureTheory.eLpNorm D 2 MeasureTheory.volume) := by + simp [dCoordLp] + _ ≤ ENNReal.toReal (∑ i : Fin d, MeasureTheory.eLpNorm (di i) 2 MeasureTheory.volume) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun i _ => (hdi_mem i).eLpNorm_lt_top.ne + _ = ∑ i : Fin d, ‖u.gradCoordToScalarL2 i‖ := by + rw [ENNReal.toReal_sum (fun i hi => (hdi_mem i).eLpNorm_lt_top.ne)] + refine Finset.sum_congr rfl ?_ + intro i hi + simpa [di, hf1] using + eLpNorm_basisVec_apply_eq_gradCoordToScalarL2_norm + (U := U) hU hf1 hf_supp hf_sub i + have hfderiv_eq : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume) = ‖dLp‖ := by + simp [dLp] + calc + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume) + = ‖dLp‖ := hfderiv_eq + _ ≤ ‖dCoordLp‖ := hderiv_le_sum + _ ≤ u.gradientCoordL2NormSum := hsum_le + +/-- In dimensions `d ≥ 3`, smooth compactly supported functions supported in a +bounded domain satisfy the coercive `L²` estimate with the coordinate-gradient +sum on the right. -/ +theorem valueL2Norm_le_sobolevConst_mul_gradientCoordL2NormSum_ofContDiff + (hU : IsOpen U) (hBounded : IsBoundedDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) (hd : 2 < d) : + let u : H1Function U := H1Function.ofContDiff hU (hf.of_le (by simp)) hf_supp + ‖u.toScalarL2‖ ≤ + (MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) : ℝ) * + u.gradientCoordL2NormSum := by + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let u : H1Function U := H1Function.ofContDiff hU hf1 hf_supp + let C := MeasureTheory.eLpNormLESNormFDerivOfLeConst + (F := ℝ) (μ := MeasureTheory.volume) (s := U) (p := 2) (q := 2) + have hsupp : Function.support f ⊆ U := by + intro x hx + exact hf_sub (subset_tsupport _ hx) + have hfderiv_mem : MeasureTheory.MemLp (fderiv ℝ f) 2 MeasureTheory.volume := + (hf1.continuous_fderiv (by simp)).memLp_of_hasCompactSupport (hf_supp.fderiv (𝕜 := ℝ)) + have hsob : + MeasureTheory.eLpNorm f 2 MeasureTheory.volume ≤ + (C : ℝ≥0∞) * MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume := by + simpa [C] using + (MeasureTheory.eLpNorm_le_eLpNorm_fderiv + (μ := MeasureTheory.volume) + (F := ℝ) + (u := f) + (s := U) + hf1 hsupp (by norm_num : (1 : NNReal) ≤ 2) + (by + have hd' : (2 : NNReal) < d := by + exact_mod_cast hd + simpa [Homogenization.Vec, Module.finrank_fintype_fun_eq_card, Fintype.card_fin] using hd') + hBounded.isBounded) + have hvalue : + ‖u.toScalarL2‖ = ENNReal.toReal (MeasureTheory.eLpNorm f 2 MeasureTheory.volume) := by + calc + ‖u.toScalarL2‖ = ENNReal.toReal (MeasureTheory.eLpNorm u 2 (volumeMeasureOn U)) := by + rw [H1Function.toScalarL2, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + _ = ENNReal.toReal (MeasureTheory.eLpNorm f 2 (volumeMeasureOn U)) := by + simp [u, H1Function.ofContDiff] + _ = ENNReal.toReal (MeasureTheory.eLpNorm f 2 MeasureTheory.volume) := by + rw [MeasureTheory.eLpNorm_restrict_eq_of_support_subset hf.continuous.aestronglyMeasurable hsupp] + calc + ‖u.toScalarL2‖ = ENNReal.toReal (MeasureTheory.eLpNorm f 2 MeasureTheory.volume) := hvalue + _ ≤ ENNReal.toReal ((C : ℝ≥0∞) * MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume) := by + exact ENNReal.toReal_mono (ENNReal.mul_ne_top (by simp) hfderiv_mem.eLpNorm_lt_top.ne) hsob + _ = (C : ℝ) * ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 MeasureTheory.volume) := by + rw [ENNReal.toReal_mul] + simp + _ ≤ (C : ℝ) * u.gradientCoordL2NormSum := by + exact mul_le_mul_of_nonneg_left + (fderivL2Norm_le_gradientCoordL2NormSum_ofContDiff + (U := U) hU hf hf_supp hf_sub) + (show 0 ≤ (C : ℝ) by exact_mod_cast C.2) + +end H1Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare.lean new file mode 100644 index 0000000000..afce32809b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare.lean @@ -0,0 +1,385 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Embedding + +/-! # Cube Besov Poincare -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-! +# Cube Besov-Poincare bridge for H¹ functions + +This file exposes the constant-mode-safe full-dual vector Poincare interface +for scalar `H¹` functions on cubes. It is deliberately upstream of the +deterministic Caccioppoli files: the theorem is a pure Sobolev/Besov statement, +with the Neumann/CZ input isolated in the cube Poisson endpoint package. +-/ + +theorem h1Function_dualFullGradientSum_nonneg + {d : ℕ} (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) := by + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + refine Finset.sum_nonneg ?_ + intro i _hi + exact cubeBesovDualFullNorm_nonneg + Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => u.grad x i) + (by simp [hconj]) + (by simp [hconj]) + +theorem CubeDualFullVectorPoincareEstimate.of_h1Function_of_analyticInput + {d : ℕ} (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (h : CubeFullVectorPoincareAnalyticInput Q) + (C : ℝ) + (hC : + h.dualityConstant * h.czConstant ≤ C) : + CubeDualFullVectorPoincareEstimate Q + C + (fun x => u x) + (fun x => u.grad x) := by + have hdualNonneg := h1Function_dualFullGradientSum_nonneg Q u + have hanalytic := + h.dualFullVectorPoincareEstimate_of_h1Function u hdualNonneg + have hmono : + (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) ≤ + C * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + exact mul_le_mul_of_nonneg_right hC hdualNonneg + exact le_trans hanalytic hmono + +/-- Full-dual vector Poincare from the direct `L²` endpoint analytic bundle. +This is the corrected package boundary after the endpoint estimate has already +absorbed the Neumann CZ bound. -/ +theorem CubeDualFullVectorPoincareEstimate.of_h1Function_of_l2AnalyticInput + {d : ℕ} (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (C : ℝ) + (hC : h.endpointConstant ≤ C) : + CubeDualFullVectorPoincareEstimate Q + C + (fun x => u x) + (fun x => u.grad x) := by + have hdualNonneg := h1Function_dualFullGradientSum_nonneg Q u + have hanalytic := + h.dualFullVectorPoincareEstimate_of_h1Function u hdualNonneg + have hmono : + h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) ≤ + C * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + exact mul_le_mul_of_nonneg_right hC hdualNonneg + exact le_trans hanalytic hmono + +/- Classical cube-local analytic package for the full-dual infinite-depth +vector Poincare theorem. + +The Neumann Poisson solver is supplied by the coercive Hilbert layer. The +remaining field-level dependency is the Neumann Calderon-Zygmund estimate, +which feeds the direct `L²` full-dual Poisson-gradient endpoint package. -/ + +/-- Constant for the cube Neumann Calderon-Zygmund `B¹_{2,∞}` estimate. -/ +theorem exists_cubeNeumannPoissonGradientBesovEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + ∃ C : ℝ, CubeNeumannPoissonGradientBesovEstimate Q C := + ⟨cubeNeumannPoissonGradientBesovEnergyConstant Q, + cubeNeumannPoissonGradientBesovEstimate_of_energy Q⟩ + +/-- Chosen constant for the cube Neumann Calderon-Zygmund `B¹_{2,∞}` estimate. -/ +noncomputable def cubeNeumannPoissonGradientBesovConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + Classical.choose (exists_cubeNeumannPoissonGradientBesovEstimate Q) + +/-- Cube Neumann Calderon-Zygmund `B¹_{2,∞}` estimate. -/ +theorem cubeNeumannPoissonGradientBesovEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubeNeumannPoissonGradientBesovEstimate Q + (cubeNeumannPoissonGradientBesovConstant Q) := + Classical.choose_spec (exists_cubeNeumannPoissonGradientBesovEstimate Q) + +/-- Chosen constant for the direct `L²` Poisson-gradient positive dual +test-norm core estimate. -/ +noncomputable def cubePoissonGradientDualTestNormL2CoreConstant + {d : ℕ} [NeZero d] (_Q : TriadicCube d) : ℝ := + Legacy.cubeNeumannW22CalderonZygmundConstant d + +/-- Direct `L²` positive dual test-norm core estimate for Poisson gradients. -/ +theorem cubePoissonGradientDualTestNormL2CoreEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubePoissonGradientDualTestNormL2CoreEstimate Q + (cubePoissonGradientDualTestNormL2CoreConstant Q) := + Legacy.cubeNeumannW22CalderonZygmundRegularity Q + +/-- Chosen constant for the direct `L²` Poisson-gradient positive dual +test-norm estimate. The factor `d` is the cost of converting a componentwise +core bound into the summed strictly positive `B` package. -/ +noncomputable def cubePoissonGradientDualTestNormL2Constant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + (d : ℝ) * cubePoissonGradientDualTestNormL2CoreConstant Q + +/-- Direct `L²` positive dual test-norm estimate for Poisson gradients, +including the strict-positive `B` packaging used by endpoint duality. -/ +theorem cubePoissonGradientDualTestNormL2Estimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubePoissonGradientDualTestNormL2Estimate Q + (cubePoissonGradientDualTestNormL2Constant Q) := by + simpa [cubePoissonGradientDualTestNormL2Constant] using + CubePoissonGradientDualTestNormL2CoreEstimate.to_l2Estimate + (cubePoissonGradientDualTestNormL2CoreEstimate Q) + +/-- Chosen constant for the full-dual L² endpoint estimate. -/ +noncomputable def cubePoissonGradientFullL2EndpointDualityConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + cubePoissonGradientDualTestNormL2Constant Q + +/-- Full-dual Poisson-gradient endpoint estimate with the Poisson-gradient +side already controlled by the normalized `L²` size of the right-hand side. -/ +theorem cubePoissonGradientFullL2EndpointDuality + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubePoissonGradientFullL2EndpointDuality Q + (cubePoissonGradientFullL2EndpointDualityConstant Q) := by + simpa [cubePoissonGradientFullL2EndpointDualityConstant] using + CubePoissonGradientFullL2EndpointDuality.of_dualTestNormL2Estimate + (cubePoissonGradientDualTestNormL2Estimate Q) + +/-- Assemble the direct `L²` endpoint analytic input from its named field-level +dependencies. -/ +noncomputable def cubeFullVectorPoincareL2AnalyticInput + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubeFullVectorPoincareL2AnalyticInput Q where + poisson := cubeMeanZeroNeumannPoissonSolverOnCube Q + endpointConstant := cubePoissonGradientFullL2EndpointDualityConstant Q + endpoint := cubePoissonGradientFullL2EndpointDuality Q + +/-- Exact one-cube constant selected by the corrected direct `L²` endpoint +input. -/ +noncomputable def cubeFullVectorPoincareAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + cubePoissonGradientFullL2EndpointDualityConstant Q + +theorem cubeFullVectorPoincareAnalyticConstant_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + 0 ≤ cubeFullVectorPoincareAnalyticConstant Q := by + exact (cubePoissonGradientFullL2EndpointDuality Q).1 + +theorem cubeFullVectorPoincareAnalyticConstant_eq_fullL2EndpointDualityConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + cubeFullVectorPoincareAnalyticConstant Q = + cubePoissonGradientFullL2EndpointDualityConstant Q := by + rfl + +theorem cubeFullVectorPoincareAnalyticConstant_eq_dimensionConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + cubeFullVectorPoincareAnalyticConstant Q = + (d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d := by + simp [cubeFullVectorPoincareAnalyticConstant, + cubePoissonGradientFullL2EndpointDualityConstant, + cubePoissonGradientDualTestNormL2Constant, + cubePoissonGradientDualTestNormL2CoreConstant] + +theorem cubeFullVectorPoincareAnalyticConstant_eq_of_same_dimension + {d : ℕ} [NeZero d] (Q R : TriadicCube d) : + cubeFullVectorPoincareAnalyticConstant Q = + cubeFullVectorPoincareAnalyticConstant R := by + rw [cubeFullVectorPoincareAnalyticConstant_eq_dimensionConstant Q, + cubeFullVectorPoincareAnalyticConstant_eq_dimensionConstant R] + +/-- Single-cube full-dual vector Poincare with the exact selected corrected +analytic constant. -/ +theorem CubeDualFullVectorPoincareEstimate.of_h1Function_analyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) : + CubeDualFullVectorPoincareEstimate Q + (cubeFullVectorPoincareAnalyticConstant Q) + (fun x => u x) + (fun x => u.grad x) := by + exact CubeDualFullVectorPoincareEstimate.of_h1Function_of_l2AnalyticInput + Q u (cubeFullVectorPoincareL2AnalyticInput Q) + (cubeFullVectorPoincareAnalyticConstant Q) + (by rfl) + +/-- Single-cube full-dual vector Poincare stated with the selected direct +L² endpoint constant. This is definitionally the same constant as +`cubeFullVectorPoincareAnalyticConstant`, but the statement exposes the +endpoint package that future proofs should aim to discharge. -/ +theorem CubeDualFullVectorPoincareEstimate.of_h1Function_fullL2EndpointConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) : + CubeDualFullVectorPoincareEstimate Q + (cubePoissonGradientFullL2EndpointDualityConstant Q) + (fun x => u x) + (fun x => u.grad x) := by + exact CubeDualFullVectorPoincareEstimate.of_h1Function_of_l2AnalyticInput + Q u (cubeFullVectorPoincareL2AnalyticInput Q) + (cubePoissonGradientFullL2EndpointDualityConstant Q) + (by rfl) + +/-- Single-cube full-dual vector Poincare with any constant dominating the +exact selected corrected analytic constant. -/ +theorem CubeDualFullVectorPoincareEstimate.of_h1Function_of_analyticConstant_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + {C : ℝ} (hC : cubeFullVectorPoincareAnalyticConstant Q ≤ C) : + CubeDualFullVectorPoincareEstimate Q + C + (fun x => u x) + (fun x => u.grad x) := by + exact CubeDualFullVectorPoincareEstimate.of_h1Function_of_l2AnalyticInput + Q u (cubeFullVectorPoincareL2AnalyticInput Q) C + (by + simpa [cubeFullVectorPoincareAnalyticConstant, cubeFullVectorPoincareL2AnalyticInput] + using hC) + +/-- Finite-depth descendant full-dual version using an explicit uniform bound +on the selected corrected analytic constants over the descendants that occur +up to depth `N`. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.of_h1Function_of_descendant_analyticConstant_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (N : ℕ) {C : ℝ} + (hC : + ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeFullVectorPoincareAnalyticConstant R ≤ C) : + CubeDescendantDualFullVectorPoincareEstimate Q + C + (cubeFluctuation Q (fun x => u x)) + (fun x => u.grad x) N := by + refine CubeDualFullVectorPoincareEstimate.to_descendant ?_ ?_ + · intro j hj R hR + simpa using + (u.restrictToOpenSubcube hR).memL2_normalizedCubeMeasure + · intro j hj R hR + simpa using + CubeDualFullVectorPoincareEstimate.of_h1Function_of_analyticConstant_le + R (u.restrictToOpenSubcube hR) (hC j hj R hR) + +/-! ### Uniform descendant analytic constants -/ + +/-- Existence of a parent-cube constant that dominates the selected corrected +full-dual analytic Poincare constants on all descendants of the parent. This is +now a formal consequence of the dimension-uniform Neumann `W2,2` / CZ +constant. -/ +theorem exists_cubeFullVectorPoincareUniformAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ j : ℕ, ∀ R ∈ descendantsAtDepth Q j, + cubeFullVectorPoincareAnalyticConstant R ≤ C := by + refine ⟨(d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d, ?_, ?_⟩ + · exact mul_nonneg (Nat.cast_nonneg d) + (Legacy.cubeNeumannW22CalderonZygmundConstant_nonneg d) + · intro j R hR + simp [cubeFullVectorPoincareAnalyticConstant, + cubePoissonGradientFullL2EndpointDualityConstant, + cubePoissonGradientDualTestNormL2Constant, + cubePoissonGradientDualTestNormL2CoreConstant] + +/-- Explicit dimension-only parent-cube constant dominating the selected +corrected full-dual analytic constants on all descendants of the parent. -/ +noncomputable def cubeFullVectorPoincareUniformAnalyticConstant + {d : ℕ} [NeZero d] (_Q : TriadicCube d) : ℝ := + (d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d + +theorem cubeFullVectorPoincareUniformAnalyticConstant_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + 0 ≤ cubeFullVectorPoincareUniformAnalyticConstant Q := by + simpa [cubeFullVectorPoincareUniformAnalyticConstant] using + mul_nonneg (Nat.cast_nonneg d) + (Legacy.cubeNeumannW22CalderonZygmundConstant_nonneg d) + +theorem cubeFullVectorPoincareAnalyticConstant_le_uniformAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (j : ℕ) + (R : TriadicCube d) (_hR : R ∈ descendantsAtDepth Q j) : + cubeFullVectorPoincareAnalyticConstant R ≤ + cubeFullVectorPoincareUniformAnalyticConstant Q := by + simp [cubeFullVectorPoincareUniformAnalyticConstant, + cubeFullVectorPoincareAnalyticConstant, + cubePoissonGradientFullL2EndpointDualityConstant, + cubePoissonGradientDualTestNormL2Constant, + cubePoissonGradientDualTestNormL2CoreConstant] + +/-- All-depth descendant full-dual theorem with the selected corrected uniform +analytic constant. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.of_h1Function_uniformAnalyticConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (N : ℕ) : + CubeDescendantDualFullVectorPoincareEstimate Q + (cubeFullVectorPoincareUniformAnalyticConstant Q) + (cubeFluctuation Q (fun x => u x)) + (fun x => u.grad x) N := + CubeDescendantDualFullVectorPoincareEstimate.of_h1Function_of_descendant_analyticConstant_le + Q u N + (by + intro j _hj R hR + exact cubeFullVectorPoincareAnalyticConstant_le_uniformAnalyticConstant Q j R hR) + +/-- Public cube Poincare constant for the corrected full-dual theorem. It is +the selected parent-cube constant that dominates the exact full-dual analytic +constants on all descendants. -/ +noncomputable def fullVectorPoincareCubeConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + cubeFullVectorPoincareUniformAnalyticConstant Q + +theorem fullVectorPoincareCubeConstant_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + 0 ≤ fullVectorPoincareCubeConstant Q := by + simpa [fullVectorPoincareCubeConstant] using + cubeFullVectorPoincareUniformAnalyticConstant_nonneg Q + +theorem fullVectorPoincareCubeConstant_eq_dimensionConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + fullVectorPoincareCubeConstant Q = + (d : ℝ) * Legacy.cubeNeumannW22CalderonZygmundConstant d := by + rfl + +theorem cubeFullVectorPoincareAnalyticConstant_le_fullVectorPoincareCubeConstant + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + cubeFullVectorPoincareAnalyticConstant Q ≤ fullVectorPoincareCubeConstant Q := by + have hQ : Q ∈ descendantsAtDepth Q 0 := by + simp [descendantsAtDepth_zero] + simpa [fullVectorPoincareCubeConstant] using + cubeFullVectorPoincareAnalyticConstant_le_uniformAnalyticConstant Q 0 Q hQ + +theorem CubeDualFullVectorPoincareEstimate.of_h1Function + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) : + CubeDualFullVectorPoincareEstimate Q + (fullVectorPoincareCubeConstant Q) + (fun x => u x) + (fun x => u.grad x) := by + exact CubeDualFullVectorPoincareEstimate.of_h1Function_of_analyticConstant_le + Q u (cubeFullVectorPoincareAnalyticConstant_le_fullVectorPoincareCubeConstant Q) + +/-- Descendant infinite-depth full-dual Poincare for an `H¹` function, obtained +from the corrected parent-cube uniform analytic constant on each descendant. -/ +theorem CubeDescendantDualFullVectorPoincareEstimate.of_h1Function + {d : ℕ} [NeZero d] (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (N : ℕ) : + CubeDescendantDualFullVectorPoincareEstimate Q + (fullVectorPoincareCubeConstant Q) + (cubeFluctuation Q (fun x => u x)) + (fun x => u.grad x) N := by + simpa [fullVectorPoincareCubeConstant] using + CubeDescendantDualFullVectorPoincareEstimate.of_h1Function_uniformAnalyticConstant + Q u N + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Aggregation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Aggregation.lean new file mode 100644 index 0000000000..8fbc21e7e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Aggregation.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.Projection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore + +/-! +# Finite positive Besov aggregation + +This is the scale-cancellation step from a local cube Poincare estimate to a +finite `B¹_{2,∞}` seminorm bound. It contains no analytic input beyond the +explicit local oscillation and normalized descendant-energy hypotheses. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- A scale-sharp local oscillation bound and uniform normalized descendant +energy control imply the finite triadic-cube `B¹_{2,∞}` bound. -/ +theorem cubeBesovPartialSeminormTop_one_two_le_of_localOscillation + {d : ℕ} (Q : TriadicCube d) (N : ℕ) (f : Vec d → ℝ) + (K G : ℝ) (E : TriadicCube d → ℝ) + (hK : 0 ≤ K) (hG : 0 ≤ G) + (hE : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, 0 ≤ E R) + (hosc : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) f ≤ K * cubeScaleFactor R * E R) + (havg : ∀ j ∈ Finset.range (N + 1), + descendantsAverage Q j (fun R => E R ^ 2) ≤ G ^ 2) : + cubeBesovPartialSeminormTop Q 1 (2 : ℝ≥0∞) N f ≤ K * G := by + refine cubeBesovPartialSeminormTop_le_of_forall_depthSeminorm_le + Q 1 (2 : ℝ≥0∞) N f ?_ + intro j hj + let a : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let A : TriadicCube d → ℝ := fun R => K * cubeScaleFactor R * E R + have ha_pos : 0 < a := by + dsimp [a] + exact div_pos + (by simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + (by positivity) + have hA_nonneg : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R := by + intro R hR + dsimp [A] + exact mul_nonneg + (mul_nonneg hK (le_of_lt <| by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) R.scale))) + (hE j hj R hR) + have hlocal : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) f ≤ A R := by + intro R hR + exact hosc j hj R hR + have hdepth := + cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + Q 1 f j A hA_nonneg hlocal + have hscaled : + descendantsAverage Q j (fun R => (A R) ^ 2) = + (K * a) ^ 2 * descendantsAverage Q j (fun R => E R ^ 2) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hsum : + ∑ R ∈ D, (A R) ^ 2 = + ∑ R ∈ D, (K * a) ^ 2 * E R ^ 2 := by + refine Finset.sum_congr rfl ?_ + intro R hR + dsimp [A] + rw [show cubeScaleFactor R = a by + dsimp [a] + exact cubeScaleFactor_eq_div_pow_of_mem_descendantsAtDepth (by simpa [D] using hR)] + ring + change (D.card : ℝ)⁻¹ * ∑ R ∈ D, (A R) ^ 2 = + (K * a) ^ 2 * ((D.card : ℝ)⁻¹ * ∑ R ∈ D, E R ^ 2) + rw [hsum, ← Finset.mul_sum] + ring + have hinside : + descendantsAverage Q j (fun R => (A R) ^ 2) ≤ (K * a * G) ^ 2 := by + rw [hscaled] + calc + (K * a) ^ 2 * descendantsAverage Q j (fun R => E R ^ 2) + ≤ (K * a) ^ 2 * G ^ 2 := by + exact mul_le_mul_of_nonneg_left (havg j hj) (sq_nonneg _) + _ = (K * a * G) ^ 2 := by ring + have hroot : + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) ≤ K * a * G := by + have hleft : 0 ≤ descendantsAverage Q j (fun R => (A R) ^ 2) := + descendantsAverage_nonneg Q j _ fun _ _ => sq_nonneg _ + have hright : 0 ≤ K * a * G := by + exact mul_nonneg (mul_nonneg hK ha_pos.le) hG + calc + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) + ≤ ((K * a * G) ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleft hinside (by norm_num) + _ = K * a * G := sq_rpow_half_eq_of_nonneg hright + have hweight_a : cubeBesovDepthWeight Q 1 j * a = 1 := by + dsimp [cubeBesovDepthWeight, a] + rw [Real.rpow_neg_one] + exact inv_mul_cancel₀ (ne_of_gt ha_pos) + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) f j + ≤ cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) := hdepth + _ ≤ cubeBesovDepthWeight Q 1 j * (K * a * G) := by + exact mul_le_mul_of_nonneg_left hroot (cubeBesovDepthWeight_nonneg Q 1 j) + _ = K * G := by + calc + cubeBesovDepthWeight Q 1 j * (K * a * G) + = K * (cubeBesovDepthWeight Q 1 j * a) * G := by ring + _ = K * G := by simp [hweight_a] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Embedding.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Embedding.lean new file mode 100644 index 0000000000..b3ec3d3b55 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12Embedding.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12Aggregation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12LocalPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12NormalizedPartition + +/-! +# Triadic-cube `W^{1,2}` to positive Besov embedding + +This module exposes the exact source-facing normalized `W^{1,2}` estimate. +The local Poincare estimate and the normalized descendant-energy partition +are assembled by the generic finite-depth `B^1_{2,∞}` aggregation lemma. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- Dimensional constant for the triadic-cube `W^{1,2} → B^1_{2,∞}` embedding. -/ +noncomputable def cubeBesovW12EmbeddingConstant (d : ℕ) : ℝ := + cubeBesovW12LocalPoincareConstant d + +theorem cubeBesovW12EmbeddingConstant_nonneg (d : ℕ) : + 0 ≤ cubeBesovW12EmbeddingConstant d := + cubeBesovW12LocalPoincareConstant_nonneg d + +/-- Triadic-cube Poincare embedding of the normalized `W^{1,2}` unit ball +into the positive Besov `B^1_{2,∞}` ball. Scale-free constant. -/ +theorem cubeBesovPartialSeminormTop_one_two_le_normalizedW1pSeminorm + {d : ℕ} [NeZero d] (Q : TriadicCube d) (N : ℕ) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) : + cubeBesovPartialSeminormTop Q 1 (2 : ℝ≥0∞) N u.toFun ≤ + cubeBesovW12EmbeddingConstant d * + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u := by + let E : TriadicCube d → ℝ := + fun R => cubeLpNorm R (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) + have hE : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, 0 ≤ E R := by + intro _ _ R _ + exact cubeLpNorm_nonneg R (2 : ℝ≥0∞) _ + have hosc : ∀ j ∈ Finset.range (N + 1), ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) u.toFun ≤ + cubeBesovW12EmbeddingConstant d * cubeScaleFactor R * E R := by + intro j _ R hR + let uR : W1pFunction (openCubeSet R) (2 : ℝ≥0∞) := + u.restrictToOpenSubcube hR + have hlocal := + cubeBesovOscillation_two_le_cubeScaleFactor_mul_normalizedW1pSeminorm R uR + rw [openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad R uR] at hlocal + simpa [uR, E, cubeBesovW12EmbeddingConstant, mul_assoc] using hlocal + have havg : ∀ j ∈ Finset.range (N + 1), + descendantsAverage Q j (fun R => E R ^ 2) ≤ + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u ^ 2 := by + intro j _ + rw [show (fun R => E R ^ 2) = + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2) by rfl] + calc + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2) = + cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2 := + descendantsAverage_cubeLpNorm_euclideanGrad_two_sq_eq Q u j + _ = BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u ^ 2 := by + rw [← openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad Q u] + _ ≤ BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u ^ 2 := le_rfl + have hG : 0 ≤ BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u := by + rw [openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad Q u] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) _ + exact cubeBesovPartialSeminormTop_one_two_le_of_localOscillation + Q N u.toFun (cubeBesovW12EmbeddingConstant d) + (BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u) + E (cubeBesovW12EmbeddingConstant_nonneg d) hG hE hosc havg + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12LocalPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12LocalPoincare.lean new file mode 100644 index 0000000000..50e0f19abd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12LocalPoincare.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.StandardOverlapComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeBesovPoincare.W12NormalizedPartition + +/-! +# Local normalized `W^{1,2}` Poincare estimate on triadic cubes + +The overlap-cube `H^1` estimate is used only at the middle child of a +triadic cube. There its overlap is the original cube, so the estimate has a +dimension-only constant and the exact normalized open-cube Sobolev carrier. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The dimension-only constant in the local normalized cube Poincare +estimate. -/ +noncomputable def cubeBesovW12LocalPoincareConstant (d : ℕ) : ℝ := + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + +theorem cubeBesovW12LocalPoincareConstant_nonneg (d : ℕ) : + 0 ≤ cubeBesovW12LocalPoincareConstant d := + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + +private def W1pFunction.toH1AtTwo {d : ℕ} {U : Set (Vec d)} + (u : W1pFunction U (2 : ℝ≥0∞)) : H1Function U where + toFun := u.toFun + grad := u.grad + memL2 := u.memLp + gradMemL2 := u.gradMemLp + hasWeakGradient := u.hasWeakGradient + +private def castH1Domain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : H1Function V := + hUV ▸ u + +@[simp] private theorem castH1Domain_toFun {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castH1Domain hUV u).toFun = u.toFun := by + subst V + rfl + +@[simp] private theorem castH1Domain_grad {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castH1Domain hUV u).grad = u.grad := by + subst V + rfl + +private theorem cubeLpNorm_grad_le_cubeLpNorm_euclideanGrad {d : ℕ} + (Q : TriadicCube d) (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) : + cubeLpNorm Q (2 : ℝ≥0∞) u.grad ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) := by + unfold cubeLpNorm + apply ENNReal.toReal_mono + · let U : BoundedMeasurableDomain d := + (isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q) + have hmem : MeasureTheory.MemLp (fun x => euclideanNorm (u.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa only [U, + openCubeSet_boundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using u.gradEuclideanMemLp U (2 : ℝ≥0∞) + exact hmem.eLpNorm_ne_top + · apply MeasureTheory.eLpNorm_mono_ae + filter_upwards [] with x + simpa only [Real.norm_eq_abs, abs_of_nonneg (norm_nonneg _), + abs_of_nonneg (euclideanNorm_nonneg _), + euclideanNorm_eq_norm_ofVec] using HilbertVec.norm_le_norm_ofVec (u.grad x) + +/-- The local Poincare estimate on a triadic cube in the exact normalized +`W^{1,2}` carrier used by the Besov embedding. -/ +theorem cubeBesovOscillation_two_le_cubeScaleFactor_mul_normalizedW1pSeminorm + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) u.toFun ≤ + cubeBesovW12LocalPoincareConstant d * cubeScaleFactor Q * + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u := by + let S : TriadicCube d := middleChildCube Q + let v : H1Function (openCubeSet Q) := u.toH1AtTwo + have hdomain : openOverlapCubeSet S = openCubeSet Q := by + dsimp [S] + ext x + simp only [openOverlapCubeSet, openCubeSet, Set.mem_ofPred_eq] + constructor <;> intro hx i <;> rcases hx i with ⟨hlo, hhi⟩ + · have hscale : cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by simp [middleChildCube] + have hlower : + ((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + ((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa only [hlower] using hlo, by simpa only [hupper] using hhi⟩ + · have hscale : cubeScaleFactor (middleChildCube Q) = cubeScaleFactor Q / 3 := by + simpa [middleChildCube] using + cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hindex : (((middleChildCube Q).index i : ℤ) : ℝ) = + 3 * (Q.index i : ℝ) := by simp [middleChildCube] + have hlower : + ((((middleChildCube Q).index i : ℤ) : ℝ) - (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q) = + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + have hupper : + ((((middleChildCube Q).index i : ℤ) : ℝ) + (3 / 2 : ℝ)) * + cubeScaleFactor (middleChildCube Q) = + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) := by + rw [hscale, hindex] + ring + exact ⟨by simpa only [hlower] using hlo, by simpa only [hupper] using hhi⟩ + let vS : H1Function (openOverlapCubeSet S) := castH1Domain hdomain.symm v + have hlocal := overlapCubeLpNorm_two_sub_overlapCubeAverage_le_scale_mul_grad S vS + have hlocal' : + cubeBesovOscillation Q (2 : ℝ≥0∞) u.toFun ≤ + (cubeScaleFactor Q * cubeBesovW12LocalPoincareConstant d) * + cubeLpNorm Q (2 : ℝ≥0∞) u.grad := by + simpa [cubeBesovOscillation, cubeFluctuation, S, v, vS, + cubeBesovW12LocalPoincareConstant, mul_comm] using! hlocal + have hgrad := cubeLpNorm_grad_le_cubeLpNorm_euclideanGrad Q u + calc + cubeBesovOscillation Q (2 : ℝ≥0∞) u.toFun ≤ + (cubeScaleFactor Q * cubeBesovW12LocalPoincareConstant d) * + cubeLpNorm Q (2 : ℝ≥0∞) u.grad := hlocal' + _ ≤ (cubeScaleFactor Q * cubeBesovW12LocalPoincareConstant d) * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) := by + exact mul_le_mul_of_nonneg_left hgrad + (mul_nonneg (by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale).le) + (cubeBesovW12LocalPoincareConstant_nonneg d)) + _ = cubeBesovW12LocalPoincareConstant d * cubeScaleFactor Q * + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u := by + rw [← openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad Q u] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12NormalizedPartition.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12NormalizedPartition.lean new file mode 100644 index 0000000000..dc9eadb5ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeBesovPoincare/W12NormalizedPartition.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.MultiscaleEllipticity +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized + +/-! +# Normalized `W^{1,2}` data on triadic cubes + +This small bridge keeps the source-facing open-cube Sobolev carrier while +identifying its normalized volume with the cube normalization used by the +disjoint Besov hierarchy. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace W1pFunction + +/-- Restrict a Sobolev witness on an open triadic cube to one of its open +descendants. Both its function and stored weak-gradient representatives are +unchanged. -/ +def restrictToOpenSubcube {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {p : ℝ≥0∞} (u : W1pFunction (openCubeSet Q) p) + (hR : R ∈ descendantsAtDepth Q j) : W1pFunction (openCubeSet R) p := + u.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + +@[simp] theorem restrictToOpenSubcube_toFun {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {p : ℝ≥0∞} (u : W1pFunction (openCubeSet Q) p) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hR).toFun = u.toFun := + rfl + +@[simp] theorem restrictToOpenSubcube_grad {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + {p : ℝ≥0∞} (u : W1pFunction (openCubeSet Q) p) + (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hR).grad = u.grad := + rfl + +end W1pFunction + +/-- The normalized measure of the source-facing open cube is exactly the +normalized cube measure. This is a measure equality, not a pointwise carrier +identification. -/ +theorem openCubeSet_boundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure + {d : ℕ} (Q : TriadicCube d) : + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)).normalizedVolume = normalizedCubeMeasure Q := by + change (MeasureTheory.volume (openCubeSet Q))⁻¹ • + MeasureTheory.volume.restrict (openCubeSet Q) = normalizedCubeMeasure Q + rw [volume_openCubeSet_eq_volume_cubeSet, + ← cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + exact cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure Q + +/-- The exact source-facing normalized `W^{1,2}` seminorm on an open cube is +the normalized cube `L²` norm of the explicit Euclidean gradient magnitude. -/ +theorem openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) : + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u = + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) := by + let domain := (isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q) + change (domain.normalizedLpENorm 2 (fun x => euclideanNorm (u.grad x))).toReal = _ + rw [domain.normalizedLpENorm_eq_eLpNorm 2 _ + (u.gradEuclideanMemLp domain 2).aestronglyMeasurable] + change (MeasureTheory.eLpNorm (fun x => euclideanNorm (u.grad x)) + 2 domain.normalizedVolume).toReal = _ + rw [show domain.normalizedVolume = normalizedCubeMeasure Q from + openCubeSet_boundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure Q] + rfl + +/-- Normalized `L²` energy partitions exactly over descendants. This is the +measure-theoretic ingredient needed to aggregate the restricted open-cube +Sobolev seminorms. -/ +theorem descendantsAverage_cubeLpNorm_euclideanGrad_two_sq_eq + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) (j : ℕ) : + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2) = + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) ^ 2 := by + let UQ : BoundedMeasurableDomain d := + (isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q) + have hmemU : MeasureTheory.MemLp (fun x => euclideanNorm (u.grad x)) + (2 : ℝ≥0∞) UQ.normalizedVolume := + u.gradEuclideanMemLp UQ (2 : ℝ≥0∞) + have hmem : MeasureTheory.MemLp (fun x => euclideanNorm (u.grad x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa only [UQ, + openCubeSet_boundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hmemU + have hint : MeasureTheory.IntegrableOn + (fun x => ‖euclideanNorm (u.grad x)‖ ^ (2 : ℝ)) + (cubeSet Q) MeasureTheory.volume := by + exact integrableOn_of_integrable_normalizedCubeMeasure Q + (hmem.integrable_norm_rpow (by norm_num) (by norm_num)) + calc + descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2) + = descendantsAverage Q j + (fun R => cubeAverage R + (fun x => ‖euclideanNorm (u.grad x)‖ ^ (2 : ℝ))) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := R) (p := (2 : ℝ≥0∞)) + (f := fun x => euclideanNorm (u.grad x)) + (by norm_num) (by norm_num) + (memLp_on_descendant_of_memLp hR hmem)) + _ = cubeAverage Q (fun x => ‖euclideanNorm (u.grad x)‖ ^ (2 : ℝ)) := by + rw [← cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn Q j _ hint] + _ = cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) ^ 2 := by + symm + simpa using + (cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) + (f := fun x => euclideanNorm (u.grad x)) + (by norm_num) (by norm_num) hmem) + +/-- The source-facing normalized Sobolev seminorm of a descendant. The zero +value off the finite descendant family makes this a total function of a cube, +as required by `descendantsAverage`; it is never used on that off-family +branch. -/ +noncomputable def descendantOpenCubeSetNormalizedW1pSeminormTwo + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) (j : ℕ) + (R : TriadicCube d) : ℝ := + if hR : R ∈ descendantsAtDepth Q j then + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet R).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty R)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) + (u.restrictToOpenSubcube hR) + else 0 + +/-- On an actual descendant, the totalized seminorm is the literal +source-facing seminorm of the restricted Sobolev witness. -/ +theorem descendantOpenCubeSetNormalizedW1pSeminormTwo_eq_of_mem + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) (j : ℕ) + {R : TriadicCube d} (hR : R ∈ descendantsAtDepth Q j) : + descendantOpenCubeSetNormalizedW1pSeminormTwo Q u j R = + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet R).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty R)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) + (u.restrictToOpenSubcube hR) := by + simp only [descendantOpenCubeSetNormalizedW1pSeminormTwo, dif_pos hR] + +/-- The exact source-facing normalized Sobolev energy partitions over the +open descendants of a triadic cube. -/ +theorem descendantsAverage_openCubeSet_normalizedW1pSeminorm_two_sq_eq + {d : ℕ} [NeZero d] (Q : TriadicCube d) + (u : W1pFunction (openCubeSet Q) (2 : ℝ≥0∞)) (j : ℕ) : + descendantsAverage Q j + (fun R => descendantOpenCubeSetNormalizedW1pSeminormTwo Q u j R ^ 2) = + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u ^ 2 := by + calc + descendantsAverage Q j + (fun R => descendantOpenCubeSetNormalizedW1pSeminormTwo Q u j R ^ 2) + = descendantsAverage Q j + (fun R => cubeLpNorm R (2 : ℝ≥0∞) + (fun x => euclideanNorm (u.grad x)) ^ 2) := by + unfold descendantsAverage + refine congrArg (fun t : ℝ => ((descendantsAtDepth Q j).card : ℝ)⁻¹ * t) ?_ + refine Finset.sum_congr rfl ?_ + intro R hR + rw [descendantOpenCubeSetNormalizedW1pSeminormTwo_eq_of_mem Q u j hR] + rw [openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad + R (u.restrictToOpenSubcube hR)] + simp + _ = cubeLpNorm Q (2 : ℝ≥0∞) (fun x => euclideanNorm (u.grad x)) ^ 2 := + descendantsAverage_cubeLpNorm_euclideanGrad_two_sq_eq Q u j + _ = BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + ((isOpenBoundedConvexDomain_openCubeSet Q).toBoundedMeasurableDomain + (Book.Ch02.openCubeSet_nonempty Q)) + (2 : ℝ≥0∞) (by norm_num) (by norm_num) u ^ 2 := by + rw [openCubeSet_normalizedW1pSeminorm_two_eq_cubeLpNorm_euclideanGrad Q u] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund.lean new file mode 100644 index 0000000000..1997f5f404 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund.lean @@ -0,0 +1,18 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletNeumannEndpoint + +/-! +# Calderón--Zygmund estimates on cubes + +This module exposes the public Dirichlet and mean-zero Neumann finite-exponent +Calderón--Zygmund estimates on triadic cubes. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicCovariance.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicCovariance.lean new file mode 100644 index 0000000000..00c5393465 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicCovariance.lean @@ -0,0 +1,839 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientIterationGeometry + +/-! # Axis Cube Harmonic Covariance -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Pointwise + +noncomputable section + +namespace CubeCalderonZygmund + +/-- The center of the open axis cube `axisCube z L`. -/ +def axisCubeCenter {d : ℕ} (z : Vec d) (L : ℝ) : Vec d := + fun i => z i + L / 2 + +/-- The affine formula which, for positive `L`, maps the centered unit triadic +cube to `axisCube z L`. -/ +def axisCubeAffine {d : ℕ} (z : Vec d) (L : ℝ) : Vec d → Vec d := + fun x => L • x + axisCubeCenter z L + +/-- The inverse affine formula, which is an actual inverse when `L ≠ 0`. -/ +def axisCubeAffineInv {d : ℕ} (z : Vec d) (L : ℝ) : Vec d → Vec d := + fun x => L⁻¹ • (x - axisCubeCenter z L) + +@[simp] theorem axisCubeAffineInv_axisCubeAffine {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) (x : Vec d) : + axisCubeAffineInv z L (axisCubeAffine z L x) = x := by + ext i + simp [axisCubeAffineInv, axisCubeAffine, hL] + +@[simp] theorem axisCubeAffine_axisCubeAffineInv {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) (x : Vec d) : + axisCubeAffine z L (axisCubeAffineInv z L x) = x := by + ext i + simp [axisCubeAffineInv, axisCubeAffine, hL] + +/-- The affine parametrization as a measurable equivalence of the ambient +Euclidean space when its scale is nonzero. -/ +def axisCubeAffineMeasurableEquiv {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) : Vec d ≃ᵐ Vec d where + toEquiv := + { toFun := axisCubeAffine z L + invFun := axisCubeAffineInv z L + left_inv := axisCubeAffineInv_axisCubeAffine z hL + right_inv := axisCubeAffine_axisCubeAffineInv z hL } + measurable_toFun := (measurable_const_smul L).add measurable_const + measurable_invFun := + (measurable_const_smul L⁻¹).comp (measurable_id.sub measurable_const) + +@[simp] theorem axisCubeAffineMeasurableEquiv_apply {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) (x : Vec d) : + axisCubeAffineMeasurableEquiv z hL x = axisCubeAffine z L x := + rfl + +@[simp] theorem axisCubeAffineMeasurableEquiv_symm_apply {d : ℕ} (z : Vec d) + {L : ℝ} (hL : L ≠ 0) (x : Vec d) : + (axisCubeAffineMeasurableEquiv z hL).symm x = axisCubeAffineInv z L x := + rfl + +@[simp] theorem axisCubeAffine_comp {d : ℕ} (z w : Vec d) (L S : ℝ) + (x : Vec d) : + axisCubeAffine z L (axisCubeAffine w S x) = + axisCubeAffine (fun i => L * w i + axisCubeCenter z L i) (L * S) x := by + ext i + simp only [axisCubeAffine, axisCubeCenter, Pi.add_apply, Pi.smul_apply, smul_eq_mul] + ring + +theorem openCubeSet_originCube_zero_eq_centered_axisCube {d : ℕ} : + openCubeSet (originCube d 0) = + axisCube (fun _ => (-(1 / 2 : ℝ))) 1 := by + ext x + simp only [openCubeSet, originCube, cubeScaleFactor, axisCube, Set.mem_ofPred_eq, + Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_Ioo, zpow_zero] + constructor <;> intro hx <;> intro i + · have hxi := hx i + norm_num at hxi ⊢ + constructor <;> linarith [hxi.1, hxi.2] + · have hxi := hx i + norm_num at hxi ⊢ + constructor <;> linarith [hxi.1, hxi.2] + +/-- An arbitrary positive-length axis cube is the centered-unit triadic cube, +dilated by its side length and translated to its center. -/ +theorem axisCube_eq_translateSet_smul_openCubeSet_originCube_zero {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) : + axisCube z L = + translateSet (axisCubeCenter z L) (L • openCubeSet (originCube d 0)) := by + rw [openCubeSet_originCube_zero_eq_centered_axisCube] + ext x + rw [mem_translateSet_iff_sub_mem, Set.mem_smul_set_iff_inv_smul_mem₀ hL.ne'] + simp only [axisCube, Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_Ioo, + axisCubeCenter, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + constructor <;> intro hx <;> intro i + · have hxi := hx i + have hlo : (-(1 / 2 : ℝ)) < (x i - (z i + L / 2)) / L := by + apply (lt_div_iff₀ hL).mpr + linarith [hxi.1] + have hhi : (x i - (z i + L / 2)) / L < (1 / 2 : ℝ) := by + apply (div_lt_iff₀ hL).mpr + linarith [hxi.2] + norm_num at hlo hhi ⊢ + constructor + · convert hlo using 1 + all_goals first | rfl | ring + · convert hhi using 1 + all_goals first | rfl | ring + · have hxi := hx i + norm_num at hxi ⊢ + have hlo : (-(1 / 2 : ℝ)) < (x i - (z i + L / 2)) / L := by + simpa [div_eq_mul_inv, mul_comm] using hxi.1 + have hhi : (x i - (z i + L / 2)) / L < (1 / 2 : ℝ) := by + simpa [div_eq_mul_inv, mul_comm] using hxi.2 + constructor + · have := (lt_div_iff₀ hL).mp hlo + linarith + · have := (div_lt_iff₀ hL).mp hhi + linarith + +/-- The positive affine parametrization maps the centered unit cube exactly +onto its target axis cube. -/ +theorem axisCubeAffine_image_openCubeSet_originCube_zero {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) : + axisCubeAffine z L '' openCubeSet (originCube d 0) = axisCube z L := by + rw [axisCube_eq_translateSet_smul_openCubeSet_originCube_zero z L hL] + ext y + constructor + · rintro ⟨x, hx, rfl⟩ + exact ⟨L • x, ⟨x, hx, rfl⟩, rfl⟩ + · rintro ⟨_, ⟨x, hx, rfl⟩, rfl⟩ + exact ⟨x, hx, rfl⟩ + +/-- The target axis cube has the centered unit cube as its exact preimage under +the positive affine parametrization. -/ +theorem axisCubeAffine_preimage_axisCube {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) : + axisCubeAffine z L ⁻¹' axisCube z L = openCubeSet (originCube d 0) := by + rw [← axisCubeAffine_image_openCubeSet_originCube_zero z L hL] + exact Set.preimage_image_eq _ (axisCubeAffineMeasurableEquiv z hL.ne').injective + +/-- A positive affine cube parametrization maps every positive axis cube to +the axis cube with the expected affine corner and product side length. -/ +theorem axisCubeAffine_image_axisCube {d : ℕ} + (z w : Vec d) (L S : ℝ) (hL : 0 < L) (hS : 0 < S) : + axisCubeAffine z L '' axisCube w S = + axisCube (fun i => L * w i + axisCubeCenter z L i) (L * S) := by + rw [← axisCubeAffine_image_openCubeSet_originCube_zero w S hS, + Set.image_image] + rw [show (fun x => axisCubeAffine z L (axisCubeAffine w S x)) = + axisCubeAffine (fun i => L * w i + axisCubeCenter z L i) (L * S) by + funext x + exact axisCubeAffine_comp z w L S x] + exact axisCubeAffine_image_openCubeSet_originCube_zero _ _ (mul_pos hL hS) + +/-- Exact preimage form of `axisCubeAffine_image_axisCube`. -/ +theorem axisCubeAffine_preimage_axisCube_affine {d : ℕ} + (z w : Vec d) (L S : ℝ) (hL : 0 < L) (hS : 0 < S) : + axisCubeAffine z L ⁻¹' + axisCube (fun i => L * w i + axisCubeCenter z L i) (L * S) = + axisCube w S := by + rw [← axisCubeAffine_image_axisCube z w L S hL hS] + exact Set.preimage_image_eq _ (axisCubeAffineMeasurableEquiv z hL.ne').injective + +/-- Lower corner of the open axis-cube realization of a triadic cube. -/ +def triadicCubeAxisCorner {d : ℕ} (Q : TriadicCube d) : Vec d := + fun i => ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q + +/-- Every open triadic cube is exactly its lower-corner axis cube. -/ +theorem openCubeSet_eq_axisCube_triadicCube {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q = axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q) := by + have hupper : ∀ i : Fin d, + triadicCubeAxisCorner Q i + cubeScaleFactor Q = + ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q := by + intro i + simp only [triadicCubeAxisCorner] + ring + ext x + simp only [openCubeSet, axisCube, triadicCubeAxisCorner, Set.mem_ofPred_eq, + Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_Ioo] + constructor <;> intro hx <;> intro i + · rw [show ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q + + cubeScaleFactor Q = + ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q by + simpa only [triadicCubeAxisCorner] using hupper i] + exact hx i + · have hxi := hx i + rw [show ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q + + cubeScaleFactor Q = + ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q by + simpa only [triadicCubeAxisCorner] using hupper i] at hxi + exact hxi + +/-- Side length of the concentric depth-`n` contraction of `axisCube z L`. -/ +def axisCubeConcentricDepthSide (L : ℝ) (n : ℕ) : ℝ := + L * (3 : ℝ) ^ (-(n : ℤ)) + +@[simp] theorem axisCubeConcentricDepthSide_zero (L : ℝ) : + axisCubeConcentricDepthSide L 0 = L := by + simp [axisCubeConcentricDepthSide] + +theorem axisCubeConcentricDepthSide_pos {L : ℝ} (hL : 0 < L) (n : ℕ) : + 0 < axisCubeConcentricDepthSide L n := by + unfold axisCubeConcentricDepthSide + positivity + +/-- Lower corner of the concentric depth-`n` contraction of `axisCube z L`. -/ +def axisCubeConcentricDepthCorner {d : ℕ} (z : Vec d) (L : ℝ) (n : ℕ) : + Vec d := + fun i => axisCubeCenter z L i - axisCubeConcentricDepthSide L n / 2 + +@[simp] theorem axisCubeConcentricDepthCorner_zero {d : ℕ} (z : Vec d) (L : ℝ) : + axisCubeConcentricDepthCorner z L 0 = z := by + ext i + simp only [axisCubeConcentricDepthCorner, axisCubeConcentricDepthSide_zero, + axisCubeCenter] + ring + +/-- The outer affine parametrization maps the centered depth-`n` source cube +exactly to the corresponding concentric contraction of its target cube. -/ +theorem axisCubeAffine_image_openCubeSet_originCube_neg_nat {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) (n : ℕ) : + axisCubeAffine z L '' openCubeSet (originCube d (-(n : ℤ))) = + axisCube (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n) := by + rw [openCubeSet_eq_axisCube_triadicCube] + have hscale : 0 < cubeScaleFactor (originCube d (-(n : ℤ))) := by + change 0 < (3 : ℝ) ^ (-(n : ℤ)) + positivity + rw [axisCubeAffine_image_axisCube z _ L _ hL hscale] + congr 2 + · funext i + simp only [triadicCubeAxisCorner, originCube, Pi.zero_apply, Int.cast_zero, + zero_sub, axisCubeConcentricDepthCorner, axisCubeConcentricDepthSide, + cubeScaleFactor] + ring + +/-- Exact preimage form of the fixed concentric depth transport. -/ +theorem axisCubeAffine_preimage_concentricDepthAxisCube {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) (n : ℕ) : + axisCubeAffine z L ⁻¹' + axisCube (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n) = + openCubeSet (originCube d (-(n : ℤ))) := by + rw [← axisCubeAffine_image_openCubeSet_originCube_neg_nat z L hL n] + exact Set.preimage_image_eq _ (axisCubeAffineMeasurableEquiv z hL.ne').injective + +@[simp] private theorem H1Function.grad_cast {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) (x : Vec d) : + (hUV ▸ u).grad x = u.grad x := by + cases hUV + rfl + +@[simp] private theorem H1Function.toFun_cast {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) (x : Vec d) : + (hUV ▸ u).toFun x = u.toFun x := by + cases hUV + rfl + +private theorem WeakPoissonEquationOn.castDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) {u : H1Function U} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn U u f) : + WeakPoissonEquationOn V (hUV ▸ u) f := by + cases hUV + exact h + +/-- Homogeneous weak Poisson equations are invariant under the gradient-preserving +pullback from `a • U` to `U`. -/ +theorem WeakPoissonEquationOn.undilateSet_zero {d : ℕ} {U V : Set (Vec d)} + {a : ℝ} (ha : 0 < a) (hV : V = a • U) {u : H1Function V} + (h : WeakPoissonEquationOn V u 0) : + WeakPoissonEquationOn U (u.undilateSet ha hV) 0 := by + subst V + intro φ hφ hφs hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a⁻¹ • y) + have ha_ne : a ≠ 0 := ha.ne' + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a⁻¹) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne)) + simpa [ψ, Function.comp] using + hφs.comp_homeomorph (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne)) + have hψ_sub : tsupport ψ ⊆ a • U := by + intro y hy + have hy' : a⁻¹ • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne) by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha_ne))] at hy + exact hy + exact ⟨a⁻¹ • y, hφ_sub hy', by simp [ha_ne, smul_smul]⟩ + have hgradψ : ∀ y : Vec d, + euclideanGradient ψ y = a⁻¹ • euclideanGradient φ (a⁻¹ • y) := by + intro y + ext i + unfold euclideanGradient euclideanCoordDeriv + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a⁻¹ • z)) y = + a⁻¹ • fderiv ℝ φ (a⁻¹ • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a⁻¹) + change (fderiv ℝ ψ y) (basisVec i) = + a⁻¹ * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + change (fderiv ℝ (fun z : Vec d => φ (a⁻¹ • z)) y) (basisVec i) = _ + rw [hderiv] + rfl + have htest : + ∫ y in a • U, vecDot (u.grad y) (euclideanGradient ψ y) ∂MeasureTheory.volume = 0 := by + simpa using h.test ψ hψ_smooth hψ_supp hψ_sub + have hscaled : + a⁻¹ * ∫ y in a • U, + vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y)) ∂MeasureTheory.volume = 0 := by + calc + a⁻¹ * ∫ y in a • U, + vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y)) ∂MeasureTheory.volume + = ∫ y in a • U, + a⁻¹ * vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = ∫ y in a • U, vecDot (u.grad y) (euclideanGradient ψ y) + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + rw [hgradψ] + simp only [vecDot, Pi.smul_apply, smul_eq_mul] + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro i _ + ring + _ = 0 := htest + have hinner : + ∫ y in a • U, + vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y)) ∂MeasureTheory.volume = 0 := by + exact (mul_eq_zero.mp hscaled).resolve_left (inv_ne_zero ha_ne) + have hchange : + ∫ x in U, vecDot ((u.undilateSet ha rfl).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in a • U, + vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y)) ∂MeasureTheory.volume := by + simpa only [H1Function.undilateSet_grad, smul_smul, inv_mul_cancel₀ ha_ne, + one_smul, Module.finrank_fin_fun] using! + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => + vecDot (u.grad y) (euclideanGradient φ (a⁻¹ • y))) + (s := U) ha) + rw [hchange, hinner, mul_zero] + simp + +/-- Homogeneous weak Poisson equations are invariant under translation pullback. -/ +theorem WeakPoissonEquationOn.untranslate_zero {d : ℕ} {U : Set (Vec d)} + {z : Vec d} {u : H1Function (translateSet z U)} + (h : WeakPoissonEquationOn (translateSet z U) u 0) : + WeakPoissonEquationOn U (u.untranslate z) 0 := by + have hdomain : translateSet (-z) (translateSet z U) = U := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) U) + have htranslated : + WeakPoissonEquationOn (translateSet (-z) (translateSet z U)) + (u.translate (-z)) 0 := by + simpa using! h.translate (-z) + have hcast : WeakPoissonEquationOn U (hdomain ▸ u.translate (-z)) 0 := + WeakPoissonEquationOn.castDomain hdomain htranslated + have hu : hdomain ▸ u.translate (-z) = u.untranslate z := by + apply H1Function.ext + · funext x + simp [sub_eq_add_neg] + · funext x + simp [sub_eq_add_neg] + simpa [hu] using hcast + +/-- Pull an `H¹` function on a positive-length axis cube back to the fixed +centered unit triadic cube, with the standard value normalization that leaves +the gradient unscaled. -/ +noncomputable def axisCubeHarmonicPullback {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) (u : H1Function (axisCube z L)) : + H1Function (openCubeSet (originCube d 0)) := by + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + let c : Vec d := axisCubeCenter z L + let V : Set (Vec d) := translateSet c (L • U0) + have hV : axisCube z L = V := by + simpa [U0, c, V] using + axisCube_eq_translateSet_smul_openCubeSet_originCube_zero z L hL + let uV : H1Function V := hV ▸ u + let uD : H1Function (L • U0) := H1Function.untranslate c uV + exact uD.undilateSet hL rfl + +/-- Pullback to the centered unit cube preserves the homogeneous weak Poisson +equation. -/ +theorem axisCubeHarmonicPullback_weakPoisson_zero {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) {u : H1Function (axisCube z L)} + (h : WeakPoissonEquationOn (axisCube z L) u 0) : + WeakPoissonEquationOn (openCubeSet (originCube d 0)) + (axisCubeHarmonicPullback z hL u) 0 := by + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + let c : Vec d := axisCubeCenter z L + let V : Set (Vec d) := translateSet c (L • U0) + have hV : axisCube z L = V := by + simpa [U0, c, V] using + axisCube_eq_translateSet_smul_openCubeSet_originCube_zero z L hL + let uV : H1Function V := hV ▸ u + have hVweak : WeakPoissonEquationOn V uV 0 := + WeakPoissonEquationOn.castDomain hV h + have hD : WeakPoissonEquationOn (L • U0) (H1Function.untranslate c uV) 0 := + WeakPoissonEquationOn.untranslate_zero hVweak + have hU : WeakPoissonEquationOn U0 + ((H1Function.untranslate c uV).undilateSet hL rfl) 0 := + WeakPoissonEquationOn.undilateSet_zero hL rfl hD + simpa only [axisCubeHarmonicPullback] using hU + +/-- The pushforward of centered-unit Lebesgue measure through the affine map. +For positive `L`, `axisCubeNormalizedMeasure_eq_smul_volume_restrict` below +identifies this with normalized Lebesgue measure on `axisCube z L`. No such +axis-cube interpretation is claimed for nonpositive `L`. -/ +noncomputable def axisCubeNormalizedMeasure {d : ℕ} (z : Vec d) (L : ℝ) : + MeasureTheory.Measure (Vec d) := + MeasureTheory.Measure.map (axisCubeAffine z L) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) + +/-- For positive side length, the affine pushforward is exactly normalized +Lebesgue measure on the target axis cube. -/ +theorem axisCubeNormalizedMeasure_eq_smul_volume_restrict {d : ℕ} + (z : Vec d) (L : ℝ) (hL : 0 < L) : + axisCubeNormalizedMeasure z L = + ENNReal.ofReal ((L ^ d)⁻¹) • + MeasureTheory.volume.restrict (axisCube z L) := by + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + let c : Vec d := axisCubeCenter z L + calc + axisCubeNormalizedMeasure z L = + MeasureTheory.Measure.map (fun x : Vec d => x + c) + (MeasureTheory.Measure.map (fun x : Vec d => L • x) + (MeasureTheory.volume.restrict U0)) := by + rw [MeasureTheory.Measure.map_map (measurable_add_const c) + (measurable_const_smul L)] + rfl + _ = MeasureTheory.Measure.map (fun x : Vec d => x + c) + (ENNReal.ofReal ((L ^ d)⁻¹) • + MeasureTheory.volume.restrict (L • U0)) := by + rw [map_smul_volume_restrict hL U0] + _ = ENNReal.ofReal ((L ^ d)⁻¹) • + MeasureTheory.Measure.map (fun x : Vec d => x + c) + (MeasureTheory.volume.restrict (L • U0)) := by + rw [MeasureTheory.Measure.map_smul _ (f := fun x : Vec d => x + c) + (measurable_id.add measurable_const).aemeasurable] + _ = ENNReal.ofReal ((L ^ d)⁻¹) • + MeasureTheory.volume.restrict (translateSet c (L • U0)) := by + rw [(measurePreserving_addRight_restrict_translateSet c (L • U0)).map_eq] + _ = ENNReal.ofReal ((L ^ d)⁻¹) • + MeasureTheory.volume.restrict (axisCube z L) := by + rw [axisCube_eq_translateSet_smul_openCubeSet_originCube_zero z L hL] + +/-- Canonical normalized-volume form of the target measure at a fixed +concentric depth. -/ +theorem axisCubeNormalizedMeasure_concentricDepth_eq_smul_volume_restrict + {d : ℕ} (z : Vec d) (L : ℝ) (hL : 0 < L) (n : ℕ) : + axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n) = + ENNReal.ofReal (((axisCubeConcentricDepthSide L n) ^ d)⁻¹) • + MeasureTheory.volume.restrict + (axisCube (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := + axisCubeNormalizedMeasure_eq_smul_volume_restrict _ _ + (axisCubeConcentricDepthSide_pos hL n) + +/-- On a triadic cube, the affine pushforward normalization agrees exactly +with the project's canonical `normalizedCubeMeasure`. -/ +theorem axisCubeNormalizedMeasure_triadicCube {d : ℕ} (Q : TriadicCube d) : + axisCubeNormalizedMeasure (triadicCubeAxisCorner Q) (cubeScaleFactor Q) = + normalizedCubeMeasure Q := by + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict _ _ hscale, + ← openCubeSet_eq_axisCube_triadicCube Q, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q, + cubeVolume_eq_scaleFactor_pow] + +private theorem axisCubeConcentricDepthSide_eq_centralDescendant_cubeScaleFactor + {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + axisCubeConcentricDepthSide (cubeScaleFactor Q) n = + cubeScaleFactor (centralDescendant Q n) := by + rw [centralDescendant_cubeScaleFactor] + simp only [axisCubeConcentricDepthSide, zpow_neg, zpow_natCast, div_eq_mul_inv] + +private theorem axisCubeConcentricDepthCorner_eq_centralDescendant_triadicCubeAxisCorner + {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + axisCubeConcentricDepthCorner (triadicCubeAxisCorner Q) (cubeScaleFactor Q) n = + triadicCubeAxisCorner (centralDescendant Q n) := by + ext i + simp only [triadicCubeAxisCorner, axisCubeConcentricDepthCorner, axisCubeCenter, + axisCubeConcentricDepthSide] + rw [centralDescendant_index Q n i, centralDescendant_cubeScaleFactor] + simp only [zpow_neg, zpow_natCast, div_eq_mul_inv] + field_simp [pow_ne_zero n (by norm_num : (3 : ℝ) ≠ 0)] + simp only [Int.cast_mul, Int.cast_pow, Int.cast_ofNat] + ring + +/-- The concentric depth-`n` axis cube of a triadic cube is exactly its +ordinary central depth-`n` descendant. -/ +theorem axisCube_concentricDepth_eq_openCubeSet_centralDescendant {d : ℕ} + (Q : TriadicCube d) (n : ℕ) : + axisCube + (axisCubeConcentricDepthCorner (triadicCubeAxisCorner Q) (cubeScaleFactor Q) n) + (axisCubeConcentricDepthSide (cubeScaleFactor Q) n) = + openCubeSet (centralDescendant Q n) := by + rw [openCubeSet_eq_axisCube_triadicCube] + rw [axisCubeConcentricDepthCorner_eq_centralDescendant_triadicCubeAxisCorner, + axisCubeConcentricDepthSide_eq_centralDescendant_cubeScaleFactor] + +/-- The affine normalized measure on a concentric depth-`n` axis cube is the +canonical normalized measure on the corresponding central descendant. -/ +theorem axisCubeNormalizedMeasure_concentricDepth_eq_normalizedCubeMeasure_centralDescendant + {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + axisCubeNormalizedMeasure + (axisCubeConcentricDepthCorner (triadicCubeAxisCorner Q) (cubeScaleFactor Q) n) + (axisCubeConcentricDepthSide (cubeScaleFactor Q) n) = + normalizedCubeMeasure (centralDescendant Q n) := by + rw [← axisCubeNormalizedMeasure_triadicCube (centralDescendant Q n)] + rw [axisCubeConcentricDepthCorner_eq_centralDescendant_triadicCubeAxisCorner, + axisCubeConcentricDepthSide_eq_centralDescendant_cubeScaleFactor] + +/-- Affine pushforward of an affine-cube normalized measure is the normalized +measure with the composed affine corner and product scale. This identity is +purely a pushforward identity and therefore does not require positive scales. -/ +theorem map_axisCubeAffine_axisCubeNormalizedMeasure {d : ℕ} + (z w : Vec d) (L S : ℝ) : + MeasureTheory.Measure.map (axisCubeAffine z L) + (axisCubeNormalizedMeasure w S) = + axisCubeNormalizedMeasure + (fun i => L * w i + axisCubeCenter z L i) (L * S) := by + unfold axisCubeNormalizedMeasure + have hout : Measurable (axisCubeAffine z L) := + (measurable_const_smul L).add measurable_const + have hin : Measurable (axisCubeAffine w S) := + (measurable_const_smul S).add measurable_const + calc + MeasureTheory.Measure.map (axisCubeAffine z L) + (MeasureTheory.Measure.map (axisCubeAffine w S) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0)))) = + MeasureTheory.Measure.map (axisCubeAffine z L ∘ axisCubeAffine w S) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) := + MeasureTheory.Measure.map_map hout hin + _ = MeasureTheory.Measure.map + (axisCubeAffine (fun i => L * w i + axisCubeCenter z L i) (L * S)) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) := by + apply MeasureTheory.Measure.map_congr + filter_upwards with x + exact axisCubeAffine_comp z w L S x + +/-- The affine map preserves the centered-unit source measure and its +pushforward measure. -/ +theorem measurePreserving_axisCubeAffine {d : ℕ} (z : Vec d) (L : ℝ) : + MeasureTheory.MeasurePreserving (axisCubeAffine z L) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) + (axisCubeNormalizedMeasure z L) := + ⟨(measurable_const_smul L).add measurable_const, rfl⟩ + +/-- For nonzero scale, the inverse affine map preserves the pushforward +measure back to centered-unit Lebesgue measure. -/ +theorem measurePreserving_axisCubeAffineInv {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) : + MeasureTheory.MeasurePreserving (axisCubeAffineInv z L) + (axisCubeNormalizedMeasure z L) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) := by + simpa only [axisCubeAffineMeasurableEquiv_apply, + axisCubeAffineMeasurableEquiv_symm_apply] using! + (measurePreserving_axisCubeAffine z L).symm + (axisCubeAffineMeasurableEquiv z hL) + +/-- Strong a.e. measurability can be transported in either direction through +the nondegenerate affine parametrization. -/ +theorem aestronglyMeasurable_axisCubeAffine_iff {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) {E : Type*} [TopologicalSpace E] (f : Vec d → E) : + MeasureTheory.AEStronglyMeasurable + (fun x => f (axisCubeAffine z L x)) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) ↔ + MeasureTheory.AEStronglyMeasurable f (axisCubeNormalizedMeasure z L) := by + constructor + · intro hf + have hcomp := hf.comp_measurePreserving + (measurePreserving_axisCubeAffineInv z hL) + have hfun : (fun x => f (axisCubeAffine z L x)) ∘ axisCubeAffineInv z L = f := by + funext x + exact congrArg f (axisCubeAffine_axisCubeAffineInv z hL x) + rw [hfun] at hcomp + exact hcomp + · intro hf + simpa only [Function.comp_apply] using! + hf.comp_measurePreserving (measurePreserving_axisCubeAffine z L) + +/-- `MemLp` is equivalent on the source and target of every nondegenerate +affine cube parametrization. In particular, target integrability can be +deduced from source integrability without a circular target-measurability +hypothesis. -/ +theorem memLp_axisCubeAffine_iff {d : ℕ} (z : Vec d) {L : ℝ} + (hL : L ≠ 0) {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) : + MeasureTheory.MemLp (fun x => f (axisCubeAffine z L x)) p + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) ↔ + MeasureTheory.MemLp f p (axisCubeNormalizedMeasure z L) := by + constructor + · intro hf + have hcomp := hf.comp_measurePreserving + (measurePreserving_axisCubeAffineInv z hL) + have hfun : (fun x => f (axisCubeAffine z L x)) ∘ axisCubeAffineInv z L = f := by + funext x + exact congrArg f (axisCubeAffine_axisCubeAffineInv z hL x) + rw [hfun] at hcomp + exact hcomp + · intro hf + simpa only [Function.comp_apply] using! + hf.comp_measurePreserving (measurePreserving_axisCubeAffine z L) + +/-- The fixed centered depth-`n` source measure pushes forward to the exact +normalized measure on the target concentric contraction. -/ +theorem map_axisCubeAffine_normalizedCubeMeasure_originCube_neg_nat {d : ℕ} + (z : Vec d) (L : ℝ) (n : ℕ) : + MeasureTheory.Measure.map (axisCubeAffine z L) + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) = + axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n) := by + rw [← axisCubeNormalizedMeasure_triadicCube (originCube d (-(n : ℤ))), + map_axisCubeAffine_axisCubeNormalizedMeasure] + congr 2 + funext i + simp only [triadicCubeAxisCorner, originCube, Pi.zero_apply, Int.cast_zero, + zero_sub, axisCubeConcentricDepthCorner, axisCubeConcentricDepthSide, + cubeScaleFactor] + ring + +/-- Measure-preserving form of the fixed concentric depth transport. -/ +theorem measurePreserving_axisCubeAffine_originCube_neg_nat {d : ℕ} + (z : Vec d) (L : ℝ) (n : ℕ) : + MeasureTheory.MeasurePreserving (axisCubeAffine z L) + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := + ⟨(measurable_const_smul L).add measurable_const, + map_axisCubeAffine_normalizedCubeMeasure_originCube_neg_nat z L n⟩ + +/-- Inverse measure-preserving form of the fixed concentric depth transport. -/ +theorem measurePreserving_axisCubeAffineInv_originCube_neg_nat {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) (n : ℕ) : + MeasureTheory.MeasurePreserving (axisCubeAffineInv z L) + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) := by + simpa only [axisCubeAffineMeasurableEquiv_apply, + axisCubeAffineMeasurableEquiv_symm_apply] using! + (measurePreserving_axisCubeAffine_originCube_neg_nat z L n).symm + (axisCubeAffineMeasurableEquiv z hL) + +/-- Bidirectional strong a.e. measurability transport on a fixed concentric +depth. -/ +theorem aestronglyMeasurable_axisCubeAffine_originCube_neg_nat_iff {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) (n : ℕ) + {E : Type*} [TopologicalSpace E] (f : Vec d → E) : + MeasureTheory.AEStronglyMeasurable (fun x => f (axisCubeAffine z L x)) + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) ↔ + MeasureTheory.AEStronglyMeasurable f + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := by + constructor + · intro hf + have hcomp := hf.comp_measurePreserving + (measurePreserving_axisCubeAffineInv_originCube_neg_nat z hL n) + have hfun : (fun x => f (axisCubeAffine z L x)) ∘ axisCubeAffineInv z L = f := by + funext x + exact congrArg f (axisCubeAffine_axisCubeAffineInv z hL x) + rw [hfun] at hcomp + exact hcomp + · intro hf + simpa only [Function.comp_apply] using! + hf.comp_measurePreserving (measurePreserving_axisCubeAffine_originCube_neg_nat z L n) + +/-- Bidirectional `MemLp` transport on the fixed centered depth-`n` source and +its target concentric contraction. -/ +theorem memLp_axisCubeAffine_originCube_neg_nat_iff {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) (n : ℕ) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) : + MeasureTheory.MemLp (fun x => f (axisCubeAffine z L x)) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) ↔ + MeasureTheory.MemLp f p + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := by + constructor + · intro hf + have hcomp := hf.comp_measurePreserving + (measurePreserving_axisCubeAffineInv_originCube_neg_nat z hL n) + have hfun : (fun x => f (axisCubeAffine z L x)) ∘ axisCubeAffineInv z L = f := by + funext x + exact congrArg f (axisCubeAffine_axisCubeAffineInv z hL x) + rw [hfun] at hcomp + exact hcomp + · intro hf + simpa only [Function.comp_apply] using! + hf.comp_measurePreserving (measurePreserving_axisCubeAffine_originCube_neg_nat z L n) + +/-- The affine parametrization preserves every extended `Lᵖ` norm when the +target axis cube carries `axisCubeNormalizedMeasure`. -/ +theorem eLpNorm_axisCubeAffine {d : ℕ} (z : Vec d) (L : ℝ) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (axisCubeNormalizedMeasure z L)) : + MeasureTheory.eLpNorm (fun x => f (axisCubeAffine z L x)) p + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) = + MeasureTheory.eLpNorm f p (axisCubeNormalizedMeasure z L) := by + symm + apply MeasureTheory.eLpNorm_map_measure hf + exact (measurable_const_smul L).add measurable_const |>.aemeasurable + +/-- Source-side measurability is also sufficient for exact affine norm +transport when the affine map is nondegenerate. -/ +theorem eLpNorm_axisCubeAffine_of_comp_aestronglyMeasurable {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable + (fun x => f (axisCubeAffine z L x)) + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0)))) : + MeasureTheory.eLpNorm (fun x => f (axisCubeAffine z L x)) p + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0))) = + MeasureTheory.eLpNorm f p (axisCubeNormalizedMeasure z L) := by + exact eLpNorm_axisCubeAffine z L p f + ((aestronglyMeasurable_axisCubeAffine_iff z hL f).1 hf) + +/-- Exact extended `Lᵖ` norm transport from the fixed centered depth-`n` +source cube to the corresponding target concentric contraction. -/ +theorem eLpNorm_axisCubeAffine_originCube_neg_nat {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) (n : ℕ) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable + (fun x => f (axisCubeAffine z L x)) + (normalizedCubeMeasure (originCube d (-(n : ℤ))))) : + MeasureTheory.eLpNorm (fun x => f (axisCubeAffine z L x)) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) = + MeasureTheory.eLpNorm f p + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := by + have hftarget := + (aestronglyMeasurable_axisCubeAffine_originCube_neg_nat_iff z hL n f).1 hf + simpa only [Function.comp_apply] using! + MeasureTheory.eLpNorm_comp_measurePreserving hftarget + (measurePreserving_axisCubeAffine_originCube_neg_nat z L n) + +/-- `MemLp` on the fixed centered source supplies the measurability needed for +the exact depth-`n` norm identity. -/ +theorem eLpNorm_axisCubeAffine_originCube_neg_nat_of_memLp {d : ℕ} + (z : Vec d) {L : ℝ} (hL : L ≠ 0) (n : ℕ) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp (fun x => f (axisCubeAffine z L x)) p + (normalizedCubeMeasure (originCube d (-(n : ℤ))))) : + MeasureTheory.eLpNorm (fun x => f (axisCubeAffine z L x)) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) = + MeasureTheory.eLpNorm f p + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := + eLpNorm_axisCubeAffine_originCube_neg_nat z hL n p f hf.aestronglyMeasurable + +/-- The corresponding real-valued normalized `Lᵖ` norms are affine invariant. -/ +theorem eLpNormToReal_axisCubeAffine {d : ℕ} (z : Vec d) (L : ℝ) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] + (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f (axisCubeNormalizedMeasure z L)) : + (MeasureTheory.eLpNorm (fun x => f (axisCubeAffine z L x)) p + (MeasureTheory.volume.restrict (openCubeSet (originCube d 0)))).toReal = + (MeasureTheory.eLpNorm f p (axisCubeNormalizedMeasure z L)).toReal := by + exact congrArg ENNReal.toReal (eLpNorm_axisCubeAffine z L p f hf) + +@[simp] theorem axisCubeHarmonicPullback_grad {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) (u : H1Function (axisCube z L)) (x : Vec d) : + (axisCubeHarmonicPullback z hL u).grad x = + u.grad (axisCubeAffine z L x) := by + simp [axisCubeHarmonicPullback, axisCubeAffine, H1Function.undilateSet, + H1Function.unscale, H1Function.untranslate, hL.ne', add_comm] + +/-- The fixed-depth `MemLp` transport specialized to a pulled-back harmonic +gradient coordinate. -/ +theorem memLp_axisCubeHarmonicPullback_grad_originCube_neg_nat_iff {d : ℕ} + (z : Vec d) {L : ℝ} (hL : 0 < L) (u : H1Function (axisCube z L)) + (n : ℕ) (p : ℝ≥0∞) (i : Fin d) : + MeasureTheory.MemLp + (fun x => (axisCubeHarmonicPullback z hL u).grad x i) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) ↔ + MeasureTheory.MemLp (fun x => u.grad x i) p + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := by + simpa only [axisCubeHarmonicPullback_grad] using + (memLp_axisCubeAffine_originCube_neg_nat_iff z hL.ne' n p + (fun x => u.grad x i)) + +/-- Exact fixed-depth norm transport specialized to a pulled-back harmonic +gradient coordinate. -/ +theorem eLpNorm_axisCubeHarmonicPullback_grad_originCube_neg_nat {d : ℕ} + (z : Vec d) {L : ℝ} (hL : 0 < L) (u : H1Function (axisCube z L)) + (n : ℕ) (p : ℝ≥0∞) (i : Fin d) + (hmem : MeasureTheory.MemLp + (fun x => (axisCubeHarmonicPullback z hL u).grad x i) p + (normalizedCubeMeasure (originCube d (-(n : ℤ))))) : + MeasureTheory.eLpNorm + (fun x => (axisCubeHarmonicPullback z hL u).grad x i) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) = + MeasureTheory.eLpNorm (fun x => u.grad x i) p + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L n) + (axisCubeConcentricDepthSide L n)) := by + have hmem' : MeasureTheory.MemLp + (fun x => u.grad (axisCubeAffine z L x) i) p + (normalizedCubeMeasure (originCube d (-(n : ℤ)))) := by + simpa only [axisCubeHarmonicPullback_grad] using hmem + simpa only [axisCubeHarmonicPullback_grad] using + (eLpNorm_axisCubeAffine_originCube_neg_nat_of_memLp z hL.ne' n p + (fun x => u.grad x i) hmem') + +@[simp] theorem axisCubeHarmonicPullback_toFun {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) (u : H1Function (axisCube z L)) (x : Vec d) : + (axisCubeHarmonicPullback z hL u).toFun x = + L⁻¹ * u.toFun (axisCubeAffine z L x) := by + simp [axisCubeHarmonicPullback, axisCubeAffine, H1Function.undilateSet, + H1Function.unscale, H1Function.untranslate, add_comm] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicGain.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicGain.lean new file mode 100644 index 0000000000..efc1c407e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeHarmonicGain.lean @@ -0,0 +1,144 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientGainIteration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicCovariance + +/-! # Axis Cube Harmonic Gain -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Axis-cube transport of the harmonic gradient gain + +This file consumes the Euclidean harmonic gain on the centered unit triadic +cube and transports it to an arbitrary positive axis cube. The coordinate to +Hilbert-vector comparison is kept here, so callers supply only harmonicity. +-/ + +private theorem harmonicPullback_grad_hilbert_memLp_two {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) (u : H1Function (axisCube z L)) : + MemLp (fun x => HilbertVec.ofVec ((axisCubeHarmonicPullback z hL u).grad x)) 2 + (normalizedCubeMeasure (originCube d 0)) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + (axisCubeHarmonicPullback z hL u).grad_memL2_normalizedCubeMeasure i + +/-- The explicit finite-dimensional loss in the axis-cube transport remains +finite whenever the centered-cube gain constant is finite. -/ +theorem axisCube_harmonicEuclideanGradientGain_coefficient_ne_top + {d : ℕ} {r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) : + G.fixedValue * (d : ℝ≥0∞) ≠ ∞ := + ENNReal.mul_ne_top G.constant_ne_top (ENNReal.natCast_ne_top d) + +/-- The fixed-depth Euclidean harmonic-gradient gain transported to an +arbitrary positive axis cube. The right side is its parent normalized +Hilbert-vector `L²` norm; the extra explicit factor is only the finite +coordinate count. -/ +theorem axisCube_harmonicEuclideanGradientGain + {d : ℕ} {r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (z : Vec d) (L : ℝ) (hL : 0 < L) (u : H1Function (axisCube z L)) + (hu : WeakPoissonEquationOn (axisCube z L) u 0) : + MemLp (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L depth) + (axisCubeConcentricDepthSide L depth)) ∧ + eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L depth) + (axisCubeConcentricDepthSide L depth)) ≤ + (G.fixedValue * (d : ℝ≥0∞)) * + eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) 2 + (axisCubeNormalizedMeasure z L) := by + let v := axisCubeHarmonicPullback z hL u + have hvharm : WeakPoissonEquationOn (openCubeSet (originCube d 0)) v 0 := by + simpa only [v] using axisCubeHarmonicPullback_weakPoisson_zero z hL hu + have hgain_mem : MemLp (fun x => HilbertVec.ofVec (v.grad x)) r.exponent + (normalizedCubeMeasure (centralDescendant (originCube d 0) depth)) := + G.memLp (originCube d 0) v hvharm + have hgain_bound : eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) r.exponent + (normalizedCubeMeasure (centralDescendant (originCube d 0) depth)) ≤ + G.fixedValue * ∑ j : Fin d, eLpNorm (fun x => v.grad x j) 2 + (normalizedCubeMeasure (originCube d 0)) := + G.bound (originCube d 0) v hvharm + rw [centralDescendant_originCube_zero_eq_originCube_neg_nat depth] at hgain_mem hgain_bound + have hsource_mem : MemLp (fun x => HilbertVec.ofVec (u.grad (axisCubeAffine z L x))) + r.exponent (normalizedCubeMeasure (originCube d (-(depth : ℤ)))) := by + simpa only [v, axisCubeHarmonicPullback_grad] using hgain_mem + have htarget_mem : MemLp (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L depth) + (axisCubeConcentricDepthSide L depth)) := + (memLp_axisCubeAffine_originCube_neg_nat_iff z hL.ne' depth r.exponent + (fun x => HilbertVec.ofVec (u.grad x))).mp hsource_mem + refine ⟨htarget_mem, ?_⟩ + have hdepth_transport := eLpNorm_axisCubeAffine_originCube_neg_nat_of_memLp + z hL.ne' depth r.exponent (fun x => HilbertVec.ofVec (u.grad x)) hsource_mem + have hparent_mem := harmonicPullback_grad_hilbert_memLp_two z hL u + have hparent_transport := eLpNorm_axisCubeAffine_originCube_neg_nat_of_memLp + z hL.ne' 0 2 (fun x => HilbertVec.ofVec (u.grad x)) (by + simpa only [axisCubeHarmonicPullback_grad] using! hparent_mem) + have hparent_transport' : + eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) 2 + (normalizedCubeMeasure (originCube d 0)) = + eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) 2 + (axisCubeNormalizedMeasure z L) := by + calc + _ = eLpNorm (fun x => HilbertVec.ofVec (u.grad (axisCubeAffine z L x))) 2 + (normalizedCubeMeasure (originCube d (-(0 : ℤ)))) := by + simp only [v, axisCubeHarmonicPullback_grad, neg_zero] + _ = eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) 2 + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L 0) + (axisCubeConcentricDepthSide L 0)) := hparent_transport + _ = _ := by simp + have hsum_le : + (∑ j : Fin d, eLpNorm (fun x => v.grad x j) 2 + (normalizedCubeMeasure (originCube d 0))) ≤ + (d : ℝ≥0∞) * eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) 2 + (normalizedCubeMeasure (originCube d 0)) := by + calc + _ ≤ ∑ _j : Fin d, eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) 2 + (normalizedCubeMeasure (originCube d 0)) := by + exact Finset.sum_le_sum fun j _ => + coordinate_eLpNorm_le_euclidean (normalizedCubeMeasure (originCube d 0)) + FiniteLpExponent.two v.grad j + _ = _ := by simp [nsmul_eq_mul] + calc + eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (axisCubeNormalizedMeasure (axisCubeConcentricDepthCorner z L depth) + (axisCubeConcentricDepthSide L depth)) = + eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) r.exponent + (normalizedCubeMeasure (originCube d (-(depth : ℤ)))) := by + rw [← hdepth_transport] + simp only [v, axisCubeHarmonicPullback_grad] + _ ≤ G.fixedValue * ∑ j : Fin d, eLpNorm (fun x => v.grad x j) 2 + (normalizedCubeMeasure (originCube d 0)) := hgain_bound + _ ≤ G.fixedValue * ((d : ℝ≥0∞) * eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) 2 + (normalizedCubeMeasure (originCube d 0))) := by gcongr + _ = (G.fixedValue * (d : ℝ≥0∞)) * eLpNorm (fun x => HilbertVec.ofVec (v.grad x)) 2 + (normalizedCubeMeasure (originCube d 0)) := by ring + _ = (G.fixedValue * (d : ℝ≥0∞)) * + eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) 2 + (axisCubeNormalizedMeasure z L) := by + rw [hparent_transport'] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeNormalizedLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeNormalizedLp.lean new file mode 100644 index 0000000000..43651be277 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/AxisCubeNormalizedLp.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingCubeGeometry + +/-! # Axis Cube Normalized Lp -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Normalized finite-`p` norms on axis cubes + +This module records the `ENNReal` bridge from a normalized axis-cube +`eLpNorm` to its powered local integral. The local comparison argument uses +the raw set integral after this bridge; no real-valued `toReal` conversion is +needed here. +-/ + +private theorem finiteLpExponent_exponent_ne_zero (p : FiniteLpExponent) : + p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem finiteLpExponent_exponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (finiteLpExponent_exponent_ne_zero p) p.lt_top.ne + +/-- The `p`th power of a finite `eLpNorm` is its defining norm-power +lintegral. -/ +theorem axisCube_integralLpSeminorm_rpow_exponent_eq_lintegral_enorm + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) (L : ℝ) (p : FiniteLpExponent) (F : Vec d → E) : + (Gagliardo.integralLpSeminorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ∫⁻ x, ‖F x‖ₑ ^ p.exponent.toReal ∂axisCubeNormalizedMeasure z L := by + simp only [Gagliardo.integralLpSeminorm, + if_neg (finiteLpExponent_exponent_ne_zero p), if_neg p.lt_top.ne, + eLpNorm'_eq_lintegral_enorm] + rw [← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + finiteLpExponent_exponent_toReal_pos p |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + +/-- The norm-power integrand has the source-facing `ofReal` spelling. -/ +theorem axisCube_lintegral_enorm_rpow_eq_lintegral_ofReal_norm_rpow + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) (L : ℝ) (p : FiniteLpExponent) (F : Vec d → E) : + (∫⁻ x, ‖F x‖ₑ ^ p.exponent.toReal ∂axisCubeNormalizedMeasure z L) = + ∫⁻ x, ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) + ∂axisCubeNormalizedMeasure z L := by + apply lintegral_congr + intro x + calc + ‖F x‖ₑ ^ p.exponent.toReal = (ENNReal.ofReal ‖F x‖) ^ p.exponent.toReal := by + rw [ofReal_norm] + _ = ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) := + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg (F x)) ENNReal.toReal_nonneg + +/-- The normalized local norm-power integral is exactly the normalized raw +volume integral over a positive axis cube. -/ +theorem axisCube_lintegral_ofReal_norm_rpow_eq_normalized_setLIntegral + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) (F : Vec d → E) : + (∫⁻ x, ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) + ∂axisCubeNormalizedMeasure z L) = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in axisCube z L, ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) + ∂volume := by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict z L hL, + lintegral_smul_measure] + rfl + +/-- The powered normalized finite-`p` norm is the normalized raw local +norm-power integral. -/ +theorem axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_setLIntegral + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) (F : Vec d → E) : + (Gagliardo.integralLpSeminorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in axisCube z L, ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) + ∂volume := by + rw [axisCube_integralLpSeminorm_rpow_exponent_eq_lintegral_enorm, + axisCube_lintegral_enorm_rpow_eq_lintegral_ofReal_norm_rpow, + axisCube_lintegral_ofReal_norm_rpow_eq_normalized_setLIntegral z hL] + +/-- `MemLp` supplies the finiteness required when the powered norm is used in +an `ENNReal` inequality. -/ +theorem axisCube_eLpNorm_rpow_exponent_lt_top + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) (L : ℝ) (p : FiniteLpExponent) (F : Vec d → E) + (hF : MemLp F p.exponent (axisCubeNormalizedMeasure z L)) : + (eLpNorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal < ∞ := + ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hF.eLpNorm_lt_top.ne + +/-- The open axis cube has the expected closed sup-ball realization. -/ +theorem axisCube_ae_eq_closedBall_axisCubeCenter {d : ℕ} [NeZero d] + (z : Vec d) {L : ℝ} (hL : 0 < L) : + axisCube z L =ᵐ[volume] Metric.closedBall (axisCubeCenter z L) (L / 2) := by + have hcorner : stoppingAxisCubeCorner (axisCubeCenter z L) 1 (L / 2) = z := by + ext i + simp only [stoppingAxisCubeCorner, axisCubeCenter] + ring + have hside : stoppingAxisCubeSide 1 (L / 2) = L := by + simp only [stoppingAxisCubeSide] + ring + have hball : + axisCube (stoppingAxisCubeCorner (axisCubeCenter z L) 1 (L / 2)) + (stoppingAxisCubeSide 1 (L / 2)) =ᵐ[volume] + Metric.closedBall (axisCubeCenter z L) (1 * (L / 2)) := + axisCube_stoppingAxisCubeCorner_ae_eq_closedBall (d := d) + (axisCubeCenter z L) (S := 1) (r := L / 2) (by norm_num) (by linarith) + rw [hcorner, hside] at hball + simpa only [one_mul] using hball + +/-- A raw local lintegral is invariant under replacing an axis cube by an +a.e.-equal set, in particular by its closed sup-ball realization. -/ +theorem axisCube_setLIntegral_eq_of_ae_eq + {d : ℕ} (z : Vec d) (L : ℝ) (B : Set (Vec d)) + (hB : axisCube z L =ᵐ[volume] B) (f : Vec d → ℝ≥0∞) : + (∫⁻ x in axisCube z L, f x ∂volume) = ∫⁻ x in B, f x ∂volume := by + rw [Measure.restrict_congr_set hB] + +/-- The powered norm bridge written over the closed sup-ball associated to a +positive axis cube. -/ +theorem axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_closedBallLIntegral + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) (F : Vec d → E) : + (Gagliardo.integralLpSeminorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in Metric.closedBall (axisCubeCenter z L) (L / 2), + ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) ∂volume := by + rw [axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_setLIntegral z hL] + congr 1 + exact axisCube_setLIntegral_eq_of_ae_eq z L _ + (axisCube_ae_eq_closedBall_axisCubeCenter z hL) _ + +/-- The squared normalized `L²` norm is the normalized raw squared-energy +integral on a positive axis cube. -/ +theorem axisCube_integralLpSeminorm_two_sq_eq_normalized_setLIntegral + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (F : Vec d → E) : + (Gagliardo.integralLpSeminorm F 2 (axisCubeNormalizedMeasure z L)) ^ (2 : ℝ) = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in axisCube z L, ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume := by + simpa only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat, Real.rpow_two] using + (axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_setLIntegral z hL + FiniteLpExponent.two F) + +/-- The squared normalized `L²` norm has the same closed-ball integral form. -/ +theorem axisCube_integralLpSeminorm_two_sq_eq_normalized_closedBallLIntegral + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (F : Vec d → E) : + (Gagliardo.integralLpSeminorm F 2 (axisCubeNormalizedMeasure z L)) ^ (2 : ℝ) = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in Metric.closedBall (axisCubeCenter z L) (L / 2), + ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume := by + simpa only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat, Real.rpow_two] using + (axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_closedBallLIntegral z hL + FiniteLpExponent.two F) + +/-- The integral identity expressed using Mathlib’s norm for a measurable function. -/ +theorem axisCube_eLpNorm_rpow_exponent_eq_lintegral_enorm + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) (L : ℝ) (p : FiniteLpExponent) (F : Vec d → E) + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) : + (eLpNorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ∫⁻ x, ‖F x‖ₑ ^ p.exponent.toReal ∂axisCubeNormalizedMeasure z L := by + rw [← Gagliardo.integralLpSeminorm_eq_eLpNorm F p.exponent _ hF] + exact axisCube_integralLpSeminorm_rpow_exponent_eq_lintegral_enorm z L p F + +/-- The integral identity expressed using Mathlib’s norm for a measurable function. -/ +theorem axisCube_eLpNorm_rpow_exponent_eq_normalized_setLIntegral + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) (F : Vec d → E) + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) : + (eLpNorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in axisCube z L, ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) + ∂volume := by + rw [← Gagliardo.integralLpSeminorm_eq_eLpNorm F p.exponent _ hF] + exact axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_setLIntegral z hL p F + +/-- The integral identity expressed using Mathlib’s norm for a measurable function. -/ +theorem axisCube_eLpNorm_rpow_exponent_eq_normalized_closedBallLIntegral + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) (F : Vec d → E) + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) : + (eLpNorm F p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in Metric.closedBall (axisCubeCenter z L) (L / 2), + ENNReal.ofReal (‖F x‖ ^ p.exponent.toReal) ∂volume := by + rw [← Gagliardo.integralLpSeminorm_eq_eLpNorm F p.exponent _ hF] + exact axisCube_integralLpSeminorm_rpow_exponent_eq_normalized_closedBallLIntegral z hL p F + +/-- The integral identity expressed using Mathlib’s norm for a measurable function. -/ +theorem axisCube_eLpNorm_two_sq_eq_normalized_setLIntegral + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (F : Vec d → E) + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) : + (eLpNorm F 2 (axisCubeNormalizedMeasure z L)) ^ (2 : ℝ) = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in axisCube z L, ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume := by + rw [← Gagliardo.integralLpSeminorm_eq_eLpNorm F 2 _ hF] + exact axisCube_integralLpSeminorm_two_sq_eq_normalized_setLIntegral z hL F + +/-- The integral identity expressed using Mathlib’s norm for a measurable function. -/ +theorem axisCube_eLpNorm_two_sq_eq_normalized_closedBallLIntegral + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (F : Vec d → E) + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) : + (eLpNorm F 2 (axisCubeNormalizedMeasure z L)) ^ (2 : ℝ) = + ENNReal.ofReal ((L ^ d)⁻¹) * + ∫⁻ x in Metric.closedBall (axisCubeCenter z L) (L / 2), + ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume := by + rw [← Gagliardo.integralLpSeminorm_eq_eLpNorm F 2 _ hF] + exact axisCube_integralLpSeminorm_two_sq_eq_normalized_closedBallLIntegral z hL F + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ClosedBallNormalizedL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ClosedBallNormalizedL2.lean new file mode 100644 index 0000000000..ccc5e274aa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ClosedBallNormalizedL2.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeNormalizedLp + +/-! # Closed Ball Normalized L2 -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Exact closed-ball / normalized-cube `L²` bridge + +The stopping construction records a real normalized squared energy on closed +sup-metric balls. The local harmonic comparison uses the `ENNReal` `eLpNorm` +on the a.e.-equal open axis cube. This file identifies the two normalizations +without a geometric comparison constant. +-/ + +/-- The squared normalized cube `L²` seminorm is exactly the `ofReal` of the +closed-ball squared energy at the corresponding stopping scale. -/ +theorem stoppingAxisCube_eLpNorm_two_sq_eq_ofReal_closedBallL2Energy + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (x : Vec d) {S r : ℝ} (hS : 0 < S) (hr : 0 < r) (F : Vec d → E) + (hF : MemLp F 2 (volume.restrict (Metric.closedBall x (S * r)))) : + (eLpNorm F 2 + (axisCubeNormalizedMeasure (stoppingAxisCubeCorner x S r) + (stoppingAxisCubeSide S r))) ^ (2 : ℝ) = + ENNReal.ofReal (closedBallL2Energy F x (S * r)) := by + have hSr : 0 < S * r := mul_pos hS hr + have hside : 0 < stoppingAxisCubeSide S r := by + simp only [stoppingAxisCubeSide] + positivity + have hcenter : + axisCubeCenter (stoppingAxisCubeCorner x S r) (stoppingAxisCubeSide S r) = x := by + ext i + simp only [axisCubeCenter, stoppingAxisCubeCorner, stoppingAxisCubeSide] + ring + have hhalf : stoppingAxisCubeSide S r / 2 = S * r := by + simp only [stoppingAxisCubeSide] + ring + have hpow := axisCube_eLpNorm_two_sq_eq_normalized_closedBallLIntegral + (z := stoppingAxisCubeCorner x S r) hside F + rw [hcenter, hhalf] at hpow + have hint : IntegrableOn (fun y : Vec d => ‖F y‖ ^ (2 : ℕ)) + (Metric.closedBall x (S * r)) volume := by + exact hF.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + have henergy : + ENNReal.ofReal (closedBallL2Energy F x (S * r)) = + ENNReal.ofReal ((stoppingAxisCubeSide S r) ^ d)⁻¹ * + ∫⁻ y in Metric.closedBall x (S * r), ENNReal.ofReal (‖F y‖ ^ (2 : ℕ)) + ∂volume := by + rw [closedBallL2Energy, closedBallAverage_eq_setAverage x hSr.le] + rw [MeasureTheory.ofReal_setAverage hint (ae_of_all _ fun y => sq_nonneg (‖F y‖))] + rw [Real.volume_pi_closedBall x hSr.le, ENNReal.div_eq_inv_mul] + congr 1 + simp only [stoppingAxisCubeSide] + rw [show (2 * S * r) ^ d = (2 * (S * r)) ^ d by ring] + rw [← ENNReal.ofReal_inv_of_pos] + · simp only [Fintype.card_fin] + · positivity + exact hpow.trans henergy.symm + +/-- The normalized cube `L²` seminorm is exactly the square root of the +closed-ball squared energy at the corresponding stopping scale. -/ +theorem stoppingAxisCube_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (x : Vec d) {S r : ℝ} (hS : 0 < S) (hr : 0 < r) (F : Vec d → E) + (hF : MemLp F 2 (volume.restrict (Metric.closedBall x (S * r)))) : + eLpNorm F 2 + (axisCubeNormalizedMeasure (stoppingAxisCubeCorner x S r) + (stoppingAxisCubeSide S r)) = + ENNReal.ofReal (Real.sqrt (closedBallL2Energy F x (S * r))) := by + have henergy_nonneg : 0 ≤ closedBallL2Energy F x (S * r) := by + rw [closedBallL2Energy, closedBallAverage_eq_setAverage x (mul_pos hS hr).le] + exact MeasureTheory.integral_nonneg fun y => sq_nonneg (‖F y‖) + have hsq := stoppingAxisCube_eLpNorm_two_sq_eq_ofReal_closedBallL2Energy + x hS hr F hF + apply le_antisymm + · rw [← ENNReal.rpow_le_rpow_iff (by norm_num : (0 : ℝ) < 2), hsq] + rw [ENNReal.ofReal_rpow_of_nonneg (Real.sqrt_nonneg _) + (by norm_num : (0 : ℝ) ≤ 2), Real.rpow_two, Real.sq_sqrt henergy_nonneg] + · rw [← ENNReal.rpow_le_rpow_iff (by norm_num : (0 : ℝ) < 2), hsq] + rw [ENNReal.ofReal_rpow_of_nonneg (Real.sqrt_nonneg _) + (by norm_num : (0 : ℝ) ≤ 2), Real.rpow_two, Real.sq_sqrt henergy_nonneg] + +/-- The global `L²` assumption supplies the local integrability needed by the +exact stopping-cube energy bridge. -/ +theorem stoppingAxisCube_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy_of_memLp + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (x : Vec d) {S r : ℝ} (hS : 0 < S) (hr : 0 < r) (F : Vec d → E) + (hF : MemLp F 2 volume) : + eLpNorm F 2 + (axisCubeNormalizedMeasure (stoppingAxisCubeCorner x S r) + (stoppingAxisCubeSide S r)) = + ENNReal.ofReal (Real.sqrt (closedBallL2Energy F x (S * r))) := + stoppingAxisCube_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy x hS hr F + (hF.restrict _) + +/-- The exact `L²` bridge at the harmonic comparison parent. -/ +theorem stoppingComparisonParent_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (x : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) (F : Vec d → E) + (hF : MemLp F 2 + (volume.restrict (Metric.closedBall x (stoppingComparisonParentMultiplier n * r)))) : + eLpNorm F 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n)) = + ENNReal.ofReal + (Real.sqrt (closedBallL2Energy F x (stoppingComparisonParentMultiplier n * r))) := by + exact stoppingAxisCube_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy x + (by + simp only [stoppingComparisonParentMultiplier] + positivity) + hr F hF + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/CubeTranslationFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/CubeTranslationFiniteP.lean new file mode 100644 index 0000000000..575d684fb8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/CubeTranslationFiniteP.lean @@ -0,0 +1,417 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport + +/-! # Cube Translation Finite P -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +variable {d : ℕ} + +/-! +# Finite-exponent translation on triadic cubes + +This file packages the exact translation from an arbitrary triadic cube to the +centered cube of the same scale. Both directions use `normalizedCubeMeasure`; +in particular, no unnormalized-volume factor enters the transport. +-/ + +/-- Pull a field on `Q` back to the centered cube of the same scale. -/ +def pullbackToOrigin {E : Type*} (Q : TriadicCube d) (F : Vec d → E) : Vec d → E := + fun x ↦ F (x + triadicCubeShift Q) + +/-- Push a field on the centered cube to `Q`. -/ +def pushforwardFromOrigin {E : Type*} (Q : TriadicCube d) (F : Vec d → E) : Vec d → E := + fun x ↦ F (x - triadicCubeShift Q) + +@[simp] theorem pushforwardFromOrigin_pullbackToOrigin {E : Type*} + (Q : TriadicCube d) (F : Vec d → E) : + pushforwardFromOrigin Q (pullbackToOrigin Q F) = F := by + funext x + simp [pushforwardFromOrigin, pullbackToOrigin, sub_eq_add_neg, add_assoc] + +@[simp] theorem pullbackToOrigin_pushforwardFromOrigin {E : Type*} + (Q : TriadicCube d) (F : Vec d → E) : + pullbackToOrigin Q (pushforwardFromOrigin Q F) = F := by + funext x + simp [pushforwardFromOrigin, pullbackToOrigin, sub_eq_add_neg, add_assoc] + +/-- Subtracting the cube shift preserves the normalized cube measure in the +reverse direction. -/ +theorem measurePreserving_subRight_normalizedCubeMeasure_originCube + (Q : TriadicCube d) : + MeasurePreserving (fun x : Vec d ↦ x - triadicCubeShift Q) + (normalizedCubeMeasure Q) + (normalizedCubeMeasure (originCube d Q.scale)) := by + let e : Vec d ≃ᵐ Vec d := MeasurableEquiv.addRight (triadicCubeShift Q) + have he : MeasurePreserving e + (normalizedCubeMeasure (originCube d Q.scale)) + (normalizedCubeMeasure Q) := by + simpa [e] using measurePreserving_addRight_normalizedCubeMeasure_originCube Q + simpa [e, sub_eq_add_neg] using MeasurePreserving.symm e he + +/-- `MemLp` is preserved when a field is pulled back to the centered cube. -/ +theorem memLp_pullbackToOrigin {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) {p : ℝ≥0∞} {F : Vec d → E} + (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) := by + simpa [pullbackToOrigin] using! + hF.comp_measurePreserving + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q) + +/-- `MemLp` is preserved when a centered field is pushed forward to `Q`. -/ +theorem memLp_pushforwardFromOrigin {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) {p : ℝ≥0∞} {F : Vec d → E} + (hF : MemLp F p (normalizedCubeMeasure (originCube d Q.scale))) : + MemLp (pushforwardFromOrigin Q F) p (normalizedCubeMeasure Q) := by + simpa [pushforwardFromOrigin] using! + hF.comp_measurePreserving + (measurePreserving_subRight_normalizedCubeMeasure_originCube Q) + +/-- Pullback preserves the extended normalized `Lᵖ` norm. -/ +theorem eLpNorm_pullbackToOrigin_eq {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) {F : Vec d → E} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + eLpNorm (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) = + eLpNorm F p (normalizedCubeMeasure Q) := by + simpa [pullbackToOrigin, Function.comp_def] using! + (eLpNorm_comp_measurePreserving + (g := F) (p := p) hF + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q)) + +/-- Pushforward preserves the extended normalized `Lᵖ` norm. -/ +theorem eLpNorm_pushforwardFromOrigin_eq {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) {F : Vec d → E} + (hF : AEStronglyMeasurable F + (normalizedCubeMeasure (originCube d Q.scale))) : + eLpNorm (pushforwardFromOrigin Q F) p (normalizedCubeMeasure Q) = + eLpNorm F p (normalizedCubeMeasure (originCube d Q.scale)) := by + simpa [pushforwardFromOrigin, Function.comp_def] using! + (eLpNorm_comp_measurePreserving + (g := F) (p := p) hF + (measurePreserving_subRight_normalizedCubeMeasure_originCube Q)) + +/-- Pullback preserves the real normalized cube `Lᵖ` norm. -/ +theorem cubeLpNorm_pullbackToOrigin_eq {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) {F : Vec d → E} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + cubeLpNorm (originCube d Q.scale) p (pullbackToOrigin Q F) = + cubeLpNorm Q p F := by + have htrans : AEStronglyMeasurable (pullbackToOrigin Q F) + (normalizedCubeMeasure (originCube d Q.scale)) := by + simpa only [pullbackToOrigin, Function.comp_def] using + hF.comp_measurePreserving + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q) + rw [cubeLpNorm_eq_eLpNorm_toReal _ _ _ htrans, + cubeLpNorm_eq_eLpNorm_toReal _ _ _ hF] + exact congrArg ENNReal.toReal (eLpNorm_pullbackToOrigin_eq Q p hF) + +/-- Pushforward preserves the real normalized cube `Lᵖ` norm. -/ +theorem cubeLpNorm_pushforwardFromOrigin_eq {E : Type*} [NormedAddCommGroup E] + (Q : TriadicCube d) (p : ℝ≥0∞) {F : Vec d → E} + (hF : AEStronglyMeasurable F + (normalizedCubeMeasure (originCube d Q.scale))) : + cubeLpNorm Q p (pushforwardFromOrigin Q F) = + cubeLpNorm (originCube d Q.scale) p F := by + have htrans : AEStronglyMeasurable (pushforwardFromOrigin Q F) + (normalizedCubeMeasure Q) := by + simpa only [pushforwardFromOrigin, Function.comp_def] using + hF.comp_measurePreserving + (measurePreserving_subRight_normalizedCubeMeasure_originCube Q) + rw [cubeLpNorm_eq_eLpNorm_toReal _ _ _ htrans, + cubeLpNorm_eq_eLpNorm_toReal _ _ _ hF] + exact congrArg ENNReal.toReal (eLpNorm_pushforwardFromOrigin_eq Q p hF) + +/-- Raw vector fields retain `MemLp` under pullback. -/ +theorem memLp_vec_pullbackToOrigin (Q : TriadicCube d) {p : ℝ≥0∞} + {F : Vec d → Vec d} (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) := + memLp_pullbackToOrigin Q hF + +/-- Hilbert-realized vector fields retain `MemLp` under pullback. -/ +theorem memLp_hilbertVec_pullbackToOrigin (Q : TriadicCube d) {p : ℝ≥0∞} + {F : Vec d → HilbertVec d} + (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) := + memLp_pullbackToOrigin Q hF + +/-- Raw vector fields retain their extended normalized norm under pullback. -/ +theorem eLpNorm_vec_pullbackToOrigin_eq (Q : TriadicCube d) (p : ℝ≥0∞) + {F : Vec d → Vec d} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + eLpNorm (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) = + eLpNorm F p (normalizedCubeMeasure Q) := + eLpNorm_pullbackToOrigin_eq Q p hF + +/-- Hilbert-realized vector fields retain their extended normalized norm under +pullback. -/ +theorem eLpNorm_hilbertVec_pullbackToOrigin_eq (Q : TriadicCube d) (p : ℝ≥0∞) + {F : Vec d → HilbertVec d} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + eLpNorm (pullbackToOrigin Q F) p + (normalizedCubeMeasure (originCube d Q.scale)) = + eLpNorm F p (normalizedCubeMeasure Q) := + eLpNorm_pullbackToOrigin_eq Q p hF + +/-- Raw vector fields retain their real normalized cube norm under pullback. -/ +theorem cubeLpNorm_vec_pullbackToOrigin_eq (Q : TriadicCube d) (p : ℝ≥0∞) + {F : Vec d → Vec d} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + cubeLpNorm (originCube d Q.scale) p (pullbackToOrigin Q F) = + cubeLpNorm Q p F := + cubeLpNorm_pullbackToOrigin_eq Q p hF + +/-- Hilbert-realized vector fields retain their real normalized cube norm under +pullback. -/ +theorem cubeLpNorm_hilbertVec_pullbackToOrigin_eq + (Q : TriadicCube d) (p : ℝ≥0∞) {F : Vec d → HilbertVec d} + (hF : AEStronglyMeasurable F (normalizedCubeMeasure Q)) : + cubeLpNorm (originCube d Q.scale) p (pullbackToOrigin Q F) = + cubeLpNorm Q p F := + cubeLpNorm_pullbackToOrigin_eq Q p hF + +/-- Pull an arbitrary-cube zero-trace function back to the centered cube. -/ +noncomputable def untranslateH10ToOrigin (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) : + H10Function (openCubeSet (originCube d Q.scale)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uT : H10Function (translateSet z U₀) := + { toH1Function := + { toFun := u.toH1Function.toFun + grad := u.toH1Function.grad + memL2 := by simpa [← hU] using u.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [← hU] using u.toH1Function.gradMemL2 i + hasWeakGradient := by simpa [← hU] using u.toH1Function.hasWeakGradient } + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := by + intro n + simpa [← hU] using u.approx_support_subset n + tendsto_approx := by simpa [← hU] using u.tendsto_approx + tendsto_approx_grad := by + intro i + simpa [← hU] using u.tendsto_approx_grad i } + exact H10Function.untranslate z uT + +@[simp] theorem untranslateH10ToOrigin_toFun (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (x : Vec d) : + (untranslateH10ToOrigin Q u).toH1Function.toFun x = + u.toH1Function.toFun (x + triadicCubeShift Q) := by + simp [untranslateH10ToOrigin, H10Function.untranslate, H1Function.untranslate] + +@[simp] theorem untranslateH10ToOrigin_grad (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (x : Vec d) : + (untranslateH10ToOrigin Q u).toH1Function.grad x = + u.toH1Function.grad (x + triadicCubeShift Q) := by + simp [untranslateH10ToOrigin, H10Function.untranslate, H1Function.untranslate] + +/-- Pushing the centered pullback gradient forward recovers the original +arbitrary-cube gradient exactly. -/ +@[simp] theorem pushforwardFromOrigin_untranslateH10ToOrigin_grad + (Q : TriadicCube d) (u : H10Function (openCubeSet Q)) : + pushforwardFromOrigin Q (untranslateH10ToOrigin Q u).toH1Function.grad = + u.toH1Function.grad := by + funext x + simp [pushforwardFromOrigin, sub_eq_add_neg, add_assoc] + +/-- Pull an arbitrary-cube mean-zero function back to the centered cube. -/ +noncomputable def untranslateH1MeanZeroToOrigin (Q : TriadicCube d) + (u : H1MeanZeroFunction (openCubeSet Q)) : + H1MeanZeroFunction (openCubeSet (originCube d Q.scale)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uT : H1MeanZeroFunction (translateSet z U₀) := + { toH1Function := + { toFun := u.toH1Function.toFun + grad := u.toH1Function.grad + memL2 := by simpa [← hU] using u.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [← hU] using u.toH1Function.gradMemL2 i + hasWeakGradient := by simpa [← hU] using u.toH1Function.hasWeakGradient } + meanZero := by simpa [MeanZeroOn, ← hU] using u.meanZero } + exact H1MeanZeroFunction.untranslate z uT + +@[simp] theorem untranslateH1MeanZeroToOrigin_toFun (Q : TriadicCube d) + (u : H1MeanZeroFunction (openCubeSet Q)) (x : Vec d) : + (untranslateH1MeanZeroToOrigin Q u).toH1Function.toFun x = + u.toH1Function.toFun (x + triadicCubeShift Q) := by + simp [untranslateH1MeanZeroToOrigin, H1MeanZeroFunction.untranslate, + H1Function.untranslate] + +@[simp] theorem untranslateH1MeanZeroToOrigin_grad (Q : TriadicCube d) + (u : H1MeanZeroFunction (openCubeSet Q)) (x : Vec d) : + (untranslateH1MeanZeroToOrigin Q u).toH1Function.grad x = + u.toH1Function.grad (x + triadicCubeShift Q) := by + simp [untranslateH1MeanZeroToOrigin, H1MeanZeroFunction.untranslate, + H1Function.untranslate] + +/-- Pushing the centered mean-zero pullback gradient forward recovers the +original arbitrary-cube gradient exactly. -/ +@[simp] theorem pushforwardFromOrigin_untranslateH1MeanZeroToOrigin_grad + (Q : TriadicCube d) (u : H1MeanZeroFunction (openCubeSet Q)) : + pushforwardFromOrigin Q + (untranslateH1MeanZeroToOrigin Q u).toH1Function.grad = + u.toH1Function.grad := by + funext x + simp [pushforwardFromOrigin, sub_eq_add_neg, add_assoc] + +/-- Pull the constant-coefficient Dirichlet divergence equation with datum +`-F` from an arbitrary cube to the centered cube of the same scale. -/ +theorem isZeroTraceDirichletRhsWeakSolution_untranslateH10ToOrigin + (Q : TriadicCube d) (A : Mat d) {u : H10Function (openCubeSet Q)} + {F : Vec d → Vec d} + (hu : IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d ↦ A) (openCubeSet Q) u (fun x ↦ -F x)) : + IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d ↦ A) + (openCubeSet (originCube d Q.scale)) (untranslateH10ToOrigin Q u) + (fun x ↦ -(pullbackToOrigin Q F x)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + intro φ + let φT : H10Function (translateSet z U₀) := φ.translate z + let φQ : H10Function (openCubeSet Q) := + { toH1Function := + { toFun := φT.toH1Function.toFun + grad := φT.toH1Function.grad + memL2 := by simpa [hU] using φT.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [hU] using φT.toH1Function.gradMemL2 i + hasWeakGradient := by simpa [hU] using φT.toH1Function.hasWeakGradient } + approx := φT.approx + approx_smooth := φT.approx_smooth + approx_hasCompactSupport := φT.approx_hasCompactSupport + approx_support_subset := by + intro n + simpa [hU] using φT.approx_support_subset n + tendsto_approx := by simpa [hU] using φT.tendsto_approx + tendsto_approx_grad := by + intro i + simpa [hU] using φT.tendsto_approx_grad i } + have hEq := hu φQ + have hleft := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x ↦ vecDot (matVecMul A (u.toH1Function.grad x)) + (φT.toH1Function.grad x)) + have hright := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x ↦ vecDot (-F x) (φT.toH1Function.grad x)) + calc + ∫ x in openCubeSet Q₀, + vecDot (matVecMul A + ((untranslateH10ToOrigin Q u).toH1Function.grad x)) + (φ.toH1Function.grad x) ∂volume + = ∫ x in translateSet z U₀, + vecDot (matVecMul A (u.toH1Function.grad x)) + (φT.toH1Function.grad x) ∂volume := by + simpa [Q₀, U₀, z, φT, H10Function.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using hleft + _ = ∫ x in translateSet z U₀, vecDot (-F x) (φT.toH1Function.grad x) + ∂volume := by simpa [φQ, hU] using hEq + _ = ∫ x in U₀, vecDot (-F (x + z)) (φ.toH1Function.grad x) ∂volume := by + symm + simpa [φT, H10Function.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using hright + _ = ∫ x in openCubeSet Q₀, + vecDot (-(pullbackToOrigin Q F x)) (φ.toH1Function.grad x) ∂volume := by + simp [Q₀, U₀, z, pullbackToOrigin] + +/-- Pull the constant-coefficient Neumann divergence equation with datum `-F` +from an arbitrary cube to the centered cube of the same scale. -/ +theorem isMeanZeroNeumannRhsWeakSolution_untranslateH1MeanZeroToOrigin + (Q : TriadicCube d) (A : Mat d) + {u : H1MeanZeroFunction (openCubeSet Q)} {F : Vec d → Vec d} + (hu : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ A) (openCubeSet Q) u (fun x ↦ -F x)) : + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ A) + (openCubeSet (originCube d Q.scale)) (untranslateH1MeanZeroToOrigin Q u) + (fun x ↦ -(pullbackToOrigin Q F x)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + intro φ + let φT : H1MeanZeroFunction (translateSet z U₀) := φ.translate z + let φQ : H1MeanZeroFunction (openCubeSet Q) := + { toH1Function := + { toFun := φT.toH1Function.toFun + grad := φT.toH1Function.grad + memL2 := by simpa [hU] using φT.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [hU] using φT.toH1Function.gradMemL2 i + hasWeakGradient := by simpa [hU] using φT.toH1Function.hasWeakGradient } + meanZero := by simpa [MeanZeroOn, hU] using φT.meanZero } + have hEq := hu φQ + have hleft := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x ↦ vecDot (matVecMul A (u.toH1Function.grad x)) + (φT.toH1Function.grad x)) + have hright := + setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x ↦ vecDot (-F x) (φT.toH1Function.grad x)) + calc + ∫ x in openCubeSet Q₀, + vecDot (matVecMul A + ((untranslateH1MeanZeroToOrigin Q u).toH1Function.grad x)) + (φ.toH1Function.grad x) ∂volume + = ∫ x in translateSet z U₀, + vecDot (matVecMul A (u.toH1Function.grad x)) + (φT.toH1Function.grad x) ∂volume := by + simpa [Q₀, U₀, z, φT, H1MeanZeroFunction.translate, + H1Function.translate, sub_eq_add_neg, add_assoc] using hleft + _ = ∫ x in translateSet z U₀, vecDot (-F x) (φT.toH1Function.grad x) + ∂volume := by simpa [φQ, hU] using hEq + _ = ∫ x in U₀, vecDot (-F (x + z)) (φ.toH1Function.grad x) ∂volume := by + symm + simpa [φT, H1MeanZeroFunction.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using hright + _ = ∫ x in openCubeSet Q₀, + vecDot (-(pullbackToOrigin Q F x)) (φ.toH1Function.grad x) ∂volume := by + simp [Q₀, U₀, z, pullbackToOrigin] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletEndpoint.lean new file mode 100644 index 0000000000..6f82a4ea5c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletEndpoint.lean @@ -0,0 +1,222 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.CubeTranslationFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLpData + +/-! +# Arbitrary-cube Dirichlet Calderón--Zygmund endpoint + +This file translates the centered finite-exponent estimate to an arbitrary +triadic cube and exposes it on the project's raw `Vec` norm. The datum needs +only the stated finite-`Lᵖ` membership; no auxiliary `L²` premise is exported. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem matVecMul_one_dirichletEndpoint {d : ℕ} (x : Vec d) : + matVecMul (1 : Mat d) x = x := by + funext i + simp [matVecMul, Matrix.one_apply, Finset.sum_ite_eq] + +private theorem memLp_hilbertify_of_memLp_vec + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) := by + simpa only [Function.comp_apply, HilbertVec.ofVecL_apply] using! + (HilbertVec.ofVecL d).comp_memLp' hF + +private theorem memLp_vec_of_memLp_hilbertify + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemLp (fun x ↦ HilbertVec.ofVec (F x)) p + (normalizedCubeMeasure Q)) : + MemLp F p (normalizedCubeMeasure Q) := by + simpa only [Function.comp_apply, HilbertVec.continuousLinearEquivVec_apply, + HilbertVec.toVec_ofVec] using! + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap.comp_memLp' hF + +private theorem eLpNorm_vec_le_hilbertify + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} (F : Vec d → Vec d) : + eLpNorm F p (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) := by + apply eLpNorm_mono_ae + filter_upwards [] with x + exact HilbertVec.norm_le_norm_ofVec (F x) + +private theorem eLpNorm_hilbertify_le_dimension_mul_vec + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} (F : Vec d → Vec d) : + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal (d : ℝ) * eLpNorm F p (normalizedCubeMeasure Q) := by + calc + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x ↦ (d : ℝ) • F x) p (normalizedCubeMeasure Q) := by + apply eLpNorm_mono_ae + filter_upwards [] with x + simpa only [norm_smul, Real.norm_natCast] using + HilbertVec.norm_ofVec_le_mul_norm (F x) + _ = ENNReal.ofReal (d : ℝ) * + eLpNorm F p (normalizedCubeMeasure Q) := by + rw [show (fun x ↦ (d : ℝ) • F x) = (d : ℝ) • F by rfl, + eLpNorm_const_smul] + rw [Real.enorm_eq_ofReal] + norm_num + +private theorem centeredCubeDirichletDivergence_eLpNorm_le + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (f : Vec d → Vec d), + MemLp f q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet (originCube d m)) u + (fun x ↦ -f x) → + MemLp u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + (C * ENNReal.ofReal (d : ℝ)) * eLpNorm f q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz_lpData d q + refine ⟨C, hCtop, ?_⟩ + intro m f hf u hu + let h : CubeEuclideanLpField (originCube d m) q := + { toField := f + euclideanMemLp := memLp_hilbertify_of_memLp_vec hf } + have hweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + (1 : ℝ) * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume := by + intro psi + have hraw := hu psi + simp_rw [matVecMul_one_dirichletEndpoint] at hraw + simpa only [h, one_mul, vecDot_neg_left, integral_neg] using hraw + have hEuclidean := hC m 1 h u (by norm_num) hweak + have hHilbert : + eLpNorm (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, + centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm, h, ENNReal.ofReal_one, + inv_one, mul_one] using hEuclidean + have hGradHilbert : + MemLp (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + refine ⟨?_, ?_⟩ + · have hrawTwo : MemLp u.toH1Function.grad 2 + (normalizedCubeMeasure (originCube d m)) := by + unfold normalizedCubeMeasure cubeMeasure + rw [volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact u.toH1Function.grad_memVectorL2.smul_measure ENNReal.ofReal_ne_top + exact (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable + hrawTwo.aestronglyMeasurable + · apply lt_of_le_of_lt hHilbert + exact ENNReal.mul_lt_top hCtop + (memLp_hilbertify_of_memLp_vec hf).eLpNorm_lt_top + refine ⟨memLp_vec_of_memLp_hilbertify hGradHilbert, ?_⟩ + calc + eLpNorm u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + eLpNorm (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := + eLpNorm_vec_le_hilbertify _ + _ ≤ C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := hHilbert + _ ≤ (C * ENNReal.ofReal (d : ℝ)) * + eLpNorm f q.exponent (normalizedCubeMeasure (originCube d m)) := by + calc + C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * (ENNReal.ofReal (d : ℝ) * + eLpNorm f q.exponent + (normalizedCubeMeasure (originCube d m))) := by + gcongr + exact eLpNorm_hilbertify_le_dimension_mul_vec f + _ = _ := by ac_rfl + +/-- The raw-vector Dirichlet Calderón--Zygmund estimate on arbitrary triadic +cubes. The real constant depends only on the dimension and exponent. -/ +theorem exists_cubeDirichletDivergence_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ, 0 < C ∧ ∀ (Q : TriadicCube d) (f : Vec d → Vec d), + MemLp f q.exponent (normalizedCubeMeasure Q) → + ∀ u : H10Function (openCubeSet Q), + IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet Q) u (fun x ↦ -f x) → + MemLp u.toH1Function.grad q.exponent (normalizedCubeMeasure Q) ∧ + cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + C * cubeLpNorm Q q.exponent f := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeDirichletDivergence_eLpNorm_le d q + let Cₙ : ℝ := max 1 ((C * ENNReal.ofReal (d : ℝ)).toReal) + refine ⟨Cₙ, lt_of_lt_of_le zero_lt_one (le_max_left _ _), ?_⟩ + intro Q f hf u hu + let f₀ : Vec d → Vec d := pullbackToOrigin Q f + let u₀ : H10Function (openCubeSet (originCube d Q.scale)) := + untranslateH10ToOrigin Q u + have hf₀ : MemLp f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale)) := + memLp_pullbackToOrigin Q hf + have hu₀ : IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet (originCube d Q.scale)) u₀ + (fun x ↦ -f₀ x) := by + simpa only [u₀, f₀] using + isZeroTraceDirichletRhsWeakSolution_untranslateH10ToOrigin Q (1 : Mat d) hu + obtain ⟨hgrad₀, hbound₀⟩ := hC Q.scale f₀ hf₀ u₀ hu₀ + have hgrad : MemLp u.toH1Function.grad q.exponent + (normalizedCubeMeasure Q) := by + rw [← pushforwardFromOrigin_untranslateH10ToOrigin_grad Q u] + exact memLp_pushforwardFromOrigin Q hgrad₀ + refine ⟨hgrad, ?_⟩ + have hgradNorm : cubeLpNorm Q q.exponent u.toH1Function.grad = + (eLpNorm u₀.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [← pushforwardFromOrigin_untranslateH10ToOrigin_grad Q u, + cubeLpNorm_pushforwardFromOrigin_eq Q q.exponent hgrad₀.aestronglyMeasurable] + rfl + have hfNorm : cubeLpNorm Q q.exponent f = + (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [← cubeLpNorm_pullbackToOrigin_eq Q q.exponent hf.aestronglyMeasurable] + rfl + rw [hgradNorm, hfNorm] + calc + (eLpNorm u₀.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal ≤ + ((C * ENNReal.ofReal (d : ℝ)) * + eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := + ENNReal.toReal_mono + (ENNReal.mul_ne_top + (ENNReal.mul_ne_top hCtop.ne ENNReal.ofReal_ne_top) + hf₀.eLpNorm_ne_top) hbound₀ + _ = (C * ENNReal.ofReal (d : ℝ)).toReal * + (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [ENNReal.toReal_mul] + _ ≤ Cₙ * (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + exact mul_le_mul_of_nonneg_right (le_max_right _ _) + ENNReal.toReal_nonneg + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletNeumannEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletNeumannEndpoint.lean new file mode 100644 index 0000000000..88b6794e3d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/DirichletNeumannEndpoint.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.DirichletEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.NeumannEndpoint + +/-! +# Dirichlet and Neumann Calderón--Zygmund endpoint + +This file combines the arbitrary-cube Dirichlet and mean-zero Neumann +estimates under one positive real constant. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +/-- The Dirichlet and mean-zero Neumann divergence-form Calderón--Zygmund +estimates on arbitrary triadic cubes, with one constant depending only on the +dimension and finite exponent. -/ +theorem exists_cubeDirichletNeumannDivergence_cz + {d : ℕ} (dimension : 2 ≤ d) + (p : ℝ≥0∞) (one_lt_p : 1 < p) (p_lt_top : p < ∞) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube d) (f : Vec d → Vec d), + MemLp f p (normalizedCubeMeasure Q) → + (∀ u : H10Function (openCubeSet Q), + IsZeroTraceDirichletRhsWeakSolution + (fun _ : Vec d => (1 : Matrix (Fin d) (Fin d) ℝ)) + (openCubeSet Q) u (fun x => -f x) → + MemLp u.toH1Function.grad p (normalizedCubeMeasure Q) ∧ + cubeLpNorm Q p u.toH1Function.grad ≤ C * cubeLpNorm Q p f) ∧ + (∀ u : H1MeanZeroFunction (openCubeSet Q), + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d => (1 : Matrix (Fin d) (Fin d) ℝ)) + (openCubeSet Q) u (fun x => -f x) → + MemLp u.toH1Function.grad p (normalizedCubeMeasure Q) ∧ + cubeLpNorm Q p u.toH1Function.grad ≤ C * cubeLpNorm Q p f) := by + let : NeZero d := ⟨by omega⟩ + let q : FiniteLpExponent := + { exponent := p + one_lt := one_lt_p + lt_top := p_lt_top } + obtain ⟨CD, hCDpos, hD⟩ := exists_cubeDirichletDivergence_cz d q + obtain ⟨CN, hCNpos, hN⟩ := exists_cubeH1MeanZeroNeumannDivergence_cz d q + let C : ℝ := max CD CN + refine ⟨C, lt_of_lt_of_le hCDpos (le_max_left CD CN), ?_⟩ + intro Q f hf + have hfq : MemLp f q.exponent (normalizedCubeMeasure Q) := by + simpa only [q] using hf + constructor + · intro u hu + obtain ⟨hgrad, hbound⟩ := hD Q f hfq u hu + refine ⟨by simpa only [q] using hgrad, ?_⟩ + have henlarge : cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + C * cubeLpNorm Q q.exponent f := by + calc + cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + CD * cubeLpNorm Q q.exponent f := hbound + _ ≤ C * cubeLpNorm Q q.exponent f := + mul_le_mul_of_nonneg_right (le_max_left CD CN) + (cubeLpNorm_nonneg Q q.exponent f) + simpa only [q] using henlarge + · intro u hu + obtain ⟨hgrad, hbound⟩ := hN Q f hfq u hu + refine ⟨by simpa only [q] using hgrad, ?_⟩ + have henlarge : cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + C * cubeLpNorm Q q.exponent f := by + calc + cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + CN * cubeLpNorm Q q.exponent f := hbound + _ ≤ C * cubeLpNorm Q q.exponent f := + mul_le_mul_of_nonneg_right (le_max_right CD CN) + (cubeLpNorm_nonneg Q q.exponent f) + simpa only [q] using henlarge + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLp.lean new file mode 100644 index 0000000000..96a62fa307 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLp.lean @@ -0,0 +1,1334 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaIntegration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaParameters +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.SmoothCompactSupport + +/-! +# Finite-exponent cube Calderón--Zygmund interface + +The source-facing finite-`L^p` carriers and weak solution predicates for the +constant-coefficient cube Calderón--Zygmund argument. The one-level +good-`λ` input remains internal to this module while the source-facing +declarations below keep the manuscript's supplied-solution interfaces exact. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +structure CubeEuclideanL2LpField {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) extends CubeEuclideanLpField Q p where + euclideanMemL2 : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (toField x)) 2 + (normalizedCubeMeasure Q) + +structure CubeEuclideanWspL2Field {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) + extends CubeEuclideanWspField Q s p where + euclideanMemL2 : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (toField x)) 2 + (normalizedCubeMeasure Q) + +noncomputable def CubeEuclideanL2LpField.toLpTwo {d : ℕ} + {Q : TriadicCube d} {p : FiniteLpExponent} + (F : CubeEuclideanL2LpField Q p) : + CubeEuclideanLpField Q FiniteLpExponent.two := + ⟨F.toField, F.euclideanMemL2⟩ + +noncomputable def CubeEuclideanWspL2Field.toLpTwo {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspL2Field Q s p) : + CubeEuclideanLpField Q FiniteLpExponent.two := + ⟨F.toField, F.euclideanMemL2⟩ + +def IsCenteredCubeW10pScalarDivergenceSolution {d : ℕ} + {q : FiniteLpExponent} (m : ℤ) (sigma0 : ℝ) + (w : W10pFunction (openCubeSet (originCube d m)) q.exponent) + (h : CubeEuclideanLpField (originCube d m) q) : Prop := + ∀ phi : SmoothCompactSupportFunction + ⟨openCubeSet (originCube d m), isOpen_openCubeSet (originCube d m)⟩, + sigma0 * ∫ x, vecDot (w.grad x) (phi.gradient x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.gradient x) + ∂(centeredCubeDomain d m).normalizedVolume + +def IsCenteredCubeH10ScalarDivergenceSolution {d : ℕ} + (m : ℤ) (sigma0 : ℝ) + (w : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanLpField (originCube d m) + FiniteLpExponent.two) : Prop := + ∀ phi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, + vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +private noncomputable def finiteLpExponentSucc (p : FiniteLpExponent) : + FiniteLpExponent where + exponent := p.exponent + 1 + one_lt := lt_of_lt_of_le p.one_lt (le_add_of_nonneg_right bot_le) + lt_top := ENNReal.add_lt_top.mpr ⟨p.lt_top, by norm_num⟩ + +private theorem finiteLpExponentSucc_toReal (p : FiniteLpExponent) : + (finiteLpExponentSucc p).exponent.toReal = p.exponent.toReal + 1 := by + simp only [finiteLpExponentSucc] + rw [ENNReal.toReal_add p.lt_top.ne ENNReal.one_ne_top] + norm_num + +private theorem finiteLpExponent_lt_succ (p : FiniteLpExponent) : + p.exponent.toReal < (finiteLpExponentSucc p).exponent.toReal := by + rw [finiteLpExponentSucc_toReal] + linarith + +private theorem sqWeightedMeasure_univ_ne_top_of_memLp_two + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {f : α → E} + (hf : MeasureTheory.MemLp f 2 μ) : + sqWeightedMeasure f μ Set.univ ≠ ∞ := by + rw [sqWeightedMeasure, MeasureTheory.withDensity_apply _ MeasurableSet.univ] + simpa only [MeasureTheory.Measure.restrict_univ, ← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) zero_le_two, + ENNReal.toReal_ofNat, Real.rpow_two] using + (MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (by norm_num : (2 : ℝ≥0∞) ≠ 0) (by norm_num : (2 : ℝ≥0∞) ≠ ∞) + hf.eLpNorm_lt_top).ne + +private theorem sqWeightedMeasure_univ_eq_eLpNorm_two_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} (f : α → E) : + sqWeightedMeasure f μ Set.univ = (eLpNorm f 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure, MeasureTheory.withDensity_apply _ MeasurableSet.univ, + Measure.restrict_univ] + change (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ∂μ) = _ + simp_rw [ENNReal.ofReal_pow (norm_nonneg _), ofReal_norm] + rw [← ENNReal.rpow_natCast, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num), + ← ENNReal.rpow_mul] + norm_num + +private theorem lintegral_ofReal_norm_rpow_ne_top_of_memLp + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {p : FiniteLpExponent} {f : α → E} + (hf : MeasureTheory.MemLp f p.exponent μ) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) ∂μ) ≠ ∞ := by + simpa only [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] using + (MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne hf.eLpNorm_lt_top).ne + +private theorem lintegral_ofReal_norm_rpow_div_ne_top_of_memLp + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MeasureTheory.MemLp f p.exponent μ) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ) ≠ ∞ := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := by + exact Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x => ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas] + exact ENNReal.mul_ne_top + (ENNReal.inv_ne_top.2 (ENNReal.ofReal_ne_zero_iff.mpr hb)) + (lintegral_ofReal_norm_rpow_ne_top_of_memLp hf) + +private theorem toReal_eLpNorm_two_sq_eq_integral_norm_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] [MeasurableSpace E] + [BorelSpace E] {μ : MeasureTheory.Measure α} {f : α → E} + (hf : MeasureTheory.MemLp f 2 μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℕ) ∂μ := by + have hpow : (2 : ℝ≥0∞).toReal = (2 : ℝ) := by norm_num + have hnorm := hf.eLpNorm_eq_integral_rpow_norm + (by norm_num : (2 : ℝ≥0∞) ≠ 0) (by norm_num : (2 : ℝ≥0∞) ≠ ∞) + have hsq : (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + rw [hnorm, hpow] + have hnonneg : 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := + MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + rw [ENNReal.toReal_ofReal (Real.rpow_nonneg hnonneg _)] + rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num, ← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hnonneg + calc + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := hsq + _ = _ := by + congr 1 with x + rw [Real.rpow_two] + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + MeasureTheory.volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem rawWeak_of_isCenteredCubeH10ScalarDivergenceSolution + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + {u : H10Function (openCubeSet (originCube d m))} + {h : CubeEuclideanLpField (originCube d m) FiniteLpExponent.two} + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h) : + ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume := by + intro psi + have hnormalized := hsolution psi + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume, + MeasureTheory.integral_smul_measure, + MeasureTheory.integral_smul_measure] at hnormalized + have hfactor_pos : + 0 < (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal := by + rw [ENNReal.toReal_ofReal (inv_nonneg.mpr (cubeVolume_nonneg _))] + exact inv_pos.mpr (cubeVolume_pos _) + apply (mul_left_cancel₀ hfactor_pos.ne') + calc + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) = + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) := by + ring + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume) := hnormalized + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume) := by + ring + +private theorem memVectorL2_openCubeSet_of_euclideanMemLpTwo + {d : ℕ} (Q : TriadicCube d) {F : Vec d → Vec d} + (hF : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F x)) 2 + (normalizedCubeMeasure Q)) : + MemVectorL2 (openCubeSet Q) F := by + have hvec : MeasureTheory.MemLp F 2 (normalizedCubeMeasure Q) := by + apply MeasureTheory.MemLp.of_eval + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hcube : MeasureTheory.MemLp F 2 (cubeMeasure Q) := + hvec.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa only [MemVectorL2, volumeMeasureOn, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using hcube + +private theorem memLp_openCubeSet_of_euclideanMemLp + {d : ℕ} (Q : TriadicCube d) {p : FiniteLpExponent} {F : Vec d → Vec d} + (hF : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (hilbertifyVecField F) p.exponent + (volume.restrict (openCubeSet Q)) := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hcube : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (cubeMeasure Q) := + hF.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa only [hilbertifyVecField, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using! hcube + +private theorem sqWeightedMeasure_restrict_apply_eq_inter + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {B T : Set α} {f : α → E} + (hB : MeasurableSet B) : + sqWeightedMeasure f (μ.restrict B) T = sqWeightedMeasure f μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + +private theorem sqWeightedMeasure_smul_measure + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {c : ℝ≥0∞} {T : Set α} {f : α → E} : + sqWeightedMeasure f (c • μ) T = c * sqWeightedMeasure f μ T := by + unfold sqWeightedMeasure + rw [MeasureTheory.withDensity_smul_measure] + rfl + +private theorem norm_gradToHilbertVectorL2_le_sigmaInv_datum + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) + {H : Vec d → Vec d} (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (H x) (psi.toH1Function.grad x) ∂volume) : + ‖u.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hH‖ := by + let G : HilbertVectorL2 (openCubeSet (originCube d m)) := + u.toH1Function.gradToHilbertVectorL2 + let K : HilbertVectorL2 (openCubeSet (originCube d m)) := + toHilbertVectorL2OfVecField hH + have hgrad_integral : + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ∂volume = + ‖G‖ ^ 2 := by + calc + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ∂volume = + inner ℝ G G := by + simpa [G, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet (originCube d m)) + u.toH1Function.grad_memVectorL2 + u.toH1Function.grad_memVectorL2).symm + _ = ‖G‖ ^ 2 := real_inner_self_eq_norm_sq G + have hpair_integral : + ∫ x in openCubeSet (originCube d m), + vecDot (H x) (u.toH1Function.grad x) ∂volume = + inner ℝ K G := by + simpa [K, G, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet (originCube d m)) hH + u.toH1Function.grad_memVectorL2).symm + have henergy := hweak u + rw [hgrad_integral, hpair_integral] at henergy + have henergy_le : sigma0 * ‖G‖ ^ 2 ≤ ‖K‖ * ‖G‖ := by + calc + sigma0 * ‖G‖ ^ 2 = -inner ℝ K G := henergy + _ ≤ |inner ℝ K G| := neg_le_abs _ + _ ≤ ‖K‖ * ‖G‖ := abs_real_inner_le_norm K G + by_cases hGzero : ‖G‖ = 0 + · rw [hGzero] + exact mul_nonneg (inv_nonneg.mpr hsigma0.le) (norm_nonneg K) + · have hGpos : 0 < ‖G‖ := lt_of_le_of_ne (norm_nonneg G) (Ne.symm hGzero) + have hsigmaG : sigma0 * ‖G‖ ≤ ‖K‖ := by + apply le_of_mul_le_mul_right _ hGpos + simpa [pow_two, mul_assoc] using henergy_le + have hdiv : ‖G‖ ≤ ‖K‖ / sigma0 := by + apply (le_div_iff₀ hsigma0).2 + simpa [mul_comm] using hsigmaG + simpa [G, K, div_eq_mul_inv, mul_comm] using hdiv + +private theorem centeredCubeNormalized_eLpNorm_grad_le_scaledDatum + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) + {H : Vec d → Vec d} (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (H x) (psi.toH1Function.grad x) ∂volume) : + eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (centeredCubeDomain d m).normalizedVolume := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hc : c ≠ 0 := by + exact ne_of_gt (ENNReal.ofReal_pos.mpr + (inv_pos.mpr (cubeVolume_pos (originCube d m)))) + have henergy := norm_gradToHilbertVectorL2_le_sigmaInv_datum hsigma0 u hH hweak + have hraw : + eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (volume.restrict (openCubeSet (originCube d m))) := by + rw [MeasureTheory.eLpNorm_const_smul, + eLpNorm_hilbertify_grad_two_eq_ofReal_norm_gradToHilbertVectorL2, + eLpNorm_hilbertifyVecField_two_eq_ofReal_norm_toHilbertVectorL2 hH] + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ← ENNReal.ofReal_mul (inv_nonneg.mpr hsigma0.le)] + exact ENNReal.ofReal_le_ofReal henergy + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume] + change eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (c • volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (c • volume.restrict (openCubeSet (originCube d m))) + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero hc, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero hc] + exact mul_le_mul_right hraw _ + +/-- The energy (`q = 2`) endpoint for the supplied-solution cube +Calderón--Zygmund interface; this is the base case used by the all-exponent +assembly. -/ +theorem centeredCubeH10ScalarDivergence_cz_two + {d : ℕ} [NeZero d] (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanL2LpField (originCube d m) FiniteLpExponent.two) + (u : H10Function (openCubeSet (originCube d m))) + (hsigma0 : 0 < sigma0) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) : + (centeredCubeDomain d m).normalizedEuclideanLpENorm + FiniteLpExponent.two.exponent u.toH1Function.grad ≤ + (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm + FiniteLpExponent.two.exponent h.toField := by + have hH : MemVectorL2 (openCubeSet (originCube d m)) h.toField := + memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) + h.euclideanMemL2 + have hnormalized := centeredCubeNormalized_eLpNorm_grad_le_scaledDatum + hsigma0 u hH + (rawWeak_of_isCenteredCubeH10ScalarDivergenceSolution hsolution) + rw [MeasureTheory.eLpNorm_const_smul] at hnormalized + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] at hnormalized + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, + FiniteLpExponent.two_exponent, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, hilbertifyVecField] using! hnormalized + +private theorem reflectedGoodLambdaCutoff_sq_eq_normalized_energy + {d : ℕ} {m : ℤ} (depth : ℕ) (eps sigma0 : ℝ) + (u : H10Function (openCubeSet (originCube d m))) (H : Vec d → Vec d) : + reflectedGoodLambdaCutoff m depth eps sigma0 u H ^ (2 : ℕ) = + (3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d * + ((∫ x, ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) + + (eps⁻¹) ^ (2 : ℕ) * + ∫ x, ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) := by + let s : ℝ := cubeScaleFactor (originCube d m) + let L : ℝ := 10 * (3 : ℝ) ^ depth + let V : ℝ := cubeVolume (originCube d m) + have hs : 0 < s := by + dsimp only [s] + simpa [cubeScaleFactor] using! + zpow_pos (by norm_num : (0 : ℝ) < 3) m + have hL : 0 < L := by + dsimp only [L] + positivity + have hV : V = s ^ d := by + simp only [V, s, cubeVolume_eq_scaleFactor_pow] + have hnormal : (ENNReal.ofReal (V⁻¹)).toReal = V⁻¹ := by + rw [ENNReal.toReal_ofReal] + exact inv_nonneg.mpr (by rw [hV]; positivity) + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal (V⁻¹) • volume.restrict (openCubeSet (originCube d m)) := by + simpa only [V] using centeredCube_normalizedVolume_eq_smul_openCubeVolume m + have hIu : + (∫ x, ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) = + V⁻¹ * ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume := by + rw [hmeasure, MeasureTheory.integral_smul_measure, hnormal] + exact smul_eq_mul _ _ + have hIH : + (∫ x, ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) = + V⁻¹ * ∫ x in openCubeSet (originCube d m), + ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [hmeasure, MeasureTheory.integral_smul_measure, hnormal] + exact smul_eq_mul _ _ + have hscaled : + (∫ x in openCubeSet (originCube d m), + ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) = + (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [← MeasureTheory.integral_const_mul] + congr 1 + funext x + rw [norm_smul, Real.norm_eq_abs] + calc + (|sigma0⁻¹| * ‖hilbertifyVecField H x‖) ^ (2 : ℕ) = + |sigma0⁻¹| ^ (2 : ℕ) * ‖hilbertifyVecField H x‖ ^ (2 : ℕ) := by ring + _ = _ := by rw [sq_abs] + have hcoef : + ((2 * ((s / 2) / L)) ^ d)⁻¹ * (3 : ℝ) ^ d = + (3 : ℝ) ^ d * L ^ d * V⁻¹ := by + rw [hV] + rw [← inv_pow] + field_simp [hs.ne', hL.ne'] + rw [div_pow] + exact div_mul_cancel₀ _ (pow_pos hs _).ne' + rw [reflectedGoodLambdaCutoff, reflectedSourceSquaredEnergy, Real.sq_sqrt] + · dsimp only [reflectedStoppingRadius] + rw [show cubeRadius (originCube d m) = s / 2 by + dsimp only [s, cubeRadius] + ring] + rw [show 10 * (3 : ℝ) ^ depth = L by rfl, hIu, hIH, hscaled] + calc + ((2 * (s / 2 / L)) ^ d)⁻¹ * + ((3 : ℝ) ^ d * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume)) = + (((2 * (s / 2 / L)) ^ d)⁻¹ * (3 : ℝ) ^ d) * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) := by ring + _ = _ := by rw [hcoef]; ring + · apply mul_nonneg + · exact inv_nonneg.mpr (pow_nonneg + (mul_nonneg (by norm_num) (reflectedStoppingRadius_pos m depth).le) _) + · apply mul_nonneg (pow_nonneg (by norm_num) _) + apply add_nonneg + · exact MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + · exact mul_nonneg (mul_nonneg (sq_nonneg _) (sq_nonneg _)) + (MeasureTheory.integral_nonneg fun _ => sq_nonneg _) + +private theorem reflectedGoodLambdaCutoff_le_normalized_datum_energy + {d : ℕ} [NeZero d] {m : ℤ} {q : FiniteLpExponent} + (depth : ℕ) {eps sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) : + reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) * + Real.sqrt (∫ x, ‖sigma0⁻¹ • hilbertifyVecField h.toField x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let K : ℝ := (3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d + let E : ℝ := ∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ + let A : ℝ := ∫ x, ‖f x‖ ^ (2 : ℕ) ∂μ + let C : ℝ := Real.sqrt (K * (1 + (eps⁻¹) ^ (2 : ℕ))) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using centeredCube_normalizedVolume_eq_smul_openCubeVolume m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hgbase : MemLp (hilbertifyVecField h.toField) 2 μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemL2 + have hg : MemLp g 2 μ := by + simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hnorm := centeredCubeNormalized_eLpNorm_grad_le_scaledDatum hsigma0 u + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) h.euclideanMemL2) + (rawWeak_of_isCenteredCubeH10ScalarDivergenceSolution hsolution) + have hnormR := (ENNReal.toReal_le_toReal hf.eLpNorm_lt_top.ne + hg.eLpNorm_lt_top.ne).mpr hnorm + have hsq := (sq_le_sq₀ ENNReal.toReal_nonneg ENNReal.toReal_nonneg).mpr hnormR + rw [toReal_eLpNorm_two_sq_eq_integral_norm_sq hf, + toReal_eLpNorm_two_sq_eq_integral_norm_sq hg] at hsq + have hAE : A ≤ E := by simpa only [A, E, f, g] using hsq + have hK : 0 < K := by + dsimp only [K] + positivity + have hE0 : 0 ≤ E := MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + have hsum : A + (eps⁻¹) ^ (2 : ℕ) * E ≤ + (1 + (eps⁻¹) ^ (2 : ℕ)) * E := by + have he : 0 ≤ (eps⁻¹) ^ (2 : ℕ) := sq_nonneg _ + nlinarith [hAE] + calc + reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField = + Real.sqrt (reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ^ (2 : ℕ)) := by + symm + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg + (reflectedGoodLambdaCutoff_nonneg m depth eps sigma0 u h.toField)] + _ = Real.sqrt (K * (A + (eps⁻¹) ^ (2 : ℕ) * E)) := by + rw [reflectedGoodLambdaCutoff_sq_eq_normalized_energy] + rfl + _ ≤ Real.sqrt (K * ((1 + (eps⁻¹) ^ (2 : ℕ)) * E)) := + Real.sqrt_le_sqrt (mul_le_mul_of_nonneg_left hsum hK.le) + _ = C * Real.sqrt E := by + dsimp only [C] + rw [← mul_assoc, Real.sqrt_mul] + positivity + _ = _ := rfl + +/-- Internal finite-`q` specialization of the reflected one-level estimate. -/ +private theorem sqWeightedMeasure_reflected_oneLevel_tail_originCube_finiteLp + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M level : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hlevel : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < level) : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) ≤ + ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) volume + ({x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} ∩ + openCubeSet (originCube d m))) := by + exact sqWeightedMeasure_reflected_oneLevel_tail_originCube G hr hsigma0 heps + heps_one hM u h.toField + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) + h.euclideanMemL2) + (rawWeak_of_isCenteredCubeH10ScalarDivergenceSolution hsolution) hlevel + +private theorem finiteLp_oneLevel_tail_restrict + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M lambda : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hlambda : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda) : + ∀ level, lambda ≤ level → + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (volume.restrict (openCubeSet (originCube d m))) + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} := by + intro level hlevel + have htail := sqWeightedMeasure_reflected_oneLevel_tail_originCube_finiteLp + G hr hsigma0 heps heps_one hM u h hsolution (hlambda.trans_le hlevel) + rw [sqWeightedMeasure_restrict_apply_eq_inter + (measurableSet_openCubeSet (originCube d m)), + sqWeightedMeasure_restrict_apply_eq_inter + (measurableSet_openCubeSet (originCube d m)), + sqWeightedMeasure_restrict_apply_eq_inter + (measurableSet_openCubeSet (originCube d m))] + simpa only [mul_add, mul_assoc] using htail + +private theorem finiteLp_oneLevel_tail_normalized + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M lambda : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hlambda : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda) : + ∀ level, lambda ≤ level → + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (centeredCubeDomain d m).normalizedVolume + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} := by + intro level hlevel + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hraw := finiteLp_oneLevel_tail_restrict G hr hsigma0 heps heps_one hM + u h hsolution hlambda level hlevel + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume, + sqWeightedMeasure_smul_measure, sqWeightedMeasure_smul_measure, + sqWeightedMeasure_smul_measure] + calc + c * sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + c * + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (volume.restrict (openCubeSet (originCube d m))) + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖}) := + by simpa only [mul_comm] using mul_le_mul_right hraw c + _ = _ := by ring + +/-- The layer-cake integration step, with its contraction hypothesis kept +private because the outer finite-`L^p` argument chooses the parameters. -/ +private theorem finiteLp_integrated_tail_of_parameters + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) (hq : 2 < q.exponent.toReal) + {m : ℤ} {sigma0 M eps lambda0 : ℝ} + (hsigma0 : 0 < sigma0) (hM : 1 < M) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hlambda0 : 0 < lambda0) + (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hcutoff : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda0) + (hsmall : + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1) : + ∫⁻ x, ENNReal.ofReal + (‖hilbertifyVecField u.toH1Function.grad x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) + ∂(centeredCubeDomain d m).normalizedVolume ≤ + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + ∫⁻ x, ENNReal.ofReal + (‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) + ∂(centeredCubeDomain d m).normalizedVolume) / + (1 - + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2))) := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let C : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G + let theta : ℝ≥0∞ := C * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using centeredCube_normalizedVolume_eq_smul_openCubeVolume m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hg_base : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by + simpa only [g] using hg_base.const_smul sigma0⁻¹ + have hC : C ≠ ∞ := by + exact ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (oneStoppingBallCoefficient_ne_top G) + have htheta : theta ≠ ∞ := by + exact ENNReal.mul_ne_top hC (ENNReal.add_ne_top.mpr + ⟨ENNReal.ofReal_ne_top, ENNReal.ofReal_ne_top⟩) + have hB : B ≠ ∞ := + ENNReal.mul_ne_top htheta ENNReal.ofReal_ne_top + have heps_half : 0 < eps / 2 := by linarith + have htail : ∀ level, lambda0 ≤ level → + sqWeightedMeasure f μ {x | M * level < ‖f x‖} ≤ + theta * sqWeightedMeasure f μ {x | level / 2 < ‖f x‖} + + B * sqWeightedMeasure g μ + {x | eps * level / 2 < ‖g x‖} := by + simpa only [μ, f, g, theta, B, C, mul_assoc] using + finiteLp_oneLevel_tail_normalized G hr hsigma0 heps heps_one hM.le u h + hsolution hcutoff + simpa only [μ, f, g, theta, B, C] using + (lp_le_of_oneLevel_weighted_tail hf.aestronglyMeasurable hg.aestronglyMeasurable + hq (by linarith) (by linarith) heps hlambda0 + (sqWeightedMeasure_univ_ne_top_of_memLp_two hf) hB + (lintegral_ofReal_norm_rpow_div_ne_top_of_memLp heps_half hg) + hsmall htail) + +private theorem exists_finiteLp_goodLambda_data + {d : ℕ} [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ (depth : ℕ) (G : INTERNAL.HarmonicEuclideanGradientGain d + (finiteLpExponentSucc q) depth) (M eps : ℝ), + 1 < M ∧ 0 < eps ∧ eps ≤ 1 ∧ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ + (2 - (finiteLpExponentSucc q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1 := by + obtain ⟨⟨depth, G⟩⟩ := + INTERNAL.nonempty_harmonicEuclideanGradientGain_finiteTarget_of_pos d + (Nat.pos_of_ne_zero (NeZero.ne d)) (finiteLpExponentSucc q) + let C : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G + have hC : C ≠ ∞ := ENNReal.mul_ne_top + (ENNReal.pow_ne_top (by norm_num)) (oneStoppingBallCoefficient_ne_top G) + obtain ⟨M, eps, hM, heps, heps_one, hsmall⟩ := + INTERNAL.exists_strict_goodLambda_parameters hC hq + (finiteLpExponent_lt_succ q) + exact ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ + +private theorem ennreal_le_root_mul_of_rpow_le {p : ℝ} {R X Y : ℝ≥0∞} + (hp : 0 < p) (h : X ^ p ≤ R * Y ^ p) : + X ≤ R ^ p⁻¹ * Y := by + have hp0 : p ≠ 0 := hp.ne' + have hpnonneg : 0 ≤ p := hp.le + calc + X = X ^ (p * p⁻¹) := by rw [mul_inv_cancel₀ hp0, ENNReal.rpow_one] + _ = (X ^ p) ^ p⁻¹ := ENNReal.rpow_mul _ _ _ + _ ≤ (R * Y ^ p) ^ p⁻¹ := + ENNReal.rpow_le_rpow h (inv_nonneg.mpr hpnonneg) + _ = R ^ p⁻¹ * Y := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hpnonneg), + ← ENNReal.rpow_mul, mul_inv_cancel₀ hp0, ENNReal.rpow_one] + +private theorem eLpNorm_rpow_finiteLpExponent_eq_lintegral_ofReal_norm_rpow + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} (p : FiniteLpExponent) (f : α → E) : + (eLpNorm f p.exponent μ) ^ p.exponent.toReal = + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) ∂μ := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne, + ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + apply MeasureTheory.lintegral_congr + intro x + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] + +private theorem lintegral_ofReal_norm_rpow_eq_ofReal_mul_div + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) ∂μ) = + ENNReal.ofReal (a ^ (p.exponent.toReal - 2)) * + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) = + ENNReal.ofReal b * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) := by + calc + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) = + ENNReal.ofReal ((‖f x‖ ^ p.exponent.toReal / b) * b) := by + congr 1 + exact (div_mul_cancel₀ _ hb.ne').symm + _ = ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) * ENNReal.ofReal b := + ENNReal.ofReal_mul (div_nonneg + (Real.rpow_nonneg (norm_nonneg _) _) hb.le) + _ = _ := mul_comm _ _ + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + +private theorem divided_moment_eq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MemLp f p.exponent μ) : + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ = + (ENNReal.ofReal (a ^ (p.exponent.toReal - 2)))⁻¹ * + (eLpNorm f p.exponent μ) ^ p.exponent.toReal := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x => ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas, + ← eLpNorm_rpow_finiteLpExponent_eq_lintegral_ofReal_norm_rpow p f] + +private theorem tail_powered_package + {cM D L B cdata X Y : ℝ≥0∞} (hcM : cM ≠ 0) (hcMtop : cM ≠ ∞) + (htail : cM⁻¹ * X ≤ (L * Y + B * (cdata⁻¹ * Y)) / D) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y := by + calc + X = cM * (cM⁻¹ * X) := by + rw [← mul_assoc, ENNReal.mul_inv_cancel hcM hcMtop, one_mul] + _ = (cM⁻¹ * X) * cM := mul_comm _ _ + _ ≤ ((L * Y + B * (cdata⁻¹ * Y)) / D) * cM := + mul_le_mul_left htail _ + _ = cM * ((L * Y + B * (cdata⁻¹ * Y)) / D) := mul_comm _ _ + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y := by + rw [ENNReal.div_eq_inv_mul] + ring + +private theorem tail_norm_package + {p : ℝ} {cM D L B cdata X Y : ℝ≥0∞} (hp : 0 < p) (hcM : cM ≠ 0) + (hcMtop : cM ≠ ∞) + (htail : cM⁻¹ * X ^ p ≤ (L * Y ^ p + B * (cdata⁻¹ * Y ^ p)) / D) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + have hpow : X ^ p ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p := + tail_powered_package hcM hcMtop htail + have hp0 : p ≠ 0 := hp.ne' + have hpnonneg : 0 ≤ p := hp.le + calc + X = X ^ (p * p⁻¹) := by rw [mul_inv_cancel₀ hp0, ENNReal.rpow_one] + _ = (X ^ p) ^ p⁻¹ := ENNReal.rpow_mul _ _ _ + _ ≤ ((cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p) ^ p⁻¹ := + ENNReal.rpow_le_rpow hpow (inv_nonneg.mpr hpnonneg) + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hpnonneg), + ← ENNReal.rpow_mul, mul_inv_cancel₀ hp0, ENNReal.rpow_one] + +/-- Algebraic finalization of the integrated good-`λ` inequality. The +solution moment is deliberately supplied through the raw moment identity, so +this lemma does not assume the conclusion `MemLp f q` while proving it. -/ +private theorem finiteLp_norm_bound_of_moment_tail + {p : ℝ} {cM D L B cdata X Y Jf Jg low : ℝ≥0∞} + (hp : 0 < p) (hcM : cM ≠ 0) (hcMtop : cM ≠ ∞) + (hJf : X ^ p = cM * Jf) + (hJg : Jg = cdata⁻¹ * Y ^ p) + (htail : Jf ≤ (low + B * Jg) / D) + (hlow : low ≤ L * Y ^ p) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + apply tail_norm_package hp hcM hcMtop + rw [hJf, ← mul_assoc, ENNReal.inv_mul_cancel hcM hcMtop, one_mul] + calc + Jf ≤ (low + B * Jg) / D := htail + _ ≤ (L * Y ^ p + B * (cdata⁻¹ * Y ^ p)) / D := by + apply ENNReal.div_le_div_right + calc + low + B * Jg ≤ L * Y ^ p + B * Jg := by + simpa [add_comm] using add_le_add_right hlow (B * Jg) + _ = _ := by rw [hJg] + +private theorem finiteLp_low_term_package + {p : ℝ} {S lam c N₂ Nq : ℝ≥0∞} + (hp : 2 < p) (hS : S ≤ N₂ ^ (2 : ℕ)) + (hlam : lam ≤ c * N₂) (hN : N₂ ≤ Nq) : + S * lam ^ (p - 2) ≤ c ^ (p - 2) * Nq ^ p := by + have he : 0 ≤ p - 2 := by linarith + calc + S * lam ^ (p - 2) ≤ N₂ ^ (2 : ℕ) * (c * N₂) ^ (p - 2) := + mul_le_mul hS (ENNReal.rpow_le_rpow hlam he) bot_le bot_le + _ = c ^ (p - 2) * N₂ ^ p := by + rw [ENNReal.mul_rpow_of_nonneg _ _ he] + rw [← ENNReal.rpow_natCast] + calc + N₂ ^ (2 : ℝ) * (c ^ (p - 2) * N₂ ^ (p - 2)) = + c ^ (p - 2) * (N₂ ^ (2 : ℝ) * N₂ ^ (p - 2)) := by + ac_rfl + _ = c ^ (p - 2) * N₂ ^ (2 + (p - 2)) := by + rw [ENNReal.rpow_add_of_nonneg _ _ (by norm_num) he] + _ = c ^ (p - 2) * N₂ ^ p := by + congr 2 + ring + _ ≤ c ^ (p - 2) * Nq ^ p := by + gcongr + +private theorem finiteLp_low_term_of_l2_control + {d : ℕ} {m : ℤ} {q : FiniteLpExponent} + {f g : Vec d → HilbertVec d} {lambda c : ℝ} + (hgq : MemLp g q.exponent (centeredCubeDomain d m).normalizedVolume) + (hq : 2 < q.exponent.toReal) + (henergy : eLpNorm f 2 (centeredCubeDomain d m).normalizedVolume ≤ + eLpNorm g 2 (centeredCubeDomain d m).normalizedVolume) + (hc : 0 ≤ c) (hlambda : 0 ≤ lambda) + (hlambda_bound : lambda ≤ c * + (eLpNorm g q.exponent (centeredCubeDomain d m).normalizedVolume).toReal) : + sqWeightedMeasure f (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda ^ (q.exponent.toReal - 2)) ≤ + (ENNReal.ofReal c) ^ (q.exponent.toReal - 2) * + (eLpNorm g q.exponent (centeredCubeDomain d m).normalizedVolume) ^ + q.exponent.toReal := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + have hprob : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + let : IsProbabilityMeasure μ := hprob + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have htwoqnorm : eLpNorm g 2 μ ≤ eLpNorm g q.exponent μ := + MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le htwoq hgq.aestronglyMeasurable + have hS : sqWeightedMeasure f μ Set.univ ≤ (eLpNorm g 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure_univ_eq_eLpNorm_two_sq] + exact pow_le_pow_left₀ bot_le henergy 2 + have hSq : sqWeightedMeasure f μ Set.univ ≤ (eLpNorm g q.exponent μ) ^ (2 : ℕ) := + hS.trans (pow_le_pow_left₀ bot_le htwoqnorm 2) + have hlamENN : ENNReal.ofReal lambda ≤ ENNReal.ofReal c * eLpNorm g q.exponent μ := by + calc + ENNReal.ofReal lambda ≤ ENNReal.ofReal + (c * (eLpNorm g q.exponent μ).toReal) := ENNReal.ofReal_le_ofReal hlambda_bound + _ = ENNReal.ofReal c * eLpNorm g q.exponent μ := by + rw [ENNReal.ofReal_mul hc, ENNReal.ofReal_toReal hgq.eLpNorm_lt_top.ne] + rw [show (ENNReal.ofReal (lambda ^ (q.exponent.toReal - 2))) = + (ENNReal.ofReal lambda) ^ (q.exponent.toReal - 2) by + exact (ENNReal.ofReal_rpow_of_nonneg (p := q.exponent.toReal - 2) + hlambda (by linarith)).symm] + exact finiteLp_low_term_package hq hSq hlamENN le_rfl + +private theorem reflectedGoodLambdaCutoff_le_q_datum_norm + {d : ℕ} [NeZero d] {m : ℤ} {q : FiniteLpExponent} (depth : ℕ) + {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hq : 2 < q.exponent.toReal) : + reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) * + (eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume).toReal := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let C : ℝ := Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) + have hgbase : MemLp (hilbertifyVecField h.toField) 2 μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemL2 + have hg2 : MemLp g 2 μ := by simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hgqbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hgq : MemLp g q.exponent μ := by simpa only [g] using hgqbase.const_smul sigma0⁻¹ + let : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have hnorm : eLpNorm g 2 μ ≤ eLpNorm g q.exponent μ := + MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le htwoq hgq.aestronglyMeasurable + have hnormR : (eLpNorm g 2 μ).toReal ≤ (eLpNorm g q.exponent μ).toReal := + (ENNReal.toReal_le_toReal hg2.eLpNorm_lt_top.ne hgq.eLpNorm_lt_top.ne).mpr hnorm + have hmoment : (eLpNorm g 2 μ).toReal ^ (2 : ℕ) = + ∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ := + toReal_eLpNorm_two_sq_eq_integral_norm_sq hg2 + have hsqrt : Real.sqrt (∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ) = + (eLpNorm g 2 μ).toReal := by + rw [← hmoment, Real.sqrt_sq_eq_abs, abs_of_nonneg ENNReal.toReal_nonneg] + have hcut := reflectedGoodLambdaCutoff_le_normalized_datum_energy + (eps := eps) depth hsigma0 u h hsolution + calc + reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + C * Real.sqrt (∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ) := by + simpa only [μ, g, C] using! hcut + _ = C * (eLpNorm g 2 μ).toReal := by rw [hsqrt] + _ ≤ C * (eLpNorm g q.exponent μ).toReal := by + apply mul_le_mul_of_nonneg_left hnormR + dsimp only [C] + positivity + +/-- The finite-exponent conclusion from an integrated reflected tail estimate. +The only analytic input not intrinsic to layer-cake is the low-level term; +the outer argument bounds it using the energy estimate and its cutoff choice. -/ +private theorem finiteLp_norm_bound_of_parameters + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) (hq : 2 < q.exponent.toReal) + {m : ℤ} {sigma0 M eps lambda0 : ℝ} + (hsigma0 : 0 < sigma0) (hM : 1 < M) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hlambda0 : 0 < lambda0) + (u : H10Function (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hcutoff : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda0) + (hsmall : + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1) + {L : ℝ≥0∞} + (hlow : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) ≤ + L * (eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume) ^ q.exponent.toReal) : + eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (centeredCubeDomain d m).normalizedVolume ≤ + (ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) * + (1 - + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)))⁻¹ * + (L + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + (ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)))⁻¹)) ^ + (q.exponent.toReal)⁻¹ * + eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let theta : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + let cM : ℝ≥0∞ := ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) + let cdata : ℝ≥0∞ := ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)) + let D : ℝ≥0∞ := 1 - theta * ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) + have hepshalf : 0 < eps / 2 := by linarith + have hcM : cM ≠ 0 := by + dsimp only [cM] + exact (ENNReal.ofReal_pos.mpr (Real.rpow_pos_of_pos (by linarith) _)).ne' + have hcMtop : cM ≠ ∞ := ENNReal.ofReal_ne_top + have htail := finiteLp_integrated_tail_of_parameters G hr hq hsigma0 hM + heps heps_one hlambda0 u h hsolution hcutoff hsmall + have hJf : (eLpNorm f q.exponent μ) ^ q.exponent.toReal = + cM * ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) ∂μ := by + rw [eLpNorm_rpow_finiteLpExponent_eq_lintegral_ofReal_norm_rpow, + lintegral_ofReal_norm_rpow_eq_ofReal_mul_div (p := q) (a := M) + (f := f) (by linarith)] + have hgbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by + simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hJg : (∫⁻ x, ENNReal.ofReal (‖g x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) ∂μ) = + cdata⁻¹ * (eLpNorm g q.exponent μ) ^ q.exponent.toReal := by + simpa only [cdata] using divided_moment_eq hepshalf hg + have htail' : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) ∂μ) ≤ + (sqWeightedMeasure f μ Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) ∂μ) / D := by + simpa only [μ, f, g, theta, B, D] using htail + have hlow' : sqWeightedMeasure f μ Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) ≤ + L * (eLpNorm g q.exponent μ) ^ q.exponent.toReal := by + simpa only [μ, f, g] using hlow + have hp : 0 < q.exponent.toReal := by linarith + simpa only [μ, f, g, theta, B, cM, cdata, D] using + (finiteLp_norm_bound_of_moment_tail + (p := q.exponent.toReal) (L := L) (B := B) hp + hcM hcMtop hJf hJg htail' hlow') + +private theorem finiteLp_final_coefficient_ne_top + {p : ℝ} {cM rho L B cdata : ℝ≥0∞} + (hp : 0 < p) (hcMtop : cM ≠ ∞) (hrho : rho < 1) + (hLtop : L ≠ ∞) (hBtop : B ≠ ∞) (hcdata : cdata ≠ 0) : + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ ≠ ∞ := by + apply ENNReal.rpow_ne_top_of_nonneg (inv_nonneg.mpr hp.le) + apply ENNReal.mul_ne_top + · apply ENNReal.mul_ne_top hcMtop + exact ENNReal.inv_ne_top.mpr (ne_of_gt (tsub_pos_iff_lt.mpr hrho)) + · apply ENNReal.add_ne_top.mpr + exact ⟨hLtop, ENNReal.mul_ne_top hBtop (ENNReal.inv_ne_top.mpr hcdata)⟩ + +/-- Cube Calderón--Zygmund estimate above the energy exponent. -/ +theorem centeredCubeH10ScalarDivergence_cz_of_two_lt + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanL2LpField (originCube d m) q) + (u : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + obtain ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ := + exists_finiteLp_goodLambda_data (d := d) q hq + let theta : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - (finiteLpExponentSucc q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + let cM : ℝ≥0∞ := ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) + let cdata : ℝ≥0∞ := ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)) + let rho : ℝ≥0∞ := theta * ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) + let Ccut : ℝ := Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) + let L : ℝ≥0∞ := (ENNReal.ofReal (2 * Ccut)) ^ (q.exponent.toReal - 2) + let C : ℝ≥0∞ := + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ (q.exponent.toReal)⁻¹ + have hp : 0 < q.exponent.toReal := by linarith + have hCtop : C ≠ ∞ := by + apply finiteLp_final_coefficient_ne_top hp ENNReal.ofReal_ne_top + · simpa only [rho, theta] using hsmall + · dsimp only [L] + exact ENNReal.rpow_ne_top_of_nonneg (by linarith) ENNReal.ofReal_ne_top + · dsimp only [B, theta] + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top + (ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (oneStoppingBallCoefficient_ne_top G)) + (ENNReal.add_ne_top.mpr ⟨ENNReal.ofReal_ne_top, ENNReal.ofReal_ne_top⟩)) + ENNReal.ofReal_ne_top + · dsimp only [cdata] + exact (ENNReal.ofReal_pos.mpr (Real.rpow_pos_of_pos (by linarith) _)).ne' + refine ⟨C, lt_top_iff_ne_top.mpr hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + have henergy : eLpNorm f 2 μ ≤ eLpNorm g 2 μ := by + simpa only [μ, f, g] using + (centeredCubeNormalized_eLpNorm_grad_le_scaledDatum hsigma0 u + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) + h.euclideanMemL2) + (rawWeak_of_isCenteredCubeH10ScalarDivergenceSolution hsolution)) + have hgbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by simpa only [g] using hgbase.const_smul sigma0⁻¹ + by_cases hYzero : eLpNorm g q.exponent μ = 0 + · let : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have hg2zero : eLpNorm g 2 μ = 0 := + le_zero_iff.mp ((MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + htwoq hg.aestronglyMeasurable).trans_eq hYzero) + have hf2zero : eLpNorm f 2 μ = 0 := le_zero_iff.mp (henergy.trans_eq hg2zero) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf2 : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using centeredCube_normalizedVolume_eq_smul_openCubeVolume m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hfae : f =ᵐ[μ] 0 := + (MeasureTheory.eLpNorm_eq_zero_iff hf2.aestronglyMeasurable (by norm_num)).mp hf2zero + have hfqzero : eLpNorm f q.exponent μ = 0 := + MeasureTheory.eLpNorm_eq_zero_of_ae_zero hfae + have htargetzero : (centeredCubeDomain d m).normalizedEuclideanLpENorm + q.exponent u.toH1Function.grad = 0 := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, f, μ, hilbertifyVecField] using! hfqzero + rw [htargetzero] + exact bot_le + · let lambda0 : ℝ := reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField + + Ccut * (eLpNorm g q.exponent μ).toReal + have hYpos : 0 < (eLpNorm g q.exponent μ).toReal := + ENNReal.toReal_pos hYzero hg.eLpNorm_lt_top.ne + have hCcut : 0 < Ccut := by + dsimp only [Ccut] + positivity + have hcut := reflectedGoodLambdaCutoff_le_q_datum_norm (eps := eps) + depth hsigma0 u h hsolution hq + have hcut' : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Ccut * (eLpNorm g q.exponent μ).toReal := by + simpa only [μ, g, Ccut] using hcut + have hlambda0 : 0 < lambda0 := by + dsimp only [lambda0] + exact add_pos_of_nonneg_of_pos + (reflectedGoodLambdaCutoff_nonneg m depth eps sigma0 u h.toField) + (mul_pos hCcut hYpos) + have hcutoff : reflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda0 := by + dsimp only [lambda0] + nlinarith [hcut'] + have hlambdaBound : lambda0 ≤ 2 * Ccut * (eLpNorm g q.exponent μ).toReal := by + dsimp only [lambda0] + nlinarith [hcut'] + have hlow := finiteLp_low_term_of_l2_control (q := q) (f := f) (g := g) + hg hq henergy (by nlinarith [hCcut]) hlambda0.le hlambdaBound + have hbound := finiteLp_norm_bound_of_parameters G + (hq.trans (finiteLpExponent_lt_succ q)) hq hsigma0 hM heps heps_one + hlambda0 u h hsolution hcutoff (by + simpa only [finiteLpExponentSucc_toReal] using hsmall) (L := L) (by + simpa only [μ, f, g, lambda0, L, Ccut] using hlow) + have hleft : (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad = eLpNorm f q.exponent μ := by + simp only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, f, μ] + rfl + rw [hleft] + rw [MeasureTheory.eLpNorm_const_smul] at hbound + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] at hbound + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, μ, f, g, C, theta, B, cM, cdata, rho, L, + mul_assoc] using! hbound + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpArbitrary.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpArbitrary.lean new file mode 100644 index 0000000000..5406761cec --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpArbitrary.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpW10pLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpLimitBound + +/-! +# Arbitrary-data finite-`L^p` cube Calderón--Zygmund theorem + +This file closes the finite-exponent cube estimate for arbitrary `L^p` vector +data by packaging the canonical zero-trace solution limit. The constant and +normalized estimate are inherited unchanged from the canonical gradient +limit. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +/-- For every finite exponent and arbitrary `L^p` cube datum, there is a +zero-trace `W^{1,p}` solution satisfying the scale-uniform normalized +Calderón--Zygmund estimate. -/ +theorem exists_centeredCubeW10pScalarDivergenceSolution_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q), + 0 < sigma0 → + ∃ w : W10pFunction (openCubeSet (originCube d m)) q.exponent, + IsCenteredCubeW10pScalarDivergenceSolution m sigma0 w h ∧ + (centeredCubeDomain d m).normalizedEuclideanLpENorm + q.exponent w.grad ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm + q.exponent h.toField := by + obtain ⟨C, hCtop, hC⟩ := INTERNAL.finiteLpGradientLimit_cz d q + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h hsigma0 + let w : W10pFunction (openCubeSet (originCube d m)) q.exponent := + INTERNAL.finiteLpW10pSolutionLimit q m hsigma0 h + refine ⟨w, ?_, ?_⟩ + · intro phi + simpa only [w, INTERNAL.finiteLpW10pSolutionLimit_grad] using + INTERNAL.finiteLpGradientLimit_normalized_weak d q m hsigma0 h phi + · simpa only [w, INTERNAL.finiteLpW10pSolutionLimit_grad] using + hC m sigma0 h hsigma0 + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpBelowTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpBelowTwo.lean new file mode 100644 index 0000000000..24334343c6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpBelowTwo.lean @@ -0,0 +1,822 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 + +/-! +# Below-two support for cube Calderón--Zygmund estimates + +This file isolates the self-adjoint weak-form calculation used to pass from +the already-established above-two estimate to `1 < q < 2`. It deliberately +exports no source-facing Calderón--Zygmund theorem: the statements here only +turn the canonical adjoint solution into a normalized weak solution and +identify the two cross pairings. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund +namespace INTERNAL + +/-- Two scalar divergence weak equations can be tested against one another. +The scalar coefficient cancels by symmetry of the Euclidean dot product; no +positivity assumption is needed for this algebraic cross-pairing identity. -/ +theorem scalarDivergence_cross_pairing + {d : ℕ} {U : Set (Vec d)} {sigma0 : ℝ} + (u v : H10Function U) (h G : Vec d → Vec d) + (hu : ∀ psi : H10Function U, + sigma0 * ∫ x in U, + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in U, vecDot (h x) (psi.toH1Function.grad x) ∂volume) + (hv : ∀ psi : H10Function U, + sigma0 * ∫ x in U, + vecDot (v.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in U, vecDot (G x) (psi.toH1Function.grad x) ∂volume) : + ∫ x in U, vecDot (u.toH1Function.grad x) (G x) ∂volume = + ∫ x in U, vecDot (h x) (v.toH1Function.grad x) ∂volume := by + have hsymm : + ∫ x in U, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) ∂volume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + have hneg : + -(∫ x in U, vecDot (G x) (u.toH1Function.grad x) ∂volume) = + -(∫ x in U, vecDot (h x) (v.toH1Function.grad x) ∂volume) := by + calc + -(∫ x in U, vecDot (G x) (u.toH1Function.grad x) ∂volume) = + sigma0 * ∫ x in U, + vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) ∂volume := + (hv u).symm + _ = sigma0 * ∫ x in U, + vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) ∂volume := by + rw [hsymm] + _ = -(∫ x in U, vecDot (h x) (v.toH1Function.grad x) ∂volume) := hu v + have hpair : + ∫ x in U, vecDot (G x) (u.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (h x) (v.toH1Function.grad x) ∂volume := + neg_injective hneg + calc + ∫ x in U, vecDot (u.toH1Function.grad x) (G x) ∂volume = + ∫ x in U, vecDot (G x) (u.toH1Function.grad x) ∂volume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + _ = _ := hpair + +/-- The same cross-pairing calculation on a centered cube with normalized +volume. This is the form consumed by the finite-exponent supplied-solution +predicate, so the below-two argument never needs to expose a normalization +cancellation to a caller. -/ +theorem centeredCube_scalarDivergence_cross_pairing + {d : ℕ} (m : ℤ) {sigma0 : ℝ} + (u v : H10Function (openCubeSet (originCube d m))) (h G : Vec d → Vec d) + (hu : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) + (hv : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (G x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) : + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + have hsymm : + ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + have hneg : + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + -(∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) := by + calc + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := (hv u).symm + _ = sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by rw [hsymm] + _ = -(∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) := hu v + have hpair : + ∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := neg_injective hneg + calc + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + _ = _ := hpair + +/-- The radial test field recovers the corresponding truncated gradient moment +under any measure. -/ +theorem integral_vecDot_vectorRadialTruncation_eq_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + (q : ℝ) (hq : 1 < q) (n : ℕ) (F : α → Vec d) : + ∫ x, vecDot (F x) (vectorRadialTruncation q n F x) ∂μ = + ∫ x, if euclideanNorm (F x) ≤ (n : ℝ) then + euclideanNorm (F x) ^ q else 0 ∂μ := by + apply integral_congr_ae + filter_upwards with x + rw [vecDot_comm] + exact vecDot_vectorRadialTruncation_self hq n F x + +/-- Uniform estimates for radial truncations imply the full ENNReal moment, +without presupposing the conclusion that the original field is in `L^q`. -/ +theorem lintegral_enorm_rpow_le_of_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ≥0∞} + (hF : AEStronglyMeasurable F μ) + (htrunc : ∀ n : ℕ, ∫⁻ x, truncatedMoment q n F x ∂μ ≤ A) : + (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ≤ A := by + rw [lintegral_enorm_rpow_eq_iSup_lintegral_truncatedMoment hF] + exact iSup_le htrunc + +/-- A uniform bound for radial truncations supplies the missing `L^q` +membership once its right-hand side is finite. -/ +theorem memLp_of_truncatedMoment_bound + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ≥0∞} + (hq : 0 < q) (hF : AEStronglyMeasurable F μ) + (hA : A ≠ ∞) + (htrunc : ∀ n : ℕ, ∫⁻ x, truncatedMoment q n F x ∂μ ≤ A) : + MemLp F (ENNReal.ofReal q) μ := by + refine ⟨hF, ?_⟩ + apply (eLpNorm_lt_top_iff_lintegral_rpow_enorm_lt_top + (ENNReal.ofReal_pos.mpr hq |>.ne') ENNReal.ofReal_ne_top).mpr + rw [ENNReal.toReal_ofReal hq.le] + have hmoment := lintegral_enorm_rpow_le_of_truncatedMoment hF htrunc + exact lt_top_iff_ne_top.mpr (ne_top_of_le_ne_top hA hmoment) + +/-- The corresponding direct norm consequence of the truncated-moment +estimate. -/ +theorem eLpNorm_le_rpow_of_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ≥0∞} + (hq : 0 < q) (hF : AEStronglyMeasurable F μ) + (htrunc : ∀ n : ℕ, ∫⁻ x, truncatedMoment q n F x ∂μ ≤ A) : + eLpNorm F (ENNReal.ofReal q) μ ≤ A ^ q⁻¹ := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (ENNReal.ofReal_pos.mpr hq |>.ne') ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal hq.le, one_div] + exact ENNReal.rpow_le_rpow + (lintegral_enorm_rpow_le_of_truncatedMoment hF htrunc) (inv_nonneg.mpr hq.le) + +/-- Hölder control of an integrable Euclidean dot-product integral, stated +with the real values of the two finite `eLpNorm`s. -/ +theorem abs_integral_vecDot_le_eLpNorm_toReal_mul + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {p r : ℝ≥0∞} [ENNReal.HolderConjugate p r] + {F G : α → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p μ) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) r μ) : + |∫ x, vecDot (F x) (G x) ∂μ| ≤ + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p μ).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (G x)) r μ).toReal := by + let f : α → ℝ := fun x => vecDot (F x) (G x) + have hfm' : AEStronglyMeasurable + (fun x => inner ℝ (HilbertVec.ofVec (F x)) (HilbertVec.ofVec (G x))) μ := + hF.aestronglyMeasurable.inner hG.aestronglyMeasurable + have hfLp' : MemLp + (fun x => inner ℝ (HilbertVec.ofVec (F x)) (HilbertVec.ofVec (G x))) 1 μ := by + refine MemLp.of_bilin (r := 1) + (b := fun x y : HilbertVec d => inner ℝ x y) (c := 1) hF hG hfm' ?_ + filter_upwards with x + simpa using! norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (F x)) (HilbertVec.ofVec (G x)) + have hfLp : MemLp f 1 μ := by + simpa only [f, HilbertVec.inner_def] using hfLp' + have hnorm : ENNReal.ofReal |∫ x, f x ∂μ| ≤ eLpNorm f 1 μ := by + simpa only [Real.enorm_eq_ofReal_abs] using + (enorm_integral_le_lintegral_enorm (μ := μ) f).trans_eq + eLpNorm_one_eq_lintegral_enorm.symm + have hholder : eLpNorm f 1 μ ≤ + eLpNorm (fun x => HilbertVec.ofVec (F x)) p μ * + eLpNorm (fun x => HilbertVec.ofVec (G x)) r μ := by + simpa only [f] using eLpNorm_vecDot_le_mul hF hG + have hright : + eLpNorm (fun x => HilbertVec.ofVec (F x)) p μ * + eLpNorm (fun x => HilbertVec.ofVec (G x)) r μ ≠ ∞ := + ENNReal.mul_ne_top hF.eLpNorm_ne_top hG.eLpNorm_ne_top + have htoReal := (ENNReal.toReal_le_toReal ENNReal.ofReal_ne_top hright).mpr + (hnorm.trans hholder) + simpa only [ENNReal.toReal_ofReal (abs_nonneg _), ENNReal.toReal_mul] using htoReal + +/-- Cancellation of one finite positive radial norm factor. -/ +private theorem rpow_sub_one_le_of_rpow_le_mul + {a b : ℝ≥0∞} {r : ℝ} (ha0 : a ≠ 0) (hatop : a ≠ ∞) + (h : a ^ r ≤ b * a) : + a ^ (r - 1) ≤ b := by + rw [ENNReal.rpow_sub r 1 ha0 hatop, ENNReal.rpow_one] + exact (ENNReal.div_le_iff ha0 hatop).mpr h + +/-- A real truncated-moment estimate transfers exactly to the ENNReal +truncation used in monotone convergence. -/ +theorem lintegral_truncatedMoment_eq_ofReal_integral + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {n : ℕ} + {k : α → ℝ} (hk : Integrable k μ) (hk0 : 0 ≤ᵐ[μ] k) + (hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal (k x) = truncatedMoment q n F x) : + ∫⁻ x, truncatedMoment q n F x ∂μ = ENNReal.ofReal (∫ x, k x ∂μ) := by + calc + ∫⁻ x, truncatedMoment q n F x ∂μ = + ∫⁻ x, ENNReal.ofReal (k x) ∂μ := by + apply lintegral_congr_ae + filter_upwards [hpoint] with x hx + exact hx.symm + _ = ENNReal.ofReal (∫ x, k x ∂μ) := + (ofReal_integral_eq_lintegral_ofReal hk hk0).symm + +/-- A uniform real bound for integrable radial moments gives the full +nonnegative ENNReal moment estimate. -/ +theorem lintegral_enorm_rpow_le_of_real_truncated_bound + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ} + (hF : AEStronglyMeasurable F μ) + (htrunc : ∀ n : ℕ, ∃ k : α → ℝ, Integrable k μ ∧ 0 ≤ᵐ[μ] k ∧ + (∀ᵐ x ∂μ, ENNReal.ofReal (k x) = truncatedMoment q n F x) ∧ + ∫ x, k x ∂μ ≤ A) : + (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ≤ ENNReal.ofReal A := by + apply lintegral_enorm_rpow_le_of_truncatedMoment hF + intro n + obtain ⟨k, hk, hk0, hpoint, hbound⟩ := htrunc n + rw [lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint] + exact ENNReal.ofReal_le_ofReal hbound + +/-- Package the radial truncation of a measurable vector field on a cube as +simultaneous normalized `L²` and conjugate-`L^p` data. -/ +noncomputable def cubeRadialTruncationL2LpField + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) + (F : Vec d → Vec d) + (hF : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (F x)) + (volumeMeasureOn (openCubeSet Q))) (n : ℕ) : + CubeEuclideanL2LpField Q q.conjugate := by + let G : Vec d → Vec d := vectorRadialTruncation q.exponent.toReal n F + letI : IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hraw : MemLp (hilbertRadialTruncation q.exponent.toReal n + (fun x ↦ HilbertVec.ofVec (F x))) q.conjugate.exponent + (volumeMeasureOn (openCubeSet Q)) := + memLp_hilbertRadialTruncation hqone n hF + have hraw2 : MemLp (hilbertRadialTruncation q.exponent.toReal n + (fun x ↦ HilbertVec.ofVec (F x))) 2 + (volumeMeasureOn (openCubeSet Q)) := + memLp_hilbertRadialTruncation hqone n hF + refine { toCubeEuclideanLpField := ⟨G, ?_⟩, euclideanMemL2 := ?_ } + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw.smul_measure ENNReal.ofReal_ne_top + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw2.smul_measure ENNReal.ofReal_ne_top + +/-- The field-generic radial truncation has the raw vector `L²` membership +required by the canonical adjoint solver. -/ +theorem cubeRadialTruncation_memVectorL2 + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) + (F : Vec d → Vec d) + (hF : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (F x)) + (volumeMeasureOn (openCubeSet Q))) (n : ℕ) : + MemVectorL2 (openCubeSet Q) + (cubeRadialTruncationL2LpField Q q F hF n).toField := by + let : IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + simpa only [cubeRadialTruncationL2LpField, vectorRadialTruncation, + HilbertVec.ofVec_toVec] using + memVectorL2_vectorRadialTruncation (openCubeSet Q) hqone n F hF + +/-- Package the radial truncation of the gradient of a centered-cube +`H¹₀` function as simultaneous normalized `L²` and conjugate-`L^p` data. -/ +noncomputable def centeredCube_radialTruncationL2LpField + {d : ℕ} [NeZero d] (m : ℤ) (q : FiniteLpExponent) + (u : H10Function (openCubeSet (originCube d m))) (n : ℕ) : + CubeEuclideanL2LpField (originCube d m) q.conjugate := by + let U : Set (Vec d) := openCubeSet (originCube d m) + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let F : Vec d → Vec d := u.toH1Function.grad + let G : Vec d → Vec d := vectorRadialTruncation q.exponent.toReal n F + letI : IsFiniteMeasure (volumeMeasureOn U) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + have hFraw : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (volumeMeasureOn U) := by + simpa only [F, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hraw : MemLp (hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (F x))) q.conjugate.exponent + (volumeMeasureOn U) := + memLp_hilbertRadialTruncation hqone n hFraw + have hraw2 : MemLp (hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (F x))) 2 (volumeMeasureOn U) := + memLp_hilbertRadialTruncation hqone n hFraw + refine { toCubeEuclideanLpField := ⟨G, ?_⟩, euclideanMemL2 := ?_ } + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw.smul_measure ENNReal.ofReal_ne_top + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw2.smul_measure ENNReal.ofReal_ne_top + +/-- The centered-cube radial truncation also has the raw vector `L²` +membership required by the canonical adjoint solver. -/ +theorem centeredCube_radialTruncation_memVectorL2 + {d : ℕ} [NeZero d] (m : ℤ) (q : FiniteLpExponent) + (u : H10Function (openCubeSet (originCube d m))) (n : ℕ) : + MemVectorL2 (openCubeSet (originCube d m)) + (centeredCube_radialTruncationL2LpField m q u n).toField := by + let U : Set (Vec d) := openCubeSet (originCube d m) + let F : Vec d → Vec d := u.toH1Function.grad + let : IsFiniteMeasure (volumeMeasureOn U) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + have hFraw : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (volumeMeasureOn U) := by + simpa only [F, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + simpa only [centeredCube_radialTruncationL2LpField, F, + vectorRadialTruncation, HilbertVec.ofVec_toVec] using + memVectorL2_vectorRadialTruncation U hqone n F hFraw + +/-- Two raw vector `L²` fields on a centered cube have an integrable dot +product for normalized cube volume. -/ +theorem centeredCube_integrable_vecDot_of_memVectorL2 + {d : ℕ} (m : ℤ) {F G : Vec d → Vec d} + (hF : MemVectorL2 (openCubeSet (originCube d m)) F) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + Integrable (fun x => vecDot (F x) (G x)) + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (integrableOn_vecDot_of_memVectorL2 hF hG).smul_measure + ENNReal.ofReal_ne_top + +/-- The radial vector pairing is the corresponding ENNReal truncated moment. -/ +theorem ofReal_vecDot_vectorRadialTruncation_eq_truncatedMoment + {α : Type*} {d : ℕ} {q : ℝ} (hq : 1 < q) (n : ℕ) + (F : α → Vec d) (x : α) : + ENNReal.ofReal (vecDot (F x) (vectorRadialTruncation q n F x)) = + truncatedMoment q n (fun y => HilbertVec.ofVec (F y)) x := by + rw [vecDot_comm, vecDot_vectorRadialTruncation_self hq n F] + by_cases hx : euclideanNorm (F x) ≤ (n : ℝ) + · have hx' : ‖HilbertVec.ofVec (F x)‖ ≤ (n : ℝ) := by + simpa only [euclideanNorm_eq_norm_ofVec] using hx + have hxmem : x ∈ {y | ‖HilbertVec.ofVec (F y)‖ ≤ (n : ℝ)} := hx' + rw [if_pos hx, truncatedMoment, Set.indicator_of_mem hxmem] + have hq0 : 0 ≤ q := by linarith + rw [← ofReal_norm (HilbertVec.ofVec (F x))] + simpa only [euclideanNorm_eq_norm_ofVec] using + (ENNReal.ofReal_rpow_of_nonneg + (norm_nonneg (HilbertVec.ofVec (F x))) hq0).symm + · have hx' : ¬ ‖HilbertVec.ofVec (F x)‖ ≤ (n : ℝ) := by + simpa only [euclideanNorm_eq_norm_ofVec] using hx + have hxmem : x ∉ {y | ‖HilbertVec.ofVec (F y)‖ ≤ (n : ℝ)} := hx' + rw [if_neg hx, truncatedMoment, Set.indicator_of_notMem hxmem] + exact ENNReal.ofReal_zero + +/-- The conjugate norm of a radial truncation has exactly the original +truncated moment as its power. -/ +theorem eLpNorm_hilbertRadialTruncation_rpow_conjugate_eq_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + (q : FiniteLpExponent) (n : ℕ) (F : α → HilbertVec d) : + (eLpNorm (hilbertRadialTruncation q.exponent.toReal n F) + q.conjugate.exponent μ) ^ q.conjugate.exponent.toReal = + ∫⁻ x, truncatedMoment q.exponent.toReal n F x ∂μ := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) q.conjugate.lt_top.ne, + ← ENNReal.rpow_mul] + have hqnonzero : q.conjugate.exponent.toReal ≠ 0 := by + exact ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) q.conjugate.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hqnonzero, ENNReal.rpow_one] + apply lintegral_congr + intro x + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg, + norm_hilbertRadialTruncation_rpow_conjugate] + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · have hxmem : x ∈ {y | ‖F y‖ ≤ (n : ℝ)} := hx + rw [if_pos hx, truncatedMoment, Set.indicator_of_mem hxmem] + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] + · have hxmem : x ∉ {y | ‖F y‖ ≤ (n : ℝ)} := hx + rw [if_neg hx, truncatedMoment, Set.indicator_of_notMem hxmem] + exact ENNReal.ofReal_zero + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +/-- The canonical raw-adjoint solver also satisfies the centered-cube +volume-normalized weak equation. This is a one-way transport: it merely +scales both sides and therefore requires neither a cancellation argument nor +an additional nonzero hypothesis. -/ +theorem openCubeSetScalarDivergenceSolution_normalized_weak + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (openCubeSet (originCube d m)) G) + (psi : H10Function (openCubeSet (originCube d m))) : + sigma0 * ∫ x, + vecDot + ((openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (G x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume, + integral_smul_measure, integral_smul_measure, smul_eq_mul, smul_eq_mul] + calc + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot + ((openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) ∂volume) = + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot + ((openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) ∂volume) := by + ring + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-(∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume)) := by + rw [openCubeSetScalarDivergenceSolution_weak] + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume) := by + ring + +/-- Specialization of `scalarDivergence_cross_pairing` to the canonical cube +adjoint. The supplied solution is deliberately represented only by its raw +weak equation, which lets the finite-`q` endpoint derive that fact internally +from its own normalized predicate. -/ +theorem openCubeSetScalarDivergenceSolution_cross_pairing + {d : ℕ} [NeZero d] (Q : TriadicCube d) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet Q)) (h G : Vec d → Vec d) + (hu : ∀ psi : H10Function (openCubeSet Q), + sigma0 * ∫ x in openCubeSet Q, + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet Q, vecDot (h x) (psi.toH1Function.grad x) ∂volume) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in openCubeSet Q, vecDot (u.toH1Function.grad x) (G x) ∂volume = + ∫ x in openCubeSet Q, + vecDot (h x) + ((openCubeSetScalarDivergenceSolution Q hsigma0 G hG).toH1Function.grad x) ∂volume := by + exact scalarDivergence_cross_pairing u + (openCubeSetScalarDivergenceSolution Q hsigma0 G hG) h G hu + (openCubeSetScalarDivergenceSolution_weak Q hsigma0 G hG) + +/-- The canonical adjoint cross-pairing directly on the normalized centered +cube. This combines the supplied normalized weak equation with the canonical +normalized adjoint equation and is the exact bridge for the `q < 2` proof. -/ +theorem openCubeSetScalarDivergenceSolution_normalized_cross_pairing + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) (h G : Vec d → Vec d) + (hu : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) + ((openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hG).toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + exact centeredCube_scalarDivergence_cross_pairing m u + (openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hG) h G hu + (openCubeSetScalarDivergenceSolution_normalized_weak m hsigma0 G hG) + +/-- The radial-truncation bootstrap: an estimate with one conjugate-norm +factor on the right already gives the desired `L^q` bound. -/ +theorem eLpNorm_le_of_truncated_cross_bound + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ≥0∞} + (hq : 1 < q) (hF : AEStronglyMeasurable F μ) + (htrunc : ∀ n : ℕ, + (∫⁻ x, truncatedMoment q n F x ∂μ) ≠ ∞ ∧ + (∫⁻ x, truncatedMoment q n F x ∂μ) ≤ + A * (∫⁻ x, truncatedMoment q n F x ∂μ) ^ (1 - q⁻¹)) : + eLpNorm F (ENNReal.ofReal q) μ ≤ A := by + have root_le_of_le_mul_rpow : ∀ {J A : ℝ≥0∞}, J ≠ ∞ → + J ≤ A * J ^ (1 - q⁻¹) → J ≤ A ^ q := by + intro J B hJtop hJ + by_cases hJzero : J = 0 + · rw [hJzero] + exact bot_le + have hJpos : 0 < J := lt_of_le_of_ne bot_le (Ne.symm hJzero) + have hepos : 0 < 1 - q⁻¹ := sub_pos.mpr (inv_lt_one_of_one_lt₀ hq) + have he : 0 ≤ 1 - q⁻¹ := hepos.le + have hBpos : 0 < J ^ (1 - q⁻¹) := ENNReal.rpow_pos hJpos hJtop + have hBtop : J ^ (1 - q⁻¹) ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg he hJtop + have hfac : J = J ^ (1 - q⁻¹) * J ^ q⁻¹ := by + rw [← ENNReal.rpow_add_of_nonneg _ _ he + (inv_nonneg.mpr (by linarith : 0 ≤ q))] + have hsum : (1 - q⁻¹) + q⁻¹ = 1 := by ring + rw [hsum, ENNReal.rpow_one] + have hroot : J ^ q⁻¹ ≤ B := by + apply (ENNReal.mul_le_mul_iff_left hBpos.ne' hBtop).mp + calc + J ^ q⁻¹ * J ^ (1 - q⁻¹) = J ^ (1 - q⁻¹) * J ^ q⁻¹ := mul_comm _ _ + _ = J := hfac.symm + _ ≤ B * J ^ (1 - q⁻¹) := hJ + have hq0 : q ≠ 0 := by linarith + calc + J = (J ^ q⁻¹) ^ q := by + rw [← ENNReal.rpow_mul, inv_mul_cancel₀ hq0, ENNReal.rpow_one] + _ ≤ B ^ q := ENNReal.rpow_le_rpow hroot (by linarith) + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (ENNReal.ofReal_pos.mpr (by linarith : 0 < q) |>.ne') ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal (by linarith : 0 ≤ q)] + have hmoment : (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ≤ A ^ q := by + rw [lintegral_enorm_rpow_eq_iSup_lintegral_truncatedMoment hF] + apply iSup_le + intro n + exact root_le_of_le_mul_rpow (htrunc n).1 (htrunc n).2 + calc + (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ^ (1 / q) ≤ (A ^ q) ^ (1 / q) := + ENNReal.rpow_le_rpow hmoment (by positivity) + _ = A := by + rw [show (1 / q : ℝ) = q⁻¹ by ring, ← ENNReal.rpow_mul] + have hq0 : q ≠ 0 := by linarith + rw [mul_inv_cancel₀ hq0, ENNReal.rpow_one] + +/-- A truncated moment is finite whenever the full positive moment is finite. -/ +theorem truncatedMoment_ne_top_of_memLp + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} + (hq : 0 < q) (hF : MemLp F (ENNReal.ofReal q) μ) (n : ℕ) : + (∫⁻ x, truncatedMoment q n F x ∂μ) ≠ ∞ := by + apply ne_top_of_le_ne_top + ((MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (ENNReal.ofReal_pos.mpr hq |>.ne') ENNReal.ofReal_ne_top + hF.eLpNorm_lt_top).ne) + rw [ENNReal.toReal_ofReal hq.le] + apply MeasureTheory.lintegral_mono + intro x + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · simp [truncatedMoment, hx] + · simp [truncatedMoment, hx] + +private theorem centeredCube_memLp_hilbertGradient_two + {d : ℕ} {m : ℤ} (u : H10Function (openCubeSet (originCube d m))) : + MemLp (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only using centeredCube_normalizedVolume_eq_smul_openCubeVolume m] + exact (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).smul_measure ENNReal.ofReal_ne_top + +end INTERNAL + +/-- Internal duality branch of the supplied-solution cube CZ estimate. -/ +private theorem centeredCubeH10ScalarDivergence_cz_of_one_lt_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanL2LpField (originCube d m) q) + (u : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz_of_two_lt d + q.conjugate (INTERNAL.conjugate_toReal_gt_two_of_lt_two q hq) + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let F : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let H : Vec d → HilbertVec d := hilbertifyVecField h.toField + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hFtwo : MemLp F 2 μ := by + simpa only [F, μ] using INTERNAL.centeredCube_memLp_hilbertGradient_two u + have hHq : MemLp H q.exponent μ := by + simpa only [H, μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hFmeas : AEStronglyMeasurable F μ := hFtwo.aestronglyMeasurable + let A : ℝ≥0∞ := C * (ENNReal.ofReal sigma0)⁻¹ * eLpNorm H q.exponent μ + have hmain : eLpNorm F q.exponent μ ≤ A := by + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + apply INTERNAL.eLpNorm_le_of_truncated_cross_bound hqreal hFmeas + intro n + let Gfield := INTERNAL.centeredCube_radialTruncationL2LpField m q u n + let G : Vec d → Vec d := Gfield.toField + let v := openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G + (INTERNAL.centeredCube_radialTruncation_memVectorL2 m q u n) + have hGtwo : MemVectorL2 (openCubeSet (originCube d m)) G := by + simpa only [G, Gfield] using + INTERNAL.centeredCube_radialTruncation_memVectorL2 m q u n + have hk : Integrable (fun x => vecDot (u.toH1Function.grad x) (G x)) μ := by + simpa only [μ] using INTERNAL.centeredCube_integrable_vecDot_of_memVectorL2 m + u.toH1Function.grad_memVectorL2 hGtwo + have hk0 : 0 ≤ᵐ[μ] fun x => vecDot (u.toH1Function.grad x) (G x) := by + filter_upwards with x + change 0 ≤ vecDot (u.toH1Function.grad x) + (INTERNAL.vectorRadialTruncation q.exponent.toReal n u.toH1Function.grad x) + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self hqreal] + split_ifs with hx + · exact Real.rpow_nonneg (euclideanNorm_nonneg _) _ + · exact le_rfl + have hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal + (vecDot (u.toH1Function.grad x) (G x)) = + INTERNAL.truncatedMoment q.exponent.toReal n F x := by + filter_upwards with x + simpa only [F, G, Gfield] using! + INTERNAL.ofReal_vecDot_vectorRadialTruncation_eq_truncatedMoment + hqreal n u.toH1Function.grad x + have hJ : (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := + INTERNAL.lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint + refine ⟨?_, ?_⟩ + · rw [hJ] + exact ENNReal.ofReal_ne_top + have hvsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 v + Gfield.toLpTwo := by + intro psi + simpa only [v, G, Gfield] using! + INTERNAL.openCubeSetScalarDivergenceSolution_normalized_weak m hsigma0 G hGtwo psi + have hvbound := hC m sigma0 Gfield v hsigma0 hvsolution + have hGq : MemLp (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [μ, G, Gfield, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! Gfield.euclideanMemLp + have hVtwo : MemLp (hilbertifyVecField v.toH1Function.grad) 2 μ := by + simpa only [v, μ] using INTERNAL.centeredCube_memLp_hilbertGradient_two v + have hVbound : eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, μ, v, G, Gfield, hilbertifyVecField] using! hvbound + have hVq : MemLp (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + refine ⟨hVtwo.aestronglyMeasurable, ?_⟩ + apply lt_of_le_of_lt hVbound + apply ENNReal.mul_lt_top + · exact (ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0)))).lt_top + · exact hGq.eLpNorm_lt_top + have huweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂μ = + -∫ x, vecDot (h.toField x) (psi.toH1Function.grad x) ∂μ := by + intro psi + simpa only [μ] using! hsolution psi + have hcross := INTERNAL.openCubeSetScalarDivergenceSolution_normalized_cross_pairing + m hsigma0 u h.toField G huweak hGtwo + have hholder := INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul + (F := h.toField) (G := v.toH1Function.grad) hHq hVq + have hGmoment : (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) ^ + q.conjugate.exponent.toReal = + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ := by + simpa only [μ, F, G, Gfield, hilbertifyVecField] using! + INTERNAL.eLpNorm_hilbertRadialTruncation_rpow_conjugate_eq_truncatedMoment q n F + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hqreal + have hexp : (q.conjugate.exponent.toReal)⁻¹ = 1 - q.exponent.toReal⁻¹ := by + have hsum := hreal.one_div_add_one_div + rw [one_div] at hsum + norm_num at hsum + linarith + have hGnorm : eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + have hr0 : q.conjugate.exponent.toReal ≠ 0 := by + exact ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne |>.ne' + calc + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ ^ + q.conjugate.exponent.toReal) ^ (q.conjugate.exponent.toReal)⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hr0, ENNReal.rpow_one] + _ = (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (q.conjugate.exponent.toReal)⁻¹ := by rw [hGmoment] + _ = _ := by rw [hexp] + calc + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := hJ + _ = + ENNReal.ofReal (∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ) := by + rw [hcross] + _ ≤ ENNReal.ofReal |∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ| := + ENNReal.ofReal_le_ofReal (le_abs_self _) + _ ≤ ENNReal.ofReal ((eLpNorm H q.exponent μ).toReal * + (eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ).toReal) := ENNReal.ofReal_le_ofReal hholder + _ = eLpNorm H q.exponent μ * + eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + rw [ENNReal.ofReal_mul ENNReal.toReal_nonneg, + ENNReal.ofReal_toReal hHq.eLpNorm_lt_top.ne, + ENNReal.ofReal_toReal hVq.eLpNorm_lt_top.ne] + _ ≤ eLpNorm H q.exponent μ * + (C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) := by + gcongr + _ = A * (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + rw [hGnorm] + dsimp only [A] + ac_rfl + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, F, H, μ, A] using! hmain + +/-- The supplied-solution cube Calderón--Zygmund estimate for every finite +exponent. The `q<2` branch is obtained by adjoint duality, the `q=2` branch +is the energy estimate, and the `q>2` branch is the good-`λ` theorem. -/ +theorem centeredCubeH10ScalarDivergence_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanL2LpField (originCube d m) q) + (u : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + by_cases hlt : q.exponent.toReal < 2 + · exact centeredCubeH10ScalarDivergence_cz_of_one_lt_of_lt_two d q hlt + by_cases hgt : 2 < q.exponent.toReal + · exact centeredCubeH10ScalarDivergence_cz_of_two_lt d q hgt + have hreal : q.exponent.toReal = 2 := le_antisymm (le_of_not_gt hgt) (le_of_not_gt hlt) + have hexp : q.exponent = 2 := by + apply (ENNReal.toReal_eq_toReal_iff' q.lt_top.ne (by norm_num)).mp + simpa only [ENNReal.toReal_ofNat] using hreal + have hq : q = FiniteLpExponent.two := by + cases q + simp only [FiniteLpExponent.two] at hexp ⊢ + cases hexp + rfl + subst q + refine ⟨1, by norm_num, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + simpa only [one_mul] using + centeredCubeH10ScalarDivergence_cz_two m sigma0 h u hsigma0 hsolution + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDataDensity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDataDensity.lean new file mode 100644 index 0000000000..5cebcea900 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDataDensity.lean @@ -0,0 +1,133 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import Mathlib.MeasureTheory.Function.ContinuousMapDense + +/-! +# Bounded `L² ∩ Lᵖ` approximation of cube data + +Every finite-exponent cube datum admits bounded continuous approximants on the +same normalized cube measure. Boundedness supplies the additional `L²` +membership required by the supplied-solution Calderón--Zygmund theorem. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private noncomputable def boundedApproximation + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : + BoundedContinuousFunction (Vec d) (HilbertVec d) := + Classical.choose (h.euclideanMemLp.exists_boundedContinuous_eLpNorm_sub_le + q.lt_top.ne (ε := ((n : ℝ≥0∞) + 1)⁻¹) (by simp)) + +private theorem boundedApproximation_memLp + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : + MemLp (boundedApproximation h n) q.exponent (normalizedCubeMeasure Q) := + (Classical.choose_spec (h.euclideanMemLp.exists_boundedContinuous_eLpNorm_sub_le + q.lt_top.ne (ε := ((n : ℝ≥0∞) + 1)⁻¹) (by simp))).2 + +private theorem eLpNorm_sub_boundedApproximation_le + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : + eLpNorm (fun x => HilbertVec.ofVec (h.toField x) - boundedApproximation h n x) + q.exponent (normalizedCubeMeasure Q) ≤ ((n : ℝ≥0∞) + 1)⁻¹ := + (Classical.choose_spec (h.euclideanMemLp.exists_boundedContinuous_eLpNorm_sub_le + q.lt_top.ne (ε := ((n : ℝ≥0∞) + 1)⁻¹) (by simp))).1 + +private theorem boundedApproximation_memLp_two + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : + MemLp (boundedApproximation h n) 2 (normalizedCubeMeasure Q) := by + let : IsProbabilityMeasure (normalizedCubeMeasure Q) := + ⟨normalizedCubeMeasure_apply_univ Q⟩ + rcases (boundedApproximation h n).bounded with ⟨C, hC⟩ + have hbound : ∀ x : Vec d, + ‖boundedApproximation h n x‖ ≤ C + ‖boundedApproximation h n 0‖ := by + intro x + calc + ‖boundedApproximation h n x‖ = dist (boundedApproximation h n x) 0 := by + rw [dist_zero_right] + _ ≤ dist (boundedApproximation h n x) (boundedApproximation h n 0) + + dist (boundedApproximation h n 0) 0 := + dist_triangle _ _ _ + _ ≤ C + ‖boundedApproximation h n 0‖ := by + rw [dist_zero_right] + gcongr + exact hC x 0 + exact MemLp.of_bound (boundedApproximation h n).continuous.aestronglyMeasurable + (C + ‖boundedApproximation h n 0‖) (Eventually.of_forall hbound) + +/-- A bounded continuous approximation of an arbitrary finite-exponent cube +datum, bundled with the internally derived `L²` membership. -/ +noncomputable def finiteLpDataApproximation + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : CubeEuclideanL2LpField Q q where + toField := fun x => (boundedApproximation h n x).toVec + euclideanMemLp := by + simpa only [HilbertVec.ofVec_toVec] using boundedApproximation_memLp h n + euclideanMemL2 := by + simpa only [HilbertVec.ofVec_toVec] using boundedApproximation_memLp_two h n + +@[simp] private theorem finiteLpDataApproximation_toField + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) (n : ℕ) : + (finiteLpDataApproximation h n).toField = fun x => (boundedApproximation h n x).toVec := + rfl + +/-- The bounded `L² ∩ Lᵖ` cube-data approximants converge in the exact +normalized Euclidean `L^p` extended norm. -/ +theorem tendsto_eLpNorm_sub_finiteLpDataApproximation + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) : + Tendsto (fun n => eLpNorm + (fun x => HilbertVec.ofVec (h.toField x - (finiteLpDataApproximation h n).toField x)) + q.exponent (normalizedCubeMeasure Q)) atTop (nhds 0) := by + have hbound : ∀ n, + eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h n).toField x)) + q.exponent (normalizedCubeMeasure Q) ≤ ((n : ℝ≥0∞) + 1)⁻¹ := by + intro n + calc + eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h n).toField x)) + q.exponent (normalizedCubeMeasure Q) = + eLpNorm (fun x => HilbertVec.ofVec (h.toField x) - boundedApproximation h n x) + q.exponent (normalizedCubeMeasure Q) := by + apply eLpNorm_congr_ae + filter_upwards with x + rw [finiteLpDataApproximation_toField] + change (HilbertVec.ofVecL d) (h.toField x - (boundedApproximation h n x).toVec) = _ + simpa only [HilbertVec.ofVecL_apply] using + (HilbertVec.ofVecL d).map_sub (h.toField x) (boundedApproximation h n x).toVec + _ ≤ _ := eLpNorm_sub_boundedApproximation_le h n + have hzero : Tendsto (fun n : ℕ => ((n : ℝ≥0∞) + 1)⁻¹) atTop (nhds 0) := by + have hshift : Tendsto (fun n : ℕ => n + 1) atTop atTop := by + refine tendsto_atTop.2 fun b => ?_ + filter_upwards [eventually_ge_atTop b] with n hn + omega + have hinv : Tendsto (fun n : ℕ => (((n + 1 : ℕ) : ℝ≥0∞)⁻¹)) atTop (nhds 0) := + ENNReal.tendsto_inv_nat_nhds_zero.comp hshift + simpa only [Nat.cast_add, Nat.cast_one] using hinv + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hzero + (fun _ => bot_le) hbound + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDuality.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDuality.lean new file mode 100644 index 0000000000..1354da71d2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpDuality.lean @@ -0,0 +1,295 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H10Adjoint + +/-! +# Finite-exponent duality support for cube Calderón--Zygmund estimates + +This file contains the measure-theoretic support for the `1 < q < 2` duality +step. It deliberately does not state a Calderón--Zygmund estimate: it only +packages the radial truncations, Hölder pairing, and monotone-convergence +facts that will be consumed once the supplied-solution `q > 2` estimate is +available. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund +namespace INTERNAL + +/-- If a finite exponent lies strictly between one and two, its finite Hölder +conjugate is strictly bigger than two. -/ +theorem conjugate_toReal_gt_two_of_lt_two (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + 2 < q.conjugate.exponent.toReal := by + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hq1 : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hq1 + rw [hreal.conjugate_eq] + apply (lt_div_iff₀ (sub_pos.mpr hq1)).2 + nlinarith + +/-- The bounded radial test field used in the `q < 2` duality argument. The +cutoff is by the Euclidean Hilbert norm, so the field remains a valid datum for +the `H¹₀` adjoint solver. -/ +def hilbertRadialTruncation {α : Type*} {d : ℕ} (q : ℝ) (n : ℕ) + (F : α → HilbertVec d) : α → HilbertVec d := + Set.indicator {x | ‖F x‖ ≤ (n : ℝ)} (fun x => ‖F x‖ ^ (q - 2) • F x) + +/-- The algebraic-vector spelling of `hilbertRadialTruncation`, suitable for +the divergence solver API. -/ +def vectorRadialTruncation {α : Type*} {d : ℕ} (q : ℝ) (n : ℕ) + (F : α → Vec d) : α → Vec d := + fun x => (hilbertRadialTruncation q n (fun y => HilbertVec.ofVec (F y)) x).toVec + +private theorem nullMeasurableSet_norm_le {α : Type*} {d : ℕ} + [MeasurableSpace α] {μ : Measure α} {F : α → HilbertVec d} + (hF : AEStronglyMeasurable F μ) (n : ℕ) : + NullMeasurableSet {x | ‖F x‖ ≤ (n : ℝ)} μ := by + change NullMeasurableSet ((fun x => ‖F x‖) ⁻¹' Set.Iic (n : ℝ)) μ + exact hF.norm.aemeasurable.nullMeasurableSet_preimage measurableSet_Iic + +/-- The radial truncation is a.e. strongly measurable. -/ +theorem aestronglyMeasurable_hilbertRadialTruncation {α : Type*} {d : ℕ} + [MeasurableSpace α] {μ : Measure α} {q : ℝ} {n : ℕ} + {F : α → HilbertVec d} (hF : AEStronglyMeasurable F μ) : + AEStronglyMeasurable (hilbertRadialTruncation q n F) μ := by + apply AEStronglyMeasurable.indicator₀ + · exact (hF.norm.aemeasurable.pow_const (q - 2)).aestronglyMeasurable.smul hF + · exact nullMeasurableSet_norm_le hF n + +/-- Pointwise Euclidean norm identity for the bounded radial test field. -/ +theorem norm_hilbertRadialTruncation {α : Type*} {d : ℕ} {q : ℝ} + (hq : 1 < q) (n : ℕ) (F : α → HilbertVec d) (x : α) : + ‖hilbertRadialTruncation q n F x‖ = + if ‖F x‖ ≤ (n : ℝ) then ‖F x‖ ^ (q - 1) else 0 := by + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · rw [show hilbertRadialTruncation q n F x = + ‖F x‖ ^ (q - 2) • F x by + simp [hilbertRadialTruncation, hx]] + rw [norm_smul, Real.norm_eq_abs, + abs_of_nonneg (Real.rpow_nonneg (norm_nonneg _) _)] + simp only [if_pos hx] + calc + ‖F x‖ ^ (q - 2) * ‖F x‖ = + ‖F x‖ ^ (q - 2) * ‖F x‖ ^ (1 : ℝ) := by + rw [Real.rpow_one] + _ = ‖F x‖ ^ ((q - 2) + 1) := + (Real.rpow_add' (norm_nonneg _) (by nlinarith [hq])).symm + _ = ‖F x‖ ^ (q - 1) := by + congr 1 + ring + · rw [show hilbertRadialTruncation q n F x = 0 by + simp [hilbertRadialTruncation, hx]] + simp [hx] + +/-- Pairing the radial test field with the original field recovers the +truncated `q`-power. -/ +theorem inner_hilbertRadialTruncation_self {α : Type*} {d : ℕ} {q : ℝ} + (hq : 1 < q) (n : ℕ) (F : α → HilbertVec d) (x : α) : + inner ℝ (hilbertRadialTruncation q n F x) (F x) = + if ‖F x‖ ≤ (n : ℝ) then ‖F x‖ ^ q else 0 := by + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · rw [show hilbertRadialTruncation q n F x = + ‖F x‖ ^ (q - 2) • F x by + simp [hilbertRadialTruncation, hx]] + rw [real_inner_smul_left, real_inner_self_eq_norm_sq] + simp only [if_pos hx] + rw [← Real.rpow_natCast] + calc + ‖F x‖ ^ (q - 2) * ‖F x‖ ^ (2 : ℝ) = ‖F x‖ ^ ((q - 2) + 2) := + (Real.rpow_add' (norm_nonneg _) (by + intro h + norm_num at h + linarith)).symm + _ = ‖F x‖ ^ q := by + congr 1 + ring + · rw [show hilbertRadialTruncation q n F x = 0 by + simp [hilbertRadialTruncation, hx]] + simp [hx] + +/-- Raising the radial test field's norm to the Hölder-conjugate exponent +recovers the same truncated `q`-power. -/ +theorem norm_hilbertRadialTruncation_rpow_conjugate {α : Type*} {d : ℕ} + (q : FiniteLpExponent) (n : ℕ) + (F : α → HilbertVec d) (x : α) : + ‖hilbertRadialTruncation q.exponent.toReal n F x‖ ^ + q.conjugate.exponent.toReal = + if ‖F x‖ ≤ (n : ℝ) then ‖F x‖ ^ q.exponent.toReal else 0 := by + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hq1 : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hq1 + rw [norm_hilbertRadialTruncation hq1] + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · simp only [if_pos hx] + rw [← Real.rpow_mul (norm_nonneg _)] + congr 1 + exact hreal.sub_one_mul_conj + · simp only [if_neg hx] + exact Real.zero_rpow hreal.symm.pos.ne' + +/-- The algebraic-vector version of the radial pairing identity. -/ +theorem vecDot_vectorRadialTruncation_self {α : Type*} {d : ℕ} {q : ℝ} + (hq : 1 < q) (n : ℕ) (F : α → Vec d) (x : α) : + vecDot (vectorRadialTruncation q n F x) (F x) = + if euclideanNorm (F x) ≤ (n : ℝ) then euclideanNorm (F x) ^ q else 0 := by + simpa [vectorRadialTruncation, euclideanNorm_eq_norm_ofVec, HilbertVec.inner_def] using + inner_hilbertRadialTruncation_self hq n (fun y => HilbertVec.ofVec (F y)) x + +/-- Vector-valued Hölder, in the exact `eLpNorm` form needed to bound the +cross weak pairing in the low-exponent duality argument. -/ +theorem eLpNorm_vecDot_le_mul {α : Type*} {d : ℕ} [MeasurableSpace α] + {μ : Measure α} {p r : ℝ≥0∞} [ENNReal.HolderConjugate p r] + {F G : α → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p μ) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) r μ) : + eLpNorm (fun x => vecDot (F x) (G x)) 1 μ ≤ + eLpNorm (fun x => HilbertVec.ofVec (F x)) p μ * + eLpNorm (fun x => HilbertVec.ofVec (G x)) r μ := by + simpa [HilbertVec.inner_def] using + (eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (fun x y : HilbertVec d => inner ℝ x y) 1 (by fun_prop) + hF.aestronglyMeasurable hG.aestronglyMeasurable + (Filter.Eventually.of_forall (fun x => by + simpa using! norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (F x)) (HilbertVec.ofVec (G x))))) + +/-- The bounded radial test field has the expected uniform pointwise bound. -/ +theorem norm_hilbertRadialTruncation_le {α : Type*} {d : ℕ} {q : ℝ} + (hq : 1 < q) (n : ℕ) (F : α → HilbertVec d) (x : α) : + ‖hilbertRadialTruncation q n F x‖ ≤ (n : ℝ) ^ (q - 1) := by + rw [norm_hilbertRadialTruncation hq] + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · rw [if_pos hx] + exact Real.rpow_le_rpow (norm_nonneg _) hx (sub_pos.mpr hq).le + · rw [if_neg hx] + exact Real.rpow_nonneg (Nat.cast_nonneg n) _ + +/-- On a finite measure, every radial truncation belongs to every finite +`Lᵖ` space, in particular to `L²` and to the conjugate exponent. -/ +theorem memLp_hilbertRadialTruncation {α : Type*} {d : ℕ} + [MeasurableSpace α] {μ : Measure α} [IsFiniteMeasure μ] + {p : ℝ≥0∞} {q : ℝ} (hq : 1 < q) (n : ℕ) + {F : α → HilbertVec d} (hF : AEStronglyMeasurable F μ) : + MemLp (hilbertRadialTruncation q n F) p μ := + MemLp.of_bound (aestronglyMeasurable_hilbertRadialTruncation hF) + ((n : ℝ) ^ (q - 1)) + (Filter.Eventually.of_forall (norm_hilbertRadialTruncation_le hq n F)) + +/-- The algebraic-vector radial truncation is a.e. strongly measurable. -/ +theorem aestronglyMeasurable_vectorRadialTruncation {α : Type*} {d : ℕ} + [MeasurableSpace α] {μ : Measure α} {q : ℝ} {n : ℕ} + {F : α → Vec d} + (hF : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) μ) : + AEStronglyMeasurable (vectorRadialTruncation q n F) μ := by + let G : α → HilbertVec d := fun x => HilbertVec.ofVec (F x) + have hG : AEStronglyMeasurable (hilbertRadialTruncation q n G) μ := + aestronglyMeasurable_hilbertRadialTruncation hF + simpa only [vectorRadialTruncation, G, HilbertVec.continuousLinearEquivVec_apply] + using! (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable hG + +/-- The vector radial truncation has a direct `L²` membership form for the +adjoint divergence solver. -/ +theorem memVectorL2_vectorRadialTruncation {d : ℕ} (U : Set (Vec d)) + [IsFiniteMeasure (volumeMeasureOn U)] {q : ℝ} (hq : 1 < q) (n : ℕ) + (F : Vec d → Vec d) + (hF : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (volumeMeasureOn U)) : + MemVectorL2 U (vectorRadialTruncation q n F) := by + apply MemLp.of_bound (aestronglyMeasurable_vectorRadialTruncation hF) + ((n : ℝ) ^ (q - 1)) + apply Filter.Eventually.of_forall + intro x + calc + ‖vectorRadialTruncation q n F x‖ ≤ + ‖HilbertVec.ofVec (vectorRadialTruncation q n F x)‖ := + HilbertVec.norm_toVec_le_norm _ + _ = ‖hilbertRadialTruncation q n (fun y => HilbertVec.ofVec (F y)) x‖ := by + simp only [vectorRadialTruncation, HilbertVec.ofVec_toVec] + _ ≤ _ := norm_hilbertRadialTruncation_le hq n _ x + +/-- The truncated `q`-moment integrand used for monotone convergence. -/ +def truncatedMoment {α : Type*} {d : ℕ} (q : ℝ) (n : ℕ) + (F : α → HilbertVec d) : α → ℝ≥0∞ := + Set.indicator {x | ‖F x‖ ≤ (n : ℝ)} (fun x => ‖F x‖ₑ ^ q) + +/-- The truncated moment integrands are a.e. measurable. -/ +theorem aemeasurable_truncatedMoment {α : Type*} {d : ℕ} + [MeasurableSpace α] {μ : Measure α} {q : ℝ} {n : ℕ} + {F : α → HilbertVec d} (hF : AEStronglyMeasurable F μ) : + AEMeasurable (truncatedMoment q n F) μ := by + apply AEMeasurable.indicator₀ + · exact (hF.enorm.pow_const q) + · exact nullMeasurableSet_norm_le hF n + +/-- At each point, increasing the truncation level increases the truncated +moment, provided the moment exponent is nonnegative. -/ +theorem monotone_truncatedMoment {α : Type*} {d : ℕ} {q : ℝ} + (F : α → HilbertVec d) (x : α) : + Monotone (fun n : ℕ => truncatedMoment q n F x) := by + intro m n hmn + by_cases hn : ‖F x‖ ≤ (n : ℝ) + · by_cases hm : ‖F x‖ ≤ (m : ℝ) + · simp [truncatedMoment, hm, hn] + · have hnm : (m : ℝ) ≤ n := by exact_mod_cast hmn + have hnot : ¬ ‖F x‖ ≤ (m : ℝ) := hm + simp [truncatedMoment, hnot, hn] + · have hnot : ¬ ‖F x‖ ≤ (m : ℝ) := by + intro hm + apply hn + exact hm.trans (by exact_mod_cast hmn) + simp [truncatedMoment, hnot, hn] + +/-- The pointwise supremum of all truncated moments is the full moment. -/ +theorem iSup_truncatedMoment_eq_enorm_rpow {α : Type*} {d : ℕ} {q : ℝ} + (F : α → HilbertVec d) (x : α) : + (⨆ n : ℕ, truncatedMoment q n F x) = ‖F x‖ₑ ^ q := by + apply le_antisymm + · apply iSup_le + intro n + by_cases hn : ‖F x‖ ≤ (n : ℝ) + · simp [truncatedMoment, hn] + · simp [truncatedMoment, hn] + · obtain ⟨n, hn⟩ := exists_nat_ge ‖F x‖ + exact le_iSup_of_le n (by simp [truncatedMoment, hn]) + +/-- Monotone convergence in the precise truncated-moment form used by the +low-exponent duality argument. -/ +theorem lintegral_enorm_rpow_eq_iSup_lintegral_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} + (hF : AEStronglyMeasurable F μ) : + (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) = + ⨆ n : ℕ, ∫⁻ x, truncatedMoment q n F x ∂μ := by + rw [← lintegral_iSup' + (fun n => aemeasurable_truncatedMoment (n := n) hF) + (Filter.Eventually.of_forall (fun x => monotone_truncatedMoment F x))] + apply lintegral_congr + intro x + exact (iSup_truncatedMoment_eq_enorm_rpow F x).symm + +end INTERNAL +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpGradientLimit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpGradientLimit.lean new file mode 100644 index 0000000000..985b414fda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpGradientLimit.lean @@ -0,0 +1,445 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionSequence +public import Mathlib.MeasureTheory.Function.LpSpace.Complete + +/-! +# Internal gradient limits for finite-`L^p` cube data + +This module only completes the canonical finite-data gradients. In +particular, it deliberately contains neither a limiting scalar solution nor a +zero-trace assertion. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private theorem centeredCube_rawVolume_le_smul_normalizedVolume + {d : ℕ} (m : ℤ) : + volume.restrict (openCubeSet (originCube d m)) ≤ + ENNReal.ofReal (cubeVolume (originCube d m)) • + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + cubeMeasure (originCube d m) by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure]] + have hvol_nonneg : 0 ≤ cubeVolume (originCube d m) := + cubeVolume_nonneg _ + have hmul : ENNReal.ofReal (cubeVolume (originCube d m)) * + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume (originCube d m) * + (cubeVolume (originCube d m))⁻¹ = 1 := by + field_simp [(cubeVolume_pos _).ne'] + rw [hreal] + norm_num + rw [smul_smul, hmul, one_smul] + rw [cubeMeasure, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem raw_eLpNorm_le_cubeFactor_mul_normalized + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (F : Vec d → HilbertVec d) : + eLpNorm F q.exponent (volume.restrict (openCubeSet (originCube d m))) ≤ + (ENNReal.ofReal (cubeVolume (originCube d m)) ^ + (1 / q.exponent).toReal) * + eLpNorm F q.exponent (centeredCubeDomain d m).normalizedVolume := by + calc + eLpNorm F q.exponent (volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm F q.exponent + (ENNReal.ofReal (cubeVolume (originCube d m)) • + (centeredCubeDomain d m).normalizedVolume) := + eLpNorm_mono_measure F (centeredCube_rawVolume_le_smul_normalizedVolume m) + _ = _ := by + exact eLpNorm_smul_measure_of_ne_zero + (ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos _)) F q.exponent _ + +private theorem tendsto_rawEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub + (d : ℕ) [NeZero d] (q : FiniteLpExponent) (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) (hsigma0 : 0 < sigma0) : + Tendsto (fun nk : ℕ × ℕ => + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h nk.1).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h nk.2).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) + atTop (nhds 0) := by + obtain ⟨C, hCtop, hC⟩ := + exists_tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub d q + have hnormalized := hC m sigma0 h hsigma0 + have hnormalized' : Tendsto (fun nk : ℕ × ℕ => + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h nk.1).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h nk.2).toH1Function.grad x)) + q.exponent (centeredCubeDomain d m).normalizedVolume) + atTop (nhds 0) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm] using hnormalized + let A : ℝ≥0∞ := ENNReal.ofReal (cubeVolume (originCube d m)) ^ + (1 / q.exponent).toReal + have hAtop : A ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top + have hright : Tendsto (fun nk : ℕ × ℕ => + A * eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h nk.1).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h nk.2).toH1Function.grad x)) + q.exponent (centeredCubeDomain d m).normalizedVolume) + atTop (nhds 0) := by + simpa only [A, mul_zero] using + ENNReal.Tendsto.const_mul (a := A) hnormalized' (Or.inr hAtop) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hright + (fun _ => zero_le) (fun nk => ?_) + exact raw_eLpNorm_le_cubeFactor_mul_normalized m q _ + +private theorem finiteLpSolutionApproximation_grad_memLp + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) : + MemLp (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz d q + let u := finiteLpSolutionApproximation m hsigma0 h n + let hn := finiteLpDataApproximation h n + have hnormalized : + eLpNorm (fun x => HilbertVec.ofVec (u.toH1Function.grad x)) + q.exponent (centeredCubeDomain d m).normalizedVolume ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (fun x => HilbertVec.ofVec (hn.toField x)) + q.exponent (centeredCubeDomain d m).normalizedVolume := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, u, hn] using + hC m sigma0 hn u hsigma0 + (finiteLpSolutionApproximation_normalized_weak m hsigma0 h n) + have hdata : MemLp (fun x => HilbertVec.ofVec (hn.toField x)) q.exponent + (centeredCubeDomain d m).normalizedVolume := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + hn.euclideanMemLp + have hfactor_top : C * (ENNReal.ofReal sigma0)⁻¹ ≠ ∞ := + ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0))) + have hright_top : C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (fun x => HilbertVec.ofVec (hn.toField x)) q.exponent + (centeredCubeDomain d m).normalizedVolume < ∞ := + ENNReal.mul_lt_top hfactor_top.lt_top hdata.eLpNorm_lt_top + refine ⟨?_, ?_⟩ + · simpa only [u, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2).aestronglyMeasurable + · refine lt_of_le_of_lt (raw_eLpNorm_le_cubeFactor_mul_normalized m q _) ?_ + exact ENNReal.mul_lt_top + (ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top).lt_top + (lt_of_le_of_lt hnormalized hright_top) + +/-- The canonical finite-data approximants have `L^q` gradient coordinates on +the unnormalized open cube. This is deliberately exposed within the internal +CZ namespace so that the later zero-trace bridge need not repeat the measure +transport. -/ +theorem finiteLpSolutionApproximation_gradMemLp + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) : + GradMemLpOn (openCubeSet (originCube d m)) q.exponent + (finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad := by + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h n).eval_piLp i + +private noncomputable def finiteLpSolutionApproximation_gradientLp + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) : + Lp (HilbertVec d) q.exponent (volume.restrict (openCubeSet (originCube d m))) := + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h n).toLp _ + +private theorem cauchySeq_finiteLpSolutionApproximation_gradientLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) [Fact (1 ≤ q.exponent)] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + CauchySeq (finiteLpSolutionApproximation_gradientLp m hsigma0 h) := by + rw [Lp.cauchySeq_Lp_iff_cauchySeq_eLpNorm] + have htend := + tendsto_rawEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub d q m sigma0 h hsigma0 + refine htend.congr' ?_ + filter_upwards [] with nk + apply eLpNorm_congr_ae + filter_upwards [MemLp.coeFn_toLp + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h nk.1), + MemLp.coeFn_toLp + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h nk.2)] with x hx hy + simp only [finiteLpSolutionApproximation_gradientLp] + change HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h nk.1).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h nk.2).toH1Function.grad x) = + _ - _ + rw [hx, hy] + exact (HilbertVec.ofVecL d).map_sub _ _ + +private theorem exists_finiteLpGradientSubsequence + {d : ℕ} [NeZero d] (q : FiniteLpExponent) [Fact (1 ≤ q.exponent)] + (m : ℤ) {sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (h : CubeEuclideanLpField (originCube d m) q) : + ∃ r : ℕ → ℕ, StrictMono r ∧ ∀ N, ∀ n ≥ r N, + dist (finiteLpSolutionApproximation_gradientLp m hsigma0 h n) + (finiteLpSolutionApproximation_gradientLp m hsigma0 h (r N)) < + ((1 : ℝ) / 2) ^ (N + 2) := by + exact Metric.exists_subseq_bounded_of_cauchySeq + (finiteLpSolutionApproximation_gradientLp m hsigma0 h) + (cauchySeq_finiteLpSolutionApproximation_gradientLp q m hsigma0 h) + (fun N => ((1 : ℝ) / 2) ^ (N + 2)) (fun N => by positivity) + +private noncomputable def finiteLpGradientSubsequence + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + ℕ → ℕ := by + letI : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + exact Classical.choose (exists_finiteLpGradientSubsequence q m hsigma0 h) + +private theorem finiteLpGradientSubsequence_strictMono + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + StrictMono (finiteLpGradientSubsequence q m hsigma0 h) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + exact (Classical.choose_spec (exists_finiteLpGradientSubsequence q m hsigma0 h)).1 + +private theorem finiteLpGradientSubsequence_dist_lt + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N n : ℕ) (hn : finiteLpGradientSubsequence q m hsigma0 h N ≤ n) : + dist (finiteLpSolutionApproximation_gradientLp m hsigma0 h n) + (finiteLpSolutionApproximation_gradientLp m hsigma0 h + (finiteLpGradientSubsequence q m hsigma0 h N)) < + ((1 : ℝ) / 2) ^ (N + 2) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + exact (Classical.choose_spec (exists_finiteLpGradientSubsequence q m hsigma0 h)).2 N n hn + +private theorem eLpNorm_finiteLpSolutionApproximation_gradient_sub_eq_edist + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n k : ℕ) : + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h k).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) = + edist (finiteLpSolutionApproximation_gradientLp m hsigma0 h n) + (finiteLpSolutionApproximation_gradientLp m hsigma0 h k) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + symm + simpa only [finiteLpSolutionApproximation_gradientLp, + HilbertVec.ofVecL_apply] using! + Lp.edist_toLp_toLp _ _ + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h n) + (finiteLpSolutionApproximation_grad_memLp m hsigma0 h k) + +private theorem finiteLpGradientSubsequence_vector_eLpNorm_sub_lt + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N n k : ℕ) (hNn : N ≤ n) (hNk : N ≤ k) : + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientSubsequence q m hsigma0 h n)).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientSubsequence q m hsigma0 h k)).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) < + ENNReal.ofReal (((1 : ℝ) / 2) ^ N) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + let r := finiteLpGradientSubsequence q m hsigma0 h + let u := finiteLpSolutionApproximation_gradientLp m hsigma0 h + have hrn : r N ≤ r n := (finiteLpGradientSubsequence_strictMono q m hsigma0 h).monotone hNn + have hrk : r N ≤ r k := (finiteLpGradientSubsequence_strictMono q m hsigma0 h).monotone hNk + have hdn : dist (u (r n)) (u (r N)) < ((1 : ℝ) / 2) ^ (N + 2) := + finiteLpGradientSubsequence_dist_lt q m hsigma0 h N (r n) hrn + have hdk : dist (u (r k)) (u (r N)) < ((1 : ℝ) / 2) ^ (N + 2) := + finiteLpGradientSubsequence_dist_lt q m hsigma0 h N (r k) hrk + have hpow : 0 < ((1 : ℝ) / 2) ^ (N + 2) := by positivity + have hsum : edist (u (r n)) (u (r k)) < + ENNReal.ofReal (((1 : ℝ) / 2) ^ (N + 2)) + + ENNReal.ofReal (((1 : ℝ) / 2) ^ (N + 2)) := by + calc + edist (u (r n)) (u (r k)) ≤ edist (u (r n)) (u (r N)) + + edist (u (r k)) (u (r N)) := edist_triangle_right _ _ _ + _ = ENNReal.ofReal (dist (u (r n)) (u (r N))) + + ENNReal.ofReal (dist (u (r k)) (u (r N))) := by + rw [Lp.edist_dist, Lp.edist_dist] + _ < _ := ENNReal.add_lt_add + ((ENNReal.ofReal_lt_ofReal_iff hpow).2 hdn) + ((ENNReal.ofReal_lt_ofReal_iff hpow).2 hdk) + have hreal : 2 * ((1 : ℝ) / 2) ^ (N + 2) < ((1 : ℝ) / 2) ^ N := by + calc + 2 * ((1 : ℝ) / 2) ^ (N + 2) = + ((1 : ℝ) / 2) ^ N * (2 * ((1 : ℝ) / 2) ^ 2) := by + rw [show N + 2 = N + 2 by rfl, pow_add] + ring_nf + _ = ((1 : ℝ) / 2) ^ N * ((1 : ℝ) / 2) := by norm_num + _ < ((1 : ℝ) / 2) ^ N * 1 := by + gcongr + norm_num + _ = ((1 : ℝ) / 2) ^ N := by ring_nf + rw [eLpNorm_finiteLpSolutionApproximation_gradient_sub_eq_edist q m hsigma0 h] + calc + edist (u (r n)) (u (r k)) < + ENNReal.ofReal (((1 : ℝ) / 2) ^ (N + 2)) + + ENNReal.ofReal (((1 : ℝ) / 2) ^ (N + 2)) := hsum + _ = ENNReal.ofReal (2 * ((1 : ℝ) / 2) ^ (N + 2)) := by + rw [← ENNReal.ofReal_add (le_of_lt hpow) (le_of_lt hpow)] + ring_nf + _ < ENNReal.ofReal (((1 : ℝ) / 2) ^ N) := + (ENNReal.ofReal_lt_ofReal_iff (by positivity)).2 hreal + +theorem exists_finiteLpGradientLimit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + ∃ r : ℕ → ℕ, StrictMono r ∧ ∃ Du : Vec d → Vec d, + GradMemLpOn (openCubeSet (originCube d m)) q.exponent Du ∧ + ∀ i : Fin d, + Tendsto (fun N => eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x i - + Du x i) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + let r := finiteLpGradientSubsequence q m hsigma0 h + refine ⟨r, finiteLpGradientSubsequence_strictMono q m hsigma0 h, ?_⟩ + have hmem : ∀ i : Fin d, ∀ N, + MemLp (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + intro i N + exact finiteLpSolutionApproximation_gradMemLp m hsigma0 h (r N) i + have hsum : ∑' N : ℕ, ENNReal.ofReal (((1 : ℝ) / 2) ^ N) ≠ ∞ := + summable_geometric_two.tsum_ofReal_ne_top + have hcau : ∀ (i : Fin d) (N n k : ℕ), N ≤ n → N ≤ k → + eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r n)).toH1Function.grad x i - + (finiteLpSolutionApproximation m hsigma0 h (r k)).toH1Function.grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))) < + ENNReal.ofReal (((1 : ℝ) / 2) ^ N) := by + intro i N n k hNn hNk + calc + eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r n)).toH1Function.grad x i - + (finiteLpSolutionApproximation m hsigma0 h (r k)).toH1Function.grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h (r n)).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h (r k)).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [Pi.sub_apply] using coordinate_eLpNorm_le_euclidean + (volume.restrict (openCubeSet (originCube d m))) q + (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r n)).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h (r k)).toH1Function.grad x) i + _ < ENNReal.ofReal (((1 : ℝ) / 2) ^ N) := + finiteLpGradientSubsequence_vector_eLpNorm_sub_lt q m hsigma0 h N n k hNn hNk + choose D hDmem hDtend using fun i => + Lp.cauchy_complete_eLpNorm q.one_lt.le (hmem i) hsum (hcau i) + refine ⟨fun x i => D i x, ?_, ?_⟩ + · intro i + exact hDmem i + · intro i + simpa only [r] using! hDtend i + +/-- The subsequence selected together with the canonical limiting gradient. -/ +noncomputable def finiteLpGradientLimitSubsequence + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + ℕ → ℕ := + Classical.choose (exists_finiteLpGradientLimit q m hsigma0 h) + +/-- The canonical `L^q` gradient representative selected from the controlled +finite-data approximation sequence. -/ +noncomputable def finiteLpGradientLimit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Vec d → Vec d := + Classical.choose (Classical.choose_spec (exists_finiteLpGradientLimit q m hsigma0 h)).2 + +theorem finiteLpGradientLimitSubsequence_strictMono + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + StrictMono (finiteLpGradientLimitSubsequence q m hsigma0 h) := + (Classical.choose_spec (exists_finiteLpGradientLimit q m hsigma0 h)).1 + +theorem finiteLpGradientLimit_gradMemLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + GradMemLpOn (openCubeSet (originCube d m)) q.exponent + (finiteLpGradientLimit q m hsigma0 h) := + (Classical.choose_spec + (Classical.choose_spec (exists_finiteLpGradientLimit q m hsigma0 h)).2).1 + +theorem tendsto_eLpNorm_finiteLpSolutionApproximation_gradCoord_sub_finiteLpGradientLimit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (i : Fin d) : + Tendsto (fun N => eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x i - + (finiteLpGradientLimit q m hsigma0 h) x i) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := + (Classical.choose_spec + (Classical.choose_spec (exists_finiteLpGradientLimit q m hsigma0 h)).2).2 i + +theorem tendsto_eLpNorm_finiteLpSolutionApproximation_grad_sub_finiteLpGradientLimit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + (finiteLpGradientLimit q m hsigma0 h) x)) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + let r := finiteLpGradientLimitSubsequence q m hsigma0 h + let Du := finiteLpGradientLimit q m hsigma0 h + have hcoord : ∀ i : Fin d, + Tendsto (fun N => eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x i - + Du x i) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + intro i + simpa only [r, Du] using + tendsto_eLpNorm_finiteLpSolutionApproximation_gradCoord_sub_finiteLpGradientLimit + q m hsigma0 h i + have hsum : Tendsto (fun N => ∑ i : Fin d, + eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x i - + Du x i) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + simpa using (tendsto_finsetSum Finset.univ fun i _ => hcoord i) + have hright : Tendsto (fun N => ‖(d : ℝ)‖ₑ * ∑ i : Fin d, + eLpNorm (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x i - + Du x i) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + simpa only [mul_zero] using ENNReal.Tendsto.const_mul (a := ‖(d : ℝ)‖ₑ) + hsum (Or.inr ENNReal.coe_ne_top) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hright + (fun _ => zero_le) (fun N => ?_) + apply euclidean_eLpNorm_le_dimension_mul_sum_coordinates + (volume.restrict (openCubeSet (originCube d m))) q + (fun x => + (finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x - Du x) + intro i + exact ((finiteLpSolutionApproximation_gradMemLp m hsigma0 h (r N) i).sub + (finiteLpGradientLimit_gradMemLp q m hsigma0 h i)).aestronglyMeasurable + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitBound.lean new file mode 100644 index 0000000000..47fab5df0a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitBound.lean @@ -0,0 +1,266 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpGradientLimit + +/-! +# Calderón--Zygmund control of the canonical finite-`L^p` gradient limit + +The supplied-data estimate is stable under the canonical bounded-data +approximation. This module records that passage to the limit with the same +constant and the exact normalized Euclidean norm. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem tendsto_eLpNorm_of_tendsto_sub + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {p : ℝ≥0∞} (hp : 1 ≤ p) + {f : ℕ → α → E} {g : α → E} + (hf : ∀ n, AEStronglyMeasurable (f n) μ) + (hg : AEStronglyMeasurable g μ) (hg_top : eLpNorm g p μ ≠ ∞) + (hfg : Tendsto (fun n => eLpNorm (fun x => f n x - g x) p μ) + atTop (nhds 0)) : + Tendsto (fun n => eLpNorm (f n) p μ) atTop (nhds (eLpNorm g p μ)) := by + have hupper : ∀ n, eLpNorm (f n) p μ ≤ + eLpNorm g p μ + eLpNorm (fun x => f n x - g x) p μ := by + intro n + refine (le_of_eq ?_).trans (eLpNorm_add_le hg ((hf n).sub hg) hp) + congr 1 + funext x + simp only [Pi.add_apply] + abel + have hreverse : ∀ n, + eLpNorm (fun x => g x - f n x) p μ = + eLpNorm (fun x => f n x - g x) p μ := by + intro n + rw [show (fun x => g x - f n x) = -(fun x => f n x - g x) by + funext x + simp only [Pi.neg_apply] + abel, eLpNorm_neg] + have hlower : ∀ n, + eLpNorm g p μ - eLpNorm (fun x => f n x - g x) p μ ≤ + eLpNorm (f n) p μ := by + intro n + rw [tsub_le_iff_right] + calc + eLpNorm g p μ = eLpNorm (fun x => f n x + (g x - f n x)) p μ := by + congr 1 + funext x + abel + _ ≤ eLpNorm (f n) p μ + eLpNorm (fun x => g x - f n x) p μ := + eLpNorm_add_le (hf n) (hg.sub (hf n)) hp + _ = eLpNorm (f n) p μ + eLpNorm (fun x => f n x - g x) p μ := by + rw [hreverse] + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + (g := fun n => eLpNorm g p μ - eLpNorm (fun x => f n x - g x) p μ) + (h := fun n => eLpNorm g p μ + eLpNorm (fun x => f n x - g x) p μ) + ?_ ?_ hlower hupper + · have hsub := ENNReal.Tendsto.sub + (tendsto_const_nhds : Tendsto (fun _ : ℕ => eLpNorm g p μ) atTop + (nhds (eLpNorm g p μ))) hfg (Or.inl hg_top) + simpa using hsub + · simpa using Tendsto.const_add (eLpNorm g p μ) hfg + +private theorem finiteLpSolutionApproximation_grad_memLp_normalized + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) : + MemLp (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad x)) + q.exponent (centeredCubeDomain d m).normalizedVolume := by + have hraw : MemLp (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + apply MemLp.of_eval_piLp + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + finiteLpSolutionApproximation_gradMemLp m hsigma0 h n i + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume] + exact hraw.smul_measure ENNReal.ofReal_ne_top + +private theorem finiteLpGradientLimit_memLp_normalized + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + MemLp (fun x => HilbertVec.ofVec (finiteLpGradientLimit q m hsigma0 h x)) + q.exponent (centeredCubeDomain d m).normalizedVolume := by + have hraw : MemLp (fun x => HilbertVec.ofVec (finiteLpGradientLimit q m hsigma0 h x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + apply MemLp.of_eval_piLp + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + finiteLpGradientLimit_gradMemLp q m hsigma0 h i + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume] + exact hraw.smul_measure ENNReal.ofReal_ne_top + +private theorem tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub_limit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Tendsto (fun N => + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) atTop (nhds 0) := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hc : c ≠ 0 := ne_of_gt (ENNReal.ofReal_pos.mpr + (inv_pos.mpr (cubeVolume_pos (originCube d m)))) + have hfactor_top : c ^ (1 / q.exponent).toReal ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top + have hraw := + tendsto_eLpNorm_finiteLpSolutionApproximation_grad_sub_finiteLpGradientLimit + q m hsigma0 h + have hscaled : Tendsto (fun N => c ^ (1 / q.exponent).toReal * + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + simpa only [mul_zero] using ENNReal.Tendsto.const_mul + (a := c ^ (1 / q.exponent).toReal) hraw (Or.inr hfactor_top) + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, centeredCube_normalizedVolume_eq_smul_openCubeVolume, + eLpNorm_smul_measure_of_ne_zero hc, c] using! hscaled + +private theorem tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Tendsto (fun N => + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad) + atTop (nhds ((centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (finiteLpGradientLimit q m hsigma0 h))) := by + have htend : Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x)) + q.exponent (centeredCubeDomain d m).normalizedVolume) atTop + (nhds (eLpNorm (fun x => HilbertVec.ofVec (finiteLpGradientLimit q m hsigma0 h x)) + q.exponent (centeredCubeDomain d m).normalizedVolume)) := by + apply tendsto_eLpNorm_of_tendsto_sub q.one_lt.le + · intro N + exact (finiteLpSolutionApproximation_grad_memLp_normalized m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).aestronglyMeasurable + · exact (finiteLpGradientLimit_memLp_normalized q m hsigma0 h).aestronglyMeasurable + · exact (finiteLpGradientLimit_memLp_normalized q m hsigma0 h).eLpNorm_lt_top.ne + · simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm] using! + tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub_limit + q m hsigma0 h + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm] using htend + +private theorem tendsto_normalizedEuclideanLpENorm_finiteLpDataApproximation + {d : ℕ} {q : FiniteLpExponent} (m : ℤ) + (h : CubeEuclideanLpField (originCube d m) q) : + Tendsto (fun n => + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (finiteLpDataApproximation h n).toField) atTop + (nhds ((centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent h.toField)) := by + have htend : Tendsto (fun n => eLpNorm + (fun x => HilbertVec.ofVec ((finiteLpDataApproximation h n).toField x)) + q.exponent (normalizedCubeMeasure (originCube d m))) atTop + (nhds (eLpNorm (fun x => HilbertVec.ofVec (h.toField x)) q.exponent + (normalizedCubeMeasure (originCube d m)))) := by + apply tendsto_eLpNorm_of_tendsto_sub q.one_lt.le + · intro n + exact (finiteLpDataApproximation h n).euclideanMemLp.aestronglyMeasurable + · exact h.euclideanMemLp.aestronglyMeasurable + · exact h.euclideanMemLp.eLpNorm_lt_top.ne + · have hsub := tendsto_eLpNorm_sub_finiteLpDataApproximation h + have hneg : Tendsto (fun n => eLpNorm + (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h n).toField x - h.toField x)) + q.exponent (normalizedCubeMeasure (originCube d m))) atTop (nhds 0) := by + refine hsub.congr' ?_ + filter_upwards [] with n + rw [show (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h n).toField x - h.toField x)) = + -(fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h n).toField x)) by + funext x + simp only [Pi.neg_apply] + rw [show (finiteLpDataApproximation h n).toField x - h.toField x = + -(h.toField x - (finiteLpDataApproximation h n).toField x) by abel] + exact (HilbertVec.ofVecL d).map_neg _, eLpNorm_neg] + exact hneg + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using htend + +/-- The canonical limiting gradient for arbitrary finite-`L^p` cube data +obeys the supplied-solution Calderón--Zygmund estimate with the same constant. +The constant is chosen before the cube, ellipticity scale, and datum. -/ +theorem finiteLpGradientLimit_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) (hsigma0 : 0 < sigma0), + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (finiteLpGradientLimit q m hsigma0 h) ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz d q + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h hsigma0 + let r := finiteLpGradientLimitSubsequence q m hsigma0 h + have hleft := + tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad + q m hsigma0 h + have hdata := + (tendsto_normalizedEuclideanLpENorm_finiteLpDataApproximation m h).comp + (finiteLpGradientLimitSubsequence_strictMono q m hsigma0 h).tendsto_atTop + have hfactor_top : C * (ENNReal.ofReal sigma0)⁻¹ ≠ ∞ := + ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0))) + have hright : Tendsto (fun N => C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (finiteLpDataApproximation h (r N)).toField) atTop + (nhds (C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent h.toField)) := by + simpa only [mul_assoc, r] using! + ENNReal.Tendsto.const_mul (a := C * (ENNReal.ofReal sigma0)⁻¹) + hdata (Or.inr hfactor_top) + refine le_of_tendsto_of_tendsto' hleft hright (fun N => ?_) + exact hC m sigma0 + (finiteLpDataApproximation h (finiteLpGradientLimitSubsequence q m hsigma0 h N)) + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)) hsigma0 + (finiteLpSolutionApproximation_normalized_weak m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)) + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitEquation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitEquation.lean new file mode 100644 index 0000000000..d124a48d94 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLimitEquation.lean @@ -0,0 +1,318 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpGradientLimit + +/-! +# The finite-`L^p` limiting weak equation + +This internal module passes the canonical finite-data weak equations to the +`L^p` gradient limit. Smooth compactly supported tests supply all conjugate +integrability needed for the two Hölder estimates; no regularity or boundary +witness for the limiting gradient is assumed here. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private theorem memLp_hilbertOfVec_of_gradMemLpOn + {d : ℕ} {U : Set (Vec d)} {p : ℝ≥0∞} {F : Vec d → Vec d} + (hF : GradMemLpOn U p F) : + MemLp (fun x => HilbertVec.ofVec (F x)) p (volume.restrict U) := by + rw [memLp_piLp_iff] + intro i + simpa only [Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply] using hF i + +private theorem smoothCompactSupport_gradient_memLp + {d : ℕ} {Omega : TopologicalSpace.Opens (Vec d)} (p : ℝ≥0∞) + (phi : SmoothCompactSupportFunction Omega) : + MemLp (fun x => HilbertVec.ofVec (phi.gradient x)) p volume := by + have hgradient_cont : Continuous phi.gradient := by + apply continuous_pi + intro i + exact (phi.contDiff.continuous_fderiv (by norm_num)).clm_apply continuous_const + have hgradient_support : HasCompactSupport + (fun x => HilbertVec.ofVec (phi.gradient x)) := by + apply HasCompactSupport.mono' (phi.hasCompactSupport.fderiv ℝ) + intro x hx + apply subset_tsupport (fderiv ℝ (phi : Vec d → ℝ)) + rw [Function.mem_support] at hx ⊢ + intro hzero + apply hx + ext i + simpa only [SmoothCompactSupportFunction.gradient, HilbertVec.ofVecL_apply, + HilbertVec.ofVec, PiLp.toLp_apply, zero_apply] using! + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hzero + exact ((HilbertVec.ofVecL d).continuous.comp hgradient_cont).memLp_of_hasCompactSupport + hgradient_support + +private theorem tendsto_integral_vecDot_of_tendsto_eLpNorm_finiteLp + {alpha : Type*} {d : ℕ} [MeasurableSpace alpha] + (p : FiniteLpExponent) {mu : Measure alpha} + {F : ℕ → alpha → Vec d} {G H : alpha → Vec d} + (hF : ∀ n, MemLp (fun x => HilbertVec.ofVec (F n x)) p.exponent mu) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent mu) + (hH : MemLp (fun x => HilbertVec.ofVec (H x)) p.conjugate.exponent mu) + (htend : Tendsto (fun n => eLpNorm (fun x => HilbertVec.ofVec (F n x - G x)) + p.exponent mu) atTop (nhds 0)) : + Tendsto (fun n => ∫ x, vecDot (F n x) (H x) ∂mu) + atTop (nhds (∫ x, vecDot (G x) (H x) ∂mu)) := by + let : ENNReal.HolderConjugate p.exponent p.conjugate.exponent := + p.holderConjugate + have hdiff : ∀ n, + MemLp (fun x => HilbertVec.ofVec (F n x - G x)) p.exponent mu := by + intro n + simpa only [HilbertVec.ofVecL_apply] using! (hF n).sub hG + have hpair_mem : ∀ n, + MemLp (fun x => vecDot (F n x) (H x)) 1 mu := by + intro n + have hbound : ∀ᵐ x ∂mu, + ‖inner ℝ (HilbertVec.ofVec (F n x)) (HilbertVec.ofVec (H x))‖₊ ≤ + 1 * ‖HilbertVec.ofVec (F n x)‖₊ * ‖HilbertVec.ofVec (H x)‖₊ := by + filter_upwards with x + simpa only [one_mul] using nnnorm_inner_le_nnnorm (𝕜 := ℝ) + (HilbertVec.ofVec (F n x)) (HilbertVec.ofVec (H x)) + have hpair := MemLp.of_bilin (r := 1) + (b := fun x y : HilbertVec d => inner ℝ x y) (c := 1) + (hF n) hH ((hF n).aestronglyMeasurable.inner hH.aestronglyMeasurable) hbound + simpa only [HilbertVec.inner_def] using hpair + have hlimit_pair_mem : MemLp (fun x => vecDot (G x) (H x)) 1 mu := by + have hbound : ∀ᵐ x ∂mu, + ‖inner ℝ (HilbertVec.ofVec (G x)) (HilbertVec.ofVec (H x))‖₊ ≤ + 1 * ‖HilbertVec.ofVec (G x)‖₊ * ‖HilbertVec.ofVec (H x)‖₊ := by + filter_upwards with x + simpa only [one_mul] using nnnorm_inner_le_nnnorm (𝕜 := ℝ) + (HilbertVec.ofVec (G x)) (HilbertVec.ofVec (H x)) + have hpair := MemLp.of_bilin (r := 1) + (b := fun x y : HilbertVec d => inner ℝ x y) (c := 1) + hG hH (hG.aestronglyMeasurable.inner hH.aestronglyMeasurable) hbound + simpa only [HilbertVec.inner_def] using hpair + have hholder : ∀ n, + eLpNorm (fun x => vecDot (F n x - G x) (H x)) 1 mu ≤ + eLpNorm (fun x => HilbertVec.ofVec (F n x - G x)) p.exponent mu * + eLpNorm (fun x => HilbertVec.ofVec (H x)) p.conjugate.exponent mu := + fun n => eLpNorm_vecDot_le_mul (hdiff n) hH + have hproduct : Tendsto (fun n => + eLpNorm (fun x => HilbertVec.ofVec (F n x - G x)) p.exponent mu * + eLpNorm (fun x => HilbertVec.ofVec (H x)) p.conjugate.exponent mu) + atTop (nhds 0) := by + simpa only [zero_mul] using ENNReal.Tendsto.mul_const htend (Or.inr hH.eLpNorm_ne_top) + have hL1 : Tendsto (fun n => eLpNorm + (fun x => vecDot (F n x) (H x) - vecDot (G x) (H x)) 1 mu) + atTop (nhds 0) := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hproduct + (fun _ => zero_le) (fun n => ?_) + have heq : (fun x => vecDot (F n x) (H x) - vecDot (G x) (H x)) = + fun x => vecDot (F n x - G x) (H x) := by + funext x + simp only [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + rw [heq] + exact hholder n + exact tendsto_integral_of_L1' (fun x => vecDot (G x) (H x)) + (memLp_one_iff_integrable.mp hlimit_pair_mem).aestronglyMeasurable + (Eventually.of_forall fun n => memLp_one_iff_integrable.mp (hpair_mem n)) hL1 + +private theorem tendsto_normalized_gradient_difference + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (centeredCubeDomain d m).normalizedVolume) atTop (nhds 0) := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hc : c ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.mpr (inv_pos.mpr (cubeVolume_pos _)) + have hraw := + tendsto_eLpNorm_finiteLpSolutionApproximation_grad_sub_finiteLpGradientLimit + q m hsigma0 h + have hscaled : Tendsto (fun N => c ^ (1 / q.exponent).toReal * + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (volume.restrict (openCubeSet (originCube d m)))) atTop (nhds 0) := by + simpa only [mul_zero] using ENNReal.Tendsto.const_mul hraw + (Or.inr (ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top)) + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + c • volume.restrict (openCubeSet (originCube d m)) := by + simp only [c, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + rw [hmeasure] + have heq : (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (c • volume.restrict (openCubeSet (originCube d m)))) = + fun N => c ^ (1 / q.exponent).toReal * + eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (volume.restrict (openCubeSet (originCube d m))) := by + funext N + simpa only [smul_eq_mul] using eLpNorm_smul_measure_of_ne_zero hc + (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad x - + finiteLpGradientLimit q m hsigma0 h x)) q.exponent + (volume.restrict (openCubeSet (originCube d m))) + rw [heq] + exact hscaled + +/-- The canonical finite-`L^p` gradient limit satisfies the source-facing +normalized weak equation against every smooth compactly supported cube test. -/ +theorem finiteLpGradientLimit_normalized_weak + (d : ℕ) [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (phi : SmoothCompactSupportFunction + ⟨openCubeSet (originCube d m), isOpen_openCubeSet (originCube d m)⟩) : + sigma0 * ∫ x, vecDot (finiteLpGradientLimit q m hsigma0 h x) (phi.gradient x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.gradient x) + ∂(centeredCubeDomain d m).normalizedVolume := by + let U : Set (Vec d) := openCubeSet (originCube d m) + let mu : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let r : ℕ → ℕ := finiteLpGradientLimitSubsequence q m hsigma0 h + let Du : Vec d → Vec d := finiteLpGradientLimit q m hsigma0 h + let psi : H10Function U := H10Function.ofContDiff + (isOpen_openCubeSet (originCube d m)) phi.contDiff phi.hasCompactSupport phi.tsupport_subset + have htest : MemLp (fun x => HilbertVec.ofVec (phi.gradient x)) + q.conjugate.exponent mu := by + change MemLp _ q.conjugate.exponent (centeredCubeDomain d m).normalizedVolume + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact ((smoothCompactSupport_gradient_memLp q.conjugate.exponent phi).restrict U).smul_measure + ENNReal.ofReal_ne_top + have hgrad_approx : ∀ N, + MemLp (fun x => HilbertVec.ofVec + ((finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x)) + q.exponent mu := by + intro N + change MemLp _ q.exponent (centeredCubeDomain d m).normalizedVolume + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (memLp_hilbertOfVec_of_gradMemLpOn + (finiteLpSolutionApproximation_gradMemLp m hsigma0 h (r N))).smul_measure + ENNReal.ofReal_ne_top + have hgrad_limit : MemLp (fun x => HilbertVec.ofVec (Du x)) q.exponent mu := by + change MemLp _ q.exponent (centeredCubeDomain d m).normalizedVolume + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (memLp_hilbertOfVec_of_gradMemLpOn + (finiteLpGradientLimit_gradMemLp q m hsigma0 h)).smul_measure + ENNReal.ofReal_ne_top + have hgrad_pairing : Tendsto (fun N => ∫ x, + vecDot ((finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x) + (phi.gradient x) ∂mu) atTop + (nhds (∫ x, vecDot (Du x) (phi.gradient x) ∂mu)) := by + apply tendsto_integral_vecDot_of_tendsto_eLpNorm_finiteLp q + hgrad_approx hgrad_limit htest + simpa only [r, Du, mu] using tendsto_normalized_gradient_difference q m hsigma0 h + have hdata_approx : ∀ N, + MemLp (fun x => HilbertVec.ofVec ((finiteLpDataApproximation h (r N)).toField x)) + q.exponent mu := by + intro N + simpa only [mu, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + (finiteLpDataApproximation h (r N)).euclideanMemLp + have hdata : MemLp (fun x => HilbertVec.ofVec (h.toField x)) q.exponent mu := by + simpa only [mu, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + h.euclideanMemLp + have hdata_norm : Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h (r N)).toField x - h.toField x)) q.exponent mu) + atTop (nhds 0) := by + have hbase := (tendsto_eLpNorm_sub_finiteLpDataApproximation h).comp + (finiteLpGradientLimitSubsequence_strictMono q m hsigma0 h).tendsto_atTop + have hbase' : Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h (r N)).toField x)) q.exponent + (normalizedCubeMeasure (originCube d m))) atTop (nhds 0) := by + simpa only [Function.comp_apply, r] using! hbase + have hneg : Tendsto (fun N => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h (r N)).toField x - h.toField x)) q.exponent + (normalizedCubeMeasure (originCube d m))) atTop (nhds 0) := by + refine hbase'.congr' (Eventually.of_forall fun N => ?_) + symm + change eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h (r N)).toField x - h.toField x)) q.exponent + (normalizedCubeMeasure (originCube d m)) = + eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h (r N)).toField x)) q.exponent + (normalizedCubeMeasure (originCube d m)) + rw [show (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h (r N)).toField x - h.toField x)) = + fun x => -HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h (r N)).toField x) by + funext x + rw [show (finiteLpDataApproximation h (r N)).toField x - h.toField x = + -(h.toField x - (finiteLpDataApproximation h (r N)).toField x) by abel] + exact (HilbertVec.ofVecL d).map_neg _] + exact eLpNorm_neg _ _ _ + simpa only [r, mu, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hneg + have hdata_pairing : Tendsto (fun N => ∫ x, + vecDot ((finiteLpDataApproximation h (r N)).toField x) (phi.gradient x) ∂mu) + atTop (nhds (∫ x, vecDot (h.toField x) (phi.gradient x) ∂mu)) := by + exact tendsto_integral_vecDot_of_tendsto_eLpNorm_finiteLp q + hdata_approx hdata htest hdata_norm + have hequation : ∀ N, + sigma0 * ∫ x, + vecDot ((finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x) + (phi.gradient x) ∂mu = + -∫ x, vecDot ((finiteLpDataApproximation h (r N)).toField x) + (phi.gradient x) ∂mu := by + intro N + simpa only [psi, H10Function.ofContDiff, H1Function.ofContDiff, + SmoothCompactSupportFunction.gradient, U, mu, r] using! + finiteLpSolutionApproximation_normalized_weak m hsigma0 h (r N) psi + have hleft : Tendsto (fun N => sigma0 * ∫ x, + vecDot ((finiteLpSolutionApproximation m hsigma0 h (r N)).toH1Function.grad x) + (phi.gradient x) ∂mu) atTop + (nhds (sigma0 * ∫ x, vecDot (Du x) (phi.gradient x) ∂mu)) := + tendsto_const_nhds.mul hgrad_pairing + have hright : Tendsto (fun N => -∫ x, + vecDot ((finiteLpDataApproximation h (r N)).toField x) (phi.gradient x) ∂mu) + atTop (nhds (-∫ x, vecDot (h.toField x) (phi.gradient x) ∂mu)) := + hdata_pairing.neg + have hleft_as_right := hleft.congr' (Eventually.of_forall hequation) + simpa only [Du, mu] using tendsto_nhds_unique hleft_as_right hright + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLpData.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLpData.lean new file mode 100644 index 0000000000..78a41a8e67 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpLpData.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo + +/-! +# Supplied-solution cube Calderón--Zygmund estimates for `L^p` data + +This file removes the auxiliary `L²` assumption on the datum in the centered-cube +finite-exponent Calderón--Zygmund estimate. Below exponent two the proof uses +the existing adjoint-duality argument directly. At and above exponent two, +finite normalized cube volume supplies the required `L²` membership internally. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume_lpData + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem centeredCube_memLp_hilbertGradient_two_lpData + {d : ℕ} {m : ℤ} (u : H10Function (openCubeSet (originCube d m))) : + MemLp (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume := by + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_lpData] + exact (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).smul_measure ENNReal.ofReal_ne_top + +/-- Multiplying an unnormalized centered-cube weak equation by the reciprocal +cube volume gives its normalized-volume form. -/ +private theorem centeredCube_normalizedWeak_of_rawWeak + {d : ℕ} (m : ℤ) {sigma0 : ℝ} + (u : H10Function (openCubeSet (originCube d m))) (h : Vec d → Vec d) + (hsolution : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) : + ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + intro psi + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_lpData, + integral_smul_measure, integral_smul_measure, smul_eq_mul, smul_eq_mul] + calc + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) = + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) := by + ring + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) := by + rw [hsolution psi] + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) := by + ring + +private theorem centeredCubeH10ScalarDivergence_cz_lpData_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) + (u : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + (∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz_of_two_lt d + q.conjugate (INTERNAL.conjugate_toReal_gt_two_of_lt_two q hq) + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let F : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let H : Vec d → HilbertVec d := hilbertifyVecField h.toField + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hFtwo : MemLp F 2 μ := by + simpa only [F, μ] using centeredCube_memLp_hilbertGradient_two_lpData u + have hHq : MemLp H q.exponent μ := by + simpa only [H, μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hFmeas : AEStronglyMeasurable F μ := hFtwo.aestronglyMeasurable + let A : ℝ≥0∞ := C * (ENNReal.ofReal sigma0)⁻¹ * eLpNorm H q.exponent μ + have hmain : eLpNorm F q.exponent μ ≤ A := by + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + apply INTERNAL.eLpNorm_le_of_truncated_cross_bound hqreal hFmeas + intro n + let Gfield := INTERNAL.centeredCube_radialTruncationL2LpField m q u n + let G : Vec d → Vec d := Gfield.toField + let v := openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G + (INTERNAL.centeredCube_radialTruncation_memVectorL2 m q u n) + have hGtwo : MemVectorL2 (openCubeSet (originCube d m)) G := by + simpa only [G, Gfield] using + INTERNAL.centeredCube_radialTruncation_memVectorL2 m q u n + have hk : Integrable (fun x => vecDot (u.toH1Function.grad x) (G x)) μ := by + simpa only [μ] using INTERNAL.centeredCube_integrable_vecDot_of_memVectorL2 m + u.toH1Function.grad_memVectorL2 hGtwo + have hk0 : 0 ≤ᵐ[μ] fun x => vecDot (u.toH1Function.grad x) (G x) := by + filter_upwards with x + change 0 ≤ vecDot (u.toH1Function.grad x) + (INTERNAL.vectorRadialTruncation q.exponent.toReal n u.toH1Function.grad x) + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self hqreal] + split_ifs with hx + · exact Real.rpow_nonneg (euclideanNorm_nonneg _) _ + · exact le_rfl + have hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal + (vecDot (u.toH1Function.grad x) (G x)) = + INTERNAL.truncatedMoment q.exponent.toReal n F x := by + filter_upwards with x + simpa only [F, G, Gfield] using! + INTERNAL.ofReal_vecDot_vectorRadialTruncation_eq_truncatedMoment + hqreal n u.toH1Function.grad x + have hJ : (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := + INTERNAL.lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint + refine ⟨?_, ?_⟩ + · rw [hJ] + exact ENNReal.ofReal_ne_top + have hvsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 v + Gfield.toLpTwo := by + intro psi + simpa only [v, G, Gfield] using! + INTERNAL.openCubeSetScalarDivergenceSolution_normalized_weak m hsigma0 G hGtwo psi + have hvbound := hC m sigma0 Gfield v hsigma0 hvsolution + have hGq : MemLp (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [μ, G, Gfield, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! Gfield.euclideanMemLp + have hVtwo : MemLp (hilbertifyVecField v.toH1Function.grad) 2 μ := by + simpa only [v, μ] using centeredCube_memLp_hilbertGradient_two_lpData v + have hVbound : eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, μ, v, G, Gfield, hilbertifyVecField] using! hvbound + have hVq : MemLp (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + refine ⟨hVtwo.aestronglyMeasurable, ?_⟩ + apply lt_of_le_of_lt hVbound + apply ENNReal.mul_lt_top + · exact (ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0)))).lt_top + · exact hGq.eLpNorm_lt_top + have huweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂μ = + -∫ x, vecDot (h.toField x) (psi.toH1Function.grad x) ∂μ := by + intro psi + simpa only [μ] using + centeredCube_normalizedWeak_of_rawWeak m u h.toField hsolution psi + have hcross := INTERNAL.openCubeSetScalarDivergenceSolution_normalized_cross_pairing + m hsigma0 u h.toField G huweak hGtwo + have hholder := INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul + (F := h.toField) (G := v.toH1Function.grad) hHq hVq + have hGmoment : (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) ^ + q.conjugate.exponent.toReal = + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ := by + simpa only [μ, F, G, Gfield, hilbertifyVecField] using! + INTERNAL.eLpNorm_hilbertRadialTruncation_rpow_conjugate_eq_truncatedMoment q n F + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hqreal + have hexp : (q.conjugate.exponent.toReal)⁻¹ = 1 - q.exponent.toReal⁻¹ := by + have hsum := hreal.one_div_add_one_div + rw [one_div] at hsum + norm_num at hsum + linarith + have hGnorm : eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + have hr0 : q.conjugate.exponent.toReal ≠ 0 := by + exact ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne |>.ne' + calc + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ ^ + q.conjugate.exponent.toReal) ^ (q.conjugate.exponent.toReal)⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hr0, ENNReal.rpow_one] + _ = (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (q.conjugate.exponent.toReal)⁻¹ := by rw [hGmoment] + _ = _ := by rw [hexp] + calc + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := hJ + _ = + ENNReal.ofReal (∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ) := by + rw [hcross] + _ ≤ ENNReal.ofReal |∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ| := + ENNReal.ofReal_le_ofReal (le_abs_self _) + _ ≤ ENNReal.ofReal ((eLpNorm H q.exponent μ).toReal * + (eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ).toReal) := ENNReal.ofReal_le_ofReal hholder + _ = eLpNorm H q.exponent μ * + eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + rw [ENNReal.ofReal_mul ENNReal.toReal_nonneg, + ENNReal.ofReal_toReal hHq.eLpNorm_lt_top.ne, + ENNReal.ofReal_toReal hVq.eLpNorm_lt_top.ne] + _ ≤ eLpNorm H q.exponent μ * + (C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) := by + gcongr + _ = A * (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + rw [hGnorm] + dsimp only [A] + ac_rfl + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, F, H, μ, A] using! hmain + +/-- The supplied-solution centered-cube Calderón--Zygmund estimate for every +finite exponent and an `L^p` datum. No auxiliary `L²` hypothesis is exposed. -/ +theorem centeredCubeH10ScalarDivergence_cz_lpData + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) + (u : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + (∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h.toField x) (psi.toH1Function.grad x) ∂volume) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + by_cases hlt : q.exponent.toReal < 2 + · exact centeredCubeH10ScalarDivergence_cz_lpData_of_lt_two d q hlt + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz d q + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + have htwo_le : (2 : ℝ≥0∞) ≤ q.exponent := by + apply (ENNReal.toReal_le_toReal (by norm_num) q.lt_top.ne).mp + simpa only [ENNReal.toReal_ofNat] using le_of_not_gt hlt + let hL2Lp : CubeEuclideanL2LpField (originCube d m) q := + { toCubeEuclideanLpField := h + euclideanMemL2 := h.euclideanMemLp.mono_exponent htwo_le } + have hnormalized : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u + hL2Lp.toLpTwo := by + intro psi + simpa only [hL2Lp, CubeEuclideanL2LpField.toLpTwo] using + centeredCube_normalizedWeak_of_rawWeak m u h.toField hsolution psi + simpa only [hL2Lp] using hC m sigma0 hL2Lp u hsigma0 hnormalized + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionSequence.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionSequence.lean new file mode 100644 index 0000000000..f2ceea0b34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionSequence.lean @@ -0,0 +1,201 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpDataDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionStability + +/-! +# Canonical finite-`L^p` approximating solutions on centered cubes + +For arbitrary finite-exponent cube data, this module packages the bounded +`L² ∩ Lᵖ` data approximants together with their canonical zero-trace `H¹` +solutions. It stops before selecting a limit: the later arbitrary-data +assembly is responsible for both the high-exponent zero-trace bridge and the +weak-equation limit passage. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private theorem memVectorL2_openCubeSet_of_euclideanMemLpTwo + {d : ℕ} (Q : TriadicCube d) {F : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q)) : + MemVectorL2 (openCubeSet Q) F := by + have hvec : MemLp F 2 (normalizedCubeMeasure Q) := by + apply MemLp.of_eval + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [Measure.smul_apply, Measure.smul_apply] + change ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * cubeMeasure Q s) = cubeMeasure Q s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hcube : MemLp F 2 (cubeMeasure Q) := + hvec.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa only [MemVectorL2, volumeMeasureOn, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using hcube + +/-- The canonical `H¹₀` solution associated to the bounded `L² ∩ Lᵖ` +approximation of finite-`Lᵖ` centered-cube data. -/ +noncomputable def finiteLpSolutionApproximation + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) : H10Function (openCubeSet (originCube d m)) := + openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 + (finiteLpDataApproximation h n).toField + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) + (finiteLpDataApproximation h n).euclideanMemL2) + +/-- Each canonical approximate solution satisfies the exact normalized weak +equation on the centered cube. -/ +theorem finiteLpSolutionApproximation_normalized_weak + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (n : ℕ) (psi : H10Function (openCubeSet (originCube d m))) : + sigma0 * ∫ x, + vecDot ((finiteLpSolutionApproximation m hsigma0 h n).toH1Function.grad x) + (psi.toH1Function.grad x) ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot ((finiteLpDataApproximation h n).toField x) + (psi.toH1Function.grad x) ∂(centeredCubeDomain d m).normalizedVolume := by + exact openCubeSetScalarDivergenceSolution_normalized_weak m hsigma0 + (finiteLpDataApproximation h n).toField + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) + (finiteLpDataApproximation h n).euclideanMemL2) psi + +private theorem tendsto_eLpNorm_sub_finiteLpDataApproximation_pair + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h : CubeEuclideanLpField Q q) : + Tendsto (fun nk : ℕ × ℕ => eLpNorm + (fun x => HilbertVec.ofVec + ((finiteLpDataApproximation h nk.1).toField x - + (finiteLpDataApproximation h nk.2).toField x)) + q.exponent (normalizedCubeMeasure Q)) atTop (nhds 0) := by + have htend := tendsto_eLpNorm_sub_finiteLpDataApproximation h + have hfst : Tendsto (Prod.fst : ℕ × ℕ → ℕ) atTop atTop := by + simpa only [prod_atTop_atTop_eq] using + (tendsto_fst : Tendsto (Prod.fst : ℕ × ℕ → ℕ) (atTop ×ˢ atTop) atTop) + have hsnd : Tendsto (Prod.snd : ℕ × ℕ → ℕ) atTop atTop := by + simpa only [prod_atTop_atTop_eq] using + (tendsto_snd : Tendsto (Prod.snd : ℕ × ℕ → ℕ) (atTop ×ˢ atTop) atTop) + have htend_fst : Tendsto (fun nk : ℕ × ℕ => eLpNorm + (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h nk.1).toField x)) + q.exponent (normalizedCubeMeasure Q)) atTop (nhds 0) := + htend.comp hfst + have htend_snd : Tendsto (fun nk : ℕ × ℕ => eLpNorm + (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h nk.2).toField x)) + q.exponent (normalizedCubeMeasure Q)) atTop (nhds 0) := + htend.comp hsnd + have hsum : Tendsto (fun nk : ℕ × ℕ => + eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h nk.1).toField x)) + q.exponent (normalizedCubeMeasure Q) + + eLpNorm (fun x => HilbertVec.ofVec + (h.toField x - (finiteLpDataApproximation h nk.2).toField x)) + q.exponent (normalizedCubeMeasure Q)) atTop (nhds 0) := by + simpa using htend_fst.add htend_snd + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun _ => zero_le) (fun nk => ?_) + let hn := finiteLpDataApproximation h nk.1 + let hk := finiteLpDataApproximation h nk.2 + have hhn : MemLp (fun x => HilbertVec.ofVec (h.toField x - hn.toField x)) + q.exponent (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVecL_apply] using! h.euclideanMemLp.sub hn.euclideanMemLp + have hhk : MemLp (fun x => HilbertVec.ofVec (h.toField x - hk.toField x)) + q.exponent (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVecL_apply] using! h.euclideanMemLp.sub hk.euclideanMemLp + have heq : (fun x => HilbertVec.ofVec (hn.toField x - hk.toField x)) = + (fun x => -HilbertVec.ofVec (h.toField x - hn.toField x)) + + fun x => HilbertVec.ofVec (h.toField x - hk.toField x) := by + funext x + rw [show hn.toField x - hk.toField x = + -(h.toField x - hn.toField x) + (h.toField x - hk.toField x) by abel] + simpa only [Pi.add_apply, Pi.neg_apply] using! + (HilbertVec.ofVecL d).map_add + (-(h.toField x - hn.toField x)) (h.toField x - hk.toField x) + rw [heq] + exact (eLpNorm_add_le hhn.neg.aestronglyMeasurable hhk.aestronglyMeasurable + q.one_lt.le).trans (by rw [eLpNorm_neg]) + +/-- One constant depending only on the dimension and exponent controls the +canonical approximate solutions uniformly, and their gradients are Cauchy in +the exact centered normalized Euclidean `L^p` norm. -/ +theorem exists_tendsto_normalizedEuclideanLpENorm_finiteLpSolutionApproximation_grad_sub + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) (hsigma0 : 0 < sigma0), + Tendsto (fun nk : ℕ × ℕ => + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => + (finiteLpSolutionApproximation m hsigma0 h nk.1).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h nk.2).toH1Function.grad x)) + atTop (nhds 0) := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_solution_stability d q + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h hsigma0 + have hdata : Tendsto (fun nk : ℕ × ℕ => + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => + (finiteLpDataApproximation h nk.1).toField x - + (finiteLpDataApproximation h nk.2).toField x)) atTop (nhds 0) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + (tendsto_eLpNorm_sub_finiteLpDataApproximation_pair h) + have hright : Tendsto (fun nk : ℕ × ℕ => + C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => + (finiteLpDataApproximation h nk.1).toField x - + (finiteLpDataApproximation h nk.2).toField x)) atTop (nhds 0) := by + have hfactor_ne_top : C * (ENNReal.ofReal sigma0)⁻¹ ≠ ∞ := + ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0))) + simpa only [mul_zero, mul_assoc] using + ENNReal.Tendsto.const_mul (a := C * (ENNReal.ofReal sigma0)⁻¹) + hdata (Or.inr hfactor_ne_top) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hright + (fun _ => zero_le) (fun nk => ?_) + exact hC m sigma0 (finiteLpDataApproximation h nk.1) (finiteLpDataApproximation h nk.2) + (finiteLpSolutionApproximation m hsigma0 h nk.1) + (finiteLpSolutionApproximation m hsigma0 h nk.2) hsigma0 + (fun psi => finiteLpSolutionApproximation_normalized_weak m hsigma0 h nk.1 psi) + (fun psi => finiteLpSolutionApproximation_normalized_weak m hsigma0 h nk.2 psi) + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionStability.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionStability.lean new file mode 100644 index 0000000000..94384464ae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpSolutionStability.lean @@ -0,0 +1,173 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo + +/-! +# Stability of finite-exponent cube divergence solutions + +The supplied-solution cube Calderón--Zygmund estimate applies to the +difference of two zero-trace solutions. This file packages that subtraction +step, retaining the same exponent-only constant and the exact inverse +coefficient scaling. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private noncomputable def cubeEuclideanL2LpFieldSub + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h k : CubeEuclideanL2LpField Q q) : CubeEuclideanL2LpField Q q where + toField := fun x => h.toField x - k.toField x + euclideanMemLp := by + exact h.euclideanMemLp.sub k.euclideanMemLp + euclideanMemL2 := by + exact h.euclideanMemL2.sub k.euclideanMemL2 + +@[simp] private theorem cubeEuclideanL2LpFieldSub_toField + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (h k : CubeEuclideanL2LpField Q q) : + (cubeEuclideanL2LpFieldSub h k).toField = fun x => h.toField x - k.toField x := + rfl + +private theorem H10Function.sub_grad + {d : ℕ} {U : Set (Vec d)} (u v : H10Function U) : + (u - v).toH1Function.grad = fun x => u.toH1Function.grad x - v.toH1Function.grad x := by + change (u.toH1Function - v.toH1Function).grad = _ + rw [H1Function.sub_grad] + +private theorem memVectorL2_openCubeSet_of_euclideanMemLpTwo + {d : ℕ} (Q : TriadicCube d) {F : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q)) : + MemVectorL2 (openCubeSet Q) F := by + have hvec : MemLp F 2 (normalizedCubeMeasure Q) := by + apply MemLp.of_eval + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [Measure.smul_apply, Measure.smul_apply] + change ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * cubeMeasure Q s) = cubeMeasure Q s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hcube : MemLp F 2 (cubeMeasure Q) := + hvec.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa only [MemVectorL2, volumeMeasureOn, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using hcube + +private theorem centeredCube_integrable_vecDot_of_memVectorL2 + {d : ℕ} (m : ℤ) {F G : Vec d → Vec d} + (hF : MemVectorL2 (openCubeSet (originCube d m)) F) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + Integrable (fun x => vecDot (F x) (G x)) + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (integrableOn_vecDot_of_memVectorL2 hF hG).smul_measure ENNReal.ofReal_ne_top + +private theorem isCenteredCubeH10ScalarDivergenceSolution_sub + {d : ℕ} {q : FiniteLpExponent} (m : ℤ) (sigma0 : ℝ) + (h k : CubeEuclideanL2LpField (originCube d m) q) + (u v : H10Function (openCubeSet (originCube d m))) + (hu : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo) + (hv : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 v k.toLpTwo) : + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 (u - v) + (cubeEuclideanL2LpFieldSub h k).toLpTwo := by + intro phi + have hu_phi := hu phi + have hv_phi := hv phi + change sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume at hu_phi + change sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (k.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume at hv_phi + change sigma0 * ∫ x, vecDot ((u.toH1Function - v.toH1Function).grad x) + (phi.toH1Function.grad x) ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x - k.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume + rw [H1Function.sub_grad] + simp_rw [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + have hhu := centeredCube_integrable_vecDot_of_memVectorL2 m + u.toH1Function.grad_memVectorL2 phi.toH1Function.grad_memVectorL2 + have hhv := centeredCube_integrable_vecDot_of_memVectorL2 m + v.toH1Function.grad_memVectorL2 phi.toH1Function.grad_memVectorL2 + have hhh := centeredCube_integrable_vecDot_of_memVectorL2 m + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) h.euclideanMemL2) + phi.toH1Function.grad_memVectorL2 + have hhk := centeredCube_integrable_vecDot_of_memVectorL2 m + (memVectorL2_openCubeSet_of_euclideanMemLpTwo (originCube d m) k.euclideanMemL2) + phi.toH1Function.grad_memVectorL2 + change sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (phi.toH1Function.grad x) - + vecDot (v.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) - + vecDot (k.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume + rw [integral_sub hhu hhv, integral_sub hhh hhk, mul_sub] + linarith + +namespace INTERNAL + +/-- Two zero-trace scalar divergence solutions on the same centered cube are +Lipschitz in their data in the normalized Euclidean `L^q` gradient norm. The +constant is precisely the one supplied by +`centeredCubeH10ScalarDivergence_cz`. -/ +theorem centeredCubeH10ScalarDivergence_solution_stability + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h k : CubeEuclideanL2LpField (originCube d m) q) + (u v : H10Function (openCubeSet (originCube d m))), 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 u h.toLpTwo → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 v k.toLpTwo → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => u.toH1Function.grad x - v.toH1Function.grad x) ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => h.toField x - k.toField x) := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz d q + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h k u v hsigma0 hu hv + have hsub := hC m sigma0 (cubeEuclideanL2LpFieldSub h k) (u - v) hsigma0 + (isCenteredCubeH10ScalarDivergenceSolution_sub m sigma0 h k u v hu hv) + simpa only [H10Function.sub_grad, cubeEuclideanL2LpFieldSub_toField] using hsub + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpW10pLimit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpW10pLimit.lean new file mode 100644 index 0000000000..6688c2d15b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/FiniteLpW10pLimit.lean @@ -0,0 +1,438 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H10GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroTraceClosure +public import Mathlib.Order.Filter.AtTopBot.Prod + +/-! +# Canonical zero-trace finite-`L^p` solution limits + +The canonical bounded-data `H¹₀` solutions have finite-`L^p` gradients and +therefore have exact `W^{1,p}_0` upgrades. Zero-trace Poincare control turns the +already constructed gradient convergence into scalar-value Cauchy control. +Completeness of `L^p` then supplies the scalar representative paired with the +canonical limiting gradient. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory _root_.Filter Topology +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private instance instFiniteLpW10pLimitFactOneLe (q : FiniteLpExponent) : + Fact (1 ≤ q.exponent) := + ⟨q.one_lt.le⟩ + +/-- The selected canonical bounded-data solution, upgraded to `W^{1,p}_0` without +changing either its value or gradient representative. -/ +noncomputable def finiteLpW10pSolutionApproximation + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N : ℕ) : W10pFunction (openCubeSet (originCube d m)) q.exponent := + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toW10pOfGradMemLp + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)) q + (finiteLpSolutionApproximation_gradMemLp m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)) + +@[simp] theorem finiteLpW10pSolutionApproximation_toFun + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N : ℕ) : + (finiteLpW10pSolutionApproximation q m hsigma0 h N).toFun = + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.toFun := + H10Function.toW10pOfGradMemLp_toFun _ _ _ _ + +@[simp] theorem finiteLpW10pSolutionApproximation_grad + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N : ℕ) : + (finiteLpW10pSolutionApproximation q m hsigma0 h N).grad = + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h N)).toH1Function.grad := + H10Function.toW10pOfGradMemLp_grad _ _ _ _ + +private theorem tendsto_eLpNorm_finiteLpSolutionApproximation_grad_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun nk : ℕ × ℕ => eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + let Du := finiteLpGradientLimit q m hsigma0 h + let F : ℕ → Vec d → HilbertVec d := fun N x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h N).grad x - Du x) + have hbase := + tendsto_eLpNorm_finiteLpSolutionApproximation_grad_sub_finiteLpGradientLimit + q m hsigma0 h + have hfst : Filter.Tendsto (Prod.fst : ℕ × ℕ → ℕ) Filter.atTop Filter.atTop := by + simpa only [Filter.prod_atTop_atTop_eq] using + (Filter.tendsto_fst : Filter.Tendsto (Prod.fst : ℕ × ℕ → ℕ) + (Filter.atTop ×ˢ Filter.atTop) Filter.atTop) + have hsnd : Filter.Tendsto (Prod.snd : ℕ × ℕ → ℕ) Filter.atTop Filter.atTop := by + simpa only [Filter.prod_atTop_atTop_eq] using + (Filter.tendsto_snd : Filter.Tendsto (Prod.snd : ℕ × ℕ → ℕ) + (Filter.atTop ×ˢ Filter.atTop) Filter.atTop) + have hfst_norm : Filter.Tendsto (fun nk : ℕ × ℕ => eLpNorm (F nk.1) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + simpa only [F, finiteLpW10pSolutionApproximation_grad, Du] using! hbase.comp hfst + have hsnd_norm : Filter.Tendsto (fun nk : ℕ × ℕ => eLpNorm (F nk.2) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + simpa only [F, finiteLpW10pSolutionApproximation_grad, Du] using! hbase.comp hsnd + have hsum := hfst_norm.add hsnd_norm + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds + (by simpa using hsum) (fun _ => zero_le) (fun nk => ?_) + have hfn : MemLp (F nk.1) q.exponent + (volume.restrict (openCubeSet (originCube d m))) := by + rw [memLp_piLp_iff] + intro i + simpa only [F, Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply, + Pi.sub_apply] using! + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).gradMemLp i).sub + (finiteLpGradientLimit_gradMemLp q m hsigma0 h i) + have hfk : MemLp (F nk.2) q.exponent + (volume.restrict (openCubeSet (originCube d m))) := by + rw [memLp_piLp_iff] + intro i + simpa only [F, Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply, + Pi.sub_apply] using! + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).gradMemLp i).sub + (finiteLpGradientLimit_gradMemLp q m hsigma0 h i) + have heq : (fun x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x)) = + fun x => F nk.1 x - F nk.2 x := by + funext x + simp only [F] + rw [show + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x = + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - Du x) - + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x - Du x) by abel] + exact (HilbertVec.ofVecL d).map_sub _ _ + rw [heq] + exact eLpNorm_sub_le hfn.aestronglyMeasurable hfk.aestronglyMeasurable q.one_lt.le + +private theorem tendsto_sum_eLpNorm_finiteLpSolutionApproximation_gradCoord_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun nk : ℕ × ℕ => ∑ i : Fin d, eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + have hvec := tendsto_eLpNorm_finiteLpSolutionApproximation_grad_pair q m hsigma0 h + have hright : Filter.Tendsto (fun nk : ℕ × ℕ => (d : ℝ≥0∞) * eLpNorm + (fun x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + simpa only [mul_zero] using! ENNReal.Tendsto.const_mul hvec (Or.inr ENNReal.coe_ne_top) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hright + (fun _ => zero_le) (fun nk => ?_) + calc + ∑ i : Fin d, eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))) ≤ + ∑ _i : Fin d, eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + apply Finset.sum_le_sum + intro i _ + simpa only [Pi.sub_apply] using coordinate_eLpNorm_le_euclidean + (volume.restrict (openCubeSet (originCube d m))) q + (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x) i + _ = (d : ℝ≥0∞) * eLpNorm (fun x => HilbertVec.ofVec + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x)) + q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + simp only [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + +private theorem finiteLpW10pSolutionApproximation_poincare_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (C : ℝ) (hPoincare : ∀ u : W10pFunction (openCubeSet (originCube d m)) q.exponent, + ENNReal.toReal (eLpNorm u.toFun q.exponent + (volume.restrict (openCubeSet (originCube d m)))) ≤ + C * ∑ i : Fin d, ENNReal.toReal (eLpNorm (fun x => u.grad x i) q.exponent + (volume.restrict (openCubeSet (originCube d m))))) + (nk : ℕ × ℕ) : + ENNReal.toReal (eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h nk.1 x - + finiteLpW10pSolutionApproximation q m hsigma0 h nk.2 x) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) ≤ + C * ∑ i : Fin d, ENNReal.toReal (eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) := by + let v : H10Function (openCubeSet (originCube d m)) := + finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.1) - + finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.2) + have hvgrad : GradMemLpOn (openCubeSet (originCube d m)) q.exponent + v.toH1Function.grad := by + intro i + rw [show v.toH1Function.grad = fun x => + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.1)).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.2)).toH1Function.grad x by + dsimp only [v] + exact H1Function.sub_grad _ _] + exact (finiteLpSolutionApproximation_gradMemLp m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.1) i).sub + (finiteLpSolutionApproximation_gradMemLp m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.2) i) + let w : W10pFunction (openCubeSet (originCube d m)) q.exponent := + v.toW10pOfGradMemLp + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)) q hvgrad + have hvfun : v.toH1Function.toFun = fun x => + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.1)).toH1Function.toFun x - + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.2)).toH1Function.toFun x := by + dsimp only [v] + exact H1Function.sub_toFun _ _ + have hvgrad_eq : v.toH1Function.grad = fun x => + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.1)).toH1Function.grad x - + (finiteLpSolutionApproximation m hsigma0 h + (finiteLpGradientLimitSubsequence q m hsigma0 h nk.2)).toH1Function.grad x := by + dsimp only [v] + exact H1Function.sub_grad _ _ + have hbound := hPoincare w + rw [show w.toFun = v.toH1Function.toFun by + exact H10Function.toW10pOfGradMemLp_toFun _ _ _ _, + show w.grad = v.toH1Function.grad by + exact H10Function.toW10pOfGradMemLp_grad _ _ _ _, hvfun, hvgrad_eq] at hbound + simpa only [finiteLpW10pSolutionApproximation_toFun, + finiteLpW10pSolutionApproximation_grad, Pi.sub_apply] using hbound + +private theorem tendsto_sum_toReal_eLpNorm_finiteLpSolutionApproximation_gradCoord_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun nk : ℕ × ℕ => ∑ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))))) Filter.atTop (nhds 0) := by + have hgrad := + tendsto_sum_eLpNorm_finiteLpSolutionApproximation_gradCoord_pair q m hsigma0 h + let A : ℕ × ℕ → Fin d → ℝ≥0∞ := fun nk i => eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))) + have hsum_top : ∀ nk : ℕ × ℕ, (∑ i : Fin d, A nk i) ≠ ∞ := by + intro nk + apply ENNReal.sum_ne_top.2 + intro i _ + exact (((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).gradMemLp i).sub + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).gradMemLp i)).eLpNorm_ne_top + have hgrad' : Filter.Tendsto (fun nk => ∑ i : Fin d, A nk i) + Filter.atTop (nhds 0) := by + simpa only [A] using hgrad + have hreal := (ENNReal.tendsto_toReal_zero_iff hsum_top).2 hgrad' + have heq : (fun nk => ENNReal.toReal (∑ i : Fin d, A nk i)) = + fun nk => ∑ i : Fin d, ENNReal.toReal (A nk i) := by + funext nk + apply ENNReal.toReal_sum + intro i _ + exact (((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).gradMemLp i).sub + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).gradMemLp i)).eLpNorm_ne_top + rw [heq] at hreal + simpa only [A] using hreal + +private theorem tendsto_toReal_eLpNorm_finiteLpW10pSolutionApproximation_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun nk : ℕ × ℕ => ENNReal.toReal (eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h nk.1 x - + finiteLpW10pSolutionApproximation q m hsigma0 h nk.2 x) + q.exponent (volume.restrict (openCubeSet (originCube d m))))) + Filter.atTop (nhds 0) := by + obtain ⟨C, _hCnonneg, hPoincare⟩ := + W10pFunction.exists_poincare_constant_of_isOpenBoundedConvexDomain + q.one_lt q.lt_top.ne (isOpenBoundedConvexDomain_openCubeSet (originCube d m)) + have hgrad_real := + tendsto_sum_toReal_eLpNorm_finiteLpSolutionApproximation_gradCoord_pair + q m hsigma0 h + have hright : Filter.Tendsto (fun nk : ℕ × ℕ => C * ∑ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).grad x i - + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m))))) Filter.atTop (nhds 0) := by + simpa only [mul_zero] using tendsto_const_nhds.mul hgrad_real + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hright + (fun _ => ENNReal.toReal_nonneg) (fun nk => ?_) + exact finiteLpW10pSolutionApproximation_poincare_pair q m hsigma0 h C + (by simpa only [volumeMeasureOn] using hPoincare) nk + +private theorem tendsto_eLpNorm_finiteLpW10pSolutionApproximation_pair + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun nk : ℕ × ℕ => eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h nk.1 x - + finiteLpW10pSolutionApproximation q m hsigma0 h nk.2 x) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop (nhds 0) := by + let B : ℕ × ℕ → ℝ≥0∞ := fun nk => eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h nk.1 x - + finiteLpW10pSolutionApproximation q m hsigma0 h nk.2 x) + q.exponent (volume.restrict (openCubeSet (originCube d m))) + have hBtop : ∀ nk, B nk ≠ ∞ := by + intro nk + exact (((finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).memLp).sub + ((finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).memLp)).eLpNorm_ne_top + have hreal : Filter.Tendsto (fun nk => ENNReal.toReal (B nk)) Filter.atTop (nhds 0) := by + simpa only [B] using + tendsto_toReal_eLpNorm_finiteLpW10pSolutionApproximation_pair q m hsigma0 h + have hB := (ENNReal.tendsto_toReal_zero_iff hBtop).1 hreal + simpa only [B] using hB + +private noncomputable def finiteLpW10pSolutionApproximationLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (N : ℕ) : + Lp ℝ q.exponent (volume.restrict (openCubeSet (originCube d m))) := + (finiteLpW10pSolutionApproximation q m hsigma0 h N).memLp.toLp _ + +private theorem cauchySeq_finiteLpW10pSolutionApproximationLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + CauchySeq (finiteLpW10pSolutionApproximationLp q m hsigma0 h) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + rw [Lp.cauchySeq_Lp_iff_cauchySeq_eLpNorm] + have hpair := tendsto_eLpNorm_finiteLpW10pSolutionApproximation_pair q m hsigma0 h + refine hpair.congr' ?_ + filter_upwards [] with nk + apply eLpNorm_congr_ae + filter_upwards [MemLp.coeFn_toLp + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.1).memLp, + MemLp.coeFn_toLp + (finiteLpW10pSolutionApproximation q m hsigma0 h nk.2).memLp] with x hx hy + simp only [finiteLpW10pSolutionApproximationLp, Pi.sub_apply] + rw [hx, hy] + +private noncomputable def finiteLpW10pSolutionLimitLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Lp ℝ q.exponent (volume.restrict (openCubeSet (originCube d m))) := by + letI : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + exact Classical.choose (cauchySeq_tendsto_of_complete + (cauchySeq_finiteLpW10pSolutionApproximationLp q m hsigma0 h)) + +private theorem tendsto_finiteLpW10pSolutionApproximationLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (finiteLpW10pSolutionApproximationLp q m hsigma0 h) Filter.atTop + (nhds (finiteLpW10pSolutionLimitLp q m hsigma0 h)) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + exact Classical.choose_spec (cauchySeq_tendsto_of_complete + (cauchySeq_finiteLpW10pSolutionApproximationLp q m hsigma0 h)) + +private theorem tendsto_eLpNorm_finiteLpW10pSolutionApproximation_sub_limitLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun N => eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h N x - + finiteLpW10pSolutionLimitLp q m hsigma0 h x) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop + (nhds 0) := by + let : Fact (1 ≤ q.exponent) := ⟨q.one_lt.le⟩ + have htend := (Lp.tendsto_Lp_iff_tendsto_eLpNorm' + (finiteLpW10pSolutionApproximationLp q m hsigma0 h) + (finiteLpW10pSolutionLimitLp q m hsigma0 h)).1 + (tendsto_finiteLpW10pSolutionApproximationLp q m hsigma0 h) + refine htend.congr' ?_ + filter_upwards [] with N + apply eLpNorm_congr_ae + filter_upwards [MemLp.coeFn_toLp + (finiteLpW10pSolutionApproximation q m hsigma0 h N).memLp] with x hx + simp only [finiteLpW10pSolutionApproximationLp, Pi.sub_apply] + rw [hx] + +/-- The canonical arbitrary-data zero-trace `W^{1,p}_0` solution selected by +completion of the bounded-data approximants. -/ +noncomputable def finiteLpW10pSolutionLimit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + W10pFunction (openCubeSet (originCube d m)) q.exponent := + W10pFunction.ofTendstoELpNorm q + (MeasureTheory.Lp.memLp (finiteLpW10pSolutionLimitLp q m hsigma0 h)) + (finiteLpGradientLimit_gradMemLp q m hsigma0 h) + (finiteLpW10pSolutionApproximation q m hsigma0 h) + (tendsto_eLpNorm_finiteLpW10pSolutionApproximation_sub_limitLp q m hsigma0 h) + (fun i => by + simpa only [finiteLpW10pSolutionApproximation_grad] using + tendsto_eLpNorm_finiteLpSolutionApproximation_gradCoord_sub_finiteLpGradientLimit + q m hsigma0 h i) + +@[simp] private theorem finiteLpW10pSolutionLimit_toFun + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + (finiteLpW10pSolutionLimit q m hsigma0 h).toFun = + finiteLpW10pSolutionLimitLp q m hsigma0 h := + W10pFunction.ofTendstoELpNorm_toFun _ _ _ _ _ _ + +@[simp] theorem finiteLpW10pSolutionLimit_grad + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + (finiteLpW10pSolutionLimit q m hsigma0 h).grad = + finiteLpGradientLimit q m hsigma0 h := + W10pFunction.ofTendstoELpNorm_grad _ _ _ _ _ _ + +/-- The selected bounded-data solution values converge strongly in the raw +cube `L^p` norm to the canonical zero-trace limit. -/ +theorem tendsto_eLpNorm_finiteLpW10pSolutionApproximation_sub_limit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) : + Filter.Tendsto (fun N => eLpNorm (fun x => + finiteLpW10pSolutionApproximation q m hsigma0 h N x - + finiteLpW10pSolutionLimit q m hsigma0 h x) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop + (nhds 0) := by + simpa only [finiteLpW10pSolutionLimit_toFun] using + tendsto_eLpNorm_finiteLpW10pSolutionApproximation_sub_limitLp q m hsigma0 h + +/-- The selected bounded-data solution gradients converge coordinatewise to +the exact gradient of the canonical zero-trace limit. -/ +theorem tendsto_eLpNorm_finiteLpW10pSolutionApproximation_gradCoord_sub_limit + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (h : CubeEuclideanLpField (originCube d m) q) + (i : Fin d) : + Filter.Tendsto (fun N => eLpNorm (fun x => + (finiteLpW10pSolutionApproximation q m hsigma0 h N).grad x i - + (finiteLpW10pSolutionLimit q m hsigma0 h).grad x i) + q.exponent (volume.restrict (openCubeSet (originCube d m)))) Filter.atTop + (nhds 0) := by + simpa only [finiteLpW10pSolutionApproximation_grad, + finiteLpW10pSolutionLimit_grad] using + tendsto_eLpNorm_finiteLpSolutionApproximation_gradCoord_sub_finiteLpGradientLimit + q m hsigma0 h i + +end INTERNAL + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalLocalization.lean new file mode 100644 index 0000000000..37f9621a17 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalLocalization.lean @@ -0,0 +1,147 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTailRestrict + +/-! # Global Localization -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Localization for the global good-`λ` extension + +The global good-`λ` argument extends the reflected parent-cube gradient and +datum by zero. This file records exactly the identities which let that +global extension be used on a ball lying in the original parent cube. In +particular, no assertion identifies the extension with the original function +away from its support. +-/ + +/-- On every set contained in `U`, the zero extension `U.indicator f` agrees +pointwise (and hence almost everywhere) with `f`. -/ +theorem indicator_aeEq_of_subset {α E : Type*} [MeasurableSpace α] + [Zero E] {μ : Measure α} {U B : Set α} {f : α → E} + (hB : MeasurableSet B) (hBU : B ⊆ U) : + U.indicator f =ᵐ[μ.restrict B] f := by + filter_upwards [ae_restrict_mem hB] with x hx + exact Set.indicator_of_mem (hBU hx) f + +/-- Measurability of a zero extension is precisely measurability of the +underlying function on its support. -/ +theorem aestronglyMeasurable_indicator_iff_restrict {α E : Type*} + [MeasurableSpace α] [TopologicalSpace E] [Zero E] + {μ : Measure α} {U : Set α} {f : α → E} + (hU : MeasurableSet U) : + AEStronglyMeasurable (U.indicator f) μ ↔ + AEStronglyMeasurable f (μ.restrict U) := + aestronglyMeasurable_indicator_iff hU + +/-- The global `Lᵖ` membership of a zero extension is exactly its local +membership on the support. -/ +theorem memLp_indicator_iff_restrict {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] {μ : Measure α} {U : Set α} {f : α → E} + {p : ℝ≥0∞} (hU : MeasurableSet U) : + MemLp (U.indicator f) p μ ↔ MemLp f p (μ.restrict U) := + MeasureTheory.memLp_indicator_iff_restrict hU + +/-- Integrating a zero extension over the ambient space is integration of the +original function over its measurable support. -/ +theorem integral_indicator_eq_integral_restrict {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {μ : Measure α} {U : Set α} {f : α → E} (hU : MeasurableSet U) : + ∫ x, U.indicator f x ∂μ = ∫ x in U, f x ∂μ := + MeasureTheory.integral_indicator hU + +/-- The analogous identity for nonnegative extended-valued integrands. -/ +theorem lintegral_indicator_eq_lintegral_restrict {α : Type*} [MeasurableSpace α] + {μ : Measure α} {U : Set α} {f : α → ℝ≥0∞} (hU : MeasurableSet U) : + ∫⁻ x, U.indicator f x ∂μ = ∫⁻ x in U, f x ∂μ := + MeasureTheory.lintegral_indicator hU f + +/-- Squared weighted measure commutes exactly with extension by zero: its +base measure is simply restricted to the support. -/ +theorem sqWeightedMeasure_indicator_eq_restrict {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] {μ : Measure α} {U : Set α} {f : α → E} + (hU : MeasurableSet U) : + sqWeightedMeasure (U.indicator f) μ = sqWeightedMeasure f (μ.restrict U) := by + change μ.withDensity (fun x => ENNReal.ofReal (‖U.indicator f x‖ ^ (2 : ℕ))) = + (μ.restrict U).withDensity (fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) + rw [show (fun x => ENNReal.ofReal (‖U.indicator f x‖ ^ (2 : ℕ))) = + U.indicator (fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · simp [Set.indicator_of_notMem hx]] + exact MeasureTheory.withDensity_indicator hU _ + +/-- On a measurable set inside `U`, squared weighted mass is unchanged by +extension by zero. The test set need not itself be measurable. -/ +theorem sqWeightedMeasure_indicator_restrict_eq_of_subset {α E : Type*} + [MeasurableSpace α] [NormedAddCommGroup E] {μ : Measure α} + {U B : Set α} {f : α → E} (hU : MeasurableSet U) (hB : MeasurableSet B) + (hBU : B ⊆ U) : + (sqWeightedMeasure (U.indicator f) μ).restrict B = + (sqWeightedMeasure f μ).restrict B := by + rw [sqWeightedMeasure_indicator_eq_restrict hU] + change ((μ.restrict U).withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))).restrict B = + (μ.withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))).restrict B + rw [← MeasureTheory.restrict_withDensity hU] + ext s hs + rw [Measure.restrict_apply' hB, Measure.restrict_apply' hB, + Measure.restrict_apply' hU] + rw [Set.inter_eq_left.mpr (Set.inter_subset_right.trans hBU)] + +/-- A positive-level tail of a zero extension is the corresponding tail +inside its support. -/ +theorem indicator_tail_set_eq_inter {α E : Type*} [NormedAddCommGroup E] + {U : Set α} {f : α → E} {a : ℝ} (ha : 0 < a) : + {x | a < ‖U.indicator f x‖} = U ∩ {x | a < ‖f x‖} := by + ext x + by_cases hx : x ∈ U + · simp [hx] + · simp [hx, not_lt_of_ge ha.le] + +/-- Inside a set contained in `U`, level tails and their squared weighted +mass are exactly those of the unextended function. -/ +theorem sqWeightedMeasure_indicator_tail_inter_eq_of_subset {α E : Type*} + [MeasurableSpace α] [NormedAddCommGroup E] {μ : Measure α} + {U B : Set α} {f : α → E} {a : ℝ} (hU : MeasurableSet U) + (hB : MeasurableSet B) (hBU : B ⊆ U) : + sqWeightedMeasure (U.indicator f) μ ({x | a < ‖U.indicator f x‖} ∩ B) = + sqWeightedMeasure f μ ({x | a < ‖f x‖} ∩ B) := by + have htail : {x | a < ‖U.indicator f x‖} ∩ B = + {x | a < ‖f x‖} ∩ B := by + ext x + by_cases hx : x ∈ B + · simp only [Set.mem_inter_iff, Set.mem_ofPred_eq, hx, and_true] + rw [Set.indicator_of_mem (hBU hx)] + · simp only [Set.mem_inter_iff, hx, and_false] + rw [htail] + have hrestrict := sqWeightedMeasure_indicator_restrict_eq_of_subset + (μ := μ) (f := f) hU hB hBU + have happly := congrArg (fun ν : Measure α => ν ({x | a < ‖f x‖} ∩ B)) hrestrict + change (sqWeightedMeasure (U.indicator f) μ).restrict B ({x | a < ‖f x‖} ∩ B) = + (sqWeightedMeasure f μ).restrict B ({x | a < ‖f x‖} ∩ B) at happly + rw [Measure.restrict_apply' hB, Measure.restrict_apply' hB] at happly + simpa only [Set.inter_assoc, Set.inter_self] using happly + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalParentGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalParentGeometry.lean new file mode 100644 index 0000000000..34004f7e8b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalParentGeometry.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingCubeGeometry + +/-! # Global Parent Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace CubeCalderonZygmund + +open Set + +/-! +# Global parent geometry for cube Calderón–Zygmund stopping balls + +The local harmonic comparison is made on an axis cube which realizes a +sup-metric ball about a stopping point. When that point belongs to the +centered cube at scale `m`, the conservative stopping cutoff keeps even the +closed comparison parent inside the open centered cube at scale `m + 1`. +-/ + +/-- A closed ball of radius at most one quarter of the scale-`m` side length +about a point of the centered scale-`m` cube lies in its open next parent. + +The statement uses `cubeRadius / 2` so it composes directly with the +`10 * 3^n` stopping cutoff. -/ +theorem closedBall_subset_openCubeSet_originCube_succ_of_mem + {d : ℕ} {m : ℤ} {x : Vec d} {a : ℝ} + (hx : x ∈ openCubeSet (originCube d m)) (ha_nonneg : 0 ≤ a) + (ha : a ≤ cubeRadius (originCube d m) / 2) : + Metric.closedBall x a ⊆ openCubeSet (originCube d (m + 1)) := by + intro y hy + rw [mem_openCubeSet_originCube_iff] + have hx' := mem_openCubeSet_originCube_iff.mp hx + have hy' : y ∈ Set.pi Set.univ (fun i : Fin d => Metric.closedBall (x i) a) := by + rw [← closedBall_pi x ha_nonneg] + exact hy + intro i + have hyi := hy' i (by simp) + change y i ∈ Metric.closedBall (x i) a at hyi + rw [Real.closedBall_eq_Icc] at hyi + have hscale_pos : 0 < (3 : ℝ) ^ m := by positivity + have ha' : a ≤ (1 / 4 : ℝ) * (3 : ℝ) ^ m := by + calc + a ≤ cubeRadius (originCube d m) / 2 := ha + _ = (1 / 4 : ℝ) * (3 : ℝ) ^ m := by + simp only [cubeRadius, cubeScaleFactor, originCube] + ring + have hleft : + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ (m + 1) = + (-(3 / 2 : ℝ)) * (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + have hright : + (1 / 2 : ℝ) * (3 : ℝ) ^ (m + 1) = + (3 / 2 : ℝ) * (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + constructor + · rw [hleft] + nlinarith [(hx' i).1, hyi.1] + · rw [hright] + nlinarith [(hx' i).2, hyi.2] + +/-- The depth-`n` comparison-parent radius is at most half the radius of the +ambient centered cube under the standard stopping cutoff. -/ +theorem stoppingComparisonParentRadius_le_half_cubeRadius_of_le + {d : ℕ} {m : ℤ} {r : ℝ} (n : ℕ) + (hr : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ n)) : + stoppingComparisonParentMultiplier n * r ≤ cubeRadius (originCube d m) / 2 := by + rw [le_div_iff₀ (by positivity : 0 < 10 * (3 : ℝ) ^ n)] at hr + rw [stoppingComparisonParentMultiplier] + nlinarith + +/-- The closed comparison-parent ball remains in the next centered open cube +whenever the stopping point belongs to the present centered open cube and its +radius obeys the standard cutoff. -/ +theorem stoppingComparisonParent_closedBall_subset_openCubeSet_originCube_succ + {d : ℕ} {m : ℤ} {x : Vec d} {r : ℝ} (n : ℕ) + (hx : x ∈ openCubeSet (originCube d m)) (hr_nonneg : 0 ≤ r) + (hr : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ n)) : + Metric.closedBall x (stoppingComparisonParentMultiplier n * r) ⊆ + openCubeSet (originCube d (m + 1)) := by + apply closedBall_subset_openCubeSet_originCube_succ_of_mem hx + · exact mul_nonneg (by simp [stoppingComparisonParentMultiplier]) hr_nonneg + · exact stoppingComparisonParentRadius_le_half_cubeRadius_of_le n hr + +/-- The open axis-cube comparison parent remains in the next centered open +cube under the standard stopping cutoff. -/ +theorem stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + {d : ℕ} {m : ℤ} {x : Vec d} {r : ℝ} (n : ℕ) + (hx : x ∈ openCubeSet (originCube d m)) (hr_pos : 0 < r) + (hr : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ n)) : + axisCube (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) ⊆ + openCubeSet (originCube d (m + 1)) := by + rw [stoppingComparisonParent_axisCube_eq_ball x hr_pos n] + exact (Metric.ball_subset_closedBall.trans + (stoppingComparisonParent_closedBall_subset_openCubeSet_originCube_succ n hx hr_pos.le hr)) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalStoppingFamily.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalStoppingFamily.lean new file mode 100644 index 0000000000..ad2729e88e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GlobalStoppingFamily.lean @@ -0,0 +1,131 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaLargeScale +public import Mathlib.MeasureTheory.Function.L2Space + +/-! # Global Stopping Family -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators Topology +open Filter MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Global stopping families for the cube good-`λ` argument + +This module turns the a.e. differentiation theorem and the global `L²` +cutoff into one radius at every relevant centre. It is deliberately +independent of the PDE comparison: the returned last-exit certificates are +the complete interface consumed by the later Vitali assembly. +-/ + +/-- Above the global `L²` cutoff, every designated high-field point has an +exact stopping radius below the conservative comparison cutoff. + +The differentiation set is constructed internally. The radius is a total +function only to match the Vitali API; its values away from `target ∩ D` are +irrelevant. -/ +theorem exists_globalStoppingFamily + {d : ℕ} [NeZero d] {m : ℤ} {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (depth : ℕ) (f : Vec d → F) (g : Vec d → G) (eps M level : ℝ) + (hf : MemLp f 2 volume) (hg : MemLp g 2 volume) + (heps : 0 < eps) (hM : 1 ≤ M) + (hlevel : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, ‖g y‖ ^ (2 : ℕ) ∂volume)) < level) + (target : Set (Vec d)) + (htarget : ∀ x ∈ target, M * level < ‖f x‖) : + ∃ D : Set (Vec d), ∃ radius : Vec d → ℝ, + volume Dᶜ = 0 ∧ + ∀ x ∈ target ∩ D, + 0 < radius x ∧ + radius x ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth) ∧ + goodLambdaCombinedEnergy f g eps x (radius x) = level ∧ + ∀ s ∈ Icc (radius x) (cubeRadius (originCube d m)), + goodLambdaCombinedEnergy f g eps x s ≤ level := by + have hf_int : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) volume := + (MeasureTheory.memLp_two_iff_integrable_sq_norm hf.aestronglyMeasurable).1 hf + have hg_int : Integrable (fun y => ‖g y‖ ^ (2 : ℕ)) volume := + (MeasureTheory.memLp_two_iff_integrable_sq_norm hg.aestronglyMeasurable).1 hg + let R : ℝ := cubeRadius (originCube d m) + let rho : ℝ := R / (10 * (3 : ℝ) ^ depth) + have hR : 0 < R := cubeRadius_pos _ + have hdenom : 0 < 10 * (3 : ℝ) ^ depth := by positivity + have hrho : 0 < rho := div_pos hR hdenom + have hdenom_one : 1 ≤ 10 * (3 : ℝ) ^ depth := by + have hpow : 1 ≤ (3 : ℝ) ^ depth := one_le_pow₀ (by norm_num) + nlinarith + have hrhoR : rho ≤ R := by + exact div_le_self hR.le hdenom_one + have hcutoff : + Real.sqrt (((2 * rho) ^ d)⁻¹ * + ((∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, ‖g y‖ ^ (2 : ℕ) ∂volume)) < level := by + simpa only [R, rho] using hlevel + have hlevel_pos : 0 < level := + lt_of_le_of_lt (Real.sqrt_nonneg _) hcutoff + have heps_weight_pos : 0 < (eps⁻¹) ^ (2 : ℕ) := by + exact sq_pos_of_pos (inv_pos.mpr heps) + have hlarge : ∀ x : Vec d, ∀ s ∈ Icc rho R, + goodLambdaCombinedEnergy f g eps x s ≤ level := by + intro x s hs + exact (goodLambdaCombinedEnergy_le_globalIntegral f g eps hf_int hg_int x hrho hs.1).trans + hcutoff.le + let D : Set (Vec d) := {x | + Tendsto (fun r => goodLambdaCombinedEnergy f g eps x r) (𝓝[>] 0) + (𝓝 (Real.sqrt (‖f x‖ ^ 2 + (eps⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2)))} + have hDae : ∀ᵐ x ∂volume, x ∈ D := by + simpa only [D, Set.mem_ofPred_eq] using + (ae_tendsto_goodLambdaCombinedEnergy_nhdsGT f g eps hf_int hg_int) + have hDnull : volume Dᶜ = 0 := by + simpa only [D, Set.mem_ofPred_eq, Set.compl_ofPred] using (ae_iff.mp hDae) + have hpoint : ∀ x ∈ target ∩ D, + level < Real.sqrt (‖f x‖ ^ 2 + (eps⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2) := by + intro x hx + have htail : M * level < ‖f x‖ := htarget x hx.1 + have hlevel_le_tail : level ≤ M * level := by + nlinarith + have hlevel_norm : level < ‖f x‖ := hlevel_le_tail.trans_lt htail + calc + level < ‖f x‖ := hlevel_norm + _ = Real.sqrt (‖f x‖ ^ 2) := (Real.sqrt_sq (norm_nonneg _)).symm + _ ≤ Real.sqrt (‖f x‖ ^ 2 + (eps⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2) := by + apply Real.sqrt_le_sqrt + exact le_add_of_nonneg_right (mul_nonneg heps_weight_pos.le (sq_nonneg _)) + have hstop : ∀ x ∈ target ∩ D, ∃ r, 0 < r ∧ r ≤ rho ∧ + goodLambdaCombinedEnergy f g eps x r = level ∧ + ∀ s ∈ Icc r R, goodLambdaCombinedEnergy f g eps x s ≤ level := by + intro x hx + exact exists_stoppingRadius_goodLambdaCombinedEnergy_of_largeScaleBound + f g eps hf_int hg_int x hrho hx.2 (hpoint x hx) + (hlarge x rho ⟨le_rfl, hrhoR⟩) (hlarge x) + classical + let radius : Vec d → ℝ := fun x => + if hx : x ∈ target ∩ D then Classical.choose (hstop x hx) else 0 + refine ⟨D, radius, hDnull, ?_⟩ + intro x hx + have hchosen := Classical.choose_spec (hstop x hx) + rw [show radius x = Classical.choose (hstop x hx) by + simp only [radius, dif_pos hx]] + simpa only [R, rho] using hchosen + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambda.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambda.lean new file mode 100644 index 0000000000..8ddbf89fa8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambda.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Covering.Vitali +public import Mathlib.MeasureTheory.Integral.Layercake + +/-! # Good Lambda -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators + +noncomputable section + +/-! +# The real-variable core of the cube Calderón--Zygmund argument + +This file records the two source-independent steps in the global +Caffarelli--Peral argument from `CZestimates.tex`: + +* a bounded family of stopping balls has a disjoint Vitali subfamily whose + fixed enlargements cover the original family; and +* once layer-cake has turned a one-level good-`λ` estimate into a scalar + inequality, the term carrying the unknown quantity can be reabsorbed. + +The construction of the stopping balls, the cube doubling estimate, and the +conversion of local comparison estimates to the one-level estimate belong to +the later cube-specific packet. In particular, neither a harmonic +approximant nor a final Calderón--Zygmund estimate is made a hypothesis here. +-/ + +namespace CubeCalderonZygmund + +/-- A bounded family of closed balls admits a pairwise disjoint subfamily +whose `τ`-enlargements cover the union of the original family. This is the +form of Vitali selection used after the stopping-radius construction in the +global good-`λ` argument. -/ +theorem exists_disjoint_closedBall_subfamily_covering_union + {α ι : Type*} [PseudoMetricSpace α] (t : Set ι) + (centre : ι → α) (radius : ι → ℝ) (R : ℝ) + (hradius : ∀ a ∈ t, radius a ≤ R) (τ : ℝ) (hτ : 3 < τ) : + ∃ u ⊆ t, + (u.PairwiseDisjoint fun a => Metric.closedBall (centre a) (radius a)) ∧ + (⋃ a ∈ t, Metric.closedBall (centre a) (radius a)) ⊆ + ⋃ b ∈ u, Metric.closedBall (centre b) (τ * radius b) := by + obtain ⟨u, hu, hdisjoint, hcover⟩ := + Vitali.exists_disjoint_subfamily_covering_enlargement_closedBall + t centre radius R hradius τ hτ + refine ⟨u, hu, hdisjoint, ?_⟩ + rintro y hy + rcases Set.mem_iUnion₂.mp hy with ⟨a, ha, hya⟩ + obtain ⟨b, hb, hab⟩ := hcover a ha + exact Set.mem_iUnion₂.mpr ⟨b, hb, hab hya⟩ + +/-- The scalar reabsorption step at the end of a good-`λ` proof. Typically +`X` is the weighted layer-cake integral of the solution, `Y` that of the data, +and `θ < 1` is arranged by choosing the good-`λ` parameters internally. -/ +theorem goodLambda_reabsorb {θ X C Y : ℝ} + (hθ : θ < 1) (h : X ≤ θ * X + C * Y) : + X ≤ (C / (1 - θ)) * Y := by + have hdenom : 0 < 1 - θ := sub_pos.mpr hθ + have hscaled : (1 - θ) * X ≤ C * Y := by + calc + (1 - θ) * X = X - θ * X := by ring + _ ≤ C * Y := sub_le_iff_le_add.mpr (by simpa [add_comm] using h) + calc + X ≤ (C * Y) / (1 - θ) := by + apply (le_div_iff₀ hdenom).2 + simpa [mul_comm] using hscaled + _ = (C / (1 - θ)) * Y := by ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaIntegration.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaIntegration.lean new file mode 100644 index 0000000000..5cf8559fb6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaIntegration.lean @@ -0,0 +1,624 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeightedLayerCake + +/-! +# Integration of an untruncated weighted good-`lambda` inequality + +This module closes the natural one-level estimate under the untruncated measures +`nu_f = ‖f‖^2 dmu` and `nu_g = ‖g‖^2 dmu`. The self term is integrated only up to a +finite level `R`. The substitution `t = 2 M s` produces the smaller cutoff `R / (2 M)`, +which is bounded by `R` when `1 / 2 < M`. Reabsorption is therefore legitimate at every +finite cutoff, and monotone convergence then removes the cutoff without assuming `f` is in +`L^p`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- Exact layer cake for the untruncated square weight. This is an `ENNReal` identity, so +it does not require a finiteness assumption. -/ +private theorem untruncated_weighted_layercake + {alpha E : Type*} [MeasurableSpace alpha] [NormedAddCommGroup E] + {mu : Measure alpha} {f : alpha -> E} {p a : Real} + (hf : AEStronglyMeasurable f mu) (hp : 2 < p) (ha : 0 < a) : + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p / a ^ (p - 2)) ∂mu = + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioi (0 : Real), + sqWeightedMeasure f mu {x | a * t < ‖f x‖} * + ENNReal.ofReal (t ^ (p - 3)) := by + let u : alpha -> Real := fun x => ‖f x‖ + have hu : AEMeasurable u mu := hf.norm.aemeasurable + have hdensity : AEMeasurable (fun x => ENNReal.ofReal (u x ^ (2 : Nat))) mu := + (hu.pow aemeasurable_const).ennreal_ofReal + have hpower : AEMeasurable (fun x => ENNReal.ofReal ((u x / a) ^ (p - 2))) mu := + ((hu.div_const a).pow aemeasurable_const).ennreal_ofReal + have hmoment : + ∫⁻ x, ENNReal.ofReal (u x ^ p / a ^ (p - 2)) ∂mu = + ∫⁻ x, ENNReal.ofReal ((u x / a) ^ (p - 2)) ∂sqWeightedMeasure f mu := by + rw [sqWeightedMeasure, lintegral_withDensity_eq_lintegral_mul₀ hdensity hpower] + apply lintegral_congr + intro x + have hu0 : 0 <= u x := norm_nonneg _ + have hpow : u x ^ p = u x ^ (p - 2) * u x ^ (2 : Real) := by + calc + u x ^ p = u x ^ (p - 2 + 2) := by ring_nf + _ = u x ^ (p - 2) * u x ^ (2 : Real) := + Real.rpow_add_of_nonneg hu0 (by linarith) (by norm_num) + have hpow_nat : u x ^ p = u x ^ (p - 2) * u x ^ (2 : Nat) := by + rw [← Real.rpow_natCast] + exact hpow + have hreal : u x ^ p / a ^ (p - 2) = + (u x / a) ^ (p - 2) * u x ^ (2 : Nat) := by + calc + u x ^ p / a ^ (p - 2) = + (u x ^ (p - 2) * u x ^ (2 : Nat)) / a ^ (p - 2) := + congr_arg (fun z => z / a ^ (p - 2)) hpow_nat + _ = (u x ^ (p - 2) / a ^ (p - 2)) * u x ^ (2 : Nat) := by ring + _ = (u x / a) ^ (p - 2) * u x ^ (2 : Nat) := by + rw [← Real.div_rpow hu0 ha.le] + simp only [Pi.mul_apply, u] + rw [show ‖f x‖ ^ p / a ^ (p - 2) = + (‖f x‖ / a) ^ (p - 2) * ‖f x‖ ^ (2 : Nat) by exact hreal] + rw [mul_comm] + exact ENNReal.ofReal_mul (sq_nonneg ‖f x‖) + have hu_nonneg : 0 ≤ᵐ[sqWeightedMeasure f mu] (fun x => u x / a) := + (withDensity_absolutelyContinuous mu _).ae_le + (ae_of_all _ fun x => div_nonneg (norm_nonneg _) ha.le) + have hlayer := lintegral_rpow_eq_lintegral_meas_lt_mul + (sqWeightedMeasure f mu) hu_nonneg + ((hu.div_const a).mono' (withDensity_absolutelyContinuous mu _)) + (p := p - 2) (by linarith) + have hpow : p - 2 - 1 = p - 3 := by ring + have hthreshold (t : Real) : {x | t < u x / a} = {x | a * t < u x} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [lt_div_iff₀ ha] + ring_nf + rw [hpow] at hlayer + simpa only [u, hthreshold] using hmoment.trans hlayer + +/-- The low-level portion of a weighted layer-cake integral is controlled by the total +weighted mass. -/ +lemma low_weighted_layercake_le + {alpha : Type*} [MeasurableSpace alpha] (nu : Measure alpha) {u : alpha -> Real} + {p M lambda0 : Real} (hp : 2 < p) (hlambda0 : 0 <= lambda0) : + ENNReal.ofReal (p - 2) * + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu {x | M * t < u x} * ENNReal.ofReal (t ^ (p - 3)) <= + nu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) := by + have hr : 0 < p - 2 := by linarith + have hconst := lintegral_rpow_eq_lintegral_meas_lt_mul nu + (ae_of_all _ fun _ => hlambda0) + (aemeasurable_const : AEMeasurable (fun _ : alpha => lambda0) nu) + (p := p - 2) hr + have htail : + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu {x | M * t < u x} * ENNReal.ofReal (t ^ (p - 3)) <= + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu Set.univ * ENNReal.ofReal (t ^ (p - 3)) := by + apply lintegral_mono + intro t + simpa only [mul_comm] using + mul_le_mul_right (measure_mono (Set.subset_univ _)) + (ENNReal.ofReal (t ^ (p - 3))) + have hconst_tail : + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu Set.univ * ENNReal.ofReal (t ^ (p - 3)) <= + ∫⁻ t in Set.Ioi (0 : Real), + nu {x | t < lambda0} * ENNReal.ofReal (t ^ (p - 3)) := by + calc + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu Set.univ * ENNReal.ofReal (t ^ (p - 3)) <= + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu {x | t < lambda0} * ENNReal.ofReal (t ^ (p - 3)) := by + apply lintegral_mono_ae + filter_upwards [self_mem_ae_restrict measurableSet_Ioo] with t ht + have hset : {x : alpha | t < lambda0} = Set.univ := by + ext x + simp only [Set.mem_ofPred_eq, Set.mem_univ, iff_true] + exact ht.2 + rw [hset] + _ <= ∫⁻ t in Set.Ioi (0 : Real), + nu {x | t < lambda0} * ENNReal.ofReal (t ^ (p - 3)) := + lintegral_mono_set (fun _ ht => ht.1) + have hpow : p - 2 - 1 = p - 3 := by ring + rw [hpow] at hconst + calc + ENNReal.ofReal (p - 2) * + ∫⁻ t in Set.Ioo (0 : Real) lambda0, + nu {x | M * t < u x} * ENNReal.ofReal (t ^ (p - 3)) <= + ENNReal.ofReal (p - 2) * + ∫⁻ t in Set.Ioi (0 : Real), + nu {x | t < lambda0} * ENNReal.ofReal (t ^ (p - 3)) := by + exact mul_le_mul_right (htail.trans hconst_tail) (ENNReal.ofReal (p - 2)) + _ = nu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) := by + rw [← hconst, lintegral_const] + ring + +/-- The finite layer-cutoff integral used in the reabsorption argument. -/ +private def cutoffTailMoment + {alpha : Type*} [MeasurableSpace alpha] + (nu : Measure alpha) (u : alpha -> Real) (p a R : Real) : ENNReal := + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioo (0 : Real) R, + nu {x | a * t < u x} * ENNReal.ofReal (t ^ (p - 3)) + +/-- Change variables in a finite Lebesgue integral by a positive dilation. -/ +private theorem setLIntegral_comp_mul_left + {H : Real -> ENNReal} (hH : Measurable H) {c R : Real} (hc : 0 < c) : + ∫⁻ t in Set.Ioo (0 : Real) R, H t = + ENNReal.ofReal c * ∫⁻ s in Set.Ioo (0 : Real) (R / c), H (c * s) := by + calc + ∫⁻ t in Set.Ioo (0 : Real) R, H t ∂volume = + ∫⁻ t in Set.Ioo (0 : Real) R, H t + ∂(ENNReal.ofReal c • Measure.map (c * ·) volume) := by + have hm : ENNReal.ofReal c • Measure.map (c * ·) volume = volume := by + simpa only [abs_of_pos hc] using Real.smul_map_volume_mul_left hc.ne' + rw [hm] + _ = ENNReal.ofReal c * + ∫⁻ t in Set.Ioo (0 : Real) R, H t ∂Measure.map (c * ·) volume := by + rw [setLIntegral_smul_measure] + rfl + _ = ENNReal.ofReal c * + ∫⁻ s in (c * ·) ⁻¹' Set.Ioo (0 : Real) R, H (c * s) := by + rw [setLIntegral_map measurableSet_Ioo hH (measurable_const_mul c)] + _ = ENNReal.ofReal c * + ∫⁻ s in Set.Ioo (0 : Real) (R / c), H (c * s) := by + rw [Set.preimage_const_mul_Ioo₀ (0 : Real) R hc, zero_div] + +/-- With `t = 2 M s`, the finite self-tail integral scales by `(2 M)^(p - 2)` and +acquires the smaller cutoff `R / (2 M)`. -/ +private theorem cutoff_self_tail_eq + {alpha : Type*} [MeasurableSpace alpha] (nu : Measure alpha) (u : alpha -> Real) + {p M R : Real} (hM : 0 < M) : + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioo (0 : Real) R, + nu {x | t / 2 < u x} * ENNReal.ofReal (t ^ (p - 3)) = + ENNReal.ofReal ((2 * M) ^ (p - 2)) * cutoffTailMoment nu u p M (R / (2 * M)) := by + let k : Real := 2 * M + let F : Real -> ENNReal := fun t => nu {x | t / 2 < u x} + let w : Real -> ENNReal := fun t => ENNReal.ofReal (t ^ (p - 3)) + have hk : 0 < k := mul_pos (by norm_num) hM + have hF : Measurable F := by + refine Antitone.measurable (show Antitone F from ?_) + intro s t hst + exact measure_mono fun x hx => + lt_of_le_of_lt (div_le_div_of_nonneg_right hst (by norm_num)) hx + have hw : Measurable w := + (measurable_id.pow measurable_const).ennreal_ofReal + have hscale := setLIntegral_comp_mul_left (H := fun t => F t * w t) + (hF.mul hw) (R := R) hk + have hintegrand : + ∫⁻ s in Set.Ioo (0 : Real) (R / k), F (k * s) * w (k * s) = + ENNReal.ofReal (k ^ (p - 3)) * + ∫⁻ s in Set.Ioo (0 : Real) (R / k), + nu {x | M * s < u x} * w s := by + rw [← lintegral_const_mul'' _ + (show AEMeasurable (fun s => nu {x : alpha | M * s < u x} * w s) + (volume.restrict (Set.Ioo (0 : Real) (R / k))) from + (((Antitone.measurable (show Antitone + (fun s : Real => nu {x : alpha | M * s < u x}) from by + intro s t hst + exact measure_mono fun x hx => + lt_of_le_of_lt (mul_le_mul_of_nonneg_left hst hM.le) hx)).aemeasurable).mul + hw.aemeasurable).restrict)] + apply lintegral_congr_ae + filter_upwards [self_mem_ae_restrict measurableSet_Ioo] with s hs + have hset : {x : alpha | k * s / 2 < u x} = {x | M * s < u x} := by + ext x + simp only [k, Set.mem_ofPred_eq] + ring_nf + have hrpow : (k * s) ^ (p - 3) = k ^ (p - 3) * s ^ (p - 3) := + Real.mul_rpow hk.le hs.1.le + simp only [F, w, hset, hrpow] + rw [ENNReal.ofReal_mul (Real.rpow_nonneg hk.le _)] + ring + have hkp : k ^ (p - 2) = k * k ^ (p - 3) := by + calc + k ^ (p - 2) = k ^ ((1 : Real) + (p - 3)) := by ring_nf + _ = k ^ (1 : Real) * k ^ (p - 3) := Real.rpow_add hk _ _ + _ = k * k ^ (p - 3) := by rw [Real.rpow_one] + simp only [F, w] at hscale + rw [hscale] + simp only [k, cutoffTailMoment] at hintegrand ⊢ + rw [hintegrand] + rw [hkp, ENNReal.ofReal_mul hk.le] + ring + +/-- Scalar integration of a pointwise inequality on the finite high-level interval. -/ +private theorem lintegral_Ico_mul_le_of_pointwise + {L F G w : Real -> ENNReal} {lambda0 R : Real} {c theta B : ENNReal} + (hlambda0 : 0 < lambda0) + (hpoint : ∀ t ∈ Set.Ico lambda0 R, L t <= theta * F t + B * G t) + (hF : AEMeasurable F volume) (hG : AEMeasurable G volume) + (hw : Measurable w) : + c * ∫⁻ t in Set.Ico lambda0 R, L t * w t <= + theta * (c * ∫⁻ t in Set.Ioo (0 : Real) R, F t * w t) + + B * (c * ∫⁻ t in Set.Ioi (0 : Real), G t * w t) := by + have hFw : AEMeasurable (fun t => F t * w t) volume := hF.mul hw.aemeasurable + have hGw : AEMeasurable (fun t => G t * w t) volume := hG.mul hw.aemeasurable + have hmono : ∀ᵐ t ∂volume.restrict (Set.Ico lambda0 R), + L t * w t <= (theta * F t + B * G t) * w t := by + filter_upwards [self_mem_ae_restrict measurableSet_Ico] with t ht + simpa only [mul_comm] using mul_le_mul_right (hpoint t ht) (w t) + have hsplit : + ∫⁻ t in Set.Ico lambda0 R, (theta * F t + B * G t) * w t = + (∫⁻ t in Set.Ico lambda0 R, theta * (F t * w t)) + + ∫⁻ t in Set.Ico lambda0 R, B * (G t * w t) := by + calc + ∫⁻ t in Set.Ico lambda0 R, (theta * F t + B * G t) * w t = + ∫⁻ t in Set.Ico lambda0 R, theta * (F t * w t) + B * (G t * w t) := by + apply lintegral_congr_ae + filter_upwards with t + ring + _ = (∫⁻ t in Set.Ico lambda0 R, theta * (F t * w t)) + + ∫⁻ t in Set.Ico lambda0 R, B * (G t * w t) := by + rw [lintegral_add_left' (hFw.restrict.const_mul theta)] + have hF_restrict : + ∫⁻ t in Set.Ico lambda0 R, F t * w t <= + ∫⁻ t in Set.Ioo (0 : Real) R, F t * w t := + lintegral_mono_set fun _ ht => ⟨lt_of_lt_of_le hlambda0 ht.1, ht.2⟩ + have hG_restrict : + ∫⁻ t in Set.Ico lambda0 R, G t * w t <= + ∫⁻ t in Set.Ioi (0 : Real), G t * w t := + lintegral_mono_set fun _ ht => lt_of_lt_of_le hlambda0 ht.1 + calc + c * ∫⁻ t in Set.Ico lambda0 R, L t * w t <= + c * ∫⁻ t in Set.Ico lambda0 R, (theta * F t + B * G t) * w t := + mul_le_mul_right (lintegral_mono_ae hmono) c + _ = c * ((∫⁻ t in Set.Ico lambda0 R, theta * (F t * w t)) + + ∫⁻ t in Set.Ico lambda0 R, B * (G t * w t)) := by rw [hsplit] + _ <= c * (theta * (∫⁻ t in Set.Ioo (0 : Real) R, F t * w t) + + B * (∫⁻ t in Set.Ioi (0 : Real), G t * w t)) := by + apply mul_le_mul_right + apply add_le_add + · rw [lintegral_const_mul'' theta hFw.restrict] + exact mul_le_mul_right hF_restrict theta + · rw [lintegral_const_mul'' B hGw.restrict] + exact mul_le_mul_right hG_restrict B + _ = theta * (c * ∫⁻ t in Set.Ioo (0 : Real) R, F t * w t) + + B * (c * ∫⁻ t in Set.Ioi (0 : Real), G t * w t) := by + rw [mul_add] + ac_rfl + +/-- The exact untruncated data moment with the threshold written as `eps * t / 2`. -/ +private theorem data_weighted_layercake + {alpha E : Type*} [MeasurableSpace alpha] [NormedAddCommGroup E] + {mu : Measure alpha} {g : alpha -> E} {p eps : Real} + (hg : AEStronglyMeasurable g mu) (hp : 2 < p) (heps : 0 < eps) : + ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu = + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioi (0 : Real), + sqWeightedMeasure g mu {x | eps * t / 2 < ‖g x‖} * + ENNReal.ofReal (t ^ (p - 3)) := by + have hlayer := untruncated_weighted_layercake hg hp + (by positivity : (0 : Real) < eps / 2) + have hthreshold (t : Real) : + {x | eps / 2 * t < ‖g x‖} = {x | eps * t / 2 < ‖g x‖} := by + ext x + ring_nf + simpa only [hthreshold] using hlayer + +/-- The natural one-level estimate integrated up to a finite cutoff `R`. -/ +private theorem cutoffTailMoment_le + {alpha E F : Type*} [MeasurableSpace alpha] + [NormedAddCommGroup E] [NormedAddCommGroup F] + {mu : Measure alpha} {f : alpha -> E} {g : alpha -> F} + {p M eps lambda0 R : Real} {theta B : ENNReal} + (hg : AEStronglyMeasurable g mu) + (hp : 2 < p) (hM : 0 < M) (hhalfM : (1 / 2 : Real) < M) (heps : 0 < eps) + (hlambda0 : 0 < lambda0) (hR : lambda0 < R) + (h_tail : forall t, lambda0 <= t -> + sqWeightedMeasure f mu {x | M * t < ‖f x‖} <= + theta * sqWeightedMeasure f mu {x | t / 2 < ‖f x‖} + + B * sqWeightedMeasure g mu {x | eps * t / 2 < ‖g x‖}) : + cutoffTailMoment (sqWeightedMeasure f mu) (fun x => ‖f x‖) p M R <= + sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + + theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) * + cutoffTailMoment (sqWeightedMeasure f mu) (fun x => ‖f x‖) p M R + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu := by + let nuf := sqWeightedMeasure f mu + let nug := sqWeightedMeasure g mu + let u : alpha -> Real := fun x => ‖f x‖ + let v : alpha -> Real := fun x => ‖g x‖ + let w : Real -> ENNReal := fun t => ENNReal.ofReal (t ^ (p - 3)) + let c : ENNReal := ENNReal.ofReal (p - 2) + have hR0 : 0 < R := hlambda0.trans hR + have hself_meas : AEMeasurable (fun t => nuf {x | t / 2 < u x}) volume := by + refine (Antitone.measurable (show Antitone + (fun t : Real => nuf {x : alpha | t / (2 : Real) < u x}) from ?_)).aemeasurable + intro s t hst + exact measure_mono fun x hx => + lt_of_le_of_lt (div_le_div_of_nonneg_right hst (by norm_num)) hx + have hdata_meas : AEMeasurable (fun t => nug {x | eps * t / 2 < v x}) volume := by + refine (Antitone.measurable (show Antitone + (fun t : Real => nug {x : alpha | eps * t / (2 : Real) < v x}) from ?_)).aemeasurable + intro s t hst + exact measure_mono fun x hx => lt_of_le_of_lt + (div_le_div_of_nonneg_right (mul_le_mul_of_nonneg_left hst heps.le) (by norm_num)) hx + have hpoint (t : Real) (ht : t ∈ Set.Ico lambda0 R) : + nuf {x | M * t < u x} <= theta * nuf {x | t / 2 < u x} + + B * nug {x | eps * t / 2 < v x} := by + simpa only [nuf, nug, u, v] using h_tail t ht.1 + have hhigh := lintegral_Ico_mul_le_of_pointwise + (L := fun t => nuf {x | M * t < u x}) + (F := fun t => nuf {x | t / 2 < u x}) + (G := fun t => nug {x | eps * t / 2 < v x}) (w := w) + (lambda0 := lambda0) (R := R) (c := c) (theta := theta) (B := B) + hlambda0 hpoint hself_meas hdata_meas + (measurable_id.pow measurable_const).ennreal_ofReal + have hscale := cutoff_self_tail_eq nuf u (p := p) (R := R) hM + have hkpos : 0 < 2 * M := mul_pos (by norm_num) hM + have hRdiv : R / (2 * M) <= R := by + rw [div_le_iff₀ hkpos] + nlinarith [hhalfM] + have hcut_mono : + cutoffTailMoment nuf u p M (R / (2 * M)) <= cutoffTailMoment nuf u p M R := by + apply mul_le_mul_right + apply lintegral_mono_set + intro t ht + exact ⟨ht.1, ht.2.trans_le hRdiv⟩ + have hdata_layer := data_weighted_layercake hg hp heps + have hhigh' : + c * ∫⁻ t in Set.Ico lambda0 R, nuf {x | M * t < u x} * w t <= + theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) * cutoffTailMoment nuf u p M R + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu := by + rw [hscale] at hhigh + rw [← hdata_layer] at hhigh + calc + c * ∫⁻ t in Set.Ico lambda0 R, nuf {x | M * t < u x} * w t <= + theta * (ENNReal.ofReal ((2 * M) ^ (p - 2)) * + cutoffTailMoment nuf u p M (R / (2 * M))) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu := hhigh + _ <= theta * (ENNReal.ofReal ((2 * M) ^ (p - 2)) * + cutoffTailMoment nuf u p M R) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu := by + gcongr + _ = theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) * + cutoffTailMoment nuf u p M R + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu := by + rw [mul_assoc] + have hlow := low_weighted_layercake_le nuf (u := u) (p := p) (M := M) + hp hlambda0.le + have hsplit_sets : + Set.Ioo (0 : Real) lambda0 ∪ Set.Ico lambda0 R = Set.Ioo 0 R := by + ext t + constructor + · intro ht + rcases ht with ht | ht + · exact ⟨ht.1, ht.2.trans hR⟩ + · exact ⟨hlambda0.trans_le ht.1, ht.2⟩ + · intro ht + by_cases htl : t < lambda0 + · exact Or.inl ⟨ht.1, htl⟩ + · exact Or.inr ⟨le_of_not_gt htl, ht.2⟩ + have hdisjoint : Disjoint (Set.Ioo (0 : Real) lambda0) (Set.Ico lambda0 R) := + Set.disjoint_left.2 fun _ ht ht' => (not_lt_of_ge ht'.1) ht.2 + have hsplit : + ∫⁻ t in Set.Ioo (0 : Real) R, nuf {x | M * t < u x} * w t = + (∫⁻ t in Set.Ioo (0 : Real) lambda0, nuf {x | M * t < u x} * w t) + + ∫⁻ t in Set.Ico lambda0 R, nuf {x | M * t < u x} * w t := by + rw [← hsplit_sets] + exact lintegral_union measurableSet_Ico hdisjoint + simp only [cutoffTailMoment, nuf, u, w, c] at hlow hhigh' hsplit ⊢ + calc + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioo (0 : Real) R, + sqWeightedMeasure f mu {x | M * t < ‖f x‖} * ENNReal.ofReal (t ^ (p - 3)) = + (ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioo (0 : Real) lambda0, + sqWeightedMeasure f mu {x | M * t < ‖f x‖} * ENNReal.ofReal (t ^ (p - 3))) + + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ico lambda0 R, + sqWeightedMeasure f mu {x | M * t < ‖f x‖} * ENNReal.ofReal (t ^ (p - 3)) := by + rw [hsplit, mul_add] + _ <= sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + + (theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) * + (ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioo (0 : Real) R, + sqWeightedMeasure f mu {x | M * t < ‖f x‖} * ENNReal.ofReal (t ^ (p - 3))) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) := + add_le_add hlow hhigh' + _ = _ := by rw [add_assoc] + +/-- Reabsorption in `ENNReal`, performed through `toReal` after both sides have been shown +finite. -/ +private theorem ennreal_reabsorb {rho X K : ENNReal} + (hrho : rho < 1) (hX : X ≠ ∞) (hK : K ≠ ∞) + (h : X <= K + rho * X) : + X <= K / (1 - rho) := by + have hrho_top : rho ≠ ∞ := ne_top_of_lt (hrho.trans_le le_top) + have hrhs : K + rho * X ≠ ∞ := + ENNReal.add_ne_top.2 ⟨hK, ENNReal.mul_ne_top hrho_top hX⟩ + have hrho_real : rho.toReal < 1 := by + rw [← ENNReal.toReal_one, ENNReal.toReal_lt_toReal hrho_top ENNReal.one_ne_top] + exact hrho + have hreal : X.toReal <= rho.toReal * X.toReal + K.toReal := by + have ht := (ENNReal.toReal_le_toReal hX hrhs).2 h + rw [ENNReal.toReal_add hK (ENNReal.mul_ne_top hrho_top hX), ENNReal.toReal_mul] at ht + linarith + have hreabsorbed := goodLambda_reabsorb + (θ := rho.toReal) (X := X.toReal) (C := (1 : Real)) (Y := K.toReal) + hrho_real (by simpa only [one_mul] using hreal) + have hdenom_ne : 1 - rho ≠ 0 := ne_of_gt (tsub_pos_iff_lt.mpr hrho) + rw [← ENNReal.toReal_le_toReal hX (ENNReal.div_ne_top hK hdenom_ne)] + rw [ENNReal.toReal_div, ENNReal.toReal_sub_of_le (le_of_lt hrho) ENNReal.one_ne_top, + ENNReal.toReal_one] + simpa only [one_div, one_mul, div_eq_inv_mul, mul_comm] using hreabsorbed + +/-- Every finite layer cutoff obeys the same reabsorbed estimate. -/ +private theorem cutoffTailMoment_reabsorbed + {alpha E F : Type*} [MeasurableSpace alpha] + [NormedAddCommGroup E] [NormedAddCommGroup F] + {mu : Measure alpha} {f : alpha -> E} {g : alpha -> F} + {p M eps lambda0 R : Real} {theta B : ENNReal} + (hg : AEStronglyMeasurable g mu) + (hp : 2 < p) (hM : 0 < M) (hhalfM : (1 / 2 : Real) < M) (heps : 0 < eps) + (hlambda0 : 0 < lambda0) (hR : lambda0 < R) + (hnuf : sqWeightedMeasure f mu Set.univ ≠ ∞) + (hB : B ≠ ∞) + (hdata : (∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) ≠ ∞) + (hsmall : theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) < 1) + (h_tail : forall t, lambda0 <= t -> + sqWeightedMeasure f mu {x | M * t < ‖f x‖} <= + theta * sqWeightedMeasure f mu {x | t / 2 < ‖f x‖} + + B * sqWeightedMeasure g mu {x | eps * t / 2 < ‖g x‖}) : + cutoffTailMoment (sqWeightedMeasure f mu) (fun x => ‖f x‖) p M R <= + (sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) / + (1 - theta * ENNReal.ofReal ((2 * M) ^ (p - 2))) := by + let X := cutoffTailMoment (sqWeightedMeasure f mu) (fun x => ‖f x‖) p M R + let A := sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + let D := ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu + let rho := theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) + let K := A + B * D + have hR0 : 0 < R := hlambda0.trans hR + have hX_le := low_weighted_layercake_le (sqWeightedMeasure f mu) + (u := fun x => ‖f x‖) (p := p) (M := M) hp hR0.le + have hX : X ≠ ∞ := by + apply ne_top_of_le_ne_top (ENNReal.mul_ne_top hnuf ENNReal.ofReal_ne_top) + simpa only [X, cutoffTailMoment] using hX_le + have hA : A ≠ ∞ := ENNReal.mul_ne_top hnuf ENNReal.ofReal_ne_top + have hK : K ≠ ∞ := by + exact ENNReal.add_ne_top.2 ⟨hA, ENNReal.mul_ne_top hB hdata⟩ + have hfinite := cutoffTailMoment_le hg hp hM hhalfM heps hlambda0 hR h_tail + have hineq : X <= K + rho * X := by + calc + X <= A + rho * X + B * D := by + simpa only [X, A, D, rho] using hfinite + _ = K + rho * X := by + change (A + rho * X) + B * D = (A + B * D) + rho * X + calc + (A + rho * X) + B * D = A + (rho * X + B * D) := add_assoc _ _ _ + _ = A + (B * D + rho * X) := congr_arg (fun z : ENNReal => A + z) + (add_comm (rho * X) (B * D)) + _ = (A + B * D) + rho * X := (add_assoc _ _ _).symm + simpa only [X, A, D, rho, K] using ennreal_reabsorb hsmall hX hK hineq + +/-- Increasing finite intervals exhaust the positive half-line. -/ +private theorem setLIntegral_Ioo_iSup + (H : Real -> ENNReal) (hH : Measurable H) {lambda0 : Real} : + ∫⁻ t in Set.Ioi (0 : Real), H t = + ⨆ n : Nat, ∫⁻ t in Set.Ioo (0 : Real) (lambda0 + n + 1), H t := by + let S : Nat -> Set Real := fun n => Set.Ioo (0 : Real) (lambda0 + n + 1) + let hfun : Nat -> Real -> ENNReal := fun n => (S n).indicator H + have hS_mono : Monotone S := by + intro n m hnm t ht + have hcast : (n : Real) <= (m : Real) := by exact_mod_cast hnm + exact ⟨ht.1, lt_of_lt_of_le ht.2 (by linarith)⟩ + have hh_meas : forall n, AEMeasurable (hfun n) volume := fun n => + (hH.indicator measurableSet_Ioo).aemeasurable + have hh_mono : forall t, Monotone fun n => hfun n t := by + intro t n m hnm + by_cases hnt : t ∈ S n + · simp only [hfun, Set.indicator_of_mem hnt, + Set.indicator_of_mem (hS_mono hnm hnt)] + exact le_rfl + · simp only [hfun, Set.indicator_of_notMem hnt] + exact bot_le + have hiSup_h : (fun t => ⨆ n, hfun n t) = (Set.Ioi (0 : Real)).indicator H := by + funext t + apply le_antisymm + · refine iSup_le fun n => ?_ + by_cases hnt : t ∈ S n + · simp only [hfun, Set.indicator_of_mem hnt] + have htarget : (Set.Ioi (0 : Real)).indicator H t = H t := + Set.indicator_of_mem hnt.1 H + rw [htarget] + · simp only [hfun, Set.indicator_of_notMem hnt] + exact bot_le + · by_cases ht : t ∈ Set.Ioi (0 : Real) + · rw [Set.indicator_of_mem ht] + obtain ⟨n, hn⟩ := exists_nat_gt (t - lambda0 - 1) + have hnt : t ∈ S n := by + exact ⟨ht, by exact_mod_cast (show t < lambda0 + (n : Real) + 1 by linarith)⟩ + exact le_iSup_of_le n (by + simp only [hfun, Set.indicator_of_mem hnt] + exact le_rfl) + · rw [Set.indicator_of_notMem ht] + exact bot_le + calc + ∫⁻ t in Set.Ioi (0 : Real), H t = + ∫⁻ t, (Set.Ioi (0 : Real)).indicator H t := by + rw [lintegral_indicator measurableSet_Ioi] + _ = ∫⁻ t, ⨆ n, hfun n t := by rw [hiSup_h] + _ = ⨆ n, ∫⁻ t, hfun n t := lintegral_iSup' hh_meas (ae_of_all _ hh_mono) + _ = ⨆ n : Nat, ∫⁻ t in Set.Ioo (0 : Real) (lambda0 + n + 1), H t := by + congr with n + simp only [hfun, S] + rw [lintegral_indicator measurableSet_Ioo] + +/-- Integrate and reabsorb the natural untruncated weighted good-`lambda` estimate. + +The only finiteness assumptions used before the conclusion are the finite square-weighted +mass of `f`, the finite displayed data moment, and the finiteness of the scalar coefficient +`B`. In particular, there is no `L^p` hypothesis on `f`. -/ +theorem lp_le_of_oneLevel_weighted_tail + {alpha E F : Type*} [MeasurableSpace alpha] + [NormedAddCommGroup E] [NormedAddCommGroup F] + {mu : Measure alpha} {f : alpha -> E} {g : alpha -> F} + {p M eps lambda0 : Real} {theta B : ENNReal} + (hf : AEStronglyMeasurable f mu) (hg : AEStronglyMeasurable g mu) + (hp : 2 < p) (hM : 0 < M) (hhalfM : (1 / 2 : Real) < M) (heps : 0 < eps) + (hlambda0 : 0 < lambda0) + (hnuf : sqWeightedMeasure f mu Set.univ ≠ ∞) + (hB : B ≠ ∞) + (hdata : (∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) ≠ ∞) + (hsmall : theta * ENNReal.ofReal ((2 * M) ^ (p - 2)) < 1) + (h_tail : forall t, lambda0 <= t -> + sqWeightedMeasure f mu {x | M * t < ‖f x‖} <= + theta * sqWeightedMeasure f mu {x | t / 2 < ‖f x‖} + + B * sqWeightedMeasure g mu {x | eps * t / 2 < ‖g x‖}) : + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p / M ^ (p - 2)) ∂mu <= + (sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) / + (1 - theta * ENNReal.ofReal ((2 * M) ^ (p - 2))) := by + let nuf := sqWeightedMeasure f mu + let u : alpha -> Real := fun x => ‖f x‖ + let H : Real -> ENNReal := fun t => + nuf {x | M * t < u x} * ENNReal.ofReal (t ^ (p - 3)) + let K : ENNReal := + (sqWeightedMeasure f mu Set.univ * ENNReal.ofReal (lambda0 ^ (p - 2)) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ p / (eps / 2) ^ (p - 2)) ∂mu) / + (1 - theta * ENNReal.ofReal ((2 * M) ^ (p - 2))) + have hH : Measurable H := by + have htail_meas : Measurable (fun t => nuf {x | M * t < u x}) := by + refine Antitone.measurable (show Antitone + (fun t : Real => nuf {x : alpha | M * t < u x}) from ?_) + intro s t hst + exact measure_mono fun x hx => + lt_of_le_of_lt (mul_le_mul_of_nonneg_left hst hM.le) hx + exact htail_meas.mul (measurable_id.pow measurable_const).ennreal_ofReal + have hexhaust := setLIntegral_Ioo_iSup H hH (lambda0 := lambda0) + have hfull : ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioi (0 : Real), H t <= K := by + rw [hexhaust, ENNReal.mul_iSup] + apply iSup_le + intro n + have hR : lambda0 < lambda0 + (n : Real) + 1 := by + have hn0 : 0 ≤ (n : Real) := Nat.cast_nonneg n + linarith + have hn := cutoffTailMoment_reabsorbed hg hp hM hhalfM heps hlambda0 hR + hnuf hB hdata hsmall h_tail + simpa only [K, cutoffTailMoment, nuf, u, H] using hn + have hlayer := untruncated_weighted_layercake hf hp hM + calc + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p / M ^ (p - 2)) ∂mu = + ENNReal.ofReal (p - 2) * ∫⁻ t in Set.Ioi (0 : Real), H t := by + simpa only [H, nuf, u] using hlayer + _ <= K := hfull + _ = _ := rfl + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaLargeScale.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaLargeScale.lean new file mode 100644 index 0000000000..09a81a25f8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaLargeScale.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaStopping + +/-! # Good Lambda Large Scale -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators Topology +open Filter MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Large-scale inputs for continuous good-`λ` stopping radii + +The elementary estimates here isolate the only global input in the +continuous-radius stopping construction. A global squared mass bounds every +normalized ball energy above a fixed positive scale; consequently the usual +last-crossing construction may stop before that scale while retaining its +last-exit certificate all the way to the ambient radius. +-/ + +/-- A global squared mass bounds every normalized closed-ball `L²` energy at +scales at least `rho`. -/ +theorem closedBallL2Energy_le_globalIntegral {d : ℕ} {F : Type*} + [NormedAddCommGroup F] (f : Vec d → F) + (hf : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) volume) (x : Vec d) + {rho s : ℝ} (hrho : 0 < rho) (hrhos : rho ≤ s) : + closedBallL2Energy f x s ≤ ((2 * rho) ^ d)⁻¹ * + ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume := by + let B : Set (Vec d) := Metric.closedBall x s + have hs : 0 < s := lt_of_lt_of_le hrho hrhos + have hlocal : ∫ y in B, ‖f y‖ ^ (2 : ℕ) ∂volume ≤ + ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume := by + exact MeasureTheory.integral_mono_measure (μ := volume.restrict B) (ν := volume) + Measure.restrict_le_self (ae_of_all _ fun _ => sq_nonneg _) hf + have hglobal_nonneg : 0 ≤ ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume := + MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + have hbase : 2 * rho ≤ 2 * s := by nlinarith + have hpow : (2 * rho) ^ d ≤ (2 * s) ^ d := + pow_le_pow_left₀ (by positivity) hbase d + have hpow_rho_pos : 0 < (2 * rho) ^ d := by positivity + have hpow_s_pos : 0 < (2 * s) ^ d := by positivity + have hinv : ((2 * s) ^ d)⁻¹ ≤ ((2 * rho) ^ d)⁻¹ := + (inv_le_inv₀ hpow_s_pos hpow_rho_pos).2 hpow + calc + closedBallL2Energy f x s = ((2 * s) ^ d)⁻¹ * + ∫ y in B, ‖f y‖ ^ (2 : ℕ) ∂volume := by rfl + _ ≤ ((2 * s) ^ d)⁻¹ * ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume := + mul_le_mul_of_nonneg_left hlocal (inv_nonneg.mpr hpow_s_pos.le) + _ ≤ ((2 * rho) ^ d)⁻¹ * ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume := + mul_le_mul_of_nonneg_right hinv hglobal_nonneg + +/-- The good-`λ` combined energy is uniformly controlled at scales at least +`rho` by the correspondingly weighted global squared mass. -/ +theorem goodLambdaCombinedEnergy_le_globalIntegral {d : ℕ} {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) + (hf : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) volume) + (hg : Integrable (fun y => ‖g y‖ ^ (2 : ℕ)) volume) (x : Vec d) + {rho s : ℝ} (hrho : 0 < rho) (hrhos : rho ≤ s) : + goodLambdaCombinedEnergy f g ε x s ≤ Real.sqrt (((2 * rho) ^ d)⁻¹ * + ((∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume) + + (ε⁻¹) ^ (2 : ℕ) * ∫ y, ‖g y‖ ^ (2 : ℕ) ∂volume)) := by + rw [goodLambdaCombinedEnergy] + apply Real.sqrt_le_sqrt + have hf_bound := closedBallL2Energy_le_globalIntegral f hf x hrho hrhos + have hg_bound := closedBallL2Energy_le_globalIntegral g hg x hrho hrhos + calc + closedBallL2Energy f x s + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x s ≤ + ((2 * rho) ^ d)⁻¹ * ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume + + (ε⁻¹) ^ (2 : ℕ) * + (((2 * rho) ^ d)⁻¹ * ∫ y, ‖g y‖ ^ (2 : ℕ) ∂volume) := + add_le_add hf_bound (mul_le_mul_of_nonneg_left hg_bound (sq_nonneg _)) + _ = ((2 * rho) ^ d)⁻¹ * + ((∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume) + + (ε⁻¹) ^ (2 : ℕ) * ∫ y, ‖g y‖ ^ (2 : ℕ) ∂volume) := by ring + +/-- A local last crossing before `rho` remains a last exit through `R` when +the combined energy is uniformly below the level on the large-scale interval. +This is the stopping certificate used after the global-mass estimate fixes a +large scale. -/ +theorem exists_stoppingRadius_goodLambdaCombinedEnergy_of_largeScaleBound + {d : ℕ} [NeZero d] {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) + (hf : Integrable (fun y => ‖f y‖ ^ 2) volume) + (hg : Integrable (fun y => ‖g y‖ ^ 2) volume) (x : Vec d) + {level rho R : ℝ} (hrho : 0 < rho) + (hlimit : Tendsto (fun r => goodLambdaCombinedEnergy f g ε x r) (𝓝[>] 0) + (𝓝 (Real.sqrt (‖f x‖ ^ 2 + (ε⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2)))) + (hpoint : level < Real.sqrt (‖f x‖ ^ 2 + (ε⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2)) + (hrho_bound : goodLambdaCombinedEnergy f g ε x rho ≤ level) + (hlarge : ∀ s ∈ Icc rho R, goodLambdaCombinedEnergy f g ε x s ≤ level) : + ∃ r, 0 < r ∧ r ≤ rho ∧ goodLambdaCombinedEnergy f g ε x r = level ∧ + ∀ s ∈ Icc r R, goodLambdaCombinedEnergy f g ε x s ≤ level := by + obtain ⟨r, hr, hrho', hstop, hlast⟩ := + exists_stoppingRadius_goodLambdaCombinedEnergy f g ε hf hg x hrho hlimit hpoint hrho_bound + refine ⟨r, hr, hrho', hstop, ?_⟩ + intro s hs + by_cases hs_rho : s ≤ rho + · exact hlast s ⟨hs.1, hs_rho⟩ + · exact hlarge s ⟨le_of_lt (lt_of_not_ge hs_rho), hs.2⟩ + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaParameters.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaParameters.lean new file mode 100644 index 0000000000..e02860f2bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaParameters.lean @@ -0,0 +1,187 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.MeasureTheory.Function.L1Space.Integrable + +/-! +# Strict parameters for the cube good-`lambda` iteration + +The local comparison coefficient is fixed before the cube, solution, and +datum. This file chooses the amplification and datum parameters which make +the weighted layer-cake self coefficient strictly smaller than one. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +namespace INTERNAL + +private theorem rpow_product_goodLambda_factor + {p r M : ℝ} (hM : 0 < M) : + (M / 2) ^ (2 - r) * (2 * M) ^ (p - 2) = + (2 : ℝ) ^ (p + r - 4) * M ^ (p - r) := by + rw [Real.div_rpow hM.le (by norm_num : (0 : ℝ) ≤ 2), + Real.mul_rpow (by norm_num : (0 : ℝ) ≤ 2) hM.le] + have hMprod : M ^ (2 - r) * M ^ (p - 2) = M ^ (p - r) := by + rw [← Real.rpow_add hM] + congr 1 + ring + have htwoquot : (2 : ℝ) ^ (p - 2) / (2 : ℝ) ^ (2 - r) = + (2 : ℝ) ^ (p + r - 4) := by + rw [← Real.rpow_sub (by norm_num : (0 : ℝ) < 2)] + congr 1 + ring + calc + (M ^ (2 - r) / (2 : ℝ) ^ (2 - r)) * + ((2 : ℝ) ^ (p - 2) * M ^ (p - 2)) = + ((2 : ℝ) ^ (p - 2) / (2 : ℝ) ^ (2 - r)) * + (M ^ (2 - r) * M ^ (p - 2)) := by + field_simp [Real.rpow_pos_of_pos hM] + _ = _ := by rw [htwoquot, hMprod] + +/-- Fixed parameters which make the one-level good-`lambda` self coefficient +strictly smaller than one. The result is deliberately stated in `ENNReal`, +matching the layer-cake integration theorem. -/ +theorem exists_strict_goodLambda_parameters + {p r : ℝ} {C : ℝ≥0∞} (hC : C ≠ ∞) (_hp : 2 < p) (hpr : p < r) : + ∃ M eps : ℝ, 1 < M ∧ 0 < eps ∧ eps ≤ 1 ∧ + C * (ENNReal.ofReal ((M / 2) ^ (2 - r)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + ENNReal.ofReal ((2 * M) ^ (p - 2)) < 1 := by + let c : ℝ := C.toReal + let a : ℝ := max c 1 + let delta : ℝ := r - p + let A : ℝ := 4 * a * (2 : ℝ) ^ (p + r - 4) + let M : ℝ := 2 + A ^ delta⁻¹ + let D : ℝ := a * (2 * M) ^ (p - 2) + let eps : ℝ := (4 * (1 + D))⁻¹ + have hc : 0 ≤ c := ENNReal.toReal_nonneg + have ha_one : 1 ≤ a := by + exact le_max_right _ _ + have ha : 0 < a := lt_of_lt_of_le zero_lt_one ha_one + have hdelta : 0 < delta := by + dsimp only [delta] + linarith + have hpow_two : 0 < (2 : ℝ) ^ (p + r - 4) := + Real.rpow_pos_of_pos (by norm_num) _ + have hA : 0 < A := by + dsimp only [A] + positivity + have hM : 2 < M := by + dsimp only [M] + have : 0 < A ^ delta⁻¹ := Real.rpow_pos_of_pos hA _ + linarith + have hMpos : 0 < M := by linarith + have hMhalf : 0 < M / 2 := by positivity + have hMpow : A < M ^ delta := by + have hlt : A ^ delta⁻¹ < M := by + dsimp only [M] + linarith + have := Real.rpow_lt_rpow (Real.rpow_nonneg hA.le _) hlt hdelta + rw [Real.rpow_inv_rpow hA.le hdelta.ne'] at this + exact this + have hD : 0 < D := by + dsimp only [D] + positivity + have heps : 0 < eps := by + dsimp only [eps] + positivity + have heps_one : eps ≤ 1 := by + dsimp only [eps] + have hdenom : 1 ≤ 4 * (1 + D) := by nlinarith [hD] + exact inv_le_one_of_one_le₀ hdenom + have hfirst : + c * (M / 2) ^ (2 - r) * (2 * M) ^ (p - 2) < 1 / 4 := by + calc + c * (M / 2) ^ (2 - r) * (2 * M) ^ (p - 2) = + c * ((M / 2) ^ (2 - r) * (2 * M) ^ (p - 2)) := by ring + _ = c * ((2 : ℝ) ^ (p + r - 4) * M ^ (p - r)) := by + rw [rpow_product_goodLambda_factor hMpos] + _ = c * (2 ^ (p + r - 4) * M ^ (p - r)) := rfl + _ < 1 / 4 := by + have hMneg : M ^ (p - r) < A⁻¹ := by + rw [show p - r = -delta by dsimp only [delta]; ring, + Real.rpow_neg hMpos.le] + exact (inv_lt_inv₀ (Real.rpow_pos_of_pos hMpos _) hA).2 hMpow + have hc_le_a : c ≤ a := le_max_left _ _ + have hleft : c * 2 ^ (p + r - 4) ≤ A / 4 := by + dsimp only [A] + nlinarith [mul_le_mul_of_nonneg_right hc_le_a hpow_two.le] + calc + c * (2 ^ (p + r - 4) * M ^ (p - r)) = + (c * 2 ^ (p + r - 4)) * M ^ (p - r) := by ring + _ ≤ (A / 4) * M ^ (p - r) := + mul_le_mul_of_nonneg_right hleft (Real.rpow_nonneg hMpos.le _) + _ < (A / 4) * A⁻¹ := + mul_lt_mul_of_pos_left hMneg (by positivity) + _ = 1 / 4 := by + field_simp [hA.ne'] + have hsecond : c * (eps ^ (2 : ℕ)) * (2 * M) ^ (p - 2) < 1 / 4 := by + have hc_le_a : c ≤ a := le_max_left _ _ + have hbase : c * (2 * M) ^ (p - 2) ≤ D := by + dsimp only [D] + exact mul_le_mul_of_nonneg_right hc_le_a (Real.rpow_nonneg (by positivity) _) + have heps_sq : eps ^ (2 : ℕ) < (4 * (1 + D))⁻¹ := by + dsimp only [eps] + have heps_lt_one : eps < 1 := by + exact inv_lt_one_of_one_lt₀ (by nlinarith [hD]) + calc + eps ^ (2 : ℕ) < eps := by + rw [pow_two] + nlinarith [heps, heps_lt_one] + _ = (4 * (1 + D))⁻¹ := rfl + have hD_eps : D * (eps ^ (2 : ℕ)) < 1 / 4 := by + calc + D * (eps ^ (2 : ℕ)) < D * (4 * (1 + D))⁻¹ := + mul_lt_mul_of_pos_left heps_sq hD + _ < 1 / 4 := by + rw [← div_eq_mul_inv] + apply (div_lt_iff₀ (by positivity : 0 < 4 * (1 + D))).2 + nlinarith [hD] + calc + c * eps ^ (2 : ℕ) * (2 * M) ^ (p - 2) = + (c * (2 * M) ^ (p - 2)) * eps ^ (2 : ℕ) := by ring + _ ≤ D * eps ^ (2 : ℕ) := + mul_le_mul_of_nonneg_right hbase (sq_nonneg eps) + _ < 1 / 4 := hD_eps + refine ⟨M, eps, ?_, heps, heps_one, ?_⟩ + · linarith + have hterm_one : 0 ≤ (M / 2) ^ (2 - r) := Real.rpow_nonneg hMhalf.le _ + have hterm_two : 0 ≤ eps ^ (2 : ℕ) := sq_nonneg eps + have hreal : + c * ((M / 2) ^ (2 - r) + eps ^ (2 : ℕ)) * + (2 * M) ^ (p - 2) < 1 := by + calc + c * ((M / 2) ^ (2 - r) + eps ^ (2 : ℕ)) * (2 * M) ^ (p - 2) = + c * (M / 2) ^ (2 - r) * (2 * M) ^ (p - 2) + + c * eps ^ (2 : ℕ) * (2 * M) ^ (p - 2) := by ring + _ < 1 / 4 + 1 / 4 := add_lt_add hfirst hsecond + _ < 1 := by norm_num + have hCeq : C = ENNReal.ofReal c := by + dsimp only [c] + exact (ENNReal.ofReal_toReal hC).symm + rw [hCeq, ← ENNReal.ofReal_add hterm_one hterm_two, + ← ENNReal.ofReal_mul hc, + ← ENNReal.ofReal_mul (mul_nonneg hc (add_nonneg hterm_one hterm_two))] + exact ENNReal.ofReal_lt_one.mpr hreal + +end INTERNAL + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaStopping.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaStopping.lean new file mode 100644 index 0000000000..00f5097394 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaStopping.lean @@ -0,0 +1,139 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingRadius +public import Mathlib.MeasureTheory.Covering.DensityTheorem + +/-! # Good Lambda Stopping -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators Topology +open Filter MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Step-1 stopping radii for the good-`λ` argument + +This module packages the local energy whose exact stopping radii will feed the +Vitali selection in the cube Calderón--Zygmund argument. It does not use a +comparison estimate, a tail estimate, or a final good-`λ` inequality. +-/ + +/-- The combined normalized local `L²` energy used in the good-`λ` stopping +construction. The square root is taken after adding the two squared energies; +this is the form for which a stopping identity at level `lambda` gives the +exact weighted-mass identity used in the level-set split. -/ +def goodLambdaCombinedEnergy {d : ℕ} {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) (x : Vec d) (r : ℝ) : ℝ := + Real.sqrt (closedBallL2Energy f x r + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r) + +theorem goodLambdaCombinedEnergy_nonneg {d : ℕ} {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) (x : Vec d) (r : ℝ) : + 0 ≤ goodLambdaCombinedEnergy f g ε x r := by + unfold goodLambdaCombinedEnergy + exact Real.sqrt_nonneg _ + +/-- The combined normalized local energy is continuous on positive radii when +both squared data fields are integrable. -/ +theorem continuousOn_goodLambdaCombinedEnergy {d : ℕ} [NeZero d] + {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) + (hf : Integrable (fun y => ‖f y‖ ^ 2) volume) + (hg : Integrable (fun y => ‖g y‖ ^ 2) volume) (x : Vec d) : + ContinuousOn (fun r => goodLambdaCombinedEnergy f g ε x r) (Ioi 0) := by + have hsum_cont : ContinuousOn + (fun r => closedBallL2Energy f x r + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r) + (Ioi 0) := + (continuousOn_closedBallL2Energy f hf x).add + (continuousOn_const.mul (continuousOn_closedBallL2Energy g hg x)) + exact Real.continuous_sqrt.comp_continuousOn hsum_cont + +/-- Lebesgue differentiation for the normalized sup-metric closed-ball +average. This is the input that identifies the small-radius energy with its +pointwise value almost everywhere. -/ +theorem ae_tendsto_closedBallAverage_nhdsGT {d : ℕ} + (h : Vec d → ℝ) (hh : Integrable h volume) : + ∀ᵐ x ∂volume, Tendsto (fun r => closedBallAverage x r h) (𝓝[>] 0) (𝓝 (h x)) := by + filter_upwards [IsUnifLocDoublingMeasure.ae_tendsto_average (μ := volume) + hh.locallyIntegrable (0 : ℝ)] with x hx + have hraw := hx (fun _ : ℝ => x) id tendsto_id (Eventually.of_forall fun r => by simp) + apply hraw.congr' + filter_upwards [self_mem_nhdsWithin] with r hr + exact (closedBallAverage_eq_setAverage x hr.le h).symm + +/-- Integrable square data has the expected almost-everywhere small-radius +limit for the normalized local `L²` energy. -/ +theorem ae_tendsto_closedBallL2Energy_nhdsGT {d : ℕ} {F : Type*} + [NormedAddCommGroup F] (u : Vec d → F) + (hu : Integrable (fun y => ‖u y‖ ^ 2) volume) : + ∀ᵐ x ∂volume, + Tendsto (fun r => closedBallL2Energy u x r) (𝓝[>] 0) (𝓝 (‖u x‖ ^ 2)) := by + simpa only [closedBallL2Energy] using + ae_tendsto_closedBallAverage_nhdsGT (fun y => ‖u y‖ ^ 2) hu + +/-- The combined source energy converges almost everywhere at small radii to +the corresponding pointwise combined energy. -/ +theorem ae_tendsto_goodLambdaCombinedEnergy_nhdsGT {d : ℕ} + {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) + (hf : Integrable (fun y => ‖f y‖ ^ 2) volume) + (hg : Integrable (fun y => ‖g y‖ ^ 2) volume) : + ∀ᵐ x ∂volume, Tendsto (fun r => goodLambdaCombinedEnergy f g ε x r) (𝓝[>] 0) + (𝓝 (Real.sqrt (‖f x‖ ^ 2 + (ε⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2))) := by + filter_upwards [ae_tendsto_closedBallL2Energy_nhdsGT f hf, + ae_tendsto_closedBallL2Energy_nhdsGT g hg] with x hfx hgx + exact Real.continuous_sqrt.continuousAt.tendsto.comp + (hfx.add (tendsto_const_nhds.mul hgx)) + +/-- A positive-radius limit above the level and one large radius below it +produce an exact last stopping radius. The small positive starting radius is +obtained internally from the one-sided limit. -/ +theorem exists_stoppingRadius_of_tendsto_nhdsGT {E : ℝ → ℝ} {pointEnergy level R : ℝ} + (hR : 0 < R) (hE : ContinuousOn E (Ioi 0)) + (hlimit : Tendsto E (𝓝[>] 0) (𝓝 pointEnergy)) + (hpoint : level < pointEnergy) (hlarge : E R ≤ level) : + ∃ r, 0 < r ∧ r ≤ R ∧ E r = level ∧ ∀ s ∈ Icc r R, E s ≤ level := by + have heventual : ∀ᶠ a in 𝓝[>] (0 : ℝ), level < E a := + hlimit.eventually (eventually_gt_nhds hpoint) + obtain ⟨a, ha, haIoo⟩ := (heventual.and (Ioo_mem_nhdsGT hR)).exists + obtain ⟨r, hrIcc, hrEq, hrLast⟩ := + exists_last_crossing_of_continuousOn haIoo.2.le + (hE.mono fun s hs => haIoo.1.trans_le hs.1) ha hlarge + exact ⟨r, haIoo.1.trans_le hrIcc.1, hrIcc.2, hrEq, hrLast⟩ + +/-- The stopping-radius certificate specialized to the combined local energy. +For almost every centre, its limit hypothesis is supplied by +`ae_tendsto_goodLambdaCombinedEnergy_nhdsGT`. -/ +theorem exists_stoppingRadius_goodLambdaCombinedEnergy {d : ℕ} [NeZero d] + {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (ε : ℝ) + (hf : Integrable (fun y => ‖f y‖ ^ 2) volume) + (hg : Integrable (fun y => ‖g y‖ ^ 2) volume) (x : Vec d) + {level R : ℝ} (hR : 0 < R) + (hlimit : Tendsto (fun r => goodLambdaCombinedEnergy f g ε x r) (𝓝[>] 0) + (𝓝 (Real.sqrt (‖f x‖ ^ 2 + (ε⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2)))) + (hpoint : level < Real.sqrt (‖f x‖ ^ 2 + (ε⁻¹) ^ (2 : ℕ) * ‖g x‖ ^ 2)) + (hlarge : goodLambdaCombinedEnergy f g ε x R ≤ level) : + ∃ r, 0 < r ∧ r ≤ R ∧ goodLambdaCombinedEnergy f g ε x r = level ∧ + ∀ s ∈ Icc r R, goodLambdaCombinedEnergy f g ε x s ≤ level := + exists_stoppingRadius_of_tendsto_nhdsGT hR + (continuousOn_goodLambdaCombinedEnergy f g ε hf hg x) hlimit hpoint hlarge + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaTailControl.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaTailControl.lean new file mode 100644 index 0000000000..51ea079634 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaTailControl.lean @@ -0,0 +1,91 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallTail + +/-! # Good Lambda Tail Control -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-! +# The control measure for the one-ball good-`λ` estimate + +The local stopping-ball estimate has two lower-level weighted tails on its +right-hand side. This file packages precisely their sum as a measure. The +evaluation lemmas below are deliberately stated on measurable sets, which is +what the Vitali assembly consumes; no measurability is hidden in the +definition of the restricted measures. +-/ + +/-- The two lower-level square-weighted tails which control a stopping ball. -/ +def oneStoppingBallTailControl + {d : ℕ} {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (eps level : ℝ) : Measure (Vec d) := + (sqWeightedMeasure f volume).restrict {x | level / 2 < ‖f x‖} + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) • + (sqWeightedMeasure g volume).restrict {x | eps * level / 2 < ‖g x‖} + +/-- Evaluation of the one-ball control measure on a measurable set. The +intersection order agrees exactly with the lower tails in +`sqWeightedMeasure_oneStoppingBall_le`. -/ +theorem oneStoppingBallTailControl_apply + {d : ℕ} {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (eps level : ℝ) {B : Set (Vec d)} + (hB : MeasurableSet B) : + oneStoppingBallTailControl f g eps level B = + sqWeightedMeasure f volume ({x | level / 2 < ‖f x‖} ∩ B) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure g volume + ({x | eps * level / 2 < ‖g x‖} ∩ B) := by + rw [oneStoppingBallTailControl, Measure.add_apply, + Measure.restrict_apply hB, Measure.smul_apply, Measure.restrict_apply hB] + simp only [smul_eq_mul, Set.inter_comm] + +/-- The ambient-set specialization of `oneStoppingBallTailControl_apply`. -/ +theorem oneStoppingBallTailControl_apply_ambient + {d : ℕ} {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) (eps level : ℝ) {U : Set (Vec d)} + (hU : MeasurableSet U) : + oneStoppingBallTailControl f g eps level U = + sqWeightedMeasure f volume ({x | level / 2 < ‖f x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure g volume + ({x | eps * level / 2 < ‖g x‖} ∩ U) := + oneStoppingBallTailControl_apply f g eps level hU + +/-- The first lower-tail set is volume-null-measurable when the field is +almost-everywhere strongly measurable. -/ +theorem nullMeasurableSet_oneStoppingBall_f_tail + {d : ℕ} {F : Type*} [NormedAddCommGroup F] + (f : Vec d → F) (level : ℝ) (hf : AEStronglyMeasurable f volume) : + NullMeasurableSet {x | level / 2 < ‖f x‖} volume := by + simpa using aestronglyMeasurable_const.nullMeasurableSet_lt hf.norm + +/-- The scaled second lower-tail set is volume-null-measurable when the field +is almost-everywhere strongly measurable. -/ +theorem nullMeasurableSet_oneStoppingBall_g_tail + {d : ℕ} {G : Type*} [NormedAddCommGroup G] + (g : Vec d → G) (eps level : ℝ) (hg : AEStronglyMeasurable g volume) : + NullMeasurableSet {x | eps * level / 2 < ‖g x‖} volume := by + simpa using aestronglyMeasurable_const.nullMeasurableSet_lt hg.norm + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliAssembly.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliAssembly.lean new file mode 100644 index 0000000000..bcf8f714b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliAssembly.lean @@ -0,0 +1,72 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliSum + +/-! # Good Lambda Vitali Assembly -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Global measure bound from a stopping-ball family + +This is the one-level assembly bridge for a good-`λ` argument. A stopping +radius is supplied at every point of the target set; Vitali selection and the +measure summation are internal to the theorem. +-/ + +/-- A uniformly bounded positive stopping-ball family with a local estimate +gives the corresponding global measure estimate. No countability or +disjointness data are supplied by the caller: they are produced internally by +Vitali selection. -/ +theorem measure_le_mul_measure_of_vitali_stopping_family + {d : ℕ} (ν κ : Measure (Vec d)) (target ambient : Set (Vec d)) + (radius : Vec d → ℝ) (R τ : ℝ) (K : ℝ≥0∞) + (hradius : ∀ x ∈ target, radius x ≤ R) + (hpositive : ∀ x ∈ target, 0 < radius x) (hτ : 3 < τ) + (hlocal : ∀ x ∈ target, + ν (target ∩ Metric.closedBall x (τ * radius x)) ≤ + K * κ (Metric.closedBall x (radius x))) + (hambient : (⋃ x ∈ target, Metric.closedBall x (radius x)) ⊆ ambient) : + ν target ≤ K * κ ambient := by + obtain ⟨u, hu, hdisjoint, hcover⟩ := + exists_disjoint_closedBall_subfamily_covering_union target (fun x => x) + radius R hradius τ hτ + have htarget_original : target ⊆ ⋃ x ∈ target, Metric.closedBall x (radius x) := by + intro x hx + exact Set.mem_iUnion₂.mpr ⟨x, hx, + Metric.mem_closedBall_self (le_of_lt (hpositive x hx))⟩ + have htarget : target ⊆ ⋃ x ∈ u, Metric.closedBall x (τ * radius x) := + htarget_original.trans hcover + have huambient : (⋃ x ∈ u, Metric.closedBall x (radius x)) ⊆ ambient := by + apply (show (⋃ x ∈ u, Metric.closedBall x (radius x)) ⊆ + ⋃ x ∈ target, Metric.closedBall x (radius x) by + intro y hy + rcases Set.mem_iUnion₂.mp hy with ⟨x, hx, hyx⟩ + exact Set.mem_iUnion₂.mpr ⟨x, hu hx, hyx⟩).trans hambient + exact measure_le_mul_measure_of_vitali_closedBall_cover ν κ target ambient u + (fun x => x) radius τ K + (fun x hx => hpositive x (hu hx)) hdisjoint htarget + (fun x hx => hlocal x (hu hx)) huambient + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliSum.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliSum.lean new file mode 100644 index 0000000000..2a642571dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/GoodLambdaVitaliSum.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda + +/-! # Good Lambda Vitali Sum -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Measure summation after Vitali selection + +This file isolates the purely measure-theoretic summation step used after a +Vitali selection of stopping balls. It deliberately knows nothing about the +origin of the high-level set or the control measure. +-/ + +/-- A disjoint positive-radius family of closed sup-metric balls in `Vec d` +is countable. This is the topological input needed to sum the local bounds +over a Vitali-selected subfamily. -/ +private theorem countable_of_pairwiseDisjoint_closedBall {d : ℕ} {ι : Type*} + {u : Set ι} (centre : ι → Vec d) (radius : ι → ℝ) + (hpositive : ∀ i ∈ u, 0 < radius i) + (hdisjoint : u.PairwiseDisjoint fun i => Metric.closedBall (centre i) (radius i)) : + u.Countable := by + apply hdisjoint.countable_of_nonempty_interior + intro i hi + refine ⟨centre i, ?_⟩ + exact Metric.ball_subset_interior_closedBall + (Metric.mem_ball_self (hpositive i hi)) + +/-- Sum local estimates over a Vitali-selected family. The selected original +balls are pairwise disjoint and have positive radius, hence are countable in +the separable space `Vec d`; their enlarged balls only provide the cover and +need not be disjoint. -/ +theorem measure_le_mul_measure_of_vitali_closedBall_cover + {d : ℕ} {ι : Type*} (ν κ : Measure (Vec d)) + (target ambient : Set (Vec d)) (u : Set ι) + (centre : ι → Vec d) (radius : ι → ℝ) (τ : ℝ) (K : ℝ≥0∞) + (hpositive : ∀ i ∈ u, 0 < radius i) + (hdisjoint : u.PairwiseDisjoint fun i => Metric.closedBall (centre i) (radius i)) + (hcover : target ⊆ ⋃ i ∈ u, Metric.closedBall (centre i) (τ * radius i)) + (hlocal : ∀ i ∈ u, + ν (target ∩ Metric.closedBall (centre i) (τ * radius i)) ≤ + K * κ (Metric.closedBall (centre i) (radius i))) + (hambient : (⋃ i ∈ u, Metric.closedBall (centre i) (radius i)) ⊆ ambient) : + ν target ≤ K * κ ambient := by + have hcount : u.Countable := + countable_of_pairwiseDisjoint_closedBall centre radius hpositive hdisjoint + have htarget : target ⊆ ⋃ i ∈ u, + target ∩ Metric.closedBall (centre i) (τ * radius i) := by + intro x hx + rcases Set.mem_iUnion₂.mp (hcover hx) with ⟨i, hi, hxi⟩ + exact Set.mem_iUnion₂.mpr ⟨i, hi, ⟨hx, hxi⟩⟩ + have hν_union : + ν (⋃ i ∈ u, target ∩ Metric.closedBall (centre i) (τ * radius i)) ≤ + ∑' i : u, ν (target ∩ Metric.closedBall (centre i) (τ * radius i)) := + measure_biUnion_le ν hcount _ + have hlocal_tsum : + (∑' i : u, ν (target ∩ Metric.closedBall (centre i) (τ * radius i))) ≤ + ∑' i : u, K * κ (Metric.closedBall (centre i) (radius i)) := by + exact ENNReal.tsum_le_tsum fun i => hlocal i i.2 + have hκ_union : + κ (⋃ i ∈ u, Metric.closedBall (centre i) (radius i)) = + ∑' i : u, κ (Metric.closedBall (centre i) (radius i)) := by + exact measure_biUnion hcount hdisjoint fun _ _ => measurableSet_closedBall + calc + ν target ≤ ν (⋃ i ∈ u, target ∩ Metric.closedBall (centre i) (τ * radius i)) := + measure_mono htarget + _ ≤ ∑' i : u, ν (target ∩ Metric.closedBall (centre i) (τ * radius i)) := hν_union + _ ≤ ∑' i : u, K * κ (Metric.closedBall (centre i) (radius i)) := hlocal_tsum + _ = K * ∑' i : u, κ (Metric.closedBall (centre i) (radius i)) := + ENNReal.tsum_mul_left + _ = K * κ (⋃ i ∈ u, Metric.closedBall (centre i) (radius i)) := by rw [hκ_union] + _ ≤ K * κ ambient := mul_le_mul_right (measure_mono hambient) K + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H10Adjoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H10Adjoint.lean new file mode 100644 index 0000000000..fd302efe39 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H10Adjoint.lean @@ -0,0 +1,327 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.PDE.DirichletRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicCovariance +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Realization + +/-! # H10Adjoint -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Zero-trace scalar divergence solutions on cubes + +This file packages the existing Riesz/Dirichlet construction as a canonical +zero-trace solution of a scalar constant-coefficient divergence equation. Its +weak equation has the negative-divergence sign used by finite-`q` comparisons. +-/ + +private abbrev scalarCoeffField {d : ℕ} (sigma0 : ℝ) : CoeffField d := + fun _ => scalarMatrix (d := d) sigma0 + +private theorem isEllipticFieldOn_scalarCoeffField {d : ℕ} + {U : Set (Vec d)} {sigma0 : ℝ} (hU : MeasurableSet U) + (hsigma0 : 0 < sigma0) : + IsEllipticFieldOn sigma0 sigma0 U (scalarCoeffField sigma0) := by + classical + constructor + · apply measurable_pi_iff.2 + intro i + apply measurable_pi_iff.2 + intro j + have hpiece : + Measurable + (U.piecewise + (fun _ : Vec d => scalarMatrix (d := d) sigma0 i j) + (fun _ => 0)) := + measurable_const.piecewise hU measurable_const + simpa [Set.piecewise, scalarCoeffField] using! hpiece + · intro x hx + simpa [scalarCoeffField] using + (isEllipticMatrix_scalarMatrix (d := d) hsigma0) + +private theorem nonempty_axisCube_of_pos {d : ℕ} (z : Vec d) {L : ℝ} + (hL : 0 < L) : + Set.Nonempty (axisCube z L) := by + refine ⟨fun i => z i + L / 2, ?_⟩ + simp only [axisCube, Set.mem_pi, Set.mem_univ, forall_const, Set.mem_Ioo] + intro i + constructor <;> linarith + +/-- A zero-trace solution of the scalar constant-coefficient divergence +equation on an open axis cube, with its sharp Hilbert-vector energy estimate. +-/ +theorem exists_axisCubeScalarDivergenceSolution + {d : ℕ} [NeZero d] (z : Vec d) {L sigma0 : ℝ} + (hL : 0 < L) (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (axisCube z L) G) : + ∃ v : H10Function (axisCube z L), + (∀ ψ : H10Function (axisCube z L), + sigma0 * + ∫ x in axisCube z L, + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in axisCube z L, + vecDot (G x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume) ∧ + ‖v.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + let U : Set (Vec d) := axisCube z L + let g : Vec d → Vec d := fun x => -G x + have hUgeom : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_axisCube z L + let : IsFiniteMeasure (volumeMeasureOn U) := + hUgeom.isFiniteMeasure_restrict_volume + have hg : MemVectorL2 U g := by + simpa [U, g] using! hG.neg + have hRealize : + PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U := + PotentialSolenoidalL2Data.hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + hUgeom + have hne : Set.Nonempty U := by + simpa [U] using nonempty_axisCube_of_pos z hL + have hEll : + IsEllipticFieldOn sigma0 sigma0 U (scalarCoeffField sigma0) := + isEllipticFieldOn_scalarCoeffField hUgeom.isOpen.measurableSet hsigma0 + obtain ⟨v, hv⟩ := + exists_isZeroTraceDirichletRhsWeakSolution_of_potentialZeroTraceClosureRealization + (a := scalarCoeffField sigma0) (U := U) (g := g) + (lam := sigma0) (Lam := sigma0) hg hRealize hne hEll + have hv_divergence : + ∀ ψ : H10Function U, + sigma0 * + ∫ x in U, + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in U, + vecDot (G x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume := by + intro ψ + have hsolver := hv ψ + rw [show + (fun x => + vecDot (matVecMul ((scalarCoeffField sigma0) x) + (v.toH1Function.grad x)) (ψ.toH1Function.grad x)) = + fun x => sigma0 * + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) by + funext x + simp [scalarCoeffField, matVecMul_scalarMatrix, vecDot_smul_left], + MeasureTheory.integral_const_mul] at hsolver + calc + sigma0 * + ∫ x in U, + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := hsolver + _ = + -∫ x in U, vecDot (G x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := by + rw [show + (fun x => vecDot (g x) (ψ.toH1Function.grad x)) = + fun x => -vecDot (G x) (ψ.toH1Function.grad x) by + funext x + simp [g, vecDot_neg_left], + MeasureTheory.integral_neg] + have hGU : MemVectorL2 U G := by + simpa [U] using hG + have hv_energy : + ‖v.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hGU‖ := by + let V : HilbertVectorL2 U := v.toH1Function.gradToHilbertVectorL2 + let H : HilbertVectorL2 U := toHilbertVectorL2OfVecField hGU + have hgrad_integral : + ∫ x in U, + vecDot (v.toH1Function.grad x) (v.toH1Function.grad x) + ∂MeasureTheory.volume = + ‖V‖ ^ 2 := by + calc + ∫ x in U, + vecDot (v.toH1Function.grad x) (v.toH1Function.grad x) + ∂MeasureTheory.volume = + inner ℝ V V := by + simpa [V, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) v.toH1Function.grad_memVectorL2 + v.toH1Function.grad_memVectorL2).symm + _ = ‖V‖ ^ 2 := real_inner_self_eq_norm_sq V + have hpair_integral : + ∫ x in U, vecDot (G x) (v.toH1Function.grad x) + ∂MeasureTheory.volume = + inner ℝ H V := by + simpa [H, V, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hGU v.toH1Function.grad_memVectorL2).symm + have henergy := hv_divergence v + rw [hgrad_integral, hpair_integral] at henergy + have henergy_le : sigma0 * ‖V‖ ^ 2 ≤ ‖H‖ * ‖V‖ := by + calc + sigma0 * ‖V‖ ^ 2 = -inner ℝ H V := henergy + _ ≤ |inner ℝ H V| := neg_le_abs _ + _ ≤ ‖H‖ * ‖V‖ := abs_real_inner_le_norm H V + by_cases hVzero : ‖V‖ = 0 + · rw [hVzero] + exact mul_nonneg (inv_nonneg.mpr hsigma0.le) (norm_nonneg H) + · have hVpos : 0 < ‖V‖ := + lt_of_le_of_ne (norm_nonneg V) (Ne.symm hVzero) + have hsigmaV : sigma0 * ‖V‖ ≤ ‖H‖ := by + apply le_of_mul_le_mul_right _ hVpos + simpa [pow_two, mul_assoc] using henergy_le + have hdiv : ‖V‖ ≤ ‖H‖ / sigma0 := by + apply (le_div_iff₀ hsigma0).2 + simpa [mul_comm] using hsigmaV + simpa [V, H, div_eq_mul_inv, mul_comm] using hdiv + refine ⟨v, ?_, ?_⟩ + · simpa [U] using hv_divergence + · simpa [U] using hv_energy + +/-- The canonical zero-trace solution of the scalar constant-coefficient +divergence equation on an open axis cube. -/ +noncomputable def axisCubeScalarDivergenceSolution + {d : ℕ} [NeZero d] (z : Vec d) {L sigma0 : ℝ} + (hL : 0 < L) (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (axisCube z L) G) : + H10Function (axisCube z L) := + Classical.choose (exists_axisCubeScalarDivergenceSolution z hL hsigma0 G hG) + +/-- The canonical axis-cube solution satisfies the scalar divergence equation +against every zero-trace Sobolev test function. -/ +theorem axisCubeScalarDivergenceSolution_weak + {d : ℕ} [NeZero d] (z : Vec d) {L sigma0 : ℝ} + (hL : 0 < L) (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (axisCube z L) G) + (ψ : H10Function (axisCube z L)) : + sigma0 * + ∫ x in axisCube z L, + vecDot ((axisCubeScalarDivergenceSolution z hL hsigma0 G hG).toH1Function.grad x) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume = + -∫ x in axisCube z L, + vecDot (G x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume := by + exact (Classical.choose_spec + (exists_axisCubeScalarDivergenceSolution z hL hsigma0 G hG)).1 ψ + +/-- The canonical axis-cube solution has the sharp Hilbert-vector energy +bound. -/ +theorem norm_axisCubeScalarDivergenceSolution_gradToHilbertVectorL2_le + {d : ℕ} [NeZero d] (z : Vec d) {L sigma0 : ℝ} + (hL : 0 < L) (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (axisCube z L) G) : + ‖(axisCubeScalarDivergenceSolution z hL hsigma0 G hG).toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + exact (Classical.choose_spec + (exists_axisCubeScalarDivergenceSolution z hL hsigma0 G hG)).2 + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + +/-- Existence form on the open realization of a triadic cube. In particular +this supplies the centered origin-cube interface used by the source-facing CZ +estimates. -/ +theorem exists_openCubeSetScalarDivergenceSolution + {d : ℕ} [NeZero d] (Q : TriadicCube d) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (openCubeSet Q) G) : + ∃ v : H10Function (openCubeSet Q), + (∀ ψ : H10Function (openCubeSet Q), + sigma0 * + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (G x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume) ∧ + ‖v.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + let e : openCubeSet Q = + axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q) := + openCubeSet_eq_axisCube_triadicCube Q + have hAxis : + ∀ hG : MemVectorL2 + (axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q)) G, + ∃ v : H10Function + (axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q)), + (∀ ψ : H10Function + (axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q)), + sigma0 * + ∫ x in axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q), + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in axisCube (triadicCubeAxisCorner Q) (cubeScaleFactor Q), + vecDot (G x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume) ∧ + ‖v.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + intro hG + exact exists_axisCubeScalarDivergenceSolution (triadicCubeAxisCorner Q) + (cubeScaleFactor_pos Q) hsigma0 G hG + have hOpen : + ∀ hG : MemVectorL2 (openCubeSet Q) G, + ∃ v : H10Function (openCubeSet Q), + (∀ ψ : H10Function (openCubeSet Q), + sigma0 * + ∫ x in openCubeSet Q, + vecDot (v.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (G x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume) ∧ + ‖v.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + exact e.symm ▸ hAxis + exact hOpen hG + +/-- The canonical scalar divergence solution on an open triadic cube. -/ +noncomputable def openCubeSetScalarDivergenceSolution + {d : ℕ} [NeZero d] (Q : TriadicCube d) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (openCubeSet Q) G) : + H10Function (openCubeSet Q) := + Classical.choose (exists_openCubeSetScalarDivergenceSolution Q hsigma0 G hG) + +/-- The canonical open-triadic-cube solution satisfies the scalar divergence +equation against every zero-trace Sobolev test function. -/ +theorem openCubeSetScalarDivergenceSolution_weak + {d : ℕ} [NeZero d] (Q : TriadicCube d) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (openCubeSet Q) G) + (ψ : H10Function (openCubeSet Q)) : + sigma0 * + ∫ x in openCubeSet Q, + vecDot ((openCubeSetScalarDivergenceSolution Q hsigma0 G hG).toH1Function.grad x) + (ψ.toH1Function.grad x) ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, + vecDot (G x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume := by + exact (Classical.choose_spec + (exists_openCubeSetScalarDivergenceSolution Q hsigma0 G hG)).1 ψ + +/-- The canonical open-triadic-cube solution has the sharp Hilbert-vector +energy bound. -/ +theorem norm_openCubeSetScalarDivergenceSolution_gradToHilbertVectorL2_le + {d : ℕ} [NeZero d] (Q : TriadicCube d) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (G : Vec d → Vec d) (hG : MemVectorL2 (openCubeSet Q) G) : + ‖(openCubeSetScalarDivergenceSolution Q hsigma0 G hG).toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hG‖ := by + exact (Classical.choose_spec + (exists_openCubeSetScalarDivergenceSolution Q hsigma0 G hG)).2 + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H1CutoffIntegrationByParts.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H1CutoffIntegrationByParts.lean new file mode 100644 index 0000000000..39544870c3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/H1CutoffIntegrationByParts.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers + +/-! # H1Cutoff Integration By Parts -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem memVectorL2_singleCoordinateH1Cutoff + {d : ℕ} {U : Set (Vec d)} {r : Vec d → ℝ} (hr : MemScalarL2 U r) + (j : Fin d) : + MemVectorL2 U (fun x k => if k = j then r x else 0) := by + classical + apply MeasureTheory.MemLp.of_eval + intro k + by_cases hkj : k = j + · subst k + simpa using hr + · rw [show (fun x : Vec d => if k = j then r x else 0) = fun _ => 0 by + funext x + simp [hkj]] + exact MeasureTheory.MemLp.zero' + +private theorem cutoff_integration_by_parts_coord + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (r v : H1Function U) {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) + (hη_sub : tsupport η ⊆ U) (j : Fin d) : + ∫ x in U, v x * r.grad x j * euclideanCoordDeriv j η x ∂MeasureTheory.volume = + -∫ x in U, r x * v.grad x j * euclideanCoordDeriv j η x + ∂MeasureTheory.volume - + ∫ x in U, r x * v x * euclideanCoordSecondDeriv j j η x + ∂MeasureTheory.volume := by + let Dη : Vec d → ℝ := euclideanCoordDeriv j η + let ψ : H10Function U := + v.mulContDiffHasCompactSupportToH10 hU + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + have htest : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x in U, + vecDot ((fun y k => if k = j then r y else 0) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in U, -r.grad x j * φ x ∂MeasureTheory.volume := by + intro φ hφ hφ_compact hφ_sub + have hrweak := r.hasWeakPartialDerivOn j φ hφ hφ_compact hφ_sub + rw [← MeasureTheory.integral_neg] at hrweak + simpa [vecDot, euclideanGradient, euclideanCoordDeriv] using hrweak + have hweak := h10WeakEquationOn_of_contDiff_tests hU.isOpen + (memVectorL2_singleCoordinateH1Cutoff r.memL2 j) (r.gradMemL2 j).neg htest ψ + have hψfun : ψ.toH1Function.toFun = fun x => Dη x * v x := by + simp [ψ, Dη] + have hψgrad := WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae v hU + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + have hweak_expanded : + ∫ x in U, r x * + (Dη x * v.grad x j + v x * euclideanCoordSecondDeriv j j η x) + ∂MeasureTheory.volume = + ∫ x in U, -r.grad x j * (Dη x * v x) + ∂MeasureTheory.volume := by + rw [show + (fun x => vecDot ((fun y k => if k = j then r y else 0) x) + (ψ.toH1Function.grad x)) = + fun x => r x * ψ.toH1Function.grad x j by + funext x + simp [vecDot]] at hweak + rw [hψfun] at hweak + have hleft : + (fun x => r x * ψ.toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => r x * + (Dη x * v.grad x j + v x * euclideanCoordSecondDeriv j j η x) := by + filter_upwards [hψgrad] with x hx + simp only [Dη, euclideanCoordDeriv] at hx ⊢ + rw [hx] + rfl + rw [MeasureTheory.integral_congr_ae hleft] at hweak + simpa [Dη, mul_comm, mul_left_comm, mul_assoc] using hweak + have hDη_memL2 : MemScalarL2 U (fun x => Dη x * v x) := by + exact + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + v.memL2 + have hDηgrad_memL2 : MemScalarL2 U (fun x => Dη x * v.grad x j) := by + exact + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + (v.gradMemL2 j) + have hsecond_memL2 : + MemScalarL2 U (fun x => v x * euclideanCoordSecondDeriv j j η x) := by + have hbase : MemScalarL2 U + (fun x => euclideanCoordSecondDeriv j j η x * v x) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordSecondDeriv hη j j) + (hasCompactSupport_euclideanCoordSecondDeriv hη_compact j j) + ((tsupport_euclideanCoordSecondDeriv_subset_tsupport j j η).trans hη_sub) + v.memL2 + simpa [mul_comm] using hbase + have hfirst_int : MeasureTheory.IntegrableOn + (fun x => r x * (Dη x * v.grad x j)) U := + r.memL2.integrable_mul hDηgrad_memL2 + have hsecond_int : MeasureTheory.IntegrableOn + (fun x => r x * (v x * euclideanCoordSecondDeriv j j η x)) U := + r.memL2.integrable_mul hsecond_memL2 + have hsplit : + ∫ x in U, r x * + (Dη x * v.grad x j + v x * euclideanCoordSecondDeriv j j η x) + ∂MeasureTheory.volume = + ∫ x in U, r x * (Dη x * v.grad x j) ∂MeasureTheory.volume + + ∫ x in U, r x * (v x * euclideanCoordSecondDeriv j j η x) + ∂MeasureTheory.volume := by + rw [show (fun x => r x * + (Dη x * v.grad x j + v x * euclideanCoordSecondDeriv j j η x)) = + fun x => r x * (Dη x * v.grad x j) + + r x * (v x * euclideanCoordSecondDeriv j j η x) by + funext x + ring] + exact MeasureTheory.integral_add hfirst_int hsecond_int + have hright : + ∫ x in U, -r.grad x j * (Dη x * v x) ∂MeasureTheory.volume = + -∫ x in U, v x * r.grad x j * Dη x ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_neg] + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring + have hfirst : + ∫ x in U, r x * (Dη x * v.grad x j) ∂MeasureTheory.volume = + ∫ x in U, r x * v.grad x j * Dη x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring + have hsecond : + ∫ x in U, r x * (v x * euclideanCoordSecondDeriv j j η x) + ∂MeasureTheory.volume = + ∫ x in U, r x * v x * euclideanCoordSecondDeriv j j η x + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring + dsimp only [Dη] at hweak_expanded hsplit hright hfirst hsecond + linarith + +/-- Integration by parts for two `H¹` functions after multiplying by a smooth +compactly supported cutoff. Neither function is assumed to have zero trace. -/ +theorem h1_cutoff_integration_by_parts + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (r v : H1Function U) {η : Vec d → ℝ} + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) + (hη_sub : tsupport η ⊆ U) : + ∫ x in U, v x * vecDot (r.grad x) (euclideanGradient η x) + ∂MeasureTheory.volume = + -∫ x in U, r x * vecDot (v.grad x) (euclideanGradient η x) + ∂MeasureTheory.volume - + ∫ x in U, r x * v x * euclideanCoordLaplacian η x + ∂MeasureTheory.volume := by + have hleft_int : ∀ j : Fin d, MeasureTheory.IntegrableOn + (fun x => v x * r.grad x j * euclideanCoordDeriv j η x) U := by + intro j + have hcut : MemScalarL2 U (fun x => euclideanCoordDeriv j η x * v x) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + v.memL2 + change MeasureTheory.Integrable + (fun x => v x * r.grad x j * euclideanCoordDeriv j η x) + (MeasureTheory.volume.restrict U) + convert (r.gradMemL2 j).integrable_mul hcut using 1 + funext x + simp only [Pi.mul_apply] + ring + have hmiddle_int : ∀ j : Fin d, MeasureTheory.IntegrableOn + (fun x => r x * v.grad x j * euclideanCoordDeriv j η x) U := by + intro j + have hcut : MemScalarL2 U + (fun x => euclideanCoordDeriv j η x * v.grad x j) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + (v.gradMemL2 j) + change MeasureTheory.Integrable + (fun x => r x * v.grad x j * euclideanCoordDeriv j η x) + (MeasureTheory.volume.restrict U) + convert r.memL2.integrable_mul hcut using 1 + funext x + simp only [Pi.mul_apply] + ring + have hlast_int : ∀ j : Fin d, MeasureTheory.IntegrableOn + (fun x => r x * v x * euclideanCoordSecondDeriv j j η x) U := by + intro j + have hcut : MemScalarL2 U + (fun x => v x * euclideanCoordSecondDeriv j j η x) := by + have hbase : MemScalarL2 U + (fun x => euclideanCoordSecondDeriv j j η x * v x) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordSecondDeriv hη j j) + (hasCompactSupport_euclideanCoordSecondDeriv hη_compact j j) + ((tsupport_euclideanCoordSecondDeriv_subset_tsupport j j η).trans hη_sub) + v.memL2 + simpa [mul_comm] using hbase + change MeasureTheory.Integrable + (fun x => r x * v x * euclideanCoordSecondDeriv j j η x) + (MeasureTheory.volume.restrict U) + convert r.memL2.integrable_mul hcut using 1 + funext x + simp only [Pi.mul_apply] + ring + have hleft_sum : + ∫ x in U, v x * vecDot (r.grad x) (euclideanGradient η x) + ∂MeasureTheory.volume = + ∑ j : Fin d, ∫ x in U, + v x * r.grad x j * euclideanCoordDeriv j η x ∂MeasureTheory.volume := by + rw [show (fun x => v x * vecDot (r.grad x) (euclideanGradient η x)) = + fun x => ∑ j : Fin d, v x * r.grad x j * euclideanCoordDeriv j η x by + funext x + simp only [vecDot, euclideanGradient, euclideanCoordDeriv] + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro j _ + ring] + rw [MeasureTheory.integral_finsetSum] + intro j _ + exact hleft_int j + have hmiddle_sum : + ∫ x in U, r x * vecDot (v.grad x) (euclideanGradient η x) + ∂MeasureTheory.volume = + ∑ j : Fin d, ∫ x in U, + r x * v.grad x j * euclideanCoordDeriv j η x ∂MeasureTheory.volume := by + rw [show (fun x => r x * vecDot (v.grad x) (euclideanGradient η x)) = + fun x => ∑ j : Fin d, r x * v.grad x j * euclideanCoordDeriv j η x by + funext x + simp only [vecDot, euclideanGradient, euclideanCoordDeriv] + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro j _ + ring] + rw [MeasureTheory.integral_finsetSum] + intro j _ + exact hmiddle_int j + have hlast_sum : + ∫ x in U, r x * v x * euclideanCoordLaplacian η x + ∂MeasureTheory.volume = + ∑ j : Fin d, ∫ x in U, + r x * v x * euclideanCoordSecondDeriv j j η x + ∂MeasureTheory.volume := by + rw [show (fun x => r x * v x * euclideanCoordLaplacian η x) = + fun x => ∑ j : Fin d, r x * v x * euclideanCoordSecondDeriv j j η x by + funext x + simp only [euclideanCoordLaplacian] + rw [Finset.mul_sum]] + rw [MeasureTheory.integral_finsetSum] + intro j _ + exact hlast_int j + rw [hleft_sum, hmiddle_sum, hlast_sum] + calc + ∑ j : Fin d, ∫ x in U, + v x * r.grad x j * euclideanCoordDeriv j η x ∂MeasureTheory.volume = + ∑ j : Fin d, + (-∫ x in U, r x * v.grad x j * euclideanCoordDeriv j η x + ∂MeasureTheory.volume - + ∫ x in U, r x * v x * euclideanCoordSecondDeriv j j η x + ∂MeasureTheory.volume) := by + apply Finset.sum_congr rfl + intro j _ + exact cutoff_integration_by_parts_coord hU r v hη hη_compact hη_sub j + _ = -(∑ j : Fin d, ∫ x in U, + r x * v.grad x j * euclideanCoordDeriv j η x ∂MeasureTheory.volume) - + ∑ j : Fin d, ∫ x in U, + r x * v x * euclideanCoordSecondDeriv j j η x + ∂MeasureTheory.volume := by + rw [Finset.sum_sub_distrib, Finset.sum_neg_distrib] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicDerivative.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicDerivative.lean new file mode 100644 index 0000000000..6ed95f82d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicDerivative.lean @@ -0,0 +1,305 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 + +/-! # Harmonic Derivative -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Harmonicity of weak derivatives + +This is an internal closure lemma for the Calderon--Zygmund proof engine. +Starting with a homogeneous scalar weak Poisson equation and the locally +constructed weak-Hessian witness, it supplies the same homogeneous equation +for every gradient coordinate. No regularity assumption is added to a +Calderon--Zygmund statement: the witness is the one produced by the interior +difference-quotient argument. +-/ + +namespace CubeCalderonZygmund + +private theorem hess_swap_ae {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + (hU : IsOpen U) (H : HasWeakHessianOn U u) (i j : Fin d) : + H.hess i j =ᵐ[MeasureTheory.volume.restrict U] H.hess j i := by + have hij_loc : MeasureTheory.LocallyIntegrableOn (H.hess i j) U + MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((H.hess_memL2 i j).locallyIntegrable (by norm_num)) + have hji_loc : MeasureTheory.LocallyIntegrableOn (H.hess j i) U + MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((H.hess_memL2 j i).locallyIntegrable (by norm_num)) + rw [Filter.EventuallyEq, MeasureTheory.ae_restrict_iff' hU.measurableSet] + have hzero : + ∀ᵐ x ∂MeasureTheory.volume, x ∈ U → H.hess i j x - H.hess j i x = 0 := by + refine hU.ae_eq_zero_of_integral_contDiff_smul_eq_zero (hij_loc.sub hji_loc) ?_ + intro φ hφ hφs hφ_sub + have hweak_ij := H.weak_second i j φ hφ hφs hφ_sub + have hweak_ji := H.weak_second j i φ hφ hφs hφ_sub + have hu_ij := u.hasWeakPartialDerivOn i (euclideanCoordDeriv j φ) + (contDiff_euclideanCoordDeriv hφ j) + (hasCompactSupport_euclideanCoordDeriv hφs j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j φ).trans hφ_sub) + have hu_ji := u.hasWeakPartialDerivOn j (euclideanCoordDeriv i φ) + (contDiff_euclideanCoordDeriv hφ i) + (hasCompactSupport_euclideanCoordDeriv hφs i) + ((tsupport_euclideanCoordDeriv_subset_tsupport i φ).trans hφ_sub) + have hφ_memL2 : MemScalarL2 U φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφs).restrict U + have hij_int : MeasureTheory.Integrable (fun x => H.hess i j x * φ x) + (MeasureTheory.volume.restrict U) := by + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (H.hess_memL2 i j).integrable_mul hφ_memL2 + have hji_int : MeasureTheory.Integrable (fun x => H.hess j i x * φ x) + (MeasureTheory.volume.restrict U) := by + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (H.hess_memL2 j i).integrable_mul hφ_memL2 + have hij_zero_out : ∀ x, x ∉ U → H.hess i j x * φ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + have hji_zero_out : ∀ x, x ∉ U → H.hess j i x * φ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + have hij_global : MeasureTheory.Integrable (fun x => H.hess i j x * φ x) + MeasureTheory.volume := by + exact MeasureTheory.IntegrableOn.integrable_of_forall_notMem_eq_zero + hij_int hij_zero_out + have hji_global : MeasureTheory.Integrable (fun x => H.hess j i x * φ x) + MeasureTheory.volume := by + exact MeasureTheory.IntegrableOn.integrable_of_forall_notMem_eq_zero + hji_int hji_zero_out + have hweak_ij' : + ∫ x in U, u.grad x i * euclideanCoordDeriv j φ x ∂MeasureTheory.volume = + -∫ x in U, H.hess i j x * φ x ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using hweak_ij + have hweak_ji' : + ∫ x in U, u.grad x j * euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + -∫ x in U, H.hess j i x * φ x ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using hweak_ji + have hu_ij' : + ∫ x in U, u x * euclideanCoordSecondDeriv j i φ x ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * euclideanCoordDeriv j φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hu_ij + have hu_ji' : + ∫ x in U, u x * euclideanCoordSecondDeriv i j φ x ∂MeasureTheory.volume = + -∫ x in U, u.grad x j * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hu_ji + simp only [smul_eq_mul] + rw [show (fun x => φ x * (H.hess i j x - H.hess j i x)) = + (fun x => H.hess i j x * φ x - H.hess j i x * φ x) by + funext x; ring] + rw [MeasureTheory.integral_sub] + · apply sub_eq_zero.mpr + calc + ∫ x, H.hess i j x * φ x ∂MeasureTheory.volume = + ∫ x in U, H.hess i j x * φ x ∂MeasureTheory.volume := + (MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hij_zero_out).symm + _ = + -∫ x in U, u.grad x i * euclideanCoordDeriv j φ x + ∂MeasureTheory.volume := by linarith [hweak_ij'] + _ = ∫ x in U, u x * euclideanCoordSecondDeriv j i φ x + ∂MeasureTheory.volume := by linarith [hu_ij'] + _ = ∫ x in U, u x * euclideanCoordSecondDeriv i j φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + change u x * euclideanCoordSecondDeriv j i φ x = + u x * euclideanCoordSecondDeriv i j φ x + rw [euclideanCoordSecondDeriv_comm hφ j i x] + _ = -∫ x in U, u.grad x j * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by linarith [hu_ji'] + _ = ∫ x in U, H.hess j i x * φ x ∂MeasureTheory.volume := by + linarith [hweak_ji'] + _ = ∫ x, H.hess j i x * φ x ∂MeasureTheory.volume := + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hji_zero_out + · exact hij_global + · exact hji_global + filter_upwards [hzero] with x hx + intro hxU + exact sub_eq_zero.mp (hx hxU) + +end CubeCalderonZygmund + +namespace WeakPoissonEquationOn + +/-- A zero-forcing weak Poisson equation is inherited by each gradient +coordinate once the local weak Hessian has been constructed. -/ +theorem gradCoordH1Function_harmonic {d : ℕ} {U : Set (Vec d)} + {u : H1Function U} (hU : IsOpen U) + (h : WeakPoissonEquationOn U u (fun _ => 0)) + (H : HasWeakHessianOn U u) (i : Fin d) : + WeakPoissonEquationOn U (H.gradCoordH1Function i) (fun _ => 0) := by + intro φ hφ hφs hφ_sub + have hderiv_memL2 : ∀ k : Fin d, MemScalarL2 U (euclideanCoordDeriv k φ) := by + intro k + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hφ k).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hφs k)).restrict U + have hsecond_memL2 : ∀ k : Fin d, + MemScalarL2 U (euclideanCoordSecondDeriv i k φ) := by + intro k + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordSecondDeriv hφ i k).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordSecondDeriv hφs i k)).restrict U + have hhess_int : ∀ k : Fin d, + MeasureTheory.Integrable (fun x => H.hess i k x * euclideanCoordDeriv k φ x) + (MeasureTheory.volume.restrict U) := by + intro k + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (H.hess_memL2 i k).integrable_mul (hderiv_memL2 k) + have hgrad_int : ∀ k : Fin d, + MeasureTheory.Integrable + (fun x => u.grad x k * euclideanCoordSecondDeriv i k φ x) + (MeasureTheory.volume.restrict U) := by + intro k + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (u.grad_memL2 k).integrable_mul (hsecond_memL2 k) + have htest := h.test (euclideanCoordDeriv i φ) + (contDiff_euclideanCoordDeriv hφ i) + (hasCompactSupport_euclideanCoordDeriv hφs i) + ((tsupport_euclideanCoordDeriv_subset_tsupport i φ).trans hφ_sub) + have hzero_sum : + ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume = 0 := by + calc + ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume = + ∫ x in U, + vecDot (u.grad x) (euclideanGradient (euclideanCoordDeriv i φ) x) + ∂MeasureTheory.volume := by + symm + calc + ∫ x in U, + vecDot (u.grad x) (euclideanGradient (euclideanCoordDeriv i φ) x) + ∂MeasureTheory.volume = + ∫ x in U, ∑ k : Fin d, + u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp only [vecDot, euclideanGradient, euclideanCoordSecondDeriv, + euclideanCoordDeriv] + _ = ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro k _ + exact hgrad_int k + _ = 0 := by + simpa [euclideanCoordDeriv] using htest + have htranspose : ∀ k : Fin d, + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + intro k + have hweak := H.weak_second k i (euclideanCoordDeriv k φ) + (contDiff_euclideanCoordDeriv hφ k) + (hasCompactSupport_euclideanCoordDeriv hφs k) + ((tsupport_euclideanCoordDeriv_subset_tsupport k φ).trans hφ_sub) + have hweak' : + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv k i φ x + ∂MeasureTheory.volume = + -∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hweak + calc + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv k i φ x + ∂MeasureTheory.volume := by linarith [hweak'] + _ = -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply congrArg Neg.neg + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + change u.grad x k * euclideanCoordSecondDeriv k i φ x = + u.grad x k * euclideanCoordSecondDeriv i k φ x + rw [euclideanCoordSecondDeriv_comm hφ k i x] + have hswap : ∀ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + intro k + apply MeasureTheory.integral_congr_ae + filter_upwards [CubeCalderonZygmund.hess_swap_ae hU H i k] with x hx + rw [hx] + simp only [zero_mul, MeasureTheory.integral_zero] + calc + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∑ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + calc + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, ∑ k : Fin d, + H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp only [vecDot, HasWeakHessianOn.gradCoordH1Function_grad_apply, + euclideanGradient, euclideanCoordDeriv] + _ = ∑ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro k _ + exact hhess_int k + _ = ∑ k : Fin d, + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro k _ + exact hswap k + _ = ∑ k : Fin d, + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro k _ + exact htranspose k + _ = -∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + rw [Finset.sum_neg_distrib] + _ = 0 := by rw [hzero_sum, neg_zero] + +/-- Strict-inner-domain form of `gradCoordH1Function_harmonic`. The scalar +weak equation is restricted, while the local Hessian witness is consumed only +on the inner domain. -/ +theorem gradCoordH1Function_harmonic_restrict {d : ℕ} {U : Set (Vec d)} + {u : H1Function U} (h : WeakPoissonEquationOn U u (fun _ => 0)) + {V : Set (Vec d)} (hVopen : IsOpen V) (hVU : V ⊆ U) + (H : HasWeakHessianOn V (u.restrict hVopen hVU)) (i : Fin d) : + WeakPoissonEquationOn V (H.gradCoordH1Function i) (fun _ => 0) := by + exact (h.restrict hVopen hVU).gradCoordH1Function_harmonic hVopen H i + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientFirstGain.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientFirstGain.lean new file mode 100644 index 0000000000..59f53efa56 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientFirstGain.lean @@ -0,0 +1,119 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding + +/-! # Harmonic Gradient First Gain -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators + +noncomputable section + +/-! +# First Sobolev gain for weak harmonic gradients + +The analytic estimate in this file is purely Sobolev-theoretic: a local weak +Hessian makes each gradient coordinate an `H¹` function, and the cube Sobolev +embedding raises that coordinate from `L²` to the critical exponent. The +weak-harmonic equation is kept out of the estimate itself. +-/ + +namespace CubeCalderonZygmund + +variable {d : ℕ} + +private theorem openCubeSet_eq_axisCube (Q : TriadicCube d) : + openCubeSet Q = + axisCube + (fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + (cubeScaleFactor Q) := by + have hupper : ∀ j : Fin d, + ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + cubeScaleFactor Q = + ((Q.index j : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + intro j + ring + ext x + simp only [openCubeSet, axisCube, Set.mem_ofPred_eq, Set.mem_pi, Set.mem_univ, + forall_true_left, Set.mem_Ioo] + simp_rw [hupper] + +/-- The pure Sobolev first gain for a gradient coordinate. The constant is +chosen before the cube, function, weak-Hessian witness, and coordinate, so it +depends only on the dimension. -/ +theorem exists_gradCoord_criticalLp_bound (hd : 3 ≤ d) : + ∃ C : ℝ≥0, 0 < C ∧ + ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d), + MeasureTheory.eLpNorm (fun x => u.grad x i) (twoStar d) + (volumeMeasureOn (openCubeSet Q)) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (openCubeSet Q))) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 + (volumeMeasureOn (openCubeSet Q))) := by + obtain ⟨C, hCpos, hC⟩ := cube_sobolev_embedding hd + refine ⟨C, hCpos, ?_⟩ + intro Q + let z : Vec d := fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hset : openCubeSet Q = axisCube z (cubeScaleFactor Q) := by + simpa [z] using openCubeSet_eq_axisCube Q + let P : Set (Vec d) → Prop := fun U => + ∀ (u : H1Function U) (H : HasWeakHessianOn U u) (i : Fin d), + MeasureTheory.eLpNorm (fun x => u.grad x i) (twoStar d) + (volumeMeasureOn U) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn U)) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn U)) + have haxis : P (axisCube z (cubeScaleFactor Q)) := by + intro v K i + simpa [P, HasWeakHessianOn.gradCoordH1Function_apply, + HasWeakHessianOn.gradCoordH1Function_grad_apply] using! + hC z (cubeScaleFactor Q) hscale_pos (K.gradCoordH1Function i) + exact hset.symm ▸ haxis + +/-- The derivative-harmonic package used by the later regularity engine: the +Sobolev gain remains the pure estimate above, while this thin wrapper records +the homogeneous weak equation available for the same coordinate. -/ +theorem exists_harmonic_gradCoord_criticalLp_bound (hd : 3 ≤ d) : + ∃ C : ℝ≥0, 0 < C ∧ + ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + WeakPoissonEquationOn (openCubeSet Q) (H.gradCoordH1Function i) (fun _ => 0) ∧ + MeasureTheory.eLpNorm (fun x => u.grad x i) (twoStar d) + (volumeMeasureOn (openCubeSet Q)) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (openCubeSet Q))) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 + (volumeMeasureOn (openCubeSet Q))) := by + obtain ⟨C, hCpos, hbound⟩ := exists_gradCoord_criticalLp_bound hd + refine ⟨C, hCpos, ?_⟩ + intro Q u H i hweak + refine ⟨?_, hbound Q u H i⟩ + exact hweak.gradCoordH1Function_harmonic (isOpen_openCubeSet Q) H i + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientGainIteration.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientGainIteration.lean new file mode 100644 index 0000000000..9f93e6723f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientGainIteration.lean @@ -0,0 +1,1146 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientIterationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.LimitFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.ScaledPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientOneDim + +/-! # Harmonic Gradient Gain Iteration -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +/-! +# Internal exponent-raising carrier for harmonic gradients + +The declarations in `INTERNAL` are an induction carrier, not a +source-facing Calderón--Zygmund assumption. Its membership field is kept +alongside the normalized extended-norm estimate because the next Sobolev step +must construct a genuine `W^{1,p}` witness; finiteness must never be silently +reintroduced as a caller hypothesis. +-/ + +namespace CubeCalderonZygmund + +namespace INTERNAL + +/-- The proved induction carrier for a harmonic-gradient integrability gain. +It is deliberately an explicit structure rather than an opaque predicate: its +only analytic data are the stated membership and bound, both quantified over +all harmonic cube solutions. -/ +structure HarmonicGradientGain (d : ℕ) (r : FiniteLpExponent) (depth : ℕ) where + fixedValue : ℝ≥0∞ + constant_pos : 0 < fixedValue + constant_ne_top : fixedValue ≠ ∞ + memLp : ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin d, + MeasureTheory.MemLp (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure (centralDescendant Q depth)) + bound : ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure (centralDescendant Q depth)) ≤ + fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) + +/-- Euclidean-facing form of the internal carrier. This is the API consumed +by vector-valued good-`λ` arguments; no caller supplies coordinate +measurability data. -/ +structure HarmonicEuclideanGradientGain (d : ℕ) (r : FiniteLpExponent) (depth : ℕ) where + fixedValue : ℝ≥0∞ + constant_ne_top : fixedValue ≠ ∞ + memLp : ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (normalizedCubeMeasure (centralDescendant Q depth)) + bound : ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) r.exponent + (normalizedCubeMeasure (centralDescendant Q depth)) ≤ + fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) + +/-- The unraised base of the induction carrier: normalized `L²` control at +depth zero costs exactly one. -/ +noncomputable def harmonicGradientGain_two_zero (d : ℕ) : + HarmonicGradientGain d FiniteLpExponent.two 0 := by + refine ⟨1, by norm_num, by norm_num, ?_, ?_⟩ + · intro Q u _ i + simpa using u.grad_memL2_normalizedCubeMeasure i + · intro Q u _ i + simpa only [centralDescendant_zero, one_mul] using! + (Finset.single_le_sum + (fun j _ => (bot_le : 0 ≤ MeasureTheory.eLpNorm (fun x => u.grad x j) 2 + (normalizedCubeMeasure Q))) + (Finset.mem_univ i) : + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q) ≤ + ∑ j : Fin d, MeasureTheory.eLpNorm (fun x => u.grad x j) 2 + (normalizedCubeMeasure Q)) + +noncomputable def HarmonicEuclideanGradientGain.fromScalar {d : ℕ} + {r : FiniteLpExponent} {depth : ℕ} (G : HarmonicGradientGain d r depth) : + HarmonicEuclideanGradientGain d r depth := by + let C : ℝ≥0∞ := ‖(d : ℝ)‖ₑ * (d : ℝ≥0∞) * G.fixedValue + have hCtop : C ≠ ∞ := + ENNReal.mul_ne_top (ENNReal.mul_ne_top enorm_ne_top (ENNReal.natCast_ne_top d)) + G.constant_ne_top + refine ⟨C, hCtop, ?_, ?_⟩ + · intro Q u h + let μ := normalizedCubeMeasure (centralDescendant Q depth) + have hcoord : ∀ i : Fin d, MeasureTheory.MemLp (fun x => u.grad x i) + r.exponent μ := fun i => G.memLp Q u h i + have hvec : MeasureTheory.AEStronglyMeasurable (fun x => u.grad x) μ := + (aemeasurable_pi_lambda _ fun i => (hcoord i).aemeasurable).aestronglyMeasurable + have hhilbert : MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (u.grad x)) μ := by + simpa using (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable hvec + refine ⟨hhilbert, ?_⟩ + have hsum : ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent μ ≤ + (d : ℝ≥0∞) * (G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q)) := by + calc + _ ≤ ∑ _i : Fin d, G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := + Finset.sum_le_sum fun i _ => G.bound Q u h i + _ = _ := by simp + have hbound : MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) + r.exponent μ ≤ C * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + calc + _ ≤ ‖(d : ℝ)‖ₑ * ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent μ := + euclidean_eLpNorm_le_dimension_mul_sum_coordinates μ r u.grad + fun i => (hcoord i).aestronglyMeasurable + _ ≤ ‖(d : ℝ)‖ₑ * ((d : ℝ≥0∞) * (G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q))) := + mul_le_mul_right hsum _ + _ = _ := by simp [C]; ring + have hRtop : (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q)) ≠ ∞ := + (ENNReal.sum_ne_top).2 fun j _ => + (u.grad_memL2_normalizedCubeMeasure j).eLpNorm_ne_top + apply lt_of_le_of_lt hbound + exact lt_top_iff_ne_top.mpr (ENNReal.mul_ne_top hCtop hRtop) + · intro Q u h + let μ := normalizedCubeMeasure (centralDescendant Q depth) + have hsum : ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent μ ≤ + (d : ℝ≥0∞) * (G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q)) := by + calc + _ ≤ ∑ _i : Fin d, G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := + Finset.sum_le_sum fun i _ => G.bound Q u h i + _ = _ := by simp + calc + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (u.grad x)) r.exponent μ ≤ + ‖(d : ℝ)‖ₑ * ∑ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent μ := + euclidean_eLpNorm_le_dimension_mul_sum_coordinates μ r u.grad + fun i => (G.memLp Q u h i).aestronglyMeasurable + _ ≤ ‖(d : ℝ)‖ₑ * ((d : ℝ≥0∞) * (G.fixedValue * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q))) := by + exact mul_le_mul_right hsum _ + _ = C * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + simp [C] + ring + +private theorem memLpOn_openCubeSet_of_memLp_normalizedCubeMeasure + {d : ℕ} (Q : TriadicCube d) {p : ℝ≥0∞} {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (volumeMeasureOn (openCubeSet Q)) := by + have hle : cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * cubeMeasure Q s) = cubeMeasure Q s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hcube : MeasureTheory.MemLp f p (cubeMeasure Q) := + hf.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) ENNReal.ofReal_ne_top hle + simpa [volumeMeasureOn, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] using hcube + +private theorem eLpNorm_rawCube_eq_scale_mul_normalized {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (f : Vec d → ℝ) : + MeasureTheory.eLpNorm f p.exponent (volumeMeasureOn (openCubeSet Q)) = + (ENNReal.ofReal (cubeScaleFactor Q) ^ ((d : ℝ) / p.exponent.toReal)) * + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) := by + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hcoeff : + ENNReal.ofReal (cubeVolume Q)⁻¹ ^ (1 / p.exponent).toReal = + (ENNReal.ofReal (cubeScaleFactor Q) ^ ((d : ℝ) / p.exponent.toReal))⁻¹ := by + rw [cubeVolume_eq_scaleFactor_pow, ENNReal.ofReal_inv_of_pos (pow_pos hscale d)] + rw [ENNReal.ofReal_pow hscale.le, ENNReal.inv_rpow, + ← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + congr 1 + simp only [one_div, ENNReal.toReal_inv] + field_simp [ne_of_gt (ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne)] + have hnorm : MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) = + (ENNReal.ofReal (cubeVolume Q)⁻¹ ^ (1 / p.exponent).toReal) * + MeasureTheory.eLpNorm f p.exponent (volumeMeasureOn (openCubeSet Q)) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact MeasureTheory.eLpNorm_smul_measure_of_ne_zero + (ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q))) f p.exponent _ + rw [hcoeff] at hnorm + set a : ℝ≥0∞ := ENNReal.ofReal (cubeScaleFactor Q) ^ ((d : ℝ) / p.exponent.toReal) + have ha0 : a ≠ 0 := ne_of_gt <| + ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top + have hat : a ≠ ⊤ := ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top + rw [hnorm] + calc + _ = (a * a⁻¹) * MeasureTheory.eLpNorm f p.exponent + (volumeMeasureOn (openCubeSet Q)) := by simp [a, ENNReal.mul_inv_cancel ha0 hat] + _ = _ := by ring + +private theorem centralDescendant_centralChild {d : ℕ} (Q : TriadicCube d) : + ∀ n : ℕ, centralDescendant (centralChild Q) n = centralDescendant Q (n + 1) + | 0 => by simp [centralDescendant] + | n + 1 => by + simp only [centralDescendant_succ] + rw [centralDescendant_centralChild Q n] + rfl + +private theorem openCubeSet_eq_axisCube {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q = + axisCube (fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + (cubeScaleFactor Q) := by + have hupper : ∀ j : Fin d, + ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + cubeScaleFactor Q = + ((Q.index j : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + intro j + ring + ext x + simp only [openCubeSet, axisCube, Set.mem_ofPred_eq, Set.mem_pi, Set.mem_univ, + forall_true_left, Set.mem_Ioo] + simp_rw [hupper] + +private theorem normalized_cubeSobolevEmbedding_finiteLp {d : ℕ} (hd : 0 < d) + (r q : FiniteLpExponent) + (hqr : (q.exponent.toReal)⁻¹ = r.exponent.toReal⁻¹ - (d : ℝ)⁻¹) + (hrlt : r.exponent.toReal < d) : + ∃ C : ℝ≥0∞, 0 < C ∧ C ≠ ∞ ∧ + ∀ (Q : TriadicCube d) (v : W1pFunction (openCubeSet Q) r.exponent), + MeasureTheory.eLpNorm v.toFun q.exponent (normalizedCubeMeasure Q) ≤ C * + (ENNReal.ofReal (cubeScaleFactor Q) * + ∑ j : Fin d, MeasureTheory.eLpNorm (fun x => v.grad x j) r.exponent + (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm v.toFun r.exponent (normalizedCubeMeasure Q)) := by + obtain ⟨C, hCpos, hC⟩ := cubeSobolevEmbedding_finiteLp hd r hrlt + refine ⟨C, ENNReal.coe_pos.mpr hCpos, ENNReal.coe_ne_top, ?_⟩ + intro Q v + let z : Vec d := fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have haxis : openCubeSet Q = axisCube z (cubeScaleFactor Q) := by + simpa [z] using openCubeSet_eq_axisCube Q + have hraw : MeasureTheory.eLpNorm v.toFun q.exponent + (volumeMeasureOn (openCubeSet Q)) ≤ (C : ℝ≥0∞) * + ((∑ j : Fin d, MeasureTheory.eLpNorm (fun x => v.grad x j) r.exponent + (volumeMeasureOn (openCubeSet Q))) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm v.toFun r.exponent (volumeMeasureOn (openCubeSet Q))) := by + let P : Set (Vec d) → Prop := fun U => + MeasureTheory.eLpNorm v.toFun q.exponent (volumeMeasureOn U) ≤ (C : ℝ≥0∞) * + ((∑ j : Fin d, MeasureTheory.eLpNorm (fun x => v.grad x j) r.exponent + (volumeMeasureOn U)) + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm v.toFun r.exponent (volumeMeasureOn U)) + let vAxis : W1pFunction (axisCube z (cubeScaleFactor Q)) r.exponent := + { toFun := v.toFun + grad := v.grad + memLp := by simpa [haxis] using v.memLp + gradMemLp := by intro i; simpa [haxis] using v.gradMemLp i + hasWeakGradient := by intro i; simpa [haxis] using v.hasWeakGradient i } + have haxisBound := hC q hqr z (cubeScaleFactor Q) hscale vAxis + simpa [P, vAxis, haxis] using haxisBound + let a : ℝ≥0∞ := ENNReal.ofReal (cubeScaleFactor Q) + let aq : ℝ≥0∞ := a ^ ((d : ℝ) / q.exponent.toReal) + let ar : ℝ≥0∞ := a ^ ((d : ℝ) / r.exponent.toReal) + have hapos : 0 < a := ENNReal.ofReal_pos.mpr hscale + have ha0 : a ≠ 0 := ne_of_gt hapos + have hat : a ≠ ⊤ := ENNReal.ofReal_ne_top + have haq0 : aq ≠ 0 := ne_of_gt (ENNReal.rpow_pos hapos hat) + have haqtop : aq ≠ ⊤ := ENNReal.rpow_ne_top_of_nonneg (by positivity) hat + have hpow : (d : ℝ) / r.exponent.toReal = (d : ℝ) / q.exponent.toReal + 1 := by + have hrpos : 0 < r.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans r.one_lt)) r.lt_top.ne + have hqpos : 0 < q.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + field_simp [hrpos.ne', hqpos.ne'] at hqr ⊢ + linarith + have har : ar = aq * a := by + dsimp [ar, aq] + rw [hpow, ENNReal.rpow_add _ _ ha0 hat] + norm_num + have hinv : ENNReal.ofReal (cubeScaleFactor Q)⁻¹ = a⁻¹ := + ENNReal.ofReal_inv_of_pos hscale + rw [eLpNorm_rawCube_eq_scale_mul_normalized Q q] at hraw + simp_rw [eLpNorm_rawCube_eq_scale_mul_normalized Q r] at hraw + rw [hinv] at hraw + change aq * MeasureTheory.eLpNorm v.toFun q.exponent (normalizedCubeMeasure Q) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin d, ar * MeasureTheory.eLpNorm (fun x => v.grad x j) r.exponent + (normalizedCubeMeasure Q)) + a⁻¹ * + (ar * MeasureTheory.eLpNorm v.toFun r.exponent (normalizedCubeMeasure Q))) at hraw + rw [har] at hraw + apply (ENNReal.mul_le_mul_iff_right haq0 haqtop).mp + calc + aq * MeasureTheory.eLpNorm v.toFun q.exponent (normalizedCubeMeasure Q) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin d, aq * a * MeasureTheory.eLpNorm (fun x => v.grad x j) + r.exponent (normalizedCubeMeasure Q)) + + a⁻¹ * (aq * a) * MeasureTheory.eLpNorm v.toFun r.exponent + (normalizedCubeMeasure Q)) := by + simpa [a, aq, ar, mul_assoc] using hraw + _ = aq * ((C : ℝ≥0∞) * + (a * ∑ j : Fin d, MeasureTheory.eLpNorm (fun x => v.grad x j) r.exponent + (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm v.toFun r.exponent (normalizedCubeMeasure Q))) := by + have hcancel : a⁻¹ * (aq * a) = aq := by + calc + a⁻¹ * (aq * a) = aq * (a⁻¹ * a) := by ring + _ = aq := by rw [ENNReal.inv_mul_cancel ha0 hat, mul_one] + rw [hcancel, ← Finset.mul_sum] + ring + +private theorem raw_eLpNorm_two_toReal_eq_scale_pow_mul_cubeLpNorm {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f 2 (normalizedCubeMeasure Q)) : + (MeasureTheory.eLpNorm f 2 (volumeMeasureOn (openCubeSet Q))).toReal = + (cubeScaleFactor Q) ^ ((d : ℝ) / 2) * cubeLpNorm Q 2 f := by + have hraw := eLpNorm_rawCube_eq_scale_mul_normalized Q FiniteLpExponent.two f + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have htop : ENNReal.ofReal (cubeScaleFactor Q) ^ ((d : ℝ) / 2) * + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top + (ENNReal.rpow_ne_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top) + hf.eLpNorm_ne_top + have hreal := congrArg ENNReal.toReal hraw + rw [ENNReal.toReal_mul, ← ENNReal.toReal_rpow, + ENNReal.toReal_ofReal hscale.le] at hreal + simpa [cubeLpNorm] using hreal + +private theorem hessianCoordL2NormSum_eq_sum_raw_eLpNorm {d : ℕ} + {U : Set (Vec d)} {u : H1Function U} (H : HasWeakHessianOn U u) : + H.hessianCoordL2NormSum = + ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn U)).toReal := by + unfold HasWeakHessianOn.hessianCoordL2NormSum + apply Finset.sum_congr rfl + intro i _ + apply Finset.sum_congr rfl + intro j _ + simp [HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp] + +/-- Lift an inequality between real realizations of finite extended norms back +to `ℝ≥0∞`. All finiteness is explicit, so the induction carrier never turns +an extended-norm comparison into an implicit integrability hypothesis. -/ +private theorem ennreal_le_of_toReal_le {a b : ℝ≥0∞} + (ha : a ≠ ∞) (hb : b ≠ ∞) (h : a.toReal ≤ b.toReal) : a ≤ b := + (ENNReal.toReal_le_toReal ha hb).mp h + +private theorem centralChild_normalized_hessian_energy_bound {d : ℕ} : + ∃ A : ℝ, 0 < A ∧ + ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.toFun = u.toFun ∧ uS.grad = u.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS, + cubeScaleFactor (centralChild Q) * + ∑ i : Fin d, ∑ j : Fin d, + cubeLpNorm (centralChild Q) 2 (fun x => H.hess i j x) ≤ + A * ∑ j : Fin d, cubeLpNorm Q 2 (fun x => u.grad x j) := by + obtain ⟨A, hApos, hA⟩ := exists_harmonic_innerHalf_hessian_energy_bound d + let B : ℝ := A * (3 : ℝ) ^ ((d : ℝ) / 2 - 1) + refine ⟨B, mul_pos hApos (Real.rpow_pos_of_pos (by norm_num) _), ?_⟩ + intro Q u h + obtain ⟨uS, huval, hugrad, H, hH⟩ := hA Q u h + refine ⟨uS, huval, hugrad, H, ?_⟩ + let P : TriadicCube d := centralChild Q + let S : ℝ := ∑ i : Fin d, ∑ j : Fin d, cubeLpNorm P 2 (fun x => H.hess i j x) + let T : ℝ := ∑ j : Fin d, cubeLpNorm Q 2 (fun x => u.grad x j) + have hPsub : openCubeSet P ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := + (openCubeSet_subset_cubeSet P).trans (by simpa [P] using + centralChild_cubeSet_subset_scaledOpenInnerHalf Q) + have hrawrow : ∀ i j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn (openCubeSet P))).toReal ≤ + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal := by + intro i j + apply ENNReal.toReal_mono (H.hess_memL2 i j).eLpNorm_ne_top + exact MeasureTheory.eLpNorm_mono_measure _ + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hPsub) + have hrawsum : ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn (openCubeSet P))).toReal ≤ + H.hessianCoordL2NormSum := by + calc + _ ≤ ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal := + Finset.sum_le_sum fun i _ => Finset.sum_le_sum fun j _ => hrawrow i j + _ = _ := (hessianCoordL2NormSum_eq_sum_raw_eLpNorm H).symm + have hPmem : ∀ i j : Fin d, + MeasureTheory.MemLp (fun x => H.hess i j x) 2 (normalizedCubeMeasure P) := by + intro i j + exact memL2On_openCubeSet_normalizedCubeMeasure + ((H.restrict (isOpen_openCubeSet P) hPsub).hess_memL2 i j) + have hQmem : ∀ j : Fin d, + MeasureTheory.MemLp (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + intro j + exact u.grad_memL2_normalizedCubeMeasure j + have hrawP : (cubeScaleFactor P) ^ ((d : ℝ) / 2) * S ≤ H.hessianCoordL2NormSum := by + calc + (cubeScaleFactor P) ^ ((d : ℝ) / 2) * S = + ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (openCubeSet P))).toReal := by + dsimp [S] + rw [Finset.mul_sum] + simp_rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro i _ + apply Finset.sum_congr rfl + intro j _ + exact (raw_eLpNorm_two_toReal_eq_scale_pow_mul_cubeLpNorm P _ (hPmem i j)).symm + _ ≤ _ := hrawsum + have hrawQ : u.gradientCoordL2NormSum = (cubeScaleFactor Q) ^ ((d : ℝ) / 2) * T := by + rw [gradientCoordL2NormSum_eq_sum_eLpNorm] + dsimp [T] + calc + _ = ∑ j : Fin d, (cubeScaleFactor Q) ^ ((d : ℝ) / 2) * + cubeLpNorm Q 2 (fun x => u.grad x j) := by + apply Finset.sum_congr rfl + intro j _ + exact raw_eLpNorm_two_toReal_eq_scale_pow_mul_cubeLpNorm Q _ (hQmem j) + _ = _ := by rw [Finset.mul_sum] + have hscaleP : cubeScaleFactor P = cubeScaleFactor Q / 3 := by + simpa [P] using! cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hscaleQpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hscalePpos : 0 < cubeScaleFactor P := by rw [hscaleP]; positivity + have hpower : cubeScaleFactor P = + (cubeScaleFactor P) ^ ((d : ℝ) / 2) * + (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2) := by + rw [← Real.rpow_add hscalePpos] + norm_num + have hratio : (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2) = + (cubeScaleFactor Q) ^ (1 - (d : ℝ) / 2) * + (3 : ℝ) ^ ((d : ℝ) / 2 - 1) := by + rw [hscaleP, Real.div_rpow hscaleQpos.le (by norm_num : 0 ≤ (3 : ℝ))] + rw [div_eq_mul_inv, ← Real.rpow_neg (by norm_num : 0 ≤ (3 : ℝ))] + congr 1 + ring_nf + calc + cubeScaleFactor (centralChild Q) * ∑ i : Fin d, ∑ j : Fin d, + cubeLpNorm (centralChild Q) 2 (fun x => H.hess i j x) = cubeScaleFactor P * S := by rfl + _ = (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2) * + ((cubeScaleFactor P) ^ ((d : ℝ) / 2) * S) := by + calc + cubeScaleFactor P * S = + ((cubeScaleFactor P) ^ ((d : ℝ) / 2) * + (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2)) * S := by rw [← hpower] + _ = _ := by ring + _ ≤ (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2) * H.hessianCoordL2NormSum := by + gcongr + _ ≤ (cubeScaleFactor P) ^ (1 - (d : ℝ) / 2) * + (A * (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum) := by + gcongr + _ = B * T := by + rw [hratio, hrawQ] + dsimp [B] + have hqpower : (cubeScaleFactor Q) ^ (1 - (d : ℝ) / 2) * + (cubeScaleFactor Q) ^ ((d : ℝ) / 2) = cubeScaleFactor Q := by + rw [← Real.rpow_add hscaleQpos] + norm_num + calc + _ = A * (3 : ℝ) ^ ((d : ℝ) / 2 - 1) * + ((cubeScaleFactor Q) ^ (1 - (d : ℝ) / 2) * + (cubeScaleFactor Q) ^ ((d : ℝ) / 2) * (cubeScaleFactor Q)⁻¹) * T := by ring + _ = _ := by rw [hqpower, mul_inv_cancel₀ hscaleQpos.ne', mul_one] + +private theorem centralChild_normalized_hessian_energy_bound_ennreal {d : ℕ} : + ∃ A : ℝ≥0∞, 0 < A ∧ A ≠ ∞ ∧ + ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.toFun = u.toFun ∧ uS.grad = u.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS, + ENNReal.ofReal (cubeScaleFactor (centralChild Q)) * + ∑ i : Fin d, ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure (centralChild Q)) ≤ + A * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + obtain ⟨A, hApos, hA⟩ := centralChild_normalized_hessian_energy_bound (d := d) + refine ⟨ENNReal.ofReal A, ENNReal.ofReal_pos.mpr hApos, ENNReal.ofReal_ne_top, ?_⟩ + intro Q u h + obtain ⟨uS, huval, hugrad, H, hH⟩ := hA Q u h + refine ⟨uS, huval, hugrad, H, ?_⟩ + let P : TriadicCube d := centralChild Q + let L : ℝ≥0∞ := ∑ i : Fin d, ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (normalizedCubeMeasure P) + let R : ℝ≥0∞ := ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) + have hLrowtop : ∀ i : Fin d, + (∑ j : Fin d, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure P)) ≠ ∞ := fun i => ENNReal.sum_ne_top.2 fun j _ => + (memL2On_openCubeSet_normalizedCubeMeasure + ((H.restrict (isOpen_openCubeSet P) + ((openCubeSet_subset_cubeSet P).trans (by simpa [P] using + centralChild_cubeSet_subset_scaledOpenInnerHalf Q))).hess_memL2 i j)).eLpNorm_ne_top + have hLtop : L ≠ ∞ := ENNReal.sum_ne_top.2 fun i _ => hLrowtop i + have hRtop : R ≠ ∞ := ENNReal.sum_ne_top.2 fun j _ => + (u.grad_memL2_normalizedCubeMeasure j).eLpNorm_ne_top + have hlefttop : ENNReal.ofReal (cubeScaleFactor P) * L ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hLtop + have hrighttop : ENNReal.ofReal A * R ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hRtop + have hLtoReal : L.toReal = ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (normalizedCubeMeasure P)).toReal := by + dsimp [L] + rw [ENNReal.toReal_sum (fun i _ => hLrowtop i)] + apply Finset.sum_congr rfl + intro i _ + rw [ENNReal.toReal_sum] + intro j _ + exact (memL2On_openCubeSet_normalizedCubeMeasure + ((H.restrict (isOpen_openCubeSet P) + ((openCubeSet_subset_cubeSet P).trans (by simpa [P] using + centralChild_cubeSet_subset_scaledOpenInnerHalf Q))).hess_memL2 i j)).eLpNorm_ne_top + have hRtoReal : R.toReal = ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q)).toReal := by + dsimp [R] + rw [ENNReal.toReal_sum] + intro j _ + exact (u.grad_memL2_normalizedCubeMeasure j).eLpNorm_ne_top + apply ennreal_le_of_toReal_le hlefttop hrighttop + rw [ENNReal.toReal_mul, ENNReal.toReal_ofReal (by + simpa [cubeScaleFactor] using le_of_lt (zpow_pos (by norm_num : (0 : ℝ) < 3) P.scale)), + hLtoReal, ENNReal.toReal_mul, ENNReal.toReal_ofReal hApos.le, hRtoReal] + simpa [P, cubeLpNorm] using hH + +private theorem centralDescendant_scaleFactor_le {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + ENNReal.ofReal (cubeScaleFactor (centralDescendant Q n)) ≤ + ENNReal.ofReal (cubeScaleFactor Q) := by + rw [centralDescendant_cubeScaleFactor] + apply ENNReal.ofReal_le_ofReal + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + apply div_le_self hscale.le + exact one_le_pow₀ (by norm_num : (1 : ℝ) ≤ 3) + +private theorem sum_fin_le_natCast_mul {d : ℕ} (f : Fin d → ℝ≥0∞) (A : ℝ≥0∞) + (h : ∀ i, f i ≤ A) : + ∑ i : Fin d, f i ≤ (d : ℝ≥0∞) * A := by + calc + ∑ i : Fin d, f i ≤ ∑ _i : Fin d, A := + Finset.sum_le_sum fun i _ => h i + _ = _ := by simp + +private theorem row_sum_le_double_sum {d : ℕ} (f : Fin d → Fin d → ℝ≥0∞) (i : Fin d) : + (∑ j : Fin d, f i j) ≤ ∑ k : Fin d, ∑ j : Fin d, f k j := by + exact Finset.single_le_sum + (fun k _ => (zero_le : (0 : ℝ≥0∞) ≤ ∑ j : Fin d, f k j)) + (Finset.mem_univ i) + +private noncomputable def hessianGradCoordToW1p {d : ℕ} {U : Set (Vec d)} + {u : H1Function U} (H : HasWeakHessianOn U u) (i : Fin d) (p : FiniteLpExponent) + (hvalue : MeasureTheory.MemLp (fun x => u.grad x i) p.exponent + (MeasureTheory.volume.restrict U)) + (hgrad : ∀ j : Fin d, MeasureTheory.MemLp (fun x => H.hess i j x) p.exponent + (MeasureTheory.volume.restrict U)) : + W1pFunction U p.exponent := + { toFun := fun x => u.grad x i + grad := fun x j => H.hess i j x + memLp := hvalue + gradMemLp := hgrad + hasWeakGradient := (H.gradCoordH1Function i).hasWeakGradient } + +/-- The exact depth identity used in the derivative branch of the gain +upgrade. -/ +private theorem centralDescendant_after_centralChild {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + centralDescendant (centralChild Q) n = centralDescendant Q (n + 1) := + centralDescendant_centralChild Q n + +private theorem HarmonicGradientGain.restrict_one_more {d : ℕ} {r : FiniteLpExponent} + {depth : ℕ} (G : HarmonicGradientGain d r depth) + (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) (i : Fin d) : + MeasureTheory.MemLp (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure (centralDescendant Q (depth + 1))) := by + have hmem := memLp_centralDescendant_of_memLp (Q := centralDescendant Q depth) 1 + (G.memLp Q u h i) + simpa [centralDescendant_succ] using hmem + +/-- One source-faithful Sobolev step in the internal harmonic-gradient +iteration. The derivative harmonicity and Hessian witness are both produced +inside the proof; callers supply only the preceding gain carrier. -/ +noncomputable def HarmonicGradientGain.upgrade {d : ℕ} (hd : 0 < d) + {r q : FiniteLpExponent} (hqr : (q.exponent.toReal)⁻¹ = + r.exponent.toReal⁻¹ - (d : ℝ)⁻¹) (hrlt : r.exponent.toReal < d) + {depth : ℕ} (G : HarmonicGradientGain d r depth) : + HarmonicGradientGain d q (depth + 1) := by + let C : ℝ≥0∞ := Classical.choose + (normalized_cubeSobolevEmbedding_finiteLp hd r q hqr hrlt) + have hCspec := Classical.choose_spec + (normalized_cubeSobolevEmbedding_finiteLp hd r q hqr hrlt) + have hCpos : 0 < C := hCspec.1 + have hCtop : C ≠ ∞ := hCspec.2.1 + have hC := hCspec.2.2 + let A : ℝ≥0∞ := Classical.choose + (centralChild_normalized_hessian_energy_bound_ennreal (d := d)) + have hAspec := Classical.choose_spec + (centralChild_normalized_hessian_energy_bound_ennreal (d := d)) + have hApos : 0 < A := hAspec.1 + have hAtop : A ≠ ∞ := hAspec.2.1 + have hA := hAspec.2.2 + let N : ℝ≥0∞ := ENNReal.ofReal ((3 ^ d : ℕ) : ℝ) + let K : ℝ≥0∞ := C * ((d : ℝ≥0∞) * G.fixedValue * A + N * G.fixedValue) + have hdpos : 0 < (d : ℝ≥0∞) := by exact_mod_cast hd + have hNtop : N ≠ ∞ := by simp [N] + have hKpos : 0 < K := by + dsimp [K] + rw [ENNReal.mul_pos_iff] + refine ⟨hCpos, lt_of_lt_of_le ?_ (le_add_of_nonneg_right (zero_le))⟩ + rw [ENNReal.mul_pos_iff, ENNReal.mul_pos_iff] + exact ⟨⟨hdpos, G.constant_pos⟩, hApos⟩ + have hKtop : K ≠ ∞ := by + dsimp [K] + apply ENNReal.mul_ne_top hCtop + rw [ENNReal.add_ne_top] + exact ⟨ENNReal.mul_ne_top (ENNReal.mul_ne_top ENNReal.coe_ne_top G.constant_ne_top) hAtop, + ENNReal.mul_ne_top hNtop G.constant_ne_top⟩ + have hpoint : ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x i) q.exponent + (normalizedCubeMeasure (centralDescendant Q (depth + 1))) ≤ + K * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + intro Q u h i + let P : TriadicCube d := centralChild Q + let D : TriadicCube d := centralDescendant Q (depth + 1) + let R : ℝ≥0∞ := ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) + have hSopen : IsOpen (scaledOpenCubeSet Q (1 / 2 : ℝ)) := + isOpen_scaledOpenCubeSet Q _ + have hSQ : scaledOpenCubeSet Q (1 / 2 : ℝ) ⊆ openCubeSet Q := by + exact (scaledOpenCubeSet_subset_scaledClosedCubeSet Q _).trans + (scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q + (by norm_num) (by norm_num)) + have hPopen : IsOpen (openCubeSet P) := isOpen_openCubeSet P + have hPS : openCubeSet P ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := + (openCubeSet_subset_cubeSet P).trans (by simpa [P] using + centralChild_cubeSet_subset_scaledOpenInnerHalf Q) + have hDopen : IsOpen (openCubeSet D) := isOpen_openCubeSet D + have hDP : openCubeSet D ⊆ openCubeSet P := by + have hdesc := centralDescendant_openCubeSet_subset P depth + simpa [P, D, centralDescendant_after_centralChild] using hdesc + obtain ⟨uS, huval, hugrad, H, henergy⟩ := hA Q u h + have huS : uS = u.restrict hSopen hSQ := by + apply H1Function.ext + · simpa [H1Function.restrict] using huval + · simpa [H1Function.restrict] using hugrad + subst uS + let HP := H.restrict hPopen hPS + let v := HP.gradCoordH1Function i + have hS : WeakPoissonEquationOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) + (u.restrict hSopen hSQ) (fun _ => 0) := h.restrict hSopen hSQ + have hvS : WeakPoissonEquationOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) + (H.gradCoordH1Function i) (fun _ => 0) := + hS.gradCoordH1Function_harmonic hSopen H i + have hv_eq : v = (H.gradCoordH1Function i).restrict hPopen hPS := by + apply H1Function.ext <;> rfl + have hv : WeakPoissonEquationOn (openCubeSet P) v (fun _ => 0) := by + rw [hv_eq] + exact hvS.restrict hPopen hPS + let HD := HP.restrict hDopen hDP + have hD_eq : centralDescendant P depth = D := by + simpa [P, D] using centralDescendant_after_centralChild Q depth + have hsource : MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure D) ≤ N * G.fixedValue * R := by + calc + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure D) = + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure (centralDescendant (centralDescendant Q depth) 1)) := by + simp [D, centralDescendant_succ] + _ ≤ N * MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure (centralDescendant Q depth)) := by + simpa [N] using eLpNorm_centralDescendant_le_descendantCount_mul + (centralDescendant Q depth) 1 r (fun x => u.grad x i) + _ ≤ N * (G.fixedValue * R) := by + gcongr + simpa [R] using G.bound Q u h i + _ = N * G.fixedValue * R := by ring + have hgrad : ∀ j : Fin d, + MeasureTheory.eLpNorm (fun x => HD.hess i j x) r.exponent + (normalizedCubeMeasure D) ≤ + G.fixedValue * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P) := by + intro j + simpa [HD, v, hD_eq] using! G.bound P v hv j + have hsum : ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => HD.hess i j x) r.exponent + (normalizedCubeMeasure D) ≤ + (d : ℝ≥0∞) * (G.fixedValue * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P)) := + sum_fin_le_natCast_mul _ _ hgrad + have hrow : ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P) ≤ + ∑ a : Fin d, ∑ b : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess a b x) 2 + (normalizedCubeMeasure P) := + row_sum_le_double_sum (fun a b => MeasureTheory.eLpNorm + (fun x => HP.hess a b x) 2 (normalizedCubeMeasure P)) i + have hscale : ENNReal.ofReal (cubeScaleFactor D) ≤ + ENNReal.ofReal (cubeScaleFactor P) := by + rw [← hD_eq] + exact centralDescendant_scaleFactor_le P depth + have henergy' : ENNReal.ofReal (cubeScaleFactor P) * + ∑ a : Fin d, ∑ b : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess a b x) 2 + (normalizedCubeMeasure P) ≤ A * R := by + simpa [P, HP, R] using! henergy + have hgradient : ENNReal.ofReal (cubeScaleFactor D) * + ∑ j : Fin d, MeasureTheory.eLpNorm (fun x => HD.hess i j x) r.exponent + (normalizedCubeMeasure D) ≤ + (d : ℝ≥0∞) * G.fixedValue * A * R := by + calc + _ ≤ ENNReal.ofReal (cubeScaleFactor D) * + ((d : ℝ≥0∞) * (G.fixedValue * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P))) := by gcongr + _ = (d : ℝ≥0∞) * G.fixedValue * + (ENNReal.ofReal (cubeScaleFactor D) * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P)) := by ring + _ ≤ (d : ℝ≥0∞) * G.fixedValue * + (ENNReal.ofReal (cubeScaleFactor P) * ∑ a : Fin d, ∑ b : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess a b x) 2 + (normalizedCubeMeasure P)) := by + apply mul_le_mul_right + calc + ENNReal.ofReal (cubeScaleFactor D) * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P) ≤ + ENNReal.ofReal (cubeScaleFactor P) * ∑ k : Fin d, + MeasureTheory.eLpNorm (fun x => HP.hess i k x) 2 + (normalizedCubeMeasure P) := mul_le_mul_left hscale _ + _ ≤ _ := mul_le_mul_right hrow _ + + _ ≤ (d : ℝ≥0∞) * G.fixedValue * (A * R) := + mul_le_mul_right henergy' _ + _ = _ := by ring + let w : W1pFunction (openCubeSet D) r.exponent := hessianGradCoordToW1p HD i r + (memLpOn_openCubeSet_of_memLp_normalizedCubeMeasure D (by + simpa [HD, HP, H1Function.restrict] using! G.restrict_one_more Q u h i)) + (fun j => memLpOn_openCubeSet_of_memLp_normalizedCubeMeasure D (by + simpa [HD, v, hD_eq] using! G.memLp P v hv j)) + have hsob := hC D w + have hsob' : MeasureTheory.eLpNorm (fun x => u.grad x i) q.exponent + (normalizedCubeMeasure D) ≤ C * + (ENNReal.ofReal (cubeScaleFactor D) * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => HD.hess i j x) r.exponent + (normalizedCubeMeasure D) + + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure D)) := by + simpa [w, hessianGradCoordToW1p, HD, H1Function.restrict] using hsob + calc + MeasureTheory.eLpNorm (fun x => u.grad x i) q.exponent + (normalizedCubeMeasure (centralDescendant Q (depth + 1))) = + MeasureTheory.eLpNorm (fun x => u.grad x i) q.exponent + (normalizedCubeMeasure D) := by rfl + _ ≤ C * ((d : ℝ≥0∞) * G.fixedValue * A * R + N * G.fixedValue * R) := by + calc + _ ≤ C * (ENNReal.ofReal (cubeScaleFactor D) * ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => HD.hess i j x) r.exponent + (normalizedCubeMeasure D) + + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure D)) := hsob' + _ ≤ _ := by gcongr + _ = K * R := by simp [K]; ring + refine ⟨K, hKpos, hKtop, ?_, hpoint⟩ + intro Q u h i + refine ⟨(G.restrict_one_more Q u h i).aestronglyMeasurable, ?_⟩ + apply lt_of_le_of_lt (hpoint Q u h i) + exact lt_top_iff_ne_top.mpr (ENNReal.mul_ne_top hKtop + ((ENNReal.sum_ne_top).2 fun j _ => + (u.grad_memL2_normalizedCubeMeasure j).eLpNorm_ne_top)) + +/-- Lowering the exponent on a probability-normalized cube preserves an +internal gain carrier without changing its analytic constant. -/ +noncomputable def HarmonicGradientGain.downgrade {d : ℕ} {r s : FiniteLpExponent} + {depth : ℕ} (G : HarmonicGradientGain d r depth) (hsr : s.exponent ≤ r.exponent) : + HarmonicGradientGain d s depth := by + refine ⟨G.fixedValue, G.constant_pos, G.constant_ne_top, ?_, ?_⟩ + · intro Q u h i + let : MeasureTheory.IsProbabilityMeasure + (normalizedCubeMeasure (centralDescendant Q depth)) := + ⟨normalizedCubeMeasure_apply_univ _⟩ + refine ⟨(G.memLp Q u h i).aestronglyMeasurable, ?_⟩ + apply lt_of_le_of_lt + (MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le hsr + (G.memLp Q u h i).aestronglyMeasurable) + exact lt_of_le_of_lt (G.bound Q u h i) + (lt_top_iff_ne_top.mpr (ENNReal.mul_ne_top G.constant_ne_top + ((ENNReal.sum_ne_top).2 fun j _ => + (u.grad_memL2_normalizedCubeMeasure j).eLpNorm_ne_top))) + · intro Q u h i + let : MeasureTheory.IsProbabilityMeasure + (normalizedCubeMeasure (centralDescendant Q depth)) := + ⟨normalizedCubeMeasure_apply_univ _⟩ + exact (MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le hsr + (G.memLp Q u h i).aestronglyMeasurable).trans (G.bound Q u h i) + +/-- The explicit finite Sobolev ladder used above the `L²` base. The side +condition is precisely the positivity of its denominator. -/ +private noncomputable def sobolevLadderExponent (d : ℕ) (hd : 2 ≤ d) + (n : ℕ) (hn : 2 * n < d) : + FiniteLpExponent where + exponent := ENNReal.ofReal (2 * (d : ℝ) / ((d : ℝ) - 2 * n)) + one_lt := by + rw [ENNReal.one_lt_ofReal] + have hn' : (2 * n : ℝ) < d := by exact_mod_cast hn + have hden : 0 < (d : ℝ) - 2 * n := by linarith + have hd' : 2 ≤ (d : ℝ) := by exact_mod_cast hd + rw [lt_div_iff₀ hden] + nlinarith + lt_top := ENNReal.ofReal_lt_top + +private theorem sobolevLadderExponent_toReal (d : ℕ) (hd : 2 ≤ d) + (n : ℕ) (hn : 2 * n < d) : + (sobolevLadderExponent d hd n hn).exponent.toReal = + 2 * (d : ℝ) / ((d : ℝ) - 2 * n) := by + have hn' : (2 * n : ℝ) < d := by exact_mod_cast hn + have hden : 0 ≤ (d : ℝ) - 2 * n := by linarith + have hnum : 0 ≤ 2 * (d : ℝ) := mul_nonneg (by norm_num) (Nat.cast_nonneg _) + simp [sobolevLadderExponent, ENNReal.toReal_ofReal + (div_nonneg hnum hden)] + +private theorem sobolevLadderExponent_step_relation (d : ℕ) (hd : 2 ≤ d) + (n : ℕ) (hn : 2 * (n + 1) < d) : + (sobolevLadderExponent d hd (n + 1) hn).exponent.toReal⁻¹ = + (sobolevLadderExponent d hd n (by omega)).exponent.toReal⁻¹ - (d : ℝ)⁻¹ := by + rw [sobolevLadderExponent_toReal, sobolevLadderExponent_toReal] + have hd' : 0 < (d : ℝ) := by exact_mod_cast (lt_of_le_of_lt (Nat.zero_le _) hn) + have hn0 : 0 < (d : ℝ) - 2 * n := by + have hn' : (2 * (n + 1) : ℝ) < d := by exact_mod_cast hn + linarith + have hn1 : 0 < (d : ℝ) - 2 * (n + 1) := by + have hn' : (2 * (n + 1) : ℝ) < d := by exact_mod_cast hn + linarith + field_simp [hd'.ne', hn0.ne', hn1.ne'] + norm_num [Nat.cast_add, Nat.cast_one] + ring + +private theorem sobolevLadderExponent_lt_dimension (d : ℕ) (hd : 2 ≤ d) + (n : ℕ) (hn : 2 * (n + 1) < d) : + (sobolevLadderExponent d hd n (by omega)).exponent.toReal < d := by + rw [sobolevLadderExponent_toReal] + have hd' : 0 < (d : ℝ) := by exact_mod_cast (lt_of_le_of_lt (Nat.zero_le _) hn) + have hn' : (2 * (n + 1) : ℝ) < d := by exact_mod_cast hn + have hden : 0 < (d : ℝ) - 2 * n := by linarith + rw [div_lt_iff₀ hden] + nlinarith + +private theorem finiteLpExponent_eq {p q : FiniteLpExponent} + (h : p.exponent = q.exponent) : p = q := by + cases p + cases q + simp_all + +private theorem sobolevLadderExponent_zero (d : ℕ) (hd : 2 ≤ d) : + sobolevLadderExponent d hd 0 (by omega) = FiniteLpExponent.two := by + apply finiteLpExponent_eq + have hd' : 0 < (d : ℝ) := by exact_mod_cast (lt_of_lt_of_le (by norm_num) hd) + simp [sobolevLadderExponent, hd'.ne'] + +private noncomputable def harmonicGradientGain_ladder (d : ℕ) (hd : 3 ≤ d) : + ∀ (n : ℕ) (hn : 2 * n < d), + HarmonicGradientGain d (sobolevLadderExponent d (by omega) n hn) n + | 0, hn => by + rw [sobolevLadderExponent_zero d (by omega)] + exact harmonicGradientGain_two_zero d + | n + 1, hn => by + exact HarmonicGradientGain.upgrade (by omega) + (sobolevLadderExponent_step_relation d (by omega) n hn) + (sobolevLadderExponent_lt_dimension d (by omega) n hn) + (harmonicGradientGain_ladder d hd n (by omega)) + +private theorem terminalLadderDepth_twice_lt (d : ℕ) (hd : 3 ≤ d) : + 2 * ((d - 1) / 2) < d := by omega + +private theorem terminalLadderExponent_ge_dimension (d : ℕ) (hd : 3 ≤ d) : + (d : ℝ) ≤ (sobolevLadderExponent d (by omega) ((d - 1) / 2) + (terminalLadderDepth_twice_lt d hd)).exponent.toReal := by + rw [sobolevLadderExponent_toReal] + let N : ℕ := (d - 1) / 2 + have hden : 0 < (d : ℝ) - ((2 * N : ℕ) : ℝ) := by + have hNat : 2 * ((d - 1) / 2) < d := terminalLadderDepth_twice_lt d hd + have hNat' : ((2 * ((d - 1) / 2) : ℕ) : ℝ) < (d : ℝ) := by + exact_mod_cast hNat + norm_num only [Nat.cast_mul, Nat.cast_ofNat] at hNat' + simpa [N] using sub_pos.mpr hNat' + change (d : ℝ) ≤ (2 * (d : ℝ)) / ((d : ℝ) - 2 * (N : ℝ)) + norm_num only [Nat.cast_mul, Nat.cast_ofNat] at hden + apply (le_div_iff₀ hden).2 + have hNat : d ≤ 2 * ((d - 1) / 2) + 2 := by omega + have hNat' : (d : ℝ) ≤ ((2 * ((d - 1) / 2) + 2 : ℕ) : ℝ) := by + exact_mod_cast hNat + norm_num only [Nat.cast_add, Nat.cast_mul, Nat.cast_ofNat] at hNat' + change (d : ℝ) * ((d : ℝ) - 2 * (N : ℝ)) ≤ 2 * (d : ℝ) + simp only [N] at hden ⊢ + nlinarith + +private noncomputable def targetSobolevSourceExponent (d : ℕ) (hd2 : 2 ≤ d) (q : FiniteLpExponent) + (hq : (2 : ℝ) < q.exponent.toReal) : FiniteLpExponent where + exponent := ENNReal.ofReal ((d : ℝ) * q.exponent.toReal / + ((d : ℝ) + q.exponent.toReal)) + one_lt := by + rw [ENNReal.one_lt_ofReal] + have hd : 2 ≤ (d : ℝ) := by exact_mod_cast hd2 + have hq' : 0 < q.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + have hden : 0 < (d : ℝ) + q.exponent.toReal := by positivity + rw [lt_div_iff₀ hden] + nlinarith + lt_top := ENNReal.ofReal_lt_top + +private theorem targetSobolevSourceExponent_toReal (d : ℕ) (hd2 : 2 ≤ d) (q : FiniteLpExponent) + (hq : (2 : ℝ) < q.exponent.toReal) : + (targetSobolevSourceExponent d hd2 q hq).exponent.toReal = + (d : ℝ) * q.exponent.toReal / ((d : ℝ) + q.exponent.toReal) := by + have hd : 0 ≤ (d : ℝ) := Nat.cast_nonneg _ + have hq' : 0 ≤ q.exponent.toReal := ENNReal.toReal_nonneg + simp [targetSobolevSourceExponent, ENNReal.toReal_ofReal + (div_nonneg (mul_nonneg hd hq') (add_nonneg hd hq'))] + +private theorem targetSobolevSourceExponent_lt_dimension (d : ℕ) (hd2 : 2 ≤ d) + (q : FiniteLpExponent) + (hq : (2 : ℝ) < q.exponent.toReal) : + (targetSobolevSourceExponent d hd2 q hq).exponent.toReal < d := by + rw [targetSobolevSourceExponent_toReal] + have hd : 0 < (d : ℝ) := by exact_mod_cast (lt_of_lt_of_le (by norm_num) hd2) + have hq' : 0 < q.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + have hden : 0 < (d : ℝ) + q.exponent.toReal := by positivity + rw [div_lt_iff₀ hden] + nlinarith + +private theorem targetSobolevSourceExponent_relation (d : ℕ) (hd2 : 2 ≤ d) + (q : FiniteLpExponent) + (hq : (2 : ℝ) < q.exponent.toReal) : + q.exponent.toReal⁻¹ = (targetSobolevSourceExponent d hd2 q hq).exponent.toReal⁻¹ - + (d : ℝ)⁻¹ := by + rw [targetSobolevSourceExponent_toReal] + have hd : 0 < (d : ℝ) := by exact_mod_cast (lt_of_lt_of_le (by norm_num) hd2) + have hq' : 0 < q.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + have hden : 0 < (d : ℝ) + q.exponent.toReal := by positivity + field_simp [hd.ne', hq'.ne', hden.ne'] + ring + +private theorem targetSobolevSourceExponent_le_two_twoDim (q : FiniteLpExponent) + (hq : (2 : ℝ) < q.exponent.toReal) : + (targetSobolevSourceExponent 2 (by norm_num) q hq).exponent ≤ 2 := by + apply (ENNReal.toReal_le_toReal + (targetSobolevSourceExponent 2 (by norm_num) q hq).lt_top.ne (by norm_num)).mp + rw [targetSobolevSourceExponent_toReal] + have hq' : 0 < q.exponent.toReal := ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + have hden : 0 < (2 : ℝ) + q.exponent.toReal := by positivity + norm_num + rw [div_le_iff₀ hden] + nlinarith + +/-- In dimension two, one final finite Sobolev step from the downgraded `L²` +base reaches every target above two. -/ +noncomputable def harmonicGradientGain_finiteTarget_gt_two_twoDim + (q : FiniteLpExponent) (hq2 : 2 < q.exponent) : + HarmonicGradientGain 2 q 1 := by + have hq : (2 : ℝ) < q.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).2 hq2 + let r : FiniteLpExponent := targetSobolevSourceExponent 2 (by norm_num) q hq + let Gr : HarmonicGradientGain 2 r 0 := + (harmonicGradientGain_two_zero 2).downgrade + (targetSobolevSourceExponent_le_two_twoDim q hq) + exact HarmonicGradientGain.upgrade (d := 2) (by norm_num) + (targetSobolevSourceExponent_relation 2 (by norm_num) q hq) + (targetSobolevSourceExponent_lt_dimension 2 (by norm_num) q hq) Gr + +noncomputable def harmonicEuclideanGradientGain_finiteTarget_gt_two_twoDim + (q : FiniteLpExponent) (hq2 : 2 < q.exponent) : + HarmonicEuclideanGradientGain 2 q 1 := + HarmonicEuclideanGradientGain.fromScalar + (harmonicGradientGain_finiteTarget_gt_two_twoDim q hq2) + +private theorem targetSobolevSourceExponent_le_terminalLadder (d : ℕ) (hd : 3 ≤ d) + (q : FiniteLpExponent) (hq : (2 : ℝ) < q.exponent.toReal) : + (targetSobolevSourceExponent d (by omega) q hq).exponent ≤ + (sobolevLadderExponent d (by omega) ((d - 1) / 2) + (terminalLadderDepth_twice_lt d hd)).exponent := by + apply (ENNReal.toReal_le_toReal + (targetSobolevSourceExponent d (by omega) q hq).lt_top.ne + (sobolevLadderExponent d (by omega) ((d - 1) / 2) + (terminalLadderDepth_twice_lt d hd)).lt_top.ne).mp + exact (targetSobolevSourceExponent_lt_dimension d (by omega) q hq).le.trans + (terminalLadderExponent_ge_dimension d hd) + +/-- The final Sobolev step from the terminal ladder exponent. -/ +noncomputable def harmonicGradientGain_finiteTarget_gt_two_of_three_le + (d : ℕ) (hd : 3 ≤ d) (q : FiniteLpExponent) (hq2 : 2 < q.exponent) : + HarmonicGradientGain d q (((d - 1) / 2) + 1) := by + let n : ℕ := (d - 1) / 2 + let p : FiniteLpExponent := sobolevLadderExponent d (by omega) n + (terminalLadderDepth_twice_lt d hd) + let G : HarmonicGradientGain d p n := harmonicGradientGain_ladder d hd n + (terminalLadderDepth_twice_lt d hd) + have hq : (2 : ℝ) < q.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).2 hq2 + let r : FiniteLpExponent := targetSobolevSourceExponent d (by omega) q hq + let Gr : HarmonicGradientGain d r n := + G.downgrade (targetSobolevSourceExponent_le_terminalLadder d hd q hq) + simpa [n] using HarmonicGradientGain.upgrade (d := d) (by omega) + (targetSobolevSourceExponent_relation d (by omega) q hq) + (targetSobolevSourceExponent_lt_dimension d (by omega) q hq) Gr + +/-- Every finite target exponent is reached in dimension at least three. -/ +theorem nonempty_harmonicGradientGain_finiteTarget_of_three_le + (d : ℕ) (hd : 3 ≤ d) (q : FiniteLpExponent) : + Nonempty (Σ depth : ℕ, HarmonicGradientGain d q depth) := by + by_cases hq2 : q.exponent ≤ 2 + · exact ⟨⟨0, (harmonicGradientGain_two_zero d).downgrade hq2⟩⟩ + · exact ⟨⟨((d - 1) / 2) + 1, + harmonicGradientGain_finiteTarget_gt_two_of_three_le d hd q (lt_of_not_ge hq2)⟩⟩ + +/-- Vector-facing arbitrary finite target gain in dimensions at least three. +Its membership and bound are in the `HilbertVec.ofVec` representation used by +the stopping-time layer; all coordinate measurability is discharged inside +`fromScalar`. -/ +noncomputable def harmonicEuclideanGradientGain_finiteTarget_gt_two_of_three_le + (d : ℕ) (hd : 3 ≤ d) (q : FiniteLpExponent) (hq2 : 2 < q.exponent) : + HarmonicEuclideanGradientGain d q (((d - 1) / 2) + 1) := + HarmonicEuclideanGradientGain.fromScalar + (harmonicGradientGain_finiteTarget_gt_two_of_three_le d hd q hq2) + +/-- Vector-facing normalized `L^q` gain for every target at or below `L²`. -/ +noncomputable def harmonicEuclideanGradientGain_finiteTarget_le_two + (d : ℕ) (q : FiniteLpExponent) (hq2 : q.exponent ≤ 2) : + HarmonicEuclideanGradientGain d q 0 := + HarmonicEuclideanGradientGain.fromScalar + ((harmonicGradientGain_two_zero d).downgrade hq2) + +/-- Dimension-at-least-two public availability statement for the Euclidean +gain API. It is deliberately `Nonempty Σ` because the depth is analytic data +of the construction, not a hypothesis that callers must provide. -/ +theorem nonempty_harmonicEuclideanGradientGain_finiteTarget_of_two_le + (d : ℕ) (hd : 2 ≤ d) (q : FiniteLpExponent) : + Nonempty (Σ depth : ℕ, HarmonicEuclideanGradientGain d q depth) := by + by_cases hq2 : q.exponent ≤ 2 + · exact ⟨⟨0, harmonicEuclideanGradientGain_finiteTarget_le_two d q hq2⟩⟩ + · by_cases hd2 : d = 2 + · subst d + exact ⟨⟨1, harmonicEuclideanGradientGain_finiteTarget_gt_two_twoDim q + (lt_of_not_ge hq2)⟩⟩ + · have hd3 : 3 ≤ d := by omega + exact ⟨⟨((d - 1) / 2) + 1, + harmonicEuclideanGradientGain_finiteTarget_gt_two_of_three_le d hd3 q + (lt_of_not_ge hq2)⟩⟩ + +/-- One-dimensional finite-target carrier, obtained from the source theorem's +real bound only after the accompanying source-level `MemLp` witness has made +both ENNReal sides finite. -/ +noncomputable def harmonicGradientGain_finiteTarget_oneDim + (p : FiniteLpExponent) : HarmonicGradientGain 1 p 1 := by + let C : ℝ := Classical.choose (exists_harmonic_gradCoord_finiteLp_bound_oneDim p) + have hCspec := Classical.choose_spec (exists_harmonic_gradCoord_finiteLp_bound_oneDim p) + have hCpos : 0 < C := hCspec.1 + have hC := hCspec.2 + refine ⟨ENNReal.ofReal C, ENNReal.ofReal_pos.mpr hCpos, ENNReal.ofReal_ne_top, + ?_, ?_⟩ + · intro Q u h i + fin_cases i + simpa [centralDescendant_succ] using + harmonic_gradCoord_memLp_centralDescendant_oneDim p Q u h + · intro Q u h i + fin_cases i + have hleftmem := harmonic_gradCoord_memLp_centralDescendant_oneDim p Q u h + have hrightmem := u.grad_memL2_normalizedCubeMeasure (0 : Fin 1) + have hreal := hC Q u h + have hscalar : MeasureTheory.eLpNorm (fun x => u.grad x 0) p.exponent + (normalizedCubeMeasure (centralDescendant Q 1)) ≤ + ENNReal.ofReal C * MeasureTheory.eLpNorm (fun x => u.grad x 0) 2 + (normalizedCubeMeasure Q) := by + apply ennreal_le_of_toReal_le hleftmem.eLpNorm_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top hrightmem.eLpNorm_ne_top) + simpa [cubeLpNorm, centralDescendant_succ, ENNReal.toReal_mul, + ENNReal.toReal_ofReal hCpos.le] using! hreal + have hsingle : MeasureTheory.eLpNorm (fun x => u.grad x (0 : Fin 1)) 2 + (normalizedCubeMeasure Q) ≤ ∑ j : Fin 1, + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q) := by + exact (by simpa only using (Finset.single_le_sum + (s := Finset.univ) (f := fun j : Fin 1 => + MeasureTheory.eLpNorm (fun x => u.grad x j) 2 (normalizedCubeMeasure Q)) + (fun j _ => zero_le) (Finset.mem_univ (0 : Fin 1)))) + exact hscalar.trans (mul_le_mul_right hsingle _) + +noncomputable def harmonicEuclideanGradientGain_finiteTarget_oneDim + (p : FiniteLpExponent) : HarmonicEuclideanGradientGain 1 p 1 := + HarmonicEuclideanGradientGain.fromScalar (harmonicGradientGain_finiteTarget_oneDim p) + +/-- All positive dimensions now expose the Euclidean finite-target carrier. +The depth is returned as construction data, not a caller hypothesis. -/ +theorem nonempty_harmonicEuclideanGradientGain_finiteTarget_of_pos + (d : ℕ) (hd : 0 < d) (q : FiniteLpExponent) : + Nonempty (Σ depth : ℕ, HarmonicEuclideanGradientGain d q depth) := by + by_cases hd1 : d = 1 + · subst d + exact ⟨⟨1, harmonicEuclideanGradientGain_finiteTarget_oneDim q⟩⟩ + · exact nonempty_harmonicEuclideanGradientGain_finiteTarget_of_two_le d + (by omega) q + + + + + +end INTERNAL + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientIterationGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientIterationGeometry.lean new file mode 100644 index 0000000000..6b3a9c816b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientIterationGeometry.lean @@ -0,0 +1,221 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.FiniteMeasureDowngrade + +/-! # Harmonic Gradient Iteration Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Central descendants for the harmonic gradient iteration + +This file fixes the ordinary, geometrically central triadic descendants used +to iterate the local harmonic gradient gain. They are deliberately distinct +from `ScalarOverlap.middleChildCube`: the latter is an overlap-indexing cube +whose carrier remains at the parent scale, whereas the cubes here are genuine +members of `childCubes` and hence contract by a factor of three at every step. +-/ + +namespace CubeCalderonZygmund + +/-- The ordinary central triadic child of `Q`. Its all-one digit vector makes +it a genuine member of `childCubes Q`, unlike the overlap-centre construction. -/ +def centralChild {d : ℕ} (Q : TriadicCube d) : TriadicCube d := + { scale := Q.scale - 1 + index := fun i => 3 * Q.index i } + +/-- The repeatedly central depth-`n` descendant used by the CZ iteration. -/ +def centralDescendant {d : ℕ} (Q : TriadicCube d) : ℕ → TriadicCube d + | 0 => Q + | n + 1 => centralChild (centralDescendant Q n) + +@[simp] theorem centralDescendant_zero {d : ℕ} (Q : TriadicCube d) : + centralDescendant Q 0 = Q := + rfl + +@[simp] theorem centralDescendant_succ {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + centralDescendant Q (n + 1) = centralChild (centralDescendant Q n) := + rfl + +@[simp] theorem centralChild_scale {d : ℕ} (Q : TriadicCube d) : + (centralChild Q).scale = Q.scale - 1 := + rfl + +theorem centralChild_mem_childCubes {d : ℕ} (Q : TriadicCube d) : + centralChild Q ∈ childCubes Q := by + simpa [centralChild] using middleChild_mem_childCubes Q + +theorem centralDescendant_mem_descendantsAtDepth {d : ℕ} (Q : TriadicCube d) : + ∀ n : ℕ, centralDescendant Q n ∈ descendantsAtDepth Q n + | 0 => by simp [centralDescendant] + | n + 1 => by + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨centralDescendant Q n, centralDescendant_mem_descendantsAtDepth Q n, + by simpa using centralChild_mem_childCubes (centralDescendant Q n)⟩ + +theorem centralDescendant_scale {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + (centralDescendant Q n).scale = Q.scale - n := + scale_eq_sub_of_mem_descendantsAtDepth (centralDescendant_mem_descendantsAtDepth Q n) + +/-- The index of a central descendant is obtained by multiplying the parent +index by the corresponding triadic power. -/ +theorem centralDescendant_index {d : ℕ} (Q : TriadicCube d) : + ∀ (n : ℕ) (i : Fin d), (centralDescendant Q n).index i = (3 : ℤ) ^ n * Q.index i + | 0, i => by simp [centralDescendant] + | n + 1, i => by + rw [centralDescendant_succ] + change 3 * (centralDescendant Q n).index i = (3 : ℤ) ^ (n + 1) * Q.index i + rw [centralDescendant_index Q n i, pow_succ] + ring + +/-- Central descendants of the unit centered cube are precisely the centered +triadic cubes at the corresponding negative depth. -/ +theorem centralDescendant_originCube_zero_eq_originCube_neg_nat {d : ℕ} (n : ℕ) : + centralDescendant (originCube d 0) n = originCube d (-(n : ℤ)) := by + induction n with + | zero => rfl + | succ n ih => + rw [centralDescendant_succ, ih] + dsimp [centralChild, originCube] + congr + omega + +theorem centralDescendant_cubeScaleFactor {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeScaleFactor (centralDescendant Q n) = cubeScaleFactor Q / (3 : ℝ) ^ n := + cubeScaleFactor_descendant_eq_div_pow (centralDescendant_mem_descendantsAtDepth Q n) + +theorem centralDescendant_cubeVolume_eq {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeVolume Q = ((3 ^ d) ^ n : ℕ) * cubeVolume (centralDescendant Q n) := by + rw [← descendantsAtDepth_card Q n] + exact cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth + (centralDescendant_mem_descendantsAtDepth Q n) + +theorem centralDescendant_cubeVolume_ratio {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeVolume Q / cubeVolume (centralDescendant Q n) = ((3 ^ d) ^ n : ℕ) := by + rw [centralDescendant_cubeVolume_eq] + field_simp [(cubeVolume_pos (centralDescendant Q n)).ne'] + +theorem centralDescendant_cubeSet_subset {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + cubeSet (centralDescendant Q n) ⊆ cubeSet Q := + cubeSet_subset_of_mem_descendantsAtDepth (centralDescendant_mem_descendantsAtDepth Q n) + +theorem centralDescendant_openCubeSet_subset {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + openCubeSet (centralDescendant Q n) ⊆ openCubeSet Q := + openCubeSet_subset_of_mem_descendantsAtDepth (centralDescendant_mem_descendantsAtDepth Q n) + +/-- One central child lies strictly inside the half-sized open cube of its +parent. This is the geometric margin consumed at every harmonic-gain step. -/ +theorem centralChild_cubeSet_subset_scaledOpenInnerHalf {d : ℕ} (Q : TriadicCube d) : + cubeSet (centralChild Q) ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := by + intro x hx i + have hscale : cubeScaleFactor (centralChild Q) = cubeScaleFactor Q / 3 := by + simpa [centralChild] using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hx' := hx i + rw [hscale] at hx' + norm_num [centralChild, Int.cast_mul] at hx' + change |x i - cubeCenter Q i| < (1 / 2 : ℝ) * cubeRadius Q + rw [cubeCenter, cubeRadius, abs_lt] + constructor <;> nlinarith + +/-- The central step at depth `n` lies in the strict inner half of its depth +`n` predecessor, so the harmonic regularity engine can be iterated. -/ +theorem centralDescendant_succ_cubeSet_subset_scaledOpenInnerHalf {d : ℕ} + (Q : TriadicCube d) (n : ℕ) : + cubeSet (centralDescendant Q (n + 1)) ⊆ + scaledOpenCubeSet (centralDescendant Q n) (1 / 2 : ℝ) := by + simpa only [centralDescendant_succ] using + centralChild_cubeSet_subset_scaledOpenInnerHalf (centralDescendant Q n) + +/-- Exact normalized-measure restriction formula for the central descendant. +The factor is the number of ordinary depth-`n` descendants. -/ +theorem normalizedCubeMeasure_centralDescendant_eq_smul_restrict {d : ℕ} + (Q : TriadicCube d) (n : ℕ) : + normalizedCubeMeasure (centralDescendant Q n) = + ENNReal.ofReal (((3 ^ d) ^ n : ℕ) : ℝ) • + (normalizedCubeMeasure Q).restrict (cubeSet (centralDescendant Q n)) := by + rw [normalizedCubeMeasure_descendant_eq_smul_restrict + (centralDescendant_mem_descendantsAtDepth Q n), centralDescendant_cubeVolume_ratio] + +/-- The corresponding exact `Lᵖ` restriction formula. -/ +theorem eLpNorm_centralDescendant_eq_rpow_smul_restrict {d : ℕ} + (Q : TriadicCube d) (n : ℕ) (p : FiniteLpExponent) (f : Vec d → ℝ) : + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure (centralDescendant Q n)) = + ENNReal.ofReal (((3 ^ d) ^ n : ℕ) : ℝ) ^ (1 / p.exponent).toReal * + MeasureTheory.eLpNorm f p.exponent + ((normalizedCubeMeasure Q).restrict (cubeSet (centralDescendant Q n))) := by + rw [normalizedCubeMeasure_centralDescendant_eq_smul_restrict] + have hfactor : ENNReal.ofReal (((3 ^ d) ^ n : ℕ) : ℝ) ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.2 (by positivity) + simpa [smul_eq_mul] using MeasureTheory.eLpNorm_smul_measure_of_ne_zero hfactor f p.exponent + ((normalizedCubeMeasure Q).restrict (cubeSet (centralDescendant Q n))) + +/-- Restricting from a normalized cube to a central depth-`n` descendant has +at most the descendant-count loss. The exact `p`-dependent root factor is +available in `eLpNorm_centralDescendant_eq_rpow_smul_restrict`; this coarser +form is convenient for the iteration bookkeeping. -/ +theorem eLpNorm_centralDescendant_le_descendantCount_mul {d : ℕ} + (Q : TriadicCube d) (n : ℕ) (p : FiniteLpExponent) (f : Vec d → ℝ) : + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure (centralDescendant Q n)) ≤ + ENNReal.ofReal (((3 ^ d) ^ n : ℕ) : ℝ) * + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) := by + let N : ℝ≥0∞ := ENNReal.ofReal (((3 ^ d) ^ n : ℕ) : ℝ) + have hN : 1 ≤ N := by + dsimp [N] + have hthree : (3 : ℕ) ≠ 0 := by norm_num + rw [ENNReal.ofReal_natCast] + exact_mod_cast Nat.one_le_iff_ne_zero.mpr (pow_ne_zero n (pow_ne_zero d hthree)) + have hp : 1 / p.exponent.toReal ≤ (1 : ℝ) := by + have hp_one : 1 ≤ p.exponent.toReal := + ENNReal.toReal_mono p.lt_top.ne p.one_lt.le + simpa using (one_div_le_one_div_of_le (by norm_num : (0 : ℝ) < 1) hp_one) + rw [eLpNorm_centralDescendant_eq_rpow_smul_restrict] + change N ^ (1 / p.exponent).toReal * _ ≤ N * _ + calc + N ^ (1 / p.exponent).toReal * + MeasureTheory.eLpNorm f p.exponent + ((normalizedCubeMeasure Q).restrict (cubeSet (centralDescendant Q n))) ≤ + N * MeasureTheory.eLpNorm f p.exponent + ((normalizedCubeMeasure Q).restrict (cubeSet (centralDescendant Q n))) := by + gcongr + simpa [ENNReal.toReal_inv] using ENNReal.rpow_le_rpow_of_exponent_le hN hp + _ ≤ N * MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) := by + exact mul_le_mul_right (MeasureTheory.eLpNorm_mono_measure f + MeasureTheory.Measure.restrict_le_self) N + +/-- Finite `Lᵖ` data on a cube restricts to every central descendant. -/ +theorem memLp_centralDescendant_of_memLp {d : ℕ} {Q : TriadicCube d} {p : ℝ≥0∞} + {f : Vec d → ℝ} (n : ℕ) (hf : MeasureTheory.MemLp f p (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp f p (normalizedCubeMeasure (centralDescendant Q n)) := + memLp_on_descendant_of_memLp (centralDescendant_mem_descendantsAtDepth Q n) hf + +/-- On the probability-normalized central descendant, every finite exponent +below `2` is bounded by the `L²` norm without a volume loss. -/ +theorem eLpNorm_centralDescendant_downgrade_le {d : ℕ} (Q : TriadicCube d) (n : ℕ) + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) (f : Vec d → ℝ) + (hf : MeasureTheory.AEStronglyMeasurable f + (normalizedCubeMeasure (centralDescendant Q n))) : + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure (centralDescendant Q n)) ≤ + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure (centralDescendant Q n)) := + eLpNorm_normalizedCubeMeasure_downgrade_le (centralDescendant Q n) p hp f hf + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientOneDim.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientOneDim.lean new file mode 100644 index 0000000000..24838681b3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientOneDim.lean @@ -0,0 +1,263 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicDerivative +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicGradientIterationGeometry + +/-! # Harmonic Gradient One Dim -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# One-dimensional harmonic gradient gain + +In one dimension, the fixed-radius weak Hessian of a weakly harmonic function +vanishes. Thus its only gradient coordinate is constant almost everywhere on +the central triadic child. This supplies every finite normalized `L^r` gain +without an endpoint Sobolev embedding. +-/ + +namespace CubeCalderonZygmund + +private theorem hessian_zero_ae_on_innerHalf {Q : TriadicCube 1} + {u : H1Function (openCubeSet Q)} + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) + {uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ))} + (huSgrad : uS.grad = u.grad) + (H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS) : + H.hess 0 0 =ᵐ[MeasureTheory.volume.restrict (scaledOpenCubeSet Q (1 / 2 : ℝ))] + fun _ => 0 := by + let V := scaledOpenCubeSet Q (1 / 2 : ℝ) + have hVopen : IsOpen V := + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q (by norm_num)).isOpen + have hVU : V ⊆ openCubeSet Q := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q + (ρ := (1 / 2 : ℝ)) (by norm_num) (by norm_num) + intro i + exact le_of_lt (hx i) + have hres := h.restrict hVopen hVU + have hloc : MeasureTheory.LocallyIntegrableOn (H.hess 0 0) V MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((H.hess_memL2 0 0).locallyIntegrable (by norm_num)) + rw [Filter.EventuallyEq, MeasureTheory.ae_restrict_iff' hVopen.measurableSet] + refine hVopen.ae_eq_zero_of_integral_contDiff_smul_eq_zero hloc ?_ + intro φ hφ hφs hφsub + have htest := hres.test φ hφ hφs hφsub + have hsecond := H.weak_second 0 0 φ hφ hφs hφsub + have hgrad_zero : + ∫ x in V, uS.grad x 0 * (fderiv ℝ φ x) (basisVec 0) ∂MeasureTheory.volume = 0 := by + simpa [H1Function.restrict, huSgrad, vecDot, euclideanGradient, + euclideanCoordDeriv] using htest + have hhess_zero : ∫ x in V, H.hess 0 0 x * φ x ∂MeasureTheory.volume = 0 := by + simpa [V] using (neg_eq_zero.mp (by linarith [hsecond, hgrad_zero])) + calc + ∫ x, φ x * H.hess 0 0 x ∂MeasureTheory.volume = + ∫ x, H.hess 0 0 x * φ x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring + _ = ∫ x in V, H.hess 0 0 x * φ x ∂MeasureTheory.volume := by + symm + apply MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + intro x hx + have hxnot : x ∉ tsupport φ := fun hxt => hx (hφsub hxt) + simp [image_eq_zero_of_notMem_tsupport hxnot] + _ = 0 := hhess_zero + +private theorem exists_gradCoord_const_ae_on_innerHalf {Q : TriadicCube 1} + {u : H1Function (openCubeSet Q)} + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) : + ∃ c : ℝ, (fun x => u.grad x 0) =ᵐ[MeasureTheory.volume.restrict + (scaledOpenCubeSet Q (1 / 2 : ℝ))] fun _ => c := by + obtain ⟨uS, huSval, huSgrad, H, hHbound⟩ := + exists_innerHalf_hasWeakHessianOn_harmonic h + let V := scaledOpenCubeSet Q (1 / 2 : ℝ) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn V) := by + dsimp [V, volumeMeasureOn] + exact (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q + (by norm_num)).isFiniteMeasure_restrict_volume + let v := H.gradCoordH1Function 0 + have hhess : H.hess 0 0 =ᵐ[MeasureTheory.volume.restrict V] fun _ => 0 := by + simpa [V] using hessian_zero_ae_on_innerHalf h huSgrad H + have hvfieldzero : v.grad =ᵐ[MeasureTheory.volume.restrict V] fun _ => 0 := by + filter_upwards [hhess] with x hh + funext j + fin_cases j + simpa [v, HasWeakHessianOn.gradCoordH1Function] using hh + have hvgradzero : v.gradToVectorL2 = 0 := by + apply MeasureTheory.Lp.ext + filter_upwards [H1Function.coeFn_gradToVectorL2 v, hvfieldzero, + MeasureTheory.Lp.coeFn_zero (Vec 1) (2 : ℝ≥0∞) (volumeMeasureOn V)] + with x hv hfield hzero + exact hv.trans (hfield.trans hzero.symm) + have hp := (h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q (by norm_num))).bound v.toMeanZero + have hvsubzero_norm : ‖v.subAverage.toScalarL2‖ = 0 := by + change ‖v.subAverage.toScalarL2‖ ≤ + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q (by norm_num))).fixedValue * + ‖v.subAverage.gradToVectorL2‖ at hp + rw [H1Function.gradToVectorL2_subAverage_eq, hvgradzero] at hp + simp only [norm_zero, mul_zero] at hp + exact le_antisymm hp (norm_nonneg _) + have hvsubzero : v.subAverage.toScalarL2 = 0 := norm_eq_zero.mp hvsubzero_norm + have hvsub_ae : v.subAverage =ᵐ[MeasureTheory.volume.restrict V] fun _ => 0 := by + filter_upwards [H1Function.coeFn_toScalarL2 v.subAverage, + MeasureTheory.Lp.coeFn_zero ℝ (2 : ℝ≥0∞) (volumeMeasureOn V)] with x hv hzero + rw [hvsubzero] at hv + exact hv.symm.trans hzero + refine ⟨integralAverage V v, ?_⟩ + filter_upwards [hvsub_ae] with x hx + have hx' : v x - integralAverage V v = 0 := by + simpa [V, H1Function.subAverage_apply] using hx + simpa [v, huSgrad] using sub_eq_zero.mp hx' + +private theorem middleChildCube_subset_innerHalf (Q : TriadicCube 1) : + cubeSet ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 1) ⊆ + scaledOpenCubeSet Q (1 / 2 : ℝ) := by + intro x hx i + have hscale : cubeScaleFactor + ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 1) = + cubeScaleFactor Q / 3 := by + simpa using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hx' := hx i + rw [hscale] at hx' + norm_num [Int.cast_mul] at hx' + change |x i - cubeCenter Q i| < (1 / 2 : ℝ) * cubeRadius Q + rw [cubeCenter, cubeRadius, abs_lt] + constructor <;> nlinarith + +/-- The one-dimensional constant-gradient construction supplies actual finite +`L^p` membership on the central child, not merely a real-valued norm bound. +This is the finiteness witness required by the later ENNReal CZ carrier. -/ +theorem harmonic_gradCoord_memLp_centralDescendant_oneDim + (p : FiniteLpExponent) (Q : TriadicCube 1) (u : H1Function (openCubeSet Q)) + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) : + MeasureTheory.MemLp (fun x => u.grad x 0) p.exponent + (normalizedCubeMeasure (centralDescendant Q 1)) := by + obtain ⟨c, hc⟩ := exists_gradCoord_const_ae_on_innerHalf h + let R : TriadicCube 1 := centralDescendant Q 1 + have hRsub : cubeSet R ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := by + simpa [R, centralDescendant] using! middleChildCube_subset_innerHalf Q + have hRac : MeasureTheory.Measure.AbsolutelyContinuous (normalizedCubeMeasure R) + (MeasureTheory.volume.restrict (scaledOpenCubeSet Q (1 / 2 : ℝ))) := by + rw [normalizedCubeMeasure, cubeMeasure] + exact MeasureTheory.Measure.smul_absolutelyContinuous.trans + (MeasureTheory.Measure.absolutelyContinuous_of_le + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hRsub)) + have hcR : (fun x => u.grad x 0) =ᵐ[normalizedCubeMeasure R] fun _ => c := + hRac.ae_eq hc + exact (MeasureTheory.memLp_congr_ae hcR).mpr (MeasureTheory.memLp_const c) + +private theorem cubeLpNorm_two_middleChild_le_three_mul (Q : TriadicCube 1) + (f : Vec 1 → ℝ) (hf : MeasureTheory.MemLp f 2 (normalizedCubeMeasure Q)) : + cubeLpNorm ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 1) 2 f ≤ + 3 * cubeLpNorm Q 2 f := by + let R : TriadicCube 1 := { scale := Q.scale - 1, index := fun i => 3 * Q.index i } + have hR : R ∈ descendantsAtDepth Q 1 := by + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨Q, by simp, by simpa [R] using middleChild_mem_childCubes Q⟩ + have hvol : cubeVolume Q / cubeVolume R = 3 := by + have h := cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth hR + have hcard : (descendantsAtDepth Q 1).card = 3 := by + simp [descendantsAtDepth, childCubes_card] + rw [hcard] at h + norm_num at h + calc + cubeVolume Q / cubeVolume R = (3 * cubeVolume R) / cubeVolume R := by rw [h] + _ = 3 := by field_simp [(cubeVolume_pos R).ne'] + have hsmul : ENNReal.ofReal (cubeVolume Q / cubeVolume R) ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.2 (div_pos (cubeVolume_pos Q) (cubeVolume_pos R)) + have hle : MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure R) ≤ + 3 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + calc + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure R) = + (ENNReal.ofReal (cubeVolume Q / cubeVolume R) ^ (1 / (2 : ℝ≥0∞)).toReal) • + MeasureTheory.eLpNorm f 2 ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + rw [normalizedCubeMeasure_descendant_eq_smul_restrict hR] + exact MeasureTheory.eLpNorm_smul_measure_of_ne_zero hsmul f 2 _ + _ ≤ 3 * MeasureTheory.eLpNorm f 2 ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + rw [hvol] + norm_num + apply mul_le_mul_left + calc + (3 : ℝ≥0∞) ^ (1 / (2 : ℝ)) ≤ (3 : ℝ≥0∞) ^ (1 : ℝ) := + ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) (by norm_num) + _ = 3 := by norm_num + _ ≤ 3 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + exact mul_le_mul_right (MeasureTheory.eLpNorm_mono_measure f + MeasureTheory.Measure.restrict_le_self) _ + have hfinR := memLp_on_descendant_of_memLp hR hf + have hfinQ := hf.eLpNorm_ne_top + have htop : 3 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top (by norm_num) hfinQ + have hreal := ENNReal.toReal_mono htop hle + simpa [R, cubeLpNorm, ENNReal.toReal_mul] using hreal + +private theorem cubeLpNorm_eq_abs_of_ae_eq_const (Q : TriadicCube 1) + (p : FiniteLpExponent) (f : Vec 1 → ℝ) (c : ℝ) + (h : f =ᵐ[normalizedCubeMeasure Q] fun _ => c) : + cubeLpNorm Q p.exponent f = |c| := by + unfold cubeLpNorm + rw [MeasureTheory.eLpNorm_congr_ae h, + MeasureTheory.eLpNorm_const' c (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne, + normalizedCubeMeasure_apply_univ] + simp + +/-- In one dimension a weakly harmonic gradient has every finite normalized +`L^r` gain on the central child. The displayed proof uses the universal +constant `3`; in particular it is uniform in the exponent and cube scale. -/ +theorem exists_harmonic_gradCoord_finiteLp_bound_oneDim (p : FiniteLpExponent) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube 1) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + cubeLpNorm + ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 1) + p.exponent (fun x => u.grad x 0) ≤ + C * cubeLpNorm Q 2 (fun x => u.grad x 0) := by + refine ⟨3, by norm_num, ?_⟩ + intro Q u h + let R : TriadicCube 1 := { scale := Q.scale - 1, index := fun i => 3 * Q.index i } + obtain ⟨c, hc⟩ := exists_gradCoord_const_ae_on_innerHalf h + have hRsub : cubeSet R ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := by + simpa [R] using middleChildCube_subset_innerHalf Q + have hRac : MeasureTheory.Measure.AbsolutelyContinuous (normalizedCubeMeasure R) + (MeasureTheory.volume.restrict (scaledOpenCubeSet Q (1 / 2 : ℝ))) := by + rw [normalizedCubeMeasure, cubeMeasure] + exact MeasureTheory.Measure.smul_absolutelyContinuous.trans + (MeasureTheory.Measure.absolutelyContinuous_of_le + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hRsub)) + have hcR : (fun x => u.grad x 0) =ᵐ[normalizedCubeMeasure R] fun _ => c := + hRac.ae_eq hc + have hleft : cubeLpNorm R p.exponent (fun x => u.grad x 0) = |c| := + cubeLpNorm_eq_abs_of_ae_eq_const R p _ c hcR + have hleftTwo : cubeLpNorm R 2 (fun x => u.grad x 0) = |c| := by + simpa using cubeLpNorm_eq_abs_of_ae_eq_const R FiniteLpExponent.two _ c hcR + have hmem : MeasureTheory.MemLp (fun x => u.grad x 0) 2 (normalizedCubeMeasure Q) := by + exact u.grad_memL2_normalizedCubeMeasure 0 + have hchild := cubeLpNorm_two_middleChild_le_three_mul Q _ hmem + rw [hleftTwo] at hchild + simpa [R, hleft] using hchild + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientTwoDim.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientTwoDim.lean new file mode 100644 index 0000000000..5d0b936b2b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicGradientTwoDim.lean @@ -0,0 +1,617 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.HarmonicInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding.LimitFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.FiniteMeasureDowngrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.ScaledPoincare +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectionLimit + +/-! # Harmonic Gradient Two Dim -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +private noncomputable def finiteSobolevSourceExponent (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : FiniteLpExponent where + exponent := ENNReal.ofReal (2 * p.exponent.toReal / (p.exponent.toReal + 2)) + one_lt := by + rw [ENNReal.one_lt_ofReal] + have hp' : 2 < p.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) p.lt_top.ne).2 hp + have hden : 0 < p.exponent.toReal + 2 := by linarith + calc + 1 = (p.exponent.toReal + 2) / (p.exponent.toReal + 2) := by field_simp + _ < 2 * p.exponent.toReal / (p.exponent.toReal + 2) := + (div_lt_div_iff_of_pos_right hden).2 (by linarith) + lt_top := ENNReal.ofReal_lt_top + +private theorem finiteSobolevSourceExponent_le_two (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + (finiteSobolevSourceExponent p hp).exponent ≤ 2 := by + rw [show (finiteSobolevSourceExponent p hp).exponent = + ENNReal.ofReal (2 * p.exponent.toReal / (p.exponent.toReal + 2)) by rfl] + norm_num + have hden : 0 < p.exponent.toReal + 2 := by positivity + exact (div_le_iff₀ hden).2 (by linarith) + +private theorem finiteSobolevSourceExponent_relation (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + (p.exponent.toReal)⁻¹ = + (finiteSobolevSourceExponent p hp).exponent.toReal⁻¹ - (2 : ℝ)⁻¹ := by + rw [show (finiteSobolevSourceExponent p hp).exponent.toReal = + 2 * p.exponent.toReal / (p.exponent.toReal + 2) by + simp [finiteSobolevSourceExponent] + exact div_nonneg (mul_nonneg (by norm_num) ENNReal.toReal_nonneg) (by positivity)] + have hp' : 0 < p.exponent.toReal := by + have hp2 : 2 < p.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) p.lt_top.ne).2 hp + linarith + field_simp + ring + +private theorem eLpNorm_normalizedCubeMeasure_eq_scale_mul {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (f : Vec d → ℝ) : + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) = + (ENNReal.ofReal (cubeVolume Q)⁻¹ ^ (1 / p.exponent).toReal) * + MeasureTheory.eLpNorm f p.exponent (volumeMeasureOn (openCubeSet Q)) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact MeasureTheory.eLpNorm_smul_measure_of_ne_zero + (ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q))) f p.exponent _ + +private theorem eLpNorm_rawCubeMeasure_twoDim_eq_scale_mul_normalized + (Q : TriadicCube 2) (p : FiniteLpExponent) (f : Vec 2 → ℝ) : + MeasureTheory.eLpNorm f p.exponent (volumeMeasureOn (openCubeSet Q)) = + (ENNReal.ofReal (cubeScaleFactor Q) ^ (2 / p.exponent.toReal)) * + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) := by + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hcoeff : + ENNReal.ofReal (cubeVolume Q)⁻¹ ^ (1 / p.exponent).toReal = + (ENNReal.ofReal (cubeScaleFactor Q) ^ (2 / p.exponent.toReal))⁻¹ := by + rw [cubeVolume_eq_scaleFactor_pow, ENNReal.ofReal_inv_of_pos (pow_pos hscale 2)] + rw [ENNReal.ofReal_pow hscale.le, ENNReal.inv_rpow, + ← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + congr 1 + simp only [one_div, ENNReal.toReal_inv] + field_simp [ne_of_gt (ENNReal.toReal_pos + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne)] + ring_nf + have hnorm := eLpNorm_normalizedCubeMeasure_eq_scale_mul Q p f + rw [hcoeff] at hnorm + set a : ℝ≥0∞ := ENNReal.ofReal (cubeScaleFactor Q) ^ (2 / p.exponent.toReal) + have ha0 : a ≠ 0 := ne_of_gt <| + ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top + have hat : a ≠ ⊤ := ENNReal.rpow_ne_top_of_nonneg + (by positivity) ENNReal.ofReal_ne_top + rw [hnorm] + calc + _ = (a * a⁻¹) * MeasureTheory.eLpNorm f p.exponent + (volumeMeasureOn (openCubeSet Q)) := by simp [ENNReal.mul_inv_cancel ha0 hat] + _ = _ := by ring + +private theorem cubeLpNorm_two_middleChild_le_three_mul (Q : TriadicCube 2) + (f : Vec 2 → ℝ) (hf : MeasureTheory.MemLp f 2 (normalizedCubeMeasure Q)) : + cubeLpNorm ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 2) + 2 f ≤ 9 * cubeLpNorm Q 2 f := by + let R : TriadicCube 2 := { scale := Q.scale - 1, index := fun i => 3 * Q.index i } + have hR : R ∈ descendantsAtDepth Q 1 := by + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨Q, by simp, by simpa [R] using middleChild_mem_childCubes Q⟩ + have hvol : cubeVolume Q / cubeVolume R = 9 := by + have h := cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth hR + have hcard : (descendantsAtDepth Q 1).card = 9 := by + simp [descendantsAtDepth, childCubes_card] + rw [hcard] at h + norm_num at h + calc + cubeVolume Q / cubeVolume R = (9 * cubeVolume R) / cubeVolume R := by rw [h] + _ = 9 := by field_simp [(cubeVolume_pos R).ne'] + have hsmul : ENNReal.ofReal (cubeVolume Q / cubeVolume R) ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.2 (div_pos (cubeVolume_pos Q) (cubeVolume_pos R)) + have hle : MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure R) ≤ + 9 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + calc + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure R) = + (ENNReal.ofReal (cubeVolume Q / cubeVolume R) ^ (1 / (2 : ℝ≥0∞)).toReal) • + MeasureTheory.eLpNorm f 2 ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + rw [normalizedCubeMeasure_descendant_eq_smul_restrict hR] + exact MeasureTheory.eLpNorm_smul_measure_of_ne_zero hsmul f 2 _ + _ ≤ 9 * MeasureTheory.eLpNorm f 2 ((normalizedCubeMeasure Q).restrict (cubeSet R)) := by + rw [hvol] + norm_num + apply mul_le_mul_left + calc + (9 : ℝ≥0∞) ^ (1 / (2 : ℝ)) ≤ (9 : ℝ≥0∞) ^ (1 : ℝ) := + ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) (by norm_num) + _ = 9 := by norm_num + _ ≤ 9 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + exact mul_le_mul_right (MeasureTheory.eLpNorm_mono_measure f + MeasureTheory.Measure.restrict_le_self) _ + have hfinQ := hf.eLpNorm_ne_top + have htop : 9 * MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top (by norm_num) hfinQ + have hreal := ENNReal.toReal_mono htop hle + simpa [R, cubeLpNorm, ENNReal.toReal_mul] using hreal + +private theorem exists_harmonic_gradCoord_finiteLp_bound_twoDim_le_two + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin 2, + cubeLpNorm + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2) + p.exponent (fun x => u.grad x i) ≤ + C * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + refine ⟨9, by norm_num, ?_⟩ + intro Q u _ i + let R : TriadicCube 2 := { scale := Q.scale - 1, index := fun k => 3 * Q.index k } + have hR : R ∈ descendantsAtDepth Q 1 := by + rw [mem_descendantsAtDepth_succ_iff] + exact ⟨Q, by simp, by simpa [R] using middleChild_mem_childCubes Q⟩ + have hmemR : MeasureTheory.MemLp (fun x => u.grad x i) 2 (normalizedCubeMeasure R) := + u.grad_memL2_normalizedCubeMeasure_of_mem_descendantsAtDepth hR i + have hdown := Homogenization.eLpNorm_normalizedCubeMeasure_downgrade_le R p hp + (fun x => u.grad x i) hmemR.aestronglyMeasurable + have hdownreal : cubeLpNorm R p.exponent (fun x => u.grad x i) ≤ + cubeLpNorm R 2 (fun x => u.grad x i) := by + exact ENNReal.toReal_mono hmemR.eLpNorm_ne_top hdown + have hchild := cubeLpNorm_two_middleChild_le_three_mul Q (fun x => u.grad x i) + (u.grad_memL2_normalizedCubeMeasure i) + calc + cubeLpNorm R p.exponent (fun x => u.grad x i) ≤ + cubeLpNorm R 2 (fun x => u.grad x i) := hdownreal + _ ≤ 9 * cubeLpNorm Q 2 (fun x => u.grad x i) := hchild + _ ≤ 9 * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + gcongr + exact Finset.single_le_sum + (fun j _ => cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => u.grad x j)) + (Finset.mem_univ i) + +private theorem openCubeSet_eq_axisCube (Q : TriadicCube 2) : + openCubeSet Q = + axisCube (fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + (cubeScaleFactor Q) := by + have hupper : ∀ j : Fin 2, + ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + cubeScaleFactor Q = + ((Q.index j : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q := by + intro j + ring + ext x + simp only [openCubeSet, axisCube, Set.mem_ofPred_eq, Set.mem_pi, Set.mem_univ, + forall_true_left, Set.mem_Ioo] + simp_rw [hupper] + +private theorem middleChildCube_subset_innerHalf (Q : TriadicCube 2) : + cubeSet ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 2) ⊆ + scaledOpenCubeSet Q (1 / 2 : ℝ) := by + intro x hx i + have hscale : cubeScaleFactor + ({ scale := Q.scale - 1, index := fun i => 3 * Q.index i } : TriadicCube 2) = + cubeScaleFactor Q / 3 := by + simpa using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hpos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have hx' := hx i + rw [hscale] at hx' + norm_num [Int.cast_mul] at hx' + change |x i - cubeCenter Q i| < (1 / 2 : ℝ) * cubeRadius Q + rw [cubeCenter, cubeRadius, abs_lt] + constructor <;> nlinarith + +private theorem highExponent_embedding_input (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + ∃ C : NNReal, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin 2), + MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent + (volumeMeasureOn (openCubeSet Q)) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin 2, + MeasureTheory.eLpNorm (fun x => H.hess i j x) + (finiteSobolevSourceExponent p hp).exponent + (volumeMeasureOn (openCubeSet Q))) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) + (finiteSobolevSourceExponent p hp).exponent + (volumeMeasureOn (openCubeSet Q))) := by + obtain ⟨C, hCpos, hC⟩ := cubeSobolevEmbedding_finiteLp (d := 2) (by norm_num) + (finiteSobolevSourceExponent p hp) (by + have hrlt : (finiteSobolevSourceExponent p hp).exponent.toReal < 2 := by + rw [show (finiteSobolevSourceExponent p hp).exponent.toReal = + 2 * p.exponent.toReal / (p.exponent.toReal + 2) by + simp [finiteSobolevSourceExponent] + exact div_nonneg (mul_nonneg (by norm_num) ENNReal.toReal_nonneg) (by positivity)] + have hp' : 0 < p.exponent.toReal := by + have := (ENNReal.toReal_lt_toReal (by norm_num) p.lt_top.ne).2 hp + exact lt_trans (by norm_num) this + rw [div_lt_iff₀ (by positivity)] + nlinarith + exact hrlt) + refine ⟨C, hCpos, ?_⟩ + intro Q + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let z : Vec 2 := fun j => ((Q.index j : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + have haxis : openCubeSet Q = axisCube z (cubeScaleFactor Q) := by + simpa [z] using openCubeSet_eq_axisCube Q + let P : Set (Vec 2) → Prop := fun U => + ∀ (u : H1Function U) (H : HasWeakHessianOn U u) (i : Fin 2), + MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent (volumeMeasureOn U) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) + (finiteSobolevSourceExponent p hp).exponent (volumeMeasureOn U)) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) + (finiteSobolevSourceExponent p hp).exponent (volumeMeasureOn U)) + have haxisP : P (axisCube z (cubeScaleFactor Q)) := by + intro v H i + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (axisCube z (cubeScaleFactor Q))) := + haxis ▸ inferInstance + simpa [P, HasWeakHessianOn.gradCoordH1Function_apply, + HasWeakHessianOn.gradCoordH1Function_grad_apply] using! + (hC p (finiteSobolevSourceExponent_relation p hp) z (cubeScaleFactor Q) hscale + ((H.gradCoordH1Function i).toW1pOfExponentLETwo + (finiteSobolevSourceExponent p hp) (finiteSobolevSourceExponent_le_two p hp))) + exact haxis.symm ▸ haxisP + +private theorem highExponent_embedding_on_middleChild (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + ∃ C : NNReal, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)) + (_h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) (i : Fin 2), + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.grad = u.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS, + MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent + (volumeMeasureOn (openCubeSet + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2))) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin 2, + MeasureTheory.eLpNorm (fun x => H.hess i j x) + (finiteSobolevSourceExponent p hp).exponent + (volumeMeasureOn (openCubeSet + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2)))) + + ENNReal.ofReal (cubeScaleFactor Q / 3)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) + (finiteSobolevSourceExponent p hp).exponent + (volumeMeasureOn (openCubeSet + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2)))) := by + obtain ⟨C, hCpos, hC⟩ := highExponent_embedding_input p hp + refine ⟨C, hCpos, ?_⟩ + intro Q u h i + obtain ⟨A, hApos, hA⟩ := exists_harmonic_innerHalf_hessian_energy_bound 2 + obtain ⟨uS, huval, hugrad, H, hH⟩ := + hA Q u h + let R : TriadicCube 2 := { scale := Q.scale - 1, index := fun k => 3 * Q.index k } + have hRopen : IsOpen (openCubeSet R) := isOpen_openCubeSet R + have hRsub : openCubeSet R ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := + (openCubeSet_subset_cubeSet R).trans (by simpa [R] using middleChildCube_subset_innerHalf Q) + let uR := uS.restrict hRopen hRsub + let HR := H.restrict hRopen hRsub + refine ⟨uS, hugrad, H, ?_⟩ + have hraw := hC R uR HR i + have hscale : cubeScaleFactor R = cubeScaleFactor Q / 3 := by + simpa [R] using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + simpa [uR, HR, H1Function.restrict, HasWeakHessianOn.restrict, hugrad, hscale] using hraw + +private theorem highExponent_normalized_embedding (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + ∃ C : NNReal, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin 2), + MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent (normalizedCubeMeasure Q) ≤ + (C : ℝ≥0∞) * + (ENNReal.ofReal (cubeScaleFactor Q) * + ∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q)) := by + obtain ⟨C, hCpos, hC⟩ := highExponent_embedding_input p hp + refine ⟨C, hCpos, ?_⟩ + intro Q u H i + let r := finiteSobolevSourceExponent p hp + let a : ℝ≥0∞ := ENNReal.ofReal (cubeScaleFactor Q) + let ap : ℝ≥0∞ := a ^ (2 / p.exponent.toReal) + let ar : ℝ≥0∞ := a ^ (2 / r.exponent.toReal) + have hapos : 0 < a := ENNReal.ofReal_pos.mpr (by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale) + have ha0 : a ≠ 0 := ne_of_gt hapos + have hat : a ≠ ⊤ := ENNReal.ofReal_ne_top + have hap0 : ap ≠ 0 := ne_of_gt (ENNReal.rpow_pos hapos hat) + have hapt : ap ≠ ⊤ := ENNReal.rpow_ne_top_of_nonneg (by positivity) hat + have hpow : 2 / r.exponent.toReal = 2 / p.exponent.toReal + 1 := by + have hrel := finiteSobolevSourceExponent_relation p hp + dsimp [r] + calc + 2 / (finiteSobolevSourceExponent p hp).exponent.toReal = + 2 * (finiteSobolevSourceExponent p hp).exponent.toReal⁻¹ := by ring + _ = 2 * (p.exponent.toReal⁻¹ + (2 : ℝ)⁻¹) := by + congr 1 + linarith + _ = 2 / p.exponent.toReal + 1 := by ring + have har : ar = ap * a := by + dsimp [ar, ap] + rw [hpow, ENNReal.rpow_add _ _ ha0 hat] + norm_num + have hinv : ENNReal.ofReal (cubeScaleFactor Q)⁻¹ = a⁻¹ := by + dsimp [a] + exact ENNReal.ofReal_inv_of_pos (by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale) + have hraw := hC Q u H i + rw [eLpNorm_rawCubeMeasure_twoDim_eq_scale_mul_normalized Q p] at hraw + change ap * MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent + (normalizedCubeMeasure Q) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) r.exponent + (volumeMeasureOn (openCubeSet Q))) + + ENNReal.ofReal (cubeScaleFactor Q)⁻¹ * + MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (volumeMeasureOn (openCubeSet Q))) at hraw + simp_rw [eLpNorm_rawCubeMeasure_twoDim_eq_scale_mul_normalized Q r] at hraw + rw [hinv] at hraw + have hraw' : ap * MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent + (normalizedCubeMeasure Q) ≤ (C : ℝ≥0∞) * + ((∑ j : Fin 2, ar * MeasureTheory.eLpNorm (fun x => H.hess i j x) r.exponent + (normalizedCubeMeasure Q)) + + a⁻¹ * (ar * MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent + (normalizedCubeMeasure Q))) := by + simpa [a, ap, ar] using hraw + rw [har] at hraw' + have hrow : ∀ j : Fin 2, + MeasureTheory.eLpNorm (fun x => H.hess i j x) r.exponent (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (normalizedCubeMeasure Q) := by + intro j + apply Homogenization.eLpNorm_normalizedCubeMeasure_downgrade_le Q r + (finiteSobolevSourceExponent_le_two p hp) + exact (memL2On_openCubeSet_normalizedCubeMeasure (H.hess_memL2 i j)).aestronglyMeasurable + have hgrad : MeasureTheory.eLpNorm (fun x => u.grad x i) r.exponent (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q) := by + apply Homogenization.eLpNorm_normalizedCubeMeasure_downgrade_le Q r + (finiteSobolevSourceExponent_le_two p hp) + exact (u.grad_memL2_normalizedCubeMeasure i).aestronglyMeasurable + apply (ENNReal.mul_le_mul_iff_right hap0 hapt).mp + calc + ap * MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent + (normalizedCubeMeasure Q) ≤ + (C : ℝ≥0∞) * + ((∑ j : Fin 2, ap * a * MeasureTheory.eLpNorm (fun x => H.hess i j x) + r.exponent (normalizedCubeMeasure Q)) + + a⁻¹ * (ap * a) * MeasureTheory.eLpNorm (fun x => u.grad x i) + r.exponent (normalizedCubeMeasure Q)) := by simpa [mul_assoc] using hraw' + _ ≤ (C : ℝ≥0∞) * + ((∑ j : Fin 2, ap * a * MeasureTheory.eLpNorm (fun x => H.hess i j x) + 2 (normalizedCubeMeasure Q)) + + a⁻¹ * (ap * a) * MeasureTheory.eLpNorm (fun x => u.grad x i) + 2 (normalizedCubeMeasure Q)) := by + gcongr + · exact hrow _ + _ = ap * ((C : ℝ≥0∞) * + (a * ∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q))) := by + have hcancel : a⁻¹ * (ap * a) = ap := by + calc + a⁻¹ * (ap * a) = ap * (a⁻¹ * a) := by ring + _ = ap := by rw [ENNReal.inv_mul_cancel ha0 hat, mul_one] + rw [hcancel] + rw [← Finset.mul_sum] + ring + +private theorem raw_eLpNorm_two_toReal_eq_scale_mul_cubeLpNorm + (Q : TriadicCube 2) (f : Vec 2 → ℝ) + (hf : MeasureTheory.MemLp f 2 (normalizedCubeMeasure Q)) : + (MeasureTheory.eLpNorm f 2 (volumeMeasureOn (openCubeSet Q))).toReal = + cubeScaleFactor Q * cubeLpNorm Q 2 f := by + have hraw := eLpNorm_rawCubeMeasure_twoDim_eq_scale_mul_normalized Q + FiniteLpExponent.two f + have htop : ENNReal.ofReal (cubeScaleFactor Q) * + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hf.eLpNorm_ne_top + have hraw' : MeasureTheory.eLpNorm f 2 (volumeMeasureOn (openCubeSet Q)) = + ENNReal.ofReal (cubeScaleFactor Q) * + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + simpa using hraw + have hreal := congrArg ENNReal.toReal hraw' + rw [ENNReal.toReal_mul, ENNReal.toReal_ofReal (by + simpa [cubeScaleFactor] using le_of_lt (zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale))] at hreal + simpa [cubeLpNorm] using hreal + +private theorem hessianCoordL2NormSum_eq_sum_raw_eLpNorm + {U : Set (Vec 2)} {u : H1Function U} (H : HasWeakHessianOn U u) : + H.hessianCoordL2NormSum = + ∑ i : Fin 2, ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn U)).toReal := by + unfold HasWeakHessianOn.hessianCoordL2NormSum + apply Finset.sum_congr rfl + intro i _ + apply Finset.sum_congr rfl + intro j _ + simp [HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp] + +private theorem highExponent_normalized_embedding_real (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) < p.exponent) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)) + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin 2), + cubeLpNorm Q p.exponent (fun x => u.grad x i) ≤ + C * + (cubeScaleFactor Q * + ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => H.hess i j x) + + cubeLpNorm Q 2 (fun x => u.grad x i)) := by + obtain ⟨C, hCpos, hC⟩ := highExponent_normalized_embedding p hp + refine ⟨C, mod_cast hCpos, ?_⟩ + intro Q u H i + have hh := hC Q u H i + have hsum : ∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure Q) ≠ ∞ := ENNReal.sum_ne_top.2 fun j _ => + (memL2On_openCubeSet_normalizedCubeMeasure (H.hess_memL2 i j)).eLpNorm_ne_top + have hfirst : ENNReal.ofReal (cubeScaleFactor Q) * + ∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hsum + have hgradtop : MeasureTheory.eLpNorm (fun x => u.grad x i) 2 + (normalizedCubeMeasure Q) ≠ ∞ := + (u.grad_memL2_normalizedCubeMeasure i).eLpNorm_ne_top + have htop : (C : ℝ≥0∞) * + (ENNReal.ofReal (cubeScaleFactor Q) * + ∑ j : Fin 2, MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (normalizedCubeMeasure Q) + + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q)) ≠ ∞ := by + apply ENNReal.mul_ne_top + · exact ENNReal.coe_ne_top + exact ENNReal.add_ne_top.2 ⟨hfirst, hgradtop⟩ + have hreal := ENNReal.toReal_mono htop hh + rw [ENNReal.toReal_mul, ENNReal.coe_toReal, ENNReal.toReal_add, + ENNReal.toReal_mul, ENNReal.toReal_sum] at hreal + · rw [ENNReal.toReal_ofReal (by + simpa [cubeScaleFactor] using le_of_lt (zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale))] at hreal + simpa [cubeLpNorm, mul_add, Finset.mul_sum] using hreal + · intro j _ + exact (memL2On_openCubeSet_normalizedCubeMeasure (H.hess_memL2 i j)).eLpNorm_ne_top + · exact hfirst + · exact hgradtop + +private theorem exists_harmonic_gradCoord_finiteLp_bound_twoDim_gt_two + (p : FiniteLpExponent) (hp : (2 : ℝ≥0∞) < p.exponent) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin 2, + cubeLpNorm + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2) + p.exponent (fun x => u.grad x i) ≤ + C * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + obtain ⟨B, hBpos, hB⟩ := highExponent_normalized_embedding_real p hp + obtain ⟨A, hApos, hA⟩ := exists_harmonic_innerHalf_hessian_energy_bound 2 + refine ⟨B * (A + 9), mul_pos hBpos (by linarith), ?_⟩ + intro Q u h i + let R : TriadicCube 2 := { scale := Q.scale - 1, index := fun k => 3 * Q.index k } + obtain ⟨uS, huval, hugrad, H, hH⟩ := hA Q u h + have hRopen : IsOpen (openCubeSet R) := isOpen_openCubeSet R + have hRsub : openCubeSet R ⊆ scaledOpenCubeSet Q (1 / 2 : ℝ) := + (openCubeSet_subset_cubeSet R).trans (by simpa [R] using middleChildCube_subset_innerHalf Q) + let HR := H.restrict hRopen hRsub + let uR := uS.restrict hRopen hRsub + have hscaleR : cubeScaleFactor R = cubeScaleFactor Q / 3 := by + simpa [R] using cubeScaleFactor_childCube Q (fun _ => (1 : Fin 3)) + have hHR := hB R uR HR i + have hhigh : cubeLpNorm R p.exponent (fun x => u.grad x i) ≤ + B * (cubeScaleFactor R * ∑ j : Fin 2, cubeLpNorm R 2 (fun x => H.hess i j x) + + cubeLpNorm R 2 (fun x => u.grad x i)) := by + simpa [uR, HR, H1Function.restrict, HasWeakHessianOn.restrict, hugrad] using hHR + have hrawrow : ∀ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn (openCubeSet R))).toReal ≤ + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal := by + intro j + apply ENNReal.toReal_mono (H.hess_memL2 i j).eLpNorm_ne_top + exact MeasureTheory.eLpNorm_mono_measure _ + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hRsub) + have hrawsum : ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 (volumeMeasureOn (openCubeSet R))).toReal ≤ + H.hessianCoordL2NormSum := by + calc + _ ≤ ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal := + Finset.sum_le_sum fun j _ => hrawrow j + _ ≤ H.hessianCoordL2NormSum := by + rw [hessianCoordL2NormSum_eq_sum_raw_eLpNorm H] + show (∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal) ≤ + ∑ k : Fin 2, ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess k j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal + exact Finset.single_le_sum + (s := Finset.univ) + (f := fun k : Fin 2 => ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess k j x) 2 + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ)))).toReal) + (fun k _ => Finset.sum_nonneg fun j _ => ENNReal.toReal_nonneg) + (Finset.mem_univ i) + have hRmem : ∀ j : Fin 2, + MeasureTheory.MemLp (fun x => H.hess i j x) 2 (normalizedCubeMeasure R) := by + intro j + exact memL2On_openCubeSet_normalizedCubeMeasure (HR.hess_memL2 i j) + have hhess : cubeScaleFactor R * ∑ j : Fin 2, cubeLpNorm R 2 (fun x => H.hess i j x) ≤ + A * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + calc + _ = ∑ j : Fin 2, + (MeasureTheory.eLpNorm (fun x => H.hess i j x) 2 + (volumeMeasureOn (openCubeSet R))).toReal := by + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro j _ + exact (raw_eLpNorm_two_toReal_eq_scale_mul_cubeLpNorm R _ (hRmem j)).symm + _ ≤ H.hessianCoordL2NormSum := hrawsum + _ ≤ A * (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := hH + _ = A * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + rw [gradientCoordL2NormSum_eq_sum_eLpNorm] + simp_rw [raw_eLpNorm_two_toReal_eq_scale_mul_cubeLpNorm Q _ + (u.grad_memL2_normalizedCubeMeasure _)] + have hL : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using zpow_pos (by norm_num : (0 : ℝ) < 3) Q.scale + field_simp [hL.ne'] + rw [Finset.mul_sum] + have hgrad := cubeLpNorm_two_middleChild_le_three_mul Q (fun x => u.grad x i) + (u.grad_memL2_normalizedCubeMeasure i) + have hgradsum : cubeLpNorm R 2 (fun x => u.grad x i) ≤ + 9 * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + calc + _ ≤ 9 * cubeLpNorm Q 2 (fun x => u.grad x i) := by simpa [R] using hgrad + _ ≤ _ := by + gcongr + exact Finset.single_le_sum + (fun j _ => cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (fun x => u.grad x j)) + (Finset.mem_univ i) + calc + cubeLpNorm R p.exponent (fun x => u.grad x i) ≤ + B * (cubeScaleFactor R * ∑ j : Fin 2, cubeLpNorm R 2 (fun x => H.hess i j x) + + cubeLpNorm R 2 (fun x => u.grad x i)) := hhigh + _ ≤ B * ((A + 9) * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j)) := by + apply mul_le_mul_of_nonneg_left _ (le_of_lt hBpos) + calc + _ ≤ A * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) + + 9 * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := + add_le_add hhess hgradsum + _ = (A + 9) * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by ring + _ = B * (A + 9) * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by ring + +/-- In dimension two, a harmonic function gains every finite `Lp` exponent for each +gradient coordinate on the central child cube, controlled by the parent-cube normalized +`L²` gradient energy. -/ +theorem exists_harmonic_gradCoord_finiteLp_bound_twoDim (p : FiniteLpExponent) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube 2) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → ∀ i : Fin 2, + cubeLpNorm + ({ scale := Q.scale - 1, index := fun k => 3 * Q.index k } : TriadicCube 2) + p.exponent (fun x => u.grad x i) ≤ + C * ∑ j : Fin 2, cubeLpNorm Q 2 (fun x => u.grad x j) := by + by_cases hp : p.exponent ≤ 2 + · exact exists_harmonic_gradCoord_finiteLp_bound_twoDim_le_two p hp + · have hp' : (2 : ℝ≥0∞) < p.exponent := lt_of_not_ge hp + exact exists_harmonic_gradCoord_finiteLp_bound_twoDim_gt_two p hp' + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicInteriorHessian.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicInteriorHessian.lean new file mode 100644 index 0000000000..f7a81544de --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/HarmonicInteriorHessian.lean @@ -0,0 +1,434 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic + +/-! # Harmonic Interior Hessian -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Fixed-radius interior weak Hessians for harmonic functions + +This is an internal regularity-engine wrapper around the existing +difference-quotient construction. It fixes all geometric radii, so callers of +the harmonic regularity chain need provide neither cutoffs nor forcing +integrability nor a Hessian witness. +-/ + +namespace CubeCalderonZygmund + +variable {d : ℕ} + +/-- Internal cutoff from the half cube to the seven-twelfths cube, leaving a +strict margin inside the two-thirds ambient region. -/ +noncomputable def innerHalfSevenTwelfthCutoff (Q : TriadicCube d) : + QuantitativeCubeCutoff Q (1 / 2 : ℝ) (7 / 12 : ℝ) := + QuantitativeCubeCutoff.canonical Q (1 / 2 : ℝ) (7 / 12 : ℝ) + (by norm_num) (by norm_num) + +/-- Internal outer cutoff used by the fixed-radius interior construction. -/ +noncomputable def outerThreeQuarterSevenEighthCutoff (Q : TriadicCube d) : + QuantitativeCubeCutoff Q (3 / 4 : ℝ) (7 / 8 : ℝ) := + QuantitativeCubeCutoff.canonical Q (3 / 4 : ℝ) (7 / 8 : ℝ) + (by norm_num) (by norm_num) + +/-- A weakly harmonic `H¹` function on a triadic cube has the canonical +strict-interior weak Hessian supplied by the existing difference-quotient +theorem. -/ +theorem exists_innerHalf_hasWeakHessianOn_harmonic + {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) : + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.toFun = u.toFun ∧ + uS.grad = u.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d Q u (fun _ => 0) i (1 / 2 : ℝ) (7 / 12 : ℝ) + (3 / 4 : ℝ) (7 / 8 : ℝ) + (outerThreeQuarterSevenEighthCutoff Q) := by + let V : Set (Vec d) := scaledOpenCubeSet Q (2 / 3 : ℝ) + have hzero_mem : MemScalarL2 (openCubeSet Q) (fun _ => 0) := by + simp [MemScalarL2, volumeMeasureOn] + have hV : IsOpenBoundedConvexDomain V := by + exact isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q + (by norm_num : 0 < (2 / 3 : ℝ)) + have hη_sub : + tsupport (innerHalfSevenTwelfthCutoff Q : Vec d → ℝ) ⊆ V := by + have hclosed : + tsupport (innerHalfSevenTwelfthCutoff Q : Vec d → ℝ) ⊆ + scaledClosedCubeSet Q (7 / 12 : ℝ) := + (innerHalfSevenTwelfthCutoff Q).tsupport_subset_scaledClosedCubeSet_of_support_subset + exact hclosed.trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Q + (by norm_num : (7 / 12 : ℝ) < 2 / 3)) + have hinnerV : scaledClosedCubeSet Q (1 / 2 : ℝ) ⊆ V := by + exact scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Q + (by norm_num : (1 / 2 : ℝ) < 2 / 3) + have hVν : V ⊆ scaledClosedCubeSet Q (2 / 3 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet Q (2 / 3 : ℝ) + simpa [V, innerHalfSevenTwelfthCutoff, outerThreeQuarterSevenEighthCutoff] using + h.exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + hzero_mem hV (innerHalfSevenTwelfthCutoff Q) hη_sub hinnerV + (outerThreeQuarterSevenEighthCutoff Q) hVν + (by norm_num : 0 ≤ (2 / 3 : ℝ)) (by norm_num : (2 / 3 : ℝ) < 3 / 4) + (by norm_num : (3 / 4 : ℝ) < 1) (by norm_num : 0 ≤ (7 / 8 : ℝ)) + (by norm_num : (7 / 8 : ℝ) < 1) (by norm_num : 0 ≤ (1 / 2 : ℝ)) + +/-- Harmonicity is unchanged by subtracting the integral average. This is +spelled out here because the regularity construction is applied to the +mean-zero representative, whereas the public interior carrier keeps the +original value representative. -/ +private theorem WeakPoissonEquationOn.subAverage + {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : H1Function U} + (h : WeakPoissonEquationOn U u (fun _ => 0)) : + WeakPoissonEquationOn U u.subAverage (fun _ => 0) := by + intro φ hφ hφs hφ_sub + simpa only [H1Function.grad_subAverage] using h.test φ hφ hφs hφ_sub + +/-- A constant shift of the value representative keeps a weak Hessian with +the same coordinate fields. -/ +private noncomputable def HasWeakHessianOn.addConst + {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : H1Function U} (H : HasWeakHessianOn U u) (c : ℝ) : + HasWeakHessianOn U (u.addConst c) where + hess := H.hess + hess_memL2 := H.hess_memL2 + weak_second := by + intro i j φ hφ hφs hφ_sub + simpa only [H1Function.grad_addConst] using H.weak_second i j φ hφ hφs hφ_sub + +private theorem setIntegral_sq_eq_toScalarL2_norm_sq + {U : Set (Vec d)} (w : H1Function U) : + ∫ x in U, w.toFun x ^ 2 ∂MeasureTheory.volume = ‖w.toScalarL2‖ ^ 2 := by + simpa [H1Function.toScalarL2, Homogenization.toScalarL2] using + (toReal_eLpNorm_two_sq_eq_integral_sq w.memL2).symm + +private theorem setIntegral_gradCoord_sq_eq_norm_sq + {U : Set (Vec d)} (w : H1Function U) (i : Fin d) : + ∫ x in U, (w.grad x i) ^ 2 ∂MeasureTheory.volume = + ‖w.gradCoordToScalarL2 i‖ ^ 2 := by + simpa [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2] using + (toReal_eLpNorm_two_sq_eq_integral_sq (w.gradMemL2 i)).symm + +private noncomputable def harmonicInteriorHessianEnergyCoreConstant (d : ℕ) : ℝ := + Real.sqrt + ((13824 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue ^ 2)) + +private theorem openCubeInnerQuotientHessianSmoothTestReducedBound_le_harmonic_energy + (Q : TriadicCube d) [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q))] + (u : H1Function (openCubeSet Q)) (i : Fin d) : + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d Q u.subAverage (fun _ => 0) i (1 / 2 : ℝ) (7 / 12 : ℝ) + (3 / 4 : ℝ) (7 / 8 : ℝ) + (outerThreeQuarterSevenEighthCutoff Q) ≤ + harmonicInteriorHessianEnergyCoreConstant d * (cubeScaleFactor Q)⁻¹ * + u.gradientCoordL2NormSum := by + let L : ℝ := cubeScaleFactor Q + let K : ℝ := quantitativeCubeCutoffGradientConst d + let C0 : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let G : ℝ := u.gradientCoordL2NormSum + let a : ℝ := ∫ x in openCubeSet Q, (u.subAverage.grad x i) ^ 2 + ∂MeasureTheory.volume + let b : ℝ := ∫ x in openCubeSet Q, u.subAverage.toFun x ^ 2 + ∂MeasureTheory.volume + have hLpos : 0 < L := by + rw [show L = 2 * cubeRadius Q by simpa [L] using cubeScaleFactor_eq_two_mul_cubeRadius Q] + exact mul_pos (by norm_num) (cubeRadius_pos Q) + have hG_nonneg : 0 ≤ G := by + exact u.gradientCoordL2NormSum_nonneg + have hcoord_le : ‖u.subAverage.gradCoordToScalarL2 i‖ ≤ G := by + calc + ‖u.subAverage.gradCoordToScalarL2 i‖ ≤ u.subAverage.gradientCoordL2NormSum := + Finset.single_le_sum (fun j _hj => norm_nonneg _) (Finset.mem_univ i) + _ = G := by simp [G] + have ha_eq : a = ‖u.subAverage.gradCoordToScalarL2 i‖ ^ 2 := by + simpa [a] using setIntegral_gradCoord_sq_eq_norm_sq u.subAverage i + have ha_le : a ≤ G ^ 2 := by + rw [ha_eq] + exact (sq_le_sq₀ (norm_nonneg _) hG_nonneg).2 hcoord_le + have hvalue_le : ‖u.subAverage.toScalarL2‖ ≤ L * C0 * G := by + have hbase := (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).bound_subAverage u + have hgrad : ‖u.gradToVectorL2‖ ≤ G := by + exact u.norm_gradToVectorL2_le_gradientCoordL2NormSum + have hconst : (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue = L * C0 := by + simpa [L, C0] using scaledTranslatedCubeMeanZeroH1CoerciveEstimate_constant Q + change ‖u.subAverage.toScalarL2‖ ≤ L * C0 * G + change ‖u.subAverage.toScalarL2‖ ≤ + (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue * ‖u.gradToVectorL2‖ at hbase + rw [hconst] at hbase + exact hbase.trans (mul_le_mul_of_nonneg_left hgrad (mul_nonneg hLpos.le + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg)) + have hb_eq : b = ‖u.subAverage.toScalarL2‖ ^ 2 := by + simpa [b] using setIntegral_sq_eq_toScalarL2_norm_sq u.subAverage + have hb_le : b ≤ (L * C0 * G) ^ 2 := by + rw [hb_eq] + exact (sq_le_sq₀ (norm_nonneg _) (mul_nonneg (mul_nonneg hLpos.le + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg) hG_nonneg)).2 hvalue_le + have hKinner : + (3 : ℝ) * ((d : ℝ) * (K / (((7 / 12 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) ^ 2) = + ((1728 : ℝ) * (d : ℝ) * K ^ 2) * L⁻¹ ^ 2 := by + rw [show cubeRadius Q = L / 2 by + dsimp [L] + rw [cubeScaleFactor_eq_two_mul_cubeRadius] + field_simp [cubeRadius_pos Q |>.ne']] + field_simp [hLpos.ne'] + ring + have hKouter : + (d : ℝ) * (K / (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Q)) ^ 2 = + ((256 : ℝ) * (d : ℝ) * K ^ 2) * L⁻¹ ^ 2 := by + rw [show cubeRadius Q = L / 2 by + dsimp [L] + rw [cubeScaleFactor_eq_two_mul_cubeRadius] + field_simp [cubeRadius_pos Q |>.ne']] + field_simp [hLpos.ne'] + ring + have hcore_nonneg : 0 ≤ harmonicInteriorHessianEnergyCoreConstant d := Real.sqrt_nonneg _ + rw [WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound] + have hzero : + (2 : ℝ) * ∫ x in openCubeSet Q, (0 : ℝ) ^ 2 ∂MeasureTheory.volume = 0 := by + norm_num + rw [hzero, zero_add] + change + (4 * + (3 * ((d : ℝ) * + (K / (((7 / 12 : ℝ) - (1 / 2 : ℝ)) * cubeRadius Q)) ^ 2) * + (2 * a + 2 * + (((d : ℝ) * + (K / (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Q)) ^ 2) * b)))) ^ + (1 / (2 : ℝ)) ≤ + harmonicInteriorHessianEnergyCoreConstant d * L⁻¹ * G + rw [← Real.sqrt_eq_rpow] + rw [hKinner, hKouter] + apply (Real.sqrt_le_iff).2 + constructor + · exact mul_nonneg (mul_nonneg hcore_nonneg (inv_nonneg.mpr hLpos.le)) hG_nonneg + have htarget_nonneg : 0 ≤ + (13824 : ℝ) * (d : ℝ) * K ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * K ^ 2 * C0 ^ 2) := by positivity + have hinv_sq : L⁻¹ ^ 2 * L ^ 2 = 1 := by field_simp [hLpos.ne'] + have hcore_sq : harmonicInteriorHessianEnergyCoreConstant d ^ 2 = + (13824 : ℝ) * (d : ℝ) * K ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * K ^ 2 * C0 ^ 2) := by + have hactual_nonneg : 0 ≤ + (13824 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue ^ 2) := by + simpa [K, C0] using htarget_nonneg + dsimp [harmonicInteriorHessianEnergyCoreConstant] + rw [Real.sq_sqrt hactual_nonneg] + have hX_nonneg : 0 ≤ (d : ℝ) * K ^ 2 := + mul_nonneg (Nat.cast_nonneg d) (sq_nonneg K) + have hLinv_sq_nonneg : 0 ≤ L⁻¹ ^ 2 := sq_nonneg _ + have houter_nonneg : 0 ≤ (1728 : ℝ) * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 := by + positivity + have hinner : + 2 * a + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * b) ≤ + 2 * G ^ 2 + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (L * C0 * G) ^ 2) := by + have hcoeff : 0 ≤ (256 : ℝ) * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 := by positivity + exact add_le_add + (mul_le_mul_of_nonneg_left ha_le (by norm_num)) + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hb_le hcoeff) (by norm_num)) + calc + 4 * (1728 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (2 * a + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * b))) + ≤ 4 * (1728 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (2 * G ^ 2 + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (L * C0 * G) ^ 2))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hinner houter_nonneg) (by norm_num) + _ ≤ (harmonicInteriorHessianEnergyCoreConstant d * L⁻¹ * G) ^ 2 := by + have hcancel : L⁻¹ ^ 2 * (L * C0 * G) ^ 2 = C0 ^ 2 * G ^ 2 := by + calc + L⁻¹ ^ 2 * (L * C0 * G) ^ 2 = + (L⁻¹ ^ 2 * L ^ 2) * (C0 ^ 2 * G ^ 2) := by ring + _ = C0 ^ 2 * G ^ 2 := by rw [hinv_sq, one_mul] + have hupper_eq : + 4 * (1728 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (2 * G ^ 2 + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (L * C0 * G) ^ 2))) = + (13824 : ℝ) * (d : ℝ) * K ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * K ^ 2 * C0 ^ 2) * L⁻¹ ^ 2 * G ^ 2 := by + calc + 4 * (1728 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (2 * G ^ 2 + 2 * (256 * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * + (L * C0 * G) ^ 2))) = + (13824 : ℝ) * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2 * G ^ 2 + + ((13824 : ℝ) * (d : ℝ) * K ^ 2 * L⁻¹ ^ 2) * + ((256 : ℝ) * (d : ℝ) * K ^ 2) * + (L⁻¹ ^ 2 * (L * C0 * G) ^ 2) := by ring + _ = (13824 : ℝ) * (d : ℝ) * K ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * K ^ 2 * C0 ^ 2) * L⁻¹ ^ 2 * G ^ 2 := by + rw [hcancel] + ring + rw [hupper_eq] + rw [show (harmonicInteriorHessianEnergyCoreConstant d * L⁻¹ * G) ^ 2 = + harmonicInteriorHessianEnergyCoreConstant d ^ 2 * L⁻¹ ^ 2 * G ^ 2 by ring, + hcore_sq] + +/-- The fixed-radius construction can be run after mean-zero normalization +and then translated back to the original value representative on the inner +cube. -/ +theorem exists_innerHalf_hasWeakHessianOn_harmonic_same_values + {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (h : WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0)) : + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.toFun = u.toFun ∧ + uS.grad = u.grad ∧ + Nonempty (HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q + (by norm_num : 0 < (1 / 2 : ℝ))).isFiniteMeasure_restrict_volume + have hsub : WeakPoissonEquationOn (openCubeSet Q) u.subAverage (fun _ => 0) := + WeakPoissonEquationOn.subAverage h + obtain ⟨v, hvfun, hvgrad, H, hH⟩ := + exists_innerHalf_hasWeakHessianOn_harmonic (Q := Q) hsub + let c : ℝ := integralAverage (openCubeSet Q) u + let uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)) := v.addConst c + let HS : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS := + HasWeakHessianOn.addConst H c + refine ⟨uS, ?_, ?_, ⟨HS⟩⟩ + · funext x + have hx : v.toFun x = u.subAverage.toFun x := congrFun hvfun x + simp only [uS, H1Function.addConst_apply, c, hx, H1Function.subAverage_apply] + ring + · funext x + calc + uS.grad x = v.grad x := H1Function.grad_addConst v c x + _ = u.subAverage.grad x := congrFun hvgrad x + _ = u.grad x := u.grad_subAverage x + +/-- Dimension-only, scale-correct interior Hessian energy estimate for weakly +harmonic functions. The construction is run on the mean-zero representative +to control the cutoff lower-order term, then its value carrier is translated +back by the original cube average. -/ +theorem exists_harmonic_innerHalf_hessian_energy_bound (d : ℕ) : + ∃ C : ℝ, 0 < C ∧ + ∀ (Q : TriadicCube d) (u : H1Function (openCubeSet Q)), + WeakPoissonEquationOn (openCubeSet Q) u (fun _ => 0) → + ∃ uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)), + uS.toFun = u.toFun ∧ + uS.grad = u.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS, + H.hessianCoordL2NormSum ≤ + C * (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := by + let C : ℝ := 1 + (d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d + refine ⟨C, ?_, ?_⟩ + · dsimp [C, harmonicInteriorHessianEnergyCoreConstant] + nlinarith [sq_nonneg (d : ℝ), Real.sqrt_nonneg + ((13824 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue ^ 2))] + intro Q u h + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (scaledOpenCubeSet Q (1 / 2 : ℝ))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Q + (by norm_num : 0 < (1 / 2 : ℝ))).isFiniteMeasure_restrict_volume + have hsub : WeakPoissonEquationOn (openCubeSet Q) u.subAverage (fun _ => 0) := + WeakPoissonEquationOn.subAverage h + obtain ⟨v, hvfun, hvgrad, H, hH⟩ := + exists_innerHalf_hasWeakHessianOn_harmonic (Q := Q) hsub + let c : ℝ := integralAverage (openCubeSet Q) u + let uS : H1Function (scaledOpenCubeSet Q (1 / 2 : ℝ)) := v.addConst c + let HS : HasWeakHessianOn (scaledOpenCubeSet Q (1 / 2 : ℝ)) uS := + HasWeakHessianOn.addConst H c + refine ⟨uS, ?_, ?_, HS, ?_⟩ + · funext x + have hx : v.toFun x = u.subAverage.toFun x := congrFun hvfun x + simp only [uS, H1Function.addConst_apply, c, hx, H1Function.subAverage_apply] + ring + · funext x + calc + uS.grad x = v.grad x := H1Function.grad_addConst v c x + _ = u.subAverage.grad x := congrFun hvgrad x + _ = u.grad x := u.grad_subAverage x + have hHred : H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d Q u.subAverage (fun _ => 0) i (1 / 2 : ℝ) (7 / 12 : ℝ) + (3 / 4 : ℝ) (7 / 8 : ℝ) + (outerThreeQuarterSevenEighthCutoff Q) := by + refine hH.trans ?_ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound_le_reducedBound + u.subAverage (fun _ => 0) i (outerThreeQuarterSevenEighthCutoff Q) + have hsum : + (∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d Q u.subAverage (fun _ => 0) i (1 / 2 : ℝ) (7 / 12 : ℝ) + (3 / 4 : ℝ) (7 / 8 : ℝ) + (outerThreeQuarterSevenEighthCutoff Q)) ≤ + (d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d * + (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := by + calc + (∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d Q u.subAverage (fun _ => 0) i (1 / 2 : ℝ) (7 / 12 : ℝ) + (3 / 4 : ℝ) (7 / 8 : ℝ) + (outerThreeQuarterSevenEighthCutoff Q)) ≤ + ∑ _i : Fin d, ∑ _j : Fin d, + harmonicInteriorHessianEnergyCoreConstant d * (cubeScaleFactor Q)⁻¹ * + u.gradientCoordL2NormSum := by + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + openCubeInnerQuotientHessianSmoothTestReducedBound_le_harmonic_energy Q u i + _ = (d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d * + (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := by + simp only [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + ring + have hscale_nonneg : 0 ≤ (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := by + exact mul_nonneg (inv_nonneg.mpr (le_of_lt (by + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q] + exact mul_pos (by norm_num) (cubeRadius_pos Q)))) u.gradientCoordL2NormSum_nonneg + have hconst_le : (d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d ≤ C := by + dsimp [C] + linarith [sq_nonneg (d : ℝ), Real.sqrt_nonneg + ((13824 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (1 + (256 : ℝ) * (d : ℝ) * quantitativeCubeCutoffGradientConst d ^ 2 * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue ^ 2))] + change HS.hessianCoordL2NormSum ≤ C * (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum + calc + HS.hessianCoordL2NormSum = H.hessianCoordL2NormSum := rfl + _ ≤ (d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d * + (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := hHred.trans hsum + _ = ((d : ℝ) ^ 2 * harmonicInteriorHessianEnergyCoreConstant d) * + ((cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum) := by ring + _ ≤ C * ((cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum) := + mul_le_mul_of_nonneg_right hconst_le hscale_nonneg + _ = C * (cubeScaleFactor Q)⁻¹ * u.gradientCoordL2NormSum := by ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorHessianRowTailTransfer.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorHessianRowTailTransfer.lean new file mode 100644 index 0000000000..e200262a08 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorHessianRowTailTransfer.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule + +/-! +# Tail transfer from an interior gradient to a reflected Hessian row + +This file is a purely measure-theoretic bridge. It consumes restricted +almost-everywhere identities supplied by the reflected interior construction; +it does not assert either identity or any PDE property. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- Restricted almost-everywhere equality transports both the square weight +and its norm-threshold set. -/ +private theorem sqWeightedMeasure_tail_inter_eq_of_ae_eq_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B : Set α} {F G : α → E} {a : ℝ} + (hB : MeasurableSet B) (hFG : F =ᵐ[μ.restrict B] G) : + sqWeightedMeasure F μ ({x | a < ‖F x‖} ∩ B) = + sqWeightedMeasure G μ ({x | a < ‖G x‖} ∩ B) := by + have hreplace : + sqWeightedMeasure F μ ({x | a < ‖F x‖} ∩ B) = + sqWeightedMeasure G μ ({x | a < ‖F x‖} ∩ B) := + sqWeightedMeasure_apply_inter_eq_of_ae_eq_restrict hB hFG + have hFG_base : ∀ᵐ x ∂μ, x ∈ B → F x = G x := + (ae_restrict_iff' hB).mp hFG + have hFG_weighted : + ∀ᵐ x ∂sqWeightedMeasure G μ, x ∈ B → F x = G x := + (withDensity_absolutelyContinuous μ _).ae_le hFG_base + have htail : + sqWeightedMeasure G μ ({x | a < ‖F x‖} ∩ B) = + sqWeightedMeasure G μ ({x | a < ‖G x‖} ∩ B) := by + apply measure_congr + filter_upwards [hFG_weighted] with x hx + apply propext + change (a < ‖F x‖ ∧ x ∈ B) ↔ (a < ‖G x‖ ∧ x ∈ B) + by_cases hxB : x ∈ B + · rw [hx hxB] + · constructor + · intro h + exact False.elim (hxB h.2) + · intro h + exact False.elim (hxB h.2) + exact hreplace.trans htail + +/-- Transfer square-weighted tails from the zero-extended gradient on the +half parent to a reflected Hessian row and then to its source row. + +The two restricted a.e. identities are explicit inputs: one identifies the +interior gradient with the reflected row on the half parent, and the other +identifies its zero extension with the source row on the source cube. -/ +theorem openParentGradientExtension_reflectedHessianRow_tail_transfer + {d : ℕ} {m : ℤ} (i : Fin d) (R : Vec d → Vec d) + (hR : AEStronglyMeasurable (fun x => HilbertVec.ofVec (R x)) + (volume.restrict (openCubeSet (originCube d m)))) + (uU : H1Function + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (hUrow : + hilbertifyVecField uU.grad =ᵐ[volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) + (hQsource : + openParentGradientExtension + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) uU =ᵐ[ + volume.restrict (openCubeSet (originCube d m))] + fun x => HilbertVec.ofVec (R x)) : + ∀ a : ℝ, + (sqWeightedMeasure + (openParentGradientExtension + (scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) uU) volume + ({x | a < ‖openParentGradientExtension + (scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) uU x‖} ∩ + openCubeSet (originCube d m)) = + sqWeightedMeasure (fun x => HilbertVec.ofVec (R x)) volume + ({x | a < ‖HilbertVec.ofVec (R x)‖} ∩ + openCubeSet (originCube d m))) ∧ + (sqWeightedMeasure + (openParentGradientExtension + (scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) uU) volume + ({x | a < ‖openParentGradientExtension + (scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) uU x‖} ∩ + scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) ≤ + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x => HilbertVec.ofVec (R x)) volume + ({x | a < ‖HilbertVec.ofVec (R x)‖} ∩ + openCubeSet (originCube d m))) := by + let U : Set (Vec d) := + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let Q : Set (Vec d) := openCubeSet (originCube d m) + let Fext : Vec d → HilbertVec d := openParentGradientExtension U uU + let Fgrad : Vec d → HilbertVec d := hilbertifyVecField uU.grad + let Frow : Vec d → HilbertVec d := fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x) + let Fsource : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (R x) + have hUmeas : MeasurableSet U := + (isOpen_scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)).measurableSet + have hQmeas : MeasurableSet Q := + measurableSet_openCubeSet (originCube d m) + have hUrow' : Fgrad =ᵐ[volume.restrict U] Frow := by + simpa only [Fgrad, Frow, U] using hUrow + have hQsource' : Fext =ᵐ[volume.restrict Q] Fsource := by + simpa only [Fext, Fsource, U, Q] using hQsource + intro a + constructor + · exact sqWeightedMeasure_tail_inter_eq_of_ae_eq_restrict + hQmeas hQsource' + · have hindicator : + sqWeightedMeasure Fext volume ({x | a < ‖Fext x‖} ∩ U) = + sqWeightedMeasure Fgrad volume ({x | a < ‖Fgrad x‖} ∩ U) := by + simpa only [Fext, Fgrad, openParentGradientExtension] using + sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (U := U) (B := U) (f := Fgrad) (a := a) + hUmeas hUmeas (fun _ hx => hx) + have hrow_tail : + sqWeightedMeasure Fgrad volume ({x | a < ‖Fgrad x‖} ∩ U) = + sqWeightedMeasure Frow volume ({x | a < ‖Frow x‖} ∩ U) := + sqWeightedMeasure_tail_inter_eq_of_ae_eq_restrict hUmeas hUrow' + calc + sqWeightedMeasure Fext volume ({x | a < ‖Fext x‖} ∩ U) = + sqWeightedMeasure Fgrad volume ({x | a < ‖Fgrad x‖} ∩ U) := + hindicator + _ = sqWeightedMeasure Frow volume ({x | a < ‖Frow x‖} ∩ U) := + hrow_tail + _ ≤ ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure Fsource volume + ({x | a < ‖Fsource x‖} ∩ Q) := by + simpa only [Frow, Fsource, U, Q] using + reflectedHessianRow_sqWeightedMeasure_innerHalf_tail_le + i R hR + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorLocalInputs.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorLocalInputs.lean new file mode 100644 index 0000000000..5edad5cbaf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorLocalInputs.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeakRestriction + +/-! # Interior Local Inputs -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Local one-ball data from an interior parent solution + +The interior good-`lambda` argument extends a solution gradient and its datum +by zero from the next centered parent cube. On every stopping comparison +parent, this module supplies the inputs of +`sqWeightedMeasure_oneStoppingBall_le`: global `L²` membership, a restricted +solution, almost-everywhere gradient identification, and the restricted weak +divergence equation with the zero-extended datum. + +The construction starts from an arbitrary `H¹` solution on the parent cube. +It uses neither a zero-trace premise nor a reflection factor. + +The generic API works over any open parent set containing the comparison axis +cube. The centered-cube API below is its geometry-specific specialization. +-/ + +/-- The zero extension of a solution gradient from an arbitrary parent set. -/ +def openParentGradientExtension {d : ℕ} (U : Set (Vec d)) + (uU : H1Function U) : Vec d → HilbertVec d := + U.indicator (hilbertifyVecField uU.grad) + +/-- The zero extension of a vector datum from an arbitrary parent set. -/ +def openParentDatumExtension {d : ℕ} (U : Set (Vec d)) + (HU : Vec d → Vec d) : Vec d → Vec d := + U.indicator HU + +/-- Restrict a parent solution to an axis cube contained in its domain. -/ +def openParentLocalSolution {d : ℕ} (U : Set (Vec d)) + (z : Vec d) (L : ℝ) (uU : H1Function U) + (hBU : axisCube z L ⊆ U) : H1Function (axisCube z L) := + uU.restrict (isOpen_axisCube z L) hBU + +/-- Hilbertification commutes with extension by zero from an arbitrary set. -/ +theorem hilbertifyVecField_openParentDatumExtension + {d : ℕ} (U : Set (Vec d)) (HU : Vec d → Vec d) : + hilbertifyVecField (openParentDatumExtension U HU) = + U.indicator (hilbertifyVecField HU) := by + funext y + by_cases hy : y ∈ U + · apply HilbertVec.ext + intro i + simp [hilbertifyVecField, openParentDatumExtension, hy] + · apply HilbertVec.ext + intro i + simp [hilbertifyVecField, openParentDatumExtension, hy] + +/-- An `H¹` solution on an arbitrary open parent set supplies all local inputs +for an axis-cube comparison contained in that parent. -/ +theorem openParent_axisCube_inputs + {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {z : Vec d} {L sigma0 : ℝ} + (hBU : axisCube z L ⊆ U) + (uU : H1Function U) (HU : Vec d → Vec d) + (hHU : MemVectorL2 U HU) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ U → + sigma0 * ∫ y in U, + vecDot (uU.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in U, vecDot (HU y) (euclideanGradient phi y) ∂volume) : + MemLp (openParentGradientExtension U uU) 2 volume ∧ + MemLp (hilbertifyVecField (openParentDatumExtension U HU)) 2 volume ∧ + (openParentGradientExtension U uU =ᵐ[volume.restrict (axisCube z L)] + hilbertifyVecField (openParentLocalSolution U z L uU hBU).grad) ∧ + ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube z L → + sigma0 * ∫ y in axisCube z L, + vecDot ((openParentLocalSolution U z L uU hBU).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in axisCube z L, + vecDot (openParentDatumExtension U HU y) + (euclideanGradient phi y) ∂volume := by + have hUmeas : MeasurableSet U := hU.measurableSet + have hBmeas : MeasurableSet (axisCube z L) := + (isOpen_axisCube z L).measurableSet + constructor + · rw [show openParentGradientExtension U uU = + U.indicator (hilbertifyVecField uU.grad) by rfl, + memLp_indicator_iff_restrict hUmeas] + exact memHilbertVectorL2_hilbertifyVecField uU.grad_memVectorL2 + constructor + · rw [hilbertifyVecField_openParentDatumExtension, + memLp_indicator_iff_restrict hUmeas] + exact memHilbertVectorL2_hilbertifyVecField hHU + constructor + · have hident := indicator_aeEq_of_subset + (μ := volume) (f := hilbertifyVecField uU.grad) hBmeas hBU + simpa only [openParentGradientExtension, openParentLocalSolution, + H1Function.restrict] using hident + intro phi hphi hphi_compact hphi_sub + have hlocal := weakDivergence_restrict_axisCube z L hBU uU HU hweak + phi hphi hphi_compact hphi_sub + have hdatum : + ∫ y in axisCube z L, vecDot (openParentDatumExtension U HU y) + (euclideanGradient phi y) ∂volume = + ∫ y in axisCube z L, + vecDot (HU y) (euclideanGradient phi y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun hBmeas + intro y hy + simp only [openParentDatumExtension] + rw [Set.indicator_of_mem (hBU hy)] + change sigma0 * ∫ y in axisCube z L, + vecDot ((uU.restrict (isOpen_axisCube z L) hBU).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in axisCube z L, vecDot (openParentDatumExtension U HU y) + (euclideanGradient phi y) ∂volume + rw [hdatum] + simpa only [H1Function.restrict] using hlocal + +/-- The zero extension of an interior parent solution's gradient. -/ +def interiorParentGradientExtension {d : ℕ} (m : ℤ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) : + Vec d → HilbertVec d := + openParentGradientExtension (openCubeSet (originCube d (m + 1))) uP + +/-- The zero extension of an interior parent vector datum. -/ +def interiorParentDatumExtension {d : ℕ} (m : ℤ) + (HP : Vec d → Vec d) : Vec d → Vec d := + openParentDatumExtension (openCubeSet (originCube d (m + 1))) HP + +/-- The restriction of an interior parent solution to a stopping comparison +parent. -/ +def interiorParentLocalSolution {d : ℕ} {depth : ℕ} (m : ℤ) + (x : Vec d) (r : ℝ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (hsub : axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) ⊆ openCubeSet (originCube d (m + 1))) : + H1Function (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := + openParentLocalSolution (openCubeSet (originCube d (m + 1))) + (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) uP hsub + +/-- Hilbertification commutes with the interior datum's extension by zero. -/ +theorem hilbertifyVecField_interiorParentDatumExtension + {d : ℕ} (m : ℤ) (HP : Vec d → Vec d) : + hilbertifyVecField (interiorParentDatumExtension m HP) = + (openCubeSet (originCube d (m + 1))).indicator (hilbertifyVecField HP) := by + exact hilbertifyVecField_openParentDatumExtension + (openCubeSet (originCube d (m + 1))) HP + +/-- One interior parent solution and datum supply all local inputs for a +stopping-ball comparison. The local equation is derived by restriction from +the parent equation, with its coefficient and minus sign unchanged. -/ +theorem interiorParent_oneStoppingBall_inputs + {d : ℕ} [NeZero d] {depth : ℕ} {m : ℤ} {sigma0 : ℝ} + {x : Vec d} {r : ℝ} + (hx : x ∈ openCubeSet (originCube d m)) + (hr : 0 < r) + (hcutoff : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (HP : Vec d → Vec d) + (hHP : MemVectorL2 (openCubeSet (originCube d (m + 1))) HP) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ openCubeSet (originCube d (m + 1)) → + sigma0 * ∫ y in openCubeSet (originCube d (m + 1)), + vecDot (uP.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in openCubeSet (originCube d (m + 1)), + vecDot (HP y) (euclideanGradient phi y) ∂volume) : + MemLp (interiorParentGradientExtension m uP) 2 volume ∧ + MemLp (hilbertifyVecField (interiorParentDatumExtension m HP)) 2 volume ∧ + (interiorParentGradientExtension m uP =ᵐ[volume.restrict + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))] + hilbertifyVecField + (interiorParentLocalSolution (depth := depth) m x r uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff)).grad) ∧ + ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) → + sigma0 * ∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot + ((interiorParentLocalSolution (depth := depth) m x r uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff)).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (interiorParentDatumExtension m HP y) + (euclideanGradient phi y) ∂volume := by + simpa only [interiorParentGradientExtension, interiorParentDatumExtension, + interiorParentLocalSolution] using + openParent_axisCube_inputs + (U := openCubeSet (originCube d (m + 1))) + (z := stoppingComparisonParentCorner x r depth) + (L := stoppingComparisonParentSide r depth) + (sigma0 := sigma0) (isOpen_openCubeSet (originCube d (m + 1))) + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff) uP HP hHP hweak + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorOneLevelTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorOneLevelTail.lean new file mode 100644 index 0000000000..4e033e77b3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorOneLevelTail.lean @@ -0,0 +1,216 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalStoppingFamily +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaTailControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliAssembly + +/-! +# An interior one-level cube good-`lambda` inequality + +This file assembles the global stopping family, the local one-ball comparison, +and the Vitali cover for a solution on an arbitrary open parent set. The +comparison-parent containment and the global energy cutoff remain explicit +internal hypotheses. Consequently, the result is an internal conditional +assembly theorem, not a source-facing Calderon--Zygmund estimate. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-- The one-level good-`lambda` tail bound for a solution on an open parent. + +Stopping radii and the Vitali subfamily are constructed internally. Every +local PDE input is obtained by restricting the parent weak equation. -/ +theorem sqWeightedMeasure_openParent_oneLevel_tail_originCube + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (hq : 2 < q.exponent.toReal) {U : Set (Vec d)} (hU : IsOpen U) + {m : ℤ} {sigma0 eps M level : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) (uU : H1Function U) (H : Vec d → Vec d) + (hH : MemVectorL2 U H) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ U → + sigma0 * ∫ y in U, + vecDot (uU.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in U, vecDot (H y) (euclideanGradient phi y) ∂volume) + (hparent : ∀ x ∈ openCubeSet (originCube d m), ∀ {r : ℝ}, + 0 < r → + r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth) → + axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) ⊆ U) + (hcutoff : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖openParentGradientExtension U uU y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, + ‖(sigma0⁻¹ • hilbertifyVecField + (openParentDatumExtension U H)) y‖ ^ (2 : ℕ) ∂volume)) < level) : + sqWeightedMeasure (openParentGradientExtension U uU) volume + ({x | M * level < ‖openParentGradientExtension U uU x‖} ∩ + openCubeSet (originCube d m)) ≤ + oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (openParentGradientExtension U uU) volume + ({x | level / 2 < ‖openParentGradientExtension U uU x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure + (sigma0⁻¹ • hilbertifyVecField (openParentDatumExtension U H)) volume + ({x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField + (openParentDatumExtension U H)) x‖} ∩ U)) := by + let Q : Set (Vec d) := openCubeSet (originCube d m) + let F : Vec d → HilbertVec d := openParentGradientExtension U uU + let Hext : Vec d → Vec d := openParentDatumExtension U H + let gext : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField Hext + have hUmeas : MeasurableSet U := hU.measurableSet + have hF : MemLp F 2 volume := by + change MemLp (U.indicator (hilbertifyVecField uU.grad)) 2 volume + rw [memLp_indicator_iff_restrict hUmeas] + exact memHilbertVectorL2_hilbertifyVecField uU.grad_memVectorL2 + have hHext : MemLp (hilbertifyVecField Hext) 2 volume := by + rw [show hilbertifyVecField Hext = + U.indicator (hilbertifyVecField H) by + simpa only [Hext] using + hilbertifyVecField_openParentDatumExtension U H] + rw [memLp_indicator_iff_restrict hUmeas] + exact memHilbertVectorL2_hilbertifyVecField hH + have hgext : MemLp gext 2 volume := hHext.const_smul sigma0⁻¹ + have hcutoff' : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖F y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, ‖gext y‖ ^ (2 : ℕ) ∂volume)) < level := by + simpa only [F, Hext, gext] using hcutoff + have hlevel_pos : 0 < level := + lt_of_le_of_lt (Real.sqrt_nonneg _) hcutoff' + let T : Set (Vec d) := {x | M * level < ‖F x‖} ∩ Q + obtain ⟨D, radius, hDnull, hradius⟩ := + exists_globalStoppingFamily depth F gext eps M level hF hgext heps hM + hcutoff' T (by intro x hx; exact hx.1) + let K : ℝ≥0∞ := oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + have hvitali : sqWeightedMeasure F volume (T ∩ D) ≤ + K * oneStoppingBallTailControl F gext eps level U := by + apply measure_le_mul_measure_of_vitali_stopping_family + (sqWeightedMeasure F volume) (oneStoppingBallTailControl F gext eps level) + (T ∩ D) U radius + (cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) 5 K + · intro x hx + exact (hradius x hx).2.1 + · intro x hx + exact (hradius x hx).1 + · norm_num + · intro x hx + obtain ⟨hr, hcutoffx, hstop, hlast⟩ := hradius x hx + have hxQ : x ∈ openCubeSet (originCube d m) := hx.1.2 + have hsub := hparent x hxQ hr hcutoffx + obtain ⟨_hF, _hHext, hlocalF, hlocalweak⟩ := + openParent_axisCube_inputs hU hsub uU H hH hweak + have hball := sqWeightedMeasure_oneStoppingBall_le G hq x hr hsigma0 + heps heps_one (lt_of_lt_of_le zero_lt_one hM) hlevel_pos hcutoffx + F Hext hF hHext + (openParentLocalSolution U (stoppingComparisonParentCorner x (radius x) depth) + (stoppingComparisonParentSide (radius x) depth) uU hsub) + (by simpa only [F] using hlocalF) + (by simpa only [Hext] using hlocalweak) + (by simpa only [gext] using hstop) + (by simpa only [gext] using hlast) + have hmono : + sqWeightedMeasure F volume ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ Metric.closedBall x (5 * radius x)) := by + apply measure_mono + intro y hy + exact ⟨hy.1.1.1, hy.2⟩ + calc + sqWeightedMeasure F volume + ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ + Metric.closedBall x (5 * radius x)) := hmono + _ ≤ K * + (sqWeightedMeasure F volume + ({y | level / 2 < ‖F y‖} ∩ Metric.closedBall x (radius x)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({y | eps * level / 2 < ‖gext y‖} ∩ + Metric.closedBall x (radius x))) := by + simpa only [K, gext] using hball + _ = K * oneStoppingBallTailControl F gext eps level + (Metric.closedBall x (radius x)) := by + rw [oneStoppingBallTailControl_apply F gext eps level + measurableSet_closedBall] + · intro y hy + rcases Set.mem_iUnion₂.mp hy with ⟨x, hx, hyx⟩ + obtain ⟨hr, hcutoffx, _hstop, _hlast⟩ := hradius x hx + have hsub := hparent x hx.1.2 hr hcutoffx + apply hsub + rw [stoppingComparisonParent_axisCube_eq_ball x hr depth] + have hpow : 1 ≤ (3 : ℝ) ^ depth := one_le_pow₀ (by norm_num) + have hmult : 1 < stoppingComparisonParentMultiplier depth := by + rw [stoppingComparisonParentMultiplier] + nlinarith + exact Metric.closedBall_subset_ball (lt_mul_of_one_lt_left hr hmult) hyx + have hnuD : sqWeightedMeasure F volume Dᶜ = 0 := + MeasureTheory.withDensity_absolutelyContinuous volume _ hDnull + have hTD : sqWeightedMeasure F volume (T ∩ D) = + sqWeightedMeasure F volume T := + MeasureTheory.measure_inter_conull hnuD + have hkappa : oneStoppingBallTailControl F gext eps level U = + sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ U) := + oneStoppingBallTailControl_apply_ambient F gext eps level hUmeas + change sqWeightedMeasure F volume T ≤ + oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ U)) + calc + sqWeightedMeasure F volume T = + sqWeightedMeasure F volume (T ∩ D) := hTD.symm + _ ≤ K * oneStoppingBallTailControl F gext eps level U := hvitali + _ = K * + (sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ U)) := by + rw [hkappa] + _ = oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ U)) := by + rfl + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorParentGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorParentGeometry.lean new file mode 100644 index 0000000000..fe3421a580 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/InteriorParentGeometry.lean @@ -0,0 +1,105 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalParentGeometry + +/-! # Interior Parent Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace CubeCalderonZygmund + +open Set + +/-! +# Stopping comparisons inside the half-radius reflected parent + +The reflected parent construction produces its interior weak Hessian on the +half-scaled open cube at scale `m + 1`. The standard stopping cutoff already +keeps the comparison-parent radius below half the radius at scale `m`; this +file records that the resulting closed ball, and hence its open axis-cube +realization, lies strictly inside that Hessian domain. +-/ + +/-- A closed ball of radius at most half the radius at scale `m`, centered at +a point strictly inside the scale-`m` cube, lies in the half-scaled open cube +at scale `m + 1`. Strictness at the target boundary comes from the strict +source-cube membership, not from the closed-ball radius bound. -/ +theorem closedBall_subset_scaledOpenCubeSet_originCube_succ_one_div_two_of_mem + {d : ℕ} {m : ℤ} {x : Vec d} {a : ℝ} + (hx : x ∈ openCubeSet (originCube d m)) (ha_nonneg : 0 ≤ a) + (ha : a ≤ cubeRadius (originCube d m) / 2) : + Metric.closedBall x a ⊆ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) := by + intro y hy + have hx' := mem_openCubeSet_originCube_iff.mp hx + have hy' : y ∈ Set.pi Set.univ (fun i : Fin d => Metric.closedBall (x i) a) := by + rw [← closedBall_pi x ha_nonneg] + exact hy + have hscale_pos : 0 < (3 : ℝ) ^ m := by + positivity + have ha' : a ≤ (1 / 4 : ℝ) * (3 : ℝ) ^ m := by + calc + a ≤ cubeRadius (originCube d m) / 2 := ha + _ = (1 / 4 : ℝ) * (3 : ℝ) ^ m := by + simp only [cubeRadius, cubeScaleFactor, originCube] + ring + intro i + have hyi := hy' i (by simp) + change y i ∈ Metric.closedBall (x i) a at hyi + rw [Real.closedBall_eq_Icc] at hyi + change + |y i - cubeCenter (originCube d (m + 1)) i| < + (1 / 2 : ℝ) * cubeRadius (originCube d (m + 1)) + simp only [cubeCenter, originCube, Pi.zero_apply, Int.cast_zero, zero_mul, + sub_zero, cubeRadius, cubeScaleFactor] + rw [abs_lt] + have hparent_scale : (3 : ℝ) ^ (m + 1) = (3 : ℝ) ^ m * 3 := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + norm_num + rw [hparent_scale] + constructor <;> nlinarith [(hx' i).1, (hx' i).2, hyi.1, hyi.2] + +/-- Under the standard cutoff, the closed stopping-comparison parent lies in +the half-scaled open cube on which the reflected solution's weak Hessian is +constructed. -/ +theorem stoppingComparisonParent_closedBall_subset_scaledOpenCubeSet_originCube_succ_one_div_two + {d : ℕ} {m : ℤ} {x : Vec d} {r : ℝ} (depth : ℕ) + (hx : x ∈ openCubeSet (originCube d m)) (hr_nonneg : 0 ≤ r) + (hcutoff : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) : + Metric.closedBall x (stoppingComparisonParentMultiplier depth * r) ⊆ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) := by + apply closedBall_subset_scaledOpenCubeSet_originCube_succ_one_div_two_of_mem hx + · exact mul_nonneg (by simp [stoppingComparisonParentMultiplier]) hr_nonneg + · exact stoppingComparisonParentRadius_le_half_cubeRadius_of_le depth hcutoff + +/-- Under the standard cutoff, the open axis-cube realization of the stopping +comparison parent lies in the half-scaled reflected-parent Hessian domain. -/ +theorem stoppingComparisonParent_axisCube_subset_scaledOpenCubeSet_originCube_succ_one_div_two + {d : ℕ} {m : ℤ} {x : Vec d} {r : ℝ} (depth : ℕ) + (hx : x ∈ openCubeSet (originCube d m)) (hr_pos : 0 < r) + (hcutoff : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) : + axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) ⊆ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) := by + rw [stoppingComparisonParent_axisCube_eq_ball x hr_pos depth] + exact Metric.ball_subset_closedBall.trans + (stoppingComparisonParent_closedBall_subset_scaledOpenCubeSet_originCube_succ_one_div_two + depth hx hr_pos.le hcutoff) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalComparisonBridges.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalComparisonBridges.lean new file mode 100644 index 0000000000..b971bc01a6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalComparisonBridges.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeNormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalHarmonicReplacement +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail + +/-! # Local Comparison Bridges -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Local Hilbert-vector bridges for the comparison step + +The local harmonic replacement is formulated with the weak PDE datum in the +plain `Vec d` carrier, while the good-`lambda` tails are Hilbert-vector valued. +This module records the exact restriction, norm, and a.e.-transport bridges +between those two interfaces. In particular, the inverse Hilbert-vector map +is used only to prepare the weak datum, so no dimension factor is introduced +there. +-/ + +/-- A globally square-integrable Hilbert-vector realization yields an `L²` +plain-vector datum on every local set. -/ +theorem memVectorL2_of_memLp_hilbertifyVecField + {d : ℕ} {B : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemLp (hilbertifyVecField H) 2 volume) : + MemVectorL2 B H := by + let T : HilbertVec d →L[ℝ] Vec d := + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap + simpa [MemVectorL2, volumeMeasureOn, hilbertifyVecField, Function.comp_def, T] using + T.comp_memLp' (hH.restrict B) + +/-- The local Hilbert-valued field inherits square integrability by measure +restriction. -/ +theorem memHilbertVectorL2_restrict_of_memLp_hilbertifyVecField + {d : ℕ} {B : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemLp (hilbertifyVecField H) 2 volume) : + MemHilbertVectorL2 B (hilbertifyVecField H) := + hH.restrict B + +/-- The norm of the Hilbert-vector `L²` representative is exactly the real +value of the Hilbert-valued `eLpNorm`. -/ +theorem norm_toHilbertVectorL2OfVecField_eq_eLpNorm_toReal + {d : ℕ} {B : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemVectorL2 B H) : + ‖toHilbertVectorL2OfVecField hH‖ = + (eLpNorm (hilbertifyVecField H) 2 (volume.restrict B)).toReal := by + exact Lp.norm_toLp _ (memHilbertVectorL2_hilbertifyVecField hH) + +private theorem eLpNorm_two_rpow_eq_lintegral_enorm + {α E : Type*} [MeasurableSpace α] [ENorm E] + (μ : Measure α) (F : α → E) : + (eLpNorm F 2 μ) ^ (2 : ℝ) = ∫⁻ x, ‖F x‖ₑ ^ (2 : ℝ) ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num)] + rw [← ENNReal.rpow_mul] + norm_num + +/-- The squared local Hilbert `L²` norm is the finite real value of its raw +squared norm integral. -/ +theorem norm_sq_toHilbertVectorL2OfVecField_eq_lintegral_enorm + {d : ℕ} {B : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemVectorL2 B H) : + ‖toHilbertVectorL2OfVecField hH‖ ^ (2 : ℕ) = + (∫⁻ x in B, ‖hilbertifyVecField H x‖ₑ ^ (2 : ℝ) ∂volume).toReal := by + let hHH : MemHilbertVectorL2 B (hilbertifyVecField H) := + memHilbertVectorL2_hilbertifyVecField hH + have hpow := eLpNorm_two_rpow_eq_lintegral_enorm (volume.restrict B) + (hilbertifyVecField H) + calc + ‖toHilbertVectorL2OfVecField hH‖ ^ (2 : ℕ) = + (eLpNorm (hilbertifyVecField H) 2 (volume.restrict B)).toReal ^ (2 : ℕ) := by + rw [norm_toHilbertVectorL2OfVecField_eq_eLpNorm_toReal hH] + _ = ((eLpNorm (hilbertifyVecField H) 2 (volume.restrict B)) ^ (2 : ℝ)).toReal := by + rw [← ENNReal.toReal_rpow] + norm_num + _ = (∫⁻ x in B, ‖hilbertifyVecField H x‖ₑ ^ (2 : ℝ) ∂volume).toReal := by + rw [hpow] + +/-- The Hilbert-valued local `eLpNorm` in the preceding bridge is finite. -/ +theorem eLpNorm_hilbertifyVecField_restrict_lt_top + {d : ℕ} {B : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemVectorL2 B H) : + eLpNorm (hilbertifyVecField H) 2 (volume.restrict B) < ∞ := + (memHilbertVectorL2_hilbertifyVecField hH).eLpNorm_lt_top + +/-- Restricted a.e. equality transports the square-weighted measure built +from the two local representatives. -/ +theorem sqWeightedMeasure_eq_of_ae_eq_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B : Set α} {F G : α → E} + (hFG : F =ᵐ[μ.restrict B] G) : + sqWeightedMeasure F (μ.restrict B) = sqWeightedMeasure G (μ.restrict B) := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards [hFG] with x hx + rw [hx] + +/-- On a measurable local set, restricted a.e. equality transports the +original square-weighted measure on every subset of that set. -/ +theorem sqWeightedMeasure_apply_inter_eq_of_ae_eq_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B T : Set α} (hB : MeasurableSet B) {F G : α → E} + (hFG : F =ᵐ[μ.restrict B] G) : + sqWeightedMeasure F μ (T ∩ B) = sqWeightedMeasure G μ (T ∩ B) := by + have hlocal : sqWeightedMeasure F (μ.restrict B) = sqWeightedMeasure G (μ.restrict B) := + sqWeightedMeasure_eq_of_ae_eq_restrict hFG + have hF : sqWeightedMeasure F (μ.restrict B) T = sqWeightedMeasure F μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x => ENNReal.ofReal (‖F x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x => ENNReal.ofReal (‖F x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + have hG : sqWeightedMeasure G (μ.restrict B) T = sqWeightedMeasure G μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x => ENNReal.ofReal (‖G x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x => ENNReal.ofReal (‖G x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + calc + sqWeightedMeasure F μ (T ∩ B) = sqWeightedMeasure F (μ.restrict B) T := hF.symm + _ = sqWeightedMeasure G (μ.restrict B) T := by rw [hlocal] + _ = sqWeightedMeasure G μ (T ∩ B) := hG + +/-- A local norm-power lintegral is invariant under restricted a.e. equality. -/ +theorem local_lintegral_norm_rpow_eq_of_ae_eq_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B : Set α} {F G : α → E} (q : ℝ) + (hFG : F =ᵐ[μ.restrict B] G) : + (∫⁻ x in B, ENNReal.ofReal (‖F x‖ ^ q) ∂μ) = + ∫⁻ x in B, ENNReal.ofReal (‖G x‖ ^ q) ∂μ := by + apply lintegral_congr_ae + filter_upwards [hFG] with x hx + rw [hx] + +/-- The local squared difference integral is invariant when its first field +is replaced by a restricted-a.e.-equal representative. -/ +theorem local_lintegral_sub_norm_sq_eq_of_ae_eq_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B : Set α} {F G V : α → E} + (hFG : F =ᵐ[μ.restrict B] G) : + (∫⁻ x in B, ENNReal.ofReal (‖F x - V x‖ ^ (2 : ℕ)) ∂μ) = + ∫⁻ x in B, ENNReal.ofReal (‖G x - V x‖ ^ (2 : ℕ)) ∂μ := by + apply lintegral_congr_ae + filter_upwards [hFG] with x hx + rw [hx] + +/-- Minkowski's triangle inequality on the normalized measure of an axis +cube, in the Hilbert-valued form consumed by the comparison argument. -/ +theorem axisCubeNormalized_eLpNorm_two_add_le + {d : ℕ} (z : Vec d) (L : ℝ) {F G : Vec d → HilbertVec d} + (hF : AEStronglyMeasurable F (axisCubeNormalizedMeasure z L)) + (hG : AEStronglyMeasurable G (axisCubeNormalizedMeasure z L)) : + eLpNorm (F + G) 2 (axisCubeNormalizedMeasure z L) ≤ + eLpNorm F 2 (axisCubeNormalizedMeasure z L) + + eLpNorm G 2 (axisCubeNormalizedMeasure z L) := + eLpNorm_add_le hF hG (by norm_num) + +/-- Scalar multiplication has its exact expected effect on the normalized +axis-cube Hilbert `L²` `eLpNorm`. -/ +theorem axisCubeNormalized_eLpNorm_two_const_smul + {d : ℕ} (z : Vec d) (L c : ℝ) (F : Vec d → HilbertVec d) : + eLpNorm (c • F) 2 (axisCubeNormalizedMeasure z L) = + ‖c‖ₑ * eLpNorm F 2 (axisCubeNormalizedMeasure z L) := + eLpNorm_const_smul c F 2 _ + +/-- The corresponding triangle inequality for the typed local Hilbert `L²` +representatives of two vector fields on an axis cube. -/ +theorem norm_toHilbertVectorL2OfVecField_add_le_axisCube + {d : ℕ} (z : Vec d) (L : ℝ) {F G : Vec d → Vec d} + (hF : MemVectorL2 (axisCube z L) F) (hG : MemVectorL2 (axisCube z L) G) : + ‖toHilbertVectorL2OfVecField (hF.add hG)‖ ≤ + ‖toHilbertVectorL2OfVecField hF‖ + ‖toHilbertVectorL2OfVecField hG‖ := by + rw [toHilbertVectorL2OfVecField_add hF hG] + exact norm_add_le _ _ + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalHarmonicReplacement.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalHarmonicReplacement.lean new file mode 100644 index 0000000000..76b1291f65 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalHarmonicReplacement.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H10Adjoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior + +/-! # Local Harmonic Replacement -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Local harmonic replacement on axis cubes + +This file constructs the zero-trace correction for a scalar constant-coefficient +divergence equation. Subtracting the correction from the original function +produces a harmonic remainder, while direct testing by the correction gives the +dimension-free Hilbert-vector energy estimate used in the good-lambda argument. +-/ + +/-- A local scalar divergence equation on an axis cube admits a zero-trace +correction with the same equation. The remainder is harmonic, and the +correction has the sharp Hilbert-vector energy bound with no dimension loss. -/ +theorem exists_local_harmonic_replacement_axisCube + {d : ℕ} [NeZero d] (z : Vec d) {L sigma0 : ℝ} + (hL : 0 < L) (hsigma0 : 0 < sigma0) + (u : H1Function (axisCube z L)) {h : Vec d → Vec d} + (hh : MemVectorL2 (axisCube z L) h) + (hweak : + ∀ φ : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → + tsupport φ ⊆ axisCube z L → + sigma0 * + ∫ x in axisCube z L, + vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in axisCube z L, + vecDot (h x) (euclideanGradient φ x) + ∂MeasureTheory.volume) : + ∃ w : H10Function (axisCube z L), + (∀ ψ : H10Function (axisCube z L), + sigma0 * + ∫ x in axisCube z L, + vecDot (w.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in axisCube z L, + vecDot (h x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume) ∧ + WeakPoissonEquationOn (axisCube z L) (u - w.toH1Function) 0 ∧ + ‖w.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hh‖ := by + let U : Set (Vec d) := axisCube z L + have hUgeom : IsOpenBoundedConvexDomain U := by + simpa [U] using isOpenBoundedConvexDomain_axisCube z L + obtain ⟨w, hw_divergence, hw_energy⟩ := + exists_axisCubeScalarDivergenceSolution z hL hsigma0 h hh + have hharmonic : WeakPoissonEquationOn U (u - w.toH1Function) 0 := by + intro φ hφ hφ_compact hφ_sub + let ψ : H10Function U := + H10Function.ofContDiff hUgeom.isOpen hφ hφ_compact hφ_sub + have hu_test : + sigma0 * + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in U, vecDot (h x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + simpa [U] using hweak φ hφ hφ_compact (by simpa [U] using hφ_sub) + have hw_test : + sigma0 * + ∫ x in U, + vecDot (w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in U, vecDot (h x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + simpa [ψ, H10Function.ofContDiff, H1Function.ofContDiff, + euclideanGradient, euclideanCoordDeriv] using! hw_divergence ψ + have heq : + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + apply (mul_left_cancel₀ hsigma0.ne') + exact hu_test.trans hw_test.symm + have hu_int : + IntegrableOn (fun x => vecDot (u.grad x) (euclideanGradient φ x)) U := by + have hψgrad : ψ.toH1Function.grad = euclideanGradient φ := by + rfl + rw [← hψgrad] + exact integrableOn_vecDot_of_memVectorL2 + u.grad_memVectorL2 ψ.toH1Function.grad_memVectorL2 + have hw_int : + IntegrableOn + (fun x => vecDot (w.toH1Function.grad x) (euclideanGradient φ x)) U := by + have hψgrad : ψ.toH1Function.grad = euclideanGradient φ := by + rfl + rw [← hψgrad] + exact integrableOn_vecDot_of_memVectorL2 + w.toH1Function.grad_memVectorL2 ψ.toH1Function.grad_memVectorL2 + calc + ∫ x in U, + vecDot ((u - w.toH1Function).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, + (vecDot (u.grad x) (euclideanGradient φ x) - + vecDot (w.toH1Function.grad x) (euclideanGradient φ x)) + ∂MeasureTheory.volume := by + congr with x + simp [sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + _ = + (∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) - + ∫ x in U, + vecDot (w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := + MeasureTheory.integral_sub hu_int hw_int + _ = 0 := sub_eq_zero.mpr heq + _ = ∫ x in U, (fun _ : Vec d => (0 : ℝ)) x * φ x + ∂MeasureTheory.volume := by simp + refine ⟨w, ?_, hharmonic, ?_⟩ + · simpa [U] using hw_divergence + · simpa [U] using hw_energy + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalScaledDatumEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalScaledDatumEnergy.lean new file mode 100644 index 0000000000..34304ca236 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalScaledDatumEnergy.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalComparisonBridges + +/-! # Local Scaled Datum Energy -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Normalized energy bookkeeping for the scaled comparison datum + +The local harmonic-replacement construction controls its zero-trace correction +in the raw Hilbert `L²` realization. This file transports that estimate to the +normalized measure of the same axis cube. Both sides acquire exactly the same +normalizing factor, so the datum is naturally the scaled field +`sigma0⁻¹ • hilbertifyVecField H`; in particular no volume or dimension factor +is introduced. +-/ + +private theorem axisCube_normalization_factor_ne_zero + {d : ℕ} (L : ℝ) (hL : 0 < L) : + ENNReal.ofReal ((L ^ d)⁻¹) ≠ 0 := by + exact ne_of_gt (ENNReal.ofReal_pos.mpr (inv_pos.mpr (pow_pos hL _))) + +/-- The raw restricted Hilbert `L²` norm of an `H¹` gradient is exactly its +Hilbert-valued `eLpNorm`. -/ +theorem eLpNorm_hilbertify_grad_two_eq_ofReal_norm_gradToHilbertVectorL2 + {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + eLpNorm (hilbertifyVecField u.grad) 2 (volume.restrict U) = + ENNReal.ofReal ‖u.gradToHilbertVectorL2‖ := by + let hu : MemHilbertVectorL2 U (hilbertifyVecField u.grad) := + memHilbertVectorL2_hilbertifyVecField u.grad_memVectorL2 + calc + eLpNorm (hilbertifyVecField u.grad) 2 (volume.restrict U) = + ‖hu.toLp (hilbertifyVecField u.grad)‖ₑ := (Lp.enorm_toLp hu).symm + _ = ENNReal.ofReal ‖hu.toLp (hilbertifyVecField u.grad)‖ := + (ofReal_norm _).symm + _ = ENNReal.ofReal ‖u.gradToHilbertVectorL2‖ := by + rfl + +/-- The raw restricted Hilbert `L²` norm of a plain vector datum is exactly +the `eLpNorm` of its Hilbert realization. -/ +theorem eLpNorm_hilbertifyVecField_two_eq_ofReal_norm_toHilbertVectorL2 + {d : ℕ} {U : Set (Vec d)} {H : Vec d → Vec d} + (hH : MemVectorL2 U H) : + eLpNorm (hilbertifyVecField H) 2 (volume.restrict U) = + ENNReal.ofReal ‖toHilbertVectorL2OfVecField hH‖ := by + let hHH : MemHilbertVectorL2 U (hilbertifyVecField H) := + memHilbertVectorL2_hilbertifyVecField hH + calc + eLpNorm (hilbertifyVecField H) 2 (volume.restrict U) = + ‖hHH.toLp (hilbertifyVecField H)‖ₑ := (Lp.enorm_toLp hHH).symm + _ = ENNReal.ofReal ‖hHH.toLp (hilbertifyVecField H)‖ := + (ofReal_norm _).symm + _ = ENNReal.ofReal ‖toHilbertVectorL2OfVecField hH‖ := by + rfl + +/-- On a positive axis cube, the local harmonic-replacement energy estimate +becomes the exact normalized `L²` estimate for the datum scaled by +`sigma0⁻¹`. The normalizing volume factor is common to both sides and hence +cancels without a dimension loss. -/ +theorem axisCubeNormalized_eLpNorm_harmonicCorrection_le_scaledDatum + {d : ℕ} (z : Vec d) {L sigma0 : ℝ} (hL : 0 < L) (hsigma0 : 0 < sigma0) + (w : H1Function (axisCube z L)) {H : Vec d → Vec d} + (hH : MemVectorL2 (axisCube z L) H) + (henergy : ‖w.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hH‖) : + eLpNorm (hilbertifyVecField w.grad) 2 (axisCubeNormalizedMeasure z L) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (axisCubeNormalizedMeasure z L) := by + let U : Set (Vec d) := axisCube z L + let c : ℝ≥0∞ := ENNReal.ofReal ((L ^ d)⁻¹) + have hc : c ≠ 0 := by + simpa only [c] using axisCube_normalization_factor_ne_zero (d := d) L hL + have hraw : + eLpNorm (hilbertifyVecField w.grad) 2 (volume.restrict U) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 (volume.restrict U) := by + rw [MeasureTheory.eLpNorm_const_smul, + eLpNorm_hilbertify_grad_two_eq_ofReal_norm_gradToHilbertVectorL2, + eLpNorm_hilbertifyVecField_two_eq_ofReal_norm_toHilbertVectorL2 hH] + rw [← ofReal_norm, Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ← ENNReal.ofReal_mul (inv_nonneg.mpr hsigma0.le)] + exact ENNReal.ofReal_le_ofReal henergy + change eLpNorm (hilbertifyVecField w.grad) 2 (axisCubeNormalizedMeasure z L) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 (axisCubeNormalizedMeasure z L) + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict z L hL] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_zero hc, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero hc] + exact mul_le_mul_right hraw _ + +/-- A Hilbert-vector `L²` field on an axis cube is also `L²` for its +normalized measure. This is only a finite rescaling of the restricted volume +measure. -/ +theorem memHilbertVectorL2_axisCubeNormalizedMeasure + {d : ℕ} (z : Vec d) {L : ℝ} (hL : 0 < L) + {F : Vec d → HilbertVec d} + (hF : MemHilbertVectorL2 (axisCube z L) F) : + MemLp F 2 (axisCubeNormalizedMeasure z L) := by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict z L hL] + exact hF.smul_measure ENNReal.ofReal_ne_top + +/-- Minkowski's inequality in the normalized measure of a cube, with local +`L²` witnesses supplying the measurability required by the real-variable +argument. -/ +theorem axisCubeNormalized_eLpNorm_two_sub_le + {d : ℕ} (z : Vec d) {L : ℝ} (hL : 0 < L) + {F G : Vec d → HilbertVec d} + (hF : MemHilbertVectorL2 (axisCube z L) F) + (hG : MemHilbertVectorL2 (axisCube z L) G) : + eLpNorm (F - G) 2 (axisCubeNormalizedMeasure z L) ≤ + eLpNorm F 2 (axisCubeNormalizedMeasure z L) + + eLpNorm G 2 (axisCubeNormalizedMeasure z L) := by + exact eLpNorm_sub_le + (memHilbertVectorL2_axisCubeNormalizedMeasure z hL hF).aestronglyMeasurable + (memHilbertVectorL2_axisCubeNormalizedMeasure z hL hG).aestronglyMeasurable + (by norm_num) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeakRestriction.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeakRestriction.lean new file mode 100644 index 0000000000..b78b84db2e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeakRestriction.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ + +/-! # Local Weak Restriction -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Restricting weak divergence equations to an interior axis cube + +The weak equation is originally posed on an ambient open set. A test whose +topological support lies in an axis subcube has zero Euclidean gradient off +that subcube, so both flux pairings have exactly the same set integral on the +subcube and on the ambient set. This is the support argument needed to pass a +parent-cube equation to the comparison cube; it does not assume a second, +local PDE. +-/ + +/-- Restrict a scalar weak divergence equation to an interior open axis cube. + +The restricted function has definitionally the same gradient. The conclusion +keeps the coefficient and sign of the parent equation verbatim; its only new +input is geometric containment of the subcube in the ambient domain. -/ +theorem weakDivergence_restrict_axisCube + {d : ℕ} {U : Set (Vec d)} (z : Vec d) (L : ℝ) + (hBU : axisCube z L ⊆ U) {sigma0 : ℝ} + (u : H1Function U) (H : Vec d → Vec d) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → tsupport phi ⊆ U → + sigma0 * ∫ y in U, vecDot (u.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in U, vecDot (H y) (euclideanGradient phi y) ∂volume) : + ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube z L → + sigma0 * ∫ y in axisCube z L, + vecDot ((u.restrict (isOpen_axisCube z L) hBU).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in axisCube z L, + vecDot (H y) (euclideanGradient phi y) ∂volume := by + intro phi hphi hphi_compact hphi_sub + have hphi_subU : tsupport phi ⊆ U := hphi_sub.trans hBU + have hparent := hweak phi hphi hphi_compact hphi_subU + have hzeroLeftB : ∀ y, y ∉ axisCube z L → + vecDot (u.grad y) (euclideanGradient phi y) = 0 := by + intro y hyB + have hySupp : y ∉ tsupport phi := fun hy => hyB (hphi_sub hy) + simp [euclideanGradient_eq_zero_of_notMem_tsupport hySupp, vecDot_zero_right] + have hzeroLeftU : ∀ y, y ∉ U → + vecDot (u.grad y) (euclideanGradient phi y) = 0 := by + intro y hyU + exact hzeroLeftB y fun hyB => hyU (hBU hyB) + have hzeroRightB : ∀ y, y ∉ axisCube z L → + vecDot (H y) (euclideanGradient phi y) = 0 := by + intro y hyB + have hySupp : y ∉ tsupport phi := fun hy => hyB (hphi_sub hy) + simp [euclideanGradient_eq_zero_of_notMem_tsupport hySupp, vecDot_zero_right] + have hzeroRightU : ∀ y, y ∉ U → + vecDot (H y) (euclideanGradient phi y) = 0 := by + intro y hyU + exact hzeroRightB y fun hyB => hyU (hBU hyB) + have hleft : + ∫ y in axisCube z L, vecDot (u.grad y) (euclideanGradient phi y) ∂volume = + ∫ y in U, vecDot (u.grad y) (euclideanGradient phi y) ∂volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroLeftB, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroLeftU] + have hright : + ∫ y in axisCube z L, vecDot (H y) (euclideanGradient phi y) ∂volume = + ∫ y in U, vecDot (H y) (euclideanGradient phi y) ∂volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroRightB, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroRightU] + simpa only [H1Function.restrict, hleft, hright] using hparent + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTail.lean new file mode 100644 index 0000000000..4db6cd1a52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTail.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeightedLayerCake + +/-! # Local Weighted Tail -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- The defining density of `sqWeightedMeasure`, on sets measurable up to a +`μ`-null set. -/ +theorem sqWeightedMeasure_apply₀ {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] {μ : Measure α} (f : α → E) {s : Set α} + (hs : NullMeasurableSet s μ) : + sqWeightedMeasure f μ s = + ∫⁻ x in s, ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ∂μ := by + exact MeasureTheory.withDensity_apply₀ _ hs + +private theorem sq_le_tail_split {E : Type*} [NormedAddCommGroup E] + {f v : E} {r a : ℝ} (hr : 2 < r) (ha : 0 < a) : + (if a < ‖f‖ then ‖f‖ ^ (2 : ℕ) else 0) ≤ + 2 * (a / 2) ^ (2 - r) * ‖v‖ ^ r * + (if a / 2 < ‖v‖ then 1 else 0) + + 6 * ‖f - v‖ ^ (2 : ℕ) := by + have htri : ‖f‖ ≤ ‖v‖ + ‖f - v‖ := by + calc + ‖f‖ = ‖v + (f - v)‖ := by congr 1; abel + _ ≤ ‖v‖ + ‖f - v‖ := norm_add_le _ _ + by_cases hf : a < ‖f‖ + · rw [if_pos hf] + by_cases hv : a / 2 < ‖v‖ + · rw [if_pos hv] + have hhalf : 0 < a / 2 := by linarith + have hv_pos : 0 < ‖v‖ := hhalf.trans hv + have hpow : ‖v‖ ^ (2 : ℝ) ≤ (a / 2) ^ (2 - r) * ‖v‖ ^ r := by + have hneg : 2 - r ≤ 0 := by linarith + have hmono : ‖v‖ ^ (2 - r) ≤ (a / 2) ^ (2 - r) := + Real.rpow_le_rpow_of_nonpos hhalf hv.le hneg + have hvr_nonneg : 0 ≤ ‖v‖ ^ r := Real.rpow_nonneg (norm_nonneg _) _ + calc + ‖v‖ ^ (2 : ℝ) = ‖v‖ ^ (2 - r) * ‖v‖ ^ r := by + rw [← Real.rpow_add hv_pos] + congr 1 + ring + _ ≤ (a / 2) ^ (2 - r) * ‖v‖ ^ r := + mul_le_mul_of_nonneg_right hmono hvr_nonneg + have hsq : ‖f‖ ^ (2 : ℕ) ≤ + 2 * ‖v‖ ^ (2 : ℝ) + 2 * ‖f - v‖ ^ (2 : ℕ) := by + have hsq_base : ‖f‖ ^ (2 : ℕ) ≤ (‖v‖ + ‖f - v‖) ^ (2 : ℕ) := + (sq_le_sq₀ (norm_nonneg _) (by positivity)).2 htri + norm_num [Real.rpow_two] + nlinarith [sq_nonneg (‖v‖ - ‖f - v‖)] + nlinarith [hpow, sq_nonneg (‖f - v‖)] + · rw [if_neg hv] + have hv_le : ‖v‖ ≤ a / 2 := le_of_not_gt hv + have hdiff : ‖f‖ / 2 < ‖f - v‖ := by linarith + nlinarith [sq_nonneg (‖f - v‖)] + · rw [if_neg hf] + positivity + +theorem sqWeightedMeasure_tail_le_comparison {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] {μ : Measure α} {B : Set α} (hB : MeasurableSet B) + {f v : α → E} (hf : AEStronglyMeasurable f μ) (hv : AEStronglyMeasurable v μ) + {r a : ℝ} (hr : 2 < r) (ha : 0 < a) : + sqWeightedMeasure f μ ({x | a < ‖f x‖} ∩ B) ≤ + 2 * ENNReal.ofReal ((a / 2) ^ (2 - r)) * + (∫⁻ x in B, ENNReal.ofReal (‖v x‖ ^ r) ∂μ) + + 6 * (∫⁻ x in B, ENNReal.ofReal (‖f x - v x‖ ^ (2 : ℕ)) ∂μ) := by + let T : Set α := {x | a < ‖f x‖} + have hT : NullMeasurableSet T μ := by + simpa [T] using aestronglyMeasurable_const.nullMeasurableSet_lt hf.norm + have hTB : NullMeasurableSet (T ∩ B) μ := hT.inter hB.nullMeasurableSet + let V : α → ℝ≥0∞ := fun x => ENNReal.ofReal (‖v x‖ ^ r) + let D : α → ℝ≥0∞ := fun x => ENNReal.ofReal (‖f x - v x‖ ^ (2 : ℕ)) + let c : ℝ≥0∞ := ENNReal.ofReal ((a / 2) ^ (2 - r)) + have hV_meas : AEMeasurable V μ := + (hv.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + have hD_meas : AEMeasurable D μ := + ((hf.sub hv).norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + have hpoint : (T ∩ B).indicator (fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) ≤ + B.indicator (fun x => 2 * c * V x + 6 * D x) := by + intro x + by_cases hxB : x ∈ B + · rw [Set.indicator_of_mem hxB] + by_cases hxT : x ∈ T + · rw [Set.indicator_of_mem (show x ∈ T ∩ B from ⟨hxT, hxB⟩)] + have hs := sq_le_tail_split (f := f x) (v := v x) hr ha + have hreal : ‖f x‖ ^ (2 : ℕ) ≤ + 2 * ((a / 2) ^ (2 - r)) * ‖v x‖ ^ r + + 6 * ‖f x - v x‖ ^ (2 : ℕ) := by + have hs' : ‖f x‖ ^ (2 : ℕ) ≤ + 2 * ((a / 2) ^ (2 - r)) * ‖v x‖ ^ r * + (if a / 2 < ‖v x‖ then 1 else 0) + + 6 * ‖f x - v x‖ ^ (2 : ℕ) := by + have hfx : a < ‖f x‖ := by simpa [T] using hxT + simpa only [if_pos hfx] using hs + by_cases hv' : a / 2 < ‖v x‖ + · simpa [hv'] using hs' + · rw [if_neg hv'] at hs' + have hvpow : 0 ≤ 2 * ((a / 2) ^ (2 - r)) * ‖v x‖ ^ r := by + positivity + linarith + calc + ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ≤ + ENNReal.ofReal + (2 * ((a / 2) ^ (2 - r)) * ‖v x‖ ^ r + + 6 * ‖f x - v x‖ ^ (2 : ℕ)) := ENNReal.ofReal_le_ofReal hreal + _ = 2 * c * V x + 6 * D x := by + rw [ENNReal.ofReal_add (by positivity) (by positivity), + ENNReal.ofReal_mul (by positivity), ENNReal.ofReal_mul (by positivity), + ENNReal.ofReal_mul (by positivity)] + norm_num [c, V, D] + · rw [Set.indicator_of_notMem (fun h => hxT h.1)] + positivity + · rw [Set.indicator_of_notMem hxB] + by_cases hxT : x ∈ T + · rw [Set.indicator_of_notMem (fun h => hxB h.2)] + · rw [Set.indicator_of_notMem (fun h => hxB h.2)] + rw [sqWeightedMeasure_apply₀ f hTB] + calc + ∫⁻ x in T ∩ B, ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ∂μ = + ∫⁻ x, (T ∩ B).indicator (fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) x ∂μ := + (MeasureTheory.lintegral_indicator₀ hTB _).symm + _ ≤ ∫⁻ x, B.indicator (fun x => 2 * c * V x + 6 * D x) x ∂μ := by + apply lintegral_mono + exact hpoint + _ = ∫⁻ x in B, 2 * c * V x + 6 * D x ∂μ := + MeasureTheory.lintegral_indicator hB _ + _ = 2 * c * (∫⁻ x in B, V x ∂μ) + 6 * (∫⁻ x in B, D x ∂μ) := by + rw [MeasureTheory.lintegral_add_left' + ((hV_meas.const_mul (2 * c)).restrict), MeasureTheory.lintegral_const_mul'' + 6 (hD_meas.restrict), MeasureTheory.lintegral_const_mul'' (2 * c) hV_meas.restrict] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTailRestrict.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTailRestrict.lean new file mode 100644 index 0000000000..efd248149b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/LocalWeightedTailRestrict.lean @@ -0,0 +1,61 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail + +/-! # Local Weighted Tail Restrict -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Local weighted comparison tails + +This is the restriction-stable form of the weighted comparison estimate. It +requires measurability only on the ball (or other local set) under study. +-/ + +/-- The weighted comparison-tail estimate with all measurability assumptions +localized to the measurable set `B`. -/ +theorem sqWeightedMeasure_tail_le_comparison_restrict + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B : Set α} (hB : MeasurableSet B) + {f v : α → E} (hf : AEStronglyMeasurable f (μ.restrict B)) + (hv : AEStronglyMeasurable v (μ.restrict B)) + {r a : ℝ} (hr : 2 < r) (ha : 0 < a) : + sqWeightedMeasure f μ ({x | a < ‖f x‖} ∩ B) ≤ + 2 * ENNReal.ofReal ((a / 2) ^ (2 - r)) * + (∫⁻ x in B, ENNReal.ofReal (‖v x‖ ^ r) ∂μ) + + 6 * (∫⁻ x in B, ENNReal.ofReal (‖f x - v x‖ ^ (2 : ℕ)) ∂μ) := by + let T : Set α := {x | a < ‖f x‖} + have htail := sqWeightedMeasure_tail_le_comparison + (μ := μ.restrict B) (B := Set.univ) MeasurableSet.univ hf hv hr ha + simp only [Set.inter_univ] at htail + have hweight : sqWeightedMeasure f (μ.restrict B) T = + sqWeightedMeasure f μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + rw [hweight] at htail + simpa only [T, MeasureTheory.Measure.restrict_univ] using htail + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann.lean new file mode 100644 index 0000000000..df4567b745 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.EnergyDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionWeakEquation + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/EnergyDuality.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/EnergyDuality.lean new file mode 100644 index 0000000000..6f9a5c7639 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/EnergyDuality.lean @@ -0,0 +1,431 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 + +/-! +# Centered-cube Neumann energy and duality + +This file supplies the `q = 2` energy endpoint and the canonical mean-zero +adjoint used by the below-two Neumann Calderón--Zygmund argument. Coercivity +and solvability are discharged internally from the centered-cube geometry. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume_neumann + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem memVectorL2_openCubeSet_of_cubeEuclideanLpField_two + {d : ℕ} {Q : TriadicCube d} + (h : CubeEuclideanLpField Q FiniteLpExponent.two) : + MemVectorL2 (openCubeSet Q) h.toField := by + have hnormalized : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + simpa only [FiniteLpExponent.two_exponent, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + h.euclideanMemLp + have hrestricted : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (cubeBoundedMeasurableDomain Q).restrictedVolume := + ((cubeBoundedMeasurableDomain Q).memLp_normalizedVolume_iff 2 _).mp hnormalized + have hopen : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (volume.restrict (openCubeSet Q)) := by + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hrestricted + let T : HilbertVec d →L[ℝ] Vec d := + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap + simpa only [MemVectorL2, volumeMeasureOn, Function.comp_def, + HilbertVec.toVec_ofVec, T] using! T.comp_memLp' hopen + +private theorem norm_meanZeroGradToHilbertVectorL2_le_sigmaInv_datum + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + {H : Vec d → Vec d} (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : ∀ psi : H1MeanZeroFunction (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (H x) (psi.toH1Function.grad x) ∂volume) : + ‖u.toH1Function.gradToHilbertVectorL2‖ ≤ + sigma0⁻¹ * ‖toHilbertVectorL2OfVecField hH‖ := by + let G : HilbertVectorL2 (openCubeSet (originCube d m)) := + u.toH1Function.gradToHilbertVectorL2 + let K : HilbertVectorL2 (openCubeSet (originCube d m)) := + toHilbertVectorL2OfVecField hH + have hgrad_integral : + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ∂volume = + ‖G‖ ^ 2 := by + calc + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (u.toH1Function.grad x) ∂volume = + inner ℝ G G := by + simpa [G, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet (originCube d m)) + u.toH1Function.grad_memVectorL2 + u.toH1Function.grad_memVectorL2).symm + _ = ‖G‖ ^ 2 := real_inner_self_eq_norm_sq G + have hpair_integral : + ∫ x in openCubeSet (originCube d m), + vecDot (H x) (u.toH1Function.grad x) ∂volume = inner ℝ K G := by + simpa [K, G, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet (originCube d m)) hH + u.toH1Function.grad_memVectorL2).symm + have henergy := hweak u + rw [hgrad_integral, hpair_integral] at henergy + have henergy_le : sigma0 * ‖G‖ ^ 2 ≤ ‖K‖ * ‖G‖ := by + calc + sigma0 * ‖G‖ ^ 2 = -inner ℝ K G := henergy + _ ≤ |inner ℝ K G| := neg_le_abs _ + _ ≤ ‖K‖ * ‖G‖ := abs_real_inner_le_norm K G + by_cases hGzero : ‖G‖ = 0 + · rw [hGzero] + exact mul_nonneg (inv_nonneg.mpr hsigma0.le) (norm_nonneg K) + · have hGpos : 0 < ‖G‖ := lt_of_le_of_ne (norm_nonneg G) (Ne.symm hGzero) + have hsigmaG : sigma0 * ‖G‖ ≤ ‖K‖ := by + apply le_of_mul_le_mul_right _ hGpos + simpa [pow_two, mul_assoc] using henergy_le + have hdiv : ‖G‖ ≤ ‖K‖ / sigma0 := by + apply (le_div_iff₀ hsigma0).2 + simpa [mul_comm] using hsigmaG + simpa [G, K, div_eq_mul_inv, mul_comm] using hdiv + +private theorem centeredCubeNormalized_eLpNorm_meanZeroGrad_le_scaledDatum + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + {H : Vec d → Vec d} (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : ∀ psi : H1MeanZeroFunction (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (H x) (psi.toH1Function.grad x) ∂volume) : + eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (centeredCubeDomain d m).normalizedVolume := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hc : c ≠ 0 := ne_of_gt (ENNReal.ofReal_pos.mpr + (inv_pos.mpr (cubeVolume_pos (originCube d m)))) + have henergy := + norm_meanZeroGradToHilbertVectorL2_le_sigmaInv_datum hsigma0 u hH hweak + have hraw : + eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (volume.restrict (openCubeSet (originCube d m))) := by + rw [eLpNorm_const_smul, + eLpNorm_hilbertify_grad_two_eq_ofReal_norm_gradToHilbertVectorL2, + eLpNorm_hilbertifyVecField_two_eq_ofReal_norm_toHilbertVectorL2 hH] + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ← ENNReal.ofReal_mul (inv_nonneg.mpr hsigma0.le)] + exact ENNReal.ofReal_le_ofReal henergy + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_neumann] + change eLpNorm (hilbertifyVecField u.toH1Function.grad) 2 + (c • volume.restrict (openCubeSet (originCube d m))) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (c • volume.restrict (openCubeSet (originCube d m))) + rw [eLpNorm_smul_measure_of_ne_zero hc, + eLpNorm_smul_measure_of_ne_zero hc] + exact mul_le_mul_right hraw _ + +/-- The `q = 2` energy estimate for a supplied mean-zero Neumann solution on a +centered cube. The datum is only the normalized Euclidean `L²` field exposed by +the finite-exponent API. -/ +theorem centeredCubeH1MeanZeroScalarDivergence_cz_two + {d : ℕ} [NeZero d] (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) FiniteLpExponent.two) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (hsigma0 : 0 < sigma0) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) : + (centeredCubeDomain d m).normalizedEuclideanLpENorm + FiniteLpExponent.two.exponent u.toH1Function.grad ≤ + (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm + FiniteLpExponent.two.exponent h.toField := by + have hH : MemVectorL2 (openCubeSet (originCube d m)) h.toField := + memVectorL2_openCubeSet_of_cubeEuclideanLpField_two h + have hnormalized := + centeredCubeNormalized_eLpNorm_meanZeroGrad_le_scaledDatum hsigma0 u hH + hsolution.scalarMatrix_neg_weak + rw [eLpNorm_const_smul] at hnormalized + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] at hnormalized + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, + FiniteLpExponent.two_exponent, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, hilbertifyVecField] using! hnormalized + +private theorem nonempty_openCubeSet_originCube_neumann (d : ℕ) (m : ℤ) : + Set.Nonempty (openCubeSet (originCube d m)) := by + refine ⟨0, ?_⟩ + rw [mem_openCubeSet_originCube_iff] + intro i + have hpow : 0 < (3 : ℝ) ^ m := zpow_pos (by norm_num) _ + constructor <;> simp only [Pi.zero_apply] <;> nlinarith + +private theorem isEllipticFieldOn_scalarMatrix_centeredCube + {d : ℕ} {m : ℤ} {sigma0 : ℝ} (hsigma0 : 0 < sigma0) : + IsEllipticFieldOn sigma0 sigma0 (openCubeSet (originCube d m)) + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) := by + classical + constructor + · apply measurable_pi_iff.2 + intro i + apply measurable_pi_iff.2 + intro j + have hpiece : Measurable + ((openCubeSet (originCube d m)).piecewise + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0 i j) + (fun _ ↦ 0)) := + measurable_const.piecewise (measurableSet_openCubeSet _) measurable_const + simpa only [Set.piecewise] using! hpiece + · intro x _hx + exact isEllipticMatrix_scalarMatrix hsigma0 + +/-- The canonical mean-zero solution of the scalar divergence equation with +datum `-G` on a centered cube. -/ +noncomputable def centeredCubeMeanZeroScalarDivergenceSolution + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (G : Vec d → Vec d) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + H1MeanZeroFunction (openCubeSet (originCube d m)) := by + letI : IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := + (isOpenBoundedConvexDomain_openCubeSet + (originCube d m)).isFiniteMeasure_restrict_volume + exact H1MeanZeroFunction.coeffGradientProblemSolution + (f := fun x ↦ -G x) hG.neg + (originCubeMeanZeroH1CoerciveEstimate d m) + (nonempty_openCubeSet_originCube_neumann d m) + (isEllipticFieldOn_scalarMatrix_centeredCube hsigma0) + +/-- The canonical mean-zero adjoint satisfies the packaged weak equation with +the same negative-datum convention as the supplied solution. -/ +theorem centeredCubeMeanZeroScalarDivergenceSolution_isWeakSolution + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (G : Vec d → Vec d) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) + (centeredCubeMeanZeroScalarDivergenceSolution m hsigma0 G hG) + (fun x ↦ -G x) := by + let : IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := + (isOpenBoundedConvexDomain_openCubeSet + (originCube d m)).isFiniteMeasure_restrict_volume + exact isMeanZeroNeumannRhsWeakSolution_coeffGradientProblemSolution_of_h1CoerciveEstimate + hG.neg (originCubeMeanZeroH1CoerciveEstimate d m) + (nonempty_openCubeSet_originCube_neumann d m) + (isEllipticFieldOn_scalarMatrix_centeredCube hsigma0) + +/-- Raw-volume weak equation for the canonical centered Neumann adjoint. -/ +theorem centeredCubeMeanZeroScalarDivergenceSolution_weak + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (G : Vec d → Vec d) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) + (psi : H1MeanZeroFunction (openCubeSet (originCube d m))) : + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot + ((centeredCubeMeanZeroScalarDivergenceSolution m hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume := by + exact (centeredCubeMeanZeroScalarDivergenceSolution_isWeakSolution + m hsigma0 G hG).scalarMatrix_neg_weak psi + +/-- Normalized-volume weak equation for the canonical centered Neumann +adjoint. -/ +theorem centeredCubeMeanZeroScalarDivergenceSolution_normalized_weak + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) (G : Vec d → Vec d) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) + (psi : H1MeanZeroFunction (openCubeSet (originCube d m))) : + sigma0 * ∫ x, + vecDot + ((centeredCubeMeanZeroScalarDivergenceSolution m hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (G x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_neumann, + integral_smul_measure, integral_smul_measure, smul_eq_mul, smul_eq_mul] + calc + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot + ((centeredCubeMeanZeroScalarDivergenceSolution + m hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) ∂volume) = + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot + ((centeredCubeMeanZeroScalarDivergenceSolution + m hsigma0 G hG).toH1Function.grad x) + (psi.toH1Function.grad x) ∂volume) := by ring + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume) := by + rw [centeredCubeMeanZeroScalarDivergenceSolution_weak] + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume) := by ring + +/-- Exact normalized cross-pairing identity for two supplied centered Neumann +scalar-divergence solutions. -/ +theorem centeredCubeMeanZeroScalarDivergence_cross_pairing + {d : ℕ} (m : ℤ) {sigma0 : ℝ} + (u v : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h G : Vec d → Vec d) + (hu : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h x)) + (hv : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) v (fun x ↦ -G x)) : + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + have huRaw := hu.scalarMatrix_neg_weak + have hvRaw := hv.scalarMatrix_neg_weak + have huNorm : ∀ psi : H1MeanZeroFunction (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + intro psi + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_neumann, + integral_smul_measure, integral_smul_measure, smul_eq_mul, smul_eq_mul] + calc + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) = + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) := by + ring + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) := by + rw [huRaw psi] + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) := by ring + have hvNorm : ∀ psi : H1MeanZeroFunction (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (G x) (psi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + intro psi + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_neumann, + integral_smul_measure, integral_smul_measure, smul_eq_mul, smul_eq_mul] + calc + sigma0 * + ((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (v.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) = + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (v.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume) := by + ring + _ = (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + (-∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume) := by + rw [hvRaw psi] + _ = -((ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal * + ∫ x in openCubeSet (originCube d m), + vecDot (G x) (psi.toH1Function.grad x) ∂volume) := by ring + have hsymm : + ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + have hneg : + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + -(∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) := by + calc + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := (hvNorm u).symm + _ = sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by rw [hsymm] + _ = -(∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) := huNorm v + have hpair : + ∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := neg_injective hneg + calc + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + _ = _ := hpair + +/-- Cross-pair a supplied centered Neumann solution against the canonical +mean-zero adjoint. -/ +theorem centeredCubeMeanZeroScalarDivergenceSolution_normalized_cross_pairing + {d : ℕ} [NeZero d] (m : ℤ) {sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h G : Vec d → Vec d) + (hu : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h x)) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (h x) + ((centeredCubeMeanZeroScalarDivergenceSolution + m hsigma0 G hG).toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + exact centeredCubeMeanZeroScalarDivergence_cross_pairing m u + (centeredCubeMeanZeroScalarDivergenceSolution m hsigma0 G hG) h G hu + (centeredCubeMeanZeroScalarDivergenceSolution_isWeakSolution + m hsigma0 G hG) + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpAboveTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpAboveTwo.lean new file mode 100644 index 0000000000..c977f678ef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpAboveTwo.lean @@ -0,0 +1,1067 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.EnergyDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedOneLevelTail + +/-! +# Centered-cube Neumann Calderón--Zygmund estimates above two + +This file closes the reflected Neumann good-`lambda` estimate by layer-cake +integration. Its public endpoint exposes only the supplied mean-zero weak +solution and the normalized finite-exponent datum. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +private theorem centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann + {d : ℕ} (m : ℤ) : + (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + +private theorem sqWeightedMeasure_restrict_apply_eq_inter_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B T : Set α} {f : α → E} + (hB : MeasurableSet B) : + sqWeightedMeasure f (μ.restrict B) T = sqWeightedMeasure f μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x ↦ ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x ↦ ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + +private theorem sqWeightedMeasure_smul_measure_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {c : ℝ≥0∞} {T : Set α} {f : α → E} : + sqWeightedMeasure f (c • μ) T = c * sqWeightedMeasure f μ T := by + unfold sqWeightedMeasure + rw [MeasureTheory.withDensity_smul_measure] + rfl + +private noncomputable def finiteLpExponentSuccNeumann (p : FiniteLpExponent) : + FiniteLpExponent where + exponent := p.exponent + 1 + one_lt := lt_of_lt_of_le p.one_lt (le_add_of_nonneg_right bot_le) + lt_top := ENNReal.add_lt_top.mpr ⟨p.lt_top, by norm_num⟩ + +private theorem finiteLpExponentSuccNeumann_toReal (p : FiniteLpExponent) : + (finiteLpExponentSuccNeumann p).exponent.toReal = p.exponent.toReal + 1 := by + simp only [finiteLpExponentSuccNeumann] + rw [ENNReal.toReal_add p.lt_top.ne ENNReal.one_ne_top] + norm_num + +private theorem finiteLpExponent_lt_succNeumann (p : FiniteLpExponent) : + p.exponent.toReal < (finiteLpExponentSuccNeumann p).exponent.toReal := by + rw [finiteLpExponentSuccNeumann_toReal] + linarith + +private theorem sqWeightedMeasure_univ_ne_top_of_memLp_two_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {f : α → E} (hf : MemLp f 2 μ) : + sqWeightedMeasure f μ Set.univ ≠ ∞ := by + rw [sqWeightedMeasure, MeasureTheory.withDensity_apply _ MeasurableSet.univ] + simpa only [Measure.restrict_univ, ← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) zero_le_two, + ENNReal.toReal_ofNat, Real.rpow_two] using + (MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (by norm_num : (2 : ℝ≥0∞) ≠ 0) (by norm_num : (2 : ℝ≥0∞) ≠ ∞) + hf.eLpNorm_lt_top).ne + +private theorem sqWeightedMeasure_univ_eq_eLpNorm_two_sq_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} (f : α → E) : + sqWeightedMeasure f μ Set.univ = (eLpNorm f 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure, MeasureTheory.withDensity_apply _ MeasurableSet.univ, + Measure.restrict_univ] + change (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ∂μ) = _ + simp_rw [ENNReal.ofReal_pow (norm_nonneg _), ofReal_norm] + rw [← ENNReal.rpow_natCast, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal (by norm_num) (by norm_num), + ← ENNReal.rpow_mul] + norm_num + +private theorem lintegral_ofReal_norm_rpow_div_ne_top_of_memLp_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MemLp f p.exponent μ) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ) ≠ ∞ := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x ↦ ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas] + exact ENNReal.mul_ne_top + (ENNReal.inv_ne_top.2 (ENNReal.ofReal_ne_zero_iff.mpr hb)) + (by + simpa only [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] using + (MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne + hf.eLpNorm_lt_top).ne) + +private theorem sqWeightedMeasure_neumannReflected_oneLevel_tail_finiteP + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M level : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hlevel : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < level) : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) ≤ + ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) volume + ({x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} ∩ + openCubeSet (originCube d m))) := by + exact sqWeightedMeasure_neumannReflected_oneLevel_tail_originCube G hr hsigma0 + heps heps_one hM u h.toField + (by + have hnormalized : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using h.euclideanMemL2 + have hrestricted : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (cubeBoundedMeasurableDomain (originCube d m)).restrictedVolume := + ((cubeBoundedMeasurableDomain (originCube d m)).memLp_normalizedVolume_iff + 2 _).mp hnormalized + have hopen : MemLp (fun x ↦ HilbertVec.ofVec (h.toField x)) 2 + (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hrestricted + let T : HilbertVec d →L[ℝ] Vec d := + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap + simpa only [MemVectorL2, volumeMeasureOn, Function.comp_def, + HilbertVec.toVec_ofVec, T] using! T.comp_memLp' hopen) + hsolution hlevel + +private theorem finiteLp_oneLevel_tail_restrict_neumann + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M lambda : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hlambda : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda) : + ∀ level, lambda ≤ level → + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (volume.restrict (openCubeSet (originCube d m))) + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} := by + intro level hlevel + have htail := sqWeightedMeasure_neumannReflected_oneLevel_tail_finiteP + G hr hsigma0 heps heps_one hM u h hsolution (hlambda.trans_le hlevel) + rw [sqWeightedMeasure_restrict_apply_eq_inter_finitePNeumann + (measurableSet_openCubeSet (originCube d m)), + sqWeightedMeasure_restrict_apply_eq_inter_finitePNeumann + (measurableSet_openCubeSet (originCube d m)), + sqWeightedMeasure_restrict_apply_eq_inter_finitePNeumann + (measurableSet_openCubeSet (originCube d m))] + simpa only [mul_add, mul_assoc] using htail + +private theorem finiteLp_oneLevel_tail_normalized_neumann + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) {m : ℤ} {sigma0 eps M lambda : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hlambda : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda) : + ∀ level, lambda ≤ level → + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (centeredCubeDomain d m).normalizedVolume + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖} := by + intro level hlevel + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) + have hraw := finiteLp_oneLevel_tail_restrict_neumann G hr hsigma0 heps + heps_one hM u h hsolution hlambda level hlevel + rw [centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann, + sqWeightedMeasure_smul_measure_finitePNeumann, + sqWeightedMeasure_smul_measure_finitePNeumann, + sqWeightedMeasure_smul_measure_finitePNeumann] + calc + c * sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ≤ + c * + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (volume.restrict (openCubeSet (originCube d m))) + {x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField h.toField) + (volume.restrict (openCubeSet (originCube d m))) + {x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖}) := by + simpa only [mul_comm] using mul_le_mul_right hraw c + _ = _ := by ring + +private theorem finiteLp_integrated_tail_of_parameters_neumann + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) (hq : 2 < q.exponent.toReal) + {m : ℤ} {sigma0 M eps lambda0 : ℝ} + (hsigma0 : 0 < sigma0) (hM : 1 < M) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hlambda0 : 0 < lambda0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hcutoff : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < + lambda0) + (hsmall : + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1) : + ∫⁻ x, ENNReal.ofReal + (‖hilbertifyVecField u.toH1Function.grad x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) + ∂(centeredCubeDomain d m).normalizedVolume ≤ + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + ∫⁻ x, ENNReal.ofReal + (‖(sigma0⁻¹ • hilbertifyVecField h.toField) x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) + ∂(centeredCubeDomain d m).normalizedVolume) / + (1 - + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2))) := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let C : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G + let theta : ℝ≥0∞ := C * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using + centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hg_base : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by + simpa only [g] using hg_base.const_smul sigma0⁻¹ + have hC : C ≠ ∞ := ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (oneStoppingBallCoefficient_ne_top G) + have htheta : theta ≠ ∞ := ENNReal.mul_ne_top hC (ENNReal.add_ne_top.mpr + ⟨ENNReal.ofReal_ne_top, ENNReal.ofReal_ne_top⟩) + have hB : B ≠ ∞ := ENNReal.mul_ne_top htheta ENNReal.ofReal_ne_top + have heps_half : 0 < eps / 2 := by linarith + have htail : ∀ level, lambda0 ≤ level → + sqWeightedMeasure f μ {x | M * level < ‖f x‖} ≤ + theta * sqWeightedMeasure f μ {x | level / 2 < ‖f x‖} + + B * sqWeightedMeasure g μ {x | eps * level / 2 < ‖g x‖} := by + simpa only [μ, f, g, theta, B, C, mul_assoc] using + finiteLp_oneLevel_tail_normalized_neumann G hr hsigma0 heps heps_one hM.le + u h hsolution hcutoff + simpa only [μ, f, g, theta, B, C] using + (lp_le_of_oneLevel_weighted_tail hf.aestronglyMeasurable + hg.aestronglyMeasurable hq (by linarith) (by linarith) heps hlambda0 + (sqWeightedMeasure_univ_ne_top_of_memLp_two_finitePNeumann hf) hB + (lintegral_ofReal_norm_rpow_div_ne_top_of_memLp_finitePNeumann + heps_half hg) hsmall htail) + +private theorem exists_finiteLp_goodLambda_data_neumann + {d : ℕ} [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ (depth : ℕ) (G : INTERNAL.HarmonicEuclideanGradientGain d + (finiteLpExponentSuccNeumann q) depth) (M eps : ℝ), + 1 < M ∧ 0 < eps ∧ eps ≤ 1 ∧ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ + (2 - (finiteLpExponentSuccNeumann q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1 := by + obtain ⟨⟨depth, G⟩⟩ := + INTERNAL.nonempty_harmonicEuclideanGradientGain_finiteTarget_of_pos d + (Nat.pos_of_ne_zero (NeZero.ne d)) (finiteLpExponentSuccNeumann q) + let C : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G + have hC : C ≠ ∞ := ENNReal.mul_ne_top + (ENNReal.pow_ne_top (by norm_num)) (oneStoppingBallCoefficient_ne_top G) + obtain ⟨M, eps, hM, heps, heps_one, hsmall⟩ := + INTERNAL.exists_strict_goodLambda_parameters hC hq + (finiteLpExponent_lt_succNeumann q) + exact ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ + +private theorem eLpNorm_rpow_eq_lintegral_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} (p : FiniteLpExponent) (f : α → E) : + (eLpNorm f p.exponent μ) ^ p.exponent.toReal = + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) ∂μ := by + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne, + ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + apply MeasureTheory.lintegral_congr + intro x + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] + +private theorem lintegral_eq_ofReal_mul_div_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) ∂μ) = + ENNReal.ofReal (a ^ (p.exponent.toReal - 2)) * + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) = + ENNReal.ofReal b * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) := by + calc + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) = + ENNReal.ofReal ((‖f x‖ ^ p.exponent.toReal / b) * b) := by + congr 1 + exact (div_mul_cancel₀ _ hb.ne').symm + _ = ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) * ENNReal.ofReal b := + ENNReal.ofReal_mul (div_nonneg + (Real.rpow_nonneg (norm_nonneg _) _) hb.le) + _ = _ := mul_comm _ _ + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + +private theorem divided_moment_eq_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {p : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MemLp f p.exponent μ) : + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / + a ^ (p.exponent.toReal - 2)) ∂μ = + (ENNReal.ofReal (a ^ (p.exponent.toReal - 2)))⁻¹ * + (eLpNorm f p.exponent μ) ^ p.exponent.toReal := by + let b : ℝ := a ^ (p.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x ↦ ENNReal.ofReal (‖f x‖ ^ p.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (p.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas, + ← eLpNorm_rpow_eq_lintegral_finitePNeumann p f] + +private theorem tail_powered_package_finitePNeumann + {cM D L B cdata X Y : ℝ≥0∞} (hcM : cM ≠ 0) (hcMtop : cM ≠ ∞) + (htail : cM⁻¹ * X ≤ (L * Y + B * (cdata⁻¹ * Y)) / D) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y := by + calc + X = cM * (cM⁻¹ * X) := by + rw [← mul_assoc, ENNReal.mul_inv_cancel hcM hcMtop, one_mul] + _ = (cM⁻¹ * X) * cM := mul_comm _ _ + _ ≤ ((L * Y + B * (cdata⁻¹ * Y)) / D) * cM := mul_le_mul_left htail _ + _ = cM * ((L * Y + B * (cdata⁻¹ * Y)) / D) := mul_comm _ _ + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y := by + rw [ENNReal.div_eq_inv_mul] + ring + +private theorem tail_norm_package_finitePNeumann + {p : ℝ} {cM D L B cdata X Y : ℝ≥0∞} (hp : 0 < p) (hcM : cM ≠ 0) + (hcMtop : cM ≠ ∞) + (htail : cM⁻¹ * X ^ p ≤ (L * Y ^ p + B * (cdata⁻¹ * Y ^ p)) / D) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + have hpow : X ^ p ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p := + tail_powered_package_finitePNeumann hcM hcMtop htail + have hp0 : p ≠ 0 := hp.ne' + have hpnonneg : 0 ≤ p := hp.le + calc + X = X ^ (p * p⁻¹) := by rw [mul_inv_cancel₀ hp0, ENNReal.rpow_one] + _ = (X ^ p) ^ p⁻¹ := ENNReal.rpow_mul _ _ _ + _ ≤ ((cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p) ^ p⁻¹ := + ENNReal.rpow_le_rpow hpow (inv_nonneg.mpr hpnonneg) + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hpnonneg), + ← ENNReal.rpow_mul, mul_inv_cancel₀ hp0, ENNReal.rpow_one] + +private theorem finiteLp_norm_bound_of_moment_tail_neumann + {p : ℝ} {cM D L B cdata X Y Jf Jg low : ℝ≥0∞} + (hp : 0 < p) (hcM : cM ≠ 0) (hcMtop : cM ≠ ∞) + (hJf : X ^ p = cM * Jf) (hJg : Jg = cdata⁻¹ * Y ^ p) + (htail : Jf ≤ (low + B * Jg) / D) (hlow : low ≤ L * Y ^ p) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + apply tail_norm_package_finitePNeumann hp hcM hcMtop + rw [hJf, ← mul_assoc, ENNReal.inv_mul_cancel hcM hcMtop, one_mul] + calc + Jf ≤ (low + B * Jg) / D := htail + _ ≤ (L * Y ^ p + B * (cdata⁻¹ * Y ^ p)) / D := by + apply ENNReal.div_le_div_right + calc + low + B * Jg ≤ L * Y ^ p + B * Jg := by + simpa [add_comm] using add_le_add_right hlow (B * Jg) + _ = _ := by rw [hJg] + +private theorem finiteLp_low_term_package_finitePNeumann + {p : ℝ} {S lam c N₂ Nq : ℝ≥0∞} + (hp : 2 < p) (hS : S ≤ N₂ ^ (2 : ℕ)) + (hlam : lam ≤ c * N₂) (hN : N₂ ≤ Nq) : + S * lam ^ (p - 2) ≤ c ^ (p - 2) * Nq ^ p := by + have he : 0 ≤ p - 2 := by linarith + calc + S * lam ^ (p - 2) ≤ N₂ ^ (2 : ℕ) * (c * N₂) ^ (p - 2) := + mul_le_mul hS (ENNReal.rpow_le_rpow hlam he) bot_le bot_le + _ = c ^ (p - 2) * N₂ ^ p := by + rw [ENNReal.mul_rpow_of_nonneg _ _ he, ← ENNReal.rpow_natCast] + calc + N₂ ^ (2 : ℝ) * (c ^ (p - 2) * N₂ ^ (p - 2)) = + c ^ (p - 2) * (N₂ ^ (2 : ℝ) * N₂ ^ (p - 2)) := by ac_rfl + _ = c ^ (p - 2) * N₂ ^ (2 + (p - 2)) := by + rw [ENNReal.rpow_add_of_nonneg _ _ (by norm_num) he] + _ = c ^ (p - 2) * N₂ ^ p := by + congr 2 + ring + _ ≤ c ^ (p - 2) * Nq ^ p := by gcongr + +private theorem finiteLp_low_term_of_l2_control_neumann + {d : ℕ} {m : ℤ} {q : FiniteLpExponent} + {f g : Vec d → HilbertVec d} {lambda c : ℝ} + (hgq : MemLp g q.exponent (centeredCubeDomain d m).normalizedVolume) + (hq : 2 < q.exponent.toReal) + (henergy : eLpNorm f 2 (centeredCubeDomain d m).normalizedVolume ≤ + eLpNorm g 2 (centeredCubeDomain d m).normalizedVolume) + (hc : 0 ≤ c) (hlambda : 0 ≤ lambda) + (hlambda_bound : lambda ≤ c * + (eLpNorm g q.exponent (centeredCubeDomain d m).normalizedVolume).toReal) : + sqWeightedMeasure f (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda ^ (q.exponent.toReal - 2)) ≤ + (ENNReal.ofReal c) ^ (q.exponent.toReal - 2) * + (eLpNorm g q.exponent (centeredCubeDomain d m).normalizedVolume) ^ + q.exponent.toReal := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have htwoqnorm : eLpNorm g 2 μ ≤ eLpNorm g q.exponent μ := + MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le htwoq hgq.aestronglyMeasurable + have hS : sqWeightedMeasure f μ Set.univ ≤ (eLpNorm g 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure_univ_eq_eLpNorm_two_sq_finitePNeumann] + exact pow_le_pow_left₀ bot_le henergy 2 + have hSq : sqWeightedMeasure f μ Set.univ ≤ + (eLpNorm g q.exponent μ) ^ (2 : ℕ) := + hS.trans (pow_le_pow_left₀ bot_le htwoqnorm 2) + have hlamENN : ENNReal.ofReal lambda ≤ + ENNReal.ofReal c * eLpNorm g q.exponent μ := by + calc + ENNReal.ofReal lambda ≤ ENNReal.ofReal + (c * (eLpNorm g q.exponent μ).toReal) := + ENNReal.ofReal_le_ofReal hlambda_bound + _ = ENNReal.ofReal c * eLpNorm g q.exponent μ := by + rw [ENNReal.ofReal_mul hc, ENNReal.ofReal_toReal hgq.eLpNorm_lt_top.ne] + rw [show ENNReal.ofReal (lambda ^ (q.exponent.toReal - 2)) = + (ENNReal.ofReal lambda) ^ (q.exponent.toReal - 2) by + exact (ENNReal.ofReal_rpow_of_nonneg (p := q.exponent.toReal - 2) + hlambda (by linarith)).symm] + exact finiteLp_low_term_package_finitePNeumann hq hSq hlamENN le_rfl + +private theorem toReal_eLpNorm_two_sq_eq_integral_finitePNeumann + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] [MeasurableSpace E] + [BorelSpace E] {μ : Measure α} {f : α → E} (hf : MemLp f 2 μ) : + (ENNReal.toReal (eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℕ) ∂μ := by + have hpow : (2 : ℝ≥0∞).toReal = (2 : ℝ) := by norm_num + have hnorm := hf.eLpNorm_eq_integral_rpow_norm + (by norm_num : (2 : ℝ≥0∞) ≠ 0) (by norm_num : (2 : ℝ≥0∞) ≠ ∞) + have hsq : (ENNReal.toReal (eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + rw [hnorm, hpow] + have hnonneg : 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := + MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x ↦ Real.rpow_nonneg (norm_nonneg _) _) + rw [ENNReal.toReal_ofReal (Real.rpow_nonneg hnonneg _)] + rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num, ← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hnonneg + calc + (ENNReal.toReal (eLpNorm f 2 μ)) ^ (2 : ℕ) = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := hsq + _ = _ := by + congr 1 with x + rw [Real.rpow_two] + +private theorem neumannReflectedGoodLambdaCutoff_sq_eq_normalized_energy + {d : ℕ} {m : ℤ} (depth : ℕ) (eps sigma0 : ℝ) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) (H : Vec d → Vec d) : + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u H ^ (2 : ℕ) = + (3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d * + ((∫ x, ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) + + (eps⁻¹) ^ (2 : ℕ) * + ∫ x, ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) := by + let s : ℝ := cubeScaleFactor (originCube d m) + let L : ℝ := 10 * (3 : ℝ) ^ depth + let V : ℝ := cubeVolume (originCube d m) + have hs : 0 < s := by + dsimp only [s] + simpa [cubeScaleFactor] using! zpow_pos (by norm_num : (0 : ℝ) < 3) m + have hL : 0 < L := by + dsimp only [L] + positivity + have hV : V = s ^ d := by simp only [V, s, cubeVolume_eq_scaleFactor_pow] + have hnormal : (ENNReal.ofReal (V⁻¹)).toReal = V⁻¹ := by + rw [ENNReal.toReal_ofReal] + exact inv_nonneg.mpr (by rw [hV]; positivity) + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal (V⁻¹) • volume.restrict (openCubeSet (originCube d m)) := by + simpa only [V] using + centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann m + have hIu : + (∫ x, ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) = + V⁻¹ * ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume := by + rw [hmeasure, MeasureTheory.integral_smul_measure, hnormal] + exact smul_eq_mul _ _ + have hIH : + (∫ x, ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) = + V⁻¹ * ∫ x in openCubeSet (originCube d m), + ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [hmeasure, MeasureTheory.integral_smul_measure, hnormal] + exact smul_eq_mul _ _ + have hscaled : + (∫ x in openCubeSet (originCube d m), + ‖sigma0⁻¹ • hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) = + (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [← MeasureTheory.integral_const_mul] + congr 1 + funext x + rw [norm_smul, Real.norm_eq_abs] + calc + (|sigma0⁻¹| * ‖hilbertifyVecField H x‖) ^ (2 : ℕ) = + |sigma0⁻¹| ^ (2 : ℕ) * ‖hilbertifyVecField H x‖ ^ (2 : ℕ) := by ring + _ = _ := by rw [sq_abs] + have hcoef : ((2 * ((s / 2) / L)) ^ d)⁻¹ * (3 : ℝ) ^ d = + (3 : ℝ) ^ d * L ^ d * V⁻¹ := by + rw [hV, ← inv_pow] + field_simp [hs.ne', hL.ne'] + rw [div_pow] + exact div_mul_cancel₀ _ (pow_pos hs _).ne' + rw [neumannReflectedGoodLambdaCutoff, neumannReflectedSourceSquaredEnergy, + Real.sq_sqrt] + · dsimp only [reflectedStoppingRadius] + rw [show cubeRadius (originCube d m) = s / 2 by + dsimp only [s, cubeRadius] + ring] + rw [show 10 * (3 : ℝ) ^ depth = L by rfl, hIu, hIH, hscaled] + calc + ((2 * (s / 2 / L)) ^ d)⁻¹ * + ((3 : ℝ) ^ d * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume)) = + (((2 * (s / 2 / L)) ^ d)⁻¹ * (3 : ℝ) ^ d) * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) := by ring + _ = _ := by rw [hcoef]; ring + · apply mul_nonneg + · exact inv_nonneg.mpr (pow_nonneg + (mul_nonneg (by norm_num) (reflectedStoppingRadius_pos m depth).le) _) + · apply mul_nonneg (pow_nonneg (by norm_num) _) + apply add_nonneg + · exact MeasureTheory.integral_nonneg fun _ ↦ sq_nonneg _ + · exact mul_nonneg (mul_nonneg (sq_nonneg _) (sq_nonneg _)) + (MeasureTheory.integral_nonneg fun _ ↦ sq_nonneg _) + +private theorem neumannReflectedGoodLambdaCutoff_le_normalized_datum_energy + {d : ℕ} [NeZero d] {m : ℤ} {q : FiniteLpExponent} + (depth : ℕ) {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) : + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) * + Real.sqrt (∫ x, ‖sigma0⁻¹ • hilbertifyVecField h.toField x‖ ^ (2 : ℕ) + ∂(centeredCubeDomain d m).normalizedVolume) := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let K : ℝ := (3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d + let E : ℝ := ∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ + let A : ℝ := ∫ x, ‖f x‖ ^ (2 : ℕ) ∂μ + let C : ℝ := Real.sqrt (K * (1 + (eps⁻¹) ^ (2 : ℕ))) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using + centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hgbase : MemLp (hilbertifyVecField h.toField) 2 μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemL2 + have hg : MemLp g 2 μ := by simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hnormSource := centeredCubeH1MeanZeroScalarDivergence_cz_two + m sigma0 h.toLpTwo u hsigma0 hsolution + have hnorm : eLpNorm f 2 μ ≤ eLpNorm g 2 μ := by + rw [eLpNorm_const_smul] + rw [← ofReal_norm, Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, FiniteLpExponent.two_exponent, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm, μ, f, g, hilbertifyVecField] + using! hnormSource + have hnormR := (ENNReal.toReal_le_toReal hf.eLpNorm_lt_top.ne + hg.eLpNorm_lt_top.ne).mpr hnorm + have hsq := (sq_le_sq₀ ENNReal.toReal_nonneg ENNReal.toReal_nonneg).mpr hnormR + rw [toReal_eLpNorm_two_sq_eq_integral_finitePNeumann hf, + toReal_eLpNorm_two_sq_eq_integral_finitePNeumann hg] at hsq + have hAE : A ≤ E := by simpa only [A, E, f, g] using hsq + have hK : 0 < K := by + dsimp only [K] + positivity + have hE0 : 0 ≤ E := MeasureTheory.integral_nonneg fun _ ↦ sq_nonneg _ + have hsum : A + (eps⁻¹) ^ (2 : ℕ) * E ≤ + (1 + (eps⁻¹) ^ (2 : ℕ)) * E := by + have he : 0 ≤ (eps⁻¹) ^ (2 : ℕ) := sq_nonneg _ + nlinarith [hAE] + calc + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField = + Real.sqrt + (neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ^ + (2 : ℕ)) := by + symm + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg + (neumannReflectedGoodLambdaCutoff_nonneg m depth eps sigma0 u h.toField)] + _ = Real.sqrt (K * (A + (eps⁻¹) ^ (2 : ℕ) * E)) := by + rw [neumannReflectedGoodLambdaCutoff_sq_eq_normalized_energy] + rfl + _ ≤ Real.sqrt (K * ((1 + (eps⁻¹) ^ (2 : ℕ)) * E)) := + Real.sqrt_le_sqrt (mul_le_mul_of_nonneg_left hsum hK.le) + _ = C * Real.sqrt E := by + dsimp only [C] + rw [← mul_assoc, Real.sqrt_mul] + positivity + _ = _ := rfl + +private theorem neumannReflectedGoodLambdaCutoff_le_q_datum_norm + {d : ℕ} [NeZero d] {m : ℤ} {q : FiniteLpExponent} (depth : ℕ) + {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hq : 2 < q.exponent.toReal) : + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) * + (eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume).toReal := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let C : ℝ := Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) + have hgbase : MemLp (hilbertifyVecField h.toField) 2 μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemL2 + have hg2 : MemLp g 2 μ := by simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hgqbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hgq : MemLp g q.exponent μ := by + simpa only [g] using hgqbase.const_smul sigma0⁻¹ + let : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have hnorm : eLpNorm g 2 μ ≤ eLpNorm g q.exponent μ := + MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le htwoq hgq.aestronglyMeasurable + have hnormR : (eLpNorm g 2 μ).toReal ≤ (eLpNorm g q.exponent μ).toReal := + (ENNReal.toReal_le_toReal hg2.eLpNorm_lt_top.ne hgq.eLpNorm_lt_top.ne).mpr hnorm + have hmoment : (eLpNorm g 2 μ).toReal ^ (2 : ℕ) = + ∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ := + toReal_eLpNorm_two_sq_eq_integral_finitePNeumann hg2 + have hsqrt : Real.sqrt (∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ) = + (eLpNorm g 2 μ).toReal := by + rw [← hmoment, Real.sqrt_sq_eq_abs, abs_of_nonneg ENNReal.toReal_nonneg] + have hcut := neumannReflectedGoodLambdaCutoff_le_normalized_datum_energy + (eps := eps) depth hsigma0 u h hsolution + calc + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + C * Real.sqrt (∫ x, ‖g x‖ ^ (2 : ℕ) ∂μ) := by + simpa only [μ, g, C] using! hcut + _ = C * (eLpNorm g 2 μ).toReal := by rw [hsqrt] + _ ≤ C * (eLpNorm g q.exponent μ).toReal := by + apply mul_le_mul_of_nonneg_left hnormR + dsimp only [C] + positivity + +private theorem finiteLp_norm_bound_of_parameters_neumann + {d : ℕ} [NeZero d] {q r : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d r depth) + (hr : 2 < r.exponent.toReal) (hq : 2 < q.exponent.toReal) + {m : ℤ} {sigma0 M eps lambda0 : ℝ} + (hsigma0 : 0 < sigma0) (hM : 1 < M) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hlambda0 : 0 < lambda0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) + (hcutoff : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < lambda0) + (hsmall : + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1) + {L : ℝ≥0∞} + (hlow : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) + (centeredCubeDomain d m).normalizedVolume Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) ≤ + L * (eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume) ^ q.exponent.toReal) : + eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (centeredCubeDomain d m).normalizedVolume ≤ + (ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) * + (1 - + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)))⁻¹ * + (L + + ((((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ))) * + (ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)))⁻¹)) ^ + (q.exponent.toReal)⁻¹ * + eLpNorm (sigma0⁻¹ • hilbertifyVecField h.toField) q.exponent + (centeredCubeDomain d m).normalizedVolume := by + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + let theta : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - r.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + let cM : ℝ≥0∞ := ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) + let cdata : ℝ≥0∞ := ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)) + let D : ℝ≥0∞ := 1 - theta * ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) + have hepshalf : 0 < eps / 2 := by linarith + have hcM : cM ≠ 0 := by + dsimp only [cM] + exact (ENNReal.ofReal_pos.mpr (Real.rpow_pos_of_pos (by linarith) _)).ne' + have hcMtop : cM ≠ ∞ := ENNReal.ofReal_ne_top + have htail := finiteLp_integrated_tail_of_parameters_neumann G hr hq hsigma0 hM + heps heps_one hlambda0 u h hsolution hcutoff hsmall + have hJf : (eLpNorm f q.exponent μ) ^ q.exponent.toReal = + cM * ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) ∂μ := by + rw [eLpNorm_rpow_eq_lintegral_finitePNeumann, + lintegral_eq_ofReal_mul_div_finitePNeumann (p := q) (a := M) + (f := f) (by linarith)] + have hgbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by + simpa only [g] using hgbase.const_smul sigma0⁻¹ + have hJg : (∫⁻ x, ENNReal.ofReal (‖g x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) ∂μ) = + cdata⁻¹ * (eLpNorm g q.exponent μ) ^ q.exponent.toReal := by + simpa only [cdata] using divided_moment_eq_finitePNeumann hepshalf hg + have htail' : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) ∂μ) ≤ + (sqWeightedMeasure f μ Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) + + B * ∫⁻ x, ENNReal.ofReal (‖g x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) ∂μ) / D := by + simpa only [μ, f, g, theta, B, D] using htail + have hlow' : sqWeightedMeasure f μ Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) ≤ + L * (eLpNorm g q.exponent μ) ^ q.exponent.toReal := by + simpa only [μ, f, g] using hlow + have hp : 0 < q.exponent.toReal := by linarith + simpa only [μ, f, g, theta, B, cM, cdata, D] using + (finiteLp_norm_bound_of_moment_tail_neumann + (p := q.exponent.toReal) (L := L) (B := B) hp + hcM hcMtop hJf hJg htail' hlow') + +private theorem finiteLp_final_coefficient_ne_top_neumann + {p : ℝ} {cM rho L B cdata : ℝ≥0∞} + (hp : 0 < p) (hcMtop : cM ≠ ∞) (hrho : rho < 1) + (hLtop : L ≠ ∞) (hBtop : B ≠ ∞) (hcdata : cdata ≠ 0) : + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ ≠ ∞ := by + apply ENNReal.rpow_ne_top_of_nonneg (inv_nonneg.mpr hp.le) + apply ENNReal.mul_ne_top + · apply ENNReal.mul_ne_top hcMtop + exact ENNReal.inv_ne_top.mpr (ne_of_gt (tsub_pos_iff_lt.mpr hrho)) + · apply ENNReal.add_ne_top.mpr + exact ⟨hLtop, ENNReal.mul_ne_top hBtop (ENNReal.inv_ne_top.mpr hcdata)⟩ + +/-- Centered-cube Neumann Calderón--Zygmund estimate above the energy exponent. -/ +theorem centeredCubeH1MeanZeroNeumannDivergence_cz_of_two_lt + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanL2LpField (originCube d m) q) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))), 0 < sigma0 → + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + obtain ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ := + exists_finiteLp_goodLambda_data_neumann (d := d) q hq + let theta : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ + (2 - (finiteLpExponentSuccNeumann q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + let cM : ℝ≥0∞ := ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) + let cdata : ℝ≥0∞ := ENNReal.ofReal ((eps / 2) ^ (q.exponent.toReal - 2)) + let rho : ℝ≥0∞ := theta * ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) + let Ccut : ℝ := Real.sqrt (((3 : ℝ) ^ d * (10 * (3 : ℝ) ^ depth) ^ d) * + (1 + (eps⁻¹) ^ (2 : ℕ))) + let L : ℝ≥0∞ := (ENNReal.ofReal (2 * Ccut)) ^ (q.exponent.toReal - 2) + let C : ℝ≥0∞ := + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ (q.exponent.toReal)⁻¹ + have hp : 0 < q.exponent.toReal := by linarith + have hCtop : C ≠ ∞ := by + apply finiteLp_final_coefficient_ne_top_neumann hp ENNReal.ofReal_ne_top + · simpa only [rho, theta] using hsmall + · dsimp only [L] + exact ENNReal.rpow_ne_top_of_nonneg (by linarith) ENNReal.ofReal_ne_top + · dsimp only [B, theta] + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top + (ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (oneStoppingBallCoefficient_ne_top G)) + (ENNReal.add_ne_top.mpr ⟨ENNReal.ofReal_ne_top, ENNReal.ofReal_ne_top⟩)) + ENNReal.ofReal_ne_top + · dsimp only [cdata] + exact (ENNReal.ofReal_pos.mpr (Real.rpow_pos_of_pos (by linarith) _)).ne' + refine ⟨C, lt_top_iff_ne_top.mpr hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let f : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField h.toField + have henergy : eLpNorm f 2 μ ≤ eLpNorm g 2 μ := by + rw [eLpNorm_const_smul] + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, FiniteLpExponent.two_exponent, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm, μ, f, g, hilbertifyVecField] using! + (centeredCubeH1MeanZeroScalarDivergence_cz_two m sigma0 h.toLpTwo u hsigma0 + hsolution) + have hgbase : MemLp (hilbertifyVecField h.toField) q.exponent μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hg : MemLp g q.exponent μ := by simpa only [g] using hgbase.const_smul sigma0⁻¹ + by_cases hYzero : eLpNorm g q.exponent μ = 0 + · let : IsProbabilityMeasure μ := ⟨by + dsimp only [μ] + exact (centeredCubeDomain d m).normalizedVolume_apply_univ⟩ + have htwoq : (2 : ℝ≥0∞) ≤ q.exponent := by + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) (b := q.exponent) + (by norm_num) q.lt_top.ne).mp + simpa using hq + have hg2zero : eLpNorm g 2 μ = 0 := + le_zero_iff.mp ((MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le + htwoq hg.aestronglyMeasurable).trans_eq hYzero) + have hf2zero : eLpNorm f 2 μ = 0 := le_zero_iff.mp (henergy.trans_eq hg2zero) + have hfraw : MemLp f 2 (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [f, hilbertifyVecField] using + memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2 + have hf2 : MemLp f 2 μ := by + rw [show μ = ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + simpa only [μ] using + centeredCube_normalizedVolume_eq_smul_openCubeVolume_finitePNeumann m] + exact hfraw.smul_measure ENNReal.ofReal_ne_top + have hfae : f =ᵐ[μ] 0 := + (MeasureTheory.eLpNorm_eq_zero_iff hf2.aestronglyMeasurable (by norm_num)).mp hf2zero + have hfqzero : eLpNorm f q.exponent μ = 0 := + MeasureTheory.eLpNorm_eq_zero_of_ae_zero hfae + have htargetzero : (centeredCubeDomain d m).normalizedEuclideanLpENorm + q.exponent u.toH1Function.grad = 0 := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, f, μ, hilbertifyVecField] using! hfqzero + rw [htargetzero] + exact bot_le + · let lambda0 : ℝ := neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField + + Ccut * (eLpNorm g q.exponent μ).toReal + have hYpos : 0 < (eLpNorm g q.exponent μ).toReal := + ENNReal.toReal_pos hYzero hg.eLpNorm_lt_top.ne + have hCcut : 0 < Ccut := by + dsimp only [Ccut] + positivity + have hcut := neumannReflectedGoodLambdaCutoff_le_q_datum_norm (eps := eps) + depth hsigma0 u h hsolution hq + have hcut' : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField ≤ + Ccut * (eLpNorm g q.exponent μ).toReal := by + simpa only [μ, g, Ccut] using hcut + have hlambda0 : 0 < lambda0 := by + dsimp only [lambda0] + exact add_pos_of_nonneg_of_pos + (neumannReflectedGoodLambdaCutoff_nonneg m depth eps sigma0 u h.toField) + (mul_pos hCcut hYpos) + have hcutoff : neumannReflectedGoodLambdaCutoff m depth eps sigma0 u h.toField < + lambda0 := by + dsimp only [lambda0] + nlinarith [hcut'] + have hlambdaBound : lambda0 ≤ 2 * Ccut * (eLpNorm g q.exponent μ).toReal := by + dsimp only [lambda0] + nlinarith [hcut'] + have hlow := finiteLp_low_term_of_l2_control_neumann (q := q) (f := f) (g := g) + hg hq henergy (by nlinarith [hCcut]) hlambda0.le hlambdaBound + have hbound := finiteLp_norm_bound_of_parameters_neumann G + (hq.trans (finiteLpExponent_lt_succNeumann q)) hq hsigma0 hM heps heps_one + hlambda0 u h hsolution hcutoff (by + simpa only [finiteLpExponentSuccNeumann_toReal] using hsmall) (L := L) (by + simpa only [μ, f, g, lambda0, L, Ccut] using hlow) + have hleft : (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad = eLpNorm f q.exponent μ := by + simp only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, f, μ] + rfl + rw [hleft] + rw [MeasureTheory.eLpNorm_const_smul] at hbound + rw [← ofReal_norm, + Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le), + ENNReal.ofReal_inv_of_pos hsigma0] at hbound + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, μ, f, g, C, theta, B, cM, cdata, rho, L, + mul_assoc] using! hbound + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpBelowTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpBelowTwo.lean new file mode 100644 index 0000000000..9d053e87c2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/FiniteLpBelowTwo.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.EnergyDuality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo + +/-! +# Below-two Neumann cube Calderón--Zygmund estimate + +This file proves the adjoint-duality branch for a supplied mean-zero Neumann +solution with only `L^p` datum, then combines it with the energy and good-`λ` +branches to cover every finite exponent. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem centeredCube_memLp_hilbertMeanZeroGradient_two + {d : ℕ} {m : ℤ} + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) : + MemLp (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).smul_measure ENNReal.ofReal_ne_top + +/-- The below-two supplied-solution Neumann CZ estimate with `L^p`-only datum. -/ +theorem centeredCubeH1MeanZeroNeumannDivergence_cz_lpData_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))), 0 < sigma0 → + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH1MeanZeroNeumannDivergence_cz_of_two_lt d + q.conjugate (INTERNAL.conjugate_toReal_gt_two_of_lt_two q hq) + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let F : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let H : Vec d → HilbertVec d := hilbertifyVecField h.toField + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hFtwo : MemLp F 2 μ := by + simpa only [F, μ] using centeredCube_memLp_hilbertMeanZeroGradient_two u + have hHq : MemLp H q.exponent μ := by + simpa only [H, μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! h.euclideanMemLp + have hFmeas : AEStronglyMeasurable F μ := hFtwo.aestronglyMeasurable + let A : ℝ≥0∞ := C * (ENNReal.ofReal sigma0)⁻¹ * eLpNorm H q.exponent μ + have hmain : eLpNorm F q.exponent μ ≤ A := by + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + apply INTERNAL.eLpNorm_le_of_truncated_cross_bound hqreal hFmeas + intro n + let Gfield := INTERNAL.cubeRadialTruncationL2LpField + (originCube d m) q u.toH1Function.grad + (by + simpa only [volumeMeasureOn, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).aestronglyMeasurable) n + let G : Vec d → Vec d := Gfield.toField + have hGtwo : MemVectorL2 (openCubeSet (originCube d m)) G := by + simpa only [G, Gfield] using INTERNAL.cubeRadialTruncation_memVectorL2 + (originCube d m) q u.toH1Function.grad + (by + simpa only [volumeMeasureOn, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).aestronglyMeasurable) n + let v := centeredCubeMeanZeroScalarDivergenceSolution m hsigma0 G hGtwo + have hk : Integrable (fun x => vecDot (u.toH1Function.grad x) (G x)) μ := by + simpa only [μ] using INTERNAL.centeredCube_integrable_vecDot_of_memVectorL2 m + u.toH1Function.grad_memVectorL2 hGtwo + have hk0 : 0 ≤ᵐ[μ] fun x => vecDot (u.toH1Function.grad x) (G x) := by + filter_upwards with x + change 0 ≤ vecDot (u.toH1Function.grad x) + (INTERNAL.vectorRadialTruncation q.exponent.toReal n u.toH1Function.grad x) + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self hqreal] + split_ifs with hx + · exact Real.rpow_nonneg (euclideanNorm_nonneg _) _ + · exact le_rfl + have hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal + (vecDot (u.toH1Function.grad x) (G x)) = + INTERNAL.truncatedMoment q.exponent.toReal n F x := by + filter_upwards with x + simpa only [F, G, Gfield] using! + INTERNAL.ofReal_vecDot_vectorRadialTruncation_eq_truncatedMoment + hqreal n u.toH1Function.grad x + have hJ : (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := + INTERNAL.lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint + refine ⟨?_, ?_⟩ + · rw [hJ] + exact ENNReal.ofReal_ne_top + have hvsolution : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) v (fun x ↦ -Gfield.toField x) := by + simpa only [v, G] using + centeredCubeMeanZeroScalarDivergenceSolution_isWeakSolution + m hsigma0 G hGtwo + have hvbound := hC m sigma0 Gfield v hsigma0 hvsolution + have hGq : MemLp (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [μ, G, Gfield, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! Gfield.euclideanMemLp + have hVtwo : MemLp (hilbertifyVecField v.toH1Function.grad) 2 μ := by + simpa only [v, μ] using centeredCube_memLp_hilbertMeanZeroGradient_two v + have hVbound : eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, μ, v, G, Gfield, hilbertifyVecField] using! hvbound + have hVq : MemLp (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + refine ⟨hVtwo.aestronglyMeasurable, ?_⟩ + apply lt_of_le_of_lt hVbound + apply ENNReal.mul_lt_top + · exact (ENNReal.mul_ne_top hCtop.ne + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0)))).lt_top + · exact hGq.eLpNorm_lt_top + have hcross := + centeredCubeMeanZeroScalarDivergenceSolution_normalized_cross_pairing + m hsigma0 u h.toField G hsolution hGtwo + have hholder := INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul + (F := h.toField) (G := v.toH1Function.grad) hHq hVq + have hGmoment : (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) ^ + q.conjugate.exponent.toReal = + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ := by + simpa only [μ, F, G, Gfield, hilbertifyVecField] using! + INTERNAL.eLpNorm_hilbertRadialTruncation_rpow_conjugate_eq_truncatedMoment q n F + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hqreal + have hexp : (q.conjugate.exponent.toReal)⁻¹ = 1 - q.exponent.toReal⁻¹ := by + have hsum := hreal.one_div_add_one_div + rw [one_div] at hsum + norm_num at hsum + linarith + have hGnorm : eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + have hr0 : q.conjugate.exponent.toReal ≠ 0 := by + exact ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne |>.ne' + calc + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ ^ + q.conjugate.exponent.toReal) ^ (q.conjugate.exponent.toReal)⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hr0, ENNReal.rpow_one] + _ = (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (q.conjugate.exponent.toReal)⁻¹ := by rw [hGmoment] + _ = _ := by rw [hexp] + calc + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := hJ + _ = ENNReal.ofReal + (∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ) := by + rw [hcross] + _ ≤ ENNReal.ofReal + |∫ x, vecDot (h.toField x) (v.toH1Function.grad x) ∂μ| := + ENNReal.ofReal_le_ofReal (le_abs_self _) + _ ≤ ENNReal.ofReal ((eLpNorm H q.exponent μ).toReal * + (eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ).toReal) := ENNReal.ofReal_le_ofReal hholder + _ = eLpNorm H q.exponent μ * + eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + rw [ENNReal.ofReal_mul ENNReal.toReal_nonneg, + ENNReal.ofReal_toReal hHq.eLpNorm_lt_top.ne, + ENNReal.ofReal_toReal hVq.eLpNorm_lt_top.ne] + _ ≤ eLpNorm H q.exponent μ * + (C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) := by + gcongr + _ = A * (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + rw [hGnorm] + dsimp only [A] + ac_rfl + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, F, H, μ, A] using! hmain + +/-- The supplied-solution centered-cube Neumann Calderón--Zygmund estimate for +every finite exponent and an `L^p` datum. No auxiliary `L²` hypothesis is +exposed. -/ +theorem centeredCubeH1MeanZeroNeumannDivergence_cz_lpData + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (h : CubeEuclideanLpField (originCube d m) q) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))), 0 < sigma0 → + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ C * (ENNReal.ofReal sigma0)⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + h.toField := by + by_cases hlt : q.exponent.toReal < 2 + · exact centeredCubeH1MeanZeroNeumannDivergence_cz_lpData_of_lt_two d q hlt + by_cases hgt : 2 < q.exponent.toReal + · obtain ⟨C, hCtop, hC⟩ := + centeredCubeH1MeanZeroNeumannDivergence_cz_of_two_lt d q hgt + refine ⟨C, hCtop, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + have htwo_le : (2 : ℝ≥0∞) ≤ q.exponent := by + apply (ENNReal.toReal_le_toReal (by norm_num) q.lt_top.ne).mp + simpa only [ENNReal.toReal_ofNat] using hgt.le + let hL2Lp : CubeEuclideanL2LpField (originCube d m) q := + { toCubeEuclideanLpField := h + euclideanMemL2 := h.euclideanMemLp.mono_exponent htwo_le } + simpa only [hL2Lp] using hC m sigma0 hL2Lp u hsigma0 hsolution + have hreal : q.exponent.toReal = 2 := + le_antisymm (le_of_not_gt hgt) (le_of_not_gt hlt) + have hexp : q.exponent = 2 := by + apply (ENNReal.toReal_eq_toReal_iff' q.lt_top.ne (by norm_num)).mp + simpa only [ENNReal.toReal_ofNat] using hreal + have hq : q = FiniteLpExponent.two := by + cases q + simp only [FiniteLpExponent.two] at hexp ⊢ + cases hexp + rfl + subst q + refine ⟨1, by norm_num, ?_⟩ + intro m sigma0 h u hsigma0 hsolution + simpa only [one_mul] using + centeredCubeH1MeanZeroScalarDivergence_cz_two m sigma0 h u hsigma0 hsolution + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedGlobalEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedGlobalEnergy.lean new file mode 100644 index 0000000000..231518ce71 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedGlobalEnergy.lean @@ -0,0 +1,185 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedGlobalEnergy + +/-! +# Global energy for centered-Neumann even reflection + +The centered-Neumann good-`lambda` argument uses the same parent-cube zero +extensions as the Dirichlet argument, but the solution gradient and datum are +transported by the coordinate-fold even reflection. This file identifies the +actual global energy of those extensions with its source-cube expression. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- Source-cube squared energy represented by the zero-extended Neumann even +reflections on the centered parent. -/ +noncomputable def neumannReflectedSourceSquaredEnergy {d : ℕ} (m : ℤ) + (eps sigma0 : ℝ) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : ℝ := + (3 : ℝ) ^ d * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) + +/-- Natural large-scale cutoff formed from the exact reflected Neumann +source energy. -/ +noncomputable def neumannReflectedGoodLambdaCutoff {d : ℕ} (m : ℤ) + (depth : ℕ) (eps sigma0 : ℝ) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : ℝ := + Real.sqrt (((2 * reflectedStoppingRadius (d := d) m depth) ^ d)⁻¹ * + neumannReflectedSourceSquaredEnergy (d := d) m eps sigma0 u H) + +theorem neumannReflectedGoodLambdaCutoff_nonneg {d : ℕ} (m : ℤ) + (depth : ℕ) (eps sigma0 : ℝ) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : + 0 ≤ neumannReflectedGoodLambdaCutoff m depth eps sigma0 u H := by + unfold neumannReflectedGoodLambdaCutoff + exact Real.sqrt_nonneg _ + +/-- The zero-extended gradient of an even-reflected centered-Neumann solution +has exactly `3^d` times its source-cube squared energy. -/ +theorem integral_sqNorm_reflectedParentGradientExtension_eq_three_pow_of_evenReflection + {d : ℕ} {m : ℤ} + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (huP : uP.grad = cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y)) : + ∫ x, ‖reflectedParentGradientExtension m uP x‖ ^ (2 : ℕ) ∂volume = + (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂volume := by + have hu : MemVectorL2 (openCubeSet (originCube d m)) + (fun y ↦ u.toH1Function.grad y) := by + simpa only [MemVectorL2, volumeMeasureOn] using + u.toH1Function.grad_memVectorL2 + rw [integral_sqNorm_reflectedParentGradientExtension, huP] + simpa only [hilbertifyVecField, HilbertVec.norm_sq_ofVec] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + hu + +/-- The zero-extended even-reflected datum has exactly `3^d` times its +source-cube squared energy. -/ +theorem integral_sqNorm_hilbertify_reflectedParentDatumExtension_eq_three_pow_of_evenReflection + {d : ℕ} {m : ℤ} (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeCoordinateFoldReflectedVectorField (originCube d m) H) : + ∫ x, ‖hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ) ∂volume = + (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [integral_sqNorm_hilbertify_reflectedParentDatumExtension, hHP] + simpa only [hilbertifyVecField, HilbertVec.norm_sq_ofVec] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + hH + +/-- The even-reflected source datum is globally square-integrable after +parent restriction and extension by zero. -/ +theorem memLp_hilbertify_reflectedParentDatumExtension_two_of_evenReflection + {d : ℕ} {m : ℤ} (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeCoordinateFoldReflectedVectorField (originCube d m) H) : + MemLp (hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume := by + apply memLp_hilbertify_reflectedParentDatumExtension_two m HP + rw [hHP] + exact + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + hH + +/-- Exact scalar rescaling of the even-reflected datum energy. -/ +theorem integral_sqNorm_smul_hilbertify_reflectedParentDatumExtension_eq_three_pow_of_evenReflection + {d : ℕ} {m : ℤ} {sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeCoordinateFoldReflectedVectorField (originCube d m) H) : + ∫ x, ‖sigma0⁻¹ • + hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ) ∂volume = + (sigma0⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + have hpoint : + (fun x : Vec d ↦ + ‖sigma0⁻¹ • + hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ)) = + fun x ↦ (sigma0⁻¹) ^ (2 : ℕ) * + ‖hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ) := by + funext x + rw [norm_smul, Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le)] + ring + rw [hpoint, MeasureTheory.integral_const_mul, + integral_sqNorm_hilbertify_reflectedParentDatumExtension_eq_three_pow_of_evenReflection + H HP hH hHP] + ring + +/-- The global squared energy of the actual zero extensions agrees exactly +with the centered-Neumann source energy. -/ +theorem reflectedGlobalSquaredEnergy_eq_neumannReflectedSourceSquaredEnergy + {d : ℕ} {m : ℤ} {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (huP : uP.grad = cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y)) + (hHP : HP = cubeCoordinateFoldReflectedVectorField (originCube d m) H) : + reflectedGlobalSquaredEnergy m eps sigma0 uP HP = + neumannReflectedSourceSquaredEnergy m eps sigma0 u H := by + unfold reflectedGlobalSquaredEnergy neumannReflectedSourceSquaredEnergy + rw [integral_sqNorm_reflectedParentGradientExtension_eq_three_pow_of_evenReflection + u uP huP, + integral_sqNorm_smul_hilbertify_reflectedParentDatumExtension_eq_three_pow_of_evenReflection + hsigma0 H HP hH hHP] + ring + +/-- The source-facing Neumann cutoff is exactly the cutoff formed from the +global energy of the actual zero extensions. -/ +theorem neumannReflectedGoodLambdaCutoff_eq_globalEnergy + {d : ℕ} {m : ℤ} {depth : ℕ} {eps sigma0 : ℝ} + (hsigma0 : 0 < sigma0) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (huP : uP.grad = cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y)) + (hHP : HP = cubeCoordinateFoldReflectedVectorField (originCube d m) H) : + neumannReflectedGoodLambdaCutoff m depth eps sigma0 u H = + Real.sqrt (((2 * reflectedStoppingRadius (d := d) m depth) ^ d)⁻¹ * + reflectedGlobalSquaredEnergy m eps sigma0 uP HP) := by + unfold neumannReflectedGoodLambdaCutoff + rw [reflectedGlobalSquaredEnergy_eq_neumannReflectedSourceSquaredEnergy + hsigma0 u uP H HP hH huP hHP] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedOneLevelTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedOneLevelTail.lean new file mode 100644 index 0000000000..8c1460d24b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectedOneLevelTail.lean @@ -0,0 +1,359 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalStoppingFamily +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaTailControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliAssembly + +/-! +# The centered-Neumann reflected one-level good-`lambda` inequality + +Even reflection, extension by zero, global stopping, local harmonic comparison, +and Vitali selection are all constructed internally from the source Neumann +weak solution and its `L²` datum. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-- The centered-Neumann one-level good-`lambda` bound obtained from the +even-reflected parent problem. -/ +theorem sqWeightedMeasure_neumannReflected_oneLevel_tail_originCube + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (hq : 2 < q.exponent.toReal) {m : ℤ} {sigma0 eps M level : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (H : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -H x)) + (hlevel : neumannReflectedGoodLambdaCutoff + m depth eps sigma0 u H < level) : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) ≤ + ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField H) volume + ({x | eps * level / 2 < + ‖(sigma0⁻¹ • hilbertifyVecField H) x‖} ∩ + openCubeSet (originCube d m))) := by + let Q : Set (Vec d) := openCubeSet (originCube d m) + let P : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let fu : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField H + obtain ⟨uP, huP_grad, hweakP⟩ := + exists_h1Function_neumannEvenReflectionParent_divergence_rhs_originCube + u hH hweak + let HP : Vec d → Vec d := + cubeCoordinateFoldReflectedVectorField (originCube d m) H + have hHP : MemVectorL2 P HP := by + simpa only [P, HP] using + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + hH + have hweakP' : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → tsupport phi ⊆ P → + sigma0 * ∫ y in P, + vecDot (uP.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in P, vecDot (HP y) (euclideanGradient phi y) ∂volume := by + simpa only [P, HP] using hweakP + let F : Vec d → HilbertVec d := reflectedParentGradientExtension m uP + let Hext : Vec d → Vec d := reflectedParentDatumExtension m HP + let gext : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField Hext + have hF : MemLp F 2 volume := by + simpa only [F] using memLp_reflectedParentGradientExtension_two m uP + have hHext : MemLp (hilbertifyVecField Hext) 2 volume := by + simpa only [Hext] using + memLp_hilbertify_reflectedParentDatumExtension_two m HP hHP + have hgext : MemLp gext 2 volume := hHext.const_smul sigma0⁻¹ + have hcutoff : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖F y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * + ∫ y, ‖gext y‖ ^ (2 : ℕ) ∂volume)) < level := by + have hglobal := neumannReflectedGoodLambdaCutoff_eq_globalEnergy + (depth := depth) (eps := eps) hsigma0 u uP H HP hH huP_grad (by rfl) + rw [hglobal] at hlevel + simpa only [reflectedStoppingRadius, reflectedGlobalSquaredEnergy, F, Hext, + gext] using! hlevel + have hlevel_pos : 0 < level := + lt_of_le_of_lt (Real.sqrt_nonneg _) hcutoff + let T : Set (Vec d) := {x | M * level < ‖F x‖} ∩ Q + obtain ⟨D, radius, hDnull, hradius⟩ := + exists_globalStoppingFamily depth F gext eps M level hF hgext heps hM + hcutoff T (by intro x hx; exact hx.1) + have hQP : Q ⊆ P := by + intro x hx + exact cubeFaceReflectionBlockSet_originCube_subset_openCubeSet_succ d m + (openCubeSet_subset_cubeFaceReflectionBlockSet (originCube d m) hx) + have hQmeas : MeasurableSet Q := by + simpa only [Q] using measurableSet_openCubeSet (originCube d m) + have hPmeas : MeasurableSet P := by + simpa only [P] using measurableSet_openCubeSet (originCube d (m + 1)) + have hFQ : F =ᵐ[volume.restrict Q] fu := by + filter_upwards [ae_restrict_mem hQmeas] with x hx + change (P.indicator (hilbertifyVecField uP.grad)) x = fu x + rw [Set.indicator_of_mem (hQP hx)] + change HilbertVec.ofVec (uP.grad x) = + HilbertVec.ofVec (u.toH1Function.grad x) + rw [huP_grad, + cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet + (originCube d m) _ hx] + let K : ℝ≥0∞ := oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + have hvitali : sqWeightedMeasure F volume (T ∩ D) ≤ + K * oneStoppingBallTailControl F gext eps level P := by + apply measure_le_mul_measure_of_vitali_stopping_family + (sqWeightedMeasure F volume) (oneStoppingBallTailControl F gext eps level) + (T ∩ D) P radius + (cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) 5 K + · intro x hx + exact (hradius x hx).2.1 + · intro x hx + exact (hradius x hx).1 + · norm_num + · intro x hx + obtain ⟨hr, hcutoffx, hstop, hlast⟩ := hradius x hx + obtain ⟨_hF, _hHext, hlocalF, hlocalweak⟩ := + reflectedParent_oneStoppingBall_inputs (depth := depth) + (sigma0 := sigma0) (by exact hx.1.2) hr hcutoffx uP HP hHP hweakP' + have hball := sqWeightedMeasure_oneStoppingBall_le G hq x hr hsigma0 + heps heps_one (lt_of_lt_of_le zero_lt_one hM) hlevel_pos hcutoffx F + Hext hF hHext + (reflectedParentLocalSolution (depth := depth) m x (radius x) uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx.1.2 hr hcutoffx)) hlocalF hlocalweak hstop hlast + have hmono : + sqWeightedMeasure F volume + ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ + Metric.closedBall x (5 * radius x)) := by + apply measure_mono + intro y hy + exact ⟨hy.1.1.1, hy.2⟩ + calc + sqWeightedMeasure F volume + ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ + Metric.closedBall x (5 * radius x)) := hmono + _ ≤ K * + (sqWeightedMeasure F volume + ({y | level / 2 < ‖F y‖} ∩ + Metric.closedBall x (radius x)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({y | eps * level / 2 < ‖gext y‖} ∩ + Metric.closedBall x (radius x))) := by + simpa only [K, gext] using hball + _ = K * oneStoppingBallTailControl F gext eps level + (Metric.closedBall x (radius x)) := by + rw [oneStoppingBallTailControl_apply F gext eps level + measurableSet_closedBall] + · intro y hy + rcases Set.mem_iUnion₂.mp hy with ⟨x, hx, hyx⟩ + obtain ⟨hr, hcutoffx, _hstop, _hlast⟩ := hradius x hx + exact closedBall_subset_openCubeSet_originCube_succ_of_mem hx.1.2 hr.le + (by + have hdenom : 2 ≤ 10 * (3 : ℝ) ^ depth := by + have hpow : 1 ≤ (3 : ℝ) ^ depth := + one_le_pow₀ (by norm_num) + nlinarith + exact hcutoffx.trans (div_le_div_of_nonneg_left + (cubeRadius_pos _).le (by norm_num) hdenom)) hyx + have hnuD : sqWeightedMeasure F volume Dᶜ = 0 := + MeasureTheory.withDensity_absolutelyContinuous volume _ hDnull + have hTD : sqWeightedMeasure F volume (T ∩ D) = + sqWeightedMeasure F volume T := + MeasureTheory.measure_inter_conull hnuD + have hfu_meas : AEStronglyMeasurable fu (volume.restrict Q) := by + simpa only [fu, Q, volumeMeasureOn] using + (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hF_tail (a : ℝ) : + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by + have hindicator := sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (f := hilbertifyVecField uP.grad) (a := a) + hPmeas hPmeas (by rintro x hx; exact hx) + have hreflect : + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x)‖} ∩ P) := by + simpa only [F, P, reflectedParentGradientExtension, huP_grad] using! + hindicator + calc + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x)‖} ∩ P) := hreflect + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) := by + simpa only [fu, Q, mul_comm] using! + sqWeightedMeasure_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_tail + (fun y ↦ u.toH1Function.grad y) hfu_meas + _ = sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by ring + have hFQpoint : ∀ x ∈ Q, F x = fu x := by + intro x hx + change (P.indicator (hilbertifyVecField uP.grad)) x = fu x + rw [Set.indicator_of_mem (hQP hx)] + change HilbertVec.ofVec (uP.grad x) = + HilbertVec.ofVec (u.toH1Function.grad x) + rw [huP_grad, + cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet + (originCube d m) _ hx] + have hT_eq : T = {x | M * level < ‖fu x‖} ∩ Q := by + ext x + simp only [T, Set.mem_inter_iff, Set.mem_ofPred_eq] + constructor + · intro hx + exact ⟨by rw [hFQpoint x hx.2] at hx; exact hx.1, hx.2⟩ + · intro hx + exact ⟨by rw [hFQpoint x hx.2]; exact hx.1, hx.2⟩ + have hT_source : sqWeightedMeasure F volume T = + sqWeightedMeasure fu volume + ({x | M * level < ‖fu x‖} ∩ Q) := by + rw [hT_eq] + exact sqWeightedMeasure_apply_inter_eq_of_ae_eq_restrict hQmeas hFQ + have hHP_scalar : + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x)) = + sigma0⁻¹ • hilbertifyVecField HP := by + funext x + change (HilbertVec.ofVecL d) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x) = + sigma0⁻¹ • (HilbertVec.ofVecL d) (HP x) + rw [← (HilbertVec.ofVecL d).map_smul] + congr 1 + funext i + simp only [HP, cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, + smul_eq_mul] + ring + have hgext_indicator : + gext = P.indicator (sigma0⁻¹ • hilbertifyVecField HP) := by + change sigma0⁻¹ • hilbertifyVecField Hext = + P.indicator (sigma0⁻¹ • hilbertifyVecField HP) + rw [show hilbertifyVecField Hext = + P.indicator (hilbertifyVecField HP) by + simpa only [Hext] using + hilbertifyVecField_reflectedParentDatumExtension m HP] + funext x + change sigma0⁻¹ • (P.indicator (hilbertifyVecField HP)) x = + P.indicator (sigma0⁻¹ • hilbertifyVecField HP) x + by_cases hx : x ∈ P + · rw [Set.indicator_of_mem hx, Set.indicator_of_mem hx] + rfl + · rw [Set.indicator_of_notMem hx, Set.indicator_of_notMem hx] + exact smul_zero _ + have hH_source_meas : + AEStronglyMeasurable (sigma0⁻¹ • hilbertifyVecField H) + (volume.restrict Q) := + (memHilbertVectorL2_hilbertifyVecField hH).const_smul sigma0⁻¹ + |>.aestronglyMeasurable + have hgext_tail (a : ℝ) : + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by + have hindicator := sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (f := sigma0⁻¹ • hilbertifyVecField HP) (a := a) + hPmeas hPmeas (by rintro x hx; exact hx) + have hreflect : + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x)‖} ∩ P) := by + rw [hgext_indicator, hindicator] + rw [← hHP_scalar] + calc + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (sigma0⁻¹ • H) x)‖} ∩ P) := hreflect + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) := by + simpa only [g, Q, mul_comm] using! + sqWeightedMeasure_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_tail + (sigma0⁻¹ • H) hH_source_meas + _ = sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by ring + have hkappa : oneStoppingBallTailControl F gext eps level P = + sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ P) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ P) := + oneStoppingBallTailControl_apply_ambient F gext eps level hPmeas + calc + sqWeightedMeasure fu volume + ({x | M * level < ‖fu x‖} ∩ Q) = + sqWeightedMeasure F volume T := hT_source.symm + _ = sqWeightedMeasure F volume (T ∩ D) := hTD.symm + _ ≤ K * oneStoppingBallTailControl F gext eps level P := hvitali + _ = K * + (sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ P) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ P)) := by rw [hkappa] + _ = ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure fu volume + ({x | level / 2 < ‖fu x‖} ∩ Q) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure g volume + ({x | eps * level / 2 < ‖g x‖} ∩ Q)) := by + rw [hF_tail (level / 2), hgext_tail (eps * level / 2)] + dsimp only [K] + ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionFiniteP.lean new file mode 100644 index 0000000000..8ca87d7a2c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionFiniteP.lean @@ -0,0 +1,340 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 + +/-! +# Finite-p transport under Neumann even reflection + +The all-face Neumann reflection acts on vector fields by the coordinate-fold +linear isometries. Its Euclidean norm therefore agrees pointwise with the +already-developed Dirichlet odd reflection, whose additional scalar sign has +unit modulus. This file transfers the exact finite-`p` norm and weighted-tail +identities to the even reflection used by the Neumann good-`lambda` argument. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +open MeasureTheory +open CubeCalderonZygmund + +/-- The stored normalized Euclidean `L²` witness gives the raw vector `L²` +datum required by the Neumann weak equation on the source open cube. -/ +theorem CubeEuclideanL2LpField.memVectorL2_openCubeSet + {d : ℕ} {Q : TriadicCube d} {p : FiniteLpExponent} + (G : CubeEuclideanL2LpField Q p) : + MemVectorL2 (openCubeSet Q) G.toField := by + have hnormalized : MemLp (fun x ↦ HilbertVec.ofVec (G.toField x)) 2 + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + simpa only + [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using G.euclideanMemL2 + have hrestricted : MemLp (fun x ↦ HilbertVec.ofVec (G.toField x)) 2 + (cubeBoundedMeasurableDomain Q).restrictedVolume := + ((cubeBoundedMeasurableDomain Q).memLp_normalizedVolume_iff 2 _).mp + hnormalized + have hopen : MemLp (fun x ↦ HilbertVec.ofVec (G.toField x)) 2 + (volume.restrict (openCubeSet Q)) := by + simpa only + [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hrestricted + let T : HilbertVec d →L[ℝ] Vec d := + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap + simpa only [MemVectorL2, volumeMeasureOn, Function.comp_def, + HilbertVec.toVec_ofVec, T] using! T.comp_memLp' hopen + +/-- The Neumann even reflection and Dirichlet odd reflection have the same +pointwise Euclidean norm. -/ +theorem norm_hilbertVec_ofVec_cubeCoordinateFoldReflectedVectorField_eq_oddReflection + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) (x : Vec d) : + ‖HilbertVec.ofVec (cubeCoordinateFoldReflectedVectorField Q G x)‖ = + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ := by + apply (sq_eq_sq₀ (norm_nonneg _) (norm_nonneg _)).mp + rw [HilbertVec.norm_sq_ofVec, HilbertVec.norm_sq_ofVec] + exact (cubeDirichletOddReflectionVectorField_self_pairing Q G x).symm + +/-- Every `L^p` seminorm of the Neumann even reflection agrees with the +corresponding Dirichlet odd-reflection seminorm. -/ +theorem eLpNorm_cubeCoordinateFoldReflectedVectorField_eq_oddReflection + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) (p : ℝ≥0∞) + (mu : Measure (Vec d)) : + eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField Q G x)) p mu = + eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField Q G x)) p mu := by + apply eLpNorm_congr_norm_ae + filter_upwards with x + exact + norm_hilbertVec_ofVec_cubeCoordinateFoldReflectedVectorField_eq_oddReflection + Q G x + +/-- Exact finite-`p` scaling from a centered cube to its parent under Neumann +even reflection. -/ +theorem eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (p : FiniteLpExponent) : + eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) + p.exponent + (volume.restrict (openCubeSet (originCube d (m + 1)))) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm (fun x ↦ HilbertVec.ofVec (G x)) p.exponent + (volume.restrict (openCubeSet (originCube d m))) := by + rw [eLpNorm_cubeCoordinateFoldReflectedVectorField_eq_oddReflection] + exact + eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + G p + +private theorem aestronglyMeasurable_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} + (hG : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (G x)) + (volume.restrict (openCubeSet (originCube d m)))) : + AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) + (volume.restrict (openCubeSet (originCube d (m + 1)))) := by + classical + have hmeasure : + volume.restrict (openCubeSet (originCube d (m + 1))) = + volume.restrict (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure, cubeFaceReflectionBlockSet_eq_iUnion_cellCube] + apply AEStronglyMeasurable.iUnion + intro choice + let T : Vec d → Vec d := + cubeFaceReflectionCellFoldMap (originCube d m) choice + have hmp : MeasurePreserving T + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))) + (volume.restrict (openCubeSet (originCube d m))) := by + simpa [T, preimage_cubeFaceReflectionCellFoldMap_openCubeSet] using + (measurePreserving_cubeFaceReflectionCellFoldMap + (originCube d m) choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap + (originCube d m) choice) + (openCubeSet (originCube d m)) + have hcomp : AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (G (T x))) + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))) := by + have hGmap : AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (G x)) + (Measure.map T + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice)))) := by + rw [hmp.map_eq] + exact hG + simpa [Function.comp_def] using hGmap.comp_aemeasurable hmp.aemeasurable + have hvec : AEStronglyMeasurable (fun x ↦ G (T x)) + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))) := by + simpa using + (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable + hcomp + have hlinear : AEStronglyMeasurable + (fun x ↦ cubeFaceReflectionCellFoldLinear choice (G (T x))) + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))) := + (cubeFaceReflectionCellFoldLinear choice).continuous.comp_aestronglyMeasurable + hvec + have hhilbert : AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (cubeFaceReflectionCellFoldLinear choice (G (T x)))) + (volume.restrict + (openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))) := + (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable hlinear + refine hhilbert.congr ?_ + filter_upwards + [ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube (originCube d m) choice))] with x hx + exact congrArg HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + (originCube d m) choice G hx).symm + +/-- Finite-`p` membership transports from a centered cube to its parent under +Neumann even reflection. -/ +theorem memLp_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} (p : FiniteLpExponent) + (hG : MemLp (fun x ↦ HilbertVec.ofVec (G x)) p.exponent + (volume.restrict (openCubeSet (originCube d m)))) : + MemLp + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) + p.exponent + (volume.restrict (openCubeSet (originCube d (m + 1)))) := by + refine ⟨aestronglyMeasurable_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + hG.aestronglyMeasurable, ?_⟩ + rw [eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField] + refine ENNReal.mul_lt_top ?_ hG.eLpNorm_lt_top + exact ENNReal.rpow_lt_top_of_nonneg (by positivity) (by simp) + +private theorem normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet + {d : ℕ} (m : ℤ) : + normalizedCubeMeasure (originCube d m) = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + +private theorem restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure + {d : ℕ} (m : ℤ) : + volume.restrict (openCubeSet (originCube d m)) = + ENNReal.ofReal (cubeVolume (originCube d m)) • + normalizedCubeMeasure (originCube d m) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos _), smul_smul] + have hnonzero : ENNReal.ofReal (cubeVolume (originCube d m)) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos _) + have hone : ENNReal.ofReal (cubeVolume (originCube d m)) * + (ENNReal.ofReal (cubeVolume (originCube d m)))⁻¹ = 1 := by + simpa [mul_comm] using + ENNReal.inv_mul_cancel hnonzero ENNReal.ofReal_ne_top + rw [hone, one_smul] + +/-- Normalized finite-`p` norms are exactly preserved from a centered cube to +its parent under Neumann even reflection. -/ +theorem eLpNorm_normalizedCubeMeasure_succ_originCube_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (p : FiniteLpExponent) : + eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm (fun x ↦ HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [eLpNorm_cubeCoordinateFoldReflectedVectorField_eq_oddReflection] + exact + eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionVectorField + G p + +/-- Normalized finite-`p` membership is preserved by Neumann even reflection. -/ +theorem memLp_normalizedCubeMeasure_succ_originCube_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} (p : FiniteLpExponent) + (hG : MemLp (fun x ↦ HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure (originCube d m))) : + MemLp + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + have hGopen : MemLp (fun x ↦ HilbertVec.ofVec (G x)) p.exponent + (volume.restrict (openCubeSet (originCube d m))) := by + rw [restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure] + exact hG.smul_measure ENNReal.ofReal_ne_top + have hreflect := + memLp_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + p hGopen + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + exact hreflect.smul_measure ENNReal.ofReal_ne_top + +/-- Radial nonnegative integrals on the reflected parent consist of exactly +`3^d` copies of the source-cube integral. -/ +theorem lintegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_comp_norm + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (Phi : ℝ → ℝ≥0∞) : + ∫⁻ x in openCubeSet (originCube d (m + 1)), + Phi ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)‖ + ∂volume = + ((3 : ℝ≥0∞) ^ d) * + ∫⁻ y in openCubeSet (originCube d m), + Phi ‖HilbertVec.ofVec (G y)‖ ∂volume := by + calc + ∫⁻ x in openCubeSet (originCube d (m + 1)), + Phi ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)‖ + ∂volume = + ∫⁻ x in openCubeSet (originCube d (m + 1)), + Phi ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)‖ + ∂volume := by + apply lintegral_congr + intro x + rw [norm_hilbertVec_ofVec_cubeCoordinateFoldReflectedVectorField_eq_oddReflection] + _ = _ := + lintegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_comp_norm + G Phi + +/-- Square-weighted level tails have the exact `3^d` reflection factor under +Neumann even reflection. -/ +theorem sqWeightedMeasure_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_tail + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) {a : ℝ} + (hG : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (G x)) + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x)‖} ∩ + openCubeSet (originCube d (m + 1))) = + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x ↦ HilbertVec.ofVec (G x)) volume + ({x | a < ‖HilbertVec.ofVec (G x)‖} ∩ + openCubeSet (originCube d m)) := by + let E : Vec d → HilbertVec d := fun x ↦ HilbertVec.ofVec + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + let O : Vec d → HilbertVec d := fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + have hnorm : ∀ x, ‖E x‖ = ‖O x‖ := fun x ↦ + norm_hilbertVec_ofVec_cubeCoordinateFoldReflectedVectorField_eq_oddReflection + (originCube d m) G x + have hmeasure : sqWeightedMeasure E volume = sqWeightedMeasure O volume := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards with x + rw [hnorm x] + have htail : {x | a < ‖E x‖} = {x | a < ‖O x‖} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [hnorm x] + change sqWeightedMeasure E volume + ({x | a < ‖E x‖} ∩ openCubeSet (originCube d (m + 1))) = _ + rw [hmeasure, htail] + exact + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + G hG + +/-- Reflect an `L² ∩ L^p` datum to the centered parent cube, preserving both +stored normalized memberships exactly. -/ +noncomputable def CubeEuclideanL2LpField.neumannEvenReflectionToParent + {d : ℕ} {m : ℤ} {p : FiniteLpExponent} + (G : CubeEuclideanL2LpField (originCube d m) p) : + CubeEuclideanL2LpField (originCube d (m + 1)) p where + toField := cubeCoordinateFoldReflectedVectorField (originCube d m) G.toField + euclideanMemLp := + memLp_normalizedCubeMeasure_succ_originCube_cubeCoordinateFoldReflectedVectorField + p G.euclideanMemLp + euclideanMemL2 := by + simpa only [FiniteLpExponent.two_exponent] using + memLp_normalizedCubeMeasure_succ_originCube_cubeCoordinateFoldReflectedVectorField + FiniteLpExponent.two G.euclideanMemL2 + +@[simp] theorem CubeEuclideanL2LpField.neumannEvenReflectionToParent_toField + {d : ℕ} {m : ℤ} {p : FiniteLpExponent} + (G : CubeEuclideanL2LpField (originCube d m) p) : + G.neumannEvenReflectionToParent.toField = + cubeCoordinateFoldReflectedVectorField (originCube d m) G.toField := + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionWeakEquation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionWeakEquation.lean new file mode 100644 index 0000000000..978e31beaa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/Neumann/ReflectionWeakEquation.lean @@ -0,0 +1,329 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.ScalarMatrix +public import LeanPool.CoarseGraining.Homogenization.PDE.NeumannRHS +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentOrthogonality + +/-! +# Neumann divergence equations under even reflection + +A compactly supported parent test is folded through every reflection cell and +summed on the source cube. Its gradient is exactly the folded parent gradient +appearing in the existing change-of-variables theorem. Subtracting its source +average makes it an admissible mean-zero Neumann test without changing that +gradient. This proves the reflected divergence equation without introducing +any boundary or comparison hypothesis. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +open MeasureTheory Set +open CubeCalderonZygmund + +/-- Unsigned fold of a parent scalar test through all reflection cells. -/ +def neumannEvenFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (phi : Vec d → ℝ) : Vec d → ℝ := + fun y ↦ + ∑ choice : Fin d → Fin 3, + phi (cubeFaceReflectionCellFoldMap Q choice y) + +private theorem hasCompactSupport_finset_sum + {alpha beta iota : Type*} [TopologicalSpace alpha] [AddCommMonoid beta] + [DecidableEq iota] (s : Finset iota) (f : iota → alpha → beta) + (hf : ∀ i ∈ s, HasCompactSupport (f i)) : + HasCompactSupport (fun x ↦ ∑ i ∈ s, f i x) := by + classical + revert hf + refine Finset.induction_on s ?_ ?_ + · intro _hf + simpa using! (HasCompactSupport.zero : + HasCompactSupport (fun _ : alpha ↦ (0 : beta))) + · intro a s has hs hf + have ha : HasCompactSupport (f a) := hf a (by simp [has]) + have hs' : HasCompactSupport (fun x ↦ ∑ i ∈ s, f i x) := + hs (fun i hi ↦ hf i (Finset.mem_insert_of_mem hi)) + simpa [Finset.sum_insert has] using! ha.add hs' + +/-- The unsigned folded parent test is smooth. -/ +theorem contDiff_neumannEvenFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) {phi : Vec d → ℝ} + (hphi : ContDiff ℝ (⊤ : ℕ∞) phi) : + ContDiff ℝ (⊤ : ℕ∞) (neumannEvenFoldedParentScalarTest Q phi) := by + classical + unfold neumannEvenFoldedParentScalarTest + exact ContDiff.sum fun choice _ ↦ + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hphi + +/-- The unsigned folded parent test has compact support. -/ +theorem hasCompactSupport_neumannEvenFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) {phi : Vec d → ℝ} + (hphi : HasCompactSupport phi) : + HasCompactSupport (neumannEvenFoldedParentScalarTest Q phi) := by + classical + unfold neumannEvenFoldedParentScalarTest + simpa using + hasCompactSupport_finset_sum + (Finset.univ : Finset (Fin d → Fin 3)) + (fun choice y ↦ phi (cubeFaceReflectionCellFoldMap Q choice y)) + (by + intro choice _hchoice + exact hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hphi) + +/-- Coordinate derivative of the unsigned folded parent test. -/ +theorem euclideanCoordDeriv_neumannEvenFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {phi : Vec d → ℝ} + (hphi : ContDiff ℝ (⊤ : ℕ∞) phi) (y : Vec d) : + euclideanCoordDeriv i (neumannEvenFoldedParentScalarTest Q phi) y = + ∑ choice : Fin d → Fin 3, + cubeFaceReflectionCellFoldSign choice i * + euclideanCoordDeriv i phi + (cubeFaceReflectionCellFoldMap Q choice y) := by + classical + unfold neumannEvenFoldedParentScalarTest euclideanCoordDeriv + rw [fderiv_fun_sum] + · simp only [sum_apply] + apply Finset.sum_congr rfl + intro choice _hchoice + exact euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap + hphi Q choice i y + · intro choice _hchoice + exact + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hphi).differentiable + (by simp) y + +/-- The gradient of the folded scalar test is the existing folded parent +vector field applied to the parent gradient. -/ +theorem euclideanGradient_neumannEvenFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) {phi : Vec d → ℝ} + (hphi : ContDiff ℝ (⊤ : ℕ∞) phi) : + euclideanGradient (neumannEvenFoldedParentScalarTest Q phi) = + cubeFaceReflectionFoldedParentVectorField Q (euclideanGradient phi) := by + funext y i + rw [show + euclideanGradient (neumannEvenFoldedParentScalarTest Q phi) y i = + euclideanCoordDeriv i (neumannEvenFoldedParentScalarTest Q phi) y by + rfl] + rw [euclideanCoordDeriv_neumannEvenFoldedParentScalarTest Q i hphi y] + unfold cubeFaceReflectionFoldedParentVectorField + simp only [Finset.sum_apply, cubeFaceReflectionCellFoldLinear_apply] + apply Finset.sum_congr rfl + intro choice _hchoice + by_cases hchoice : choice i = 1 + · simp [cubeFaceReflectionCellFoldSign, hchoice] + rfl + · simp [cubeFaceReflectionCellFoldSign, hchoice] + rfl + +/-- Convert the raw scalar-matrix Neumann predicate with datum `-h` to the +explicit constant-coefficient negative-pairing equation. -/ +theorem IsMeanZeroNeumannRhsWeakSolution.scalarMatrix_neg_weak + {d : ℕ} {U : Set (Vec d)} {sigma0 : ℝ} + {u : H1MeanZeroFunction U} {h : Vec d → Vec d} + (hweak : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) U u (fun x ↦ -h x)) : + ∀ psi : H1MeanZeroFunction U, + sigma0 * ∫ x in U, + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in U, + vecDot (h x) (psi.toH1Function.grad x) ∂volume := by + intro psi + simpa only [matVecMul_scalarMatrix, vecDot_smul_left, integral_const_mul, + Pi.neg_apply, vecDot_neg_left, integral_neg] using hweak psi + +private theorem neumannEvenReflection_parent_weakEquation + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + {u : H1MeanZeroFunction (openCubeSet (originCube d m))} + {h : Vec d → Vec d} + (hh : MemVectorL2 (openCubeSet (originCube d m)) h) + (hweak : ∀ psi : H1MeanZeroFunction (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h x) (psi.toH1Function.grad x) ∂volume) + {phi : Vec d → ℝ} (hphi : ContDiff ℝ (⊤ : ℕ∞) phi) + (hphi_compact : HasCompactSupport phi) : + sigma0 * ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x) + (euclideanGradient phi x) ∂volume = + -∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) h x) + (euclideanGradient phi x) ∂volume := by + let Q : TriadicCube d := originCube d m + let v : H1Function (openCubeSet Q) := + H1Function.ofContDiff (isOpen_openCubeSet Q) + ((contDiff_neumannEvenFoldedParentScalarTest Q hphi).of_le (by simp)) + (hasCompactSupport_neumannEvenFoldedParentScalarTest Q hphi_compact) + let psi : H1MeanZeroFunction (openCubeSet Q) := v.toMeanZero + have hpsi_grad : psi.toH1Function.grad = + cubeFaceReflectionFoldedParentVectorField Q (euclideanGradient phi) := by + funext y i + simp only [psi, H1Function.toMeanZero_grad] + change euclideanGradient (neumannEvenFoldedParentScalarTest Q phi) y i = _ + rw [euclideanGradient_neumannEvenFoldedParentScalarTest Q hphi] + have hsource := hweak psi + have hsource' : + sigma0 * ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) + (cubeFaceReflectionFoldedParentVectorField Q + (euclideanGradient phi) y) ∂volume = + -∫ y in openCubeSet Q, + vecDot (h y) + (cubeFaceReflectionFoldedParentVectorField Q + (euclideanGradient phi) y) ∂volume := by + simpa only [Q, hpsi_grad] using hsource + have hgradphi : MemVectorL2 (openCubeSet (originCube d (m + 1))) + (euclideanGradient phi) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport + hphi hphi_compact + have huTransport := + setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + (m := m) (g := euclideanGradient phi) + (G := fun y ↦ u.toH1Function.grad y) + hgradphi u.toH1Function.grad_memVectorL2 + have hhTransport := + setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + (m := m) (g := euclideanGradient phi) (G := h) hgradphi hh + calc + sigma0 * ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x) + (euclideanGradient phi x) ∂volume = + sigma0 * ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) + (cubeFaceReflectionFoldedParentVectorField Q + (euclideanGradient phi) y) ∂volume := by + rw [show Q = originCube d m by rfl] + congr 1 + simpa only [vecDot_comm] using huTransport + _ = -∫ y in openCubeSet Q, + vecDot (h y) + (cubeFaceReflectionFoldedParentVectorField Q + (euclideanGradient phi) y) ∂volume := hsource' + _ = -∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) h x) + (euclideanGradient phi x) ∂volume := by + rw [show Q = originCube d m by rfl] + congr 1 + simpa only [vecDot_comm] using hhTransport.symm + +/-- The block-folded source solution satisfies the reflected compact-test +divergence equation on the full reflection block. -/ +theorem H1MeanZeroFunction.cubeFaceReflectionBlockFold_neumannDivergence_weakEquationOnBlock + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + {h : Vec d → Vec d} + (hh : MemVectorL2 (openCubeSet (originCube d m)) h) + (hweak : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h x)) + {phi : Vec d → ℝ} (hphi : ContDiff ℝ (⊤ : ℕ∞) phi) + (hphi_compact : HasCompactSupport phi) : + sigma0 * ∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (u.toH1Function.cubeFaceReflectionBlockFold.grad x) + (euclideanGradient phi x) ∂volume = + -∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) h x) + (euclideanGradient phi x) ∂volume := by + change + sigma0 * ∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x) + (euclideanGradient phi x) ∂volume = _ + rw [← setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x ↦ vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) x) + (euclideanGradient phi x)), + ← setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x ↦ vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) h x) + (euclideanGradient phi x))] + exact neumannEvenReflection_parent_weakEquation hh + hweak.scalarMatrix_neg_weak hphi hphi_compact + +/-- An honest parent-cube `H¹` realization of the Neumann even reflection, +together with its compact-test divergence equation. -/ +theorem exists_h1Function_neumannEvenReflectionParent_divergence_rhs_originCube + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + {h : Vec d → Vec d} + (hh : MemVectorL2 (openCubeSet (originCube d m)) h) + (hweak : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h x)) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) ∧ + ∀ (phi : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) phi → + HasCompactSupport phi → + tsupport phi ⊆ openCubeSet (originCube d (m + 1)) → + sigma0 * ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (uP.grad x) (euclideanGradient phi x) ∂volume = + -∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) h x) + (euclideanGradient phi x) ∂volume := by + obtain ⟨uP, _huP_toFun, huP_grad⟩ := + exists_cubeFaceReflectionParentH1Function_originCube u.toH1Function + refine ⟨uP, huP_grad, ?_⟩ + intro phi hphi hphi_compact _hphi_sub + rw [huP_grad] + exact neumannEvenReflection_parent_weakEquation hh + hweak.scalarMatrix_neg_weak hphi hphi_compact + +/-- The reflected-parent package specialized to an `L² ∩ L^p` cube datum. -/ +theorem exists_h1Function_neumannEvenReflectionParent_divergence_rhs_of_cubeData + {d : ℕ} {m : ℤ} {q : FiniteLpExponent} {sigma0 : ℝ} + (u : H1MeanZeroFunction (openCubeSet (originCube d m))) + (h : CubeEuclideanL2LpField (originCube d m) q) + (hweak : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) sigma0) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x)) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y ↦ u.toH1Function.grad y) ∧ + ∀ (phi : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) phi → + HasCompactSupport phi → + tsupport phi ⊆ openCubeSet (originCube d (m + 1)) → + sigma0 * ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (uP.grad x) (euclideanGradient phi x) ∂volume = + -∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (h.neumannEvenReflectionToParent.toField x) + (euclideanGradient phi x) ∂volume := by + simpa only + [CubeEuclideanL2LpField.neumannEvenReflectionToParent_toField] using + exists_h1Function_neumannEvenReflectionParent_divergence_rhs_originCube + u h.memVectorL2_openCubeSet hweak + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/NeumannEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/NeumannEndpoint.lean new file mode 100644 index 0000000000..b915950334 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/NeumannEndpoint.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.CubeTranslationFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.Neumann.FiniteLpBelowTwo + +/-! +# Arbitrary-cube Neumann Calderón--Zygmund endpoint + +This file translates the centered finite-exponent Neumann estimate to an +arbitrary triadic cube and exposes it on the project's raw `Vec` norm. The +datum needs only the stated finite-`Lᵖ` membership. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem memLp_hilbertify_of_memLp_vec_neumannEndpoint + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) := by + simpa only [Function.comp_apply, HilbertVec.ofVecL_apply] using! + (HilbertVec.ofVecL d).comp_memLp' hF + +private theorem memLp_vec_of_memLp_hilbertify_neumannEndpoint + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} {F : Vec d → Vec d} + (hF : MemLp (fun x ↦ HilbertVec.ofVec (F x)) p + (normalizedCubeMeasure Q)) : + MemLp F p (normalizedCubeMeasure Q) := by + simpa only [Function.comp_apply, HilbertVec.continuousLinearEquivVec_apply, + HilbertVec.toVec_ofVec] using! + (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap.comp_memLp' hF + +private theorem eLpNorm_vec_le_hilbertify_neumannEndpoint + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} (F : Vec d → Vec d) : + eLpNorm F p (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) := by + apply eLpNorm_mono_ae + filter_upwards [] with x + exact HilbertVec.norm_le_norm_ofVec (F x) + +private theorem eLpNorm_hilbertify_le_dimension_mul_vec_neumannEndpoint + {d : ℕ} {p : ℝ≥0∞} {Q : TriadicCube d} (F : Vec d → Vec d) : + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal (d : ℝ) * eLpNorm F p (normalizedCubeMeasure Q) := by + calc + eLpNorm (fun x ↦ HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x ↦ (d : ℝ) • F x) p (normalizedCubeMeasure Q) := by + apply eLpNorm_mono_ae + filter_upwards [] with x + simpa only [norm_smul, Real.norm_natCast] using + HilbertVec.norm_ofVec_le_mul_norm (F x) + _ = ENNReal.ofReal (d : ℝ) * eLpNorm F p (normalizedCubeMeasure Q) := by + rw [show (fun x ↦ (d : ℝ) • F x) = (d : ℝ) • F by rfl, + eLpNorm_const_smul] + rw [Real.enorm_eq_ofReal] + norm_num + +private theorem centeredCubeNeumannDivergence_eLpNorm_le + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (f : Vec d → Vec d), + MemLp f q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H1MeanZeroFunction (openCubeSet (originCube d m)), + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet (originCube d m)) u + (fun x ↦ -f x) → + MemLp u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + (C * ENNReal.ofReal (d : ℝ)) * eLpNorm f q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH1MeanZeroNeumannDivergence_cz_lpData d q + refine ⟨C, hCtop, ?_⟩ + intro m f hf u hu + let h : CubeEuclideanLpField (originCube d m) q := + { toField := f + euclideanMemLp := memLp_hilbertify_of_memLp_vec_neumannEndpoint hf } + have huScalar : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ scalarMatrix (d := d) (1 : ℝ)) + (openCubeSet (originCube d m)) u (fun x ↦ -h.toField x) := by + simpa only [h, scalarMatrix, one_smul] using hu + have hEuclidean := hC m 1 h u (by norm_num) huScalar + have hHilbert : + eLpNorm (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm, h, ENNReal.ofReal_one, + inv_one, mul_one] using hEuclidean + have hGradHilbert : + MemLp (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + refine ⟨?_, ?_⟩ + · have hrawTwo : MemLp u.toH1Function.grad 2 + (normalizedCubeMeasure (originCube d m)) := by + unfold normalizedCubeMeasure cubeMeasure + rw [volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact u.toH1Function.grad_memVectorL2.smul_measure ENNReal.ofReal_ne_top + exact (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable + hrawTwo.aestronglyMeasurable + · apply lt_of_le_of_lt hHilbert + exact ENNReal.mul_lt_top hCtop + (memLp_hilbertify_of_memLp_vec_neumannEndpoint hf).eLpNorm_lt_top + refine ⟨memLp_vec_of_memLp_hilbertify_neumannEndpoint hGradHilbert, ?_⟩ + calc + eLpNorm u.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + eLpNorm (fun x ↦ HilbertVec.ofVec (u.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := + eLpNorm_vec_le_hilbertify_neumannEndpoint _ + _ ≤ C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := hHilbert + _ ≤ (C * ENNReal.ofReal (d : ℝ)) * + eLpNorm f q.exponent (normalizedCubeMeasure (originCube d m)) := by + calc + C * eLpNorm (fun x ↦ HilbertVec.ofVec (f x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * (ENNReal.ofReal (d : ℝ) * + eLpNorm f q.exponent + (normalizedCubeMeasure (originCube d m))) := by + gcongr + exact eLpNorm_hilbertify_le_dimension_mul_vec_neumannEndpoint f + _ = _ := by ac_rfl + +/-- The raw-vector mean-zero Neumann Calderón--Zygmund estimate on arbitrary +triadic cubes. The real constant depends only on dimension and exponent. -/ +theorem exists_cubeH1MeanZeroNeumannDivergence_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ, 0 < C ∧ ∀ (Q : TriadicCube d) (f : Vec d → Vec d), + MemLp f q.exponent (normalizedCubeMeasure Q) → + ∀ u : H1MeanZeroFunction (openCubeSet Q), + IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet Q) u (fun x ↦ -f x) → + MemLp u.toH1Function.grad q.exponent (normalizedCubeMeasure Q) ∧ + cubeLpNorm Q q.exponent u.toH1Function.grad ≤ + C * cubeLpNorm Q q.exponent f := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeNeumannDivergence_eLpNorm_le d q + let Cₙ : ℝ := max 1 ((C * ENNReal.ofReal (d : ℝ)).toReal) + refine ⟨Cₙ, lt_of_lt_of_le zero_lt_one (le_max_left _ _), ?_⟩ + intro Q f hf u hu + let f₀ : Vec d → Vec d := pullbackToOrigin Q f + let u₀ : H1MeanZeroFunction (openCubeSet (originCube d Q.scale)) := + untranslateH1MeanZeroToOrigin Q u + have hf₀ : MemLp f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale)) := + memLp_pullbackToOrigin Q hf + have hu₀ : IsMeanZeroNeumannRhsWeakSolution + (fun _ : Vec d ↦ (1 : Mat d)) (openCubeSet (originCube d Q.scale)) u₀ + (fun x ↦ -f₀ x) := by + simpa only [u₀, f₀] using + isMeanZeroNeumannRhsWeakSolution_untranslateH1MeanZeroToOrigin + Q (1 : Mat d) hu + obtain ⟨hgrad₀, hbound₀⟩ := hC Q.scale f₀ hf₀ u₀ hu₀ + have hgrad : MemLp u.toH1Function.grad q.exponent + (normalizedCubeMeasure Q) := by + rw [← pushforwardFromOrigin_untranslateH1MeanZeroToOrigin_grad Q u] + exact memLp_pushforwardFromOrigin Q hgrad₀ + refine ⟨hgrad, ?_⟩ + have hgradNorm : cubeLpNorm Q q.exponent u.toH1Function.grad = + (eLpNorm u₀.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [← pushforwardFromOrigin_untranslateH1MeanZeroToOrigin_grad Q u, + cubeLpNorm_pushforwardFromOrigin_eq Q q.exponent hgrad₀.aestronglyMeasurable] + rfl + have hfNorm : cubeLpNorm Q q.exponent f = + (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [← cubeLpNorm_pullbackToOrigin_eq Q q.exponent hf.aestronglyMeasurable] + rfl + rw [hgradNorm, hfNorm] + calc + (eLpNorm u₀.toH1Function.grad q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal ≤ + ((C * ENNReal.ofReal (d : ℝ)) * + eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := + ENNReal.toReal_mono + (ENNReal.mul_ne_top + (ENNReal.mul_ne_top hCtop.ne ENNReal.ofReal_ne_top) + hf₀.eLpNorm_ne_top) hbound₀ + _ = (C * ENNReal.ofReal (d : ℝ)).toReal * + (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + rw [ENNReal.toReal_mul] + _ ≤ Cₙ * (eLpNorm f₀ q.exponent + (normalizedCubeMeasure (originCube d Q.scale))).toReal := by + exact mul_le_mul_of_nonneg_right (le_max_right _ _) ENNReal.toReal_nonneg + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallScaleFactor.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallScaleFactor.lean new file mode 100644 index 0000000000..fecf9d91b2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallScaleFactor.lean @@ -0,0 +1,136 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingCubeGeometry + +/-! # One Ball Scale Factor -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# Exact scale factors for the one-ball good-`lambda` estimate + +This module isolates the elementary extended-real identities which convert +the local harmonic and correction tails into a stopping-ball volume times the +square of the level. Keeping them separate from the PDE comparison avoids +any hidden finite-measure or cancellation assumptions in the one-ball proof. +-/ + +/-- At the harmonic-tail threshold, the negative threshold power cancels all +but two powers of the positive level. Finiteness of `A` is precisely what +allows the `ENNReal` product to pass through the real exponent. -/ +theorem oneBall_harmonic_threshold_rpow_factor + {qR M level : ℝ} {A : ℝ≥0∞} + (hM : 0 < M) (hlevel : 0 < level) (hA : A ≠ ∞) : + ENNReal.ofReal ((M * level / 2) ^ (2 - qR)) * + (A * ENNReal.ofReal level) ^ qR = + ENNReal.ofReal ((M / 2) ^ (2 - qR)) * A ^ qR * + ENNReal.ofReal (level ^ (2 : ℝ)) := by + have hMtwo : 0 < M / 2 := by positivity + have hlevel_zero : ENNReal.ofReal level ≠ 0 := + ne_of_gt (ENNReal.ofReal_pos.mpr hlevel) + have hlevel_top : ENNReal.ofReal level ≠ ∞ := ENNReal.ofReal_ne_top + rw [show M * level / 2 = (M / 2) * level by ring, + Real.mul_rpow hMtwo.le hlevel.le] + rw [ENNReal.ofReal_mul (Real.rpow_nonneg hMtwo.le _)] + rw [ENNReal.mul_rpow_of_ne_top hA ENNReal.ofReal_ne_top] + rw [← ENNReal.ofReal_rpow_of_pos hMtwo, + ← ENNReal.ofReal_rpow_of_pos hlevel] + calc + _ = ENNReal.ofReal (M / 2) ^ (2 - qR) * A ^ qR * + (ENNReal.ofReal level ^ (2 - qR) * ENNReal.ofReal level ^ qR) := by + ring + _ = ENNReal.ofReal (M / 2) ^ (2 - qR) * A ^ qR * + ENNReal.ofReal level ^ ((2 - qR) + qR) := by + rw [ENNReal.rpow_add _ _ hlevel_zero hlevel_top] + _ = _ := by + rw [← ENNReal.ofReal_rpow_of_pos hlevel] + congr 3 + linarith + +/-- The side-`10r` cube has exactly `5^d` times the volume of the +sup-metric stopping ball of radius `r`. -/ +theorem oneBall_child_side_volume + {d : ℕ} [NeZero d] (x : Vec d) {r : ℝ} (hr : 0 ≤ r) : + ENNReal.ofReal ((10 * r) ^ d) = + (5 : ℝ≥0∞) ^ d * volume (Metric.closedBall x r) := by + rw [Real.volume_pi_closedBall x hr] + rw [show 10 * r = 5 * (2 * r) by ring, mul_pow] + rw [ENNReal.ofReal_mul (by positivity : 0 ≤ (5 : ℝ) ^ d)] + rw [ENNReal.ofReal_pow (by norm_num : 0 ≤ (5 : ℝ))] + simp only [Fintype.card_fin] + norm_num + +/-- The side of the depth-`n` comparison parent contributes the exact +relative factor `(5 * 3^n)^d` against the stopping ball of radius `r`. -/ +theorem oneBall_parent_side_volume + {d : ℕ} [NeZero d] (x : Vec d) {r : ℝ} (hr : 0 ≤ r) (n : ℕ) : + ENNReal.ofReal ((10 * (3 : ℝ) ^ n * r) ^ d) = + (5 * (3 : ℝ≥0∞) ^ n) ^ d * volume (Metric.closedBall x r) := by + rw [Real.volume_pi_closedBall x hr] + rw [show 10 * (3 : ℝ) ^ n * r = (5 * (3 : ℝ) ^ n) * (2 * r) by ring, + mul_pow] + rw [ENNReal.ofReal_mul (by positivity : 0 ≤ (5 * (3 : ℝ) ^ n) ^ d)] + rw [ENNReal.ofReal_pow (by positivity : 0 ≤ 5 * (3 : ℝ) ^ n)] + simp only [Fintype.card_fin] + rw [ENNReal.ofReal_mul (by norm_num : 0 ≤ (5 : ℝ))] + rw [ENNReal.ofReal_pow (by norm_num : 0 ≤ (3 : ℝ))] + norm_num + +/-- The harmonic local-tail scale factor, already expressed relative to the +stopping ball. Here `A` is the complete harmonic coefficient (for example, +`2 * G.constant * d`), so no factor is silently discarded. -/ +theorem oneBall_harmonic_tail_scale_factor + {d : ℕ} [NeZero d] {qR M level r : ℝ} {A : ℝ≥0∞} + (x : Vec d) (hr : 0 ≤ r) (hM : 0 < M) (hlevel : 0 < level) + (hA : A ≠ ∞) : + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - qR)) * + (ENNReal.ofReal ((10 * r) ^ d) * + (A * ENNReal.ofReal level) ^ qR) = + 2 * (5 : ℝ≥0∞) ^ d * A ^ qR * + ENNReal.ofReal ((M / 2) ^ (2 - qR)) * + ENNReal.ofReal (level ^ (2 : ℝ)) * + volume (Metric.closedBall x r) := by + rw [oneBall_child_side_volume x hr] + calc + _ = 2 * (5 : ℝ≥0∞) ^ d * volume (Metric.closedBall x r) * + (ENNReal.ofReal ((M * level / 2) ^ (2 - qR)) * + (A * ENNReal.ofReal level) ^ qR) := by ring + _ = _ := by + rw [oneBall_harmonic_threshold_rpow_factor hM hlevel hA] + ring + +/-- The correction local-tail scale factor, already expressed relative to the +stopping ball. -/ +theorem oneBall_correction_tail_scale_factor + {d : ℕ} [NeZero d] {eps level r : ℝ} (x : Vec d) (hr : 0 ≤ r) + (heps : 0 ≤ eps) (hlevel : 0 ≤ level) (n : ℕ) : + 6 * ENNReal.ofReal ((10 * (3 : ℝ) ^ n * r) ^ d) * + (ENNReal.ofReal (eps * level) ^ (2 : ℕ)) = + 6 * (5 * (3 : ℝ≥0∞) ^ n) ^ d * ENNReal.ofReal (eps ^ (2 : ℕ)) * + ENNReal.ofReal (level ^ (2 : ℕ)) * volume (Metric.closedBall x r) := by + rw [oneBall_parent_side_volume x hr n] + rw [ENNReal.ofReal_mul heps, mul_pow] + rw [ENNReal.ofReal_pow heps, ENNReal.ofReal_pow hlevel] + ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallTailAlgebra.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallTailAlgebra.lean new file mode 100644 index 0000000000..aa915c8e2b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneBallTailAlgebra.lean @@ -0,0 +1,191 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalScaledDatumEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeNormalizedLp + +/-! # One Ball Tail Algebra -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-! +# One-ball good-lambda algebra + +These are the purely extended-real algebraic steps in the one-stopping-ball +comparison. They contain no PDE, stopping, or comparison hypotheses: the +analytic proof supplies the two local `L²` bounds, and this file records the +constant bookkeeping that turns their sum into the conventional factor two. +-/ + +/-- If the correction energy is at most `e` times the original local energy +and `e ≤ 1`, then the harmonic-remainder energy costs at most a factor two. +The statement is deliberately pure `ENNReal` algebra, so it can be used after +the local normalized-energy and Minkowski estimates without importing any +comparison conclusion. -/ +theorem oneBall_harmonicGain_scale_le_two + {A L e : ℝ≥0∞} (he : e ≤ 1) : + A * (L + e * L) ≤ (2 * A) * L := by + have hsum : 1 + e ≤ (2 : ℝ≥0∞) := by + calc + 1 + e ≤ 1 + 1 := add_le_add_right he 1 + _ = 2 := by norm_num + calc + A * (L + e * L) = A * ((1 + e) * L) := by ring + _ ≤ A * (2 * L) := by gcongr + _ = (2 * A) * L := by ring + +/-- Factor the two local weighted-tail contributions through a single uniform +coefficient. This is the exact overestimate used by the one-ball tail +assembly: `K * m + K' * e` is bounded by `(K + K') * (m + e)`, and the two +tail masses are then factored together. -/ +theorem oneBall_tail_coefficient_factor + (K K' m e Tf Tg : ℝ≥0∞) : + (K * m + K' * e) * (2 * Tf + 2 * Tg) ≤ + (2 * K + 2 * K') * (m + e) * (Tf + Tg) := by + have hbase : K * m + K' * e ≤ (K + K') * (m + e) := by + calc + K * m + K' * e ≤ (K * m + K' * e) + (K * e + K' * m) := + le_add_of_nonneg_right (by positivity) + _ = (K + K') * (m + e) := by ring + calc + (K * m + K' * e) * (2 * Tf + 2 * Tg) = + (K * m + K' * e) * (2 * (Tf + Tg)) := by ring + _ ≤ ((K + K') * (m + e)) * (2 * (Tf + Tg)) := by + exact mul_le_mul_left hbase _ + _ = (2 * K + 2 * K') * (m + e) * (Tf + Tg) := by ring + +/-- The powered normalized `L^p` bound on a positive axis cube yields the +raw local integral bound on that open cube. The factor is exactly `L^d`, +obtained by cancelling the positive normalized-volume density. This is the +open-cube form used when the final comparison tail is restricted to the +triadic child. -/ +theorem axisCube_lintegral_ofReal_norm_rpow_le_volume_mul + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) + (V : Vec d → E) {B : ℝ≥0∞} + (hV : eLpNorm V p.exponent (axisCubeNormalizedMeasure z L) ≤ B) : + (∫⁻ y in axisCube z L, + ENNReal.ofReal (‖V y‖ ^ p.exponent.toReal) ∂volume) ≤ + ENNReal.ofReal (L ^ d) * B ^ p.exponent.toReal := by + let c : ℝ≥0∞ := ENNReal.ofReal ((L ^ d)⁻¹) + let I : ℝ≥0∞ := ∫⁻ y in axisCube z L, + ENNReal.ofReal (‖V y‖ ^ p.exponent.toReal) ∂volume + have hpow : + (eLpNorm V p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal ≤ + B ^ p.exponent.toReal := + ENNReal.rpow_le_rpow hV ENNReal.toReal_nonneg + have hidentity : + (eLpNorm V p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + c * I := by + simpa only [c, I] using + (axisCube_eLpNorm_rpow_exponent_eq_normalized_setLIntegral z hL p V) + have hc0 : c ≠ 0 := by + dsimp only [c] + exact ne_of_gt (ENNReal.ofReal_pos.mpr (inv_pos.mpr (pow_pos hL _))) + have hcTop : c ≠ ∞ := by + dsimp only [c] + exact ENNReal.ofReal_ne_top + have hraw : c * I ≤ B ^ p.exponent.toReal := by + rw [← hidentity] + exact hpow + calc + I = c⁻¹ * (c * I) := by + rw [ENNReal.inv_mul_cancel_left hc0 hcTop] + _ ≤ c⁻¹ * B ^ p.exponent.toReal := by gcongr + _ = ENNReal.ofReal (L ^ d) * B ^ p.exponent.toReal := by + rw [show c⁻¹ = ENNReal.ofReal (L ^ d) by + dsimp only [c] + rw [ENNReal.ofReal_inv_of_pos (pow_pos hL _)] + exact inv_inv _] + +/-- The `p=2` specialization of +`axisCube_lintegral_ofReal_norm_rpow_le_volume_mul`. -/ +theorem axisCube_lintegral_ofReal_norm_sq_le_volume_mul + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (V : Vec d → E) {B : ℝ≥0∞} + (hV : eLpNorm V 2 (axisCubeNormalizedMeasure z L) ≤ B) : + (∫⁻ y in axisCube z L, + ENNReal.ofReal (‖V y‖ ^ (2 : ℕ)) ∂volume) ≤ + ENNReal.ofReal (L ^ d) * B ^ (2 : ℝ) := by + simpa only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat, + Real.rpow_two] using + (axisCube_lintegral_ofReal_norm_rpow_le_volume_mul z hL + FiniteLpExponent.two V hV) + +/-- The powered normalized `L^p` bound on a positive axis cube yields the +raw local integral bound over its a.e.-equal closed ball. The factor is +exactly the cube volume `L^d`: it is obtained by cancelling the positive +normalized-volume density, not by a comparison estimate. -/ +theorem closedBall_lintegral_ofReal_norm_rpow_le_axisCube_volume_mul + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (p : FiniteLpExponent) + (V : Vec d → E) {B : ℝ≥0∞} + (hV : MeasureTheory.eLpNorm V p.exponent (axisCubeNormalizedMeasure z L) ≤ B) : + (∫⁻ y in Metric.closedBall (axisCubeCenter (d := d) z L) (L / 2), + ENNReal.ofReal (‖V y‖ ^ p.exponent.toReal) ∂(volume : MeasureTheory.Measure (Vec d))) ≤ + ENNReal.ofReal (L ^ d) * B ^ p.exponent.toReal := by + let c : ℝ≥0∞ := ENNReal.ofReal ((L ^ d)⁻¹) + let I : ℝ≥0∞ := ∫⁻ y in Metric.closedBall (axisCubeCenter (d := d) z L) (L / 2), + ENNReal.ofReal (‖V y‖ ^ p.exponent.toReal) ∂(volume : MeasureTheory.Measure (Vec d)) + have hpow : + (MeasureTheory.eLpNorm V p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal ≤ + B ^ p.exponent.toReal := + ENNReal.rpow_le_rpow hV ENNReal.toReal_nonneg + have hidentity : + (MeasureTheory.eLpNorm V p.exponent (axisCubeNormalizedMeasure z L)) ^ p.exponent.toReal = + c * I := by + simpa only [c, I] using + (axisCube_eLpNorm_rpow_exponent_eq_normalized_closedBallLIntegral z hL p V) + have hc0 : c ≠ 0 := by + dsimp only [c] + exact ne_of_gt (ENNReal.ofReal_pos.mpr (inv_pos.mpr (pow_pos hL _))) + have hcTop : c ≠ ∞ := by + dsimp only [c] + exact ENNReal.ofReal_ne_top + have hraw : c * I ≤ B ^ p.exponent.toReal := by + rw [← hidentity] + exact hpow + calc + I = c⁻¹ * (c * I) := by + rw [ENNReal.inv_mul_cancel_left hc0 hcTop] + _ ≤ c⁻¹ * B ^ p.exponent.toReal := by gcongr + _ = ENNReal.ofReal (L ^ d) * B ^ p.exponent.toReal := by + rw [show c⁻¹ = ENNReal.ofReal (L ^ d) by + dsimp only [c] + rw [ENNReal.ofReal_inv_of_pos (pow_pos hL _)] + exact inv_inv _] + +/-- The `p=2` specialization of +`closedBall_lintegral_ofReal_norm_rpow_le_axisCube_volume_mul`. -/ +theorem closedBall_lintegral_ofReal_norm_sq_le_axisCube_volume_mul + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (z : Vec d) {L : ℝ} (hL : 0 < L) (V : Vec d → E) {B : ℝ≥0∞} + (hV : MeasureTheory.eLpNorm V 2 (axisCubeNormalizedMeasure z L) ≤ B) : + (∫⁻ y in Metric.closedBall (axisCubeCenter (d := d) z L) (L / 2), + ENNReal.ofReal (‖V y‖ ^ (2 : ℕ)) ∂(volume : MeasureTheory.Measure (Vec d))) ≤ + ENNReal.ofReal (L ^ d) * B ^ (2 : ℝ) := by + simpa only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat, + Real.rpow_two] using + (closedBall_lintegral_ofReal_norm_rpow_le_axisCube_volume_mul z hL + FiniteLpExponent.two V hV) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallComparison.lean new file mode 100644 index 0000000000..8632bf97d4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallComparison.lean @@ -0,0 +1,268 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicGain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ClosedBallNormalizedL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalComparisonBridges +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalScaledDatumEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTailRestrict +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallTailAlgebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingEnergyTransfer + +/-! # One Stopping Ball Comparison -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# The one-stopping-ball comparison estimate + +This is the local, genuinely PDE-derived step in the cube good-`lambda` +argument. At an exact stopping radius it constructs the zero-trace harmonic +replacement on the comparison parent, applies the finite-exponent harmonic +gain on its triadic descendant, and then applies the weighted comparison-tail +inequality. No harmonic comparison or tail estimate is an input hypothesis. + +The datum in the stopping energy is `sigma0⁻¹ • hilbertifyVecField H`. This +normalization is essential: it makes every constant below independent of the +ellipticity scale, while the final source norm has exactly the expected +`sigma0⁻¹` factor. +-/ + +/-- The coefficient produced by the one-ball comparison. The first summand +comes from the harmonic `L^q` gain on `B_(5r)`, the second from the +zero-trace correction energy on its comparison parent. In the final tail +bound it multiplies the factored quantity +`(M / 2)^(2-q) + eps^2`; keeping this source-facing factor separate is what +allows the later good-`lambda` parameter choice. -/ +def oneStoppingBallCoefficient {d : ℕ} {q : FiniteLpExponent} (depth : ℕ) + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) : ℝ≥0∞ := + 4 * (5 : ℝ≥0∞) ^ d * + (2 * (G.fixedValue * (d : ℝ≥0∞))) ^ q.exponent.toReal + + 12 * ENNReal.ofReal ((5 * (3 : ℝ) ^ depth) ^ d) + +/-- The coefficient is finite; hence it may safely be used in the later +weighted layer-cake integration without an implicit extended-real exception. -/ +theorem oneStoppingBallCoefficient_ne_top {d : ℕ} {q : FiniteLpExponent} + {depth : ℕ} (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) : + oneStoppingBallCoefficient depth G ≠ ∞ := by + unfold oneStoppingBallCoefficient + rw [ENNReal.add_ne_top] + constructor + · apply ENNReal.mul_ne_top + · apply ENNReal.mul_ne_top + · norm_num + · exact ENNReal.pow_ne_top (by norm_num) + · exact ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg + (ENNReal.mul_ne_top (by norm_num) (axisCube_harmonicEuclideanGradientGain_coefficient_ne_top G)) + · apply ENNReal.mul_ne_top + · norm_num + · exact ENNReal.ofReal_ne_top + +/-- The exact stopping identity and the last-exit bound control both fields on +the *actual* harmonic-comparison parent. This is deliberately stated before +the PDE comparison: it is the point at which the conservative radius cutoff +is converted into the sharp parent-radius input required by the local +replacement. -/ +theorem stoppingComparisonParent_eLpNorm_two_bounds_of_stop_lastExit + {d : ℕ} [NeZero d] {F G : Type*} [NormedAddCommGroup F] + [NormedAddCommGroup G] (f : Vec d → F) (g : Vec d → G) + {eps level r R : ℝ} (heps : 0 < eps) (hr : 0 < r) (depth : ℕ) + (hcutoff : r ≤ R / (10 * (3 : ℝ) ^ depth)) + (hf : MemLp f 2 volume) (hg : MemLp g 2 volume) (x : Vec d) + (hlast : ∀ s ∈ Icc r R, goodLambdaCombinedEnergy f g eps x s ≤ level) : + eLpNorm f 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ ENNReal.ofReal level ∧ + eLpNorm g 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ ENNReal.ofReal (eps * level) := by + let parentRadius : ℝ := stoppingComparisonParentMultiplier depth * r + have hrnonneg : 0 ≤ r := hr.le + have hparent_mem : parentRadius ∈ Icc r R := by + simpa only [parentRadius, stoppingComparisonParentMultiplier] using! + (stoppingComparisonParentRadius_mem_Icc_of_le hrnonneg depth hcutoff) + have hparent_energy : goodLambdaCombinedEnergy f g eps x parentRadius ≤ level := + hlast parentRadius hparent_mem + obtain ⟨hf_energy, hg_energy⟩ := + closedBallL2Energy_sqrt_bounds_of_goodLambdaCombinedEnergy_le f g heps + (mul_pos (by + simp only [stoppingComparisonParentMultiplier] + positivity) hr) x hparent_energy + constructor + · rw [stoppingComparisonParent_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy + x hr depth f (hf.restrict _)] + exact ENNReal.ofReal_le_ofReal hf_energy + · rw [stoppingComparisonParent_eLpNorm_two_eq_ofReal_sqrt_closedBallL2Energy + x hr depth g (hg.restrict _)] + exact ENNReal.ofReal_le_ofReal hg_energy + +/-- The PDE part of the one-ball argument. The zero-trace correction and its +harmonic remainder are constructed internally; the returned bounds are the +two inputs needed by the weighted-tail step. -/ +theorem exists_stoppingComparison_harmonic_remainder + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (x : Vec d) {r R sigma0 eps level : ℝ} + (hr : 0 < r) (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hcutoff : r ≤ R / (10 * (3 : ℝ) ^ depth)) + (f : Vec d → HilbertVec d) (H : Vec d → Vec d) + (hf : MemLp f 2 volume) (hH : MemLp (hilbertifyVecField H) 2 volume) + (u : H1Function + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))) + (hfu : f =ᵐ[volume.restrict + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))] hilbertifyVecField u.grad) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) → + sigma0 * ∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (u.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (H y) (euclideanGradient phi y) ∂volume) + (hlast : ∀ s ∈ Icc r R, + goodLambdaCombinedEnergy f (sigma0⁻¹ • hilbertifyVecField H) eps x s ≤ level) : + ∃ w : H10Function + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)), + WeakPoissonEquationOn + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) + (u - w.toH1Function) 0 ∧ + eLpNorm (hilbertifyVecField w.toH1Function.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ ENNReal.ofReal (eps * level) ∧ + MemLp (hilbertifyVecField (u - w.toH1Function).grad) q.exponent + (axisCubeNormalizedMeasure + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth)) ∧ + eLpNorm (hilbertifyVecField (u - w.toH1Function).grad) q.exponent + (axisCubeNormalizedMeasure + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth)) ≤ + (2 * (G.fixedValue * (d : ℝ≥0∞))) * ENNReal.ofReal level := by + let U : Set (Vec d) := axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) + have hL : 0 < stoppingComparisonParentSide r depth := by + simp only [stoppingComparisonParentSide, stoppingAxisCubeSide, + stoppingComparisonParentMultiplier] + positivity + have hscale_ne_top : ENNReal.ofReal ((stoppingComparisonParentSide r depth) ^ d)⁻¹ ≠ ∞ := by + exact ENNReal.ofReal_ne_top + have hfU : MemLp f 2 (axisCubeNormalizedMeasure + (stoppingComparisonParentCorner x r depth) (stoppingComparisonParentSide r depth)) := by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict _ _ hL] + exact (hf.restrict U).smul_measure hscale_ne_top + have hfuU : f =ᵐ[axisCubeNormalizedMeasure + (stoppingComparisonParentCorner x r depth) (stoppingComparisonParentSide r depth)] + hilbertifyVecField u.grad := by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict _ _ hL] + exact Measure.smul_absolutelyContinuous.ae_eq (by simpa only [U] using hfu) + have huU : MemLp (hilbertifyVecField u.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := + (memLp_congr_ae hfuU).mp hfU + have hHU : MemVectorL2 U H := + memVectorL2_of_memLp_hilbertifyVecField hH + obtain ⟨w, _hw, hwHarm, hwenergy⟩ := + exists_local_harmonic_replacement_axisCube + (stoppingComparisonParentCorner x r depth) hL hsigma0 u hHU (by + simpa only [U] using hweak) + have hparent := stoppingComparisonParent_eLpNorm_two_bounds_of_stop_lastExit + f (sigma0⁻¹ • hilbertifyVecField H) heps hr depth hcutoff hf + (hH.const_smul sigma0⁻¹) x hlast + have hwbound : eLpNorm (hilbertifyVecField w.toH1Function.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ ENNReal.ofReal (eps * level) := by + calc + eLpNorm (hilbertifyVecField w.toH1Function.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ + eLpNorm (sigma0⁻¹ • hilbertifyVecField H) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := + axisCubeNormalized_eLpNorm_harmonicCorrection_le_scaledDatum + (stoppingComparisonParentCorner x r depth) hL hsigma0 w.toH1Function hHU hwenergy + _ ≤ ENNReal.ofReal (eps * level) := hparent.2 + have hvGain := axisCube_harmonicEuclideanGradientGain G + (stoppingComparisonParentCorner x r depth) (stoppingComparisonParentSide r depth) + hL (u - w.toH1Function) hwHarm + refine ⟨w, hwHarm, hwbound, ?_, ?_⟩ + · simpa only [hilbertifyVecField] using! hvGain.1 + · have hvfield : hilbertifyVecField (u - w.toH1Function).grad = + hilbertifyVecField u.grad + (-hilbertifyVecField w.toH1Function.grad) := by + funext y + change HilbertVec.ofVec ((u - w.toH1Function).grad y) = + HilbertVec.ofVec (u.grad y) + -HilbertVec.ofVec (w.toH1Function.grad y) + rw [H1Function.sub_grad] + exact (HilbertVec.continuousLinearEquivVec d).symm.map_sub _ _ + change MemLp (hilbertifyVecField (u - w.toH1Function).grad) q.exponent _ ∧ + eLpNorm (hilbertifyVecField (u - w.toH1Function).grad) q.exponent _ ≤ _ at hvGain + calc + eLpNorm (hilbertifyVecField (u - w.toH1Function).grad) q.exponent + (axisCubeNormalizedMeasure + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth)) ≤ + (G.fixedValue * (d : ℝ≥0∞)) * + eLpNorm (hilbertifyVecField (u - w.toH1Function).grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := hvGain.2 + _ = (G.fixedValue * (d : ℝ≥0∞)) * + eLpNorm (hilbertifyVecField u.grad + + (-hilbertifyVecField w.toH1Function.grad)) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := by rw [hvfield] + _ ≤ (G.fixedValue * (d : ℝ≥0∞)) * + (eLpNorm (hilbertifyVecField u.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) + + eLpNorm (-hilbertifyVecField w.toH1Function.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))) := by + gcongr + exact axisCubeNormalized_eLpNorm_two_add_le + (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) huU.aestronglyMeasurable + (by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict _ _ hL] + exact (memHilbertVectorL2_hilbertifyVecField + w.toH1Function.grad_memVectorL2).smul_measure hscale_ne_top |>.neg.aestronglyMeasurable) + _ ≤ (G.fixedValue * (d : ℝ≥0∞)) * + (ENNReal.ofReal level + ENNReal.ofReal (eps * level)) := by + gcongr + · exact (eLpNorm_congr_ae hfuU).symm ▸ hparent.1 + · simpa only [eLpNorm_neg] using hwbound + _ ≤ (2 * (G.fixedValue * (d : ℝ≥0∞))) * ENNReal.ofReal level := by + rw [ENNReal.ofReal_mul heps.le] + exact oneBall_harmonicGain_scale_le_two + (A := G.fixedValue * (d : ℝ≥0∞)) (L := ENNReal.ofReal level) + (e := ENNReal.ofReal eps) (by + rw [ENNReal.ofReal_le_one] + exact heps_one) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallTail.lean new file mode 100644 index 0000000000..8214e8e18b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/OneStoppingBallTail.lean @@ -0,0 +1,443 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneStoppingBallComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallTailAlgebra +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.OneBallScaleFactor + +/-! # One Stopping Ball Tail -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Geometric and measure-local preparation for the one-stopping-ball tail + +The final tail comparison is made on the open depth descendant. These lemmas +keep the two nontrivial localisation facts explicit: that descendant is inside +the PDE comparison parent, and its boundary can be changed to the closed +stopping ball for any square-weighted measure based on volume. +-/ + +/-- The open depth descendant lies in its comparison parent. -/ +theorem stoppingComparison_descendant_subset_parent {d : ℕ} + (x : Vec d) {r : ℝ} (hr : 0 < r) (depth : ℕ) : + axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth) ⊆ + axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) := by + rw [stoppingComparison_concentricDepth_axisCube_eq_ball x hr depth, + stoppingComparisonParent_axisCube_eq_ball x hr depth] + intro y hy + apply Metric.mem_ball.mpr + have hy' : dist y x < 5 * r := Metric.mem_ball.mp hy + calc + dist y x < 5 * r := hy' + _ ≤ stoppingComparisonParentMultiplier depth * r := by + rw [stoppingComparisonParentMultiplier] + have hp : 1 ≤ (3 : ℝ) ^ depth := one_le_pow₀ (by norm_num) + nlinarith + +/-- The final square-weighted tail may cross from the open harmonic-gain +descendant to the closed stopping ball without a comparison loss. -/ +theorem sqWeightedMeasure_tail_descendant_eq_closedBall + {d : ℕ} [NeZero d] {E : Type*} [NormedAddCommGroup E] + (f : Vec d → E) (x : Vec d) {r : ℝ} (hr : 0 < r) (depth : ℕ) + (T : Set (Vec d)) : + sqWeightedMeasure f volume + (T ∩ axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth)) = + sqWeightedMeasure f volume (T ∩ Metric.closedBall x (5 * r)) := by + have hae := stoppingComparison_concentricDepth_axisCube_ae_eq_closedBall + (d := d) x hr depth + have hsq_ac : sqWeightedMeasure f volume ≪ volume := + MeasureTheory.withDensity_absolutelyContinuous volume _ + have hae_sq : axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth) =ᵐ[ + sqWeightedMeasure f volume] Metric.closedBall x (5 * r) := + hsq_ac.ae_eq hae + let child : Set (Vec d) := axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth) + have hchild_meas : MeasurableSet child := by + rw [show child = Metric.ball x (5 * r) by + simpa only [child] using + (stoppingComparison_concentricDepth_axisCube_eq_ball x hr depth)] + exact measurableSet_ball + change (sqWeightedMeasure f volume) (T ∩ child) = + (sqWeightedMeasure f volume) (T ∩ Metric.closedBall x (5 * r)) + rw [← Measure.restrict_apply' hchild_meas, + ← Measure.restrict_apply' measurableSet_closedBall] + exact congrArg (fun μ : Measure (Vec d) => μ T) (Measure.restrict_congr_set hae_sq) + +/-- The depth descendant used by the harmonic gain has side `10 r`. -/ +theorem stoppingComparison_descendant_side_eq {r : ℝ} (depth : ℕ) : + axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth = 10 * r := by + simp only [axisCubeConcentricDepthSide, stoppingComparisonParentSide, + stoppingAxisCubeSide, stoppingComparisonParentMultiplier, zpow_neg, + zpow_natCast] + field_simp [pow_ne_zero depth (by norm_num : (3 : ℝ) ≠ 0)] + ring + +/-- The parent side is `10 * 3^n * r`, the raw volume factor used for the +correction-energy contribution. -/ +theorem stoppingComparison_parent_side_eq {r : ℝ} (depth : ℕ) : + stoppingComparisonParentSide r depth = 10 * (3 : ℝ) ^ depth * r := by + simp only [stoppingComparisonParentSide, stoppingAxisCubeSide, + stoppingComparisonParentMultiplier] + ring + +/-- On the comparison descendant, replacing the global field by the weak +solution gradient turns the comparison error into the zero-trace correction. +This is the restricted-a.e. transport used in the correction tail. -/ +theorem local_lintegral_error_eq_harmonicCorrection + {d : ℕ} {E : Type*} [NormedAddCommGroup E] + {B : Set (Vec d)} {f v w : Vec d → E} + (hfu : f =ᵐ[volume.restrict B] v + w) : + (∫⁻ y in B, ENNReal.ofReal (‖f y - v y‖ ^ (2 : ℕ)) ∂volume) = + ∫⁻ y in B, ENNReal.ofReal (‖w y‖ ^ (2 : ℕ)) ∂volume := by + have hsub : f - v =ᵐ[volume.restrict B] w := by + filter_upwards [hfu] with y hy + change f y - v y = w y + change f y = v y + w y at hy + rw [hy] + abel + apply lintegral_congr_ae + filter_upwards [hsub] with y hy + change ENNReal.ofReal (‖(f - v) y‖ ^ (2 : ℕ)) = _ + rw [hy] + +/-- The correction integral on the descendant is bounded by its exact raw +parent-cube energy. -/ +theorem stoppingComparison_correction_descendant_le_parent + {d : ℕ} [NeZero d] (x : Vec d) {r : ℝ} (hr : 0 < r) (depth : ℕ) + (w : H10Function (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))) {B : ℝ≥0∞} + (hB : eLpNorm (hilbertifyVecField w.toH1Function.grad) 2 + (axisCubeNormalizedMeasure (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) ≤ B) : + (∫⁻ y in axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth), + ENNReal.ofReal (‖hilbertifyVecField w.toH1Function.grad y‖ ^ (2 : ℕ)) ∂volume) ≤ + ENNReal.ofReal ((stoppingComparisonParentSide r depth) ^ d) * B ^ (2 : ℝ) := by + calc + _ ≤ ∫⁻ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + ENNReal.ofReal (‖hilbertifyVecField w.toH1Function.grad y‖ ^ (2 : ℕ)) ∂volume := by + exact MeasureTheory.lintegral_mono' + (Measure.restrict_mono + (stoppingComparison_descendant_subset_parent x hr depth) le_rfl) + (by intro y; rfl) + _ ≤ _ := axisCube_lintegral_ofReal_norm_sq_le_volume_mul + (stoppingComparisonParentCorner x r depth) + (by + rw [stoppingComparison_parent_side_eq] + positivity) (hilbertifyVecField w.toH1Function.grad) hB + +/-- The harmonic gain gives its raw descendant `L^q` integral with precisely +the side-`10r` volume factor. -/ +theorem stoppingComparison_harmonic_raw_bound + {d : ℕ} [NeZero d] {q : FiniteLpExponent} (x : Vec d) {r : ℝ} + (hr : 0 < r) (depth : ℕ) (v : Vec d → HilbertVec d) {B : ℝ≥0∞} + (hB : eLpNorm v q.exponent (axisCubeNormalizedMeasure + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth)) ≤ B) : + (∫⁻ y in axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth), + ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) ≤ + ENNReal.ofReal ((10 * r) ^ d) * B ^ q.exponent.toReal := by + have h := axisCube_lintegral_ofReal_norm_rpow_le_volume_mul + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) depth) + (by rw [stoppingComparison_descendant_side_eq]; positivity) q v hB + rw [stoppingComparison_descendant_side_eq] at h + simpa only [stoppingComparison_descendant_side_eq] using h + +/-- The complete one-stopping-ball weighted comparison estimate. The +harmonic comparison is constructed from the weak equation, rather than +supplied as a hypothesis. -/ +theorem sqWeightedMeasure_oneStoppingBall_le + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (hq : 2 < q.exponent.toReal) (x : Vec d) + {r R sigma0 eps M level : ℝ} + (hr : 0 < r) (hsigma0 : 0 < sigma0) (heps : 0 < eps) + (heps_one : eps ≤ 1) (hM : 0 < M) (hlevel : 0 < level) + (hcutoff : r ≤ R / (10 * (3 : ℝ) ^ depth)) + (f : Vec d → HilbertVec d) (H : Vec d → Vec d) + (hf : MemLp f 2 volume) (hH : MemLp (hilbertifyVecField H) 2 volume) + (u : H1Function (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))) + (hfu : f =ᵐ[volume.restrict + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))] hilbertifyVecField u.grad) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) → + sigma0 * ∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (u.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (H y) (euclideanGradient phi y) ∂volume) + (hstop : goodLambdaCombinedEnergy f (sigma0⁻¹ • hilbertifyVecField H) + eps x r = level) + (hlast : ∀ s ∈ Icc r R, + goodLambdaCombinedEnergy f (sigma0⁻¹ • hilbertifyVecField H) eps x s ≤ level) : + sqWeightedMeasure f volume ({y | M * level < ‖f y‖} ∩ Metric.closedBall x (5 * r)) ≤ + oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure f volume ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField H) volume + ({y | eps * level / 2 < ‖(sigma0⁻¹ • hilbertifyVecField H) y‖} ∩ + Metric.closedBall x r)) := by + let parent : Set (Vec d) := axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) + let z : Vec d := axisCubeConcentricDepthCorner + (stoppingComparisonParentCorner x r depth) (stoppingComparisonParentSide r depth) depth + let L : ℝ := axisCubeConcentricDepthSide (stoppingComparisonParentSide r depth) depth + let child : Set (Vec d) := axisCube z L + obtain ⟨w, hwHarm, hwL2, hvMem, hvBound⟩ := + exists_stoppingComparison_harmonic_remainder G x hr hsigma0 heps heps_one + hcutoff f H hf hH u hfu hweak hlast + let v : Vec d → HilbertVec d := hilbertifyVecField (u - w.toH1Function).grad + have hchild_subset : child ⊆ parent := by + simpa only [child, z, L, parent] using + stoppingComparison_descendant_subset_parent x hr depth + have hfu_child : f =ᵐ[volume.restrict child] hilbertifyVecField u.grad := + Filter.Eventually.filter_mono + (MeasureTheory.ae_mono (Measure.restrict_mono hchild_subset le_rfl)) hfu + have hL : 0 < L := by + rw [show L = 10 * r by simpa only [L] using + stoppingComparison_descendant_side_eq (r := r) depth] + positivity + have hnormc : ENNReal.ofReal (L ^ d)⁻¹ ≠ 0 := + ne_of_gt (ENNReal.ofReal_pos.mpr (inv_pos.mpr (pow_pos hL _))) + have hvMem' : MemLp v q.exponent (axisCubeNormalizedMeasure z L) := by + simpa only [v, z, L] using hvMem + have hvBound' : eLpNorm v q.exponent (axisCubeNormalizedMeasure z L) ≤ + (2 * (G.fixedValue * (d : ℝ≥0∞))) * ENNReal.ofReal level := by + simpa only [v, z, L] using hvBound + have hvmeas : AEStronglyMeasurable v (volume.restrict child) := by + rw [axisCubeNormalizedMeasure_eq_smul_volume_restrict z L hL] at hvMem' + exact hvMem'.aestronglyMeasurable.mono_ac + (Measure.absolutelyContinuous_smul hnormc) + have htail := sqWeightedMeasure_tail_le_comparison_restrict + (μ := volume) (B := child) (by + rw [show child = Metric.ball x (5 * r) by + simpa only [child, z, L] using + stoppingComparison_concentricDepth_axisCube_eq_ball x hr depth] + exact measurableSet_ball) + (hf.aestronglyMeasurable.restrict) hvmeas hq (mul_pos hM hlevel) + rw [sqWeightedMeasure_tail_descendant_eq_closedBall f x hr depth + {y | M * level < ‖f y‖}] at htail + have hfvw : f =ᵐ[volume.restrict child] + v + hilbertifyVecField w.toH1Function.grad := by + filter_upwards [hfu_child] with y hy + rw [hy] + change HilbertVec.ofVec (u.grad y) = + HilbertVec.ofVec ((u - w.toH1Function).grad y) + + HilbertVec.ofVec (w.toH1Function.grad y) + rw [H1Function.sub_grad] + change WithLp.toLp 2 (u.grad y) = + WithLp.toLp 2 (u.grad y - w.toH1Function.grad y) + + WithLp.toLp 2 (w.toH1Function.grad y) + rw [WithLp.toLp_sub] + abel + have herror : + (∫⁻ y in child, ENNReal.ofReal (‖f y - v y‖ ^ (2 : ℕ)) ∂volume) = + ∫⁻ y in child, + ENNReal.ofReal (‖hilbertifyVecField w.toH1Function.grad y‖ ^ (2 : ℕ)) ∂volume := + local_lintegral_error_eq_harmonicCorrection hfvw + have hcorrection_raw : + (∫⁻ y in child, + ENNReal.ofReal (‖hilbertifyVecField w.toH1Function.grad y‖ ^ (2 : ℕ)) ∂volume) ≤ + ENNReal.ofReal ((stoppingComparisonParentSide r depth) ^ d) * + (ENNReal.ofReal (eps * level)) ^ (2 : ℝ) := by + simpa only [child, z, L] using + (stoppingComparison_correction_descendant_le_parent x hr depth w hwL2) + have hcorrection_scale : + 6 * (∫⁻ y in child, + ENNReal.ofReal (‖f y - v y‖ ^ (2 : ℕ)) ∂volume) ≤ + 6 * (5 * (3 : ℝ≥0∞) ^ depth) ^ d * ENNReal.ofReal (eps ^ (2 : ℕ)) * + ENNReal.ofReal (level ^ (2 : ℕ)) * volume (Metric.closedBall x r) := by + rw [herror] + calc + 6 * (∫⁻ y in child, + ENNReal.ofReal (‖hilbertifyVecField w.toH1Function.grad y‖ ^ (2 : ℕ)) ∂volume) ≤ + 6 * (ENNReal.ofReal ((stoppingComparisonParentSide r depth) ^ d) * + (ENNReal.ofReal (eps * level)) ^ (2 : ℝ)) := by + gcongr + _ = 6 * (ENNReal.ofReal ((10 * (3 : ℝ) ^ depth * r) ^ d) * + (ENNReal.ofReal (eps * level)) ^ (2 : ℝ)) := by + rw [stoppingComparison_parent_side_eq] + _ = _ := by + rw [ENNReal.rpow_two] + simpa only [mul_assoc] using + (oneBall_correction_tail_scale_factor x hr.le heps.le hlevel.le depth) + have hharmonic_raw : + (∫⁻ y in child, ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) ≤ + ENNReal.ofReal ((10 * r) ^ d) * + ((2 * (G.fixedValue * (d : ℝ≥0∞))) * ENNReal.ofReal level) ^ + q.exponent.toReal := by + simpa only [child, z, L] using + (stoppingComparison_harmonic_raw_bound x hr depth v hvBound') + have hA : 2 * (G.fixedValue * (d : ℝ≥0∞)) ≠ ∞ := by + apply ENNReal.mul_ne_top + · norm_num + · exact axisCube_harmonicEuclideanGradientGain_coefficient_ne_top G + have hharmonic_scale : + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - q.exponent.toReal)) * + (∫⁻ y in child, ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) ≤ + 2 * (5 : ℝ≥0∞) ^ d * (2 * (G.fixedValue * (d : ℝ≥0∞))) ^ q.exponent.toReal * + ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) * + ENNReal.ofReal (level ^ (2 : ℝ)) * volume (Metric.closedBall x r) := by + calc + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - q.exponent.toReal)) * + (∫⁻ y in child, ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) ≤ + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - q.exponent.toReal)) * + (ENNReal.ofReal ((10 * r) ^ d) * + ((2 * (G.fixedValue * (d : ℝ≥0∞))) * ENNReal.ofReal level) ^ + q.exponent.toReal) := by + gcongr + _ = _ := oneBall_harmonic_tail_scale_factor x hr.le hM hlevel hA + let Kh : ℝ≥0∞ := + 2 * (5 : ℝ≥0∞) ^ d * (2 * (G.fixedValue * (d : ℝ≥0∞))) ^ q.exponent.toReal + let Kc : ℝ≥0∞ := 6 * (5 * (3 : ℝ≥0∞) ^ depth) ^ d + let m : ℝ≥0∞ := ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + let e : ℝ≥0∞ := ENNReal.ofReal (eps ^ (2 : ℕ)) + let Q : ℝ≥0∞ := ENNReal.ofReal (level ^ (2 : ℕ)) * volume (Metric.closedBall x r) + have hharmonic_local : + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - q.exponent.toReal)) * + (∫⁻ y in child, ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) ≤ + Kh * m * Q := by + simpa only [Kh, m, Q, Real.rpow_two, mul_assoc] using hharmonic_scale + have hcorrection_local : + 6 * (∫⁻ y in child, + ENNReal.ofReal (‖f y - v y‖ ^ (2 : ℕ)) ∂volume) ≤ Kc * e * Q := by + simpa only [Kc, e, Q, mul_assoc] using hcorrection_scale + have hlocal : + sqWeightedMeasure f volume ({y | M * level < ‖f y‖} ∩ Metric.closedBall x (5 * r)) ≤ + (Kh * m + Kc * e) * Q := by + calc + sqWeightedMeasure f volume + ({y | M * level < ‖f y‖} ∩ Metric.closedBall x (5 * r)) ≤ + 2 * ENNReal.ofReal ((M * level / 2) ^ (2 - q.exponent.toReal)) * + (∫⁻ y in child, ENNReal.ofReal (‖v y‖ ^ q.exponent.toReal) ∂volume) + + 6 * (∫⁻ y in child, + ENNReal.ofReal (‖f y - v y‖ ^ (2 : ℕ)) ∂volume) := htail + _ ≤ Kh * m * Q + Kc * e * Q := + add_le_add hharmonic_local hcorrection_local + _ = (Kh * m + Kc * e) * Q := by ring + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField H + have hg : MemLp g 2 volume := by + simpa only [g] using hH.const_smul sigma0⁻¹ + have htransfer : Q ≤ + 2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | eps * level / 2 < ‖g y‖} ∩ Metric.closedBall x r) := by + dsimp only [Q] + exact goodLambdaCombinedEnergy_eq_tail_transfer f g heps hr + hf.aestronglyMeasurable hg.aestronglyMeasurable + (hf.integrable_norm_pow (by norm_num)) + (hg.integrable_norm_pow (by norm_num)) x (by simpa only [g] using hstop) + have hpropagated : + sqWeightedMeasure f volume ({y | M * level < ‖f y‖} ∩ Metric.closedBall x (5 * r)) ≤ + (Kh * m + Kc * e) * + (2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | eps * level / 2 < ‖g y‖} ∩ Metric.closedBall x r)) := + hlocal.trans (by + calc + (Kh * m + Kc * e) * Q = Q * (Kh * m + Kc * e) := by ring + _ ≤ (2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | eps * level / 2 < ‖g y‖} ∩ Metric.closedBall x r)) * + (Kh * m + Kc * e) := by + simpa only [mul_comm] using + (mul_le_mul_right htransfer (Kh * m + Kc * e)) + _ = _ := by ring) + let Tf : ℝ≥0∞ := sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + let Tg : ℝ≥0∞ := ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | eps * level / 2 < ‖g y‖} ∩ Metric.closedBall x r) + have hfactor : + (Kh * m + Kc * e) * (2 * Tf + 2 * Tg) ≤ + (2 * Kh + 2 * Kc) * (m + e) * (Tf + Tg) := + oneBall_tail_coefficient_factor Kh Kc m e Tf Tg + have hKc : 2 * Kc = 12 * ENNReal.ofReal ((5 * (3 : ℝ) ^ depth) ^ d) := by + dsimp only [Kc] + have hP : (5 * (3 : ℝ≥0∞) ^ depth) ^ d = + ENNReal.ofReal ((5 * (3 : ℝ) ^ depth) ^ d) := by + calc + (5 * (3 : ℝ≥0∞) ^ depth) ^ d = + (ENNReal.ofReal (5 * (3 : ℝ) ^ depth)) ^ d := by + congr 2 + rw [ENNReal.ofReal_mul (by norm_num : (0 : ℝ) ≤ 5), + ENNReal.ofReal_pow (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + _ = ENNReal.ofReal ((5 * (3 : ℝ) ^ depth) ^ d) := by + exact (ENNReal.ofReal_pow + (by positivity : 0 ≤ 5 * (3 : ℝ) ^ depth) d).symm + rw [hP] + ring + calc + sqWeightedMeasure f volume ({y | M * level < ‖f y‖} ∩ Metric.closedBall x (5 * r)) ≤ + (Kh * m + Kc * e) * + (2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | eps * level / 2 < ‖g y‖} ∩ Metric.closedBall x r)) := hpropagated + _ = (Kh * m + Kc * e) * (2 * Tf + 2 * Tg) := by + dsimp only [Tf, Tg] + ring + _ ≤ (2 * Kh + 2 * Kc) * (m + e) * (Tf + Tg) := hfactor + _ = oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure f volume ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField H) volume + ({y | eps * level / 2 < ‖(sigma0⁻¹ • hilbertifyVecField H) y‖} ∩ + Metric.closedBall x r)) := by + rw [hKc] + dsimp only [Kh, m, e, Tf, Tg, g, oneStoppingBallCoefficient] + ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedGlobalEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedGlobalEnergy.lean new file mode 100644 index 0000000000..7dc9dc2aca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedGlobalEnergy.lean @@ -0,0 +1,301 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert + +/-! # Reflected Global Energy -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-! +# Global energy of the reflected zero extensions + +The global stopping argument applies to the zero extensions of the gradient +and of the datum on the reflected parent cube. This file keeps the exact +`3^d` reflection factor and the `sigma0⁻¹` datum normalization visible in the +real cutoff used at the large scale. +-/ + +/-- The smallest scale used by the global good-`lambda` stopping argument. -/ +noncomputable def reflectedStoppingRadius {d : ℕ} (m : ℤ) (depth : ℕ) : ℝ := + cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth) + +/-- The global squared energy of the two zero-extended reflected fields. -/ +noncomputable def reflectedGlobalSquaredEnergy {d : ℕ} (m : ℤ) + (eps sigma0 : ℝ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (HP : Vec d → Vec d) : ℝ := + (∫ x, ‖reflectedParentGradientExtension m uP x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * + ∫ x, ‖sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ) ∂volume + +/-- The source-cube expression exactly represented by the global reflected +energy. The scalar normalization of the datum is deliberately explicit. -/ +noncomputable def reflectedSourceSquaredEnergy {d : ℕ} (m : ℤ) + (eps sigma0 : ℝ) + (u : H10Function (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : ℝ := + (3 : ℝ) ^ d * + ((∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * (sigma0⁻¹) ^ (2 : ℕ) * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume) + +/-- The real large-scale cutoff for the reflected fields. In particular, it +contains both the exact outer reflection mass `(3 : ℝ)^d` and the squared +scaled-datum factor `(eps⁻¹)^2 * (sigma0⁻¹)^2`. -/ +noncomputable def reflectedGoodLambdaCutoff {d : ℕ} (m : ℤ) (depth : ℕ) + (eps sigma0 : ℝ) + (u : H10Function (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : ℝ := + Real.sqrt (((2 * reflectedStoppingRadius (d := d) m depth) ^ d)⁻¹ * + reflectedSourceSquaredEnergy (d := d) m eps sigma0 u H) + +theorem reflectedStoppingRadius_pos {d : ℕ} (m : ℤ) (depth : ℕ) : + 0 < reflectedStoppingRadius (d := d) m depth := by + unfold reflectedStoppingRadius + exact div_pos (cubeRadius_pos (originCube d m)) (by positivity) + +theorem reflectedGoodLambdaCutoff_nonneg {d : ℕ} (m : ℤ) (depth : ℕ) + (eps sigma0 : ℝ) + (u : H10Function (openCubeSet (originCube d m))) + (H : Vec d → Vec d) : + 0 ≤ reflectedGoodLambdaCutoff m depth eps sigma0 u H := by + unfold reflectedGoodLambdaCutoff + exact Real.sqrt_nonneg _ + +private theorem integral_sqNorm_indicator_hilbertifyVecField + {d : ℕ} (U : Set (Vec d)) (hU : MeasurableSet U) (G : Vec d → Vec d) : + ∫ x, ‖U.indicator (hilbertifyVecField G) x‖ ^ (2 : ℕ) ∂volume = + ∫ x in U, ‖hilbertifyVecField G x‖ ^ (2 : ℕ) ∂volume := by + have hpoint : + (fun x : Vec d => ‖U.indicator (hilbertifyVecField G) x‖ ^ (2 : ℕ)) = + U.indicator (fun x => ‖hilbertifyVecField G x‖ ^ (2 : ℕ)) := by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · simp [Set.indicator_of_notMem hx] + rw [hpoint, integral_indicator_eq_integral_restrict hU] + +/-- Zero-extending a parent gradient has exactly its parent-cube squared +energy. -/ +theorem integral_sqNorm_reflectedParentGradientExtension + {d : ℕ} (m : ℤ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) : + ∫ x, ‖reflectedParentGradientExtension m uP x‖ ^ (2 : ℕ) ∂volume = + ∫ x in openCubeSet (originCube d (m + 1)), + ‖hilbertifyVecField uP.grad x‖ ^ (2 : ℕ) + ∂volume := by + simpa only [reflectedParentGradientExtension] using + integral_sqNorm_indicator_hilbertifyVecField + (openCubeSet (originCube d (m + 1))) + (measurableSet_openCubeSet (originCube d (m + 1))) uP.grad + +/-- Zero-extending a parent vector datum has exactly its parent-cube squared +energy in the Hilbert realization. -/ +theorem integral_sqNorm_hilbertify_reflectedParentDatumExtension + {d : ℕ} (m : ℤ) (HP : Vec d → Vec d) : + ∫ x, ‖hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ (2 : ℕ) + ∂volume = + ∫ x in openCubeSet (originCube d (m + 1)), + ‖hilbertifyVecField HP x‖ ^ (2 : ℕ) ∂volume := by + rw [hilbertifyVecField_reflectedParentDatumExtension] + exact integral_sqNorm_indicator_hilbertifyVecField + (openCubeSet (originCube d (m + 1))) + (measurableSet_openCubeSet (originCube d (m + 1))) HP + +theorem integral_sqNorm_reflectedParentGradientExtension_eq_three_pow + {d : ℕ} {m : ℤ} + (u : H10Function (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (huP : uP.grad = cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) : + ∫ x, ‖reflectedParentGradientExtension m uP x‖ ^ (2 : ℕ) ∂volume = + (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField u.toH1Function.grad x‖ ^ (2 : ℕ) + ∂volume := by + have hu : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => u.toH1Function.grad y) := by + simpa only [MemVectorL2, volumeMeasureOn] using u.toH1Function.grad_memVectorL2 + rw [integral_sqNorm_reflectedParentGradientExtension, huP] + simpa only [hilbertifyVecField, HilbertVec.norm_sq_ofVec] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_self_pairing_of_memVectorL2_three_pow + hu + +theorem integral_sqNorm_hilbertify_reflectedParentDatumExtension_eq_three_pow + {d : ℕ} {m : ℤ} (H : Vec d → Vec d) (HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + ∫ x, ‖hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ (2 : ℕ) + ∂volume = + (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + rw [integral_sqNorm_hilbertify_reflectedParentDatumExtension, hHP] + simpa only [hilbertifyVecField, HilbertVec.norm_sq_ofVec] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_self_pairing_of_memVectorL2_three_pow + hH + +/-- The zero extensions are globally square-integrable whenever their parent +fields are square-integrable on the reflected parent cube. -/ +theorem memLp_reflectedParentGradientExtension_two + {d : ℕ} (m : ℤ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) : + MemLp (reflectedParentGradientExtension m uP) 2 volume := by + rw [show reflectedParentGradientExtension m uP = + (openCubeSet (originCube d (m + 1))).indicator + (hilbertifyVecField uP.grad) by rfl, + memLp_indicator_iff_restrict (measurableSet_openCubeSet (originCube d (m + 1)))] + exact memHilbertVectorL2_hilbertifyVecField uP.grad_memVectorL2 + +theorem memLp_hilbertify_reflectedParentDatumExtension_two + {d : ℕ} (m : ℤ) (HP : Vec d → Vec d) + (hHP : MemVectorL2 (openCubeSet (originCube d (m + 1))) HP) : + MemLp (hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume := by + rw [hilbertifyVecField_reflectedParentDatumExtension, + memLp_indicator_iff_restrict (measurableSet_openCubeSet (originCube d (m + 1)))] + exact memHilbertVectorL2_hilbertifyVecField hHP + +/-- The reflected source datum supplies the global `L²` input needed by the +good-`lambda` stopping construction after extension by zero. -/ +theorem memLp_hilbertify_reflectedParentDatumExtension_two_of_reflection + {d : ℕ} {m : ℤ} (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + MemLp (hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume := by + apply memLp_hilbertify_reflectedParentDatumExtension_two m HP + rw [hHP] + exact memVectorL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField hH + +/-- The squared gradient of the zero extension is globally integrable. -/ +theorem integrable_sqNorm_reflectedParentGradientExtension + {d : ℕ} (m : ℤ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) : + Integrable (fun x => ‖reflectedParentGradientExtension m uP x‖ ^ (2 : ℕ)) volume := + (memLp_reflectedParentGradientExtension_two m uP).integrable_norm_pow (by norm_num) + +/-- The squared scaled datum of the zero extension is globally integrable. -/ +theorem integrable_sqNorm_smul_hilbertify_reflectedParentDatumExtension + {d : ℕ} (m : ℤ) (sigma0 : ℝ) (HP : Vec d → Vec d) + (hHP : MemVectorL2 (openCubeSet (originCube d (m + 1))) HP) : + Integrable (fun x => + ‖sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ (2 : ℕ)) + volume := by + have hmem : MemLp + (sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume := + (memLp_hilbertify_reflectedParentDatumExtension_two m HP hHP).const_smul sigma0⁻¹ + exact hmem.integrable_norm_pow (by norm_num) + +theorem integrable_sqNorm_smul_hilbertify_reflectedParentDatumExtension_of_reflection + {d : ℕ} {m : ℤ} (sigma0 : ℝ) (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + Integrable (fun x => + ‖sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ (2 : ℕ)) + volume := by + have hmem : MemLp + (sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume := + (memLp_hilbertify_reflectedParentDatumExtension_two_of_reflection H HP hH hHP).const_smul + sigma0⁻¹ + exact hmem.integrable_norm_pow (by norm_num) + +/-- The exact scalar rescaling of the reflected datum energy. -/ +theorem integral_sqNorm_smul_hilbertify_reflectedParentDatumExtension_eq_three_pow + {d : ℕ} {m : ℤ} {sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (H : Vec d → Vec d) (HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + ∫ x, ‖sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ) ∂volume = + (sigma0⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖hilbertifyVecField H x‖ ^ (2 : ℕ) ∂volume := by + have hpoint : + (fun x : Vec d => + ‖sigma0⁻¹ • hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ + (2 : ℕ)) = + fun x => (sigma0⁻¹) ^ (2 : ℕ) * + ‖hilbertifyVecField (reflectedParentDatumExtension m HP) x‖ ^ (2 : ℕ) := by + funext x + rw [norm_smul, Real.norm_of_nonneg (inv_nonneg.mpr hsigma0.le)] + ring + rw [hpoint, MeasureTheory.integral_const_mul, + integral_sqNorm_hilbertify_reflectedParentDatumExtension_eq_three_pow H HP hH hHP] + ring + +/-- The global squared energy of the zero-extended reflected fields is +exactly `3^d` times the Euclidean source-cube energy, including the scaled +datum factor. -/ +theorem reflectedGlobalSquaredEnergy_eq_reflectedSourceSquaredEnergy + {d : ℕ} {m : ℤ} {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (huP : uP.grad = cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + reflectedGlobalSquaredEnergy m eps sigma0 uP HP = + reflectedSourceSquaredEnergy m eps sigma0 u H := by + unfold reflectedGlobalSquaredEnergy reflectedSourceSquaredEnergy + rw [integral_sqNorm_reflectedParentGradientExtension_eq_three_pow u uP huP, + integral_sqNorm_smul_hilbertify_reflectedParentDatumExtension_eq_three_pow + hsigma0 H HP hH hHP] + ring + +/-- The source-facing large-scale cutoff is exactly the cutoff formed from +the global energy of the actual zero extensions. -/ +theorem reflectedGoodLambdaCutoff_eq_globalEnergy + {d : ℕ} {m : ℤ} {depth : ℕ} {eps sigma0 : ℝ} (hsigma0 : 0 < sigma0) + (u : H10Function (openCubeSet (originCube d m))) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (H HP : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (huP : uP.grad = cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) + (hHP : HP = cubeDirichletOddReflectionVectorField (originCube d m) H) : + reflectedGoodLambdaCutoff m depth eps sigma0 u H = + Real.sqrt (((2 * reflectedStoppingRadius (d := d) m depth) ^ d)⁻¹ * + reflectedGlobalSquaredEnergy m eps sigma0 uP HP) := by + unfold reflectedGoodLambdaCutoff + rw [reflectedGlobalSquaredEnergy_eq_reflectedSourceSquaredEnergy + hsigma0 u uP H HP hH huP hHP] + +/-- A nontrivial source energy makes the large-scale cutoff strictly positive. +This is intentionally conditional: zero source data have zero cutoff. -/ +theorem reflectedGoodLambdaCutoff_pos_of_sourceSquaredEnergy_pos + {d : ℕ} (m : ℤ) (depth : ℕ) (eps sigma0 : ℝ) + (u : H10Function (openCubeSet (originCube d m))) (H : Vec d → Vec d) + (henergy : 0 < reflectedSourceSquaredEnergy m eps sigma0 u H) : + 0 < reflectedGoodLambdaCutoff m depth eps sigma0 u H := by + unfold reflectedGoodLambdaCutoff + apply Real.sqrt_pos.2 + have hrho : 0 < reflectedStoppingRadius (d := d) m depth := + reflectedStoppingRadius_pos m depth + exact mul_pos (inv_pos.mpr (pow_pos (mul_pos (by norm_num) hrho) _)) henergy + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedHessianRowOneLevelTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedHessianRowOneLevelTail.lean new file mode 100644 index 0000000000..cde8e209c9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedHessianRowOneLevelTail.lean @@ -0,0 +1,582 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorHessianRowTailTransfer +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentHessianRowIdentification +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionScalarWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianRowL2Energy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakPoissonDerivative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentApprox + +/-! +# One-level tails for Hessian rows of scalar Dirichlet solutions + +This file crosses the global good-`lambda` seam for one weak-Hessian row. It +constructs both the source Hessian and the canonical half-parent Hessian, +identifies their rows by mixed-parity reflection, and transfers the interior +one-level estimate back to the source cube. No regularity, comparison, or +reflection premise is exposed to the caller. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-- A source-facing large-scale cutoff for one reflected Hessian row. The +first energy is bounded by the source weak-`H²` coordinate sum; the second is +the exact raw source scalar `L²` energy. -/ +noncomputable def reflectedHessianRowGoodLambdaCutoff + {d : ℕ} {m : ℤ} (depth : ℕ) (eps : ℝ) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (F : Vec d → ℝ) : ℝ := + Real.sqrt + (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), F x * F x + ∂MeasureTheory.volume)) + +theorem reflectedHessianRowGoodLambdaCutoff_nonneg + {d : ℕ} {m : ℤ} (depth : ℕ) (eps : ℝ) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (F : Vec d → ℝ) : + 0 ≤ reflectedHessianRowGoodLambdaCutoff depth eps H F := + Real.sqrt_nonneg _ + +private theorem integral_sqNorm_reflectedHessianRow_parent_le + {d : ℕ} {m : ℤ} + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) : + ∫ x in openCubeSet (originCube d (m + 1)), + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ H.hess i j y) x)‖ ^ (2 : ℕ) + ∂volume ≤ + (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) := by + let R : Vec d → Vec d := fun y j ↦ H.hess i j y + have hR : MemVectorL2 (openCubeSet (originCube d m)) R := by + change MemLp R 2 (volumeMeasureOn (openCubeSet (originCube d m))) + rw [MeasureTheory.memLp_pi_iff] + intro j + exact H.hess_memL2 i j + have hrowMem : MemLp (hilbertifyVecField R) 2 + (volumeMeasureOn (openCubeSet (originCube d m))) := by + simpa only [R] using H.hessianHilbertRow_memLp_two i + have hrowNorm : + (eLpNorm (hilbertifyVecField R) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))).toReal ≤ + H.hessianCoordL2NormSum := by + simpa only [R] using H.toReal_eLpNorm_hessianHilbertRow_two_le i + have hrowIntegral : + ∫ x in openCubeSet (originCube d m), + ‖HilbertVec.ofVec (R x)‖ ^ (2 : ℕ) ∂volume ≤ + H.hessianCoordL2NormSum ^ (2 : ℕ) := by + have heq := toReal_eLpNorm_two_sq_eq_integral_norm_sq hrowMem + have heq' : + (eLpNorm (hilbertifyVecField R) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))).toReal ^ 2 = + ∫ x in openCubeSet (originCube d m), + ‖HilbertVec.ofVec (R x)‖ ^ (2 : ℕ) ∂volume := by + simpa only [volumeMeasureOn, hilbertifyVecField] using heq + have hnorm_nonneg : + 0 ≤ (eLpNorm (hilbertifyVecField R) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))).toReal := + ENNReal.toReal_nonneg + nlinarith [heq', H.hessianCoordL2NormSum_nonneg, sq_nonneg + (H.hessianCoordL2NormSum - + (eLpNorm (hilbertifyVecField R) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))).toReal)] + calc + ∫ x in openCubeSet (originCube d (m + 1)), + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)‖ ^ (2 : ℕ) ∂volume = + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) R x) + (cubeDirichletOddReflectionVectorField (originCube d m) R x) + ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d (m + 1))) ?_ + intro x _hx + calc + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)‖ ^ (2 : ℕ) = + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField + (originCube d m) R x)‖ ^ (2 : ℕ) := + congrArg (fun t : ℝ ↦ t ^ (2 : ℕ)) + (norm_hilbertVec_cubeDirichletOddReflectionHessianRowVectorField_eq_oddReflection + (originCube d m) i R x) + _ = vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) R x) + (cubeDirichletOddReflectionVectorField (originCube d m) R x) := + HilbertVec.norm_sq_ofVec _ + _ = (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), vecDot (R x) (R x) + ∂volume := + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_self_pairing_of_memVectorL2_three_pow + hR + _ = (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), + ‖HilbertVec.ofVec (R x)‖ ^ (2 : ℕ) ∂volume := by + congr 1 + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d m)) ?_ + intro x _hx + exact (HilbertVec.norm_sq_ofVec (R x)).symm + _ ≤ (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) := + mul_le_mul_of_nonneg_left hrowIntegral (by positivity) + +private theorem integral_sqNorm_openParentGradientExtension_hessianRow_le + {d : ℕ} {m : ℤ} + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) + (uU : H1Function + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (hrow : hilbertifyVecField uU.grad =ᵐ[ + volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ H.hess i j y) x)) : + ∫ x, ‖openParentGradientExtension + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) uU x‖ ^ + (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) := by + let U : Set (Vec d) := + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let P : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let row : Vec d → HilbertVec d := fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ H.hess i j y) x) + have hUmeas : MeasurableSet U := + (isOpen_scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)).measurableSet + have hUP : U ⊆ P := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + (originCube d (m + 1)) (by norm_num : 0 ≤ (1 / 2 : ℝ)) + (by norm_num : (1 / 2 : ℝ) < 1) + intro j + exact le_of_lt (hx j) + have hrowMem : MemLp row 2 (volume.restrict P) := by + exact memLp_openCubeSet_succ_originCube_hessianRowVectorField + i FiniteLpExponent.two (H.hessianHilbertRow_memLp_two i) + have hrowInt : IntegrableOn (fun x ↦ ‖row x‖ ^ (2 : ℕ)) P volume := + hrowMem.integrable_norm_pow (by norm_num) + have hzero : + (fun x ↦ ‖openParentGradientExtension U uU x‖ ^ (2 : ℕ)) = + U.indicator (fun x ↦ ‖hilbertifyVecField uU.grad x‖ ^ (2 : ℕ)) := by + funext x + by_cases hx : x ∈ U + · simp [openParentGradientExtension, hx] + · simp [openParentGradientExtension, hx] + calc + ∫ x, ‖openParentGradientExtension U uU x‖ ^ (2 : ℕ) ∂volume = + ∫ x in U, ‖hilbertifyVecField uU.grad x‖ ^ (2 : ℕ) ∂volume := by + rw [hzero, integral_indicator_eq_integral_restrict hUmeas] + _ = ∫ x in U, ‖row x‖ ^ (2 : ℕ) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hrow] with x hx + rw [hx] + _ ≤ ∫ x in P, ‖row x‖ ^ (2 : ℕ) ∂volume := by + apply MeasureTheory.setIntegral_mono_set hrowInt + · exact Filter.Eventually.of_forall fun x ↦ sq_nonneg ‖row x‖ + · exact Filter.Eventually.of_forall hUP + _ ≤ (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) := by + simpa only [row, P] using + integral_sqNorm_reflectedHessianRow_parent_le H i + +private theorem integral_sqNorm_openParentDatumExtension_single_le + {d : ℕ} {m : ℤ} (i : Fin d) (F : Vec d → ℝ) + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) : + ∫ x, ‖hilbertifyVecField + (openParentDatumExtension + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) + (fun y j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F y else 0)) x‖ ^ + (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), F x * F x ∂volume := by + let U : Set (Vec d) := + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let P : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let FR : Vec d → ℝ := + cubeDirichletOddReflectionScalar (originCube d m) F + let datum : Vec d → Vec d := fun y j ↦ if j = i then FR y else 0 + have hUmeas : MeasurableSet U := + (isOpen_scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)).measurableSet + have hUP : U ⊆ P := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + (originCube d (m + 1)) (by norm_num : 0 ≤ (1 / 2 : ℝ)) + (by norm_num : (1 / 2 : ℝ) < 1) + intro j + exact le_of_lt (hx j) + have hFR : MemScalarL2 P FR := by + simpa only [P, FR] using + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) hF + have hFRint : IntegrableOn (fun x ↦ FR x * FR x) P volume := + hFR.integrable_mul hFR + have hdatumPoint (x : Vec d) : datum x = Pi.single i (FR x) := by + funext j + by_cases hji : j = i + · subst j + simp [datum] + · simp [datum, hji] + have hdatumSq : ∀ x, ‖(hilbertifyVecField datum) x‖ ^ (2 : ℕ) = + FR x * FR x := by + intro x + change ‖HilbertVec.ofVec (datum x)‖ ^ (2 : ℕ) = FR x * FR x + rw [hdatumPoint] + have hkey : ‖HilbertVec.ofVec (Pi.single i (FR x))‖ = ‖FR x‖ := + PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d => ℝ) i (FR x) + rw [hkey, Real.norm_eq_abs, sq_abs] + ring + have hzero : + (fun x ↦ ‖hilbertifyVecField (openParentDatumExtension U datum) x‖ ^ + (2 : ℕ)) = U.indicator (fun x ↦ FR x * FR x) := by + funext x + by_cases hx : x ∈ U + · rw [hilbertifyVecField_openParentDatumExtension, + Set.indicator_of_mem hx, Set.indicator_of_mem hx] + exact hdatumSq x + · rw [hilbertifyVecField_openParentDatumExtension, + Set.indicator_of_notMem hx, Set.indicator_of_notMem hx] + simp + calc + ∫ x, ‖hilbertifyVecField (openParentDatumExtension U datum) x‖ ^ + (2 : ℕ) ∂volume = + ∫ x in U, FR x * FR x ∂volume := by + rw [hzero, integral_indicator_eq_integral_restrict hUmeas] + _ ≤ ∫ x in P, FR x * FR x ∂volume := by + apply MeasureTheory.setIntegral_mono_set hFRint + · exact Filter.Eventually.of_forall fun x ↦ mul_self_nonneg (FR x) + · exact Filter.Eventually.of_forall hUP + _ = (3 : ℝ) ^ d * + ∫ x in openCubeSet (originCube d m), F x * F x ∂volume := by + simpa only [P, FR] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + hF + +/-- The global source-cube one-level good-`lambda` estimate for every Hessian +row of a scalar Dirichlet Poisson solution. All weak Hessians, reflected +representatives, local equations, and tail transfers are constructed inside +the theorem. -/ +theorem exists_hasWeakHessianOn_sqWeightedMeasure_oneLevel_tail_originCube + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (hq : 2 < q.exponent.toReal) {m : ℤ} {eps M : ℝ} + (heps : 0 < eps) (heps_one : eps ≤ 1) (hM : 1 ≤ M) + (F : Vec d → ℝ) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d m))) + (u : H10Function (openCubeSet (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) : + ∃ H : HasWeakHessianOn + (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact + (originCube d m) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F ∧ + ∀ (i : Fin d) (level : ℝ), + reflectedHessianRowGoodLambdaCutoff depth eps H F < level → + sqWeightedMeasure + (hilbertifyVecField (fun x j ↦ H.hess i j x)) volume + ({x | M * level < + ‖hilbertifyVecField (fun y j ↦ H.hess i j y) x‖} ∩ + openCubeSet (originCube d m)) ≤ + ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure + (hilbertifyVecField (fun x j ↦ H.hess i j x)) volume + ({x | level / 2 < + ‖hilbertifyVecField (fun y j ↦ H.hess i j y) x‖} ∩ + openCubeSet (originCube d m)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure F volume + ({x | eps * level / 2 < ‖F x‖} ∩ + openCubeSet (originCube d m))) := by + obtain ⟨H, hH⟩ := + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityExact + (originCube d m)).2 u F hF hweak + refine ⟨H, hH, ?_⟩ + obtain ⟨uP, _huPfun, huPgrad, hweakP, uU, _huUfun, huUgrad, HU, _hHU⟩ := + hweak.exists_cubeDirichletOddReflectionParent_innerHalf_hasWeakHessianOn hF + intro i level hlevel + let Q : Set (Vec d) := openCubeSet (originCube d m) + let U : Set (Vec d) := + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let FR : Vec d → ℝ := + cubeDirichletOddReflectionScalar (originCube d m) F + let datum : Vec d → Vec d := fun x j ↦ if j = i then FR x else 0 + let rowU : H1Function U := HU.gradCoordH1Function i + let R : Vec d → Vec d := fun x j ↦ H.hess i j x + let row : Vec d → HilbertVec d := hilbertifyVecField R + have hUopen : IsOpen U := + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos + (originCube d (m + 1)) (by norm_num : 0 < (1 / 2 : ℝ))).isOpen + have hUparent : U ⊆ openCubeSet (originCube d (m + 1)) := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + (originCube d (m + 1)) (by norm_num : 0 ≤ (1 / 2 : ℝ)) + (by norm_num : (1 / 2 : ℝ) < 1) + intro j + exact le_of_lt (hx j) + have hQU : Q ⊆ U := by + change openCubeSet (originCube d m) ⊆ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + rw [← scaledOpenCubeSet_originCube_succ_one_div_three] + intro x hx j + have hxj := hx j + change |x j - cubeCenter (originCube d (m + 1)) j| < + (1 / 2 : ℝ) * cubeRadius (originCube d (m + 1)) + change |x j - cubeCenter (originCube d (m + 1)) j| < + (1 / 3 : ℝ) * cubeRadius (originCube d (m + 1)) at hxj + nlinarith [cubeRadius_pos (originCube d (m + 1))] + have hFopen : MemScalarL2 Q F := by + simpa only [Q] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure + (originCube d m) hF + have hFRparent : MemScalarL2 + (openCubeSet (originCube d (m + 1))) FR := by + simpa only [FR] using + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) hFopen + have hFRU : MemScalarL2 U FR := memL2On_mono hUparent hFRparent + have hweakU : WeakPoissonEquationOn U uU FR := by + have hres := hweakP.restrict hUopen hUparent + intro φ hφ hφs hφsub + have ht := hres.test φ hφ hφs hφsub + simpa only [H1Function.restrict, huUgrad] using ht + have hweakRow : ∀ φ : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + (1 : ℝ) * ∫ y in U, + vecDot (rowU.grad y) (euclideanGradient φ y) ∂volume = + -∫ y in U, vecDot (datum y) (euclideanGradient φ y) ∂volume := by + simpa only [rowU, datum, FR, one_mul] using + hweakU.gradCoordH1Function_weakDivergence hUopen hFRU HU i + have hdatum : MemVectorL2 U datum := by + simpa only [datum] using memVectorL2_singleCoordinate hFRU i + have hidentified := + H.cubeDirichletOddReflectionParent_innerHalf_hessianRow_ae_eq + huPgrad huUgrad HU i + have hUrow : hilbertifyVecField rowU.grad =ᵐ[volume.restrict U] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x) := by + simpa only [rowU, R, U, hilbertifyVecField, + HasWeakHessianOn.gradCoordH1Function_grad] using! hidentified + have hQsource : openParentGradientExtension U rowU =ᵐ[volume.restrict Q] row := by + have hrestricted := hUrow.filter_mono + (ae_mono (Measure.restrict_mono hQU le_rfl)) + filter_upwards [hrestricted, ae_restrict_mem + (measurableSet_openCubeSet (originCube d m))] with x hx hxQ + change U.indicator (hilbertifyVecField rowU.grad) x = row x + rw [Set.indicator_of_mem (hQU hxQ), hx] + change HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x) = HilbertVec.ofVec (R x) + rw [cubeDirichletOddReflectionHessianRowVectorField_eq_self_of_mem_openCubeSet + (originCube d m) i R hxQ] + have hRmeas : AEStronglyMeasurable row (volume.restrict Q) := by + simpa only [row, R, Q] using + (H.hessianHilbertRow_memLp_two i).aestronglyMeasurable + have htransfer := + openParentGradientExtension_reflectedHessianRow_tail_transfer + i R hRmeas rowU hUrow hQsource + have hgradientEnergy : + ∫ x, ‖openParentGradientExtension U rowU x‖ ^ (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) := by + simpa only [U, rowU, R] using + integral_sqNorm_openParentGradientExtension_hessianRow_le H i rowU hUrow + have hdatumEnergy : + ∫ x, ‖hilbertifyVecField (openParentDatumExtension U datum) x‖ ^ + (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * ∫ x in Q, F x * F x ∂volume := by + simpa only [U, datum, FR, Q] using + integral_sqNorm_openParentDatumExtension_single_le i F hFopen + have hcutoff : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖openParentGradientExtension U rowU y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, + ‖((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) y‖ ^ (2 : ℕ) ∂volume)) < level := by + have henergy : + (∫ y, ‖openParentGradientExtension U rowU y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, + ‖((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) y‖ ^ (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in Q, F x * F x ∂volume := by + simp only [inv_one, one_smul] + calc + (∫ y, ‖openParentGradientExtension U rowU y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, + ‖hilbertifyVecField + (openParentDatumExtension U datum) y‖ ^ (2 : ℕ) ∂volume ≤ + (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ) * + ((3 : ℝ) ^ d * ∫ x in Q, F x * F x ∂volume) := + add_le_add hgradientEnergy + (mul_le_mul_of_nonneg_left hdatumEnergy (sq_nonneg eps⁻¹)) + _ = (3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in Q, F x * F x ∂volume := by ring + have hfactor : + 0 ≤ (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹) := by + apply inv_nonneg.mpr + apply pow_nonneg + exact mul_nonneg (by norm_num) + (div_nonneg (cubeRadius_pos _).le (by positivity)) + apply lt_of_le_of_lt (Real.sqrt_le_sqrt + (mul_le_mul_of_nonneg_left henergy hfactor)) + simpa only [reflectedHessianRowGoodLambdaCutoff, Q] using hlevel + have hinterior := sqWeightedMeasure_openParent_oneLevel_tail_originCube + G hq hUopen (m := m) (sigma0 := (1 : ℝ)) (eps := eps) + (M := M) (level := level) (by norm_num) heps heps_one hM + rowU datum hdatum hweakRow + (by + intro x hx r hr hrcut + exact + stoppingComparisonParent_axisCube_subset_scaledOpenCubeSet_originCube_succ_one_div_two + depth hx hr hrcut) + hcutoff + have hself := (htransfer (level / 2)).2 + have hleft := (htransfer (M * level)).1 + have hFmeas : AEStronglyMeasurable F (volume.restrict Q) := hFopen.aestronglyMeasurable + have hdatumTail : + sqWeightedMeasure + ((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) volume + ({x | eps * level / 2 < + ‖((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) x‖} ∩ U) ≤ + ((3 : ℝ≥0∞) ^ d) * sqWeightedMeasure F volume + ({x | eps * level / 2 < ‖F x‖} ∩ Q) := by + have hindicator := sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (U := U) (B := U) (f := hilbertifyVecField datum) + (a := eps * level / 2) hUopen.measurableSet hUopen.measurableSet + (fun _ hx ↦ hx) + have hdatumPoint (x : Vec d) : datum x = Pi.single i (FR x) := by + funext j + by_cases hji : j = i + · subst j + simp [datum] + · simp [datum, hji] + have hnorm : ∀ x, ‖(hilbertifyVecField datum) x‖ = ‖FR x‖ := by + intro x + change ‖HilbertVec.ofVec (datum x)‖ = ‖FR x‖ + rw [hdatumPoint] + exact PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d => ℝ) i (FR x) + have hmeasure : sqWeightedMeasure (hilbertifyVecField datum) volume = + sqWeightedMeasure FR volume := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards with x + rw [hnorm x] + have htail : {x | eps * level / 2 < ‖(hilbertifyVecField datum) x‖} = + {x | eps * level / 2 < ‖FR x‖} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [hnorm x] + have hindicator' : + sqWeightedMeasure + (hilbertifyVecField (openParentDatumExtension U datum)) volume + ({x | eps * level / 2 < + ‖hilbertifyVecField (openParentDatumExtension U datum) x‖} ∩ U) = + sqWeightedMeasure (hilbertifyVecField datum) volume + ({x | eps * level / 2 < ‖hilbertifyVecField datum x‖} ∩ U) := by + rw [hilbertifyVecField_openParentDatumExtension] + exact hindicator + simp only [inv_one, one_smul] + calc + sqWeightedMeasure + (hilbertifyVecField (openParentDatumExtension U datum)) volume + ({x | eps * level / 2 < + ‖hilbertifyVecField (openParentDatumExtension U datum) x‖} ∩ U) = + sqWeightedMeasure (hilbertifyVecField datum) volume + ({x | eps * level / 2 < ‖hilbertifyVecField datum x‖} ∩ U) := + hindicator' + _ = sqWeightedMeasure FR volume + ({x | eps * level / 2 < ‖FR x‖} ∩ U) := by + rw [hmeasure, htail] + _ ≤ ((3 : ℝ≥0∞) ^ d) * sqWeightedMeasure F volume + ({x | eps * level / 2 < ‖F x‖} ∩ Q) := by + simpa only [U, Q, FR] using + (sqWeightedMeasure_innerHalf_succ_originCube_cubeDirichletOddReflectionScalar_tail_le + F hFmeas (a := eps * level / 2)) + calc + sqWeightedMeasure row volume + ({x | M * level < ‖row x‖} ∩ Q) = + sqWeightedMeasure (openParentGradientExtension U rowU) volume + ({x | M * level < ‖openParentGradientExtension U rowU x‖} ∩ Q) := + hleft.symm + _ ≤ + oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (openParentGradientExtension U rowU) volume + ({x | level / 2 < ‖openParentGradientExtension U rowU x‖} ∩ U) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure + ((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) volume + ({x | eps * level / 2 < + ‖((1 : ℝ)⁻¹ • hilbertifyVecField + (openParentDatumExtension U datum)) x‖} ∩ U)) := hinterior + _ ≤ oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + ((((3 : ℝ≥0∞) ^ d) * sqWeightedMeasure row volume + ({x | level / 2 < ‖row x‖} ∩ Q)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + (((3 : ℝ≥0∞) ^ d) * sqWeightedMeasure F volume + ({x | eps * level / 2 < ‖F x‖} ∩ Q))) := by + apply mul_le_mul_right + apply add_le_add + · simpa only [U, Q, row, hilbertifyVecField] using! hself + · exact mul_le_mul_right hdatumTail _ + _ = ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure row volume + ({x | level / 2 < ‖row x‖} ∩ Q) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure F volume + ({x | eps * level / 2 < ‖F x‖} ∩ Q)) := by + ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedLocalInputs.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedLocalInputs.lean new file mode 100644 index 0000000000..67abfab9e6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedLocalInputs.lean @@ -0,0 +1,171 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalParentGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeakRestriction + +/-! # Reflected Local Inputs -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Local one-ball data from a reflected parent solution + +The global good-`lambda` argument extends the reflected parent solution and +datum by zero. On each comparison parent that remains inside that reflected +cube, this module supplies precisely the local inputs of +`sqWeightedMeasure_oneStoppingBall_le`: global `L²` membership, the restricted +solution, the almost-everywhere gradient identification, and the weak equation +with the *zero-extended* datum. Thus the local PDE is derived from the single +parent equation and is never an additional hypothesis. +-/ + +/-- The zero extension of the gradient of a reflected parent solution. -/ +def reflectedParentGradientExtension {d : ℕ} (m : ℤ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) : + Vec d → HilbertVec d := + (openCubeSet (originCube d (m + 1))).indicator (hilbertifyVecField uP.grad) + +/-- The zero extension of a reflected parent vector datum. -/ +def reflectedParentDatumExtension {d : ℕ} (m : ℤ) + (HP : Vec d → Vec d) : Vec d → Vec d := + (openCubeSet (originCube d (m + 1))).indicator HP + +/-- The local solution on the comparison parent cut out of a reflected +parent solution. -/ +def reflectedParentLocalSolution {d : ℕ} {depth : ℕ} (m : ℤ) + (x : Vec d) (r : ℝ) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (hsub : axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) ⊆ openCubeSet (originCube d (m + 1))) : + H1Function (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) := + uP.restrict + (isOpen_axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth)) hsub + +/-- Hilbertification commutes with extension by zero. -/ +theorem hilbertifyVecField_reflectedParentDatumExtension + {d : ℕ} (m : ℤ) (HP : Vec d → Vec d) : + hilbertifyVecField (reflectedParentDatumExtension m HP) = + (openCubeSet (originCube d (m + 1))).indicator (hilbertifyVecField HP) := by + funext y + by_cases hy : y ∈ openCubeSet (originCube d (m + 1)) + · apply HilbertVec.ext + intro i + simp [hilbertifyVecField, reflectedParentDatumExtension, hy] + · apply HilbertVec.ext + intro i + simp [hilbertifyVecField, reflectedParentDatumExtension, hy] + +/-- A fixed reflected parent solution and datum provide the local inputs for +one stopping ball. The parent equation retains its exact coefficient and +minus sign; the final equation is its restriction to the comparison parent. +-/ +theorem reflectedParent_oneStoppingBall_inputs + {d : ℕ} [NeZero d] {depth : ℕ} {m : ℤ} {sigma0 : ℝ} + {x : Vec d} {r : ℝ} + (hx : x ∈ openCubeSet (originCube d m)) + (hr : 0 < r) + (hcutoff : r ≤ cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (HP : Vec d → Vec d) + (hHP : MemVectorL2 (openCubeSet (originCube d (m + 1))) HP) + (hweak : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ openCubeSet (originCube d (m + 1)) → + sigma0 * ∫ y in openCubeSet (originCube d (m + 1)), + vecDot (uP.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in openCubeSet (originCube d (m + 1)), + vecDot (HP y) (euclideanGradient phi y) ∂volume) : + MemLp (reflectedParentGradientExtension m uP) 2 volume ∧ + MemLp (hilbertifyVecField (reflectedParentDatumExtension m HP)) 2 volume ∧ + (reflectedParentGradientExtension m uP =ᵐ[volume.restrict + (axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth))] + hilbertifyVecField + (reflectedParentLocalSolution (depth := depth) m x r uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff)).grad) ∧ + ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → + tsupport phi ⊆ axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) → + sigma0 * ∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot + ((reflectedParentLocalSolution (depth := depth) m x r uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff)).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth), + vecDot (reflectedParentDatumExtension m HP y) + (euclideanGradient phi y) ∂volume := by + let P : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let B : Set (Vec d) := axisCube (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) + have hBP : B ⊆ P := by + simpa only [B, P] using + stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx hr hcutoff + have hPmeas : MeasurableSet P := by + simpa only [P] using measurableSet_openCubeSet (originCube d (m + 1)) + have hBmeas : MeasurableSet B := by + exact (isOpen_axisCube _ _).measurableSet + constructor + · rw [show reflectedParentGradientExtension m uP = + P.indicator (hilbertifyVecField uP.grad) by rfl, + memLp_indicator_iff_restrict hPmeas] + exact memHilbertVectorL2_hilbertifyVecField uP.grad_memVectorL2 + constructor + · rw [hilbertifyVecField_reflectedParentDatumExtension] + change MemLp (P.indicator (hilbertifyVecField HP)) 2 volume + rw [memLp_indicator_iff_restrict hPmeas] + exact memHilbertVectorL2_hilbertifyVecField hHP + constructor + · have hident := indicator_aeEq_of_subset + (μ := volume) (f := hilbertifyVecField uP.grad) hBmeas hBP + simpa only [reflectedParentGradientExtension, reflectedParentLocalSolution, + B, P, H1Function.restrict] using hident + intro phi hphi hphi_compact hphi_sub + have hlocal := weakDivergence_restrict_axisCube + (U := P) (stoppingComparisonParentCorner x r depth) + (stoppingComparisonParentSide r depth) hBP uP HP (by + simpa only [P] using hweak) + phi hphi hphi_compact (by simpa only [B] using hphi_sub) + have hdatum : + ∫ y in B, vecDot (reflectedParentDatumExtension m HP y) + (euclideanGradient phi y) ∂volume = + ∫ y in B, vecDot (HP y) (euclideanGradient phi y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun hBmeas + intro y hy + simp only [reflectedParentDatumExtension] + rw [Set.indicator_of_mem (hBP hy)] + change sigma0 * ∫ y in B, + vecDot ((uP.restrict (isOpen_axisCube _ _) hBP).grad y) + (euclideanGradient phi y) ∂volume = + -∫ y in B, vecDot (reflectedParentDatumExtension m HP y) + (euclideanGradient phi y) ∂volume + rw [hdatum] + simpa only [B, H1Function.restrict] using hlocal + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedOneLevelTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedOneLevelTail.lean new file mode 100644 index 0000000000..75b9f02a9d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedOneLevelTail.lean @@ -0,0 +1,332 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedGlobalEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalStoppingFamily +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaTailControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaVitaliAssembly +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionDivergenceRhs + +/-! +# The reflected one-level cube good-`λ` inequality + +This is the unconditional Caffarelli--Peral one-level estimate on a centered +cube. Odd reflection, extension by zero, stopping radii, local harmonic +comparison, and Vitali selection are all constructed internally. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +/-- The centered-cube one-level good-`λ` bound obtained from the reflected +parent problem. The stopping energy is the corrected square root of the sum +of the two squared normalized energies. -/ +theorem sqWeightedMeasure_reflected_oneLevel_tail_originCube + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {depth : ℕ} + (G : INTERNAL.HarmonicEuclideanGradientGain d q depth) + (hq : 2 < q.exponent.toReal) {m : ℤ} {sigma0 eps M level : ℝ} + (hsigma0 : 0 < sigma0) (heps : 0 < eps) (heps_one : eps ≤ 1) + (hM : 1 ≤ M) (u : H10Function (openCubeSet (originCube d m))) + (H : Vec d → Vec d) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hweak : ∀ psi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (psi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet (originCube d m), + vecDot (H x) (psi.toH1Function.grad x) ∂volume) + (hlevel : reflectedGoodLambdaCutoff m depth eps sigma0 u H < level) : + sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | M * level < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) ≤ + ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure (hilbertifyVecField u.toH1Function.grad) volume + ({x | level / 2 < ‖hilbertifyVecField u.toH1Function.grad x‖} ∩ + openCubeSet (originCube d m)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure (sigma0⁻¹ • hilbertifyVecField H) volume + ({x | eps * level / 2 < ‖(sigma0⁻¹ • hilbertifyVecField H) x‖} ∩ + openCubeSet (originCube d m))) := by + let Q : Set (Vec d) := openCubeSet (originCube d m) + let P : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let fu : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let g : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField H + obtain ⟨uP, _huP_fun, huP_grad, hweakP⟩ := + exists_h1Function_cubeDirichletOddReflectionParent_divergence_rhs_originCube hH hweak + let HP : Vec d → Vec d := + cubeDirichletOddReflectionVectorField (originCube d m) H + have hHP : MemVectorL2 P HP := by + simpa only [P, HP] using + memVectorL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField hH + have hweakP' : ∀ phi : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) phi → HasCompactSupport phi → tsupport phi ⊆ P → + sigma0 * ∫ y in P, vecDot (uP.grad y) (euclideanGradient phi y) ∂volume = + -∫ y in P, vecDot (HP y) (euclideanGradient phi y) ∂volume := by + simpa only [P, HP] using hweakP + let F : Vec d → HilbertVec d := reflectedParentGradientExtension m uP + let Hext : Vec d → Vec d := reflectedParentDatumExtension m HP + let gext : Vec d → HilbertVec d := sigma0⁻¹ • hilbertifyVecField Hext + have hF : MemLp F 2 volume := by + simpa only [F] using memLp_reflectedParentGradientExtension_two m uP + have hHext : MemLp (hilbertifyVecField Hext) 2 volume := by + simpa only [Hext] using + memLp_hilbertify_reflectedParentDatumExtension_two m HP hHP + have hgext : MemLp gext 2 volume := by + exact hHext.const_smul sigma0⁻¹ + have hcutoff : + Real.sqrt (((2 * (cubeRadius (originCube d m) / + (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹ * + ((∫ y, ‖F y‖ ^ (2 : ℕ) ∂volume) + + (eps⁻¹) ^ (2 : ℕ) * ∫ y, ‖gext y‖ ^ (2 : ℕ) ∂volume)) < level := by + have hglobal := reflectedGoodLambdaCutoff_eq_globalEnergy + (depth := depth) (eps := eps) hsigma0 u uP H HP hH huP_grad (by rfl) + rw [hglobal] at hlevel + simpa only [reflectedStoppingRadius, reflectedGlobalSquaredEnergy, F, Hext, gext] using! hlevel + have hlevel_pos : 0 < level := + lt_of_le_of_lt (Real.sqrt_nonneg _) hcutoff + let T : Set (Vec d) := {x | M * level < ‖F x‖} ∩ Q + obtain ⟨D, radius, hDnull, hradius⟩ := + exists_globalStoppingFamily depth F gext eps M level hF hgext heps hM + hcutoff T (by intro x hx; exact hx.1) + have hQP : Q ⊆ P := by + intro x hx + exact cubeFaceReflectionBlockSet_originCube_subset_openCubeSet_succ d m + (openCubeSet_subset_cubeFaceReflectionBlockSet (originCube d m) hx) + have hQmeas : MeasurableSet Q := by + simpa only [Q] using measurableSet_openCubeSet (originCube d m) + have hPmeas : MeasurableSet P := by + simpa only [P] using measurableSet_openCubeSet (originCube d (m + 1)) + have hFQ : F =ᵐ[volume.restrict Q] fu := by + filter_upwards [ae_restrict_mem hQmeas] with x hx + change (P.indicator (hilbertifyVecField uP.grad)) x = fu x + rw [Set.indicator_of_mem (hQP hx)] + change HilbertVec.ofVec (uP.grad x) = HilbertVec.ofVec (u.toH1Function.grad x) + rw [huP_grad, cubeDirichletOddReflectionVectorField_eq_self_of_mem_openCubeSet + (originCube d m) _ hx] + let K : ℝ≥0∞ := oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + have hvitali : sqWeightedMeasure F volume (T ∩ D) ≤ + K * oneStoppingBallTailControl F gext eps level P := by + apply measure_le_mul_measure_of_vitali_stopping_family + (sqWeightedMeasure F volume) (oneStoppingBallTailControl F gext eps level) + (T ∩ D) P radius + (cubeRadius (originCube d m) / (10 * (3 : ℝ) ^ depth)) 5 K + · intro x hx + exact (hradius x hx).2.1 + · intro x hx + exact (hradius x hx).1 + · norm_num + · intro x hx + obtain ⟨hr, hcutoffx, hstop, hlast⟩ := hradius x hx + obtain ⟨_hF, _hHext, hlocalF, hlocalweak⟩ := + reflectedParent_oneStoppingBall_inputs (depth := depth) (sigma0 := sigma0) + (by exact hx.1.2) hr hcutoffx uP HP hHP hweakP' + have hball := sqWeightedMeasure_oneStoppingBall_le G hq x hr hsigma0 heps heps_one + (lt_of_lt_of_le zero_lt_one hM) hlevel_pos hcutoffx F Hext hF hHext + (reflectedParentLocalSolution (depth := depth) m x (radius x) uP + (stoppingComparisonParent_axisCube_subset_openCubeSet_originCube_succ + depth hx.1.2 hr hcutoffx)) hlocalF hlocalweak hstop hlast + have hmono : + sqWeightedMeasure F volume ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ Metric.closedBall x (5 * radius x)) := by + apply measure_mono + intro y hy + exact ⟨hy.1.1.1, hy.2⟩ + calc + sqWeightedMeasure F volume ((T ∩ D) ∩ Metric.closedBall x (5 * radius x)) ≤ + sqWeightedMeasure F volume + ({y | M * level < ‖F y‖} ∩ Metric.closedBall x (5 * radius x)) := hmono + _ ≤ K * + (sqWeightedMeasure F volume + ({y | level / 2 < ‖F y‖} ∩ Metric.closedBall x (radius x)) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({y | eps * level / 2 < ‖gext y‖} ∩ + Metric.closedBall x (radius x))) := by + simpa only [K, gext] using hball + _ = K * oneStoppingBallTailControl F gext eps level + (Metric.closedBall x (radius x)) := by + rw [oneStoppingBallTailControl_apply F gext eps level measurableSet_closedBall] + · intro y hy + rcases Set.mem_iUnion₂.mp hy with ⟨x, hx, hyx⟩ + obtain ⟨hr, hcutoffx, _hstop, _hlast⟩ := hradius x hx + exact closedBall_subset_openCubeSet_originCube_succ_of_mem hx.1.2 hr.le + (by + have hdenom : 2 ≤ 10 * (3 : ℝ) ^ depth := by + have hpow : 1 ≤ (3 : ℝ) ^ depth := one_le_pow₀ (by norm_num) + nlinarith + exact hcutoffx.trans (div_le_div_of_nonneg_left (cubeRadius_pos _).le + (by norm_num) hdenom)) hyx + have hnuD : sqWeightedMeasure F volume Dᶜ = 0 := + MeasureTheory.withDensity_absolutelyContinuous volume _ hDnull + have hTD : sqWeightedMeasure F volume (T ∩ D) = + sqWeightedMeasure F volume T := + MeasureTheory.measure_inter_conull hnuD + have hfu_meas : AEStronglyMeasurable fu (volume.restrict Q) := by + simpa only [fu, Q, volumeMeasureOn] using + (memHilbertVectorL2_hilbertifyVecField u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hF_tail (a : ℝ) : + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) * ((3 : ℝ≥0∞) ^ d) := by + have hindicator := sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (f := hilbertifyVecField uP.grad) (a := a) + hPmeas hPmeas (by rintro x hx; exact hx) + have hreflect : + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x)‖} ∩ P) := by + simpa only [F, P, reflectedParentGradientExtension, huP_grad] using! hindicator + calc + sqWeightedMeasure F volume ({x | a < ‖F x‖} ∩ P) = + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x)‖} ∩ P) := hreflect + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) := by + simpa only [fu, Q, mul_comm] using! + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + (fun y => u.toH1Function.grad y) hfu_meas + _ = sqWeightedMeasure fu volume ({x | a < ‖fu x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by ring + have hFQpoint : ∀ x ∈ Q, F x = fu x := by + intro x hx + change (P.indicator (hilbertifyVecField uP.grad)) x = fu x + rw [Set.indicator_of_mem (hQP hx)] + change HilbertVec.ofVec (uP.grad x) = HilbertVec.ofVec (u.toH1Function.grad x) + rw [huP_grad, cubeDirichletOddReflectionVectorField_eq_self_of_mem_openCubeSet + (originCube d m) _ hx] + have hT_eq : T = {x | M * level < ‖fu x‖} ∩ Q := by + ext x + simp only [T, Set.mem_inter_iff, Set.mem_ofPred_eq] + constructor + · intro hx + exact ⟨by rw [hFQpoint x hx.2] at hx; exact hx.1, hx.2⟩ + · intro hx + exact ⟨by rw [hFQpoint x hx.2]; exact hx.1, hx.2⟩ + have hT_source : sqWeightedMeasure F volume T = + sqWeightedMeasure fu volume ({x | M * level < ‖fu x‖} ∩ Q) := by + rw [hT_eq] + exact sqWeightedMeasure_apply_inter_eq_of_ae_eq_restrict hQmeas hFQ + have hHP_scalar : + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (sigma0⁻¹ • H) x)) = + sigma0⁻¹ • hilbertifyVecField HP := by + funext x + change (HilbertVec.ofVecL d) + (cubeDirichletOddReflectionVectorField (originCube d m) (sigma0⁻¹ • H) x) = + sigma0⁻¹ • (HilbertVec.ofVecL d) (HP x) + rw [← (HilbertVec.ofVecL d).map_smul] + congr 1 + funext i + simp only [HP, cubeDirichletOddReflectionVectorField, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul] + ring + have hgext_indicator : gext = P.indicator (sigma0⁻¹ • hilbertifyVecField HP) := by + change sigma0⁻¹ • hilbertifyVecField Hext = P.indicator (sigma0⁻¹ • hilbertifyVecField HP) + rw [show hilbertifyVecField Hext = P.indicator (hilbertifyVecField HP) by + simpa only [Hext] using hilbertifyVecField_reflectedParentDatumExtension m HP] + funext x + change sigma0⁻¹ • (P.indicator (hilbertifyVecField HP)) x = + P.indicator (sigma0⁻¹ • hilbertifyVecField HP) x + by_cases hx : x ∈ P + · rw [Set.indicator_of_mem hx, Set.indicator_of_mem hx] + rfl + · rw [Set.indicator_of_notMem hx, Set.indicator_of_notMem hx] + exact smul_zero _ + have hH_source_meas : AEStronglyMeasurable (sigma0⁻¹ • hilbertifyVecField H) + (volume.restrict Q) := + (memHilbertVectorL2_hilbertifyVecField hH).const_smul sigma0⁻¹ |>.aestronglyMeasurable + have hgext_tail (a : ℝ) : + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) * ((3 : ℝ≥0∞) ^ d) := by + have hindicator := sqWeightedMeasure_indicator_tail_inter_eq_of_subset + (μ := volume) (f := sigma0⁻¹ • hilbertifyVecField HP) (a := a) + hPmeas hPmeas (by rintro x hx; exact hx) + have hreflect : + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (sigma0⁻¹ • H) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (sigma0⁻¹ • H) x)‖} ∩ P) := by + rw [hgext_indicator, hindicator] + rw [← hHP_scalar] + calc + sqWeightedMeasure gext volume ({x | a < ‖gext x‖} ∩ P) = + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (sigma0⁻¹ • H) x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) + (sigma0⁻¹ • H) x)‖} ∩ P) := hreflect + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) := by + simpa only [g, Q, mul_comm] using! + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + (sigma0⁻¹ • H) hH_source_meas + _ = sqWeightedMeasure g volume ({x | a < ‖g x‖} ∩ Q) * + ((3 : ℝ≥0∞) ^ d) := by ring + have hkappa : oneStoppingBallTailControl F gext eps level P = + sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ P) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ P) := + oneStoppingBallTailControl_apply_ambient F gext eps level hPmeas + calc + sqWeightedMeasure fu volume ({x | M * level < ‖fu x‖} ∩ Q) = + sqWeightedMeasure F volume T := hT_source.symm + _ = sqWeightedMeasure F volume (T ∩ D) := hTD.symm + _ ≤ K * oneStoppingBallTailControl F gext eps level P := hvitali + _ = K * + (sqWeightedMeasure F volume ({x | level / 2 < ‖F x‖} ∩ P) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure gext volume + ({x | eps * level / 2 < ‖gext x‖} ∩ P)) := by rw [hkappa] + _ = ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ (2 - q.exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) * + (sqWeightedMeasure fu volume + ({x | level / 2 < ‖fu x‖} ∩ Q) + + ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) * + sqWeightedMeasure g volume + ({x | eps * level / 2 < ‖g x‖} ∩ Q)) := by + rw [hF_tail (level / 2), hgext_tail (eps * level / 2)] + dsimp only [K] + ring + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentHessianRowIdentification.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentHessianRowIdentification.lean new file mode 100644 index 0000000000..6001e1f857 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentHessianRowIdentification.lean @@ -0,0 +1,190 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionHessianRowCellH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentInteriorHessian + +/-! +# Identifying the reflected-parent weak Hessian + +The canonical interior `H²` construction on the half-scaled reflected parent +produces an abstract weak Hessian. This file identifies each of its rows almost +everywhere with the mixed-parity reflection of the corresponding source row. +The proof uses weak-derivative uniqueness on each open reflection cell and the +fact that the finitely many cells cover the centered parent modulo reflecting +faces of measure zero. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace HasWeakHessianOn + +/-- On the half-scaled reflected parent, the weak Hessian row of the canonical +interior representative is the mixed-parity reflection of the source row. + +The two exact gradient identities are precisely those returned by +`exists_cubeDirichletOddReflectionParent_innerHalf_hasWeakHessianOn`. -/ +theorem cubeDirichletOddReflectionParent_innerHalf_hessianRow_ae_eq + {d : ℕ} {m : ℤ} + {u : H1Function (openCubeSet (originCube d m))} + (Hsrc : HasWeakHessianOn (openCubeSet (originCube d m)) u) + {uP : H1Function (openCubeSet (originCube d (m + 1)))} + (huP_grad : + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y ↦ u.grad y)) + {uU : H1Function + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))} + (huU_grad : uU.grad = uP.grad) + (HU : HasWeakHessianOn + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) uU) + (i : Fin d) : + (fun x ↦ HilbertVec.ofVec (fun j ↦ HU.hess i j x)) =ᵐ[ + MeasureTheory.volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ Hsrc.hess i j y) x) := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let U : Set (Vec d) := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let reflectedRow : Vec d → Vec d := + cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y j ↦ Hsrc.hess i j y) + have hUopen : IsOpen U := + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp + (by norm_num : 0 < (1 / 2 : ℝ))).isOpen + have hUparent : U ⊆ openCubeSet Qp := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Qp + (by norm_num : 0 ≤ (1 / 2 : ℝ)) (by norm_num : (1 / 2 : ℝ) < 1) + intro j + exact le_of_lt (hx j) + have hscalar : + (fun x ↦ uU.grad x i) = + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i) := by + funext x + have hx := congrArg (fun G : Vec d → Vec d ↦ G x i) + (huU_grad.trans huP_grad) + change + uU.grad x i = + cubeDirichletOddReflectionVectorField Q (fun y ↦ u.grad y) x i + at hx + rw [hx] + simp only [cubeDirichletOddReflectionVectorField, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul, + cubeDirichletOddReflectionGradientCoordScalar] + ring + have hcoordCell : ∀ (choice : Fin d → Fin 3) (j : Fin d), + (fun x ↦ HU.hess i j x) =ᵐ[ + MeasureTheory.volume.restrict + (U ∩ openCubeSet (cubeFaceReflectionCellCube Q choice))] + fun x ↦ reflectedRow x j := by + intro choice j + let cell : Set (Vec d) := + openCubeSet (cubeFaceReflectionCellCube Q choice) + let V : Set (Vec d) := U ∩ cell + have hcellOpen : IsOpen cell := + isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice) + have hVopen : IsOpen V := hUopen.inter hcellOpen + have hactual : + HasWeakPartialDerivOn V j + (cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i)) + (fun x ↦ HU.hess i j x) := by + have hweak := (HU.weak_second i j).restrict hVopen Set.inter_subset_left + rw [hscalar] at hweak + exact hweak + have hreflected : + HasWeakPartialDerivOn V j + (cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i)) + (fun x ↦ reflectedRow x j) := by + have hweak := + (Hsrc.cubeDirichletOddReflectionGradientCoord_hasWeakGradientOn_cell + choice i j).restrict hVopen Set.inter_subset_right + simpa only [reflectedRow] using hweak + have hactualLoc : MeasureTheory.LocallyIntegrableOn + (fun x ↦ HU.hess i j x) V MeasureTheory.volume := + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((HU.hess_memL2 i j).locallyIntegrable (by norm_num))).mono_set + Set.inter_subset_left + rcases + Hsrc.cubeDirichletOddReflectionHessianRowVectorField_isPotentialOn_cell + choice i with ⟨w, hw⟩ + have hreflectedLocCell : MeasureTheory.LocallyIntegrableOn + (fun x ↦ reflectedRow x j) cell MeasureTheory.volume := by + have hwLoc := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((w.gradMemL2 j).locallyIntegrable (by norm_num)) + simpa only [hw, reflectedRow] using hwLoc + have hreflectedLoc : MeasureTheory.LocallyIntegrableOn + (fun x ↦ reflectedRow x j) V MeasureTheory.volume := + hreflectedLocCell.mono_set Set.inter_subset_right + simpa only [V, cell] using + HasWeakPartialDerivOn.ae_eq hVopen hactualLoc hreflectedLoc + hactual hreflected + have hcoord : ∀ j : Fin d, + (fun x ↦ HU.hess i j x) =ᵐ[MeasureTheory.volume.restrict U] + fun x ↦ reflectedRow x j := by + intro j + have hcells : ∀ᵐ x ∂MeasureTheory.volume, + ∀ choice : Fin d → Fin 3, + x ∈ U ∩ openCubeSet (cubeFaceReflectionCellCube Q choice) → + HU.hess i j x = reflectedRow x j := by + rw [Filter.eventually_all] + intro choice + have h := hcoordCell choice j + rw [Filter.EventuallyEq, + MeasureTheory.ae_restrict_iff' + (hUopen.measurableSet.inter + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice)))] at h + exact h + have hcover : ∀ᵐ x ∂MeasureTheory.volume, + x ∈ U → + ∃ choice : Fin d → Fin 3, + x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice) := by + filter_upwards + [cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m] + with x hx xU + have xParent : x ∈ openCubeSet Qp := hUparent xU + have xBlock : x ∈ cubeFaceReflectionBlockSet Q := by + exact hx.mpr xParent + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] at xBlock + exact Set.mem_iUnion.mp xBlock + rw [Filter.EventuallyEq, + MeasureTheory.ae_restrict_iff' hUopen.measurableSet] + filter_upwards [hcells, hcover] with x hxcells hxcover xU + rcases hxcover xU with ⟨choice, hxcell⟩ + exact hxcells choice ⟨xU, hxcell⟩ + change + (fun x ↦ HilbertVec.ofVec (fun j ↦ HU.hess i j x)) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x ↦ HilbertVec.ofVec (reflectedRow x) + have hcoords : ∀ᵐ x ∂MeasureTheory.volume.restrict U, + ∀ j : Fin d, HU.hess i j x = reflectedRow x j := by + rw [Filter.eventually_all] + exact hcoord + filter_upwards [hcoords] with x hx + apply HilbertVec.ext + intro j + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hx j + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentInteriorHessian.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentInteriorHessian.lean new file mode 100644 index 0000000000..4c7318962e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectedParentInteriorHessian.lean @@ -0,0 +1,145 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry + +/-! # Reflected Parent Interior Hessian -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Interior Hessian on an odd-reflected Dirichlet parent + +This internal assembly fixes the geometric radii needed to construct a weak +Hessian on the half-scaled parent cube. It retains the exact odd-reflected +parent value, gradient, scalar forcing, and weak Poisson equation supplied by +the Dirichlet reflection construction. +-/ + +namespace CubeDirichletWeakPoissonProblem + +/-- Canonical cutoff from the half parent to the two-thirds parent. -/ +noncomputable def reflectedParentHalfTwoThirdCutoff (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff + (originCube d (m + 1)) (1 / 2 : ℝ) (2 / 3 : ℝ) := + QuantitativeCubeCutoff.canonical + (originCube d (m + 1)) (1 / 2 : ℝ) (2 / 3 : ℝ) + (by norm_num) (by norm_num) + +/-- Canonical outer cutoff leaving a strict margin outside the three-quarter +ambient cube. -/ +noncomputable def reflectedParentSevenEighthFifteenSixteenthCutoff + (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff + (originCube d (m + 1)) (7 / 8 : ℝ) (15 / 16 : ℝ) := + QuantitativeCubeCutoff.canonical + (originCube d (m + 1)) (7 / 8 : ℝ) (15 / 16 : ℝ) + (by norm_num) (by norm_num) + +/-- Canonical fixed-radius interior Hessian package for an odd-reflected +Dirichlet solution. + +The parent weak equation is returned verbatim. The restricted `H¹` function +has the same global value and gradient representatives as the parent, and its +weak Hessian retains the explicit sum of smooth-test bounds produced by the +difference-quotient construction. -/ +theorem exists_cubeDirichletOddReflectionParent_innerHalf_hasWeakHessianOn + {d : ℕ} {m : ℤ} + {u : H10Function (openCubeSet (originCube d m))} {F : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) ∧ + ∃ uS : H1Function + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : HasWeakHessianOn + (scaledOpenCubeSet + (originCube d (m + 1)) (1 / 2 : ℝ)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar + (originCube d m) F) + i (1 / 2 : ℝ) (2 / 3 : ℝ) (7 / 8 : ℝ) + (15 / 16 : ℝ) + (reflectedParentSevenEighthFifteenSixteenthCutoff + d m) := by + let Qp : TriadicCube d := originCube d (m + 1) + let V : Set (Vec d) := scaledOpenCubeSet Qp (3 / 4 : ℝ) + rcases + hweak.exists_cubeDirichletOddReflectionParent_weakPoissonEquationOn_originCube + hF with + ⟨uP, huP_toFun, huP_grad, hweakParent⟩ + have hFopen : MemScalarL2 (openCubeSet (originCube d m)) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure + (originCube d m) hF + have hFparent : + MemScalarL2 (openCubeSet Qp) + (cubeDirichletOddReflectionScalar (originCube d m) F) := by + simpa only [Qp] using + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) hFopen + have hV : IsOpenBoundedConvexDomain V := by + exact isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp + (by norm_num : 0 < (3 / 4 : ℝ)) + have hη_sub : + tsupport + (reflectedParentHalfTwoThirdCutoff d m : Vec d → ℝ) ⊆ V := by + have hclosed : + tsupport + (reflectedParentHalfTwoThirdCutoff d m : Vec d → ℝ) ⊆ + scaledClosedCubeSet Qp (2 / 3 : ℝ) := + (reflectedParentHalfTwoThirdCutoff d m).tsupport_subset_scaledClosedCubeSet_of_support_subset + exact hclosed.trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (2 / 3 : ℝ) < 3 / 4)) + have hinnerV : scaledClosedCubeSet Qp (1 / 2 : ℝ) ⊆ V := + scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (1 / 2 : ℝ) < 3 / 4) + have hVν : V ⊆ scaledClosedCubeSet Qp (3 / 4 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet Qp (3 / 4 : ℝ) + rcases + hweakParent.exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + hFparent hV (reflectedParentHalfTwoThirdCutoff d m) hη_sub hinnerV + (reflectedParentSevenEighthFifteenSixteenthCutoff d m) hVν + (by norm_num : 0 ≤ (3 / 4 : ℝ)) + (by norm_num : (3 / 4 : ℝ) < 7 / 8) + (by norm_num : (7 / 8 : ℝ) < 1) + (by norm_num : 0 ≤ (15 / 16 : ℝ)) + (by norm_num : (15 / 16 : ℝ) < 1) + (by norm_num : 0 ≤ (1 / 2 : ℝ)) with + ⟨uS, huS_toFun, huS_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, hweakParent, uS, huS_toFun, huS_grad, H, ?_⟩ + simpa only [Qp, V] using hH + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowCellH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowCellH1.lean new file mode 100644 index 0000000000..18ca73a134 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowCellH1.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionHessianRowFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 + +/-! +# Cellwise H¹ reflection of a weak Hessian row + +On a reflection cell, folding the `i`th weak-gradient coordinate and +multiplying it by the mixed sign `S * s_i` produces an `H¹` function. Its +weak gradient is exactly the mixed-parity reflection `S * s_i * s_j` of the +`i`th Hessian row. This file makes only a cellwise assertion; it does not +assert that the global mixed reflection belongs to `H¹`. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace HasWeakHessianOn + +/-- The mixed-parity reflection of the `i`th weak-gradient coordinate on one +reflection cell. -/ +noncomputable def cubeDirichletOddReflectionGradientCoordCellH1Function + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + H1Function (openCubeSet (cubeFaceReflectionCellCube Q choice)) := + cubeDirichletOddReflectionMixedCellSign choice i • + (H.gradCoordH1Function i).cubeFaceReflectionCellFold choice + +/-- The scalar representative is exactly the cellwise mixed reflection of +the source weak-gradient coordinate. -/ +@[simp] theorem cubeDirichletOddReflectionGradientCoordCellH1Function_toFun + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + (H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i).toFun = + cubeDirichletOddReflectionGradientCoordCellScalar Q choice i + (fun y ↦ u.grad y i) := + rfl + +/-- The weak gradient is exactly the cellwise mixed reflection of the `i`th +Hessian row. -/ +@[simp] theorem cubeDirichletOddReflectionGradientCoordCellH1Function_grad + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + (H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i).grad = + cubeDirichletOddReflectionHessianRowCellVectorField Q choice i + (fun y j ↦ H.hess i j y) := + rfl + +/-- The exact cellwise scalar and Hessian-row representatives satisfy the +weak-gradient identity. -/ +theorem cubeDirichletOddReflectionGradientCoordCell_hasWeakGradientOn + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + HasWeakGradientOn + (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeDirichletOddReflectionGradientCoordCellScalar Q choice i + (fun y ↦ u.grad y i)) + (cubeDirichletOddReflectionHessianRowCellVectorField Q choice i + (fun y j ↦ H.hess i j y)) := + (H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i).hasWeakGradient + +/-- The cellwise reflected Hessian row is a potential field. -/ +theorem cubeDirichletOddReflectionHessianRowCellVectorField_isPotentialOn + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeDirichletOddReflectionHessianRowCellVectorField Q choice i + (fun y j ↦ H.hess i j y)) := + (H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i).isPotentialOn + +/-- On its reflection cell, the constructed scalar agrees pointwise with the +global mixed scalar representative. -/ +theorem cubeDirichletOddReflectionGradientCoordCellH1Function_eq_global_of_mem + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i x = + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i) x := by + change + cubeDirichletOddReflectionGradientCoordCellScalar Q choice i + (fun y ↦ u.grad y i) x = + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i) x + exact + (cubeDirichletOddReflectionGradientCoordScalar_eq_cell_of_mem + Q choice i (fun y ↦ u.grad y i) hx).symm + +/-- On its reflection cell, the constructed weak gradient agrees pointwise +with the global mixed Hessian-row representative. -/ +theorem cubeDirichletOddReflectionGradientCoordCellH1Function_grad_eq_global_of_mem + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + (H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i).grad x = + cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y j ↦ H.hess i j y) x := by + change + cubeDirichletOddReflectionHessianRowCellVectorField Q choice i + (fun y j ↦ H.hess i j y) x = + cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y j ↦ H.hess i j y) x + exact + (cubeDirichletOddReflectionHessianRowVectorField_eq_cell_of_mem + Q choice i (fun y j ↦ H.hess i j y) hx).symm + +/-- The global mixed scalar and Hessian-row representatives satisfy the weak +gradient identity when both are restricted to one reflection cell. -/ +theorem cubeDirichletOddReflectionGradientCoord_hasWeakGradientOn_cell + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + HasWeakGradientOn + (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i)) + (cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y j ↦ H.hess i j y)) := by + intro j φ hφ hφ_supp hφ_sub + let cell : Set (Vec d) := + openCubeSet (cubeFaceReflectionCellCube Q choice) + let v := H.cubeDirichletOddReflectionGradientCoordCellH1Function choice i + have hweak := v.hasWeakGradient j φ hφ hφ_supp hφ_sub + calc + ∫ x in cell, + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i) x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = + ∫ x in cell, v x * (fderiv ℝ φ x) (basisVec j) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.grad y i) x * + (fderiv ℝ φ x) (basisVec j) = + v x * (fderiv ℝ φ x) (basisVec j) + apply congrArg (fun z : ℝ ↦ z * (fderiv ℝ φ x) (basisVec j)) + symm + simpa only [v] using + H.cubeDirichletOddReflectionGradientCoordCellH1Function_eq_global_of_mem + choice i hx + _ = -∫ x in cell, v.grad x j * φ x ∂MeasureTheory.volume := hweak + _ = -∫ x in cell, + cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y k ↦ H.hess i k y) x j * φ x + ∂MeasureTheory.volume := by + apply congrArg Neg.neg + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + v.grad x j * φ x = + cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y k ↦ H.hess i k y) x j * φ x + apply congrArg (fun z : ℝ ↦ z * φ x) + have hrow := + H.cubeDirichletOddReflectionGradientCoordCellH1Function_grad_eq_global_of_mem + choice i hx + simpa only [v] using congrArg (fun z : Vec d ↦ z j) hrow + +/-- The global mixed Hessian-row representative is potential on each +reflection cell. -/ +theorem cubeDirichletOddReflectionHessianRowVectorField_isPotentialOn_cell + {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (choice : Fin d → Fin 3) (i : Fin d) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeDirichletOddReflectionHessianRowVectorField Q i + (fun y j ↦ H.hess i j y)) := by + refine IsPotentialOn.congr_ae ?_ + (H.cubeDirichletOddReflectionHessianRowCellVectorField_isPotentialOn + choice i) + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] + with x hx + exact + (cubeDirichletOddReflectionHessianRowVectorField_eq_cell_of_mem + Q choice i (fun y j ↦ H.hess i j y) hx).symm + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowWeightedTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowWeightedTail.lean new file mode 100644 index 0000000000..eb0a5eb689 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionHessianRowWeightedTail.lean @@ -0,0 +1,129 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionHessianRowFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube + +/-! +# Square-weighted tails of reflected Hessian rows + +The mixed-parity reflection of a Hessian row has the same pointwise Euclidean +norm as the ordinary odd reflection of the source row. Consequently its +square-weighted level tail on an origin-cube parent is exactly the existing +odd-vector tail, with no new measure decomposition. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- The square-weighted Hessian-row tail on a centered parent is exactly +`3^d` copies of its source-row tail. -/ +theorem reflectedHessianRow_sqWeightedMeasure_parent_tail + {d : ℕ} {m : ℤ} (i : Fin d) (R : Vec d → Vec d) {a : ℝ} + (hR : AEStronglyMeasurable (fun x => HilbertVec.ofVec (R x)) + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)‖} ∩ + openCubeSet (originCube d (m + 1))) = + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x => HilbertVec.ofVec (R x)) volume + ({x | a < ‖HilbertVec.ofVec (R x)‖} ∩ + openCubeSet (originCube d m)) := by + let Hrow : Vec d → HilbertVec d := fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x) + let Hodd : Vec d → HilbertVec d := fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) R x) + have hnorm : ∀ x, ‖Hrow x‖ = ‖Hodd x‖ := by + intro x + exact + norm_hilbertVec_cubeDirichletOddReflectionHessianRowVectorField_eq_oddReflection + (originCube d m) i R x + have hmeasure : + sqWeightedMeasure Hrow volume = sqWeightedMeasure Hodd volume := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards with x + rw [hnorm x] + have htail : + {x | a < ‖Hrow x‖} = {x | a < ‖Hodd x‖} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [hnorm x] + change sqWeightedMeasure Hrow volume + ({x | a < ‖Hrow x‖} ∩ openCubeSet (originCube d (m + 1))) = _ + rw [hmeasure, htail] + exact + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + R hR + +/-- The Hessian-row tail on the half-scaled parent is bounded by the same +`3^d` source-row tail as the full reflected parent. -/ +theorem reflectedHessianRow_sqWeightedMeasure_innerHalf_tail_le + {d : ℕ} {m : ℤ} (i : Fin d) (R : Vec d → Vec d) {a : ℝ} + (hR : AEStronglyMeasurable (fun x => HilbertVec.ofVec (R x)) + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)‖} ∩ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) ≤ + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x => HilbertVec.ofVec (R x)) volume + ({x | a < ‖HilbertVec.ofVec (R x)‖} ∩ + openCubeSet (originCube d m)) := by + let Qp : TriadicCube d := originCube d (m + 1) + let Hrow : Vec d → HilbertVec d := fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x) + have hhalf : scaledOpenCubeSet Qp (1 / 2 : ℝ) ⊆ openCubeSet Qp := by + intro x hx + rw [← ball_cubeCenter_eq_openCubeSet] + have hxclosed : + x ∈ Metric.closedBall (cubeCenter Qp) + ((1 / 2 : ℝ) * cubeRadius Qp) := + scaledClosedCubeSet_subset_metricClosedBall Qp + (by norm_num : 0 ≤ (1 / 2 : ℝ)) (fun k => le_of_lt (hx k)) + exact Metric.closedBall_subset_ball (by + nlinarith [cubeRadius_pos Qp]) hxclosed + calc + sqWeightedMeasure Hrow volume + ({x | a < ‖Hrow x‖} ∩ scaledOpenCubeSet Qp (1 / 2 : ℝ)) ≤ + sqWeightedMeasure Hrow volume + ({x | a < ‖Hrow x‖} ∩ openCubeSet Qp) := by + exact measure_mono (Set.inter_subset_inter_right _ hhalf) + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x => HilbertVec.ofVec (R x)) volume + ({x | a < ‖HilbertVec.ofVec (R x)‖} ∩ + openCubeSet (originCube d m)) := by + simpa only [Hrow, Qp] using + reflectedHessianRow_sqWeightedMeasure_parent_tail + i R hR + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionScalarWeightedTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionScalarWeightedTail.lean new file mode 100644 index 0000000000..95e724be18 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionScalarWeightedTail.lean @@ -0,0 +1,226 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectionWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionScalarFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube + +/-! +# Square-weighted tails of reflected scalars + +Scalar odd reflection preserves square-weighted level tails up to the exact +`3^d` parent-volume factor. The proof embeds the scalar into one coordinate +of the existing reflected-vector API; the zero-dimensional case is direct. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +private theorem norm_cubeCoordinateFoldSign_scalarWeightedTail + {d : ℕ} (Q : TriadicCube d) (x : Vec d) (i : Fin d) : + ‖cubeCoordinateFoldSign Q x i‖ = 1 := by + apply (sq_eq_sq₀ (norm_nonneg _) zero_le_one).mp + rw [Real.norm_eq_abs, sq_abs, one_pow, pow_two, + cubeCoordinateFoldSign_mul_self] + +private theorem aestronglyMeasurable_hilbertVec_single + {α : Type*} [MeasurableSpace α] {d : ℕ} (i : Fin d) + {F : α → ℝ} {μ : Measure α} (hF : AEStronglyMeasurable F μ) : + AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (Pi.single i (F x))) μ := by + let L : ℝ →L[ℝ] HilbertVec d := + (HilbertVec.ofVecL d).comp + (ContinuousLinearMap.single ℝ (fun _ : Fin d ↦ ℝ) i) + have hL := L.continuous.comp_aestronglyMeasurable hF + simpa only [L, ContinuousLinearMap.comp_apply, + ContinuousLinearMap.single_apply, HilbertVec.ofVecL_apply] using hL + +private theorem norm_hilbertVec_single_eq + {d : ℕ} (i : Fin d) (t : ℝ) : + ‖HilbertVec.ofVec (Pi.single i t)‖ = ‖t‖ := by + exact PiLp.norm_single 2 (fun _ : Fin d ↦ ℝ) i t + +private theorem + norm_hilbertVec_cubeDirichletOddReflectionVectorField_single_eq_scalar + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + (x : Vec d) : + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField Q + (fun y ↦ Pi.single i (F y)) x)‖ = + ‖cubeDirichletOddReflectionScalar Q F x‖ := by + have hvector : + cubeDirichletOddReflectionVectorField Q + (fun y ↦ Pi.single i (F y)) x = + Pi.single i + (cubeCoordinateFoldSign Q x i * + cubeDirichletOddReflectionScalar Q F x) := by + ext j + by_cases hji : j = i + · subst j + simp only [cubeDirichletOddReflectionVectorField_apply, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul, + Pi.single_eq_same, cubeDirichletOddReflectionScalar_apply] + ring + · simp only [cubeDirichletOddReflectionVectorField_apply, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul, + Pi.single_eq_of_ne hji, mul_zero] + rw [hvector, norm_hilbertVec_single_eq, norm_mul, + norm_cubeCoordinateFoldSign_scalarWeightedTail, one_mul] + +private theorem openCubeSet_originCube_zero_eq_univ (m : ℤ) : + openCubeSet (originCube 0 m) = Set.univ := by + ext x + simp only [openCubeSet, Set.mem_ofPred_eq, Set.mem_univ, iff_true] + exact fun i ↦ Fin.elim0 i + +private theorem scaledOpenCubeSet_originCube_zero_eq_univ + (m : ℤ) (r : ℝ) : + scaledOpenCubeSet (originCube 0 m) r = Set.univ := by + ext x + simp only [scaledOpenCubeSet, Set.mem_ofPred_eq, Set.mem_univ, iff_true] + exact fun i ↦ Fin.elim0 i + +private theorem cubeDirichletOddReflectionScalar_originCube_zero + (m : ℤ) (F : Vec 0 → ℝ) : + cubeDirichletOddReflectionScalar (originCube 0 m) F = F := by + funext x + rw [cubeDirichletOddReflectionScalar_apply] + have hfold : cubeCoordinateFold (originCube 0 m) x = x := + Subsingleton.elim _ _ + rw [hfold] + have hsign : cubeDirichletOddReflectionSign (originCube 0 m) x = 1 := by + unfold cubeDirichletOddReflectionSign + apply Finset.prod_eq_one + intro i _ + exact Fin.elim0 i + rw [hsign, one_mul] + +/-- A square-weighted norm tail of the scalar Dirichlet odd reflection on a +centered parent cube is exactly `3^d` copies of its source-cube tail. -/ +theorem + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_tail + {d : ℕ} {m : ℤ} (F : Vec d → ℝ) {a : ℝ} + (hF : AEStronglyMeasurable F + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (cubeDirichletOddReflectionScalar (originCube d m) F) volume + ({x | a < ‖cubeDirichletOddReflectionScalar + (originCube d m) F x‖} ∩ openCubeSet (originCube d (m + 1))) = + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure F volume + ({x | a < ‖F x‖} ∩ openCubeSet (originCube d m)) := by + classical + by_cases hd : d = 0 + · subst d + simp only [cubeDirichletOddReflectionScalar_originCube_zero, + openCubeSet_originCube_zero_eq_univ, Set.inter_univ, pow_zero, one_mul] + · let i : Fin d := ⟨0, Nat.pos_of_ne_zero hd⟩ + let G : Vec d → Vec d := fun x ↦ Pi.single i (F x) + let Sref : Vec d → ℝ := + cubeDirichletOddReflectionScalar (originCube d m) F + let Vref : Vec d → HilbertVec d := fun x ↦ + HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + let Vsource : Vec d → HilbertVec d := + fun x ↦ HilbertVec.ofVec (G x) + have hG : AEStronglyMeasurable Vsource + (volume.restrict (openCubeSet (originCube d m))) := by + simpa only [Vsource, G] using + aestronglyMeasurable_hilbertVec_single i hF + have hsourceNorm : ∀ x, ‖Vsource x‖ = ‖F x‖ := by + intro x + exact norm_hilbertVec_single_eq i (F x) + have hreflectedNorm : ∀ x, ‖Vref x‖ = ‖Sref x‖ := by + intro x + exact + norm_hilbertVec_cubeDirichletOddReflectionVectorField_single_eq_scalar + (originCube d m) i F x + have hsourceMeasure : + sqWeightedMeasure Vsource volume = sqWeightedMeasure F volume := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards with x + rw [hsourceNorm x] + have hreflectedMeasure : + sqWeightedMeasure Vref volume = sqWeightedMeasure Sref volume := by + apply MeasureTheory.withDensity_congr_ae + filter_upwards with x + rw [hreflectedNorm x] + have hsourceTail : + {x | a < ‖Vsource x‖} = {x | a < ‖F x‖} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [hsourceNorm x] + have hreflectedTail : + {x | a < ‖Vref x‖} = {x | a < ‖Sref x‖} := by + ext x + simp only [Set.mem_ofPred_eq] + rw [hreflectedNorm x] + have hvector := + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + G hG (a := a) + change sqWeightedMeasure Sref volume + ({x | a < ‖Sref x‖} ∩ openCubeSet (originCube d (m + 1))) = _ + rw [← hreflectedMeasure, ← hreflectedTail, + ← hsourceMeasure, ← hsourceTail] + exact hvector + +/-- The square-weighted scalar-reflection tail on the half-scaled parent is +bounded by the exact `3^d` source-cube tail. -/ +theorem + sqWeightedMeasure_innerHalf_succ_originCube_cubeDirichletOddReflectionScalar_tail_le + {d : ℕ} {m : ℤ} (F : Vec d → ℝ) {a : ℝ} + (hF : AEStronglyMeasurable F + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (cubeDirichletOddReflectionScalar (originCube d m) F) volume + ({x | a < ‖cubeDirichletOddReflectionScalar + (originCube d m) F x‖} ∩ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) ≤ + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure F volume + ({x | a < ‖F x‖} ∩ openCubeSet (originCube d m)) := by + let Qp : TriadicCube d := originCube d (m + 1) + let Sref : Vec d → ℝ := + cubeDirichletOddReflectionScalar (originCube d m) F + have hhalf : scaledOpenCubeSet Qp (1 / 2 : ℝ) ⊆ openCubeSet Qp := by + intro x hx + rw [← ball_cubeCenter_eq_openCubeSet] + have hxclosed : + x ∈ Metric.closedBall (cubeCenter Qp) + ((1 / 2 : ℝ) * cubeRadius Qp) := + scaledClosedCubeSet_subset_metricClosedBall Qp + (by norm_num : 0 ≤ (1 / 2 : ℝ)) (fun i ↦ le_of_lt (hx i)) + exact Metric.closedBall_subset_ball (by + nlinarith [cubeRadius_pos Qp]) hxclosed + calc + sqWeightedMeasure Sref volume + ({x | a < ‖Sref x‖} ∩ scaledOpenCubeSet Qp (1 / 2 : ℝ)) ≤ + sqWeightedMeasure Sref volume + ({x | a < ‖Sref x‖} ∩ openCubeSet Qp) := by + exact measure_mono (Set.inter_subset_inter_right _ hhalf) + _ = ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure F volume + ({x | a < ‖F x‖} ∩ openCubeSet (originCube d m)) := by + simpa only [Sref, Qp] using + sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_tail + F hF (a := a) + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionWeightedTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionWeightedTail.lean new file mode 100644 index 0000000000..b6f83dc285 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ReflectionWeightedTail.lean @@ -0,0 +1,126 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionFiniteP + +/-! +# Square-weighted tails under Dirichlet odd reflection + +The global good-`λ` argument works with the squared-density measure +`‖f‖² dx`. This file records that level tails of an odd-reflected +field on a centered parent cube are exactly `3^d` copies of the corresponding +tail on the source cube. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +private theorem lintegral_sqNorm_tail_inter_openCubeSet_eq + {d : ℕ} {F : Vec d → HilbertVec d} {Q : TriadicCube d} {a : ℝ} + (hF : AEStronglyMeasurable F (volume.restrict (openCubeSet Q))) : + ∫⁻ x in {x | a < ‖F x‖} ∩ openCubeSet Q, + ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume = + ∫⁻ x in openCubeSet Q, + (if a < ‖F x‖ then ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) else 0) + ∂volume := by + let T : Set (Vec d) := {x | a < ‖F x‖} + have hQ : MeasurableSet (openCubeSet Q) := measurableSet_openCubeSet Q + have hTQ : NullMeasurableSet (T ∩ openCubeSet Q) volume := by + apply (nullMeasurableSet_restrict hQ.nullMeasurableSet).mp + simpa [T] using aestronglyMeasurable_const.nullMeasurableSet_lt hF.norm + calc + ∫⁻ x in {x | a < ‖F x‖} ∩ openCubeSet Q, + ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume = + ∫⁻ x, (T ∩ openCubeSet Q).indicator + (fun x => ENNReal.ofReal (‖F x‖ ^ (2 : ℕ))) x ∂volume := by + simpa only [T] using + (MeasureTheory.lintegral_indicator₀ hTQ + (fun x => ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)))).symm + _ = ∫⁻ x, (openCubeSet Q).indicator + (fun x => if a < ‖F x‖ then ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) else 0) x + ∂volume := by + congr 1 + funext x + by_cases hxQ : x ∈ openCubeSet Q + · by_cases hxT : x ∈ T + · have hxTQ : x ∈ T ∩ openCubeSet Q := ⟨hxT, hxQ⟩ + rw [Set.indicator_of_mem hxTQ, + Set.indicator_of_mem hxQ, + if_pos (by simpa [T] using hxT)] + · rw [Set.indicator_of_notMem (fun h => hxT h.1), + Set.indicator_of_mem hxQ, + if_neg (by simpa [T] using hxT)] + · rw [Set.indicator_of_notMem (fun h => hxQ h.2), + Set.indicator_of_notMem hxQ] + _ = ∫⁻ x in openCubeSet Q, + (if a < ‖F x‖ then ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) else 0) + ∂volume := MeasureTheory.lintegral_indicator hQ _ + +/-- A square-weighted norm tail of the Dirichlet odd reflection on a centered +parent cube is exactly `3^d` copies of the source-cube tail. -/ +theorem sqWeightedMeasure_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_tail + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) {a : ℝ} + (hG : AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (volume.restrict (openCubeSet (originCube d m)))) : + sqWeightedMeasure + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) volume + ({x | a < ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)‖} ∩ + openCubeSet (originCube d (m + 1))) = + ((3 : ℝ≥0∞) ^ d) * + sqWeightedMeasure (fun x => HilbertVec.ofVec (G x)) volume + ({x | a < ‖HilbertVec.ofVec (G x)‖} ∩ openCubeSet (originCube d m)) := by + let F : Vec d → HilbertVec d := fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + let S : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (G x) + let P : TriadicCube d := originCube d (m + 1) + let Q : TriadicCube d := originCube d m + let Φ : ℝ → ℝ≥0∞ := fun t => + if a < t then ENNReal.ofReal (t ^ (2 : ℕ)) else 0 + have hF : AEStronglyMeasurable F (volume.restrict (openCubeSet P)) := by + simpa only [F, P, Q] using + aestronglyMeasurable_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + hG + have htailF : NullMeasurableSet ({x | a < ‖F x‖} ∩ openCubeSet P) volume := by + apply (nullMeasurableSet_restrict (measurableSet_openCubeSet P).nullMeasurableSet).mp + simpa using aestronglyMeasurable_const.nullMeasurableSet_lt hF.norm + have htailS : NullMeasurableSet ({x | a < ‖S x‖} ∩ openCubeSet Q) volume := by + apply (nullMeasurableSet_restrict (measurableSet_openCubeSet Q).nullMeasurableSet).mp + simpa only [S, Q] using aestronglyMeasurable_const.nullMeasurableSet_lt hG.norm + rw [sqWeightedMeasure_apply₀ F htailF, sqWeightedMeasure_apply₀ S htailS] + calc + ∫⁻ x in {x | a < ‖F x‖} ∩ openCubeSet P, + ENNReal.ofReal (‖F x‖ ^ (2 : ℕ)) ∂volume = + ∫⁻ x in openCubeSet P, Φ ‖F x‖ ∂volume := by + simpa only [Φ] using lintegral_sqNorm_tail_inter_openCubeSet_eq hF + _ = ((3 : ℝ≥0∞) ^ d) * + ∫⁻ x in openCubeSet Q, Φ ‖S x‖ ∂volume := by + simpa only [F, S, P, Q] using + lintegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_comp_norm + G Φ + _ = ((3 : ℝ≥0∞) ^ d) * + ∫⁻ x in {x | a < ‖S x‖} ∩ openCubeSet Q, + ENNReal.ofReal (‖S x‖ ^ (2 : ℕ)) ∂volume := by + rw [lintegral_sqNorm_tail_inter_openCubeSet_eq hG] + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarDivergenceGradientW1p.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarDivergenceGradientW1p.lean new file mode 100644 index 0000000000..b619c54372 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarDivergenceGradientW1p.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.CubeVector +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 + +/-! +# Paired-witness scalar divergence gradient endpoint + +This internal bridge converts synchronized `H¹` and `W^{1,q}` vector +representatives into the `W^{1,q}` gradient endpoint supplied by the scalar +Poisson Hessian estimate. The `H¹` witness supplies the `L²` divergence and +the integration-by-parts identity; the `W^{1,q}` witness supplies the finite +exponent control. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private def vectorW1pDivergence {d : ℕ} {Q : TriadicCube d} + {q : FiniteLpExponent} (G : CubeVectorW1pFunction Q q) : Vec d → ℝ := + fun x ↦ ∑ i : Fin d, G.jacobian x i i + +private theorem vectorW1pDivergence_memLp + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (G : CubeVectorW1pFunction Q q) : + MemLp (vectorW1pDivergence G) q.exponent (normalizedCubeMeasure Q) := by + apply MeasureTheory.memLp_finsetSum + intro i _hi + have hmatrix := G.jacobianHilbertMemLp + rw [MeasureTheory.memLp_piLp_iff] at hmatrix + have hrow := hmatrix i + rw [MeasureTheory.memLp_piLp_iff] at hrow + simpa only [vectorW1pDivergence, Function.comp_apply, HilbertMat.ofMat, + HilbertVec.ofVec, PiLp.toLp_apply] using hrow i + +private theorem norm_jacobian_diag_le + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (G : CubeVectorW1pFunction Q q) (i : Fin d) (x : Vec d) : + ‖G.jacobian x i i‖ ≤ ‖HilbertMat.ofMat (G.jacobian x)‖ := by + calc + ‖G.jacobian x i i‖ ≤ + ‖(HilbertMat.ofMat (G.jacobian x) : HilbertMat d).ofLp i‖ := by + simpa only [HilbertMat.ofMat, HilbertVec.ofVec, PiLp.toLp_apply] using + PiLp.norm_apply_le + ((HilbertMat.ofMat (G.jacobian x) : HilbertMat d).ofLp i) i + _ ≤ ‖HilbertMat.ofMat (G.jacobian x)‖ := + PiLp.norm_apply_le (HilbertMat.ofMat (G.jacobian x) : HilbertMat d) i + +private theorem eLpNorm_vectorW1pDivergence_le_dimension_mul_jacobian + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (G : CubeVectorW1pFunction Q q) : + eLpNorm (vectorW1pDivergence G) q.exponent (normalizedCubeMeasure Q) ≤ + d * eLpNorm (fun x ↦ HilbertMat.ofMat (G.jacobian x)) q.exponent + (normalizedCubeMeasure Q) := by + have hdiag : ∀ i : Fin d, + MemLp (fun x ↦ G.jacobian x i i) q.exponent + (normalizedCubeMeasure Q) := by + intro i + have hmatrix := G.jacobianHilbertMemLp + rw [MeasureTheory.memLp_piLp_iff] at hmatrix + have hrow := hmatrix i + rw [MeasureTheory.memLp_piLp_iff] at hrow + simpa only [Function.comp_apply, HilbertMat.ofMat, HilbertVec.ofVec, + PiLp.toLp_apply] using hrow i + have hdiag_le : ∀ i : Fin d, + eLpNorm (fun x ↦ G.jacobian x i i) q.exponent + (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x ↦ HilbertMat.ofMat (G.jacobian x)) q.exponent + (normalizedCubeMeasure Q) := by + intro i + apply MeasureTheory.eLpNorm_mono_ae + exact Filter.Eventually.of_forall fun x ↦ norm_jacobian_diag_le G i x + calc + eLpNorm (vectorW1pDivergence G) q.exponent (normalizedCubeMeasure Q) = + eLpNorm (∑ i : Fin d, fun x ↦ G.jacobian x i i) q.exponent + (normalizedCubeMeasure Q) := by + apply congrArg (fun f : Vec d → ℝ ↦ + eLpNorm f q.exponent (normalizedCubeMeasure Q)) + funext x + simp only [vectorW1pDivergence, Finset.sum_apply] + _ ≤ ∑ i : Fin d, eLpNorm (fun x ↦ G.jacobian x i i) q.exponent + (normalizedCubeMeasure Q) := by + exact MeasureTheory.eLpNorm_sum_le + (fun i _hi ↦ (hdiag i).aestronglyMeasurable) q.one_lt.le + _ ≤ ∑ _i : Fin d, eLpNorm (fun x ↦ HilbertMat.ofMat (G.jacobian x)) + q.exponent (normalizedCubeMeasure Q) := + Finset.sum_le_sum fun i _hi ↦ hdiag_le i + _ = d * eLpNorm (fun x ↦ HilbertMat.ofMat (G.jacobian x)) q.exponent + (normalizedCubeMeasure Q) := by + simp only [Finset.sum_const, Finset.card_fin, nsmul_eq_mul] + +/-- Internal paired-witness `W^{1,q}` endpoint for the gradient of a scalar +Dirichlet divergence solution. The paired `H¹` witness is used only to supply +the `L²` forcing and weak integration by parts required by the scalar Hessian +endpoint. -/ +theorem exists_cubeVectorW1p_scalarDivergence_cz_of_paired + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) + (G2 : CubeVectorH1Function (originCube d m)) + (Gq : CubeVectorW1pFunction (originCube d m) q), + G2.toField = Gq.toField → + (∀ (x : Vec d) (i j : Fin d), (G2.coord i).grad x j = Gq.jacobian x i j) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletDivergenceProblem (originCube d m) u G2.toField → + ∃ V : CubeVectorW1pFunction (originCube d m) q, + V.toField = u.toH1Function.grad ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x ↦ HilbertMat.ofMat (Gq.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C0, hC0top, hC0⟩ := + exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le d q + refine ⟨C0 * d, lt_top_iff_ne_top.mpr + (ENNReal.mul_ne_top hC0top.ne (ENNReal.natCast_ne_top d)), ?_⟩ + intro m G2 Gq hfield hjac u hdiv + let Q : TriadicCube d := originCube d m + have hdiv_eq : G2.divergence = vectorW1pDivergence Gq := by + funext x + unfold CubeVectorH1Function.divergence vectorW1pDivergence + apply Finset.sum_congr rfl + intro i _hi + exact hjac x i i + have hdivq : CubeDirichletDivergenceProblem Q u Gq.toField := by + simpa only [Q, hfield] using hdiv + have hpoisson : CubeDirichletWeakPoissonProblem Q u G2.divergence := by + intro phi + calc + ∫ x in openCubeSet Q, + vecDot (u.toH1Function.grad x) (phi.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet Q, + vecDot (Gq.toField x) (phi.toH1Function.grad x) ∂volume := + hdivq phi + _ = -∫ x in openCubeSet Q, + vecDot (G2.toField x) (phi.toH1Function.grad x) ∂volume := by + rw [hfield] + _ = ∫ x in openCubeSet Q, G2.divergence x * phi.toH1Function x ∂volume := + (G2.integral_divergence_mul_zeroTrace_eq_neg_integral_vecDot phi).symm + have hF2 : MemLp G2.divergence 2 (normalizedCubeMeasure Q) := + G2.divergence_memLp_normalizedCubeMeasure + have hFq : MemLp G2.divergence q.exponent (normalizedCubeMeasure Q) := by + rw [hdiv_eq] + exact vectorW1pDivergence_memLp Gq + obtain ⟨H, hHmem, hHbound⟩ := hC0 m G2.divergence hF2 hFq u (by + simpa only [Q] using hpoisson) + have hrows : ∀ i : Fin d, + MemLp (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure Q) := by + rw [MeasureTheory.memLp_piLp_iff] at hHmem + intro i + simpa only [Function.comp_apply, HilbertMat.ofMat, HilbertVec.ofVec, + PiLp.toLp_apply] using hHmem i + let V : CubeVectorW1pFunction Q q := CubeVectorW1pFunction.ofWeakHessian H hrows + refine ⟨V, ?_, ?_⟩ + · simp only [V, CubeVectorW1pFunction.ofWeakHessian_toField] + · have hdivbound : + eLpNorm G2.divergence q.exponent (normalizedCubeMeasure Q) ≤ + d * eLpNorm (fun x ↦ HilbertMat.ofMat (Gq.jacobian x)) q.exponent + (normalizedCubeMeasure Q) := by + rw [hdiv_eq] + exact eLpNorm_vectorW1pDivergence_le_dimension_mul_jacobian Gq + calc + eLpNorm (fun x ↦ HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure Q) = + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure Q) := by + simp only [V, CubeVectorW1pFunction.ofWeakHessian_jacobian] + _ ≤ C0 * eLpNorm G2.divergence q.exponent (normalizedCubeMeasure Q) := hHbound + _ ≤ C0 * + (d * eLpNorm (fun x ↦ HilbertMat.ofMat (Gq.jacobian x)) q.exponent + (normalizedCubeMeasure Q)) := by + gcongr + _ = (C0 * d) * eLpNorm (fun x ↦ HilbertMat.ofMat (Gq.jacobian x)) q.exponent + (normalizedCubeMeasure Q) := by ring + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonGradientBelowTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonGradientBelowTwo.lean new file mode 100644 index 0000000000..ce70b25ca4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonGradientBelowTwo.lean @@ -0,0 +1,770 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H10GradientUpgrade + +/-! +# Scalar Poisson gradient estimates below the energy exponent + +This file proves the centered-cube `L^q` gradient estimate for a zero-trace +solution of the scalar Poisson equation when `1 < q < 2`. The proof uses +self-adjoint duality against the already-established divergence-form +Calderón--Zygmund estimate at the conjugate exponent. + +Both functions in the mutual-testing step belong to `H¹₀`; no boundary +trace of a gradient coordinate is asserted or used. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Pointwise + +noncomputable section + +namespace CubeCalderonZygmund + +namespace ScalarPoissonGradientBelowTwo + +private theorem normalizedVolume_zero_eq_volumeMeasureOn_openCubeSet + (d : ℕ) : + (centeredCubeDomain d 0).normalizedVolume = + volumeMeasureOn (openCubeSet (originCube d 0)) := by + unfold centeredCubeDomain + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simp only [cubeVolume, cubeScaleFactor_originCube, zpow_zero, one_pow, + inv_one, ENNReal.ofReal_one, one_smul, volumeMeasureOn] + +private theorem castH10Function_apply {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) (x : Vec d) : + (hUV ▸ u).toH1Function.toFun x = u.toH1Function.toFun x := by + subst V + rfl + +private theorem castH10Function_grad {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) (x : Vec d) : + (hUV ▸ u).toH1Function.grad x = u.toH1Function.grad x := by + subst V + rfl + +private theorem centeredOpenCube_eq_smul_unitCenteredOpenCube + {d : ℕ} (m : ℤ) : + openCubeSet (originCube d m) = + centeredCubeScale m • openCubeSet (originCube d 0) := by + simpa only [centeredCubeScale, cubeScaleFactor_originCube] using + openCubeSet_originCube_eq_smul_originCube_zero (d := d) m + +/-- The normalized pullback of an `H¹₀` function from a centered cube to +the centered unit cube. Its gradient is the unscaled physical gradient. -/ +private noncomputable def centeredCubeH10Pullback {d : ℕ} {m : ℤ} + (v : H10Function (openCubeSet (originCube d m))) : + H10Function (openCubeSet (originCube d 0)) := + (centeredCubeScale m)⁻¹ • H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ v) + +@[simp] private theorem centeredCubeH10Pullback_apply {d : ℕ} {m : ℤ} + (v : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + centeredCubeH10Pullback v x = + (centeredCubeScale m)⁻¹ * v (centeredCubeScale m • x) := by + unfold centeredCubeH10Pullback + change (centeredCubeScale m)⁻¹ * + (H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ v)).toH1Function.toFun x = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_toFun] + rw [castH10Function_apply] + +@[simp] private theorem centeredCubeH10Pullback_grad {d : ℕ} {m : ℤ} + (v : H10Function (openCubeSet (originCube d m))) (x : Vec d) : + (centeredCubeH10Pullback v).toH1Function.grad x = + v.toH1Function.grad (centeredCubeScale m • x) := by + unfold centeredCubeH10Pullback + change (centeredCubeScale m)⁻¹ • + (H10Function.unscale (centeredCubeScale_pos m) + (centeredOpenCube_eq_smul_unitCenteredOpenCube m ▸ v)).toH1Function.grad x = _ + rw [H10Function.unscale_toH1Function, H1Function.unscale_grad] + rw [castH10Function_grad] + ext i + simp only [Pi.smul_apply, smul_eq_mul] + field_simp [centeredCubeScale_ne_zero m] + +private theorem eLpNorm_centeredCubeH10Pullback_toFun + {d : ℕ} {m : ℤ} (p : ℝ≥0∞) + (v : H10Function (openCubeSet (originCube d m))) + (hv : AEStronglyMeasurable v.toH1Function.toFun + (centeredCubeDomain d m).normalizedVolume) : + eLpNorm (centeredCubeH10Pullback v).toH1Function.toFun p + (centeredCubeDomain d 0).normalizedVolume = + ENNReal.ofReal (centeredCubeScale m)⁻¹ * + eLpNorm v.toH1Function.toFun p + (centeredCubeDomain d m).normalizedVolume := by + have hcomp := eLpNorm_comp_measurePreserving (p := p) hv + (centeredCubeDilationMeasurePreserving (d := d) m) + rw [show (centeredCubeH10Pullback v).toH1Function.toFun = + (centeredCubeScale m)⁻¹ • + (v.toH1Function.toFun ∘ centeredCubeDilation m) by + funext x + simp only [Pi.smul_apply, smul_eq_mul, Function.comp_apply, + centeredCubeDilation, centeredCubeH10Pullback_apply]] + rw [eLpNorm_const_smul, hcomp] + rw [Real.enorm_eq_ofReal (inv_nonneg.mpr (centeredCubeScale_pos m).le)] + +private theorem eLpNorm_centeredCubeH10Pullback_grad + {d : ℕ} {m : ℤ} (p : ℝ≥0∞) + (v : H10Function (openCubeSet (originCube d m))) + (hv : MemLp (hilbertifyVecField v.toH1Function.grad) p + (centeredCubeDomain d m).normalizedVolume) : + eLpNorm (hilbertifyVecField (centeredCubeH10Pullback v).toH1Function.grad) p + (centeredCubeDomain d 0).normalizedVolume = + eLpNorm (hilbertifyVecField v.toH1Function.grad) p + (centeredCubeDomain d m).normalizedVolume := by + have hcomp := eLpNorm_comp_measurePreserving (p := p) hv.aestronglyMeasurable + (centeredCubeDilationMeasurePreserving (d := d) m) + rw [show hilbertifyVecField (centeredCubeH10Pullback v).toH1Function.grad = + hilbertifyVecField v.toH1Function.grad ∘ centeredCubeDilation m by + funext x + simp only [hilbertifyVecField, Function.comp_apply, centeredCubeDilation, + centeredCubeH10Pullback_grad]] + exact hcomp + +/-- Scale-correct normalized `L^p` Poincare control for an `H¹₀` function +on a centered cube, assuming the corresponding unit-cube `W¹ᵖ₀` estimate. -/ +theorem centeredCubeH10_value_eLpNorm_le_scale_mul_grad + {d : ℕ} [NeZero d] (p : FiniteLpExponent) + (Cp : ℝ) (hCp : 0 ≤ Cp) + (hPoincare : + ∀ w : W10pFunction (openCubeSet (originCube d 0)) p.exponent, + ENNReal.toReal (eLpNorm w.toFun p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + Cp * ∑ i : Fin d, ENNReal.toReal + (eLpNorm (fun x => w.grad x i) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0))))) + (m : ℤ) (v : H10Function (openCubeSet (originCube d m))) + (hvgrad : MemLp (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume) : + eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume ≤ + ENNReal.ofReal (Cp * d) * ENNReal.ofReal (centeredCubeScale m) * + eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume := by + let w : H10Function (openCubeSet (originCube d 0)) := centeredCubeH10Pullback v + have hwpull : MemLp (hilbertifyVecField w.toH1Function.grad) p.exponent + (centeredCubeDomain d 0).normalizedVolume := by + have hcomp := hvgrad.comp_measurePreserving + (centeredCubeDilationMeasurePreserving (d := d) m) + rw [show hilbertifyVecField w.toH1Function.grad = + hilbertifyVecField v.toH1Function.grad ∘ centeredCubeDilation m by + funext x + simp only [w, hilbertifyVecField, Function.comp_apply, centeredCubeDilation, + centeredCubeH10Pullback_grad]] + exact hcomp + rw [normalizedVolume_zero_eq_volumeMeasureOn_openCubeSet] at hwpull + have hwgrad : GradMemLpOn (openCubeSet (originCube d 0)) p.exponent + w.toH1Function.grad := by + intro i + have hi := hwpull.eval_piLp i + simpa only [hilbertifyVecField, HilbertVec.ofVec, PiLp.toLp_apply] using hi + let wp : W10pFunction (openCubeSet (originCube d 0)) p.exponent := + w.toW10pOfGradMemLp + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)) p hwgrad + have hunit := hPoincare wp + rw [show wp.toFun = w.toH1Function.toFun by + exact H10Function.toW10pOfGradMemLp_toFun _ _ _ _, + show wp.grad = w.toH1Function.grad by + exact H10Function.toW10pOfGradMemLp_grad _ _ _ _] at hunit + have hcoord : ∀ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => w.toH1Function.grad x i) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + ENNReal.toReal (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) := by + intro i + apply ENNReal.toReal_mono hwpull.eLpNorm_ne_top + exact coordinate_eLpNorm_le_euclidean + (volumeMeasureOn (openCubeSet (originCube d 0))) p w.toH1Function.grad i + have hsum : + ∑ i : Fin d, ENNReal.toReal + (eLpNorm (fun x => w.toH1Function.grad x i) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + d * ENNReal.toReal + (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) := by + calc + ∑ i : Fin d, ENNReal.toReal + (eLpNorm (fun x => w.toH1Function.grad x i) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + ∑ _i : Fin d, ENNReal.toReal + (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) := by + exact Finset.sum_le_sum fun i _ => hcoord i + _ = d * ENNReal.toReal + (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) := by + simp only [Finset.sum_const, Finset.card_univ, Fintype.card_fin, + nsmul_eq_mul] + have hunit' : + ENNReal.toReal (eLpNorm w.toH1Function.toFun p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + Cp * d * ENNReal.toReal + (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) := by + exact hunit.trans <| by + calc + Cp * ∑ i : Fin d, ENNReal.toReal + (eLpNorm (fun x => w.toH1Function.grad x i) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0)))) ≤ + Cp * (d * ENNReal.toReal + (eLpNorm (hilbertifyVecField w.toH1Function.grad) p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0))))) := + mul_le_mul_of_nonneg_left hsum hCp + _ = _ := by ring + have hvfunMeas : AEStronglyMeasurable v.toH1Function.toFun + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact v.toH1Function.memL2.aestronglyMeasurable.mono_ac + Measure.smul_absolutelyContinuous + have hvalueEq := eLpNorm_centeredCubeH10Pullback_toFun p.exponent v hvfunMeas + have hgradEq := eLpNorm_centeredCubeH10Pullback_grad p.exponent v hvgrad + rw [normalizedVolume_zero_eq_volumeMeasureOn_openCubeSet] at hvalueEq hgradEq + have hwfun : MemLp w.toH1Function.toFun p.exponent + (volumeMeasureOn (openCubeSet (originCube d 0))) := by + simpa only [wp, H10Function.toW10pOfGradMemLp_toFun] using wp.memLp + have hprodtop : ENNReal.ofReal (centeredCubeScale m)⁻¹ * + eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume ≠ ∞ := by + rw [← hvalueEq] + exact hwfun.eLpNorm_ne_top + have hvtop : eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume ≠ ∞ := by + intro hvtop + apply hprodtop + rw [hvtop, ENNReal.mul_top] + exact ENNReal.ofReal_ne_zero_iff.mpr (inv_pos.mpr (centeredCubeScale_pos m)) + rw [hvalueEq, hgradEq] at hunit' + have hrighttop : ENNReal.ofReal (Cp * d) * ENNReal.ofReal (centeredCubeScale m) * + eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume ≠ ∞ := + ENNReal.mul_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top) + hvgrad.eLpNorm_ne_top + apply (ENNReal.toReal_le_toReal hvtop hrighttop).mp + simpa only [ENNReal.toReal_mul, ENNReal.toReal_ofReal + (mul_nonneg hCp (Nat.cast_nonneg d)), + ENNReal.toReal_ofReal (centeredCubeScale_pos m).le] using + (show ENNReal.toReal + (eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume) ≤ + (Cp * d) * centeredCubeScale m * + ENNReal.toReal + (eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume) by + have hs := centeredCubeScale_pos m + have hcancel : (centeredCubeScale m)⁻¹ * centeredCubeScale m = 1 := + inv_mul_cancel₀ hs.ne' + have hunit'' := hunit' + rw [ENNReal.toReal_mul, + ENNReal.toReal_ofReal (inv_nonneg.mpr hs.le)] at hunit'' + calc + ENNReal.toReal + (eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume) = + centeredCubeScale m * + ((centeredCubeScale m)⁻¹ * ENNReal.toReal + (eLpNorm v.toH1Function.toFun p.exponent + (centeredCubeDomain d m).normalizedVolume)) := by + rw [← mul_assoc, mul_inv_cancel₀ hs.ne', one_mul] + _ ≤ centeredCubeScale m * + (Cp * d * ENNReal.toReal + (eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume)) := + mul_le_mul_of_nonneg_left hunit'' hs.le + _ = (Cp * d) * centeredCubeScale m * + ENNReal.toReal + (eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (centeredCubeDomain d m).normalizedVolume) := by ring) + +private theorem centeredCube_scalarPoisson_divergence_cross_pairing + {d : ℕ} (m : ℤ) {sigma0 : ℝ} + (u v : H10Function (openCubeSet (originCube d m))) + (F : Vec d → ℝ) (G : Vec d → Vec d) + (hu : ∀ phi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, F x * phi.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume) + (hv : ∀ phi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (G x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) : + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, F x * v.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume := by + have hsymm : + ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + have hneg : + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + ∫ x, F x * v.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume := by + calc + -(∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume) = + sigma0 * ∫ x, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := (hv u).symm + _ = sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (v.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by rw [hsymm] + _ = ∫ x, F x * v.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume := hu v + rw [neg_eq_iff_eq_neg] at hneg + calc + ∫ x, vecDot (u.toH1Function.grad x) (G x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, vecDot (G x) (u.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume := by + apply integral_congr_ae + filter_upwards with x + exact vecDot_comm _ _ + _ = _ := hneg + +private theorem abs_integral_mul_le_eLpNorm_toReal_mul + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {p r : ℝ≥0∞} [ENNReal.HolderConjugate p r] + {F G : α → ℝ} + (hF : MemLp F p μ) (hG : MemLp G r μ) + (hFG : Integrable (fun x => F x * G x) μ) : + |∫ x, F x * G x ∂μ| ≤ + (eLpNorm F p μ).toReal * (eLpNorm G r μ).toReal := by + let f : α → ℝ := fun x => F x * G x + have hfLp : MemLp f 1 μ := by + rw [memLp_one_iff_integrable] + exact hFG + have hnorm : ENNReal.ofReal |∫ x, f x ∂μ| ≤ eLpNorm f 1 μ := by + simpa only [Real.enorm_eq_ofReal_abs] using + (enorm_integral_le_lintegral_enorm (μ := μ) f).trans_eq + eLpNorm_one_eq_lintegral_enorm.symm + have hholder : eLpNorm f 1 μ ≤ eLpNorm F p μ * eLpNorm G r μ := by + simpa only [f, Pi.smul_apply, smul_eq_mul] using! + eLpNorm_smul_le_mul_eLpNorm hG.aestronglyMeasurable hF.aestronglyMeasurable + have hfirst := (ENNReal.toReal_le_toReal ENNReal.ofReal_ne_top + hfLp.eLpNorm_ne_top).mpr hnorm + have hright : eLpNorm F p μ * eLpNorm G r μ ≠ ∞ := + ENNReal.mul_ne_top hF.eLpNorm_ne_top hG.eLpNorm_ne_top + have hsecond := (ENNReal.toReal_le_toReal hfLp.eLpNorm_ne_top hright).mpr hholder + calc + |∫ x, F x * G x ∂μ| = ENNReal.toReal (ENNReal.ofReal |∫ x, f x ∂μ|) := by + rw [ENNReal.toReal_ofReal (abs_nonneg _)] + _ ≤ ENNReal.toReal (eLpNorm f 1 μ) := hfirst + _ ≤ ENNReal.toReal (eLpNorm F p μ * eLpNorm G r μ) := hsecond + _ = _ := ENNReal.toReal_mul + +private noncomputable def radialTruncationL2LpField + {d : ℕ} [NeZero d] (m : ℤ) (q : FiniteLpExponent) + (u : H10Function (openCubeSet (originCube d m))) (n : ℕ) : + CubeEuclideanL2LpField (originCube d m) q.conjugate := by + let U : Set (Vec d) := openCubeSet (originCube d m) + let F : Vec d → Vec d := u.toH1Function.grad + let G : Vec d → Vec d := INTERNAL.vectorRadialTruncation q.exponent.toReal n F + letI : IsFiniteMeasure (volumeMeasureOn U) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + have hFraw : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (volumeMeasureOn U) := by + simpa only [F, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hraw : MemLp (INTERNAL.hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (F x))) q.conjugate.exponent + (volumeMeasureOn U) := + INTERNAL.memLp_hilbertRadialTruncation hqone n hFraw + have hraw2 : MemLp (INTERNAL.hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (F x))) 2 (volumeMeasureOn U) := + INTERNAL.memLp_hilbertRadialTruncation hqone n hFraw + refine { toCubeEuclideanLpField := ⟨G, ?_⟩, euclideanMemL2 := ?_ } + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, INTERNAL.vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw.smul_measure ENNReal.ofReal_ne_top + · rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + simpa only [G, INTERNAL.vectorRadialTruncation, HilbertVec.ofVec_toVec] using + hraw2.smul_measure ENNReal.ofReal_ne_top + +private theorem radialTruncation_memVectorL2 + {d : ℕ} [NeZero d] (m : ℤ) (q : FiniteLpExponent) + (u : H10Function (openCubeSet (originCube d m))) (n : ℕ) : + MemVectorL2 (openCubeSet (originCube d m)) + (radialTruncationL2LpField m q u n).toField := by + let U : Set (Vec d) := openCubeSet (originCube d m) + let F : Vec d → Vec d := u.toH1Function.grad + let : IsFiniteMeasure (volumeMeasureOn U) := + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + have hFraw : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (volumeMeasureOn U) := by + simpa only [F, hilbertifyVecField] using! + (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).aestronglyMeasurable + have hqone : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + simpa only [radialTruncationL2LpField, F, + INTERNAL.vectorRadialTruncation, HilbertVec.ofVec_toVec] using + INTERNAL.memVectorL2_vectorRadialTruncation U hqone n F hFraw + +private theorem centeredCube_integrable_vecDot + {d : ℕ} (m : ℤ) {F G : Vec d → Vec d} + (hF : MemVectorL2 (openCubeSet (originCube d m)) F) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + Integrable (fun x => vecDot (F x) (G x)) + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (integrableOn_vecDot_of_memVectorL2 hF hG).smul_measure ENNReal.ofReal_ne_top + +private theorem centeredCube_memLp_gradient_two + {d : ℕ} {m : ℤ} (u : H10Function (openCubeSet (originCube d m))) : + MemLp (hilbertifyVecField u.toH1Function.grad) 2 + (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact (memHilbertVectorL2_hilbertifyVecField + u.toH1Function.grad_memVectorL2).smul_measure ENNReal.ofReal_ne_top + +private theorem centeredCube_memLp_value_two + {d : ℕ} {m : ℤ} (u : H10Function (openCubeSet (originCube d m))) : + MemLp u.toH1Function.toFun 2 (centeredCubeDomain d m).normalizedVolume := by + rw [show (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) by + change (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume = _ + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet]] + exact u.toH1Function.memL2.smul_measure ENNReal.ofReal_ne_top + +private theorem ofReal_vecDot_radialTruncation_eq_truncatedMoment + {α : Type*} {d : ℕ} {q : ℝ} (hq : 1 < q) (n : ℕ) + (F : α → Vec d) (x : α) : + ENNReal.ofReal (vecDot (F x) (INTERNAL.vectorRadialTruncation q n F x)) = + INTERNAL.truncatedMoment q n (fun y => HilbertVec.ofVec (F y)) x := by + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self hq n F] + by_cases hx : euclideanNorm (F x) ≤ (n : ℝ) + · have hx' : ‖HilbertVec.ofVec (F x)‖ ≤ (n : ℝ) := by + simpa only [euclideanNorm_eq_norm_ofVec] using hx + have hxmem : x ∈ {y | ‖HilbertVec.ofVec (F y)‖ ≤ (n : ℝ)} := hx' + rw [if_pos hx, INTERNAL.truncatedMoment, Set.indicator_of_mem hxmem] + rw [← ofReal_norm (HilbertVec.ofVec (F x))] + simpa only [euclideanNorm_eq_norm_ofVec] using + (ENNReal.ofReal_rpow_of_nonneg + (norm_nonneg (HilbertVec.ofVec (F x))) (by linarith : 0 ≤ q)).symm + · have hx' : ¬ ‖HilbertVec.ofVec (F x)‖ ≤ (n : ℝ) := by + simpa only [euclideanNorm_eq_norm_ofVec] using hx + have hxmem : x ∉ {y | ‖HilbertVec.ofVec (F y)‖ ≤ (n : ℝ)} := hx' + rw [if_neg hx, INTERNAL.truncatedMoment, Set.indicator_of_notMem hxmem] + exact ENNReal.ofReal_zero + +private theorem eLpNorm_radialTruncation_rpow_conjugate_eq_truncatedMoment + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + (q : FiniteLpExponent) (n : ℕ) (F : α → HilbertVec d) : + (eLpNorm (INTERNAL.hilbertRadialTruncation q.exponent.toReal n F) + q.conjugate.exponent μ) ^ q.conjugate.exponent.toReal = + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n F x ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) q.conjugate.lt_top.ne, + ← ENNReal.rpow_mul] + have hqzero : q.conjugate.exponent.toReal ≠ 0 := + (ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne).ne' + rw [one_div, inv_mul_cancel₀ hqzero, ENNReal.rpow_one] + apply lintegral_congr + intro x + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg, + INTERNAL.norm_hilbertRadialTruncation_rpow_conjugate] + by_cases hx : ‖F x‖ ≤ (n : ℝ) + · have hxmem : x ∈ {y | ‖F y‖ ≤ (n : ℝ)} := hx + rw [if_pos hx, INTERNAL.truncatedMoment, Set.indicator_of_mem hxmem, + ← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] + · have hxmem : x ∉ {y | ‖F y‖ ≤ (n : ℝ)} := hx + rw [if_neg hx, INTERNAL.truncatedMoment, Set.indicator_of_notMem hxmem] + exact ENNReal.ofReal_zero + +private theorem eLpNorm_le_of_truncated_cross_bound + {α : Type*} {d : ℕ} [MeasurableSpace α] {μ : Measure α} + {q : ℝ} {F : α → HilbertVec d} {A : ℝ≥0∞} + (hq : 1 < q) (hF : AEStronglyMeasurable F μ) + (htrunc : ∀ n : ℕ, + (∫⁻ x, INTERNAL.truncatedMoment q n F x ∂μ) ≠ ∞ ∧ + (∫⁻ x, INTERNAL.truncatedMoment q n F x ∂μ) ≤ + A * (∫⁻ x, INTERNAL.truncatedMoment q n F x ∂μ) ^ (1 - q⁻¹)) : + eLpNorm F (ENNReal.ofReal q) μ ≤ A := by + have root_le_of_le_mul_rpow : ∀ {J B : ℝ≥0∞}, J ≠ ∞ → + J ≤ B * J ^ (1 - q⁻¹) → J ≤ B ^ q := by + intro J B hJtop hJ + by_cases hJzero : J = 0 + · rw [hJzero] + exact bot_le + have hJpos : 0 < J := lt_of_le_of_ne bot_le (Ne.symm hJzero) + have he : 0 ≤ 1 - q⁻¹ := (sub_pos.mpr (inv_lt_one_of_one_lt₀ hq)).le + have hBpos : 0 < J ^ (1 - q⁻¹) := ENNReal.rpow_pos hJpos hJtop + have hBtop : J ^ (1 - q⁻¹) ≠ ∞ := ENNReal.rpow_ne_top_of_nonneg he hJtop + have hfac : J = J ^ (1 - q⁻¹) * J ^ q⁻¹ := by + rw [← ENNReal.rpow_add_of_nonneg _ _ he (inv_nonneg.mpr (by linarith : 0 ≤ q))] + rw [show (1 - q⁻¹) + q⁻¹ = 1 by ring, ENNReal.rpow_one] + have hroot : J ^ q⁻¹ ≤ B := by + apply (ENNReal.mul_le_mul_iff_left hBpos.ne' hBtop).mp + calc + J ^ q⁻¹ * J ^ (1 - q⁻¹) = J ^ (1 - q⁻¹) * J ^ q⁻¹ := mul_comm _ _ + _ = J := hfac.symm + _ ≤ B * J ^ (1 - q⁻¹) := hJ + calc + J = (J ^ q⁻¹) ^ q := by + rw [← ENNReal.rpow_mul, inv_mul_cancel₀ (by linarith : q ≠ 0), + ENNReal.rpow_one] + _ ≤ B ^ q := ENNReal.rpow_le_rpow hroot (by linarith) + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (ENNReal.ofReal_pos.mpr (by linarith : 0 < q)).ne' ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal (by linarith : 0 ≤ q)] + have hmoment : (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ≤ A ^ q := by + rw [INTERNAL.lintegral_enorm_rpow_eq_iSup_lintegral_truncatedMoment hF] + exact iSup_le fun n => root_le_of_le_mul_rpow (htrunc n).1 (htrunc n).2 + calc + (∫⁻ x, ‖F x‖ₑ ^ q ∂μ) ^ (1 / q) ≤ (A ^ q) ^ (1 / q) := + ENNReal.rpow_le_rpow hmoment (by positivity) + _ = A := by + rw [show (1 / q : ℝ) = q⁻¹ by ring, ← ENNReal.rpow_mul, + mul_inv_cancel₀ (by linarith : q ≠ 0), ENNReal.rpow_one] + +end ScalarPoissonGradientBelowTwo + +/-- Below the energy exponent, a supplied zero-trace solution of the scalar +Poisson equation on a centered cube has the scale-correct normalized `L^q` +gradient bound. The source is represented directly by a scalar field with +separate normalized `L²` and `L^q` membership. -/ +theorem centeredCubeH10ScalarPoisson_gradient_cz_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (sigma0 : ℝ) + (F : Vec d → ℝ) (u : H10Function (openCubeSet (originCube d m))), + MemLp F 2 (centeredCubeDomain d m).normalizedVolume → + MemLp F q.exponent (centeredCubeDomain d m).normalizedVolume → + 0 < sigma0 → + (∀ phi : H10Function (openCubeSet (originCube d m)), + sigma0 * ∫ x, vecDot (u.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, F x * phi.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume) → + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + u.toH1Function.grad ≤ + C * ENNReal.ofReal (cubeScaleFactor (originCube d m)) * + (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm F q.exponent (centeredCubeDomain d m).normalizedVolume := by + obtain ⟨Ccz, hCczTop, hCcz⟩ := centeredCubeH10ScalarDivergence_cz_of_two_lt d + q.conjugate (INTERNAL.conjugate_toReal_gt_two_of_lt_two q hq) + obtain ⟨Cp, hCp, hPoincare⟩ := + W10pFunction.exists_poincare_constant_of_isOpenBoundedConvexDomain + q.conjugate.one_lt q.conjugate.lt_top.ne + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)) + let P : ℝ≥0∞ := ENNReal.ofReal (Cp * d) + let C : ℝ≥0∞ := P * Ccz + have hPTop : P ≠ ∞ := ENNReal.ofReal_ne_top + have hCTop : C ≠ ∞ := ENNReal.mul_ne_top hPTop hCczTop.ne + refine ⟨C, hCTop.lt_top, ?_⟩ + intro m sigma0 F u hF2 hFq hsigma0 hu + let μ : Measure (Vec d) := (centeredCubeDomain d m).normalizedVolume + let Ugrad : Vec d → HilbertVec d := hilbertifyVecField u.toH1Function.grad + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hUtwo : MemLp Ugrad 2 μ := by + simpa only [Ugrad, μ] using + ScalarPoissonGradientBelowTwo.centeredCube_memLp_gradient_two u + have hUmeas : AEStronglyMeasurable Ugrad μ := hUtwo.aestronglyMeasurable + let A : ℝ≥0∞ := C * ENNReal.ofReal (cubeScaleFactor (originCube d m)) * + (ENNReal.ofReal sigma0)⁻¹ * eLpNorm F q.exponent μ + have hmain : eLpNorm Ugrad q.exponent μ ≤ A := by + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + apply ScalarPoissonGradientBelowTwo.eLpNorm_le_of_truncated_cross_bound + hqreal hUmeas + intro n + let Gfield := ScalarPoissonGradientBelowTwo.radialTruncationL2LpField m q u n + let G : Vec d → Vec d := Gfield.toField + have hGtwo : MemVectorL2 (openCubeSet (originCube d m)) G := by + simpa only [G, Gfield] using + ScalarPoissonGradientBelowTwo.radialTruncation_memVectorL2 m q u n + let v := openCubeSetScalarDivergenceSolution (originCube d m) hsigma0 G hGtwo + have hk : Integrable (fun x => vecDot (u.toH1Function.grad x) (G x)) μ := by + simpa only [μ] using ScalarPoissonGradientBelowTwo.centeredCube_integrable_vecDot m + u.toH1Function.grad_memVectorL2 hGtwo + have hk0 : 0 ≤ᵐ[μ] fun x => vecDot (u.toH1Function.grad x) (G x) := by + filter_upwards with x + change 0 ≤ vecDot (u.toH1Function.grad x) + (INTERNAL.vectorRadialTruncation q.exponent.toReal n u.toH1Function.grad x) + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self hqreal] + split_ifs + · exact Real.rpow_nonneg (euclideanNorm_nonneg _) _ + · exact le_rfl + have hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal + (vecDot (u.toH1Function.grad x) (G x)) = + INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x := by + filter_upwards with x + simpa only [Ugrad, G, Gfield] using! + ScalarPoissonGradientBelowTwo.ofReal_vecDot_radialTruncation_eq_truncatedMoment + hqreal n u.toH1Function.grad x + have hJ : (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ) = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := + INTERNAL.lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint + refine ⟨?_, ?_⟩ + · rw [hJ] + exact ENNReal.ofReal_ne_top + have hvsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 v + Gfield.toLpTwo := by + intro phi + simpa only [v, G, Gfield] using! + INTERNAL.openCubeSetScalarDivergenceSolution_normalized_weak + m hsigma0 G hGtwo phi + have hvCZ := hCcz m sigma0 Gfield v hsigma0 hvsolution + have hGq : MemLp (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [μ, G, Gfield, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + hilbertifyVecField] using! Gfield.euclideanMemLp + have hVtwo : MemLp (hilbertifyVecField v.toH1Function.grad) 2 μ := by + simpa only [v, μ] using + ScalarPoissonGradientBelowTwo.centeredCube_memLp_gradient_two v + have hVgradBound : eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ ≤ Ccz * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, μ, v, G, Gfield, hilbertifyVecField] using! hvCZ + have hVq : MemLp (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + refine ⟨hVtwo.aestronglyMeasurable, ?_⟩ + exact lt_of_le_of_lt hVgradBound <| ENNReal.mul_lt_top + (ENNReal.mul_lt_top hCczTop + (ENNReal.inv_lt_top.mpr (ENNReal.ofReal_pos.mpr hsigma0))) + hGq.eLpNorm_lt_top + have hVvalueBound : eLpNorm v.toH1Function.toFun q.conjugate.exponent μ ≤ + P * ENNReal.ofReal (centeredCubeScale m) * + eLpNorm (hilbertifyVecField v.toH1Function.grad) + q.conjugate.exponent μ := by + simpa only [P] using + ScalarPoissonGradientBelowTwo.centeredCubeH10_value_eLpNorm_le_scale_mul_grad + q.conjugate Cp hCp hPoincare m v hVq + have hVvalueTwo : MemLp v.toH1Function.toFun 2 μ := by + simpa only [v, μ] using + ScalarPoissonGradientBelowTwo.centeredCube_memLp_value_two v + have hVvalueQ : MemLp v.toH1Function.toFun q.conjugate.exponent μ := by + refine ⟨hVvalueTwo.aestronglyMeasurable, ?_⟩ + exact lt_of_le_of_lt hVvalueBound <| ENNReal.mul_lt_top + (ENNReal.mul_lt_top hPTop.lt_top ENNReal.ofReal_lt_top) + hVq.eLpNorm_lt_top + have hFV : Integrable (fun x => F x * v.toH1Function.toFun x) μ := by + rw [← memLp_one_iff_integrable] + exact hVvalueTwo.mul' hF2 + have hcross := + ScalarPoissonGradientBelowTwo.centeredCube_scalarPoisson_divergence_cross_pairing + m u v F G hu + (INTERNAL.openCubeSetScalarDivergenceSolution_normalized_weak + m hsigma0 G hGtwo) + have hholder := ScalarPoissonGradientBelowTwo.abs_integral_mul_le_eLpNorm_toReal_mul + hFq hVvalueQ hFV + have hGmoment : (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ) ^ + q.conjugate.exponent.toReal = + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ := by + simpa only [μ, Ugrad, G, Gfield, hilbertifyVecField] using! + ScalarPoissonGradientBelowTwo.eLpNorm_radialTruncation_rpow_conjugate_eq_truncatedMoment + q n Ugrad + have hreal : q.exponent.toReal.HolderConjugate + q.conjugate.exponent.toReal := ENNReal.HolderConjugate.toReal hqreal + have hexp : (q.conjugate.exponent.toReal)⁻¹ = + 1 - q.exponent.toReal⁻¹ := by + have hsum := hreal.one_div_add_one_div + rw [one_div] at hsum + norm_num at hsum + linarith + have hGnorm : eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + have hr0 : q.conjugate.exponent.toReal ≠ 0 := + (ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne).ne' + calc + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ = + (eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ ^ + q.conjugate.exponent.toReal) ^ (q.conjugate.exponent.toReal)⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hr0, ENNReal.rpow_one] + _ = (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ) ^ + (q.conjugate.exponent.toReal)⁻¹ := by rw [hGmoment] + _ = _ := by rw [hexp] + calc + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ = + ENNReal.ofReal (∫ x, vecDot (u.toH1Function.grad x) (G x) ∂μ) := hJ + _ = ENNReal.ofReal (-∫ x, F x * v.toH1Function.toFun x ∂μ) := by + rw [hcross] + _ ≤ ENNReal.ofReal |∫ x, F x * v.toH1Function.toFun x ∂μ| := + ENNReal.ofReal_le_ofReal (neg_le_abs _) + _ ≤ ENNReal.ofReal ((eLpNorm F q.exponent μ).toReal * + (eLpNorm v.toH1Function.toFun q.conjugate.exponent μ).toReal) := + ENNReal.ofReal_le_ofReal hholder + _ = eLpNorm F q.exponent μ * + eLpNorm v.toH1Function.toFun q.conjugate.exponent μ := by + rw [ENNReal.ofReal_mul ENNReal.toReal_nonneg, + ENNReal.ofReal_toReal hFq.eLpNorm_lt_top.ne, + ENNReal.ofReal_toReal hVvalueQ.eLpNorm_lt_top.ne] + _ ≤ eLpNorm F q.exponent μ * + (P * ENNReal.ofReal (centeredCubeScale m) * + (Ccz * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (hilbertifyVecField G) q.conjugate.exponent μ)) := by + gcongr + exact hVvalueBound.trans <| by gcongr + _ = A * (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Ugrad x ∂μ) ^ + (1 - q.exponent.toReal⁻¹) := by + rw [hGnorm] + dsimp only [A, C] + rw [cubeScaleFactor_originCube] + ac_rfl + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, Ugrad, μ, A] using! hmain + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessian.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessian.lean new file mode 100644 index 0000000000..c1d288bf7b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessian.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianAboveTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianTwo + +/-! +# Finite-exponent scalar Poisson Hessian estimates + +This module provides the common centered-cube scalar Poisson Hessian +Calderón--Zygmund estimate for every finite exponent. + +## Main results + +- `exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le`: the + normalized Hilbert-matrix Hessian estimate for scalar Dirichlet Poisson + solutions with data in `L² ∩ L^q`. + +## Implementation notes + +The proof selects the below-energy duality theorem, the energy theorem, or the +above-energy good-`λ` theorem according to the exponent. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +/-- The normalized finite-exponent Calderón--Zygmund Hessian estimate for +zero-trace scalar Poisson solutions on centered triadic cubes. -/ +theorem exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + by_cases hlt : q.exponent.toReal < 2 + · exact exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_of_lt_two d q hlt + by_cases hgt : 2 < q.exponent.toReal + · exact exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_of_two_lt d q hgt + have hreal : q.exponent.toReal = 2 := + le_antisymm (le_of_not_gt hgt) (le_of_not_gt hlt) + have hexp : q.exponent = 2 := by + apply (ENNReal.toReal_eq_toReal_iff' q.lt_top.ne (by norm_num)).mp + simpa only [ENNReal.toReal_ofNat] using hreal + have hq : q = FiniteLpExponent.two := by + cases q + simp only [FiniteLpExponent.two] at hexp ⊢ + cases hexp + rfl + subst q + obtain ⟨C, hCtop, hC⟩ := + exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_two d + refine ⟨C, hCtop, ?_⟩ + intro m F hF2 _ u hweak + simpa only [FiniteLpExponent.two_exponent] using hC m F hF2 u hweak + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianAboveTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianAboveTwo.lean new file mode 100644 index 0000000000..a2e43279ea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianAboveTwo.lean @@ -0,0 +1,718 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaIntegration +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaParameters +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedHessianRowOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EuclideanNormalized + +/-! +# Scalar Poisson Hessian estimates above the energy exponent + +This file integrates the source-facing one-level Hessian-row estimate. The +good-`lambda` parameters, weak Hessian, reflected problem, cutoff, and +low-level estimate are all chosen internally. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory Set + +private noncomputable def exponentSucc (q : FiniteLpExponent) : + FiniteLpExponent where + exponent := q.exponent + 1 + one_lt := lt_of_lt_of_le q.one_lt (le_add_of_nonneg_right bot_le) + lt_top := ENNReal.add_lt_top.mpr ⟨q.lt_top, by norm_num⟩ + +private theorem exponentSucc_toReal (q : FiniteLpExponent) : + (exponentSucc q).exponent.toReal = q.exponent.toReal + 1 := by + simp only [exponentSucc] + rw [ENNReal.toReal_add q.lt_top.ne ENNReal.one_ne_top] + norm_num + +private theorem exponent_lt_succ (q : FiniteLpExponent) : + q.exponent.toReal < (exponentSucc q).exponent.toReal := by + rw [exponentSucc_toReal] + linarith + +private theorem sqWeightedMeasure_restrict_apply_eq_inter + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {B T : Set α} {f : α → E} + (hB : MeasurableSet B) : + sqWeightedMeasure f (μ.restrict B) T = + sqWeightedMeasure f μ (T ∩ B) := by + change ((μ.restrict B).withDensity fun x ↦ + ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) T = + (μ.withDensity fun x ↦ ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) (T ∩ B) + rw [← MeasureTheory.restrict_withDensity hB] + exact Measure.restrict_apply' hB + +private theorem sqWeightedMeasure_smul_measure + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {c : ℝ≥0∞} {T : Set α} {f : α → E} : + sqWeightedMeasure f (c • μ) T = c * sqWeightedMeasure f μ T := by + unfold sqWeightedMeasure + rw [MeasureTheory.withDensity_smul_measure] + rfl + +private theorem sqWeightedMeasure_univ_ne_top_of_memLp_two + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {f : α → E} (hf : MemLp f 2 μ) : + sqWeightedMeasure f μ Set.univ ≠ ∞ := by + rw [sqWeightedMeasure_apply_univ_eq_eLpNorm_two_sq] + exact ENNReal.pow_ne_top hf.eLpNorm_ne_top + +private theorem lintegral_divided_moment_ne_top + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {q : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MemLp f q.exponent μ) : + (∫⁻ x, ENNReal.ofReal + (‖f x‖ ^ q.exponent.toReal / a ^ (q.exponent.toReal - 2)) ∂μ) ≠ ∞ := by + let b : ℝ := a ^ (q.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x ↦ ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow + aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (q.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas] + exact ENNReal.mul_ne_top + (ENNReal.inv_ne_top.2 (ENNReal.ofReal_ne_zero_iff.mpr hb)) + (by + simpa only [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) + ENNReal.toReal_nonneg] using + (MeasureTheory.lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne + hf.eLpNorm_lt_top).ne) + +private theorem eLpNorm_rpow_eq_lintegral_ofReal_norm_rpow + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} (q : FiniteLpExponent) (f : α → E) : + (eLpNorm f q.exponent μ) ^ q.exponent.toReal = + ∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (zero_lt_one.trans q.one_lt)) q.lt_top.ne, + ← ENNReal.rpow_mul] + have hq0 : q.exponent.toReal ≠ 0 := + (ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.one_lt)) + q.lt_top.ne).ne' + rw [one_div, inv_mul_cancel₀ hq0, ENNReal.rpow_one] + apply MeasureTheory.lintegral_congr + intro x + rw [← ofReal_norm, + ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) ENNReal.toReal_nonneg] + +private theorem divided_moment_eq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {q : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) (hf : MemLp f q.exponent μ) : + ∫⁻ x, ENNReal.ofReal + (‖f x‖ ^ q.exponent.toReal / a ^ (q.exponent.toReal - 2)) ∂μ = + (ENNReal.ofReal (a ^ (q.exponent.toReal - 2)))⁻¹ * + (eLpNorm f q.exponent μ) ^ q.exponent.toReal := by + let b : ℝ := a ^ (q.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / b) = + (ENNReal.ofReal b)⁻¹ * + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) := by + rw [div_eq_mul_inv, mul_comm, ENNReal.ofReal_mul + (inv_nonneg.mpr hb.le), ENNReal.ofReal_inv_of_pos hb] + have hmeas : AEMeasurable + (fun x ↦ ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal)) μ := + (hf.aestronglyMeasurable.norm.aemeasurable.pow + aemeasurable_const).ennreal_ofReal + simp_rw [show a ^ (q.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul'' _ hmeas, + ← eLpNorm_rpow_eq_lintegral_ofReal_norm_rpow q f] + +private theorem lintegral_norm_rpow_eq_mul_divided_moment + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} {q : FiniteLpExponent} {a : ℝ} {f : α → E} + (ha : 0 < a) : + (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) ∂μ) = + ENNReal.ofReal (a ^ (q.exponent.toReal - 2)) * + ∫⁻ x, ENNReal.ofReal + (‖f x‖ ^ q.exponent.toReal / + a ^ (q.exponent.toReal - 2)) ∂μ := by + let b : ℝ := a ^ (q.exponent.toReal - 2) + have hb : 0 < b := Real.rpow_pos_of_pos ha _ + have hpoint (x : α) : + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) = + ENNReal.ofReal b * + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / b) := by + calc + ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal) = + ENNReal.ofReal + ((‖f x‖ ^ q.exponent.toReal / b) * b) := by + congr 1 + exact (div_mul_cancel₀ _ hb.ne').symm + _ = ENNReal.ofReal (‖f x‖ ^ q.exponent.toReal / b) * + ENNReal.ofReal b := + ENNReal.ofReal_mul + (div_nonneg (Real.rpow_nonneg (norm_nonneg _) _) hb.le) + _ = _ := mul_comm _ _ + simp_rw [show a ^ (q.exponent.toReal - 2) = b by rfl, hpoint] + rw [MeasureTheory.lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + +private theorem tail_norm_package + {p : ℝ} {cM D L B cdata X Y Jf Jg low : ℝ≥0∞} + (hp : 0 < p) + (hJf : X ^ p = cM * Jf) + (hJg : Jg = cdata⁻¹ * Y ^ p) + (htail : Jf ≤ (low + B * Jg) / D) + (hlow : low ≤ L * Y ^ p) : + X ≤ (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + have hpow : X ^ p ≤ + (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p := by + calc + X ^ p = cM * Jf := hJf + _ ≤ cM * ((low + B * Jg) / D) := mul_le_mul_right htail _ + _ ≤ cM * ((L * Y ^ p + B * (cdata⁻¹ * Y ^ p)) / D) := by + apply mul_le_mul_right + apply ENNReal.div_le_div_right + apply add_le_add hlow + exact mul_le_mul_right (le_of_eq hJg) _ + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p := by + rw [ENNReal.div_eq_inv_mul] + ring + have hp0 : p ≠ 0 := hp.ne' + calc + X = X ^ (p * p⁻¹) := by rw [mul_inv_cancel₀ hp0, ENNReal.rpow_one] + _ = (X ^ p) ^ p⁻¹ := ENNReal.rpow_mul _ _ _ + _ ≤ ((cM * D⁻¹ * (L + B * cdata⁻¹)) * Y ^ p) ^ p⁻¹ := + ENNReal.rpow_le_rpow hpow (inv_nonneg.mpr hp.le) + _ = (cM * D⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ * Y := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hp.le), + ← ENNReal.rpow_mul, mul_inv_cancel₀ hp0, ENNReal.rpow_one] + +private theorem exists_parameters + {d : ℕ} [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ (depth : ℕ) (G : INTERNAL.HarmonicEuclideanGradientGain d + (exponentSucc q) depth) (M eps : ℝ), + 1 < M ∧ 0 < eps ∧ eps ≤ 1 ∧ + (((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ + (2 - (exponentSucc q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ)))) * + ENNReal.ofReal ((2 * M) ^ (q.exponent.toReal - 2)) < 1 := by + obtain ⟨⟨depth, G⟩⟩ := + INTERNAL.nonempty_harmonicEuclideanGradientGain_finiteTarget_of_pos d + (Nat.pos_of_ne_zero (NeZero.ne d)) (exponentSucc q) + let K : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * oneStoppingBallCoefficient depth G + have hK : K ≠ ∞ := ENNReal.mul_ne_top + (ENNReal.pow_ne_top (by norm_num)) (oneStoppingBallCoefficient_ne_top G) + obtain ⟨M, eps, hM, heps, heps_one, hsmall⟩ := + INTERNAL.exists_strict_goodLambda_parameters hK hq (exponent_lt_succ q) + exact ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ + +private theorem normalized_l2_le_lq + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + {F : Vec d → ℝ} (hq : 2 < q.exponent.toReal) + (hFq : MemLp F q.exponent (normalizedCubeMeasure Q)) : + eLpNorm F 2 (normalizedCubeMeasure Q) ≤ + eLpNorm F q.exponent (normalizedCubeMeasure Q) := by + let : IsProbabilityMeasure (normalizedCubeMeasure Q) := + ⟨normalizedCubeMeasure_apply_univ Q⟩ + apply eLpNorm_le_eLpNorm_of_exponent_le _ hFq.aestronglyMeasurable + apply le_of_lt + apply (ENNReal.toReal_lt_toReal (a := (2 : ℝ≥0∞)) + (b := q.exponent) (by norm_num) q.lt_top.ne).mp + simpa using hq + +private theorem sourceCutoff_le_normalizedLq + {d : ℕ} [NeZero d] {q : FiniteLpExponent} {m : ℤ} + (depth : ℕ) {eps : ℝ} (hq : 2 < q.exponent.toReal) + {F : Vec d → ℝ} + (hF2 : MemLp F 2 (normalizedCubeMeasure (originCube d m))) + (hFq : MemLp F q.exponent (normalizedCubeMeasure (originCube d m))) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (hH : H.hessianCoordL2NormSum ≤ + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact + (originCube d m) * cubeLpNorm (originCube d m) 2 F) : + reflectedHessianRowGoodLambdaCutoff depth eps H F ≤ + Real.sqrt (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ))) * + (eLpNorm F q.exponent + (normalizedCubeMeasure (originCube d m))).toReal := by + let Q : TriadicCube d := originCube d m + let V : ℝ := cubeVolume Q + let N₂ : ℝ := (eLpNorm F 2 (normalizedCubeMeasure Q)).toReal + let Nq : ℝ := (eLpNorm F q.exponent (normalizedCubeMeasure Q)).toReal + let C₂ : ℝ := + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d + have hN : N₂ ≤ Nq := by + apply ENNReal.toReal_mono hFq.eLpNorm_ne_top + exact normalized_l2_le_lq hq hFq + have hHscale : H.hessianCoordL2NormSum ≤ V ^ (1 / 2 : ℝ) * C₂ * N₂ := by + simpa only [Q, V, C₂, N₂, cubeLpNorm, + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact] + using hH + have hFopen := memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF2 + have hFint : ∫ x in openCubeSet Q, F x * F x ∂volume = V * N₂ ^ (2 : ℕ) := by + have hsq := toReal_eLpNorm_two_sq_eq_integral_sq hFopen + have hnorm := norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two Q hF2 + rw [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] at hnorm + have hfun : (fun x => F x * F x) = fun x => F x ^ (2 : ℕ) := by + funext x + ring + rw [hfun, ← hsq] + rw [hnorm] + have hV : 0 ≤ V := cubeVolume_nonneg Q + rw [mul_pow] + rw [show (V ^ (1 / 2 : ℝ)) ^ (2 : ℕ) = V by + rw [← Real.rpow_natCast, ← Real.rpow_mul hV] + norm_num] + simp only [N₂, cubeLpNorm] + have hVpos : 0 < V := cubeVolume_pos Q + have hgeo : + (((2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹) * + (3 : ℝ) ^ d * V = + ((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d := by + rw [show 2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth)) = + cubeScaleFactor Q / (10 * (3 : ℝ) ^ depth) by + calc + 2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth)) = + (2 * cubeRadius Q) / (10 * (3 : ℝ) ^ depth) := by ring + _ = cubeScaleFactor Q / (10 * (3 : ℝ) ^ depth) := by + rw [cubeScaleFactor_eq_two_mul_cubeRadius Q]] + change ((cubeScaleFactor Q / (10 * (3 : ℝ) ^ depth)) ^ d)⁻¹ * + (3 : ℝ) ^ d * cubeVolume Q = _ + rw [cubeVolume_eq_scaleFactor_pow] + rw [← inv_pow, inv_div] + calc + (10 * 3 ^ depth / cubeScaleFactor Q) ^ d * 3 ^ d * + cubeScaleFactor Q ^ d = + ((10 * 3 ^ depth / cubeScaleFactor Q) * 3 * + cubeScaleFactor Q) ^ d := by + rw [mul_pow, mul_pow] + _ = (3 * (10 * 3 ^ depth)) ^ d := by + congr 1 + have hs : cubeScaleFactor Q ≠ 0 := by + rw [cubeScaleFactor_eq_two_mul_cubeRadius] + exact mul_ne_zero (by norm_num) (cubeRadius_pos Q).ne' + field_simp [hs] + have hinside : + (((2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹) * + ((3 : ℝ) ^ d * H.hessianCoordL2NormSum ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + ∫ x in openCubeSet Q, F x * F x ∂volume) ≤ + (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (C₂ ^ (2 : ℕ) + (eps⁻¹) ^ (2 : ℕ))) * Nq ^ (2 : ℕ) := by + have hfac : 0 ≤ + (((2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹) := by + apply inv_nonneg.mpr + apply pow_nonneg + exact mul_nonneg (by norm_num) + (div_nonneg (cubeRadius_pos Q).le (by positivity)) + have hHsq : H.hessianCoordL2NormSum ^ (2 : ℕ) ≤ + V * C₂ ^ (2 : ℕ) * Nq ^ (2 : ℕ) := by + have hC : 0 ≤ C₂ := + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d + calc + H.hessianCoordL2NormSum ^ (2 : ℕ) ≤ + (V ^ (1 / 2 : ℝ) * C₂ * N₂) ^ (2 : ℕ) := + pow_le_pow_left₀ H.hessianCoordL2NormSum_nonneg hHscale 2 + _ = V * C₂ ^ (2 : ℕ) * N₂ ^ (2 : ℕ) := by + rw [mul_pow, mul_pow] + rw [show (V ^ (1 / 2 : ℝ)) ^ (2 : ℕ) = V by + rw [← Real.rpow_natCast, ← Real.rpow_mul hVpos.le] + norm_num] + _ ≤ V * C₂ ^ (2 : ℕ) * Nq ^ (2 : ℕ) := by + gcongr + rw [hFint] + calc + _ ≤ (((2 * (cubeRadius Q / (10 * (3 : ℝ) ^ depth))) ^ d)⁻¹) * + ((3 : ℝ) ^ d * (V * C₂ ^ (2 : ℕ) * Nq ^ (2 : ℕ)) + + (eps⁻¹) ^ (2 : ℕ) * (3 : ℝ) ^ d * + (V * Nq ^ (2 : ℕ))) := by + gcongr + _ = _ := by + rw [← hgeo] + ring + change Real.sqrt _ ≤ _ + apply (Real.sqrt_le_iff).2 + constructor + · positivity + · calc + _ ≤ (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (C₂ ^ (2 : ℕ) + (eps⁻¹) ^ (2 : ℕ))) * Nq ^ (2 : ℕ) := + hinside + _ = (Real.sqrt (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (C₂ ^ (2 : ℕ) + (eps⁻¹) ^ (2 : ℕ))) * Nq) ^ (2 : ℕ) := by + symm + calc + (Real.sqrt (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (C₂ ^ (2 : ℕ) + (eps⁻¹) ^ (2 : ℕ))) * Nq) ^ (2 : ℕ) = + (Real.sqrt (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (C₂ ^ (2 : ℕ) + (eps⁻¹) ^ (2 : ℕ)))) ^ (2 : ℕ) * + Nq ^ (2 : ℕ) := by ring + _ = _ := by + rw [Real.sq_sqrt (by positivity)] + +private theorem finite_coefficient_ne_top + {p : ℝ} {cM rho L B cdata : ℝ≥0∞} + (hp : 0 < p) (hcM : cM ≠ ∞) (hrho : rho < 1) (hL : L ≠ ∞) + (hB : B ≠ ∞) (hcdata : cdata ≠ 0) : + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ p⁻¹ ≠ ∞ := by + apply ENNReal.rpow_ne_top_of_nonneg (inv_nonneg.mpr hp.le) + apply ENNReal.mul_ne_top + · exact ENNReal.mul_ne_top hcM + (ENNReal.inv_ne_top.mpr (ne_of_gt (tsub_pos_iff_lt.mpr hrho))) + · exact ENNReal.add_ne_top.mpr + ⟨hL, ENNReal.mul_ne_top hB (ENNReal.inv_ne_top.mpr hcdata)⟩ + +/-- Above the energy exponent, scalar Dirichlet Poisson data have a weak +Hessian whose full Hilbert-matrix normalized `L^q` norm is controlled by the +normalized scalar datum norm, uniformly over the centered-cube scale. -/ +theorem exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_of_two_lt + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : 2 < q.exponent.toReal) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn + (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨depth, G, M, eps, hM, heps, heps_one, hsmall⟩ := + exists_parameters (d := d) q hq + let theta : ℝ≥0∞ := ((3 : ℝ≥0∞) ^ d) * + oneStoppingBallCoefficient depth G * + (ENNReal.ofReal ((M / 2) ^ + (2 - (exponentSucc q).exponent.toReal)) + + ENNReal.ofReal (eps ^ (2 : ℕ))) + let B : ℝ≥0∞ := theta * ENNReal.ofReal ((eps⁻¹) ^ (2 : ℕ)) + let cM : ℝ≥0∞ := ENNReal.ofReal (M ^ (q.exponent.toReal - 2)) + let cdata : ℝ≥0∞ := ENNReal.ofReal + ((eps / 2) ^ (q.exponent.toReal - 2)) + let rho : ℝ≥0∞ := theta * ENNReal.ofReal + ((2 * M) ^ (q.exponent.toReal - 2)) + let Ccut : ℝ := Real.sqrt + (((3 : ℝ) * (10 * (3 : ℝ) ^ depth)) ^ d * + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ) + + (eps⁻¹) ^ (2 : ℕ))) + let L : ℝ≥0∞ := ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ)) * + (ENNReal.ofReal (2 * Ccut)) ^ (q.exponent.toReal - 2) + let Crow : ℝ≥0∞ := + (cM * (1 - rho)⁻¹ * (L + B * cdata⁻¹)) ^ + (q.exponent.toReal)⁻¹ + let C : ℝ≥0∞ := d * Crow + have hp : 0 < q.exponent.toReal := by linarith + have htheta : theta ≠ ∞ := by + dsimp only [theta] + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (oneStoppingBallCoefficient_ne_top G)) + (ENNReal.add_ne_top.mpr ⟨ENNReal.ofReal_ne_top, ENNReal.ofReal_ne_top⟩) + have hBtop : B ≠ ∞ := + ENNReal.mul_ne_top htheta ENNReal.ofReal_ne_top + have hCdata : cdata ≠ 0 := by + dsimp only [cdata] + exact (ENNReal.ofReal_pos.mpr + (Real.rpow_pos_of_pos (by linarith) _)).ne' + have hCrow : Crow ≠ ∞ := by + apply finite_coefficient_ne_top hp ENNReal.ofReal_ne_top + · simpa only [rho, theta] using hsmall + · dsimp only [L] + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top + (ENNReal.rpow_ne_top_of_nonneg (by linarith) ENNReal.ofReal_ne_top) + · exact hBtop + · exact hCdata + refine ⟨C, lt_top_iff_ne_top.mpr + (ENNReal.mul_ne_top (ENNReal.natCast_ne_top d) hCrow), ?_⟩ + intro m F hF2 hFq u hweak + obtain ⟨H, hH, htail⟩ := + exists_hasWeakHessianOn_sqWeightedMeasure_oneLevel_tail_originCube + G (hq.trans (exponent_lt_succ q)) heps heps_one hM.le F hF2 u hweak + let Q : TriadicCube d := originCube d m + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let row : Fin d → Vec d → HilbertVec d := fun i x ↦ + HilbertVec.ofVec (fun j ↦ H.hess i j x) + let Y : ℝ≥0∞ := eLpNorm F q.exponent μ + have hrows : ∀ i : Fin d, MemLp (row i) q.exponent μ ∧ + eLpNorm (row i) q.exponent μ ≤ Crow * Y := by + intro i + have hrow2 : MemLp (row i) 2 μ := by + simpa only [row, Q, μ] using! + H.hessianHilbertRow_memLp_two_normalizedCubeMeasure Q i + have hrowMeas : AEStronglyMeasurable (row i) μ := + hrow2.aestronglyMeasurable + have hFMeas : AEStronglyMeasurable F μ := by + simpa only [μ, Q] using hFq.aestronglyMeasurable + by_cases hYzero : Y = 0 + · have hFae : F =ᵐ[μ] 0 := + (eLpNorm_eq_zero_iff hFq.aestronglyMeasurable + (ne_of_gt (zero_lt_one.trans q.one_lt))).mp (by + simpa only [Y, μ] using hYzero) + have hF2zero : eLpNorm F 2 μ = 0 := + eLpNorm_eq_zero_of_ae_zero hFae + have hrow2norm : eLpNorm (row i) 2 μ = 0 := by + apply le_zero_iff.mp + calc + eLpNorm (row i) 2 μ ≤ ENNReal.ofReal + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum) := by + simpa only [row] using! + H.eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le Q i + _ ≤ 0 := by + have hN2 : cubeLpNorm Q 2 F = 0 := by + simpa only [cubeLpNorm, μ] using! + congrArg ENNReal.toReal hF2zero + rw [hN2, mul_zero] at hH + have hHzero := le_antisymm hH H.hessianCoordL2NormSum_nonneg + rw [hHzero, mul_zero, ENNReal.ofReal_zero] + have hrowAe : row i =ᵐ[μ] 0 := + (eLpNorm_eq_zero_iff hrow2.aestronglyMeasurable (by norm_num)).mp + hrow2norm + have hrowq : MemLp (row i) q.exponent μ := + MemLp.zero'.ae_eq hrowAe.symm + refine ⟨hrowq, ?_⟩ + rw [eLpNorm_eq_zero_of_ae_zero hrowAe, hYzero, mul_zero] + · have hYpos : 0 < Y.toReal := + ENNReal.toReal_pos hYzero (by simpa only [Y, μ] using hFq.eLpNorm_ne_top) + have hcut := sourceCutoff_le_normalizedLq (eps := eps) + depth hq hF2 hFq H hH + have hCcut : 0 < Ccut := by + dsimp only [Ccut] + positivity + let lambda0 : ℝ := + reflectedHessianRowGoodLambdaCutoff depth eps H F + Ccut * Y.toReal + have hlambda : 0 < lambda0 := by + dsimp only [lambda0] + exact add_pos_of_nonneg_of_pos + (reflectedHessianRowGoodLambdaCutoff_nonneg depth eps H F) + (mul_pos hCcut hYpos) + have hcutoff : + reflectedHessianRowGoodLambdaCutoff depth eps H F < lambda0 := by + dsimp only [lambda0] + exact lt_add_of_pos_right _ (mul_pos hCcut hYpos) + have hlambdaBound : lambda0 ≤ 2 * Ccut * Y.toReal := by + dsimp only [lambda0] + have hcut' : reflectedHessianRowGoodLambdaCutoff depth eps H F ≤ + Ccut * Y.toReal := by + simpa only [Q, μ, Y, Ccut] using hcut + nlinarith + have htailNorm : ∀ t, lambda0 ≤ t → + sqWeightedMeasure (row i) μ {x | M * t < ‖row i x‖} ≤ + theta * sqWeightedMeasure (row i) μ + {x | t / 2 < ‖row i x‖} + + B * sqWeightedMeasure F μ {x | eps * t / 2 < ‖F x‖} := by + intro t ht + have hraw := htail i t (hcutoff.trans_le ht) + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have hc : c ≠ 0 := (ENNReal.ofReal_pos.mpr + (inv_pos.mpr (cubeVolume_pos Q))).ne' + have hscaled := mul_le_mul_right hraw c + simpa only [Q, μ, row, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + sqWeightedMeasure_smul_measure, + sqWeightedMeasure_restrict_apply_eq_inter + (measurableSet_openCubeSet Q), theta, B, mul_add, mul_assoc, + mul_left_comm, mul_comm] using! hscaled + have hBfinite : B ≠ ∞ := hBtop + have hintegrated := lp_le_of_oneLevel_weighted_tail + hrowMeas hFMeas hq (by linarith) (by linarith) heps hlambda + (sqWeightedMeasure_univ_ne_top_of_memLp_two hrow2) hBfinite + (lintegral_divided_moment_ne_top (by linarith) hFq) + (by simpa only [rho, theta] using hsmall) htailNorm + let Jrow : ℝ≥0∞ := ∫⁻ x, ENNReal.ofReal + (‖row i x‖ ^ q.exponent.toReal / + M ^ (q.exponent.toReal - 2)) ∂μ + let JF : ℝ≥0∞ := ∫⁻ x, ENNReal.ofReal + (‖F x‖ ^ q.exponent.toReal / + (eps / 2) ^ (q.exponent.toReal - 2)) ∂μ + let low : ℝ≥0∞ := sqWeightedMeasure (row i) μ Set.univ * + ENNReal.ofReal (lambda0 ^ (q.exponent.toReal - 2)) + have hlow : low ≤ L * Y ^ q.exponent.toReal := by + have hS : sqWeightedMeasure (row i) μ Set.univ ≤ + ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ)) * + Y ^ (2 : ℕ) := by + rw [sqWeightedMeasure_apply_univ_eq_eLpNorm_two_sq] + have hrowL2 := + H.eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le Q i + have hHnorm : ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum ≤ + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d * + (eLpNorm F 2 μ).toReal := by + have hscale := hH + rw [CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact] + at hscale + have hscale' : H.hessianCoordL2NormSum ≤ + cubeVolume Q ^ (1 / 2 : ℝ) * + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d * + cubeLpNorm Q 2 F := by + simpa only [Q] using hscale + have hcancel : ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + cubeVolume Q ^ (1 / 2 : ℝ) = 1 := by + rw [Real.inv_rpow (cubeVolume_nonneg Q)] + exact inv_mul_cancel₀ + (Real.rpow_pos_of_pos (cubeVolume_pos Q) _).ne' + calc + _ ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (cubeVolume Q ^ (1 / 2 : ℝ) * + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d * + cubeLpNorm Q 2 F) := + mul_le_mul_of_nonneg_left hscale' + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + _ = _ := by + calc + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (cubeVolume Q ^ (1 / 2 : ℝ) * + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d * + cubeLpNorm Q 2 F) = + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + cubeVolume Q ^ (1 / 2 : ℝ)) * + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d * + cubeLpNorm Q 2 F) := by ring + _ = _ := by rw [hcancel, one_mul, cubeLpNorm] + have hN2q : (eLpNorm F 2 μ).toReal ≤ Y.toReal := by + apply ENNReal.toReal_mono + (by simpa only [Y, μ] using hFq.eLpNorm_ne_top) + simpa only [Y, μ] using normalized_l2_le_lq hq hFq + have hreal : ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum ≤ + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d * Y.toReal := + hHnorm.trans (mul_le_mul_of_nonneg_left hN2q + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d)) + calc + eLpNorm (row i) 2 μ ^ (2 : ℕ) ≤ + ENNReal.ofReal + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum) ^ (2 : ℕ) := by + exact pow_le_pow_left₀ bot_le hrowL2 2 + _ ≤ ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d * + Y.toReal) ^ (2 : ℕ) := by + have hleft : 0 ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum := + mul_nonneg (Real.rpow_nonneg (inv_nonneg.mpr + (cubeVolume_nonneg Q)) _) H.hessianCoordL2NormSum_nonneg + rw [← ENNReal.ofReal_pow hleft] + rw [← ENNReal.ofReal_pow (mul_nonneg + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d) + ENNReal.toReal_nonneg)] + exact ENNReal.ofReal_le_ofReal + (pow_le_pow_left₀ hleft hreal 2) + _ = _ := by + rw [ENNReal.ofReal_mul + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d), + ENNReal.ofReal_toReal + (by simpa only [Y, μ] using hFq.eLpNorm_ne_top), mul_pow, + ← ENNReal.ofReal_pow + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d)] + have hlamENN : ENNReal.ofReal lambda0 ≤ + ENNReal.ofReal (2 * Ccut) * Y := by + calc + ENNReal.ofReal lambda0 ≤ ENNReal.ofReal (2 * Ccut * Y.toReal) := + ENNReal.ofReal_le_ofReal hlambdaBound + _ = ENNReal.ofReal (2 * Ccut) * Y := by + rw [ENNReal.ofReal_mul (by positivity), + ENNReal.ofReal_toReal + (by simpa only [Y, μ] using hFq.eLpNorm_ne_top)] + have he : 0 ≤ q.exponent.toReal - 2 := by linarith + dsimp only [low, L] + rw [← ENNReal.ofReal_rpow_of_nonneg hlambda.le he] + calc + sqWeightedMeasure (row i) μ Set.univ * + (ENNReal.ofReal lambda0) ^ (q.exponent.toReal - 2) ≤ + (ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ)) * + Y ^ (2 : ℕ)) * + (ENNReal.ofReal (2 * Ccut) * Y) ^ + (q.exponent.toReal - 2) := + mul_le_mul hS (ENNReal.rpow_le_rpow hlamENN he) bot_le bot_le + _ = ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ)) * + (ENNReal.ofReal (2 * Ccut)) ^ (q.exponent.toReal - 2) * + Y ^ q.exponent.toReal := by + rw [ENNReal.mul_rpow_of_nonneg _ _ he] + calc + _ = ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact + d ^ (2 : ℕ)) * + (ENNReal.ofReal (2 * Ccut)) ^ (q.exponent.toReal - 2) * + (Y ^ (2 : ℕ) * Y ^ (q.exponent.toReal - 2)) := by ring + _ = _ := by + rw [← ENNReal.rpow_natCast, + ← ENNReal.rpow_add_of_nonneg _ _ (by norm_num) he] + congr 3 + ring + have hJrow : (eLpNorm (row i) q.exponent μ) ^ q.exponent.toReal = + cM * Jrow := by + dsimp only [cM, Jrow] + rw [eLpNorm_rpow_eq_lintegral_ofReal_norm_rpow] + have hMpos : 0 < M := by linarith + exact lintegral_norm_rpow_eq_mul_divided_moment hMpos + have hJF : JF = cdata⁻¹ * Y ^ q.exponent.toReal := by + simpa only [JF, cdata, Y] using divided_moment_eq (by linarith) hFq + have hbound : eLpNorm (row i) q.exponent μ ≤ Crow * Y := by + apply tail_norm_package hp hJrow hJF + · simpa only [Jrow, JF, low, theta, B, rho] using hintegrated + · exact hlow + have hrowq : MemLp (row i) q.exponent μ := + ⟨hrowMeas, hbound.trans_lt (ENNReal.mul_lt_top + (lt_top_iff_ne_top.mpr hCrow) + (by simpa only [Y, μ] using hFq.eLpNorm_lt_top))⟩ + exact ⟨hrowq, hbound⟩ + have hrowsMem : ∀ i, MemLp (row i) q.exponent μ := fun i ↦ (hrows i).1 + refine ⟨H, H.hessianHilbertMat_memLp_normalizedCubeMeasure_of_rows + Q q (by simpa only [row, μ] using hrowsMem), ?_⟩ + calc + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent μ ≤ + ∑ i : Fin d, eLpNorm (row i) q.exponent μ := by + simpa only [row] using + H.eLpNorm_hessianHilbertMat_normalizedCubeMeasure_le_sum_rows + Q q (by simpa only [row, μ] using hrowsMem) + _ ≤ ∑ _i : Fin d, Crow * Y := Finset.sum_le_sum fun i _ ↦ (hrows i).2 + _ = C * Y := by simp only [Finset.sum_const, Finset.card_fin, nsmul_eq_mul, C]; ring + _ = C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := rfl + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianBelowTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianBelowTwo.lean new file mode 100644 index 0000000000..56332ee0d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianBelowTwo.lean @@ -0,0 +1,2741 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonGradientBelowTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.W10pWeakTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentInteriorHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedParentHessianRowIdentification +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ReflectedHessianRowOneLevelTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarPoissonHessianTwo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.H1CutoffIntegrationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.SourceParentFiniteLpExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianRowL2Energy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroExtensionGraph + +/-! +# Scalar Poisson Hessian estimates below the energy exponent + +The endpoint is obtained by localized duality on the odd-reflected parent +cube. The small utility below is intentionally kept here: it is the exact +bridge used when a compactly supported `H¹₀` multiplier must be inserted into +the smooth-test divergence identity. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem weak_divergence_identity_of_h10 + {d : ℕ} {U : Set (Vec d)} [IsFiniteMeasure (volume.restrict U)] + (w : H1Function U) (h : Vec d → Vec d) (hh : MemVectorL2 U h) + (sigma0 : ℝ) + (hweak : ∀ phi : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) phi → + HasCompactSupport phi → tsupport phi ⊆ U → + sigma0 * ∫ x in U, vecDot (w.grad x) (euclideanGradient phi x) ∂volume = + -∫ x in U, vecDot (h x) (euclideanGradient phi x) ∂volume) + (v : H10Function U) : + sigma0 * ∫ x in U, vecDot (w.grad x) (v.toH1Function.grad x) ∂volume = + -∫ x in U, vecDot (h x) (v.toH1Function.grad x) ∂volume := by + simpa only [H10Function.toW10pOfExponentLETwo_grad] using! + weak_divergence_identity_of_w10p FiniteLpExponent.two le_rfl w h hh sigma0 + hweak (v.toW10pOfExponentLETwo FiniteLpExponent.two le_rfl) + +private theorem parent_adjoint_gradient_cz + (d : ℕ) [NeZero d] (p : FiniteLpExponent) + (hp : 2 < p.exponent.toReal) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) + (h : CubeEuclideanL2LpField (originCube d m) p), + let hP := sourceParentFiniteLpExtension m p h + let v := openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m p h) + (centeredCubeDomain d (m + 1)).normalizedEuclideanLpENorm p.exponent + v.toH1Function.grad ≤ + C * (centeredCubeDomain d m).normalizedEuclideanLpENorm p.exponent + h.toField := by + obtain ⟨C, hCtop, hC⟩ := centeredCubeH10ScalarDivergence_cz_of_two_lt d p hp + refine ⟨C, hCtop, ?_⟩ + intro m h + let hP := sourceParentFiniteLpExtension m p h + let v := openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m p h) + have hv : IsCenteredCubeH10ScalarDivergenceSolution (m + 1) 1 v hP.toLpTwo := by + intro psi + simpa only [v] using! INTERNAL.openCubeSetScalarDivergenceSolution_normalized_weak + (m + 1) (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m p h) psi + have hbound := hC (m + 1) 1 hP v (by norm_num) hv + calc + (centeredCubeDomain d (m + 1)).normalizedEuclideanLpENorm p.exponent + v.toH1Function.grad ≤ + C * (ENNReal.ofReal (1 : ℝ))⁻¹ * + (centeredCubeDomain d (m + 1)).normalizedEuclideanLpENorm p.exponent + hP.toField := hbound + _ = C * eLpNorm (hilbertifyVecField hP.toField) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) := by + simp only [ENNReal.ofReal_one, inv_one, mul_one, + BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rfl + _ ≤ C * eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + gcongr + exact eLpNorm_sourceParentFiniteLpExtension_le m p h + _ = C * (centeredCubeDomain d m).normalizedEuclideanLpENorm p.exponent + h.toField := by + simp only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rfl + +/-- The adjoint parent solution has the high-exponent gradient estimate and, +by Poincaré, the value estimate needed by the lower-order cutoff terms. -/ +private theorem exists_parent_adjoint_value_bound + (d : ℕ) [NeZero d] (p : FiniteLpExponent) + (hp : 2 < p.exponent.toReal) : + ∃ (Ccz P : ℝ≥0∞), Ccz < ∞ ∧ P < ∞ ∧ ∀ (m : ℤ) + (h : CubeEuclideanL2LpField (originCube d m) p), + let hP := sourceParentFiniteLpExtension m p h + let v := openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m p h) + eLpNorm v.toH1Function.toFun p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * + eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + Ccz * eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + MemLp (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ∧ + MemLp v.toH1Function.toFun p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) := by + obtain ⟨Ccz, hCczTop, hCcz⟩ := + parent_adjoint_gradient_cz d p hp + obtain ⟨Cp, hCp, hPoincare⟩ := + W10pFunction.exists_poincare_constant_of_isOpenBoundedConvexDomain + p.one_lt p.lt_top.ne + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)) + let P : ℝ≥0∞ := ENNReal.ofReal (Cp * d) + refine ⟨Ccz, P, hCczTop, ENNReal.ofReal_lt_top, ?_⟩ + intro m h + let hP := sourceParentFiniteLpExtension m p h + let v := openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m p h) + have hgradBound : eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + Ccz * eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [hP, v, BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using! + hCcz m h + have hvgrad2 : MemLp (hilbertifyVecField v.toH1Function.grad) 2 + (normalizedCubeMeasure (originCube d (m + 1))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact (memHilbertVectorL2_hilbertifyVecField + v.toH1Function.grad_memVectorL2).smul_measure ENNReal.ofReal_ne_top + have hsourceTop : eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) < ∞ := + h.toCubeEuclideanLpField.euclideanMemLp.eLpNorm_lt_top + have hgradTop : eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) < ∞ := + lt_of_le_of_lt hgradBound (ENNReal.mul_lt_top hCczTop hsourceTop) + have hvgrad : MemLp (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) := + ⟨hvgrad2.aestronglyMeasurable, hgradTop⟩ + have hvalueBound := + ScalarPoissonGradientBelowTwo.centeredCubeH10_value_eLpNorm_le_scale_mul_grad + p Cp hCp hPoincare (m + 1) v (by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hvgrad) + have hvalue : eLpNorm v.toH1Function.toFun p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * + eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + calc + eLpNorm v.toH1Function.toFun p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * + eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) := by + simpa only [P, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hvalueBound + _ ≤ P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * + eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + calc + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * + eLpNorm (hilbertifyVecField v.toH1Function.grad) p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * + (Ccz * eLpNorm (hilbertifyVecField h.toField) p.exponent + (normalizedCubeMeasure (originCube d m))) := by + gcongr + _ = _ := by ac_rfl + have hvalueTop : eLpNorm v.toH1Function.toFun p.exponent + (normalizedCubeMeasure (originCube d (m + 1))) < ∞ := + lt_of_le_of_lt hvalue <| ENNReal.mul_lt_top + (ENNReal.mul_lt_top (ENNReal.mul_lt_top ENNReal.ofReal_lt_top ENNReal.ofReal_lt_top) + hCczTop) hsourceTop + have hvfun2 : MemLp v.toH1Function.toFun 2 + (normalizedCubeMeasure (originCube d (m + 1))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact v.toH1Function.memL2.smul_measure ENNReal.ofReal_ne_top + exact ⟨hvalue, hgradBound, hvgrad, ⟨hvfun2.aestronglyMeasurable, hvalueTop⟩⟩ + +private theorem norm_basisVec {d : ℕ} (i : Fin d) : ‖basisVec i‖ = (1 : ℝ) := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases hji : j = i + · subst j + simp [basisVec] + · simp [basisVec, hji] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +private theorem euclideanCoordLaplacian_le_hessian + {d : ℕ} {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (x : Vec d) {B : ℝ} (hB : ‖iteratedFDeriv ℝ 2 η x‖ ≤ B) : + |euclideanCoordLaplacian η x| ≤ (d : ℝ) * B := by + have hcoord : ∀ i : Fin d, |euclideanCoordSecondDeriv i i η x| ≤ B := by + intro i + calc + |euclideanCoordSecondDeriv i i η x| = + ‖fderiv ℝ (fderiv ℝ η) x (basisVec i) (basisVec i)‖ := by + rw [euclideanCoordSecondDeriv_eq_fderiv_fderiv hη] + simp [Real.norm_eq_abs] + _ = ‖iteratedFDeriv ℝ 2 η x ![basisVec i, basisVec i]‖ := by + simp [iteratedFDeriv_two_apply] + _ ≤ ‖iteratedFDeriv ℝ 2 η x‖ * ∏ j, ‖![basisVec i, basisVec i] j‖ := by + simpa using ContinuousMultilinearMap.le_opNorm + (iteratedFDeriv ℝ 2 η x) ![basisVec i, basisVec i] + _ = ‖iteratedFDeriv ℝ 2 η x‖ := by simp [norm_basisVec] + _ ≤ B := hB + calc + |euclideanCoordLaplacian η x| = + |∑ i : Fin d, euclideanCoordSecondDeriv i i η x| := rfl + _ ≤ ∑ i : Fin d, |euclideanCoordSecondDeriv i i η x| := + Finset.abs_sum_le_sum_abs _ _ + _ ≤ ∑ _i : Fin d, B := Finset.sum_le_sum fun i _ => hcoord i + _ = (d : ℝ) * B := by simp [Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + +private theorem quantitativeCubeCutoff_euclideanCoordLaplacian_bound + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) (x : Vec d) : + |euclideanCoordLaplacian (η : Vec d → ℝ) x| ≤ + (d : ℝ) * (quantitativeCubeCutoffHessianConst d / + (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) := by + apply euclideanCoordLaplacian_le_hessian η.smooth x + simpa using η.hessian_bound x + +private theorem vector_multiplier_eLpNorm + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : Measure α} (p : ℝ≥0∞) {f : α → E} {g : α → ℝ} {C : ℝ} + (hC : 0 ≤ C) (h : ∀ x, ‖f x‖ ≤ C * |g x|) : + eLpNorm f p μ ≤ C.toNNReal • eLpNorm g p μ := by + apply eLpNorm_le_nnreal_smul_eLpNorm_of_ae_le_mul' + filter_upwards with x + rw [enorm_eq_nnnorm, enorm_eq_nnnorm] + apply ENNReal.coe_le_coe.mpr + refine (NNReal.coe_le_coe).mp ?_ + change ‖f x‖ ≤ (C.toNNReal : ℝ) * ‖g x‖ + simpa [Real.coe_toNNReal _ hC, Real.norm_eq_abs] using h x + +private theorem scalar_multiplier_eLpNorm + {α : Type*} [MeasurableSpace α] {μ : Measure α} + (p : ℝ≥0∞) {f g : α → ℝ} {C : ℝ} + (hC : 0 ≤ C) (h : ∀ x, |f x| ≤ C * |g x|) : + eLpNorm f p μ ≤ C.toNNReal • eLpNorm g p μ := by + apply eLpNorm_le_nnreal_smul_eLpNorm_of_ae_le_mul' + filter_upwards with x + rw [enorm_eq_nnnorm, enorm_eq_nnnorm] + apply ENNReal.coe_le_coe.mpr + refine (NNReal.coe_le_coe).mp ?_ + change ‖f x‖ ≤ (C.toNNReal : ℝ) * ‖g x‖ + simpa [Real.coe_toNNReal _ hC, Real.norm_eq_abs] using h x + +private theorem scalar_mul_bounded_vector_eLpNorm + {d : ℕ} {μ : Measure (Vec d)} (p : ℝ≥0∞) + {v : Vec d → ℝ} {G : Vec d → HilbertVec d} {C : ℝ} + (hC : 0 ≤ C) (hG : ∀ x, ‖G x‖ ≤ C) : + eLpNorm (fun x => v x • G x) p μ ≤ C.toNNReal • eLpNorm v p μ := by + apply vector_multiplier_eLpNorm p hC + intro x + rw [norm_smul] + simpa [Real.norm_eq_abs, mul_comm] using + (mul_le_mul_of_nonneg_left (hG x) (abs_nonneg (v x))) + +private theorem scalar_mul_bounded_scalar_eLpNorm + {d : ℕ} {μ : Measure (Vec d)} (p : ℝ≥0∞) + {w L : Vec d → ℝ} {C : ℝ} + (hC : 0 ≤ C) (hL : ∀ x, |L x| ≤ C) : + eLpNorm (fun x => w x * L x) p μ ≤ C.toNNReal • eLpNorm w p μ := by + apply scalar_multiplier_eLpNorm p hC + intro x + simpa [abs_mul, mul_comm] using + (mul_le_mul_of_nonneg_left (hL x) (abs_nonneg (w x))) + +private theorem quantitativeCubeCutoff_hilbertGradient_bound + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) (x : Vec d) : + ‖HilbertVec.ofVec (euclideanGradient (η : Vec d → ℝ) x)‖ ≤ + (d : ℝ) * (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) := by + let K : ℝ := quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q) + have hK : 0 ≤ K := by + refine (norm_nonneg (fderiv ℝ (η : Vec d → ℝ) x)).trans ?_ + simpa [K] using η.gradient_bound x + have hgrad : ‖euclideanGradient (η : Vec d → ℝ) x‖ ≤ K := by + refine (pi_norm_le_iff_of_nonneg hK).2 ?_ + intro i + calc + ‖euclideanGradient (η : Vec d → ℝ) x i‖ = + ‖(fderiv ℝ (η : Vec d → ℝ) x) (basisVec i)‖ := by + simp [euclideanGradient, euclideanCoordDeriv] + _ ≤ ‖fderiv ℝ (η : Vec d → ℝ) x‖ * ‖basisVec i‖ := by + simpa using (fderiv ℝ (η : Vec d → ℝ) x).le_opNorm (basisVec i) + _ = ‖fderiv ℝ (η : Vec d → ℝ) x‖ := by simp [norm_basisVec] + _ ≤ K := by simpa [K] using η.gradient_bound x + calc + ‖HilbertVec.ofVec (euclideanGradient (η : Vec d → ℝ) x)‖ ≤ + (d : ℝ) * ‖euclideanGradient (η : Vec d → ℝ) x‖ := + HilbertVec.norm_ofVec_le_mul_norm _ + _ ≤ (d : ℝ) * K := mul_le_mul_of_nonneg_left hgrad (Nat.cast_nonneg d) + _ = (d : ℝ) * (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) := rfl + +/-- The two cutoff products used in the reflected-parent mutual testing step. +The first is an admissible local row test; the second is its canonical +zero-trace extension to the parent adjoint problem. -/ +private theorem exists_localized_mutual_tests + {d : ℕ} {m : ℤ} + (r : H1Function (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (v : H10Function (openCubeSet (originCube d (m + 1)))) : + ∃ (η : QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) (5 / 12 : ℝ)) + (rowTest : H10Function + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (adjTest : H10Function (openCubeSet (originCube d (m + 1)))), + ((fun x ↦ rowTest.toH1Function.grad x) =ᵐ[volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x j ↦ η x * v.toH1Function.grad x j + + v.toH1Function.toFun x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∧ + ((fun x ↦ adjTest.toH1Function.grad x) =ᵐ[volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x j ↦ η x * r.grad x j + + r.toFun x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) := by + let Qp : TriadicCube d := originCube d (m + 1) + let U : Set (Vec d) := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let P : Set (Vec d) := openCubeSet Qp + have hU : IsOpenBoundedConvexDomain U := + isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp (by norm_num) + have hP : IsOpen P := isOpen_openCubeSet Qp + have hUP : U ⊆ P := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Qp (ρ := 1 / 2) + (by norm_num) (by norm_num) + intro i + exact le_of_lt (hx i) + let η : QuantitativeCubeCutoff Qp (1 / 3 : ℝ) (5 / 12 : ℝ) := + QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + have hηsub : tsupport (η : Vec d → ℝ) ⊆ U := by + exact (η.tsupport_subset_scaledClosedCubeSet_of_support_subset).trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp (by norm_num)) + let vU : H1Function U := v.toH1Function.restrict hU.isOpen hUP + let rowTest : H10Function U := + vU.mulContDiffHasCompactSupportToH10 hU η.smooth η.hasCompactSupport hηsub + let adjTestU : H10Function U := + r.mulContDiffHasCompactSupportToH10 hU η.smooth η.hasCompactSupport hηsub + let adjTest : H10Function P := + adjTestU.extendByZeroToOpenSuperset hU.isOpen.measurableSet hP hUP + refine ⟨η, rowTest, adjTest, ?_, ?_⟩ + · simpa only [rowTest, vU, H1Function.restrict] using + (WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + vU hU η.smooth η.hasCompactSupport hηsub) + · have hadj := WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + r hU η.smooth η.hasCompactSupport hηsub + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet, hadj] with x hxU hx + change adjTestU.zeroExtensionGrad x = _ + rw [adjTestU.zeroExtensionGrad_apply_of_mem hxU] + exact hx + +private theorem exists_reflected_source_row_setup + {d : ℕ} [NeZero d] {m : ℤ} (q : FiniteLpExponent) {F : Vec d → ℝ} + (hF : MemLp F 2 (normalizedCubeMeasure (originCube d m))) + (hFq : MemLp F q.exponent (normalizedCubeMeasure (originCube d m))) + {B : ℝ≥0∞} (hBtop : B < ∞) + {u : H10Function (openCubeSet (originCube d m))} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function) + (i : Fin d) + (hgrad : eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ B) : + ∃ (r : H1Function (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (b : Vec d → Vec d), + (∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) → + ∫ x in scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ), + vecDot (r.grad x) (euclideanGradient φ x) ∂volume = + -∫ x in scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ), + vecDot (b x) (euclideanGradient φ x) ∂volume) ∧ + MemVectorL2 (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) b ∧ + (hilbertifyVecField r.grad =ᵐ[volume.restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ H.hess i j y) x)) ∧ + b = (fun x j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F x else 0) ∧ + MemLp (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ∧ + eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) ∧ + MemLp r.toFun q.exponent ((normalizedCubeMeasure (originCube d (m + 1))).restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) ∧ + eLpNorm r.toFun q.exponent ((normalizedCubeMeasure (originCube d (m + 1))).restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) ≤ B := by + obtain ⟨uP, _huPfun, huPgrad, hweakP, uU, _huUfun, huUgrad, HU, _hHU⟩ := + hweak.exists_cubeDirichletOddReflectionParent_innerHalf_hasWeakHessianOn hF + let U : Set (Vec d) := scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let FR : Vec d → ℝ := cubeDirichletOddReflectionScalar (originCube d m) F + let b : Vec d → Vec d := fun x j ↦ if j = i then FR x else 0 + let r : H1Function U := HU.gradCoordH1Function i + have hUopen : IsOpen U := + (isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos + (originCube d (m + 1)) (by norm_num : 0 < (1 / 2 : ℝ))).isOpen + have hUP : U ⊆ openCubeSet (originCube d (m + 1)) := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + (originCube d (m + 1)) (ρ := 1 / 2) (by norm_num) (by norm_num) + intro j + exact le_of_lt (hx j) + have hFopen : MemScalarL2 (openCubeSet (originCube d m)) F := by + exact memL2On_openCubeSet_of_memLp_normalizedCubeMeasure _ hF + have hFRparent : MemScalarL2 (openCubeSet (originCube d (m + 1))) FR := by + simpa only [FR] using + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) hFopen + have hFRU : MemScalarL2 U FR := memL2On_mono hUP hFRparent + have hweakU : WeakPoissonEquationOn U uU FR := by + have hres := hweakP.restrict hUopen hUP + intro φ hφ hφs hφsub + have ht := hres.test φ hφ hφs hφsub + simpa only [H1Function.restrict, huUgrad] using ht + have hrow : ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x in U, vecDot (r.grad x) (euclideanGradient φ x) ∂volume = + -∫ x in U, vecDot (b x) (euclideanGradient φ x) ∂volume := by + simpa only [r, b, FR, one_mul] using + hweakU.gradCoordH1Function_weakDivergence hUopen hFRU HU i + have hb : MemVectorL2 U b := by + simpa only [b] using memVectorL2_singleCoordinate hFRU i + have hid := H.cubeDirichletOddReflectionParent_innerHalf_hessianRow_ae_eq + huPgrad huUgrad HU i + have hrowid : hilbertifyVecField r.grad =ᵐ[volume.restrict U] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i (fun y j ↦ H.hess i j y) x) := by + simpa only [r, U, hilbertifyVecField, + HasWeakHessianOn.gradCoordH1Function_grad] using! hid + have hrnorm : eLpNorm r.toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) ≤ B := by + let Q : TriadicCube d := originCube d m + let refl : Vec d → ℝ := + cubeDirichletOddReflectionGradientCoordScalar Q i + (fun y ↦ u.toH1Function.grad y i) + have hscalar : (fun x ↦ uU.grad x i) = refl := by + funext x + have hx := congrArg (fun G : Vec d → Vec d ↦ G x i) + (huUgrad.trans huPgrad) + change uU.grad x i = + cubeDirichletOddReflectionVectorField Q (fun y ↦ u.toH1Function.grad y) x i at hx + rw [hx] + simp only [refl, cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionVectorField, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul] + ring + calc + eLpNorm r.toFun q.exponent ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) = + eLpNorm refl q.exponent ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) := by + change eLpNorm (fun x ↦ uU.grad x i) q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) = _ + rw [hscalar] + _ ≤ eLpNorm refl q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := + eLpNorm_mono_measure refl Measure.restrict_le_self + _ = eLpNorm (fun y ↦ u.toH1Function.grad y i) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [refl, Q] using + eLpNorm_normalizedCubeMeasure_succ_originCube_gradientCoordScalar i + (fun y ↦ u.toH1Function.grad y i) q + _ ≤ eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) := + coordinate_eLpNorm_le_euclidean _ q u.toH1Function.grad i + _ ≤ B := hgrad + have hFRq : MemLp FR q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + simpa only [FR] using + memLp_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar q hFq + have hbq : MemLp (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) := by + refine ⟨?_, ?_⟩ + · let L : ℝ →L[ℝ] HilbertVec d := + (HilbertVec.ofVecL d).comp (ContinuousLinearMap.single ℝ (fun _ : Fin d ↦ ℝ) i) + have hL := L.continuous.comp_aestronglyMeasurable hFRq.aestronglyMeasurable + have hbfield : hilbertifyVecField b = + fun x ↦ HilbertVec.ofVec (Pi.single i (FR x)) := by + funext x + change HilbertVec.ofVec (b x) = HilbertVec.ofVec (Pi.single i (FR x)) + congr 1 + funext j + by_cases hji : j = i + · subst j; simp [b] + · simp [b, hji] + rw [hbfield] + simpa only [L, ContinuousLinearMap.comp_apply, ContinuousLinearMap.single_apply, + HilbertVec.ofVecL_apply] using hL + · have hnorm : eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm FR q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + apply eLpNorm_congr_norm_ae + apply ae_of_all; intro x + change ‖HilbertVec.ofVec (fun j ↦ if j = i then FR x else 0)‖ = ‖FR x‖ + have hs : (fun j ↦ if j = i then FR x else 0) = Pi.single i (FR x) := by + funext j; by_cases hji : j = i + · subst j; simp + · simp [hji] + rw [hs] + exact PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d ↦ ℝ) i (FR x) + rw [hnorm] + exact hFRq.eLpNorm_lt_top + have hbnorm : eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + calc + eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm FR q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + apply eLpNorm_congr_norm_ae + apply ae_of_all; intro x + change ‖HilbertVec.ofVec (fun j ↦ if j = i then FR x else 0)‖ = ‖FR x‖ + have hs : (fun j ↦ if j = i then FR x else 0) = Pi.single i (FR x) := by + funext j; by_cases hji : j = i + · subst j; simp + · simp [hji] + rw [hs] + exact PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d ↦ ℝ) i (FR x) + _ = eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + simpa only [FR] using + eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar F q + have hrmeas : AEStronglyMeasurable r.toFun + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) := by + have hr2 : MemLp r.toFun 2 ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + Measure.restrict_smul, Measure.restrict_restrict_of_subset hUP] + exact r.memL2.smul_measure ENNReal.ofReal_ne_top + exact hr2.aestronglyMeasurable + have hrq : MemLp r.toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) := + ⟨hrmeas, lt_of_le_of_lt hrnorm hBtop⟩ + refine ⟨r, b, hrow, hb, hrowid, ?_, hbq, hbnorm, hrq, hrnorm⟩ + rfl + +private theorem mutual_raw_identity {I C J D E A Hterm : ℝ} + (hrow : I + C = -D - E) + (hadjoint : I + A = -J) + (hibp : C = -A - Hterm) : + J = D + E - 2 * A - Hterm := by + linarith + +private noncomputable def sourceHessianRowRadialDatum + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) (n : ℕ) : CubeEuclideanL2LpField (originCube d m) q.conjugate := + INTERNAL.cubeRadialTruncationL2LpField (originCube d m) q + (fun x j ↦ H.hess i j x) + (by + simpa only [hilbertifyVecField] using! + (H.hessianHilbertRow_memLp_two i).aestronglyMeasurable) n + +private theorem sourceHessianRowRadialDatum_memVectorL2 + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) (n : ℕ) : + MemVectorL2 (openCubeSet (originCube d m)) + (sourceHessianRowRadialDatum q H i n).toField := by + apply INTERNAL.cubeRadialTruncation_memVectorL2 + +private theorem reflected_datum_parent_transport + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + (F : Vec d → ℝ) (i : Fin d) : + eLpNorm (hilbertifyVecField + (fun x j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F x else 0)) + q.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + let FR : Vec d → ℝ := cubeDirichletOddReflectionScalar (originCube d m) F + have hfield : (fun x j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F x else 0) = + (fun x j ↦ if j = i then FR x else 0) := by + rfl + have hsingle : ∀ x, (fun j ↦ if j = i then FR x else 0) = Pi.single i (FR x) := by + intro x + funext j + by_cases hji : j = i + · subst j + simp + · simp [hji] + rw [hfield] + calc + eLpNorm (hilbertifyVecField (fun x j ↦ if j = i then FR x else 0)) + q.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm FR q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + apply MeasureTheory.eLpNorm_congr_norm_ae + exact MeasureTheory.ae_of_all _ fun x ↦ by + change ‖HilbertVec.ofVec (fun j ↦ if j = i then FR x else 0)‖ = ‖FR x‖ + rw [hsingle x] + exact PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d ↦ ℝ) i (FR x) + _ = eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + simpa only [FR] using + eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar F q + +/-- The already-established scalar gradient theorem, restated in the raw +normalized-cube conventions used by the reflected Hessian argument. -/ +private theorem source_gradient_below_two_bound + {d : ℕ} [NeZero d] {q : FiniteLpExponent} + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ) + (u : H10Function (openCubeSet (originCube d m))), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + CubeDirichletWeakPoissonProblem (originCube d m) u F → + eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * ENNReal.ofReal (cubeScaleFactor (originCube d m)) * + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C, hCtop, hC⟩ := + centeredCubeH10ScalarPoisson_gradient_cz_of_lt_two d q hq + refine ⟨C, hCtop, ?_⟩ + intro m F u hF2 hFq hweak + have hweak' : ∀ phi : H10Function (openCubeSet (originCube d m)), + (1 : ℝ) * ∫ x, vecDot (u.toH1Function.grad x) + (phi.toH1Function.grad x) ∂(centeredCubeDomain d m).normalizedVolume = + ∫ x, F x * phi.toH1Function.toFun x + ∂(centeredCubeDomain d m).normalizedVolume := by + intro phi + have hs := congrArg (fun z : ℝ => + (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹)).toReal • z) + (hweak phi) + simpa only [one_mul, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + MeasureTheory.integral_smul_measure] using hs + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + MeasureTheory.eLpNorm_norm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + ENNReal.ofReal_one, inv_one, mul_one] using! + hC m 1 F u (by simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hF2) + (by simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hFq) + (by norm_num) hweak' + +private theorem source_hessian_row_radial_pairing_moment + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) (n : ℕ) : + let R : Vec d → Vec d := fun x j => H.hess i j x + let Frow : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (R x) + let hRmeas : AEStronglyMeasurable Frow + (volumeMeasureOn (openCubeSet (originCube d m))) := + (H.hessianHilbertRow_memLp_two i).aestronglyMeasurable + let Gfield := INTERNAL.cubeRadialTruncationL2LpField + (originCube d m) q R hRmeas n + let μ := normalizedCubeMeasure (originCube d m) + ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n Frow x ∂μ = + ENNReal.ofReal (∫ x, vecDot (R x) (Gfield.toField x) ∂μ) := by + dsimp + let R : Vec d → Vec d := fun x j => H.hess i j x + let Frow : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (R x) + let hRmeas : AEStronglyMeasurable Frow + (volumeMeasureOn (openCubeSet (originCube d m))) := + (H.hessianHilbertRow_memLp_two i).aestronglyMeasurable + let Gfield := INTERNAL.cubeRadialTruncationL2LpField + (originCube d m) q R hRmeas n + let μ : Measure (Vec d) := normalizedCubeMeasure (originCube d m) + have hRtwo : MemVectorL2 (openCubeSet (originCube d m)) R := by + apply MeasureTheory.MemLp.of_eval + intro j + exact H.hess_memL2 i j + have hGtwo : MemVectorL2 (openCubeSet (originCube d m)) Gfield.toField := by + simpa only [Gfield] using INTERNAL.cubeRadialTruncation_memVectorL2 + (originCube d m) q R hRmeas n + have hk : Integrable (fun x => vecDot (R x) (Gfield.toField x)) μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + INTERNAL.centeredCube_integrable_vecDot_of_memVectorL2 m hRtwo hGtwo + have hk0 : 0 ≤ᵐ[μ] fun x => vecDot (R x) (Gfield.toField x) := by + filter_upwards with x + change 0 ≤ vecDot (R x) + (INTERNAL.vectorRadialTruncation q.exponent.toReal n R x) + rw [vecDot_comm, INTERNAL.vecDot_vectorRadialTruncation_self] + · split_ifs with hx + · exact Real.rpow_nonneg (euclideanNorm_nonneg _) _ + · exact le_rfl + · rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hpoint : ∀ᵐ x ∂μ, ENNReal.ofReal + (vecDot (R x) (Gfield.toField x)) = + INTERNAL.truncatedMoment q.exponent.toReal n Frow x := by + filter_upwards with x + simpa only [Frow, Gfield, INTERNAL.cubeRadialTruncationL2LpField, + INTERNAL.vectorRadialTruncation, HilbertVec.ofVec_toVec] using + INTERNAL.ofReal_vecDot_vectorRadialTruncation_eq_truncatedMoment + (show 1 < q.exponent.toReal by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt) + n R x + exact INTERNAL.lintegral_truncatedMoment_eq_ofReal_integral hk hk0 hpoint + +private theorem source_hessian_row_radial_norm_eq_moment_rpow + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (H : HasWeakHessianOn (openCubeSet (originCube d m)) + u) (i : Fin d) (n : ℕ) : + eLpNorm (hilbertifyVecField + (sourceHessianRowRadialDatum q H i n).toField) + q.conjugate.exponent (normalizedCubeMeasure (originCube d m)) = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x)) x ∂ + normalizedCubeMeasure (originCube d m)) ^ + (1 - q.exponent.toReal⁻¹) := by + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + have hmoment := INTERNAL.eLpNorm_hilbertRadialTruncation_rpow_conjugate_eq_truncatedMoment + (μ := normalizedCubeMeasure (originCube d m)) q n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x)) + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hreal : q.exponent.toReal.HolderConjugate q.conjugate.exponent.toReal := + ENNReal.HolderConjugate.toReal hqreal + have hexp : (q.conjugate.exponent.toReal)⁻¹ = + 1 - q.exponent.toReal⁻¹ := by + have hsum := hreal.one_div_add_one_div + rw [one_div] at hsum + norm_num at hsum + linarith + have hr0 : q.conjugate.exponent.toReal ≠ 0 := + (ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans q.conjugate.one_lt)) + q.conjugate.lt_top.ne).ne' + change eLpNorm (INTERNAL.hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x))) + q.conjugate.exponent (normalizedCubeMeasure (originCube d m)) = _ + calc + eLpNorm (INTERNAL.hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x))) + q.conjugate.exponent (normalizedCubeMeasure (originCube d m)) = + (eLpNorm (INTERNAL.hilbertRadialTruncation q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x))) + q.conjugate.exponent (normalizedCubeMeasure (originCube d m)) ^ + q.conjugate.exponent.toReal) ^ + (q.conjugate.exponent.toReal)⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ hr0, ENNReal.rpow_one] + _ = _ := by rw [hmoment, hexp] + +private theorem indicator_setIntegral_parent_eq_child + {d : ℕ} {U P : Set (Vec d)} {f : Vec d → ℝ} + (hU : MeasurableSet U) (hUP : U ⊆ P) : + ∫ x in P, U.indicator f x ∂volume = ∫ x in U, f x ∂volume := by + rw [MeasureTheory.integral_indicator hU, Measure.restrict_restrict hU, + Set.inter_eq_left.mpr hUP] + +private theorem row_weak_test_expanded + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (r v : H1Function U) (F : Vec d → Vec d) (η : Vec d → ℝ) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ U) + (hF : MemVectorL2 U F) + (hrow : ∀ φ : H10Function U, + ∫ x in U, vecDot (r.grad x) (φ.toH1Function.grad x) ∂volume = + -∫ x in U, vecDot (F x) (φ.toH1Function.grad x) ∂volume) : + let I := ∫ x in U, η x * vecDot (r.grad x) (v.grad x) ∂volume + let C := ∫ x in U, v x * vecDot (r.grad x) (euclideanGradient η x) ∂volume + let D := ∫ x in U, η x * vecDot (F x) (v.grad x) ∂volume + let E := ∫ x in U, v x * vecDot (F x) (euclideanGradient η x) ∂volume + I + C = -D - E := by + dsimp + let τ : H10Function U := v.mulContDiffHasCompactSupportToH10 hU + hη hη_compact hη_sub + let Vη : Vec d → Vec d := fun x j => η x * v.grad x j + let Vdη : Vec d → Vec d := fun x j => v x * euclideanGradient η x j + have hVη : MemVectorL2 U Vη := by + apply MeasureTheory.MemLp.of_eval + intro j + exact WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet hη hη_compact hη_sub + (v.gradMemL2 j) + have hVdη : MemVectorL2 U Vdη := by + apply MeasureTheory.MemLp.of_eval + intro j + have hbase : MemScalarL2 U + (fun x => euclideanCoordDeriv j η x * v x) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + v.memL2 + simpa only [Vdη, euclideanGradient, euclideanCoordDeriv, mul_comm] using hbase + have hτgrad : (fun x => τ.toH1Function.grad x) =ᵐ[volume.restrict U] + fun x => Vη x + Vdη x := by + simpa only [τ, Vη, Vdη, euclideanGradient, euclideanCoordDeriv] using! + WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + v hU hη hη_compact hη_sub + have hIint : IntegrableOn (fun x => vecDot (r.grad x) (Vη x)) U volume := + integrableOn_vecDot_of_memVectorL2 r.grad_memVectorL2 hVη + have hCint : IntegrableOn (fun x => vecDot (r.grad x) (Vdη x)) U volume := + integrableOn_vecDot_of_memVectorL2 r.grad_memVectorL2 hVdη + have hDint : IntegrableOn (fun x => vecDot (F x) (Vη x)) U volume := + integrableOn_vecDot_of_memVectorL2 hF hVη + have hEint : IntegrableOn (fun x => vecDot (F x) (Vdη x)) U volume := + integrableOn_vecDot_of_memVectorL2 hF hVdη + have hleft : + ∫ x in U, vecDot (r.grad x) (τ.toH1Function.grad x) ∂volume = + (∫ x in U, vecDot (r.grad x) (Vη x) ∂volume) + + ∫ x in U, vecDot (r.grad x) (Vdη x) ∂volume := by + calc + ∫ x in U, vecDot (r.grad x) (τ.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (r.grad x) (Vη x + Vdη x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hτgrad] with x hx + rw [hx] + _ = ∫ x in U, (vecDot (r.grad x) (Vη x) + + vecDot (r.grad x) (Vdη x)) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [vecDot, Pi.add_apply] + rw [← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := MeasureTheory.integral_add hIint hCint + have hright : + ∫ x in U, vecDot (F x) (τ.toH1Function.grad x) ∂volume = + (∫ x in U, vecDot (F x) (Vη x) ∂volume) + + ∫ x in U, vecDot (F x) (Vdη x) ∂volume := by + calc + ∫ x in U, vecDot (F x) (τ.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (F x) (Vη x + Vdη x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hτgrad] with x hx + rw [hx] + _ = ∫ x in U, (vecDot (F x) (Vη x) + + vecDot (F x) (Vdη x)) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [vecDot, Pi.add_apply] + rw [← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := MeasureTheory.integral_add hDint hEint + have htest := hrow τ + rw [hleft, hright] at htest + have hI : + ∫ x in U, vecDot (r.grad x) (Vη x) ∂volume = + ∫ x in U, η x * vecDot (r.grad x) (v.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Vη, vecDot] + calc + ∑ i, r.grad x i * (η x * v.grad x i) = + ∑ i, η x * (r.grad x i * v.grad x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + have hC : + ∫ x in U, vecDot (r.grad x) (Vdη x) ∂volume = + ∫ x in U, v x * vecDot (r.grad x) (euclideanGradient η x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Vdη, vecDot] + calc + ∑ i, r.grad x i * (v x * euclideanGradient η x i) = + ∑ i, v x * (r.grad x i * euclideanGradient η x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + have hD : + ∫ x in U, vecDot (F x) (Vη x) ∂volume = + ∫ x in U, η x * vecDot (F x) (v.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Vη, vecDot] + calc + ∑ i, F x i * (η x * v.grad x i) = + ∑ i, η x * (F x i * v.grad x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + have hE : + ∫ x in U, vecDot (F x) (Vdη x) ∂volume = + ∫ x in U, v x * vecDot (F x) (euclideanGradient η x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Vdη, vecDot] + calc + ∑ i, F x i * (v x * euclideanGradient η x i) = + ∑ i, v x * (F x i * euclideanGradient η x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + rw [hI, hC, hD, hE] at htest + linarith + +private theorem parent_weak_test_expanded + {d : ℕ} {U P : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hPopen : IsOpen P) (hUP : U ⊆ P) + (r : H1Function U) (vP : H1Function P) (G : Vec d → Vec d) + (η : Vec d → ℝ) (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ U) + (hparent : ∀ ψ : H10Function P, + ∫ x in P, vecDot (vP.grad x) (ψ.toH1Function.grad x) ∂volume = + -∫ x in P, vecDot (G x) (ψ.toH1Function.grad x) ∂volume) : + let I := ∫ x in U, η x * vecDot (vP.grad x) (r.grad x) ∂volume + let A := ∫ x in U, r x * vecDot (vP.grad x) (euclideanGradient η x) ∂volume + let J := ∫ x in U, vecDot (G x) + (fun j => η x * r.grad x j + r x * euclideanGradient η x j) ∂volume + I + A = -J := by + dsimp + let σU : H10Function U := r.mulContDiffHasCompactSupportToH10 hU + hη hη_compact hη_sub + let σP : H10Function P := σU.extendByZeroToOpenSuperset + hU.isOpen.measurableSet hPopen hUP + let Rη : Vec d → Vec d := fun x j => η x * r.grad x j + let Rdη : Vec d → Vec d := fun x j => r x * euclideanGradient η x j + have hRη : MemVectorL2 U Rη := by + apply MeasureTheory.MemLp.of_eval + intro j + exact WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet hη hη_compact hη_sub + (r.gradMemL2 j) + have hRdη : MemVectorL2 U Rdη := by + apply MeasureTheory.MemLp.of_eval + intro j + have hbase : MemScalarL2 U + (fun x => euclideanCoordDeriv j η x * r x) := + WeakPoissonEquationOn.memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := U) hU.isOpen.measurableSet + (contDiff_euclideanCoordDeriv hη j) + (hasCompactSupport_euclideanCoordDeriv hη_compact j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j η).trans hη_sub) + r.memL2 + simpa only [Rdη, euclideanGradient, euclideanCoordDeriv, mul_comm] using hbase + have hσUgrad : (fun x => σU.toH1Function.grad x) =ᵐ[volume.restrict U] + fun x => Rη x + Rdη x := by + simpa only [σU, Rη, Rdη, euclideanGradient, euclideanCoordDeriv] using! + WeakPoissonEquationOn.mulContDiffHasCompactSupportToH10_grad_ae + r hU hη hη_compact hη_sub + have hσPgrad : σP.toH1Function.grad = σU.zeroExtensionGrad := by + simpa only [σP] using H10Function.extendByZeroToOpenSuperset_grad + σU hU.isOpen.measurableSet hPopen hUP + have hleft_indicator : + (fun x => vecDot (vP.grad x) (σP.toH1Function.grad x)) = + U.indicator (fun x => vecDot (vP.grad x) (σU.toH1Function.grad x)) := by + funext x + rw [hσPgrad] + by_cases hx : x ∈ U + · simp only [H10Function.zeroExtensionGrad_apply_of_mem _ hx, Set.indicator_of_mem hx] + · simp only [H10Function.zeroExtensionGrad_apply_of_not_mem _ hx, + Set.indicator_of_notMem hx, vecDot_zero_right] + have hright_indicator : + (fun x => vecDot (G x) (σP.toH1Function.grad x)) = + U.indicator (fun x => vecDot (G x) (σU.toH1Function.grad x)) := by + funext x + rw [hσPgrad] + by_cases hx : x ∈ U + · simp only [H10Function.zeroExtensionGrad_apply_of_mem _ hx, Set.indicator_of_mem hx] + · simp only [H10Function.zeroExtensionGrad_apply_of_not_mem _ hx, + Set.indicator_of_notMem hx, vecDot_zero_right] + have hparent_test := hparent σP + rw [hleft_indicator, hright_indicator, + indicator_setIntegral_parent_eq_child hU.isOpen.measurableSet hUP, + indicator_setIntegral_parent_eq_child hU.isOpen.measurableSet hUP] at hparent_test + have hleft_expand : + ∫ x in U, vecDot (vP.grad x) (σU.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (vP.grad x) (Rη x + Rdη x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hσUgrad] with x hx + rw [hx] + have hright_expand : + ∫ x in U, vecDot (G x) (σU.toH1Function.grad x) ∂volume = + ∫ x in U, vecDot (G x) (Rη x + Rdη x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hσUgrad] with x hx + rw [hx] + rw [hleft_expand, hright_expand] at hparent_test + let vU : H1Function U := vP.restrict hU.isOpen hUP + have hIint : IntegrableOn (fun x => vecDot (vP.grad x) (Rη x)) U volume := by + simpa only [vU, H1Function.restrict] using + integrableOn_vecDot_of_memVectorL2 vU.grad_memVectorL2 hRη + have hAint : IntegrableOn (fun x => vecDot (vP.grad x) (Rdη x)) U volume := by + simpa only [vU, H1Function.restrict] using + integrableOn_vecDot_of_memVectorL2 vU.grad_memVectorL2 hRdη + have hsplit : + ∫ x in U, vecDot (vP.grad x) (Rη x + Rdη x) ∂volume = + (∫ x in U, vecDot (vP.grad x) (Rη x) ∂volume) + + ∫ x in U, vecDot (vP.grad x) (Rdη x) ∂volume := by + rw [show (fun x => vecDot (vP.grad x) (Rη x + Rdη x)) = + fun x => vecDot (vP.grad x) (Rη x) + vecDot (vP.grad x) (Rdη x) by + funext x + simp only [vecDot, Pi.add_apply] + rw [← Finset.sum_add_distrib] + apply Finset.sum_congr rfl + intro i _ + ring] + exact MeasureTheory.integral_add hIint hAint + rw [hsplit] at hparent_test + have hI : + ∫ x in U, vecDot (vP.grad x) (Rη x) ∂volume = + ∫ x in U, η x * vecDot (vP.grad x) (r.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Rη, vecDot] + calc + ∑ i, vP.grad x i * (η x * r.grad x i) = + ∑ i, η x * (vP.grad x i * r.grad x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + have hA : + ∫ x in U, vecDot (vP.grad x) (Rdη x) ∂volume = + ∫ x in U, r x * vecDot (vP.grad x) (euclideanGradient η x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [Rdη, vecDot] + calc + ∑ i, vP.grad x i * (r x * euclideanGradient η x i) = + ∑ i, r x * (vP.grad x i * euclideanGradient η x i) := by + apply Finset.sum_congr rfl + intro i _ + ring + _ = _ := by rw [Finset.mul_sum] + rw [hI, hA] at hparent_test + simpa only [Rη, Rdη] using! hparent_test + +private theorem localized_four_term_bound + {J D E A Hterm BD BE BA BH : ℝ} + (hidentity : J = D + E - 2 * A - Hterm) + (hD : |D| ≤ BD) (hE : |E| ≤ BE) (hA : |A| ≤ BA) (hH : |Hterm| ≤ BH) : + J ≤ BD + BE + 2 * BA + BH := by + have hD' : D ≤ BD := (le_abs_self D).trans hD + have hE' : E ≤ BE := (le_abs_self E).trans hE + have hA' : -A ≤ BA := by + calc -A ≤ |-A| := le_abs_self (-A) + _ = |A| := abs_neg A + _ ≤ BA := hA + have hH' : -Hterm ≤ BH := by + calc -Hterm ≤ |-Hterm| := le_abs_self (-Hterm) + _ = |Hterm| := abs_neg Hterm + _ ≤ BH := hH + rw [hidentity] + linarith + +private theorem normalized_holder_pairing + {d : ℕ} {Q : TriadicCube d} {q : FiniteLpExponent} + (F G : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) q.conjugate.exponent + (normalizedCubeMeasure Q)) : + |∫ x, vecDot (F x) (G x) ∂(normalizedCubeMeasure Q)| ≤ + (eLpNorm (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (G x)) q.conjugate.exponent + (normalizedCubeMeasure Q)).toReal := by + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + exact INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul hF hG + +private theorem rowValue_restrict_transport + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + {uP : H1Function (openCubeSet (originCube d (m + 1)))} + (huPgrad : uP.grad = cubeDirichletOddReflectionVectorField + (originCube d m) (fun y ↦ u.grad y)) + {uU : H1Function (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))} + (huUgrad : uU.grad = uP.grad) + (HU : HasWeakHessianOn + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ)) uU) + (i : Fin d) {B : ℝ≥0∞} + (hgrad : eLpNorm (hilbertifyVecField u.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ B) : + eLpNorm (HU.gradCoordH1Function i).toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict + (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) ≤ B := by + let Q : TriadicCube d := originCube d m + let U : Set (Vec d) := scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let refl : Vec d → ℝ := + cubeDirichletOddReflectionGradientCoordScalar Q i (fun y ↦ u.grad y i) + have hscalar : (fun x ↦ uU.grad x i) = refl := by + funext x + have hx := congrArg (fun G : Vec d → Vec d ↦ G x i) + (huUgrad.trans huPgrad) + change uU.grad x i = + cubeDirichletOddReflectionVectorField Q (fun y ↦ u.grad y) x i at hx + rw [hx] + simp only [refl, cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionVectorField, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul] + ring + calc + eLpNorm (HU.gradCoordH1Function i).toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) = + eLpNorm refl q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) := by + change eLpNorm (fun x ↦ uU.grad x i) q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) = _ + rw [hscalar] + _ ≤ eLpNorm refl q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := + eLpNorm_mono_measure refl Measure.restrict_le_self + _ = eLpNorm (fun y ↦ u.grad y i) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [refl, Q] using + eLpNorm_normalizedCubeMeasure_succ_originCube_gradientCoordScalar i + (fun y ↦ u.grad y i) q + _ ≤ eLpNorm (hilbertifyVecField u.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) := + coordinate_eLpNorm_le_euclidean _ q u.grad i + _ ≤ B := hgrad + +private theorem restricted_raw_holder_vec + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) + (U : Set (Vec d)) (hU : MeasurableSet U) (hUP : U ⊆ openCubeSet Q) + (F G : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) q.conjugate.exponent + (normalizedCubeMeasure Q)) : + |∫ x in U, vecDot (F x) (G x) ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (G x)) q.conjugate.exponent + (normalizedCubeMeasure Q)).toReal := by + let : ENNReal.HolderConjugate q.exponent q.conjugate.exponent := q.holderConjugate + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let Iraw : ℝ := ∫ x in U, vecDot (F x) (G x) ∂volume + let Inorm : ℝ := ∫ x, vecDot (F x) (Set.indicator U G x) ∂μ + have hGind : MemLp (fun x => HilbertVec.ofVec (Set.indicator U G x)) + q.conjugate.exponent μ := by + have heq : (fun x => HilbertVec.ofVec (Set.indicator U G x)) = + Set.indicator U (fun x => HilbertVec.ofVec (G x)) := by + funext x; by_cases hx : x ∈ U <;> simp [hx] + rw [heq] + exact hG.indicator hU + have hholder := INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul hF hGind + have hGind_norm : eLpNorm (fun x => HilbertVec.ofVec (Set.indicator U G x)) + q.conjugate.exponent μ ≤ + eLpNorm (fun x => HilbertVec.ofVec (G x)) q.conjugate.exponent μ := by + apply eLpNorm_mono_ae + filter_upwards with x + by_cases hx : x ∈ U <;> simp [hx] + have hμ : μ = ENNReal.ofReal ((cubeVolume Q)⁻¹) • volume.restrict (openCubeSet Q) := by + change normalizedCubeMeasure Q = _ + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + have hInorm : Inorm = (cubeVolume Q)⁻¹ * Iraw := by + change ∫ x, vecDot (F x) (Set.indicator U G x) ∂μ = _ + rw [hμ, integral_smul_measure, smul_eq_mul] + have hindicator : (fun x => vecDot (F x) (Set.indicator U G x)) = + Set.indicator U (fun x => vecDot (F x) (G x)) := by + funext x; by_cases hx : x ∈ U <;> simp [hx, vecDot] + rw [hindicator, integral_indicator hU, + Measure.restrict_restrict_of_subset hUP] + simp only [Iraw, ENNReal.toReal_ofReal (inv_nonneg.mpr (cubeVolume_pos Q).le)] + have hIraw : Iraw = cubeVolume Q * Inorm := by + rw [hInorm] + field_simp [(cubeVolume_pos Q).ne'] + have hraw_abs : |Iraw| = cubeVolume Q * |Inorm| := by + rw [hIraw, abs_mul, abs_of_nonneg (cubeVolume_pos Q).le] + have hholder' : |Inorm| ≤ + (eLpNorm (fun x => HilbertVec.ofVec (F x)) q.exponent μ).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (Set.indicator U G x)) + q.conjugate.exponent μ).toReal := by simpa only [Inorm] using hholder + have hright : + (eLpNorm (fun x => HilbertVec.ofVec (F x)) q.exponent μ).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (Set.indicator U G x)) + q.conjugate.exponent μ).toReal ≤ + (eLpNorm (fun x => HilbertVec.ofVec (F x)) q.exponent μ).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (G x)) + q.conjugate.exponent μ).toReal := by + exact mul_le_mul_of_nonneg_left + (ENNReal.toReal_mono hG.eLpNorm_ne_top hGind_norm) ENNReal.toReal_nonneg + change |Iraw| ≤ _ + rw [hraw_abs] + refine (mul_le_mul_of_nonneg_left (hholder'.trans hright) + (cubeVolume_pos Q).le).trans_eq ?_ + simp only [μ, mul_assoc] + +private theorem scalar_indicator_mul_bounded_memLp_and_norm + {α : Type*} [MeasurableSpace α] {μ : Measure α} {p : ℝ≥0∞} + (U : Set α) (hU : MeasurableSet U) (r L : α → ℝ) {C : ℝ} + (hC : 0 ≤ C) (hr : MemLp r p (μ.restrict U)) + (hL : AEStronglyMeasurable L (μ.restrict U)) + (hLbound : ∀ x, |L x| ≤ C) : + MemLp (U.indicator (fun x ↦ r x * L x)) p μ ∧ + eLpNorm (U.indicator (fun x ↦ r x * L x)) p μ ≤ + C.toNNReal • eLpNorm r p (μ.restrict U) := by + have hlocal : MemLp (fun x ↦ r x * L x) p (μ.restrict U) := by + refine MemLp.of_le_mul (c := C) hr ?_ ?_ + · exact hr.aestronglyMeasurable.mul hL + · filter_upwards with x + rw [Real.norm_eq_abs, abs_mul] + simpa [mul_comm] using + (mul_le_mul_of_nonneg_left (hLbound x) (abs_nonneg (r x))) + constructor + · rw [memLp_indicator_iff_restrict hU]; exact hlocal + · rw [eLpNorm_indicator_eq_eLpNorm_restrict hU] + apply eLpNorm_le_nnreal_smul_eLpNorm_of_ae_le_mul' + filter_upwards with x + rw [enorm_eq_nnnorm, enorm_eq_nnnorm] + apply ENNReal.coe_le_coe.mpr + refine (NNReal.coe_le_coe).mp ?_ + change ‖r x * L x‖ ≤ (C.toNNReal : ℝ) * ‖r x‖ + rw [Real.norm_eq_abs, abs_mul] + simpa [Real.coe_toNNReal _ hC, mul_comm] using + (mul_le_mul_of_nonneg_left (hLbound x) (abs_nonneg (r x))) + +private theorem scalar_single_hilbert_memLp_and_norm + {α : Type*} [MeasurableSpace α] {d : ℕ} (i : Fin d) + {μ : Measure α} {p : ℝ≥0∞} (f : α → ℝ) (hf : MemLp f p μ) : + MemLp (fun x ↦ HilbertVec.ofVec (Pi.single i (f x))) p μ ∧ + eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (f x))) p μ = + eLpNorm f p μ := by + let L : ℝ →L[ℝ] HilbertVec d := + (HilbertVec.ofVecL d).comp (ContinuousLinearMap.single ℝ (fun _ : Fin d ↦ ℝ) i) + have hmeas : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (Pi.single i (f x))) μ := by + change AEStronglyMeasurable (L ∘ f) μ + exact L.continuous.comp_aestronglyMeasurable hf.aestronglyMeasurable + have henorm : eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (f x))) p μ = + eLpNorm f p μ := by + apply eLpNorm_congr_norm_ae + apply ae_of_all; intro x + exact PiLp.norm_single (2 : ℝ≥0∞) (fun _ : Fin d ↦ ℝ) i (f x) + exact ⟨⟨hmeas, henorm.symm ▸ hf.eLpNorm_lt_top⟩, henorm⟩ + +private theorem localized_Hterm_raw_bound + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) (i : Fin d) + (U : Set (Vec d)) (hU : MeasurableSet U) (hUP : U ⊆ openCubeSet Q) + (r v L : Vec d → ℝ) {C : ℝ} (hC : 0 ≤ C) + (hr : MemLp r q.exponent ((normalizedCubeMeasure Q).restrict U)) + (hL : AEStronglyMeasurable L ((normalizedCubeMeasure Q).restrict U)) + (hLbound : ∀ x, |L x| ≤ C) + (hv : MemLp v q.conjugate.exponent (normalizedCubeMeasure Q)) : + |∫ x in U, r x * v x * L x ∂volume| ≤ cubeVolume Q * + (C.toNNReal • eLpNorm r q.exponent + ((normalizedCubeMeasure Q).restrict U)).toReal * + (eLpNorm v q.conjugate.exponent (normalizedCubeMeasure Q)).toReal := by + obtain ⟨hrL, hrLnorm⟩ := + scalar_indicator_mul_bounded_memLp_and_norm U hU r L hC hr hL hLbound + obtain ⟨hrLvec, hrLveceq⟩ := scalar_single_hilbert_memLp_and_norm i + (U.indicator (fun x ↦ r x * L x)) hrL + obtain ⟨hvvec, hvveceq⟩ := scalar_single_hilbert_memLp_and_norm i v hv + have hraw := restricted_raw_holder_vec Q q U hU hUP + (fun x ↦ Pi.single i (U.indicator (fun y ↦ r y * L y) x)) + (fun x ↦ Pi.single i (v x)) hrLvec hvvec + have hdot : ∀ x : Vec d, vecDot (Pi.single i (U.indicator (fun y ↦ r y * L y) x)) + (Pi.single i (v x)) = U.indicator (fun y ↦ r y * L y) x * v x := by + intro x; classical + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hji; simp [hji] + · simp + have hraw' : |∫ x in U, r x * v x * L x ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x ↦ HilbertVec.ofVec + (Pi.single i (U.indicator (fun y ↦ r y * L y) x))) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (v x))) + q.conjugate.exponent (normalizedCubeMeasure Q)).toReal := by + calc + |∫ x in U, r x * v x * L x ∂volume| = + |∫ x in U, vecDot (Pi.single i (U.indicator (fun y ↦ r y * L y) x)) + (Pi.single i (v x)) ∂volume| := by + congr 1; apply setIntegral_congr_fun hU + intro x hx + change r x * v x * L x = vecDot (Pi.single i (U.indicator (fun y ↦ r y * L y) x)) + (Pi.single i (v x)) + rw [hdot]; simp [hx]; ring + _ ≤ _ := hraw + rw [hrLveceq, hvveceq] at hraw' + apply hraw'.trans + have hsmultop : C.toNNReal • eLpNorm r q.exponent + ((normalizedCubeMeasure Q).restrict U) ≠ ∞ := by + rw [ENNReal.smul_def] + exact ENNReal.mul_ne_top ENNReal.coe_ne_top hr.eLpNorm_ne_top + have hnormmono := ENNReal.toReal_mono hsmultop hrLnorm + calc + cubeVolume Q * (eLpNorm (U.indicator (fun x ↦ r x * L x)) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm v q.conjugate.exponent (normalizedCubeMeasure Q)).toReal = + (cubeVolume Q * (eLpNorm v q.conjugate.exponent + (normalizedCubeMeasure Q)).toReal) * + (eLpNorm (U.indicator (fun x ↦ r x * L x)) q.exponent + (normalizedCubeMeasure Q)).toReal := by ring + _ ≤ (cubeVolume Q * (eLpNorm v q.conjugate.exponent + (normalizedCubeMeasure Q)).toReal) * + (C.toNNReal • eLpNorm r q.exponent ((normalizedCubeMeasure Q).restrict U)).toReal := + mul_le_mul_of_nonneg_left hnormmono + (mul_nonneg (cubeVolume_pos Q).le ENNReal.toReal_nonneg) + _ = _ := by ring + +private theorem localized_Aterm_raw_bound + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) (i : Fin d) + (U : Set (Vec d)) (hU : MeasurableSet U) (hUP : U ⊆ openCubeSet Q) + (r : Vec d → ℝ) (V E : Vec d → Vec d) {C : ℝ} (hC : 0 ≤ C) + (hr : MemLp r q.exponent ((normalizedCubeMeasure Q).restrict U)) + (hV : MemLp (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent + (normalizedCubeMeasure Q)) + (hE : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (E x)) + (normalizedCubeMeasure Q)) + (hEbound : ∀ x, ‖HilbertVec.ofVec (E x)‖ ≤ C) : + |∫ x in U, r x * vecDot (V x) (E x) ∂volume| ≤ cubeVolume Q * + (eLpNorm r q.exponent ((normalizedCubeMeasure Q).restrict U)).toReal * + (C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) + q.conjugate.exponent (normalizedCubeMeasure Q)).toReal := by + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let dot : Vec d → ℝ := fun x ↦ vecDot (V x) (E x) + have hdotmeas : AEStronglyMeasurable dot μ := by + have h : AEStronglyMeasurable + (fun x ↦ inner ℝ (HilbertVec.ofVec (V x)) (HilbertVec.ofVec (E x))) μ := + hV.aestronglyMeasurable.inner hE + simpa only [dot, HilbertVec.inner_def] using h + have hdot : MemLp dot q.conjugate.exponent μ := by + refine MemLp.of_le_mul (c := C) hV hdotmeas ?_ + filter_upwards with x + calc + ‖dot x‖ = |inner ℝ (HilbertVec.ofVec (V x)) (HilbertVec.ofVec (E x))| := by + simp only [dot, HilbertVec.inner_def, Real.norm_eq_abs] + _ ≤ ‖HilbertVec.ofVec (V x)‖ * ‖HilbertVec.ofVec (E x)‖ := by + simpa [Real.norm_eq_abs] using norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (V x)) (HilbertVec.ofVec (E x)) + _ ≤ ‖HilbertVec.ofVec (V x)‖ * C := + mul_le_mul_of_nonneg_left (hEbound x) (norm_nonneg _) + _ = C * ‖HilbertVec.ofVec (V x)‖ := by ring + have hrind : MemLp (U.indicator r) q.exponent μ := by + rw [memLp_indicator_iff_restrict hU]; exact hr + have hrindeq : eLpNorm (U.indicator r) q.exponent μ = + eLpNorm r q.exponent (μ.restrict U) := eLpNorm_indicator_eq_eLpNorm_restrict hU + obtain ⟨hrvec, hrveceq⟩ := scalar_single_hilbert_memLp_and_norm i (U.indicator r) hrind + obtain ⟨hdotvec, hdotveceq⟩ := scalar_single_hilbert_memLp_and_norm i dot hdot + have hraw := restricted_raw_holder_vec Q q U hU hUP + (fun x ↦ Pi.single i (U.indicator r x)) (fun x ↦ Pi.single i (dot x)) hrvec hdotvec + have hdot_single : ∀ x : Vec d, vecDot (Pi.single i (U.indicator r x)) + (Pi.single i (dot x)) = U.indicator r x * dot x := by + intro x; classical + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hji; simp [hji] + · simp + have hraw' : |∫ x in U, r x * vecDot (V x) (E x) ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (U.indicator r x))) + q.exponent μ).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (dot x))) + q.conjugate.exponent μ).toReal := by + calc + |∫ x in U, r x * vecDot (V x) (E x) ∂volume| = + |∫ x in U, vecDot (Pi.single i (U.indicator r x)) + (Pi.single i (dot x)) ∂volume| := by + congr 1; apply setIntegral_congr_fun hU + intro x hx + change r x * vecDot (V x) (E x) = + vecDot (Pi.single i (U.indicator r x)) (Pi.single i (dot x)) + rw [hdot_single]; simp [hx, dot] + _ ≤ _ := hraw + rw [hrveceq, hdotveceq, hrindeq] at hraw' + apply hraw'.trans + have hsmultop : C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) + q.conjugate.exponent μ ≠ ∞ := by + rw [ENNReal.smul_def] + exact ENNReal.mul_ne_top ENNReal.coe_ne_top hV.eLpNorm_ne_top + have hdotnorm : eLpNorm dot q.conjugate.exponent μ ≤ C.toNNReal • + eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent μ := by + apply eLpNorm_le_nnreal_smul_eLpNorm_of_ae_le_mul' + filter_upwards with x + rw [enorm_eq_nnnorm, enorm_eq_nnnorm] + apply ENNReal.coe_le_coe.mpr + refine (NNReal.coe_le_coe).mp ?_ + change ‖dot x‖ ≤ (C.toNNReal : ℝ) * ‖HilbertVec.ofVec (V x)‖ + simpa [Real.coe_toNNReal _ hC] using (show ‖dot x‖ ≤ C * ‖HilbertVec.ofVec (V x)‖ by + calc + ‖dot x‖ = |inner ℝ (HilbertVec.ofVec (V x)) (HilbertVec.ofVec (E x))| := by + simp only [dot, HilbertVec.inner_def, Real.norm_eq_abs] + _ ≤ ‖HilbertVec.ofVec (V x)‖ * ‖HilbertVec.ofVec (E x)‖ := by + simpa [Real.norm_eq_abs] using norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (V x)) (HilbertVec.ofVec (E x)) + _ ≤ ‖HilbertVec.ofVec (V x)‖ * C := + mul_le_mul_of_nonneg_left (hEbound x) (norm_nonneg _) + _ = C * ‖HilbertVec.ofVec (V x)‖ := by ring) + have hnormmono := ENNReal.toReal_mono hsmultop hdotnorm + calc + cubeVolume Q * (eLpNorm r q.exponent ((normalizedCubeMeasure Q).restrict U)).toReal * + (eLpNorm dot q.conjugate.exponent μ).toReal = + (cubeVolume Q * (eLpNorm r q.exponent ((normalizedCubeMeasure Q).restrict U)).toReal) * + (eLpNorm dot q.conjugate.exponent μ).toReal := by ring + _ ≤ (cubeVolume Q * (eLpNorm r q.exponent ((normalizedCubeMeasure Q).restrict U)).toReal) * + (C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent μ).toReal := + mul_le_mul_of_nonneg_left hnormmono + (mul_nonneg (cubeVolume_pos Q).le ENNReal.toReal_nonneg) + _ = _ := by ring + +private theorem localized_Eterm_raw_bound + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) (i : Fin d) + (U : Set (Vec d)) (hU : MeasurableSet U) (hUP : U ⊆ openCubeSet Q) + (b E : Vec d → Vec d) (v : Vec d → ℝ) {C : ℝ} (hC : 0 ≤ C) + (hb : MemLp (fun x ↦ HilbertVec.ofVec (b x)) q.exponent (normalizedCubeMeasure Q)) + (hE : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (E x)) (normalizedCubeMeasure Q)) + (hEbound : ∀ x, ‖HilbertVec.ofVec (E x)‖ ≤ C) + (hv : MemLp v q.conjugate.exponent (normalizedCubeMeasure Q)) : + |∫ x in U, v x * vecDot (b x) (E x) ∂volume| ≤ cubeVolume Q * + (C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm v q.conjugate.exponent (normalizedCubeMeasure Q)).toReal := by + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let dot : Vec d → ℝ := fun x ↦ vecDot (b x) (E x) + have hdotmeas : AEStronglyMeasurable dot μ := by + have h : AEStronglyMeasurable + (fun x ↦ inner ℝ (HilbertVec.ofVec (b x)) (HilbertVec.ofVec (E x))) μ := + hb.aestronglyMeasurable.inner hE + simpa only [dot, HilbertVec.inner_def] using h + have hdot : MemLp dot q.exponent μ := by + refine MemLp.of_le_mul (c := C) hb hdotmeas ?_ + filter_upwards with x + calc + ‖dot x‖ = |inner ℝ (HilbertVec.ofVec (b x)) (HilbertVec.ofVec (E x))| := by + simp only [dot, HilbertVec.inner_def, Real.norm_eq_abs] + _ ≤ ‖HilbertVec.ofVec (b x)‖ * ‖HilbertVec.ofVec (E x)‖ := by + simpa [Real.norm_eq_abs] using norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (b x)) (HilbertVec.ofVec (E x)) + _ ≤ ‖HilbertVec.ofVec (b x)‖ * C := + mul_le_mul_of_nonneg_left (hEbound x) (norm_nonneg _) + _ = C * ‖HilbertVec.ofVec (b x)‖ := by ring + obtain ⟨hdotvec, hdotveceq⟩ := scalar_single_hilbert_memLp_and_norm i dot hdot + obtain ⟨hvvec, hvveceq⟩ := scalar_single_hilbert_memLp_and_norm i v hv + have hraw := restricted_raw_holder_vec Q q U hU hUP + (fun x ↦ Pi.single i (dot x)) (fun x ↦ Pi.single i (v x)) hdotvec hvvec + have hdot_single : ∀ x : Vec d, + vecDot (Pi.single i (dot x)) (Pi.single i (v x)) = dot x * v x := by + intro x; classical + rw [vecDot, Finset.sum_eq_single i] + · simp + · intro j _ hji; simp [hji] + · simp + have hraw' : |∫ x in U, v x * vecDot (b x) (E x) ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (dot x))) q.exponent μ).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (Pi.single i (v x))) + q.conjugate.exponent μ).toReal := by + calc + |∫ x in U, v x * vecDot (b x) (E x) ∂volume| = + |∫ x in U, vecDot (Pi.single i (dot x)) (Pi.single i (v x)) ∂volume| := by + congr 1; apply setIntegral_congr_fun hU + intro x _ + change v x * vecDot (b x) (E x) = vecDot (Pi.single i (dot x)) (Pi.single i (v x)) + rw [hdot_single]; simp only [dot]; ring + _ ≤ _ := hraw + rw [hdotveceq, hvveceq] at hraw' + apply hraw'.trans + have hsmultop : C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) + q.exponent μ ≠ ∞ := by + rw [ENNReal.smul_def] + exact ENNReal.mul_ne_top ENNReal.coe_ne_top hb.eLpNorm_ne_top + have hdotnorm : eLpNorm dot q.exponent μ ≤ C.toNNReal • + eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent μ := by + apply eLpNorm_le_nnreal_smul_eLpNorm_of_ae_le_mul' + filter_upwards with x + rw [enorm_eq_nnnorm, enorm_eq_nnnorm] + apply ENNReal.coe_le_coe.mpr + refine (NNReal.coe_le_coe).mp ?_ + change ‖dot x‖ ≤ (C.toNNReal : ℝ) * ‖HilbertVec.ofVec (b x)‖ + simpa [Real.coe_toNNReal _ hC] using (show ‖dot x‖ ≤ C * ‖HilbertVec.ofVec (b x)‖ by + calc + ‖dot x‖ = |inner ℝ (HilbertVec.ofVec (b x)) (HilbertVec.ofVec (E x))| := by + simp only [dot, HilbertVec.inner_def, Real.norm_eq_abs] + _ ≤ ‖HilbertVec.ofVec (b x)‖ * ‖HilbertVec.ofVec (E x)‖ := by + simpa [Real.norm_eq_abs] using norm_inner_le_norm (𝕜 := ℝ) + (HilbertVec.ofVec (b x)) (HilbertVec.ofVec (E x)) + _ ≤ ‖HilbertVec.ofVec (b x)‖ * C := + mul_le_mul_of_nonneg_left (hEbound x) (norm_nonneg _) + _ = C * ‖HilbertVec.ofVec (b x)‖ := by ring) + have hnormmono := ENNReal.toReal_mono hsmultop hdotnorm + calc + cubeVolume Q * (eLpNorm dot q.exponent μ).toReal * + (eLpNorm v q.conjugate.exponent μ).toReal = + (cubeVolume Q * (eLpNorm v q.conjugate.exponent μ).toReal) * + (eLpNorm dot q.exponent μ).toReal := by ring + _ ≤ (cubeVolume Q * (eLpNorm v q.conjugate.exponent μ).toReal) * + (C.toNNReal • eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent μ).toReal := + mul_le_mul_of_nonneg_left hnormmono + (mul_nonneg (cubeVolume_pos Q).le ENNReal.toReal_nonneg) + _ = _ := by ring + +private theorem originCube_parent_volume_ratio + {d : ℕ} (m : ℤ) : + cubeVolume (originCube d (m + 1)) / + cubeVolume (originCube d m) = (3 : ℝ) ^ d := by + have hs : (3 : ℝ) ^ m ≠ 0 := zpow_ne_zero _ (by norm_num) + simp only [cubeVolume, cubeScaleFactor, originCube] + rw [zpow_add₀ (by norm_num : (3 : ℝ) ≠ 0) m 1] + norm_num + field_simp [hs] + ring + +private theorem source_subset_inner_half {d : ℕ} (m : ℤ) : + openCubeSet (originCube d m) ⊆ + scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) := by + rw [← scaledOpenCubeSet_originCube_succ_one_div_three] + exact (scaledOpenCubeSet_subset_scaledClosedCubeSet _ _).trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt _ (by norm_num)) + +private theorem canonical_cutoff_source_one_gradient_zero + {d : ℕ} (m : ℤ) (x : Vec d) (hx : x ∈ openCubeSet (originCube d m)) : + let Qp := originCube d (m + 1) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + η x = 1 ∧ euclideanGradient (η : Vec d → ℝ) x = 0 := by + dsimp + let Qp := originCube d (m + 1) + have hxinner : x ∈ scaledClosedCubeSet Qp (1 / 3 : ℝ) := by + apply scaledOpenCubeSet_subset_scaledClosedCubeSet + simpa only [Qp] using (show x ∈ scaledOpenCubeSet (originCube d (m + 1)) + (1 / 3 : ℝ) by + rw [scaledOpenCubeSet_originCube_succ_one_div_three] + exact hx) + constructor + · exact QuantitativeCubeCutoff.canonicalFun_eq_one_on_inner + (by norm_num) (by norm_num) hxinner + · funext j + change (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Qp (1 / 3 : ℝ) + (5 / 12 : ℝ)) x) (basisVec j) = 0 + apply QuantitativeCubeCutoff.canonicalFun_fderiv_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner + Qp (by norm_num) (by norm_num) + have hxopen : x ∈ scaledOpenCubeSet Qp (1 / 3 : ℝ) := by + rw [show Qp = originCube d (m + 1) by rfl, + scaledOpenCubeSet_originCube_succ_one_div_three] + exact hx + exact hxopen j + +private theorem actual_Jraw_bridge + {d : ℕ} (m : ℤ) (i : Fin d) (R G : Vec d → Vec d) (r : Vec d → ℝ) : + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let Rref := cubeDirichletOddReflectionHessianRowVectorField Q i R + ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * Rref x j + r x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume = + ∫ x in openCubeSet Q, vecDot (G x) (R x) ∂volume := by + dsimp + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let Rref := cubeDirichletOddReflectionHessianRowVectorField Q i R + have hQU : openCubeSet Q ⊆ U := by + simpa only [Q, Qp, U] using source_subset_inner_half (d := d) m + have hQmeas : MeasurableSet (openCubeSet Q) := (isOpen_openCubeSet Q).measurableSet + have hindicator : + (fun x => vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * Rref x j + r x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j))) = + (openCubeSet Q).indicator (fun x => vecDot (G x) + (fun j => η x * Rref x j + r x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j))) := by + funext x + by_cases hx : x ∈ openCubeSet Q <;> simp [openParentDatumExtension, hx, vecDot] + rw [hindicator, indicator_setIntegral_parent_eq_child hQmeas hQU] + refine MeasureTheory.setIntegral_congr_fun hQmeas ?_ + intro x hx + obtain ⟨hη, hgrad⟩ := canonical_cutoff_source_one_gradient_zero m x + (by simpa only [Q] using hx) + have href : Rref x = R x := + cubeDirichletOddReflectionHessianRowVectorField_eq_self_of_mem_openCubeSet Q i R hx + have hderiv : ∀ j : Fin d, (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j) = 0 := + fun j => congrFun hgrad j + simp only [hderiv, mul_zero, add_zero, href] + change η x = 1 at hη + have hscale : (fun j => η x * R x j) = R x := by + funext j; rw [hη]; ring + rw [hscale] + +private theorem localized_Dterm_raw_bound + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) + (U : Set (Vec d)) (hU : MeasurableSet U) (hUP : U ⊆ openCubeSet Q) + (η : Vec d → ℝ) (b V : Vec d → Vec d) + (hb : MemLp (fun x ↦ HilbertVec.ofVec (b x)) q.exponent + (normalizedCubeMeasure Q)) + (hV : MemLp (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent + (normalizedCubeMeasure Q)) + (hη : AEStronglyMeasurable η (normalizedCubeMeasure Q)) + (hηbound : ∀ x, 0 ≤ η x ∧ η x ≤ 1) : + |∫ x in U, η x * vecDot (b x) (V x) ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent + (normalizedCubeMeasure Q)).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent + (normalizedCubeMeasure Q)).toReal := by + let μ : Measure (Vec d) := normalizedCubeMeasure Q + let B : Vec d → Vec d := fun x ↦ η x • b x + have hbvec : AEStronglyMeasurable b μ := + (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable + hb.aestronglyMeasurable + have hBmeas : AEStronglyMeasurable (fun x ↦ HilbertVec.ofVec (B x)) μ := by + have hsmul : AEStronglyMeasurable (fun x ↦ η x • b x) μ := hη.smul hbvec + exact (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable hsmul + have hB : MemLp (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ := by + refine MemLp.of_le_mul (c := 1) hb hBmeas ?_ + filter_upwards with x + change ‖(HilbertVec.ofVecL d) (η x • b x)‖ ≤ 1 * ‖(HilbertVec.ofVecL d) (b x)‖ + rw [(HilbertVec.ofVecL d).map_smul, norm_smul, Real.norm_eq_abs, + abs_of_nonneg (hηbound x).1, one_mul] + exact mul_le_of_le_one_left (norm_nonneg _) (hηbound x).2 + have hBnorm : eLpNorm (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ ≤ + eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent μ := by + apply eLpNorm_mono_ae + filter_upwards with x + change ‖(HilbertVec.ofVecL d) (η x • b x)‖ ≤ ‖(HilbertVec.ofVecL d) (b x)‖ + rw [(HilbertVec.ofVecL d).map_smul, norm_smul, Real.norm_eq_abs, + abs_of_nonneg (hηbound x).1] + exact mul_le_of_le_one_left (norm_nonneg _) (hηbound x).2 + have hraw := restricted_raw_holder_vec Q q U hU hUP B V hB hV + have hraw' : |∫ x in U, η x * vecDot (b x) (V x) ∂volume| ≤ cubeVolume Q * + (eLpNorm (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent μ).toReal := by + calc + |∫ x in U, η x * vecDot (b x) (V x) ∂volume| = + |∫ x in U, vecDot (B x) (V x) ∂volume| := by + congr 1; apply setIntegral_congr_fun hU + intro x _ + change η x * vecDot (b x) (V x) = vecDot (η x • b x) (V x) + simp only [vecDot_smul_left] + _ ≤ _ := hraw + apply hraw'.trans + have hnormmono : (eLpNorm (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ).toReal ≤ + (eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent μ).toReal := + ENNReal.toReal_mono hb.eLpNorm_ne_top hBnorm + calc + cubeVolume Q * (eLpNorm (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ).toReal * + (eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) q.conjugate.exponent μ).toReal = + (cubeVolume Q * (eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) + q.conjugate.exponent μ).toReal) * + (eLpNorm (fun x ↦ HilbertVec.ofVec (B x)) q.exponent μ).toReal := by ring + _ ≤ (cubeVolume Q * (eLpNorm (fun x ↦ HilbertVec.ofVec (V x)) + q.conjugate.exponent μ).toReal) * + (eLpNorm (fun x ↦ HilbertVec.ofVec (b x)) q.exponent μ).toReal := + mul_le_mul_of_nonneg_left hnormmono + (mul_nonneg (cubeVolume_pos Q).le ENNReal.toReal_nonneg) + _ = _ := by ring + +private theorem raw_source_pairing_eq_volume_mul_normalized + {d : ℕ} (m : ℤ) (R G : Vec d → Vec d) : + (∫ x in openCubeSet (originCube d m), vecDot (G x) (R x) ∂volume) = + cubeVolume (originCube d m) * + ∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure (originCube d m) := by + let Q := originCube d m + let Jraw : ℝ := ∫ x in openCubeSet Q, vecDot (G x) (R x) ∂volume + let Jnorm : ℝ := ∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q + have hμ : normalizedCubeMeasure Q = ENNReal.ofReal ((cubeVolume Q)⁻¹) • + volume.restrict (openCubeSet Q) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + have hJnorm : Jnorm = (cubeVolume Q)⁻¹ * Jraw := by + change ∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q = _ + rw [hμ] + simp only [Jraw, integral_smul_measure, smul_eq_mul, + ENNReal.toReal_ofReal (inv_nonneg.mpr (cubeVolume_pos Q).le)] + have hJraw : Jraw = cubeVolume Q * Jnorm := by + rw [hJnorm] + field_simp [(cubeVolume_pos Q).ne'] + simpa only [Q, Jraw, Jnorm] using hJraw + +private theorem actual_Jraw_eq_source_volume_mul_normalized + {d : ℕ} (m : ℤ) (i : Fin d) (R G : Vec d → Vec d) (r : Vec d → ℝ) : + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let Rref := cubeDirichletOddReflectionHessianRowVectorField Q i R + ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * Rref x j + r x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume = + cubeVolume Q * ∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q := by + dsimp + rw [actual_Jraw_bridge] + exact raw_source_pairing_eq_volume_mul_normalized m R G + +private theorem htrunc_of_raw_four_terms + {V J D E A H BD BE BA BH : ℝ} {T K : ℝ≥0∞} + (hV : 0 < V) (hKtop : K ≠ ∞) + (hT : T = ENNReal.ofReal J) + (hid : V * J = D + E - 2 * A - H) + (hD : |D| ≤ V * BD) (hE : |E| ≤ V * BE) + (hA : |A| ≤ V * BA) (hH : |H| ≤ V * BH) + {X : ℝ} (hsum : BD + BE + 2 * BA + BH ≤ K.toReal * X) : + T ≠ ∞ ∧ T ≤ K * ENNReal.ofReal X := by + have hid' : J = D / V + E / V - 2 * (A / V) - H / V := by + field_simp [hV.ne'] at hid ⊢ + linarith + have hD' : |D / V| ≤ BD := by + rw [abs_div, abs_of_pos hV] + apply (div_le_iff₀ hV).mpr + simpa [mul_comm] using hD + have hE' : |E / V| ≤ BE := by + rw [abs_div, abs_of_pos hV] + apply (div_le_iff₀ hV).mpr + simpa [mul_comm] using hE + have hA' : |A / V| ≤ BA := by + rw [abs_div, abs_of_pos hV] + apply (div_le_iff₀ hV).mpr + simpa [mul_comm] using hA + have hH' : |H / V| ≤ BH := by + rw [abs_div, abs_of_pos hV] + apply (div_le_iff₀ hV).mpr + simpa [mul_comm] using hH + have hraw : J ≤ K.toReal * X := + (localized_four_term_bound hid' hD' hE' hA' hH').trans hsum + constructor + · rw [hT] + exact ENNReal.ofReal_ne_top + · have hKreal : 0 ≤ K.toReal := ENNReal.toReal_nonneg + calc + T = ENNReal.ofReal J := hT + _ ≤ ENNReal.ofReal (K.toReal * X) := ENNReal.ofReal_le_ofReal hraw + _ = K * ENNReal.ofReal X := by + rw [ENNReal.ofReal_mul hKreal, ENNReal.ofReal_toReal hKtop] + +/-- The literal source pairing does not depend on the row-value representative +beside `∇η`: both parent expressions collapse to the same source pairing. -/ +private theorem actual_Jraw_congr_row_value + {d : ℕ} (m : ℤ) (i : Fin d) (R G : Vec d → Vec d) + (r₁ r₂ : Vec d → ℝ) : + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let Rref := cubeDirichletOddReflectionHessianRowVectorField Q i R + (∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * Rref x j + r₁ x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume) = + ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * Rref x j + r₂ x * + (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume := by + dsimp + rw [actual_Jraw_bridge, actual_Jraw_bridge] + +/-- Scalar collection of the four Holder bounds after raw-volume division. +The scale factors `ss`, `sp` are kept explicit so the cutoff cancellations +are audited before selecting the final ENNReal coefficient. -/ +private theorem coefficient_algebra_after_raw_division + {D E A Hterm : ℝ} {Fq Vgrad Vval Rval : ℝ≥0∞} + {ratio Kg Kl kg kl Ccz P Csrc ss sp F Nn : ℝ} + (hratio : 0 ≤ ratio) (hKg : 0 ≤ Kg) (hKl : 0 ≤ Kl) + (hCcz : 0 ≤ Ccz) (hP : 0 ≤ P) (hCsrc : 0 ≤ Csrc) + (hss : 0 ≤ ss) (hF : 0 ≤ F) (hNn : 0 ≤ Nn) + (hFq : Fq.toReal ≤ F) + (hgrad : Vgrad.toReal ≤ Ccz * Nn) + (hval : Vval.toReal ≤ P * sp * Ccz * Nn) + (hrow : Rval.toReal ≤ Csrc * ss * F) + (hKgsp : Kg * sp ≤ kg) (hKgss : Kg * ss ≤ kg) + (hKlsssp : Kl * ss * sp ≤ kl) + (hD : |D| ≤ ratio * Fq.toReal * Vgrad.toReal) + (hE : |E| ≤ ratio * (Kg.toNNReal • Fq).toReal * Vval.toReal) + (hA : |A| ≤ ratio * Rval.toReal * (Kg.toNNReal • Vgrad).toReal) + (hH : |Hterm| ≤ ratio * (Kl.toNNReal • Rval).toReal * Vval.toReal) : + |D| + |E| + 2 * |A| + |Hterm| ≤ + (ratio * Ccz * (1 + kg * P + 2 * kg * Csrc + kl * Csrc * P) * F) * Nn := by + have hsmulF : (Kg.toNNReal • Fq).toReal = Kg * Fq.toReal := by + rw [ENNReal.smul_def, smul_eq_mul, ENNReal.toReal_mul] + rw [ENNReal.coe_toReal, Real.coe_toNNReal _ hKg] + have hsmulV : (Kg.toNNReal • Vgrad).toReal = Kg * Vgrad.toReal := by + rw [ENNReal.smul_def, smul_eq_mul, ENNReal.toReal_mul] + rw [ENNReal.coe_toReal, Real.coe_toNNReal _ hKg] + have hsmulR : (Kl.toNNReal • Rval).toReal = Kl * Rval.toReal := by + rw [ENNReal.smul_def, smul_eq_mul, ENNReal.toReal_mul] + rw [ENNReal.coe_toReal, Real.coe_toNNReal _ hKl] + rw [hsmulF] at hE + rw [hsmulV] at hA + rw [hsmulR] at hH + have hD' : |D| ≤ ratio * Ccz * F * Nn := by + calc + |D| ≤ ratio * Fq.toReal * Vgrad.toReal := hD + _ ≤ ratio * F * (Ccz * Nn) := by gcongr + _ = ratio * Ccz * F * Nn := by ring + have hE' : |E| ≤ ratio * Ccz * (kg * P) * F * Nn := by + calc + |E| ≤ ratio * (Kg * Fq.toReal) * Vval.toReal := hE + _ ≤ ratio * (Kg * F) * (P * sp * Ccz * Nn) := by gcongr + _ = ratio * Ccz * F * Nn * (P * (Kg * sp)) := by ring + _ ≤ ratio * Ccz * F * Nn * (P * kg) := by gcongr + _ = ratio * Ccz * (kg * P) * F * Nn := by ring + have hA' : |A| ≤ ratio * Ccz * (kg * Csrc) * F * Nn := by + calc + |A| ≤ ratio * Rval.toReal * (Kg * Vgrad.toReal) := hA + _ ≤ ratio * (Csrc * ss * F) * (Kg * (Ccz * Nn)) := by gcongr + _ = ratio * Ccz * F * Nn * (Csrc * (Kg * ss)) := by ring + _ ≤ ratio * Ccz * F * Nn * (Csrc * kg) := by gcongr + _ = ratio * Ccz * (kg * Csrc) * F * Nn := by ring + have hH' : |Hterm| ≤ ratio * Ccz * (kl * Csrc * P) * F * Nn := by + calc + |Hterm| ≤ ratio * (Kl * Rval.toReal) * Vval.toReal := hH + _ ≤ ratio * (Kl * (Csrc * ss * F)) * (P * sp * Ccz * Nn) := by gcongr + _ = ratio * Ccz * F * Nn * (Csrc * P * (Kl * ss * sp)) := by ring + _ ≤ ratio * Ccz * F * Nn * (Csrc * P * kl) := by gcongr + _ = ratio * Ccz * (kl * Csrc * P) * F * Nn := by ring + calc + |D| + |E| + 2 * |A| + |Hterm| ≤ ratio * Ccz * F * Nn + + ratio * Ccz * (kg * P) * F * Nn + + 2 * (ratio * Ccz * (kg * Csrc) * F * Nn) + + ratio * Ccz * (kl * Csrc * P) * F * Nn := by gcongr + _ = _ := by ring + +/-- The exact per-row `htrunc` closure once the four *raw* mutual-testing +terms have been bounded. The raw parent pairing is normalized through the +canonical cutoff/reflection bridge before it is identified with the source +radial moment. -/ +private theorem source_hessian_row_htrunc_of_raw_term_bounds + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (Hsrc : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) {K : ℝ≥0∞} (hKtop : K ≠ ∞) + (hterms : ∀ n : ℕ, ∃ (D E A Hterm BD BE BA BH : ℝ), + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let R : Vec d → Vec d := fun x j => Hsrc.hess i j x + let G := (sourceHessianRowRadialDatum q Hsrc i n).toField + let r : Vec d → ℝ := fun _ => 0 + let Jraw := ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * + cubeDirichletOddReflectionHessianRowVectorField Q i R x j + + r x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume + Jraw = D + E - 2 * A - Hterm ∧ + |D| ≤ cubeVolume Q * BD ∧ |E| ≤ cubeVolume Q * BE ∧ + |A| ≤ cubeVolume Q * BA ∧ |Hterm| ≤ cubeVolume Q * BH ∧ + BD + BE + 2 * BA + BH ≤ K.toReal * + ((∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => Hsrc.hess i j x)) x ∂ + normalizedCubeMeasure Q) ^ (1 - q.exponent.toReal⁻¹)).toReal) : + ∀ n : ℕ, + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => Hsrc.hess i j x)) x ∂ + normalizedCubeMeasure (originCube d m)) ≠ ∞ ∧ + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => Hsrc.hess i j x)) x ∂ + normalizedCubeMeasure (originCube d m)) ≤ K * + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => Hsrc.hess i j x)) x ∂ + normalizedCubeMeasure (originCube d m)) ^ + (1 - q.exponent.toReal⁻¹) := by + intro n + obtain ⟨D, E, A, Hterm, BD, BE, BA, BH, hid, hD, hE, hA, hH, hsum⟩ := hterms n + let Q := originCube d m + let R : Vec d → Vec d := fun x j => Hsrc.hess i j x + let G := (sourceHessianRowRadialDatum q Hsrc i n).toField + let T : ℝ≥0∞ := ∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (R x)) x ∂normalizedCubeMeasure Q + have hmoment := source_hessian_row_radial_pairing_moment q Hsrc i n + have hT : T = ENNReal.ofReal (∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q) := by + simpa only [T, R, G, vecDot_comm] using! hmoment + have hJ : cubeVolume Q * + (∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q) = + D + E - 2 * A - Hterm := by + rw [← actual_Jraw_eq_source_volume_mul_normalized] + simpa only [Q, R, G] using hid + have hTtop : T ≠ ∞ := by + rw [hT] + exact ENNReal.ofReal_ne_top + have hid' : (∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q) = + D / cubeVolume Q + E / cubeVolume Q - 2 * (A / cubeVolume Q) - + Hterm / cubeVolume Q := by + field_simp [(cubeVolume_pos Q).ne'] at hJ ⊢ + linarith + have hD' : |D / cubeVolume Q| ≤ BD := by + rw [abs_div, abs_of_pos (cubeVolume_pos Q)] + apply (div_le_iff₀ (cubeVolume_pos Q)).mpr + simpa [mul_comm] using hD + have hE' : |E / cubeVolume Q| ≤ BE := by + rw [abs_div, abs_of_pos (cubeVolume_pos Q)] + apply (div_le_iff₀ (cubeVolume_pos Q)).mpr + simpa [mul_comm] using hE + have hA' : |A / cubeVolume Q| ≤ BA := by + rw [abs_div, abs_of_pos (cubeVolume_pos Q)] + apply (div_le_iff₀ (cubeVolume_pos Q)).mpr + simpa [mul_comm] using hA + have hH' : |Hterm / cubeVolume Q| ≤ BH := by + rw [abs_div, abs_of_pos (cubeVolume_pos Q)] + apply (div_le_iff₀ (cubeVolume_pos Q)).mpr + simpa [mul_comm] using hH + have hraw : (∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q) ≤ + K.toReal * (T ^ (1 - q.exponent.toReal⁻¹)).toReal := by + exact (localized_four_term_bound hid' hD' hE' hA' hH').trans hsum + constructor + · simpa only [Q, T] using hTtop + · have hpow_nonneg : 0 ≤ 1 - q.exponent.toReal⁻¹ := by + exact sub_nonneg.mpr (inv_le_one_of_one_le₀ (le_of_lt (by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt))) + have hpowtop : T ^ (1 - q.exponent.toReal⁻¹) ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg hpow_nonneg hTtop + calc + T = ENNReal.ofReal (∫ x, vecDot (G x) (R x) ∂normalizedCubeMeasure Q) := hT + _ ≤ ENNReal.ofReal (K.toReal * + (T ^ (1 - q.exponent.toReal⁻¹)).toReal) := ENNReal.ofReal_le_ofReal hraw + _ = K * T ^ (1 - q.exponent.toReal⁻¹) := by + rw [ENNReal.ofReal_mul ENNReal.toReal_nonneg, + ENNReal.ofReal_toReal hKtop, ENNReal.ofReal_toReal hpowtop] + +private theorem actual_mutual_identity_package + {d : ℕ} [NeZero d] {m : ℤ} (q : FiniteLpExponent) + {F : Vec d → ℝ} + (hF : MemLp F 2 (normalizedCubeMeasure (originCube d m))) + (hFq : MemLp F q.exponent (normalizedCubeMeasure (originCube d m))) + {B : ℝ≥0∞} (hBtop : B < ∞) + {u : H10Function (openCubeSet (originCube d m))} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function) + (i : Fin d) + (hgrad : eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ B) + (n : ℕ) : + ∃ (r : H1Function (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (b : Vec d → Vec d) + (v : H10Function (openCubeSet (originCube d (m + 1)))) + (η : QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) (5 / 12 : ℝ)), + let U := scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ) + let R := fun x j ↦ H.hess i j x + let GP := (sourceParentFiniteLpExtension m q.conjugate (sourceHessianRowRadialDatum q H i n)).toField + η = QuantitativeCubeCutoff.canonical (originCube d (m + 1)) + (1 / 3 : ℝ) (5 / 12 : ℝ) (by norm_num) (by norm_num) ∧ + (hilbertifyVecField r.grad =ᵐ[volume.restrict U] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) ∧ + b = (fun x j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F x else 0) ∧ + v = openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) GP + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate + (sourceHessianRowRadialDatum q H i n)) ∧ + MemLp (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ∧ + eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) = + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) ∧ + MemLp r.toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) ∧ + eLpNorm r.toFun q.exponent + ((normalizedCubeMeasure (originCube d (m + 1))).restrict U) ≤ B ∧ + (∫ x in U, vecDot (GP x) + (fun j ↦ η x * r.grad x j + r x * euclideanGradient (η : Vec d → ℝ) x j) + ∂volume) = + (∫ x in U, η x * vecDot (b x) (v.toH1Function.grad x) ∂volume) + + (∫ x in U, v x * vecDot (b x) (euclideanGradient (η : Vec d → ℝ) x) + ∂volume) - + 2 * (∫ x in U, r x * vecDot (v.toH1Function.grad x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume) - + (∫ x in U, r x * v x * euclideanCoordLaplacian (η : Vec d → ℝ) x + ∂volume) := by + let Qp : TriadicCube d := originCube d (m + 1) + let U : Set (Vec d) := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let R : Vec d → Vec d := fun x j ↦ H.hess i j x + let G := sourceHessianRowRadialDatum q H i n + let GP := sourceParentFiniteLpExtension m q.conjugate G + let v : H10Function (openCubeSet Qp) := openCubeSetScalarDivergenceSolution Qp + (by norm_num : (0 : ℝ) < 1) GP.toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G) + obtain ⟨r, b, hrow, hb2, hrowid, hbeq, hbq, hbNorm, hrq, hrNorm⟩ := + exists_reflected_source_row_setup q hF hFq hBtop hweak H i hgrad + let η : QuantitativeCubeCutoff Qp (1 / 3 : ℝ) (5 / 12 : ℝ) := + QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + have hU : IsOpenBoundedConvexDomain U := + isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp (by norm_num) + have hUP : U ⊆ openCubeSet Qp := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Qp + (ρ := 1 / 2) (by norm_num) (by norm_num) + intro j; exact le_of_lt (hx j) + have hηsub : tsupport (η : Vec d → ℝ) ⊆ U := by + exact (η.tsupport_subset_scaledClosedCubeSet_of_support_subset).trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp (by norm_num)) + let vU : H1Function U := v.toH1Function.restrict hU.isOpen hUP + have hrowH10 : ∀ φ : H10Function U, + ∫ x in U, vecDot (r.grad x) (φ.toH1Function.grad x) ∂volume = + -∫ x in U, vecDot (b x) (φ.toH1Function.grad x) ∂volume := by + let : IsFiniteMeasure (volume.restrict U) := by + simpa using hU.isFiniteMeasure_restrict_volume + simpa only [one_mul] using + weak_divergence_identity_of_h10 r b hb2 1 (by + simpa only [one_mul] using hrow) + have hrow' := row_weak_test_expanded hU r vU b (η : Vec d → ℝ) + η.smooth η.hasCompactSupport hηsub hb2 hrowH10 + have hparent : ∀ ψ : H10Function (openCubeSet Qp), + ∫ x in openCubeSet Qp, vecDot (v.toH1Function.grad x) + (ψ.toH1Function.grad x) ∂volume = + -∫ x in openCubeSet Qp, vecDot (GP.toField x) + (ψ.toH1Function.grad x) ∂volume := by + intro ψ + simpa only [v, one_mul] using openCubeSetScalarDivergenceSolution_weak Qp + (by norm_num : (0 : ℝ) < 1) GP.toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G) ψ + have hparent' := parent_weak_test_expanded (U := U) (P := openCubeSet Qp) + hU (isOpen_openCubeSet Qp) hUP r v.toH1Function + GP.toField (η : Vec d → ℝ) η.smooth η.hasCompactSupport hηsub hparent + have hibp := h1_cutoff_integration_by_parts hU r vU η.smooth + η.hasCompactSupport hηsub + dsimp only at hrow' hparent' hibp + have hIcomm : + (∫ x in U, η x * vecDot (r.grad x) (vU.grad x) ∂volume) = + ∫ x in U, η x * vecDot (v.toH1Function.grad x) (r.grad x) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [vU, H1Function.restrict] + rw [vecDot_comm] + have hCibp : + (∫ x in U, vU x * vecDot (r.grad x) (euclideanGradient (η : Vec d → ℝ) x) + ∂volume) = + -(∫ x in U, r x * vecDot (v.toH1Function.grad x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume) - + ∫ x in U, r x * v x * euclideanCoordLaplacian (η : Vec d → ℝ) x ∂volume := by + simpa only [vU, H1Function.restrict] using hibp + rw [hIcomm] at hrow' + have hCibp' : + (∫ x in U, v.toH1Function x * vecDot (r.grad x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume) = + -(∫ x in U, r x * vecDot (v.toH1Function.grad x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume) - + ∫ x in U, r x * v.toH1Function x * + euclideanCoordLaplacian (η : Vec d → ℝ) x ∂volume := by + simpa only [vU, H1Function.restrict] using hCibp + refine ⟨r, b, v, η, rfl, ?_, ?_, rfl, hbq, hbNorm, hrq, hrNorm, ?_⟩ + · simpa only [U, R] using hrowid + · exact hbeq + · exact mutual_raw_identity hrow' hparent' hCibp' + +/-- Concrete four-term witness from the reflected row and the parent adjoint +solution. All terms in the mutual identity receive their actual localized +Holder bounds. -/ +private theorem actual_mutual_raw_term_bounds + {d : ℕ} [NeZero d] {m : ℤ} (q : FiniteLpExponent) + {F : Vec d → ℝ} + (hF : MemLp F 2 (normalizedCubeMeasure (originCube d m))) + (hFq : MemLp F q.exponent (normalizedCubeMeasure (originCube d m))) + {B : ℝ≥0∞} (hBtop : B < ∞) + {u : H10Function (openCubeSet (originCube d m))} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function) + (i : Fin d) + (hgrad : eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ B) + {Ccz P : ℝ≥0∞} + (hAdj : ∀ (m : ℤ) (h : CubeEuclideanL2LpField (originCube d m) q.conjugate), + let hP := sourceParentFiniteLpExtension m q.conjugate h + let v := openCubeSetScalarDivergenceSolution (originCube d (m + 1)) + (by norm_num : (0 : ℝ) < 1) hP.toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate h) + eLpNorm v.toH1Function.toFun q.conjugate.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * + eLpNorm (hilbertifyVecField h.toField) q.conjugate.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (hilbertifyVecField v.toH1Function.grad) q.conjugate.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ≤ + Ccz * eLpNorm (hilbertifyVecField h.toField) q.conjugate.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + MemLp (hilbertifyVecField v.toH1Function.grad) q.conjugate.exponent + (normalizedCubeMeasure (originCube d (m + 1))) ∧ + MemLp v.toH1Function.toFun q.conjugate.exponent + (normalizedCubeMeasure (originCube d (m + 1)))) + (n : ℕ) : + ∃ (r : H1Function (scaledOpenCubeSet (originCube d (m + 1)) (1 / 2 : ℝ))) + (b : Vec d → Vec d) (D E A Hterm : ℝ), + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let G := sourceHessianRowRadialDatum q H i n + let GP := sourceParentFiniteLpExtension m q.conjugate G + let v := openCubeSetScalarDivergenceSolution Qp (by norm_num : (0 : ℝ) < 1) + GP.toField (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G) + (hilbertifyVecField r.grad =ᵐ[volume.restrict U] + fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField (originCube d m) i + (fun y j ↦ H.hess i j y) x)) ∧ + b = (fun x j ↦ if j = i then + cubeDirichletOddReflectionScalar (originCube d m) F x else 0) ∧ + (∫ x in U, vecDot (GP.toField x) + (fun j ↦ η x * + cubeDirichletOddReflectionHessianRowVectorField (originCube d m) i + (fun y j ↦ H.hess i j y) x j + + r x * euclideanGradient (η : Vec d → ℝ) x j) + ∂volume) = D + E - 2 * A - Hterm ∧ + |D| ≤ cubeVolume Qp * + (eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure Qp)).toReal * + (eLpNorm (hilbertifyVecField v.toH1Function.grad) q.conjugate.exponent + (normalizedCubeMeasure Qp)).toReal ∧ + |E| ≤ cubeVolume Qp * + (((d : ℝ) * (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp))).toNNReal • + eLpNorm (hilbertifyVecField b) q.exponent + (normalizedCubeMeasure Qp)).toReal * + (eLpNorm v.toH1Function.toFun q.conjugate.exponent + (normalizedCubeMeasure Qp)).toReal ∧ + |A| ≤ cubeVolume Qp * + (eLpNorm r.toFun q.exponent ((normalizedCubeMeasure Qp).restrict U)).toReal * + (((d : ℝ) * (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp))).toNNReal • + eLpNorm (hilbertifyVecField v.toH1Function.grad) q.conjugate.exponent + (normalizedCubeMeasure Qp)).toReal ∧ + |Hterm| ≤ cubeVolume Qp * + (((d : ℝ) * (quantitativeCubeCutoffHessianConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp) ^ 2)).toNNReal • + eLpNorm r.toFun q.exponent ((normalizedCubeMeasure Qp).restrict U)).toReal * + (eLpNorm v.toH1Function.toFun q.conjugate.exponent + (normalizedCubeMeasure Qp)).toReal ∧ + eLpNorm (hilbertifyVecField b) q.exponent (normalizedCubeMeasure Qp) = + eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm r.toFun q.exponent ((normalizedCubeMeasure Qp).restrict U) ≤ B ∧ + eLpNorm v.toH1Function.toFun q.conjugate.exponent + (normalizedCubeMeasure Qp) ≤ + P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * + eLpNorm (hilbertifyVecField G.toField) q.conjugate.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (hilbertifyVecField v.toH1Function.grad) q.conjugate.exponent + (normalizedCubeMeasure Qp) ≤ + Ccz * eLpNorm (hilbertifyVecField G.toField) q.conjugate.exponent + (normalizedCubeMeasure (originCube d m)) := by + let Qp : TriadicCube d := originCube d (m + 1) + let U : Set (Vec d) := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let G := sourceHessianRowRadialDatum q H i n + let GP := sourceParentFiniteLpExtension m q.conjugate G + let v : H10Function (openCubeSet Qp) := openCubeSetScalarDivergenceSolution Qp + (by norm_num : (0 : ℝ) < 1) GP.toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G) + obtain ⟨hvval, hvgradBound, hvgrad, hvfun⟩ := hAdj m G + obtain ⟨r, b, v', η, hηeq, hrowid, hbeq, hv', hbq, hbNorm, hrq, hrNorm, hid⟩ := + actual_mutual_identity_package q hF hFq hBtop hweak H i hgrad n + subst v' + let D : ℝ := ∫ x in U, η x * vecDot (b x) (v.toH1Function.grad x) ∂volume + let E : ℝ := ∫ x in U, v x * vecDot (b x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume + let A : ℝ := ∫ x in U, r x * vecDot (v.toH1Function.grad x) + (euclideanGradient (η : Vec d → ℝ) x) ∂volume + let Hterm : ℝ := ∫ x in U, r x * v x * + euclideanCoordLaplacian (η : Vec d → ℝ) x ∂volume + have hU : IsOpenBoundedConvexDomain U := + isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp (by norm_num) + have hUP : U ⊆ openCubeSet Qp := by + intro x hx + apply scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Qp + (ρ := 1 / 2) (by norm_num) (by norm_num) + intro j; exact le_of_lt (hx j) + have hηmeas : AEStronglyMeasurable (η : Vec d → ℝ) + (normalizedCubeMeasure Qp) := η.smooth.continuous.aestronglyMeasurable + have hEmeas : AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (euclideanGradient (η : Vec d → ℝ) x)) + (normalizedCubeMeasure Qp) := by + apply Continuous.aestronglyMeasurable + apply (HilbertVec.ofVecL d).continuous.comp + exact continuous_pi fun j => (contDiff_euclideanCoordDeriv η.smooth j).continuous + have hD := localized_Dterm_raw_bound Qp q U hU.isOpen.measurableSet hUP + (η : Vec d → ℝ) b v.toH1Function.grad + hbq + hvgrad hηmeas (fun x => ⟨η.nonneg x, η.le_one x⟩) + let Kg : ℝ := (d : ℝ) * (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp)) + have hKg : 0 ≤ Kg := by + exact (norm_nonneg (HilbertVec.ofVec (euclideanGradient (η : Vec d → ℝ) 0))).trans + (by simpa only [Kg] using quantitativeCubeCutoff_hilbertGradient_bound η 0) + have hgradbound : ∀ x, ‖HilbertVec.ofVec + (euclideanGradient (η : Vec d → ℝ) x)‖ ≤ Kg := by + intro x + simpa only [Kg] using quantitativeCubeCutoff_hilbertGradient_bound η x + have hE := localized_Eterm_raw_bound Qp q i U hU.isOpen.measurableSet hUP b + (euclideanGradient (η : Vec d → ℝ)) v.toH1Function.toFun hKg hbq hEmeas + hgradbound hvfun + have hA := localized_Aterm_raw_bound Qp q i U hU.isOpen.measurableSet hUP r + v.toH1Function.grad (euclideanGradient (η : Vec d → ℝ)) hKg hrq hvgrad hEmeas + hgradbound + have hLmeas : AEStronglyMeasurable (euclideanCoordLaplacian (η : Vec d → ℝ)) + (normalizedCubeMeasure Qp) := + (contDiff_euclideanCoordLaplacian η.smooth).continuous.aestronglyMeasurable + let Kl : ℝ := (d : ℝ) * (quantitativeCubeCutoffHessianConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp) ^ 2) + have hKl : 0 ≤ Kl := by + exact (abs_nonneg (euclideanCoordLaplacian (η : Vec d → ℝ) 0)).trans + (by simpa only [Kl] using quantitativeCubeCutoff_euclideanCoordLaplacian_bound η 0) + have hlapbound : ∀ x, |euclideanCoordLaplacian (η : Vec d → ℝ) x| ≤ Kl := by + intro x + simpa only [Kl] using quantitativeCubeCutoff_euclideanCoordLaplacian_bound η x + have hH := localized_Hterm_raw_bound Qp q i U hU.isOpen.measurableSet hUP r + v.toH1Function.toFun (euclideanCoordLaplacian (η : Vec d → ℝ)) hKl hrq hLmeas.restrict + hlapbound hvfun + refine ⟨r, b, D, E, A, Hterm, hrowid, hbeq, ?_, ?_, ?_, ?_, ?_, hbNorm, hrNorm, + hvval, ?_⟩ + · let Rref : Vec d → Vec d := + cubeDirichletOddReflectionHessianRowVectorField (originCube d m) i + (fun y j ↦ H.hess i j y) + have hrowid' : r.grad =ᵐ[volume.restrict U] Rref := by + filter_upwards [hrowid] with x hx + apply_fun (fun z : HilbertVec d ↦ z.toVec) at hx + simpa only [HilbertVec.toVec_ofVec] using! hx + have hleft : + (∫ x in U, vecDot (GP.toField x) + (fun j ↦ η x * Rref x j + r x * + euclideanGradient (η : Vec d → ℝ) x j) ∂volume) = + ∫ x in U, vecDot (GP.toField x) + (fun j ↦ η x * r.grad x j + r x * + euclideanGradient (η : Vec d → ℝ) x j) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hrowid'] with x hx + simp only [hx] + rw [← hηeq] + calc + (∫ x in U, vecDot (GP.toField x) + (fun j ↦ η x * Rref x j + r x * + euclideanGradient (η : Vec d → ℝ) x j) ∂volume) = + ∫ x in U, vecDot (GP.toField x) + (fun j ↦ η x * r.grad x j + r x * + euclideanGradient (η : Vec d → ℝ) x j) ∂volume := hleft + _ = D + E - 2 * A - Hterm := by + simpa only [Qp, U, G, GP, v, D, E, A, Hterm] using hid + · simpa only [D] using! hD + · simpa only [E, Kg] using! hE + · simpa only [A, Kg] using! hA + · simpa only [Hterm, Kl] using hH + · exact hvgradBound + +private theorem cutoff_gradient_parent_scale_eq + {d : ℕ} (m : ℤ) : + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) * + centeredCubeScale (m + 1) = + (24 : ℝ) * d * quantitativeCubeCutoffGradientConst d := by + let s : ℝ := (3 : ℝ) ^ m + have hspos : 0 < s := by dsimp [s]; exact zpow_pos (by norm_num) m + have hsne : s ≠ 0 := hspos.ne' + have hparent : cubeRadius (originCube d (m + 1)) = (3 / 2 : ℝ) * s := by + dsimp [cubeRadius, cubeScaleFactor, originCube, s] + rw [zpow_add₀] + · norm_num; ring + · norm_num + change (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) * (3 : ℝ) ^ (m + 1) = _ + rw [hparent, zpow_add₀] + · norm_num + field_simp [hsne] + ring + · norm_num + +private theorem cutoff_gradient_source_scale_eq + {d : ℕ} (m : ℤ) : + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) * + centeredCubeScale m = + (8 : ℝ) * d * quantitativeCubeCutoffGradientConst d := by + let s : ℝ := (3 : ℝ) ^ m + have hspos : 0 < s := by dsimp [s]; exact zpow_pos (by norm_num) m + have hsne : s ≠ 0 := hspos.ne' + have hparent : cubeRadius (originCube d (m + 1)) = (3 / 2 : ℝ) * s := by + dsimp [cubeRadius, cubeScaleFactor, originCube, s] + rw [zpow_add₀] + · norm_num; ring + · norm_num + change (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) * (3 : ℝ) ^ m = _ + rw [hparent] + norm_num + field_simp [hsne] + ring + +private theorem cutoff_hessian_scale_eq + {d : ℕ} (m : ℤ) : + (d : ℝ) * + (quantitativeCubeCutoffHessianConst d / + ((((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1))) ^ 2)) * + centeredCubeScale m * centeredCubeScale (m + 1) = + (192 : ℝ) * d * quantitativeCubeCutoffHessianConst d := by + let s : ℝ := (3 : ℝ) ^ m + have hspos : 0 < s := by dsimp [s]; exact zpow_pos (by norm_num) m + have hsne : s ≠ 0 := hspos.ne' + have hparent : cubeRadius (originCube d (m + 1)) = (3 / 2 : ℝ) * s := by + dsimp [cubeRadius, cubeScaleFactor, originCube, s] + rw [zpow_add₀] + · norm_num; ring + · norm_num + change (d : ℝ) * + (quantitativeCubeCutoffHessianConst d / + ((((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1))) ^ 2)) * + (3 : ℝ) ^ m * (3 : ℝ) ^ (m + 1) = _ + rw [hparent, zpow_add₀] + · norm_num + field_simp [hsne] + ring + · norm_num + +private theorem cutoff_coefficient_nonneg_and_bounds + {d : ℕ} (m : ℤ) : + let Kg : ℝ := (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * cubeRadius (originCube d (m + 1)))) + let Kl : ℝ := (d : ℝ) * + (quantitativeCubeCutoffHessianConst d / + ((((5 / 12 : ℝ) - (1 / 3 : ℝ)) * cubeRadius (originCube d (m + 1))) ^ 2)) + 0 ≤ Kg ∧ 0 ≤ Kl ∧ + Kg * centeredCubeScale (m + 1) ≤ + 24 * d * quantitativeCubeCutoffGradientConst d ∧ + Kg * centeredCubeScale m ≤ + 24 * d * quantitativeCubeCutoffGradientConst d ∧ + Kl * centeredCubeScale m * centeredCubeScale (m + 1) ≤ + 192 * d * quantitativeCubeCutoffHessianConst d := by + dsimp + have hg : 0 ≤ quantitativeCubeCutoffGradientConst d := by + dsimp [quantitativeCubeCutoffGradientConst] + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + smoothTransitionProfile.derivBound_nonneg + have hh : 0 ≤ quantitativeCubeCutoffHessianConst d := by + dsimp [quantitativeCubeCutoffHessianConst] + positivity + have hden : 0 ≤ ((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)) := + mul_nonneg (by norm_num) (cubeRadius_pos _).le + have hden2 : 0 ≤ (((5 / 12 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1))) ^ 2 := sq_nonneg _ + refine ⟨mul_nonneg (Nat.cast_nonneg d) (div_nonneg hg hden), + mul_nonneg (Nat.cast_nonneg d) (div_nonneg hh hden2), ?_, ?_, ?_⟩ + · rw [cutoff_gradient_parent_scale_eq] + · rw [cutoff_gradient_source_scale_eq] + nlinarith [mul_nonneg (Nat.cast_nonneg d) hg] + · rw [cutoff_hessian_scale_eq] + +private theorem coefficient_K_toReal_mul_source_norm + {Fq : ℝ≥0∞} {ratio kg kl Ccz P Csrc Nn : ℝ} + (hratio : 0 ≤ ratio) (hCcz : 0 ≤ Ccz) (hP : 0 ≤ P) + (hCsrc : 0 ≤ Csrc) (hkg : 0 ≤ kg) (hkl : 0 ≤ kl) : + let K0 : ℝ≥0∞ := ENNReal.ofReal + (ratio * Ccz * (1 + kg * P + 2 * kg * Csrc + kl * Csrc * P)) + K0.toReal * Fq.toReal * Nn = + (ratio * Ccz * (1 + kg * P + 2 * kg * Csrc + kl * Csrc * P) * + Fq.toReal) * Nn := by + dsimp + have hK : 0 ≤ ratio * Ccz * + (1 + kg * P + 2 * kg * Csrc + kl * Csrc * P) := by positivity + rw [ENNReal.toReal_ofReal hK] + +private theorem row_eLpNorm_of_raw_term_bounds + {d : ℕ} {m : ℤ} (q : FiniteLpExponent) + {u : H1Function (openCubeSet (originCube d m))} + (Hsrc : HasWeakHessianOn (openCubeSet (originCube d m)) u) + (i : Fin d) {K : ℝ≥0∞} (hKtop : K ≠ ∞) + (hterms : ∀ n : ℕ, ∃ (D E A Hterm BD BE BA BH : ℝ), + let Q := originCube d m + let Qp := originCube d (m + 1) + let U := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let R : Vec d → Vec d := fun x j => Hsrc.hess i j x + let G := (sourceHessianRowRadialDatum q Hsrc i n).toField + let r : Vec d → ℝ := fun _ => 0 + let Jraw := ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G x) + (fun j => η x * + cubeDirichletOddReflectionHessianRowVectorField Q i R x j + + r x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume + Jraw = D + E - 2 * A - Hterm ∧ + |D| ≤ cubeVolume Q * BD ∧ |E| ≤ cubeVolume Q * BE ∧ + |A| ≤ cubeVolume Q * BA ∧ |Hterm| ≤ cubeVolume Q * BH ∧ + BD + BE + 2 * BA + BH ≤ K.toReal * + ((∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => Hsrc.hess i j x)) x ∂ + normalizedCubeMeasure Q) ^ (1 - q.exponent.toReal⁻¹)).toReal) : + MemLp (fun x ↦ HilbertVec.ofVec (fun j ↦ Hsrc.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertVec.ofVec (fun j ↦ Hsrc.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ K := by + let R : Vec d → HilbertVec d := fun x ↦ HilbertVec.ofVec (fun j ↦ Hsrc.hess i j x) + have hRtwo : MemLp R 2 (normalizedCubeMeasure (originCube d m)) := by + simpa only [R] using! Hsrc.hessianHilbertRow_memLp_two_normalizedCubeMeasure + (originCube d m) i + have hqreal : 1 < q.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).mpr q.one_lt + have hbound : eLpNorm R q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ K := by + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + apply INTERNAL.eLpNorm_le_of_truncated_cross_bound hqreal hRtwo.aestronglyMeasurable + exact source_hessian_row_htrunc_of_raw_term_bounds q Hsrc i hKtop hterms + refine ⟨⟨hRtwo.aestronglyMeasurable, lt_of_le_of_lt hbound hKtop.lt_top⟩, ?_⟩ + simpa only [R] using hbound + +private theorem source_hessian_row_raw_term_package + {d : ℕ} [NeZero d] {q : FiniteLpExponent} + (hq : q.exponent.toReal < 2) : + ∃ Crow : ℝ≥0∞, Crow < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ (u : H10Function (openCubeSet (originCube d m))), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∀ (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function) + (i : Fin d), + MemLp (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + Crow * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨Csrc, hCsrcTop, hCsrc⟩ := source_gradient_below_two_bound (d := d) hq + have hqconj : 2 < q.conjugate.exponent.toReal := + INTERNAL.conjugate_toReal_gt_two_of_lt_two q hq + obtain ⟨Ccz, P, hCczTop, hPTop, hAdj⟩ := + exists_parent_adjoint_value_bound d q.conjugate hqconj + let ratio : ℝ := (3 : ℝ) ^ d + let kg : ℝ := 24 * d * quantitativeCubeCutoffGradientConst d + let kl : ℝ := 192 * d * quantitativeCubeCutoffHessianConst d + let K0 : ℝ≥0∞ := ENNReal.ofReal + (ratio * Ccz.toReal * + (1 + kg * P.toReal + 2 * kg * Csrc.toReal + kl * Csrc.toReal * P.toReal)) + refine ⟨K0, ENNReal.ofReal_lt_top, ?_⟩ + intro m F hF2 hFq u hweak H i + let K : ℝ≥0∞ := K0 * eLpNorm F q.exponent + (normalizedCubeMeasure (originCube d m)) + have hKtop : K ≠ ∞ := by + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top hFq.eLpNorm_ne_top + apply row_eLpNorm_of_raw_term_bounds q H i hKtop + intro n + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let U : Set (Vec d) := scaledOpenCubeSet Qp (1 / 2 : ℝ) + let η := QuantitativeCubeCutoff.canonical Qp (1 / 3 : ℝ) (5 / 12 : ℝ) + (by norm_num) (by norm_num) + let R : Vec d → Vec d := fun x j => H.hess i j x + let G := sourceHessianRowRadialDatum q H i n + let Nn : ℝ≥0∞ := eLpNorm (hilbertifyVecField G.toField) + q.conjugate.exponent (normalizedCubeMeasure Q) + let B : ℝ≥0∞ := Csrc * ENNReal.ofReal (centeredCubeScale m) * + eLpNorm F q.exponent (normalizedCubeMeasure Q) + have hgrad : eLpNorm (hilbertifyVecField u.toH1Function.grad) q.exponent + (normalizedCubeMeasure Q) ≤ B := by + simpa only [Q, B, centeredCubeScale, cubeScaleFactor_originCube] using + hCsrc m F u hF2 hFq hweak + have hBtop : B < ∞ := by + exact ENNReal.mul_lt_top (ENNReal.mul_lt_top hCsrcTop ENNReal.ofReal_lt_top) + hFq.eLpNorm_lt_top + obtain ⟨r, b, D, E, A, Hterm, _, _, hid, hD, hE, hA, hH, hbNorm, + hrNorm, hvval, hvgrad⟩ := + actual_mutual_raw_term_bounds q hF2 hFq hBtop hweak H i hgrad hAdj n + let Kg : ℝ := (d : ℝ) * (quantitativeCubeCutoffGradientConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp)) + let Kl : ℝ := (d : ℝ) * (quantitativeCubeCutoffHessianConst d / + (((5 / 12 : ℝ) - 1 / 3) * cubeRadius Qp) ^ 2) + let FqNorm : ℝ≥0∞ := eLpNorm F q.exponent (normalizedCubeMeasure Q) + let Vgrad : ℝ≥0∞ := eLpNorm + (hilbertifyVecField (openCubeSetScalarDivergenceSolution Qp (by norm_num : (0 : ℝ) < 1) + (sourceParentFiniteLpExtension m q.conjugate G).toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G)).toH1Function.grad) + q.conjugate.exponent (normalizedCubeMeasure Qp) + let Vval : ℝ≥0∞ := eLpNorm + (openCubeSetScalarDivergenceSolution Qp (by norm_num : (0 : ℝ) < 1) + (sourceParentFiniteLpExtension m q.conjugate G).toField + (memVectorL2_sourceParentFiniteLpExtension m q.conjugate G)).toH1Function.toFun + q.conjugate.exponent (normalizedCubeMeasure Qp) + let Rval : ℝ≥0∞ := eLpNorm r.toFun q.exponent + ((normalizedCubeMeasure Qp).restrict U) + let BD : ℝ := |D| / cubeVolume Q + let BE : ℝ := |E| / cubeVolume Q + let BA : ℝ := |A| / cubeVolume Q + let BH : ℝ := |Hterm| / cubeVolume Q + have hvol : cubeVolume Qp = cubeVolume Q * ratio := by + have hratio := originCube_parent_volume_ratio (d := d) m + calc + cubeVolume Qp = (cubeVolume Qp / cubeVolume Q) * cubeVolume Q := + (div_mul_cancel₀ _ (cubeVolume_pos Q).ne').symm + _ = cubeVolume Q * ratio := by rw [hratio]; ring + refine ⟨D, E, A, Hterm, BD, BE, BA, BH, ?_, ?_, ?_, ?_, ?_, ?_⟩ + · have hGP : (sourceParentFiniteLpExtension m q.conjugate G).toField = + openParentDatumExtension (openCubeSet Q) G.toField := by + simpa only [Q, G] using sourceParentFiniteLpExtension_toField m q.conjugate G + have hid' : + (∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G.toField x) + (fun j => η x * cubeDirichletOddReflectionHessianRowVectorField Q i R x j + + r x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume) = + D + E - 2 * A - Hterm := by + simpa only [Q, Qp, U, η, R, G, euclideanGradient] using hGP ▸ hid + calc + _ = ∫ x in U, vecDot (openParentDatumExtension (openCubeSet Q) G.toField x) + (fun j => η x * cubeDirichletOddReflectionHessianRowVectorField Q i R x j + + r x * (fderiv ℝ (η : Vec d → ℝ) x) (basisVec j)) ∂volume := by + simpa only [Q, Qp, U, η, R, G] using + (actual_Jraw_congr_row_value (d := d) m i R G.toField (fun _ => 0) r) + _ = _ := hid' + · change |D| ≤ cubeVolume Q * (|D| / cubeVolume Q) + rw [mul_div_cancel₀ _ (cubeVolume_pos Q).ne'] + · change |E| ≤ cubeVolume Q * (|E| / cubeVolume Q) + rw [mul_div_cancel₀ _ (cubeVolume_pos Q).ne'] + · change |A| ≤ cubeVolume Q * (|A| / cubeVolume Q) + rw [mul_div_cancel₀ _ (cubeVolume_pos Q).ne'] + · change |Hterm| ≤ cubeVolume Q * (|Hterm| / cubeVolume Q) + rw [mul_div_cancel₀ _ (cubeVolume_pos Q).ne'] + · obtain ⟨hKg, hKl, hKgsp, hKgss, hKlsssp⟩ := + cutoff_coefficient_nonneg_and_bounds (d := d) m + have hratio : 0 ≤ ratio := by dsimp [ratio]; positivity + have hCcz : 0 ≤ Ccz.toReal := ENNReal.toReal_nonneg + have hP : 0 ≤ P.toReal := ENNReal.toReal_nonneg + have hCsrc : 0 ≤ Csrc.toReal := ENNReal.toReal_nonneg + have hss : 0 ≤ centeredCubeScale m := by dsimp [centeredCubeScale]; positivity + have hF : 0 ≤ FqNorm.toReal := ENNReal.toReal_nonneg + have hNn : 0 ≤ Nn.toReal := ENNReal.toReal_nonneg + have hNtop : Nn ≠ ∞ := G.euclideanMemLp.eLpNorm_ne_top + have hVgrad : Vgrad.toReal ≤ Ccz.toReal * Nn.toReal := by + have hright : Ccz * Nn ≠ ∞ := ENNReal.mul_ne_top hCczTop.ne hNtop + have h := ENNReal.toReal_mono hright (by + simpa only [Q, Qp, G, Nn, Vgrad] using hvgrad) + simpa only [ENNReal.toReal_mul] using h + have hVval : Vval.toReal ≤ P.toReal * centeredCubeScale (m + 1) * + Ccz.toReal * Nn.toReal := by + have hscale : 0 ≤ centeredCubeScale (m + 1) := (centeredCubeScale_pos _).le + have hright : P * ENNReal.ofReal (centeredCubeScale (m + 1)) * Ccz * Nn ≠ ∞ := + ENNReal.mul_ne_top (ENNReal.mul_ne_top (ENNReal.mul_ne_top hPTop.ne + ENNReal.ofReal_ne_top) hCczTop.ne) hNtop + have h := ENNReal.toReal_mono hright (by + simpa only [Q, Qp, G, Nn, Vval] using hvval) + simpa only [ENNReal.toReal_mul, ENNReal.toReal_ofReal hscale] using h + have hRval : Rval.toReal ≤ Csrc.toReal * centeredCubeScale m * FqNorm.toReal := by + have hscale : 0 ≤ centeredCubeScale m := (centeredCubeScale_pos _).le + have hright : Csrc * ENNReal.ofReal (centeredCubeScale m) * FqNorm ≠ ∞ := + ENNReal.mul_ne_top (ENNReal.mul_ne_top hCsrcTop.ne ENNReal.ofReal_ne_top) + hFq.eLpNorm_ne_top + have h := ENNReal.toReal_mono hright (by + simpa only [Q, B, FqNorm] using hrNorm) + simpa only [ENNReal.toReal_mul, ENNReal.toReal_ofReal hscale] using h + have hFbound : FqNorm.toReal ≤ FqNorm.toReal := le_rfl + have hDdiv : |D| / cubeVolume Q ≤ ratio * FqNorm.toReal * Vgrad.toReal := by + rw [div_le_iff₀ (cubeVolume_pos Q)] + calc + |D| ≤ cubeVolume Qp * FqNorm.toReal * Vgrad.toReal := by + simpa only [Q, Qp, FqNorm, Vgrad] using hbNorm ▸ hD + _ = (ratio * FqNorm.toReal * Vgrad.toReal) * cubeVolume Q := by rw [hvol]; ring + have hEdiv : |E| / cubeVolume Q ≤ ratio * (Kg.toNNReal • FqNorm).toReal * Vval.toReal := by + rw [div_le_iff₀ (cubeVolume_pos Q)] + calc + |E| ≤ cubeVolume Qp * (Kg.toNNReal • FqNorm).toReal * Vval.toReal := by + simpa only [Q, Qp, FqNorm, Vval, Kg] using hbNorm ▸ hE + _ = (ratio * (Kg.toNNReal • FqNorm).toReal * Vval.toReal) * cubeVolume Q := by + rw [hvol]; ring + have hAdiv : |A| / cubeVolume Q ≤ ratio * Rval.toReal * (Kg.toNNReal • Vgrad).toReal := by + rw [div_le_iff₀ (cubeVolume_pos Q)] + calc + |A| ≤ cubeVolume Qp * Rval.toReal * (Kg.toNNReal • Vgrad).toReal := by + simpa only [Q, Qp, U, Rval, Vgrad, Kg] using hA + _ = (ratio * Rval.toReal * (Kg.toNNReal • Vgrad).toReal) * cubeVolume Q := by + rw [hvol]; ring + have hHdiv : |Hterm| / cubeVolume Q ≤ ratio * (Kl.toNNReal • Rval).toReal * Vval.toReal := by + rw [div_le_iff₀ (cubeVolume_pos Q)] + calc + |Hterm| ≤ cubeVolume Qp * (Kl.toNNReal • Rval).toReal * Vval.toReal := by + simpa only [Q, Qp, U, Rval, Vval, Kl] using hH + _ = (ratio * (Kl.toNNReal • Rval).toReal * Vval.toReal) * cubeVolume Q := by + rw [hvol]; ring + have hsum := coefficient_algebra_after_raw_division + (D := |D| / cubeVolume Q) (E := |E| / cubeVolume Q) + (A := |A| / cubeVolume Q) (Hterm := |Hterm| / cubeVolume Q) + (ratio := ratio) (Kg := Kg) (Kl := Kl) (kg := kg) (kl := kl) + (Ccz := Ccz.toReal) (P := P.toReal) (Csrc := Csrc.toReal) + (ss := centeredCubeScale m) (sp := centeredCubeScale (m + 1)) + (F := FqNorm.toReal) (Nn := Nn.toReal) + hratio hKg hKl hCcz hP hCsrc hss hF hNn hFbound hVgrad hVval hRval + hKgsp hKgss hKlsssp + (by rw [abs_of_nonneg (div_nonneg (abs_nonneg _) (cubeVolume_pos Q).le)]; exact hDdiv) + (by rw [abs_of_nonneg (div_nonneg (abs_nonneg _) (cubeVolume_pos Q).le)]; exact hEdiv) + (by rw [abs_of_nonneg (div_nonneg (abs_nonneg _) (cubeVolume_pos Q).le)]; exact hAdiv) + (by rw [abs_of_nonneg (div_nonneg (abs_nonneg _) (cubeVolume_pos Q).le)]; exact hHdiv) + have hkg : 0 ≤ kg := by + have hgc : 0 ≤ quantitativeCubeCutoffGradientConst d := by + dsimp [quantitativeCubeCutoffGradientConst] + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + smoothTransitionProfile.derivBound_nonneg + exact mul_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) hgc + have hkl : 0 ≤ kl := by + dsimp [kl, quantitativeCubeCutoffHessianConst] + positivity + have hKcoeff := coefficient_K_toReal_mul_source_norm + (Fq := FqNorm) (ratio := ratio) (kg := kg) (kl := kl) + (Ccz := Ccz.toReal) (P := P.toReal) (Csrc := Csrc.toReal) (Nn := Nn.toReal) + hratio hCcz hP hCsrc hkg hkl + have hNmoment : Nn = + (∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x)) x ∂ + normalizedCubeMeasure Q) ^ (1 - q.exponent.toReal⁻¹) := by + simpa only [Q, G, Nn] using source_hessian_row_radial_norm_eq_moment_rpow q H i n + calc + BD + BE + 2 * BA + BH = + |D| / cubeVolume Q + |E| / cubeVolume Q + + 2 * (|A| / cubeVolume Q) + |Hterm| / cubeVolume Q := by rfl + _ ≤ (ratio * Ccz.toReal * + (1 + kg * P.toReal + 2 * kg * Csrc.toReal + kl * Csrc.toReal * P.toReal) * + FqNorm.toReal) * Nn.toReal := by + simpa only [abs_of_nonneg (div_nonneg (abs_nonneg _) (cubeVolume_pos Q).le)] using hsum + _ = K.toReal * Nn.toReal := by + simpa only [K, ENNReal.toReal_mul, K0, FqNorm] using hKcoeff.symm + _ = K.toReal * + ((∫⁻ x, INTERNAL.truncatedMoment q.exponent.toReal n + (fun x => HilbertVec.ofVec (fun j => H.hess i j x)) x ∂ + normalizedCubeMeasure Q) ^ (1 - q.exponent.toReal⁻¹)).toReal := by rw [hNmoment] + +private theorem outer_hessian_from_row_bootstrap + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (Crow : ℝ≥0∞) (hCrow : Crow < ∞) + (hrow : ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ (u : H10Function (openCubeSet (originCube d m))), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∀ (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function), + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure (originCube d m)) → + ∀ i : Fin d, + MemLp (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + Crow * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m))) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨_, _, htwo⟩ := + exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_two d + let C : ℝ≥0∞ := d * Crow + refine ⟨C, ENNReal.mul_lt_top ENNReal.coe_lt_top hCrow, ?_⟩ + intro m F hF2 hFq u hweak + obtain ⟨H, hHtwo, _⟩ := htwo m F hF2 u hweak + have hrows := fun i ↦ hrow m F hF2 hFq u hweak H hHtwo i + have hrowsMem : ∀ i : Fin d, + MemLp (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := fun i ↦ (hrows i).1 + refine ⟨H, H.hessianHilbertMat_memLp_normalizedCubeMeasure_of_rows + (originCube d m) q hrowsMem, ?_⟩ + calc + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + ∑ i : Fin d, eLpNorm (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure (originCube d m)) := + H.eLpNorm_hessianHilbertMat_normalizedCubeMeasure_le_sum_rows + (originCube d m) q hrowsMem + _ ≤ ∑ _i : Fin d, Crow * eLpNorm F q.exponent + (normalizedCubeMeasure (originCube d m)) := + Finset.sum_le_sum fun i _ ↦ (hrows i).2 + _ = C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + simp only [Finset.sum_const, Finset.card_fin, nsmul_eq_mul, C] + ring + +/-- Calderón--Zygmund Hessian estimate on centered cubes below the energy +exponent. The Hessian representative is supplied by the energy estimate and +its `L^q` bound is obtained row-by-row from the localized duality argument. -/ +theorem exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨Crow, hCrow, hrow⟩ := + source_hessian_row_raw_term_package (d := d) (q := q) hq + apply outer_hessian_from_row_bootstrap d q Crow hCrow + intro m F hF2 hFq u hweak H _ i + exact hrow m F hF2 hFq u hweak H i + +/-- The centered-cube formulation of the below-two Hessian estimate. -/ +theorem centeredCubeH10ScalarPoisson_hessian_cz_of_lt_two + (d : ℕ) [NeZero d] (q : FiniteLpExponent) + (hq : q.exponent.toReal < 2) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + MemLp F q.exponent (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F q.exponent (normalizedCubeMeasure (originCube d m)) := + exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_of_lt_two d q hq + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianTwo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianTwo.lean new file mode 100644 index 0000000000..152facbb69 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/ScalarPoissonHessianTwo.lean @@ -0,0 +1,109 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EuclideanNormalized +public import Mathlib.MeasureTheory.SpecificCodomains.WithLp + +/-! +# Scalar Poisson Hessian estimate at the energy exponent + +The centered-cube Dirichlet `H²` endpoint supplies a weak Hessian with a +dimension-only normalized Frobenius estimate. This file restates that endpoint +for the project's Hilbert matrix realization. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +/-- The normalized `L²` Hessian estimate for zero-trace scalar Poisson +solutions on centered triadic cubes, expressed in the Hilbert matrix carrier. -/ +theorem exists_scalarPoisson_hessianHilbertMat_normalizedCubeMeasure_le_two + (d : ℕ) [NeZero d] : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (F : Vec d → ℝ), + MemLp F 2 (normalizedCubeMeasure (originCube d m)) → + ∀ u : H10Function (openCubeSet (originCube d m)), + CubeDirichletWeakPoissonProblem (originCube d m) u F → + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm F 2 (normalizedCubeMeasure (originCube d m)) := by + refine ⟨ENNReal.ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d), + ENNReal.ofReal_lt_top, ?_⟩ + intro m F hF u hweak + let Q : TriadicCube d := originCube d m + rcases CubeDirichletWeakPoissonProblem.exists_originCube_dirichlet_calderon_zygmund_regularity_q_two + m u F hF hweak with + ⟨H, hH⟩ + have hHmat : MemLp (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + rw [MeasureTheory.memLp_piLp_iff] + intro j + simpa only [Function.comp_apply, HilbertMat.ofMat, HilbertVec.ofVec, + PiLp.toLp_apply] using H.hess_memLp_normalizedCubeMeasure Q i j + refine ⟨H, hHmat, ?_⟩ + have hnorm : + eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q) = + eLpNorm H.frobeniusMagnitude 2 (normalizedCubeMeasure Q) := by + apply eLpNorm_congr_norm_ae + exact ae_of_all _ fun x ↦ by + have hnonneg : 0 ≤ matrixFrobeniusMagnitude (fun i j ↦ H.hess i j x) := + matrixFrobeniusMagnitude_nonneg _ + have habs : |matrixFrobeniusMagnitude (fun i j ↦ H.hess i j x)| = + matrixFrobeniusMagnitude (fun i j ↦ H.hess i j x) := + abs_of_nonneg hnonneg + simpa only [HasWeakHessianOn.frobeniusMagnitude, Real.norm_eq_abs, + habs] using! + (matrixFrobeniusMagnitude_eq_norm_hilbertMat_ofMat + (fun i j ↦ H.hess i j x)).symm + have hleft : + (eLpNorm (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q)).toReal = H.frobeniusNormalizedL2 Q := by + rw [hnorm, H.frobeniusNormalizedL2_eq_frobeniusMagnitudeNormalizedLpNorm Q] + unfold HasWeakHessianOn.frobeniusMagnitudeNormalizedLpNorm + BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + change (eLpNorm H.frobeniusMagnitude 2 (normalizedCubeMeasure Q)).toReal = + (eLpNorm H.frobeniusMagnitude 2 + (cubeBoundedMeasurableDomain Q).normalizedVolume).toReal + exact congrArg (fun μ ↦ (eLpNorm H.frobeniusMagnitude 2 μ).toReal) + (cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure Q).symm + have hright : + H.frobeniusNormalizedL2 Q ≤ + CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact d * + (eLpNorm F 2 (normalizedCubeMeasure Q)).toReal := by + simpa only [Q, BoundedMeasurableDomain.normalizedLpNorm, + BoundedMeasurableDomain.normalizedLpFiniteENorm, + BoundedMeasurableDomain.normalizedLpENorm, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using hH + apply (ENNReal.toReal_le_toReal hHmat.eLpNorm_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top hF.eLpNorm_ne_top)).mp + rw [ENNReal.toReal_mul, + ENNReal.toReal_ofReal + (CubeDirichletWeakPoissonProblem.cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d)] + exact hleft.trans_le hright + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/SourceParentFiniteLpExtension.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/SourceParentFiniteLpExtension.lean new file mode 100644 index 0000000000..626635faef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/SourceParentFiniteLpExtension.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.InteriorLocalInputs +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry + +/-! +# Source-supported finite-`L^p` data on a centered parent cube + +This module packages extension by zero from an origin cube into its centered +parent, retaining both the finite-exponent and energy memberships. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet + {d : ℕ} (m : ℤ) : + normalizedCubeMeasure (originCube d m) = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + (volume.restrict (openCubeSet (originCube d m))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + +private theorem cubeVolume_originCube_succ {d : ℕ} (m : ℤ) : + cubeVolume (originCube d (m + 1)) = + (3 : ℝ) ^ d * cubeVolume (originCube d m) := by + simp [cubeVolume, cubeScaleFactor, originCube, zpow_add₀] + rw [mul_pow] + ring + +private theorem normalizedCubeMeasure_parent_restrict_source + {d : ℕ} (m : ℤ) : + (normalizedCubeMeasure (originCube d (m + 1))).restrict + (openCubeSet (originCube d m)) = + ((3 : ℝ≥0∞) ^ d)⁻¹ • normalizedCubeMeasure (originCube d m) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet, + Measure.restrict_smul, + normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + have hsource_parent : openCubeSet (originCube d m) ⊆ + openCubeSet (originCube d (m + 1)) := by + calc + openCubeSet (originCube d m) = + scaledOpenCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) := + (scaledOpenCubeSet_originCube_succ_one_div_three d m).symm + _ ⊆ scaledClosedCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet _ _ + _ ⊆ openCubeSet (originCube d (m + 1)) := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one _ + (by norm_num) (by norm_num) + rw [Measure.restrict_restrict (isOpen_openCubeSet _).measurableSet, + Set.inter_eq_left.mpr hsource_parent] + have hscalar : ENNReal.ofReal ((cubeVolume (originCube d (m + 1)))⁻¹) = + ((3 : ℝ≥0∞) ^ d)⁻¹ * + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) := by + rw [cubeVolume_originCube_succ] + let N : ℝ := (3 : ℝ) ^ d + let V : ℝ := cubeVolume (originCube d m) + change ENNReal.ofReal ((N * V)⁻¹) = _ + have hN : 0 < N := by positivity + have hreal : ((N * V)⁻¹ : ℝ) = N⁻¹ * V⁻¹ := by + rw [mul_inv_rev] + ring + rw [hreal, ENNReal.ofReal_mul (inv_nonneg.mpr hN.le)] + congr 1 + norm_num [N] + rw [hscalar, smul_smul] + +/-- The source datum, extended by zero, as finite-`L^p` data on the centered +parent cube. -/ +noncomputable def sourceParentFiniteLpExtension + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + CubeEuclideanL2LpField (originCube d (m + 1)) q := by + let U : Set (Vec d) := openCubeSet (originCube d m) + have hU : MeasurableSet U := (isOpen_openCubeSet _).measurableSet + have hc : ((3 : ℝ≥0∞) ^ d)⁻¹ ≠ ∞ := + ENNReal.inv_ne_top.mpr (ENNReal.pow_ne_zero (by norm_num) d) + have hq : MemLp (hilbertifyVecField (openParentDatumExtension U h.toField)) + q.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + rw [hilbertifyVecField_openParentDatumExtension, memLp_indicator_iff_restrict hU, + normalizedCubeMeasure_parent_restrict_source] + exact h.euclideanMemLp.smul_measure hc + have htwo : MemLp (hilbertifyVecField (openParentDatumExtension U h.toField)) 2 + (normalizedCubeMeasure (originCube d (m + 1))) := by + rw [hilbertifyVecField_openParentDatumExtension, memLp_indicator_iff_restrict hU, + normalizedCubeMeasure_parent_restrict_source] + exact h.euclideanMemL2.smul_measure hc + change MemLp (fun x => HilbertVec.ofVec + (openParentDatumExtension U h.toField x)) q.exponent + (normalizedCubeMeasure (originCube d (m + 1))) at hq + change MemLp (fun x => HilbertVec.ofVec + (openParentDatumExtension U h.toField x)) 2 + (normalizedCubeMeasure (originCube d (m + 1))) at htwo + exact ⟨⟨openParentDatumExtension U h.toField, hq⟩, htwo⟩ + +@[simp] theorem sourceParentFiniteLpExtension_toField + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + (sourceParentFiniteLpExtension m q h).toField = + openParentDatumExtension (openCubeSet (originCube d m)) h.toField := by + rfl + +/-- The normalized finite-exponent norm of a datum extended by zero to its +centered parent has the exact probability-mass factor. -/ +theorem eLpNorm_sourceParentFiniteLpExtension + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + eLpNorm (hilbertifyVecField (sourceParentFiniteLpExtension m q h).toField) + q.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + (((3 : ℝ≥0∞) ^ d)⁻¹) ^ (q.exponent.toReal)⁻¹ * + eLpNorm (hilbertifyVecField h.toField) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [sourceParentFiniteLpExtension_toField, + hilbertifyVecField_openParentDatumExtension, + eLpNorm_indicator_eq_eLpNorm_restrict + (isOpen_openCubeSet _).measurableSet, + normalizedCubeMeasure_parent_restrict_source, + eLpNorm_smul_measure_of_ne_top q.lt_top.ne] + rw [smul_eq_mul, one_div, ENNReal.toReal_inv] + +/-- The source-supported parent extension cannot increase the normalized +finite-exponent Euclidean norm. -/ +theorem eLpNorm_sourceParentFiniteLpExtension_le + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + eLpNorm (hilbertifyVecField (sourceParentFiniteLpExtension m q h).toField) + q.exponent (normalizedCubeMeasure (originCube d (m + 1))) ≤ + eLpNorm (hilbertifyVecField h.toField) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [eLpNorm_sourceParentFiniteLpExtension] + apply mul_le_of_le_one_left bot_le + exact ENNReal.rpow_le_one + (ENNReal.inv_le_one.mpr (one_le_pow₀ (by norm_num : (1 : ℝ≥0∞) ≤ 3))) + (inv_nonneg.mpr ENNReal.toReal_nonneg) + +/-- The normalized `L²` norm of a source-supported parent extension has the +same exact probability-mass factor. -/ +theorem eLpNorm_two_sourceParentFiniteLpExtension + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + eLpNorm (hilbertifyVecField (sourceParentFiniteLpExtension m q h).toField) + 2 (normalizedCubeMeasure (originCube d (m + 1))) = + (((3 : ℝ≥0∞) ^ d)⁻¹) ^ (1 / (2 : ℝ≥0∞)).toReal * + eLpNorm (hilbertifyVecField h.toField) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [sourceParentFiniteLpExtension_toField, + hilbertifyVecField_openParentDatumExtension, + eLpNorm_indicator_eq_eLpNorm_restrict + (isOpen_openCubeSet _).measurableSet, + normalizedCubeMeasure_parent_restrict_source, + eLpNorm_smul_measure_of_ne_top (by norm_num : (2 : ℝ≥0∞) ≠ ∞)] + rfl + +/-- The source-supported parent extension cannot increase its normalized +Euclidean `L²` norm. -/ +theorem eLpNorm_two_sourceParentFiniteLpExtension_le + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + eLpNorm (hilbertifyVecField (sourceParentFiniteLpExtension m q h).toField) + 2 (normalizedCubeMeasure (originCube d (m + 1))) ≤ + eLpNorm (hilbertifyVecField h.toField) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [eLpNorm_two_sourceParentFiniteLpExtension] + apply mul_le_of_le_one_left bot_le + exact ENNReal.rpow_le_one + (ENNReal.inv_le_one.mpr (one_le_pow₀ (by norm_num : (1 : ℝ≥0∞) ≤ 3))) + (by norm_num) + +/-- The parent extension is a raw vector `L²` datum on the open parent cube, +as needed by the canonical adjoint solver. -/ +theorem memVectorL2_sourceParentFiniteLpExtension + {d : ℕ} (m : ℤ) (q : FiniteLpExponent) + (h : CubeEuclideanL2LpField (originCube d m) q) : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (sourceParentFiniteLpExtension m q h).toField := by + apply MeasureTheory.MemLp.of_eval + intro i + have hcoord : MemLp (fun x => HilbertVec.ofVec + ((sourceParentFiniteLpExtension m q h).toField x)) 2 + (normalizedCubeMeasure (originCube d (m + 1))) := + (sourceParentFiniteLpExtension m q h).euclideanMemL2 + rw [MeasureTheory.memLp_piLp_iff] at hcoord + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure + (originCube d (m + 1)) (hcoord i) + +end CubeCalderonZygmund + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingCubeGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingCubeGeometry.lean new file mode 100644 index 0000000000..0612ca2894 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingCubeGeometry.lean @@ -0,0 +1,252 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.AxisCubeHarmonicCovariance +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.StoppingRadius + +/-! # Stopping Cube Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace CubeCalderonZygmund + +open Filter MeasureTheory Set + +/-! +# Axis cubes at a good-`lambda` stopping scale + +The Vitali argument is formulated with sup-metric balls in `Vec d`. This +module identifies those balls with the axis cubes used by the harmonic +replacement and harmonic-gain APIs. The comparison parent has radius +`5 * 3^n * r`; its concentric depth-`n` descendant is exactly the comparison +ball of radius `5 * r`. +-/ + +/-- The lower corner of the axis cube representing the sup-metric ball of +radius `S * r` around `x`. -/ +def stoppingAxisCubeCorner {d : ℕ} (x : Vec d) (S r : ℝ) : Vec d := + fun i => x i - S * r + +/-- The side length of the axis cube representing the sup-metric ball of +radius `S * r` around `x`. -/ +def stoppingAxisCubeSide (S r : ℝ) : ℝ := + 2 * S * r + +/-- A positive-radius sup-metric ball is exactly its open axis-cube +realization. -/ +theorem axisCube_stoppingAxisCubeCorner_eq_ball {d : ℕ} (x : Vec d) + {S r : ℝ} (hS : 0 < S) (hr : 0 < r) : + axisCube (stoppingAxisCubeCorner x S r) (stoppingAxisCubeSide S r) = + Metric.ball x (S * r) := by + have hSr : 0 < S * r := mul_pos hS hr + rw [ball_pi x hSr] + ext y + simp only [axisCube, stoppingAxisCubeCorner, stoppingAxisCubeSide, + Set.mem_pi, Set.mem_univ, forall_true_left, Set.mem_Ioo, Real.ball_eq_Ioo] + constructor <;> intro hy <;> intro i + · constructor <;> linarith [hy i] + · constructor <;> linarith [hy i] + +/-- The open stopping cube and its closed sup-metric ball agree almost +everywhere for Lebesgue measure. -/ +theorem axisCube_stoppingAxisCubeCorner_ae_eq_closedBall {d : ℕ} [NeZero d] + (x : Vec d) {S r : ℝ} (hS : 0 < S) (hr : 0 < r) : + axisCube (stoppingAxisCubeCorner x S r) (stoppingAxisCubeSide S r) =ᵐ[volume] + Metric.closedBall x (S * r) := by + rw [axisCube_stoppingAxisCubeCorner_eq_ball x hS hr] + have hsphere : ∀ᵐ y ∂volume, y ∉ Metric.sphere x (S * r) := by + rw [ae_iff] + simpa using! (volume_sphere_eq_zero (d := d) x (S * r)) + filter_upwards [hsphere] with y hy + apply propext + constructor + · intro hyball + exact Metric.ball_subset_closedBall hyball + · intro hyclosed + by_contra hynot + have hdist_le : dist y x ≤ S * r := Metric.mem_closedBall.mp hyclosed + have hdist_ge : S * r ≤ dist y x := by + exact le_of_not_gt fun hlt => hynot (Metric.mem_ball.mpr hlt) + exact hy (Metric.mem_sphere.mpr (le_antisymm hdist_le hdist_ge)) + +/-- The comparison parent multiplier: after `n` concentric contractions, a +radius `5 * 3^n * r` becomes `5 * r`. -/ +def stoppingComparisonParentMultiplier (n : ℕ) : ℝ := + 5 * (3 : ℝ) ^ n + +/-- The parent cube used for a depth-`n` harmonic comparison at stopping +radius `r`. -/ +def stoppingComparisonParentCorner {d : ℕ} (x : Vec d) (r : ℝ) (n : ℕ) : Vec d := + stoppingAxisCubeCorner x (stoppingComparisonParentMultiplier n) r + +/-- The side length of the comparison parent cube. -/ +def stoppingComparisonParentSide (r : ℝ) (n : ℕ) : ℝ := + stoppingAxisCubeSide (stoppingComparisonParentMultiplier n) r + +private theorem stoppingComparisonParentMultiplier_pos (n : ℕ) : + 0 < stoppingComparisonParentMultiplier n := by + simp only [stoppingComparisonParentMultiplier] + positivity + +private theorem stoppingComparisonParentSide_eq {r : ℝ} (n : ℕ) : + stoppingComparisonParentSide r n = 10 * (3 : ℝ) ^ n * r := by + simp only [stoppingComparisonParentSide, stoppingAxisCubeSide, + stoppingComparisonParentMultiplier] + ring + +/-- The comparison parent is the open sup-metric ball with radius +`5 * 3^n * r`. -/ +theorem stoppingComparisonParent_axisCube_eq_ball {d : ℕ} (x : Vec d) + {r : ℝ} (hr : 0 < r) (n : ℕ) : + axisCube (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) = + Metric.ball x (stoppingComparisonParentMultiplier n * r) := + axisCube_stoppingAxisCubeCorner_eq_ball x + (stoppingComparisonParentMultiplier_pos n) hr + +/-- The comparison parent and its closed sup-metric ball agree almost +everywhere. -/ +theorem stoppingComparisonParent_axisCube_ae_eq_closedBall {d : ℕ} [NeZero d] + (x : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + axisCube (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) =ᵐ[volume] + Metric.closedBall x (stoppingComparisonParentMultiplier n * r) := + axisCube_stoppingAxisCubeCorner_ae_eq_closedBall x + (stoppingComparisonParentMultiplier_pos n) hr + +private theorem axisCubeConcentricDepthSide_stoppingComparisonParent + (r : ℝ) (n : ℕ) : + axisCubeConcentricDepthSide (stoppingComparisonParentSide r n) n = + stoppingAxisCubeSide 5 r := by + rw [stoppingComparisonParentSide_eq] + simp only [axisCubeConcentricDepthSide, stoppingAxisCubeSide, zpow_neg, + zpow_natCast] + field_simp [pow_ne_zero n (by norm_num : (3 : ℝ) ≠ 0)] + ring + +private theorem axisCubeConcentricDepthCorner_stoppingComparisonParent + {d : ℕ} (x : Vec d) (r : ℝ) (n : ℕ) : + axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) n = + stoppingAxisCubeCorner x 5 r := by + ext i + rw [stoppingComparisonParentSide_eq] + simp only [axisCubeConcentricDepthCorner, stoppingComparisonParentCorner, + stoppingAxisCubeCorner, axisCubeCenter, axisCubeConcentricDepthSide, + stoppingComparisonParentMultiplier, zpow_neg, + zpow_natCast, div_eq_mul_inv] + field_simp [pow_ne_zero n (by norm_num : (3 : ℝ) ≠ 0)] + ring + +/-- The depth-`n` concentric descendant of the comparison parent is exactly +the stopping-scale comparison ball of radius `5 * r`. -/ +theorem stoppingComparison_concentricDepth_axisCube_eq_ball {d : ℕ} + (x : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) n) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r n) n) = + Metric.ball x (5 * r) := by + rw [axisCubeConcentricDepthCorner_stoppingComparisonParent x r n, + axisCubeConcentricDepthSide_stoppingComparisonParent r n] + exact axisCube_stoppingAxisCubeCorner_eq_ball x (by norm_num) hr + +/-- The depth-`n` comparison descendant and the closed stopping-scale ball +agree almost everywhere. -/ +theorem stoppingComparison_concentricDepth_axisCube_ae_eq_closedBall + {d : ℕ} [NeZero d] (x : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + axisCube + (axisCubeConcentricDepthCorner (stoppingComparisonParentCorner x r n) + (stoppingComparisonParentSide r n) n) + (axisCubeConcentricDepthSide (stoppingComparisonParentSide r n) n) =ᵐ[volume] + Metric.closedBall x (5 * r) := by + rw [stoppingComparison_concentricDepth_axisCube_eq_ball x hr n] + have hsphere : ∀ᵐ y ∂volume, y ∉ Metric.sphere x (5 * r) := by + rw [ae_iff] + simpa using! (volume_sphere_eq_zero (d := d) x (5 * r)) + filter_upwards [hsphere] with y hy + apply propext + constructor + · intro hyball + exact Metric.ball_subset_closedBall hyball + · intro hyclosed + by_contra hynot + have hdist_le : dist y x ≤ 5 * r := Metric.mem_closedBall.mp hyclosed + have hdist_ge : 5 * r ≤ dist y x := by + exact le_of_not_gt fun hlt => hynot (Metric.mem_ball.mpr hlt) + exact hy (Metric.mem_sphere.mpr (le_antisymm hdist_le hdist_ge)) + +/-- The largest comparison radius required by the depth-`n` parent. -/ +def stoppingComparisonRadius (r : ℝ) (n : ℕ) : ℝ := + 10 * (3 : ℝ) ^ n * r + +theorem stoppingComparisonRadius_eq_two_mul_parentRadius (r : ℝ) (n : ℕ) : + stoppingComparisonRadius r n = + 2 * (stoppingComparisonParentMultiplier n * r) := by + simp only [stoppingComparisonRadius, stoppingComparisonParentMultiplier] + ring + +/-- A positive stopping radius is no larger than its comparison radius. -/ +theorem le_stoppingComparisonRadius {r : ℝ} (hr : 0 ≤ r) (n : ℕ) : + r ≤ stoppingComparisonRadius r n := by + have hpow : 1 ≤ (3 : ℝ) ^ n := one_le_pow₀ (by norm_num) + have hfactor : 1 ≤ 10 * (3 : ℝ) ^ n := by nlinarith + calc + r = 1 * r := by ring + _ ≤ (10 * (3 : ℝ) ^ n) * r := mul_le_mul_of_nonneg_right hfactor hr + _ = stoppingComparisonRadius r n := rfl + +/-- The stopping-scale cutoff ensures that the full comparison parent remains +within the radius on which the last-exit bound is available. -/ +theorem stoppingComparisonRadius_le_of_le {r R : ℝ} (n : ℕ) + (h : r ≤ R / (10 * (3 : ℝ) ^ n)) : + stoppingComparisonRadius r n ≤ R := by + have hdenom : 0 < 10 * (3 : ℝ) ^ n := by positivity + rw [le_div_iff₀ hdenom] at h + calc + stoppingComparisonRadius r n = r * (10 * (3 : ℝ) ^ n) := by + simp only [stoppingComparisonRadius] + ring + _ ≤ R := h + +/-- A stopping radius bounded by `R / (10 * 3^n)` can be used both at its own +scale and at the comparison-parent scale before the last-exit radius `R`. -/ +theorem stoppingComparisonRadius_bounds_of_le {r R : ℝ} (hr : 0 ≤ r) (n : ℕ) + (h : r ≤ R / (10 * (3 : ℝ) ^ n)) : + r ≤ stoppingComparisonRadius r n ∧ stoppingComparisonRadius r n ≤ R := + ⟨le_stoppingComparisonRadius hr n, stoppingComparisonRadius_le_of_le n h⟩ + +/-- Under the conservative `10 * 3^n` cutoff, the actual comparison-parent +radius `5 * 3^n * r` lies in the last-exit interval from `r` to `R`. -/ +theorem stoppingComparisonParentRadius_mem_Icc_of_le {r R : ℝ} + (hr : 0 ≤ r) (n : ℕ) (h : r ≤ R / (10 * (3 : ℝ) ^ n)) : + stoppingComparisonParentMultiplier n * r ∈ Icc r R := by + have hpow : 1 ≤ (3 : ℝ) ^ n := one_le_pow₀ (by norm_num) + have hlower : r ≤ stoppingComparisonParentMultiplier n * r := by + rw [stoppingComparisonParentMultiplier] + nlinarith + have hparent_nonneg : 0 ≤ stoppingComparisonParentMultiplier n * r := by + exact mul_nonneg (stoppingComparisonParentMultiplier_pos n).le hr + have hparent_le_comparison : + stoppingComparisonParentMultiplier n * r ≤ stoppingComparisonRadius r n := by + rw [stoppingComparisonRadius_eq_two_mul_parentRadius] + nlinarith + exact ⟨hlower, + hparent_le_comparison.trans (stoppingComparisonRadius_le_of_le n h)⟩ + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingEnergyTransfer.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingEnergyTransfer.lean new file mode 100644 index 0000000000..69af090d02 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingEnergyTransfer.lean @@ -0,0 +1,364 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambdaStopping +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.LocalWeightedTail + +/-! # Stopping Energy Transfer -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +private theorem closedBallL2Energy_nonneg {d : ℕ} {F : Type*} + [NormedAddCommGroup F] (u : Vec d → F) (x : Vec d) {r : ℝ} (hr : 0 < r) : + 0 ≤ closedBallL2Energy u x r := by + unfold closedBallL2Energy closedBallAverage + apply mul_nonneg + · positivity + · exact MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + +private theorem combined_energy_mass_identity {d : ℕ} {F G : Type*} + [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) {ε level r : ℝ} (hε : 0 < ε) (hr : 0 < r) + (hf : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) volume) + (hg : Integrable (fun y => ‖g y‖ ^ (2 : ℕ)) volume) + (x : Vec d) (hstop : goodLambdaCombinedEnergy f g ε x r = level) : + ∫ y in Metric.closedBall x r, + (‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) ∂volume = + level ^ (2 : ℕ) * (2 * r) ^ d := by + let D : ℝ := (2 * r) ^ d + let If : ℝ := ∫ y in Metric.closedBall x r, ‖f y‖ ^ (2 : ℕ) ∂volume + let Ig : ℝ := ∫ y in Metric.closedBall x r, ‖g y‖ ^ (2 : ℕ) ∂volume + have hf_nonneg : 0 ≤ closedBallL2Energy f x r := + closedBallL2Energy_nonneg f x hr + have hg_nonneg : 0 ≤ closedBallL2Energy g x r := + closedBallL2Energy_nonneg g x hr + have hsum_nonneg : 0 ≤ closedBallL2Energy f x r + + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r := by + exact add_nonneg hf_nonneg (mul_nonneg (sq_nonneg _) hg_nonneg) + have hsum : closedBallL2Energy f x r + + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r = level ^ (2 : ℕ) := by + have hsquare := congrArg (fun z : ℝ => z ^ (2 : ℕ)) hstop + simpa only [goodLambdaCombinedEnergy, Real.sq_sqrt hsum_nonneg] using hsquare + have hD_pos : 0 < D := by + dsimp [D] + exact pow_pos (by linarith) _ + have haverage : D⁻¹ * (If + (ε⁻¹) ^ (2 : ℕ) * Ig) = level ^ (2 : ℕ) := by + calc + D⁻¹ * (If + (ε⁻¹) ^ (2 : ℕ) * Ig) = + closedBallL2Energy f x r + + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r := by + simp only [closedBallL2Energy, closedBallAverage, D, If, Ig] + ring + _ = level ^ (2 : ℕ) := hsum + have hcombined : If + (ε⁻¹) ^ (2 : ℕ) * Ig = level ^ (2 : ℕ) * D := by + calc + If + (ε⁻¹) ^ (2 : ℕ) * Ig = D * (D⁻¹ * (If + (ε⁻¹) ^ (2 : ℕ) * Ig)) := by + field_simp [hD_pos.ne'] + _ = D * level ^ (2 : ℕ) := by rw [haverage] + _ = level ^ (2 : ℕ) * D := by ring + calc + ∫ y in Metric.closedBall x r, + (‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) ∂volume = + If + (ε⁻¹) ^ (2 : ℕ) * Ig := by + have hfB : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) + (volume.restrict (Metric.closedBall x r)) := hf.integrableOn + have hgB : Integrable (fun y => (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) + (volume.restrict (Metric.closedBall x r)) := + hg.integrableOn.const_mul ((ε⁻¹) ^ (2 : ℕ)) + have hadd : ∫ y, ((ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ) + ‖f y‖ ^ (2 : ℕ)) ∂ + volume.restrict (Metric.closedBall x r) = + (∫ y, (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ) ∂volume.restrict (Metric.closedBall x r)) + + ∫ y, ‖f y‖ ^ (2 : ℕ) ∂volume.restrict (Metric.closedBall x r) := + MeasureTheory.integral_add hgB hfB + calc + ∫ y in Metric.closedBall x r, + (‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) ∂volume = + ∫ y in Metric.closedBall x r, + ((ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ) + ‖f y‖ ^ (2 : ℕ)) ∂volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [] with y + ring + _ = ∫ y in Metric.closedBall x r, (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ) ∂volume + + ∫ y in Metric.closedBall x r, ‖f y‖ ^ (2 : ℕ) ∂volume := hadd + _ = If + (ε⁻¹) ^ (2 : ℕ) * Ig := by + simp only [If, Ig, MeasureTheory.integral_const_mul] + ring + _ = level ^ (2 : ℕ) * D := hcombined + _ = level ^ (2 : ℕ) * (2 * r) ^ d := by rfl + +private theorem combined_sq_le_tail_split {a b ε level : ℝ} + (hε : 0 < ε) (hlevel : 0 ≤ level) (ha : 0 ≤ a) (hb : 0 ≤ b) : + a ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * b ^ (2 : ℕ) ≤ + (if level / 2 < a then a ^ (2 : ℕ) else 0) + + (ε⁻¹) ^ (2 : ℕ) * (if ε * level / 2 < b then b ^ (2 : ℕ) else 0) + + level ^ (2 : ℕ) / 2 := by + have hεinv : ε * ε⁻¹ = 1 := by field_simp [hε.ne'] + have hinv_nonneg : 0 ≤ ε⁻¹ := inv_nonneg.mpr hε.le + have hf_small (hfa : a ≤ level / 2) : a ^ (2 : ℕ) ≤ level ^ (2 : ℕ) / 4 := by + nlinarith [sq_nonneg (a - level / 2)] + have hg_small (hgb : b ≤ ε * level / 2) : + (ε⁻¹) ^ (2 : ℕ) * b ^ (2 : ℕ) ≤ level ^ (2 : ℕ) / 4 := by + have hscaled := mul_le_mul_of_nonneg_left hgb hinv_nonneg + have hright : ε⁻¹ * (ε * level / 2) = level / 2 := by + calc + ε⁻¹ * (ε * level / 2) = (ε * ε⁻¹) * level / 2 := by ring + _ = level / 2 := by rw [hεinv, one_mul] + rw [hright] at hscaled + have hscaled_nonneg : 0 ≤ ε⁻¹ * b := mul_nonneg hinv_nonneg hb + have hsq : (ε⁻¹ * b) ^ (2 : ℕ) ≤ (level / 2) ^ (2 : ℕ) := + (sq_le_sq₀ hscaled_nonneg (by linarith)).2 hscaled + nlinarith [hsq] + by_cases hfa : level / 2 < a + · rw [if_pos hfa] + by_cases hgb : ε * level / 2 < b + · rw [if_pos hgb] + nlinarith [sq_nonneg level] + · rw [if_neg hgb] + nlinarith [hg_small (le_of_not_gt hgb)] + · rw [if_neg hfa] + by_cases hgb : ε * level / 2 < b + · rw [if_pos hgb] + nlinarith [hf_small (le_of_not_gt hfa)] + · rw [if_neg hgb] + nlinarith [hf_small (le_of_not_gt hfa), hg_small (le_of_not_gt hgb)] + +/-- At an exact combined stopping radius, the normalized energy is forced into +the two corresponding weighted superlevel tails. -/ +theorem goodLambdaCombinedEnergy_eq_tail_transfer + {d : ℕ} {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) {ε level r : ℝ} (hε : 0 < ε) (hr : 0 < r) + (hf : AEStronglyMeasurable f volume) + (hg : AEStronglyMeasurable g volume) + (hfi : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) volume) + (hgi : Integrable (fun y => ‖g y‖ ^ (2 : ℕ)) volume) + (x : Vec d) (hstop : goodLambdaCombinedEnergy f g ε x r = level) : + ENNReal.ofReal (level ^ (2 : ℕ)) * volume (Metric.closedBall x r) ≤ + 2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((ε⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | ε * level / 2 < ‖g y‖} ∩ Metric.closedBall x r) := by + let B : Set (Vec d) := Metric.closedBall x r + let A : Set (Vec d) := {y | level / 2 < ‖f y‖} + let C : Set (Vec d) := {y | ε * level / 2 < ‖g y‖} + let D : ℝ := (2 * r) ^ d + have hB : MeasurableSet B := measurableSet_closedBall + have hA : NullMeasurableSet A volume := by + simpa only [A] using aestronglyMeasurable_const.nullMeasurableSet_lt hf.norm + have hC : NullMeasurableSet C volume := by + simpa only [C] using aestronglyMeasurable_const.nullMeasurableSet_lt hg.norm + have hAB : NullMeasurableSet (A ∩ B) volume := hA.inter hB.nullMeasurableSet + have hCB : NullMeasurableSet (C ∩ B) volume := hC.inter hB.nullMeasurableSet + have hlevel : 0 ≤ level := by + rw [← hstop] + exact goodLambdaCombinedEnergy_nonneg f g ε x r + have hpoint : B.indicator (fun y => + ‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) ≤ + (A ∩ B).indicator (fun y => ‖f y‖ ^ (2 : ℕ)) + + (fun y => (ε⁻¹) ^ (2 : ℕ) * + (C ∩ B).indicator (fun y => ‖g y‖ ^ (2 : ℕ)) y) + + B.indicator (fun _ => level ^ (2 : ℕ) / 2) := by + intro y + change B.indicator (fun y => + ‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) y ≤ + (A ∩ B).indicator (fun y => ‖f y‖ ^ (2 : ℕ)) y + + (ε⁻¹) ^ (2 : ℕ) * (C ∩ B).indicator (fun y => ‖g y‖ ^ (2 : ℕ)) y + + B.indicator (fun _ => level ^ (2 : ℕ) / 2) y + by_cases hyB : y ∈ B + · rw [Set.indicator_of_mem hyB] + by_cases hyA : y ∈ A + · have hyA' : level / 2 < ‖f y‖ := by simpa only [A] using! hyA + have hyAB : y ∈ A ∩ B := ⟨hyA, hyB⟩ + rw [Set.indicator_of_mem hyAB] + by_cases hyC : y ∈ C + · have hyC' : ε * level / 2 < ‖g y‖ := by simpa only [C] using! hyC + have hyCB : y ∈ C ∩ B := ⟨hyC, hyB⟩ + rw [Set.indicator_of_mem hyCB, Set.indicator_of_mem hyB] + simpa only [if_pos hyA', if_pos hyC'] using + (combined_sq_le_tail_split (a := ‖f y‖) (b := ‖g y‖) hε hlevel + (norm_nonneg _) (norm_nonneg _)) + · have hyC' : ¬ ε * level / 2 < ‖g y‖ := by simpa only [C] using! hyC + rw [Set.indicator_of_notMem (fun h : y ∈ C ∩ B => hyC h.1), + Set.indicator_of_mem hyB] + simpa only [if_pos hyA', if_neg hyC'] using + (combined_sq_le_tail_split (a := ‖f y‖) (b := ‖g y‖) hε hlevel + (norm_nonneg _) (norm_nonneg _)) + · have hyA' : ¬ level / 2 < ‖f y‖ := by simpa only [A] using! hyA + rw [Set.indicator_of_notMem (fun h : y ∈ A ∩ B => hyA h.1)] + by_cases hyC : y ∈ C + · have hyC' : ε * level / 2 < ‖g y‖ := by simpa only [C] using! hyC + have hyCB : y ∈ C ∩ B := ⟨hyC, hyB⟩ + rw [Set.indicator_of_mem hyCB, Set.indicator_of_mem hyB] + simpa only [if_neg hyA', if_pos hyC'] using + (combined_sq_le_tail_split (a := ‖f y‖) (b := ‖g y‖) hε hlevel + (norm_nonneg _) (norm_nonneg _)) + · have hyC' : ¬ ε * level / 2 < ‖g y‖ := by simpa only [C] using! hyC + rw [Set.indicator_of_notMem (fun h : y ∈ C ∩ B => hyC h.1), + Set.indicator_of_mem hyB] + simpa only [if_neg hyA', if_neg hyC'] using + (combined_sq_le_tail_split (a := ‖f y‖) (b := ‖g y‖) hε hlevel + (norm_nonneg _) (norm_nonneg _)) + · rw [Set.indicator_of_notMem hyB, Set.indicator_of_notMem (fun h => hyB h.2), + Set.indicator_of_notMem (fun h => hyB h.2), Set.indicator_of_notMem hyB] + positivity + have hfTail : Integrable ((A ∩ B).indicator (fun y => ‖f y‖ ^ (2 : ℕ))) volume := + hfi.integrableOn.integrable_indicator₀ hAB + have hgTail : Integrable ((C ∩ B).indicator (fun y => ‖g y‖ ^ (2 : ℕ))) volume := + hgi.integrableOn.integrable_indicator₀ hCB + have hconstOn : IntegrableOn (fun _ : Vec d => level ^ (2 : ℕ) / 2) B volume := + integrableOn_const (measure_closedBall_lt_top.ne) + have hconst : Integrable (B.indicator (fun _ : Vec d => level ^ (2 : ℕ) / 2)) volume := + hconstOn.integrable_indicator hB + have hfB : Integrable (fun y => ‖f y‖ ^ (2 : ℕ)) (volume.restrict B) := + hfi.integrableOn + have hgB : Integrable (fun y => ‖g y‖ ^ (2 : ℕ)) (volume.restrict B) := + hgi.integrableOn + have hleft : Integrable (B.indicator (fun y => + ‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ))) volume := by + have hsumB : Integrable (fun y => + ‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) + (volume.restrict B) := hfB.add (hgB.const_mul _) + rw [MeasureTheory.integrable_indicator_iff hB] + exact hsumB + have hright : Integrable ((A ∩ B).indicator (fun y => ‖f y‖ ^ (2 : ℕ)) + + (fun y => (ε⁻¹) ^ (2 : ℕ) * + (C ∩ B).indicator (fun y => ‖g y‖ ^ (2 : ℕ)) y) + + B.indicator (fun _ => level ^ (2 : ℕ) / 2)) volume := + (hfTail.add ((hgi.integrableOn.integrable_indicator₀ hCB).const_mul _)).add hconst + have hintegral := MeasureTheory.integral_mono_ae hleft hright + (ae_of_all volume hpoint) + have hvol : ∫ y in B, (level ^ (2 : ℕ) / 2) ∂volume = + (level ^ (2 : ℕ) / 2) * D := by + rw [MeasureTheory.integral_const, MeasureTheory.measureReal_restrict_apply_univ, + MeasureTheory.measureReal_def, + Real.volume_pi_closedBall x hr.le, ENNReal.toReal_ofReal] + · simp only [D, Fintype.card_fin, smul_eq_mul] + ring + · exact pow_nonneg (by linarith) _ + have htail_real : level ^ (2 : ℕ) * D ≤ + 2 * (∫ y in A ∩ B, ‖f y‖ ^ (2 : ℕ) ∂volume) + + 2 * (ε⁻¹) ^ (2 : ℕ) * (∫ y in C ∩ B, ‖g y‖ ^ (2 : ℕ) ∂volume) := by + have hmass := combined_energy_mass_identity f g hε hr hfi hgi x hstop + have hintegral' : ∫ y in B, + (‖f y‖ ^ (2 : ℕ) + (ε⁻¹) ^ (2 : ℕ) * ‖g y‖ ^ (2 : ℕ)) ∂volume ≤ + (∫ y in A ∩ B, ‖f y‖ ^ (2 : ℕ) ∂volume) + + (ε⁻¹) ^ (2 : ℕ) * (∫ y in C ∩ B, ‖g y‖ ^ (2 : ℕ) ∂volume) + + ∫ y in B, (level ^ (2 : ℕ) / 2) ∂volume := by + rw [MeasureTheory.integral_indicator hB] at hintegral + have hfirst : Integrable ((A ∩ B).indicator (fun y => ‖f y‖ ^ (2 : ℕ)) + + (fun y => (ε⁻¹) ^ (2 : ℕ) * + (C ∩ B).indicator (fun y => ‖g y‖ ^ (2 : ℕ)) y)) volume := + hfTail.add (hgTail.const_mul _) + rw [MeasureTheory.integral_add' hfirst hconst, MeasureTheory.integral_add' + hfTail (hgTail.const_mul _), + MeasureTheory.integral_const_mul, + MeasureTheory.integral_indicator₀ hAB, MeasureTheory.integral_indicator₀ hCB] at hintegral + rw [MeasureTheory.integral_indicator hB] at hintegral + exact hintegral + dsimp only [B] at hmass hvol hintegral' + rw [hvol] at hintegral' + nlinarith [hmass, hintegral'] + have hleft_volume : ENNReal.ofReal (level ^ (2 : ℕ)) * volume B = + ENNReal.ofReal (level ^ (2 : ℕ) * D) := by + rw [Real.volume_pi_closedBall x hr.le, ENNReal.ofReal_mul] + · simp only [D, Fintype.card_fin] + · exact pow_nonneg (by linarith) _ + rw [hleft_volume] + have htail_nonneg_f : 0 ≤ ∫ y in A ∩ B, ‖f y‖ ^ (2 : ℕ) ∂volume := + MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + have htail_nonneg_g : 0 ≤ ∫ y in C ∩ B, ‖g y‖ ^ (2 : ℕ) ∂volume := + MeasureTheory.integral_nonneg fun _ => sq_nonneg _ + have hENN := ENNReal.ofReal_le_ofReal htail_real + rw [ENNReal.ofReal_add (by positivity) (by positivity), ENNReal.ofReal_mul (by positivity), + ENNReal.ofReal_mul (by positivity), ENNReal.ofReal_mul (by positivity), + MeasureTheory.ofReal_integral_eq_lintegral_ofReal (hfi.integrableOn.mono_set + (Set.inter_subset_right)) (ae_of_all _ fun _ => sq_nonneg _), + MeasureTheory.ofReal_integral_eq_lintegral_ofReal (hgi.integrableOn.mono_set + (Set.inter_subset_right)) (ae_of_all _ fun _ => sq_nonneg _), + ← sqWeightedMeasure_apply₀ f hAB, ← sqWeightedMeasure_apply₀ g hCB] at hENN + calc + ENNReal.ofReal (level ^ (2 : ℕ) * D) = + ENNReal.ofReal (level ^ (2 : ℕ)) * ENNReal.ofReal D := + ENNReal.ofReal_mul (sq_nonneg level) + _ ≤ ENNReal.ofReal 2 * sqWeightedMeasure f volume (A ∩ B) + + ENNReal.ofReal (2 * (ε⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume (C ∩ B) := hENN + _ = 2 * sqWeightedMeasure f volume + ({y | level / 2 < ‖f y‖} ∩ Metric.closedBall x r) + + 2 * ENNReal.ofReal ((ε⁻¹) ^ (2 : ℕ)) * sqWeightedMeasure g volume + ({y | ε * level / 2 < ‖g y‖} ∩ Metric.closedBall x r) := by + rw [ENNReal.ofReal_mul (by norm_num : (0 : ℝ) ≤ 2)] + norm_num [A, B, C] + +/-- A combined good-`λ` energy bound controls each component at the same +radius. -/ +theorem closedBallL2Energy_sqrt_bounds_of_goodLambdaCombinedEnergy_le + {d : ℕ} {F G : Type*} [NormedAddCommGroup F] [NormedAddCommGroup G] + (f : Vec d → F) (g : Vec d → G) {ε level r : ℝ} (hε : 0 < ε) (hr : 0 < r) + (x : Vec d) (h : goodLambdaCombinedEnergy f g ε x r ≤ level) : + Real.sqrt (closedBallL2Energy f x r) ≤ level ∧ + Real.sqrt (closedBallL2Energy g x r) ≤ ε * level := by + have hf_nonneg : 0 ≤ closedBallL2Energy f x r := + closedBallL2Energy_nonneg f x hr + have hg_nonneg : 0 ≤ closedBallL2Energy g x r := + closedBallL2Energy_nonneg g x hr + have hfirst : Real.sqrt (closedBallL2Energy f x r) ≤ level := by + calc + Real.sqrt (closedBallL2Energy f x r) ≤ + Real.sqrt (closedBallL2Energy f x r + + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r) := by + apply Real.sqrt_le_sqrt + exact le_add_of_nonneg_right (mul_nonneg (sq_nonneg _) hg_nonneg) + _ = goodLambdaCombinedEnergy f g ε x r := rfl + _ ≤ level := h + have hsecond_scaled : ε⁻¹ * Real.sqrt (closedBallL2Energy g x r) ≤ level := by + have hsqrt_nonneg : 0 ≤ Real.sqrt (closedBallL2Energy g x r) := Real.sqrt_nonneg _ + have hsquare : (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r = + (ε⁻¹ * Real.sqrt (closedBallL2Energy g x r)) ^ (2 : ℕ) := by + rw [mul_pow] + norm_num [Real.sq_sqrt hg_nonneg] + have hroot : ε⁻¹ * Real.sqrt (closedBallL2Energy g x r) ≤ + goodLambdaCombinedEnergy f g ε x r := by + rw [goodLambdaCombinedEnergy] + have hsum_nonneg : 0 ≤ closedBallL2Energy f x r + + (ε⁻¹ * Real.sqrt (closedBallL2Energy g x r)) ^ (2 : ℕ) := by positivity + calc + ε⁻¹ * Real.sqrt (closedBallL2Energy g x r) = + Real.sqrt ((ε⁻¹ * Real.sqrt (closedBallL2Energy g x r)) ^ (2 : ℕ)) := by + rw [Real.sqrt_sq_eq_abs] + exact (abs_of_nonneg (mul_nonneg (inv_nonneg.mpr hε.le) hsqrt_nonneg)).symm + _ ≤ Real.sqrt (closedBallL2Energy f x r + + (ε⁻¹ * Real.sqrt (closedBallL2Energy g x r)) ^ (2 : ℕ)) := by + apply Real.sqrt_le_sqrt + exact le_add_of_nonneg_left hf_nonneg + _ = Real.sqrt (closedBallL2Energy f x r + + (ε⁻¹) ^ (2 : ℕ) * closedBallL2Energy g x r) := by rw [hsquare] + exact hroot.trans h + constructor + · exact hfirst + · have hεinv : ε * ε⁻¹ = 1 := by field_simp [hε.ne'] + have hmul := mul_le_mul_of_nonneg_left hsecond_scaled hε.le + calc + Real.sqrt (closedBallL2Energy g x r) = + (ε * ε⁻¹) * Real.sqrt (closedBallL2Energy g x r) := by rw [hεinv, one_mul] + _ = ε * (ε⁻¹ * Real.sqrt (closedBallL2Energy g x r)) := by ring + _ ≤ ε * level := hmul + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingRadius.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingRadius.lean new file mode 100644 index 0000000000..6be0adeaa3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/StoppingRadius.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import Mathlib.MeasureTheory.Integral.DominatedConvergence +public import Mathlib.MeasureTheory.Measure.Lebesgue.EqHaar + +/-! # Stopping Radius -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators Topology +open Filter MeasureTheory Set + +noncomputable section + +namespace CubeCalderonZygmund + +/-! +# Continuous stopping radii + +This file supplies the continuous-radius ingredient for the Vitali route in +the cube Calderón--Zygmund argument. The ambient `Vec d` carries its sup +metric, so its metric closed balls are axis-parallel cubes. +-/ + +/-- A continuous function that starts above a level and ends below it has a +last radius at the level; after that radius it stays below the level. -/ +theorem exists_last_crossing_of_continuousOn {E : ℝ → ℝ} {a b level : ℝ} + (hab : a ≤ b) (hE : ContinuousOn E (Icc a b)) + (ha : level < E a) (hb : E b ≤ level) : + ∃ r ∈ Icc a b, E r = level ∧ ∀ s ∈ Icc r b, E s ≤ level := by + let S : Set ℝ := Icc a b ∩ E ⁻¹' Ici level + have hS_closed : IsClosed S := by + exact hE.preimage_isClosed_of_isClosed isClosed_Icc isClosed_Ici + have hS_compact : IsCompact S := + isCompact_Icc.of_isClosed_subset hS_closed inter_subset_left + have haS : a ∈ S := by + exact ⟨⟨le_rfl, hab⟩, le_of_lt ha⟩ + obtain ⟨r, hrS, hrmax⟩ := hS_compact.exists_isGreatest ⟨a, haS⟩ + have hr_eq : E r = level := by + have hr_ge : level ≤ E r := hrS.2 + by_contra hne + have hr_gt : level < E r := lt_of_le_of_ne hr_ge (Ne.symm hne) + obtain ⟨s, hsIcc, hsE⟩ := + intermediate_value_Icc' hrS.1.2 (hE.mono (Icc_subset_Icc_left hrS.1.1)) + ⟨hb, hr_gt.le⟩ + have hrs : r ≤ s := hsIcc.1 + have hrs_ne : r ≠ s := by + intro hrs_eq + subst s + exact (ne_of_gt hr_gt) hsE + exact + (not_lt_of_ge (hrmax ⟨⟨hrS.1.1.trans hsIcc.1, hsIcc.2⟩, hsE.ge⟩)) + (lt_of_le_of_ne hrs hrs_ne) + refine ⟨r, hrS.1, hr_eq, ?_⟩ + intro s hs + by_contra hs_not + have hs_gt : level < E s := lt_of_not_ge hs_not + have hrs_ne : r ≠ s := by + intro hrs_eq + subst s + exact (ne_of_gt hs_gt) hr_eq + exact + (not_lt_of_ge (hrmax ⟨⟨hrS.1.1.trans hs.1, hs.2⟩, hs_gt.le⟩)) + (lt_of_le_of_ne hs.1 hrs_ne) + +/-- In positive dimension, a sup-metric sphere in `Vec d` has zero Lebesgue +measure. This is the boundary-null fact used by dominated convergence below. -/ +theorem volume_sphere_eq_zero {d : ℕ} [NeZero d] (x : Vec d) (r : ℝ) : + volume (Metric.sphere x r) = 0 := by + rw [← MeasureTheory.addHaarMeasure_eq_volume_pi (Fin d)] + exact MeasureTheory.Measure.addHaar_sphere _ x r + +/-- The integral of an integrable function over a sup-metric closed ball is +continuous as a function of its positive radius. -/ +theorem continuousOn_setIntegral_closedBall {d : ℕ} [NeZero d] + (f : Vec d → ℝ) (hf : Integrable f volume) (x : Vec d) : + ContinuousOn (fun r => ∫ y in Metric.closedBall x r, f y ∂volume) (Ioi 0) := by + intro r hr + change Tendsto (fun s => ∫ y in Metric.closedBall x s, f y ∂volume) + (𝓝[Ioi 0] r) (𝓝 (∫ y in Metric.closedBall x r, f y ∂volume)) + have hsphere_ae : ∀ᵐ y ∂volume, y ∉ Metric.sphere x r := by + rw [ae_iff] + simpa using! (volume_sphere_eq_zero (d := d) x r) + have hlim : ∀ᵐ y ∂volume, + Tendsto (fun s => (Metric.closedBall x s).indicator f y) (𝓝[Ioi 0] r) + (𝓝 ((Metric.closedBall x r).indicator f y)) := by + filter_upwards [hsphere_ae] with y hy + by_cases hyr : dist y x < r + · apply Filter.EventuallyEq.tendsto + filter_upwards [(eventually_gt_nhds hyr).filter_mono nhdsWithin_le_nhds] with s hys + rw [Set.indicator_of_mem (Metric.mem_closedBall.mpr hys.le), + Set.indicator_of_mem (Metric.mem_closedBall.mpr hyr.le)] + · have hry_le : r ≤ dist y x := le_of_not_gt hyr + have hry_ne : dist y x ≠ r := by + intro hry + exact hy (Metric.mem_sphere.mpr hry) + have hry : r < dist y x := lt_of_le_of_ne hry_le (Ne.symm hry_ne) + apply Filter.EventuallyEq.tendsto + filter_upwards [(eventually_lt_nhds hry).filter_mono nhdsWithin_le_nhds] with s hs + rw [Set.indicator_of_notMem (by simpa only [Metric.mem_closedBall, not_le] using hs), + Set.indicator_of_notMem (by simpa only [Metric.mem_closedBall, not_le] using hry)] + have hdom : ∀ᶠ s in 𝓝[Ioi 0] r, ∀ᵐ y ∂volume, + ‖(Metric.closedBall x s).indicator f y‖ ≤ ‖f y‖ := by + filter_upwards [] with s + filter_upwards [] with y + by_cases hy : y ∈ Metric.closedBall x s + · rw [Set.indicator_of_mem hy] + · rw [Set.indicator_of_notMem hy] + simp only [norm_zero] + exact norm_nonneg _ + have hmeas : ∀ᶠ s in 𝓝[Ioi 0] r, + AEStronglyMeasurable ((Metric.closedBall x s).indicator f) volume := by + filter_upwards [] with s + exact hf.aestronglyMeasurable.indicator measurableSet_closedBall + simpa only [integral_indicator measurableSet_closedBall] using + (tendsto_integral_filter_of_dominated_convergence (fun y => ‖f y‖) hmeas hdom hf.norm hlim) + +/-- The normalized integral over the sup-metric ball. At positive radii this +is the usual set average, since the ball has volume `(2r)^d`. -/ +def closedBallAverage {d : ℕ} (x : Vec d) (r : ℝ) (f : Vec d → ℝ) : ℝ := + ((2 * r) ^ d)⁻¹ * ∫ y in Metric.closedBall x r, f y ∂volume + +theorem closedBallAverage_eq_setAverage {d : ℕ} (x : Vec d) {r : ℝ} + (hr : 0 ≤ r) (f : Vec d → ℝ) : + closedBallAverage x r f = ⨍ y in Metric.closedBall x r, f y ∂volume := by + have h2r : 0 ≤ 2 * r := mul_nonneg (by norm_num) hr + have hpow : 0 ≤ (2 * r) ^ Fintype.card (Fin d) := pow_nonneg h2r _ + rw [closedBallAverage, MeasureTheory.setAverage_eq, smul_eq_mul, + MeasureTheory.measureReal_def, Real.volume_pi_closedBall x hr, + ENNReal.toReal_ofReal hpow] + simp only [Fintype.card_fin] + +/-- Positive-radius normalized closed-ball averages of integrable data are +continuous in the radius. -/ +theorem continuousOn_closedBallAverage {d : ℕ} [NeZero d] + (f : Vec d → ℝ) (hf : Integrable f volume) (x : Vec d) : + ContinuousOn (fun r => closedBallAverage x r f) (Ioi 0) := by + have hdenom : ContinuousOn (fun r : ℝ => ((2 * r) ^ d)⁻¹) (Ioi 0) := by + apply ((continuous_const.mul continuous_id).continuousOn.pow d).inv₀ + intro r hr + exact pow_ne_zero d (mul_ne_zero (by norm_num) (ne_of_gt hr)) + simpa only [closedBallAverage] using! + hdenom.mul (continuousOn_setIntegral_closedBall f hf x) + +/-- The normalized local squared energy over a sup-metric closed ball. -/ +def closedBallL2Energy {d : ℕ} {F : Type*} [NormedAddCommGroup F] + (u : Vec d → F) (x : Vec d) (r : ℝ) : ℝ := + closedBallAverage x r fun y => ‖u y‖ ^ 2 + +/-- Integrable square data has a continuous normalized local `L²` energy on +positive radii. -/ +theorem continuousOn_closedBallL2Energy {d : ℕ} [NeZero d] + {F : Type*} [NormedAddCommGroup F] (u : Vec d → F) + (hu : Integrable (fun y => ‖u y‖ ^ 2) volume) (x : Vec d) : + ContinuousOn (fun r => closedBallL2Energy u x r) (Ioi 0) := + continuousOn_closedBallAverage (fun y => ‖u y‖ ^ 2) hu x + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/W10pWeakTestClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/W10pWeakTestClosure.lean new file mode 100644 index 0000000000..d0a122d235 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/W10pWeakTestClosure.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions + +/-! # W10p Weak Test Closure -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +private theorem tendsto_eLpNorm_two_of_tendsto_eLpNorm_finiteMeasure + {d : ℕ} {U : Set (Vec d)} [IsFiniteMeasure (volume.restrict U)] + (p : FiniteLpExponent) (hp : 2 ≤ p.exponent) + {F : ℕ → Vec d → ℝ} {G : Vec d → ℝ} + (hF : ∀ n, MemLp (F n) p.exponent (volume.restrict U)) + (hG : MemLp G p.exponent (volume.restrict U)) + (hTendsto : Tendsto + (fun n => eLpNorm (fun x => F n x - G x) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + Tendsto + (fun n => eLpNorm (fun x => F n x - G x) 2 (volume.restrict U)) + atTop (nhds 0) := by + let μ : Measure (Vec d) := volume.restrict U + have hdiff_meas : ∀ n, AEStronglyMeasurable (fun x => F n x - G x) μ := by + intro n + exact (hF n).aestronglyMeasurable.sub hG.aestronglyMeasurable + have hp_real : 0 ≤ 1 / (2 : ℝ≥0∞).toReal - 1 / p.exponent.toReal := by + have hp_two : (2 : ℝ≥0∞).toReal ≤ p.exponent.toReal := + (ENNReal.toReal_le_toReal (by norm_num) p.lt_top.ne).mpr hp + apply sub_nonneg.mpr + exact one_div_le_one_div_of_le (by norm_num) hp_two + have hbound : ∀ n, + eLpNorm (fun x => F n x - G x) 2 μ ≤ + eLpNorm (fun x => F n x - G x) p.exponent μ * + μ Set.univ ^ (1 / (2 : ℝ≥0∞).toReal - 1 / p.exponent.toReal) := by + intro n + exact eLpNorm_le_eLpNorm_mul_rpow_measure_univ hp (hdiff_meas n) + have hfactor_ne_top : + μ Set.univ ^ (1 / (2 : ℝ≥0∞).toReal - 1 / p.exponent.toReal) ≠ ∞ := by + refine (ENNReal.rpow_lt_top_of_nonneg hp_real ?_).ne + exact (measure_lt_top μ Set.univ).ne + have hscaled : Tendsto + (fun n => eLpNorm (fun x => F n x - G x) p.exponent μ * + μ Set.univ ^ (1 / (2 : ℝ≥0∞).toReal - 1 / p.exponent.toReal)) + atTop (nhds 0) := by + change Tendsto + (fun n => eLpNorm (fun x => F n x - G x) p.exponent (volume.restrict U) * + (volume.restrict U) Set.univ ^ + (1 / (2 : ℝ≥0∞).toReal - 1 / p.exponent.toReal)) + atTop (nhds 0) + simpa only [zero_mul] using + ENNReal.Tendsto.mul_const hTendsto (Or.inr hfactor_ne_top) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled (fun _ => zero_le) hbound + +private theorem integral_vecDot_eq_sum_integral_coord + {d : ℕ} {U : Set (Vec d)} {F G : Vec d → Vec d} + (hF : ∀ i : Fin d, MemScalarL2 U (fun x => F x i)) + (hG : ∀ i : Fin d, MemScalarL2 U (fun x => G x i)) : + ∫ x in U, vecDot (F x) (G x) ∂volume = + ∑ i : Fin d, ∫ x in U, F x i * G x i ∂volume := by + calc + ∫ x in U, vecDot (F x) (G x) ∂volume = + ∫ x in U, ∑ i : Fin d, F x i * G x i ∂volume := by + simp only [vecDot] + _ = ∑ i : Fin d, ∫ x in U, F x i * G x i ∂volume := by + rw [integral_finsetSum] + intro i _ + exact (hF i).integrable_mul (hG i) + +/-- Extend a smooth compactly supported weak-divergence identity to every +zero-trace `W^{1,p}` test on a finite-measure domain when `p ≥ 2`. -/ +theorem weak_divergence_identity_of_w10p + {d : ℕ} {U : Set (Vec d)} [IsFiniteMeasure (volume.restrict U)] + (p : FiniteLpExponent) (hp : 2 ≤ p.exponent) + (w : H1Function U) (h : Vec d → Vec d) (hh : MemVectorL2 U h) + (sigma0 : ℝ) + (hweak : ∀ phi : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) phi → + HasCompactSupport phi → tsupport phi ⊆ U → + sigma0 * ∫ x in U, vecDot (w.grad x) (euclideanGradient phi x) ∂volume = + -∫ x in U, vecDot (h x) (euclideanGradient phi x) ∂volume) + (v : W10pFunction U p.exponent) : + sigma0 * ∫ x in U, vecDot (w.grad x) (v.grad x) ∂volume = + -∫ x in U, vecDot (h x) (v.grad x) ∂volume := by + let Dv : Vec d → Vec d := v.grad + let Dvn : ℕ → Vec d → Vec d := fun n => euclideanGradient (v.approx n) + have hDvn_mem_p : ∀ n i, MemLp (fun x => Dvn n x i) p.exponent + (volume.restrict U) := by + intro n i + have hcont : Continuous (fun x => (fderiv ℝ (v.approx n) x) (basisVec i)) := by + simpa using + (v.approx_smooth n).continuous_fderiv (by simp) |>.clm_apply continuous_const + have hsupp : HasCompactSupport + (fun x => (fderiv ℝ (v.approx n) x) (basisVec i)) := by + simpa using (v.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i) + simpa [Dvn, euclideanGradient, euclideanCoordDeriv] using + (hcont.memLp_of_hasCompactSupport hsupp).restrict U + have hDv_mem_p : ∀ i, MemLp (fun x => Dv x i) p.exponent (volume.restrict U) := by + intro i + simpa [Dv] using v.gradMemLp i + have hDvn_mem_two : ∀ n i, MemScalarL2 U (fun x => Dvn n x i) := by + intro n i + exact (hDvn_mem_p n i).mono_exponent hp + have hDv_mem_two : ∀ i, MemScalarL2 U (fun x => Dv x i) := by + intro i + exact (hDv_mem_p i).mono_exponent hp + have hDvn_to_Dv_two : ∀ i, Tendsto + (fun n => eLpNorm (fun x => Dvn n x i - Dv x i) 2 (volume.restrict U)) + atTop (nhds 0) := by + intro i + apply tendsto_eLpNorm_two_of_tendsto_eLpNorm_finiteMeasure p hp + (fun n => hDvn_mem_p n i) (hDv_mem_p i) + simpa [Dvn, Dv, euclideanGradient, euclideanCoordDeriv] using + v.tendsto_approx_grad i + have hDvn_to_Dv_l2 : ∀ i, Tendsto + (fun n => toScalarL2 (hDvn_mem_two n i)) atTop + (nhds (toScalarL2 (hDv_mem_two i))) := by + intro i + exact tendsto_toScalarL2_of_tendsto_eLpNorm + (fun n => hDvn_mem_two n i) (hDv_mem_two i) (hDvn_to_Dv_two i) + have hw_pair : ∀ i, Tendsto + (fun n => ∫ x in U, w.grad x i * Dvn n x i ∂volume) + atTop (nhds (∫ x in U, w.grad x i * Dv x i ∂volume)) := by + intro i + exact tendsto_integral_mul_of_tendsto_toScalarL2 + (w.gradMemL2 i) (fun n => hDvn_mem_two n i) (hDv_mem_two i) + (hDvn_to_Dv_l2 i) + have hh_coord : ∀ i, MemScalarL2 U (fun x => h x i) := by + intro i + exact memScalarL2_coord_of_memVectorL2 hh i + have hh_pair : ∀ i, Tendsto + (fun n => ∫ x in U, h x i * Dvn n x i ∂volume) + atTop (nhds (∫ x in U, h x i * Dv x i ∂volume)) := by + intro i + exact tendsto_integral_mul_of_tendsto_toScalarL2 + (hh_coord i) (fun n => hDvn_mem_two n i) (hDv_mem_two i) + (hDvn_to_Dv_l2 i) + have hw_pair_vec : Tendsto + (fun n => ∫ x in U, vecDot (w.grad x) (Dvn n x) ∂volume) + atTop (nhds (∫ x in U, vecDot (w.grad x) (Dv x) ∂volume)) := by + have hsum := tendsto_finsetSum Finset.univ (fun i _ => hw_pair i) + rw [show + (fun n => ∫ x in U, vecDot (w.grad x) (Dvn n x) ∂volume) = + fun n => ∑ i : Fin d, ∫ x in U, w.grad x i * Dvn n x i ∂volume by + funext n + exact integral_vecDot_eq_sum_integral_coord (fun i => w.gradMemL2 i) + (fun i => hDvn_mem_two n i)] + rw [show + ∫ x in U, vecDot (w.grad x) (Dv x) ∂volume = + ∑ i : Fin d, ∫ x in U, w.grad x i * Dv x i ∂volume by + exact integral_vecDot_eq_sum_integral_coord (fun i => w.gradMemL2 i) hDv_mem_two] + exact hsum + have hh_pair_vec : Tendsto + (fun n => ∫ x in U, vecDot (h x) (Dvn n x) ∂volume) + atTop (nhds (∫ x in U, vecDot (h x) (Dv x) ∂volume)) := by + have hsum := tendsto_finsetSum Finset.univ (fun i _ => hh_pair i) + rw [show + (fun n => ∫ x in U, vecDot (h x) (Dvn n x) ∂volume) = + fun n => ∑ i : Fin d, ∫ x in U, h x i * Dvn n x i ∂volume by + funext n + exact integral_vecDot_eq_sum_integral_coord hh_coord + (fun i => hDvn_mem_two n i)] + rw [show + ∫ x in U, vecDot (h x) (Dv x) ∂volume = + ∑ i : Fin d, ∫ x in U, h x i * Dv x i ∂volume by + exact integral_vecDot_eq_sum_integral_coord hh_coord hDv_mem_two] + exact hsum + have hleft : Tendsto + (fun n => sigma0 * ∫ x in U, vecDot (w.grad x) (Dvn n x) ∂volume) + atTop (nhds (sigma0 * ∫ x in U, vecDot (w.grad x) (Dv x) ∂volume)) := + hw_pair_vec.const_mul sigma0 + have hright : Tendsto + (fun n => -∫ x in U, vecDot (h x) (Dvn n x) ∂volume) + atTop (nhds (-∫ x in U, vecDot (h x) (Dv x) ∂volume)) := + hh_pair_vec.neg + have hseq : + (fun n => sigma0 * ∫ x in U, vecDot (w.grad x) (Dvn n x) ∂volume) = + fun n => -∫ x in U, vecDot (h x) (Dvn n x) ∂volume := by + funext n + exact hweak (v.approx n) (v.approx_smooth n) (v.approx_hasCompactSupport n) + (v.approx_support_subset n) + exact tendsto_nhds_unique (hleft.congr' (EventuallyEq.of_eq hseq)) hright + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianFiniteP.lean new file mode 100644 index 0000000000..910ad148a8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianFiniteP.lean @@ -0,0 +1,135 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality + +/-! +# Finite-`p` aggregation for weak Hessians + +This file packages rowwise Euclidean `L^p` control of a weak Hessian into the +project's Hilbert matrix carrier. The norm estimate retains the exact finite +exponent and bounds the matrix norm by the finite sum of its row norms. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +namespace HasWeakHessianOn + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-- Rowwise Euclidean `L^p` membership packages into matrix-valued `L^p` +membership. -/ +theorem hessianHilbertMat_memLp_of_rows (H : HasWeakHessianOn U u) + (q : FiniteLpExponent) (μ : MeasureTheory.Measure (Vec d)) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent μ) : + MeasureTheory.MemLp + (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent μ := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [Function.comp_apply, HilbertMat.ofMat, PiLp.toLp_apply] using hrows i + +/-- The matrix-valued finite-`p` norm of a weak Hessian is bounded by the +finite sum of the Euclidean finite-`p` norms of its rows. -/ +theorem eLpNorm_hessianHilbertMat_le_sum_rows (H : HasWeakHessianOn U u) + (q : FiniteLpExponent) (μ : MeasureTheory.Measure (Vec d)) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent μ) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent μ ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent μ := by + let row : Fin d → Vec d → HilbertVec d := + fun i x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x) + let singleRow : Fin d → Vec d → HilbertMat d := + fun i x ↦ WithLp.toLp 2 (Pi.single i (row i x)) + have hsingleRow : ∀ i : Fin d, + MeasureTheory.MemLp (singleRow i) q.exponent μ := by + intro i + rw [MeasureTheory.memLp_piLp_iff] + intro k + by_cases hik : i = k + · subst k + simpa only [singleRow, row, Function.comp_apply, PiLp.toLp_apply, + Pi.single_eq_same] using hrows i + · have hzero : MeasureTheory.MemLp + (fun _ : Vec d ↦ (0 : HilbertVec d)) q.exponent μ := + MeasureTheory.MemLp.zero' + simpa only [singleRow, Function.comp_apply, PiLp.toLp_apply, + Pi.single_eq_of_ne (Ne.symm hik)] using hzero + have hmatrix : + (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) = + ∑ i : Fin d, singleRow i := by + funext x + ext i j + simp [singleRow, row] + rw [hmatrix] + calc + MeasureTheory.eLpNorm (∑ i : Fin d, singleRow i) q.exponent μ ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm (singleRow i) q.exponent μ := by + exact MeasureTheory.eLpNorm_sum_le + q.one_lt.le + _ = ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent μ := by + apply Finset.sum_congr rfl + intro i _ + apply MeasureTheory.eLpNorm_congr_norm_ae + (hsingleRow i).aestronglyMeasurable (hrows i).aestronglyMeasurable + exact MeasureTheory.ae_of_all μ fun x ↦ by simp [singleRow, row] + +/-- Normalized-cube specialization of +`HasWeakHessianOn.hessianHilbertMat_memLp_of_rows`. -/ +theorem hessianHilbertMat_memLp_normalizedCubeMeasure_of_rows + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (q : FiniteLpExponent) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp + (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure Q) := + H.hessianHilbertMat_memLp_of_rows q (normalizedCubeMeasure Q) hrows + +/-- Normalized-cube specialization of the finite-`p` row-sum estimate. -/ +theorem eLpNorm_hessianHilbertMat_normalizedCubeMeasure_le_sum_rows + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (q : FiniteLpExponent) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure Q)) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertMat.ofMat (fun i j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure Q) ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + q.exponent (normalizedCubeMeasure Q) := + H.eLpNorm_hessianHilbertMat_le_sum_rows q (normalizedCubeMeasure Q) hrows + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianRowL2Energy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianRowL2Energy.lean new file mode 100644 index 0000000000..ff5c91c5e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakHessianRowL2Energy.lean @@ -0,0 +1,273 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GlobalLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import Mathlib.MeasureTheory.SpecificCodomains.WithLp + +/-! # Weak Hessian Row L2Energy -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- Total square-weighted mass is exactly the square of the `L²` `eLpNorm`. +This identity itself needs no integrability assumption. -/ +theorem sqWeightedMeasure_apply_univ_eq_integralLpSeminorm_two_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + (f : α → E) (μ : Measure α) : + sqWeightedMeasure f μ Set.univ = (Gagliardo.integralLpSeminorm f 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure, withDensity_apply _ MeasurableSet.univ, + Measure.restrict_univ] + change (∫⁻ x, ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) ∂μ) = _ + simp_rw [ENNReal.ofReal_pow (norm_nonneg _), ofReal_norm] + simp only [Gagliardo.integralLpSeminorm, + show (2 : ℝ≥0∞) ≠ 0 by norm_num, show (2 : ℝ≥0∞) ≠ ∞ by norm_num, + if_false, eLpNorm'_eq_lintegral_enorm] + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + +/-- The square-mass identity written using Mathlib’s norm for measurable functions. -/ +theorem sqWeightedMeasure_apply_univ_eq_eLpNorm_two_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + (f : α → E) (μ : Measure α) (hf : AEStronglyMeasurable f μ) : + sqWeightedMeasure f μ Set.univ = (eLpNorm f 2 μ) ^ (2 : ℕ) := by + rw [sqWeightedMeasure_apply_univ_eq_integralLpSeminorm_two_sq, + Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hf] + +end CubeCalderonZygmund + +namespace HasWeakHessianOn + +open MeasureTheory + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-! +# Quantitative `L²` energy of one weak-Hessian row + +The coordinate `L²` data in `HasWeakHessianOn` control each Euclidean +Hilbert realization of a Hessian row. The estimates below retain the older +coordinate-`ℓ1` energy `hessianCoordL2NormSum`, which is the quantity supplied +by the quantitative weak-`H²` theory. +-/ + +/-- A Hilbertified Hessian row belongs to raw `L²` on the carrier domain. -/ +theorem hessianHilbertRow_memLp_two (H : HasWeakHessianOn U u) (i : Fin d) : + MemLp (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (volumeMeasureOn U) := by + rw [memLp_piLp_iff] + intro j + simpa only [hilbertifyVecField, Function.comp_apply, HilbertVec.ofVec, + PiLp.toLp_apply] using H.hess_memL2 i j + +/-- A Hessian coordinate's raw `eLpNorm` is the extended-real realization of +the norm stored in `hessCoordToScalarL2`. -/ +theorem eLpNorm_hess_eq_ofReal_norm_hessCoordToScalarL2 + (H : HasWeakHessianOn U u) (i j : Fin d) : + eLpNorm (fun x ↦ H.hess i j x) 2 (volumeMeasureOn U) = + ENNReal.ofReal ‖H.hessCoordToScalarL2 i j‖ := by + calc + eLpNorm (fun x ↦ H.hess i j x) 2 (volumeMeasureOn U) = + ‖H.hessCoordToScalarL2 i j‖ₑ := by + exact (Lp.enorm_toLp (H.hess_memL2 i j)).symm + _ = ENNReal.ofReal ‖H.hessCoordToScalarL2 i j‖ := + (ofReal_norm _).symm + +/-- The raw Euclidean `L²` norm of one Hessian row is bounded by the total +coordinate `L²` energy recorded by the weak-Hessian witness. -/ +theorem eLpNorm_hessianHilbertRow_two_le + (H : HasWeakHessianOn U u) (i : Fin d) : + eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (volumeMeasureOn U) ≤ + ENNReal.ofReal H.hessianCoordL2NormSum := by + let row : Vec d → HilbertVec d := + hilbertifyVecField (fun x j ↦ H.hess i j x) + let singleCoord : Fin d → Vec d → HilbertVec d := + fun j x ↦ HilbertVec.ofVec (Pi.single j (H.hess i j x)) + have hsingle : ∀ j : Fin d, MemLp (singleCoord j) 2 (volumeMeasureOn U) := by + intro j + rw [memLp_piLp_iff] + intro k + by_cases hjk : j = k + · subst k + simpa only [singleCoord, Function.comp_apply, HilbertVec.ofVec, + PiLp.toLp_apply, Pi.single_eq_same] using H.hess_memL2 i j + · simpa only [singleCoord, Function.comp_apply, HilbertVec.ofVec, + PiLp.toLp_apply, Pi.single_eq_of_ne (Ne.symm hjk)] using + (MemLp.zero' : MemLp (fun _ : Vec d ↦ (0 : ℝ)) 2 + (volumeMeasureOn U)) + have hrow : row = ∑ j : Fin d, singleCoord j := by + funext x + ext k + simp [row, singleCoord, hilbertifyVecField] + have hrow_le : eLpNorm row 2 (volumeMeasureOn U) ≤ + ∑ j : Fin d, eLpNorm (fun x ↦ H.hess i j x) 2 + (volumeMeasureOn U) := by + rw [hrow] + refine (eLpNorm_sum_le + (by norm_num : (1 : ℝ≥0∞) ≤ 2)).trans_eq ?_ + apply Finset.sum_congr rfl + intro j _ + apply eLpNorm_congr_norm_ae (hsingle j).aestronglyMeasurable + (H.hess_memL2 i j).aestronglyMeasurable + exact ae_of_all _ fun x ↦ by simp [singleCoord] + calc + eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (volumeMeasureOn U) = eLpNorm row 2 (volumeMeasureOn U) := rfl + _ ≤ ∑ j : Fin d, eLpNorm (fun x ↦ H.hess i j x) 2 + (volumeMeasureOn U) := hrow_le + _ = ∑ j : Fin d, ENNReal.ofReal ‖H.hessCoordToScalarL2 i j‖ := by + apply Finset.sum_congr rfl + intro j _ + exact H.eLpNorm_hess_eq_ofReal_norm_hessCoordToScalarL2 i j + _ = ENNReal.ofReal (∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) := by + rw [ENNReal.ofReal_sum_of_nonneg] + exact fun j _ ↦ norm_nonneg _ + _ ≤ ENNReal.ofReal H.hessianCoordL2NormSum := by + apply ENNReal.ofReal_le_ofReal + unfold hessianCoordL2NormSum + exact Finset.single_le_sum + (fun k _ ↦ Finset.sum_nonneg fun j _ ↦ norm_nonneg + (H.hessCoordToScalarL2 k j)) + (Finset.mem_univ i) + +/-- Real-valued form of the raw one-row `L²` estimate. -/ +theorem toReal_eLpNorm_hessianHilbertRow_two_le + (H : HasWeakHessianOn U u) (i : Fin d) : + (eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (volumeMeasureOn U)).toReal ≤ H.hessianCoordL2NormSum := by + have htop := (H.hessianHilbertRow_memLp_two i).eLpNorm_ne_top + rw [← ENNReal.le_ofReal_iff_toReal_le htop H.hessianCoordL2NormSum_nonneg] + exact H.eLpNorm_hessianHilbertRow_two_le i + +/-- The total raw square-weighted mass of one Hilbertified Hessian row is +bounded by the square of `hessianCoordL2NormSum`. -/ +theorem sqWeightedMeasure_hessianHilbertRow_apply_univ_le + (H : HasWeakHessianOn U u) (i : Fin d) : + CubeCalderonZygmund.sqWeightedMeasure + (hilbertifyVecField (fun x j ↦ H.hess i j x)) + (volumeMeasureOn U) Set.univ ≤ + ENNReal.ofReal (H.hessianCoordL2NormSum ^ (2 : ℕ)) := by + rw [CubeCalderonZygmund.sqWeightedMeasure_apply_univ_eq_eLpNorm_two_sq _ _ + (H.hessianHilbertRow_memLp_two i).aestronglyMeasurable] + rw [ENNReal.ofReal_pow H.hessianCoordL2NormSum_nonneg] + exact pow_le_pow_left₀ bot_le (H.eLpNorm_hessianHilbertRow_two_le i) 2 + +/-- On a cube, a Hilbertified Hessian row belongs to normalized `L²`. -/ +theorem hessianHilbertRow_memLp_two_normalizedCubeMeasure + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i : Fin d) : + MemLp (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q) := by + rw [memLp_piLp_iff] + intro j + simpa only [hilbertifyVecField, Function.comp_apply, HilbertVec.ofVec, + PiLp.toLp_apply] using H.hess_memLp_normalizedCubeMeasure Q i j + +/-- The normalized Euclidean `L²` norm of one Hessian row has the expected +inverse-square-root volume factor. -/ +theorem eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i : Fin d) : + eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum) := by + have hfactor : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + eLpNorm_smul_measure_of_ne_zero hfactor] + rw [show (1 / (2 : ℝ≥0∞)).toReal = (2 : ℝ)⁻¹ by norm_num] + simp only [smul_eq_mul] + calc + ENNReal.ofReal ((cubeVolume Q)⁻¹) ^ (2 : ℝ)⁻¹ * + eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (volumeMeasureOn (openCubeSet Q)) ≤ + ENNReal.ofReal ((cubeVolume Q)⁻¹) ^ (2 : ℝ)⁻¹ * + ENNReal.ofReal H.hessianCoordL2NormSum := by + exact mul_le_mul_of_nonneg_left + (H.eLpNorm_hessianHilbertRow_two_le i) bot_le + _ = ENNReal.ofReal + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum) := by + rw [show (1 / 2 : ℝ) = (2 : ℝ)⁻¹ by norm_num] + rw [ENNReal.ofReal_mul + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _)] + congr 1 + rw [← ENNReal.ofReal_rpow_of_nonneg + (inv_nonneg.mpr (cubeVolume_nonneg Q)) (by norm_num)] + +/-- Real-valued form of the normalized one-row `L²` estimate. -/ +theorem toReal_eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i : Fin d) : + (eLpNorm (hilbertifyVecField (fun x j ↦ H.hess i j x)) 2 + (normalizedCubeMeasure Q)).toReal ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum := by + have htop := + (H.hessianHilbertRow_memLp_two_normalizedCubeMeasure Q i).eLpNorm_ne_top + rw [← ENNReal.le_ofReal_iff_toReal_le htop (mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + H.hessianCoordL2NormSum_nonneg)] + exact H.eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le Q i + +/-- The normalized total square-weighted mass of one Hessian row is controlled +by the square of the volume-normalized weak-`H²` energy. -/ +theorem sqWeightedMeasure_hessianHilbertRow_normalizedCubeMeasure_apply_univ_le + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i : Fin d) : + CubeCalderonZygmund.sqWeightedMeasure + (hilbertifyVecField (fun x j ↦ H.hess i j x)) + (normalizedCubeMeasure Q) Set.univ ≤ + ENNReal.ofReal + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + H.hessianCoordL2NormSum) ^ (2 : ℕ)) := by + rw [CubeCalderonZygmund.sqWeightedMeasure_apply_univ_eq_eLpNorm_two_sq _ _ + (H.hessianHilbertRow_memLp_two_normalizedCubeMeasure Q i).aestronglyMeasurable] + rw [ENNReal.ofReal_pow (mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + H.hessianCoordL2NormSum_nonneg)] + exact pow_le_pow_left₀ bot_le + (H.eLpNorm_hessianHilbertRow_two_normalizedCubeMeasure_le Q i) 2 + +/-- A measurable-domain zero extension of one Hessian row belongs to global +`L²`. -/ +theorem indicator_hessianHilbertRow_memLp_two + (H : HasWeakHessianOn U u) (i : Fin d) (hU : MeasurableSet U) : + MemLp (U.indicator (hilbertifyVecField (fun x j ↦ H.hess i j x))) 2 + volume := by + exact (CubeCalderonZygmund.memLp_indicator_iff_restrict hU).2 + (H.hessianHilbertRow_memLp_two i) + +/-- The global square-weighted mass of a Hessian row extended by zero is +controlled by its local weak-`H²` energy. -/ +theorem sqWeightedMeasure_indicator_hessianHilbertRow_apply_univ_le + (H : HasWeakHessianOn U u) (i : Fin d) (hU : MeasurableSet U) : + CubeCalderonZygmund.sqWeightedMeasure + (U.indicator (hilbertifyVecField (fun x j ↦ H.hess i j x))) + volume Set.univ ≤ + ENNReal.ofReal (H.hessianCoordL2NormSum ^ (2 : ℕ)) := by + rw [CubeCalderonZygmund.sqWeightedMeasure_indicator_eq_restrict hU] + exact H.sqWeightedMeasure_hessianHilbertRow_apply_univ_le i + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakPoissonDerivative.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakPoissonDerivative.lean new file mode 100644 index 0000000000..46700250fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeakPoissonDerivative.lean @@ -0,0 +1,380 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 + +/-! # Weak Poisson Derivative -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Weak equation for a derivative of a Poisson solution + +Differentiating `-Delta u = F` in one coordinate does not require a derivative +of `F`: the forcing is retained in divergence form as the vector field with +`F` in that coordinate and zero in the others. This file establishes that +identity from the scalar weak equation and an internally constructed weak +Hessian witness. +-/ + +namespace CubeCalderonZygmund + +/-- Inserting a scalar `L²` field into one coordinate gives a vector `L²` +field. -/ +theorem memVectorL2_singleCoordinate {d : ℕ} {U : Set (Vec d)} + {F : Vec d → ℝ} (hF : MemScalarL2 U F) (i : Fin d) : + MemVectorL2 U (fun x j => if j = i then F x else 0) := by + classical + apply MeasureTheory.MemLp.of_eval + intro j + by_cases hji : j = i + · subst j + simpa using hF + · rw [show (fun x : Vec d => if j = i then F x else 0) = + fun _ : Vec d => (0 : ℝ) by + funext x + simp [hji]] + exact MeasureTheory.MemLp.zero' + +/-- Weak Hessian coordinates commute when paired with a smooth compactly +supported test. This is the distributional mixed-derivative argument needed +below; no pointwise Hessian representative is selected. -/ +private theorem setIntegral_hess_comm {d : ℕ} {U : Set (Vec d)} + {u : H1Function U} (hU : IsOpen U) (H : HasWeakHessianOn U u) + (i j : Fin d) (φ : Vec d → ℝ) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + ∫ x in U, H.hess i j x * φ x ∂MeasureTheory.volume = + ∫ x in U, H.hess j i x * φ x ∂MeasureTheory.volume := by + have hweak_ij := H.weak_second i j φ hφ hφs hφ_sub + have hweak_ji := H.weak_second j i φ hφ hφs hφ_sub + have hu_ij := u.hasWeakPartialDerivOn i (euclideanCoordDeriv j φ) + (contDiff_euclideanCoordDeriv hφ j) + (hasCompactSupport_euclideanCoordDeriv hφs j) + ((tsupport_euclideanCoordDeriv_subset_tsupport j φ).trans hφ_sub) + have hu_ji := u.hasWeakPartialDerivOn j (euclideanCoordDeriv i φ) + (contDiff_euclideanCoordDeriv hφ i) + (hasCompactSupport_euclideanCoordDeriv hφs i) + ((tsupport_euclideanCoordDeriv_subset_tsupport i φ).trans hφ_sub) + have hweak_ij' : + ∫ x in U, u.grad x i * euclideanCoordDeriv j φ x + ∂MeasureTheory.volume = + -∫ x in U, H.hess i j x * φ x ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using hweak_ij + have hweak_ji' : + ∫ x in U, u.grad x j * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume = + -∫ x in U, H.hess j i x * φ x ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using hweak_ji + have hu_ij' : + ∫ x in U, u x * euclideanCoordSecondDeriv j i φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * euclideanCoordDeriv j φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hu_ij + have hu_ji' : + ∫ x in U, u x * euclideanCoordSecondDeriv i j φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x j * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hu_ji + calc + ∫ x in U, H.hess i j x * φ x ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * euclideanCoordDeriv j φ x + ∂MeasureTheory.volume := by + linarith [hweak_ij'] + _ = ∫ x in U, u x * euclideanCoordSecondDeriv j i φ x + ∂MeasureTheory.volume := by + linarith [hu_ij'] + _ = ∫ x in U, u x * euclideanCoordSecondDeriv i j φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + change u x * euclideanCoordSecondDeriv j i φ x = + u x * euclideanCoordSecondDeriv i j φ x + rw [euclideanCoordSecondDeriv_comm hφ j i x] + _ = -∫ x in U, u.grad x j * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by + linarith [hu_ji'] + _ = ∫ x in U, H.hess j i x * φ x ∂MeasureTheory.volume := by + linarith [hweak_ji'] + +end CubeCalderonZygmund + +namespace WeakPoissonEquationOn + +/-- A scalar weak Poisson equation yields the divergence-form weak equation +for every gradient coordinate. The datum is `F` in the differentiated +coordinate and zero in all other coordinates; in particular, the conclusion +assumes neither a weak derivative of `F` nor a trace for `∂ᵢu`. + +The `MemScalarL2` hypothesis records that this coordinate datum is admissible +as an `L²` vector field, via +`CubeCalderonZygmund.memVectorL2_singleCoordinate`. -/ +theorem gradCoordH1Function_weakDivergence {d : ℕ} {U : Set (Vec d)} + {u : H1Function U} {F : Vec d → ℝ} (hU : IsOpen U) + (hF : MemScalarL2 U F) (h : WeakPoissonEquationOn U u F) + (H : HasWeakHessianOn U u) (i : Fin d) : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in U, + vecDot (fun j => if j = i then F x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + classical + have _hdatum_memL2 := + CubeCalderonZygmund.memVectorL2_singleCoordinate hF i + intro φ hφ hφs hφ_sub + have hderiv_memL2 : ∀ k : Fin d, MemScalarL2 U (euclideanCoordDeriv k φ) := by + intro k + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hφ k).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hφs k)).restrict U + have hsecond_memL2 : ∀ k : Fin d, + MemScalarL2 U (euclideanCoordSecondDeriv i k φ) := by + intro k + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordSecondDeriv hφ i k).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordSecondDeriv hφs i k)).restrict U + have hhess_int : ∀ k : Fin d, + MeasureTheory.Integrable (fun x => H.hess i k x * euclideanCoordDeriv k φ x) + (MeasureTheory.volume.restrict U) := by + intro k + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (H.hess_memL2 i k).integrable_mul (hderiv_memL2 k) + have hgrad_int : ∀ k : Fin d, + MeasureTheory.Integrable + (fun x => u.grad x k * euclideanCoordSecondDeriv i k φ x) + (MeasureTheory.volume.restrict U) := by + intro k + simpa [MemScalarL2, volumeMeasureOn, Pi.mul_apply] using! + (u.grad_memL2 k).integrable_mul (hsecond_memL2 k) + have htest := h.test (euclideanCoordDeriv i φ) + (contDiff_euclideanCoordDeriv hφ i) + (hasCompactSupport_euclideanCoordDeriv hφs i) + ((tsupport_euclideanCoordDeriv_subset_tsupport i φ).trans hφ_sub) + have hforcing_sum : + ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume = + ∫ x in U, F x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume := by + calc + ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume = + ∫ x in U, + vecDot (u.grad x) (euclideanGradient (euclideanCoordDeriv i φ) x) + ∂MeasureTheory.volume := by + symm + calc + ∫ x in U, + vecDot (u.grad x) (euclideanGradient (euclideanCoordDeriv i φ) x) + ∂MeasureTheory.volume = + ∫ x in U, ∑ k : Fin d, + u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp only [vecDot, euclideanGradient, euclideanCoordSecondDeriv, + euclideanCoordDeriv] + _ = ∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro k _ + exact hgrad_int k + _ = ∫ x in U, F x * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using htest + have htranspose : ∀ k : Fin d, + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + intro k + have hweak := H.weak_second k i (euclideanCoordDeriv k φ) + (contDiff_euclideanCoordDeriv hφ k) + (hasCompactSupport_euclideanCoordDeriv hφs k) + ((tsupport_euclideanCoordDeriv_subset_tsupport k φ).trans hφ_sub) + have hweak' : + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv k i φ x + ∂MeasureTheory.volume = + -∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordDeriv] using hweak + calc + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv k i φ x + ∂MeasureTheory.volume := by + linarith [hweak'] + _ = -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply congrArg Neg.neg + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + change u.grad x k * euclideanCoordSecondDeriv k i φ x = + u.grad x k * euclideanCoordSecondDeriv i k φ x + rw [euclideanCoordSecondDeriv_comm hφ k i x] + have hswap : ∀ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume = + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + intro k + exact CubeCalderonZygmund.setIntegral_hess_comm hU H i k + (euclideanCoordDeriv k φ) (contDiff_euclideanCoordDeriv hφ k) + (hasCompactSupport_euclideanCoordDeriv hφs k) + ((tsupport_euclideanCoordDeriv_subset_tsupport k φ).trans hφ_sub) + calc + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∑ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + calc + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, ∑ k : Fin d, + H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp only [vecDot, HasWeakHessianOn.gradCoordH1Function_grad_apply, + euclideanGradient, euclideanCoordDeriv] + _ = ∑ k : Fin d, + ∫ x in U, H.hess i k x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro k _ + exact hhess_int k + _ = ∑ k : Fin d, + ∫ x in U, H.hess k i x * euclideanCoordDeriv k φ x + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro k _ + exact hswap k + _ = ∑ k : Fin d, + -∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro k _ + exact htranspose k + _ = -∑ k : Fin d, + ∫ x in U, u.grad x k * euclideanCoordSecondDeriv i k φ x + ∂MeasureTheory.volume := by + rw [Finset.sum_neg_distrib] + _ = -∫ x in U, F x * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume := by + rw [hforcing_sum] + _ = -∫ x in U, + vecDot (fun j => if j = i then F x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + congr 1 + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp [vecDot, euclideanGradient, euclideanCoordDeriv] + +/-- Constant-coefficient form of +`WeakPoissonEquationOn.gradCoordH1Function_weakDivergence`. If +`-sigma0 * Delta u = F`, then `∂ᵢu` has divergence datum `F eᵢ` with the +coefficient and sign left unchanged. -/ +theorem gradCoordH1Function_weakDivergence_constCoeff + {d : ℕ} {U : Set (Vec d)} {u : H1Function U} {F : Vec d → ℝ} + {sigma0 : ℝ} (hU : IsOpen U) (hsigma0 : sigma0 ≠ 0) + (hF : MemScalarL2 U F) + (h : ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + sigma0 * + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, F x * φ x ∂MeasureTheory.volume) + (H : HasWeakHessianOn U u) (i : Fin d) : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + sigma0 * + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in U, + vecDot (fun j => if j = i then F x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + classical + let Fs : Vec d → ℝ := fun x => sigma0⁻¹ * F x + have hFs : MemScalarL2 U Fs := by + simpa only [Fs] using hF.const_mul sigma0⁻¹ + have hscaled : WeakPoissonEquationOn U u Fs := by + intro ψ hψ hψs hψ_sub + have htest := h ψ hψ hψs hψ_sub + calc + ∫ x in U, vecDot (u.grad x) (euclideanGradient ψ x) + ∂MeasureTheory.volume = + sigma0⁻¹ * + (sigma0 * + ∫ x in U, vecDot (u.grad x) (euclideanGradient ψ x) + ∂MeasureTheory.volume) := by + field_simp + _ = sigma0⁻¹ * ∫ x in U, F x * ψ x ∂MeasureTheory.volume := by + rw [htest] + _ = ∫ x in U, sigma0⁻¹ * (F x * ψ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = ∫ x in U, Fs x * ψ x ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp only [Fs] + ring + intro φ hφ hφs hφ_sub + have hderivative := hscaled.gradCoordH1Function_weakDivergence + hU hFs H i φ hφ hφs hφ_sub + have hscale_integral : + sigma0 * + ∫ x in U, + vecDot (fun j => if j = i then Fs x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, + vecDot (fun j => if j = i then F x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_const_mul] + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + simp [Fs, vecDot, euclideanGradient] + field_simp + calc + sigma0 * + ∫ x in U, + vecDot ((H.gradCoordH1Function i).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + sigma0 * + (-∫ x in U, + vecDot (fun j => if j = i then Fs x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + rw [hderivative] + _ = -(sigma0 * + ∫ x in U, + vecDot (fun j => if j = i then Fs x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + ring + _ = -∫ x in U, + vecDot (fun j => if j = i then F x else 0) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + rw [hscale_integral] + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeightedLayerCake.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeightedLayerCake.lean new file mode 100644 index 0000000000..6ca005c7fd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCalderonZygmund/WeightedLayerCake.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.GoodLambda +public import Mathlib.Analysis.SpecialFunctions.Pow.Integral +public import Mathlib.MeasureTheory.Measure.WithDensity + +/-! # Weighted Layer Cake -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal NNReal BigOperators + +noncomputable section + +namespace CubeCalderonZygmund + +open MeasureTheory + +/-- The measure `‖f‖² dμ` used to weight the layer-cake argument. -/ +def sqWeightedMeasure {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + (f : α → E) (μ : MeasureTheory.Measure α) : MeasureTheory.Measure α := + μ.withDensity fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)) + +/-- The pointwise truncation `‖f‖ ∧ m` appearing in the Caffarelli--Peral proof. -/ +def truncNorm {α E : Type*} [NormedAddCommGroup E] (f : α → E) (m : ℝ) : α → ℝ := + fun x => min ‖f x‖ m + +/-- Layer cake under the squared-density measure, with the threshold written in the source form +`a * λ`. This is an ENNReal identity and therefore needs no integrability assumption. -/ +theorem lintegral_truncNorm_div_rpow_eq_weighted_layercake + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {f : α → E} {p a m : ℝ} + (hf : MeasureTheory.AEStronglyMeasurable f μ) (hp : 2 < p) (ha : 0 < a) (hm : 0 ≤ m) : + ∫⁻ x, ENNReal.ofReal ((truncNorm f m x / a) ^ (p - 2)) ∂sqWeightedMeasure f μ = + ENNReal.ofReal (p - 2) * + ∫⁻ t in Set.Ioi (0 : ℝ), + sqWeightedMeasure f μ {x | a * t < truncNorm f m x} * + ENNReal.ofReal (t ^ (p - 3)) := by + let g : α → ℝ := fun x => truncNorm f m x / a + have hg_nonneg : 0 ≤ᵐ[μ] g := Filter.Eventually.of_forall fun x => by + exact div_nonneg (le_min (norm_nonneg _) hm) ha.le + have hg_meas : AEMeasurable g μ := by + exact ((hf.norm.aemeasurable.min aemeasurable_const).div_const a) + have hg_nonneg_weighted : 0 ≤ᵐ[sqWeightedMeasure f μ] g := + (MeasureTheory.withDensity_absolutelyContinuous μ _).ae_le hg_nonneg + have h_layer := MeasureTheory.lintegral_rpow_eq_lintegral_meas_lt_mul + (sqWeightedMeasure f μ) hg_nonneg_weighted + (hg_meas.mono' (MeasureTheory.withDensity_absolutelyContinuous μ _)) + (p := p - 2) (by linarith) + have hpow : p - 2 - 1 = p - 3 := by ring + have hthreshold (t : ℝ) : + {x | t < g x} = {x | a * t < truncNorm f m x} := by + ext x + simp only [Set.mem_ofPred_eq, g] + rw [lt_div_iff₀ ha] + ring_nf + rw [hpow] at h_layer + simpa only [g, hthreshold] using h_layer + +/-- The algebraic normalization which turns the truncated `Lᵖ` power into the +weighted power used by layer cake. -/ +lemma truncNorm_rpow_div_eq_div_rpow_mul_sq + {α E : Type*} [NormedAddCommGroup E] (f : α → E) {p a m : ℝ} + (hp : 2 < p) (ha : 0 < a) (hm : 0 ≤ m) (x : α) : + (truncNorm f m x) ^ p / a ^ (p - 2) = + (truncNorm f m x / a) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℕ) := by + have htrunc_nonneg : 0 ≤ truncNorm f m x := le_min (norm_nonneg _) hm + have hpow : (truncNorm f m x) ^ p = + (truncNorm f m x) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℝ) := by + calc + (truncNorm f m x) ^ p = (truncNorm f m x) ^ (p - 2 + 2) := by ring_nf + _ = (truncNorm f m x) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℝ) := + Real.rpow_add_of_nonneg htrunc_nonneg (by linarith) (by norm_num) + have hpow_nat : (truncNorm f m x) ^ p = + (truncNorm f m x) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℕ) := by + rw [← Real.rpow_natCast] + exact hpow + calc + (truncNorm f m x) ^ p / a ^ (p - 2) = + ((truncNorm f m x) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℕ)) / + a ^ (p - 2) := by + exact congr_arg (fun z => z / a ^ (p - 2)) hpow_nat + _ = ((truncNorm f m x) ^ (p - 2) / a ^ (p - 2)) * + (truncNorm f m x) ^ (2 : ℕ) := by ring + _ = (truncNorm f m x / a) ^ (p - 2) * (truncNorm f m x) ^ (2 : ℕ) := by + rw [← Real.div_rpow htrunc_nonneg ha.le] + +/-- The finite-truncation estimate used for `f_m` in the source proof. It turns the +truncated `Lᵖ` power into the weighted layer-cake integral, retaining the exact threshold +`a * t`. -/ +theorem lintegral_truncNorm_rpow_div_le_weighted_layercake + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] + {μ : MeasureTheory.Measure α} {f : α → E} {p a m : ℝ} + (hf : MeasureTheory.AEStronglyMeasurable f μ) (hp : 2 < p) (ha : 0 < a) (hm : 0 ≤ m) : + ∫⁻ x, ENNReal.ofReal ((truncNorm f m x) ^ p / a ^ (p - 2)) ∂μ ≤ + ENNReal.ofReal (p - 2) * + ∫⁻ t in Set.Ioi (0 : ℝ), + sqWeightedMeasure f μ {x | a * t < truncNorm f m x} * + ENNReal.ofReal (t ^ (p - 3)) := by + have hdensity : AEMeasurable (fun x => ENNReal.ofReal (‖f x‖ ^ (2 : ℕ))) μ := by + exact (hf.norm.aemeasurable.pow aemeasurable_const).ennreal_ofReal + have hpower : AEMeasurable (fun x => ENNReal.ofReal ((truncNorm f m x / a) ^ (p - 2))) μ := by + exact (((hf.norm.aemeasurable.min aemeasurable_const).div_const a).pow + aemeasurable_const).ennreal_ofReal + calc + ∫⁻ x, ENNReal.ofReal ((truncNorm f m x) ^ p / a ^ (p - 2)) ∂μ = + ∫⁻ x, ENNReal.ofReal ((truncNorm f m x / a) ^ (p - 2)) * + ENNReal.ofReal ((truncNorm f m x) ^ (2 : ℕ)) ∂μ := by + apply lintegral_congr + intro x + rw [truncNorm_rpow_div_eq_div_rpow_mul_sq f hp ha hm] + exact ENNReal.ofReal_mul (Real.rpow_nonneg (div_nonneg + (le_min (norm_nonneg _) hm) ha.le) _) + _ ≤ ∫⁻ x, ENNReal.ofReal ((truncNorm f m x / a) ^ (p - 2)) ∂sqWeightedMeasure f μ := by + rw [sqWeightedMeasure, lintegral_withDensity_eq_lintegral_mul₀ hdensity hpower] + apply lintegral_mono + intro x + simp only [Pi.mul_apply] + rw [mul_comm (ENNReal.ofReal (‖f x‖ ^ (2 : ℕ)))] + apply mul_le_mul_right + apply ENNReal.ofReal_le_ofReal + simp only [pow_two] + exact mul_self_le_mul_self (le_min (norm_nonneg _) hm) (min_le_left _ _) + _ = _ := lintegral_truncNorm_div_rpow_eq_weighted_layercake hf hp ha hm + +end CubeCalderonZygmund + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCoerciveH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCoerciveH1.lean new file mode 100644 index 0000000000..623ccbb8cf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeCoerciveH1.lean @@ -0,0 +1,225 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero + +/-! # Cube Coercive H1 -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise + +noncomputable section + +/-- A centered triadic cube is the dilation of the unit centered cube by its +side length. -/ +theorem openCubeSet_originCube_eq_smul_unit (d : ℕ) (m : ℤ) : + openCubeSet (originCube d m) = + cubeScaleFactor (originCube d m) • openCubeSet (originCube d 0) := by + ext x + let s : ℝ := cubeScaleFactor (originCube d m) + have hs_pos : 0 < s := by + dsimp [s, cubeScaleFactor, originCube] + positivity + constructor + · intro hx + refine ⟨s⁻¹ • x, ?_, ?_⟩ + · rw [mem_openCubeSet_originCube_iff] + intro i + have hxi := (mem_openCubeSet_originCube_iff.mp hx) i + rw [zpow_zero] + constructor + · have hlo_s : (-(1 / 2 : ℝ)) * s < x i := by + simpa [s] using hxi.1 + have hmul := mul_lt_mul_of_pos_left hlo_s (inv_pos.mpr hs_pos) + have hs_cancel : s⁻¹ * ((-(1 / 2 : ℝ)) * s) = -(1 / 2 : ℝ) := by + field_simp [hs_pos.ne'] + change (-(1 / 2 : ℝ)) * 1 < s⁻¹ * x i + nlinarith + · have hhi_s : x i < (1 / 2 : ℝ) * s := by + simpa [s] using hxi.2 + have hmul := mul_lt_mul_of_pos_left hhi_s (inv_pos.mpr hs_pos) + have hs_cancel : s⁻¹ * ((1 / 2 : ℝ) * s) = (1 / 2 : ℝ) := by + field_simp [hs_pos.ne'] + change s⁻¹ * x i < (1 / 2 : ℝ) * 1 + nlinarith + · ext i + change s * (s⁻¹ * x i) = x i + field_simp [hs_pos.ne'] + · intro hx + rcases hx with ⟨y, hy, rfl⟩ + rw [mem_openCubeSet_originCube_iff] + intro i + have hyi := (mem_openCubeSet_originCube_iff.mp hy) i + rw [zpow_zero] at hyi + constructor + · have hmul := mul_lt_mul_of_pos_left hyi.1 hs_pos + change (-(1 / 2 : ℝ)) * s < s * y i + simpa [mul_comm] using hmul + · have hmul := mul_lt_mul_of_pos_left hyi.2 hs_pos + change s * y i < (1 / 2 : ℝ) * s + simpa [mul_comm] using hmul + +/-- Centered cubes have an explicit coordinate bound by their side length. -/ +theorem isBoundedDomain_openCubeSet_originCube_scale + (d : ℕ) (m : ℤ) : + IsBoundedDomain (openCubeSet (originCube d m)) := by + refine ⟨cubeScaleFactor (originCube d m), ?_, ?_⟩ + · dsimp [cubeScaleFactor, originCube] + positivity + · intro x hx i + have hscale_pos : 0 < (3 : ℝ) ^ m := by positivity + have hxi := (mem_openCubeSet_originCube_iff.mp hx) i + rw [cubeScaleFactor_originCube] + rw [abs_le] + constructor + · linarith + · linarith + +/-- Centered cubes as bounded open convex domains, with the explicit +side-length coordinate bound above. -/ +theorem isOpenBoundedConvexDomain_openCubeSet_originCube_scale + (d : ℕ) (m : ℤ) : + IsOpenBoundedConvexDomain (openCubeSet (originCube d m)) := + ⟨isOpen_openCubeSet (originCube d m), + isBoundedDomain_openCubeSet_originCube_scale d m, + convex_openCubeSet (originCube d m)⟩ + +/-- The bounded-open-convex mean-zero `H¹` coercive estimate on a centered +triadic cube. -/ +noncomputable def originCubeMeanZeroH1CoerciveEstimate + (d : ℕ) (m : ℤ) : + H1CoerciveEstimate (openCubeSet (originCube d m)) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + exact + h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d m)) + (isOpenBoundedConvexDomain_openCubeSet_originCube_scale d m) + +theorem originCubeMeanZeroH1CoerciveEstimate_constant_le_chosenBound + (d : ℕ) (m : ℤ) : + (originCubeMeanZeroH1CoerciveEstimate d m).fixedValue ≤ + H1Function.h1CoerciveEstimateChosenBound + (d := d) (U := openCubeSet (originCube d m)) + (isOpenBoundedConvexDomain_openCubeSet_originCube_scale d m) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d m))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)).isFiniteMeasure_restrict_volume + unfold originCubeMeanZeroH1CoerciveEstimate + exact + h1CoerciveEstimate_of_isOpenBoundedConvexDomain_constant_le_chosenBound + (U := openCubeSet (originCube d m)) + (isOpenBoundedConvexDomain_openCubeSet_originCube_scale d m) + +/-- A cube coercive estimate obtained by proving Poincare on the centered cube +at the same scale and translating it to the target cube. This avoids any +dependence on the target cube's location. -/ +noncomputable def translatedCubeMeanZeroH1CoerciveEstimate {d : ℕ} + (Q : TriadicCube d) : + H1CoerciveEstimate (openCubeSet Q) := by + letI : + MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (openCubeSet (originCube d Q.scale))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet + (originCube d Q.scale)).isFiniteMeasure_restrict_volume + let hC₀ : H1CoerciveEstimate (openCubeSet (originCube d Q.scale)) := + originCubeMeanZeroH1CoerciveEstimate d Q.scale + refine + { fixedValue := hC₀.fixedValue + constant_nonneg := hC₀.constant_nonneg + bound := ?_ } + rw [openCubeSet_eq_translateSet_originCube_of_triadicCube Q] + exact (hC₀.translate (triadicCubeShift Q)).bound + +theorem translatedCubeMeanZeroH1CoerciveEstimate_constant {d : ℕ} + (Q : TriadicCube d) : + (translatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue = + (originCubeMeanZeroH1CoerciveEstimate d Q.scale).fixedValue := by + unfold translatedCubeMeanZeroH1CoerciveEstimate + rfl + +theorem translatedCubeMeanZeroH1CoerciveEstimate_constant_nonneg {d : ℕ} + (Q : TriadicCube d) : + 0 ≤ (translatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue := + (translatedCubeMeanZeroH1CoerciveEstimate Q).constant_nonneg + +theorem translatedCubeMeanZeroH1CoerciveEstimate_constant_le_origin_chosenBound {d : ℕ} + (Q : TriadicCube d) : + (translatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue ≤ + H1Function.h1CoerciveEstimateChosenBound + (d := d) (U := openCubeSet (originCube d Q.scale)) + (isOpenBoundedConvexDomain_openCubeSet_originCube_scale d Q.scale) := by + rw [translatedCubeMeanZeroH1CoerciveEstimate_constant Q] + exact originCubeMeanZeroH1CoerciveEstimate_constant_le_chosenBound d Q.scale + +/-- Scale-correct coercive estimate on a centered cube, obtained by dilating the +unit centered cube estimate. -/ +noncomputable def scaledOriginCubeMeanZeroH1CoerciveEstimate + (d : ℕ) (m : ℤ) : + H1CoerciveEstimate (openCubeSet (originCube d m)) := by + let s : ℝ := cubeScaleFactor (originCube d m) + have hs_pos : 0 < s := by + dsimp [s, cubeScaleFactor, originCube] + positivity + let hCunit : H1CoerciveEstimate (openCubeSet (originCube d 0)) := + originCubeMeanZeroH1CoerciveEstimate d 0 + let hCdil : H1CoerciveEstimate (s • openCubeSet (originCube d 0)) := + hCunit.dilate hs_pos + refine + { fixedValue := s * hCunit.fixedValue + constant_nonneg := mul_nonneg hs_pos.le hCunit.constant_nonneg + bound := ?_ } + rw [openCubeSet_originCube_eq_smul_unit d m] + exact hCdil.bound + +theorem scaledOriginCubeMeanZeroH1CoerciveEstimate_constant + (d : ℕ) (m : ℤ) : + (scaledOriginCubeMeanZeroH1CoerciveEstimate d m).fixedValue = + cubeScaleFactor (originCube d m) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + rfl + +/-- Scale-correct coercive estimate on any triadic cube, obtained by dilating +the unit centered cube and then translating to the target cube. -/ +noncomputable def scaledTranslatedCubeMeanZeroH1CoerciveEstimate {d : ℕ} + (Q : TriadicCube d) : + H1CoerciveEstimate (openCubeSet Q) := by + letI : + MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (openCubeSet (originCube d Q.scale))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet + (originCube d Q.scale)).isFiniteMeasure_restrict_volume + let hC₀ : H1CoerciveEstimate (openCubeSet (originCube d Q.scale)) := + scaledOriginCubeMeanZeroH1CoerciveEstimate d Q.scale + refine + { fixedValue := hC₀.fixedValue + constant_nonneg := hC₀.constant_nonneg + bound := ?_ } + rw [openCubeSet_eq_translateSet_originCube_of_triadicCube Q] + exact (hC₀.translate (triadicCubeShift Q)).bound + +theorem scaledTranslatedCubeMeanZeroH1CoerciveEstimate_constant {d : ℕ} + (Q : TriadicCube d) : + (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue = + cubeScaleFactor Q * (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + unfold scaledTranslatedCubeMeanZeroH1CoerciveEstimate + rw [scaledOriginCubeMeanZeroH1CoerciveEstimate_constant] + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2.lean new file mode 100644 index 0000000000..33f5551e79 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2.lean @@ -0,0 +1,23 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OddReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EnergyBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.SolverEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity + +/-! # Cube Dirichlet H2 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ArbitraryCubeEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ArbitraryCubeEndpoint.lean new file mode 100644 index 0000000000..88dd6ed66a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ArbitraryCubeEndpoint.lean @@ -0,0 +1,257 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EnergyBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.SolverEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianTranslation + +/-! # Arbitrary Cube Endpoint -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +variable {d : ℕ} {Q : TriadicCube d} {u : H10Function (openCubeSet Q)} + {F : Vec d → ℝ} + +/-- Transport the centered-cube reflected-parent Hessian estimate back to an +arbitrary cube of the same scale. The right-hand side is still the canonical +origin-cube smooth-test bound for the translated forcing; a later quantitative +lemma collapses it to a dimension-only multiple of the cube `L²` norm. -/ +theorem exists_hasWeakHessianOn_cube_canonicalRadii_hessianCoordL2NormSum_le_smoothTestBound + (hweak : CubeDirichletWeakPoissonProblem Q u F) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∃ uP : H1Function (openCubeSet (originCube d (Q.scale + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d Q.scale) + (untranslateToOriginFunction Q u).toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d Q.scale) + (fun y => (untranslateToOriginFunction Q u).toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet Q) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (Q.scale + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d Q.scale) + (fun x => F (x + triadicCubeShift Q))) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d Q.scale) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + let u₀ : H10Function (openCubeSet Q₀) := untranslateToOriginFunction Q u + have hweak₀ : CubeDirichletWeakPoissonProblem Q₀ u₀ F₀ := by + simpa [Q₀, F₀, z, u₀] using hweak.untranslateToOrigin + have hF₀ : MeasureTheory.MemLp F₀ (2 : ℝ≥0∞) (normalizedCubeMeasure Q₀) := by + simpa [Q₀, F₀, z] using memLp_originCube_comp_addRight_of_memLp Q hF + rcases + hweak₀.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + hF₀ with + ⟨uP, huP_toFun, huP_grad, H₀, hH₀⟩ + have hU : openCubeSet Q = translateSet z (openCubeSet Q₀) := by + simpa [Q₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let HT : HasWeakHessianOn (translateSet z (openCubeSet Q₀)) + (u₀.toH1Function.translate z) := H₀.translate z + let H : HasWeakHessianOn (openCubeSet Q) u.toH1Function := + { hess := HT.hess + hess_memL2 := by + intro i j + simpa [hU] using HT.hess_memL2 i j + weak_second := by + intro i j + have hweakT : + HasWeakPartialDerivOn (openCubeSet Q) j + (fun x => (u₀.toH1Function.translate z).grad x i) + (HT.hess i j) := by + simpa [hU] using HT.weak_second i j + refine + HasWeakPartialDerivOn.congr_of_eqOn + (measurableSet_openCubeSet Q) ?_ ?_ hweakT + · intro x _hx + exact congrArg (fun v : Vec d => v i) + (untranslateToOriginFunction_translate_grad Q u x) + · intro x _hx + rfl } + refine ⟨uP, ?_, ?_, H, ?_⟩ + · simpa [Q₀, u₀] using huP_toFun + · simpa [Q₀, u₀] using huP_grad + · have hH_HT : H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := by + simp [H, hU, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2] + have hHT_H₀ : HT.hessianCoordL2NormSum = H₀.hessianCoordL2NormSum := by + simpa [HT] using H₀.hessianCoordL2NormSum_translate_eq z + calc + H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := hH_HT + _ = H₀.hessianCoordL2NormSum := hHT_H₀ + _ ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (Q.scale + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d Q.scale) + (fun x => F (x + triadicCubeShift Q))) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d Q.scale) := by + simpa [Q₀, F₀, z] using hH₀ + +/-- Transport the centered-cube norm-energy reflected-parent Hessian estimate +back to an arbitrary cube of the same scale. -/ +theorem exists_hasWeakHessianOn_cube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + (hweak : CubeDirichletWeakPoissonProblem Q u F) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∃ uP : H1Function (openCubeSet (originCube d (Q.scale + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d Q.scale) + (untranslateToOriginFunction Q u).toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d Q.scale) + (fun y => (untranslateToOriginFunction Q u).toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet Q) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedNormEnergyBound + (untranslateToOriginFunction Q u) + (fun x => F (x + triadicCubeShift Q)) i := by + let Q₀ : TriadicCube d := originCube d Q.scale + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + let u₀ : H10Function (openCubeSet Q₀) := untranslateToOriginFunction Q u + have hweak₀ : CubeDirichletWeakPoissonProblem Q₀ u₀ F₀ := by + simpa [Q₀, F₀, z, u₀] using hweak.untranslateToOrigin + have hF₀ : MeasureTheory.MemLp F₀ (2 : ℝ≥0∞) (normalizedCubeMeasure Q₀) := by + simpa [Q₀, F₀, z] using memLp_originCube_comp_addRight_of_memLp Q hF + rcases + hweak₀.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + hF₀ with + ⟨uP, huP_toFun, huP_grad, H₀, hH₀⟩ + have hU : openCubeSet Q = translateSet z (openCubeSet Q₀) := by + simpa [Q₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let HT : HasWeakHessianOn (translateSet z (openCubeSet Q₀)) + (u₀.toH1Function.translate z) := H₀.translate z + let H : HasWeakHessianOn (openCubeSet Q) u.toH1Function := + { hess := HT.hess + hess_memL2 := by + intro i j + simpa [hU] using HT.hess_memL2 i j + weak_second := by + intro i j + have hweakT : + HasWeakPartialDerivOn (openCubeSet Q) j + (fun x => (u₀.toH1Function.translate z).grad x i) + (HT.hess i j) := by + simpa [hU] using HT.weak_second i j + refine + HasWeakPartialDerivOn.congr_of_eqOn + (measurableSet_openCubeSet Q) ?_ ?_ hweakT + · intro x _hx + exact congrArg (fun v : Vec d => v i) + (untranslateToOriginFunction_translate_grad Q u x) + · intro x _hx + rfl } + refine ⟨uP, ?_, ?_, H, ?_⟩ + · simpa [Q₀, u₀] using huP_toFun + · simpa [Q₀, u₀] using huP_grad + · have hH_HT : H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := by + simp [H, hU, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2] + have hHT_H₀ : HT.hessianCoordL2NormSum = H₀.hessianCoordL2NormSum := by + simpa [HT] using H₀.hessianCoordL2NormSum_translate_eq z + calc + H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := hH_HT + _ = H₀.hessianCoordL2NormSum := hHT_H₀ + _ ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedNormEnergyBound + (untranslateToOriginFunction Q u) + (fun x => F (x + triadicCubeShift Q)) i := by + simpa [Q₀, F₀, z, u₀] using hH₀ + +/-- Transport the forcing-facing centered-cube Dirichlet solver-energy Hessian +estimate back to an arbitrary cube of the same scale. -/ +theorem exists_hasWeakHessianOn_cube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + [NeZero d] + (hweak : CubeDirichletWeakPoissonProblem Q u F) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∃ uP : H1Function (openCubeSet (originCube d (Q.scale + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d Q.scale) + (untranslateToOriginFunction Q u).toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d Q.scale) + (fun y => (untranslateToOriginFunction Q u).toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet Q) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale + (fun x => F (x + triadicCubeShift Q)) i := by + let Q₀ : TriadicCube d := originCube d Q.scale + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + let u₀ : H10Function (openCubeSet Q₀) := untranslateToOriginFunction Q u + have hweak₀ : CubeDirichletWeakPoissonProblem Q₀ u₀ F₀ := by + simpa [Q₀, F₀, z, u₀] using hweak.untranslateToOrigin + have hF₀ : MeasureTheory.MemLp F₀ (2 : ℝ≥0∞) (normalizedCubeMeasure Q₀) := by + simpa [Q₀, F₀, z] using memLp_originCube_comp_addRight_of_memLp Q hF + rcases + hweak₀.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + hF₀ with + ⟨uP, huP_toFun, huP_grad, H₀, hH₀⟩ + have hU : openCubeSet Q = translateSet z (openCubeSet Q₀) := by + simpa [Q₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let HT : HasWeakHessianOn (translateSet z (openCubeSet Q₀)) + (u₀.toH1Function.translate z) := H₀.translate z + let H : HasWeakHessianOn (openCubeSet Q) u.toH1Function := + { hess := HT.hess + hess_memL2 := by + intro i j + simpa [hU] using HT.hess_memL2 i j + weak_second := by + intro i j + have hweakT : + HasWeakPartialDerivOn (openCubeSet Q) j + (fun x => (u₀.toH1Function.translate z).grad x i) + (HT.hess i j) := by + simpa [hU] using HT.weak_second i j + refine + HasWeakPartialDerivOn.congr_of_eqOn + (measurableSet_openCubeSet Q) ?_ ?_ hweakT + · intro x _hx + exact congrArg (fun v : Vec d => v i) + (untranslateToOriginFunction_translate_grad Q u x) + · intro x _hx + rfl } + refine ⟨uP, ?_, ?_, H, ?_⟩ + · simpa [Q₀, u₀] using huP_toFun + · simpa [Q₀, u₀] using huP_grad + · have hH_HT : H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := by + simp [H, hU, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2] + have hHT_H₀ : HT.hessianCoordL2NormSum = H₀.hessianCoordL2NormSum := by + simpa [HT] using H₀.hessianCoordL2NormSum_translate_eq z + calc + H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := hH_HT + _ = H₀.hessianCoordL2NormSum := hHT_H₀ + _ ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale + (fun x => F (x + triadicCubeShift Q)) i := by + simpa [Q₀, F₀, z] using hH₀ + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Definitions.lean new file mode 100644 index 0000000000..f72d8e8222 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Definitions.lean @@ -0,0 +1,155 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Cube Dirichlet `H²` regularity interfaces + +This file freezes the theorem surface for the cube Dirichlet `H²` endpoint +needed by the Chapter 1 Hodge projection argument. The analytic proof is +planned as an odd-reflection sibling of the existing Neumann/CZ reflection +endpoint; this file contains only the stable problem and regularity contracts. +-/ + +/-- Scalar weak Dirichlet Poisson problem on a cube. + +The sign convention is `-Delta u = f`, encoded by +`int_Q grad u . grad phi = int_Q f phi` for all zero-trace tests. -/ +def CubeDirichletWeakPoissonProblem {d : ℕ} (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (f : Vec d → ℝ) : Prop := + ∀ φ : H10Function (openCubeSet Q), + ∫ x in openCubeSet Q, + vecDot (u.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, f x * φ.toH1Function x + ∂MeasureTheory.volume + +/-- Cube Dirichlet `H²` regularity in the repository's weak-Hessian form. + +The Hessian size is measured by `HasWeakHessianOn.hessianCoordL2NormSum`, the +same quantity used by the existing Neumann/CZ endpoint. The forcing norm is +the normalized cube `L²` norm, matching the positive Besov/CZ layer. -/ +def CubeDirichletH2Regularity {d : ℕ} (Q : TriadicCube d) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (u : H10Function (openCubeSet Q)) (f : Vec d → ℝ), + MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + CubeDirichletWeakPoissonProblem Q u f → + ∃ H : HasWeakHessianOn (openCubeSet Q) u.toH1Function, + H.hessianCoordL2NormSum ≤ C * cubeLpNorm Q (2 : ℝ≥0∞) f + +/-- Dimension-uniform cube Dirichlet `H²` regularity. -/ +def CubeDirichletH2RegularityInDimension (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ Q : TriadicCube d, CubeDirichletH2Regularity Q C + +/-- Cube Dirichlet `H²` regularity with the unnormalized open-cube `L²` +forcing norm on the right-hand side. The input integrability is still phrased +for the normalized cube measure so this contract can be consumed by the same +Besov/CZ callers as `CubeDirichletH2Regularity`. -/ +def CubeDirichletH2RegularityVolumeL2 {d : ℕ} (Q : TriadicCube d) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (u : H10Function (openCubeSet Q)) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)), + CubeDirichletWeakPoissonProblem Q u f → + ∃ H : HasWeakHessianOn (openCubeSet Q) u.toH1Function, + H.hessianCoordL2NormSum ≤ + C * ‖toScalarL2 (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ + +/-- Dimension-uniform cube Dirichlet `H²` regularity with the unnormalized +open-cube `L²` forcing norm. -/ +def CubeDirichletH2RegularityVolumeL2InDimension (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ Q : TriadicCube d, CubeDirichletH2RegularityVolumeL2 Q C + +theorem CubeDirichletH2Regularity.constant_nonneg + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + (h : CubeDirichletH2Regularity Q C) : + 0 ≤ C := + h.1 + +theorem CubeDirichletH2RegularityInDimension.constant_nonneg + {d : ℕ} {C : ℝ} + (h : CubeDirichletH2RegularityInDimension d C) : + 0 ≤ C := + h.1 + +theorem CubeDirichletH2RegularityVolumeL2.constant_nonneg + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + (h : CubeDirichletH2RegularityVolumeL2 Q C) : + 0 ≤ C := + h.1 + +theorem CubeDirichletH2RegularityVolumeL2InDimension.constant_nonneg + {d : ℕ} {C : ℝ} + (h : CubeDirichletH2RegularityVolumeL2InDimension d C) : + 0 ≤ C := + h.1 + +/-- The local Dirichlet `H²` regularity estimate may be enlarged to any larger +constant. -/ +theorem CubeDirichletH2Regularity.mono + {d : ℕ} {Q : TriadicCube d} {C D : ℝ} + (h : CubeDirichletH2Regularity Q C) + (hCD : C ≤ D) : + CubeDirichletH2Regularity Q D := by + refine ⟨h.1.trans hCD, ?_⟩ + intro u f hf hweak + rcases h.2 u f hf hweak with ⟨H, hH⟩ + refine ⟨H, ?_⟩ + exact hH.trans + (mul_le_mul_of_nonneg_right hCD + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) f)) + +/-- The dimension-uniform Dirichlet `H²` regularity estimate may be enlarged to +any larger constant. -/ +theorem CubeDirichletH2RegularityInDimension.mono + {d : ℕ} {C D : ℝ} + (h : CubeDirichletH2RegularityInDimension d C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityInDimension d D := by + refine ⟨h.1.trans hCD, ?_⟩ + intro Q + exact (h.2 Q).mono hCD + +/-- The unnormalized local Dirichlet `H²` regularity estimate may be enlarged +to any larger constant. -/ +theorem CubeDirichletH2RegularityVolumeL2.mono + {d : ℕ} {Q : TriadicCube d} {C D : ℝ} + (h : CubeDirichletH2RegularityVolumeL2 Q C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityVolumeL2 Q D := by + refine ⟨h.1.trans hCD, ?_⟩ + intro u f hf hweak + rcases h.2 u f hf hweak with ⟨H, hH⟩ + refine ⟨H, ?_⟩ + exact hH.trans + (mul_le_mul_of_nonneg_right hCD (norm_nonneg _)) + +/-- The dimension-uniform unnormalized Dirichlet `H²` regularity estimate may +be enlarged to any larger constant. -/ +theorem CubeDirichletH2RegularityVolumeL2InDimension.mono + {d : ℕ} {C D : ℝ} + (h : CubeDirichletH2RegularityVolumeL2InDimension d C) + (hCD : C ≤ D) : + CubeDirichletH2RegularityVolumeL2InDimension d D := by + refine ⟨h.1.trans hCD, ?_⟩ + intro Q + exact (h.2 Q).mono hCD + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EnergyBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EnergyBound.lean new file mode 100644 index 0000000000..2f414eeabe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EnergyBound.lean @@ -0,0 +1,374 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothTestBoundEstimate + +/-! # Energy Bound -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +variable {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F : Vec d → ℝ} + +/-- Original-cube energy bound obtained after reading the fixed-radii +odd-reflected parent reduced smooth-test constant through the all-face +reflection identities. -/ +noncomputable def originCubeParentReducedOriginalEnergyBound + (u : H10Function (openCubeSet (originCube d m))) (F : Vec d → ℝ) + (_i : Fin d) : ℝ := + ((4 : ℝ) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), F y ^ 2 ∂MeasureTheory.volume) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) ^ 2)) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * + cubeRadius (originCube d (m + 1)))) ^ 2) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + u.toH1Function.toFun y ^ 2 ∂MeasureTheory.volume))))) ^ + (1 / (2 : ℝ)) + +/-- The same reflected-parent reduced energy bound, but with the original-cube +forcing, gradient, and value integrals rewritten as normalized/`L²` +realizations. -/ +noncomputable def originCubeParentReducedNormEnergyBound + (u : H10Function (openCubeSet (originCube d m))) (F : Vec d → ℝ) + (_i : Fin d) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + ((4 : ℝ) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + (cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℝ))) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2)) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2) * + ((3 : ℝ) ^ d * ‖u.toH1Function.toScalarL2‖ ^ 2))))) ^ + (1 / (2 : ℝ)) + +/-- The raw original-cube Dirichlet reflected-parent energy expression is +exactly the same as its norm-realized form. -/ +theorem originCubeParentReducedOriginalEnergyBound_eq_normEnergyBound + (u : H10Function (openCubeSet (originCube d m))) {F : Vec d → ℝ} + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (i : Fin d) : + originCubeParentReducedOriginalEnergyBound u F i = + originCubeParentReducedNormEnergyBound u F i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + have hforce : + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℝ) := by + simpa [Q, pow_two] using + setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow Q F hF + have hgrad : + ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume = + ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2 := by + have hinner : + ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume = + inner ℝ u.toH1Function.gradToHilbertVectorL2 + u.toH1Function.gradToHilbertVectorL2 := by + simpa [H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet Q) + u.toH1Function.grad_memVectorL2 + u.toH1Function.grad_memVectorL2).symm + rw [hinner] + exact real_inner_self_eq_norm_sq u.toH1Function.gradToHilbertVectorL2 + have hvalue : + ∫ y in openCubeSet Q, u.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume = + ‖u.toH1Function.toScalarL2‖ ^ 2 := by + simpa [H1Function.toScalarL2, Homogenization.toScalarL2] using + (toReal_eLpNorm_two_sq_eq_integral_sq u.toH1Function.memL2).symm + simp [originCubeParentReducedOriginalEnergyBound, + originCubeParentReducedNormEnergyBound, Q, hforce, hgrad, hvalue] + +/-- A fixed-radii reduced smooth-test constant on the odd-reflected parent is +bounded by the corresponding original-cube energy expression. -/ +theorem openCubeInnerQuotientHessianSmoothTestReducedBound_le_originCubeParentReducedOriginalEnergyBound + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + {uP : H1Function (openCubeSet (originCube d (m + 1)))} + (huP_toFun : + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun) + (huP_grad : + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) + (i : Fin d) : + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) ≤ + originCubeParentReducedOriginalEnergyBound u F i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let fP : Vec d → ℝ := cubeDirichletOddReflectionScalar Q F + let G : Vec d → Vec d := fun y => u.toH1Function.grad y + let GP : Vec d → Vec d := cubeDirichletOddReflectionVectorField Q G + let uPfun : Vec d → ℝ := + cubeDirichletOddReflectionScalar Q u.toH1Function.toFun + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + let A : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Qp, fP x ^ 2 ∂MeasureTheory.volume + + Kinner * + ((2 : ℝ) * ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (Kouter * + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume)) + let B : ℝ := + (2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume) + + Kinner * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, u.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume))) + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [Q, MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure (originCube d m) hF + have hforce_eq : + ∫ x in openCubeSet Qp, fP x ^ 2 ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume := by + simpa [Q, Qp, fP, pow_two] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + (m := m) hFopen + have hvalue_eq : + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, u.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume := by + have hu : MemScalarL2 (openCubeSet Q) u.toH1Function.toFun := by + simpa [Q, MemScalarL2, volumeMeasureOn] using u.toH1Function.memL2 + calc + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume = + ∫ x in openCubeSet Qp, uPfun x ^ 2 ∂MeasureTheory.volume := by + rw [huP_toFun] + _ = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, u.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume := by + simpa [Q, Qp, uPfun, pow_two] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + (m := m) hu + have hgrad_coord_le : + ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 ∂MeasureTheory.volume ≤ + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + have hcoord : + ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 ∂MeasureTheory.volume ≤ + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume := by + simpa [Real.rpow_two, Real.norm_eq_abs, sq_abs] using + WeakPoissonEquationOn.integral_coord_norm_rpow_two_le_integral_vecNormSq_of_memVectorL2 + (U := openCubeSet Qp) uP.grad_memVectorL2 i + have hG : MemVectorL2 (openCubeSet Q) G := by + simpa [Q, G, MemVectorL2, volumeMeasureOn] using + u.toH1Function.grad_memVectorL2 + have hvec_eq : + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Qp, vecDot (GP x) (GP x) + ∂MeasureTheory.volume := by + rw [huP_grad] + rfl + _ = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + simpa [Q, Qp, G, GP] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_self_pairing_of_memVectorL2_three_pow + (m := m) hG + exact hcoord.trans_eq hvec_eq + have hlower : + (2 : ℝ) * ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (Kouter * + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume) ≤ + (2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, u.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume)) := by + rw [hvalue_eq] + exact add_le_add + (mul_le_mul_of_nonneg_left hgrad_coord_le (by norm_num)) + (le_refl _) + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hAB : A ≤ B := by + dsimp [A, B] + rw [hforce_eq] + exact add_le_add_right (mul_le_mul_of_nonneg_left hlower hKinner_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * B := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + dsimp [A, Kinner, Kouter] + positivity + simpa [WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound, + originCubeParentReducedOriginalEnergyBound, Q, Qp, fP, G, GP, uPfun, + Kinner, Kouter, A, B] using + Real.rpow_le_rpow h4A_nonneg h4AB (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +/-- The fixed-radii reflected-parent Hessian estimate with the raw smooth-test +constant replaced by the reduced unweighted `H¹` bound. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_reducedBound + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + rcases + hweak.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound_le_reducedBound + (Q := originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) i + (ρ₁ := (1 / 3 : ℝ)) (ρ₂ := (1 / 2 : ℝ)) + (σ₁ := (3 / 4 : ℝ)) (σ₂ := (7 / 8 : ℝ)) + (originCubeParentThreeQuarterSevenEighthCutoff d m) + +/-- The fixed-radii reflected-parent Hessian estimate, with the right-hand +side expressed entirely in original-cube energy terms. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_originalEnergyBound + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedOriginalEnergyBound u F i := by + rcases + hweak.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_reducedBound + hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + openCubeInnerQuotientHessianSmoothTestReducedBound_le_originCubeParentReducedOriginalEnergyBound + hF huP_toFun huP_grad i + +/-- The fixed-radii reflected-parent Hessian estimate with the right-hand side +expressed through `L²` norm realizations of the solution and forcing. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedNormEnergyBound u F i := by + rcases + hweak.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_originalEnergyBound + hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + le_of_eq (originCubeParentReducedOriginalEnergyBound_eq_normEnergyBound u hF i) + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EuclideanNormalized.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EuclideanNormalized.lean new file mode 100644 index 0000000000..e4763217cc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/EuclideanNormalized.lean @@ -0,0 +1,207 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Regularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp + +/-! # Euclidean Normalized -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +/-- A stronger regularity-producing centered-cube `q = 2` Dirichlet result. + +Unlike the manuscript statement, this compatibility predicate concludes the +existence of a weak Hessian. The source-facing predicate below instead takes +a supplied weak-Hessian witness and estimates that witness. -/ +def OriginCubeDirichletCalderonZygmundRegularityQTwo (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ (m : ℤ) (u : H10Function (openCubeSet (originCube d m))) + (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F), + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) + +theorem OriginCubeDirichletCalderonZygmundRegularityQTwo.constant_nonneg + {d : ℕ} {C : ℝ} (h : OriginCubeDirichletCalderonZygmundRegularityQTwo d C) : + 0 ≤ C := + h.1 + +theorem OriginCubeDirichletCalderonZygmundRegularityQTwo.apply + {d : ℕ} {C : ℝ} (h : OriginCubeDirichletCalderonZygmundRegularityQTwo d C) + (m : ℤ) (u : H10Function (openCubeSet (originCube d m))) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) : + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) := + h.2 m u F hF hweak + +/-- The regularity-producing centered-cube Dirichlet `q = 2` endpoint. -/ +theorem exists_originCube_dirichlet_calderon_zygmund_regularity_q_two + {d : ℕ} [NeZero d] (m : ℤ) + (u : H10Function (openCubeSet (originCube d m))) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) : + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + cubeDirichletH2RegularityVolumeL2ConstantExact d * + (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) := by + rcases (cubeDirichletH2RegularityExact (originCube d m)).2 u F hF hweak with + ⟨H, hH⟩ + refine ⟨H, ?_⟩ + let V : ℝ := cubeVolume (originCube d m) + let C : ℝ := cubeDirichletH2RegularityVolumeL2ConstantExact d + let L : ℝ := cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F + let hFsafe : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (cubeBoundedMeasurableDomain (originCube d m)).normalizedVolume := by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF + have hL_safe : + (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F hFsafe = L := by + dsimp [L] + unfold BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + unfold cubeLpNorm + simp only [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + have hV_pos : 0 < V := by + dsimp [V] + exact cubeVolume_pos (originCube d m) + have hV_nonneg : 0 ≤ V := le_of_lt hV_pos + have hfac_nonneg : 0 ≤ (V⁻¹) ^ (1 / 2 : ℝ) := + Real.rpow_nonneg (inv_nonneg.mpr hV_nonneg) _ + have hhilbert : + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2) ≤ H.hessianCoordL2NormSum := + H.sqrt_sum_sq_hessCoordToScalarL2_le_hessianCoordL2NormSum + have hscale : + cubeDirichletH2RegularityConstantExact (originCube d m) = + V ^ (1 / 2 : ℝ) * C := by + simpa [V, C] using + cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact + (originCube d m) + have hcancel : + (V⁻¹) ^ (1 / 2 : ℝ) * V ^ (1 / 2 : ℝ) = 1 := by + rw [Real.inv_rpow hV_nonneg (1 / 2 : ℝ)] + exact inv_mul_cancel₀ (Real.rpow_pos_of_pos hV_pos _).ne' + calc + H.frobeniusNormalizedL2 (originCube d m) + = (V⁻¹) ^ (1 / 2 : ℝ) * + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2) := rfl + _ ≤ (V⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum := + mul_le_mul_of_nonneg_left hhilbert hfac_nonneg + _ ≤ (V⁻¹) ^ (1 / 2 : ℝ) * + (cubeDirichletH2RegularityConstantExact (originCube d m) * L) := + mul_le_mul_of_nonneg_left hH hfac_nonneg + _ = C * L := by + rw [hscale] + calc + (V⁻¹) ^ (1 / 2 : ℝ) * (V ^ (1 / 2 : ℝ) * C * L) + = ((V⁻¹) ^ (1 / 2 : ℝ) * V ^ (1 / 2 : ℝ)) * (C * L) := by ring + _ = C * L := by rw [hcancel, one_mul] + _ = cubeDirichletH2RegularityVolumeL2ConstantExact d * + (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F hFsafe := by rw [hL_safe] + _ = cubeDirichletH2RegularityVolumeL2ConstantExact d * + (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) := by + rfl + +/-- The explicit dimension-only constant inhabits the stronger +regularity-producing centered-cube Dirichlet `q = 2` predicate. -/ +theorem originCubeDirichletCalderonZygmundRegularityQTwo_exact + (d : ℕ) [NeZero d] : + OriginCubeDirichletCalderonZygmundRegularityQTwo d + (cubeDirichletH2RegularityVolumeL2ConstantExact d) := by + refine ⟨cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d, ?_⟩ + intro m u F hF hweak + exact exists_originCube_dirichlet_calderon_zygmund_regularity_q_two m u F hF hweak + +/-- The literal centered-cube `q = 2` Dirichlet Calderón--Zygmund branch in +the source: a weak Hessian is supplied as part of the `W^{2,2}` hypothesis, +and the conclusion estimates that supplied Hessian. -/ +def OriginCubeDirichletCalderonZygmundQTwo (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ (m : ℤ) (u : H10Function (openCubeSet (originCube d m))) + (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function), + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) + +theorem OriginCubeDirichletCalderonZygmundQTwo.constant_nonneg + {d : ℕ} {C : ℝ} (h : OriginCubeDirichletCalderonZygmundQTwo d C) : + 0 ≤ C := + h.1 + +/-- Apply the literal Dirichlet branch to a supplied weak-Hessian witness. -/ +theorem OriginCubeDirichletCalderonZygmundQTwo.apply + {d : ℕ} {C : ℝ} (h : OriginCubeDirichletCalderonZygmundQTwo d C) + (m : ℤ) (u : H10Function (openCubeSet (originCube d m))) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function) : + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * (cubeBoundedMeasurableDomain (originCube d m)).normalizedLpNorm + (2 : ℝ≥0∞) F (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hF) := + h.2 m u F hF hweak H + +/-- The explicit dimension-only constant proves the literal source-facing +Dirichlet branch. Its implementation first produces one weak Hessian and +then uses weak-derivative uniqueness to transfer the bound to every supplied +witness. -/ +theorem originCubeDirichletCalderonZygmundQTwo_exact + (d : ℕ) [NeZero d] : + OriginCubeDirichletCalderonZygmundQTwo d + (cubeDirichletH2RegularityVolumeL2ConstantExact d) := by + refine ⟨cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d, ?_⟩ + intro m u F hF hweak H + rcases exists_originCube_dirichlet_calderon_zygmund_regularity_q_two m u F hF hweak with + ⟨K, hK⟩ + rw [H.frobeniusNormalizedL2_eq_of_hasWeakHessianOn (originCube d m) K] + exact hK + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OddReflection.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OddReflection.lean new file mode 100644 index 0000000000..16336aed20 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OddReflection.lean @@ -0,0 +1,291 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Definitions + +/-! # Odd Reflection -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Odd reflection data for cube Dirichlet `H²` + +This file contains the pointwise and `H¹` one-cell vocabulary for the odd +reflection argument. The analytic endpoint will assemble these cells across +the full reflection block and then reuse the interior weak-Hessian estimate. +-/ + +/-- The scalar sign used for Dirichlet odd reflection on one reflection cell. + +Each coordinate outside the original strip contributes a factor `-1`; each +coordinate in the original strip contributes `1`. -/ +def cubeDirichletOddReflectionCellSign {d : ℕ} + (choice : Fin d → Fin 3) : ℝ := + ∏ i : Fin d, if choice i = 1 then (1 : ℝ) else -1 + +@[simp] theorem cubeDirichletOddReflectionCellSign_center {d : ℕ} : + cubeDirichletOddReflectionCellSign + (fun _ : Fin d => (1 : Fin 3)) = 1 := by + simp [cubeDirichletOddReflectionCellSign] + +@[simp] theorem cubeDirichletOddReflectionCellSign_mul_self {d : ℕ} + (choice : Fin d → Fin 3) : + cubeDirichletOddReflectionCellSign choice * + cubeDirichletOddReflectionCellSign choice = 1 := by + classical + unfold cubeDirichletOddReflectionCellSign + rw [← Finset.prod_mul_distrib] + refine Finset.prod_eq_one ?_ + intro i _hi + by_cases h : choice i = 1 <;> simp [h] + +@[simp] theorem cubeDirichletOddReflectionCellSign_sq {d : ℕ} + (choice : Fin d → Fin 3) : + cubeDirichletOddReflectionCellSign choice ^ (2 : ℕ) = 1 := by + rw [pow_two, cubeDirichletOddReflectionCellSign_mul_self] + +theorem cubeDirichletOddReflectionCellSign_ne_zero {d : ℕ} + (choice : Fin d → Fin 3) : + cubeDirichletOddReflectionCellSign choice ≠ 0 := by + intro hzero + have hsq := cubeDirichletOddReflectionCellSign_mul_self choice + rw [hzero] at hsq + norm_num at hsq + +/-- The global odd-reflection sign induced by the coordinate fold. -/ +def cubeDirichletOddReflectionSign {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : ℝ := + ∏ i : Fin d, cubeCoordinateFoldSign Q x i + +@[simp] theorem cubeDirichletOddReflectionSign_mul_self {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : + cubeDirichletOddReflectionSign Q x * + cubeDirichletOddReflectionSign Q x = 1 := by + classical + unfold cubeDirichletOddReflectionSign + rw [← Finset.prod_mul_distrib] + refine Finset.prod_eq_one ?_ + intro i _hi + by_cases hLower : x i < cubeLowerFaceCoord Q i + · simp [cubeCoordinateFoldSign, hLower] + · by_cases hUpper : x i < cubeUpperFaceCoord Q i <;> + simp [cubeCoordinateFoldSign, hLower, hUpper] + +@[simp] theorem cubeDirichletOddReflectionSign_sq {d : ℕ} + (Q : TriadicCube d) (x : Vec d) : + cubeDirichletOddReflectionSign Q x ^ (2 : ℕ) = 1 := by + rw [pow_two, cubeDirichletOddReflectionSign_mul_self] + +/-- On a reflection cell, the global odd sign is the cell sign. -/ +theorem cubeDirichletOddReflectionSign_eq_cellSign_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeDirichletOddReflectionSign Q x = + cubeDirichletOddReflectionCellSign choice := by + classical + unfold cubeDirichletOddReflectionSign cubeDirichletOddReflectionCellSign + refine Finset.prod_congr rfl ?_ + intro i _hi + exact cubeCoordinateFoldSign_eq_cellFoldLinear_sign_of_mem_cellCube + Q choice hx i + +/-- Pointwise scalar odd reflection on one reflection cell. -/ +def cubeDirichletOddReflectionCellScalar {d : ℕ} (Q : TriadicCube d) + (choice : Fin d → Fin 3) (F : Vec d → ℝ) : Vec d → ℝ := + fun x => + cubeDirichletOddReflectionCellSign choice * + F (cubeFaceReflectionCellFoldMap Q choice x) + +@[simp] theorem cubeDirichletOddReflectionCellScalar_apply {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) (F : Vec d → ℝ) + (x : Vec d) : + cubeDirichletOddReflectionCellScalar Q choice F x = + cubeDirichletOddReflectionCellSign choice * + F (cubeFaceReflectionCellFoldMap Q choice x) := + rfl + +/-- Pointwise reflected gradient profile corresponding to one scalar odd cell. -/ +def cubeDirichletOddReflectionCellVectorField {d : ℕ} (Q : TriadicCube d) + (choice : Fin d → Fin 3) (G : Vec d → Vec d) : Vec d → Vec d := + fun x => + cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x)) + +@[simp] theorem cubeDirichletOddReflectionCellVectorField_apply {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + (x : Vec d) : + cubeDirichletOddReflectionCellVectorField Q choice G x = + cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x)) := + rfl + +/-- Global scalar odd reflection obtained from the coordinate fold. -/ +def cubeDirichletOddReflectionScalar {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) : Vec d → ℝ := + fun x => + cubeDirichletOddReflectionSign Q x * + F (cubeCoordinateFold Q x) + +@[simp] theorem cubeDirichletOddReflectionScalar_apply {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) (x : Vec d) : + cubeDirichletOddReflectionScalar Q F x = + cubeDirichletOddReflectionSign Q x * + F (cubeCoordinateFold Q x) := + rfl + +/-- Global reflected gradient profile corresponding to the scalar odd +reflection. -/ +def cubeDirichletOddReflectionVectorField {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) : Vec d → Vec d := + fun x => + cubeDirichletOddReflectionSign Q x • + cubeCoordinateFoldReflectedVectorField Q G x + +@[simp] theorem cubeDirichletOddReflectionVectorField_apply {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) (x : Vec d) : + cubeDirichletOddReflectionVectorField Q G x = + cubeDirichletOddReflectionSign Q x • + cubeCoordinateFoldReflectedVectorField Q G x := + rfl + +/-- The global odd scalar agrees with the affine one-cell scalar on a +reflection cell. -/ +theorem cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (F : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeDirichletOddReflectionScalar Q F x = + cubeDirichletOddReflectionCellScalar Q choice F x := by + rw [cubeDirichletOddReflectionScalar, + cubeDirichletOddReflectionCellScalar, + cubeDirichletOddReflectionSign_eq_cellSign_of_mem_cellCube Q choice hx, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + +/-- The global odd vector profile agrees with the affine one-cell vector +profile on a reflection cell. -/ +theorem cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (G : Vec d → Vec d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeDirichletOddReflectionVectorField Q G x = + cubeDirichletOddReflectionCellVectorField Q choice G x := by + rw [cubeDirichletOddReflectionVectorField, + cubeDirichletOddReflectionCellVectorField, + cubeDirichletOddReflectionSign_eq_cellSign_of_mem_cellCube Q choice hx, + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice G hx] + +/-- On the original cube, the global odd-reflection sign is `1`. -/ +theorem cubeDirichletOddReflectionSign_eq_one_of_mem_openCubeSet + {d : ℕ} (Q : TriadicCube d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeDirichletOddReflectionSign Q x = 1 := by + classical + unfold cubeDirichletOddReflectionSign + refine Finset.prod_eq_one ?_ + intro i _hi + exact cubeCoordinateFoldSign_eq_one_of_mem_openCubeSet Q hx i + +/-- On the original cube, the odd reflected scalar agrees with the original +scalar. -/ +theorem cubeDirichletOddReflectionScalar_eq_self_of_mem_openCubeSet + {d : ℕ} (Q : TriadicCube d) (F : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeDirichletOddReflectionScalar Q F x = F x := by + rw [cubeDirichletOddReflectionScalar, + cubeDirichletOddReflectionSign_eq_one_of_mem_openCubeSet Q hx, + cubeCoordinateFold_eq_self_of_mem_openCubeSet Q hx] + simp + +/-- On the original cube, the odd reflected vector field agrees with the +original vector field. -/ +theorem cubeDirichletOddReflectionVectorField_eq_self_of_mem_openCubeSet + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeDirichletOddReflectionVectorField Q G x = G x := by + rw [cubeDirichletOddReflectionVectorField, + cubeDirichletOddReflectionSign_eq_one_of_mem_openCubeSet Q hx, + cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet Q G hx] + simp + +/-- Odd scalar reflection has the same square as the unsigned coordinate-fold +scalar reflection. -/ +theorem cubeDirichletOddReflectionScalar_mul_self {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) (x : Vec d) : + cubeDirichletOddReflectionScalar Q F x * + cubeDirichletOddReflectionScalar Q F x = + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x := by + simp [cubeDirichletOddReflectionScalar, cubeCoordinateFoldReflectedScalar] + ring_nf + rw [cubeDirichletOddReflectionSign_sq] + ring + +/-- Odd vector reflection has the same self-pairing as the unsigned +coordinate-fold vector reflection. -/ +theorem cubeDirichletOddReflectionVectorField_self_pairing {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) (x : Vec d) : + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (cubeDirichletOddReflectionVectorField Q G x) = + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) := by + simp [cubeDirichletOddReflectionVectorField, vecDot_smul_left, + vecDot_smul_right] + rw [← mul_assoc, cubeDirichletOddReflectionSign_mul_self] + ring + +namespace H1Function + +/-- Odd scalar fold of an `H¹` function from the original cube to one +reflection cell. -/ +noncomputable def cubeDirichletOddReflectionCellFold {d : ℕ} + {Q : TriadicCube d} (u : H1Function (openCubeSet Q)) + (choice : Fin d → Fin 3) : + H1Function (openCubeSet (cubeFaceReflectionCellCube Q choice)) := + cubeDirichletOddReflectionCellSign choice • + u.cubeFaceReflectionCellFold choice + +@[simp] theorem cubeDirichletOddReflectionCellFold_toFun {d : ℕ} + {Q : TriadicCube d} (u : H1Function (openCubeSet Q)) + (choice : Fin d → Fin 3) (x : Vec d) : + (u.cubeDirichletOddReflectionCellFold choice).toFun x = + cubeDirichletOddReflectionCellSign choice * + u.toFun (cubeFaceReflectionCellFoldMap Q choice x) := + rfl + +@[simp] theorem cubeDirichletOddReflectionCellFold_grad {d : ℕ} + {Q : TriadicCube d} (u : H1Function (openCubeSet Q)) + (choice : Fin d → Fin 3) (x : Vec d) : + (u.cubeDirichletOddReflectionCellFold choice).grad x = + cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice + (u.grad (cubeFaceReflectionCellFoldMap Q choice x)) := + rfl + +theorem cubeDirichletOddReflectionCellFold_isPotentialOn {d : ℕ} + {Q : TriadicCube d} (u : H1Function (openCubeSet Q)) + (choice : Fin d → Fin 3) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeDirichletOddReflectionCellVectorField Q choice (fun y => u.grad y)) := + (u.cubeDirichletOddReflectionCellFold choice).isPotentialOn + +end H1Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OriginCubeEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OriginCubeEndpoint.lean new file mode 100644 index 0000000000..64e70300e4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/OriginCubeEndpoint.lean @@ -0,0 +1,287 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry + +/-! # Origin Cube Endpoint -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem hasWeakPartialDerivOn_congr_of_eqOn {d : ℕ} {U : Set (Vec d)} + (hU_meas : MeasurableSet U) {i : Fin d} + {u v gi hi : Vec d → ℝ} (huv : Set.EqOn u v U) + (hgi : Set.EqOn gi hi U) + (h : HasWeakPartialDerivOn U i u gi) : + HasWeakPartialDerivOn U i v hi := by + intro φ hφ hφs hφ_sub + have hleft : + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change v x * (fderiv ℝ φ x) (basisVec i) = + u x * (fderiv ℝ φ x) (basisVec i) + rw [← huv hx] + have hright : + ∫ x in U, gi x * φ x ∂MeasureTheory.volume = + ∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change gi x * φ x = hi x * φ x + rw [hgi hx] + calc + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := hleft + _ = -∫ x in U, gi x * φ x ∂MeasureTheory.volume := + h φ hφ hφs hφ_sub + _ = -∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + rw [hright] + +namespace CubeDirichletWeakPoissonProblem + +/-- Canonical cutoff from the original cube, viewed as the one-third inner +cube of its centered parent, to a half-radius parent cube. -/ +noncomputable def originCubeParentOneThirdHalfCutoff (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) (1 / 2 : ℝ) := + QuantitativeCubeCutoff.canonical (originCube d (m + 1)) (1 / 3 : ℝ) (1 / 2 : ℝ) + (by norm_num) (by norm_num) + +/-- Canonical outer cutoff used by the parent-cube interior estimate. -/ +noncomputable def originCubeParentThreeQuarterSevenEighthCutoff (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff (originCube d (m + 1)) (3 / 4 : ℝ) (7 / 8 : ℝ) := + QuantitativeCubeCutoff.canonical (originCube d (m + 1)) (3 / 4 : ℝ) (7 / 8 : ℝ) + (by norm_num) (by norm_num) + +variable {d : ℕ} {m : ℤ} {V : Set (Vec d)} {u : H10Function (openCubeSet (originCube d m))} + {F : Vec d → ℝ} + +/-- Apply the interior weak-Hessian estimate on the centered parent cube after +all-face odd reflection of an origin-cube Dirichlet solution. -/ +theorem exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hV : IsOpenBoundedConvexDomain V) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff (originCube d (m + 1)) ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet (originCube d (m + 1)) ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff (originCube d (m + 1)) σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet (originCube d (m + 1)) ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ uS : H1Function (scaledOpenCubeSet (originCube d (m + 1)) ρ₁), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : + HasWeakHessianOn + (scaledOpenCubeSet (originCube d (m + 1)) ρ₁) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i ρ₁ ρ₂ σ₁ σ₂ θ := by + rcases hweak.exists_cubeDirichletOddReflectionParent_weakPoissonEquationOn_originCube + hF with + ⟨uP, huP_toFun, huP_grad, hweakParent⟩ + have hFopen : MemScalarL2 (openCubeSet (originCube d m)) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure (originCube d m) hF + have hFparent : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionScalar (originCube d m) F) := + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) hFopen + rcases + hweakParent.exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + hFparent hV η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hρ₁_nonneg with + ⟨uS, huS_toFun, huS_grad, H, hH⟩ + exact ⟨uP, huP_toFun, huP_grad, uS, huS_toFun, huS_grad, H, hH⟩ + +/-- The parent reflected Hessian estimate specialized to the one-third inner +cube, read back as an estimate on the original centered cube. -/ +theorem exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_originCube_hessianCoordL2NormSum_le + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hV : IsOpenBoundedConvexDomain V) + {ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) ⊆ V) + (θ : QuantitativeCubeCutoff (originCube d (m + 1)) σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet (originCube d (m + 1)) ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ uS : H1Function (openCubeSet (originCube d m)), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i (1 / 3 : ℝ) ρ₂ σ₁ σ₂ θ := by + have hparent := + hweak.exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le + hF hV η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one (by norm_num : 0 ≤ (1 / 3 : ℝ)) + have hgeom : + scaledOpenCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) = + openCubeSet (originCube d m) := + scaledOpenCubeSet_originCube_succ_one_div_three d m + rw [hgeom] at hparent + exact hparent + +/-- The one-third reflected-parent Hessian estimate with fixed numerical +cutoffs. -/ +theorem exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ uS : H1Function (openCubeSet (originCube d m)), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + let Qp : TriadicCube d := originCube d (m + 1) + let Vp : Set (Vec d) := scaledOpenCubeSet Qp (2 / 3 : ℝ) + have hV : IsOpenBoundedConvexDomain Vp := + isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp + (by norm_num : 0 < (2 / 3 : ℝ)) + have hη_sub : + tsupport (originCubeParentOneThirdHalfCutoff d m : Vec d → ℝ) ⊆ Vp := by + have hclosed : + tsupport (originCubeParentOneThirdHalfCutoff d m : Vec d → ℝ) ⊆ + scaledClosedCubeSet Qp (1 / 2 : ℝ) := + (originCubeParentOneThirdHalfCutoff d m).tsupport_subset_scaledClosedCubeSet_of_support_subset + exact hclosed.trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (1 / 2 : ℝ) < 2 / 3)) + have hinnerV : + scaledClosedCubeSet Qp (1 / 3 : ℝ) ⊆ Vp := + scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (1 / 3 : ℝ) < 2 / 3) + have hVν : + Vp ⊆ scaledClosedCubeSet Qp (2 / 3 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet Qp (2 / 3 : ℝ) + simpa [Qp, Vp, originCubeParentOneThirdHalfCutoff, + originCubeParentThreeQuarterSevenEighthCutoff] using + hweak.exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_originCube_hessianCoordL2NormSum_le + hF hV (originCubeParentOneThirdHalfCutoff d m) hη_sub hinnerV + (originCubeParentThreeQuarterSevenEighthCutoff d m) hVν + (by norm_num : 0 ≤ (2 / 3 : ℝ)) (by norm_num : (2 / 3 : ℝ) < 3 / 4) + (by norm_num : (3 / 4 : ℝ) < 1) (by norm_num : 0 ≤ (7 / 8 : ℝ)) + (by norm_num : (7 / 8 : ℝ) < 1) + +/-- Read the reflected-parent fixed-radii Hessian witness as a weak Hessian +of the original Dirichlet solution on the original cube. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + rcases + hweak.exists_cubeDirichletOddReflectionParent_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + hF with + ⟨uP, huP_toFun, huP_grad, uS, _huS_toFun, huS_grad, H, hH⟩ + let HW : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function := + { hess := H.hess + hess_memL2 := H.hess_memL2 + weak_second := by + intro i j + have hgrad_eq : + Set.EqOn (fun x => uS.grad x i) + (fun x => u.toH1Function.grad x i) (openCubeSet (originCube d m)) := by + intro x hx + calc + uS.grad x i = uP.grad x i := by rw [huS_grad] + _ = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x i := by + rw [huP_grad] + _ = u.toH1Function.grad x i := by + exact congrFun + (cubeDirichletOddReflectionVectorField_eq_self_of_mem_openCubeSet + (originCube d m) (fun y => u.toH1Function.grad y) hx) i + exact + hasWeakPartialDerivOn_congr_of_eqOn + (measurableSet_openCubeSet (originCube d m)) hgrad_eq + (fun _x _hx => rfl) (H.weak_second i j) } + refine ⟨uP, huP_toFun, huP_grad, HW, ?_⟩ + simpa [HW, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2] using hH + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/PoissonTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/PoissonTranslation.lean new file mode 100644 index 0000000000..3abfd6de62 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/PoissonTranslation.lean @@ -0,0 +1,167 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport + +/-! # Poisson Translation -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +variable {d : ℕ} + +/-- Pull an arbitrary-cube zero-trace function back to the centered cube of +the same scale. -/ +noncomputable def untranslateToOriginFunction (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) : + H10Function (openCubeSet (originCube d Q.scale)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uT : H10Function (translateSet z U₀) := + { toH1Function := + { toFun := u.toH1Function.toFun + grad := u.toH1Function.grad + memL2 := by + simpa [← hU] using u.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [← hU] using u.toH1Function.gradMemL2 i + hasWeakGradient := by + simpa [← hU] using u.toH1Function.hasWeakGradient } + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := by + intro n + simpa [← hU] using u.approx_support_subset n + tendsto_approx := by + simpa [← hU] using u.tendsto_approx + tendsto_approx_grad := by + intro i + simpa [← hU] using u.tendsto_approx_grad i } + exact H10Function.untranslate z uT + +@[simp] theorem untranslateToOriginFunction_toFun (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (x : Vec d) : + (untranslateToOriginFunction Q u).toH1Function.toFun x = + u.toH1Function.toFun (x + triadicCubeShift Q) := by + simp [untranslateToOriginFunction, H10Function.untranslate, H1Function.untranslate] + +@[simp] theorem untranslateToOriginFunction_grad (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (x : Vec d) : + (untranslateToOriginFunction Q u).toH1Function.grad x = + u.toH1Function.grad (x + triadicCubeShift Q) := by + simp [untranslateToOriginFunction, H10Function.untranslate, H1Function.untranslate] + +/-- Pull a cube Dirichlet weak Poisson equation back to the centered cube of +the same scale. -/ +theorem untranslateToOrigin {Q : TriadicCube d} + {u : H10Function (openCubeSet Q)} {F : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem Q u F) : + CubeDirichletWeakPoissonProblem (originCube d Q.scale) + (untranslateToOriginFunction Q u) + (fun x => F (x + triadicCubeShift Q)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + intro φ + let φT : H10Function (translateSet z U₀) := φ.translate z + let φQ : H10Function (openCubeSet Q) := + { toH1Function := + { toFun := φT.toH1Function.toFun + grad := φT.toH1Function.grad + memL2 := by + simpa [hU] using φT.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [hU] using φT.toH1Function.gradMemL2 i + hasWeakGradient := by + simpa [hU] using φT.toH1Function.hasWeakGradient } + approx := φT.approx + approx_smooth := φT.approx_smooth + approx_hasCompactSupport := φT.approx_hasCompactSupport + approx_support_subset := by + intro n + simpa [hU] using φT.approx_support_subset n + tendsto_approx := by + simpa [hU] using φT.tendsto_approx + tendsto_approx_grad := by + intro i + simpa [hU] using φT.tendsto_approx_grad i } + have hEqT : + ∫ x in translateSet z U₀, + vecDot (u.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume := by + simpa [φQ, hU] using hweak φQ + have hleft : + ∫ x in U₀, + vecDot ((untranslateToOriginFunction Q u).toH1Function.grad x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in translateSet z U₀, + vecDot (u.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [Q₀, U₀, z, φT, H10Function.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x => vecDot (u.toH1Function.grad x) (φT.toH1Function.grad x))) + have hright : + ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume = + ∫ x in U₀, F (x + z) * φ.toH1Function x + ∂MeasureTheory.volume := by + symm + simpa [φT, H10Function.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x => F x * φT.toH1Function x)) + calc + ∫ x in openCubeSet Q₀, + vecDot ((untranslateToOriginFunction Q u).toH1Function.grad x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in translateSet z U₀, + vecDot (u.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [U₀] using hleft + _ = ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume := hEqT + _ = ∫ x in U₀, F (x + z) * φ.toH1Function x + ∂MeasureTheory.volume := hright + _ = ∫ x in openCubeSet Q₀, F (x + triadicCubeShift Q) * φ.toH1Function x + ∂MeasureTheory.volume := by + simp [Q₀, U₀, z] + +/-- Translating the centered pullback recovers the original arbitrary-cube +gradient. -/ +theorem untranslateToOriginFunction_translate_grad (Q : TriadicCube d) + (u : H10Function (openCubeSet Q)) (x : Vec d) : + ((untranslateToOriginFunction Q u).toH1Function.translate + (triadicCubeShift Q)).grad x = + u.toH1Function.grad x := by + simp [H1Function.translate, sub_eq_add_neg, add_assoc] + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionDivergenceRhs.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionDivergenceRhs.lean new file mode 100644 index 0000000000..5817dc25ef --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionDivergenceRhs.lean @@ -0,0 +1,140 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionParentH1Graph + +/-! # Reflection Divergence Rhs -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Dirichlet odd reflection for a divergence-form right-hand side + +On a centered cube, the product-odd reflection of a zero-trace scalar +function has the corresponding odd-reflected vector field as its gradient. +Reflecting the vector datum by the same rule preserves the constant-coefficient +divergence-form weak equation, including its sign. +-/ + +/-- A scalar constant-coefficient divergence-form equation on a centered cube +extends to compactly supported smooth tests on the centered parent cube under +all-face Dirichlet odd reflection. No sign or positivity assumption on the +constant coefficient is needed. -/ +theorem exists_h1Function_cubeDirichletOddReflectionParent_divergence_rhs_originCube + {d : ℕ} {m : ℤ} {sigma0 : ℝ} + {u : H10Function (openCubeSet (originCube d m))} + {h : Vec d → Vec d} + (hh : MemVectorL2 (openCubeSet (originCube d m)) h) + (hweak : ∀ ψ : H10Function (openCubeSet (originCube d m)), + sigma0 * + ∫ x in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet (originCube d m), + vecDot (h x) (ψ.toH1Function.grad x) ∂MeasureTheory.volume) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∀ (φ : Vec d → ℝ), + ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → + tsupport φ ⊆ openCubeSet (originCube d (m + 1)) → + sigma0 * + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (uP.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + -∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) h x) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + obtain ⟨uP, huP_toFun, huP_grad⟩ := + exists_h1Function_cubeDirichletOddReflectionParent_originCube u + refine ⟨uP, huP_toFun, huP_grad, ?_⟩ + intro φ hφ hφ_compact hφ_sub + have huGrad : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => u.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + u.toH1Function.grad_memVectorL2 + have hfolded : + sigma0 * + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap + (originCube d m) choice y)) + ∂MeasureTheory.volume = + -∫ y in openCubeSet (originCube d m), + vecDot (h y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap + (originCube d m) choice y)) + ∂MeasureTheory.volume := by + let ψ : H10Function (openCubeSet (originCube d m)) := + H10Function.cubeDirichletOddReflectionFoldedParentScalarTestToH10 + m hφ hφ_compact hφ_sub + have htest := hweak ψ + have hψ_grad : + ψ.toH1Function.grad = + fun y i => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap + (originCube d m) choice y) := by + funext y i + change + euclideanCoordDeriv i + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y = _ + exact + euclideanCoordDeriv_cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) i hφ y + simpa [hψ_grad] using htest + rw [huP_grad, + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x) + (euclideanGradient φ x)), + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) h x) + (euclideanGradient φ x)), + setIntegral_cubeFaceReflectionBlockSet_vecDot_cubeDirichletOddReflectionVectorField_eq_folded_derivSum + (Q := originCube d m) (G := fun y => u.toH1Function.grad y) + huGrad hφ hφ_compact, + setIntegral_cubeFaceReflectionBlockSet_vecDot_cubeDirichletOddReflectionVectorField_eq_folded_derivSum + (Q := originCube d m) (G := h) hh hφ hφ_compact] + exact hfolded + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionFiniteP.lean new file mode 100644 index 0000000000..11f96e0a82 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionFiniteP.lean @@ -0,0 +1,552 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Ambient.CoefficientFieldHilbert +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge + +/-! +# Finite-`p` transport under Dirichlet odd reflection + +The Dirichlet odd reflection acts by coordinate signs on the gradient profile. +Those signs are Euclidean isometries. Combined with the measure-preserving +cell fold maps, this gives exact finite-`p` transport from a cube to its full +reflection block. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem norm_hilbertVec_ofVec_cubeDirichletOddReflectionCellVectorField + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + (x : Vec d) : + ‖HilbertVec.ofVec (cubeDirichletOddReflectionCellVectorField Q choice G x)‖ = + ‖HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))‖ := by + apply (sq_eq_sq₀ (norm_nonneg _) (norm_nonneg _)).mp + rw [HilbertVec.norm_sq_ofVec, HilbertVec.norm_sq_ofVec, + cubeDirichletOddReflectionCellVectorField_apply] + let v := G (cubeFaceReflectionCellFoldMap Q choice x) + calc + vecDot (cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice v) + (cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice v) = + vecDot (cubeFaceReflectionCellFoldLinear choice v) + (cubeFaceReflectionCellFoldLinear choice v) := by + simp [vecDot_smul_left, vecDot_smul_right] + rw [← mul_assoc, cubeDirichletOddReflectionCellSign_mul_self] + ring + _ = vecDot v v := by + rw [← vecDot_cubeFaceReflectionCellFoldLinear_left choice + (cubeFaceReflectionCellFoldLinear choice v) v, + cubeFaceReflectionCellFoldLinear_involutive] + +private theorem norm_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_eq_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ = + ‖HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))‖ := by + rw [cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube Q choice G hx] + exact norm_hilbertVec_ofVec_cubeDirichletOddReflectionCellVectorField Q choice G x + +private theorem aestronglyMeasurable_hilbertVec_ofVec_cellLinear + {d : ℕ} (choice : Fin d → Fin 3) {α : Type*} [MeasurableSpace α] + (G : α → Vec d) + {μ : MeasureTheory.Measure α} + (hG : MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (G x)) μ) : + MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice (G x))) μ := by + have hvec : MeasureTheory.AEStronglyMeasurable G μ := by + simpa using + (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable hG + have hlinear : MeasureTheory.AEStronglyMeasurable + (fun x => cubeFaceReflectionCellFoldLinear choice (G x)) μ := + (cubeFaceReflectionCellFoldLinear choice).continuous.comp_aestronglyMeasurable hvec + simpa using + (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable + (hlinear.const_smul (cubeDirichletOddReflectionCellSign choice)) + +private theorem aestronglyMeasurable_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + (hG : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hmp : MeasureTheory.MeasurePreserving + (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hGmap : MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.Measure.map (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice)))) := by + rw [hmp.map_eq] + exact hG + simpa [Function.comp_def] using hGmap.comp_aemeasurable hmp.aemeasurable + have hcell := aestronglyMeasurable_hilbertVec_ofVec_cellLinear + choice (fun x => G (cubeFaceReflectionCellFoldMap Q choice x)) hcomp + refine hcell.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + simpa [cubeDirichletOddReflectionCellVectorField] using congrArg HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube Q choice G hx).symm + +private theorem lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + (p : FiniteLpExponent) : + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ∫⁻ y in openCubeSet Q, ‖HilbertVec.ofVec (G y)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + calc + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + apply MeasureTheory.lintegral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + simpa only [ofReal_norm] using congrArg + (fun t : ℝ => ENNReal.ofReal t ^ p.exponent.toReal) + (norm_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_eq_cell + Q choice G hx) + _ = ∫⁻ y in openCubeSet Q, ‖HilbertVec.ofVec (G y)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + rw [← preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] + exact + ((measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q)).lintegral_comp_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (fun y => ‖HilbertVec.ofVec (G y)‖ₑ ^ p.exponent.toReal) + +/-- A radial nonnegative integral is preserved on each face-reflection cell. +This is the measure-theoretic core behind all norm and level-tail transport +under Dirichlet odd reflection. -/ +private theorem lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField_comp_norm + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) + (Φ : ℝ → ℝ≥0∞) : + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + Φ ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ + ∂MeasureTheory.volume = + ∫⁻ y in openCubeSet Q, Φ ‖HilbertVec.ofVec (G y)‖ + ∂MeasureTheory.volume := by + calc + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + Φ ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ + ∂MeasureTheory.volume = + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + Φ ‖HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))‖ + ∂MeasureTheory.volume := by + apply MeasureTheory.lintegral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + rw [norm_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_eq_cell Q choice G hx] + _ = ∫⁻ y in openCubeSet Q, Φ ‖HilbertVec.ofVec (G y)‖ + ∂MeasureTheory.volume := by + rw [← preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] + exact + ((measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q)).lintegral_comp_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (fun y => Φ ‖HilbertVec.ofVec (G y)‖) + +private theorem lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) (p : FiniteLpExponent) : + ∫⁻ x in cubeFaceReflectionBlockSet Q, + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ((3 : ℝ≥0∞) ^ d) * + ∫⁻ y in openCubeSet Q, ‖HilbertVec.ofVec (G y)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q, + MeasureTheory.lintegral_iUnion] + · simp_rw [lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField Q] + simp [nsmul_eq_mul] + · intro choice + exact measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice) + · intro choice₁ choice₂ hne + exact disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne Q hne + +/-- The full Dirichlet reflection block consists of exactly `3^d` radial +copies of the source cube. No integrability or measurability hypothesis is +needed for this nonnegative integral identity. -/ +theorem lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField_comp_norm + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) (Φ : ℝ → ℝ≥0∞) : + ∫⁻ x in cubeFaceReflectionBlockSet Q, + Φ ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)‖ + ∂MeasureTheory.volume = + ((3 : ℝ≥0∞) ^ d) * + ∫⁻ y in openCubeSet Q, Φ ‖HilbertVec.ofVec (G y)‖ + ∂MeasureTheory.volume := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q, + MeasureTheory.lintegral_iUnion] + · simp_rw [lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField_comp_norm Q] + simp [nsmul_eq_mul] + · intro choice + exact measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice) + · intro choice₁ choice₂ hne + exact disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne Q hne + +/-- Strong measurability transports from a source cube to the full Dirichlet +reflection block. -/ +theorem aestronglyMeasurable_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + classical + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => + aestronglyMeasurable_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_cell + Q choice G hG + +private theorem finiteLpExponent_ne_zero (p : FiniteLpExponent) : p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (finiteLpExponent_ne_zero p) p.lt_top.ne + +private theorem aestronglyMeasurable_oddReflectionBlock_iff {d : ℕ} (Q : TriadicCube d) + (G : Vec d → Vec d) : + MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) ↔ + MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + constructor + · intro h + have hrestrict := h.mono_measure (MeasureTheory.Measure.restrict_mono_set _ + (openCubeSet_subset_cubeFaceReflectionBlockSet Q)) + apply hrestrict.congr + filter_upwards [MeasureTheory.ae_restrict_mem (isOpen_openCubeSet Q).measurableSet] + with x hx + rw [cubeDirichletOddReflectionVectorField_eq_self_of_mem_openCubeSet Q G hx] + · intro h + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => + aestronglyMeasurable_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_cell Q choice G h + +/-- The finite-`p` Euclidean norm of the odd-reflected vector field on the +full reflection block is exactly the `3^d` measure-scaling factor times the +norm on the source cube. -/ +theorem eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + p.exponent (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + by_cases h : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) + · have href := (aestronglyMeasurable_oddReflectionBlock_iff Q G).mpr h + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne href, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne h, + lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField] + rw [ENNReal.mul_rpow_of_nonneg _ _ + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos p).le)] + · have href := mt (aestronglyMeasurable_oddReflectionBlock_iff Q G).mp h + rw [MeasureTheory.eLpNorm_of_not_aestronglyMeasurable href, + MeasureTheory.eLpNorm_of_not_aestronglyMeasurable h] + rw [ENNReal.mul_top (by positivity)] + +/-- Finite-`p` Euclidean integrability transports from a cube to the complete +Dirichlet odd-reflection block. -/ +theorem memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (p : FiniteLpExponent) + (hG : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.MemLp + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + p.exponent (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + unfold MeasureTheory.MemLp + rw [eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField Q G p] + refine ENNReal.mul_lt_top ?_ hG.eLpNorm_lt_top + exact ENNReal.rpow_lt_top_of_nonneg + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos p).le) (by simp) + +/-- On a centered origin cube, the odd-reflected Euclidean field has the +same exact unnormalized finite-`p` scaling on the parent cube. -/ +theorem eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + (originCube d m) G p + +/-- Finite-`p` Euclidean integrability transports from an origin cube to its +centered parent under Dirichlet odd reflection. -/ +theorem memLp_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} (p : FiniteLpExponent) + (hG : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m)))) : + MeasureTheory.MemLp + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + (originCube d m) p hG + +/-- Radial nonnegative integrals on a centered parent cube are exactly `3^d` +times the corresponding source-cube integrals under Dirichlet odd reflection. -/ +theorem lintegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_comp_norm + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (Φ : ℝ → ℝ≥0∞) : + ∫⁻ x in openCubeSet (originCube d (m + 1)), + Φ ‖HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)‖ + ∂MeasureTheory.volume = + ((3 : ℝ≥0∞) ^ d) * + ∫⁻ y in openCubeSet (originCube d m), Φ ‖HilbertVec.ofVec (G y)‖ + ∂MeasureTheory.volume := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField_comp_norm + (originCube d m) G Φ + +/-- Strong measurability transports from a centered source cube to its parent +under Dirichlet odd reflection. -/ +theorem aestronglyMeasurable_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} + (hG : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet (originCube d m)))) : + MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact aestronglyMeasurable_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + (originCube d m) hG + +private theorem normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet + {d : ℕ} (m : ℤ) : + normalizedCubeMeasure (originCube d m) = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + +private theorem restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure + {d : ℕ} (m : ℤ) : + MeasureTheory.volume.restrict (openCubeSet (originCube d m)) = + ENNReal.ofReal (cubeVolume (originCube d m)) • + normalizedCubeMeasure (originCube d m) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos _)] + rw [smul_smul] + have hnonzero : ENNReal.ofReal (cubeVolume (originCube d m)) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos _) + have hone : ENNReal.ofReal (cubeVolume (originCube d m)) * + (ENNReal.ofReal (cubeVolume (originCube d m)))⁻¹ = 1 := + by simpa [mul_comm] using ENNReal.inv_mul_cancel hnonzero ENNReal.ofReal_ne_top + rw [hone, one_smul] + +private theorem cubeVolume_originCube_succ {d : ℕ} (m : ℤ) : + cubeVolume (originCube d (m + 1)) = + (3 : ℝ) ^ d * cubeVolume (originCube d m) := by + simp [cubeVolume, cubeScaleFactor, originCube, zpow_add₀] + rw [mul_pow] + ring + +private theorem normalized_originCube_reflection_factor_cancel + {d : ℕ} (m : ℤ) (p : FiniteLpExponent) : + ENNReal.ofReal ((cubeVolume (originCube d (m + 1)))⁻¹) ^ + (p.exponent.toReal)⁻¹ * + ((3 : ENNReal) ^ d) ^ (p.exponent.toReal)⁻¹ = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) ^ + (p.exponent.toReal)⁻¹ := by + let N : ℝ := (3 : ℝ) ^ d + let V : ℝ := cubeVolume (originCube d m) + have hN : 0 < N := by positivity + have hV : 0 < V := cubeVolume_pos _ + have hvol : cubeVolume (originCube d (m + 1)) = N * V := by + simpa [N, V] using cubeVolume_originCube_succ (d := d) m + have hbase_real : (N * V)⁻¹ * N = V⁻¹ := by + field_simp [hN.ne', hV.ne'] + have hbase : ENNReal.ofReal ((N * V)⁻¹) * ENNReal.ofReal N = + ENNReal.ofReal V⁻¹ := by + rw [← ENNReal.ofReal_mul (inv_nonneg.mpr (mul_nonneg hN.le hV.le))] + exact congrArg ENNReal.ofReal hbase_real + rw [hvol] + calc + ENNReal.ofReal ((N * V)⁻¹) ^ (p.exponent.toReal)⁻¹ * + ((3 : ENNReal) ^ d) ^ (p.exponent.toReal)⁻¹ = + (ENNReal.ofReal ((N * V)⁻¹) * ENNReal.ofReal N) ^ + (p.exponent.toReal)⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by positivity)] + congr 1 + norm_num [N] + _ = ENNReal.ofReal V⁻¹ ^ (p.exponent.toReal)⁻¹ := by rw [hbase] + +/-- Normalized origin-cube finite-`p` norms are exactly preserved by the +Dirichlet odd reflection from a cube to its centered parent. -/ +theorem eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} (G : Vec d → Vec d) (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet, + normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero_of_ne_top + (finiteLpExponent_ne_zero p) p.lt_top.ne _, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero_of_ne_top + (finiteLpExponent_ne_zero p) p.lt_top.ne _, + eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField] + simp only [smul_eq_mul, one_div, ENNReal.toReal_inv] + rw [← mul_assoc, normalized_originCube_reflection_factor_cancel] + +/-- Finite-`p` Euclidean integrability is preserved by the normalized +origin-cube odd-reflection transport. -/ +theorem memLp_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} (p : FiniteLpExponent) + (hG : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure (originCube d m))) : + MeasureTheory.MemLp + (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionVectorField (originCube d m) G x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + have hGopen : MeasureTheory.MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure] + exact hG.smul_measure ENNReal.ofReal_ne_top + have hreflect := memLp_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + p hGopen + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + exact hreflect.smul_measure ENNReal.ofReal_ne_top + +private theorem aestronglyMeasurable_oddReflectionCell_iff + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (G : Vec d → Vec d) : + MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) ↔ + MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + constructor + · intro h + have htwice := aestronglyMeasurable_hilbertVec_ofVec_cellLinear choice + (cubeDirichletOddReflectionVectorField Q G) h + have hcomp : MeasureTheory.AEStronglyMeasurable + (fun x => HilbertVec.ofVec (G (cubeFaceReflectionCellFoldMap Q choice x))) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + apply htwice.congr + filter_upwards [MeasureTheory.ae_restrict_mem + (isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice)).measurableSet] + with x hx + rw [cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx, cubeDirichletOddReflectionCellVectorField_apply, + map_smul, smul_smul, cubeDirichletOddReflectionCellSign_mul_self, + cubeFaceReflectionCellFoldLinear_involutive, one_smul] + have hmp : MeasureTheory.MeasurePreserving + (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) (openCubeSet Q) + have hmap : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.Measure.map (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice)))) := + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice).aestronglyMeasurable_map_iff.mpr + hcomp + rwa [hmp.map_eq] at hmap + · exact aestronglyMeasurable_hilbertVec_ofVec_cubeDirichletOddReflectionVectorField_cell + Q choice G + +/-- On one reflection cell, the odd-reflected Euclidean vector field has the +same finite-`p` norm as the original field on the source cube. -/ +theorem eLpNorm_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q G x)) + p.exponent + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) = + MeasureTheory.eLpNorm (fun x => HilbertVec.ofVec (G x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + by_cases h : MeasureTheory.AEStronglyMeasurable (fun x => HilbertVec.ofVec (G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) + · have href := (aestronglyMeasurable_oddReflectionCell_iff Q choice G).mpr h + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne href, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne h, + lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField] + · have href := mt (aestronglyMeasurable_oddReflectionCell_iff Q choice G).mp h + rw [MeasureTheory.eLpNorm_of_not_aestronglyMeasurable href, + MeasureTheory.eLpNorm_of_not_aestronglyMeasurable h] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionHessianRowFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionHessianRowFiniteP.lean new file mode 100644 index 0000000000..9739b435a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionHessianRowFiniteP.lean @@ -0,0 +1,721 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionScalarFiniteP + +/-! +# Finite-`p` transport for mixed-parity Dirichlet reflections + +Differentiating an all-odd scalar reflection in coordinate `i` changes the +cell parity from `S` to `S * s_i`. Differentiating once more in coordinate +`j` gives the Hessian-row parity `S * s_i * s_j`. This file records those +pointwise formulas and their exact finite-`p` norm transport. No weak +derivative assertion is made here. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The mixed scalar sign `S * s_i` on one reflection cell. -/ +def cubeDirichletOddReflectionMixedCellSign {d : ℕ} + (choice : Fin d → Fin 3) (i : Fin d) : ℝ := + cubeDirichletOddReflectionCellSign choice * + if choice i = 1 then 1 else -1 + +@[simp] theorem cubeDirichletOddReflectionMixedCellSign_apply {d : ℕ} + (choice : Fin d → Fin 3) (i : Fin d) : + cubeDirichletOddReflectionMixedCellSign choice i = + cubeDirichletOddReflectionCellSign choice * + if choice i = 1 then 1 else -1 := + rfl + +@[simp] theorem cubeDirichletOddReflectionMixedCellSign_mul_self + {d : ℕ} (choice : Fin d → Fin 3) (i : Fin d) : + cubeDirichletOddReflectionMixedCellSign choice i * + cubeDirichletOddReflectionMixedCellSign choice i = 1 := by + unfold cubeDirichletOddReflectionMixedCellSign + calc + (cubeDirichletOddReflectionCellSign choice * + (if choice i = 1 then 1 else -1)) * + (cubeDirichletOddReflectionCellSign choice * + (if choice i = 1 then 1 else -1)) = + (cubeDirichletOddReflectionCellSign choice * + cubeDirichletOddReflectionCellSign choice) * + ((if choice i = 1 then 1 else -1) * + (if choice i = 1 then 1 else -1)) := by ring + _ = 1 := by + rw [cubeDirichletOddReflectionCellSign_mul_self] + by_cases hi : choice i = 1 <;> simp [hi] + +@[simp] theorem norm_cubeDirichletOddReflectionMixedCellSign + {d : ℕ} (choice : Fin d → Fin 3) (i : Fin d) : + ‖cubeDirichletOddReflectionMixedCellSign choice i‖ = 1 := by + apply (sq_eq_sq₀ (norm_nonneg _) zero_le_one).mp + rw [Real.norm_eq_abs, sq_abs, one_pow, pow_two, + cubeDirichletOddReflectionMixedCellSign_mul_self] + +/-- The cellwise mixed reflection of a scalar gradient coordinate. -/ +def cubeDirichletOddReflectionGradientCoordCellScalar {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) (i : Fin d) + (v : Vec d → ℝ) : Vec d → ℝ := + fun x ↦ cubeDirichletOddReflectionMixedCellSign choice i * + v (cubeFaceReflectionCellFoldMap Q choice x) + +@[simp] theorem cubeDirichletOddReflectionGradientCoordCellScalar_apply + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (v : Vec d → ℝ) (x : Vec d) : + cubeDirichletOddReflectionGradientCoordCellScalar Q choice i v x = + cubeDirichletOddReflectionCellSign choice * + (if choice i = 1 then 1 else -1) * + v (cubeFaceReflectionCellFoldMap Q choice x) := by + rw [cubeDirichletOddReflectionGradientCoordCellScalar, + cubeDirichletOddReflectionMixedCellSign] + +/-- The global mixed reflection of a scalar gradient coordinate. Its parity is +exactly `S * s_i`. -/ +def cubeDirichletOddReflectionGradientCoordScalar {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (v : Vec d → ℝ) : Vec d → ℝ := + fun x ↦ cubeDirichletOddReflectionSign Q x * + cubeCoordinateFoldSign Q x i * v (cubeCoordinateFold Q x) + +@[simp] theorem cubeDirichletOddReflectionGradientCoordScalar_apply + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (v : Vec d → ℝ) (x : Vec d) : + cubeDirichletOddReflectionGradientCoordScalar Q i v x = + cubeDirichletOddReflectionSign Q x * + cubeCoordinateFoldSign Q x i * v (cubeCoordinateFold Q x) := + rfl + +/-- The mixed scalar reflection is the `i`th coordinate of the odd reflection +of the vector field supported in coordinate `i`. -/ +theorem cubeDirichletOddReflectionGradientCoordScalar_eq_vectorField_singleCoordinate + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (v : Vec d → ℝ) (x : Vec d) : + cubeDirichletOddReflectionGradientCoordScalar Q i v x = + cubeDirichletOddReflectionVectorField Q + (fun y j ↦ if j = i then v y else 0) x i := by + simp only [cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionVectorField, + cubeCoordinateFoldReflectedVectorField, + Pi.smul_apply, smul_eq_mul, if_pos] + ring + +/-- The cellwise mixed reflection of one Hessian row. Its `j`th coordinate +has parity `S * s_i * s_j`. -/ +def cubeDirichletOddReflectionHessianRowCellVectorField {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) (i : Fin d) + (R : Vec d → Vec d) : Vec d → Vec d := + fun x ↦ cubeDirichletOddReflectionMixedCellSign choice i • + cubeFaceReflectionCellFoldLinear choice + (R (cubeFaceReflectionCellFoldMap Q choice x)) + +@[simp] theorem cubeDirichletOddReflectionHessianRowCellVectorField_apply + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i j : Fin d) (R : Vec d → Vec d) (x : Vec d) : + cubeDirichletOddReflectionHessianRowCellVectorField Q choice i R x j = + cubeDirichletOddReflectionCellSign choice * + (if choice i = 1 then 1 else -1) * + (if choice j = 1 then 1 else -1) * + R (cubeFaceReflectionCellFoldMap Q choice x) j := by + simp only [cubeDirichletOddReflectionHessianRowCellVectorField, + cubeDirichletOddReflectionMixedCellSign, Pi.smul_apply, smul_eq_mul, + cubeFaceReflectionCellFoldLinear_apply] + by_cases hi : choice i = 1 <;> by_cases hj : choice j = 1 <;> + simp only [hi, hj, if_true, if_false] <;> ring + +/-- The global mixed reflection of one Hessian row. -/ +def cubeDirichletOddReflectionHessianRowVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (R : Vec d → Vec d) : + Vec d → Vec d := + fun x ↦ + (cubeDirichletOddReflectionSign Q x * cubeCoordinateFoldSign Q x i) • + cubeCoordinateFoldReflectedVectorField Q R x + +/-- The global Hessian-row formula exposes the exact chain-rule parity +`S * s_i * s_j`. -/ +@[simp] theorem cubeDirichletOddReflectionHessianRowVectorField_apply + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) + (R : Vec d → Vec d) (x : Vec d) : + cubeDirichletOddReflectionHessianRowVectorField Q i R x j = + cubeDirichletOddReflectionSign Q x * + cubeCoordinateFoldSign Q x i * cubeCoordinateFoldSign Q x j * + R (cubeCoordinateFold Q x) j := by + simp only [cubeDirichletOddReflectionHessianRowVectorField, + cubeCoordinateFoldReflectedVectorField, Pi.smul_apply, smul_eq_mul] + ring + +/-- The global mixed scalar agrees with its affine formula on each reflection +cell. -/ +theorem cubeDirichletOddReflectionGradientCoordScalar_eq_cell_of_mem + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (v : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeDirichletOddReflectionGradientCoordScalar Q i v x = + cubeDirichletOddReflectionGradientCoordCellScalar Q choice i v x := by + rw [cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionGradientCoordCellScalar, + cubeDirichletOddReflectionMixedCellSign, + cubeDirichletOddReflectionSign_eq_cellSign_of_mem_cellCube Q choice hx, + cubeCoordinateFoldSign_eq_cellFoldLinear_sign_of_mem_cellCube Q choice hx i, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube Q choice hx] + +/-- The global mixed Hessian row agrees with its affine formula on each +reflection cell. -/ +theorem cubeDirichletOddReflectionHessianRowVectorField_eq_cell_of_mem + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (R : Vec d → Vec d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeDirichletOddReflectionHessianRowVectorField Q i R x = + cubeDirichletOddReflectionHessianRowCellVectorField Q choice i R x := by + rw [cubeDirichletOddReflectionHessianRowVectorField, + cubeDirichletOddReflectionHessianRowCellVectorField, + cubeDirichletOddReflectionMixedCellSign, + cubeDirichletOddReflectionSign_eq_cellSign_of_mem_cellCube Q choice hx, + cubeCoordinateFoldSign_eq_cellFoldLinear_sign_of_mem_cellCube Q choice hx i, + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice R hx] + +/-- The mixed scalar is unchanged on the source cube. -/ +theorem cubeDirichletOddReflectionGradientCoordScalar_eq_self_of_mem_openCubeSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (v : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + cubeDirichletOddReflectionGradientCoordScalar Q i v x = v x := by + rw [cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionSign_eq_one_of_mem_openCubeSet Q hx, + cubeCoordinateFoldSign_eq_one_of_mem_openCubeSet Q hx i, + cubeCoordinateFold_eq_self_of_mem_openCubeSet Q hx] + norm_num + +/-- The mixed Hessian row is unchanged on the source cube. -/ +theorem cubeDirichletOddReflectionHessianRowVectorField_eq_self_of_mem_openCubeSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (R : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + cubeDirichletOddReflectionHessianRowVectorField Q i R x = R x := by + rw [cubeDirichletOddReflectionHessianRowVectorField, + cubeDirichletOddReflectionSign_eq_one_of_mem_openCubeSet Q hx, + cubeCoordinateFoldSign_eq_one_of_mem_openCubeSet Q hx i, + cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet Q R hx] + norm_num + +private theorem norm_cubeCoordinateFoldSign {d : ℕ} + (Q : TriadicCube d) (x : Vec d) (i : Fin d) : + ‖cubeCoordinateFoldSign Q x i‖ = 1 := by + apply (sq_eq_sq₀ (norm_nonneg _) zero_le_one).mp + rw [Real.norm_eq_abs, sq_abs, one_pow, pow_two, + cubeCoordinateFoldSign_mul_self] + +private theorem eLpNorm_foldSign_smul {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (i : Fin d) (f : Vec d → E) + (p : ℝ≥0∞) (μ : MeasureTheory.Measure (Vec d)) : + MeasureTheory.eLpNorm (fun x => cubeCoordinateFoldSign Q x i • f x) p μ = + MeasureTheory.eLpNorm f p μ := by + have hsign : MeasureTheory.AEStronglyMeasurable + (fun x => cubeCoordinateFoldSign Q x i) μ := by + apply Measurable.aestronglyMeasurable + unfold cubeCoordinateFoldSign + exact Measurable.ite + (measurableSet_lt (measurable_pi_apply i) measurable_const) measurable_const + (Measurable.ite + (measurableSet_lt (measurable_pi_apply i) measurable_const) + measurable_const measurable_const) + have hback : MeasureTheory.AEStronglyMeasurable + (fun x => cubeCoordinateFoldSign Q x i • f x) μ → + MeasureTheory.AEStronglyMeasurable f μ := by + intro h + apply (hsign.smul h).congr + exact MeasureTheory.ae_of_all _ fun x => by + change cubeCoordinateFoldSign Q x i • + (cubeCoordinateFoldSign Q x i • f x) = f x + rw [smul_smul, cubeCoordinateFoldSign_mul_self, one_smul] + by_cases hf : MeasureTheory.AEStronglyMeasurable f μ + · apply MeasureTheory.eLpNorm_congr_norm_ae (hsign.smul hf) hf + exact MeasureTheory.ae_of_all _ fun x => by + change ‖cubeCoordinateFoldSign Q x i • f x‖ = ‖f x‖ + rw [norm_smul, norm_cubeCoordinateFoldSign, one_mul] + · rw [MeasureTheory.eLpNorm_of_not_aestronglyMeasurable hf, + MeasureTheory.eLpNorm_of_not_aestronglyMeasurable (fun h => hf (hback h))] + +private theorem eLpNorm_gradientCoordScalar_eq_odd {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (v : Vec d → ℝ) + (p : ℝ≥0∞) (μ : MeasureTheory.Measure (Vec d)) : + MeasureTheory.eLpNorm (cubeDirichletOddReflectionGradientCoordScalar Q i v) p μ = + MeasureTheory.eLpNorm (cubeDirichletOddReflectionScalar Q v) p μ := by + have heq : cubeDirichletOddReflectionGradientCoordScalar Q i v = + fun x => cubeCoordinateFoldSign Q x i • cubeDirichletOddReflectionScalar Q v x := by + funext x + simp only [cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionScalar, smul_eq_mul] + ring + rw [heq] + exact eLpNorm_foldSign_smul Q i _ p μ + +private theorem eLpNorm_hessianRowVectorField_eq_odd {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (R : Vec d → Vec d) + (p : ℝ≥0∞) (μ : MeasureTheory.Measure (Vec d)) : + MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) + p μ = MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q R x)) p μ := by + have heq : (fun x => HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) = + fun x => cubeCoordinateFoldSign Q x i • + HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q R x) := by + funext x + ext j + simp only [cubeDirichletOddReflectionHessianRowVectorField_apply, + cubeDirichletOddReflectionVectorField, cubeCoordinateFoldReflectedVectorField, + Pi.smul_apply, smul_eq_mul, HilbertVec.ofVec, PiLp.smul_apply, PiLp.toLp_apply] + ring + rw [heq] + exact eLpNorm_foldSign_smul Q i _ p μ + +/-- The mixed scalar has the same pointwise norm as the all-odd scalar +reflection. -/ +theorem norm_cubeDirichletOddReflectionGradientCoordScalar_eq_oddReflection + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (v : Vec d → ℝ) (x : Vec d) : + ‖cubeDirichletOddReflectionGradientCoordScalar Q i v x‖ = + ‖cubeDirichletOddReflectionScalar Q v x‖ := by + have heq : cubeDirichletOddReflectionGradientCoordScalar Q i v x = + cubeCoordinateFoldSign Q x i * + cubeDirichletOddReflectionScalar Q v x := by + simp only [cubeDirichletOddReflectionGradientCoordScalar, + cubeDirichletOddReflectionScalar] + ring + rw [heq, norm_mul, norm_cubeCoordinateFoldSign, one_mul] + +/-- The mixed Hessian row has the same pointwise Euclidean norm as the all-odd +vector reflection. -/ +theorem norm_hilbertVec_cubeDirichletOddReflectionHessianRowVectorField_eq_oddReflection + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (R : Vec d → Vec d) (x : Vec d) : + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)‖ = + ‖HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q R x)‖ := by + have heq : + cubeDirichletOddReflectionHessianRowVectorField Q i R x = + cubeCoordinateFoldSign Q x i • + cubeDirichletOddReflectionVectorField Q R x := by + ext j + simp only [cubeDirichletOddReflectionHessianRowVectorField_apply, + cubeDirichletOddReflectionVectorField, Pi.smul_apply, smul_eq_mul, + cubeCoordinateFoldReflectedVectorField] + ring + rw [heq] + change ‖cubeCoordinateFoldSign Q x i • + HilbertVec.ofVec (cubeDirichletOddReflectionVectorField Q R x)‖ = _ + rw [norm_smul, norm_cubeCoordinateFoldSign, one_mul] + +/-- The mixed scalar has the norm of the pulled-back scalar on each cell. -/ +theorem norm_cubeDirichletOddReflectionGradientCoordCellScalar + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (v : Vec d → ℝ) (x : Vec d) : + ‖cubeDirichletOddReflectionGradientCoordCellScalar Q choice i v x‖ = + ‖v (cubeFaceReflectionCellFoldMap Q choice x)‖ := by + rw [cubeDirichletOddReflectionGradientCoordCellScalar, norm_mul, + norm_cubeDirichletOddReflectionMixedCellSign, one_mul] + +/-- The mixed Hessian-row cell formula is a Euclidean isometry. -/ +theorem norm_hilbertVec_cubeDirichletOddReflectionHessianRowCellVectorField + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (R : Vec d → Vec d) (x : Vec d) : + ‖HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowCellVectorField Q choice i R x)‖ = + ‖HilbertVec.ofVec (R (cubeFaceReflectionCellFoldMap Q choice x))‖ := by + let r := R (cubeFaceReflectionCellFoldMap Q choice x) + change ‖cubeDirichletOddReflectionMixedCellSign choice i • + HilbertVec.ofVec (cubeFaceReflectionCellFoldLinear choice r)‖ = + ‖HilbertVec.ofVec r‖ + rw [norm_smul, norm_cubeDirichletOddReflectionMixedCellSign, one_mul] + apply (sq_eq_sq₀ (norm_nonneg _) (norm_nonneg _)).mp + rw [HilbertVec.norm_sq_ofVec, HilbertVec.norm_sq_ofVec] + calc + vecDot (cubeFaceReflectionCellFoldLinear choice r) + (cubeFaceReflectionCellFoldLinear choice r) = vecDot r r := by + rw [← vecDot_cubeFaceReflectionCellFoldLinear_left choice + (cubeFaceReflectionCellFoldLinear choice r) r, + cubeFaceReflectionCellFoldLinear_involutive] + +private theorem aestronglyMeasurable_gradientCoordScalar_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (v : Vec d → ℝ) + (hv : MeasureTheory.AEStronglyMeasurable v + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (cubeDirichletOddReflectionGradientCoordScalar Q i v) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hmp : MeasureTheory.MeasurePreserving + (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : MeasureTheory.AEStronglyMeasurable + (fun x ↦ v (cubeFaceReflectionCellFoldMap Q choice x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hvmap : MeasureTheory.AEStronglyMeasurable v + (MeasureTheory.Measure.map (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice)))) := by + rw [hmp.map_eq] + exact hv + simpa [Function.comp_def] using hvmap.comp_aemeasurable hmp.aemeasurable + have hcell := hcomp.const_mul + (cubeDirichletOddReflectionMixedCellSign choice i) + refine hcell.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + exact (cubeDirichletOddReflectionGradientCoordScalar_eq_cell_of_mem + Q choice i v hx).symm + +private theorem aestronglyMeasurable_hessianRow_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (i : Fin d) (R : Vec d → Vec d) + (hR : MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (R x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hmp : MeasureTheory.MeasurePreserving + (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (R (cubeFaceReflectionCellFoldMap Q choice x))) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hRmap : MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (R x)) + (MeasureTheory.Measure.map (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice)))) := by + rw [hmp.map_eq] + exact hR + simpa [Function.comp_def] using hRmap.comp_aemeasurable hmp.aemeasurable + have hvec : MeasureTheory.AEStronglyMeasurable + (fun x ↦ R (cubeFaceReflectionCellFoldMap Q choice x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + simpa using + (HilbertVec.continuousLinearEquivVec d).continuous.comp_aestronglyMeasurable hcomp + have hlinear := + (cubeFaceReflectionCellFoldLinear choice).continuous.comp_aestronglyMeasurable hvec + have hcell : MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowCellVectorField Q choice i R x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + simpa only [cubeDirichletOddReflectionHessianRowCellVectorField] using! + (HilbertVec.ofVecL d).continuous.comp_aestronglyMeasurable + (hlinear.const_smul + (cubeDirichletOddReflectionMixedCellSign choice i)) + refine hcell.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + exact congrArg HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField_eq_cell_of_mem + Q choice i R hx).symm + +private theorem aestronglyMeasurable_gradientCoordScalar_block + {d : ℕ} {v : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hv : MeasureTheory.AEStronglyMeasurable v + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (cubeDirichletOddReflectionGradientCoordScalar Q i v) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + classical + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice ↦ + aestronglyMeasurable_gradientCoordScalar_cell Q choice i v hv + +private theorem aestronglyMeasurable_hessianRow_block + {d : ℕ} {R : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hR : MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec (R x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + classical + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice ↦ + aestronglyMeasurable_hessianRow_cell Q choice i R hR + +private theorem normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet + {d : ℕ} (m : ℤ) : + normalizedCubeMeasure (originCube d m) = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + +private theorem restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure + {d : ℕ} (m : ℤ) : + MeasureTheory.volume.restrict (openCubeSet (originCube d m)) = + ENNReal.ofReal (cubeVolume (originCube d m)) • + normalizedCubeMeasure (originCube d m) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos _)] + rw [smul_smul] + have hnonzero : ENNReal.ofReal (cubeVolume (originCube d m)) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos _) + have hone : ENNReal.ofReal (cubeVolume (originCube d m)) * + (ENNReal.ofReal (cubeVolume (originCube d m)))⁻¹ = 1 := by + simpa [mul_comm] using + ENNReal.inv_mul_cancel hnonzero ENNReal.ofReal_ne_top + rw [hone, one_smul] + +/-! ## Scalar-coordinate finite-`p` transport -/ + +/-- Exact finite-`p` norm transport for a mixed scalar on the full reflection +block. -/ +theorem eLpNorm_cubeFaceReflectionBlockSet_gradientCoordScalar + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (v : Vec d → ℝ) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (cubeDirichletOddReflectionGradientCoordScalar Q i v) p.exponent + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm v p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + rw [eLpNorm_gradientCoordScalar_eq_odd Q i v p.exponent _] + exact eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar Q v p + +/-- `MemLp` transport for a mixed scalar on the full reflection block. -/ +theorem memLp_cubeFaceReflectionBlockSet_gradientCoordScalar + {d : ℕ} {v : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (p : FiniteLpExponent) + (hv : MeasureTheory.MemLp v p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.MemLp + (cubeDirichletOddReflectionGradientCoordScalar Q i v) p.exponent + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + have hodd := + memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar Q p hv + exact hodd.congr_norm + (aestronglyMeasurable_gradientCoordScalar_block Q i hv.aestronglyMeasurable) + (MeasureTheory.ae_of_all _ fun x ↦ + (norm_cubeDirichletOddReflectionGradientCoordScalar_eq_oddReflection + Q i v x).symm) + +/-- Exact unnormalized mixed-scalar norm transport from an origin cube to its +centered parent. -/ +theorem eLpNorm_openCubeSet_succ_originCube_gradientCoordScalar + {d : ℕ} {m : ℤ} (i : Fin d) (v : Vec d → ℝ) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (cubeDirichletOddReflectionGradientCoordScalar (originCube d m) i v) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm v p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [eLpNorm_gradientCoordScalar_eq_odd (originCube d m) i v p.exponent _] + exact + eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar v p + +/-- `MemLp` transport for a mixed scalar from an origin cube to its centered +parent. -/ +theorem memLp_openCubeSet_succ_originCube_gradientCoordScalar + {d : ℕ} {m : ℤ} {v : Vec d → ℝ} (i : Fin d) + (p : FiniteLpExponent) + (hv : MeasureTheory.MemLp v p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m)))) : + MeasureTheory.MemLp + (cubeDirichletOddReflectionGradientCoordScalar (originCube d m) i v) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) := by + have hblock := memLp_cubeFaceReflectionBlockSet_gradientCoordScalar + (originCube d m) i p hv + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact hblock + +/-- Normalized mixed-scalar finite-`p` norms are exactly preserved from an +origin cube to its centered parent. -/ +theorem eLpNorm_normalizedCubeMeasure_succ_originCube_gradientCoordScalar + {d : ℕ} {m : ℤ} (i : Fin d) (v : Vec d → ℝ) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (cubeDirichletOddReflectionGradientCoordScalar (originCube d m) i v) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + MeasureTheory.eLpNorm v p.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [eLpNorm_gradientCoordScalar_eq_odd (originCube d m) i v p.exponent _] + exact + eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar + v p + +/-- Normalized `MemLp` is preserved by the mixed-scalar origin-cube +reflection. -/ +theorem memLp_normalizedCubeMeasure_succ_originCube_gradientCoordScalar + {d : ℕ} {m : ℤ} {v : Vec d → ℝ} (i : Fin d) + (p : FiniteLpExponent) + (hv : MeasureTheory.MemLp v p.exponent + (normalizedCubeMeasure (originCube d m))) : + MeasureTheory.MemLp + (cubeDirichletOddReflectionGradientCoordScalar (originCube d m) i v) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + have hvOpen : MeasureTheory.MemLp v p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure] + exact hv.smul_measure ENNReal.ofReal_ne_top + have hreflect := + memLp_openCubeSet_succ_originCube_gradientCoordScalar i p hvOpen + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + exact hreflect.smul_measure ENNReal.ofReal_ne_top + +/-! ## Hessian-row finite-`p` transport -/ + +/-- Exact Euclidean finite-`p` norm transport for a mixed Hessian row on the +full reflection block. -/ +theorem eLpNorm_cubeFaceReflectionBlockSet_hessianRowVectorField + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (R : Vec d → Vec d) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) + p.exponent (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + rw [eLpNorm_hessianRowVectorField_eq_odd Q i R p.exponent _] + exact eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + Q R p + +/-- Euclidean `MemLp` transport for a mixed Hessian row on the full reflection +block. -/ +theorem memLp_cubeFaceReflectionBlockSet_hessianRowVectorField + {d : ℕ} {R : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (p : FiniteLpExponent) + (hR : MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField Q i R x)) + p.exponent + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + have hodd := + memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField Q p hR + exact hodd.congr_norm + (aestronglyMeasurable_hessianRow_block Q i hR.aestronglyMeasurable) + (MeasureTheory.ae_of_all _ fun x ↦ + (norm_hilbertVec_cubeDirichletOddReflectionHessianRowVectorField_eq_oddReflection + Q i R x).symm) + +/-- Exact unnormalized Euclidean norm transport for a mixed Hessian row from +an origin cube to its centered parent. -/ +theorem eLpNorm_openCubeSet_succ_originCube_hessianRowVectorField + {d : ℕ} {m : ℤ} (i : Fin d) (R : Vec d → Vec d) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [eLpNorm_hessianRowVectorField_eq_odd (originCube d m) i R p.exponent _] + exact + eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField R p + +/-- Euclidean `MemLp` transport for a mixed Hessian row from an origin cube to +its centered parent. -/ +theorem memLp_openCubeSet_succ_originCube_hessianRowVectorField + {d : ℕ} {m : ℤ} {R : Vec d → Vec d} (i : Fin d) + (p : FiniteLpExponent) + (hR : MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m)))) : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) := by + have hblock := memLp_cubeFaceReflectionBlockSet_hessianRowVectorField + (originCube d m) i p hR + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact hblock + +/-- Normalized Euclidean finite-`p` Hessian-row norms are exactly preserved +from an origin cube to its centered parent. -/ +theorem eLpNorm_normalizedCubeMeasure_succ_originCube_hessianRowVectorField + {d : ℕ} {m : ℤ} (i : Fin d) (R : Vec d → Vec d) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + MeasureTheory.eLpNorm (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [eLpNorm_hessianRowVectorField_eq_odd (originCube d m) i R p.exponent _] + exact + eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionVectorField + R p + +/-- Normalized Euclidean `MemLp` is preserved by the mixed Hessian-row +origin-cube reflection. -/ +theorem memLp_normalizedCubeMeasure_succ_originCube_hessianRowVectorField + {d : ℕ} {m : ℤ} {R : Vec d → Vec d} (i : Fin d) + (p : FiniteLpExponent) + (hR : MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (R x)) p.exponent + (normalizedCubeMeasure (originCube d m))) : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec + (cubeDirichletOddReflectionHessianRowVectorField + (originCube d m) i R x)) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + have hROpen : MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (R x)) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure] + exact hR.smul_measure ENNReal.ofReal_ne_top + have hreflect := + memLp_openCubeSet_succ_originCube_hessianRowVectorField i p hROpen + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + exact hreflect.smul_measure ENNReal.ofReal_ne_top + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionL2.lean new file mode 100644 index 0000000000..03382f00ad --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionL2.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.OddReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry + +/-! # Reflection L2 -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# `L²` control for odd reflected Dirichlet forcing + +Odd reflection has the same squared magnitude as the unsigned coordinate-fold +reflection already used in the Neumann/CZ layer. This file records the +scalar forcing consequences of that observation. +-/ + +/-- The all-coordinate odd reflected scalar is `L²` on the reflection block +whenever the original scalar is `L²` on the cube. -/ +theorem memScalarL2_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 (cubeFaceReflectionBlockSet Q) + (cubeDirichletOddReflectionScalar Q F) := by + classical + let cell : (Fin d → Fin 3) → Set (Vec d) := fun choice => + openCubeSet (cubeFaceReflectionCellCube Q choice) + have hcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.MemLp (cubeDirichletOddReflectionScalar Q F) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cell choice)) := by + intro choice + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : + MeasureTheory.MemLp + (fun x => F (cubeFaceReflectionCellFoldMap Q choice x)) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + have hcomp' := hF.comp_measurePreserving hmp + simpa [MemScalarL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell] using hcomp' + have hsign : + MeasureTheory.MemLp + (fun x => + cubeDirichletOddReflectionCellSign choice * + F (cubeFaceReflectionCellFoldMap Q choice x)) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := + hcomp.const_mul (cubeDirichletOddReflectionCellSign choice) + exact MeasureTheory.MemLp.ae_eq (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] + with x hx + simpa [cubeDirichletOddReflectionCellScalar] using + (cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + Q choice F hx).symm) hsign + have hae : + MeasureTheory.AEStronglyMeasurable + (cubeDirichletOddReflectionScalar Q F) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => by + simpa [cell] using (hcell choice).aestronglyMeasurable + have hint : + MeasureTheory.Integrable + (fun x => ‖cubeDirichletOddReflectionScalar Q F x‖ ^ (2 : ℕ)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.integrableOn_finite_iUnion.2 fun choice => by + have hsq := + (MeasureTheory.memLp_two_iff_integrable_sq_norm + (hcell choice).aestronglyMeasurable).1 (hcell choice) + simpa [MeasureTheory.IntegrableOn, cell] using hsq + simpa [MemScalarL2, volumeMeasureOn] using + (MeasureTheory.memLp_two_iff_integrable_sq_norm hae).2 hint + +/-- The squared `L²` energy of the odd reflected scalar on the full reflection +block is one copy of the original cube energy for each reflection cell. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_sq_of_memScalarL2 + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeDirichletOddReflectionScalar Q F x * + cubeDirichletOddReflectionScalar Q F x + ∂MeasureTheory.volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + calc + ∫ x in cubeFaceReflectionBlockSet Q, + cubeDirichletOddReflectionScalar Q F x * + cubeDirichletOddReflectionScalar Q F x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_cubeFaceReflectionBlockSet Q) ?_ + intro x _hx + exact cubeDirichletOddReflectionScalar_mul_self Q F x + _ = (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2 + Q hF + +/-- The squared `L²` energy of the odd reflected scalar on the full reflection +block, with the cell count normalized to `(3 : ℝ)^d`. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeDirichletOddReflectionScalar Q F x * + cubeDirichletOddReflectionScalar Q F x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + rw [setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_sq_of_memScalarL2 + Q hF, + real_card_cubeFaceReflectionChoices] + +/-- The odd reflected scalar forcing is `L²` on the centered parent cube. -/ +theorem memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionScalar (originCube d m) F) := by + have hblock := + memScalarL2_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + (originCube d m) hF + have hmeasure : + volumeMeasureOn (openCubeSet (originCube d (m + 1))) = + volumeMeasureOn (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + simpa [MemScalarL2, hmeasure] using hblock + +/-- The all-coordinate odd reflected vector field is `L²` on the full +reflection block whenever the original vector field is `L²` on the cube. -/ +theorem memVectorL2_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 (cubeFaceReflectionBlockSet Q) + (cubeDirichletOddReflectionVectorField Q G) := by + classical + let cell : (Fin d → Fin 3) → Set (Vec d) := fun choice => + openCubeSet (cubeFaceReflectionCellCube Q choice) + have hcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.MemLp (cubeDirichletOddReflectionVectorField Q G) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cell choice)) := by + intro choice + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : + MeasureTheory.MemLp + (fun x => G (cubeFaceReflectionCellFoldMap Q choice x)) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + have hcomp' := hG.comp_measurePreserving hmp + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell] using hcomp' + have hfold : + MeasureTheory.MemLp + (fun x => + cubeDirichletOddReflectionCellSign choice • + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + have hlinear : + MeasureTheory.MemLp + (fun x => + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + simpa [Function.comp_def] using + (cubeFaceReflectionCellFoldLinear choice).comp_memLp' hcomp + simpa [smul_eq_mul] using! + hlinear.const_smul (cubeDirichletOddReflectionCellSign choice) + exact MeasureTheory.MemLp.ae_eq (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] + with x hx + simpa [cubeDirichletOddReflectionCellVectorField] using + (cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx).symm) hfold + have hae : + MeasureTheory.AEStronglyMeasurable + (cubeDirichletOddReflectionVectorField Q G) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => by + simpa [cell] using (hcell choice).aestronglyMeasurable + have hint : + MeasureTheory.Integrable + (fun x => ‖cubeDirichletOddReflectionVectorField Q G x‖ ^ (2 : ℕ)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.integrableOn_finite_iUnion.2 fun choice => by + have hsq := + (MeasureTheory.memLp_two_iff_integrable_sq_norm + (hcell choice).aestronglyMeasurable).1 (hcell choice) + simpa [MeasureTheory.IntegrableOn, cell] using hsq + simpa [MemVectorL2, volumeMeasureOn] using + (MeasureTheory.memLp_two_iff_integrable_sq_norm hae).2 hint + +/-- The odd reflected vector field is `L²` on the centered parent cube. -/ +theorem memVectorL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionVectorField (originCube d m) G) := by + have hblock := + memVectorL2_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField + (originCube d m) hG + have hmeasure : + volumeMeasureOn (openCubeSet (originCube d (m + 1))) = + volumeMeasureOn (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + simpa [MemVectorL2, hmeasure] using hblock + +/-- Scalar odd-reflected energy on the centered parent cube is `3^d` copies +of the original cube energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) : + ∫ x in openCubeSet (originCube d (m + 1)), + cubeDirichletOddReflectionScalar (originCube d m) F x * + cubeDirichletOddReflectionScalar (originCube d m) F x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), F y * F y + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeDirichletOddReflectionScalar (originCube d m) F x * + cubeDirichletOddReflectionScalar (originCube d m) F x)] + exact + setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_sq_of_memScalarL2_three_pow + (originCube d m) hF + +/-- Vector odd-reflected energy on the centered parent cube is `3^d` copies +of the original cube energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_self_pairing_of_memVectorL2_three_pow + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), vecDot (G y) (G y) + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + (cubeDirichletOddReflectionVectorField (originCube d m) G x))] + calc + ∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + (cubeDirichletOddReflectionVectorField (originCube d m) G x) + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_cubeFaceReflectionBlockSet (originCube d m)) ?_ + intro x _hx + exact cubeDirichletOddReflectionVectorField_self_pairing (originCube d m) G x + _ = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), vecDot (G y) (G y) + ∂MeasureTheory.volume := by + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + (originCube d m) hG + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionParentH1Graph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionParentH1Graph.lean new file mode 100644 index 0000000000..8b3eecda56 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionParentH1Graph.lean @@ -0,0 +1,776 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit + +/-! # Reflection Parent H1Graph -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Manifold + +noncomputable section + +/-! +# Parent `H¹` realization for the Dirichlet odd reflection + +This file turns the pointwise odd reflection on the centered parent cube into +an honest `H1Function`. The proof uses the closed `H¹` graph: after folding +parent tests back to the original cube, the zero-trace approximation package +of `H10Function` supplies the needed integration-by-parts identity. +-/ + +private theorem memScalarL2_of_contDiff_hasCompactSupport {d : ℕ} + (U : Set (Vec d)) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict U + +private theorem memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + {d : ℕ} (U : Set (Vec d)) (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U (euclideanCoordDeriv i ψ) := by + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hψ i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hψ_compact i)).restrict U + +private theorem hasCompactSupport_finset_sum + {α β ι : Type*} [TopologicalSpace α] [AddCommMonoid β] [DecidableEq ι] + (s : Finset ι) (f : ι → α → β) + (hf : ∀ i ∈ s, HasCompactSupport (f i)) : + HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + classical + revert hf + refine Finset.induction_on s ?zero ?insert + · intro _hf + simpa using! (HasCompactSupport.zero : HasCompactSupport (fun _ : α => (0 : β))) + · intro a s has hs hf + have ha : HasCompactSupport (f a) := hf a (by simp [has]) + have hs' : HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + exact hs (fun i hi => hf i (Finset.mem_insert_of_mem hi)) + simpa [Finset.sum_insert has] using! ha.add hs' + +namespace H10Function + +/-- A zero-trace `H¹` function may be integrated by parts against any smooth +compactly supported ambient test, without requiring the test support to lie +inside the domain. -/ +theorem integral_mul_deriv_eq_neg_integral_mul_of_contDiff_hasCompactSupport + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (i : Fin d) + {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + ∫ x in U, u.toH1Function.toFun x * euclideanCoordDeriv i ψ x + ∂MeasureTheory.volume = + -∫ x in U, u.toH1Function.grad x i * ψ x + ∂MeasureTheory.volume := by + let Dψ : Vec d → ℝ := euclideanCoordDeriv i ψ + let Dapprox : ℕ → Vec d → ℝ := fun n x => + euclideanCoordDeriv i (u.approx n) x + have hψL2 : MemScalarL2 U ψ := + memScalarL2_of_contDiff_hasCompactSupport U hψ hψ_compact + have hDψL2 : MemScalarL2 U Dψ := + memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + U i hψ hψ_compact + have happroxL2 : ∀ n, MemScalarL2 U (u.approx n) := by + intro n + exact memScalarL2_of_contDiff_hasCompactSupport + U (u.approx_smooth n) (u.approx_hasCompactSupport n) + have hDapproxL2 : ∀ n, MemScalarL2 U (Dapprox n) := by + intro n + exact memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + U i (u.approx_smooth n) (u.approx_hasCompactSupport n) + have happrox_to_u : + Filter.Tendsto (fun n => toScalarL2 (happroxL2 n)) + Filter.atTop (nhds (toScalarL2 u.toH1Function.memL2)) := + tendsto_toScalarL2_of_tendsto_eLpNorm + (F := fun n => u.approx n) (G := u.toH1Function.toFun) + happroxL2 u.toH1Function.memL2 u.tendsto_approx + have hDapprox_to_grad : + Filter.Tendsto (fun n => toScalarL2 (hDapproxL2 n)) + Filter.atTop (nhds (toScalarL2 (u.toH1Function.gradMemL2 i))) := by + refine tendsto_toScalarL2_of_tendsto_eLpNorm + (F := Dapprox) (G := fun x => u.toH1Function.grad x i) + hDapproxL2 (u.toH1Function.gradMemL2 i) ?_ + simpa [Dapprox, euclideanCoordDeriv] using u.tendsto_approx_grad i + have hleft : + Filter.Tendsto + (fun n => ∫ x in U, Dψ x * u.approx n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, Dψ x * u.toH1Function.toFun x ∂MeasureTheory.volume)) := + tendsto_integral_mul_of_tendsto_toScalarL2 + hDψL2 happroxL2 u.toH1Function.memL2 happrox_to_u + have hright : + Filter.Tendsto + (fun n => -∫ x in U, ψ x * Dapprox n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (-∫ x in U, ψ x * u.toH1Function.grad x i + ∂MeasureTheory.volume)) := by + exact + (tendsto_integral_mul_of_tendsto_toScalarL2 + hψL2 hDapproxL2 (u.toH1Function.gradMemL2 i) + hDapprox_to_grad).neg + have hseq : + (fun n => ∫ x in U, Dψ x * u.approx n x ∂MeasureTheory.volume) = + fun n => -∫ x in U, ψ x * Dapprox n x ∂MeasureTheory.volume := by + funext n + have hleft_zero : + ∀ x, x ∉ U → u.approx n x * Dψ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport (u.approx n) := + fun hx' => hx (u.approx_support_subset n hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + have hright_zero : + ∀ x, x ∉ U → Dapprox n x * ψ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport (u.approx n) := + fun hx' => hx (u.approx_support_subset n hx') + have hzero_eventually : u.approx n =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := u.approx n)).isOpen_compl.eventually_mem + hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [show Dapprox n x = 0 by + simp [Dapprox, euclideanCoordDeriv, + Filter.EventuallyEq.fderiv_eq hzero_eventually]] + ring + have hweakApprox : + ∫ x in Set.univ, u.approx n x * Dψ x ∂MeasureTheory.volume = + -∫ x in Set.univ, Dapprox n x * ψ x ∂MeasureTheory.volume := by + have hweak : + HasWeakPartialDerivOn Set.univ i (u.approx n) (Dapprox n) := by + simpa [Dapprox, euclideanCoordDeriv] using + HasWeakPartialDerivOn.of_contDiff + (U := Set.univ) (i := i) + ((u.approx_smooth n).of_le (by simp)) + simpa [Dψ, Dapprox, euclideanCoordDeriv] using + hweak ψ hψ hψ_compact (by simp) + calc + ∫ x in U, Dψ x * u.approx n x ∂MeasureTheory.volume = + ∫ x in U, u.approx n x * Dψ x ∂MeasureTheory.volume := by + congr 1 + funext x + ring + _ = ∫ x in Set.univ, u.approx n x * Dψ x ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hleft_zero] + simp + _ = -∫ x in Set.univ, Dapprox n x * ψ x ∂MeasureTheory.volume := + hweakApprox + _ = -∫ x in U, Dapprox n x * ψ x ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hright_zero] + simp + _ = -∫ x in U, ψ x * Dapprox n x ∂MeasureTheory.volume := by + congr 1 + exact MeasureTheory.integral_congr_ae + (Filter.Eventually.of_forall fun x => by ring) + have hlimit : + ∫ x in U, Dψ x * u.toH1Function.toFun x ∂MeasureTheory.volume = + -∫ x in U, ψ x * u.toH1Function.grad x i + ∂MeasureTheory.volume := + tendsto_nhds_unique (hleft.congr' (Filter.EventuallyEq.of_eq hseq)) hright + calc + ∫ x in U, u.toH1Function.toFun x * euclideanCoordDeriv i ψ x + ∂MeasureTheory.volume = + ∫ x in U, Dψ x * u.toH1Function.toFun x ∂MeasureTheory.volume := by + congr 1 + funext x + simp [Dψ] + ring + _ = -∫ x in U, ψ x * u.toH1Function.grad x i + ∂MeasureTheory.volume := hlimit + _ = -∫ x in U, u.toH1Function.grad x i * ψ x + ∂MeasureTheory.volume := by + congr 1 + exact MeasureTheory.integral_congr_ae + (Filter.Eventually.of_forall fun x => by ring) + +end H10Function + +/-- Fold a parent scalar test back to the original cube with the sign needed +for the `i`th weak-gradient graph constraint of the Dirichlet odd reflection. + +The coefficient is the product of the odd-reflection cell sign and the +coordinate fold sign. -/ +def cubeDirichletOddReflectionFoldedParentCoordTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) : Vec d → ℝ := + fun y => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y) + +/-- The signed coordinate-folded graph test is smooth when the parent test is +smooth. -/ +theorem contDiff_cubeDirichletOddReflectionFoldedParentCoordTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ContDiff ℝ (⊤ : ℕ∞) + (cubeDirichletOddReflectionFoldedParentCoordTest Q i φ) := by + classical + unfold cubeDirichletOddReflectionFoldedParentCoordTest + exact + ContDiff.sum fun choice _ => + contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ) + +/-- The signed coordinate-folded graph test has compact support when the +parent test has compact support. -/ +theorem hasCompactSupport_cubeDirichletOddReflectionFoldedParentCoordTest + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : HasCompactSupport φ) : + HasCompactSupport + (cubeDirichletOddReflectionFoldedParentCoordTest Q i φ) := by + classical + unfold cubeDirichletOddReflectionFoldedParentCoordTest + simpa using + hasCompactSupport_finset_sum (Finset.univ : Finset (Fin d → Fin 3)) + (fun choice y => + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + (by + intro choice _hchoice + exact + (hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ).mul_left) + +/-- Coordinate derivative of the signed coordinate-folded graph test. The +coordinate fold sign squares away, leaving only the odd-reflection cell sign. -/ +theorem euclideanCoordDeriv_cubeDirichletOddReflectionFoldedParentCoordTest + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + euclideanCoordDeriv i + (cubeDirichletOddReflectionFoldedParentCoordTest Q i φ) x = + ∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice x) := by + classical + unfold cubeDirichletOddReflectionFoldedParentCoordTest euclideanCoordDeriv + rw [fderiv_fun_sum] + · simp only [_root_.sum_apply] + apply Finset.sum_congr rfl + intro choice _hchoice + have hdiff : + DifferentiableAt ℝ + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x := + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ).differentiable + (by simp) x + rw [fderiv_const_mul hdiff] + change + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x = + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice x) + rw [euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap hφ Q choice i x] + let s : ℝ := cubeDirichletOddReflectionCellSign choice + let σ : ℝ := cubeFaceReflectionCellFoldSign choice i + let a : ℝ := + euclideanCoordDeriv i φ (cubeFaceReflectionCellFoldMap Q choice x) + change (s * σ) * (σ * a) = s * a + calc + (s * σ) * (σ * a) = s * ((σ * σ) * a) := by ring + _ = s * (1 * a) := by + rw [show σ * σ = 1 by + simp [σ]] + _ = s * a := by ring + · intro choice _hchoice + exact + (contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ)).differentiable + (by simp) x + +namespace H10Function + +/-- The zero-trace weak-gradient identity tested against the signed +coordinate-folded graph test, with the derivative expanded cellwise. -/ +theorem integral_mul_cubeDirichletOddReflectionFoldedParentCoordTest_derivSum_eq_neg_integral_mul_originCube + {d : ℕ} {m : ℤ} + (u : H10Function (openCubeSet (originCube d m))) (i : Fin d) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + ∫ y in openCubeSet (originCube d m), + u.toH1Function.toFun y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume = + -∫ y in openCubeSet (originCube d m), + u.toH1Function.grad y i * + cubeDirichletOddReflectionFoldedParentCoordTest + (originCube d m) i φ y + ∂MeasureTheory.volume := by + have hbase := + u.integral_mul_deriv_eq_neg_integral_mul_of_contDiff_hasCompactSupport + i + (contDiff_cubeDirichletOddReflectionFoldedParentCoordTest + (originCube d m) i hφ) + (hasCompactSupport_cubeDirichletOddReflectionFoldedParentCoordTest + (originCube d m) i hφ_compact) + convert hbase using 1 + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d m)) ?_ + intro y _hy + change u.toH1Function.toFun y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) = + u.toH1Function.toFun y * + euclideanCoordDeriv i + (cubeDirichletOddReflectionFoldedParentCoordTest + (originCube d m) i φ) y + rw [euclideanCoordDeriv_cubeDirichletOddReflectionFoldedParentCoordTest + (Q := originCube d m) (i := i) (φ := φ) hφ y] + +end H10Function + +/-- Centered parent-cube form of the odd reflected scalar derivative +pairing. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_mul_deriv_eq_folded + {d : ℕ} {m : ℤ} {F φ : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in openCubeSet (originCube d (m + 1)), + cubeDirichletOddReflectionScalar (originCube d m) F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeDirichletOddReflectionScalar (originCube d m) F x * + euclideanCoordDeriv i φ x)] + exact + setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_mul_eq_folded + (Q := originCube d m) (F := F) + hF (contDiff_euclideanCoordDeriv hφ i) + (hasCompactSupport_euclideanCoordDeriv hφ_compact i) + +private theorem memScalarL2_comp_cellFoldMap_of_contDiff_hasCompactSupport + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 (openCubeSet Q) + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + have hcomp_smooth : + ContDiff ℝ (⊤ : ℕ∞) + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + simpa using contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hψ + have hcomp_compact : + HasCompactSupport + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + simpa using hasCompactSupport_comp_cubeFaceReflectionCellFoldMap + Q choice hψ_compact + exact memScalarL2_of_contDiff_hasCompactSupport + (openCubeSet Q) hcomp_smooth hcomp_compact + +private theorem integrable_openCubeSet_cubeDirichletOddCellVectorCoordPairing + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} + (choice : Fin d → Fin 3) + (hG : MemVectorL2 (openCubeSet Q) G) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + MeasureTheory.Integrable + (fun y => + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hGi : MemScalarL2 (openCubeSet Q) (fun y => G y i) := + memScalarL2_coord_of_memVectorL2 hG i + have hφcomp : + MemScalarL2 (openCubeSet Q) + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) := + memScalarL2_comp_cellFoldMap_of_contDiff_hasCompactSupport + Q choice hφ hφ_compact + exact hGi.integrable_mul + (hφcomp.const_mul + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i)) + +/-- Change variables on one reflection cell in one coordinate of the +odd-reflected vector-field pairing. -/ +theorem setIntegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField_coord_mul_eq + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (choice : Fin d → Fin 3) (i : Fin d) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + let σ : ℝ := cubeFaceReflectionCellFoldSign choice i + let g : Vec d → ℝ := fun y => G y i * ((s * σ) * φ (T y)) + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + g (T x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + (cubeDirichletOddReflectionVectorField Q G x) i * φ x = + G (T x) i * ((s * σ) * φ (T (T x))) + rw [cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx] + change (s • L (G (T x))) i * φ x = + G (T x) i * ((s * σ) * φ (T (T x))) + by_cases h1 : choice i = 1 + · simp [L, σ, cubeFaceReflectionCellFoldSign, h1, T, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + · simp [L, σ, cubeFaceReflectionCellFoldSign, h1, T, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + _ = ∫ y in openCubeSet Q, + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + simpa [g, T, s, σ] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice g + +/-- The block pairing with one coordinate of the odd-reflected vector field is +the original-cube pairing against the signed coordinate-folded graph test. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField_coord_mul_eq_folded + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hG : MemVectorL2 (openCubeSet Q) G) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in cubeFaceReflectionBlockSet Q, + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + G y i * + cubeDirichletOddReflectionFoldedParentCoordTest Q i φ y + ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := fun x => + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + have hfCell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + let σ : ℝ := cubeFaceReflectionCellFoldSign choice i + let g : Vec d → ℝ := fun y => G y i * ((s * σ) * φ (T y)) + have hbase : + MeasureTheory.Integrable g + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [g, T, s, σ] using + integrable_openCubeSet_cubeDirichletOddCellVectorCoordPairing + (Q := Q) (G := G) choice hG hφ hφ_compact i + have hcomp : + MeasureTheory.Integrable (fun x => g (T x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := g) hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + change + G (T x) i * ((s * σ) * φ (T (T x))) = + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + rw [cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx] + change + G (T x) i * ((s * σ) * φ (T (T x))) = + (s • L (G (T x))) i * φ x + by_cases h1 : choice i = 1 + · simp [L, σ, cubeFaceReflectionCellFoldSign, h1, T, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + · simp [L, σ, cubeFaceReflectionCellFoldSign, h1, T, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + (cubeDirichletOddReflectionVectorField Q G x) i * φ x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfCell + _ = ∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionVectorField_coord_mul_eq + (Q := Q) (G := G) (φ := φ) choice i + _ = ∫ y in openCubeSet Q, + ∑ choice : Fin d → Fin 3, + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro choice _hchoice + exact + integrable_openCubeSet_cubeDirichletOddCellVectorCoordPairing + (Q := Q) (G := G) choice hG hφ hφ_compact i + _ = ∫ y in openCubeSet Q, + G y i * + cubeDirichletOddReflectionFoldedParentCoordTest Q i φ y + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + change + (∑ choice : Fin d → Fin 3, + G y i * + ((cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y))) = + G y i * + (∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + rw [Finset.mul_sum] + +/-- Centered parent-cube form of the reflected vector coordinate pairing. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_coord_mul_eq_folded + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in openCubeSet (originCube d (m + 1)), + (cubeDirichletOddReflectionVectorField (originCube d m) G x) i * + φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + G y i * + cubeDirichletOddReflectionFoldedParentCoordTest + (originCube d m) i φ y + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + (cubeDirichletOddReflectionVectorField (originCube d m) G x) i * φ x)] + exact + setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionVectorField_coord_mul_eq_folded + (Q := originCube d m) (G := G) (φ := φ) hG hφ hφ_compact i + +/-- The all-face odd reflection of an origin-cube zero-trace `H¹` function +defines a point of the closed parent-cube weak-gradient graph. -/ +theorem mem_h1GraphClosedSubmodule_cubeDirichletOddReflection_originCube + {d : ℕ} {m : ℤ} + (u : H10Function (openCubeSet (originCube d m))) + (hscalar : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun)) + (hvector : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y))) : + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) ∈ + h1GraphClosedSubmodule + (U := openCubeSet (originCube d (m + 1))) := by + rw [mem_h1GraphClosedSubmodule_iff] + intro i φ + let Q : TriadicCube d := originCube d m + let Uparent : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let fR : Vec d → ℝ := + cubeDirichletOddReflectionScalar Q u.toH1Function.toFun + let GR : Vec d → Vec d := + cubeDirichletOddReflectionVectorField Q + (fun y => u.toH1Function.grad y) + have hrawScalar : + ∫ x in Uparent, + (toScalarL2 hscalar) x * φ.deriv i x ∂MeasureTheory.volume = + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toScalarL2 hscalar] with x hx + rw [hx] + simp [H1WeakTestFunction.deriv, euclideanCoordDeriv, fR, Q] + have hrawVector : + ∫ x in Uparent, + (toHilbertVectorL2OfVecField hvector) x i * φ x + ∂MeasureTheory.volume = + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toHilbertVectorL2OfVecField hvector] with x hx + rw [hx] + simp [hilbertifyVecField, GR, Q] + have hscalarFold : + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u.toH1Function.toFun y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + simpa [Uparent, fR, Q] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar_mul_deriv_eq_folded + (m := m) (F := u.toH1Function.toFun) (φ := φ) + u.toH1Function.memL2 φ.smooth φ.compactSupport i + have hvectorFold : + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u.toH1Function.grad y i * + cubeDirichletOddReflectionFoldedParentCoordTest Q i φ y + ∂MeasureTheory.volume := by + have hG : MemVectorL2 (openCubeSet Q) + (fun y => u.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn, Q] using + u.toH1Function.grad_memVectorL2 + simpa [Uparent, GR, Q] using + setIntegral_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField_coord_mul_eq_folded + (m := m) (G := fun y => u.toH1Function.grad y) (φ := φ) + hG φ.smooth φ.compactSupport i + have hweak := + u.integral_mul_cubeDirichletOddReflectionFoldedParentCoordTest_derivSum_eq_neg_integral_mul_originCube + i φ.smooth φ.compactSupport + calc + h1WeakConstraintCLM + (U := openCubeSet (originCube d (m + 1))) i φ + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) + = + ∫ x in Uparent, + (toScalarL2 hscalar) x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in Uparent, + (toHilbertVectorL2OfVecField hvector) x i * φ x + ∂MeasureTheory.volume := by + simpa [Uparent] using + h1WeakConstraintCLM_apply_eq_integral + (U := openCubeSet (originCube d (m + 1))) i φ + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) + _ = + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume + + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume := by + rw [hrawScalar, hrawVector] + _ = + ∫ y in openCubeSet Q, + u.toH1Function.toFun y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume + + ∫ y in openCubeSet Q, + u.toH1Function.grad y i * + cubeDirichletOddReflectionFoldedParentCoordTest Q i φ y + ∂MeasureTheory.volume := by + rw [hscalarFold, hvectorFold] + _ = 0 := by + rw [hweak] + ring + +/-- Choose the parent `H¹` function whose exact representatives are the +all-face Dirichlet odd reflection and its reflected gradient. -/ +theorem exists_h1Function_cubeDirichletOddReflectionParent_originCube + {d : ℕ} {m : ℤ} + (u : H10Function (openCubeSet (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) := by + have hscalar : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun) := + memScalarL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + (m := m) u.toH1Function.memL2 + have hG : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => u.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + u.toH1Function.grad_memVectorL2 + have hvector : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) := + memVectorL2_openCubeSet_succ_originCube_cubeDirichletOddReflectionVectorField + (m := m) hG + have hz := + mem_h1GraphClosedSubmodule_cubeDirichletOddReflection_originCube + u hscalar hvector + exact + exists_h1Function_of_toScalarL2_toHilbertVectorL2OfVecField_mem_h1GraphClosedSubmodule + (U := openCubeSet (originCube d (m + 1))) + hscalar hvector hz + +namespace CubeDirichletWeakPoissonProblem + +/-- The odd-reflected parent weak equation with the parent `H¹` realization +chosen by the closed graph construction. -/ +theorem exists_cubeDirichletOddReflectionParent_weakPoissonEquationOn_originCube + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) := by + rcases exists_h1Function_cubeDirichletOddReflectionParent_originCube + (m := m) u with + ⟨uP, huP_fun, huP_grad⟩ + refine ⟨uP, huP_fun, huP_grad, ?_⟩ + exact + hweak.cubeDirichletOddReflectionParent_weakPoissonEquationOn_originCube_of_grad_eq + uP huP_grad hF + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionScalarFiniteP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionScalarFiniteP.lean new file mode 100644 index 0000000000..02c3c56382 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionScalarFiniteP.lean @@ -0,0 +1,345 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge + +/-! +# Finite-`p` scalar transport under Dirichlet odd reflection + +The scalar Dirichlet odd reflection differs from pullback by the affine cell +fold only by a sign of norm one. Combined with the measure-preserving cell fold +maps, this gives exact finite-`p` transport from a cube to its full reflection +block and exact preservation of normalized finite-`p` norms between centered +origin cubes. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem norm_cubeDirichletOddReflectionCellSign + {d : ℕ} (choice : Fin d → Fin 3) : + ‖cubeDirichletOddReflectionCellSign choice‖ = 1 := by + apply (sq_eq_sq₀ (norm_nonneg _) zero_le_one).mp + rw [Real.norm_eq_abs, sq_abs, one_pow, pow_two, + cubeDirichletOddReflectionCellSign_mul_self] + +private theorem norm_cubeDirichletOddReflectionScalar_eq_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (F : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + ‖cubeDirichletOddReflectionScalar Q F x‖ = + ‖F (cubeFaceReflectionCellFoldMap Q choice x)‖ := by + rw [cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + Q choice F hx, + cubeDirichletOddReflectionCellScalar_apply, norm_mul, + norm_cubeDirichletOddReflectionCellSign, one_mul] + +private theorem aestronglyMeasurable_cubeDirichletOddReflectionScalar_cell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) (F : Vec d → ℝ) + (hF : MeasureTheory.AEStronglyMeasurable F + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.AEStronglyMeasurable + (cubeDirichletOddReflectionScalar Q F) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hmp : MeasureTheory.MeasurePreserving + (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : MeasureTheory.AEStronglyMeasurable + (fun x ↦ F (cubeFaceReflectionCellFoldMap Q choice x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hFmap : MeasureTheory.AEStronglyMeasurable F + (MeasureTheory.Measure.map (cubeFaceReflectionCellFoldMap Q choice) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice)))) := by + rw [hmp.map_eq] + exact hF + simpa [Function.comp_def] using hFmap.comp_aemeasurable hmp.aemeasurable + have hcell := hcomp.const_mul (cubeDirichletOddReflectionCellSign choice) + refine hcell.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] with x hx + simpa [cubeDirichletOddReflectionCellScalar] using + (cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + Q choice F hx).symm + +private theorem lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionScalar + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (F : Vec d → ℝ) (p : FiniteLpExponent) : + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖cubeDirichletOddReflectionScalar Q F x‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ∫⁻ y in openCubeSet Q, ‖F y‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + calc + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖cubeDirichletOddReflectionScalar Q F x‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ∫⁻ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + ‖F (cubeFaceReflectionCellFoldMap Q choice x)‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + apply MeasureTheory.lintegral_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] with x hx + simpa only [ofReal_norm] using congrArg + (fun t : ℝ ↦ ENNReal.ofReal t ^ p.exponent.toReal) + (norm_cubeDirichletOddReflectionScalar_eq_cell Q choice F hx) + _ = ∫⁻ y in openCubeSet Q, ‖F y‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + rw [← preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] + exact + ((measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q)).lintegral_comp_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (fun y ↦ ‖F y‖ₑ ^ p.exponent.toReal) + +private theorem lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + {d : ℕ} (Q : TriadicCube d) (F : Vec d → ℝ) + (p : FiniteLpExponent) : + ∫⁻ x in cubeFaceReflectionBlockSet Q, + ‖cubeDirichletOddReflectionScalar Q F x‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume = + ((3 : ℝ≥0∞) ^ d) * + ∫⁻ y in openCubeSet Q, ‖F y‖ₑ ^ + p.exponent.toReal ∂MeasureTheory.volume := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q, + MeasureTheory.lintegral_iUnion] + · simp_rw [lintegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionScalar Q] + simp [nsmul_eq_mul] + · intro choice + exact measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice) + · intro choice₁ choice₂ hne + exact disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne Q hne + +private theorem finiteLpExponent_ne_zero (p : FiniteLpExponent) : + p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (finiteLpExponent_ne_zero p) p.lt_top.ne + +private theorem aestronglyMeasurable_oddReflectionBlock_iff {d : ℕ} (Q : TriadicCube d) + (F : Vec d → ℝ) : + MeasureTheory.AEStronglyMeasurable (cubeDirichletOddReflectionScalar Q F) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) ↔ + MeasureTheory.AEStronglyMeasurable F + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + constructor + · intro h + have hrestrict := h.mono_measure (MeasureTheory.Measure.restrict_mono_set _ + (openCubeSet_subset_cubeFaceReflectionBlockSet Q)) + apply hrestrict.congr + filter_upwards [MeasureTheory.ae_restrict_mem (isOpen_openCubeSet Q).measurableSet] + with x hx + rw [cubeDirichletOddReflectionScalar_eq_self_of_mem_openCubeSet Q F hx] + · intro h + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => + aestronglyMeasurable_cubeDirichletOddReflectionScalar_cell Q choice F h + +/-- The finite-`p` norm of the odd-reflected scalar on the full reflection +block is exactly the `3^d` measure-scaling factor times the source norm. -/ +theorem eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + {d : ℕ} (Q : TriadicCube d) (F : Vec d → ℝ) + (p : FiniteLpExponent) : + MeasureTheory.eLpNorm (cubeDirichletOddReflectionScalar Q F) + p.exponent (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm F p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + by_cases h : MeasureTheory.AEStronglyMeasurable F + (MeasureTheory.volume.restrict (openCubeSet Q)) + · have href := (aestronglyMeasurable_oddReflectionBlock_iff Q F).mpr h + rw [MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne href, + MeasureTheory.eLpNorm_eq_lintegral_rpow_enorm_toReal + (finiteLpExponent_ne_zero p) p.lt_top.ne h, + lintegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar] + rw [ENNReal.mul_rpow_of_nonneg _ _ + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos p).le)] + · have href := mt (aestronglyMeasurable_oddReflectionBlock_iff Q F).mp h + rw [MeasureTheory.eLpNorm_of_not_aestronglyMeasurable href, + MeasureTheory.eLpNorm_of_not_aestronglyMeasurable h] + rw [ENNReal.mul_top (by positivity)] + +/-- Finite-`p` scalar integrability transports from a cube to the complete +Dirichlet odd-reflection block. -/ +theorem memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (p : FiniteLpExponent) + (hF : MeasureTheory.MemLp F p.exponent + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.MemLp (cubeDirichletOddReflectionScalar Q F) + p.exponent + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + unfold MeasureTheory.MemLp + rw [eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar Q F p] + refine ENNReal.mul_lt_top ?_ hF.eLpNorm_lt_top + exact ENNReal.rpow_lt_top_of_nonneg + (one_div_nonneg.mpr (finiteLpExponent_toReal_pos p).le) (by simp) + +/-- On a centered origin cube, the odd-reflected scalar has the same exact +unnormalized finite-`p` scaling on the parent cube. -/ +theorem eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + {d : ℕ} {m : ℤ} (F : Vec d → ℝ) (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (cubeDirichletOddReflectionScalar (originCube d m) F) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) = + ((3 : ℝ≥0∞) ^ d) ^ (1 / p.exponent.toReal) * + MeasureTheory.eLpNorm F p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact eLpNorm_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + (originCube d m) F p + +/-- Finite-`p` scalar integrability transports from an origin cube to its +centered parent under Dirichlet odd reflection. -/ +theorem memLp_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} (p : FiniteLpExponent) + (hF : MeasureTheory.MemLp F p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m)))) : + MeasureTheory.MemLp + (cubeDirichletOddReflectionScalar (originCube d m) F) + p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1)))) := by + have hmeasure : + MeasureTheory.volume.restrict (openCubeSet (originCube d (m + 1))) = + MeasureTheory.volume.restrict + (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa using MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + rw [hmeasure] + exact memLp_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar + (originCube d m) p hF + +private theorem normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet + {d : ℕ} (m : ℤ) : + normalizedCubeMeasure (originCube d m) = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] + +private theorem restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure + {d : ℕ} (m : ℤ) : + MeasureTheory.volume.restrict (openCubeSet (originCube d m)) = + ENNReal.ofReal (cubeVolume (originCube d m)) • + normalizedCubeMeasure (originCube d m) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + rw [ENNReal.ofReal_inv_of_pos (cubeVolume_pos _)] + rw [smul_smul] + have hnonzero : ENNReal.ofReal (cubeVolume (originCube d m)) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (cubeVolume_pos _) + have hone : ENNReal.ofReal (cubeVolume (originCube d m)) * + (ENNReal.ofReal (cubeVolume (originCube d m)))⁻¹ = 1 := by + simpa [mul_comm] using + ENNReal.inv_mul_cancel hnonzero ENNReal.ofReal_ne_top + rw [hone, one_smul] + +private theorem cubeVolume_originCube_succ {d : ℕ} (m : ℤ) : + cubeVolume (originCube d (m + 1)) = + (3 : ℝ) ^ d * cubeVolume (originCube d m) := by + simp [cubeVolume, cubeScaleFactor, originCube, zpow_add₀] + rw [mul_pow] + ring + +private theorem normalized_originCube_reflection_factor_cancel + {d : ℕ} (m : ℤ) (p : FiniteLpExponent) : + ENNReal.ofReal ((cubeVolume (originCube d (m + 1)))⁻¹) ^ + (p.exponent.toReal)⁻¹ * + ((3 : ENNReal) ^ d) ^ (p.exponent.toReal)⁻¹ = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) ^ + (p.exponent.toReal)⁻¹ := by + let N : ℝ := (3 : ℝ) ^ d + let V : ℝ := cubeVolume (originCube d m) + have hN : 0 < N := by positivity + have hV : 0 < V := cubeVolume_pos _ + have hvol : cubeVolume (originCube d (m + 1)) = N * V := by + simpa [N, V] using cubeVolume_originCube_succ (d := d) m + have hbase_real : (N * V)⁻¹ * N = V⁻¹ := by + field_simp [hN.ne', hV.ne'] + have hbase : ENNReal.ofReal ((N * V)⁻¹) * ENNReal.ofReal N = + ENNReal.ofReal V⁻¹ := by + rw [← ENNReal.ofReal_mul (inv_nonneg.mpr (mul_nonneg hN.le hV.le))] + exact congrArg ENNReal.ofReal hbase_real + rw [hvol] + calc + ENNReal.ofReal ((N * V)⁻¹) ^ (p.exponent.toReal)⁻¹ * + ((3 : ENNReal) ^ d) ^ (p.exponent.toReal)⁻¹ = + (ENNReal.ofReal ((N * V)⁻¹) * ENNReal.ofReal N) ^ + (p.exponent.toReal)⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by positivity)] + congr 1 + norm_num [N] + _ = ENNReal.ofReal V⁻¹ ^ (p.exponent.toReal)⁻¹ := by + rw [hbase] + +/-- Normalized origin-cube finite-`p` scalar norms are exactly preserved by +Dirichlet odd reflection from a cube to its centered parent. -/ +theorem eLpNorm_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar + {d : ℕ} {m : ℤ} (F : Vec d → ℝ) (p : FiniteLpExponent) : + MeasureTheory.eLpNorm + (cubeDirichletOddReflectionScalar (originCube d m) F) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) = + MeasureTheory.eLpNorm F p.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet, + normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero_of_ne_top + (finiteLpExponent_ne_zero p) p.lt_top.ne _, + MeasureTheory.eLpNorm_smul_measure_of_ne_zero_of_ne_top + (finiteLpExponent_ne_zero p) p.lt_top.ne _, + eLpNorm_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar] + simp only [smul_eq_mul, one_div, ENNReal.toReal_inv] + rw [← mul_assoc, normalized_originCube_reflection_factor_cancel] + +/-- Finite-`p` scalar integrability is preserved by normalized origin-cube +odd-reflection transport. -/ +theorem memLp_normalizedCubeMeasure_succ_originCube_cubeDirichletOddReflectionScalar + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} (p : FiniteLpExponent) + (hF : MeasureTheory.MemLp F p.exponent + (normalizedCubeMeasure (originCube d m))) : + MeasureTheory.MemLp + (cubeDirichletOddReflectionScalar (originCube d m) F) + p.exponent (normalizedCubeMeasure (originCube d (m + 1))) := by + have hFopen : MeasureTheory.MemLp F p.exponent + (MeasureTheory.volume.restrict (openCubeSet (originCube d m))) := by + rw [restrict_openCubeSet_originCube_eq_smul_normalizedCubeMeasure] + exact hF.smul_measure ENNReal.ofReal_ne_top + have hreflect := + memLp_openCubeSet_succ_originCube_cubeDirichletOddReflectionScalar p hFopen + rw [normalizedCubeMeasure_originCube_eq_smul_restrict_openCubeSet] + exact hreflect.smul_measure ENNReal.ofReal_ne_top + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionWeakEquation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionWeakEquation.lean new file mode 100644 index 0000000000..4a7b194dd9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/ReflectionWeakEquation.lean @@ -0,0 +1,1012 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ReflectionL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestFold + +/-! # Reflection Weak Equation -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Folded tests for the Dirichlet odd-reflection weak equation + +The full reflected weak equation is reduced to the original Dirichlet weak +problem by folding a parent test back to the original cube with the product +odd-reflection sign. This file packages the folded test as an `H¹₀` test on +origin cubes. +-/ + +/-- Fold a parent scalar test back to the original cube using the product +Dirichlet odd-reflection sign. -/ +def cubeDirichletOddReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (φ : Vec d → ℝ) : Vec d → ℝ := + fun y => + ∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y) + +private theorem eq_zero_of_tsupport_subset_of_notMem + {d : ℕ} {U : Set (Vec d)} {φ : Vec d → ℝ} {x : Vec d} + (hφ_sub : tsupport φ ⊆ U) (hx : x ∉ U) : + φ x = 0 := + image_eq_zero_of_notMem_tsupport fun hxt => hx (hφ_sub hxt) + +private theorem hasCompactSupport_finset_sum + {α β ι : Type*} [TopologicalSpace α] [AddCommMonoid β] [DecidableEq ι] + (s : Finset ι) (f : ι → α → β) + (hf : ∀ i ∈ s, HasCompactSupport (f i)) : + HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + classical + revert hf + refine Finset.induction_on s ?zero ?insert + · intro _hf + simpa using! (HasCompactSupport.zero : HasCompactSupport (fun _ : α => (0 : β))) + · intro a s has hs hf + have ha : HasCompactSupport (f a) := hf a (by simp [has]) + have hs' : HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + exact hs (fun i hi => hf i (Finset.mem_insert_of_mem hi)) + simpa [Finset.sum_insert has] using! ha.add hs' + +private theorem cubeDirichletOddReflectionCellSign_lowerChoiceSwap_of_choice_eq_zero + {d : ℕ} (i : Fin d) (choice : Fin d → Fin 3) + (h0 : choice i = 0) : + cubeDirichletOddReflectionCellSign + (cubeFaceReflectionLowerChoiceSwap i choice) = + -cubeDirichletOddReflectionCellSign choice := by + classical + unfold cubeDirichletOddReflectionCellSign + rw [Fintype.prod_eq_mul_prod_compl i, Fintype.prod_eq_mul_prod_compl i] + have hrest : + (∏ x ∈ {i}ᶜ, + (if cubeFaceReflectionLowerChoiceSwap i choice x = 1 then (1 : ℝ) else -1)) = + ∏ x ∈ {i}ᶜ, (if choice x = 1 then (1 : ℝ) else -1) := by + refine Finset.prod_congr rfl ?_ + intro j hj + have hji : j ≠ i := by simpa using hj + simp [cubeFaceReflectionLowerChoiceSwap, Function.update_of_ne hji] + rw [hrest] + simp [cubeFaceReflectionLowerChoiceSwap, h0] + +private theorem cubeDirichletOddReflectionCellSign_lowerChoiceSwap_of_choice_eq_one + {d : ℕ} (i : Fin d) (choice : Fin d → Fin 3) + (h1 : choice i = 1) : + cubeDirichletOddReflectionCellSign + (cubeFaceReflectionLowerChoiceSwap i choice) = + -cubeDirichletOddReflectionCellSign choice := by + classical + unfold cubeDirichletOddReflectionCellSign + rw [Fintype.prod_eq_mul_prod_compl i, Fintype.prod_eq_mul_prod_compl i] + have hrest : + (∏ x ∈ {i}ᶜ, + (if cubeFaceReflectionLowerChoiceSwap i choice x = 1 then (1 : ℝ) else -1)) = + ∏ x ∈ {i}ᶜ, (if choice x = 1 then (1 : ℝ) else -1) := by + refine Finset.prod_congr rfl ?_ + intro j hj + have hji : j ≠ i := by simpa using hj + simp [cubeFaceReflectionLowerChoiceSwap, Function.update_of_ne hji] + rw [hrest] + simp [cubeFaceReflectionLowerChoiceSwap, h1] + +private theorem cubeDirichletOddReflectionCellSign_upperChoiceSwap_of_choice_eq_one + {d : ℕ} (i : Fin d) (choice : Fin d → Fin 3) + (h1 : choice i = 1) : + cubeDirichletOddReflectionCellSign + (cubeFaceReflectionUpperChoiceSwap i choice) = + -cubeDirichletOddReflectionCellSign choice := by + classical + unfold cubeDirichletOddReflectionCellSign + rw [Fintype.prod_eq_mul_prod_compl i, Fintype.prod_eq_mul_prod_compl i] + have hrest : + (∏ x ∈ {i}ᶜ, + (if cubeFaceReflectionUpperChoiceSwap i choice x = 1 then (1 : ℝ) else -1)) = + ∏ x ∈ {i}ᶜ, (if choice x = 1 then (1 : ℝ) else -1) := by + refine Finset.prod_congr rfl ?_ + intro j hj + have hji : j ≠ i := by simpa using hj + simp [cubeFaceReflectionUpperChoiceSwap, Function.update_of_ne hji] + rw [hrest] + simp [cubeFaceReflectionUpperChoiceSwap, h1] + +private theorem cubeDirichletOddReflectionCellSign_upperChoiceSwap_of_choice_eq_two + {d : ℕ} (i : Fin d) (choice : Fin d → Fin 3) + (h2 : choice i = 2) : + cubeDirichletOddReflectionCellSign + (cubeFaceReflectionUpperChoiceSwap i choice) = + -cubeDirichletOddReflectionCellSign choice := by + classical + unfold cubeDirichletOddReflectionCellSign + rw [Fintype.prod_eq_mul_prod_compl i, Fintype.prod_eq_mul_prod_compl i] + have hrest : + (∏ x ∈ {i}ᶜ, + (if cubeFaceReflectionUpperChoiceSwap i choice x = 1 then (1 : ℝ) else -1)) = + ∏ x ∈ {i}ᶜ, (if choice x = 1 then (1 : ℝ) else -1) := by + refine Finset.prod_congr rfl ?_ + intro j hj + have hji : j ≠ i := by simpa using hj + simp [cubeFaceReflectionUpperChoiceSwap, Function.update_of_ne hji] + rw [hrest] + simp [cubeFaceReflectionUpperChoiceSwap, h2] + +/-- Lower-face cancellation for the product-sign folded parent test, assuming +the unpaired upper-strip outer cell evaluates to zero. -/ +theorem cubeDirichletOddReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_of_outer + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (houter : ∀ choice : Fin d → Fin 3, ∀ x : Vec d, + choice i ≠ 0 → choice i ≠ 1 → + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeLowerFaceProjection Q i x)) = 0) : + ∀ x : Vec d, + cubeDirichletOddReflectionFoldedParentScalarTest Q φ + (cubeLowerFaceProjection Q i x) = 0 := by + classical + intro x + unfold cubeDirichletOddReflectionFoldedParentScalarTest + let f : (Fin d → Fin 3) → ℝ := fun choice => + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeLowerFaceProjection Q i x)) + simpa [f] using + (Finset.sum_ninvolution (s := Finset.univ) (f := f) + (cubeFaceReflectionLowerChoiceSwap i) + (by + intro choice + by_cases h0 : choice i = 0 + · have hsign := + cubeDirichletOddReflectionCellSign_lowerChoiceSwap_of_choice_eq_zero + i choice h0 + simp [f, hsign, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection + Q i choice x] + · by_cases h1 : choice i = 1 + · have hsign := + cubeDirichletOddReflectionCellSign_lowerChoiceSwap_of_choice_eq_one + i choice h1 + simp [f, hsign, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection + Q i choice x] + · have hzero := houter choice x h0 h1 + simp [f, hzero, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection + Q i choice x]) + (by + intro choice hf hfix + by_cases h0 : choice i = 0 + · have hi := congrFun hfix i + simp [cubeFaceReflectionLowerChoiceSwap, h0] at hi + · by_cases h1 : choice i = 1 + · have hi := congrFun hfix i + simp [cubeFaceReflectionLowerChoiceSwap, h1] at hi + · have hzero := houter choice x h0 h1 + simp [f, hzero] at hf) + (by intro choice; simp) + (cubeFaceReflectionLowerChoiceSwap_involutive i)) + +/-- Upper-face cancellation for the product-sign folded parent test, assuming +the unpaired lower-strip outer cell evaluates to zero. -/ +theorem cubeDirichletOddReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_of_outer + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (houter : ∀ choice : Fin d → Fin 3, ∀ x : Vec d, + choice i ≠ 1 → choice i ≠ 2 → + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeUpperFaceProjection Q i x)) = 0) : + ∀ x : Vec d, + cubeDirichletOddReflectionFoldedParentScalarTest Q φ + (cubeUpperFaceProjection Q i x) = 0 := by + classical + intro x + unfold cubeDirichletOddReflectionFoldedParentScalarTest + let f : (Fin d → Fin 3) → ℝ := fun choice => + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeUpperFaceProjection Q i x)) + simpa [f] using + (Finset.sum_ninvolution (s := Finset.univ) (f := f) + (cubeFaceReflectionUpperChoiceSwap i) + (by + intro choice + by_cases h1 : choice i = 1 + · have hsign := + cubeDirichletOddReflectionCellSign_upperChoiceSwap_of_choice_eq_one + i choice h1 + simp [f, hsign, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection + Q i choice x] + · by_cases h2 : choice i = 2 + · have hsign := + cubeDirichletOddReflectionCellSign_upperChoiceSwap_of_choice_eq_two + i choice h2 + simp [f, hsign, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection + Q i choice x] + · have hzero := houter choice x h1 h2 + simp [f, hzero, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection + Q i choice x]) + (by + intro choice hf hfix + by_cases h1 : choice i = 1 + · have hi := congrFun hfix i + simp [cubeFaceReflectionUpperChoiceSwap, h1] at hi + · by_cases h2 : choice i = 2 + · have hi := congrFun hfix i + simp [cubeFaceReflectionUpperChoiceSwap, h2] at hi + · have hzero := houter choice x h1 h2 + simp [f, hzero] at hf) + (by intro choice; simp) + (cubeFaceReflectionUpperChoiceSwap_involutive i)) + +/-- Origin-cube lower-face cancellation for parent tests supported in the next +larger centered cube. -/ +theorem cubeDirichletOddReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_originCube + {d : ℕ} (m : ℤ) (i : Fin d) {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∀ x : Vec d, + cubeDirichletOddReflectionFoldedParentScalarTest (originCube d m) φ + (cubeLowerFaceProjection (originCube d m) i x) = 0 := by + refine + cubeDirichletOddReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_of_outer + (originCube d m) i ?_ + intro choice x h0 h1 + exact eq_zero_of_tsupport_subset_of_notMem hφ_sub + (cubeFaceReflectionCellFoldMap_lowerFaceProjection_notMem_openCubeSet_succ_originCube + m i choice x h0 h1) + +/-- Origin-cube upper-face cancellation for parent tests supported in the next +larger centered cube. -/ +theorem cubeDirichletOddReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_originCube + {d : ℕ} (m : ℤ) (i : Fin d) {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∀ x : Vec d, + cubeDirichletOddReflectionFoldedParentScalarTest (originCube d m) φ + (cubeUpperFaceProjection (originCube d m) i x) = 0 := by + refine + cubeDirichletOddReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_of_outer + (originCube d m) i ?_ + intro choice x h1 h2 + exact eq_zero_of_tsupport_subset_of_notMem hφ_sub + (cubeFaceReflectionCellFoldMap_upperFaceProjection_notMem_openCubeSet_succ_originCube + m i choice x h1 h2) + +/-- The product-sign folded parent test is smooth when the parent test is +smooth. -/ +theorem contDiff_cubeDirichletOddReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ContDiff ℝ (⊤ : ℕ∞) + (cubeDirichletOddReflectionFoldedParentScalarTest Q φ) := by + classical + unfold cubeDirichletOddReflectionFoldedParentScalarTest + exact + ContDiff.sum fun choice _ => + contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ) + +/-- The product-sign folded parent test has compact support when the parent +test has compact support. -/ +theorem hasCompactSupport_cubeDirichletOddReflectionFoldedParentScalarTest + {d : ℕ} (Q : TriadicCube d) {φ : Vec d → ℝ} + (hφ : HasCompactSupport φ) : + HasCompactSupport (cubeDirichletOddReflectionFoldedParentScalarTest Q φ) := by + classical + unfold cubeDirichletOddReflectionFoldedParentScalarTest + simpa using + hasCompactSupport_finset_sum (Finset.univ : Finset (Fin d → Fin 3)) + (fun choice y => + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + (by + intro choice _hchoice + exact + (hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ).mul_left) + +/-- Coordinate derivative of the product-sign folded parent test. -/ +theorem euclideanCoordDeriv_cubeDirichletOddReflectionFoldedParentScalarTest + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + euclideanCoordDeriv i + (cubeDirichletOddReflectionFoldedParentScalarTest Q φ) x = + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice x) := by + classical + unfold cubeDirichletOddReflectionFoldedParentScalarTest euclideanCoordDeriv + rw [fderiv_fun_sum] + · simp only [sum_apply] + apply Finset.sum_congr rfl + intro choice _hchoice + have hdiff : + DifferentiableAt ℝ + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x := + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ).differentiable + (by simp) x + rw [fderiv_const_mul hdiff] + change cubeDirichletOddReflectionCellSign choice * + euclideanCoordDeriv i + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x = + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice x) + rw [euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap hφ Q choice i x] + by_cases h1 : choice i = 1 <;> + simp [cubeFaceReflectionCellFoldSign, h1] + · intro choice _hchoice + exact + (contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ)).differentiable + (by simp) x + +namespace H10Function + +/-- The folded parent test, packaged as an `H¹₀` function on an origin cube. -/ +noncomputable def cubeDirichletOddReflectionFoldedParentScalarTestToH10 + {d : ℕ} (m : ℤ) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + H10Function (openCubeSet (originCube d m)) := + H10Function.ofContDiffFaceZeroOnOpenCubeSet (originCube d m) + (contDiff_cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) hφ) + (hasCompactSupport_cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) hφ_compact) + (fun i => + cubeDirichletOddReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_originCube + m i hφ_sub) + (fun i => + cubeDirichletOddReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_originCube + m i hφ_sub) + +end H10Function + +private theorem integrable_openCubeSet_cubeDirichletOddCellVectorPairing + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} + (choice : Fin d → Fin 3) + (hG : MemVectorL2 (openCubeSet Q) G) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + MeasureTheory.Integrable + (fun y => + cubeDirichletOddReflectionCellSign choice * + vecDot (G y) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ + (cubeFaceReflectionCellFoldMap Q choice y)))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + let ψ : Vec d → ℝ := + fun y => φ (cubeFaceReflectionCellFoldMap Q choice y) + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψ_compact : HasCompactSupport ψ := by + simpa [ψ] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ_compact + have hgradψ : MemVectorL2 (openCubeSet Q) (euclideanGradient ψ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψ hψ_compact + have hbase : + MeasureTheory.Integrable + (fun y => vecDot (G y) (euclideanGradient ψ y)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) hG hgradψ + refine (hbase.const_mul (cubeDirichletOddReflectionCellSign choice)).congr ?_ + filter_upwards with y + have hgrad := + euclideanGradient_comp_cubeFaceReflectionCellFoldMap hφ Q choice y + simpa [ψ] using congrArg + (fun v => cubeDirichletOddReflectionCellSign choice * vecDot (G y) v) + hgrad + +private theorem integrable_openCubeSet_cubeDirichletOddCellScalarPairing + {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + (choice : Fin d → Fin 3) + (hF : MemScalarL2 (openCubeSet Q) F) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + MeasureTheory.Integrable + (fun y => + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y))) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + let ψ : Vec d → ℝ := + fun y => φ (cubeFaceReflectionCellFoldMap Q choice y) + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψ_compact : HasCompactSupport ψ := by + simpa [ψ] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ_compact + have hψL2 : MemScalarL2 (openCubeSet Q) ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict + (openCubeSet Q) + have hbase : + MeasureTheory.Integrable (fun y => F y * ψ y) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable_mul hψL2 + simpa [ψ, mul_assoc, mul_left_comm, mul_comm] using + hbase.const_mul (cubeDirichletOddReflectionCellSign choice) + +/-- Change variables on one reflection cell in the odd-reflected gradient +pairing. -/ +theorem setIntegral_cubeFaceReflectionCellCube_vecDot_cubeDirichletOddReflectionVectorField_eq + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} + (choice : Fin d → Fin 3) {φ : Vec d → ℝ} : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + cubeDirichletOddReflectionCellSign choice * + vecDot (G y) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ + (cubeFaceReflectionCellFoldMap Q choice y))) + ∂MeasureTheory.volume := by + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (fun y => s * vecDot (G y) (L (euclideanGradient φ (T y)))) (T x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) = + s * vecDot (G (T x)) (L (euclideanGradient φ (T (T x)))) + have hvec := + cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx + rw [hvec] + change + vecDot (s • L (G (T x))) (euclideanGradient φ x) = + s * vecDot (G (T x)) (L (euclideanGradient φ (T (T x)))) + calc + vecDot (s • L (G (T x))) (euclideanGradient φ x) = + s * vecDot (L (G (T x))) (euclideanGradient φ x) := by + rw [vecDot_smul_left] + _ = s * vecDot (G (T x)) (L (euclideanGradient φ x)) := by + rw [vecDot_cubeFaceReflectionCellFoldLinear_left] + _ = s * vecDot (G (T x)) + (L (euclideanGradient φ (T (T x)))) := by + simp [T, cubeFaceReflectionCellFoldMap_involutive Q choice x] + _ = ∫ y in openCubeSet Q, + cubeDirichletOddReflectionCellSign choice * + vecDot (G y) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ + (cubeFaceReflectionCellFoldMap Q choice y))) + ∂MeasureTheory.volume := by + simpa [T, L, s] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice + (fun y => s * vecDot (G y) (L (euclideanGradient φ (T y)))) + +/-- Change variables on one reflection cell in the odd-reflected scalar +pairing. -/ +theorem setIntegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionScalar_mul_eq + {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + (choice : Fin d → Fin 3) {φ : Vec d → ℝ} : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeDirichletOddReflectionScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeDirichletOddReflectionScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (fun y => F y * (s * φ (T y))) (T x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + cubeDirichletOddReflectionScalar Q F x * φ x = + F (T x) * (s * φ (T (T x))) + rw [cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + Q choice F hx] + simp [cubeDirichletOddReflectionCellScalar, T, s, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + _ = ∫ y in openCubeSet Q, + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + simpa [T, s] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => F y * (s * φ (T y))) + +/-- The block pairing with the odd-reflected vector field is the original-cube +pairing against the folded derivative sum. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_vecDot_cubeDirichletOddReflectionVectorField_eq_folded_derivSum + {d : ℕ} {Q : TriadicCube d} {G : Vec d → Vec d} + (hG : MemVectorL2 (openCubeSet Q) G) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + vecDot (G y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := fun x => + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) + have hfCell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + have hbase := + integrable_openCubeSet_cubeDirichletOddCellVectorPairing + (Q := Q) (G := G) choice hG hφ hφ_compact + have hcomp : + MeasureTheory.Integrable + (fun x => (fun y => s * vecDot (G y) (L (euclideanGradient φ (T y)))) (T x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + simpa [T, L, s] using + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) + (g := fun y => s * vecDot (G y) (L (euclideanGradient φ (T y)))) + hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + change + s * vecDot (G (T x)) (L (euclideanGradient φ (T (T x)))) = + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) + have hvec := + cubeDirichletOddReflectionVectorField_eq_cellVectorField_of_mem_cellCube + Q choice G hx + rw [hvec] + change + s * vecDot (G (T x)) (L (euclideanGradient φ (T (T x)))) = + vecDot (s • L (G (T x))) (euclideanGradient φ x) + symm + calc + vecDot (s • L (G (T x))) (euclideanGradient φ x) = + s * vecDot (L (G (T x))) (euclideanGradient φ x) := by + rw [vecDot_smul_left] + _ = s * vecDot (G (T x)) (L (euclideanGradient φ x)) := by + rw [vecDot_cubeFaceReflectionCellFoldLinear_left] + _ = s * vecDot (G (T x)) + (L (euclideanGradient φ (T (T x)))) := by + simp [T, cubeFaceReflectionCellFoldMap_involutive Q choice x] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeDirichletOddReflectionVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfCell + _ = ∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + cubeDirichletOddReflectionCellSign choice * + vecDot (G y) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ + (cubeFaceReflectionCellFoldMap Q choice y))) + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_vecDot_cubeDirichletOddReflectionVectorField_eq + (Q := Q) (G := G) choice (φ := φ) + _ = ∫ y in openCubeSet Q, + ∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + vecDot (G y) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ + (cubeFaceReflectionCellFoldMap Q choice y))) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro choice _hchoice + exact integrable_openCubeSet_cubeDirichletOddCellVectorPairing + (Q := Q) (G := G) choice hG hφ hφ_compact + _ = ∫ y in openCubeSet Q, + vecDot (G y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + simp [vecDot, cubeFaceReflectionCellFoldLinear_apply, + cubeFaceReflectionCellFoldSign, euclideanGradient, euclideanCoordDeriv, + Finset.mul_sum, mul_left_comm] + rw [Finset.sum_comm] + +/-- The block pairing with the odd-reflected scalar forcing is the +original-cube folded scalar pairing. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_mul_eq_folded + {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet Q) F) + {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeDirichletOddReflectionScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := fun x => cubeDirichletOddReflectionScalar Q F x * φ x + have hfCell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let s : ℝ := cubeDirichletOddReflectionCellSign choice + have hbase := + integrable_openCubeSet_cubeDirichletOddCellScalarPairing + (Q := Q) (F := F) choice hF hφ hφ_compact + have hcomp : + MeasureTheory.Integrable + (fun x => (fun y => F y * (s * φ (T y))) (T x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + simpa [T, s] using + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) + (g := fun y => F y * (s * φ (T y))) hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + change + F (T x) * (s * φ (T (T x))) = + cubeDirichletOddReflectionScalar Q F x * φ x + rw [cubeDirichletOddReflectionScalar_eq_cellScalar_of_mem_cellCube + Q choice F hx] + simp [cubeDirichletOddReflectionCellScalar, T, s, + cubeFaceReflectionCellFoldMap_involutive Q choice x, + mul_assoc, mul_comm] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + cubeDirichletOddReflectionScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfCell + _ = ∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_cubeDirichletOddReflectionScalar_mul_eq + (Q := Q) (F := F) choice (φ := φ) + _ = ∫ y in openCubeSet Q, + ∑ choice : Fin d → Fin 3, + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro choice _hchoice + exact integrable_openCubeSet_cubeDirichletOddCellScalarPairing + (Q := Q) (F := F) choice hF hφ hφ_compact + _ = ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + change + (∑ choice : Fin d → Fin 3, + F y * + (cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y))) = + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + rw [Finset.mul_sum] + +namespace CubeDirichletWeakPoissonProblem + +/-- The original Dirichlet weak equation may be tested against the folded +parent test produced by odd reflection. -/ +theorem test_cubeDirichletOddReflectionFoldedParentScalarTest_originCube + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F φ : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) + (euclideanGradient + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y) ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + F y * + cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ y ∂MeasureTheory.volume := by + let ψ : H10Function (openCubeSet (originCube d m)) := + H10Function.cubeDirichletOddReflectionFoldedParentScalarTestToH10 + m hφ hφ_compact hφ_sub + have htest := hweak ψ + simpa [ψ, H10Function.cubeDirichletOddReflectionFoldedParentScalarTestToH10, + H10Function.ofContDiffFaceZeroOnOpenCubeSet_toFun, + H10Function.ofContDiffFaceZeroOnOpenCubeSet_grad, euclideanGradient] + using! htest + +/-- Expanded cell-sum form of the folded-test weak identity. This is the +algebraic shape needed for the subsequent reflected-block +change-of-variables step. -/ +theorem test_cubeDirichletOddReflectionFoldedParentScalarTest_derivSum_originCube + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F φ : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume := by + have hbase := + hweak.test_cubeDirichletOddReflectionFoldedParentScalarTest_originCube + hφ hφ_compact hφ_sub + calc + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + vecDot (u.toH1Function.grad y) + (euclideanGradient + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d m)) ?_ + intro y _hy + have hgrad : + euclideanGradient + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y = + fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y) := by + ext i + rw [show + (euclideanGradient + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y) i = + euclideanCoordDeriv i + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y by + rfl] + exact euclideanCoordDeriv_cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) i hφ y + change + vecDot (u.toH1Function.grad y) + (fun i : Fin d => + ∑ choice : Fin d → Fin 3, + (cubeDirichletOddReflectionCellSign choice * + cubeFaceReflectionCellFoldSign choice i) * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) = + vecDot (u.toH1Function.grad y) + (euclideanGradient + (cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ) y) + rw [hgrad] + _ = ∫ y in openCubeSet (originCube d m), + F y * + cubeDirichletOddReflectionFoldedParentScalarTest + (originCube d m) φ y ∂MeasureTheory.volume := hbase + _ = ∫ y in openCubeSet (originCube d m), + F y * + (∑ choice : Fin d → Fin 3, + cubeDirichletOddReflectionCellSign choice * + φ (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume := rfl + +/-- Compact-test weak equation for the odd-reflected Dirichlet solution on +the full all-coordinate reflection block of an origin cube. -/ +theorem cubeFaceReflectionBlock_oddWeakEquationOnBlock_originCube + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F φ : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ x in cubeFaceReflectionBlockSet (originCube d m), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet (originCube d m), + cubeDirichletOddReflectionScalar (originCube d m) F x * φ x + ∂MeasureTheory.volume := by + have hG : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => u.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + u.toH1Function.grad_memVectorL2 + rw [ + setIntegral_cubeFaceReflectionBlockSet_vecDot_cubeDirichletOddReflectionVectorField_eq_folded_derivSum + (Q := originCube d m) (G := fun y => u.toH1Function.grad y) + hG hφ hφ_compact, + setIntegral_cubeFaceReflectionBlockSet_cubeDirichletOddReflectionScalar_mul_eq_folded + (Q := originCube d m) (F := F) hF hφ hφ_compact] + exact + hweak.test_cubeDirichletOddReflectionFoldedParentScalarTest_derivSum_originCube + hφ hφ_compact hφ_sub + +/-- Centered parent-cube compact-test weak equation for the odd-reflected +Dirichlet solution. -/ +theorem cubeDirichletOddReflectionParent_weakEquationOnParent_originCube + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F φ : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d (m + 1)), + cubeDirichletOddReflectionScalar (originCube d m) F x * φ x + ∂MeasureTheory.volume := by + rw [ + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x) + (euclideanGradient φ x)), + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeDirichletOddReflectionScalar (originCube d m) F x * φ x)] + exact + hweak.cubeFaceReflectionBlock_oddWeakEquationOnBlock_originCube + hF hφ hφ_compact hφ_sub + +/-- Centered parent-cube weak equation, with the forcing hypothesis in the +normalized cube measure used by the public regularity contract. -/ +theorem cubeDirichletOddReflectionParent_weakEquationOnParent_originCube_of_memLp_normalizedCubeMeasure + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F φ : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d (m + 1)), + cubeDirichletOddReflectionScalar (originCube d m) F x * φ x + ∂MeasureTheory.volume := by + have hFopen : MemScalarL2 (openCubeSet (originCube d m)) F := by + simpa [MemL2On, MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure + (originCube d m) hF + exact + hweak.cubeDirichletOddReflectionParent_weakEquationOnParent_originCube + hFopen hφ hφ_compact hφ_sub + +/-- If the odd-reflected vector field has already been realized as the weak +gradient of an `H¹` function on the centered parent cube, the parent integral +identity becomes the standard `WeakPoissonEquationOn` interface. -/ +theorem cubeDirichletOddReflectionParent_weakPoissonEquationOn_originCube_of_grad_eq + {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F : Vec d → ℝ} + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (huP_grad : + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y)) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeDirichletOddReflectionScalar (originCube d m) F) := by + intro φ hφ hφ_compact hφ_sub + rw [huP_grad] + exact + hweak.cubeDirichletOddReflectionParent_weakEquationOnParent_originCube_of_memLp_normalizedCubeMeasure + hF hφ hφ_compact hφ_sub + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Regularity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Regularity.lean new file mode 100644 index 0000000000..c59055cd9e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/Regularity.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.ArbitraryCubeEndpoint + +/-! # Regularity -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +/-- The scale-indexed Dirichlet `H²` constant produced by the current +zero-trace Poincare/odd-reflection proof. -/ +noncomputable def cubeDirichletH2RegularityConstantExact + {d : ℕ} [NeZero d] (Q : TriadicCube d) : ℝ := + ((d : ℝ) * (d : ℝ)) * + originCubeParentReducedSolverEnergyConstantExact d Q.scale + +theorem cubeDirichletH2RegularityConstantExact_nonneg + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + 0 ≤ cubeDirichletH2RegularityConstantExact Q := by + exact mul_nonneg + (mul_nonneg (Nat.cast_nonneg d) (Nat.cast_nonneg d)) + (originCubeParentReducedSolverEnergyConstantExact_nonneg d Q.scale) + +/-- The dimension-only constant for the unnormalized open-cube `L²` forcing +version of the Dirichlet `H²` estimate. -/ +noncomputable def cubeDirichletH2RegularityVolumeL2ConstantExact + (d : ℕ) [NeZero d] : ℝ := + cubeDirichletH2RegularityConstantExact (originCube d 0) + +theorem cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ cubeDirichletH2RegularityVolumeL2ConstantExact d := by + exact cubeDirichletH2RegularityConstantExact_nonneg (originCube d 0) + +theorem cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + cubeDirichletH2RegularityConstantExact Q = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeDirichletH2RegularityVolumeL2ConstantExact d := by + let Q₀ : TriadicCube d := originCube d Q.scale + let V : ℝ := cubeVolume Q₀ + let D₂ : ℝ := (d : ℝ) * (d : ℝ) + let K : ℝ := originCubeParentReducedSolverEnergyConstantExact d Q.scale + let K₀ : ℝ := originCubeParentReducedSolverEnergyConstantExact d 0 + have hV_pos : 0 < V := by + dsimp [V, Q₀] + exact cubeVolume_pos (originCube d Q.scale) + have hV_nonneg : 0 ≤ V := le_of_lt hV_pos + have hcancel : + (V⁻¹) ^ (1 / 2 : ℝ) * K = K₀ := by + simpa [V, K, K₀, Q₀] using + originCubeParentReducedSolverEnergyConstantExact_volume_cancel d Q.scale + have hV_cancel : + V ^ (1 / 2 : ℝ) * (V⁻¹) ^ (1 / 2 : ℝ) = 1 := by + rw [Real.inv_rpow hV_nonneg (1 / 2 : ℝ)] + exact mul_inv_cancel₀ (Real.rpow_pos_of_pos hV_pos _).ne' + have hK : K = V ^ (1 / 2 : ℝ) * K₀ := by + calc + K = 1 * K := by ring + _ = (V ^ (1 / 2 : ℝ) * (V⁻¹) ^ (1 / 2 : ℝ)) * K := by + rw [hV_cancel] + _ = V ^ (1 / 2 : ℝ) * ((V⁻¹) ^ (1 / 2 : ℝ) * K) := by + ring + _ = V ^ (1 / 2 : ℝ) * K₀ := by + rw [hcancel] + have hVQ : V = cubeVolume Q := by + dsimp [V, Q₀] + exact cubeVolume_originCube_same_scale Q + calc + cubeDirichletH2RegularityConstantExact Q + = D₂ * K := by + simp [cubeDirichletH2RegularityConstantExact, D₂, K] + _ = V ^ (1 / 2 : ℝ) * (D₂ * K₀) := by + rw [hK] + ring + _ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeDirichletH2RegularityVolumeL2ConstantExact d := by + rw [hVQ] + dsimp [cubeDirichletH2RegularityVolumeL2ConstantExact, + cubeDirichletH2RegularityConstantExact, D₂, K₀, originCube] + +theorem originCube_sum_reducedSolverEnergyBoundExact_le_regularityConstant_mul_cubeLpNorm + {d : ℕ} [NeZero d] {m : ℤ} {F : Vec d → ℝ} : + (∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i) ≤ + cubeDirichletH2RegularityConstantExact (originCube d m) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let K : ℝ := originCubeParentReducedSolverEnergyConstantExact d m + let L : ℝ := cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F + have hsum_eq : + (∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i) = + ((d : ℝ) * (d : ℝ)) * (K * L) := by + calc + (∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i) + = ∑ i : Fin d, ∑ _j : Fin d, K * L := by + refine Finset.sum_congr rfl ?_ + intro i _hi + refine Finset.sum_congr rfl ?_ + intro _j _hj + simpa [K, L] using + originCubeParentReducedSolverEnergyBoundExact_eq_constant_mul_cubeLpNorm + d m F i + _ = ((d : ℝ) * (d : ℝ)) * (K * L) := by + simp + ring + exact le_of_eq (by + calc + (∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i) + = ((d : ℝ) * (d : ℝ)) * (K * L) := hsum_eq + _ = + cubeDirichletH2RegularityConstantExact (originCube d m) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + simp [cubeDirichletH2RegularityConstantExact, K, L, originCube] + ring_nf) + +/-- Scale-indexed cube Dirichlet `H²` regularity obtained from odd reflection, +the parent-cube interior estimate, and the chosen zero-trace Poincare +constant. -/ +theorem cubeDirichletH2RegularityExact + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubeDirichletH2Regularity Q + (cubeDirichletH2RegularityConstantExact Q) := by + refine ⟨cubeDirichletH2RegularityConstantExact_nonneg Q, ?_⟩ + intro u F hF hweak + rcases + hweak.exists_hasWeakHessianOn_cube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + hF with + ⟨_uP, _huP_toFun, _huP_grad, H, hH⟩ + refine ⟨H, hH.trans ?_⟩ + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + have hsum : + (∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale F₀ i) ≤ + cubeDirichletH2RegularityConstantExact (originCube d Q.scale) * + cubeLpNorm (originCube d Q.scale) (2 : ℝ≥0∞) F₀ := + originCube_sum_reducedSolverEnergyBoundExact_le_regularityConstant_mul_cubeLpNorm + (m := Q.scale) (F := F₀) + have hnorm := cubeLpNorm_originCube_comp_addRight_eq_of_memLp Q hF + simpa [cubeDirichletH2RegularityConstantExact, F₀, z, hnorm] using! hsum + +/-- Dimension-only cube Dirichlet `H²` regularity when the forcing is measured +in the unnormalized open-cube `L²` norm. -/ +theorem cubeDirichletH2RegularityVolumeL2Exact + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubeDirichletH2RegularityVolumeL2 Q + (cubeDirichletH2RegularityVolumeL2ConstantExact d) := by + refine ⟨cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d, ?_⟩ + intro u F hF hweak + rcases (cubeDirichletH2RegularityExact Q).2 u F hF hweak with ⟨H, hH⟩ + refine ⟨H, hH.trans ?_⟩ + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let Cvol : ℝ := cubeDirichletH2RegularityVolumeL2ConstantExact d + let hFopen := memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + have hCscale : + cubeDirichletH2RegularityConstantExact Q = + (cubeVolume Q) ^ (1 / 2 : ℝ) * Cvol := by + simpa [Cvol] using + cubeDirichletH2RegularityConstantExact_eq_volume_rpow_half_mul_volumeL2ConstantExact Q + have hnorm : + ‖toScalarL2 hFopen‖ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * L := by + simpa [L, hFopen] using + norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two Q hF + calc + cubeDirichletH2RegularityConstantExact Q * + cubeLpNorm Q (2 : ℝ≥0∞) F + = ((cubeVolume Q) ^ (1 / 2 : ℝ) * Cvol) * L := by + rw [hCscale] + _ = Cvol * ((cubeVolume Q) ^ (1 / 2 : ℝ) * L) := by + ring + _ = Cvol * ‖toScalarL2 hFopen‖ := by + rw [hnorm] + _ ≤ + cubeDirichletH2RegularityVolumeL2ConstantExact d * + ‖toScalarL2 (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖ := by + exact le_rfl + +/-- There exists a dimension-only constant for the unnormalized open-cube +`L²` Dirichlet `H²` estimate. -/ +theorem exists_cubeDirichletH2RegularityVolumeL2InDimension + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CubeDirichletH2RegularityVolumeL2InDimension d C := by + refine ⟨cubeDirichletH2RegularityVolumeL2ConstantExact d, ?_⟩ + exact ⟨cubeDirichletH2RegularityVolumeL2ConstantExact_nonneg d, + fun Q => cubeDirichletH2RegularityVolumeL2Exact Q⟩ + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/SolverEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/SolverEnergy.lean new file mode 100644 index 0000000000..6fd82685e5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeDirichletH2/SolverEnergy.lean @@ -0,0 +1,723 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeDirichletH2.EnergyBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace + +/-! # Solver Energy -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Pointwise + +noncomputable section + +namespace CubeDirichletWeakPoissonProblem + +variable {d : ℕ} {m : ℤ} {u : H10Function (openCubeSet (originCube d m))} + {F : Vec d → ℝ} + +private theorem le_of_sq_le_mul_self_right {G A : ℝ} + (hG : 0 ≤ G) (hA : 0 ≤ A) (h : G ^ 2 ≤ A * G) : + G ≤ A := by + by_cases hzero : G = 0 + · rw [hzero] + exact hA + · have hGpos : 0 < G := lt_of_le_of_ne hG (Ne.symm hzero) + have hmul : G * G ≤ A * G := by + simpa [pow_two] using h + rw [mul_comm A G] at hmul + exact (mul_le_mul_iff_right₀ hGpos).mp hmul + +/-- A chosen zero-trace Poincare constant on the unit centered origin cube. -/ +noncomputable def originCubeUnitZeroTraceH1CoerciveConstant + (d : ℕ) [NeZero d] : ℝ := + Classical.choose + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d 0)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0))) + +theorem originCubeUnitZeroTraceH1CoerciveConstant_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ originCubeUnitZeroTraceH1CoerciveConstant d := by + exact + (Classical.choose_spec + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d 0)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)))).1 + +theorem originCubeUnitZeroTraceH1CoerciveConstant_bound + [NeZero d] (u : H10Function (openCubeSet (originCube d 0))) : + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeUnitZeroTraceH1CoerciveConstant d * + u.toH1Function.gradientCoordL2NormSum := by + exact + (Classical.choose_spec + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d 0)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)))).2 u + +/-- The scale-sharp zero-trace Poincare constant on centered origin cubes, +obtained by dilating the unit centered cube estimate. -/ +noncomputable def originCubeZeroTraceH1CoerciveConstant + (d : ℕ) [NeZero d] (m : ℤ) : ℝ := + cubeScaleFactor (originCube d m) * + originCubeUnitZeroTraceH1CoerciveConstant d + +theorem originCubeZeroTraceH1CoerciveConstant_nonneg + (d : ℕ) [NeZero d] (m : ℤ) : + 0 ≤ originCubeZeroTraceH1CoerciveConstant d m := by + exact mul_nonneg + (le_of_lt (by + dsimp [cubeScaleFactor, originCube] + positivity)) + (originCubeUnitZeroTraceH1CoerciveConstant_nonneg d) + +private theorem originCubeZeroTraceH1CoerciveConstant_bound_smul_unit + [NeZero d] (m : ℤ) : + ∀ u : H10Function + (cubeScaleFactor (originCube d m) • openCubeSet (originCube d 0)), + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeZeroTraceH1CoerciveConstant d m * + u.toH1Function.gradientCoordL2NormSum := by + let s : ℝ := cubeScaleFactor (originCube d m) + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + have hs : 0 < s := by + dsimp [s, cubeScaleFactor, originCube] + positivity + intro u + let v : H10Function U0 := u.unscale hs + have hunit : + ‖v.toH1Function.toScalarL2‖ ≤ + originCubeUnitZeroTraceH1CoerciveConstant d * + v.toH1Function.gradientCoordL2NormSum := + originCubeUnitZeroTraceH1CoerciveConstant_bound v + have hvalue : + ‖v.toH1Function.toScalarL2‖ = + dilationL2Factor d s * ‖u.toH1Function.toScalarL2‖ := by + simpa [v, U0] using! + H1Function.norm_toScalarL2_unscale_eq + (d := d) (U := U0) hs u.toH1Function + have hgrad : + v.toH1Function.gradientCoordL2NormSum = + s * dilationL2Factor d s * + u.toH1Function.gradientCoordL2NormSum := by + simpa [v, U0] using! + H1Function.gradientCoordL2NormSum_unscale_eq + (d := d) (U := U0) hs u.toH1Function + have hscaled : + dilationL2Factor d s * ‖u.toH1Function.toScalarL2‖ ≤ + originCubeUnitZeroTraceH1CoerciveConstant d * + (s * dilationL2Factor d s * + u.toH1Function.gradientCoordL2NormSum) := by + simpa [hvalue, hgrad] using hunit + have hf_pos : 0 < dilationL2Factor d s := + dilationL2Factor_pos (d := d) hs + have hscaled' : + dilationL2Factor d s * ‖u.toH1Function.toScalarL2‖ ≤ + dilationL2Factor d s * + ((s * originCubeUnitZeroTraceH1CoerciveConstant d) * + u.toH1Function.gradientCoordL2NormSum) := by + calc + dilationL2Factor d s * ‖u.toH1Function.toScalarL2‖ + ≤ originCubeUnitZeroTraceH1CoerciveConstant d * + (s * dilationL2Factor d s * + u.toH1Function.gradientCoordL2NormSum) := hscaled + _ = + dilationL2Factor d s * + ((s * originCubeUnitZeroTraceH1CoerciveConstant d) * + u.toH1Function.gradientCoordL2NormSum) := by + ring + have hscaled'' : + dilationL2Factor d s * ‖u.toH1Function.toScalarL2‖ ≤ + dilationL2Factor d s * + (originCubeZeroTraceH1CoerciveConstant d m * + u.toH1Function.gradientCoordL2NormSum) := by + simpa [originCubeZeroTraceH1CoerciveConstant, s, mul_assoc] using hscaled' + exact (mul_le_mul_iff_right₀ hf_pos).mp hscaled'' + +theorem originCubeZeroTraceH1CoerciveConstant_bound + [NeZero d] : + ∀ u : H10Function (openCubeSet (originCube d m)), + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeZeroTraceH1CoerciveConstant d m * + u.toH1Function.gradientCoordL2NormSum := by + let s : ℝ := cubeScaleFactor (originCube d m) + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + have hU : openCubeSet (originCube d m) = s • U0 := by + simpa [s, U0] using openCubeSet_originCube_eq_smul_unit d m + rw [hU] + exact originCubeZeroTraceH1CoerciveConstant_bound_smul_unit (d := d) m + +/-- The zero-trace Poincare constant converted to the Hilbert-vector gradient +norm used by the interior estimate. -/ +noncomputable def originCubeZeroTraceH1HilbertCoerciveConstant + (d : ℕ) [NeZero d] (m : ℤ) : ℝ := + originCubeZeroTraceH1CoerciveConstant d m * d + +theorem originCubeZeroTraceH1HilbertCoerciveConstant_nonneg + (d : ℕ) [NeZero d] (m : ℤ) : + 0 ≤ originCubeZeroTraceH1HilbertCoerciveConstant d m := by + exact mul_nonneg + (originCubeZeroTraceH1CoerciveConstant_nonneg d m) + (Nat.cast_nonneg d) + +theorem originCubeZeroTraceH1HilbertCoerciveConstant_bound + [NeZero d] (u : H10Function (openCubeSet (originCube d m))) : + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeZeroTraceH1HilbertCoerciveConstant d m * + ‖u.toH1Function.gradToHilbertVectorL2‖ := by + let C₀ : ℝ := originCubeZeroTraceH1CoerciveConstant d m + have hC₀_nonneg : 0 ≤ C₀ := by + dsimp [C₀] + exact originCubeZeroTraceH1CoerciveConstant_nonneg d m + have hvec : + u.toH1Function.gradientCoordL2NormSum ≤ + d * ‖u.toH1Function.gradToHilbertVectorL2‖ := by + calc + u.toH1Function.gradientCoordL2NormSum + ≤ d * ‖u.toH1Function.gradToVectorL2‖ := + u.toH1Function.gradientCoordL2NormSum_le + _ ≤ d * ‖u.toH1Function.gradToHilbertVectorL2‖ := by + exact mul_le_mul_of_nonneg_left + u.toH1Function.norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 + (Nat.cast_nonneg d) + calc + ‖u.toH1Function.toScalarL2‖ + ≤ C₀ * u.toH1Function.gradientCoordL2NormSum := by + simpa [C₀] using originCubeZeroTraceH1CoerciveConstant_bound u + _ ≤ C₀ * (d * ‖u.toH1Function.gradToHilbertVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hvec hC₀_nonneg + _ = + originCubeZeroTraceH1HilbertCoerciveConstant d m * + ‖u.toH1Function.gradToHilbertVectorL2‖ := by + simp [originCubeZeroTraceH1HilbertCoerciveConstant, C₀] + ring + +/-- Testing the Dirichlet weak equation with the solution and using zero-trace +Poincare controls the gradient by the normalized forcing norm. -/ +theorem norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact + [NeZero d] + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖u.toH1Function.gradToHilbertVectorL2‖ ≤ + originCubeZeroTraceH1HilbertCoerciveConstant d m * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F) := by + let Q : TriadicCube d := originCube d m + let Gnorm : ℝ := ‖u.toH1Function.gradToHilbertVectorL2‖ + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [Q, MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure (originCube d m) hF + have hgrad_integral : + ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume = + Gnorm ^ 2 := by + have hinner : + ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume = + inner ℝ u.toH1Function.gradToHilbertVectorL2 + u.toH1Function.gradToHilbertVectorL2 := by + simpa [H1Function.gradToHilbertVectorL2, Gnorm] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet Q) + u.toH1Function.grad_memVectorL2 + u.toH1Function.grad_memVectorL2).symm + rw [hinner] + exact real_inner_self_eq_norm_sq u.toH1Function.gradToHilbertVectorL2 + have hweak_u : + ∫ y in openCubeSet Q, + vecDot (u.toH1Function.grad y) (u.toH1Function.grad y) + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, F y * u.toH1Function y + ∂MeasureTheory.volume := by + simpa [Q] using hweak u + have hGsq_rhs : + Gnorm ^ 2 = + ∫ y in openCubeSet Q, F y * u.toH1Function y + ∂MeasureTheory.volume := by + rw [← hgrad_integral] + exact hweak_u + have hpair_abs : + |∫ y in openCubeSet Q, F y * u.toH1Function y + ∂MeasureTheory.volume| ≤ + ‖toScalarL2 hFopen‖ * ‖u.toH1Function.toScalarL2‖ := by + have hinner := inner_toScalarL2_eq_integral_mul + (U := openCubeSet Q) hFopen u.toH1Function.memL2 + rw [← hinner] + simpa [H1Function.toScalarL2] using + abs_real_inner_le_norm (toScalarL2 hFopen) u.toH1Function.toScalarL2 + have hvalue : + ‖u.toH1Function.toScalarL2‖ ≤ C * Gnorm := by + simpa [C, Gnorm] using + originCubeZeroTraceH1HilbertCoerciveConstant_bound u + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact originCubeZeroTraceH1HilbertCoerciveConstant_nonneg d m + have hsq : + Gnorm ^ 2 ≤ (‖toScalarL2 hFopen‖ * C) * Gnorm := by + calc + Gnorm ^ 2 + ≤ |∫ y in openCubeSet Q, F y * u.toH1Function y + ∂MeasureTheory.volume| := by + rw [hGsq_rhs] + exact le_abs_self _ + _ ≤ ‖toScalarL2 hFopen‖ * ‖u.toH1Function.toScalarL2‖ := hpair_abs + _ ≤ ‖toScalarL2 hFopen‖ * (C * Gnorm) := by + exact mul_le_mul_of_nonneg_left hvalue (norm_nonneg _) + _ = (‖toScalarL2 hFopen‖ * C) * Gnorm := by ring + have hG_le : + Gnorm ≤ ‖toScalarL2 hFopen‖ * C := by + exact le_of_sq_le_mul_self_right + (norm_nonneg _) (mul_nonneg (norm_nonneg _) hC_nonneg) hsq + have hFnorm : + ‖toScalarL2 hFopen‖ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + simpa [Q] using + norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two Q hF + calc + ‖u.toH1Function.gradToHilbertVectorL2‖ = Gnorm := rfl + _ ≤ ‖toScalarL2 hFopen‖ * C := hG_le + _ = + C * ((cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F) := by + rw [hFnorm] + ring + _ = + originCubeZeroTraceH1HilbertCoerciveConstant d m * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F) := by + simp [Q, C] + +/-- The solution value is controlled by the forcing norm after one additional +zero-trace Poincare step. -/ +theorem norm_toScalarL2_le_solverCubeLpNorm_exact + [NeZero d] + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖u.toH1Function.toScalarL2‖ ≤ + originCubeZeroTraceH1HilbertCoerciveConstant d m * + (originCubeZeroTraceH1HilbertCoerciveConstant d m * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F)) := by + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + have hC_nonneg : 0 ≤ C := by + dsimp [C] + exact originCubeZeroTraceH1HilbertCoerciveConstant_nonneg d m + calc + ‖u.toH1Function.toScalarL2‖ + ≤ C * ‖u.toH1Function.gradToHilbertVectorL2‖ := by + simpa [C] using + originCubeZeroTraceH1HilbertCoerciveConstant_bound u + _ ≤ C * + (C * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F)) := by + exact mul_le_mul_of_nonneg_left + (by + simpa [C] using + norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact hweak hF) + hC_nonneg + +/-- Scale-sharp forcing-facing odd-reflected parent reduced energy expression +for Dirichlet solutions, using the chosen zero-trace Poincare constant. -/ +noncomputable def originCubeParentReducedSolverEnergyBoundExact + (d : ℕ) [NeZero d] (m : ℤ) (F : Vec d → ℝ) (_i : Fin d) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) * L + ((4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2)) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2) * + ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))))) ^ + (1 / (2 : ℝ)) + +private noncomputable def originCubeParentReducedSolverEnergyInsideExact + (d : ℕ) [NeZero d] (m : ℤ) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)))) + +private theorem originCubeParentReducedSolverEnergyInsideExact_nonneg + (d : ℕ) [NeZero d] (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyInsideExact d m := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hV_nonneg : 0 ≤ V := by + dsimp [V] + exact cubeVolume_nonneg Q + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + positivity + have hmain_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) := by + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) hV_nonneg) + · refine mul_nonneg hKinner_nonneg ?_ + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) (sq_nonneg _)) + · exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg (by positivity) (sq_nonneg _))) + dsimp [originCubeParentReducedSolverEnergyInsideExact, Q, Qp, C, V, B, Kinner, Kouter] + exact mul_nonneg (by norm_num) hmain_nonneg + +/-- The coefficient obtained by factoring the normalized forcing norm out of +the exact Dirichlet solver-energy bound. -/ +noncomputable def originCubeParentReducedSolverEnergyConstantExact + (d : ℕ) [NeZero d] (m : ℤ) : ℝ := + (originCubeParentReducedSolverEnergyInsideExact d m) ^ (1 / (2 : ℝ)) + +theorem originCubeParentReducedSolverEnergyConstantExact_nonneg + (d : ℕ) [NeZero d] (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyConstantExact d m := by + unfold originCubeParentReducedSolverEnergyConstantExact + exact Real.rpow_nonneg + (originCubeParentReducedSolverEnergyInsideExact_nonneg d m) _ + +private theorem originCubeParentReducedSolverEnergyInsideExact_eq_volume_mul_unit + (d : ℕ) [NeZero d] (m : ℤ) : + originCubeParentReducedSolverEnergyInsideExact d m = + cubeVolume (originCube d m) * + originCubeParentReducedSolverEnergyInsideExact d 0 := by + let s : ℝ := (3 : ℝ) ^ m + let C₀ : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d 0 + have hs_pos : 0 < s := by + dsimp [s] + exact zpow_pos (by norm_num : (0 : ℝ) < 3) m + have hs_ne : s ≠ 0 := hs_pos.ne' + have hV_m : cubeVolume (originCube d m) = s ^ d := by + simp [cubeVolume_eq_scaleFactor_pow, s] + have hV_0 : cubeVolume (originCube d 0) = 1 := by + simp [cubeVolume_eq_scaleFactor_pow] + have hC_m : + originCubeZeroTraceH1HilbertCoerciveConstant d m = s * C₀ := by + dsimp [originCubeZeroTraceH1HilbertCoerciveConstant, + originCubeZeroTraceH1CoerciveConstant, C₀, s, cubeScaleFactor, originCube] + ring + have hC_0 : + originCubeZeroTraceH1HilbertCoerciveConstant d 0 = C₀ := rfl + have hR_m : cubeRadius (originCube d (m + 1)) = (3 / 2 : ℝ) * s := by + dsimp [cubeRadius, cubeScaleFactor, originCube, s] + rw [zpow_add₀] + · norm_num + ring + · norm_num + have hR_0 : cubeRadius (originCube d (1 : ℤ)) = (3 / 2 : ℝ) := by + norm_num [cubeRadius, cubeScaleFactor, originCube] + have hBsq : ((s ^ d) ^ (1 / 2 : ℝ)) ^ 2 = s ^ d := by + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt (by positivity) + dsimp [originCubeParentReducedSolverEnergyInsideExact] + rw [hV_m, hV_0, hC_m, hC_0, hR_m, hR_0] + norm_num + ring_nf + rw [hBsq] + field_simp [hs_ne] + +theorem originCubeParentReducedSolverEnergyConstantExact_volume_cancel + (d : ℕ) [NeZero d] (m : ℤ) : + ((cubeVolume (originCube d m))⁻¹) ^ (1 / 2 : ℝ) * + originCubeParentReducedSolverEnergyConstantExact d m = + originCubeParentReducedSolverEnergyConstantExact d 0 := by + let V : ℝ := cubeVolume (originCube d m) + let A : ℝ := originCubeParentReducedSolverEnergyInsideExact d 0 + have hV_pos : 0 < V := by + dsimp [V] + exact cubeVolume_pos (originCube d m) + have hV_nonneg : 0 ≤ V := le_of_lt hV_pos + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact originCubeParentReducedSolverEnergyInsideExact_nonneg d 0 + have hinside : + originCubeParentReducedSolverEnergyInsideExact d m = V * A := by + dsimp [V, A] + exact originCubeParentReducedSolverEnergyInsideExact_eq_volume_mul_unit d m + have hV_cancel : + (V⁻¹) ^ (1 / 2 : ℝ) * (V ^ (1 / 2 : ℝ)) = 1 := by + rw [Real.inv_rpow hV_nonneg (1 / 2 : ℝ)] + exact inv_mul_cancel₀ (Real.rpow_pos_of_pos hV_pos _).ne' + calc + ((cubeVolume (originCube d m))⁻¹) ^ (1 / 2 : ℝ) * + originCubeParentReducedSolverEnergyConstantExact d m + = (V⁻¹) ^ (1 / 2 : ℝ) * + ((V * A) ^ (1 / 2 : ℝ)) := by + simp [originCubeParentReducedSolverEnergyConstantExact, V, A, hinside] + _ = (V⁻¹) ^ (1 / 2 : ℝ) * + (V ^ (1 / 2 : ℝ) * A ^ (1 / 2 : ℝ)) := by + rw [Real.mul_rpow hV_nonneg hA_nonneg] + _ = A ^ (1 / 2 : ℝ) := by + rw [← mul_assoc, hV_cancel, one_mul] + _ = originCubeParentReducedSolverEnergyConstantExact d 0 := by + simp [originCubeParentReducedSolverEnergyConstantExact, A] + +theorem originCubeParentReducedSolverEnergyBoundExact_eq_constant_mul_cubeLpNorm + (d : ℕ) [NeZero d] (m : ℤ) (F : Vec d → ℝ) (i : Fin d) : + originCubeParentReducedSolverEnergyBoundExact d m F i = + originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hfactor : + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (V * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * (B * L)) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * (B * L))) ^ 2)))) = + originCubeParentReducedSolverEnergyInsideExact d m * L ^ 2 := by + dsimp [originCubeParentReducedSolverEnergyInsideExact, Q, Qp, C, V, B, L, Kinner, Kouter] + rw [Real.rpow_two] + ring + calc + originCubeParentReducedSolverEnergyBoundExact d m F i + = ((originCubeParentReducedSolverEnergyInsideExact d m) * L ^ 2) ^ + (1 / (2 : ℝ)) := by + dsimp [originCubeParentReducedSolverEnergyBoundExact, Q, Qp, C, V, L, B, + Kinner, Kouter] + rw [hfactor] + _ = (originCubeParentReducedSolverEnergyInsideExact d m) ^ (1 / (2 : ℝ)) * + (L ^ 2) ^ (1 / (2 : ℝ)) := by + rw [Real.mul_rpow + (originCubeParentReducedSolverEnergyInsideExact_nonneg d m) (sq_nonneg L)] + _ = originCubeParentReducedSolverEnergyConstantExact d m * L := by + unfold originCubeParentReducedSolverEnergyConstantExact + rw [show (L ^ 2) ^ (1 / (2 : ℝ)) = L by + rw [← Real.sqrt_eq_rpow, Real.sqrt_sq hL_nonneg]] + +/-- The norm-energy bound is controlled by the explicit forcing-facing +Dirichlet solver energy expression. -/ +theorem originCubeParentReducedNormEnergyBound_le_solverEnergyBoundExact + [NeZero d] + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (i : Fin d) : + originCubeParentReducedNormEnergyBound u F i ≤ + originCubeParentReducedSolverEnergyBoundExact d m F i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := originCubeZeroTraceH1HilbertCoerciveConstant d m + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) * L + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + let A : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * + ((3 : ℝ) ^ d * ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖u.toH1Function.toScalarL2‖ ^ 2))) + let Benergy : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) + have hgrad_sq : + ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2 ≤ (C * B) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact hweak hF) + 2 + have hvalue_sq : + ‖u.toH1Function.toScalarL2‖ ^ 2 ≤ (C * (C * B)) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_toScalarL2_le_solverCubeLpNorm_exact hweak hF) + 2 + have hthree_nonneg : 0 ≤ (3 : ℝ) ^ d := by positivity + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + positivity + have hinner : + (2 : ℝ) * + ((3 : ℝ) ^ d * ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖u.toH1Function.toScalarL2‖ ^ 2)) ≤ + (2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)) := by + refine add_le_add ?_ ?_ + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hgrad_sq hthree_nonneg) + (by norm_num) + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hvalue_sq hthree_nonneg) + hKouter_nonneg) + (by norm_num) + have hAB : A ≤ Benergy := by + dsimp [A, Benergy] + exact add_le_add_right (mul_le_mul_of_nonneg_left hinner hKinner_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * Benergy := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hL_sq_nonneg : 0 ≤ L ^ (2 : ℝ) := + Real.rpow_nonneg hL_nonneg _ + have hforce_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg + (mul_nonneg (cubeVolume_nonneg Q) hL_sq_nonneg)) + have hgrad_term_nonneg : + 0 ≤ (2 : ℝ) * + ((3 : ℝ) ^ d * ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg (sq_nonneg _)) + have hvalue_term_nonneg : + 0 ≤ (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * ‖u.toH1Function.toScalarL2‖ ^ 2)) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg hthree_nonneg (sq_nonneg _))) + have hinner_orig_nonneg : + 0 ≤ + (2 : ℝ) * + ((3 : ℝ) ^ d * + ‖u.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖u.toH1Function.toScalarL2‖ ^ 2)) := + add_nonneg hgrad_term_nonneg hvalue_term_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg hforce_nonneg + (mul_nonneg hKinner_nonneg hinner_orig_nonneg) + exact mul_nonneg (by norm_num) hA_nonneg + simpa [originCubeParentReducedNormEnergyBound, + originCubeParentReducedSolverEnergyBoundExact, Q, Qp, C, L, B, Kinner, + Kouter, A, Benergy] using + Real.rpow_le_rpow h4A_nonneg h4AB + (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +/-- The fixed-radii reflected-parent Hessian estimate controlled by the +forcing-facing Dirichlet solver energy expression. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + [NeZero d] + (hweak : CubeDirichletWeakPoissonProblem (originCube d m) u F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeDirichletOddReflectionScalar (originCube d m) + u.toH1Function.toFun ∧ + uP.grad = + cubeDirichletOddReflectionVectorField (originCube d m) + (fun y => u.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) u.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i := by + rcases + hweak.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + originCubeParentReducedNormEnergyBound_le_solverEnergyBoundExact hweak hF i + +end CubeDirichletWeakPoissonProblem + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ.lean new file mode 100644 index 0000000000..757836d385 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ.lean @@ -0,0 +1,21 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.FoldedAndWeakScalar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Regularity + +/-! # Cube Neumann W22CZ -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Definitions.lean new file mode 100644 index 0000000000..15439ebc10 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Definitions.lean @@ -0,0 +1,922 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + + +/-- The folded upper-face test, normalized to the mean-zero Neumann test space. + +The normalization subtracts a constant only, so its weak gradient is still the +folded classical gradient. -/ +def foldedCubeUpperFaceMeanZeroH1Test {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : H1MeanZeroFunction (openCubeSet Q) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + exact (foldedCubeUpperFaceH1Test Q i hφ).toMeanZero + +/-- The folded lower-face test, normalized to the mean-zero Neumann test space. + +The normalization subtracts a constant only, so its weak gradient is still the +folded classical gradient. -/ +def foldedCubeLowerFaceMeanZeroH1Test {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : H1MeanZeroFunction (openCubeSet Q) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + exact (foldedCubeLowerFaceH1Test Q i hφ).toMeanZero + +@[simp] theorem foldedCubeUpperFaceMeanZeroH1Test_grad {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function.grad x = + euclideanGradient (foldedCubeUpperFaceTest Q i φ) x := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + simp [foldedCubeUpperFaceMeanZeroH1Test] + +@[simp] theorem foldedCubeLowerFaceMeanZeroH1Test_grad {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function.grad x = + euclideanGradient (foldedCubeLowerFaceTest Q i φ) x := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + simp [foldedCubeLowerFaceMeanZeroH1Test] + +/-- If the forcing has zero cube average, subtracting the average from a folded +upper-face test does not change the forcing pairing. -/ +theorem setIntegral_mul_foldedCubeUpperFaceMeanZeroH1Test_eq_of_cubeAverage_eq_zero + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hfold : + MeasureTheory.Integrable + (fun x => F x * foldedCubeUpperFaceTest Q i φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let c : ℝ := integralAverage (openCubeSet Q) (foldedCubeUpperFaceH1Test Q i hφ) + have hFint_zero : + ∫ x in openCubeSet Q, F x ∂MeasureTheory.volume = 0 := by + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage, hmean, mul_zero] + calc + ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x - F x * c + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro x _hx + simp [foldedCubeUpperFaceMeanZeroH1Test, c, mul_sub] + _ = ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, F x * c ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hfold (hF.mul_const c)] + _ = ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_mul_const, hFint_zero] + ring + +/-- If the forcing has zero cube average, subtracting the average from a folded +lower-face test does not change the forcing pairing. -/ +theorem setIntegral_mul_foldedCubeLowerFaceMeanZeroH1Test_eq_of_cubeAverage_eq_zero + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hfold : + MeasureTheory.Integrable + (fun x => F x * foldedCubeLowerFaceTest Q i φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let c : ℝ := integralAverage (openCubeSet Q) (foldedCubeLowerFaceH1Test Q i hφ) + have hFint_zero : + ∫ x in openCubeSet Q, F x ∂MeasureTheory.volume = 0 := by + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage, hmean, mul_zero] + calc + ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x - F x * c + ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro x _hx + simp [foldedCubeLowerFaceMeanZeroH1Test, c, mul_sub] + _ = ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, F x * c ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hfold (hF.mul_const c)] + _ = ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_mul_const, hFint_zero] + ring + +/-- Split the forcing pairing against a folded upper-face test into the +original cube and its reflected upper-face neighbor. -/ +theorem setIntegral_mul_foldedCubeUpperFaceTest_reflection_split + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + let A : Vec d → ℝ := fun x => F x * φ x + let B : Vec d → ℝ := fun x => F x * φ (cubeUpperFaceReflection Q i x) + have hreflect := + setIntegral_cubeUpperFaceNeighbor_comp_reflection Q i B + calc + ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, A x + B x ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro x _hx + simp [A, B, foldedCubeUpperFaceTest, foldedCoordFaceTest, + cubeUpperFaceReflection, mul_add] + _ = ∫ x in openCubeSet Q, A x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, B x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hmain hreflected] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + rw [show (∫ x in openCubeSet Q, A x ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume by rfl] + rw [show (∫ x in openCubeSet Q, B x ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, + F x * φ (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume by rfl] + rw [← hreflect] + apply congrArg + (fun t => + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + t) + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + simp [B] + +/-- Split the forcing pairing against a folded lower-face test into the +original cube and its reflected lower-face neighbor. -/ +theorem setIntegral_mul_foldedCubeLowerFaceTest_reflection_split + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + let A : Vec d → ℝ := fun x => F x * φ x + let B : Vec d → ℝ := fun x => F x * φ (cubeLowerFaceReflection Q i x) + have hreflect := + setIntegral_cubeLowerFaceNeighbor_comp_reflection Q i B + calc + ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, A x + B x ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro x _hx + simp [A, B, foldedCubeLowerFaceTest, foldedCoordFaceTest, + cubeLowerFaceReflection, mul_add] + _ = ∫ x in openCubeSet Q, A x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, B x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hmain hreflected] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + rw [show (∫ x in openCubeSet Q, A x ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume by rfl] + rw [show (∫ x in openCubeSet Q, B x ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, + F x * φ (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume by rfl] + rw [← hreflect] + apply congrArg + (fun t => + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + t) + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + simp [B] + +/-- Integrability of the upper-face folded forcing pairing follows from +integrability of the original and reflected pieces. -/ +theorem integrable_mul_foldedCubeUpperFaceTest_of_integrable_split + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => F x * foldedCubeUpperFaceTest Q i φ x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + let A : Vec d → ℝ := fun x => F x * φ x + let B : Vec d → ℝ := fun x => F x * φ (cubeUpperFaceReflection Q i x) + have hsum : + MeasureTheory.Integrable (fun x => A x + B x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hmain.add hreflected + refine hsum.congr ?_ + filter_upwards with x + simp [A, B, foldedCubeUpperFaceTest, foldedCoordFaceTest, + cubeUpperFaceReflection, mul_add] + +/-- Integrability of the lower-face folded forcing pairing follows from +integrability of the original and reflected pieces. -/ +theorem integrable_mul_foldedCubeLowerFaceTest_of_integrable_split + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => F x * foldedCubeLowerFaceTest Q i φ x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + let A : Vec d → ℝ := fun x => F x * φ x + let B : Vec d → ℝ := fun x => F x * φ (cubeLowerFaceReflection Q i x) + have hsum : + MeasureTheory.Integrable (fun x => A x + B x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hmain.add hreflected + refine hsum.congr ?_ + filter_upwards with x + simp [A, B, foldedCubeLowerFaceTest, foldedCoordFaceTest, + cubeLowerFaceReflection, mul_add] + +/-- Piecewise gradient-pairing integrand for the upper-face doubled domain: +the original field on `Q`, and the reflected field on the upper neighbor. -/ +def upperFaceReflectedGradientPairingIntegrand {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + (φ : Vec d → ℝ) : Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + vecDot (G x) (euclideanGradient φ x) + else + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) + +/-- Piecewise gradient-pairing integrand for the lower-face doubled domain: +the original field on `Q`, and the reflected field on the lower neighbor. -/ +def lowerFaceReflectedGradientPairingIntegrand {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + (φ : Vec d → ℝ) : Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + vecDot (G x) (euclideanGradient φ x) + else + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) + +/-- Piecewise forcing integrand for the upper-face doubled domain: the +original forcing on `Q`, and the reflected forcing on the upper neighbor. -/ +def upperFaceReflectedForcingIntegrand {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F φ : Vec d → ℝ) : + Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + F x * φ x + else + F (cubeUpperFaceReflection Q i x) * φ x + +/-- Piecewise forcing integrand for the lower-face doubled domain: the +original forcing on `Q`, and the reflected forcing on the lower neighbor. -/ +def lowerFaceReflectedForcingIntegrand {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F φ : Vec d → ℝ) : + Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + F x * φ x + else + F (cubeLowerFaceReflection Q i x) * φ x + +/-- Even-reflected vector field across the upper face of `Q`, written on the +doubled domain by using the original field on `Q` and the reflected field on +the neighboring cube. -/ +def upperFaceReflectedVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) : + Vec d → Vec d := by + classical + exact fun x => + if x ∈ openCubeSet Q then + G x + else + coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) + +/-- Even-reflected vector field across the lower face of `Q`. -/ +def lowerFaceReflectedVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) : + Vec d → Vec d := by + classical + exact fun x => + if x ∈ openCubeSet Q then + G x + else + coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) + +/-- Even-reflected scalar forcing across the upper face of `Q`. -/ +def upperFaceReflectedScalar {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) : + Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + F x + else + F (cubeUpperFaceReflection Q i x) + +/-- Even-reflected scalar forcing across the lower face of `Q`. -/ +def lowerFaceReflectedScalar {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) : + Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet Q then + F x + else + F (cubeLowerFaceReflection Q i x) + +/-- Even-reflected vector field on the one-coordinate lower/original/upper +face-neighbor slab. -/ +def faceNeighborSlabReflectedVectorField {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) : + Vec d → Vec d := by + classical + exact fun x => + if x ∈ openCubeSet (cubeLowerFaceNeighbor Q i) then + coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) + else if x ∈ openCubeSet Q then + G x + else + coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) + +/-- Even-reflected scalar forcing on the one-coordinate lower/original/upper +face-neighbor slab. -/ +def faceNeighborSlabReflectedScalar {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) : + Vec d → ℝ := by + classical + exact fun x => + if x ∈ openCubeSet (cubeLowerFaceNeighbor Q i) then + F (cubeLowerFaceReflection Q i x) + else if x ∈ openCubeSet Q then + F x + else + F (cubeUpperFaceReflection Q i x) + +@[simp] theorem faceNeighborSlabReflectedVectorField_of_mem_lower {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + faceNeighborSlabReflectedVectorField Q i G x = + coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) := by + simp [faceNeighborSlabReflectedVectorField, hx] + +@[simp] theorem faceNeighborSlabReflectedScalar_of_mem_lower {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + faceNeighborSlabReflectedScalar Q i F x = + F (cubeLowerFaceReflection Q i x) := by + simp [faceNeighborSlabReflectedScalar, hx] + +@[simp] theorem faceNeighborSlabReflectedVectorField_of_mem_cube {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + faceNeighborSlabReflectedVectorField Q i G x = G x := by + have hxL : x ∉ openCubeSet (cubeLowerFaceNeighbor Q i) := by + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hx) + simp [faceNeighborSlabReflectedVectorField, hx, hxL] + +@[simp] theorem faceNeighborSlabReflectedScalar_of_mem_cube {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + faceNeighborSlabReflectedScalar Q i F x = F x := by + have hxL : x ∉ openCubeSet (cubeLowerFaceNeighbor Q i) := by + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hx) + simp [faceNeighborSlabReflectedScalar, hx, hxL] + +@[simp] theorem faceNeighborSlabReflectedVectorField_of_mem_upper {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + faceNeighborSlabReflectedVectorField Q i G x = + coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) := by + have hxL : x ∉ openCubeSet (cubeLowerFaceNeighbor Q i) := by + intro hxL + exact + (Set.disjoint_left.mp + (disjoint_cubeLowerFaceNeighbor_cubeUpperFaceNeighbor Q i) + hxL) hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) + hxQ) hx + simp [faceNeighborSlabReflectedVectorField, hxL, hxQ] + +@[simp] theorem faceNeighborSlabReflectedScalar_of_mem_upper {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + faceNeighborSlabReflectedScalar Q i F x = + F (cubeUpperFaceReflection Q i x) := by + have hxL : x ∉ openCubeSet (cubeLowerFaceNeighbor Q i) := by + intro hxL + exact + (Set.disjoint_left.mp + (disjoint_cubeLowerFaceNeighbor_cubeUpperFaceNeighbor Q i) + hxL) hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) + hxQ) hx + simp [faceNeighborSlabReflectedScalar, hxL, hxQ] + +/-- On the lower slab cube, the all-coordinate reflected scalar agrees with +the one-coordinate slab reflected scalar. -/ +theorem cubeCoordinateFoldReflectedScalar_eq_faceNeighborSlabReflectedScalar_of_mem_lower + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + cubeCoordinateFoldReflectedScalar Q F x = + faceNeighborSlabReflectedScalar Q i F x := by + rw [faceNeighborSlabReflectedScalar_of_mem_lower Q i F hx] + simp [cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeLowerFaceReflection_of_mem_neighbor Q i hx] + +/-- On the original cube, the all-coordinate reflected scalar agrees with the +one-coordinate slab reflected scalar. -/ +theorem cubeCoordinateFoldReflectedScalar_eq_faceNeighborSlabReflectedScalar_of_mem_cube + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + cubeCoordinateFoldReflectedScalar Q F x = + faceNeighborSlabReflectedScalar Q i F x := by + rw [faceNeighborSlabReflectedScalar_of_mem_cube Q i F hx] + exact cubeCoordinateFoldReflectedScalar_eq_self_of_mem_openCubeSet Q F hx + +/-- On the upper slab cube, the all-coordinate reflected scalar agrees with +the one-coordinate slab reflected scalar. -/ +theorem cubeCoordinateFoldReflectedScalar_eq_faceNeighborSlabReflectedScalar_of_mem_upper + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (F : Vec d → ℝ) + {x : Vec d} (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + cubeCoordinateFoldReflectedScalar Q F x = + faceNeighborSlabReflectedScalar Q i F x := by + rw [faceNeighborSlabReflectedScalar_of_mem_upper Q i F hx] + simp [cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeUpperFaceReflection_of_mem_neighbor Q i hx] + +/-- On the lower slab cube, the all-coordinate reflected vector field agrees +with the one-coordinate slab reflected vector field. -/ +theorem cubeCoordinateFoldReflectedVectorField_eq_faceNeighborSlabReflectedVectorField_of_mem_lower + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + cubeCoordinateFoldReflectedVectorField Q G x = + faceNeighborSlabReflectedVectorField Q i G x := by + rw [faceNeighborSlabReflectedVectorField_of_mem_lower Q i G hx] + ext j + by_cases hji : j = i + · subst j + simp [cubeCoordinateFoldReflectedVectorField, + cubeCoordinateFold_eq_cubeLowerFaceReflection_of_mem_neighbor Q i hx, + cubeCoordinateFoldSign_of_mem_cubeLowerFaceNeighbor Q i hx] + · simp [cubeCoordinateFoldReflectedVectorField, + cubeCoordinateFold_eq_cubeLowerFaceReflection_of_mem_neighbor Q i hx, + cubeCoordinateFoldSign_of_mem_cubeLowerFaceNeighbor Q i hx, hji] + +/-- On the original cube, the all-coordinate reflected vector field agrees +with the one-coordinate slab reflected vector field. -/ +theorem cubeCoordinateFoldReflectedVectorField_eq_faceNeighborSlabReflectedVectorField_of_mem_cube + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + cubeCoordinateFoldReflectedVectorField Q G x = + faceNeighborSlabReflectedVectorField Q i G x := by + rw [faceNeighborSlabReflectedVectorField_of_mem_cube Q i G hx] + exact cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet Q G hx + +/-- On the upper slab cube, the all-coordinate reflected vector field agrees +with the one-coordinate slab reflected vector field. -/ +theorem cubeCoordinateFoldReflectedVectorField_eq_faceNeighborSlabReflectedVectorField_of_mem_upper + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (G : Vec d → Vec d) + {x : Vec d} (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + cubeCoordinateFoldReflectedVectorField Q G x = + faceNeighborSlabReflectedVectorField Q i G x := by + rw [faceNeighborSlabReflectedVectorField_of_mem_upper Q i G hx] + ext j + by_cases hji : j = i + · subst j + simp [cubeCoordinateFoldReflectedVectorField, + cubeCoordinateFold_eq_cubeUpperFaceReflection_of_mem_neighbor Q i hx, + cubeCoordinateFoldSign_of_mem_cubeUpperFaceNeighbor Q i hx] + · simp [cubeCoordinateFoldReflectedVectorField, + cubeCoordinateFold_eq_cubeUpperFaceReflection_of_mem_neighbor Q i hx, + cubeCoordinateFoldSign_of_mem_cubeUpperFaceNeighbor Q i hx, hji] + +/-- The upper-face reflected scalar forcing is `L²` on the doubled +cube-neighbor domain whenever the original forcing is `L²` on `Q`. -/ +theorem memScalarL2_openCubeSet_union_upperFaceReflectedScalar {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 + (openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i)) + (upperFaceReflectedScalar Q i F) := by + classical + let U := openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i) + let S := openCubeSet Q + let R : Vec d → ℝ := fun x => F (cubeUpperFaceReflection Q i x) + have hR : MemScalarL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) R := + memScalarL2_cubeUpperFaceNeighbor_comp_reflection Q i hF + have hmain : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict S) := by + exact hF.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self S) + have hreflected : + MeasureTheory.MemLp R (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict Sᶜ) := by + have hmeasure : + (MeasureTheory.volume.restrict U).restrict Sᶜ ≤ + MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i)) := by + rw [MeasureTheory.Measure.restrict_restrict + (measurableSet_openCubeSet Q).compl] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hxQ | hxN + · exact False.elim (hx.1 hxQ) + · exact hxN + exact hR.mono_measure hmeasure + have hpiece : + MeasureTheory.MemLp (S.piecewise F R) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict U) (s := S) + (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmain hreflected + simpa [MemScalarL2, volumeMeasureOn, upperFaceReflectedScalar, U, S, R, + Set.piecewise] using! hpiece + +/-- The lower-face reflected scalar forcing is `L²` on the doubled +cube-neighbor domain whenever the original forcing is `L²` on `Q`. -/ +theorem memScalarL2_openCubeSet_union_lowerFaceReflectedScalar {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 + (openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i)) + (lowerFaceReflectedScalar Q i F) := by + classical + let U := openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i) + let S := openCubeSet Q + let R : Vec d → ℝ := fun x => F (cubeLowerFaceReflection Q i x) + have hR : MemScalarL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) R := + memScalarL2_cubeLowerFaceNeighbor_comp_reflection Q i hF + have hmain : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict S) := by + exact hF.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self S) + have hreflected : + MeasureTheory.MemLp R (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict Sᶜ) := by + have hmeasure : + (MeasureTheory.volume.restrict U).restrict Sᶜ ≤ + MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i)) := by + rw [MeasureTheory.Measure.restrict_restrict + (measurableSet_openCubeSet Q).compl] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hxQ | hxN + · exact False.elim (hx.1 hxQ) + · exact hxN + exact hR.mono_measure hmeasure + have hpiece : + MeasureTheory.MemLp (S.piecewise F R) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict U) (s := S) + (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmain hreflected + simpa [MemScalarL2, volumeMeasureOn, lowerFaceReflectedScalar, U, S, R, + Set.piecewise] using! hpiece + +/-- The upper-face reflected vector field is `L²` on the doubled +cube-neighbor domain whenever the original vector field is `L²` on `Q`. -/ +theorem memVectorL2_openCubeSet_union_upperFaceReflectedVectorField {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 + (openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i)) + (upperFaceReflectedVectorField Q i G) := by + classical + let U := openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i) + let S := openCubeSet Q + let R : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) + have hR : MemVectorL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) R := + memVectorL2_cubeUpperFaceNeighbor_reflected Q i hG + have hmain : + MeasureTheory.MemLp G (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict S) := by + exact hG.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self S) + have hreflected : + MeasureTheory.MemLp R (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict Sᶜ) := by + have hmeasure : + (MeasureTheory.volume.restrict U).restrict Sᶜ ≤ + MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i)) := by + rw [MeasureTheory.Measure.restrict_restrict + (measurableSet_openCubeSet Q).compl] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hxQ | hxN + · exact False.elim (hx.1 hxQ) + · exact hxN + exact hR.mono_measure hmeasure + have hpiece : + MeasureTheory.MemLp (S.piecewise G R) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict U) (s := S) + (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmain hreflected + simpa [MemVectorL2, volumeMeasureOn, upperFaceReflectedVectorField, U, S, R, + Set.piecewise] using! hpiece + +/-- The lower-face reflected vector field is `L²` on the doubled +cube-neighbor domain whenever the original vector field is `L²` on `Q`. -/ +theorem memVectorL2_openCubeSet_union_lowerFaceReflectedVectorField {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 + (openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i)) + (lowerFaceReflectedVectorField Q i G) := by + classical + let U := openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i) + let S := openCubeSet Q + let R : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) + have hR : MemVectorL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) R := + memVectorL2_cubeLowerFaceNeighbor_reflected Q i hG + have hmain : + MeasureTheory.MemLp G (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict S) := by + exact hG.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self S) + have hreflected : + MeasureTheory.MemLp R (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict U).restrict Sᶜ) := by + have hmeasure : + (MeasureTheory.volume.restrict U).restrict Sᶜ ≤ + MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i)) := by + rw [MeasureTheory.Measure.restrict_restrict + (measurableSet_openCubeSet Q).compl] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hxQ | hxN + · exact False.elim (hx.1 hxQ) + · exact hxN + exact hR.mono_measure hmeasure + have hpiece : + MeasureTheory.MemLp (S.piecewise G R) (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict U) (s := S) + (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmain hreflected + simpa [MemVectorL2, volumeMeasureOn, lowerFaceReflectedVectorField, U, S, R, + Set.piecewise] using! hpiece + +/-- The one-coordinate slab-reflected scalar forcing is `L²` on the +lower/original/upper face-neighbor slab whenever the original forcing is `L²` +on `Q`. -/ +theorem memScalarL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedScalar + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 (cubeFaceNeighborSlabSet Q i) + (faceNeighborSlabReflectedScalar Q i F) := by + classical + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + let S := cubeFaceNeighborSlabSet Q i + let lower : Vec d → ℝ := fun x => F (cubeLowerFaceReflection Q i x) + let upper : Vec d → ℝ := fun x => F (cubeUpperFaceReflection Q i x) + have hLower : MemScalarL2 L lower := + memScalarL2_cubeLowerFaceNeighbor_comp_reflection Q i hF + have hUpper : MemScalarL2 U upper := + memScalarL2_cubeUpperFaceNeighbor_comp_reflection Q i hF + have hleft : + MeasureTheory.MemLp lower (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict S).restrict L) := by + exact hLower.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self L) + have hmid : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict M) := by + exact hF.mono_measure <| by + calc + ((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict M + ≤ (MeasureTheory.volume.restrict S).restrict M := + MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self M + _ ≤ MeasureTheory.volume.restrict M := + MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self M + have hrightMeasure : + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict Mᶜ) ≤ + MeasureTheory.volume.restrict U := by + have hMeasM : MeasurableSet M := measurableSet_openCubeSet Q + have hMeasL : MeasurableSet L := + measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i) + have hMeasML : MeasurableSet (Mᶜ ∩ Lᶜ) := + hMeasM.compl.inter hMeasL.compl + rw [MeasureTheory.Measure.restrict_restrict hMeasM.compl] + rw [MeasureTheory.Measure.restrict_restrict hMeasML] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hLM | hxU + · rcases hLM with hxL | hxM + · exact False.elim (hx.1.2 hxL) + · exact False.elim (hx.1.1 hxM) + · exact hxU + have hright : + MeasureTheory.MemLp upper (2 : ℝ≥0∞) + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict Mᶜ) := + hUpper.mono_measure hrightMeasure + have htail : + MeasureTheory.MemLp (M.piecewise F upper) (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict S).restrict Lᶜ) := + MeasureTheory.MemLp.piecewise + (μ := (MeasureTheory.volume.restrict S).restrict Lᶜ) + (s := M) (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmid hright + have hpiece : + MeasureTheory.MemLp (L.piecewise lower (M.piecewise F upper)) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict S) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict S) (s := L) + (p := (2 : ℝ≥0∞)) + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) + hleft htail + simpa [MemScalarL2, volumeMeasureOn, faceNeighborSlabReflectedScalar, + Set.piecewise, S, L, M, U, lower, upper] using! hpiece + +/-- The one-coordinate slab-reflected vector field is `L²` on the +lower/original/upper face-neighbor slab whenever the original vector field is +`L²` on `Q`. -/ +theorem memVectorL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 (cubeFaceNeighborSlabSet Q i) + (faceNeighborSlabReflectedVectorField Q i G) := by + classical + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + let S := cubeFaceNeighborSlabSet Q i + let lower : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) + let upper : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) + have hLower : MemVectorL2 L lower := + memVectorL2_cubeLowerFaceNeighbor_reflected Q i hG + have hUpper : MemVectorL2 U upper := + memVectorL2_cubeUpperFaceNeighbor_reflected Q i hG + have hleft : + MeasureTheory.MemLp lower (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict S).restrict L) := by + exact hLower.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self L) + have hmid : + MeasureTheory.MemLp G (2 : ℝ≥0∞) + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict M) := by + exact hG.mono_measure <| by + calc + ((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict M + ≤ (MeasureTheory.volume.restrict S).restrict M := + MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self M + _ ≤ MeasureTheory.volume.restrict M := + MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self M + have hrightMeasure : + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict Mᶜ) ≤ + MeasureTheory.volume.restrict U := by + have hMeasM : MeasurableSet M := measurableSet_openCubeSet Q + have hMeasL : MeasurableSet L := + measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i) + have hMeasML : MeasurableSet (Mᶜ ∩ Lᶜ) := + hMeasM.compl.inter hMeasL.compl + rw [MeasureTheory.Measure.restrict_restrict hMeasM.compl] + rw [MeasureTheory.Measure.restrict_restrict hMeasML] + refine MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume ?_ + intro x hx + rcases hx.2 with hLM | hxU + · rcases hLM with hxL | hxM + · exact False.elim (hx.1.2 hxL) + · exact False.elim (hx.1.1 hxM) + · exact hxU + have hright : + MeasureTheory.MemLp upper (2 : ℝ≥0∞) + (((MeasureTheory.volume.restrict S).restrict Lᶜ).restrict Mᶜ) := + hUpper.mono_measure hrightMeasure + have htail : + MeasureTheory.MemLp (M.piecewise G upper) (2 : ℝ≥0∞) + ((MeasureTheory.volume.restrict S).restrict Lᶜ) := + MeasureTheory.MemLp.piecewise + (μ := (MeasureTheory.volume.restrict S).restrict Lᶜ) + (s := M) (p := (2 : ℝ≥0∞)) (measurableSet_openCubeSet Q) + hmid hright + have hpiece : + MeasureTheory.MemLp (L.piecewise lower (M.piecewise G upper)) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict S) := + MeasureTheory.MemLp.piecewise + (μ := MeasureTheory.volume.restrict S) (s := L) + (p := (2 : ℝ≥0∞)) + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) + hleft htail + simpa [MemVectorL2, volumeMeasureOn, faceNeighborSlabReflectedVectorField, + Set.piecewise, S, L, M, U, lower, upper] using! hpiece + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/EuclideanNormalized.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/EuclideanNormalized.lean new file mode 100644 index 0000000000..299e7c0412 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/EuclideanNormalized.lean @@ -0,0 +1,260 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp + +/-! # Euclidean Normalized -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- The proof-carrying normalized `L²` norm of the internally centered +forcing. This is the manuscript's `‖F - (F)_Q‖_{\underline{L}²(Q)}`. -/ +noncomputable def centeredCubeNormalizedL2 {d : ℕ} (Q : TriadicCube d) + (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : ℝ := + (cubeBoundedMeasurableDomain Q).normalizedLpNorm (2 : ℝ≥0∞) + (cubeFluctuation Q F) + (by + simpa [cubeFluctuation, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using! + hF.sub (MeasureTheory.memLp_const (cubeAverage Q F))) + +/-- A stronger regularity-producing centered-cube `q = 2` Neumann result. + +This compatibility predicate concludes the existence of a weak Hessian. The +source-facing predicate below instead estimates a weak-Hessian witness already +supplied by the caller. -/ +def OriginCubeNeumannW22CalderonZygmundRegularityQTwo {d : ℕ} (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ (m : ℤ) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))), + ∀ W : MeanZeroNeumannPoissonSolution (originCube d m) + (cubeFluctuation (originCube d m) F), + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * centeredCubeNormalizedL2 (originCube d m) F hF + +/-- The dimension-only constant furnished by the reflected-parent Neumann +construction after normalized-volume scaling. -/ +noncomputable def originCubeNeumannW22CalderonZygmundConstant (d : ℕ) : ℝ := + ((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 + +theorem originCubeNeumannW22CalderonZygmundConstant_nonneg (d : ℕ) : + 0 ≤ originCubeNeumannW22CalderonZygmundConstant d := by + exact mul_nonneg + (mul_nonneg (Nat.cast_nonneg d) (Nat.cast_nonneg d)) + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact_nonneg d 0) + +theorem OriginCubeNeumannW22CalderonZygmundRegularityQTwo.constant_nonneg + {d : ℕ} {C : ℝ} (h : OriginCubeNeumannW22CalderonZygmundRegularityQTwo (d := d) C) : + 0 ≤ C := + h.1 + +/-- Eliminate the regularity-producing Neumann predicate at a particular +scale, forcing, and supplied mean-zero solution. -/ +theorem OriginCubeNeumannW22CalderonZygmundRegularityQTwo.apply + {d : ℕ} {C : ℝ} (h : OriginCubeNeumannW22CalderonZygmundRegularityQTwo (d := d) C) + (m : ℤ) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (W : MeanZeroNeumannPoissonSolution (originCube d m) + (cubeFluctuation (originCube d m) F)) : + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * centeredCubeNormalizedL2 (originCube d m) F hF := + h.2 m F hF W + +theorem cubeAverage_centered_eq_zero {d : ℕ} (Q : TriadicCube d) + {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeAverage Q (fun x => F x - cubeAverage Q F) = 0 := by + rw [cubeAverage_sub_const_of_memLp_two Q hF] + ring + +theorem memLp_centered_normalizedCubeMeasure {d : ℕ} (Q : TriadicCube d) + {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp (fun x => F x - cubeAverage Q F) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + exact hF.sub (MeasureTheory.memLp_const (cubeAverage Q F)) + +theorem centeredCubeNormalizedL2_eq_cubeLpNorm {d : ℕ} (Q : TriadicCube d) + (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + centeredCubeNormalizedL2 Q F hF = + cubeLpNorm Q (2 : ℝ≥0∞) (cubeFluctuation Q F) := by + change + (MeasureTheory.eLpNorm (cubeFluctuation Q F) (2 : ℝ≥0∞) + (cubeBoundedMeasurableDomain Q).normalizedVolume).toReal = + (MeasureTheory.eLpNorm (cubeFluctuation Q F) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)).toReal + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + +/-- The existing reflected-parent construction gives a regularity-producing +normalized-Frobenius estimate with a constant independent of cube scale. -/ +theorem originCubeNeumannW22CalderonZygmund_regularity_qTwo : + ∀ d : ℕ, OriginCubeNeumannW22CalderonZygmundRegularityQTwo (d := d) + (originCubeNeumannW22CalderonZygmundConstant d) := by + intro d + refine ⟨originCubeNeumannW22CalderonZygmundConstant_nonneg d, ?_⟩ + intro m F hF W + let Q : TriadicCube d := originCube d m + let G : Vec d → ℝ := cubeFluctuation Q F + have hG : MeasureTheory.MemLp G (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + simpa [G, cubeFluctuation] using! memLp_centered_normalizedCubeMeasure Q hF + have hGmean : cubeAverage Q G = 0 := by + exact cubeAverage_centered_eq_zero Q hF + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + hGmean hG with + ⟨_uP, _huP_toFun, _huP_grad, H, hH⟩ + refine ⟨H, ?_⟩ + have hsum : + (∑ i : Fin d, ∑ _j : Fin d, + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyBoundExact d m G i) ≤ + ((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G) := by + calc + (∑ i : Fin d, ∑ _j : Fin d, + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyBoundExact d m G i) + = ((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G) := by + simp [Q, G, + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyBoundExact_eq_constant_mul_cubeLpNorm] + ring + _ ≤ ((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G) := le_rfl + have hscale : + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G)) := by + refine mul_le_mul_of_nonneg_left (hH.trans hsum) ?_ + exact Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _ + have hcancel := + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact_volume_cancel d m + calc + H.frobeniusNormalizedL2 Q + ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum := + H.frobeniusNormalizedL2_le_volumeNormalized_hessianCoordL2NormSum Q + _ ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G)) := hscale + _ = originCubeNeumannW22CalderonZygmundConstant d * + centeredCubeNormalizedL2 Q F hF := by + rw [centeredCubeNormalizedL2_eq_cubeLpNorm] + simp only [originCubeNeumannW22CalderonZygmundConstant] + change + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ((d : ℝ) * (d : ℝ) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G)) = + ((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 * + cubeLpNorm Q (2 : ℝ≥0∞) G + calc + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ((d : ℝ) * (d : ℝ) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm Q (2 : ℝ≥0∞) G)) = + ((d : ℝ) * (d : ℝ)) * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m) * + cubeLpNorm Q (2 : ℝ≥0∞) G) := by ring + _ = ((d : ℝ) * (d : ℝ)) * + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 * + cubeLpNorm Q (2 : ℝ≥0∞) G) := by + rw [show + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m = + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 by + simpa [Q] using hcancel] + _ = ((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 * + cubeLpNorm Q (2 : ℝ≥0∞) G := by ring + +/-- Apply the regularity-producing `q = 2` centered-cube Neumann result. -/ +theorem originCubeNeumannW22CalderonZygmund_regularity_qTwo_apply + (d : ℕ) (m : ℤ) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (W : MeanZeroNeumannPoissonSolution (originCube d m) + (cubeFluctuation (originCube d m) F)) : + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.frobeniusNormalizedL2 (originCube d m) ≤ + originCubeNeumannW22CalderonZygmundConstant d * + centeredCubeNormalizedL2 (originCube d m) F hF := + OriginCubeNeumannW22CalderonZygmundRegularityQTwo.apply + (originCubeNeumannW22CalderonZygmund_regularity_qTwo d) m F hF W + +/-- The literal centered-cube `q = 2` Neumann Calderón--Zygmund branch from +the source. The caller supplies arbitrary `F`; the mean-zero right-hand side +is formed internally as `F - (F)_{\cu_m}`, and the estimate applies to every +supplied mean-zero solution and every supplied weak-Hessian witness. -/ +def OriginCubeNeumannW22CalderonZygmundQTwo {d : ℕ} (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ (m : ℤ) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))), + ∀ (W : MeanZeroNeumannPoissonSolution (originCube d m) + (cubeFluctuation (originCube d m) F)) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function), + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * centeredCubeNormalizedL2 (originCube d m) F hF + +theorem OriginCubeNeumannW22CalderonZygmundQTwo.constant_nonneg + {d : ℕ} {C : ℝ} (h : OriginCubeNeumannW22CalderonZygmundQTwo (d := d) C) : + 0 ≤ C := + h.1 + +/-- Apply the literal Neumann branch to a supplied mean-zero solution and +weak-Hessian witness. -/ +theorem OriginCubeNeumannW22CalderonZygmundQTwo.apply + {d : ℕ} {C : ℝ} (h : OriginCubeNeumannW22CalderonZygmundQTwo (d := d) C) + (m : ℤ) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (W : MeanZeroNeumannPoissonSolution (originCube d m) + (cubeFluctuation (originCube d m) F)) + (H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function) : + H.frobeniusNormalizedL2 (originCube d m) ≤ + C * centeredCubeNormalizedL2 (originCube d m) F hF := + h.2 m F hF W H + +/-- The explicit normalized-Frobenius constant proves the literal +source-facing Neumann branch. A regularity-producing witness is constructed +internally, then weak-derivative uniqueness transfers its estimate to every +supplied witness. -/ +theorem originCubeNeumannW22CalderonZygmund_qTwo : + ∀ d : ℕ, OriginCubeNeumannW22CalderonZygmundQTwo (d := d) + (originCubeNeumannW22CalderonZygmundConstant d) := by + intro d + refine ⟨originCubeNeumannW22CalderonZygmundConstant_nonneg d, ?_⟩ + intro m F hF W H + rcases originCubeNeumannW22CalderonZygmund_regularity_qTwo_apply d m F hF W with + ⟨K, hK⟩ + rw [H.frobeniusNormalizedL2_eq_of_hasWeakHessianOn (originCube d m) K] + exact hK + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/FoldedAndWeakScalar.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/FoldedAndWeakScalar.lean new file mode 100644 index 0000000000..c1814425fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/FoldedAndWeakScalar.lean @@ -0,0 +1,975 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.CubePairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions + +/-! # Folded And Weak Scalar -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + +/-- The weak Neumann equation tested against the folded upper-face reflection +test. This is the formal replacement for saying that the one-face even +reflection solves the reflected equation. -/ +theorem equation_foldedCubeUpperFaceTest + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := by + simpa using W.equation (foldedCubeUpperFaceMeanZeroH1Test Q i hφ) + +/-- The weak Neumann equation tested against the folded lower-face reflection +test. -/ +theorem equation_foldedCubeLowerFaceTest + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := by + simpa using W.equation (foldedCubeLowerFaceMeanZeroH1Test Q i hφ) + +/-- One upper-face weak reflection identity for an arbitrary smooth test. The +second integral is over the neighboring reflected cube with the reflected weak +gradient field. -/ +theorem upperFace_reflectedGradient_pairing_eq_rhs + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := fun x => W.w.toH1Function.grad x + have hsplit := + setIntegral_foldedCubeUpperFaceTest_reflectedField_pairing + (G := G) hφ Q i hmain hreflected + have heq := W.equation_foldedCubeUpperFaceTest i hφ + calc + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) x) + ∂MeasureTheory.volume := by + simpa [G] using hsplit.symm + _ = ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := heq + +/-- One lower-face weak reflection identity for an arbitrary smooth test. The +second integral is over the neighboring reflected cube with the reflected weak +gradient field. -/ +theorem lowerFace_reflectedGradient_pairing_eq_rhs + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := fun x => W.w.toH1Function.grad x + have hsplit := + setIntegral_foldedCubeLowerFaceTest_reflectedField_pairing + (G := G) hφ Q i hmain hreflected + have heq := W.equation_foldedCubeLowerFaceTest i hφ + calc + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) x) + ∂MeasureTheory.volume := by + simpa [G] using hsplit.symm + _ = ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := heq + +/-- One upper-face reflected weak equation with the forcing also split across +the reflected neighboring cube. This is the weak-form version of the reflected +solution statement for a zero-average forcing. -/ +theorem upperFace_reflectedGradient_pairing_eq_reflectedRhs + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + F x * (foldedCubeUpperFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := + W.upperFace_reflectedGradient_pairing_eq_rhs + i hφ hgradMain hgradReflected + _ = ∫ x in openCubeSet Q, + F x * foldedCubeUpperFaceTest Q i φ x ∂MeasureTheory.volume := + setIntegral_mul_foldedCubeUpperFaceMeanZeroH1Test_eq_of_cubeAverage_eq_zero + i hφ hmean hF + (integrable_mul_foldedCubeUpperFaceTest_of_integrable_split + i hFmain hFreflected) + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x ∂MeasureTheory.volume := + setIntegral_mul_foldedCubeUpperFaceTest_reflection_split + i hFmain hFreflected + +/-- One lower-face reflected weak equation with the forcing also split across +the reflected neighboring cube. -/ +theorem lowerFace_reflectedGradient_pairing_eq_reflectedRhs + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + F x * (foldedCubeLowerFaceMeanZeroH1Test Q i hφ).toH1Function x + ∂MeasureTheory.volume := + W.lowerFace_reflectedGradient_pairing_eq_rhs + i hφ hgradMain hgradReflected + _ = ∫ x in openCubeSet Q, + F x * foldedCubeLowerFaceTest Q i φ x ∂MeasureTheory.volume := + setIntegral_mul_foldedCubeLowerFaceMeanZeroH1Test_eq_of_cubeAverage_eq_zero + i hφ hmean hF + (integrable_mul_foldedCubeLowerFaceTest_of_integrable_split + i hFmain hFreflected) + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x ∂MeasureTheory.volume := + setIntegral_mul_foldedCubeLowerFaceTest_reflection_split + i hFmain hFreflected + +/-- Upper-face reflected weak equation written as a single integral over the +doubled open domain `Q ∪ Q⁺`. -/ +theorem upperFace_reflectedWeakEquationOnUnion + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + have hgradNeighbor : + MeasureTheory.Integrable + (fun x => + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + simpa [G] using + integrable_cubeUpperFaceNeighbor_reflectedField_pairing + (G := G) hφ Q i hgradReflected + have hgradQ_piece : + MeasureTheory.Integrable + (upperFaceReflectedGradientPairingIntegrand Q i G φ) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + refine hgradMain.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet Q)] with x hx + simp [upperFaceReflectedGradientPairingIntegrand, G, hx] + have hgradN_piece : + MeasureTheory.Integrable + (upperFaceReflectedGradientPairingIntegrand Q i G φ) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + refine hgradNeighbor.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i)) hxQ hx + simp [upperFaceReflectedGradientPairingIntegrand, G, hxQ] + have hforceNeighbor : + MeasureTheory.Integrable + (fun x => F (cubeUpperFaceReflection Q i x) * φ x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := + integrable_cubeUpperFaceNeighbor_reflectedScalar_mul Q i hFreflected + have hforceQ_piece : + MeasureTheory.Integrable + (upperFaceReflectedForcingIntegrand Q i F φ) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + refine hFmain.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet Q)] with x hx + simp [upperFaceReflectedForcingIntegrand, hx] + have hforceN_piece : + MeasureTheory.Integrable + (upperFaceReflectedForcingIntegrand Q i F φ) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + refine hforceNeighbor.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i)) hxQ hx + simp [upperFaceReflectedForcingIntegrand, hxQ] + have hgradUnion := + setIntegral_openCubeSet_union_upperFaceNeighbor Q i + (upperFaceReflectedGradientPairingIntegrand Q i G φ) + hgradQ_piece hgradN_piece + have hforceUnion := + setIntegral_openCubeSet_union_upperFaceNeighbor Q i + (upperFaceReflectedForcingIntegrand Q i F φ) + hforceQ_piece hforceN_piece + have hgradQ_integral : + ∫ x in openCubeSet Q, + upperFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [upperFaceReflectedGradientPairingIntegrand, G, hx] + have hgradN_integral : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i)) hxQ hx + simp [upperFaceReflectedGradientPairingIntegrand, G, hxQ] + have hforceQ_integral : + ∫ x in openCubeSet Q, + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [upperFaceReflectedForcingIntegrand, hx] + have hforceN_integral : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i)) hxQ hx + simp [upperFaceReflectedForcingIntegrand, hxQ] + have hpair := + W.upperFace_reflectedGradient_pairing_eq_reflectedRhs + i hφ hmean hgradMain hgradReflected hF hFmain hFreflected + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + rw [show + (∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x + ∂MeasureTheory.volume) = + (∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume) by rfl] + rw [hgradUnion, hgradQ_integral, hgradN_integral] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * φ x + ∂MeasureTheory.volume := hpair + _ = ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + rw [hforceUnion, hforceQ_integral, hforceN_integral] + +/-- Lower-face reflected weak equation written as a single integral over the +doubled open domain `Q ∪ Q⁻`. -/ +theorem lowerFace_reflectedWeakEquationOnUnion + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + have hgradNeighbor : + MeasureTheory.Integrable + (fun x => + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + simpa [G] using + integrable_cubeLowerFaceNeighbor_reflectedField_pairing + (G := G) hφ Q i hgradReflected + have hgradQ_piece : + MeasureTheory.Integrable + (lowerFaceReflectedGradientPairingIntegrand Q i G φ) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + refine hgradMain.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet Q)] with x hx + simp [lowerFaceReflectedGradientPairingIntegrand, G, hx] + have hgradN_piece : + MeasureTheory.Integrable + (lowerFaceReflectedGradientPairingIntegrand Q i G φ) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + refine hgradNeighbor.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i)) hxQ hx + simp [lowerFaceReflectedGradientPairingIntegrand, G, hxQ] + have hforceNeighbor : + MeasureTheory.Integrable + (fun x => F (cubeLowerFaceReflection Q i x) * φ x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := + integrable_cubeLowerFaceNeighbor_reflectedScalar_mul Q i hFreflected + have hforceQ_piece : + MeasureTheory.Integrable + (lowerFaceReflectedForcingIntegrand Q i F φ) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + refine hFmain.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet Q)] with x hx + simp [lowerFaceReflectedForcingIntegrand, hx] + have hforceN_piece : + MeasureTheory.Integrable + (lowerFaceReflectedForcingIntegrand Q i F φ) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + refine hforceNeighbor.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i)) hxQ hx + simp [lowerFaceReflectedForcingIntegrand, hxQ] + have hgradUnion := + setIntegral_openCubeSet_union_lowerFaceNeighbor Q i + (lowerFaceReflectedGradientPairingIntegrand Q i G φ) + hgradQ_piece hgradN_piece + have hforceUnion := + setIntegral_openCubeSet_union_lowerFaceNeighbor Q i + (lowerFaceReflectedForcingIntegrand Q i F φ) + hforceQ_piece hforceN_piece + have hgradQ_integral : + ∫ x in openCubeSet Q, + lowerFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [lowerFaceReflectedGradientPairingIntegrand, G, hx] + have hgradN_integral : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i)) hxQ hx + simp [lowerFaceReflectedGradientPairingIntegrand, G, hxQ] + have hforceQ_integral : + ∫ x in openCubeSet Q, + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [lowerFaceReflectedForcingIntegrand, hx] + have hforceN_integral : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i)) hxQ hx + simp [lowerFaceReflectedForcingIntegrand, hxQ] + have hpair := + W.lowerFace_reflectedGradient_pairing_eq_reflectedRhs + i hφ hmean hgradMain hgradReflected hF hFmain hFreflected + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i + (W.w.toH1Function.grad (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + rw [show + (∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x + ∂MeasureTheory.volume) = + (∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i G φ x + ∂MeasureTheory.volume) by rfl] + rw [hgradUnion, hgradQ_integral, hgradN_integral] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * φ x + ∂MeasureTheory.volume := hpair + _ = ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + rw [hforceUnion, hforceQ_integral, hforceN_integral] + +/-- Compact-test version of the upper-face reflected weak equation. This +derives the side integrability assumptions in +`upperFace_reflectedWeakEquationOnUnion` from the natural `L²` data. -/ +theorem upperFace_reflectedWeakEquationOnUnion_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + let ψ : Vec d → ℝ := fun z => φ (cubeUpperFaceReflection Q i z) + let : MeasureTheory.IsFiniteMeasure + (MeasureTheory.volume.restrict (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, cubeUpperFaceReflection] using! + hφ.comp (contDiff_coordFaceReflection (cubeUpperFaceCoord Q i) i) + have hψs : HasCompactSupport ψ := by + simpa [ψ] using hasCompactSupport_comp_cubeUpperFaceReflection hφs Q i + have hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hgradφ : + MemVectorL2 (openCubeSet Q) (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + simpa [MeasureTheory.IntegrableOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 hgradφ + have hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hgradψ : + MemVectorL2 (openCubeSet Q) (euclideanGradient ψ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψ hψs + simpa [MeasureTheory.IntegrableOn, ψ] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 hgradψ + have hFint : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hφL2 : + MeasureTheory.MemLp φ (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hφ_cont : Continuous φ := (hφ.differentiable (by simp)).continuous + exact (hφ_cont.memLp_of_hasCompactSupport hφs).restrict (openCubeSet Q) + have hψL2 : + MeasureTheory.MemLp ψ (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hψ_cont : Continuous ψ := (hψ.differentiable (by simp)).continuous + exact (hψ_cont.memLp_of_hasCompactSupport hψs).restrict (openCubeSet Q) + have hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable_mul hφL2 + have hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [ψ] using! hF.integrable_mul hψL2 + exact + W.upperFace_reflectedWeakEquationOnUnion + i hφ hmean hgradMain hgradReflected hFint hFmain hFreflected + +/-- Compact-test version of the lower-face reflected weak equation. This +derives the side integrability assumptions in +`lowerFace_reflectedWeakEquationOnUnion` from the natural `L²` data. -/ +theorem lowerFace_reflectedWeakEquationOnUnion_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + let ψ : Vec d → ℝ := fun z => φ (cubeLowerFaceReflection Q i z) + let : MeasureTheory.IsFiniteMeasure + (MeasureTheory.volume.restrict (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, cubeLowerFaceReflection] using! + hφ.comp (contDiff_coordFaceReflection (cubeLowerFaceCoord Q i) i) + have hψs : HasCompactSupport ψ := by + simpa [ψ] using hasCompactSupport_comp_cubeLowerFaceReflection hφs Q i + have hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hgradφ : + MemVectorL2 (openCubeSet Q) (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + simpa [MeasureTheory.IntegrableOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 hgradφ + have hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hgradψ : + MemVectorL2 (openCubeSet Q) (euclideanGradient ψ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψ hψs + simpa [MeasureTheory.IntegrableOn, ψ] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 hgradψ + have hFint : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hφL2 : + MeasureTheory.MemLp φ (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hφ_cont : Continuous φ := (hφ.differentiable (by simp)).continuous + exact (hφ_cont.memLp_of_hasCompactSupport hφs).restrict (openCubeSet Q) + have hψL2 : + MeasureTheory.MemLp ψ (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hψ_cont : Continuous ψ := (hψ.differentiable (by simp)).continuous + exact (hψ_cont.memLp_of_hasCompactSupport hψs).restrict (openCubeSet Q) + have hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable_mul hφL2 + have hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [ψ] using! hF.integrable_mul hψL2 + exact + W.lowerFace_reflectedWeakEquationOnUnion + i hφ hmean hgradMain hgradReflected hFint hFmain hFreflected + +/-- Compact-test weak equation on the original cube. The test need not be +mean-zero: the zero-average forcing hypothesis removes the subtracted constant +from the mean-zero test normalization. -/ +theorem weakEquationOnCube_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (openCubeSet Q)) := + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let v : H1Function (openCubeSet Q) := + H1Function.ofContDiff (isOpen_openCubeSet Q) + (hφ.of_le (by simp)) hφs + let ψ : H1MeanZeroFunction (openCubeSet Q) := v.toMeanZero + have hgrad_eq : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [ψ, v, H1Function.ofContDiff] + change vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) = + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + rfl + have hFint : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hφL2 : + MeasureTheory.MemLp φ (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hφ_cont : Continuous φ := (hφ.differentiable (by simp)).continuous + exact (hφ_cont.memLp_of_hasCompactSupport hφs).restrict (openCubeSet Q) + have hFφ : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hF.integrable_mul hφL2 + have hFint_zero : + ∫ x in openCubeSet Q, F x ∂MeasureTheory.volume = 0 := by + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage, hmean, mul_zero] + let c : ℝ := integralAverage (openCubeSet Q) v + have hforce_eq : + ∫ x in openCubeSet Q, F x * ψ.toH1Function x + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, F x * ψ.toH1Function x + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, F x * φ x - F x * c + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x _hx + simp [ψ, v, H1Function.ofContDiff, c, mul_sub] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume - + ∫ x in openCubeSet Q, F x * c ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hFφ (hFint.mul_const c)] + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_mul_const, hFint_zero] + ring + calc + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (ψ.toH1Function.grad x) + ∂MeasureTheory.volume := hgrad_eq.symm + _ = ∫ x in openCubeSet Q, F x * ψ.toH1Function x + ∂MeasureTheory.volume := W.equation ψ + _ = ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := hforce_eq + +/-- Compact-test upper-face reflected weak equation, with the right-hand side +given in the normalized cube `L²` measure used by the Poisson endpoint +interfaces. -/ +theorem upperFace_reflectedWeakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + have hFopen : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MemL2On, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + W.upperFace_reflectedWeakEquationOnUnion_of_compactSupport + i hφ hφs hmean hFopen + +/-- Compact-test lower-face reflected weak equation, with the right-hand side +given in the normalized cube `L²` measure used by the Poisson endpoint +interfaces. -/ +theorem lowerFace_reflectedWeakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + have hFopen : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MemL2On, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + W.lowerFace_reflectedWeakEquationOnUnion_of_compactSupport + i hφ hφs hmean hFopen + +/-- Compact-test weak equation on the original cube, with the right-hand side +given in the normalized cube `L²` measure used by the Poisson endpoint +interfaces. -/ +theorem weakEquationOnCube_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ x ∂MeasureTheory.volume := by + have hFopen : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MemL2On, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + W.weakEquationOnCube_of_compactSupport hφ hφs hmean hFopen + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/MemL2AndPairings.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/MemL2AndPairings.lean new file mode 100644 index 0000000000..549296d6a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/MemL2AndPairings.lean @@ -0,0 +1,1051 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions + +/-! # Mem L2And Pairings -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The squared `L²` energy of the slab-reflected scalar on the +lower/original/upper face-neighbor slab is three copies of the original cube +energy. -/ +theorem setIntegral_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedScalar_sq + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in cubeFaceNeighborSlabSet Q i, + faceNeighborSlabReflectedScalar Q i F x * + faceNeighborSlabReflectedScalar Q i F x + ∂MeasureTheory.volume = + 3 * ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + classical + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + let S := cubeFaceNeighborSlabSet Q i + let f : Vec d → ℝ := fun x => + faceNeighborSlabReflectedScalar Q i F x * + faceNeighborSlabReflectedScalar Q i F x + have hSlab : MemScalarL2 S (faceNeighborSlabReflectedScalar Q i F) := by + simpa [S, M] using + memScalarL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedScalar + Q i hF + have hfS : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict S) := by + simpa [f] using! hSlab.integrable_mul hSlab + have hLsub : L ⊆ S := by + intro x hx + exact Or.inl (Or.inl hx) + have hMsub : M ⊆ S := by + intro x hx + exact Or.inl (Or.inr hx) + have hUsub : U ⊆ S := by + intro x hx + exact Or.inr hx + have hfL : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict L) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hLsub) + have hfM : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict M) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hMsub) + have hfU : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict U) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hUsub) + have hsplit := + setIntegral_cubeFaceNeighborSlabSet Q i f hfL hfM hfU + have hL_eq : + ∫ x in L, f x ∂MeasureTheory.volume = + ∫ x in L, + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + simpa [f, L] using + congrArg (fun y => y * y) + (faceNeighborSlabReflectedScalar_of_mem_lower Q i F + (x := x) hx) + have hM_eq : + ∫ x in M, f x ∂MeasureTheory.volume = + ∫ x in M, F x * F x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simpa [f, M] using + congrArg (fun y => y * y) + (faceNeighborSlabReflectedScalar_of_mem_cube Q i F (x := x) hx) + have hU_eq : + ∫ x in U, f x ∂MeasureTheory.volume = + ∫ x in U, + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + simpa [f, U] using + congrArg (fun y => y * y) + (faceNeighborSlabReflectedScalar_of_mem_upper Q i F + (x := x) hx) + calc + ∫ x in cubeFaceNeighborSlabSet Q i, + faceNeighborSlabReflectedScalar Q i F x * + faceNeighborSlabReflectedScalar Q i F x + ∂MeasureTheory.volume + = ∫ x in L, f x ∂MeasureTheory.volume + + ∫ x in M, f x ∂MeasureTheory.volume + + ∫ x in U, f x ∂MeasureTheory.volume := by + simpa [f, S, L, M, U] using hsplit + _ = ∫ x in L, + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume + + ∫ x in M, F x * F x ∂MeasureTheory.volume + + ∫ x in U, + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume := by + rw [hL_eq, hM_eq, hU_eq] + _ = ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + rw [show + (∫ x in L, + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume by + simpa [L] using + setIntegral_cubeLowerFaceNeighbor_reflectedScalar_sq Q i] + rw [show + (∫ x in U, + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume by + simpa [U] using + setIntegral_cubeUpperFaceNeighbor_reflectedScalar_sq Q i] + _ = 3 * ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + ring + +/-- The vector self-pairing energy of the slab-reflected field on the +lower/original/upper face-neighbor slab is three copies of the original cube +energy. -/ +theorem setIntegral_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedVectorField_self_pairing + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in cubeFaceNeighborSlabSet Q i, + vecDot (faceNeighborSlabReflectedVectorField Q i G x) + (faceNeighborSlabReflectedVectorField Q i G x) + ∂MeasureTheory.volume = + 3 * ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + classical + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + let S := cubeFaceNeighborSlabSet Q i + let f : Vec d → ℝ := fun x => + vecDot (faceNeighborSlabReflectedVectorField Q i G x) + (faceNeighborSlabReflectedVectorField Q i G x) + have hSlab : MemVectorL2 S (faceNeighborSlabReflectedVectorField Q i G) := by + simpa [S, M] using + memVectorL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedVectorField + Q i hG + have hfS : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict S) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, f] using + integrableOn_vecDot_of_memVectorL2 (U := S) hSlab hSlab + have hLsub : L ⊆ S := by + intro x hx + exact Or.inl (Or.inl hx) + have hMsub : M ⊆ S := by + intro x hx + exact Or.inl (Or.inr hx) + have hUsub : U ⊆ S := by + intro x hx + exact Or.inr hx + have hfL : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict L) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hLsub) + have hfM : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict M) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hMsub) + have hfU : + MeasureTheory.Integrable f (MeasureTheory.volume.restrict U) := + hfS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hUsub) + have hsplit := + setIntegral_cubeFaceNeighborSlabSet Q i f hfL hfM hfU + have hL_eq : + ∫ x in L, f x ∂MeasureTheory.volume = + ∫ x in L, + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + simpa [f, L] using + congrArg (fun v => vecDot v v) + (faceNeighborSlabReflectedVectorField_of_mem_lower Q i G + (x := x) hx) + have hM_eq : + ∫ x in M, f x ∂MeasureTheory.volume = + ∫ x in M, vecDot (G x) (G x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simpa [f, M] using + congrArg (fun v => vecDot v v) + (faceNeighborSlabReflectedVectorField_of_mem_cube Q i G + (x := x) hx) + have hU_eq : + ∫ x in U, f x ∂MeasureTheory.volume = + ∫ x in U, + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + simpa [f, U] using + congrArg (fun v => vecDot v v) + (faceNeighborSlabReflectedVectorField_of_mem_upper Q i G + (x := x) hx) + calc + ∫ x in cubeFaceNeighborSlabSet Q i, + vecDot (faceNeighborSlabReflectedVectorField Q i G x) + (faceNeighborSlabReflectedVectorField Q i G x) + ∂MeasureTheory.volume + = ∫ x in L, f x ∂MeasureTheory.volume + + ∫ x in M, f x ∂MeasureTheory.volume + + ∫ x in U, f x ∂MeasureTheory.volume := by + simpa [f, S, L, M, U] using hsplit + _ = ∫ x in L, + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂MeasureTheory.volume + + ∫ x in M, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in U, + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂MeasureTheory.volume := by + rw [hL_eq, hM_eq, hU_eq] + _ = ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + rw [show + (∫ x in L, + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, vecDot (G x) (G x) + ∂MeasureTheory.volume by + simpa [L] using + setIntegral_cubeLowerFaceNeighbor_reflectedField_self_pairing + Q i] + rw [show + (∫ x in U, + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂MeasureTheory.volume) = + ∫ x in openCubeSet Q, vecDot (G x) (G x) + ∂MeasureTheory.volume by + simpa [U] using + setIntegral_cubeUpperFaceNeighbor_reflectedField_self_pairing + Q i] + _ = 3 * ∫ x in openCubeSet Q, vecDot (G x) (G x) + ∂MeasureTheory.volume := by + ring + +/-- The squared `L²` energy of the all-coordinate reflected scalar on the full +reflection block is one copy of the original cube energy for each reflected +cell. This is the `MemScalarL2` wrapper around the geometric cell +change-of-variables theorem. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2 + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x + ∂MeasureTheory.volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq + Q (by simpa [volumeMeasureOn] using! hF.integrable_mul hF) + +/-- The squared `L²` energy of the all-coordinate reflected scalar on the full +reflection block, with the cell count normalized to `(3 : ℝ)^d`. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + rw [setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2 + Q hF, + real_card_cubeFaceReflectionChoices] + +/-- The cross pairing of two all-coordinate reflected scalar fields on the +full reflection block is one copy of the original cube pairing for each +reflection cell. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_mul_of_memScalarL2 + {d : ℕ} {F U : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) + (hU : MemScalarL2 (openCubeSet Q) U) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q U x + ∂MeasureTheory.volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * U y ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q U x + have hbase : + MeasureTheory.Integrable (fun y => F y * U y) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [volumeMeasureOn] using! hF.integrable_mul hU + have hfcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + have hcomp : + MeasureTheory.Integrable + (fun x => + F (cubeFaceReflectionCellFoldMap Q choice x) * + U (cubeFaceReflectionCellFoldMap Q choice x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := fun y => F y * U y) hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + simp [f, cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q U x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfcell + _ = ∑ _choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, F y * U y ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + F (cubeFaceReflectionCellFoldMap Q choice x) * + U (cubeFaceReflectionCellFoldMap Q choice x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + simp [f, cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + _ = ∫ y in openCubeSet Q, F y * U y ∂MeasureTheory.volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => F y * U y) + _ = (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * U y ∂MeasureTheory.volume := by + simp + +/-- The reflected scalar cross pairing on the full reflection block, with the +cell count normalized to `(3 : ℝ)^d`. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_mul_of_memScalarL2_three_pow + {d : ℕ} {F U : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) + (hU : MemScalarL2 (openCubeSet Q) U) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q U x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * U y ∂MeasureTheory.volume := by + rw [setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_mul_of_memScalarL2 + Q hF hU, + real_card_cubeFaceReflectionChoices] + +/-- The all-coordinate reflected scalar forcing is `L²` on the full +reflection block whenever the original forcing is `L²` on `Q`. -/ +theorem memScalarL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) := by + classical + let cell : (Fin d → Fin 3) → Set (Vec d) := fun choice => + openCubeSet (cubeFaceReflectionCellCube Q choice) + have hcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.MemLp (cubeCoordinateFoldReflectedScalar Q F) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cell choice)) := by + intro choice + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : + MeasureTheory.MemLp + (fun x => F (cubeFaceReflectionCellFoldMap Q choice x)) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + have hcomp' := hF.comp_measurePreserving hmp + simpa [MemScalarL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell] using hcomp' + exact MeasureTheory.MemLp.ae_eq (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] + with x hx + exact (cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice F hx).symm) hcomp + have hae : + MeasureTheory.AEStronglyMeasurable + (cubeCoordinateFoldReflectedScalar Q F) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => by + simpa [cell] using (hcell choice).aestronglyMeasurable + have hint : + MeasureTheory.Integrable + (fun x => ‖cubeCoordinateFoldReflectedScalar Q F x‖ ^ (2 : ℕ)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.integrableOn_finite_iUnion.2 fun choice => by + have hsq := + (MeasureTheory.memLp_two_iff_integrable_sq_norm + (hcell choice).aestronglyMeasurable).1 (hcell choice) + simpa [MeasureTheory.IntegrableOn, cell] using hsq + simpa [MemScalarL2, volumeMeasureOn] using + (MeasureTheory.memLp_two_iff_integrable_sq_norm hae).2 hint + +/-- The block-indicator localization of the all-coordinate reflected scalar is +a global `L²` function. -/ +theorem memLp_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F)) + (2 : ℝ≥0∞) MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict + (measurableSet_cubeFaceReflectionBlockSet Q)] + simpa [MemScalarL2, volumeMeasureOn] using + memScalarL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + Q hF + +/-- The global squared norm of the block-indicator reflected scalar is exactly +the `3^d` reflected copy count times the original cube scalar energy. -/ +theorem integral_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_norm_sq + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x, + ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + let S : Set (Vec d) := cubeFaceReflectionBlockSet Q + let FR : Vec d → ℝ := cubeCoordinateFoldReflectedScalar Q F + have hpoint : + (fun x => + ‖Set.indicator S FR x‖ ^ (2 : ℝ)) = + Set.indicator S (fun x => FR x * FR x) := by + funext x + by_cases hx : x ∈ S <;> simp [S, FR, hx, pow_two, Real.norm_eq_abs] + calc + ∫ x, ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume + = ∫ x, Set.indicator S (fun x => FR x * FR x) x + ∂MeasureTheory.volume := by + rw [hpoint] + _ = ∫ x in S, FR x * FR x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_indicator + (measurableSet_cubeFaceReflectionBlockSet Q)] + _ = (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + simpa [S, FR] using + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + Q hF + +/-- The all-coordinate reflected vector field is `L²` on the full reflection +block whenever the original vector field is `L²` on `Q`. -/ +theorem memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q G) := by + classical + let cell : (Fin d → Fin 3) → Set (Vec d) := fun choice => + openCubeSet (cubeFaceReflectionCellCube Q choice) + have hcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.MemLp (cubeCoordinateFoldReflectedVectorField Q G) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict (cell choice)) := by + intro choice + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + have hcomp : + MeasureTheory.MemLp + (fun x => G (cubeFaceReflectionCellFoldMap Q choice x)) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + have hcomp' := hG.comp_measurePreserving hmp + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell] using hcomp' + have hfold : + MeasureTheory.MemLp + (fun x => + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (cell choice)) := by + simpa [Function.comp_def] using + (cubeFaceReflectionCellFoldLinear choice).comp_memLp' hcomp + exact MeasureTheory.MemLp.ae_eq (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet + (cubeFaceReflectionCellCube Q choice))] + with x hx + exact (cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice G hx).symm) hfold + have hae : + MeasureTheory.AEStronglyMeasurable + (cubeCoordinateFoldReflectedVectorField Q G) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.AEStronglyMeasurable.iUnion fun choice => by + simpa [cell] using (hcell choice).aestronglyMeasurable + have hint : + MeasureTheory.Integrable + (fun x => ‖cubeCoordinateFoldReflectedVectorField Q G x‖ ^ (2 : ℕ)) + (MeasureTheory.volume.restrict (cubeFaceReflectionBlockSet Q)) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.integrableOn_finite_iUnion.2 fun choice => by + have hsq := + (MeasureTheory.memLp_two_iff_integrable_sq_norm + (hcell choice).aestronglyMeasurable).1 (hcell choice) + simpa [MeasureTheory.IntegrableOn, cell] using hsq + simpa [MemVectorL2, volumeMeasureOn] using + (MeasureTheory.memLp_two_iff_integrable_sq_norm hae).2 hint + +/-- The block-indicator localization of the all-coordinate reflected vector +field is a global `L²` vector field. -/ +theorem memLp_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q G)) + (2 : ℝ≥0∞) MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict + (measurableSet_cubeFaceReflectionBlockSet Q)] + simpa [MemVectorL2, volumeMeasureOn] using + memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + Q hG + +/-- The vector self-pairing energy of the all-coordinate reflected vector +field on the full reflection block is one copy of the original cube energy for +each reflected cell. This is the `MemVectorL2` wrapper around the geometric +cell change-of-variables theorem. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2 + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + have hInt : + MeasureTheory.Integrable + (fun y => vecDot (G y) (G y)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) hG hG + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing + Q hInt + +/-- The vector self-pairing energy of the all-coordinate reflected field on +the full reflection block, with the cell count normalized to `(3 : ℝ)^d`. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + rw [setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2 + Q hG, + real_card_cubeFaceReflectionChoices] + +/-- The squared `L²` energy of the upper-face reflected scalar on the doubled +domain is two copies of the original cube energy. -/ +theorem setIntegral_openCubeSet_union_upperFaceReflectedScalar_sq {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + 2 * ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + let R : Vec d → ℝ := fun x => F (cubeUpperFaceReflection Q i x) + have hR : MemScalarL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) R := + memScalarL2_cubeUpperFaceNeighbor_comp_reflection Q i hF + have hQ : + MeasureTheory.Integrable + (fun x => + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hmain : + MeasureTheory.Integrable + (fun x => F x * F x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa using! hF.integrable_mul hF + refine hmain.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + simp [upperFaceReflectedScalar, hx] + have hN : + MeasureTheory.Integrable + (fun x => + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + have hreflected : + MeasureTheory.Integrable + (fun x => R x * R x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + simpa using! hR.integrable_mul hR + refine hreflected.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) hxQ) hx + simp [upperFaceReflectedScalar, hxQ, R] + have hsplit := + setIntegral_openCubeSet_union_upperFaceNeighbor Q i + (fun x => + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x) hQ hN + have hQeq : + ∫ x in openCubeSet Q, + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [upperFaceReflectedScalar, hx] + have hNeq : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) hxQ) hx + simp [upperFaceReflectedScalar, hxQ] + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * + upperFaceReflectedScalar Q i F x ∂MeasureTheory.volume := hsplit + _ = ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂MeasureTheory.volume := by + rw [hQeq, hNeq] + _ = ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + rw [setIntegral_cubeUpperFaceNeighbor_reflectedScalar_sq Q i] + _ = 2 * ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + ring + +/-- The squared `L²` energy of the lower-face reflected scalar on the doubled +domain is two copies of the original cube energy. -/ +theorem setIntegral_openCubeSet_union_lowerFaceReflectedScalar_sq {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + 2 * ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + let R : Vec d → ℝ := fun x => F (cubeLowerFaceReflection Q i x) + have hR : MemScalarL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) R := + memScalarL2_cubeLowerFaceNeighbor_comp_reflection Q i hF + have hQ : + MeasureTheory.Integrable + (fun x => + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hmain : + MeasureTheory.Integrable + (fun x => F x * F x) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa using! hF.integrable_mul hF + refine hmain.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + simp [lowerFaceReflectedScalar, hx] + have hN : + MeasureTheory.Integrable + (fun x => + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + have hreflected : + MeasureTheory.Integrable + (fun x => R x * R x) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + simpa using! hR.integrable_mul hR + refine hreflected.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hxQ) hx + simp [lowerFaceReflectedScalar, hxQ, R] + have hsplit := + setIntegral_openCubeSet_union_lowerFaceNeighbor Q i + (fun x => + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x) hQ hN + have hQeq : + ∫ x in openCubeSet Q, + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [lowerFaceReflectedScalar, hx] + have hNeq : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hxQ) hx + simp [lowerFaceReflectedScalar, hxQ] + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * + lowerFaceReflectedScalar Q i F x ∂MeasureTheory.volume := hsplit + _ = ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂MeasureTheory.volume := by + rw [hQeq, hNeq] + _ = ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + rw [setIntegral_cubeLowerFaceNeighbor_reflectedScalar_sq Q i] + _ = 2 * ∫ x in openCubeSet Q, F x * F x ∂MeasureTheory.volume := by + ring + +/-- The vector self-pairing energy of the upper-face reflected field on the +doubled domain is two copies of the original cube energy. -/ +theorem setIntegral_openCubeSet_union_upperFaceReflectedVectorField_self_pairing + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + 2 * ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + let R : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeUpperFaceReflection Q i x)) + have hR : MemVectorL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) R := + memVectorL2_cubeUpperFaceNeighbor_reflected Q i hG + have hQ : + MeasureTheory.Integrable + (fun x => + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hmain : + MeasureTheory.IntegrableOn + (fun x => vecDot (G x) (G x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hG hG + simpa [MeasureTheory.IntegrableOn] using + hmain.congr_fun_ae (by + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + simp [upperFaceReflectedVectorField, hx]) + have hN : + MeasureTheory.Integrable + (fun x => + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + have hreflected : + MeasureTheory.IntegrableOn + (fun x => vecDot (R x) (R x)) + (openCubeSet (cubeUpperFaceNeighbor Q i)) := + integrableOn_vecDot_of_memVectorL2 hR hR + simpa [MeasureTheory.IntegrableOn] using + hreflected.congr_fun_ae (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) hxQ) hx + simp [upperFaceReflectedVectorField, hxQ, R]) + have hsplit := + setIntegral_openCubeSet_union_upperFaceNeighbor Q i + (fun x => + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x)) hQ hN + have hQeq : + ∫ x in openCubeSet Q, + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [upperFaceReflectedVectorField, hx] + have hNeq : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) hxQ) hx + simp [upperFaceReflectedVectorField, hxQ] + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot (upperFaceReflectedVectorField Q i G x) + (upperFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume := hsplit + _ = ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂MeasureTheory.volume := by + rw [hQeq, hNeq] + _ = ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + rw [setIntegral_cubeUpperFaceNeighbor_reflectedField_self_pairing Q i] + _ = 2 * ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + ring + +/-- The vector self-pairing energy of the lower-face reflected field on the +doubled domain is two copies of the original cube energy. -/ +theorem setIntegral_openCubeSet_union_lowerFaceReflectedVectorField_self_pairing + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + 2 * ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + let R : Vec d → Vec d := + fun x => coordReflectionLinear i (G (cubeLowerFaceReflection Q i x)) + have hR : MemVectorL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) R := + memVectorL2_cubeLowerFaceNeighbor_reflected Q i hG + have hQ : + MeasureTheory.Integrable + (fun x => + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hmain : + MeasureTheory.IntegrableOn + (fun x => vecDot (G x) (G x)) (openCubeSet Q) := + integrableOn_vecDot_of_memVectorL2 hG hG + simpa [MeasureTheory.IntegrableOn] using + hmain.congr_fun_ae (by + filter_upwards + [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + simp [lowerFaceReflectedVectorField, hx]) + have hN : + MeasureTheory.Integrable + (fun x => + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + have hreflected : + MeasureTheory.IntegrableOn + (fun x => vecDot (R x) (R x)) + (openCubeSet (cubeLowerFaceNeighbor Q i)) := + integrableOn_vecDot_of_memVectorL2 hR hR + simpa [MeasureTheory.IntegrableOn] using + hreflected.congr_fun_ae (by + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i))] with x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hxQ) hx + simp [lowerFaceReflectedVectorField, hxQ, R]) + have hsplit := + setIntegral_openCubeSet_union_lowerFaceNeighbor Q i + (fun x => + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x)) hQ hN + have hQeq : + ∫ x in openCubeSet Q, + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simp [lowerFaceReflectedVectorField, hx] + have hNeq : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + have hxQ : x ∉ openCubeSet Q := by + intro hxQ + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) hxQ) hx + simp [lowerFaceReflectedVectorField, hxQ] + calc + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot (lowerFaceReflectedVectorField Q i G x) + (lowerFaceReflectedVectorField Q i G x) ∂MeasureTheory.volume := hsplit + _ = ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂MeasureTheory.volume := by + rw [hQeq, hNeq] + _ = ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume + + ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + rw [setIntegral_cubeLowerFaceNeighbor_reflectedField_self_pairing Q i] + _ = 2 * ∫ x in openCubeSet Q, vecDot (G x) (G x) ∂MeasureTheory.volume := by + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Regularity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Regularity.lean new file mode 100644 index 0000000000..c2b14310bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/Regularity.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ArbitraryCubeEndpoint + +/-! # Regularity -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Legacy positive-test Neumann compatibility package + +This module packages the downstream positive-test endpoint for Neumann Poisson +solutions. It does **not** state the manuscript's weak-Hessian +Calderon--Zygmund estimate; that literal statement lives in the exact +Euclidean-normalized lane. +-/ + +namespace Legacy + +open scoped ENNReal + +noncomputable section + +/-- Legacy name for the downstream positive-test core estimate. This is a +compatibility wrapper, not a weak-Hessian Calderon--Zygmund statement. -/ +def CubeNeumannW22CalderonZygmundRegularity {d : ℕ} + (Q : TriadicCube d) (C : ℝ) : Prop := + CubePoissonGradientDualTestNormL2CoreEstimate Q C + +/-- Dimension-uniform legacy positive-test compatibility predicate on cubes. -/ +def CubeNeumannW22CalderonZygmundRegularityInDimension + (d : ℕ) (C : ℝ) : Prop := + 0 ≤ C ∧ ∀ Q : TriadicCube d, CubeNeumannW22CalderonZygmundRegularity Q C + +/-- Chosen dimension-only constant for the legacy positive-test compatibility +package, obtained from the reflected-parent depth and component-average +constants. -/ +noncomputable def cubeNeumannW22CalderonZygmundConstant + (d : ℕ) [NeZero d] : ℝ := + originCubeWeakInteriorDepthConstantExact d 0 + + (d : ℝ) * (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + +theorem cubeNeumannW22CalderonZygmundConstant_nonneg + (d : ℕ) [NeZero d] : + 0 ≤ cubeNeumannW22CalderonZygmundConstant d := by + exact add_nonneg + (originCubeWeakInteriorDepthConstantExact_nonneg d 0) + (mul_nonneg (Nat.cast_nonneg d) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg) + +/-- Selected legacy positive-test compatibility estimate on a cube. -/ +theorem cubeNeumannW22CalderonZygmundRegularity + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + CubeNeumannW22CalderonZygmundRegularity Q + (cubeNeumannW22CalderonZygmundConstant d) := by + have hcore := + MeanZeroNeumannPoissonSolution.cubePoissonGradientDualTestNormL2CoreEstimate_cube Q + have hdepth := cubeWeakInteriorDepthConstant_eq_dimensionConstant Q + have havg := cubePoissonGradientAverageConstant_eq_dimensionConstant Q + simpa [CubeNeumannW22CalderonZygmundRegularity, + cubeNeumannW22CalderonZygmundConstant, hdepth, havg] using hcore + +/-- The legacy positive-test compatibility package has the explicit constant +above in every dimension. -/ +theorem exists_cubeNeumannW22CalderonZygmundRegularityInDimension + (d : ℕ) [NeZero d] : + ∃ C : ℝ, CubeNeumannW22CalderonZygmundRegularityInDimension d C := by + exact ⟨cubeNeumannW22CalderonZygmundConstant d, + cubeNeumannW22CalderonZygmundConstant_nonneg d, + cubeNeumannW22CalderonZygmundRegularity⟩ + +/-- Local existence form of the legacy positive-test compatibility input. -/ +theorem exists_cubeNeumannW22CalderonZygmundRegularity + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + ∃ C : ℝ, CubeNeumannW22CalderonZygmundRegularity Q C := + ⟨cubeNeumannW22CalderonZygmundConstant d, + cubeNeumannW22CalderonZygmundRegularity Q⟩ + +/-- Downstream positive-test core estimate from the legacy compatibility +package. -/ +theorem exists_cubePoissonGradientDualTestNormL2CoreEstimate + {d : ℕ} [NeZero d] (Q : TriadicCube d) : + ∃ C : ℝ, CubePoissonGradientDualTestNormL2CoreEstimate Q C := by + exact + ⟨cubeNeumannW22CalderonZygmundConstant d, + cubeNeumannW22CalderonZygmundRegularity Q⟩ + +end + +end Legacy + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex.lean new file mode 100644 index 0000000000..e64da643e9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.ReflectedEqCellSlab +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockGlobalAndApex + +/-! # Vector Field And Apex -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockFold.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockFold.lean new file mode 100644 index 0000000000..b12d37feda --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockFold.lean @@ -0,0 +1,481 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.WeakEquationHelpers + +/-! # Block Fold -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + + +namespace H1Function + +/-- Precompose an `H¹` function on the original cube with one affine +reflection-cell fold. On that cell, the weak gradient is the corresponding +linear sign fold of the original weak gradient. -/ +noncomputable def cubeFaceReflectionCellFold {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) : + H1Function (openCubeSet (cubeFaceReflectionCellCube Q choice)) := by + let cell : Set (Vec d) := openCubeSet (cubeFaceReflectionCellCube Q choice) + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + refine + { toFun := fun x => u (T x) + grad := fun x => L (u.grad (T x)) + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · have hcomp' := u.memL2.comp_measurePreserving hmp + simpa [MemL2On, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell, T] using hcomp' + · intro i + have hcomp : + MeasureTheory.MemLp (fun x => u.grad (T x)) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict cell) := by + have hcomp' := u.grad_memVectorL2.comp_measurePreserving hmp + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def, cell, T] using hcomp' + have hfold : + MeasureTheory.MemLp (fun x => L (u.grad (T x))) + (2 : ℝ≥0∞) (MeasureTheory.volume.restrict cell) := by + simpa [Function.comp_def] using L.comp_memLp' hcomp + have hfoldVector : MemVectorL2 cell (fun x => L (u.grad (T x))) := by + simpa [MemVectorL2, volumeMeasureOn] using hfold + simpa [MemL2On, MemScalarL2, volumeMeasureOn, cell, T, L] using + memScalarL2_coord_of_memVectorL2 hfoldVector i + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (T y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, T] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψ_supp : HasCompactSupport ψ := by + simpa [ψ, T] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ_supp + have hψ_sub : tsupport ψ ⊆ openCubeSet Q := by + intro y hy + have hTy : T y ∈ tsupport φ := by + rw [show ψ = φ ∘ cubeFaceReflectionCellFoldHomeomorph Q choice by + rfl, tsupport_comp_eq_preimage φ + (cubeFaceReflectionCellFoldHomeomorph Q choice)] at hy + exact hy + have hTy_cell : T y ∈ cell := hφ_sub hTy + have hpre : + T y ∈ T ⁻¹' openCubeSet Q := by + simpa [T, cell, + preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using hTy_cell + simpa [T, cubeFaceReflectionCellFoldMap_involutive Q choice y] using hpre + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hweak_coord : + ∫ x in openCubeSet Q, u x * euclideanCoordDeriv i ψ x + ∂MeasureTheory.volume = + -∫ x in openCubeSet Q, u.grad x i * ψ x + ∂MeasureTheory.volume := by + simpa [euclideanCoordDeriv] using hweak + have hleft_change : + ∫ x in cell, u (T x) * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u y * euclideanCoordDeriv i φ (T y) ∂MeasureTheory.volume := by + let g : Vec d → ℝ := fun y => u y * euclideanCoordDeriv i φ (T y) + calc + ∫ x in cell, u (T x) * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume = + ∫ x in cell, g (T x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x _hx + simp [g, T, cubeFaceReflectionCellFoldMap_involutive Q choice x] + _ = ∫ y in openCubeSet Q, g y ∂MeasureTheory.volume := by + simpa [cell, T, g] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice g + have hright_change : + ∫ x in cell, (L (u.grad (T x))) i * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, (L (u.grad y)) i * ψ y + ∂MeasureTheory.volume := by + let g : Vec d → ℝ := fun y => (L (u.grad y)) i * ψ y + calc + ∫ x in cell, (L (u.grad (T x))) i * φ x + ∂MeasureTheory.volume = + ∫ x in cell, g (T x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x _hx + simp [g, ψ, T, cubeFaceReflectionCellFoldMap_involutive Q choice x] + _ = ∫ y in openCubeSet Q, g y ∂MeasureTheory.volume := by + simpa [cell, T, g] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice g + have hderiv : + ∀ y, + euclideanCoordDeriv i ψ y = + (if choice i = 1 then (1 : ℝ) else -1) * + euclideanCoordDeriv i φ (T y) := by + intro y + have hgrad := + congrFun + (euclideanGradient_comp_cubeFaceReflectionCellFoldMap + hφ Q choice y) i + simpa [ψ, T, L, euclideanGradient, euclideanCoordDeriv] using hgrad + change + ∫ x in cell, u (T x) * euclideanCoordDeriv i φ x + ∂MeasureTheory.volume = + -∫ x in cell, (L (u.grad (T x))) i * φ x + ∂MeasureTheory.volume + rw [hleft_change, hright_change] + by_cases h1 : choice i = 1 + · have hleft : + ∫ y in openCubeSet Q, + u y * euclideanCoordDeriv i φ (T y) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u y * euclideanCoordDeriv i ψ y ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + have hy := hderiv y + simp [h1] at hy + have hy' : + euclideanCoordDeriv i φ (T y) = + euclideanCoordDeriv i ψ y := hy.symm + simp [hy'] + have hright : + ∫ y in openCubeSet Q, (L (u.grad y)) i * ψ y + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, u.grad y i * ψ y + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + simp [L, h1] + rw [hleft, hright] + simpa using hweak_coord + · have hleft : + ∫ y in openCubeSet Q, + u y * euclideanCoordDeriv i φ (T y) ∂MeasureTheory.volume = + -∫ y in openCubeSet Q, + u y * euclideanCoordDeriv i ψ y ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_neg] + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + have hy := hderiv y + simp [h1] at hy + have hy' : + euclideanCoordDeriv i φ (T y) = + -euclideanCoordDeriv i ψ y := by + linarith + change u y * euclideanCoordDeriv i φ (T y) = + -(u y * euclideanCoordDeriv i ψ y) + rw [hy'] + ring + have hright : + ∫ y in openCubeSet Q, (L (u.grad y)) i * ψ y + ∂MeasureTheory.volume = + -∫ y in openCubeSet Q, u.grad y i * ψ y + ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_neg] + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + simp [L, h1] + rw [hleft, hright] + linarith [hweak_coord] + +@[simp] theorem cubeFaceReflectionCellFold_toFun {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) (x : Vec d) : + (u.cubeFaceReflectionCellFold choice).toFun x = + u.toFun (cubeFaceReflectionCellFoldMap Q choice x) := + rfl + +@[simp] theorem cubeFaceReflectionCellFold_grad {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) (x : Vec d) : + (u.cubeFaceReflectionCellFold choice).grad x = + cubeFaceReflectionCellFoldLinear choice + (u.grad (cubeFaceReflectionCellFoldMap Q choice x)) := + rfl + +theorem cubeFaceReflectionCellFold_isPotentialOn {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (fun x => + cubeFaceReflectionCellFoldLinear choice + (u.grad (cubeFaceReflectionCellFoldMap Q choice x))) := + (u.cubeFaceReflectionCellFold choice).isPotentialOn + +/-- On a reflection cell, the reflected vector field is the weak gradient of +the cell-folded potential, using the global reflected-vector representative. -/ +theorem cubeFaceReflectionCellFold_isPotentialOn_reflectedVectorField + {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y)) := by + refine IsPotentialOn.congr_ae ?_ + (u.cubeFaceReflectionCellFold_isPotentialOn choice) + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + exact + (cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice (fun y => u.grad y) hx).symm + +/-- Single-cell weak-gradient identity for a test supported in the full +reflection block, localized to this cell by zero extension. The statement uses +the global reflected scalar/vector representatives, so it can be summed over +cells without further representative conversions. -/ +theorem cubeFaceReflectionCellFold_weakGradient_of_tsupport_subset_block + {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) + (i : Fin d) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q u.toFun x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + -∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) x) i * + φ x ∂MeasureTheory.volume := by + let cell : Set (Vec d) := openCubeSet (cubeFaceReflectionCellCube Q choice) + let φc : Vec d → ℝ := Set.indicator cell φ + have hφc : ContDiff ℝ (⊤ : ℕ∞) φc := by + simpa [φc, cell] using + contDiff_indicator_cubeFaceReflectionCell_of_tsupport_subset_block + Q choice hφ hφ_sub + have hφcs : HasCompactSupport φc := by + simpa [φc, cell] using + hasCompactSupport_indicator_cubeFaceReflectionCell Q choice hφs + have hφc_sub : tsupport φc ⊆ cell := by + simpa [φc, cell] using + tsupport_indicator_cubeFaceReflectionCell_subset Q choice hφ_sub + have hweak := + (u.cubeFaceReflectionCellFold choice).hasWeakGradient + i φc hφc hφcs hφc_sub + have hleft : + ∫ x in cell, + cubeCoordinateFoldReflectedScalar Q u.toFun x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ x in cell, + (u.cubeFaceReflectionCellFold choice) x * + euclideanCoordDeriv i φc x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hscalar := + cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice u.toFun hx + have hderiv : + euclideanCoordDeriv i φc x = euclideanCoordDeriv i φ x := by + have heq := + eventuallyEq_indicator_cubeFaceReflectionCell_of_mem + Q choice φ (by simpa [cell] using hx) + unfold euclideanCoordDeriv + rw [Filter.EventuallyEq.fderiv_eq (𝕜 := ℝ) heq] + change + cubeCoordinateFoldReflectedScalar Q u.toFun x * + euclideanCoordDeriv i φ x = + u.toFun (cubeFaceReflectionCellFoldMap Q choice x) * + euclideanCoordDeriv i φc x + rw [hscalar, hderiv] + have hright : + ∫ x in cell, + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) x) i * + φ x ∂MeasureTheory.volume = + ∫ x in cell, + (u.cubeFaceReflectionCellFold choice).grad x i * + φc x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hvec := + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice (fun y => u.grad y) hx + change + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) x) i * + φ x = + (cubeFaceReflectionCellFoldLinear choice + (u.grad (cubeFaceReflectionCellFoldMap Q choice x))) i * + φc x + rw [hvec] + simp [φc, cell, Set.indicator_of_mem hx] + change + ∫ x in cell, + cubeCoordinateFoldReflectedScalar Q u.toFun x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + -∫ x in cell, + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) x) i * + φ x ∂MeasureTheory.volume + rw [hleft, hright] + simpa [φc, euclideanCoordDeriv] using hweak + +/-- Fold an `H¹` function on the original cube to the whole all-coordinate +reflection block. The scalar part is even-reflected by coordinate folding, and +the weak gradient is the corresponding reflected vector field. -/ +noncomputable def cubeFaceReflectionBlockFold {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : + H1Function (cubeFaceReflectionBlockSet Q) := by + let S : Set (Vec d) := cubeFaceReflectionBlockSet Q + let uR : Vec d → ℝ := cubeCoordinateFoldReflectedScalar Q u.toFun + let GR : Vec d → Vec d := + cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) + have huOpen : MemScalarL2 (openCubeSet Q) u.toFun := by + simpa [MemScalarL2, volumeMeasureOn] using u.memL2 + have hGOpen : MemVectorL2 (openCubeSet Q) (fun y => u.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using u.grad_memVectorL2 + have huR : MemScalarL2 S uR := by + simpa [S, uR] using + memScalarL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + Q huOpen + have hGR : MemVectorL2 S GR := by + simpa [S, GR] using + memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + Q hGOpen + refine + { toFun := uR + grad := GR + memL2 := by + simpa [MemScalarL2, MemL2On, volumeMeasureOn, S, uR] using huR + gradMemL2 := by + intro i + simpa [MemScalarL2, MemL2On, volumeMeasureOn, S, GR] using + memScalarL2_coord_of_memVectorL2 hGR i + hasWeakGradient := ?_ } + intro i φ hφ hφs hφ_sub + let left : Vec d → ℝ := fun x => uR x * euclideanCoordDeriv i φ x + let right : Vec d → ℝ := fun x => GR x i * φ x + have hφL2 : MemScalarL2 S φ := by + have hφ_cont : Continuous φ := + (hφ.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn, S] using + (hφ_cont.memLp_of_hasCompactSupport hφs).restrict S + have hDφL2 : MemScalarL2 S (euclideanCoordDeriv i φ) := by + have hD_cont : Continuous (euclideanCoordDeriv i φ) := + (contDiff_euclideanCoordDeriv hφ i).continuous + have hD_supp : HasCompactSupport (euclideanCoordDeriv i φ) := + hasCompactSupport_euclideanCoordDeriv hφs i + simpa [MemScalarL2, volumeMeasureOn, S] using + (hD_cont.memLp_of_hasCompactSupport hD_supp).restrict S + have hGRi : MemScalarL2 S (fun x => GR x i) := + memScalarL2_coord_of_memVectorL2 hGR i + have hleftS : + MeasureTheory.Integrable left (MeasureTheory.volume.restrict S) := by + simpa [left] using! huR.integrable_mul hDφL2 + have hrightS : + MeasureTheory.Integrable right (MeasureTheory.volume.restrict S) := by + simpa [right] using! hGRi.integrable_mul hφL2 + have hcell_subset : + ∀ choice : Fin d → Fin 3, + openCubeSet (cubeFaceReflectionCellCube Q choice) ⊆ S := by + intro choice + simpa [S, openCubeSet_cubeFaceReflectionCellCube] using + cubeFaceReflectionCellSet_subset_cubeFaceReflectionBlockSet Q choice + have hleftCellInt : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable left + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + exact hleftS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (hcell_subset choice)) + have hrightCellInt : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable right + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + exact hrightS.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume + (hcell_subset choice)) + have hleftSplit : + ∫ x in S, left x ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + left x ∂MeasureTheory.volume := by + simpa [S] using + setIntegral_cubeFaceReflectionBlockSet_cellCube Q left hleftCellInt + have hrightSplit : + ∫ x in S, right x ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + right x ∂MeasureTheory.volume := by + simpa [S] using + setIntegral_cubeFaceReflectionBlockSet_cellCube Q right hrightCellInt + have hcell : + ∀ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + left x ∂MeasureTheory.volume = + -∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + right x ∂MeasureTheory.volume := by + intro choice + simpa [left, right, uR, GR] using + u.cubeFaceReflectionCellFold_weakGradient_of_tsupport_subset_block + choice hφ hφs hφ_sub i + change + ∫ x in S, left x ∂MeasureTheory.volume = + -∫ x in S, right x ∂MeasureTheory.volume + calc + ∫ x in S, left x ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + left x ∂MeasureTheory.volume := hleftSplit + _ = ∑ choice : Fin d → Fin 3, + -∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + right x ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + exact hcell choice + _ = -∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + right x ∂MeasureTheory.volume := by + simp + _ = -∫ x in S, right x ∂MeasureTheory.volume := by + rw [hrightSplit] + +@[simp] theorem cubeFaceReflectionBlockFold_toFun {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (x : Vec d) : + u.cubeFaceReflectionBlockFold.toFun x = + cubeCoordinateFoldReflectedScalar Q u.toFun x := + rfl + +@[simp] theorem cubeFaceReflectionBlockFold_grad {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (x : Vec d) : + u.cubeFaceReflectionBlockFold.grad x = + cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) x := + rfl + +/-- The reflected vector field on the whole reflection block is a Sobolev +potential, witnessed by the block-folded scalar potential. -/ +theorem cubeFaceReflectionBlockFold_isPotentialOn {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : + IsPotentialOn (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y)) := + u.cubeFaceReflectionBlockFold.isPotentialOn + +end H1Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockGlobalAndApex.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockGlobalAndApex.lean new file mode 100644 index 0000000000..ee12072a32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/BlockGlobalAndApex.lean @@ -0,0 +1,858 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.FoldedAndWeakScalar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.ReflectedEqCellSlab + +/-! # Block Global And Apex -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + +/-- Compact-test weak equation on the full all-coordinate reflection block, +obtained by summing the single-cell weak equations over the finite `3^d` +cell decomposition. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + classical + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + let gradBlock : Vec d → ℝ := fun x => + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (euclideanGradient φ x) + let forceBlock : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedScalar Q F x * φ x + have hGopen : MemVectorL2 (openCubeSet Q) G := by + simpa [MemVectorL2, volumeMeasureOn, G] using + W.w.toH1Function.grad_memVectorL2 + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using hF + have hgradCellInt : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable gradBlock + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let ψ : Vec d → ℝ := + fun y => φ (cubeFaceReflectionCellFoldMap Q choice y) + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψs : HasCompactSupport ψ := by + simpa [ψ] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφs + have hgradψ : MemVectorL2 (openCubeSet Q) (euclideanGradient ψ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψ hψs + have hbase : + MeasureTheory.Integrable + (fun y => vecDot (G y) (euclideanGradient ψ y)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) hGopen hgradψ + have hcomp : + MeasureTheory.Integrable + (fun x => + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient ψ + (cubeFaceReflectionCellFoldMap Q choice x))) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) + (g := fun y => vecDot (G y) (euclideanGradient ψ y)) hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + have hvec := + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice G hx + have hgradAtFold : + euclideanGradient ψ (cubeFaceReflectionCellFoldMap Q choice x) = + cubeFaceReflectionCellFoldLinear choice (euclideanGradient φ x) := by + have hg := + euclideanGradient_comp_cubeFaceReflectionCellFoldMap + hφ Q choice (cubeFaceReflectionCellFoldMap Q choice x) + simpa [ψ, cubeFaceReflectionCellFoldMap_involutive Q choice x] using hg + calc + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient ψ + (cubeFaceReflectionCellFoldMap Q choice x)) = + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ x)) := by + rw [hgradAtFold] + _ = vecDot + (cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (euclideanGradient φ x) := by + exact + (vecDot_cubeFaceReflectionCellFoldLinear_left + choice (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient φ x)).symm + _ = gradBlock x := by + simp [gradBlock, hvec] + have hforceCellInt : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable forceBlock + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let ψ : Vec d → ℝ := + fun y => φ (cubeFaceReflectionCellFoldMap Q choice y) + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψs : HasCompactSupport ψ := by + simpa [ψ] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφs + have hψL2 : MemScalarL2 (openCubeSet Q) ψ := by + have hψ_cont : Continuous ψ := + (hψ.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn] using + (hψ_cont.memLp_of_hasCompactSupport hψs).restrict (openCubeSet Q) + have hbase : + MeasureTheory.Integrable (fun y => F y * ψ y) + (MeasureTheory.volume.restrict (openCubeSet Q)) := + hFopen.integrable_mul hψL2 + have hcomp : + MeasureTheory.Integrable + (fun x => + F (cubeFaceReflectionCellFoldMap Q choice x) * + ψ (cubeFaceReflectionCellFoldMap Q choice x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := fun y => F y * ψ y) hbase + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + have hscalar := + cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice F hx + have hψfold : + ψ (cubeFaceReflectionCellFoldMap Q choice x) = φ x := by + simp [ψ, cubeFaceReflectionCellFoldMap_involutive Q choice x] + change + F (cubeFaceReflectionCellFoldMap Q choice x) * + ψ (cubeFaceReflectionCellFoldMap Q choice x) = + forceBlock x + simp [forceBlock, hscalar, hψfold] + have hgradSplit : + ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x + ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + gradBlock x ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cellCube Q gradBlock hgradCellInt + have hforceSplit : + ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x + ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + forceBlock x ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cellCube Q forceBlock hforceCellInt + have hcellEq : + ∀ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + gradBlock x ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + forceBlock x ∂MeasureTheory.volume := by + intro choice + simpa [gradBlock, forceBlock, G] using + W.cubeFaceReflectionCell_reflectedVectorField_weakEquationOnCell_of_compactSupport + choice hφ hφs hmean hF + change + ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x + ∂MeasureTheory.volume + calc + ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x + ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + gradBlock x ∂MeasureTheory.volume := hgradSplit + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + forceBlock x ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + exact hcellEq choice + _ = ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x + ∂MeasureTheory.volume := hforceSplit.symm + +/-- Compact-test weak equation on the full all-coordinate reflection block, +with the right-hand side given in the normalized cube `L²` measure used by the +endpoint interfaces. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + have hFopen : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MemL2On, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport + hφ hφs hmean hFopen + +/-- Promote the reflected-block compact-test weak equation to a whole-space +weak equation when the chosen test has zero contribution off the reflected +block. + +This is the interface used by the smooth Euclidean `-Δu` test: a mollified or +cutoff test supported inside the reflection block can be read as a global +compactly supported test on `ℝ^d`. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_compl_zero + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hgrad_zero : + ∀ x, x ∉ cubeFaceReflectionBlockSet Q → + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) = 0) + (hforce_zero : + ∀ x, x ∉ cubeFaceReflectionBlockSet Q → + cubeCoordinateFoldReflectedScalar Q F x * φ x = 0) : + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + let gradBlock : Vec d → ℝ := fun x => + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) + let forceBlock : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedScalar Q F x * φ x + have hgrad_univ : + ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x ∂MeasureTheory.volume = + ∫ x, gradBlock x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + (s := cubeFaceReflectionBlockSet Q) (μ := MeasureTheory.volume) + (f := gradBlock) (by simpa [gradBlock] using hgrad_zero) + have hforce_univ : + ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x ∂MeasureTheory.volume = + ∫ x, forceBlock x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + (s := cubeFaceReflectionBlockSet Q) (μ := MeasureTheory.volume) + (f := forceBlock) (by simpa [forceBlock] using hforce_zero) + have hblock : + ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x + ∂MeasureTheory.volume := by + simpa [gradBlock, forceBlock] using + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport_of_memLp_normalizedCubeMeasure + hφ hφs hmean hF + calc + ∫ x, gradBlock x ∂MeasureTheory.volume + = ∫ x in cubeFaceReflectionBlockSet Q, gradBlock x + ∂MeasureTheory.volume := hgrad_univ.symm + _ = ∫ x in cubeFaceReflectionBlockSet Q, forceBlock x + ∂MeasureTheory.volume := hblock + _ = ∫ x, forceBlock x ∂MeasureTheory.volume := hforce_univ + +/-- Whole-space reflected weak equation from pointwise zero of the test and +its Euclidean gradient off the reflection block. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_test_zero + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hφ_zero : + ∀ x, x ∉ cubeFaceReflectionBlockSet Q → φ x = 0) + (hgradφ_zero : + ∀ x, x ∉ cubeFaceReflectionBlockSet Q → + euclideanGradient φ x = 0) : + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_compl_zero + hφ hφs hmean hF + (by + intro x hx + rw [hgradφ_zero x hx] + simp [vecDot]) + (by + intro x hx + rw [hφ_zero x hx] + simp) + +/-- Whole-space reflected weak equation for compact smooth tests whose +topological support is contained in the reflection block. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_tsupport_subset + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_test_zero + hφ hφs hmean hF + (by + intro x hx + exact image_eq_zero_of_notMem_tsupport fun hxt => hx (hφ_sub hxt)) + (by + intro x hx + exact euclideanGradient_eq_zero_of_notMem_tsupport fun hxt => hx (hφ_sub hxt)) + +/-- Whole-space reflected weak equation with the reflected forcing localized by +the reflection-block indicator. This is the global forcing form used by +Euclidean `L²` estimates. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_indicator_of_tsupport_subset + (W : MeanZeroNeumannPoissonSolution Q F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x * φ x + ∂MeasureTheory.volume := by + have hbase := + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_of_tsupport_subset + hφ hφs hφ_sub hmean hF + refine hbase.trans ?_ + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + by_cases hx : x ∈ cubeFaceReflectionBlockSet Q + · simp [hx] + · have hxt : x ∉ tsupport φ := fun h => hx (hφ_sub h) + simp [hx, image_eq_zero_of_notMem_tsupport hxt] + +/-- The reflected Neumann gradient is `L²` on the full reflection block. -/ +theorem cubeFaceReflectionBlock_reflectedGradient_memVectorL2 + (W : MeanZeroNeumannPoissonSolution Q F) : + MemVectorL2 (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y)) := by + have hGopen : MemVectorL2 (openCubeSet Q) + (fun y => W.w.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + exact + memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + Q hGopen + +/-- The block-indicator localization of the reflected Neumann gradient is a +global `L²` vector field. -/ +theorem cubeFaceReflectionBlock_reflectedGradient_indicator_memLp + (W : MeanZeroNeumannPoissonSolution Q F) : + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y))) + (2 : ℝ≥0∞) MeasureTheory.volume := by + have hGopen : MemVectorL2 (openCubeSet Q) + (fun y => W.w.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + exact + memLp_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + Q hGopen + +/-- Global reflected weak equation packaged with the global `L²` forcing +witness needed by Euclidean estimates. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_globalWeakEquationWithL2Forcing + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F)) + (2 : ℝ≥0∞) MeasureTheory.volume ∧ + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ cubeFaceReflectionBlockSet Q → + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x * φ x + ∂MeasureTheory.volume := by + constructor + · have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + memLp_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + Q hFopen + · intro φ hφ hφs hφ_sub + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOn_univ_indicator_of_tsupport_subset + hφ hφs hφ_sub hmean hF + +/-- Global reflected weak equation packaged with both global `L²` data: the +block-indicator reflected gradient and the block-indicator reflected forcing. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_globalWeakEquationWithL2Data + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y))) + (2 : ℝ≥0∞) MeasureTheory.volume ∧ + MeasureTheory.MemLp + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F)) + (2 : ℝ≥0∞) MeasureTheory.volume ∧ + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ cubeFaceReflectionBlockSet Q → + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x, + Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x * φ x + ∂MeasureTheory.volume := by + refine ⟨W.cubeFaceReflectionBlock_reflectedGradient_indicator_memLp, ?_⟩ + exact + W.cubeFaceReflectionBlock_reflectedVectorField_globalWeakEquationWithL2Forcing + hmean hF + +/-- H10-test version of the reflected weak equation on the all-coordinate +reflection block. This is the density bridge from the compact-test reflection +identity to the Sobolev test space needed for the eventual reflected +potential/limit argument. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_h10 + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∀ φ : H10Function (cubeFaceReflectionBlockSet Q), + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + φ.toH1Function x ∂MeasureTheory.volume := by + let U : Set (Vec d) := cubeFaceReflectionBlockSet Q + let G : Vec d → Vec d := + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) + let fR : Vec d → ℝ := cubeCoordinateFoldReflectedScalar Q F + have hG : MemVectorL2 U G := by + simpa [U, G] using + W.cubeFaceReflectionBlock_reflectedGradient_memVectorL2 + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + have hfR : MemScalarL2 U fR := by + simpa [U, fR] using + memScalarL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + Q hFopen + have htest : + ∀ ψ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) ψ → HasCompactSupport ψ → + tsupport ψ ⊆ U → + ∫ x in U, vecDot (G x) (euclideanGradient ψ x) + ∂MeasureTheory.volume = + ∫ x in U, fR x * ψ x ∂MeasureTheory.volume := by + intro ψ hψ hψs _hψ_sub + simpa [U, G, fR] using + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport_of_memLp_normalizedCubeMeasure + (by simpa using hψ) hψs hmean hF + simpa [U, G, fR] using + h10WeakEquationOn_of_contDiff_tests + (U := U) (G := G) (f := fR) + (isOpen_cubeFaceReflectionBlockSet Q) hG hfR htest + +/-- Energy identity obtained by testing the reflected H10 weak equation against +a supplied H10 potential for the reflected gradient. This isolates the next +hard step: constructing such a potential for the reflected Neumann gradient. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_energyIdentity_of_h10Potential + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (uR : H10Function (cubeFaceReflectionBlockSet Q)) + (huR_grad : + uR.toH1Function.grad = + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y)) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + uR.toH1Function x ∂MeasureTheory.volume := by + have hweak := + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_h10 + hmean hF uR + simpa [huR_grad] using hweak + +/-- Energy identity for the reflected block-folded H¹ potential. This avoids +any zero-trace claim: both sides are reduced by cell reflection to `3^d` +copies of the original Neumann self-test identity on `Q`. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_energyIdentity_blockFold + (W : MeanZeroNeumannPoissonSolution Q F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + (H1Function.cubeFaceReflectionBlockFold W.w.toH1Function).toFun x + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + have hGopen : MemVectorL2 (openCubeSet Q) G := by + simpa [G, MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + have huopen : MemScalarL2 (openCubeSet Q) W.w.toH1Function.toFun := by + simpa [MemScalarL2, volumeMeasureOn] using + W.w.toH1Function.memL2 + have hleft : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + Q hGopen + have hright : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q W.w.toH1Function.toFun x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, + F y * W.w.toH1Function.toFun y ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_mul_of_memScalarL2_three_pow + Q hFopen huopen + calc + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + simpa [G] using hleft + _ = (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, + F y * W.w.toH1Function.toFun y ∂MeasureTheory.volume := by + rw [W.equation_self] + _ = ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q W.w.toH1Function.toFun x + ∂MeasureTheory.volume := hright.symm + _ = ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + (H1Function.cubeFaceReflectionBlockFold W.w.toH1Function).toFun x + ∂MeasureTheory.volume := by + simp [H1Function.cubeFaceReflectionBlockFold_toFun] + +/-- Smooth localized Euclidean CZ estimate obtained from the reflected weak +equation, assuming the smooth potential has the reflected vector field as its +gradient. This isolates the remaining density/mollification bridge. -/ +theorem cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ cubeFaceReflectionBlockSet Q) + (hgrad : + (fun x => euclideanGradient u x) =ᵐ[MeasureTheory.volume] + fun x => + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 + ∂MeasureTheory.volume) ≤ + (∫ x, + ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + let fR : Vec d → ℝ := + Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) + have hcontract := + W.cubeFaceReflectionBlock_reflectedVectorField_globalWeakEquationWithL2Forcing + hmean hF + have hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ cubeFaceReflectionBlockSet Q → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x, fR x * φ x ∂MeasureTheory.volume := by + intro φ hφ hφs hφ_sub + calc + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hgrad] with x hx + rw [hx] + _ = ∫ x, fR x * φ x ∂MeasureTheory.volume := by + simpa [fR] using hcontract.2 φ hφ hφs hφ_sub + simpa [fR] using + integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_mul_laplacian_l2_of_tsupport_subset + (U := cubeFaceReflectionBlockSet Q) hu hu_supp hu_sub hcontract.1 hweak + +/-- Smooth localized Euclidean CZ estimate from the reflected weak equation, +with the all-space reflected forcing norm converted back to the original cube +forcing energy. -/ +theorem cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient_cubeEnergy + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ cubeFaceReflectionBlockSet Q) + (hgrad : + (fun x => euclideanGradient u x) =ᵐ[MeasureTheory.volume] + fun x => + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 + ∂MeasureTheory.volume) ≤ + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume) ^ + (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + have hbase := + W.cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient + hmean hF hu hu_supp hu_sub hgrad + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + have hforce : + ∫ x, + ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := + integral_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_norm_sq + Q hFopen + have hforce_sq : + ∫ x, + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x) ^ 2 + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + simpa [pow_two, Real.norm_eq_abs] using hforce + simpa [hforce_sq] using hbase + +/-- Smooth localized reflected Euclidean CZ estimate with the Laplacian factor +cancelled on the Euclidean side. -/ +theorem cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient_forcingL2 + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ cubeFaceReflectionBlockSet Q) + (hgrad : + (fun x => euclideanGradient u x) =ᵐ[MeasureTheory.volume] + fun x => + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 + ∂MeasureTheory.volume) ≤ + ∫ x, + ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume := by + let fR : Vec d → ℝ := + Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) + have hcontract := + W.cubeFaceReflectionBlock_reflectedVectorField_globalWeakEquationWithL2Forcing + hmean hF + have hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ cubeFaceReflectionBlockSet Q → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x, fR x * φ x ∂MeasureTheory.volume := by + intro φ hφ hφs hφ_sub + calc + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x, + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards [hgrad] with x hx + rw [hx] + _ = ∫ x, fR x * φ x ∂MeasureTheory.volume := by + simpa [fR] using hcontract.2 φ hφ hφs hφ_sub + simpa [fR] using + integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_of_tsupport_subset + (U := cubeFaceReflectionBlockSet Q) hu hu_supp hu_sub hcontract.1 hweak + +/-- Smooth localized reflected Euclidean CZ estimate with forcing energy +converted back to the original cube. -/ +theorem cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient_cubeForcingL2 + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ cubeFaceReflectionBlockSet Q) + (hgrad : + (fun x => euclideanGradient u x) =ᵐ[MeasureTheory.volume] + fun x => + cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 + ∂MeasureTheory.volume) ≤ + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + have hbase := + W.cubeFaceReflectionBlock_smoothLocalizedEuclideanCZ_of_reflectedGradient_forcingL2 + hmean hF hu hu_supp hu_sub hgrad + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + have hforce : + ∫ x, + ‖Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := + integral_indicator_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_norm_sq + Q hFopen + have hforce_sq : + ∫ x, + (Set.indicator (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedScalar Q F) x) ^ 2 + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y * F y ∂MeasureTheory.volume := by + simpa [pow_two, Real.norm_eq_abs] using hforce + simpa [hforce_sq] using hbase + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/ReflectedEqCellSlab.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/ReflectedEqCellSlab.lean new file mode 100644 index 0000000000..c1fe78f376 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/ReflectedEqCellSlab.lean @@ -0,0 +1,773 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.FoldedAndWeakScalar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex.BlockFold + +/-! # Reflected Eq Cell Slab -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + +/-- The reflected Neumann gradient is a Sobolev potential on each individual +reflection cell. This is the cellwise gluing datum for the global block +construction. -/ +theorem cubeFaceReflectionCell_reflectedGradient_isPotentialOn + (W : MeanZeroNeumannPoissonSolution Q F) + (choice : Fin d → Fin 3) : + IsPotentialOn (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y)) := by + exact + W.w.toH1Function.cubeFaceReflectionCellFold_isPotentialOn_reflectedVectorField + choice + +/-- The reflected Neumann gradient is a Sobolev potential on the whole +all-coordinate reflection block. -/ +theorem cubeFaceReflectionBlock_reflectedGradient_isPotentialOn + (W : MeanZeroNeumannPoissonSolution Q F) : + IsPotentialOn (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y)) := by + exact W.w.toH1Function.cubeFaceReflectionBlockFold_isPotentialOn + +/-- Upper-face reflected weak equation in reflected-field notation. -/ +theorem upperFace_reflectedVectorField_weakEquationOnUnion + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (upperFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + have hUnion : + MeasurableSet (openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i)) := + (measurableSet_openCubeSet Q).union + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) + have hgrad_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (upperFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [upperFaceReflectedVectorField, + upperFaceReflectedGradientPairingIntegrand, hxQ] + · simp [upperFaceReflectedVectorField, + upperFaceReflectedGradientPairingIntegrand, hxQ] + have hforce_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [upperFaceReflectedScalar, upperFaceReflectedForcingIntegrand, hxQ] + · simp [upperFaceReflectedScalar, upperFaceReflectedForcingIntegrand, hxQ] + rw [hgrad_eq, hforce_eq] + exact + W.upperFace_reflectedWeakEquationOnUnion + i hφ hmean hgradMain hgradReflected hF hFmain hFreflected + +/-- Lower-face reflected weak equation in reflected-field notation. -/ +theorem lowerFace_reflectedVectorField_weakEquationOnUnion + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hmean : cubeAverage Q F = 0) + (hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hgradReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hF : + MeasureTheory.Integrable F + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) + (MeasureTheory.volume.restrict (openCubeSet Q))) + (hFreflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (lowerFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + have hUnion : + MeasurableSet (openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i)) := + (measurableSet_openCubeSet Q).union + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) + have hgrad_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (lowerFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [lowerFaceReflectedVectorField, + lowerFaceReflectedGradientPairingIntegrand, hxQ] + · simp [lowerFaceReflectedVectorField, + lowerFaceReflectedGradientPairingIntegrand, hxQ] + have hforce_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [lowerFaceReflectedScalar, lowerFaceReflectedForcingIntegrand, hxQ] + · simp [lowerFaceReflectedScalar, lowerFaceReflectedForcingIntegrand, hxQ] + rw [hgrad_eq, hforce_eq] + exact + W.lowerFace_reflectedWeakEquationOnUnion + i hφ hmean hgradMain hgradReflected hF hFmain hFreflected + +/-- Compact-test upper-face reflected weak equation in reflected-field +notation, using the normalized cube `L²` hypothesis from the endpoint +interfaces. -/ +theorem upperFace_reflectedVectorField_weakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (upperFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + have hUnion : + MeasurableSet (openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i)) := + (measurableSet_openCubeSet Q).union + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) + have hgrad_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (upperFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [upperFaceReflectedVectorField, + upperFaceReflectedGradientPairingIntegrand, hxQ] + · simp [upperFaceReflectedVectorField, + upperFaceReflectedGradientPairingIntegrand, hxQ] + have hforce_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedScalar Q i F x * φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + upperFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [upperFaceReflectedScalar, upperFaceReflectedForcingIntegrand, hxQ] + · simp [upperFaceReflectedScalar, upperFaceReflectedForcingIntegrand, hxQ] + rw [hgrad_eq, hforce_eq] + exact + W.upperFace_reflectedWeakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + i hφ hφs hmean hF + +/-- Compact-test lower-face reflected weak equation in reflected-field +notation, using the normalized cube `L²` hypothesis from the endpoint +interfaces. -/ +theorem lowerFace_reflectedVectorField_weakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (lowerFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + have hUnion : + MeasurableSet (openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i)) := + (measurableSet_openCubeSet Q).union + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) + have hgrad_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (lowerFaceReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedGradientPairingIntegrand Q i + (fun y => W.w.toH1Function.grad y) φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [lowerFaceReflectedVectorField, + lowerFaceReflectedGradientPairingIntegrand, hxQ] + · simp [lowerFaceReflectedVectorField, + lowerFaceReflectedGradientPairingIntegrand, hxQ] + have hforce_eq : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedScalar Q i F x * φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + lowerFaceReflectedForcingIntegrand Q i F φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hUnion ?_ + intro x _hx + by_cases hxQ : x ∈ openCubeSet Q + · simp [lowerFaceReflectedScalar, lowerFaceReflectedForcingIntegrand, hxQ] + · simp [lowerFaceReflectedScalar, lowerFaceReflectedForcingIntegrand, hxQ] + rw [hgrad_eq, hforce_eq] + exact + W.lowerFace_reflectedWeakEquationOnUnion_of_compactSupport_of_memLp_normalizedCubeMeasure + i hφ hφs hmean hF + +/-- Compact-test weak equation on the lower/original/upper one-coordinate +reflected slab, in reflected-field notation. Algebraically this is the lower +one-face reflected equation plus the upper one-face reflected equation, minus +the original cube equation. -/ +theorem faceNeighborSlab_reflectedVectorField_weakEquationOnSlab_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in cubeFaceNeighborSlabSet Q i, + vecDot + (faceNeighborSlabReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceNeighborSlabSet Q i, + faceNeighborSlabReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + classical + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + let S := cubeFaceNeighborSlabSet Q i + let gradSlab : Vec d → ℝ := fun x => + vecDot (faceNeighborSlabReflectedVectorField Q i G x) + (euclideanGradient φ x) + let forceSlab : Vec d → ℝ := fun x => + faceNeighborSlabReflectedScalar Q i F x * φ x + let gradL : ℝ := + ∫ x in L, + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + let gradM : ℝ := + ∫ x in M, vecDot (G x) (euclideanGradient φ x) + ∂MeasureTheory.volume + let gradU : ℝ := + ∫ x in U, + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + let forceL : ℝ := + ∫ x in L, F (cubeLowerFaceReflection Q i x) * φ x + ∂MeasureTheory.volume + let forceM : ℝ := + ∫ x in M, F x * φ x ∂MeasureTheory.volume + let forceU : ℝ := + ∫ x in U, F (cubeUpperFaceReflection Q i x) * φ x + ∂MeasureTheory.volume + have hFopen : MemScalarL2 M F := by + simpa [MemScalarL2, volumeMeasureOn, M] using hF + have hGopen : MemVectorL2 M G := by + simpa [MemVectorL2, volumeMeasureOn, G, M] using + W.w.toH1Function.grad_memVectorL2 + let : MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict M) := by + simpa [M] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let ψU : Vec d → ℝ := fun z => φ (cubeUpperFaceReflection Q i z) + let ψL : Vec d → ℝ := fun z => φ (cubeLowerFaceReflection Q i z) + have hψU : ContDiff ℝ (⊤ : ℕ∞) ψU := by + simpa [ψU, cubeUpperFaceReflection] using! + hφ.comp (contDiff_coordFaceReflection (cubeUpperFaceCoord Q i) i) + have hψL : ContDiff ℝ (⊤ : ℕ∞) ψL := by + simpa [ψL, cubeLowerFaceReflection] using! + hφ.comp (contDiff_coordFaceReflection (cubeLowerFaceCoord Q i) i) + have hψUs : HasCompactSupport ψU := by + simpa [ψU] using hasCompactSupport_comp_cubeUpperFaceReflection hφs Q i + have hψLs : HasCompactSupport ψL := by + simpa [ψL] using hasCompactSupport_comp_cubeLowerFaceReflection hφs Q i + have hgradMain : + MeasureTheory.Integrable + (fun x => vecDot (W.w.toH1Function.grad x) (euclideanGradient φ x)) + (MeasureTheory.volume.restrict M) := by + have hgradφ : MemVectorL2 M (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + simpa [MeasureTheory.IntegrableOn, G, M] using + integrableOn_vecDot_of_memVectorL2 (U := M) hGopen hgradφ + have hgradUpperReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict M) := by + have hgradψU : MemVectorL2 M (euclideanGradient ψU) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψU hψUs + simpa [MeasureTheory.IntegrableOn, G, M, ψU] using + integrableOn_vecDot_of_memVectorL2 (U := M) hGopen hgradψU + have hgradLowerReflected : + MeasureTheory.Integrable + (fun x => + vecDot (W.w.toH1Function.grad x) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) x)) + (MeasureTheory.volume.restrict M) := by + have hgradψL : MemVectorL2 M (euclideanGradient ψL) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hψL hψLs + simpa [MeasureTheory.IntegrableOn, G, M, ψL] using + integrableOn_vecDot_of_memVectorL2 (U := M) hGopen hgradψL + have hFint : + MeasureTheory.Integrable F (MeasureTheory.volume.restrict M) := + hFopen.integrable (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hφL2 : MemScalarL2 M φ := by + have hφ_cont : Continuous φ := (hφ.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn, M] using + (hφ_cont.memLp_of_hasCompactSupport hφs).restrict M + have hψUL2 : MemScalarL2 M ψU := by + have hψU_cont : Continuous ψU := + (hψU.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn, M] using + (hψU_cont.memLp_of_hasCompactSupport hψUs).restrict M + have hψLL2 : MemScalarL2 M ψL := by + have hψL_cont : Continuous ψL := + (hψL.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn, M] using + (hψL_cont.memLp_of_hasCompactSupport hψLs).restrict M + have hFmain : + MeasureTheory.Integrable + (fun x => F x * φ x) (MeasureTheory.volume.restrict M) := + hFopen.integrable_mul hφL2 + have hFupperReflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeUpperFaceReflection Q i x)) + (MeasureTheory.volume.restrict M) := by + simpa [ψU] using! hFopen.integrable_mul hψUL2 + have hFlowerReflected : + MeasureTheory.Integrable + (fun x => F x * φ (cubeLowerFaceReflection Q i x)) + (MeasureTheory.volume.restrict M) := by + simpa [ψL] using! hFopen.integrable_mul hψLL2 + have hUpperEq : gradM + gradU = forceM + forceU := by + simpa [gradM, gradU, forceM, forceU, G, M, U] using + W.upperFace_reflectedGradient_pairing_eq_reflectedRhs + i hφ hmean hgradMain hgradUpperReflected hFint hFmain + hFupperReflected + have hLowerEq : gradM + gradL = forceM + forceL := by + simpa [gradM, gradL, forceM, forceL, G, M, L] using + W.lowerFace_reflectedGradient_pairing_eq_reflectedRhs + i hφ hmean hgradMain hgradLowerReflected hFint hFmain + hFlowerReflected + have hCubeEq : gradM = forceM := by + simpa [gradM, forceM, G, M] using + W.weakEquationOnCube_of_compactSupport + hφ hφs hmean hF + have hGslab : MemVectorL2 S (faceNeighborSlabReflectedVectorField Q i G) := by + simpa [S, M] using + memVectorL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedVectorField + Q i hGopen + have hgradφSlab : MemVectorL2 S (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + have hgradSlabInt : + MeasureTheory.Integrable gradSlab (MeasureTheory.volume.restrict S) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, gradSlab] using + integrableOn_vecDot_of_memVectorL2 (U := S) hGslab hgradφSlab + have hFslab : MemScalarL2 S (faceNeighborSlabReflectedScalar Q i F) := by + simpa [S, M] using + memScalarL2_cubeFaceNeighborSlabSet_faceNeighborSlabReflectedScalar + Q i hFopen + have hφSlab : MemScalarL2 S φ := by + have hφ_cont : Continuous φ := (hφ.differentiable (by simp)).continuous + simpa [MemScalarL2, volumeMeasureOn, S] using + (hφ_cont.memLp_of_hasCompactSupport hφs).restrict S + have hforceSlabInt : + MeasureTheory.Integrable forceSlab (MeasureTheory.volume.restrict S) := by + simpa [forceSlab] using! hFslab.integrable_mul hφSlab + have hLsub : L ⊆ S := by + intro x hx + exact Or.inl (Or.inl hx) + have hMsub : M ⊆ S := by + intro x hx + exact Or.inl (Or.inr hx) + have hUsub : U ⊆ S := by + intro x hx + exact Or.inr hx + have hgradL_int : + MeasureTheory.Integrable gradSlab (MeasureTheory.volume.restrict L) := + hgradSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hLsub) + have hgradM_int : + MeasureTheory.Integrable gradSlab (MeasureTheory.volume.restrict M) := + hgradSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hMsub) + have hgradU_int : + MeasureTheory.Integrable gradSlab (MeasureTheory.volume.restrict U) := + hgradSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hUsub) + have hforceL_int : + MeasureTheory.Integrable forceSlab (MeasureTheory.volume.restrict L) := + hforceSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hLsub) + have hforceM_int : + MeasureTheory.Integrable forceSlab (MeasureTheory.volume.restrict M) := + hforceSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hMsub) + have hforceU_int : + MeasureTheory.Integrable forceSlab (MeasureTheory.volume.restrict U) := + hforceSlabInt.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hUsub) + have hgradL_eq : + ∫ x in L, gradSlab x ∂MeasureTheory.volume = gradL := by + change + ∫ x in L, gradSlab x ∂MeasureTheory.volume = + ∫ x in L, + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + simpa [gradSlab, L] using + congrArg (fun v => vecDot v (euclideanGradient φ x)) + (faceNeighborSlabReflectedVectorField_of_mem_lower Q i G + (x := x) hx) + have hgradM_eq : + ∫ x in M, gradSlab x ∂MeasureTheory.volume = gradM := by + change + ∫ x in M, gradSlab x ∂MeasureTheory.volume = + ∫ x in M, vecDot (G x) (euclideanGradient φ x) + ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simpa [gradSlab, M] using + congrArg (fun v => vecDot v (euclideanGradient φ x)) + (faceNeighborSlabReflectedVectorField_of_mem_cube Q i G + (x := x) hx) + have hgradU_eq : + ∫ x in U, gradSlab x ∂MeasureTheory.volume = gradU := by + change + ∫ x in U, gradSlab x ∂MeasureTheory.volume = + ∫ x in U, + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + simpa [gradSlab, U] using + congrArg (fun v => vecDot v (euclideanGradient φ x)) + (faceNeighborSlabReflectedVectorField_of_mem_upper Q i G + (x := x) hx) + have hforceL_eq : + ∫ x in L, forceSlab x ∂MeasureTheory.volume = forceL := by + change + ∫ x in L, forceSlab x ∂MeasureTheory.volume = + ∫ x in L, F (cubeLowerFaceReflection Q i x) * φ x + ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) ?_ + intro x hx + simpa [forceSlab, L] using + congrArg (fun y => y * φ x) + (faceNeighborSlabReflectedScalar_of_mem_lower Q i F + (x := x) hx) + have hforceM_eq : + ∫ x in M, forceSlab x ∂MeasureTheory.volume = forceM := by + change + ∫ x in M, forceSlab x ∂MeasureTheory.volume = + ∫ x in M, F x * φ x ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro x hx + simpa [forceSlab, M] using + congrArg (fun y => y * φ x) + (faceNeighborSlabReflectedScalar_of_mem_cube Q i F (x := x) hx) + have hforceU_eq : + ∫ x in U, forceSlab x ∂MeasureTheory.volume = forceU := by + change + ∫ x in U, forceSlab x ∂MeasureTheory.volume = + ∫ x in U, F (cubeUpperFaceReflection Q i x) * φ x + ∂MeasureTheory.volume + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) ?_ + intro x hx + simpa [forceSlab, U] using + congrArg (fun y => y * φ x) + (faceNeighborSlabReflectedScalar_of_mem_upper Q i F + (x := x) hx) + have hgradSplit : + ∫ x in S, gradSlab x ∂MeasureTheory.volume = + gradL + gradM + gradU := by + calc + ∫ x in S, gradSlab x ∂MeasureTheory.volume = + ∫ x in L, gradSlab x ∂MeasureTheory.volume + + ∫ x in M, gradSlab x ∂MeasureTheory.volume + + ∫ x in U, gradSlab x ∂MeasureTheory.volume := by + simpa [S, L, M, U] using + setIntegral_cubeFaceNeighborSlabSet Q i gradSlab + hgradL_int hgradM_int hgradU_int + _ = gradL + gradM + gradU := by + rw [hgradL_eq, hgradM_eq, hgradU_eq] + have hforceSplit : + ∫ x in S, forceSlab x ∂MeasureTheory.volume = + forceL + forceM + forceU := by + calc + ∫ x in S, forceSlab x ∂MeasureTheory.volume = + ∫ x in L, forceSlab x ∂MeasureTheory.volume + + ∫ x in M, forceSlab x ∂MeasureTheory.volume + + ∫ x in U, forceSlab x ∂MeasureTheory.volume := by + simpa [S, L, M, U] using + setIntegral_cubeFaceNeighborSlabSet Q i forceSlab + hforceL_int hforceM_int hforceU_int + _ = forceL + forceM + forceU := by + rw [hforceL_eq, hforceM_eq, hforceU_eq] + have hAlgebra : gradL + gradM + gradU = forceL + forceM + forceU := by + calc + gradL + gradM + gradU = + (gradM + gradL) + (gradM + gradU) - gradM := by ring + _ = (forceM + forceL) + (forceM + forceU) - forceM := by + rw [hLowerEq, hUpperEq, hCubeEq] + _ = forceL + forceM + forceU := by ring + change + ∫ x in S, gradSlab x ∂MeasureTheory.volume = + ∫ x in S, forceSlab x ∂MeasureTheory.volume + rw [hgradSplit, hforceSplit] + exact hAlgebra + +/-- Compact-test weak equation on the lower/original/upper one-coordinate +reflected slab, with the right-hand side given in the normalized cube `L²` +measure used by the endpoint interfaces. -/ +theorem faceNeighborSlab_reflectedVectorField_weakEquationOnSlab_of_compactSupport_of_memLp_normalizedCubeMeasure + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in cubeFaceNeighborSlabSet Q i, + vecDot + (faceNeighborSlabReflectedVectorField Q i + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in cubeFaceNeighborSlabSet Q i, + faceNeighborSlabReflectedScalar Q i F x * φ x + ∂MeasureTheory.volume := by + have hFopen : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa [MemL2On, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + W.faceNeighborSlab_reflectedVectorField_weakEquationOnSlab_of_compactSupport + i hφ hφs hmean hFopen + +/-- Compact-test weak equation on a single all-coordinate reflection-block +cell. The proof tests the original cube equation with `φ` precomposed by the +cell fold, then changes variables through the fold map. -/ +theorem cubeFaceReflectionCell_reflectedVectorField_weakEquationOnCell_of_compactSupport + (W : MeanZeroNeumannPoissonSolution Q F) + (choice : Fin d → Fin 3) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (MeasureTheory.volume.restrict (openCubeSet Q))) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot + (cubeCoordinateFoldReflectedVectorField Q + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume := by + classical + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + let ψ : Vec d → ℝ := + fun y => φ (cubeFaceReflectionCellFoldMap Q choice y) + have hψ : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using + contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ + have hψs : HasCompactSupport ψ := by + simpa [ψ] using + hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφs + have hCube := W.weakEquationOnCube_of_compactSupport hψ hψs hmean hF + have hgradCell : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient ψ y) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient ψ (cubeFaceReflectionCellFoldMap Q choice x)) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hvec := + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice G hx + have hgradAtFold : + euclideanGradient ψ (cubeFaceReflectionCellFoldMap Q choice x) = + cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ x) := by + have hg := + euclideanGradient_comp_cubeFaceReflectionCellFoldMap + hφ Q choice (cubeFaceReflectionCellFoldMap Q choice x) + simpa [ψ, cubeFaceReflectionCellFoldMap_involutive Q choice x] + using hg + calc + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (euclideanGradient φ x) + = vecDot + (cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (euclideanGradient φ x) := by + rw [hvec] + _ = vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ x)) := by + exact + vecDot_cubeFaceReflectionCellFoldLinear_left + choice + (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient φ x) + _ = vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (euclideanGradient ψ + (cubeFaceReflectionCellFoldMap Q choice x)) := by + rw [hgradAtFold] + _ = ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient ψ y) ∂MeasureTheory.volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => vecDot (G y) (euclideanGradient ψ y)) + have hforceCell : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, F y * ψ y ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * φ x + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + F (cubeFaceReflectionCellFoldMap Q choice x) * + ψ (cubeFaceReflectionCellFoldMap Q choice x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hscalar := + cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice F hx + have hψfold : + ψ (cubeFaceReflectionCellFoldMap Q choice x) = φ x := by + simp [ψ, cubeFaceReflectionCellFoldMap_involutive Q choice x] + change + cubeCoordinateFoldReflectedScalar Q F x * φ x = + F (cubeFaceReflectionCellFoldMap Q choice x) * + ψ (cubeFaceReflectionCellFoldMap Q choice x) + rw [hscalar, hψfold] + _ = ∫ y in openCubeSet Q, F y * ψ y ∂MeasureTheory.volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => F y * ψ y) + change + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * φ x ∂MeasureTheory.volume + rw [hgradCell, hforceCell] + exact hCube + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/WeakEquationHelpers.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/WeakEquationHelpers.lean new file mode 100644 index 0000000000..1e0b2bfd8d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/VectorFieldAndApex/WeakEquationHelpers.lean @@ -0,0 +1,435 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.Definitions + +/-! # Weak Equation Helpers -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + + +/-- Extend an inhomogeneous weak equation from smooth compactly supported tests +to arbitrary `H¹₀` tests on an open domain. The proof uses exactly the +approximation data bundled in `H10Function`: the gradient side is continuous by +`L² × L² → L¹`, and the forcing side is the same scalar argument. -/ +theorem h10WeakEquationOn_of_contDiff_tests + {d : ℕ} {U : Set (Vec d)} {G : Vec d → Vec d} {f : Vec d → ℝ} + (hU : IsOpen U) (hG : MemVectorL2 U G) (hf : MemScalarL2 U f) + (htest : + ∀ ψ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) ψ → HasCompactSupport ψ → + tsupport ψ ⊆ U → + ∫ x in U, vecDot (G x) (euclideanGradient ψ x) + ∂MeasureTheory.volume = + ∫ x in U, f x * ψ x ∂MeasureTheory.volume) : + ∀ φ : H10Function U, + ∫ x in U, vecDot (G x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, f x * φ.toH1Function x ∂MeasureTheory.volume := by + intro φ + let μ := volumeMeasureOn U + let D : ℕ → Vec d → Vec d := + fun n x i => (fderiv ℝ (φ.approx n) x) (basisVec i) + have hD_coord : ∀ n i, MemScalarL2 U (fun x => D n x i) := by + intro n i + let ψ : H10Function U := + H10Function.ofContDiff hU (φ.approx_smooth n) + (φ.approx_hasCompactSupport n) (φ.approx_support_subset n) + simpa [D, ψ, H10Function.ofContDiff, H1Function.ofContDiff] using + ψ.toH1Function.gradMemL2 i + have hψ_mem : ∀ n, MemScalarL2 U (φ.approx n) := by + intro n + let ψ : H10Function U := + H10Function.ofContDiff hU (φ.approx_smooth n) + (φ.approx_hasCompactSupport n) (φ.approx_support_subset n) + simpa [ψ, H10Function.ofContDiff, H1Function.ofContDiff] using + ψ.toH1Function.memL2 + have htest_approx : + ∀ n, + ∫ x in U, vecDot (G x) (D n x) ∂MeasureTheory.volume = + ∫ x in U, f x * φ.approx n x ∂MeasureTheory.volume := by + intro n + simpa [D, euclideanGradient, euclideanCoordDeriv] using! + htest (φ.approx n) (φ.approx_smooth n) + (φ.approx_hasCompactSupport n) (φ.approx_support_subset n) + have hcoord_tendsto : + ∀ i : Fin d, + Filter.Tendsto + (fun n => ∫ x in U, G x i * D n x i ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, G x i * φ.toH1Function.grad x i + ∂MeasureTheory.volume)) := by + intro i + let gi : Vec d → ℝ := fun x => G x i + let diff : ℕ → Vec d → ℝ := + fun n x => D n x i - φ.toH1Function.grad x i + let Fn : ℕ → Vec d → ℝ := fun n x => gi x * D n x i + let fLim : Vec d → ℝ := fun x => gi x * φ.toH1Function.grad x i + have hgi_mem : MemScalarL2 U gi := + memScalarL2_coord_of_memVectorL2 hG i + have hdiff_mem : ∀ n, MemScalarL2 U (diff n) := by + intro n + exact (hD_coord n i).sub (φ.toH1Function.gradMemL2 i) + have hFn_int : + ∀ᶠ n in Filter.atTop, MeasureTheory.Integrable (Fn n) μ := by + refine Filter.Eventually.of_forall ?_ + intro n + simpa [Fn, gi, D, μ, MeasureTheory.IntegrableOn] using! + (hgi_mem.integrable_mul (hD_coord n i)) + have hfLim_int : MeasureTheory.Integrable fLim μ := by + simpa [fLim, gi, μ, MeasureTheory.IntegrableOn] using! + (hgi_mem.integrable_mul (φ.toH1Function.gradMemL2 i)) + have hL1_bound : + ∀ n, + MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ ≤ + MeasureTheory.eLpNorm gi 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ := by + intro n + have hgi_meas : + MeasureTheory.AEStronglyMeasurable gi μ := hgi_mem.aestronglyMeasurable + have hdiff_meas : + MeasureTheory.AEStronglyMeasurable (diff n) μ := + (hdiff_mem n).aestronglyMeasurable + simpa [gi, diff] using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (μ := μ) (p := (2 : ENNReal)) (q := (2 : ENNReal)) + (r := (1 : ENNReal)) (fun a b : ℝ => a * b) 1 (by fun_prop) hgi_meas hdiff_meas + (Filter.Eventually.of_forall fun x => by simp)) + have hconst_ne_top : MeasureTheory.eLpNorm gi 2 μ ≠ ⊤ := + hgi_mem.eLpNorm_lt_top.ne + have hL1 : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm gi 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop (nhds (MeasureTheory.eLpNorm gi 2 μ * 0)) := by + exact ENNReal.Tendsto.const_mul (φ.tendsto_approx_grad i) + (Or.inr hconst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm gi 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop (nhds 0) := by + simpa [mul_zero] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 (fun _ => zero_le) hL1_bound + have hL1_diff : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - fLim x) 1 μ) + Filter.atTop (nhds 0) := by + have hEq : + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - fLim x) 1 μ) = + fun n => MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ := by + funext n + congr 1 + funext x + simp [Fn, fLim, gi, diff] + ring + rw [hEq] + exact hL1 + exact MeasureTheory.tendsto_integral_of_L1' + (μ := μ) (f := fLim) hFn_int hL1_diff + have hleft_tendsto : + Filter.Tendsto + (fun n => ∫ x in U, vecDot (G x) (D n x) ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, vecDot (G x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume)) := by + have hEq : + (fun n => ∫ x in U, vecDot (G x) (D n x) ∂MeasureTheory.volume) = + fun n => ∑ i, ∫ x in U, G x i * D n x i + ∂MeasureTheory.volume := by + funext n + rw [show (fun x => vecDot (G x) (D n x)) = + fun x => ∑ i, G x i * D n x i by + funext x + simp [vecDot, D]] + rw [MeasureTheory.integral_finsetSum] + intro i _hi + exact ((memScalarL2_coord_of_memVectorL2 hG i).integrable_mul + (hD_coord n i)) + have hEq_limit : + ∫ x in U, vecDot (G x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∑ i, ∫ x in U, G x i * φ.toH1Function.grad x i + ∂MeasureTheory.volume := by + rw [show (fun x => vecDot (G x) (φ.toH1Function.grad x)) = + fun x => ∑ i, G x i * φ.toH1Function.grad x i by + funext x + simp [vecDot]] + rw [MeasureTheory.integral_finsetSum] + intro i _hi + exact ((memScalarL2_coord_of_memVectorL2 hG i).integrable_mul + (φ.toH1Function.gradMemL2 i)) + rw [hEq] + have hsum : + Filter.Tendsto + (fun n => ∑ i, ∫ x in U, G x i * D n x i + ∂MeasureTheory.volume) + Filter.atTop + (nhds (∑ i, ∫ x in U, G x i * φ.toH1Function.grad x i + ∂MeasureTheory.volume)) := by + simpa using + tendsto_finsetSum Finset.univ (fun i _ => hcoord_tendsto i) + rw [hEq_limit] + exact hsum + have hright_tendsto : + Filter.Tendsto + (fun n => ∫ x in U, f x * φ.approx n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, f x * φ.toH1Function x + ∂MeasureTheory.volume)) := by + let diff : ℕ → Vec d → ℝ := fun n x => φ.approx n x - φ.toH1Function x + let Fn : ℕ → Vec d → ℝ := fun n x => f x * φ.approx n x + let fLim : Vec d → ℝ := fun x => f x * φ.toH1Function x + have hdiff_mem : ∀ n, MemScalarL2 U (diff n) := by + intro n + exact (hψ_mem n).sub φ.toH1Function.memL2 + have hFn_int : + ∀ᶠ n in Filter.atTop, MeasureTheory.Integrable (Fn n) μ := by + refine Filter.Eventually.of_forall ?_ + intro n + simpa [Fn, μ, MeasureTheory.IntegrableOn] using! + (hf.integrable_mul (hψ_mem n)) + have hfLim_int : MeasureTheory.Integrable fLim μ := by + simpa [fLim, μ, MeasureTheory.IntegrableOn] using! + (hf.integrable_mul φ.toH1Function.memL2) + have hL1_bound : + ∀ n, + MeasureTheory.eLpNorm (fun x => f x * diff n x) 1 μ ≤ + MeasureTheory.eLpNorm f 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ := by + intro n + have hf_meas : + MeasureTheory.AEStronglyMeasurable f μ := hf.aestronglyMeasurable + have hdiff_meas : + MeasureTheory.AEStronglyMeasurable (diff n) μ := + (hdiff_mem n).aestronglyMeasurable + simpa [diff] using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (μ := μ) (p := (2 : ENNReal)) (q := (2 : ENNReal)) + (r := (1 : ENNReal)) (fun a b : ℝ => a * b) 1 (by fun_prop) hf_meas hdiff_meas + (Filter.Eventually.of_forall fun x => by simp)) + have hconst_ne_top : MeasureTheory.eLpNorm f 2 μ ≠ ⊤ := + hf.eLpNorm_lt_top.ne + have hL1 : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => f x * diff n x) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm f 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop (nhds (MeasureTheory.eLpNorm f 2 μ * 0)) := by + exact ENNReal.Tendsto.const_mul φ.tendsto_approx + (Or.inr hconst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm f 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop (nhds 0) := by + simpa [mul_zero] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 (fun _ => zero_le) hL1_bound + have hL1_diff : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - fLim x) 1 μ) + Filter.atTop (nhds 0) := by + have hEq : + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - fLim x) 1 μ) = + fun n => MeasureTheory.eLpNorm (fun x => f x * diff n x) 1 μ := by + funext n + congr 1 + funext x + simp [Fn, fLim, diff] + ring + rw [hEq] + exact hL1 + exact MeasureTheory.tendsto_integral_of_L1' + (μ := μ) (f := fLim) hFn_int hL1_diff + have hright_to_left : + Filter.Tendsto + (fun n => ∫ x in U, f x * φ.approx n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, vecDot (G x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume)) := by + have hEq : + (fun n => ∫ x in U, vecDot (G x) (D n x) + ∂MeasureTheory.volume) = + fun n => ∫ x in U, f x * φ.approx n x ∂MeasureTheory.volume := by + funext n + exact htest_approx n + simpa [hEq] using hleft_tendsto + exact tendsto_nhds_unique hright_to_left hright_tendsto + +namespace IsPotentialOn + +/-- The H¹-potential predicate is insensitive to changing the vector-field +representative a.e. on the domain. -/ +theorem congr_ae {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hfg : f =ᵐ[MeasureTheory.volume.restrict U] g) + (hf : IsPotentialOn U f) : + IsPotentialOn U g := by + rcases hf with ⟨u, hgrad⟩ + let v : H1Function U := + { toFun := u.toFun + grad := g + memL2 := u.memL2 + gradMemL2 := by + intro i + have hcoord : + (fun x => u.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := by + filter_upwards [hfg] with x hx + simpa [hgrad] using congrArg (fun y : Vec d => y i) hx + exact (u.gradMemL2 i).ae_eq hcoord + hasWeakGradient := by + intro i ψ hψ_smooth hψ_compact hψ_sub + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_compact hψ_sub + have hcoord : + (fun x => u.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := by + filter_upwards [hfg] with x hx + simpa [hgrad] using congrArg (fun y : Vec d => y i) hx + have hright : + ∫ x in U, g x i * ψ x ∂MeasureTheory.volume = + ∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hcoord] with x hx + rw [← hx] + calc + ∫ x in U, u.toFun x * (fderiv ℝ ψ x) (basisVec i) + ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, g x i * ψ x ∂MeasureTheory.volume := by rw [hright] } + exact ⟨v, rfl⟩ + +end IsPotentialOn + +/-- On a reflection cell, the cell indicator of a function is locally the +function itself. -/ +theorem eventuallyEq_indicator_cubeFaceReflectionCell_of_mem + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (φ : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ + =ᶠ[nhds x] φ := by + filter_upwards + [(isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice)).mem_nhds hx] + with y hy + simp [Set.indicator_of_mem hy] + +/-- Away from a reflection cell, the cell indicator of a test supported in the +reflection block is locally zero. If the base point lies in another cell, this +is disjointness of the open cells; if it lies outside the block, it is the +support hypothesis. -/ +theorem eventuallyEq_indicator_cubeFaceReflectionCell_of_notMem + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) + {x : Vec d} + (hx : x ∉ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ + =ᶠ[nhds x] 0 := by + by_cases hxBlock : x ∈ cubeFaceReflectionBlockSet Q + · have hxUnion : + x ∈ ⋃ choice' : Fin d → Fin 3, + openCubeSet (cubeFaceReflectionCellCube Q choice') := by + simpa [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] using hxBlock + rw [Set.mem_iUnion] at hxUnion + rcases hxUnion with ⟨choice', hx'⟩ + by_cases hchoice : choice' = choice + · subst choice' + exact (hx hx').elim + · exact + Filter.Eventually.mono + ((isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice')).mem_nhds hx') + fun y hy => by + have hy_not : + y ∉ openCubeSet (cubeFaceReflectionCellCube Q choice) := by + exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne + Q hchoice) + hy) + simp [Set.indicator_of_notMem hy_not] + · have hx_support : x ∉ tsupport φ := fun hxt => hxBlock (hφ_sub hxt) + exact + ((notMem_tsupport_iff_eventuallyEq.mp hx_support).mono + fun y hy => by simp [Set.indicator, hy]) + +/-- The zero extension of a smooth compactly supported reflection-block test +to one reflection cell remains smooth. -/ +theorem contDiff_indicator_cubeFaceReflectionCell_of_tsupport_subset_block + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) : + ContDiff ℝ (⊤ : ℕ∞) + (Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ) := by + rw [contDiff_iff_contDiffAt] + intro x + by_cases hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice) + · exact hφ.contDiffAt.congr_of_eventuallyEq + (eventuallyEq_indicator_cubeFaceReflectionCell_of_mem Q choice φ hx) + · simpa using + (contDiffAt_const (c := (0 : ℝ)) : + ContDiffAt ℝ (⊤ : ℕ∞) (fun _ : Vec d => (0 : ℝ)) x).congr_of_eventuallyEq + (eventuallyEq_indicator_cubeFaceReflectionCell_of_notMem + Q choice hφ_sub hx) + +/-- The cell indicator of a compactly supported test is compactly supported. -/ +theorem hasCompactSupport_indicator_cubeFaceReflectionCell + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} (hφs : HasCompactSupport φ) : + HasCompactSupport + (Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ) := by + refine HasCompactSupport.of_support_subset_isCompact hφs ?_ + intro x hx + have hxφ : φ x ≠ 0 := by + by_contra hzero + have hind : + Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ x = 0 := by + by_cases hcell : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice) + · simp [Set.indicator_of_mem hcell, hzero] + · simp [Set.indicator_of_notMem hcell] + exact hx hind + exact subset_tsupport φ hxφ + +/-- If a smooth test is supported in the reflection block, then its cell +indicator has topological support inside that cell. -/ +theorem tsupport_indicator_cubeFaceReflectionCell_subset + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ cubeFaceReflectionBlockSet Q) : + tsupport (Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ) + ⊆ openCubeSet (cubeFaceReflectionCellCube Q choice) := by + intro x hx_support + by_contra hxcell + have hzero : + Set.indicator (openCubeSet (cubeFaceReflectionCellCube Q choice)) φ + =ᶠ[nhds x] 0 := + eventuallyEq_indicator_cubeFaceReflectionCell_of_notMem + Q choice hφ_sub hxcell + exact (notMem_tsupport_iff_eventuallyEq.mpr hzero) hx_support +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInterior.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInterior.lean new file mode 100644 index 0000000000..1921132c50 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInterior.lean @@ -0,0 +1,310 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.VectorFieldAndApex +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation + +/-! # Weak Interior -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Weak interior interface for the cube Neumann CZ discharge + +This file starts the difference-quotient route for the cube Neumann `W2,2` / +Calderon-Zygmund estimate. The reusable interior theorem consumes a weak +Poisson equation for an `H1Function`; the first bridge below packages the +already-proved reflected-block weak equation in exactly that form. +-/ + +/-- Weak equation `-Delta u = f` on an open set, tested against smooth compactly +supported functions whose topological support lies in the set. -/ +def WeakPoissonEquationOn {d : ℕ} (U : Set (Vec d)) + (u : H1Function U) (f : Vec d → ℝ) : Prop := + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in U, f x * φ x ∂MeasureTheory.volume + +/-- A weak `L²` Hessian witness for an `H¹` function on `U`. + +The second derivative convention is: `hess i j` is the weak `j`th derivative +of the `i`th gradient coordinate. -/ +structure HasWeakHessianOn {d : ℕ} (U : Set (Vec d)) (u : H1Function U) where + hess : Fin d → Fin d → Vec d → ℝ + hess_memL2 : ∀ i j, MemScalarL2 U (hess i j) + weak_second : + ∀ i j, HasWeakPartialDerivOn U j (fun x => u.grad x i) (hess i j) + +namespace HasWeakHessianOn + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-- Unpack the weak second-derivative identity for one Hessian coordinate. -/ +theorem coord (H : HasWeakHessianOn U u) (i j : Fin d) : + HasWeakPartialDerivOn U j (fun x => u.grad x i) (H.hess i j) := + H.weak_second i j + +/-- The `L²(U)` realization of one Hessian coordinate. -/ +noncomputable def hessCoordToScalarL2 (H : HasWeakHessianOn U u) + (i j : Fin d) : ScalarL2 U := + Homogenization.toScalarL2 (H.hess_memL2 i j) + +/-- Sum of scalar `L²` norms over all Hessian coordinates. This is the +quantity the interior estimate should bound. -/ +noncomputable def hessianCoordL2NormSum (H : HasWeakHessianOn U u) : ℝ := + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ + +theorem hessianCoordL2NormSum_nonneg (H : HasWeakHessianOn U u) : + 0 ≤ H.hessianCoordL2NormSum := by + exact Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => norm_nonneg _ + +/-- Restrict a weak Hessian witness to a smaller open set. -/ +noncomputable def restrict (H : HasWeakHessianOn U u) + {V : Set (Vec d)} (hVopen : IsOpen V) (hVU : V ⊆ U) : + HasWeakHessianOn V (u.restrict hVopen hVU) where + hess := H.hess + hess_memL2 := by + intro i j + exact (H.hess_memL2 i j).mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + weak_second := by + intro i j + simpa [H1Function.restrict] using + (H.weak_second i j).restrict hVopen hVU + +end HasWeakHessianOn + +/-- Smooth compactly supported functions carry the classical Hessian as a weak +`L²` Hessian witness. This fixes the sign and coordinate convention for the +future nonsmooth interior theorem. -/ +noncomputable def hasWeakHessianOn_ofContDiff {d : ℕ} {U : Set (Vec d)} + (hU : IsOpen U) {f : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hfs : HasCompactSupport f) : + HasWeakHessianOn U + (H1Function.ofContDiff hU (hf.of_le (by simp)) hfs) := by + refine + { hess := fun i j => euclideanCoordSecondDeriv i j f + hess_memL2 := ?_ + weak_second := ?_ } + · intro i j + have hcont : Continuous (euclideanCoordSecondDeriv i j f) := + (contDiff_euclideanCoordSecondDeriv hf i j).continuous + have hs : HasCompactSupport (euclideanCoordSecondDeriv i j f) := + hasCompactSupport_euclideanCoordSecondDeriv hfs i j + simpa [MemScalarL2, volumeMeasureOn] using + (hcont.memLp_of_hasCompactSupport hs).restrict U + · intro i j + have hweak : + HasWeakPartialDerivOn U j (euclideanCoordDeriv i f) + (euclideanCoordSecondDeriv i j f) := by + simpa [euclideanCoordSecondDeriv] using! + (HasWeakPartialDerivOn.of_contDiff + (U := U) (i := j) (f := euclideanCoordDeriv i f) + ((contDiff_euclideanCoordDeriv hf i).of_le (by simp))) + simpa [H1Function.ofContDiff, euclideanCoordDeriv] using! hweak + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + +/-- Unpack a weak Poisson equation at a smooth compactly supported test. -/ +theorem test (h : WeakPoissonEquationOn U u f) + (φ : Vec d → ℝ) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in U, f x * φ x ∂MeasureTheory.volume := + h φ hφ hφs hφ_sub + +/-- Restrict a weak Poisson equation to a smaller open set. -/ +theorem restrict (h : WeakPoissonEquationOn U u f) + {V : Set (Vec d)} (hVopen : IsOpen V) (hVU : V ⊆ U) : + WeakPoissonEquationOn V (u.restrict hVopen hVU) f := by + intro φ hφ hφs hφ_sub + have hφ_subU : tsupport φ ⊆ U := hφ_sub.trans hVU + have htest := h.test φ hφ hφs hφ_subU + have hzeroLeftV : + ∀ x, x ∉ V → + vecDot (u.grad x) (euclideanGradient φ x) = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [euclideanGradient_eq_zero_of_notMem_tsupport hx_notin, vecDot_zero_right] + have hzeroLeftU : + ∀ x, x ∉ U → + vecDot (u.grad x) (euclideanGradient φ x) = 0 := by + intro x hx + exact hzeroLeftV x (fun hxV => hx (hVU hxV)) + have hzeroRightV : + ∀ x, x ∉ V → f x * φ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + have hzeroRightU : + ∀ x, x ∉ U → f x * φ x = 0 := by + intro x hx + exact hzeroRightV x (fun hxV => hx (hVU hxV)) + have hleft : + ∫ x in V, vecDot (u.grad x) (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroLeftV, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroLeftU] + have hright : + ∫ x in V, f x * φ x ∂MeasureTheory.volume = + ∫ x in U, f x * φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroRightV, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroRightU] + simpa [H1Function.restrict, hleft, hright] using htest + +/-- Translate a weak Poisson equation. -/ +theorem translate (h : WeakPoissonEquationOn U u f) (z : Vec d) : + WeakPoissonEquationOn (translateSet z U) (u.translate z) (fun x => f (x - z)) := by + intro φ hφ hφs hφ_sub + let ψ : Vec d → ℝ := fun x => φ (x + z) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_id.add contDiff_const) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.addRight z) + simpa [ψ, Function.comp] using hφs.comp_homeomorph (Homeomorph.addRight z) + have hψ_sub : tsupport ψ ⊆ U := by + intro x hx + have hx' : x + z ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.addRight z by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.addRight z)] at hx + exact hx + have hxV : x + z ∈ translateSet z U := hφ_sub hx' + simpa [mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] using hxV + have htest := h.test ψ hψ_smooth hψ_supp hψ_sub + have hgradψ : + ∀ x, euclideanGradient ψ x = euclideanGradient φ (x + z) := by + intro x + ext i + unfold euclideanGradient euclideanCoordDeriv + have hderiv : + fderiv ℝ (fun y : Vec d => φ (y + z)) x = + fderiv ℝ φ (x + z) := by + simpa using (fderiv_comp_add_right (𝕜 := ℝ) (f := φ) (x := x) z) + simp [ψ, hderiv] + have hleft_change : + ∫ x in translateSet z U, + vecDot ((u.translate z).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (u.grad x) (euclideanGradient φ (x + z)) + ∂MeasureTheory.volume := by + symm + simpa [H1Function.translate, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (fun x => vecDot ((u.translate z).grad x) (euclideanGradient φ x))) + have hright_change : + ∫ x in translateSet z U, f (x - z) * φ x ∂MeasureTheory.volume = + ∫ x in U, f x * φ (x + z) ∂MeasureTheory.volume := by + symm + simpa [sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (fun x => f (x - z) * φ x)) + calc + ∫ x in translateSet z U, + vecDot ((u.translate z).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + = ∫ x in U, vecDot (u.grad x) (euclideanGradient φ (x + z)) + ∂MeasureTheory.volume := hleft_change + _ = ∫ x in U, vecDot (u.grad x) (euclideanGradient ψ x) + ∂MeasureTheory.volume := by + congr with x + rw [hgradψ x] + _ = ∫ x in U, f x * ψ x ∂MeasureTheory.volume := htest + _ = ∫ x in U, f x * φ (x + z) ∂MeasureTheory.volume := by rfl + _ = ∫ x in translateSet z U, f (x - z) * φ x ∂MeasureTheory.volume := + hright_change.symm + +/-- Scale a weak Poisson equation by a real constant. -/ +theorem smul (h : WeakPoissonEquationOn U u f) (c : ℝ) : + WeakPoissonEquationOn U (c • u) (fun x => c * f x) := by + intro φ hφ hφs hφ_sub + have htest := h.test φ hφ hφs hφ_sub + calc + ∫ x in U, vecDot ((c • u).grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume + = ∫ x in U, c * vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + congr with x + simp [H1Function.smul_grad, vecDot_smul_left] + _ = c * ∫ x in U, vecDot (u.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = c * ∫ x in U, f x * φ x ∂MeasureTheory.volume := by + rw [htest] + _ = ∫ x in U, c * (f x * φ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = ∫ x in U, (c * f x) * φ x ∂MeasureTheory.volume := by + congr with x + ring + +/-- Extend a weak Poisson equation from smooth compactly supported tests to +all `H¹₀` tests. This is the legal-testing bridge needed by the +difference-quotient interior estimate. -/ +theorem h10 (h : WeakPoissonEquationOn U u f) + (hU : IsOpen U) (hf : MemScalarL2 U f) : + ∀ φ : H10Function U, + ∫ x in U, vecDot (u.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, f x * φ.toH1Function x ∂MeasureTheory.volume := + h10WeakEquationOn_of_contDiff_tests hU u.grad_memVectorL2 hf + (fun ψ hψ hψs hψ_sub => h.test ψ hψ hψs hψ_sub) + +end WeakPoissonEquationOn + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + +/-- The original cube Neumann solution is a weak Poisson solution on the cube, +packaged in the `WeakPoissonEquationOn` interface used by the difference +quotient interior estimates. -/ +theorem weakPoissonEquationOnCube + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + WeakPoissonEquationOn (openCubeSet Q) W.w.toH1Function F := by + intro φ hφ hφs _hφ_sub + exact + W.weakEquationOnCube_of_compactSupport_of_memLp_normalizedCubeMeasure + hφ hφs hmean hF + +/-- The all-coordinate even reflection of a cube Neumann solution is a weak +Poisson solution on the full reflection block. + +This is the first bridge needed by the difference-quotient proof: the hard +future theorem should consume `WeakPoissonEquationOn`; the reflection stack +already proves the same identity in reflected-vector-field notation. -/ +theorem cubeFaceReflectionBlockFold_weakPoissonEquationOn + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + WeakPoissonEquationOn (cubeFaceReflectionBlockSet Q) + W.w.toH1Function.cubeFaceReflectionBlockFold + (cubeCoordinateFoldReflectedScalar Q F) := by + intro φ hφ hφs _hφ_sub + simpa [WeakPoissonEquationOn] using + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport_of_memLp_normalizedCubeMeasure + hφ hφs hmean hF + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ.lean new file mode 100644 index 0000000000..8d81dd54ea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffTail +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffBoundaryError +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.FaceVanishCollar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyIntegrand +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.DiffQuotientLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Localizations +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SqCutoffH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.IntegralIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyHalf +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothTestBoundEstimate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OpenInnerFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuotientHessianRiesz +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SummationByParts +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.WeakDerivativeTestClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.NeumannInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestWeakIdentity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentPotential +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentOrthogonality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentEnergyFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentExactEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionWeakEquation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianRestrictionSum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCoerciveDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.GradientAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ArbitraryCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Apex + +/-! # Weak Interior DQ -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Apex.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Apex.lean new file mode 100644 index 0000000000..d6611fbd73 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Apex.lean @@ -0,0 +1,673 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian + +/-! # Apex -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- The forward difference quotient of a weak Poisson solution satisfies the +corresponding weak equation on an interior domain whose forward shifts remain +inside the original domain. -/ +theorem forwardDifferenceQuotientOn_weakPoissonEquationOn + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - ((-step) • basisVec i)))) : + WeakPoissonEquationOn V + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift) + (euclideanForwardDifferenceQuotient step i f) := by + intro φ hφ hφs hφ_sub + let z : Vec d := (-step) • basisVec i + let uShift : H1Function V := (u.translate z).restrict hV.isOpen hVshift + let uOrig : H1Function V := u.restrict hV.isOpen hVU + have hshift := + ((h.translate z).restrict hV.isOpen hVshift).test φ hφ hφs hφ_sub + have horig := + (h.restrict hV.isOpen hVU).test φ hφ hφs hφ_sub + have hgradTest : MemVectorL2 V (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + have hshiftInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (uShift.grad x) (euclideanGradient φ x)) V := + integrableOn_vecDot_of_memVectorL2 uShift.grad_memVectorL2 hgradTest + have horigInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (uOrig.grad x) (euclideanGradient φ x)) V := + integrableOn_vecDot_of_memVectorL2 uOrig.grad_memVectorL2 hgradTest + have hφL2 : MemScalarL2 V φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφs).restrict V + have hforceShiftInt : + MeasureTheory.IntegrableOn (fun x => f (x - z) * φ x) V := + hfShiftV.integrable_mul hφL2 + have hforceOrigInt : + MeasureTheory.IntegrableOn (fun x => f x * φ x) V := + hfV.integrable_mul hφL2 + have hleft : + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + calc + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in V, + step⁻¹ * + (vecDot (uShift.grad x) (euclideanGradient φ x) - + vecDot (uOrig.grad x) (euclideanGradient φ x)) + ∂MeasureTheory.volume := by + congr with x + simp [H1Function.forwardDifferenceQuotientOn, uShift, uOrig, + vecDot_smul_left, vecDot_add_left, vecDot_neg_left, sub_eq_add_neg] + ring + _ = step⁻¹ * + ∫ x in V, + (vecDot (uShift.grad x) (euclideanGradient φ x) - + vecDot (uOrig.grad x) (euclideanGradient φ x)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub hshiftInt horigInt] + have hright : + ∫ x in V, euclideanForwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume - + ∫ x in V, f x * φ x ∂MeasureTheory.volume) := by + calc + ∫ x in V, euclideanForwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume + = ∫ x in V, step⁻¹ * (f (x - z) * φ x - f x * φ x) + ∂MeasureTheory.volume := by + congr with x + simp [euclideanForwardDifferenceQuotient, euclideanCoordShift, z, + sub_eq_add_neg] + ring + _ = step⁻¹ * + ∫ x in V, (f (x - z) * φ x - f x * φ x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume - + ∫ x in V, f x * φ x ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub hforceShiftInt hforceOrigInt] + calc + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume + = step⁻¹ * + (∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := hleft + _ = step⁻¹ * + (∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume - + ∫ x in V, f x * φ x ∂MeasureTheory.volume) := by + rw [hshift, horig] + _ = ∫ x in V, euclideanForwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume := hright.symm + +/-- The backward difference quotient of a weak Poisson solution satisfies the +corresponding weak equation on an interior domain whose backward shifts remain +inside the original domain. -/ +theorem backwardDifferenceQuotientOn_weakPoissonEquationOn + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - (step • basisVec i)))) : + WeakPoissonEquationOn V + (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift) + (euclideanBackwardDifferenceQuotient step i f) := by + intro φ hφ hφs hφ_sub + let z : Vec d := step • basisVec i + let uShift : H1Function V := (u.translate z).restrict hV.isOpen hVshift + let uOrig : H1Function V := u.restrict hV.isOpen hVU + have hshift := + ((h.translate z).restrict hV.isOpen hVshift).test φ hφ hφs hφ_sub + have horig := + (h.restrict hV.isOpen hVU).test φ hφ hφs hφ_sub + have hgradTest : MemVectorL2 V (euclideanGradient φ) := + memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport hφ hφs + have hshiftInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (uShift.grad x) (euclideanGradient φ x)) V := + integrableOn_vecDot_of_memVectorL2 uShift.grad_memVectorL2 hgradTest + have horigInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (uOrig.grad x) (euclideanGradient φ x)) V := + integrableOn_vecDot_of_memVectorL2 uOrig.grad_memVectorL2 hgradTest + have hφL2 : MemScalarL2 V φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφs).restrict V + have hforceShiftInt : + MeasureTheory.IntegrableOn (fun x => f (x - z) * φ x) V := + hfShiftV.integrable_mul hφL2 + have hforceOrigInt : + MeasureTheory.IntegrableOn (fun x => f x * φ x) V := + hfV.integrable_mul hφL2 + have hleft : + ∫ x in V, + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + calc + ∫ x in V, + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume + = ∫ x in V, + step⁻¹ * + (vecDot (uOrig.grad x) (euclideanGradient φ x) - + vecDot (uShift.grad x) (euclideanGradient φ x)) + ∂MeasureTheory.volume := by + congr with x + simp [H1Function.backwardDifferenceQuotientOn, uShift, uOrig, + vecDot_smul_left, vecDot_add_left, vecDot_neg_left, sub_eq_add_neg] + ring + _ = step⁻¹ * + ∫ x in V, + (vecDot (uOrig.grad x) (euclideanGradient φ x) - + vecDot (uShift.grad x) (euclideanGradient φ x)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub horigInt hshiftInt] + have hright : + ∫ x in V, euclideanBackwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, f x * φ x ∂MeasureTheory.volume - + ∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume) := by + calc + ∫ x in V, euclideanBackwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume + = ∫ x in V, step⁻¹ * (f x * φ x - f (x - z) * φ x) + ∂MeasureTheory.volume := by + congr with x + simp [euclideanBackwardDifferenceQuotient, euclideanCoordShift, z, + sub_eq_add_neg] + ring + _ = step⁻¹ * + ∫ x in V, (f x * φ x - f (x - z) * φ x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in V, f x * φ x ∂MeasureTheory.volume - + ∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub hforceOrigInt hforceShiftInt] + calc + ∫ x in V, + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) ∂MeasureTheory.volume + = step⁻¹ * + (∫ x in V, vecDot (uOrig.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (uShift.grad x) (euclideanGradient φ x) + ∂MeasureTheory.volume) := hleft + _ = step⁻¹ * + (∫ x in V, f x * φ x ∂MeasureTheory.volume - + ∫ x in V, f (x - z) * φ x ∂MeasureTheory.volume) := by + rw [hshift, horig] + _ = ∫ x in V, euclideanBackwardDifferenceQuotient step i f x * φ x + ∂MeasureTheory.volume := hright.symm + +/-- Cutoff energy identity for the forward difference quotient `D_h^+ u`. -/ +theorem forwardDifferenceQuotientOn_cutoff_energy_identity + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - ((-step) • basisVec i)))) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + euclideanForwardDifferenceQuotient step i f x * + (φ x * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + let z : Vec d := (-step) • basisVec i + have hfDQ : MemScalarL2 V (euclideanForwardDifferenceQuotient step i f) := by + have hsub : MemScalarL2 V (fun x => f (x - z) - f x) := + hfShiftV.sub hfV + refine MeasureTheory.MemLp.ae_eq ?_ (hsub.const_mul step⁻¹) + filter_upwards with x + simp [euclideanForwardDifferenceQuotient, euclideanCoordShift, z, + div_eq_mul_inv, sub_eq_add_neg] + ring + have hdq := + h.forwardDifferenceQuotientOn_weakPoissonEquationOn + hV hVU hfV step i hVshift hfShiftV + simpa [z] using + hdq.test_mulContDiffHasCompactSupport_expanded + hV hfDQ hφ hφ_compact hφ_sub + +/-- Cutoff energy identity for `D_h^+ u`, with the `vecDot` integrand split +into the coercive and cutoff-error terms. -/ +theorem forwardDifferenceQuotientOn_cutoff_energy_identity_split_integrand + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - ((-step) • basisVec i)))) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + (φ x * + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanForwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x)) ∂MeasureTheory.volume = + ∫ x in V, + euclideanForwardDifferenceQuotient step i f x * + (φ x * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have henergy := + h.forwardDifferenceQuotientOn_cutoff_energy_identity + hV hVU hfV step i hVshift hfShiftV hφ hφ_compact hφ_sub + have hleft : + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + (φ x * + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanForwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x)) ∂MeasureTheory.volume := by + congr with x + exact vecDot_cutoff_energy_integrand + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) (φ x) + (euclideanForwardDifferenceQuotient step i u.toFun x) + exact hleft.symm.trans henergy + +/-- Cutoff energy identity for `D_h^+ u` specialized to a squared smooth +cutoff `η²`. This is the form whose cross term is controlled by +`abs_sq_cutoff_error_integrand_le`. -/ +theorem forwardDifferenceQuotientOn_sq_cutoff_energy_identity + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - ((-step) • basisVec i)))) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in V, + (η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanForwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => 2 * η x * euclideanGradient η x j)) + ∂MeasureTheory.volume = + ∫ x in V, + euclideanForwardDifferenceQuotient step i f x * + (η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have hη_sq_sub : tsupport (fun x => η x ^ 2) ⊆ V := + (tsupport_sq_subset η).trans hη_sub + have hbase := + h.forwardDifferenceQuotientOn_cutoff_energy_identity_split_integrand + hV hVU hfV step i hVshift hfShiftV + (φ := fun x => η x ^ 2) + (contDiff_sq hη) (hasCompactSupport_sq hη_compact) hη_sq_sub + simpa [vecNormSq, euclideanGradient_sq hη] using hbase + +/-- Forward squared-cutoff Caccioppoli absorption. The integrability needed by +the abstract absorption lemma is supplied by the quotient's `L²` data and the +smooth compact cutoff. -/ +theorem forwardDifferenceQuotientOn_sq_cutoff_energy_half_le_forcing_add_error + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - ((-step) • basisVec i)))) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + ∫ x in V, + euclideanForwardDifferenceQuotient step i f x * + (η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let w : Vec d → ℝ := euclideanForwardDifferenceQuotient step i u.toFun + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + let m : Vec d → ℝ := fun x => η x ^ 2 * vecNormSq (G x) + let c : Vec d → ℝ := + fun x => w x * vecDot (G x) (fun j => 2 * η x * euclideanGradient η x j) + let r : Vec d → ℝ := + fun x => euclideanForwardDifferenceQuotient step i f x * (η x ^ 2 * w x) + let e : Vec d → ℝ := + fun x => 2 * (w x) ^ 2 * vecNormSq (euclideanGradient η x) + have henergy_raw := + h.forwardDifferenceQuotientOn_sq_cutoff_energy_identity + hV hVU hfV step i hVshift hfShiftV hη hη_compact hη_sub + have henergy : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = + ∫ x in V, r x ∂MeasureTheory.volume := by + simpa [m, c, r, w, G] using henergy_raw + have hpoint : + (fun x => -c x) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => m x / 2 + e x := by + filter_upwards with x + have hbound := + neg_sq_cutoff_error_integrand_le + (η x) (w x) (G x) (euclideanGradient η x) + simpa [m, c, e, w, G, div_eq_mul_inv, neg_mul, mul_assoc, mul_comm, mul_left_comm] + using hbound + have hm : MeasureTheory.IntegrableOn m V := by + have hG : MemVectorL2 V G := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [m, G] using + integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + (V := V) (G := G) (η := η) hG hη hη_compact + have hc : MeasureTheory.IntegrableOn c V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + have hG : MemVectorL2 V G := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [c, w, G] using + integrableOn_sq_cutoff_cross_of_memScalarL2_memVectorL2 + (V := V) (w := w) (G := G) (η := η) hw hG hη hη_compact + have he : MeasureTheory.IntegrableOn e V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + simpa [e, w] using + integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + (V := V) (w := w) (η := η) hw hη hη_compact + have hhalf := + integral_half_main_le_rhs_add_error_of_add_energy_identity + (V := V) (m := m) (c := c) (r := r) (e := e) + henergy hpoint hm hc he + simpa [m, r, e, w, G] using hhalf + +/-- Cutoff energy identity for the backward difference quotient `D_h^- u`. -/ +theorem backwardDifferenceQuotientOn_cutoff_energy_identity + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - (step • basisVec i)))) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + euclideanBackwardDifferenceQuotient step i f x * + (φ x * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + let z : Vec d := step • basisVec i + have hfDQ : MemScalarL2 V (euclideanBackwardDifferenceQuotient step i f) := by + have hsub : MemScalarL2 V (fun x => f x - f (x - z)) := + hfV.sub hfShiftV + refine MeasureTheory.MemLp.ae_eq ?_ (hsub.const_mul step⁻¹) + filter_upwards with x + simp [euclideanBackwardDifferenceQuotient, euclideanCoordShift, z, + div_eq_mul_inv, sub_eq_add_neg] + ring + have hdq := + h.backwardDifferenceQuotientOn_weakPoissonEquationOn + hV hVU hfV step i hVshift hfShiftV + simpa [z] using + hdq.test_mulContDiffHasCompactSupport_expanded + hV hfDQ hφ hφ_compact hφ_sub + +/-- Cutoff energy identity for `D_h^- u`, with the `vecDot` integrand split +into the coercive and cutoff-error terms. -/ +theorem backwardDifferenceQuotientOn_cutoff_energy_identity_split_integrand + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - (step • basisVec i)))) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + (φ x * + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanBackwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x)) ∂MeasureTheory.volume = + ∫ x in V, + euclideanBackwardDifferenceQuotient step i f x * + (φ x * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have henergy := + h.backwardDifferenceQuotientOn_cutoff_energy_identity + hV hVU hfV step i hVshift hfShiftV hφ hφ_compact hφ_sub + have hleft : + ∫ x in V, + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + (φ x * + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanBackwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x)) ∂MeasureTheory.volume := by + congr with x + exact vecDot_cutoff_energy_integrand + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (euclideanGradient φ x) (φ x) + (euclideanBackwardDifferenceQuotient step i u.toFun x) + exact hleft.symm.trans henergy + +/-- Cutoff energy identity for `D_h^- u` specialized to a squared smooth +cutoff `η²`. -/ +theorem backwardDifferenceQuotientOn_sq_cutoff_energy_identity + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - (step • basisVec i)))) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in V, + (η x ^ 2 * + vecNormSq + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + euclideanBackwardDifferenceQuotient step i u.toFun x * + vecDot + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => 2 * η x * euclideanGradient η x j)) + ∂MeasureTheory.volume = + ∫ x in V, + euclideanBackwardDifferenceQuotient step i f x * + (η x ^ 2 * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have hη_sq_sub : tsupport (fun x => η x ^ 2) ⊆ V := + (tsupport_sq_subset η).trans hη_sub + have hbase := + h.backwardDifferenceQuotientOn_cutoff_energy_identity_split_integrand + hV hVU hfV step i hVshift hfShiftV + (φ := fun x => η x ^ 2) + (contDiff_sq hη) (hasCompactSupport_sq hη_compact) hη_sq_sub + simpa [vecNormSq, euclideanGradient_sq hη] using hbase + +/-- Backward squared-cutoff Caccioppoli absorption. The integrability needed by +the abstract absorption lemma is supplied by the quotient's `L²` data and the +smooth compact cutoff. -/ +theorem backwardDifferenceQuotientOn_sq_cutoff_energy_half_le_forcing_add_error + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + (hfShiftV : MemScalarL2 V (fun x => f (x - (step • basisVec i)))) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + ∫ x in V, + euclideanBackwardDifferenceQuotient step i f x * + (η x ^ 2 * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanBackwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let w : Vec d → ℝ := euclideanBackwardDifferenceQuotient step i u.toFun + let G : Vec d → Vec d := + fun x => (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + let m : Vec d → ℝ := fun x => η x ^ 2 * vecNormSq (G x) + let c : Vec d → ℝ := + fun x => w x * vecDot (G x) (fun j => 2 * η x * euclideanGradient η x j) + let r : Vec d → ℝ := + fun x => euclideanBackwardDifferenceQuotient step i f x * (η x ^ 2 * w x) + let e : Vec d → ℝ := + fun x => 2 * (w x) ^ 2 * vecNormSq (euclideanGradient η x) + have henergy_raw := + h.backwardDifferenceQuotientOn_sq_cutoff_energy_identity + hV hVU hfV step i hVshift hfShiftV hη hη_compact hη_sub + have henergy : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = + ∫ x in V, r x ∂MeasureTheory.volume := by + simpa [m, c, r, w, G] using henergy_raw + have hpoint : + (fun x => -c x) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => m x / 2 + e x := by + filter_upwards with x + have hbound := + neg_sq_cutoff_error_integrand_le + (η x) (w x) (G x) (euclideanGradient η x) + simpa [m, c, e, w, G, div_eq_mul_inv, neg_mul, mul_assoc, mul_comm, mul_left_comm] + using hbound + have hm : MeasureTheory.IntegrableOn m V := by + have hG : MemVectorL2 V G := + (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [m, G] using + integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + (V := V) (G := G) (η := η) hG hη hη_compact + have hc : MeasureTheory.IntegrableOn c V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + have hG : MemVectorL2 V G := + (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [c, w, G] using + integrableOn_sq_cutoff_cross_of_memScalarL2_memVectorL2 + (V := V) (w := w) (G := G) (η := η) hw hG hη hη_compact + have he : MeasureTheory.IntegrableOn e V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + simpa [e, w] using + integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + (V := V) (w := w) (η := η) hw hη hη_compact + have hhalf := + integral_half_main_le_rhs_add_error_of_add_energy_identity + (V := V) (m := m) (c := c) (r := r) (e := e) + henergy hpoint hm hc he + simpa [m, r, e, w, G] using hhalf + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ArbitraryCubeEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ArbitraryCubeEndpoint.lean new file mode 100644 index 0000000000..9c65fc44ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ArbitraryCubeEndpoint.lean @@ -0,0 +1,274 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OriginCubeEndpoint +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PoissonTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentExactEnergy + +/-! # Arbitrary Cube Endpoint -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +noncomputable def originCubeWeakInteriorDepthConstantExact (d : ℕ) (m : ℤ) : ℝ := + let Q : TriadicCube d := originCube d m + (((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + (((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m) + +theorem originCubeWeakInteriorDepthConstantExact_nonneg (d : ℕ) (m : ℤ) : + 0 ≤ originCubeWeakInteriorDepthConstantExact d m := by + let Q : TriadicCube d := originCube d m + have hparent : + 0 ≤ ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hcount : + 0 ≤ ((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m := by + exact mul_nonneg + (mul_nonneg (Nat.cast_nonneg d) (Nat.cast_nonneg d)) + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact_nonneg d m) + dsimp [originCubeWeakInteriorDepthConstantExact, Q] + exact mul_nonneg hparent hcount + +/-- The C.2 depth constant for an arbitrary cube, transported from the +scale-sharp centered-cube estimate at the same scale. -/ +noncomputable def cubeWeakInteriorDepthConstant {d : ℕ} (Q : TriadicCube d) : ℝ := + originCubeWeakInteriorDepthConstantExact d Q.scale + +theorem cubeWeakInteriorDepthConstant_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeWeakInteriorDepthConstant Q := by + exact originCubeWeakInteriorDepthConstantExact_nonneg d Q.scale + +theorem originCubeWeakInteriorDepthConstantExact_eq_unit (d : ℕ) (m : ℤ) : + originCubeWeakInteriorDepthConstantExact d m = + originCubeWeakInteriorDepthConstantExact d 0 := by + let V : ℝ := cubeVolume (originCube d m) + let A : ℝ := (V⁻¹) ^ (1 / 2 : ℝ) + let C₀ : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let D₂ : ℝ := (d : ℝ) * (d : ℝ) + let K : ℝ := + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d m + let K₀ : ℝ := + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact d 0 + have hcancel : A * K = K₀ := by + simpa [A, K, K₀, V] using + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstantExact_volume_cancel d m + have h0vol : cubeVolume (originCube d 0) = 1 := by + simp [cubeVolume_eq_scaleFactor_pow] + have h0 : + originCubeWeakInteriorDepthConstantExact d 0 = C₀ * (D₂ * K₀) := by + dsimp [originCubeWeakInteriorDepthConstantExact, C₀, D₂, K₀] + rw [h0vol] + norm_num + calc + originCubeWeakInteriorDepthConstantExact d m + = C₀ * (D₂ * (A * K)) := by + dsimp [originCubeWeakInteriorDepthConstantExact, A, C₀, D₂, K, V] + ring + _ = C₀ * (D₂ * K₀) := by + rw [hcancel] + _ = originCubeWeakInteriorDepthConstantExact d 0 := h0.symm + +theorem cubeWeakInteriorDepthConstant_eq_dimensionConstant {d : ℕ} + (Q : TriadicCube d) : + cubeWeakInteriorDepthConstant Q = + originCubeWeakInteriorDepthConstantExact d 0 := by + exact originCubeWeakInteriorDepthConstantExact_eq_unit d Q.scale + +namespace MeanZeroNeumannPoissonSolution + +theorem originCube_sum_reducedSolverEnergyBoundExact_le_depthConstant_mul_cubeLpNorm + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} : + (((cubeVolume (originCube d m))⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F k) ≤ + originCubeWeakInteriorDepthConstantExact d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let Q : TriadicCube d := originCube d m + let P : ℝ := + ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let K : ℝ := originCubeParentReducedSolverEnergyConstantExact d m + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + have hsum_eq : + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F k) = + ((d : ℝ) * (d : ℝ)) * (K * L) := by + calc + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F k) + = ∑ k : Fin d, ∑ _l : Fin d, K * L := by + refine Finset.sum_congr rfl ?_ + intro k _hk + refine Finset.sum_congr rfl ?_ + intro _l _hl + simpa [K, L, Q] using + originCubeParentReducedSolverEnergyBoundExact_eq_constant_mul_cubeLpNorm + d m F k + _ = ((d : ℝ) * (d : ℝ)) * (K * L) := by + simp + ring + calc + P * (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F k) + = P * (((d : ℝ) * (d : ℝ)) * (K * L)) := by + rw [hsum_eq] + _ = originCubeWeakInteriorDepthConstantExact d m * L := by + dsimp [originCubeWeakInteriorDepthConstantExact, P, K, L, Q] + ring + _ ≤ originCubeWeakInteriorDepthConstantExact d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + exact le_rfl + +theorem exists_hasWeakHessianOn_cube_hessianCoordL2NormSum_le_solverEnergyBound + {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) : + ∃ H : HasWeakHessianOn (openCubeSet Q) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale + (fun x => F (x + triadicCubeShift Q)) i := by + let Q₀ : TriadicCube d := originCube d Q.scale + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + let W₀ : MeanZeroNeumannPoissonSolution Q₀ F₀ := W.untranslateToOrigin Q + have hF₀ : MeasureTheory.MemLp F₀ (2 : ℝ≥0∞) (normalizedCubeMeasure Q₀) := by + simpa [Q₀, F₀, z] using memLp_originCube_comp_addRight_of_memLp Q hF + have hmean₀ : cubeAverage Q₀ F₀ = 0 := by + dsimp [Q₀, F₀, z] + rw [cubeAverage_originCube_comp_addRight_eq Q F, hmean] + rcases + W₀.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + hmean₀ hF₀ with + ⟨_uP, _huP_toFun, _huP_grad, H₀, hH₀⟩ + have hU : openCubeSet Q = translateSet z (openCubeSet Q₀) := by + simpa [Q₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let HT : HasWeakHessianOn (translateSet z (openCubeSet Q₀)) + (W₀.w.toH1Function.translate z) := H₀.translate z + let H : HasWeakHessianOn (openCubeSet Q) W.w.toH1Function := + { hess := HT.hess + hess_memL2 := by + intro i j + simpa [hU] using HT.hess_memL2 i j + weak_second := by + intro i j + have hweak : + HasWeakPartialDerivOn (openCubeSet Q) j + (fun x => (W₀.w.toH1Function.translate z).grad x i) + (HT.hess i j) := by + simpa [hU] using HT.weak_second i j + refine + HasWeakPartialDerivOn.congr_of_eqOn + (measurableSet_openCubeSet Q) ?_ ?_ hweak + · intro x _hx + exact congrArg (fun v : Vec d => v i) + (W.untranslateToOrigin_translate_grad Q x) + · intro x _hx + rfl } + refine ⟨H, ?_⟩ + have hH_HT : H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := by + simp [H, hU, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2, Homogenization.toScalarL2] + have hHT_H₀ : HT.hessianCoordL2NormSum = H₀.hessianCoordL2NormSum := by + simpa [HT] using H₀.hessianCoordL2NormSum_translate_eq z + calc + H.hessianCoordL2NormSum = HT.hessianCoordL2NormSum := hH_HT + _ = H₀.hessianCoordL2NormSum := hHT_H₀ + _ ≤ ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale + (fun x => F (x + triadicCubeShift Q)) i := by + simpa [Q₀, F₀, z] using hH₀ + +theorem cubeBesovDepthSeminorm_grad_cube_le_weakInteriorDepthConstant + {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) + (i : Fin d) (_N j : ℕ) (_hj : j ∈ Finset.range (_N + 1)) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + cubeWeakInteriorDepthConstant Q * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + let Q₀ : TriadicCube d := originCube d Q.scale + let z : Vec d := triadicCubeShift Q + let F₀ : Vec d → ℝ := fun x => F (x + z) + rcases W.exists_hasWeakHessianOn_cube_hessianCoordL2NormSum_le_solverEnergyBound + hF hmean with + ⟨H, hH⟩ + let P : ℝ := + ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hdepth : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + P * H.hessianCoordL2NormSum := by + simpa [P] using H.cubeBesovDepthSeminorm_gradCoord_le_parentVolume_scaledCoercive i j + have hsum : + P * + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale F₀ k) ≤ + cubeWeakInteriorDepthConstant Q * cubeLpNorm Q (2 : ℝ≥0∞) F := by + have horigin := + originCube_sum_reducedSolverEnergyBoundExact_le_depthConstant_mul_cubeLpNorm + (d := d) (m := Q.scale) (F := F₀) + have hnorm := cubeLpNorm_originCube_comp_addRight_eq_of_memLp Q hF + calc + P * + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale F₀ k) + ≤ originCubeWeakInteriorDepthConstantExact d Q.scale * + cubeLpNorm Q₀ (2 : ℝ≥0∞) F₀ := by + simpa [P, Q₀, cubeVolume_originCube_same_scale Q] using horigin + _ = cubeWeakInteriorDepthConstant Q * cubeLpNorm Q (2 : ℝ≥0∞) F := by + simp [cubeWeakInteriorDepthConstant, Q₀, F₀, z, hnorm] + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j + ≤ P * H.hessianCoordL2NormSum := hdepth + _ ≤ P * + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBoundExact d Q.scale F₀ k) := by + exact mul_le_mul_of_nonneg_left hH hP_nonneg + _ ≤ cubeWeakInteriorDepthConstant Q * cubeLpNorm Q (2 : ℝ≥0∞) F := hsum + +theorem cubePoissonGradientDualTestNormL2CoreEstimate_cube + {d : ℕ} (Q : TriadicCube d) : + CubePoissonGradientDualTestNormL2CoreEstimate Q + (cubeWeakInteriorDepthConstant Q + cubePoissonGradientAverageConstant Q) := by + refine + cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm + (cubeWeakInteriorDepthConstant_nonneg Q) ?_ + intro F hF hmean W i N j hj + exact + cubeBesovDepthSeminorm_grad_cube_le_weakInteriorDepthConstant + hF hmean W i N j hj + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CubeTranslationTransport.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CubeTranslationTransport.lean new file mode 100644 index 0000000000..91bebe7288 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CubeTranslationTransport.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver + +/-! # Cube Translation Transport -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +theorem cubeVolume_originCube_same_scale {d : ℕ} (Q : TriadicCube d) : + cubeVolume (originCube d Q.scale) = cubeVolume Q := by + simp [cubeVolume, cubeScaleFactor, originCube] + +theorem cubeMeasure_originCube_map_addRight_eq {d : ℕ} (Q : TriadicCube d) : + Measure.map (fun x : Vec d => x + triadicCubeShift Q) + (cubeMeasure (originCube d Q.scale)) = + cubeMeasure Q := by + have hmp := + measurePreserving_addRight_restrict_translateSet + (d := d) (triadicCubeShift Q) (cubeSet (originCube d Q.scale)) + unfold cubeMeasure + rw [cubeSet_eq_translateSet_originCube_of_triadicCube Q] + exact hmp.map_eq + +theorem normalizedCubeMeasure_originCube_map_addRight_eq {d : ℕ} + (Q : TriadicCube d) : + Measure.map (fun x : Vec d => x + triadicCubeShift Q) + (normalizedCubeMeasure (originCube d Q.scale)) = + normalizedCubeMeasure Q := by + unfold normalizedCubeMeasure + rw [Measure.map_smul _ (f := fun x : Vec d => x + triadicCubeShift Q) + (measurable_id.add measurable_const).aemeasurable, + cubeMeasure_originCube_map_addRight_eq Q, + cubeVolume_originCube_same_scale Q] + +theorem measurePreserving_addRight_normalizedCubeMeasure_originCube {d : ℕ} + (Q : TriadicCube d) : + MeasurePreserving (fun x : Vec d => x + triadicCubeShift Q) + (normalizedCubeMeasure (originCube d Q.scale)) + (normalizedCubeMeasure Q) := + ⟨measurable_id.add measurable_const, + normalizedCubeMeasure_originCube_map_addRight_eq Q⟩ + +theorem memLp_originCube_comp_addRight_of_memLp {d : ℕ} + (Q : TriadicCube d) {p : ℝ≥0∞} {F : Vec d → ℝ} + (hF : MemLp F p (normalizedCubeMeasure Q)) : + MemLp (fun x => F (x + triadicCubeShift Q)) p + (normalizedCubeMeasure (originCube d Q.scale)) := + hF.comp_measurePreserving + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q) + +theorem cubeLpNorm_originCube_comp_addRight_eq_of_memLp {d : ℕ} + (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm (originCube d Q.scale) (2 : ℝ≥0∞) + (fun x => F (x + triadicCubeShift Q)) = + cubeLpNorm Q (2 : ℝ≥0∞) F := by + rw [cubeLpNorm_eq_eLpNorm_toReal _ _ _ + (memLp_originCube_comp_addRight_of_memLp Q hF).aestronglyMeasurable, + cubeLpNorm_eq_eLpNorm_toReal _ _ _ hF.aestronglyMeasurable] + exact congrArg ENNReal.toReal (by + simpa [Function.comp] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := F) (p := (2 : ℝ≥0∞)) hF.aestronglyMeasurable + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q))) + +theorem cubeAverage_originCube_comp_addRight_eq {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) : + cubeAverage (originCube d Q.scale) (fun x => F (x + triadicCubeShift Q)) = + cubeAverage Q F := by + rw [cubeAverage_eq_integral_normalizedCubeMeasure, + cubeAverage_eq_integral_normalizedCubeMeasure] + exact + (measurePreserving_addRight_normalizedCubeMeasure_originCube Q).integral_comp + (Homeomorph.addRight (triadicCubeShift Q)).measurableEmbedding F + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffBoundaryError.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffBoundaryError.lean new file mode 100644 index 0000000000..2b58ec1207 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffBoundaryError.lean @@ -0,0 +1,186 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffTail + +/-! # Cutoff Boundary Error -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +/-- The coordinate collar where the `i`-direction derivative of an inner cube +cutoff may be nonzero. -/ +def cubeCoordInnerCollar {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) (i : Fin d) : + Set (Vec d) := + {x | ρ * cubeRadius Q ≤ |x i - cubeCenter Q i|} + +theorem measurableSet_cubeCoordInnerCollar {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) (i : Fin d) : + MeasurableSet (cubeCoordInnerCollar Q ρ i) := by + dsimp [cubeCoordInnerCollar] + exact (isClosed_le continuous_const + (continuous_abs.comp ((continuous_apply i).sub continuous_const))).measurableSet + +theorem support_canonicalFun_fderiv_apply_basisVec_subset_cubeCoordInnerCollar {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (i : Fin d) : + Function.support + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)) ⊆ + cubeCoordInnerCollar Q ρ₁ i := by + simpa [cubeCoordInnerCollar] using + QuantitativeCubeCutoff.support_fderiv_canonicalFun_apply_basisVec_subset_coord_abs_ge_inner + Q hρ₁ hρ₁₂ i + +theorem support_canonicalFun_coordDeriv_mul_subset_cubeCoordInnerCollar {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (i : Fin d) (ψ : Vec d → ℝ) : + Function.support + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x) ⊆ + cubeCoordInnerCollar Q ρ₁ i := + (Function.support_mul_subset_left _ _).trans + (support_canonicalFun_fderiv_apply_basisVec_subset_cubeCoordInnerCollar + Q hρ₁ hρ₁₂ i) + +private theorem norm_basisVec {d : ℕ} (i : Fin d) : ‖basisVec i‖ = (1 : ℝ) := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases hji : j = i + · subst hji + simp [basisVec] + · simp [basisVec, hji] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +private theorem quantitativeCubeCutoffGradientConst_nonneg (d : ℕ) : + 0 ≤ quantitativeCubeCutoffGradientConst d := by + dsimp [quantitativeCubeCutoffGradientConst] + nlinarith [(Nat.cast_nonneg d : (0 : ℝ) ≤ (d : ℝ)), + smoothTransitionProfile.derivBound_nonneg] + +/-- If a smooth test is at most `B` times the cutoff transition width on the +coordinate collar, then the cutoff-derivative error is uniformly bounded. -/ +theorem norm_canonicalFun_coordDeriv_mul_le_of_collar_bound {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ B : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (hB : 0 ≤ B) (i : Fin d) (ψ : Vec d → ℝ) + (hψ : + ∀ x ∈ cubeCoordInnerCollar Q ρ₁ i, + ‖ψ x‖ ≤ B * ((ρ₂ - ρ₁) * cubeRadius Q)) : + ∀ x : Vec d, + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x‖ ≤ + B * quantitativeCubeCutoffGradientConst d := by + intro x + by_cases hzero : + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) = 0 + · simp [hzero, mul_nonneg hB (quantitativeCubeCutoffGradientConst_nonneg d)] + · have hx_collar : + x ∈ cubeCoordInnerCollar Q ρ₁ i := + support_canonicalFun_fderiv_apply_basisVec_subset_cubeCoordInnerCollar + Q hρ₁ hρ₁₂ i hzero + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := + mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + have hgap_nonneg : 0 ≤ (ρ₂ - ρ₁) * cubeRadius Q := le_of_lt hgap_pos + have hconst_nonneg : 0 ≤ quantitativeCubeCutoffGradientConst d := + quantitativeCubeCutoffGradientConst_nonneg d + have hcoord : + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ ≤ + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + calc + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ + ≤ ‖fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x‖ * + ‖basisVec i‖ := by + exact (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x).le_opNorm + (basisVec i) + _ = ‖fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x‖ := by + simp [norm_basisVec] + _ ≤ quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + let η : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + QuantitativeCubeCutoff.canonical Q ρ₁ ρ₂ hρ₁ hρ₁₂ + simpa [η, QuantitativeCubeCutoff.canonical] using η.gradient_bound x + calc + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x‖ + = + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ * + ‖ψ x‖ := norm_mul _ _ + _ ≤ + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) * + (B * ((ρ₂ - ρ₁) * cubeRadius Q)) := by + exact mul_le_mul hcoord (hψ x hx_collar) + (norm_nonneg (ψ x)) + (div_nonneg hconst_nonneg hgap_nonneg) + _ = B * quantitativeCubeCutoffGradientConst d := by + rw [show + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) * + (B * ((ρ₂ - ρ₁) * cubeRadius Q)) = + B * ((quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) * ((ρ₂ - ρ₁) * cubeRadius Q)) by + ring] + rw [div_mul_cancel₀ _ hgap_pos.ne'] + +/-- `L²` version of `norm_canonicalFun_coordDeriv_mul_le_of_collar_bound`, +localized to the coordinate collar where the derivative can be nonzero. -/ +theorem eLpNorm_canonicalFun_coordDeriv_mul_le_of_collar_bound {d : ℕ} + {U : Set (Vec d)} (Q : TriadicCube d) {ρ₁ ρ₂ B : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (hB : 0 ≤ B) + (i : Fin d) (ψ : Vec d → ℝ) + (hψ : + ∀ x ∈ cubeCoordInnerCollar Q ρ₁ i, + ‖ψ x‖ ≤ B * ((ρ₂ - ρ₁) * cubeRadius Q)) : + MeasureTheory.eLpNorm + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x) + 2 (volumeMeasureOn U) ≤ + ENNReal.ofReal (B * quantitativeCubeCutoffGradientConst d) * + (volumeMeasureOn U (cubeCoordInnerCollar Q ρ₁ i)) ^ + (1 / (2 : ENNReal).toReal) := by + let F : Vec d → ℝ := + fun x => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x + have hC_nonneg : 0 ≤ B * quantitativeCubeCutoffGradientConst d := + mul_nonneg hB (quantitativeCubeCutoffGradientConst_nonneg d) + have hdist : ∀ x : Vec d, dist (F x) 0 ≤ B * quantitativeCubeCutoffGradientConst d := by + intro x + simpa [F, dist_eq_norm] using + norm_canonicalFun_coordDeriv_mul_le_of_collar_bound + Q hρ₁ hρ₁₂ hB i ψ hψ x + have hsupport : + Function.support F ⊆ cubeCoordInnerCollar Q ρ₁ i := by + simpa [F] using + support_canonicalFun_coordDeriv_mul_subset_cubeCoordInnerCollar + Q hρ₁ hρ₁₂ i ψ + have hzero_support : + Function.support (0 : Vec d → ℝ) ⊆ cubeCoordInnerCollar Q ρ₁ i := by + simp + have hmain := + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (s := cubeCoordInnerCollar Q ρ₁ i) + (by norm_num : (2 : ENNReal) ≠ ∞) + (measurableSet_cubeCoordInnerCollar Q ρ₁ i) + hC_nonneg hdist hsupport hzero_support + have hsub : F - (fun _ : Vec d => (0 : ℝ)) = F := by + funext x + simp + rw [hsub] at hmain + simpa [F] using hmain + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffTail.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffTail.lean new file mode 100644 index 0000000000..4ef2cbda9b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/CutoffTail.lean @@ -0,0 +1,387 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule + +/-! # Cutoff Tail -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +private theorem norm_sub_mul_self_le_norm_of_nonneg_of_le_one + (c v : ℝ) (h0 : 0 ≤ c) (h1 : c ≤ 1) : + ‖v - c * v‖ ≤ ‖v‖ := by + calc + ‖v - c * v‖ = ‖(1 - c) * v‖ := by ring_nf + _ = ‖(1 - c : ℝ)‖ * ‖v‖ := norm_mul _ _ + _ ≤ 1 * ‖v‖ := by + gcongr + rw [Real.norm_eq_abs, abs_of_nonneg (by linarith)] + linarith + _ = ‖v‖ := by simp + +private theorem euclideanCoordDeriv_mul_of_contDiff + {d : ℕ} {φ ψ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (i : Fin d) (x : Vec d) : + euclideanCoordDeriv i (fun y => φ y * ψ y) x = + φ x * euclideanCoordDeriv i ψ x + euclideanCoordDeriv i φ x * ψ x := by + unfold euclideanCoordDeriv + have hφ_diff : DifferentiableAt ℝ φ x := hφ.differentiable (by simp) x + have hψ_diff : DifferentiableAt ℝ ψ x := hψ.differentiable (by simp) x + rw [show (fun y => φ y * ψ y) = φ * ψ by rfl, fderiv_mul hφ_diff hψ_diff] + simp [smul_eq_mul, mul_comm] + +/-- If smooth cutoffs are bounded between `0` and `1` and are eventually equal +to `1` on every compact subset of an open finite-measure domain, then cutting +an `L²` function by them converges back to the original function in `L²`. + +This is the measure-regularity part of the cube boundary approximation +argument. The cube geometry only has to prove the eventual-`1` hypothesis for +the canonical inner cutoffs. -/ +theorem tendsto_integralLpSeminorm_sub_mul_of_eventually_eq_one_on_compacts + {d : ℕ} {U : Set (Vec d)} {g : Vec d → ℝ} {η : ℕ → Vec d → ℝ} + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (hg : MemScalarL2 U g) + (hη_nonneg : ∀ n x, 0 ≤ η n x) + (hη_le_one : ∀ n x, η n x ≤ 1) + (hη_eventually_one : + ∀ K : Set (Vec d), IsCompact K → K ⊆ U → + ∀ᶠ n in Filter.atTop, ∀ x ∈ K, η n x = 1) : + Filter.Tendsto + (fun n => + Gagliardo.integralLpSeminorm (fun x => g x - η n x * g x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + refine ENNReal.tendsto_nhds_zero.2 ?_ + intro ε hε + by_cases hε_top : ε = ⊤ + · filter_upwards with n + rw [hε_top] + exact le_top + · have hε_real_pos : 0 < ε.toReal / 2 := by + have hε_ne_zero : ε ≠ 0 := ne_of_gt hε + have hε_toReal_pos : 0 < ε.toReal := + ENNReal.toReal_pos hε_ne_zero hε_top + positivity + obtain ⟨δ, hδpos, hδ⟩ := + hg.eLpNorm_indicator_le (p := (2 : ENNReal)) (by norm_num) + ENNReal.ofNat_ne_top (ENNReal.ofReal_pos.mpr hε_real_pos) + obtain ⟨K, hKU, hK_compact, hK_closed, hμK⟩ := + hUopen.measurableSet.exists_isCompact_isClosed_sdiff_lt + (μ := MeasureTheory.volume) hUfinite + hδpos.ne' + have hsmall : volumeMeasureOn U (U \ K) ≤ δ := by + unfold volumeMeasureOn + rw [MeasureTheory.Measure.restrict_apply + (hUopen.measurableSet.diff hK_closed.measurableSet)] + simpa [Set.inter_eq_self_of_subset_left (Set.sdiff_subset : U \ K ⊆ U)] + using hμK.le + have htail := + hδ (U \ K) (hUopen.measurableSet.diff hK_closed.measurableSet) hsmall + have hε_bound : ENNReal.ofReal (ε.toReal / 2) ≤ ε := by + have hhalf_le : ε.toReal / 2 ≤ ε.toReal := by + linarith [(ENNReal.toReal_nonneg : 0 ≤ ε.toReal)] + exact (ENNReal.ofReal_le_iff_le_toReal hε_top).2 hhalf_le + filter_upwards [hη_eventually_one K hK_compact hKU] with n hn + calc + Gagliardo.integralLpSeminorm (fun x => g x - η n x * g x) 2 (volumeMeasureOn U) + ≤ Gagliardo.integralLpSeminorm ((U \ K).indicator g) 2 (volumeMeasureOn U) := by + simp only [Gagliardo.integralLpSeminorm, + show (2 : ℝ≥0∞) ≠ 0 by norm_num, show (2 : ℝ≥0∞) ≠ ∞ by norm_num, + if_false, ENNReal.toReal_ofNat] + apply MeasureTheory.eLpNorm'_mono_ae (by norm_num) + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + simpa [volumeMeasureOn] using + MeasureTheory.ae_restrict_mem hUopen.measurableSet + filter_upwards [hmem] with x hxU + by_cases hxK : x ∈ K + · have hηx : η n x = 1 := hn x hxK + simp [hηx, hxK] + · have hxDiff : x ∈ U \ K := ⟨hxU, hxK⟩ + rw [Set.indicator_of_mem hxDiff] + exact + norm_sub_mul_self_le_norm_of_nonneg_of_le_one + (η n x) (g x) (hη_nonneg n x) (hη_le_one n x) + _ ≤ MeasureTheory.eLpNorm ((U \ K).indicator g) 2 (volumeMeasureOn U) := + Gagliardo.integralLpSeminorm_le_eLpNorm _ _ _ + _ ≤ ENNReal.ofReal (ε.toReal / 2) := htail + _ ≤ ε := hε_bound + + +/-- Measurable cutoffs satisfy the same convergence statement for Mathlib’s norm. -/ +theorem tendsto_eLpNorm_sub_mul_of_eventually_eq_one_on_compacts + {d : ℕ} {U : Set (Vec d)} {g : Vec d → ℝ} {η : ℕ → Vec d → ℝ} + (hUopen : IsOpen U) (hUfinite : MeasureTheory.volume U ≠ ⊤) + (hg : MemScalarL2 U g) + (hη_nonneg : ∀ n x, 0 ≤ η n x) + (hη_le_one : ∀ n x, η n x ≤ 1) + (hη_eventually_one : + ∀ K : Set (Vec d), IsCompact K → K ⊆ U → + ∀ᶠ n in Filter.atTop, ∀ x ∈ K, η n x = 1) + (hη : ∀ n, MeasureTheory.AEStronglyMeasurable (η n) (volumeMeasureOn U)) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => g x - η n x * g x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + have hraw := tendsto_integralLpSeminorm_sub_mul_of_eventually_eq_one_on_compacts + hUopen hUfinite hg hη_nonneg hη_le_one hη_eventually_one + have heq : (fun n => Gagliardo.integralLpSeminorm + (fun x => g x - η n x * g x) 2 (volumeMeasureOn U)) = + (fun n => MeasureTheory.eLpNorm + (fun x => g x - η n x * g x) 2 (volumeMeasureOn U)) := by + funext n + exact Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ + (hg.aestronglyMeasurable.sub ((hη n).mul hg.aestronglyMeasurable)) + rwa [heq] at hraw + +/-- A compact subset of an open triadic cube is contained in a strictly smaller +concentric closed cube. -/ +theorem IsCompact.exists_lt_one_subset_scaledClosedCubeSet_of_subset_openCubeSet + {d : ℕ} {Q : TriadicCube d} {K : Set (Vec d)} + (hK : IsCompact K) (hKU : K ⊆ openCubeSet Q) : + ∃ ρ : ℝ, ρ < 1 ∧ K ⊆ scaledClosedCubeSet Q ρ := by + by_cases hKempty : K = ∅ + · refine ⟨0, zero_lt_one, ?_⟩ + simp [hKempty] + · have hKne : K.Nonempty := Set.nonempty_iff_ne_empty.mpr hKempty + let imageDist : Set ℝ := (fun x : Vec d => dist x (cubeCenter Q)) '' K + have hDistCont : Continuous fun x : Vec d => dist x (cubeCenter Q) := + continuous_id.dist continuous_const + let M : ℝ := + Classical.choose + ((hK.image hDistCont).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨dist x (cubeCenter Q), ⟨x, hx, rfl⟩⟩)) + have hM_mem : M ∈ imageDist := + (Classical.choose_spec + ((hK.image hDistCont).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨dist x (cubeCenter Q), ⟨x, hx, rfl⟩⟩))).1 + have hM_ge : ∀ y ∈ imageDist, y ≤ M := + (Classical.choose_spec + ((hK.image hDistCont).exists_isGreatest + (by + rcases hKne with ⟨x, hx⟩ + exact ⟨dist x (cubeCenter Q), ⟨x, hx, rfl⟩⟩))).2 + rcases hM_mem with ⟨x₀, hx₀K, hx₀M⟩ + have hM_nonneg : 0 ≤ M := by + rw [← hx₀M] + exact dist_nonneg + have hM_lt : M < cubeRadius Q := by + have hx₀_open : x₀ ∈ Metric.ball (cubeCenter Q) (cubeRadius Q) := by + simpa [ball_cubeCenter_eq_openCubeSet] using hKU hx₀K + have hx₀_dist : dist x₀ (cubeCenter Q) < cubeRadius Q := by + simpa [Metric.mem_ball, dist_comm] using hx₀_open + simpa [← hx₀M] using hx₀_dist + refine ⟨M / cubeRadius Q, ?_, ?_⟩ + · have hrad : 0 < cubeRadius Q := cubeRadius_pos Q + rw [div_lt_one hrad] + exact hM_lt + · intro x hxK i + have hxM : dist x (cubeCenter Q) ≤ M := + hM_ge (dist x (cubeCenter Q)) ⟨x, hxK, rfl⟩ + have hcoord : dist (x i) (cubeCenter Q i) ≤ M := + (dist_pi_le_iff hM_nonneg).1 hxM i + have hscale : M / cubeRadius Q * cubeRadius Q = M := by + field_simp [(ne_of_gt (cubeRadius_pos Q))] + simpa [scaledClosedCubeSet, Real.dist_eq, abs_sub_comm, hscale] using hcoord + +/-- If inner radii tend to `1`, they eventually contain any compact subset of +the open cube. -/ +theorem eventually_subset_scaledClosedCubeSet_of_tendsto_one + {d : ℕ} {Q : TriadicCube d} {K : Set (Vec d)} {ρ : ℕ → ℝ} + (hρ : Filter.Tendsto ρ Filter.atTop (nhds 1)) + (hK : IsCompact K) (hKU : K ⊆ openCubeSet Q) : + ∀ᶠ n in Filter.atTop, K ⊆ scaledClosedCubeSet Q (ρ n) := by + rcases IsCompact.exists_lt_one_subset_scaledClosedCubeSet_of_subset_openCubeSet hK hKU with + ⟨σ, hσ_lt_one, hKσ⟩ + have hσ_eventually : ∀ᶠ n in Filter.atTop, σ < ρ n := + hρ.eventually (isOpen_Ioi.mem_nhds hσ_lt_one) + filter_upwards [hσ_eventually] with n hn x hx + exact scaledClosedCubeSet_mono Q (le_of_lt hn) (hKσ hx) + +namespace QuantitativeCubeCutoff + +/-- Quantitative cube cutoffs whose inner radius tends to one are eventually +identically `1` on each compact subset of the open cube. -/ +theorem eventually_eq_one_on_compacts_of_tendsto_inner + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℕ → ℝ} + (η : ∀ n, QuantitativeCubeCutoff Q (ρ₁ n) (ρ₂ n)) + (hρ₁ : Filter.Tendsto ρ₁ Filter.atTop (nhds 1)) + (K : Set (Vec d)) (hK : IsCompact K) (hKU : K ⊆ openCubeSet Q) : + ∀ᶠ n in Filter.atTop, ∀ x ∈ K, η n x = 1 := by + filter_upwards + [eventually_subset_scaledClosedCubeSet_of_tendsto_one + (Q := Q) (K := K) hρ₁ hK hKU] with n hn x hx + exact (η n).eq_one_on_inner x (hn hx) + +/-- Cutting an `L²` function by quantitative cube cutoffs whose inner radii +tend to one converges back to the function in `L²(openCubeSet Q)`. -/ +theorem tendsto_eLpNorm_sub_mul_of_tendsto_inner + {d : ℕ} {Q : TriadicCube d} {g : Vec d → ℝ} {ρ₁ ρ₂ : ℕ → ℝ} + (η : ∀ n, QuantitativeCubeCutoff Q (ρ₁ n) (ρ₂ n)) + (hρ₁ : Filter.Tendsto ρ₁ Filter.atTop (nhds 1)) + (hg : MemScalarL2 (openCubeSet Q) g) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => g x - η n x * g x) 2 + (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + exact + tendsto_eLpNorm_sub_mul_of_eventually_eq_one_on_compacts + (U := openCubeSet Q) (g := g) (η := fun n x => η n x) + (isOpen_openCubeSet Q) (volume_openCubeSet_lt_top Q).ne hg + (fun n x => (η n).nonneg x) + (fun n x => (η n).le_one x) + (eventually_eq_one_on_compacts_of_tendsto_inner η hρ₁) + (fun n => (η n).smooth.continuous.aestronglyMeasurable) + +end QuantitativeCubeCutoff + +namespace QuantitativeCubeCutoff + +/-- Product-rule derivative convergence for cutoff tests, with the genuinely +hard face term isolated as the boundary-error hypothesis. -/ +theorem tendsto_eLpNorm_euclideanCoordDeriv_mul_sub_of_tendsto_inner_of_boundary_error + {d : ℕ} {Q : TriadicCube d} {ψ : Vec d → ℝ} {ρ₁ ρ₂ : ℕ → ℝ} + (η : ∀ n, QuantitativeCubeCutoff Q (ρ₁ n) (ρ₂ n)) + (hρ₁ : Filter.Tendsto ρ₁ Filter.atTop (nhds 1)) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hψ_compact : HasCompactSupport ψ) (i : Fin d) + (hboundary : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => euclideanCoordDeriv i (η n : Vec d → ℝ) x * ψ x) 2 + (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + euclideanCoordDeriv i (fun y => η n y * ψ y) x - + euclideanCoordDeriv i ψ x) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + let U : Set (Vec d) := openCubeSet Q + let Dψ : Vec d → ℝ := euclideanCoordDeriv i ψ + let B : ℕ → Vec d → ℝ := fun n x => + euclideanCoordDeriv i (η n : Vec d → ℝ) x * ψ x + have hDψ_mem : MemScalarL2 U Dψ := by + simpa [U, Dψ, MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hψ i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hψ_compact i)).restrict U + have hηDψ_mem : ∀ n, MemScalarL2 U (fun x => η n x * Dψ x) := by + intro n + have hcont : + Continuous (fun x => η n x * Dψ x) := + (η n).smooth.continuous.mul (contDiff_euclideanCoordDeriv hψ i).continuous + have hcomp : + HasCompactSupport (fun x => η n x * Dψ x) := by + simpa [Dψ] using! ((η n).hasCompactSupport.mul_right : + HasCompactSupport (fun x => (η n : Vec d → ℝ) x * euclideanCoordDeriv i ψ x)) + simpa [U, MemScalarL2, volumeMeasureOn] using + (hcont.memLp_of_hasCompactSupport hcomp).restrict U + have hB_mem : ∀ n, MemScalarL2 U (B n) := by + intro n + have hDη_cont : + Continuous (fun x => euclideanCoordDeriv i (η n : Vec d → ℝ) x) := + (contDiff_euclideanCoordDeriv (η n).smooth i).continuous + have hcont : Continuous (B n) := by + simpa [B] using! hDη_cont.mul hψ.continuous + have hDη_comp : + HasCompactSupport (fun x => euclideanCoordDeriv i (η n : Vec d → ℝ) x) := + hasCompactSupport_euclideanCoordDeriv (η n).hasCompactSupport i + have hcomp : HasCompactSupport (B n) := by + simpa [B] using! (hDη_comp.mul_right : + HasCompactSupport + (fun x => euclideanCoordDeriv i (η n : Vec d → ℝ) x * ψ x)) + simpa [U, MemScalarL2, volumeMeasureOn] using + (hcont.memLp_of_hasCompactSupport hcomp).restrict U + have htail : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U)) + Filter.atTop (nhds 0) := + tendsto_eLpNorm_sub_mul_of_tendsto_inner η hρ₁ hDψ_mem + have hbound : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + euclideanCoordDeriv i (fun y => η n y * ψ y) x - + euclideanCoordDeriv i ψ x) + 2 (volumeMeasureOn U) ≤ + MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U) + + MeasureTheory.eLpNorm (B n) 2 (volumeMeasureOn U) := by + intro n + have hfun : + (fun x => + euclideanCoordDeriv i (fun y => η n y * ψ y) x - + euclideanCoordDeriv i ψ x) = + fun x => -(Dψ x - η n x * Dψ x) + B n x := by + funext x + rw [euclideanCoordDeriv_mul_of_contDiff (η n).smooth hψ i x] + simp [Dψ, B] + ring + rw [hfun] + calc + MeasureTheory.eLpNorm (fun x => -(Dψ x - η n x * Dψ x) + B n x) + 2 (volumeMeasureOn U) + ≤ MeasureTheory.eLpNorm (fun x => -(Dψ x - η n x * Dψ x)) 2 + (volumeMeasureOn U) + + MeasureTheory.eLpNorm (B n) 2 (volumeMeasureOn U) := by + exact MeasureTheory.eLpNorm_add_le (by norm_num : (1 : ENNReal) ≤ 2) + _ = MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U) + + MeasureTheory.eLpNorm (B n) 2 (volumeMeasureOn U) := by + have hneg : + MeasureTheory.eLpNorm (fun x => -(Dψ x - η n x * Dψ x)) 2 + (volumeMeasureOn U) = + MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U) := by + change + MeasureTheory.eLpNorm (-(fun x => Dψ x - η n x * Dψ x)) 2 + (volumeMeasureOn U) = + MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U) + exact + MeasureTheory.eLpNorm_neg + (fun x => Dψ x - η n x * Dψ x) + (2 : ENNReal) (volumeMeasureOn U) + rw [hneg] + have hsum : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => Dψ x - η n x * Dψ x) 2 + (volumeMeasureOn U) + + MeasureTheory.eLpNorm (B n) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + have hboundary' : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (B n) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + simpa [B, U] using hboundary + simpa using htail.add hboundary' + refine Filter.Tendsto.squeeze tendsto_const_nhds hsum (fun n => ?_) hbound + exact bot_le + +end QuantitativeCubeCutoff + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/DiffQuotientLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/DiffQuotientLp.lean new file mode 100644 index 0000000000..0d52e7f14a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/DiffQuotientLp.lean @@ -0,0 +1,493 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyIntegrand + +/-! # Diff Quotient Lp -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + +/-- The H¹₀ scalar approximants converge globally whenever both the limit and +the approximants are genuinely supported in the domain. -/ +theorem tendsto_eLpNorm_h10_approx_sub_toFun_global_of_support_subset + (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => ψ.approx n x - ψ.toH1Function.toFun x) + 2 MeasureTheory.volume) + Filter.atTop (nhds 0) := by + have hEq : + (fun n => + MeasureTheory.eLpNorm + (fun x => ψ.approx n x - ψ.toH1Function.toFun x) + 2 MeasureTheory.volume) = + fun n => + MeasureTheory.eLpNorm + (fun x => ψ.approx n x - ψ.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U) := by + funext n + have happrox_support : Function.support (ψ.approx n) ⊆ U := + (subset_tsupport (ψ.approx n)).trans (ψ.approx_support_subset n) + have hdiff_support : + Function.support (fun x => ψ.approx n x - ψ.toH1Function.toFun x) ⊆ U := + (Function.support_sub _ _).trans + (Set.union_subset happrox_support hψ_support) + exact eLpNorm_eq_restrict_of_support_subset (U := U) hdiff_support + rw [hEq] + exact ψ.tendsto_approx + +/-- The scalar H¹₀ approximation errors are globally a.e.-strongly-measurable +when their support is genuinely contained in the domain. -/ +theorem aestronglyMeasurable_h10_approx_sub_toFun_global_of_support_subset + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) (n : ℕ) : + MeasureTheory.AEStronglyMeasurable + (fun x => ψ.approx n x - ψ.toH1Function.toFun x) + MeasureTheory.volume := by + have hrestrict : + MeasureTheory.AEStronglyMeasurable + (fun x => ψ.approx n x - ψ.toH1Function.toFun x) + (MeasureTheory.volume.restrict U) := + ((ψ.approx_smooth n).continuous.aestronglyMeasurable.restrict).sub + ψ.toH1Function.memL2.aestronglyMeasurable + have happrox_support : Function.support (ψ.approx n) ⊆ U := + (subset_tsupport (ψ.approx n)).trans (ψ.approx_support_subset n) + have hdiff_support : + Function.support (fun x => ψ.approx n x - ψ.toH1Function.toFun x) ⊆ U := + (Function.support_sub _ _).trans + (Set.union_subset happrox_support hψ_support) + exact aestronglyMeasurable_of_restrict_of_support_subset + (U := U) hU_meas hrestrict hdiff_support + +/-- Global convergence of the backward difference quotients of the H¹₀ +approximants to the backward difference quotient of the H¹₀ limit. -/ +theorem tendsto_eLpNorm_h10_backwardDifferenceQuotient_approx_sub_toFun_global + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + (step : ℝ) (i : Fin d) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) + 2 MeasureTheory.volume) + Filter.atTop (nhds 0) := + tendsto_eLpNorm_backwardDifferenceQuotient_sub_zero + (F := ψ.approx) (G := ψ.toH1Function.toFun) + (fun n => + aestronglyMeasurable_h10_approx_sub_toFun_global_of_support_subset + (U := U) hU_meas ψ hψ_support n) + (tendsto_eLpNorm_h10_approx_sub_toFun_global_of_support_subset + (U := U) ψ hψ_support) + step i + +/-- The smooth whole-space quotient estimate passes to a genuinely supported +`H¹₀(U)` limit. This is the zero-trace version of +`eLpNorm_euclideanBackwardDifferenceQuotient_le_eLpNorm_coordDeriv`: the +derivative side is the weak gradient coordinate on `U`. -/ +theorem eLpNorm_h10_backwardDifferenceQuotient_le_eLpNorm_grad + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm (fun x => ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := by + let L : ℝ≥0∞ := + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume + let R : ℝ≥0∞ := + MeasureTheory.eLpNorm (fun x => ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) + let A : ℕ → ℝ≥0∞ := fun n => + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) + 2 MeasureTheory.volume + let B : ℕ → ℝ≥0∞ := fun n => + MeasureTheory.eLpNorm + (fun x => + euclideanCoordDeriv i (ψ.approx n) x - ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) + have hA : + Filter.Tendsto A Filter.atTop (nhds 0) := by + simpa [A] using + tendsto_eLpNorm_h10_backwardDifferenceQuotient_approx_sub_toFun_global + (U := U) hU_meas ψ hψ_support step i + have hB : + Filter.Tendsto B Filter.atTop (nhds 0) := by + simpa [B, euclideanCoordDeriv] using ψ.tendsto_approx_grad i + have hAB : + Filter.Tendsto (fun n => A n + B n) Filter.atTop (nhds 0) := by + simpa [zero_add] using hA.add hB + have hupper_tendsto : + Filter.Tendsto (fun n => R + (A n + B n)) Filter.atTop (nhds R) := by + simpa [add_zero] using tendsto_const_nhds.add hAB + have hle_upper : ∀ n : ℕ, L ≤ R + (A n + B n) := by + intro n + let Ln : ℝ≥0∞ := + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i (ψ.approx n)) + 2 MeasureTheory.volume + let Rn : ℝ≥0∞ := + MeasureTheory.eLpNorm (euclideanCoordDeriv i (ψ.approx n)) + 2 MeasureTheory.volume + have hdq_approx_meas : + MeasureTheory.AEStronglyMeasurable + (euclideanBackwardDifferenceQuotient step i (ψ.approx n)) + MeasureTheory.volume := + (contDiff_euclideanBackwardDifferenceQuotient (ψ.approx_smooth n) step i).continuous + |>.aestronglyMeasurable + have hdq_diff_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) + MeasureTheory.volume := + aestronglyMeasurable_backwardDifferenceQuotient_sub_of_aestronglyMeasurable + (F := ψ.approx n) (G := ψ.toH1Function.toFun) + (aestronglyMeasurable_h10_approx_sub_toFun_global_of_support_subset + (U := U) hU_meas ψ hψ_support n) + step i + have hL_le : L ≤ Ln + A n := by + have htri := + MeasureTheory.eLpNorm_add_le + (μ := MeasureTheory.volume) (p := (2 : ℝ≥0∞)) + hdq_approx_meas hdq_diff_meas.neg + (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hpoint : + (euclideanBackwardDifferenceQuotient step i (ψ.approx n) + + - fun x => + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) = + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun := by + funext x + change + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + (euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) = + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x + ring + calc + L = + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume := rfl + _ = + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i (ψ.approx n) + + - fun x => + euclideanBackwardDifferenceQuotient step i (ψ.approx n) x - + euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun x) + 2 MeasureTheory.volume := by + rw [hpoint] + _ ≤ Ln + A n := by + simpa [Ln, A, Pi.add_apply, Pi.neg_apply] using htri + have hsmooth : Ln ≤ Rn := + eLpNorm_euclideanBackwardDifferenceQuotient_le_eLpNorm_coordDeriv + (ψ.approx_smooth n) (ψ.approx_hasCompactSupport n) hstep i + have hderiv_approx_mem : + MeasureTheory.MemLp (euclideanCoordDeriv i (ψ.approx n)) + 2 (MeasureTheory.volume.restrict U) := by + have hglobal : + MeasureTheory.MemLp (euclideanCoordDeriv i (ψ.approx n)) + 2 MeasureTheory.volume := + (contDiff_euclideanCoordDeriv (ψ.approx_smooth n) i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv (ψ.approx_hasCompactSupport n) i) + exact hglobal.restrict U + have hderiv_diff_mem : + MeasureTheory.MemLp + (fun x => + euclideanCoordDeriv i (ψ.approx n) x - ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := + hderiv_approx_mem.sub (ψ.toH1Function.gradMemL2 i) + have hR_le : Rn ≤ R + B n := by + have hderiv_support : + Function.support (euclideanCoordDeriv i (ψ.approx n)) ⊆ U := + (support_euclideanCoordDeriv_subset_tsupport i (ψ.approx n)).trans + (ψ.approx_support_subset n) + have htri := + MeasureTheory.eLpNorm_add_le + (μ := MeasureTheory.volume.restrict U) (p := (2 : ℝ≥0∞)) + (ψ.toH1Function.gradMemL2 i).aestronglyMeasurable + hderiv_diff_mem.aestronglyMeasurable + (by norm_num : (1 : ℝ≥0∞) ≤ 2) + have hderiv_point : + ((fun x => ψ.toH1Function.grad x i) + + fun x => + euclideanCoordDeriv i (ψ.approx n) x - + ψ.toH1Function.grad x i) = + euclideanCoordDeriv i (ψ.approx n) := by + funext x + change + ψ.toH1Function.grad x i + + (euclideanCoordDeriv i (ψ.approx n) x - + ψ.toH1Function.grad x i) = + euclideanCoordDeriv i (ψ.approx n) x + ring + calc + Rn = + MeasureTheory.eLpNorm (euclideanCoordDeriv i (ψ.approx n)) + 2 (MeasureTheory.volume.restrict U) := by + change + MeasureTheory.eLpNorm (euclideanCoordDeriv i (ψ.approx n)) + 2 MeasureTheory.volume = + MeasureTheory.eLpNorm (euclideanCoordDeriv i (ψ.approx n)) + 2 (MeasureTheory.volume.restrict U) + exact eLpNorm_eq_restrict_of_support_subset + (U := U) hderiv_support + _ ≤ R + B n := by + simpa [R, B, hderiv_point, Pi.add_apply] using htri + calc + L ≤ Ln + A n := hL_le + _ ≤ Rn + A n := by + simpa [add_comm] using add_le_add_right hsmooth (A n) + _ ≤ (R + B n) + A n := by + simpa [add_comm] using add_le_add_right hR_le (A n) + _ = R + (A n + B n) := by + rw [add_assoc, add_comm (B n) (A n)] + exact ge_of_tendsto hupper_tendsto (Filter.Eventually.of_forall hle_upper) + +/-- The global backward quotient of a genuinely supported `H¹₀(U)` function is +an `L²(ℝᵈ)` function. -/ +theorem memLp_h10_backwardDifferenceQuotient_of_support_subset + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + MeasureTheory.MemLp + (euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume := by + have hψ_meas : MeasureTheory.AEStronglyMeasurable ψ.toH1Function.toFun + MeasureTheory.volume := + aestronglyMeasurable_of_restrict_of_support_subset + (U := U) hU_meas ψ.toH1Function.memL2.aestronglyMeasurable hψ_support + have hdiff_meas : MeasureTheory.AEStronglyMeasurable + (fun x => ψ.toH1Function.toFun x - (fun _ : Vec d => (0 : ℝ)) x) + MeasureTheory.volume := + hψ_meas.sub MeasureTheory.aestronglyMeasurable_const + have hquot_meas : MeasureTheory.AEStronglyMeasurable + (euclideanBackwardDifferenceQuotient step i ψ.toH1Function.toFun) + MeasureTheory.volume := by + have hraw := + aestronglyMeasurable_backwardDifferenceQuotient_sub_of_aestronglyMeasurable + (F := ψ.toH1Function.toFun) (G := fun _ : Vec d => (0 : ℝ)) + hdiff_meas step i + change MeasureTheory.AEStronglyMeasurable + (fun x => + (ψ.toH1Function.toFun x - + ψ.toH1Function.toFun (euclideanCoordShift (-step) i x)) / step) + MeasureTheory.volume + simpa [euclideanBackwardDifferenceQuotient] using hraw + have hnorm := + eLpNorm_h10_backwardDifferenceQuotient_le_eLpNorm_grad + (U := U) hU_meas ψ hψ_support hstep i + exact ⟨hquot_meas, + lt_of_le_of_lt hnorm (ψ.toH1Function.gradMemL2 i).eLpNorm_lt_top⟩ + +/-- Forward version of the `H¹₀` quotient estimate. -/ +theorem eLpNorm_h10_forwardDifferenceQuotient_le_eLpNorm_grad + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + MeasureTheory.eLpNorm + (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm (fun x => ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := by + rw [euclideanForwardDifferenceQuotient_eq_backwardDifferenceQuotient_neg] + exact + eLpNorm_h10_backwardDifferenceQuotient_le_eLpNorm_grad + (U := U) hU_meas ψ hψ_support (neg_ne_zero.mpr hstep) i + +/-- The global forward quotient of a genuinely supported `H¹₀(U)` function is +an `L²(ℝᵈ)` function. -/ +theorem memLp_h10_forwardDifferenceQuotient_of_support_subset + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + MeasureTheory.MemLp + (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume := by + rw [euclideanForwardDifferenceQuotient_eq_backwardDifferenceQuotient_neg] + exact + memLp_h10_backwardDifferenceQuotient_of_support_subset + (U := U) hU_meas ψ hψ_support (neg_ne_zero.mpr hstep) i + +/-- Integral-square form of the forward `H¹₀` quotient estimate. -/ +theorem integral_forwardDifferenceQuotient_sq_le_integral_h10_grad_sq + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + ∫ x, (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, (ψ.toH1Function.grad x i) ^ 2 ∂MeasureTheory.volume := by + have hquot_mem := + memLp_h10_forwardDifferenceQuotient_of_support_subset + (U := U) hU_meas ψ hψ_support hstep i + have hgrad_mem := ψ.toH1Function.gradMemL2 i + have hnorm := + eLpNorm_h10_forwardDifferenceQuotient_le_eLpNorm_grad + (U := U) hU_meas ψ hψ_support hstep i + have htoReal_le : + ENNReal.toReal + (MeasureTheory.eLpNorm + (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume) ≤ + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U)) := + (ENNReal.toReal_le_toReal hquot_mem.eLpNorm_ne_top hgrad_mem.eLpNorm_ne_top).2 hnorm + have hsq_le : + (ENNReal.toReal + (MeasureTheory.eLpNorm + (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun) + 2 MeasureTheory.volume)) ^ 2 ≤ + (ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ψ.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U))) ^ 2 := + (sq_le_sq₀ ENNReal.toReal_nonneg ENNReal.toReal_nonneg).2 htoReal_le + rw [toReal_eLpNorm_two_sq_eq_integral_sq hquot_mem, + toReal_eLpNorm_two_sq_eq_integral_sq hgrad_mem] at hsq_le + exact hsq_le + +/-- Set-localized integral-square form of the forward `H¹₀` quotient estimate. -/ +theorem integral_set_forwardDifferenceQuotient_sq_le_integral_h10_grad_sq + (hU_meas : MeasurableSet U) (ψ : H10Function U) + (hψ_support : Function.support ψ.toH1Function.toFun ⊆ U) + (S : Set (Vec d)) {step : ℝ} (hstep : step ≠ 0) (i : Fin d) : + ∫ x in S, (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, (ψ.toH1Function.grad x i) ^ 2 ∂MeasureTheory.volume := by + have hquot_mem := + memLp_h10_forwardDifferenceQuotient_of_support_subset + (U := U) hU_meas ψ hψ_support hstep i + have hset_le : + ∫ x in S, (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x, (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x) ^ 2 + ∂MeasureTheory.volume := + MeasureTheory.setIntegral_le_integral hquot_mem.integrable_sq + (Filter.Eventually.of_forall fun _ => sq_nonneg _) + exact hset_le.trans + (integral_forwardDifferenceQuotient_sq_le_integral_h10_grad_sq + (U := U) hU_meas ψ hψ_support hstep i) + +/-- Lower-order quotient control for a function localized by a cutoff which is +one on the set of integration and on its forward coordinate shift. -/ +theorem integral_set_forwardDifferenceQuotient_sq_le_integral_localized_h10_grad_sq + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hφ_one : ∀ x ∈ S, φ x = 1) + (hφ_shift_one : ∀ x ∈ S, φ (euclideanCoordShift step i x) = 1) : + ∫ x in S, (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, + ((u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x i) ^ 2 + ∂MeasureTheory.volume := by + let ψ : H10Function U := + u.mulContDiffHasCompactSupportToH10 hU hφ hφ_compact hφ_sub + have hψ_support : Function.support ψ.toH1Function.toFun ⊆ U := by + have hfun : ψ.toH1Function.toFun = fun x => φ x * u.toFun x := by + simp [ψ] + rw [hfun] + exact (Function.support_mul_subset_left φ u.toFun).trans + ((subset_tsupport φ).trans hφ_sub) + have hleft_eq : + ∫ x in S, (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume = + ∫ x in S, + (euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x) ^ 2 + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hS_meas] with x hx + have hφx : φ x = 1 := hφ_one x hx + have hφshift : φ (euclideanCoordShift step i x) = 1 := + hφ_shift_one x hx + have hψx : ψ.toH1Function.toFun x = u.toFun x := by + calc + ψ.toH1Function.toFun x = φ x * u.toFun x := by simp [ψ] + _ = u.toFun x := by rw [hφx]; ring + have hψshift : ψ.toH1Function.toFun (euclideanCoordShift step i x) = + u.toFun (euclideanCoordShift step i x) := by + calc + ψ.toH1Function.toFun (euclideanCoordShift step i x) = + φ (euclideanCoordShift step i x) * + u.toFun (euclideanCoordShift step i x) := by + simp [ψ] + _ = u.toFun (euclideanCoordShift step i x) := by + rw [hφshift] + ring + have hquot : + euclideanForwardDifferenceQuotient step i u.toFun x = + euclideanForwardDifferenceQuotient step i ψ.toH1Function.toFun x := by + unfold euclideanForwardDifferenceQuotient + rw [hψshift, hψx] + rw [hquot] + rw [hleft_eq] + exact + integral_set_forwardDifferenceQuotient_sq_le_integral_h10_grad_sq + (U := U) hU.isOpen.measurableSet ψ hψ_support S hstep i + +/-- A smooth compactly supported cutoff localizes a scalar `L²(V)` function to +an ambient scalar `L²(U)` function when the cutoff support lies in `V`. -/ +theorem memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + {φ F : Vec d → ℝ} (hV_meas : MeasurableSet V) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ V) (hF : MemScalarL2 V F) : + MemScalarL2 U (fun x => φ x * F x) := by + have hφ_top : + MeasureTheory.MemLp φ ⊤ (MeasureTheory.volume.restrict V) := + hφ.continuous.memLp_top_of_hasCompactSupport hφ_compact + (MeasureTheory.volume.restrict V) + have hprodV : + MeasureTheory.MemLp (fun x => φ x * F x) 2 + (MeasureTheory.volume.restrict V) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm] using hF.mul' hφ_top + have hsupport : Function.support (fun x => φ x * F x) ⊆ V := + (Function.support_mul_subset_left φ F).trans (subset_tsupport φ |>.trans hφ_sub) + simpa [MemScalarL2, volumeMeasureOn] using + memLp_restrict_of_support_subset_of_memLp + (U := U) (V := V) hV_meas hsupport hprodV + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyHalf.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyHalf.lean new file mode 100644 index 0000000000..485bd8cbe3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyHalf.lean @@ -0,0 +1,1116 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.IntegralIdentity + +/-! # Energy Half -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- Additivity of the quotient-Hessian pairing on smooth weak tests. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_add + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + (φ ψ : H1WeakTestFunction S) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (φ.add ψ : Vec d → ℝ) x) (basisVec j) + ∂MeasureTheory.volume = + (-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) + ∂MeasureTheory.volume) + + (-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (ψ : Vec d → ℝ) x) (basisVec j) + ∂MeasureTheory.volume) := by + let w : H1Function V := u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift + let G : Vec d → ℝ := fun x => w.grad x j + let T : H1WeakTestFunction S → ℝ := fun τ => + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (τ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + change T (φ.add ψ) = T φ + T ψ + have hpair : + ∀ τ : H1WeakTestFunction S, + ∫ x in V, G x * τ x ∂MeasureTheory.volume = T τ := by + intro τ + change + ∫ x in V, + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j * + τ x ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (τ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + exact + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU + (step := step) i j hVshift + τ.smooth τ.compactSupport (τ.support_subset.trans hSV) + have hpair_add : + ∫ x in V, G x * (φ.add ψ) x ∂MeasureTheory.volume = T (φ.add ψ) := by + exact hpair (φ.add ψ) + have hpairφ : + ∫ x in V, G x * φ x ∂MeasureTheory.volume = T φ := by + exact hpair φ + have hpairψ : + ∫ x in V, G x * ψ x ∂MeasureTheory.volume = T ψ := by + exact hpair ψ + have hG : MemScalarL2 V G := by + simpa [G, w] using (w.gradMemL2 j) + have hφV : MemScalarL2 V φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (φ.smooth.continuous.memLp_of_hasCompactSupport φ.compactSupport).restrict V + have hψV : MemScalarL2 V ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (ψ.smooth.continuous.memLp_of_hasCompactSupport ψ.compactSupport).restrict V + have hGφ_int : + MeasureTheory.Integrable (fun x => G x * φ x) + (MeasureTheory.volume.restrict V) := by + simpa [volumeMeasureOn] using! hG.integrable_mul hφV + have hGψ_int : + MeasureTheory.Integrable (fun x => G x * ψ x) + (MeasureTheory.volume.restrict V) := by + simpa [volumeMeasureOn] using! hG.integrable_mul hψV + have hlin : + ∫ x in V, G x * (φ.add ψ) x ∂MeasureTheory.volume = + ∫ x in V, G x * φ x ∂MeasureTheory.volume + + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := by + calc + ∫ x in V, G x * (φ.add ψ) x ∂MeasureTheory.volume = + ∫ x in V, (G x * φ x) + (G x * ψ x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [H1WeakTestFunction.add] + ring + _ = ∫ x in V, G x * φ x ∂MeasureTheory.volume + + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hGφ_int hGψ_int] + calc + T (φ.add ψ) = ∫ x in V, G x * (φ.add ψ) x ∂MeasureTheory.volume := hpair_add.symm + _ = ∫ x in V, G x * φ x ∂MeasureTheory.volume + + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := hlin + _ = T φ + T ψ := by rw [hpairφ, hpairψ] + +/-- Scalar-multiplicativity of the quotient-Hessian pairing on smooth weak +tests. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_smul + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + (c : ℝ) (φ : H1WeakTestFunction S) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (φ.smul c : Vec d → ℝ) x) (basisVec j) + ∂MeasureTheory.volume = + c * + (-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) + ∂MeasureTheory.volume) := by + let w : H1Function V := u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift + let G : Vec d → ℝ := fun x => w.grad x j + let T : H1WeakTestFunction S → ℝ := fun τ => + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (τ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + change T (φ.smul c) = c * T φ + have hpair : + ∀ τ : H1WeakTestFunction S, + ∫ x in V, G x * τ x ∂MeasureTheory.volume = T τ := by + intro τ + change + ∫ x in V, + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j * + τ x ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ (τ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + exact + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU + (step := step) i j hVshift + τ.smooth τ.compactSupport (τ.support_subset.trans hSV) + have hpair_smul : + ∫ x in V, G x * (φ.smul c) x ∂MeasureTheory.volume = T (φ.smul c) := by + exact hpair (φ.smul c) + have hpairφ : + ∫ x in V, G x * φ x ∂MeasureTheory.volume = T φ := by + exact hpair φ + have hG : MemScalarL2 V G := by + simpa [G, w] using (w.gradMemL2 j) + have hφV : MemScalarL2 V φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (φ.smooth.continuous.memLp_of_hasCompactSupport φ.compactSupport).restrict V + have hGφ_int : + MeasureTheory.Integrable (fun x => G x * φ x) + (MeasureTheory.volume.restrict V) := by + simpa [volumeMeasureOn] using! hG.integrable_mul hφV + have hlin : + ∫ x in V, G x * (φ.smul c) x ∂MeasureTheory.volume = + c * ∫ x in V, G x * φ x ∂MeasureTheory.volume := by + calc + ∫ x in V, G x * (φ.smul c) x ∂MeasureTheory.volume = + ∫ x in V, c * (G x * φ x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [H1WeakTestFunction.smul] + ring + _ = c * ∫ x in V, G x * φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + calc + T (φ.smul c) = ∫ x in V, G x * (φ.smul c) x ∂MeasureTheory.volume := + hpair_smul.symm + _ = c * ∫ x in V, G x * φ x ∂MeasureTheory.volume := hlin + _ = c * T φ := by rw [hpairφ] + +/-- Quantitative weak-Hessian handoff from an inner energy estimate: if the +forward quotient-gradient energy is controlled on a support set `S`, then the +distributional second-derivative test functional is controlled there. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_of_inner_energy_quarter_le + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step R : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_subS : tsupport φ ⊆ S) + (henergy : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (2 : ℝ) * R + + (1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume := by + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + have hpair := + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU i j hVshift + hφ hφ_compact (hφ_subS.trans hSV) + have hφS : MemScalarL2 S φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict S + have hbound : + |∫ x in V, G x j * φ x ∂MeasureTheory.volume| ≤ + (1 / 2 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume := + abs_integral_coord_mul_le_half_integral_subset_vecNormSq_add_half_integral_subset_sq_of_support_subset + (S := S) (V := V) (G := G) (φ := φ) + hSV ((subset_tsupport φ).trans hφ_subS) + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + hφS j + have hbase : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (1 / 2 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume := by + rw [← hpair] + change + |∫ x in V, G x j * φ x ∂MeasureTheory.volume| ≤ + (1 / 2 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume + exact hbound + have henergy_half : + (1 / 2 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * R := by + change + (1 / 2 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * R + calc + (1 / 2 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume = + 2 * ((1 / 4 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume) := by + ring + _ ≤ 2 * R := mul_le_mul_of_nonneg_left henergy (by norm_num) + exact hbase.trans + (add_le_add_left henergy_half + ((1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume)) + +/-- Specialization of the direct-test summation-by-parts identity to +`G = ∇u`. -/ +theorem integral_vecDot_grad_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_neg_integral_forwardDifferenceQuotientOn_grad_on + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (u.grad x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + -∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := by + have hshift : + MemVectorL2 V (fun x => u.grad (euclideanCoordShift step i x)) := + memVectorL2_grad_comp_euclideanCoordShift_of_shift_subset + (U := U) (V := V) u hV step i hVshift + have hbase := + integral_vecDot_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_neg_integral_forwardDifferenceQuotient_on + (U := U) (V := V) (G := u.grad) u.grad_memVectorL2 u hV hVU step i hshift + hVshift hη hη_compact hη_sub + have hright : + -∫ x in V, + vecDot + (fun j => euclideanForwardDifferenceQuotient step i (fun y => u.grad y j) x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + -∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := by + congr 1 + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + change + vecDot (fun j => euclideanForwardDifferenceQuotient step i (fun y => u.grad y j) x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) = + vecDot ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + rw [← forwardDifferenceQuotientOn_grad_eq_vectorForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift x] + exact hbase.trans hright + +/-- Direct difference-quotient energy identity obtained by testing the +original weak equation with `D_i^-(η²D_i^+u)` and summing by parts. -/ +theorem directDifferenceQuotient_sqCutoff_energy_identity + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + -∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + ∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume := by + have hweak := + h.test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_explicitGradient + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have hsummation := + integral_vecDot_grad_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_neg_integral_forwardDifferenceQuotientOn_grad_on + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + exact hsummation.symm.trans hweak + +/-- Direct difference-quotient energy identity with the localized test +gradient expanded into its main and cutoff-error pieces. -/ +theorem directDifferenceQuotient_sqCutoff_energy_identity_expanded + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + -∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + η x ^ 2 * + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (2 * η x * euclideanGradient η x j)) + ∂MeasureTheory.volume = + ∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume := by + simpa using + h.directDifferenceQuotient_sqCutoff_energy_identity + hU hf hV hVU step i hVshift hη hη_compact hη_sub + +/-- A squared smooth compact cutoff times the squared norm of an `L²` vector +field is integrable. -/ +theorem integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + {G : Vec d → Vec d} {η : Vec d → ℝ} + (hG : MemVectorL2 V G) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) : + MeasureTheory.IntegrableOn + (fun x => η x ^ 2 * vecNormSq (G x)) V := by + have hGsq : MeasureTheory.IntegrableOn (fun x => vecNormSq (G x)) V := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hG hG + exact integrableOn_mul_left_of_continuous_hasCompactSupport + (V := V) (φ := fun x => η x ^ 2) (F := fun x => vecNormSq (G x)) + (contDiff_sq hη).continuous (hasCompactSupport_sq hη_compact) hGsq + +/-- The squared quotient term weighted by the squared cutoff-gradient norm is +integrable whenever the quotient is scalar `L²` and the cutoff is smooth compact +support. -/ +theorem integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + {w η : Vec d → ℝ} + (hw : MemScalarL2 V w) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) : + MeasureTheory.IntegrableOn + (fun x => 2 * w x ^ 2 * vecNormSq (euclideanGradient η x)) V := by + have hw_sq : + MeasureTheory.Integrable (fun x => w x * w x) (volumeMeasureOn V) := + hw.integrable_mul hw + have hgrad_top : + MeasureTheory.MemLp + (fun x => vecNormSq (euclideanGradient η x)) ⊤ (volumeMeasureOn V) := + (continuous_vecNormSq_euclideanGradient_of_contDiff hη).memLp_top_of_hasCompactSupport + (hasCompactSupport_vecNormSq_euclideanGradient hη_compact) (volumeMeasureOn V) + have hmul : + MeasureTheory.Integrable + (fun x => vecNormSq (euclideanGradient η x) * (w x * w x)) + (volumeMeasureOn V) := + hw_sq.mul_of_top_right hgrad_top + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, pow_two, + mul_assoc, mul_comm, mul_left_comm] using hmul.const_mul (2 : ℝ) + +/-- The mixed squared-cutoff cross term is integrable when the scalar quotient +and vector quotient-gradient are both `L²`. -/ +theorem integrableOn_sq_cutoff_cross_of_memScalarL2_memVectorL2 + {w : Vec d → ℝ} {G : Vec d → Vec d} {η : Vec d → ℝ} + (hw : MemScalarL2 V w) (hG : MemVectorL2 V G) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) : + MeasureTheory.IntegrableOn + (fun x => + w x * vecDot (G x) (fun j => 2 * η x * euclideanGradient η x j)) V := by + have hsum : + MeasureTheory.Integrable + (fun x => + ∑ j : Fin d, + w x * (G x j * (2 * η x * euclideanGradient η x j))) + (volumeMeasureOn V) := by + refine MeasureTheory.integrable_finsetSum (μ := volumeMeasureOn V) + Finset.univ ?_ + intro j hj + have hGj : MemScalarL2 V (fun x => G x j) := + memScalarL2_coord_of_memVectorL2 hG j + have hwGj : + MeasureTheory.Integrable (fun x => w x * G x j) (volumeMeasureOn V) := + hw.integrable_mul hGj + have hBj_cont : + Continuous (fun x => η x * (2 * euclideanGradient η x j)) := + hη.continuous.mul + (continuous_const.mul ((contDiff_euclideanCoordDeriv hη j).continuous)) + have hBj_compact : + HasCompactSupport (fun x => η x * (2 * euclideanGradient η x j)) := + hη_compact.mul_right + have hBj_top : + MeasureTheory.MemLp + (fun x => η x * (2 * euclideanGradient η x j)) ⊤ + (volumeMeasureOn V) := + hBj_cont.memLp_top_of_hasCompactSupport hBj_compact (volumeMeasureOn V) + have hprod : + MeasureTheory.Integrable + (fun x => (η x * (2 * euclideanGradient η x j)) * (w x * G x j)) + (volumeMeasureOn V) := + hwGj.mul_of_top_right hBj_top + simpa [mul_assoc, mul_comm, mul_left_comm] using hprod + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, vecDot, Finset.mul_sum, + mul_assoc, mul_comm, mul_left_comm] using hsum + +/-- Direct squared-cutoff Caccioppoli absorption. + +This is the useful output of the direct test +`D_i^-(η² D_i^+u)`: it controls the localized `L²` norm of the gradient +difference quotient by the original forcing paired with the same direct test, +plus the usual cutoff-gradient error. No difference quotient of `f` appears. -/ +theorem directDifferenceQuotient_sqCutoff_energy_half_le_neg_forcing_add_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (-(∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume)) + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let w : Vec d → ℝ := euclideanForwardDifferenceQuotient step i u.toFun + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + let m : Vec d → ℝ := fun x => η x ^ 2 * vecNormSq (G x) + let c : Vec d → ℝ := + fun x => w x * vecDot (G x) (fun j => 2 * η x * euclideanGradient η x j) + let e : Vec d → ℝ := + fun x => 2 * (w x) ^ 2 * vecNormSq (euclideanGradient η x) + let R : ℝ := + -∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume + have henergy_raw := + h.directDifferenceQuotient_sqCutoff_energy_identity_expanded + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have hleft : + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + η x ^ 2 * + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (2 * η x * euclideanGradient η x j)) + ∂MeasureTheory.volume = + ∫ x in V, (m x + c x) ∂MeasureTheory.volume := by + congr with x + have hpoint := + vecDot_cutoff_energy_integrand + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => 2 * η x * euclideanGradient η x j) + (η x ^ 2) (w x) + simpa [m, c, w, G, vecNormSq] using hpoint + have henergy_vec : + ∫ x in V, + vecDot + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + (fun j => + η x ^ 2 * + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (2 * η x * euclideanGradient η x j)) + ∂MeasureTheory.volume = R := by + have hneg := congrArg (fun t : ℝ => -t) henergy_raw + simpa [R] using hneg + have henergy : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = R := by + exact hleft.symm.trans henergy_vec + have hpoint : + (fun x => -c x) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => m x / 2 + e x := by + filter_upwards with x + have hbound := + neg_sq_cutoff_error_integrand_le + (η x) (w x) (G x) (euclideanGradient η x) + change + -(w x * + vecDot (G x) (fun j => 2 * η x * euclideanGradient η x j)) ≤ + η x ^ 2 * vecNormSq (G x) / 2 + + 2 * w x ^ 2 * vecNormSq (euclideanGradient η x) + rw [← neg_mul] + exact hbound + have hm : MeasureTheory.IntegrableOn m V := by + have hG : MemVectorL2 V G := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [m, G] using + integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + (V := V) (G := G) (η := η) hG hη hη_compact + have hc : MeasureTheory.IntegrableOn c V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + have hG : MemVectorL2 V G := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [c, w, G] using + integrableOn_sq_cutoff_cross_of_memScalarL2_memVectorL2 + (V := V) (w := w) (G := G) (η := η) hw hG hη hη_compact + have he : MeasureTheory.IntegrableOn e V := by + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + simpa [e, w] using + integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + (V := V) (w := w) (η := η) hw hη hη_compact + have hhalf := + integral_half_main_le_scalar_rhs_add_error_of_add_energy_identity + (V := V) (m := m) (c := c) (e := e) (R := R) + henergy hpoint hm hc he + change + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume ≤ + R + ∫ x in V, e x ∂MeasureTheory.volume + exact hhalf + +/-- Direct squared-cutoff Caccioppoli after the elementary forcing Young +estimate. + +The only remaining analytic input needed after this statement is the +localized difference-quotient estimate controlling the squared direct test +`D_i^-(η²D_i^+u)` by the gradient of `η²D_i^+u`. -/ +theorem directDifferenceQuotient_sqCutoff_energy_half_le_forcing_sq_add_test_sq_add_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * + ∫ x in U, + (euclideanBackwardDifferenceQuotient step i + (fun y => + η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x) ^ 2 + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let T : Vec d → ℝ := + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_half_le_neg_forcing_add_error + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have hT : MemScalarL2 U T := by + let ψ : H10Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + simpa [T, ψ] using ψ.toH1Function.memL2 + have hforce := + neg_integral_mul_le_half_integral_sq_add_half_integral_sq_of_memScalarL2 + (U := U) (F := f) (G := T) hf hT + let Eterm : ℝ := + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + have hforce_with_error : + (-(∫ x in U, f x * T x ∂MeasureTheory.volume)) + Eterm ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + Eterm := by + exact add_le_add_left hforce Eterm + exact hbase.trans (by + change + (-(∫ x in U, f x * T x ∂MeasureTheory.volume)) + Eterm ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + Eterm + exact hforce_with_error) + +/-- Direct squared-cutoff Caccioppoli with a smaller coefficient on the +test-square term, tuned for later absorption. -/ +theorem directDifferenceQuotient_sqCutoff_energy_half_le_two_forcing_sq_add_eighth_test_sq_add_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * + ∫ x in U, + (euclideanBackwardDifferenceQuotient step i + (fun y => + η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x) ^ 2 + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let T : Vec d → ℝ := + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_half_le_neg_forcing_add_error + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have hT : MemScalarL2 U T := by + let ψ : H10Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + simpa [T, ψ] using ψ.toH1Function.memL2 + have hforce := + neg_integral_mul_le_two_integral_sq_add_eighth_integral_sq_of_memScalarL2 + (U := U) (F := f) (G := T) hf hT + let Eterm : ℝ := + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + have hforce_with_error : + (-(∫ x in U, f x * T x ∂MeasureTheory.volume)) + Eterm ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + Eterm := by + exact add_le_add_left hforce Eterm + exact hbase.trans (by + change + (-(∫ x in U, f x * T x ∂MeasureTheory.volume)) + Eterm ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + Eterm + exact hforce_with_error) + +/-- Direct squared-cutoff Caccioppoli with the test-square term replaced by +the product-rule gradient of `η²D_i^+u`. -/ +theorem directDifferenceQuotient_sqCutoff_energy_half_le_forcing_sq_add_localizedSqCutoffForwardGradient_sq_add_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let T : Vec d → ℝ := + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) + let G : Vec d → ℝ := + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_half_le_forcing_sq_add_test_sq_add_error + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have htest := + integral_sq_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_integral_sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (U := U) (V := V) hU u hV hVU hstep i hVshift hη hη_compact hη_sub + have hhalf : + (1 / 2 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left + (by + change + ∫ x in U, + (euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + exact htest) + (by norm_num) + have hreplace : + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + exact add_le_add_left + (add_le_add_right hhalf + ((1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume)) + (∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume) + exact hbase.trans (by + change + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + exact hreplace) + +/-- Direct squared-cutoff Caccioppoli with both the small test-square +coefficient and the product-rule gradient replacement. -/ +theorem directDifferenceQuotient_sqCutoff_energy_half_le_two_forcing_sq_add_eighth_localizedSqCutoffForwardGradient_sq_add_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let T : Vec d → ℝ := + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) + let G : Vec d → ℝ := + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_half_le_two_forcing_sq_add_eighth_test_sq_add_error + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have htest := + integral_sq_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_integral_sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (U := U) (V := V) hU u hV hVU hstep i hVshift hη hη_compact hη_sub + have heighth : + (1 / 8 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume ≤ + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left + (by + change + ∫ x in U, + (euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + exact htest) + (by norm_num) + have hreplace : + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + exact add_le_add_left + (add_le_add_right heighth + ((2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume)) + (∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume) + exact hbase.trans (by + change + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, T x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + exact hreplace) + +/-- Pointwise control of the product-rule gradient term produced by +`η²D_i^+u`. The bound only needs the usual cutoff size condition +`|η| ≤ 1`. -/ +theorem sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_coord_le + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) + (hη_abs_le_one : ∀ x, |η x| ≤ 1) (x : Vec d) : + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 ≤ + 2 * η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + 8 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) := by + let A : Vec d := (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + let w : ℝ := euclideanForwardDifferenceQuotient step i u.toFun x + let B : Vec d := euclideanGradient η x + have hgrad : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i = + η x ^ 2 * A i + w * (2 * η x * B i) := by + simp [A, w, B] + have hη_sq_le_one : η x ^ 2 ≤ 1 := by + have hsq := + (sq_le_sq₀ (abs_nonneg (η x)) (by norm_num : 0 ≤ (1 : ℝ))).2 + (hη_abs_le_one x) + simpa [sq_abs] using hsq + have hη_sq_nonneg : 0 ≤ η x ^ 2 := sq_nonneg _ + have hη_four_le_sq : (η x ^ 2) ^ 2 ≤ η x ^ 2 := by + calc + (η x ^ 2) ^ 2 = η x ^ 2 * η x ^ 2 := by ring + _ ≤ η x ^ 2 * 1 := mul_le_mul_of_nonneg_left hη_sq_le_one hη_sq_nonneg + _ = η x ^ 2 := by ring + have hA_coord : A i ^ 2 ≤ vecNormSq A := coord_sq_le_vecNormSq A i + have hB_coord : B i ^ 2 ≤ vecNormSq B := coord_sq_le_vecNormSq B i + have hA_nonneg : 0 ≤ A i ^ 2 := sq_nonneg _ + have hB_nonneg : 0 ≤ B i ^ 2 := sq_nonneg _ + have htermA : + 2 * (η x ^ 2 * A i) ^ 2 ≤ 2 * η x ^ 2 * vecNormSq A := by + have hmul := mul_le_mul hη_four_le_sq hA_coord hA_nonneg hη_sq_nonneg + calc + 2 * (η x ^ 2 * A i) ^ 2 = + 2 * ((η x ^ 2) ^ 2 * A i ^ 2) := by ring + _ ≤ 2 * (η x ^ 2 * vecNormSq A) := + mul_le_mul_of_nonneg_left hmul (by norm_num) + _ = 2 * η x ^ 2 * vecNormSq A := by ring + have hηB : + η x ^ 2 * B i ^ 2 ≤ vecNormSq B := by + have hmul := mul_le_mul hη_sq_le_one hB_coord hB_nonneg (by norm_num : 0 ≤ (1 : ℝ)) + calc + η x ^ 2 * B i ^ 2 ≤ 1 * vecNormSq B := hmul + _ = vecNormSq B := by ring + have htermB : + 2 * (w * (2 * η x * B i)) ^ 2 ≤ + 8 * w ^ 2 * vecNormSq B := by + have hw_nonneg : 0 ≤ w ^ 2 := sq_nonneg _ + have hmul := mul_le_mul_of_nonneg_left hηB hw_nonneg + have hscaled := mul_le_mul_of_nonneg_left hmul (by norm_num : 0 ≤ (8 : ℝ)) + calc + 2 * (w * (2 * η x * B i)) ^ 2 = + 8 * (w ^ 2 * (η x ^ 2 * B i ^ 2)) := by ring + _ ≤ 8 * (w ^ 2 * vecNormSq B) := hscaled + _ = 8 * w ^ 2 * vecNormSq B := by ring + have hyoung : + (η x ^ 2 * A i + w * (2 * η x * B i)) ^ 2 ≤ + 2 * (η x ^ 2 * A i) ^ 2 + 2 * (w * (2 * η x * B i)) ^ 2 := by + rw [show + (η x ^ 2 * A i + w * (2 * η x * B i)) ^ 2 = + 2 * (η x ^ 2 * A i) ^ 2 + 2 * (w * (2 * η x * B i)) ^ 2 - + (η x ^ 2 * A i - w * (2 * η x * B i)) ^ 2 by ring] + exact sub_le_self _ (sq_nonneg _) + rw [hgrad] + change + (η x ^ 2 * A i + w * (2 * η x * B i)) ^ 2 ≤ + 2 * η x ^ 2 * vecNormSq A + 8 * w ^ 2 * vecNormSq B + exact hyoung.trans (add_le_add htermA htermB) + +/-- Integral absorption form of +`sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_coord_le`. -/ +theorem eighth_integral_sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_coord_le_quarter_energy_add_error + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) + (hη_abs_le_one : ∀ x, |η x| ≤ 1) : + (1 / 8 : ℝ) * + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume ≤ + (1 / 4 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume + + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let F : H1Function U := + localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let G : Vec d → ℝ := fun x => F.grad x i + let A : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + let w : Vec d → ℝ := euclideanForwardDifferenceQuotient step i u.toFun + let E : Vec d → ℝ := fun x => w x ^ 2 * vecNormSq (euclideanGradient η x) + have hG_support : Function.support G ⊆ V := by + change + Function.support + (fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ⊆ + V + exact + support_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (U := U) (V := V) u hV hVU step i i hVshift hη hη_compact hη_sub + have hGsq_support : Function.support (fun x => G x ^ 2) ⊆ V := by + intro x hx + exact hG_support (by + intro hGzero + exact hx (by simp [hGzero])) + have hrestrict : + ∫ x in U, G x ^ 2 ∂MeasureTheory.volume = + ∫ x in V, G x ^ 2 ∂MeasureTheory.volume := + integral_subset_of_support_subset hVU hGsq_support + rw [hrestrict] + have hG_memV : MeasureTheory.MemLp G 2 (volumeMeasureOn V) := by + exact (F.gradMemL2 i).mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + have hGsq_int : MeasureTheory.IntegrableOn (fun x => G x ^ 2) V := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hG_memV.integrable_mul hG_memV + have hleft_int : + MeasureTheory.IntegrableOn (fun x => (1 / 8 : ℝ) * G x ^ 2) V := + hGsq_int.const_mul (1 / 8 : ℝ) + have hmain_int : + MeasureTheory.IntegrableOn + (fun x => η x ^ 2 * vecNormSq (A x)) V := by + have hA : MemVectorL2 V A := by + change MemVectorL2 V + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad) + exact + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + simpa [A] using + integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + (V := V) (G := A) (η := η) hA hη hη_compact + have hquarter_int : + MeasureTheory.IntegrableOn + (fun x => (1 / 4 : ℝ) * (η x ^ 2 * vecNormSq (A x))) V := + hmain_int.const_mul (1 / 4 : ℝ) + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + have hE_two : + MeasureTheory.IntegrableOn + (fun x => 2 * w x ^ 2 * vecNormSq (euclideanGradient η x)) V := by + simpa [w] using + integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + (V := V) (w := w) (η := η) hw hη hη_compact + have hE_int : MeasureTheory.IntegrableOn E V := by + have hhalf := hE_two.const_mul ((2 : ℝ)⁻¹) + simpa [E, mul_assoc, mul_left_comm, mul_comm] using! hhalf + have hright_int : + MeasureTheory.IntegrableOn + (fun x => (1 / 4 : ℝ) * (η x ^ 2 * vecNormSq (A x)) + E x) V := + hquarter_int.add hE_int + have hpoint : + (fun x => (1 / 8 : ℝ) * G x ^ 2) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => (1 / 4 : ℝ) * (η x ^ 2 * vecNormSq (A x)) + E x := by + filter_upwards with x + have hsq : + G x ^ 2 ≤ + 2 * η x ^ 2 * vecNormSq (A x) + + 8 * w x ^ 2 * vecNormSq (euclideanGradient η x) := by + change + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 ≤ + 2 * η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + + 8 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) + exact + sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_coord_le + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub hη_abs_le_one x + nlinarith + have hmono := MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + have hleft_eq : + ∫ x in V, (1 / 8 : ℝ) * G x ^ 2 ∂MeasureTheory.volume = + (1 / 8 : ℝ) * ∫ x in V, G x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hquarter_eq : + ∫ x in V, (1 / 4 : ℝ) * (η x ^ 2 * vecNormSq (A x)) + ∂MeasureTheory.volume = + (1 / 4 : ℝ) * ∫ x in V, η x ^ 2 * vecNormSq (A x) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hright_eq : + ∫ x in V, + ((1 / 4 : ℝ) * (η x ^ 2 * vecNormSq (A x)) + E x) + ∂MeasureTheory.volume = + (1 / 4 : ℝ) * ∫ x in V, η x ^ 2 * vecNormSq (A x) + ∂MeasureTheory.volume + + ∫ x in V, E x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hquarter_int hE_int] + rw [hquarter_eq] + rw [hleft_eq, hright_eq] at hmono + change + (1 / 8 : ℝ) * ∫ x in V, G x ^ 2 ∂MeasureTheory.volume ≤ + (1 / 4 : ℝ) * + ∫ x in V, η x ^ 2 * vecNormSq (A x) ∂MeasureTheory.volume + + ∫ x in V, E x ∂MeasureTheory.volume + exact hmono + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyIntegrand.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyIntegrand.lean new file mode 100644 index 0000000000..ab6926eeea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/EnergyIntegrand.lean @@ -0,0 +1,646 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule + +/-! # Energy Integrand -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-! +# Localized difference-quotient tests for weak Poisson equations + +These lemmas are the first formal bridge in the difference-quotient route to +the interior `H²` estimate. They say that after restricting the weak equation +to an interior domain `V`, the smooth-cutoff times forward/backward +difference quotient tests constructed in `DifferenceQuotientH1` are legal +`H¹₀(V)` tests. +-/ + +/-- Algebraic splitting of the cutoff-energy integrand. -/ +theorem vecDot_cutoff_energy_integrand (A B : Vec d) (a b : ℝ) : + vecDot A (fun j => a * A j + b * B j) = + a * vecDot A A + b * vecDot A B := by + have hA : (fun j => a * A j) = a • A := by + ext j + simp + have hB : (fun j => b * B j) = b • B := by + ext j + simp + rw [show (fun j => a * A j + b * B j) = a • A + b • B by + ext j + simp] + simp [vecDot_add_right, vecDot_smul_right] + +/-- A coordinate square is bounded by the full squared Euclidean norm. -/ +theorem coord_sq_le_vecNormSq (A : Vec d) (i : Fin d) : + A i ^ 2 ≤ vecNormSq A := by + unfold vecNormSq vecDot + simpa [pow_two] using + Finset.single_le_sum (fun j _ => sq_nonneg (A j)) (Finset.mem_univ i) + +/-- Pointwise Young bound for the cutoff-error term when the cutoff is a +square, so the gradient contribution has the form `2η ∇η`. -/ +theorem abs_sq_cutoff_error_integrand_le + (η w : ℝ) (A B : Vec d) : + |w * vecDot A (fun j => 2 * η * B j)| ≤ + η ^ 2 * vecNormSq A / 2 + 2 * w ^ 2 * vecNormSq B := by + have hyoung := + abs_mul_mul_vecDot_le_add_halves_mul_sq_vecNormSq η (2 * w) A B + have harg : + η * (2 * w) * vecDot A B = + w * vecDot A (fun j => 2 * η * B j) := by + rw [show (fun j => 2 * η * B j) = (2 * η) • B by + ext j + simp] + rw [vecDot_smul_right] + ring + have hrhs : + η ^ 2 * vecNormSq A / 2 + (2 * w) ^ 2 * vecNormSq B / 2 = + η ^ 2 * vecNormSq A / 2 + 2 * w ^ 2 * vecNormSq B := by + ring + simpa [harg, hrhs] using hyoung + +/-- Non-absolute-value form of `abs_sq_cutoff_error_integrand_le`. -/ +theorem sq_cutoff_error_integrand_le + (η w : ℝ) (A B : Vec d) : + w * vecDot A (fun j => 2 * η * B j) ≤ + η ^ 2 * vecNormSq A / 2 + 2 * w ^ 2 * vecNormSq B := + (le_abs_self _).trans (abs_sq_cutoff_error_integrand_le η w A B) + +/-- The same pointwise bound for the negative cutoff-error term. -/ +theorem neg_sq_cutoff_error_integrand_le + (η w : ℝ) (A B : Vec d) : + -w * vecDot A (fun j => 2 * η * B j) ≤ + η ^ 2 * vecNormSq A / 2 + 2 * w ^ 2 * vecNormSq B := by + have hneg : -w * vecDot A (fun j => 2 * η * B j) = + -(w * vecDot A (fun j => 2 * η * B j)) := by + ring + rw [hneg] + exact (neg_le_abs _).trans (abs_sq_cutoff_error_integrand_le η w A B) + +/-- Integral absorption algebra for a cutoff energy identity. + +If `main + cross = rhs` after integration and the pointwise estimate +`-cross ≤ main / 2 + error` is integrable, then half of the main energy is +controlled by the right-hand side plus the error term. -/ +theorem integral_half_main_le_rhs_add_error_of_add_energy_identity + {m c r e : Vec d → ℝ} + (henergy : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = + ∫ x in V, r x ∂MeasureTheory.volume) + (hpoint : + (fun x => -c x) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => m x / 2 + e x) + (hm : MeasureTheory.IntegrableOn m V) + (hc : MeasureTheory.IntegrableOn c V) + (he : MeasureTheory.IntegrableOn e V) : + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume ≤ + ∫ x in V, r x ∂MeasureTheory.volume + + ∫ x in V, e x ∂MeasureTheory.volume := by + have hleft_sum : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = + ∫ x in V, m x ∂MeasureTheory.volume + + ∫ x in V, c x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hm hc] + have hmain_eq : + ∫ x in V, m x ∂MeasureTheory.volume = + ∫ x in V, r x ∂MeasureTheory.volume - + ∫ x in V, c x ∂MeasureTheory.volume := by + linarith + have hneg_int : MeasureTheory.IntegrableOn (fun x => -c x) V := hc.neg + have hhalf_int : MeasureTheory.IntegrableOn (fun x => m x / 2) V := by + simpa [div_eq_mul_inv, mul_comm] using! hm.const_mul ((2 : ℝ)⁻¹) + have hbound_int : MeasureTheory.IntegrableOn (fun x => m x / 2 + e x) V := + hhalf_int.add he + have hmono := MeasureTheory.integral_mono_ae hneg_int hbound_int hpoint + have hneg_eq : + ∫ x in V, -c x ∂MeasureTheory.volume = + -∫ x in V, c x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + have hhalf_eq : + ∫ x in V, m x / 2 ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume := by + calc + ∫ x in V, m x / 2 ∂MeasureTheory.volume = + ∫ x in V, (1 / 2 : ℝ) * m x ∂MeasureTheory.volume := by + congr with x + ring + _ = (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hbound_eq : + ∫ x in V, (m x / 2 + e x) ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume + + ∫ x in V, e x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hhalf_int he] + rw [hhalf_eq] + rw [hneg_eq, hbound_eq] at hmono + nlinarith + +/-- Integral absorption algebra for a cutoff energy identity with a scalar +right-hand side. + +This variant is useful for the direct difference-quotient test, whose forcing +term naturally remains as an ambient integral over the original domain. -/ +theorem integral_half_main_le_scalar_rhs_add_error_of_add_energy_identity + {m c e : Vec d → ℝ} {R : ℝ} + (henergy : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = R) + (hpoint : + (fun x => -c x) ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => m x / 2 + e x) + (hm : MeasureTheory.IntegrableOn m V) + (hc : MeasureTheory.IntegrableOn c V) + (he : MeasureTheory.IntegrableOn e V) : + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume ≤ + R + ∫ x in V, e x ∂MeasureTheory.volume := by + have hleft_sum : + ∫ x in V, (m x + c x) ∂MeasureTheory.volume = + ∫ x in V, m x ∂MeasureTheory.volume + + ∫ x in V, c x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hm hc] + have hmain_eq : + ∫ x in V, m x ∂MeasureTheory.volume = + R - ∫ x in V, c x ∂MeasureTheory.volume := by + linarith + have hneg_int : MeasureTheory.IntegrableOn (fun x => -c x) V := hc.neg + have hhalf_int : MeasureTheory.IntegrableOn (fun x => m x / 2) V := by + simpa [div_eq_mul_inv, mul_comm] using! hm.const_mul ((2 : ℝ)⁻¹) + have hbound_int : MeasureTheory.IntegrableOn (fun x => m x / 2 + e x) V := + hhalf_int.add he + have hmono := MeasureTheory.integral_mono_ae hneg_int hbound_int hpoint + have hneg_eq : + ∫ x in V, -c x ∂MeasureTheory.volume = + -∫ x in V, c x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + have hhalf_eq : + ∫ x in V, m x / 2 ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume := by + calc + ∫ x in V, m x / 2 ∂MeasureTheory.volume = + ∫ x in V, (1 / 2 : ℝ) * m x ∂MeasureTheory.volume := by + congr with x + ring + _ = (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hbound_eq : + ∫ x in V, (m x / 2 + e x) ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in V, m x ∂MeasureTheory.volume + + ∫ x in V, e x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hhalf_int he] + rw [hhalf_eq] + rw [hneg_eq, hbound_eq] at hmono + nlinarith + +/-- Pointwise Young's inequality integrated over a set, in the sign needed for +the direct forcing term. -/ +theorem neg_integral_mul_le_half_integral_sq_add_half_integral_sq_of_memScalarL2 + {F G : Vec d → ℝ} (hF : MemScalarL2 U F) (hG : MemScalarL2 U G) : + -∫ x in U, F x * G x ∂MeasureTheory.volume ≤ + (1 / 2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + have hFG : MeasureTheory.IntegrableOn (fun x => F x * G x) U := + hF.integrable_mul hG + have hneg : MeasureTheory.IntegrableOn (fun x => -(F x * G x)) U := + hFG.neg + have hFsq : MeasureTheory.IntegrableOn (fun x => F x ^ 2) U := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hF.integrable_mul hF + have hGsq : MeasureTheory.IntegrableOn (fun x => G x ^ 2) U := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hG.integrable_mul hG + have hFhalf : MeasureTheory.IntegrableOn (fun x => F x ^ 2 / 2) U := by + simpa [div_eq_mul_inv, mul_comm] using! hFsq.const_mul ((2 : ℝ)⁻¹) + have hGhalf : MeasureTheory.IntegrableOn (fun x => G x ^ 2 / 2) U := by + simpa [div_eq_mul_inv, mul_comm] using! hGsq.const_mul ((2 : ℝ)⁻¹) + have hright : + MeasureTheory.IntegrableOn (fun x => F x ^ 2 / 2 + G x ^ 2 / 2) U := + hFhalf.add hGhalf + have hpoint : + (fun x => -(F x * G x)) ≤ᵐ[MeasureTheory.volume.restrict U] + fun x => F x ^ 2 / 2 + G x ^ 2 / 2 := by + filter_upwards with x + nlinarith [sq_nonneg (F x + G x)] + have hmono := MeasureTheory.integral_mono_ae hneg hright hpoint + have hneg_eq : + ∫ x in U, -(F x * G x) ∂MeasureTheory.volume = + -∫ x in U, F x * G x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + have hFhalf_eq : + ∫ x in U, F x ^ 2 / 2 ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume := by + calc + ∫ x in U, F x ^ 2 / 2 ∂MeasureTheory.volume = + ∫ x in U, (1 / 2 : ℝ) * F x ^ 2 ∂MeasureTheory.volume := by + congr with x + ring + _ = (1 / 2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hGhalf_eq : + ∫ x in U, G x ^ 2 / 2 ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + calc + ∫ x in U, G x ^ 2 / 2 ∂MeasureTheory.volume = + ∫ x in U, (1 / 2 : ℝ) * G x ^ 2 ∂MeasureTheory.volume := by + congr with x + ring + _ = (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hright_eq : + ∫ x in U, F x ^ 2 / 2 + G x ^ 2 / 2 ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hFhalf hGhalf] + rw [hFhalf_eq, hGhalf_eq] + rwa [hneg_eq, hright_eq] at hmono + +/-- A small-test-coefficient Young bound for the direct forcing term. + +This fixed form is tuned for the later Caccioppoli absorption: the forcing +constant is worse, but the test-square coefficient is strictly below the +energy coefficient. -/ +theorem neg_integral_mul_le_two_integral_sq_add_eighth_integral_sq_of_memScalarL2 + {F G : Vec d → ℝ} (hF : MemScalarL2 U F) (hG : MemScalarL2 U G) : + -∫ x in U, F x * G x ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + have hFG : MeasureTheory.IntegrableOn (fun x => F x * G x) U := + hF.integrable_mul hG + have hneg : MeasureTheory.IntegrableOn (fun x => -(F x * G x)) U := + hFG.neg + have hFsq : MeasureTheory.IntegrableOn (fun x => F x ^ 2) U := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hF.integrable_mul hF + have hGsq : MeasureTheory.IntegrableOn (fun x => G x ^ 2) U := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hG.integrable_mul hG + have hFtwo : MeasureTheory.IntegrableOn (fun x => (2 : ℝ) * F x ^ 2) U := + hFsq.const_mul (2 : ℝ) + have hGeighth : MeasureTheory.IntegrableOn (fun x => (1 / 8 : ℝ) * G x ^ 2) U := + hGsq.const_mul (1 / 8 : ℝ) + have hright : + MeasureTheory.IntegrableOn + (fun x => (2 : ℝ) * F x ^ 2 + (1 / 8 : ℝ) * G x ^ 2) U := + hFtwo.add hGeighth + have hpoint : + (fun x => -(F x * G x)) ≤ᵐ[MeasureTheory.volume.restrict U] + fun x => (2 : ℝ) * F x ^ 2 + (1 / 8 : ℝ) * G x ^ 2 := by + filter_upwards with x + nlinarith [sq_nonneg ((4 : ℝ) * F x + G x)] + have hmono := MeasureTheory.integral_mono_ae hneg hright hpoint + have hneg_eq : + ∫ x in U, -(F x * G x) ∂MeasureTheory.volume = + -∫ x in U, F x * G x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + have hFtwo_eq : + ∫ x in U, (2 : ℝ) * F x ^ 2 ∂MeasureTheory.volume = + (2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hGeighth_eq : + ∫ x in U, (1 / 8 : ℝ) * G x ^ 2 ∂MeasureTheory.volume = + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hright_eq : + ∫ x in U, (2 : ℝ) * F x ^ 2 + (1 / 8 : ℝ) * G x ^ 2 + ∂MeasureTheory.volume = + (2 : ℝ) * ∫ x in U, F x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * ∫ x in U, G x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hFtwo hGeighth] + rw [hFtwo_eq, hGeighth_eq] + rwa [hneg_eq, hright_eq] at hmono + +/-- Multiplying an integrable function by a continuous compactly supported +factor preserves integrability on a restricted domain. -/ +theorem integrableOn_mul_left_of_continuous_hasCompactSupport + {φ F : Vec d → ℝ} + (hφ : Continuous φ) (hφ_compact : HasCompactSupport φ) + (hF : MeasureTheory.IntegrableOn F V) : + MeasureTheory.IntegrableOn (fun x => φ x * F x) V := by + have hφ_top : + MeasureTheory.MemLp φ ⊤ (volumeMeasureOn V) := + hφ.memLp_top_of_hasCompactSupport hφ_compact (volumeMeasureOn V) + have hF_int : + MeasureTheory.Integrable F (volumeMeasureOn V) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using hF + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, Pi.mul_apply] using! + hF_int.mul_of_top_right hφ_top + +/-- Move an `L²` function from an interior set to a larger ambient restricted +measure when its pointwise support is contained in the interior set. -/ +theorem memLp_restrict_of_support_subset_of_memLp + {F : Vec d → ℝ} (hV_meas : MeasurableSet V) + (hF_support : Function.support F ⊆ V) + (hF : MeasureTheory.MemLp F 2 (MeasureTheory.volume.restrict V)) : + MeasureTheory.MemLp F 2 (MeasureTheory.volume.restrict U) := by + have hindicator_eq : V.indicator F = F := by + funext x + by_cases hx : x ∈ V + · simp [Set.indicator_of_mem hx] + · have hFx : F x = 0 := by + by_contra hne + exact hx (hF_support hne) + simp [Set.indicator_of_notMem hx, hFx] + have hindicator_mem : + MeasureTheory.MemLp (V.indicator F) 2 (MeasureTheory.volume.restrict U) := by + rw [MeasureTheory.memLp_indicator_iff_restrict hV_meas] + exact hF.mono_measure + (MeasureTheory.Measure.restrict_mono_measure + MeasureTheory.Measure.restrict_le_self V) + simpa [hindicator_eq] using hindicator_mem + +/-- If a function is supported in an interior set `V ⊆ U`, its set integral +over `U` is the same as its set integral over `V`. -/ +theorem integral_subset_of_support_subset + {F : Vec d → ℝ} (hVU : V ⊆ U) (hF_support : Function.support F ⊆ V) : + ∫ x in U, F x ∂MeasureTheory.volume = + ∫ x in V, F x ∂MeasureTheory.volume := by + have hzeroV : ∀ x, x ∉ V → F x = 0 := by + intro x hxV + by_contra hne + exact hxV (hF_support hne) + have hzeroU : ∀ x, x ∉ U → F x = 0 := by + intro x hxU + exact hzeroV x (fun hxV => hxU (hVU hxV)) + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroU, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroV] + +/-- If a function is supported in an interior set `V ⊆ U`, its `eLpNorm` on +the ambient restricted measure agrees with its `eLpNorm` on `V`. -/ +theorem integralLpSeminorm_restrict_eq_restrict_of_support_subset + {E : Type*} [NormedAddCommGroup E] {F : Vec d → E} {p : ℝ≥0∞} + (hVU : V ⊆ U) (hF_support : Function.support F ⊆ V) : + Gagliardo.integralLpSeminorm F p (MeasureTheory.volume.restrict U) = + Gagliardo.integralLpSeminorm F p (MeasureTheory.volume.restrict V) := by + have hsupportU : Function.support F ⊆ U := hF_support.trans hVU + rw [Gagliardo.integralLpSeminorm_restrict_eq_of_support_subset hsupportU] + rw [← Gagliardo.integralLpSeminorm_restrict_eq_of_support_subset hF_support] + + +/-- For globally measurable functions the support restriction identity uses Mathlib’s norm. -/ +theorem eLpNorm_restrict_eq_restrict_of_support_subset + {E : Type*} [NormedAddCommGroup E] {F : Vec d → E} {p : ℝ≥0∞} + (hVU : V ⊆ U) (hF_support : Function.support F ⊆ V) + (hF : MeasureTheory.AEStronglyMeasurable F MeasureTheory.volume) : + MeasureTheory.eLpNorm F p (MeasureTheory.volume.restrict U) = + MeasureTheory.eLpNorm F p (MeasureTheory.volume.restrict V) := by + have hsupportU : Function.support F ⊆ U := hF_support.trans hVU + rw [MeasureTheory.eLpNorm_restrict_eq_of_support_subset hF hsupportU] + rw [← MeasureTheory.eLpNorm_restrict_eq_of_support_subset hF hF_support] + +/-- Translation invariance of global `eLpNorm` for a coordinate shift. -/ +theorem eLpNorm_comp_euclideanCoordShift_of_aestronglyMeasurable + {F : Vec d → ℝ} (hF : MeasureTheory.AEStronglyMeasurable F MeasureTheory.volume) + (step : ℝ) (i : Fin d) (p : ℝ≥0∞) : + MeasureTheory.eLpNorm (fun x => F (euclideanCoordShift step i x)) p + MeasureTheory.volume = + MeasureTheory.eLpNorm F p MeasureTheory.volume := by + let z : Vec d := step • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + have hcomp := + MeasureTheory.eLpNorm_comp_measurePreserving + (μ := MeasureTheory.volume) (ν := MeasureTheory.volume) + (p := p) + (g := F) (f := fun x : Vec d => x + z) hF hmp + simpa [Function.comp, euclideanCoordShift, z] using! hcomp + +/-- Backward coordinate difference quotients are continuous on global `L²`. + +This is the approximation bridge needed for the direct test: if smooth +approximants converge in `L²`, then their backward difference quotients also +converge in `L²`, with the elementary translation bound. -/ +theorem eLpNorm_backwardDifferenceQuotient_sub_le + {F G : Vec d → ℝ} + (hΔ : MeasureTheory.AEStronglyMeasurable + (fun x => F x - G x) MeasureTheory.volume) + (step : ℝ) (i : Fin d) : + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i F x - + euclideanBackwardDifferenceQuotient step i G x) + 2 MeasureTheory.volume ≤ + ‖(step⁻¹ : ℝ)‖ₑ * + (MeasureTheory.eLpNorm (fun x => F x - G x) 2 MeasureTheory.volume + + MeasureTheory.eLpNorm (fun x => F x - G x) 2 MeasureTheory.volume) := by + let Δ : Vec d → ℝ := fun x => F x - G x + have hshift_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => Δ (euclideanCoordShift (-step) i x)) MeasureTheory.volume := by + let z : Vec d := (-step) • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + simpa [Δ, Function.comp, euclideanCoordShift, z] using! + hΔ.comp_measurePreserving hmp + have hshift_norm : + MeasureTheory.eLpNorm (fun x => Δ (euclideanCoordShift (-step) i x)) + 2 MeasureTheory.volume = + MeasureTheory.eLpNorm Δ 2 MeasureTheory.volume := + eLpNorm_comp_euclideanCoordShift_of_aestronglyMeasurable + (F := Δ) (by simpa [Δ] using hΔ) (-step) i 2 + have hpoint : + (fun x => + euclideanBackwardDifferenceQuotient step i F x - + euclideanBackwardDifferenceQuotient step i G x) = + fun x => (step⁻¹ : ℝ) • (Δ x - Δ (euclideanCoordShift (-step) i x)) := by + funext x + simp [Δ, euclideanBackwardDifferenceQuotient, div_eq_mul_inv, smul_eq_mul] + ring + have hscale := + MeasureTheory.eLpNorm_const_smul_le + (μ := MeasureTheory.volume) (p := (2 : ℝ≥0∞)) + (c := (step⁻¹ : ℝ)) + (f := fun x => Δ x - Δ (euclideanCoordShift (-step) i x)) + have htri : + MeasureTheory.eLpNorm + (fun x => Δ x - Δ (euclideanCoordShift (-step) i x)) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm Δ 2 MeasureTheory.volume + + MeasureTheory.eLpNorm (fun x => Δ (euclideanCoordShift (-step) i x)) + 2 MeasureTheory.volume := by + simpa only [sub_eq_add_neg, Pi.add_apply, + MeasureTheory.eLpNorm_neg] using! + MeasureTheory.eLpNorm_add_le + (μ := MeasureTheory.volume) (p := (2 : ℝ≥0∞)) + (f := Δ) (g := -(fun x => Δ (euclideanCoordShift (-step) i x))) + (by norm_num : (1 : ℝ≥0∞) ≤ 2) + calc + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i F x - + euclideanBackwardDifferenceQuotient step i G x) + 2 MeasureTheory.volume = + MeasureTheory.eLpNorm + ((step⁻¹ : ℝ) • + (fun x => Δ x - Δ (euclideanCoordShift (-step) i x))) + 2 MeasureTheory.volume := by + rw [hpoint] + rfl + _ ≤ ‖(step⁻¹ : ℝ)‖ₑ * + MeasureTheory.eLpNorm + (fun x => Δ x - Δ (euclideanCoordShift (-step) i x)) + 2 MeasureTheory.volume := hscale + _ ≤ ‖(step⁻¹ : ℝ)‖ₑ * + (MeasureTheory.eLpNorm Δ 2 MeasureTheory.volume + + MeasureTheory.eLpNorm (fun x => Δ (euclideanCoordShift (-step) i x)) + 2 MeasureTheory.volume) := + mul_le_mul_right htri _ + _ = ‖(step⁻¹ : ℝ)‖ₑ * + (MeasureTheory.eLpNorm (fun x => F x - G x) 2 MeasureTheory.volume + + MeasureTheory.eLpNorm (fun x => F x - G x) 2 MeasureTheory.volume) := by + rw [hshift_norm] + +/-- The difference of two backward difference quotients is globally +a.e.-strongly-measurable when the underlying scalar difference is. -/ +theorem aestronglyMeasurable_backwardDifferenceQuotient_sub_of_aestronglyMeasurable + {F G : Vec d → ℝ} + (hΔ : MeasureTheory.AEStronglyMeasurable + (fun x => F x - G x) MeasureTheory.volume) + (step : ℝ) (i : Fin d) : + MeasureTheory.AEStronglyMeasurable + (fun x => + euclideanBackwardDifferenceQuotient step i F x - + euclideanBackwardDifferenceQuotient step i G x) + MeasureTheory.volume := by + let Δ : Vec d → ℝ := fun x => F x - G x + have hshift_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => Δ (euclideanCoordShift (-step) i x)) MeasureTheory.volume := by + let z : Vec d := (-step) • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + simpa [Δ, Function.comp, euclideanCoordShift, z] using! + hΔ.comp_measurePreserving hmp + have hpoint : + (fun x => + euclideanBackwardDifferenceQuotient step i F x - + euclideanBackwardDifferenceQuotient step i G x) = + (step⁻¹ : ℝ) • + (fun x => Δ x - Δ (euclideanCoordShift (-step) i x)) := by + funext x + simp [Δ, euclideanBackwardDifferenceQuotient, div_eq_mul_inv, smul_eq_mul] + ring + rw [hpoint] + exact (hΔ.sub hshift_meas).const_smul (step⁻¹ : ℝ) + +/-- Convergence in global `L²` is preserved by a fixed backward coordinate +difference quotient, with the elementary translation bound above. -/ +theorem tendsto_eLpNorm_backwardDifferenceQuotient_sub_zero + {F : ℕ → Vec d → ℝ} {G : Vec d → ℝ} + (hΔ : ∀ n : ℕ, MeasureTheory.AEStronglyMeasurable + (fun x => F n x - G x) MeasureTheory.volume) + (hΔ_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => F n x - G x) 2 MeasureTheory.volume) + Filter.atTop (nhds 0)) + (step : ℝ) (i : Fin d) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i (F n) x - + euclideanBackwardDifferenceQuotient step i G x) + 2 MeasureTheory.volume) + Filter.atTop (nhds 0) := by + let A : ℕ → ℝ≥0∞ := fun n => + MeasureTheory.eLpNorm (fun x => F n x - G x) 2 MeasureTheory.volume + have hsum : + Filter.Tendsto (fun n => A n + A n) Filter.atTop (nhds 0) := by + simpa [A, zero_add] using hΔ_tendsto.add hΔ_tendsto + have hconst_ne_top : ‖(step⁻¹ : ℝ)‖ₑ ≠ (⊤ : ℝ≥0∞) := by + finiteness + have hupper : ∀ n : ℕ, + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient step i (F n) x - + euclideanBackwardDifferenceQuotient step i G x) + 2 MeasureTheory.volume ≤ + ‖(step⁻¹ : ℝ)‖ₑ * (A n + A n) := by + intro n + simpa [A] using + eLpNorm_backwardDifferenceQuotient_sub_le (F := F n) (G := G) + (hΔ n) step i + have hscaled : + Filter.Tendsto + (fun n => ‖(step⁻¹ : ℝ)‖ₑ * (A n + A n)) + Filter.atTop (nhds 0) := by + simpa using ENNReal.Tendsto.const_mul hsum (Or.inr hconst_ne_top) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled (fun n => zero_le) hupper + +/-- If a function is supported in `U`, then its global `L²` norm is the same +as its `L²` norm over `U`. This is just mathlib's support-restriction lemma +with the equality oriented for H¹₀ approximation limits. -/ +theorem integralLpSeminorm_eq_restrict_of_support_subset + {F : Vec d → ℝ} (hF_support : Function.support F ⊆ U) : + Gagliardo.integralLpSeminorm F 2 MeasureTheory.volume = + Gagliardo.integralLpSeminorm F 2 (MeasureTheory.volume.restrict U) := + (Gagliardo.integralLpSeminorm_restrict_eq_of_support_subset hF_support).symm + + +/-- The support restriction identity for Mathlib’s norm of a globally measurable function. -/ +theorem eLpNorm_eq_restrict_of_support_subset + {F : Vec d → ℝ} (hF_support : Function.support F ⊆ U) + (hF : MeasureTheory.AEStronglyMeasurable F MeasureTheory.volume) : + MeasureTheory.eLpNorm F 2 MeasureTheory.volume = + MeasureTheory.eLpNorm F 2 (MeasureTheory.volume.restrict U) := + (MeasureTheory.eLpNorm_restrict_eq_of_support_subset hF hF_support).symm + +/-- A restricted a.e.-strongly-measurable scalar function with genuine support +in `U` is globally a.e.-strongly-measurable after extension by zero. -/ +theorem aestronglyMeasurable_of_restrict_of_support_subset + {F : Vec d → ℝ} (hU_meas : MeasurableSet U) + (hF_restrict : MeasureTheory.AEStronglyMeasurable F + (MeasureTheory.volume.restrict U)) + (hF_support : Function.support F ⊆ U) : + MeasureTheory.AEStronglyMeasurable F MeasureTheory.volume := by + have hindicator : F = Set.indicator U F := by + funext x + by_cases hx : x ∈ U + · simp [Set.indicator_of_mem hx] + · have hFx : F x = 0 := by + exact Function.support_subset_iff'.mp hF_support x hx + simp [Set.indicator_of_notMem hx, hFx] + rw [hindicator] + exact (aestronglyMeasurable_indicator_iff hU_meas).2 hF_restrict + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/FaceVanishCollar.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/FaceVanishCollar.lean new file mode 100644 index 0000000000..7bf2af0716 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/FaceVanishCollar.lean @@ -0,0 +1,897 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CutoffBoundaryError +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import Mathlib.Analysis.Calculus.MeanValue + +/-! # Face Vanish Collar -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +/-- Projection onto the lower `i`-normal face, changing only coordinate `i`. -/ +def cubeLowerFaceProjection {d : ℕ} (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + Vec d := + Function.update x i (cubeLowerFaceCoord Q i) + +/-- Projection onto the upper `i`-normal face, changing only coordinate `i`. -/ +def cubeUpperFaceProjection {d : ℕ} (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + Vec d := + Function.update x i (cubeUpperFaceCoord Q i) + +theorem cubeLowerFaceCoord_eq_cubeCenter_sub_cubeRadius {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeLowerFaceCoord Q i = cubeCenter Q i - cubeRadius Q := by + simp [cubeLowerFaceCoord, cubeCenter, cubeRadius] + ring_nf + +theorem cubeUpperFaceCoord_eq_cubeCenter_add_cubeRadius {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeUpperFaceCoord Q i = cubeCenter Q i + cubeRadius Q := by + simp [cubeUpperFaceCoord, cubeCenter, cubeRadius] + ring_nf + +private theorem norm_sub_update_coord_le_abs_sub {d : ℕ} + (x : Vec d) (i : Fin d) (a : ℝ) : + ‖x - Function.update x i a‖ ≤ |x i - a| := by + refine (pi_norm_le_iff_of_nonneg (abs_nonneg _)).2 ?_ + intro j + by_cases hji : j = i + · subst hji + simp [Function.update, Real.norm_eq_abs] + · simp [Function.update, hji] + +theorem norm_sub_cubeLowerFaceProjection_le {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖x - cubeLowerFaceProjection Q i x‖ ≤ |x i - cubeLowerFaceCoord Q i| := + norm_sub_update_coord_le_abs_sub x i (cubeLowerFaceCoord Q i) + +theorem norm_sub_cubeUpperFaceProjection_le {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + ‖x - cubeUpperFaceProjection Q i x‖ ≤ |x i - cubeUpperFaceCoord Q i| := + norm_sub_update_coord_le_abs_sub x i (cubeUpperFaceCoord Q i) + +theorem norm_sub_le_mul_norm_sub_of_fderiv_bound {d : ℕ} + {ψ : Vec d → ℝ} (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) {L : ℝ} + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) (x y : Vec d) : + ‖ψ x - ψ y‖ ≤ L * ‖x - y‖ := by + simpa using + (Convex.norm_image_sub_le_of_norm_fderiv_le + (𝕜 := ℝ) (f := ψ) (s := Set.univ) (C := L) (x := y) (y := x) + (fun z _ => hψ.differentiable (by simp) z) + (fun z _ => hbound z) convex_univ trivial trivial) + +theorem norm_le_mul_abs_sub_lowerFace_of_face_zero {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) {L : ℝ} (hL : 0 ≤ L) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (x : Vec d) (hzero : ψ (cubeLowerFaceProjection Q i x) = 0) : + ‖ψ x‖ ≤ L * |x i - cubeLowerFaceCoord Q i| := by + calc + ‖ψ x‖ = ‖ψ x - ψ (cubeLowerFaceProjection Q i x)‖ := by + rw [hzero, sub_zero] + _ ≤ L * ‖x - cubeLowerFaceProjection Q i x‖ := + norm_sub_le_mul_norm_sub_of_fderiv_bound hψ hbound x (cubeLowerFaceProjection Q i x) + _ ≤ L * |x i - cubeLowerFaceCoord Q i| := + mul_le_mul_of_nonneg_left (norm_sub_cubeLowerFaceProjection_le Q i x) hL + +theorem norm_le_mul_abs_sub_upperFace_of_face_zero {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) {L : ℝ} (hL : 0 ≤ L) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (x : Vec d) (hzero : ψ (cubeUpperFaceProjection Q i x) = 0) : + ‖ψ x‖ ≤ L * |x i - cubeUpperFaceCoord Q i| := by + calc + ‖ψ x‖ = ‖ψ x - ψ (cubeUpperFaceProjection Q i x)‖ := by + rw [hzero, sub_zero] + _ ≤ L * ‖x - cubeUpperFaceProjection Q i x‖ := + norm_sub_le_mul_norm_sub_of_fderiv_bound hψ hbound x (cubeUpperFaceProjection Q i x) + _ ≤ L * |x i - cubeUpperFaceCoord Q i| := + mul_le_mul_of_nonneg_left (norm_sub_cubeUpperFaceProjection_le Q i x) hL + +/-- In the inner coordinate collar, a point that still lies in the full cube is +within `(1 - ρ₁) * radius` of one of the two `i`-normal faces. -/ +theorem face_distance_le_of_mem_scaledClosedCubeSet_coordInnerCollar {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₂_le_one : ρ₂ ≤ 1) + (i : Fin d) {x : Vec d} + (hxouter : x ∈ scaledClosedCubeSet Q ρ₂) + (hxcollar : x ∈ cubeCoordInnerCollar Q ρ₁ i) : + |x i - cubeLowerFaceCoord Q i| ≤ (1 - ρ₁) * cubeRadius Q ∨ + |x i - cubeUpperFaceCoord Q i| ≤ (1 - ρ₁) * cubeRadius Q := by + let t : ℝ := x i - cubeCenter Q i + have hrad_pos : 0 < cubeRadius Q := cubeRadius_pos Q + have hrad_nonneg : 0 ≤ cubeRadius Q := le_of_lt hrad_pos + have houter_abs : |t| ≤ ρ₂ * cubeRadius Q := by + simpa [t] using hxouter i + have hcollar_abs : ρ₁ * cubeRadius Q ≤ |t| := by + simpa [cubeCoordInnerCollar, t] using hxcollar + have hρ₂rad_le : ρ₂ * cubeRadius Q ≤ cubeRadius Q := by + simpa using mul_le_mul_of_nonneg_right hρ₂_le_one hrad_nonneg + have ht_le_rad : t ≤ cubeRadius Q := by + exact (le_abs_self t).trans (houter_abs.trans hρ₂rad_le) + have hneg_t_le_rad : -t ≤ cubeRadius Q := by + exact (neg_le_abs t).trans (houter_abs.trans hρ₂rad_le) + by_cases ht_nonneg : 0 ≤ t + · right + have hρ_le_t : ρ₁ * cubeRadius Q ≤ t := by + simpa [abs_of_nonneg ht_nonneg] using hcollar_abs + have hnonpos : + x i - cubeUpperFaceCoord Q i ≤ 0 := by + rw [cubeUpperFaceCoord_eq_cubeCenter_add_cubeRadius] + have ht_eq : x i - cubeCenter Q i = t := rfl + linarith + calc + |x i - cubeUpperFaceCoord Q i| + = cubeUpperFaceCoord Q i - x i := by + rw [abs_of_nonpos hnonpos] + ring + _ = cubeRadius Q - t := by + rw [cubeUpperFaceCoord_eq_cubeCenter_add_cubeRadius] + ring + _ ≤ (1 - ρ₁) * cubeRadius Q := by + nlinarith + · left + have ht_neg : t < 0 := lt_of_not_ge ht_nonneg + have hρ_le_neg_t : ρ₁ * cubeRadius Q ≤ -t := by + simpa [abs_of_neg ht_neg] using hcollar_abs + have hnonneg : + 0 ≤ x i - cubeLowerFaceCoord Q i := by + rw [cubeLowerFaceCoord_eq_cubeCenter_sub_cubeRadius] + have ht_eq : x i - cubeCenter Q i = t := rfl + linarith + calc + |x i - cubeLowerFaceCoord Q i| + = x i - cubeLowerFaceCoord Q i := by + rw [abs_of_nonneg hnonneg] + _ = cubeRadius Q + t := by + rw [cubeLowerFaceCoord_eq_cubeCenter_sub_cubeRadius] + ring + _ ≤ (1 - ρ₁) * cubeRadius Q := by + nlinarith + +/-- Smooth functions vanishing on the two `i`-normal face projections are small +on the coordinate collar, with the expected distance-to-face factor. -/ +theorem norm_le_of_face_zero_on_coordInnerCollar {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ L : ℝ} (hρ₂_le_one : ρ₂ ≤ 1) + (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hL : 0 ≤ L) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) + {x : Vec d} (hxouter : x ∈ scaledClosedCubeSet Q ρ₂) + (hxcollar : x ∈ cubeCoordInnerCollar Q ρ₁ i) : + ‖ψ x‖ ≤ L * ((1 - ρ₁) * cubeRadius Q) := by + rcases face_distance_le_of_mem_scaledClosedCubeSet_coordInnerCollar + Q hρ₂_le_one i hxouter hxcollar with hlower | hupper + · exact (norm_le_mul_abs_sub_lowerFace_of_face_zero Q i hψ hL hbound + x (hlower_zero x)).trans (mul_le_mul_of_nonneg_left hlower hL) + · exact (norm_le_mul_abs_sub_upperFace_of_face_zero Q i hψ hL hbound + x (hupper_zero x)).trans (mul_le_mul_of_nonneg_left hupper hL) + +/-- Inside the open cube, a coordinate inner collar is contained in an ordinary +cube boundary layer. The boundary layer thickness is intentionally twice the +sharp thickness; this avoids half-open face bookkeeping and is still +asymptotically sharp enough for the cutoff limit. -/ +theorem cubeCoordInnerCollar_inter_openCubeSet_subset_cubeBoundaryLayer {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ_lt_one : ρ < 1) (i : Fin d) : + cubeCoordInnerCollar Q ρ i ∩ openCubeSet Q ⊆ cubeBoundaryLayer Q (1 - ρ) := by + intro x hx + refine ⟨openCubeSet_subset_cubeSet Q hx.2, ?_⟩ + intro hxshr + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hshr_i := hxshr i + have hlow : + -(ρ * cubeRadius Q) < x i - cubeCenter Q i := by + dsimp [cubeShrunkSet, cubeCenter, cubeRadius] at hshr_i ⊢ + nlinarith + have hhigh : + x i - cubeCenter Q i < ρ * cubeRadius Q := by + dsimp [cubeShrunkSet, cubeCenter, cubeRadius] at hshr_i ⊢ + nlinarith + have habs : |x i - cubeCenter Q i| < ρ * cubeRadius Q := + abs_lt.mpr ⟨hlow, hhigh⟩ + exact not_le_of_gt habs hx.1 + +theorem volumeMeasureOn_openCubeSet_cubeCoordInnerCollar_le_cubeBoundaryLayer {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ_lt_one : ρ < 1) (i : Fin d) : + volumeMeasureOn (openCubeSet Q) (cubeCoordInnerCollar Q ρ i) ≤ + MeasureTheory.volume (cubeBoundaryLayer Q (1 - ρ)) := by + rw [volumeMeasureOn, MeasureTheory.Measure.restrict_apply + (measurableSet_cubeCoordInnerCollar Q ρ i)] + exact MeasureTheory.measure_mono + (cubeCoordInnerCollar_inter_openCubeSet_subset_cubeBoundaryLayer Q hρ_lt_one i) + +private theorem norm_basisVec {d : ℕ} (i : Fin d) : ‖basisVec i‖ = (1 : ℝ) := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases hji : j = i + · subst hji + simp [basisVec] + · simp [basisVec, hji] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +private theorem quantitativeCubeCutoffGradientConst_nonneg (d : ℕ) : + 0 ≤ quantitativeCubeCutoffGradientConst d := by + dsimp [quantitativeCubeCutoffGradientConst] + nlinarith [(Nat.cast_nonneg d : (0 : ℝ) ≤ (d : ℝ)), + smoothTransitionProfile.derivBound_nonneg] + +/-- Face-vanishing version of the cutoff derivative error. The derivative of +the cutoff supplies both localizations: it is supported in the coordinate +collar and in the outer cutoff cube. -/ +theorem norm_canonicalFun_coordDeriv_mul_le_of_face_zero {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ L A : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (hρ₂_le_one : ρ₂ ≤ 1) + (hL : 0 ≤ L) (hA_nonneg : 0 ≤ A) + (hA_width : 1 - ρ₁ ≤ A * (ρ₂ - ρ₁)) + (i : Fin d) (ψ : Vec d → ℝ) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) : + ∀ x : Vec d, + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x‖ ≤ + (L * A) * quantitativeCubeCutoffGradientConst d := by + intro x + by_cases hderiv_zero : + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) = 0 + · simp [hderiv_zero, + mul_nonneg (mul_nonneg hL hA_nonneg) (quantitativeCubeCutoffGradientConst_nonneg d)] + · have hx_collar : + x ∈ cubeCoordInnerCollar Q ρ₁ i := + support_canonicalFun_fderiv_apply_basisVec_subset_cubeCoordInnerCollar + Q hρ₁ hρ₁₂ i hderiv_zero + have hx_outer : + x ∈ scaledClosedCubeSet Q ρ₂ := + QuantitativeCubeCutoff.support_fderiv_canonicalFun_apply_basisVec_subset_scaledClosedCubeSet + Q hρ₁ hρ₁₂ i hderiv_zero + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := + mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + have hgap_nonneg : 0 ≤ (ρ₂ - ρ₁) * cubeRadius Q := le_of_lt hgap_pos + have hconst_nonneg : 0 ≤ quantitativeCubeCutoffGradientConst d := + quantitativeCubeCutoffGradientConst_nonneg d + have hψ_face : + ‖ψ x‖ ≤ L * ((1 - ρ₁) * cubeRadius Q) := + norm_le_of_face_zero_on_coordInnerCollar + Q hρ₂_le_one i hψ hL hbound hlower_zero hupper_zero hx_outer hx_collar + have hwidth : + (1 - ρ₁) * cubeRadius Q ≤ + (A * (ρ₂ - ρ₁)) * cubeRadius Q := + mul_le_mul_of_nonneg_right hA_width (cubeRadius_nonneg Q) + have hψ_bound : + ‖ψ x‖ ≤ (L * A) * ((ρ₂ - ρ₁) * cubeRadius Q) := by + calc + ‖ψ x‖ ≤ L * ((1 - ρ₁) * cubeRadius Q) := hψ_face + _ ≤ L * ((A * (ρ₂ - ρ₁)) * cubeRadius Q) := + mul_le_mul_of_nonneg_left hwidth hL + _ = (L * A) * ((ρ₂ - ρ₁) * cubeRadius Q) := by ring + have hcoord : + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ ≤ + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + calc + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ + ≤ ‖fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x‖ * + ‖basisVec i‖ := by + exact (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x).le_opNorm + (basisVec i) + _ = ‖fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x‖ := by + simp [norm_basisVec] + _ ≤ quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + let η : QuantitativeCubeCutoff Q ρ₁ ρ₂ := + QuantitativeCubeCutoff.canonical Q ρ₁ ρ₂ hρ₁ hρ₁₂ + simpa [η, QuantitativeCubeCutoff.canonical] using η.gradient_bound x + calc + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x‖ + = + ‖(fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i)‖ * + ‖ψ x‖ := norm_mul _ _ + _ ≤ + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) * + ((L * A) * ((ρ₂ - ρ₁) * cubeRadius Q)) := by + exact mul_le_mul hcoord hψ_bound + (norm_nonneg (ψ x)) + (div_nonneg hconst_nonneg hgap_nonneg) + _ = (L * A) * quantitativeCubeCutoffGradientConst d := by + rw [show + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) * + ((L * A) * ((ρ₂ - ρ₁) * cubeRadius Q)) = + (L * A) * ((quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) * ((ρ₂ - ρ₁) * cubeRadius Q)) by + ring] + rw [div_mul_cancel₀ _ hgap_pos.ne'] + +/-- `L²` form of the face-vanishing cutoff derivative error. -/ +theorem eLpNorm_canonicalFun_coordDeriv_mul_le_of_face_zero {d : ℕ} + {U : Set (Vec d)} (Q : TriadicCube d) {ρ₁ ρ₂ L A : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (hρ₂_le_one : ρ₂ ≤ 1) + (hL : 0 ≤ L) (hA_nonneg : 0 ≤ A) + (hA_width : 1 - ρ₁ ≤ A * (ρ₂ - ρ₁)) + (i : Fin d) (ψ : Vec d → ℝ) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) : + MeasureTheory.eLpNorm + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x) + 2 (volumeMeasureOn U) ≤ + ENNReal.ofReal ((L * A) * quantitativeCubeCutoffGradientConst d) * + (volumeMeasureOn U (cubeCoordInnerCollar Q ρ₁ i)) ^ + (1 / (2 : ENNReal).toReal) := by + let F : Vec d → ℝ := + fun x => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q ρ₁ ρ₂) x) (basisVec i) * + ψ x + have hC_nonneg : 0 ≤ (L * A) * quantitativeCubeCutoffGradientConst d := + mul_nonneg (mul_nonneg hL hA_nonneg) (quantitativeCubeCutoffGradientConst_nonneg d) + have hdist : ∀ x : Vec d, dist (F x) 0 ≤ + (L * A) * quantitativeCubeCutoffGradientConst d := by + intro x + simpa [F, dist_eq_norm] using + norm_canonicalFun_coordDeriv_mul_le_of_face_zero + Q hρ₁ hρ₁₂ hρ₂_le_one hL hA_nonneg hA_width + i ψ hψ hbound hlower_zero hupper_zero x + have hsupport : + Function.support F ⊆ cubeCoordInnerCollar Q ρ₁ i := by + simpa [F] using + support_canonicalFun_coordDeriv_mul_subset_cubeCoordInnerCollar + Q hρ₁ hρ₁₂ i ψ + have hzero_support : + Function.support (0 : Vec d → ℝ) ⊆ cubeCoordInnerCollar Q ρ₁ i := by + simp + have hmain := + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (s := cubeCoordInnerCollar Q ρ₁ i) + (by norm_num : (2 : ENNReal) ≠ ∞) + (measurableSet_cubeCoordInnerCollar Q ρ₁ i) + hC_nonneg hdist hsupport hzero_support + have hsub : F - (fun _ : Vec d => (0 : ℝ)) = F := by + funext x + simp + rw [hsub] at hmain + simpa [F] using hmain + +/-- If the active coordinate collar has vanishing measure and the cutoff +annuli have uniformly bounded aspect ratio, then the cutoff-gradient face error +goes to zero in `L²`. -/ +theorem tendsto_eLpNorm_canonicalFun_coordDeriv_mul_of_face_zero_of_collar_measure + {d : ℕ} {U : Set (Vec d)} (Q : TriadicCube d) + {ρ₁ ρ₂ : ℕ → ℝ} {L A : ℝ} + (hρ₁ : ∀ n, 0 < ρ₁ n) (hρ₁₂ : ∀ n, ρ₁ n < ρ₂ n) + (hρ₂_le_one : ∀ n, ρ₂ n ≤ 1) + (hL : 0 ≤ L) (hA_nonneg : 0 ≤ A) + (hA_width : ∀ n, 1 - ρ₁ n ≤ A * (ρ₂ n - ρ₁ n)) + (i : Fin d) (ψ : Vec d → ℝ) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) + (hcollar : + Filter.Tendsto + (fun n => volumeMeasureOn U (cubeCoordInnerCollar Q (ρ₁ n) i)) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q (ρ₁ n) (ρ₂ n)) x) + (basisVec i) * ψ x) + 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + let C : ℝ≥0∞ := ENNReal.ofReal ((L * A) * quantitativeCubeCutoffGradientConst d) + let pexp : ℝ := 1 / (2 : ENNReal).toReal + have hpow : + Filter.Tendsto + (fun n => (volumeMeasureOn U (cubeCoordInnerCollar Q (ρ₁ n) i)) ^ pexp) + Filter.atTop (nhds 0) := by + have h := hcollar.ennrpow_const pexp + have hpexp_pos : 0 < pexp := by + dsimp [pexp] + norm_num + simpa [pexp, ENNReal.zero_rpow_of_pos hpexp_pos] using h + have hrhs : + Filter.Tendsto + (fun n => C * + (volumeMeasureOn U (cubeCoordInnerCollar Q (ρ₁ n) i)) ^ pexp) + Filter.atTop (nhds 0) := by + have hC_ne_top : C ≠ ⊤ := by + simp [C] + have h := ENNReal.Tendsto.const_mul (a := C) hpow (Or.inr hC_ne_top) + simpa [C] using h + have hle : + ∀ n, + MeasureTheory.eLpNorm + (fun x : Vec d => + (fderiv ℝ (QuantitativeCubeCutoff.canonicalFun Q (ρ₁ n) (ρ₂ n)) x) + (basisVec i) * ψ x) + 2 (volumeMeasureOn U) ≤ + C * (volumeMeasureOn U (cubeCoordInnerCollar Q (ρ₁ n) i)) ^ pexp := by + intro n + simpa [C, pexp] using + eLpNorm_canonicalFun_coordDeriv_mul_le_of_face_zero + (U := U) Q (hρ₁ n) (hρ₁₂ n) (hρ₂_le_one n) + hL hA_nonneg (hA_width n) i ψ hψ hbound hlower_zero hupper_zero + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun _ => bot_le) hle + +/-- A concrete inner radius schedule approaching the cube boundary. The +denominator starts at `5` only to keep the associated boundary-layer thickness +at most `1/2` for every index. -/ +def faceCutoffInnerRadius (n : ℕ) : ℝ := + 1 - 2 / ((n : ℝ) + 5) + +/-- The matching outer radius schedule. -/ +def faceCutoffOuterRadius (n : ℕ) : ℝ := + 1 - 1 / ((n : ℝ) + 5) + +theorem faceCutoffInnerRadius_pos (n : ℕ) : + 0 < faceCutoffInnerRadius n := by + have hden : 0 < (n : ℝ) + 5 := by positivity + have hn : (0 : ℝ) ≤ n := Nat.cast_nonneg n + dsimp [faceCutoffInnerRadius] + field_simp [hden.ne'] + nlinarith + +theorem faceCutoffInnerRadius_lt_outer (n : ℕ) : + faceCutoffInnerRadius n < faceCutoffOuterRadius n := by + have hden : 0 < (n : ℝ) + 5 := by positivity + dsimp [faceCutoffInnerRadius, faceCutoffOuterRadius] + field_simp [hden.ne'] + linarith + +theorem faceCutoffOuterRadius_le_one (n : ℕ) : + faceCutoffOuterRadius n ≤ 1 := by + have hden : 0 < (n : ℝ) + 5 := by positivity + dsimp [faceCutoffOuterRadius] + have hnonneg : 0 ≤ 1 / ((n : ℝ) + 5) := by positivity + linarith + +theorem faceCutoffOuterRadius_nonneg (n : ℕ) : + 0 ≤ faceCutoffOuterRadius n := + le_of_lt (lt_trans (faceCutoffInnerRadius_pos n) (faceCutoffInnerRadius_lt_outer n)) + +theorem faceCutoffOuterRadius_lt_one (n : ℕ) : + faceCutoffOuterRadius n < 1 := by + have hden : 0 < (n : ℝ) + 5 := by positivity + dsimp [faceCutoffOuterRadius] + have hpos : 0 < 1 / ((n : ℝ) + 5) := by positivity + linarith + +theorem faceCutoffInnerOuter_width_control (n : ℕ) : + 1 - faceCutoffInnerRadius n ≤ + 2 * (faceCutoffOuterRadius n - faceCutoffInnerRadius n) := by + dsimp [faceCutoffInnerRadius, faceCutoffOuterRadius] + ring_nf + exact le_rfl + +theorem faceCutoffInnerRadius_lt_one (n : ℕ) : + faceCutoffInnerRadius n < 1 := by + have hden : 0 < (n : ℝ) + 5 := by positivity + dsimp [faceCutoffInnerRadius] + have hpos : 0 < 2 / ((n : ℝ) + 5) := by positivity + linarith + +theorem tendsto_faceCutoffInnerRadius_one : + Filter.Tendsto faceCutoffInnerRadius Filter.atTop (nhds 1) := by + have hdenCast : + Filter.Tendsto (fun n : ℕ => (((n + 5 : ℕ) : ℝ))) + Filter.atTop Filter.atTop := + (tendsto_natCast_atTop_atTop (R := ℝ)).comp + (Filter.tendsto_add_atTop_nat 5) + have hden : + Filter.Tendsto (fun n : ℕ => (n : ℝ) + 5) + Filter.atTop Filter.atTop := by + convert hdenCast using 1 + ext n + simp [Nat.cast_add] + have hinv : Filter.Tendsto (fun n : ℕ => ((n : ℝ) + 5)⁻¹) + Filter.atTop (nhds 0) := + tendsto_inv_atTop_zero.comp hden + have hfrac : Filter.Tendsto (fun n : ℕ => 2 / ((n : ℝ) + 5)) + Filter.atTop (nhds 0) := by + simpa [div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using + (tendsto_const_nhds.mul hinv : Filter.Tendsto + (fun n : ℕ => (2 : ℝ) * ((n : ℝ) + 5)⁻¹) Filter.atTop (nhds (2 * 0))) + simpa [faceCutoffInnerRadius] using! tendsto_const_nhds.sub hfrac + +/-- The canonical face-cutoff sequence used to trim smooth functions away from +the cube boundary while letting the inner cube fill the whole cube. -/ +noncomputable def faceCutoff {d : ℕ} (Q : TriadicCube d) (n : ℕ) : + QuantitativeCubeCutoff Q (faceCutoffInnerRadius n) (faceCutoffOuterRadius n) := + QuantitativeCubeCutoff.canonical Q + (faceCutoffInnerRadius n) (faceCutoffOuterRadius n) + (faceCutoffInnerRadius_pos n) (faceCutoffInnerRadius_lt_outer n) + +/-- The open triadic cube is contained in the closed concentric cube with +relative radius `1`. -/ +theorem openCubeSet_subset_scaledClosedCubeSet_one {d : ℕ} (Q : TriadicCube d) : + openCubeSet Q ⊆ scaledClosedCubeSet Q 1 := by + intro x hx i + have hxball : x ∈ Metric.ball (cubeCenter Q) (cubeRadius Q) := by + simpa [ball_cubeCenter_eq_openCubeSet Q] using hx + have hcoord : + ‖(x - cubeCenter Q) i‖ ≤ ‖x - cubeCenter Q‖ := + norm_le_pi_norm (x - cubeCenter Q) i + calc + |x i - cubeCenter Q i| = ‖(x - cubeCenter Q) i‖ := by + simp [Real.norm_eq_abs] + _ ≤ ‖x - cubeCenter Q‖ := hcoord + _ = dist x (cubeCenter Q) := by simp [dist_eq_norm] + _ ≤ 1 * cubeRadius Q := by + simpa using le_of_lt (Metric.mem_ball.mp hxball) + +/-- A fixed compactly supported cutoff that is identically `1` on the open +triadic cube. -/ +noncomputable def faceCompactifyingCutoff {d : ℕ} (Q : TriadicCube d) : + QuantitativeCubeCutoff Q 1 2 := + QuantitativeCubeCutoff.canonical Q 1 2 (by norm_num) (by norm_num) + +theorem faceCompactifyingCutoff_eq_one_on_openCubeSet {d : ℕ} + (Q : TriadicCube d) {x : Vec d} (hx : x ∈ openCubeSet Q) : + faceCompactifyingCutoff Q x = 1 := + (faceCompactifyingCutoff Q).eq_one_on_inner x + (openCubeSet_subset_scaledClosedCubeSet_one Q hx) + +private theorem tendsto_faceBoundaryLayer_volume_zero {d : ℕ} + (Q : TriadicCube d) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.volume (cubeBoundaryLayer Q (2 / ((n : ℝ) + 5)))) + Filter.atTop (nhds 0) := by + let t : ℕ → ℝ := fun n => 2 / ((n : ℝ) + 5) + have ht_nonneg : ∀ n, 0 ≤ t n := by + intro n + dsimp [t] + positivity + have ht_half : ∀ n, t n ≤ (1 / 2 : ℝ) := by + intro n + have hden : 0 < (n : ℝ) + 5 := by positivity + have hn : (0 : ℝ) ≤ n := Nat.cast_nonneg n + dsimp [t] + rw [div_le_iff₀ hden] + nlinarith + have hfinite : + ∀ n, MeasureTheory.volume (cubeBoundaryLayer Q (t n)) ≠ ⊤ := by + intro n + exact MeasureTheory.measure_ne_top_of_subset + (cubeBoundaryLayer_subset_cubeSet Q (t n)) (volume_cubeSet_lt_top Q).ne + have htoReal : + ∀ n, + (MeasureTheory.volume (cubeBoundaryLayer Q (t n))).toReal = + cubeVolume Q - ((1 - 2 * t n) * cubeScaleFactor Q) ^ d := by + intro n + exact volume_cubeBoundaryLayer_toReal_of_nonneg_le_half + Q (ht_nonneg n) (ht_half n) + have hdenCast : + Filter.Tendsto (fun n : ℕ => (((n + 5 : ℕ) : ℝ))) + Filter.atTop Filter.atTop := + (tendsto_natCast_atTop_atTop (R := ℝ)).comp + (Filter.tendsto_add_atTop_nat 5) + have hden : + Filter.Tendsto (fun n : ℕ => (n : ℝ) + 5) + Filter.atTop Filter.atTop := by + convert hdenCast using 1 + ext n + simp [Nat.cast_add] + have ht_tendsto : Filter.Tendsto t Filter.atTop (nhds 0) := by + have hinv : Filter.Tendsto (fun n : ℕ => ((n : ℝ) + 5)⁻¹) + Filter.atTop (nhds 0) := + tendsto_inv_atTop_zero.comp hden + simpa [t, div_eq_mul_inv, mul_comm, mul_left_comm, mul_assoc] using + (tendsto_const_nhds.mul hinv : Filter.Tendsto + (fun n : ℕ => (2 : ℝ) * ((n : ℝ) + 5)⁻¹) Filter.atTop (nhds (2 * 0))) + have hfactor : + Filter.Tendsto (fun n : ℕ => 1 - 2 * t n) Filter.atTop (nhds 1) := by + have htwo_t : Filter.Tendsto (fun n : ℕ => 2 * t n) Filter.atTop (nhds 0) := by + simpa using ht_tendsto.const_mul 2 + simpa using tendsto_const_nhds.sub htwo_t + have hscaled : + Filter.Tendsto + (fun n : ℕ => (1 - 2 * t n) * cubeScaleFactor Q) + Filter.atTop (nhds (cubeScaleFactor Q)) := by + simpa using hfactor.mul tendsto_const_nhds + have hreal_expr : + Filter.Tendsto + (fun n : ℕ => cubeVolume Q - + ((1 - 2 * t n) * cubeScaleFactor Q) ^ d) + Filter.atTop (nhds 0) := by + have hpow := hscaled.pow d + have hconst : + Filter.Tendsto (fun _ : ℕ => cubeVolume Q) + Filter.atTop (nhds (cubeVolume Q)) := + tendsto_const_nhds + have hsub := hconst.sub hpow + simpa [cubeVolume_eq_scaleFactor_pow] using hsub + have hreal : + Filter.Tendsto + (fun n : ℕ => (MeasureTheory.volume (cubeBoundaryLayer Q (t n))).toReal) + Filter.atTop (nhds 0) := by + refine hreal_expr.congr' ?_ + filter_upwards with n + exact (htoReal n).symm + have hboundary : + Filter.Tendsto + (fun n : ℕ => MeasureTheory.volume (cubeBoundaryLayer Q (t n))) + Filter.atTop (nhds 0) := + (ENNReal.tendsto_toReal_zero_iff hfinite).1 hreal + simpa [t] using hboundary + +theorem tendsto_volumeMeasureOn_openCubeSet_cubeCoordInnerCollar_faceCutoffInnerRadius + {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + Filter.Tendsto + (fun n : ℕ => + volumeMeasureOn (openCubeSet Q) + (cubeCoordInnerCollar Q (faceCutoffInnerRadius n) i)) + Filter.atTop (nhds 0) := by + have hboundary := tendsto_faceBoundaryLayer_volume_zero Q + have hle : + ∀ n : ℕ, + volumeMeasureOn (openCubeSet Q) + (cubeCoordInnerCollar Q (faceCutoffInnerRadius n) i) ≤ + MeasureTheory.volume (cubeBoundaryLayer Q (2 / ((n : ℝ) + 5))) := by + intro n + calc + volumeMeasureOn (openCubeSet Q) + (cubeCoordInnerCollar Q (faceCutoffInnerRadius n) i) + ≤ MeasureTheory.volume + (cubeBoundaryLayer Q (1 - faceCutoffInnerRadius n)) := + volumeMeasureOn_openCubeSet_cubeCoordInnerCollar_le_cubeBoundaryLayer + Q (faceCutoffInnerRadius_lt_one n) i + _ = MeasureTheory.volume (cubeBoundaryLayer Q (2 / ((n : ℝ) + 5))) := by + congr 1 + dsimp [faceCutoffInnerRadius] + ring_nf + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hboundary + (fun _ => bot_le) hle + +/-- The canonical face cutoff has vanishing derivative error along each +coordinate for smooth functions that vanish on the two corresponding faces. -/ +theorem tendsto_eLpNorm_canonicalFun_coordDeriv_mul_of_face_zero_faceCutoffRadii + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (ψ : Vec d → ℝ) + {L : ℝ} (hL : 0 ≤ L) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x : Vec d => + (fderiv ℝ + (QuantitativeCubeCutoff.canonicalFun Q + (faceCutoffInnerRadius n) (faceCutoffOuterRadius n)) x) + (basisVec i) * ψ x) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + exact + tendsto_eLpNorm_canonicalFun_coordDeriv_mul_of_face_zero_of_collar_measure + (U := openCubeSet Q) Q + (ρ₁ := faceCutoffInnerRadius) (ρ₂ := faceCutoffOuterRadius) + (L := L) (A := 2) + faceCutoffInnerRadius_pos + faceCutoffInnerRadius_lt_outer + faceCutoffOuterRadius_le_one + hL (by norm_num) + faceCutoffInnerOuter_width_control + i ψ hψ hbound hlower_zero hupper_zero + (tendsto_volumeMeasureOn_openCubeSet_cubeCoordInnerCollar_faceCutoffInnerRadius Q i) + +/-- Boundary-error form of the face cutoff theorem, stated for the packaged +`QuantitativeCubeCutoff` sequence. -/ +theorem tendsto_eLpNorm_euclideanCoordDeriv_faceCutoff_mul_of_face_zero + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (ψ : Vec d → ℝ) + {L : ℝ} (hL : 0 ≤ L) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x : Vec d => + euclideanCoordDeriv i (faceCutoff Q n : Vec d → ℝ) x * ψ x) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + simpa [faceCutoff, euclideanCoordDeriv] using! + tendsto_eLpNorm_canonicalFun_coordDeriv_mul_of_face_zero_faceCutoffRadii + Q i ψ hL hψ hbound hlower_zero hupper_zero + +/-- Product-rule convergence for the face-cutoff sequence. For smooth compactly +supported functions vanishing on the two `i`-faces, multiplying by the canonical +inner cutoffs does not change the `i`th derivative in `L²(openCubeSet Q)`. -/ +theorem tendsto_eLpNorm_euclideanCoordDeriv_faceCutoff_mul_sub_of_face_zero + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (ψ : Vec d → ℝ) + {L : ℝ} (hL : 0 ≤ L) + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hψ_compact : HasCompactSupport ψ) + (hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L) + (hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x : Vec d => + euclideanCoordDeriv i (fun y => faceCutoff Q n y * ψ y) x - + euclideanCoordDeriv i ψ x) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + exact + QuantitativeCubeCutoff.tendsto_eLpNorm_euclideanCoordDeriv_mul_sub_of_tendsto_inner_of_boundary_error + (Q := Q) (ψ := ψ) + (ρ₁ := faceCutoffInnerRadius) (ρ₂ := faceCutoffOuterRadius) + (η := fun n => faceCutoff Q n) + tendsto_faceCutoffInnerRadius_one hψ hψ_compact i + (tendsto_eLpNorm_euclideanCoordDeriv_faceCutoff_mul_of_face_zero + Q i ψ hL hψ hbound hlower_zero hupper_zero) + +namespace H10Function + +/-- A smooth compactly supported function on a cube whose trace vanishes on +every coordinate face belongs to the zero-trace `H¹₀` closure. The approximants +are the canonical inner face cutoffs times the function. -/ +noncomputable def ofContDiffFaceZeroOnOpenCubeSet + {d : ℕ} (Q : TriadicCube d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hψ_compact : HasCompactSupport ψ) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeUpperFaceProjection Q i x) = 0) : + H10Function (openCubeSet Q) := by + let uH1 : H1Function (openCubeSet Q) := + H1Function.ofContDiff (isOpen_openCubeSet Q) (hψ.of_le (by simp)) hψ_compact + let L : ℝ := Classical.choose + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ hψ_compact) + have hL : 0 ≤ L := + (Classical.choose_spec + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ hψ_compact)).1 + have hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L := + (Classical.choose_spec + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ hψ_compact)).2 + refine + { toH1Function := uH1 + approx := fun n x => faceCutoff Q n x * ψ x + approx_smooth := ?_ + approx_hasCompactSupport := ?_ + approx_support_subset := ?_ + tendsto_approx := ?_ + tendsto_approx_grad := ?_ } + · intro n + exact (faceCutoff Q n).smooth.mul hψ + · intro n + simpa using! ((faceCutoff Q n).hasCompactSupport.mul_right : + HasCompactSupport (fun x : Vec d => faceCutoff Q n x * ψ x)) + · intro n + exact (tsupport_mul_subset_left + (f := (faceCutoff Q n : Vec d → ℝ)) (g := ψ)).trans + ((faceCutoff Q n).tsupport_subset_openCubeSet_of_nonneg_of_lt_one + (faceCutoffOuterRadius_nonneg n) (faceCutoffOuterRadius_lt_one n)) + · have hψ_mem : MemScalarL2 (openCubeSet Q) ψ := by + simpa [uH1, H1Function.ofContDiff, MemScalarL2, volumeMeasureOn] using + uH1.memL2 + have htail : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => ψ x - faceCutoff Q n x * ψ x) 2 + (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := + QuantitativeCubeCutoff.tendsto_eLpNorm_sub_mul_of_tendsto_inner + (Q := Q) (g := ψ) + (ρ₁ := faceCutoffInnerRadius) (ρ₂ := faceCutoffOuterRadius) + (η := fun n => faceCutoff Q n) + tendsto_faceCutoffInnerRadius_one hψ_mem + refine htail.congr' ?_ + filter_upwards with n + have hfun : + (fun x : Vec d => faceCutoff Q n x * ψ x - uH1.toFun x) = + fun x : Vec d => -(ψ x - faceCutoff Q n x * ψ x) := by + funext x + simp [uH1, H1Function.ofContDiff] + rw [hfun] + change + MeasureTheory.eLpNorm (fun x : Vec d => ψ x - faceCutoff Q n x * ψ x) + 2 (volumeMeasureOn (openCubeSet Q)) = + MeasureTheory.eLpNorm (-(fun x : Vec d => ψ x - faceCutoff Q n x * ψ x)) + 2 (volumeMeasureOn (openCubeSet Q)) + rw [MeasureTheory.eLpNorm_neg] + · intro i + have hgrad := + tendsto_eLpNorm_euclideanCoordDeriv_faceCutoff_mul_sub_of_face_zero + Q i ψ hL hψ hψ_compact hbound (hlower_zero i) (hupper_zero i) + simpa [uH1, H1Function.ofContDiff, euclideanCoordDeriv, volumeMeasureOn] + using hgrad + +@[simp] theorem ofContDiffFaceZeroOnOpenCubeSet_toFun + {d : ℕ} (Q : TriadicCube d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hψ_compact : HasCompactSupport ψ) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeUpperFaceProjection Q i x) = 0) : + (ofContDiffFaceZeroOnOpenCubeSet Q hψ hψ_compact hlower_zero hupper_zero).toH1Function.toFun = + ψ := + by + simp [ofContDiffFaceZeroOnOpenCubeSet, H1Function.ofContDiff] + +@[simp] theorem ofContDiffFaceZeroOnOpenCubeSet_grad + {d : ℕ} (Q : TriadicCube d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hψ_compact : HasCompactSupport ψ) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeUpperFaceProjection Q i x) = 0) : + (ofContDiffFaceZeroOnOpenCubeSet Q hψ hψ_compact hlower_zero hupper_zero).toH1Function.grad = + fun x i => (fderiv ℝ ψ x) (basisVec i) := + by + simp [ofContDiffFaceZeroOnOpenCubeSet, H1Function.ofContDiff] + +/-- A smooth function on a cube whose trace vanishes on every coordinate face +belongs to the zero-trace `H¹₀` closure. The proof first multiplies by a fixed +smooth cutoff that is identically `1` on the cube, so no compact-support +hypothesis is needed on the original function. -/ +noncomputable def ofContDiffFaceZeroOnOpenCubeSetNoCompact + {d : ℕ} (Q : TriadicCube d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeUpperFaceProjection Q i x) = 0) : + H10Function (openCubeSet Q) := by + let χ : Vec d → ℝ := faceCompactifyingCutoff Q + let ψc : Vec d → ℝ := fun x => χ x * ψ x + have hψc : ContDiff ℝ (⊤ : ℕ∞) ψc := by + simpa [ψc, χ] using (faceCompactifyingCutoff Q).smooth.mul hψ + have hψc_compact : HasCompactSupport ψc := by + simpa [ψc, χ] using! + ((faceCompactifyingCutoff Q).hasCompactSupport.mul_right : + HasCompactSupport (fun x : Vec d => faceCompactifyingCutoff Q x * ψ x)) + have hlower_zero_c : ∀ i : Fin d, ∀ x : Vec d, + ψc (cubeLowerFaceProjection Q i x) = 0 := by + intro i x + simp [ψc, hlower_zero i x] + have hupper_zero_c : ∀ i : Fin d, ∀ x : Vec d, + ψc (cubeUpperFaceProjection Q i x) = 0 := by + intro i x + simp [ψc, hupper_zero i x] + exact ofContDiffFaceZeroOnOpenCubeSet Q hψc hψc_compact + hlower_zero_c hupper_zero_c + +theorem ofContDiffFaceZeroOnOpenCubeSetNoCompact_toFun_ae + {d : ℕ} (Q : TriadicCube d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hlower_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeLowerFaceProjection Q i x) = 0) + (hupper_zero : ∀ i : Fin d, ∀ x : Vec d, + ψ (cubeUpperFaceProjection Q i x) = 0) : + (ofContDiffFaceZeroOnOpenCubeSetNoCompact Q hψ hlower_zero hupper_zero).toH1Function.toFun + =ᵐ[volumeMeasureOn (openCubeSet Q)] ψ := by + filter_upwards [MeasureTheory.ae_restrict_mem (measurableSet_openCubeSet Q)] with x hx + simp [ofContDiffFaceZeroOnOpenCubeSetNoCompact, faceCompactifyingCutoff_eq_one_on_openCubeSet Q hx] + +end H10Function + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/GradientAverage.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/GradientAverage.lean new file mode 100644 index 0000000000..d050fe5d9f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/GradientAverage.lean @@ -0,0 +1,175 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.CoarseCaccioppoli.CutoffProduct.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore + +/-! # Gradient Average -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +/-! +# Average mode for the cube Neumann CZ endpoint + +The `B^1_{2,1}` dual-test norm contains a cube-average term for each gradient +component. This file packages the existing Neumann energy estimate and the +standard `‖average‖ ≤ L²` bound into the exact average-mode estimate needed by +the endpoint handoff. +-/ + +/-- The current cube-dependent constant supplied by the existing Neumann +energy estimate for controlling the average mode of the Poisson gradient. -/ +noncomputable def cubePoissonGradientAverageConstant {d : ℕ} + (Q : TriadicCube d) : ℝ := + cubeBesovScaleWeight 1 Q * + ((((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ)) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * ((cubeVolume Q) ^ (1 / 2 : ℝ))) + +theorem cubePoissonGradientAverageConstant_nonneg {d : ℕ} + (Q : TriadicCube d) : + 0 ≤ cubePoissonGradientAverageConstant Q := by + have hscale : 0 ≤ cubeBesovScaleWeight 1 Q := + cubeBesovScaleWeight_nonneg 1 Q + have hvolInvSqrt : + 0 ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) := + Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _ + have hvolSqrt : 0 ≤ (cubeVolume Q) ^ (1 / 2 : ℝ) := + Real.rpow_nonneg (cubeVolume_nonneg Q) _ + have hmain : + 0 ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * (cubeVolume Q) ^ (1 / 2 : ℝ) := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg hvolInvSqrt (Nat.cast_nonneg d)) + (cubeMeanZeroH1CoerciveConstant_nonneg Q)) + hvolSqrt + exact mul_nonneg hscale hmain + +theorem cubePoissonGradientAverageConstant_eq_dimensionConstant {d : ℕ} + (Q : TriadicCube d) : + cubePoissonGradientAverageConstant Q = + (d : ℝ) * (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + let S : ℝ := cubeBesovScaleWeight 1 Q + let A : ℝ := ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) + let D : ℝ := (d : ℝ) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) + let C₀ : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + have hV_cancel : A * B = 1 := by + have hV_pos : 0 < cubeVolume Q := cubeVolume_pos Q + have hB_pos : 0 < B := by + dsimp [B] + exact Real.rpow_pos_of_pos hV_pos _ + dsimp [A, B] + rw [Real.inv_rpow (le_of_lt hV_pos) (1 / 2 : ℝ)] + exact inv_mul_cancel₀ hB_pos.ne' + have hSC : S * C = C₀ := by + have hscale_pos : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + dsimp [S, C, C₀] + rw [cubeMeanZeroH1CoerciveConstant_eq_scale_mul_unit] + unfold cubeBesovScaleWeight + rw [Real.rpow_neg_one] + field_simp [hscale_pos.ne'] + calc + cubePoissonGradientAverageConstant Q = S * (A * D * C * B) := by + simp [cubePoissonGradientAverageConstant, S, A, D, C, B] + _ = (S * C) * (A * B) * D := by ring + _ = C₀ * 1 * D := by rw [hSC, hV_cancel] + _ = (d : ℝ) * (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + simp [C₀, D, mul_comm] + +/-- Component-average bound for the Poisson gradient, in exactly the weighted +form consumed by +`cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm_and_average`. -/ +theorem meanZeroNeumannPoissonSolution_cubeBesovScaleWeight_norm_cubeAverage_grad_le + {d : ℕ} (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d) : + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ ≤ + cubePoissonGradientAverageConstant Q * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + let C : ℝ := + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * (cubeVolume Q) ^ (1 / 2 : ℝ)) + have hscale : 0 ≤ cubeBesovScaleWeight 1 Q := + cubeBesovScaleWeight_nonneg 1 Q + have hcomponentAvg : + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ ≤ + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) := + norm_cubeAverage_le_cubeLpNorm_two Q + (fun x => W.w.toH1Function.grad x i) + (W.w.toH1Function.grad_memL2_normalizedCubeMeasure i) + have hcomponentSum : + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) ≤ + ∑ k : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x k) := by + exact Finset.single_le_sum + (fun k _hk => cubeLpNorm_nonneg Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x k)) + (Finset.mem_univ i) + have hsum : + ∑ k : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x k) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) F := by + simpa [C] using meanZeroNeumannPoissonSolution_sum_cubeLpNorm_grad_le_exact Q hF W + calc + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ + ≤ cubeBesovScaleWeight 1 Q * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) := by + exact mul_le_mul_of_nonneg_left hcomponentAvg hscale + _ ≤ cubeBesovScaleWeight 1 Q * + (∑ k : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x k)) := by + exact mul_le_mul_of_nonneg_left hcomponentSum hscale + _ ≤ cubeBesovScaleWeight 1 Q * + (C * cubeLpNorm Q (2 : ℝ≥0∞) F) := by + exact mul_le_mul_of_nonneg_left hsum hscale + _ = cubePoissonGradientAverageConstant Q * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + simp [cubePoissonGradientAverageConstant, C] + ring + +/-- Endpoint handoff with the average mode already discharged by the Neumann +energy estimate. After this lemma, the remaining endpoint input is only the +uniform depth-seminorm estimate for each gradient component. -/ +theorem cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm + {d : ℕ} {Q : TriadicCube d} {Cdepth : ℝ} + (hCdepth : 0 ≤ Cdepth) + (hdepth : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d) (N j : ℕ), + j ∈ Finset.range (N + 1) → + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + Cdepth * cubeLpNorm Q (2 : ℝ≥0∞) F) : + CubePoissonGradientDualTestNormL2CoreEstimate Q + (Cdepth + cubePoissonGradientAverageConstant Q) := by + refine + cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm_and_average + hCdepth (cubePoissonGradientAverageConstant_nonneg Q) hdepth ?_ + intro F hF _hmean W i + exact + meanZeroNeumannPoissonSolution_cubeBesovScaleWeight_norm_cubeAverage_grad_le + Q hF W i + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovDepth.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovDepth.lean new file mode 100644 index 0000000000..d82e62f6b7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovDepth.lean @@ -0,0 +1,545 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.PositiveBesovCore + +/-! # Hessian Besov Depth -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +/-! +# Descendant Poincare to Besov depth bounds + +This file combines the gradient-coordinate Poincare bridge with the scalar +Besov depth handoff. The remaining quantitative input is deliberately explicit: +a uniform bound over all descendants at one depth for the local Hessian-row +Poincare quantities. +-/ + +namespace HasWeakHessianOn + +variable {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + +/-- Descendant Poincare plus the scalar depth handoff. If the local +Poincare-controlled Hessian-row quantity is bounded by `A` on every +depth-`j` descendant, then the depth-`j` Besov seminorm of the gradient +component is bounded by the depth weight times `A`. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_of_descendant_hessianRow_bound + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {A : ℝ} (hA : 0 ≤ A) + (hrow : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ ≤ + A) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * A := by + refine + cubeBesovDepthSeminorm_two_le_depthWeight_mul_of_descendant_oscillation_le + Q 1 (fun x => u.grad x i) j hA ?_ + intro R hR + exact + (H.cubeBesovOscillation_gradCoord_descendant_le_volumeFactor_mul_coerciveConst + hR i (hC R hR)).trans (hrow R hR) + +/-- Averaged descendant Poincare handoff for a Hessian row. This avoids the +too-strong descendant supremum from +`cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_of_descendant_hessianRow_bound`; +the right side is the descendant `L²` average of the local Poincare-controlled +Hessian-row quantities. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_descendantsAverage_sq_rpow_half + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2)) ^ (1 / 2 : ℝ) := by + let A : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0 + have hA_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + A R = + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹ + 1) * (hC R hR').fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR')).gradCoordH1Function i).gradToVectorL2‖ + else + 0) = + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + rw [dif_pos hR] + refine + cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + Q 1 (fun x => u.grad x i) j A ?_ ?_ + · intro R hR + rw [hA_eval R hR] + have hvolInv : 0 ≤ (cubeVolume R)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg R) + have hvolFactor : 0 ≤ (cubeVolume R)⁻¹ + 1 := by linarith + exact mul_nonneg + (mul_nonneg hvolFactor (hC R hR).constant_nonneg) + (norm_nonneg _) + · intro R hR + rw [hA_eval R hR] + exact + H.cubeBesovOscillation_gradCoord_descendant_le_volumeFactor_mul_coerciveConst + hR i (hC R hR) + +/-- Scale-sharp averaged descendant Poincare handoff for a Hessian row. + +This is the q=2 version of the previous averaged estimate with the exact +normalized `L²` factor `volume^{-1/2}`. It is the correct summation shape for +the reflection proof: descendant volumes and the number of descendants can +cancel when the restricted Hessian-row norms are squared and averaged. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_descendantsAverage_volumeInvRpowHalf_sq_rpow_half + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2)) ^ (1 / 2 : ℝ) := by + let A : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0 + have hA_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + A R = + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR').fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR')).gradCoordH1Function i).gradToVectorL2‖ + else + 0) = + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + rw [dif_pos hR] + refine + cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + Q 1 (fun x => u.grad x i) j A ?_ ?_ + · intro R hR + rw [hA_eval R hR] + have hvolInv : 0 ≤ (cubeVolume R)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg R) + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hvolInv _) (hC R hR).constant_nonneg) + (norm_nonneg _) + · intro R hR + rw [hA_eval R hR] + exact + H.cubeBesovOscillation_gradCoord_descendant_le_volumeInvRpowHalf_mul_coerciveConst + hR i (hC R hR) + +/-- Scale-sharp averaged Hessian-row handoff with the remaining quantitative +inputs explicit: a uniform bound `K` on +`volume(R)^{-1/2} * PoincareConstant(R)`, and an `L²` descendant-average bound +`B` on the restricted Hessian row. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_of_descendantsAverage_volumeInvRpowHalf_hessianRow + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K B : ℝ} (hK : 0 ≤ K) (hB : 0 ≤ B) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue ≤ K) + (havg : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ B ^ 2) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * (K * B) := by + let Row : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0 + let P : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * Row R + else + 0 + have hRow_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + Row R = + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR')).gradCoordH1Function i).gradToVectorL2‖ + else + 0) = + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + rw [dif_pos hR] + have hP_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + P R = ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * Row R := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR').fixedValue * Row R + else + 0) = + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue * Row R + rw [dif_pos hR] + have hP_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ P R := by + intro R hR + rw [hP_eval R hR, hRow_eval R hR] + have hvolInv : 0 ≤ (cubeVolume R)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg R) + exact mul_nonneg + (mul_nonneg (Real.rpow_nonneg hvolInv _) (hC R hR).constant_nonneg) + (norm_nonneg _) + have hosc : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ P R := by + intro R hR + rw [hP_eval R hR, hRow_eval R hR] + simpa [mul_assoc] using + H.cubeBesovOscillation_gradCoord_descendant_le_volumeInvRpowHalf_mul_coerciveConst + hR i (hC R hR) + have hdepth : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact + cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + Q 1 (fun x => u.grad x i) j P hP_nonneg hosc + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, P R ≤ K * Row R := by + intro R hR + rw [hP_eval R hR] + have hRow_nonneg : 0 ≤ Row R := by + rw [hRow_eval R hR] + exact norm_nonneg _ + exact mul_le_mul_of_nonneg_right (hfactor R hR) hRow_nonneg + have hsq : + descendantsAverage Q j (fun R => (P R) ^ 2) ≤ + descendantsAverage Q j (fun R => (K * Row R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + have hPR_nonneg : 0 ≤ P R := hP_nonneg R hR + exact pow_le_pow_left₀ hPR_nonneg (hpoint R hR) 2 + have hscaled : + descendantsAverage Q j (fun R => (K * Row R) ^ 2) = + K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (K * Row R) ^ 2) + = descendantsAverage Q j (fun R => K ^ 2 * (Row R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (K ^ 2) (fun R => (Row R) ^ 2)] + have hinside : + descendantsAverage Q j (fun R => (P R) ^ 2) ≤ (K * B) ^ 2 := by + calc + descendantsAverage Q j (fun R => (P R) ^ 2) + ≤ descendantsAverage Q j (fun R => (K * Row R) ^ 2) := hsq + _ = K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := hscaled + _ ≤ K ^ 2 * B ^ 2 := by + change descendantsAverage Q j (fun R => (Row R) ^ 2) ≤ B ^ 2 at havg + exact mul_le_mul_of_nonneg_left havg (sq_nonneg K) + _ = (K * B) ^ 2 := by ring + have hroot : + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) ≤ K * B := by + have hleftNonneg : + 0 ≤ descendantsAverage Q j (fun R => (P R) ^ 2) := + descendantsAverage_nonneg Q j _ fun R hR => sq_nonneg _ + have hKB_nonneg : 0 ≤ K * B := mul_nonneg hK hB + calc + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) + ≤ ((K * B) ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleftNonneg hinside (by norm_num) + _ = K * B := by + rw [sq_rpow_half_eq_of_nonneg hKB_nonneg] + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j + ≤ cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) := hdepth + _ ≤ cubeBesovDepthWeight Q 1 j * (K * B) := by + exact mul_le_mul_of_nonneg_left hroot + (cubeBesovDepthWeight_nonneg Q 1 j) + +/-- Averaged Hessian-row handoff with the two remaining quantitative inputs +made explicit: a uniform bound `K` on the descendant-local Poincare prefactor, +and an `L²` descendant-average bound `B` on the restricted Hessian row. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_of_descendantsAverage_hessianRow + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K B : ℝ} (hK : 0 ≤ K) (hB : 0 ≤ B) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue ≤ K) + (havg : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ B ^ 2) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * (K * B) := by + let Row : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0 + let P : TriadicCube d → ℝ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * Row R + else + 0 + have hRow_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + Row R = + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR')).gradCoordH1Function i).gradToVectorL2‖ + else + 0) = + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + rw [dif_pos hR] + have hP_eval : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + P R = ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * Row R := by + intro R hR + change + (if hR' : R ∈ descendantsAtDepth Q j then + ((cubeVolume R)⁻¹ + 1) * (hC R hR').fixedValue * Row R + else + 0) = + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue * Row R + rw [dif_pos hR] + have hP_nonneg : + ∀ R ∈ descendantsAtDepth Q j, 0 ≤ P R := by + intro R hR + rw [hP_eval R hR, hRow_eval R hR] + have hvolInv : 0 ≤ (cubeVolume R)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg R) + have hvolFactor : 0 ≤ (cubeVolume R)⁻¹ + 1 := by linarith + exact mul_nonneg + (mul_nonneg hvolFactor (hC R hR).constant_nonneg) + (norm_nonneg _) + have hosc : + ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ P R := by + intro R hR + rw [hP_eval R hR, hRow_eval R hR] + simpa [mul_assoc] using + H.cubeBesovOscillation_gradCoord_descendant_le_volumeFactor_mul_coerciveConst + hR i (hC R hR) + have hdepth : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact + cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + Q 1 (fun x => u.grad x i) j P hP_nonneg hosc + have hpoint : + ∀ R ∈ descendantsAtDepth Q j, P R ≤ K * Row R := by + intro R hR + rw [hP_eval R hR] + have hRow_nonneg : 0 ≤ Row R := by + rw [hRow_eval R hR] + exact norm_nonneg _ + exact mul_le_mul_of_nonneg_right (hfactor R hR) hRow_nonneg + have hsq : + descendantsAverage Q j (fun R => (P R) ^ 2) ≤ + descendantsAverage Q j (fun R => (K * Row R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ (hP_nonneg R hR) (hpoint R hR) 2 + have hscaled : + descendantsAverage Q j (fun R => (K * Row R) ^ 2) = + K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := by + calc + descendantsAverage Q j (fun R => (K * Row R) ^ 2) + = descendantsAverage Q j (fun R => K ^ 2 * (Row R) ^ 2) := by + refine congrArg (descendantsAverage Q j) ?_ + funext R + ring + _ = K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := by + rw [descendantsAverage_mul_left Q j (K ^ 2) (fun R => (Row R) ^ 2)] + have hrowAvg : + descendantsAverage Q j (fun R => (Row R) ^ 2) ≤ B ^ 2 := by + change descendantsAverage Q j (fun R => (Row R) ^ 2) ≤ B ^ 2 at havg + exact havg + have hinside : + descendantsAverage Q j (fun R => (P R) ^ 2) ≤ K ^ 2 * B ^ 2 := by + calc + descendantsAverage Q j (fun R => (P R) ^ 2) + ≤ descendantsAverage Q j (fun R => (K * Row R) ^ 2) := hsq + _ = K ^ 2 * descendantsAverage Q j (fun R => (Row R) ^ 2) := hscaled + _ ≤ K ^ 2 * B ^ 2 := + mul_le_mul_of_nonneg_left hrowAvg (sq_nonneg K) + have hleftNonneg : + 0 ≤ descendantsAverage Q j (fun R => (P R) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R _hR => sq_nonneg _ + have hroot : + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) ≤ + K * B := by + calc + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) + ≤ (K ^ 2 * B ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hleftNonneg hinside (by norm_num) + _ = K * B := by + rw [show K ^ 2 * B ^ 2 = (K * B) ^ 2 by ring] + exact sq_rpow_half_eq_of_nonneg (mul_nonneg hK hB) + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j + ≤ cubeBesovDepthWeight Q 1 j * + (descendantsAverage Q j (fun R => (P R) ^ 2)) ^ (1 / 2 : ℝ) := hdepth + _ ≤ cubeBesovDepthWeight Q 1 j * (K * B) := by + exact mul_le_mul_of_nonneg_left hroot + (cubeBesovDepthWeight_nonneg Q 1 j) + +/-- Variant of the averaged Hessian-row handoff using only the global Hessian +row norm. The localization input is discharged by monotonicity of the `L²` +norm under restriction; the remaining quantitative hypothesis is the uniform +bound `K` for the descendant-local Poincare prefactor. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_global_hessianRow + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K : ℝ} (hK : 0 ≤ K) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue ≤ K) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (K * ‖(H.gradCoordH1Function i).gradToVectorL2‖) := by + let B : ℝ := ‖(H.gradCoordH1Function i).gradToVectorL2‖ + have hB : 0 ≤ B := by + change 0 ≤ ‖(H.gradCoordH1Function i).gradToVectorL2‖ + exact norm_nonneg _ + have havg : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ B ^ 2 := by + have hstep : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ + descendantsAverage Q j (fun _R => B ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + rw [dif_pos hR] + exact pow_le_pow_left₀ (norm_nonneg _) + (by + change + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ ≤ + ‖(H.gradCoordH1Function i).gradToVectorL2‖ + exact H.restrict_gradCoordH1Function_gradToVectorL2_norm_le + (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) i) + 2 + rw [descendantsAverage_const] at hstep + exact hstep + exact + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_of_descendantsAverage_hessianRow + i j hC hK hB hfactor havg + +/-- Depth estimate stated in terms of the global Hessian-coordinate sum. This +is the form aligned with the reflected interior estimate, which controls +`H.hessianCoordL2NormSum`. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_hessianCoordL2NormSum + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K : ℝ} (hK : 0 ≤ K) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹ + 1) * (hC R hR).fixedValue ≤ K) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * (K * H.hessianCoordL2NormSum) := by + have hdepth := + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_global_hessianRow + i j hC hK hfactor + have hrow : + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ≤ H.hessianCoordL2NormSum := + H.gradCoordH1Function_gradToVectorL2_norm_le_hessianCoordL2NormSum i + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j + ≤ cubeBesovDepthWeight Q 1 j * + (K * ‖(H.gradCoordH1Function i).gradToVectorL2‖) := hdepth + _ ≤ cubeBesovDepthWeight Q 1 j * (K * H.hessianCoordL2NormSum) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hrow hK) + (cubeBesovDepthWeight_nonneg Q 1 j) + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovSummation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovSummation.lean new file mode 100644 index 0000000000..6b17f162c5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianBesovSummation.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovDepth + +/-! # Hessian Besov Summation -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-! +# Descendant summation for the C.2 Hessian-to-Besov bridge + +This file packages the finite summation side of the scale-sharp C.2 handoff. +The analytic disjoint-restriction estimate is still supplied as an explicit +sum hypothesis; the theorem below converts that sum bound into the descendant +average required by `HessianBesovDepth`. +-/ + +namespace HasWeakHessianOn + +variable {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + +/-- Scale-sharp depth handoff from a finite descendant sum bound on the +restricted Hessian row. This is the exact form meant to receive the future +disjoint-restriction estimate +`∑_R ‖row‖²_{L²(R)} ≤ ‖row‖²_{L²(Q)}`. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvSum_volumeInvRpowHalf_hessianRow + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K B : ℝ} (hK : 0 ≤ K) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue ≤ K) + (hsum : + ∑ R ∈ descendantsAtDepth Q j, + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + ).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2 ≤ B ^ 2) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (K * ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * B ^ 2) ^ (1 / 2 : ℝ))) := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let Bavg : ℝ := (((D.card : ℝ)⁻¹ * B ^ 2) ^ (1 / 2 : ℝ)) + have hx_nonneg : 0 ≤ (D.card : ℝ)⁻¹ * B ^ 2 := by + exact mul_nonneg (inv_nonneg.mpr (by positivity)) (sq_nonneg B) + have hBavg : 0 ≤ Bavg := by + dsimp [Bavg] + exact Real.rpow_nonneg hx_nonneg _ + have hBavg_sq : Bavg ^ 2 = (D.card : ℝ)⁻¹ * B ^ 2 := by + dsimp [Bavg] + rw [← Real.rpow_natCast, ← Real.rpow_mul hx_nonneg] + norm_num + have havg : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ Bavg ^ 2 := by + have hsum_if : + D.sum + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ B ^ 2 := by + change + D.sum + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ B ^ 2 at hsum + exact hsum + have hraw : + descendantsAverage Q j + (fun R => + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2) ≤ (D.card : ℝ)⁻¹ * B ^ 2 := by + dsimp [descendantsAverage, D] + exact mul_le_mul_of_nonneg_left hsum_if + (inv_nonneg.mpr (by positivity)) + rw [hBavg_sq] + exact hraw + change + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * (K * Bavg) + exact + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_of_descendantsAverage_volumeInvRpowHalf_hessianRow + i j hC hK hBavg hfactor havg + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianGradientH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianGradientH1.lean new file mode 100644 index 0000000000..194a791e34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianGradientH1.lean @@ -0,0 +1,378 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver + +/-! # Hessian Gradient H1 -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +/-! +# Gradient-coordinate `H¹` functions from weak Hessians + +The Hessian-to-Besov part of C.2 needs to apply one-cube Poincare to each +component of the Poisson gradient on descendant cubes. This file packages the +basic Sobolev witness: a weak Hessian on `u` makes every coordinate +`∂ᵢu` into an `H¹` function with weak gradient given by the `i`th Hessian row. +-/ + +namespace HasWeakHessianOn + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-- The `i`th weak-gradient coordinate as an `H¹` function. Its weak gradient +is the `i`th row of the weak Hessian. -/ +noncomputable def gradCoordH1Function (H : HasWeakHessianOn U u) + (i : Fin d) : H1Function U where + toFun := fun x => u.grad x i + grad := fun x j => H.hess i j x + memL2 := u.grad_memL2 i + gradMemL2 := H.hess_memL2 i + hasWeakGradient := H.weak_second i + +@[simp] theorem gradCoordH1Function_apply + (H : HasWeakHessianOn U u) (i : Fin d) (x : Vec d) : + H.gradCoordH1Function i x = u.grad x i := + rfl + +@[simp] theorem gradCoordH1Function_grad + (H : HasWeakHessianOn U u) (i : Fin d) (x : Vec d) : + (H.gradCoordH1Function i).grad x = fun j => H.hess i j x := + rfl + +@[simp] theorem gradCoordH1Function_grad_apply + (H : HasWeakHessianOn U u) (i j : Fin d) (x : Vec d) : + (H.gradCoordH1Function i).grad x j = H.hess i j x := + rfl + +/-- The coordinate-gradient `L²` sum of `∂ᵢu` is exactly the `i`th Hessian row +sum recorded by the Hessian witness. -/ +theorem gradCoordH1Function_gradientCoordL2NormSum_eq + (H : HasWeakHessianOn U u) (i : Fin d) : + (H.gradCoordH1Function i).gradientCoordL2NormSum = + ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ := by + rfl + +/-- Restricting the domain does not increase the `L²` norm of a Hessian row, +viewed as the weak gradient of the corresponding gradient coordinate. -/ +theorem restrict_gradCoordH1Function_gradToVectorL2_norm_le + (H : HasWeakHessianOn U u) {V : Set (Vec d)} + (hVopen : IsOpen V) (hVU : V ⊆ U) (i : Fin d) : + ‖((H.restrict hVopen hVU).gradCoordH1Function i).gradToVectorL2‖ ≤ + ‖(H.gradCoordH1Function i).gradToVectorL2‖ := by + have hmono : + MeasureTheory.eLpNorm (fun x => fun j : Fin d => H.hess i j x) + (2 : ℝ≥0∞) (volumeMeasureOn V) ≤ + MeasureTheory.eLpNorm (fun x => fun j : Fin d => H.hess i j x) + (2 : ℝ≥0∞) (volumeMeasureOn U) := by + exact MeasureTheory.eLpNorm_mono_measure _ + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + have htop : + MeasureTheory.eLpNorm (fun x => fun j : Fin d => H.hess i j x) + (2 : ℝ≥0∞) (volumeMeasureOn U) ≠ ∞ := by + exact ne_of_lt (H.gradCoordH1Function i).grad_memVectorL2.eLpNorm_lt_top + rw [H1Function.gradToVectorL2, Homogenization.toVectorL2, + MeasureTheory.Lp.norm_toLp] + rw [H1Function.gradToVectorL2, Homogenization.toVectorL2, + MeasureTheory.Lp.norm_toLp] + exact ENNReal.toReal_mono htop hmono + +private theorem h1Function_norm_gradToVectorL2_le_gradientCoordL2NormSum + (v : H1Function U) : + ‖v.gradToVectorL2‖ ≤ v.gradientCoordL2NormSum := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let D : Vec d → ℝ := fun x => ∑ j : Fin d, ‖v.grad x j‖ + have hcoord_mem : + ∀ j : Fin d, MeasureTheory.MemLp (fun x => ‖v.grad x j‖) + (2 : ℝ≥0∞) μ := by + intro j + simpa [μ] using (v.grad_memL2 j).norm + have hD_mem : MeasureTheory.MemLp D (2 : ℝ≥0∞) μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := (2 : ℝ≥0∞)) + (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => ‖v.grad x j‖) + (fun j _hj => hcoord_mem j) + simpa [D] using hsum + have hD_memScalar : MemScalarL2 U D := by + simpa [MemScalarL2, μ] using hD_mem + let dCoordLp : ScalarL2 U := Homogenization.toScalarL2 hD_memScalar + have hrow_le_sumLp : ‖v.gradToVectorL2‖ ≤ ‖dCoordLp‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards [H1Function.coeFn_gradToVectorL2 v, + Homogenization.coeFn_toScalarL2 hD_memScalar] with x hrow hD + rw [hrow, hD] + have hD_nonneg : 0 ≤ D x := by + exact Finset.sum_nonneg fun j _hj => norm_nonneg _ + have hvec_le : ‖v.grad x‖ ≤ D x := by + refine (pi_norm_le_iff_of_nonneg hD_nonneg).2 ?_ + intro j + exact Finset.single_le_sum + (fun k _hk => norm_nonneg (v.grad x k)) + (Finset.mem_univ j) + simpa [Real.norm_eq_abs, abs_of_nonneg hD_nonneg] using hvec_le + have hsum_eLp : + MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ ≤ + ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ := by + have hD : + D = ∑ j : Fin d, (fun x : Vec d => ‖v.grad x j‖) := by + funext x + simp [D] + rw [hD] + simpa using + (MeasureTheory.eLpNorm_sum_le + (μ := μ) (p := (2 : ℝ≥0∞)) (s := Finset.univ) + (f := fun j : Fin d => fun x : Vec d => ‖v.grad x j‖) + (by norm_num : (1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞))) + have hsum_toReal : + ENNReal.toReal + (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ) = + ∑ j : Fin d, ‖v.gradCoordToScalarL2 j‖ := by + rw [ENNReal.toReal_sum (fun j _hj => (hcoord_mem j).eLpNorm_lt_top.ne)] + refine Finset.sum_congr rfl ?_ + intro j _hj + rw [MeasureTheory.eLpNorm_norm _ (v.grad_memL2 j).aestronglyMeasurable] + simp [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp, μ] + have hsumLp_le : + ‖dCoordLp‖ ≤ v.gradientCoordL2NormSum := by + calc + ‖dCoordLp‖ = ENNReal.toReal (MeasureTheory.eLpNorm D (2 : ℝ≥0∞) μ) := by + simp [dCoordLp, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp, + μ] + _ ≤ ENNReal.toReal + (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun j _hj => (hcoord_mem j).eLpNorm_lt_top.ne + _ = v.gradientCoordL2NormSum := by + change + ENNReal.toReal + (∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖v.grad x j‖) (2 : ℝ≥0∞) μ) = + ∑ j : Fin d, ‖v.gradCoordToScalarL2 j‖ + exact hsum_toReal + exact hrow_le_sumLp.trans hsumLp_le + +theorem gradCoordH1Function_gradToVectorL2_norm_le_rowCoordL2NormSum + (H : HasWeakHessianOn U u) (i : Fin d) : + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ≤ + ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ := by + calc + ‖(H.gradCoordH1Function i).gradToVectorL2‖ + ≤ (H.gradCoordH1Function i).gradientCoordL2NormSum := + h1Function_norm_gradToVectorL2_le_gradientCoordL2NormSum + (H.gradCoordH1Function i) + _ = ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ := + H.gradCoordH1Function_gradientCoordL2NormSum_eq i + +theorem gradCoordH1Function_gradToVectorL2_norm_le_hessianCoordL2NormSum + (H : HasWeakHessianOn U u) (i : Fin d) : + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ≤ + H.hessianCoordL2NormSum := by + have hrow := + H.gradCoordH1Function_gradToVectorL2_norm_le_rowCoordL2NormSum i + have hrow_le_total : + (∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) ≤ + H.hessianCoordL2NormSum := by + unfold HasWeakHessianOn.hessianCoordL2NormSum + exact Finset.single_le_sum + (fun k _hk => Finset.sum_nonneg fun j _hj => norm_nonneg _) + (Finset.mem_univ i) + exact hrow.trans hrow_le_total + +end HasWeakHessianOn + +namespace HasWeakHessianOn + +variable {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + +private theorem cubePoissonRhs_toScalarL2_norm_le_coercive + (hC : H1CoerciveEstimate (openCubeSet Q)) + (v : H1Function (openCubeSet Q)) + (hvOpen : MemScalarL2 (openCubeSet Q) (v.cubePoissonRhs Q)) : + ‖Homogenization.toScalarL2 hvOpen‖ ≤ + hC.fixedValue * ‖v.gradToVectorL2‖ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hLpEq : + Homogenization.toScalarL2 hvOpen = + (v.toMeanZeroOnCube Q).toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [Homogenization.coeFn_toScalarL2 hvOpen, + H1Function.coeFn_toScalarL2 (v.toMeanZeroOnCube Q).toH1Function] + with x hx hmean + rw [hx] + change v.cubePoissonRhs Q x = + (v.toMeanZeroOnCube Q).toH1Function.toScalarL2 x + rw [hmean] + simp + have hPoincare : + (v.toMeanZeroOnCube Q).valueL2Norm ≤ + hC.fixedValue * ‖v.gradToVectorL2‖ := by + simpa [H1Function.toMeanZeroOnCube] using hC.bound_subAverage v + simpa [H1MeanZeroFunction.valueL2Norm, hLpEq] using hPoincare + +/-- One-cube Poincare applied to a gradient coordinate of a weak-Hessian +function, stated in normalized cube-oscillation form. + +This is the single-cube ingredient for the later descendant summation: +`cubeBesovOscillation` of `∂ᵢu` is controlled by the coercive constant on the +cube and the `L²` norm of the Hessian row. -/ +theorem cubeBesovOscillation_gradCoord_le_volumeFactor_mul_coerciveConst + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) + (hC : H1CoerciveEstimate (openCubeSet Q)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ + ((cubeVolume Q)⁻¹ + 1) * hC.fixedValue * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let v : H1Function (openCubeSet Q) := H.gradCoordH1Function i + have hvMem : MeasureTheory.MemLp (v.cubePoissonRhs Q) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + v.cubePoissonRhs_memL2_normalizedCubeMeasure + let hvOpen : MemScalarL2 (openCubeSet Q) (v.cubePoissonRhs Q) := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hvMem + have hnormOpen : + ‖Homogenization.toScalarL2 hvOpen‖ ≤ + hC.fixedValue * ‖v.gradToVectorL2‖ := by + exact cubePoissonRhs_toScalarL2_norm_le_coercive hC v hvOpen + have hnorm := + cubeLpNorm_two_le_volume_inv_add_one_mul_norm_toScalarL2_openCubeSet + Q hvMem + calc + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u.grad x i) + = cubeLpNorm Q (2 : ℝ≥0∞) (v.cubePoissonRhs Q) := by + have hosc := + H1Function.cubeBesovOscillation_eq_cubeLpNorm_cubePoissonRhs + (Q := Q) (u := v) + simpa [v] using hosc + _ ≤ ((cubeVolume Q)⁻¹ + 1) * ‖Homogenization.toScalarL2 hvOpen‖ := by + simpa [hvOpen] using hnorm + _ ≤ ((cubeVolume Q)⁻¹ + 1) * + (hC.fixedValue * ‖v.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hnormOpen + (by + have hInv : 0 ≤ (cubeVolume Q)⁻¹ := + inv_nonneg.mpr (cubeVolume_nonneg Q) + linarith) + _ = ((cubeVolume Q)⁻¹ + 1) * hC.fixedValue * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ := by + rw [mul_assoc] + +/-- Scale-sharp one-cube Poincare handoff for a gradient coordinate. + +This is the same estimate as +`cubeBesovOscillation_gradCoord_le_volumeFactor_mul_coerciveConst`, but with +the exact q=2 normalized `L²` conversion factor `volume^{-1/2}`. This is the +form needed for the C.2 depth summation, where the descendant-count factor +cancels this normalization. -/ +theorem cubeBesovOscillation_gradCoord_le_volumeInvRpowHalf_mul_coerciveConst + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) + (hC : H1CoerciveEstimate (openCubeSet Q)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * hC.fixedValue * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let v : H1Function (openCubeSet Q) := H.gradCoordH1Function i + have hvMem : MeasureTheory.MemLp (v.cubePoissonRhs Q) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + v.cubePoissonRhs_memL2_normalizedCubeMeasure + let hvOpen : MemScalarL2 (openCubeSet Q) (v.cubePoissonRhs Q) := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hvMem + have hnormOpen : + ‖Homogenization.toScalarL2 hvOpen‖ ≤ + hC.fixedValue * ‖v.gradToVectorL2‖ := by + exact cubePoissonRhs_toScalarL2_norm_le_coercive hC v hvOpen + have hnorm := + cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openCubeSet + Q hvMem + calc + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u.grad x i) + = cubeLpNorm Q (2 : ℝ≥0∞) (v.cubePoissonRhs Q) := by + have hosc := + H1Function.cubeBesovOscillation_eq_cubeLpNorm_cubePoissonRhs + (Q := Q) (u := v) + simpa [v] using hosc + _ = ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toScalarL2 hvOpen‖ := by + simpa [hvOpen] using hnorm + _ ≤ ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (hC.fixedValue * ‖v.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hnormOpen + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + _ = ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * hC.fixedValue * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ := by + rw [mul_assoc] + +/-- Descendant-cube form of +`cubeBesovOscillation_gradCoord_le_volumeFactor_mul_coerciveConst`, obtained +by restricting the Hessian witness to the descendant open cube. -/ +theorem cubeBesovOscillation_gradCoord_descendant_le_volumeFactor_mul_coerciveConst + {R : TriadicCube d} {j : ℕ} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hR : R ∈ descendantsAtDepth Q j) (i : Fin d) + (hC : H1CoerciveEstimate (openCubeSet R)) : + cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ + ((cubeVolume R)⁻¹ + 1) * hC.fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + let HR : HasWeakHessianOn (openCubeSet R) (u.restrictToOpenSubcube hR) := + H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + have hmain := + HR.cubeBesovOscillation_gradCoord_le_volumeFactor_mul_coerciveConst i hC + change + cubeBesovOscillation R (2 : ℝ≥0∞) + (fun x => (u.restrictToOpenSubcube hR).grad x i) ≤ + ((cubeVolume R)⁻¹ + 1) * hC.fixedValue * + ‖(HR.gradCoordH1Function i).gradToVectorL2‖ + exact hmain + +/-- Descendant-cube form of the scale-sharp one-cube Poincare handoff. -/ +theorem cubeBesovOscillation_gradCoord_descendant_le_volumeInvRpowHalf_mul_coerciveConst + {R : TriadicCube d} {j : ℕ} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hR : R ∈ descendantsAtDepth Q j) (i : Fin d) + (hC : H1CoerciveEstimate (openCubeSet R)) : + cubeBesovOscillation R (2 : ℝ≥0∞) (fun x => u.grad x i) ≤ + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * hC.fixedValue * + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR)).gradCoordH1Function i).gradToVectorL2‖ := by + let HR : HasWeakHessianOn (openCubeSet R) (u.restrictToOpenSubcube hR) := + H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + have hmain := + HR.cubeBesovOscillation_gradCoord_le_volumeInvRpowHalf_mul_coerciveConst i hC + change + cubeBesovOscillation R (2 : ℝ≥0∞) + (fun x => (u.restrictToOpenSubcube hR).grad x i) ≤ + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * hC.fixedValue * + ‖(HR.gradCoordH1Function i).gradToVectorL2‖ + exact hmain + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianRestrictionSum.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianRestrictionSum.lean new file mode 100644 index 0000000000..8b4256e51c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianRestrictionSum.lean @@ -0,0 +1,244 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianBesovSummation + +/-! # Hessian Restriction Sum -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-! +# Disjoint restriction summation for Hessian rows + +This file proves the measure-theoretic part of the C.2 depth summation: the +sum of squared `L²` norms of a Hessian row over disjoint descendant open cubes +is bounded by the parent-cube row norm. +-/ + +namespace HasWeakHessianOn + +variable {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + +private theorem toReal_eLpNorm_two_sq_eq_integral_norm_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] [MeasurableSpace E] + [BorelSpace E] {μ : MeasureTheory.Measure α} {f : α → E} + (hf : MeasureTheory.MemLp f 2 μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ 2 ∂μ := by + have hpow : (2 : ℝ≥0∞).toReal = (2 : ℝ) := by + norm_num + have hnorm := + hf.eLpNorm_eq_integral_rpow_norm + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by simp : (2 : ℝ≥0∞) ≠ ⊤) + have hsq_norm : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + rw [hnorm, hpow] + have hint_nonneg : + 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => + Real.rpow_nonneg (norm_nonneg (f x)) _) + rw [ENNReal.toReal_ofReal] + · rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num] + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hint_nonneg + · exact Real.rpow_nonneg hint_nonneg _ + calc + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := hsq_norm + _ = ∫ x, ‖f x‖ ^ 2 ∂μ := by + congr 1 with x + rw [Real.rpow_two] + +private theorem norm_toVectorL2_sq_eq_integral_norm_sq + {U : Set (Vec d)} {F : Vec d → Vec d} (hF : MemVectorL2 U F) : + ‖Homogenization.toVectorL2 hF‖ ^ 2 = + ∫ x in U, ‖F x‖ ^ 2 ∂MeasureTheory.volume := by + rw [Homogenization.toVectorL2, MeasureTheory.Lp.norm_toLp] + simpa [volumeMeasureOn] using + toReal_eLpNorm_two_sq_eq_integral_norm_sq (μ := volumeMeasureOn U) hF + +/-- Squared `L²` norms of a Hessian row over depth-`j` descendant open cubes +sum to at most the parent-cube squared row norm. -/ +theorem descendants_sum_restrict_gradCoordH1Function_gradToVectorL2_norm_sq_le + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) : + ∑ R ∈ descendantsAtDepth Q j, + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + ).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2 ≤ + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2 := by + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let row : Vec d → Vec d := fun x => fun k : Fin d => H.hess i k x + let energy : Vec d → ℝ := fun x => ‖row x‖ ^ 2 + have hrow_mem : MemVectorL2 (openCubeSet Q) row := by + simpa [row] using! (H.gradCoordH1Function i).grad_memVectorL2 + have henergy_int_Q : + MeasureTheory.IntegrableOn energy (openCubeSet Q) MeasureTheory.volume := by + have hint : + MeasureTheory.Integrable (fun x => ‖row x‖ ^ 2) + (volumeMeasureOn (openCubeSet Q)) := by + simpa using hrow_mem.integrable_norm_pow (by norm_num : (2 : ℕ) ≠ 0) + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn, energy] using hint + have hlocal_norm : + ∀ R (hR : R ∈ D), + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + ).gradCoordH1Function i).gradToVectorL2‖ ^ 2 = + ∫ x in openCubeSet R, energy x ∂MeasureTheory.volume := by + intro R hR + have hmem : + MemVectorL2 (openCubeSet R) + (((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + ).gradCoordH1Function i).grad) := + ((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + ).gradCoordH1Function i).grad_memVectorL2 + simpa [H1Function.gradToVectorL2, row, energy, HasWeakHessianOn.gradCoordH1Function, + HasWeakHessianOn.restrict, H1Function.restrict] using + norm_toVectorL2_sq_eq_integral_norm_sq hmem + have hglobal_norm : + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2 = + ∫ x in openCubeSet Q, energy x ∂MeasureTheory.volume := by + simpa [H1Function.gradToVectorL2, row, energy, HasWeakHessianOn.gradCoordH1Function] using + norm_toVectorL2_sq_eq_integral_norm_sq hrow_mem + have hmeas : ∀ R ∈ D, MeasurableSet (openCubeSet R) := by + intro R _hR + exact measurableSet_openCubeSet R + have hpair : (D : Set (TriadicCube d)).PairwiseDisjoint openCubeSet := by + simpa [D] using pairwiseDisjoint_openCubeSet_descendantsAtDepth Q j + have hint_local : + ∀ R ∈ D, MeasureTheory.IntegrableOn energy (openCubeSet R) MeasureTheory.volume := by + intro R hR + exact henergy_int_Q.mono_set + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)) + have hsum_int : + ∫ x in ⋃ R ∈ D, openCubeSet R, energy x ∂MeasureTheory.volume = + ∑ R ∈ D, ∫ x in openCubeSet R, energy x ∂MeasureTheory.volume := by + exact MeasureTheory.integral_biUnion_finset D hmeas hpair hint_local + have hunion_subset : (⋃ R ∈ D, openCubeSet R) ⊆ openCubeSet Q := by + intro x hx + rcases Set.mem_iUnion.mp hx with ⟨R, hxR⟩ + rcases Set.mem_iUnion.mp hxR with ⟨hR, hxOpen⟩ + exact openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR) hxOpen + have hmono : + ∫ x in ⋃ R ∈ D, openCubeSet R, energy x ∂MeasureTheory.volume ≤ + ∫ x in openCubeSet Q, energy x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_mono_set henergy_int_Q + (Filter.Eventually.of_forall fun x => sq_nonneg ‖row x‖) + (Filter.Eventually.of_forall hunion_subset) + calc + ∑ R ∈ descendantsAtDepth Q j, + (if hR : R ∈ descendantsAtDepth Q j then + ‖((H.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + ).gradCoordH1Function i).gradToVectorL2‖ + else + 0) ^ 2 + = ∑ R ∈ D, ∫ x in openCubeSet R, energy x ∂MeasureTheory.volume := by + dsimp [D] + refine Finset.sum_congr rfl ?_ + intro R hR + rw [dif_pos hR] + exact hlocal_norm R (by simpa [D] using hR) + _ = ∫ x in ⋃ R ∈ D, openCubeSet R, energy x ∂MeasureTheory.volume := hsum_int.symm + _ ≤ ∫ x in openCubeSet Q, energy x ∂MeasureTheory.volume := hmono + _ = ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2 := hglobal_norm.symm + +/-- Scale-sharp depth handoff after disjoint restriction summation, stated +with the global Hessian row norm. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvGlobalRow_volumeInvRpowHalf + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K : ℝ} (hK : 0 ≤ K) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue ≤ K) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (K * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2) ^ (1 / 2 : ℝ))) := by + exact + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvSum_volumeInvRpowHalf_hessianRow + i j hC hK hfactor + (H.descendants_sum_restrict_gradCoordH1Function_gradToVectorL2_norm_sq_le i j) + +/-- Scale-sharp depth handoff after disjoint restriction summation, in the +global Hessian-coordinate-sum form produced by the reflected interior theorem. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvGlobal_hessianCoordL2NormSum + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) + (hC : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R)) + {K : ℝ} (hK : 0 ≤ K) + (hfactor : + ∀ R (hR : R ∈ descendantsAtDepth Q j), + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * (hC R hR).fixedValue ≤ K) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (K * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2) ^ (1 / 2 : ℝ))) := by + have hrowDepth := + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvGlobalRow_volumeInvRpowHalf + i j hC hK hfactor + have hrow : + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ≤ H.hessianCoordL2NormSum := + H.gradCoordH1Function_gradToVectorL2_norm_le_hessianCoordL2NormSum i + have hcard_nonneg : 0 ≤ ((descendantsAtDepth Q j).card : ℝ)⁻¹ := + inv_nonneg.mpr (by positivity) + have hrow_nonneg : 0 ≤ ‖(H.gradCoordH1Function i).gradToVectorL2‖ := + norm_nonneg _ + have hinside_nonneg : + 0 ≤ ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2 := by + exact mul_nonneg hcard_nonneg (sq_nonneg _) + have hinside : + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2 ≤ + ((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2 := by + exact mul_le_mul_of_nonneg_left + (pow_le_pow_left₀ hrow_nonneg hrow 2) hcard_nonneg + have hroot : + (((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2) ^ (1 / 2 : ℝ) ≤ + (((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hinside_nonneg hinside (by norm_num) + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j + ≤ cubeBesovDepthWeight Q 1 j * + (K * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + ‖(H.gradCoordH1Function i).gradToVectorL2‖ ^ 2) ^ (1 / 2 : ℝ))) := hrowDepth + _ ≤ cubeBesovDepthWeight Q 1 j * + (K * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2) ^ (1 / 2 : ℝ))) := by + exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hroot hK) + (cubeBesovDepthWeight_nonneg Q 1 j) + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianTranslation.lean new file mode 100644 index 0000000000..d9bc9db64a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/HessianTranslation.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior + +/-! # Hessian Translation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +namespace HasWeakPartialDerivOn + +theorem congr_of_eqOn {d : ℕ} {U : Set (Vec d)} + (hU_meas : MeasurableSet U) {i : Fin d} + {u v gi hi : Vec d → ℝ} (huv : Set.EqOn u v U) + (hgi : Set.EqOn gi hi U) + (h : HasWeakPartialDerivOn U i u gi) : + HasWeakPartialDerivOn U i v hi := by + intro φ hφ hφ_supp hφ_sub + have hleft : + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change v x * (fderiv ℝ φ x) (basisVec i) = + u x * (fderiv ℝ φ x) (basisVec i) + rw [← huv hx] + have hright : + ∫ x in U, gi x * φ x ∂MeasureTheory.volume = + ∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change gi x * φ x = hi x * φ x + rw [hgi hx] + calc + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := hleft + _ = -∫ x in U, gi x * φ x ∂MeasureTheory.volume := + h φ hφ hφ_supp hφ_sub + _ = -∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + rw [hright] + +theorem translate {d : ℕ} {U : Set (Vec d)} {i : Fin d} + {u gi : Vec d → ℝ} (h : HasWeakPartialDerivOn U i u gi) (z : Vec d) : + HasWeakPartialDerivOn (translateSet z U) i + (fun x => u (x - z)) (fun x => gi (x - z)) := by + intro φ hφ hφ_supp hφ_sub + let V : Set (Vec d) := translateSet z U + let ψ : Vec d → ℝ := fun x => φ (x + z) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_id.add contDiff_const) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.addRight z) + simpa [ψ, Function.comp] using hφ_supp.comp_homeomorph (Homeomorph.addRight z) + have hψ_sub : tsupport ψ ⊆ U := by + intro x hx + have hx' : x + z ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.addRight z by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.addRight z)] at hx + exact hx + have hxV : x + z ∈ V := hφ_sub hx' + simpa [V, mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] using hxV + have hweak := h ψ hψ_smooth hψ_supp hψ_sub + have hmain : + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume = + -∫ x in U, gi x * φ (x + z) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ φ (x + z)) (basisVec i)) = + fun x => u x * (fderiv ℝ ψ x) (basisVec i) := by + funext x + have hderiv : + fderiv ℝ (fun y : Vec d => φ (y + z)) x = + fderiv ℝ φ (x + z) := by + simpa using (fderiv_comp_add_right (𝕜 := ℝ) (f := φ) (x := x) z) + simp [ψ, hderiv] + calc + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec i) ∂MeasureTheory.volume := by + rw [hfun] + _ = -∫ x in U, gi x * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, gi x * φ (x + z) ∂MeasureTheory.volume := by rfl + have hchange_left : + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := by + symm + simpa [V, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u (x - z) * (fderiv ℝ φ x) (basisVec i))) + have hchange_right : + ∫ x in U, gi x * φ (x + z) ∂MeasureTheory.volume = + ∫ x in V, gi (x - z) * φ x ∂MeasureTheory.volume := by + simpa [V, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => gi (x - z) * φ x)) + calc + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := + hchange_left + _ = -∫ x in U, gi x * φ (x + z) ∂MeasureTheory.volume := hmain + _ = -∫ x in V, gi (x - z) * φ x ∂MeasureTheory.volume := by + rw [hchange_right] + +end HasWeakPartialDerivOn + +namespace HasWeakHessianOn + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-- Translate a weak Hessian witness from `U` to `U + z`. -/ +noncomputable def translate (H : HasWeakHessianOn U u) (z : Vec d) : + HasWeakHessianOn (translateSet z U) (u.translate z) where + hess := fun i j x => H.hess i j (x - z) + hess_memL2 := by + intro i j + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + have hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + show MemScalarL2 V ((H.hess i j) ∘ T) + simpa [MemScalarL2, volumeMeasureOn, V, T, Function.comp] using + (H.hess_memL2 i j).comp_measurePreserving hμ + weak_second := by + intro i j + simpa [H1Function.translate] using + (H.weak_second i j).translate z + +theorem translate_hess (H : HasWeakHessianOn U u) (z : Vec d) + (i j : Fin d) (x : Vec d) : + (H.translate z).hess i j x = H.hess i j (x - z) := + rfl + +theorem norm_hessCoordToScalarL2_translate_eq + (H : HasWeakHessianOn U u) (z : Vec d) (i j : Fin d) : + ‖(H.translate z).hessCoordToScalarL2 i j‖ = ‖H.hessCoordToScalarL2 i j‖ := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + have hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + unfold hessCoordToScalarL2 Homogenization.toScalarL2 + rw [MeasureTheory.Lp.norm_toLp, MeasureTheory.Lp.norm_toLp] + exact congrArg ENNReal.toReal (by + simpa [HasWeakHessianOn.translate, MemScalarL2, volumeMeasureOn, V, T, Function.comp] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := H.hess i j) (p := (2 : ℝ≥0∞)) + (H.hess_memL2 i j).aestronglyMeasurable hμ)) + +theorem hessianCoordL2NormSum_translate_eq + (H : HasWeakHessianOn U u) (z : Vec d) : + (H.translate z).hessianCoordL2NormSum = H.hessianCoordL2NormSum := by + unfold hessianCoordL2NormSum + refine Finset.sum_congr rfl ?_ + intro i _hi + refine Finset.sum_congr rfl ?_ + intro j _hj + exact H.norm_hessCoordToScalarL2_translate_eq z i j + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/InnerCubeAndHessian.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/InnerCubeAndHessian.lean new file mode 100644 index 0000000000..fcfc438a5f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/InnerCubeAndHessian.lean @@ -0,0 +1,875 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuantCutoffLowerH1 + +/-! # Inner Cube And Hessian -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- Open-cube quantitative test-functional bound obtained by combining the +inner-cube Caccioppoli estimate with the weak-gradient handoff. This is the +uniform small-step form aimed at the weak Hessian limit argument. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_le_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub_inner : tsupport φ ⊆ scaledClosedCubeSet Q ρ₁) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (2 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume)) + + (1 / 2 : ℝ) * ∫ x in scaledClosedCubeSet Q ρ₁, φ x ^ 2 + ∂MeasureTheory.volume := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + let R : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) + have henergy : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((uQ.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R := by + simpa only [R, one_div] using! + h.directDifferenceQuotient_quantitativeCubeCutoff_openCube_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + hf hV hstep i η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + have hbound := + abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_of_inner_energy_quarter_le + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) (R := R) i j hVshift + (S := scaledClosedCubeSet Q ρ₁) hinnerV + hφ hφ_compact hφ_sub_inner henergy + simpa [R] using hbound + +/-- Open-cube homogeneous test-functional bound obtained by combining the +inner-cube Caccioppoli estimate with the full-gradient Cauchy handoff. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_le_sqrt_energy_bound_mul_l2_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub_inner : tsupport φ ⊆ scaledClosedCubeSet Q ρ₁) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + ((4 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume))) ^ (1 / (2 : ℝ)) * + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + let R : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) + have henergy : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((uQ.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R := by + simpa only [R, one_div] using! + h.directDifferenceQuotient_quantitativeCubeCutoff_openCube_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + hf hV hstep i η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + have hbound := + abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_sqrt_energy_bound_mul_l2 + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) (R := R) i j hVshift + (S := scaledClosedCubeSet Q ρ₁) hinnerV + hφ hφ_compact hφ_sub_inner henergy + simpa [R] using hbound + +/-- Open-cube version of the zero-seminorm well-definedness consequence for +the quotient Hessian test functional. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_zero_of_l2_norm_zero_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) + (hφ_sub_inner : tsupport φ ⊆ scaledClosedCubeSet Q ρ₁) + (hφ_zero : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = 0) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = 0 := by + let T : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume + change T = 0 + have hbound : + |T| ≤ + ((4 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume))) ^ (1 / (2 : ℝ)) * + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [T] using + h.abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_le_sqrt_energy_bound_mul_l2_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs hφ hφ_compact hφ_sub_inner + have hroot_zero : + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = 0 := by + rw [hφ_zero, Real.zero_rpow] + norm_num + have hle_zero : |T| ≤ 0 := by + calc + |T| ≤ + ((4 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume))) ^ (1 / (2 : ℝ)) * + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + hbound + _ = 0 := by + rw [hroot_zero, mul_zero] + exact abs_eq_zero.mp (le_antisymm hle_zero (abs_nonneg T)) + +/-- Open-cube version of the distance-zero well-definedness consequence for +the quotient Hessian test functional. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_l2_dist_zero_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + {φ ψ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hφ_compact : HasCompactSupport φ) (hψ_compact : HasCompactSupport ψ) + (hφ_sub_inner : tsupport φ ⊆ scaledClosedCubeSet Q ρ₁) + (hψ_sub_inner : tsupport ψ ⊆ scaledClosedCubeSet Q ρ₁) + (hφψ_zero : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = 0) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ ψ x) (basisVec j) ∂MeasureTheory.volume := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + let R : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) + have henergy : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((uQ.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R := by + simpa only [R, one_div] using! + h.directDifferenceQuotient_quantitativeCubeCutoff_openCube_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + hf hV hstep i η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + exact + neg_integral_forwardDifferenceQuotient_mul_fderiv_eq_of_l2_dist_zero_on_inner + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) (R := R) i j hVshift + (S := scaledClosedCubeSet Q ρ₁) hinnerV + hφ hψ hφ_compact hψ_compact hφ_sub_inner hψ_sub_inner henergy hφψ_zero + +/-- The open-cube quotient-Hessian pairing depends only on the scalar `L²` +class of a smooth weak test on the inner cube. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (φ ψ : H1WeakTestFunction (scaledClosedCubeSet Q ρ₁)) + (hφψ : φ.toScalarL2 = ψ.toScalarL2) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (ψ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume := by + have hφψ_zero : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = 0 := + integral_norm_sq_sub_eq_zero_of_h1WeakTestFunction_toScalarL2_eq φ ψ hφψ + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_l2_dist_zero_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + φ.smooth ψ.smooth φ.compactSupport ψ.compactSupport + φ.support_subset ψ.support_subset hφψ_zero + +/-- The explicit square-root bound controlling the smooth-test +quotient-Hessian functional on an inner cube. -/ +noncomputable def openCubeInnerQuotientHessianSmoothTestBound + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (f : Vec d → ℝ) + (i : Fin d) {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) : ℝ := + ((4 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume))) ^ (1 / (2 : ℝ)) + +/-- The concrete linear functional on the dense smooth-test `ScalarL2` +submodule induced by one quotient-Hessian pairing. -/ +noncomputable def openCubeInnerQuotientHessianSmoothTestFunctional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁) →ₗ[ℝ] ℝ := by + let S : Set (Vec d) := scaledClosedCubeSet Q ρ₁ + let rep : + h1WeakTestScalarL2Submodule (d := d) S → H1WeakTestFunction S := + h1WeakTestScalarL2Representative + let pairing : H1WeakTestFunction S → ℝ := fun φ => + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + refine + { toFun := fun x => pairing (rep x) + map_add' := ?_ + map_smul' := ?_ } + · intro x y + have hrep_add_eq : + pairing (rep (x + y)) = pairing ((rep x).add (rep y)) := by + unfold pairing + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + (rep (x + y)) ((rep x).add (rep y)) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_add, + h1WeakTestScalarL2Representative_toScalarL2, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_add : + pairing ((rep x).add (rep y)) = pairing (rep x) + pairing (rep y) := by + simpa [pairing, S] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_add + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) i j hVshift (S := S) (by simpa [S] using hinnerV) + (rep x) (rep y) + exact hrep_add_eq.trans hpair_add + · intro c x + have hrep_smul_eq : + pairing (rep (c • x)) = pairing ((rep x).smul c) := by + unfold pairing + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + (rep (c • x)) ((rep x).smul c) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_smul, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_smul : + pairing ((rep x).smul c) = c * pairing (rep x) := by + simpa [pairing, S] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_smul + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) i j hVshift (S := S) (by simpa [S] using hinnerV) + c (rep x) + calc + pairing (rep (c • x)) = pairing ((rep x).smul c) := hrep_smul_eq + _ = c * pairing (rep x) := hpair_smul + _ = c • pairing (rep x) := by rfl + +/-- The concrete smooth-test functional satisfies the square-root operator +bound needed by the dense-domain extension API. -/ +theorem norm_openCubeInnerQuotientHessianSmoothTestFunctional_apply_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (x : h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)) : + ‖openCubeInnerQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)).subtype x)‖ := by + let φ : H1WeakTestFunction (scaledClosedCubeSet Q ρ₁) := + h1WeakTestScalarL2Representative x + have hbound := + h.abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_le_sqrt_energy_bound_mul_l2_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + φ.smooth φ.compactSupport φ.support_subset + have hroot : + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)).subtype x)‖ := by + calc + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖φ.toScalarL2‖ := + integral_norm_sq_rpow_half_eq_norm_h1WeakTestFunction_toScalarL2 φ + _ = ‖((h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)).subtype x)‖ := by + rw [show φ.toScalarL2 = + ((h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)).subtype x) by + simpa [φ, Submodule.subtype] using h1WeakTestScalarL2Representative_toScalarL2 x] + calc + ‖openCubeInnerQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x‖ = + |(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)| := by + change ‖(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)‖ = + |(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)| + rw [Real.norm_eq_abs] + _ ≤ openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [openCubeInnerQuotientHessianSmoothTestBound, φ] using hbound + _ = openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledClosedCubeSet Q ρ₁)).subtype x)‖ := by + rw [hroot] + +/-- Product-rule form of the cutoff energy test. -/ +theorem test_mulContDiffHasCompactSupport_expanded + (h : WeakPoissonEquationOn U u f) + (hU : IsOpenBoundedConvexDomain U) (hf : MemScalarL2 U f) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + ∫ x in U, + vecDot (u.grad x) + (fun j => φ x * u.grad x j + u x * (fderiv ℝ φ x) (basisVec j)) + ∂MeasureTheory.volume = + ∫ x in U, f x * (φ x * u.toFun x) ∂MeasureTheory.volume := by + have htest := + h.test_mulContDiffHasCompactSupportToH10 hU hf hφ hφ_compact hφ_sub + have hgrad_ae := + mulContDiffHasCompactSupportToH10_grad_ae u hU hφ hφ_compact hφ_sub + have hleft : + ∫ x in U, + vecDot (u.grad x) + ((u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, + vecDot (u.grad x) + (fun j => φ x * u.grad x j + u x * (fderiv ℝ φ x) (basisVec j)) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + simp [hx] + simpa [hleft] using htest + +/-- Coordinatewise gradient identification for the forward localized +difference-quotient test. The `H¹₀` constructor is chosen through membership +data, so the product-rule gradient is recovered by weak-derivative uniqueness +on the open interior domain. -/ +theorem cutoffForwardDifferenceQuotientToH10_grad_coord_ae + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (fun x => + (u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + let ψ : H10Function V := + u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub + let w : H1Function V := + u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift + let wφ : H1Function V := w.mulContDiffHasCompactSupport hφ hφ_compact + have hψ_fun : ψ.toH1Function.toFun = wφ.toFun := by + funext x + simp [ψ, wφ, w] + have hψ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => ψ.toH1Function.grad x j) V MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((ψ.toH1Function.gradMemL2 j).locallyIntegrable (by norm_num)) + have hwφ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => wφ.grad x j) V MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((wφ.gradMemL2 j).locallyIntegrable (by norm_num)) + have hψ_weak : + HasWeakPartialDerivOn V j ψ.toH1Function.toFun + (fun x => ψ.toH1Function.grad x j) := + ψ.toH1Function.hasWeakPartialDerivOn j + have hwφ_weak : + HasWeakPartialDerivOn V j ψ.toH1Function.toFun + (fun x => wφ.grad x j) := by + rw [hψ_fun] + exact wφ.hasWeakPartialDerivOn j + have hae := + HasWeakPartialDerivOn.ae_eq hV.isOpen hψ_loc hwφ_loc hψ_weak hwφ_weak + simpa [ψ, wφ, w, H1Function.mulContDiffHasCompactSupport_grad] using hae + +/-- Coordinatewise gradient identification for the backward localized +difference-quotient test. -/ +theorem cutoffBackwardDifferenceQuotientToH10_grad_coord_ae + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i j : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (fun x => + (u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + let ψ : H10Function V := + u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub + let w : H1Function V := + u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift + let wφ : H1Function V := w.mulContDiffHasCompactSupport hφ hφ_compact + have hψ_fun : ψ.toH1Function.toFun = wφ.toFun := by + funext x + simp [ψ, wφ, w] + have hψ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => ψ.toH1Function.grad x j) V MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((ψ.toH1Function.gradMemL2 j).locallyIntegrable (by norm_num)) + have hwφ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => wφ.grad x j) V MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((wφ.gradMemL2 j).locallyIntegrable (by norm_num)) + have hψ_weak : + HasWeakPartialDerivOn V j ψ.toH1Function.toFun + (fun x => ψ.toH1Function.grad x j) := + ψ.toH1Function.hasWeakPartialDerivOn j + have hwφ_weak : + HasWeakPartialDerivOn V j ψ.toH1Function.toFun + (fun x => wφ.grad x j) := by + rw [hψ_fun] + exact wφ.hasWeakPartialDerivOn j + have hae := + HasWeakPartialDerivOn.ae_eq hV.isOpen hψ_loc hwφ_loc hψ_weak hwφ_weak + simpa [ψ, wφ, w, H1Function.mulContDiffHasCompactSupport_grad] using hae + +/-- Vector-valued a.e. gradient identification for the forward localized +difference-quotient test. -/ +theorem cutoffForwardDifferenceQuotientToH10_grad_ae + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (fun x => + (u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x j => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + have hcoord : + ∀ j : Fin d, + (fun x => + (u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + intro j + exact cutoffForwardDifferenceQuotientToH10_grad_coord_ae + u hV hVU step i j hVshift hφ hφ_compact hφ_sub + filter_upwards [(Filter.eventually_all (l := MeasureTheory.ae (MeasureTheory.volume.restrict V))).2 hcoord] with x hx + ext j + exact hx j + +/-- Vector-valued a.e. gradient identification for the backward localized +difference-quotient test. -/ +theorem cutoffBackwardDifferenceQuotientToH10_grad_ae + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (fun x => + (u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x j => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + have hcoord : + ∀ j : Fin d, + (fun x => + (u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict V] + fun x => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) := by + intro j + exact cutoffBackwardDifferenceQuotientToH10_grad_coord_ae + u hV hVU step i j hVshift hφ hφ_compact hφ_sub + filter_upwards [(Filter.eventually_all (l := MeasureTheory.ae (MeasureTheory.volume.restrict V))).2 hcoord] with x hx + ext j + exact hx j + +/-- Expanded weak-test identity for a forward localized difference quotient. +This is the product-rule form of +`restrict_test_cutoffForwardDifferenceQuotientToH10`. -/ +theorem restrict_test_cutoffForwardDifferenceQuotient_expanded + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + (fun j => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + f x * (φ x * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have htest := + h.restrict_test_cutoffForwardDifferenceQuotientToH10 + hV hVU hfV step i hVshift hφ hφ_compact hφ_sub + have hgrad_ae := + cutoffForwardDifferenceQuotientToH10_grad_ae + u hV hVU step i hVshift hφ hφ_compact hφ_sub + have hleft : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + ((u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + (fun j => + φ x * (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + simp [hx] + simpa [hleft] using htest + +/-- Expanded weak-test identity for a backward localized difference quotient. -/ +theorem restrict_test_cutoffBackwardDifferenceQuotient_expanded + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + (fun j => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume = + ∫ x in V, + f x * (φ x * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have htest := + h.restrict_test_cutoffBackwardDifferenceQuotientToH10 + hV hVU hfV step i hVshift hφ hφ_compact hφ_sub + have hgrad_ae := + cutoffBackwardDifferenceQuotientToH10_grad_ae + u hV hVU step i hVshift hφ hφ_compact hφ_sub + have hleft : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + ((u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + (fun j => + φ x * (u.backwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanBackwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j)) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + simp [hx] + simpa [hleft] using htest + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/IntegralIdentity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/IntegralIdentity.lean new file mode 100644 index 0000000000..ca6ea8a760 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/IntegralIdentity.lean @@ -0,0 +1,832 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SqCutoffH10 + +/-! # Integral Identity -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- The same direct-test identity with the explicit ambient gradient expanded +as the difference of the unshifted and shifted localized gradients. -/ +theorem test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_gradientSplit + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (u.grad x) + (step⁻¹ • + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x - + (localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x)) + ∂MeasureTheory.volume = + ∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume := by + simpa using + h.test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_explicitGradient + hU hf hV hVU step i hVshift hη hη_compact hη_sub + +/-- The split direct-test gradient pairing reduces to two interior pairings: +the unshifted pairing against `G(x)` and the transported shifted pairing +against `G(x+h e_i)`. -/ +theorem integral_vecDot_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_sub_integrals_on + {G : Vec d → Vec d} (hG : MemVectorL2 U G) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (G x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, + vecDot (G x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume - + ∫ x in V, + vecDot (G (euclideanCoordShift step i x)) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume) := by + let F : H1Function U := + localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let S : H1Function U := + localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let T : H1Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hFInt : MeasureTheory.IntegrableOn (fun x => vecDot (G x) (F.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hG F.grad_memVectorL2 + have hSInt : MeasureTheory.IntegrableOn (fun x => vecDot (G x) (S.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hG S.grad_memVectorL2 + have hFtransport : + ∫ x in U, vecDot (G x) (F.grad x) ∂MeasureTheory.volume = + ∫ x in V, vecDot (G x) (F.grad x) ∂MeasureTheory.volume := by + simpa [F] using + integral_vecDot_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_integral_on + (U := U) (V := V) G u hV hVU step i hVshift hη hη_compact hη_sub + have hStransport : + ∫ x in U, vecDot (G x) (S.grad x) ∂MeasureTheory.volume = + ∫ x in V, vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume := by + simpa [F, S] using + integral_vecDot_localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_eq_integral_on + (U := U) (V := V) G u hV hVU step i hVshift hη hη_compact hη_sub + calc + ∫ x in U, vecDot (G x) (T.grad x) ∂MeasureTheory.volume = + ∫ x in U, + step⁻¹ * (vecDot (G x) (F.grad x) - vecDot (G x) (S.grad x)) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [T, F, S, vecDot_smul_right, vecDot_add_right, vecDot_neg_right, + sub_eq_add_neg] + ring + _ = step⁻¹ * + ∫ x in U, (vecDot (G x) (F.grad x) - vecDot (G x) (S.grad x)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in U, vecDot (G x) (F.grad x) ∂MeasureTheory.volume - + ∫ x in U, vecDot (G x) (S.grad x) ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub hFInt hSInt] + _ = step⁻¹ * + (∫ x in V, vecDot (G x) (F.grad x) ∂MeasureTheory.volume - + ∫ x in V, vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume) := by + rw [hFtransport, hStransport] + _ = step⁻¹ * + (∫ x in V, + vecDot (G x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume - + ∫ x in V, + vecDot (G (euclideanCoordShift step i x)) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume) := by + rfl + +/-- The transported split is the negative of the interior pairing with the +forward quotient of the vector field `G`. -/ +theorem integral_vecDot_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_neg_integral_forwardDifferenceQuotient_on + {G : Vec d → Vec d} (hG : MemVectorL2 U G) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hGshiftV : MemVectorL2 V (fun x => G (euclideanCoordShift step i x))) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (G x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + -∫ x in V, + vecDot + (fun j => euclideanForwardDifferenceQuotient step i (fun y => G y j) x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := by + let F : H1Function U := + localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hsplit : + ∫ x in U, + vecDot (G x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, vecDot (G x) (F.grad x) ∂MeasureTheory.volume - + ∫ x in V, vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume) := by + simpa [F] using + integral_vecDot_backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_sub_integrals_on + (U := U) (V := V) (G := G) hG u hV hVU step i hVshift + hη hη_compact hη_sub + have hGV : MemVectorL2 V G := by + exact hG.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + have hFV : MemVectorL2 V F.grad := by + exact F.grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + have hAInt : + MeasureTheory.IntegrableOn (fun x => vecDot (G x) (F.grad x)) V := + integrableOn_vecDot_of_memVectorL2 hGV hFV + have hBInt : + MeasureTheory.IntegrableOn + (fun x => vecDot (G (euclideanCoordShift step i x)) (F.grad x)) V := + integrableOn_vecDot_of_memVectorL2 hGshiftV hFV + have hquot : + ∫ x in V, + vecDot + (fun j => euclideanForwardDifferenceQuotient step i (fun y => G y j) x) + (F.grad x) + ∂MeasureTheory.volume = + step⁻¹ * + (∫ x in V, vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (G x) (F.grad x) ∂MeasureTheory.volume) := by + calc + ∫ x in V, + vecDot + (fun j => euclideanForwardDifferenceQuotient step i (fun y => G y j) x) + (F.grad x) + ∂MeasureTheory.volume = + ∫ x in V, + step⁻¹ * + (vecDot (G (euclideanCoordShift step i x)) (F.grad x) - + vecDot (G x) (F.grad x)) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [vecDot, euclideanForwardDifferenceQuotient, div_eq_mul_inv] + calc + ∑ j, + (G (x + step • basisVec i) j - G x j) * step⁻¹ * F.grad x j = + ∑ j, + step⁻¹ * + (G (x + step • basisVec i) j * F.grad x j - + G x j * F.grad x j) := by + refine Finset.sum_congr rfl ?_ + intro j _hj + ring + _ = step⁻¹ * + ∑ j, + (G (x + step • basisVec i) j * F.grad x j - + G x j * F.grad x j) := by + rw [Finset.mul_sum] + _ = step⁻¹ * + (∑ j, G (x + step • basisVec i) j * F.grad x j - + ∑ j, G x j * F.grad x j) := by + rw [Finset.sum_sub_distrib] + _ = step⁻¹ * + ∫ x in V, + (vecDot (G (euclideanCoordShift step i x)) (F.grad x) - + vecDot (G x) (F.grad x)) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = step⁻¹ * + (∫ x in V, vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume - + ∫ x in V, vecDot (G x) (F.grad x) ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_sub hBInt hAInt] + rw [hsplit, hquot] + ring + +/-- Shifted gradients remain `L²` on a shift-safe interior set. -/ +theorem memVectorL2_grad_comp_euclideanCoordShift_of_shift_subset + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) : + MemVectorL2 V (fun x => u.grad (euclideanCoordShift step i x)) := by + let uShift : H1Function V := + (u.translate ((-step) • basisVec i)).restrict hV.isOpen hVshift + simpa [uShift, H1Function.restrict, H1Function.translate, euclideanCoordShift, + sub_eq_add_neg, neg_smul] using uShift.grad_memVectorL2 + +/-- The gradient of the forward quotient is the coordinatewise forward +quotient of the gradient. -/ +theorem forwardDifferenceQuotientOn_grad_eq_vectorForwardDifferenceQuotient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) (x : Vec d) : + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x = + fun j => euclideanForwardDifferenceQuotient step i (fun y => u.grad y j) x := by + ext j + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv] + ring + +/-- Weak-gradient identity for one coordinate of a forward difference quotient. + +This is the distributional handoff used by the Hessian limit argument: each +coordinate of `∇D_i^+u` pairs against a test as `D_i^+u` paired against the +corresponding test derivative. -/ +theorem integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j * φ x + ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume := by + have hweak := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).hasWeakGradient + j φ hφ hφ_compact hφ_sub + have hweak' : + ∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = + -∫ x in V, + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j * φ x + ∂MeasureTheory.volume := by + simpa using hweak + linarith + +/-- Coordinatewise `L²` pairing bound by the full vector energy and the scalar +test energy. -/ +theorem abs_integral_coord_mul_le_half_integral_vecNormSq_add_half_integral_sq_of_memVectorL2_memScalarL2 + {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hG : MemVectorL2 U G) (hφ : MemScalarL2 U φ) (j : Fin d) : + |∫ x in U, G x j * φ x ∂MeasureTheory.volume| ≤ + (1 / 2 : ℝ) * ∫ x in U, vecNormSq (G x) ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, φ x ^ 2 ∂MeasureTheory.volume := by + have hGj : MemScalarL2 U (fun x => G x j) := + memScalarL2_coord_of_memVectorL2 hG j + have hprod : MeasureTheory.IntegrableOn (fun x => G x j * φ x) U := + hGj.integrable_mul hφ + have hprod_abs : + MeasureTheory.IntegrableOn (fun x => |G x j * φ x|) U := by + simpa [Real.norm_eq_abs] using! hprod.norm + have hGsq : + MeasureTheory.IntegrableOn (fun x => vecNormSq (G x)) U := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hG hG + have hφsq : + MeasureTheory.IntegrableOn (fun x => φ x ^ 2) U := by + simpa [pow_two, MeasureTheory.IntegrableOn, volumeMeasureOn] using! + hφ.integrable_mul hφ + have hright_int : + MeasureTheory.IntegrableOn + (fun x => (1 / 2 : ℝ) * vecNormSq (G x) + (1 / 2 : ℝ) * φ x ^ 2) U := + (hGsq.const_mul (1 / 2 : ℝ)).add (hφsq.const_mul (1 / 2 : ℝ)) + have hpoint : + (fun x => |G x j * φ x|) ≤ᵐ[MeasureTheory.volume.restrict U] + fun x => (1 / 2 : ℝ) * vecNormSq (G x) + (1 / 2 : ℝ) * φ x ^ 2 := by + filter_upwards with x + have hyoung : + |G x j * φ x| ≤ + (1 / 2 : ℝ) * (G x j) ^ 2 + (1 / 2 : ℝ) * φ x ^ 2 := by + have hsq := sq_nonneg (|G x j| - |φ x|) + rw [sub_sq, sq_abs, sq_abs] at hsq + have habs_mul : |G x j * φ x| = |G x j| * |φ x| := + abs_mul (G x j) (φ x) + nlinarith + have hcoord : (G x j) ^ 2 ≤ vecNormSq (G x) := + coord_sq_le_vecNormSq (G x) j + nlinarith + have hmono := + MeasureTheory.integral_mono_ae hprod_abs hright_int hpoint + have habs_integral : + |∫ x in U, G x j * φ x ∂MeasureTheory.volume| ≤ + ∫ x in U, |G x j * φ x| ∂MeasureTheory.volume := by + simpa using + (MeasureTheory.abs_integral_le_integral_abs + (f := fun x => G x j * φ x) + (μ := MeasureTheory.volume.restrict U)) + have hright_eq : + ∫ x in U, + ((1 / 2 : ℝ) * vecNormSq (G x) + (1 / 2 : ℝ) * φ x ^ 2) + ∂MeasureTheory.volume = + (1 / 2 : ℝ) * ∫ x in U, vecNormSq (G x) ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in U, φ x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add (hGsq.const_mul (1 / 2 : ℝ)) + (hφsq.const_mul (1 / 2 : ℝ))] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + exact habs_integral.trans (hmono.trans_eq hright_eq) + +/-- Version of the coordinatewise `L²` pairing bound localized by support: +when the scalar test is supported in `S ⊆ V`, only the energy on `S` appears. -/ +theorem abs_integral_coord_mul_le_half_integral_subset_vecNormSq_add_half_integral_subset_sq_of_support_subset + {S V : Set (Vec d)} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hSV : S ⊆ V) (hφ_support : Function.support φ ⊆ S) + (hG : MemVectorL2 V G) (hφS : MemScalarL2 S φ) (j : Fin d) : + |∫ x in V, G x j * φ x ∂MeasureTheory.volume| ≤ + (1 / 2 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume + + (1 / 2 : ℝ) * ∫ x in S, φ x ^ 2 ∂MeasureTheory.volume := by + have hprod_support : + Function.support (fun x => G x j * φ x) ⊆ S := by + intro x hx + exact hφ_support (by + intro hφx + exact hx (by simp [hφx])) + have hrestrict : + ∫ x in V, G x j * φ x ∂MeasureTheory.volume = + ∫ x in S, G x j * φ x ∂MeasureTheory.volume := + integral_subset_of_support_subset (U := V) (V := S) hSV hprod_support + have hGS : MemVectorL2 S G := + hG.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hSV) + rw [hrestrict] + exact + abs_integral_coord_mul_le_half_integral_vecNormSq_add_half_integral_sq_of_memVectorL2_memScalarL2 + (U := S) hGS hφS j + +/-- Coordinatewise Cauchy-Schwarz pairing bound in `L²`. Unlike the Young +form above, this is homogeneous in the test norm and is the shape needed for a +Riesz/weak-limit handoff. -/ +theorem abs_integral_coord_mul_le_l2_mul_l2_of_memVectorL2_memScalarL2 + {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hG : MemVectorL2 U G) (hφ : MemScalarL2 U φ) (j : Fin d) : + |∫ x in U, G x j * φ x ∂MeasureTheory.volume| ≤ + (∫ x in U, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in U, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + have hGj : MemScalarL2 U (fun x => G x j) := + memScalarL2_coord_of_memVectorL2 hG j + have hprod : MeasureTheory.IntegrableOn (fun x => G x j * φ x) U := + hGj.integrable_mul hφ + have habs_integral : + |∫ x in U, G x j * φ x ∂MeasureTheory.volume| ≤ + ∫ x in U, |G x j * φ x| ∂MeasureTheory.volume := by + simpa using + (MeasureTheory.abs_integral_le_integral_abs + (f := fun x => G x j * φ x) + (μ := MeasureTheory.volume.restrict U)) + have hnorm_eq : + ∫ x in U, |G x j * φ x| ∂MeasureTheory.volume = + ∫ x in U, ‖G x j‖ * ‖φ x‖ ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [abs_mul, Real.norm_eq_abs] + have hGj_ofReal : + MeasureTheory.MemLp (fun x => G x j) (ENNReal.ofReal (2 : ℝ)) + (MeasureTheory.volume.restrict U) := by + simpa [MemScalarL2, volumeMeasureOn] using hGj + have hφ_ofReal : + MeasureTheory.MemLp φ (ENNReal.ofReal (2 : ℝ)) + (MeasureTheory.volume.restrict U) := by + simpa [MemScalarL2, volumeMeasureOn] using hφ + have hholder : + ∫ x in U, ‖G x j‖ * ‖φ x‖ ∂MeasureTheory.volume ≤ + (∫ x in U, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in U, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa using + MeasureTheory.integral_mul_norm_le_Lp_mul_Lq + (μ := MeasureTheory.volume.restrict U) + (f := fun x => G x j) (g := φ) + Real.HolderConjugate.two_two hGj_ofReal hφ_ofReal + exact habs_integral.trans (hnorm_eq.trans_le hholder) + +/-- Support-localized Cauchy-Schwarz pairing bound. -/ +theorem abs_integral_coord_mul_le_l2_mul_l2_subset_of_support_subset + {S V : Set (Vec d)} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hSV : S ⊆ V) (hφ_support : Function.support φ ⊆ S) + (hG : MemVectorL2 V G) (hφS : MemScalarL2 S φ) (j : Fin d) : + |∫ x in V, G x j * φ x ∂MeasureTheory.volume| ≤ + (∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + have hprod_support : + Function.support (fun x => G x j * φ x) ⊆ S := by + intro x hx + exact hφ_support (by + intro hφx + exact hx (by simp [hφx])) + have hrestrict : + ∫ x in V, G x j * φ x ∂MeasureTheory.volume = + ∫ x in S, G x j * φ x ∂MeasureTheory.volume := + integral_subset_of_support_subset (U := V) (V := S) hSV hprod_support + have hGS : MemVectorL2 S G := + hG.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hSV) + rw [hrestrict] + exact + abs_integral_coord_mul_le_l2_mul_l2_of_memVectorL2_memScalarL2 + (U := S) hGS hφS j + +/-- The `L²` energy of one coordinate is bounded by the full vector-field +energy. -/ +theorem integral_coord_norm_rpow_two_le_integral_vecNormSq_of_memVectorL2 + {G : Vec d → Vec d} (hG : MemVectorL2 U G) (j : Fin d) : + ∫ x in U, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume ≤ + ∫ x in U, vecNormSq (G x) ∂MeasureTheory.volume := by + have hGj : MemScalarL2 U (fun x => G x j) := + memScalarL2_coord_of_memVectorL2 hG j + have hleft_int : + MeasureTheory.IntegrableOn (fun x => ‖G x j‖ ^ (2 : ℝ)) U := by + simpa [Real.rpow_two, Real.norm_eq_abs, sq_abs, pow_two, + MeasureTheory.IntegrableOn, volumeMeasureOn] using! hGj.integrable_mul hGj + have hright_int : + MeasureTheory.IntegrableOn (fun x => vecNormSq (G x)) U := by + simpa [vecNormSq] using integrableOn_vecDot_of_memVectorL2 hG hG + have hpoint : + (fun x => ‖G x j‖ ^ (2 : ℝ)) ≤ᵐ[MeasureTheory.volume.restrict U] + fun x => vecNormSq (G x) := by + filter_upwards with x + rw [Real.rpow_two, Real.norm_eq_abs, sq_abs] + exact coord_sq_le_vecNormSq (G x) j + exact MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + +/-- Homogeneous weak-Hessian handoff from the quotient-gradient coordinate to +the distributional second-derivative test functional. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_l2_mul_l2_on_inner + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_subS : tsupport φ ⊆ S) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (∫ x in S, + ‖(u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j‖ ^ + (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + have hpair := + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU i j hVshift + hφ hφ_compact (hφ_subS.trans hSV) + have hφS : MemScalarL2 S φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict S + have hbound : + |∫ x in V, G x j * φ x ∂MeasureTheory.volume| ≤ + (∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + abs_integral_coord_mul_le_l2_mul_l2_subset_of_support_subset + (S := S) (V := V) (G := G) (φ := φ) + hSV ((subset_tsupport φ).trans hφ_subS) + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + hφS j + rw [← hpair] + simpa [G] using hbound + +/-- Homogeneous weak-Hessian handoff controlled by the full quotient-gradient +energy on the inner set. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_grad_l2_mul_l2_on_inner + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_subS : tsupport φ ⊆ S) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + have hbase : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + (∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [G] using + abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_l2_mul_l2_on_inner + (U := U) (V := V) u hV hVU i j hVshift hSV + hφ hφ_compact hφ_subS + have hG : MemVectorL2 S G := + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hSV) + have hcoord_le : + ∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume ≤ + ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume := + integral_coord_norm_rpow_two_le_integral_vecNormSq_of_memVectorL2 + (U := S) hG j + have hcoord_nonneg : + 0 ≤ ∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume := + MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + have hroot_le : + (∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) ≤ + (∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + Real.rpow_le_rpow hcoord_nonneg hcoord_le (by norm_num) + have htest_root_nonneg : + 0 ≤ (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + Real.rpow_nonneg + (MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _)) _ + have hmul : + (∫ x in S, ‖G x j‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) ≤ + (∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + mul_le_mul_of_nonneg_right hroot_le htest_root_nonneg + exact hbase.trans (by simpa [G] using hmul) + +/-- Homogeneous weak-Hessian handoff from an inner full-gradient energy bound. -/ +theorem abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_sqrt_energy_bound_mul_l2 + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step R : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_subS : tsupport φ ⊆ S) + (henergy : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R) : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + ((4 : ℝ) * R) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + let E : ℝ := + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume + have hbase : + |(-∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume)| ≤ + E ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [E] using + abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_grad_l2_mul_l2_on_inner + (U := U) (V := V) u hV hVU i j hVshift hSV + hφ hφ_compact hφ_subS + have hE_nonneg : 0 ≤ E := by + dsimp [E] + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => vecNormSq_nonneg _) + have hE_le : E ≤ (4 : ℝ) * R := by + change (1 / 4 : ℝ) * E ≤ R at henergy + nlinarith + have hroot_le : E ^ (1 / (2 : ℝ)) ≤ ((4 : ℝ) * R) ^ (1 / (2 : ℝ)) := + Real.rpow_le_rpow hE_nonneg hE_le (by norm_num) + have htest_root_nonneg : + 0 ≤ (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + Real.rpow_nonneg + (MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _)) _ + have hmul : + E ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) ≤ + ((4 : ℝ) * R) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + mul_le_mul_of_nonneg_right hroot_le htest_root_nonneg + exact hbase.trans hmul + +/-- If the inner `L²` seminorm of the smooth test is zero, then the +distributional quotient-Hessian pairing vanishes. This is the elementary +well-definedness plank needed before extending the bounded test functional to +the `L²` quotient space. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_eq_zero_of_l2_norm_zero_on_inner + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step R : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_subS : tsupport φ ⊆ S) + (henergy : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R) + (hφ_zero : + ∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = 0) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = 0 := by + let T : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume + change T = 0 + have hbound : + |T| ≤ + ((4 : ℝ) * R) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [T] using + abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_le_sqrt_energy_bound_mul_l2 + (U := U) (V := V) u hV hVU + (step := step) (R := R) i j hVshift hSV + hφ hφ_compact hφ_subS henergy + have hroot_zero : + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = 0 := by + rw [hφ_zero, Real.zero_rpow] + norm_num + have hle_zero : |T| ≤ 0 := by + calc + |T| ≤ + ((4 : ℝ) * R) ^ (1 / (2 : ℝ)) * + (∫ x in S, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := + hbound + _ = 0 := by + rw [hroot_zero, mul_zero] + exact abs_eq_zero.mp (le_antisymm hle_zero (abs_nonneg T)) + +/-- If two smooth compact tests have zero `L²` distance on the inner support +set, then they give the same distributional quotient-Hessian pairing. The +proof rewrites the derivative-side pairing through the weak-gradient identity, +so the linearity step happens on the value side as ordinary `L²` algebra. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_eq_of_l2_dist_zero_on_inner + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step R : ℝ} (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {S : Set (Vec d)} (hSV : S ⊆ V) + {φ ψ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (hφ_compact : HasCompactSupport φ) (hψ_compact : HasCompactSupport ψ) + (hφ_subS : tsupport φ ⊆ S) (hψ_subS : tsupport ψ ⊆ S) + (henergy : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ R) + (hφψ_zero : + ∫ x in S, ‖φ x - ψ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = 0) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ ψ x) (basisVec j) ∂MeasureTheory.volume := by + let χ : Vec d → ℝ := fun x => φ x - ψ x + let w : H1Function V := u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift + let G : Vec d → ℝ := fun x => w.grad x j + let Tφ : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ φ x) (basisVec j) ∂MeasureTheory.volume + let Tψ : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ ψ x) (basisVec j) ∂MeasureTheory.volume + let Tχ : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i u.toFun x * + (fderiv ℝ χ x) (basisVec j) ∂MeasureTheory.volume + change Tφ = Tψ + have hχ : ContDiff ℝ (⊤ : ℕ∞) χ := by + simpa [χ] using hφ.sub hψ + have hχ_compact : HasCompactSupport χ := by + simpa [χ] using! hφ_compact.sub hψ_compact + have hχ_subS : tsupport χ ⊆ S := by + intro x hx + have hx' : x ∈ tsupport φ ∪ tsupport ψ := by + simpa [χ] using tsupport_sub φ ψ hx + rcases hx' with hxφ | hxψ + · exact hφ_subS hxφ + · exact hψ_subS hxψ + have hχ_zero : + ∫ x in S, ‖χ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = 0 := by + simpa [χ] using hφψ_zero + have hTχ_zero : Tχ = 0 := by + simpa [Tχ, χ] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_eq_zero_of_l2_norm_zero_on_inner + (U := U) (V := V) u hV hVU + (step := step) (R := R) i j hVshift hSV + hχ hχ_compact hχ_subS henergy hχ_zero + have hpairχ : + ∫ x in V, G x * χ x ∂MeasureTheory.volume = Tχ := by + simpa [G, w, Tχ] using + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU + (step := step) i j hVshift hχ hχ_compact (hχ_subS.trans hSV) + have hpairφ : + ∫ x in V, G x * φ x ∂MeasureTheory.volume = Tφ := by + simpa [G, w, Tφ] using + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU + (step := step) i j hVshift hφ hφ_compact (hφ_subS.trans hSV) + have hpairψ : + ∫ x in V, G x * ψ x ∂MeasureTheory.volume = Tψ := by + simpa [G, w, Tψ] using + integral_forwardDifferenceQuotientOn_grad_coord_mul_eq_neg_integral_forwardDifferenceQuotient_mul_fderiv + (U := U) (V := V) u hV hVU + (step := step) i j hVshift hψ hψ_compact (hψ_subS.trans hSV) + have hG : MemScalarL2 V G := by + simpa [G, w] using (w.gradMemL2 j) + have hφV : MemScalarL2 V φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict V + have hψV : MemScalarL2 V ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict V + have hGφ_int : + MeasureTheory.Integrable (fun x => G x * φ x) + (MeasureTheory.volume.restrict V) := by + simpa [volumeMeasureOn] using! hG.integrable_mul hφV + have hGψ_int : + MeasureTheory.Integrable (fun x => G x * ψ x) + (MeasureTheory.volume.restrict V) := by + simpa [volumeMeasureOn] using! hG.integrable_mul hψV + have hlin : + ∫ x in V, G x * χ x ∂MeasureTheory.volume = + ∫ x in V, G x * φ x ∂MeasureTheory.volume - + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := by + calc + ∫ x in V, G x * χ x ∂MeasureTheory.volume = + ∫ x in V, (G x * φ x) - (G x * ψ x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [χ] + ring + _ = ∫ x in V, G x * φ x ∂MeasureTheory.volume - + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hGφ_int hGψ_int] + have hTχ_eq : Tχ = Tφ - Tψ := by + calc + Tχ = ∫ x in V, G x * χ x ∂MeasureTheory.volume := hpairχ.symm + _ = ∫ x in V, G x * φ x ∂MeasureTheory.volume - + ∫ x in V, G x * ψ x ∂MeasureTheory.volume := hlin + _ = Tφ - Tψ := by rw [hpairφ, hpairψ] + have hdiff_zero : Tφ - Tψ = 0 := by + rw [← hTχ_eq] + exact hTχ_zero + exact sub_eq_zero.mp hdiff_zero + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessian.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessian.lean new file mode 100644 index 0000000000..edb59a7eb6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessian.lean @@ -0,0 +1,775 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.QuotientHessianRiesz + +/-! # Limit Hessian -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +/-! +# Limiting Hessian functional + +This file isolates the final compactness/limit handoff for the interior +difference-quotient proof. The hypothesis is deliberately narrow: for a +small-step sequence, the already-built quotient Hessian pairings converge on +smooth tests to the desired pairing against `uQ.grad`. From that hypothesis +and the uniform quotient estimate, we build the bounded limiting functional. +-/ + +/-- The concrete fixed-step quotient-Hessian pairing on a smooth open-inner +test. -/ +def openCubeInnerOpenCubeQuotientHessianPairing + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (V : Set (Vec d)) (step : ℝ) (i j : Fin d) {ρ₁ : ℝ} + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : ℝ := + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + +/-- The limiting Hessian pairing on a smooth open-inner test. -/ +def openCubeInnerOpenCubeLimitHessianPairing + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (V : Set (Vec d)) (i j : Fin d) {ρ₁ : ℝ} + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : ℝ := + -∫ x in V, + uQ.grad x i * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + +/-- Smooth-test convergence hypothesis for a fixed sequence of legal +difference-quotient steps. -/ +def OpenCubeInnerHessianPairingTendsto + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (V : Set (Vec d)) (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} : Prop := + ∀ φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁), + Filter.Tendsto + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ) + Filter.atTop + (nhds (openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ)) + +private theorem support_fderiv_apply_basisVec_subset_of_tsupport_subset + {U : Set (Vec d)} {φ : Vec d → ℝ} (j : Fin d) (hφ_sub : tsupport φ ⊆ U) : + Function.support (fun x => (fderiv ℝ φ x) (basisVec j)) ⊆ U := by + intro x hx + exact hφ_sub <| + (support_fderiv_subset (𝕜 := ℝ) (f := φ)) <| by + change fderiv ℝ φ x ≠ 0 + intro hzero + apply hx + simp [hzero] + +private theorem support_mul_fderiv_apply_basisVec_subset_of_tsupport_subset + {U : Set (Vec d)} {w φ : Vec d → ℝ} (j : Fin d) (hφ_sub : tsupport φ ⊆ U) : + Function.support (fun x => w x * (fderiv ℝ φ x) (basisVec j)) ⊆ U := by + intro x hx + have hderiv_ne : (fderiv ℝ φ x) (basisVec j) ≠ 0 := by + intro hzero + apply hx + simp [hzero] + exact support_fderiv_apply_basisVec_subset_of_tsupport_subset j hφ_sub hderiv_ne + +private theorem openCubeInnerOpenCubeLimitHessianPairing_eq_of_toScalarL2_eq + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (φ ψ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) + (hφψ : φ.toScalarL2 = ψ.toScalarL2) : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ψ := by + have hseq : + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ) = + fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j ψ := by + funext n + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerOpenCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV (hstep n) i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one (hstep_abs n) φ ψ hφψ + exact tendsto_nhds_unique (hlim φ) (by simpa [hseq] using hlim ψ) + +private theorem openCubeInnerOpenCubeLimitHessianPairing_add + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (i j : Fin d) + {ρ₁ σ₁ ν : ℝ} + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (φ ψ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (φ.add ψ) = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ + + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ψ := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : + ∀ n, V ⊆ translateSet ((-stepSeq n) • basisVec i) (openCubeSet Q) := by + intro n x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift (stepSeq n) i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ (hstep_abs n) i (hVν hx) + have hxopen : euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + have hSV : scaledOpenCubeSet Q ρ₁ ⊆ V := + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + have hseq : + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j + (φ.add ψ)) = + fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ + + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j ψ := by + funext n + simpa [openCubeInnerOpenCubeQuotientHessianPairing] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_add + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := stepSeq n) i j (hVshift n) + (S := scaledOpenCubeSet Q ρ₁) hSV φ ψ + have hsum : + Filter.Tendsto + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j + (φ.add ψ)) + Filter.atTop + (nhds + (openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ + + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ψ)) := by + simpa [hseq] using (hlim φ).add (hlim ψ) + exact tendsto_nhds_unique (hlim (φ.add ψ)) hsum + +private theorem openCubeInnerOpenCubeLimitHessianPairing_smul + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (i j : Fin d) + {ρ₁ σ₁ ν : ℝ} + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (c : ℝ) (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (φ.smul c) = + c * openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : + ∀ n, V ⊆ translateSet ((-stepSeq n) • basisVec i) (openCubeSet Q) := by + intro n x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift (stepSeq n) i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ (hstep_abs n) i (hVν hx) + have hxopen : euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + have hSV : scaledOpenCubeSet Q ρ₁ ⊆ V := + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + have hseq : + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j + (φ.smul c)) = + fun n : ℕ => + c * openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ := by + funext n + simpa [openCubeInnerOpenCubeQuotientHessianPairing] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_smul + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := stepSeq n) i j (hVshift n) + (S := scaledOpenCubeSet Q ρ₁) hSV c φ + have hmul : + Filter.Tendsto + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j + (φ.smul c)) + Filter.atTop + (nhds (c * openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ)) := by + simpa [hseq] using tendsto_const_nhds.mul (hlim φ) + exact tendsto_nhds_unique (hlim (φ.smul c)) hmul + +/-- The limiting Hessian pairing as a linear functional on the dense +smooth-test scalar `L²` submodule. -/ +noncomputable def openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) : + h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁) →ₗ[ℝ] ℝ := by + let S : Set (Vec d) := scaledOpenCubeSet Q ρ₁ + let rep : + h1WeakTestScalarL2Submodule (d := d) S → H1WeakTestFunction S := + h1WeakTestScalarL2Representative + refine + { toFun := fun x => openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep x) + map_add' := ?_ + map_smul' := ?_ } + · intro x y + have hrep_add_eq : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep (x + y)) = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ((rep x).add (rep y)) := + openCubeInnerOpenCubeLimitHessianPairing_eq_of_toScalarL2_eq + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + (rep (x + y)) ((rep x).add (rep y)) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_add, + h1WeakTestScalarL2Representative_toScalarL2, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_add : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ((rep x).add (rep y)) = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep x) + + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep y) := + openCubeInnerOpenCubeLimitHessianPairing_add + (ρ₁ := ρ₁) (σ₁ := σ₁) (ν := ν) hV stepSeq i j hinnerV + hVν hν_nonneg hνσ hσ₁_lt_one hstep_abs hlim (rep x) (rep y) + exact hrep_add_eq.trans hpair_add + · intro c x + have hrep_smul_eq : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep (c • x)) = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ((rep x).smul c) := + openCubeInnerOpenCubeLimitHessianPairing_eq_of_toScalarL2_eq + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + (rep (c • x)) ((rep x).smul c) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_smul, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_smul : + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ((rep x).smul c) = + c * openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep x) := + openCubeInnerOpenCubeLimitHessianPairing_smul + (ρ₁ := ρ₁) (σ₁ := σ₁) (ν := ν) hV stepSeq i j hinnerV + hVν hν_nonneg hνσ hσ₁_lt_one hstep_abs hlim c (rep x) + calc + openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep (c • x)) = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ((rep x).smul c) := + hrep_smul_eq + _ = c * openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep x) := + hpair_smul + _ = c • openCubeInnerOpenCubeLimitHessianPairing uQ V i j (rep x) := by + rfl + +/-- The limiting smooth-test functional inherits the uniform quotient-Hessian +bound. -/ +theorem norm_openCubeInnerOpenCubeLimitHessianSmoothTestFunctional_apply_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (x : h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)) : + ‖openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ := by + let φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁) := + h1WeakTestScalarL2Representative x + let C : ℝ := openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ + let N : ℝ := + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ + have hbound_seq : + ∀ n : ℕ, + |openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ| ≤ + C * N := by + intro n + have hbound := + norm_openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional_apply_le + h hf hV (hstep n) i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one (hstep_abs n) x + simpa [openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional, + openCubeInnerOpenCubeQuotientHessianPairing, φ, C, N, Real.norm_eq_abs] + using hbound + have hlim_abs : + Filter.Tendsto + (fun n : ℕ => + |openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ|) + Filter.atTop + (nhds |openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ|) := + (hlim φ).abs + have habs : + |openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ| ≤ C * N := + le_of_tendsto hlim_abs (Filter.Eventually.of_forall hbound_seq) + simpa [openCubeInnerOpenCubeLimitHessianSmoothTestFunctional, φ, C, N, + Real.norm_eq_abs] using habs + +/-- Continuous extension of the limiting Hessian functional to all scalar +`L²` fields on the open inner cube. -/ +noncomputable def openCubeInnerOpenCubeLimitHessianFunctional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) : + ScalarL2 (scaledOpenCubeSet Q ρ₁) →L[ℝ] ℝ := + extendH1WeakTestScalarL2Functional + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + +/-- The limiting continuous functional inherits the uniform quotient bound. -/ +theorem norm_openCubeInnerOpenCubeLimitHessianFunctional_apply_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (hρ₁_nonneg : 0 ≤ ρ₁) + (x : ScalarL2 (scaledOpenCubeSet Q ρ₁)) : + ‖openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖x‖ := by + exact + norm_extendH1WeakTestScalarL2Functional_apply_le + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (isOpen_scaledOpenCubeSet Q ρ₁) + (volume_scaledOpenCubeSet_ne_top_of_nonneg Q hρ₁_nonneg) + (openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + (openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + (norm_openCubeInnerOpenCubeLimitHessianSmoothTestFunctional_apply_le + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + x + +/-- Riesz representative of the limiting open-inner Hessian functional. -/ +noncomputable def openCubeInnerOpenCubeLimitHessianRieszRep + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) : + ScalarL2 (scaledOpenCubeSet Q ρ₁) := + (InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm + (openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + +/-- Riesz evaluation theorem for the limiting Hessian representative. -/ +theorem inner_openCubeInnerOpenCubeLimitHessianRieszRep_eq_functional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (x : ScalarL2 (scaledOpenCubeSet Q ρ₁)) : + inner ℝ + (openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + x = + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x := by + change inner ℝ + (((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm) + (openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim)) + x = + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x + exact + InnerProductSpace.toDual_symm_apply + (𝕜 := ℝ) + (E := ScalarL2 (scaledOpenCubeSet Q ρ₁)) + (x := x) + (y := + (openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim : + StrongDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁)))) + +/-- The continuous limiting functional agrees with the concrete smooth-test +functional on the dense submodule. -/ +theorem openCubeInnerOpenCubeLimitHessianFunctional_apply_subtype + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (hρ₁_nonneg : 0 ≤ ρ₁) + (x : h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)) : + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + ((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x) = + openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x := by + exact + extendH1WeakTestScalarL2Functional_apply_subtype + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (isOpen_scaledOpenCubeSet Q ρ₁) + (volume_scaledOpenCubeSet_ne_top_of_nonneg Q hρ₁_nonneg) + (openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + (openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + (norm_openCubeInnerOpenCubeLimitHessianSmoothTestFunctional_apply_le + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim) + x + +/-- The limiting Riesz representative has the same explicit norm bound as the +fixed-step quotient representatives. -/ +theorem norm_openCubeInnerOpenCubeLimitHessianRieszRep_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ‖openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + let L : ScalarL2 (scaledOpenCubeSet Q ρ₁) →L[ℝ] ℝ := + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + let C : ℝ := + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ + have hL_bound : ∀ x, ‖L x‖ ≤ C * ‖x‖ := by + intro x + simpa [L, C] using + norm_openCubeInnerOpenCubeLimitHessianFunctional_apply_le + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim hρ₁_nonneg x + have hL_op : ‖L‖ ≤ C := + L.opNorm_le_bound + (by + simpa [C] using + openCubeInnerQuotientHessianSmoothTestBound_nonneg + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + hL_bound + have hnorm_eq : + ‖openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim‖ = ‖L‖ := by + change + ‖((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm) L‖ = ‖L‖ + exact ((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm.norm_map L) + exact hnorm_eq.trans_le hL_op + +/-- Under the smooth-test pairing convergence hypothesis, the limiting Riesz +representative is the weak `j`-derivative of the `i`th weak-gradient +coordinate on the open inner cube. -/ +theorem openCubeInnerOpenCubeLimitHessianRieszRep_hasWeakPartialDerivOn_grad + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep : ∀ n, stepSeq n ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hlim : OpenCubeInnerHessianPairingTendsto + (ρ₁ := ρ₁) uQ V stepSeq i j) + (hρ₁_nonneg : 0 ≤ ρ₁) : + HasWeakPartialDerivOn (scaledOpenCubeSet Q ρ₁) j + (fun x => uQ.grad x i) + (fun x => + openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim x) := by + intro φ hφ hφs hφ_sub + let S : Set (Vec d) := scaledOpenCubeSet Q ρ₁ + let φTest : H1WeakTestFunction S := + { toFun := φ + smooth := hφ + compactSupport := hφs + support_subset := by simpa [S] using hφ_sub } + let xsub : h1WeakTestScalarL2Submodule (d := d) S := + ⟨φTest.toScalarL2, by exact ⟨φTest, rfl⟩⟩ + let rep : ScalarL2 S := + openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + have hinner_functional : + inner ℝ rep φTest.toScalarL2 = + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim φTest.toScalarL2 := by + simpa [rep, S] using + inner_openCubeInnerOpenCubeLimitHessianRieszRep_eq_functional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim φTest.toScalarL2 + have hfunctional_smooth : + openCubeInnerOpenCubeLimitHessianFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim φTest.toScalarL2 = + openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim xsub := by + simpa [xsub, S, Submodule.subtype] using + openCubeInnerOpenCubeLimitHessianFunctional_apply_subtype + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim hρ₁_nonneg xsub + have hsmooth_pairing : + openCubeInnerOpenCubeLimitHessianSmoothTestFunctional + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim xsub = + -∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := by + let ψ : H1WeakTestFunction S := h1WeakTestScalarL2Representative xsub + have hψ_eq : ψ.toScalarL2 = φTest.toScalarL2 := by + simpa [ψ, xsub, S, Submodule.subtype] using + h1WeakTestScalarL2Representative_toScalarL2 xsub + have hpair := + openCubeInnerOpenCubeLimitHessianPairing_eq_of_toScalarL2_eq + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim ψ φTest hψ_eq + change + openCubeInnerOpenCubeLimitHessianPairing uQ V i j ψ = + -∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume + simpa [openCubeInnerOpenCubeLimitHessianPairing, φTest] using hpair + have hinner_integral : + inner ℝ rep φTest.toScalarL2 = + ∫ x in S, rep x * φ x ∂MeasureTheory.volume := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [φTest.coeFn_toScalarL2] with x hφ_l2 + rw [hφ_l2] + have hrep_integral : + ∫ x in S, rep x * φ x ∂MeasureTheory.volume = + -∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := + hinner_integral.symm.trans + (hinner_functional.trans (hfunctional_smooth.trans hsmooth_pairing)) + have hSV : S ⊆ V := by + simpa [S] using + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + have hderiv_support : + Function.support + (fun x => + uQ.grad x i * + (fderiv ℝ φ x) (basisVec j)) ⊆ S := + support_mul_fderiv_apply_basisVec_subset_of_tsupport_subset j (by simpa [S] using hφ_sub) + have hV_eq_S : + ∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + ∫ y in S, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := + integral_subset_of_support_subset (U := V) (V := S) hSV hderiv_support + have hV_pair : + ∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + -∫ x in S, rep x * φ x ∂MeasureTheory.volume := by + rw [hrep_integral, neg_neg] + calc + ∫ y in scaledOpenCubeSet Q ρ₁, + (fun x => uQ.grad x i) y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + ∫ y in S, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := by + rfl + _ = ∫ y in V, + uQ.grad y i * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := hV_eq_S.symm + _ = -∫ x in S, rep x * φ x ∂MeasureTheory.volume := hV_pair + _ = -∫ x in scaledOpenCubeSet Q ρ₁, + (fun y => + openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim y) x * + φ x ∂MeasureTheory.volume := by + rfl + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessianPointwise.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessianPointwise.lean new file mode 100644 index 0000000000..734daf4cdb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitHessianPointwise.lean @@ -0,0 +1,275 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothPointwise + +/-! # Limit Hessian Pointwise -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +/-! +# Hlim-free limiting Hessian representatives + +The theorems in `LimitHessian.lean` deliberately take the smooth-test pairing +limit as a hypothesis. `SmoothPointwise.lean` proves that hypothesis from the +standard small-step geometry. This file packages the combination in an +existence form that downstream interior `H²` estimates can consume without +threading a separate `hlim`. +-/ + +/-- Under the standard local DQ geometry, each Hessian coordinate of `uQ` +exists on the open inner cube as a weak derivative of `uQ.grad i`; the +representative inherits the same explicit quotient-Hessian bound. -/ +theorem exists_openCubeInnerOpenCubeLimitHessianRieszRep_hasWeakPartialDerivOn_grad_of_step_abs + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep_ne : ∀ n, stepSeq n ≠ 0) + (hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ R : ScalarL2 (scaledOpenCubeSet Q ρ₁), + ‖R‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ ∧ + HasWeakPartialDerivOn (scaledOpenCubeSet Q ρ₁) j + (fun x => uQ.grad x i) (fun x => R x) := by + let hlim : OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := + openCubeInnerHessianPairingTendsto_of_smooth_pointwise_bound_of_step_abs + uQ V stepSeq i j hinnerV hVν hν_nonneg hνσ hσ₁_lt_one + hstep_abs hstep_tendsto hstep_ne + let R : ScalarL2 (scaledOpenCubeSet Q ρ₁) := + openCubeInnerOpenCubeLimitHessianRieszRep + h hf hV stepSeq hstep_ne i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim + refine ⟨R, ?_, ?_⟩ + · simpa [R] using + norm_openCubeInnerOpenCubeLimitHessianRieszRep_le + h hf hV stepSeq hstep_ne i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim hρ₁_nonneg + · simpa [R] using + openCubeInnerOpenCubeLimitHessianRieszRep_hasWeakPartialDerivOn_grad + h hf hV stepSeq hstep_ne i j η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hlim hρ₁_nonneg + +/-- Bundle the coordinate-wise limiting representatives into a weak Hessian +witness for the restriction of `uQ` to the open inner cube. -/ +theorem exists_hasWeakHessianOn_restrict_of_step_abs + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep_ne : ∀ n, stepSeq n ≠ 0) + (hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uS : H1Function (scaledOpenCubeSet Q ρ₁), + uS.toFun = uQ.toFun ∧ + uS.grad = uQ.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q ρ₁) uS, + ∀ i j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hν_nonneg (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hSU : scaledOpenCubeSet Q ρ₁ ⊆ openCubeSet Q := + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans (hinnerV.trans hVU) + let uS : H1Function (scaledOpenCubeSet Q ρ₁) := + uQ.restrict (isOpen_scaledOpenCubeSet Q ρ₁) hSU + have hexists : + ∀ i j : Fin d, + ∃ R : ScalarL2 (scaledOpenCubeSet Q ρ₁), + ‖R‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ ∧ + HasWeakPartialDerivOn (scaledOpenCubeSet Q ρ₁) j + (fun x => uQ.grad x i) (fun x => R x) := by + intro i j + exact + exists_openCubeInnerOpenCubeLimitHessianRieszRep_hasWeakPartialDerivOn_grad_of_step_abs + h hf hV stepSeq hstep_ne hstep_tendsto i j η hη_sub hinnerV θ hVν + hν_nonneg hνσ hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hρ₁_nonneg + let R : Fin d → Fin d → ScalarL2 (scaledOpenCubeSet Q ρ₁) := + fun i j => Classical.choose (hexists i j) + have hR_bound : + ∀ i j : Fin d, + ‖R i j‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + intro i j + exact (Classical.choose_spec (hexists i j)).1 + have hR_weak : + ∀ i j : Fin d, + HasWeakPartialDerivOn (scaledOpenCubeSet Q ρ₁) j + (fun x => uQ.grad x i) (fun x => R i j x) := by + intro i j + exact (Classical.choose_spec (hexists i j)).2 + let H : HasWeakHessianOn (scaledOpenCubeSet Q ρ₁) uS := + { hess := fun i j x => R i j x + hess_memL2 := by + intro i j + simpa [MemScalarL2, volumeMeasureOn, R] using + (MeasureTheory.Lp.memLp (R i j)) + weak_second := by + intro i j + simpa [uS, H1Function.restrict] using hR_weak i j } + refine ⟨uS, by simp [uS, H1Function.restrict], by simp [uS, H1Function.restrict], H, ?_⟩ + intro i j + have hcoord : H.hessCoordToScalarL2 i j = R i j := by + apply MeasureTheory.Lp.ext + filter_upwards [Homogenization.coeFn_toScalarL2 (H.hess_memL2 i j)] with x hx + simpa [HasWeakHessianOn.hessCoordToScalarL2, H, R] using hx + simpa [hcoord] using hR_bound i j + +/-- Sum-form version of the bundled weak Hessian estimate. -/ +theorem exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_step_abs + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + (stepSeq : ℕ → ℝ) (hstep_ne : ∀ n, stepSeq n ≠ 0) + (hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uS : H1Function (scaledOpenCubeSet Q ρ₁), + uS.toFun = uQ.toFun ∧ + uS.grad = uQ.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q ρ₁) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + obtain ⟨uS, huS_fun, huS_grad, H, hcoord⟩ := + exists_hasWeakHessianOn_restrict_of_step_abs + h hf hV stepSeq hstep_ne hstep_tendsto η hη_sub hinnerV θ hVν + hν_nonneg hνσ hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hstep_abs hρ₁_nonneg + refine ⟨uS, huS_fun, huS_grad, H, ?_⟩ + unfold HasWeakHessianOn.hessianCoordL2NormSum + exact Finset.sum_le_sum fun i _ => + Finset.sum_le_sum fun j _ => hcoord i j + +/-- Sum-form weak Hessian estimate with a canonical small-step sequence chosen +from the strict geometric margin between the ambient convex set and the cutoff +support scale. -/ +theorem exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uS : H1Function (scaledOpenCubeSet Q ρ₁), + uS.toFun = uQ.toFun ∧ + uS.grad = uQ.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q ρ₁) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + let margin : ℝ := (σ₁ - ν) * cubeRadius Q + let stepSeq : ℕ → ℝ := fun n => margin / ((n : ℝ) + 1) + have hmargin_pos : 0 < margin := by + exact mul_pos (sub_pos.mpr hνσ) (cubeRadius_pos Q) + have hmargin_nonneg : 0 ≤ margin := le_of_lt hmargin_pos + have hstep_ne : ∀ n, stepSeq n ≠ 0 := by + intro n + have hden_pos : 0 < (n : ℝ) + 1 := by positivity + exact div_ne_zero hmargin_pos.ne' hden_pos.ne' + have hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0) := by + have hbase : + Filter.Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) + Filter.atTop (nhds (0 : ℝ)) := + tendsto_one_div_add_atTop_nhds_zero_nat + have hmul := hbase.const_mul margin + simpa [stepSeq, div_eq_mul_inv, one_div, mul_comm, mul_left_comm, mul_assoc] using hmul + have hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q := by + intro n + have hden_pos : 0 < (n : ℝ) + 1 := by positivity + have hden_ge_one : (1 : ℝ) ≤ (n : ℝ) + 1 := by + have hn_nonneg : 0 ≤ (n : ℝ) := by positivity + linarith + have hstep_nonneg : 0 ≤ stepSeq n := + div_nonneg hmargin_nonneg (le_of_lt hden_pos) + calc + |stepSeq n| = stepSeq n := abs_of_nonneg hstep_nonneg + _ ≤ margin := by + change margin / ((n : ℝ) + 1) ≤ margin + rw [div_le_iff₀ hden_pos] + nlinarith [hmargin_nonneg, hden_ge_one] + _ = (σ₁ - ν) * cubeRadius Q := rfl + exact + exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_step_abs + h hf hV stepSeq hstep_ne hstep_tendsto η hη_sub hinnerV θ hVν + hν_nonneg (le_of_lt hνσ) hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one + hstep_abs hρ₁_nonneg + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitPairing.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitPairing.lean new file mode 100644 index 0000000000..4de9993ec3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/LimitPairing.lean @@ -0,0 +1,466 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessian +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SummationByParts + +/-! # Limit Pairing -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +private theorem support_h1WeakTest_deriv_subset + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + Function.support (fun x => φ.deriv j x) ⊆ U := by + intro x hx + exact φ.support_subset <| + (support_fderiv_subset (𝕜 := ℝ) (f := (φ : Vec d → ℝ))) <| by + change fderiv ℝ (φ : Vec d → ℝ) x ≠ 0 + intro hzero + apply hx + simp [H1WeakTestFunction.deriv, hzero] + +private theorem continuous_h1WeakTest_deriv + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + Continuous (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv] using + (φ.smooth.continuous_fderiv (by simp)).clm_apply continuous_const + +private theorem hasCompactSupport_h1WeakTest_deriv + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + HasCompactSupport (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv] using + φ.compactSupport.fderiv_apply (𝕜 := ℝ) (basisVec j) + +private theorem contDiff_h1WeakTest_deriv + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv, euclideanCoordDeriv] using! + contDiff_euclideanCoordDeriv φ.smooth j + +private theorem tsupport_h1WeakTest_deriv_subset + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + tsupport (fun x => φ.deriv j x) ⊆ U := by + have hsub : + tsupport (euclideanCoordDeriv j (φ : Vec d → ℝ)) ⊆ + tsupport (φ : Vec d → ℝ) := + tsupport_euclideanCoordDeriv_subset_tsupport j (φ : Vec d → ℝ) + simpa [H1WeakTestFunction.deriv, euclideanCoordDeriv] using! + hsub.trans φ.support_subset + +private theorem support_fderiv_h1WeakTest_deriv_apply_subset + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (i j : Fin d) : + Function.support + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) ⊆ U := by + intro x hx + exact tsupport_h1WeakTest_deriv_subset φ j <| + (support_fderiv_subset (𝕜 := ℝ) (f := fun y => φ.deriv j y)) <| by + change fderiv ℝ (fun y => φ.deriv j y) x ≠ 0 + intro hzero + apply hx + simp [hzero] + +private theorem memScalarL2_h1WeakTest_deriv_of_subset + {S U : Set (Vec d)} (hS_meas : MeasurableSet S) + (φ : H1WeakTestFunction S) (j : Fin d) : + MemScalarL2 U (fun x => φ.deriv j x) := by + have hderiv_memS : MemScalarL2 S (fun x => φ.deriv j x) := by + simpa [MemScalarL2, volumeMeasureOn] using + ((continuous_h1WeakTest_deriv φ j).memLp_of_hasCompactSupport + (hasCompactSupport_h1WeakTest_deriv φ j)).restrict S + exact + memLp_restrict_of_support_subset_of_memLp + (U := U) (V := S) hS_meas + (support_h1WeakTest_deriv_subset φ j) hderiv_memS + +private theorem integrable_mul_h1Function_h1WeakTest_deriv_of_subset + {S U : Set (Vec d)} (hS_meas : MeasurableSet S) + (u : H1Function U) (φ : H1WeakTestFunction S) (j : Fin d) + (hSU : S ⊆ U) : + MeasureTheory.Integrable (fun x => u.toFun x * φ.deriv j x) + MeasureTheory.volume := by + have hderiv_memU : + MemScalarL2 U (fun x => φ.deriv j x) := + memScalarL2_h1WeakTest_deriv_of_subset hS_meas φ j + have hprodU : + MeasureTheory.IntegrableOn (fun x => u.toFun x * φ.deriv j x) U + MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, MemL2On, MemScalarL2, volumeMeasureOn] + using! u.memL2.integrable_mul hderiv_memU + have hprod_support : + Function.support (fun x => u.toFun x * φ.deriv j x) ⊆ U := + (Function.support_mul_subset_right u.toFun (fun x => φ.deriv j x)).trans + ((support_h1WeakTest_deriv_subset φ j).trans hSU) + exact + (MeasureTheory.integrableOn_iff_integrable_of_support_subset hprod_support).mp + hprodU + +private theorem integrable_shifted_h1Function_mul_h1WeakTest_deriv + {S U : Set (Vec d)} (hS_meas : MeasurableSet S) + (u : H1Function U) (φ : H1WeakTestFunction S) {step : ℝ} (i j : Fin d) + (hSshift : ∀ x ∈ S, euclideanCoordShift step i x ∈ U) : + MeasureTheory.Integrable + (fun x => u.toFun (euclideanCoordShift step i x) * φ.deriv j x) + MeasureTheory.volume := by + let z : Vec d := (-step) • basisVec i + have hS_translate : S ⊆ translateSet z U := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + simpa [z, euclideanCoordShift, sub_eq_add_neg, neg_smul] using hSshift x hx + have hshift_memS : + MemScalarL2 S (fun x => u.toFun (euclideanCoordShift step i x)) := by + have hmono : + MeasureTheory.MemLp (fun x => (u.translate z).toFun x) 2 + (MeasureTheory.volume.restrict S) := + (u.translate z).memL2.mono_measure + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hS_translate) + simpa [MemScalarL2, MemL2On, volumeMeasureOn, z, euclideanCoordShift, + sub_eq_add_neg, neg_smul] using hmono + have hderiv_memS : MemScalarL2 S (fun x => φ.deriv j x) := + memScalarL2_h1WeakTest_deriv_of_subset hS_meas φ j + have hprodS : + MeasureTheory.IntegrableOn + (fun x => u.toFun (euclideanCoordShift step i x) * φ.deriv j x) S + MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, MemScalarL2, volumeMeasureOn] + using! hshift_memS.integrable_mul hderiv_memS + have hprod_support : + Function.support + (fun x => u.toFun (euclideanCoordShift step i x) * φ.deriv j x) ⊆ S := + (Function.support_mul_subset_right + (fun x => u.toFun (euclideanCoordShift step i x)) + (fun x => φ.deriv j x)).trans + (support_h1WeakTest_deriv_subset φ j) + exact + (MeasureTheory.integrableOn_iff_integrable_of_support_subset hprod_support).mp + hprodS + +private theorem support_forwardDifferenceQuotient_mul_h1WeakTest_deriv_subset + {U : Set (Vec d)} {u : Vec d → ℝ} (step : ℝ) (i j : Fin d) + (φ : H1WeakTestFunction U) : + Function.support + (fun x => euclideanForwardDifferenceQuotient step i u x * φ.deriv j x) + ⊆ U := by + intro x hx + have hderiv_ne : φ.deriv j x ≠ 0 := by + intro hzero + apply hx + simp [hzero] + exact support_h1WeakTest_deriv_subset φ j hderiv_ne + +private theorem support_h1WeakTest_deriv_comp_coordShift_neg_subset + {S U V : Set (Vec d)} {step : ℝ} (i j : Fin d) + (φ : H1WeakTestFunction S) (hSV : S ⊆ V) + (hVshift : ∀ x ∈ V, euclideanCoordShift step i x ∈ U) : + Function.support + (fun x => φ.deriv j (euclideanCoordShift (-step) i x)) ⊆ U := by + intro x hx + have hpreS : + euclideanCoordShift (-step) i x ∈ S := + support_h1WeakTest_deriv_subset φ j hx + have hxU : + euclideanCoordShift step i (euclideanCoordShift (-step) i x) ∈ U := + hVshift (euclideanCoordShift (-step) i x) (hSV hpreS) + simpa using hxU + +private theorem integrable_mul_h1Function_h1WeakTest_deriv_comp_coordShift_neg + {S U V : Set (Vec d)} {step : ℝ} + (u : H1Function U) (φ : H1WeakTestFunction S) (i j : Fin d) + (hSV : S ⊆ V) + (hVshift : ∀ x ∈ V, euclideanCoordShift step i x ∈ U) : + MeasureTheory.Integrable + (fun x => u.toFun x * φ.deriv j (euclideanCoordShift (-step) i x)) + MeasureTheory.volume := by + have hderiv_shift_cont : + Continuous (fun x => φ.deriv j (euclideanCoordShift (-step) i x)) := + (continuous_h1WeakTest_deriv φ j).comp + (continuous_id.add continuous_const) + have hderiv_shift_compact : + HasCompactSupport (fun x => φ.deriv j (euclideanCoordShift (-step) i x)) := + hasCompactSupport_comp_euclideanCoordShift + (hasCompactSupport_h1WeakTest_deriv φ j) (-step) i + have hderiv_shift_memU : + MemScalarL2 U + (fun x => φ.deriv j (euclideanCoordShift (-step) i x)) := by + simpa [MemScalarL2, volumeMeasureOn] using + (hderiv_shift_cont.memLp_of_hasCompactSupport hderiv_shift_compact).restrict U + have hprodU : + MeasureTheory.IntegrableOn + (fun x => u.toFun x * φ.deriv j (euclideanCoordShift (-step) i x)) U + MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, MemL2On, MemScalarL2, volumeMeasureOn] + using! u.memL2.integrable_mul hderiv_shift_memU + have hprod_support : + Function.support + (fun x => u.toFun x * φ.deriv j (euclideanCoordShift (-step) i x)) + ⊆ U := + (Function.support_mul_subset_right u.toFun + (fun x => φ.deriv j (euclideanCoordShift (-step) i x))).trans + (support_h1WeakTest_deriv_comp_coordShift_neg_subset i j φ hSV hVshift) + exact + (MeasureTheory.integrableOn_iff_integrable_of_support_subset hprod_support).mp + hprodU + +/-- Fixed-step open-inner Hessian pairings can be moved from the forward +quotient on the rough potential to the backward quotient on the smooth test +derivative. + +This is the concrete bridge from the quotient estimate to the limiting weak +second derivative: the nonsmooth `H¹` representative appears only as an +`L¹`-paired factor. -/ +theorem openCubeInnerOpenCubeQuotientHessianPairing_eq_integral_mul_backwardDifferenceQuotient_deriv + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + {step : ℝ} (i j : Fin d) {ρ₁ : ℝ} + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hshiftInt : + MeasureTheory.Integrable + (fun x : Vec d => + uQ.toFun (euclideanCoordShift step i x) * φ.deriv j x) + MeasureTheory.volume) + (huvInt : + MeasureTheory.Integrable + (fun x : Vec d => uQ.toFun x * φ.deriv j x) + MeasureTheory.volume) + (hbackShiftInt : + MeasureTheory.Integrable + (fun x : Vec d => + uQ.toFun x * φ.deriv j (euclideanCoordShift (-step) i x)) + MeasureTheory.volume) : + openCubeInnerOpenCubeQuotientHessianPairing uQ V step i j φ = + ∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x + ∂MeasureTheory.volume := by + have hleft_support : + Function.support + (fun x => + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x) + ⊆ V := + (support_forwardDifferenceQuotient_mul_h1WeakTest_deriv_subset + (U := scaledOpenCubeSet Q ρ₁) step i j φ).trans hSV + have hV_eq_univ : + ∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x + ∂MeasureTheory.volume = + ∫ x, + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x + ∂MeasureTheory.volume := by + have hsubset := + integral_subset_of_support_subset + (U := (Set.univ : Set (Vec d))) (V := V) + (Set.subset_univ V) hleft_support + simpa using hsubset.symm + have hsbp : + ∫ x, + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x + ∂MeasureTheory.volume = + -∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x + ∂MeasureTheory.volume := + integral_euclideanForwardDifferenceQuotient_mul_eq_neg_integral_mul_euclideanBackwardDifferenceQuotient_of_integrable + (u := uQ.toFun) (v := fun y => φ.deriv j y) step i + (by simpa using hshiftInt) + (by simpa using huvInt) + (by simpa using hbackShiftInt) + calc + openCubeInnerOpenCubeQuotientHessianPairing uQ V step i j φ = + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x + ∂MeasureTheory.volume := by + rfl + _ = -∫ x, + euclideanForwardDifferenceQuotient step i uQ.toFun x * φ.deriv j x + ∂MeasureTheory.volume := by + rw [hV_eq_univ] + _ = -(-∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x + ∂MeasureTheory.volume) := by + rw [hsbp] + _ = ∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x + ∂MeasureTheory.volume := by + ring + +/-- Fixed-step pairing rewrite with the L1 hypotheses discharged from the +interior support and one-step cube-margin conditions. -/ +theorem openCubeInnerOpenCubeQuotientHessianPairing_eq_integral_mul_backwardDifferenceQuotient_deriv_of_subset_of_shift + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + {step : ℝ} (i j : Fin d) {ρ₁ : ℝ} + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ x ∈ V, euclideanCoordShift step i x ∈ openCubeSet Q) : + openCubeInnerOpenCubeQuotientHessianPairing uQ V step i j φ = + ∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x + ∂MeasureTheory.volume := by + have hS_meas : MeasurableSet (scaledOpenCubeSet Q ρ₁) := + (isOpen_scaledOpenCubeSet Q ρ₁).measurableSet + refine + openCubeInnerOpenCubeQuotientHessianPairing_eq_integral_mul_backwardDifferenceQuotient_deriv + uQ i j φ hSV ?_ ?_ ?_ + · exact + integrable_shifted_h1Function_mul_h1WeakTest_deriv + hS_meas uQ φ i j (fun x hx => hVshift x (hSV hx)) + · exact + integrable_mul_h1Function_h1WeakTest_deriv_of_subset + hS_meas uQ φ j (hSV.trans hVU) + · exact + integrable_mul_h1Function_h1WeakTest_deriv_comp_coordShift_neg + uQ φ i j hSV hVshift + +/-- The classical limit of the smooth-test summation-by-parts expression is +the desired limiting Hessian pairing. -/ +theorem integral_mul_fderiv_h1WeakTest_deriv_eq_openCubeInnerOpenCubeLimitHessianPairing + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (i j : Fin d) {ρ₁ : ℝ} + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) : + ∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ := by + let U : Set (Vec d) := openCubeSet Q + let S : Set (Vec d) := scaledOpenCubeSet Q ρ₁ + let g : Vec d → ℝ := fun y => φ.deriv j y + have hg_smooth : ContDiff ℝ (⊤ : ℕ∞) g := by + simpa [g] using contDiff_h1WeakTest_deriv φ j + have hg_compact : HasCompactSupport g := by + simpa [g] using hasCompactSupport_h1WeakTest_deriv φ j + have hg_subU : tsupport g ⊆ U := by + simpa [g, U, S] using + (tsupport_h1WeakTest_deriv_subset φ j).trans (hSV.trans hVU) + have hleft_support : + Function.support + (fun x => + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) + ⊆ U := by + refine (Function.support_mul_subset_right uQ.toFun + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i))).trans ?_ + simpa [g, U] using + (support_fderiv_h1WeakTest_deriv_apply_subset φ i j).trans (hSV.trans hVU) + have hleft_univ_eq_U : + ∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume = + ∫ x in U, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume := by + have hsubset := + integral_subset_of_support_subset + (U := (Set.univ : Set (Vec d))) (V := U) + (Set.subset_univ U) hleft_support + simpa [U] using hsubset + have hweak : + ∫ x in U, + uQ.toFun x * (fderiv ℝ g x) (basisVec i) + ∂MeasureTheory.volume = + -∫ x in U, uQ.grad x i * g x ∂MeasureTheory.volume := by + simpa [U] using uQ.hasWeakGradient i g hg_smooth hg_compact hg_subU + have hright_support : + Function.support (fun x => uQ.grad x i * φ.deriv j x) ⊆ V := + (Function.support_mul_subset_right (fun x => uQ.grad x i) + (fun x => φ.deriv j x)).trans + ((support_h1WeakTest_deriv_subset φ j).trans hSV) + have hright_U_eq_V : + ∫ x in U, uQ.grad x i * φ.deriv j x ∂MeasureTheory.volume = + ∫ x in V, uQ.grad x i * φ.deriv j x ∂MeasureTheory.volume := by + exact integral_subset_of_support_subset + (U := U) (V := V) (by simpa [U] using hVU) hright_support + calc + ∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume = + ∫ x in U, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume := hleft_univ_eq_U + _ = ∫ x in U, + uQ.toFun x * (fderiv ℝ g x) (basisVec i) + ∂MeasureTheory.volume := by rfl + _ = -∫ x in U, uQ.grad x i * g x ∂MeasureTheory.volume := hweak + _ = -∫ x in V, uQ.grad x i * φ.deriv j x ∂MeasureTheory.volume := by + rw [hright_U_eq_V] + _ = openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ := by + rfl + +/-- The remaining smooth-test convergence statement implies the +`OpenCubeInnerHessianPairingTendsto` interface consumed by the limiting Riesz +construction. -/ +theorem openCubeInnerHessianPairingTendsto_of_integral_backwardDifferenceQuotient_deriv_tendsto + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q) + (hback_lim : + ∀ φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁), + Filter.Tendsto + (fun n : ℕ => + ∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient (stepSeq n) i + (fun y => φ.deriv j y) x + ∂MeasureTheory.volume) + Filter.atTop + (nhds + (∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume))) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + intro φ + have hseq : + (fun n : ℕ => + openCubeInnerOpenCubeQuotientHessianPairing uQ V (stepSeq n) i j φ) = + fun n : ℕ => + ∫ x, + uQ.toFun x * + euclideanBackwardDifferenceQuotient (stepSeq n) i + (fun y => φ.deriv j y) x + ∂MeasureTheory.volume := by + funext n + exact + openCubeInnerOpenCubeQuotientHessianPairing_eq_integral_mul_backwardDifferenceQuotient_deriv_of_subset_of_shift + uQ i j φ hSV hVU (hVshift n) + have htarget : + ∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume = + openCubeInnerOpenCubeLimitHessianPairing uQ V i j φ := + integral_mul_fderiv_h1WeakTest_deriv_eq_openCubeInnerOpenCubeLimitHessianPairing + uQ i j φ hSV hVU + simpa [hseq, htarget] using hback_lim φ + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Localizations.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Localizations.lean new file mode 100644 index 0000000000..c2055ef135 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/Localizations.lean @@ -0,0 +1,736 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.DiffQuotientLp + +/-! # Localizations -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- The support of a coordinate derivative is contained in the topological +support of the original scalar function. -/ +theorem support_euclideanGradient_coord_subset_tsupport + {φ : Vec d → ℝ} (j : Fin d) : + Function.support (fun x => euclideanGradient φ x j) ⊆ tsupport φ := by + intro x hx + by_contra hxt + have hzero : euclideanGradient φ x j = 0 := by + unfold euclideanGradient euclideanCoordDeriv + rw [fderiv_of_notMem_tsupport (𝕜 := ℝ) hxt] + simp + exact hx hzero + +/-- A coordinate derivative of a smooth compactly supported cutoff localizes a +scalar `L²(V)` function to an ambient scalar `L²(U)` function when the original +cutoff support lies in `V`. -/ +theorem memScalarL2_mul_euclideanGradient_coord_of_contDiff_hasCompactSupport_tsupport_subset + {φ F : Vec d → ℝ} (hV_meas : MeasurableSet V) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ V) (hF : MemScalarL2 V F) (j : Fin d) : + MemScalarL2 U (fun x => euclideanGradient φ x j * F x) := by + have hdφ_top : + MeasureTheory.MemLp (fun x => euclideanGradient φ x j) ⊤ + (MeasureTheory.volume.restrict V) := + (contDiff_euclideanCoordDeriv hφ j).continuous.memLp_top_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hφ_compact j) + (MeasureTheory.volume.restrict V) + have hprodV : + MeasureTheory.MemLp (fun x => euclideanGradient φ x j * F x) 2 + (MeasureTheory.volume.restrict V) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm] using hF.mul' hdφ_top + have hsupport : Function.support (fun x => euclideanGradient φ x j * F x) ⊆ V := + (Function.support_mul_subset_left (fun x => euclideanGradient φ x j) F).trans + ((support_euclideanGradient_coord_subset_tsupport j).trans hφ_sub) + simpa [MemScalarL2, volumeMeasureOn] using + memLp_restrict_of_support_subset_of_memLp + (U := U) (V := V) hV_meas hsupport hprodV + +/-- Localize an interior `H¹(V)` function by a smooth compactly supported +cutoff and regard the product as an ambient `H¹(U)` function. + +This is the support-sensitive replacement for pretending that the ambient +bounded domain is translation-invariant: only the cutoff product is promoted to +`U`, and every weak-gradient test on `U` is reduced to the interior set `V` +because the product and its gradient are supported in `V`. -/ +noncomputable def localizedMulContDiffHasCompactSupportToAmbient + (w : H1Function V) (hV_meas : MeasurableSet V) (hVU : V ⊆ U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + H1Function U := by + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + refine + { toFun := fun x => φ x * w x + grad := fun x i => φ x * w.grad x i + w x * Dφ x i + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · exact memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := V) hV_meas hφ hφ_compact hφ_sub w.memL2 + · intro i + have hfirst : + MemScalarL2 U (fun x => φ x * w.grad x i) := + memScalarL2_mul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := V) hV_meas hφ hφ_compact hφ_sub (w.gradMemL2 i) + have hsecond : + MemScalarL2 U (fun x => w x * Dφ x i) := by + have hderiv : + MemScalarL2 U (fun x => euclideanGradient φ x i * w x) := + memScalarL2_mul_euclideanGradient_coord_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := V) hV_meas hφ hφ_compact hφ_sub w.memL2 i + simpa [Dφ, euclideanGradient, euclideanCoordDeriv, mul_comm] using hderiv + simpa [Dφ, Pi.add_apply, MemScalarL2, volumeMeasureOn] using! hfirst.add hsecond + · intro i ψ hψ_smooth hψ_compact hψ_sub + let ei : Vec d := basisVec i + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) ei + let dψ : Vec d → ℝ := fun x => (fderiv ℝ ψ x) ei + let ψφ : Vec d → ℝ := fun x => φ x * ψ x + change + ∫ x in U, (φ x * w x) * dψ x ∂MeasureTheory.volume = + -∫ x in U, (φ x * w.grad x i + w x * dφ x) * ψ x + ∂MeasureTheory.volume + have hleft_support : + Function.support (fun x => (φ x * w x) * dψ x) ⊆ V := by + exact + (Function.support_mul_subset_left (fun x => φ x * w x) dψ).trans + ((Function.support_mul_subset_left φ w.toFun).trans + (subset_tsupport φ |>.trans hφ_sub)) + have hdφ_support : Function.support dφ ⊆ tsupport φ := by + simpa [dφ, ei, euclideanGradient, euclideanCoordDeriv] using + support_euclideanGradient_coord_subset_tsupport (φ := φ) i + have hright_support : + Function.support (fun x => (φ x * w.grad x i + w x * dφ x) * ψ x) ⊆ V := by + refine (Function.support_mul_subset_left + (fun x => φ x * w.grad x i + w x * dφ x) ψ).trans ?_ + refine (Function.support_add _ _).trans (Set.union_subset ?_ ?_) + · exact (Function.support_mul_subset_left φ (fun x => w.grad x i)).trans + (subset_tsupport φ |>.trans hφ_sub) + · exact (Function.support_mul_subset_right w.toFun dφ).trans + (hdφ_support.trans hφ_sub) + rw [integral_subset_of_support_subset (U := U) (V := V) hVU hleft_support, + integral_subset_of_support_subset (U := U) (V := V) hVU hright_support] + have hψ_cont : Continuous ψ := hψ_smooth.continuous + have hφ_cont : Continuous φ := hφ.continuous + have hdφ_cont : Continuous dφ := by + simpa [dφ, ei] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψ_cont : Continuous dψ := by + simpa [dψ, ei] using + (hψ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ, ei] using hφ_compact.fderiv_apply (𝕜 := ℝ) ei + have hdψ_compact : HasCompactSupport dψ := by + simpa [dψ, ei] using hψ_compact.fderiv_apply (𝕜 := ℝ) ei + have hψφ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψφ := hφ.mul hψ_smooth + have hψφ_compact : HasCompactSupport ψφ := by + simpa [ψφ] using! hψ_compact.mul_left (f := φ) + have hψφ_sub : tsupport ψφ ⊆ V := + (tsupport_mul_subset_left (f := φ) (g := ψ)).trans hφ_sub + have hdψφ_cont : Continuous (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using + (hψφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψφ_compact : HasCompactSupport (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using hψφ_compact.fderiv_apply (𝕜 := ℝ) ei + have hw_eq : + ∫ x in V, w x * ((fderiv ℝ ψφ x) ei) ∂MeasureTheory.volume = + -∫ x in V, w.grad x i * ψφ x ∂MeasureTheory.volume := by + simpa using w.hasWeakGradient i ψφ hψφ_smooth hψφ_compact hψφ_sub + have hw_loc : MeasureTheory.LocallyIntegrable w (MeasureTheory.volume.restrict V) := + w.memL2.locallyIntegrable (by norm_num) + have hgrad_loc : + MeasureTheory.LocallyIntegrable (fun x => w.grad x i) + (MeasureTheory.volume.restrict V) := + (w.gradMemL2 i).locallyIntegrable (by norm_num) + have hmul1_cont : Continuous (fun x => φ x * dψ x) := + hφ_cont.mul hdψ_cont + have hmul1_compact : HasCompactSupport (fun x => φ x * dψ x) := by + simpa using! hdψ_compact.mul_left (f := φ) + have hw_mul1_int : + MeasureTheory.Integrable (fun x => w x * (φ x * dψ x)) + (MeasureTheory.volume.restrict V) := by + simpa [smul_eq_mul, mul_assoc] using + hw_loc.integrable_smul_right_of_hasCompactSupport hmul1_cont hmul1_compact + have hmul2_cont : Continuous (fun x => ψ x * dφ x) := + hψ_cont.mul hdφ_cont + have hmul2_compact : HasCompactSupport (fun x => ψ x * dφ x) := by + simpa [mul_comm] using! hdφ_compact.mul_left (f := ψ) + have hw_mul2_int : + MeasureTheory.Integrable (fun x => w x * (ψ x * dφ x)) + (MeasureTheory.volume.restrict V) := by + simpa [smul_eq_mul, mul_assoc] using + hw_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hw_ψφ_int : + MeasureTheory.Integrable (fun x => w x * ((fderiv ℝ ψφ x) ei)) + (MeasureTheory.volume.restrict V) := by + simpa [smul_eq_mul] using + hw_loc.integrable_smul_right_of_hasCompactSupport hdψφ_cont hdψφ_compact + have hgrad_mul1_int : + MeasureTheory.Integrable (fun x => w.grad x i * (φ x * ψ x)) + (MeasureTheory.volume.restrict V) := by + simpa [smul_eq_mul, mul_assoc] using + hgrad_loc.integrable_smul_right_of_hasCompactSupport + (hφ_cont.mul hψ_cont) hψφ_compact + have hw_mul2ψ_int : + MeasureTheory.Integrable (fun x => (w x * dφ x) * ψ x) + (MeasureTheory.volume.restrict V) := by + simpa [smul_eq_mul, mul_assoc, mul_left_comm, mul_comm] using + hw_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hprod_deriv : + ∀ x, (fderiv ℝ ψφ x) ei = φ x * dψ x + ψ x * dφ x := by + intro x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hψ_diff : DifferentiableAt ℝ ψ x := + (hψ_smooth.contDiffAt).differentiableAt (by simp) + rw [show ψφ = φ * ψ by rfl, fderiv_mul hφ_diff hψ_diff] + simp [dφ, dψ, ei, add_apply, smul_eq_mul] + have hleft_eq : + ∫ x in V, (φ x * w x) * dψ x ∂MeasureTheory.volume = + ∫ x in V, w x * (φ x * dψ x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsplit : + ∫ x in V, w x * (φ x * dψ x) ∂MeasureTheory.volume = + ∫ x in V, w x * ((fderiv ℝ ψφ x) ei) ∂MeasureTheory.volume - + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume := by + calc + ∫ x in V, w x * (φ x * dψ x) ∂MeasureTheory.volume + = ∫ x in V, + (w x * ((fderiv ℝ ψφ x) ei)) - w x * (ψ x * dφ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + calc + w x * (φ x * dψ x) = + w x * ((φ x * dψ x + ψ x * dφ x) - ψ x * dφ x) := by + ring + _ = w x * (((fderiv ℝ ψφ x) ei) - ψ x * dφ x) := by + rw [← hprod_deriv x] + _ = w x * ((fderiv ℝ ψφ x) ei) - w x * (ψ x * dφ x) := by + ring + _ = ∫ x in V, w x * ((fderiv ℝ ψφ x) ei) ∂MeasureTheory.volume - + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hw_ψφ_int hw_mul2_int] + have hright_eq : + -∫ x in V, w.grad x i * ψφ x ∂MeasureTheory.volume - + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume = + -∫ x in V, (φ x * w.grad x i + w x * dφ x) * ψ x + ∂MeasureTheory.volume := by + have hgrad_term : + ∫ x in V, w.grad x i * ψφ x ∂MeasureTheory.volume = + ∫ x in V, w.grad x i * (φ x * ψ x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [ψφ] + have hw_term : + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume = + ∫ x in V, (w x * dφ x) * ψ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsum : + ∫ x in V, (φ x * w.grad x i + w x * dφ x) * ψ x + ∂MeasureTheory.volume = + ∫ x in V, w.grad x i * (φ x * ψ x) ∂MeasureTheory.volume + + ∫ x in V, (w x * dφ x) * ψ x ∂MeasureTheory.volume := by + calc + ∫ x in V, (φ x * w.grad x i + w x * dφ x) * ψ x + ∂MeasureTheory.volume + = ∫ x in V, + w.grad x i * (φ x * ψ x) + (w x * dφ x) * ψ x + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + _ = ∫ x in V, w.grad x i * (φ x * ψ x) ∂MeasureTheory.volume + + ∫ x in V, (w x * dφ x) * ψ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hgrad_mul1_int hw_mul2ψ_int] + rw [hgrad_term, hw_term, hsum] + ring + calc + ∫ x in V, (φ x * w x) * dψ x ∂MeasureTheory.volume + = ∫ x in V, w x * (φ x * dψ x) ∂MeasureTheory.volume := hleft_eq + _ = ∫ x in V, w x * ((fderiv ℝ ψφ x) ei) ∂MeasureTheory.volume - + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume := hsplit + _ = -∫ x in V, w.grad x i * ψφ x ∂MeasureTheory.volume - + ∫ x in V, w x * (ψ x * dφ x) ∂MeasureTheory.volume := by + rw [hw_eq] + _ = -∫ x in V, (φ x * w.grad x i + w x * dφ x) * ψ x + ∂MeasureTheory.volume := hright_eq + +@[simp] theorem localizedMulContDiffHasCompactSupportToAmbient_toFun + (w : H1Function V) (hV_meas : MeasurableSet V) (hVU : V ⊆ U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := V) w hV_meas hVU hφ hφ_compact hφ_sub).toFun = + fun x => φ x * w x := + rfl + +@[simp] theorem localizedMulContDiffHasCompactSupportToAmbient_grad + (w : H1Function V) (hV_meas : MeasurableSet V) (hVU : V ⊆ U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := V) w hV_meas hVU hφ hφ_compact hφ_sub).grad = + fun x i => φ x * w.grad x i + w x * (fderiv ℝ φ x) (basisVec i) := + rfl + +/-- Ambient `H¹` representative of the squared-cutoff forward difference +quotient `η² D_i^+ u`, localized through an interior shift-safe set. -/ +noncomputable def localizedSqCutoffForwardDifferenceQuotientToAmbient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + H1Function U := + localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := V) + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift) + hV.isOpen.measurableSet hVU + (φ := fun x => η x ^ 2) + (contDiff_sq hη) (hasCompactSupport_sq hη_compact) + ((tsupport_sq_subset η).trans hη_sub) + +@[simp] theorem localizedSqCutoffForwardDifferenceQuotientToAmbient_toFun + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toFun = + fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x := by + simp [localizedSqCutoffForwardDifferenceQuotientToAmbient] + +@[simp] theorem localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad = + fun x j => + η x ^ 2 * + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x j + + euclideanForwardDifferenceQuotient step i u.toFun x * + (2 * η x * euclideanGradient η x j) := by + funext x j + simp [localizedSqCutoffForwardDifferenceQuotientToAmbient] + rw [show (fderiv ℝ (fun x => η x ^ 2) x) (basisVec j) = + 2 * η x * euclideanGradient η x j by + simpa [euclideanCoordDeriv] using! euclideanCoordDeriv_sq hη j x] + ring_nf + exact Or.inl trivial + +/-- Each coordinate of the localized squared-cutoff forward quotient gradient +is supported inside the interior set carrying the cutoff. -/ +theorem support_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + Function.support + (fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j) ⊆ V := by + intro x hx + by_contra hxV + have hη_zero : η x = 0 := + image_eq_zero_of_notMem_tsupport (fun hxt => hxV (hη_sub hxt)) + have hdη_zero : euclideanGradient η x j = 0 := by + by_contra hne + exact hxV (hη_sub ((support_euclideanGradient_coord_subset_tsupport (φ := η) j) hne)) + have hzero : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j = 0 := by + simp [hη_zero, hdη_zero] + exact hx hzero + +/-- Pairing against the localized squared-cutoff forward quotient gradient is +also supported inside the cutoff interior set. -/ +theorem support_vecDot_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (G : Vec d → Vec d) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + Function.support + (fun x => + vecDot (G x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x)) ⊆ V := by + intro x hx + by_contra hxV + have hgrad_zero : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x = 0 := by + ext j + by_contra hne + exact hxV + (support_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (U := U) (V := V) u hV hVU step i j hVshift hη hη_compact hη_sub hne) + exact hx (by simp [hgrad_zero, vecDot]) + +/-- The unshifted localized-gradient pairing may be integrated over the +interior set carrying the cutoff. -/ +theorem integral_vecDot_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_eq_integral_on + (G : Vec d → Vec d) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (G x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + ∫ x in V, + vecDot (G x) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := + integral_subset_of_support_subset hVU + (support_vecDot_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (U := U) (V := V) G u hV hVU step i hVshift hη hη_compact hη_sub) + +/-- Localized zero-trace cutoff product. If `w` is only known as an `H¹` +function on an interior set `V`, multiplying by a smooth compactly supported +cutoff with support in `V` still gives an `H¹₀(U)` function on the ambient +domain. -/ +theorem memH10_localizedMul_of_contDiff_hasCompactSupport_tsupport_subset + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {φ F : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) + (hF : MemH1 V F) : + MemH10 U (fun x => φ x * F x) := by + rcases hF with ⟨w, rfl⟩ + by_cases hts : tsupport φ = ∅ + · have hφ_zero : φ = 0 := tsupport_eq_empty_iff.mp hts + simpa [hφ_zero] using! (memH10_zero (U := U)) + · obtain ⟨x0, hx0⟩ : (tsupport φ).Nonempty := Set.nonempty_iff_ne_empty.mpr hts + have hx0V : x0 ∈ V := hφ_sub hx0 + rcases Metric.mem_nhds_iff.mp (hV.isOpen.mem_nhds hx0V) with ⟨r, hr_pos, hr_sub⟩ + let r0 : ℝ := r / 2 + have hr0_pos : 0 < r0 := by + dsimp [r0] + positivity + have hball : Metric.closedBall x0 r0 ⊆ V := by + refine (Metric.closedBall_subset_ball ?_).trans hr_sub + dsimp [r0] + exact half_lt_self hr_pos + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ε : ℕ → ℝ := unitConvexApproxScale + let ψ : ℕ → Vec d → ℝ := fun n => + convexApproxSmoothRepresentative V ρ w x0 r0 (ε n) + let wφ : H1Function U := + localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := V) w hV.isOpen.measurableSet hVU hφ hφ_compact hφ_sub + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hε_pos : ∀ n : ℕ, 0 < ε n := by + intro n + dsimp [ε, unitConvexApproxScale] + positivity + have hε_eventually_lt_one : ∀ᶠ n : ℕ in Filter.atTop, ε n < 1 := by + simpa [ε] using + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hψ_smooth : ∀ n : ℕ, ContDiff ℝ (⊤ : ℕ∞) (ψ n) := by + intro n + dsimp [ψ] + exact contDiff_convexApproxSmoothRepresentative + hV.isOpen.measurableSet hρ (by norm_num : (1 : ENNReal) ≤ 2) w.memL2 hr0_pos + (hε_pos n) + have hψ_memL2 : ∀ n : ℕ, MeasureTheory.MemLp (ψ n) 2 (MeasureTheory.volume.restrict V) := by + intro n + let v : H1Function V := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hV ((hψ_smooth n).of_le (by simp)) + simpa [ψ, v, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + using v.memL2 + have hψ_grad_memL2 : ∀ n : ℕ, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) + 2 (MeasureTheory.volume.restrict V) := by + intro n i + let v : H1Function V := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hV ((hψ_smooth n).of_le (by simp)) + simpa [ψ, v, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + using v.gradMemL2 i + have hψ_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 + (MeasureTheory.volume.restrict V)) + Filter.atTop (nhds 0) := by + have hraw := + tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_memLpOn + (U := V) hV (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + w.memL2 hball hr0_pos + refine hraw.congr' ?_ + filter_upwards [hε_eventually_lt_one] with n hε1 + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hV.isOpen.measurableSet] with x hx + have hEq := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := w) hV hρ hx hball hr0_pos (hε_pos n) hε1 + simpa [ψ, ρ, ε, unitConvexApproxSequence] using hEq.symm + have hψ_grad_tendsto : ∀ i : Fin d, + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) + 2 (MeasureTheory.volume.restrict V)) + Filter.atTop (nhds 0) := by + intro i + have hraw := + tendsto_eLpNorm_sub_zero_one_sub_mul_unitConvexApproxSequence_of_memLpOn + (U := V) hV (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + (w.grad_memL2 i) hball hr0_pos + refine hraw.congr' ?_ + filter_upwards [hε_eventually_lt_one] with n hε1 + apply MeasureTheory.eLpNorm_congr_ae + have hbridge := + ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + (U := V) (ρ := ρ) (u := w) (gi := fun y => w.grad y i) + (i := i) (p := (2 : ENNReal)) hV hρ (by norm_num : (1 : ENNReal) ≤ 2) + w.memL2 (w.grad_memL2 i) (w.hasWeakPartialDerivOn i) + hball hr0_pos (hε_pos n) hε1 + filter_upwards [hbridge, MeasureTheory.ae_restrict_mem hV.isOpen.measurableSet] with x hx hxV + have hEq := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun y => w.grad y i) hV hρ hxV hball hr0_pos (hε_pos n) hε1 + rw [hx] + simpa [ψ, ρ, ε, unitConvexApproxSequence] using congrArg + (fun t : ℝ => (1 - unitConvexApproxScale n) * t - w.grad x i) hEq.symm + refine ⟨ + { toH1Function := wφ + approx := fun n x => φ x * ψ n x + approx_smooth := by + intro n + exact hφ.mul (hψ_smooth n) + approx_hasCompactSupport := by + intro n + simpa [mul_comm] using! hφ_compact.mul_left (f := ψ n) + approx_support_subset := by + intro n + exact ((tsupport_mul_subset_left (f := φ) (g := ψ n)).trans hφ_sub).trans hVU + tendsto_approx := by + let μV : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict V + have hφ_top : MeasureTheory.MemLp φ (⊤ : ENNReal) μV := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict V + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 μV) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * 0)) := + ENNReal.Tendsto.const_mul hψ_tendsto + (Or.inr hφ_top.eLpNorm_lt_top.ne) + have hupper : + ∀ n, + MeasureTheory.eLpNorm (fun x => φ x * ψ n x - wφ.toFun x) 2 + (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 μV := by + intro n + have hsupport : + Function.support (fun x => φ x * ψ n x - wφ.toFun x) ⊆ V := by + have hEq : + (fun x => φ x * ψ n x - wφ.toFun x) = + fun x => φ x * (ψ n x - w x) := by + funext x + simp [wφ] + ring + rw [hEq] + exact (Function.support_mul_subset_left φ (fun x => ψ n x - w x)).trans + (subset_tsupport φ |>.trans hφ_sub) + rw [eLpNorm_restrict_eq_restrict_of_support_subset + (U := U) (V := V) hVU hsupport] + have hdiff_mem : MeasureTheory.MemLp (fun x => ψ n x - w x) 2 μV := + (hψ_memL2 n).sub w.memL2 + have hEq : + (fun x => φ x * ψ n x - wφ.toFun x) = + φ • (fun x => ψ n x - w x) := by + funext x + simp [wφ] + ring + rw [hEq] + exact MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm 2 + hdiff_mem.aestronglyMeasurable φ + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hconst_tendsto + tendsto_approx_grad := by + intro i + let μV : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict V + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + have hφ_top : MeasureTheory.MemLp φ (⊤ : ENNReal) μV := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict V + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_top : MeasureTheory.MemLp dφ (⊤ : ENNReal) μV := + (hdφ_cont.memLp_of_hasCompactSupport hdφ_compact).restrict V + have hfirst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) 2 μV) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * 0)) := + ENNReal.Tendsto.const_mul (hψ_grad_tendsto i) + (Or.inr hφ_top.eLpNorm_lt_top.ne) + have hsecond_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 μV) + Filter.atTop + (nhds (MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μV * 0)) := + ENNReal.Tendsto.const_mul hψ_tendsto + (Or.inr hdφ_top.eLpNorm_lt_top.ne) + have hsum_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) 2 μV + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 μV) + Filter.atTop + (nhds + (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * 0 + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μV * 0)) := + hfirst_tendsto.add hsecond_tendsto + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) - + wφ.grad x i) + 2 (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) 2 μV + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μV * + MeasureTheory.eLpNorm (fun x => ψ n x - w x) 2 μV := by + intro n + let A : Vec d → ℝ := fun x => φ x * + ((fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) + let B : Vec d → ℝ := fun x => dφ x * (ψ n x - w x) + have hsupport : + Function.support + (fun x => + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) - + wφ.grad x i) ⊆ V := by + intro x hx + by_contra hxV + have hφ_zero : φ x = 0 := by + exact image_eq_zero_of_notMem_tsupport (fun hxt => hxV (hφ_sub hxt)) + have hdφ_zero : dφ x = 0 := by + by_contra hdφ_ne + exact hxV ((support_euclideanGradient_coord_subset_tsupport (φ := φ) i) + (by simpa [dφ, euclideanGradient, euclideanCoordDeriv] using hdφ_ne) |> hφ_sub) + have hprod_not : + x ∉ tsupport (fun y => φ y * ψ n y) := by + intro hxt + exact hxV (((tsupport_mul_subset_left (f := φ) (g := ψ n)).trans hφ_sub) hxt) + have hfd_zero : + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) = 0 := by + rw [fderiv_of_notMem_tsupport (𝕜 := ℝ) hprod_not] + simp + have hgrad_zero : wφ.grad x i = 0 := by + simp [wφ, dφ, hφ_zero, hdφ_zero] + exact hx (by simp [hfd_zero, hgrad_zero]) + rw [eLpNorm_restrict_eq_restrict_of_support_subset + (U := U) (V := V) hVU hsupport] + have hbase_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - w.grad x i) 2 μV := + (hψ_grad_memL2 n i).sub (w.gradMemL2 i) + have hbase_mem : MeasureTheory.MemLp (fun x => ψ n x - w x) 2 μV := + (hψ_memL2 n).sub w.memL2 + have hA_mem : MeasureTheory.MemLp A 2 μV := by + simpa [A, μV] using hbase_grad_mem.mul' hφ_top + have hB_mem : MeasureTheory.MemLp B 2 μV := by + simpa [B, dφ, μV] using hbase_mem.mul' hdφ_top + have hEq : + (fun x => + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) - + wφ.grad x i) = + fun x => A x + B x := by + funext x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hψ_diff : DifferentiableAt ℝ (ψ n) x := + ((hψ_smooth n).contDiffAt).differentiableAt (by simp) + rw [show (fun y => φ y * ψ n y) = φ * ψ n by rfl, + fderiv_mul hφ_diff hψ_diff] + simp [A, B, dφ, wφ, smul_eq_mul, add_apply] + ring + rw [hEq] + refine (MeasureTheory.eLpNorm_add_le hA_mem.aestronglyMeasurable + hB_mem.aestronglyMeasurable (by norm_num)).trans ?_ + refine add_le_add ?_ ?_ + · simpa [A, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm 2 + hbase_grad_mem.aestronglyMeasurable φ) + · simpa [B, dφ, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm 2 + hbase_mem.aestronglyMeasurable dφ) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa [zero_add] using hsum_tendsto }, rfl⟩ + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/NeumannInterior.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/NeumannInterior.lean new file mode 100644 index 0000000000..df57df4a9f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/NeumannInterior.lean @@ -0,0 +1,70 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise + +/-! # Neumann Interior -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold Topology + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {V : Set (Vec d)} {Q : TriadicCube d} {F : Vec d → ℝ} + +/-- Local strict-inner weak Hessian estimate for a cube Neumann solution. + +This is the direct Neumann-solution consumer of the hlim-free interior +difference-quotient theorem. It is still an interior estimate: boundary +crossing is reserved for the reflected-block enlargement step. -/ +theorem exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + (W : MeanZeroNeumannPoissonSolution Q F) + (hmean : cubeAverage Q F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (hV : IsOpenBoundedConvexDomain V) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uS : H1Function (scaledOpenCubeSet Q ρ₁), + uS.toFun = W.w.toH1Function.toFun ∧ + uS.grad = W.w.toH1Function.grad ∧ + ∃ H : HasWeakHessianOn (scaledOpenCubeSet Q ρ₁) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d Q W.w.toH1Function F i ρ₁ ρ₂ σ₁ σ₂ θ := by + have hweak : WeakPoissonEquationOn (openCubeSet Q) W.w.toH1Function F := + W.weakPoissonEquationOnCube hmean hF + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + exact + hweak.exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + hFopen hV η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hρ₁_nonneg + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OpenInnerFunctional.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OpenInnerFunctional.lean new file mode 100644 index 0000000000..89804b06bc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OpenInnerFunctional.lean @@ -0,0 +1,372 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian + +/-! # Open Inner Functional -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +/-- The square of a smooth weak test on an open inner cube is supported in that +open inner cube. -/ +private theorem support_norm_sq_h1WeakTest_subset_scaledOpenCubeSet + (Q : TriadicCube d) (ρ₁ : ℝ) + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + Function.support (fun x => ‖φ x‖ ^ (2 : ℝ)) ⊆ scaledOpenCubeSet Q ρ₁ := by + intro x hx + have hφ_ne : φ x ≠ 0 := by + intro hφ_zero + apply hx + change ‖φ x‖ ^ (2 : ℝ) = 0 + rw [hφ_zero, norm_zero, Real.zero_rpow (by norm_num : (2 : ℝ) ≠ 0)] + exact φ.support_subset (subset_tsupport (φ : Vec d → ℝ) hφ_ne) + +/-- The squared distance between two smooth weak tests on an open inner cube is +supported in that open inner cube. -/ +private theorem support_norm_sq_sub_h1WeakTest_subset_scaledOpenCubeSet + (Q : TriadicCube d) (ρ₁ : ℝ) + (φ ψ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + Function.support (fun x => ‖φ x - ψ x‖ ^ (2 : ℝ)) ⊆ scaledOpenCubeSet Q ρ₁ := by + intro x hx + by_cases hφ_zero : φ x = 0 + · have hψ_ne : ψ x ≠ 0 := by + intro hψ_zero + apply hx + change ‖φ x - ψ x‖ ^ (2 : ℝ) = 0 + rw [hφ_zero, hψ_zero, sub_self, norm_zero, + Real.zero_rpow (by norm_num : (2 : ℝ) ≠ 0)] + exact ψ.support_subset (subset_tsupport (ψ : Vec d → ℝ) hψ_ne) + · exact φ.support_subset (subset_tsupport (φ : Vec d → ℝ) hφ_zero) + +/-- A smooth weak test supported in the open inner cube has the same squared +`L²` integral over the corresponding closed inner cube. -/ +theorem integral_norm_sq_h1WeakTest_scaledClosedCubeSet_eq_scaledOpenCubeSet + (Q : TriadicCube d) (ρ₁ : ℝ) + (φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = + ∫ x in scaledOpenCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume := + integral_subset_of_support_subset + (U := scaledClosedCubeSet Q ρ₁) (V := scaledOpenCubeSet Q ρ₁) + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁) + (support_norm_sq_h1WeakTest_subset_scaledOpenCubeSet Q ρ₁ φ) + +/-- The squared distance between two open-inner smooth weak tests has the same +integral over the corresponding closed inner cube. -/ +theorem integral_norm_sq_sub_h1WeakTest_scaledClosedCubeSet_eq_scaledOpenCubeSet + (Q : TriadicCube d) (ρ₁ : ℝ) + (φ ψ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = + ∫ x in scaledOpenCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume := + integral_subset_of_support_subset + (U := scaledClosedCubeSet Q ρ₁) (V := scaledOpenCubeSet Q ρ₁) + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁) + (support_norm_sq_sub_h1WeakTest_subset_scaledOpenCubeSet Q ρ₁ φ ψ) + +/-- The quotient-Hessian pairing depends only on the open-inner scalar `L²` +class of a smooth weak test. -/ +theorem neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerOpenCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (φ ψ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁)) + (hφψ : φ.toScalarL2 = ψ.toScalarL2) : + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume = + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (ψ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume := by + have hφψ_zero_open : + ∫ x in scaledOpenCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = 0 := + integral_norm_sq_sub_eq_zero_of_h1WeakTestFunction_toScalarL2_eq φ ψ hφψ + have hφψ_zero_closed : + ∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x - ψ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume = 0 := by + rw [integral_norm_sq_sub_h1WeakTest_scaledClosedCubeSet_eq_scaledOpenCubeSet + Q ρ₁ φ ψ] + exact hφψ_zero_open + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_eq_of_l2_dist_zero_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + φ.smooth ψ.smooth φ.compactSupport ψ.compactSupport + (φ.support_subset.trans (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁)) + (ψ.support_subset.trans (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁)) + hφψ_zero_closed + +/-- The concrete quotient-Hessian pairing on the dense smooth-test submodule +over the open inner cube. The estimates are still supplied by the closed +inner cube, using `scaledOpenCubeSet_subset_scaledClosedCubeSet`. -/ +noncomputable def openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁) →ₗ[ℝ] ℝ := by + let S : Set (Vec d) := scaledOpenCubeSet Q ρ₁ + let rep : + h1WeakTestScalarL2Submodule (d := d) S → H1WeakTestFunction S := + h1WeakTestScalarL2Representative + let pairing : H1WeakTestFunction S → ℝ := fun φ => + -∫ x in V, + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ (φ : Vec d → ℝ) x) (basisVec j) ∂MeasureTheory.volume + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + have hSV : S ⊆ V := by + simpa [S] using + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + refine + { toFun := fun x => pairing (rep x) + map_add' := ?_ + map_smul' := ?_ } + · intro x y + have hrep_add_eq : + pairing (rep (x + y)) = pairing ((rep x).add (rep y)) := by + unfold pairing + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerOpenCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + (rep (x + y)) ((rep x).add (rep y)) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_add, + h1WeakTestScalarL2Representative_toScalarL2, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_add : + pairing ((rep x).add (rep y)) = pairing (rep x) + pairing (rep y) := by + simpa [pairing, S] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_add + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) i j hVshift (S := S) hSV (rep x) (rep y) + exact hrep_add_eq.trans hpair_add + · intro c x + have hrep_smul_eq : + pairing (rep (c • x)) = pairing ((rep x).smul c) := by + unfold pairing + exact + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerOpenCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + (rep (c • x)) ((rep x).smul c) (by + rw [h1WeakTestScalarL2Representative_toScalarL2, + H1WeakTestFunction.toScalarL2_smul, + h1WeakTestScalarL2Representative_toScalarL2] + rfl) + have hpair_smul : + pairing ((rep x).smul c) = c * pairing (rep x) := by + simpa [pairing, S] using + neg_integral_forwardDifferenceQuotient_mul_fderiv_h1WeakTest_smul + (U := openCubeSet Q) (V := V) uQ hV hVU + (step := step) i j hVshift (S := S) hSV c (rep x) + calc + pairing (rep (c • x)) = pairing ((rep x).smul c) := hrep_smul_eq + _ = c * pairing (rep x) := hpair_smul + _ = c • pairing (rep x) := by rfl + +/-- The open-inner smooth-test functional satisfies the closed-inner +square-root operator bound. -/ +theorem norm_openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional_apply_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (x : h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)) : + ‖openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ := by + let φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁) := + h1WeakTestScalarL2Representative x + have hφ_sub_closed : tsupport (φ : Vec d → ℝ) ⊆ scaledClosedCubeSet Q ρ₁ := + φ.support_subset.trans (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁) + have hbound := + h.abs_neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerCube_le_sqrt_energy_bound_mul_l2_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + φ.smooth φ.compactSupport hφ_sub_closed + have hroot : + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ := by + rw [integral_norm_sq_h1WeakTest_scaledClosedCubeSet_eq_scaledOpenCubeSet Q ρ₁ φ] + calc + (∫ x in scaledOpenCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖φ.toScalarL2‖ := + integral_norm_sq_rpow_half_eq_norm_h1WeakTestFunction_toScalarL2 φ + _ = ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ := by + rw [show φ.toScalarL2 = + ((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x) by + simpa [φ, Submodule.subtype] using h1WeakTestScalarL2Representative_toScalarL2 x] + calc + ‖openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x‖ = + |(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)| := by + change ‖(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)‖ = + |(-∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (φ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume)| + rw [Real.norm_eq_abs] + _ ≤ openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + (∫ x in scaledClosedCubeSet Q ρ₁, ‖φ x‖ ^ (2 : ℝ) + ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) := by + simpa [openCubeInnerQuotientHessianSmoothTestBound, φ] using hbound + _ = openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x)‖ := by + rw [hroot] + +/-- Continuous extension of the open-inner quotient-Hessian functional from +smooth tests to all scalar `L²` fields on the open inner cube. -/ +noncomputable def openCubeInnerOpenCubeQuotientHessianFunctional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + ScalarL2 (scaledOpenCubeSet Q ρ₁) →L[ℝ] ℝ := + extendH1WeakTestScalarL2Functional + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + +/-- The continuous open-inner quotient-Hessian functional inherits the same +explicit bound as the dense smooth-test functional. -/ +theorem norm_openCubeInnerOpenCubeQuotientHessianFunctional_apply_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) + (x : ScalarL2 (scaledOpenCubeSet Q ρ₁)) : + ‖openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ * + ‖x‖ := by + exact + norm_extendH1WeakTestScalarL2Functional_apply_le + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (isOpen_scaledOpenCubeSet Q ρ₁) + (volume_scaledOpenCubeSet_ne_top_of_nonneg Q hρ₁_nonneg) + (openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + (openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + (norm_openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional_apply_le + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + x + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OriginCubeEndpoint.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OriginCubeEndpoint.lean new file mode 100644 index 0000000000..8873b31164 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/OriginCubeEndpoint.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.GradientAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentEnergyFactor +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCoerciveDepth + +/-! # Origin Cube Endpoint -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- The origin-cube depth constant obtained by combining the reflected-parent +Hessian estimate with the parent-normalized descendant Poincare handoff. -/ +noncomputable def originCubeWeakInteriorDepthConstant (d : ℕ) (m : ℤ) : ℝ := + let Q : TriadicCube d := originCube d m + (((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + (((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstant d m) + +theorem originCubeWeakInteriorDepthConstant_nonneg (d : ℕ) (m : ℤ) : + 0 ≤ originCubeWeakInteriorDepthConstant d m := by + let Q : TriadicCube d := originCube d m + have hparent : + 0 ≤ ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hcount : + 0 ≤ ((d : ℝ) * (d : ℝ)) * + MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstant d m := by + exact mul_nonneg + (mul_nonneg (Nat.cast_nonneg d) (Nat.cast_nonneg d)) + (MeanZeroNeumannPoissonSolution.originCubeParentReducedSolverEnergyConstant_nonneg d m) + dsimp [originCubeWeakInteriorDepthConstant, Q] + exact mul_nonneg hparent hcount + +namespace MeanZeroNeumannPoissonSolution + +theorem originCube_sum_reducedSolverEnergyBound_le_depthConstant_mul_cubeLpNorm + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} : + (((cubeVolume (originCube d m))⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBound d m F k) ≤ + originCubeWeakInteriorDepthConstant d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let Q : TriadicCube d := originCube d m + let P : ℝ := + ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let K : ℝ := originCubeParentReducedSolverEnergyConstant d m + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hsum_eq : + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBound d m F k) = + ((d : ℝ) * (d : ℝ)) * (K * L) := by + calc + (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBound d m F k) + = ∑ k : Fin d, ∑ _l : Fin d, K * L := by + refine Finset.sum_congr rfl ?_ + intro k _hk + refine Finset.sum_congr rfl ?_ + intro _l _hl + simpa [K, L, Q] using + originCubeParentReducedSolverEnergyBound_eq_constant_mul_cubeLpNorm d m F k + _ = ((d : ℝ) * (d : ℝ)) * (K * L) := by + simp + ring + calc + P * (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBound d m F k) + = P * (((d : ℝ) * (d : ℝ)) * (K * L)) := by + rw [hsum_eq] + _ = originCubeWeakInteriorDepthConstant d m * L := by + dsimp [originCubeWeakInteriorDepthConstant, P, K, L, Q] + ring + _ ≤ originCubeWeakInteriorDepthConstant d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + exact le_rfl + +theorem cubeBesovDepthSeminorm_grad_originCube_le_weakInteriorDepthConstant + {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hmean : cubeAverage (originCube d m) F = 0) + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (i : Fin d) (_N j : ℕ) (_hj : j ∈ Finset.range (_N + 1)) : + cubeBesovDepthSeminorm (originCube d m) 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + originCubeWeakInteriorDepthConstant d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBound + hmean hF with + ⟨_uP, _huP_toFun, _huP_grad, H, hH⟩ + let Q : TriadicCube d := originCube d m + let P : ℝ := + ((cubeVolume Q)⁻¹) ^ (1 / (2 : ℝ)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + have hP_nonneg : 0 ≤ P := by + dsimp [P] + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg + have hdepth : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + P * H.hessianCoordL2NormSum := by + simpa [Q, P] using + H.cubeBesovDepthSeminorm_gradCoord_le_parentVolume_scaledCoercive i j + calc + cubeBesovDepthSeminorm (originCube d m) 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j + ≤ P * H.hessianCoordL2NormSum := by + simpa [Q] using hdepth + _ ≤ P * (∑ k : Fin d, ∑ _l : Fin d, + originCubeParentReducedSolverEnergyBound d m F k) := by + exact mul_le_mul_of_nonneg_left hH hP_nonneg + _ ≤ originCubeWeakInteriorDepthConstant d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + simpa [Q, P] using + originCube_sum_reducedSolverEnergyBound_le_depthConstant_mul_cubeLpNorm + (d := d) (m := m) (F := F) + +theorem cubePoissonGradientDualTestNormL2CoreEstimate_originCube + {d : ℕ} (m : ℤ) : + CubePoissonGradientDualTestNormL2CoreEstimate (originCube d m) + (originCubeWeakInteriorDepthConstant d m + + cubePoissonGradientAverageConstant (originCube d m)) := by + refine + cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm + (originCubeWeakInteriorDepthConstant_nonneg d m) ?_ + intro F hF hmean W i N j hj + exact + cubeBesovDepthSeminorm_grad_originCube_le_weakInteriorDepthConstant + hF hmean W i N j hj + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PoissonTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PoissonTranslation.lean new file mode 100644 index 0000000000..fe0be6aa18 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PoissonTranslation.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.CubeTranslationTransport + +/-! # Poisson Translation -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} + +/-- Pull a cube Neumann solution back to the centered cube of the same scale. -/ +noncomputable def untranslateToOrigin (Q : TriadicCube d) {F : Vec d → ℝ} + (W : MeanZeroNeumannPoissonSolution Q F) : + MeanZeroNeumannPoissonSolution (originCube d Q.scale) + (fun x => F (x + triadicCubeShift Q)) := by + let Q₀ : TriadicCube d := originCube d Q.scale + let U₀ : Set (Vec d) := openCubeSet Q₀ + let z : Vec d := triadicCubeShift Q + have hU : openCubeSet Q = translateSet z U₀ := by + simpa [Q₀, U₀, z] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let wT : H1MeanZeroFunction (translateSet z U₀) := + { toH1Function := + { toFun := W.w.toH1Function.toFun + grad := W.w.toH1Function.grad + memL2 := by + simpa [← hU] using W.w.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [← hU] using W.w.toH1Function.gradMemL2 i + hasWeakGradient := by + simpa [← hU] using W.w.toH1Function.hasWeakGradient } + meanZero := by + simpa [MeanZeroOn, ← hU] using W.w.meanZero } + refine + { w := wT.untranslate z + equation := ?_ } + intro φ + let φT : H1MeanZeroFunction (translateSet z U₀) := φ.translate z + let φQ : H1MeanZeroFunction (openCubeSet Q) := + { toH1Function := + { toFun := φT.toH1Function.toFun + grad := φT.toH1Function.grad + memL2 := by + simpa [hU] using φT.toH1Function.memL2 + gradMemL2 := by + intro i + simpa [hU] using φT.toH1Function.gradMemL2 i + hasWeakGradient := by + simpa [hU] using φT.toH1Function.hasWeakGradient } + meanZero := by + simpa [MeanZeroOn, hU] using φT.meanZero } + have hEqT : + ∫ x in translateSet z U₀, + vecDot (wT.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume := by + simpa [wT, φQ, hU] using W.equation φQ + have hleft : + ∫ x in U₀, + vecDot ((wT.untranslate z).toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in translateSet z U₀, + vecDot (wT.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [φT, H1MeanZeroFunction.translate, H1Function.translate, + H1MeanZeroFunction.untranslate, H1Function.untranslate, U₀, z, + sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x => vecDot (wT.toH1Function.grad x) (φT.toH1Function.grad x))) + have hright : + ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume = + ∫ x in U₀, F (x + z) * φ.toH1Function x + ∂MeasureTheory.volume := by + symm + simpa [φT, H1MeanZeroFunction.translate, H1Function.translate, + sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U₀ + (fun x => F x * φT.toH1Function x)) + calc + ∫ x in openCubeSet Q₀, + vecDot ((wT.untranslate z).toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume + = ∫ x in translateSet z U₀, + vecDot (wT.toH1Function.grad x) (φT.toH1Function.grad x) + ∂MeasureTheory.volume := by + simpa [U₀] using hleft + _ = ∫ x in translateSet z U₀, F x * φT.toH1Function x + ∂MeasureTheory.volume := hEqT + _ = ∫ x in U₀, F (x + z) * φ.toH1Function x + ∂MeasureTheory.volume := hright + _ = ∫ x in openCubeSet Q₀, F (x + triadicCubeShift Q) * φ.toH1Function x + ∂MeasureTheory.volume := by + simp [Q₀, U₀, z] + +theorem untranslateToOrigin_translate_grad (Q : TriadicCube d) {F : Vec d → ℝ} + (W : MeanZeroNeumannPoissonSolution Q F) (x : Vec d) : + (((W.untranslateToOrigin Q).w.toH1Function).translate (triadicCubeShift Q)).grad x = + W.w.toH1Function.grad x := by + simp [untranslateToOrigin, H1MeanZeroFunction.untranslate, H1Function.untranslate, + H1Function.translate, sub_eq_add_neg, add_assoc] + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PositiveBesovCore.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PositiveBesovCore.lean new file mode 100644 index 0000000000..c478528e24 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/PositiveBesovCore.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.DualTestNorm +public import LeanPool.CoarseGraining.Homogenization.Deterministic.WeakNormInterfacesComponentwise + +/-! # Positive Besov Core -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-! +# Positive Besov handoff for the cube Neumann `W^{2,2}` route + +This file records the algebraic endpoint bridge from the positive vector +Besov seminorms controlled by the Hessian/Poincare part of the C.2 argument +to the downstream `CubePoissonGradientDualTestNormL2CoreEstimate`. + +The remaining analytic content is intentionally visible in the hypotheses: +uniform control of the positive vector partial seminorms of the Poisson +gradient, and of the component averages. +-/ + +/-- Componentwise `B¹_{2,1}` positive dual-test control by the positive vector +partial seminorm, plus the cube-average mode. This is the local form needed by +the Neumann CZ endpoint target. -/ +theorem cubeBesovDualTestNorm_two_one_component_le_scaleWeight_mul_posVectorPartial_add_avg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (u : Vec d → Vec d) + (i : Fin d) (N : ℕ) + (hu : MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => u x i) ≤ + cubeBesovScaleWeight s Q * + cubeBesovPositiveVectorPartialSeminormTwo Q s N u + + cubeBesovScaleWeight s Q * ‖cubeAverage Q (fun x => u x i)‖ := by + have hconj : + cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s + (2 : ℝ≥0∞) (1 : ℝ≥0∞) N (fun x => u x i) hconj] + unfold cubeBesovPartialNormTop + exact add_le_add + (by + simpa [hpConj] using + cubeBesovPartialSeminormTop_two_component_le_scaleWeight_mul_positiveVectorPartialSeminormTwo + Q s u i N hu) + le_rfl + +/-- Scalar form of the `q = 1` dual-test norm at `p = 2`: the top positive +partial seminorm plus the average mode. -/ +theorem cubeBesovDualTestNorm_two_one_eq_partialSeminormTop_add_avg + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (N : ℕ) (g : Vec d → ℝ) : + cubeBesovDualTestNorm Q s (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g = + cubeBesovPartialSeminormTop Q s (2 : ℝ≥0∞) N g + + cubeBesovScaleWeight s Q * ‖cubeAverage Q g‖ := by + have hconj : + cubeBesovConjExponent (1 : ℝ≥0∞) = ∞ := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (1 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞))) + have hpConj : + cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + rw [cubeBesovDualTestNorm_of_conjExponent_eq_top Q s + (2 : ℝ≥0∞) (1 : ℝ≥0∞) N g hconj] + simp [cubeBesovPartialNormTop, hpConj] + +/-- A finite top seminorm is bounded once each depth seminorm in its finite +range is bounded. -/ +theorem cubeBesovPartialSeminormTop_le_of_forall_depthSeminorm_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (N : ℕ) (g : Vec d → ℝ) {B : ℝ} + (hB : ∀ j ∈ Finset.range (N + 1), + cubeBesovDepthSeminorm Q s p g j ≤ B) : + cubeBesovPartialSeminormTop Q s p N g ≤ B := by + unfold cubeBesovPartialSeminormTop + exact Finset.sup'_le + (s := Finset.range (N + 1)) (H := ⟨0, by simp⟩) + (f := fun j => cubeBesovDepthSeminorm Q s p g j) hB + +/-- If the scalar oscillation is uniformly bounded on every depth-`j` +descendant, then the depth seminorm is bounded by the depth weight times that +uniform bound. -/ +theorem cubeBesovDepthSeminorm_two_le_depthWeight_mul_of_descendant_oscillation_le + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (g : Vec d → ℝ) + (j : ℕ) {A : ℝ} (hA : 0 ≤ A) + (hosc : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) g ≤ A) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j ≤ + cubeBesovDepthWeight Q s j * A := by + have hsqAvg : + descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2) ≤ + A ^ 2 := by + calc + descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2) + ≤ descendantsAverage Q j (fun _R => A ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ + (cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) g) + (hosc R hR) 2 + _ = A ^ 2 := by simp + have hAvgNonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R _hR => sq_nonneg _ + have hroot : + (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2)) ^ (1 / 2 : ℝ) + ≤ A := by + calc + (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2)) ^ (1 / 2 : ℝ) + ≤ (A ^ 2) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hAvgNonneg hsqAvg (by norm_num) + _ = A := sq_rpow_half_eq_of_nonneg hA + unfold cubeBesovDepthSeminorm cubeBesovDepthAverage + simpa using + mul_le_mul_of_nonneg_left hroot (cubeBesovDepthWeight_nonneg Q s j) + +/-- Averaged version of the scalar depth handoff. If the scalar oscillation is +pointwise bounded by a nonnegative descendant-local quantity `A R`, then the +depth seminorm is bounded by the depth weight times the descendant `L²` +average of `A`. This is the form compatible with summing local Hessian energy, +rather than taking a sup over all descendants. -/ +theorem cubeBesovDepthSeminorm_two_le_depthWeight_mul_descendantsAverage_sq_rpow_half + {d : ℕ} (Q : TriadicCube d) (s : ℝ) (g : Vec d → ℝ) + (j : ℕ) (A : TriadicCube d → ℝ) + (_hA : ∀ R ∈ descendantsAtDepth Q j, 0 ≤ A R) + (hosc : ∀ R ∈ descendantsAtDepth Q j, + cubeBesovOscillation R (2 : ℝ≥0∞) g ≤ A R) : + cubeBesovDepthSeminorm Q s (2 : ℝ≥0∞) g j ≤ + cubeBesovDepthWeight Q s j * + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) := by + have hsqAvg : + descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2) ≤ + descendantsAverage Q j (fun R => (A R) ^ 2) := by + refine descendantsAverage_le_descendantsAverage Q j ?_ + intro R hR + exact pow_le_pow_left₀ + (cubeBesovOscillation_nonneg R (2 : ℝ≥0∞) g) + (hosc R hR) 2 + have hAvgNonneg : + 0 ≤ descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2) := by + exact descendantsAverage_nonneg Q j _ fun R _hR => sq_nonneg _ + have hroot : + (descendantsAverage Q j + (fun R => (cubeBesovOscillation R (2 : ℝ≥0∞) g) ^ 2)) ^ (1 / 2 : ℝ) + ≤ + (descendantsAverage Q j (fun R => (A R) ^ 2)) ^ (1 / 2 : ℝ) := by + exact Real.rpow_le_rpow hAvgNonneg hsqAvg (by norm_num) + unfold cubeBesovDepthSeminorm cubeBesovDepthAverage + simpa using + mul_le_mul_of_nonneg_left hroot (cubeBesovDepthWeight_nonneg Q s j) + +/-- If the Poisson gradient has uniform positive-vector Besov seminorm control +and controlled component averages, then it satisfies the exact downstream +`L²` core dual-test estimate. + +This is deliberately conditional: proving the two hypotheses from the weak +Hessian witness and local Poincare is the remaining analytic bridge. -/ +theorem cubePoissonGradientDualTestNormL2CoreEstimate_of_posVectorPartial_and_average + {d : ℕ} {Q : TriadicCube d} {Cpos Cavg : ℝ} + (hCpos : 0 ≤ Cpos) (hCavg : 0 ≤ Cavg) + (hpos : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (N : ℕ), + cubeBesovScaleWeight 1 Q * + cubeBesovPositiveVectorPartialSeminormTwo Q 1 N + (fun x => W.w.toH1Function.grad x) ≤ + Cpos * cubeLpNorm Q (2 : ℝ≥0∞) F) + (havg : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d), + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ ≤ + Cavg * cubeLpNorm Q (2 : ℝ≥0∞) F) : + CubePoissonGradientDualTestNormL2CoreEstimate Q (Cpos + Cavg) := by + refine ⟨add_nonneg hCpos hCavg, ?_⟩ + intro F hF hmean W + let G : Vec d → Vec d := fun x => W.w.toH1Function.grad x + have hGmem : + MeasureTheory.MemLp G (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact MeasureTheory.MemLp.of_eval + (fun i : Fin d => W.w.toH1Function.grad_memL2_normalizedCubeMeasure i) + refine ⟨?_, ?_⟩ + · intro i N + have hcomponent := + cubeBesovDualTestNorm_two_one_component_le_scaleWeight_mul_posVectorPartial_add_avg + Q 1 G i N hGmem + have hposN := hpos F hF hmean W N + have havgi := havg F hF hmean W i + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) + ≤ cubeBesovScaleWeight 1 Q * + cubeBesovPositiveVectorPartialSeminormTwo Q 1 N G + + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => G x i)‖ := by + simpa [G] using hcomponent + _ ≤ Cpos * cubeLpNorm Q (2 : ℝ≥0∞) F + + Cavg * cubeLpNorm Q (2 : ℝ≥0∞) F := by + exact add_le_add hposN havgi + _ = (Cpos + Cavg) * cubeLpNorm Q (2 : ℝ≥0∞) F := by + ring + · intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q G i hGmem + +/-- Scalar-top-seminorm version of the endpoint handoff. This is the form +fed most directly by descendant Poincare estimates for each gradient +component. -/ +theorem cubePoissonGradientDualTestNormL2CoreEstimate_of_partialSeminormTop_and_average + {d : ℕ} {Q : TriadicCube d} {Csemi Cavg : ℝ} + (hCsemi : 0 ≤ Csemi) (hCavg : 0 ≤ Cavg) + (hsemi : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d) (N : ℕ), + cubeBesovPartialSeminormTop Q 1 (2 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) ≤ + Csemi * cubeLpNorm Q (2 : ℝ≥0∞) F) + (havg : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d), + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ ≤ + Cavg * cubeLpNorm Q (2 : ℝ≥0∞) F) : + CubePoissonGradientDualTestNormL2CoreEstimate Q (Csemi + Cavg) := by + refine ⟨add_nonneg hCsemi hCavg, ?_⟩ + intro F hF hmean W + let G : Vec d → Vec d := fun x => W.w.toH1Function.grad x + have hGmem : + MeasureTheory.MemLp G (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact MeasureTheory.MemLp.of_eval + (fun i : Fin d => W.w.toH1Function.grad_memL2_normalizedCubeMeasure i) + refine ⟨?_, ?_⟩ + · intro i N + have hsemiN := hsemi F hF hmean W i N + have havgi := havg F hF hmean W i + calc + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) + = + cubeBesovPartialSeminormTop Q 1 (2 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) + + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ := by + exact cubeBesovDualTestNorm_two_one_eq_partialSeminormTop_add_avg + Q 1 N (fun x => W.w.toH1Function.grad x i) + _ ≤ Csemi * cubeLpNorm Q (2 : ℝ≥0∞) F + + Cavg * cubeLpNorm Q (2 : ℝ≥0∞) F := by + exact add_le_add hsemiN havgi + _ = (Csemi + Cavg) * cubeLpNorm Q (2 : ℝ≥0∞) F := by + ring + · intro i + exact cubeBesovDualLocalMemLpGlobal_component_of_memLp Q G i hGmem + +/-- Depthwise scalar-seminorm version of the endpoint handoff. This is the +form most directly targeted by descendant Poincare estimates. -/ +theorem cubePoissonGradientDualTestNormL2CoreEstimate_of_depthSeminorm_and_average + {d : ℕ} {Q : TriadicCube d} {Cdepth Cavg : ℝ} + (hCdepth : 0 ≤ Cdepth) (hCavg : 0 ≤ Cavg) + (hdepth : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d) (N j : ℕ), + j ∈ Finset.range (N + 1) → + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) j ≤ + Cdepth * cubeLpNorm Q (2 : ℝ≥0∞) F) + (havg : + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) (i : Fin d), + cubeBesovScaleWeight 1 Q * + ‖cubeAverage Q (fun x => W.w.toH1Function.grad x i)‖ ≤ + Cavg * cubeLpNorm Q (2 : ℝ≥0∞) F) : + CubePoissonGradientDualTestNormL2CoreEstimate Q (Cdepth + Cavg) := by + refine + cubePoissonGradientDualTestNormL2CoreEstimate_of_partialSeminormTop_and_average + hCdepth hCavg ?_ havg + intro F hF hmean W i N + exact + cubeBesovPartialSeminormTop_le_of_forall_depthSeminorm_le + Q 1 (2 : ℝ≥0∞) N (fun x => W.w.toH1Function.grad x i) + (fun j hj => hdepth F hF hmean W i N j hj) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuantCutoffLowerH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuantCutoffLowerH1.lean new file mode 100644 index 0000000000..ca76f25b22 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuantCutoffLowerH1.lean @@ -0,0 +1,1024 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.EnergyHalf + +/-! # Quant Cutoff Lower H1 -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + +private theorem norm_basisVec {d : ℕ} (i : Fin d) : + ‖basisVec i‖ = (1 : ℝ) := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases hji : j = i + · subst hji + simp [basisVec] + · simp [basisVec, hji] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +/-- Absorbed direct squared-cutoff Caccioppoli estimate for the forward +difference quotient. This is the closed direct-test form: the only right-hand +side terms are the forcing and the usual cutoff-gradient error. -/ +theorem directDifferenceQuotient_sqCutoff_energy_quarter_le_two_forcing_sq_add_three_error + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) + (hη_abs_le_one : ∀ x, |η x| ≤ 1) : + (1 / 4 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume := by + let M : ℝ := + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume + let Fsq : ℝ := ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + let Gsq : ℝ := + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + let E : Vec d → ℝ := + fun x => + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) + let Eint : ℝ := ∫ x in V, E x ∂MeasureTheory.volume + let E2int : ℝ := + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_half_le_two_forcing_sq_add_eighth_localizedSqCutoffForwardGradient_sq_add_error + hU hf hV hVU hstep i hVshift hη hη_compact hη_sub + have habsorb := + eighth_integral_sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_coord_le_quarter_energy_add_error + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub hη_abs_le_one + have hbase' : + (1 / 2 : ℝ) * M ≤ (2 : ℝ) * Fsq + (1 / 8 : ℝ) * Gsq + E2int := by + change + (1 / 2 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (1 / 8 : ℝ) * + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume + + ∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + exact hbase + have habsorb' : + (1 / 8 : ℝ) * Gsq ≤ (1 / 4 : ℝ) * M + Eint := by + change + (1 / 8 : ℝ) * + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume ≤ + (1 / 4 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume + + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume + exact habsorb + have hquarter : + (1 / 4 : ℝ) * M ≤ (2 : ℝ) * Fsq + Eint + E2int := by + linarith + have hE2_eq : E2int = (2 : ℝ) * Eint := by + calc + E2int = + ∫ x in V, (2 : ℝ) * E x ∂MeasureTheory.volume := by + change + (∫ x in V, + 2 * (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 * + vecNormSq (euclideanGradient η x) ∂MeasureTheory.volume) = + ∫ x in V, (2 : ℝ) * E x ∂MeasureTheory.volume + congr with x + simp [E] + ring + _ = (2 : ℝ) * ∫ x in V, E x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = (2 : ℝ) * Eint := rfl + have hE_sum : Eint + E2int = (3 : ℝ) * Eint := by + rw [hE2_eq] + ring + have htarget : (1 / 4 : ℝ) * M ≤ (2 : ℝ) * Fsq + (3 : ℝ) * Eint := by + linarith + change (1 / 4 : ℝ) * M ≤ (2 : ℝ) * Fsq + (3 : ℝ) * Eint + exact htarget + +/-- Quantitative cube cutoffs are bounded by one in absolute value. -/ +theorem quantitativeCubeCutoff_abs_le_one {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) (x : Vec d) : + |η x| ≤ 1 := + abs_le.mpr ⟨by linarith [η.nonneg x], η.le_one x⟩ + +/-- The squared Euclidean-gradient vector is controlled by the operator norm +of the Fréchet derivative, with the explicit finite-dimensional coordinate +factor. -/ +theorem vecNormSq_euclideanGradient_le_card_mul_fderiv_norm_sq + (η : Vec d → ℝ) (x : Vec d) : + vecNormSq (euclideanGradient η x) ≤ (d : ℝ) * ‖fderiv ℝ η x‖ ^ 2 := by + have hcoord : + ∀ i : Fin d, (euclideanGradient η x i) ^ 2 ≤ ‖fderiv ℝ η x‖ ^ 2 := by + intro i + have habs : + |euclideanGradient η x i| ≤ ‖fderiv ℝ η x‖ := by + calc + |euclideanGradient η x i| = + ‖(fderiv ℝ η x) (basisVec i)‖ := by + simp [euclideanGradient, euclideanCoordDeriv, Real.norm_eq_abs] + _ ≤ ‖fderiv ℝ η x‖ * ‖basisVec i‖ := by + simpa using (fderiv ℝ η x).le_opNorm (basisVec i) + _ = ‖fderiv ℝ η x‖ := by + rw [norm_basisVec, mul_one] + have habs_nonneg : 0 ≤ |euclideanGradient η x i| := abs_nonneg _ + have hnorm_nonneg : 0 ≤ ‖fderiv ℝ η x‖ := norm_nonneg _ + have habs_sq : |euclideanGradient η x i| ^ 2 = + (euclideanGradient η x i) ^ 2 := sq_abs _ + exact (habs_sq ▸ (sq_le_sq₀ (abs_nonneg _) (norm_nonneg _)).2 habs) + calc + vecNormSq (euclideanGradient η x) = + ∑ i : Fin d, (euclideanGradient η x i) ^ 2 := by + simp [vecNormSq, vecDot, pow_two] + _ ≤ ∑ _i : Fin d, ‖fderiv ℝ η x‖ ^ 2 := by + exact Finset.sum_le_sum fun i _hi => hcoord i + _ = (d : ℝ) * ‖fderiv ℝ η x‖ ^ 2 := by + simp [Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + +/-- Pointwise gradient-error bound for a quantitative cube cutoff. -/ +theorem vecNormSq_euclideanGradient_quantitativeCubeCutoff_le + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) (x : Vec d) : + vecNormSq (euclideanGradient (η : Vec d → ℝ) x) ≤ + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := by + let K : ℝ := + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) + have hbase := + vecNormSq_euclideanGradient_le_card_mul_fderiv_norm_sq + (η := (η : Vec d → ℝ)) x + have hgrad : ‖fderiv ℝ (η : Vec d → ℝ) x‖ ≤ K := by + simpa [K] using η.gradient_bound x + have hK_nonneg : 0 ≤ K := le_trans (norm_nonneg _) hgrad + have hgrad_sq : ‖fderiv ℝ (η : Vec d → ℝ) x‖ ^ 2 ≤ K ^ 2 := by + exact (sq_le_sq₀ (norm_nonneg _) hK_nonneg).2 hgrad + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + calc + vecNormSq (euclideanGradient (η : Vec d → ℝ) x) + ≤ (d : ℝ) * ‖fderiv ℝ (η : Vec d → ℝ) x‖ ^ 2 := hbase + _ ≤ (d : ℝ) * K ^ 2 := by + exact mul_le_mul_of_nonneg_left hgrad_sq hd_nonneg + _ = + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := rfl + +/-- Integral form of the quantitative cube cutoff gradient-error bound. -/ +theorem integral_sq_mul_vecNormSq_euclideanGradient_quantitativeCubeCutoff_le + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + {V : Set (Vec d)} {w : Vec d → ℝ} (hw : MemScalarL2 V w) : + ∫ x in V, w x ^ 2 * vecNormSq (euclideanGradient (η : Vec d → ℝ) x) + ∂MeasureTheory.volume ≤ + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, w x ^ 2 ∂MeasureTheory.volume := by + let K : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 + have hleft_int : + MeasureTheory.IntegrableOn + (fun x => w x ^ 2 * vecNormSq (euclideanGradient (η : Vec d → ℝ) x)) V := by + have htwo := + integrableOn_two_mul_sq_mul_vecNormSq_euclideanGradient_of_memScalarL2 + (V := V) (w := w) (η := (η : Vec d → ℝ)) + hw η.smooth η.hasCompactSupport + have hhalf := htwo.const_mul (1 / 2 : ℝ) + simpa [mul_assoc, mul_left_comm, mul_comm] using! hhalf + have hsq_int : MeasureTheory.IntegrableOn (fun x => w x ^ 2) V := by + simpa [volumeMeasureOn] using! hw.integrable_sq + have hright_int : + MeasureTheory.IntegrableOn (fun x => K * w x ^ 2) V := + hsq_int.const_mul K + have hpoint : + (fun x => w x ^ 2 * vecNormSq (euclideanGradient (η : Vec d → ℝ) x)) + ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => K * w x ^ 2 := by + filter_upwards with x + have hgrad := vecNormSq_euclideanGradient_quantitativeCubeCutoff_le η x + have hw_nonneg : 0 ≤ w x ^ 2 := sq_nonneg _ + calc + w x ^ 2 * vecNormSq (euclideanGradient (η : Vec d → ℝ) x) + ≤ w x ^ 2 * K := by + exact mul_le_mul_of_nonneg_left hgrad hw_nonneg + _ = K * w x ^ 2 := by ring + have hmono := + MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + have hright_eq : + ∫ x in V, K * w x ^ 2 ∂MeasureTheory.volume = + K * ∫ x in V, w x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + rw [hright_eq] at hmono + simpa [K] using hmono + +/-- Direct Caccioppoli estimate specialized to a quantitative cube cutoff: +the cutoff-gradient error is bounded by the explicit inverse-gap squared +constant times the unweighted forward quotient square. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_energy_quarter_le_forcing_sq_add_quotient_sq + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) : + (1 / 4 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume := by + let w : Vec d → ℝ := euclideanForwardDifferenceQuotient step i u.toFun + let K : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 + have hbase := + h.directDifferenceQuotient_sqCutoff_energy_quarter_le_two_forcing_sq_add_three_error + hU hf hV hVU hstep i hVshift + (η := (η : Vec d → ℝ)) η.smooth η.hasCompactSupport hη_sub + (quantitativeCubeCutoff_abs_le_one η) + have hw : MemScalarL2 V w := by + refine MeasureTheory.MemLp.ae_eq ?_ + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).memL2 + filter_upwards with x + simp [w] + have herr := + integral_sq_mul_vecNormSq_euclideanGradient_quantitativeCubeCutoff_le + (η := η) (V := V) (w := w) hw + have herr3 : (3 : ℝ) * + ∫ x in V, w x ^ 2 * vecNormSq (euclideanGradient (η : Vec d → ℝ) x) + ∂MeasureTheory.volume ≤ + (3 : ℝ) * (K * ∫ x in V, w x ^ 2 ∂MeasureTheory.volume) := by + exact mul_le_mul_of_nonneg_left (by simpa [K] using herr) (by norm_num) + have htarget : + (1 / 4 : ℝ) * + ∫ x in V, + η x ^ 2 * + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * (K * ∫ x in V, w x ^ 2 ∂MeasureTheory.volume) := by + exact hbase.trans + (add_le_add_right herr3 + ((2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume)) + simpa [w, K, mul_assoc] using htarget + +/-- If a cutoff is identically one on an inner measurable set, then its +weighted energy over the ambient set controls the unweighted energy on the +inner set. -/ +theorem integral_vecNormSq_le_integral_sqCutoff_vecNormSq_of_subset_eq_one + {S V : Set (Vec d)} {G : Vec d → Vec d} {η : Vec d → ℝ} + (hS_meas : MeasurableSet S) (hSV : S ⊆ V) + (hη_one : ∀ x ∈ S, η x = 1) (hG : MemVectorL2 V G) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) (hη_compact : HasCompactSupport η) : + ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + ∫ x in V, η x ^ 2 * vecNormSq (G x) ∂MeasureTheory.volume := by + have hleft_eq : + ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume = + ∫ x in S, η x ^ 2 * vecNormSq (G x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hS_meas] with x hx + rw [hη_one x hx] + ring + have hright_int : + MeasureTheory.IntegrableOn + (fun x => η x ^ 2 * vecNormSq (G x)) V := + integrableOn_sq_cutoff_vecNormSq_of_memVectorL2 + (V := V) (G := G) (η := η) hG hη hη_compact + have hnonneg : + 0 ≤ᵐ[MeasureTheory.volume.restrict V] + fun x => η x ^ 2 * vecNormSq (G x) := by + filter_upwards with x + exact mul_nonneg (sq_nonneg _) (vecNormSq_nonneg _) + have hsubset_ae : + S ≤ᵐ[MeasureTheory.volume] V := + Filter.Eventually.of_forall fun _ hx => hSV hx + have hmono := + MeasureTheory.setIntegral_mono_set hright_int hnonneg hsubset_ae + rw [hleft_eq] + exact hmono + +/-- Quantitative-cube Caccioppoli estimate with the left side localized to +any measurable inner set on which the cutoff is identically one. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_quotient_sq + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) (hSV : S ⊆ V) + (hη_one : ∀ x ∈ S, (η : Vec d → ℝ) x = 1) : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume := by + let G : Vec d → Vec d := + fun x => (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x + have hinner_le : + ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + ∫ x in V, η x ^ 2 * vecNormSq (G x) ∂MeasureTheory.volume := + integral_vecNormSq_le_integral_sqCutoff_vecNormSq_of_subset_eq_one + (S := S) (V := V) (G := G) (η := (η : Vec d → ℝ)) + hS_meas hSV hη_one + (u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad_memVectorL2 + η.smooth η.hasCompactSupport + have hweighted := + h.directDifferenceQuotient_quantitativeCubeCutoff_energy_quarter_le_forcing_sq_add_quotient_sq + hU hf hV hVU hstep i hVshift η hη_sub + have hinner_quarter : + (1 / 4 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + (1 / 4 : ℝ) * + ∫ x in V, η x ^ 2 * vecNormSq (G x) ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hinner_le (by norm_num) + have htarget : + (1 / 4 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume := by + exact hinner_quarter.trans (by + change + (1 / 4 : ℝ) * + ∫ x in V, η x ^ 2 * vecNormSq (G x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume + exact hweighted) + change + (1 / 4 : ℝ) * ∫ x in S, vecNormSq (G x) ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume + exact htarget + +/-- Nested-cube version of the quantitative direct Caccioppoli estimate: +the inner energy is taken over `scaledClosedCubeSet Q ρ₁`, where the +quantitative cutoff is exactly one. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_innerCube_energy_quarter_le_forcing_sq_add_quotient_sq + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) * + ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume := by + exact + h.directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_quotient_sq + hU hf hV hVU hstep i hVshift η hη_sub + (isClosed_scaledClosedCubeSet Q ρ₁).measurableSet hinnerV + (by + intro x hx + exact η.eq_one_on_inner x hx) + +/-- Test a restricted weak Poisson equation against a smooth cutoff times a +forward coordinate difference quotient of the solution. -/ +theorem restrict_test_cutoffForwardDifferenceQuotientToH10 + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + ((u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in V, + f x * (φ x * euclideanForwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have htest := + (h.restrict hV.isOpen hVU).h10 hV.isOpen hfV + (u.cutoffForwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub) + simpa using htest + +/-- Test a restricted weak Poisson equation against a smooth cutoff times a +backward coordinate difference quotient of the solution. -/ +theorem restrict_test_cutoffBackwardDifferenceQuotientToH10 + (h : WeakPoissonEquationOn U u f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hfV : MemScalarL2 V f) (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet (step • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + ∫ x in V, + vecDot ((u.restrict hV.isOpen hVU).grad x) + ((u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in V, + f x * (φ x * euclideanBackwardDifferenceQuotient step i u.toFun x) + ∂MeasureTheory.volume := by + have htest := + (h.restrict hV.isOpen hVU).h10 hV.isOpen hfV + (u.cutoffBackwardDifferenceQuotientToH10 step i hV hVU hVshift + hφ hφ_compact hφ_sub) + simpa using htest + +/-- Test a weak Poisson equation against a smooth cutoff times the solution. -/ +theorem test_mulContDiffHasCompactSupportToH10 + (h : WeakPoissonEquationOn U u f) + (hU : IsOpenBoundedConvexDomain U) (hf : MemScalarL2 U f) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + ∫ x in U, + vecDot (u.grad x) + ((u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, f x * (φ x * u.toFun x) ∂MeasureTheory.volume := by + have htest := + h.h10 hU.isOpen hf + (u.mulContDiffHasCompactSupportToH10 hU hφ hφ_compact hφ_sub) + simpa using htest + +/-- Coordinatewise gradient identification for the chosen `H¹₀` representative +of a smooth cutoff times an `H¹` function. -/ +theorem mulContDiffHasCompactSupportToH10_grad_coord_ae + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) + (j : Fin d) : + (fun x => + (u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => φ x * u.grad x j + u x * (fderiv ℝ φ x) (basisVec j) := by + let ψ : H10Function U := + u.mulContDiffHasCompactSupportToH10 hU hφ hφ_compact hφ_sub + let uφ : H1Function U := u.mulContDiffHasCompactSupport hφ hφ_compact + have hψ_fun : ψ.toH1Function.toFun = uφ.toFun := by + funext x + simp [ψ, uφ] + have hψ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => ψ.toH1Function.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((ψ.toH1Function.gradMemL2 j).locallyIntegrable (by norm_num)) + have huφ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => uφ.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((uφ.gradMemL2 j).locallyIntegrable (by norm_num)) + have hψ_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => ψ.toH1Function.grad x j) := + ψ.toH1Function.hasWeakPartialDerivOn j + have huφ_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => uφ.grad x j) := by + rw [hψ_fun] + exact uφ.hasWeakPartialDerivOn j + have hae := + HasWeakPartialDerivOn.ae_eq hU.isOpen hψ_loc huφ_loc hψ_weak huφ_weak + simpa [ψ, uφ, H1Function.mulContDiffHasCompactSupport_grad] using hae + +/-- Vector-valued a.e. gradient identification for a smooth cutoff times an +`H¹` function, packaged as the chosen `H¹₀` representative. -/ +theorem mulContDiffHasCompactSupportToH10_grad_ae + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + (fun x => + (u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x j => φ x * u.grad x j + u x * (fderiv ℝ φ x) (basisVec j) := by + have hcoord : + ∀ j : Fin d, + (fun x => + (u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => φ x * u.grad x j + u x * (fderiv ℝ φ x) (basisVec j) := by + intro j + exact mulContDiffHasCompactSupportToH10_grad_coord_ae + u hU hφ hφ_compact hφ_sub j + filter_upwards [(Filter.eventually_all (l := MeasureTheory.ae (MeasureTheory.volume.restrict U))).2 hcoord] with x hx + ext j + exact hx j + +/-- Coordinate energy of the chosen H10 product representative, rewritten by +the explicit product-rule gradient. -/ +theorem integral_localized_h10_grad_sq_eq_integral_product_rule_grad_sq + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) + (i : Fin d) : + ∫ x in U, + ((u.mulContDiffHasCompactSupportToH10 hU + hφ hφ_compact hφ_sub).toH1Function.grad x i) ^ 2 + ∂MeasureTheory.volume = + ∫ x in U, + (φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume := by + have hgrad_ae := + mulContDiffHasCompactSupportToH10_grad_coord_ae + u hU hφ hφ_compact hφ_sub i + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + rw [hx] + +/-- Fully expanded lower-order quotient control for a cutoff-localized H¹ +function. -/ +theorem integral_set_forwardDifferenceQuotient_sq_le_integral_localized_product_rule_grad_sq + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hφ_one : ∀ x ∈ S, φ x = 1) + (hφ_shift_one : ∀ x ∈ S, φ (euclideanCoordShift step i x) = 1) : + ∫ x in S, (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, + (φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume := by + have hbase := + integral_set_forwardDifferenceQuotient_sq_le_integral_localized_h10_grad_sq + (U := U) u hU hφ hφ_compact hφ_sub hS_meas hstep i + hφ_one hφ_shift_one + rwa [integral_localized_h10_grad_sq_eq_integral_product_rule_grad_sq + (U := U) u hU hφ hφ_compact hφ_sub i] at hbase + +/-- The product-rule square is controlled by the two usual square terms. -/ +theorem integral_product_rule_grad_sq_le_two_integral_cutoff_grad_sq_add_two_integral_value_fderiv_sq + (u : H1Function U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (i : Fin d) : + ∫ x in U, + (φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, (φ x * u.grad x i) ^ 2 ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume := by + have hφ_top : MeasureTheory.MemLp φ ⊤ (volumeMeasureOn U) := + hφ.continuous.memLp_top_of_hasCompactSupport hφ_compact (volumeMeasureOn U) + have hφgrad : MeasureTheory.MemLp (fun x => φ x * u.grad x i) 2 + (volumeMeasureOn U) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm] using + (u.gradMemL2 i).mul' hφ_top + have hdφ_top : MeasureTheory.MemLp + (fun x => (fderiv ℝ φ x) (basisVec i)) ⊤ (volumeMeasureOn U) := by + simpa [euclideanCoordDeriv, volumeMeasureOn] using! + (contDiff_euclideanCoordDeriv hφ i).continuous.memLp_top_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hφ_compact i) (volumeMeasureOn U) + have hudφ : MeasureTheory.MemLp + (fun x => u.toFun x * (fderiv ℝ φ x) (basisVec i)) 2 + (volumeMeasureOn U) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm, mul_left_comm] using + u.memL2.mul' hdφ_top + have hleft_int : MeasureTheory.IntegrableOn + (fun x => + (φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2) U := by + have hsum : MeasureTheory.MemLp + (fun x => φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) + 2 (volumeMeasureOn U) := + hφgrad.add hudφ + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using hsum.integrable_sq + have hterm1_int : MeasureTheory.IntegrableOn + (fun x => 2 * (φ x * u.grad x i) ^ 2) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + hφgrad.integrable_sq.const_mul (2 : ℝ) + have hterm2_int : MeasureTheory.IntegrableOn + (fun x => 2 * (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + hudφ.integrable_sq.const_mul (2 : ℝ) + have hright_int : MeasureTheory.IntegrableOn + (fun x => 2 * (φ x * u.grad x i) ^ 2 + + 2 * (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2) U := + hterm1_int.add hterm2_int + have hpoint : + (fun x => + (φ x * u.grad x i + u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2) + ≤ᵐ[MeasureTheory.volume.restrict U] + fun x => 2 * (φ x * u.grad x i) ^ 2 + + 2 * (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 := by + filter_upwards with x + nlinarith [sq_nonneg + (φ x * u.grad x i - u.toFun x * (fderiv ℝ φ x) (basisVec i))] + have hmono := MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + have hright_eq : + ∫ x in U, 2 * (φ x * u.grad x i) ^ 2 + + 2 * (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume = + (2 : ℝ) * ∫ x in U, (φ x * u.grad x i) ^ 2 ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hterm1_int hterm2_int] + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_const_mul] + rwa [hright_eq] at hmono + +/-- Lower-order quotient control by the two standard localized H¹ terms. -/ +theorem integral_set_forwardDifferenceQuotient_sq_le_two_integral_cutoff_grad_sq_add_two_integral_value_fderiv_sq + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hφ_one : ∀ x ∈ S, φ x = 1) + (hφ_shift_one : ∀ x ∈ S, φ (euclideanCoordShift step i x) = 1) : + ∫ x in S, (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, (φ x * u.grad x i) ^ 2 ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, (u.toFun x * (fderiv ℝ φ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume := by + exact + (integral_set_forwardDifferenceQuotient_sq_le_integral_localized_product_rule_grad_sq + (U := U) u hU hφ hφ_compact hφ_sub hS_meas hstep i + hφ_one hφ_shift_one).trans + (integral_product_rule_grad_sq_le_two_integral_cutoff_grad_sq_add_two_integral_value_fderiv_sq + (U := U) u hφ hφ_compact i) + +/-- Nested quantitative Caccioppoli with the lower-order quotient term replaced +by the two standard localized H¹ terms. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_lower_h1_terms + (h : WeakPoissonEquationOn U u f) (hU : IsOpenBoundedConvexDomain U) + (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) (hSV : S ⊆ V) + (hη_one : ∀ x ∈ S, (η : Vec d → ℝ) x = 1) + {θ : Vec d → ℝ} (hθ : ContDiff ℝ (⊤ : ℕ∞) θ) + (hθ_compact : HasCompactSupport θ) (hθ_sub : tsupport θ ⊆ U) + (hθ_one : ∀ x ∈ V, θ x = 1) + (hθ_shift_one : ∀ x ∈ V, θ (euclideanCoordShift step i x) = 1) : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in U, (θ x * u.grad x i) ^ 2 ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, (u.toFun x * (fderiv ℝ θ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := by + let K : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) + have hbase := + h.directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_quotient_sq + hU.isOpen hf hV hVU hstep i hVshift η hη_sub hS_meas hSV hη_one + have hlower := + integral_set_forwardDifferenceQuotient_sq_le_two_integral_cutoff_grad_sq_add_two_integral_value_fderiv_sq + (U := U) u hU hθ hθ_compact hθ_sub hV.isOpen.measurableSet hstep i + hθ_one hθ_shift_one + have hK_nonneg : 0 ≤ K := by + unfold K + positivity + have hlowerK : + K * ∫ x in V, + (euclideanForwardDifferenceQuotient step i u.toFun x) ^ 2 + ∂MeasureTheory.volume ≤ + K * + ((2 : ℝ) * ∫ x in U, (θ x * u.grad x i) ^ 2 ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, (u.toFun x * (fderiv ℝ θ x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := + mul_le_mul_of_nonneg_left hlower hK_nonneg + have htarget := hbase.trans (add_le_add_right hlowerK _) + simpa [K, mul_assoc] using htarget + +/-- Nested quantitative Caccioppoli with both the inner and outer cutoffs +chosen from the quantitative cube-cutoff package. The outer cutoff is assumed +to be identically one on the intermediate domain and on its forward-shifted +points. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms + (h : WeakPoissonEquationOn U u f) (hU : IsOpenBoundedConvexDomain U) + (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + {S : Set (Vec d)} (hS_meas : MeasurableSet S) (hSV : S ⊆ V) + (hη_one : ∀ x ∈ S, (η : Vec d → ℝ) x = 1) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hθ_sub : tsupport (θ : Vec d → ℝ) ⊆ U) + (hVθ : V ⊆ scaledClosedCubeSet Q σ₁) + (hVshiftθ : ∀ x ∈ V, euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁) : + (1 / 4 : ℝ) * + ∫ x in S, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in U, ((θ : Vec d → ℝ) x * u.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, + (u.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := by + exact + h.directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_lower_h1_terms + hU hf hV hVU hstep i hVshift η hη_sub hS_meas hSV hη_one + θ.smooth θ.hasCompactSupport hθ_sub + (by + intro x hx + exact θ.eq_one_on_inner x (hVθ hx)) + (by + intro x hx + exact θ.eq_one_on_inner (euclideanCoordShift step i x) (hVshiftθ x hx)) + +/-- Inner-cube version of the nested quantitative Caccioppoli estimate with a +quantitative outer lower-order cutoff. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms + (h : WeakPoissonEquationOn U u f) (hU : IsOpenBoundedConvexDomain U) + (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hθ_sub : tsupport (θ : Vec d → ℝ) ⊆ U) + (hVθ : V ⊆ scaledClosedCubeSet Q σ₁) + (hVshiftθ : ∀ x ∈ V, euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁) : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in U, ((θ : Vec d → ℝ) x * u.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, + (u.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := by + exact + h.directDifferenceQuotient_quantitativeCubeCutoff_inner_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms + hU hf hV hVU hstep i hVshift η hη_sub + (isClosed_scaledClosedCubeSet Q ρ₁).measurableSet hinnerV + (by + intro x hx + exact η.eq_one_on_inner x hx) + θ hθ_sub hVθ hVshiftθ + +/-- Inner-cube nested quantitative Caccioppoli with the outer shifted-containment +hypothesis discharged by a one-coordinate step-size restriction. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + (h : WeakPoissonEquationOn U u f) (hU : IsOpenBoundedConvexDomain U) + (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {Q : TriadicCube d} {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hθ_sub : tsupport (θ : Vec d → ℝ) ⊆ U) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hνσ : ν ≤ σ₁) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in U, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in U, ((θ : Vec d → ℝ) x * u.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in U, + (u.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := by + exact + h.directDifferenceQuotient_quantitativeCubeCutoff_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms + hU hf hV hVU hstep i hVshift η hη_sub hinnerV θ hθ_sub + (by + intro x hx + exact scaledClosedCubeSet_mono Q hνσ (hVν hx)) + (by + intro x hx + exact + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx)) + +/-- Open-cube ambient version of the nested quantitative Caccioppoli estimate: +the ambient-domain containment, shifted containment, and outer cutoff support +are all discharged by strict subcube radii and the step-size bound. -/ +theorem directDifferenceQuotient_quantitativeCubeCutoff_openCube_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + (1 / 4 : ℝ) * + ∫ x in scaledClosedCubeSet Q ρ₁, + vecNormSq + ((uQ.forwardDifferenceQuotientOn step i hV.isOpen + (by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx)) + (by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : + euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen)).grad x) + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) := by + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hν_nonneg + (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : V ⊆ translateSet ((-step) • basisVec i) (openCubeSet Q) := by + intro x hx + rw [mem_translateSet_iff_sub_mem] + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hxshift : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ hstep_abs i (hVν hx) + have hxopen : euclideanCoordShift step i x ∈ openCubeSet Q := + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxshift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxopen + exact + h.directDifferenceQuotient_quantitativeCubeCutoff_innerCube_energy_quarter_le_forcing_sq_add_quantitative_lower_h1_terms_of_step_abs_le + (isOpenBoundedConvexDomain_openCubeSet Q) hf hV hVU hstep i hVshift + η hη_sub hinnerV θ + (θ.tsupport_subset_openCubeSet_of_nonneg_of_lt_one hσ₂_nonneg hσ₂_lt_one) + hVν hνσ hstep_abs + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuotientHessianRiesz.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuotientHessianRiesz.lean new file mode 100644 index 0000000000..da1d190a26 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/QuotientHessianRiesz.lean @@ -0,0 +1,376 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.OpenInnerFunctional + +/-! # Quotient Hessian Riesz -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +/-- A coordinate derivative of a smooth test is supported where the test is +topologically supported. -/ +private theorem support_fderiv_apply_basisVec_subset_of_tsupport_subset + {U : Set (Vec d)} {φ : Vec d → ℝ} (j : Fin d) (hφ_sub : tsupport φ ⊆ U) : + Function.support (fun x => (fderiv ℝ φ x) (basisVec j)) ⊆ U := by + intro x hx + exact hφ_sub <| + (support_fderiv_subset (𝕜 := ℝ) (f := φ)) <| by + change fderiv ℝ φ x ≠ 0 + intro hzero + apply hx + simp [hzero] + +/-- Multiplying by an arbitrary scalar field does not enlarge the support of a +test derivative. -/ +private theorem support_mul_fderiv_apply_basisVec_subset_of_tsupport_subset + {U : Set (Vec d)} {w φ : Vec d → ℝ} (j : Fin d) (hφ_sub : tsupport φ ⊆ U) : + Function.support (fun x => w x * (fderiv ℝ φ x) (basisVec j)) ⊆ U := by + intro x hx + have hderiv_ne : (fderiv ℝ φ x) (basisVec j) ≠ 0 := by + intro hzero + apply hx + simp [hzero] + exact support_fderiv_apply_basisVec_subset_of_tsupport_subset j hφ_sub hderiv_ne + +/-- Riesz representative of the open-inner quotient-Hessian functional. -/ +noncomputable def openCubeInnerOpenCubeQuotientHessianRieszRep + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) : + ScalarL2 (scaledOpenCubeSet Q ρ₁) := + (InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm + (openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + +/-- The Riesz representative evaluates against any open-inner `L²` test as the +continuous quotient-Hessian functional. -/ +theorem inner_openCubeInnerOpenCubeQuotientHessianRieszRep_eq_functional + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (x : ScalarL2 (scaledOpenCubeSet Q ρ₁)) : + inner ℝ + (openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + x = + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x := by + change inner ℝ + (((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm) + (openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs)) + x = + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x + exact + InnerProductSpace.toDual_symm_apply + (𝕜 := ℝ) + (E := ScalarL2 (scaledOpenCubeSet Q ρ₁)) + (x := x) + (y := + (openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs : + StrongDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁)))) + +/-- On the dense smooth-test submodule, the continuous open-inner functional +agrees with the concrete quotient-Hessian pairing. -/ +theorem openCubeInnerOpenCubeQuotientHessianFunctional_apply_subtype + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) + (x : h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)) : + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + ((h1WeakTestScalarL2Submodule (d := d) (scaledOpenCubeSet Q ρ₁)).subtype x) = + openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x := by + exact + extendH1WeakTestScalarL2Functional_apply_subtype + (d := d) (U := scaledOpenCubeSet Q ρ₁) + (isOpen_scaledOpenCubeSet Q ρ₁) + (volume_scaledOpenCubeSet_ne_top_of_nonneg Q hρ₁_nonneg) + (openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + (openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + (norm_openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional_apply_le + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs) + x + +/-- The explicit square-root bound used for the quotient-Hessian functional is +nonnegative. -/ +theorem openCubeInnerQuotientHessianSmoothTestBound_nonneg + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (f : Vec d → ℝ) + (i : Fin d) {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) : + 0 ≤ openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + dsimp [openCubeInnerQuotientHessianSmoothTestBound] + positivity + +/-- The Riesz representative has the same explicit norm bound as the +continuous open-inner quotient-Hessian functional. -/ +theorem norm_openCubeInnerOpenCubeQuotientHessianRieszRep_le + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ‖openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs‖ ≤ + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + let L : ScalarL2 (scaledOpenCubeSet Q ρ₁) →L[ℝ] ℝ := + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + let C : ℝ := + openCubeInnerQuotientHessianSmoothTestBound (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ + have hL_bound : ∀ x, ‖L x‖ ≤ C * ‖x‖ := by + intro x + simpa [L, C] using + norm_openCubeInnerOpenCubeQuotientHessianFunctional_apply_le + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs hρ₁_nonneg x + have hL_op : ‖L‖ ≤ C := + L.opNorm_le_bound + (by + simpa [C] using + openCubeInnerQuotientHessianSmoothTestBound_nonneg + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ) + hL_bound + have hnorm_eq : + ‖openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs‖ = ‖L‖ := by + change + ‖((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm) L‖ = ‖L‖ + exact ((InnerProductSpace.toDual ℝ (ScalarL2 (scaledOpenCubeSet Q ρ₁))).symm.norm_map L) + exact hnorm_eq.trans_le hL_op + +/-- For each nonzero step, the Riesz representative is the weak derivative of +the forward difference quotient on the open inner cube. -/ +theorem openCubeInnerOpenCubeQuotientHessianRieszRep_hasWeakPartialDerivOn_forwardDifferenceQuotient + {Q : TriadicCube d} {uQ : H1Function (openCubeSet Q)} {f : Vec d → ℝ} + (h : WeakPoissonEquationOn (openCubeSet Q) uQ f) + (hf : MemScalarL2 (openCubeSet Q) f) + (hV : IsOpenBoundedConvexDomain V) + {step : ℝ} (hstep : step ≠ 0) (i j : Fin d) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hstep_abs : |step| ≤ (σ₁ - ν) * cubeRadius Q) + (hρ₁_nonneg : 0 ≤ ρ₁) : + HasWeakPartialDerivOn (scaledOpenCubeSet Q ρ₁) j + (euclideanForwardDifferenceQuotient step i uQ.toFun) + (fun x => + openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs x) := by + intro φ hφ hφs hφ_sub + let S : Set (Vec d) := scaledOpenCubeSet Q ρ₁ + let φTest : H1WeakTestFunction S := + { toFun := φ + smooth := hφ + compactSupport := hφs + support_subset := by simpa [S] using hφ_sub } + let xsub : h1WeakTestScalarL2Submodule (d := d) S := + ⟨φTest.toScalarL2, by exact ⟨φTest, rfl⟩⟩ + let rep : ScalarL2 S := + openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs + have hinner_functional : + inner ℝ rep φTest.toScalarL2 = + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs φTest.toScalarL2 := by + simpa [rep, S] using + inner_openCubeInnerOpenCubeQuotientHessianRieszRep_eq_functional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs φTest.toScalarL2 + have hfunctional_smooth : + openCubeInnerOpenCubeQuotientHessianFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs φTest.toScalarL2 = + openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs xsub := by + simpa [xsub, S, Submodule.subtype] using + openCubeInnerOpenCubeQuotientHessianFunctional_apply_subtype + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs hρ₁_nonneg xsub + have hsmooth_pairing : + openCubeInnerOpenCubeQuotientHessianSmoothTestFunctional + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs xsub = + -∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := by + let ψ : H1WeakTestFunction S := h1WeakTestScalarL2Representative xsub + have hψ_eq : ψ.toScalarL2 = φTest.toScalarL2 := by + simpa [ψ, xsub, S, Submodule.subtype] using + h1WeakTestScalarL2Representative_toScalarL2 xsub + have hpair := + h.neg_integral_forwardDifferenceQuotient_mul_fderiv_openCube_innerOpenCube_eq_of_h1WeakTest_toScalarL2_eq_of_step_abs_le + hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs ψ φTest hψ_eq + change + -∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ (ψ : Vec d → ℝ) y) (basisVec j) ∂MeasureTheory.volume = + -∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume + simpa [φTest] using hpair + have hinner_integral : + inner ℝ rep φTest.toScalarL2 = + ∫ x in S, rep x * φ x ∂MeasureTheory.volume := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [φTest.coeFn_toScalarL2] with x hφ_l2 + rw [hφ_l2] + have hrep_integral : + ∫ x in S, rep x * φ x ∂MeasureTheory.volume = + -∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := + hinner_integral.symm.trans + (hinner_functional.trans (hfunctional_smooth.trans hsmooth_pairing)) + have hSV : S ⊆ V := by + simpa [S] using + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + have hderiv_support : + Function.support + (fun x => + euclideanForwardDifferenceQuotient step i uQ.toFun x * + (fderiv ℝ φ x) (basisVec j)) ⊆ S := + support_mul_fderiv_apply_basisVec_subset_of_tsupport_subset j (by simpa [S] using hφ_sub) + have hV_eq_S : + ∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + ∫ y in S, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := + integral_subset_of_support_subset (U := V) (V := S) hSV hderiv_support + have hV_pair : + ∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + -∫ x in S, rep x * φ x ∂MeasureTheory.volume := by + rw [hrep_integral, neg_neg] + calc + ∫ y in scaledOpenCubeSet Q ρ₁, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume = + ∫ y in S, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := by + rfl + _ = ∫ y in V, + euclideanForwardDifferenceQuotient step i uQ.toFun y * + (fderiv ℝ φ y) (basisVec j) ∂MeasureTheory.volume := hV_eq_S.symm + _ = -∫ x in S, rep x * φ x ∂MeasureTheory.volume := hV_pair + _ = -∫ x in scaledOpenCubeSet Q ρ₁, + (fun y => + openCubeInnerOpenCubeQuotientHessianRieszRep + h hf hV hstep i j η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one hstep_abs y) x * + φ x ∂MeasureTheory.volume := by + rfl + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionGeometry.lean new file mode 100644 index 0000000000..694eaa306a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionGeometry.lean @@ -0,0 +1,172 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import Mathlib.MeasureTheory.Constructions.Pi + +/-! # Reflection Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +/-- The centered cube of scale `m` is the one-third scaled open subcube of the +centered cube at the next larger scale. This is the basic geometry behind +using an all-face reflection block as an interior domain after translating to +the centered cube. -/ +theorem scaledOpenCubeSet_originCube_succ_one_div_three + (d : ℕ) (m : ℤ) : + scaledOpenCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) = + openCubeSet (originCube d m) := by + have hbound : + (3 : ℝ)⁻¹ * (2⁻¹ * ((3 : ℝ) ^ m * 3)) = 2⁻¹ * (3 : ℝ) ^ m := by + field_simp [show (3 : ℝ) ≠ 0 by norm_num] + ext x + simp [scaledOpenCubeSet, openCubeSet, cubeCenter, cubeRadius, originCube, + cubeScaleFactor, abs_lt, sub_eq_add_neg, zpow_add₀, + show (3 : ℝ) ≠ 0 by norm_num, hbound] + +/-- The centered all-face reflection block of `originCube d m` lies inside the +centered cube at the next larger scale. The reverse inclusion only fails on +the internal reflecting faces. -/ +theorem cubeFaceReflectionBlockSet_originCube_subset_openCubeSet_succ + (d : ℕ) (m : ℤ) : + cubeFaceReflectionBlockSet (originCube d m) ⊆ + openCubeSet (originCube d (m + 1)) := by + intro x hx + rw [mem_openCubeSet_originCube_iff] + intro i + have hleft : + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ (m + 1) = + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m - (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + have hright : + (1 / 2 : ℝ) * (3 : ℝ) ^ (m + 1) = + (1 / 2 : ℝ) * (3 : ℝ) ^ m + (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + have hi : + ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m - (3 : ℝ) ^ m < x i ∧ + x i < (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m) ∨ + ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m < x i ∧ + x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m) ∨ + ((1 / 2 : ℝ) * (3 : ℝ) ^ m < x i ∧ + x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m + (3 : ℝ) ^ m) := by + simpa [cubeFaceReflectionBlockSet, cubeLowerFaceCoord, + cubeUpperFaceCoord, originCube, cubeScaleFactor, sub_eq_add_neg] + using hx i + rcases hi with hLower | hMiddle | hUpper + · constructor + · rw [hleft] + exact hLower.1 + · rw [hright] + linarith + · constructor + · rw [hleft] + linarith + · rw [hright] + linarith + · constructor + · rw [hleft] + linarith + · rw [hright] + exact hUpper.2 + +/-- Almost every point avoids the two internal reflecting faces of the +centered reflection block in every coordinate. -/ +theorem ae_forall_ne_originCube_reflection_faces + (d : ℕ) (m : ℤ) : + ∀ᵐ x : Vec d ∂MeasureTheory.volume, + ∀ i : Fin d, + x i ≠ (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m ∧ + x i ≠ (1 / 2 : ℝ) * (3 : ℝ) ^ m := by + rw [Filter.eventually_all] + intro i + exact + (MeasureTheory.Measure.ae_eval_ne + (μ := fun _ : Fin d => (MeasureTheory.volume : MeasureTheory.Measure ℝ)) + i ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m)).and + (MeasureTheory.Measure.ae_eval_ne + (μ := fun _ : Fin d => (MeasureTheory.volume : MeasureTheory.Measure ℝ)) + i ((1 / 2 : ℝ) * (3 : ℝ) ^ m)) + +/-- The centered all-face reflection block is the next larger centered open +cube modulo the null union of internal reflecting faces. -/ +theorem cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ + (d : ℕ) (m : ℤ) : + cubeFaceReflectionBlockSet (originCube d m) =ᵐ[MeasureTheory.volume] + openCubeSet (originCube d (m + 1)) := by + have hnoFaces := ae_forall_ne_originCube_reflection_faces d m + filter_upwards [hnoFaces] with x hxnoFaces + apply propext + constructor + · intro hxBlock + exact cubeFaceReflectionBlockSet_originCube_subset_openCubeSet_succ d m hxBlock + · intro hxParent + change x ∈ openCubeSet (originCube d (m + 1)) at hxParent + change x ∈ cubeFaceReflectionBlockSet (originCube d m) + rw [mem_openCubeSet_originCube_iff] at hxParent + intro i + have hleft : + -(2⁻¹ * (3 : ℝ) ^ (m + 1)) = + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m - (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + have hright : + 2⁻¹ * (3 : ℝ) ^ (m + 1) = + (1 / 2 : ℝ) * (3 : ℝ) ^ m + (3 : ℝ) ^ m := by + rw [zpow_add₀ (show (3 : ℝ) ≠ 0 by norm_num)] + ring + have hparentLeft : + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m - (3 : ℝ) ^ m < x i := by + simpa [hleft] using (hxParent i).1 + have hparentRight : + x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m + (3 : ℝ) ^ m := by + simpa [hright] using (hxParent i).2 + have hblock : + ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m - (3 : ℝ) ^ m < x i ∧ + x i < (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m) ∨ + ((-(1 / 2 : ℝ)) * (3 : ℝ) ^ m < x i ∧ + x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m) ∨ + ((1 / 2 : ℝ) * (3 : ℝ) ^ m < x i ∧ + x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m + (3 : ℝ) ^ m) := by + by_cases hxLower : x i < (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m + · exact Or.inl ⟨hparentLeft, hxLower⟩ + · have hLowerLt : + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ m < x i := + lt_of_le_of_ne (le_of_not_gt hxLower) (hxnoFaces i).1.symm + by_cases hxUpper : x i < (1 / 2 : ℝ) * (3 : ℝ) ^ m + · exact Or.inr <| Or.inl ⟨hLowerLt, hxUpper⟩ + · have hUpperLt : + (1 / 2 : ℝ) * (3 : ℝ) ^ m < x i := + lt_of_le_of_ne (le_of_not_gt hxUpper) (hxnoFaces i).2.symm + exact Or.inr <| Or.inr ⟨hUpperLt, hparentRight⟩ + simpa [cubeFaceReflectionBlockSet, cubeLowerFaceCoord, + cubeUpperFaceCoord, originCube, cubeScaleFactor, sub_eq_add_neg] + using hblock + +/-- Set integrals over the next larger centered open cube can be evaluated on +the centered reflection block, since the two domains differ only by internal +faces. -/ +theorem setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (m : ℤ) (f : Vec d → E) : + ∫ x in openCubeSet (originCube d (m + 1)), f x ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet (originCube d m), f x ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentApprox.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentApprox.lean new file mode 100644 index 0000000000..0bf37f2900 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentApprox.lean @@ -0,0 +1,517 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient + +/-! # Reflection Parent Approx -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +noncomputable section + +variable {d : ℕ} {m : ℤ} + +/-- For Hilbert-valued `L²` functions, the square of the `toReal` `eLpNorm` +is the integral of the pointwise squared norm. -/ +theorem toReal_eLpNorm_two_sq_eq_integral_norm_sq + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] [MeasurableSpace E] + [BorelSpace E] {μ : MeasureTheory.Measure α} {f : α → E} + (hf : MeasureTheory.MemLp f 2 μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ 2 ∂μ := by + have hpow : (2 : ℝ≥0∞).toReal = (2 : ℝ) := by + norm_num + have hnorm := + hf.eLpNorm_eq_integral_rpow_norm + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by simp : (2 : ℝ≥0∞) ≠ ⊤) + have hsq_norm : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + rw [hnorm, hpow] + have hint_nonneg : + 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => + Real.rpow_nonneg (norm_nonneg (f x)) _) + rw [ENNReal.toReal_ofReal] + · rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num] + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hint_nonneg + · exact Real.rpow_nonneg hint_nonneg _ + calc + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := hsq_norm + _ = ∫ x, ‖f x‖ ^ 2 ∂μ := by + congr 1 with x + rw [Real.rpow_two] + +/-- Scalar all-face reflection distributes over subtraction. -/ +@[simp] theorem cubeCoordinateFoldReflectedScalar_sub_apply + (Q : TriadicCube d) (F U : Vec d → ℝ) (x : Vec d) : + cubeCoordinateFoldReflectedScalar Q (fun y => F y - U y) x = + cubeCoordinateFoldReflectedScalar Q F x - + cubeCoordinateFoldReflectedScalar Q U x := by + rfl + +/-- Vector all-face reflection distributes over subtraction. -/ +@[simp] theorem cubeCoordinateFoldReflectedVectorField_sub_apply + (Q : TriadicCube d) (G H : Vec d → Vec d) (x : Vec d) : + cubeCoordinateFoldReflectedVectorField Q (fun y => G y - H y) x = + cubeCoordinateFoldReflectedVectorField Q G x - + cubeCoordinateFoldReflectedVectorField Q H x := by + ext i + simp [cubeCoordinateFoldReflectedVectorField, sub_eq_add_neg, mul_add] + +/-- Reflected scalar differences are `L²` on the centered parent cube whenever +the original difference is `L²` on the origin cube. -/ +theorem memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub + {F U : Vec d → ℝ} + (hFU : MemScalarL2 (openCubeSet (originCube d m)) (fun x => F x - U x)) : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (fun x => + cubeCoordinateFoldReflectedScalar (originCube d m) F x - + cubeCoordinateFoldReflectedScalar (originCube d m) U x) := by + simpa using! + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) hFU + +/-- Reflected vector-field differences are `L²` on the centered parent cube +whenever the original difference is `L²` on the origin cube. -/ +theorem memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub + {G H : Vec d → Vec d} + (hGH : MemVectorL2 (openCubeSet (originCube d m)) (fun x => G x - H x)) : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (fun x => + cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) := by + have hfun : + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun x => G x - H x) = + fun x => + cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x := by + funext x + exact cubeCoordinateFoldReflectedVectorField_sub_apply + (originCube d m) G H x + simpa [hfun] using + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) hGH + +/-- Scalar reflected-difference energy on the centered parent cube is `3^d` +copies of the original difference energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub_sq_of_memScalarL2_three_pow + {F U : Vec d → ℝ} + (hFU : MemScalarL2 (openCubeSet (originCube d m)) (fun x => F x - U x)) : + ∫ x in openCubeSet (originCube d (m + 1)), + (cubeCoordinateFoldReflectedScalar (originCube d m) F x - + cubeCoordinateFoldReflectedScalar (originCube d m) U x) * + (cubeCoordinateFoldReflectedScalar (originCube d m) F x - + cubeCoordinateFoldReflectedScalar (originCube d m) U x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + (F y - U y) * (F y - U y) ∂MeasureTheory.volume := by + simpa using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + (m := m) (F := fun y => F y - U y) hFU + +/-- Vector reflected-difference energy on the centered parent cube is `3^d` +copies of the original difference energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub_self_pairing_of_memVectorL2_three_pow + {G H : Vec d → Vec d} + (hGH : MemVectorL2 (openCubeSet (originCube d m)) (fun x => G x - H x)) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + vecDot (G y - H y) (G y - H y) ∂MeasureTheory.volume := by + have hfun : + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun x => G x - H x) = + fun x => + cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x := by + funext x + exact cubeCoordinateFoldReflectedVectorField_sub_apply + (originCube d m) G H x + simpa [hfun] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + (m := m) (G := fun y => G y - H y) hGH + +/-- Scalar `L²` convergence on the original cube transfers to the all-face +reflected scalar differences on the centered parent cube. -/ +theorem tendsto_eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub + {F : ℕ → Vec d → ℝ} {U : Vec d → ℝ} + (hFU : ∀ n, + MemScalarL2 (openCubeSet (originCube d m)) (fun x => F n x - U x)) + (hlim : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => F n x - U x) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + cubeCoordinateFoldReflectedScalar (originCube d m) (F n) x - + cubeCoordinateFoldReflectedScalar (originCube d m) U x) + 2 (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + Filter.atTop (nhds 0) := by + let C : ℝ := (3 : ℝ) ^ d + 1 + let parentDiff : ℕ → Vec d → ℝ := fun n x => + cubeCoordinateFoldReflectedScalar (originCube d m) (F n) x - + cubeCoordinateFoldReflectedScalar (originCube d m) U x + have hparent_mem : ∀ n, + MemScalarL2 (openCubeSet (originCube d (m + 1))) (parentDiff n) := by + intro n + simpa [parentDiff] using + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub + (m := m) (F := F n) (U := U) (hFU n) + have horig_real : + Filter.Tendsto + (fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => F n x - U x) 2 + (volumeMeasureOn (openCubeSet (originCube d m))))) + Filter.atTop (nhds 0) := + (ENNReal.tendsto_toReal_zero_iff + (fun n => (hFU n).eLpNorm_ne_top)).2 hlim + have hscaled_real : + Filter.Tendsto + (fun n => + C * + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => F n x - U x) 2 + (volumeMeasureOn (openCubeSet (originCube d m))))) + Filter.atTop (nhds 0) := by + simpa using horig_real.const_mul C + have hparent_real : + Filter.Tendsto + (fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm (parentDiff n) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1)))))) + Filter.atTop (nhds 0) := by + refine squeeze_zero + (fun n => ENNReal.toReal_nonneg) + (fun n => ?_) + hscaled_real + let a : ℝ := + ENNReal.toReal + (MeasureTheory.eLpNorm (parentDiff n) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + let b : ℝ := + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => F n x - U x) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + have hsq_eq : + a ^ 2 = (3 : ℝ) ^ d * b ^ 2 := by + have henergy := + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub_sq_of_memScalarL2_three_pow + (m := m) (F := F n) (U := U) (hFU n) + rw [toReal_eLpNorm_two_sq_eq_integral_sq (hparent_mem n), + toReal_eLpNorm_two_sq_eq_integral_sq (hFU n)] + simpa [a, b, parentDiff, pow_two] using henergy + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hthree_nonneg : 0 ≤ (3 : ℝ) ^ d := by + positivity + have hthree_le_C_sq : (3 : ℝ) ^ d ≤ C ^ 2 := by + dsimp [C] + nlinarith [sq_nonneg ((3 : ℝ) ^ d), sq_nonneg ((3 : ℝ) ^ d + 1)] + have hsq_le : a ^ 2 ≤ (C * b) ^ 2 := by + calc + a ^ 2 = (3 : ℝ) ^ d * b ^ 2 := hsq_eq + _ ≤ C ^ 2 * b ^ 2 := by + exact mul_le_mul_of_nonneg_right hthree_le_C_sq (sq_nonneg b) + _ = (C * b) ^ 2 := by ring + have hCb_nonneg : 0 ≤ C * b := by + exact mul_nonneg hC_nonneg ENNReal.toReal_nonneg + exact (sq_le_sq₀ ENNReal.toReal_nonneg hCb_nonneg).1 hsq_le + exact + (ENNReal.tendsto_toReal_zero_iff + (fun n => (hparent_mem n).eLpNorm_ne_top)).1 hparent_real + +/-- A coordinate of a reflected vector-field difference has the same `3^d` +energy transfer as a reflected scalar difference. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub_coord_sq_of_memScalarL2_three_pow + {G H : Vec d → Vec d} (j : Fin d) + (hGHj : + MemScalarL2 (openCubeSet (originCube d m)) (fun x => G x j - H x j)) : + ∫ x in openCubeSet (originCube d (m + 1)), + ((cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j) * + ((cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + (G y j - H y j) * (G y j - H y j) ∂MeasureTheory.volume := by + have hscalar := + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub_sq_of_memScalarL2_three_pow + (m := m) (F := fun y => G y j) (U := fun y => H y j) hGHj + calc + ∫ x in openCubeSet (originCube d (m + 1)), + ((cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j) * + ((cubeCoordinateFoldReflectedVectorField (originCube d m) G x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d (m + 1)), + (cubeCoordinateFoldReflectedScalar (originCube d m) (fun y => G y j) x - + cubeCoordinateFoldReflectedScalar (originCube d m) (fun y => H y j) x) * + (cubeCoordinateFoldReflectedScalar (originCube d m) (fun y => G y j) x - + cubeCoordinateFoldReflectedScalar (originCube d m) (fun y => H y j) x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d (m + 1))) ?_ + intro x _hx + let s : ℝ := cubeCoordinateFoldSign (originCube d m) x j + let A : ℝ := G (cubeCoordinateFold (originCube d m) x) j + let B : ℝ := H (cubeCoordinateFold (originCube d m) x) j + have hs : s * s = 1 := by + simp [s] + change (s * A - s * B) * (s * A - s * B) = (A - B) * (A - B) + nlinarith [hs] + _ = (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + (G y j - H y j) * (G y j - H y j) ∂MeasureTheory.volume := hscalar + +/-- Coordinatewise `L²` convergence on the original cube transfers to +coordinates of the all-face reflected vector-field differences on the centered +parent cube. -/ +theorem tendsto_eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub_coord + {G : ℕ → Vec d → Vec d} {H : Vec d → Vec d} (j : Fin d) + (hGH : ∀ n, + MemVectorL2 (openCubeSet (originCube d m)) (fun x => G n x - H x)) + (hlim : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => G n x j - H x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + (cubeCoordinateFoldReflectedVectorField (originCube d m) (G n) x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j) + 2 (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + Filter.atTop (nhds 0) := by + let C : ℝ := (3 : ℝ) ^ d + 1 + let parentDiff : ℕ → Vec d → ℝ := fun n x => + (cubeCoordinateFoldReflectedVectorField (originCube d m) (G n) x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) j + have hparent_mem : ∀ n, + MemScalarL2 (openCubeSet (originCube d (m + 1))) (parentDiff n) := by + intro n + have hparent_vec : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (fun x => + cubeCoordinateFoldReflectedVectorField (originCube d m) (G n) x - + cubeCoordinateFoldReflectedVectorField (originCube d m) H x) := + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub + (m := m) (G := G n) (H := H) (hGH n) + simpa [parentDiff] using memScalarL2_coord_of_memVectorL2 hparent_vec j + have hGHj : ∀ n, + MemScalarL2 (openCubeSet (originCube d m)) (fun x => G n x j - H x j) := by + intro n + simpa using memScalarL2_coord_of_memVectorL2 (hGH n) j + have horig_real : + Filter.Tendsto + (fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => G n x j - H x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m))))) + Filter.atTop (nhds 0) := + (ENNReal.tendsto_toReal_zero_iff + (fun n => (hGHj n).eLpNorm_ne_top)).2 hlim + have hscaled_real : + Filter.Tendsto + (fun n => + C * + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => G n x j - H x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m))))) + Filter.atTop (nhds 0) := by + simpa using horig_real.const_mul C + have hparent_real : + Filter.Tendsto + (fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm (parentDiff n) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1)))))) + Filter.atTop (nhds 0) := by + refine squeeze_zero + (fun n => ENNReal.toReal_nonneg) + (fun n => ?_) + hscaled_real + let a : ℝ := + ENNReal.toReal + (MeasureTheory.eLpNorm (parentDiff n) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + let b : ℝ := + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => G n x j - H x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + have hsq_eq : + a ^ 2 = (3 : ℝ) ^ d * b ^ 2 := by + have henergy := + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub_coord_sq_of_memScalarL2_three_pow + (m := m) (G := G n) (H := H) j (hGHj n) + rw [toReal_eLpNorm_two_sq_eq_integral_sq (hparent_mem n), + toReal_eLpNorm_two_sq_eq_integral_sq (hGHj n)] + simpa [a, b, parentDiff, pow_two] using henergy + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hthree_le_C_sq : (3 : ℝ) ^ d ≤ C ^ 2 := by + dsimp [C] + nlinarith [sq_nonneg ((3 : ℝ) ^ d), sq_nonneg ((3 : ℝ) ^ d + 1)] + have hsq_le : a ^ 2 ≤ (C * b) ^ 2 := by + calc + a ^ 2 = (3 : ℝ) ^ d * b ^ 2 := hsq_eq + _ ≤ C ^ 2 * b ^ 2 := by + exact mul_le_mul_of_nonneg_right hthree_le_C_sq (sq_nonneg b) + _ = (C * b) ^ 2 := by ring + have hCb_nonneg : 0 ≤ C * b := by + exact mul_nonneg hC_nonneg ENNReal.toReal_nonneg + exact (sq_le_sq₀ ENNReal.toReal_nonneg hCb_nonneg).1 hsq_le + exact + (ENNReal.tendsto_toReal_zero_iff + (fun n => (hparent_mem n).eLpNorm_ne_top)).1 hparent_real + +/-- Scalar `L²` convergence transfer, stated directly in the `ScalarL2` +classes on the centered parent cube. -/ +theorem tendsto_toScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + {F : ℕ → Vec d → ℝ} {U : Vec d → ℝ} + (hF : ∀ n, MemScalarL2 (openCubeSet (originCube d m)) (F n)) + (hU : MemScalarL2 (openCubeSet (originCube d m)) U) + (hlim : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => F n x - U x) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + toScalarL2 + (memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) (hF n))) + Filter.atTop + (nhds + (toScalarL2 + (memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) hU))) := by + let parentF : ℕ → Vec d → ℝ := fun n => + cubeCoordinateFoldReflectedScalar (originCube d m) (F n) + let parentU : Vec d → ℝ := + cubeCoordinateFoldReflectedScalar (originCube d m) U + have hparentF : ∀ n, + MemScalarL2 (openCubeSet (originCube d (m + 1))) (parentF n) := by + intro n + simpa [parentF] using + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) (hF n) + have hparentU : + MemScalarL2 (openCubeSet (originCube d (m + 1))) parentU := by + simpa [parentU] using + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) hU + have hdiff : ∀ n, + MemScalarL2 (openCubeSet (originCube d m)) (fun x => F n x - U x) := + fun n => (hF n).sub hU + have hlim_parent : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => parentF n x - parentU x) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + Filter.atTop (nhds 0) := by + simpa [parentF, parentU] using + tendsto_eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sub + (m := m) (F := F) (U := U) hdiff hlim + simpa [parentF, parentU] using + tendsto_toScalarL2_of_tendsto_eLpNorm + (U := openCubeSet (originCube d (m + 1))) + (F := parentF) (G := parentU) hparentF hparentU hlim_parent + +/-- Coordinatewise reflected-gradient convergence transfer, stated directly in +the `ScalarL2` classes on the centered parent cube. -/ +theorem tendsto_toScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_coord + {G : ℕ → Vec d → Vec d} {H : Vec d → Vec d} (j : Fin d) + (hG : ∀ n, MemVectorL2 (openCubeSet (originCube d m)) (G n)) + (hH : MemVectorL2 (openCubeSet (originCube d m)) H) + (hlim : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => G n x j - H x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => + toScalarL2 + (memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) (hG n)) j)) + Filter.atTop + (nhds + (toScalarL2 + (memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) hH) j))) := by + let parentG : ℕ → Vec d → ℝ := fun n x => + cubeCoordinateFoldReflectedVectorField (originCube d m) (G n) x j + let parentH : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedVectorField (originCube d m) H x j + have hparentG : ∀ n, + MemScalarL2 (openCubeSet (originCube d (m + 1))) (parentG n) := by + intro n + simpa [parentG] using + memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) (hG n)) j + have hparentH : + MemScalarL2 (openCubeSet (originCube d (m + 1))) parentH := by + simpa [parentH] using + memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) hH) j + have hdiff : ∀ n, + MemVectorL2 (openCubeSet (originCube d m)) (fun x => G n x - H x) := + fun n => (hG n).sub hH + have hlim_parent : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => parentG n x - parentH x) 2 + (volumeMeasureOn (openCubeSet (originCube d (m + 1))))) + Filter.atTop (nhds 0) := by + simpa [parentG, parentH, Pi.sub_apply] using + tendsto_eLpNorm_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_sub_coord + (m := m) (G := G) (H := H) j hdiff hlim + simpa [parentG, parentH] using + tendsto_toScalarL2_of_tendsto_eLpNorm + (U := openCubeSet (originCube d (m + 1))) + (F := parentG) (G := parentH) hparentG hparentH hlim_parent + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentEnergyFactor.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentEnergyFactor.lean new file mode 100644 index 0000000000..5035418224 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentEnergyFactor.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothBound + +/-! # Reflection Parent Energy Factor -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +private noncomputable def originCubeParentReducedSolverEnergyInside + (d : ℕ) (m : ℤ) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V + 1 + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)))) + +private theorem originCubeParentReducedSolverEnergyInside_nonneg + (d : ℕ) (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyInside d m := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V + 1 + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hV_nonneg : 0 ≤ V := by + dsimp [V] + exact cubeVolume_nonneg Q + have hB_nonneg : 0 ≤ B := by + dsimp [B] + linarith + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + exact mul_nonneg (by norm_num) (mul_nonneg (Nat.cast_nonneg d) (sq_nonneg _)) + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + exact mul_nonneg (Nat.cast_nonneg d) (sq_nonneg _) + have hmain_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) := by + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) hV_nonneg) + · refine mul_nonneg hKinner_nonneg ?_ + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) (sq_nonneg _)) + · exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg (by positivity) (sq_nonneg _))) + dsimp [originCubeParentReducedSolverEnergyInside, Q, Qp, C, V, B, Kinner, Kouter] + exact mul_nonneg (by norm_num) hmain_nonneg + +/-- The coefficient obtained by factoring the normalized forcing norm out of +the reflected-parent solver energy bound. -/ +noncomputable def originCubeParentReducedSolverEnergyConstant + (d : ℕ) (m : ℤ) : ℝ := + (originCubeParentReducedSolverEnergyInside d m) ^ (1 / (2 : ℝ)) + +theorem originCubeParentReducedSolverEnergyConstant_nonneg + (d : ℕ) (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyConstant d m := by + unfold originCubeParentReducedSolverEnergyConstant + exact Real.rpow_nonneg + (originCubeParentReducedSolverEnergyInside_nonneg d m) _ + +theorem originCubeParentReducedSolverEnergyBound_eq_constant_mul_cubeLpNorm + (d : ℕ) (m : ℤ) (F : Vec d → ℝ) (i : Fin d) : + originCubeParentReducedSolverEnergyBound d m F i = + originCubeParentReducedSolverEnergyConstant d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V + 1 + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hfactor : + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (V * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * (B * L)) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * (B * L))) ^ 2)))) = + originCubeParentReducedSolverEnergyInside d m * L ^ 2 := by + dsimp [originCubeParentReducedSolverEnergyInside, Q, Qp, C, V, B, L, Kinner, Kouter] + rw [Real.rpow_two] + ring + calc + originCubeParentReducedSolverEnergyBound d m F i + = ((originCubeParentReducedSolverEnergyInside d m) * L ^ 2) ^ + (1 / (2 : ℝ)) := by + dsimp [originCubeParentReducedSolverEnergyBound, Q, Qp, C, L, B, Kinner, Kouter] + rw [hfactor] + _ = (originCubeParentReducedSolverEnergyInside d m) ^ (1 / (2 : ℝ)) * + (L ^ 2) ^ (1 / (2 : ℝ)) := by + rw [Real.mul_rpow + (originCubeParentReducedSolverEnergyInside_nonneg d m) (sq_nonneg L)] + _ = originCubeParentReducedSolverEnergyConstant d m * L := by + unfold originCubeParentReducedSolverEnergyConstant + rw [show (L ^ 2) ^ (1 / (2 : ℝ)) = L by + rw [← Real.sqrt_eq_rpow, Real.sqrt_sq hL_nonneg]] + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentExactEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentExactEnergy.lean new file mode 100644 index 0000000000..2e76cc306b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentExactEnergy.lean @@ -0,0 +1,464 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentSmoothBound + +/-! # Reflection Parent Exact Energy -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + +theorem norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ≤ + cubeMeanZeroH1CoerciveConstant (originCube d m) * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F) := by + let Q : TriadicCube d := originCube d m + calc + ‖W.w.toH1Function.gradToHilbertVectorL2‖ = + ‖W.w.gradToHilbertVectorL2‖ := rfl + _ ≤ cubeMeanZeroH1CoerciveConstant Q * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖ := by + simpa [Q] using + meanZeroNeumannPoissonSolution_norm_gradToHilbertVectorL2_le Q hF W + _ = cubeMeanZeroH1CoerciveConstant Q * + ((cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F) := by + rw [norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two Q hF] + +theorem norm_toScalarL2_le_solverCubeLpNorm_exact + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖W.w.toH1Function.toScalarL2‖ ≤ + cubeMeanZeroH1CoerciveConstant (originCube d m) * + (cubeMeanZeroH1CoerciveConstant (originCube d m) * + ((cubeVolume (originCube d m)) ^ (1 / 2 : ℝ) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F)) := by + let Q : TriadicCube d := originCube d m + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + have hvalue : + ‖W.w.toH1Function.toScalarL2‖ ≤ + cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm := by + change W.w.valueL2Norm ≤ cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm + simpa [cubeMeanZeroH1CoerciveConstant, hC] using hC.bound W.w + calc + ‖W.w.toH1Function.toScalarL2‖ + ≤ cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm := hvalue + _ ≤ cubeMeanZeroH1CoerciveConstant Q * ‖W.w.gradToHilbertVectorL2‖ := by + exact mul_le_mul_of_nonneg_left + (H1MeanZeroFunction.gradientL2Norm_le_norm_gradToHilbertVectorL2 W.w) + (cubeMeanZeroH1CoerciveConstant_nonneg Q) + _ ≤ cubeMeanZeroH1CoerciveConstant Q * + (cubeMeanZeroH1CoerciveConstant Q * + ((cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) F)) := by + exact mul_le_mul_of_nonneg_left + (by + simpa [Q] using! + norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact W hF) + (cubeMeanZeroH1CoerciveConstant_nonneg Q) + +/-- Scale-sharp forcing-facing reflected-parent reduced energy expression. -/ +noncomputable def originCubeParentReducedSolverEnergyBoundExact + (d : ℕ) (m : ℤ) (F : Vec d → ℝ) (_i : Fin d) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) * L + ((4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2)) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2) * + ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))))) ^ + (1 / (2 : ℝ)) + +theorem originCubeParentReducedNormEnergyBound_le_solverEnergyBoundExact + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (i : Fin d) : + originCubeParentReducedNormEnergyBound W i ≤ + originCubeParentReducedSolverEnergyBoundExact d m F i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) * L + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + let A : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2))) + let Benergy : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) + have hgrad_sq : + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2 ≤ (C * B) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_gradToHilbertVectorL2_le_solverCubeLpNorm_exact W hF) + 2 + have hvalue_sq : + ‖W.w.toH1Function.toScalarL2‖ ^ 2 ≤ (C * (C * B)) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_toScalarL2_le_solverCubeLpNorm_exact W hF) + 2 + have hthree_nonneg : 0 ≤ (3 : ℝ) ^ d := by positivity + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + positivity + have hinner : + (2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) ≤ + (2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)) := by + refine add_le_add ?_ ?_ + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hgrad_sq hthree_nonneg) + (by norm_num) + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hvalue_sq hthree_nonneg) + hKouter_nonneg) + (by norm_num) + have hAB : A ≤ Benergy := by + dsimp [A, Benergy] + exact add_le_add_right (mul_le_mul_of_nonneg_left hinner hKinner_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * Benergy := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hL_sq_nonneg : 0 ≤ L ^ (2 : ℝ) := + Real.rpow_nonneg hL_nonneg _ + have hforce_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg + (mul_nonneg (cubeVolume_nonneg Q) hL_sq_nonneg)) + have hgrad_term_nonneg : + 0 ≤ (2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg (sq_nonneg _)) + have hvalue_term_nonneg : + 0 ≤ (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg hthree_nonneg (sq_nonneg _))) + have hinner_orig_nonneg : + 0 ≤ + (2 : ℝ) * + ((3 : ℝ) ^ d * + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) := + add_nonneg hgrad_term_nonneg hvalue_term_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg hforce_nonneg + (mul_nonneg hKinner_nonneg hinner_orig_nonneg) + exact mul_nonneg (by norm_num) hA_nonneg + simpa [originCubeParentReducedNormEnergyBound, + originCubeParentReducedSolverEnergyBoundExact, Q, Qp, C, L, B, Kinner, + Kouter, A, Benergy] using + Real.rpow_le_rpow h4A_nonneg h4AB + (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBoundExact + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBoundExact d m F i := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + hmean hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + originCubeParentReducedNormEnergyBound_le_solverEnergyBoundExact W hF i + +private noncomputable def originCubeParentReducedSolverEnergyInsideExact + (d : ℕ) (m : ℤ) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)))) + +private theorem originCubeParentReducedSolverEnergyInsideExact_nonneg + (d : ℕ) (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyInsideExact d m := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hV_nonneg : 0 ≤ V := by + dsimp [V] + exact cubeVolume_nonneg Q + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + positivity + have hmain_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * V) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) := by + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) hV_nonneg) + · refine mul_nonneg hKinner_nonneg ?_ + refine add_nonneg ?_ ?_ + · exact mul_nonneg (by norm_num) + (mul_nonneg (by positivity) (sq_nonneg _)) + · exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg (by positivity) (sq_nonneg _))) + dsimp [originCubeParentReducedSolverEnergyInsideExact, Q, Qp, C, V, B, Kinner, Kouter] + exact mul_nonneg (by norm_num) hmain_nonneg + +noncomputable def originCubeParentReducedSolverEnergyConstantExact + (d : ℕ) (m : ℤ) : ℝ := + (originCubeParentReducedSolverEnergyInsideExact d m) ^ (1 / (2 : ℝ)) + +theorem originCubeParentReducedSolverEnergyConstantExact_nonneg + (d : ℕ) (m : ℤ) : + 0 ≤ originCubeParentReducedSolverEnergyConstantExact d m := by + unfold originCubeParentReducedSolverEnergyConstantExact + exact Real.rpow_nonneg + (originCubeParentReducedSolverEnergyInsideExact_nonneg d m) _ + +private theorem originCubeParentReducedSolverEnergyInsideExact_eq_volume_mul_unit + (d : ℕ) (m : ℤ) : + originCubeParentReducedSolverEnergyInsideExact d m = + cubeVolume (originCube d m) * + originCubeParentReducedSolverEnergyInsideExact d 0 := by + let s : ℝ := (3 : ℝ) ^ m + let C₀ : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let κ : ℝ := quantitativeCubeCutoffGradientConst d + have hs_pos : 0 < s := by + dsimp [s] + exact zpow_pos (by norm_num : (0 : ℝ) < 3) m + have hs_nonneg : 0 ≤ s := le_of_lt hs_pos + have hs_ne : s ≠ 0 := hs_pos.ne' + have hV_m : cubeVolume (originCube d m) = s ^ d := by + simp [cubeVolume_eq_scaleFactor_pow, s] + have hV_0 : cubeVolume (originCube d 0) = 1 := by + simp [cubeVolume_eq_scaleFactor_pow] + have hC_m : + cubeMeanZeroH1CoerciveConstant (originCube d m) = s * C₀ := by + simp [cubeMeanZeroH1CoerciveConstant_eq_scale_mul_unit, C₀, s] + have hC_0 : + cubeMeanZeroH1CoerciveConstant (originCube d 0) = C₀ := by + simp [cubeMeanZeroH1CoerciveConstant_eq_scale_mul_unit, C₀] + have hR_m : cubeRadius (originCube d (m + 1)) = (3 / 2 : ℝ) * s := by + dsimp [cubeRadius, cubeScaleFactor, originCube, s] + rw [zpow_add₀] + · norm_num + ring + · norm_num + have hR_0 : cubeRadius (originCube d (1 : ℤ)) = (3 / 2 : ℝ) := by + norm_num [cubeRadius, cubeScaleFactor, originCube] + have hBsq : ((s ^ d) ^ (1 / 2 : ℝ)) ^ 2 = s ^ d := by + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt (by positivity) + dsimp [originCubeParentReducedSolverEnergyInsideExact] + rw [hV_m, hV_0, hC_m, hC_0, hR_m, hR_0] + norm_num + ring_nf + rw [hBsq] + field_simp [hs_ne] + +theorem originCubeParentReducedSolverEnergyConstantExact_volume_cancel + (d : ℕ) (m : ℤ) : + ((cubeVolume (originCube d m))⁻¹) ^ (1 / 2 : ℝ) * + originCubeParentReducedSolverEnergyConstantExact d m = + originCubeParentReducedSolverEnergyConstantExact d 0 := by + let V : ℝ := cubeVolume (originCube d m) + let A : ℝ := originCubeParentReducedSolverEnergyInsideExact d 0 + have hV_pos : 0 < V := by + dsimp [V] + exact cubeVolume_pos (originCube d m) + have hV_nonneg : 0 ≤ V := le_of_lt hV_pos + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact originCubeParentReducedSolverEnergyInsideExact_nonneg d 0 + have hinside : + originCubeParentReducedSolverEnergyInsideExact d m = V * A := by + dsimp [V, A] + exact originCubeParentReducedSolverEnergyInsideExact_eq_volume_mul_unit d m + have hV_cancel : + (V⁻¹) ^ (1 / 2 : ℝ) * (V ^ (1 / 2 : ℝ)) = 1 := by + rw [Real.inv_rpow hV_nonneg (1 / 2 : ℝ)] + exact inv_mul_cancel₀ (Real.rpow_pos_of_pos hV_pos _).ne' + calc + ((cubeVolume (originCube d m))⁻¹) ^ (1 / 2 : ℝ) * + originCubeParentReducedSolverEnergyConstantExact d m + = (V⁻¹) ^ (1 / 2 : ℝ) * + ((V * A) ^ (1 / 2 : ℝ)) := by + simp [originCubeParentReducedSolverEnergyConstantExact, V, A, hinside] + _ = (V⁻¹) ^ (1 / 2 : ℝ) * + (V ^ (1 / 2 : ℝ) * A ^ (1 / 2 : ℝ)) := by + rw [Real.mul_rpow hV_nonneg hA_nonneg] + _ = A ^ (1 / 2 : ℝ) := by + rw [← mul_assoc, hV_cancel, one_mul] + _ = originCubeParentReducedSolverEnergyConstantExact d 0 := by + simp [originCubeParentReducedSolverEnergyConstantExact, A] + +theorem originCubeParentReducedSolverEnergyBoundExact_eq_constant_mul_cubeLpNorm + (d : ℕ) (m : ℤ) (F : Vec d → ℝ) (i : Fin d) : + originCubeParentReducedSolverEnergyBoundExact d m F i = + originCubeParentReducedSolverEnergyConstantExact d m * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let V : ℝ := cubeVolume Q + let B : ℝ := V ^ (1 / 2 : ℝ) + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hfactor : + (4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (V * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * (B * L)) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * (B * L))) ^ 2)))) = + originCubeParentReducedSolverEnergyInsideExact d m * L ^ 2 := by + dsimp [originCubeParentReducedSolverEnergyInsideExact, Q, Qp, C, V, B, L, Kinner, Kouter] + rw [Real.rpow_two] + ring + calc + originCubeParentReducedSolverEnergyBoundExact d m F i + = ((originCubeParentReducedSolverEnergyInsideExact d m) * L ^ 2) ^ + (1 / (2 : ℝ)) := by + dsimp [originCubeParentReducedSolverEnergyBoundExact, Q, Qp, C, V, L, B, + Kinner, Kouter] + rw [hfactor] + _ = (originCubeParentReducedSolverEnergyInsideExact d m) ^ (1 / (2 : ℝ)) * + (L ^ 2) ^ (1 / (2 : ℝ)) := by + rw [Real.mul_rpow + (originCubeParentReducedSolverEnergyInsideExact_nonneg d m) (sq_nonneg L)] + _ = originCubeParentReducedSolverEnergyConstantExact d m * L := by + unfold originCubeParentReducedSolverEnergyConstantExact + rw [show (L ^ 2) ^ (1 / (2 : ℝ)) = L by + rw [← Real.sqrt_eq_rpow, Real.sqrt_sq hL_nonneg]] + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1.lean new file mode 100644 index 0000000000..a64c7573ba --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1.lean @@ -0,0 +1,117 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1Graph + +/-! # Reflection Parent H1 -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-! +# Parent-cube `H¹` reflection handoff + +The all-face coordinate-fold reflection is recovered as an honest parent-cube +`H1Function` by proving that its scalar/vector representatives lie in the +closed weak-gradient graph on the parent cube. +-/ + +/-- The all-face coordinate-fold reflection on centered cubes is an honest +`H¹` function on the centered parent cube. -/ +theorem exists_cubeFaceReflectionParentH1Function_originCube + {d : ℕ} {m : ℤ} + (u : H1Function (openCubeSet (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) u.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => u.grad y) := by + have huOpen : MemScalarL2 (openCubeSet (originCube d m)) u.toFun := by + simpa [MemScalarL2, volumeMeasureOn] using u.memL2 + have hGOpen : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => u.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using u.grad_memVectorL2 + have hscalar : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedScalar (originCube d m) u.toFun) := + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) huOpen + have hvector : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => u.grad y)) := + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) hGOpen + have hgraph : + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) ∈ + h1GraphClosedSubmodule (U := openCubeSet (originCube d (m + 1))) := + mem_h1GraphClosedSubmodule_cubeCoordinateFoldReflection_originCube + (m := m) u hscalar hvector + exact + exists_h1Function_of_toScalarL2_toHilbertVectorL2OfVecField_mem_h1GraphClosedSubmodule + (U := openCubeSet (originCube d (m + 1))) + hscalar hvector hgraph + +/-- The gradient-only form consumed by the folded-solenoidal Hodge reduction. -/ +theorem exists_cubeFaceReflectionParentH1Function_grad_originCube + {d : ℕ} {m : ℤ} + (u : H1Function (openCubeSet (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => u.grad y) := by + rcases exists_cubeFaceReflectionParentH1Function_originCube (m := m) u with + ⟨uP, _huP_toFun, huP_grad⟩ + exact ⟨uP, huP_grad⟩ + +/-- The exact reflected-test constructor required by +`ReflectionParentOrthogonality`. -/ +theorem cubeFaceReflectionParent_reflected_h1_tests_originCube + {d : ℕ} {m : ℤ} : + ∀ φ : H1Function (openCubeSet (originCube d m)), + ∃ ψ : H1Function (openCubeSet (originCube d (m + 1))), + ψ.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => φ.grad y) := by + intro φ + exact exists_cubeFaceReflectionParentH1Function_grad_originCube (m := m) φ + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + +/-- Parent reflected weak equation obtained from the isolated `H¹` reflection +gluing input and the already-proved folded-Hodge bookkeeping. -/ +theorem exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + exact + W.exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_parent_reflected_h1_tests + (cubeFaceReflectionParent_reflected_h1_tests_originCube (d := d) (m := m)) + hmean hF + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1Graph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1Graph.lean new file mode 100644 index 0000000000..ae9cdf847c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentH1Graph.lean @@ -0,0 +1,493 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentOrthogonality +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestWeakIdentity + +/-! # Reflection Parent H1Graph -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Parent reflected `H¹` graph membership + +This file proves the remaining parent-cube weak-gradient constraints for the +all-face coordinate-fold reflection. The point is to avoid a separate +Sobolev trace/gluing theorem: parent test functions are folded back to the +original cube, the original weak derivative identity is applied to the signed +folded scalar test, and the graph constructor then recovers the parent +`H1Function` with the exact reflected representatives. +-/ + +private theorem memScalarL2_of_contDiff_hasCompactSupport {d : ℕ} + (U : Set (Vec d)) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict U + +private theorem memScalarL2_comp_cellFoldMap_of_contDiff_hasCompactSupport + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 (openCubeSet Q) + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + have hcomp_smooth : + ContDiff ℝ (⊤ : ℕ∞) + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + simpa using contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hψ + have hcomp_compact : + HasCompactSupport + (fun y => ψ (cubeFaceReflectionCellFoldMap Q choice y)) := by + simpa using hasCompactSupport_comp_cubeFaceReflectionCellFoldMap + Q choice hψ_compact + exact memScalarL2_of_contDiff_hasCompactSupport + (openCubeSet Q) hcomp_smooth hcomp_compact + +private theorem integrable_openCubeSet_mul_deriv_comp_cellFoldMap + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet Q) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) (choice : Fin d → Fin 3) : + MeasureTheory.Integrable + (fun y => + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hD_smooth : + ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordDeriv i φ) := + contDiff_euclideanCoordDeriv hφ i + have hD_compact : + HasCompactSupport (euclideanCoordDeriv i φ) := + hasCompactSupport_euclideanCoordDeriv hφ_compact i + have hD : + MemScalarL2 (openCubeSet Q) + (fun y => + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) := + memScalarL2_comp_cellFoldMap_of_contDiff_hasCompactSupport + Q choice hD_smooth hD_compact + exact hF.integrable_mul hD + +/-- Change variables on one reflection cell in the scalar pairing with a +parent coordinate derivative. -/ +theorem setIntegral_cubeFaceReflectionCellCube_reflectedScalar_mul_deriv_eq + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (i : Fin d) (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y) + ∂MeasureTheory.volume := by + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let g : Vec d → ℝ := fun y => F y * euclideanCoordDeriv i φ (T y) + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + g (T x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hscalar := + cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice F hx + simp [g, T, hscalar, cubeFaceReflectionCellFoldMap_involutive Q choice x] + _ = ∫ y in openCubeSet Q, g y ∂MeasureTheory.volume := by + simpa [g, T] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap Q choice g + +/-- Scalar reflected pairing on the full reflection block, folded back to the +original cube. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_reflectedScalar_mul_deriv_eq_folded + {d : ℕ} {Q : TriadicCube d} {F φ : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet Q) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedScalar Q F x * + euclideanCoordDeriv i φ x + have hfCell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let g : Vec d → ℝ := fun y => F y * euclideanCoordDeriv i φ (T y) + have hg : + MeasureTheory.Integrable g + (MeasureTheory.volume.restrict (openCubeSet Q)) := + integrable_openCubeSet_mul_deriv_comp_cellFoldMap + (Q := Q) (F := F) (φ := φ) hF hφ hφ_compact i choice + have hcomp : + MeasureTheory.Integrable (fun x => g (T x)) + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := g) hg + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + have hscalar := + cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + Q choice F hx + simp [f, g, T, hscalar, cubeFaceReflectionCellFoldMap_involutive Q choice x] + have hsplit : + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfCell + have hsum : + (∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y) + ∂MeasureTheory.volume) = + ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + calc + (∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y) + ∂MeasureTheory.volume) = + ∫ y in openCubeSet Q, + ∑ choice : Fin d → Fin 3, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y) + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro choice _hchoice + exact + integrable_openCubeSet_mul_deriv_comp_cellFoldMap + (Q := Q) (F := F) (φ := φ) hF hφ hφ_compact i choice + _ = ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + change + (∑ choice : Fin d → Fin 3, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) = + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + rw [Finset.mul_sum] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := hsplit + _ = ∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + F y * + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y) + ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_reflectedScalar_mul_deriv_eq + (Q := Q) (F := F) (φ := φ) i choice + _ = ∫ y in openCubeSet Q, + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := hsum + +/-- Centered parent-cube form of the scalar reflected derivative pairing. -/ +theorem setIntegral_originCube_succ_reflectedScalar_mul_deriv_eq_folded + {d : ℕ} {m : ℤ} {F φ : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in openCubeSet (originCube d (m + 1)), + cubeCoordinateFoldReflectedScalar (originCube d m) F x * + euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + F y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeCoordinateFoldReflectedScalar (originCube d m) F x * + euclideanCoordDeriv i φ x)] + exact + setIntegral_cubeFaceReflectionBlockSet_reflectedScalar_mul_deriv_eq_folded + (Q := originCube d m) (F := F) (φ := φ) hF hφ hφ_compact i + +private theorem vecDot_smul_basisVec_left {d : ℕ} + (i : Fin d) (a : ℝ) (v : Vec d) : + vecDot (a • basisVec i) v = a * v i := by + classical + simp [vecDot, basisVec_apply] + +private theorem cubeFaceReflectionCellFoldLinear_smul_basisVec {d : ℕ} + (choice : Fin d → Fin 3) (i : Fin d) (a : ℝ) : + cubeFaceReflectionCellFoldLinear choice (a • basisVec i) = + (cubeFaceReflectionCellFoldSign choice i * a) • basisVec i := by + rw [map_smul, cubeFaceReflectionCellFoldLinear_basisVec] + by_cases h : choice i = 1 <;> + simp [cubeFaceReflectionCellFoldSign, h, mul_comm] + +/-- Folding the parent vector test `φ eᵢ` is the signed scalar fold in the +`i`th basis direction. -/ +theorem cubeFaceReflectionFoldedParentVectorField_smul_basisVec + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) (y : Vec d) : + cubeFaceReflectionFoldedParentVectorField Q + (fun x => φ x • basisVec i) y = + cubeFaceReflectionFoldedParentScalarTest Q i φ y • basisVec i := by + classical + unfold cubeFaceReflectionFoldedParentVectorField + cubeFaceReflectionFoldedParentScalarTest + rw [Finset.sum_smul] + apply Finset.sum_congr rfl + intro choice _hchoice + exact cubeFaceReflectionCellFoldLinear_smul_basisVec choice i + (φ (cubeFaceReflectionCellFoldMap Q choice y)) + +/-- Component pairing form of the folded parent vector test `φ eᵢ`. -/ +theorem vecDot_cubeFaceReflectionFoldedParentVectorField_smul_basisVec + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) + (G : Vec d) (y : Vec d) : + vecDot + (cubeFaceReflectionFoldedParentVectorField Q + (fun x => φ x • basisVec i) y) + G = + cubeFaceReflectionFoldedParentScalarTest Q i φ y * G i := by + rw [cubeFaceReflectionFoldedParentVectorField_smul_basisVec] + exact vecDot_smul_basisVec_left i + (cubeFaceReflectionFoldedParentScalarTest Q i φ y) G + +private theorem memVectorL2_smul_basisVec_of_memScalarL2 + {d : ℕ} {U : Set (Vec d)} {φ : Vec d → ℝ} + (hφ : MemScalarL2 U φ) (i : Fin d) : + MemVectorL2 U (fun x => φ x • basisVec i) := by + let L : ℝ →L[ℝ] Vec d := (1 : ℝ →L[ℝ] ℝ).smulRight (basisVec i) + have hL := L.comp_memLp' hφ + simpa [MemScalarL2, MemVectorL2, volumeMeasureOn, L, Function.comp_def, + ContinuousLinearMap.smulRight_apply] using hL + +/-- The parent vector reflected pairing in coordinate form, folded back to the +original cube against the signed folded scalar test. -/ +theorem setIntegral_originCube_succ_reflectedVectorField_coord_mul_eq_folded + {d : ℕ} {m : ℤ} {G : Vec d → Vec d} {φ : Vec d → ℝ} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (i : Fin d) : + ∫ x in openCubeSet (originCube d (m + 1)), + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) i * + φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + G y i * + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ y + ∂MeasureTheory.volume := by + let Q : TriadicCube d := originCube d m + let Uparent : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let g : Vec d → Vec d := fun x => φ x • basisVec i + have hφL2 : MemScalarL2 Uparent φ := + memScalarL2_of_contDiff_hasCompactSupport Uparent hφ hφ_compact + have hg : MemVectorL2 Uparent g := + memVectorL2_smul_basisVec_of_memScalarL2 hφL2 i + have hpair := + setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + (m := m) (g := g) (G := G) hg hG + calc + ∫ x in openCubeSet (originCube d (m + 1)), + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) i * + φ x ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d (m + 1))) ?_ + intro x _hx + change + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) i * + φ x = + vecDot (φ x • basisVec i) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + rw [vecDot_smul_basisVec_left] + ring + _ = ∫ y in openCubeSet (originCube d m), + vecDot + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g y) + (G y) ∂MeasureTheory.volume := hpair + _ = ∫ y in openCubeSet (originCube d m), + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ y * + G y i ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d m)) ?_ + intro y _hy + exact + vecDot_cubeFaceReflectionFoldedParentVectorField_smul_basisVec + (originCube d m) i φ (G y) y + _ = ∫ y in openCubeSet (originCube d m), + G y i * + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ y + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (originCube d m)) ?_ + intro y _hy + ring + +/-- The all-face coordinate-fold reflection of an origin-cube `H¹` function +defines a point of the closed parent-cube weak-gradient graph. -/ +theorem mem_h1GraphClosedSubmodule_cubeCoordinateFoldReflection_originCube + {d : ℕ} {m : ℤ} + (u : H1Function (openCubeSet (originCube d m))) + (hscalar : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedScalar (originCube d m) u.toFun)) + (hvector : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => u.grad y))) : + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) ∈ + h1GraphClosedSubmodule (U := openCubeSet (originCube d (m + 1))) := by + rw [mem_h1GraphClosedSubmodule_iff] + intro i φ + let Q : TriadicCube d := originCube d m + let Uparent : Set (Vec d) := openCubeSet (originCube d (m + 1)) + let fR : Vec d → ℝ := cubeCoordinateFoldReflectedScalar Q u.toFun + let GR : Vec d → Vec d := + cubeCoordinateFoldReflectedVectorField Q (fun y => u.grad y) + have hrawScalar : + ∫ x in Uparent, + (toScalarL2 hscalar) x * φ.deriv i x ∂MeasureTheory.volume = + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toScalarL2 hscalar] with x hx + rw [hx] + simp [H1WeakTestFunction.deriv, euclideanCoordDeriv, fR, Q] + have hrawVector : + ∫ x in Uparent, + (toHilbertVectorL2OfVecField hvector) x i * φ x + ∂MeasureTheory.volume = + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toHilbertVectorL2OfVecField hvector] with x hx + rw [hx] + simp [hilbertifyVecField, GR, Q] + have hscalarFold : + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume := by + simpa [Uparent, fR, Q] using + setIntegral_originCube_succ_reflectedScalar_mul_deriv_eq_folded + (m := m) (F := u.toFun) (φ := φ) + (by simpa [MemScalarL2, volumeMeasureOn] using u.memL2) + φ.smooth φ.compactSupport i + have hvectorFold : + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + u.grad y i * + cubeFaceReflectionFoldedParentScalarTest Q i φ y + ∂MeasureTheory.volume := by + have hG : MemVectorL2 (openCubeSet Q) (fun y => u.grad y) := by + simpa [MemVectorL2, volumeMeasureOn, Q] using u.grad_memVectorL2 + simpa [Uparent, GR, Q] using + setIntegral_originCube_succ_reflectedVectorField_coord_mul_eq_folded + (m := m) (G := fun y => u.grad y) (φ := φ) + hG φ.smooth φ.compactSupport i + have hweak := + u.integral_mul_foldedParentScalarTest_derivSum_eq_neg_integral_mul_originCube + m i φ.smooth φ.compactSupport φ.support_subset + calc + h1WeakConstraintCLM + (U := openCubeSet (originCube d (m + 1))) i φ + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) + = + ∫ x in Uparent, + (toScalarL2 hscalar) x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in Uparent, + (toHilbertVectorL2OfVecField hvector) x i * φ x + ∂MeasureTheory.volume := by + simpa [Uparent] using + h1WeakConstraintCLM_apply_eq_integral + (U := openCubeSet (originCube d (m + 1))) i φ + (toScalarL2 hscalar, toHilbertVectorL2OfVecField hvector) + _ = + ∫ x in Uparent, + fR x * euclideanCoordDeriv i φ x ∂MeasureTheory.volume + + ∫ x in Uparent, GR x i * φ x ∂MeasureTheory.volume := by + rw [hrawScalar, hrawVector] + _ = + ∫ y in openCubeSet Q, + u y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice y)) + ∂MeasureTheory.volume + + ∫ y in openCubeSet Q, + u.grad y i * + cubeFaceReflectionFoldedParentScalarTest Q i φ y + ∂MeasureTheory.volume := by + rw [hscalarFold, hvectorFold] + _ = 0 := by + rw [hweak] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentInterior.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentInterior.lean new file mode 100644 index 0000000000..26067d8068 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentInterior.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitHessianPointwise +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ScaledCubeGeometry + +/-! # Reflection Parent Interior -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem hasWeakPartialDerivOn_congr_of_eqOn {d : ℕ} {U : Set (Vec d)} + (hU_meas : MeasurableSet U) {i : Fin d} + {u v gi hi : Vec d → ℝ} (huv : Set.EqOn u v U) + (hgi : Set.EqOn gi hi U) + (h : HasWeakPartialDerivOn U i u gi) : + HasWeakPartialDerivOn U i v hi := by + intro φ hφ hφs hφ_sub + have hleft : + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change v x * (fderiv ℝ φ x) (basisVec i) = + u x * (fderiv ℝ φ x) (basisVec i) + rw [← huv hx] + have hright : + ∫ x in U, gi x * φ x ∂MeasureTheory.volume = + ∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro x hx + change gi x * φ x = hi x * φ x + rw [hgi hx] + calc + ∫ x in U, v x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := hleft + _ = -∫ x in U, gi x * φ x ∂MeasureTheory.volume := + h φ hφ hφs hφ_sub + _ = -∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + rw [hright] + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {V : Set (Vec d)} {F : Vec d → ℝ} + +/-- Canonical cutoff from the original cube, viewed as the one-third inner +cube of its centered parent, to a half-radius parent cube. -/ +noncomputable def originCubeParentOneThirdHalfCutoff (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) (1 / 2 : ℝ) := + QuantitativeCubeCutoff.canonical (originCube d (m + 1)) (1 / 3 : ℝ) (1 / 2 : ℝ) + (by norm_num) (by norm_num) + +/-- Canonical outer cutoff used by the parent-cube interior estimate. -/ +noncomputable def originCubeParentThreeQuarterSevenEighthCutoff (d : ℕ) (m : ℤ) : + QuantitativeCubeCutoff (originCube d (m + 1)) (3 / 4 : ℝ) (7 / 8 : ℝ) := + QuantitativeCubeCutoff.canonical (originCube d (m + 1)) (3 / 4 : ℝ) (7 / 8 : ℝ) + (by norm_num) (by norm_num) + +/-- Stronger reflected parent package retaining the folded-function equality. + +The older handoff only retained the gradient equality, since that was enough +to establish the weak equation. For the boundary CZ route we also need the +function equality, so that the parent-cube interior Hessian can later be +read back on the original cube. -/ +theorem exists_cubeFaceReflectionParent_h1_weakPoissonEquationOn_originCube + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + rcases + exists_cubeFaceReflectionParentH1Function_originCube + (m := m) W.w.toH1Function with + ⟨uP, huP_toFun, huP_grad⟩ + refine ⟨uP, huP_toFun, huP_grad, ?_⟩ + exact + W.cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_grad_eq + uP huP_grad hmean hF + +/-- Apply the interior weak-Hessian estimate on the centered parent cube after +all-face reflection of an origin-cube Neumann solution. -/ +theorem exists_cubeFaceReflectionParent_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hV : IsOpenBoundedConvexDomain V) + {ρ₁ ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff (originCube d (m + 1)) ρ₁ ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet (originCube d (m + 1)) ρ₁ ⊆ V) + (θ : QuantitativeCubeCutoff (originCube d (m + 1)) σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet (originCube d (m + 1)) ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) + (hρ₁_nonneg : 0 ≤ ρ₁) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ uS : H1Function (scaledOpenCubeSet (originCube d (m + 1)) ρ₁), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : + HasWeakHessianOn + (scaledOpenCubeSet (originCube d (m + 1)) ρ₁) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i ρ₁ ρ₂ σ₁ σ₂ θ := by + rcases + W.exists_cubeFaceReflectionParent_h1_weakPoissonEquationOn_originCube + hmean hF with + ⟨uP, huP_toFun, huP_grad, hweak⟩ + have hFopen : MemScalarL2 (openCubeSet (originCube d m)) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure (originCube d m) hF + have hFparent : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := + memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) hFopen + rcases + hweak.exists_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le_of_strict_inner_margin + hFparent hV η hη_sub hinnerV θ hVν hν_nonneg hνσ + hσ₁_lt_one hσ₂_nonneg hσ₂_lt_one hρ₁_nonneg with + ⟨uS, huS_toFun, huS_grad, H, hH⟩ + exact ⟨uP, huP_toFun, huP_grad, uS, huS_toFun, huS_grad, H, hH⟩ + +/-- The parent reflected Hessian estimate specialized to the one-third inner +cube, read back as an estimate on the original centered cube. -/ +theorem exists_cubeFaceReflectionParent_hasWeakHessianOn_originCube_hessianCoordL2NormSum_le + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (hV : IsOpenBoundedConvexDomain V) + {ρ₂ σ₁ σ₂ ν : ℝ} + (η : QuantitativeCubeCutoff (originCube d (m + 1)) (1 / 3 : ℝ) ρ₂) + (hη_sub : tsupport (η : Vec d → ℝ) ⊆ V) + (hinnerV : scaledClosedCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) ⊆ V) + (θ : QuantitativeCubeCutoff (originCube d (m + 1)) σ₁ σ₂) + (hVν : V ⊆ scaledClosedCubeSet (originCube d (m + 1)) ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν < σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hσ₂_nonneg : 0 ≤ σ₂) + (hσ₂_lt_one : σ₂ < 1) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ uS : H1Function (openCubeSet (originCube d m)), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i (1 / 3 : ℝ) ρ₂ σ₁ σ₂ θ := by + have hparent := + W.exists_cubeFaceReflectionParent_hasWeakHessianOn_restrict_hessianCoordL2NormSum_le + hmean hF hV η hη_sub hinnerV θ hVν hν_nonneg hνσ hσ₁_lt_one + hσ₂_nonneg hσ₂_lt_one (by norm_num : 0 ≤ (1 / 3 : ℝ)) + have hgeom : + scaledOpenCubeSet (originCube d (m + 1)) (1 / 3 : ℝ) = + openCubeSet (originCube d m) := + scaledOpenCubeSet_originCube_succ_one_div_three d m + rw [hgeom] at hparent + exact hparent + +/-- The one-third reflected-parent Hessian estimate with fixed numerical +cutoffs. The remaining right-hand side is the smooth-test constant generated +by those canonical cutoffs. -/ +theorem exists_cubeFaceReflectionParent_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ uS : H1Function (openCubeSet (originCube d m)), + uS.toFun = uP.toFun ∧ + uS.grad = uP.grad ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) uS, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + let Qp : TriadicCube d := originCube d (m + 1) + let Vp : Set (Vec d) := scaledOpenCubeSet Qp (2 / 3 : ℝ) + have hV : IsOpenBoundedConvexDomain Vp := by + exact isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos Qp + (by norm_num : 0 < (2 / 3 : ℝ)) + have hη_sub : + tsupport (originCubeParentOneThirdHalfCutoff d m : Vec d → ℝ) ⊆ Vp := by + have hclosed : + tsupport (originCubeParentOneThirdHalfCutoff d m : Vec d → ℝ) ⊆ + scaledClosedCubeSet Qp (1 / 2 : ℝ) := + (originCubeParentOneThirdHalfCutoff d m).tsupport_subset_scaledClosedCubeSet_of_support_subset + exact hclosed.trans + (scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (1 / 2 : ℝ) < 2 / 3)) + have hinnerV : + scaledClosedCubeSet Qp (1 / 3 : ℝ) ⊆ Vp := + scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt Qp + (by norm_num : (1 / 3 : ℝ) < 2 / 3) + have hVν : + Vp ⊆ scaledClosedCubeSet Qp (2 / 3 : ℝ) := + scaledOpenCubeSet_subset_scaledClosedCubeSet Qp (2 / 3 : ℝ) + simpa [Qp, Vp, originCubeParentOneThirdHalfCutoff, + originCubeParentThreeQuarterSevenEighthCutoff] using + W.exists_cubeFaceReflectionParent_hasWeakHessianOn_originCube_hessianCoordL2NormSum_le + hmean hF hV (originCubeParentOneThirdHalfCutoff d m) hη_sub hinnerV + (originCubeParentThreeQuarterSevenEighthCutoff d m) hVν + (by norm_num : 0 ≤ (2 / 3 : ℝ)) (by norm_num : (2 / 3 : ℝ) < 3 / 4) + (by norm_num : (3 / 4 : ℝ) < 1) (by norm_num : 0 ≤ (7 / 8 : ℝ)) + (by norm_num : (7 / 8 : ℝ) < 1) + +/-- Read the reflected-parent fixed-radii Hessian witness as a weak Hessian +of the original Neumann solution on the original cube. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + rcases + W.exists_cubeFaceReflectionParent_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + hmean hF with + ⟨uP, huP_toFun, huP_grad, uS, _huS_toFun, huS_grad, H, hH⟩ + let HW : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function := + { hess := H.hess + hess_memL2 := H.hess_memL2 + weak_second := by + intro i j + have hgrad_eq : + Set.EqOn (fun x => uS.grad x i) + (fun x => W.w.toH1Function.grad x i) (openCubeSet (originCube d m)) := by + intro x hx + calc + uS.grad x i = uP.grad x i := by rw [huS_grad] + _ = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) x i := by + rw [huP_grad] + _ = W.w.toH1Function.grad x i := by + exact congrFun + (cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet + (originCube d m) (fun y => W.w.toH1Function.grad y) hx) i + exact + hasWeakPartialDerivOn_congr_of_eqOn + (measurableSet_openCubeSet (originCube d m)) hgrad_eq + (fun _x _hx => rfl) (H.weak_second i j) } + refine ⟨uP, huP_toFun, huP_grad, HW, ?_⟩ + simpa [HW, HasWeakHessianOn.hessianCoordL2NormSum, + HasWeakHessianOn.hessCoordToScalarL2] using hH + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentL2.lean new file mode 100644 index 0000000000..47002041e0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentL2.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.MemL2AndPairings +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry + +/-! # Reflection Parent L2 -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +variable {d : ℕ} {m : ℤ} + +/-- The all-face reflected scalar is `L²` on the centered parent cube. -/ +theorem memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + {F : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) : + MemScalarL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + have hblock := + memScalarL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar + (originCube d m) hF + have hmeasure : + volumeMeasureOn (openCubeSet (originCube d (m + 1))) = + volumeMeasureOn (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + simpa [MemScalarL2, hmeasure] using hblock + +/-- The all-face reflected vector field is `L²` on the centered parent cube. -/ +theorem memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + {G : Vec d → Vec d} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G) := by + have hblock := + memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + (originCube d m) hG + have hmeasure : + volumeMeasureOn (openCubeSet (originCube d (m + 1))) = + volumeMeasureOn (cubeFaceReflectionBlockSet (originCube d m)) := by + simpa [volumeMeasureOn] using + MeasureTheory.Measure.restrict_congr_set + (cubeFaceReflectionBlockSet_originCube_ae_eq_openCubeSet_succ d m).symm + simpa [MemVectorL2, hmeasure] using hblock + +/-- Scalar reflected energy on the centered parent cube is `3^d` copies of +the original cube energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + {F : Vec d → ℝ} + (hF : MemScalarL2 (openCubeSet (originCube d m)) F) : + ∫ x in openCubeSet (originCube d (m + 1)), + cubeCoordinateFoldReflectedScalar (originCube d m) F x * + cubeCoordinateFoldReflectedScalar (originCube d m) F x + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), F y * F y + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeCoordinateFoldReflectedScalar (originCube d m) F x * + cubeCoordinateFoldReflectedScalar (originCube d m) F x)] + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + (originCube d m) hF + +/-- Vector reflected energy on the centered parent cube is `3^d` copies of +the original cube energy. -/ +theorem setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + {G : Vec d → Vec d} + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), vecDot (G y) (G y) + ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x))] + exact + setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + (originCube d m) hG + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentOrthogonality.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentOrthogonality.lean new file mode 100644 index 0000000000..e77c719184 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentOrthogonality.lean @@ -0,0 +1,493 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentPotential + +/-! # Reflection Parent Orthogonality -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal BigOperators + +noncomputable section + +variable {d : ℕ} {m : ℤ} + +/-- Fold a parent-cube vector field back to the original cube by summing the +signed pullbacks from all reflection cells. This is the test field whose +solenoidal zero-normal property is the concrete Hodge-orthogonality task left +by the reflection argument. -/ +def cubeFaceReflectionFoldedParentVectorField {d : ℕ} + (Q : TriadicCube d) (g : Vec d → Vec d) : Vec d → Vec d := + fun y => + ∑ choice : Fin d → Fin 3, + cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y)) + +private theorem preimage_cubeFaceReflectionCellFoldMap_cellCube {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + cubeFaceReflectionCellFoldMap Q choice ⁻¹' + openCubeSet (cubeFaceReflectionCellCube Q choice) = + openCubeSet Q := by + ext x + constructor + · intro hx + have hx' : + cubeFaceReflectionCellFoldMap Q choice x ∈ + cubeFaceReflectionCellFoldMap Q choice ⁻¹' openCubeSet Q := by + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using hx + simpa [cubeFaceReflectionCellFoldMap_involutive Q choice x] using hx' + · intro hx + have hx' : + cubeFaceReflectionCellFoldMap Q choice x ∈ + cubeFaceReflectionCellFoldMap Q choice ⁻¹' openCubeSet Q := by + simpa [cubeFaceReflectionCellFoldMap_involutive Q choice x] using hx + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] using hx' + +private theorem memVectorL2_openCubeSet_cellCube_comp_cellFoldMap + {d : ℕ} {Q : TriadicCube d} {choice : Fin d → Fin 3} + {g : Vec d → Vec d} + (hg : + MemVectorL2 (openCubeSet (cubeFaceReflectionCellCube Q choice)) g) : + MemVectorL2 (openCubeSet Q) + (fun y => g (cubeFaceReflectionCellFoldMap Q choice y)) := by + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet (cubeFaceReflectionCellCube Q choice)) + have hcomp := hg.comp_measurePreserving hmp + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeFaceReflectionCellFoldMap_cellCube Q choice, + Function.comp_def] using hcomp + +private theorem memVectorL2_openCubeSet_cellFoldLinear_comp_cellFoldMap + {d : ℕ} {Q : TriadicCube d} {choice : Fin d → Fin 3} + {g : Vec d → Vec d} + (hg : + MemVectorL2 (openCubeSet (cubeFaceReflectionCellCube Q choice)) g) : + MemVectorL2 (openCubeSet Q) + (fun y => + cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) := by + have hcomp := + memVectorL2_openCubeSet_cellCube_comp_cellFoldMap + (Q := Q) (choice := choice) hg + simpa [Function.comp_def] using + (cubeFaceReflectionCellFoldLinear choice).comp_memLp' hcomp + +private theorem integrable_openCubeSet_vecDot_cellFoldLinear_comp_cellFoldMap + {d : ℕ} {Q : TriadicCube d} {choice : Fin d → Fin 3} + {g G : Vec d → Vec d} + (hg : + MemVectorL2 (openCubeSet (cubeFaceReflectionCellCube Q choice)) g) + (hG : MemVectorL2 (openCubeSet Q) G) : + MeasureTheory.Integrable + (fun y => + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y)) + (MeasureTheory.volume.restrict (openCubeSet Q)) := by + have hgFold := + memVectorL2_openCubeSet_cellFoldLinear_comp_cellFoldMap + (Q := Q) (choice := choice) hg + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet Q) hgFold hG + +private theorem vecDot_fintype_sum_left {d : ℕ} {ι : Type*} + [Fintype ι] (a : ι → Vec d) (b : Vec d) : + vecDot (∑ i, a i) b = ∑ i, vecDot (a i) b := by + classical + rw [vecDot] + simp only [Finset.sum_apply, Finset.sum_mul] + change + (∑ x : Fin d, ∑ y : ι, a y x * b x) = + ∑ y : ι, vecDot (a y) b + rw [Finset.sum_comm] + simp [vecDot] + +private theorem openCubeSet_cellCube_subset_originCube_succ + {d : ℕ} (m : ℤ) (choice : Fin d → Fin 3) : + openCubeSet (cubeFaceReflectionCellCube (originCube d m) choice) ⊆ + openCubeSet (originCube d (m + 1)) := by + intro x hx + have hcellBlock : + openCubeSet (cubeFaceReflectionCellCube (originCube d m) choice) ⊆ + cubeFaceReflectionBlockSet (originCube d m) := by + simpa [openCubeSet_cubeFaceReflectionCellCube] using + cubeFaceReflectionCellSet_subset_cubeFaceReflectionBlockSet + (originCube d m) choice + exact cubeFaceReflectionBlockSet_originCube_subset_openCubeSet_succ d m + (hcellBlock hx) + +private theorem memVectorL2_openCubeSet_cellCube_of_memVectorL2_originCube_succ + {d : ℕ} {m : ℤ} {g : Vec d → Vec d} + (hg : MemVectorL2 (openCubeSet (originCube d (m + 1))) g) + (choice : Fin d → Fin 3) : + MemVectorL2 + (openCubeSet (cubeFaceReflectionCellCube (originCube d m) choice)) g := by + have hsub := openCubeSet_cellCube_subset_originCube_succ (d := d) m choice + have hmono := + MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hsub + simpa [MemVectorL2, volumeMeasureOn] using hg.mono_measure hmono + +/-- The finite folded parent vector field is `L²` on the original cube. -/ +theorem memVectorL2_openCubeSet_cubeFaceReflectionFoldedParentVectorField + {d : ℕ} {m : ℤ} {g : Vec d → Vec d} + (hg : MemVectorL2 (openCubeSet (originCube d (m + 1))) g) : + MemVectorL2 (openCubeSet (originCube d m)) + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g) := by + classical + simpa [cubeFaceReflectionFoldedParentVectorField] using! + MeasureTheory.memLp_finsetSum + (s := (Finset.univ : Finset (Fin d → Fin 3))) + (f := fun choice : Fin d → Fin 3 => fun y : Vec d => + cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap (originCube d m) choice y))) + (p := (2 : ℝ≥0∞)) + (μ := MeasureTheory.volume.restrict (openCubeSet (originCube d m))) + (fun choice _hchoice => + memVectorL2_openCubeSet_cellFoldLinear_comp_cellFoldMap + (Q := originCube d m) (choice := choice) + (memVectorL2_openCubeSet_cellCube_of_memVectorL2_originCube_succ + (m := m) hg choice)) + +/-- Change variables on one reflection cell in the pairing between an +arbitrary parent vector field and a reflected original-cube vector field. -/ +theorem setIntegral_cubeFaceReflectionCellCube_vecDot_field_reflectedVectorField_eq + {d : ℕ} {Q : TriadicCube d} {g G : Vec d → Vec d} + (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y) ∂MeasureTheory.volume := by + let T : Vec d → Vec d := cubeFaceReflectionCellFoldMap Q choice + let L : Vec d →L[ℝ] Vec d := cubeFaceReflectionCellFoldLinear choice + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (fun y => vecDot (L (g (T y))) (G y)) (T x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + have hvec := + cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice G hx + calc + vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + = vecDot (g x) (L (G (T x))) := by + simpa [T, L] using congrArg (fun v => vecDot (g x) v) hvec + _ = vecDot (L (g x)) (G (T x)) := by + exact + (vecDot_cubeFaceReflectionCellFoldLinear_left + choice (g x) (G (T x))).symm + _ = vecDot (L (g (T (T x)))) (G (T x)) := by + simp [T, cubeFaceReflectionCellFoldMap_involutive Q choice x] + _ = ∫ y in openCubeSet Q, + vecDot (L (g (T y))) (G y) ∂MeasureTheory.volume := by + simpa [T, L] using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice + (fun y => vecDot (L (g (T y))) (G y)) + +/-- The block pairing with a reflected vector field is the original-cube +pairing against the finite folded parent vector field. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_vecDot_field_reflectedVectorField_eq_folded + {d : ℕ} {Q : TriadicCube d} {g G : Vec d → Vec d} + (hgCell : + ∀ choice : Fin d → Fin 3, + MemVectorL2 (openCubeSet (cubeFaceReflectionCellCube Q choice)) g) + (hG : MemVectorL2 (openCubeSet Q) G) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + ∫ y in openCubeSet Q, + vecDot (cubeFaceReflectionFoldedParentVectorField Q g y) (G y) + ∂MeasureTheory.volume := by + classical + let f : Vec d → ℝ := + fun x => vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + have hRBlock : + MemVectorL2 (cubeFaceReflectionBlockSet Q) + (cubeCoordinateFoldReflectedVectorField Q G) := + memVectorL2_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField + Q hG + have hcell_subset : + ∀ choice : Fin d → Fin 3, + openCubeSet (cubeFaceReflectionCellCube Q choice) ⊆ + cubeFaceReflectionBlockSet Q := by + intro choice + simpa [openCubeSet_cubeFaceReflectionCellCube] using + cubeFaceReflectionCellSet_subset_cubeFaceReflectionBlockSet Q choice + have hfCell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (MeasureTheory.volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + have hRCell : + MemVectorL2 (openCubeSet (cubeFaceReflectionCellCube Q choice)) + (cubeCoordinateFoldReflectedVectorField Q G) := by + have hmono := + MeasureTheory.Measure.restrict_mono_set + MeasureTheory.volume (hcell_subset choice) + simpa [MemVectorL2, volumeMeasureOn] using hRBlock.mono_measure hmono + simpa [f, MeasureTheory.IntegrableOn, volumeMeasureOn] using + integrableOn_vecDot_of_memVectorL2 + (U := openCubeSet (cubeFaceReflectionCellCube Q choice)) + (hgCell choice) hRCell + have hsplit : + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := + setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfCell + have hsum : + (∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y) ∂MeasureTheory.volume) = + ∫ y in openCubeSet Q, + vecDot (cubeFaceReflectionFoldedParentVectorField Q g y) (G y) + ∂MeasureTheory.volume := by + calc + (∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y) ∂MeasureTheory.volume) = + ∫ y in openCubeSet Q, + ∑ choice : Fin d → Fin 3, + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro choice _hchoice + exact + integrable_openCubeSet_vecDot_cellFoldLinear_comp_cellFoldMap + (Q := Q) (choice := choice) (g := g) (G := G) + (hgCell choice) hG + _ = ∫ y in openCubeSet Q, + vecDot (cubeFaceReflectionFoldedParentVectorField Q g y) (G y) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + exact + (vecDot_fintype_sum_left + (fun choice : Fin d → Fin 3 => + cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y)).symm + calc + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (g x) (cubeCoordinateFoldReflectedVectorField Q G x) + ∂MeasureTheory.volume = + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂MeasureTheory.volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂MeasureTheory.volume := hsplit + _ = ∑ choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, + vecDot + (cubeFaceReflectionCellFoldLinear choice + (g (cubeFaceReflectionCellFoldMap Q choice y))) + (G y) ∂MeasureTheory.volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_vecDot_field_reflectedVectorField_eq + (Q := Q) (g := g) (G := G) choice + _ = ∫ y in openCubeSet Q, + vecDot (cubeFaceReflectionFoldedParentVectorField Q g y) (G y) + ∂MeasureTheory.volume := hsum + +/-- Centered parent-cube form of the folded-field reduction. To prove the +Hodge orthogonality demanded by the parent reflection potential theorem, it is +enough to show that this folded field is solenoidal zero-normal on the original +cube. -/ +theorem setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + {d : ℕ} {m : ℤ} {g G : Vec d → Vec d} + (hg : MemVectorL2 (openCubeSet (originCube d (m + 1))) g) + (hG : MemVectorL2 (openCubeSet (originCube d m)) G) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x) + ∂MeasureTheory.volume = + ∫ y in openCubeSet (originCube d m), + vecDot + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g y) + (G y) ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) G x))] + exact + setIntegral_cubeFaceReflectionBlockSet_vecDot_field_reflectedVectorField_eq_folded + (Q := originCube d m) (g := g) (G := G) + (fun choice => + memVectorL2_openCubeSet_cellCube_of_memVectorL2_originCube_succ + (m := m) hg choice) + hG + +/-- If every original-cube `H¹` test admits the expected all-face reflected +`H¹` realization on the centered parent cube, then folding a parent +solenoidal zero-normal field back to the original cube preserves the +solenoidal zero-normal test identity. This is the remaining Sobolev gluing +lemma in its most concrete form. -/ +theorem cubeFaceReflectionFoldedParentVectorField_isSolenoidalZeroNormalTraceOn_of_parent_reflected_h1_tests + {d : ℕ} {m : ℤ} {g : Vec d → Vec d} + (hg : MemVectorL2 (openCubeSet (originCube d (m + 1))) g) + (hsol : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d (m + 1))) g) + (hreflect : + ∀ φ : H1Function (openCubeSet (originCube d m)), + ∃ ψ : H1Function (openCubeSet (originCube d (m + 1))), + ψ.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => φ.grad y)) : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d m)) + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g) := by + intro φ + rcases hreflect φ with ⟨ψ, hψ_grad⟩ + have hpair := + setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + (m := m) (g := g) (G := fun y => φ.grad y) + hg φ.grad_memVectorL2 + have hparent : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => φ.grad y) x) ∂MeasureTheory.volume = 0 := by + simpa [hψ_grad] using hsol ψ + rw [hpair] at hparent + exact hparent + +namespace MeanZeroNeumannPoissonSolution + +variable {F : Vec d → ℝ} + +/-- Conditional discharge of the parent Hodge orthogonality: after folding a +parent solenoidal test field back to the original cube, the remaining analytic +claim is exactly that the folded field is solenoidal zero-normal there. -/ +theorem cubeFaceReflectionParent_orthogonal_of_folded_solenoidal + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + {g : Vec d → Vec d} + (hg : MemVectorL2 (openCubeSet (originCube d (m + 1))) g) + (hfoldSol : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d m)) + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g)) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) x) + ∂MeasureTheory.volume = 0 := by + have hG : MemVectorL2 (openCubeSet (originCube d m)) + (fun y => W.w.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + rw [setIntegral_originCube_succ_vecDot_field_reflectedVectorField_eq_folded + (m := m) (g := g) (G := fun y => W.w.toH1Function.grad y) hg hG] + exact hfoldSol W.w.toH1Function + +/-- Hodge-potential handoff with the remaining trace/gluing task isolated to a +single preservation property for folded parent solenoidal tests. -/ +theorem cubeFaceReflectionParent_reflectedGradient_isPotentialOn_originCube_of_folded_solenoidal + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hfoldSol : + ∀ {g : Vec d → Vec d}, + MemVectorL2 (openCubeSet (originCube d (m + 1))) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d (m + 1))) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d m)) + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g)) : + IsPotentialOn (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y)) := by + exact + W.cubeFaceReflectionParent_reflectedGradient_isPotentialOn_originCube_of_orthogonal + (by + intro g hg hsol + exact W.cubeFaceReflectionParent_orthogonal_of_folded_solenoidal + hg (hfoldSol hg hsol)) + +/-- Full weak-equation handoff from the folded-solenoidal preservation lemma. +This is the exact interface needed before applying the interior `H²` estimate +on the centered parent cube. -/ +theorem exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_folded_solenoidal + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hfoldSol : + ∀ {g : Vec d → Vec d}, + MemVectorL2 (openCubeSet (originCube d (m + 1))) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d (m + 1))) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d m)) + (cubeFaceReflectionFoldedParentVectorField (originCube d m) g)) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + exact + W.exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_isPotentialOn + (W.cubeFaceReflectionParent_reflectedGradient_isPotentialOn_originCube_of_folded_solenoidal + hfoldSol) + hmean hF + +/-- End-to-end conditional form of the reflection route: it remains to +construct the reflected parent `H¹` test for every original-cube `H¹` test. -/ +theorem exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_parent_reflected_h1_tests + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hreflect : + ∀ φ : H1Function (openCubeSet (originCube d m)), + ∃ ψ : H1Function (openCubeSet (originCube d (m + 1))), + ψ.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => φ.grad y)) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + exact + W.exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_folded_solenoidal + (by + intro g hg hsol + exact + cubeFaceReflectionFoldedParentVectorField_isSolenoidalZeroNormalTraceOn_of_parent_reflected_h1_tests + hg hsol hreflect) + hmean hF + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentPotential.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentPotential.lean new file mode 100644 index 0000000000..bc9c0c9cfb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentPotential.lean @@ -0,0 +1,95 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionWeakEquation + +/-! # Reflection Parent Potential -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + +/-- Hodge-style reduction of the remaining parent-cube reflection gluing task: +it is enough to prove that the reflected Neumann gradient is orthogonal to all +solenoidal zero-normal fields on the centered parent cube. -/ +theorem cubeFaceReflectionParent_reflectedGradient_isPotentialOn_originCube_of_orthogonal + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (horth : + ∀ {g : Vec d → Vec d}, + MemVectorL2 (openCubeSet (originCube d (m + 1))) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d (m + 1))) g → + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot (g x) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) x) + ∂MeasureTheory.volume = 0) : + IsPotentialOn (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y)) := by + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (openCubeSet (originCube d (m + 1)))) := + (isOpenBoundedConvexDomain_openCubeSet + (originCube d (m + 1))).isFiniteMeasure_restrict_volume + have hGopen : + MemVectorL2 (openCubeSet (originCube d m)) + (fun y => W.w.toH1Function.grad y) := by + simpa [MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + have hGparent : + MemVectorL2 (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y)) := + memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + hGopen + exact + IsPotentialOn.of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d (m + 1))) + (isOpenBoundedConvexDomain_openCubeSet (originCube d (m + 1)))) + hGparent horth + +/-- Once the parent reflected vector field is known to be a potential, choose +an `H¹` potential and put the parent reflected equation into the +`WeakPoissonEquationOn` interface. -/ +theorem exists_cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_isPotentialOn + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hpot : + IsPotentialOn (openCubeSet (originCube d (m + 1))) + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y))) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + rcases hpot with ⟨uP, huP_grad⟩ + refine ⟨uP, huP_grad, ?_⟩ + exact + W.cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_grad_eq + uP huP_grad hmean hF + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothApprox.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothApprox.lean new file mode 100644 index 0000000000..f48023cb53 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothApprox.lean @@ -0,0 +1,131 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentApprox +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero + +/-! # Reflection Parent Smooth Approx -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +variable {d : ℕ} {m : ℤ} + +/-! +# Smooth approximation after parent-cube reflection + +This file packages the clean part of the reflected-parent approximation step: +smooth convex-domain approximants on the original cube converge after all-face +reflection in the parent cube. It intentionally does not assert that the +reflected smooth representatives are already parent-cube `H¹` functions; that +is the remaining trace/gluing bridge. +-/ + +/-- Smooth convex approximants on the origin cube converge, after all-face +scalar reflection, to the reflected scalar target in parent-cube `L²`. -/ +theorem tendsto_toScalarL2_openCubeSet_succ_originCube_reflectedScalar_convexApproxSmoothH1 + (u : H1Function (openCubeSet (originCube d m))) + {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet (originCube d m)) + (hr : 0 < r) : + Filter.Tendsto + (fun n => + toScalarL2 + (memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) + (H1Function.convexApproxSmoothH1 + (U := openCubeSet (originCube d m)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)) u x0 hr n).memL2)) + Filter.atTop + (nhds + (toScalarL2 + (memScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) u.memL2))) := by + let hU := isOpenBoundedConvexDomain_openCubeSet (originCube d m) + let ψ : ℕ → H1Function (openCubeSet (originCube d m)) := fun n => + H1Function.convexApproxSmoothH1 (U := openCubeSet (originCube d m)) hU u x0 hr n + have hψ : + Filter.Tendsto (fun n => (ψ n).toScalarL2) Filter.atTop + (nhds u.toScalarL2) := by + simpa [ψ, hU] using + H1Function.tendsto_convexApproxSmoothH1_toScalarL2 + (U := openCubeSet (originCube d m)) hU u hball hr + have hraw : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => (ψ n).toFun x - u.toFun x) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0) := by + exact + tendsto_eLpNorm_of_tendsto_toScalarL2 + (U := openCubeSet (originCube d m)) + (F := fun n => (ψ n).toFun) (G := u.toFun) + (hF := fun n => (ψ n).memL2) (hG := u.memL2) hψ + simpa [ψ, hU] using + tendsto_toScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar + (m := m) (F := fun n => (ψ n).toFun) (U := u.toFun) + (hF := fun n => (ψ n).memL2) (hU := u.memL2) hraw + +/-- Smooth convex approximant gradients on the origin cube converge +coordinatewise, after all-face vector-field reflection, to the reflected +gradient target in parent-cube `L²`. -/ +theorem tendsto_toScalarL2_openCubeSet_succ_originCube_reflectedGradient_convexApproxSmoothH1_coord + (u : H1Function (openCubeSet (originCube d m))) + {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet (originCube d m)) + (hr : 0 < r) (j : Fin d) : + Filter.Tendsto + (fun n => + toScalarL2 + (memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) + (H1Function.convexApproxSmoothH1 + (U := openCubeSet (originCube d m)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d m)) u x0 hr n).grad_memVectorL2) + j)) + Filter.atTop + (nhds + (toScalarL2 + (memScalarL2_coord_of_memVectorL2 + (memVectorL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField + (m := m) u.grad_memVectorL2) + j))) := by + let hU := isOpenBoundedConvexDomain_openCubeSet (originCube d m) + let ψ : ℕ → H1Function (openCubeSet (originCube d m)) := fun n => + H1Function.convexApproxSmoothH1 (U := openCubeSet (originCube d m)) hU u x0 hr n + have hψ : + Filter.Tendsto (fun n => (ψ n).gradCoordToScalarL2 j) Filter.atTop + (nhds (u.gradCoordToScalarL2 j)) := by + simpa [ψ, hU] using + H1Function.tendsto_convexApproxSmoothH1_gradCoordToScalarL2 + (U := openCubeSet (originCube d m)) hU u hball hr j + have hraw : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => (ψ n).grad x j - u.grad x j) 2 + (volumeMeasureOn (openCubeSet (originCube d m)))) + Filter.atTop (nhds 0) := by + exact + tendsto_eLpNorm_of_tendsto_toScalarL2 + (U := openCubeSet (originCube d m)) + (F := fun n x => (ψ n).grad x j) (G := fun x => u.grad x j) + (hF := fun n => (ψ n).grad_memL2 j) (hG := u.grad_memL2 j) hψ + simpa [ψ, hU] using + tendsto_toScalarL2_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_coord + (m := m) (G := fun n => (ψ n).grad) (H := u.grad) j + (hG := fun n => (ψ n).grad_memVectorL2) (hH := u.grad_memVectorL2) hraw + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothBound.lean new file mode 100644 index 0000000000..85894a172b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentSmoothBound.lean @@ -0,0 +1,617 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothTestBoundEstimate + +/-! # Reflection Parent Smooth Bound -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + +/-- Original-cube energy bound obtained after reading the fixed-radii +reflected-parent reduced smooth-test constant through the all-face reflection +identities. -/ +noncomputable def originCubeParentReducedOriginalEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) (_i : Fin d) : ℝ := + ((4 : ℝ) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), F y ^ 2 ∂MeasureTheory.volume) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * + cubeRadius (originCube d (m + 1)))) ^ 2)) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + vecDot (W.w.toH1Function.grad y) (W.w.toH1Function.grad y) + ∂MeasureTheory.volume) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * + cubeRadius (originCube d (m + 1)))) ^ 2) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet (originCube d m), + W.w.toH1Function.toFun y ^ 2 ∂MeasureTheory.volume))))) ^ + (1 / (2 : ℝ)) + +/-- The same reflected-parent reduced energy bound, but with the original-cube +forcing, gradient, and value integrals rewritten as the normalized forcing +`L²` norm and the solver's `L²` realizations. -/ +noncomputable def originCubeParentReducedNormEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) (_i : Fin d) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + ((4 : ℝ) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + (cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℝ))) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2)) * + ((2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2))))) ^ + (1 / (2 : ℝ)) + +/-- The solver gradient `L²` realization on the original cube is controlled by +the normalized forcing `L²` norm. -/ +theorem norm_gradToHilbertVectorL2_le_solverCubeLpNorm + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ≤ + cubeMeanZeroH1CoerciveConstant (originCube d m) * + ((cubeVolume (originCube d m) + 1) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F) := by + let Q : TriadicCube d := originCube d m + calc + ‖W.w.toH1Function.gradToHilbertVectorL2‖ = + ‖W.w.gradToHilbertVectorL2‖ := rfl + _ ≤ cubeMeanZeroH1CoerciveConstant Q * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖ := by + simpa [Q] using + meanZeroNeumannPoissonSolution_norm_gradToHilbertVectorL2_le Q hF W + _ ≤ cubeMeanZeroH1CoerciveConstant Q * + ((cubeVolume Q + 1) * cubeLpNorm Q (2 : ℝ≥0∞) F) := by + exact mul_le_mul_of_nonneg_left + (norm_toScalarL2_openCubeSet_le_volume_add_one_mul_cubeLpNorm_two Q hF) + (cubeMeanZeroH1CoerciveConstant_nonneg Q) + +/-- The solver value `L²` realization on the original cube is controlled by +the normalized forcing `L²` norm, using the cube coercive estimate once more +after the gradient estimate. -/ +theorem norm_toScalarL2_le_solverCubeLpNorm + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ‖W.w.toH1Function.toScalarL2‖ ≤ + cubeMeanZeroH1CoerciveConstant (originCube d m) * + (cubeMeanZeroH1CoerciveConstant (originCube d m) * + ((cubeVolume (originCube d m) + 1) * + cubeLpNorm (originCube d m) (2 : ℝ≥0∞) F)) := by + let Q : TriadicCube d := originCube d m + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + have hvalue : + ‖W.w.toH1Function.toScalarL2‖ ≤ + cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm := by + change W.w.valueL2Norm ≤ cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm + simpa [cubeMeanZeroH1CoerciveConstant, hC] using hC.bound W.w + calc + ‖W.w.toH1Function.toScalarL2‖ + ≤ cubeMeanZeroH1CoerciveConstant Q * W.w.gradientL2Norm := hvalue + _ ≤ cubeMeanZeroH1CoerciveConstant Q * ‖W.w.gradToHilbertVectorL2‖ := by + exact mul_le_mul_of_nonneg_left + (H1MeanZeroFunction.gradientL2Norm_le_norm_gradToHilbertVectorL2 W.w) + (cubeMeanZeroH1CoerciveConstant_nonneg Q) + _ ≤ cubeMeanZeroH1CoerciveConstant Q * + (cubeMeanZeroH1CoerciveConstant Q * + ((cubeVolume Q + 1) * cubeLpNorm Q (2 : ℝ≥0∞) F)) := by + exact mul_le_mul_of_nonneg_left + (by + simpa [Q] using! + norm_gradToHilbertVectorL2_le_solverCubeLpNorm W hF) + (cubeMeanZeroH1CoerciveConstant_nonneg Q) + +/-- A fully forcing-facing version of the reflected-parent reduced energy +bound. The remaining constants are explicit cube geometry and the coercive +constant already used by the Neumann solver. -/ +noncomputable def originCubeParentReducedSolverEnergyBound + (d : ℕ) (m : ℤ) (F : Vec d → ℝ) (_i : Fin d) : ℝ := + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q + 1) * L + ((4 : ℝ) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2)) * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2) * + ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))))) ^ + (1 / (2 : ℝ)) + +/-- The reflected-parent reduced norm energy is bounded by the explicit +forcing-facing solver energy expression. -/ +theorem originCubeParentReducedNormEnergyBound_le_solverEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (i : Fin d) : + originCubeParentReducedNormEnergyBound W i ≤ + originCubeParentReducedSolverEnergyBound d m F i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let C : ℝ := cubeMeanZeroH1CoerciveConstant Q + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let B : ℝ := (cubeVolume Q + 1) * L + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + let A : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2))) + let Benergy : ℝ := + (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) + + Kinner * + ((2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2))) + have hgrad_sq : + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2 ≤ (C * B) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_gradToHilbertVectorL2_le_solverCubeLpNorm W hF) + 2 + have hvalue_sq : + ‖W.w.toH1Function.toScalarL2‖ ^ 2 ≤ (C * (C * B)) ^ 2 := by + exact pow_le_pow_left₀ (norm_nonneg _) + (by + simpa [Q, C, L, B] using + norm_toScalarL2_le_solverCubeLpNorm W hF) + 2 + have hthree_nonneg : 0 ≤ (3 : ℝ) ^ d := by positivity + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hKouter_nonneg : 0 ≤ Kouter := by + dsimp [Kouter] + positivity + have hinner : + (2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) ≤ + (2 : ℝ) * ((3 : ℝ) ^ d * (C * B) ^ 2) + + (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * (C * (C * B)) ^ 2)) := by + refine add_le_add ?_ ?_ + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hgrad_sq hthree_nonneg) + (by norm_num) + · exact mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hvalue_sq hthree_nonneg) + hKouter_nonneg) + (by norm_num) + have hAB : A ≤ Benergy := by + dsimp [A, Benergy] + exact add_le_add_right (mul_le_mul_of_nonneg_left hinner hKinner_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * Benergy := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + have hL_nonneg : 0 ≤ L := by + dsimp [L] + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F + have hL_sq_nonneg : 0 ≤ L ^ (2 : ℝ) := + Real.rpow_nonneg hL_nonneg _ + have hforce_nonneg : + 0 ≤ (2 : ℝ) * ((3 : ℝ) ^ d * (cubeVolume Q * L ^ (2 : ℝ))) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg + (mul_nonneg (cubeVolume_nonneg Q) hL_sq_nonneg)) + have hgrad_term_nonneg : + 0 ≤ (2 : ℝ) * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hthree_nonneg (sq_nonneg _)) + have hvalue_term_nonneg : + 0 ≤ (2 : ℝ) * + (Kouter * ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) := by + exact mul_nonneg (by norm_num) + (mul_nonneg hKouter_nonneg + (mul_nonneg hthree_nonneg (sq_nonneg _))) + have hinner_orig_nonneg : + 0 ≤ + (2 : ℝ) * + ((3 : ℝ) ^ d * + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * ‖W.w.toH1Function.toScalarL2‖ ^ 2)) := + add_nonneg hgrad_term_nonneg hvalue_term_nonneg + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact add_nonneg hforce_nonneg + (mul_nonneg hKinner_nonneg hinner_orig_nonneg) + exact mul_nonneg (by norm_num) hA_nonneg + simpa [originCubeParentReducedNormEnergyBound, + originCubeParentReducedSolverEnergyBound, Q, Qp, C, L, B, Kinner, + Kouter, A, Benergy] using + Real.rpow_le_rpow h4A_nonneg h4AB + (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +/-- The raw original-cube reflected-parent energy expression is exactly the +same as its norm-realized form. -/ +theorem originCubeParentReducedOriginalEnergyBound_eq_normEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + (i : Fin d) : + originCubeParentReducedOriginalEnergyBound W i = + originCubeParentReducedNormEnergyBound W i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + have hforce : + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) F) ^ (2 : ℝ) := by + simpa [Q, pow_two] using + setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow Q F hF + have hgrad : + ∫ y in openCubeSet Q, + vecDot (W.w.toH1Function.grad y) (W.w.toH1Function.grad y) + ∂MeasureTheory.volume = + ‖W.w.toH1Function.gradToHilbertVectorL2‖ ^ 2 := by + have hinner : + ∫ y in openCubeSet Q, + vecDot (W.w.toH1Function.grad y) (W.w.toH1Function.grad y) + ∂MeasureTheory.volume = + inner ℝ W.w.toH1Function.gradToHilbertVectorL2 + W.w.toH1Function.gradToHilbertVectorL2 := by + simpa [H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 + W.w.toH1Function.grad_memVectorL2).symm + rw [hinner] + exact real_inner_self_eq_norm_sq W.w.toH1Function.gradToHilbertVectorL2 + have hvalue : + ∫ y in openCubeSet Q, W.w.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume = + ‖W.w.toH1Function.toScalarL2‖ ^ 2 := by + simpa [H1Function.toScalarL2, Homogenization.toScalarL2] using + (toReal_eLpNorm_two_sq_eq_integral_sq W.w.toH1Function.memL2).symm + simp [originCubeParentReducedOriginalEnergyBound, + originCubeParentReducedNormEnergyBound, Q, hforce, hgrad, hvalue] + +/-- A fixed-radii reduced smooth-test constant on the reflected parent is +bounded by the corresponding original-cube energy expression. -/ +theorem openCubeInnerQuotientHessianSmoothTestReducedBound_le_originCubeParentReducedOriginalEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) + {uP : H1Function (openCubeSet (originCube d (m + 1)))} + (huP_toFun : + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun) + (huP_grad : + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y)) + (i : Fin d) : + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) ≤ + originCubeParentReducedOriginalEnergyBound W i := by + let Q : TriadicCube d := originCube d m + let Qp : TriadicCube d := originCube d (m + 1) + let fP : Vec d → ℝ := cubeCoordinateFoldReflectedScalar Q F + let G : Vec d → Vec d := fun y => W.w.toH1Function.grad y + let GP : Vec d → Vec d := cubeCoordinateFoldReflectedVectorField Q G + let uPfun : Vec d → ℝ := + cubeCoordinateFoldReflectedScalar Q W.w.toH1Function.toFun + let Kinner : ℝ := + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((1 / 2 : ℝ) - (1 / 3 : ℝ)) * cubeRadius Qp)) ^ 2) + let Kouter : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + (((7 / 8 : ℝ) - (3 / 4 : ℝ)) * cubeRadius Qp)) ^ 2 + let A : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Qp, fP x ^ 2 ∂MeasureTheory.volume + + Kinner * + ((2 : ℝ) * ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (Kouter * + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume)) + let B : ℝ := + (2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume) + + Kinner * + ((2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, W.w.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume))) + have hFopen : MemScalarL2 (openCubeSet Q) F := by + simpa [Q, MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure (originCube d m) hF + have hforce_eq : + ∫ x in openCubeSet Qp, fP x ^ 2 ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, F y ^ 2 ∂MeasureTheory.volume := by + simpa [Q, Qp, fP, pow_two] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + (m := m) hFopen + have hvalue_eq : + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, W.w.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume := by + have hW : MemScalarL2 (openCubeSet Q) W.w.toH1Function.toFun := by + simpa [Q, MemScalarL2, volumeMeasureOn] using W.w.toH1Function.memL2 + calc + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume = + ∫ x in openCubeSet Qp, uPfun x ^ 2 ∂MeasureTheory.volume := by + rw [huP_toFun] + _ = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, W.w.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume := by + simpa [Q, Qp, uPfun, pow_two] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedScalar_sq_of_memScalarL2_three_pow + (m := m) hW + have hgrad_coord_le : + ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 ∂MeasureTheory.volume ≤ + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + have hcoord : + ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 ∂MeasureTheory.volume ≤ + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume := by + simpa [Real.rpow_two, Real.norm_eq_abs, sq_abs] using + WeakPoissonEquationOn.integral_coord_norm_rpow_two_le_integral_vecNormSq_of_memVectorL2 + (U := openCubeSet Qp) uP.grad_memVectorL2 i + have hG : MemVectorL2 (openCubeSet Q) G := by + simpa [Q, G, MemVectorL2, volumeMeasureOn] using + W.w.toH1Function.grad_memVectorL2 + have hvec_eq : + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Qp, vecNormSq (uP.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Qp, vecDot (GP x) (GP x) + ∂MeasureTheory.volume := by + rw [huP_grad] + rfl + _ = + (3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) + ∂MeasureTheory.volume := by + simpa [Q, Qp, G, GP] using + setIntegral_openCubeSet_succ_originCube_cubeCoordinateFoldReflectedVectorField_self_pairing_of_memVectorL2_three_pow + (m := m) hG + exact hcoord.trans_eq hvec_eq + have hlower : + (2 : ℝ) * ∫ x in openCubeSet Qp, (uP.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (Kouter * + ∫ x in openCubeSet Qp, uP.toFun x ^ 2 ∂MeasureTheory.volume) ≤ + (2 : ℝ) * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂MeasureTheory.volume) + + (2 : ℝ) * + (Kouter * + ((3 : ℝ) ^ d * + ∫ y in openCubeSet Q, W.w.toH1Function.toFun y ^ 2 + ∂MeasureTheory.volume)) := by + rw [hvalue_eq] + exact add_le_add + (mul_le_mul_of_nonneg_left hgrad_coord_le (by norm_num)) + (le_refl _) + have hKinner_nonneg : 0 ≤ Kinner := by + dsimp [Kinner] + positivity + have hAB : A ≤ B := by + dsimp [A, B] + rw [hforce_eq] + exact add_le_add_right (mul_le_mul_of_nonneg_left hlower hKinner_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * B := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + dsimp [A, Kinner, Kouter] + positivity + simpa [WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound, + originCubeParentReducedOriginalEnergyBound, Q, Qp, fP, G, GP, uPfun, + Kinner, Kouter, A, B] using + Real.rpow_le_rpow h4A_nonneg h4AB (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +/-- The fixed-radii reflected-parent Hessian estimate with the raw smooth-test +constant replaced by the reduced unweighted `H¹` bound. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_reducedBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + @WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestReducedBound + d (originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) + i (1 / 3 : ℝ) (1 / 2 : ℝ) (3 / 4 : ℝ) (7 / 8 : ℝ) + (originCubeParentThreeQuarterSevenEighthCutoff d m) := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le + hmean hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + WeakPoissonEquationOn.openCubeInnerQuotientHessianSmoothTestBound_le_reducedBound + (Q := originCube d (m + 1)) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) i + (ρ₁ := (1 / 3 : ℝ)) (ρ₂ := (1 / 2 : ℝ)) + (σ₁ := (3 / 4 : ℝ)) (σ₂ := (7 / 8 : ℝ)) + (originCubeParentThreeQuarterSevenEighthCutoff d m) + +/-- The fixed-radii reflected-parent Hessian estimate, with the right-hand +side expressed entirely in original-cube energy terms. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_originalEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedOriginalEnergyBound W i := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_reducedBound + hmean hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + openCubeInnerQuotientHessianSmoothTestReducedBound_le_originCubeParentReducedOriginalEnergyBound + W hF huP_toFun huP_grad i + +/-- The fixed-radii reflected-parent Hessian estimate with the right-hand side +expressed through solver `L²` norms. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedNormEnergyBound W i := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_originalEnergyBound + hmean hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + le_of_eq (originCubeParentReducedOriginalEnergyBound_eq_normEnergyBound W hF i) + +/-- The fixed-radii reflected-parent Hessian estimate with the right-hand side +controlled by the explicit forcing-facing solver energy expression. -/ +theorem exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_solverEnergyBound + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∃ uP : H1Function (openCubeSet (originCube d (m + 1))), + uP.toFun = + cubeCoordinateFoldReflectedScalar (originCube d m) + W.w.toH1Function.toFun ∧ + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) ∧ + ∃ H : HasWeakHessianOn (openCubeSet (originCube d m)) W.w.toH1Function, + H.hessianCoordL2NormSum ≤ + ∑ i : Fin d, ∑ _j : Fin d, + originCubeParentReducedSolverEnergyBound d m F i := by + rcases + W.exists_hasWeakHessianOn_originCube_canonicalRadii_hessianCoordL2NormSum_le_normEnergyBound + hmean hF with + ⟨uP, huP_toFun, huP_grad, H, hH⟩ + refine ⟨uP, huP_toFun, huP_grad, H, hH.trans ?_⟩ + exact Finset.sum_le_sum fun i _hi => + Finset.sum_le_sum fun _j _hj => + originCubeParentReducedNormEnergyBound_le_solverEnergyBound W hF i + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestFold.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestFold.lean new file mode 100644 index 0000000000..d0b7e85a98 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestFold.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.FaceVanishCollar +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding + +/-! # Reflection Parent Test Fold -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Signed folded parent tests + +For the parent-cube H¹ gluing step, a parent test is pulled back to the +original cube through every reflection cell. In the weak-gradient identity +for coordinate `i`, the cell pullback is weighted by the `i`th reflection +sign. The resulting signed sum is the test whose boundary-face cancellation +should feed the face-zero cutoff closure. +-/ + +/-- The sign contributed by a reflection cell in coordinate `i`. -/ +def cubeFaceReflectionCellFoldSign {d : ℕ} + (choice : Fin d → Fin 3) (i : Fin d) : ℝ := + if choice i = 1 then 1 else -1 + +@[simp] theorem cubeFaceReflectionCellFoldSign_mul_self {d : ℕ} + (choice : Fin d → Fin 3) (i : Fin d) : + cubeFaceReflectionCellFoldSign choice i * + cubeFaceReflectionCellFoldSign choice i = 1 := by + by_cases h : choice i = 1 <;> + simp [cubeFaceReflectionCellFoldSign, h] + +/-- Signed pullback of a parent scalar test to the original cube, for the +weak-gradient identity in coordinate `i`. -/ +def cubeFaceReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) : Vec d → ℝ := + fun y => + ∑ choice : Fin d → Fin 3, + cubeFaceReflectionCellFoldSign choice i * + φ (cubeFaceReflectionCellFoldMap Q choice y) + +/-- Involution on reflection-cell choices pairing the lower neighbor strip +with the original strip in coordinate `i`. The upper strip is fixed. -/ +def cubeFaceReflectionLowerChoiceSwap {d : ℕ} + (i : Fin d) (choice : Fin d → Fin 3) : Fin d → Fin 3 := + Function.update choice i + (if choice i = 0 then 1 else if choice i = 1 then 0 else choice i) + +/-- Involution on reflection-cell choices pairing the original strip with the +upper neighbor strip in coordinate `i`. The lower strip is fixed. -/ +def cubeFaceReflectionUpperChoiceSwap {d : ℕ} + (i : Fin d) (choice : Fin d → Fin 3) : Fin d → Fin 3 := + Function.update choice i + (if choice i = 1 then 2 else if choice i = 2 then 1 else choice i) + +@[simp] theorem cubeFaceReflectionLowerChoiceSwap_apply_self {d : ℕ} + (i : Fin d) (choice : Fin d → Fin 3) : + cubeFaceReflectionLowerChoiceSwap i choice i = + if choice i = 0 then 1 else if choice i = 1 then 0 else choice i := by + simp [cubeFaceReflectionLowerChoiceSwap] + +@[simp] theorem cubeFaceReflectionUpperChoiceSwap_apply_self {d : ℕ} + (i : Fin d) (choice : Fin d → Fin 3) : + cubeFaceReflectionUpperChoiceSwap i choice i = + if choice i = 1 then 2 else if choice i = 2 then 1 else choice i := by + simp [cubeFaceReflectionUpperChoiceSwap] + +@[simp] theorem cubeFaceReflectionLowerChoiceSwap_apply_ne {d : ℕ} + {i j : Fin d} (hji : j ≠ i) (choice : Fin d → Fin 3) : + cubeFaceReflectionLowerChoiceSwap i choice j = choice j := by + simp [cubeFaceReflectionLowerChoiceSwap, Function.update_of_ne hji] + +@[simp] theorem cubeFaceReflectionUpperChoiceSwap_apply_ne {d : ℕ} + {i j : Fin d} (hji : j ≠ i) (choice : Fin d → Fin 3) : + cubeFaceReflectionUpperChoiceSwap i choice j = choice j := by + simp [cubeFaceReflectionUpperChoiceSwap, Function.update_of_ne hji] + +@[simp] theorem cubeFaceReflectionLowerChoiceSwap_involutive {d : ℕ} + (i : Fin d) : + Function.Involutive (cubeFaceReflectionLowerChoiceSwap (d := d) i) := by + intro choice + ext j + by_cases hji : j = i + · subst j + by_cases h0 : choice i = 0 + · simp [cubeFaceReflectionLowerChoiceSwap, h0] + · by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionLowerChoiceSwap, h1] + · simp [cubeFaceReflectionLowerChoiceSwap, h0, h1] + · simp [hji] + +@[simp] theorem cubeFaceReflectionUpperChoiceSwap_involutive {d : ℕ} + (i : Fin d) : + Function.Involutive (cubeFaceReflectionUpperChoiceSwap (d := d) i) := by + intro choice + ext j + by_cases hji : j = i + · subst j + by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionUpperChoiceSwap, h1] + · by_cases h2 : choice i = 2 + · simp [cubeFaceReflectionUpperChoiceSwap, h2] + · simp [cubeFaceReflectionUpperChoiceSwap, h1, h2] + · simp [hji] + +/-- On the lower `i`-face, the lower/original paired cell fold maps agree. -/ +theorem cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (choice : Fin d → Fin 3) (x : Vec d) : + cubeFaceReflectionCellFoldMap Q (cubeFaceReflectionLowerChoiceSwap i choice) + (cubeLowerFaceProjection Q i x) = + cubeFaceReflectionCellFoldMap Q choice (cubeLowerFaceProjection Q i x) := by + ext j + by_cases hji : j = i + · subst j + by_cases h0 : choice i = 0 + · simp [cubeFaceReflectionCellFoldMap, cubeLowerFaceProjection, h0] + ring + · by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionCellFoldMap, cubeLowerFaceProjection, h1] + ring + · simp [cubeFaceReflectionCellFoldMap, cubeLowerFaceProjection, h0, h1] + · simp [cubeFaceReflectionCellFoldMap, cubeLowerFaceProjection, hji] + +/-- On the upper `i`-face, the original/upper paired cell fold maps agree. -/ +theorem cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection + {d : ℕ} (Q : TriadicCube d) (i : Fin d) + (choice : Fin d → Fin 3) (x : Vec d) : + cubeFaceReflectionCellFoldMap Q (cubeFaceReflectionUpperChoiceSwap i choice) + (cubeUpperFaceProjection Q i x) = + cubeFaceReflectionCellFoldMap Q choice (cubeUpperFaceProjection Q i x) := by + ext j + by_cases hji : j = i + · subst j + by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionCellFoldMap, cubeUpperFaceProjection, h1] + ring + · by_cases h2 : choice i = 2 + · simp [cubeFaceReflectionCellFoldMap, cubeUpperFaceProjection, h2] + ring + · simp [cubeFaceReflectionCellFoldMap, cubeUpperFaceProjection, h1, h2] + · simp [cubeFaceReflectionCellFoldMap, cubeUpperFaceProjection, hji] + +/-- Lower-face cancellation for the signed folded parent test, assuming the +unpaired upper-strip outer cell evaluates to zero. -/ +theorem cubeFaceReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_of_outer + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (houter : ∀ choice : Fin d → Fin 3, ∀ x : Vec d, + choice i ≠ 0 → choice i ≠ 1 → + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeLowerFaceProjection Q i x)) = 0) : + ∀ x : Vec d, + cubeFaceReflectionFoldedParentScalarTest Q i φ + (cubeLowerFaceProjection Q i x) = 0 := by + classical + intro x + unfold cubeFaceReflectionFoldedParentScalarTest + let f : (Fin d → Fin 3) → ℝ := fun choice => + cubeFaceReflectionCellFoldSign choice i * + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeLowerFaceProjection Q i x)) + simpa [f] using + (Finset.sum_ninvolution (s := Finset.univ) (f := f) + (cubeFaceReflectionLowerChoiceSwap i) + (by + intro choice + by_cases h0 : choice i = 0 + · simp [f, cubeFaceReflectionCellFoldSign, h0, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection Q i choice x] + · by_cases h1 : choice i = 1 + · simp [f, cubeFaceReflectionCellFoldSign, h1, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection Q i choice x] + · have hzero := houter choice x h0 h1 + simp [f, hzero, + cubeFaceReflectionCellFoldMap_lowerChoiceSwap_lowerFaceProjection Q i choice x]) + (by + intro choice hf hfix + by_cases h0 : choice i = 0 + · have hi := congrFun hfix i + simp [cubeFaceReflectionLowerChoiceSwap, h0] at hi + · by_cases h1 : choice i = 1 + · have hi := congrFun hfix i + simp [cubeFaceReflectionLowerChoiceSwap, h1] at hi + · have hzero := houter choice x h0 h1 + simp [f, hzero] at hf) + (by intro choice; simp) + (cubeFaceReflectionLowerChoiceSwap_involutive i)) + +/-- Upper-face cancellation for the signed folded parent test, assuming the +unpaired lower-strip outer cell evaluates to zero. -/ +theorem cubeFaceReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_of_outer + {d : ℕ} (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (houter : ∀ choice : Fin d → Fin 3, ∀ x : Vec d, + choice i ≠ 1 → choice i ≠ 2 → + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeUpperFaceProjection Q i x)) = 0) : + ∀ x : Vec d, + cubeFaceReflectionFoldedParentScalarTest Q i φ + (cubeUpperFaceProjection Q i x) = 0 := by + classical + intro x + unfold cubeFaceReflectionFoldedParentScalarTest + let f : (Fin d → Fin 3) → ℝ := fun choice => + cubeFaceReflectionCellFoldSign choice i * + φ (cubeFaceReflectionCellFoldMap Q choice + (cubeUpperFaceProjection Q i x)) + simpa [f] using + (Finset.sum_ninvolution (s := Finset.univ) (f := f) + (cubeFaceReflectionUpperChoiceSwap i) + (by + intro choice + by_cases h1 : choice i = 1 + · simp [f, cubeFaceReflectionCellFoldSign, h1, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection Q i choice x] + · by_cases h2 : choice i = 2 + · simp [f, cubeFaceReflectionCellFoldSign, h2, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection Q i choice x] + · have hzero := houter choice x h1 h2 + simp [f, hzero, + cubeFaceReflectionCellFoldMap_upperChoiceSwap_upperFaceProjection Q i choice x]) + (by + intro choice hf hfix + by_cases h1 : choice i = 1 + · have hi := congrFun hfix i + simp [cubeFaceReflectionUpperChoiceSwap, h1] at hi + · by_cases h2 : choice i = 2 + · have hi := congrFun hfix i + simp [cubeFaceReflectionUpperChoiceSwap, h2] at hi + · have hzero := houter choice x h1 h2 + simp [f, hzero] at hf) + (by intro choice; simp) + (cubeFaceReflectionUpperChoiceSwap_involutive i)) + +private theorem fin_three_eq_zero_of_ne_one_ne_two + (a : Fin 3) (h1 : a ≠ 1) (h2 : a ≠ 2) : a = 0 := by + revert a + decide + +private theorem eq_zero_of_tsupport_subset_of_notMem + {d : ℕ} {U : Set (Vec d)} {φ : Vec d → ℝ} {x : Vec d} + (hφ_sub : tsupport φ ⊆ U) (hx : x ∉ U) : + φ x = 0 := + image_eq_zero_of_notMem_tsupport fun hxt => hx (hφ_sub hxt) + +/-- On the lower original face, the unpaired upper reflection cell lands on +the upper outer face of the parent centered cube. -/ +theorem cubeFaceReflectionCellFoldMap_lowerFaceProjection_notMem_openCubeSet_succ_originCube + {d : ℕ} (m : ℤ) (i : Fin d) (choice : Fin d → Fin 3) (x : Vec d) + (h0 : choice i ≠ 0) (h1 : choice i ≠ 1) : + cubeFaceReflectionCellFoldMap (originCube d m) choice + (cubeLowerFaceProjection (originCube d m) i x) ∉ + openCubeSet (originCube d (m + 1)) := by + intro hmem + have hi := (mem_openCubeSet_originCube_iff.mp hmem) i + have hcoord : + cubeFaceReflectionCellFoldMap (originCube d m) choice + (cubeLowerFaceProjection (originCube d m) i x) i = + (1 / 2 : ℝ) * (3 : ℝ) ^ (m + 1) := by + simp [cubeFaceReflectionCellFoldMap, cubeLowerFaceProjection, + cubeLowerFaceCoord, cubeUpperFaceCoord, originCube, cubeScaleFactor, + h0, h1, zpow_add₀, show (3 : ℝ) ≠ 0 by norm_num] + ring + have hlt : + (1 / 2 : ℝ) * (3 : ℝ) ^ (m + 1) < + (1 / 2 : ℝ) * (3 : ℝ) ^ (m + 1) := by + simpa [hcoord] using hi.2 + exact (lt_irrefl _ hlt) + +/-- On the upper original face, the unpaired lower reflection cell lands on +the lower outer face of the parent centered cube. -/ +theorem cubeFaceReflectionCellFoldMap_upperFaceProjection_notMem_openCubeSet_succ_originCube + {d : ℕ} (m : ℤ) (i : Fin d) (choice : Fin d → Fin 3) (x : Vec d) + (h1 : choice i ≠ 1) (h2 : choice i ≠ 2) : + cubeFaceReflectionCellFoldMap (originCube d m) choice + (cubeUpperFaceProjection (originCube d m) i x) ∉ + openCubeSet (originCube d (m + 1)) := by + intro hmem + have hi := (mem_openCubeSet_originCube_iff.mp hmem) i + have h0 : choice i = 0 := fin_three_eq_zero_of_ne_one_ne_two (choice i) h1 h2 + have hcoord : + cubeFaceReflectionCellFoldMap (originCube d m) choice + (cubeUpperFaceProjection (originCube d m) i x) i = + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ (m + 1) := by + simp [cubeFaceReflectionCellFoldMap, cubeUpperFaceProjection, + cubeLowerFaceCoord, cubeUpperFaceCoord, originCube, cubeScaleFactor, + h0, zpow_add₀, show (3 : ℝ) ≠ 0 by norm_num] + ring + have hlt : + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ (m + 1) < + (-(1 / 2 : ℝ)) * (3 : ℝ) ^ (m + 1) := by + simpa [hcoord] using hi.1 + exact (lt_irrefl _ hlt) + +/-- Origin-cube lower-face cancellation for parent tests supported in the next +larger centered cube. -/ +theorem cubeFaceReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_originCube + {d : ℕ} (m : ℤ) (i : Fin d) {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∀ x : Vec d, + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ + (cubeLowerFaceProjection (originCube d m) i x) = 0 := by + refine + cubeFaceReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_of_outer + (originCube d m) i ?_ + intro choice x h0 h1 + exact eq_zero_of_tsupport_subset_of_notMem hφ_sub + (cubeFaceReflectionCellFoldMap_lowerFaceProjection_notMem_openCubeSet_succ_originCube + m i choice x h0 h1) + +/-- Origin-cube upper-face cancellation for parent tests supported in the next +larger centered cube. -/ +theorem cubeFaceReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_originCube + {d : ℕ} (m : ℤ) (i : Fin d) {φ : Vec d → ℝ} + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∀ x : Vec d, + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ + (cubeUpperFaceProjection (originCube d m) i x) = 0 := by + refine + cubeFaceReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_of_outer + (originCube d m) i ?_ + intro choice x h1 h2 + exact eq_zero_of_tsupport_subset_of_notMem hφ_sub + (cubeFaceReflectionCellFoldMap_upperFaceProjection_notMem_openCubeSet_succ_originCube + m i choice x h1 h2) + +private theorem hasCompactSupport_finset_sum + {α β ι : Type*} [TopologicalSpace α] [AddCommMonoid β] [DecidableEq ι] + (s : Finset ι) (f : ι → α → β) + (hf : ∀ i ∈ s, HasCompactSupport (f i)) : + HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + classical + revert hf + refine Finset.induction_on s ?zero ?insert + · intro _hf + simpa using! (HasCompactSupport.zero : HasCompactSupport (fun _ : α => (0 : β))) + · intro a s has hs hf + have ha : HasCompactSupport (f a) := hf a (by simp [has]) + have hs' : HasCompactSupport (fun x => ∑ i ∈ s, f i x) := by + exact hs (fun i hi => hf i (Finset.mem_insert_of_mem hi)) + simpa [Finset.sum_insert has] using! ha.add hs' + +/-- The signed folded parent test is smooth when the parent test is smooth. -/ +theorem contDiff_cubeFaceReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ContDiff ℝ (⊤ : ℕ∞) + (cubeFaceReflectionFoldedParentScalarTest Q i φ) := by + classical + unfold cubeFaceReflectionFoldedParentScalarTest + exact + ContDiff.sum fun choice _ => + contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ) + +/-- Coordinate derivative of the signed folded parent test. The prefactor +sign cancels the chain-rule reflection sign. -/ +theorem euclideanCoordDeriv_cubeFaceReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + euclideanCoordDeriv i + (cubeFaceReflectionFoldedParentScalarTest Q i φ) x = + ∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap Q choice x) := by + classical + unfold cubeFaceReflectionFoldedParentScalarTest euclideanCoordDeriv + rw [fderiv_fun_sum] + · simp only [sum_apply] + apply Finset.sum_congr rfl + intro choice _hchoice + have hdiff : + DifferentiableAt ℝ + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x := + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ).differentiable + (by simp) x + rw [fderiv_const_mul hdiff] + change cubeFaceReflectionCellFoldSign choice i * + euclideanCoordDeriv i + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x = + euclideanCoordDeriv i φ (cubeFaceReflectionCellFoldMap Q choice x) + rw [euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap hφ Q choice i x] + by_cases h1 : choice i = 1 <;> + simp [cubeFaceReflectionCellFoldSign, h1] + · intro choice _hchoice + exact + (contDiff_const.mul + (contDiff_comp_cubeFaceReflectionCellFoldMap Q choice hφ)).differentiable + (by simp) x + +/-- The signed folded parent test has compact support when the parent test +has compact support. -/ +theorem hasCompactSupport_cubeFaceReflectionFoldedParentScalarTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : HasCompactSupport φ) : + HasCompactSupport (cubeFaceReflectionFoldedParentScalarTest Q i φ) := by + classical + unfold cubeFaceReflectionFoldedParentScalarTest + simpa using + hasCompactSupport_finset_sum (Finset.univ : Finset (Fin d → Fin 3)) + (fun choice y => + cubeFaceReflectionCellFoldSign choice i * + φ (cubeFaceReflectionCellFoldMap Q choice y)) + (by + intro choice _hchoice + exact + (hasCompactSupport_comp_cubeFaceReflectionCellFoldMap Q choice hφ).mul_left) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestWeakIdentity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestWeakIdentity.lean new file mode 100644 index 0000000000..c7aadc06e2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionParentTestWeakIdentity.lean @@ -0,0 +1,199 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionParentTestFold +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.WeakDerivativeTestClosure + +/-! # Reflection Parent Test Weak Identity -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +/-! +# Weak derivative identity for folded parent tests + +The signed folded parent test is generally not compactly supported inside the +original open cube, but it vanishes on the two relevant coordinate faces. This +file packages the face-zero cutoff closure needed to use it in the original +cube weak-gradient identity. +-/ + +private theorem memScalarL2_of_contDiff_hasCompactSupport {d : ℕ} + (U : Set (Vec d)) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (hψ.continuous.memLp_of_hasCompactSupport hψ_compact).restrict U + +private theorem memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + {d : ℕ} (U : Set (Vec d)) (i : Fin d) {ψ : Vec d → ℝ} + (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) (hψ_compact : HasCompactSupport ψ) : + MemScalarL2 U (euclideanCoordDeriv i ψ) := by + simpa [MemScalarL2, volumeMeasureOn] using + ((contDiff_euclideanCoordDeriv hψ i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hψ_compact i)).restrict U + +/-- The original-cube weak derivative identity may be tested against the +signed folded parent test. -/ +theorem H1Function.integral_mul_deriv_foldedParentScalarTest_eq_neg_integral_mul_originCube + {d : ℕ} (m : ℤ) (u : H1Function (openCubeSet (originCube d m))) + (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ y in openCubeSet (originCube d m), + u y * + euclideanCoordDeriv i + (cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ) y + ∂MeasureTheory.volume = + -∫ y in openCubeSet (originCube d m), + u.grad y i * + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ y + ∂MeasureTheory.volume := by + classical + let Q : TriadicCube d := originCube d m + let ψ : Vec d → ℝ := cubeFaceReflectionFoldedParentScalarTest Q i φ + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, Q] using + contDiff_cubeFaceReflectionFoldedParentScalarTest (originCube d m) i hφ + have hψ_compact : HasCompactSupport ψ := by + simpa [ψ, Q] using + hasCompactSupport_cubeFaceReflectionFoldedParentScalarTest (originCube d m) i hφ_compact + have hψ_mem : MemScalarL2 (openCubeSet Q) ψ := + memScalarL2_of_contDiff_hasCompactSupport (openCubeSet Q) hψ_smooth hψ_compact + have hDψ_mem : + MemScalarL2 (openCubeSet Q) (euclideanCoordDeriv i ψ) := + memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + (openCubeSet Q) i hψ_smooth hψ_compact + have hlower_zero : ∀ x : Vec d, ψ (cubeLowerFaceProjection Q i x) = 0 := by + simpa [ψ, Q] using + cubeFaceReflectionFoldedParentScalarTest_lowerFaceProjection_eq_zero_originCube + (m := m) i hφ_sub + have hupper_zero : ∀ x : Vec d, ψ (cubeUpperFaceProjection Q i x) = 0 := by + simpa [ψ, Q] using + cubeFaceReflectionFoldedParentScalarTest_upperFaceProjection_eq_zero_originCube + (m := m) i hφ_sub + let L : ℝ := Classical.choose + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ_smooth hψ_compact) + have hL : 0 ≤ L := + (Classical.choose_spec + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ_smooth hψ_compact)).1 + have hbound : ∀ x : Vec d, ‖fderiv ℝ ψ x‖ ≤ L := + (Classical.choose_spec + (exists_bound_fderiv_of_contDiff_hasCompactSupport hψ_smooth hψ_compact)).2 + let ψn : ℕ → Vec d → ℝ := fun n x => faceCutoff Q n x * ψ x + have hψn_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψn n) := by + intro n + simpa [ψn] using (faceCutoff Q n).smooth.mul hψ_smooth + have hψn_compact : ∀ n, HasCompactSupport (ψn n) := by + intro n + simpa [ψn] using! ((faceCutoff Q n).hasCompactSupport.mul_right : + HasCompactSupport (fun x : Vec d => faceCutoff Q n x * ψ x)) + have hψn_sub : ∀ n, tsupport (ψn n) ⊆ openCubeSet Q := by + intro n + exact (tsupport_mul_subset_left + (f := (faceCutoff Q n : Vec d → ℝ)) (g := ψ)).trans + ((faceCutoff Q n).tsupport_subset_openCubeSet_of_nonneg_of_lt_one + (faceCutoffOuterRadius_nonneg n) (faceCutoffOuterRadius_lt_one n)) + have hψn_mem : ∀ n, MemScalarL2 (openCubeSet Q) (ψn n) := by + intro n + exact memScalarL2_of_contDiff_hasCompactSupport + (openCubeSet Q) (hψn_smooth n) (hψn_compact n) + have hDψn_mem : + ∀ n, MemScalarL2 (openCubeSet Q) + (fun x => euclideanCoordDeriv i (ψn n) x) := by + intro n + exact memScalarL2_euclideanCoordDeriv_of_contDiff_hasCompactSupport + (openCubeSet Q) i (hψn_smooth n) (hψn_compact n) + have hψn_to_ψ : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => ψn n x - ψ x) 2 + (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + have htail : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => ψ x - faceCutoff Q n x * ψ x) 2 + (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := + QuantitativeCubeCutoff.tendsto_eLpNorm_sub_mul_of_tendsto_inner + (Q := Q) (g := ψ) + (ρ₁ := faceCutoffInnerRadius) (ρ₂ := faceCutoffOuterRadius) + (η := fun n => faceCutoff Q n) + tendsto_faceCutoffInnerRadius_one hψ_mem + refine htail.congr' ?_ + filter_upwards with n + have hfun : + (fun x : Vec d => ψn n x - ψ x) = + -(fun x : Vec d => ψ x - faceCutoff Q n x * ψ x) := by + funext x + simp [ψn] + rw [hfun, MeasureTheory.eLpNorm_neg] + have hDψn_to_Dψ : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => euclideanCoordDeriv i (ψn n) x - euclideanCoordDeriv i ψ x) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0) := by + simpa [ψn] using + tendsto_eLpNorm_euclideanCoordDeriv_faceCutoff_mul_sub_of_face_zero + Q i ψ hL hψ_smooth hψ_compact hbound hlower_zero hupper_zero + have hweak : + ∫ y in openCubeSet Q, u y * euclideanCoordDeriv i ψ y + ∂MeasureTheory.volume = + -∫ y in openCubeSet Q, u.grad y i * ψ y ∂MeasureTheory.volume := + HasWeakPartialDerivOn.integral_mul_deriv_eq_neg_integral_mul_of_eLpNorm_approx + (U := openCubeSet Q) (i := i) (u := u) (gi := fun y => u.grad y i) + (ψ := ψ) (Dψ := euclideanCoordDeriv i ψ) + (u.hasWeakGradient i) u.memL2 (u.gradMemL2 i) + hψ_mem hDψ_mem ψn hψn_smooth hψn_compact hψn_sub + hψn_mem hDψn_mem hψn_to_ψ hDψn_to_Dψ + simpa [Q, ψ] using hweak + +/-- The same weak identity with the folded-test derivative expanded into the +cellwise parent derivative sum. -/ +theorem H1Function.integral_mul_foldedParentScalarTest_derivSum_eq_neg_integral_mul_originCube + {d : ℕ} (m : ℤ) (u : H1Function (openCubeSet (originCube d m))) + (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) + (hφ_sub : tsupport φ ⊆ openCubeSet (originCube d (m + 1))) : + ∫ y in openCubeSet (originCube d m), + u y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) + ∂MeasureTheory.volume = + -∫ y in openCubeSet (originCube d m), + u.grad y i * + cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ y + ∂MeasureTheory.volume := by + have hbase := + u.integral_mul_deriv_foldedParentScalarTest_eq_neg_integral_mul_originCube + m i hφ hφ_compact hφ_sub + convert hbase using 1 + refine MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet (originCube d m)) ?_ + intro y _hy + change u y * + (∑ choice : Fin d → Fin 3, + euclideanCoordDeriv i φ + (cubeFaceReflectionCellFoldMap (originCube d m) choice y)) = + u y * + euclideanCoordDeriv i + (cubeFaceReflectionFoldedParentScalarTest (originCube d m) i φ) y + rw [← euclideanCoordDeriv_cubeFaceReflectionFoldedParentScalarTest + (Q := originCube d m) (i := i) (φ := φ) hφ y] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionWeakEquation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionWeakEquation.lean new file mode 100644 index 0000000000..c843b4f4ac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ReflectionWeakEquation.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.ReflectionGeometry + +/-! # Reflection Weak Equation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {m : ℤ} {F : Vec d → ℝ} + +/-- The centered all-face reflection weak equation may be read on the next +larger centered cube at the level of set integrals. This avoids the false +shortcut of claiming an `H¹` parent-domain object before proving the weak +gradient gluing across the internal faces. -/ +theorem cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnParent_originCube + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφs : HasCompactSupport φ) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + ∫ x in openCubeSet (originCube d (m + 1)), + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d (m + 1)), + cubeCoordinateFoldReflectedScalar (originCube d m) F x * φ x + ∂MeasureTheory.volume := by + rw [ + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + vecDot + (cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y) x) + (euclideanGradient φ x)), + setIntegral_openCubeSet_succ_originCube_eq_cubeFaceReflectionBlockSet + (m := m) + (f := fun x => + cubeCoordinateFoldReflectedScalar (originCube d m) F x * φ x)] + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnBlock_of_compactSupport_of_memLp_normalizedCubeMeasure + hφ hφs hmean hF + +/-- If the reflected vector field has already been realized as the weak +gradient of an `H¹` function on the centered parent cube, the parent integral +identity becomes the standard `WeakPoissonEquationOn` interface. This theorem +isolates the remaining gluing task to constructing that `H1Function`. -/ +theorem cubeFaceReflectionParent_weakPoissonEquationOn_originCube_of_grad_eq + (W : MeanZeroNeumannPoissonSolution (originCube d m) F) + (uP : H1Function (openCubeSet (originCube d (m + 1)))) + (huP_grad : + uP.grad = + cubeCoordinateFoldReflectedVectorField (originCube d m) + (fun y => W.w.toH1Function.grad y)) + (hmean : cubeAverage (originCube d m) F = 0) + (hF : + MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m))) : + WeakPoissonEquationOn (openCubeSet (originCube d (m + 1))) uP + (cubeCoordinateFoldReflectedScalar (originCube d m) F) := by + intro φ hφ hφs _hφ_sub + rw [huP_grad] + exact + W.cubeFaceReflectionBlock_reflectedVectorField_weakEquationOnParent_originCube + hφ hφs hmean hF + +end MeanZeroNeumannPoissonSolution + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCoerciveDepth.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCoerciveDepth.lean new file mode 100644 index 0000000000..37034274ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCoerciveDepth.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianRestrictionSum + +/-! # Scaled Coercive Depth -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +/-! +# Scale-correct coercivity constants for C.2 depth estimates + +This file plugs the dilation-scaled cube Poincare estimate into the +scale-sharp Hessian-to-Besov depth handoff. The main point is that all +depth-`j` descendants of a triadic cube have the same scale, so the prefactor +`volume(R)^{-1/2} * PoincareConstant(R)` is uniform over descendants. +-/ + +private theorem cubeScaleFactor_pos {d : ℕ} (Q : TriadicCube d) : + 0 < cubeScaleFactor Q := by + rw [cubeScaleFactor] + positivity + +private theorem cubeScaleFactor_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeScaleFactor Q := + le_of_lt (cubeScaleFactor_pos Q) + +/-- The scaled mean-zero coercivity estimate on every depth-`j` descendant. -/ +noncomputable def scaledDescendantMeanZeroH1CoerciveEstimate {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + ∀ R ∈ descendantsAtDepth Q j, H1CoerciveEstimate (openCubeSet R) := + fun R _hR => scaledTranslatedCubeMeanZeroH1CoerciveEstimate R + +/-- Uniform depth constant for the scale-sharp C.2 Poincare prefactor. -/ +noncomputable def scaledDescendantCoercivePrefactor {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : ℝ := + ((cubeVolume (originCube d (Q.scale - j)))⁻¹) ^ (1 / 2 : ℝ) * + (cubeScaleFactor (originCube d (Q.scale - j)) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) + +theorem scaledDescendantCoercivePrefactor_nonneg {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + 0 ≤ scaledDescendantCoercivePrefactor Q j := by + unfold scaledDescendantCoercivePrefactor + have hvolInv : + 0 ≤ (cubeVolume (originCube d (Q.scale - j)))⁻¹ := + inv_nonneg.mpr (cubeVolume_nonneg _) + exact mul_nonneg + (Real.rpow_nonneg hvolInv _) + (mul_nonneg (cubeScaleFactor_nonneg _) + (originCubeMeanZeroH1CoerciveEstimate d 0).constant_nonneg) + +theorem scaledDescendantCoercivePrefactor_eq {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * + (scaledDescendantMeanZeroH1CoerciveEstimate Q j R hR).fixedValue = + scaledDescendantCoercivePrefactor Q j := by + have hscale : R.scale = Q.scale - j := + scale_eq_sub_of_mem_descendantsAtDepth hR + have hfactor : + cubeScaleFactor R = cubeScaleFactor (originCube d (Q.scale - j)) := by + simp [cubeScaleFactor, originCube, hscale] + have hvol : + cubeVolume R = cubeVolume (originCube d (Q.scale - j)) := by + simp [cubeVolume_eq_scaleFactor_pow, hfactor] + unfold scaledDescendantMeanZeroH1CoerciveEstimate + scaledDescendantCoercivePrefactor + rw [scaledTranslatedCubeMeanZeroH1CoerciveEstimate_constant, hvol, hfactor] + +theorem scaledDescendantCoercivePrefactor_bound {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * + (scaledDescendantMeanZeroH1CoerciveEstimate Q j R hR).fixedValue ≤ + scaledDescendantCoercivePrefactor Q j := by + exact le_of_eq (scaledDescendantCoercivePrefactor_eq hR) + +theorem cubeBesovDepthWeight_mul_scaledDescendantCoercivePrefactor {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeBesovDepthWeight Q 1 j * scaledDescendantCoercivePrefactor Q j = + ((cubeVolume (originCube d (Q.scale - j)))⁻¹) ^ (1 / 2 : ℝ) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + let R0 : TriadicCube d := originCube d (Q.scale - j) + have hscale : + cubeScaleFactor Q / (3 : ℝ) ^ j = cubeScaleFactor R0 := by + dsimp [R0, cubeScaleFactor, originCube] + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + have hR0_pos : 0 < cubeScaleFactor R0 := cubeScaleFactor_pos R0 + unfold cubeBesovDepthWeight scaledDescendantCoercivePrefactor + dsimp [R0] at hscale hR0_pos ⊢ + rw [hscale] + rw [show -(1 : ℝ) = (-1 : ℝ) by norm_num] + rw [Real.rpow_neg_one] + field_simp [hR0_pos.ne'] + +private theorem cubeVolume_originCube_eq_of_mem_descendantsAtDepth {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) : + cubeVolume (originCube d (Q.scale - j)) = cubeVolume R := by + have hscale : R.scale = Q.scale - j := + scale_eq_sub_of_mem_descendantsAtDepth hR + have hfactor : + cubeScaleFactor R = cubeScaleFactor (originCube d (Q.scale - j)) := by + simp [cubeScaleFactor, originCube, hscale] + simp [cubeVolume_eq_scaleFactor_pow, hfactor] + +private theorem descendant_card_volume_rpow_half_mul_cardInv_sq_rpow_half {d : ℕ} + {Q R : TriadicCube d} {j : ℕ} (hR : R ∈ descendantsAtDepth Q j) + {A : ℝ} (hA : 0 ≤ A) : + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ)) = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * A := by + let c : ℝ := ((descendantsAtDepth Q j).card : ℝ) + let v : ℝ := cubeVolume R + have hcard_ne : c ≠ 0 := by + dsimp [c] + exact_mod_cast Finset.card_ne_zero.mpr (descendantsAtDepth_nonempty Q j) + have hcard_nonneg : 0 ≤ c := by + dsimp [c] + positivity + have hv_pos : 0 < v := by + dsimp [v] + exact cubeVolume_pos R + have hv_nonneg : 0 ≤ v := le_of_lt hv_pos + have hv_ne : v ≠ 0 := hv_pos.ne' + have hQvol : cubeVolume Q = c * v := by + dsimp [c, v] + exact cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth hR + have hQ_pos : 0 < cubeVolume Q := cubeVolume_pos Q + have hinside_nonneg : 0 ≤ c⁻¹ * A ^ 2 := by + exact mul_nonneg (inv_nonneg.mpr hcard_nonneg) (sq_nonneg A) + have hmul : + v⁻¹ * (c⁻¹ * A ^ 2) = (cubeVolume Q)⁻¹ * A ^ 2 := by + rw [hQvol] + field_simp [hcard_ne, hv_ne] + have hroot_sq : (A ^ 2) ^ (1 / 2 : ℝ) = A := by + rw [← Real.sqrt_eq_rpow, Real.sqrt_sq hA] + calc + ((cubeVolume R)⁻¹) ^ (1 / 2 : ℝ) * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ)) + = (v⁻¹) ^ (1 / 2 : ℝ) * ((c⁻¹ * A ^ 2) ^ (1 / 2 : ℝ)) := by + simp [c, v] + _ = (v⁻¹ * (c⁻¹ * A ^ 2)) ^ (1 / 2 : ℝ) := by + rw [Real.mul_rpow (inv_nonneg.mpr hv_nonneg) hinside_nonneg] + _ = ((cubeVolume Q)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ) := by + rw [hmul] + _ = ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * ((A ^ 2) ^ (1 / 2 : ℝ)) := by + rw [Real.mul_rpow (inv_nonneg.mpr (le_of_lt hQ_pos)) (sq_nonneg A)] + _ = ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * A := by + rw [hroot_sq] + +theorem scaledDepthPrefactor_mul_cardInvHessianRoot_eq_parentVolume {d : ℕ} + (Q : TriadicCube d) (j : ℕ) {A : ℝ} (hA : 0 ≤ A) : + cubeBesovDepthWeight Q 1 j * + (scaledDescendantCoercivePrefactor Q j * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ))) = + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * A := by + rcases descendantsAtDepth_nonempty Q j with ⟨R, hR⟩ + have hvol : + cubeVolume (originCube d (Q.scale - j)) = cubeVolume R := + cubeVolume_originCube_eq_of_mem_descendantsAtDepth hR + have hroot : + ((cubeVolume (originCube d (Q.scale - j)))⁻¹) ^ (1 / 2 : ℝ) * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ)) = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * A := by + rw [hvol] + exact descendant_card_volume_rpow_half_mul_cardInv_sq_rpow_half hR hA + let C0 : ℝ := (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue + let V0 : ℝ := ((cubeVolume (originCube d (Q.scale - j)))⁻¹) ^ (1 / 2 : ℝ) + let root : ℝ := + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * A ^ 2) ^ (1 / 2 : ℝ)) + have hweight : + cubeBesovDepthWeight Q 1 j * scaledDescendantCoercivePrefactor Q j = V0 * C0 := by + simpa [V0, C0] using cubeBesovDepthWeight_mul_scaledDescendantCoercivePrefactor Q j + have hroot' : V0 * root = ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * A := by + simpa [V0, root] using hroot + calc + cubeBesovDepthWeight Q 1 j * + (scaledDescendantCoercivePrefactor Q j * root) + = (cubeBesovDepthWeight Q 1 j * scaledDescendantCoercivePrefactor Q j) * root := by + ring + _ = (V0 * C0) * root := by + rw [hweight] + _ = C0 * (V0 * root) := by + ring + _ = C0 * (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * A) := by + rw [hroot'] + _ = (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * C0) * A := by + ring + +namespace HasWeakHessianOn + +variable {d : ℕ} {Q : TriadicCube d} {u : H1Function (openCubeSet Q)} + +/-- Scale-correct C.2 depth handoff with the descendant Poincare constants +discharged by dilation-scaled cube coercivity. -/ +theorem cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_scaledCoercivePrefactor + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + cubeBesovDepthWeight Q 1 j * + (scaledDescendantCoercivePrefactor Q j * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2) ^ (1 / 2 : ℝ))) := by + exact + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_const_mul_cardInvGlobal_hessianCoordL2NormSum + i j (scaledDescendantMeanZeroH1CoerciveEstimate Q j) + (scaledDescendantCoercivePrefactor_nonneg Q j) + (fun R hR => scaledDescendantCoercivePrefactor_bound hR) + +theorem cubeBesovDepthSeminorm_gradCoord_le_parentVolume_scaledCoercive + (H : HasWeakHessianOn (openCubeSet Q) u) (i : Fin d) (j : ℕ) : + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j ≤ + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + H.hessianCoordL2NormSum := by + calc + cubeBesovDepthSeminorm Q 1 (2 : ℝ≥0∞) (fun x => u.grad x i) j + ≤ cubeBesovDepthWeight Q 1 j * + (scaledDescendantCoercivePrefactor Q j * + ((((descendantsAtDepth Q j).card : ℝ)⁻¹ * + H.hessianCoordL2NormSum ^ 2) ^ (1 / 2 : ℝ))) := + H.cubeBesovDepthSeminorm_gradCoord_le_depthWeight_mul_scaledCoercivePrefactor i j + _ = (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue) * + H.hessianCoordL2NormSum := + scaledDepthPrefactor_mul_cardInvHessianRoot_eq_parentVolume Q j + H.hessianCoordL2NormSum_nonneg + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCubeGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCubeGeometry.lean new file mode 100644 index 0000000000..cb5b969feb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/ScaledCubeGeometry.lean @@ -0,0 +1,62 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.TestSubmodule + +/-! # Scaled Cube Geometry -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +/-- A closed concentric cube of smaller relative radius lies in the open +concentric cube of any strictly larger relative radius. -/ +theorem scaledClosedCubeSet_subset_scaledOpenCubeSet_of_lt {d : ℕ} + (Q : TriadicCube d) {ρ σ : ℝ} (hρσ : ρ < σ) : + scaledClosedCubeSet Q ρ ⊆ scaledOpenCubeSet Q σ := by + intro x hx i + calc + |x i - cubeCenter Q i| ≤ ρ * cubeRadius Q := hx i + _ < σ * cubeRadius Q := + mul_lt_mul_of_pos_right hρσ (cubeRadius_pos Q) + +/-- Positive scaled open cubes are metric balls for the sup metric on `Vec d`. -/ +theorem ball_cubeCenter_mul_cubeRadius_eq_scaledOpenCubeSet {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ : 0 < ρ) : + Metric.ball (cubeCenter Q) (ρ * cubeRadius Q) = + scaledOpenCubeSet Q ρ := by + have hrad : 0 < ρ * cubeRadius Q := mul_pos hρ (cubeRadius_pos Q) + rw [ball_pi (cubeCenter Q) hrad] + ext x + constructor + · intro hx i + have hi := hx i (by simp) + rw [Metric.mem_ball, Real.dist_eq] at hi + simpa [scaledOpenCubeSet, abs_sub_comm] using hi + · intro hx i _hi + rw [Metric.mem_ball, Real.dist_eq] + simpa [scaledOpenCubeSet, abs_sub_comm] using hx i + +/-- Positive scaled open cubes are admissible open bounded convex domains. -/ +theorem isOpenBoundedConvexDomain_scaledOpenCubeSet_of_pos {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ : 0 < ρ) : + IsOpenBoundedConvexDomain (scaledOpenCubeSet Q ρ) := by + have hball : + IsOpenBoundedConvexDomain + (Metric.ball (cubeCenter Q) (ρ * cubeRadius Q)) := + isOpenBoundedConvexDomain_ball (cubeCenter Q) + (mul_pos hρ (cubeRadius_pos Q)) + simpa [ball_cubeCenter_mul_cubeRadius_eq_scaledOpenCubeSet Q hρ] using hball + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothLimit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothLimit.lean new file mode 100644 index 0000000000..e5dd7f64d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothLimit.lean @@ -0,0 +1,445 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.LimitPairing + +/-! # Smooth Limit -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +/-- Pairing representatives in scalar `L²` agrees with the set integral of +the pointwise product. -/ +theorem inner_toScalarL2_eq_integral_mul + {d : ℕ} {U : Set (Vec d)} {F G : Vec d → ℝ} + (hF : MemScalarL2 U F) (hG : MemScalarL2 U G) : + inner ℝ (toScalarL2 hF) (toScalarL2 hG) = + ∫ x in U, F x * G x ∂MeasureTheory.volume := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toScalarL2 hF, coeFn_toScalarL2 hG] with x hFx hGx + rw [hFx, hGx] + +/-- A fixed `L²` factor defines a continuous functional against convergent +scalar `L²` representatives. -/ +theorem tendsto_integral_mul_of_tendsto_toScalarL2 + {d : ℕ} {U : Set (Vec d)} {ι : Type*} {l : Filter ι} + {u : Vec d → ℝ} {F : ι → Vec d → ℝ} {G : Vec d → ℝ} + (hu : MemScalarL2 U u) (hF : ∀ n, MemScalarL2 U (F n)) + (hG : MemScalarL2 U G) + (hconv : Filter.Tendsto (fun n => toScalarL2 (hF n)) l (nhds (toScalarL2 hG))) : + Filter.Tendsto + (fun n => ∫ x in U, u x * F n x ∂MeasureTheory.volume) l + (nhds (∫ x in U, u x * G x ∂MeasureTheory.volume)) := by + have hinner : + Filter.Tendsto + (fun n => inner ℝ (toScalarL2 hu) (toScalarL2 (hF n))) l + (nhds (inner ℝ (toScalarL2 hu) (toScalarL2 hG))) := + Filter.Tendsto.inner tendsto_const_nhds hconv + simpa [inner_toScalarL2_eq_integral_mul] using hinner + +/-- Raw `eLpNorm` convergence of representatives implies convergence of +their scalar `L²` classes. -/ +theorem tendsto_toScalarL2_of_tendsto_eLpNorm + {d : ℕ} {U : Set (Vec d)} {ι : Type*} {l : Filter ι} + {F : ι → Vec d → ℝ} {G : Vec d → ℝ} + (hF : ∀ n, MemScalarL2 U (F n)) (hG : MemScalarL2 U G) + (hlim : Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - G x) 2 (volumeMeasureOn U)) + l (nhds 0)) : + Filter.Tendsto (fun n => toScalarL2 (hF n)) l (nhds (toScalarL2 hG)) := by + have hlim_coe : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm + (fun x => (toScalarL2 (hF n) : Vec d → ℝ) x - G x) + 2 (volumeMeasureOn U)) + l (nhds 0) := by + have hEq : + (fun n => MeasureTheory.eLpNorm + (fun x => (toScalarL2 (hF n) : Vec d → ℝ) x - G x) + 2 (volumeMeasureOn U)) = + fun n => + MeasureTheory.eLpNorm (fun x => F n x - G x) 2 (volumeMeasureOn U) := by + funext n + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [coeFn_toScalarL2 (hF n)] with x hx + rw [hx] + rw [hEq] + exact hlim + simpa [toScalarL2] using + (MeasureTheory.Lp.tendsto_Lp_of_tendsto_eLpNorm + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (f := fun n => toScalarL2 (hF n)) (f_lim := G) (f_lim_ℒp := hG) + hlim_coe) + +/-- Convergence in scalar `L²` of explicit representatives implies raw +`eLpNorm` convergence of their pointwise differences. -/ +theorem tendsto_eLpNorm_of_tendsto_toScalarL2 + {d : ℕ} {U : Set (Vec d)} {ι : Type*} {l : Filter ι} + {F : ι → Vec d → ℝ} {G : Vec d → ℝ} + (hF : ∀ n, MemScalarL2 U (F n)) (hG : MemScalarL2 U G) + (hconv : + Filter.Tendsto (fun n => toScalarL2 (hF n)) l (nhds (toScalarL2 hG))) : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - G x) 2 (volumeMeasureOn U)) + l (nhds 0) := by + have hed : + Filter.Tendsto + (fun n => edist (toScalarL2 (hF n)) (toScalarL2 hG)) l (nhds 0) := + tendsto_iff_edist_tendsto_0.mp hconv + have hEq : + (fun n => MeasureTheory.eLpNorm (fun x => F n x - G x) 2 (volumeMeasureOn U)) = + fun n => edist (toScalarL2 (hF n)) (toScalarL2 hG) := by + funext n + exact (MeasureTheory.Lp.edist_toLp_toLp (F n) G (hF n) hG).symm + simpa [hEq] using hed + +/-- On a finite-measure set, an `O(|h_n|)` pointwise bound forces the `L²` +seminorm to vanish when `h_n -> 0`. -/ +theorem tendsto_eLpNorm_zero_of_ae_norm_le_mul_norm + {d : ℕ} {U : Set (Vec d)} {F : ℕ → Vec d → ℝ} + {stepSeq : ℕ → ℝ} {C : ℝ} + (hUfinite : (volumeMeasureOn U) Set.univ ≠ ⊤) + (hstep : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + (hbound : ∀ n, ∀ᵐ x ∂volumeMeasureOn U, ‖F n x‖ ≤ C * ‖stepSeq n‖) : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (F n) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + let A : ℝ≥0∞ := (volumeMeasureOn U) Set.univ ^ ((2 : ℝ≥0∞).toReal⁻¹) + have hA_ne_top : A ≠ ⊤ := by + dsimp [A] + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + exact hUfinite + have hreal : Filter.Tendsto (fun n => C * ‖stepSeq n‖) Filter.atTop (nhds 0) := by + simpa using hstep.norm.const_mul C + have hOf : + Filter.Tendsto (fun n => ENNReal.ofReal (C * ‖stepSeq n‖)) + Filter.atTop (nhds 0) := by + simpa using ENNReal.tendsto_ofReal hreal + have hupper : + Filter.Tendsto (fun n => A * ENNReal.ofReal (C * ‖stepSeq n‖)) + Filter.atTop (nhds 0) := by + simpa using + (ENNReal.Tendsto.mul tendsto_const_nhds (Or.inr ENNReal.zero_ne_top) hOf + (Or.inr hA_ne_top)) + refine Filter.Tendsto.squeeze tendsto_const_nhds hupper (fun n => ?_) (fun n => ?_) + · exact bot_le + · dsimp [A] + exact MeasureTheory.eLpNorm_le_of_ae_bound (μ := volumeMeasureOn U) + (p := (2 : ℝ≥0∞)) (hbound n) + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +private theorem support_h1WeakTest_deriv_subset + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + Function.support (fun x => φ.deriv j x) ⊆ U := by + intro x hx + exact φ.support_subset <| + (support_fderiv_subset (𝕜 := ℝ) (f := (φ : Vec d → ℝ))) <| by + change fderiv ℝ (φ : Vec d → ℝ) x ≠ 0 + intro hzero + apply hx + simp [H1WeakTestFunction.deriv, hzero] + +private theorem contDiff_h1WeakTest_deriv + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv, euclideanCoordDeriv] using! + contDiff_euclideanCoordDeriv φ.smooth j + +private theorem hasCompactSupport_h1WeakTest_deriv + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + HasCompactSupport (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv] using + φ.compactSupport.fderiv_apply (𝕜 := ℝ) (basisVec j) + +private theorem tsupport_h1WeakTest_deriv_subset + {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + tsupport (fun x => φ.deriv j x) ⊆ U := by + have hsub : + tsupport (euclideanCoordDeriv j (φ : Vec d → ℝ)) ⊆ + tsupport (φ : Vec d → ℝ) := + tsupport_euclideanCoordDeriv_subset_tsupport j (φ : Vec d → ℝ) + simpa [H1WeakTestFunction.deriv, euclideanCoordDeriv] using! + hsub.trans φ.support_subset + +/-- Smooth test derivatives have `L²` backward difference quotients on any +restricted ambient set. -/ +theorem memScalarL2_euclideanBackwardDifferenceQuotient_h1WeakTest_deriv + {S U : Set (Vec d)} {step : ℝ} + (φ : H1WeakTestFunction S) (i j : Fin d) : + MemScalarL2 U + (euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y)) := by + have hcont : + Continuous + (euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y)) := + (contDiff_euclideanBackwardDifferenceQuotient + (contDiff_h1WeakTest_deriv φ j) step i).continuous + have hcompact : + HasCompactSupport + (euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y)) := + hasCompactSupport_euclideanBackwardDifferenceQuotient + (hasCompactSupport_h1WeakTest_deriv φ j) step i + simpa [MemScalarL2, volumeMeasureOn] using + (hcont.memLp_of_hasCompactSupport hcompact).restrict U + +/-- The classical second derivative of a smooth weak test is scalar `L²` on +any restricted ambient set. -/ +theorem memScalarL2_fderiv_h1WeakTest_deriv_apply + {S U : Set (Vec d)} + (φ : H1WeakTestFunction S) (i j : Fin d) : + MemScalarL2 U + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) := by + have hcont : + Continuous + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) := + ((contDiff_h1WeakTest_deriv φ j).continuous_fderiv (by simp)).clm_apply + continuous_const + have hcompact : + HasCompactSupport + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) := + (hasCompactSupport_h1WeakTest_deriv φ j).fderiv_apply (𝕜 := ℝ) (basisVec i) + simpa [MemScalarL2, volumeMeasureOn] using + (hcont.memLp_of_hasCompactSupport hcompact).restrict U + +private theorem support_backwardDifferenceQuotient_h1WeakTest_deriv_subset + {S U V : Set (Vec d)} {step : ℝ} (i j : Fin d) + (φ : H1WeakTestFunction S) (hSV : S ⊆ V) (hVU : V ⊆ U) + (hVshift : ∀ x ∈ V, euclideanCoordShift step i x ∈ U) : + Function.support + (euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y)) + ⊆ U := by + intro x hx + by_cases hxderiv : φ.deriv j x = 0 + · have hpre_ne : φ.deriv j (euclideanCoordShift (-step) i x) ≠ 0 := by + intro hpre_zero + apply hx + have hnum : + φ.deriv j x - φ.deriv j (euclideanCoordShift (-step) i x) = 0 := by + rw [hxderiv, hpre_zero, sub_self] + rw [euclideanBackwardDifferenceQuotient_apply, hnum] + simp + have hpreS : + euclideanCoordShift (-step) i x ∈ S := + support_h1WeakTest_deriv_subset φ j hpre_ne + have hxU : + euclideanCoordShift step i (euclideanCoordShift (-step) i x) ∈ U := + hVshift (euclideanCoordShift (-step) i x) (hSV hpreS) + simpa using hxU + · exact hVU (hSV (support_h1WeakTest_deriv_subset φ j hxderiv)) + +private theorem support_mul_backwardDifferenceQuotient_h1WeakTest_deriv_subset + {S U V : Set (Vec d)} {u : Vec d → ℝ} {step : ℝ} (i j : Fin d) + (φ : H1WeakTestFunction S) (hSV : S ⊆ V) (hVU : V ⊆ U) + (hVshift : ∀ x ∈ V, euclideanCoordShift step i x ∈ U) : + Function.support + (fun x => + u x * + euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y) x) + ⊆ U := + (Function.support_mul_subset_right u + (euclideanBackwardDifferenceQuotient step i (fun y => φ.deriv j y))).trans + (support_backwardDifferenceQuotient_h1WeakTest_deriv_subset + i j φ hSV hVU hVshift) + +private theorem support_fderiv_h1WeakTest_deriv_apply_subset + {S U : Set (Vec d)} (φ : H1WeakTestFunction S) (i j : Fin d) + (hSU : S ⊆ U) : + Function.support + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) ⊆ U := by + intro x hx + exact hSU <| tsupport_h1WeakTest_deriv_subset φ j <| + (support_fderiv_subset (𝕜 := ℝ) (f := fun y => φ.deriv j y)) <| by + change fderiv ℝ (fun y => φ.deriv j y) x ≠ 0 + intro hzero + apply hx + simp [hzero] + +private theorem support_mul_fderiv_h1WeakTest_deriv_apply_subset + {S U : Set (Vec d)} {u : Vec d → ℝ} + (φ : H1WeakTestFunction S) (i j : Fin d) (hSU : S ⊆ U) : + Function.support + (fun x => + u x * (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) ⊆ U := + (Function.support_mul_subset_right u + (fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i))).trans + (support_fderiv_h1WeakTest_deriv_apply_subset φ i j hSU) + +/-- `L²` convergence of the smooth backward quotients is enough to close the +open-inner Hessian pairing limit. The remaining analytic input is now exactly +the classical statement that, for smooth compactly supported `φ`, +`D_i^- (∂_j φ) → ∂_i∂_j φ` in `L²(openCubeSet Q)`. -/ +theorem openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_toScalarL2_tendsto + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q) + (hback_l2 : + ∀ φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁), + Filter.Tendsto + (fun n : ℕ => + toScalarL2 + (memScalarL2_euclideanBackwardDifferenceQuotient_h1WeakTest_deriv + (U := openCubeSet Q) (step := stepSeq n) φ i j)) + Filter.atTop + (nhds + (toScalarL2 + (memScalarL2_fderiv_h1WeakTest_deriv_apply + (U := openCubeSet Q) φ i j)))) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + refine + openCubeInnerHessianPairingTendsto_of_integral_backwardDifferenceQuotient_deriv_tendsto + uQ stepSeq i j hSV hVU hVshift ?_ + intro φ + let U : Set (Vec d) := openCubeSet Q + let F : ℕ → Vec d → ℝ := fun n => + euclideanBackwardDifferenceQuotient (stepSeq n) i (fun y => φ.deriv j y) + let G : Vec d → ℝ := fun x => + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + have hu : MemScalarL2 U uQ.toFun := by + simpa [U, MemScalarL2, volumeMeasureOn] using uQ.memL2 + have hF : ∀ n, MemScalarL2 U (F n) := by + intro n + simpa [F, U] using + memScalarL2_euclideanBackwardDifferenceQuotient_h1WeakTest_deriv + (U := openCubeSet Q) (step := stepSeq n) φ i j + have hG : MemScalarL2 U G := by + simpa [G, U] using + memScalarL2_fderiv_h1WeakTest_deriv_apply (U := openCubeSet Q) φ i j + have hset_lim : + Filter.Tendsto + (fun n => ∫ x in U, uQ.toFun x * F n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, uQ.toFun x * G x ∂MeasureTheory.volume)) := by + exact tendsto_integral_mul_of_tendsto_toScalarL2 hu hF hG (by + simpa [F, G, U] using hback_l2 φ) + have hseq : + (fun n : ℕ => + ∫ x, uQ.toFun x * + euclideanBackwardDifferenceQuotient (stepSeq n) i + (fun y => φ.deriv j y) x + ∂MeasureTheory.volume) = + fun n : ℕ => + ∫ x in U, uQ.toFun x * F n x ∂MeasureTheory.volume := by + funext n + have hsupport : + Function.support (fun x => uQ.toFun x * F n x) ⊆ U := by + simpa [F, U] using + support_mul_backwardDifferenceQuotient_h1WeakTest_deriv_subset + (U := openCubeSet Q) (V := V) (u := uQ.toFun) + (step := stepSeq n) i j φ hSV hVU (hVshift n) + have hsubset := + integral_subset_of_support_subset + (U := (Set.univ : Set (Vec d))) (V := U) + (Set.subset_univ U) hsupport + simpa [F, U] using hsubset + have htarget : + ∫ x, + uQ.toFun x * + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i) + ∂MeasureTheory.volume = + ∫ x in U, uQ.toFun x * G x ∂MeasureTheory.volume := by + have hsupport : + Function.support (fun x => uQ.toFun x * G x) ⊆ U := by + simpa [G, U] using + support_mul_fderiv_h1WeakTest_deriv_apply_subset + (u := uQ.toFun) φ i j (hSV.trans hVU) + have hsubset := + integral_subset_of_support_subset + (U := (Set.univ : Set (Vec d))) (V := U) + (Set.subset_univ U) hsupport + simpa [G, U] using hsubset + rw [hseq, htarget] + exact hset_lim + +/-- Raw `L²` seminorm convergence of the smooth backward quotients is enough +to close the open-inner Hessian pairing limit. -/ +theorem openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_eLpNorm_tendsto + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q) + (hback_eLp : + ∀ φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁), + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + euclideanBackwardDifferenceQuotient (stepSeq n) i + (fun y => φ.deriv j y) x - + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) + 2 (volumeMeasureOn (openCubeSet Q))) + Filter.atTop (nhds 0)) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + refine + openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_toScalarL2_tendsto + uQ stepSeq i j hSV hVU hVshift ?_ + intro φ + exact + tendsto_toScalarL2_of_tendsto_eLpNorm + (F := fun n => + euclideanBackwardDifferenceQuotient (stepSeq n) i (fun y => φ.deriv j y)) + (G := fun x => (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) + (fun n => + memScalarL2_euclideanBackwardDifferenceQuotient_h1WeakTest_deriv + (U := openCubeSet Q) (step := stepSeq n) φ i j) + (memScalarL2_fderiv_h1WeakTest_deriv_apply (U := openCubeSet Q) φ i j) + (hback_eLp φ) + +/-- A pointwise mean-value type bound for the smooth quotient error closes the +open-inner Hessian pairing limit. This is the intended consumer of the +remaining smooth calculus estimate. -/ +theorem openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_pointwise_bound + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q) + (hstep : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + (hpoint : + ∀ φ : H1WeakTestFunction (scaledOpenCubeSet Q ρ₁), + ∃ C : ℝ, + ∀ n : ℕ, + ∀ᵐ x ∂volumeMeasureOn (openCubeSet Q), + ‖euclideanBackwardDifferenceQuotient (stepSeq n) i + (fun y => φ.deriv j y) x - + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)‖ ≤ + C * ‖stepSeq n‖) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + refine + openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_eLpNorm_tendsto + uQ stepSeq i j hSV hVU hVshift ?_ + intro φ + rcases hpoint φ with ⟨C, hC⟩ + have hfinite : (volumeMeasureOn (openCubeSet Q)) Set.univ ≠ ⊤ := by + simpa [volumeMeasureOn] using (volume_openCubeSet_lt_top Q).ne + exact + tendsto_eLpNorm_zero_of_ae_norm_le_mul_norm + (U := openCubeSet Q) + (F := fun n x => + euclideanBackwardDifferenceQuotient (stepSeq n) i (fun y => φ.deriv j y) x - + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)) + (stepSeq := stepSeq) hfinite hstep hC + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothPointwise.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothPointwise.lean new file mode 100644 index 0000000000..2e213b8207 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothPointwise.lean @@ -0,0 +1,274 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit + +/-! # Smooth Pointwise -/ + +@[expose] public section + +namespace Homogenization + +open scoped Interval Manifold + +noncomputable section + +/-! +# Pointwise smooth backward-quotient convergence + +This shard isolates the classical smooth estimate used by the C.2 limit +handoff: if a coordinate derivative has a global Lipschitz bound, then the +backward difference quotient converges pointwise at rate `O(|h|)`. +-/ + +private theorem norm_basisVec {d : ℕ} (i : Fin d) : ‖basisVec i‖ = (1 : ℝ) := by + apply le_antisymm + · refine (pi_norm_le_iff_of_nonneg (show (0 : ℝ) ≤ 1 by norm_num)).2 ?_ + intro j + by_cases hji : j = i + · subst hji + simp [basisVec] + · simp [basisVec, hji] + · have hi : ‖basisVec i i‖ ≤ ‖basisVec i‖ := norm_le_pi_norm (basisVec i) i + simpa [basisVec] using hi + +private theorem norm_sub_euclideanCoordShift_neg {d : ℕ} + (h : ℝ) (i : Fin d) (x : Vec d) : + ‖x - euclideanCoordShift (-h) i x‖ = ‖h‖ := by + have hx : x - euclideanCoordShift (-h) i x = h • basisVec i := by + ext j + by_cases hji : j = i + · subst hji + simp [euclideanCoordShift, basisVec] + · simp [euclideanCoordShift, basisVec, hji] + rw [hx, norm_smul, norm_basisVec i, mul_one] + +private theorem norm_segmentBlend_sub_left_euclideanCoordShift_neg_le {d : ℕ} + (h : ℝ) (i : Fin d) (x : Vec d) {t : ℝ} + (ht : t ∈ Set.Icc (0 : ℝ) 1) : + ‖segmentBlend x t (euclideanCoordShift (-h) i x) - x‖ ≤ ‖h‖ := by + have hseg : + ‖x - segmentBlend x t (euclideanCoordShift (-h) i x)‖ = + |1 - t| * ‖x - euclideanCoordShift (-h) i x‖ := + norm_left_sub_segmentBlend x (euclideanCoordShift (-h) i x) t + have ht_abs : |1 - t| ≤ 1 := by + rw [abs_le] + constructor <;> linarith [ht.1, ht.2] + calc + ‖segmentBlend x t (euclideanCoordShift (-h) i x) - x‖ = + ‖x - segmentBlend x t (euclideanCoordShift (-h) i x)‖ := by + rw [norm_sub_rev] + _ = |1 - t| * ‖x - euclideanCoordShift (-h) i x‖ := hseg + _ ≤ 1 * ‖x - euclideanCoordShift (-h) i x‖ := by + exact mul_le_mul_of_nonneg_right ht_abs (norm_nonneg _) + _ = ‖h‖ := by rw [one_mul, norm_sub_euclideanCoordShift_neg] + +private theorem continuous_segmentBlend_left {d : ℕ} (x y : Vec d) : + Continuous (fun t : ℝ => segmentBlend x t y) := by + have hcont : Continuous (fun t : ℝ => y + t • (x - y)) := + continuous_const.add (continuous_id.smul continuous_const) + convert hcont using 1 + funext t + rw [segmentBlend_eq_add_smul_sub] + +/-- A global Lipschitz bound on the coordinate derivative gives a pointwise +`O(|h|)` estimate for the backward difference quotient. -/ +theorem euclideanBackwardDifferenceQuotient_sub_coordDeriv_le_of_coordDeriv_lipschitz + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) {C : ℝ} (hC : 0 ≤ C) + (hLip : ∀ z x : Vec d, + ‖euclideanCoordDeriv i u z - euclideanCoordDeriv i u x‖ ≤ C * ‖z - x‖) + (x : Vec d) : + ‖euclideanBackwardDifferenceQuotient h i u x - euclideanCoordDeriv i u x‖ ≤ + C * ‖h‖ := by + let Dg : Vec d → ℝ := fun z => euclideanCoordDeriv i u z + let y : Vec d := euclideanCoordShift (-h) i x + have hDQ : + euclideanBackwardDifferenceQuotient h i u x = + ∫ t in (0 : ℝ)..1, Dg (segmentBlend x t y) := by + simpa [Dg, y] using + euclideanBackwardDifferenceQuotient_eq_integral_coordDeriv_along_segment hu hh i x + have hD_cont : Continuous Dg := by + simpa [Dg] using (contDiff_euclideanCoordDeriv hu i).continuous + have hseg_cont : Continuous (fun t : ℝ => segmentBlend x t y) := + continuous_segmentBlend_left x y + have hcomp_cont : Continuous (fun t : ℝ => Dg (segmentBlend x t y)) := + hD_cont.comp hseg_cont + have hcomp_int : + IntervalIntegrable (fun t : ℝ => Dg (segmentBlend x t y)) + MeasureTheory.volume (0 : ℝ) 1 := + hcomp_cont.intervalIntegrable 0 1 + have hconst_int : + IntervalIntegrable (fun _ : ℝ => Dg x) MeasureTheory.volume (0 : ℝ) 1 := + continuous_const.intervalIntegrable 0 1 + have hdiff_eq : + euclideanBackwardDifferenceQuotient h i u x - Dg x = + ∫ t in (0 : ℝ)..1, (Dg (segmentBlend x t y) - Dg x) := by + rw [hDQ, intervalIntegral.integral_sub hcomp_int hconst_int] + simp + have hnorm_cont : + Continuous (fun t : ℝ => ‖Dg (segmentBlend x t y) - Dg x‖) := + (hcomp_cont.sub continuous_const).norm + have hnorm_int : + IntervalIntegrable (fun t : ℝ => ‖Dg (segmentBlend x t y) - Dg x‖) + MeasureTheory.volume (0 : ℝ) 1 := + hnorm_cont.intervalIntegrable 0 1 + have hbound_int : + IntervalIntegrable (fun _ : ℝ => C * ‖h‖) MeasureTheory.volume (0 : ℝ) 1 := + continuous_const.intervalIntegrable 0 1 + calc + ‖euclideanBackwardDifferenceQuotient h i u x - Dg x‖ = + ‖∫ t in (0 : ℝ)..1, (Dg (segmentBlend x t y) - Dg x)‖ := by + rw [hdiff_eq] + _ ≤ ∫ t in (0 : ℝ)..1, ‖Dg (segmentBlend x t y) - Dg x‖ := + intervalIntegral.norm_integral_le_integral_norm zero_le_one + _ ≤ ∫ _t in (0 : ℝ)..1, C * ‖h‖ := by + apply intervalIntegral.integral_mono_on zero_le_one hnorm_int hbound_int + intro t ht + have hseg : ‖segmentBlend x t y - x‖ ≤ ‖h‖ := by + simpa [y] using norm_segmentBlend_sub_left_euclideanCoordShift_neg_le h i x ht + exact (hLip (segmentBlend x t y) x).trans + (mul_le_mul_of_nonneg_left hseg hC) + _ = C * ‖h‖ := by simp + +/-- A global Fréchet-derivative bound on a coordinate derivative gives the +corresponding global Lipschitz bound. -/ +theorem euclideanCoordDeriv_lipschitz_of_fderiv_bound + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (i : Fin d) {C : ℝ} + (hbound : ∀ x : Vec d, ‖fderiv ℝ (fun z => euclideanCoordDeriv i u z) x‖ ≤ C) : + ∀ z x : Vec d, + ‖euclideanCoordDeriv i u z - euclideanCoordDeriv i u x‖ ≤ C * ‖z - x‖ := by + intro z x + simpa using + (Convex.norm_image_sub_le_of_norm_fderiv_le + (𝕜 := ℝ) (f := fun z => euclideanCoordDeriv i u z) + (s := Set.univ) (C := C) (x := x) (y := z) + (fun y _ => (contDiff_euclideanCoordDeriv hu i).differentiable (by simp) y) + (fun y _ => hbound y) convex_univ trivial trivial) + +/-- Smooth backward quotients converge pointwise at rate `O(|h|)` when the +Fréchet derivative of the coordinate derivative is globally bounded. -/ +theorem euclideanBackwardDifferenceQuotient_sub_coordDeriv_le_of_fderiv_bound + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) {C : ℝ} (hC : 0 ≤ C) + (hbound : ∀ x : Vec d, ‖fderiv ℝ (fun z => euclideanCoordDeriv i u z) x‖ ≤ C) + (x : Vec d) : + ‖euclideanBackwardDifferenceQuotient h i u x - euclideanCoordDeriv i u x‖ ≤ + C * ‖h‖ := + euclideanBackwardDifferenceQuotient_sub_coordDeriv_le_of_coordDeriv_lipschitz + hu hh i hC (euclideanCoordDeriv_lipschitz_of_fderiv_bound hu i hbound) x + +theorem exists_bound_fderiv_euclideanCoordDeriv_of_contDiff_hasCompactSupport + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hu_compact : HasCompactSupport u) (i : Fin d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ x : Vec d, ‖fderiv ℝ (fun z => euclideanCoordDeriv i u z) x‖ ≤ C := by + exact exists_bound_fderiv_of_contDiff_hasCompactSupport + (contDiff_euclideanCoordDeriv hu i) + (hasCompactSupport_euclideanCoordDeriv hu_compact i) + +private theorem contDiff_h1WeakTest_deriv + {d : ℕ} {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv, euclideanCoordDeriv] using! + contDiff_euclideanCoordDeriv φ.smooth j + +private theorem hasCompactSupport_h1WeakTest_deriv + {d : ℕ} {U : Set (Vec d)} (φ : H1WeakTestFunction U) (j : Fin d) : + HasCompactSupport (fun x => φ.deriv j x) := by + simpa [H1WeakTestFunction.deriv] using + φ.compactSupport.fderiv_apply (𝕜 := ℝ) (basisVec j) + +/-- Smooth compactly supported weak tests have a global pointwise +`O(|h|)` backward-quotient estimate for each Hessian coordinate. -/ +theorem exists_backwardDifferenceQuotient_h1WeakTest_deriv_pointwise_bound + {d : ℕ} {U : Set (Vec d)} (φ : H1WeakTestFunction U) (i j : Fin d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ h : ℝ, h ≠ 0 → + ∀ x : Vec d, + ‖euclideanBackwardDifferenceQuotient h i (fun y => φ.deriv j y) x - + (fderiv ℝ (fun y => φ.deriv j y) x) (basisVec i)‖ ≤ C * ‖h‖ := by + obtain ⟨C, hC, hbound⟩ := + exists_bound_fderiv_euclideanCoordDeriv_of_contDiff_hasCompactSupport + (contDiff_h1WeakTest_deriv φ j) + (hasCompactSupport_h1WeakTest_deriv φ j) i + refine ⟨C, hC, ?_⟩ + intro h hh x + simpa [euclideanCoordDeriv] using + euclideanBackwardDifferenceQuotient_sub_coordDeriv_le_of_fderiv_bound + (contDiff_h1WeakTest_deriv φ j) hh i hC hbound x + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {V : Set (Vec d)} + +/-- The smooth pointwise estimate closes the `SmoothLimit` hypothesis whenever +the quotient step sequence is nonzero and tends to zero. -/ +theorem openCubeInnerHessianPairingTendsto_of_smooth_pointwise_bound + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (stepSeq : ℕ → ℝ) (i j : Fin d) {ρ₁ : ℝ} + (hSV : scaledOpenCubeSet Q ρ₁ ⊆ V) + (hVU : V ⊆ openCubeSet Q) + (hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q) + (hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + (hstep_ne : ∀ n, stepSeq n ≠ 0) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + refine + openCubeInnerHessianPairingTendsto_of_backwardDifferenceQuotient_deriv_pointwise_bound + uQ stepSeq i j hSV hVU hVshift hstep_tendsto ?_ + intro φ + obtain ⟨C, _hC, hCbound⟩ := + exists_backwardDifferenceQuotient_h1WeakTest_deriv_pointwise_bound φ i j + refine ⟨C, fun n => ?_⟩ + exact Filter.Eventually.of_forall fun x => hCbound (stepSeq n) (hstep_ne n) x + +/-- Standard closed-cube geometry supplies the domain-shift hypotheses needed +by `openCubeInnerHessianPairingTendsto_of_smooth_pointwise_bound`. -/ +theorem openCubeInnerHessianPairingTendsto_of_smooth_pointwise_bound_of_step_abs + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) + (V : Set (Vec d)) (stepSeq : ℕ → ℝ) (i j : Fin d) + {ρ₁ σ₁ ν : ℝ} + (hinnerV : scaledClosedCubeSet Q ρ₁ ⊆ V) + (hVν : V ⊆ scaledClosedCubeSet Q ν) + (hν_nonneg : 0 ≤ ν) + (hνσ : ν ≤ σ₁) + (hσ₁_lt_one : σ₁ < 1) + (hstep_abs : ∀ n, |stepSeq n| ≤ (σ₁ - ν) * cubeRadius Q) + (hstep_tendsto : Filter.Tendsto stepSeq Filter.atTop (nhds 0)) + (hstep_ne : ∀ n, stepSeq n ≠ 0) : + OpenCubeInnerHessianPairingTendsto (ρ₁ := ρ₁) uQ V stepSeq i j := by + have hSV : scaledOpenCubeSet Q ρ₁ ⊆ V := + (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ₁).trans hinnerV + have hσ₁_nonneg : 0 ≤ σ₁ := hν_nonneg.trans hνσ + have hVU : V ⊆ openCubeSet Q := by + intro x hx + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hν_nonneg (lt_of_le_of_lt hνσ hσ₁_lt_one) (hVν hx) + have hVshift : ∀ n, ∀ x ∈ V, + euclideanCoordShift (stepSeq n) i x ∈ openCubeSet Q := by + intro n x hx + have hxν : x ∈ scaledClosedCubeSet Q ν := hVν hx + have hxσ₁ : + euclideanCoordShift (stepSeq n) i x ∈ scaledClosedCubeSet Q σ₁ := + euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + Q hνσ (hstep_abs n) i hxν + exact + scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + Q hσ₁_nonneg hσ₁_lt_one hxσ₁ + exact + openCubeInnerHessianPairingTendsto_of_smooth_pointwise_bound + uQ stepSeq i j hSV hVU hVshift hstep_tendsto hstep_ne + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothTestBoundEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothTestBoundEstimate.lean new file mode 100644 index 0000000000..c432046d2f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SmoothTestBoundEstimate.lean @@ -0,0 +1,251 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.InnerCubeAndHessian + +/-! # Smooth Test Bound Estimate -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} + +/-- Multiplication by a quantitative cube cutoff does not increase a single +gradient-coordinate square integral. -/ +theorem setIntegral_openCubeSet_cutoff_grad_sq_le + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (i : Fin d) + {σ₁ σ₂ : ℝ} (θ : QuantitativeCubeCutoff Q σ₁ σ₂) : + ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in openCubeSet Q, (uQ.grad x i) ^ 2 ∂MeasureTheory.volume := by + have hθ_top : MeasureTheory.MemLp (θ : Vec d → ℝ) ⊤ + (volumeMeasureOn (openCubeSet Q)) := + θ.smooth.continuous.memLp_top_of_hasCompactSupport θ.hasCompactSupport + (volumeMeasureOn (openCubeSet Q)) + have hleft_mem : MemScalarL2 (openCubeSet Q) + (fun x => (θ : Vec d → ℝ) x * uQ.grad x i) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm] using + (uQ.gradMemL2 i).mul' hθ_top + have hleft_int : MeasureTheory.IntegrableOn + (fun x => ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2) (openCubeSet Q) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using hleft_mem.integrable_sq + have hright_int : MeasureTheory.IntegrableOn + (fun x => (uQ.grad x i) ^ 2) (openCubeSet Q) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (uQ.gradMemL2 i).integrable_sq + have hpoint : + (fun x => ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2) + ≤ᵐ[MeasureTheory.volume.restrict (openCubeSet Q)] + fun x => (uQ.grad x i) ^ 2 := by + filter_upwards with x + have hθ_abs : |(θ : Vec d → ℝ) x| ≤ 1 := + quantitativeCubeCutoff_abs_le_one θ x + have hθ_sq_le_one : ((θ : Vec d → ℝ) x) ^ 2 ≤ 1 := by + have hsq := + (sq_le_sq₀ (abs_nonneg ((θ : Vec d → ℝ) x)) + (by norm_num : 0 ≤ (1 : ℝ))).2 hθ_abs + simpa [sq_abs] using hsq + have hgrad_nonneg : 0 ≤ (uQ.grad x i) ^ 2 := sq_nonneg _ + calc + ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + = ((θ : Vec d → ℝ) x) ^ 2 * (uQ.grad x i) ^ 2 := by ring + _ ≤ 1 * (uQ.grad x i) ^ 2 := + mul_le_mul_of_nonneg_right hθ_sq_le_one hgrad_nonneg + _ = (uQ.grad x i) ^ 2 := by ring + exact MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + +/-- A coordinate derivative of a quantitative cube cutoff is bounded by the +finite-dimensional cutoff-gradient constant. -/ +theorem sq_fderiv_quantitativeCubeCutoff_apply_basisVec_le + {Q : TriadicCube d} {σ₁ σ₂ : ℝ} + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) (i : Fin d) (x : Vec d) : + ((fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 ≤ + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2 := by + have hcoord : + ((fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 ≤ + vecNormSq (euclideanGradient (θ : Vec d → ℝ) x) := by + simpa [euclideanGradient, euclideanCoordDeriv] using + coord_sq_le_vecNormSq (euclideanGradient (θ : Vec d → ℝ) x) i + exact hcoord.trans (vecNormSq_euclideanGradient_quantitativeCubeCutoff_le θ x) + +/-- The cutoff-derivative lower-order term is controlled by the `L²` size of +the function and the explicit finite-dimensional cutoff-gradient constant. -/ +theorem setIntegral_openCubeSet_value_fderiv_cutoff_sq_le + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (i : Fin d) + {σ₁ σ₂ : ℝ} (θ : QuantitativeCubeCutoff Q σ₁ σ₂) : + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume ≤ + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2) * + ∫ x in openCubeSet Q, uQ.toFun x ^ 2 ∂MeasureTheory.volume := by + let K : ℝ := + (d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2 + have hdθ_top : MeasureTheory.MemLp + (fun x => (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ⊤ + (volumeMeasureOn (openCubeSet Q)) := by + simpa [euclideanCoordDeriv, volumeMeasureOn] using! + (contDiff_euclideanCoordDeriv θ.smooth i).continuous.memLp_top_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv θ.hasCompactSupport i) + (volumeMeasureOn (openCubeSet Q)) + have hleft_mem : MemScalarL2 (openCubeSet Q) + (fun x => uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) := by + simpa [MemScalarL2, volumeMeasureOn, mul_comm] using + (uQ.memL2.mul' (p := ⊤) (q := 2) (r := 2) hdθ_top) + have hleft_int : MeasureTheory.IntegrableOn + (fun x => + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2) + (openCubeSet Q) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using hleft_mem.integrable_sq + have hu_sq_int : MeasureTheory.IntegrableOn + (fun x => uQ.toFun x ^ 2) (openCubeSet Q) := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using uQ.memL2.integrable_sq + have hright_int : MeasureTheory.IntegrableOn + (fun x => K * uQ.toFun x ^ 2) (openCubeSet Q) := + hu_sq_int.const_mul K + have hpoint : + (fun x => + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2) + ≤ᵐ[MeasureTheory.volume.restrict (openCubeSet Q)] + fun x => K * uQ.toFun x ^ 2 := by + filter_upwards with x + have hderiv : + ((fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 ≤ K := by + simpa [K] using + sq_fderiv_quantitativeCubeCutoff_apply_basisVec_le θ i x + have hu_nonneg : 0 ≤ uQ.toFun x ^ 2 := sq_nonneg _ + calc + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + = uQ.toFun x ^ 2 * + ((fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 := by ring + _ ≤ uQ.toFun x ^ 2 * K := + mul_le_mul_of_nonneg_left hderiv hu_nonneg + _ = K * uQ.toFun x ^ 2 := by ring + have hmono := MeasureTheory.integral_mono_ae hleft_int hright_int hpoint + have hright_eq : + ∫ x in openCubeSet Q, K * uQ.toFun x ^ 2 ∂MeasureTheory.volume = + K * ∫ x in openCubeSet Q, uQ.toFun x ^ 2 ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + rw [hright_eq] at hmono + simpa [K] using hmono + +/-- A reduced version of the smooth-test quotient-Hessian bound where the two +cutoff lower-order terms have been replaced by unweighted `H¹` integrals. -/ +noncomputable def openCubeInnerQuotientHessianSmoothTestReducedBound + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (f : Vec d → ℝ) + (i : Fin d) {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (_θ : QuantitativeCubeCutoff Q σ₁ σ₂) : ℝ := + ((4 : ℝ) * + ((2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, (uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2) * + ∫ x in openCubeSet Q, uQ.toFun x ^ 2 + ∂MeasureTheory.volume)))) ^ (1 / (2 : ℝ)) + +/-- The smooth-test quotient-Hessian bound is controlled by its reduced +unweighted `H¹` version. -/ +theorem openCubeInnerQuotientHessianSmoothTestBound_le_reducedBound + {Q : TriadicCube d} (uQ : H1Function (openCubeSet Q)) (f : Vec d → ℝ) + (i : Fin d) {ρ₁ ρ₂ σ₁ σ₂ : ℝ} + (θ : QuantitativeCubeCutoff Q σ₁ σ₂) : + openCubeInnerQuotientHessianSmoothTestBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ ≤ + openCubeInnerQuotientHessianSmoothTestReducedBound + (ρ₁ := ρ₁) (ρ₂ := ρ₂) uQ f i θ := by + let A : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume) + let B : ℝ := + (2 : ℝ) * ∫ x in openCubeSet Q, f x ^ 2 ∂MeasureTheory.volume + + ((3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2)) * + ((2 : ℝ) * ∫ x in openCubeSet Q, (uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2) * + ∫ x in openCubeSet Q, uQ.toFun x ^ 2 + ∂MeasureTheory.volume)) + have hcut := + setIntegral_openCubeSet_cutoff_grad_sq_le (Q := Q) uQ i θ + have hderiv := + setIntegral_openCubeSet_value_fderiv_cutoff_sq_le (Q := Q) uQ i θ + have hlower : + (2 : ℝ) * ∫ x in openCubeSet Q, ((θ : Vec d → ℝ) x * uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + ∫ x in openCubeSet Q, + (uQ.toFun x * (fderiv ℝ (θ : Vec d → ℝ) x) (basisVec i)) ^ 2 + ∂MeasureTheory.volume ≤ + (2 : ℝ) * ∫ x in openCubeSet Q, (uQ.grad x i) ^ 2 + ∂MeasureTheory.volume + + (2 : ℝ) * + (((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((σ₂ - σ₁) * cubeRadius Q)) ^ 2) * + ∫ x in openCubeSet Q, uQ.toFun x ^ 2 + ∂MeasureTheory.volume) := by + exact add_le_add + (mul_le_mul_of_nonneg_left hcut (by norm_num)) + (mul_le_mul_of_nonneg_left hderiv (by norm_num)) + have hcoef_nonneg : + 0 ≤ + (3 : ℝ) * + ((d : ℝ) * + (quantitativeCubeCutoffGradientConst d / + ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2) := by + positivity + have hAB : A ≤ B := by + dsimp [A, B] + exact add_le_add_right (mul_le_mul_of_nonneg_left hlower hcoef_nonneg) _ + have h4AB : (4 : ℝ) * A ≤ (4 : ℝ) * B := + mul_le_mul_of_nonneg_left hAB (by norm_num) + have h4A_nonneg : 0 ≤ (4 : ℝ) * A := by + dsimp [A] + positivity + simpa [openCubeInnerQuotientHessianSmoothTestBound, + openCubeInnerQuotientHessianSmoothTestReducedBound, A, B] using + Real.rpow_le_rpow h4A_nonneg h4AB (by norm_num : 0 ≤ (1 / (2 : ℝ))) + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SqCutoffH10.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SqCutoffH10.lean new file mode 100644 index 0000000000..f92b44e591 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SqCutoffH10.lean @@ -0,0 +1,944 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.Localizations + +/-! # Sq Cutoff H10 -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +namespace WeakPoissonEquationOn + +variable {d : ℕ} {U V : Set (Vec d)} +variable {u : H1Function U} {f : Vec d → ℝ} + + +/-- The squared-cutoff forward difference quotient `η² D_i^+ u` is an ambient +zero-trace test when the cutoff is supported in a shift-safe interior set. -/ +theorem memH10_sqCutoffForwardDifferenceQuotient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + MemH10 U + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) := by + have hDQ : MemH1 V (euclideanForwardDifferenceQuotient step i u.toFun) := by + refine ⟨u.forwardDifferenceQuotientOn step i hV.isOpen hVU hVshift, ?_⟩ + funext x + simp + simpa using + memH10_localizedMul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := V) hV hVU + (φ := fun x => η x ^ 2) + (F := euclideanForwardDifferenceQuotient step i u.toFun) + (contDiff_sq hη) (hasCompactSupport_sq hη_compact) + ((tsupport_sq_subset η).trans hη_sub) + hDQ + +/-- The squared-cutoff forward quotient is genuinely supported in the ambient +domain when the cutoff support lies in an interior subset. -/ +theorem support_sqCutoffForwardDifferenceQuotient_subset + (u : H1Function U) (hVU : V ⊆ U) (step : ℝ) (i : Fin d) + {η : Vec d → ℝ} (hη_sub : tsupport η ⊆ V) : + Function.support + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) ⊆ U := + (Function.support_mul_subset_left + (fun x => η x ^ 2) (euclideanForwardDifferenceQuotient step i u.toFun)).trans + ((subset_tsupport (fun x => η x ^ 2)).trans + (((tsupport_sq_subset η).trans hη_sub).trans hVU)) + +/-- Chosen ambient `H¹₀(U)` representative of `η² D_i^+ u`. -/ +noncomputable def sqCutoffForwardDifferenceQuotientToH10 + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + H10Function U := + Classical.choose + (memH10_sqCutoffForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + +@[simp] theorem sqCutoffForwardDifferenceQuotientToH10_toFun + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.toFun = + fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x := + Classical.choose_spec + (memH10_sqCutoffForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + +/-- Coordinatewise gradient identification between the chosen ambient +`H¹₀(U)` representative of `η²D_i^+u` and the explicit ambient `H¹` +localized product representative. -/ +theorem sqCutoffForwardDifferenceQuotientToH10_grad_coord_ae + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (fun x => + (sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j := by + let ψ : H10Function U := + sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let w : H1Function U := + localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hψ_fun : ψ.toH1Function.toFun = w.toFun := by + funext x + simp [ψ, w] + have hψ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => ψ.toH1Function.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((ψ.toH1Function.gradMemL2 j).locallyIntegrable (by norm_num)) + have hw_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => w.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((w.gradMemL2 j).locallyIntegrable (by norm_num)) + have hψ_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => ψ.toH1Function.grad x j) := + ψ.toH1Function.hasWeakPartialDerivOn j + have hw_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => w.grad x j) := by + rw [hψ_fun] + exact w.hasWeakPartialDerivOn j + have hae := HasWeakPartialDerivOn.ae_eq hU hψ_loc hw_loc hψ_weak hw_weak + simpa [ψ, w] using hae + +/-- Vector-valued gradient identification for the chosen ambient `H¹₀(U)` +representative of `η²D_i^+u`. -/ +theorem sqCutoffForwardDifferenceQuotientToH10_grad_ae + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (fun x => + (sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x := by + have hcoord : + ∀ j : Fin d, + (fun x => + (sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j := by + intro j + exact sqCutoffForwardDifferenceQuotientToH10_grad_coord_ae + hU u hV hVU step i j hVshift hη hη_compact hη_sub + filter_upwards [(Filter.eventually_all (l := MeasureTheory.ae (MeasureTheory.volume.restrict U))).2 hcoord] with x hx + ext j + exact hx j + +/-- The whole-space backward quotient bound specialized to the squared-cutoff +forward difference quotient test. -/ +theorem eLpNorm_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_eLpNorm_sqCutoffForwardDifferenceQuotientToH10_grad + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y)) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm + (fun x => + (sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := by + let ψ : H10Function U := + sqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hψ_support : Function.support ψ.toH1Function.toFun ⊆ U := by + simpa [ψ] using + support_sqCutoffForwardDifferenceQuotient_subset + (U := U) (V := V) u hVU step i hη_sub + simpa [ψ] using + eLpNorm_h10_backwardDifferenceQuotient_le_eLpNorm_grad + (U := U) hU.measurableSet ψ hψ_support hstep i + +/-- The squared-cutoff direct test is controlled by the explicit product-rule +gradient of `η²D_i^+u`. -/ +theorem eLpNorm_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_eLpNorm_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + MeasureTheory.eLpNorm + (euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y)) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm + (fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) + 2 (MeasureTheory.volume.restrict U) := by + have hbase := + eLpNorm_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_eLpNorm_sqCutoffForwardDifferenceQuotientToH10_grad + (U := U) (V := V) hU u hV hVU hstep i hVshift hη hη_compact hη_sub + have hgrad_ae := + sqCutoffForwardDifferenceQuotientToH10_grad_coord_ae + (U := U) (V := V) hU u hV hVU step i i hVshift hη hη_compact hη_sub + exact hbase.trans (le_of_eq (MeasureTheory.eLpNorm_congr_ae hgrad_ae)) + +/-- The shifted factor `η(x-h e_i)² D_i^- u(x)` is an ambient zero-trace +test. It is the translated companion to +`memH10_sqCutoffForwardDifferenceQuotient`, with the backward quotient living +on the translated interior set `V + h e_i`. -/ +theorem memH10_sqShiftedCutoffBackwardDifferenceQuotient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + MemH10 U + (fun x => + η (euclideanCoordShift (-step) i x) ^ 2 * + euclideanBackwardDifferenceQuotient step i u.toFun x) := by + let W : Set (Vec d) := translateSet (step • basisVec i) V + let ηshift : Vec d → ℝ := fun x => η (euclideanCoordShift (-step) i x) + have hW : IsOpenBoundedConvexDomain W := by + simpa [W] using IsOpenBoundedConvexDomain.translateSet hV (step • basisVec i) + have hWU : W ⊆ U := by + intro x hx + have hxV : x - step • basisVec i ∈ V := by + simpa [W] using (mem_translateSet_iff_sub_mem).1 hx + have hxShift : x - step • basisVec i ∈ + translateSet ((-step) • basisVec i) U := + hVshift hxV + have hxU : + (x - step • basisVec i) - (-step) • basisVec i ∈ U := + (mem_translateSet_iff_sub_mem).1 hxShift + simpa [sub_eq_add_neg, neg_smul, add_assoc, add_left_comm, add_comm] using hxU + have hWshift : W ⊆ translateSet (step • basisVec i) U := by + intro x hx + have hxV : x - step • basisVec i ∈ V := by + simpa [W] using (mem_translateSet_iff_sub_mem).1 hx + exact (mem_translateSet_iff_sub_mem).2 (hVU hxV) + have hηshift : ContDiff ℝ (⊤ : ℕ∞) ηshift := by + simpa [ηshift] using contDiff_comp_euclideanCoordShift hη (-step) i + have hηshift_compact : HasCompactSupport ηshift := by + simpa [ηshift] using hasCompactSupport_comp_euclideanCoordShift hη_compact (-step) i + have hηshift_sub : tsupport ηshift ⊆ W := by + intro x hx + have hxpre : x - step • basisVec i ∈ tsupport η := by + have hxpre' : x + (-step) • basisVec i ∈ tsupport η := by + rw [show ηshift = η ∘ Homeomorph.addRight ((-step) • basisVec i) by + funext y + rfl, + tsupport_comp_eq_preimage η (Homeomorph.addRight ((-step) • basisVec i))] at hx + exact hx + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxpre' + exact (mem_translateSet_iff_sub_mem).2 (hη_sub hxpre) + have hDQ : MemH1 W (euclideanBackwardDifferenceQuotient step i u.toFun) := by + refine ⟨u.backwardDifferenceQuotientOn step i hW.isOpen hWU hWshift, ?_⟩ + funext x + simp + simpa [ηshift] using + memH10_localizedMul_of_contDiff_hasCompactSupport_tsupport_subset + (U := U) (V := W) hW hWU + (φ := fun x => ηshift x ^ 2) + (F := euclideanBackwardDifferenceQuotient step i u.toFun) + (contDiff_sq hηshift) (hasCompactSupport_sq hηshift_compact) + ((tsupport_sq_subset ηshift).trans hηshift_sub) + hDQ + +/-- Ambient `H¹` representative of the shifted term +`η(x-h e_i)² D_i^- u(x)`, localized on the translated interior set +`V + h e_i`. -/ +noncomputable def localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + H1Function U := by + let W : Set (Vec d) := translateSet (step • basisVec i) V + let ηshift : Vec d → ℝ := fun x => η (euclideanCoordShift (-step) i x) + have hW : IsOpenBoundedConvexDomain W := by + simpa [W] using IsOpenBoundedConvexDomain.translateSet hV (step • basisVec i) + have hWU : W ⊆ U := by + intro x hx + have hxV : x - step • basisVec i ∈ V := by + simpa [W] using (mem_translateSet_iff_sub_mem).1 hx + have hxShift : x - step • basisVec i ∈ + translateSet ((-step) • basisVec i) U := + hVshift hxV + have hxU : + (x - step • basisVec i) - (-step) • basisVec i ∈ U := + (mem_translateSet_iff_sub_mem).1 hxShift + simpa [sub_eq_add_neg, neg_smul, add_assoc, add_left_comm, add_comm] using hxU + have hWshift : W ⊆ translateSet (step • basisVec i) U := by + intro x hx + have hxV : x - step • basisVec i ∈ V := by + simpa [W] using (mem_translateSet_iff_sub_mem).1 hx + exact (mem_translateSet_iff_sub_mem).2 (hVU hxV) + have hηshift : ContDiff ℝ (⊤ : ℕ∞) ηshift := by + simpa [ηshift] using contDiff_comp_euclideanCoordShift hη (-step) i + have hηshift_compact : HasCompactSupport ηshift := by + simpa [ηshift] using hasCompactSupport_comp_euclideanCoordShift hη_compact (-step) i + have hηshift_sub : tsupport ηshift ⊆ W := by + intro x hx + have hxpre : x - step • basisVec i ∈ tsupport η := by + have hxpre' : x + (-step) • basisVec i ∈ tsupport η := by + rw [show ηshift = η ∘ Homeomorph.addRight ((-step) • basisVec i) by + funext y + rfl, + tsupport_comp_eq_preimage η (Homeomorph.addRight ((-step) • basisVec i))] at hx + exact hx + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxpre' + exact (mem_translateSet_iff_sub_mem).2 (hη_sub hxpre) + exact + localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := W) + (u.backwardDifferenceQuotientOn step i hW.isOpen hWU hWshift) + hW.isOpen.measurableSet hWU + (φ := fun x => ηshift x ^ 2) + (contDiff_sq hηshift) (hasCompactSupport_sq hηshift_compact) + ((tsupport_sq_subset ηshift).trans hηshift_sub) + +@[simp] theorem localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_toFun + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toFun = + fun x => + η (euclideanCoordShift (-step) i x) ^ 2 * + euclideanBackwardDifferenceQuotient step i u.toFun x := by + funext x + unfold localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + dsimp only + refine (congrFun (localizedMulContDiffHasCompactSupportToAmbient_toFun + (w := _) (hV_meas := _) (hVU := _) (hφ := _) (hφ_compact := _) (hφ_sub := _)) x).trans ?_ + exact congrArg (fun y => η (euclideanCoordShift (-step) i x) ^ 2 * y) + (H1Function.backwardDifferenceQuotientOn_toFun (u := u) (h := step) (i := i) + (hVopen := _) (hVU := _) (hVshift := _) x) + +theorem localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_eq_shift + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) + (x : Vec d) : + (localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x = + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad (euclideanCoordShift (-step) i x) := by + have hW : IsOpenBoundedConvexDomain (translateSet (step • basisVec i) V) := by + simpa using IsOpenBoundedConvexDomain.translateSet hV (step • basisVec i) + have hWU : translateSet (step • basisVec i) V ⊆ U := by + intro y hy + have hyV : y - step • basisVec i ∈ V := by + simpa using (mem_translateSet_iff_sub_mem).1 hy + have hyShift : y - step • basisVec i ∈ + translateSet ((-step) • basisVec i) U := + hVshift hyV + have hyU : + (y - step • basisVec i) - (-step) • basisVec i ∈ U := + (mem_translateSet_iff_sub_mem).1 hyShift + simpa [sub_eq_add_neg, neg_smul, add_assoc, add_left_comm, add_comm] using hyU + have hWshift : translateSet (step • basisVec i) V ⊆ translateSet (step • basisVec i) U := by + intro y hy + have hyV : y - step • basisVec i ∈ V := by + simpa using (mem_translateSet_iff_sub_mem).1 hy + exact (mem_translateSet_iff_sub_mem).2 (hVU hyV) + have hηshift : ContDiff ℝ (⊤ : ℕ∞) (fun y => η (euclideanCoordShift (-step) i y)) := by + simpa using contDiff_comp_euclideanCoordShift hη (-step) i + have hηshift_compact : HasCompactSupport (fun y => η (euclideanCoordShift (-step) i y)) := by + simpa using hasCompactSupport_comp_euclideanCoordShift hη_compact (-step) i + have hηshift_sub : tsupport (fun y => η (euclideanCoordShift (-step) i y)) ⊆ + translateSet (step • basisVec i) V := by + intro y hy + have hxpre : y - step • basisVec i ∈ tsupport η := by + have hxpre' : y + (-step) • basisVec i ∈ tsupport η := by + rw [show (fun z => η (euclideanCoordShift (-step) i z)) = + η ∘ Homeomorph.addRight ((-step) • basisVec i) by + funext z + rfl, + tsupport_comp_eq_preimage η (Homeomorph.addRight ((-step) • basisVec i))] at hy + exact hy + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hxpre' + exact (mem_translateSet_iff_sub_mem).2 (hη_sub hxpre) + have hval : + localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + = localizedMulContDiffHasCompactSupportToAmbient + (U := U) (V := translateSet (step • basisVec i) V) + (u.backwardDifferenceQuotientOn step i hW.isOpen hWU hWshift) + hW.isOpen.measurableSet hWU + (φ := fun y => η (euclideanCoordShift (-step) i y) ^ 2) + (contDiff_sq hηshift) (hasCompactSupport_sq hηshift_compact) + ((tsupport_sq_subset + (fun y => η (euclideanCoordShift (-step) i y))).trans hηshift_sub) := + rfl + rw [hval] + ext j + simp [localizedSqCutoffForwardDifferenceQuotientToAmbient, + euclideanCoordShift, sub_eq_add_neg, neg_smul, add_left_comm, add_comm] + left + simpa [euclideanCoordDeriv, euclideanCoordShift, sub_eq_add_neg, neg_smul] using + euclideanCoordDeriv_comp_euclideanCoordShift (-step) i j (fun x => η x ^ 2) x + +/-- Pairing against the shifted localized gradient is supported in the +translated interior set. -/ +theorem support_vecDot_localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_subset + (G : Vec d → Vec d) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + Function.support + (fun x => + vecDot (G x) + ((localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x)) ⊆ + translateSet (step • basisVec i) V := by + intro x hx + by_contra hxW + have hyV : euclideanCoordShift (-step) i x ∉ V := by + intro hy + exact hxW (by + rw [mem_translateSet_iff_sub_mem] + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul] using hy) + have hforward_zero : + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad (euclideanCoordShift (-step) i x) = 0 := by + ext j + by_contra hne + exact hyV + (support_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad_subset + (U := U) (V := V) u hV hVU step i j hVshift hη hη_compact hη_sub hne) + have hshift_zero : + (localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x = 0 := by + rw [localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_eq_shift] + exact hforward_zero + exact hx (by simp [hshift_zero, vecDot]) + +/-- Transport the shifted localized-gradient pairing from `U` back to the +interior set `V`. -/ +theorem integral_vecDot_localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_eq_integral_on + (G : Vec d → Vec d) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (G x) + ((localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + ∫ x in V, + vecDot (G (euclideanCoordShift step i x)) + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := by + let W : Set (Vec d) := translateSet (step • basisVec i) V + let F : H1Function U := + localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let S : H1Function U := + localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hWU : W ⊆ U := by + intro x hx + have hxV : x - step • basisVec i ∈ V := by + simpa [W] using (mem_translateSet_iff_sub_mem).1 hx + have hxShift : x - step • basisVec i ∈ + translateSet ((-step) • basisVec i) U := + hVshift hxV + have hxU : + (x - step • basisVec i) - (-step) • basisVec i ∈ U := + (mem_translateSet_iff_sub_mem).1 hxShift + simpa [sub_eq_add_neg, neg_smul, add_assoc, add_left_comm, add_comm] using hxU + have hsupport : + Function.support (fun x => vecDot (G x) (S.grad x)) ⊆ W := by + simpa [S, W] using + support_vecDot_localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_subset + (U := U) (V := V) G u hV hVU step i hVshift hη hη_compact hη_sub + have hrestrict : + ∫ x in U, vecDot (G x) (S.grad x) ∂MeasureTheory.volume = + ∫ x in W, vecDot (G x) (S.grad x) ∂MeasureTheory.volume := + integral_subset_of_support_subset hWU hsupport + have hshift : + ∫ x in W, vecDot (G x) (S.grad x) ∂MeasureTheory.volume = + ∫ x in W, + vecDot (G x) (F.grad (euclideanCoordShift (-step) i x)) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [F, S, localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient_grad_eq_shift] + let z : Vec d := step • basisVec i + have hchange := + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z V + (fun x => vecDot (G x) (F.grad (x - z)))).symm + calc + ∫ x in U, vecDot (G x) (S.grad x) ∂MeasureTheory.volume = + ∫ x in W, vecDot (G x) (S.grad x) ∂MeasureTheory.volume := hrestrict + _ = ∫ x in W, + vecDot (G x) (F.grad (euclideanCoordShift (-step) i x)) + ∂MeasureTheory.volume := hshift + _ = ∫ x in V, + vecDot (G (euclideanCoordShift step i x)) (F.grad x) + ∂MeasureTheory.volume := by + simpa [W, F, z, euclideanCoordShift, sub_eq_add_neg, neg_smul, + add_assoc, add_left_comm, add_comm] using hchange + +/-- Explicit ambient `H¹` representative of the direct test +`D_i^-(η² D_i^+u)`. -/ +noncomputable def backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + H1Function U := + step⁻¹ • + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub - + localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + +@[simp] theorem backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_toFun + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toFun = + euclideanBackwardDifferenceQuotient step i + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) := by + funext x + rw [euclideanBackwardDifferenceQuotient_sq_mul_forwardDifferenceQuotient] + simp [backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient] + +/-- The direct difference-quotient test `D_i^-(η²D_i^+u)` is genuinely +supported in the ambient domain. -/ +theorem support_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_subset + (u : H1Function U) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη_sub : tsupport η ⊆ V) : + Function.support + (euclideanBackwardDifferenceQuotient step i + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x)) ⊆ U := by + intro x hx + by_contra hxU + have hη_zero : η x = 0 := + image_eq_zero_of_notMem_tsupport (fun hxt => hxU (hVU (hη_sub hxt))) + have hη_shift_zero : η (euclideanCoordShift (-step) i x) = 0 := by + refine image_eq_zero_of_notMem_tsupport ?_ + intro hxt + have hyV : euclideanCoordShift (-step) i x ∈ V := hη_sub hxt + have hyShift : euclideanCoordShift (-step) i x ∈ + translateSet ((-step) • basisVec i) U := + hVshift hyV + have hxU' : x ∈ U := by + have hmem : + euclideanCoordShift (-step) i x - (-step) • basisVec i ∈ U := + (mem_translateSet_iff_sub_mem).1 hyShift + simpa [euclideanCoordShift, sub_eq_add_neg, neg_smul, add_assoc, + add_left_comm, add_comm] using hmem + exact hxU hxU' + have hzero : + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x = 0 := by + have hη_shift_zero' : η (x + -(step • basisVec i)) = 0 := by + simpa [euclideanCoordShift, neg_smul] using hη_shift_zero + rw [euclideanBackwardDifferenceQuotient_sq_mul_forwardDifferenceQuotient] + simp [hη_zero, hη_shift_zero'] + exact hx hzero + +@[simp] theorem backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient_grad + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad = + fun x => + step⁻¹ • + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x - + (localizedSqShiftedCutoffBackwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) := by + funext x j + simp [backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient] + +/-- The direct weak-equation test `D_i^- (η² D_i^+ u)` is ambient zero-trace. + +This is the key admissibility bridge for the direct difference-quotient +energy estimate: the original weak equation can be tested against a difference +quotient of the cutoff-weighted forward quotient, so the forcing remains `f` +rather than `D_i^+ f`. -/ +theorem memH10_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + MemH10 U + (euclideanBackwardDifferenceQuotient step i + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x)) := by + have hforward : + MemH10 U + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) := + memH10_sqCutoffForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hshifted : + MemH10 U + (fun x => + η (euclideanCoordShift (-step) i x) ^ 2 * + euclideanBackwardDifferenceQuotient step i u.toFun x) := + memH10_sqShiftedCutoffBackwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hdiff : + MemH10 U + (fun x => + η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x - + η (euclideanCoordShift (-step) i x) ^ 2 * + euclideanBackwardDifferenceQuotient step i u.toFun x) := + memH10_sub hforward hshifted + have hscaled : + MemH10 U + (fun x => + step⁻¹ * + (η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x - + η (euclideanCoordShift (-step) i x) ^ 2 * + euclideanBackwardDifferenceQuotient step i u.toFun x)) := + memH10_smul step⁻¹ hdiff + convert hscaled using 1 + funext x + exact euclideanBackwardDifferenceQuotient_sq_mul_forwardDifferenceQuotient + step i η u.toFun x + +/-- Chosen `H¹₀(U)` representative of the direct difference-quotient test +`D_i^- (η² D_i^+ u)`. -/ +noncomputable def backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + H10Function U := + Classical.choose + (memH10_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + +@[simp] theorem backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10_toFun + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub).toH1Function.toFun = + euclideanBackwardDifferenceQuotient step i + (fun x => η x ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun x) := + Classical.choose_spec + (memH10_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + +/-- Coordinatewise gradient identification between the chosen `H¹₀` +representative of `D_i^-(η² D_i^+u)` and the explicit ambient `H¹` +representative built from localized shifted pieces. -/ +theorem backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10_grad_coord_ae + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i j : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j := by + let ψ : H10Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + let w : H1Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + have hψ_fun : ψ.toH1Function.toFun = w.toFun := by + funext x + simp [ψ, w] + have hψ_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => ψ.toH1Function.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((ψ.toH1Function.gradMemL2 j).locallyIntegrable (by norm_num)) + have hw_loc : + MeasureTheory.LocallyIntegrableOn + (fun x => w.grad x j) U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((w.gradMemL2 j).locallyIntegrable (by norm_num)) + have hψ_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => ψ.toH1Function.grad x j) := + ψ.toH1Function.hasWeakPartialDerivOn j + have hw_weak : + HasWeakPartialDerivOn U j ψ.toH1Function.toFun + (fun x => w.grad x j) := by + rw [hψ_fun] + exact w.hasWeakPartialDerivOn j + have hae := HasWeakPartialDerivOn.ae_eq hU hψ_loc hw_loc hψ_weak hw_weak + simpa [ψ, w] using hae + +/-- Vector-valued gradient identification for the direct difference-quotient +test. -/ +theorem backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10_grad_ae + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + (fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x := by + have hcoord : + ∀ j : Fin d, + (fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x j) =ᵐ[ + MeasureTheory.volume.restrict U] + fun x => + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x j := by + intro j + exact backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10_grad_coord_ae + hU u hV hVU step i j hVshift hη hη_compact hη_sub + filter_upwards [(Filter.eventually_all (l := MeasureTheory.ae (MeasureTheory.volume.restrict U))).2 hcoord] with x hx + ext j + exact hx j + +/-- Integral-square form of the specialized direct-test quotient bound. -/ +theorem integral_sq_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_integral_sq_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (hU : IsOpen U) + (u : H1Function U) (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + {step : ℝ} (hstep : step ≠ 0) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + (euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x in U, + ((localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i) ^ 2 + ∂MeasureTheory.volume := by + let T : Vec d → ℝ := + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) + let G : Vec d → ℝ := + fun x => + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x i + have hnorm_global := + eLpNorm_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_le_eLpNorm_localizedSqCutoffForwardDifferenceQuotientToAmbient_grad + (U := U) (V := V) hU u hV hVU hstep i hVshift hη hη_compact hη_sub + have hT_support : Function.support T ⊆ U := by + simpa [T] using + support_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_subset + (U := U) (V := V) u hVU step i hVshift hη_sub + have hT_norm_restrict : + MeasureTheory.eLpNorm T 2 MeasureTheory.volume = + MeasureTheory.eLpNorm T 2 (MeasureTheory.volume.restrict U) := + eLpNorm_eq_restrict_of_support_subset (U := U) hT_support + have hnorm : + MeasureTheory.eLpNorm T 2 (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm G 2 (MeasureTheory.volume.restrict U) := by + rwa [hT_norm_restrict] at hnorm_global + have hT_mem : MeasureTheory.MemLp T 2 (MeasureTheory.volume.restrict U) := by + let ψ : H10Function U := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub + simpa [T, ψ] using ψ.toH1Function.memL2 + have hG_mem : MeasureTheory.MemLp G 2 (MeasureTheory.volume.restrict U) := by + simpa [G] using + (localizedSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).gradMemL2 i + have htoReal_le : + ENNReal.toReal (MeasureTheory.eLpNorm T 2 (MeasureTheory.volume.restrict U)) ≤ + ENNReal.toReal (MeasureTheory.eLpNorm G 2 (MeasureTheory.volume.restrict U)) := + (ENNReal.toReal_le_toReal hT_mem.eLpNorm_ne_top hG_mem.eLpNorm_ne_top).2 hnorm + have hsq_le : + (ENNReal.toReal (MeasureTheory.eLpNorm T 2 (MeasureTheory.volume.restrict U))) ^ 2 ≤ + (ENNReal.toReal (MeasureTheory.eLpNorm G 2 (MeasureTheory.volume.restrict U))) ^ 2 := + (sq_le_sq₀ ENNReal.toReal_nonneg ENNReal.toReal_nonneg).2 htoReal_le + rw [toReal_eLpNorm_two_sq_eq_integral_sq hT_mem, + toReal_eLpNorm_two_sq_eq_integral_sq hG_mem] at hsq_le + simpa [T, G] using hsq_le + +/-- Original weak equation tested against the direct difference-quotient test. +The right-hand side contains the undifferentiated forcing `f`; the next stage +is to identify the left-hand side by finite-difference summation by parts. -/ +theorem test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotientToH10 + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (u.grad x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume := by + have htest := + h.h10 hU hf + (backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift hη hη_compact hη_sub) + simpa using htest + +/-- Original weak equation tested against the direct difference-quotient test, +with the left-hand side rewritten using the explicit ambient `H¹` +representative of that test. -/ +theorem test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotient_explicitGradient + (h : WeakPoissonEquationOn U u f) (hU : IsOpen U) (hf : MemScalarL2 U f) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (step : ℝ) (i : Fin d) + (hVshift : V ⊆ translateSet ((-step) • basisVec i) U) + {η : Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) (hη_sub : tsupport η ⊆ V) : + ∫ x in U, + vecDot (u.grad x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume = + ∫ x in U, + f x * + euclideanBackwardDifferenceQuotient step i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient step i u.toFun y) x + ∂MeasureTheory.volume := by + have hbase := + h.test_backwardDifferenceQuotient_sqCutoffForwardDifferenceQuotientToH10 + hU hf hV hVU step i hVshift hη hη_compact hη_sub + have hgrad_ae := + backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10_grad_ae + hU u hV hVU step i hVshift hη hη_compact hη_sub + have hleft : + ∫ x in U, + vecDot (u.grad x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToH10 + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in U, + vecDot (u.grad x) + ((backwardDifferenceQuotientSqCutoffForwardDifferenceQuotientToAmbient + (U := U) (V := V) u hV hVU step i hVshift + hη hη_compact hη_sub).grad x) + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + simp [hx] + exact hleft.symm.trans hbase + +end WeakPoissonEquationOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SummationByParts.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SummationByParts.lean new file mode 100644 index 0000000000..b18bd39819 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/SummationByParts.lean @@ -0,0 +1,97 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient + +/-! # Summation By Parts -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +# Summation by parts for weak interior difference quotients + +This file keeps the measure-theoretic finite-difference integration by parts +separate from `DifferenceQuotient.lean`, which is already close to the project +file-size cap. The key point is that the identity below assumes only the +integrability needed to expand the Lebesgue integrals, so it can be used with +an `H¹` representative rather than a smooth compactly supported function. +-/ + +/-- Whole-space finite-difference summation by parts under explicit +integrability hypotheses. + +This is the weak-solution version of +`integral_euclideanForwardDifferenceQuotient_mul_eq_neg_integral_mul_euclideanBackwardDifferenceQuotient`: +the left factor need not be smooth or compactly supported. -/ +theorem integral_euclideanForwardDifferenceQuotient_mul_eq_neg_integral_mul_euclideanBackwardDifferenceQuotient_of_integrable + {d : ℕ} {u v : Vec d → ℝ} (h : ℝ) (i : Fin d) + (hshiftInt : + MeasureTheory.Integrable + (fun x : Vec d => u (euclideanCoordShift h i x) * v x) + MeasureTheory.volume) + (huvInt : + MeasureTheory.Integrable (fun x : Vec d => u x * v x) + MeasureTheory.volume) + (hbackShiftInt : + MeasureTheory.Integrable + (fun x : Vec d => u x * v (euclideanCoordShift (-h) i x)) + MeasureTheory.volume) : + ∫ x, euclideanForwardDifferenceQuotient h i u x * v x ∂MeasureTheory.volume = + -∫ x, u x * euclideanBackwardDifferenceQuotient h i v x + ∂MeasureTheory.volume := by + have hchange := + integral_comp_euclideanCoordShift_mul_eq_integral_mul_comp_euclideanCoordShift_neg + h i u v + have hpointLeft : + (fun x : Vec d => euclideanForwardDifferenceQuotient h i u x * v x) = + fun x : Vec d => + (u (euclideanCoordShift h i x) * v x - u x * v x) * h⁻¹ := by + funext x + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv] + ring + have hpointRight : + (fun x : Vec d => u x * euclideanBackwardDifferenceQuotient h i v x) = + fun x : Vec d => + (u x * v x - u x * v (euclideanCoordShift (-h) i x)) * h⁻¹ := by + funext x + simp [euclideanBackwardDifferenceQuotient, div_eq_mul_inv] + ring + calc + ∫ x, euclideanForwardDifferenceQuotient h i u x * v x ∂MeasureTheory.volume + = ∫ x, (u (euclideanCoordShift h i x) * v x - u x * v x) * h⁻¹ + ∂MeasureTheory.volume := by + rw [hpointLeft] + _ = (∫ x, u (euclideanCoordShift h i x) * v x - u x * v x + ∂MeasureTheory.volume) * h⁻¹ := by + rw [MeasureTheory.integral_mul_const] + _ = ((∫ x, u (euclideanCoordShift h i x) * v x ∂MeasureTheory.volume) - + (∫ x, u x * v x ∂MeasureTheory.volume)) * h⁻¹ := by + rw [MeasureTheory.integral_sub hshiftInt huvInt] + _ = ((∫ x, u x * v (euclideanCoordShift (-h) i x) ∂MeasureTheory.volume) - + (∫ x, u x * v x ∂MeasureTheory.volume)) * h⁻¹ := by + rw [hchange] + _ = -(((∫ x, u x * v x ∂MeasureTheory.volume) - + (∫ x, u x * v (euclideanCoordShift (-h) i x) ∂MeasureTheory.volume)) * h⁻¹) := by + ring + _ = -((∫ x, u x * v x - u x * v (euclideanCoordShift (-h) i x) + ∂MeasureTheory.volume) * h⁻¹) := by + rw [MeasureTheory.integral_sub huvInt hbackShiftInt] + _ = -∫ x, (u x * v x - u x * v (euclideanCoordShift (-h) i x)) * h⁻¹ + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_mul_const] + _ = -∫ x, u x * euclideanBackwardDifferenceQuotient h i v x + ∂MeasureTheory.volume := by + rw [hpointRight] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/TestSubmodule.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/TestSubmodule.lean new file mode 100644 index 0000000000..958e2d8f8e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/TestSubmodule.lean @@ -0,0 +1,612 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.QuantitativeCutoff +public import Mathlib.Analysis.Normed.Lp.SmoothApprox +public import Mathlib.Analysis.Normed.Operator.Extend +public import Mathlib.Geometry.Manifold.PartitionOfUnity +public import Mathlib.MeasureTheory.Function.UniformIntegrable +public import Mathlib.Order.Filter.Finite + +/-! # Test Submodule -/ + +@[expose] public section + +namespace Homogenization + +open scoped Manifold +open scoped ENNReal Topology + +noncomputable section + +/-- Monotonicity of concentric closed cube dilations. -/ +theorem scaledClosedCubeSet_mono {d : ℕ} (Q : TriadicCube d) {ρ σ : ℝ} + (hρσ : ρ ≤ σ) : + scaledClosedCubeSet Q ρ ⊆ scaledClosedCubeSet Q σ := by + intro x hx k + exact (hx k).trans (mul_le_mul_of_nonneg_right hρσ (cubeRadius_nonneg Q)) + +/-- The open concentric subcube is contained in the corresponding closed +concentric subcube. -/ +theorem scaledOpenCubeSet_subset_scaledClosedCubeSet {d : ℕ} + (Q : TriadicCube d) (ρ : ℝ) : + scaledOpenCubeSet Q ρ ⊆ scaledClosedCubeSet Q ρ := by + intro x hx i + exact le_of_lt (hx i) + +/-- Open concentric subcubes are open subsets of the ambient Euclidean space. -/ +theorem isOpen_scaledOpenCubeSet {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) : + IsOpen (scaledOpenCubeSet Q ρ) := by + unfold scaledOpenCubeSet + rw [show {x : Vec d | ∀ i, |x i - cubeCenter Q i| < ρ * cubeRadius Q} = + ⋂ i : Fin d, {x : Vec d | |x i - cubeCenter Q i| < ρ * cubeRadius Q} by + ext x + simp] + exact isOpen_iInter_of_finite fun i => + isOpen_Iio.preimage + ((continuous_abs.comp ((continuous_apply i).sub continuous_const))) + +/-- Nonnegative scaled open subcubes have finite Lebesgue measure. -/ +theorem volume_scaledOpenCubeSet_ne_top_of_nonneg {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ : 0 ≤ ρ) : + MeasureTheory.volume (scaledOpenCubeSet Q ρ) ≠ ⊤ := by + have hle : + MeasureTheory.volume (scaledOpenCubeSet Q ρ) ≤ + MeasureTheory.volume (scaledClosedCubeSet Q ρ) := + MeasureTheory.measure_mono (scaledOpenCubeSet_subset_scaledClosedCubeSet Q ρ) + exact ne_top_of_le_ne_top (isCompact_scaledClosedCubeSet Q hρ).measure_ne_top hle + +/-- A small coordinate shift of a point in a smaller concentric closed cube +remains in a larger concentric closed cube. -/ +theorem euclideanCoordShift_mem_scaledClosedCubeSet_of_mem_scaledClosedCubeSet + {d : ℕ} (Q : TriadicCube d) {ρ σ step : ℝ} (hρσ : ρ ≤ σ) + (hstep : |step| ≤ (σ - ρ) * cubeRadius Q) (i : Fin d) {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ) : + euclideanCoordShift step i x ∈ scaledClosedCubeSet Q σ := by + intro k + by_cases hki : k = i + · subst k + calc + |euclideanCoordShift step i x i - cubeCenter Q i| = + |(x i - cubeCenter Q i) + step| := by + simp [euclideanCoordShift, basisVec] + ring_nf + _ ≤ |x i - cubeCenter Q i| + |step| := abs_add_le _ _ + _ ≤ ρ * cubeRadius Q + (σ - ρ) * cubeRadius Q := add_le_add (hx i) hstep + _ = σ * cubeRadius Q := by ring + · calc + |euclideanCoordShift step i x k - cubeCenter Q k| = + |x k - cubeCenter Q k| := by + simp [euclideanCoordShift, basisVec, hki] + _ ≤ ρ * cubeRadius Q := hx k + _ ≤ σ * cubeRadius Q := mul_le_mul_of_nonneg_right hρσ (cubeRadius_nonneg Q) + +/-- A concentric closed subcube with relative radius strictly below one lies in +the open triadic cube. -/ +theorem scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one + {d : ℕ} (Q : TriadicCube d) {ρ : ℝ} (hρ_nonneg : 0 ≤ ρ) (hρ_lt_one : ρ < 1) : + scaledClosedCubeSet Q ρ ⊆ openCubeSet Q := by + intro x hx + rw [← ball_cubeCenter_eq_openCubeSet] + have hxball : + x ∈ Metric.closedBall (cubeCenter Q) (ρ * cubeRadius Q) := + scaledClosedCubeSet_subset_metricClosedBall Q hρ_nonneg hx + have hrad_lt : ρ * cubeRadius Q < cubeRadius Q := by + have hrad_pos : 0 < cubeRadius Q := cubeRadius_pos Q + nlinarith + exact Metric.closedBall_subset_ball hrad_lt hxball + +namespace QuantitativeCubeCutoff + +/-- The topological support of a quantitative cube cutoff is contained in its +outer closed subcube. -/ +theorem tsupport_subset_scaledClosedCubeSet_of_support_subset + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) : + tsupport (η : Vec d → ℝ) ⊆ scaledClosedCubeSet Q ρ₂ := by + have hsupp : + Function.support (η : Vec d → ℝ) ⊆ scaledClosedCubeSet Q ρ₂ := by + intro x hx i + exact le_of_lt (η.support_subset hx i) + simpa [tsupport] using closure_minimal hsupp (isClosed_scaledClosedCubeSet Q ρ₂) + +/-- A quantitative cube cutoff whose outer radius is strictly less than one is +supported inside the open triadic cube. -/ +theorem tsupport_subset_openCubeSet_of_nonneg_of_lt_one + {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (η : QuantitativeCubeCutoff Q ρ₁ ρ₂) + (hρ₂_nonneg : 0 ≤ ρ₂) (hρ₂_lt_one : ρ₂ < 1) : + tsupport (η : Vec d → ℝ) ⊆ openCubeSet Q := + (η.tsupport_subset_scaledClosedCubeSet_of_support_subset).trans + (scaledClosedCubeSet_subset_openCubeSet_of_nonneg_of_lt_one Q hρ₂_nonneg hρ₂_lt_one) + +end QuantitativeCubeCutoff + +/-- If a real scalar lies between zero and one, cutting a vector by that scalar +cannot increase the pointwise norm of the removed tail. -/ +private theorem norm_sub_smul_le_norm_of_nonneg_of_le_one + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (c : ℝ) (h0 : 0 ≤ c) (h1 : c ≤ 1) (v : E) : + ‖v - c • v‖ ≤ ‖v‖ := by + have hnorm_factor : ‖(1 - c : ℝ)‖ ≤ 1 := by + rw [Real.norm_eq_abs, abs_of_nonneg (sub_nonneg.mpr h1)] + linarith + calc + ‖v - c • v‖ = ‖(1 - c) • v‖ := by + congr 1 + simp [sub_smul] + _ = ‖(1 - c : ℝ)‖ * ‖v‖ := norm_smul (1 - c) v + _ ≤ 1 * ‖v‖ := by + exact mul_le_mul_of_nonneg_right hnorm_factor (norm_nonneg v) + _ = ‖v‖ := by simp + +/-- Mathlib's global smooth compact-support density specialized to scalar +`L²` fields on a restricted Lebesgue domain. -/ +theorem dense_smoothCompactScalarL2 {d : ℕ} {U : Set (Vec d)} : + Dense {f : ScalarL2 U | + ∃ g : Vec d → ℝ, + ∃ hgL2 : MemScalarL2 U g, + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g} := by + have : Fact (1 ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + have hDenseAE := + MeasureTheory.Lp.dense_hasCompactSupport_contDiff + (E := Vec d) (F := ℝ) (μ := volumeMeasureOn U) + (p := (2 : ENNReal)) ENNReal.ofNat_ne_top + refine hDenseAE.mono ?_ + intro f hf + rcases hf with ⟨g, hfg, hg_compact, hg_cont⟩ + let hgL2 : MemScalarL2 U g := (MeasureTheory.Lp.memLp f).ae_eq hfg + refine ⟨g, hgL2, ?_, by simpa using hg_cont, hg_compact⟩ + calc + f = (MeasureTheory.Lp.memLp f).toLp (fun x => f x) := + (MeasureTheory.Lp.toLp_coeFn f (MeasureTheory.Lp.memLp f)).symm + _ = hgL2.toLp g := + MeasureTheory.MemLp.toLp_congr (MeasureTheory.Lp.memLp f) hgL2 hfg + +/-- Localize a smooth scalar `L²` field to an open finite-measure set without +changing it much in `L²`. This turns Mathlib's ambient compactly supported +smooth probes into probes whose topological support is contained in `U`. -/ +theorem exists_contDiff_scalarL2_tsupport_subset_eLpNorm_sub_le + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) + {g : Vec d → ℝ} (hgL2 : MemScalarL2 U g) + (hg_cont : ContDiff ℝ (⊤ : ℕ∞) g) {ε : ℝ} (hε : 0 < ε) : + ∃ φ : Vec d → ℝ, + ∃ _hφL2 : MemScalarL2 U φ, + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) ≤ ENNReal.ofReal ε ∧ + ContDiff ℝ (⊤ : ℕ∞) φ ∧ HasCompactSupport φ ∧ tsupport φ ⊆ U := by + obtain ⟨δ, hδpos, hδ⟩ := + hgL2.eLpNorm_indicator_le (p := (2 : ENNReal)) (by norm_num) + ENNReal.ofNat_ne_top (ENNReal.ofReal_pos.mpr hε) + obtain ⟨K, hKU, hK_compact, hK_closed, hμK⟩ := + hUopen.measurableSet.exists_isCompact_isClosed_sdiff_lt (μ := MeasureTheory.volume) + hUfinite hδpos.ne' + rcases exists_compact_closed_between hK_compact hUopen hKU with + ⟨L, hL_compact, hL_closed, hKL, hLU⟩ + obtain ⟨η, hη_one, hη_zero, hη_range⟩ := + exists_contMDiffMap_one_nhds_of_subset_interior (n := ⊤) (I := 𝓘(ℝ, Vec d)) + hK_closed hKL + let φ : Vec d → ℝ := fun x => η x • g x + have hη_cont : ContDiff ℝ (⊤ : ℕ∞) η := η.contMDiff.contDiff + have hφ_cont : ContDiff ℝ (⊤ : ℕ∞) φ := by + simpa [φ] using! hη_cont.smul hg_cont + have hφ_support : Function.support φ ⊆ L := by + intro x hx + by_contra hxL + have hz : η x = 0 := hη_zero x hxL + exact hx (by simp [φ, hz]) + have hφ_compact : HasCompactSupport φ := + HasCompactSupport.of_support_subset_isCompact hL_compact hφ_support + have hφ_tsupport : tsupport φ ⊆ U := by + have hφ_tsupport_L : tsupport φ ⊆ L := by + simpa [tsupport] using closure_minimal hφ_support hL_closed + exact hφ_tsupport_L.trans hLU + have hφL2 : MemScalarL2 U φ := + hφ_cont.continuous.memLp_of_hasCompactSupport hφ_compact + refine ⟨φ, hφL2, ?_, hφ_cont, hφ_compact, hφ_tsupport⟩ + have hμsmall : volumeMeasureOn U (U \ K) ≤ δ := by + unfold volumeMeasureOn + rw [MeasureTheory.Measure.restrict_apply (hUopen.measurableSet.diff hK_closed.measurableSet)] + simpa [Set.inter_eq_self_of_subset_left (Set.sdiff_subset : U \ K ⊆ U)] using hμK.le + have hindicator := hδ (U \ K) (hUopen.measurableSet.diff hK_closed.measurableSet) hμsmall + calc + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) + ≤ MeasureTheory.eLpNorm ((U \ K).indicator g) 2 (volumeMeasureOn U) := by + refine MeasureTheory.eLpNorm_mono_ae (hgL2.sub hφL2).aestronglyMeasurable ?_ + have hmem : ∀ᵐ x ∂ volumeMeasureOn U, x ∈ U := by + simpa [volumeMeasureOn] using MeasureTheory.ae_restrict_mem hUopen.measurableSet + filter_upwards [hmem] with x hxU + by_cases hxK : x ∈ K + · have hφx : φ x = g x := by + have hηx : η x = 1 := hη_one.self_of_nhdsSet x hxK + simp [φ, hηx] + simp [hφx, hxK] + · have hxDiff : x ∈ U \ K := ⟨hxU, hxK⟩ + rw [Set.indicator_of_mem hxDiff] + have hη01 := hη_range x + exact norm_sub_smul_le_norm_of_nonneg_of_le_one + (η x) hη01.1 hη01.2 (g x) + _ ≤ ENNReal.ofReal ε := hindicator + +/-- Smooth compactly supported scalar probes with support contained in an open +finite-measure set are dense in `L²(U)`. -/ +theorem dense_smoothCompactSupportScalarL2_tsupport_subset + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) : + Dense {f : ScalarL2 U | + ∃ g : Vec d → ℝ, + ∃ hgL2 : MemScalarL2 U g, + f = hgL2.toLp g ∧ ContDiff ℝ (⊤ : ℕ∞) g ∧ HasCompactSupport g ∧ + tsupport g ⊆ U} := by + have : Fact (1 ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + intro f + refine (mem_closure_iff_nhds_basis Metric.nhds_basis_closedBall).2 fun ε hε => ?_ + have hε2 : 0 < ε / 2 := by positivity + obtain ⟨g, hg_compact, hg_cont, hg_err⟩ := + MeasureTheory.MemLp.exist_eLpNorm_sub_le + (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + ENNReal.ofNat_ne_top (by norm_num : (1 : ENNReal) ≤ 2) + (MeasureTheory.Lp.memLp f) hε2 + have hgL2 : MemScalarL2 U g := + hg_cont.continuous.memLp_of_hasCompactSupport hg_compact + obtain ⟨φ, hφL2, hφ_err, hφ_cont, hφ_compact, hφ_support⟩ := + exists_contDiff_scalarL2_tsupport_subset_eLpNorm_sub_le + hUopen hUfinite hgL2 hg_cont hε2 + refine ⟨hφL2.toLp φ, ?_, ?_⟩ + · exact ⟨φ, hφL2, rfl, hφ_cont, hφ_compact, hφ_support⟩ + · have hnorm : + MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U) ≤ + ENNReal.ofReal ε := by + calc + MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U) + = MeasureTheory.eLpNorm ((fun x => f x) - φ) 2 (volumeMeasureOn U) := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [hφL2.coeFn_toLp] with x hx + simp [Pi.sub_apply, hx] + _ = MeasureTheory.eLpNorm (((fun x => f x) - g) + (g - φ)) 2 + (volumeMeasureOn U) := by + congr 1 + funext x + simp [Pi.sub_apply] + _ ≤ MeasureTheory.eLpNorm ((fun x => f x) - g) 2 (volumeMeasureOn U) + + MeasureTheory.eLpNorm (g - φ) 2 (volumeMeasureOn U) := by + exact MeasureTheory.eLpNorm_add_le (by norm_num : (1 : ENNReal) ≤ 2) + _ ≤ ENNReal.ofReal (ε / 2) + ENNReal.ofReal (ε / 2) := add_le_add hg_err hφ_err + _ = ENNReal.ofReal ε := by + rw [← ENNReal.ofReal_add hε2.le hε2.le, add_halves] + rw [Metric.mem_closedBall, dist_comm, MeasureTheory.Lp.dist_def] + exact ENNReal.toReal_le_of_le_ofReal + (a := MeasureTheory.eLpNorm (fun x => f x - hφL2.toLp φ x) 2 (volumeMeasureOn U)) + (b := ε) hε.le hnorm + +/-- The existing `H1WeakTestFunction` carrier realizes the local smooth scalar +probe density as a dense range in `ScalarL2`. -/ +theorem denseRange_h1WeakTestFunction_toScalarL2 + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) : + DenseRange (fun φ : H1WeakTestFunction U => φ.toScalarL2) := by + refine (dense_smoothCompactSupportScalarL2_tsupport_subset hUopen hUfinite).mono ?_ + intro f hf + rcases hf with ⟨g, hgL2, hfg, hg_cont, hg_compact, hg_support⟩ + let φ : H1WeakTestFunction U := + ⟨g, hg_cont, hg_compact, hg_support⟩ + refine ⟨φ, ?_⟩ + have htoLp : φ.toScalarL2 = hgL2.toLp g := by + simp [φ, H1WeakTestFunction.toScalarL2, Homogenization.toScalarL2] + change φ.toScalarL2 = f + rw [htoLp, ← hfg] + +namespace H1WeakTestFunction + +/-- Pointwise sum of two smooth weak tests on the same support set. -/ +noncomputable def add {d : ℕ} {U : Set (Vec d)} + (φ ψ : H1WeakTestFunction U) : H1WeakTestFunction U := + { toFun := fun z => φ z + ψ z + smooth := φ.smooth.add ψ.smooth + compactSupport := φ.compactSupport.add ψ.compactSupport + support_subset := by + exact + (tsupport_add (φ : Vec d → ℝ) (ψ : Vec d → ℝ)).trans + (Set.union_subset φ.support_subset ψ.support_subset) } + +/-- `ScalarL2` class of a pointwise sum of smooth weak tests. -/ +theorem toScalarL2_add {d : ℕ} {U : Set (Vec d)} + (φ ψ : H1WeakTestFunction U) : + (φ.add ψ).toScalarL2 = φ.toScalarL2 + ψ.toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [(φ.add ψ).coeFn_toScalarL2, φ.coeFn_toScalarL2, ψ.coeFn_toScalarL2, + MeasureTheory.Lp.coeFn_add φ.toScalarL2 ψ.toScalarL2] + with z hθ hφ hψ hadd + calc + (φ.add ψ).toScalarL2 z = (φ.add ψ) z := hθ + _ = φ z + ψ z := rfl + _ = φ.toScalarL2 z + ψ.toScalarL2 z := by rw [← hφ, ← hψ] + _ = (φ.toScalarL2 + ψ.toScalarL2) z := by + rw [hadd] + rfl + +/-- Pointwise scalar multiple of a smooth weak test. -/ +noncomputable def smul {d : ℕ} {U : Set (Vec d)} + (c : ℝ) (φ : H1WeakTestFunction U) : H1WeakTestFunction U := + { toFun := fun z => c • φ z + smooth := by + simpa using φ.smooth.const_smul c + compactSupport := by + simpa using! φ.compactSupport.smul_left (f := fun _ : Vec d => c) + support_subset := by + exact + (tsupport_smul_subset_right (fun _ : Vec d => c) (φ : Vec d → ℝ)).trans + φ.support_subset } + +/-- `ScalarL2` class of a pointwise scalar multiple of a smooth weak test. -/ +theorem toScalarL2_smul {d : ℕ} {U : Set (Vec d)} + (c : ℝ) (φ : H1WeakTestFunction U) : + (φ.smul c).toScalarL2 = c • φ.toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [(φ.smul c).coeFn_toScalarL2, φ.coeFn_toScalarL2, + MeasureTheory.Lp.coeFn_smul c φ.toScalarL2] + with z hθ hφ hsmul + calc + (φ.smul c).toScalarL2 z = (φ.smul c) z := hθ + _ = c • φ z := rfl + _ = c • φ.toScalarL2 z := by rw [← hφ] + _ = (c • φ.toScalarL2) z := by + rw [hsmul] + rfl + +end H1WeakTestFunction + +/-- The scalar `L²` classes represented by smooth compactly supported weak +tests form a submodule of `ScalarL2`. -/ +noncomputable def h1WeakTestScalarL2Submodule {d : ℕ} (U : Set (Vec d)) : + Submodule ℝ (ScalarL2 U) where + carrier := Set.range (fun φ : H1WeakTestFunction U => φ.toScalarL2) + zero_mem' := by + let φ : H1WeakTestFunction U := + { toFun := 0 + smooth := contDiff_const + compactSupport := (HasCompactSupport.zero : HasCompactSupport (0 : Vec d → ℝ)) + support_subset := by simp } + refine ⟨φ, ?_⟩ + simp [φ, H1WeakTestFunction.toScalarL2, Homogenization.toScalarL2] + add_mem' := by + rintro x y ⟨φ, rfl⟩ ⟨ψ, rfl⟩ + let θ : H1WeakTestFunction U := + { toFun := fun z => φ z + ψ z + smooth := φ.smooth.add ψ.smooth + compactSupport := φ.compactSupport.add ψ.compactSupport + support_subset := by + exact + (tsupport_add (φ : Vec d → ℝ) (ψ : Vec d → ℝ)).trans + (Set.union_subset φ.support_subset ψ.support_subset) } + refine ⟨θ, ?_⟩ + change θ.toScalarL2 = φ.toScalarL2 + ψ.toScalarL2 + apply MeasureTheory.Lp.ext + filter_upwards + [θ.coeFn_toScalarL2, φ.coeFn_toScalarL2, ψ.coeFn_toScalarL2, + MeasureTheory.Lp.coeFn_add φ.toScalarL2 ψ.toScalarL2] + with z hθ hφ hψ hadd + calc + θ.toScalarL2 z = θ z := hθ + _ = φ z + ψ z := rfl + _ = φ.toScalarL2 z + ψ.toScalarL2 z := by rw [← hφ, ← hψ] + _ = (φ.toScalarL2 + ψ.toScalarL2) z := by + rw [hadd] + rfl + smul_mem' := by + intro c x hx + rcases hx with ⟨φ, rfl⟩ + let θ : H1WeakTestFunction U := + { toFun := fun z => c • φ z + smooth := by + simpa using φ.smooth.const_smul c + compactSupport := by + simpa using! φ.compactSupport.smul_left (f := fun _ : Vec d => c) + support_subset := by + exact + (tsupport_smul_subset_right (fun _ : Vec d => c) (φ : Vec d → ℝ)).trans + φ.support_subset } + refine ⟨θ, ?_⟩ + change θ.toScalarL2 = c • φ.toScalarL2 + apply MeasureTheory.Lp.ext + filter_upwards + [θ.coeFn_toScalarL2, φ.coeFn_toScalarL2, + MeasureTheory.Lp.coeFn_smul c φ.toScalarL2] + with z hθ hφ hsmul + calc + θ.toScalarL2 z = θ z := hθ + _ = c • φ z := rfl + _ = c • φ.toScalarL2 z := by rw [← hφ] + _ = (c • φ.toScalarL2) z := by + rw [hsmul] + rfl + +private theorem exists_h1WeakTestScalarL2Representative + {d : ℕ} {U : Set (Vec d)} + (x : h1WeakTestScalarL2Submodule (d := d) U) : + ∃ φ : H1WeakTestFunction U, φ.toScalarL2 = (x : ScalarL2 U) := by + rcases x with ⟨y, hy⟩ + change ∃ φ : H1WeakTestFunction U, φ.toScalarL2 = y + change y ∈ Set.range (fun φ : H1WeakTestFunction U => φ.toScalarL2) at hy + simpa [Set.mem_range] using hy + +/-- A chosen smooth weak-test representative of a point in the smooth-test +`ScalarL2` submodule. -/ +noncomputable def h1WeakTestScalarL2Representative + {d : ℕ} {U : Set (Vec d)} + (x : h1WeakTestScalarL2Submodule (d := d) U) : H1WeakTestFunction U := + Classical.choose (exists_h1WeakTestScalarL2Representative x) + +/-- The chosen representative realizes the original submodule point. -/ +theorem h1WeakTestScalarL2Representative_toScalarL2 + {d : ℕ} {U : Set (Vec d)} + (x : h1WeakTestScalarL2Submodule (d := d) U) : + (h1WeakTestScalarL2Representative x).toScalarL2 = (x : ScalarL2 U) := + Classical.choose_spec (exists_h1WeakTestScalarL2Representative x) + +/-- The smooth weak-test submodule is dense in scalar `L²` on an open +finite-measure set. -/ +theorem dense_h1WeakTestScalarL2Submodule + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) : + Dense (h1WeakTestScalarL2Submodule (d := d) U : Set (ScalarL2 U)) := by + simpa [h1WeakTestScalarL2Submodule] using! + denseRange_h1WeakTestFunction_toScalarL2 hUopen hUfinite + +/-- Equality of scalar `L²` classes forces zero squared distance for any +chosen representatives. -/ +theorem integral_norm_sq_sub_eq_zero_of_toScalarL2_eq + {d : ℕ} {U : Set (Vec d)} {F G : Vec d → ℝ} + (hF : MemScalarL2 U F) (hG : MemScalarL2 U G) + (hFG : toScalarL2 hF = toScalarL2 hG) : + ∫ x in U, ‖F x - G x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = 0 := by + have hFG_ae : F =ᵐ[volumeMeasureOn U] G := by + simpa [toScalarL2] using + (MeasureTheory.MemLp.toLp_eq_toLp_iff hF hG).1 hFG + have hzero : + (fun x => ‖F x - G x‖ ^ (2 : ℝ)) =ᵐ[volumeMeasureOn U] 0 := by + filter_upwards [hFG_ae] with x hx + rw [hx, sub_self, norm_zero, Real.zero_rpow (by norm_num : (2 : ℝ) ≠ 0)] + rfl + simpa [volumeMeasureOn] using + MeasureTheory.integral_eq_zero_of_ae + (μ := MeasureTheory.volume.restrict U) hzero + +/-- The square-root integral norm of a scalar representative agrees with the +norm of its `ScalarL2` class. -/ +theorem integral_norm_sq_rpow_half_eq_norm_toScalarL2 + {d : ℕ} {U : Set (Vec d)} {F : Vec d → ℝ} + (hF : MemScalarL2 U F) : + (∫ x in U, ‖F x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖toScalarL2 hF‖ := by + let A : ℝ := ∫ x in U, ‖F x‖ ^ (2 : ℝ) ∂MeasureTheory.volume + have hA_nonneg : 0 ≤ A := by + dsimp [A] + refine MeasureTheory.integral_nonneg_of_ae ?_ + filter_upwards with x + exact (show (0 : ℝ) ≤ ‖F x‖ ^ (2 : ℝ) from + Real.rpow_nonneg (norm_nonneg _) _) + have hroot_sq : (A ^ (1 / (2 : ℝ))) ^ 2 = A := by + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hA_nonneg + have hnorm_sq : ‖toScalarL2 hF‖ ^ 2 = A := by + rw [toScalarL2, MeasureTheory.Lp.norm_toLp] + have hsq := toReal_eLpNorm_two_sq_eq_integral_sq hF + rw [hsq] + dsimp [A] + congr 1 with x + simp [sq_abs] + have hroot_nonneg : 0 ≤ A ^ (1 / (2 : ℝ)) := + Real.rpow_nonneg hA_nonneg _ + have hnorm_nonneg : 0 ≤ ‖toScalarL2 hF‖ := norm_nonneg _ + nlinarith + +/-- The previous norm identification specialized to smooth weak tests. -/ +theorem integral_norm_sq_rpow_half_eq_norm_h1WeakTestFunction_toScalarL2 + {d : ℕ} {U : Set (Vec d)} (φ : H1WeakTestFunction U) : + (∫ x in U, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖φ.toScalarL2‖ := by + have hφ_mem : MemScalarL2 U φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (φ.smooth.continuous.memLp_of_hasCompactSupport φ.compactSupport).restrict U + have hφ_l2 : toScalarL2 hφ_mem = φ.toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards [coeFn_toScalarL2 hφ_mem, φ.coeFn_toScalarL2] with x hleft hright + rw [hleft, hright] + calc + (∫ x in U, ‖φ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume) ^ (1 / (2 : ℝ)) = + ‖toScalarL2 hφ_mem‖ := + integral_norm_sq_rpow_half_eq_norm_toScalarL2 hφ_mem + _ = ‖φ.toScalarL2‖ := by rw [hφ_l2] + +/-- Equality of the `ScalarL2` classes attached to two smooth weak tests +forces zero squared distance between their pointwise representatives. -/ +theorem integral_norm_sq_sub_eq_zero_of_h1WeakTestFunction_toScalarL2_eq + {d : ℕ} {U : Set (Vec d)} (φ ψ : H1WeakTestFunction U) + (hφψ : φ.toScalarL2 = ψ.toScalarL2) : + ∫ x in U, ‖φ x - ψ x‖ ^ (2 : ℝ) ∂MeasureTheory.volume = 0 := by + have hφ_mem : MemScalarL2 U φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (φ.smooth.continuous.memLp_of_hasCompactSupport φ.compactSupport).restrict U + have hψ_mem : MemScalarL2 U ψ := by + simpa [MemScalarL2, volumeMeasureOn] using + (ψ.smooth.continuous.memLp_of_hasCompactSupport ψ.compactSupport).restrict U + have hφ_l2 : toScalarL2 hφ_mem = φ.toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards [coeFn_toScalarL2 hφ_mem, φ.coeFn_toScalarL2] with x hleft hright + rw [hleft, hright] + have hψ_l2 : toScalarL2 hψ_mem = ψ.toScalarL2 := by + apply MeasureTheory.Lp.ext + filter_upwards [coeFn_toScalarL2 hψ_mem, ψ.coeFn_toScalarL2] with x hleft hright + rw [hleft, hright] + exact + integral_norm_sq_sub_eq_zero_of_toScalarL2_eq hφ_mem hψ_mem + (by rw [hφ_l2, hψ_l2, hφψ]) + +/-- Extend a linear functional from the smooth weak-test submodule to all of +scalar `L²` using `LinearMap.extendOfNorm`. The norm estimate is supplied in +the accompanying agreement and bound lemmas. -/ +noncomputable def extendH1WeakTestScalarL2Functional + {d : ℕ} {U : Set (Vec d)} + (ℓ : h1WeakTestScalarL2Submodule (d := d) U →ₗ[ℝ] ℝ) : + ScalarL2 U →L[ℝ] ℝ := + LinearMap.extendOfNorm ℓ (h1WeakTestScalarL2Submodule (d := d) U).subtype + +/-- The dense-submodule extension agrees with the original functional on +smooth weak-test classes. -/ +theorem extendH1WeakTestScalarL2Functional_apply_subtype + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) (C : ℝ) + (ℓ : h1WeakTestScalarL2Submodule (d := d) U →ₗ[ℝ] ℝ) + (hℓ : ∀ x, ‖ℓ x‖ ≤ C * ‖((h1WeakTestScalarL2Submodule (d := d) U).subtype x)‖) + (x : h1WeakTestScalarL2Submodule (d := d) U) : + extendH1WeakTestScalarL2Functional (d := d) (U := U) ℓ + ((h1WeakTestScalarL2Submodule (d := d) U).subtype x) = + ℓ x := by + have hdense : + DenseRange ((h1WeakTestScalarL2Submodule (d := d) U).subtype) := by + simpa [Submodule.subtype] using + (dense_h1WeakTestScalarL2Submodule (d := d) hUopen hUfinite).denseRange_val + change + (LinearMap.extendOfNorm ℓ ((h1WeakTestScalarL2Submodule (d := d) U).subtype)) + ((h1WeakTestScalarL2Submodule (d := d) U).subtype x) = + ℓ x + exact LinearMap.extendOfNorm_eq + (f := ℓ) (e := (h1WeakTestScalarL2Submodule (d := d) U).subtype) + hdense ⟨C, hℓ⟩ x + +/-- The extended functional keeps the same operator bound supplied on the +dense smooth-test submodule. -/ +theorem norm_extendH1WeakTestScalarL2Functional_apply_le + {d : ℕ} {U : Set (Vec d)} (hUopen : IsOpen U) + (hUfinite : MeasureTheory.volume U ≠ ⊤) (C : ℝ) + (ℓ : h1WeakTestScalarL2Submodule (d := d) U →ₗ[ℝ] ℝ) + (hℓ : ∀ x, ‖ℓ x‖ ≤ C * ‖((h1WeakTestScalarL2Submodule (d := d) U).subtype x)‖) + (x : ScalarL2 U) : + ‖extendH1WeakTestScalarL2Functional (d := d) (U := U) ℓ x‖ ≤ + C * ‖x‖ := by + have hdense : + DenseRange ((h1WeakTestScalarL2Submodule (d := d) U).subtype) := by + simpa [Submodule.subtype] using + (dense_h1WeakTestScalarL2Submodule (d := d) hUopen hUfinite).denseRange_val + change + ‖(LinearMap.extendOfNorm ℓ ((h1WeakTestScalarL2Submodule (d := d) U).subtype)) + x‖ ≤ + C * ‖x‖ + exact LinearMap.norm_extendOfNorm_apply_le + (f := ℓ) (e := (h1WeakTestScalarL2Submodule (d := d) U).subtype) + hdense C hℓ x + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/WeakDerivativeTestClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/WeakDerivativeTestClosure.lean new file mode 100644 index 0000000000..0e14830a83 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeNeumannW22CZ/WeakInteriorDQ/WeakDerivativeTestClosure.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit + +/-! # Weak Derivative Test Closure -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Manifold + +noncomputable section + +namespace HasWeakPartialDerivOn + +/-- Extend the weak-partial-derivative identity from admissible smooth compact +tests to any test reached as an `L²` limit together with its coordinate +derivative. + +This is the closure step needed for cube boundary tests: the geometric cutoff +argument supplies the approximating sequence `ψn`; this lemma performs the +functional-analytic handoff to the weak derivative identity. -/ +theorem integral_mul_deriv_eq_neg_integral_mul_of_eLpNorm_approx + {d : ℕ} {U : Set (Vec d)} {i : Fin d} {u gi ψ Dψ : Vec d → ℝ} + (huweak : HasWeakPartialDerivOn U i u gi) + (hu : MemScalarL2 U u) (hgi : MemScalarL2 U gi) + (hψ : MemScalarL2 U ψ) (hDψ : MemScalarL2 U Dψ) + (ψn : ℕ → Vec d → ℝ) + (hψn_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (ψn n)) + (hψn_compact : ∀ n, HasCompactSupport (ψn n)) + (hψn_sub : ∀ n, tsupport (ψn n) ⊆ U) + (hψn_mem : ∀ n, MemScalarL2 U (ψn n)) + (hDψn_mem : ∀ n, MemScalarL2 U (fun x => euclideanCoordDeriv i (ψn n) x)) + (hψn_to_ψ : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => ψn n x - ψ x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0)) + (hDψn_to_Dψ : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => euclideanCoordDeriv i (ψn n) x - Dψ x) 2 + (volumeMeasureOn U)) + Filter.atTop (nhds 0)) : + ∫ x in U, u x * Dψ x ∂MeasureTheory.volume = + -∫ x in U, gi x * ψ x ∂MeasureTheory.volume := by + let Dψn : ℕ → Vec d → ℝ := fun n x => euclideanCoordDeriv i (ψn n) x + have hDψn_mem' : ∀ n, MemScalarL2 U (Dψn n) := by + intro n + simpa [Dψn] using hDψn_mem n + have hDψn_toScalar : + Filter.Tendsto + (fun n => toScalarL2 (hDψn_mem' n)) + Filter.atTop + (nhds (toScalarL2 hDψ)) := by + refine + tendsto_toScalarL2_of_tendsto_eLpNorm + (F := Dψn) (G := Dψ) hDψn_mem' hDψ ?_ + simpa [Dψn] using hDψn_to_Dψ + have hleft : + Filter.Tendsto + (fun n => ∫ x in U, u x * Dψn n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, u x * Dψ x ∂MeasureTheory.volume)) := + tendsto_integral_mul_of_tendsto_toScalarL2 hu hDψn_mem' hDψ hDψn_toScalar + have hψn_toScalar : + Filter.Tendsto + (fun n => toScalarL2 (hψn_mem n)) + Filter.atTop + (nhds (toScalarL2 hψ)) := + tendsto_toScalarL2_of_tendsto_eLpNorm + (F := ψn) (G := ψ) hψn_mem hψ hψn_to_ψ + have hright : + Filter.Tendsto + (fun n => -∫ x in U, gi x * ψn n x ∂MeasureTheory.volume) + Filter.atTop + (nhds (-∫ x in U, gi x * ψ x ∂MeasureTheory.volume)) := by + exact + (tendsto_integral_mul_of_tendsto_toScalarL2 hgi hψn_mem hψ hψn_toScalar).neg + have hseq : + (fun n => ∫ x in U, u x * Dψn n x ∂MeasureTheory.volume) = + fun n => -∫ x in U, gi x * ψn n x ∂MeasureTheory.volume := by + funext n + simpa [Dψn, euclideanCoordDeriv] using + huweak (ψn n) (hψn_smooth n) (hψn_compact n) (hψn_sub n) + exact tendsto_nhds_unique (hleft.congr' (Filter.EventuallyEq.of_eq hseq)) hright + +end HasWeakPartialDerivOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson.lean new file mode 100644 index 0000000000..7e546d57ab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.FullVectorPoincareL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.ProjectedVectorPoincare + +/-! # Cube Poisson -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/AnalyticInput.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/AnalyticInput.lean new file mode 100644 index 0000000000..ec218b0350 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/AnalyticInput.lean @@ -0,0 +1,240 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.EndpointDuality + +/-! # Analytic Input -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +/-! +# Analytic-input bundles, integral helpers, and `H1Function` Poisson surface + +This file packages the analytic-input bundles used by the cube-local vector +Poincare proofs (full, full-`L²`, and projected), the `cubeAverage` ↔ +`integralAverage` and `setIntegral` ↔ `cubeBesovPairing` identities, and the +`H1Function`-side Poisson right-hand side and mean-zero representative. +-/ + +/-- Corrected analytic input bundle for the full-dual vector Poincare theorem. +It keeps the same Poisson solver and Neumann CZ field as the legacy bundle, but +uses the full endpoint-duality surface that retains constant modes. -/ +structure CubeFullVectorPoincareAnalyticInput {d : ℕ} (Q : TriadicCube d) where + poisson : HasMeanZeroNeumannPoissonSolverOnCube Q + czConstant : ℝ + cz : CubeNeumannPoissonGradientBesovEstimate Q czConstant + dualityConstant : ℝ + duality : CubePoissonGradientFullEndpointDuality Q dualityConstant + +/-- Slim corrected analytic input bundle for the full-dual vector Poincare +theorem after the Poisson-gradient endpoint estimate has already been combined +with the Neumann CZ estimate. This is the interface downstream arguments should +aim to use: a solver plus one direct `L²` endpoint constant. -/ +structure CubeFullVectorPoincareL2AnalyticInput {d : ℕ} (Q : TriadicCube d) where + poisson : HasMeanZeroNeumannPoissonSolverOnCube Q + endpointConstant : ℝ + endpoint : CubePoissonGradientFullL2EndpointDuality Q endpointConstant + +namespace CubeFullVectorPoincareL2AnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +theorem endpointConstant_nonneg (h : CubeFullVectorPoincareL2AnalyticInput Q) : + 0 ≤ h.endpointConstant := + h.endpoint.1 + +end CubeFullVectorPoincareL2AnalyticInput + +namespace CubeFullVectorPoincareAnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +theorem czConstant_nonneg (h : CubeFullVectorPoincareAnalyticInput Q) : + 0 ≤ h.czConstant := + h.cz.1 + +theorem dualityConstant_nonneg (h : CubeFullVectorPoincareAnalyticInput Q) : + 0 ≤ h.dualityConstant := + h.duality.1 + +/-- Collapse the split corrected full endpoint plus Neumann CZ bundle into the +direct `L²` endpoint bundle. -/ +noncomputable def to_l2AnalyticInput (h : CubeFullVectorPoincareAnalyticInput Q) : + CubeFullVectorPoincareL2AnalyticInput Q where + poisson := h.poisson + endpointConstant := h.dualityConstant * h.czConstant + endpoint := h.duality.to_l2Endpoint h.cz + +end CubeFullVectorPoincareAnalyticInput + +/-- A bundled interface for the classical analytic ingredients behind the +single-cube projected vector Poincare theorem. -/ +structure CubeProjectedVectorPoincareAnalyticInput {d : ℕ} (Q : TriadicCube d) where + poisson : HasMeanZeroNeumannPoissonSolverOnCube Q + czConstant : ℝ + cz : CubeNeumannPoissonGradientBesovEstimate Q czConstant + dualityConstant : ℝ + duality : CubeProjectedGradientEndpointDuality Q dualityConstant + fullDualityConstant : ℝ + fullDuality : CubeGradientEndpointDuality Q fullDualityConstant + +namespace CubeProjectedVectorPoincareAnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +theorem czConstant_nonneg (h : CubeProjectedVectorPoincareAnalyticInput Q) : + 0 ≤ h.czConstant := + h.cz.1 + +theorem dualityConstant_nonneg (h : CubeProjectedVectorPoincareAnalyticInput Q) : + 0 ≤ h.dualityConstant := + h.duality.1 + +theorem fullDualityConstant_nonneg (h : CubeProjectedVectorPoincareAnalyticInput Q) : + 0 ≤ h.fullDualityConstant := + h.fullDuality.1 + +end CubeProjectedVectorPoincareAnalyticInput + +theorem cubeAverage_eq_integralAverage_openCubeSet {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage Q f = integralAverage (openCubeSet Q) f := by + unfold cubeAverage integralAverage + rw [setIntegral_cubeSet_eq_setIntegral_openCubeSet, volume_openCubeSet_toReal] + +theorem setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) : + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume = + cubeVolume Q * cubeAverage Q f := by + have hQ : cubeVolume Q ≠ 0 := (cubeVolume_pos Q).ne' + have havg := cubeAverage_eq_integralAverage_openCubeSet Q f + calc + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume + = cubeVolume Q * + ((cubeVolume Q)⁻¹ * + ∫ x in openCubeSet Q, f x ∂MeasureTheory.volume) := by + field_simp [hQ] + _ = cubeVolume Q * cubeAverage Q f := by + rw [havg] + simp [integralAverage, volume_openCubeSet_toReal] + +theorem setIntegral_openCubeSet_mul_eq_cubeVolume_mul_cubeBesovPairing {d : ℕ} + (Q : TriadicCube d) (f g : Vec d → ℝ) : + ∫ x in openCubeSet Q, f x * g x ∂MeasureTheory.volume = + cubeVolume Q * cubeBesovPairing Q f g := by + simp [cubeBesovPairing, setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage] + +/-- The unnormalized square integral on the open cube is the cube volume times +the square of the normalized `L²` norm. -/ +theorem setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow {d : ℕ} + (Q : TriadicCube d) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∫ x in openCubeSet Q, f x * f x ∂MeasureTheory.volume = + cubeVolume Q * (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℝ) := by + have hnorm := cubeLpNorm_rpow_eq_cubeAverage_norm_rpow + (Q := Q) (p := (2 : ℝ≥0∞)) (f := f) (by norm_num) (by simp) hf + have hnorm2 : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℝ) = + cubeAverage Q (fun x => ‖f x‖ ^ (2 : ℝ)) := by + simpa using hnorm + have hnorm' : + (cubeLpNorm Q (2 : ℝ≥0∞) f) ^ (2 : ℝ) = + cubeAverage Q (fun x => f x * f x) := by + rw [hnorm2] + apply cubeAverage_congr_on_cubeSet + intro x _hx + simp [Real.norm_eq_abs, pow_two] + rw [setIntegral_openCubeSet_eq_cubeVolume_mul_cubeAverage] + rw [← hnorm'] + +namespace H1Function + +variable {d : ℕ} {Q : TriadicCube d} + +/-- The mean-zero right-hand side for the cube Neumann Poisson problem +associated to an `H¹` function. -/ +noncomputable def cubePoissonRhs (Q : TriadicCube d) + (u : H1Function (openCubeSet Q)) : Vec d → ℝ := + cubeFluctuation Q (fun x => u x) + +@[simp] theorem cubePoissonRhs_apply (u : H1Function (openCubeSet Q)) (x : Vec d) : + u.cubePoissonRhs Q x = u x - cubeAverage Q (fun x => u x) := + rfl + +theorem cubePoissonRhs_memL2_normalizedCubeMeasure + (u : H1Function (openCubeSet Q)) : + MeasureTheory.MemLp (u.cubePoissonRhs Q) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hu : MeasureTheory.MemLp (fun x => u x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + u.memL2_normalizedCubeMeasure + have hconst : + MeasureTheory.MemLp (fun _ : Vec d => cubeAverage Q (fun x => u x)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + MeasureTheory.memLp_const + (μ := normalizedCubeMeasure Q) (p := (2 : ℝ≥0∞)) (cubeAverage Q (fun x => u x)) + simpa [H1Function.cubePoissonRhs, cubeFluctuation] using! hu.sub hconst + +theorem cubeAverage_cubePoissonRhs (u : H1Function (openCubeSet Q)) : + cubeAverage Q (u.cubePoissonRhs Q) = 0 := by + simp [H1Function.cubePoissonRhs] + +@[simp] theorem cubeBesovOscillation_eq_cubeLpNorm_cubePoissonRhs + (u : H1Function (openCubeSet Q)) : + cubeBesovOscillation Q (2 : ℝ≥0∞) (fun x => u x) = + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := + rfl + +/-- The open-cube mean-zero representative of an `H¹` function, with the +normalization chosen to match `cubePoissonRhs`. -/ +noncomputable def toMeanZeroOnCube (Q : TriadicCube d) + (u : H1Function (openCubeSet Q)) : + H1MeanZeroFunction (openCubeSet Q) := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + exact u.toMeanZero + +@[simp] theorem toMeanZeroOnCube_apply + (u : H1Function (openCubeSet Q)) (x : Vec d) : + u.toMeanZeroOnCube Q x = u.cubePoissonRhs Q x := by + unfold H1Function.toMeanZeroOnCube + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have havg : + integralAverage (openCubeSet Q) (fun x => u x) = + cubeAverage Q (fun x => u x) := + (cubeAverage_eq_integralAverage_openCubeSet Q (fun x => u x)).symm + simp [H1Function.cubePoissonRhs, havg] + +@[simp] theorem toMeanZeroOnCube_grad + (u : H1Function (openCubeSet Q)) (x : Vec d) : + (u.toMeanZeroOnCube Q).toH1Function.grad x = u.grad x := by + unfold H1Function.toMeanZeroOnCube + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + simp + +theorem grad_coord_memL2_normalizedCubeMeasure + (u : H1Function (openCubeSet Q)) (i : Fin d) : + MeasureTheory.MemLp (fun x => u.grad x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + u.grad_memL2_normalizedCubeMeasure i + +theorem grad_coord_memL2_normalizedCubeMeasure_descendant + {R : TriadicCube d} {j : ℕ} + (u : H1Function (openCubeSet Q)) (hR : R ∈ descendantsAtDepth Q j) (i : Fin d) : + MeasureTheory.MemLp (fun x => u.grad x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := + u.grad_memL2_normalizedCubeMeasure_of_mem_descendantsAtDepth hR i + +end H1Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/BesovEstimate.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/BesovEstimate.lean new file mode 100644 index 0000000000..6d7213cd32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/BesovEstimate.lean @@ -0,0 +1,159 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.GlobalComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.Solver + +/-! # Besov Estimate -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +/-! +# Calderon-Zygmund Besov gradient estimate for the cube Poisson solver + +The narrow Calderon-Zygmund consequence used by the projected vector Poincare +proof: the gradient of the Neumann Poisson solution has controlled positive +`B¹_{2,∞}` circ norm, component by component, with the constant produced from +the coercive `H¹` bound and a geometric Besov scale weight. +-/ + +/-- The narrow Calderon-Zygmund consequence needed for the projected vector +Poincare proof: the gradient of the Neumann Poisson solution has controlled +positive `B¹_{2,∞}` circ norm, component by component. -/ +def CubeNeumannPoissonGradientBesovEstimate {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F), + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) F + +/-- Componentwise geometric control of the positive `B¹_{2,∞}` circ norm by +normalized component `L²` norms. This is the Besov side of the narrow +Calderon-Zygmund dependency; the remaining elliptic part is to control the +Poisson-gradient component `L²` sum by the right-hand side. -/ +theorem sum_cubeBesovCircNorm_one_two_top_le_geometric_mul_sum_cubeLpNorm + {d : ℕ} (Q : TriadicCube d) (G : Vec d → Vec d) + (hG : + ∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => G x i) ≤ + (cubeBesovScaleWeight (-1) Q * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹) * + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + let K : ℝ := cubeBesovScaleWeight (-1) Q * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ + have hcomponent : + ∀ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => G x i) ≤ + K * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + intro i + have h := + cubeBesovCircNorm_le_geometric_constant_of_memLp + (Q := Q) (s := 1) (p := (2 : ℝ≥0∞)) (q := (∞ : ℝ≥0∞)) + (u := fun x => G x i) (by norm_num) (hG i) + (by norm_num) (by norm_num) (by simp) + calc + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) (fun x => G x i) + ≤ (cubeBesovScaleWeight (-1) Q * + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i)) * + (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ := h + _ = K * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + dsimp [K] + ring + calc + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => G x i) + ≤ ∑ i : Fin d, K * cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + exact Finset.sum_le_sum fun i _hi => hcomponent i + _ = K * ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + exact (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i)) K).symm + _ = (cubeBesovScaleWeight (-1) Q * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹) * + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) (fun x => G x i) := by + rfl + +noncomputable def cubeNeumannPoissonGradientBesovEnergyConstant {d : ℕ} + (Q : TriadicCube d) : ℝ := + (cubeBesovScaleWeight (-1) Q * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹) * + (((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * (cubeVolume Q + 1)) + +theorem cubeNeumannPoissonGradientBesovEnergyConstant_nonneg {d : ℕ} + (Q : TriadicCube d) : + 0 ≤ cubeNeumannPoissonGradientBesovEnergyConstant Q := by + have hgeom : 0 ≤ cubeBesovScaleWeight (-1) Q * + (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ := by + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-1) Q) (by positivity) + have hA : 0 ≤ (cubeVolume Q)⁻¹ + 1 := by + have hInv : 0 ≤ (cubeVolume Q)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg Q) + linarith + have hB : 0 ≤ cubeVolume Q + 1 := by + linarith [cubeVolume_nonneg Q] + have henergy : + 0 ≤ ((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * (cubeVolume Q + 1) := by + exact mul_nonneg + (mul_nonneg + (mul_nonneg hA (Nat.cast_nonneg d)) + (cubeMeanZeroH1CoerciveConstant_nonneg Q)) + hB + exact mul_nonneg hgeom henergy + +theorem cubeNeumannPoissonGradientBesovEstimate_of_energy {d : ℕ} + (Q : TriadicCube d) : + CubeNeumannPoissonGradientBesovEstimate Q + (cubeNeumannPoissonGradientBesovEnergyConstant Q) := by + refine ⟨cubeNeumannPoissonGradientBesovEnergyConstant_nonneg Q, ?_⟩ + intro F hF _hmean W + let K : ℝ := cubeBesovScaleWeight (-1) Q * (1 - (3 : ℝ) ^ (-1 : ℝ))⁻¹ + let E : ℝ := + ((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * (cubeVolume Q + 1) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + exact mul_nonneg (cubeBesovScaleWeight_nonneg (-1) Q) (by positivity) + have hcirc : + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + K * ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) := by + simpa [K] using + sum_cubeBesovCircNorm_one_two_top_le_geometric_mul_sum_cubeLpNorm + Q (fun x => W.w.toH1Function.grad x) + (fun i => W.w.toH1Function.grad_memL2_normalizedCubeMeasure i) + have henergy : + ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) ≤ + E * cubeLpNorm Q (2 : ℝ≥0∞) F := by + simpa [E] using meanZeroNeumannPoissonSolution_sum_cubeLpNorm_grad_le Q hF W + calc + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + ≤ K * ∑ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) := hcirc + _ ≤ K * (E * cubeLpNorm Q (2 : ℝ≥0∞) F) := by + exact mul_le_mul_of_nonneg_left henergy hK_nonneg + _ = cubeNeumannPoissonGradientBesovEnergyConstant Q * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + dsimp [K, E, cubeNeumannPoissonGradientBesovEnergyConstant] + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/DualTestNorm.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/DualTestNorm.lean new file mode 100644 index 0000000000..4e1926f674 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/DualTestNorm.lean @@ -0,0 +1,174 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.BesovEstimate + +/-! # Dual Test Norm -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +/-! +# Positive dual test-norm estimates for Poisson gradients + +The endpoint inputs that the full-dual Besov pairing proof actually uses: each +component of the Poisson gradient admits a positive uniform bound for all +finite-depth dual test norms. The L²-facing wrapper combines this with the +Calderon-Zygmund estimate, and the core wrapper packages the epsilon-free clean +componentwise estimate into the positive `B`-bundle used downstream. +-/ + +/-- Positive-test-norm control for Poisson gradients. + +This is the endpoint input that the full-dual Besov pairing proof actually +uses: each component of the Poisson gradient admits a positive uniform bound +for all finite-depth dual test norms, and the sum of those bounds is controlled +by the `B¹_{2,∞}` circ norm of the Poisson gradient up to an arbitrary +epsilon. The epsilon slack keeps the zero-gradient case available while still +implying the exact endpoint duality bound by a limiting argument. -/ +def CubePoissonGradientDualTestNormEstimate {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) + (ε : ℝ) (_hε : 0 < ε), + ∃ B : Fin d → ℝ, + (∀ i : Fin d, 0 < B i) ∧ + (∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) ≤ + B i) ∧ + (∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i)) ∧ + ∑ i : Fin d, B i ≤ + C * ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + ε + +/-- L²-facing positive-test-norm control for Poisson gradients. + +This is the form obtained after composing the positive-test/circ estimate with +the Neumann Calderon-Zygmund estimate. It is closer to the elliptic regularity +statement that remains to be proved: the admissible positive Besov test bounds +for `∇W` are controlled directly by the normalized `L²` norm of the right-hand +side. -/ +def CubePoissonGradientDualTestNormL2Estimate {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) + (ε : ℝ) (_hε : 0 < ε), + ∃ B : Fin d → ℝ, + (∀ i : Fin d, 0 < B i) ∧ + (∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) ≤ + B i) ∧ + (∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i)) ∧ + ∑ i : Fin d, B i ≤ C * cubeLpNorm Q (2 : ℝ≥0∞) F + ε + +/-- Core direct `L²` positive-test bound for Poisson gradients. + +This is the epsilon-free form one expects from Neumann `W^{2,2}`/CZ plus local +Poincare: each component of `∇W` has all finite positive dual test norms +bounded by the same multiple of `‖F‖_{L²(Q)}`. The theorem below turns this +clean componentwise estimate into the positive `B`-package used by the endpoint +duality wrapper. -/ +def CubePoissonGradientDualTestNormL2CoreEstimate {d : ℕ} + (Q : TriadicCube d) (C : ℝ) : Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F), + (∀ i : Fin d, ∀ N : ℕ, + cubeBesovDualTestNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) N + (fun x => W.w.toH1Function.grad x i) ≤ + C * cubeLpNorm Q (2 : ℝ≥0∞) F) ∧ + (∀ i : Fin d, + CubeBesovDualLocalMemLpGlobal Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i)) + +theorem CubePoissonGradientDualTestNormL2CoreEstimate.to_l2Estimate + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + (h : CubePoissonGradientDualTestNormL2CoreEstimate Q C) : + CubePoissonGradientDualTestNormL2Estimate Q ((d : ℝ) * C) := by + refine ⟨mul_nonneg (Nat.cast_nonneg d) h.1, ?_⟩ + intro F hF hmean W ε hε + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + let δ : ℝ := ε / ((d : ℝ) + 1) + let B : Fin d → ℝ := fun _ => C * L + δ + have hδ_pos : 0 < δ := by + exact div_pos hε (by positivity) + have hCL_nonneg : 0 ≤ C * L := by + exact mul_nonneg h.1 (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) F) + rcases h.2 F hF hmean W with ⟨hnorm_core, hmem⟩ + refine ⟨B, ?_, ?_, hmem, ?_⟩ + · intro i + exact add_pos_of_nonneg_of_pos hCL_nonneg hδ_pos + · intro i N + exact (hnorm_core i N).trans (le_add_of_nonneg_right hδ_pos.le) + · have hdδ_le : (d : ℝ) * δ ≤ ε := by + have hd1_pos : 0 < (d : ℝ) + 1 := by positivity + have hd_nonneg : 0 ≤ (d : ℝ) := by exact_mod_cast Nat.zero_le d + have hratio : (d : ℝ) / ((d : ℝ) + 1) ≤ 1 := by + exact (div_le_one hd1_pos).mpr (by linarith) + calc + (d : ℝ) * δ = ε * ((d : ℝ) / ((d : ℝ) + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hd1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + ∑ i : Fin d, B i + = (d : ℝ) * (C * L + δ) := by + simp [B] + ring + _ = ((d : ℝ) * C) * L + (d : ℝ) * δ := by ring + _ ≤ ((d : ℝ) * C) * L + ε := by + linarith + _ = ((d : ℝ) * C) * cubeLpNorm Q (2 : ℝ≥0∞) F + ε := by + simp [L] + +theorem CubePoissonGradientDualTestNormEstimate.to_l2Estimate + {d : ℕ} {Q : TriadicCube d} {Ctest Ccz : ℝ} + (htest : CubePoissonGradientDualTestNormEstimate Q Ctest) + (hcz : CubeNeumannPoissonGradientBesovEstimate Q Ccz) : + CubePoissonGradientDualTestNormL2Estimate Q (Ctest * Ccz) := by + refine ⟨mul_nonneg htest.1 hcz.1, ?_⟩ + intro F hF hmean W ε hε + rcases htest.2 F hF hmean W ε hε with ⟨B, hB_pos, hnorm, hmem, hB_sum⟩ + refine ⟨B, hB_pos, hnorm, hmem, ?_⟩ + have hcz_bound : + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + Ccz * cubeLpNorm Q (2 : ℝ≥0∞) F := + hcz.2 F hF hmean W + calc + ∑ i : Fin d, B i + ≤ Ctest * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i)) + ε := hB_sum + _ ≤ Ctest * (Ccz * cubeLpNorm Q (2 : ℝ≥0∞) F) + ε := by + simpa [add_comm, add_left_comm, add_assoc] using + add_le_add_right (mul_le_mul_of_nonneg_left hcz_bound htest.1) ε + _ = (Ctest * Ccz) * cubeLpNorm Q (2 : ℝ≥0∞) F + ε := by ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/EndpointDuality.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/EndpointDuality.lean new file mode 100644 index 0000000000..eec7f3d293 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/EndpointDuality.lean @@ -0,0 +1,307 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.DualTestNorm +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization + +/-! # Endpoint Duality -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +/-! +# Endpoint Besov-duality interfaces for Poisson-gradient pairings + +The endpoint Besov duality definitions used by the cube-local Poincare +arguments, together with the conversions between projected and full-dual +surfaces. The `to_l2Endpoint` and `of_dualTestNorm…` lemmas wire +these surfaces to the Calderon-Zygmund and dual-test-norm estimates from +sibling files. +-/ + +/-- Endpoint Besov duality input, specialized to the projected gradient terms +that occur in the one-cube vector Poincare proof. -/ +def CubeProjectedGradientEndpointDuality {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (N : ℕ) (G : Vec d → Vec d) (Ψ : Vec d → Vec d), + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => Ψ x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + ∑ i : Fin d, + |cubeBesovPairing Q + (cubeProjection Q N (fun x => G x i)) + (fun x => Ψ x i)| ≤ + C * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => G x i))) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => Ψ x i)) + +/-- Endpoint Besov duality input for the full, unprojected gradient terms used +by the infinite-depth vector Poincare theorem. -/ +def CubeGradientEndpointDuality {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (G : Vec d → Vec d) (Ψ : Vec d → Vec d), + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => Ψ x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => Ψ x i)| ≤ + C * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => Ψ x i)) + +/-- Constant-mode-safe endpoint Besov duality input for the Poisson-gradient +test fields that occur in the infinite-depth vector Poincare proof. + +This is the corrected replacement surface for arbitrary `H¹` inputs: the first +factor is measured by the full dual norm, so constant gradient modes are not +discarded. -/ +def CubePoissonGradientFullEndpointDuality {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) + (G : Vec d → Vec d), + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| ≤ + C * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i)) + +/-- L²-facing full-dual endpoint Besov duality input for Poisson-gradient +test fields. + +This packages the combination of full-dual scalar pairing and positive +test-norm control after the Neumann CZ estimate has already converted the +Poisson-gradient side to the normalized `L²` size of the right-hand side. -/ +def CubePoissonGradientFullL2EndpointDuality {d : ℕ} (Q : TriadicCube d) (C : ℝ) : + Prop := + 0 ≤ C ∧ + ∀ (F : Vec d → ℝ) + (_hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (_hmean : cubeAverage Q F = 0) + (W : MeanZeroNeumannPoissonSolution Q F) + (G : Vec d → Vec d), + (∀ i : Fin d, + MeasureTheory.MemLp (fun x => G x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) → + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| ≤ + C * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) F + +theorem CubePoissonGradientFullEndpointDuality.to_l2Endpoint + {d : ℕ} {Q : TriadicCube d} {Cdual Ccz : ℝ} + (hdual : CubePoissonGradientFullEndpointDuality Q Cdual) + (hcz : CubeNeumannPoissonGradientBesovEstimate Q Ccz) : + CubePoissonGradientFullL2EndpointDuality Q (Cdual * Ccz) := by + refine ⟨mul_nonneg hdual.1 hcz.1, ?_⟩ + intro F hF hmean W G hG + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + simp [hconj] + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + simp [hconj] + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + let S : ℝ := + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + have hA_nonneg : 0 ≤ A := by + refine Finset.sum_nonneg ?_ + intro i _hi + exact cubeBesovDualFullNorm_nonneg + Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) hp0 hpTop + have hpair : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| ≤ + Cdual * A * S := by + simpa [A, S] using hdual.2 F hF hmean W G hG + have hcz_bound : S ≤ Ccz * L := by + simpa [S, L] using hcz.2 F hF hmean W + calc + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| + ≤ Cdual * A * S := hpair + _ ≤ Cdual * A * (Ccz * L) := by + exact mul_le_mul_of_nonneg_left hcz_bound (mul_nonneg hdual.1 hA_nonneg) + _ = (Cdual * Ccz) * A * L := by ring + +theorem CubePoissonGradientFullEndpointDuality.of_dualTestNormEstimate + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + (h : CubePoissonGradientDualTestNormEstimate Q C) : + CubePoissonGradientFullEndpointDuality Q C := by + refine ⟨h.1, ?_⟩ + intro F hF hmean W G hG + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + simp [hconj] + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + simp [hconj] + have hdualNonneg : + ∀ i : Fin d, + 0 ≤ cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + intro i + exact cubeBesovDualFullNorm_nonneg + Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) hp0 hpTop + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + let S : ℝ := + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + have hA_nonneg : 0 ≤ A := by + exact Finset.sum_nonneg (fun i _hi => hdualNonneg i) + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + rcases h.2 F hF hmean W δ hδ_pos with ⟨B, hB_pos, hnorm, hmem, hB_sum⟩ + have hpair : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| ≤ + A * ∑ i : Fin d, B i := by + simpa [A] using + sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_sum_bounds_two_one + Q 1 G (fun x => W.w.toH1Function.grad x) B (by norm_num) + hG hB_pos hnorm hmem hdualNonneg + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| + ≤ A * ∑ i : Fin d, B i := hpair + _ ≤ A * (C * S + δ) := by + exact mul_le_mul_of_nonneg_left (by simpa [S] using hB_sum) hA_nonneg + _ = C * A * S + A * δ := by ring + _ ≤ C * A * S + ε := by linarith + +theorem CubePoissonGradientFullL2EndpointDuality.of_dualTestNormL2Estimate + {d : ℕ} {Q : TriadicCube d} {C : ℝ} + (h : CubePoissonGradientDualTestNormL2Estimate Q C) : + CubePoissonGradientFullL2EndpointDuality Q C := by + refine ⟨h.1, ?_⟩ + intro F hF hmean W G hG + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hp0 : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ 0 := by + simp [hconj] + have hpTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + simp [hconj] + have hdualNonneg : + ∀ i : Fin d, + 0 ≤ cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) := by + intro i + exact cubeBesovDualFullNorm_nonneg + Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) (fun x => G x i) hp0 hpTop + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => G x i) + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) F + have hA_nonneg : 0 ≤ A := by + exact Finset.sum_nonneg (fun i _hi => hdualNonneg i) + apply le_of_forall_pos_le_add + intro ε hε + let δ : ℝ := ε / (A + 1) + have hA1_pos : 0 < A + 1 := by linarith + have hδ_pos : 0 < δ := div_pos hε hA1_pos + rcases h.2 F hF hmean W δ hδ_pos with ⟨B, hB_pos, hnorm, hmem, hB_sum⟩ + have hpair : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| ≤ + A * ∑ i : Fin d, B i := by + simpa [A] using + sum_abs_cubeBesovPairing_le_sum_dualFullNorm_mul_sum_bounds_two_one + Q 1 G (fun x => W.w.toH1Function.grad x) B (by norm_num) + hG hB_pos hnorm hmem hdualNonneg + have hAδ_le : A * δ ≤ ε := by + have hratio : A / (A + 1) ≤ 1 := by + exact (div_le_one hA1_pos).mpr (by linarith) + calc + A * δ = ε * (A / (A + 1)) := by + dsimp [δ] + field_simp [ne_of_gt hA1_pos] + _ ≤ ε * 1 := mul_le_mul_of_nonneg_left hratio hε.le + _ = ε := by ring + calc + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => G x i) + (fun x => W.w.toH1Function.grad x i)| + ≤ A * ∑ i : Fin d, B i := hpair + _ ≤ A * (C * L + δ) := by + exact mul_le_mul_of_nonneg_left (by simpa [L] using hB_sum) hA_nonneg + _ = C * A * L + A * δ := by ring + _ ≤ C * A * L + ε := by linarith + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincare.lean new file mode 100644 index 0000000000..865f47dd22 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincare.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions + +/-! # Full Vector Poincare -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +namespace CubeFullVectorPoincareAnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +/-- The chosen Neumann Poisson solution for the fluctuation right-hand side of +an `H¹` function, using the solver bundled in the full-dual analytic input. -/ +noncomputable def poissonSolutionFor + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + MeanZeroNeumannPoissonSolution Q (u.cubePoissonRhs Q) := + Classical.choose + (h.poisson (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs) + +theorem poissonSolutionFor_equation + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (φ : H1MeanZeroFunction (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * φ.toH1Function x + ∂MeasureTheory.volume := + (h.poissonSolutionFor u).equation φ + +/-- The Poisson equation tested against the mean-zero representative of `u`. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + simpa using h.poissonSolutionFor_equation u (u.toMeanZeroOnCube Q) + +/-- Coordinate expansion of the Poisson-gradient energy pairing. -/ +theorem integral_poissonGradient_vecDot_grad_eq_sum_coord + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + ∑ i : Fin d, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + simp [vecDot] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro i _hi + exact (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) + (h.poissonSolutionFor u).w.toH1Function.grad_memVectorL2 i).integrable_mul + (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) u.grad_memVectorL2 i) + +/-- The tested Poisson equation in coordinate-sum form. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + rw [← h.integral_poissonGradient_vecDot_grad_eq_sum_coord u] + exact h.poissonSolutionFor_equation_toMeanZeroOnCube u + +/-- The tested Poisson equation rewritten in normalized Besov-pairing form. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + calc + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + = ∑ i : Fin d, + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) := by + rw [Finset.mul_sum] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + refine Finset.sum_congr rfl ?_ + intro i _hi + calc + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + = cubeVolume Q * + cubeBesovPairing Q + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + (fun x => u.grad x i) := by + rw [cubeBesovPairing_comm] + _ = ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [← setIntegral_openCubeSet_mul_eq_cubeVolume_mul_cubeBesovPairing] + _ = ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := + h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord u + +/-- Calderon-Zygmund control for the chosen Poisson solution associated to an +`H¹` function's fluctuation right-hand side. -/ +theorem poissonSolutionFor_cz + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) ≤ + h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := + h.cz.2 (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs + (h.poissonSolutionFor u) + +/-- Endpoint Besov duality between an `H¹` gradient and the gradient of the +chosen Neumann Poisson solution, using the full negative Besov norm. -/ +theorem gradient_duality_poissonSolutionFor + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + exact h.duality.2 (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs + (h.poissonSolutionFor u) + (fun x => u.grad x) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) + +/-- Endpoint-duality bound for the full gradient pairing sum against the +chosen Poisson solution. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + exact Finset.abs_sum_le_sum_abs + (s := Finset.univ) + (f := fun i : Fin d => + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + _ ≤ h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := + h.gradient_duality_poissonSolutionFor u + +/-- Full-gradient Poisson pairing bound after inserting the Calderon-Zygmund +estimate for the chosen Poisson solution. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le_cz + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + let B : ℝ := + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + let D : ℝ := h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hfactor_nonneg : 0 ≤ h.dualityConstant * A := by + exact mul_nonneg h.dualityConstant_nonneg hdualNonneg + have hcz : B ≤ D := by + simpa [B, D] using h.poissonSolutionFor_cz u + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.dualityConstant * A * B := by + simpa [A, B] using h.abs_gradient_pairing_sum_poissonSolutionFor_le u + _ ≤ h.dualityConstant * A * D := by + exact mul_le_mul_of_nonneg_left hcz hfactor_nonneg + _ = h.dualityConstant * A * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + rfl + +/-- Constant-grouped version of +`abs_gradient_pairing_sum_poissonSolutionFor_le_cz`. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le_cz_grouped + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact h.abs_gradient_pairing_sum_poissonSolutionFor_le_cz + u hdualNonneg + _ = (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + ring + +/-- The squared fluctuation energy is bounded by the absolute full-gradient +Poisson pairing sum. -/ +theorem poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + rw [← h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing u] + exact mul_le_mul_of_nonneg_left (le_abs_self _) (cubeVolume_nonneg Q) + +/-- Squared fluctuation energy bounded by the full endpoint-duality and +Calderon-Zygmund constants. -/ +theorem poissonEnergy_le_full_duality_cz + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + ((h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + calc + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume + ≤ cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := + h.poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum u + _ ≤ cubeVolume Q * + ((h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact mul_le_mul_of_nonneg_left + (h.abs_gradient_pairing_sum_poissonSolutionFor_le_cz_grouped + u hdualNonneg) + (cubeVolume_nonneg Q) + +/-- Normalized `L²` fluctuation estimate obtained from the full endpoint +duality and Calderon-Zygmund inputs. This is the analytic core of the +full-dual infinite-depth vector Poincare theorem. -/ +theorem cubeLpNorm_cubePoissonRhs_le_full_duality_cz + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) ≤ + (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + let K : ℝ := h.dualityConstant * h.czConstant + have henergy := h.poissonEnergy_le_full_duality_cz u hdualNonneg + have henergy_norm : + cubeVolume Q * L ^ (2 : ℝ) ≤ cubeVolume Q * (K * A * L) := by + calc + cubeVolume Q * L ^ (2 : ℝ) + = ∫ x in openCubeSet Q, + u.cubePoissonRhs Q x * u.cubePoissonRhs Q x ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q (u.cubePoissonRhs Q) u.cubePoissonRhs_memL2_normalizedCubeMeasure] + _ ≤ cubeVolume Q * (K * A * L) := by + simpa [L, A, K, mul_assoc] using henergy + have hsq : L ^ (2 : ℝ) ≤ K * A * L := by + exact (mul_le_mul_iff_of_pos_left (cubeVolume_pos Q)).mp henergy_norm + have hK_nonneg : 0 ≤ K := by + exact mul_nonneg h.dualityConstant_nonneg h.czConstant_nonneg + have hy_nonneg : 0 ≤ K * A := by + exact mul_nonneg hK_nonneg hdualNonneg + have hL_nonneg : 0 ≤ L := by + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hsq' : L ^ 2 ≤ (K * A) * L := by + simpa [mul_assoc] using hsq + exact nonneg_le_of_sq_le_mul_self hL_nonneg hy_nonneg hsq' + +/-- Infinite-depth vector Poincare estimate with the natural constant supplied +by the cube-local full-dual analytic input bundle. -/ +theorem dualFullVectorPoincareEstimate_of_h1Function + (h : CubeFullVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + CubeDualFullVectorPoincareEstimate Q + (h.dualityConstant * h.czConstant) + (fun x => u x) + (fun x => u.grad x) := by + simpa [CubeDualFullVectorPoincareEstimate] using + h.cubeLpNorm_cubePoissonRhs_le_full_duality_cz u hdualNonneg + +end CubeFullVectorPoincareAnalyticInput + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincareL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincareL2.lean new file mode 100644 index 0000000000..f3846d5ff4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/FullVectorPoincareL2.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions + +/-! # Full Vector Poincare L2 -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +namespace CubeFullVectorPoincareL2AnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +/-- The chosen Neumann Poisson solution for the fluctuation right-hand side of +an `H¹` function, using the solver bundled with the direct `L²` endpoint input. -/ +noncomputable def poissonSolutionFor + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + MeanZeroNeumannPoissonSolution Q (u.cubePoissonRhs Q) := + Classical.choose + (h.poisson (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs) + +theorem poissonSolutionFor_equation + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (φ : H1MeanZeroFunction (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * φ.toH1Function x + ∂MeasureTheory.volume := + (h.poissonSolutionFor u).equation φ + +/-- The direct-`L²` Poisson equation tested against the mean-zero +representative of `u`. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + simpa using h.poissonSolutionFor_equation u (u.toMeanZeroOnCube Q) + +/-- Coordinate expansion of the direct-`L²` Poisson-gradient energy pairing. -/ +theorem integral_poissonGradient_vecDot_grad_eq_sum_coord + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + ∑ i : Fin d, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + simp [vecDot] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro i _hi + exact (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) + (h.poissonSolutionFor u).w.toH1Function.grad_memVectorL2 i).integrable_mul + (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) u.grad_memVectorL2 i) + +/-- The direct-`L²` tested Poisson equation in coordinate-sum form. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + rw [← h.integral_poissonGradient_vecDot_grad_eq_sum_coord u] + exact h.poissonSolutionFor_equation_toMeanZeroOnCube u + +/-- The direct-`L²` tested Poisson equation rewritten in normalized +Besov-pairing form. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + calc + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + = ∑ i : Fin d, + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) := by + rw [Finset.mul_sum] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + refine Finset.sum_congr rfl ?_ + intro i _hi + calc + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + = cubeVolume Q * + cubeBesovPairing Q + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + (fun x => u.grad x i) := by + rw [cubeBesovPairing_comm] + _ = ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [← setIntegral_openCubeSet_mul_eq_cubeVolume_mul_cubeBesovPairing] + _ = ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := + h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord u + +/-- Direct `L²` endpoint control for an `H¹` gradient paired against the +chosen Neumann Poisson gradient. -/ +theorem gradient_l2Endpoint_poissonSolutionFor + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + exact h.endpoint.2 (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs + (h.poissonSolutionFor u) + (fun x => u.grad x) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) + +/-- Absolute-value bound for the full gradient pairing sum from the direct +`L²` endpoint. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le_l2Endpoint + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + exact Finset.abs_sum_le_sum_abs + (s := Finset.univ) + (f := fun i : Fin d => + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + _ ≤ h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := + h.gradient_l2Endpoint_poissonSolutionFor u + +/-- The squared fluctuation energy is bounded by the absolute full-gradient +Poisson pairing sum for the direct `L²` endpoint route. -/ +theorem poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + rw [← h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing u] + exact mul_le_mul_of_nonneg_left (le_abs_self _) (cubeVolume_nonneg Q) + +/-- Squared fluctuation energy bounded by the direct full-dual `L²` endpoint +constant. -/ +theorem poissonEnergy_le_full_l2Endpoint + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + (h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + calc + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume + ≤ cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := + h.poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum u + _ ≤ cubeVolume Q * + (h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact mul_le_mul_of_nonneg_left + (h.abs_gradient_pairing_sum_poissonSolutionFor_le_l2Endpoint u) + (cubeVolume_nonneg Q) + +/-- Normalized `L²` fluctuation estimate obtained directly from the full-dual +`L²` endpoint package. -/ +theorem cubeLpNorm_cubePoissonRhs_le_full_l2Endpoint + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) ≤ + h.endpointConstant * + (∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + let K : ℝ := h.endpointConstant + have henergy := h.poissonEnergy_le_full_l2Endpoint u + have henergy_norm : + cubeVolume Q * L ^ (2 : ℝ) ≤ cubeVolume Q * (K * A * L) := by + calc + cubeVolume Q * L ^ (2 : ℝ) + = ∫ x in openCubeSet Q, + u.cubePoissonRhs Q x * u.cubePoissonRhs Q x ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q (u.cubePoissonRhs Q) u.cubePoissonRhs_memL2_normalizedCubeMeasure] + _ ≤ cubeVolume Q * (K * A * L) := by + simpa [L, A, K, mul_assoc] using henergy + have hsq : L ^ (2 : ℝ) ≤ K * A * L := by + exact (mul_le_mul_iff_of_pos_left (cubeVolume_pos Q)).mp henergy_norm + have hK_nonneg : 0 ≤ K := by + exact h.endpointConstant_nonneg + have hy_nonneg : 0 ≤ K * A := by + exact mul_nonneg hK_nonneg hdualNonneg + have hL_nonneg : 0 ≤ L := by + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hsq' : L ^ 2 ≤ (K * A) * L := by + simpa [mul_assoc] using hsq + exact nonneg_le_of_sq_le_mul_self hL_nonneg hy_nonneg hsq' + +/-- Infinite-depth full-dual vector Poincare estimate from the direct +`L²` endpoint input bundle. -/ +theorem dualFullVectorPoincareEstimate_of_h1Function + (h : CubeFullVectorPoincareL2AnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualFullNorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + CubeDualFullVectorPoincareEstimate Q + h.endpointConstant + (fun x => u x) + (fun x => u.grad x) := by + simpa [CubeDualFullVectorPoincareEstimate] using + h.cubeLpNorm_cubePoissonRhs_le_full_l2Endpoint u hdualNonneg + +end CubeFullVectorPoincareL2AnalyticInput + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/ProjectedVectorPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/ProjectedVectorPoincare.lean new file mode 100644 index 0000000000..d11270050e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/ProjectedVectorPoincare.lean @@ -0,0 +1,607 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubePoisson.AnalyticInput +public import LeanPool.CoarseGraining.Homogenization.Besov.Poincare.HarmonicGradient.Definitions + +/-! # Projected Vector Poincare -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +namespace CubeProjectedVectorPoincareAnalyticInput + +variable {d : ℕ} {Q : TriadicCube d} + +/-- The chosen Neumann Poisson solution for the fluctuation right-hand side of +an `H¹` function, using the solver bundled in the analytic input. -/ +noncomputable def poissonSolutionFor + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + MeanZeroNeumannPoissonSolution Q (u.cubePoissonRhs Q) := + Classical.choose + (h.poisson (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs) + +theorem poissonSolutionFor_equation + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (φ : H1MeanZeroFunction (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) + (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * φ.toH1Function x + ∂MeasureTheory.volume := + (h.poissonSolutionFor u).equation φ + +/-- The Poisson equation tested against the mean-zero representative of `u`. +This is the integration-by-parts entry point for the single-cube Poincare +proof. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + simpa using h.poissonSolutionFor_equation u (u.toMeanZeroOnCube Q) + +/-- Coordinate expansion of the Poisson-gradient energy pairing. -/ +theorem integral_poissonGradient_vecDot_grad_eq_sum_coord + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume = + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + calc + ∫ x in openCubeSet Q, + vecDot ((h.poissonSolutionFor u).w.toH1Function.grad x) (u.grad x) + ∂MeasureTheory.volume + = ∫ x in openCubeSet Q, + ∑ i : Fin d, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + simp [vecDot] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro i _hi + exact (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) + (h.poissonSolutionFor u).w.toH1Function.grad_memVectorL2 i).integrable_mul + (memScalarL2_coord_of_memVectorL2 + (U := openCubeSet Q) u.grad_memVectorL2 i) + +/-- The tested Poisson equation in coordinate-sum form. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + rw [← h.integral_poissonGradient_vecDot_grad_eq_sum_coord u] + exact h.poissonSolutionFor_equation_toMeanZeroOnCube u + +/-- The tested Poisson equation rewritten in normalized Besov-pairing form. +The remaining analytic step is to replace the unprojected `u`-gradient +pairings by their projected limits. -/ +theorem poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) = + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := by + calc + cubeVolume Q * + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + = ∑ i : Fin d, + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) := by + rw [Finset.mul_sum] + _ = ∑ i : Fin d, + ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + refine Finset.sum_congr rfl ?_ + intro i _hi + calc + cubeVolume Q * + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + = cubeVolume Q * + cubeBesovPairing Q + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + (fun x => u.grad x i) := by + rw [cubeBesovPairing_comm] + _ = ∫ x in openCubeSet Q, + (h.poissonSolutionFor u).w.toH1Function.grad x i * u.grad x i + ∂MeasureTheory.volume := by + rw [← setIntegral_openCubeSet_mul_eq_cubeVolume_mul_cubeBesovPairing] + _ = ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume := + h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_coord u + +/-- The finite-depth projected gradient pairings converge to the unprojected +pairing sum appearing in the tested Poisson identity. -/ +theorem tendsto_projectedGradient_pairing_sum_poissonSolutionFor + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + Filter.Tendsto + (fun n : ℕ => + ∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q (n + 1) (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + Filter.atTop + (𝓝 + (∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i))) := by + refine tendsto_finsetSum Finset.univ ?_ + intro i _hi + have hconj : cubeBesovConjExponent (2 : ℝ≥0∞) = (2 : ℝ≥0∞) := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + have hconjTop : cubeBesovConjExponent (2 : ℝ≥0∞) ≠ ∞ := by + simp [hconj] + have hW : + MeasureTheory.MemLp + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + (cubeBesovConjExponent (2 : ℝ≥0∞)) (normalizedCubeMeasure Q) := by + simpa [hconj] using + ((h.poissonSolutionFor u).w.toH1Function.grad_coord_memL2_normalizedCubeMeasure i) + simpa [hconj] using + tendsto_cubeBesovPairing_projection_left_of_memLp + Q (2 : ℝ≥0∞) + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + (u.grad_coord_memL2_normalizedCubeMeasure i) + hW + (by norm_num) (by simp) hconjTop + +/-- Calderon-Zygmund control for the chosen Poisson solution associated to an +`H¹` function's fluctuation right-hand side. -/ +theorem poissonSolutionFor_cz + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) ≤ + h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := + h.cz.2 (u.cubePoissonRhs Q) + u.cubePoissonRhs_memL2_normalizedCubeMeasure + u.cubeAverage_cubePoissonRhs + (h.poissonSolutionFor u) + +/-- Endpoint projected Besov duality between an `H¹` gradient and the gradient +of the chosen Neumann Poisson solution. -/ +theorem projectedGradient_duality_poissonSolutionFor + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) (N : ℕ) : + ∑ i : Fin d, + |cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + exact h.duality.2 N (fun x => u.grad x) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) + (fun i => (h.poissonSolutionFor u).w.toH1Function.grad_memL2_normalizedCubeMeasure i) + +/-- Endpoint Besov duality between an `H¹` gradient and the gradient of the +chosen Neumann Poisson solution, using the full negative Besov seminorm. -/ +theorem gradient_duality_poissonSolutionFor + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.fullDualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + exact h.fullDuality.2 (fun x => u.grad x) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x) + (fun i => u.grad_coord_memL2_normalizedCubeMeasure i) + (fun i => (h.poissonSolutionFor u).w.toH1Function.grad_memL2_normalizedCubeMeasure i) + +/-- Fixed-depth endpoint-duality bound for the projected gradient pairing sum +against the chosen Poisson solution. -/ +theorem abs_projectedGradient_pairing_sum_poissonSolutionFor_le + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) (N : ℕ) : + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ ∑ i : Fin d, + |cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + exact Finset.abs_sum_le_sum_abs + (s := Finset.univ) + (f := fun i : Fin d => + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + _ ≤ h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := + h.projectedGradient_duality_poissonSolutionFor u N + +/-- Endpoint-duality bound for the full gradient pairing sum against the +chosen Poisson solution. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.fullDualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ ∑ i : Fin d, + |cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + exact Finset.abs_sum_le_sum_abs + (s := Finset.univ) + (f := fun i : Fin d => + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) + _ ≤ h.fullDualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)) := + h.gradient_duality_poissonSolutionFor u + +/-- Fixed-depth projected Poisson pairing bound after inserting the +Calderon-Zygmund estimate for the chosen Poisson solution. The nonnegativity +hypothesis is the only algebraic side condition needed to multiply the CZ +inequality into the endpoint-duality bound. -/ +theorem abs_projectedGradient_pairing_sum_poissonSolutionFor_le_cz + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) (N : ℕ) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) : + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i)) + let B : ℝ := + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + let D : ℝ := h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hfactor_nonneg : 0 ≤ h.dualityConstant * A := by + exact mul_nonneg h.dualityConstant_nonneg hdualNonneg + have hcz : B ≤ D := by + simpa [B, D] using h.poissonSolutionFor_cz u + calc + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.dualityConstant * A * B := by + simpa [A, B] using h.abs_projectedGradient_pairing_sum_poissonSolutionFor_le u N + _ ≤ h.dualityConstant * A * D := by + exact mul_le_mul_of_nonneg_left hcz hfactor_nonneg + _ = h.dualityConstant * A * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + rfl + +/-- Full-gradient Poisson pairing bound after inserting the Calderon-Zygmund +estimate for the chosen Poisson solution. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le_cz + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + h.fullDualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + let B : ℝ := + ∑ i : Fin d, + cubeBesovCircNorm Q 1 (2 : ℝ≥0∞) (∞ : ℝ≥0∞) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i) + let D : ℝ := h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hfactor_nonneg : 0 ≤ h.fullDualityConstant * A := by + exact mul_nonneg h.fullDualityConstant_nonneg hdualNonneg + have hcz : B ≤ D := by + simpa [B, D] using h.poissonSolutionFor_cz u + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.fullDualityConstant * A * B := by + simpa [A, B] using h.abs_gradient_pairing_sum_poissonSolutionFor_le u + _ ≤ h.fullDualityConstant * A * D := by + exact mul_le_mul_of_nonneg_left hcz hfactor_nonneg + _ = h.fullDualityConstant * A * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + rfl + +/-- Constant-grouped version of +`abs_projectedGradient_pairing_sum_poissonSolutionFor_le_cz`. -/ +theorem abs_projectedGradient_pairing_sum_poissonSolutionFor_le_cz_grouped + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) (N : ℕ) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) : + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (cubeProjection Q N (fun x => u.grad x i)) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.dualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact h.abs_projectedGradient_pairing_sum_poissonSolutionFor_le_cz + u N hdualNonneg + _ = (h.dualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (cubeProjection Q N (fun x => u.grad x i))) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + ring + +/-- Constant-grouped version of +`abs_gradient_pairing_sum_poissonSolutionFor_le_cz`. -/ +theorem abs_gradient_pairing_sum_poissonSolutionFor_le_cz_grouped + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| ≤ + (h.fullDualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + calc + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| + ≤ h.fullDualityConstant * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + (h.czConstant * cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact h.abs_gradient_pairing_sum_poissonSolutionFor_le_cz + u hdualNonneg + _ = (h.fullDualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) := by + ring + +/-- The squared fluctuation energy is bounded by the absolute full-gradient +Poisson pairing sum. -/ +theorem poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := by + rw [← h.poissonSolutionFor_equation_toMeanZeroOnCube_sum_pairing u] + exact mul_le_mul_of_nonneg_left (le_abs_self _) (cubeVolume_nonneg Q) + +/-- Squared fluctuation energy bounded by the full endpoint-duality and +Calderon-Zygmund constants. -/ +theorem poissonEnergy_le_full_duality_cz + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume ≤ + cubeVolume Q * + ((h.fullDualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + calc + ∫ x in openCubeSet Q, u.cubePoissonRhs Q x * u.cubePoissonRhs Q x + ∂MeasureTheory.volume + ≤ cubeVolume Q * + |∑ i : Fin d, + cubeBesovPairing Q + (fun x => u.grad x i) + (fun x => (h.poissonSolutionFor u).w.toH1Function.grad x i)| := + h.poissonEnergy_le_cubeVolume_mul_abs_gradient_pairing_sum u + _ ≤ cubeVolume Q * + ((h.fullDualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) * + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q)) := by + exact mul_le_mul_of_nonneg_left + (h.abs_gradient_pairing_sum_poissonSolutionFor_le_cz_grouped + u hdualNonneg) + (cubeVolume_nonneg Q) + +/-- Normalized `L²` fluctuation estimate obtained from the full endpoint +duality and Calderon-Zygmund inputs. This is the analytic core of the +infinite-depth vector Poincare theorem. -/ +theorem cubeLpNorm_cubePoissonRhs_le_full_duality_cz + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) ≤ + (h.fullDualityConstant * h.czConstant) * + (∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) := by + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + let A : ℝ := + ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i) + let K : ℝ := h.fullDualityConstant * h.czConstant + have henergy := h.poissonEnergy_le_full_duality_cz u hdualNonneg + have henergy_norm : + cubeVolume Q * L ^ (2 : ℝ) ≤ cubeVolume Q * (K * A * L) := by + calc + cubeVolume Q * L ^ (2 : ℝ) + = ∫ x in openCubeSet Q, + u.cubePoissonRhs Q x * u.cubePoissonRhs Q x ∂MeasureTheory.volume := by + rw [setIntegral_openCubeSet_sq_eq_cubeVolume_mul_cubeLpNorm_two_rpow + Q (u.cubePoissonRhs Q) u.cubePoissonRhs_memL2_normalizedCubeMeasure] + _ ≤ cubeVolume Q * (K * A * L) := by + simpa [L, A, K, mul_assoc] using henergy + have hsq : L ^ (2 : ℝ) ≤ K * A * L := by + exact (mul_le_mul_iff_of_pos_left (cubeVolume_pos Q)).mp henergy_norm + have hK_nonneg : 0 ≤ K := by + exact mul_nonneg h.fullDualityConstant_nonneg h.czConstant_nonneg + have hy_nonneg : 0 ≤ K * A := by + exact mul_nonneg hK_nonneg hdualNonneg + have hL_nonneg : 0 ≤ L := by + exact cubeLpNorm_nonneg Q (2 : ℝ≥0∞) (u.cubePoissonRhs Q) + have hsq' : L ^ 2 ≤ (K * A) * L := by + simpa [mul_assoc] using hsq + exact nonneg_le_of_sq_le_mul_self hL_nonneg hy_nonneg hsq' + +/-- Infinite-depth vector Poincare estimate with the natural constant supplied +by the cube-local analytic input bundle. -/ +theorem dualMeanZeroVectorPoincareEstimate_of_h1Function + (h : CubeProjectedVectorPoincareAnalyticInput Q) + (u : H1Function (openCubeSet Q)) + (hdualNonneg : + 0 ≤ ∑ i : Fin d, + cubeBesovDualMeanZeroSeminorm Q 1 (2 : ℝ≥0∞) (1 : ℝ≥0∞) + (fun x => u.grad x i)) : + CubeDualMeanZeroVectorPoincareEstimate Q + (h.fullDualityConstant * h.czConstant) + (fun x => u x) + (fun x => u.grad x) := by + simpa [CubeDualMeanZeroVectorPoincareEstimate] using + h.cubeLpNorm_cubePoissonRhs_le_full_duality_cz u hdualNonneg + +end CubeProjectedVectorPoincareAnalyticInput + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/Solver.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/Solver.lean new file mode 100644 index 0000000000..3b8d06b0a4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubePoisson/Solver.lean @@ -0,0 +1,629 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Solver -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal Topology + +/-! +# Cube-local Poisson solver and normalized-norm bridges + +This file records the Poisson-solver structure used by the cube-local Poincare +arguments, together with the bridges between `MemL2On (openCubeSet Q)` and the +normalized-cube `MemLp` measure that make the variational layer applicable. +-/ + +theorem nonneg_le_of_sq_le_mul_self {x y : ℝ} + (hx : 0 ≤ x) (hy : 0 ≤ y) (h : x ^ 2 ≤ y * x) : + x ≤ y := by + by_cases hx0 : x = 0 + · rw [hx0] + exact hy + · have hxpos : 0 < x := lt_of_le_of_ne hx (Ne.symm hx0) + have h' : x * x ≤ y * x := by + simpa [pow_two] using h + exact (mul_le_mul_iff_of_pos_right hxpos).mp h' + +/-- A mean-zero Neumann solution of `-Δw = F` on a cube, in weak form. The test +space is mean-zero `H¹`, which fixes the additive constant. -/ +structure MeanZeroNeumannPoissonSolution {d : ℕ} (Q : TriadicCube d) + (F : Vec d → ℝ) where + w : H1MeanZeroFunction (openCubeSet Q) + equation : + ∀ φ : H1MeanZeroFunction (openCubeSet Q), + ∫ x in openCubeSet Q, vecDot (w.toH1Function.grad x) (φ.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * φ.toH1Function x ∂MeasureTheory.volume + +namespace MeanZeroNeumannPoissonSolution + +variable {d : ℕ} {Q : TriadicCube d} {F : Vec d → ℝ} + +@[simp] theorem equation_self (W : MeanZeroNeumannPoissonSolution Q F) : + ∫ x in openCubeSet Q, vecDot (W.w.toH1Function.grad x) (W.w.toH1Function.grad x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, F x * W.w.toH1Function x ∂MeasureTheory.volume := + W.equation W.w + +end MeanZeroNeumannPoissonSolution + +/-- Existence of the mean-zero Neumann Poisson solver on a cube for normalized +`L²` right-hand sides with zero normalized average. -/ +def HasMeanZeroNeumannPoissonSolverOnCube {d : ℕ} (Q : TriadicCube d) : Prop := + ∀ F : Vec d → ℝ, + MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q) → + cubeAverage Q F = 0 → + ∃ _W : MeanZeroNeumannPoissonSolution Q F, True + +theorem memL2On_openCubeSet_of_memLp_normalizedCubeMeasure {d : ℕ} + (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MemL2On (openCubeSet Q) F := by + have hle : + cubeMeasure Q ≤ ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q := by + have hvol_nonneg : 0 ≤ cubeVolume Q := cubeVolume_nonneg Q + have hmul : + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal ((cubeVolume Q)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul hvol_nonneg] + have hreal : cubeVolume Q * (cubeVolume Q)⁻¹ = 1 := by + field_simp [(cubeVolume_pos Q).ne'] + rw [hreal] + norm_num + have heq : ENNReal.ofReal (cubeVolume Q) • normalizedCubeMeasure Q = cubeMeasure Q := by + rw [normalizedCubeMeasure] + ext s + rw [MeasureTheory.Measure.smul_apply, MeasureTheory.Measure.smul_apply] + change + ENNReal.ofReal (cubeVolume Q) * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * (cubeMeasure Q) s) = + (cubeMeasure Q) s + rw [← mul_assoc, hmul, one_mul] + exact le_of_eq heq.symm + have hFCube : + MeasureTheory.MemLp F (2 : ℝ≥0∞) (cubeMeasure Q) := + hF.of_measure_le_smul (c := ENNReal.ofReal (cubeVolume Q)) + ENNReal.ofReal_ne_top hle + simpa [MemL2On, cubeMeasure, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hFCube + +private theorem real_rpow_half_le_self_add_one {a : ℝ} (ha : 0 ≤ a) : + a ^ (1 / 2 : ℝ) ≤ a + 1 := by + by_cases ha_le_one : a ≤ 1 + · calc + a ^ (1 / 2 : ℝ) ≤ 1 := by + exact Real.rpow_le_one ha ha_le_one (by norm_num) + _ ≤ a + 1 := by linarith + · have hone_le_a : 1 ≤ a := le_of_lt (lt_of_not_ge ha_le_one) + calc + a ^ (1 / 2 : ℝ) ≤ a := by + exact Real.rpow_le_self_of_one_le hone_le_a (by norm_num) + _ ≤ a + 1 := by linarith + +theorem cubeLpNorm_two_le_volume_inv_add_one_mul_norm_toScalarL2_openCubeSet {d : ℕ} + (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) f ≤ + ((cubeVolume Q)⁻¹ + 1) * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openCubeSet Q) + let hopen : MemScalarL2 (openCubeSet Q) f := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hc_le : c ^ ((1 / (2 : ℝ≥0∞)).toReal) ≤ + ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + exact ENNReal.ofReal_le_ofReal + (real_rpow_half_le_self_add_one (inv_nonneg.mpr (cubeVolume_nonneg Q))) + have hμ_eq : cubeMeasure Q = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + have hopen_norm : + ‖Homogenization.toScalarL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + have htop : + ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ ≠ ∞ := by + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top hopen.eLpNorm_lt_top.ne + have hmain : + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ := by + calc + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) (normalizedCubeMeasure Q) + = c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ := by + rw [normalizedCubeMeasure] + dsimp [c] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞) f _ + (by rw [hμ_eq]; exact hopen.aestronglyMeasurable)] + simp [hμ_eq, μ] + _ ≤ ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ := by + exact mul_le_mul_left hc_le _ + have htoReal : + cubeLpNorm Q (2 : ℝ≥0∞) f ≤ + (ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q 2 f hf.aestronglyMeasurable] + exact ENNReal.toReal_mono htop hmain + calc + cubeLpNorm Q (2 : ℝ≥0∞) f + ≤ (ENNReal.ofReal (((cubeVolume Q)⁻¹) + 1) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := htoReal + _ = ((cubeVolume Q)⁻¹ + 1) * + ‖Homogenization.toScalarL2 hopen‖ := by + rw [ENNReal.toReal_mul] + rw [ENNReal.toReal_ofReal + (by + have hInv : 0 ≤ (cubeVolume Q)⁻¹ := + inv_nonneg.mpr (cubeVolume_nonneg Q) + linarith)] + rw [hopen_norm] + +/-- Exact normalized-to-unnormalized `L²` conversion on an open cube. + +The older inequality above uses the harmless but scale-wasteful factor +`(cubeVolume Q)⁻¹ + 1`. For the q=2 Calderon-Zygmund path we need the exact +probability-measure normalization factor. -/ +theorem cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openCubeSet {d : ℕ} + (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeLpNorm Q (2 : ℝ≥0∞) f = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openCubeSet Q) + let hopen : MemScalarL2 (openCubeSet Q) f := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hμ_eq : cubeMeasure Q = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + have hnorm_eq : + cubeLpNorm Q (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q 2 f hf.aestronglyMeasurable] + unfold normalizedCubeMeasure + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞) f _ + (by rw [hμ_eq]; exact hopen.aestronglyMeasurable)] + simp [c, hμ_eq, μ] + have hopen_norm : + ‖Homogenization.toScalarL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + have hfactor : + (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal = + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg + (inv_nonneg.mpr (cubeVolume_nonneg Q)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _)] + rw [hnorm_eq, ENNReal.toReal_mul, hopen_norm, hfactor] + +theorem norm_toScalarL2_openCubeSet_le_volume_add_one_mul_cubeLpNorm_two {d : ℕ} + (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ ≤ + (cubeVolume Q + 1) * cubeLpNorm Q (2 : ℝ≥0∞) f := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn (openCubeSet Q) + let hopen : MemScalarL2 (openCubeSet Q) f := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf + have hhalf : ((1 / (2 : ℝ≥0∞)).toReal : ℝ) = (1 / 2 : ℝ) := by + norm_num + have hμ_eq : cubeMeasure Q = μ := by + dsimp [μ, volumeMeasureOn] + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q + have hc_pos : c ≠ 0 := by + dsimp [c] + exact ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + have hnorm_eq : + cubeLpNorm Q (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal) * + MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + rw [cubeLpNorm_eq_eLpNorm_toReal Q 2 f hf.aestronglyMeasurable] + unfold normalizedCubeMeasure + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top + (by norm_num : (2 : ℝ≥0∞) ≠ ∞) f _ + (by rw [hμ_eq]; exact hopen.aestronglyMeasurable)] + simp [c, hμ_eq, μ] + have hopen_norm : + ‖Homogenization.toScalarL2 hopen‖ = + (MeasureTheory.eLpNorm f (2 : ℝ≥0∞) μ).toReal := by + dsimp [hopen, μ] + rw [Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + have hc_factor_pos : + 0 < (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal := by + have hc_rpow_ne_zero : c ^ ((1 / (2 : ℝ≥0∞)).toReal) ≠ 0 := by + rw [hhalf] + exact ne_of_gt + (ENNReal.rpow_pos_of_nonneg (pos_iff_ne_zero.mpr hc_pos) + (by norm_num : 0 ≤ (1 / 2 : ℝ))) + have hc_rpow_ne_top : c ^ ((1 / (2 : ℝ≥0∞)).toReal) ≠ ∞ := by + rw [hhalf] + exact ENNReal.rpow_ne_top_of_ne_zero hc_pos ENNReal.ofReal_ne_top + exact ENNReal.toReal_pos hc_rpow_ne_zero hc_rpow_ne_top + have hcube_eq : + cubeLpNorm Q (2 : ℝ≥0∞) f = + (c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal * + ‖Homogenization.toScalarL2 hopen‖ := by + rw [hnorm_eq, ENNReal.toReal_mul] + rw [hopen_norm] + have hfactor_inv_le : ((c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal)⁻¹ ≤ + cubeVolume Q + 1 := by + rw [hhalf] + dsimp [c] + rw [ENNReal.ofReal_rpow_of_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) + (by norm_num : 0 ≤ (1 / 2 : ℝ))] + rw [ENNReal.toReal_ofReal + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _)] + have hvol_pos : 0 < cubeVolume Q := cubeVolume_pos Q + have hsqrt_inv : + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ))⁻¹ = + (cubeVolume Q) ^ (1 / 2 : ℝ) := by + rw [Real.inv_rpow (le_of_lt hvol_pos) (1 / 2 : ℝ)] + rw [inv_inv] + rw [hsqrt_inv] + exact real_rpow_half_le_self_add_one (cubeVolume_nonneg Q) + calc + ‖Homogenization.toScalarL2 hopen‖ + = ((c ^ ((1 / (2 : ℝ≥0∞)).toReal)).toReal)⁻¹ * + cubeLpNorm Q (2 : ℝ≥0∞) f := by + rw [hcube_eq] + field_simp [hc_factor_pos.ne'] + _ ≤ (cubeVolume Q + 1) * cubeLpNorm Q (2 : ℝ≥0∞) f := by + exact mul_le_mul_of_nonneg_right hfactor_inv_le + (cubeLpNorm_nonneg Q (2 : ℝ≥0∞) f) + +theorem norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two {d : ℕ} + (Q : TriadicCube d) {f : Vec d → ℝ} + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ = + (cubeVolume Q) ^ (1 / 2 : ℝ) * cubeLpNorm Q (2 : ℝ≥0∞) f := by + let A : ℝ := ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) + let N : ℝ := + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hf)‖ + let L : ℝ := cubeLpNorm Q (2 : ℝ≥0∞) f + have hA_pos : 0 < A := by + dsimp [A] + exact Real.rpow_pos_of_pos (inv_pos.mpr (cubeVolume_pos Q)) _ + have hL_eq : L = A * N := by + simpa [A, N, L] using + cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openCubeSet Q hf + have hA_inv : + A⁻¹ = (cubeVolume Q) ^ (1 / 2 : ℝ) := by + dsimp [A] + rw [Real.inv_rpow (le_of_lt (cubeVolume_pos Q)) (1 / 2 : ℝ)] + rw [inv_inv] + calc + N = A⁻¹ * L := by + rw [hL_eq] + field_simp [hA_pos.ne'] + _ = (cubeVolume Q) ^ (1 / 2 : ℝ) * L := by + rw [hA_inv] + _ = (cubeVolume Q) ^ (1 / 2 : ℝ) * + cubeLpNorm Q (2 : ℝ≥0∞) f := rfl + +noncomputable def meanZeroNeumannPoissonSolutionOfCoerciveEstimate {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + MeanZeroNeumannPoissonSolution Q F := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hF_open : MemScalarL2 (openCubeSet Q) F := by + simpa [MemScalarL2, volumeMeasureOn] using + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + refine + { w := H1MeanZeroFunction.scalarRhsProblemSolution (U := openCubeSet Q) hF_open hC + equation := ?_ } + intro φ + simpa using + H1MeanZeroFunction.scalarRhsProblemSolution_firstVariation_eq_integral + (U := openCubeSet Q) hF_open hC φ + +/-- Mean-zero Neumann Poisson existence on cubes, constructed from the +coercive Hilbert variational layer and the bounded-open-convex Poincare +estimate for cubes. -/ +theorem cubeMeanZeroNeumannPoissonSolverOnCube {d : ℕ} (Q : TriadicCube d) : + HasMeanZeroNeumannPoissonSolverOnCube Q := by + intro F hF _hmean + exact ⟨meanZeroNeumannPoissonSolutionOfCoerciveEstimate Q F hF, True.intro⟩ + +noncomputable def cubeMeanZeroH1CoerciveConstant {d : ℕ} (Q : TriadicCube d) : ℝ := by + exact (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).fixedValue + +theorem cubeMeanZeroH1CoerciveConstant_nonneg {d : ℕ} (Q : TriadicCube d) : + 0 ≤ cubeMeanZeroH1CoerciveConstant Q := by + unfold cubeMeanZeroH1CoerciveConstant + exact (scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q).constant_nonneg + +theorem cubeMeanZeroH1CoerciveConstant_eq_scale_mul_unit {d : ℕ} + (Q : TriadicCube d) : + cubeMeanZeroH1CoerciveConstant Q = + cubeScaleFactor Q * + (originCubeMeanZeroH1CoerciveEstimate d 0).fixedValue := by + unfold cubeMeanZeroH1CoerciveConstant + rw [scaledTranslatedCubeMeanZeroH1CoerciveEstimate_constant] + +theorem meanZeroNeumannPoissonSolution_norm_gradToHilbertVectorL2_le {d : ℕ} + (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (W : MeanZeroNeumannPoissonSolution Q F) : + ‖W.w.gradToHilbertVectorL2‖ ≤ + cubeMeanZeroH1CoerciveConstant Q * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖ := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hF_open : MemScalarL2 (openCubeSet Q) F := + memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + change ‖W.w.gradToHilbertVectorL2‖ ≤ + hC.fixedValue * ‖Homogenization.toScalarL2 hF_open‖ + let G : HilbertVectorL2 (openCubeSet Q) := W.w.gradToHilbertVectorL2 + have henergy_left : + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (W.w.toH1Function.grad x) + ∂MeasureTheory.volume = + inner ℝ G G := by + dsimp [G] + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + (inner_toHilbertVectorL2OfVecField_eq_integral + (U := openCubeSet Q) + W.w.toH1Function.grad_memVectorL2 + W.w.toH1Function.grad_memVectorL2).symm + have hrhs_inner : + ∫ x in openCubeSet Q, F x * W.w.toH1Function x ∂MeasureTheory.volume = + inner ℝ (Homogenization.toScalarL2 hF_open) W.w.toScalarL2 := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [Homogenization.coeFn_toScalarL2 hF_open, + H1Function.coeFn_toScalarL2 W.w.toH1Function] + with x hFx hWx + rw [hFx] + change F x * W.w.toH1Function.toFun x = + F x * W.w.toH1Function.toScalarL2 x + rw [hWx] + have hinner_eq : + inner ℝ G G = inner ℝ (Homogenization.toScalarL2 hF_open) W.w.toScalarL2 := by + calc + inner ℝ G G = + ∫ x in openCubeSet Q, + vecDot (W.w.toH1Function.grad x) (W.w.toH1Function.grad x) + ∂MeasureTheory.volume := henergy_left.symm + _ = ∫ x in openCubeSet Q, F x * W.w.toH1Function x ∂MeasureTheory.volume := + W.equation_self + _ = inner ℝ (Homogenization.toScalarL2 hF_open) W.w.toScalarL2 := hrhs_inner + have hsq_le : + ‖G‖ ^ 2 ≤ + (hC.fixedValue * ‖Homogenization.toScalarL2 hF_open‖) * ‖G‖ := by + calc + ‖G‖ ^ 2 = inner ℝ G G := by + symm + exact real_inner_self_eq_norm_sq G + _ = inner ℝ (Homogenization.toScalarL2 hF_open) W.w.toScalarL2 := hinner_eq + _ ≤ |inner ℝ (Homogenization.toScalarL2 hF_open) W.w.toScalarL2| := + le_abs_self _ + _ ≤ ‖Homogenization.toScalarL2 hF_open‖ * ‖W.w.toScalarL2‖ := + abs_real_inner_le_norm _ _ + _ ≤ ‖Homogenization.toScalarL2 hF_open‖ * + (hC.fixedValue * W.w.gradientL2Norm) := by + exact mul_le_mul_of_nonneg_left + (by + simpa [H1MeanZeroFunction.valueL2Norm] using hC.bound W.w) + (norm_nonneg _) + _ ≤ ‖Homogenization.toScalarL2 hF_open‖ * (hC.fixedValue * ‖G‖) := by + refine mul_le_mul_of_nonneg_left ?_ (norm_nonneg _) + exact mul_le_mul_of_nonneg_left + (H1MeanZeroFunction.gradientL2Norm_le_norm_gradToHilbertVectorL2 + (d := d) W.w) + hC.constant_nonneg + _ = (hC.fixedValue * ‖Homogenization.toScalarL2 hF_open‖) * ‖G‖ := by ring + exact + nonneg_le_of_sq_le_mul_self (norm_nonneg G) + (mul_nonneg hC.constant_nonneg (norm_nonneg _)) hsq_le + +theorem meanZeroNeumannPoissonSolution_sum_cubeLpNorm_grad_le {d : ℕ} + (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (W : MeanZeroNeumannPoissonSolution Q F) : + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + (((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * + (cubeVolume Q + 1)) * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + change ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + (((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * hC.fixedValue * + (cubeVolume Q + 1)) * cubeLpNorm Q (2 : ℝ≥0∞) F + let A : ℝ := ((cubeVolume Q)⁻¹ + 1) + let B : ℝ := cubeVolume Q + 1 + have hA_nonneg : 0 ≤ A := by + dsimp [A] + have hInv : 0 ≤ (cubeVolume Q)⁻¹ := inv_nonneg.mpr (cubeVolume_nonneg Q) + linarith + have hB_nonneg : 0 ≤ B := by + dsimp [B] + linarith [cubeVolume_nonneg Q] + have hcoord : + ∀ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) ≤ + A * ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + intro i + let hgi : MeasureTheory.MemLp (fun x => W.w.toH1Function.grad x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + W.w.toH1Function.grad_memL2_normalizedCubeMeasure i + have hnorm_eq : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hgi)‖ = + ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + congr 1 + simpa [A, hnorm_eq] using + cubeLpNorm_two_le_volume_inv_add_one_mul_norm_toScalarL2_openCubeSet + Q hgi + calc + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + ≤ ∑ i : Fin d, A * ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + exact Finset.sum_le_sum fun i _hi => hcoord i + _ = A * W.w.toH1Function.gradientCoordL2NormSum := by + exact (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => ‖W.w.toH1Function.gradCoordToScalarL2 i‖) A).symm + _ ≤ A * ((d : ℝ) * ‖W.w.toH1Function.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left W.w.toH1Function.gradientCoordL2NormSum_le + hA_nonneg + _ ≤ A * ((d : ℝ) * ‖W.w.toH1Function.gradToHilbertVectorL2‖) := by + refine mul_le_mul_of_nonneg_left ?_ hA_nonneg + exact mul_le_mul_of_nonneg_left + (H1Function.norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 + W.w.toH1Function) + (Nat.cast_nonneg d) + _ ≤ A * ((d : ℝ) * + (hC.fixedValue * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖)) := by + refine mul_le_mul_of_nonneg_left ?_ hA_nonneg + exact mul_le_mul_of_nonneg_left + (by + simpa [hC, H1MeanZeroFunction.gradToHilbertVectorL2] using! + meanZeroNeumannPoissonSolution_norm_gradToHilbertVectorL2_le Q hF W) + (Nat.cast_nonneg d) + _ ≤ A * ((d : ℝ) * (hC.fixedValue * (B * cubeLpNorm Q (2 : ℝ≥0∞) F))) := by + refine mul_le_mul_of_nonneg_left ?_ hA_nonneg + refine mul_le_mul_of_nonneg_left ?_ (Nat.cast_nonneg d) + exact mul_le_mul_of_nonneg_left + (by + simpa [B] using + norm_toScalarL2_openCubeSet_le_volume_add_one_mul_cubeLpNorm_two Q hF) + hC.constant_nonneg + _ = (((cubeVolume Q)⁻¹ + 1) * (d : ℝ) * hC.fixedValue * + (cubeVolume Q + 1)) * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + dsimp [A, B] + ring + +theorem meanZeroNeumannPoissonSolution_sum_cubeLpNorm_grad_le_exact {d : ℕ} + (Q : TriadicCube d) {F : Vec d → ℝ} + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) + (W : MeanZeroNeumannPoissonSolution Q F) : + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * (d : ℝ) * + cubeMeanZeroH1CoerciveConstant Q * + (cubeVolume Q) ^ (1 / 2 : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet Q)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + let hC : H1CoerciveEstimate (openCubeSet Q) := + scaledTranslatedCubeMeanZeroH1CoerciveEstimate Q + change ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) ≤ + (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * (d : ℝ) * hC.fixedValue * + (cubeVolume Q) ^ (1 / 2 : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) F + let A : ℝ := ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) + let B : ℝ := (cubeVolume Q) ^ (1 / 2 : ℝ) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _ + have hcoord : + ∀ i : Fin d, + cubeLpNorm Q (2 : ℝ≥0∞) (fun x => W.w.toH1Function.grad x i) = + A * ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + intro i + let hgi : MeasureTheory.MemLp (fun x => W.w.toH1Function.grad x i) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + W.w.toH1Function.grad_memL2_normalizedCubeMeasure i + have hnorm_eq : + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hgi)‖ = + ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + congr 1 + simpa [A, hnorm_eq] using + cubeLpNorm_two_eq_volume_inv_rpow_half_mul_norm_toScalarL2_openCubeSet + Q hgi + calc + ∑ i : Fin d, cubeLpNorm Q (2 : ℝ≥0∞) + (fun x => W.w.toH1Function.grad x i) + = ∑ i : Fin d, A * ‖W.w.toH1Function.gradCoordToScalarL2 i‖ := by + exact Finset.sum_congr rfl fun i _hi => hcoord i + _ = A * W.w.toH1Function.gradientCoordL2NormSum := by + exact (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => ‖W.w.toH1Function.gradCoordToScalarL2 i‖) A).symm + _ ≤ A * ((d : ℝ) * ‖W.w.toH1Function.gradToVectorL2‖) := by + exact mul_le_mul_of_nonneg_left W.w.toH1Function.gradientCoordL2NormSum_le + hA_nonneg + _ ≤ A * ((d : ℝ) * ‖W.w.toH1Function.gradToHilbertVectorL2‖) := by + refine mul_le_mul_of_nonneg_left ?_ hA_nonneg + exact mul_le_mul_of_nonneg_left + (H1Function.norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 + W.w.toH1Function) + (Nat.cast_nonneg d) + _ ≤ A * ((d : ℝ) * + (hC.fixedValue * + ‖Homogenization.toScalarL2 + (memL2On_openCubeSet_of_memLp_normalizedCubeMeasure Q hF)‖)) := by + refine mul_le_mul_of_nonneg_left ?_ hA_nonneg + exact mul_le_mul_of_nonneg_left + (by + simpa [hC, H1MeanZeroFunction.gradToHilbertVectorL2] using! + meanZeroNeumannPoissonSolution_norm_gradToHilbertVectorL2_le Q hF W) + (Nat.cast_nonneg d) + _ = A * ((d : ℝ) * + (hC.fixedValue * (B * cubeLpNorm Q (2 : ℝ≥0∞) F))) := by + rw [norm_toScalarL2_openCubeSet_eq_volume_rpow_half_mul_cubeLpNorm_two Q hF] + _ = (((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * (d : ℝ) * hC.fixedValue * + (cubeVolume Q) ^ (1 / 2 : ℝ)) * + cubeLpNorm Q (2 : ℝ≥0∞) F := by + dsimp [A, B] + ring + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection.lean new file mode 100644 index 0000000000..918519d245 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection.lean @@ -0,0 +1,17 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.CubePairings + +/-! # Cube Reflection -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/CubePairings.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/CubePairings.lean new file mode 100644 index 0000000000..b94036cc95 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/CubePairings.lean @@ -0,0 +1,471 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Derivatives +public import Mathlib.MeasureTheory.Group.Measure + +/-! # Cube Pairings -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +theorem setIntegral_cubeUpperFaceNeighbor_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume = + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) ∂volume := by + let g : Vec d → ℝ := fun y => + vecDot (coordReflectionLinear i (G y)) + (euclideanGradient φ (cubeUpperFaceReflection Q i y)) + calc + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume + = ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + g (cubeUpperFaceReflection Q i x) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + change + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) = + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ + (cubeUpperFaceReflection Q i (cubeUpperFaceReflection Q i x))) + rw [cubeUpperFaceReflection_involutive] + _ = ∫ y in openCubeSet Q, g y ∂volume := + setIntegral_cubeUpperFaceNeighbor_comp_reflection Q i g + _ = ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + change + vecDot (coordReflectionLinear i (G y)) + (euclideanGradient φ (cubeUpperFaceReflection Q i y)) = + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) + rw [euclideanGradient_comp_cubeUpperFaceReflection hφ Q i y] + exact vecDot_coordReflectionLinear_left i (G y) + (euclideanGradient φ (cubeUpperFaceReflection Q i y)) + +/-- Integrability of the reflected weak-gradient pairing on the upper face +neighbor, transported from the corresponding reflected test pairing on `Q`. -/ +theorem integrable_cubeUpperFaceNeighbor_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) + (hreflected : + MeasureTheory.Integrable + (fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y)) + (volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x)) + (volume.restrict (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + let B : Vec d → ℝ := fun x => + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) + have hcomp : + MeasureTheory.Integrable + (fun y => B (cubeUpperFaceReflection Q i y)) + (volume.restrict (openCubeSet Q)) := by + refine hreflected.congr ?_ + filter_upwards with y + simp [B] + rw [euclideanGradient_comp_cubeUpperFaceReflection hφ Q i y] + exact (vecDot_coordReflectionLinear_left i (G y) + (euclideanGradient φ (cubeUpperFaceReflection Q i y))).symm + have hpre : + MeasureTheory.IntegrableOn + (fun y => B (cubeUpperFaceReflection Q i y)) + (cubeUpperFaceReflection Q i ⁻¹' + openCubeSet (cubeUpperFaceNeighbor Q i)) volume := by + simpa [MeasureTheory.IntegrableOn, + preimage_cubeUpperFaceReflection_neighbor Q i] using hcomp + have hiff := MeasureTheory.MeasurePreserving.integrableOn_comp_preimage + (measurePreserving_cubeUpperFaceReflection Q i) + (measurableEmbedding_cubeUpperFaceReflection Q i) + (f := B) (s := openCubeSet (cubeUpperFaceNeighbor Q i)) + have hB : + MeasureTheory.IntegrableOn B + (openCubeSet (cubeUpperFaceNeighbor Q i)) volume := + hiff.mp hpre + simpa [MeasureTheory.IntegrableOn, B] using hB + +theorem setIntegral_cubeLowerFaceNeighbor_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume = + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) ∂volume := by + let g : Vec d → ℝ := fun y => + vecDot (coordReflectionLinear i (G y)) + (euclideanGradient φ (cubeLowerFaceReflection Q i y)) + calc + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume + = ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + g (cubeLowerFaceReflection Q i x) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + change + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) = + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ + (cubeLowerFaceReflection Q i (cubeLowerFaceReflection Q i x))) + rw [cubeLowerFaceReflection_involutive] + _ = ∫ y in openCubeSet Q, g y ∂volume := + setIntegral_cubeLowerFaceNeighbor_comp_reflection Q i g + _ = ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + change + vecDot (coordReflectionLinear i (G y)) + (euclideanGradient φ (cubeLowerFaceReflection Q i y)) = + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) + rw [euclideanGradient_comp_cubeLowerFaceReflection hφ Q i y] + exact vecDot_coordReflectionLinear_left i (G y) + (euclideanGradient φ (cubeLowerFaceReflection Q i y)) + +/-- Integrability of the reflected weak-gradient pairing on the lower face +neighbor, transported from the corresponding reflected test pairing on `Q`. -/ +theorem integrable_cubeLowerFaceNeighbor_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) + (hreflected : + MeasureTheory.Integrable + (fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y)) + (volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x)) + (volume.restrict (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + let B : Vec d → ℝ := fun x => + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) + have hcomp : + MeasureTheory.Integrable + (fun y => B (cubeLowerFaceReflection Q i y)) + (volume.restrict (openCubeSet Q)) := by + refine hreflected.congr ?_ + filter_upwards with y + simp [B] + rw [euclideanGradient_comp_cubeLowerFaceReflection hφ Q i y] + exact (vecDot_coordReflectionLinear_left i (G y) + (euclideanGradient φ (cubeLowerFaceReflection Q i y))).symm + have hpre : + MeasureTheory.IntegrableOn + (fun y => B (cubeLowerFaceReflection Q i y)) + (cubeLowerFaceReflection Q i ⁻¹' + openCubeSet (cubeLowerFaceNeighbor Q i)) volume := by + simpa [MeasureTheory.IntegrableOn, + preimage_cubeLowerFaceReflection_neighbor Q i] using hcomp + have hiff := MeasureTheory.MeasurePreserving.integrableOn_comp_preimage + (measurePreserving_cubeLowerFaceReflection Q i) + (measurableEmbedding_cubeLowerFaceReflection Q i) + (f := B) (s := openCubeSet (cubeLowerFaceNeighbor Q i)) + have hB : + MeasureTheory.IntegrableOn B + (openCubeSet (cubeLowerFaceNeighbor Q i)) volume := + hiff.mp hpre + simpa [MeasureTheory.IntegrableOn, B] using hB + +theorem setIntegral_foldedCubeUpperFaceTest_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun y => vecDot (G y) (euclideanGradient φ y)) + (volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y)) + (volume.restrict (openCubeSet Q))) : + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) y) ∂volume = + ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume := by + let A : Vec d → ℝ := fun y => vecDot (G y) (euclideanGradient φ y) + let B : Vec d → ℝ := fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) + calc + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) y) ∂volume + = ∫ y in openCubeSet Q, A y + B y ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + change + vecDot (G y) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) y) = + A y + B y + rw [euclideanGradient_foldedCubeUpperFaceTest hφ Q i y] + simp [A, B, vecDot_add_right, euclideanGradient_comp_cubeUpperFaceReflection hφ Q i y] + _ = ∫ y in openCubeSet Q, A y ∂volume + + ∫ y in openCubeSet Q, B y ∂volume := by + rw [MeasureTheory.integral_add] + · exact hmain + · exact hreflected + _ = ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume := by + rw [show (∫ y in openCubeSet Q, A y ∂volume) = + ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume by rfl] + rw [show (∫ y in openCubeSet Q, B y ∂volume) = + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) + ∂volume by rfl] + rw [← setIntegral_cubeUpperFaceNeighbor_reflectedField_pairing hφ Q i] + +theorem setIntegral_foldedCubeLowerFaceTest_reflectedField_pairing {d : ℕ} + {G : Vec d → Vec d} {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) + (hmain : + MeasureTheory.Integrable + (fun y => vecDot (G y) (euclideanGradient φ y)) + (volume.restrict (openCubeSet Q))) + (hreflected : + MeasureTheory.Integrable + (fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y)) + (volume.restrict (openCubeSet Q))) : + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) y) ∂volume = + ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume := by + let A : Vec d → ℝ := fun y => vecDot (G y) (euclideanGradient φ y) + let B : Vec d → ℝ := fun y => + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) + calc + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) y) ∂volume + = ∫ y in openCubeSet Q, A y + B y ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + change + vecDot (G y) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) y) = + A y + B y + rw [euclideanGradient_foldedCubeLowerFaceTest hφ Q i y] + simp [A, B, vecDot_add_right, euclideanGradient_comp_cubeLowerFaceReflection hφ Q i y] + _ = ∫ y in openCubeSet Q, A y ∂volume + + ∫ y in openCubeSet Q, B y ∂volume := by + rw [MeasureTheory.integral_add] + · exact hmain + · exact hreflected + _ = ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (euclideanGradient φ x) ∂volume := by + rw [show (∫ y in openCubeSet Q, A y ∂volume) = + ∫ y in openCubeSet Q, + vecDot (G y) (euclideanGradient φ y) ∂volume by rfl] + rw [show (∫ y in openCubeSet Q, B y ∂volume) = + ∫ y in openCubeSet Q, + vecDot (G y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) + ∂volume by rfl] + rw [← setIntegral_cubeLowerFaceNeighbor_reflectedField_pairing hφ Q i] + +theorem setIntegral_cubeUpperFaceNeighbor_reflectedGradient_pairing {d : ℕ} + {u φ : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (euclideanGradient (fun y => u (cubeUpperFaceReflection Q i y)) x) + (euclideanGradient φ x) ∂volume = + ∫ y in openCubeSet Q, + vecDot (euclideanGradient u y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) ∂volume := by + let g : Vec d → ℝ := fun y => + vecDot + (euclideanGradient (fun z => u (cubeUpperFaceReflection Q i z)) + (cubeUpperFaceReflection Q i y)) + (euclideanGradient φ (cubeUpperFaceReflection Q i y)) + calc + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (euclideanGradient (fun y => u (cubeUpperFaceReflection Q i y)) x) + (euclideanGradient φ x) ∂volume + = ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + g (cubeUpperFaceReflection Q i x) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + simp [g, cubeUpperFaceReflection] + _ = ∫ y in openCubeSet Q, g y ∂volume := + setIntegral_cubeUpperFaceNeighbor_comp_reflection Q i g + _ = ∫ y in openCubeSet Q, + vecDot (euclideanGradient u y) + (euclideanGradient (fun z => φ (cubeUpperFaceReflection Q i z)) y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + exact vecDot_euclideanGradient_comp_cubeUpperFaceReflection_pairing hu hφ Q i y + +theorem setIntegral_cubeLowerFaceNeighbor_reflectedGradient_pairing {d : ℕ} + {u φ : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (euclideanGradient (fun y => u (cubeLowerFaceReflection Q i y)) x) + (euclideanGradient φ x) ∂volume = + ∫ y in openCubeSet Q, + vecDot (euclideanGradient u y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) ∂volume := by + let g : Vec d → ℝ := fun y => + vecDot + (euclideanGradient (fun z => u (cubeLowerFaceReflection Q i z)) + (cubeLowerFaceReflection Q i y)) + (euclideanGradient φ (cubeLowerFaceReflection Q i y)) + calc + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (euclideanGradient (fun y => u (cubeLowerFaceReflection Q i y)) x) + (euclideanGradient φ x) ∂volume + = ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + g (cubeLowerFaceReflection Q i x) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet _) + intro x _hx + simp [g, cubeLowerFaceReflection] + _ = ∫ y in openCubeSet Q, g y ∂volume := + setIntegral_cubeLowerFaceNeighbor_comp_reflection Q i g + _ = ∫ y in openCubeSet Q, + vecDot (euclideanGradient u y) + (euclideanGradient (fun z => φ (cubeLowerFaceReflection Q i z)) y) ∂volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_openCubeSet Q) + intro y _hy + exact vecDot_euclideanGradient_comp_cubeLowerFaceReflection_pairing hu hφ Q i y + +theorem euclideanCoordSecondDeriv_comp_cubeUpperFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i k l : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k l + (fun y => u (cubeUpperFaceReflection Q i y)) x = + ((if k = i then (-1 : ℝ) else 1) * + (if l = i then (-1 : ℝ) else 1)) * + euclideanCoordSecondDeriv k l u (cubeUpperFaceReflection Q i x) := by + simpa [cubeUpperFaceReflection] using + euclideanCoordSecondDeriv_comp_coordFaceReflection + (u := u) hu (cubeUpperFaceCoord Q i) i k l x + +theorem euclideanCoordSecondDeriv_comp_cubeLowerFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i k l : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k l + (fun y => u (cubeLowerFaceReflection Q i y)) x = + ((if k = i then (-1 : ℝ) else 1) * + (if l = i then (-1 : ℝ) else 1)) * + euclideanCoordSecondDeriv k l u (cubeLowerFaceReflection Q i x) := by + simpa [cubeLowerFaceReflection] using + euclideanCoordSecondDeriv_comp_coordFaceReflection + (u := u) hu (cubeLowerFaceCoord Q i) i k l x + +theorem euclideanCoordLaplacian_comp_cubeUpperFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanCoordLaplacian (fun y => u (cubeUpperFaceReflection Q i y)) x = + euclideanCoordLaplacian u (cubeUpperFaceReflection Q i x) := by + simpa [cubeUpperFaceReflection] using + euclideanCoordLaplacian_comp_coordFaceReflection + (u := u) hu (cubeUpperFaceCoord Q i) i x + +theorem euclideanCoordLaplacian_comp_cubeLowerFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanCoordLaplacian (fun y => u (cubeLowerFaceReflection Q i y)) x = + euclideanCoordLaplacian u (cubeLowerFaceReflection Q i x) := by + simpa [cubeLowerFaceReflection] using + euclideanCoordLaplacian_comp_coordFaceReflection + (u := u) hu (cubeLowerFaceCoord Q i) i x + +theorem sum_sq_euclideanCoordSecondDeriv_comp_cubeUpperFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (cubeUpperFaceReflection Q i y)) x) ^ 2) = + ∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u (cubeUpperFaceReflection Q i x)) ^ 2 := by + simpa [cubeUpperFaceReflection] using + sum_sq_euclideanCoordSecondDeriv_comp_coordFaceReflection + (u := u) hu (cubeUpperFaceCoord Q i) i x + +theorem sum_sq_euclideanCoordSecondDeriv_comp_cubeLowerFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (cubeLowerFaceReflection Q i y)) x) ^ 2) = + ∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u (cubeLowerFaceReflection Q i x)) ^ 2 := by + simpa [cubeLowerFaceReflection] using + sum_sq_euclideanCoordSecondDeriv_comp_coordFaceReflection + (u := u) hu (cubeLowerFaceCoord Q i) i x + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Derivatives.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Derivatives.lean new file mode 100644 index 0000000000..327d4a4235 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Derivatives.lean @@ -0,0 +1,445 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Homeomorphism + +/-! # Derivatives -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +theorem coordReflectionLinear_basisVec {d : ℕ} (i k : Fin d) : + coordReflectionLinear i (basisVec k) = + (if k = i then (-1 : ℝ) else 1) • basisVec k := by + ext j + by_cases hki : k = i + · subst k + by_cases hji : j = i <;> simp [hji] + · have hik : i ≠ k := fun h => hki h.symm + by_cases hji : j = i <;> by_cases hjk : j = k <;> + simp [hki, hik, hji, hjk] + +theorem fderiv_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) (x : Vec d) : + fderiv ℝ (coordFaceReflection a i) x = coordReflectionLinear i := by + unfold coordFaceReflection + rw [fderiv_add_const] + exact (coordReflectionLinear i).fderiv + +theorem differentiableAt_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) (x : Vec d) : + DifferentiableAt ℝ (coordFaceReflection a i) x := by + have hlin : DifferentiableAt ℝ (fun y : Vec d => coordReflectionLinear i y) x := + (coordReflectionLinear i).differentiableAt + exact hlin.add_const _ + +/-- First coordinate-derivative chain rule for scalar functions composed with a +coordinate face reflection. The normal derivative changes sign; tangential +derivatives do not. -/ +theorem euclideanCoordDeriv_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i k : Fin d) (x : Vec d) : + euclideanCoordDeriv k (fun y => u (coordFaceReflection a i y)) x = + (if k = i then (-1 : ℝ) else 1) * + euclideanCoordDeriv k u (coordFaceReflection a i x) := by + unfold euclideanCoordDeriv + have hcomp : + fderiv ℝ (fun y => u (coordFaceReflection a i y)) x = + (fderiv ℝ u (coordFaceReflection a i x)).comp (coordReflectionLinear i) := by + change fderiv ℝ (u ∘ coordFaceReflection a i) x = + (fderiv ℝ u (coordFaceReflection a i x)).comp (coordReflectionLinear i) + rw [fderiv_comp] + · rw [fderiv_coordFaceReflection] + · exact (hu.differentiable (by simp)) (coordFaceReflection a i x) + · exact differentiableAt_coordFaceReflection a i x + rw [hcomp] + rw [ContinuousLinearMap.comp_apply, coordReflectionLinear_basisVec] + by_cases hki : k = i <;> simp [hki] + +theorem euclideanGradient_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i : Fin d) (x : Vec d) : + euclideanGradient (fun y => u (coordFaceReflection a i y)) x = + coordReflectionLinear i (euclideanGradient u (coordFaceReflection a i x)) := by + ext k + simp [euclideanGradient, euclideanCoordDeriv_comp_coordFaceReflection hu a i k x] + +/-- Fold a scalar test through a coordinate face: on the original side this is +`φ + φ ∘ r`, where `r` is the face reflection. -/ +def foldedCoordFaceTest {d : ℕ} + (a : ℝ) (i : Fin d) (φ : Vec d → ℝ) : Vec d → ℝ := + fun x => φ x + φ (coordFaceReflection a i x) + +def foldedCubeUpperFaceTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) : Vec d → ℝ := + foldedCoordFaceTest (cubeUpperFaceCoord Q i) i φ + +def foldedCubeLowerFaceTest {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (φ : Vec d → ℝ) : Vec d → ℝ := + foldedCoordFaceTest (cubeLowerFaceCoord Q i) i φ + +theorem contDiff_foldedCoordFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (a : ℝ) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (foldedCoordFaceTest a i φ) := by + simpa [foldedCoordFaceTest, Function.comp] using! + hφ.add (hφ.comp (contDiff_coordFaceReflection a i)) + +theorem contDiff_foldedCubeUpperFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (foldedCubeUpperFaceTest Q i φ) := by + simpa [foldedCubeUpperFaceTest] using + contDiff_foldedCoordFaceTest hφ (cubeUpperFaceCoord Q i) i + +theorem contDiff_foldedCubeLowerFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (foldedCubeLowerFaceTest Q i φ) := by + simpa [foldedCubeLowerFaceTest] using + contDiff_foldedCoordFaceTest hφ (cubeLowerFaceCoord Q i) i + +theorem hasCompactSupport_comp_coordFaceReflection {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (a : ℝ) (i : Fin d) : + HasCompactSupport (fun x => φ (coordFaceReflection a i x)) := by + show HasCompactSupport (φ ∘ coordFaceReflectionHomeomorph a i) + simpa [Function.comp, coordFaceReflectionHomeomorph] using + hφ.comp_homeomorph (coordFaceReflectionHomeomorph a i) + +theorem hasCompactSupport_comp_cubeUpperFaceReflection {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (Q : TriadicCube d) (i : Fin d) : + HasCompactSupport (fun x => φ (cubeUpperFaceReflection Q i x)) := by + simpa [cubeUpperFaceReflection] using + hasCompactSupport_comp_coordFaceReflection hφ (cubeUpperFaceCoord Q i) i + +theorem hasCompactSupport_comp_cubeLowerFaceReflection {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (Q : TriadicCube d) (i : Fin d) : + HasCompactSupport (fun x => φ (cubeLowerFaceReflection Q i x)) := by + simpa [cubeLowerFaceReflection] using + hasCompactSupport_comp_coordFaceReflection hφ (cubeLowerFaceCoord Q i) i + +theorem hasCompactSupport_foldedCoordFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (a : ℝ) (i : Fin d) : + HasCompactSupport (foldedCoordFaceTest a i φ) := by + simpa [foldedCoordFaceTest] using! + hφ.add (hasCompactSupport_comp_coordFaceReflection hφ a i) + +theorem hasCompactSupport_foldedCubeUpperFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (Q : TriadicCube d) (i : Fin d) : + HasCompactSupport (foldedCubeUpperFaceTest Q i φ) := by + simpa [foldedCubeUpperFaceTest] using + hasCompactSupport_foldedCoordFaceTest hφ (cubeUpperFaceCoord Q i) i + +theorem hasCompactSupport_foldedCubeLowerFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) + (Q : TriadicCube d) (i : Fin d) : + HasCompactSupport (foldedCubeLowerFaceTest Q i φ) := by + simpa [foldedCubeLowerFaceTest] using + hasCompactSupport_foldedCoordFaceTest hφ (cubeLowerFaceCoord Q i) i + +theorem euclideanGradient_foldedCoordFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (a : ℝ) (i : Fin d) (x : Vec d) : + euclideanGradient (foldedCoordFaceTest a i φ) x = + euclideanGradient φ x + + coordReflectionLinear i (euclideanGradient φ (coordFaceReflection a i x)) := by + have hφdiff : DifferentiableAt ℝ φ x := + (hφ.differentiable (by simp)) x + have hcompdiff : + DifferentiableAt ℝ (fun y => φ (coordFaceReflection a i y)) x := by + exact ((hφ.differentiable (by simp)) (coordFaceReflection a i x)).comp x + (differentiableAt_coordFaceReflection a i x) + have hderiv : + fderiv ℝ (foldedCoordFaceTest a i φ) x = + fderiv ℝ φ x + + fderiv ℝ (fun y => φ (coordFaceReflection a i y)) x := by + change fderiv ℝ (φ + fun y => φ (coordFaceReflection a i y)) x = + fderiv ℝ φ x + + fderiv ℝ (fun y => φ (coordFaceReflection a i y)) x + exact fderiv_add hφdiff hcompdiff + ext k + unfold euclideanGradient euclideanCoordDeriv + rw [hderiv] + rw [add_apply] + rw [show fderiv ℝ (fun y => φ (coordFaceReflection a i y)) x (basisVec k) = + euclideanCoordDeriv k (fun y => φ (coordFaceReflection a i y)) x by rfl] + rw [euclideanCoordDeriv_comp_coordFaceReflection hφ a i k x] + by_cases hki : k = i <;> simp [hki, euclideanCoordDeriv] + +theorem euclideanGradient_foldedCubeUpperFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanGradient (foldedCubeUpperFaceTest Q i φ) x = + euclideanGradient φ x + + coordReflectionLinear i (euclideanGradient φ (cubeUpperFaceReflection Q i x)) := by + simpa [foldedCubeUpperFaceTest, cubeUpperFaceReflection] using + euclideanGradient_foldedCoordFaceTest hφ (cubeUpperFaceCoord Q i) i x + +theorem euclideanGradient_foldedCubeLowerFaceTest {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanGradient (foldedCubeLowerFaceTest Q i φ) x = + euclideanGradient φ x + + coordReflectionLinear i (euclideanGradient φ (cubeLowerFaceReflection Q i x)) := by + simpa [foldedCubeLowerFaceTest, cubeLowerFaceReflection] using + euclideanGradient_foldedCoordFaceTest hφ (cubeLowerFaceCoord Q i) i x + +theorem vecDot_euclideanGradient_foldedCoordFaceTest {d : ℕ} + {u φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (a : ℝ) (i : Fin d) (x : Vec d) : + vecDot (euclideanGradient u x) + (euclideanGradient (foldedCoordFaceTest a i φ) x) = + vecDot (euclideanGradient u x) (euclideanGradient φ x) + + vecDot (euclideanGradient u x) + (coordReflectionLinear i (euclideanGradient φ (coordFaceReflection a i x))) := by + rw [euclideanGradient_foldedCoordFaceTest hφ a i x] + simp [vecDot_add_right] + +theorem vecDot_euclideanGradient_foldedCubeUpperFaceTest {d : ℕ} + {u φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + vecDot (euclideanGradient u x) + (euclideanGradient (foldedCubeUpperFaceTest Q i φ) x) = + vecDot (euclideanGradient u x) (euclideanGradient φ x) + + vecDot (euclideanGradient u x) + (coordReflectionLinear i (euclideanGradient φ (cubeUpperFaceReflection Q i x))) := by + simpa [foldedCubeUpperFaceTest, cubeUpperFaceReflection] using + vecDot_euclideanGradient_foldedCoordFaceTest + (u := u) (φ := φ) hφ (cubeUpperFaceCoord Q i) i x + +theorem vecDot_euclideanGradient_foldedCubeLowerFaceTest {d : ℕ} + {u φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + vecDot (euclideanGradient u x) + (euclideanGradient (foldedCubeLowerFaceTest Q i φ) x) = + vecDot (euclideanGradient u x) (euclideanGradient φ x) + + vecDot (euclideanGradient u x) + (coordReflectionLinear i (euclideanGradient φ (cubeLowerFaceReflection Q i x))) := by + simpa [foldedCubeLowerFaceTest, cubeLowerFaceReflection] using + vecDot_euclideanGradient_foldedCoordFaceTest + (u := u) (φ := φ) hφ (cubeLowerFaceCoord Q i) i x + +/-- The folded upper-face smooth test, packaged as an `H¹(openCubeSet Q)` +witness for variational Neumann equations. -/ +noncomputable def foldedCubeUpperFaceH1Test {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : H1Function (openCubeSet Q) := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) + ((contDiff_foldedCubeUpperFaceTest hφ Q i).of_le (by simp)) + +/-- The folded lower-face smooth test, packaged as an `H¹(openCubeSet Q)` +witness for variational Neumann equations. -/ +noncomputable def foldedCubeLowerFaceH1Test {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : H1Function (openCubeSet Q) := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) + ((contDiff_foldedCubeLowerFaceTest hφ Q i).of_le (by simp)) + +@[simp] theorem foldedCubeUpperFaceH1Test_toFun {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + (foldedCubeUpperFaceH1Test Q i hφ).toFun = + foldedCubeUpperFaceTest Q i φ := by + simp [foldedCubeUpperFaceH1Test, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + +@[simp] theorem foldedCubeLowerFaceH1Test_toFun {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + (foldedCubeLowerFaceH1Test Q i hφ).toFun = + foldedCubeLowerFaceTest Q i φ := by + simp [foldedCubeLowerFaceH1Test, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + +@[simp] theorem foldedCubeUpperFaceH1Test_grad {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + (foldedCubeUpperFaceH1Test Q i hφ).grad x = + euclideanGradient (foldedCubeUpperFaceTest Q i φ) x := by + ext k + simp [foldedCubeUpperFaceH1Test, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, euclideanGradient, + euclideanCoordDeriv] + +@[simp] theorem foldedCubeLowerFaceH1Test_grad {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (x : Vec d) : + (foldedCubeLowerFaceH1Test Q i hφ).grad x = + euclideanGradient (foldedCubeLowerFaceTest Q i φ) x := by + ext k + simp [foldedCubeLowerFaceH1Test, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, euclideanGradient, + euclideanCoordDeriv] + +theorem vecDot_euclideanGradient_comp_coordFaceReflection_pairing {d : ℕ} + {u φ : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (a : ℝ) (i : Fin d) (x : Vec d) : + vecDot + (euclideanGradient (fun y => u (coordFaceReflection a i y)) + (coordFaceReflection a i x)) + (euclideanGradient φ (coordFaceReflection a i x)) = + vecDot (euclideanGradient u x) + (euclideanGradient (fun y => φ (coordFaceReflection a i y)) x) := by + rw [euclideanGradient_comp_coordFaceReflection hu a i (coordFaceReflection a i x)] + rw [coordFaceReflection_involutive] + rw [euclideanGradient_comp_coordFaceReflection hφ a i x] + exact vecDot_coordReflectionLinear_left i (euclideanGradient u x) + (euclideanGradient φ (coordFaceReflection a i x)) + +/-- Second coordinate-derivative chain rule for scalar functions composed with +a coordinate face reflection. Each differentiation in the reflected normal +direction contributes one sign. -/ +theorem euclideanCoordSecondDeriv_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i k l : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k l (fun y => u (coordFaceReflection a i y)) x = + ((if k = i then (-1 : ℝ) else 1) * + (if l = i then (-1 : ℝ) else 1)) * + euclideanCoordSecondDeriv k l u (coordFaceReflection a i x) := by + let sk : ℝ := if k = i then (-1 : ℝ) else 1 + let sl : ℝ := if l = i then (-1 : ℝ) else 1 + have hderiv_fun : + euclideanCoordDeriv k (fun y => u (coordFaceReflection a i y)) = + fun y => sk * euclideanCoordDeriv k u (coordFaceReflection a i y) := by + funext y + simpa [sk] using euclideanCoordDeriv_comp_coordFaceReflection hu a i k y + unfold euclideanCoordSecondDeriv + rw [hderiv_fun] + have hdiff : + DifferentiableAt ℝ + (fun y => euclideanCoordDeriv k u (coordFaceReflection a i y)) x := by + exact (((contDiff_euclideanCoordDeriv hu k).differentiable (by simp)) + (coordFaceReflection a i x)).comp x (differentiableAt_coordFaceReflection a i x) + rw [fderiv_const_mul hdiff sk] + change sk * + euclideanCoordDeriv l + (fun y => euclideanCoordDeriv k u (coordFaceReflection a i y)) x = + (sk * sl) * euclideanCoordSecondDeriv k l u (coordFaceReflection a i x) + rw [euclideanCoordDeriv_comp_coordFaceReflection + (u := euclideanCoordDeriv k u) (contDiff_euclideanCoordDeriv hu k) a i l x] + simp [euclideanCoordSecondDeriv, euclideanCoordDeriv, sk, sl] + +theorem euclideanCoordSecondDeriv_diag_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i k : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k k (fun y => u (coordFaceReflection a i y)) x = + euclideanCoordSecondDeriv k k u (coordFaceReflection a i x) := by + rw [euclideanCoordSecondDeriv_comp_coordFaceReflection hu a i k k x] + by_cases hki : k = i <;> simp [hki] + +theorem euclideanCoordLaplacian_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i : Fin d) (x : Vec d) : + euclideanCoordLaplacian (fun y => u (coordFaceReflection a i y)) x = + euclideanCoordLaplacian u (coordFaceReflection a i x) := by + unfold euclideanCoordLaplacian + apply Finset.sum_congr rfl + intro k _hk + exact euclideanCoordSecondDeriv_diag_comp_coordFaceReflection hu a i k x + +theorem sum_sq_euclideanCoordSecondDeriv_comp_coordFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (a : ℝ) (i : Fin d) (x : Vec d) : + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (coordFaceReflection a i y)) x) ^ 2) = + ∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u (coordFaceReflection a i x)) ^ 2 := by + apply Finset.sum_congr rfl + intro k _hk + apply Finset.sum_congr rfl + intro l _hl + rw [euclideanCoordSecondDeriv_comp_coordFaceReflection hu a i k l x] + by_cases hki : k = i <;> by_cases hli : l = i <;> simp [hki, hli, pow_two] + +theorem euclideanCoordDeriv_comp_cubeUpperFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i k : Fin d) (x : Vec d) : + euclideanCoordDeriv k (fun y => u (cubeUpperFaceReflection Q i y)) x = + (if k = i then (-1 : ℝ) else 1) * + euclideanCoordDeriv k u (cubeUpperFaceReflection Q i x) := by + simpa [cubeUpperFaceReflection] using + euclideanCoordDeriv_comp_coordFaceReflection + (u := u) hu (cubeUpperFaceCoord Q i) i k x + +theorem euclideanCoordDeriv_comp_cubeLowerFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i k : Fin d) (x : Vec d) : + euclideanCoordDeriv k (fun y => u (cubeLowerFaceReflection Q i y)) x = + (if k = i then (-1 : ℝ) else 1) * + euclideanCoordDeriv k u (cubeLowerFaceReflection Q i x) := by + simpa [cubeLowerFaceReflection] using + euclideanCoordDeriv_comp_coordFaceReflection + (u := u) hu (cubeLowerFaceCoord Q i) i k x + +theorem euclideanGradient_comp_cubeUpperFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanGradient (fun y => u (cubeUpperFaceReflection Q i y)) x = + coordReflectionLinear i (euclideanGradient u (cubeUpperFaceReflection Q i x)) := by + simpa [cubeUpperFaceReflection] using + euclideanGradient_comp_coordFaceReflection + (u := u) hu (cubeUpperFaceCoord Q i) i x + +theorem euclideanGradient_comp_cubeLowerFaceReflection {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + euclideanGradient (fun y => u (cubeLowerFaceReflection Q i y)) x = + coordReflectionLinear i (euclideanGradient u (cubeLowerFaceReflection Q i x)) := by + simpa [cubeLowerFaceReflection] using + euclideanGradient_comp_coordFaceReflection + (u := u) hu (cubeLowerFaceCoord Q i) i x + +theorem vecDot_euclideanGradient_comp_cubeUpperFaceReflection_pairing {d : ℕ} + {u φ : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + vecDot + (euclideanGradient (fun y => u (cubeUpperFaceReflection Q i y)) + (cubeUpperFaceReflection Q i x)) + (euclideanGradient φ (cubeUpperFaceReflection Q i x)) = + vecDot (euclideanGradient u x) + (euclideanGradient (fun y => φ (cubeUpperFaceReflection Q i y)) x) := by + simpa [cubeUpperFaceReflection] using + vecDot_euclideanGradient_comp_coordFaceReflection_pairing + (u := u) (φ := φ) hu hφ (cubeUpperFaceCoord Q i) i x + +theorem vecDot_euclideanGradient_comp_cubeLowerFaceReflection_pairing {d : ℕ} + {u φ : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + vecDot + (euclideanGradient (fun y => u (cubeLowerFaceReflection Q i y)) + (cubeLowerFaceReflection Q i x)) + (euclideanGradient φ (cubeLowerFaceReflection Q i x)) = + vecDot (euclideanGradient u x) + (euclideanGradient (fun y => φ (cubeLowerFaceReflection Q i y)) x) := by + simpa [cubeLowerFaceReflection] using + vecDot_euclideanGradient_comp_coordFaceReflection_pairing + (u := u) (φ := φ) hu hφ (cubeLowerFaceCoord Q i) i x + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding.lean new file mode 100644 index 0000000000..19c31379f0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.Geometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockDecomposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockIntegrals + +/-! # Folding -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockDecomposition.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockDecomposition.lean new file mode 100644 index 0000000000..010b9fdd07 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockDecomposition.lean @@ -0,0 +1,842 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.Geometry + +/-! # Block Decomposition -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +@[simp] theorem cubeCoordinateFoldSign_mul_self {d : ℕ} + (Q : TriadicCube d) (x : Vec d) (i : Fin d) : + cubeCoordinateFoldSign Q x i * cubeCoordinateFoldSign Q x i = 1 := by + by_cases hLower : x i < cubeLowerFaceCoord Q i + · simp [cubeCoordinateFoldSign, hLower] + · by_cases hUpper : x i < cubeUpperFaceCoord Q i + · simp [cubeCoordinateFoldSign, hLower, hUpper] + · simp [cubeCoordinateFoldSign, hLower, hUpper] + +/-- The all-coordinate reflected vector field preserves pointwise Euclidean +self-pairing after folding. -/ +theorem vecDot_cubeCoordinateFoldReflectedVectorField_self {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) (x : Vec d) : + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) = + vecDot (G (cubeCoordinateFold Q x)) (G (cubeCoordinateFold Q x)) := by + unfold vecDot + apply Finset.sum_congr rfl + intro i _hi + simp [cubeCoordinateFoldReflectedVectorField, mul_left_comm, mul_comm] + +/-- The one-coordinate face-neighbor slab is measurable. -/ +theorem measurableSet_cubeFaceNeighborSlabSet {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + MeasurableSet (cubeFaceNeighborSlabSet Q i) := by + exact ((measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)).union + (measurableSet_openCubeSet Q)).union + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) + +/-- A one-coordinate reflection-cell strip is measurable. -/ +theorem measurableSet_cubeFaceReflectionCellCoordSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin 3) (i : Fin d) : + MeasurableSet (cubeFaceReflectionCellCoordSet Q choice i) := by + classical + have hLower : + MeasurableSet + {x : Vec d | + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + have hMiddle : + MeasurableSet + {x : Vec d | + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + have hUpper : + MeasurableSet + {x : Vec d | + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + by_cases h0 : choice = 0 + · simpa [cubeFaceReflectionCellCoordSet, h0] using hLower + · by_cases h1 : choice = 1 + · simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hMiddle + · simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hUpper + +/-- A `3^d` reflection-block cell is measurable. -/ +theorem measurableSet_cubeFaceReflectionCellSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + MeasurableSet (cubeFaceReflectionCellSet Q choice) := by + have h : + MeasurableSet + (⋂ i : Fin d, cubeFaceReflectionCellCoordSet Q (choice i) i) := + MeasurableSet.iInter fun i : Fin d => + measurableSet_cubeFaceReflectionCellCoordSet Q (choice i) i + convert h using 1 + ext x + simp [cubeFaceReflectionCellSet] + +/-- The all-coordinate reflection block is measurable. -/ +theorem measurableSet_cubeFaceReflectionBlockSet {d : ℕ} + (Q : TriadicCube d) : + MeasurableSet (cubeFaceReflectionBlockSet Q) := by + classical + have hcoord : ∀ i : Fin d, + MeasurableSet + {x : Vec d | + (cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i) ∨ + (cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i) ∨ + (cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q)} := by + intro i + have hLower : + MeasurableSet + {x : Vec d | + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + have hMiddle : + MeasurableSet + {x : Vec d | + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + have hUpper : + MeasurableSet + {x : Vec d | + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q} := by + exact (isOpen_lt continuous_const (continuous_apply i)).measurableSet.inter + (isOpen_lt (continuous_apply i) continuous_const).measurableSet + simpa [Set.ofPred_or] using hLower.union (hMiddle.union hUpper) + simpa [cubeFaceReflectionBlockSet, Set.iInter_ofPred] using + (MeasurableSet.iInter hcoord) + +/-- Every reflection-block cell is contained in the full all-coordinate +reflection block. -/ +theorem cubeFaceReflectionCellSet_subset_cubeFaceReflectionBlockSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + cubeFaceReflectionCellSet Q choice ⊆ cubeFaceReflectionBlockSet Q := by + intro x hx i + have hcoord := hx i + by_cases h0 : choice i = 0 + · exact Or.inl <| by + simpa [cubeFaceReflectionCellCoordSet, h0] using hcoord + · by_cases h1 : choice i = 1 + · exact Or.inr <| Or.inl <| by + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hcoord + · exact Or.inr <| Or.inr <| by + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hcoord + +/-- The all-coordinate reflection block is the union of its `3^d` +lower/original/upper cells. -/ +theorem cubeFaceReflectionBlockSet_eq_iUnion_cellSet {d : ℕ} + (Q : TriadicCube d) : + cubeFaceReflectionBlockSet Q = + ⋃ choice : Fin d → Fin 3, cubeFaceReflectionCellSet Q choice := by + classical + ext x + constructor + · intro hx + have hExists : + ∀ i : Fin d, + ∃ choice : Fin 3, x ∈ cubeFaceReflectionCellCoordSet Q choice i := by + intro i + rcases hx i with hLower | hMiddle | hUpper + · exact ⟨0, by simpa [cubeFaceReflectionCellCoordSet] using hLower⟩ + · exact ⟨1, by simp [cubeFaceReflectionCellCoordSet, hMiddle]⟩ + · exact ⟨2, by + have h20 : (2 : Fin 3) ≠ 0 := by decide + have h21 : (2 : Fin 3) ≠ 1 := by decide + simpa [cubeFaceReflectionCellCoordSet, h20, h21] using hUpper⟩ + choose choice hchoice using hExists + exact Set.mem_iUnion.mpr + ⟨choice, by + intro i + exact hchoice i⟩ + · intro hx + rcases Set.mem_iUnion.mp hx with ⟨choice, hchoice⟩ + exact cubeFaceReflectionCellSet_subset_cubeFaceReflectionBlockSet Q + choice hchoice + +/-- The all-coordinate reflection block is the union of the translated open +triadic cubes represented by its cells. -/ +theorem cubeFaceReflectionBlockSet_eq_iUnion_cellCube {d : ℕ} + (Q : TriadicCube d) : + cubeFaceReflectionBlockSet Q = + ⋃ choice : Fin d → Fin 3, + openCubeSet (cubeFaceReflectionCellCube Q choice) := by + simpa [openCubeSet_cubeFaceReflectionCellCube] using + cubeFaceReflectionBlockSet_eq_iUnion_cellSet Q + +/-- Every reflection-block cell is open. -/ +theorem isOpen_cubeFaceReflectionCellSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + IsOpen (cubeFaceReflectionCellSet Q choice) := by + rw [← openCubeSet_cubeFaceReflectionCellCube] + exact isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice) + +/-- The all-coordinate reflection block is open. -/ +theorem isOpen_cubeFaceReflectionBlockSet {d : ℕ} + (Q : TriadicCube d) : + IsOpen (cubeFaceReflectionBlockSet Q) := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact isOpen_iUnion fun choice : Fin d → Fin 3 => + isOpen_openCubeSet (cubeFaceReflectionCellCube Q choice) + +/-- Distinct one-coordinate lower/original/upper strips are disjoint. -/ +theorem disjoint_cubeFaceReflectionCellCoordSet_of_ne {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {a b : Fin 3} (hab : a ≠ b) : + Disjoint (cubeFaceReflectionCellCoordSet Q a i) + (cubeFaceReflectionCellCoordSet Q b i) := by + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hLowerUpper : cubeLowerFaceCoord Q i < cubeUpperFaceCoord Q i := by + have hscalePow : 0 < (3 : ℝ) ^ Q.scale := by + simpa [cubeScaleFactor] using hscale + dsimp [cubeLowerFaceCoord, cubeUpperFaceCoord, cubeScaleFactor] + nlinarith + rw [Set.disjoint_left] + intro x hxA hxB + fin_cases a <;> fin_cases b + · exact (hab rfl).elim + · have hxA' : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet] using hxA + have hxB' : + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCoordSet] at hxB + exact hxB + linarith + · have hxA' : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet] using hxA + have hxB' : + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCoordSet] at hxB + exact hxB + linarith + · have hxA' : + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCoordSet] at hxA + exact hxA + have hxB' : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet] using hxB + linarith + · exact (hab rfl).elim + · have hxA' : + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCoordSet] at hxA + exact hxA + have hxB' : + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCoordSet] at hxB + exact hxB + linarith + · have hxA' : + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCoordSet] at hxA + exact hxA + have hxB' : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet] using hxB + linarith + · have hxA' : + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCoordSet] at hxA + exact hxA + have hxB' : + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCoordSet] at hxB + exact hxB + linarith + · exact (hab rfl).elim + +/-- Different reflection-block cells are disjoint. -/ +theorem disjoint_cubeFaceReflectionCellSet_of_ne {d : ℕ} + (Q : TriadicCube d) {choice₁ choice₂ : Fin d → Fin 3} + (hchoice : choice₁ ≠ choice₂) : + Disjoint (cubeFaceReflectionCellSet Q choice₁) + (cubeFaceReflectionCellSet Q choice₂) := by + classical + have hExists : ∃ i : Fin d, choice₁ i ≠ choice₂ i := by + by_contra hnone + apply hchoice + funext i + by_contra hi + exact hnone ⟨i, hi⟩ + rcases hExists with ⟨i, hi⟩ + rw [Set.disjoint_left] + intro x hx₁ hx₂ + exact + (Set.disjoint_left.mp + (disjoint_cubeFaceReflectionCellCoordSet_of_ne Q i hi) + (hx₁ i)) (hx₂ i) + +/-- The translated open cubes associated to different reflection cells are +disjoint. -/ +theorem disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne {d : ℕ} + (Q : TriadicCube d) {choice₁ choice₂ : Fin d → Fin 3} + (hchoice : choice₁ ≠ choice₂) : + Disjoint (openCubeSet (cubeFaceReflectionCellCube Q choice₁)) + (openCubeSet (cubeFaceReflectionCellCube Q choice₂)) := by + simpa [openCubeSet_cubeFaceReflectionCellCube] using + disjoint_cubeFaceReflectionCellSet_of_ne Q hchoice + +/-- Set-integral split over the all-coordinate reflection block, written as a +finite sum over its translated open triadic-cube cells. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cellCube {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (f : Vec d → E) + (hf : ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeFaceReflectionCellCube Q choice)))) : + ∫ x in cubeFaceReflectionBlockSet Q, f x ∂volume = + ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂volume := by + rw [cubeFaceReflectionBlockSet_eq_iUnion_cellCube Q] + exact MeasureTheory.integral_iUnion_fintype + (μ := volume) + (s := fun choice : Fin d → Fin 3 => + openCubeSet (cubeFaceReflectionCellCube Q choice)) + (f := f) + (fun choice => + measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) + (by + intro choice₁ choice₂ hne + exact disjoint_openCubeSet_cubeFaceReflectionCellCube_of_ne Q hne) + (fun choice => by + simpa [MeasureTheory.IntegrableOn] using hf choice) + +/-- The reflection block has one lower/original/upper choice in each +coordinate, hence `3^d` cells. -/ +theorem card_cubeFaceReflectionChoices (d : ℕ) : + Fintype.card (Fin d → Fin 3) = 3 ^ d := by + simp + +/-- Real-valued form of `card_cubeFaceReflectionChoices`, for constants in +energy estimates. -/ +theorem real_card_cubeFaceReflectionChoices (d : ℕ) : + (Fintype.card (Fin d → Fin 3) : ℝ) = (3 : ℝ) ^ d := by + norm_num [card_cubeFaceReflectionChoices] + +/-- The original open cube is contained in the all-coordinate reflection +block. -/ +theorem openCubeSet_subset_cubeFaceReflectionBlockSet {d : ℕ} + (Q : TriadicCube d) : + openCubeSet Q ⊆ cubeFaceReflectionBlockSet Q := by + intro x hx j + exact Or.inr <| Or.inl + ⟨by simpa [cubeLowerFaceCoord] using (hx j).1, + by simpa [cubeUpperFaceCoord] using (hx j).2⟩ + +/-- A lower same-scale face neighbor is contained in the all-coordinate +reflection block. -/ +theorem openCubeSet_cubeLowerFaceNeighbor_subset_cubeFaceReflectionBlockSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + openCubeSet (cubeLowerFaceNeighbor Q i) ⊆ + cubeFaceReflectionBlockSet Q := by + intro x hx j + by_cases hji : j = i + · subst j + exact Or.inl + ⟨by + have hLower : + cubeLowerFaceCoord (cubeLowerFaceNeighbor Q i) i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + simpa using hLower, + by + have hUpper : + x i < cubeUpperFaceCoord (cubeLowerFaceNeighbor Q i) i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + simpa using hUpper⟩ + · exact Or.inr <| Or.inl + ⟨by + have hLower : + cubeLowerFaceCoord (cubeLowerFaceNeighbor Q i) j < x j := by + simpa [cubeLowerFaceCoord] using (hx j).1 + simpa [hji] using hLower, + by + have hUpper : + x j < cubeUpperFaceCoord (cubeLowerFaceNeighbor Q i) j := by + simpa [cubeUpperFaceCoord] using (hx j).2 + simpa [hji] using hUpper⟩ + +/-- An upper same-scale face neighbor is contained in the all-coordinate +reflection block. -/ +theorem openCubeSet_cubeUpperFaceNeighbor_subset_cubeFaceReflectionBlockSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + openCubeSet (cubeUpperFaceNeighbor Q i) ⊆ + cubeFaceReflectionBlockSet Q := by + intro x hx j + by_cases hji : j = i + · subst j + exact Or.inr <| Or.inr + ⟨by + have hLower : + cubeLowerFaceCoord (cubeUpperFaceNeighbor Q i) i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + simpa using hLower, + by + have hUpper : + x i < cubeUpperFaceCoord (cubeUpperFaceNeighbor Q i) i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + simpa using hUpper⟩ + · exact Or.inr <| Or.inl + ⟨by + have hLower : + cubeLowerFaceCoord (cubeUpperFaceNeighbor Q i) j < x j := by + simpa [cubeLowerFaceCoord] using (hx j).1 + simpa [hji] using hLower, + by + have hUpper : + x j < cubeUpperFaceCoord (cubeUpperFaceNeighbor Q i) j := by + simpa [cubeUpperFaceCoord] using (hx j).2 + simpa [hji] using hUpper⟩ + +/-- Every one-coordinate lower/original/upper slab is contained in the +all-coordinate reflection block. -/ +theorem cubeFaceNeighborSlabSet_subset_cubeFaceReflectionBlockSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + cubeFaceNeighborSlabSet Q i ⊆ cubeFaceReflectionBlockSet Q := by + intro x hx + rcases hx with hxLQ | hxU + · rcases hxLQ with hxL | hxQ + · exact openCubeSet_cubeLowerFaceNeighbor_subset_cubeFaceReflectionBlockSet + Q i hxL + · exact openCubeSet_subset_cubeFaceReflectionBlockSet Q hxQ + · exact openCubeSet_cubeUpperFaceNeighbor_subset_cubeFaceReflectionBlockSet + Q i hxU + +/-- On the original open cube, the coordinatewise fold is the identity. -/ +theorem cubeCoordinateFold_eq_self_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) {x : Vec d} (hx : x ∈ openCubeSet Q) : + cubeCoordinateFold Q x = x := by + ext i + have hLower : cubeLowerFaceCoord Q i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := not_lt.mpr hLower.le + simp [cubeCoordinateFold, hnotLower, hUpper] + +theorem cubeCoordinateFoldReflectedScalar_eq_self_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeCoordinateFoldReflectedScalar Q F x = F x := by + simp [cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_self_of_mem_openCubeSet Q hx] + +theorem cubeCoordinateFoldReflectedVectorField_eq_self_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeCoordinateFoldReflectedVectorField Q G x = G x := by + ext i + have hLower : cubeLowerFaceCoord Q i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := not_lt.mpr hLower.le + simp [cubeCoordinateFoldReflectedVectorField, cubeCoordinateFoldSign, + cubeCoordinateFold_eq_self_of_mem_openCubeSet Q hx, hnotLower, hUpper] + +/-- On the lower same-scale face neighbor, the all-coordinate fold is the +one-coordinate lower-face reflection. -/ +theorem cubeCoordinateFold_eq_cubeLowerFaceReflection_of_mem_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + cubeCoordinateFold Q x = cubeLowerFaceReflection Q i x := by + ext j + by_cases hji : j = i + · subst j + have hLower : x i < cubeLowerFaceCoord Q i := by + have hxi := (hx i).2 + simp [cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + -1 + (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeLowerFaceCoord Q i := by + simp [cubeLowerFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rwa [hface] at hxi + simp [cubeCoordinateFold, cubeLowerFaceReflection, hLower] + · have hxjQ : + cubeLowerFaceCoord Q j < x j ∧ x j < cubeUpperFaceCoord Q j := by + have hxj := hx j + simpa [openCubeSet, cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeLowerFaceCoord, cubeUpperFaceCoord, hji] using! hxj + have hnotLower : ¬ x j < cubeLowerFaceCoord Q j := + not_lt.mpr hxjQ.1.le + simp [cubeCoordinateFold, cubeLowerFaceReflection, hji, hnotLower, + hxjQ.2] + +/-- On the upper same-scale face neighbor, the all-coordinate fold is the +one-coordinate upper-face reflection. -/ +theorem cubeCoordinateFold_eq_cubeUpperFaceReflection_of_mem_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + cubeCoordinateFold Q x = cubeUpperFaceReflection Q i x := by + ext j + by_cases hji : j = i + · subst j + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := by + have hxi := (hx i).1 + have hscale : 0 < (3 : ℝ) ^ Q.scale := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeUpperFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + 1 - (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeUpperFaceCoord Q i := by + simp [cubeUpperFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rw [hface] at hxi + have hLowerUpper : + cubeLowerFaceCoord Q i < cubeUpperFaceCoord Q i := by + dsimp [cubeLowerFaceCoord, cubeUpperFaceCoord, cubeScaleFactor] + nlinarith + rw [not_lt] + exact le_trans hLowerUpper.le hxi.le + have hnotUpper : ¬ x i < cubeUpperFaceCoord Q i := by + have hxi := (hx i).1 + simp [cubeUpperFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + 1 - (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeUpperFaceCoord Q i := by + simp [cubeUpperFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rw [hface] at hxi + exact not_lt.mpr hxi.le + simp [cubeCoordinateFold, cubeUpperFaceReflection, hnotLower, hnotUpper] + · have hxjQ : + cubeLowerFaceCoord Q j < x j ∧ x j < cubeUpperFaceCoord Q j := by + have hxj := hx j + simpa [openCubeSet, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeLowerFaceCoord, cubeUpperFaceCoord, hji] using! hxj + have hnotLower : ¬ x j < cubeLowerFaceCoord Q j := + not_lt.mpr hxjQ.1.le + simp [cubeCoordinateFold, cubeUpperFaceReflection, hji, hnotLower, + hxjQ.2] + +/-- The all-coordinate fold sign is `1` on the original open cube. -/ +theorem cubeCoordinateFoldSign_eq_one_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) {x : Vec d} (hx : x ∈ openCubeSet Q) + (i : Fin d) : + cubeCoordinateFoldSign Q x i = 1 := by + have hLower : cubeLowerFaceCoord Q i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := not_lt.mpr hLower.le + simp [cubeCoordinateFoldSign, hnotLower, hUpper] + +/-- On the lower same-scale face neighbor, the all-coordinate fold sign is the +one-coordinate reflection sign. -/ +theorem cubeCoordinateFoldSign_of_mem_cubeLowerFaceNeighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) (j : Fin d) : + cubeCoordinateFoldSign Q x j = if j = i then -1 else 1 := by + by_cases hji : j = i + · subst j + have hLower : x i < cubeLowerFaceCoord Q i := by + have hxi := (hx i).2 + simp [cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + -1 + (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeLowerFaceCoord Q i := by + simp [cubeLowerFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rwa [hface] at hxi + simp [cubeCoordinateFoldSign, hLower] + · have hxjQ : + cubeLowerFaceCoord Q j < x j ∧ x j < cubeUpperFaceCoord Q j := by + have hxj := hx j + simpa [openCubeSet, cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeLowerFaceCoord, cubeUpperFaceCoord, hji] using! hxj + have hnotLower : ¬ x j < cubeLowerFaceCoord Q j := + not_lt.mpr hxjQ.1.le + simp [cubeCoordinateFoldSign, hji, hnotLower, hxjQ.2] + +/-- On the upper same-scale face neighbor, the all-coordinate fold sign is the +one-coordinate reflection sign. -/ +theorem cubeCoordinateFoldSign_of_mem_cubeUpperFaceNeighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) (j : Fin d) : + cubeCoordinateFoldSign Q x j = if j = i then -1 else 1 := by + by_cases hji : j = i + · subst j + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := by + have hxi := (hx i).1 + have hscale : 0 < (3 : ℝ) ^ Q.scale := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeUpperFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + 1 - (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeUpperFaceCoord Q i := by + simp [cubeUpperFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rw [hface] at hxi + have hLowerUpper : + cubeLowerFaceCoord Q i < cubeUpperFaceCoord Q i := by + dsimp [cubeLowerFaceCoord, cubeUpperFaceCoord, cubeScaleFactor] + nlinarith + rw [not_lt] + exact le_trans hLowerUpper.le hxi.le + have hnotUpper : ¬ x i < cubeUpperFaceCoord Q i := by + have hxi := (hx i).1 + simp [cubeUpperFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hxi + have hface : + (↑(Q.index i) + 1 - (2 : ℝ)⁻¹) * 3 ^ Q.scale = + cubeUpperFaceCoord Q i := by + simp [cubeUpperFaceCoord, cubeScaleFactor] + ring_nf + left + trivial + rw [hface] at hxi + exact not_lt.mpr hxi.le + simp [cubeCoordinateFoldSign, hnotLower, hnotUpper] + · have hxjQ : + cubeLowerFaceCoord Q j < x j ∧ x j < cubeUpperFaceCoord Q j := by + have hxj := hx j + simpa [openCubeSet, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeLowerFaceCoord, cubeUpperFaceCoord, hji] using! hxj + have hnotLower : ¬ x j < cubeLowerFaceCoord Q j := + not_lt.mpr hxjQ.1.le + simp [cubeCoordinateFoldSign, hji, hnotLower, hxjQ.2] + +/-- The coordinatewise fold maps the open all-coordinate reflection block into +the original open cube. -/ +theorem cubeCoordinateFold_mem_openCubeSet_of_mem_block {d : ℕ} + (Q : TriadicCube d) {x : Vec d} + (hx : x ∈ cubeFaceReflectionBlockSet Q) : + cubeCoordinateFold Q x ∈ openCubeSet Q := by + intro i + let l := cubeLowerFaceCoord Q i + let u := cubeUpperFaceCoord Q i + let s := cubeScaleFactor Q + have hs : 0 < s := by + simpa [s, cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hus : u - l = s := by + dsimp [u, l, s, cubeUpperFaceCoord, cubeLowerFaceCoord] + ring + rcases hx i with hLower | hMiddle | hUpper + · have hfold : + cubeCoordinateFold Q x i = 2 * l - x i := by + simp [cubeCoordinateFold, l, hLower.2] + constructor + · change l < cubeCoordinateFold Q x i + rw [hfold] + linarith + · change cubeCoordinateFold Q x i < u + rw [hfold] + linarith + · have hnotLower : ¬ x i < l := not_lt.mpr hMiddle.1.le + have hfold : cubeCoordinateFold Q x i = x i := by + simp [cubeCoordinateFold, l, hnotLower, hMiddle.2] + constructor + · change l < cubeCoordinateFold Q x i + rw [hfold] + exact hMiddle.1 + · change cubeCoordinateFold Q x i < u + rw [hfold] + exact hMiddle.2 + · have hnotLower : ¬ x i < l := by + exact not_lt.mpr (le_trans (by linarith [hus, hs]) hUpper.1.le) + have hnotUpper : ¬ x i < u := not_lt.mpr hUpper.1.le + have hfold : + cubeCoordinateFold Q x i = 2 * u - x i := by + simp [cubeCoordinateFold, l, u, hnotLower, hnotUpper] + constructor + · change l < cubeCoordinateFold Q x i + rw [hfold] + linarith + · change cubeCoordinateFold Q x i < u + rw [hfold] + linarith + +/-- On each reflection-block cell, the `x`-dependent coordinate fold agrees +with the affine fold map attached to that cell. -/ +theorem cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeCoordinateFold Q x = cubeFaceReflectionCellFoldMap Q choice x := by + have hxCell : x ∈ cubeFaceReflectionCellSet Q choice := by + simpa [openCubeSet_cubeFaceReflectionCellCube] using hx + ext i + let l := cubeLowerFaceCoord Q i + let u := cubeUpperFaceCoord Q i + let s := cubeScaleFactor Q + have hu : u = l + s := by + dsimp [u, l, s, cubeUpperFaceCoord, cubeLowerFaceCoord, + cubeScaleFactor] + ring + have hs : 0 < s := by + simpa [s, cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hlu : l < u := by + rw [hu] + exact lt_add_of_pos_right l hs + have hcoord := hxCell i + by_cases h0 : choice i = 0 + · have hstrip : l - s < x i ∧ x i < l := by + simpa [cubeFaceReflectionCellCoordSet, h0, l, s] using hcoord + have hLower : x i < cubeLowerFaceCoord Q i := by + simpa [l] using hstrip.2 + simp [cubeCoordinateFold, cubeFaceReflectionCellFoldMap, h0, hLower] + · by_cases h1 : choice i = 1 + · have hstrip : l < x i ∧ x i < u := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, l, u] using + hcoord + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := by + simpa [l] using not_lt.mpr hstrip.1.le + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [u] using hstrip.2 + simp [cubeCoordinateFold, cubeFaceReflectionCellFoldMap, h1, + hnotLower, hUpper] + · have hstrip : u < x i ∧ x i < u + s := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, u, s] using + hcoord + have hli : cubeLowerFaceCoord Q i < x i := by + have hliu : l < x i := lt_trans hlu hstrip.1 + simpa [l] using hliu + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := + not_lt.mpr hli.le + have hnotUpper : ¬ x i < cubeUpperFaceCoord Q i := by + simpa [u] using not_lt.mpr hstrip.1.le + simp [cubeCoordinateFold, cubeFaceReflectionCellFoldMap, h0, h1, + hnotLower, hnotUpper] + +/-- On each reflection-block cell, the `x`-dependent fold sign is the +constant sign of the affine cell fold. -/ +theorem cubeCoordinateFoldSign_eq_cellFoldLinear_sign_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) + (i : Fin d) : + cubeCoordinateFoldSign Q x i = if choice i = 1 then 1 else -1 := by + have hxCell : x ∈ cubeFaceReflectionCellSet Q choice := by + simpa [openCubeSet_cubeFaceReflectionCellCube] using hx + let l := cubeLowerFaceCoord Q i + let u := cubeUpperFaceCoord Q i + let s := cubeScaleFactor Q + have hcoord := hxCell i + by_cases h0 : choice i = 0 + · have hstrip : l - s < x i ∧ x i < l := by + simpa [cubeFaceReflectionCellCoordSet, h0, l, s] using hcoord + have hLower : x i < cubeLowerFaceCoord Q i := by + simpa [l] using hstrip.2 + simp [cubeCoordinateFoldSign, h0, hLower] + · by_cases h1 : choice i = 1 + · have hstrip : l < x i ∧ x i < u := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, l, u] using + hcoord + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := by + simpa [l] using not_lt.mpr hstrip.1.le + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [u] using hstrip.2 + simp [cubeCoordinateFoldSign, h1, hnotLower, hUpper] + · have hstrip : u < x i ∧ x i < u + s := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, u, s] using + hcoord + have hnotLower : ¬ x i < cubeLowerFaceCoord Q i := by + have hscale : 0 < s := by + simpa [s, cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hlu : l < u := by + dsimp [l, u, s, cubeLowerFaceCoord, cubeUpperFaceCoord, + cubeScaleFactor] at hscale ⊢ + nlinarith + exact not_lt.mpr (le_trans hlu.le (by simpa [u] using hstrip.1.le)) + have hnotUpper : ¬ x i < cubeUpperFaceCoord Q i := by + simpa [u] using not_lt.mpr hstrip.1.le + simp [cubeCoordinateFoldSign, h1, hnotLower, hnotUpper] + +/-- On each reflection-block cell, scalar pullback by the `x`-dependent fold +agrees with scalar pullback by the affine cell fold. -/ +theorem cubeCoordinateFoldReflectedScalar_eq_cellFoldMap_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (F : Vec d → ℝ) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeCoordinateFoldReflectedScalar Q F x = + F (cubeFaceReflectionCellFoldMap Q choice x) := by + simp [cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + +/-- On each reflection-block cell, the reflected vector field agrees with the +affine cell-fold linear sign applied to the pulled-back vector field. -/ +theorem cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + (G : Vec d → Vec d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + cubeCoordinateFoldReflectedVectorField Q G x = + cubeFaceReflectionCellFoldLinear choice + (G (cubeFaceReflectionCellFoldMap Q choice x)) := by + ext i + rw [cubeCoordinateFoldReflectedVectorField, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + rw [cubeCoordinateFoldSign_eq_cellFoldLinear_sign_of_mem_cellCube + Q choice hx i] + by_cases h1 : choice i = 1 <;> simp [h1] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockIntegrals.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockIntegrals.lean new file mode 100644 index 0000000000..21d9273a06 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/BlockIntegrals.lean @@ -0,0 +1,399 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Folding.BlockDecomposition + +/-! # Block Integrals -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-- On a reflection-block cell, the smooth cell-folded potential has gradient +given by the all-coordinate reflected vector field. -/ +theorem euclideanGradient_comp_cubeFaceReflectionCellFoldMap_eq_reflectedVectorField + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) {x : Vec d} + (hx : x ∈ openCubeSet (cubeFaceReflectionCellCube Q choice)) : + euclideanGradient + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x = + cubeCoordinateFoldReflectedVectorField Q (euclideanGradient u) x := by + rw [euclideanGradient_comp_cubeFaceReflectionCellFoldMap hu Q choice x] + rw [cubeCoordinateFoldReflectedVectorField_eq_cellFoldLinear_of_mem_cellCube + Q choice (euclideanGradient u) hx] + +/-- The Hessian-square energy of a smooth function precomposed with a +reflection-cell fold is one copy of the original cube Hessian-square energy. -/ +theorem setIntegral_cubeFaceReflectionCellCube_sum_sq_secondDeriv_comp_cellFoldMap + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x) ^ 2) + ∂volume = + ∫ y in openCubeSet Q, + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u y) ^ 2) ∂volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x) ^ 2) + ∂volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u + (cubeFaceReflectionCellFoldMap Q choice x)) ^ 2) + ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x _hx + exact sum_sq_euclideanCoordSecondDeriv_comp_cubeFaceReflectionCellFoldMap + hu Q choice x + _ = ∫ y in openCubeSet Q, + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u y) ^ 2) ∂volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice + (fun y => + ∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u y) ^ 2) + +/-- The Laplacian-square energy of a smooth function precomposed with a +reflection-cell fold is one copy of the original cube Laplacian-square energy. -/ +theorem setIntegral_cubeFaceReflectionCellCube_laplacian_sq_comp_cellFoldMap + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (euclideanCoordLaplacian + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x) ^ 2 + ∂volume = + ∫ y in openCubeSet Q, (euclideanCoordLaplacian u y) ^ 2 + ∂volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (euclideanCoordLaplacian + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x) ^ 2 + ∂volume = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + (euclideanCoordLaplacian u + (cubeFaceReflectionCellFoldMap Q choice x)) ^ 2 + ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x _hx + exact congrArg (fun z : ℝ => z ^ 2) + (euclideanCoordLaplacian_comp_cubeFaceReflectionCellFoldMap + hu Q choice x) + _ = ∫ y in openCubeSet Q, (euclideanCoordLaplacian u y) ^ 2 + ∂volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice + (fun y => (euclideanCoordLaplacian u y) ^ 2) + +/-- The scalar square energy on any reflection-block cell is one copy of the +original cube energy. -/ +theorem setIntegral_cubeFaceReflectionCellCube_cubeCoordinateFoldReflectedScalar_sq + {d : ℕ} {F : Vec d → ℝ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x ∂volume = + ∫ y in openCubeSet Q, F y * F y ∂volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x ∂volume + = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + F (cubeFaceReflectionCellFoldMap Q choice x) * + F (cubeFaceReflectionCellFoldMap Q choice x) ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x = + F (cubeFaceReflectionCellFoldMap Q choice x) * + F (cubeFaceReflectionCellFoldMap Q choice x) + simp [cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + _ = ∫ y in openCubeSet Q, F y * F y ∂volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => F y * F y) + +/-- The vector self-pairing energy on any reflection-block cell is one copy +of the original cube energy. -/ +theorem setIntegral_cubeFaceReflectionCellCube_cubeCoordinateFoldReflectedVectorField_self_pairing + {d : ℕ} {G : Vec d → Vec d} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) ∂volume = + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + calc + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) ∂volume + = + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (G (cubeFaceReflectionCellFoldMap Q choice x)) ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice)) ?_ + intro x hx + change + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) = + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (G (cubeFaceReflectionCellFoldMap Q choice x)) + rw [vecDot_cubeCoordinateFoldReflectedVectorField_self, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + _ = ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + simpa using + setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap + Q choice (fun y => vecDot (G y) (G y)) + +/-- The scalar square energy on the full all-coordinate reflection block is +the sum of one identical copy over each reflection cell. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedScalar_sq + {d : ℕ} {F : Vec d → ℝ} (Q : TriadicCube d) + (hF : + MeasureTheory.Integrable + (fun y => F y * F y) (volume.restrict (openCubeSet Q))) : + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x ∂volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * F y ∂volume := by + classical + let f : Vec d → ℝ := fun x => + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x + have hfcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + have hcomp : + MeasureTheory.Integrable + (fun x => + F (cubeFaceReflectionCellFoldMap Q choice x) * + F (cubeFaceReflectionCellFoldMap Q choice x)) + (volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := fun y => F y * F y) hF + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + simp [f, cubeCoordinateFoldReflectedScalar, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + cubeCoordinateFoldReflectedScalar Q F x * + cubeCoordinateFoldReflectedScalar Q F x ∂volume + = ∫ x in cubeFaceReflectionBlockSet Q, f x ∂volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfcell + _ = ∑ _choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, F y * F y ∂volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_cubeCoordinateFoldReflectedScalar_sq + Q choice + _ = (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, F y * F y ∂volume := by + simp + +/-- The vector self-pairing energy on the full all-coordinate reflection block +is the sum of one identical copy over each reflection cell. -/ +theorem setIntegral_cubeFaceReflectionBlockSet_cubeCoordinateFoldReflectedVectorField_self_pairing + {d : ℕ} {G : Vec d → Vec d} (Q : TriadicCube d) + (hG : + MeasureTheory.Integrable + (fun y => vecDot (G y) (G y)) + (volume.restrict (openCubeSet Q))) : + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) ∂volume = + (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + classical + let f : Vec d → ℝ := fun x => + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) + have hfcell : + ∀ choice : Fin d → Fin 3, + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + intro choice + have hcomp : + MeasureTheory.Integrable + (fun x => + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (G (cubeFaceReflectionCellFoldMap Q choice x))) + (volume.restrict + (openCubeSet (cubeFaceReflectionCellCube Q choice))) := + integrable_cubeFaceReflectionCellCube_comp_cellFoldMap + (Q := Q) (choice := choice) (g := fun y => vecDot (G y) (G y)) hG + refine hcomp.congr ?_ + filter_upwards + [MeasureTheory.ae_restrict_mem + (measurableSet_openCubeSet (cubeFaceReflectionCellCube Q choice))] + with x hx + change + vecDot (G (cubeFaceReflectionCellFoldMap Q choice x)) + (G (cubeFaceReflectionCellFoldMap Q choice x)) = + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) + rw [vecDot_cubeCoordinateFoldReflectedVectorField_self, + cubeCoordinateFold_eq_cubeFaceReflectionCellFoldMap_of_mem_cellCube + Q choice hx] + calc + ∫ x in cubeFaceReflectionBlockSet Q, + vecDot (cubeCoordinateFoldReflectedVectorField Q G x) + (cubeCoordinateFoldReflectedVectorField Q G x) ∂volume + = ∫ x in cubeFaceReflectionBlockSet Q, f x ∂volume := rfl + _ = ∑ choice : Fin d → Fin 3, + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + f x ∂volume := by + exact setIntegral_cubeFaceReflectionBlockSet_cellCube Q f hfcell + _ = ∑ _choice : Fin d → Fin 3, + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + apply Finset.sum_congr rfl + intro choice _hchoice + simpa [f] using + setIntegral_cubeFaceReflectionCellCube_cubeCoordinateFoldReflectedVectorField_self_pairing + Q choice + _ = (Fintype.card (Fin d → Fin 3) : ℝ) * + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + simp + +/-- Set-integral split over the union of an open cube and its upper face +neighbor. -/ +theorem setIntegral_openCubeSet_union_upperFaceNeighbor {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (i : Fin d) (f : Vec d → E) + (hQ : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet Q))) + (hN : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeUpperFaceNeighbor Q i)))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeUpperFaceNeighbor Q i), + f x ∂volume = + ∫ x in openCubeSet Q, f x ∂volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), f x ∂volume := by + exact MeasureTheory.setIntegral_union + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) hQ hN + +/-- Set-integral split over the union of an open cube and its lower face +neighbor. -/ +theorem setIntegral_openCubeSet_union_lowerFaceNeighbor {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (i : Fin d) (f : Vec d → E) + (hQ : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet Q))) + (hN : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeLowerFaceNeighbor Q i)))) : + ∫ x in openCubeSet Q ∪ openCubeSet (cubeLowerFaceNeighbor Q i), + f x ∂volume = + ∫ x in openCubeSet Q, f x ∂volume + + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), f x ∂volume := by + exact MeasureTheory.setIntegral_union + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i) + (measurableSet_openCubeSet (cubeLowerFaceNeighbor Q i)) hQ hN + +/-- Set-integral split over the lower/original/upper one-coordinate +face-neighbor slab. -/ +theorem setIntegral_cubeFaceNeighborSlabSet {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (i : Fin d) (f : Vec d → E) + (hL : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeLowerFaceNeighbor Q i)))) + (hQ : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet Q))) + (hU : + MeasureTheory.Integrable f + (volume.restrict (openCubeSet (cubeUpperFaceNeighbor Q i)))) : + ∫ x in cubeFaceNeighborSlabSet Q i, f x ∂volume = + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), f x ∂volume + + ∫ x in openCubeSet Q, f x ∂volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), f x ∂volume := by + let L := openCubeSet (cubeLowerFaceNeighbor Q i) + let M := openCubeSet Q + let U := openCubeSet (cubeUpperFaceNeighbor Q i) + have hLM_U : Disjoint (L ∪ M) U := by + rw [Set.disjoint_left] + intro x hxLM hxU + rcases hxLM with hxL | hxM + · exact + (Set.disjoint_left.mp + (disjoint_cubeLowerFaceNeighbor_cubeUpperFaceNeighbor Q i) + hxL) hxU + · exact + (Set.disjoint_left.mp + (disjoint_openCubeSet_cubeUpperFaceNeighbor Q i) + hxM) hxU + have hLM : + MeasureTheory.Integrable f (volume.restrict (L ∪ M)) := by + simpa [MeasureTheory.IntegrableOn, L, M] using + (MeasureTheory.integrableOn_union.mpr ⟨hL, hQ⟩ : + MeasureTheory.IntegrableOn f (L ∪ M) volume) + have hsplitLM : + ∫ x in L ∪ M, f x ∂volume = + ∫ x in L, f x ∂volume + ∫ x in M, f x ∂volume := by + exact MeasureTheory.setIntegral_union + (disjoint_openCubeSet_cubeLowerFaceNeighbor Q i).symm + (measurableSet_openCubeSet Q) hL hQ + have hsplitAll : + ∫ x in (L ∪ M) ∪ U, f x ∂volume = + ∫ x in L ∪ M, f x ∂volume + ∫ x in U, f x ∂volume := by + exact MeasureTheory.setIntegral_union hLM_U + (measurableSet_openCubeSet (cubeUpperFaceNeighbor Q i)) hLM hU + calc + ∫ x in cubeFaceNeighborSlabSet Q i, f x ∂volume + = ∫ x in (L ∪ M) ∪ U, f x ∂volume := by + simp [cubeFaceNeighborSlabSet, L, M, U] + _ = ∫ x in L ∪ M, f x ∂volume + ∫ x in U, f x ∂volume := hsplitAll + _ = (∫ x in L, f x ∂volume + ∫ x in M, f x ∂volume) + + ∫ x in U, f x ∂volume := by + rw [hsplitLM] + _ = ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), f x ∂volume + + ∫ x in openCubeSet Q, f x ∂volume + + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), f x ∂volume := by + simp [L, M, U] +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/Geometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/Geometry.lean new file mode 100644 index 0000000000..cb6434f6f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Folding/Geometry.lean @@ -0,0 +1,754 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections + +/-! # Geometry -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-- The three-cube slab obtained by adjoining both same-coordinate face +neighbors to `Q`. -/ +def cubeFaceNeighborSlabSet {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + Set (Vec d) := + (openCubeSet (cubeLowerFaceNeighbor Q i) ∪ openCubeSet Q) ∪ + openCubeSet (cubeUpperFaceNeighbor Q i) + +/-- The open block obtained by allowing each coordinate to lie in the lower +neighbor strip, the original cube strip, or the upper neighbor strip. + +This is the all-coordinate target for iterating the one-coordinate reflection +argument. It excludes the internal reflecting faces, which are null sets for +the later weak-form argument. -/ +def cubeFaceReflectionBlockSet {d : ℕ} (Q : TriadicCube d) : + Set (Vec d) := + {x | ∀ i : Fin d, + (cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i) ∨ + (cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i) ∨ + (cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q)} + +/-- One coordinate strip of the all-coordinate reflection block. The choice +`0` is the lower neighbor strip, `1` is the original cube strip, and `2` is the +upper neighbor strip. -/ +def cubeFaceReflectionCellCoordSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin 3) (i : Fin d) : + Set (Vec d) := + if choice = 0 then + {x | cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i} + else if choice = 1 then + {x | cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i} + else + {x | cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q} + +/-- A `3^d` cell of the all-coordinate reflection block, with an independent +lower/original/upper strip choice in every coordinate. -/ +def cubeFaceReflectionCellSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : Set (Vec d) := + {x | ∀ i : Fin d, x ∈ cubeFaceReflectionCellCoordSet Q (choice i) i} + +/-- Integer shift associated to a reflection cell coordinate choice: +lower/original/upper corresponds to `-1/0/1`. -/ +def cubeFaceReflectionCellShift (choice : Fin 3) : ℤ := + if choice = 0 then -1 else if choice = 1 then 0 else 1 + +/-- The translated cube represented by a `3^d` reflection-block cell. -/ +def cubeFaceReflectionCellCube {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : TriadicCube d := + translateCube (fun i => cubeFaceReflectionCellShift (choice i)) Q + +theorem cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h0 : choice i = 0) : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeLowerFaceCoord Q i - cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeLowerFaceCoord, translateCube, cubeScaleFactor, h0] + ring_nf + +theorem cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h0 : choice i = 0) : + cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeLowerFaceCoord Q i := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeUpperFaceCoord, cubeLowerFaceCoord, translateCube, cubeScaleFactor, + h0] + ring_nf + left + trivial + +theorem cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h1 : choice i = 1) : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeLowerFaceCoord Q i := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeLowerFaceCoord, translateCube, cubeScaleFactor, h1] + +theorem cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h1 : choice i = 1) : + cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeUpperFaceCoord, translateCube, cubeScaleFactor, h1] + +theorem cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h0 : choice i ≠ 0) (h1 : choice i ≠ 1) : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeUpperFaceCoord Q i := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeLowerFaceCoord, cubeUpperFaceCoord, translateCube, cubeScaleFactor, + h0, h1] + ring_nf + left + trivial + +theorem cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + {d : ℕ} (Q : TriadicCube d) (choice : Fin d → Fin 3) + {i : Fin d} (h0 : choice i ≠ 0) (h1 : choice i ≠ 1) : + cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i = + cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeFaceReflectionCellCube, cubeFaceReflectionCellShift, + cubeUpperFaceCoord, translateCube, cubeScaleFactor, h0, h1] + ring_nf + +/-- A reflection-block cell is exactly the open translated triadic cube with +coordinate shifts `-1/0/1` prescribed by its choices. -/ +theorem openCubeSet_cubeFaceReflectionCellCube {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + openCubeSet (cubeFaceReflectionCellCube Q choice) = + cubeFaceReflectionCellSet Q choice := by + ext x + constructor + · intro hx i + have hLowerCell : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i < x i := by + simpa [cubeLowerFaceCoord] using (hx i).1 + have hUpperCell : + x i < cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i := by + simpa [cubeUpperFaceCoord] using (hx i).2 + by_cases h0 : choice i = 0 + · have hLower : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + Q choice h0] using hLowerCell + have hUpper : x i < cubeLowerFaceCoord Q i := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + Q choice h0] using hUpperCell + simpa [cubeFaceReflectionCellCoordSet, h0] using + (And.intro hLower hUpper) + · by_cases h1 : choice i = 1 + · have hLower : cubeLowerFaceCoord Q i < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + Q choice h1] using hLowerCell + have hUpper : x i < cubeUpperFaceCoord Q i := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + Q choice h1] using hUpperCell + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using + (And.intro hLower hUpper) + · have hLower : cubeUpperFaceCoord Q i < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + Q choice h0 h1] using hLowerCell + have hUpper : + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + Q choice h0 h1] using hUpperCell + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using + (And.intro hLower hUpper) + · intro hx i + have hcoord := hx i + by_cases h0 : choice i = 0 + · have hstrip : + cubeLowerFaceCoord Q i - cubeScaleFactor Q < x i ∧ + x i < cubeLowerFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet, h0] using hcoord + constructor + · have hLowerCell : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + Q choice h0] using hstrip.1 + simpa [cubeLowerFaceCoord] using hLowerCell + · have hUpperCell : + x i < cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_zero + Q choice h0] using hstrip.2 + simpa [cubeUpperFaceCoord] using hUpperCell + · by_cases h1 : choice i = 1 + · have hstrip : + cubeLowerFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hcoord + constructor + · have hLowerCell : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + Q choice h1] using hstrip.1 + simpa [cubeLowerFaceCoord] using hLowerCell + · have hUpperCell : + x i < cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_eq_one + Q choice h1] using hstrip.2 + simpa [cubeUpperFaceCoord] using hUpperCell + · have hstrip : + cubeUpperFaceCoord Q i < x i ∧ + x i < cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1] using hcoord + constructor + · have hLowerCell : + cubeLowerFaceCoord (cubeFaceReflectionCellCube Q choice) i < x i := by + simpa [cubeLowerFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + Q choice h0 h1] using hstrip.1 + simpa [cubeLowerFaceCoord] using hLowerCell + · have hUpperCell : + x i < cubeUpperFaceCoord (cubeFaceReflectionCellCube Q choice) i := by + simpa [cubeUpperFaceCoord_cubeFaceReflectionCellCube_of_choice_upper + Q choice h0 h1] using hstrip.2 + simpa [cubeUpperFaceCoord] using hUpperCell + +/-- Coordinatewise fold from the all-coordinate reflection block back toward +the original cube. Below the lower face it reflects through the lower face, +inside the cube it is the identity, and above the upper face it reflects +through the upper face. -/ +def cubeCoordinateFold {d : ℕ} (Q : TriadicCube d) (x : Vec d) : Vec d := + fun i => + if x i < cubeLowerFaceCoord Q i then + 2 * cubeLowerFaceCoord Q i - x i + else if x i < cubeUpperFaceCoord Q i then + x i + else + 2 * cubeUpperFaceCoord Q i - x i + +/-- Sign contributed to a vector component by the coordinatewise fold. The +component changes sign exactly when that coordinate was reflected through one +of the two faces. -/ +def cubeCoordinateFoldSign {d : ℕ} (Q : TriadicCube d) (x : Vec d) + (i : Fin d) : ℝ := + if x i < cubeLowerFaceCoord Q i then + -1 + else if x i < cubeUpperFaceCoord Q i then + 1 + else + -1 + +/-- Scalar field pulled back by the all-coordinate fold. -/ +def cubeCoordinateFoldReflectedScalar {d : ℕ} + (Q : TriadicCube d) (F : Vec d → ℝ) : Vec d → ℝ := + fun x => F (cubeCoordinateFold Q x) + +/-- Vector field pulled back by the all-coordinate fold with the reflection +sign in each component. -/ +def cubeCoordinateFoldReflectedVectorField {d : ℕ} + (Q : TriadicCube d) (G : Vec d → Vec d) : Vec d → Vec d := + fun x i => cubeCoordinateFoldSign Q x i * G (cubeCoordinateFold Q x) i + +/-- The affine fold map associated to one reflection-block cell. It is the +same as `cubeCoordinateFold` on that cell, but has no `x`-dependent +branching. -/ +def cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : Vec d → Vec d := + fun x i => + if choice i = 0 then + 2 * cubeLowerFaceCoord Q i - x i + else if choice i = 1 then + x i + else + 2 * cubeUpperFaceCoord Q i - x i + +/-- Linear part of the affine fold map associated to a reflection-block cell: +original-coordinate choices have sign `+1`, reflected choices have sign `-1`. +-/ +def cubeFaceReflectionCellFoldLinear {d : ℕ} + (choice : Fin d → Fin 3) : Vec d →L[ℝ] Vec d := + ContinuousLinearMap.pi fun i : Fin d => + if choice i = 1 then + ContinuousLinearMap.proj i + else + -ContinuousLinearMap.proj i + +@[simp] theorem cubeFaceReflectionCellFoldLinear_apply {d : ℕ} + (choice : Fin d → Fin 3) (v : Vec d) (i : Fin d) : + cubeFaceReflectionCellFoldLinear choice v i = + if choice i = 1 then v i else -v i := by + by_cases h1 : choice i = 1 <;> + simp [cubeFaceReflectionCellFoldLinear, h1] + +theorem cubeFaceReflectionCellFoldLinear_basisVec {d : ℕ} + (choice : Fin d → Fin 3) (k : Fin d) : + cubeFaceReflectionCellFoldLinear choice (basisVec k) = + (if choice k = 1 then (1 : ℝ) else -1) • basisVec k := by + ext j + by_cases hkj : k = j + · subst k + by_cases h1 : choice j = 1 <;> simp [h1] + · have hjk : j ≠ k := fun h => hkj h.symm + by_cases h1j : choice j = 1 <;> + by_cases h1k : choice k = 1 <;> + simp [hjk, h1j, h1k] + +theorem cubeFaceReflectionCellFoldLinear_involutive {d : ℕ} + (choice : Fin d → Fin 3) : + Function.Involutive (cubeFaceReflectionCellFoldLinear choice) := by + intro v + ext i + by_cases h1 : choice i = 1 <;> simp [h1] + +theorem vecDot_cubeFaceReflectionCellFoldLinear_left {d : ℕ} + (choice : Fin d → Fin 3) (v w : Vec d) : + vecDot (cubeFaceReflectionCellFoldLinear choice v) w = + vecDot v (cubeFaceReflectionCellFoldLinear choice w) := by + classical + simp [vecDot, mul_comm] + +theorem cubeFaceReflectionCellFoldMap_involutive {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + Function.Involutive (cubeFaceReflectionCellFoldMap Q choice) := by + intro x + ext i + by_cases h0 : choice i = 0 + · simp [cubeFaceReflectionCellFoldMap, h0] + · by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionCellFoldMap, h1] + · simp [cubeFaceReflectionCellFoldMap, h0, h1] + +theorem injective_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + Function.Injective (cubeFaceReflectionCellFoldMap Q choice) := by + intro x y hxy + have h := congrArg (cubeFaceReflectionCellFoldMap Q choice) hxy + simpa [cubeFaceReflectionCellFoldMap_involutive Q choice x, + cubeFaceReflectionCellFoldMap_involutive Q choice y] using h + +theorem continuous_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + Continuous (cubeFaceReflectionCellFoldMap Q choice) := by + rw [continuous_pi_iff] + intro i + by_cases h0 : choice i = 0 + · simp [cubeFaceReflectionCellFoldMap, h0] + continuity + · by_cases h1 : choice i = 1 + · simpa [cubeFaceReflectionCellFoldMap, h1] using continuous_apply i + · simp [cubeFaceReflectionCellFoldMap, h0, h1] + continuity + +/-- The affine fold map associated to a reflection cell, as a homeomorphism. +Its inverse is itself. -/ +def cubeFaceReflectionCellFoldHomeomorph {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : Vec d ≃ₜ Vec d where + toEquiv := + { toFun := cubeFaceReflectionCellFoldMap Q choice + invFun := cubeFaceReflectionCellFoldMap Q choice + left_inv := cubeFaceReflectionCellFoldMap_involutive Q choice + right_inv := cubeFaceReflectionCellFoldMap_involutive Q choice } + continuous_toFun := continuous_cubeFaceReflectionCellFoldMap Q choice + continuous_invFun := continuous_cubeFaceReflectionCellFoldMap Q choice + +/-- The affine fold map associated to a reflection cell is smooth. -/ +theorem contDiff_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + ContDiff ℝ (⊤ : ℕ∞) (cubeFaceReflectionCellFoldMap Q choice) := by + rw [contDiff_pi] + intro i + by_cases h0 : choice i = 0 + · simpa [cubeFaceReflectionCellFoldMap, h0] using + (contDiff_const.sub (contDiff_apply ℝ ℝ i) : + ContDiff ℝ (⊤ : ℕ∞) fun x : Vec d => (2 * cubeLowerFaceCoord Q i) - x i) + · by_cases h1 : choice i = 1 + · simpa [cubeFaceReflectionCellFoldMap, h0, h1] using + (contDiff_apply ℝ ℝ i : ContDiff ℝ (⊤ : ℕ∞) fun x : Vec d => x i) + · simpa [cubeFaceReflectionCellFoldMap, h0, h1] using + (contDiff_const.sub (contDiff_apply ℝ ℝ i) : + ContDiff ℝ (⊤ : ℕ∞) fun x : Vec d => (2 * cubeUpperFaceCoord Q i) - x i) + +/-- Smoothness of a compact-test function is preserved by precomposition with +the affine fold map of a reflection cell. -/ +theorem contDiff_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) : + ContDiff ℝ (⊤ : ℕ∞) + (fun x => φ (cubeFaceReflectionCellFoldMap Q choice x)) := by + simpa [Function.comp_def] using + hφ.comp (contDiff_cubeFaceReflectionCellFoldMap Q choice) + +/-- The Fréchet derivative of a reflection-cell fold map is its diagonal +linear reflection part. -/ +theorem fderiv_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) (x : Vec d) : + fderiv ℝ (cubeFaceReflectionCellFoldMap Q choice) x = + cubeFaceReflectionCellFoldLinear choice := by + rw [fderiv_pi] + · ext v i + by_cases h0 : choice i = 0 + · have hderiv : + fderiv ℝ (fun y : Vec d => (2 * cubeLowerFaceCoord Q i) - y i) x = + -ContinuousLinearMap.proj i := by + rw [fderiv_const_sub] + exact + congrArg Neg.neg + (hasFDerivAt_apply (𝕜 := ℝ) i x).fderiv + simp [cubeFaceReflectionCellFoldMap, h0, hderiv] + · by_cases h1 : choice i = 1 + · have hderiv : + fderiv ℝ (fun y : Vec d => y i) x = + ContinuousLinearMap.proj i := by + exact (hasFDerivAt_apply (𝕜 := ℝ) i x).fderiv + simp [cubeFaceReflectionCellFoldMap, h1, hderiv] + · have hderiv : + fderiv ℝ (fun y : Vec d => (2 * cubeUpperFaceCoord Q i) - y i) x = + -ContinuousLinearMap.proj i := by + rw [fderiv_const_sub] + exact + congrArg Neg.neg + (hasFDerivAt_apply (𝕜 := ℝ) i x).fderiv + simp [cubeFaceReflectionCellFoldMap, h0, h1, hderiv] + · intro i + by_cases h0 : choice i = 0 + · simpa [cubeFaceReflectionCellFoldMap, h0] using + (((hasFDerivAt_apply (𝕜 := ℝ) i x).const_sub + (2 * cubeLowerFaceCoord Q i)).differentiableAt) + · by_cases h1 : choice i = 1 + · simpa [cubeFaceReflectionCellFoldMap, h0, h1] using + ((hasFDerivAt_apply (𝕜 := ℝ) i x).differentiableAt) + · simpa [cubeFaceReflectionCellFoldMap, h0, h1] using + (((hasFDerivAt_apply (𝕜 := ℝ) i x).const_sub + (2 * cubeUpperFaceCoord Q i)).differentiableAt) + +/-- Chain rule for gradients after precomposing a smooth test with a +reflection-cell fold map. -/ +theorem euclideanGradient_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (Q : TriadicCube d) (choice : Fin d → Fin 3) (x : Vec d) : + euclideanGradient + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x = + cubeFaceReflectionCellFoldLinear choice + (euclideanGradient φ (cubeFaceReflectionCellFoldMap Q choice x)) := by + have hcomp : + fderiv ℝ + (fun y => φ (cubeFaceReflectionCellFoldMap Q choice y)) x = + (fderiv ℝ φ (cubeFaceReflectionCellFoldMap Q choice x)).comp + (cubeFaceReflectionCellFoldLinear choice) := by + change + fderiv ℝ (φ ∘ cubeFaceReflectionCellFoldMap Q choice) x = + (fderiv ℝ φ (cubeFaceReflectionCellFoldMap Q choice x)).comp + (cubeFaceReflectionCellFoldLinear choice) + rw [fderiv_comp] + · rw [fderiv_cubeFaceReflectionCellFoldMap] + · exact + (hφ.differentiable (by simp)) + (cubeFaceReflectionCellFoldMap Q choice x) + · exact + (contDiff_cubeFaceReflectionCellFoldMap Q choice).differentiable + (by simp) x + ext k + unfold euclideanGradient euclideanCoordDeriv + rw [hcomp] + rw [ContinuousLinearMap.comp_apply] + rw [cubeFaceReflectionCellFoldLinear_basisVec] + by_cases h1 : choice k = 1 <;> simp [h1] + +/-- Coordinate derivative chain rule for precomposition with a reflection-cell +fold map. -/ +theorem euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) (k : Fin d) + (x : Vec d) : + euclideanCoordDeriv k + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x = + (if choice k = 1 then (1 : ℝ) else -1) * + euclideanCoordDeriv k u (cubeFaceReflectionCellFoldMap Q choice x) := by + have hgrad := + congrFun (euclideanGradient_comp_cubeFaceReflectionCellFoldMap + hu Q choice x) k + by_cases h1 : choice k = 1 + · simpa [cubeFaceReflectionCellFoldLinear, euclideanGradient, + euclideanCoordDeriv, h1] using hgrad + · simpa [cubeFaceReflectionCellFoldLinear, euclideanGradient, + euclideanCoordDeriv, h1] using hgrad + +/-- Second coordinate-derivative chain rule for precomposition with a +reflection-cell fold map. Each reflected coordinate contributes one sign. -/ +theorem euclideanCoordSecondDeriv_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) + (k l : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k l + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x = + ((if choice k = 1 then (1 : ℝ) else -1) * + (if choice l = 1 then (1 : ℝ) else -1)) * + euclideanCoordSecondDeriv k l u + (cubeFaceReflectionCellFoldMap Q choice x) := by + let sk : ℝ := if choice k = 1 then (1 : ℝ) else -1 + let sl : ℝ := if choice l = 1 then (1 : ℝ) else -1 + have hderiv_fun : + euclideanCoordDeriv k + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) = + fun y => sk * + euclideanCoordDeriv k u + (cubeFaceReflectionCellFoldMap Q choice y) := by + funext y + simpa [sk] using + euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap + hu Q choice k y + unfold euclideanCoordSecondDeriv + rw [hderiv_fun] + have hdiff : + DifferentiableAt ℝ + (fun y => + euclideanCoordDeriv k u + (cubeFaceReflectionCellFoldMap Q choice y)) x := by + exact (((contDiff_euclideanCoordDeriv hu k).differentiable (by simp)) + (cubeFaceReflectionCellFoldMap Q choice x)).comp x + ((contDiff_cubeFaceReflectionCellFoldMap Q choice).differentiable + (by simp) x) + rw [fderiv_const_mul hdiff sk] + change sk * + euclideanCoordDeriv l + (fun y => + euclideanCoordDeriv k u + (cubeFaceReflectionCellFoldMap Q choice y)) x = + (sk * sl) * euclideanCoordSecondDeriv k l u + (cubeFaceReflectionCellFoldMap Q choice x) + rw [euclideanCoordDeriv_comp_cubeFaceReflectionCellFoldMap + (u := euclideanCoordDeriv k u) (contDiff_euclideanCoordDeriv hu k) + Q choice l x] + simp [euclideanCoordSecondDeriv, euclideanCoordDeriv, sk, sl] + +/-- Diagonal second derivatives are invariant under a reflection-cell fold. -/ +theorem euclideanCoordSecondDeriv_diag_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) + (k : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv k k + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x = + euclideanCoordSecondDeriv k k u + (cubeFaceReflectionCellFoldMap Q choice x) := by + rw [euclideanCoordSecondDeriv_comp_cubeFaceReflectionCellFoldMap + hu Q choice k k x] + by_cases hk : choice k = 1 <;> simp [hk] + +/-- The coordinate Laplacian is invariant under a reflection-cell fold. -/ +theorem euclideanCoordLaplacian_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) (x : Vec d) : + euclideanCoordLaplacian + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x = + euclideanCoordLaplacian u + (cubeFaceReflectionCellFoldMap Q choice x) := by + unfold euclideanCoordLaplacian + apply Finset.sum_congr rfl + intro k _hk + exact euclideanCoordSecondDeriv_diag_comp_cubeFaceReflectionCellFoldMap + hu Q choice k x + +/-- The pointwise squared Hessian sum is invariant under a reflection-cell +fold. -/ +theorem sum_sq_euclideanCoordSecondDeriv_comp_cubeFaceReflectionCellFoldMap + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (Q : TriadicCube d) (choice : Fin d → Fin 3) (x : Vec d) : + (∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l + (fun y => u (cubeFaceReflectionCellFoldMap Q choice y)) x) ^ 2) = + ∑ k : Fin d, ∑ l : Fin d, + (euclideanCoordSecondDeriv k l u + (cubeFaceReflectionCellFoldMap Q choice x)) ^ 2 := by + apply Finset.sum_congr rfl + intro k _hk + apply Finset.sum_congr rfl + intro l _hl + rw [euclideanCoordSecondDeriv_comp_cubeFaceReflectionCellFoldMap + hu Q choice k l x] + by_cases hk : choice k = 1 <;> by_cases hl : choice l = 1 <;> + simp [hk, hl, pow_two] + +/-- Compact support of a test function is preserved by precomposition with +the affine fold map of a reflection cell. -/ +theorem hasCompactSupport_comp_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) + {φ : Vec d → ℝ} (hφ : HasCompactSupport φ) : + HasCompactSupport + (fun x => φ (cubeFaceReflectionCellFoldMap Q choice x)) := by + show HasCompactSupport (φ ∘ cubeFaceReflectionCellFoldHomeomorph Q choice) + simpa [Function.comp, cubeFaceReflectionCellFoldHomeomorph] using + hφ.comp_homeomorph (cubeFaceReflectionCellFoldHomeomorph Q choice) + +theorem measurableEmbedding_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + MeasurableEmbedding (cubeFaceReflectionCellFoldMap Q choice) := + (continuous_cubeFaceReflectionCellFoldMap Q choice).measurableEmbedding + (injective_cubeFaceReflectionCellFoldMap Q choice) + +theorem measurePreserving_cubeFaceReflectionCellFoldMap {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + MeasurePreserving (cubeFaceReflectionCellFoldMap Q choice) := by + let f : (i : Fin d) → ℝ → ℝ := + fun i => + if choice i = 0 then + realFaceReflection (cubeLowerFaceCoord Q i) + else if choice i = 1 then + id + else + realFaceReflection (cubeUpperFaceCoord Q i) + have hf : ∀ i : Fin d, MeasurePreserving (f i) := by + intro i + by_cases h0 : choice i = 0 + · simp [f, h0, measurePreserving_realFaceReflection] + · by_cases h1 : choice i = 1 + · simp [f, h1, MeasurePreserving.id (volume : Measure ℝ)] + · simp [f, h0, h1, measurePreserving_realFaceReflection] + have hpi : + MeasurePreserving (fun x : Vec d => fun i : Fin d => f i (x i)) := + volume_preserving_pi hf + convert hpi using 1 + ext x i + by_cases h0 : choice i = 0 + · simp [cubeFaceReflectionCellFoldMap, f, h0, realFaceReflection] + · by_cases h1 : choice i = 1 + · simp [cubeFaceReflectionCellFoldMap, f, h1] + · simp [cubeFaceReflectionCellFoldMap, f, h0, h1, realFaceReflection] + +/-- The cell fold map carries exactly its associated reflection-block cell +onto the original open cube. -/ +theorem preimage_cubeFaceReflectionCellFoldMap_openCubeSet {d : ℕ} + (Q : TriadicCube d) (choice : Fin d → Fin 3) : + cubeFaceReflectionCellFoldMap Q choice ⁻¹' openCubeSet Q = + openCubeSet (cubeFaceReflectionCellCube Q choice) := by + suffices + cubeFaceReflectionCellFoldMap Q choice ⁻¹' openCubeSet Q = + cubeFaceReflectionCellSet Q choice by + simpa [openCubeSet_cubeFaceReflectionCellCube] using this + ext x + constructor + · intro hx i + let l := cubeLowerFaceCoord Q i + let u := cubeUpperFaceCoord Q i + let s := cubeScaleFactor Q + have hu : u = l + s := by + dsimp [u, l, s, cubeUpperFaceCoord, cubeLowerFaceCoord, + cubeScaleFactor] + ring + have hxQ : + l < cubeFaceReflectionCellFoldMap Q choice x i ∧ + cubeFaceReflectionCellFoldMap Q choice x i < u := by + simpa [l, u, cubeLowerFaceCoord, cubeUpperFaceCoord] using hx i + by_cases h0 : choice i = 0 + · have hq : l < 2 * l - x i ∧ 2 * l - x i < u := by + simpa [cubeFaceReflectionCellFoldMap, h0, l] using hxQ + have hLower : l - s < x i := by + rw [hu] at hq + linarith + have hUpper : x i < l := by + linarith + simpa [cubeFaceReflectionCellCoordSet, h0, l, s] using + And.intro hLower hUpper + · by_cases h1 : choice i = 1 + · have hq : l < x i ∧ x i < u := by + simpa [cubeFaceReflectionCellFoldMap, h0, h1, l, u] using hxQ + simpa [cubeFaceReflectionCellCoordSet, h0, h1, l, u] using hq + · have hq : l < 2 * u - x i ∧ 2 * u - x i < u := by + simpa [cubeFaceReflectionCellFoldMap, h0, h1, u] using hxQ + have hLower : u < x i := by + linarith + have hUpper : x i < u + s := by + rw [hu] at hq + linarith + simpa [cubeFaceReflectionCellCoordSet, h0, h1, u, s] using + And.intro hLower hUpper + · intro hx i + let l := cubeLowerFaceCoord Q i + let u := cubeUpperFaceCoord Q i + let s := cubeScaleFactor Q + have hu : u = l + s := by + dsimp [u, l, s, cubeUpperFaceCoord, cubeLowerFaceCoord, + cubeScaleFactor] + ring + have hcoord := hx i + have hfold : + cubeLowerFaceCoord Q i < + cubeFaceReflectionCellFoldMap Q choice x i ∧ + cubeFaceReflectionCellFoldMap Q choice x i < + cubeUpperFaceCoord Q i := by + by_cases h0 : choice i = 0 + · have hstrip : l - s < x i ∧ x i < l := by + simpa [cubeFaceReflectionCellCoordSet, h0, l, s] using hcoord + constructor + · simpa [cubeFaceReflectionCellFoldMap, h0, l, + cubeLowerFaceCoord] using (by linarith : l < 2 * l - x i) + · have hlt : 2 * l - x i < u := by + rw [hu] + linarith + simpa [cubeFaceReflectionCellFoldMap, h0, l, u, + cubeUpperFaceCoord] using hlt + · by_cases h1 : choice i = 1 + · have hstrip : l < x i ∧ x i < u := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, l, u] using + hcoord + simpa [cubeFaceReflectionCellFoldMap, h0, h1, l, u, + cubeLowerFaceCoord, cubeUpperFaceCoord] using hstrip + · have hstrip : u < x i ∧ x i < u + s := by + simpa [cubeFaceReflectionCellCoordSet, h0, h1, u, s] using + hcoord + constructor + · have hlt : l < 2 * u - x i := by + rw [hu] + linarith + simpa [cubeFaceReflectionCellFoldMap, h0, h1, u, l, + cubeLowerFaceCoord] using hlt + · simpa [cubeFaceReflectionCellFoldMap, h0, h1, u, + cubeUpperFaceCoord] using (by linarith : 2 * u - x i < u) + simpa [cubeLowerFaceCoord, cubeUpperFaceCoord] using hfold + +/-- Change variables from a reflection-block cell to the original open cube +using the cell fold map. -/ +theorem setIntegral_cubeFaceReflectionCellCube_comp_cellFoldMap {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (choice : Fin d → Fin 3) (g : Vec d → E) : + ∫ x in openCubeSet (cubeFaceReflectionCellCube Q choice), + g (cubeFaceReflectionCellFoldMap Q choice x) ∂volume = + ∫ y in openCubeSet Q, g y ∂volume := by + rw [← preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice] + exact (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).setIntegral_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) g + (openCubeSet Q) + +/-- Integrability transports from the original open cube to a reflection-block +cell by precomposition with the cell fold map. -/ +theorem integrable_cubeFaceReflectionCellCube_comp_cellFoldMap {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + {Q : TriadicCube d} {choice : Fin d → Fin 3} {g : Vec d → E} + (hg : + MeasureTheory.Integrable g (volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => g (cubeFaceReflectionCellFoldMap Q choice x)) + (volume.restrict (openCubeSet (cubeFaceReflectionCellCube Q choice))) := by + have hmp := + (measurePreserving_cubeFaceReflectionCellFoldMap Q choice).restrict_preimage_emb + (measurableEmbedding_cubeFaceReflectionCellFoldMap Q choice) + (openCubeSet Q) + simpa [preimage_cubeFaceReflectionCellFoldMap_openCubeSet Q choice, + Function.comp_def] using hmp.integrable_comp_of_integrable hg + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Homeomorphism.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Homeomorphism.lean new file mode 100644 index 0000000000..baeb832769 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Homeomorphism.lean @@ -0,0 +1,384 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeReflection.Reflections +public import Mathlib.MeasureTheory.Group.Measure + +/-! # Homeomorphism -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +noncomputable section + +theorem injective_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) : + Function.Injective (coordFaceReflection (d := d) a i) := by + intro x y hxy + have h := congrArg (coordFaceReflection a i) hxy + simpa using h + +def coordFaceReflectionHomeomorph {d : ℕ} + (a : ℝ) (i : Fin d) : Vec d ≃ₜ Vec d where + toFun := coordFaceReflection a i + invFun := coordFaceReflection a i + left_inv := coordFaceReflection_involutive a i + right_inv := coordFaceReflection_involutive a i + continuous_toFun := continuous_coordFaceReflection a i + continuous_invFun := continuous_coordFaceReflection a i + +def cubeUpperFaceReflectionHomeomorph {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : Vec d ≃ₜ Vec d := + coordFaceReflectionHomeomorph (cubeUpperFaceCoord Q i) i + +def cubeLowerFaceReflectionHomeomorph {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : Vec d ≃ₜ Vec d := + coordFaceReflectionHomeomorph (cubeLowerFaceCoord Q i) i + +theorem measurableEmbedding_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) : + MeasurableEmbedding (coordFaceReflection (d := d) a i) := + (continuous_coordFaceReflection a i).measurableEmbedding + (injective_coordFaceReflection a i) + +theorem measurableEmbedding_cubeUpperFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + MeasurableEmbedding (cubeUpperFaceReflection Q i) := by + simpa [cubeUpperFaceReflection] using + measurableEmbedding_coordFaceReflection (d := d) (cubeUpperFaceCoord Q i) i + +theorem measurableEmbedding_cubeLowerFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + MeasurableEmbedding (cubeLowerFaceReflection Q i) := by + simpa [cubeLowerFaceReflection] using + measurableEmbedding_coordFaceReflection (d := d) (cubeLowerFaceCoord Q i) i + +theorem preimage_cubeUpperFaceReflection_openCubeSet {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeUpperFaceReflection Q i ⁻¹' openCubeSet Q = + openCubeSet (cubeUpperFaceNeighbor Q i) := by + ext x + constructor + · intro hx + have hmem := + cubeUpperFaceReflection_mem_neighbor_of_mem_openCubeSet Q i (x := cubeUpperFaceReflection Q i x) hx + simpa [cubeUpperFaceReflection] using hmem + · intro hx + exact cubeUpperFaceReflection_mem_openCubeSet_of_mem_neighbor Q i hx + +theorem preimage_cubeUpperFaceReflection_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeUpperFaceReflection Q i ⁻¹' openCubeSet (cubeUpperFaceNeighbor Q i) = + openCubeSet Q := by + ext x + constructor + · intro hx + have hmem := + cubeUpperFaceReflection_mem_openCubeSet_of_mem_neighbor Q i + (x := cubeUpperFaceReflection Q i x) hx + simpa [cubeUpperFaceReflection] using hmem + · intro hx + exact cubeUpperFaceReflection_mem_neighbor_of_mem_openCubeSet Q i hx + +theorem preimage_cubeLowerFaceReflection_openCubeSet {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeLowerFaceReflection Q i ⁻¹' openCubeSet Q = + openCubeSet (cubeLowerFaceNeighbor Q i) := by + ext x + constructor + · intro hx + have hmem := + cubeLowerFaceReflection_mem_neighbor_of_mem_openCubeSet Q i (x := cubeLowerFaceReflection Q i x) hx + simpa [cubeLowerFaceReflection] using hmem + · intro hx + exact cubeLowerFaceReflection_mem_openCubeSet_of_mem_neighbor Q i hx + +theorem preimage_cubeLowerFaceReflection_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeLowerFaceReflection Q i ⁻¹' openCubeSet (cubeLowerFaceNeighbor Q i) = + openCubeSet Q := by + ext x + constructor + · intro hx + have hmem := + cubeLowerFaceReflection_mem_openCubeSet_of_mem_neighbor Q i + (x := cubeLowerFaceReflection Q i x) hx + simpa [cubeLowerFaceReflection] using hmem + · intro hx + exact cubeLowerFaceReflection_mem_neighbor_of_mem_openCubeSet Q i hx + +theorem setIntegral_cubeUpperFaceNeighbor_comp_reflection {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (i : Fin d) (g : Vec d → E) : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + g (cubeUpperFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet Q, g y ∂volume := by + rw [← preimage_cubeUpperFaceReflection_openCubeSet Q i] + exact (measurePreserving_cubeUpperFaceReflection Q i).setIntegral_preimage_emb + (measurableEmbedding_cubeUpperFaceReflection Q i) g (openCubeSet Q) + +theorem setIntegral_openCubeSet_comp_cubeUpperFaceReflection {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (i : Fin d) (g : Vec d → E) : + ∫ x in openCubeSet Q, g (cubeUpperFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet (cubeUpperFaceNeighbor Q i), g y ∂volume := by + rw [← preimage_cubeUpperFaceReflection_neighbor Q i] + exact (measurePreserving_cubeUpperFaceReflection Q i).setIntegral_preimage_emb + (measurableEmbedding_cubeUpperFaceReflection Q i) g + (openCubeSet (cubeUpperFaceNeighbor Q i)) + +theorem setIntegral_cubeLowerFaceNeighbor_comp_reflection {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (i : Fin d) (g : Vec d → E) : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + g (cubeLowerFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet Q, g y ∂volume := by + rw [← preimage_cubeLowerFaceReflection_openCubeSet Q i] + exact (measurePreserving_cubeLowerFaceReflection Q i).setIntegral_preimage_emb + (measurableEmbedding_cubeLowerFaceReflection Q i) g (openCubeSet Q) + +theorem setIntegral_openCubeSet_comp_cubeLowerFaceReflection {d : ℕ} + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (Q : TriadicCube d) (i : Fin d) (g : Vec d → E) : + ∫ x in openCubeSet Q, g (cubeLowerFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet (cubeLowerFaceNeighbor Q i), g y ∂volume := by + rw [← preimage_cubeLowerFaceReflection_neighbor Q i] + exact (measurePreserving_cubeLowerFaceReflection Q i).setIntegral_preimage_emb + (measurableEmbedding_cubeLowerFaceReflection Q i) g + (openCubeSet (cubeLowerFaceNeighbor Q i)) + +/-- Integrability of a reflected scalar forcing/test product transports from +`Q` to the upper face neighbor. -/ +theorem integrable_cubeUpperFaceNeighbor_reflectedScalar_mul {d : ℕ} + {F φ : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hreflected : + MeasureTheory.Integrable + (fun y => F y * φ (cubeUpperFaceReflection Q i y)) + (volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => F (cubeUpperFaceReflection Q i x) * φ x) + (volume.restrict (openCubeSet (cubeUpperFaceNeighbor Q i))) := by + let B : Vec d → ℝ := fun x => F (cubeUpperFaceReflection Q i x) * φ x + have hcomp : + MeasureTheory.Integrable + (fun y => B (cubeUpperFaceReflection Q i y)) + (volume.restrict (openCubeSet Q)) := by + refine hreflected.congr ?_ + filter_upwards with y + simp [B] + have hpre : + MeasureTheory.IntegrableOn + (fun y => B (cubeUpperFaceReflection Q i y)) + (cubeUpperFaceReflection Q i ⁻¹' + openCubeSet (cubeUpperFaceNeighbor Q i)) volume := by + simpa [MeasureTheory.IntegrableOn, + preimage_cubeUpperFaceReflection_neighbor Q i] using hcomp + have hiff := MeasureTheory.MeasurePreserving.integrableOn_comp_preimage + (measurePreserving_cubeUpperFaceReflection Q i) + (measurableEmbedding_cubeUpperFaceReflection Q i) + (f := B) (s := openCubeSet (cubeUpperFaceNeighbor Q i)) + have hB : + MeasureTheory.IntegrableOn B + (openCubeSet (cubeUpperFaceNeighbor Q i)) volume := + hiff.mp hpre + simpa [MeasureTheory.IntegrableOn, B] using hB + +/-- Integrability of a reflected scalar forcing/test product transports from +`Q` to the lower face neighbor. -/ +theorem integrable_cubeLowerFaceNeighbor_reflectedScalar_mul {d : ℕ} + {F φ : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hreflected : + MeasureTheory.Integrable + (fun y => F y * φ (cubeLowerFaceReflection Q i y)) + (volume.restrict (openCubeSet Q))) : + MeasureTheory.Integrable + (fun x => F (cubeLowerFaceReflection Q i x) * φ x) + (volume.restrict (openCubeSet (cubeLowerFaceNeighbor Q i))) := by + let B : Vec d → ℝ := fun x => F (cubeLowerFaceReflection Q i x) * φ x + have hcomp : + MeasureTheory.Integrable + (fun y => B (cubeLowerFaceReflection Q i y)) + (volume.restrict (openCubeSet Q)) := by + refine hreflected.congr ?_ + filter_upwards with y + simp [B] + have hpre : + MeasureTheory.IntegrableOn + (fun y => B (cubeLowerFaceReflection Q i y)) + (cubeLowerFaceReflection Q i ⁻¹' + openCubeSet (cubeLowerFaceNeighbor Q i)) volume := by + simpa [MeasureTheory.IntegrableOn, + preimage_cubeLowerFaceReflection_neighbor Q i] using hcomp + have hiff := MeasureTheory.MeasurePreserving.integrableOn_comp_preimage + (measurePreserving_cubeLowerFaceReflection Q i) + (measurableEmbedding_cubeLowerFaceReflection Q i) + (f := B) (s := openCubeSet (cubeLowerFaceNeighbor Q i)) + have hB : + MeasureTheory.IntegrableOn B + (openCubeSet (cubeLowerFaceNeighbor Q i)) volume := + hiff.mp hpre + simpa [MeasureTheory.IntegrableOn, B] using hB + +/-- Scalar `L²` membership transports from `Q` to the upper face neighbor by +precomposition with the upper face reflection. -/ +theorem memScalarL2_cubeUpperFaceNeighbor_comp_reflection {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) + (fun x => F (cubeUpperFaceReflection Q i x)) := by + have hmp := + (measurePreserving_cubeUpperFaceReflection Q i).restrict_preimage_emb + (measurableEmbedding_cubeUpperFaceReflection Q i) (openCubeSet Q) + simpa [MemScalarL2, volumeMeasureOn, + preimage_cubeUpperFaceReflection_openCubeSet Q i, Function.comp_def] using + hF.comp_measurePreserving hmp + +/-- Scalar `L²` membership transports from `Q` to the lower face neighbor by +precomposition with the lower face reflection. -/ +theorem memScalarL2_cubeLowerFaceNeighbor_comp_reflection {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) + (hF : MemScalarL2 (openCubeSet Q) F) : + MemScalarL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) + (fun x => F (cubeLowerFaceReflection Q i x)) := by + have hmp := + (measurePreserving_cubeLowerFaceReflection Q i).restrict_preimage_emb + (measurableEmbedding_cubeLowerFaceReflection Q i) (openCubeSet Q) + simpa [MemScalarL2, volumeMeasureOn, + preimage_cubeLowerFaceReflection_openCubeSet Q i, Function.comp_def] using + hF.comp_measurePreserving hmp + +/-- Vector `L²` membership transports from `Q` to the upper face neighbor under +the reflected vector-field rule. -/ +theorem memVectorL2_cubeUpperFaceNeighbor_reflected {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) + (fun x => coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) := by + have hmp := + (measurePreserving_cubeUpperFaceReflection Q i).restrict_preimage_emb + (measurableEmbedding_cubeUpperFaceReflection Q i) (openCubeSet Q) + have hcomp : + MemVectorL2 (openCubeSet (cubeUpperFaceNeighbor Q i)) + (fun x => G (cubeUpperFaceReflection Q i x)) := by + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeUpperFaceReflection_openCubeSet Q i, Function.comp_def] using + hG.comp_measurePreserving hmp + simpa [Function.comp_def] using + (coordReflectionLinear i).comp_memLp' hcomp + +/-- Vector `L²` membership transports from `Q` to the lower face neighbor under +the reflected vector-field rule. -/ +theorem memVectorL2_cubeLowerFaceNeighbor_reflected {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) + (hG : MemVectorL2 (openCubeSet Q) G) : + MemVectorL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) + (fun x => coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) := by + have hmp := + (measurePreserving_cubeLowerFaceReflection Q i).restrict_preimage_emb + (measurableEmbedding_cubeLowerFaceReflection Q i) (openCubeSet Q) + have hcomp : + MemVectorL2 (openCubeSet (cubeLowerFaceNeighbor Q i)) + (fun x => G (cubeLowerFaceReflection Q i x)) := by + simpa [MemVectorL2, volumeMeasureOn, + preimage_cubeLowerFaceReflection_openCubeSet Q i, Function.comp_def] using + hG.comp_measurePreserving hmp + simpa [Function.comp_def] using + (coordReflectionLinear i).comp_memLp' hcomp + +/-- The scalar square integral is preserved when transported to the upper face +neighbor by reflection. -/ +theorem setIntegral_cubeUpperFaceNeighbor_reflectedScalar_sq {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + F (cubeUpperFaceReflection Q i x) * + F (cubeUpperFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet Q, F y * F y ∂volume := by + simpa using + setIntegral_cubeUpperFaceNeighbor_comp_reflection Q i + (fun y => F y * F y) + +/-- The scalar square integral is preserved when transported to the lower face +neighbor by reflection. -/ +theorem setIntegral_cubeLowerFaceNeighbor_reflectedScalar_sq {d : ℕ} + {F : Vec d → ℝ} (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + F (cubeLowerFaceReflection Q i x) * + F (cubeLowerFaceReflection Q i x) ∂volume = + ∫ y in openCubeSet Q, F y * F y ∂volume := by + simpa using + setIntegral_cubeLowerFaceNeighbor_comp_reflection Q i + (fun y => F y * F y) + +/-- The vector self-pairing integral is preserved when the vector field is +reflected to the upper face neighbor. -/ +theorem setIntegral_cubeUpperFaceNeighbor_reflectedField_self_pairing {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂volume = + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + calc + ∫ x in openCubeSet (cubeUpperFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeUpperFaceReflection Q i x))) + ∂volume + = ∫ y in openCubeSet Q, + vecDot (coordReflectionLinear i (G y)) + (coordReflectionLinear i (G y)) ∂volume := by + simpa using + setIntegral_cubeUpperFaceNeighbor_comp_reflection Q i + (fun y => + vecDot (coordReflectionLinear i (G y)) + (coordReflectionLinear i (G y))) + _ = ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + exact vecDot_coordReflectionLinear_coordReflectionLinear i (G y) (G y) + +/-- The vector self-pairing integral is preserved when the vector field is +reflected to the lower face neighbor. -/ +theorem setIntegral_cubeLowerFaceNeighbor_reflectedField_self_pairing {d : ℕ} + {G : Vec d → Vec d} (Q : TriadicCube d) (i : Fin d) : + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂volume = + ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + calc + ∫ x in openCubeSet (cubeLowerFaceNeighbor Q i), + vecDot + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + (coordReflectionLinear i (G (cubeLowerFaceReflection Q i x))) + ∂volume + = ∫ y in openCubeSet Q, + vecDot (coordReflectionLinear i (G y)) + (coordReflectionLinear i (G y)) ∂volume := by + simpa using + setIntegral_cubeLowerFaceNeighbor_comp_reflection Q i + (fun y => + vecDot (coordReflectionLinear i (G y)) + (coordReflectionLinear i (G y))) + _ = ∫ y in openCubeSet Q, vecDot (G y) (G y) ∂volume := by + refine MeasureTheory.setIntegral_congr_fun + (measurableSet_openCubeSet Q) ?_ + intro y _hy + exact vecDot_coordReflectionLinear_coordReflectionLinear i (G y) (G y) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Reflections.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Reflections.lean new file mode 100644 index 0000000000..2bcdfe2dfd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/CubeReflection/Reflections.lean @@ -0,0 +1,410 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMeasure +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import Mathlib.MeasureTheory.Group.Measure + +/-! # Reflections -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +/-! +# Cube face reflections + +This file begins the C.2 reflection infrastructure for the cube Neumann +`W^{2,2}` discharge. The key analytic reflection step will be proved in weak +form; the lemmas here supply the affine one-coordinate face reflections and +their first coordinate-derivative chain rule. +-/ + +noncomputable section + +/-- One-dimensional reflection through the point `a`. -/ +def realFaceReflection (a : ℝ) : ℝ → ℝ := + fun t => 2 * a - t + +/-- Lower coordinate face of a triadic cube. -/ +def cubeLowerFaceCoord {d : ℕ} (Q : TriadicCube d) (i : Fin d) : ℝ := + (((Q.index i : ℝ) - (1 / 2 : ℝ)) * cubeScaleFactor Q) + +/-- Upper coordinate face of a triadic cube. -/ +def cubeUpperFaceCoord {d : ℕ} (Q : TriadicCube d) (i : Fin d) : ℝ := + (((Q.index i : ℝ) + (1 / 2 : ℝ)) * cubeScaleFactor Q) + +/-- Linear part of reflection in the coordinate hyperplane normal to `basisVec i`. -/ +def coordReflectionLinear {d : ℕ} (i : Fin d) : Vec d →L[ℝ] Vec d := + ContinuousLinearMap.pi fun j : Fin d => + if j = i then -ContinuousLinearMap.proj j else ContinuousLinearMap.proj j + +/-- Translation offset for the affine reflection through the face coordinate `a`. -/ +def coordFaceReflectionOffset {d : ℕ} (a : ℝ) (i : Fin d) : Vec d := + fun j => if j = i then 2 * a else 0 + +/-- Reflection through the coordinate hyperplane `{x_i = a}`. -/ +def coordFaceReflection {d : ℕ} (a : ℝ) (i : Fin d) : Vec d → Vec d := + fun x => coordReflectionLinear i x + coordFaceReflectionOffset a i + +/-- Reflection through the upper `i`-face of `Q`. -/ +def cubeUpperFaceReflection {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + Vec d → Vec d := + coordFaceReflection (cubeUpperFaceCoord Q i) i + +/-- Reflection through the lower `i`-face of `Q`. -/ +def cubeLowerFaceReflection {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + Vec d → Vec d := + coordFaceReflection (cubeLowerFaceCoord Q i) i + +/-- Integer coordinate shift by `n` in one coordinate and zero tangentially. -/ +def coordIndexShift {d : ℕ} (i : Fin d) (n : ℤ) : Fin d → ℤ := + fun j => if j = i then n else 0 + +/-- Same-scale cube adjacent to `Q` across its upper `i`-face. -/ +def cubeUpperFaceNeighbor {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + TriadicCube d := + translateCube (coordIndexShift i 1) Q + +/-- Same-scale cube adjacent to `Q` across its lower `i`-face. -/ +def cubeLowerFaceNeighbor {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + TriadicCube d := + translateCube (coordIndexShift i (-1)) Q + +@[simp] theorem cubeLowerFaceCoord_cubeLowerFaceNeighbor_self {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeLowerFaceCoord (cubeLowerFaceNeighbor Q i) i = + cubeLowerFaceCoord Q i - cubeScaleFactor Q := by + simp [cubeLowerFaceCoord, cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor] + ring_nf + +@[simp] theorem cubeUpperFaceCoord_cubeLowerFaceNeighbor_self {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeUpperFaceCoord (cubeLowerFaceNeighbor Q i) i = + cubeLowerFaceCoord Q i := by + simp [cubeUpperFaceCoord, cubeLowerFaceCoord, cubeLowerFaceNeighbor, + coordIndexShift, translateCube, cubeScaleFactor] + ring_nf + left + trivial + +@[simp] theorem cubeLowerFaceCoord_cubeUpperFaceNeighbor_self {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeLowerFaceCoord (cubeUpperFaceNeighbor Q i) i = + cubeUpperFaceCoord Q i := by + simp [cubeLowerFaceCoord, cubeUpperFaceCoord, cubeUpperFaceNeighbor, + coordIndexShift, translateCube, cubeScaleFactor] + ring_nf + left + trivial + +@[simp] theorem cubeUpperFaceCoord_cubeUpperFaceNeighbor_self {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + cubeUpperFaceCoord (cubeUpperFaceNeighbor Q i) i = + cubeUpperFaceCoord Q i + cubeScaleFactor Q := by + simp [cubeUpperFaceCoord, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor] + ring_nf + +@[simp] theorem cubeLowerFaceCoord_cubeLowerFaceNeighbor_ne {d : ℕ} + (Q : TriadicCube d) {i j : Fin d} (hji : j ≠ i) : + cubeLowerFaceCoord (cubeLowerFaceNeighbor Q i) j = + cubeLowerFaceCoord Q j := by + simp [cubeLowerFaceCoord, cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor, hji] + +@[simp] theorem cubeUpperFaceCoord_cubeLowerFaceNeighbor_ne {d : ℕ} + (Q : TriadicCube d) {i j : Fin d} (hji : j ≠ i) : + cubeUpperFaceCoord (cubeLowerFaceNeighbor Q i) j = + cubeUpperFaceCoord Q j := by + simp [cubeUpperFaceCoord, cubeLowerFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor, hji] + +@[simp] theorem cubeLowerFaceCoord_cubeUpperFaceNeighbor_ne {d : ℕ} + (Q : TriadicCube d) {i j : Fin d} (hji : j ≠ i) : + cubeLowerFaceCoord (cubeUpperFaceNeighbor Q i) j = + cubeLowerFaceCoord Q j := by + simp [cubeLowerFaceCoord, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor, hji] + +@[simp] theorem cubeUpperFaceCoord_cubeUpperFaceNeighbor_ne {d : ℕ} + (Q : TriadicCube d) {i j : Fin d} (hji : j ≠ i) : + cubeUpperFaceCoord (cubeUpperFaceNeighbor Q i) j = + cubeUpperFaceCoord Q j := by + simp [cubeUpperFaceCoord, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor, hji] + +@[simp] theorem coordReflectionLinear_apply {d : ℕ} + (i : Fin d) (x : Vec d) (j : Fin d) : + coordReflectionLinear i x j = if j = i then -x j else x j := by + by_cases h : j = i <;> simp [coordReflectionLinear, h] + +theorem vecDot_coordReflectionLinear_left {d : ℕ} + (i : Fin d) (v w : Vec d) : + vecDot (coordReflectionLinear i v) w = + vecDot v (coordReflectionLinear i w) := by + unfold vecDot + apply Finset.sum_congr rfl + intro j _hj + by_cases hji : j = i <;> simp [hji] + +theorem vecDot_coordReflectionLinear_coordReflectionLinear {d : ℕ} + (i : Fin d) (v w : Vec d) : + vecDot (coordReflectionLinear i v) (coordReflectionLinear i w) = + vecDot v w := by + rw [vecDot_coordReflectionLinear_left] + unfold vecDot + apply Finset.sum_congr rfl + intro j _hj + by_cases hji : j = i <;> simp [hji] + +@[simp] theorem coordFaceReflection_apply {d : ℕ} + (a : ℝ) (i : Fin d) (x : Vec d) (j : Fin d) : + coordFaceReflection a i x j = if j = i then 2 * a - x j else x j := by + by_cases h : j = i + · subst h + simp [coordFaceReflection, coordFaceReflectionOffset] + ring + · simp [coordFaceReflection, coordFaceReflectionOffset, h] + +@[simp] theorem coordFaceReflection_apply_self {d : ℕ} + (a : ℝ) (i : Fin d) (x : Vec d) : + coordFaceReflection a i x i = 2 * a - x i := by + simp + +theorem coordFaceReflection_apply_ne {d : ℕ} + (a : ℝ) (i j : Fin d) (x : Vec d) (hji : j ≠ i) : + coordFaceReflection a i x j = x j := by + simp [hji] + +@[simp] theorem realFaceReflection_apply (a t : ℝ) : + realFaceReflection a t = 2 * a - t := rfl + +theorem continuous_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) : + Continuous (coordFaceReflection (d := d) a i) := by + unfold coordFaceReflection + exact (coordReflectionLinear i).continuous.add continuous_const + +theorem continuous_cubeUpperFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + Continuous (cubeUpperFaceReflection Q i) := by + simpa [cubeUpperFaceReflection] using + continuous_coordFaceReflection (d := d) (cubeUpperFaceCoord Q i) i + +theorem continuous_cubeLowerFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + Continuous (cubeLowerFaceReflection Q i) := by + simpa [cubeLowerFaceReflection] using + continuous_coordFaceReflection (d := d) (cubeLowerFaceCoord Q i) i + +theorem contDiff_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (coordFaceReflection (d := d) a i) := by + unfold coordFaceReflection + exact (coordReflectionLinear i).contDiff.add contDiff_const + +theorem contDiff_cubeUpperFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (cubeUpperFaceReflection Q i) := by + simpa [cubeUpperFaceReflection] using + contDiff_coordFaceReflection (d := d) (cubeUpperFaceCoord Q i) i + +theorem contDiff_cubeLowerFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (cubeLowerFaceReflection Q i) := by + simpa [cubeLowerFaceReflection] using + contDiff_coordFaceReflection (d := d) (cubeLowerFaceCoord Q i) i + +theorem measurePreserving_realFaceReflection (a : ℝ) : + MeasurePreserving (realFaceReflection a) := by + have hneg : MeasurePreserving (fun t : ℝ => -t) := + Measure.measurePreserving_neg (volume : Measure ℝ) + have htranslate : MeasurePreserving (fun t : ℝ => t + 2 * a) := + measurePreserving_add_right (volume : Measure ℝ) (2 * a) + convert htranslate.comp hneg using 1 + ext t + simp [realFaceReflection, sub_eq_add_neg, add_comm] + +theorem measurePreserving_coordFaceReflection {d : ℕ} + (a : ℝ) (i : Fin d) : + MeasurePreserving (coordFaceReflection (d := d) a i) := by + let f : (j : Fin d) → ℝ → ℝ := + fun j => if j = i then realFaceReflection a else id + have hf : ∀ j : Fin d, MeasurePreserving (f j) := by + intro j + by_cases hji : j = i + · simp [f, hji, measurePreserving_realFaceReflection a] + · simp [f, hji, MeasurePreserving.id (volume : Measure ℝ)] + have hpi : + MeasurePreserving (fun x : Vec d => fun j : Fin d => f j (x j)) := + volume_preserving_pi hf + convert hpi using 1 + ext x j + by_cases hji : j = i <;> simp [f, hji, realFaceReflection] + +theorem measurePreserving_cubeUpperFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + MeasurePreserving (cubeUpperFaceReflection Q i) := by + simpa [cubeUpperFaceReflection] using + measurePreserving_coordFaceReflection (d := d) (cubeUpperFaceCoord Q i) i + +theorem measurePreserving_cubeLowerFaceReflection {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + MeasurePreserving (cubeLowerFaceReflection Q i) := by + simpa [cubeLowerFaceReflection] using + measurePreserving_coordFaceReflection (d := d) (cubeLowerFaceCoord Q i) i + +theorem cubeUpperFaceReflection_mem_openCubeSet_of_mem_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeUpperFaceNeighbor Q i)) : + cubeUpperFaceReflection Q i x ∈ openCubeSet Q := by + intro j + by_cases hji : j = i + · subst j + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hxi := hx i + simp [cubeUpperFaceNeighbor, coordIndexShift, cubeUpperFaceReflection, + cubeUpperFaceCoord, translateCube, cubeScaleFactor] at hxi ⊢ + constructor <;> nlinarith [hscale] + · have hxj := hx j + simpa [openCubeSet, cubeUpperFaceNeighbor, coordIndexShift, cubeUpperFaceReflection, + cubeUpperFaceCoord, translateCube, hji] using! hxj + +theorem cubeUpperFaceReflection_mem_neighbor_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeUpperFaceReflection Q i x ∈ openCubeSet (cubeUpperFaceNeighbor Q i) := by + intro j + by_cases hji : j = i + · subst j + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hxi := hx i + simp [cubeUpperFaceNeighbor, coordIndexShift, cubeUpperFaceReflection, + cubeUpperFaceCoord, translateCube, cubeScaleFactor] at hxi ⊢ + constructor <;> nlinarith [hscale] + · have hxj := hx j + simpa [openCubeSet, cubeUpperFaceNeighbor, coordIndexShift, cubeUpperFaceReflection, + cubeUpperFaceCoord, translateCube, hji] using! hxj + +theorem cubeLowerFaceReflection_mem_openCubeSet_of_mem_neighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet (cubeLowerFaceNeighbor Q i)) : + cubeLowerFaceReflection Q i x ∈ openCubeSet Q := by + intro j + by_cases hji : j = i + · subst j + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hxi := hx i + simp [cubeLowerFaceNeighbor, coordIndexShift, cubeLowerFaceReflection, + cubeLowerFaceCoord, translateCube, cubeScaleFactor] at hxi ⊢ + constructor <;> nlinarith [hscale] + · have hxj := hx j + simpa [openCubeSet, cubeLowerFaceNeighbor, coordIndexShift, cubeLowerFaceReflection, + cubeLowerFaceCoord, translateCube, hji] using! hxj + +theorem cubeLowerFaceReflection_mem_neighbor_of_mem_openCubeSet {d : ℕ} + (Q : TriadicCube d) (i : Fin d) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + cubeLowerFaceReflection Q i x ∈ openCubeSet (cubeLowerFaceNeighbor Q i) := by + intro j + by_cases hji : j = i + · subst j + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hxi := hx i + simp [cubeLowerFaceNeighbor, coordIndexShift, cubeLowerFaceReflection, + cubeLowerFaceCoord, translateCube, cubeScaleFactor] at hxi ⊢ + constructor <;> nlinarith [hscale] + · have hxj := hx j + simpa [openCubeSet, cubeLowerFaceNeighbor, coordIndexShift, cubeLowerFaceReflection, + cubeLowerFaceCoord, translateCube, hji] using! hxj + +/-- The open cube is disjoint from its same-scale upper face neighbor. -/ +theorem disjoint_openCubeSet_cubeUpperFaceNeighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + Disjoint (openCubeSet Q) (openCubeSet (cubeUpperFaceNeighbor Q i)) := by + rw [Set.disjoint_left] + intro x hxQ hxN + have hQupper := (hxQ i).2 + have hNlower := (hxN i).1 + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeUpperFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hQupper hNlower + nlinarith [hscale] + +/-- The open cube is disjoint from its same-scale lower face neighbor. -/ +theorem disjoint_openCubeSet_cubeLowerFaceNeighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + Disjoint (openCubeSet Q) (openCubeSet (cubeLowerFaceNeighbor Q i)) := by + rw [Set.disjoint_left] + intro x hxQ hxN + have hQlower := (hxQ i).1 + have hNupper := (hxN i).2 + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeLowerFaceNeighbor, coordIndexShift, translateCube, + cubeScaleFactor] at hQlower hNupper + nlinarith [hscale] + +/-- The lower and upper same-scale face neighbors of a cube are disjoint. -/ +theorem disjoint_cubeLowerFaceNeighbor_cubeUpperFaceNeighbor {d : ℕ} + (Q : TriadicCube d) (i : Fin d) : + Disjoint + (openCubeSet (cubeLowerFaceNeighbor Q i)) + (openCubeSet (cubeUpperFaceNeighbor Q i)) := by + rw [Set.disjoint_left] + intro x hxL hxU + have hLupper := (hxL i).2 + have hUlower := (hxU i).1 + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + simp [cubeLowerFaceNeighbor, cubeUpperFaceNeighbor, coordIndexShift, + translateCube, cubeScaleFactor] at hLupper hUlower + norm_num at hLupper hUlower + have hscale' : 0 < (3 : ℝ) ^ Q.scale := by + simpa [cubeScaleFactor] using hscale + nlinarith [hscale'] + + +@[simp] theorem coordFaceReflection_involutive {d : ℕ} + (a : ℝ) (i : Fin d) (x : Vec d) : + coordFaceReflection a i (coordFaceReflection a i x) = x := by + ext j + by_cases hji : j = i + · subst hji + simp + · simp [hji] + +@[simp] theorem cubeUpperFaceReflection_involutive {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + cubeUpperFaceReflection Q i (cubeUpperFaceReflection Q i x) = x := by + change coordFaceReflection (cubeUpperFaceCoord Q i) i + (coordFaceReflection (cubeUpperFaceCoord Q i) i x) = x + exact coordFaceReflection_involutive (cubeUpperFaceCoord Q i) i x + +@[simp] theorem cubeLowerFaceReflection_involutive {d : ℕ} + (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + cubeLowerFaceReflection Q i (cubeLowerFaceReflection Q i x) = x := by + change coordFaceReflection (cubeLowerFaceCoord Q i) i + (coordFaceReflection (cubeLowerFaceCoord Q i) i x) = x + exact coordFaceReflection_involutive (cubeLowerFaceCoord Q i) i x + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff.lean new file mode 100644 index 0000000000..4d68f83ef3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Ball +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Box +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.OpenSet +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Ball.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Ball.lean new file mode 100644 index 0000000000..4b7aa0ca8c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Ball.lean @@ -0,0 +1,474 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.FTaylorSeries +public import Mathlib.Analysis.Calculus.ContDiff.Operations + +/-! # Ball -/ + +@[expose] public section + +noncomputable section + +open scoped Topology +open Set + +namespace Homogenization + +/-! +# Ball cutoffs on `Vec d` + +This file builds the smooth squared-radius cutoff formula using the explicit +Euclidean balls from `Cutoff.Euclidean`. +-/ + +namespace QuantitativeTransitionProfile + +/-- Squared-radius interpolation variable for a Euclidean ball cutoff. -/ +def ballArgument {d : ℕ} (x₀ : Vec d) (r s : ℝ) (x : Vec d) : ℝ := + (s ^ 2 - euclideanSqDist x x₀) / (s ^ 2 - r ^ 2) + +/-- Ball cutoff generated by a one-dimensional transition profile. -/ +def ballCutoff {d : ℕ} (θ : QuantitativeTransitionProfile) (x₀ : Vec d) + (r s : ℝ) (x : Vec d) : ℝ := + θ (ballArgument x₀ r s x) + +private theorem ballArgument_den_pos {r s : ℝ} (hr : 0 < r) (hrs : r < s) : + 0 < s ^ 2 - r ^ 2 := by + have hs : 0 < s := lt_trans hr hrs + nlinarith [mul_pos (sub_pos.mpr hrs) (add_pos hs hr)] + +private theorem iteratedFDeriv_two_coord_sub_const_eq_zero_ball {d : ℕ} + (i : Fin d) (c : Vec d) : + iteratedFDeriv ℝ 2 (fun y : Vec d => y i - c i) = 0 := by + ext x m + have hx0 : iteratedFDeriv ℝ 2 (fun y : Vec d => y i - c i) x = 0 := by + apply norm_eq_zero.mp + rw [← norm_iteratedFDeriv_fderiv] + have hconst : + fderiv ℝ (fun y : Vec d => y i - c i) = fun _ => ContinuousLinearMap.proj i := by + funext y + rw [fderiv_sub_const] + change fderiv ℝ (⇑(ContinuousLinearMap.proj (R := ℝ) i)) y = ContinuousLinearMap.proj i + rw [ContinuousLinearMap.fderiv] + rw [hconst, iteratedFDeriv_const_of_ne (𝕜 := ℝ) (by norm_num) + (ContinuousLinearMap.proj i)] + simp + simpa using congrArg (fun F : ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F m) hx0 + +private theorem fderiv_coord_sub_const_apply_basisVec_ball {d : ℕ} + (i j : Fin d) (c x : Vec d) : + (fderiv ℝ (fun y : Vec d => y i - c i) x) (basisVec j) = + if j = i then 1 else 0 := by + rw [fderiv_sub_const] + change (fderiv ℝ (⇑(ContinuousLinearMap.proj (R := ℝ) i)) x) (basisVec j) = _ + rw [ContinuousLinearMap.fderiv] + simp [basisVec_apply, eq_comm] + +private theorem norm_fderiv_coord_sub_const_le_one_ball {d : ℕ} + (i : Fin d) (c x : Vec d) : + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ ≤ 1 := by + have hsum := norm_clm_le_sum_basisVec_apply (fderiv ℝ (fun y : Vec d => y i - c i) x) + calc + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ + ≤ ∑ j : Fin d, ‖(fderiv ℝ (fun y : Vec d => y i - c i) x) (basisVec j)‖ := hsum + _ = 1 := by + rw [Finset.sum_eq_single i] + · simp [fderiv_coord_sub_const_apply_basisVec_ball] + · intro j _hj hji + simp [fderiv_coord_sub_const_apply_basisVec_ball, hji] + · intro hi + exact False.elim (hi (Finset.mem_univ i)) + +private theorem norm_iteratedFDeriv_two_coord_sub_const_sq_le_ball {d : ℕ} + (i : Fin d) (c x : Vec d) : + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - c i) ^ 2) x‖ ≤ 2 := by + let g : Vec d → ℝ := fun y => y i - c i + have hg : ContDiff ℝ (2 : ℕ) g := by + simpa [g] using ((contDiff_apply ℝ ℝ i).sub contDiff_const) + have hmul := norm_iteratedFDeriv_mul_le (𝕜 := ℝ) (A := ℝ) hg hg x le_rfl + have hzero : ‖iteratedFDeriv ℝ 2 g x‖ = 0 := by + rw [iteratedFDeriv_two_coord_sub_const_eq_zero_ball, Pi.zero_apply, norm_zero] + have hone : ‖iteratedFDeriv ℝ 1 g x‖ ≤ 1 := by + have hnorm : + ‖iteratedFDeriv ℝ 1 g x‖ = ‖fderiv ℝ g x‖ := by + simp + rw [hnorm] + simpa [g] using norm_fderiv_coord_sub_const_le_one_ball i c x + have hval : ‖iteratedFDeriv ℝ 0 g x‖ = ‖g x‖ := by + simp [g] + have hsq : (fun y : Vec d => (y i - c i) ^ 2) = fun y : Vec d => g y * g y := by + funext y + simp [g, pow_two] + rw [hsq] + calc + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => g y * g y) x‖ + ≤ ∑ k ∈ Finset.range (2 + 1), + ((2).choose k : ℝ) * ‖iteratedFDeriv ℝ k g x‖ * ‖iteratedFDeriv ℝ (2 - k) g x‖ := hmul + _ ≤ 2 := by + have hone_nonneg : 0 ≤ ‖iteratedFDeriv ℝ 1 g x‖ := norm_nonneg _ + have hsum : + ∑ k ∈ Finset.range (2 + 1), + ((2).choose k : ℝ) * ‖iteratedFDeriv ℝ k g x‖ * ‖iteratedFDeriv ℝ (2 - k) g x‖ + = + ‖g x‖ * ‖iteratedFDeriv ℝ 2 g x‖ + + 2 * ‖iteratedFDeriv ℝ 1 g x‖ * ‖iteratedFDeriv ℝ 1 g x‖ + + ‖iteratedFDeriv ℝ 2 g x‖ * ‖g x‖ := by + rw [Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_one] + simp [hval] + rw [hsum, hzero] + have hmid : 2 * ‖iteratedFDeriv ℝ 1 g x‖ * ‖iteratedFDeriv ℝ 1 g x‖ ≤ 2 := by + nlinarith + linarith + +/-- Exact coordinate-direction derivative of the ball interpolation variable. -/ +theorem fderiv_ballArgument_apply_basisVec {d : ℕ} + (x₀ : Vec d) (r s : ℝ) (j : Fin d) (x : Vec d) : + (fderiv ℝ (ballArgument x₀ r s) x) (basisVec j) = + (-(2 * (x j - x₀ j))) / (s ^ 2 - r ^ 2) := by + unfold ballArgument + simp only [div_eq_mul_inv] + rw [fderiv_mul_const] + · rw [fderiv_const_sub] + simp [fderiv_euclideanSqDist_apply_basisVec, neg_mul] + ring + · exact ((contDiff_const.sub (contDiff_euclideanSqDist_left x₀)).differentiable + (by simp)) x + +/-- On the outer closed ball, the ball interpolation variable has first +derivative of size at most `2 d / (s - r)` in the default product/sup norm on +`Vec d`. -/ +theorem norm_fderiv_ballArgument_le_of_mem_euclideanClosedBall {d : ℕ} + {x₀ : Vec d} {r s : ℝ} (hr : 0 < r) (hrs : r < s) {x : Vec d} + (hx : x ∈ euclideanClosedBall x₀ s) : + ‖fderiv ℝ (ballArgument x₀ r s) x‖ ≤ 2 * (d : ℝ) / (s - r) := by + have hsum := norm_clm_le_sum_basisVec_apply (fderiv ℝ (ballArgument x₀ r s) x) + have hs_pos : 0 < s := lt_trans hr hrs + have hden_pos := ballArgument_den_pos hr hrs + have hgap_pos : 0 < s - r := sub_pos.mpr hrs + calc + ‖fderiv ℝ (ballArgument x₀ r s) x‖ + ≤ ∑ j : Fin d, ‖(fderiv ℝ (ballArgument x₀ r s) x) (basisVec j)‖ := hsum + _ ≤ ∑ _j : Fin d, 2 * s / (s ^ 2 - r ^ 2) := by + apply Finset.sum_le_sum + intro j _hj + rw [fderiv_ballArgument_apply_basisVec] + rw [Real.norm_eq_abs, abs_div, abs_of_pos hden_pos] + have hcoord_sq : (x j - x₀ j) ^ 2 ≤ s ^ 2 := + (sq_coord_sub_le_euclideanSqDist x x₀ j).trans hx + have hcoord_abs : |x j - x₀ j| ≤ s := + abs_le_of_sq_le_sq hcoord_sq hs_pos.le + have hnum : |-(2 * (x j - x₀ j))| ≤ 2 * s := by + rw [abs_neg, abs_mul, abs_of_pos (by norm_num : (0 : ℝ) < 2)] + nlinarith [hcoord_abs, abs_nonneg (x j - x₀ j)] + exact div_le_div_of_nonneg_right hnum hden_pos.le + _ = (d : ℝ) * (2 * s / (s ^ 2 - r ^ 2)) := by + simp + _ ≤ 2 * (d : ℝ) / (s - r) := by + have hden_eq : s ^ 2 - r ^ 2 = (s - r) * (s + r) := by + ring + rw [hden_eq] + have hsr_pos : 0 < s + r := add_pos hs_pos hr + rw [mul_div_assoc] + have hbase : 2 * (s / ((s - r) * (s + r))) ≤ 2 / (s - r) := by + rw [show 2 * (s / ((s - r) * (s + r))) = + 2 * s / ((s - r) * (s + r)) by ring] + rw [div_le_div_iff₀ (mul_pos hgap_pos hsr_pos) hgap_pos] + nlinarith [hr, hs_pos] + calc + (d : ℝ) * (2 * (s / ((s - r) * (s + r)))) + ≤ (d : ℝ) * (2 / (s - r)) := + mul_le_mul_of_nonneg_left hbase (Nat.cast_nonneg d) + _ = 2 * (d : ℝ) / (s - r) := by + ring + +/-- Global second-derivative bound for the ball interpolation variable. -/ +theorem norm_iteratedFDeriv_two_ballArgument_le {d : ℕ} + {x₀ : Vec d} {r s : ℝ} (hr : 0 < r) (hrs : r < s) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (ballArgument x₀ r s) x‖ ≤ 2 * (d : ℝ) / (s - r) ^ 2 := by + have hden_pos := ballArgument_den_pos hr hrs + let f : Vec d → ℝ := (-(1 / (s ^ 2 - r ^ 2))) • fun y => euclideanSqDist y x₀ + let g : Vec d → ℝ := fun _ => s ^ 2 / (s ^ 2 - r ^ 2) + have hfun : + ballArgument x₀ r s = fun y : Vec d => f y + g y := by + funext y + simp [f, g] + unfold ballArgument + field_simp [hden_pos.ne'] + ring + rw [hfun] + have heuc2 : ContDiff ℝ (2 : ℕ) (fun y : Vec d => euclideanSqDist y x₀) := + (contDiff_euclideanSqDist_left x₀).of_le + (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2) + have hf2 : ContDiff ℝ (2 : ℕ) f := + heuc2.const_smul (-(1 / (s ^ 2 - r ^ 2))) + have hg2 : ContDiff ℝ (2 : ℕ) g := by + simpa [g] using (contDiff_const : ContDiff ℝ (2 : ℕ) g) + have hsum : + iteratedFDeriv ℝ 2 (fun y : Vec d => f y + g y) x = + iteratedFDeriv ℝ 2 f x + iteratedFDeriv ℝ 2 g x := by + simpa using! + congrArg (fun F : Vec d → ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F x) + (iteratedFDeriv_add (𝕜 := ℝ) (i := 2) (f := f) (g := g) hf2 hg2) + rw [hsum] + have hg_zero : iteratedFDeriv ℝ 2 g x = 0 := by + have hg_zero_fun : + iteratedFDeriv ℝ 2 (fun _ : Vec d => s ^ 2 / (s ^ 2 - r ^ 2)) = 0 := + iteratedFDeriv_const_of_ne (𝕜 := ℝ) (E := Vec d) (F := ℝ) + (n := 2) (by norm_num : 2 ≠ 0) (s ^ 2 / (s ^ 2 - r ^ 2)) + exact congrArg (fun F : Vec d → ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F x) + (by simpa [g] using hg_zero_fun) + rw [hg_zero, add_zero] + have hsq : + ‖iteratedFDeriv ℝ 2 f x‖ + = + (1 / (s ^ 2 - r ^ 2)) * + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => euclideanSqDist y x₀) x‖ := by + have hiter : + iteratedFDeriv ℝ 2 f x = + (-(1 / (s ^ 2 - r ^ 2)) : ℝ) • + iteratedFDeriv ℝ 2 (fun y : Vec d => euclideanSqDist y x₀) x := by + rw [show f = (-(1 / (s ^ 2 - r ^ 2)) : ℝ) • fun y : Vec d => euclideanSqDist y x₀ by + rfl] + rw [iteratedFDeriv_const_smul_apply] + exact heuc2.contDiffAt + rw [hiter, norm_smul] + have hscalar_neg : -(1 / (s ^ 2 - r ^ 2)) < 0 := by + nlinarith [one_div_pos.mpr hden_pos] + rw [Real.norm_eq_abs, abs_of_neg hscalar_neg] + ring + calc + ‖iteratedFDeriv ℝ 2 f x‖ + = (1 / (s ^ 2 - r ^ 2)) * ‖iteratedFDeriv ℝ 2 (fun y : Vec d => euclideanSqDist y x₀) x‖ := + hsq + _ + ≤ (1 / (s ^ 2 - r ^ 2)) * (2 * (d : ℝ)) := + by + have heuc_bound : + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => euclideanSqDist y x₀) x‖ ≤ 2 * (d : ℝ) := by + have hfun : (fun y : Vec d => euclideanSqDist y x₀) = + (fun y : Vec d => ∑ i : Fin d, (y i - x₀ i) ^ 2) := by + funext y + simp [euclideanSqDist, vecNormSq, vecDot, pow_two] + rw [hfun] + rw [iteratedFDeriv_sum] + · calc + ‖(∑ i : Fin d, iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2)) x‖ = + ‖∑ i : Fin d, iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x‖ := by + simp + _ ≤ ∑ i : Fin d, ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x‖ := by + simpa using norm_sum_le + (Finset.univ : Finset (Fin d)) + (fun i : Fin d => iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x) + _ ≤ ∑ _i : Fin d, 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact norm_iteratedFDeriv_two_coord_sub_const_sq_le_ball i x₀ x + _ = 2 * (d : ℝ) := by + simp + ring + · intro i _hi + exact (((contDiff_apply ℝ ℝ i).sub contDiff_const).pow 2) + exact mul_le_mul_of_nonneg_left + heuc_bound + (le_of_lt (one_div_pos.mpr hden_pos)) + _ ≤ 2 * (d : ℝ) / (s - r) ^ 2 := by + have hgap_pos : 0 < s - r := sub_pos.mpr hrs + have hs_pos : 0 < s := lt_trans hr hrs + have haux : (s - r) ^ 2 ≤ s ^ 2 - r ^ 2 := by + nlinarith [hr, hs_pos] + have hrecip : 1 / (s ^ 2 - r ^ 2) ≤ 1 / (s - r) ^ 2 := by + exact one_div_le_one_div_of_le (by positivity) haux + have hd_nonneg : 0 ≤ 2 * (d : ℝ) := mul_nonneg (by norm_num) (Nat.cast_nonneg d) + calc + (1 / (s ^ 2 - r ^ 2)) * (2 * (d : ℝ)) + ≤ (1 / (s - r) ^ 2) * (2 * (d : ℝ)) := + mul_le_mul_of_nonneg_right hrecip hd_nonneg + _ = 2 * (d : ℝ) / (s - r) ^ 2 := by ring + +theorem ballCutoff_smooth {d : ℕ} (θ : QuantitativeTransitionProfile) + (x₀ : Vec d) {r s : ℝ} (hr : 0 < r) (hrs : r < s) : + ContDiff ℝ (⊤ : ℕ∞) (ballCutoff θ x₀ r s) := by + have hden : ∀ _x : Vec d, s ^ 2 - r ^ 2 ≠ 0 := + fun _ => (ballArgument_den_pos hr hrs).ne' + have harg : ContDiff ℝ (⊤ : ℕ∞) (ballArgument x₀ r s) := by + unfold ballArgument + exact (contDiff_const.sub (contDiff_euclideanSqDist_left x₀)).div contDiff_const hden + exact θ.smooth.comp harg + +theorem ballCutoff_nonneg {d : ℕ} (θ : QuantitativeTransitionProfile) + (x₀ : Vec d) (r s : ℝ) (x : Vec d) : + 0 ≤ ballCutoff θ x₀ r s x := + θ.nonneg _ + +theorem ballCutoff_le_one {d : ℕ} (θ : QuantitativeTransitionProfile) + (x₀ : Vec d) (r s : ℝ) (x : Vec d) : + ballCutoff θ x₀ r s x ≤ 1 := + θ.le_one _ + +theorem ballCutoff_eq_one_of_mem_euclideanBall {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) {x : Vec d} + (hx : x ∈ euclideanBall x₀ r) : + ballCutoff θ x₀ r s x = 1 := by + unfold ballCutoff + apply θ.one_of_one_le + unfold euclideanBall at hx + unfold ballArgument + have hden : 0 < s ^ 2 - r ^ 2 := ballArgument_den_pos hr hrs + rw [one_le_div hden] + have hlt : euclideanSqDist x x₀ < r ^ 2 := by + simpa using hx + nlinarith [hlt.le] + +theorem ballCutoff_eq_zero_of_notMem_euclideanClosedBall {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) {x : Vec d} + (hx : x ∉ euclideanClosedBall x₀ s) : + ballCutoff θ x₀ r s x = 0 := by + unfold ballCutoff + apply θ.zero_of_nonpos + unfold euclideanClosedBall at hx + unfold ballArgument + have hden_nonneg : 0 ≤ s ^ 2 - r ^ 2 := + (ballArgument_den_pos hr hrs).le + have hnum_nonpos : s ^ 2 - euclideanSqDist x x₀ ≤ 0 := by + have hnot : ¬ euclideanSqDist x x₀ ≤ s ^ 2 := by + simpa using hx + have hlt : s ^ 2 < euclideanSqDist x x₀ := not_le.mp hnot + nlinarith + exact div_nonpos_of_nonpos_of_nonneg hnum_nonpos hden_nonneg + +theorem ballCutoff_support_subset_euclideanClosedBall {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + Function.support (ballCutoff θ x₀ r s) ⊆ euclideanClosedBall x₀ s := by + intro x hx + by_contra hnot + exact hx (ballCutoff_eq_zero_of_notMem_euclideanClosedBall θ hr hrs hnot) + +theorem ballCutoff_tsupport_subset_euclideanClosedBall {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + tsupport (ballCutoff θ x₀ r s) ⊆ euclideanClosedBall x₀ s := + closure_minimal + (ballCutoff_support_subset_euclideanClosedBall θ hr hrs) + (isClosed_euclideanClosedBall x₀ s) + +theorem ballCutoff_hasCompactSupport {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + HasCompactSupport (ballCutoff θ x₀ r s) := by + have hs_nonneg : 0 ≤ s := le_of_lt (lt_trans hr hrs) + exact HasCompactSupport.of_support_subset_isCompact + (isCompact_euclideanClosedBall x₀ hs_nonneg) + (ballCutoff_support_subset_euclideanClosedBall θ hr hrs) + +/-- Global first-derivative bound for the ball cutoff with an intermediate +support radius. -/ +theorem norm_fderiv_ballCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) (x : Vec d) : + ‖fderiv ℝ (ballCutoff θ x₀ r s) x‖ ≤ + θ.derivBound * (2 * (d : ℝ) / (s - r)) := by + by_cases hx : x ∈ euclideanClosedBall x₀ s + · have hargdiff : DifferentiableAt ℝ (ballArgument x₀ r s) x := by + have hden : ∀ _x : Vec d, s ^ 2 - r ^ 2 ≠ 0 := + fun _ => (ballArgument_den_pos hr hrs).ne' + exact ((contDiff_const.sub (contDiff_euclideanSqDist_left x₀)).div + contDiff_const hden).differentiable + (by simp) x + calc + ‖fderiv ℝ (ballCutoff θ x₀ r s) x‖ + = ‖fderiv ℝ (fun y : Vec d => θ (ballArgument x₀ r s y)) x‖ := rfl + _ ≤ θ.derivBound * ‖fderiv ℝ (ballArgument x₀ r s) x‖ := + norm_fderiv_profile_comp_le θ hargdiff + _ ≤ θ.derivBound * (2 * (d : ℝ) / (s - r)) := + mul_le_mul_of_nonneg_left + (norm_fderiv_ballArgument_le_of_mem_euclideanClosedBall hr hrs hx) + θ.derivBound_nonneg + · have hx_support : x ∉ tsupport (ballCutoff θ x₀ r s) := fun hxs => + hx (ballCutoff_tsupport_subset_euclideanClosedBall θ hr hrs hxs) + rw [fderiv_of_notMem_tsupport (𝕜 := ℝ) hx_support, norm_zero] + exact mul_nonneg θ.derivBound_nonneg + (div_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) + (le_of_lt (sub_pos.mpr hrs))) + +/-- Global second-derivative bound for the ball cutoff with an intermediate +support radius. -/ +theorem norm_iteratedFDeriv_two_ballCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (ballCutoff θ x₀ r s) x‖ ≤ + 2 * (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 * (d : ℝ) / (s - r)) ^ 2 := by + by_cases hx : x ∈ euclideanClosedBall x₀ s + · have hargTop : ContDiff ℝ (⊤ : ℕ∞) (ballArgument x₀ r s) := by + have hden : ∀ _x : Vec d, s ^ 2 - r ^ 2 ≠ 0 := + fun _ => (ballArgument_den_pos hr hrs).ne' + unfold ballArgument + exact (contDiff_const.sub (contDiff_euclideanSqDist_left x₀)).div contDiff_const hden + have hargContDiff : ContDiff ℝ (2 : ℕ) (ballArgument x₀ r s) := + hargTop.of_le (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2) + have hfirst : + ‖iteratedFDeriv ℝ 1 (ballArgument x₀ r s) x‖ ≤ 2 * (d : ℝ) / (s - r) := by + have hnorm : + ‖iteratedFDeriv ℝ 1 (ballArgument x₀ r s) x‖ = + ‖fderiv ℝ (ballArgument x₀ r s) x‖ := by + simp + rw [hnorm] + exact norm_fderiv_ballArgument_le_of_mem_euclideanClosedBall (x₀ := x₀) hr hrs hx + have hsecond := norm_iteratedFDeriv_two_ballArgument_le (x₀ := x₀) hr hrs x + have hbase_nonneg : 0 ≤ 2 * (d : ℝ) / (s - r) := by + exact div_nonneg (mul_nonneg (by norm_num) (Nat.cast_nonneg d)) (le_of_lt (sub_pos.mpr hrs)) + have hsecond' : ‖iteratedFDeriv ℝ 2 (ballArgument x₀ r s) x‖ ≤ + (2 * (d : ℝ) / (s - r)) ^ 2 := by + have hsq_le : 2 * (d : ℝ) ≤ (2 * (d : ℝ)) ^ 2 := by + cases d with + | zero => + norm_num + | succ d => + have hd_one : (1 : ℝ) ≤ ((Nat.succ d : ℕ) : ℝ) := by + exact_mod_cast Nat.succ_le_succ (Nat.zero_le d) + nlinarith + calc + ‖iteratedFDeriv ℝ 2 (ballArgument x₀ r s) x‖ ≤ 2 * (d : ℝ) / (s - r) ^ 2 := hsecond + _ ≤ (2 * (d : ℝ) / (s - r)) ^ 2 := by + have hden_nonneg : 0 ≤ (s - r) ^ 2 := sq_nonneg (s - r) + have hsquare : + (2 * (d : ℝ) / (s - r)) ^ 2 = ((2 * (d : ℝ)) ^ 2) / (s - r) ^ 2 := by + field_simp [pow_two] + rw [hsquare] + exact div_le_div_of_nonneg_right hsq_le hden_nonneg + exact norm_iteratedFDeriv_two_profile_comp_le θ hargContDiff hfirst hsecond' + · have hx_support : x ∉ tsupport (ballCutoff θ x₀ r s) := fun hxs => + hx (ballCutoff_tsupport_subset_euclideanClosedBall θ hr hrs hxs) + have hx_iter : + x ∉ Function.support (iteratedFDeriv ℝ 2 (ballCutoff θ x₀ r s)) := by + intro hxs + exact hx_support ((support_iteratedFDeriv_subset (𝕜 := ℝ) (f := ballCutoff θ x₀ r s) 2) hxs) + have hzero : iteratedFDeriv ℝ 2 (ballCutoff θ x₀ r s) x = 0 := by + simpa [Function.support] using hx_iter + rw [hzero, norm_zero] + positivity + +theorem ballCutoff_tsupport_subset_euclideanBall {d : ℕ} + (θ : QuantitativeTransitionProfile) {x₀ : Vec d} {r s R : ℝ} + (hr : 0 < r) (hrs : r < s) (hsR : s < R) : + tsupport (ballCutoff θ x₀ r s) ⊆ euclideanBall x₀ R := by + have hs_nonneg : 0 ≤ s := le_of_lt (lt_trans hr hrs) + exact (ballCutoff_tsupport_subset_euclideanClosedBall θ hr hrs).trans + (euclideanClosedBall_subset_euclideanBall hs_nonneg hsR) + +end QuantitativeTransitionProfile + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Box.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Box.lean new file mode 100644 index 0000000000..395ebd2e92 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Box.lean @@ -0,0 +1,498 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Analysis.SpecialFunctions.SmoothTransition +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Calculus.FDeriv.Mul +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic +public import Mathlib.Topology.Algebra.Module.ContinuousLinearMap.PiProd + +/-! # Box -/ + +@[expose] public section + +namespace Homogenization + +open Real Polynomial MeasureTheory +open scoped BigOperators + +/-! +# Smooth box cutoffs + +For a closed axis box `B = ∏ᵢ [loᵢ, hiᵢ]` (`lo ≤ hi` componentwise) and a margin +`ℓ > 0`, this file constructs a smooth cutoff `η : Vec d → ℝ` +(`Vec d = Fin d → ℝ`) that is `1` on `B`, `0` off the ℓ-enlargement +`∏ᵢ [loᵢ − ℓ, hiᵢ + ℓ]`, valued in `[0, 1]`, with coordinate partial derivatives +bounded by `16 / ℓ`. + +The construction is the coordinatewise product `η(x) = ∏ᵢ ψᵢ(xᵢ)` of the +one-dimensional plateau profiles `ψᵢ = profile (loᵢ) (hiᵢ) ℓ`, each built from +`Real.smoothTransition`. The development has three layers: + +* an explicit derivative bound `|smoothTransition'| ≤ 8`, proved by elementary + calculus on the building block `expNegInvGlue`; +* the one-dimensional plateau `profile lo hi ℓ`, equal to `1` on `[lo, hi]`, `0` + off `[lo − ℓ, hi + ℓ]`, with derivative bounded by `16 / ℓ`; +* the `d`-dimensional product cutoff `boxCutoff`, bundled as `SmoothBoxCutoff`, + with the coordinate derivative bound, squared-gradient bound, and + support-volume bound (`exists_smoothBoxCutoff`). + +Partial derivatives are exposed as `fderiv ℝ η x (Pi.single i 1)`, matching the +ambient `HasWeakPartialDerivOn` pairing. The explicit gradient constant is +`C = 16`. +-/ + +/-- `expNegInvGlue` never exceeds `1`. -/ +theorem expNegInvGlue_le_one (x : ℝ) : expNegInvGlue x ≤ 1 := by + unfold expNegInvGlue + split_ifs with hx + · exact zero_le_one + · rw [Real.exp_le_one_iff] + have hx' : 0 < x := lt_of_not_ge hx + simp only [neg_nonpos, inv_nonneg] + exact hx'.le + +/-- The derivative of `expNegInvGlue` at `x` equals `x⁻² · expNegInvGlue x` +(interpreting `0⁻¹ = 0`, so both sides vanish for `x ≤ 0`). -/ +theorem expNegInvGlue_hasDerivAt (x : ℝ) : + HasDerivAt expNegInvGlue (x⁻¹ ^ 2 * expNegInvGlue x) x := by + have h := expNegInvGlue.hasDerivAt_polynomial_eval_inv_mul (1 : ℝ[X]) x + simp only [Polynomial.derivative_one, sub_zero, mul_one, Polynomial.eval_one, one_mul, + Polynomial.eval_pow, Polynomial.eval_X] at h + exact h + +/-- One-variable calculus fact: `s · e^{-s} ≤ e^{-1}` for every real `s` +(equality at `s = 1`). -/ +theorem mul_exp_neg_le (s : ℝ) : s * Real.exp (-s) ≤ Real.exp (-1) := by + have hle : s ≤ Real.exp (s - 1) := by + have := Real.add_one_le_exp (s - 1) + linarith + calc s * Real.exp (-s) ≤ Real.exp (s - 1) * Real.exp (-s) := + mul_le_mul_of_nonneg_right hle (Real.exp_nonneg _) + _ = Real.exp (-1) := by rw [← Real.exp_add]; ring_nf + +/-- Derivative maximum for the building block: +`x⁻² · expNegInvGlue x ≤ 4 e⁻²` for every `x`. The sharp value `4 e⁻²` is +attained at `x = 1/2`. -/ +theorem expNegInvGlue_deriv_le (x : ℝ) : + x⁻¹ ^ 2 * expNegInvGlue x ≤ 4 * Real.exp (-2) := by + rcases le_or_gt x 0 with hx | hx + · rw [expNegInvGlue.zero_of_nonpos hx, mul_zero] + positivity + · -- For `x > 0`, `expNegInvGlue x = exp (-x⁻¹)`; set `t = x⁻¹ > 0`, `s = t/2`. + have hgx : expNegInvGlue x = Real.exp (-x⁻¹) := by + simp [expNegInvGlue, not_le.2 hx] + rw [hgx] + set t := x⁻¹ with ht + -- `t² · exp (-t) = 4 · a²` where `a = (t/2) · exp (-t/2) ≤ exp (-1)`, `0 ≤ a`. + have ht0 : 0 < t := inv_pos.2 hx + set a := (t / 2) * Real.exp (-(t / 2)) with ha + have ha0 : 0 ≤ a := by positivity + have hale : a ≤ Real.exp (-1) := mul_exp_neg_le (t / 2) + have hsq : a * a ≤ Real.exp (-1) * Real.exp (-1) := mul_self_le_mul_self ha0 hale + have e2 : Real.exp (-(t / 2)) * Real.exp (-(t / 2)) = Real.exp (-t) := by + rw [← Real.exp_add]; ring_nf + have haa : a * a = (t ^ 2 * Real.exp (-t)) / 4 := by + rw [ha, mul_mul_mul_comm, e2]; ring + have hee : Real.exp (-1) * Real.exp (-1) = Real.exp (-2) := by + rw [← Real.exp_add]; ring_nf + rw [hee, haa] at hsq + linarith + +/-- On `[1/2, ∞)` the building block is bounded below by `e⁻²`. -/ +theorem expNegInvGlue_ge_of_half_le {y : ℝ} (hy : 1 / 2 ≤ y) : + Real.exp (-2) ≤ expNegInvGlue y := by + have hy0 : (0 : ℝ) < y := by linarith + have hgy : expNegInvGlue y = Real.exp (-y⁻¹) := by + simp [expNegInvGlue, not_le.2 hy0] + rw [hgy] + apply Real.exp_le_exp.2 + have hmul : y⁻¹ * y = 1 := inv_mul_cancel₀ hy0.ne' + have hinv : y⁻¹ ≤ 2 := by + nlinarith [mul_nonneg (inv_pos.2 hy0).le (show (0:ℝ) ≤ y - 1 / 2 by linarith), hmul] + linarith + +/-- Denominator lower bound for `smoothTransition`: since one of `x`, `1 - x` +is `≥ 1/2`, we have `e⁻² ≤ g x + g(1 - x)`. -/ +theorem denom_ge (x : ℝ) : + Real.exp (-2) ≤ expNegInvGlue x + expNegInvGlue (1 - x) := by + rcases le_total (1 / 2 : ℝ) x with hx | hx + · have := expNegInvGlue_ge_of_half_le hx + have hb := expNegInvGlue.nonneg (1 - x) + linarith + · have hx' : (1 / 2 : ℝ) ≤ 1 - x := by linarith + have := expNegInvGlue_ge_of_half_le hx' + have ha := expNegInvGlue.nonneg x + linarith + +/-- Explicit derivative of `Real.smoothTransition`, in the form +`(g'(x) g(1-x) + g(x) g'(1-x)) / (g(x) + g(1-x))²` with both numerator +summands manifestly nonnegative. -/ +theorem smoothTransition_hasDerivAt (x : ℝ) : + HasDerivAt Real.smoothTransition + ((x⁻¹ ^ 2 * expNegInvGlue x * expNegInvGlue (1 - x) + + expNegInvGlue x * ((1 - x)⁻¹ ^ 2 * expNegInvGlue (1 - x))) + / (expNegInvGlue x + expNegInvGlue (1 - x)) ^ 2) x := by + have ha := expNegInvGlue_hasDerivAt x + have hb := (expNegInvGlue_hasDerivAt (1 - x)).comp x ((hasDerivAt_id x).const_sub 1) + have hD := ha.add hb + have hDne : expNegInvGlue x + expNegInvGlue (1 - x) ≠ 0 := + (Real.smoothTransition.pos_denom x).ne' + have hq := ha.div hD hDne + simp only [Pi.add_apply, Function.comp_apply] at hq + convert hq using 1 + all_goals first + | rfl + | ring + +/-- **Explicit derivative bound for `Real.smoothTransition`.** For every `x`, +`|smoothTransition'(x)| ≤ 8`. (The sharp constant is `2`, at `x = 1/2`; `8` +is what the elementary route below delivers.) -/ +theorem smoothTransition_deriv_abs_le (x : ℝ) : + |deriv Real.smoothTransition x| ≤ 8 := by + rw [(smoothTransition_hasDerivAt x).deriv] + set a := expNegInvGlue x with ha_def + set b := expNegInvGlue (1 - x) with hb_def + set P := x⁻¹ ^ 2 * expNegInvGlue x with hP_def + set Q := (1 - x)⁻¹ ^ 2 * expNegInvGlue (1 - x) with hQ_def + have ha0 : 0 ≤ a := expNegInvGlue.nonneg x + have hb0 : 0 ≤ b := expNegInvGlue.nonneg (1 - x) + have hP0 : 0 ≤ P := by rw [hP_def]; positivity + have hQ0 : 0 ≤ Q := by rw [hQ_def]; positivity + have hPle : P ≤ 4 * Real.exp (-2) := expNegInvGlue_deriv_le x + have hQle : Q ≤ 4 * Real.exp (-2) := expNegInvGlue_deriv_le (1 - x) + have hab : Real.exp (-2) ≤ a + b := denom_ge x + have hab0 : 0 < a + b := lt_of_lt_of_le (Real.exp_pos _) hab + have hden : 0 < (a + b) ^ 2 := by positivity + have hval0 : 0 ≤ (P * b + a * Q) / (a + b) ^ 2 := by positivity + rw [abs_of_nonneg hval0, div_le_iff₀ hden] + -- `P b + a Q ≤ (P + Q)(a + b) ≤ 8 e⁻² (a + b) ≤ 8 (a + b)²`. + have step1 : P * b + a * Q ≤ (P + Q) * (a + b) := by + nlinarith [mul_nonneg hP0 ha0, mul_nonneg hQ0 hb0] + have step2 : (P + Q) * (a + b) ≤ 8 * Real.exp (-2) * (a + b) := by + nlinarith [hab0, hPle, hQle] + have step3 : 8 * Real.exp (-2) * (a + b) ≤ 8 * (a + b) ^ 2 := by + nlinarith [hab, hab0] + linarith + +/-- One-dimensional smooth plateau profile: `1` on `[lo, hi]`, `0` off +`[lo - ℓ, hi + ℓ]`, valued in `[0, 1]`. -/ +noncomputable def profile (lo hi ℓ : ℝ) (t : ℝ) : ℝ := + Real.smoothTransition ((t - (lo - ℓ)) / ℓ) * Real.smoothTransition (((hi + ℓ) - t) / ℓ) + +variable {lo hi ℓ : ℝ} + +theorem profile_nonneg (t : ℝ) : 0 ≤ profile lo hi ℓ t := + mul_nonneg (Real.smoothTransition.nonneg _) (Real.smoothTransition.nonneg _) + +theorem profile_le_one (t : ℝ) : profile lo hi ℓ t ≤ 1 := by + have h := mul_le_mul (Real.smoothTransition.le_one ((t - (lo - ℓ)) / ℓ)) + (Real.smoothTransition.le_one (((hi + ℓ) - t) / ℓ)) + (Real.smoothTransition.nonneg _) (zero_le_one) + rw [mul_one] at h + exact h + +theorem profile_abs_le_one (t : ℝ) : |profile lo hi ℓ t| ≤ 1 := by + rw [abs_of_nonneg (profile_nonneg t)]; exact profile_le_one t + +theorem profile_contDiff : ContDiff ℝ (⊤ : ℕ∞) (profile lo hi ℓ) := by + unfold profile + fun_prop + +theorem profile_differentiable : Differentiable ℝ (profile lo hi ℓ) := + profile_contDiff.differentiable (by simp) + +/-- The profile is identically `1` on the core interval `[lo, hi]`. -/ +theorem profile_eq_one (hℓ : 0 < ℓ) {t : ℝ} (hlo : lo ≤ t) (hhi : t ≤ hi) : + profile lo hi ℓ t = 1 := by + have hL : Real.smoothTransition ((t - (lo - ℓ)) / ℓ) = 1 := by + apply Real.smoothTransition.one_of_one_le + rw [one_le_div hℓ]; linarith + have hR : Real.smoothTransition (((hi + ℓ) - t) / ℓ) = 1 := by + apply Real.smoothTransition.one_of_one_le + rw [one_le_div hℓ]; linarith + rw [profile, hL, hR, mul_one] + +/-- The profile vanishes to the left of the enlarged interval. -/ +theorem profile_eq_zero_left (hℓ : 0 < ℓ) {t : ℝ} (ht : t ≤ lo - ℓ) : + profile lo hi ℓ t = 0 := by + have hL : Real.smoothTransition ((t - (lo - ℓ)) / ℓ) = 0 := by + apply Real.smoothTransition.zero_of_nonpos + rw [div_le_iff₀ hℓ]; linarith + rw [profile, hL, zero_mul] + +/-- The profile vanishes to the right of the enlarged interval. -/ +theorem profile_eq_zero_right (hℓ : 0 < ℓ) {t : ℝ} (ht : hi + ℓ ≤ t) : + profile lo hi ℓ t = 0 := by + have hR : Real.smoothTransition (((hi + ℓ) - t) / ℓ) = 0 := by + apply Real.smoothTransition.zero_of_nonpos + rw [div_le_iff₀ hℓ]; linarith + rw [profile, hR, mul_zero] + +/-- Off the enlarged interval `[lo - ℓ, hi + ℓ]` the profile is `0`. -/ +theorem profile_eq_zero_of_notMem (hℓ : 0 < ℓ) {t : ℝ} + (ht : t ∉ Set.Icc (lo - ℓ) (hi + ℓ)) : profile lo hi ℓ t = 0 := by + rw [Set.mem_Icc, not_and_or, not_le, not_le] at ht + rcases ht with ht | ht + · exact profile_eq_zero_left hℓ ht.le + · exact profile_eq_zero_right hℓ ht.le + +/-- **Derivative bound for the 1-d profile:** `|profile'(t)| ≤ 16 / ℓ`. -/ +theorem profile_deriv_abs_le (hℓ : 0 < ℓ) (t : ℝ) : + |deriv (profile lo hi ℓ) t| ≤ 16 / ℓ := by + -- affine inner maps and their derivatives + have hArgL : HasDerivAt (fun t => (t - (lo - ℓ)) / ℓ) (1 / ℓ) t := + ((hasDerivAt_id t).sub_const (lo - ℓ)).div_const ℓ + have hArgR : HasDerivAt (fun t => ((hi + ℓ) - t) / ℓ) (-1 / ℓ) t := by + have h := (((hasDerivAt_id t).const_sub (hi + ℓ)).div_const ℓ) + simpa using h + -- the two transition factors + have hst : ∀ s : ℝ, HasDerivAt Real.smoothTransition (deriv Real.smoothTransition s) s := + fun s => (Real.smoothTransition.contDiff.differentiable_one s).hasDerivAt + have hL := (hst ((t - (lo - ℓ)) / ℓ)).comp t hArgL + have hR := (hst (((hi + ℓ) - t) / ℓ)).comp t hArgR + have hd : HasDerivAt (profile lo hi ℓ) + (deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ) * (1 / ℓ) + * Real.smoothTransition (((hi + ℓ) - t) / ℓ) + + Real.smoothTransition ((t - (lo - ℓ)) / ℓ) + * (deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ) * (-1 / ℓ))) t := + hL.mul hR + rw [hd.deriv] + -- abs bounds on each ingredient + have h8L : |deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ)| ≤ 8 := + smoothTransition_deriv_abs_le _ + have h8R : |deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ)| ≤ 8 := + smoothTransition_deriv_abs_le _ + have h1L : |Real.smoothTransition ((t - (lo - ℓ)) / ℓ)| ≤ 1 := by + rw [abs_of_nonneg (Real.smoothTransition.nonneg _)]; exact Real.smoothTransition.le_one _ + have h1R : |Real.smoothTransition (((hi + ℓ) - t) / ℓ)| ≤ 1 := by + rw [abs_of_nonneg (Real.smoothTransition.nonneg _)]; exact Real.smoothTransition.le_one _ + have hℓ0 : (0 : ℝ) ≤ 1 / ℓ := (div_pos one_pos hℓ).le + have hinv : |1 / ℓ| = 1 / ℓ := abs_of_pos (div_pos one_pos hℓ) + have hinv' : |(-1 : ℝ) / ℓ| = 1 / ℓ := by + rw [abs_div, abs_neg, abs_one, abs_of_pos hℓ] + have t1 : |deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ) * (1 / ℓ) + * Real.smoothTransition (((hi + ℓ) - t) / ℓ)| ≤ 8 / ℓ := by + rw [abs_mul, abs_mul, hinv, mul_right_comm] + have h := mul_le_mul h8L h1R (abs_nonneg _) (by norm_num : (0 : ℝ) ≤ 8) + calc |deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ)| + * |Real.smoothTransition (((hi + ℓ) - t) / ℓ)| * (1 / ℓ) + ≤ 8 * 1 * (1 / ℓ) := mul_le_mul_of_nonneg_right h hℓ0 + _ = 8 / ℓ := by ring + have t2 : |Real.smoothTransition ((t - (lo - ℓ)) / ℓ) + * (deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ) * (-1 / ℓ))| ≤ 8 / ℓ := by + rw [abs_mul, abs_mul, hinv'] + have hR' : |deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ)| * (1 / ℓ) ≤ 8 * (1 / ℓ) := + mul_le_mul_of_nonneg_right h8R hℓ0 + calc |Real.smoothTransition ((t - (lo - ℓ)) / ℓ)| + * (|deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ)| * (1 / ℓ)) + ≤ 1 * (8 * (1 / ℓ)) := + mul_le_mul h1L hR' (mul_nonneg (abs_nonneg _) hℓ0) (by norm_num) + _ = 8 / ℓ := by ring + calc |deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ) * (1 / ℓ) + * Real.smoothTransition (((hi + ℓ) - t) / ℓ) + + Real.smoothTransition ((t - (lo - ℓ)) / ℓ) + * (deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ) * (-1 / ℓ))| + ≤ |deriv Real.smoothTransition ((t - (lo - ℓ)) / ℓ) * (1 / ℓ) + * Real.smoothTransition (((hi + ℓ) - t) / ℓ)| + + |Real.smoothTransition ((t - (lo - ℓ)) / ℓ) + * (deriv Real.smoothTransition (((hi + ℓ) - t) / ℓ) * (-1 / ℓ))| := abs_add_le _ _ + _ ≤ 8 / ℓ + 8 / ℓ := add_le_add t1 t2 + _ = 16 / ℓ := by ring + +variable {d : ℕ} + +/-- The smooth box cutoff: coordinatewise product of the 1-d plateau profiles. -/ +noncomputable def boxCutoff (lo hi : Vec d) (ℓ : ℝ) : Vec d → ℝ := + fun x => ∏ i, profile (lo i) (hi i) ℓ (x i) + +variable {lo hi : Vec d} {ℓ : ℝ} + +theorem boxCutoff_apply (x : Vec d) : + boxCutoff lo hi ℓ x = ∏ i, profile (lo i) (hi i) ℓ (x i) := rfl + +/-- Each coordinate factor is `C^∞`. -/ +theorem factor_contDiff (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => profile (lo i) (hi i) ℓ (x i)) := + profile_contDiff.comp (contDiff_apply ℝ ℝ i) + +theorem boxCutoff_contDiff : ContDiff ℝ (⊤ : ℕ∞) (boxCutoff lo hi ℓ) := + contDiff_prod (fun i _ => factor_contDiff i) + +theorem boxCutoff_nonneg (x : Vec d) : 0 ≤ boxCutoff lo hi ℓ x := + Finset.prod_nonneg (fun _ _ => profile_nonneg _) + +theorem boxCutoff_le_one (x : Vec d) : boxCutoff lo hi ℓ x ≤ 1 := + Finset.prod_le_one₀ (fun _ _ => profile_nonneg _) (fun _ _ => profile_le_one _) + +/-- On the core box `x ∈ [lo, hi]`, the cutoff is identically `1`. -/ +theorem boxCutoff_eq_one (hℓ : 0 < ℓ) {x : Vec d} (hx : x ∈ Set.Icc lo hi) : + boxCutoff lo hi ℓ x = 1 := by + rw [Set.mem_Icc] at hx + apply Finset.prod_eq_one + intro i _ + exact profile_eq_one hℓ (hx.1 i) (hx.2 i) + +/-- Off the ℓ-enlargement `[lo - ℓ, hi + ℓ]`, the cutoff vanishes. -/ +theorem boxCutoff_eq_zero (hℓ : 0 < ℓ) {x : Vec d} + (hx : x ∉ Set.Icc (fun i => lo i - ℓ) (fun i => hi i + ℓ)) : + boxCutoff lo hi ℓ x = 0 := by + rw [Set.mem_Icc, not_and_or] at hx + rcases hx with h | h + · rw [Pi.le_def, not_forall] at h + obtain ⟨i, hi⟩ := h + push Not at hi + exact Finset.prod_eq_zero (Finset.mem_univ i) (profile_eq_zero_left hℓ hi.le) + · rw [Pi.le_def, not_forall] at h + obtain ⟨i, hi⟩ := h + push Not at hi + exact Finset.prod_eq_zero (Finset.mem_univ i) (profile_eq_zero_right hℓ hi.le) + +/-- `HasFDerivAt` for the box cutoff, via the finite-product rule on the +coordinate factors. -/ +theorem boxCutoff_hasFDerivAt (x : Vec d) : + HasFDerivAt (boxCutoff lo hi ℓ) + (∑ i, (∏ j ∈ Finset.univ.erase i, profile (lo j) (hi j) ℓ (x j)) • + (deriv (profile (lo i) (hi i) ℓ) (x i) • + (ContinuousLinearMap.proj i : Vec d →L[ℝ] ℝ))) x := by + have hfac : ∀ i ∈ (Finset.univ : Finset (Fin d)), + HasFDerivAt (fun y : Vec d => profile (lo i) (hi i) ℓ (y i)) + (deriv (profile (lo i) (hi i) ℓ) (x i) • + (ContinuousLinearMap.proj i : Vec d →L[ℝ] ℝ)) x := by + intro i _ + have hp : HasDerivAt (profile (lo i) (hi i) ℓ) + (deriv (profile (lo i) (hi i) ℓ) (x i)) (x i) := + (profile_differentiable (lo := lo i) (hi := hi i) (ℓ := ℓ) (x i)).hasDerivAt + exact HasDerivAt.comp_hasFDerivAt (h₂ := profile (lo i) (hi i) ℓ) + (f := fun y : Vec d => y i) x hp (hasFDerivAt_apply i x) + exact HasFDerivAt.finsetProd hfac + +/-- The `i`-th partial derivative of the box cutoff: only the `i`-th factor is +differentiated, the rest form the product with `i` removed. -/ +theorem boxCutoff_fderiv_single (x : Vec d) (k : Fin d) : + fderiv ℝ (boxCutoff lo hi ℓ) x (Pi.single k 1) = + (∏ j ∈ Finset.univ.erase k, profile (lo j) (hi j) ℓ (x j)) * + deriv (profile (lo k) (hi k) ℓ) (x k) := by + rw [(boxCutoff_hasFDerivAt x).fderiv] + simp only [sum_apply, smul_apply, smul_eq_mul, + ContinuousLinearMap.proj_apply, Pi.single_apply, mul_ite, mul_one, mul_zero] + rw [Finset.sum_ite_eq' Finset.univ k] + simp + +/-- **Coordinate derivative bound:** `|∂ᵢ η x| ≤ 16 / ℓ` (with `C = 16`). -/ +theorem boxCutoff_deriv_bound (hℓ : 0 < ℓ) (x : Vec d) (k : Fin d) : + |fderiv ℝ (boxCutoff lo hi ℓ) x (Pi.single k 1)| ≤ 16 / ℓ := by + rw [boxCutoff_fderiv_single, abs_mul] + have hprod : |∏ j ∈ Finset.univ.erase k, profile (lo j) (hi j) ℓ (x j)| ≤ 1 := by + rw [Finset.abs_prod] + apply Finset.prod_le_one₀ + · intro j _; exact abs_nonneg _ + · intro j _; rw [abs_of_nonneg (profile_nonneg _)]; exact profile_le_one _ + have hderiv : |deriv (profile (lo k) (hi k) ℓ) (x k)| ≤ 16 / ℓ := + profile_deriv_abs_le hℓ _ + calc |∏ j ∈ Finset.univ.erase k, profile (lo j) (hi j) ℓ (x j)| + * |deriv (profile (lo k) (hi k) ℓ) (x k)| + ≤ 1 * (16 / ℓ) := mul_le_mul hprod hderiv (abs_nonneg _) (by norm_num) + _ = 16 / ℓ := one_mul _ + +/-- **Squared-gradient bound:** `Σᵢ |∂ᵢ η x|² ≤ d · (16/ℓ)²`. -/ +theorem boxCutoff_sq_grad_bound (hℓ : 0 < ℓ) (x : Vec d) : + ∑ i, (fderiv ℝ (boxCutoff lo hi ℓ) x (Pi.single i 1)) ^ 2 + ≤ (d : ℝ) * (16 / ℓ) ^ 2 := by + calc ∑ i, (fderiv ℝ (boxCutoff lo hi ℓ) x (Pi.single i 1)) ^ 2 + ≤ ∑ _i : Fin d, (16 / ℓ) ^ 2 := by + apply Finset.sum_le_sum + intro i _ + rw [← sq_abs] + have h := boxCutoff_deriv_bound (lo := lo) (hi := hi) hℓ x i + nlinarith [abs_nonneg (fderiv ℝ (boxCutoff lo hi ℓ) x (Pi.single i 1)), h] + _ = (d : ℝ) * (16 / ℓ) ^ 2 := by + rw [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + +/-- **Support-volume bound:** the support of `η` is contained in the enlarged +box, whose volume is `∏ᵢ (hiᵢ − loᵢ + 2ℓ)`. -/ +theorem boxCutoff_support_volume_le (hℓ : 0 < ℓ) (hle : lo ≤ hi) : + volume (Function.support (boxCutoff lo hi ℓ)) + ≤ ENNReal.ofReal (∏ i, (hi i - lo i + 2 * ℓ)) := by + have hsub : Function.support (boxCutoff lo hi ℓ) + ⊆ Set.Icc (fun i => lo i - ℓ) (fun i => hi i + ℓ) := by + intro x hx + rw [Function.mem_support] at hx + unfold boxCutoff at hx + rw [Set.mem_Icc] + have key : ∀ i, lo i - ℓ ≤ x i ∧ x i ≤ hi i + ℓ := by + intro i + have hi0 : profile (lo i) (hi i) ℓ (x i) ≠ 0 := + Finset.prod_ne_zero_iff.mp hx i (Finset.mem_univ i) + refine ⟨?_, ?_⟩ + · by_contra hlt; push Not at hlt + exact hi0 (profile_eq_zero_left hℓ hlt.le) + · by_contra hlt; push Not at hlt + exact hi0 (profile_eq_zero_right hℓ hlt.le) + exact ⟨fun i => (key i).1, fun i => (key i).2⟩ + calc volume (Function.support (boxCutoff lo hi ℓ)) + ≤ volume (Set.Icc (fun i => lo i - ℓ) (fun i => hi i + ℓ)) := measure_mono hsub + _ = ∏ i, ENNReal.ofReal ((hi i + ℓ) - (lo i - ℓ)) := Real.volume_Icc_pi + _ = ∏ i, ENNReal.ofReal (hi i - lo i + 2 * ℓ) := by + apply Finset.prod_congr rfl + intro i _; congr 1; ring + _ = ENNReal.ofReal (∏ i, (hi i - lo i + 2 * ℓ)) := by + rw [← ENNReal.ofReal_prod_of_nonneg] + intro i _ + have : lo i ≤ hi i := hle i + linarith + +/-- Bundled smooth box cutoff data (support, range, plateau, and derivative bounds as named fields). -/ +structure SmoothBoxCutoff (lo hi : Vec d) (ℓ : ℝ) where + /-- The cutoff function. -/ + toFun : Vec d → ℝ + /-- Smoothness. -/ + contDiff : ContDiff ℝ (⊤ : ℕ∞) toFun + /-- Values lie in `[0, 1]`. -/ + mem_Icc : ∀ x, toFun x ∈ Set.Icc (0 : ℝ) 1 + /-- Identically `1` on the core box `[lo, hi]`. -/ + eq_one_of_mem : ∀ x ∈ Set.Icc lo hi, toFun x = 1 + /-- Vanishes off the ℓ-enlargement `[lo − ℓ, hi + ℓ]`. -/ + eq_zero_of_notMem_enlarged : + ∀ x, x ∉ Set.Icc (fun i => lo i - ℓ) (fun i => hi i + ℓ) → toFun x = 0 + /-- Coordinate derivative bound with explicit constant `16 / ℓ`. -/ + deriv_bound : ∀ x i, |fderiv ℝ toFun x (Pi.single i 1)| ≤ 16 / ℓ + +/-- The concrete smooth box cutoff. -/ +noncomputable def smoothBoxCutoff (lo hi : Vec d) {ℓ : ℝ} (hℓ : 0 < ℓ) : + SmoothBoxCutoff lo hi ℓ where + toFun := boxCutoff lo hi ℓ + contDiff := boxCutoff_contDiff + mem_Icc := fun x => Set.mem_Icc.2 ⟨boxCutoff_nonneg x, boxCutoff_le_one x⟩ + eq_one_of_mem := fun _ hx => boxCutoff_eq_one hℓ hx + eq_zero_of_notMem_enlarged := fun _ hx => boxCutoff_eq_zero hℓ hx + deriv_bound := fun x i => boxCutoff_deriv_bound hℓ x i + +/-- **Smooth box cutoff existence theorem.** For any closed box `[lo, hi]` (`lo ≤ hi`) and +margin `ℓ > 0`, there is a `C^∞` cutoff, valued in `[0, 1]`, equal to `1` on the +box, supported in the ℓ-enlargement, with coordinate derivative bound `16/ℓ`, +squared-gradient bound `d·(16/ℓ)²`, and support volume `≤ ∏ᵢ (hiᵢ−loᵢ+2ℓ)`. -/ +theorem exists_smoothBoxCutoff (lo hi : Vec d) (ℓ : ℝ) (hℓ : 0 < ℓ) (hle : lo ≤ hi) : + ∃ η : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) η ∧ + (∀ x, η x ∈ Set.Icc (0 : ℝ) 1) ∧ + (∀ x ∈ Set.Icc lo hi, η x = 1) ∧ + (∀ x, x ∉ Set.Icc (fun i => lo i - ℓ) (fun i => hi i + ℓ) → η x = 0) ∧ + (∀ x i, |fderiv ℝ η x (Pi.single i 1)| ≤ 16 / ℓ) ∧ + (∀ x, ∑ i, (fderiv ℝ η x (Pi.single i 1)) ^ 2 ≤ (d : ℝ) * (16 / ℓ) ^ 2) ∧ + volume (Function.support η) ≤ ENNReal.ofReal (∏ i, (hi i - lo i + 2 * ℓ)) := + ⟨boxCutoff lo hi ℓ, boxCutoff_contDiff, + fun x => Set.mem_Icc.2 ⟨boxCutoff_nonneg x, boxCutoff_le_one x⟩, + fun _ hx => boxCutoff_eq_one hℓ hx, + fun _ hx => boxCutoff_eq_zero hℓ hx, + fun x i => boxCutoff_deriv_bound hℓ x i, + fun x => boxCutoff_sq_grad_bound hℓ x, + boxCutoff_support_volume_le hℓ hle⟩ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Cube.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Cube.lean new file mode 100644 index 0000000000..94a750458d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Cube.lean @@ -0,0 +1,914 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import Mathlib.Algebra.Order.BigOperators.Ring.Finset +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations + +/-! # Cube -/ + +@[expose] public section + +noncomputable section + +open scoped BigOperators Topology +open Set + +namespace Homogenization + +/-! +# Cube cutoffs from one-dimensional profiles + +This file contains the coordinate-product construction for smooth cutoffs +between concentric subcubes of a triadic cube. +-/ + +/-- Closed concentric subcube of relative radius `ρ` inside a triadic cube. -/ +def scaledClosedCubeSet {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) : Set (Vec d) := + {x | ∀ i, |x i - cubeCenter Q i| ≤ ρ * cubeRadius Q} + +/-- Open concentric subcube of relative radius `ρ` inside a triadic cube. -/ +def scaledOpenCubeSet {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) : Set (Vec d) := + {x | ∀ i, |x i - cubeCenter Q i| < ρ * cubeRadius Q} + +theorem scaledClosedCubeSet_subset_metricClosedBall {d : ℕ} + (Q : TriadicCube d) {ρ : ℝ} (hρ : 0 ≤ ρ) : + scaledClosedCubeSet Q ρ ⊆ Metric.closedBall (cubeCenter Q) (ρ * cubeRadius Q) := by + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff] + · intro i + simpa [Real.dist_eq, abs_sub_comm] using hx i + · exact mul_nonneg hρ (cubeRadius_nonneg Q) + +theorem isClosed_scaledClosedCubeSet {d : ℕ} (Q : TriadicCube d) (ρ : ℝ) : + IsClosed (scaledClosedCubeSet Q ρ) := by + classical + unfold scaledClosedCubeSet + rw [show {x : Vec d | ∀ i, |x i - cubeCenter Q i| ≤ ρ * cubeRadius Q} = + ⋂ i : Fin d, {x : Vec d | |x i - cubeCenter Q i| ≤ ρ * cubeRadius Q} by + ext x + simp] + exact isClosed_iInter fun i => + isClosed_Iic.preimage + ((continuous_abs.comp ((continuous_apply i).sub continuous_const))) + +theorem isCompact_scaledClosedCubeSet {d : ℕ} (Q : TriadicCube d) {ρ : ℝ} + (hρ : 0 ≤ ρ) : + IsCompact (scaledClosedCubeSet Q ρ) := + (ProperSpace.isCompact_closedBall (cubeCenter Q) (ρ * cubeRadius Q)).of_isClosed_subset + (isClosed_scaledClosedCubeSet Q ρ) + (scaledClosedCubeSet_subset_metricClosedBall Q hρ) + +namespace QuantitativeTransitionProfile + +/-- Squared coordinate interpolation variable for the `i`th face of a cube +cutoff. -/ +def cubeArgument {d : ℕ} (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) (i : Fin d) + (x : Vec d) : ℝ := + ((ρ₂ * cubeRadius Q) ^ 2 - (x i - cubeCenter Q i) ^ 2) / + ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) + +/-- Coordinate-product cube cutoff generated by a one-dimensional profile. -/ +def cubeCutoff {d : ℕ} (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (x : Vec d) : ℝ := + ∏ i : Fin d, θ (cubeArgument Q ρ₁ ρ₂ i x) + +/-- Single profile factor appearing in the coordinate-product cube cutoff. -/ +def cubeFactor {d : ℕ} (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (i : Fin d) (x : Vec d) : ℝ := + θ (cubeArgument Q ρ₁ ρ₂ i x) + +/-- Partial coordinate-product used to build the full cube cutoff by induction +over a finite set of coordinates. -/ +def partialCubeCutoff {d : ℕ} (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (u : Finset (Fin d)) (x : Vec d) : ℝ := + ∏ i ∈ u, cubeFactor θ Q ρ₁ ρ₂ i x + +private theorem cubeArgument_den_pos {d : ℕ} (Q : TriadicCube d) + {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + 0 < (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 := by + have hrad : 0 < cubeRadius Q := cubeRadius_pos Q + have hρ₂ : 0 < ρ₂ := lt_trans hρ₁ hρ₁₂ + have hleft : 0 < ρ₂ * cubeRadius Q := mul_pos hρ₂ hrad + have hright : 0 < ρ₁ * cubeRadius Q := mul_pos hρ₁ hrad + have hlt : ρ₁ * cubeRadius Q < ρ₂ * cubeRadius Q := + mul_lt_mul_of_pos_right hρ₁₂ hrad + calc + 0 < (ρ₂ * cubeRadius Q - ρ₁ * cubeRadius Q) * + (ρ₂ * cubeRadius Q + ρ₁ * cubeRadius Q) := + mul_pos (sub_pos.mpr hlt) (add_pos hleft hright) + _ = (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 := by ring + +/-- Exact coordinate-direction derivative of the one-dimensional cube argument. -/ +theorem fderiv_cubeArgument_apply_basisVec {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (i j : Fin d) (x : Vec d) : + (fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x) (basisVec j) = + (-(2 * (x i - cubeCenter Q i) * (if j = i then 1 else 0))) / + ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) := by + unfold cubeArgument + simp only [div_eq_mul_inv] + rw [fderiv_mul_const] + · rw [fderiv_const_sub] + simp [fderiv_coord_sub_const_sq_apply_basisVec, neg_mul, mul_assoc] + split <;> ring + · fun_prop + +/-- The cube cutoff argument is differentiable whenever the annulus radii are +strictly ordered. -/ +theorem differentiableAt_cubeArgument {d : ℕ} (Q : TriadicCube d) + {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (i : Fin d) (x : Vec d) : + DifferentiableAt ℝ (cubeArgument Q ρ₁ ρ₂ i) x := by + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (⊤ : ℕ∞) + (fun y : Vec d => y i - cubeCenter Q i) := + (contDiff_apply ℝ ℝ i).sub contDiff_const + exact ((contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden).differentiable + (by simp) x + +/-- On the outer closed cube, each one-dimensional cube argument has the +expected first-derivative scale. -/ +theorem norm_fderiv_cubeArgument_le_of_mem_scaledClosedCubeSet {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i : Fin d} {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₂) : + ‖fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x‖ ≤ + 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hsum := norm_clm_le_sum_basisVec_apply (fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x) + have hrad_pos : 0 < cubeRadius Q := cubeRadius_pos Q + have hρ₂_pos : 0 < ρ₂ := lt_trans hρ₁ hρ₁₂ + have hden_pos := cubeArgument_den_pos Q hρ₁ hρ₁₂ + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := + mul_pos (sub_pos.mpr hρ₁₂) hrad_pos + calc + ‖fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x‖ + ≤ ∑ j : Fin d, + ‖(fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x) (basisVec j)‖ := hsum + _ = ‖(-(2 * (x i - cubeCenter Q i) * (if i = i then 1 else 0))) / + ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)‖ := by + rw [Finset.sum_eq_single i] + · simp [fderiv_cubeArgument_apply_basisVec] + · intro j _hj hji + simp [fderiv_cubeArgument_apply_basisVec, hji] + · intro hi + exact False.elim (hi (Finset.mem_univ i)) + _ ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have habs : |x i - cubeCenter Q i| ≤ ρ₂ * cubeRadius Q := hx i + rw [if_pos rfl] + rw [Real.norm_eq_abs, abs_div] + rw [abs_of_pos hden_pos] + have hnum : |-(2 * (x i - cubeCenter Q i) * 1)| ≤ + 2 * (ρ₂ * cubeRadius Q) := by + rw [abs_neg, mul_one, abs_mul, abs_of_pos (by norm_num : (0 : ℝ) < 2)] + exact mul_le_mul_of_nonneg_left habs (by norm_num : 0 ≤ (2 : ℝ)) + have hden_eq : ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) = + ((ρ₂ - ρ₁) * cubeRadius Q) * ((ρ₂ + ρ₁) * cubeRadius Q) := by + ring + have hright_pos : 0 < (ρ₂ + ρ₁) * cubeRadius Q := by + positivity + have hbound : 2 * (ρ₂ * cubeRadius Q) / + (((ρ₂ - ρ₁) * cubeRadius Q) * ((ρ₂ + ρ₁) * cubeRadius Q)) + ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + rw [div_le_div_iff₀ (mul_pos hgap_pos hright_pos) hgap_pos] + nlinarith [mul_pos hρ₂_pos hrad_pos, mul_pos hρ₁ hrad_pos] + calc + |-(2 * (x i - cubeCenter Q i) * 1)| / + ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) + ≤ 2 * (ρ₂ * cubeRadius Q) / + ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) := + div_le_div_of_nonneg_right hnum hden_pos.le + _ = 2 * (ρ₂ * cubeRadius Q) / + (((ρ₂ - ρ₁) * cubeRadius Q) * ((ρ₂ + ρ₁) * cubeRadius Q)) := by + rw [hden_eq] + _ ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := hbound + +/-- Global second-derivative bound for each one-dimensional cube argument. -/ +theorem norm_iteratedFDeriv_two_cubeArgument_le {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (i : Fin d) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (cubeArgument Q ρ₁ ρ₂ i) x‖ ≤ + 2 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + have hden_pos := cubeArgument_den_pos Q hρ₁ hρ₁₂ + let f : Vec d → ℝ := + (-(1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2))) • + (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) + let g : Vec d → ℝ := fun _ => + (ρ₂ * cubeRadius Q) ^ 2 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) + have hfun : cubeArgument Q ρ₁ ρ₂ i = fun y : Vec d => f y + g y := by + funext y + simp [f, g] + unfold cubeArgument + field_simp [hden_pos.ne'] + ring + rw [hfun] + have hsq2 : ContDiff ℝ (2 : ℕ) (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) := by + exact (((contDiff_apply ℝ ℝ i).sub contDiff_const).pow 2) + have hf2 : ContDiff ℝ (2 : ℕ) f := + hsq2.const_smul (-(1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2))) + have hg2 : ContDiff ℝ (2 : ℕ) g := by + simpa [g] using (contDiff_const : ContDiff ℝ (2 : ℕ) g) + have hsum : + iteratedFDeriv ℝ 2 (fun y : Vec d => f y + g y) x = + iteratedFDeriv ℝ 2 f x + iteratedFDeriv ℝ 2 g x := by + simpa using! + congrArg (fun F : Vec d → ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F x) + (iteratedFDeriv_add (𝕜 := ℝ) (i := 2) (f := f) (g := g) hf2 hg2) + rw [hsum] + have hg_zero : iteratedFDeriv ℝ 2 g x = 0 := by + have hg_zero_fun : + iteratedFDeriv ℝ 2 + (fun _ : Vec d => + (ρ₂ * cubeRadius Q) ^ 2 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) = 0 := + iteratedFDeriv_const_of_ne (𝕜 := ℝ) (E := Vec d) (F := ℝ) + (n := 2) (by norm_num : 2 ≠ 0) + ((ρ₂ * cubeRadius Q) ^ 2 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) + exact congrArg + (fun F : Vec d → ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F x) + (by simpa [g] using hg_zero_fun) + rw [hg_zero, add_zero] + have hsq : + ‖iteratedFDeriv ℝ 2 f x‖ = + (1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) * + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) x‖ := by + have hiter : + iteratedFDeriv ℝ 2 f x = + (-(1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) : ℝ) • + iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) x := by + rw [show f = + (-(1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) : ℝ) • + (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) by rfl] + rw [iteratedFDeriv_const_smul_apply] + exact hsq2.contDiffAt + rw [hiter, norm_smul] + have hscalar_neg : -(1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) < 0 := by + exact neg_neg_of_pos (one_div_pos.mpr hden_pos) + rw [Real.norm_eq_abs, abs_of_neg hscalar_neg] + ring + calc + ‖iteratedFDeriv ℝ 2 f x‖ + = + (1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) * + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - cubeCenter Q i) ^ 2) x‖ := hsq + _ ≤ (1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) * 2 := by + exact mul_le_mul_of_nonneg_left + (norm_iteratedFDeriv_two_coord_sub_const_sq_le i (cubeCenter Q) x) + (le_of_lt (one_div_pos.mpr hden_pos)) + _ ≤ 2 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + have hrad_pos : 0 < cubeRadius Q := cubeRadius_pos Q + have hρ₂_pos : 0 < ρ₂ := lt_trans hρ₁ hρ₁₂ + have haux : + ((ρ₂ - ρ₁) * cubeRadius Q) ^ 2 ≤ + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 := by + nlinarith [hρ₁, hρ₂_pos, hrad_pos] + have hrecip : + 1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2) ≤ + 1 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + have hsq_pos : 0 < ((ρ₂ - ρ₁) * cubeRadius Q) ^ 2 := by + exact sq_pos_of_pos (mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q)) + exact one_div_le_one_div_of_le hsq_pos haux + calc + (1 / ((ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2)) * 2 + ≤ (1 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2)) * 2 := + mul_le_mul_of_nonneg_right hrecip (by norm_num) + _ = 2 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by ring + +theorem cubeFactor_contDiff_two {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (i : Fin d) : + ContDiff ℝ (2 : ℕ) (cubeFactor θ Q ρ₁ ρ₂ i) := by + have hθ : ContDiff ℝ (2 : ℕ) θ := by + exact θ.smooth.of_le (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2) + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (2 : ℕ) (fun x : Vec d => x i - cubeCenter Q i) := by + exact ((contDiff_apply ℝ ℝ i).sub contDiff_const).of_le + (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2) + have harg : ContDiff ℝ (2 : ℕ) (cubeArgument Q ρ₁ ρ₂ i) := by + unfold cubeArgument + exact (contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden + simpa [cubeFactor] using! hθ.comp harg + +/-- Inside the `i`th inner slab, the `i`th one-dimensional cube factor is +locally constant, hence its full Frechet derivative vanishes. -/ +theorem fderiv_cubeFactor_eq_zero_of_abs_sub_center_lt_inner {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i : Fin d} {x : Vec d} + (hx : |x i - cubeCenter Q i| < ρ₁ * cubeRadius Q) : + fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x = 0 := by + let S : Set (Vec d) := {y | |y i - cubeCenter Q i| < ρ₁ * cubeRadius Q} + have hS_open : IsOpen S := by + dsimp [S] + exact isOpen_lt + (continuous_abs.comp ((continuous_apply i).sub continuous_const)) + continuous_const + have hloc : cubeFactor θ Q ρ₁ ρ₂ i =ᶠ[𝓝 x] fun _ => (1 : ℝ) := by + filter_upwards [hS_open.mem_nhds hx] with y hy + unfold cubeFactor cubeArgument + apply θ.one_of_one_le + rw [one_le_div (cubeArgument_den_pos Q hρ₁ hρ₁₂)] + have hrad_nonneg : 0 ≤ cubeRadius Q := cubeRadius_nonneg Q + have hρ₁_nonneg : 0 ≤ ρ₁ := le_of_lt hρ₁ + have habs : |y i - cubeCenter Q i| ≤ ρ₁ * cubeRadius Q := le_of_lt hy + have hsquare : + (y i - cubeCenter Q i) ^ 2 ≤ (ρ₁ * cubeRadius Q) ^ 2 := by + rw [sq_le_sq] + simpa [abs_of_nonneg (mul_nonneg hρ₁_nonneg hrad_nonneg)] using habs + linarith + simpa using hloc.fderiv_eq + +/-- A coordinate direction differentiates only the matching cube factor. -/ +theorem fderiv_cubeFactor_apply_basisVec_eq_zero_of_ne {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i k : Fin d} (hik : i ≠ k) + (x : Vec d) : + (fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ k) x) (basisVec i) = 0 := by + have harg : DifferentiableAt ℝ (cubeArgument Q ρ₁ ρ₂ k) x := + differentiableAt_cubeArgument Q hρ₁ hρ₁₂ k x + have hθ : DifferentiableAt ℝ θ (cubeArgument Q ρ₁ ρ₂ k x) := + θ.smooth.differentiable (by simp) (cubeArgument Q ρ₁ ρ₂ k x) + unfold cubeFactor + rw [fderiv_fun_comp (x := x) hθ harg] + have harg_zero : + (fderiv ℝ (cubeArgument Q ρ₁ ρ₂ k) x) (basisVec i) = 0 := by + simp [fderiv_cubeArgument_apply_basisVec, hik] + rw [ContinuousLinearMap.comp_apply, harg_zero, map_zero] + +/-- The canonical coordinate-product cutoff has zero `i`-direction derivative +away from the `i`-normal transition collar. -/ +theorem fderiv_cubeCutoff_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i : Fin d} {x : Vec d} + (hx : |x i - cubeCenter Q i| < ρ₁ * cubeRadius Q) : + (fderiv ℝ (cubeCutoff θ Q ρ₁ ρ₂) x) (basisVec i) = 0 := by + classical + have hfactor_diff : ∀ k : Fin d, + DifferentiableAt ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ k y)) x := by + intro k + exact (θ.smooth.differentiable (by simp) (cubeArgument Q ρ₁ ρ₂ k x)).comp x + (differentiableAt_cubeArgument Q hρ₁ hρ₁₂ k x) + change (fderiv ℝ (fun y : Vec d => + ∏ k : Fin d, θ (cubeArgument Q ρ₁ ρ₂ k y)) x) (basisVec i) = 0 + rw [fderiv_finsetProd (u := (Finset.univ : Finset (Fin d))) + (g := fun k y => θ (cubeArgument Q ρ₁ ρ₂ k y))] + · simp only [sum_apply, smul_apply] + apply Finset.sum_eq_zero + intro k _hk + by_cases hki : k = i + · subst k + have hderiv_zero : + fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x = 0 := by + simpa [cubeFactor] using! + fderiv_cubeFactor_eq_zero_of_abs_sub_center_lt_inner θ Q hρ₁ hρ₁₂ hx + simp [hderiv_zero] + · have hderiv_apply_zero : + (fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ k y)) x) + (basisVec i) = 0 := by + have hik : i ≠ k := fun h => hki h.symm + simpa [cubeFactor] using! + fderiv_cubeFactor_apply_basisVec_eq_zero_of_ne θ Q hρ₁ hρ₁₂ hik x + simp [hderiv_apply_zero] + · intro k _hk + exact hfactor_diff k + +theorem norm_iteratedFDeriv_one_cubeFactor_le_of_mem_scaledClosedCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i : Fin d} {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₂) : + ‖iteratedFDeriv ℝ 1 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ + θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + have hnorm : + ‖iteratedFDeriv ℝ 1 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ = + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ := by + simp + have hargDiff : DifferentiableAt ℝ (cubeArgument Q ρ₁ ρ₂ i) x := by + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => y i - cubeCenter Q i) := + (contDiff_apply ℝ ℝ i).sub contDiff_const + exact ((contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden).differentiable + (by simp) x + rw [hnorm] + calc + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ + ≤ θ.derivBound * ‖fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x‖ := + norm_fderiv_profile_comp_le θ hargDiff + _ ≤ θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := + mul_le_mul_of_nonneg_left + (norm_fderiv_cubeArgument_le_of_mem_scaledClosedCubeSet Q hρ₁ hρ₁₂ hx) + θ.derivBound_nonneg + +theorem norm_iteratedFDeriv_two_cubeFactor_le_of_mem_scaledClosedCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {i : Fin d} {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₂) : + ‖iteratedFDeriv ℝ 2 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ + 2 * (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := by + have hfirst : + ‖iteratedFDeriv ℝ 1 (cubeArgument Q ρ₁ ρ₂ i) x‖ ≤ + 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hnorm : + ‖iteratedFDeriv ℝ 1 (cubeArgument Q ρ₁ ρ₂ i) x‖ = + ‖fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x‖ := by + simp + rw [hnorm] + exact norm_fderiv_cubeArgument_le_of_mem_scaledClosedCubeSet Q hρ₁ hρ₁₂ hx + have hsecond : + ‖iteratedFDeriv ℝ 2 (cubeArgument Q ρ₁ ρ₂ i) x‖ ≤ + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := by + have hbase := norm_iteratedFDeriv_two_cubeArgument_le Q hρ₁ hρ₁₂ i x + have hsquare : + 2 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) ≤ + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := by + have hgap_ne : ((ρ₂ - ρ₁) * cubeRadius Q) ≠ 0 := by + exact ne_of_gt (mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q)) + rw [show (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 = + 4 / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) by + field_simp [pow_two, hgap_ne] + ring] + exact div_le_div_of_nonneg_right (by norm_num : (2 : ℝ) ≤ 4) (sq_nonneg _) + exact hbase.trans hsquare + have hargContDiff : ContDiff ℝ (2 : ℕ) (cubeArgument Q ρ₁ ρ₂ i) := by + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (2 : ℕ) (fun y : Vec d => y i - cubeCenter Q i) := by + exact ((contDiff_apply ℝ ℝ i).sub contDiff_const).of_le + (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2) + unfold cubeArgument + exact (contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden + simpa [cubeFactor] using! + norm_iteratedFDeriv_two_profile_comp_le θ hargContDiff hfirst hsecond + +theorem cubeCutoff_smooth {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + ContDiff ℝ (⊤ : ℕ∞) (cubeCutoff θ Q ρ₁ ρ₂) := by + unfold cubeCutoff + apply contDiff_prod + intro i _hi + apply θ.smooth.comp + unfold cubeArgument + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => x i - cubeCenter Q i) := + (contDiff_apply ℝ ℝ i).sub contDiff_const + exact (contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden + +theorem cubeCutoff_nonneg {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) (x : Vec d) : + 0 ≤ cubeCutoff θ Q ρ₁ ρ₂ x := by + unfold cubeCutoff + exact Finset.prod_nonneg (fun i _hi => θ.nonneg _) + +theorem cubeCutoff_le_one {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) (x : Vec d) : + cubeCutoff θ Q ρ₁ ρ₂ x ≤ 1 := by + unfold cubeCutoff + exact Finset.prod_le_one₀ + (fun i _hi => θ.nonneg _) + (fun i _hi => θ.le_one _) + +theorem cubeCutoff_eq_one_of_mem_scaledClosedCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₁) : + cubeCutoff θ Q ρ₁ ρ₂ x = 1 := by + unfold cubeCutoff + apply Finset.prod_eq_one + intro i _hi + apply θ.one_of_one_le + unfold cubeArgument + rw [one_le_div (cubeArgument_den_pos Q hρ₁ hρ₁₂)] + have hrad_nonneg : 0 ≤ cubeRadius Q := cubeRadius_nonneg Q + have hρ₁_nonneg : 0 ≤ ρ₁ := le_of_lt hρ₁ + have habs : |x i - cubeCenter Q i| ≤ ρ₁ * cubeRadius Q := hx i + have hsquare : + (x i - cubeCenter Q i) ^ 2 ≤ (ρ₁ * cubeRadius Q) ^ 2 := by + rw [sq_le_sq] + simpa [abs_of_nonneg (mul_nonneg hρ₁_nonneg hrad_nonneg)] using habs + linarith + +theorem cubeCutoff_eq_zero_of_notMem_scaledOpenCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {x : Vec d} + (hx : x ∉ scaledOpenCubeSet Q ρ₂) : + cubeCutoff θ Q ρ₁ ρ₂ x = 0 := by + classical + unfold scaledOpenCubeSet at hx + have hx' : ¬ ∀ i : Fin d, |x i - cubeCenter Q i| < ρ₂ * cubeRadius Q := by + simpa using hx + rw [not_forall] at hx' + obtain ⟨i, hi⟩ := hx' + rw [not_lt] at hi + unfold cubeCutoff + apply Finset.prod_eq_zero (Finset.mem_univ i) + apply θ.zero_of_nonpos + unfold cubeArgument + have hden_nonneg : + 0 ≤ (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 := + (cubeArgument_den_pos Q hρ₁ hρ₁₂).le + have hrad_nonneg : 0 ≤ cubeRadius Q := cubeRadius_nonneg Q + have hρ₂_nonneg : 0 ≤ ρ₂ := le_of_lt (lt_trans hρ₁ hρ₁₂) + have hsquare : + (ρ₂ * cubeRadius Q) ^ 2 ≤ (x i - cubeCenter Q i) ^ 2 := by + rw [sq_le_sq] + have hprod_nonneg : 0 ≤ ρ₂ * cubeRadius Q := + mul_nonneg hρ₂_nonneg hrad_nonneg + exact (abs_of_nonneg hprod_nonneg).symm ▸ hi + have hnum_nonpos : + (ρ₂ * cubeRadius Q) ^ 2 - (x i - cubeCenter Q i) ^ 2 ≤ 0 := by + nlinarith + exact div_nonpos_of_nonpos_of_nonneg hnum_nonpos hden_nonneg + +theorem cubeCutoff_support_subset_scaledOpenCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + Function.support (cubeCutoff θ Q ρ₁ ρ₂) ⊆ scaledOpenCubeSet Q ρ₂ := by + intro x hx + by_contra hnot + exact hx (cubeCutoff_eq_zero_of_notMem_scaledOpenCubeSet θ hρ₁ hρ₁₂ hnot) + +theorem cubeCutoff_support_subset_scaledClosedCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + Function.support (cubeCutoff θ Q ρ₁ ρ₂) ⊆ scaledClosedCubeSet Q ρ₂ := by + intro x hx i + exact le_of_lt ((cubeCutoff_support_subset_scaledOpenCubeSet θ hρ₁ hρ₁₂ hx) i) + +theorem cubeCutoff_tsupport_subset_scaledClosedCubeSet {d : ℕ} + (θ : QuantitativeTransitionProfile) {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + tsupport (cubeCutoff θ Q ρ₁ ρ₂) ⊆ scaledClosedCubeSet Q ρ₂ := + closure_minimal + (cubeCutoff_support_subset_scaledClosedCubeSet θ hρ₁ hρ₁₂) + (isClosed_scaledClosedCubeSet Q ρ₂) + +private theorem partialCubeCutoff_nonneg {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) (u : Finset (Fin d)) (x : Vec d) : + 0 ≤ partialCubeCutoff θ Q ρ₁ ρ₂ u x := by + unfold partialCubeCutoff + exact Finset.prod_nonneg (fun i _hi => θ.nonneg _) + +private theorem partialCubeCutoff_le_one {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) (u : Finset (Fin d)) (x : Vec d) : + partialCubeCutoff θ Q ρ₁ ρ₂ u x ≤ 1 := by + unfold partialCubeCutoff + exact Finset.prod_le_one₀ (fun i _hi => θ.nonneg _) (fun i _hi => θ.le_one _) + +private theorem norm_iteratedFDeriv_zero_cubeFactor_le_one {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (i : Fin d) (x : Vec d) : + ‖iteratedFDeriv ℝ 0 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ 1 := by + rw [norm_iteratedFDeriv_zero, Real.norm_eq_abs] + simpa [cubeFactor, abs_of_nonneg (θ.nonneg _)] using θ.le_one (cubeArgument Q ρ₁ ρ₂ i x) + +private theorem norm_iteratedFDeriv_zero_partialCubeCutoff_le_one {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (u : Finset (Fin d)) (x : Vec d) : + ‖iteratedFDeriv ℝ 0 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ 1 := by + rw [norm_iteratedFDeriv_zero, Real.norm_eq_abs, + abs_of_nonneg (partialCubeCutoff_nonneg θ Q ρ₁ ρ₂ u x)] + exact partialCubeCutoff_le_one θ Q ρ₁ ρ₂ u x + +private theorem partialCubeCutoff_contDiff_two {d : ℕ} (θ : QuantitativeTransitionProfile) + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (u : Finset (Fin d)) : + ContDiff ℝ (2 : ℕ) (partialCubeCutoff θ Q ρ₁ ρ₂ u) := by + unfold partialCubeCutoff + apply contDiff_prod + intro i hi + exact cubeFactor_contDiff_two θ Q hρ₁ hρ₁₂ i + +private theorem norm_fderiv_partialCubeCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (u : Finset (Fin d)) {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₂) : + ‖fderiv ℝ (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ + (u.card : ℝ) * (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + have hfactor_diff : ∀ i ∈ u, DifferentiableAt ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x := by + intro i hi + exact (cubeFactor_contDiff_two θ Q hρ₁ hρ₁₂ i).differentiable + (by norm_num) x + unfold partialCubeCutoff + rw [fderiv_finsetProd] + · calc + ‖∑ i ∈ u, (∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x) • + fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ + ≤ ∑ i ∈ u, ‖(∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x) • + fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ := by + simpa using norm_sum_le (s := u) + (f := fun i => + (∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x) • + fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x) + _ ≤ ∑ _i ∈ u, + (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + apply Finset.sum_le_sum + intro i hi + rw [norm_smul] + have hprod_nonneg : 0 ≤ ∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x := + Finset.prod_nonneg fun j hj => θ.nonneg _ + have hprod_le_one : ∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x ≤ 1 := + Finset.prod_le_one₀ (fun j hj => θ.nonneg _) (fun j hj => θ.le_one _) + have hfactor_bound : + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ + (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + have hnorm : + ‖iteratedFDeriv ℝ 1 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ = + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ := by + simp + calc + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ + ≤ θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + rw [← hnorm] + exact norm_iteratedFDeriv_one_cubeFactor_le_of_mem_scaledClosedCubeSet + θ Q hρ₁ hρ₁₂ hx + _ ≤ (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + have hDnonneg : 0 ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + positivity + exact mul_le_mul_of_nonneg_right + ((le_max_left _ _).trans (le_max_right _ _)) hDnonneg + calc + ‖∏ j ∈ u.erase i, cubeFactor θ Q ρ₁ ρ₂ j x‖ * + ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ + ≤ 1 * ‖fderiv ℝ (cubeFactor θ Q ρ₁ ρ₂ i) x‖ := by + gcongr + simpa [Real.norm_of_nonneg hprod_nonneg] using hprod_le_one + _ ≤ (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + simpa using hfactor_bound + _ = (u.card : ℝ) * + ((max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) := by + simp + _ = (u.card : ℝ) * (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by ring + · intro i hi + exact hfactor_diff i hi + +private theorem norm_iteratedFDeriv_one_partialCubeCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (u : Finset (Fin d)) {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₂) : + ‖iteratedFDeriv ℝ 1 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ + (u.card : ℝ) * (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + have hnorm : + ‖iteratedFDeriv ℝ 1 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ = + ‖fderiv ℝ (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ := by + simp + rw [hnorm] + exact norm_fderiv_partialCubeCutoff_le θ Q hρ₁ hρ₁₂ u hx + +private theorem norm_iteratedFDeriv_two_partialCubeCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + ∀ (u : Finset (Fin d)) (x : Vec d), x ∈ scaledClosedCubeSet Q ρ₂ → + ‖iteratedFDeriv ℝ 2 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ + 2 * (u.card : ℝ) ^ 2 * + ((max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) ^ 2 := by + classical + intro u + refine Finset.induction_on u ?_ ?_ + · intro x hx + have hfun : partialCubeCutoff θ Q ρ₁ ρ₂ ∅ = fun _ : Vec d => (1 : ℝ) := by + funext y + simp [partialCubeCutoff] + rw [hfun] + have hzero : + iteratedFDeriv ℝ 2 (fun _ : Vec d => (1 : ℝ)) x = 0 := by + exact congrArg + (fun F : Vec d → ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F x) + (iteratedFDeriv_const_of_ne (𝕜 := ℝ) (E := Vec d) (F := ℝ) + (n := 2) (by norm_num : 2 ≠ 0) (1 : ℝ)) + rw [hzero, norm_zero] + positivity + · intro i u hi hu x hx + let A : ℝ := (max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) + have hA_nonneg : 0 ≤ A := by + dsimp [A] + apply mul_nonneg + · exact le_trans zero_le_one (le_max_left _ _) + · have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + positivity + have hf0 := norm_iteratedFDeriv_zero_cubeFactor_le_one θ Q ρ₁ ρ₂ i x + have hg0 := norm_iteratedFDeriv_zero_partialCubeCutoff_le_one θ Q ρ₁ ρ₂ u x + have hf1 : ‖iteratedFDeriv ℝ 1 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ A := by + dsimp [A] + refine (norm_iteratedFDeriv_one_cubeFactor_le_of_mem_scaledClosedCubeSet + θ Q hρ₁ hρ₁₂ hx).trans ?_ + have hDnonneg : 0 ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + positivity + exact mul_le_mul_of_nonneg_right + ((le_max_left _ _).trans (le_max_right _ _)) hDnonneg + have hg1 : ‖iteratedFDeriv ℝ 1 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ (u.card : ℝ) * A := by + have htmp := norm_iteratedFDeriv_one_partialCubeCutoff_le θ Q hρ₁ hρ₁₂ u hx + simpa [A, mul_assoc] using htmp + have hf2 : ‖iteratedFDeriv ℝ 2 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ ≤ 2 * A ^ 2 := by + dsimp [A] + refine (norm_iteratedFDeriv_two_cubeFactor_le_of_mem_scaledClosedCubeSet + θ Q hρ₁ hρ₁₂ hx).trans ?_ + have hM : 1 ≤ max 1 (max θ.derivBound θ.secondDerivBound) := le_max_left _ _ + have hD_nonneg : 0 ≤ 2 / ((ρ₂ - ρ₁) * cubeRadius Q) := by + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + positivity + have hD_sq_nonneg : 0 ≤ (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := sq_nonneg _ + have hMmul : + 2 * max 1 (max θ.derivBound θ.secondDerivBound) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 + ≤ + 2 * (max 1 (max θ.derivBound θ.secondDerivBound) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) ^ 2 := by + have hMm : max 1 (max θ.derivBound θ.secondDerivBound) ≤ + (max 1 (max θ.derivBound θ.secondDerivBound)) ^ 2 := by + nlinarith + have hmain : + max 1 (max θ.derivBound θ.secondDerivBound) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 + ≤ + (max 1 (max θ.derivBound θ.secondDerivBound)) ^ 2 * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) ^ 2 := by + exact mul_le_mul_of_nonneg_right hMm hD_sq_nonneg + simpa [pow_two, mul_assoc, mul_left_comm, mul_comm] using + mul_le_mul_of_nonneg_left hmain (by norm_num : 0 ≤ (2 : ℝ)) + exact hMmul + have hg2 : ‖iteratedFDeriv ℝ 2 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ ≤ + 2 * (u.card : ℝ) ^ 2 * A ^ 2 := by + have htmp := hu x hx + simpa [A, mul_assoc] using htmp + have hprod : + partialCubeCutoff θ Q ρ₁ ρ₂ (insert i u) = + fun y => cubeFactor θ Q ρ₁ ρ₂ i y * partialCubeCutoff θ Q ρ₁ ρ₂ u y := by + funext y + simp [partialCubeCutoff, Finset.prod_insert, hi] + rw [hprod] + have hmul := norm_iteratedFDeriv_mul_le (𝕜 := ℝ) + (f := cubeFactor θ Q ρ₁ ρ₂ i) (g := partialCubeCutoff θ Q ρ₁ ρ₂ u) + (cubeFactor_contDiff_two θ Q hρ₁ hρ₁₂ i) + (partialCubeCutoff_contDiff_two θ Q hρ₁ hρ₁₂ u) + x le_rfl + calc + ‖iteratedFDeriv ℝ 2 + (fun y => cubeFactor θ Q ρ₁ ρ₂ i y * partialCubeCutoff θ Q ρ₁ ρ₂ u y) x‖ + ≤ ∑ k ∈ Finset.range (2 + 1), + ((2).choose k : ℝ) * ‖iteratedFDeriv ℝ k (cubeFactor θ Q ρ₁ ρ₂ i) x‖ * + ‖iteratedFDeriv ℝ (2 - k) (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ := hmul + _ = + ‖iteratedFDeriv ℝ 0 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ * + ‖iteratedFDeriv ℝ 2 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ + + 2 * ‖iteratedFDeriv ℝ 1 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ * + ‖iteratedFDeriv ℝ 1 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ + + ‖iteratedFDeriv ℝ 2 (cubeFactor θ Q ρ₁ ρ₂ i) x‖ * + ‖iteratedFDeriv ℝ 0 (partialCubeCutoff θ Q ρ₁ ρ₂ u) x‖ := by + rw [Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_one] + simp + _ ≤ 1 * (2 * (u.card : ℝ) ^ 2 * A ^ 2) + + 2 * A * ((u.card : ℝ) * A) + + (2 * A ^ 2) * 1 := by + gcongr + _ ≤ 2 * ((insert i u).card : ℝ) ^ 2 * A ^ 2 := by + rw [Finset.card_insert_of_notMem hi] + rw [Nat.cast_add, Nat.cast_one] + have hsquare : + ((u.card : ℝ) + 1) ^ 2 = (u.card : ℝ) ^ 2 + 2 * (u.card : ℝ) + 1 := by ring + rw [hsquare] + nlinarith [sq_nonneg A] + +/-- Global second-derivative bound for the coordinate-product cube cutoff. -/ +theorem norm_iteratedFDeriv_two_cubeCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (cubeCutoff θ Q ρ₁ ρ₂) x‖ ≤ + 2 * (d : ℝ) ^ 2 * + ((max 1 (max θ.derivBound θ.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) ^ 2 := by + by_cases hx : x ∈ scaledClosedCubeSet Q ρ₂ + · have hpartial := norm_iteratedFDeriv_two_partialCubeCutoff_le θ Q hρ₁ hρ₁₂ + (Finset.univ : Finset (Fin d)) x hx + simpa [cubeCutoff, partialCubeCutoff] using! hpartial + · have hx_support : x ∉ tsupport (cubeCutoff θ Q ρ₁ ρ₂) := fun hxs => + hx (cubeCutoff_tsupport_subset_scaledClosedCubeSet θ hρ₁ hρ₁₂ hxs) + have hx_iter : + x ∉ Function.support (iteratedFDeriv ℝ 2 (cubeCutoff θ Q ρ₁ ρ₂)) := by + intro hxs + exact hx_support + ((support_iteratedFDeriv_subset (𝕜 := ℝ) (f := cubeCutoff θ Q ρ₁ ρ₂) 2) hxs) + have hzero : iteratedFDeriv ℝ 2 (cubeCutoff θ Q ρ₁ ρ₂) x = 0 := by + simpa [Function.support] using hx_iter + rw [hzero, norm_zero] + positivity + +/-- Global first-derivative bound for the coordinate-product cube cutoff. -/ +theorem norm_fderiv_cubeCutoff_le {d : ℕ} + (θ : QuantitativeTransitionProfile) (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (x : Vec d) : + ‖fderiv ℝ (cubeCutoff θ Q ρ₁ ρ₂) x‖ ≤ + (d : ℝ) * θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + by_cases hx : x ∈ scaledClosedCubeSet Q ρ₂ + · have hargdiff : ∀ i : Fin d, + DifferentiableAt ℝ (cubeArgument Q ρ₁ ρ₂ i) x := by + intro i + have hden : ∀ _x : Vec d, + (ρ₂ * cubeRadius Q) ^ 2 - (ρ₁ * cubeRadius Q) ^ 2 ≠ 0 := + fun _ => (cubeArgument_den_pos Q hρ₁ hρ₁₂).ne' + have hcoord : ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => x i - cubeCenter Q i) := + (contDiff_apply ℝ ℝ i).sub contDiff_const + exact ((contDiff_const.sub (hcoord.pow 2)).div contDiff_const hden).differentiable + (by simp) x + have hfactor_diff : ∀ i : Fin d, + DifferentiableAt ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x := by + intro i + exact (θ.smooth.differentiable (by simp) (cubeArgument Q ρ₁ ρ₂ i x)).comp + x (hargdiff i) + change ‖fderiv ℝ + (fun y : Vec d => ∏ i : Fin d, θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ ≤ + (d : ℝ) * θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) + rw [fderiv_finsetProd (u := (Finset.univ : Finset (Fin d))) + (g := fun i y => θ (cubeArgument Q ρ₁ ρ₂ i y))] + · calc + ‖∑ i ∈ (Finset.univ : Finset (Fin d)), + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x)) • + fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ + ≤ ∑ i : Fin d, ‖(∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x)) • + fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ := by + simpa using norm_sum_le + (Finset.univ : Finset (Fin d)) + (fun i : Fin d => + (∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x)) • + fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x) + _ ≤ ∑ _i : Fin d, + θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + apply Finset.sum_le_sum + intro i _hi + rw [norm_smul] + have hprod_nonneg : 0 ≤ ∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x) := + Finset.prod_nonneg fun j _ => θ.nonneg _ + have hprod_le_one : ∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x) ≤ 1 := + Finset.prod_le_one₀ (fun j _ => θ.nonneg _) (fun j _ => θ.le_one _) + have hfactor_bound : + ‖fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ ≤ + θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + calc + ‖fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ + ≤ θ.derivBound * ‖fderiv ℝ (cubeArgument Q ρ₁ ρ₂ i) x‖ := + norm_fderiv_profile_comp_le θ (hargdiff i) + _ ≤ θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := + mul_le_mul_of_nonneg_left + (norm_fderiv_cubeArgument_le_of_mem_scaledClosedCubeSet Q hρ₁ hρ₁₂ hx) + θ.derivBound_nonneg + calc + ‖∏ j ∈ (Finset.univ : Finset (Fin d)).erase i, + θ (cubeArgument Q ρ₁ ρ₂ j x)‖ * + ‖fderiv ℝ (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ + ≤ 1 * ‖fderiv ℝ + (fun y : Vec d => θ (cubeArgument Q ρ₁ ρ₂ i y)) x‖ := by + gcongr + simpa [Real.norm_of_nonneg hprod_nonneg] using hprod_le_one + _ ≤ θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + simpa using hfactor_bound + _ = (d : ℝ) * (θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) := by + simp + _ = (d : ℝ) * θ.derivBound * (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := by + ring + · intro i _hi + exact hfactor_diff i + · have hx_support : x ∉ tsupport (cubeCutoff θ Q ρ₁ ρ₂) := fun hxs => + hx (cubeCutoff_tsupport_subset_scaledClosedCubeSet θ hρ₁ hρ₁₂ hxs) + rw [fderiv_of_notMem_tsupport (𝕜 := ℝ) hx_support, norm_zero] + have hgap_nonneg : 0 ≤ (ρ₂ - ρ₁) * cubeRadius Q := + le_of_lt (mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q)) + exact mul_nonneg (mul_nonneg (Nat.cast_nonneg d) θ.derivBound_nonneg) + (div_nonneg (by norm_num) hgap_nonneg) + +end QuantitativeTransitionProfile + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/DerivativeBounds.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/DerivativeBounds.lean new file mode 100644 index 0000000000..eb7e7d6e1e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/DerivativeBounds.lean @@ -0,0 +1,315 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Bounds +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Calculus.Deriv.Basic +public import Mathlib.Analysis.Calculus.FDeriv.Pow +public import Mathlib.Analysis.Calculus.FDeriv.Add +public import Mathlib.Analysis.Calculus.IteratedDeriv.Defs + +/-! # Derivative Bounds -/ + +@[expose] public section + +noncomputable section + +open scoped Topology + +namespace Homogenization + +/-! +# Compact-support derivative bounds + +This file contains small reusable analytic lemmas for smooth compactly +supported functions on `Vec d`. They are intentionally independent of the +specific cutoff formulas. +-/ + +/-- Operator norm bound for scalar continuous linear maps on `Vec d`, using +the coordinate basis and the default product/sup norm on `Vec d`. -/ +theorem norm_clm_le_sum_basisVec_apply {d : ℕ} (L : Vec d →L[ℝ] ℝ) : + ‖L‖ ≤ ∑ i : Fin d, ‖L (basisVec i)‖ := by + refine L.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) ?_ + intro x + have hx : + L x = ∑ i : Fin d, x i * L (basisVec i) := by + calc + L x = ∑ i : Fin d, x i • L (fun j => if i = j then 1 else 0) := by + simpa using (LinearMap.pi_apply_eq_sum_univ (f := L.toLinearMap) x) + _ = ∑ i : Fin d, x i • L (basisVec i) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + have hfun : (fun j => if i = j then 1 else 0) = basisVec i := by + funext j + simp [basisVec_apply, eq_comm] + rw [hfun] + _ = ∑ i : Fin d, x i * L (basisVec i) := by + simp [smul_eq_mul] + calc + ‖L x‖ = ‖∑ i : Fin d, x i * L (basisVec i)‖ := by rw [hx] + _ ≤ ∑ i : Fin d, ‖x i * L (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖x i‖ * ‖L (basisVec i)‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖x‖ * ‖L (basisVec i)‖ := by + exact Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i : Fin d, ‖L (basisVec i)‖) * ‖x‖ := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => ‖L (basisVec i)‖) ‖x‖).symm + +/-- Directional derivative of a shifted coordinate in a coordinate direction. -/ +theorem fderiv_coord_sub_const_apply_basisVec {d : ℕ} + (i j : Fin d) (c x : Vec d) : + (fderiv ℝ (fun y : Vec d => y i - c i) x) (basisVec j) = + if j = i then 1 else 0 := by + rw [fderiv_sub_const] + change (fderiv ℝ (⇑(ContinuousLinearMap.proj (R := ℝ) i)) x) (basisVec j) = _ + rw [ContinuousLinearMap.fderiv] + simp [basisVec_apply, eq_comm] + +/-- The operator norm of a shifted coordinate derivative is at most `1` in the +default product/sup norm on `Vec d`. -/ +theorem norm_fderiv_coord_sub_const_le_one {d : ℕ} + (i : Fin d) (c x : Vec d) : + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ ≤ 1 := by + have hsum := norm_clm_le_sum_basisVec_apply (fderiv ℝ (fun y : Vec d => y i - c i) x) + calc + ‖fderiv ℝ (fun y : Vec d => y i - c i) x‖ + ≤ ∑ j : Fin d, ‖(fderiv ℝ (fun y : Vec d => y i - c i) x) (basisVec j)‖ := hsum + _ = 1 := by + rw [Finset.sum_eq_single i] + · simp [fderiv_coord_sub_const_apply_basisVec] + · intro j _hj hji + simp [fderiv_coord_sub_const_apply_basisVec, hji] + · intro hi + exact False.elim (hi (Finset.mem_univ i)) + +/-- The derivative of a shifted coordinate is constant in the base point. -/ +theorem fderiv_coord_sub_const_eq_proj {d : ℕ} + (i : Fin d) (c x : Vec d) : + fderiv ℝ (fun y : Vec d => y i - c i) x = ContinuousLinearMap.proj i := by + rw [fderiv_sub_const] + change fderiv ℝ (⇑(ContinuousLinearMap.proj (R := ℝ) i)) x = ContinuousLinearMap.proj i + rw [ContinuousLinearMap.fderiv] + +/-- Directional derivative of a shifted coordinate square in a coordinate +direction. -/ +theorem fderiv_coord_sub_const_sq_apply_basisVec {d : ℕ} + (i j : Fin d) (c x : Vec d) : + (fderiv ℝ (fun y : Vec d => (y i - c i) ^ 2) x) (basisVec j) = + 2 * (x i - c i) * (if j = i then 1 else 0) := by + rw [fderiv_fun_pow] + · simp [fderiv_coord_sub_const_apply_basisVec, pow_one, smul_eq_mul] + · fun_prop + +/-- A shifted coordinate is affine, so its second Fréchet derivative vanishes. -/ +theorem iteratedFDeriv_two_coord_sub_const_eq_zero {d : ℕ} + (i : Fin d) (c : Vec d) : + iteratedFDeriv ℝ 2 (fun y : Vec d => y i - c i) = 0 := by + ext x m + have hx0 : iteratedFDeriv ℝ 2 (fun y : Vec d => y i - c i) x = 0 := by + apply norm_eq_zero.mp + rw [← norm_iteratedFDeriv_fderiv] + have hconst : + fderiv ℝ (fun y : Vec d => y i - c i) = fun _ => ContinuousLinearMap.proj i := by + funext y + exact fderiv_coord_sub_const_eq_proj i c y + rw [hconst, iteratedFDeriv_const_of_ne (𝕜 := ℝ) (by norm_num) + (ContinuousLinearMap.proj i)] + simp + simpa using congrArg (fun F : ContinuousMultilinearMap ℝ (fun _ : Fin 2 => Vec d) ℝ => F m) hx0 + +/-- Uniform second-derivative bound for the square of a shifted coordinate. -/ +theorem norm_iteratedFDeriv_two_coord_sub_const_sq_le {d : ℕ} + (i : Fin d) (c x : Vec d) : + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - c i) ^ 2) x‖ ≤ 2 := by + let g : Vec d → ℝ := fun y => y i - c i + have hg : ContDiff ℝ (2 : ℕ) g := by + simpa [g] using ((contDiff_apply ℝ ℝ i).sub contDiff_const) + have hmul := norm_iteratedFDeriv_mul_le (𝕜 := ℝ) (A := ℝ) hg hg x le_rfl + have hzero : ‖iteratedFDeriv ℝ 2 g x‖ = 0 := by + rw [iteratedFDeriv_two_coord_sub_const_eq_zero, Pi.zero_apply, norm_zero] + have hone : ‖iteratedFDeriv ℝ 1 g x‖ ≤ 1 := by + have hnorm : + ‖iteratedFDeriv ℝ 1 g x‖ = ‖fderiv ℝ g x‖ := by + simp [norm_iteratedFDeriv_zero, + (norm_iteratedFDeriv_fderiv (𝕜 := ℝ) (f := g) (n := 0) (x := x)).symm] + rw [hnorm] + simpa [g] using norm_fderiv_coord_sub_const_le_one i c x + have hval : ‖iteratedFDeriv ℝ 0 g x‖ = ‖g x‖ := by + simp [g] + have hsq : (fun y : Vec d => (y i - c i) ^ 2) = fun y : Vec d => g y * g y := by + funext y + simp [g, pow_two] + rw [hsq] + calc + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => g y * g y) x‖ + ≤ ∑ k ∈ Finset.range (2 + 1), + ((2).choose k : ℝ) * ‖iteratedFDeriv ℝ k g x‖ * ‖iteratedFDeriv ℝ (2 - k) g x‖ := hmul + _ ≤ 2 := by + have hone_nonneg : 0 ≤ ‖iteratedFDeriv ℝ 1 g x‖ := norm_nonneg _ + have hsum : + ∑ k ∈ Finset.range (2 + 1), + ((2).choose k : ℝ) * ‖iteratedFDeriv ℝ k g x‖ * ‖iteratedFDeriv ℝ (2 - k) g x‖ + = + ‖g x‖ * ‖iteratedFDeriv ℝ 2 g x‖ + + 2 * ‖iteratedFDeriv ℝ 1 g x‖ * ‖iteratedFDeriv ℝ 1 g x‖ + + ‖iteratedFDeriv ℝ 2 g x‖ * ‖g x‖ := by + rw [Finset.sum_range_succ, Finset.sum_range_succ, Finset.sum_range_one] + simp [hval] + rw [hsum, hzero] + have hmid : 2 * ‖iteratedFDeriv ℝ 1 g x‖ * ‖iteratedFDeriv ℝ 1 g x‖ ≤ 2 := by + nlinarith + linarith + +/-- Euclidean squared distance has second derivative bounded by `2 d` in the +default product/sup norm on `Vec d`. -/ +theorem norm_iteratedFDeriv_two_euclideanSqDist_le {d : ℕ} + (x₀ x : Vec d) : + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => euclideanSqDist y x₀) x‖ ≤ 2 * (d : ℝ) := by + have hfun : (fun y : Vec d => euclideanSqDist y x₀) = + (fun y : Vec d => ∑ i : Fin d, (y i - x₀ i) ^ 2) := by + funext y + simp [euclideanSqDist, vecNormSq, vecDot, pow_two] + rw [hfun] + rw [iteratedFDeriv_sum] + · calc + ‖(∑ i : Fin d, iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2)) x‖ = + ‖∑ i : Fin d, iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x‖ := by + simp + _ ≤ ∑ i : Fin d, ‖iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x‖ := by + simpa using norm_sum_le + (Finset.univ : Finset (Fin d)) + (fun i : Fin d => iteratedFDeriv ℝ 2 (fun y : Vec d => (y i - x₀ i) ^ 2) x) + _ ≤ ∑ _i : Fin d, 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact norm_iteratedFDeriv_two_coord_sub_const_sq_le i x₀ x + _ = 2 * (d : ℝ) := by + simp + ring + · intro i _hi + exact (((contDiff_apply ℝ ℝ i).sub contDiff_const).pow 2) + +/-- Coordinate-direction derivative of Euclidean squared distance on `Vec d`. -/ +theorem fderiv_euclideanSqDist_apply_basisVec {d : ℕ} + (x₀ x : Vec d) (j : Fin d) : + (fderiv ℝ (fun y : Vec d => euclideanSqDist y x₀) x) (basisVec j) = + 2 * (x j - x₀ j) := by + have hfun : (fun y : Vec d => euclideanSqDist y x₀) = + (fun y : Vec d => ∑ i : Fin d, (y i - x₀ i) ^ 2) := by + funext y + simp [euclideanSqDist, vecNormSq, vecDot, pow_two] + rw [hfun] + rw [fderiv_fun_sum] + · simp [fderiv_coord_sub_const_sq_apply_basisVec] + · intro i _hi + fun_prop + +/-- Chain-rule bound for composing a quantitative one-dimensional transition +profile with a scalar function on `Vec d`. -/ +theorem norm_fderiv_profile_comp_le {d : ℕ} + (θ : QuantitativeTransitionProfile) {g : Vec d → ℝ} {x : Vec d} + (hg : DifferentiableAt ℝ g x) : + ‖fderiv ℝ (fun y : Vec d => θ (g y)) x‖ ≤ + θ.derivBound * ‖fderiv ℝ g x‖ := by + have hθdiff : DifferentiableAt ℝ θ (g x) := + θ.smooth.differentiable (by simp) (g x) + rw [fderiv_fun_comp (x := x) hθdiff hg] + calc + ‖(fderiv ℝ θ (g x)).comp (fderiv ℝ g x)‖ + ≤ ‖fderiv ℝ θ (g x)‖ * ‖fderiv ℝ g x‖ := + ContinuousLinearMap.opNorm_comp_le _ _ + _ = ‖deriv θ (g x)‖ * ‖fderiv ℝ g x‖ := by + rw [norm_deriv_eq_norm_fderiv] + _ ≤ θ.derivBound * ‖fderiv ℝ g x‖ := + mul_le_mul_of_nonneg_right (θ.norm_deriv_le _) (norm_nonneg _) + +/-- Chain-rule Hessian bound for composing a quantitative one-dimensional +transition profile with a scalar function. The argument is measured through a +single scale `D` controlling both the first and second derivatives in the form +required by Mathlib's quantitative composition estimate. -/ +theorem norm_iteratedFDeriv_two_profile_comp_le {d : ℕ} + (θ : QuantitativeTransitionProfile) {g : Vec d → ℝ} {x : Vec d} {D : ℝ} + (hg : ContDiff ℝ (2 : ℕ) g) + (hD_one : ‖iteratedFDeriv ℝ 1 g x‖ ≤ D) + (hD_two : ‖iteratedFDeriv ℝ 2 g x‖ ≤ D ^ 2) : + ‖iteratedFDeriv ℝ 2 (fun y : Vec d => θ (g y)) x‖ ≤ + 2 * (max 1 (max θ.derivBound θ.secondDerivBound)) * D ^ 2 := by + let C : ℝ := max 1 (max θ.derivBound θ.secondDerivBound) + have hC_nonneg : 0 ≤ C := by + exact le_trans zero_le_one (le_max_left _ _) + have hC : ∀ i, i ≤ 2 → ‖iteratedFDeriv ℝ i θ (g x)‖ ≤ C := by + intro i hi + interval_cases i + · rw [norm_iteratedFDeriv_zero] + exact (Real.norm_of_nonneg (θ.nonneg _)).trans_le + ((θ.le_one _).trans (le_max_left _ _)) + · rw [norm_iteratedFDeriv_eq_norm_iteratedDeriv, iteratedDeriv_one] + exact (θ.norm_deriv_le _).trans + ((le_max_left θ.derivBound θ.secondDerivBound).trans (le_max_right _ _)) + · rw [norm_iteratedFDeriv_eq_norm_iteratedDeriv] + change ‖iteratedDeriv 2 θ (g x)‖ ≤ C + rw [show iteratedDeriv 2 θ = deriv (deriv θ) by + rw [show (2 : ℕ) = 1 + 1 by norm_num, iteratedDeriv_succ, iteratedDeriv_one]] + exact (θ.norm_secondDeriv_le _).trans + ((le_max_right θ.derivBound θ.secondDerivBound).trans (le_max_right _ _)) + have hD : ∀ i, 1 ≤ i → i ≤ 2 → ‖iteratedFDeriv ℝ i g x‖ ≤ D ^ i := by + intro i h1 hi + interval_cases i + · simpa using hD_one + · simpa using hD_two + have hcomp := norm_iteratedFDeriv_comp_le + (𝕜 := ℝ) (g := θ) (f := g) (n := 2) (N := (2 : ℕ)) + (θ.smooth.of_le + (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2)) + hg le_rfl x hC hD + simpa [Function.comp_def, Nat.factorial, C, mul_assoc] using hcomp + +/-- A smooth compactly supported scalar function has a global first-derivative +bound. -/ +theorem exists_bound_fderiv_of_contDiff_hasCompactSupport {d : ℕ} + {η : _root_.Homogenization.Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_comp : HasCompactSupport η) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x, ‖fderiv ℝ η x‖ ≤ C := by + obtain ⟨C, hC⟩ := + (hη_comp.fderiv (𝕜 := ℝ)).exists_bound_of_continuous + (hη.continuous_fderiv (by simp)) + refine ⟨max C 0, le_max_right _ _, ?_⟩ + intro x + exact le_trans (hC x) (le_max_left _ _) + +/-- A smooth compactly supported scalar function has a global second-derivative +bound, expressed through `iteratedFDeriv`. -/ +theorem exists_bound_iteratedFDeriv_two_of_contDiff_hasCompactSupport {d : ℕ} + {η : _root_.Homogenization.Vec d → ℝ} (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_comp : HasCompactSupport η) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x, ‖iteratedFDeriv ℝ 2 η x‖ ≤ C := by + have hcont : Continuous (fun x : _root_.Homogenization.Vec d => + ‖iteratedFDeriv ℝ 2 η x‖) := + (hη.continuous_iteratedFDeriv + (ENat.natCast_le_of_coe_top_le_withTop le_rfl 2)).norm + have hbounded : + BddAbove (Set.range fun x : _root_.Homogenization.Vec d => + ‖iteratedFDeriv ℝ 2 η x‖) := by + apply hcont.bddAbove_range_of_hasCompactSupport + apply HasCompactSupport.comp_left _ norm_zero + exact hη_comp.iteratedFDeriv (𝕜 := ℝ) 2 + obtain ⟨C, hC⟩ := hbounded + refine ⟨max C 0, le_max_right _ _, ?_⟩ + intro x + exact le_trans (hC (Set.mem_range_self x)) (le_max_left _ _) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Euclidean.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Euclidean.lean new file mode 100644 index 0000000000..72193edd8e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Euclidean.lean @@ -0,0 +1,524 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Data.Real.Pointwise +public import Mathlib.Topology.MetricSpace.Pseudo.Pi + +/-! # Euclidean -/ + +@[expose] public section + +noncomputable section + +open scoped BigOperators +open scoped Pointwise +open Set + +namespace Homogenization + +/-! +# Explicit Euclidean geometry on `Vec d` + +The project uses `Vec d = Fin d → ℝ`, whose default metric is the product/sup +metric. This file defines the Euclidean squared distance and Euclidean balls +explicitly on the same underlying type, so later cutoff statements can be about +round Euclidean balls without changing ambient type to `EuclideanSpace`. +-/ + +/-- Euclidean squared distance on `Vec d`, independent of the default `Vec d` +metric. -/ +def euclideanSqDist {d : ℕ} (x y : Vec d) : ℝ := + vecNormSq (x - y) + +/-- The legacy squared-distance expression is the square of the explicit +Euclidean distance. -/ +theorem euclideanSqDist_eq_euclideanDist_sq {d : ℕ} (x y : Vec d) : + euclideanSqDist x y = euclideanDist x y ^ 2 := by + rw [euclideanSqDist, euclideanDist, euclideanNorm_sq] + +/-- Explicit Euclidean open ball on `Vec d`. -/ +def euclideanBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : Set (Vec d) := + {x | euclideanSqDist x x₀ < R ^ 2} + +/-- Explicit Euclidean closed ball on `Vec d`. -/ +def euclideanClosedBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : Set (Vec d) := + {x | euclideanSqDist x x₀ ≤ R ^ 2} + +/-- Explicit Euclidean sphere on `Vec d`. -/ +def euclideanSphere {d : ℕ} (x₀ : Vec d) (R : ℝ) : Set (Vec d) := + {x | euclideanSqDist x x₀ = R ^ 2} + +@[simp] theorem euclideanSqDist_self {d : ℕ} (x : Vec d) : + euclideanSqDist x x = 0 := by + simp [euclideanSqDist, vecNormSq, vecDot] + +@[simp] theorem euclideanSqDist_zero_zero {d : ℕ} : + euclideanSqDist (0 : Vec d) 0 = 0 := by + simp + +theorem euclideanSqDist_add_right {d : ℕ} (x y z : Vec d) : + euclideanSqDist (x + z) (y + z) = euclideanSqDist x y := by + have hsub : (x + z) - (y + z) = x - y := by + ext i + simp + simp [euclideanSqDist, hsub] + +theorem euclideanSqDist_smul_smul {d : ℕ} (r : ℝ) (x y : Vec d) : + euclideanSqDist (r • x) (r • y) = r ^ 2 * euclideanSqDist x y := by + have hsub : r • x - r • y = r • (x - y) := by + ext i + simp [sub_eq_add_neg, mul_add] + rw [euclideanSqDist, hsub, vecNormSq_smul] + rfl + +theorem euclideanSqDist_smul_zero {d : ℕ} (r : ℝ) (x : Vec d) : + euclideanSqDist (r • x) 0 = r ^ 2 * euclideanSqDist x 0 := by + simpa using euclideanSqDist_smul_smul (d := d) r x 0 + +theorem euclideanSqDist_affine_center {d : ℕ} (x₀ y : Vec d) (r : ℝ) : + euclideanSqDist (r • y + x₀) x₀ = r ^ 2 * euclideanSqDist y 0 := by + calc + euclideanSqDist (r • y + x₀) x₀ = + euclideanSqDist (r • y) 0 := by + simpa using euclideanSqDist_add_right (r • y) 0 x₀ + _ = r ^ 2 * euclideanSqDist y 0 := + euclideanSqDist_smul_zero r y + +/-- Translating a point by `-z` from the center has the same explicit +Euclidean squared distance as `z` from the origin. -/ +theorem euclideanSqDist_sub_left_self {d : ℕ} (x z : Vec d) : + euclideanSqDist (x - z) x = euclideanSqDist z (0 : Vec d) := by + unfold euclideanSqDist vecNormSq vecDot + refine Finset.sum_congr rfl ?_ + intro i _hi + simp + +/-- If `z` lies in the explicit Euclidean ball about the origin, then `x - z` +lies in the corresponding explicit Euclidean ball about `x`. -/ +theorem sub_mem_euclideanBall_center_of_mem_zero + {d : ℕ} {x z : Vec d} {R : ℝ} + (hz : z ∈ euclideanBall (0 : Vec d) R) : + x - z ∈ euclideanBall x R := by + change euclideanSqDist (x - z) x < R ^ 2 + rw [euclideanSqDist_sub_left_self] + simpa [euclideanBall] using hz + +theorem affine_mem_euclideanBall_iff_of_pos {d : ℕ} + (x₀ y : Vec d) {r : ℝ} (hr : 0 < r) : + r • y + x₀ ∈ euclideanBall x₀ r ↔ y ∈ euclideanBall (0 : Vec d) 1 := by + change euclideanSqDist (r • y + x₀) x₀ < r ^ 2 ↔ euclideanSqDist y 0 < 1 ^ 2 + rw [euclideanSqDist_affine_center] + have hr2 : 0 < r ^ 2 := sq_pos_of_pos hr + norm_num + constructor <;> intro h <;> nlinarith + +theorem affine_mem_euclideanClosedBall_iff_of_pos {d : ℕ} + (x₀ y : Vec d) {r : ℝ} (hr : 0 < r) : + r • y + x₀ ∈ euclideanClosedBall x₀ r ↔ + y ∈ euclideanClosedBall (0 : Vec d) 1 := by + change euclideanSqDist (r • y + x₀) x₀ ≤ r ^ 2 ↔ euclideanSqDist y 0 ≤ 1 ^ 2 + rw [euclideanSqDist_affine_center] + have hr2 : 0 < r ^ 2 := sq_pos_of_pos hr + norm_num + constructor <;> intro h <;> nlinarith + +theorem euclideanBall_eq_translateSet_smul_unit_of_pos {d : ℕ} + (x₀ : Vec d) {r : ℝ} (hr : 0 < r) : + euclideanBall x₀ r = translateSet x₀ (r • euclideanBall (0 : Vec d) 1) := by + ext z + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hz + refine Set.mem_smul_set.2 ⟨r⁻¹ • (z - x₀), ?_, ?_⟩ + · have hpoint : r • (r⁻¹ • (z - x₀)) + x₀ ∈ euclideanBall x₀ r := by + have hpoint_eq : r • (r⁻¹ • (z - x₀)) + x₀ = z := by + ext i + simp [hr.ne', sub_eq_add_neg] + simpa [hpoint_eq] using hz + exact (affine_mem_euclideanBall_iff_of_pos x₀ (r⁻¹ • (z - x₀)) hr).1 hpoint + · ext i + simp [hr.ne'] + · intro hz + rcases Set.mem_smul_set.1 hz with ⟨y, hy, hy_eq⟩ + have hpoint : r • y + x₀ ∈ euclideanBall x₀ r := + (affine_mem_euclideanBall_iff_of_pos x₀ y hr).2 hy + have hpoint_eq : r • y + x₀ = z := by + ext i + simp [hy_eq, sub_eq_add_neg, add_assoc] + simpa [hpoint_eq] using hpoint + +theorem euclideanClosedBall_eq_translateSet_smul_unit_of_pos {d : ℕ} + (x₀ : Vec d) {r : ℝ} (hr : 0 < r) : + euclideanClosedBall x₀ r = + translateSet x₀ (r • euclideanClosedBall (0 : Vec d) 1) := by + ext z + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hz + refine Set.mem_smul_set.2 ⟨r⁻¹ • (z - x₀), ?_, ?_⟩ + · have hpoint : r • (r⁻¹ • (z - x₀)) + x₀ ∈ euclideanClosedBall x₀ r := by + have hpoint_eq : r • (r⁻¹ • (z - x₀)) + x₀ = z := by + ext i + simp [hr.ne', sub_eq_add_neg] + simpa [hpoint_eq] using hz + exact (affine_mem_euclideanClosedBall_iff_of_pos x₀ (r⁻¹ • (z - x₀)) hr).1 hpoint + · ext i + simp [hr.ne'] + · intro hz + rcases Set.mem_smul_set.1 hz with ⟨y, hy, hy_eq⟩ + have hpoint : r • y + x₀ ∈ euclideanClosedBall x₀ r := + (affine_mem_euclideanClosedBall_iff_of_pos x₀ y hr).2 hy + have hpoint_eq : r • y + x₀ = z := by + ext i + simp [hy_eq, sub_eq_add_neg, add_assoc] + simpa [hpoint_eq] using hpoint + +theorem euclideanSqDist_nonneg {d : ℕ} (x y : Vec d) : + 0 ≤ euclideanSqDist x y := by + unfold euclideanSqDist + exact vecNormSq_nonneg _ + +/-- Convexity inequality for the coordinate Euclidean squared norm. -/ +theorem vecNormSq_weighted_add_le {d : ℕ} + {a b : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) (hab : a + b = 1) + (v w : Vec d) : + vecNormSq (a • v + b • w) ≤ a * vecNormSq v + b * vecNormSq w := by + unfold vecNormSq vecDot + calc + ∑ i : Fin d, (a • v + b • w) i * (a • v + b • w) i + ≤ ∑ i : Fin d, (a * (v i * v i) + b * (w i * w i)) := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hnonneg : + 0 ≤ a * b * (v i - w i) ^ 2 := + mul_nonneg (mul_nonneg ha hb) (sq_nonneg _) + simp only [Pi.add_apply, Pi.smul_apply, smul_eq_mul] + nlinarith + _ = a * (∑ i : Fin d, v i * v i) + + b * (∑ i : Fin d, w i * w i) := by + rw [Finset.sum_add_distrib, Finset.mul_sum, Finset.mul_sum] + +/-- Convexity inequality for the coordinate Euclidean squared distance. -/ +theorem euclideanSqDist_weighted_add_le {d : ℕ} + {a b : ℝ} (ha : 0 ≤ a) (hb : 0 ≤ b) (hab : a + b = 1) + (x y x₀ : Vec d) : + euclideanSqDist (a • x + b • y) x₀ ≤ + a * euclideanSqDist x x₀ + b * euclideanSqDist y x₀ := by + have hsub : + (a • x + b • y) - x₀ = a • (x - x₀) + b • (y - x₀) := by + ext i + simp only [Pi.sub_apply, Pi.add_apply, Pi.smul_apply, smul_eq_mul] + calc + a * x i + b * y i - x₀ i = + a * x i + b * y i - (a + b) * x₀ i := by + rw [hab] + ring + _ = a * (x i - x₀ i) + b * (y i - x₀ i) := by + ring + rw [euclideanSqDist, hsub, euclideanSqDist] + exact vecNormSq_weighted_add_le ha hb hab (x - x₀) (y - x₀) + +/-- Explicit Euclidean closed balls are convex subsets of the project carrier. -/ +theorem convex_euclideanClosedBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : + Convex ℝ (euclideanClosedBall x₀ R) := by + rw [convex_iff_add_mem] + intro x hx y hy a b ha hb hab + change euclideanSqDist (a • x + b • y) x₀ ≤ R ^ 2 + have hconv := euclideanSqDist_weighted_add_le ha hb hab x y x₀ + have hweighted : + a * euclideanSqDist x x₀ + b * euclideanSqDist y x₀ ≤ + a * R ^ 2 + b * R ^ 2 := by + exact add_le_add + (mul_le_mul_of_nonneg_left hx ha) + (mul_le_mul_of_nonneg_left hy hb) + have hright : a * R ^ 2 + b * R ^ 2 = R ^ 2 := by + nlinarith + exact hconv.trans (hweighted.trans_eq hright) + +/-- Explicit Euclidean open balls are convex subsets of the project carrier. -/ +theorem convex_euclideanBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : + Convex ℝ (euclideanBall x₀ R) := by + rw [convex_iff_add_mem] + intro x hx y hy a b ha hb hab + change euclideanSqDist (a • x + b • y) x₀ < R ^ 2 + have hconv := euclideanSqDist_weighted_add_le ha hb hab x y x₀ + by_cases ha_zero : a = 0 + · have hb_one : b = 1 := by nlinarith + calc + euclideanSqDist (a • x + b • y) x₀ + ≤ a * euclideanSqDist x x₀ + b * euclideanSqDist y x₀ := hconv + _ = euclideanSqDist y x₀ := by rw [ha_zero, hb_one]; ring + _ < R ^ 2 := hy + · have ha_pos : 0 < a := lt_of_le_of_ne ha (Ne.symm ha_zero) + have hx_strict : + a * euclideanSqDist x x₀ < a * R ^ 2 := + mul_lt_mul_of_pos_left hx ha_pos + have hy_le : + b * euclideanSqDist y x₀ ≤ b * R ^ 2 := + mul_le_mul_of_nonneg_left (le_of_lt hy) hb + have hweighted : + a * euclideanSqDist x x₀ + b * euclideanSqDist y x₀ < + a * R ^ 2 + b * R ^ 2 := + add_lt_add_of_lt_of_le hx_strict hy_le + have hright : a * R ^ 2 + b * R ^ 2 = R ^ 2 := by + nlinarith + exact hconv.trans_lt (hweighted.trans_eq hright) + +theorem sq_coord_sub_le_euclideanSqDist {d : ℕ} (x y : Vec d) (i : Fin d) : + (x i - y i) ^ 2 ≤ euclideanSqDist x y := by + unfold euclideanSqDist vecNormSq vecDot + let f : Fin d → ℝ := fun j => (x - y) j * (x - y) j + have hsingle : + f i ≤ ∑ j, f j := by + exact Finset.single_le_sum + (fun j _ => by + have hsq : 0 ≤ ((x - y) j) ^ 2 := sq_nonneg ((x - y) j) + simpa [f, pow_two] using hsq) + (Finset.mem_univ i) + simpa [f, Pi.sub_apply, pow_two] using hsingle + +theorem contDiff_vecNormSq {d : ℕ} : + ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => vecNormSq x) := by + unfold vecNormSq vecDot + exact ContDiff.sum (s := Finset.univ) (fun i _hi => + (contDiff_apply ℝ ℝ i).mul (contDiff_apply ℝ ℝ i)) + +theorem contDiff_euclideanSqDist_left {d : ℕ} (x₀ : Vec d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => euclideanSqDist x x₀) := by + unfold euclideanSqDist + exact contDiff_vecNormSq.comp (contDiff_id.sub contDiff_const) + +theorem continuous_euclideanSqDist_left {d : ℕ} (x₀ : Vec d) : + Continuous (fun x : Vec d => euclideanSqDist x x₀) := + (contDiff_euclideanSqDist_left x₀).continuous + +theorem isOpen_euclideanBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : + IsOpen (euclideanBall x₀ R) := by + change IsOpen ((fun x : Vec d => euclideanSqDist x x₀) ⁻¹' Iio (R ^ 2)) + exact isOpen_Iio.preimage (continuous_euclideanSqDist_left x₀) + +theorem isClosed_euclideanClosedBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : + IsClosed (euclideanClosedBall x₀ R) := by + change IsClosed ((fun x : Vec d => euclideanSqDist x x₀) ⁻¹' Iic (R ^ 2)) + exact isClosed_Iic.preimage (continuous_euclideanSqDist_left x₀) + +/-- Explicit Euclidean spheres are closed in the default product topology. -/ +theorem isClosed_euclideanSphere {d : ℕ} (x₀ : Vec d) (R : ℝ) : + IsClosed (euclideanSphere x₀ R) := by + change IsClosed ((fun x : Vec d => euclideanSqDist x x₀) ⁻¹' {R ^ 2}) + exact isClosed_singleton.preimage (continuous_euclideanSqDist_left x₀) + +/-- The explicit sphere is contained in the corresponding explicit closed ball. -/ +theorem euclideanSphere_subset_euclideanClosedBall {d : ℕ} (x₀ : Vec d) (R : ℝ) : + euclideanSphere x₀ R ⊆ euclideanClosedBall x₀ R := by + intro x hx + exact le_of_eq hx + +/-- +The closed Euclidean ball is the disjoint union of its open ball and sphere, +stated as a set-difference identity. +-/ +theorem euclideanClosedBall_diff_euclideanBall_eq_euclideanSphere + {d : ℕ} (x₀ : Vec d) (R : ℝ) : + euclideanClosedBall x₀ R \ euclideanBall x₀ R = euclideanSphere x₀ R := by + ext x + constructor + · rintro ⟨hx_closed, hx_not_open⟩ + exact le_antisymm hx_closed (le_of_not_gt hx_not_open) + · intro hx + refine ⟨le_of_eq hx, ?_⟩ + change ¬ euclideanSqDist x x₀ < R ^ 2 + rw [hx] + exact not_lt_of_ge le_rfl + +/-- The closed Euclidean ball is covered by its open ball and sphere. -/ +theorem euclideanClosedBall_subset_euclideanBall_union_euclideanSphere + {d : ℕ} (x₀ : Vec d) (R : ℝ) : + euclideanClosedBall x₀ R ⊆ euclideanBall x₀ R ∪ euclideanSphere x₀ R := by + intro x hx + by_cases hlt : euclideanSqDist x x₀ < R ^ 2 + · exact Or.inl hlt + · exact Or.inr (le_antisymm hx (le_of_not_gt hlt)) + +/-- A positive-radius explicit Euclidean sphere lies in the frontier of the +corresponding explicit closed ball. -/ +theorem euclideanSphere_subset_frontier_euclideanClosedBall_of_pos + {d : ℕ} (x₀ : Vec d) {R : ℝ} (hR : 0 < R) : + euclideanSphere x₀ R ⊆ frontier (euclideanClosedBall x₀ R) := by + intro y hy + rw [(isClosed_euclideanClosedBall x₀ R).frontier_eq] + refine ⟨le_of_eq hy, ?_⟩ + intro hy_int + rcases Metric.isOpen_iff.1 isOpen_interior y hy_int with ⟨ε, hε, hε_sub⟩ + let δ : ℝ := ε / (4 * R) + let z : Vec d := (1 + δ) • (y - x₀) + x₀ + have hδ_pos : 0 < δ := by + dsimp [δ] + positivity + have hdiff_sq : + euclideanSqDist (y - x₀) (0 : Vec d) = euclideanSqDist y x₀ := by + have htranslate := + euclideanSqDist_add_right (d := d) (y - x₀) (0 : Vec d) x₀ + have hy_eq : (y - x₀) + x₀ = y := by + ext i + simp + simpa [hy_eq] using htranslate.symm + have hz_sq : + euclideanSqDist z x₀ = (1 + δ) ^ 2 * R ^ 2 := by + calc + euclideanSqDist z x₀ = + (1 + δ) ^ 2 * euclideanSqDist (y - x₀) (0 : Vec d) := by + simpa [z] using + euclideanSqDist_affine_center (d := d) x₀ (y - x₀) (1 + δ) + _ = (1 + δ) ^ 2 * R ^ 2 := by + rw [hdiff_sq, hy] + have hz_not_closed : z ∉ euclideanClosedBall x₀ R := by + change ¬ euclideanSqDist z x₀ ≤ R ^ 2 + rw [hz_sq] + have hR_sq_pos : 0 < R ^ 2 := sq_pos_of_pos hR + have hone_lt : 1 < (1 + δ) ^ 2 := by + nlinarith [hδ_pos] + nlinarith + have hz_ball : z ∈ Metric.ball y ε := by + rw [Metric.mem_ball, dist_pi_lt_iff hε] + intro i + have hcoord_sq : (y i - x₀ i) ^ 2 ≤ R ^ 2 := by + rw [← hy] + exact sq_coord_sub_le_euclideanSqDist y x₀ i + have hcoord_abs : |y i - x₀ i| ≤ R := + abs_le_of_sq_le_sq hcoord_sq hR.le + have hδR_lt : δ * R < ε := by + dsimp [δ] + field_simp [hR.ne'] + nlinarith [hε] + have hdist_bound : dist (z i) (y i) ≤ δ * R := by + rw [Real.dist_eq] + have hcoord : + z i - y i = δ * (y i - x₀ i) := by + change ((1 + δ) * (y i - x₀ i) + x₀ i) - y i = + δ * (y i - x₀ i) + ring + rw [hcoord, abs_mul, abs_of_pos hδ_pos] + exact mul_le_mul_of_nonneg_left hcoord_abs hδ_pos.le + exact lt_of_le_of_lt hdist_bound hδR_lt + exact hz_not_closed (interior_subset (hε_sub hz_ball)) + +theorem center_mem_euclideanBall {d : ℕ} (x₀ : Vec d) {R : ℝ} (hR : 0 < R) : + x₀ ∈ euclideanBall x₀ R := by + have hsq : 0 < R ^ 2 := sq_pos_of_pos hR + simpa [euclideanBall] using hsq + +theorem euclideanBall_nonempty {d : ℕ} (x₀ : Vec d) {R : ℝ} (hR : 0 < R) : + (euclideanBall x₀ R).Nonempty := + ⟨x₀, center_mem_euclideanBall x₀ hR⟩ + +theorem euclideanBall_subset_euclideanClosedBall_abs {d : ℕ} (x₀ : Vec d) (R : ℝ) : + euclideanBall x₀ R ⊆ euclideanClosedBall x₀ |R| := by + intro x hx + change euclideanSqDist x x₀ < R ^ 2 at hx + change euclideanSqDist x x₀ ≤ |R| ^ 2 + rw [sq_abs] + exact le_of_lt hx + +theorem euclideanClosedBall_subset_metricClosedBall {d : ℕ} {x₀ : Vec d} {R : ℝ} + (hR : 0 ≤ R) : + euclideanClosedBall x₀ R ⊆ Metric.closedBall x₀ R := by + intro x hx + rw [Metric.mem_closedBall, dist_pi_le_iff hR] + intro i + unfold euclideanClosedBall at hx + have hsqi : (x i - x₀ i) ^ 2 ≤ R ^ 2 := + (sq_coord_sub_le_euclideanSqDist x x₀ i).trans hx + have habs : |x i - x₀ i| ≤ R := + abs_le_of_sq_le_sq hsqi hR + simpa [Real.dist_eq, abs_sub_comm] using habs + +/-- An explicit coordinate-Euclidean open ball is contained in the default +product-metric open ball of the same radius. -/ +theorem euclideanBall_subset_metricBall {d : ℕ} {x₀ : Vec d} {R : ℝ} + (hR : 0 < R) : + euclideanBall x₀ R ⊆ Metric.ball x₀ R := by + intro x hx + rw [Metric.mem_ball, dist_pi_lt_iff hR] + intro i + unfold euclideanBall at hx + have hsqi : (x i - x₀ i) ^ 2 < R ^ 2 := + (sq_coord_sub_le_euclideanSqDist x x₀ i).trans_lt hx + have habs : |x i - x₀ i| < R := + abs_lt_of_sq_lt_sq hsqi hR.le + simpa [Real.dist_eq, abs_sub_comm] using habs + +/-- +A positive explicit Euclidean ball contains a small default-metric closed ball +around its center. The conservative radius avoids needing a sharp comparison +between the product metric and the coordinate Euclidean norm. +-/ +theorem metricClosedBall_div_two_natCast_succ_subset_euclideanBall + {d : ℕ} {x₀ : Vec d} {R : ℝ} (hR : 0 < R) : + Metric.closedBall x₀ (R / (2 * ((d : ℝ) + 1))) ⊆ euclideanBall x₀ R := by + intro x hx + let ρ : ℝ := R / (2 * ((d : ℝ) + 1)) + have hden_pos : 0 < 2 * ((d : ℝ) + 1) := by positivity + have hρ_nonneg : 0 ≤ ρ := by + dsimp [ρ] + positivity + have hcoord : ∀ i : Fin d, |x i - x₀ i| ≤ ρ := by + have hx' : dist x x₀ ≤ ρ := by + simpa [ρ, Metric.mem_closedBall] using hx + rw [dist_pi_le_iff hρ_nonneg] at hx' + intro i + simpa [Real.dist_eq, abs_sub_comm] using hx' i + change euclideanSqDist x x₀ < R ^ 2 + unfold euclideanSqDist vecNormSq vecDot + have hsum_le : + (∑ i : Fin d, (x - x₀) i * (x - x₀) i) ≤ ∑ _i : Fin d, ρ ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hsq_abs : |x i - x₀ i| ^ 2 ≤ ρ ^ 2 := + pow_le_pow_left₀ (abs_nonneg _) (hcoord i) 2 + simpa [pow_two] using hsq_abs + have hsum_const : (∑ _i : Fin d, ρ ^ 2) = (d : ℝ) * ρ ^ 2 := by + simp + have harith : (d : ℝ) * ρ ^ 2 < R ^ 2 := by + have hR_sq_pos : 0 < R ^ 2 := sq_pos_of_pos hR + have hd_nonneg : 0 ≤ (d : ℝ) := by positivity + have hd1_pos : 0 < (d : ℝ) + 1 := by positivity + dsimp [ρ] + field_simp [hden_pos.ne'] + nlinarith [hR_sq_pos, hd_nonneg, sq_nonneg ((d : ℝ) + 1)] + exact lt_of_le_of_lt (hsum_le.trans_eq hsum_const) harith + +theorem isCompact_euclideanClosedBall {d : ℕ} (x₀ : Vec d) {R : ℝ} (hR : 0 ≤ R) : + IsCompact (euclideanClosedBall x₀ R) := + (ProperSpace.isCompact_closedBall x₀ R).of_isClosed_subset + (isClosed_euclideanClosedBall x₀ R) + (euclideanClosedBall_subset_metricClosedBall hR) + +theorem euclideanClosedBall_subset_euclideanBall {d : ℕ} {x₀ : Vec d} {s R : ℝ} + (hs : 0 ≤ s) (hsR : s < R) : + euclideanClosedBall x₀ s ⊆ euclideanBall x₀ R := by + intro x hx + unfold euclideanClosedBall at hx + unfold euclideanBall + have hR : 0 < R := lt_of_le_of_lt hs hsR + have hsq : s ^ 2 < R ^ 2 := by + simpa [pow_two] using mul_self_lt_mul_self hs hsR + exact lt_of_le_of_lt hx hsq + +theorem euclideanBall_subset_euclideanBall {d : ℕ} {x₀ : Vec d} {s R : ℝ} + (hs : 0 ≤ s) (hsR : s < R) : + euclideanBall x₀ s ⊆ euclideanBall x₀ R := by + intro x hx + have hx_closed : x ∈ euclideanClosedBall x₀ s := by + simpa [abs_of_nonneg hs] using euclideanBall_subset_euclideanClosedBall_abs x₀ s hx + exact euclideanClosedBall_subset_euclideanBall hs hsR hx_closed + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/OpenSet.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/OpenSet.lean new file mode 100644 index 0000000000..96d5a4922b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/OpenSet.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Calculus.BumpFunction.FiniteDimension + +/-! # Open Set -/ + +@[expose] public section + +noncomputable section + +open Set Metric TopologicalSpace Function + +open scoped BigOperators ContDiff + +namespace Homogenization + +/-! +# Smooth cutoffs subordinate to an open set + +For a compact set `K` contained in an open set `U` of a finite-dimensional real +normed space, this file constructs a smooth cutoff function that equals one on +`K` and has closed support inside `U`. + +The construction covers `K` by finitely many smooth bump functions supported in +`U` and forms `1 - ∏ (1 - fₓ)`, a smooth partition-of-unity-style envelope. +-/ + +/-- A compact subset of an open set in a finite-dimensional real normed space admits a +smooth cutoff which is one on the compact set and has closed support in the open set. -/ +theorem exists_contDiff_one_on_compact_tsupport_subset + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [FiniteDimensional ℝ E] + {K U : Set E} (hK : IsCompact K) (hKU : K ⊆ U) (hU : IsOpen U) : + ∃ χ : E → ℝ, ContDiff ℝ ∞ χ ∧ + (∀ x, 0 ≤ χ x ∧ χ x ≤ 1) ∧ + EqOn χ 1 K ∧ tsupport χ ⊆ U := by + classical + have hlocal : ∀ x : K, ∃ d : ℝ, 0 < d ∧ Euclidean.closedBall (x : E) d ⊆ U := by + intro x + obtain ⟨d, hd, hdU⟩ := + Euclidean.nhds_basis_closedBall.mem_iff.1 (hU.mem_nhds (hKU x.2)) + exact ⟨d, hd, hdU⟩ + choose d hd_pos hdU using hlocal + let b : (x : K) → ContDiffBump (toEuclidean (x : E)) := fun x => + { rIn := d x / 2 + rOut := d x + rIn_pos := half_pos (hd_pos x) + rIn_lt_rOut := half_lt_self (hd_pos x) } + let f : K → E → ℝ := fun x => b x ∘ toEuclidean + have hf_tsupport : ∀ x : K, tsupport (f x) ⊆ U := by + intro x + have hsupport : (f x).support ⊆ Euclidean.ball (x : E) (d x) := by + intro y hy + have hy' : toEuclidean y ∈ Function.support (b x) := by + simpa only [f, Function.mem_support, Function.comp_apply, Ne] using hy + rwa [ContDiffBump.support_eq] at hy' + have htsupport : tsupport (f x) ⊆ Euclidean.closedBall (x : E) (d x) := by + rw [tsupport, ← Euclidean.closure_ball _ (hd_pos x).ne'] + exact closure_mono hsupport + exact htsupport.trans (hdU x) + have hf_smooth : ∀ x : K, ContDiff ℝ ∞ (f x) := by + intro x + exact (b x).contDiff.comp (ContinuousLinearEquiv.contDiff _) + have hf_bounds : ∀ x : K, ∀ y : E, 0 ≤ f x y ∧ f x y ≤ 1 := by + intro x y + exact ⟨(b x).nonneg, (b x).le_one⟩ + obtain ⟨t, ht⟩ := hK.elim_finite_subcover + (fun x : K => Euclidean.ball (x : E) (d x / 2)) + (fun x => Euclidean.isOpen_ball) + (by + intro x hx + exact mem_iUnion.2 ⟨⟨x, hx⟩, Euclidean.mem_ball_self (half_pos (hd_pos ⟨x, hx⟩))⟩) + let χ : E → ℝ := fun y => 1 - ∏ x ∈ t, (1 - f x y) + refine ⟨χ, ?_, ?_, ?_, ?_⟩ + · exact contDiff_const.sub <| contDiff_prod fun x _ => contDiff_const.sub (hf_smooth x) + · intro y + have hprod_nonneg : 0 ≤ ∏ x ∈ t, (1 - f x y) := + Finset.prod_nonneg fun x _ => sub_nonneg.mpr (hf_bounds x y).2 + have hprod_le_one : (∏ x ∈ t, (1 - f x y)) ≤ 1 := + Finset.prod_le_one₀ + (fun x _ => sub_nonneg.mpr (hf_bounds x y).2) + (fun x _ => by linarith [(hf_bounds x y).1]) + exact ⟨sub_nonneg.mpr hprod_le_one, by linarith⟩ + · intro y hy + rcases mem_iUnion₂.1 (ht hy) with ⟨x, hxt, hyx⟩ + have hfx : f x y = 1 := by + apply (b x).one_of_mem_closedBall + change Euclidean.dist y (x : E) ≤ d x / 2 + exact hyx.le + have hzero : 1 - f x y = 0 := sub_eq_zero.mpr hfx.symm + have hprod_zero : ∏ x ∈ t, (1 - f x y) = 0 := Finset.prod_eq_zero hxt hzero + simp [χ, hprod_zero] + · have hsupport : Function.support χ ⊆ ⋃ x ∈ t, tsupport (f x) := by + intro y hy + by_contra h + have hz : ∀ x ∈ t, f x y = 0 := by + intro x hxt + by_contra hxy + apply h + exact mem_iUnion₂.2 ⟨x, hxt, subset_closure hxy⟩ + have hone : ∀ x ∈ t, 1 - f x y = 1 := by + intro x hxt + rw [hz x hxt, sub_zero] + have hprod_one : ∏ x ∈ t, (1 - f x y) = 1 := by + rw [Finset.prod_eq_one] + intro x hxt + exact hone x hxt + have : χ y = 0 := by simp [χ, hprod_one] + exact hy this + have hclosed : IsClosed (⋃ x ∈ t, tsupport (f x)) := + isClosed_biUnion_finset fun x _ => isClosed_tsupport _ + refine (closure_minimal hsupport hclosed).trans ?_ + intro y hy + rcases mem_iUnion₂.1 hy with ⟨x, hxt, hyx⟩ + exact hf_tsupport x hyx + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Profile.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Profile.lean new file mode 100644 index 0000000000..20172a3e4f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Cutoff/Profile.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.SmoothTransition +public import Mathlib.Analysis.Calculus.ContDiff.FTaylorSeries + +/-! # Profile -/ + +@[expose] public section + +noncomputable section + +open Filter Set +open scoped Topology + +namespace Homogenization + +/-! +# One-dimensional smooth cutoff profiles + +This file isolates the one-dimensional analytic input for quantitative cutoff +constructions. The geometric ball and cube cutoffs should depend only on a +profile carrying explicit first- and second-derivative bounds. +-/ + +/-- A smooth transition profile with certified quantitative first and second +derivative bounds. + +The intended use is: + +* `θ t = 0` for `t ≤ 0`; +* `θ t = 1` for `1 ≤ t`; +* `0 ≤ θ ≤ 1`; +* `‖θ'‖∞ ≤ derivBound`; +* `‖θ''‖∞ ≤ secondDerivBound`. + +Keeping these constants in the profile avoids burying the hard one-dimensional +analysis inside the ball and cube cutoff proofs. -/ +structure QuantitativeTransitionProfile where + toFun : ℝ → ℝ + smooth : ContDiff ℝ (⊤ : ℕ∞) toFun + zero_of_nonpos : ∀ {t : ℝ}, t ≤ 0 → toFun t = 0 + one_of_one_le : ∀ {t : ℝ}, 1 ≤ t → toFun t = 1 + nonneg : ∀ t, 0 ≤ toFun t + le_one : ∀ t, toFun t ≤ 1 + derivBound : ℝ + derivBound_nonneg : 0 ≤ derivBound + norm_deriv_le : ∀ t, ‖deriv toFun t‖ ≤ derivBound + secondDerivBound : ℝ + secondDerivBound_nonneg : 0 ≤ secondDerivBound + norm_secondDeriv_le : ∀ t, ‖deriv (deriv toFun) t‖ ≤ secondDerivBound + +namespace QuantitativeTransitionProfile + +instance : CoeFun QuantitativeTransitionProfile (fun _ => ℝ → ℝ) where + coe θ := θ.toFun + +end QuantitativeTransitionProfile + +/-- The canonical smooth transition supplied by mathlib. This is the natural +explicit formula to analyze: +`exp(-1/t) / (exp(-1/t) + exp(-1/(1-t)))`, with the endpoint extensions from +`Real.expNegInvGlue`. + +The basic shape facts are already in mathlib; the quantitative derivative +bounds are the remaining one-dimensional project. -/ +def smoothTransitionProfile (t : ℝ) : ℝ := + Real.smoothTransition t + +namespace smoothTransitionProfile + +theorem smooth : ContDiff ℝ (⊤ : ℕ∞) smoothTransitionProfile := + Real.smoothTransition.contDiff + +theorem zero_of_nonpos {t : ℝ} (ht : t ≤ 0) : + smoothTransitionProfile t = 0 := + Real.smoothTransition.zero_of_nonpos ht + +theorem one_of_one_le {t : ℝ} (ht : 1 ≤ t) : + smoothTransitionProfile t = 1 := + Real.smoothTransition.one_of_one_le ht + +theorem nonneg (t : ℝ) : 0 ≤ smoothTransitionProfile t := + Real.smoothTransition.nonneg t + +theorem le_one (t : ℝ) : smoothTransitionProfile t ≤ 1 := + Real.smoothTransition.le_one t + +theorem pos_of_pos {t : ℝ} (ht : 0 < t) : + 0 < smoothTransitionProfile t := + Real.smoothTransition.pos_of_pos ht + +theorem differentiable : Differentiable ℝ smoothTransitionProfile := + smooth.differentiable (by simp) + +/-- The derivative of the smooth transition vanishes on the open zero side. -/ +theorem deriv_zero_of_neg {t : ℝ} (ht : t < 0) : + deriv smoothTransitionProfile t = 0 := by + have h : smoothTransitionProfile =ᶠ[𝓝 t] fun _ => (0 : ℝ) := by + filter_upwards [Iio_mem_nhds ht] with y hy + exact zero_of_nonpos hy.le + exact h.deriv_eq.trans (deriv_const t (0 : ℝ)) + +/-- The derivative of the smooth transition vanishes on the open one side. -/ +theorem deriv_zero_of_one_lt {t : ℝ} (ht : 1 < t) : + deriv smoothTransitionProfile t = 0 := by + have h : smoothTransitionProfile =ᶠ[𝓝 t] fun _ => (1 : ℝ) := by + filter_upwards [Ioi_mem_nhds ht] with y hy + exact one_of_one_le hy.le + exact h.deriv_eq.trans (deriv_const t (1 : ℝ)) + +private theorem secondDeriv_zero_of_neg {t : ℝ} (ht : t < 0) : + deriv (deriv smoothTransitionProfile) t = 0 := by + have h : deriv smoothTransitionProfile =ᶠ[𝓝 t] fun _ => (0 : ℝ) := by + filter_upwards [Iio_mem_nhds ht] with y hy + exact deriv_zero_of_neg hy + exact h.deriv_eq.trans (deriv_const t (0 : ℝ)) + +private theorem secondDeriv_zero_of_one_lt {t : ℝ} (ht : 1 < t) : + deriv (deriv smoothTransitionProfile) t = 0 := by + have h : deriv smoothTransitionProfile =ᶠ[𝓝 t] fun _ => (0 : ℝ) := by + filter_upwards [Ioi_mem_nhds ht] with y hy + exact deriv_zero_of_one_lt hy + exact h.deriv_eq.trans (deriv_const t (0 : ℝ)) + +theorem continuous_deriv : Continuous (deriv smoothTransitionProfile) := + (smooth.of_le (by simp)).continuous_deriv_one + +/-- The derivative of the smooth transition vanishes on the closed zero side. + +The endpoint follows from continuity of the derivative and the open-side +identity. -/ +theorem deriv_zero_of_nonpos {t : ℝ} (ht : t ≤ 0) : + deriv smoothTransitionProfile t = 0 := by + rcases lt_or_eq_of_le ht with ht | rfl + · exact deriv_zero_of_neg ht + have hleft_eq : + deriv smoothTransitionProfile =ᶠ[𝓝[<] (0 : ℝ)] fun _ => (0 : ℝ) := by + filter_upwards [self_mem_nhdsWithin] with y hy + exact deriv_zero_of_neg hy + have hleft_tendsto : + Tendsto (deriv smoothTransitionProfile) (𝓝[<] (0 : ℝ)) (𝓝 (0 : ℝ)) := + hleft_eq.tendsto + have hcont_tendsto : + Tendsto (deriv smoothTransitionProfile) (𝓝[<] (0 : ℝ)) + (𝓝 (deriv smoothTransitionProfile (0 : ℝ))) := + continuous_deriv.continuousAt.tendsto.mono_left nhdsWithin_le_nhds + exact (tendsto_nhds_unique hleft_tendsto hcont_tendsto).symm + +/-- The derivative of the smooth transition vanishes on the closed one side. + +The endpoint follows from continuity of the derivative and the open-side +identity. -/ +theorem deriv_zero_of_one_le {t : ℝ} (ht : 1 ≤ t) : + deriv smoothTransitionProfile t = 0 := by + rcases lt_or_eq_of_le ht with ht | rfl + · exact deriv_zero_of_one_lt ht + have hright_eq : + deriv smoothTransitionProfile =ᶠ[𝓝[>] (1 : ℝ)] fun _ => (0 : ℝ) := by + filter_upwards [self_mem_nhdsWithin] with y hy + exact deriv_zero_of_one_lt hy + have hright_tendsto : + Tendsto (deriv smoothTransitionProfile) (𝓝[>] (1 : ℝ)) (𝓝 (0 : ℝ)) := + hright_eq.tendsto + have hcont_tendsto : + Tendsto (deriv smoothTransitionProfile) (𝓝[>] (1 : ℝ)) + (𝓝 (deriv smoothTransitionProfile (1 : ℝ))) := + continuous_deriv.continuousAt.tendsto.mono_left nhdsWithin_le_nhds + exact (tendsto_nhds_unique hright_tendsto hcont_tendsto).symm + +theorem contDiff_deriv : ContDiff ℝ (⊤ : ℕ∞) (deriv smoothTransitionProfile) := by + simpa using + (ContDiff.iterate_deriv (𝕜 := ℝ) (F := ℝ) 1 + (f := smoothTransitionProfile) smooth) + +theorem continuous_secondDeriv : Continuous (deriv (deriv smoothTransitionProfile)) := by + have h : ContDiff ℝ (1 : ℕ∞) (deriv smoothTransitionProfile) := + contDiff_deriv.of_le (by simp) + exact h.continuous_deriv_one + +private theorem exists_deriv_bound : + ∃ C : ℝ, 0 ≤ C ∧ ∀ t : ℝ, ‖deriv smoothTransitionProfile t‖ ≤ C := by + obtain ⟨M, -, hM_max⟩ := (isCompact_Icc (a := (0 : ℝ)) (b := 1)).exists_isMaxOn + (nonempty_Icc.2 zero_le_one) continuous_deriv.norm.continuousOn + refine ⟨‖deriv smoothTransitionProfile M‖, norm_nonneg _, fun t => ?_⟩ + by_cases ht0 : t < 0 + · rw [deriv_zero_of_neg ht0, norm_zero] + exact norm_nonneg _ + · by_cases ht1 : 1 < t + · rw [deriv_zero_of_one_lt ht1, norm_zero] + exact norm_nonneg _ + · push Not at ht0 ht1 + exact Filter.eventually_principal.mp hM_max t (Set.mem_Icc.2 ⟨ht0, ht1⟩) + +private theorem exists_secondDeriv_bound : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ t : ℝ, ‖deriv (deriv smoothTransitionProfile) t‖ ≤ C := by + obtain ⟨M, -, hM_max⟩ := (isCompact_Icc (a := (0 : ℝ)) (b := 1)).exists_isMaxOn + (nonempty_Icc.2 zero_le_one) continuous_secondDeriv.norm.continuousOn + refine ⟨‖deriv (deriv smoothTransitionProfile) M‖, norm_nonneg _, fun t => ?_⟩ + by_cases ht0 : t < 0 + · rw [secondDeriv_zero_of_neg ht0, norm_zero] + exact norm_nonneg _ + · by_cases ht1 : 1 < t + · rw [secondDeriv_zero_of_one_lt ht1, norm_zero] + exact norm_nonneg _ + · push Not at ht0 ht1 + exact Filter.eventually_principal.mp hM_max t (Set.mem_Icc.2 ⟨ht0, ht1⟩) + +/-- Noncomputable global first-derivative bound for `smoothTransitionProfile`. + +This is proved by compactness. It is intentionally separated from the later +project of proving a small explicit numerical bound. -/ +noncomputable def derivBound : ℝ := + Classical.choose (show ∃ C : ℝ, 0 ≤ C ∧ + ∀ t : ℝ, ‖deriv smoothTransitionProfile t‖ ≤ C from by exact exists_deriv_bound) + +theorem derivBound_nonneg : 0 ≤ derivBound := + exists_deriv_bound.choose_spec.1 + +theorem norm_deriv_le (t : ℝ) : + ‖deriv smoothTransitionProfile t‖ ≤ derivBound := + exists_deriv_bound.choose_spec.2 t + +/-- Noncomputable global second-derivative bound for `smoothTransitionProfile`. -/ +noncomputable def secondDerivBound : ℝ := + Classical.choose (show ∃ C : ℝ, 0 ≤ C ∧ + ∀ t : ℝ, ‖deriv (deriv smoothTransitionProfile) t‖ ≤ C from by + exact exists_secondDeriv_bound) + +theorem secondDerivBound_nonneg : 0 ≤ secondDerivBound := + exists_secondDeriv_bound.choose_spec.1 + +theorem norm_secondDeriv_le (t : ℝ) : + ‖deriv (deriv smoothTransitionProfile) t‖ ≤ secondDerivBound := + exists_secondDeriv_bound.choose_spec.2 t + +/-- `Real.smoothTransition` packaged as a quantitative transition profile, with +noncomputable compactness bounds for the first and second derivatives. -/ +def quantitativeProfile : QuantitativeTransitionProfile where + toFun := smoothTransitionProfile + smooth := smooth + zero_of_nonpos := zero_of_nonpos + one_of_one_le := one_of_one_le + nonneg := nonneg + le_one := le_one + derivBound := derivBound + derivBound_nonneg := derivBound_nonneg + norm_deriv_le := norm_deriv_le + secondDerivBound := secondDerivBound + secondDerivBound_nonneg := secondDerivBound_nonneg + norm_secondDeriv_le := norm_secondDeriv_le + +end smoothTransitionProfile + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotient.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotient.lean new file mode 100644 index 0000000000..de6222626b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotient.lean @@ -0,0 +1,974 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.EuclideanL2CZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import Mathlib.Analysis.Convex.Integral +public import Mathlib.Analysis.Convex.Mul +public import Mathlib.MeasureTheory.Integral.IntervalAverage +public import Mathlib.MeasureTheory.Integral.Prod + +/-! # Difference Quotient -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Interval Topology + +noncomputable section + +/-! +# Coordinate difference quotients + +This file starts the difference-quotient API needed for the interior `H2` +regularity proof in the cube Neumann Calderon-Zygmund discharge. The first +slice is intentionally small: coordinate shifts, forward/backward quotients, +and the smooth/support facts that make the eventual difference-quotient tests +admissible. +-/ + +/-- Shift a point by `h` in coordinate direction `i`. -/ +def euclideanCoordShift {d : ℕ} (h : ℝ) (i : Fin d) (x : Vec d) : Vec d := + x + h • basisVec i + +@[simp] theorem euclideanCoordShift_apply {d : ℕ} + (h : ℝ) (i : Fin d) (x : Vec d) : + euclideanCoordShift h i x = x + h • basisVec i := + rfl + +@[simp] theorem euclideanCoordShift_zero {d : ℕ} (i : Fin d) (x : Vec d) : + euclideanCoordShift 0 i x = x := by + simp [euclideanCoordShift] + +@[simp] theorem euclideanCoordShift_zero_step {d : ℕ} (h : ℝ) (i : Fin d) : + euclideanCoordShift h i 0 = h • basisVec i := by + simp [euclideanCoordShift] + +@[simp] theorem euclideanCoordShift_neg_cancel {d : ℕ} + (h : ℝ) (i : Fin d) (x : Vec d) : + euclideanCoordShift (-h) i (euclideanCoordShift h i x) = x := by + ext k + by_cases hk : k = i + · subst hk + simp [euclideanCoordShift, basisVec] + · simp [euclideanCoordShift, basisVec, hk] + +@[simp] theorem euclideanCoordShift_cancel_neg {d : ℕ} + (h : ℝ) (i : Fin d) (x : Vec d) : + euclideanCoordShift h i (euclideanCoordShift (-h) i x) = x := by + simp + +/-- Forward coordinate difference quotient. -/ +def euclideanForwardDifferenceQuotient {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) : Vec d → ℝ := + fun x => (u (euclideanCoordShift h i x) - u x) / h + +/-- Backward coordinate difference quotient. -/ +def euclideanBackwardDifferenceQuotient {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) : Vec d → ℝ := + fun x => (u x - u (euclideanCoordShift (-h) i x)) / h + +@[simp] theorem euclideanForwardDifferenceQuotient_apply {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanForwardDifferenceQuotient h i u x = + (u (euclideanCoordShift h i x) - u x) / h := + rfl + +@[simp] theorem euclideanBackwardDifferenceQuotient_apply {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i u x = + (u x - u (euclideanCoordShift (-h) i x)) / h := + rfl + +/-- Product rule for forward coordinate difference quotients. -/ +theorem euclideanForwardDifferenceQuotient_mul {d : ℕ} + (h : ℝ) (i : Fin d) (u v : Vec d → ℝ) (x : Vec d) : + euclideanForwardDifferenceQuotient h i (fun y => u y * v y) x = + euclideanForwardDifferenceQuotient h i u x * + v (euclideanCoordShift h i x) + + u x * euclideanForwardDifferenceQuotient h i v x := by + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv] + ring + +/-- Product rule for backward coordinate difference quotients. -/ +theorem euclideanBackwardDifferenceQuotient_mul {d : ℕ} + (h : ℝ) (i : Fin d) (u v : Vec d → ℝ) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i (fun y => u y * v y) x = + euclideanBackwardDifferenceQuotient h i u x * v x + + u (euclideanCoordShift (-h) i x) * + euclideanBackwardDifferenceQuotient h i v x := by + simp [euclideanBackwardDifferenceQuotient, div_eq_mul_inv] + ring + +/-- Square rule for forward coordinate difference quotients. -/ +theorem euclideanForwardDifferenceQuotient_sq {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanForwardDifferenceQuotient h i (fun y => u y ^ 2) x = + euclideanForwardDifferenceQuotient h i u x * + (u (euclideanCoordShift h i x) + u x) := by + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv, pow_two] + ring + +/-- Square rule for backward coordinate difference quotients. -/ +theorem euclideanBackwardDifferenceQuotient_sq {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i (fun y => u y ^ 2) x = + euclideanBackwardDifferenceQuotient h i u x * + (u x + u (euclideanCoordShift (-h) i x)) := by + simp [euclideanBackwardDifferenceQuotient, div_eq_mul_inv, pow_two] + ring + +/-- A backward quotient at the forward-shifted point is the corresponding +forward quotient. This is the pointwise algebra behind the future integral +summation-by-parts identity. -/ +theorem euclideanBackwardDifferenceQuotient_coordShift_eq_forward {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i u (euclideanCoordShift h i x) = + euclideanForwardDifferenceQuotient h i u x := by + simp [euclideanBackwardDifferenceQuotient, euclideanForwardDifferenceQuotient] + +/-- A forward quotient at the backward-shifted point is the corresponding +backward quotient. -/ +theorem euclideanForwardDifferenceQuotient_coordShift_neg_eq_backward {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanForwardDifferenceQuotient h i u (euclideanCoordShift (-h) i x) = + euclideanBackwardDifferenceQuotient h i u x := by + simp [euclideanBackwardDifferenceQuotient, euclideanForwardDifferenceQuotient] + +/-- A forward quotient with step `h` is the backward quotient with step `-h`. -/ +theorem euclideanForwardDifferenceQuotient_eq_backwardDifferenceQuotient_neg {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) : + euclideanForwardDifferenceQuotient h i u = + euclideanBackwardDifferenceQuotient (-h) i u := by + funext x + simp [euclideanForwardDifferenceQuotient, euclideanBackwardDifferenceQuotient, + div_eq_mul_inv] + ring + +/-- Backward quotient of the direct difference-quotient test +`η² D_i^+ u`, expanded into its unshifted and shifted pieces. -/ +theorem euclideanBackwardDifferenceQuotient_sq_mul_forwardDifferenceQuotient {d : ℕ} + (h : ℝ) (i : Fin d) (η u : Vec d → ℝ) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i + (fun y => η y ^ 2 * euclideanForwardDifferenceQuotient h i u y) x = + h⁻¹ * + (η x ^ 2 * euclideanForwardDifferenceQuotient h i u x - + η (euclideanCoordShift (-h) i x) ^ 2 * + euclideanBackwardDifferenceQuotient h i u x) := by + rw [euclideanBackwardDifferenceQuotient_apply, + euclideanForwardDifferenceQuotient_coordShift_neg_eq_backward] + simp [div_eq_mul_inv] + ring + +/-- Smooth functions remain smooth after a coordinate shift. -/ +theorem contDiff_comp_euclideanCoordShift {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (h : ℝ) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => u (euclideanCoordShift h i x)) := by + simpa [euclideanCoordShift] using! + hu.comp (contDiff_id.add contDiff_const) + +/-- Compact support is preserved by precomposition with a coordinate shift. -/ +theorem hasCompactSupport_comp_euclideanCoordShift {d : ℕ} + {u : Vec d → ℝ} (hu : HasCompactSupport u) (h : ℝ) (i : Fin d) : + HasCompactSupport (fun x => u (euclideanCoordShift h i x)) := by + show HasCompactSupport (u ∘ Homeomorph.addRight (h • basisVec i)) + simpa [euclideanCoordShift, Function.comp] using + hu.comp_homeomorph (Homeomorph.addRight (h • basisVec i)) + +/-- Forward difference quotients of smooth functions are smooth. -/ +theorem contDiff_euclideanForwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) + (euclideanForwardDifferenceQuotient h i u) := by + have hshift := contDiff_comp_euclideanCoordShift hu h i + change ContDiff ℝ (⊤ : ℕ∞) + (fun x => (u (euclideanCoordShift h i x) - u x) * h⁻¹) + simpa [div_eq_mul_inv] using + (hshift.sub hu).mul contDiff_const + +/-- Backward difference quotients of smooth functions are smooth. -/ +theorem contDiff_euclideanBackwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) + (euclideanBackwardDifferenceQuotient h i u) := by + have hshift := contDiff_comp_euclideanCoordShift hu (-h) i + change ContDiff ℝ (⊤ : ℕ∞) + (fun x => (u x - u (euclideanCoordShift (-h) i x)) * h⁻¹) + simpa [div_eq_mul_inv] using + (hu.sub hshift).mul contDiff_const + +/-- Forward difference quotients of compactly supported functions are compactly +supported. -/ +theorem hasCompactSupport_euclideanForwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : HasCompactSupport u) (h : ℝ) (i : Fin d) : + HasCompactSupport (euclideanForwardDifferenceQuotient h i u) := by + have hshift := hasCompactSupport_comp_euclideanCoordShift hu h i + change HasCompactSupport + (fun x => (u (euclideanCoordShift h i x) - u x) * h⁻¹) + exact (hshift.sub hu).mul_right + +/-- Backward difference quotients of compactly supported functions are compactly +supported. -/ +theorem hasCompactSupport_euclideanBackwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : HasCompactSupport u) (h : ℝ) (i : Fin d) : + HasCompactSupport (euclideanBackwardDifferenceQuotient h i u) := by + have hshift := hasCompactSupport_comp_euclideanCoordShift hu (-h) i + change HasCompactSupport + (fun x => (u x - u (euclideanCoordShift (-h) i x)) * h⁻¹) + exact (hu.sub hshift).mul_right + +/-- Coordinate derivatives commute with precomposition by a coordinate shift. -/ +theorem euclideanCoordDeriv_comp_euclideanCoordShift {d : ℕ} + (h : ℝ) (i j : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanCoordDeriv j (fun y => u (euclideanCoordShift h i y)) x = + euclideanCoordDeriv j u (euclideanCoordShift h i x) := by + unfold euclideanCoordDeriv euclideanCoordShift + simpa using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec j)) + (fderiv_comp_add_right (𝕜 := ℝ) (f := u) (x := x) + (h • basisVec i)) + +/-- Coordinate derivatives distribute over subtraction for smooth functions. -/ +theorem euclideanCoordDeriv_sub {d : ℕ} {u v : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hv : ContDiff ℝ (⊤ : ℕ∞) v) + (i : Fin d) (x : Vec d) : + euclideanCoordDeriv i (fun y => u y - v y) x = + euclideanCoordDeriv i u x - euclideanCoordDeriv i v x := by + unfold euclideanCoordDeriv + change (fderiv ℝ (u - v) x) (basisVec i) = + (fderiv ℝ u x) (basisVec i) - (fderiv ℝ v x) (basisVec i) + rw [fderiv_sub] + · simp + · exact (hu.differentiable (by simp)) x + · exact (hv.differentiable (by simp)) x + +/-- Coordinate derivatives commute with multiplication by a scalar on the +right. -/ +theorem euclideanCoordDeriv_mul_const {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (c : ℝ) (i : Fin d) (x : Vec d) : + euclideanCoordDeriv i (fun y => u y * c) x = + euclideanCoordDeriv i u x * c := by + unfold euclideanCoordDeriv + rw [fderiv_mul_const] + · simp [smul_eq_mul, mul_comm] + · exact (hu.differentiable (by simp)) x + +/-- Coordinate derivatives commute with forward coordinate difference +quotients for smooth functions. -/ +theorem euclideanCoordDeriv_euclideanForwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i j : Fin d) (x : Vec d) : + euclideanCoordDeriv j (euclideanForwardDifferenceQuotient h i u) x = + euclideanForwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + have hshift := contDiff_comp_euclideanCoordShift hu h i + calc + euclideanCoordDeriv j (euclideanForwardDifferenceQuotient h i u) x + = euclideanCoordDeriv j + (fun y : Vec d => (u (euclideanCoordShift h i y) - u y) * h⁻¹) x := by + rfl + _ = (euclideanCoordDeriv j (fun y : Vec d => u (euclideanCoordShift h i y)) x - + euclideanCoordDeriv j u x) * h⁻¹ := by + rw [euclideanCoordDeriv_mul_const (hshift.sub hu)] + rw [euclideanCoordDeriv_sub hshift hu] + _ = euclideanForwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + rw [euclideanCoordDeriv_comp_euclideanCoordShift] + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv] + +/-- Coordinate derivatives commute with backward coordinate difference +quotients for smooth functions. -/ +theorem euclideanCoordDeriv_euclideanBackwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i j : Fin d) (x : Vec d) : + euclideanCoordDeriv j (euclideanBackwardDifferenceQuotient h i u) x = + euclideanBackwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + have hshift := contDiff_comp_euclideanCoordShift hu (-h) i + calc + euclideanCoordDeriv j (euclideanBackwardDifferenceQuotient h i u) x + = euclideanCoordDeriv j + (fun y : Vec d => (u y - u (euclideanCoordShift (-h) i y)) * h⁻¹) x := by + rfl + _ = (euclideanCoordDeriv j u x - + euclideanCoordDeriv j (fun y : Vec d => u (euclideanCoordShift (-h) i y)) x) * + h⁻¹ := by + rw [euclideanCoordDeriv_mul_const (hu.sub hshift)] + rw [euclideanCoordDeriv_sub hu hshift] + _ = euclideanBackwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + rw [euclideanCoordDeriv_comp_euclideanCoordShift] + simp [euclideanBackwardDifferenceQuotient, div_eq_mul_inv] + +/-- Euclidean gradients commute with forward coordinate difference quotients +for smooth functions. -/ +theorem euclideanGradient_euclideanForwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i : Fin d) (x : Vec d) : + euclideanGradient (euclideanForwardDifferenceQuotient h i u) x = + fun j => euclideanForwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + ext j + exact euclideanCoordDeriv_euclideanForwardDifferenceQuotient hu h i j x + +/-- Euclidean gradients commute with backward coordinate difference quotients +for smooth functions. -/ +theorem euclideanGradient_euclideanBackwardDifferenceQuotient {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (h : ℝ) (i : Fin d) (x : Vec d) : + euclideanGradient (euclideanBackwardDifferenceQuotient h i u) x = + fun j => euclideanBackwardDifferenceQuotient h i (euclideanCoordDeriv j u) x := by + ext j + exact euclideanCoordDeriv_euclideanBackwardDifferenceQuotient hu h i j x + +/-- Euclidean gradients commute with precomposition by a coordinate shift. -/ +theorem euclideanGradient_comp_euclideanCoordShift {d : ℕ} + (h : ℝ) (i : Fin d) (u : Vec d → ℝ) (x : Vec d) : + euclideanGradient (fun y => u (euclideanCoordShift h i y)) x = + euclideanGradient u (euclideanCoordShift h i x) := by + ext j + exact euclideanCoordDeriv_comp_euclideanCoordShift h i j u x + +/-- Pointwise FTC formula for a backward coordinate difference quotient of a +smooth function. -/ +theorem euclideanBackwardDifferenceQuotient_eq_integral_coordDeriv_along_segment {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) (x : Vec d) : + euclideanBackwardDifferenceQuotient h i u x = + ∫ t in (0 : ℝ)..1, + euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x)) := by + let y : Vec d := euclideanCoordShift (-h) i x + have hxy : x - y = h • basisVec i := by + ext j + by_cases hji : j = i + · subst hji + simp [y, basisVec] + · simp [y, basisVec, hji] + have hftc := sub_eq_integral_fderiv_along_segment hu x y + have hintegrand : + (fun t : ℝ => (fderiv ℝ u (segmentBlend x t y)) (x - y)) = + fun t : ℝ => + h * euclideanCoordDeriv i u (segmentBlend x t y) := by + funext t + rw [hxy] + simp [euclideanCoordDeriv] + have hscale : + ∫ t in (0 : ℝ)..1, + (fderiv ℝ u (segmentBlend x t y)) (x - y) = + h * ∫ t in (0 : ℝ)..1, euclideanCoordDeriv i u (segmentBlend x t y) := by + rw [hintegrand] + rw [intervalIntegral.integral_const_mul] + calc + euclideanBackwardDifferenceQuotient h i u x = + (u x - u y) / h := by + rfl + _ = (∫ t in (0 : ℝ)..1, + (fderiv ℝ u (segmentBlend x t y)) (x - y)) / h := by + rw [hftc] + _ = (h * ∫ t in (0 : ℝ)..1, + euclideanCoordDeriv i u (segmentBlend x t y)) / h := by + rw [hscale] + _ = ∫ t in (0 : ℝ)..1, + euclideanCoordDeriv i u (segmentBlend x t y) := by + field_simp [hh] + +/-- Pointwise norm bound following from the FTC representation of a backward +coordinate difference quotient. -/ +theorem abs_euclideanBackwardDifferenceQuotient_le_integral_abs_coordDeriv_along_segment + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) (x : Vec d) : + |euclideanBackwardDifferenceQuotient h i u x| ≤ + ∫ t in (0 : ℝ)..1, + |euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))| := by + rw [euclideanBackwardDifferenceQuotient_eq_integral_coordDeriv_along_segment hu hh i x] + simpa [Real.norm_eq_abs] using + (intervalIntegral.norm_integral_le_integral_norm + (a := (0 : ℝ)) (b := 1) + (f := fun t : ℝ => + euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) + zero_le_one) + +/-- Jensen/Cauchy on the unit interval for a continuous real function. -/ +theorem sq_intervalIntegral_abs_le_intervalIntegral_sq_abs_of_continuous + {g : ℝ → ℝ} (hg : Continuous g) : + (∫ t in (0 : ℝ)..1, |g t|) ^ 2 ≤ + ∫ t in (0 : ℝ)..1, |g t| ^ 2 := by + have hconv : ConvexOn ℝ (Set.Ici (0 : ℝ)) fun y : ℝ => y ^ 2 := by + simpa using (convexOn_pow (𝕜 := ℝ) 2) + have hJ : + (⨍ t in Set.Ioc (0 : ℝ) 1, |g t|) ^ 2 ≤ + ⨍ t in Set.Ioc (0 : ℝ) 1, |g t| ^ 2 := by + refine hconv.map_set_average_le + (μ := MeasureTheory.volume) (t := Set.Ioc (0 : ℝ) 1) + (f := fun t : ℝ => |g t|) + (g := fun y : ℝ => y ^ 2) + (by exact (continuous_pow 2).continuousOn) + isClosed_Ici ?h0 ?ht ?hfs ?hfi ?hgi + · simp [Real.volume_Ioc] + · simp [Real.volume_Ioc] + · exact Filter.Eventually.of_forall fun t => abs_nonneg (g t) + · exact hg.abs.integrableOn_Ioc + · simpa [Function.comp_def, Pi.pow_def] using! + ((hg.abs.pow 2).integrableOn_Ioc : + MeasureTheory.IntegrableOn (fun t : ℝ => |g t| ^ 2) + (Set.Ioc (0 : ℝ) 1) MeasureTheory.volume) + have hleft : + (⨍ t in Set.Ioc (0 : ℝ) 1, |g t|) = + ∫ t in (0 : ℝ)..1, |g t| := by + rw [MeasureTheory.setAverage_eq] + simp [intervalIntegral.integral_of_le zero_le_one] + have hright : + (⨍ t in Set.Ioc (0 : ℝ) 1, g t ^ 2) = + ∫ t in (0 : ℝ)..1, g t ^ 2 := by + rw [MeasureTheory.setAverage_eq] + simp [intervalIntegral.integral_of_le zero_le_one] + have htarget : + (∫ t in (0 : ℝ)..1, |g t|) ^ 2 ≤ + ∫ t in (0 : ℝ)..1, g t ^ 2 := by + simpa [hleft, hright] using hJ + simpa [sq_abs] using htarget + +/-- Pointwise squared version of the smooth FTC/Jensen estimate for backward +coordinate difference quotients. -/ +theorem sq_euclideanBackwardDifferenceQuotient_le_integral_sq_coordDeriv_along_segment + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) (x : Vec d) : + (euclideanBackwardDifferenceQuotient h i u x) ^ 2 ≤ + ∫ t in (0 : ℝ)..1, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 := by + let y : Vec d := euclideanCoordShift (-h) i x + let g : ℝ → ℝ := fun t => + euclideanCoordDeriv i u (segmentBlend x t y) + have hderiv_cont : Continuous (euclideanCoordDeriv i u) := by + have h1 : ContDiff ℝ 1 u := hu.of_le (by norm_num) + simpa [euclideanCoordDeriv] using! + (h1.continuous_fderiv (by norm_num)).clm_apply continuous_const + have hsegment_cont : + Continuous (fun t : ℝ => segmentBlend x t y) := by + have hraw : Continuous (fun t : ℝ => y + t • (x - y)) := + continuous_const.add + (continuous_id.smul (continuous_const : Continuous fun _ : ℝ => x - y)) + have hEq : + (fun t : ℝ => segmentBlend x t y) = + fun t : ℝ => y + t • (x - y) := by + funext t + exact segmentBlend_eq_add_smul_sub x y t + rw [hEq] + exact hraw + have hg_cont : Continuous g := hderiv_cont.comp hsegment_cont + have hnorm : + |euclideanBackwardDifferenceQuotient h i u x| ≤ + ∫ t in (0 : ℝ)..1, |g t| := by + simpa [g, y] using + abs_euclideanBackwardDifferenceQuotient_le_integral_abs_coordDeriv_along_segment + hu hh i x + have hnonneg : + 0 ≤ ∫ t in (0 : ℝ)..1, |g t| := + intervalIntegral.integral_nonneg zero_le_one (fun t _ => abs_nonneg (g t)) + have hsq_abs : + |euclideanBackwardDifferenceQuotient h i u x| ^ 2 ≤ + (∫ t in (0 : ℝ)..1, |g t|) ^ 2 := + (sq_le_sq₀ (abs_nonneg _) hnonneg).2 hnorm + have hJ := + sq_intervalIntegral_abs_le_intervalIntegral_sq_abs_of_continuous (g := g) hg_cont + calc + (euclideanBackwardDifferenceQuotient h i u x) ^ 2 = + |euclideanBackwardDifferenceQuotient h i u x| ^ 2 := by + rw [sq_abs] + _ ≤ (∫ t in (0 : ℝ)..1, |g t|) ^ 2 := hsq_abs + _ ≤ ∫ t in (0 : ℝ)..1, |g t| ^ 2 := hJ + _ = ∫ t in (0 : ℝ)..1, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 := by + simp [g, y, sq_abs] + +/-- The segment from `x - h eᵢ` to `x` is just a coordinate shift of `x`. +This is the algebraic step behind collapsing the FTC/Jensen segment average by +translation invariance. -/ +theorem segmentBlend_euclideanCoordShift_neg_eq_euclideanCoordShift + {d : ℕ} (h : ℝ) (i : Fin d) (x : Vec d) (t : ℝ) : + segmentBlend x t (euclideanCoordShift (-h) i x) = + euclideanCoordShift ((t - 1) * h) i x := by + rw [segmentBlend_eq_add_smul_sub] + ext j + by_cases hji : j = i + · subst hji + simp [euclideanCoordShift, basisVec] + ring_nf + · simp [euclideanCoordShift, basisVec, hji] + +/-- Whole-space translation invariance for a coordinate shift. -/ +theorem integral_comp_euclideanCoordShift_eq_integral + {d : ℕ} (h : ℝ) (i : Fin d) (u : Vec d → ℝ) : + ∫ x, u (euclideanCoordShift h i x) ∂MeasureTheory.volume = + ∫ x, u x ∂MeasureTheory.volume := by + let z : Vec d := h • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + have hchange := + hmp.integral_comp (Homeomorph.addRight z).measurableEmbedding u + simpa [euclideanCoordShift, z] using hchange + +/-- Combining the segment algebra with whole-space translation invariance: +integrating along the segment from `x - h eᵢ` to `x`, for fixed `t`, has the +same integral as the unshifted function. -/ +theorem integral_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + {d : ℕ} (h : ℝ) (i : Fin d) (t : ℝ) (u : Vec d → ℝ) : + ∫ x, u (segmentBlend x t (euclideanCoordShift (-h) i x)) ∂MeasureTheory.volume = + ∫ x, u x ∂MeasureTheory.volume := by + calc + ∫ x, u (segmentBlend x t (euclideanCoordShift (-h) i x)) ∂MeasureTheory.volume = + ∫ x, u (euclideanCoordShift ((t - 1) * h) i x) ∂MeasureTheory.volume := by + simp_rw [segmentBlend_euclideanCoordShift_neg_eq_euclideanCoordShift] + _ = ∫ x, u x ∂MeasureTheory.volume := by + exact integral_comp_euclideanCoordShift_eq_integral ((t - 1) * h) i u + +/-- Fixed-time translation collapse for the squared coordinate derivative +appearing in the smooth FTC/Jensen estimate. -/ +theorem integral_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + {d : ℕ} (h : ℝ) (i : Fin d) (t : ℝ) (u : Vec d → ℝ) : + ∫ x, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 + ∂MeasureTheory.volume = + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + simpa using + integral_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + h i t (fun y : Vec d => (euclideanCoordDeriv i u y) ^ 2) + +/-- Product integrability of the smooth segment-square integrand used to swap +the `t` and `x` integrals in the quotient bound. -/ +theorem integrable_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_prod + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hus : HasCompactSupport u) + (h : ℝ) (i : Fin d) : + MeasureTheory.Integrable + (Function.uncurry fun t x => + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)).prod + MeasureTheory.volume) := by + let F : ℝ × Vec d → ℝ := fun p => + (euclideanCoordDeriv i u + (segmentBlend p.2 p.1 (euclideanCoordShift (-h) i p.2))) ^ 2 + have hderiv_cont : Continuous (euclideanCoordDeriv i u) := + (contDiff_euclideanCoordDeriv hu i).continuous + have hseg_cont : + Continuous + (fun p : ℝ × Vec d => + segmentBlend p.2 p.1 (euclideanCoordShift (-h) i p.2)) := by + have hraw : + Continuous + (fun p : ℝ × Vec d => + euclideanCoordShift ((p.1 - 1) * h) i p.2) := by + simpa [euclideanCoordShift] using! + continuous_snd.add + (((continuous_fst.sub continuous_const).mul continuous_const).smul + (continuous_const : Continuous fun _ : ℝ × Vec d => basisVec i)) + have hEq : + (fun p : ℝ × Vec d => + segmentBlend p.2 p.1 (euclideanCoordShift (-h) i p.2)) = + fun p : ℝ × Vec d => + euclideanCoordShift ((p.1 - 1) * h) i p.2 := by + funext p + exact segmentBlend_euclideanCoordShift_neg_eq_euclideanCoordShift h i p.2 p.1 + rw [hEq] + exact hraw + have hF_cont : Continuous F := by + simpa [F] using! (hderiv_cont.comp hseg_cont).pow 2 + have hF_aesm : + MeasureTheory.AEStronglyMeasurable F + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)).prod + MeasureTheory.volume) := + hF_cont.aestronglyMeasurable + have hbase_cont : Continuous (fun x : Vec d => (euclideanCoordDeriv i u x) ^ 2) := + ((contDiff_euclideanCoordDeriv hu i).continuous).pow 2 + have hbase_comp : HasCompactSupport + (fun x : Vec d => (euclideanCoordDeriv i u x) ^ 2) := by + simpa [pow_two] using! + (hasCompactSupport_euclideanCoordDeriv hus i).mul_right + have hsection_int : + ∀ t : ℝ, MeasureTheory.Integrable (fun x : Vec d => F (t, x)) + MeasureTheory.volume := by + intro t + have hshift_cont : + Continuous (fun x : Vec d => euclideanCoordShift ((t - 1) * h) i x) := by + simpa [euclideanCoordShift] using! + continuous_id.add (continuous_const : Continuous fun _ : Vec d => + ((t - 1) * h) • basisVec i) + have hshift_comp : + HasCompactSupport + (fun x : Vec d => + (fun y : Vec d => (euclideanCoordDeriv i u y) ^ 2) + (euclideanCoordShift ((t - 1) * h) i x)) := + hasCompactSupport_comp_euclideanCoordShift hbase_comp ((t - 1) * h) i + have hEq : + (fun x : Vec d => F (t, x)) = + fun x : Vec d => + (euclideanCoordDeriv i u + (euclideanCoordShift ((t - 1) * h) i x)) ^ 2 := by + funext x + dsimp [F] + change + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 = + (euclideanCoordDeriv i u + (euclideanCoordShift ((t - 1) * h) i x)) ^ 2 + rw [segmentBlend_euclideanCoordShift_neg_eq_euclideanCoordShift] + rw [hEq] + exact (hbase_cont.comp hshift_cont).integrable_of_hasCompactSupport hshift_comp + have habs_integral_eq : + (fun t : ℝ => ∫ x, |F (t, x)| ∂MeasureTheory.volume) = + fun _ : ℝ => ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + funext t + have habs_fun : + (fun x : Vec d => |F (t, x)|) = + fun x : Vec d => + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 := by + funext x + dsimp [F] + rw [abs_of_nonneg (sq_nonneg _)] + calc + ∫ x, |F (t, x)| ∂MeasureTheory.volume = + ∫ x, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 + ∂MeasureTheory.volume := by + rw [habs_fun] + _ = ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := + integral_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + h i t u + let : MeasureTheory.IsFiniteMeasure + (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)) := + ⟨by simp⟩ + refine + (MeasureTheory.integrable_prod_iff + (μ := MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)) + (ν := MeasureTheory.volume) + hF_aesm).2 ?_ + constructor + · exact Filter.Eventually.of_forall hsection_int + · have hnorm_to_abs : + (fun t : ℝ => ∫ x, ‖F (t, x)‖ ∂MeasureTheory.volume) = + fun t : ℝ => ∫ x, |F (t, x)| ∂MeasureTheory.volume := by + funext t + simp [Real.norm_eq_abs] + rw [hnorm_to_abs, habs_integral_eq] + exact + (MeasureTheory.integrable_const + (∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume) : + MeasureTheory.Integrable + (fun _ : ℝ => ∫ x, (euclideanCoordDeriv i u x) ^ 2 + ∂MeasureTheory.volume) + (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1))) + +/-- The integrated smooth FTC/Jensen segment term collapses to the unshifted +coordinate-derivative square norm. -/ +theorem integral_intervalIntegral_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hus : HasCompactSupport u) + (h : ℝ) (i : Fin d) : + ∫ x, (∫ t in (0 : ℝ)..1, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2) + ∂MeasureTheory.volume = + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + let G : ℝ → Vec d → ℝ := fun t x => + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 + have hprod : + MeasureTheory.Integrable (Function.uncurry G) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)).prod + MeasureTheory.volume) := by + simpa [G] using + integrable_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_prod + hu hus h i + have hswap : + ∫ x, (∫ t in (0 : ℝ)..1, G t x) ∂MeasureTheory.volume = + ∫ t in (0 : ℝ)..1, ∫ x, G t x ∂MeasureTheory.volume := by + simpa [G, Set.uIoc_of_le zero_le_one] using + (MeasureTheory.intervalIntegral_integral_swap + (μ := MeasureTheory.volume) + (a := (0 : ℝ)) (b := 1) + (f := G) hprod).symm + have hinner : + ∀ t : ℝ, + ∫ x, G t x ∂MeasureTheory.volume = + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + intro t + simpa [G] using + integral_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + h i t u + calc + ∫ x, (∫ t in (0 : ℝ)..1, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2) + ∂MeasureTheory.volume = + ∫ x, (∫ t in (0 : ℝ)..1, G t x) ∂MeasureTheory.volume := by + rfl + _ = ∫ t in (0 : ℝ)..1, ∫ x, G t x ∂MeasureTheory.volume := hswap + _ = ∫ t in (0 : ℝ)..1, + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + simp_rw [hinner] + _ = ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + simp + +/-- Smooth compact-support `L²` control of a backward coordinate difference +quotient by the corresponding coordinate derivative. -/ +theorem integral_sq_euclideanBackwardDifferenceQuotient_le_integral_sq_coordDeriv + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hus : HasCompactSupport u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) : + ∫ x, (euclideanBackwardDifferenceQuotient h i u x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + let G : ℝ → Vec d → ℝ := fun t x => + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2 + have hleft_int : + MeasureTheory.Integrable + (fun x : Vec d => (euclideanBackwardDifferenceQuotient h i u x) ^ 2) + MeasureTheory.volume := by + let q : Vec d → ℝ := euclideanBackwardDifferenceQuotient h i u + have hq_cont : Continuous q := + (contDiff_euclideanBackwardDifferenceQuotient hu h i).continuous + have hq_comp : HasCompactSupport q := + hasCompactSupport_euclideanBackwardDifferenceQuotient hus h i + have hmul_int : + MeasureTheory.Integrable (fun x : Vec d => q x * q x) + MeasureTheory.volume := + (hq_cont.mul hq_cont).integrable_of_hasCompactSupport hq_comp.mul_right + simpa [q, pow_two] using hmul_int + have hprod : + MeasureTheory.Integrable (Function.uncurry G) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)).prod + MeasureTheory.volume) := by + simpa [G] using + integrable_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_prod + hu hus h i + have hright_int : + MeasureTheory.Integrable + (fun x : Vec d => ∫ t in (0 : ℝ)..1, G t x) + MeasureTheory.volume := by + have hset_int : + MeasureTheory.Integrable + (fun x : Vec d => ∫ t, G t x + ∂MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)) + MeasureTheory.volume := + hprod.integral_prod_right + simpa [G, intervalIntegral.integral_of_le zero_le_one, + Set.uIoc_of_le zero_le_one] using hset_int + have hpoint : + (fun x : Vec d => (euclideanBackwardDifferenceQuotient h i u x) ^ 2) ≤ + fun x : Vec d => ∫ t in (0 : ℝ)..1, G t x := by + intro x + simpa [G] using + sq_euclideanBackwardDifferenceQuotient_le_integral_sq_coordDeriv_along_segment + hu hh i x + calc + ∫ x, (euclideanBackwardDifferenceQuotient h i u x) ^ 2 + ∂MeasureTheory.volume ≤ + ∫ x, (∫ t in (0 : ℝ)..1, G t x) ∂MeasureTheory.volume := + MeasureTheory.integral_mono hleft_int hright_int hpoint + _ = ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume := by + change + ∫ x, (∫ t in (0 : ℝ)..1, + (euclideanCoordDeriv i u + (segmentBlend x t (euclideanCoordShift (-h) i x))) ^ 2) + ∂MeasureTheory.volume = + ∫ x, (euclideanCoordDeriv i u x) ^ 2 ∂MeasureTheory.volume + exact + integral_intervalIntegral_sq_coordDeriv_comp_segmentBlend_euclideanCoordShift_neg_eq_integral + hu hus h i + +/-- For real-valued `L²` functions, the square of the `toReal` `eLpNorm` is +the integral of the pointwise square. -/ +theorem toReal_eLpNorm_two_sq_eq_integral_sq + {α : Type*} [MeasurableSpace α] {μ : MeasureTheory.Measure α} + {f : α → ℝ} (hf : MeasureTheory.MemLp f 2 μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, f x ^ 2 ∂μ := by + have hpow : (2 : ℝ≥0∞).toReal = (2 : ℝ) := by + norm_num + have hnorm := + hf.eLpNorm_eq_integral_rpow_norm + (by norm_num : (2 : ℝ≥0∞) ≠ 0) + (by simp : (2 : ℝ≥0∞) ≠ ⊤) + have hsq_norm : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + rw [hnorm, hpow] + have hint_nonneg : + 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => + Real.rpow_nonneg (norm_nonneg _) _) + rw [ENNReal.toReal_ofReal] + · rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num] + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hint_nonneg + · exact Real.rpow_nonneg hint_nonneg _ + calc + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := hsq_norm + _ = ∫ x, f x ^ 2 ∂μ := by + congr 1 with x + rw [Real.rpow_two, Real.norm_eq_abs, sq_abs] + +/-- Smooth compact-support quotient control in `eLpNorm` form. This is the +form used by the `H¹₀` approximation bridge. -/ +theorem eLpNorm_euclideanBackwardDifferenceQuotient_le_eLpNorm_coordDeriv + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hus : HasCompactSupport u) + {h : ℝ} (hh : h ≠ 0) (i : Fin d) : + MeasureTheory.eLpNorm (euclideanBackwardDifferenceQuotient h i u) + 2 MeasureTheory.volume ≤ + MeasureTheory.eLpNorm (euclideanCoordDeriv i u) 2 MeasureTheory.volume := by + have hquot_mem : + MeasureTheory.MemLp (euclideanBackwardDifferenceQuotient h i u) + 2 MeasureTheory.volume := + (contDiff_euclideanBackwardDifferenceQuotient hu h i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanBackwardDifferenceQuotient hus h i) + have hderiv_mem : + MeasureTheory.MemLp (euclideanCoordDeriv i u) 2 MeasureTheory.volume := + (contDiff_euclideanCoordDeriv hu i).continuous.memLp_of_hasCompactSupport + (hasCompactSupport_euclideanCoordDeriv hus i) + have hsq_le : + (ENNReal.toReal + (MeasureTheory.eLpNorm (euclideanBackwardDifferenceQuotient h i u) + 2 MeasureTheory.volume)) ^ 2 ≤ + (ENNReal.toReal + (MeasureTheory.eLpNorm (euclideanCoordDeriv i u) + 2 MeasureTheory.volume)) ^ 2 := by + rw [toReal_eLpNorm_two_sq_eq_integral_sq hquot_mem] + rw [toReal_eLpNorm_two_sq_eq_integral_sq hderiv_mem] + exact integral_sq_euclideanBackwardDifferenceQuotient_le_integral_sq_coordDeriv + hu hus hh i + have htoReal_le : + ENNReal.toReal + (MeasureTheory.eLpNorm (euclideanBackwardDifferenceQuotient h i u) + 2 MeasureTheory.volume) ≤ + ENNReal.toReal + (MeasureTheory.eLpNorm (euclideanCoordDeriv i u) + 2 MeasureTheory.volume) := + (sq_le_sq₀ ENNReal.toReal_nonneg ENNReal.toReal_nonneg).1 hsq_le + exact + (ENNReal.toReal_le_toReal hquot_mem.eLpNorm_ne_top hderiv_mem.eLpNorm_ne_top).1 + htoReal_le + +/-- Whole-space translation change of variables for a coordinate shift. This is +the measure-theoretic core of finite-difference summation by parts. -/ +theorem integral_comp_euclideanCoordShift_mul_eq_integral_mul_comp_euclideanCoordShift_neg + {d : ℕ} (h : ℝ) (i : Fin d) (u v : Vec d → ℝ) : + ∫ x, u (euclideanCoordShift h i x) * v x ∂MeasureTheory.volume = + ∫ x, u x * v (euclideanCoordShift (-h) i x) ∂MeasureTheory.volume := by + let z : Vec d := h • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + have hchange := + hmp.integral_comp (Homeomorph.addRight z).measurableEmbedding + (fun y : Vec d => u y * v (y - z)) + simpa [euclideanCoordShift, z, sub_eq_add_neg, neg_smul] using hchange + +/-- Vector-valued whole-space translation change of variables for coordinate +shifts, paired by `vecDot`. -/ +theorem integral_vecDot_comp_euclideanCoordShift_eq_integral_vecDot_comp_euclideanCoordShift_neg + {d : ℕ} (h : ℝ) (i : Fin d) (F G : Vec d → Vec d) : + ∫ x, vecDot (F (euclideanCoordShift h i x)) (G x) ∂MeasureTheory.volume = + ∫ x, vecDot (F x) (G (euclideanCoordShift (-h) i x)) ∂MeasureTheory.volume := by + let z : Vec d := h • basisVec i + have hmp : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + z) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume z + have hchange := + hmp.integral_comp (Homeomorph.addRight z).measurableEmbedding + (fun y : Vec d => vecDot (F y) (G (y - z))) + simpa [euclideanCoordShift, z, sub_eq_add_neg, neg_smul] using hchange + +/-- Whole-space finite-difference summation by parts. The compact-support +assumption on `u` supplies the integrability needed to expand the two +difference quotients into ordinary Lebesgue integrals. -/ +theorem integral_euclideanForwardDifferenceQuotient_mul_eq_neg_integral_mul_euclideanBackwardDifferenceQuotient + {d : ℕ} {u v : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hv : ContDiff ℝ (⊤ : ℕ∞) v) + (hus : HasCompactSupport u) (h : ℝ) (i : Fin d) : + ∫ x, euclideanForwardDifferenceQuotient h i u x * v x ∂MeasureTheory.volume = + -∫ x, u x * euclideanBackwardDifferenceQuotient h i v x ∂MeasureTheory.volume := by + have hshiftInt : + MeasureTheory.Integrable + (fun x : Vec d => u (euclideanCoordShift h i x) * v x) + MeasureTheory.volume := + integrable_mul_of_contDiff_hasCompactSupport_left + (contDiff_comp_euclideanCoordShift hu h i) hv + (hasCompactSupport_comp_euclideanCoordShift hus h i) + have huvInt : + MeasureTheory.Integrable (fun x : Vec d => u x * v x) + MeasureTheory.volume := + integrable_mul_of_contDiff_hasCompactSupport_left hu hv hus + have hbackShiftInt : + MeasureTheory.Integrable + (fun x : Vec d => u x * v (euclideanCoordShift (-h) i x)) + MeasureTheory.volume := + integrable_mul_of_contDiff_hasCompactSupport_left hu + (contDiff_comp_euclideanCoordShift hv (-h) i) hus + have hchange := + integral_comp_euclideanCoordShift_mul_eq_integral_mul_comp_euclideanCoordShift_neg + h i u v + have hpointLeft : + (fun x : Vec d => euclideanForwardDifferenceQuotient h i u x * v x) = + fun x : Vec d => + (u (euclideanCoordShift h i x) * v x - u x * v x) * h⁻¹ := by + funext x + simp [euclideanForwardDifferenceQuotient, div_eq_mul_inv] + ring + have hpointRight : + (fun x : Vec d => u x * euclideanBackwardDifferenceQuotient h i v x) = + fun x : Vec d => + (u x * v x - u x * v (euclideanCoordShift (-h) i x)) * h⁻¹ := by + funext x + simp [euclideanBackwardDifferenceQuotient, div_eq_mul_inv] + ring + calc + ∫ x, euclideanForwardDifferenceQuotient h i u x * v x ∂MeasureTheory.volume + = ∫ x, (u (euclideanCoordShift h i x) * v x - u x * v x) * h⁻¹ + ∂MeasureTheory.volume := by + rw [hpointLeft] + _ = (∫ x, u (euclideanCoordShift h i x) * v x - u x * v x + ∂MeasureTheory.volume) * h⁻¹ := by + rw [MeasureTheory.integral_mul_const] + _ = ((∫ x, u (euclideanCoordShift h i x) * v x ∂MeasureTheory.volume) - + (∫ x, u x * v x ∂MeasureTheory.volume)) * h⁻¹ := by + rw [MeasureTheory.integral_sub hshiftInt huvInt] + _ = ((∫ x, u x * v (euclideanCoordShift (-h) i x) ∂MeasureTheory.volume) - + (∫ x, u x * v x ∂MeasureTheory.volume)) * h⁻¹ := by + rw [hchange] + _ = -(((∫ x, u x * v x ∂MeasureTheory.volume) - + (∫ x, u x * v (euclideanCoordShift (-h) i x) ∂MeasureTheory.volume)) * h⁻¹) := by + ring + _ = -((∫ x, u x * v x - u x * v (euclideanCoordShift (-h) i x) + ∂MeasureTheory.volume) * h⁻¹) := by + rw [MeasureTheory.integral_sub huvInt hbackShiftInt] + _ = -∫ x, (u x * v x - u x * v (euclideanCoordShift (-h) i x)) * h⁻¹ + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_mul_const] + _ = -∫ x, u x * euclideanBackwardDifferenceQuotient h i v x + ∂MeasureTheory.volume := by + rw [hpointRight] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotientH1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotientH1.lean new file mode 100644 index 0000000000..4467694a6d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/DifferenceQuotientH1.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation + +/-! # Difference Quotient H1 -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace H1Function + +/-! +# H¹ coordinate difference quotients + +This file lifts the scalar coordinate difference-quotient notation to the +project's witness-based `H1Function` API. The quotients are defined only after +restricting to an open set `V` that is contained in the original domain and in +the relevant translated domain. +-/ + +/-- Forward coordinate difference quotient of an `H¹(U)` function, restricted +to an interior open set `V` on which `x + h e_i` still belongs to `U`. -/ +noncomputable def forwardDifferenceQuotientOn {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet ((-h) • basisVec i) U) : + H1Function V := + h⁻¹ • + ((u.translate ((-h) • basisVec i)).restrict hVopen hVshift - + u.restrict hVopen hVU) + +/-- Backward coordinate difference quotient of an `H¹(U)` function, restricted +to an interior open set `V` on which `x - h e_i` still belongs to `U`. -/ +noncomputable def backwardDifferenceQuotientOn {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet (h • basisVec i) U) : + H1Function V := + h⁻¹ • + (u.restrict hVopen hVU - + (u.translate (h • basisVec i)).restrict hVopen hVshift) + +@[simp] theorem forwardDifferenceQuotientOn_toFun {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet ((-h) • basisVec i) U) + (x : Vec d) : + (u.forwardDifferenceQuotientOn h i hVopen hVU hVshift).toFun x = + euclideanForwardDifferenceQuotient h i u.toFun x := by + simp [forwardDifferenceQuotientOn, H1Function.restrict, H1Function.translate, + euclideanForwardDifferenceQuotient, euclideanCoordShift, div_eq_mul_inv, + sub_eq_add_neg, neg_smul] + ring_nf + +@[simp] theorem backwardDifferenceQuotientOn_toFun {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet (h • basisVec i) U) + (x : Vec d) : + (u.backwardDifferenceQuotientOn h i hVopen hVU hVshift).toFun x = + euclideanBackwardDifferenceQuotient h i u.toFun x := by + simp [backwardDifferenceQuotientOn, H1Function.restrict, H1Function.translate, + euclideanBackwardDifferenceQuotient, euclideanCoordShift, div_eq_mul_inv, + sub_eq_add_neg, neg_smul] + ring_nf + +@[simp] theorem forwardDifferenceQuotientOn_grad {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet ((-h) • basisVec i) U) + (x : Vec d) : + (u.forwardDifferenceQuotientOn h i hVopen hVU hVshift).grad x = + h⁻¹ • (u.grad (euclideanCoordShift h i x) - u.grad x) := by + ext k + simp [forwardDifferenceQuotientOn, H1Function.restrict, H1Function.translate, + euclideanCoordShift, sub_eq_add_neg, neg_smul] + ring_nf + +@[simp] theorem backwardDifferenceQuotientOn_grad {d : ℕ} {U V : Set (Vec d)} + (u : H1Function U) (h : ℝ) (i : Fin d) + (hVopen : IsOpen V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet (h • basisVec i) U) + (x : Vec d) : + (u.backwardDifferenceQuotientOn h i hVopen hVU hVshift).grad x = + h⁻¹ • (u.grad x - u.grad (euclideanCoordShift (-h) i x)) := by + ext k + simp [backwardDifferenceQuotientOn, H1Function.restrict, H1Function.translate, + euclideanCoordShift, sub_eq_add_neg, neg_smul] + ring_nf + +/-- Choose an `H¹₀(U)` representative of `φ * u` when `φ` is a smooth compactly +supported cutoff inside a bounded open convex domain. This packages the +existing membership theorem as data, so it can be passed directly to +`WeakPoissonEquationOn.h10`. -/ +noncomputable def mulContDiffHasCompactSupportToH10 {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + H10Function U := + Classical.choose + (memH10_mul_of_contDiff_hasCompactSupport hU hφ hφ_compact hφ_sub u.memH1) + +@[simp] theorem mulContDiffHasCompactSupportToH10_toFun {d : ℕ} + {U : Set (Vec d)} (u : H1Function U) (hU : IsOpenBoundedConvexDomain U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + (u.mulContDiffHasCompactSupportToH10 hU hφ hφ_compact hφ_sub).toH1Function.toFun = + fun x => φ x * u x := + Classical.choose_spec + (memH10_mul_of_contDiff_hasCompactSupport hU hφ hφ_compact hφ_sub u.memH1) + +/-- A smooth cutoff times a forward `H¹` difference quotient, packaged as an +`H¹₀(V)` test. -/ +noncomputable def cutoffForwardDifferenceQuotientToH10 {d : ℕ} + {U V : Set (Vec d)} (u : H1Function U) (h : ℝ) (i : Fin d) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet ((-h) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + H10Function V := + (u.forwardDifferenceQuotientOn h i hV.isOpen hVU hVshift).mulContDiffHasCompactSupportToH10 + hV hφ hφ_compact hφ_sub + +@[simp] theorem cutoffForwardDifferenceQuotientToH10_toFun {d : ℕ} + {U V : Set (Vec d)} (u : H1Function U) (h : ℝ) (i : Fin d) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet ((-h) • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (u.cutoffForwardDifferenceQuotientToH10 h i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.toFun = + fun x => φ x * euclideanForwardDifferenceQuotient h i u.toFun x := by + simp [cutoffForwardDifferenceQuotientToH10] + +/-- A smooth cutoff times a backward `H¹` difference quotient, packaged as an +`H¹₀(V)` test. -/ +noncomputable def cutoffBackwardDifferenceQuotientToH10 {d : ℕ} + {U V : Set (Vec d)} (u : H1Function U) (h : ℝ) (i : Fin d) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet (h • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + H10Function V := + (u.backwardDifferenceQuotientOn h i hV.isOpen hVU hVshift).mulContDiffHasCompactSupportToH10 + hV hφ hφ_compact hφ_sub + +@[simp] theorem cutoffBackwardDifferenceQuotientToH10_toFun {d : ℕ} + {U V : Set (Vec d)} (u : H1Function U) (h : ℝ) (i : Fin d) + (hV : IsOpenBoundedConvexDomain V) (hVU : V ⊆ U) + (hVshift : V ⊆ translateSet (h • basisVec i) U) + {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ V) : + (u.cutoffBackwardDifferenceQuotientToH10 h i hV hVU hVshift + hφ hφ_compact hφ_sub).toH1Function.toFun = + fun x => φ x * euclideanBackwardDifferenceQuotient h i u.toFun x := by + simp [cutoffBackwardDifferenceQuotientToH10] + +end H1Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/EuclideanL2CZ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/EuclideanL2CZ.lean new file mode 100644 index 0000000000..c4e85d2acc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/EuclideanL2CZ.lean @@ -0,0 +1,857 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import Mathlib.Analysis.Calculus.FDeriv.Symmetric + +/-! # Euclidean L2CZ -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal Topology + +/-! +# Euclidean `L²` Calderon-Zygmund helpers + +This file starts the `q = 2` Euclidean Calderon-Zygmund discharge. The main +identity will be the smooth compactly supported integration-by-parts formula +`‖D²u‖₂ = ‖Δu‖₂`; the lemmas below package coordinate derivatives in the +project's `Vec d`/`basisVec` convention and record the support and symmetry +facts needed by the IBP chain. +-/ + +noncomputable section + +/-- Coordinate derivative in the `i`th `basisVec` direction. -/ +def euclideanCoordDeriv {d : ℕ} (i : Fin d) (u : Vec d → ℝ) : Vec d → ℝ := + fun x => fderiv ℝ u x (basisVec i) + +/-- The pointwise support of a coordinate derivative is contained in the +topological support of the original function. -/ +theorem support_euclideanCoordDeriv_subset_tsupport {d : ℕ} + (i : Fin d) (u : Vec d → ℝ) : + Function.support (euclideanCoordDeriv i u) ⊆ tsupport u := by + intro x hx + exact + (support_fderiv_subset (𝕜 := ℝ) (f := u)) <| by + change fderiv ℝ u x ≠ 0 + intro hzero + apply hx + simp [euclideanCoordDeriv, hzero] + +/-- Coordinate differentiation does not enlarge topological support. -/ +theorem tsupport_euclideanCoordDeriv_subset_tsupport {d : ℕ} + (i : Fin d) (u : Vec d → ℝ) : + tsupport (euclideanCoordDeriv i u) ⊆ tsupport u := + closure_minimal + (support_euclideanCoordDeriv_subset_tsupport i u) isClosed_closure + +/-- Euclidean gradient expressed in the project's coordinate-vector convention. -/ +def euclideanGradient {d : ℕ} (u : Vec d → ℝ) : Vec d → Vec d := + fun x i => euclideanCoordDeriv i u x + +/-- Smoothness is preserved by squaring a scalar test function. -/ +theorem contDiff_sq {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) : + ContDiff ℝ (⊤ : ℕ∞) (fun x => u x ^ 2) := by + simpa [pow_two] using hu.mul hu + +/-- Compact support is preserved by squaring a scalar test function. -/ +theorem hasCompactSupport_sq {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) : + HasCompactSupport (fun x => u x ^ 2) := by + simpa [pow_two, Pi.mul_apply] using! (hu.mul_right (f' := u)) + +/-- Squaring a scalar test function does not enlarge topological support. -/ +theorem tsupport_sq_subset {d : ℕ} (u : Vec d → ℝ) : + tsupport (fun x => u x ^ 2) ⊆ tsupport u := by + simpa [pow_two, Pi.mul_apply] using + (tsupport_mul_subset_left (f := u) (g := u)) + +/-- Coordinate derivative of a squared scalar test function. -/ +theorem euclideanCoordDeriv_sq {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i : Fin d) (x : Vec d) : + euclideanCoordDeriv i (fun y => u y ^ 2) x = + 2 * u x * euclideanCoordDeriv i u x := by + unfold euclideanCoordDeriv + have hd : DifferentiableAt ℝ u x := (hu.differentiable (by simp)) x + have hpow := + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) + (fderiv_pow (𝕜 := ℝ) (f := u) (x := x) 2 hd) + simpa [pow_one, two_nsmul, smul_eq_mul, mul_assoc, mul_comm, mul_left_comm] + using! hpow + +/-- Euclidean gradient of a squared scalar test function. -/ +theorem euclideanGradient_sq {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + euclideanGradient (fun y => u y ^ 2) x = + fun i => 2 * u x * euclideanGradient u x i := by + ext i + exact euclideanCoordDeriv_sq hu i x + +/-- A function has zero Euclidean gradient outside its topological support. -/ +theorem euclideanGradient_eq_zero_of_notMem_tsupport {d : ℕ} + {u : Vec d → ℝ} {x : Vec d} (hx : x ∉ tsupport u) : + euclideanGradient u x = 0 := by + ext i + simp [euclideanGradient, euclideanCoordDeriv, + fderiv_of_notMem_tsupport (𝕜 := ℝ) hx] + +/-- Coordinate second derivative, differentiating first in `i` and then in `j`. -/ +def euclideanCoordSecondDeriv {d : ℕ} (i j : Fin d) (u : Vec d → ℝ) : Vec d → ℝ := + fun x => fderiv ℝ (euclideanCoordDeriv i u) x (basisVec j) + +/-- The pointwise support of a coordinate second derivative is contained in +the topological support of the original function. -/ +theorem support_euclideanCoordSecondDeriv_subset_tsupport {d : ℕ} + (i j : Fin d) (u : Vec d → ℝ) : + Function.support (euclideanCoordSecondDeriv i j u) ⊆ tsupport u := by + intro x hx + exact + tsupport_euclideanCoordDeriv_subset_tsupport i u + (support_euclideanCoordDeriv_subset_tsupport j + (euclideanCoordDeriv i u) hx) + +/-- Coordinate second differentiation does not enlarge topological support. -/ +theorem tsupport_euclideanCoordSecondDeriv_subset_tsupport {d : ℕ} + (i j : Fin d) (u : Vec d → ℝ) : + tsupport (euclideanCoordSecondDeriv i j u) ⊆ tsupport u := + closure_minimal + (support_euclideanCoordSecondDeriv_subset_tsupport i j u) isClosed_closure + +/-- Coordinate third derivative, differentiating successively in `i`, `j`, and `k`. -/ +def euclideanCoordThirdDeriv {d : ℕ} (i j k : Fin d) (u : Vec d → ℝ) : + Vec d → ℝ := + fun x => fderiv ℝ (euclideanCoordSecondDeriv i j u) x (basisVec k) + +/-- Coordinate Laplacian, expressed as the trace of coordinate second derivatives. -/ +def euclideanCoordLaplacian {d : ℕ} (u : Vec d → ℝ) : Vec d → ℝ := + fun x => ∑ i : Fin d, euclideanCoordSecondDeriv i i u x + +/-- The pointwise support of the coordinate Laplacian is contained in the +topological support of the original function. -/ +theorem support_euclideanCoordLaplacian_subset_tsupport {d : ℕ} + (u : Vec d → ℝ) : + Function.support (euclideanCoordLaplacian u) ⊆ tsupport u := by + intro x hx + by_contra hxt + have hzero : ∀ i : Fin d, euclideanCoordSecondDeriv i i u x = 0 := by + intro i + by_contra hnonzero + exact hxt (support_euclideanCoordSecondDeriv_subset_tsupport i i u hnonzero) + apply hx + simp [euclideanCoordLaplacian, hzero] + +/-- The coordinate Laplacian does not enlarge topological support. -/ +theorem tsupport_euclideanCoordLaplacian_subset_tsupport {d : ℕ} + (u : Vec d → ℝ) : + tsupport (euclideanCoordLaplacian u) ⊆ tsupport u := + closure_minimal + (support_euclideanCoordLaplacian_subset_tsupport u) isClosed_closure + +theorem contDiff_euclideanCoordDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordDeriv i u) := by + unfold euclideanCoordDeriv + exact (hu.fderiv_right (m := (⊤ : ℕ∞)) (by simp)).clm_apply contDiff_const + +theorem hasCompactSupport_euclideanCoordDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) (i : Fin d) : + HasCompactSupport (euclideanCoordDeriv i u) := by + unfold euclideanCoordDeriv + exact hu.fderiv_apply (𝕜 := ℝ) (basisVec i) + +/-- The squared Euclidean gradient norm of a smooth scalar test is continuous. -/ +theorem continuous_vecNormSq_euclideanGradient_of_contDiff + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) : + Continuous (fun x => vecNormSq (euclideanGradient u x)) := by + unfold vecNormSq vecDot euclideanGradient + exact continuous_finsetSum Finset.univ fun i _ => + ((contDiff_euclideanCoordDeriv hu i).continuous).mul + ((contDiff_euclideanCoordDeriv hu i).continuous) + +/-- The squared Euclidean gradient norm of a compactly supported scalar test +is compactly supported. -/ +theorem hasCompactSupport_vecNormSq_euclideanGradient + {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) : + HasCompactSupport (fun x => vecNormSq (euclideanGradient u x)) := by + unfold vecNormSq vecDot euclideanGradient + let F : Fin d → Vec d → ℝ := + fun i x => euclideanCoordDeriv i u x * euclideanCoordDeriv i u x + have hF : ∀ i : Fin d, HasCompactSupport (F i) := by + intro i + exact (hasCompactSupport_euclideanCoordDeriv hu i).mul_right + have hsum : + ∀ s : Finset (Fin d), + HasCompactSupport (fun x => s.sum fun i => F i x) := by + intro s + induction s using Finset.induction_on with + | empty => + simpa [F] using! + (HasCompactSupport.zero : HasCompactSupport (0 : Vec d → ℝ)) + | insert a s has ih => + simpa [Finset.sum_insert has, F] using! (hF a).add ih + simpa [F] using hsum Finset.univ + +theorem contDiff_euclideanCoordSecondDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordSecondDeriv i j u) := by + unfold euclideanCoordSecondDeriv + exact contDiff_euclideanCoordDeriv (contDiff_euclideanCoordDeriv hu i) j + +theorem hasCompactSupport_euclideanCoordSecondDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) (i j : Fin d) : + HasCompactSupport (euclideanCoordSecondDeriv i j u) := by + unfold euclideanCoordSecondDeriv + exact hasCompactSupport_euclideanCoordDeriv + (hasCompactSupport_euclideanCoordDeriv hu i) j + +theorem contDiff_euclideanCoordLaplacian {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) : + ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordLaplacian u) := by + unfold euclideanCoordLaplacian + exact ContDiff.sum fun i _ => contDiff_euclideanCoordSecondDeriv hu i i + +theorem hasCompactSupport_euclideanCoordLaplacian {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) : + HasCompactSupport (euclideanCoordLaplacian u) := by + classical + unfold euclideanCoordLaplacian + let f : Fin d → Vec d → ℝ := fun i x => euclideanCoordSecondDeriv i i u x + have hs : + ∀ s : Finset (Fin d), + HasCompactSupport (fun x => s.sum fun i => f i x) := by + intro s + induction s using Finset.induction_on with + | empty => + simpa [f] using! + (HasCompactSupport.zero : HasCompactSupport (0 : Vec d → ℝ)) + | insert a s has ih => + have ha : HasCompactSupport (f a) := by + simpa [f] using hasCompactSupport_euclideanCoordSecondDeriv hu a a + simpa [Finset.sum_insert has, f] using! ha.add ih + simpa [f] using hs Finset.univ + +theorem euclideanCoordSecondDeriv_eq_fderiv_fderiv {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv i j u x = + fderiv ℝ (fderiv ℝ u) x (basisVec j) (basisVec i) := by + unfold euclideanCoordSecondDeriv euclideanCoordDeriv + have hfd : DifferentiableAt ℝ (fderiv ℝ u) x := by + exact + ((hu.fderiv_right (m := 1) + (by + exact WithTop.coe_le_coe.2 + (show ((1 : ℕ∞) + 1) ≤ ⊤ from le_top))).differentiable + (by norm_num)) x + rw [fderiv_clm_apply] + · simp + · exact hfd + · exact differentiableAt_const _ + +theorem euclideanCoordSecondDeriv_comm {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j : Fin d) (x : Vec d) : + euclideanCoordSecondDeriv i j u x = + euclideanCoordSecondDeriv j i u x := by + rw [euclideanCoordSecondDeriv_eq_fderiv_fderiv hu i j x, + euclideanCoordSecondDeriv_eq_fderiv_fderiv hu j i x] + exact (ContDiffAt.isSymmSndFDerivAt (hu.contDiffAt) + (by + rw [minSmoothness_of_isRCLikeNormedField] + exact WithTop.coe_le_coe.2 (show (2 : ℕ∞) ≤ ⊤ from le_top))).eq + (basisVec j) (basisVec i) + +theorem euclideanCoordSecondDeriv_comm_fun {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j : Fin d) : + euclideanCoordSecondDeriv i j u = euclideanCoordSecondDeriv j i u := by + funext x + exact euclideanCoordSecondDeriv_comm hu i j x + +theorem contDiff_euclideanCoordThirdDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j k : Fin d) : + ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordThirdDeriv i j k u) := by + unfold euclideanCoordThirdDeriv + exact contDiff_euclideanCoordDeriv + (contDiff_euclideanCoordSecondDeriv hu i j) k + +theorem hasCompactSupport_euclideanCoordThirdDeriv {d : ℕ} {u : Vec d → ℝ} + (hu : HasCompactSupport u) (i j k : Fin d) : + HasCompactSupport (euclideanCoordThirdDeriv i j k u) := by + unfold euclideanCoordThirdDeriv + exact hasCompactSupport_euclideanCoordDeriv + (hasCompactSupport_euclideanCoordSecondDeriv hu i j) k + +/-- A smooth compactly supported scalar test has an `L²` Euclidean gradient on +any measurable restriction. -/ +theorem memVectorL2_euclideanGradient_of_contDiff_hasCompactSupport + {d : ℕ} {U : Set (Vec d)} {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφs : HasCompactSupport φ) : + MemVectorL2 U (euclideanGradient φ) := by + refine MeasureTheory.MemLp.of_eval ?_ + intro i + have hcoord_cont : Continuous (fun x => euclideanGradient φ x i) := by + simpa [euclideanGradient] using + (contDiff_euclideanCoordDeriv hφ i).continuous + have hcoord_supp : + HasCompactSupport (fun x => euclideanGradient φ x i) := by + simpa [euclideanGradient] using hasCompactSupport_euclideanCoordDeriv hφs i + simpa [MemScalarL2, MemVectorL2, volumeMeasureOn] using + (hcoord_cont.memLp_of_hasCompactSupport hcoord_supp).restrict U + +theorem euclideanCoordThirdDeriv_diag_right_comm {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (i j : Fin d) (x : Vec d) : + euclideanCoordThirdDeriv i j j u x = + euclideanCoordThirdDeriv j j i u x := by + unfold euclideanCoordThirdDeriv + have hcomm : euclideanCoordSecondDeriv i j u = euclideanCoordSecondDeriv j i u := + euclideanCoordSecondDeriv_comm_fun hu i j + rw [hcomm] + change euclideanCoordSecondDeriv i j (euclideanCoordDeriv j u) x = + euclideanCoordSecondDeriv j i (euclideanCoordDeriv j u) x + exact euclideanCoordSecondDeriv_comm (contDiff_euclideanCoordDeriv hu j) i j x + +theorem integrable_mul_of_contDiff_hasCompactSupport_left {d : ℕ} {f g : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hg : ContDiff ℝ (⊤ : ℕ∞) g) (hfs : HasCompactSupport f) : + Integrable (fun x : Vec d => f x * g x) := by + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + have hg_cont : Continuous g := (hg.differentiable (by simp)).continuous + exact ((hf_cont.mul hg_cont).integrable_of_hasCompactSupport hfs.mul_right) + +theorem integrable_mul_of_contDiff_hasCompactSupport_right {d : ℕ} {f g : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hg : ContDiff ℝ (⊤ : ℕ∞) g) (hgs : HasCompactSupport g) : + Integrable (fun x : Vec d => f x * g x) := by + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + have hg_cont : Continuous g := (hg.differentiable (by simp)).continuous + exact ((hf_cont.mul hg_cont).integrable_of_hasCompactSupport hgs.mul_left) + +theorem integral_mul_euclideanCoordDeriv_eq_neg_integral_euclideanCoordDeriv_mul + {d : ℕ} {f g : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hg : ContDiff ℝ (⊤ : ℕ∞) g) (hfs : HasCompactSupport f) + (i : Fin d) : + ∫ x, f x * euclideanCoordDeriv i g x ∂volume = + - ∫ x, euclideanCoordDeriv i f x * g x ∂volume := by + have hf_diff : Differentiable ℝ f := hf.differentiable (by simp) + have hg_diff : Differentiable ℝ g := hg.differentiable (by simp) + have hfderiv_g : Integrable (fun x : Vec d => euclideanCoordDeriv i f x * g x) := + integrable_mul_of_contDiff_hasCompactSupport_left + (contDiff_euclideanCoordDeriv hf i) hg + (hasCompactSupport_euclideanCoordDeriv hfs i) + have hf_gderiv : Integrable (fun x : Vec d => f x * euclideanCoordDeriv i g x) := + integrable_mul_of_contDiff_hasCompactSupport_left hf + (contDiff_euclideanCoordDeriv hg i) hfs + have hfg : Integrable (fun x : Vec d => f x * g x) := + integrable_mul_of_contDiff_hasCompactSupport_left hf hg hfs + simpa [euclideanCoordDeriv] using + (integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + (μ := volume) (v := basisVec i) + hfderiv_g hf_gderiv hfg + (fun x _ => hf_diff.differentiableAt) (fun x _ => hg_diff.differentiableAt)) + +/-- Smooth compactly supported weak-solution test by `-Δu`. + +For a compactly supported smooth scalar `u`, the weak pairing of `∇u` against +`∇(-Δu)` is exactly the `L²` norm of the coordinate Laplacian. This is the +integration-by-parts bridge used after the reflected weak equation supplies the +test `-Δu`. -/ +theorem integral_vecDot_euclideanGradient_euclideanGradient_neg_laplacian_eq_laplacian_sq + {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) : + ∫ x, vecDot (euclideanGradient u x) + (euclideanGradient (fun y => -euclideanCoordLaplacian u y) x) ∂volume = + ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + let L : Vec d → ℝ := euclideanCoordLaplacian u + have hL : ContDiff ℝ (⊤ : ℕ∞) L := contDiff_euclideanCoordLaplacian hu + have hcomp : + ∀ i : Fin d, + ∫ x, euclideanCoordDeriv i u x * + euclideanCoordDeriv i (fun y => -L y) x ∂volume = + ∫ x, euclideanCoordSecondDeriv i i u x * L x ∂volume := by + intro i + have h := + integral_mul_euclideanCoordDeriv_eq_neg_integral_euclideanCoordDeriv_mul + (f := euclideanCoordDeriv i u) (g := fun y => -L y) + (contDiff_euclideanCoordDeriv hu i) hL.neg + (hasCompactSupport_euclideanCoordDeriv hu_supp i) i + simpa [L, euclideanCoordSecondDeriv, integral_neg] using! h + have hleftInt : + ∀ i : Fin d, + Integrable + (fun x : Vec d => + euclideanCoordDeriv i u x * + euclideanCoordDeriv i (fun y => -L y) x) volume := by + intro i + exact integrable_mul_of_contDiff_hasCompactSupport_left + (contDiff_euclideanCoordDeriv hu i) + (contDiff_euclideanCoordDeriv hL.neg i) + (hasCompactSupport_euclideanCoordDeriv hu_supp i) + have hrightInt : + ∀ i : Fin d, + Integrable + (fun x : Vec d => euclideanCoordSecondDeriv i i u x * L x) volume := by + intro i + exact integrable_mul_of_contDiff_hasCompactSupport_left + (contDiff_euclideanCoordSecondDeriv hu i i) hL + (hasCompactSupport_euclideanCoordSecondDeriv hu_supp i i) + calc + ∫ x, vecDot (euclideanGradient u x) + (euclideanGradient (fun y => -euclideanCoordLaplacian u y) x) ∂volume + = ∫ x, ∑ i : Fin d, euclideanCoordDeriv i u x * + euclideanCoordDeriv i (fun y => -L y) x ∂volume := by + simp [vecDot, euclideanGradient, L] + _ = ∑ i : Fin d, + ∫ x, euclideanCoordDeriv i u x * + euclideanCoordDeriv i (fun y => -L y) x ∂volume := by + exact integral_finsetSum Finset.univ (fun i _ => hleftInt i) + _ = ∑ i : Fin d, + ∫ x, euclideanCoordSecondDeriv i i u x * L x ∂volume := by + apply Finset.sum_congr rfl + intro i _hi + exact hcomp i + _ = ∫ x, ∑ i : Fin d, euclideanCoordSecondDeriv i i u x * L x ∂volume := by + exact (integral_finsetSum Finset.univ (fun i _ => hrightInt i)).symm + _ = ∫ x, (L x) ^ 2 ∂volume := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + simp [L, euclideanCoordLaplacian, pow_two, Finset.sum_mul] + _ = ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + rfl + +/-- Fixed-component `L²` Hessian identity on `ℝ^d` for smooth compact support. + +This is the componentwise integration-by-parts brick behind the `q = 2` +Calderon-Zygmund identity: the square of the mixed second derivative equals, +after integration, the product of the two matching pure second derivatives. -/ +theorem integral_euclideanCoordSecondDeriv_sq_eq_integral_diag_mul_diag {d : ℕ} + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (i j : Fin d) : + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume = + ∫ x, euclideanCoordSecondDeriv i i u x * + euclideanCoordSecondDeriv j j u x ∂volume := by + have h1 : + ∫ x, euclideanCoordSecondDeriv i j u x * + euclideanCoordSecondDeriv i j u x ∂volume = + - ∫ x, euclideanCoordThirdDeriv i j j u x * + euclideanCoordDeriv i u x ∂volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordThirdDeriv] using! + (integral_mul_euclideanCoordDeriv_eq_neg_integral_euclideanCoordDeriv_mul + (f := euclideanCoordSecondDeriv i j u) (g := euclideanCoordDeriv i u) + (contDiff_euclideanCoordSecondDeriv hu i j) + (contDiff_euclideanCoordDeriv hu i) + (hasCompactSupport_euclideanCoordSecondDeriv hu_supp i j) j) + have h2 : + ∫ x, euclideanCoordSecondDeriv j j u x * + euclideanCoordSecondDeriv i i u x ∂volume = + - ∫ x, euclideanCoordThirdDeriv j j i u x * + euclideanCoordDeriv i u x ∂volume := by + simpa [euclideanCoordSecondDeriv, euclideanCoordThirdDeriv] using! + (integral_mul_euclideanCoordDeriv_eq_neg_integral_euclideanCoordDeriv_mul + (f := euclideanCoordSecondDeriv j j u) (g := euclideanCoordDeriv i u) + (contDiff_euclideanCoordSecondDeriv hu j j) + (contDiff_euclideanCoordDeriv hu i) + (hasCompactSupport_euclideanCoordSecondDeriv hu_supp j j) i) + calc + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume + = ∫ x, euclideanCoordSecondDeriv i j u x * + euclideanCoordSecondDeriv i j u x ∂volume := by + simp [pow_two] + _ = - ∫ x, euclideanCoordThirdDeriv i j j u x * + euclideanCoordDeriv i u x ∂volume := h1 + _ = - ∫ x, euclideanCoordThirdDeriv j j i u x * + euclideanCoordDeriv i u x ∂volume := by + congr 1 + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + change euclideanCoordThirdDeriv i j j u x * euclideanCoordDeriv i u x = + euclideanCoordThirdDeriv j j i u x * euclideanCoordDeriv i u x + rw [euclideanCoordThirdDeriv_diag_right_comm hu i j x] + _ = ∫ x, euclideanCoordSecondDeriv j j u x * + euclideanCoordSecondDeriv i i u x ∂volume := by + rw [← h2] + _ = ∫ x, euclideanCoordSecondDeriv i i u x * + euclideanCoordSecondDeriv j j u x ∂volume := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by ring + +/-- Smooth compactly supported Euclidean `L²` Calderon-Zygmund identity in +coordinate form. + +The sum of squared coordinate Hessian components has the same integral as the +square of the coordinate Laplacian. This is the `q = 2` replacement for the +Euclidean Calderon-Zygmund citation. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_euclideanCoordLaplacian_sq + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hu_supp : HasCompactSupport u) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) = + ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + let f : Fin d → Fin d → Vec d → ℝ := + fun i j x => euclideanCoordSecondDeriv i i u x * + euclideanCoordSecondDeriv j j u x + have hdiag_int : ∀ i j : Fin d, Integrable (f i j) := by + intro i j + exact integrable_mul_of_contDiff_hasCompactSupport_left + (contDiff_euclideanCoordSecondDeriv hu i i) + (contDiff_euclideanCoordSecondDeriv hu j j) + (hasCompactSupport_euclideanCoordSecondDeriv hu_supp i i) + have hsum_int : ∀ i : Fin d, Integrable (fun x : Vec d => ∑ j : Fin d, f i j x) := by + intro i + exact integrable_finsetSum Finset.univ (fun j _ => hdiag_int i j) + calc + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) + = ∑ i : Fin d, ∑ j : Fin d, ∫ x, f i j x ∂volume := by + apply Finset.sum_congr rfl + intro i _hi + apply Finset.sum_congr rfl + intro j _hj + exact integral_euclideanCoordSecondDeriv_sq_eq_integral_diag_mul_diag + hu hu_supp i j + _ = ∑ i : Fin d, ∫ x, ∑ j : Fin d, f i j x ∂volume := by + apply Finset.sum_congr rfl + intro i _hi + exact (integral_finsetSum Finset.univ + (f := fun j x => f i j x) (fun j _ => hdiag_int i j)).symm + _ = ∫ x, ∑ i : Fin d, ∑ j : Fin d, f i j x ∂volume := by + exact (integral_finsetSum Finset.univ + (f := fun i x => ∑ j : Fin d, f i j x) (fun i _ => hsum_int i)).symm + _ = ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + symm + simp [euclideanCoordLaplacian, f, pow_two, Finset.sum_mul_sum] + +/-- Smooth compactly supported weak Euclidean CZ identity. + +If a smooth compactly supported `u` satisfies the weak equation +`∫ ∇u · ∇φ = ∫ f φ` against all compactly supported smooth tests, then the +coordinate Hessian energy is obtained by testing with `φ = -Δu`. This isolates +the analytic bridge still needed for nonsmooth reflected Neumann solutions: +density/mollification must produce this smooth weak-equation situation. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_forcing_mul_neg_laplacian + {d : ℕ} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) = + ∫ x, f x * (-euclideanCoordLaplacian u x) ∂volume := by + have hL : ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordLaplacian u) := + contDiff_euclideanCoordLaplacian hu + have hLs : HasCompactSupport (euclideanCoordLaplacian u) := + hasCompactSupport_euclideanCoordLaplacian hu_supp + calc + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) + = ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + exact + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_euclideanCoordLaplacian_sq + hu hu_supp + _ = ∫ x, vecDot (euclideanGradient u x) + (euclideanGradient (fun y => -euclideanCoordLaplacian u y) x) ∂volume := by + exact + (integral_vecDot_euclideanGradient_euclideanGradient_neg_laplacian_eq_laplacian_sq + hu hu_supp).symm + _ = ∫ x, f x * (-euclideanCoordLaplacian u x) ∂volume := by + simpa using + hweak (fun y => -euclideanCoordLaplacian u y) hL.neg hLs.neg + +/-- Local-support variant of the smooth weak Euclidean CZ identity. + +It is enough for the weak equation to hold against tests supported in `U`, +provided the potential itself has topological support in `U`; the test +`-Δu` is then still supported in `U`. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_forcing_mul_neg_laplacian_of_tsupport_subset + {d : ℕ} {U : Set (Vec d)} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ U) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) = + ∫ x, f x * (-euclideanCoordLaplacian u x) ∂volume := by + have hL : ContDiff ℝ (⊤ : ℕ∞) (euclideanCoordLaplacian u) := + contDiff_euclideanCoordLaplacian hu + have hLs : HasCompactSupport (euclideanCoordLaplacian u) := + hasCompactSupport_euclideanCoordLaplacian hu_supp + have hL_sub : + tsupport (fun y => -euclideanCoordLaplacian u y) ⊆ U := by + change tsupport (-(euclideanCoordLaplacian u)) ⊆ U + rw [tsupport_neg] + exact (tsupport_euclideanCoordLaplacian_subset_tsupport u).trans hu_sub + calc + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) + = ∫ x, (euclideanCoordLaplacian u x) ^ 2 ∂volume := by + exact + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_euclideanCoordLaplacian_sq + hu hu_supp + _ = ∫ x, vecDot (euclideanGradient u x) + (euclideanGradient (fun y => -euclideanCoordLaplacian u y) x) ∂volume := by + exact + (integral_vecDot_euclideanGradient_euclideanGradient_neg_laplacian_eq_laplacian_sq + hu hu_supp).symm + _ = ∫ x, f x * (-euclideanCoordLaplacian u x) ∂volume := by + simpa using + hweak (fun y => -euclideanCoordLaplacian u y) hL.neg hLs.neg hL_sub + +/-- Smooth compactly supported Euclidean CZ estimate in Cauchy-Schwarz form. + +This is the estimate produced by the weak `-Δu` test before cancelling the +common Laplacian factor. It is the most stable form for the later +density/reflection bridge, because it separates the weak-equation step from the +final square-root algebra. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_mul_laplacian_l2 + {d : ℕ} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) volume) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) ≤ + (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) ∂volume) ^ + (1 / (2 : ℝ)) := by + let L : Vec d → ℝ := euclideanCoordLaplacian u + have hLcont : Continuous L := (contDiff_euclideanCoordLaplacian hu).continuous + have hLs : HasCompactSupport L := hasCompactSupport_euclideanCoordLaplacian hu_supp + have hf_ofReal : MeasureTheory.MemLp f (ENNReal.ofReal (2 : ℝ)) volume := by + simpa using hf + have hLmem : MeasureTheory.MemLp L (2 : ℝ≥0∞) volume := by + simpa [L] using hLcont.memLp_of_hasCompactSupport hLs + have hLmem_ofReal : MeasureTheory.MemLp L (ENNReal.ofReal (2 : ℝ)) volume := by + simpa using hLmem + have hcz_eq : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) = + ∫ x, f x * (-L x) ∂volume := by + simpa [L] using + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_forcing_mul_neg_laplacian + hu hu_supp hweak + have habs : + ∫ x, f x * (-L x) ∂volume ≤ + ∫ x, ‖f x‖ * ‖L x‖ ∂volume := by + calc + ∫ x, f x * (-L x) ∂volume + ≤ |∫ x, f x * (-L x) ∂volume| := le_abs_self _ + _ ≤ ∫ x, ‖f x * (-L x)‖ ∂volume := by + exact norm_integral_le_integral_norm (fun x => f x * (-L x)) + _ = ∫ x, ‖f x‖ * ‖L x‖ ∂volume := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + simp + have hholder : + ∫ x, ‖f x‖ * ‖L x‖ ∂volume ≤ + (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖L x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) := by + exact MeasureTheory.integral_mul_norm_le_Lp_mul_Lq + (μ := volume) (f := f) (g := L) + Real.HolderConjugate.two_two hf_ofReal hLmem_ofReal + calc + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) + = ∫ x, f x * (-L x) ∂volume := hcz_eq + _ ≤ ∫ x, ‖f x‖ * ‖L x‖ ∂volume := habs + _ ≤ (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) ∂volume) ^ + (1 / (2 : ℝ)) := by + simpa [L] using hholder + +private theorem le_of_le_sqrt_mul_sqrt_self {A H : ℝ} + (hA : 0 ≤ A) (hH : 0 ≤ H) + (h : H ≤ Real.sqrt A * Real.sqrt H) : + H ≤ A := by + by_cases hzero : H = 0 + · simpa [hzero] using hA + have hpos : 0 < H := lt_of_le_of_ne hH (Ne.symm hzero) + have hsquare : + H * H ≤ (Real.sqrt A * Real.sqrt H) * (Real.sqrt A * Real.sqrt H) := + mul_self_le_mul_self hH h + have hrhs : + (Real.sqrt A * Real.sqrt H) * (Real.sqrt A * Real.sqrt H) = A * H := by + calc + (Real.sqrt A * Real.sqrt H) * (Real.sqrt A * Real.sqrt H) + = (Real.sqrt A * Real.sqrt A) * (Real.sqrt H * Real.sqrt H) := by ring + _ = A * H := by + rw [Real.mul_self_sqrt hA, Real.mul_self_sqrt hH] + have hsq : H * H ≤ A * H := by + calc + H * H ≤ (Real.sqrt A * Real.sqrt H) * (Real.sqrt A * Real.sqrt H) := hsquare + _ = A * H := hrhs + nlinarith + +/-- Smooth compactly supported Euclidean `L²` Calderon-Zygmund estimate after +cancelling the common Laplacian factor. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2 + {d : ℕ} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) volume) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) ≤ + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume := by + let H : ℝ := + ∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume + let A : ℝ := ∫ x, (f x) ^ 2 ∂volume + let L : Vec d → ℝ := euclideanCoordLaplacian u + have hidentity : + H = ∫ x, (L x) ^ 2 ∂volume := by + simpa [H, L] using + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_euclideanCoordLaplacian_sq + hu hu_supp + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact MeasureTheory.integral_nonneg fun x => sq_nonneg (f x) + have hH_nonneg : 0 ≤ H := by + rw [hidentity] + exact MeasureTheory.integral_nonneg fun x => sq_nonneg (L x) + have hbase0 : + H ≤ A ^ (1 / (2 : ℝ)) * + (∫ x, (L x) ^ 2 ∂volume) ^ (1 / (2 : ℝ)) := by + simpa [H, A, L, Real.norm_eq_abs, pow_two] using + integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_mul_laplacian_l2 + hu hu_supp hf hweak + have hbase : + H ≤ A ^ (1 / (2 : ℝ)) * H ^ (1 / (2 : ℝ)) := by + rwa [← hidentity] at hbase0 + have hbase_sqrt : H ≤ Real.sqrt A * Real.sqrt H := by + simpa [Real.sqrt_eq_rpow] using hbase + have hfinal : H ≤ A := + le_of_le_sqrt_mul_sqrt_self hA_nonneg hH_nonneg hbase_sqrt + simpa [H, A, Real.norm_eq_abs, pow_two] using hfinal + +/-- Local-support variant of the smooth compactly supported Euclidean CZ +estimate. + +This is the Cauchy-Schwarz estimate in the exact form needed after reflection: +the weak equation is required only for smooth compactly supported tests whose +topological support stays in `U`. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_mul_laplacian_l2_of_tsupport_subset + {d : ℕ} {U : Set (Vec d)} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ U) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) volume) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) ≤ + (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) ∂volume) ^ + (1 / (2 : ℝ)) := by + let L : Vec d → ℝ := euclideanCoordLaplacian u + have hLcont : Continuous L := (contDiff_euclideanCoordLaplacian hu).continuous + have hLs : HasCompactSupport L := hasCompactSupport_euclideanCoordLaplacian hu_supp + have hf_ofReal : MeasureTheory.MemLp f (ENNReal.ofReal (2 : ℝ)) volume := by + simpa using hf + have hLmem : MeasureTheory.MemLp L (2 : ℝ≥0∞) volume := by + simpa [L] using hLcont.memLp_of_hasCompactSupport hLs + have hLmem_ofReal : MeasureTheory.MemLp L (ENNReal.ofReal (2 : ℝ)) volume := by + simpa using hLmem + have hcz_eq : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) = + ∫ x, f x * (-L x) ∂volume := by + simpa [L] using + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_forcing_mul_neg_laplacian_of_tsupport_subset + hu hu_supp hu_sub hweak + have habs : + ∫ x, f x * (-L x) ∂volume ≤ + ∫ x, ‖f x‖ * ‖L x‖ ∂volume := by + calc + ∫ x, f x * (-L x) ∂volume + ≤ |∫ x, f x * (-L x) ∂volume| := le_abs_self _ + _ ≤ ∫ x, ‖f x * (-L x)‖ ∂volume := by + exact norm_integral_le_integral_norm (fun x => f x * (-L x)) + _ = ∫ x, ‖f x‖ * ‖L x‖ ∂volume := by + apply integral_congr_ae + exact Filter.Eventually.of_forall fun x => by + simp + have hholder : + ∫ x, ‖f x‖ * ‖L x‖ ∂volume ≤ + (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖L x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) := by + exact MeasureTheory.integral_mul_norm_le_Lp_mul_Lq + (μ := volume) (f := f) (g := L) + Real.HolderConjugate.two_two hf_ofReal hLmem_ofReal + calc + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) + = ∫ x, f x * (-L x) ∂volume := hcz_eq + _ ≤ ∫ x, ‖f x‖ * ‖L x‖ ∂volume := habs + _ ≤ (∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume) ^ (1 / (2 : ℝ)) * + (∫ x, ‖euclideanCoordLaplacian u x‖ ^ (2 : ℝ) ∂volume) ^ + (1 / (2 : ℝ)) := by + simpa [L] using hholder + +/-- Local-support variant of the cancelled smooth compactly supported +Euclidean `L²` Calderon-Zygmund estimate. -/ +theorem integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_of_tsupport_subset + {d : ℕ} {U : Set (Vec d)} {u f : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (hu_supp : HasCompactSupport u) + (hu_sub : tsupport u ⊆ U) + (hf : MeasureTheory.MemLp f (2 : ℝ≥0∞) volume) + (hweak : + ∀ φ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) φ → HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x, vecDot (euclideanGradient u x) (euclideanGradient φ x) ∂volume = + ∫ x, f x * φ x ∂volume) : + (∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume) ≤ + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂volume := by + let H : ℝ := + ∑ i : Fin d, ∑ j : Fin d, + ∫ x, (euclideanCoordSecondDeriv i j u x) ^ 2 ∂volume + let A : ℝ := ∫ x, (f x) ^ 2 ∂volume + let L : Vec d → ℝ := euclideanCoordLaplacian u + have hidentity : + H = ∫ x, (L x) ^ 2 ∂volume := by + simpa [H, L] using + integral_sum_euclideanCoordSecondDeriv_sq_eq_integral_euclideanCoordLaplacian_sq + hu hu_supp + have hA_nonneg : 0 ≤ A := by + dsimp [A] + exact MeasureTheory.integral_nonneg fun x => sq_nonneg (f x) + have hH_nonneg : 0 ≤ H := by + rw [hidentity] + exact MeasureTheory.integral_nonneg fun x => sq_nonneg (L x) + have hbase0 : + H ≤ A ^ (1 / (2 : ℝ)) * + (∫ x, (L x) ^ 2 ∂volume) ^ (1 / (2 : ℝ)) := by + simpa [H, A, L, Real.norm_eq_abs, pow_two] using + integral_sum_euclideanCoordSecondDeriv_sq_le_forcing_l2_mul_laplacian_l2_of_tsupport_subset + hu hu_supp hu_sub hf hweak + have hbase : + H ≤ A ^ (1 / (2 : ℝ)) * H ^ (1 / (2 : ℝ)) := by + rwa [← hidentity] at hbase0 + have hbase_sqrt : H ≤ Real.sqrt A * Real.sqrt H := by + simpa [Real.sqrt_eq_rpow] using hbase + have hfinal : H ≤ A := + le_of_le_sqrt_mul_sqrt_self hA_nonneg hH_nonneg hbase_sqrt + simpa [H, A, Real.norm_eq_abs, pow_two] using hfinal + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H10Graph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H10Graph.lean new file mode 100644 index 0000000000..efdd199344 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H10Graph.lean @@ -0,0 +1,618 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import Mathlib.Analysis.Normed.Operator.Banach + +/-! # H10Graph -/ + +@[expose] public section + +namespace Homogenization + +/-! +# The `H¹₀` graph inside the typed `L²` product + +This file starts the closed-range bridge needed to remove the last Sobolev +realization hypothesis from the coarse Poincare theorem surface. + +The carrier is the graph of the map + +`u ↦ (u, ∇u) : H¹₀(U) → L²(U) × L²(U; ℝᵈ)`. + +We immediately close this graph in the Hilbert product. The zero-trace Poincare +estimate extends to that closed graph by a closed-set argument; this is the +coercive ingredient needed for the eventual closed-range theorem for the +gradient projection. +-/ + +open scoped RealInnerProductSpace + +variable {d : ℕ} {U : Set (Vec d)} + +@[simp] theorem H1Function.toScalarL2_zero : + (0 : H1Function U).toScalarL2 = 0 := by + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_toScalarL2 (0 : H1Function U), + MeasureTheory.Lp.coeFn_zero (E := ℝ) (p := (2 : ENNReal)) (μ := volumeMeasureOn U)] + with x hscalar hzero + rw [hscalar, hzero] + rfl + +@[simp] theorem H1Function.gradToHilbertVectorL2_zero : + (0 : H1Function U).gradToHilbertVectorL2 = 0 := by + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_gradToHilbertVectorL2 (0 : H1Function U), + MeasureTheory.Lp.coeFn_zero (E := HilbertVec d) (p := (2 : ENNReal)) + (μ := volumeMeasureOn U)] + with x hgrad hzero + rw [hgrad, hzero] + simp [hilbertifyVecField] + +/-- The graph of the typed `H¹₀(U)` realization inside +`L²(U) × L²(U; ℝᵈ)`. -/ +noncomputable def h10GraphSubmodule + (U : Set (Vec d)) : Submodule ℝ (ScalarL2 U × HilbertVectorL2 U) where + carrier := + {z | ∃ u : H10Function U, + u.toH1Function.toScalarL2 = z.1 ∧ + u.toH1Function.gradToHilbertVectorL2 = z.2} + zero_mem' := by + refine ⟨0, ?_, ?_⟩ + · change (0 : H1Function U).toScalarL2 = 0 + simp + · change (0 : H1Function U).gradToHilbertVectorL2 = 0 + simp + add_mem' := by + intro z w hz hw + rcases hz with ⟨u, huz, hgradz⟩ + rcases hw with ⟨v, hvw, hgradw⟩ + refine ⟨u + v, ?_, ?_⟩ + · calc + (u + v).toH1Function.toScalarL2 + = (u.toH1Function + v.toH1Function).toScalarL2 := rfl + _ = u.toH1Function.toScalarL2 + v.toH1Function.toScalarL2 := + H1Function.toScalarL2_add u.toH1Function v.toH1Function + _ = (z + w).1 := by simp [huz, hvw] + · calc + (u + v).toH1Function.gradToHilbertVectorL2 + = (u.toH1Function + v.toH1Function).gradToHilbertVectorL2 := rfl + _ = u.toH1Function.gradToHilbertVectorL2 + + v.toH1Function.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_add u.toH1Function v.toH1Function + _ = (z + w).2 := by simp [hgradz, hgradw] + smul_mem' := by + intro c z hz + rcases hz with ⟨u, huz, hgradz⟩ + refine ⟨c • u, ?_, ?_⟩ + · calc + (c • u).toH1Function.toScalarL2 + = (c • u.toH1Function).toScalarL2 := rfl + _ = c • u.toH1Function.toScalarL2 := + H1Function.toScalarL2_smul c u.toH1Function + _ = (c • z).1 := by simp [huz] + · calc + (c • u).toH1Function.gradToHilbertVectorL2 + = (c • u.toH1Function).gradToHilbertVectorL2 := rfl + _ = c • u.toH1Function.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_smul c u.toH1Function + _ = (c • z).2 := by simp [hgradz] + +/-- An `H¹₀` function determines a point of the `H¹₀` graph. -/ +theorem h10_pair_mem_h10GraphSubmodule (u : H10Function U) : + (u.toH1Function.toScalarL2, u.toH1Function.gradToHilbertVectorL2) ∈ + h10GraphSubmodule U := + ⟨u, rfl, rfl⟩ + +/-- The closed `H¹₀` graph in the typed Hilbert product. -/ +noncomputable def h10GraphClosedSubmodule + (U : Set (Vec d)) : ClosedSubmodule ℝ (ScalarL2 U × HilbertVectorL2 U) := + (h10GraphSubmodule U).closure + +/-- The `H¹₀` graph is contained in the weak `H¹` graph. -/ +theorem h10GraphSubmodule_le_h1GraphClosedSubmodule : + h10GraphSubmodule U ≤ (h1GraphClosedSubmodule (U := U)).toSubmodule := by + intro z hz + rcases hz with ⟨u, hval, hgrad⟩ + have hz' : + z = (u.toH1Function.toScalarL2, u.toH1Function.gradToHilbertVectorL2) := by + cases z + simp_all + rw [hz'] + exact h1_pair_mem_h1GraphClosedSubmodule (U := U) u.toH1Function + +/-- The closed `H¹₀` graph stays inside the weak `H¹` graph. -/ +theorem h10GraphClosedSubmodule_le_h1GraphClosedSubmodule : + (h10GraphClosedSubmodule U).toSubmodule ≤ + (h1GraphClosedSubmodule (U := U)).toSubmodule := by + exact + (Submodule.closure_le + (s := h10GraphSubmodule U) + (t := h1GraphClosedSubmodule (U := U))).2 + (h10GraphSubmodule_le_h1GraphClosedSubmodule (U := U)) + +/-- If a Poincare estimate holds on honest `H¹₀` functions, it extends to the +closed `H¹₀` graph. -/ +theorem h10GraphClosedSubmodule_norm_value_le_of_forall_h10 + {C : ℝ} + (hC : ∀ u : H10Function U, + ‖u.toH1Function.toScalarL2‖ ≤ C * ‖u.toH1Function.gradToHilbertVectorL2‖) + {z : ScalarL2 U × HilbertVectorL2 U} + (hz : z ∈ h10GraphClosedSubmodule U) : + ‖z.1‖ ≤ C * ‖z.2‖ := by + let K : Set (ScalarL2 U × HilbertVectorL2 U) := {z | ‖z.1‖ ≤ C * ‖z.2‖} + have hsubset : ((h10GraphSubmodule U : Submodule ℝ + (ScalarL2 U × HilbertVectorL2 U)) : Set (ScalarL2 U × HilbertVectorL2 U)) ⊆ K := by + intro z hz + rcases hz with ⟨u, hval, hgrad⟩ + simpa [K, hval, hgrad] using hC u + have hclosed : IsClosed K := by + have hleft : Continuous (fun z : ScalarL2 U × HilbertVectorL2 U => ‖z.1‖) := + continuous_norm.comp continuous_fst + have hright : Continuous (fun z : ScalarL2 U × HilbertVectorL2 U => C * ‖z.2‖) := + continuous_const.mul (continuous_norm.comp continuous_snd) + dsimp [K] + exact isClosed_le hleft hright + have hclosure : + closure (((h10GraphSubmodule U : Submodule ℝ + (ScalarL2 U × HilbertVectorL2 U)) : Set + (ScalarL2 U × HilbertVectorL2 U))) ⊆ K := + closure_minimal hsubset hclosed + exact hclosure (by simpa [h10GraphClosedSubmodule] using! hz) + +/-- On bounded open convex domains, the zero-trace Poincare estimate extends +to the closed `H¹₀` graph. -/ +theorem h10GraphClosedSubmodule_exists_norm_value_le_mul_norm_gradient + [NeZero d] (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ z : ScalarL2 U × HilbertVectorL2 U, + z ∈ h10GraphClosedSubmodule U → ‖z.1‖ ≤ C * ‖z.2‖ := by + rcases H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (U := U) hU with ⟨C0, hC0, hC0_bound⟩ + refine ⟨C0 * d, by positivity, ?_⟩ + intro z hz + refine h10GraphClosedSubmodule_norm_value_le_of_forall_h10 (U := U) ?_ hz + intro u + have hbase : + ‖u.toH1Function.toScalarL2‖ ≤ C0 * u.toH1Function.gradientCoordL2NormSum := + hC0_bound u + have hsum : + u.toH1Function.gradientCoordL2NormSum ≤ + d * ‖u.toH1Function.gradToHilbertVectorL2‖ := by + calc + u.toH1Function.gradientCoordL2NormSum ≤ + d * ‖u.toH1Function.gradToVectorL2‖ := + u.toH1Function.gradientCoordL2NormSum_le + _ ≤ d * ‖u.toH1Function.gradToHilbertVectorL2‖ := by + exact mul_le_mul_of_nonneg_left + (H1Function.norm_gradToVectorL2_le_norm_gradToHilbertVectorL2 + (U := U) u.toH1Function) + (Nat.cast_nonneg d) + calc + ‖u.toH1Function.toScalarL2‖ ≤ C0 * u.toH1Function.gradientCoordL2NormSum := hbase + _ ≤ C0 * (d * ‖u.toH1Function.gradToHilbertVectorL2‖) := by + exact mul_le_mul_of_nonneg_left hsum hC0 + _ = (C0 * d) * ‖u.toH1Function.gradToHilbertVectorL2‖ := by ring + +/-- Curried form of `h10GraphClosedSubmodule_exists_norm_value_le_mul_norm_gradient`. -/ +theorem h10GraphClosedSubmodule_norm_value_le_of_isOpenBoundedConvexDomain + [NeZero d] (hU : IsOpenBoundedConvexDomain U) + {z : ScalarL2 U × HilbertVectorL2 U} + (hz : z ∈ h10GraphClosedSubmodule U) : + ∃ C : ℝ, 0 ≤ C ∧ ‖z.1‖ ≤ C * ‖z.2‖ := by + rcases h10GraphClosedSubmodule_exists_norm_value_le_mul_norm_gradient + (U := U) hU with ⟨C, hC, hbound⟩ + exact ⟨C, hC, hbound z hz⟩ + +/-- The closed `H¹₀` graph as a normed carrier. -/ +noncomputable abbrev H10GraphClosedSpace (U : Set (Vec d)) := + ↥((h10GraphClosedSubmodule U).toSubmodule) + +/-! ### Representative upgrade for the closed `H¹₀` graph + +The missing analytic ingredient for the potential-zero-trace realization +theorem is that every point of the closed `H¹₀` graph is the pair +`(u.toScalarL2, u.gradToHilbertVectorL2)` for an actual `H¹₀` function. The +construction diagonalises the closure approximation sequence against each +graph approximant's internal smooth compactly supported approximation data +using the `approxH1` packaging from `CoerciveH10`. +-/ + +/-- The `L²` distance between scalar representatives of two `H¹` functions is +the scalar `L²` distance between their `toScalarL2` realisations. -/ +private theorem eLpNorm_toFun_sub_eq_edist_toScalarL2 + (u v : H1Function U) : + MeasureTheory.eLpNorm (fun x => u.toFun x - v.toFun x) 2 (volumeMeasureOn U) + = edist u.toScalarL2 v.toScalarL2 := by + rw [MeasureTheory.Lp.edist_def] + refine (MeasureTheory.eLpNorm_congr_ae ?_).symm + filter_upwards [u.coeFn_toScalarL2, v.coeFn_toScalarL2] with x hu hv + simp [Pi.sub_apply, hu, hv] + +/-- The coordinate-wise `L²` distance between weak gradients equals the +`ScalarL2` distance between `gradCoordToScalarL2` realisations. -/ +private theorem eLpNorm_grad_coord_sub_eq_edist_gradCoordToScalarL2 + (u v : H1Function U) (i : Fin d) : + MeasureTheory.eLpNorm (fun x => u.grad x i - v.grad x i) 2 (volumeMeasureOn U) + = edist (u.gradCoordToScalarL2 i) (v.gradCoordToScalarL2 i) := by + rw [MeasureTheory.Lp.edist_def] + refine (MeasureTheory.eLpNorm_congr_ae ?_).symm + filter_upwards [u.coeFn_gradCoordToScalarL2 i, v.coeFn_gradCoordToScalarL2 i] + with x hu hv + simp [Pi.sub_apply, hu, hv] + +/-- Coordinate-wise `L²` distance of two weak gradients is controlled by the +`HilbertVectorL2` distance of their gradient realisations. -/ +private theorem eLpNorm_grad_coord_sub_le_edist_gradToHilbertVectorL2 + (u v : H1Function U) (i : Fin d) : + MeasureTheory.eLpNorm (fun x => u.grad x i - v.grad x i) 2 (volumeMeasureOn U) + ≤ edist u.gradToHilbertVectorL2 v.gradToHilbertVectorL2 := by + have hrhs : + edist u.gradToHilbertVectorL2 v.gradToHilbertVectorL2 + = MeasureTheory.eLpNorm + (fun x => HilbertVec.ofVec (u.grad x - v.grad x)) 2 + (volumeMeasureOn U) := by + rw [MeasureTheory.Lp.edist_def] + refine MeasureTheory.eLpNorm_congr_ae ?_ + filter_upwards + [u.coeFn_gradToHilbertVectorL2, v.coeFn_gradToHilbertVectorL2] with x hu hv + simp [Pi.sub_apply, hu, hv, hilbertifyVecField] + rw [hrhs] + refine MeasureTheory.eLpNorm_mono_ae + ((u.grad_memL2 i).sub (v.grad_memL2 i)).aestronglyMeasurable + (Filter.Eventually.of_forall ?_) + intro x + have hcoord : ‖u.grad x i - v.grad x i‖ ≤ ‖u.grad x - v.grad x‖ := by + simpa [Pi.sub_apply, Real.norm_eq_abs] using + norm_le_pi_norm (u.grad x - v.grad x) i + have hVec_le_Hilbert : + ‖u.grad x - v.grad x‖ ≤ ‖HilbertVec.ofVec (u.grad x - v.grad x)‖ := + HilbertVec.norm_le_norm_ofVec (u.grad x - v.grad x) + exact hcoord.trans hVec_le_Hilbert + +/-- `ScalarL2` distance on `gradCoordToScalarL2` is controlled by the +`HilbertVectorL2` distance on `gradToHilbertVectorL2`. -/ +private theorem edist_gradCoordToScalarL2_le_edist_gradToHilbertVectorL2 + (u v : H1Function U) (i : Fin d) : + edist (u.gradCoordToScalarL2 i) (v.gradCoordToScalarL2 i) + ≤ edist u.gradToHilbertVectorL2 v.gradToHilbertVectorL2 := by + rw [← eLpNorm_grad_coord_sub_eq_edist_gradCoordToScalarL2] + exact eLpNorm_grad_coord_sub_le_edist_gradToHilbertVectorL2 u v i + +/-- Every point of the closed `H¹₀` graph is realized by an honest `H¹₀` +function on bounded open convex domains. The witness is obtained by +diagonalising closure approximations against each graph approximant's internal +smooth compactly supported approximation data. -/ +theorem exists_h10Function_of_mem_h10GraphClosedSubmodule + [NeZero d] (hU : IsOpenBoundedConvexDomain U) + {z : ScalarL2 U × HilbertVectorL2 U} + (hz : z ∈ (h10GraphClosedSubmodule U).toSubmodule) : + ∃ u : H10Function U, + u.toH1Function.toScalarL2 = z.1 + ∧ u.toH1Function.gradToHilbertVectorL2 = z.2 := by + classical + have hUopen : IsOpen U := hU.isOpen + -- (1) H¹ witness from the weaker graph containment. + have hzH1 : z ∈ h1GraphClosedSubmodule (U := U) := + h10GraphClosedSubmodule_le_h1GraphClosedSubmodule (U := U) hz + set v : H1Function U := toH1FunctionOfMemH1Graph (U := U) z hzH1 with v_def + have hv_val : v.toScalarL2 = z.1 := + toH1FunctionOfMemH1Graph_toScalarL2 (U := U) z hzH1 + have hv_grad : v.gradToHilbertVectorL2 = z.2 := + toH1FunctionOfMemH1Graph_gradToHilbertVectorL2 (U := U) z hzH1 + -- (2) Closure → approximating sequence of graph points. + have hz_closure : + z ∈ closure ((h10GraphSubmodule U : Submodule ℝ + (ScalarL2 U × HilbertVectorL2 U)) : Set (ScalarL2 U × HilbertVectorL2 U)) := by + have hzSub : z ∈ (h10GraphSubmodule U).topologicalClosure := hz + simpa [Submodule.topologicalClosure_coe] using! hzSub + obtain ⟨ψ, hψ_mem, hψ_tendsto⟩ := mem_closure_iff_seq_limit.mp hz_closure + choose φ hφ_val hφ_grad using hψ_mem + -- (3) Component-wise convergence. + have hval_tendsto : + Filter.Tendsto (fun n => (φ n).toH1Function.toScalarL2) Filter.atTop + (nhds v.toScalarL2) := by + rw [hv_val] + exact hψ_tendsto.fst_nhds.congr' + (Filter.Eventually.of_forall fun n => (hφ_val n).symm) + have hgrad_tendsto : + Filter.Tendsto (fun n => (φ n).toH1Function.gradToHilbertVectorL2) Filter.atTop + (nhds v.gradToHilbertVectorL2) := by + rw [hv_grad] + exact hψ_tendsto.snd_nhds.congr' + (Filter.Eventually.of_forall fun n => (hφ_grad n).symm) + -- (4) Convergence of `gradCoordToScalarL2 i` for each `i`, via the coord bound. + have hgrad_edist_zero : + Filter.Tendsto + (fun n => edist (φ n).toH1Function.gradToHilbertVectorL2 v.gradToHilbertVectorL2) + Filter.atTop (nhds 0) := by + rw [← edist_self v.gradToHilbertVectorL2] + exact (continuous_id.edist continuous_const).continuousAt.tendsto.comp hgrad_tendsto + have hgradcoord_edist_zero : + ∀ i : Fin d, Filter.Tendsto + (fun n => edist ((φ n).toH1Function.gradCoordToScalarL2 i) + (v.gradCoordToScalarL2 i)) + Filter.atTop (nhds 0) := by + intro i + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + (g := fun _ => (0 : ENNReal)) + (h := fun n => + edist (φ n).toH1Function.gradToHilbertVectorL2 v.gradToHilbertVectorL2) + tendsto_const_nhds hgrad_edist_zero (fun _ => bot_le) ?_ + intro n + exact edist_gradCoordToScalarL2_le_edist_gradToHilbertVectorL2 + (φ n).toH1Function v i + have hgradcoord_tendsto : + ∀ i : Fin d, Filter.Tendsto + (fun n => (φ n).toH1Function.gradCoordToScalarL2 i) Filter.atTop + (nhds (v.gradCoordToScalarL2 i)) := by + intro i + refine (EMetric.tendsto_nhds).mpr ?_ + intro ε hε + exact (hgradcoord_edist_zero i).eventually (gt_mem_nhds hε) + -- (5) Reformulate: we want convergence in `ScalarL2 U` of + -- `(approxH1 hUopen (φ n) m).toScalarL2 → (φ n).toScalarL2`, which is + -- directly the content of `tendsto_approxH1_toScalarL2` from `CoerciveH10`. + have happroxH1_val : + ∀ n : ℕ, Filter.Tendsto + (fun m => (H10Function.approxH1 hUopen (φ n) m).toScalarL2) + Filter.atTop (nhds (φ n).toH1Function.toScalarL2) := + fun n => H10Function.tendsto_approxH1_toScalarL2 hUopen (φ n) + have happroxH1_gradcoord : + ∀ n : ℕ, ∀ i : Fin d, Filter.Tendsto + (fun m => (H10Function.approxH1 hUopen (φ n) m).gradCoordToScalarL2 i) + Filter.atTop (nhds ((φ n).toH1Function.gradCoordToScalarL2 i)) := + fun n i => + H10Function.tendsto_approxH1_gradCoordToScalarL2 hUopen (φ n) i + -- (6) Diagonal: for each n, choose m n so that + -- dist ((approxH1 (φ n) (m n)).toScalarL2) ((φ n).toScalarL2) ≤ 1/(n+1) + -- dist ((approxH1 (φ n) (m n)).gradCoordToScalarL2 i) ((φ n).gradCoordToScalarL2 i) ≤ 1/(n+1) + have diagonal : + ∀ n : ℕ, ∃ m : ℕ, + dist (H10Function.approxH1 hUopen (φ n) m).toScalarL2 + (φ n).toH1Function.toScalarL2 ≤ ((n : ℝ) + 1)⁻¹ ∧ + (∀ i : Fin d, + dist ((H10Function.approxH1 hUopen (φ n) m).gradCoordToScalarL2 i) + ((φ n).toH1Function.gradCoordToScalarL2 i) ≤ ((n : ℝ) + 1)⁻¹) := by + intro n + have hε_pos : (0 : ℝ) < ((n : ℝ) + 1)⁻¹ := by + refine inv_pos.mpr ?_ + have hn : (0 : ℝ) ≤ (n : ℝ) := Nat.cast_nonneg n + linarith + have hscalar := (Metric.tendsto_atTop.mp (happroxH1_val n)) _ hε_pos + have hcoords : ∀ i : Fin d, ∃ N : ℕ, ∀ m ≥ N, + dist ((H10Function.approxH1 hUopen (φ n) m).gradCoordToScalarL2 i) + ((φ n).toH1Function.gradCoordToScalarL2 i) < ((n : ℝ) + 1)⁻¹ := fun i => + (Metric.tendsto_atTop.mp (happroxH1_gradcoord n i)) _ hε_pos + choose Nc hNc using hcoords + obtain ⟨Nv, hNv⟩ := hscalar + let M : ℕ := max Nv ((Finset.univ : Finset (Fin d)).sup Nc) + have hMv : Nv ≤ M := le_max_left _ _ + have hMc : ∀ i : Fin d, Nc i ≤ M := by + intro i + refine le_max_of_le_right ?_ + exact Finset.le_sup (f := Nc) (Finset.mem_univ i) + refine ⟨M, (hNv M hMv).le, ?_⟩ + intro i + exact (hNc i M (hMc i)).le + choose m hm_val hm_grad using diagonal + -- (7) Build the H¹₀ function whose approximants are the chosen diagonal. + -- First produce `a n : H1Function U` as the diagonal smooth H¹-packaging. + let a : ℕ → H1Function U := fun n => H10Function.approxH1 hUopen (φ n) (m n) + -- (a n).toScalarL2 → v.toScalarL2 + -- Helper: 1/(n+1) is small eventually. + have hinv_small : ∀ ε : ℝ, 0 < ε → ∃ N : ℕ, ∀ n ≥ N, ((n : ℝ) + 1)⁻¹ < ε := by + intro ε hε + have htend_one_div : + Filter.Tendsto (fun n : ℕ => 1 / ((n : ℝ) + 1)) Filter.atTop (nhds 0) := + tendsto_one_div_add_atTop_nhds_zero_nat + have heq : (fun n : ℕ => 1 / ((n : ℝ) + 1)) = + fun n : ℕ => ((n : ℝ) + 1)⁻¹ := by + funext n; rw [one_div] + rw [heq] at htend_one_div + have hev := Metric.tendsto_atTop.mp htend_one_div ε hε + obtain ⟨N, hN⟩ := hev + refine ⟨N, fun n hn => ?_⟩ + have hnn := hN n hn + have hpos : (0 : ℝ) ≤ ((n : ℝ) + 1)⁻¹ := by + refine inv_nonneg.mpr ?_ + have hcast : (0 : ℝ) ≤ (n : ℝ) := Nat.cast_nonneg n + linarith + calc ((n : ℝ) + 1)⁻¹ = |((n : ℝ) + 1)⁻¹| := (abs_of_nonneg hpos).symm + _ = dist (((n : ℝ) + 1)⁻¹) 0 := by rw [Real.dist_eq, sub_zero] + _ < ε := hnn + have ha_val : + Filter.Tendsto (fun n => (a n).toScalarL2) Filter.atTop (nhds v.toScalarL2) := by + refine Metric.tendsto_atTop.mpr ?_ + intro ε hε + have hε2 : 0 < ε / 2 := by positivity + obtain ⟨N₁, hN₁⟩ := hinv_small (ε / 2) hε2 + obtain ⟨N₂, hN₂⟩ := Metric.tendsto_atTop.mp hval_tendsto (ε / 2) hε2 + refine ⟨max N₁ N₂, fun n hn => ?_⟩ + have hn1 : N₁ ≤ n := le_of_max_le_left hn + have hn2 : N₂ ≤ n := le_of_max_le_right hn + have htri : dist (a n).toScalarL2 v.toScalarL2 ≤ + dist (a n).toScalarL2 (φ n).toH1Function.toScalarL2 + + dist (φ n).toH1Function.toScalarL2 v.toScalarL2 := dist_triangle _ _ _ + have hm_val_n : dist (a n).toScalarL2 (φ n).toH1Function.toScalarL2 + ≤ ((n : ℝ) + 1)⁻¹ := hm_val n + have hN₂_n : dist (φ n).toH1Function.toScalarL2 v.toScalarL2 < ε / 2 := hN₂ n hn2 + have hN₁_n : ((n : ℝ) + 1)⁻¹ < ε / 2 := hN₁ n hn1 + linarith + have ha_gradcoord : + ∀ i : Fin d, Filter.Tendsto (fun n => (a n).gradCoordToScalarL2 i) + Filter.atTop (nhds (v.gradCoordToScalarL2 i)) := by + intro i + refine Metric.tendsto_atTop.mpr ?_ + intro ε hε + have hε2 : 0 < ε / 2 := by positivity + obtain ⟨N₁, hN₁⟩ := hinv_small (ε / 2) hε2 + obtain ⟨N₂, hN₂⟩ := + Metric.tendsto_atTop.mp (hgradcoord_tendsto i) (ε / 2) hε2 + refine ⟨max N₁ N₂, fun n hn => ?_⟩ + have hn1 : N₁ ≤ n := le_of_max_le_left hn + have hn2 : N₂ ≤ n := le_of_max_le_right hn + have htri : dist ((a n).gradCoordToScalarL2 i) (v.gradCoordToScalarL2 i) ≤ + dist ((a n).gradCoordToScalarL2 i) ((φ n).toH1Function.gradCoordToScalarL2 i) + + dist ((φ n).toH1Function.gradCoordToScalarL2 i) (v.gradCoordToScalarL2 i) := + dist_triangle _ _ _ + have hm_grad_n : + dist ((a n).gradCoordToScalarL2 i) ((φ n).toH1Function.gradCoordToScalarL2 i) + ≤ ((n : ℝ) + 1)⁻¹ := hm_grad n i + have hN₂_n : dist ((φ n).toH1Function.gradCoordToScalarL2 i) + (v.gradCoordToScalarL2 i) < ε / 2 := hN₂ n hn2 + have hN₁_n : ((n : ℝ) + 1)⁻¹ < ε / 2 := hN₁ n hn1 + linarith + -- Convert these ScalarL2 tendsto's to the eLpNorm tendsto required by H10Function. + have htendsto_val_eLpNorm : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (φ n).approx (m n) x - v.toFun x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + -- (a n).toScalarL2 = ((φ n).approx (m n)).toScalarL2 via ofContDiff. + -- Use edist characterization. + have hedist : + Filter.Tendsto (fun n => edist (a n).toScalarL2 v.toScalarL2) Filter.atTop + (nhds 0) := by + rw [← edist_self v.toScalarL2] + exact (continuous_id.edist continuous_const).continuousAt.tendsto.comp ha_val + refine hedist.congr ?_ + intro n + -- edist (a n).toScalarL2 v.toScalarL2 + -- = eLpNorm ((a n).toFun - v.toFun) 2 μ + -- = eLpNorm ((φ n).approx (m n) - v.toFun) 2 μ + rw [← eLpNorm_toFun_sub_eq_edist_toScalarL2] + -- (a n).toFun = (φ n).approx (m n) + rfl + have htendsto_grad_eLpNorm : + ∀ i : Fin d, Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ ((φ n).approx (m n)) x) (basisVec i) - + v.grad x i) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + intro i + have hedist : + Filter.Tendsto + (fun n => edist ((a n).gradCoordToScalarL2 i) (v.gradCoordToScalarL2 i)) + Filter.atTop (nhds 0) := by + rw [← edist_self (v.gradCoordToScalarL2 i)] + exact (continuous_id.edist continuous_const).continuousAt.tendsto.comp + (ha_gradcoord i) + refine hedist.congr ?_ + intro n + rw [← eLpNorm_grad_coord_sub_eq_edist_gradCoordToScalarL2] + -- (a n).grad x i = (fderiv ℝ ((φ n).approx (m n)) x) (basisVec i) + rfl + -- Now assemble the H¹₀ function. + let u : H10Function U := + { toH1Function := v + approx := fun n => (φ n).approx (m n) + approx_smooth := fun n => (φ n).approx_smooth (m n) + approx_hasCompactSupport := fun n => (φ n).approx_hasCompactSupport (m n) + approx_support_subset := fun n => (φ n).approx_support_subset (m n) + tendsto_approx := htendsto_val_eLpNorm + tendsto_approx_grad := htendsto_grad_eLpNorm } + exact ⟨u, hv_val, hv_grad⟩ + +namespace H10GraphClosed + +noncomputable instance : CompleteSpace (H10GraphClosedSpace (d := d) U) := by + simpa [H10GraphClosedSpace] using! + (h10GraphClosedSubmodule U).isClosed.completeSpace_coe + +/-- Scalar value component of a closed `H¹₀` graph point. -/ +abbrev value (z : H10GraphClosedSpace (d := d) U) : ScalarL2 U := + z.1.1 + +/-- Gradient component of a closed `H¹₀` graph point. -/ +abbrev gradient (z : H10GraphClosedSpace (d := d) U) : HilbertVectorL2 U := + z.1.2 + +/-- Continuous scalar-value projection from the closed `H¹₀` graph. -/ +noncomputable def valueCLM : + H10GraphClosedSpace (d := d) U →L[ℝ] ScalarL2 U := + (ContinuousLinearMap.fst ℝ (ScalarL2 U) (HilbertVectorL2 U)).comp + ((h10GraphClosedSubmodule U).toSubmodule.subtypeL) + +@[simp] theorem valueCLM_apply (z : H10GraphClosedSpace (d := d) U) : + valueCLM (U := U) z = value (U := U) z := + rfl + +/-- Continuous gradient projection from the closed `H¹₀` graph. -/ +noncomputable def gradientCLM : + H10GraphClosedSpace (d := d) U →L[ℝ] HilbertVectorL2 U := + (ContinuousLinearMap.snd ℝ (ScalarL2 U) (HilbertVectorL2 U)).comp + ((h10GraphClosedSubmodule U).toSubmodule.subtypeL) + +@[simp] theorem gradientCLM_apply (z : H10GraphClosedSpace (d := d) U) : + gradientCLM (U := U) z = gradient (U := U) z := + rfl + +/-- The zero-trace Poincare estimate on the closed graph, stated on the graph +carrier. -/ +theorem exists_norm_value_le_mul_norm_gradient + [NeZero d] (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ z : H10GraphClosedSpace (d := d) U, + ‖value (U := U) z‖ ≤ C * ‖gradient (U := U) z‖ := by + rcases h10GraphClosedSubmodule_exists_norm_value_le_mul_norm_gradient + (U := U) hU with ⟨C, hC, hbound⟩ + exact ⟨C, hC, fun z => hbound z.1 z.2⟩ + +/-- The closed graph norm is controlled by the gradient norm on bounded open +convex domains. -/ +theorem exists_norm_le_mul_norm_gradient + [NeZero d] (hU : IsOpenBoundedConvexDomain U) : + ∃ M : ℝ, 0 ≤ M ∧ + ∀ z : H10GraphClosedSpace (d := d) U, + ‖z‖ ≤ M * ‖gradient (U := U) z‖ := by + rcases exists_norm_value_le_mul_norm_gradient (U := U) hU with ⟨C, hC, hbound⟩ + refine ⟨C + 1, by positivity, ?_⟩ + intro z + let a : ℝ := ‖value (U := U) z‖ + let b : ℝ := ‖gradient (U := U) z‖ + have ha : 0 ≤ a := by simp [a] + have hb : 0 ≤ b := by simp [b] + have hvalue : a ≤ C * b := by + simpa [a, b] using hbound z + calc + ‖z‖ = max a b := by + change ‖(z.1 : ScalarL2 U × HilbertVectorL2 U)‖ = max a b + rw [Prod.norm_def] + _ ≤ (C + 1) * b := by + refine max_le ?_ ?_ + · nlinarith [hvalue, hb] + · nlinarith [hC, hb] + +/-- The gradient projection from the closed `H¹₀` graph is anti-Lipschitz on +bounded open convex domains. -/ +theorem exists_antilipschitzWith_gradientCLM + [NeZero d] (hU : IsOpenBoundedConvexDomain U) : + ∃ K : NNReal, AntilipschitzWith K (gradientCLM (d := d) (U := U)) := by + rcases exists_norm_le_mul_norm_gradient (U := U) hU with ⟨M, hM, hbound⟩ + refine ⟨⟨M, hM⟩, ?_⟩ + apply (gradientCLM (d := d) (U := U)).antilipschitz_of_bound + intro z + simpa using! hbound z + +/-- The range of the gradient projection from the closed `H¹₀` graph is closed. -/ +theorem isClosed_range_gradientCLM + [NeZero d] (hU : IsOpenBoundedConvexDomain U) : + IsClosed (Set.range (gradientCLM (d := d) (U := U))) := by + rcases exists_antilipschitzWith_gradientCLM (U := U) hU with ⟨K, hK⟩ + exact hK.isClosed_range (gradientCLM (d := d) (U := U)).uniformContinuous + +end H10GraphClosed + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph.lean new file mode 100644 index 0000000000..52cbafb45a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.CoerciveHilbert + +/-! # H1Graph -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/CoerciveHilbert.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/CoerciveHilbert.lean new file mode 100644 index 0000000000..7e49f5ad95 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/CoerciveHilbert.lean @@ -0,0 +1,511 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Graph + +/-! # Coercive Hilbert -/ + +@[expose] public section + +namespace Homogenization + +open scoped RealInnerProductSpace + +section CoerciveHilbert + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The canonical complete Hilbert carrier for the mean-zero coercive `H¹` +layer: the closed mean-zero weak-gradient graph inside +`L²(U) × L²(U; HilbertVec d)`. -/ +noncomputable abbrev H1CoerciveHilbertAmbient := + WithLp 2 (ScalarL2 U × HilbertVectorL2 U) + +noncomputable abbrev h1CoerciveHilbertAmbientEquiv : + H1CoerciveHilbertAmbient (U := U) ≃L[ℝ] ScalarL2 U × HilbertVectorL2 U := + WithLp.prodContinuousLinearEquiv 2 ℝ (ScalarL2 U) (HilbertVectorL2 U) + +noncomputable abbrev h1CoerciveHilbertClosedSubmodule : + ClosedSubmodule ℝ (H1CoerciveHilbertAmbient (U := U)) := + (h1MeanZeroGraphClosedSubmodule (U := U)).comap + (h1CoerciveHilbertAmbientEquiv (U := U)).toContinuousLinearMap + +noncomputable abbrev h1CoerciveHilbertSubmodule : + Submodule ℝ (H1CoerciveHilbertAmbient (U := U)) := + (h1CoerciveHilbertClosedSubmodule (U := U)).toSubmodule + +noncomputable abbrev H1CoerciveHilbertSpace := + ↥(h1CoerciveHilbertSubmodule (U := U)) + +namespace H1CoerciveHilbert + +noncomputable instance : SeminormedAddCommGroup (H1CoerciveHilbertSpace (U := U)) := by + exact inferInstanceAs (SeminormedAddCommGroup (h1CoerciveHilbertSubmodule (U := U))) + +noncomputable instance : NormedAddCommGroup (H1CoerciveHilbertSpace (U := U)) := by + exact inferInstanceAs (NormedAddCommGroup (h1CoerciveHilbertSubmodule (U := U))) + +noncomputable instance : NormedSpace ℝ (H1CoerciveHilbertSpace (U := U)) := by + exact inferInstanceAs (NormedSpace ℝ (h1CoerciveHilbertSubmodule (U := U))) + +noncomputable instance : InnerProductSpace ℝ (H1CoerciveHilbertSpace (U := U)) := by + exact inferInstanceAs (InnerProductSpace ℝ (h1CoerciveHilbertSubmodule (U := U))) + +noncomputable instance : CompleteSpace (H1CoerciveHilbertSpace (U := U)) := by + simpa [H1CoerciveHilbertSpace, h1CoerciveHilbertSubmodule, h1CoerciveHilbertClosedSubmodule] using! + (h1CoerciveHilbertClosedSubmodule (U := U)).isClosed.completeSpace_coe + +/-- The scalar `L²(U)` value component of a point in the coercive Hilbert +graph. -/ +abbrev value (z : H1CoerciveHilbertSpace (U := U)) : ScalarL2 U := + z.1.fst + +/-- The Hilbert-vector `L²(U)` gradient component of a point in the coercive +Hilbert graph. -/ +abbrev gradient (z : H1CoerciveHilbertSpace (U := U)) : HilbertVectorL2 U := + z.1.snd + +/-- The scalar-value projection from the coercive Hilbert graph. -/ +noncomputable def valueCLM : H1CoerciveHilbertSpace (U := U) →L[ℝ] ScalarL2 U := + (WithLp.fstL (p := 2) (𝕜 := ℝ) (α := ScalarL2 U) (β := HilbertVectorL2 U)).comp + (h1CoerciveHilbertSubmodule (U := U)).subtypeL + +@[simp] theorem valueCLM_apply (z : H1CoerciveHilbertSpace (U := U)) : + valueCLM (U := U) z = value (U := U) z := + rfl + +/-- The gradient projection from the coercive Hilbert graph. -/ +noncomputable def gradientCLM : H1CoerciveHilbertSpace (U := U) →L[ℝ] HilbertVectorL2 U := + (WithLp.sndL (p := 2) (𝕜 := ℝ) (α := ScalarL2 U) (β := HilbertVectorL2 U)).comp + (h1CoerciveHilbertSubmodule (U := U)).subtypeL + +@[simp] theorem gradientCLM_apply (z : H1CoerciveHilbertSpace (U := U)) : + gradientCLM (U := U) z = gradient (U := U) z := + rfl + +/-- The gradient-energy bilinear form on the coercive Hilbert graph. -/ +noncomputable def gradientBilin : + H1CoerciveHilbertSpace (U := U) →L[ℝ] H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ := + ContinuousLinearMap.bilinearComp (isBoundedBilinearMap_inner (𝕜 := ℝ)).toContinuousLinearMap + (gradientCLM (U := U)) (gradientCLM (U := U)) + +@[simp] theorem gradientBilin_apply + (z w : H1CoerciveHilbertSpace (U := U)) : + gradientBilin (U := U) z w = inner ℝ (gradient (U := U) z) (gradient (U := U) w) := by + simp [gradientBilin, ContinuousLinearMap.bilinearComp_apply, gradient] + +/-- The forcing functional `z ↦ ⟪f, ∇z⟫` on the coercive Hilbert graph. -/ +noncomputable def forcingFunctionalCLM {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (HilbertVectorL2 U) + (Homogenization.toHilbertVectorL2OfVecField hf)).comp + (gradientCLM (U := U)) + +@[simp] theorem forcingFunctionalCLM_apply {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (z : H1CoerciveHilbertSpace (U := U)) : + forcingFunctionalCLM (U := U) hf z = + inner ℝ (Homogenization.toHilbertVectorL2OfVecField hf) (gradient (U := U) z) := by + simp only [forcingFunctionalCLM, ContinuousLinearMap.comp_apply, gradientCLM_apply] + rfl + +/-- The scalar forcing functional `z ↦ ⟪F, z⟫` on the coercive Hilbert graph. -/ +noncomputable def scalarForcingFunctionalCLM {F : Vec d → ℝ} + (hF : MemScalarL2 U F) : + H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (ScalarL2 U) (Homogenization.toScalarL2 hF)).comp + (valueCLM (U := U)) + +@[simp] theorem scalarForcingFunctionalCLM_apply {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (z : H1CoerciveHilbertSpace (U := U)) : + scalarForcingFunctionalCLM (U := U) hF z = + inner ℝ (Homogenization.toScalarL2 hF) (value (U := U) z) := by + simp only [scalarForcingFunctionalCLM, ContinuousLinearMap.comp_apply, valueCLM_apply] + rfl + +/-- The Riesz representative of the forcing functional on the coercive Hilbert +graph. -/ +noncomputable def forcingRieszMap : + (H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ) → H1CoerciveHilbertSpace (U := U) := + fun ℓ => (InnerProductSpace.toDual ℝ (H1CoerciveHilbertSpace (U := U))).symm ℓ + +@[simp] theorem inner_forcingRieszMap_apply + (ℓ : H1CoerciveHilbertSpace (U := U) →L[ℝ] ℝ) + (z : H1CoerciveHilbertSpace (U := U)) : + inner ℝ (forcingRieszMap (U := U) ℓ) z = ℓ z := by + change inner ℝ + (((InnerProductSpace.toDual ℝ (H1CoerciveHilbertSpace (U := U))).symm) ℓ) z = ℓ z + exact + InnerProductSpace.toDual_symm_apply + (𝕜 := ℝ) + (E := H1CoerciveHilbertSpace (U := U)) + (x := z) + (y := (ℓ : StrongDual ℝ (H1CoerciveHilbertSpace (U := U)))) + +/-- The Riesz representative of the forcing functional on the coercive Hilbert +graph. -/ +noncomputable def forcingRieszRep {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + H1CoerciveHilbertSpace (U := U) := + forcingRieszMap (U := U) (forcingFunctionalCLM (U := U) hf) + +@[simp] theorem inner_forcingRieszRep_apply {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (z : H1CoerciveHilbertSpace (U := U)) : + inner ℝ (forcingRieszRep (U := U) hf) z = + forcingFunctionalCLM (U := U) hf z := by + exact inner_forcingRieszMap_apply (U := U) (forcingFunctionalCLM (U := U) hf) z + +/-- Recover the mean-zero `H¹` witness represented by a point of the coercive +Hilbert graph. -/ +noncomputable def toH1MeanZeroFunction + (z : H1CoerciveHilbertSpace (U := U)) : H1MeanZeroFunction U := by + let zp : ScalarL2 U × HilbertVectorL2 U := + (h1CoerciveHilbertAmbientEquiv (U := U)) z.1 + have hzp : + zp ∈ h1MeanZeroGraphClosedSubmodule (U := U) := by + exact (ClosedSubmodule.mem_comap).1 z.2 + let hzGraph : + zp ∈ h1GraphClosedSubmodule (U := U) := + (mem_h1MeanZeroGraphClosedSubmodule_iff (U := U) zp).mp hzp |>.1 + let u : H1Function U := toH1FunctionOfMemH1Graph (U := U) zp hzGraph + have hmean : MeanZeroOn U u.toFun := by + have hzMean : + scalarIntegralCLM (U := U) zp.1 = 0 := + (mem_h1MeanZeroGraphClosedSubmodule_iff (U := U) zp).mp hzp |>.2 + show ∫ x in U, u x ∂MeasureTheory.volume = 0 + calc + ∫ x in U, u x ∂MeasureTheory.volume = scalarIntegralCLM (U := U) u.toScalarL2 := by + symm + calc + scalarIntegralCLM (U := U) u.toScalarL2 + = ∫ x in U, u.toScalarL2 x ∂MeasureTheory.volume := by + exact scalarIntegralCLM_apply (U := U) u.toScalarL2 + _ = ∫ x in U, u x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_toScalarL2] with x hu + rw [hu] + _ = scalarIntegralCLM (U := U) zp.1 := by + have huScalar : u.toScalarL2 = zp.1 := by + unfold u + exact toH1FunctionOfMemH1Graph_toScalarL2 (U := U) zp hzGraph + rw [huScalar] + _ = 0 := by exact hzMean + exact ⟨u, hmean⟩ + +@[simp] theorem toH1MeanZeroFunction_toScalarL2 + (z : H1CoerciveHilbertSpace (U := U)) : + (toH1MeanZeroFunction (U := U) z).toScalarL2 = value (U := U) z := by + simp only [toH1MeanZeroFunction, value, H1MeanZeroFunction.toScalarL2, + toH1FunctionOfMemH1Graph_toScalarL2] + rfl + +@[simp] theorem toH1MeanZeroFunction_gradToHilbertVectorL2 + (z : H1CoerciveHilbertSpace (U := U)) : + (toH1MeanZeroFunction (U := U) z).gradToHilbertVectorL2 = gradient (U := U) z := by + simp only [toH1MeanZeroFunction, gradient, H1MeanZeroFunction.gradToHilbertVectorL2, + toH1FunctionOfMemH1Graph_gradToHilbertVectorL2] + rfl + +theorem norm_value_le_constant_mul_norm_gradient + (hC : H1CoerciveEstimate U) (z : H1CoerciveHilbertSpace (U := U)) : + ‖value (U := U) z‖ ≤ hC.fixedValue * ‖gradient (U := U) z‖ := by + let u : H1MeanZeroFunction U := toH1MeanZeroFunction (U := U) z + calc + ‖value (U := U) z‖ = u.valueL2Norm := by + rw [H1MeanZeroFunction.valueL2Norm] + have huValue : u.toScalarL2 = value (U := U) z := by + unfold u + exact toH1MeanZeroFunction_toScalarL2 (U := U) z + rw [huValue] + _ ≤ hC.fixedValue * u.gradientL2Norm := hC.bound u + _ ≤ hC.fixedValue * ‖u.gradToHilbertVectorL2‖ := by + exact mul_le_mul_of_nonneg_left + (H1MeanZeroFunction.gradientL2Norm_le_norm_gradToHilbertVectorL2 (d := d) u) + hC.constant_nonneg + _ = hC.fixedValue * ‖gradient (U := U) z‖ := by + have huGrad : u.gradToHilbertVectorL2 = gradient (U := U) z := by + unfold u + exact toH1MeanZeroFunction_gradToHilbertVectorL2 (U := U) z + rw [huGrad] + +theorem norm_le_max_constant_one_mul_norm_gradient + (hC : H1CoerciveEstimate U) (z : H1CoerciveHilbertSpace (U := U)) : + ‖z‖ ≤ (hC.fixedValue + 1) * ‖gradient (U := U) z‖ := by + let a : ℝ := ‖value (U := U) z‖ + let b : ℝ := ‖gradient (U := U) z‖ + have ha : 0 ≤ a := norm_nonneg _ + have hb : 0 ≤ b := norm_nonneg _ + have hval : a ≤ hC.fixedValue * b := by + exact norm_value_le_constant_mul_norm_gradient (d := d) (U := U) hC z + have hnorm : + ‖z‖ = Real.sqrt (a ^ 2 + b ^ 2) := by + calc + ‖z‖ = ‖(z : H1CoerciveHilbertAmbient (U := U))‖ := by rfl + _ = Real.sqrt (‖z.1.fst‖ ^ 2 + ‖z.1.snd‖ ^ 2) := by + exact WithLp.prod_norm_eq_of_L2 (x := z.1) + _ = Real.sqrt (a ^ 2 + b ^ 2) := by + rw [show a = ‖z.1.fst‖ by rfl, show b = ‖z.1.snd‖ by rfl] + have hsqrt_le : Real.sqrt (a ^ 2 + b ^ 2) ≤ a + b := by + refine Real.sqrt_le_iff.mpr ?_ + constructor + · positivity + · nlinarith [ha, hb] + calc + ‖z‖ = Real.sqrt (a ^ 2 + b ^ 2) := hnorm + _ ≤ a + b := hsqrt_le + _ ≤ (hC.fixedValue + 1) * b := by + nlinarith [hval, hb, hC.constant_nonneg] + +theorem isCoercive_gradientBilin + (hC : H1CoerciveEstimate U) : + IsCoercive (gradientBilin (U := U)) := by + let M : ℝ := hC.fixedValue + 1 + have hM_pos : 0 < M := by + linarith [hC.constant_nonneg] + refine ⟨M⁻¹ * M⁻¹, by positivity, ?_⟩ + intro z + have hbound : ‖z‖ ≤ M * ‖gradient (U := U) z‖ := by + exact norm_le_max_constant_one_mul_norm_gradient (d := d) (U := U) hC z + have hscaled : M⁻¹ * ‖z‖ ≤ ‖gradient (U := U) z‖ := by + calc + M⁻¹ * ‖z‖ ≤ M⁻¹ * (M * ‖gradient (U := U) z‖) := by + gcongr + _ = ‖gradient (U := U) z‖ := by + rw [← mul_assoc, inv_mul_cancel₀ hM_pos.ne', one_mul] + have hsq : (M⁻¹ * ‖z‖) ^ 2 ≤ ‖gradient (U := U) z‖ ^ 2 := by + have hleft_nonneg : 0 ≤ M⁻¹ * ‖z‖ := by + exact mul_nonneg (inv_nonneg.mpr (le_of_lt hM_pos)) (norm_nonneg _) + have hright_nonneg : 0 ≤ ‖gradient (U := U) z‖ := norm_nonneg _ + exact sq_le_sq.mpr <| by + rw [abs_of_nonneg hleft_nonneg, abs_of_nonneg hright_nonneg] + exact hscaled + calc + (M⁻¹ * M⁻¹) * ‖z‖ * ‖z‖ = (M⁻¹ * ‖z‖) ^ 2 := by + ring + _ ≤ ‖gradient (U := U) z‖ ^ 2 := hsq + _ = gradientBilin (U := U) z z := by + rw [gradientBilin_apply] + symm + exact real_inner_self_eq_norm_sq (gradient (U := U) z) + +/-- The unique coercive-Hilbert graph element solving the weak gradient problem +with forcing `f`. -/ +noncomputable def gradientProblemSolution {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) : + H1CoerciveHilbertSpace (U := U) := by + let hB : IsCoercive (gradientBilin (U := U)) := isCoercive_gradientBilin (U := U) hC + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + exact e.symm (forcingRieszRep (U := U) hf) + +theorem gradientBilin_gradientProblemSolution_apply {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (z : H1CoerciveHilbertSpace (U := U)) : + gradientBilin (U := U) (gradientProblemSolution hf hC) z = + forcingFunctionalCLM (U := U) hf z := by + let hB : IsCoercive (gradientBilin (U := U)) := isCoercive_gradientBilin (U := U) hC + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + calc + gradientBilin (U := U) (gradientProblemSolution hf hC) z + = inner ℝ (e (gradientProblemSolution hf hC)) z := by + symm + exact hB.continuousLinearEquivOfBilin_apply (gradientProblemSolution hf hC) z + _ = inner ℝ (forcingRieszRep (U := U) hf) z := by + rw [gradientProblemSolution, e.apply_symm_apply] + _ = forcingFunctionalCLM (U := U) hf z := by + exact inner_forcingRieszRep_apply (U := U) hf z + +/-- The unique coercive-Hilbert graph element solving the scalar right-hand-side +problem with forcing `F`. -/ +noncomputable def scalarRhsProblemSolution {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (hC : H1CoerciveEstimate U) : + H1CoerciveHilbertSpace (U := U) := by + let hB : IsCoercive (gradientBilin (U := U)) := isCoercive_gradientBilin (U := U) hC + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + exact e.symm (forcingRieszMap (U := U) (scalarForcingFunctionalCLM (U := U) hF)) + +theorem gradientBilin_scalarRhsProblemSolution_apply {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (hC : H1CoerciveEstimate U) + (z : H1CoerciveHilbertSpace (U := U)) : + gradientBilin (U := U) (scalarRhsProblemSolution hF hC) z = + scalarForcingFunctionalCLM (U := U) hF z := by + let hB : IsCoercive (gradientBilin (U := U)) := isCoercive_gradientBilin (U := U) hC + let e : H1CoerciveHilbertSpace (U := U) ≃L[ℝ] H1CoerciveHilbertSpace (U := U) := + hB.continuousLinearEquivOfBilin + calc + gradientBilin (U := U) (scalarRhsProblemSolution hF hC) z + = inner ℝ (e (scalarRhsProblemSolution hF hC)) z := by + symm + exact hB.continuousLinearEquivOfBilin_apply (scalarRhsProblemSolution hF hC) z + _ = inner ℝ (forcingRieszMap (U := U) + (scalarForcingFunctionalCLM (U := U) hF)) z := by + rw [scalarRhsProblemSolution, e.apply_symm_apply] + _ = scalarForcingFunctionalCLM (U := U) hF z := by + exact inner_forcingRieszMap_apply (U := U) + (scalarForcingFunctionalCLM (U := U) hF) z + +end H1CoerciveHilbert + +namespace H1MeanZeroFunction + +noncomputable def toH1CoerciveHilbertSpace + (u : H1MeanZeroFunction U) : H1CoerciveHilbertSpace (U := U) := by + refine ⟨(h1CoerciveHilbertAmbientEquiv (U := U)).symm (u.toScalarL2, u.gradToHilbertVectorL2), ?_⟩ + change + (h1CoerciveHilbertAmbientEquiv (U := U)) + ((h1CoerciveHilbertAmbientEquiv (U := U)).symm (u.toScalarL2, u.gradToHilbertVectorL2)) + ∈ h1MeanZeroGraphClosedSubmodule (U := U) + rw [(h1CoerciveHilbertAmbientEquiv (U := U)).apply_symm_apply] + exact h1MeanZero_pair_mem_h1MeanZeroGraphClosedSubmodule (U := U) u + +@[simp] theorem H1CoerciveHilbert_value_toH1CoerciveHilbertSpace + (u : H1MeanZeroFunction U) : + H1CoerciveHilbert.value (U := U) (toH1CoerciveHilbertSpace (U := U) u) = u.toScalarL2 := by + simp [toH1CoerciveHilbertSpace, H1CoerciveHilbert.value] + +@[simp] theorem H1CoerciveHilbert_gradient_toH1CoerciveHilbertSpace + (u : H1MeanZeroFunction U) : + H1CoerciveHilbert.gradient (U := U) (toH1CoerciveHilbertSpace (U := U) u) = + u.gradToHilbertVectorL2 := by + simp [toH1CoerciveHilbertSpace, H1CoerciveHilbert.gradient] + +@[simp] theorem H1CoerciveHilbert_forcingFunctionalCLM_apply_toH1CoerciveHilbertSpace + {f : Vec d → Vec d} (hf : MemVectorL2 U f) (u : H1MeanZeroFunction U) : + H1CoerciveHilbert.forcingFunctionalCLM (U := U) hf + (toH1CoerciveHilbertSpace (U := U) u) = + gradientPairing hf u := by + rw [H1CoerciveHilbert.forcingFunctionalCLM_apply, + H1CoerciveHilbert_gradient_toH1CoerciveHilbertSpace] + rfl + +@[simp] theorem H1CoerciveHilbert_scalarForcingFunctionalCLM_apply_toH1CoerciveHilbertSpace + {F : Vec d → ℝ} (hF : MemScalarL2 U F) (u : H1MeanZeroFunction U) : + H1CoerciveHilbert.scalarForcingFunctionalCLM (U := U) hF + (toH1CoerciveHilbertSpace (U := U) u) = + inner ℝ (Homogenization.toScalarL2 hF) u.toScalarL2 := by + rw [H1CoerciveHilbert.scalarForcingFunctionalCLM_apply, + H1CoerciveHilbert_value_toH1CoerciveHilbertSpace] + +/-- The mean-zero `H¹` weak solution represented by the coercive Hilbert graph +solution of the gradient problem. -/ +noncomputable def gradientProblemSolution {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) : + H1MeanZeroFunction U := + H1CoerciveHilbert.toH1MeanZeroFunction + (H1CoerciveHilbert.gradientProblemSolution (d := d) (U := U) hf hC) + +theorem gradientProblemSolution_firstVariation {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (u : H1MeanZeroFunction U) : + inner ℝ + (gradientProblemSolution (U := U) hf hC).gradToHilbertVectorL2 + u.gradToHilbertVectorL2 = + gradientPairing hf u := by + simpa [gradientProblemSolution] using! + (H1CoerciveHilbert.gradientBilin_gradientProblemSolution_apply + (d := d) + (U := U) hf hC + (toH1CoerciveHilbertSpace (U := U) u)) + +theorem gradientProblemSolution_firstVariation_eq_integral {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (u : H1MeanZeroFunction U) : + ∫ x in U, + vecDot ((gradientProblemSolution (U := U) hf hC).toH1Function.grad x) + (u.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (f x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + let v : H1MeanZeroFunction U := gradientProblemSolution (U := U) hf hC + have hpair : + gradientPairing v.toH1Function.grad_memVectorL2 u = gradientPairing hf u := by + simpa [v] using! gradientProblemSolution_firstVariation (d := d) (U := U) hf hC u + calc + ∫ x in U, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂MeasureTheory.volume = gradientPairing v.toH1Function.grad_memVectorL2 u := by + symm + exact gradientPairing_eq_integral (U := U) v.toH1Function.grad_memVectorL2 u + _ = gradientPairing hf u := hpair + _ = ∫ x in U, vecDot (f x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + exact gradientPairing_eq_integral (U := U) hf u + +/-- The mean-zero `H¹` weak solution represented by the coercive Hilbert graph +solution of the scalar right-hand-side problem. -/ +noncomputable def scalarRhsProblemSolution {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (hC : H1CoerciveEstimate U) : + H1MeanZeroFunction U := + H1CoerciveHilbert.toH1MeanZeroFunction + (H1CoerciveHilbert.scalarRhsProblemSolution (d := d) (U := U) hF hC) + +theorem scalarRhsProblemSolution_firstVariation {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (hC : H1CoerciveEstimate U) + (u : H1MeanZeroFunction U) : + inner ℝ + (scalarRhsProblemSolution (U := U) hF hC).gradToHilbertVectorL2 + u.gradToHilbertVectorL2 = + inner ℝ (Homogenization.toScalarL2 hF) u.toScalarL2 := by + simpa [scalarRhsProblemSolution] using + (H1CoerciveHilbert.gradientBilin_scalarRhsProblemSolution_apply + (d := d) (U := U) hF hC + (toH1CoerciveHilbertSpace (U := U) u)) + +theorem scalarRhsProblemSolution_firstVariation_eq_integral {F : Vec d → ℝ} + (hF : MemScalarL2 U F) (hC : H1CoerciveEstimate U) + (u : H1MeanZeroFunction U) : + ∫ x in U, + vecDot ((scalarRhsProblemSolution (U := U) hF hC).toH1Function.grad x) + (u.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, F x * u.toH1Function x ∂MeasureTheory.volume := by + let v : H1MeanZeroFunction U := scalarRhsProblemSolution (U := U) hF hC + have hpair : + inner ℝ v.gradToHilbertVectorL2 u.gradToHilbertVectorL2 = + inner ℝ (Homogenization.toScalarL2 hF) u.toScalarL2 := by + simpa [v] using scalarRhsProblemSolution_firstVariation (d := d) (U := U) hF hC u + calc + ∫ x in U, vecDot (v.toH1Function.grad x) (u.toH1Function.grad x) + ∂MeasureTheory.volume = + inner ℝ v.gradToHilbertVectorL2 u.gradToHilbertVectorL2 := by + symm + simpa [H1MeanZeroFunction.gradToHilbertVectorL2, H1Function.gradToHilbertVectorL2] using + inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) + v.toH1Function.grad_memVectorL2 + u.toH1Function.grad_memVectorL2 + _ = inner ℝ (Homogenization.toScalarL2 hF) u.toScalarL2 := hpair + _ = ∫ x in U, F x * u.toH1Function x ∂MeasureTheory.volume := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [Homogenization.coeFn_toScalarL2 hF, + H1Function.coeFn_toScalarL2 u.toH1Function] + with x hF' hu + rw [hF'] + change F x * u.toH1Function.toScalarL2 x = F x * u.toH1Function.toFun x + rw [hu] + +end H1MeanZeroFunction + +namespace H1Function + +theorem gradientProblemSolution_firstVariation_eq_integral {f : Vec d → Vec d} + (hf : MemVectorL2 U f) (hC : H1CoerciveEstimate U) + (u : H1Function U) : + ∫ x in U, + vecDot ((H1MeanZeroFunction.gradientProblemSolution + (U := U) hf hC).toH1Function.grad x) (u.grad x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (f x) (u.grad x) ∂MeasureTheory.volume := by + simpa using + (H1MeanZeroFunction.gradientProblemSolution_firstVariation_eq_integral + (d := d) (U := U) hf hC u.toMeanZero) + +end H1Function + +end CoerciveHilbert + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Graph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Graph.lean new file mode 100644 index 0000000000..d08524b1be --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Graph.lean @@ -0,0 +1,538 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph.Preliminaries + +/-! # Graph -/ + +@[expose] public section + +namespace Homogenization + +open scoped RealInnerProductSpace + +section Graph + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The weak-gradient constraint attached to a coordinate `i` and a smooth +compactly supported test function `φ`. Its kernel consists of pairs +`(u, Du) ∈ L²(U) × L²(U; HilbertVec d)` satisfying the corresponding +integration-by-parts identity. -/ +noncomputable def h1WeakConstraintCLM (i : Fin d) (φ : H1WeakTestFunction U) : + (ScalarL2 U × HilbertVectorL2 U) →L[ℝ] ℝ := + ((InnerProductSpace.toDual ℝ (ScalarL2 U) (φ.derivToScalarL2 i)).comp + (ContinuousLinearMap.fst ℝ (ScalarL2 U) (HilbertVectorL2 U))) + + (((InnerProductSpace.toDual ℝ (ScalarL2 U) φ.toScalarL2).comp + (hilbertVectorCoordToScalarL2 (U := U) i)).comp + (ContinuousLinearMap.snd ℝ (ScalarL2 U) (HilbertVectorL2 U))) + +@[simp] theorem h1WeakConstraintCLM_apply (i : Fin d) (φ : H1WeakTestFunction U) + (z : ScalarL2 U × HilbertVectorL2 U) : + h1WeakConstraintCLM (U := U) i φ z = + inner ℝ z.1 (φ.derivToScalarL2 i) + + inner ℝ (hilbertVectorCoordToScalarL2 (U := U) i z.2) φ.toScalarL2 := by + simp [h1WeakConstraintCLM, InnerProductSpace.toDual_apply_apply, real_inner_comm] + +theorem h1WeakConstraintCLM_apply_eq_integral (i : Fin d) (φ : H1WeakTestFunction U) + (z : ScalarL2 U × HilbertVectorL2 U) : + h1WeakConstraintCLM (U := U) i φ z = + ∫ x in U, z.1 x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, z.2 x i * φ x ∂MeasureTheory.volume := by + rw [h1WeakConstraintCLM_apply, scalarInner_eq_integral, coordInner_eq_integral] + congr 1 + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [φ.coeFn_derivToScalarL2 i] with x hφ + rw [hφ] + +/-- The closed ambient subspace cut out by the weak-gradient constraints. -/ +noncomputable def h1GraphClosedSubmodule : + ClosedSubmodule ℝ (ScalarL2 U × HilbertVectorL2 U) := + ⨅ i : Fin d, ⨅ φ : H1WeakTestFunction U, + (⊥ : ClosedSubmodule ℝ ℝ).comap (h1WeakConstraintCLM (U := U) i φ) + +theorem mem_h1GraphClosedSubmodule_iff + (z : ScalarL2 U × HilbertVectorL2 U) : + z ∈ h1GraphClosedSubmodule (U := U) ↔ + ∀ i : Fin d, ∀ φ : H1WeakTestFunction U, + h1WeakConstraintCLM (U := U) i φ z = 0 := by + simp [h1GraphClosedSubmodule] + +theorem h1_pair_mem_h1GraphClosedSubmodule (u : H1Function U) : + (u.toScalarL2, u.gradToHilbertVectorL2) ∈ h1GraphClosedSubmodule (U := U) := by + rw [mem_h1GraphClosedSubmodule_iff] + intro i φ + have hweak := + u.hasWeakGradient i φ φ.smooth φ.compactSupport φ.support_subset + have hcoord : + ∫ x in U, u.gradToHilbertVectorL2 x i * φ x ∂MeasureTheory.volume = + ∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_gradToHilbertVectorL2] with x hgrad + rw [hgrad] + simp [hilbertifyVecField] + calc + h1WeakConstraintCLM (U := U) i φ (u.toScalarL2, u.gradToHilbertVectorL2) + = ∫ x in U, u.toScalarL2 x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, u.gradToHilbertVectorL2 x i * φ x ∂MeasureTheory.volume := by + exact h1WeakConstraintCLM_apply_eq_integral (U := U) i φ + (u.toScalarL2, u.gradToHilbertVectorL2) + _ = ∫ x in U, u x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, u.gradToHilbertVectorL2 x i * φ x ∂MeasureTheory.volume := by + congr 1 + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_toScalarL2] with x hu + rw [hu] + _ = ∫ x in U, u x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume := by + rw [hcoord] + _ = 0 := by + have hweak' : + ∫ x in U, u x * φ.deriv i x ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume := by + simpa [H1WeakTestFunction.deriv] using hweak + rw [hweak'] + ring + +/-- Recover an `H¹` witness from a point of the closed weak-gradient graph. -/ +noncomputable def toH1FunctionOfMemH1Graph + (z : ScalarL2 U × HilbertVectorL2 U) + (hz : z ∈ h1GraphClosedSubmodule (U := U)) : + H1Function U where + toFun := z.1 + grad := hilbertVectorL2ToVectorL2 (U := U) z.2 + memL2 := MeasureTheory.Lp.memLp z.1 + gradMemL2 := by + intro i + have hgradMem : MemVectorL2 U (hilbertVectorL2ToVectorL2 (U := U) z.2) := + MeasureTheory.Lp.memLp (hilbertVectorL2ToVectorL2 (U := U) z.2) + simpa [MemL2On, MemVectorL2, volumeMeasureOn] using + (show MemL2On U (fun x => (hilbertVectorL2ToVectorL2 (U := U) z.2 x) i) by + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [MemL2On, MemVectorL2, volumeMeasureOn] using! π.comp_memLp' hgradMem) + hasWeakGradient := by + intro i ψ hψ_smooth hψ_compact hψ_sub + let φ : H1WeakTestFunction U := + ⟨ψ, hψ_smooth, hψ_compact, hψ_sub⟩ + have hconstraint : + h1WeakConstraintCLM (U := U) i φ z = 0 := by + exact (mem_h1GraphClosedSubmodule_iff (U := U) z).mp hz i φ + have hcoord : + ∫ x in U, z.2 x i * φ x ∂MeasureTheory.volume = + ∫ x in U, (hilbertVectorL2ToVectorL2 (U := U) z.2 x i) * φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := z.2)] with x hg + rw [hg] + have hsum : + ∫ x in U, z.1 x * φ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, (hilbertVectorL2ToVectorL2 (U := U) z.2 x i) * φ x + ∂MeasureTheory.volume = 0 := by + rw [← hcoord, ← h1WeakConstraintCLM_apply_eq_integral (U := U) i φ] + exact hconstraint + have hneg : + ∫ x in U, z.1 x * φ.deriv i x ∂MeasureTheory.volume = + -∫ x in U, (hilbertVectorL2ToVectorL2 (U := U) z.2 x i) * φ x + ∂MeasureTheory.volume := by + exact eq_neg_of_add_eq_zero_left hsum + simpa [H1WeakTestFunction.deriv] using hneg + +theorem mem_h1GraphClosedSubmodule_iff_exists_h1Function + (z : ScalarL2 U × HilbertVectorL2 U) : + z ∈ h1GraphClosedSubmodule (U := U) ↔ + ∃ u : H1Function U, u.toScalarL2 = z.1 ∧ u.gradToHilbertVectorL2 = z.2 := by + constructor + · intro hz + refine ⟨toH1FunctionOfMemH1Graph (U := U) z hz, ?_, ?_⟩ + show (MeasureTheory.Lp.memLp z.1).toLp z.1 = z.1 + exact MeasureTheory.Lp.toLp_coeFn z.1 (MeasureTheory.Lp.memLp z.1) + have hvec : + (toH1FunctionOfMemH1Graph (U := U) z hz).gradToVectorL2 = + hilbertVectorL2ToVectorL2 (U := U) z.2 := by + show (MeasureTheory.Lp.memLp (hilbertVectorL2ToVectorL2 (U := U) z.2)).toLp + (hilbertVectorL2ToVectorL2 (U := U) z.2) = + hilbertVectorL2ToVectorL2 (U := U) z.2 + exact MeasureTheory.Lp.toLp_coeFn + (hilbertVectorL2ToVectorL2 (U := U) z.2) + (MeasureTheory.Lp.memLp (hilbertVectorL2ToVectorL2 (U := U) z.2)) + calc + (toH1FunctionOfMemH1Graph (U := U) z hz).gradToHilbertVectorL2 + = vectorL2ToHilbertVectorL2 (U := U) + ((toH1FunctionOfMemH1Graph (U := U) z hz).gradToVectorL2) := by + symm + simpa [H1Function.gradToVectorL2, H1Function.gradToHilbertVectorL2] using + vectorL2ToHilbertVectorL2_toVectorL2 + (U := U) + (f := (toH1FunctionOfMemH1Graph (U := U) z hz).grad) + (toH1FunctionOfMemH1Graph (U := U) z hz).grad_memVectorL2 + _ = vectorL2ToHilbertVectorL2 (U := U) (hilbertVectorL2ToVectorL2 (U := U) z.2) := by + rw [hvec] + _ = z.2 := by + exact vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (U := U) z.2 + · rintro ⟨u, hval, hgrad⟩ + have hz : + z = (u.toScalarL2, u.gradToHilbertVectorL2) := by + cases z + simp_all + rw [hz] + exact h1_pair_mem_h1GraphClosedSubmodule (U := U) u + +/-- Exact representative form of `toH1FunctionOfMemH1Graph`. + +If explicit scalar/vector representatives define a point of the closed `H¹` +graph, then they themselves can be used as the `toFun` and `grad` fields of an +`H1Function`. This avoids losing pointwise control to arbitrary `Lp` +representatives. -/ +theorem exists_h1Function_of_toScalarL2_toHilbertVectorL2OfVecField_mem_h1GraphClosedSubmodule + {u : Vec d → ℝ} {G : Vec d → Vec d} + (hu : MemScalarL2 U u) (hG : MemVectorL2 U G) + (hz : (toScalarL2 hu, toHilbertVectorL2OfVecField hG) ∈ + h1GraphClosedSubmodule (U := U)) : + ∃ w : H1Function U, w.toFun = u ∧ w.grad = G := by + refine ⟨?_, ?_⟩ + refine + { toFun := u + grad := G + memL2 := hu + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · intro i + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [MemL2On, MemVectorL2, volumeMeasureOn] using! π.comp_memLp' hG + · intro i φ hφ_smooth hφ_compact hφ_sub + let ψ : H1WeakTestFunction U := + ⟨φ, hφ_smooth, hφ_compact, hφ_sub⟩ + have hconstraint : + h1WeakConstraintCLM (U := U) i ψ + (toScalarL2 hu, toHilbertVectorL2OfVecField hG) = 0 := by + exact (mem_h1GraphClosedSubmodule_iff (U := U) + (toScalarL2 hu, toHilbertVectorL2OfVecField hG)).mp hz i ψ + have hval : + ∫ x in U, (toScalarL2 hu) x * ψ.deriv i x ∂MeasureTheory.volume = + ∫ x in U, u x * ψ.deriv i x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toScalarL2 hu] with x hx + rw [hx] + have hgrad : + ∫ x in U, (toHilbertVectorL2OfVecField hG) x i * ψ x + ∂MeasureTheory.volume = + ∫ x in U, G x i * ψ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toHilbertVectorL2OfVecField hG] with x hx + rw [hx] + simp [hilbertifyVecField] + have hsum : + ∫ x in U, u x * ψ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, G x i * ψ x ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, u x * ψ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, G x i * ψ x ∂MeasureTheory.volume = + ∫ x in U, (toScalarL2 hu) x * ψ.deriv i x ∂MeasureTheory.volume + + ∫ x in U, (toHilbertVectorL2OfVecField hG) x i * ψ x + ∂MeasureTheory.volume := by + rw [hval, hgrad] + _ = h1WeakConstraintCLM (U := U) i ψ + (toScalarL2 hu, toHilbertVectorL2OfVecField hG) := by + rw [h1WeakConstraintCLM_apply_eq_integral] + _ = 0 := hconstraint + have hneg : + ∫ x in U, u x * ψ.deriv i x ∂MeasureTheory.volume = + -∫ x in U, G x i * ψ x ∂MeasureTheory.volume := + eq_neg_of_add_eq_zero_left hsum + simpa [ψ, H1WeakTestFunction.deriv] using hneg + · constructor <;> rfl + +/-- Closedness of the `H¹` graph, stated as a sequential/filter handoff for +honest `H1Function` approximants. -/ +theorem mem_h1GraphClosedSubmodule_of_tendsto_h1Function + {ι : Type*} {l : Filter ι} [l.NeBot] + (w : ι → H1Function U) {z : ScalarL2 U × HilbertVectorL2 U} + (hval : + Filter.Tendsto (fun n => (w n).toScalarL2) l (nhds z.1)) + (hgrad : + Filter.Tendsto (fun n => (w n).gradToHilbertVectorL2) l (nhds z.2)) : + z ∈ h1GraphClosedSubmodule (U := U) := by + have hpair : + Filter.Tendsto + (fun n => ((w n).toScalarL2, (w n).gradToHilbertVectorL2)) + l (nhds z) := by + cases z + exact hval.prodMk_nhds hgrad + exact + (h1GraphClosedSubmodule (U := U)).isClosed.mem_of_tendsto hpair + (Filter.Eventually.of_forall fun n => + h1_pair_mem_h1GraphClosedSubmodule (U := U) (w n)) + +@[simp] theorem toH1FunctionOfMemH1Graph_toScalarL2 + (z : ScalarL2 U × HilbertVectorL2 U) + (hz : z ∈ h1GraphClosedSubmodule (U := U)) : + (toH1FunctionOfMemH1Graph (U := U) z hz).toScalarL2 = z.1 := by + show (MeasureTheory.Lp.memLp z.1).toLp z.1 = z.1 + exact MeasureTheory.Lp.toLp_coeFn z.1 (MeasureTheory.Lp.memLp z.1) + +@[simp] theorem toH1FunctionOfMemH1Graph_gradToHilbertVectorL2 + (z : ScalarL2 U × HilbertVectorL2 U) + (hz : z ∈ h1GraphClosedSubmodule (U := U)) : + (toH1FunctionOfMemH1Graph (U := U) z hz).gradToHilbertVectorL2 = z.2 := by + have hvec : + (toH1FunctionOfMemH1Graph (U := U) z hz).gradToVectorL2 = + hilbertVectorL2ToVectorL2 (U := U) z.2 := by + show (MeasureTheory.Lp.memLp (hilbertVectorL2ToVectorL2 (U := U) z.2)).toLp + (hilbertVectorL2ToVectorL2 (U := U) z.2) = + hilbertVectorL2ToVectorL2 (U := U) z.2 + exact MeasureTheory.Lp.toLp_coeFn + (hilbertVectorL2ToVectorL2 (U := U) z.2) + (MeasureTheory.Lp.memLp (hilbertVectorL2ToVectorL2 (U := U) z.2)) + calc + (toH1FunctionOfMemH1Graph (U := U) z hz).gradToHilbertVectorL2 + = vectorL2ToHilbertVectorL2 (U := U) + ((toH1FunctionOfMemH1Graph (U := U) z hz).gradToVectorL2) := by + symm + simpa [H1Function.gradToVectorL2, H1Function.gradToHilbertVectorL2] using + vectorL2ToHilbertVectorL2_toVectorL2 + (U := U) + (f := (toH1FunctionOfMemH1Graph (U := U) z hz).grad) + (toH1FunctionOfMemH1Graph (U := U) z hz).grad_memVectorL2 + _ = vectorL2ToHilbertVectorL2 (U := U) (hilbertVectorL2ToVectorL2 (U := U) z.2) := by + rw [hvec] + _ = z.2 := by + exact vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (U := U) z.2 + +end Graph + +section MeanZero + +variable {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- The constant-one class in scalar `L²(U)`. -/ +noncomputable def oneScalarL2 : ScalarL2 U := + Homogenization.toScalarL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := (1 : ℝ))) + +@[simp] theorem coeFn_oneScalarL2 : + oneScalarL2 (U := U) =ᵐ[volumeMeasureOn U] fun _ : Vec d => (1 : ℝ) := + Homogenization.coeFn_toScalarL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := (1 : ℝ))) + +/-- The scalar integral on `L²(U)` for finite-measure domains. -/ +noncomputable def scalarIntegralCLM : ScalarL2 U →L[ℝ] ℝ := + InnerProductSpace.toDual ℝ (ScalarL2 U) (oneScalarL2 (U := U)) + +@[simp] theorem scalarIntegralCLM_apply (s : ScalarL2 U) : + scalarIntegralCLM (U := U) s = ∫ x in U, s x ∂MeasureTheory.volume := by + rw [scalarIntegralCLM, InnerProductSpace.toDual_apply_apply, real_inner_comm, scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_oneScalarL2 (U := U)] with x h1 + rw [h1] + ring + +/-- The constant-value embedding `ℝ → L²(U)` attached to the constant-one +class. -/ +noncomputable def constScalarL2CLM : ℝ →L[ℝ] ScalarL2 U := + (1 : ℝ →L[ℝ] ℝ).smulRight (oneScalarL2 (U := U)) + +@[simp] theorem constScalarL2CLM_apply (c : ℝ) : + constScalarL2CLM (U := U) c = c • oneScalarL2 (U := U) := by + simp [constScalarL2CLM] + +/-- The average functional on scalar `L²(U)`. -/ +noncomputable def integralAverageCLM : ScalarL2 U →L[ℝ] ℝ := + (MeasureTheory.volume U).toReal⁻¹ • scalarIntegralCLM (U := U) + +@[simp] theorem integralAverageCLM_apply (s : ScalarL2 U) : + integralAverageCLM (U := U) s = + (MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, s x ∂MeasureTheory.volume := by + simp [integralAverageCLM, scalarIntegralCLM_apply, smul_eq_mul] + +/-- The scalar-value operator that subtracts the average. -/ +noncomputable def subAverageValueCLM : ScalarL2 U →L[ℝ] ScalarL2 U := + ContinuousLinearMap.id ℝ (ScalarL2 U) - + (integralAverageCLM (U := U)).smulRight (oneScalarL2 (U := U)) + +@[simp] theorem subAverageValueCLM_apply (s : ScalarL2 U) : + subAverageValueCLM (U := U) s = + s - (integralAverageCLM (U := U) s) • oneScalarL2 (U := U) := by + simp [subAverageValueCLM, sub_eq_add_neg] + +namespace H1Function + +@[simp] theorem toScalarL2_const (c : ℝ) : + (H1Function.const (U := U) c).toScalarL2 = c • oneScalarL2 (U := U) := by + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_toScalarL2 (H1Function.const (U := U) c), + MeasureTheory.Lp.coeFn_smul c (oneScalarL2 (U := U)), + coeFn_oneScalarL2 (U := U)] + with x hc hsmul h1 + calc + (H1Function.const (U := U) c).toScalarL2 x = (H1Function.const (U := U) c).toFun x := hc + _ = c := by simp [H1Function.const] + _ = c * 1 := by ring + _ = c * oneScalarL2 (U := U) x := by rw [show oneScalarL2 (U := U) x = 1 by simpa using h1] + _ = (c • oneScalarL2 (U := U)) x := by + rw [hsmul] + simp [smul_eq_mul] + +theorem integralAverage_eq_integralAverageCLM_toScalarL2 + (u : H1Function U) : + integralAverage U u = integralAverageCLM (U := U) u.toScalarL2 := by + calc + integralAverage U u + = (MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, u x ∂MeasureTheory.volume := by + rfl + _ = (MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, u.toScalarL2 x ∂MeasureTheory.volume := by + congr 1 + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_toScalarL2] with x hx + rw [hx] + _ = integralAverageCLM (U := U) u.toScalarL2 := by + rw [integralAverageCLM_apply] + +theorem toScalarL2_subAverage_eq_subAverageValueCLM + (u : H1Function U) : + u.subAverage.toScalarL2 = subAverageValueCLM (U := U) u.toScalarL2 := by + calc + u.subAverage.toScalarL2 + = (u + H1Function.const (U := U) (-integralAverage U u)).toScalarL2 := by + rfl + _ = u.toScalarL2 + + (H1Function.const (U := U) (-integralAverage U u)).toScalarL2 := by + rw [H1Function.toScalarL2_add] + _ = u.toScalarL2 + (-integralAverage U u) • oneScalarL2 (U := U) := by + rw [H1Function.toScalarL2_const] + _ = u.toScalarL2 - (integralAverage U u) • oneScalarL2 (U := U) := by + simp [sub_eq_add_neg] + _ = u.toScalarL2 - (integralAverageCLM (U := U) u.toScalarL2) • oneScalarL2 (U := U) := by + rw [integralAverage_eq_integralAverageCLM_toScalarL2] + _ = subAverageValueCLM (U := U) u.toScalarL2 := by + rw [subAverageValueCLM_apply] + +theorem tendsto_integralAverage_of_tendsto_toScalarL2 + {α : Type*} {l : Filter α} {f : α → H1Function U} {u : H1Function U} + (h : Filter.Tendsto (fun a => (f a).toScalarL2) l (nhds u.toScalarL2)) : + Filter.Tendsto (fun a => integralAverage U (f a)) l (nhds (integralAverage U u)) := by + have hCLM : + Filter.Tendsto (fun a => integralAverageCLM (U := U) ((f a).toScalarL2)) l + (nhds (integralAverageCLM (U := U) u.toScalarL2)) := by + simpa only [Function.comp_apply] using! + ((integralAverageCLM (U := U)).continuous.tendsto u.toScalarL2).comp h + simpa [integralAverage_eq_integralAverageCLM_toScalarL2] using hCLM + +theorem tendsto_toScalarL2_subAverage_of_tendsto_toScalarL2 + {α : Type*} {l : Filter α} {f : α → H1Function U} {u : H1Function U} + (h : Filter.Tendsto (fun a => (f a).toScalarL2) l (nhds u.toScalarL2)) : + Filter.Tendsto (fun a => ((f a).subAverage).toScalarL2) l + (nhds (u.subAverage.toScalarL2)) := by + have hCLM : + Filter.Tendsto (fun a => subAverageValueCLM (U := U) ((f a).toScalarL2)) l + (nhds (subAverageValueCLM (U := U) u.toScalarL2)) := by + simpa only [Function.comp_apply] using! + ((subAverageValueCLM (U := U)).continuous.tendsto u.toScalarL2).comp h + simpa [toScalarL2_subAverage_eq_subAverageValueCLM] using hCLM + +@[simp] theorem gradCoordToScalarL2_subAverage_eq + (u : H1Function U) (i : Fin d) : + u.subAverage.gradCoordToScalarL2 i = u.gradCoordToScalarL2 i := by + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_gradCoordToScalarL2 u.subAverage i, + H1Function.coeFn_gradCoordToScalarL2 u i] + with x hsub hu + rw [hsub, hu] + exact congrArg (fun g : Vec d => g i) (u.grad_subAverage x) + +@[simp] theorem gradientCoordL2NormSum_subAverage_eq + (u : H1Function U) : + u.subAverage.gradientCoordL2NormSum = u.gradientCoordL2NormSum := by + simp [H1Function.gradientCoordL2NormSum] + +theorem tendsto_gradientCoordL2NormSum_subAverage_of_tendsto_gradCoordToScalarL2 + {α : Type*} {l : Filter α} {f : α → H1Function U} {u : H1Function U} + (hgrad : + ∀ i : Fin d, + Filter.Tendsto (fun a => (f a).gradCoordToScalarL2 i) l + (nhds (u.gradCoordToScalarL2 i))) : + Filter.Tendsto (fun a => (f a).subAverage.gradientCoordL2NormSum) l + (nhds u.subAverage.gradientCoordL2NormSum) := by + simpa [H1Function.gradientCoordL2NormSum, H1Function.gradCoordToScalarL2_subAverage_eq] using + (tendsto_finsetSum Finset.univ + (fun i _ => + (continuous_norm.tendsto _).comp + (hgrad i))) + +end H1Function + +/-- The closed mean-zero weak-gradient graph in +`L²(U) × L²(U; HilbertVec d)`. -/ +noncomputable def h1MeanZeroGraphClosedSubmodule : + ClosedSubmodule ℝ (ScalarL2 U × HilbertVectorL2 U) := + h1GraphClosedSubmodule (U := U) ⊓ + (⊥ : ClosedSubmodule ℝ ℝ).comap + ((scalarIntegralCLM (U := U)).comp + (ContinuousLinearMap.fst ℝ (ScalarL2 U) (HilbertVectorL2 U))) + +theorem mem_h1MeanZeroGraphClosedSubmodule_iff + (z : ScalarL2 U × HilbertVectorL2 U) : + z ∈ h1MeanZeroGraphClosedSubmodule (U := U) ↔ + z ∈ h1GraphClosedSubmodule (U := U) ∧ + scalarIntegralCLM (U := U) z.1 = 0 := by + simp [h1MeanZeroGraphClosedSubmodule] + +theorem h1MeanZero_pair_mem_h1MeanZeroGraphClosedSubmodule + (u : H1MeanZeroFunction U) : + (u.toScalarL2, u.gradToHilbertVectorL2) ∈ h1MeanZeroGraphClosedSubmodule (U := U) := by + rw [mem_h1MeanZeroGraphClosedSubmodule_iff] + refine ⟨h1_pair_mem_h1GraphClosedSubmodule (U := U) u.toH1Function, ?_⟩ + calc + scalarIntegralCLM (U := U) u.toScalarL2 = ∫ x in U, u.toScalarL2 x ∂MeasureTheory.volume := by + exact scalarIntegralCLM_apply (U := U) u.toScalarL2 + _ = ∫ x in U, u x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.toH1Function.coeFn_toScalarL2] with x hu + simpa [H1MeanZeroFunction.toScalarL2] using hu + _ = 0 := u.meanZero + +theorem mem_h1MeanZeroGraphClosedSubmodule_iff_exists_h1MeanZeroFunction + (z : ScalarL2 U × HilbertVectorL2 U) : + z ∈ h1MeanZeroGraphClosedSubmodule (U := U) ↔ + ∃ u : H1MeanZeroFunction U, u.toScalarL2 = z.1 ∧ u.gradToHilbertVectorL2 = z.2 := by + constructor + · intro hz + have hz' := (mem_h1MeanZeroGraphClosedSubmodule_iff (U := U) z).mp hz + rcases (mem_h1GraphClosedSubmodule_iff_exists_h1Function (U := U) z).mp hz'.1 with + ⟨u, hval, hgrad⟩ + have hmean : + MeanZeroOn U u.toFun := by + have hInt : + scalarIntegralCLM (U := U) u.toScalarL2 = ∫ x in U, u x ∂MeasureTheory.volume := by + calc + scalarIntegralCLM (U := U) u.toScalarL2 = ∫ x in U, u.toScalarL2 x ∂MeasureTheory.volume := by + exact scalarIntegralCLM_apply (U := U) u.toScalarL2 + _ = ∫ x in U, u x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_toScalarL2] with x hu + rw [hu] + calc + ∫ x in U, u x ∂MeasureTheory.volume = scalarIntegralCLM (U := U) u.toScalarL2 := by + simpa using hInt.symm + _ = scalarIntegralCLM (U := U) z.1 := by rw [hval] + _ = 0 := hz'.2 + exact ⟨⟨u, hmean⟩, hval, hgrad⟩ + · rintro ⟨u, hval, hgrad⟩ + have hz : + z = (u.toScalarL2, u.gradToHilbertVectorL2) := by + cases z + simp_all + rw [hz] + exact h1MeanZero_pair_mem_h1MeanZeroGraphClosedSubmodule (U := U) u + +end MeanZero + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Preliminaries.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Preliminaries.lean new file mode 100644 index 0000000000..2b321826b8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/H1Graph/Preliminaries.lean @@ -0,0 +1,128 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import Mathlib.Analysis.InnerProductSpace.Dual +public import Mathlib.Analysis.InnerProductSpace.LaxMilgram +public import Mathlib.Analysis.InnerProductSpace.ProdL2 +public import Mathlib.Analysis.InnerProductSpace.Subspace +public import Mathlib.Analysis.Normed.Operator.BoundedLinearMaps +public import Mathlib.Topology.Algebra.Module.ClosedSubmodule + +/-! # Preliminaries -/ + +@[expose] public section + +namespace Homogenization + +open scoped RealInnerProductSpace + +/-- Smooth compactly supported test functions used to encode the weak-gradient +constraints inside the `L²(U) × L²(U; ℝᵈ)` ambient product. -/ +structure H1WeakTestFunction {d : ℕ} (U : Set (Vec d)) where + toFun : Vec d → ℝ + smooth : ContDiff ℝ (⊤ : ℕ∞) toFun + compactSupport : HasCompactSupport toFun + support_subset : tsupport toFun ⊆ U + +namespace H1WeakTestFunction + +variable {d : ℕ} {U : Set (Vec d)} + +instance : CoeFun (H1WeakTestFunction U) (fun _ => Vec d → ℝ) where + coe φ := φ.toFun + +/-- The `i`th classical derivative of a test function. -/ +noncomputable def deriv (φ : H1WeakTestFunction U) (i : Fin d) : Vec d → ℝ := + fun x => (fderiv ℝ φ x) (basisVec i) + +private theorem continuous (φ : H1WeakTestFunction U) : Continuous φ := + (φ.smooth.differentiable (by simp)).continuous + +private theorem memScalarL2 (φ : H1WeakTestFunction U) : MemScalarL2 U φ := by + simpa [MemScalarL2, volumeMeasureOn] using + (φ.continuous.memLp_of_hasCompactSupport φ.compactSupport).restrict U + +private theorem deriv_continuous (φ : H1WeakTestFunction U) (i : Fin d) : + Continuous (φ.deriv i) := by + simpa [H1WeakTestFunction.deriv] using! + (φ.smooth.continuous_fderiv (by simp)).clm_apply continuous_const + +private theorem deriv_compactSupport (φ : H1WeakTestFunction U) (i : Fin d) : + HasCompactSupport (φ.deriv i) := by + simpa [H1WeakTestFunction.deriv] using! + φ.compactSupport.fderiv_apply (𝕜 := ℝ) (basisVec i) + +private theorem deriv_memScalarL2 (φ : H1WeakTestFunction U) (i : Fin d) : + MemScalarL2 U (φ.deriv i) := by + simpa [MemScalarL2, volumeMeasureOn] using + ((φ.deriv_continuous i).memLp_of_hasCompactSupport (φ.deriv_compactSupport i)).restrict U + +/-- The scalar `L²(U)` class of a test function. -/ +noncomputable def toScalarL2 (φ : H1WeakTestFunction U) : ScalarL2 U := + Homogenization.toScalarL2 (u := φ) (by exact φ.memScalarL2) + +/-- The scalar `L²(U)` class of the `i`th derivative of a test function. -/ +noncomputable def derivToScalarL2 (φ : H1WeakTestFunction U) (i : Fin d) : ScalarL2 U := + Homogenization.toScalarL2 (u := φ.deriv i) (by exact φ.deriv_memScalarL2 i) + +@[simp] theorem coeFn_toScalarL2 (φ : H1WeakTestFunction U) : + φ.toScalarL2 =ᵐ[volumeMeasureOn U] φ := + Homogenization.coeFn_toScalarL2 φ.memScalarL2 + +@[simp] theorem coeFn_derivToScalarL2 (φ : H1WeakTestFunction U) (i : Fin d) : + φ.derivToScalarL2 i =ᵐ[volumeMeasureOn U] φ.deriv i := + Homogenization.coeFn_toScalarL2 (φ.deriv_memScalarL2 i) + +end H1WeakTestFunction + +section HilbertCoords + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Extract the `i`th scalar coordinate of a Hilbert-vector `L²` field. -/ +noncomputable def hilbertVectorCoordToScalarL2 (i : Fin d) : + HilbertVectorL2 U →L[ℝ] ScalarL2 U := + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + (π.compLpL 2 (volumeMeasureOn U)).comp (hilbertVectorL2ToVectorL2 (U := U)) + +@[simp] theorem coeFn_hilbertVectorCoordToScalarL2 (i : Fin d) (g : HilbertVectorL2 U) : + hilbertVectorCoordToScalarL2 (U := U) i g =ᵐ[volumeMeasureOn U] fun x => g x i := by + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + filter_upwards + [ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := π) + (f := hilbertVectorL2ToVectorL2 (U := U) g), + coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := g)] + with x hcoord hback + rw [show hilbertVectorCoordToScalarL2 (U := U) i g x = π (hilbertVectorL2ToVectorL2 (U := U) g x) + by simpa [hilbertVectorCoordToScalarL2, π] using hcoord] + rw [hback] + rfl + +theorem scalarInner_eq_integral (f g : ScalarL2 U) : + inner ℝ f g = ∫ x in U, f x * g x ∂MeasureTheory.volume := by + rw [MeasureTheory.L2.inner_def] + simp [mul_comm] + +theorem coordInner_eq_integral + (i : Fin d) (g : HilbertVectorL2 U) (φ : H1WeakTestFunction U) : + inner ℝ (hilbertVectorCoordToScalarL2 (U := U) i g) φ.toScalarL2 = + ∫ x in U, g x i * φ x ∂MeasureTheory.volume := by + rw [scalarInner_eq_integral] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [coeFn_hilbertVectorCoordToScalarL2 (U := U) i g, φ.coeFn_toScalarL2] + with x hg hφ + rw [hg, hφ] + +end HilbertCoords + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Hodge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Hodge.lean new file mode 100644 index 0000000000..13d9b99fd5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/Hodge.lean @@ -0,0 +1,303 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 + +/-! # Hodge -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file isolates the foundational theorem surface for Hodge-style converse +statements and basic restriction lemmas. + +The restriction theorem is proved directly from the current `H1` witness API. +The converse theorem is now proved axiom-free from the coercive mean-zero `H¹` +Hilbert layer: solve the weak gradient problem on the closed graph, kill the +orthogonal residual in `L²`, and replace the weak gradient by the original +field. The `HasHodgeConverse` class remains as packaged theorem data for +downstream consumers that prefer typeclass style. +-/ + +/-- +Explicit data for the Hodge-style converse on a domain `U`. + +This keeps the theorem surface available for upstream consumers without hiding a +missing proof behind a placeholder. A future analytic sublayer should provide +canonical instances by proving the required orthogonal-complement statement. +-/ +class HasHodgeConverse {d : ℕ} (U : Set (Vec d)) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : Prop where + isPotentialOn_of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2 : + ∀ {f : Vec d → Vec d}, MemVectorL2 U f → + (∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) → + IsPotentialOn U f + +/-- +Explicit orthogonality criterion underlying the Hodge-style converse on `U`. + +This theorem-shaped predicate is the direct non-typeclass entry point for the +current development. `HasHodgeConverse` packages the same statement as an +instance when downstream APIs prefer typeclass style. +-/ +def HodgeConverseCriterion {d : ℕ} (U : Set (Vec d)) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : Prop := + ∀ {f : Vec d → Vec d}, MemVectorL2 U f → + (∀ {g : Vec d → Vec d}, MemVectorL2 U g -> + IsSolenoidalZeroNormalTraceOn U g -> + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) -> + IsPotentialOn U f + +theorem HasHodgeConverse.hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] : + HodgeConverseCriterion U := + HasHodgeConverse.isPotentialOn_of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2 + +/-- +Package an explicit orthogonality criterion as `HasHodgeConverse` data. + +This is the canonical constructor surface for future analytic work that proves +the converse theorem from closed-range or orthogonal-complement arguments. +-/ +theorem hasHodgeConverse_of_orthogonal_criterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : HodgeConverseCriterion U) : + HasHodgeConverse U where + isPotentialOn_of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2 := by + intro f hf horth + exact h hf horth + +/-- +The Hodge-style converse follows from the coercive mean-zero `H¹` layer. + +This is the first axiom-free theorem surface for the converse inside the +repository: solve the weak gradient problem on the coercive Hilbert graph, +show the residual is solenoidal with zero normal trace, use the orthogonality +hypothesis to kill that residual in `L²`, and then replace the weak gradient by +the original field `f`. +-/ +theorem hodgeConverseCriterion_of_h1CoerciveEstimate + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hC : H1CoerciveEstimate U) : + HodgeConverseCriterion U := by + intro f hf horth + let u : H1MeanZeroFunction U := H1MeanZeroFunction.gradientProblemSolution (U := U) hf hC + let r : Vec d → Vec d := fun x => f x - u.toH1Function.grad x + let hzeroMem : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + have hr : MemVectorL2 U r := hf.sub u.toH1Function.grad_memVectorL2 + have hr_sol : IsSolenoidalZeroNormalTraceOn U r := by + intro φ + have hfirst := + H1Function.gradientProblemSolution_firstVariation_eq_integral + (d := d) (U := U) hf hC φ + have hf_int : + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (φ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hf φ.grad_memVectorL2 + have hu_int : + MeasureTheory.IntegrableOn (fun x => vecDot (u.toH1Function.grad x) (φ.grad x)) U := + integrableOn_vecDot_of_memVectorL2 u.toH1Function.grad_memVectorL2 φ.grad_memVectorL2 + have hsub : + (fun x => vecDot (r x) (φ.grad x)) = + fun x => vecDot (f x) (φ.grad x) - vecDot (u.toH1Function.grad x) (φ.grad x) := by + funext x + simp [r, sub_eq_add_neg, vecDot_add_left, vecDot_neg_left] + calc + ∫ x in U, vecDot (r x) (φ.grad x) ∂MeasureTheory.volume + = ∫ x in U, + (vecDot (f x) (φ.grad x) - vecDot (u.toH1Function.grad x) (φ.grad x)) + ∂MeasureTheory.volume := by + rw [hsub] + _ = ∫ x in U, vecDot (f x) (φ.grad x) ∂MeasureTheory.volume - + ∫ x in U, vecDot (u.toH1Function.grad x) (φ.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hf_int hu_int] + _ = 0 := by + rw [hfirst] + ring + have hru_zero : + ∫ x in U, vecDot (r x) (u.toH1Function.grad x) ∂MeasureTheory.volume = 0 := + hr_sol u.toH1Function + have hrr_int : + MeasureTheory.IntegrableOn (fun x => vecDot (r x) (r x)) U := + integrableOn_vecDot_of_memVectorL2 hr hr + have hru_int : + MeasureTheory.IntegrableOn (fun x => vecDot (r x) (u.toH1Function.grad x)) U := + integrableOn_vecDot_of_memVectorL2 hr u.toH1Function.grad_memVectorL2 + have hrf_expand : + ∫ x in U, vecDot (r x) (f x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (r x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + calc + ∫ x in U, vecDot (r x) (f x) ∂MeasureTheory.volume + = ∫ x in U, vecDot (r x) (r x + u.toH1Function.grad x) ∂MeasureTheory.volume := by + congr 1 + funext x + have hfx : f x = r x + u.toH1Function.grad x := by + simp [r, sub_eq_add_neg, add_left_comm, add_comm] + rw [hfx] + _ = ∫ x in U, (vecDot (r x) (r x) + vecDot (r x) (u.toH1Function.grad x)) + ∂MeasureTheory.volume := by + congr 1 + funext x + simp [vecDot_add_right] + _ = ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (r x) (u.toH1Function.grad x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hrr_int.integrable hru_int.integrable] + have hsum_zero : + ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (r x) (u.toH1Function.grad x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (r x) (u.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, vecDot (r x) (f x) ∂MeasureTheory.volume := by + symm + exact hrf_expand + _ = 0 := horth hr hr_sol + have hrr_zero : + ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume = 0 := by + rw [hru_zero, add_zero] at hsum_zero + exact hsum_zero + have hzero_hilbert : Homogenization.toHilbertVectorL2OfVecField hr = 0 := by + have hinner_zero : + inner ℝ (Homogenization.toHilbertVectorL2OfVecField hr) + (Homogenization.toHilbertVectorL2OfVecField hr) = 0 := by + calc + inner ℝ (Homogenization.toHilbertVectorL2OfVecField hr) + (Homogenization.toHilbertVectorL2OfVecField hr) + = ∫ x in U, vecDot (r x) (r x) ∂MeasureTheory.volume := by + exact Homogenization.inner_toHilbertVectorL2OfVecField_eq_integral (U := U) hr hr + _ = 0 := hrr_zero + have hnorm_sq : + ‖Homogenization.toHilbertVectorL2OfVecField hr‖ ^ 2 = 0 := by + simpa [real_inner_self_eq_norm_sq] using hinner_zero + have hnorm_zero : ‖Homogenization.toHilbertVectorL2OfVecField hr‖ = 0 := by + nlinarith [sq_nonneg ‖Homogenization.toHilbertVectorL2OfVecField hr‖, hnorm_sq] + exact norm_eq_zero.mp hnorm_zero + have hzero_vector : Homogenization.toVectorL2 hr = 0 := by + have htransport := + congrArg (Homogenization.hilbertVectorL2ToVectorL2 (U := U)) hzero_hilbert + simpa [Homogenization.hilbertVectorL2ToVectorL2_toHilbertVectorL2 (U := U) (f := r) hr] using + htransport + have hzero_vector' : + Homogenization.toVectorL2 hr = + Homogenization.toVectorL2 (U := U) (f := (0 : Vec d → Vec d)) hzeroMem := by + rw [show Homogenization.toVectorL2 (U := U) (f := (0 : Vec d → Vec d)) hzeroMem = 0 by + simp [Homogenization.toVectorL2]] + exact hzero_vector + have hr_ae_zero : r =ᵐ[volumeMeasureOn U] (0 : Vec d → Vec d) := + (Homogenization.toVectorL2_eq_toVectorL2_iff + (U := U) (f := r) (g := 0) hr hzeroMem).mp hzero_vector' + have hgrad_ae : f =ᵐ[volumeMeasureOn U] u.toH1Function.grad := by + filter_upwards [hr_ae_zero] with x hx + exact sub_eq_zero.mp (by simpa [r] using hx) + refine ⟨ + { toFun := u.toH1Function.toFun + grad := f + memL2 := u.toH1Function.memL2 + gradMemL2 := by + intro i + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [MemL2On, MemVectorL2, volumeMeasureOn] using! π.comp_memLp' hf + hasWeakGradient := by + intro i ψ hψ_smooth hψ_compact hψ_sub + have hweak := u.toH1Function.hasWeakGradient i ψ hψ_smooth hψ_compact hψ_sub + have hcoord : + ∫ x in U, u.toH1Function.grad x i * ψ x ∂MeasureTheory.volume = + ∫ x in U, f x i * ψ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hgrad_ae] with x hx + rw [hx] + calc + ∫ x in U, u.toH1Function x * (fderiv ℝ ψ x) (basisVec i) ∂MeasureTheory.volume + = -∫ x in U, u.toH1Function.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, f x i * ψ x ∂MeasureTheory.volume := by rw [hcoord] }, rfl⟩ + +/-- Package the coercive-Hilbert proof of the Hodge converse as +`HasHodgeConverse` data. -/ +theorem hasHodgeConverse_of_h1CoerciveEstimate + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hC : H1CoerciveEstimate U) : + HasHodgeConverse U := + hasHodgeConverse_of_orthogonal_criterion + (hodgeConverseCriterion_of_h1CoerciveEstimate (U := U) hC) + +/-- A bounded open convex domain satisfies the Hodge converse once the direct +mean-zero `L²` Poincare theorem is available on the `H¹` layer. -/ +theorem hodgeConverseCriterion_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) : + HodgeConverseCriterion U := + hodgeConverseCriterion_of_h1CoerciveEstimate + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := U) hU) + +/-- Packaged version of +`hodgeConverseCriterion_of_isOpenBoundedConvexDomain`. -/ +theorem hasHodgeConverse_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) : + HasHodgeConverse U := + hasHodgeConverse_of_orthogonal_criterion + (hodgeConverseCriterion_of_isOpenBoundedConvexDomain (U := U) hU) + +namespace IsPotentialOn + +theorem of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (h : HodgeConverseCriterion U) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) + (horth : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) : + IsPotentialOn U f := + h hf horth + +theorem of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2 + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + [HasHodgeConverse U] + {f : Vec d → Vec d} (hf : MemVectorL2 U f) + (horth : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) : + IsPotentialOn U f := + of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + (HasHodgeConverse.hodgeConverseCriterion (U := U)) hf horth + +theorem of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_h1CoerciveEstimate + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hC : H1CoerciveEstimate U) + {f : Vec d → Vec d} (hf : MemVectorL2 U f) + (horth : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume = 0) : + IsPotentialOn U f := + of_orthogonal_to_solenoidalZeroNormalTrace_of_memVectorL2_of_hodgeConverseCriterion + (hodgeConverseCriterion_of_h1CoerciveEstimate (U := U) hC) hf horth + +theorem restrict_of_isOpen_of_memVectorL2 + {d : ℕ} {U V : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {f : Vec d → Vec d} (hf : IsPotentialOn U f) (_hU : IsOpen U) (hV : IsOpen V) + (hVU : V ⊆ U) (hfV : MemVectorL2 V f) : + IsPotentialOn V f := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.restrict hV hVU, rfl⟩ + +end IsPotentialOn + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/HodgeCubeBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/HodgeCubeBridge.lean new file mode 100644 index 0000000000..1f48765730 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/HodgeCubeBridge.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation + +/-! # Hodge Cube Bridge -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file transports the open-cube Hodge converse to the half-open centered +cube used by the deterministic multiscale layer. +-/ + +theorem memVectorL2_comp_addRight_of_memVectorL2_translateSet + {d : ℕ} {U : Set (Vec d)} {z : Vec d} {f : Vec d → Vec d} + (hf : MemVectorL2 (translateSet z U) f) : + MemVectorL2 U (fun x => f (x + z)) := by + simpa [MemVectorL2, volumeMeasureOn, Function.comp] using! + hf.comp_measurePreserving (measurePreserving_addRight_restrict_translateSet (d := d) z U) + +theorem memVectorL2_translateSet_of_memVectorL2 + {d : ℕ} {U : Set (Vec d)} {z : Vec d} {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + MemVectorL2 (translateSet z U) (fun x => f (x - z)) := by + simpa [MemVectorL2, volumeMeasureOn, Function.comp] using! + hf.comp_measurePreserving (measurePreserving_subRight_restrict_translateSet (d := d) z U) + +/-- The Hodge converse is invariant under translating the domain. -/ +theorem hodgeConverseCriterion_translateSet + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (z : Vec d) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (translateSet z U))] + (hHodge : HodgeConverseCriterion U) : + HodgeConverseCriterion (translateSet z U) := by + intro f hf horth + let f0 : Vec d → Vec d := fun x => f (x + z) + have hf0 : MemVectorL2 U f0 := + memVectorL2_comp_addRight_of_memVectorL2_translateSet (U := U) (z := z) hf + have horth0 : + ∀ {g : Vec d → Vec d}, MemVectorL2 U g → + IsSolenoidalZeroNormalTraceOn U g → + ∫ x in U, vecDot (g x) (f0 x) ∂MeasureTheory.volume = 0 := by + intro g hg hsol + have hgTranslate : + MemVectorL2 (translateSet z U) (fun x => g (x - z)) := + memVectorL2_translateSet_of_memVectorL2 (U := U) (z := z) hg + have hsolTranslate : + IsSolenoidalZeroNormalTraceOn (translateSet z U) (fun x => g (x - z)) := + isSolenoidalZeroNormalTraceOn_translateSet hsol z + have htranslated : + ∫ x in translateSet z U, vecDot (g (x - z)) (f x) ∂MeasureTheory.volume = 0 := + horth hgTranslate hsolTranslate + have hchange : + ∫ x in U, vecDot (g x) (f0 x) ∂MeasureTheory.volume = + ∫ x in translateSet z U, vecDot (g (x - z)) (f x) ∂MeasureTheory.volume := by + simpa [f0, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (fun x => vecDot (g (x - z)) (f x))) + exact hchange.trans htranslated + have hpot0 : IsPotentialOn U f0 := hHodge hf0 horth0 + have hpotTranslate : + IsPotentialOn (translateSet z U) (fun x => f0 (x - z)) := + isPotentialOn_translateSet hpot0 z + simpa [f0, sub_eq_add_neg, add_assoc] using hpotTranslate + +/-- +The half-open centered cube satisfies the Hodge converse because it agrees +almost everywhere with the corresponding open centered cube, and the latter is a +bounded open convex domain. +-/ +theorem hodgeConverseCriterion_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet (originCube d n)))] : + HodgeConverseCriterion (cubeSet (originCube d n)) := by + have hfiniteOpen : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d n))) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)).isFiniteMeasure_restrict_volume + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d n))) := + hfiniteOpen + intro f hf horth + have hfOpen : MemVectorL2 (openCubeSet (originCube d n)) f := by + simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] using hf + have horthOpen : + ∀ {g : Vec d → Vec d}, MemVectorL2 (openCubeSet (originCube d n)) g → + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g → + ∫ x in openCubeSet (originCube d n), vecDot (g x) (f x) ∂MeasureTheory.volume = 0 := by + intro g hg hsol + have hgCube : MemVectorL2 (cubeSet (originCube d n)) g := by + simpa [MemVectorL2, volumeMeasureOn, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube] using hg + have hsolCube : + IsSolenoidalZeroNormalTraceOn (cubeSet (originCube d n)) g := + isSolenoidalZeroNormalTraceOn_cubeSet_originCube_of_openCubeSet hsol + have hcube : + ∫ x in cubeSet (originCube d n), vecDot (g x) (f x) ∂MeasureTheory.volume = 0 := + horth hgCube hsolCube + have hset : + ∫ x in cubeSet (originCube d n), vecDot (g x) (f x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), vecDot (g x) (f x) ∂MeasureTheory.volume := + setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + rwa [hset] at hcube + have hopen : + IsPotentialOn (openCubeSet (originCube d n)) f := + hodgeConverseCriterion_of_isOpenBoundedConvexDomain + (U := openCubeSet (originCube d n)) + (isOpenBoundedConvexDomain_openCubeSet (originCube d n)) + hfOpen horthOpen + exact isPotentialOn_cubeSet_originCube_of_openCubeSet hopen + +/-- Packaged centered half-open cube Hodge converse. -/ +theorem hasHodgeConverse_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet (originCube d n)))] : + HasHodgeConverse (cubeSet (originCube d n)) := + hasHodgeConverse_of_orthogonal_criterion + (hodgeConverseCriterion_cubeSet_originCube (d := d) (n := n)) + +private theorem cubeSet_eq_translateSet_originCube_for_hodge {d : ℕ} + (Q : TriadicCube d) : + cubeSet Q = + translateSet (fun i => (Q.index i : ℝ) * cubeScaleFactor Q) + (cubeSet (originCube d Q.scale)) := by + cases Q with + | mk scale index => + apply Set.ext + intro x + rw [mem_translateSet_iff_sub_mem] + constructor + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + · intro hx i + simpa [cubeSet, originCube, cubeScaleFactor, sub_eq_add_neg, + add_assoc, add_left_comm, add_comm, add_mul] using hx i + +/-- Every half-open triadic cube satisfies the Hodge converse. -/ +theorem hodgeConverseCriterion_cubeSet_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] : + HodgeConverseCriterion (cubeSet Q) := by + let z : Vec d := fun i => (Q.index i : ℝ) * cubeScaleFactor Q + let U0 : Set (Vec d) := cubeSet (originCube d Q.scale) + have hcube : cubeSet Q = translateSet z U0 := by + simpa [z, U0] using cubeSet_eq_translateSet_originCube_for_hodge Q + have hfiniteOrigin : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn U0) := by + let : Fact (MeasureTheory.volume U0 < ⊤) := by + refine ⟨?_⟩ + simpa [U0] using volume_cubeSet_lt_top (originCube d Q.scale) + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U0) + infer_instance + have hfiniteTranslate : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (translateSet z U0)) := by + simpa [hcube] using + (inferInstance : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U0) := hfiniteOrigin + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (translateSet z U0)) := hfiniteTranslate + have horigin : HodgeConverseCriterion U0 := by + change HodgeConverseCriterion (cubeSet (originCube d Q.scale)) + exact hodgeConverseCriterion_cubeSet_originCube (d := d) (n := Q.scale) + have htranslated : HodgeConverseCriterion (translateSet z U0) := by + exact hodgeConverseCriterion_translateSet (U := U0) z horigin + intro f hf horth + have hfTranslate : MemVectorL2 (translateSet z U0) f := by + simpa [← hcube] using hf + have horthTranslate : + ∀ {g : Vec d → Vec d}, MemVectorL2 (translateSet z U0) g → + IsSolenoidalZeroNormalTraceOn (translateSet z U0) g → + ∫ x in translateSet z U0, vecDot (g x) (f x) ∂MeasureTheory.volume = 0 := by + intro g hg hsol + have hgCube : MemVectorL2 (cubeSet Q) g := by + simpa [hcube] using hg + have hsolCube : IsSolenoidalZeroNormalTraceOn (cubeSet Q) g := by + simpa [hcube] using hsol + have hcubeOrth : + ∫ x in cubeSet Q, vecDot (g x) (f x) ∂MeasureTheory.volume = 0 := + horth hgCube hsolCube + simpa [hcube] using hcubeOrth + have hpotTranslate : IsPotentialOn (translateSet z U0) f := + htranslated hfTranslate horthTranslate + simpa [← hcube] using hpotTranslate + +/-- Packaged Hodge converse on every half-open triadic cube. -/ +theorem hasHodgeConverse_cubeSet_triadicCube + {d : ℕ} [NeZero d] (Q : TriadicCube d) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] : + HasHodgeConverse (cubeSet Q) := + hasHodgeConverse_of_orthogonal_criterion + (hodgeConverseCriterion_cubeSet_triadicCube Q) + +instance instHasHodgeConverseCubeSet + {d : ℕ} [NeZero d] (Q : TriadicCube d) + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q))] : + HasHodgeConverse (cubeSet Q) := + hasHodgeConverse_cubeSet_triadicCube Q + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/MeanZero.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/MeanZero.lean new file mode 100644 index 0000000000..f3382143b9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/MeanZero.lean @@ -0,0 +1,376 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Domain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra + +/-! # Mean Zero -/ + +@[expose] public section + +namespace Homogenization + +noncomputable def integralAverage {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, u x ∂MeasureTheory.volume + +namespace H1Function + +theorem integrableOn {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) : + MeasureTheory.IntegrableOn u U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + u.memL2.integrable (by norm_num : (1 : ENNReal) ≤ 2) + +noncomputable def const {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (c : ℝ) : H1Function U := + { toFun := fun _ => c + grad := fun _ => 0 + memL2 := by + simpa using + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := c)) + gradMemL2 := by + intro i + exact + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + (c := (0 : ℝ))) + hasWeakGradient := by + simpa using! + (HasWeakGradientOn.of_contDiff + (U := U) + (f := fun _ : Vec d => c) + (hf := contDiff_const)) } + +@[simp] theorem const_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (c : ℝ) (x : Vec d) : + (H1Function.const (U := U) c) x = c := + rfl + +@[simp] theorem grad_const {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (c : ℝ) (x : Vec d) : + (H1Function.const (U := U) c).grad x = 0 := + rfl + +noncomputable def addConst {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (c : ℝ) : H1Function U := + u + H1Function.const (U := U) c + +@[simp] theorem addConst_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (c : ℝ) (x : Vec d) : + u.addConst c x = u x + c := + rfl + +@[simp] theorem grad_addConst {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (c : ℝ) (x : Vec d) : + (u.addConst c).grad x = u.grad x := by + ext i + change (u.grad x + 0) i = u.grad x i + simp + +noncomputable def subAverage {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1Function U) : H1Function U := + u.addConst (-integralAverage U u) + +@[simp] theorem subAverage_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (x : Vec d) : + u.subAverage x = u x - integralAverage U u := by + simp [H1Function.subAverage, sub_eq_add_neg] + +@[simp] theorem grad_subAverage {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (x : Vec d) : + (u.subAverage).grad x = u.grad x := by + simp [H1Function.subAverage] + +theorem meanZeroOn_subAverage {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1Function U) : + MeanZeroOn U u.subAverage := by + unfold MeanZeroOn H1Function.subAverage H1Function.addConst integralAverage + have huInt : MeasureTheory.IntegrableOn u U := u.integrableOn + have hconstInt : + MeasureTheory.IntegrableOn + (fun _ : Vec d => -((MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, u x ∂MeasureTheory.volume)) U := by + simpa [MeasureTheory.IntegrableOn] using + (MeasureTheory.integrable_const + (-((MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, u x ∂MeasureTheory.volume)) : + MeasureTheory.Integrable + (fun _ : Vec d => -((MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, u x ∂MeasureTheory.volume)) + (volumeMeasureOn U)) + have hμ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ' : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + by_cases hvol : (MeasureTheory.volume U).toReal = 0 + · have hfinite : MeasureTheory.volume U < ⊤ := by + simpa [volumeMeasureOn] using (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ) + have hzeroMeasure : MeasureTheory.volume U = 0 := by + rcases (ENNReal.toReal_eq_zero_iff (MeasureTheory.volume U)).mp hvol with hzero | htop + · exact hzero + · exact (hfinite.ne htop).elim + simpa using! + (MeasureTheory.setIntegral_measure_zero + (f := fun x => + (u + const (-((MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, u y ∂MeasureTheory.volume))).toFun x) + hzeroMeasure) + · let I : ℝ := ∫ x in U, u x ∂MeasureTheory.volume + have hconst : + ∫ x in U, (-((MeasureTheory.volume U).toReal⁻¹ * I)) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * (-((MeasureTheory.volume U).toReal⁻¹ * I)) := by + rw [MeasureTheory.integral_const, smul_eq_mul, hμ, hμ'] + have hcancel : + (MeasureTheory.volume U).toReal * ((MeasureTheory.volume U).toReal⁻¹ * I) = I := by + field_simp [hvol] + have hfun : + (fun x => (u + const (-((MeasureTheory.volume U).toReal⁻¹ * I))).toFun x) = + (fun x => u x + -((MeasureTheory.volume U).toReal⁻¹ * I)) := by + rfl + simpa [I] using! + (calc + ∫ x in U, (u + const (-((MeasureTheory.volume U).toReal⁻¹ * I))).toFun x + ∂MeasureTheory.volume + = ∫ x in U, u x ∂MeasureTheory.volume + + ∫ x in U, (-((MeasureTheory.volume U).toReal⁻¹ * I)) ∂MeasureTheory.volume := by + rw [hfun] + rw [MeasureTheory.integral_add huInt.integrable hconstInt.integrable] + _ = I + (MeasureTheory.volume U).toReal * (-((MeasureTheory.volume U).toReal⁻¹ * I)) := by + rw [hconst] + _ = 0 := by + rw [show (MeasureTheory.volume U).toReal * (-((MeasureTheory.volume U).toReal⁻¹ * I)) = + -((MeasureTheory.volume U).toReal * ((MeasureTheory.volume U).toReal⁻¹ * I)) by ring] + rw [hcancel] + ring) + +noncomputable def coordOnIsBoundedDomain {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hBounded : IsBoundedDomain U) (i : Fin d) : + H1Function U := by + classical + let R : ℝ := Classical.choose hBounded + have hRpos : 0 < R := (Classical.choose_spec hBounded).1 + have hR : ∀ x ∈ U, ∀ j, |x j| ≤ R := (Classical.choose_spec hBounded).2 + refine + { toFun := fun x => x i + grad := fun _ => basisVec i + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) + (continuous_apply i).aestronglyMeasurable + R ?_ + rw [MeasureTheory.ae_restrict_iff' hU] + refine Filter.Eventually.of_forall ?_ + intro x hx + exact by simpa [Real.norm_eq_abs] using hR x hx i + · intro j + simpa using + (MeasureTheory.memLp_const + (μ := volumeMeasureOn U) + (p := (2 : ENNReal)) + (c := basisVec i j)) + · intro j + convert + (HasWeakPartialDerivOn.of_contDiff + (U := U) + (i := j) + (f := fun x : Vec d => x i) + (hf := contDiff_apply (𝕜 := ℝ) (n := (1 : ℕ∞)) (E := ℝ) i)) using 2 + rename_i x + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + have hproj : + HasFDerivAt (fun y : Vec d => y i) π x := by + simpa [π] using! π.hasFDerivAt (x := x) + have hlin : fderiv ℝ (fun y : Vec d => y i) x = π := hproj.fderiv + simpa [π, basisVec_apply, eq_comm] using + (congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec j)) hlin).symm + +@[simp] theorem coordOnIsBoundedDomain_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hBounded : IsBoundedDomain U) (i : Fin d) (x : Vec d) : + (H1Function.coordOnIsBoundedDomain hU hBounded i) x = x i := + by + simp [H1Function.coordOnIsBoundedDomain] + +@[simp] theorem coordOnIsBoundedDomain_grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : MeasurableSet U) (hBounded : IsBoundedDomain U) (i : Fin d) (x : Vec d) : + (H1Function.coordOnIsBoundedDomain hU hBounded i).grad x = basisVec i := + by + simp [H1Function.coordOnIsBoundedDomain] + +noncomputable def coordOnIsSobolevRegularDomain {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (i : Fin d) : + H1Function U := + H1Function.coordOnIsBoundedDomain hU.measurableSet hU.isBoundedDomain i + +@[simp] theorem coordOnIsSobolevRegularDomain_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (i : Fin d) (x : Vec d) : + (H1Function.coordOnIsSobolevRegularDomain hU i) x = x i := by + simp [H1Function.coordOnIsSobolevRegularDomain] + +@[simp] theorem coordOnIsSobolevRegularDomain_grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (i : Fin d) (x : Vec d) : + (H1Function.coordOnIsSobolevRegularDomain hU i).grad x = basisVec i := by + simp [H1Function.coordOnIsSobolevRegularDomain] + +/-- The componentwise average gradient of an `H¹` function on a finite-measure +domain. -/ +noncomputable def averageGradient {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (u : H1Function U) : Vec d := + fun i => integralAverage U (fun x => u.grad x i) + +/-- If each gradient coordinate of an `H¹` function has zero integral, then its +componentwise average gradient vanishes. -/ +theorem averageGradient_eq_zero_of_integral_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) + (hzero : (fun i => ∫ x in U, u.grad x i ∂MeasureTheory.volume) = 0) : + u.averageGradient = 0 := by + ext i + change integralAverage U (fun x => u.grad x i) = 0 + unfold integralAverage + rw [show ∫ x in U, u.grad x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hzero i] + simp + +/-- The affine `H¹` function on a Sobolev-regular domain with constant gradient +`p`. -/ +noncomputable def affineOnIsSobolevRegularDomain {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (p : Vec d) : H1Function U := by + classical + let R : ℝ := Classical.choose hU.isBoundedDomain + have hR : ∀ x ∈ U, ∀ i, |x i| ≤ R := (Classical.choose_spec hU.isBoundedDomain).2 + let π : Vec d →L[ℝ] ℝ := ∑ i : Fin d, p i • ContinuousLinearMap.proj i + refine + { toFun := fun x => π x + grad := fun _ => p + memL2 := by + let C : ℝ := ∑ i : Fin d, ‖p i‖ * R + refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) π.continuous.aestronglyMeasurable C ?_ + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + refine Filter.Eventually.of_forall ?_ + intro x hx + calc + ‖π x‖ = ‖∑ i : Fin d, p i * x i‖ := by + simp [π, ContinuousLinearMap.proj_apply] + _ ≤ ∑ i : Fin d, ‖p i * x i‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖p i‖ * ‖x i‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖p i‖ * R := by + refine Finset.sum_le_sum ?_ + intro i hi + have hxi : ‖x i‖ ≤ R := by + simpa [Real.norm_eq_abs] using hR x hx i + exact mul_le_mul_of_nonneg_left hxi (norm_nonneg _) + _ = C := rfl + gradMemL2 := by + intro i + simpa using + (MeasureTheory.memLp_const + (μ := volumeMeasureOn U) + (p := (2 : ENNReal)) + (c := p i)) + hasWeakGradient := by + intro i + have hpart : + HasWeakPartialDerivOn U i (fun x : Vec d => π x) + (fun x => (fderiv ℝ (fun y : Vec d => π y) x) (basisVec i)) := + HasWeakPartialDerivOn.of_contDiff + (i := i) + (f := fun x : Vec d => π x) + (hf := π.contDiff) + have hbasis : π (basisVec i) = p i := by + simp [π, basisVec_apply, ContinuousLinearMap.proj_apply, eq_comm] + intro φ hφ_smooth hφ_compact hφ_sub + simpa [hbasis] using hpart φ hφ_smooth hφ_compact hφ_sub } + +@[simp] theorem affineOnIsSobolevRegularDomain_apply {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (p : Vec d) (x : Vec d) : + (H1Function.affineOnIsSobolevRegularDomain hU p) x = ∑ i : Fin d, p i * x i := by + simp [H1Function.affineOnIsSobolevRegularDomain] + +@[simp] theorem affineOnIsSobolevRegularDomain_grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (p : Vec d) (x : Vec d) : + (H1Function.affineOnIsSobolevRegularDomain hU p).grad x = p := by + simp [H1Function.affineOnIsSobolevRegularDomain] + +/-- The affine `H¹` function with gradient equal to `u.averageGradient`. -/ +noncomputable def averageGradientAffineOnIsSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (u : H1Function U) : H1Function U := + H1Function.affineOnIsSobolevRegularDomain hU u.averageGradient + +@[simp] theorem averageGradientAffineOnIsSobolevRegularDomain_grad + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (u : H1Function U) (x : Vec d) : + (u.averageGradientAffineOnIsSobolevRegularDomain hU).grad x = u.averageGradient := by + simp [H1Function.averageGradientAffineOnIsSobolevRegularDomain] + +@[simp] theorem sub_averageGradientAffineOnIsSobolevRegularDomain_grad + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (u : H1Function U) (x : Vec d) : + (u - u.averageGradientAffineOnIsSobolevRegularDomain hU).grad x = + u.grad x - u.averageGradient := by + ext i + calc + (u - u.averageGradientAffineOnIsSobolevRegularDomain hU).grad x i + = (u.grad x + (-1 : ℝ) • + (u.averageGradientAffineOnIsSobolevRegularDomain hU).grad x) i := by + rfl + _ = u.grad x i + (-1 : ℝ) * (u.averageGradientAffineOnIsSobolevRegularDomain hU).grad x i := by + simp + _ = u.grad x i + -u.averageGradient i := by + simp [H1Function.averageGradientAffineOnIsSobolevRegularDomain] + _ = u.grad x i - u.averageGradient i := by + ring + _ = (u.grad x - u.averageGradient) i := by + rfl + +/-- Honest `H¹` affine decomposition: subtracting the affine function with +gradient `averageGradient` leaves an `H¹` function whose gradient has zero +average. -/ +theorem exists_h1_sub_averageGradient_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (u : H1Function U) : + ∃ w : H1Function U, + w.grad = fun x => u.grad x - u.averageGradient := by + refine ⟨u - u.averageGradientAffineOnIsSobolevRegularDomain hU, ?_⟩ + funext x + exact u.sub_averageGradientAffineOnIsSobolevRegularDomain_grad hU x + +/-- If the average gradient vanishes and the domain has nonzero volume, then +the componentwise gradient integrals vanish. -/ +theorem integral_eq_zero_of_averageGradient_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H1Function U) (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (havg : u.averageGradient = 0) : + (fun i => ∫ x in U, u.grad x i ∂MeasureTheory.volume) = 0 := by + ext i + have havi : integralAverage U (fun x => u.grad x i) = 0 := by + simpa [H1Function.averageGradient] using congrFun havg i + unfold integralAverage at havi + have hm := congrArg (fun t : ℝ => (MeasureTheory.volume U).toReal * t) havi + field_simp [hvol] at hm + simpa using hm + +end H1Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLp.lean new file mode 100644 index 0000000000..5fd1ea131a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLp.lean @@ -0,0 +1,695 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpSmooth +public import Mathlib.MeasureTheory.Function.LocallyIntegrable +public import Mathlib.MeasureTheory.Integral.DominatedConvergence + +/-! # Poincare Lp -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Finite-`p` convex-domain Poincare scaffolding + +This wrapper module will be the stable import target for the future bounded +open convex domain `L^p` Poincare theorem family. For now it re-exports the +first two implementation layers: + +- segment geometry and smooth FTC along affine segments; +- the mean-minus-average integral identity. + +The eventual theorem surface should live here once the nested integral estimates +and the final convex-domain `L^p` bound are in place. +-/ + +private theorem continuous_integral_norm_fderiv_along_segment + {d : ℕ} {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + Continuous (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hseg_cont : Continuous (fun p : Vec d × ℝ => segmentBlend x p.2 p.1) := by + simpa [segmentBlend, AffineMap.lineMap_apply_module', add_comm] using + (show Continuous (fun p : Vec d × ℝ => p.1 + p.2 • (x - p.1)) from + (continuous_fst.add + (continuous_snd.smul + ((show Continuous (fun _ : Vec d × ℝ => x) from continuous_const).sub + continuous_fst)))) + have hkernel : + Continuous (fun p : Vec d × ℝ => ‖fderiv ℝ u (segmentBlend x p.2 p.1)‖) := + continuous_norm.comp (hfderiv_cont.comp hseg_cont) + simpa using + (intervalIntegral.continuous_parametric_intervalIntegral_of_continuous' + (μ := MeasureTheory.volume) + (f := fun y t => ‖fderiv ℝ u (segmentBlend x t y)‖) + hkernel (0 : ℝ) 1) + +private theorem continuous_integral_norm_fderiv_mul_norm_sub_along_segment + {d : ℕ} {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + Continuous (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hseg_cont : Continuous (fun p : Vec d × ℝ => segmentBlend x p.2 p.1) := by + simpa [segmentBlend, AffineMap.lineMap_apply_module', add_comm] using + (show Continuous (fun p : Vec d × ℝ => p.1 + p.2 • (x - p.1)) from + (continuous_fst.add + (continuous_snd.smul + ((show Continuous (fun _ : Vec d × ℝ => x) from continuous_const).sub + continuous_fst)))) + have hkernel : + Continuous (fun p : Vec d × ℝ => + ‖fderiv ℝ u (segmentBlend x p.2 p.1)‖ * ‖x - p.1‖) := by + exact + (continuous_norm.comp (hfderiv_cont.comp hseg_cont)).mul + (continuous_norm.comp + ((show Continuous (fun p : Vec d × ℝ => x - p.1) from + (show Continuous (fun _ : Vec d × ℝ => x) from continuous_const).sub + continuous_fst))) + simpa using + (intervalIntegral.continuous_parametric_intervalIntegral_of_continuous' + (μ := MeasureTheory.volume) + (f := fun y t => ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖) + hkernel (0 : ℝ) 1) + +private theorem integrableOn_norm_fderiv_mul_norm_sub_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + MeasureTheory.IntegrableOn + (fun z : Vec d => ‖fderiv ℝ u z‖ * ‖x - z‖) + U := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hcont : Continuous (fun z : Vec d => ‖fderiv ℝ u z‖ * ‖x - z‖) := + (continuous_norm.comp hfderiv_cont).mul + (continuous_norm.comp ((show Continuous (fun z : Vec d => x - z) from + (show Continuous (fun _ : Vec d => x) from continuous_const).sub continuous_id))) + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + exact (hcont.continuousOn.integrableOn_compact hcompact).mono_set subset_closure + +private theorem integrableOn_norm_fderiv_mul_rieszKernel_of_isSobolevRegularDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) {x : Vec d} (hx : x ∈ U) : + MeasureTheory.IntegrableOn + (fun z : Vec d => ‖fderiv ℝ u z‖ * rieszKernel x z) + U := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + have hkernel_int : + MeasureTheory.IntegrableOn (fun z : Vec d => rieszKernel x z) U MeasureTheory.volume := + hU.isBoundedDomain.integrableOn_rieszKernel hx + have hcontOn : ContinuousOn (fun z : Vec d => ‖fderiv ℝ u z‖) (closure U) := + (continuous_norm.comp hfderiv_cont).continuousOn + simpa [mul_comm] using + hkernel_int.mul_continuousOn_of_subset hcontOn hU.measurableSet hcompact subset_closure + +private theorem integrable_segmentBlend_norm_fderiv_mul_norm_sub_prod_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + MeasureTheory.Integrable + (fun p : ℝ × Vec d => ‖fderiv ℝ u (segmentBlend x p.1 p.2)‖ * ‖x - p.2‖) + ((MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)).prod + (MeasureTheory.volume.restrict U)) := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hseg_cont : Continuous (fun p : ℝ × Vec d => segmentBlend x p.1 p.2) := by + simpa [segmentBlend, AffineMap.lineMap_apply_module', add_comm] using + (show Continuous (fun p : ℝ × Vec d => p.2 + p.1 • (x - p.2)) from + continuous_snd.add + (continuous_fst.smul + ((show Continuous (fun _ : ℝ × Vec d => x) from continuous_const).sub + continuous_snd))) + have hcont : + Continuous + (fun p : ℝ × Vec d => ‖fderiv ℝ u (segmentBlend x p.1 p.2)‖ * ‖x - p.2‖) := by + exact + (continuous_norm.comp (hfderiv_cont.comp hseg_cont)).mul + (continuous_norm.comp + ((show Continuous (fun p : ℝ × Vec d => x - p.2) from + (show Continuous (fun _ : ℝ × Vec d => x) from continuous_const).sub + continuous_snd))) + have hcompact : + IsCompact ((Set.Icc (0 : ℝ) 1) ×ˢ closure U) := + isCompact_Icc.prod hU.isBoundedDomain.isBounded.isCompact_closure + have hprod_int : + MeasureTheory.IntegrableOn + (fun p : ℝ × Vec d => ‖fderiv ℝ u (segmentBlend x p.1 p.2)‖ * ‖x - p.2‖) + ((Set.Icc (0 : ℝ) 1) ×ˢ closure U) + (MeasureTheory.volume.prod MeasureTheory.volume) := + hcont.continuousOn.integrableOn_compact hcompact + have hsub : + (Set.Ioc (0 : ℝ) 1) ×ˢ U ⊆ (Set.Icc (0 : ℝ) 1) ×ˢ closure U := by + intro p hp + exact ⟨Set.Ioc_subset_Icc_self hp.1, subset_closure hp.2⟩ + simpa [MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using + hprod_int.mono_set hsub + +theorem integrableOn_integral_norm_fderiv_along_segment_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + MeasureTheory.IntegrableOn + (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) + U := by + have hcont : Continuous (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) := + continuous_integral_norm_fderiv_along_segment huDiff x + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + exact (hcont.continuousOn.integrableOn_compact hcompact).mono_set subset_closure + +theorem integrableOn_integral_norm_fderiv_mul_norm_sub_along_segment_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + MeasureTheory.IntegrableOn + (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) + U := by + have hcont : Continuous (fun y : Vec d => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) := + continuous_integral_norm_fderiv_mul_norm_sub_along_segment huDiff x + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + exact (hcont.continuousOn.integrableOn_compact hcompact).mono_set subset_closure + +theorem norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_norm_sub_along_segment + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : Vec d → ℝ} (hu : MeasureTheory.IntegrableOn u U) + (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (hsegment : + MeasureTheory.IntegrableOn + (fun y => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖) + U) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume := by + have hμinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have hconstInt : MeasureTheory.IntegrableOn (fun _ : Vec d => u x) U := by + simp [MeasureTheory.IntegrableOn] + have hsubInt : MeasureTheory.IntegrableOn (fun y => u x - u y) U := by + simpa using! hconstInt.sub hu + have hleftInt : MeasureTheory.IntegrableOn (fun y => ‖u x - u y‖) U := hsubInt.norm + have hmono : + (fun y => ‖u x - u y‖) ≤ᵐ[volumeMeasureOn U] + (fun y => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) := by + filter_upwards [] with y + exact norm_sub_le_integral_norm_fderiv_mul_norm_sub_along_segment huDiff x y + have hint : + ∫ y in U, ‖u x - u y‖ ∂MeasureTheory.volume ≤ + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (MeasureTheory.integral_mono_ae hleftInt hsegment hmono) + calc + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ‖u x - u y‖ ∂MeasureTheory.volume := + norm_sub_integralAverage_le_volumeAverage_integral_norm_sub hu x hvol + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hint hμinv_nonneg + +theorem norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_norm_sub_along_segment_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) {u : Vec d → ℝ} + (hu : MeasureTheory.IntegrableOn u U) (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := + norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_norm_sub_along_segment + hu huDiff x hvol + (integrableOn_integral_norm_fderiv_mul_norm_sub_along_segment_of_isSobolevRegularDomain + hU huDiff x) + +private theorem setIntegral_intervalIntegral_norm_fderiv_mul_norm_sub_along_segment_swap + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) (x : Vec d) : + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume + = + ∫ t in (0 : ℝ)..1, ∫ y in U, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + have hprod_int : + MeasureTheory.Integrable + (fun p : ℝ × Vec d => ‖fderiv ℝ u (segmentBlend x p.1 p.2)‖ * ‖x - p.2‖) + ((MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)).prod + (MeasureTheory.volume.restrict U)) := + integrable_segmentBlend_norm_fderiv_mul_norm_sub_prod_of_isSobolevRegularDomain + hU huDiff x + have hprod_int' : + MeasureTheory.Integrable + (Function.uncurry fun t y => + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) 1)).prod + (MeasureTheory.volume.restrict U)) := by + simpa [Function.uncurry, Set.uIoc_of_le zero_le_one] using! hprod_int + simpa [Set.uIoc_of_le zero_le_one] using + (MeasureTheory.intervalIntegral_integral_swap + (μ := MeasureTheory.volume.restrict U) + (a := (0 : ℝ)) (b := 1) + (f := fun t y => ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖) + hprod_int').symm + +theorem intervalIntegral_setIntegral_norm_fderiv_mul_norm_sub_along_segment_le_rieszKernel_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) {x : Vec d} (hx : x ∈ U) : + ∫ t in (0 : ℝ)..1, ∫ y in U, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume + ≤ + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume := by + let φ : Vec d → ℝ := fun z => ‖fderiv ℝ u z‖ + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hφ_nonneg : ∀ z, 0 ≤ φ z := by + intro z + exact norm_nonneg _ + have hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U) := + hfderiv_cont.norm.measurable.aemeasurable + have hφ_int : + MeasureTheory.IntegrableOn (fun z => φ z * ‖x - z‖) U MeasureTheory.volume := by + simpa [φ] using + integrableOn_norm_fderiv_mul_norm_sub_of_isSobolevRegularDomain + hU.isSobolevRegularDomain huDiff x + have hφK_int : + MeasureTheory.IntegrableOn (fun z => φ z * rieszKernel x z) U MeasureTheory.volume := by + simpa [φ] using + integrableOn_norm_fderiv_mul_rieszKernel_of_isSobolevRegularDomain + (d := d) hU.isSobolevRegularDomain huDiff hx + have hR : 0 < 2 * Classical.choose hU.isBoundedDomain := by + have hchoose_pos : 0 < Classical.choose hU.isBoundedDomain := + (Classical.choose_spec hU.isBoundedDomain).1 + linarith + have hleft_int : + IntervalIntegrable + (fun t => + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume) + MeasureTheory.volume 0 1 := by + rw [intervalIntegrable_iff_integrableOn_Ioc_of_le zero_le_one] + simpa [MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict, φ] using + (integrable_segmentBlend_norm_fderiv_mul_norm_sub_prod_of_isSobolevRegularDomain + hU.isSobolevRegularDomain huDiff x).integral_prod_left + have hright_int : + IntervalIntegrable + (fun t => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ + Metric.closedBall x ((1 - t) * (2 * Classical.choose hU.isBoundedDomain)), + φ z * ‖x - z‖ ∂MeasureTheory.volume) + MeasureTheory.volume 0 1 := + intervalIntegrable_inv_pow_setIntegral_inter_closedBall + (d := d) hU.isOpen.measurableSet hR hφ_nonneg hφ_meas hφK_int + have hpointwise : + ∀ t ∈ Set.Ioo (0 : ℝ) 1, + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + ≤ + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ + Metric.closedBall x ((1 - t) * (2 * Classical.choose hU.isBoundedDomain)), + φ z * ‖x - z‖ ∂MeasureTheory.volume := by + intro t ht + exact + setIntegral_segmentBlend_mul_norm_sub_le_inv_pow_mul_setIntegral_inter_closedBall + hU hx ht.1.le ht.2 hφ_int hφ_nonneg + calc + ∫ t in (0 : ℝ)..1, ∫ y in U, + φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume + ≤ + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ + Metric.closedBall x ((1 - t) * (2 * Classical.choose hU.isBoundedDomain)), + φ z * ‖x - z‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + exact + intervalIntegral.integral_mono_on_of_le_Ioo + zero_le_one hleft_int hright_int hpointwise + _ ≤ (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + exact + intervalIntegral_inv_pow_setIntegral_inter_closedBall_le_rieszKernel + (d := d) hU.isOpen.measurableSet hR hφ_nonneg hφ_meas hφK_int + _ = (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume := by + simp [φ] + +theorem setIntegral_intervalIntegral_norm_fderiv_mul_norm_sub_along_segment_le_rieszKernel_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) {x : Vec d} (hx : x ∈ U) : + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume + ≤ + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume := by + rw [setIntegral_intervalIntegral_norm_fderiv_mul_norm_sub_along_segment_swap + hU.isSobolevRegularDomain huDiff x] + exact + intervalIntegral_setIntegral_norm_fderiv_mul_norm_sub_along_segment_le_rieszKernel_of_isOpenBoundedConvexDomain + (d := d) hU huDiff hx + +theorem norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_rieszKernel_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) {u : Vec d → ℝ} + (hu : MeasureTheory.IntegrableOn u U) (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {x : Vec d} (hx : x ∈ U) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ((((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume) := by + have hμinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + calc + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := + norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_norm_sub_along_segment_of_isSobolevRegularDomain + hU.isSobolevRegularDomain hu huDiff x hvol + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + ((((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) * + ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume) := by + exact mul_le_mul_of_nonneg_left + (setIntegral_intervalIntegral_norm_fderiv_mul_norm_sub_along_segment_le_rieszKernel_of_isOpenBoundedConvexDomain + (d := d) hU huDiff hx) + hμinv_nonneg + +private theorem integrableOn_norm_fderiv_rpow_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {p : ℝ} (hp : 0 < p) : + MeasureTheory.IntegrableOn + (fun z : Vec d => ‖fderiv ℝ u z‖ ^ p) + U := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hp_nonneg : 0 ≤ p := le_of_lt hp + have hcont : Continuous (fun z : Vec d => ‖fderiv ℝ u z‖ ^ p) := + (continuous_norm.comp hfderiv_cont).rpow_const (fun _ => Or.inr hp_nonneg) + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + exact (hcont.continuousOn.integrableOn_compact hcompact).mono_set subset_closure + +private theorem integrableOn_prod_norm_fderiv_rpow_mul_rieszKernel_of_isSobolevRegularDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {u : Vec d → ℝ} (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {p : ℝ} (hp : 0 < p) : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => (‖fderiv ℝ u z.2‖ ^ p) * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume) := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hp_nonneg : 0 ≤ p := le_of_lt hp + have hkernel_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume) := + integrableOn_prod_rieszKernel_of_isSobolevRegularDomain (d := d) hU + have hcontOn : + ContinuousOn + (fun z : Vec d × Vec d => ‖fderiv ℝ u z.2‖ ^ p) + (closure U ×ˢ closure U) := by + have hcont : Continuous (fun z : Vec d × Vec d => ‖fderiv ℝ u z.2‖ ^ p) := + (continuous_norm.comp (hfderiv_cont.comp continuous_snd)).rpow_const + (fun _ => Or.inr hp_nonneg) + exact hcont.continuousOn + have hcompact : IsCompact (closure U ×ˢ closure U) := + hU.isBoundedDomain.isBounded.isCompact_closure.prod + hU.isBoundedDomain.isBounded.isCompact_closure + have hsub : U ×ˢ U ⊆ closure U ×ˢ closure U := by + intro z hz + exact ⟨subset_closure hz.1, subset_closure hz.2⟩ + simpa [mul_comm] using + hkernel_int.mul_continuousOn_of_subset hcontOn + (hU.measurableSet.prod hU.measurableSet) hcompact hsub + +private theorem integrableOn_norm_sub_integralAverage_rpow_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) {u : Vec d → ℝ} + (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {p : ℝ} (hp : 0 < p) : + MeasureTheory.IntegrableOn + (fun x : Vec d => ‖u x - integralAverage U u‖ ^ p) + U := by + have hp_nonneg : 0 ≤ p := le_of_lt hp + have hu_cont : Continuous u := huDiff.continuous + have hcont : Continuous (fun x : Vec d => ‖u x - integralAverage U u‖ ^ p) := + (continuous_norm.comp (hu_cont.sub continuous_const)).rpow_const + (fun _ => Or.inr hp_nonneg) + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + exact (hcont.continuousOn.integrableOn_compact hcompact).mono_set subset_closure + +theorem integral_rpow_norm_sub_integralAverage_le_bound_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) {u : Vec d → ℝ} + (hu : MeasureTheory.IntegrableOn u U) (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {p : ℝ} (hp : 1 < p) (hvol : 0 < (MeasureTheory.volume U).toReal) : + ∫ x in U, ‖u x - integralAverage U u‖ ^ p ∂MeasureTheory.volume ≤ + (((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ p) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ p) * + ∫ y in U, ‖fderiv ℝ u y‖ ^ p ∂MeasureTheory.volume) := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let B : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) + let M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + let g : Vec d → ℝ := fun y => ‖fderiv ℝ u y‖ + have hp_pos : 0 < p := lt_trans zero_lt_one hp + have hp_nonneg : 0 ≤ p := le_of_lt hp_pos + have hchoose_pos : 0 < Classical.choose hU.isBoundedDomain := + (Classical.choose_spec hU.isBoundedDomain).1 + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + have hg_nonneg : ∀ y, 0 ≤ g y := by + intro y + exact norm_nonneg _ + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := huDiff.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hg_meas : AEMeasurable g μU := + hfderiv_cont.norm.measurable.aemeasurable + have hgK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => g z.2 * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume) := by + simpa [g] using + integrableOn_prod_norm_fderiv_rpow_mul_rieszKernel_of_isSobolevRegularDomain + (d := d) hU.isSobolevRegularDomain huDiff (p := (1 : ℝ)) zero_lt_one + have hgp_int : + MeasureTheory.IntegrableOn + (fun y => (g y) ^ p) U MeasureTheory.volume := by + simpa [g] using + integrableOn_norm_fderiv_rpow_of_isSobolevRegularDomain + hU.isSobolevRegularDomain huDiff hp_pos + have hgpK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => (g z.2) ^ p * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume) := by + simpa [g] using + integrableOn_prod_norm_fderiv_rpow_mul_rieszKernel_of_isSobolevRegularDomain + (d := d) hU.isSobolevRegularDomain huDiff hp_pos + have hleft_int : + MeasureTheory.Integrable + (fun x => ‖u x - integralAverage U u‖ ^ p) μU := by + simpa [μU, MeasureTheory.IntegrableOn] using + integrableOn_norm_sub_integralAverage_rpow_of_isSobolevRegularDomain + hU.isSobolevRegularDomain huDiff hp_pos + have hkernel_pow_int : + MeasureTheory.Integrable + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := + integrable_rpow_integral_mul_rieszKernel_of_isSobolevRegularDomain + hU.isSobolevRegularDomain hp hg_nonneg hg_meas hgK_prod_int hgpK_prod_int + have hright_int : + MeasureTheory.Integrable + (fun x => (B * ∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := by + have htmp : + MeasureTheory.Integrable + (fun x => B ^ p * (∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := hkernel_pow_int.const_mul (B ^ p) + refine htmp.congr ?_ + filter_upwards with x + have hinner_nonneg : 0 ≤ ∫ y, g y * rieszKernel x y ∂μU := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall + (fun y => mul_nonneg (hg_nonneg y) (rieszKernel_nonneg x y))) + rw [Real.mul_rpow hB_nonneg hinner_nonneg] + have hpointwise : + (fun x => ‖u x - integralAverage U u‖ ^ p) ≤ᵐ[μU] + (fun x => (B * ∫ y, g y * rieszKernel x y ∂μU) ^ p) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hx + have hbase : + ‖u x - integralAverage U u‖ ≤ + B * ∫ z in U, ‖fderiv ℝ u z‖ * rieszKernel x z ∂MeasureTheory.volume := by + simpa [B, g, μU, mul_assoc] using + norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_rieszKernel_of_isOpenBoundedConvexDomain + (d := d) hU hu huDiff hx hvol + have hright_nonneg : 0 ≤ + B * ∫ y, g y * rieszKernel x y ∂μU := by + have hinner_nonneg : 0 ≤ ∫ y, g y * rieszKernel x y ∂μU := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall + (fun y => mul_nonneg (hg_nonneg y) (rieszKernel_nonneg x y))) + exact mul_nonneg hB_nonneg hinner_nonneg + exact Real.rpow_le_rpow (norm_nonneg _) hbase hp_nonneg + have hBpow_nonneg : 0 ≤ B ^ p := Real.rpow_nonneg hB_nonneg _ + calc + ∫ x in U, ‖u x - integralAverage U u‖ ^ p ∂MeasureTheory.volume + = ∫ x, ‖u x - integralAverage U u‖ ^ p ∂μU := by + rfl + _ ≤ ∫ x, (B * ∫ y, g y * rieszKernel x y ∂μU) ^ p ∂μU := by + exact MeasureTheory.integral_mono_ae hleft_int hright_int hpointwise + _ = ∫ x, B ^ p * (∫ y, g y * rieszKernel x y ∂μU) ^ p ∂μU := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + have hinner_nonneg : 0 ≤ ∫ y, g y * rieszKernel x y ∂μU := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall + (fun y => mul_nonneg (hg_nonneg y) (rieszKernel_nonneg x y))) + rw [Real.mul_rpow hB_nonneg hinner_nonneg] + _ = B ^ p * ∫ x, (∫ y, g y * rieszKernel x y ∂μU) ^ p ∂μU := by + rw [MeasureTheory.integral_const_mul] + _ ≤ B ^ p * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ p) * + ∫ y in U, (g y) ^ p ∂MeasureTheory.volume) := by + apply mul_le_mul_of_nonneg_left ?_ hBpow_nonneg + simpa [μU, M] using + integral_rpow_integral_mul_rieszKernel_le_bound_of_isSobolevRegularDomain + hU.isSobolevRegularDomain hp hg_nonneg hg_meas hgK_prod_int hgp_int hgpK_prod_int + _ = (((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ p) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ p) * + ∫ y in U, ‖fderiv ℝ u y‖ ^ p ∂MeasureTheory.volume) := by + simp [B, g] + +theorem norm_sub_integralAverage_le_two_mul_choose_mul_volumeAverage_integral_norm_fderiv_along_segment + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) {u : Vec d → ℝ} + (hu : MeasureTheory.IntegrableOn u U) (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {x : Vec d} (hx : x ∈ U) + (hvol : 0 < (MeasureTheory.volume U).toReal) + (hsegmentMul : + MeasureTheory.IntegrableOn + (fun y => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) + U) + (hsegment : + MeasureTheory.IntegrableOn + (fun y => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) + U) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ((2 * Classical.choose hU.isBoundedDomain) * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume) := by + have hμinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + have houterScaled : + MeasureTheory.IntegrableOn + (fun y => (2 * Classical.choose hU.isBoundedDomain) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) + U := by + simpa [MeasureTheory.IntegrableOn, smul_eq_mul, mul_comm, mul_left_comm, mul_assoc] using + hsegment.integrable.const_mul (2 * Classical.choose hU.isBoundedDomain) + have hmono : + (fun y => ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume) ≤ᵐ[volumeMeasureOn U] + (fun y => (2 * Classical.choose hU.isBoundedDomain) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet] with y hy + exact + integral_norm_fderiv_mul_norm_sub_along_segment_le_two_mul_choose_mul_integral_norm_fderiv_along_segment + hU.isBoundedDomain huDiff hx hy + have houter_le : + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume ≤ + ∫ y in U, (2 * Classical.choose hU.isBoundedDomain) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ + ∂MeasureTheory.volume ∂MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (MeasureTheory.integral_mono_ae hsegmentMul houterScaled hmono) + calc + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume := + norm_sub_integralAverage_le_volumeAverage_integral_norm_fderiv_mul_norm_sub_along_segment + hu huDiff x hvol hsegmentMul + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, (2 * Classical.choose hU.isBoundedDomain) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ + ∂MeasureTheory.volume ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left houter_le hμinv_nonneg + _ = (MeasureTheory.volume U).toReal⁻¹ * + ((2 * Classical.choose hU.isBoundedDomain) * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume) := by + rw [MeasureTheory.integral_const_mul] + +theorem norm_sub_integralAverage_le_two_mul_choose_mul_volumeAverage_integral_norm_fderiv_along_segment_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) {u : Vec d → ℝ} + (hu : MeasureTheory.IntegrableOn u U) (huDiff : ContDiff ℝ (⊤ : ℕ∞) u) + {x : Vec d} (hx : x ∈ U) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ((2 * Classical.choose hU.isBoundedDomain) * + ∫ y in U, ∫ t in (0 : ℝ)..1, + ‖fderiv ℝ u (segmentBlend x t y)‖ ∂MeasureTheory.volume + ∂MeasureTheory.volume) := by + exact + norm_sub_integralAverage_le_two_mul_choose_mul_volumeAverage_integral_norm_fderiv_along_segment + hU hu huDiff hx hvol + (integrableOn_integral_norm_fderiv_mul_norm_sub_along_segment_of_isSobolevRegularDomain + hU huDiff x) + (integrableOn_integral_norm_fderiv_along_segment_of_isSobolevRegularDomain + hU huDiff x) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpIntegral.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpIntegral.lean new file mode 100644 index 0000000000..36d58a46db --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpIntegral.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero + +/-! # Poincare Lp Integral -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Integral identities for convex-domain Poincare + +This file collects the first measure-theoretic identities behind the future +convex-domain mean-zero Poincare proof. At this stage we only need the basic +algebra that rewrites `u x - average_U u` as the normalized average of the +differences `u x - u y`. +-/ + +theorem sub_integralAverage_eq_volumeAverage_sub + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : Vec d → ℝ} (hu : MeasureTheory.IntegrableOn u U) (x : Vec d) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + u x - integralAverage U u = + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, (u x - u y) ∂MeasureTheory.volume := by + have hμ_ne : (MeasureTheory.volume U).toReal ≠ 0 := by + linarith + have hconstInt : MeasureTheory.IntegrableOn (fun _ : Vec d => u x) U := by + simp [MeasureTheory.IntegrableOn] + have hconst : + ∫ y in U, (u x : ℝ) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * u x := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + let I : ℝ := ∫ y in U, u y ∂MeasureTheory.volume + have hscale : + u x - (MeasureTheory.volume U).toReal⁻¹ * I = + (MeasureTheory.volume U).toReal⁻¹ * + ((MeasureTheory.volume U).toReal * u x - I) := by + field_simp [hμ_ne] + calc + u x - integralAverage U u + = u x - (MeasureTheory.volume U).toReal⁻¹ * I := by + simp [I, integralAverage] + _ = (MeasureTheory.volume U).toReal⁻¹ * + ((MeasureTheory.volume U).toReal * u x - + I) := hscale + _ = (MeasureTheory.volume U).toReal⁻¹ * + ((∫ y in U, u x ∂MeasureTheory.volume) - I) := by + rw [← hconst] + _ = (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, (u x - u y) ∂MeasureTheory.volume := by + change (MeasureTheory.volume U).toReal⁻¹ * + ((∫ y in U, u x ∂MeasureTheory.volume) - + ∫ y in U, u y ∂MeasureTheory.volume) = + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, (u x - u y) ∂MeasureTheory.volume + rw [MeasureTheory.integral_sub hconstInt.integrable hu.integrable] + +theorem norm_sub_integralAverage_le_volumeAverage_integral_norm_sub + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {u : Vec d → ℝ} (hu : MeasureTheory.IntegrableOn u U) (x : Vec d) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ‖u x - integralAverage U u‖ ≤ + (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ‖u x - u y‖ ∂MeasureTheory.volume := by + have hμinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by + positivity + calc + ‖u x - integralAverage U u‖ + = ‖(MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, (u x - u y) ∂MeasureTheory.volume‖ := by + rw [sub_integralAverage_eq_volumeAverage_sub hu x hvol] + _ = (MeasureTheory.volume U).toReal⁻¹ * + ‖∫ y in U, (u x - u y) ∂MeasureTheory.volume‖ := by + rw [norm_mul, Real.norm_of_nonneg hμinv_nonneg] + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + ∫ y in U, ‖u x - u y‖ ∂MeasureTheory.volume := by + gcongr + exact MeasureTheory.norm_integral_le_integral_norm (fun y => u x - u y) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel.lean new file mode 100644 index 0000000000..9d5f5babab --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel.lean @@ -0,0 +1,22 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.SegmentChangeOfVariables +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.TimeCollapse +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.RieszPowerMean + +/-! +# Riesz-kernel tools for convex-domain Poincare (aggregate re-export) + +The contents of this file previously lived as one monolithic module; it has +been split along section boundaries into the four modules imported above. +This shim re-exports everything so downstream consumers keep working. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/Basic.lean new file mode 100644 index 0000000000..bfe93fcb85 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/Basic.lean @@ -0,0 +1,365 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import Mathlib.MeasureTheory.Constructions.HaarToSphere +public import Mathlib.MeasureTheory.Function.L1Space.Integrable +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Haar.NormedSpace + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric +open scoped ENNReal NNReal Pointwise + +/-! +# Riesz-kernel tools for convex-domain Poincare — basic estimates + +This file defines the Riesz kernel `(x, y) ↦ ‖x - y‖^(1 - d)` and establishes +its basic positivity, symmetry, and ball-localised `L¹` bounds. The bounded- +domain `L¹` size is controlled by the radius of `IsBoundedDomain`. +-/ + +/-- The order-`1` Riesz kernel in dimension `d`. -/ +noncomputable def rieszKernel {d : ℕ} (x y : Vec d) : ℝ := + ‖x - y‖ ^ (1 - (d : ℝ)) + +theorem rieszKernel_nonneg {d : ℕ} (x y : Vec d) : + 0 ≤ rieszKernel x y := by + unfold rieszKernel + exact Real.rpow_nonneg (norm_nonneg _) _ + +theorem rieszKernel_symm {d : ℕ} (x y : Vec d) : + rieszKernel x y = rieszKernel y x := by + simp [rieszKernel, norm_sub_rev] + +section NeZero + +variable {d : ℕ} [NeZero d] + +/-- Cache `Nontrivial (Vec d)` once per section so tactic-level typeclass +searches don't rediscover the NeZero → Nonempty → Nontrivial chain. -/ +private instance instNontrivialVecNeZero : Nontrivial (Vec d) := inferInstance + +private theorem integral_norm_rpow_one_sub_dim_ball {R : ℝ} (hR : 0 < R) : + ∫ x in Metric.ball (0 : Vec d) R, ‖x‖ ^ (1 - (d : ℝ)) ∂MeasureTheory.volume = + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * R := by + let f : ℝ → ℝ := fun r => if 0 < r ∧ r < R then r ^ (1 - (d : ℝ)) else 0 + have hconv : + ∫ x in Metric.ball (0 : Vec d) R, ‖x‖ ^ (1 - (d : ℝ)) ∂MeasureTheory.volume = + ∫ x : Vec d, f (‖x‖) ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_indicator measurableSet_ball] + refine MeasureTheory.integral_congr_ae ?_ + have hmeas0 : + (MeasureTheory.volume : Measure (Vec d)) {(0 : Vec d)} = 0 := by + exact MeasureTheory.measure_singleton _ + have hae : + ∀ᵐ x ∂(MeasureTheory.volume : Measure (Vec d)), x ∈ ({(0 : Vec d)} : Set (Vec d))ᶜ := + MeasureTheory.compl_mem_ae_iff.mpr hmeas0 + filter_upwards [hae] with x hx + simp only [f, Set.indicator, Metric.mem_ball, dist_zero_right] + have hx' : x ≠ (0 : Vec d) := by + simpa using hx + have hpos : 0 < ‖x‖ := norm_pos_iff.mpr hx' + simp only [and_iff_right hpos] + have hrad : + ∫ x : Vec d, f (‖x‖) ∂MeasureTheory.volume = + (Module.finrank ℝ (Vec d) : ℝ) • + (MeasureTheory.volume : Measure (Vec d)).real (Metric.ball 0 1) • + ∫ y in Set.Ioi (0 : ℝ), y ^ (Module.finrank ℝ (Vec d) - 1) • f y := by + simpa [nsmul_eq_mul] using + (MeasureTheory.integral_fun_norm_addHaar + (μ := (MeasureTheory.volume : Measure (Vec d))) f) + have hfin : Module.finrank ℝ (Vec d) = d := by + simp [Vec] + have h1d : + ∫ y in Set.Ioi (0 : ℝ), y ^ (Module.finrank ℝ (Vec d) - 1) • f y = R := by + rw [hfin] + have hR_nonneg : 0 ≤ R := le_of_lt hR + have hsupp : + ∀ y ∈ Set.Ioi (0 : ℝ), y ^ (d - 1) • f y = + Set.indicator (Set.Ioo 0 R) (fun _ => (1 : ℝ)) y := by + intro y hy + have hy_pos : 0 < y := hy + by_cases hlt : y < R + · simp only [f, smul_eq_mul, Set.indicator, Set.mem_Ioo, hy_pos, hlt, true_and, + if_true] + rw [← Real.rpow_natCast y (d - 1), + Nat.cast_sub (Nat.one_le_iff_ne_zero.mpr (NeZero.ne d)), + ← Real.rpow_add hy_pos] + norm_num + · simp only [f, smul_eq_mul, Set.indicator, Set.mem_Ioo, hy_pos, hlt, true_and, + if_false, mul_zero] + rw [MeasureTheory.setIntegral_congr_fun measurableSet_Ioi hsupp] + rw [MeasureTheory.integral_indicator measurableSet_Ioo] + simp [Measure.restrict_restrict, Set.inter_comm, Set.inter_eq_left.mpr Set.Ioo_subset_Ioi_self, + smul_eq_mul, mul_one, + Measure.real, Real.volume_Ioo, ENNReal.toReal_ofReal hR_nonneg] + rw [hconv, hrad, h1d, hfin] + simp [Measure.real] + ring + +theorem rieszKernel_integrableOn_ball {R : ℝ} (_hR : 0 < R) : + MeasureTheory.IntegrableOn + (fun x : Vec d => ‖x‖ ^ (1 - (d : ℝ))) + (Metric.ball (0 : Vec d) R) MeasureTheory.volume := by + let g : ℝ → ℝ := fun r => if r < R then r ^ (1 - (d : ℝ)) else 0 + have hag : + (fun x : Vec d => ‖x‖ ^ (1 - (d : ℝ))) =ᵐ[MeasureTheory.volume.restrict (Metric.ball (0 : Vec d) R)] + (g ∘ (‖·‖)) := by + filter_upwards [MeasureTheory.ae_restrict_mem measurableSet_ball] with x hx + simp only [Function.comp_apply, g, Metric.mem_ball, dist_zero_right] at hx ⊢ + rw [if_pos hx] + rw [MeasureTheory.IntegrableOn, MeasureTheory.integrable_congr hag] + suffices h : MeasureTheory.Integrable (fun x : Vec d => g ‖x‖) MeasureTheory.volume from + h.integrableOn + have h1d : + MeasureTheory.IntegrableOn + (fun y : ℝ => y ^ (Module.finrank ℝ (Vec d) - 1) • g y) + (Set.Ioi 0) := by + have hfin : Module.finrank ℝ (Vec d) = d := by + simp [Vec] + set hInd : ℝ → ℝ := (Set.Ioo (0 : ℝ) R).indicator (fun _ => (1 : ℝ)) + have heq : + Set.EqOn + (fun y : ℝ => y ^ (Module.finrank ℝ (Vec d) - 1) • g y) + hInd + (Set.Ioi 0) := by + intro r hr + simp only [Set.mem_Ioi] at hr + simp only [g, smul_eq_mul, hInd, Set.indicator, Set.mem_Ioo] + split_ifs with h1 h2 + · rw [hfin, ← Real.rpow_natCast r (d - 1), + Nat.cast_sub (Nat.one_le_iff_ne_zero.mpr (NeZero.ne d)), + ← Real.rpow_add hr] + norm_num + · next h2 => exact absurd ⟨hr, h1⟩ h2 + · next h1 h2 => exact absurd h2.2 h1 + · simp [mul_zero] + have hInd_int : MeasureTheory.IntegrableOn hInd (Set.Ioi 0) := by + apply MeasureTheory.Integrable.integrableOn + exact (MeasureTheory.integrable_indicator_iff measurableSet_Ioo).mpr <| + MeasureTheory.integrableOn_const (s := Set.Ioo 0 R) + (hs := measure_Ioo_lt_top.ne) + exact hInd_int.congr_fun heq.symm measurableSet_Ioi + exact (MeasureTheory.integrable_fun_norm_addHaar (μ := MeasureTheory.volume) (f := g)).mpr h1d + +theorem integrableOn_rieszKernel_ball + {R : ℝ} (hR : 0 < R) (x : Vec d) (hx : x ∈ Metric.ball (0 : Vec d) R) : + MeasureTheory.IntegrableOn (fun y : Vec d => rieszKernel x y) + (Metric.ball (0 : Vec d) R) MeasureTheory.volume := by + have hBsub : Metric.ball (0 : Vec d) R ⊆ Metric.ball x (2 * R) := by + intro y hy + rw [Metric.mem_ball, dist_eq_norm] at hy ⊢ + have hxNorm : ‖x‖ < R := by + simpa [Metric.mem_ball, dist_zero_right] using hx + have hyNorm : ‖y‖ < R := by + simpa using hy + calc + ‖y - x‖ ≤ ‖y‖ + ‖x‖ := norm_sub_le _ _ + _ < R + R := add_lt_add hyNorm hxNorm + _ = 2 * R := by ring + have hmp := MeasureTheory.measurePreserving_add_right (MeasureTheory.volume : Measure (Vec d)) x + have hemb := (MeasurableEquiv.addRight x : Vec d ≃ᵐ Vec d).measurableEmbedding + have hpre : + (· + x) ⁻¹' Metric.ball x (2 * R) = Metric.ball (0 : Vec d) (2 * R) := by + ext z + simp [Metric.mem_ball] + have hBigInt : + MeasureTheory.IntegrableOn (fun y : Vec d => rieszKernel x y) + (Metric.ball x (2 * R)) MeasureTheory.volume := by + rw [← hmp.integrableOn_comp_preimage hemb, hpre] + exact (rieszKernel_integrableOn_ball (d := d) (by linarith : 0 < 2 * R)).congr + (Filter.Eventually.of_forall (fun z => by + unfold rieszKernel + show ‖z‖ ^ (1 - (d : ℝ)) = ‖x - (z + x)‖ ^ (1 - (d : ℝ)) + simp [norm_neg])) + exact hBigInt.mono_set hBsub + +theorem integral_rieszKernel_ball_le + {R : ℝ} (hR : 0 < R) (x : Vec d) (hx : x ∈ Metric.ball (0 : Vec d) R) : + ∫ y in Metric.ball (0 : Vec d) R, rieszKernel x y ∂MeasureTheory.volume ≤ + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * (2 * R) := by + have hxDist : dist x 0 < R := Metric.mem_ball.mp hx + have hBsub : Metric.ball (0 : Vec d) R ⊆ Metric.ball x (2 * R) := by + intro y hy + rw [Metric.mem_ball] at hy ⊢ + calc + dist y x ≤ dist y 0 + dist 0 x := dist_triangle y 0 x + _ < R + R := by + rw [dist_comm] at hxDist + linarith [Metric.mem_ball.mp hy] + _ = 2 * R := by ring + calc + ∫ y in Metric.ball (0 : Vec d) R, rieszKernel x y ∂MeasureTheory.volume + ≤ ∫ z in Metric.ball (0 : Vec d) (2 * R), ‖z‖ ^ (1 - (d : ℝ)) ∂MeasureTheory.volume := by + have hmp := MeasureTheory.measurePreserving_add_right (MeasureTheory.volume : Measure (Vec d)) x + have hemb := (MeasurableEquiv.addRight x : Vec d ≃ᵐ Vec d).measurableEmbedding + have hpre : + (· + x) ⁻¹' Metric.ball x (2 * R) = Metric.ball (0 : Vec d) (2 * R) := by + ext z + simp [Metric.mem_ball] + have htrans : + ∫ y in Metric.ball x (2 * R), rieszKernel x y ∂MeasureTheory.volume = + ∫ z in Metric.ball (0 : Vec d) (2 * R), ‖z‖ ^ (1 - (d : ℝ)) ∂MeasureTheory.volume := by + rw [← hmp.setIntegral_preimage_emb hemb, hpre] + congr 1 with z + unfold rieszKernel + show ‖x - (z + x)‖ ^ (1 - (d : ℝ)) = ‖z‖ ^ (1 - (d : ℝ)) + simp [norm_neg] + have hinteg : + MeasureTheory.IntegrableOn (fun y => rieszKernel x y) + (Metric.ball x (2 * R)) MeasureTheory.volume := by + have h2R : (0 : ℝ) < 2 * R := by linarith + rw [← hmp.integrableOn_comp_preimage hemb, hpre] + exact (rieszKernel_integrableOn_ball (d := d) h2R).congr + (Filter.Eventually.of_forall (fun z => by + unfold rieszKernel + show ‖z‖ ^ (1 - (d : ℝ)) = ‖x - (z + x)‖ ^ (1 - (d : ℝ)) + simp [norm_neg])) + calc + ∫ y in Metric.ball (0 : Vec d) R, rieszKernel x y ∂MeasureTheory.volume + ≤ ∫ y in Metric.ball x (2 * R), rieszKernel x y ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_mono_set hinteg + · exact Filter.Eventually.of_forall (fun y => rieszKernel_nonneg x y) + · exact hBsub.eventuallyLE + _ = ∫ z in Metric.ball (0 : Vec d) (2 * R), ‖z‖ ^ (1 - (d : ℝ)) ∂MeasureTheory.volume := + htrans + _ = (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * (2 * R) := by + exact integral_norm_rpow_one_sub_dim_ball (d := d) (by linarith) + +end NeZero + +section BoundedDomain + +variable {d : ℕ} {U : Set (Vec d)} [NeZero d] + +/-- Cache `Nontrivial (Vec d)` once per section. -/ +private instance instNontrivialVecBounded : Nontrivial (Vec d) := inferInstance + +theorem IsBoundedDomain.integrableOn_rieszKernel + (hU : IsBoundedDomain U) {x : Vec d} (hx : x ∈ U) : + MeasureTheory.IntegrableOn (fun y : Vec d => rieszKernel x y) U MeasureTheory.volume := by + let C := Classical.choose hU + have hCpos : 0 < C := (Classical.choose_spec hU).1 + have hsub : U ⊆ Metric.ball (0 : Vec d) (2 * C) := by + intro y hy + rw [Metric.mem_ball, dist_zero_right] + calc + ‖y‖ ≤ C := hU.norm_le_choose hy + _ < 2 * C := by linarith [hCpos] + have hxBall : x ∈ Metric.ball (0 : Vec d) (2 * C) := hsub hx + have hIntBall : + MeasureTheory.IntegrableOn + (fun y : Vec d => rieszKernel x y) + (Metric.ball (0 : Vec d) (2 * C)) MeasureTheory.volume := + integrableOn_rieszKernel_ball (d := d) (by linarith [hCpos] : 0 < 2 * C) x hxBall + exact hIntBall.mono_set hsub + +theorem IsBoundedDomain.integral_rieszKernel_le + (hU : IsBoundedDomain U) {x : Vec d} (hx : x ∈ U) : + ∫ y in U, rieszKernel x y ∂MeasureTheory.volume ≤ + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU) := by + let C := Classical.choose hU + have hCpos : 0 < C := (Classical.choose_spec hU).1 + have hsub : U ⊆ Metric.ball (0 : Vec d) (2 * C) := by + intro y hy + rw [Metric.mem_ball, dist_zero_right] + calc + ‖y‖ ≤ C := hU.norm_le_choose hy + _ < 2 * C := by linarith [hCpos] + have hxBall : x ∈ Metric.ball (0 : Vec d) (2 * C) := hsub hx + have hIntBall : + MeasureTheory.IntegrableOn (fun y : Vec d => rieszKernel x y) + (Metric.ball (0 : Vec d) (2 * C)) MeasureTheory.volume := + integrableOn_rieszKernel_ball (d := d) (by linarith [hCpos] : 0 < 2 * C) x hxBall + calc + ∫ y in U, rieszKernel x y ∂MeasureTheory.volume + ≤ ∫ y in Metric.ball (0 : Vec d) (2 * C), rieszKernel x y ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_mono_set hIntBall + (Filter.Eventually.of_forall (fun y => rieszKernel_nonneg x y)) + hsub.eventuallyLE + _ ≤ (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * (2 * (2 * C)) := by + exact integral_rieszKernel_ball_le (d := d) (by linarith [hCpos] : 0 < 2 * C) x hxBall + _ = (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU) := by + ring + +theorem IsBoundedDomain.integrableOn_rieszKernel_right + (hU : IsBoundedDomain U) {y : Vec d} (hy : y ∈ U) : + MeasureTheory.IntegrableOn (fun x : Vec d => rieszKernel x y) U MeasureTheory.volume := by + simpa [rieszKernel_symm] using hU.integrableOn_rieszKernel (x := y) hy + +theorem IsBoundedDomain.integral_rieszKernel_right_le + (hU : IsBoundedDomain U) {y : Vec d} (hy : y ∈ U) : + ∫ x in U, rieszKernel x y ∂MeasureTheory.volume ≤ + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU) := by + simpa [rieszKernel_symm] using hU.integral_rieszKernel_le (x := y) hy + +theorem integrableOn_prod_rieszKernel_of_isSobolevRegularDomain + (hU : IsSobolevRegularDomain U) : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume) := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let : MeasureTheory.IsFiniteMeasure μU := hU.isBoundedDomain.isFiniteMeasure_restrict_volume + set M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + have hkernel_meas : Measurable (fun z : Vec d × Vec d => rieszKernel z.1 z.2) := by + unfold rieszKernel + fun_prop + have hsections : + ∀ᵐ y ∂μU, MeasureTheory.Integrable (fun x => rieszKernel x y) μU := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet] with y hy + simpa [μU, MeasureTheory.IntegrableOn] using + hU.isBoundedDomain.integrableOn_rieszKernel_right hy + have hkernel_swap_meas : Measurable (fun z : Vec d × Vec d => ‖rieszKernel z.2 z.1‖) := by + unfold rieszKernel + fun_prop + have houter_meas : + AEStronglyMeasurable (fun y => ∫ x, ‖rieszKernel x y‖ ∂μU) μU := by + exact hkernel_swap_meas.aemeasurable.aestronglyMeasurable.integral_prod_right' + have houter_bound : + ∀ᵐ y ∂μU, ‖∫ x, ‖rieszKernel x y‖ ∂μU‖ ≤ M := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet] with y hy + have hnonneg : + 0 ≤ ∫ x, ‖rieszKernel x y‖ ∂μU := + MeasureTheory.integral_nonneg (fun x => norm_nonneg _) + calc + ‖∫ x, ‖rieszKernel x y‖ ∂μU‖ + = ∫ x, ‖rieszKernel x y‖ ∂μU := by + rw [Real.norm_of_nonneg hnonneg] + _ = ∫ x, rieszKernel x y ∂μU := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + rw [Real.norm_of_nonneg (rieszKernel_nonneg x y)] + _ ≤ M := by + simpa [μU, M] using hU.isBoundedDomain.integral_rieszKernel_right_le hy + have houter_int : MeasureTheory.Integrable (fun _ : Vec d => M) μU := + MeasureTheory.integrable_const M + have hnorm_int : + MeasureTheory.Integrable (fun y => ∫ x, ‖rieszKernel x y‖ ∂μU) μU := + houter_int.mono' houter_meas houter_bound + have hprod_int : + MeasureTheory.Integrable (fun z : Vec d × Vec d => rieszKernel z.1 z.2) (μU.prod μU) := by + exact (MeasureTheory.integrable_prod_iff' hkernel_meas.aestronglyMeasurable).2 + ⟨hsections, hnorm_int⟩ + simpa [μU, MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using hprod_int + +end BoundedDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/RieszPowerMean.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/RieszPowerMean.lean new file mode 100644 index 0000000000..738727c6f6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/RieszPowerMean.lean @@ -0,0 +1,466 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.TimeCollapse + +/-! # Riesz Power Mean -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric +open scoped ENNReal NNReal Pointwise + +/-! +# Weighted and Riesz power-mean bounds for the Poincare kernel integrand + +First: a Hölder-type weighted power-mean inequality used to convert the +interval integral into an `L^p` bound. +Second: the final convex-domain Riesz-kernel bounds used by `PoincareLp`. +-/ + +section WeightedPowerMean + +theorem weighted_power_mean_setIntegral + {α : Type*} [MeasurableSpace α] {μ : Measure α} + {s : Set α} (hs : MeasurableSet s) + {p : ℝ} (hp : 1 < p) + {f w : α → ℝ} (hf : ∀ x, 0 ≤ f x) (hw : ∀ x, 0 ≤ w x) + (hf_meas : AEMeasurable f (μ.restrict s)) + (hwi : MeasureTheory.IntegrableOn w s μ) + (hfpwi : MeasureTheory.IntegrableOn (fun x => (f x) ^ p * w x) s μ) : + (∫ x in s, f x * w x ∂μ) ^ p ≤ + (∫ x in s, w x ∂μ) ^ (p - 1) * ∫ x in s, (f x) ^ p * w x ∂μ := by + set μs : Measure α := μ.restrict s + set ρ : α → ℝ≥0∞ := fun x => ENNReal.ofReal (w x) + set ν : Measure α := μs.withDensity ρ + let q : ℝ := p / (p - 1) + have hp_pos : 0 < p := lt_trans zero_lt_one hp + have hp_nonneg : 0 ≤ p := le_of_lt hp_pos + have hpq : p.HolderConjugate q := by + dsimp [q] + exact Real.HolderConjugate.conjExponent hp + have hρ_aemeas : AEMeasurable ρ μs := by + simpa [ρ, μs] using hwi.aestronglyMeasurable.aemeasurable.ennreal_ofReal + have hρ_lt_top : ∀ᵐ x ∂μs, ρ x < ⊤ := by + filter_upwards with x + simp [ρ] + have hρ_lint_ne_top : ∫⁻ x, ρ x ∂μs ≠ ⊤ := by + rw [← ofReal_integral_eq_lintegral_ofReal hwi (ae_of_all _ fun x => hw x)] + simp + have : MeasureTheory.IsFiniteMeasure ν := MeasureTheory.isFiniteMeasure_withDensity hρ_lint_ne_top + have hf_meas_ν : AEMeasurable f ν := by + exact hf_meas.mono_ac (MeasureTheory.withDensity_absolutelyContinuous _ _) + have hpow_int_base : MeasureTheory.Integrable (fun x => (ρ x).toReal • (‖f x‖ ^ p)) μs := by + refine hfpwi.congr ?_ + filter_upwards with x + rw [smul_eq_mul, ENNReal.toReal_ofReal (hw x), Real.norm_of_nonneg (hf x)] + ring + have hpow_int : MeasureTheory.Integrable (fun x => ‖f x‖ ^ p) ν := by + rw [show ν = μs.withDensity ρ by rfl] + exact + (MeasureTheory.integrable_withDensity_iff_integrable_smul₀' + (μ := μs) hρ_aemeas hρ_lt_top).2 hpow_int_base + have hf_mem : MeasureTheory.MemLp f (ENNReal.ofReal p) ν := by + exact + (MeasureTheory.integrable_norm_rpow_iff + (μ := ν) hf_meas_ν.aestronglyMeasurable + (by simp [hp_pos]) ENNReal.ofReal_ne_top).1 <| by + simpa [ENNReal.toReal_ofReal hp_nonneg] using hpow_int + have h_one_mem : MeasureTheory.MemLp (fun _ : α => (1 : ℝ)) (ENNReal.ofReal q) ν := by + simpa [q] using + (MeasureTheory.memLp_const (μ := ν) (p := ENNReal.ofReal q) (1 : ℝ)) + have hHolder : + ∫ x, f x * (1 : ℝ) ∂ν ≤ + (∫ x, (f x) ^ p ∂ν) ^ (1 / p : ℝ) * + (∫ x, (1 : ℝ) ^ q ∂ν) ^ (1 / q : ℝ) := by + exact MeasureTheory.integral_mul_le_Lp_mul_Lq_of_nonneg + (μ := ν) hpq + (ae_of_all _ fun x => hf x) + (ae_of_all _ fun _ => by positivity) + hf_mem h_one_mem + have hleft_eq : ∫ x, f x ∂ν = ∫ x in s, f x * w x ∂μ := by + rw [show ν = μs.withDensity ρ by rfl] + rw [integral_withDensity_eq_integral_toReal_smul₀ + (μ := μs) hρ_aemeas hρ_lt_top] + simp [μs, ρ, smul_eq_mul, ENNReal.toReal_ofReal, hw, mul_comm] + have hpow_eq : ∫ x, (f x) ^ p ∂ν = ∫ x in s, (f x) ^ p * w x ∂μ := by + rw [show ν = μs.withDensity ρ by rfl] + rw [integral_withDensity_eq_integral_toReal_smul₀ + (μ := μs) hρ_aemeas hρ_lt_top] + simp [μs, ρ, smul_eq_mul, ENNReal.toReal_ofReal, hw, mul_comm] + have hone_eq : ∫ x, (1 : ℝ) ^ q ∂ν = ∫ x in s, w x ∂μ := by + rw [show ν = μs.withDensity ρ by rfl] + rw [integral_withDensity_eq_integral_toReal_smul₀ + (μ := μs) hρ_aemeas hρ_lt_top] + simp [μs, ρ, q, smul_eq_mul, ENNReal.toReal_ofReal, hw] + set A := ∫ x in s, f x * w x ∂μ + set I := ∫ x in s, (f x) ^ p * w x ∂μ + set W := ∫ x in s, w x ∂μ + have hA_nonneg : 0 ≤ A := by + exact MeasureTheory.setIntegral_nonneg hs (fun x _ => mul_nonneg (hf x) (hw x)) + have hI_nonneg : 0 ≤ I := by + exact MeasureTheory.setIntegral_nonneg hs (fun x _ => + mul_nonneg (Real.rpow_nonneg (hf x) _) (hw x)) + have hW_nonneg : 0 ≤ W := by + exact MeasureTheory.setIntegral_nonneg hs (fun x _ => hw x) + by_cases hW_zero : ∫ x in s, w x ∂μ = 0 + · have hfw_nonneg : 0 ≤ ∫ x in s, f x * w x ∂μ := + MeasureTheory.setIntegral_nonneg hs (fun x _ => mul_nonneg (hf x) (hw x)) + have hfw_zero : ∫ x in s, f x * w x ∂μ ≤ 0 := by + by_cases hfwi : MeasureTheory.IntegrableOn (fun x => f x * w x) s μ + · have hw_ae : w =ᵐ[μ.restrict s] 0 := by + rwa [MeasureTheory.setIntegral_eq_zero_iff_of_nonneg_ae + (MeasureTheory.ae_restrict_of_ae (ae_of_all _ (fun x => hw x))) hwi] at hW_zero + have : (fun x => f x * w x) =ᵐ[μ.restrict s] 0 := + hw_ae.mono (fun x hx => by simp [hx]) + rw [MeasureTheory.integral_congr_ae this] + simp + · simp [MeasureTheory.integral_undef hfwi] + have h0 := le_antisymm hfw_zero hfw_nonneg + simpa [A, I, W, h0, hW_zero] using + (show A ^ p ≤ W ^ (p - 1) * I by + simp [A, I, W, h0, hW_zero, + mul_nonneg (Real.rpow_nonneg (le_refl _) _) + (MeasureTheory.setIntegral_nonneg hs + (fun x _ => mul_nonneg (Real.rpow_nonneg (hf x) _) (hw x))), + Real.zero_rpow (by linarith : p ≠ 0)]) + · have hHolder' : A ≤ W ^ (1 / q : ℝ) * I ^ (1 / p : ℝ) := by + have hνreal_eq : ν.real Set.univ = W := by + calc + ν.real Set.univ = ∫ x, (1 : ℝ) ∂ν := by + rw [integral_const] + simp [Measure.real] + _ = ∫ x, (1 : ℝ) ^ q ∂ν := by simp [q] + _ = W := hone_eq + simpa [A, I, W, hleft_eq, hpow_eq, hνreal_eq, one_div, mul_comm, mul_left_comm, mul_assoc] + using hHolder + have hpow := + Real.rpow_le_rpow hA_nonneg hHolder' (le_of_lt hp_pos) + have hWroot_nonneg : 0 ≤ W ^ (1 / q : ℝ) := Real.rpow_nonneg hW_nonneg _ + have hIroot_nonneg : 0 ≤ I ^ (1 / p : ℝ) := Real.rpow_nonneg hI_nonneg _ + have hp_ne_zero : p ≠ 0 := by linarith + have hrhs : + (W ^ (1 / q : ℝ) * I ^ (1 / p : ℝ)) ^ p = W ^ (p - 1) * I := by + rw [Real.mul_rpow hWroot_nonneg hIroot_nonneg] + rw [← Real.rpow_mul hW_nonneg, ← Real.rpow_mul hI_nonneg] + have hWq : (1 / q : ℝ) * p = p - 1 := by + dsimp [q] + field_simp [hp_ne_zero, show p - 1 ≠ 0 by linarith] + have hIp : (1 / p : ℝ) * p = 1 := by + field_simp [hp_ne_zero] + rw [hWq, hIp, Real.rpow_one] + simpa [A, I, W] using hpow.trans_eq hrhs + +end WeightedPowerMean + +section RieszPowerMean + +variable {d : ℕ} [NeZero d] + +/-- Cache `Nontrivial (Vec d)` once per section. -/ +private instance instNontrivialVecRiesz : Nontrivial (Vec d) := inferInstance + +theorem integral_mul_rieszKernel_rpow_le_of_isSobolevRegularDomain + {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {p : ℝ} (hp : 1 < p) + {g : Vec d → ℝ} (hg_nonneg : ∀ y, 0 ≤ g y) + (hg_meas : AEMeasurable g (MeasureTheory.volume.restrict U)) + {x : Vec d} (hx : x ∈ U) + (hgpK_int : + MeasureTheory.IntegrableOn + (fun y => (g y) ^ p * rieszKernel x y) U MeasureTheory.volume) : + (∫ y in U, g y * rieszKernel x y ∂MeasureTheory.volume) ^ p ≤ + (∫ y in U, rieszKernel x y ∂MeasureTheory.volume) ^ (p - 1) * + ∫ y in U, (g y) ^ p * rieszKernel x y ∂MeasureTheory.volume := by + exact weighted_power_mean_setIntegral hU.measurableSet hp + hg_nonneg (fun y => rieszKernel_nonneg x y) hg_meas + (hU.isBoundedDomain.integrableOn_rieszKernel hx) hgpK_int + +theorem integral_mul_rieszKernel_rpow_le_bound_of_isSobolevRegularDomain + {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {p : ℝ} (hp : 1 < p) + {g : Vec d → ℝ} (hg_nonneg : ∀ y, 0 ≤ g y) + (hg_meas : AEMeasurable g (MeasureTheory.volume.restrict U)) + {x : Vec d} (hx : x ∈ U) + (hgpK_int : + MeasureTheory.IntegrableOn + (fun y => (g y) ^ p * rieszKernel x y) U MeasureTheory.volume) : + (∫ y in U, g y * rieszKernel x y ∂MeasureTheory.volume) ^ p ≤ + (((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (p - 1)) * + ∫ y in U, (g y) ^ p * rieszKernel x y ∂MeasureTheory.volume := by + set W := ∫ y in U, rieszKernel x y ∂MeasureTheory.volume + set I := ∫ y in U, (g y) ^ p * rieszKernel x y ∂MeasureTheory.volume + set M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + have hW_nonneg : 0 ≤ W := by + exact MeasureTheory.setIntegral_nonneg hU.measurableSet + (fun y _ => rieszKernel_nonneg x y) + have hW_le_M : W ≤ M := by + simpa [W, M] using hU.isBoundedDomain.integral_rieszKernel_le (x := x) hx + have hI_nonneg : 0 ≤ I := by + exact MeasureTheory.setIntegral_nonneg hU.measurableSet + (fun y _ => mul_nonneg (Real.rpow_nonneg (hg_nonneg y) _) (rieszKernel_nonneg x y)) + calc + (∫ y in U, g y * rieszKernel x y ∂MeasureTheory.volume) ^ p + ≤ W ^ (p - 1) * I := by + simpa [W, I] using + integral_mul_rieszKernel_rpow_le_of_isSobolevRegularDomain + hU hp hg_nonneg hg_meas hx hgpK_int + _ ≤ M ^ (p - 1) * I := by + apply mul_le_mul_of_nonneg_right ?_ hI_nonneg + exact Real.rpow_le_rpow hW_nonneg hW_le_M (by linarith) + _ = (((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (p - 1)) * + ∫ y in U, (g y) ^ p * rieszKernel x y ∂MeasureTheory.volume := by + simp [I, M] + +theorem integrable_rpow_integral_mul_rieszKernel_of_isSobolevRegularDomain + {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {p : ℝ} (hp : 1 < p) + {g : Vec d → ℝ} (hg_nonneg : ∀ y, 0 ≤ g y) + (hg_meas : AEMeasurable g (MeasureTheory.volume.restrict U)) + (hgK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => g z.2 * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume)) + (hgpK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => (g z.2) ^ p * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume)) : + MeasureTheory.Integrable + (fun x => (∫ y in U, g y * rieszKernel x y ∂MeasureTheory.volume) ^ p) + (MeasureTheory.volume.restrict U) := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + set M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + have hp_pos : 0 < p := lt_trans zero_lt_one hp + have hp_nonneg : 0 ≤ p := le_of_lt hp_pos + have hchoose_pos : 0 < Classical.choose hU.isBoundedDomain := + (Classical.choose_spec hU.isBoundedDomain).1 + have hM_nonneg : 0 ≤ M := by + have hd_nonneg : 0 ≤ (d : ℝ) := by positivity + have hball_nonneg : + 0 ≤ (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal := + ENNReal.toReal_nonneg + have hchoose_nonneg : 0 ≤ (4 * Classical.choose hU.isBoundedDomain : ℝ) := by + nlinarith + dsimp [M] + exact mul_nonneg (mul_nonneg hd_nonneg hball_nonneg) hchoose_nonneg + have hgK_prod_int' : + MeasureTheory.Integrable + (fun z : Vec d × Vec d => g z.2 * rieszKernel z.1 z.2) + (μU.prod μU) := by + simpa [μU, MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using hgK_prod_int + have hgpK_prod_int' : + MeasureTheory.Integrable + (fun z : Vec d × Vec d => (g z.2) ^ p * rieszKernel z.1 z.2) + (μU.prod μU) := by + simpa [μU, MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using hgpK_prod_int + have hright_int : + MeasureTheory.Integrable + (fun x => M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU) + μU := by + simpa [M] using + (hgpK_prod_int'.integral_prod_left.const_mul (M ^ (p - 1))) + have hpointwise : + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) ≤ᵐ[μU] + (fun x => M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet, hgpK_prod_int'.prod_right_ae] with + x hx hxgpK + simpa [μU, M, MeasureTheory.IntegrableOn] using + (integral_mul_rieszKernel_rpow_le_bound_of_isSobolevRegularDomain + hU hp hg_nonneg hg_meas hx hxgpK) + have hinner_meas : + AEStronglyMeasurable + (fun x => ∫ y, g y * rieszKernel x y ∂μU) + μU := + hgK_prod_int'.aestronglyMeasurable.integral_prod_right' + have hleft_ae : + AEStronglyMeasurable + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := by + let hpow_meas : Measurable (fun t : ℝ => t ^ p) := + (continuous_id.rpow_const fun _ => Or.inr hp_nonneg).measurable + exact (hpow_meas.comp_aemeasurable hinner_meas.aemeasurable).aestronglyMeasurable + have hleft_bound : + ∀ᵐ x ∂μU, ‖(∫ y, g y * rieszKernel x y ∂μU) ^ p‖ ≤ + M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet, hgK_prod_int'.prod_right_ae, + hpointwise] with x hx hxgK hxbound + have hinner_nonneg : 0 ≤ ∫ y, g y * rieszKernel x y ∂μU := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall + (fun y => mul_nonneg (hg_nonneg y) (rieszKernel_nonneg x y))) + have hpow_nonneg : 0 ≤ (∫ y, g y * rieszKernel x y ∂μU) ^ p := + Real.rpow_nonneg hinner_nonneg _ + simpa [Real.norm_of_nonneg hpow_nonneg] using hxbound + exact hright_int.mono' hleft_ae hleft_bound + +theorem integral_rpow_integral_mul_rieszKernel_le_bound_of_isSobolevRegularDomain + {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {p : ℝ} (hp : 1 < p) + {g : Vec d → ℝ} (hg_nonneg : ∀ y, 0 ≤ g y) + (hg_meas : AEMeasurable g (MeasureTheory.volume.restrict U)) + (hgK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => g z.2 * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume)) + (hgp_int : + MeasureTheory.IntegrableOn + (fun y => (g y) ^ p) U MeasureTheory.volume) + (hgpK_prod_int : + MeasureTheory.IntegrableOn + (fun z : Vec d × Vec d => (g z.2) ^ p * rieszKernel z.1 z.2) + (U ×ˢ U) (MeasureTheory.volume.prod MeasureTheory.volume)) : + ∫ x in U, (∫ y in U, g y * rieszKernel x y ∂MeasureTheory.volume) ^ p ∂MeasureTheory.volume ≤ + (((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ p) * + ∫ y in U, (g y) ^ p ∂MeasureTheory.volume := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + set M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + have hp_pos : 0 < p := lt_trans zero_lt_one hp + have hp_nonneg : 0 ≤ p := le_of_lt hp_pos + have hchoose_pos : 0 < Classical.choose hU.isBoundedDomain := + (Classical.choose_spec hU.isBoundedDomain).1 + have hM_nonneg : 0 ≤ M := by + have hd_nonneg : 0 ≤ (d : ℝ) := by positivity + have hball_nonneg : + 0 ≤ (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal := + ENNReal.toReal_nonneg + have hchoose_nonneg : 0 ≤ (4 * Classical.choose hU.isBoundedDomain : ℝ) := by + nlinarith + dsimp [M] + exact mul_nonneg (mul_nonneg hd_nonneg hball_nonneg) hchoose_nonneg + have hgK_prod_int' : + MeasureTheory.Integrable + (fun z : Vec d × Vec d => g z.2 * rieszKernel z.1 z.2) + (μU.prod μU) := by + simpa [μU, MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using hgK_prod_int + have hgpK_prod_int' : + MeasureTheory.Integrable + (fun z : Vec d × Vec d => (g z.2) ^ p * rieszKernel z.1 z.2) + (μU.prod μU) := by + simpa [μU, MeasureTheory.IntegrableOn, MeasureTheory.Measure.prod_restrict] using hgpK_prod_int + have hright_int : + MeasureTheory.Integrable + (fun x => M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU) + μU := by + simpa [M] using + (hgpK_prod_int'.integral_prod_left.const_mul (M ^ (p - 1))) + have hpointwise : + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) ≤ᵐ[μU] + (fun x => M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet, hgpK_prod_int'.prod_right_ae] with + x hx hxgpK + simpa [μU, M, MeasureTheory.IntegrableOn] using + (integral_mul_rieszKernel_rpow_le_bound_of_isSobolevRegularDomain + hU hp hg_nonneg hg_meas hx hxgpK) + have hinner_meas : + AEStronglyMeasurable + (fun x => ∫ y, g y * rieszKernel x y ∂μU) + μU := + hgK_prod_int'.aestronglyMeasurable.integral_prod_right' + have hleft_ae : + AEStronglyMeasurable + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := by + let hpow_meas : Measurable (fun t : ℝ => t ^ p) := + (continuous_id.rpow_const fun _ => Or.inr hp_nonneg).measurable + exact (hpow_meas.comp_aemeasurable hinner_meas.aemeasurable).aestronglyMeasurable + have hleft_bound : + ∀ᵐ x ∂μU, ‖(∫ y, g y * rieszKernel x y ∂μU) ^ p‖ ≤ + M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet, hgK_prod_int'.prod_right_ae, + hpointwise] with x hx hxgK hxbound + have hinner_nonneg : 0 ≤ ∫ y, g y * rieszKernel x y ∂μU := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall + (fun y => mul_nonneg (hg_nonneg y) (rieszKernel_nonneg x y))) + have hpow_nonneg : 0 ≤ (∫ y, g y * rieszKernel x y ∂μU) ^ p := + Real.rpow_nonneg hinner_nonneg _ + simpa [Real.norm_of_nonneg hpow_nonneg] using hxbound + have hleft_int : + MeasureTheory.Integrable + (fun x => (∫ y, g y * rieszKernel x y ∂μU) ^ p) + μU := by + exact hright_int.mono' hleft_ae hleft_bound + have hswap_int : + MeasureTheory.Integrable + (fun y => ∫ x, (g y) ^ p * rieszKernel x y ∂μU) + μU := + hgpK_prod_int'.integral_prod_right + have hgp_int' : + MeasureTheory.Integrable + (fun y => (g y) ^ p) μU := by + simpa [μU, MeasureTheory.IntegrableOn] using hgp_int + have hscaled_int : + MeasureTheory.Integrable + (fun y => (g y) ^ p * M) + μU := by + have htmp := hgp_int'.const_mul M + simpa [mul_comm, mul_left_comm, mul_assoc] using htmp + have hswap_bound : + (fun y => ∫ x, (g y) ^ p * rieszKernel x y ∂μU) ≤ᵐ[μU] + (fun y => (g y) ^ p * M) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.measurableSet] with y hy + have hgy_nonneg : 0 ≤ (g y) ^ p := + Real.rpow_nonneg (hg_nonneg y) _ + have hk_le : + ∫ x, rieszKernel x y ∂μU ≤ M := by + simpa [μU, M] using hU.isBoundedDomain.integral_rieszKernel_right_le hy + calc + ∫ x, (g y) ^ p * rieszKernel x y ∂μU + = (g y) ^ p * ∫ x, rieszKernel x y ∂μU := by + rw [MeasureTheory.integral_const_mul] + _ ≤ (g y) ^ p * M := by + exact mul_le_mul_of_nonneg_left hk_le hgy_nonneg + have hMp : M ^ (p - 1) * M = M ^ p := by + by_cases hM_zero : M = 0 + · have hp_ne_zero : p ≠ 0 := by linarith + have hp_sub_ne_zero : p - 1 ≠ 0 := by linarith + simp [hM_zero, Real.zero_rpow hp_ne_zero, Real.zero_rpow hp_sub_ne_zero] + · have hM_pos : 0 < M := lt_of_le_of_ne hM_nonneg (by simpa [eq_comm] using hM_zero) + simpa using (Real.rpow_add hM_pos (p - 1) 1).symm + calc + ∫ x, (∫ y, g y * rieszKernel x y ∂μU) ^ p ∂μU + ≤ ∫ x, M ^ (p - 1) * ∫ y, (g y) ^ p * rieszKernel x y ∂μU ∂μU := by + exact MeasureTheory.integral_mono_ae hleft_int hright_int hpointwise + _ = M ^ (p - 1) * ∫ x, ∫ y, (g y) ^ p * rieszKernel x y ∂μU ∂μU := by + rw [MeasureTheory.integral_const_mul] + _ = M ^ (p - 1) * ∫ y, ∫ x, (g y) ^ p * rieszKernel x y ∂μU ∂μU := by + congr 1 + exact MeasureTheory.integral_integral_swap hgpK_prod_int' + _ ≤ M ^ (p - 1) * ∫ y, (g y) ^ p * M ∂μU := by + apply mul_le_mul_of_nonneg_left ?_ (Real.rpow_nonneg hM_nonneg _) + exact MeasureTheory.integral_mono_ae hswap_int hscaled_int hswap_bound + _ = (M ^ (p - 1) * M) * ∫ y, (g y) ^ p ∂μU := by + have hscaled : + ∫ y, (g y) ^ p * M ∂μU = M * ∫ y, (g y) ^ p ∂μU := by + have hmul : + (fun y => (g y) ^ p * M) = fun y => M * (g y) ^ p := by + funext y + ring + rw [hmul, MeasureTheory.integral_const_mul] + rw [hscaled] + ring + _ = M ^ p * ∫ y, (g y) ^ p ∂μU := by + rw [hMp] + _ = (((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ p) * + ∫ y, (g y) ^ p ∂μU := by + simp [M] +end RieszPowerMean + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/SegmentChangeOfVariables.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/SegmentChangeOfVariables.lean new file mode 100644 index 0000000000..c2ed0ed15d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/SegmentChangeOfVariables.lean @@ -0,0 +1,253 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.Basic +public import Mathlib.MeasureTheory.Integral.Prod + +/-! # Segment Change Of Variables -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric +open scoped ENNReal NNReal Pointwise + +/-! +# Segment change of variables for Riesz-kernel Poincare integrals + +Pulls the segment-blend integrand `φ(segmentBlend x t y) * ‖x - y‖` through a +dilation change of variables into an integral against `(1 - t)^(-(d+1))`, +optionally localised to a closed ball around `x`. +-/ + +section SegmentChangeOfVariables +variable {d : ℕ} [NeZero d] + +/-- File-level typeclass cache for `Nontrivial (Vec d)` under `[NeZero d]`. +Repeated inference of this head class dominates the file (~7s cumulative +typeclass before the cache). The cache fires during elaboration of theorems +in this section even when their type signatures don't use `[NeZero d]`, +because the variable-block instance is in scope for typeclass search. -/ +private instance instNontrivialVecSegCV (d : ℕ) [NeZero d] : + Nontrivial (Vec d) := inferInstance + +theorem setIntegral_segmentBlend_mul_norm_sub_eq_inv_pow_mul_setIntegral_scaled + {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {x : Vec d} {t : ℝ} (ht1 : t < 1) + {φ : Vec d → ℝ} : + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume = + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in translateSet x ((1 - t) • translateSet (-x) U), φ z * ‖z - x‖ + ∂MeasureTheory.volume := by + let a : ℝ := 1 - t + let V : Set (Vec d) := translateSet (-x) U + let g : Vec d → ℝ := fun z => φ (x + z) * ‖z‖ + have ha_pos : 0 < a := by + dsimp [a] + linarith + have ha_nonneg : 0 ≤ a := ha_pos.le + have hV_eq : translateSet x V = U := by + dsimp [V] + rw [translateSet_translateSet, show -x + x = (0 : Vec d) by abel, translateSet_zero] + have hV_meas : MeasurableSet V := by + dsimp [V] + rw [← preimage_addNeg_eq_translateSet (d := d) (z := -x) U] + exact hU_meas.preimage (Homeomorph.addRight (-(-x))).continuous.measurable + have hsegment_eq (y : Vec d) : x + a • (y - x) = segmentBlend x t y := by + rw [segmentBlend_eq_add_smul_sub] + ext i + simp [a, sub_eq_add_neg] + ring_nf + have hleft : + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume = + ∫ w in V, φ (x + a • w) * ‖w‖ ∂MeasureTheory.volume := by + calc + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + = ∫ y in U, (fun w => φ (x + a • w) * ‖w‖) (y - x) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro y hy + simp [hsegment_eq y, norm_sub_rev] + _ = ∫ w in V, φ (x + a • w) * ‖w‖ ∂MeasureTheory.volume := by + simpa [V, hV_eq] using + (setIntegral_comp_subRight_translateSet (d := d) (E := ℝ) x V + (fun w => φ (x + a • w) * ‖w‖)) + have hscale_fun : + Set.EqOn + (fun w : Vec d => φ (x + a • w) * ‖w‖) + (fun w : Vec d => a⁻¹ * g (a • w)) + V := by + intro w hw + calc + φ (x + a • w) * ‖w‖ + = a⁻¹ * (φ (x + a • w) * ‖a • w‖) := by + rw [norm_smul, Real.norm_of_nonneg ha_nonneg] + field_simp [ha_pos.ne'] + _ = a⁻¹ * g (a • w) := by + simp [g] + have hscaled : + ∫ w in V, φ (x + a • w) * ‖w‖ ∂MeasureTheory.volume = + a⁻¹ * ∫ w in V, g (a • w) ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_congr_fun hV_meas hscale_fun] + rw [MeasureTheory.integral_const_mul] + have hsmul : + ∫ w in V, g (a • w) ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ z in a • V, g z ∂MeasureTheory.volume := by + simpa [g, smul_eq_mul, Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := g) (s := V) ha_pos) + have hback : + ∫ z in a • V, g z ∂MeasureTheory.volume = + ∫ u in translateSet x (a • V), φ u * ‖u - x‖ ∂MeasureTheory.volume := by + simpa [g, sub_eq_add_neg, add_assoc, add_left_comm, add_comm] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) x (a • V) + (fun u => φ u * ‖u - x‖)) + have hcoeff : + a⁻¹ * (a ^ d)⁻¹ = (a ^ (d + 1 : ℕ))⁻¹ := by + field_simp [ha_pos.ne'] + ring + calc + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + = ∫ w in V, φ (x + a • w) * ‖w‖ ∂MeasureTheory.volume := hleft + _ = a⁻¹ * ∫ w in V, g (a • w) ∂MeasureTheory.volume := hscaled + _ = a⁻¹ * ((a ^ d)⁻¹ * ∫ z in a • V, g z ∂MeasureTheory.volume) := by rw [hsmul] + _ = (a⁻¹ * (a ^ d)⁻¹) * ∫ z in a • V, g z ∂MeasureTheory.volume := by ring + _ = (a⁻¹ * (a ^ d)⁻¹) * + ∫ u in translateSet x (a • V), φ u * ‖u - x‖ ∂MeasureTheory.volume := by + rw [hback] + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in translateSet x ((1 - t) • translateSet (-x) U), φ z * ‖z - x‖ + ∂MeasureTheory.volume := by + simp [a, V, hcoeff] + +theorem setIntegral_segmentBlend_mul_norm_sub_le_inv_pow_mul_setIntegral + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {x : Vec d} (hx : x ∈ U) {t : ℝ} (ht0 : 0 ≤ t) (ht1 : t < 1) + {φ : Vec d → ℝ} + (hφ_int : MeasureTheory.IntegrableOn (fun z => φ z * ‖x - z‖) U MeasureTheory.volume) + (hφ_nonneg : ∀ z, 0 ≤ φ z) : + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume ≤ + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U, φ z * ‖x - z‖ ∂MeasureTheory.volume := by + let a : ℝ := 1 - t + let S : Set (Vec d) := translateSet x (a • translateSet (-x) U) + have hsegment_eq (y : Vec d) : x + a • (y - x) = segmentBlend x t y := by + ext i + simp [a, segmentBlend, AffineMap.lineMap_apply_module, sub_eq_add_neg] + ring_nf + have hsegment_eq' (y : Vec d) : a • (y - x) + x = segmentBlend x t y := by + simpa [add_comm] using hsegment_eq y + have hsub : S ⊆ U := by + intro u hu + rcases hu with ⟨z, hz, rfl⟩ + rcases hz with ⟨w, hw, rfl⟩ + rcases hw with ⟨y, hy, hwEq⟩ + subst hwEq + have hy' : a • (y - x) + x ∈ U := by + rw [hsegment_eq' y] + exact segmentBlend_mem_of_isOpenBoundedConvexDomain hU hx hy ht0 ht1.le + simpa [sub_eq_add_neg] using hy' + have hφ_int' : + MeasureTheory.IntegrableOn (fun z => φ z * ‖z - x‖) U MeasureTheory.volume := by + simpa [norm_sub_rev] using hφ_int + have hmono : + ∫ u in S, φ u * ‖u - x‖ ∂MeasureTheory.volume ≤ + ∫ u in U, φ u * ‖u - x‖ ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_mono_set hφ_int' + (Filter.Eventually.of_forall (fun u => mul_nonneg (hφ_nonneg u) (norm_nonneg _))) + hsub.eventuallyLE + have hcoeff_nonneg : 0 ≤ ((1 - t) ^ (d + 1 : ℕ))⁻¹ := by + have hbase_pos : 0 < 1 - t := by linarith + exact inv_nonneg.mpr (pow_nonneg hbase_pos.le _) + calc + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ∫ z in S, φ z * ‖z - x‖ ∂MeasureTheory.volume := by + simpa [a, S] using + setIntegral_segmentBlend_mul_norm_sub_eq_inv_pow_mul_setIntegral_scaled + hU.isOpen.measurableSet (x := x) (t := t) ht1 + _ ≤ ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ∫ u in U, φ u * ‖u - x‖ ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hmono hcoeff_nonneg + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U, φ z * ‖x - z‖ ∂MeasureTheory.volume := by + simp [norm_sub_rev] + +theorem setIntegral_segmentBlend_mul_norm_sub_le_inv_pow_mul_setIntegral_inter_closedBall + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {x : Vec d} (hx : x ∈ U) {t : ℝ} (ht0 : 0 ≤ t) (ht1 : t < 1) + {φ : Vec d → ℝ} + (hφ_int : MeasureTheory.IntegrableOn (fun z => φ z * ‖x - z‖) U MeasureTheory.volume) + (hφ_nonneg : ∀ z, 0 ≤ φ z) : + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume ≤ + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * (2 * Classical.choose hU.isBoundedDomain)), + φ z * ‖x - z‖ ∂MeasureTheory.volume := by + let a : ℝ := 1 - t + let R : ℝ := 2 * Classical.choose hU.isBoundedDomain + let S : Set (Vec d) := translateSet x (a • translateSet (-x) U) + have ha_nonneg : 0 ≤ a := by + dsimp [a] + linarith + have hsegment_eq (y : Vec d) : x + a • (y - x) = segmentBlend x t y := by + ext i + simp [a, segmentBlend, AffineMap.lineMap_apply_module, sub_eq_add_neg] + ring_nf + have hsegment_eq' (y : Vec d) : a • (y - x) + x = segmentBlend x t y := by + simpa [add_comm] using hsegment_eq y + have hsub_ball : S ⊆ U ∩ Metric.closedBall x (a * R) := by + intro u hu + rcases hu with ⟨z, hz, rfl⟩ + rcases hz with ⟨w, hw, rfl⟩ + rcases hw with ⟨y, hy, hwEq⟩ + subst hwEq + constructor + · change a • (y - x) + x ∈ U + rw [hsegment_eq' y] + exact segmentBlend_mem_of_isOpenBoundedConvexDomain hU hx hy ht0 ht1.le + · rw [Metric.mem_closedBall, dist_eq_norm] + have hdist : + ‖y - x‖ ≤ 2 * Classical.choose hU.isBoundedDomain := by + simpa [norm_sub_rev] using hU.isBoundedDomain.norm_sub_le_two_mul_choose hy hx + change ‖a • (y - x) + x - x‖ ≤ a * R + calc + ‖a • (y - x) + x - x‖ = ‖a • (y - x)‖ := by simp + _ = a * ‖y - x‖ := by rw [norm_smul, Real.norm_of_nonneg ha_nonneg] + _ ≤ a * R := by + exact mul_le_mul_of_nonneg_left (by simpa [R] using hdist) ha_nonneg + have hφ_int' : + MeasureTheory.IntegrableOn (fun z => φ z * ‖z - x‖) U MeasureTheory.volume := by + simpa [norm_sub_rev] using hφ_int + have htarget_int : + MeasureTheory.IntegrableOn + (fun z => φ z * ‖z - x‖) + (U ∩ Metric.closedBall x (a * R)) MeasureTheory.volume := + hφ_int'.mono_set (by intro z hz; exact hz.1) + have hmono : + ∫ u in S, φ u * ‖u - x‖ ∂MeasureTheory.volume ≤ + ∫ u in U ∩ Metric.closedBall x (a * R), φ u * ‖u - x‖ ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_mono_set htarget_int + (Filter.Eventually.of_forall (fun u => mul_nonneg (hφ_nonneg u) (norm_nonneg _))) + hsub_ball.eventuallyLE + have hcoeff_nonneg : 0 ≤ ((1 - t) ^ (d + 1 : ℕ))⁻¹ := by + positivity + calc + ∫ y in U, φ (segmentBlend x t y) * ‖x - y‖ ∂MeasureTheory.volume + = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ∫ z in S, φ z * ‖z - x‖ ∂MeasureTheory.volume := by + simpa [a, S] using + setIntegral_segmentBlend_mul_norm_sub_eq_inv_pow_mul_setIntegral_scaled + hU.isOpen.measurableSet (x := x) (t := t) ht1 + _ ≤ ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x (a * R), φ z * ‖z - x‖ ∂MeasureTheory.volume := by + exact mul_le_mul_of_nonneg_left hmono hcoeff_nonneg + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * (2 * Classical.choose hU.isBoundedDomain)), + φ z * ‖x - z‖ ∂MeasureTheory.volume := by + simp [a, R, norm_sub_rev] + +end SegmentChangeOfVariables + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/TimeCollapse.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/TimeCollapse.lean new file mode 100644 index 0000000000..1e1c43b94b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpKernel/TimeCollapse.lean @@ -0,0 +1,766 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLpKernel.SegmentChangeOfVariables +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.MeasureTheory.Integral.Bochner.ContinuousLinearMap +public import Mathlib.MeasureTheory.Measure.WithDensity + +/-! # Time Collapse -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric +open scoped ENNReal NNReal Pointwise + +/-- File-level typeclass cache for `Nontrivial (Vec d)` under `[NeZero d]`. +Moved from section-scoped to file-level — the section variant didn't +cache file-wide. See `PoincareZeroTrace.lean` for the pattern. -/ +private instance instNontrivialVecTimeCollapse (d : ℕ) [NeZero d] : + Nontrivial (Vec d) := inferInstance + +/-! +# Time-collapse estimates for the Riesz-kernel Poincare integrand + +Collects the `intervalIntegral`-level lemmas that bound the time-averaged +segment-blend integrand against `rieszKernel`. +-/ + +section TimeCollapse + +variable {d : ℕ} [NeZero d] + +private theorem inv_natPow_eq_rpow_neg_nat {a : ℝ} (ha : 0 ≤ a) (n : ℕ) : + (a ^ n)⁻¹ = a ^ (-((n : ℕ) : ℝ)) := by + rw [← Real.rpow_natCast, Real.rpow_neg ha] + +private theorem intervalIntegral_inv_pow_if_le_mul_le_rieszAux + {ρ R : ℝ} (hρ : 0 ≤ ρ) (hR : 0 < R) : + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then ρ else 0) ≤ + ((R ^ d) / (d : ℝ)) * ρ ^ (1 - (d : ℝ)) := by + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_iff_ne_zero.mpr (NeZero.ne d) + have hd_ne : (d : ℝ) ≠ 0 := by + exact_mod_cast (NeZero.ne d) + by_cases hρ_zero : ρ = 0 + · have hleft : + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then ρ else 0) = 0 := by + simp [hρ_zero] + rw [hleft, hρ_zero] + exact mul_nonneg + (div_nonneg (pow_nonneg hR.le _) hd_pos.le) + (Real.rpow_nonneg (by positivity) _) + · have hρ_pos : 0 < ρ := lt_of_le_of_ne hρ (by simpa [eq_comm] using hρ_zero) + by_cases hρ_ltR : ρ < R + · let a : ℝ := 1 - ρ / R + have ha_nonneg : 0 ≤ a := by + dsimp [a] + have hdiv_lt : ρ / R < 1 := by + rw [div_lt_iff₀ hR] + simpa using hρ_ltR + linarith + have ha_le_one : a ≤ 1 := by + dsimp [a] + have hdiv_nonneg : 0 ≤ ρ / R := by + positivity + linarith + have ha_mem : a ∈ Set.Icc (0 : ℝ) 1 := ⟨ha_nonneg, ha_le_one⟩ + have hiff (t : ℝ) : ρ ≤ (1 - t) * R ↔ t ≤ a := by + dsimp [a] + constructor + · intro htρ + have hdiv : ρ / R ≤ 1 - t := by + rw [div_le_iff₀ hR] + simpa [mul_comm, mul_left_comm, mul_assoc] using htρ + linarith + · intro htρ + have hdiv : ρ / R ≤ 1 - t := by + linarith + rw [div_le_iff₀ hR] at hdiv + simpa [mul_comm, mul_left_comm, mul_assoc] using hdiv + have hcongr : + ∀ᵐ t ∂MeasureTheory.volume, t ∈ Set.uIoc (0 : ℝ) 1 → + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then ρ else 0) = + Set.indicator {t : ℝ | t ≤ a} + (fun t => ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ρ) t := by + exact Filter.Eventually.of_forall fun t ht => by + simp [Set.indicator, hiff t] + have hrexp : + ∫ t in (0 : ℝ)..a, ((1 - t) ^ (d + 1 : ℕ))⁻¹ = + ∫ t in (0 : ℝ)..a, (1 - t) ^ (-((d + 1 : ℕ) : ℝ)) := by + refine intervalIntegral.integral_congr_ae ?_ + exact Filter.Eventually.of_forall fun t ht => by + rw [Set.uIoc_of_le ha_nonneg] at ht + have hbase_nonneg : 0 ≤ 1 - t := by + linarith [ht.2, ha_le_one] + rw [inv_natPow_eq_rpow_neg_nat hbase_nonneg] + have hsub : + ∫ t in (0 : ℝ)..a, (1 - t) ^ (-((d + 1 : ℕ) : ℝ)) = + ∫ s in 1 - a..1, s ^ (-((d + 1 : ℕ) : ℝ)) := by + simpa using + (intervalIntegral.integral_comp_sub_left + (f := fun s : ℝ => s ^ (-((d + 1 : ℕ) : ℝ))) (a := 0) (b := a) 1) + have hone_sub_a_eq : 1 - a = ρ / R := by + dsimp [a] + ring + have hone_sub_a_pos : 0 < 1 - a := by + rw [hone_sub_a_eq] + exact div_pos hρ_pos hR + have hzero_not_mem : (0 : ℝ) ∉ Set.uIcc (1 - a) (1 : ℝ) := by + rw [Set.uIcc_of_le (by linarith : 1 - a ≤ (1 : ℝ))] + simp [not_le.mpr hone_sub_a_pos] + have hexp_ne : (-((d + 1 : ℕ) : ℝ)) ≠ -1 := by + intro h + have h_cast : ((d + 1 : ℕ) : ℝ) = 1 := by + linarith + have h_nat : d + 1 = 1 := by + exact_mod_cast h_cast + have hdzero_nat : d = 0 := by + omega + have hdzero : (d : ℝ) = 0 := by + exact_mod_cast hdzero_nat + exact hd_ne hdzero + have hpow_formula : + ∫ s in 1 - a..1, s ^ (-((d + 1 : ℕ) : ℝ)) = + ((1 - a) ^ (-(d : ℝ)) - 1) / (d : ℝ) := by + calc + ∫ s in 1 - a..1, s ^ (-((d + 1 : ℕ) : ℝ)) + = (1 ^ (-(d : ℝ)) - (1 - a) ^ (-(d : ℝ))) / (-(d : ℝ)) := by + simpa using + (integral_rpow (a := 1 - a) (b := (1 : ℝ)) + (r := -((d + 1 : ℕ) : ℝ)) (Or.inr ⟨hexp_ne, hzero_not_mem⟩)) + _ = ((1 - a) ^ (-(d : ℝ)) - 1) / (d : ℝ) := by + have h_one : (1 : ℝ) ^ (-(d : ℝ)) = 1 := by simp + rw [h_one] + field_simp [hd_ne] + ring + have hratio : + (ρ / R) ^ (-(d : ℝ)) = (R ^ d : ℝ) / (ρ ^ d : ℝ) := by + calc + (ρ / R) ^ (-(d : ℝ)) = ((ρ / R) ^ (d : ℝ))⁻¹ := by + rw [Real.rpow_neg (by positivity : 0 ≤ ρ / R)] + _ = ((ρ ^ d : ℝ) / (R ^ d : ℝ))⁻¹ := by + rw [Real.div_rpow hρ hR.le, Real.rpow_natCast, Real.rpow_natCast] + _ = (R ^ d : ℝ) / (ρ ^ d : ℝ) := by + field_simp [hρ_pos.ne', hR.ne'] + have hρ_rpow : + ρ ^ (1 - (d : ℝ)) = ρ / (ρ ^ d : ℝ) := by + calc + ρ ^ (1 - (d : ℝ)) = ρ ^ (1 : ℝ) * ρ ^ (-(d : ℝ)) := by + rw [show (1 - (d : ℝ)) = (1 : ℝ) + (-(d : ℝ)) by ring, Real.rpow_add hρ_pos] + _ = ρ * ((ρ ^ d : ℝ)⁻¹) := by + rw [Real.rpow_one, Real.rpow_neg hρ, Real.rpow_natCast] + _ = ρ / (ρ ^ d : ℝ) := by + ring + calc + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then ρ else 0) + = ∫ t in (0 : ℝ)..a, ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ρ := by + rw [intervalIntegral.integral_congr_ae hcongr] + simpa using + (intervalIntegral.integral_indicator + (μ := MeasureTheory.volume) + (f := fun t => ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ρ) ha_mem) + _ = ρ * ∫ t in (0 : ℝ)..a, ((1 - t) ^ (d + 1 : ℕ))⁻¹ := by + rw [intervalIntegral.integral_mul_const, mul_comm] + _ = ρ * ∫ t in (0 : ℝ)..a, (1 - t) ^ (-((d + 1 : ℕ) : ℝ)) := by + rw [hrexp] + _ = ρ * ∫ s in 1 - a..1, s ^ (-((d + 1 : ℕ) : ℝ)) := by + rw [hsub] + _ = ρ * (((1 - a) ^ (-(d : ℝ)) - 1) / (d : ℝ)) := by + rw [hpow_formula] + _ ≤ ρ * (((1 - a) ^ (-(d : ℝ))) / (d : ℝ)) := by + refine mul_le_mul_of_nonneg_left ?_ hρ + have hrpow_nonneg : 0 ≤ (1 - a) ^ (-(d : ℝ)) := + Real.rpow_nonneg (le_of_lt hone_sub_a_pos) _ + have hsub_le : (1 - a) ^ (-(d : ℝ)) - 1 ≤ (1 - a) ^ (-(d : ℝ)) := by + linarith + exact div_le_div_of_nonneg_right hsub_le hd_pos.le + _ = ρ * (((ρ / R) ^ (-(d : ℝ))) / (d : ℝ)) := by + rw [hone_sub_a_eq] + _ = ρ * ((((R ^ d : ℝ) / (ρ ^ d : ℝ))) / (d : ℝ)) := by + rw [hratio] + _ = ((R ^ d) / (d : ℝ)) * (ρ / (ρ ^ d : ℝ)) := by + rw [div_eq_mul_inv, div_eq_mul_inv, div_eq_mul_inv, div_eq_mul_inv] + ring + _ = ((R ^ d) / (d : ℝ)) * ρ ^ (1 - (d : ℝ)) := by + rw [hρ_rpow] + · have hR_le_ρ : R ≤ ρ := le_of_not_gt hρ_ltR + have hleft_zero : + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then ρ else 0) = 0 := by + refine intervalIntegral.integral_zero_ae ?_ + exact Filter.Eventually.of_forall fun t ht => by + rw [Set.uIoc_of_le zero_le_one] at ht + have hrad_lt : (1 - t) * R < R := by + nlinarith [ht.1, hR] + have hnot : ¬ ρ ≤ (1 - t) * R := by + intro hle + exact not_le_of_gt hrad_lt (le_trans hR_le_ρ hle) + simp [hnot] + rw [hleft_zero] + exact mul_nonneg + (div_nonneg (pow_nonneg hR.le _) hd_pos.le) + (Real.rpow_nonneg hρ _) +omit [NeZero d] in +private theorem intervalIntegrable_inv_pow_if_le_mul + {ρ R c : ℝ} (_hc : 0 ≤ c) (hρ : 0 ≤ ρ) (hR : 0 < R) : + IntervalIntegrable + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + MeasureTheory.volume 0 1 := by + rw [intervalIntegrable_iff_integrableOn_Ioc_of_le zero_le_one] + by_cases hρ_zero : ρ = 0 + · simpa [hρ_zero] using + (MeasureTheory.integrableOn_const (s := Set.Ioc (0 : ℝ) 1) (C := (0 : ℝ))) + · have hρ_pos : 0 < ρ := lt_of_le_of_ne hρ (by simpa [eq_comm] using hρ_zero) + by_cases hρ_ltR : ρ < R + · let a : ℝ := 1 - ρ / R + let g : ℝ → ℝ := fun t => ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (c * ρ) + have ha_nonneg : 0 ≤ a := by + dsimp [a] + have hdiv_lt : ρ / R < 1 := by + rw [div_lt_iff₀ hR] + simpa using hρ_ltR + linarith + have ha_lt_one : a < 1 := by + dsimp [a] + have hdiv_pos : 0 < ρ / R := div_pos hρ_pos hR + linarith + have ha_le_one : a ≤ 1 := ha_lt_one.le + have hiff (t : ℝ) : ρ ≤ (1 - t) * R ↔ t ≤ a := by + dsimp [a] + constructor + · intro htρ + have hdiv : ρ / R ≤ 1 - t := by + rw [div_le_iff₀ hR] + simpa [mul_comm, mul_left_comm, mul_assoc] using htρ + linarith + · intro htρ + have hdiv : ρ / R ≤ 1 - t := by + linarith + rw [div_le_iff₀ hR] at hdiv + simpa [mul_comm, mul_left_comm, mul_assoc] using hdiv + have hg_cont_pow : + ContinuousOn (fun t : ℝ => ((1 - t) ^ (d + 1 : ℕ) : ℝ)) (Set.Icc (0 : ℝ) a) := by + fun_prop + have hg_cont_inv : + ContinuousOn (fun t : ℝ => (((1 - t) ^ (d + 1 : ℕ) : ℝ)⁻¹) ) (Set.Icc (0 : ℝ) a) := by + refine hg_cont_pow.inv₀ ?_ + intro t ht + have hbase_pos : 0 < 1 - t := by + linarith [ht.2, ha_lt_one] + exact pow_ne_zero _ (sub_ne_zero.mpr (by linarith)) + have hg_cont : ContinuousOn g (Set.Icc (0 : ℝ) a) := by + exact hg_cont_inv.mul continuousOn_const + have hg_int_Icc : MeasureTheory.IntegrableOn g (Set.Icc (0 : ℝ) a) MeasureTheory.volume := + hg_cont.integrableOn_compact isCompact_Icc + have hg_int : MeasureTheory.IntegrableOn g (Set.Ioc (0 : ℝ) a) MeasureTheory.volume := + hg_int_Icc.mono_set (by + intro t ht + exact ⟨ht.1.le, ht.2⟩) + have hleft_eq : + Set.EqOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + g + (Set.Ioc (0 : ℝ) a) := by + intro t ht + have hcond : ρ ≤ (1 - t) * R := (hiff t).2 ht.2 + simp [g, hcond] + have hleft_int : + MeasureTheory.IntegrableOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + (Set.Ioc (0 : ℝ) a) MeasureTheory.volume := + hg_int.congr_fun hleft_eq.symm measurableSet_Ioc + have hright_zero : + Set.EqOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + (fun _ : ℝ => 0) + (Set.Ioc a 1) := by + intro t ht + have hnot : ¬ ρ ≤ (1 - t) * R := by + intro hle + exact not_le_of_gt ht.1 ((hiff t).1 hle) + simp [hnot] + have hright_int : + MeasureTheory.IntegrableOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + (Set.Ioc a 1) MeasureTheory.volume := by + exact + (MeasureTheory.integrableOn_const (s := Set.Ioc a 1) (C := (0 : ℝ)) + (hs := measure_Ioc_lt_top.ne)).congr_fun + hright_zero.symm measurableSet_Ioc + have hunion : Set.Ioc (0 : ℝ) a ∪ Set.Ioc a 1 = Set.Ioc (0 : ℝ) 1 := by + ext t + constructor + · intro ht + rcases ht with ht | ht + exact ⟨ht.1, le_trans ht.2 ha_le_one⟩ + exact ⟨lt_of_le_of_lt ha_nonneg ht.1, ht.2⟩ + · intro ht + by_cases hta : t ≤ a + · exact Or.inl ⟨ht.1, hta⟩ + · exact Or.inr ⟨lt_of_not_ge hta, ht.2⟩ + simpa [hunion] using hleft_int.union hright_int + · have hR_le_ρ : R ≤ ρ := le_of_not_gt hρ_ltR + have hzero : + Set.EqOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ρ ≤ (1 - t) * R then c * ρ else 0)) + (fun _ : ℝ => 0) + (Set.Ioc (0 : ℝ) 1) := by + intro t ht + have hrad_lt : (1 - t) * R < R := by + nlinarith [ht.1, hR] + have hnot : ¬ ρ ≤ (1 - t) * R := by + intro hle + exact not_le_of_gt hrad_lt (le_trans hR_le_ρ hle) + simp [hnot] + exact (MeasureTheory.integrableOn_const (s := Set.Ioc (0 : ℝ) 1) (C := (0 : ℝ)) + (hs := measure_Ioc_lt_top.ne)).congr_fun + hzero.symm measurableSet_Ioc + +theorem intervalIntegral_inv_pow_if_norm_sub_le_mul_le_rieszKernel + {x z : Vec d} {R : ℝ} (hR : 0 < R) : + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0) ≤ + ((R ^ d) / (d : ℝ)) * rieszKernel x z := by + simpa [rieszKernel] using + intervalIntegral_inv_pow_if_le_mul_le_rieszAux (d := d) + (ρ := ‖x - z‖) (R := R) (norm_nonneg _) hR + +private theorem setIntegral_inv_pow_if_norm_sub_le_mul_le_rieszKernel + {x z : Vec d} {R : ℝ} (hR : 0 < R) : + ∫ t in Set.Ioc (0 : ℝ) 1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0) + ∂MeasureTheory.volume ≤ + ((R ^ d) / (d : ℝ)) * rieszKernel x z := by + rw [← intervalIntegral.integral_of_le zero_le_one] + exact intervalIntegral_inv_pow_if_norm_sub_le_mul_le_rieszKernel (d := d) (x := x) (z := z) hR + +omit [NeZero d] in +private theorem integrable_restrict_Ioc_inv_pow_if_norm_sub_le_mul + {x z : Vec d} {R : ℝ} (hR : 0 < R) : + MeasureTheory.Integrable + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0)) + (MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)) := by + change MeasureTheory.IntegrableOn + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0)) + (Set.Ioc (0 : ℝ) 1) MeasureTheory.volume + have htmp : + IntervalIntegrable + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0)) + MeasureTheory.volume 0 1 := by + simpa using + (intervalIntegrable_inv_pow_if_le_mul (d := d) (ρ := ‖x - z‖) (R := R) (c := (1 : ℝ)) + zero_le_one (norm_nonneg _) hR) + exact (intervalIntegrable_iff_integrableOn_Ioc_of_le zero_le_one).1 htmp + +omit [NeZero d] in +private theorem integrable_rieszKernel_withDensity_of_integrableOn_mul_rieszKernel + {U : Set (Vec d)} {x : Vec d} {φ : Vec d → ℝ} + (hφ_nonneg : ∀ z, 0 ≤ φ z) + (hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U)) + (hφK_int : + MeasureTheory.IntegrableOn + (fun z => φ z * rieszKernel x z) U MeasureTheory.volume) : + let μU : MeasureTheory.Measure (Vec d) := + (MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z)) + MeasureTheory.Integrable (fun z => rieszKernel x z) μU := by + dsimp + rw [MeasureTheory.integrable_withDensity_iff_integrable_smul₀' + (μ := MeasureTheory.volume.restrict U) + (f := fun z => ENNReal.ofReal (φ z)) + (g := fun z => rieszKernel x z)] + · simpa [MeasureTheory.IntegrableOn, smul_eq_mul, hφ_nonneg] using hφK_int + · simpa using hφ_meas.ennreal_ofReal + · exact Filter.Eventually.of_forall (fun z => by simp) + +omit [NeZero d] in +private theorem measurable_timeCollapseKernel + {x : Vec d} {R : ℝ} : + Measurable (fun p : Vec d × ℝ => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - p.1‖ ≤ (1 - p.2) * R then ‖x - p.1‖ else 0)) := by + let s : Set (Vec d × ℝ) := {p : Vec d × ℝ | ‖x - p.1‖ ≤ (1 - p.2) * R} + have hs : MeasurableSet s := by + dsimp [s] + exact (isClosed_le ((continuous_const.sub continuous_fst).norm) + ((continuous_const.sub continuous_snd).mul continuous_const)).measurableSet + have hg : Measurable (fun p : Vec d × ℝ => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * ‖x - p.1‖) := by + fun_prop + simpa [s, Set.indicator, Pi.zero_apply] using! hg.indicator hs + +private theorem integrable_timeCollapseKernel_withDensity + {U : Set (Vec d)} {x : Vec d} {R : ℝ} (hR : 0 < R) + {φ : Vec d → ℝ} + (hφ_nonneg : ∀ z, 0 ≤ φ z) + (hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U)) + (hφK_int : + MeasureTheory.IntegrableOn + (fun z => φ z * rieszKernel x z) U MeasureTheory.volume) : + let μU : MeasureTheory.Measure (Vec d) := + (MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z)) + let μI : MeasureTheory.Measure ℝ := + MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1) + MeasureTheory.Integrable + (fun p : Vec d × ℝ => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - p.1‖ ≤ (1 - p.2) * R then ‖x - p.1‖ else 0)) + (μU.prod μI) := by + dsimp + let F : Vec d × ℝ → ℝ := fun p => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - p.1‖ ≤ (1 - p.2) * R then ‖x - p.1‖ else 0) + have hF_meas : Measurable F := measurable_timeCollapseKernel (d := d) (x := x) (R := R) + have hsections : + ∀ᵐ z ∂(MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z)), + MeasureTheory.Integrable + (fun t => F (z, t)) + (MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)) := by + refine Filter.Eventually.of_forall ?_ + intro z + simpa [F] using + integrable_restrict_Ioc_inv_pow_if_norm_sub_le_mul (d := d) (x := x) (z := z) hR + have hkernel_int : + MeasureTheory.Integrable + (fun z => rieszKernel x z) + ((MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))) := + integrable_rieszKernel_withDensity_of_integrableOn_mul_rieszKernel + (hφ_nonneg := hφ_nonneg) (hφ_meas := hφ_meas) (hφK_int := hφK_int) + have hright : + MeasureTheory.Integrable + (fun z => ((R ^ d) / (d : ℝ)) * rieszKernel x z) + ((MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))) := by + simpa [smul_eq_mul, mul_comm, mul_left_comm, mul_assoc] using + hkernel_int.const_mul ((R ^ d) / (d : ℝ)) + have hpointwise : + (fun z => + ∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1))) ≤ᵐ[ + (MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))] + (fun z => ((R ^ d) / (d : ℝ)) * rieszKernel x z) := by + refine Filter.Eventually.of_forall ?_ + intro z + change + ∫ t in Set.Ioc (0 : ℝ) 1, ‖F (z, t)‖ ∂MeasureTheory.volume ≤ + ((R ^ d) / (d : ℝ)) * rieszKernel x z + have hnorm_eq : + Set.EqOn + (fun t : ℝ => ‖F (z, t)‖) + (fun t : ℝ => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0)) + (Set.Ioc (0 : ℝ) 1) := by + intro t ht + by_cases hcond : ‖x - z‖ ≤ (1 - t) * R + · have hnonneg : + 0 ≤ ((1 - t) ^ (d + 1 : ℕ))⁻¹ * ‖x - z‖ := by + have hbase_nonneg : 0 ≤ 1 - t := by + linarith [ht.2] + exact mul_nonneg (inv_nonneg.mpr (pow_nonneg hbase_nonneg _)) (norm_nonneg _) + simp [F, hcond, Real.norm_of_nonneg hnonneg] + · simp [F, hcond] + rw [MeasureTheory.setIntegral_congr_fun measurableSet_Ioc hnorm_eq] + exact setIntegral_inv_pow_if_norm_sub_le_mul_le_rieszKernel (d := d) (x := x) (z := z) hR + have hleft_aestronglyMeasurable : + AEStronglyMeasurable + (fun z => + ∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1))) + ((MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))) := by + exact hF_meas.norm.aemeasurable.aestronglyMeasurable.integral_prod_right' + have hleft_bound : + ∀ᵐ z ∂((MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))), + ‖∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1))‖ ≤ + ((R ^ d) / (d : ℝ)) * rieszKernel x z := by + filter_upwards [hpointwise] with z hz + have hnonneg : + 0 ≤ ∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)) := by + exact MeasureTheory.integral_nonneg (fun t => norm_nonneg _) + calc + ‖∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1))‖ + = ∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)) := by + rw [Real.norm_eq_abs, abs_of_nonneg hnonneg] + _ ≤ ((R ^ d) / (d : ℝ)) * rieszKernel x z := hz + have houter : + MeasureTheory.Integrable + (fun z => + ∫ t, ‖F (z, t)‖ ∂(MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1))) + ((MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z))) := + hright.mono' hleft_aestronglyMeasurable hleft_bound + exact (MeasureTheory.integrable_prod_iff (μ := (MeasureTheory.volume.restrict U).withDensity + (fun z => ENNReal.ofReal (φ z))) + (ν := MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1)) + hF_meas.aestronglyMeasurable).2 ⟨hsections, houter⟩ + +omit [NeZero d] in +private theorem setIntegral_indicator_closedBall_eq_setIntegral_inter_closedBall + {U : Set (Vec d)} {x : Vec d} {r : ℝ} {ψ : Vec d → ℝ} : + ∫ z in U, (Metric.closedBall x r).indicator (fun z => ψ z * ‖x - z‖) z + ∂MeasureTheory.volume = + ∫ z in U ∩ Metric.closedBall x r, ψ z * ‖x - z‖ ∂MeasureTheory.volume := by + simpa using + (MeasureTheory.setIntegral_indicator (μ := MeasureTheory.volume) (s := U) + (t := Metric.closedBall x r) (f := fun z => ψ z * ‖x - z‖) measurableSet_closedBall) + +theorem setIntegral_inv_pow_setIntegral_inter_closedBall_le_rieszKernel + {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {x : Vec d} {R : ℝ} (hR : 0 < R) {φ : Vec d → ℝ} + (hφ_nonneg : ∀ z, 0 ≤ φ z) + (hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U)) + (hφK_int : + MeasureTheory.IntegrableOn + (fun z => φ z * rieszKernel x z) U MeasureTheory.volume) : + ∫ t in Set.Ioc (0 : ℝ) 1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume + ≤ + ((R ^ d) / (d : ℝ)) * + ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + let μU : MeasureTheory.Measure (Vec d) := + (MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z)) + let μI : MeasureTheory.Measure ℝ := + MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1) + let C : ℝ := (R ^ d) / (d : ℝ) + let F : Vec d × ℝ → ℝ := fun p => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - p.1‖ ≤ (1 - p.2) * R then ‖x - p.1‖ else 0) + have hprod_int : MeasureTheory.Integrable F (μU.prod μI) := by + simpa [μU, μI, F] using + integrable_timeCollapseKernel_withDensity (d := d) (x := x) (R := R) hR + (hφ_nonneg := hφ_nonneg) (hφ_meas := hφ_meas) (hφK_int := hφK_int) + have hkernel_int : MeasureTheory.Integrable (fun z => rieszKernel x z) μU := by + simpa [μU] using + integrable_rieszKernel_withDensity_of_integrableOn_mul_rieszKernel + (hφ_nonneg := hφ_nonneg) (hφ_meas := hφ_meas) (hφK_int := hφK_int) + have hright_int : MeasureTheory.Integrable (fun z => C * rieszKernel x z) μU := by + simpa [C, smul_eq_mul, mul_comm, mul_left_comm, mul_assoc] using hkernel_int.const_mul C + have hinner_bound : + (fun z => ∫ t, F (z, t) ∂μI) ≤ᵐ[μU] + (fun z => C * rieszKernel x z) := by + refine Filter.Eventually.of_forall ?_ + intro z + change + ∫ t in Set.Ioc (0 : ℝ) 1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - z‖ ≤ (1 - t) * R then ‖x - z‖ else 0) + ∂MeasureTheory.volume ≤ + C * rieszKernel x z + simpa [C] using + setIntegral_inv_pow_if_norm_sub_le_mul_le_rieszKernel (d := d) (x := x) (z := z) hR + have hleft_int : MeasureTheory.Integrable (fun z => ∫ t, F (z, t) ∂μI) μU := + hprod_int.integral_prod_left + have hcollapse : + ∫ z, ∫ t, F (z, t) ∂μI ∂μU ≤ ∫ z, C * rieszKernel x z ∂μU := by + exact MeasureTheory.integral_mono_ae hleft_int hright_int hinner_bound + have hinner_eq (t : ℝ) : + ∫ z, F (z, t) ∂μU = + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume := by + have htop : + ∀ᵐ z ∂(MeasureTheory.volume.restrict U), ENNReal.ofReal (φ z) < ∞ := by + exact Filter.Eventually.of_forall (fun z => by simp) + calc + ∫ z, F (z, t) ∂μU + = ∫ z in U, φ z * F (z, t) ∂MeasureTheory.volume := by + simpa [μU, smul_eq_mul, hφ_nonneg] using + (integral_withDensity_eq_integral_toReal_smul₀ + (μ := MeasureTheory.volume.restrict U) + (f_meas := hφ_meas.ennreal_ofReal) + (hf_lt_top := htop) + (g := fun z => F (z, t))) + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U, (Metric.closedBall x ((1 - t) * R)).indicator + (fun z => φ z * ‖x - z‖) z ∂MeasureTheory.volume := by + have hEq : + Set.EqOn + (fun z => φ z * F (z, t)) + (fun z => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + (Metric.closedBall x ((1 - t) * R)).indicator + (fun z => φ z * ‖x - z‖) z) + U := by + intro z hz + by_cases hcond : ‖x - z‖ ≤ (1 - t) * R + · have hball : z ∈ Metric.closedBall x ((1 - t) * R) := by + simpa [Metric.mem_closedBall, dist_eq_norm, norm_sub_rev] using hcond + simp [F, hcond, hball] + ring + · have hball : z ∉ Metric.closedBall x ((1 - t) * R) := by + intro hzball + exact hcond (by + simpa [Metric.mem_closedBall, dist_eq_norm, norm_sub_rev] using hzball) + simp [F, hcond, hball] + simpa [MeasureTheory.integral_const_mul] using + (MeasureTheory.setIntegral_congr_fun hU_meas hEq) + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume := by + rw [setIntegral_indicator_closedBall_eq_setIntegral_inter_closedBall] + have houter_eq : + ∫ t, ∫ z, F (z, t) ∂μU ∂μI = + ∫ t in Set.Ioc (0 : ℝ) 1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume ∂MeasureTheory.volume := by + simpa [μI] using + (MeasureTheory.setIntegral_congr_fun measurableSet_Ioc (fun t _ => hinner_eq t)) + have hright_eq : + ∫ z, C * rieszKernel x z ∂μU = + C * ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + have htop : + ∀ᵐ z ∂(MeasureTheory.volume.restrict U), ENNReal.ofReal (φ z) < ∞ := by + exact Filter.Eventually.of_forall (fun z => by simp) + calc + ∫ z, C * rieszKernel x z ∂μU + = ∫ z in U, φ z * (C * rieszKernel x z) ∂MeasureTheory.volume := by + simpa [μU, smul_eq_mul, hφ_nonneg] using + (integral_withDensity_eq_integral_toReal_smul₀ + (μ := MeasureTheory.volume.restrict U) + (f_meas := hφ_meas.ennreal_ofReal) + (hf_lt_top := htop) + (g := fun z => C * rieszKernel x z)) + _ = ∫ z in U, C * (φ z * rieszKernel x z) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU_meas ?_ + intro z hz + ring + _ = C * ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + calc + ∫ t in Set.Ioc (0 : ℝ) 1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume ∂MeasureTheory.volume + = ∫ t, ∫ z, F (z, t) ∂μU ∂μI := by + rw [houter_eq] + _ = ∫ z, ∫ t, F (z, t) ∂μI ∂μU := by + exact (MeasureTheory.integral_integral_swap hprod_int).symm + _ ≤ ∫ z, C * rieszKernel x z ∂μU := hcollapse + _ = C * ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := hright_eq + _ = ((R ^ d) / (d : ℝ)) * + ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + simp [C] + +theorem intervalIntegrable_inv_pow_setIntegral_inter_closedBall + {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {x : Vec d} {R : ℝ} (hR : 0 < R) {φ : Vec d → ℝ} + (hφ_nonneg : ∀ z, 0 ≤ φ z) + (hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U)) + (hφK_int : + MeasureTheory.IntegrableOn + (fun z => φ z * rieszKernel x z) U MeasureTheory.volume) : + IntervalIntegrable + (fun t => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume) + MeasureTheory.volume 0 1 := by + let μU : MeasureTheory.Measure (Vec d) := + (MeasureTheory.volume.restrict U).withDensity (fun z => ENNReal.ofReal (φ z)) + let μI : MeasureTheory.Measure ℝ := + MeasureTheory.volume.restrict (Set.Ioc (0 : ℝ) 1) + let F : Vec d × ℝ → ℝ := fun p => + ((1 - p.2) ^ (d + 1 : ℕ))⁻¹ * + (if ‖x - p.1‖ ≤ (1 - p.2) * R then ‖x - p.1‖ else 0) + have hprod_int : MeasureTheory.Integrable F (μU.prod μI) := by + simpa [μU, μI, F] using + integrable_timeCollapseKernel_withDensity (d := d) (x := x) (R := R) hR + (hφ_nonneg := hφ_nonneg) (hφ_meas := hφ_meas) (hφK_int := hφK_int) + have houter_int : MeasureTheory.Integrable (fun t => ∫ z, F (z, t) ∂μU) μI := + hprod_int.integral_prod_right + have hinner_eq (t : ℝ) : + ∫ z, F (z, t) ∂μU = + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume := by + have htop : + ∀ᵐ z ∂(MeasureTheory.volume.restrict U), ENNReal.ofReal (φ z) < ∞ := by + exact Filter.Eventually.of_forall (fun z => by simp) + calc + ∫ z, F (z, t) ∂μU + = ∫ z in U, φ z * F (z, t) ∂MeasureTheory.volume := by + simpa [μU, smul_eq_mul, hφ_nonneg] using + (integral_withDensity_eq_integral_toReal_smul₀ + (μ := MeasureTheory.volume.restrict U) + (f_meas := hφ_meas.ennreal_ofReal) + (hf_lt_top := htop) + (g := fun z => F (z, t))) + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U, (Metric.closedBall x ((1 - t) * R)).indicator + (fun z => φ z * ‖x - z‖) z ∂MeasureTheory.volume := by + have hEq : + Set.EqOn + (fun z => φ z * F (z, t)) + (fun z => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + (Metric.closedBall x ((1 - t) * R)).indicator + (fun z => φ z * ‖x - z‖) z) + U := by + intro z hz + by_cases hcond : ‖x - z‖ ≤ (1 - t) * R + · have hball : z ∈ Metric.closedBall x ((1 - t) * R) := by + simpa [Metric.mem_closedBall, dist_eq_norm, norm_sub_rev] using hcond + simp [F, hcond, hball] + ring + · have hball : z ∉ Metric.closedBall x ((1 - t) * R) := by + intro hzball + exact hcond (by + simpa [Metric.mem_closedBall, dist_eq_norm, norm_sub_rev] using hzball) + simp [F, hcond, hball] + simpa [MeasureTheory.integral_const_mul] using + (MeasureTheory.setIntegral_congr_fun hU_meas hEq) + _ = ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume := by + rw [setIntegral_indicator_closedBall_eq_setIntegral_inter_closedBall] + have houter_int' : + MeasureTheory.Integrable + (fun t => + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume) + μI := by + refine houter_int.congr ?_ + exact Filter.Eventually.of_forall hinner_eq + rw [intervalIntegrable_iff_integrableOn_Ioc_of_le zero_le_one] + simpa [MeasureTheory.IntegrableOn, μI] using houter_int' + +theorem intervalIntegral_inv_pow_setIntegral_inter_closedBall_le_rieszKernel + {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {x : Vec d} {R : ℝ} (hR : 0 < R) {φ : Vec d → ℝ} + (hφ_nonneg : ∀ z, 0 ≤ φ z) + (hφ_meas : AEMeasurable φ (MeasureTheory.volume.restrict U)) + (hφK_int : + MeasureTheory.IntegrableOn + (fun z => φ z * rieszKernel x z) U MeasureTheory.volume) : + ∫ t in (0 : ℝ)..1, + ((1 - t) ^ (d + 1 : ℕ))⁻¹ * + ∫ z in U ∩ Metric.closedBall x ((1 - t) * R), φ z * ‖x - z‖ + ∂MeasureTheory.volume + ≤ + ((R ^ d) / (d : ℝ)) * + ∫ z in U, φ z * rieszKernel x z ∂MeasureTheory.volume := by + rw [intervalIntegral.integral_of_le zero_le_one] + exact setIntegral_inv_pow_setIntegral_inter_closedBall_le_rieszKernel + (d := d) hU_meas hR hφ_nonneg hφ_meas hφK_int + +end TimeCollapse + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpSmooth.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpSmooth.lean new file mode 100644 index 0000000000..edb5537d48 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareLpSmooth.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Calculus.Deriv.Mul +public import Mathlib.Analysis.Calculus.FDeriv.Add +public import Mathlib.MeasureTheory.Integral.IntervalIntegral.FundThmCalculus + +/-! # Poincare Lp Smooth -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Smooth segment estimates for convex-domain Poincare + +This file begins the genuinely analytic side of the convex-domain Poincare +proof. The first step is the fundamental theorem of calculus along the affine +segment joining `y` to `x`, expressed with the project-local map +`segmentBlend x t y = y + t • (x - y)`. + +Unlike the ball proof in the De Giorgi development, these lemmas are not tied +to any radial parametrization. They are the smooth, domain-agnostic segment +estimates that the later convex-domain `L^p` argument will integrate in `y` and +then in `x`. +-/ + +private theorem hasDerivAt_segmentBlend {d : ℕ} (x y : Vec d) (t : ℝ) : + HasDerivAt (fun s : ℝ => segmentBlend x s y) (x - y) t := by + have hsmul : HasDerivAt (fun s : ℝ => s • (x - y)) (x - y) t := by + simpa using (hasDerivAt_id t).smul_const (x - y) + have hadd : HasDerivAt (fun s : ℝ => y + s • (x - y)) (x - y) t := + hsmul.const_add y + convert hadd using 1 + funext s + exact segmentBlend_eq_add_smul_sub x y s + +theorem sub_eq_integral_fderiv_along_segment {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (x y : Vec d) : + u x - u y = ∫ t in (0 : ℝ)..1, (fderiv ℝ u (segmentBlend x t y)) (x - y) := by + let γ : ℝ → Vec d := fun t => segmentBlend x t y + have hγ : ∀ t : ℝ, HasDerivAt γ (x - y) t := by + intro t + simpa [γ] using hasDerivAt_segmentBlend x y t + have huγ : + ∀ t : ℝ, HasDerivAt (u ∘ γ) ((fderiv ℝ u (γ t)) (x - y)) t := by + intro t + exact ((hu.differentiable (by norm_num)).differentiableAt).hasFDerivAt.comp_hasDerivAt t + (hγ t) + have hγ_cont : Continuous γ := + continuous_iff_continuousAt.2 fun t => (hγ t).continuousAt + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := hu.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hint : + IntervalIntegrable (fun t => (fderiv ℝ u (γ t)) (x - y)) MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => (fderiv ℝ u (γ t)) (x - y)) := + (hfderiv_cont.comp hγ_cont).clm_apply continuous_const + exact hcont.intervalIntegrable _ _ + have hftc : + ∫ t in (0 : ℝ)..1, (fderiv ℝ u (γ t)) (x - y) = u x - u y := by + simpa [Function.comp, γ] using + (intervalIntegral.integral_eq_sub_of_hasDerivAt (fun t _ => huγ t) hint) + exact hftc.symm + +theorem norm_sub_le_integral_fderiv_along_segment {d : ℕ} {u : Vec d → ℝ} + (hu : ContDiff ℝ (⊤ : ℕ∞) u) (x y : Vec d) : + ‖u x - u y‖ ≤ + ∫ t in (0 : ℝ)..1, ‖(fderiv ℝ u (segmentBlend x t y)) (x - y)‖ := by + let γ : ℝ → Vec d := fun t => segmentBlend x t y + have hγ : ∀ t : ℝ, HasDerivAt γ (x - y) t := by + intro t + simpa [γ] using hasDerivAt_segmentBlend x y t + have hγ_cont : Continuous γ := + continuous_iff_continuousAt.2 fun t => (hγ t).continuousAt + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := hu.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hint : + IntervalIntegrable (fun t => (fderiv ℝ u (γ t)) (x - y)) MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => (fderiv ℝ u (γ t)) (x - y)) := + (hfderiv_cont.comp hγ_cont).clm_apply continuous_const + exact hcont.intervalIntegrable _ _ + have hint_norm : + IntervalIntegrable (fun t => ‖(fderiv ℝ u (γ t)) (x - y)‖) MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => ‖(fderiv ℝ u (γ t)) (x - y)‖) := + continuous_norm.comp ((hfderiv_cont.comp hγ_cont).clm_apply continuous_const) + exact hcont.intervalIntegrable _ _ + calc + ‖u x - u y‖ = + ‖∫ t in (0 : ℝ)..1, (fderiv ℝ u (segmentBlend x t y)) (x - y)‖ := by + rw [sub_eq_integral_fderiv_along_segment hu x y] + _ ≤ ∫ t in (0 : ℝ)..1, ‖(fderiv ℝ u (segmentBlend x t y)) (x - y)‖ := by + exact intervalIntegral.norm_integral_le_integral_norm zero_le_one + +theorem norm_sub_le_integral_norm_fderiv_mul_norm_sub_along_segment + {d : ℕ} {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) (x y : Vec d) : + ‖u x - u y‖ ≤ + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ := by + let γ : ℝ → Vec d := fun t => segmentBlend x t y + have hγ : Continuous γ := by + refine continuous_iff_continuousAt.2 ?_ + intro t + have hderiv : HasDerivAt γ (x - y) t := by + simpa [γ] using hasDerivAt_segmentBlend x y t + exact hderiv.continuousAt + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := hu.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hint_eval : + IntervalIntegrable (fun t => ‖(fderiv ℝ u (γ t)) (x - y)‖) MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => ‖(fderiv ℝ u (γ t)) (x - y)‖) := + continuous_norm.comp ((hfderiv_cont.comp hγ).clm_apply continuous_const) + exact hcont.intervalIntegrable _ _ + have hint_op : + IntervalIntegrable (fun t => ‖fderiv ℝ u (γ t)‖ * ‖x - y‖) + MeasureTheory.volume 0 1 := by + have hcont : Continuous (fun t => ‖fderiv ℝ u (γ t)‖ * ‖x - y‖) := + (continuous_norm.comp (hfderiv_cont.comp hγ)).mul continuous_const + exact hcont.intervalIntegrable _ _ + calc + ‖u x - u y‖ ≤ + ∫ t in (0 : ℝ)..1, ‖(fderiv ℝ u (segmentBlend x t y)) (x - y)‖ := + norm_sub_le_integral_fderiv_along_segment hu x y + _ ≤ ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ := by + refine intervalIntegral.integral_mono_on zero_le_one hint_eval hint_op ?_ + intro t ht + exact ContinuousLinearMap.le_opNorm _ _ + +theorem integral_norm_fderiv_mul_norm_sub_along_segment_le_two_mul_choose_mul_integral_norm_fderiv_along_segment + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) {x y : Vec d} + (hx : x ∈ U) (hy : y ∈ U) : + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ ≤ + (2 * Classical.choose hU) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ := by + let g : ℝ → ℝ := fun t => ‖fderiv ℝ u (segmentBlend x t y)‖ + have hg_cont : Continuous g := by + have hfderiv_cont : Continuous (fderiv ℝ u) := by + have h1 : ContDiff ℝ 1 u := hu.of_le (by norm_num) + exact h1.continuous_fderiv (by norm_num) + have hsegment_cont : Continuous (fun t : ℝ => segmentBlend x t y) := by + refine continuous_iff_continuousAt.2 ?_ + intro t + exact (hasDerivAt_segmentBlend x y t).continuousAt + exact continuous_norm.comp (hfderiv_cont.comp hsegment_cont) + have hg_int : IntervalIntegrable g MeasureTheory.volume 0 1 := by + exact hg_cont.intervalIntegrable _ _ + have hg_mul_int : + IntervalIntegrable (fun t => g t * ‖x - y‖) MeasureTheory.volume 0 1 := + hg_int.mul_const _ + have hg_bound_int : + IntervalIntegrable (fun t => g t * (2 * Classical.choose hU)) + MeasureTheory.volume 0 1 := + hg_int.mul_const _ + have hdist_bound : ‖x - y‖ ≤ 2 * Classical.choose hU := + hU.norm_sub_le_two_mul_choose hx hy + calc + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ * ‖x - y‖ + = ∫ t in (0 : ℝ)..1, g t * ‖x - y‖ := by + rfl + _ ≤ ∫ t in (0 : ℝ)..1, g t * (2 * Classical.choose hU) := by + refine intervalIntegral.integral_mono_on zero_le_one hg_mul_int hg_bound_int ?_ + intro t ht + exact mul_le_mul_of_nonneg_left hdist_bound (by positivity) + _ = (2 * Classical.choose hU) * ∫ t in (0 : ℝ)..1, g t := by + rw [intervalIntegral.integral_mul_const] + ring + _ = (2 * Classical.choose hU) * + ∫ t in (0 : ℝ)..1, ‖fderiv ℝ u (segmentBlend x t y)‖ := by + rfl + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareMeanZero.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareMeanZero.lean new file mode 100644 index 0000000000..e241f5a104 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareMeanZero.lean @@ -0,0 +1,929 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H1Graph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain + +/-! # Poincare Mean Zero -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-- File-level typeclass cache for `Nontrivial (Vec d)` and +`NoncompactSpace (Vec d)` under `[NeZero d]`. See `PoincareZeroTrace.lean`. -/ +private instance instNontrivialVecPMZ (d : ℕ) [NeZero d] : + Nontrivial (Vec d) := inferInstance +private instance instNoncompactSpaceVecPMZ (d : ℕ) [NeZero d] : + NoncompactSpace (Vec d) := inferInstance + +/-! +# Mean-zero `L²` Poincare on bounded open convex domains + +This file packages the bounded-open-convex Poincare development on the +mean-zero `H¹` layer. + +The proof combines the smooth convex-domain Poincare theorem, convex smoothing +of rough `H¹` witnesses, and the closed-graph continuity lemmas for subtracting +averages. The public output is the bundled coercive estimate consumed by the +Hodge layer. +-/ + +namespace H1Function + +variable {d : ℕ} {U : Set (Vec d)} + +private theorem norm_fderiv_le_sum_basisVec_apply + (L : Vec d →L[ℝ] ℝ) : + ‖L‖ ≤ ∑ i : Fin d, ‖L (basisVec i)‖ := by + refine L.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) ?_ + intro x + have hx : + L x = ∑ i : Fin d, x i * L (basisVec i) := by + calc + L x = ∑ i : Fin d, x i • L (fun j => if i = j then 1 else 0) := by + simpa using (LinearMap.pi_apply_eq_sum_univ (f := L.toLinearMap) x) + _ = ∑ i : Fin d, x i • L (basisVec i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hfun : (fun j => if i = j then 1 else 0) = basisVec i := by + funext j + simp [basisVec_apply, eq_comm] + rw [hfun] + _ = ∑ i : Fin d, x i * L (basisVec i) := by + simp [smul_eq_mul] + calc + ‖L x‖ = ‖∑ i : Fin d, x i * L (basisVec i)‖ := by rw [hx] + _ ≤ ∑ i : Fin d, ‖x i * L (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖x i‖ * ‖L (basisVec i)‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖x‖ * ‖L (basisVec i)‖ := by + exact Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i : Fin d, ‖L (basisVec i)‖) * ‖x‖ := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => ‖L (basisVec i)‖) ‖x‖).symm + +private theorem eLpNorm_basisVec_apply_eq_gradCoordToScalarL2_norm + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf1 : ContDiff ℝ 1 f) (i : Fin d) : + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) 2 + (volumeMeasureOn U)) = + ‖(H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU hf1).gradCoordToScalarL2 i‖ := by + let u : H1Function U := H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let dg : Vec d → ℝ := fun x => (fderiv ℝ f x) (basisVec i) + calc + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) 2 + (volumeMeasureOn U)) + = ENNReal.toReal (MeasureTheory.eLpNorm dg 2 (volumeMeasureOn U)) := by + rw [MeasureTheory.eLpNorm_norm _ + ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).aestronglyMeasurable] + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) 2 + (volumeMeasureOn U)) := by + simp [u, dg, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + _ = ‖u.gradCoordToScalarL2 i‖ := by + rw [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp] + +private theorem memLp_fderiv_of_contDiffOnIsOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf : ContDiff ℝ 1 f) : + MeasureTheory.MemLp (fderiv ℝ f) 2 (volumeMeasureOn U) := by + have hfderiv_cont : Continuous (fderiv ℝ f) := hf.continuous_fderiv (by simp) + have hclosure_compact : IsCompact (closure U) := + hU.isBoundedDomain.isBounded.isCompact_closure + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖fderiv ℝ f x‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) hfderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.isOpen.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + +private theorem toReal_eLpNorm_two_sq_eq_integral_rpow_norm + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] [MeasurableSpace E] + [BorelSpace E] {μ : MeasureTheory.Measure α} {f : α → E} + (hf : MeasureTheory.MemLp f 2 μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f 2 μ)) ^ 2 = + ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + have hpow : (2 : ENNReal).toReal = (2 : ℝ) := by norm_num + have h := + hf.eLpNorm_eq_integral_rpow_norm (by norm_num : (2 : ENNReal) ≠ 0) + (by simp : (2 : ENNReal) ≠ ⊤) + rw [h, hpow] + have hint_nonneg : 0 ≤ ∫ x, ‖f x‖ ^ (2 : ℝ) ∂μ := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + rw [ENNReal.toReal_ofReal] + · rw [show (2 : ℝ)⁻¹ = (1 / 2 : ℝ) by norm_num] + rw [← Real.sqrt_eq_rpow] + exact Real.sq_sqrt hint_nonneg + · exact Real.rpow_nonneg hint_nonneg _ + +private theorem norm_toScalarL2_sq_eq_integral_rpow_norm + (u : H1Function U) : + ‖u.toScalarL2‖ ^ 2 = ∫ x in U, ‖u x‖ ^ (2 : ℝ) ∂MeasureTheory.volume := by + rw [H1Function.toScalarL2, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + exact toReal_eLpNorm_two_sq_eq_integral_rpow_norm u.memL2 + +theorem fderivL2Norm_le_gradientCoordL2NormSum_ofContDiffOnIsOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) : + let u : H1Function U := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U)) ≤ + u.gradientCoordL2NormSum := by + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let : MeasureTheory.IsFiniteMeasure μ := by + dsimp [μ, volumeMeasureOn] + exact hU.isFiniteMeasure_restrict_volume + let u : H1Function U := H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let dg : Fin d → Vec d → ℝ := fun i x => (fderiv ℝ f x) (basisVec i) + let D : Vec d → ℝ := fun x => ∑ i : Fin d, ‖dg i x‖ + have hfderiv_cont : Continuous (fderiv ℝ f) := hf1.continuous_fderiv (by simp) + have hclosure_compact : IsCompact (closure U) := + hU.isBoundedDomain.isBounded.isCompact_closure + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖fderiv ℝ f x‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hfderiv_mem : + MeasureTheory.MemLp (fderiv ℝ f) 2 μ := by + refine MeasureTheory.MemLp.of_bound (μ := μ) hfderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.isOpen.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + let dLp : MeasureTheory.Lp (Vec d →L[ℝ] ℝ) 2 μ := + hfderiv_mem.toLp (fderiv ℝ f) + have hdi_mem : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ‖dg i x‖) 2 μ := by + intro i + simpa [u, dg, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] using (u.grad_memL2 i).norm + have hD_mem : MeasureTheory.MemLp D 2 μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := (2 : ENNReal)) + (s := Finset.univ) (f := fun i : Fin d => fun x : Vec d => ‖dg i x‖) + (fun i hi => hdi_mem i) + simpa [D] using hsum + let dCoordLp : MeasureTheory.Lp ℝ 2 μ := hD_mem.toLp D + have hderiv_le_sum : + ‖dLp‖ ≤ ‖dCoordLp‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards [MeasureTheory.MemLp.coeFn_toLp hfderiv_mem, + MeasureTheory.MemLp.coeFn_toLp hD_mem] with x hxD hxCoord + rw [hxD, hxCoord] + have hnonneg : 0 ≤ D x := Finset.sum_nonneg fun i _ => norm_nonneg _ + calc + ‖fderiv ℝ f x‖ ≤ D x := norm_fderiv_le_sum_basisVec_apply (fderiv ℝ f x) + _ = ‖D x‖ := by simp [abs_of_nonneg hnonneg] + have hsum_le : + ‖dCoordLp‖ ≤ ∑ i : Fin d, ‖u.gradCoordToScalarL2 i‖ := by + let di : Fin d → Vec d → ℝ := fun i x => ‖dg i x‖ + have hsum_eLp : + MeasureTheory.eLpNorm D 2 μ ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm (di i) 2 μ := by + have hD : D = ∑ i : Fin d, di i := by + funext x + simp [D, di] + rw [hD] + simpa using + (MeasureTheory.eLpNorm_sum_le + (μ := μ) + (s := Finset.univ) + (f := di) + + (by norm_num : (1 : ℝ≥0∞) ≤ 2)) + calc + ‖dCoordLp‖ = ENNReal.toReal (MeasureTheory.eLpNorm D 2 μ) := by + simp [dCoordLp] + _ ≤ ENNReal.toReal (∑ i : Fin d, MeasureTheory.eLpNorm (di i) 2 μ) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun i _ => (hdi_mem i).eLpNorm_lt_top.ne + _ = ∑ i : Fin d, ‖u.gradCoordToScalarL2 i‖ := by + rw [ENNReal.toReal_sum (fun i hi => (hdi_mem i).eLpNorm_lt_top.ne)] + refine Finset.sum_congr rfl ?_ + intro i hi + simpa [di, hf1, μ] using + eLpNorm_basisVec_apply_eq_gradCoordToScalarL2_norm + (U := U) hU hf1 i + have hfderiv_eq : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 μ) = ‖dLp‖ := by + simp [dLp] + change ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 μ) ≤ + u.gradientCoordL2NormSum + calc + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 μ) + = ‖dLp‖ := hfderiv_eq + _ ≤ ‖dCoordLp‖ := hderiv_le_sum + _ ≤ u.gradientCoordL2NormSum := hsum_le + +/-- The squared smooth Poincare constant from the convex-domain estimate. -/ +noncomputable def smoothPoincareSqConst + (hU : IsOpenBoundedConvexDomain U) : ℝ := + (((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ (2 : ℝ)) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (2 : ℝ))) + +private theorem smoothPoincareSqConst_nonneg + (hU : IsOpenBoundedConvexDomain U) : + 0 ≤ smoothPoincareSqConst (d := d) (U := U) hU := by + have hR : 0 ≤ Classical.choose hU.isBoundedDomain := + le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + have hbase₁ : + 0 ≤ (MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) := by + exact mul_nonneg + (inv_nonneg.mpr ENNReal.toReal_nonneg) + (div_nonneg (pow_nonneg (mul_nonneg (by norm_num) hR) d) (Nat.cast_nonneg d)) + have hbase₂ : + 0 ≤ (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) := by + exact mul_nonneg + (mul_nonneg (Nat.cast_nonneg d) ENNReal.toReal_nonneg) + (mul_nonneg (by norm_num) hR) + exact mul_nonneg + (Real.rpow_nonneg hbase₁ _) + (Real.rpow_nonneg hbase₂ _) + +/-- The smooth Poincare constant used in the bundled mean-zero estimate. -/ +noncomputable def smoothPoincareConst + (hU : IsOpenBoundedConvexDomain U) : ℝ := + Real.sqrt (smoothPoincareSqConst (d := d) (U := U) hU) + +private theorem smoothPoincareConst_nonneg + (hU : IsOpenBoundedConvexDomain U) : + 0 ≤ smoothPoincareConst (d := d) (U := U) hU := by + exact Real.sqrt_nonneg _ + +private theorem smoothPoincareSqConst_le_const_sq + (hU : IsOpenBoundedConvexDomain U) : + smoothPoincareSqConst (d := d) (U := U) hU ≤ + (smoothPoincareConst (d := d) (U := U) hU) ^ 2 := by + rw [smoothPoincareConst, Real.sq_sqrt (smoothPoincareSqConst_nonneg (d := d) (U := U) hU)] + +/-- Public formula bounding the chosen coercive constant in +`h1CoerciveEstimate_of_isOpenBoundedConvexDomain`. + +The formula is intentionally the square root of the smooth squared Poincare +constant times the coordinate-to-vector comparison factor. It exposes the +geometric scale of the chosen proof without exposing the private smooth proof +names. -/ +noncomputable def h1CoerciveEstimateChosenBound + (hU : IsOpenBoundedConvexDomain U) : ℝ := + Real.sqrt + ((((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ (2 : ℝ)) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (2 : ℝ)))) * + (d : ℝ) + +theorem h1CoerciveEstimateChosenBound_nonneg + (hU : IsOpenBoundedConvexDomain U) : + 0 ≤ h1CoerciveEstimateChosenBound (d := d) (U := U) hU := by + exact mul_nonneg (Real.sqrt_nonneg _) (Nat.cast_nonneg d) + +private theorem norm_toScalarL2_subAverage_le_smoothPoincareConst_mul_gradientCoordL2NormSum_ofContDiff + [NeZero d] [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + let u : H1Function U := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + ‖u.subAverage.toScalarL2‖ ≤ + smoothPoincareConst (d := d) (U := U) hU * u.gradientCoordL2NormSum := by + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let u : H1Function U := H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let C : ℝ := smoothPoincareConst (d := d) (U := U) hU + let Csq : ℝ := smoothPoincareSqConst (d := d) (U := U) hU + have huInt : MeasureTheory.IntegrableOn f U := by + simpa [u, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] using u.integrableOn + have hu_toFun : (u : Vec d → ℝ) = f := by + funext x + simp [u, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + have hu_avg : integralAverage U u = integralAverage U f := by + rw [hu_toFun] + have hpoinc : + ∫ x in U, ‖f x - integralAverage U f‖ ^ (2 : ℝ) ∂MeasureTheory.volume ≤ + (((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ (2 : ℝ)) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (2 : ℝ)) * + ∫ y in U, ‖fderiv ℝ f y‖ ^ (2 : ℝ) ∂MeasureTheory.volume) := by + simpa using + (integral_rpow_norm_sub_integralAverage_le_bound_of_isOpenBoundedConvexDomain + (d := d) (U := U) hU huInt hf (p := (2 : ℝ)) (by norm_num) hvol) + have hfderiv_mem : + MeasureTheory.MemLp (fderiv ℝ f) 2 (volumeMeasureOn U) := + memLp_fderiv_of_contDiffOnIsOpenBoundedConvexDomain hU hf1 + have hleft_sq : + ‖u.subAverage.toScalarL2‖ ^ 2 = + ∫ x in U, ‖f x - integralAverage U f‖ ^ (2 : ℝ) ∂MeasureTheory.volume := by + calc + ‖u.subAverage.toScalarL2‖ ^ 2 + = ∫ x in U, ‖u.subAverage x‖ ^ (2 : ℝ) ∂MeasureTheory.volume := + norm_toScalarL2_sq_eq_integral_rpow_norm (U := U) u.subAverage + _ = ∫ x in U, ‖f x - integralAverage U f‖ ^ (2 : ℝ) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU.isOpen.measurableSet ?_ + intro x hx + change ‖u x - integralAverage U u‖ ^ (2 : ℝ) = + ‖f x - integralAverage U f‖ ^ (2 : ℝ) + rw [hu_avg, show u x = f x by rw [hu_toFun]] + have hderiv_sq : + (ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U))) ^ 2 = + ∫ y in U, ‖fderiv ℝ f y‖ ^ (2 : ℝ) ∂MeasureTheory.volume := + toReal_eLpNorm_two_sq_eq_integral_rpow_norm hfderiv_mem + have hbase_sq : + ‖u.subAverage.toScalarL2‖ ^ 2 ≤ + Csq * + (ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U))) ^ 2 := by + calc + ‖u.subAverage.toScalarL2‖ ^ 2 + = ∫ x in U, ‖f x - integralAverage U f‖ ^ (2 : ℝ) ∂MeasureTheory.volume := + hleft_sq + _ ≤ Csq * ∫ y in U, ‖fderiv ℝ f y‖ ^ (2 : ℝ) ∂MeasureTheory.volume := by + calc + ∫ x in U, ‖f x - integralAverage U f‖ ^ (2 : ℝ) ∂MeasureTheory.volume + ≤ (((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) ^ + (2 : ℝ)) * + ((((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) ^ (2 : ℝ)) * + ∫ y in U, ‖fderiv ℝ f y‖ ^ (2 : ℝ) ∂MeasureTheory.volume) := hpoinc + _ = Csq * ∫ y in U, ‖fderiv ℝ f y‖ ^ (2 : ℝ) + ∂MeasureTheory.volume := by + dsimp [Csq, smoothPoincareSqConst] + ring + _ = Csq * + (ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U))) ^ 2 := by + rw [hderiv_sq] + have hderiv_le_grad : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U)) ≤ + u.gradientCoordL2NormSum := by + simpa [u, hf1] using + fderivL2Norm_le_gradientCoordL2NormSum_ofContDiffOnIsOpenBoundedConvexDomain + (U := U) hU hf + have htarget_sq : + ‖u.subAverage.toScalarL2‖ ^ 2 ≤ + (C * u.gradientCoordL2NormSum) ^ 2 := by + have hCsq_le : Csq ≤ C ^ 2 := by + simpa [C, Csq] using + smoothPoincareSqConst_le_const_sq (d := d) (U := U) hU + have hderiv_nonneg : + 0 ≤ ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U)) := + ENNReal.toReal_nonneg + have hgrad_nonneg : 0 ≤ u.gradientCoordL2NormSum := + u.gradientCoordL2NormSum_nonneg + calc + ‖u.subAverage.toScalarL2‖ ^ 2 + ≤ Csq * + (ENNReal.toReal + (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U))) ^ 2 := + hbase_sq + _ ≤ C ^ 2 * + (ENNReal.toReal + (MeasureTheory.eLpNorm (fderiv ℝ f) 2 (volumeMeasureOn U))) ^ 2 := by + exact mul_le_mul_of_nonneg_right hCsq_le (sq_nonneg _) + _ ≤ C ^ 2 * u.gradientCoordL2NormSum ^ 2 := by + exact mul_le_mul_of_nonneg_left + (pow_le_pow_left₀ hderiv_nonneg hderiv_le_grad 2) (sq_nonneg C) + _ = (C * u.gradientCoordL2NormSum) ^ 2 := by ring + have hright_nonneg : 0 ≤ C * u.gradientCoordL2NormSum := by + exact mul_nonneg (by simpa [C] using smoothPoincareConst_nonneg (d := d) (U := U) hU) + u.gradientCoordL2NormSum_nonneg + change ‖u.subAverage.toScalarL2‖ ≤ C * u.gradientCoordL2NormSum + exact le_of_sq_le_sq htarget_sq hright_nonneg + +private theorem unitConvexApproxScale_pos (n : ℕ) : + 0 < unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + +noncomputable def convexApproxSmoothH1 + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : H1Function U := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU + ((contDiff_convexApproxSmoothRepresentative + (U := U) (ρ := unitConvexApproxKernel (d := d)) (u := u.toFun) + (p := (2 : ENNReal)) (x0 := x0) (r := r) (ε := unitConvexApproxScale n) + hU.isOpen.measurableSet (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + (by norm_num : (1 : ENNReal) ≤ 2) u.memL2 hr (by exact unitConvexApproxScale_pos n)).of_le + (by simp)) + +theorem convexApproxSmoothH1_toFun + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothH1 (U := U) hU u x0 hr n : Vec d → ℝ) = + convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u x0 r + (unitConvexApproxScale n) := by + funext x + simp [convexApproxSmoothH1, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + +theorem convexApproxSmoothH1_grad + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothH1 (U := U) hU u x0 hr n).grad = + fun x i => + (fderiv ℝ + (convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u x0 r + (unitConvexApproxScale n)) x) (basisVec i) := by + funext x i + simp [convexApproxSmoothH1, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + +theorem tendsto_convexApproxSmoothH1_toScalarL2 + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n => (convexApproxSmoothH1 (U := U) hU u x0 hr n).toScalarL2) + Filter.atTop (nhds u.toScalarL2) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → H1Function U := convexApproxSmoothH1 (U := U) hU u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hraw : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r (unitConvexApproxScale n) x - u x) + 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + u.memL2 hball hr tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x - + u x) + 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hx + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := u.toFun) hU hρ hx hball hr (unitConvexApproxScale_pos n) hε_lt_one] + rw [tendsto_iff_dist_tendsto_zero] + have hdist : + (fun n => dist (ψ n).toScalarL2 u.toScalarL2) = + fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x - + u x) + 2 (volumeMeasureOn U)) := by + funext n + have hψ_toFun := convexApproxSmoothH1_toFun (U := U) hU u x0 hr n + have hedist0 : + edist (ψ n).toScalarL2 u.toScalarL2 = + MeasureTheory.eLpNorm ((ψ n).toFun - u.toFun) 2 (volumeMeasureOn U) := by + simp [ψ, H1Function.toScalarL2, Homogenization.toScalarL2] + have hedist : + edist (ψ n).toScalarL2 u.toScalarL2 = + MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x - + u x) + 2 (volumeMeasureOn U) := by + calc + edist (ψ n).toScalarL2 u.toScalarL2 + = MeasureTheory.eLpNorm ((ψ n).toFun - u.toFun) 2 (volumeMeasureOn U) := + hedist0 + _ = MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x - + u x) + 2 (volumeMeasureOn U) := by + congr 1 + rw [MeasureTheory.Lp.dist_edist, hedist] + rw [hdist] + have hmem : + ∀ n : ℕ, + MeasureTheory.MemLp + (fun x => + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x - + u x) + 2 (volumeMeasureOn U) := by + intro n + have hψ_toFun := convexApproxSmoothH1_toFun (U := U) hU u x0 hr n + have hsub : MeasureTheory.MemLp (fun x => (ψ n).toFun x - u x) 2 (volumeMeasureOn U) := + (ψ n).memL2.sub u.memL2 + refine MeasureTheory.MemLp.ae_eq ?_ hsub + filter_upwards with x + rw [show (ψ n).toFun x = + convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n) x by + simpa [ρ] using congrFun hψ_toFun x] + exact (ENNReal.tendsto_toReal_zero_iff (fun n => (hmem n).eLpNorm_lt_top.ne)).2 hrep + +theorem tendsto_convexApproxSmoothH1_gradCoordToScalarL2 + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (i : Fin d) : + Filter.Tendsto + (fun n => (convexApproxSmoothH1 (U := U) hU u x0 hr n).gradCoordToScalarL2 i) + Filter.atTop (nhds (u.gradCoordToScalarL2 i)) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → H1Function U := convexApproxSmoothH1 (U := U) hU u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hraw : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (1 - unitConvexApproxScale n) * + convexApproxSmoothing ρ (fun y => u.grad y i) x0 r + (unitConvexApproxScale n) x - + u.grad x i) + 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + (u.grad_memL2 i) hball hr tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply MeasureTheory.eLpNorm_congr_ae + have hbridge := + ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + (U := U) (ρ := ρ) (u := u.toFun) (gi := fun y => u.grad y i) + (i := i) (p := (2 : ENNReal)) hU hρ (by norm_num : (1 : ENNReal) ≤ 2) + u.memL2 (u.grad_memL2 i) (u.hasWeakPartialDerivOn i) + hball hr (unitConvexApproxScale_pos n) hε_lt_one + filter_upwards [hbridge, MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hxbridge hxU + rw [hxbridge] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun y => u.grad y i) hU hρ hxU hball hr (unitConvexApproxScale_pos n) + hε_lt_one] + rw [tendsto_iff_dist_tendsto_zero] + have hdist : + (fun n => dist ((ψ n).gradCoordToScalarL2 i) (u.gradCoordToScalarL2 i)) = + fun n => + ENNReal.toReal + (MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + 2 (volumeMeasureOn U)) := by + funext n + have hψ_grad := convexApproxSmoothH1_grad (U := U) hU u x0 hr n + have hedist0 : + edist ((ψ n).gradCoordToScalarL2 i) (u.gradCoordToScalarL2 i) = + MeasureTheory.eLpNorm + (((fun x => (ψ n).grad x i) - fun x => u.grad x i)) + 2 (volumeMeasureOn U) := by + simp [ψ, H1Function.gradCoordToScalarL2, Homogenization.toScalarL2] + have hedist : + edist ((ψ n).gradCoordToScalarL2 i) (u.gradCoordToScalarL2 i) = + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + 2 (volumeMeasureOn U) := by + calc + edist ((ψ n).gradCoordToScalarL2 i) (u.gradCoordToScalarL2 i) + = MeasureTheory.eLpNorm + (((fun x => (ψ n).grad x i) - fun x => u.grad x i)) + 2 (volumeMeasureOn U) := hedist0 + _ = MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + 2 (volumeMeasureOn U) := by + congr 1 + rw [MeasureTheory.Lp.dist_edist, hedist] + rw [hdist] + have hmem : + ∀ n : ℕ, + MeasureTheory.MemLp + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + 2 (volumeMeasureOn U) := by + intro n + have hψ_grad := convexApproxSmoothH1_grad (U := U) hU u x0 hr n + have hsub : MeasureTheory.MemLp (fun x => (ψ n).grad x i - u.grad x i) + 2 (volumeMeasureOn U) := + ((ψ n).grad_memL2 i).sub (u.grad_memL2 i) + refine MeasureTheory.MemLp.ae_eq ?_ hsub + filter_upwards with x + rw [show (ψ n).grad x i = + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u x0 r (unitConvexApproxScale n)) x) + (basisVec i) by + simpa [ρ] using congrFun (congrFun hψ_grad x) i] + exact (ENNReal.tendsto_toReal_zero_iff (fun n => (hmem n).eLpNorm_lt_top.ne)).2 hrep + +/-- The smooth Poincare estimate passes to arbitrary `H¹` functions by the +convex smoothing approximation. -/ +private theorem norm_toScalarL2_subAverage_le_smoothPoincareConst_mul_gradientCoordL2NormSum + [NeZero d] [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) (hvol : 0 < (MeasureTheory.volume U).toReal) + (u : H1Function U) : + ‖u.subAverage.toScalarL2‖ ≤ + smoothPoincareConst (d := d) (U := U) hU * u.gradientCoordL2NormSum := by + have hnonempty : U.Nonempty := by + by_contra hne + have hUempty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + subst U + simp at hvol + rcases hnonempty with ⟨x0, hx0⟩ + rcases Metric.mem_nhds_iff.1 (hU.isOpen.mem_nhds hx0) with ⟨δ, hδpos, hδsub⟩ + let r : ℝ := δ / 2 + have hr : 0 < r := by + dsimp [r] + positivity + have hball : Metric.closedBall x0 r ⊆ U := by + intro y hy + apply hδsub + have hy' : dist y x0 ≤ r := by + simpa [Metric.mem_closedBall] using hy + have hlt : dist y x0 < δ := by + have hrδ : r < δ := by + dsimp [r] + linarith + exact lt_of_le_of_lt hy' hrδ + simpa [Metric.mem_ball] using hlt + let ψ : ℕ → H1Function U := fun n => convexApproxSmoothH1 (U := U) hU u x0 hr n + have hψ_bound : + ∀ n, ‖(ψ n).subAverage.toScalarL2‖ ≤ + smoothPoincareConst (d := d) (U := U) hU * (ψ n).gradientCoordL2NormSum := by + intro n + let f : Vec d → ℝ := + convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u x0 r + (unitConvexApproxScale n) + have hf : ContDiff ℝ (⊤ : ℕ∞) f := + contDiff_convexApproxSmoothRepresentative + (U := U) (ρ := unitConvexApproxKernel (d := d)) (u := u.toFun) + (p := (2 : ENNReal)) (x0 := x0) (r := r) (ε := unitConvexApproxScale n) + hU.isOpen.measurableSet (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + (by norm_num : (1 : ENNReal) ≤ 2) u.memL2 hr (unitConvexApproxScale_pos n) + simpa [ψ, convexApproxSmoothH1, f] using + (norm_toScalarL2_subAverage_le_smoothPoincareConst_mul_gradientCoordL2NormSum_ofContDiff + (U := U) hU (f := f) hf hvol) + have hleft : + Filter.Tendsto (fun n => ‖(ψ n).subAverage.toScalarL2‖) Filter.atTop + (nhds ‖u.subAverage.toScalarL2‖) := by + have hval : + Filter.Tendsto (fun n => (ψ n).toScalarL2) Filter.atTop + (nhds u.toScalarL2) := by + simpa [ψ] using + (tendsto_convexApproxSmoothH1_toScalarL2 (U := U) hU u hball hr) + exact (continuous_norm.tendsto _).comp + (H1Function.tendsto_toScalarL2_subAverage_of_tendsto_toScalarL2 hval) + have hright_grad : + Filter.Tendsto (fun n => (ψ n).gradientCoordL2NormSum) Filter.atTop + (nhds u.gradientCoordL2NormSum) := by + have hgrad : + ∀ i : Fin d, + Filter.Tendsto (fun n => (ψ n).gradCoordToScalarL2 i) Filter.atTop + (nhds (u.gradCoordToScalarL2 i)) := by + intro i + simpa [ψ] using + (tendsto_convexApproxSmoothH1_gradCoordToScalarL2 (U := U) hU u hball hr i) + simpa [H1Function.gradientCoordL2NormSum] using + tendsto_finsetSum Finset.univ + (fun i _ => (continuous_norm.tendsto _).comp (hgrad i)) + have hright : + Filter.Tendsto + (fun n => + smoothPoincareConst (d := d) (U := U) hU * (ψ n).gradientCoordL2NormSum) + Filter.atTop + (nhds (smoothPoincareConst (d := d) (U := U) hU * u.gradientCoordL2NormSum)) := + tendsto_const_nhds.mul hright_grad + exact le_of_tendsto_of_tendsto' hleft hright hψ_bound + +/-- Positive-dimensional, positive-volume bounded open convex domains satisfy +the mean-zero `L²` Poincare estimate. -/ +private theorem h1MeanZero_valueL2Norm_le_smoothPoincareConst_mul_gradientL2Norm + [NeZero d] [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) (hvol : 0 < (MeasureTheory.volume U).toReal) + (u : H1MeanZeroFunction U) : + u.valueL2Norm ≤ + (smoothPoincareConst (d := d) (U := U) hU * d) * u.gradientL2Norm := by + let C : ℝ := smoothPoincareConst (d := d) (U := U) hU + have hC_nonneg : 0 ≤ C := by + simpa [C] using smoothPoincareConst_nonneg (d := d) (U := U) hU + have havg : integralAverage U u.toH1Function = 0 := by + unfold integralAverage + rw [u.meanZero] + simp + have hsub : u.toH1Function.subAverage = u.toH1Function := by + apply H1Function.ext + · funext x + simp [havg] + · funext x + ext i + simp + have hbase := + norm_toScalarL2_subAverage_le_smoothPoincareConst_mul_gradientCoordL2NormSum + (U := U) hU hvol u.toH1Function + have hcoord := u.toH1Function.gradientCoordL2NormSum_le + calc + u.valueL2Norm = ‖u.toH1Function.subAverage.toScalarL2‖ := by + rw [hsub] + rfl + _ ≤ C * u.toH1Function.gradientCoordL2NormSum := by + simpa [C] using hbase + _ ≤ C * (d * u.gradientL2Norm) := by + simpa [H1MeanZeroFunction.gradientL2Norm, H1MeanZeroFunction.gradToVectorL2] using + mul_le_mul_of_nonneg_left hcoord hC_nonneg + _ = (C * d) * u.gradientL2Norm := by + ring + +private theorem h1MeanZero_valueL2Norm_eq_zero_of_volume_toReal_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hvol : (MeasureTheory.volume U).toReal = 0) (u : H1MeanZeroFunction U) : + u.valueL2Norm = 0 := by + have hfinite : MeasureTheory.volume U < ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ) + have hvol0 : MeasureTheory.volume U = 0 := by + rcases (ENNReal.toReal_eq_zero_iff (MeasureTheory.volume U)).mp hvol with hzero | htop + · exact hzero + · exact (hfinite.ne htop).elim + have hμ0 : volumeMeasureOn U = 0 := by + simpa [volumeMeasureOn] using + (MeasureTheory.Measure.restrict_eq_zero.2 hvol0 : + MeasureTheory.volume.restrict U = 0) + dsimp [H1MeanZeroFunction.valueL2Norm, H1MeanZeroFunction.toScalarL2, + H1Function.toScalarL2, Homogenization.toScalarL2] + rw [MeasureTheory.Lp.norm_toLp] + rw [hμ0, MeasureTheory.eLpNorm_measure_zero] + rfl + +private theorem h1MeanZero_valueL2Norm_eq_zero_of_dim_zero + {U : Set (Vec 0)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hvol : 0 < (MeasureTheory.volume U).toReal) (u : H1MeanZeroFunction U) : + u.valueL2Norm = 0 := by + let c : ℝ := u.toH1Function.toFun 0 + have hconst : u.toH1Function.toFun = fun _ : Vec 0 => c := by + funext x + exact congrArg u.toH1Function.toFun (Subsingleton.elim x (0 : Vec 0)) + have hmean_const : ∫ x in U, (fun _ : Vec 0 => c) x ∂MeasureTheory.volume = 0 := by + change MeanZeroOn U (fun _ : Vec 0 => c) + rw [← hconst] + exact u.meanZero + have hμ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hmean_mul : (MeasureTheory.volume U).toReal * c = 0 := by + rw [MeasureTheory.integral_const] at hmean_const + rw [hμ, smul_eq_mul] at hmean_const + exact hmean_const + have hc0 : c = 0 := by + nlinarith + have hzeroFun : u.toH1Function.toFun = 0 := by + rw [hconst] + funext x + simp [hc0] + have hL2 : u.toScalarL2 = 0 := by + apply MeasureTheory.Lp.ext + filter_upwards + [H1Function.coeFn_toScalarL2 u.toH1Function, + MeasureTheory.Lp.coeFn_zero ℝ (2 : ENNReal) (volumeMeasureOn U)] + with x hx h0 + change u.toH1Function.toScalarL2 x = (0 : ScalarL2 U) x + rw [hx, h0] + exact congrFun hzeroFun x + simp [H1MeanZeroFunction.valueL2Norm, hL2] + +end H1Function + +/-- Bounded open convex domains satisfy the mean-zero `L²` Poincare inequality, +packaged as an `H1CoerciveEstimate`. + +Equivalently, there exists `C ≥ 0` such that every `u : H1MeanZeroFunction U` +satisfies `u.valueL2Norm ≤ C * u.gradientL2Norm`. -/ +noncomputable def h1CoerciveEstimate_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) : + H1CoerciveEstimate U := by + classical + by_cases hvol0 : (MeasureTheory.volume U).toReal = 0 + · exact + { fixedValue := 0 + constant_nonneg := le_rfl + bound := by + intro u + have hzero := + H1Function.h1MeanZero_valueL2Norm_eq_zero_of_volume_toReal_eq_zero + (U := U) hvol0 u + simp [hzero] } + · have hvol : 0 < (MeasureTheory.volume U).toReal := by + exact lt_of_le_of_ne ENNReal.toReal_nonneg (Ne.symm hvol0) + by_cases hd0 : d = 0 + · subst d + exact + { fixedValue := 0 + constant_nonneg := le_rfl + bound := by + intro u + have hzero := + H1Function.h1MeanZero_valueL2Norm_eq_zero_of_dim_zero + (U := U) hvol u + simp [hzero] } + · letI : NeZero d := ⟨hd0⟩ + exact + { fixedValue := H1Function.smoothPoincareConst (d := d) (U := U) hU * d + constant_nonneg := by + exact mul_nonneg + (H1Function.smoothPoincareConst_nonneg (d := d) (U := U) hU) + (Nat.cast_nonneg d) + bound := by + intro u + exact + H1Function.h1MeanZero_valueL2Norm_le_smoothPoincareConst_mul_gradientL2Norm + (U := U) hU hvol u } + +theorem h1CoerciveEstimate_of_isOpenBoundedConvexDomain_constant_le_chosenBound + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) : + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := U) hU).fixedValue ≤ + H1Function.h1CoerciveEstimateChosenBound (d := d) (U := U) hU := by + classical + unfold h1CoerciveEstimate_of_isOpenBoundedConvexDomain + by_cases hvol0 : (MeasureTheory.volume U).toReal = 0 + · simp [hvol0, + H1Function.h1CoerciveEstimateChosenBound_nonneg (d := d) (U := U) hU] + · by_cases hd0 : d = 0 + · subst d + simp [hvol0, + H1Function.h1CoerciveEstimateChosenBound_nonneg (d := 0) (U := U) hU] + · let : NeZero d := ⟨hd0⟩ + simp [hvol0, hd0, H1Function.h1CoerciveEstimateChosenBound, + H1Function.smoothPoincareConst, H1Function.smoothPoincareSqConst] + +/-- Unbundled existential form of +`h1CoerciveEstimate_of_isOpenBoundedConvexDomain`. -/ +theorem exists_poincare_constant_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : H1MeanZeroFunction U, u.valueL2Norm ≤ C * u.gradientL2Norm := by + refine + ⟨ + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := U) hU).fixedValue, + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := U) hU).constant_nonneg, + ?_ + ⟩ + intro u + exact (h1CoerciveEstimate_of_isOpenBoundedConvexDomain (U := U) hU).bound u + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareSegment.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareSegment.lean new file mode 100644 index 0000000000..fa9062c7b9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareSegment.lean @@ -0,0 +1,138 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Data.Set.Function +public import Mathlib.LinearAlgebra.AffineSpace.AffineMap + +/-! # Poincare Segment -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Convex-domain segment geometry + +This file isolates the algebraic and convexity lemmas for the segment +parametrization + +`y ↦ y + t • (x - y)`, + +which is the geometric core of the direct bounded-open-convex-domain Poincare +proof. The later analytic files should be able to import this one and work only +with segment identities, convex-membership statements, and `MapsTo` packaging, +without redoing the affine algebra each time. +-/ + +/-- The point on the segment from `y` to `x` with parameter `t`. -/ +noncomputable def segmentBlend {d : ℕ} (x : Vec d) (t : ℝ) (y : Vec d) : Vec d := + AffineMap.lineMap y x t + +@[simp] theorem segmentBlend_eq_lineMap {d : ℕ} (x y : Vec d) (t : ℝ) : + segmentBlend x t y = AffineMap.lineMap y x t := + rfl + +@[simp] theorem segmentBlend_zero {d : ℕ} (x y : Vec d) : + segmentBlend x 0 y = y := by + simp [segmentBlend] + +@[simp] theorem segmentBlend_one {d : ℕ} (x y : Vec d) : + segmentBlend x 1 y = x := by + simp [segmentBlend] + +@[simp] theorem segmentBlend_self {d : ℕ} (x : Vec d) (t : ℝ) : + segmentBlend x t x = x := by + simp [segmentBlend] + +theorem segmentBlend_eq_add_smul_sub {d : ℕ} (x y : Vec d) (t : ℝ) : + segmentBlend x t y = y + t • (x - y) := by + simpa [segmentBlend, add_comm] using (AffineMap.lineMap_apply_module' y x t) + +theorem segmentBlend_eq_smul_add {d : ℕ} (x y : Vec d) (t : ℝ) : + segmentBlend x t y = (1 - t) • y + t • x := by + simpa [segmentBlend] using (AffineMap.lineMap_apply_module y x t) + +theorem add_smul_sub_eq_segmentBlend {d : ℕ} (x y : Vec d) (t : ℝ) : + x + t • (y - x) = segmentBlend y t x := by + simpa using (segmentBlend_eq_add_smul_sub y x t).symm + +theorem segmentBlend_sub_right {d : ℕ} (x y : Vec d) (t : ℝ) : + segmentBlend x t y - y = t • (x - y) := by + ext i + simp [segmentBlend, AffineMap.lineMap_apply_module'] + +theorem left_sub_segmentBlend {d : ℕ} (x y : Vec d) (t : ℝ) : + x - segmentBlend x t y = (1 - t) • (x - y) := by + ext i + simp [segmentBlend, AffineMap.lineMap_apply_module] + ring_nf + +theorem norm_segmentBlend_sub_right {d : ℕ} (x y : Vec d) (t : ℝ) : + ‖segmentBlend x t y - y‖ = |t| * ‖x - y‖ := by + rw [segmentBlend_sub_right, norm_smul, Real.norm_eq_abs] + +theorem norm_left_sub_segmentBlend {d : ℕ} (x y : Vec d) (t : ℝ) : + ‖x - segmentBlend x t y‖ = |1 - t| * ‖x - y‖ := by + rw [left_sub_segmentBlend, norm_smul, Real.norm_eq_abs] + +theorem segmentBlend_mem {d : ℕ} {U : Set (Vec d)} (hU : Convex ℝ U) + {x y : Vec d} (hx : x ∈ U) (hy : y ∈ U) {t : ℝ} + (ht0 : 0 ≤ t) (ht1 : t ≤ 1) : + segmentBlend x t y ∈ U := by + simpa [segmentBlend] using hU.lineMap_mem hy hx ⟨ht0, ht1⟩ + +theorem segmentBlend_mapsTo {d : ℕ} {U : Set (Vec d)} (hU : Convex ℝ U) + {x : Vec d} (hx : x ∈ U) {t : ℝ} (ht0 : 0 ≤ t) (ht1 : t ≤ 1) : + Set.MapsTo (segmentBlend x t) U U := by + intro y hy + exact segmentBlend_mem hU hx hy ht0 ht1 + +theorem segmentBlend_mem_of_isOpenBoundedConvexDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x y : Vec d} + (hx : x ∈ U) (hy : y ∈ U) {t : ℝ} (ht0 : 0 ≤ t) (ht1 : t ≤ 1) : + segmentBlend x t y ∈ U := + segmentBlend_mem hU.convex hx hy ht0 ht1 + +theorem segmentBlend_mapsTo_of_isOpenBoundedConvexDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x : Vec d} (hx : x ∈ U) {t : ℝ} + (ht0 : 0 ≤ t) (ht1 : t ≤ 1) : + Set.MapsTo (segmentBlend x t) U U := + segmentBlend_mapsTo hU.convex hx ht0 ht1 + +theorem ray_mem_of_endpoint_mem_of_isOpenBoundedConvexDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x ω : Vec d} {s t : ℝ} + (hx : x ∈ U) (hs : x + s • ω ∈ U) (hs0 : 0 ≤ s) (ht0 : 0 ≤ t) (hts : t ≤ s) : + x + t • ω ∈ U := by + by_cases hs_zero : s = 0 + · have ht_zero : t = 0 := by linarith + simpa [ht_zero] using hx + · have hs_pos : 0 < s := lt_of_le_of_ne hs0 (by simpa [eq_comm] using hs_zero) + have hτ0 : 0 ≤ t / s := by positivity + have hτ1 : t / s ≤ 1 := by + have hs_inv_nonneg : 0 ≤ s⁻¹ := by positivity + have hmul := mul_le_mul_of_nonneg_right hts hs_inv_nonneg + simpa [div_eq_mul_inv, hs_pos.ne'] using hmul + have hseg : + segmentBlend (x + s • ω) (t / s) x ∈ U := + segmentBlend_mem_of_isOpenBoundedConvexDomain hU hs hx hτ0 hτ1 + have hEq : x + t • ω = segmentBlend (x + s • ω) (t / s) x := by + calc + x + t • ω = x + (((t / s) * s) • ω) := by + congr 1 + field_simp [hs_pos.ne'] + _ = x + (t / s) • (s • ω) := by rw [← smul_smul] + _ = x + (t / s) • ((x + s • ω) - x) := by + congr 1 + abel_nf + _ = segmentBlend (x + s • ω) (t / s) x := by + rw [add_smul_sub_eq_segmentBlend] + rw [hEq] + exact hseg + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p.lean new file mode 100644 index 0000000000..4bc1f3aca1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p.lean @@ -0,0 +1,16 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.SmoothCase +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.ConvexApproxTendsto +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Core + +/-! # Poincare W1p -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/ConvexApproxTendsto.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/ConvexApproxTendsto.lean new file mode 100644 index 0000000000..39c1420cf8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/ConvexApproxTendsto.lean @@ -0,0 +1,559 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.SmoothCase + +/-! # Convex Approx Tendsto -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} +theorem unitConvexApproxScale_pos (n : ℕ) : + 0 < unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + +noncomputable def convexApproxSmoothW1p + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (u : W1pFunction U p) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : W1pFunction U p := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU + ((contDiff_convexApproxSmoothRepresentative + (U := U) (ρ := unitConvexApproxKernel (d := d)) (u := u.toFun) + (p := p) (x0 := x0) (r := r) (ε := unitConvexApproxScale n) + hU.isOpen.measurableSet (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + hp1 u.memLp hr (unitConvexApproxScale_pos n)).of_le (by simp)) + +private theorem convexApproxSmoothW1p_toFun + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (u : W1pFunction U p) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).toFun = + convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u.toFun x0 r + (unitConvexApproxScale n) := by + funext x + simp [convexApproxSmoothW1p, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem convexApproxSmoothW1p_grad + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (u : W1pFunction U p) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).grad = + fun x i => + (fderiv ℝ + (convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u.toFun x0 r + (unitConvexApproxScale n)) x) (basisVec i) := by + funext x i + simp [convexApproxSmoothW1p, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +/-- Canonical convex smooth approximants converge to a `W^{1,p}` function in +the value `L^p` norm on a bounded open convex domain. -/ +theorem tendsto_convexApproxSmoothW1p_toFun_eLpNorm_sub + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (u : W1pFunction U p) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).toFun x - u.toFun x) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → W1pFunction U p := convexApproxSmoothW1p (U := U) hU hp1 u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hraw : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u.toFun x0 r (unitConvexApproxScale n) x - + u.toFun x) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ hp1 hp u.memLp hball hr tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothRepresentative U ρ u.toFun x0 r (unitConvexApproxScale n) x - + u.toFun x) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hx + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := u.toFun) hU hρ hx hball hr (unitConvexApproxScale_pos n) hε_lt_one] + refine hrep.congr' ?_ + filter_upwards with n + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + rw [show (ψ n).toFun x = + convexApproxSmoothRepresentative U ρ u.toFun x0 r (unitConvexApproxScale n) x by + simpa [ψ, ρ] using congrFun + (convexApproxSmoothW1p_toFun (U := U) hU hp1 u x0 hr n) x] + +/-- Canonical convex smooth approximants converge coordinatewise to the weak +gradient in the `L^p` norm on a bounded open convex domain. -/ +theorem tendsto_convexApproxSmoothW1p_grad_eLpNorm_sub + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (u : W1pFunction U p) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (i : Fin d) : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).grad x i - + u.grad x i) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ψ : ℕ → W1pFunction U p := convexApproxSmoothW1p (U := U) hU hp1 u x0 hr + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hevent_lt_one : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hraw : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (1 - unitConvexApproxScale n) * + convexApproxSmoothing ρ (fun y => u.grad y i) x0 r + (unitConvexApproxScale n) x - + u.grad x i) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + simpa [ρ, volumeMeasureOn] using + (tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ hp1 hp (u.grad_memLp i) hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_pos) hevent_lt_one) + have hrep : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u.toFun x0 r (unitConvexApproxScale n)) x) + (basisVec i) - + u.grad x i) + p (volumeMeasureOn U)) + Filter.atTop (nhds 0) := by + refine hraw.congr' ?_ + filter_upwards [hevent_lt_one] with n hε_lt_one + apply MeasureTheory.eLpNorm_congr_ae + have hbridge := + ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + (U := U) (ρ := ρ) (u := u.toFun) (gi := fun y => u.grad y i) + (i := i) (p := p) hU hρ hp1 u.memLp (u.grad_memLp i) + (u.hasWeakPartialDerivOn i) hball hr (unitConvexApproxScale_pos n) hε_lt_one + filter_upwards [hbridge, MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with + x hxbridge hxU + rw [hxbridge] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun y => u.grad y i) hU hρ hxU hball hr (unitConvexApproxScale_pos n) + hε_lt_one] + refine hrep.congr' ?_ + filter_upwards with n + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + rw [show (ψ n).grad x i = + (fderiv ℝ + (convexApproxSmoothRepresentative U ρ u.toFun x0 r (unitConvexApproxScale n)) x) + (basisVec i) by + simpa [ψ, ρ] using congrFun + (congrFun (convexApproxSmoothW1p_grad (U := U) hU hp1 u x0 hr n) x) i] + +private theorem tendsto_setIntegral_of_tendsto_eLpNorm_sub_of_one_lt + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {q : ℝ} (hq : 1 < q) {F : ℕ → Vec d → ℝ} {f : Vec d → ℝ} + (hDiffMeas : + ∀ n, MeasureTheory.AEStronglyMeasurable (fun x => F n x - f x) (volumeMeasureOn U)) + (hf_int : MeasureTheory.Integrable f (volumeMeasureOn U)) + (hF_int : ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.Integrable (F n) (volumeMeasureOn U)) + (hLp : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) (ENNReal.ofReal q) + (volumeMeasureOn U)) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => ∫ x in U, F n x ∂MeasureTheory.volume) + Filter.atTop (nhds (∫ x in U, f x ∂MeasureTheory.volume)) := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let pE : ENNReal := ENNReal.ofReal q + have hq_pos : 0 < q := lt_trans zero_lt_one hq + have hpE_one : (1 : ENNReal) ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hexp_nonneg : 0 ≤ (1 - 1 / q : ℝ) := by + have hinv_le : 1 / q ≤ 1 := (div_le_one hq_pos).2 hq.le + linarith + have hL1_bound : + ∀ n, + MeasureTheory.eLpNorm (fun x => F n x - f x) 1 μ ≤ + MeasureTheory.eLpNorm (fun x => F n x - f x) pE μ * + μ Set.univ ^ (1 - 1 / q : ℝ) := by + intro n + simpa [μ, pE, ENNReal.toReal_ofReal hq_pos.le] using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ + (μ := μ) + (f := fun x => F n x - f x) + (p := (1 : ENNReal)) + (q := pE) + hpE_one + (by simpa [μ] using hDiffMeas n)) + have hConst_ne_top : μ Set.univ ^ (1 - 1 / q : ℝ) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg hexp_nonneg ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + have hL1 : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => F n x - f x) pE μ * + μ Set.univ ^ (1 - 1 / q : ℝ)) + Filter.atTop + (nhds (0 * (μ Set.univ ^ (1 - 1 / q : ℝ)))) := by + exact ENNReal.Tendsto.mul_const (by simpa [μ, pE] using hLp) (Or.inr hConst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => F n x - f x) pE μ * + μ Set.univ ^ (1 - 1 / q : ℝ)) + Filter.atTop (nhds 0) := by + simpa [zero_mul] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 + (fun _ => zero_le) + hL1_bound + simpa [μ, volumeMeasureOn, Pi.sub_apply] using + (MeasureTheory.tendsto_integral_of_L1' + (μ := μ) + (f := f) + (by + filter_upwards [hF_int] with n hn + exact hn) + hL1) + +private theorem tendsto_integralAverage_of_tendsto_eLpNorm_sub_of_one_lt + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {q : ℝ} (hq : 1 < q) {F : ℕ → Vec d → ℝ} {f : Vec d → ℝ} + (hDiffMeas : + ∀ n, MeasureTheory.AEStronglyMeasurable (fun x => F n x - f x) (volumeMeasureOn U)) + (hf_int : MeasureTheory.Integrable f (volumeMeasureOn U)) + (hF_int : ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.Integrable (F n) (volumeMeasureOn U)) + (hLp : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) (ENNReal.ofReal q) + (volumeMeasureOn U)) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => integralAverage U (F n)) Filter.atTop + (nhds (integralAverage U f)) := by + have hInt := + tendsto_setIntegral_of_tendsto_eLpNorm_sub_of_one_lt + (U := U) hq hDiffMeas hf_int hF_int hLp + simpa [integralAverage, mul_comm, mul_left_comm, mul_assoc] using + (tendsto_const_nhds.mul hInt : + Filter.Tendsto + (fun n => (MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, F n x ∂MeasureTheory.volume) + Filter.atTop + (nhds ((MeasureTheory.volume U).toReal⁻¹ * + ∫ x in U, f x ∂MeasureTheory.volume))) + +private theorem tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + {μ : MeasureTheory.Measure (Vec d)} (hp1 : 1 ≤ p) + {F : ℕ → Vec d → ℝ} {f : Vec d → ℝ} + (hF_mem : ∀ n, MeasureTheory.MemLp (F n) p μ) + (hf_mem : MeasureTheory.MemLp f p μ) + (hLp : + Filter.Tendsto (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => ENNReal.toReal (MeasureTheory.eLpNorm (F n) p μ)) + Filter.atTop (nhds (ENNReal.toReal (MeasureTheory.eLpNorm f p μ))) := by + let : Fact (1 ≤ p) := ⟨hp1⟩ + have hLpSpace : + Filter.Tendsto (fun n => (hF_mem n).toLp (F n)) + Filter.atTop (nhds (hf_mem.toLp f)) := by + exact + (MeasureTheory.Lp.tendsto_Lp_iff_tendsto_eLpNorm'' + (μ := μ) (p := p) F hF_mem f hf_mem).2 + (by simpa [Pi.sub_apply] using! hLp) + have hnorm : + Filter.Tendsto (fun n => ‖(hF_mem n).toLp (F n)‖) + Filter.atTop (nhds ‖hf_mem.toLp f‖) := + hLpSpace.norm + simpa [MeasureTheory.Lp.norm_toLp] using hnorm + +private theorem tendsto_convexApproxSmoothW1p_gradCoordLpSeminorm + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (u : W1pFunction U p) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (i : Fin d) : + Filter.Tendsto + (fun n => (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).gradCoordLpSeminorm i) + Filter.atTop (nhds (u.gradCoordLpSeminorm i)) := by + let ψ : ℕ → W1pFunction U p := convexApproxSmoothW1p (U := U) hU hp1 u x0 hr + have hLp := + tendsto_convexApproxSmoothW1p_grad_eLpNorm_sub + (U := U) hU hp1 hp u hball hr i + have hnorm := + tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + (μ := volumeMeasureOn U) (p := p) hp1 + (F := fun n => fun x => (ψ n).grad x i) (f := fun x => u.grad x i) + (fun n => (ψ n).grad_memLp i) (u.grad_memLp i) + (by simpa [ψ] using hLp) + simpa [W1pFunction.gradCoordLpSeminorm, ψ] using hnorm + +theorem tendsto_convexApproxSmoothW1p_gradientCoordLpSeminormSum + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (u : W1pFunction U p) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n => (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).gradientCoordLpSeminormSum) + Filter.atTop (nhds u.gradientCoordLpSeminormSum) := by + have hgrad : + ∀ i : Fin d, + Filter.Tendsto + (fun n => (convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n).gradCoordLpSeminorm i) + Filter.atTop (nhds (u.gradCoordLpSeminorm i)) := by + intro i + exact tendsto_convexApproxSmoothW1p_gradCoordLpSeminorm + (U := U) hU hp1 hp u hball hr i + simpa [W1pFunction.gradientCoordLpSeminormSum] using + tendsto_finsetSum Finset.univ (fun i _ => hgrad i) + +private theorem tendsto_convexApproxSmoothW1p_integralAverage_ofReal + (hU : IsOpenBoundedConvexDomain U) {q : ℝ} (hq : 1 < q) + (u : W1pFunction U (ENNReal.ofReal q)) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n => integralAverage U + (convexApproxSmoothW1p (U := U) hU + (by rw [ENNReal.one_le_ofReal]; exact hq.le) u x0 hr n).toFun) + Filter.atTop (nhds (integralAverage U u.toFun)) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + let pE : ENNReal := ENNReal.ofReal q + let hp1 : 1 ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + let ψ : ℕ → W1pFunction U pE := convexApproxSmoothW1p (U := U) hU hp1 u x0 hr + have hp_top : pE ≠ ⊤ := by + dsimp [pE] + exact ENNReal.ofReal_ne_top + have hLp := + tendsto_convexApproxSmoothW1p_toFun_eLpNorm_sub + (U := U) hU hp1 hp_top u hball hr + have hDiffMeas : + ∀ n, MeasureTheory.AEStronglyMeasurable + (fun x => (ψ n).toFun x - u.toFun x) (volumeMeasureOn U) := by + intro n + exact ((ψ n).memLp.sub u.memLp).aestronglyMeasurable + have hf_int : MeasureTheory.Integrable u.toFun (volumeMeasureOn U) := + u.memLp.integrable hp1 + have hψ_int : ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.Integrable (ψ n).toFun (volumeMeasureOn U) := + Filter.Eventually.of_forall fun n => (ψ n).memLp.integrable hp1 + have havg := + tendsto_integralAverage_of_tendsto_eLpNorm_sub_of_one_lt + (U := U) hq hDiffMeas hf_int hψ_int + (by simpa [ψ, pE] using hLp) + simpa [ψ, pE, hp1] using havg + +theorem tendsto_convexApproxSmoothW1p_subAverageLpSeminorm_ofReal + (hU : IsOpenBoundedConvexDomain U) {q : ℝ} (hq : 1 < q) + (u : W1pFunction U (ENNReal.ofReal q)) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n => + (convexApproxSmoothW1p (U := U) hU + (by rw [ENNReal.one_le_ofReal]; exact hq.le) u x0 hr n).subAverageLpSeminorm) + Filter.atTop (nhds u.subAverageLpSeminorm) := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let pE : ENNReal := ENNReal.ofReal q + let hp1 : 1 ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + let ψ : ℕ → W1pFunction U pE := convexApproxSmoothW1p (U := U) hU hp1 u x0 hr + have hq_pos : 0 < q := lt_trans zero_lt_one hq + have hp0 : pE ≠ 0 := by + dsimp [pE] + intro hzero + exact (not_le_of_gt hq_pos) (ENNReal.ofReal_eq_zero.mp hzero) + have hp_top : pE ≠ ⊤ := by + dsimp [pE] + exact ENNReal.ofReal_ne_top + have hLp_value := + tendsto_convexApproxSmoothW1p_toFun_eLpNorm_sub + (U := U) hU hp1 hp_top u hball hr + have havg := + tendsto_convexApproxSmoothW1p_integralAverage_ofReal + (U := U) hU hq u hball hr + have havgdiff : + Filter.Tendsto + (fun n => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + Filter.atTop (nhds 0) := by + have hconst : + Filter.Tendsto (fun _ : ℕ => integralAverage U u.toFun) + Filter.atTop (nhds (integralAverage U u.toFun)) := + tendsto_const_nhds + have hψavg : + Filter.Tendsto (fun n => integralAverage U (ψ n).toFun) + Filter.atTop (nhds (integralAverage U u.toFun)) := by + simpa [ψ, pE, hp1] using havg + have htmp := hconst.sub hψavg + simpa using htmp + have hconstFactor_ne_top : μ Set.univ ^ (1 / q : ℝ) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun _ : Vec d => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + pE μ) + Filter.atTop (nhds 0) := by + have henorm : + Filter.Tendsto + (fun n => ‖integralAverage U u.toFun - integralAverage U (ψ n).toFun‖ₑ) + Filter.atTop (nhds 0) := by + have hnorm := havgdiff.norm + simpa [Real.enorm_eq_ofReal_abs, Real.norm_eq_abs] using ENNReal.tendsto_ofReal hnorm + have hscaled : + Filter.Tendsto + (fun n => + ‖integralAverage U u.toFun - integralAverage U (ψ n).toFun‖ₑ * + μ Set.univ ^ (1 / q : ℝ)) + Filter.atTop (nhds 0) := by + have htmp := + ENNReal.Tendsto.mul_const henorm (Or.inr hconstFactor_ne_top) + simpa [zero_mul] using htmp + have hformula : + (fun n => + MeasureTheory.eLpNorm + (fun _ : Vec d => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + pE μ) = + fun n => + ‖integralAverage U u.toFun - integralAverage U (ψ n).toFun‖ₑ * + μ Set.univ ^ (1 / q : ℝ) := by + funext n + simpa [pE, ENNReal.toReal_ofReal hq_pos.le] using + (MeasureTheory.eLpNorm_const' + (μ := μ) (p := pE) + (c := integralAverage U u.toFun - integralAverage U (ψ n).toFun) + hp0 hp_top) + simpa [hformula] using hscaled + have hsubavg_bound : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + ((ψ n).toFun x - integralAverage U (ψ n).toFun) - + (u.toFun x - integralAverage U u.toFun)) + pE μ ≤ + MeasureTheory.eLpNorm (fun x => (ψ n).toFun x - u.toFun x) pE μ + + MeasureTheory.eLpNorm + (fun _ : Vec d => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + pE μ := by + intro n + let A : Vec d → ℝ := fun x => (ψ n).toFun x - u.toFun x + let B : Vec d → ℝ := fun _ => integralAverage U u.toFun - integralAverage U (ψ n).toFun + have hmeasA : MeasureTheory.AEStronglyMeasurable A μ := + ((ψ n).memLp.sub u.memLp).aestronglyMeasurable + have hmeasB : MeasureTheory.AEStronglyMeasurable B μ := + (MeasureTheory.memLp_const (integralAverage U u.toFun - integralAverage U (ψ n).toFun) + (μ := μ) (p := pE)).aestronglyMeasurable + calc + MeasureTheory.eLpNorm + (fun x => + ((ψ n).toFun x - integralAverage U (ψ n).toFun) - + (u.toFun x - integralAverage U u.toFun)) + pE μ + = MeasureTheory.eLpNorm (A + B) pE μ := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + dsimp [A, B] + ring + _ ≤ MeasureTheory.eLpNorm A pE μ + MeasureTheory.eLpNorm B pE μ := + MeasureTheory.eLpNorm_add_le hp1 + _ = MeasureTheory.eLpNorm (fun x => (ψ n).toFun x - u.toFun x) pE μ + + MeasureTheory.eLpNorm + (fun _ : Vec d => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + pE μ := by + rfl + have hsubavg_eLp : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => + ((ψ n).toFun x - integralAverage U (ψ n).toFun) - + (u.toFun x - integralAverage U u.toFun)) + pE μ) + Filter.atTop (nhds 0) := by + have hsum : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => (ψ n).toFun x - u.toFun x) pE μ + + MeasureTheory.eLpNorm + (fun _ : Vec d => integralAverage U u.toFun - integralAverage U (ψ n).toFun) + pE μ) + Filter.atTop (nhds 0) := by + have hvalue : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => (ψ n).toFun x - u.toFun x) pE μ) + Filter.atTop (nhds 0) := by + simpa [ψ, pE, μ] using hLp_value + simpa [zero_add] using hvalue.add hconst_tendsto + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hsum + (fun _ => zero_le) + hsubavg_bound + have hF_mem : + ∀ n, MeasureTheory.MemLp + (fun x => (ψ n).toFun x - integralAverage U (ψ n).toFun) pE μ := by + intro n + exact (ψ n).memLp.sub (MeasureTheory.memLp_const (integralAverage U (ψ n).toFun)) + have hf_mem : + MeasureTheory.MemLp (fun x => u.toFun x - integralAverage U u.toFun) pE μ := + u.memLp.sub (MeasureTheory.memLp_const (integralAverage U u.toFun)) + have hnorm := + tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + (μ := μ) (p := pE) hp1 + (F := fun n => fun x => (ψ n).toFun x - integralAverage U (ψ n).toFun) + (f := fun x => u.toFun x - integralAverage U u.toFun) + hF_mem hf_mem + (by simpa [Pi.sub_apply] using hsubavg_eLp) + simpa [W1pFunction.subAverageLpSeminorm, ψ, pE, μ] using hnorm + + +end W1pFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Core.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Core.lean new file mode 100644 index 0000000000..ddb445f0b2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Core.lean @@ -0,0 +1,316 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.ConvexApproxTendsto + +/-! # Core -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} +private theorem subAverageLpSeminorm_le_smoothPoincareLpConst_mul_gradientCoordLpSeminormSum + [NeZero d] (hU : IsOpenBoundedConvexDomain U) + {q : ℝ} (hq : 1 < q) (hvol : 0 < (MeasureTheory.volume U).toReal) + (u : W1pFunction U (ENNReal.ofReal q)) : + u.subAverageLpSeminorm ≤ + smoothPoincareLpConst (d := d) (U := U) hU * u.gradientCoordLpSeminormSum := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + let pE : ENNReal := ENNReal.ofReal q + let hp1 : 1 ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hp_top : pE ≠ ⊤ := by + dsimp [pE] + exact ENNReal.ofReal_ne_top + have hnonempty : U.Nonempty := by + by_contra hne + have hUempty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hne + subst U + simp at hvol + rcases hnonempty with ⟨x0, hx0⟩ + rcases Metric.mem_nhds_iff.1 (hU.isOpen.mem_nhds hx0) with ⟨δ, hδpos, hδsub⟩ + let r : ℝ := δ / 2 + have hr : 0 < r := by + dsimp [r] + positivity + have hball : Metric.closedBall x0 r ⊆ U := by + intro y hy + apply hδsub + have hy' : dist y x0 ≤ r := by + simpa [Metric.mem_closedBall] using hy + have hlt : dist y x0 < δ := by + have hrδ : r < δ := by + dsimp [r] + linarith + exact lt_of_le_of_lt hy' hrδ + simpa [Metric.mem_ball] using hlt + let ψ : ℕ → W1pFunction U pE := fun n => convexApproxSmoothW1p (U := U) hU hp1 u x0 hr n + have hψ_bound : + ∀ n, (ψ n).subAverageLpSeminorm ≤ + smoothPoincareLpConst (d := d) (U := U) hU * (ψ n).gradientCoordLpSeminormSum := by + intro n + let f : Vec d → ℝ := + convexApproxSmoothRepresentative U (unitConvexApproxKernel (d := d)) u.toFun x0 r + (unitConvexApproxScale n) + have hf : ContDiff ℝ (⊤ : ℕ∞) f := + contDiff_convexApproxSmoothRepresentative + (U := U) (ρ := unitConvexApproxKernel (d := d)) (u := u.toFun) + (p := pE) (x0 := x0) (r := r) (ε := unitConvexApproxScale n) + hU.isOpen.measurableSet (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + hp1 u.memLp hr (unitConvexApproxScale_pos n) + simpa [ψ, convexApproxSmoothW1p, f, pE] using + (subAverageLpSeminorm_le_smoothPoincareLpConst_mul_gradientCoordLpSeminormSum_ofContDiff + (U := U) hU (q := q) hq (f := f) hf hvol) + have hleft : + Filter.Tendsto (fun n => (ψ n).subAverageLpSeminorm) + Filter.atTop (nhds u.subAverageLpSeminorm) := by + simpa [ψ, pE, hp1] using + (tendsto_convexApproxSmoothW1p_subAverageLpSeminorm_ofReal + (U := U) hU hq u hball hr) + have hright_grad : + Filter.Tendsto (fun n => (ψ n).gradientCoordLpSeminormSum) + Filter.atTop (nhds u.gradientCoordLpSeminormSum) := by + simpa [ψ, pE] using + (tendsto_convexApproxSmoothW1p_gradientCoordLpSeminormSum + (U := U) hU hp1 hp_top u hball hr) + have hright : + Filter.Tendsto + (fun n => + smoothPoincareLpConst (d := d) (U := U) hU * (ψ n).gradientCoordLpSeminormSum) + Filter.atTop + (nhds (smoothPoincareLpConst (d := d) (U := U) hU * + u.gradientCoordLpSeminormSum)) := + tendsto_const_nhds.mul hright_grad + exact le_of_tendsto_of_tendsto' hleft hright hψ_bound + +theorem exists_subAverage_poincare_constant_of_isOpenBoundedConvexDomain + [NeZero d] (hU : IsOpenBoundedConvexDomain U) {q : ℝ} (hq : 1 < q) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : W1pFunction U (ENNReal.ofReal q), + u.subAverageLpSeminorm ≤ C * u.gradientCoordLpSeminormSum := by + classical + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + by_cases hvol0 : (MeasureTheory.volume U).toReal = 0 + · refine ⟨0, le_rfl, ?_⟩ + intro u + have hfinite : MeasureTheory.volume U < ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ) + have hvol0' : MeasureTheory.volume U = 0 := by + rcases (ENNReal.toReal_eq_zero_iff (MeasureTheory.volume U)).mp hvol0 with hzero | htop + · exact hzero + · exact (hfinite.ne htop).elim + have hμ0 : volumeMeasureOn U = 0 := by + simpa [volumeMeasureOn] using + (MeasureTheory.Measure.restrict_eq_zero.2 hvol0' : + MeasureTheory.volume.restrict U = 0) + simp [W1pFunction.subAverageLpSeminorm, hμ0, MeasureTheory.eLpNorm_measure_zero] + · refine ⟨smoothPoincareLpConst (d := d) (U := U) hU, + smoothPoincareLpConst_nonneg (d := d) (U := U) hU, ?_⟩ + intro u + have hvol : 0 < (MeasureTheory.volume U).toReal := + lt_of_le_of_ne ENNReal.toReal_nonneg (Ne.symm hvol0) + exact subAverageLpSeminorm_le_smoothPoincareLpConst_mul_gradientCoordLpSeminormSum + (U := U) hU hq hvol u + +theorem integralAverage_eq_zero_of_meanZero + (u : W1pFunction U p) (hmean : MeanZeroOn U u.toFun) : + integralAverage U u.toFun = 0 := by + unfold integralAverage + rw [hmean] + simp + +theorem subAverageLpSeminorm_eq_valueLpSeminorm_of_meanZero + (u : W1pFunction U p) (hmean : MeanZeroOn U u.toFun) : + u.subAverageLpSeminorm = u.valueLpSeminorm := by + have havg : integralAverage U u.toFun = 0 := + u.integralAverage_eq_zero_of_meanZero hmean + apply congrArg ENNReal.toReal + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + simp [havg] + +private theorem valueLpSeminorm_eq_zero_of_volume_toReal_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hvol : (MeasureTheory.volume U).toReal = 0) (u : W1pFunction U p) : + u.valueLpSeminorm = 0 := by + have hfinite : MeasureTheory.volume U < ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ) + have hvol0 : MeasureTheory.volume U = 0 := by + rcases (ENNReal.toReal_eq_zero_iff (MeasureTheory.volume U)).mp hvol with hzero | htop + · exact hzero + · exact (hfinite.ne htop).elim + have hμ0 : volumeMeasureOn U = 0 := by + simpa [volumeMeasureOn] using + (MeasureTheory.Measure.restrict_eq_zero.2 hvol0 : + MeasureTheory.volume.restrict U = 0) + dsimp [W1pFunction.valueLpSeminorm] + rw [hμ0, MeasureTheory.eLpNorm_measure_zero] + rfl + +end W1pFunction + +/-- Mean-zero `W^{1,p}(U)` functions, represented by a chosen witness together +with the zero-average condition. -/ +structure W1pMeanZeroFunction {d : ℕ} (U : Set (Vec d)) (p : ENNReal) where + toW1pFunction : W1pFunction U p + meanZero : MeanZeroOn U toW1pFunction.toFun + +namespace W1pMeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +instance : Coe (W1pMeanZeroFunction U p) (W1pFunction U p) where + coe u := u.toW1pFunction + +instance : CoeFun (W1pMeanZeroFunction U p) (fun _ => Vec d → ℝ) where + coe u := u.toW1pFunction.toFun + +@[simp] theorem coe_mk (u : W1pFunction U p) (hmean : MeanZeroOn U u.toFun) : + ((⟨u, hmean⟩ : W1pMeanZeroFunction U p) : W1pFunction U p) = u := + rfl + +@[ext] theorem ext {u v : W1pMeanZeroFunction U p} + (htoW1p : u.toW1pFunction = v.toW1pFunction) : u = v := by + cases u + cases v + cases htoW1p + rfl + +/-- The scalar `L^p(U)` seminorm of a mean-zero `W^{1,p}` function. -/ +noncomputable def valueLpSeminorm (u : W1pMeanZeroFunction U p) : ℝ := + u.toW1pFunction.valueLpSeminorm + +/-- Coordinate-sum gradient seminorm of a mean-zero `W^{1,p}` function. -/ +noncomputable def gradientCoordLpSeminormSum (u : W1pMeanZeroFunction U p) : ℝ := + u.toW1pFunction.gradientCoordLpSeminormSum + +theorem valueLpSeminorm_nonneg (u : W1pMeanZeroFunction U p) : + 0 ≤ u.valueLpSeminorm := + u.toW1pFunction.valueLpSeminorm_nonneg + +theorem gradientCoordLpSeminormSum_nonneg (u : W1pMeanZeroFunction U p) : + 0 ≤ u.gradientCoordLpSeminormSum := + u.toW1pFunction.gradientCoordLpSeminormSum_nonneg + +theorem subAverageLpSeminorm_eq_valueLpSeminorm + (u : W1pMeanZeroFunction U p) : + u.toW1pFunction.subAverageLpSeminorm = u.valueLpSeminorm := by + simpa [W1pMeanZeroFunction.valueLpSeminorm] using + u.toW1pFunction.subAverageLpSeminorm_eq_valueLpSeminorm_of_meanZero u.meanZero + +private theorem valueLpSeminorm_eq_zero_of_dim_zero + {U : Set (Vec 0)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hvol : 0 < (MeasureTheory.volume U).toReal) (u : W1pMeanZeroFunction U p) : + u.valueLpSeminorm = 0 := by + let c : ℝ := u.toW1pFunction.toFun 0 + have hconst : u.toW1pFunction.toFun = fun _ : Vec 0 => c := by + funext x + exact congrArg u.toW1pFunction.toFun (Subsingleton.elim x (0 : Vec 0)) + have hmean_const : ∫ x in U, (fun _ : Vec 0 => c) x ∂MeasureTheory.volume = 0 := by + change MeanZeroOn U (fun _ : Vec 0 => c) + rw [← hconst] + exact u.meanZero + have hμ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hmean_mul : (MeasureTheory.volume U).toReal * c = 0 := by + rw [MeasureTheory.integral_const] at hmean_const + rw [hμ, smul_eq_mul] at hmean_const + exact hmean_const + have hc0 : c = 0 := by + nlinarith + have hzeroFun : u.toW1pFunction.toFun = 0 := by + rw [hconst] + funext x + simp [hc0] + simp [W1pMeanZeroFunction.valueLpSeminorm, W1pFunction.valueLpSeminorm, hzeroFun] + +end W1pMeanZeroFunction + +/-- A bundled finite-`p` mean-zero Poincare estimate for the `W^{1,p}` layer. -/ +structure W1pPoincareEstimate {d : ℕ} (U : Set (Vec d)) (p : ENNReal) where + fixedValue : ℝ + constant_nonneg : 0 ≤ fixedValue + bound : + ∀ u : W1pMeanZeroFunction U p, + u.valueLpSeminorm ≤ fixedValue * u.gradientCoordLpSeminormSum + +namespace W1pPoincareEstimate + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +theorem bound_subAverage (hC : W1pPoincareEstimate U p) (u : W1pFunction U p) + (hmean : MeanZeroOn U u.toFun) : + u.subAverageLpSeminorm ≤ hC.fixedValue * u.gradientCoordLpSeminormSum := by + rw [u.subAverageLpSeminorm_eq_valueLpSeminorm_of_meanZero hmean] + let v : W1pMeanZeroFunction U p := ⟨u, hmean⟩ + simpa [v, W1pMeanZeroFunction.valueLpSeminorm, + W1pMeanZeroFunction.gradientCoordLpSeminormSum] using hC.bound v + +end W1pPoincareEstimate + +/-- Bounded open convex domains satisfy the mean-zero finite-`p` Poincare +estimate for every real exponent `1 < p < ∞`, packaged on the witness-based +`W1pFunction` API. -/ +noncomputable def w1pPoincareEstimate_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {q : ℝ} + (hU : IsOpenBoundedConvexDomain U) (hq : 1 < q) : + W1pPoincareEstimate U (ENNReal.ofReal q) := by + classical + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + by_cases hvol0 : (MeasureTheory.volume U).toReal = 0 + · exact + { fixedValue := 0 + constant_nonneg := le_rfl + bound := by + intro u + have hzero := + W1pFunction.valueLpSeminorm_eq_zero_of_volume_toReal_eq_zero + (U := U) (p := ENNReal.ofReal q) hvol0 u.toW1pFunction + simp [W1pMeanZeroFunction.valueLpSeminorm, hzero] } + · have hvol : 0 < (MeasureTheory.volume U).toReal := by + exact lt_of_le_of_ne ENNReal.toReal_nonneg (Ne.symm hvol0) + by_cases hd0 : d = 0 + · subst d + exact + { fixedValue := 0 + constant_nonneg := le_rfl + bound := by + intro u + have hzero := + W1pMeanZeroFunction.valueLpSeminorm_eq_zero_of_dim_zero + (U := U) (p := ENNReal.ofReal q) hvol u + simp [hzero] } + · letI : NeZero d := ⟨hd0⟩ + exact + { fixedValue := W1pFunction.smoothPoincareLpConst (d := d) (U := U) hU + constant_nonneg := + W1pFunction.smoothPoincareLpConst_nonneg (d := d) (U := U) hU + bound := by + intro u + have hsub := + W1pFunction.subAverageLpSeminorm_le_smoothPoincareLpConst_mul_gradientCoordLpSeminormSum + (U := U) hU hq hvol u.toW1pFunction + simpa [W1pMeanZeroFunction.valueLpSeminorm, + W1pMeanZeroFunction.gradientCoordLpSeminormSum, + u.subAverageLpSeminorm_eq_valueLpSeminorm] using hsub } + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Dilation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Dilation.lean new file mode 100644 index 0000000000..4be73ab1dd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Dilation.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Dilation + +/-! # Dilation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Pointwise + +noncomputable section + +namespace W1pMeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Pull a mean-zero `W^{1,p}(a • U)` witness back to a mean-zero witness on +`U` by positive dilation. -/ +noncomputable def unscale {a : ℝ} (ha : 0 < a) + (u : W1pMeanZeroFunction (a • U) p) : W1pMeanZeroFunction U p where + toW1pFunction := u.toW1pFunction.unscale ha + meanZero := W1pFunction.meanZeroOn_unscale ha u.toW1pFunction u.meanZero + +@[simp] theorem unscale_toW1pFunction {a : ℝ} (ha : 0 < a) + (u : W1pMeanZeroFunction (a • U) p) : + (u.unscale ha).toW1pFunction = u.toW1pFunction.unscale ha := + rfl + +/-- The scalar mean-zero seminorm under positive dilation pullback. -/ +theorem valueLpSeminorm_unscale_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pMeanZeroFunction (a • U) p) : + (u.unscale ha).valueLpSeminorm = + W1pFunction.dilationLpFactor d p a⁻¹ * u.valueLpSeminorm := by + exact W1pFunction.valueLpSeminorm_unscale_eq ha hp_top u.toW1pFunction + +/-- The coordinate-sum gradient seminorm under positive dilation pullback. -/ +theorem gradientCoordLpSeminormSum_unscale_eq {a : ℝ} (ha : 0 < a) + (hp_top : p ≠ ∞) (u : W1pMeanZeroFunction (a • U) p) : + (u.unscale ha).gradientCoordLpSeminormSum = + a * W1pFunction.dilationLpFactor d p a⁻¹ * u.gradientCoordLpSeminormSum := by + exact W1pFunction.gradientCoordLpSeminormSum_unscale_eq ha hp_top u.toW1pFunction + +end W1pMeanZeroFunction + +namespace W1pPoincareEstimate + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Transport a finite-`p` mean-zero Poincare estimate to a positive dilation +of its domain. The constant gains exactly one factor of the dilation scale. -/ +noncomputable def dilate {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (hC : W1pPoincareEstimate U p) : W1pPoincareEstimate (a • U) p where + fixedValue := a * hC.fixedValue + constant_nonneg := mul_nonneg ha.le hC.constant_nonneg + bound := by + intro u + let v : W1pMeanZeroFunction U p := u.unscale ha + have hv := hC.bound v + have hvalue := W1pMeanZeroFunction.valueLpSeminorm_unscale_eq ha hp_top u + have hgrad := W1pMeanZeroFunction.gradientCoordLpSeminormSum_unscale_eq ha hp_top u + have hfactor_pos : 0 < W1pFunction.dilationLpFactor d p a⁻¹ := + W1pFunction.dilationLpFactor_pos d p (inv_pos.mpr ha) + have hscaled : + W1pFunction.dilationLpFactor d p a⁻¹ * u.valueLpSeminorm ≤ + hC.fixedValue * + (a * W1pFunction.dilationLpFactor d p a⁻¹ * u.gradientCoordLpSeminormSum) := by + simpa [v, hvalue, hgrad] using hv + have hscaled' : + W1pFunction.dilationLpFactor d p a⁻¹ * u.valueLpSeminorm ≤ + W1pFunction.dilationLpFactor d p a⁻¹ * + ((a * hC.fixedValue) * u.gradientCoordLpSeminormSum) := by + calc + W1pFunction.dilationLpFactor d p a⁻¹ * u.valueLpSeminorm ≤ + hC.fixedValue * + (a * W1pFunction.dilationLpFactor d p a⁻¹ * u.gradientCoordLpSeminormSum) := hscaled + _ = W1pFunction.dilationLpFactor d p a⁻¹ * + ((a * hC.fixedValue) * u.gradientCoordLpSeminormSum) := by + ring + simpa [mul_comm, mul_left_comm, mul_assoc] using + (mul_le_mul_iff_right₀ hfactor_pos).mp hscaled' + +@[simp] theorem dilate_constant {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (hC : W1pPoincareEstimate U p) : + (hC.dilate ha hp_top).fixedValue = a * hC.fixedValue := + rfl + +end W1pPoincareEstimate + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCube.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCube.lean new file mode 100644 index 0000000000..8df1bcd878 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCube.lean @@ -0,0 +1,258 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Translation + +/-! # Overlap Cube -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Pointwise + +noncomputable section + +/-- One finite-`p` Poincare constant, selected on the unit centered cube, +controls every open overlap cube after its explicit scale factor. -/ +theorem exists_overlapCube_meanZero_poincare_constant {d : ℕ} {q : ℝ} + (hq : 1 < q) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (S : TriadicCube d) + (u : W1pMeanZeroFunction (openOverlapCubeSet S) (ENNReal.ofReal q)), + u.valueLpSeminorm ≤ + (C * overlapCubeScaleFactor S) * u.gradientCoordLpSeminormSum := by + let hCunit : W1pPoincareEstimate (openCubeSet (originCube d 0)) (ENNReal.ofReal q) := + w1pPoincareEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)) hq + refine ⟨hCunit.fixedValue, hCunit.constant_nonneg, ?_⟩ + intro S + rw [openOverlapCubeSet_eq_translateSet_smul_originCube_zero S] + intro u + let a : ℝ := overlapCubeScaleFactor S + have ha : 0 < a := overlapCubeScaleFactor_pos S + let hCdil : W1pPoincareEstimate + (a • openCubeSet (originCube d 0)) (ENNReal.ofReal q) := + hCunit.dilate ha ENNReal.ofReal_ne_top + let hCtrans : W1pPoincareEstimate + (translateSet (cubeCenter S) (a • openCubeSet (originCube d 0))) + (ENNReal.ofReal q) := + hCdil.translate (cubeCenter S) + calc + u.valueLpSeminorm ≤ hCtrans.fixedValue * u.gradientCoordLpSeminormSum := + hCtrans.bound u + _ = (hCunit.fixedValue * overlapCubeScaleFactor S) * + u.gradientCoordLpSeminormSum := by + simp only [hCtrans, hCdil, W1pPoincareEstimate.translate_constant, + W1pPoincareEstimate.dilate_constant] + simp only [a] + ring + +/-- The overlap-cube Poincare estimate in the finite-exponent carrier used by +the finite-`p` Sobolev and Calderon--Zygmund layers. -/ +theorem exists_overlapCube_meanZero_poincare_constant_finite {d : ℕ} + (q : FiniteLpExponent) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (S : TriadicCube d) + (u : W1pMeanZeroFunction (openOverlapCubeSet S) q.exponent), + u.valueLpSeminorm ≤ + (C * overlapCubeScaleFactor S) * u.gradientCoordLpSeminormSum := by + have hq : 1 < q.exponent.toReal := by + have hq' : (1 : ℝ≥0∞).toReal < q.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).2 q.one_lt + simpa using hq' + rcases exists_overlapCube_meanZero_poincare_constant (d := d) hq with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro S + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + exact hC S + +/-! The following reverse-translation package is deliberately private: it is +the one local transport needed to retain the source-facing subaverage form of +Poincare on overlap cubes. -/ + +private noncomputable def castW1pDomain {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} + (hUV : U = V) (u : W1pFunction U p) : W1pFunction V p := + hUV ▸ u + +@[simp] private theorem castW1pDomain_toFun {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} + (hUV : U = V) (u : W1pFunction U p) : + (castW1pDomain hUV u).toFun = u.toFun := by + subst V + rfl + +@[simp] private theorem castW1pDomain_grad {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} + (hUV : U = V) (u : W1pFunction U p) : + (castW1pDomain hUV u).grad = u.grad := by + subst V + rfl + +private noncomputable def untranslateForOverlapPoincare {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) : W1pFunction U p := by + have hset : translateSet (-z) (translateSet z U) = U := by + rw [translateSet_translateSet] + simp + exact castW1pDomain hset (u.translate (-z)) + +@[simp] private theorem untranslateForOverlapPoincare_toFun {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) (x : Vec d) : + (untranslateForOverlapPoincare z u).toFun x = u.toFun (x + z) := by + simp [untranslateForOverlapPoincare, W1pFunction.translate, sub_eq_add_neg] + +@[simp] private theorem untranslateForOverlapPoincare_grad {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) (x : Vec d) : + (untranslateForOverlapPoincare z u).grad x = u.grad (x + z) := by + simp [untranslateForOverlapPoincare, W1pFunction.translate, sub_eq_add_neg] + +private theorem integralAverage_untranslateForOverlapPoincare_eq {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) : + integralAverage U (untranslateForOverlapPoincare z u).toFun = + integralAverage (translateSet z U) u.toFun := by + change + (volume U).toReal⁻¹ * + ∫ x in U, (untranslateForOverlapPoincare z u).toFun x ∂volume = + (volume (translateSet z U)).toReal⁻¹ * + ∫ x in translateSet z U, u.toFun x ∂volume + rw [volume_translateSet_eq] + simp only [untranslateForOverlapPoincare_toFun] + rw [← setIntegral_comp_addRight_translateSet] + +private theorem subAverageLpSeminorm_untranslateForOverlapPoincare_eq {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) : + (untranslateForOverlapPoincare z u).subAverageLpSeminorm = + u.subAverageLpSeminorm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + let hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + unfold W1pFunction.subAverageLpSeminorm + rw [integralAverage_untranslateForOverlapPoincare_eq] + have hfun : + (fun x => (untranslateForOverlapPoincare z u).toFun x - + integralAverage V u.toFun) = + (fun x => u.toFun x - integralAverage V u.toFun) ∘ T := by + funext x + simp [T, Function.comp] + rw [hfun] + exact congrArg ENNReal.toReal (by + simpa [V, T, Function.comp, volumeMeasureOn] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.toFun x - integralAverage V u.toFun) (p := p) + (u.memLp.aestronglyMeasurable.sub continuous_const.aestronglyMeasurable) hμ)) + +private theorem gradientCoordLpSeminormSum_untranslateForOverlapPoincare_eq {d : ℕ} + {U : Set (Vec d)} {p : ENNReal} (z : Vec d) + (u : W1pFunction (translateSet z U) p) : + (untranslateForOverlapPoincare z u).gradientCoordLpSeminormSum = + u.gradientCoordLpSeminormSum := by + unfold W1pFunction.gradientCoordLpSeminormSum W1pFunction.gradCoordLpSeminorm + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + let hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + apply Finset.sum_congr rfl + intro i _ + apply congrArg ENNReal.toReal + have hfun : (fun x => (untranslateForOverlapPoincare z u).grad x i) = + (fun x => u.grad x i) ∘ T := by + funext x + simp [T, Function.comp] + rw [hfun] + simpa [V, T, Function.comp, volumeMeasureOn] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.grad x i) (p := p) (u.gradMemLp i).aestronglyMeasurable hμ) + +private theorem exists_overlapCube_subAverage_poincare_constant_ofReal {d : ℕ} [NeZero d] + {q : ℝ} (hq : 1 < q) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (S : TriadicCube d) (u : W1pFunction (openOverlapCubeSet S) (ENNReal.ofReal q)), + u.subAverageLpSeminorm ≤ + (C * overlapCubeScaleFactor S) * u.gradientCoordLpSeminormSum := by + let U0 : Set (Vec d) := openCubeSet (originCube d 0) + obtain ⟨C, hC_nonneg, hC⟩ := + W1pFunction.exists_subAverage_poincare_constant_of_isOpenBoundedConvexDomain + (U := U0) (isOpenBoundedConvexDomain_openCubeSet (originCube d 0)) hq + refine ⟨C, hC_nonneg, ?_⟩ + intro S + rw [openOverlapCubeSet_eq_translateSet_smul_originCube_zero S] + intro u + let a : ℝ := overlapCubeScaleFactor S + let z : Vec d := cubeCenter S + have ha : 0 < a := by simpa [a] using overlapCubeScaleFactor_pos S + have hp_top : ENNReal.ofReal q ≠ ∞ := ENNReal.ofReal_ne_top + let uD : W1pFunction (a • U0) (ENNReal.ofReal q) := + untranslateForOverlapPoincare z u + let u0 : W1pFunction U0 (ENNReal.ofReal q) := uD.unscale ha + have hbase := hC u0 + have htrans_value : uD.subAverageLpSeminorm = u.subAverageLpSeminorm := + subAverageLpSeminorm_untranslateForOverlapPoincare_eq z u + have htrans_grad : uD.gradientCoordLpSeminormSum = u.gradientCoordLpSeminormSum := + gradientCoordLpSeminormSum_untranslateForOverlapPoincare_eq z u + have hdil_value : u0.subAverageLpSeminorm = + W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * uD.subAverageLpSeminorm := + W1pFunction.subAverageLpSeminorm_unscale_eq ha hp_top uD + have hdil_grad : u0.gradientCoordLpSeminormSum = + a * W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + uD.gradientCoordLpSeminormSum := + W1pFunction.gradientCoordLpSeminormSum_unscale_eq ha hp_top uD + have hfactor_pos : 0 < W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ := + W1pFunction.dilationLpFactor_pos d (ENNReal.ofReal q) (inv_pos.mpr ha) + have hscaled : + W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + u.subAverageLpSeminorm ≤ + C * (a * W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + u.gradientCoordLpSeminormSum) := by + simpa [u0, uD, htrans_value, htrans_grad, hdil_value, hdil_grad] using hbase + have hscaled' : + W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + u.subAverageLpSeminorm ≤ + W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + ((C * a) * u.gradientCoordLpSeminormSum) := by + calc + W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + u.subAverageLpSeminorm ≤ + C * (a * W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + u.gradientCoordLpSeminormSum) := hscaled + _ = W1pFunction.dilationLpFactor d (ENNReal.ofReal q) a⁻¹ * + ((C * a) * u.gradientCoordLpSeminormSum) := by ring + have hresult : u.subAverageLpSeminorm ≤ + (C * a) * u.gradientCoordLpSeminormSum := + (mul_le_mul_iff_right₀ hfactor_pos).mp hscaled' + simpa [a] using hresult + +/-- One finite-`p` Poincare constant controls the subaverage seminorm on every +open overlap cube. This is the scalar form consumed by normalized vector +interfaces. -/ +theorem exists_overlapCube_subAverage_poincare_constant_finite {d : ℕ} [NeZero d] + (q : FiniteLpExponent) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (S : TriadicCube d) (u : W1pFunction (openOverlapCubeSet S) q.exponent), + u.subAverageLpSeminorm ≤ + (C * overlapCubeScaleFactor S) * u.gradientCoordLpSeminormSum := by + have hq : 1 < q.exponent.toReal := by + have hq' : (1 : ℝ≥0∞).toReal < q.exponent.toReal := + (ENNReal.toReal_lt_toReal (by norm_num) q.lt_top.ne).2 q.one_lt + simpa using hq' + rcases exists_overlapCube_subAverage_poincare_constant_ofReal (d := d) hq with + ⟨C, hC_nonneg, hC⟩ + refine ⟨C, hC_nonneg, ?_⟩ + intro S + rw [← ENNReal.ofReal_toReal q.lt_top.ne] + exact hC S + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCubeVectorNormalized.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCubeVectorNormalized.lean new file mode 100644 index 0000000000..fff70c4817 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/OverlapCubeVectorNormalized.lean @@ -0,0 +1,269 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.CubeVector + +/-! +# Vector finite-`p` Poincare estimates on overlap cubes + +The scalar overlap-cube estimate is transported here to the normalized vector +carrier used by the finite-`p` Calderon--Zygmund layer. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem scalarOverlap_normalizedCubeMeasure_eq_open {d : ℕ} + (S : TriadicCube d) : + ScalarOverlap.normalizedCubeMeasure S = + ENNReal.ofReal ((overlapCubeVolume S)⁻¹) • + volumeMeasureOn (openOverlapCubeSet S) := by + change ENNReal.ofReal ((overlapCubeVolume S)⁻¹) • + (volume.restrict (ScalarOverlap.cubeSet S)) = _ + change ENNReal.ofReal ((overlapCubeVolume S)⁻¹) • + (volume.restrict (overlapCubeSet S)) = _ + rw [volume_restrict_overlapCubeSet_eq_volume_restrict_openOverlapCubeSet] + +private theorem scalarOverlap_cubeAverage_eq_integralAverage_open {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : + ScalarOverlap.cubeAverage S f = integralAverage (openOverlapCubeSet S) f := by + simpa only [ScalarOverlap.cubeAverage, ScalarOverlap.cubeVolume, + ScalarOverlap.cubeSet, ScalarOverlap.scaleFactor] using! + overlapCubeAverage_eq_integralAverage_openOverlapCubeSet S f + +private theorem scalar_overlap_coordinate_normalized_bound {d : ℕ} [NeZero d] + (q : FiniteLpExponent) (C : ℝ) + (hPoincare : ∀ (S : TriadicCube d) (u : W1pFunction (openOverlapCubeSet S) q.exponent), + u.subAverageLpSeminorm ≤ + (C * overlapCubeScaleFactor S) * u.gradientCoordLpSeminormSum) + (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (V : CubeVectorW1pFunction Q q) (i : Fin d) : + ENNReal.toReal (eLpNorm + (fun x => V.toField x i - ScalarOverlap.cubeAverageVec S V.toField i) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) ≤ + (C * overlapCubeScaleFactor S) * + ∑ k : Fin d, ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) := by + have hsub : openOverlapCubeSet S ⊆ openCubeSet Q := by + exact ScalarOverlap.openCubeSet_subset_openCubeSet_of_mem_centersAtDepth hS + let w : W1pFunction (openOverlapCubeSet S) q.exponent := + (V.coord i).restrict (isOpen_openOverlapCubeSet S) hsub + have hraw := hPoincare S w + have havg : ScalarOverlap.cubeAverageVec S V.toField i = + integralAverage (openOverlapCubeSet S) w.toFun := by + simpa [ScalarOverlap.cubeAverageVec, w] using! + (scalarOverlap_cubeAverage_eq_integralAverage_open S (fun x => V.toField x i)) + change ENNReal.toReal (eLpNorm + (fun x => w.toFun x - integralAverage (openOverlapCubeSet S) w.toFun) + q.exponent (volumeMeasureOn (openOverlapCubeSet S))) ≤ + (C * overlapCubeScaleFactor S) * + ∑ k : Fin d, ENNReal.toReal (eLpNorm (fun x => w.grad x k) + q.exponent (volumeMeasureOn (openOverlapCubeSet S))) at hraw + rw [scalarOverlap_normalizedCubeMeasure_eq_open] + rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top q.lt_top.ne] + simp_rw [MeasureTheory.eLpNorm_smul_measure_of_ne_top q.lt_top.ne] + let A : ℝ := + (ENNReal.ofReal (overlapCubeVolume S)⁻¹ ^ (1 / q.exponent).toReal).toReal + have hA : 0 ≤ A := ENNReal.toReal_nonneg + have hmul := mul_le_mul_of_nonneg_left hraw hA + simpa [A, w, havg, ENNReal.toReal_mul, Finset.mul_sum, mul_assoc, + mul_left_comm, mul_comm] using! hmul + +private theorem memLp_overlap_vector_residual {d : ℕ} {Q S : TriadicCube d} + {j : ℕ} (q : FiniteLpExponent) (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (V : CubeVectorW1pFunction Q q) : + MemLp (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + have hV := V.euclideanMemLp + rw [MeasureTheory.memLp_piLp_iff] at hV + have hcoord := ScalarOverlap.memLp_sub_cubeAverage_of_mem_centersAtDepth_of_memLp + hS (hV i) + simpa only [Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply, + V.toField_apply, Pi.sub_apply, ScalarOverlap.cubeAverageVec] using hcoord + +private theorem memLp_overlap_jacobian {d : ℕ} {Q S : TriadicCube d} + {j : ℕ} (q : FiniteLpExponent) (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (V : CubeVectorW1pFunction Q q) : + MemLp (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + rw [MeasureTheory.memLp_piLp_iff] + intro k + have hV := V.jacobianHilbertMemLp + rw [MeasureTheory.memLp_piLp_iff] at hV + have hrow := hV i + rw [MeasureTheory.memLp_piLp_iff] at hrow + have hentry := ScalarOverlap.memLp_of_mem_centersAtDepth_of_memLp hS (hrow k) + simpa only [Function.comp_apply, HilbertMat.ofMat, HilbertVec.ofVec, + PiLp.toLp_apply, V.jacobian_apply] using hentry + +private theorem eLpNorm_overlap_jacobian_entry_le {d : ℕ} {Q S : TriadicCube d} + {j : ℕ} (q : FiniteLpExponent) (_hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (V : CubeVectorW1pFunction Q q) (i k : Fin d) : + eLpNorm (fun x => V.jacobian x i k) q.exponent + (ScalarOverlap.normalizedCubeMeasure S) ≤ + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + apply eLpNorm_mono_ae + filter_upwards [] with x + calc + ‖V.jacobian x i k‖ ≤ + ‖(HilbertMat.ofMat (V.jacobian x) : HilbertMat d).ofLp i‖ := by + simpa only [HilbertMat.ofMat, HilbertVec.ofVec, PiLp.toLp_apply] using + PiLp.norm_apply_le + ((HilbertMat.ofMat (V.jacobian x) : HilbertMat d).ofLp i) k + _ ≤ ‖HilbertMat.ofMat (V.jacobian x)‖ := + PiLp.norm_apply_le (HilbertMat.ofMat (V.jacobian x) : HilbertMat d) i + +/-- The normalized finite-`p` Poincare estimate for vector fields on one +retained overlap cube. -/ +theorem exists_overlapCubeVector_normalized_poincare_constant {d : ℕ} [NeZero d] + (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C ≠ ∞ ∧ + ∀ (Q : TriadicCube d) (j : ℕ) (S : TriadicCube d), + S ∈ ScalarOverlap.centersAtDepth Q j → + ∀ V : CubeVectorW1pFunction Q q, + eLpNorm + (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S) ≤ + C * ENNReal.ofReal (overlapCubeScaleFactor S) * + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + obtain ⟨C, hC_nonneg, hC⟩ := + exists_overlapCube_subAverage_poincare_constant_finite (d := d) q + let K : ℝ := (d : ℝ) * (d : ℝ) * (d : ℝ) * C + refine ⟨ENNReal.ofReal K, ENNReal.ofReal_ne_top, ?_⟩ + intro Q j S hS V + let μ : Measure (Vec d) := ScalarOverlap.normalizedCubeMeasure S + let R : Vec d → Vec d := + fun x => V.toField x - ScalarOverlap.cubeAverageVec S V.toField + have hRmem : MemLp (fun x => HilbertVec.ofVec (R x)) q.exponent μ := by + simpa [μ, R] using memLp_overlap_vector_residual q hS V + have hRcoord_mem : ∀ i : Fin d, MemLp (fun x => R x i) q.exponent μ := by + intro i + have hpi := hRmem + rw [MeasureTheory.memLp_piLp_iff] at hpi + simpa only [Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply] using hpi i + have hRcoord_meas : ∀ i : Fin d, AEStronglyMeasurable (fun x => R x i) μ := + fun i => (hRcoord_mem i).aestronglyMeasurable + have hMmem : MemLp (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent μ := by + simpa [μ] using memLp_overlap_jacobian q hS V + have hsumR_top : (∑ i : Fin d, eLpNorm (fun x => R x i) q.exponent μ) ≠ ∞ := + ENNReal.sum_ne_top.2 fun i _ => (hRcoord_mem i).eLpNorm_ne_top + have hrightR_top : + ‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => R x i) q.exponent μ ≠ ∞ := + ENNReal.mul_ne_top enorm_ne_top hsumR_top + have hvecENN : + eLpNorm (fun x => HilbertVec.ofVec (R x)) q.exponent μ ≤ + ‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => R x i) q.exponent μ := + euclidean_eLpNorm_le_dimension_mul_sum_coordinates μ q R hRcoord_meas + have hvec : ENNReal.toReal + (eLpNorm (fun x => HilbertVec.ofVec (R x)) q.exponent μ) ≤ + ENNReal.toReal + (‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => R x i) q.exponent μ) := + ENNReal.toReal_mono hrightR_top hvecENN + have hscalar : ∀ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => R x i) q.exponent μ) ≤ + (C * overlapCubeScaleFactor S) * + ∑ k : Fin d, ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) + q.exponent μ) := by + intro i + simpa [μ, R] using scalar_overlap_coordinate_normalized_bound q C hC Q j S hS V i + have hentry : ∀ i k : Fin d, + ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) q.exponent μ) ≤ + ENNReal.toReal (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent μ) := by + intro i k + exact ENNReal.toReal_mono hMmem.eLpNorm_ne_top + (eLpNorm_overlap_jacobian_entry_le q hS V i k) + have hK_nonneg : 0 ≤ K := by + dsimp [K] + positivity + have hright_top : + ENNReal.ofReal K * ENNReal.ofReal (overlapCubeScaleFactor S) * + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent μ ≠ ∞ := by + exact ENNReal.mul_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top) + hMmem.eLpNorm_ne_top + refine (ENNReal.toReal_le_toReal hRmem.eLpNorm_ne_top hright_top).mp ?_ + have hvec' : ENNReal.toReal + (eLpNorm (fun x => HilbertVec.ofVec (R x)) q.exponent μ) ≤ + (d : ℝ) * ∑ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => R x i) q.exponent μ) := by + calc + ENNReal.toReal (eLpNorm (fun x => HilbertVec.ofVec (R x)) q.exponent μ) ≤ + ENNReal.toReal + (‖(d : ℝ)‖ₑ * ∑ i : Fin d, eLpNorm (fun x => R x i) q.exponent μ) := hvec + _ = (d : ℝ) * ∑ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => R x i) q.exponent μ) := by + rw [ENNReal.toReal_mul, + ENNReal.toReal_sum (fun i _ => (hRcoord_mem i).eLpNorm_ne_top)] + simp + have hsum_scalar : + ∑ i : Fin d, ENNReal.toReal (eLpNorm (fun x => R x i) q.exponent μ) ≤ + ∑ i : Fin d, (C * overlapCubeScaleFactor S) * + ∑ k : Fin d, ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) + q.exponent μ) := by + exact Finset.sum_le_sum fun i _ => hscalar i + have hsum_entry : + ∑ i : Fin d, ∑ k : Fin d, + ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) q.exponent μ) ≤ + ∑ _i : Fin d, ∑ _k : Fin d, + ENNReal.toReal (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent μ) := by + exact Finset.sum_le_sum fun i _ => Finset.sum_le_sum fun k _ => hentry i k + calc + ENNReal.toReal (eLpNorm (fun x => HilbertVec.ofVec (R x)) q.exponent μ) ≤ + (d : ℝ) * ∑ i : Fin d, + ENNReal.toReal (eLpNorm (fun x => R x i) q.exponent μ) := hvec' + _ ≤ (d : ℝ) * ∑ i : Fin d, (C * overlapCubeScaleFactor S) * + ∑ k : Fin d, ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) + q.exponent μ) := by + exact mul_le_mul_of_nonneg_left hsum_scalar (Nat.cast_nonneg d) + _ = (d : ℝ) * (C * overlapCubeScaleFactor S) * + ∑ i : Fin d, ∑ k : Fin d, + ENNReal.toReal (eLpNorm (fun x => V.jacobian x i k) q.exponent μ) := by + rw [← Finset.mul_sum] + ring + _ ≤ (d : ℝ) * (C * overlapCubeScaleFactor S) * + ∑ _i : Fin d, ∑ _k : Fin d, + ENNReal.toReal (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent μ) := by + exact mul_le_mul_of_nonneg_left hsum_entry + (mul_nonneg (Nat.cast_nonneg d) + (mul_nonneg hC_nonneg (overlapCubeScaleFactor_nonneg S))) + _ = K * overlapCubeScaleFactor S * + ENNReal.toReal (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent μ) := by + simp [K] + ring + _ = ENNReal.toReal (ENNReal.ofReal K * ENNReal.ofReal (overlapCubeScaleFactor S) * + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent μ) := by + rw [ENNReal.toReal_mul, ENNReal.toReal_mul] + simp [hK_nonneg, overlapCubeScaleFactor_nonneg] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Seminorms.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Seminorms.lean new file mode 100644 index 0000000000..19a1e10e83 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Seminorms.lean @@ -0,0 +1,284 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing + +/-! # Seminorms -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-! +# Mean-zero `W^{1,p}` Poincare scaffolding + +This file is the public landing zone for the finite-`p` extension of the +bounded-open-convex mean-zero Poincare theorem. + +The completed `p = 2` endpoint in `PoincareMeanZero.lean` is bundled as an +`H1CoerciveEstimate`, because it feeds the Hilbert/Hodge layer. The finite-`p` +surface here stays in terms of `eLpNorm` seminorms attached to the witness-based +`W1pFunction` API. +-/ + +/-- For a finite positive real exponent, the real value of the `eLpNorm` is the +usual integral power expression. -/ +theorem toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] {μ : MeasureTheory.Measure α} + {f : α → E} {p : ℝ} (hp : 0 < p) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) μ) : + ENNReal.toReal (MeasureTheory.eLpNorm f (ENNReal.ofReal p) μ) = + (∫ x, ‖f x‖ ^ p ∂μ) ^ (1 / p : ℝ) := by + have hp0 : ENNReal.ofReal p ≠ 0 := by + intro hzero + exact (not_le_of_gt hp) (ENNReal.ofReal_eq_zero.mp hzero) + have hp_real : (ENNReal.ofReal p).toReal = p := + ENNReal.toReal_ofReal hp.le + have h := + hf.eLpNorm_eq_integral_rpow_norm hp0 ENNReal.ofReal_ne_top + rw [h] + have hnonneg : + 0 ≤ + (∫ x, ‖f x‖ ^ (ENNReal.ofReal p).toReal ∂μ) ^ + ((ENNReal.ofReal p).toReal)⁻¹ := by + positivity + rw [ENNReal.toReal_ofReal hnonneg, hp_real] + simp [one_div] + +/-- Powered form of `toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv`. -/ +theorem toReal_eLpNorm_ofReal_rpow_eq_integral_rpow_norm + {α E : Type*} [MeasurableSpace α] [NormedAddCommGroup E] {μ : MeasureTheory.Measure α} + {f : α → E} {p : ℝ} (hp : 0 < p) + (hf : MeasureTheory.MemLp f (ENNReal.ofReal p) μ) : + (ENNReal.toReal (MeasureTheory.eLpNorm f (ENNReal.ofReal p) μ)) ^ p = + ∫ x, ‖f x‖ ^ p ∂μ := by + rw [toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv hp hf] + have hint_nonneg : 0 ≤ ∫ x, ‖f x‖ ^ p ∂μ := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + rw [← Real.rpow_mul hint_nonneg] + have hp_ne : p ≠ 0 := ne_of_gt hp + rw [show (1 / p : ℝ) * p = 1 by field_simp [hp_ne]] + simp + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +private theorem norm_fderiv_le_sum_basisVec_apply + (L : Vec d →L[ℝ] ℝ) : + ‖L‖ ≤ ∑ i : Fin d, ‖L (basisVec i)‖ := by + refine L.opNorm_le_bound (Finset.sum_nonneg fun i _ => norm_nonneg _) ?_ + intro x + have hx : + L x = ∑ i : Fin d, x i * L (basisVec i) := by + calc + L x = ∑ i : Fin d, x i • L (fun j => if i = j then 1 else 0) := by + simpa using (LinearMap.pi_apply_eq_sum_univ (f := L.toLinearMap) x) + _ = ∑ i : Fin d, x i • L (basisVec i) := by + refine Finset.sum_congr rfl ?_ + intro i hi + have hfun : (fun j => if i = j then 1 else 0) = basisVec i := by + funext j + simp [basisVec_apply, eq_comm] + rw [hfun] + _ = ∑ i : Fin d, x i * L (basisVec i) := by + simp [smul_eq_mul] + calc + ‖L x‖ = ‖∑ i : Fin d, x i * L (basisVec i)‖ := by rw [hx] + _ ≤ ∑ i : Fin d, ‖x i * L (basisVec i)‖ := norm_sum_le _ _ + _ = ∑ i : Fin d, ‖x i‖ * ‖L (basisVec i)‖ := by + simp [norm_mul] + _ ≤ ∑ i : Fin d, ‖x‖ * ‖L (basisVec i)‖ := by + exact Finset.sum_le_sum fun i _ => + mul_le_mul_of_nonneg_right (norm_le_pi_norm x i) (norm_nonneg _) + _ = (∑ i : Fin d, ‖L (basisVec i)‖) * ‖x‖ := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + (Finset.mul_sum (s := Finset.univ) + (f := fun i : Fin d => ‖L (basisVec i)‖) ‖x‖).symm + +theorem memLp_fderiv_of_contDiffOnIsOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf : ContDiff ℝ 1 f) : + MeasureTheory.MemLp (fderiv ℝ f) p (volumeMeasureOn U) := by + have hfderiv_cont : Continuous (fderiv ℝ f) := hf.continuous_fderiv (by simp) + have hclosure_compact : IsCompact (closure U) := + hU.isBoundedDomain.isBounded.isCompact_closure + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖fderiv ℝ f x‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) hfderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.isOpen.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + +/-- The scalar `L^p(U)` seminorm of a `W^{1,p}` witness, as a real number. -/ +noncomputable def valueLpSeminorm (u : W1pFunction U p) : ℝ := + ENNReal.toReal (MeasureTheory.eLpNorm u.toFun p (volumeMeasureOn U)) + +/-- The scalar `L^p(U)` seminorm after subtracting the integral average. -/ +noncomputable def subAverageLpSeminorm (u : W1pFunction U p) : ℝ := + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => u.toFun x - integralAverage U u.toFun) p + (volumeMeasureOn U)) + +/-- The `i`th coordinate `L^p(U)` seminorm of the weak gradient. -/ +noncomputable def gradCoordLpSeminorm (u : W1pFunction U p) (i : Fin d) : ℝ := + ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) p (volumeMeasureOn U)) + +/-- Coordinate-sum gradient seminorm used by the finite-`p` Poincare API. + +This avoids introducing a vector-valued `Lp` wrapper for every exponent at this +stage, while matching the data already stored in `W1pFunction.gradMemLp`. -/ +noncomputable def gradientCoordLpSeminormSum (u : W1pFunction U p) : ℝ := + ∑ i : Fin d, u.gradCoordLpSeminorm i + +theorem valueLpSeminorm_nonneg (u : W1pFunction U p) : + 0 ≤ u.valueLpSeminorm := + ENNReal.toReal_nonneg + +theorem subAverageLpSeminorm_nonneg (u : W1pFunction U p) : + 0 ≤ u.subAverageLpSeminorm := + ENNReal.toReal_nonneg + +theorem gradCoordLpSeminorm_nonneg (u : W1pFunction U p) (i : Fin d) : + 0 ≤ u.gradCoordLpSeminorm i := + ENNReal.toReal_nonneg + +theorem gradientCoordLpSeminormSum_nonneg (u : W1pFunction U p) : + 0 ≤ u.gradientCoordLpSeminormSum := by + exact Finset.sum_nonneg fun i _ => u.gradCoordLpSeminorm_nonneg i + +private theorem eLpNorm_basisVec_apply_eq_gradCoordLpSeminorm + (hU : IsOpenBoundedConvexDomain U) {f : Vec d → ℝ} + (hf1 : ContDiff ℝ 1 f) (i : Fin d) : + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) p + (volumeMeasureOn U)) = + (W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain + (U := U) (p := p) hU hf1).gradCoordLpSeminorm i := by + let u : W1pFunction U p := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let dg : Vec d → ℝ := fun x => (fderiv ℝ f x) (basisVec i) + calc + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => ‖(fderiv ℝ f x) (basisVec i)‖) p + (volumeMeasureOn U)) + = ENNReal.toReal (MeasureTheory.eLpNorm dg p (volumeMeasureOn U)) := by + rw [MeasureTheory.eLpNorm_norm _ + ((hf1.continuous_fderiv (by simp)).clm_apply continuous_const).aestronglyMeasurable] + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => u.grad x i) p + (volumeMeasureOn U)) := by + simp [u, dg, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + _ = u.gradCoordLpSeminorm i := rfl + +theorem fderivLpNorm_le_gradientCoordLpSeminormSum_ofContDiffOnIsOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) {f : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) : + let u : W1pFunction U p := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) p (volumeMeasureOn U)) ≤ + u.gradientCoordLpSeminormSum := by + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let : MeasureTheory.IsFiniteMeasure μ := by + dsimp [μ, volumeMeasureOn] + exact hU.isFiniteMeasure_restrict_volume + let u : W1pFunction U p := W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let dg : Fin d → Vec d → ℝ := fun i x => (fderiv ℝ f x) (basisVec i) + let D : Vec d → ℝ := fun x => ∑ i : Fin d, ‖dg i x‖ + have hfderiv_cont : Continuous (fderiv ℝ f) := hf1.continuous_fderiv (by simp) + have hclosure_compact : IsCompact (closure U) := + hU.isBoundedDomain.isBounded.isCompact_closure + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖fderiv ℝ f x‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hfderiv_cont.continuousOn) + have hfderiv_mem : + MeasureTheory.MemLp (fderiv ℝ f) p μ := by + refine MeasureTheory.MemLp.of_bound (μ := μ) hfderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.isOpen.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + let dLp : MeasureTheory.Lp (Vec d →L[ℝ] ℝ) p μ := + hfderiv_mem.toLp (fderiv ℝ f) + have hdi_mem : + ∀ i : Fin d, MeasureTheory.MemLp (fun x => ‖dg i x‖) p μ := by + intro i + simpa [u, dg, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using (u.grad_memLp i).norm + have hD_mem : MeasureTheory.MemLp D p μ := by + have hsum := + MeasureTheory.memLp_finsetSum (μ := μ) (p := p) + (s := Finset.univ) (f := fun i : Fin d => fun x : Vec d => ‖dg i x‖) + (fun i hi => hdi_mem i) + simpa [D] using hsum + let dCoordLp : MeasureTheory.Lp ℝ p μ := hD_mem.toLp D + have hderiv_le_sum : + ‖dLp‖ ≤ ‖dCoordLp‖ := by + refine MeasureTheory.Lp.norm_le_norm_of_ae_le ?_ + filter_upwards [MeasureTheory.MemLp.coeFn_toLp hfderiv_mem, + MeasureTheory.MemLp.coeFn_toLp hD_mem] with x hxD hxCoord + rw [hxD, hxCoord] + have hnonneg : 0 ≤ D x := Finset.sum_nonneg fun i _ => norm_nonneg _ + calc + ‖fderiv ℝ f x‖ ≤ D x := norm_fderiv_le_sum_basisVec_apply (fderiv ℝ f x) + _ = ‖D x‖ := by simp [abs_of_nonneg hnonneg] + have hsum_le : + ‖dCoordLp‖ ≤ ∑ i : Fin d, u.gradCoordLpSeminorm i := by + let di : Fin d → Vec d → ℝ := fun i x => ‖dg i x‖ + have hsum_eLp : + MeasureTheory.eLpNorm D p μ ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm (di i) p μ := by + have hD : D = ∑ i : Fin d, di i := by + funext x + simp [D, di] + rw [hD] + simpa using + (MeasureTheory.eLpNorm_sum_le + (μ := μ) + (s := Finset.univ) + (f := di) + + hp1) + calc + ‖dCoordLp‖ = ENNReal.toReal (MeasureTheory.eLpNorm D p μ) := by + simp [dCoordLp] + _ ≤ ENNReal.toReal (∑ i : Fin d, MeasureTheory.eLpNorm (di i) p μ) := by + refine ENNReal.toReal_mono ?_ hsum_eLp + exact ENNReal.sum_ne_top.2 fun i _ => (hdi_mem i).eLpNorm_lt_top.ne + _ = ∑ i : Fin d, u.gradCoordLpSeminorm i := by + rw [ENNReal.toReal_sum (fun i hi => (hdi_mem i).eLpNorm_lt_top.ne)] + refine Finset.sum_congr rfl ?_ + intro i hi + simpa [di, hf1, μ] using + eLpNorm_basisVec_apply_eq_gradCoordLpSeminorm + (U := U) (p := p) hU hf1 i + have hfderiv_eq : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) p μ) = ‖dLp‖ := by + simp [dLp] + change ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) p μ) ≤ + u.gradientCoordLpSeminormSum + calc + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) p μ) + = ‖dLp‖ := hfderiv_eq + _ ≤ ‖dCoordLp‖ := hderiv_le_sum + _ ≤ u.gradientCoordLpSeminormSum := hsum_le + + +end W1pFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/SmoothCase.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/SmoothCase.lean new file mode 100644 index 0000000000..25b52d7b75 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/SmoothCase.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms + +/-! # Smooth Case -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} +/-- The volume and bounding-radius factor in the smooth Poincaré estimate. -/ +noncomputable def smoothPoincareLpBase + (hU : IsOpenBoundedConvexDomain U) : ℝ := + ((MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ))) * + ((d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain)) + +noncomputable def smoothPoincareLpConst + (hU : IsOpenBoundedConvexDomain U) : ℝ := + 1 + |smoothPoincareLpBase (d := d) (U := U) hU| + +theorem smoothPoincareLpConst_nonneg + (hU : IsOpenBoundedConvexDomain U) : + 0 ≤ smoothPoincareLpConst (d := d) (U := U) hU := by + dsimp [smoothPoincareLpConst] + positivity + +private theorem smoothPoincareLpBase_le_const + (hU : IsOpenBoundedConvexDomain U) : + smoothPoincareLpBase (d := d) (U := U) hU ≤ + smoothPoincareLpConst (d := d) (U := U) hU := by + dsimp [smoothPoincareLpConst] + linarith [le_abs_self (smoothPoincareLpBase (d := d) (U := U) hU)] + +theorem subAverageLpSeminorm_le_smoothPoincareLpConst_mul_gradientCoordLpSeminormSum_ofContDiff + [NeZero d] [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsOpenBoundedConvexDomain U) {q : ℝ} (hq : 1 < q) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + let u : W1pFunction U (ENNReal.ofReal q) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + u.subAverageLpSeminorm ≤ + smoothPoincareLpConst (d := d) (U := U) hU * u.gradientCoordLpSeminormSum := by + let pE : ENNReal := ENNReal.ofReal q + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + let u : W1pFunction U pE := W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU hf1 + let B : ℝ := + (MeasureTheory.volume U).toReal⁻¹ * + (((2 * Classical.choose hU.isBoundedDomain) ^ d) / (d : ℝ)) + let M : ℝ := + (d : ℝ) * (MeasureTheory.volume (Metric.ball (0 : Vec d) 1)).toReal * + (4 * Classical.choose hU.isBoundedDomain) + let K : ℝ := smoothPoincareLpBase (d := d) (U := U) hU + let C : ℝ := smoothPoincareLpConst (d := d) (U := U) hU + have hq_pos : 0 < q := lt_trans zero_lt_one hq + have hq_nonneg : 0 ≤ q := le_of_lt hq_pos + have hpE_one : 1 ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hchoose_pos : 0 < Classical.choose hU.isBoundedDomain := + (Classical.choose_spec hU.isBoundedDomain).1 + have hd_pos : 0 < (d : ℝ) := by + exact_mod_cast (NeZero.pos d) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hK_eq : K = B * M := by + rfl + have hK_nonneg : 0 ≤ K := by + rw [hK_eq] + exact mul_nonneg hB_nonneg hM_nonneg + have huInt : MeasureTheory.IntegrableOn f U := by + have hu_int : MeasureTheory.Integrable u.toFun μ := + u.memLp.integrable hpE_one + simpa [u, pE, hf1, μ, volumeMeasureOn, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain, + MeasureTheory.IntegrableOn] using hu_int + have hf_mem : MeasureTheory.MemLp f pE μ := by + simpa [u, pE, hf1, μ, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using u.memLp + have hsub_mem : + MeasureTheory.MemLp (fun x => f x - integralAverage U f) pE μ := by + have hconst : MeasureTheory.MemLp (fun _ : Vec d => integralAverage U f) pE μ := + MeasureTheory.memLp_const (integralAverage U f) + simpa [Pi.sub_apply] using! hf_mem.sub hconst + have hfderiv_mem : MeasureTheory.MemLp (fderiv ℝ f) pE μ := by + simpa [pE, μ] using + (memLp_fderiv_of_contDiffOnIsOpenBoundedConvexDomain + (U := U) (p := pE) hU hf1) + have hleft_norm : + u.subAverageLpSeminorm = + (∫ x in U, ‖f x - integralAverage U f‖ ^ q ∂MeasureTheory.volume) ^ + (1 / q : ℝ) := by + calc + u.subAverageLpSeminorm = + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => f x - integralAverage U f) pE μ) := by + simp [W1pFunction.subAverageLpSeminorm, u, pE, μ, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + _ = (∫ x in U, ‖f x - integralAverage U f‖ ^ q ∂MeasureTheory.volume) ^ + (1 / q : ℝ) := by + simpa [pE, μ, volumeMeasureOn] using + (toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv + (μ := μ) (f := fun x => f x - integralAverage U f) + hq_pos hsub_mem) + have hderiv_norm : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) pE μ) = + (∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume) ^ (1 / q : ℝ) := by + simpa [pE, μ, volumeMeasureOn] using + (toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv + (μ := μ) (f := fderiv ℝ f) hq_pos hfderiv_mem) + have hpoinc : + ∫ x in U, ‖f x - integralAverage U f‖ ^ q ∂MeasureTheory.volume ≤ + B ^ q * (M ^ q * + ∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume) := by + simpa [B, M] using + (integral_rpow_norm_sub_integralAverage_le_bound_of_isOpenBoundedConvexDomain + (d := d) (U := U) hU huInt hf (p := q) hq hvol) + have hleft_int_nonneg : + 0 ≤ ∫ x in U, ‖f x - integralAverage U f‖ ^ q ∂MeasureTheory.volume := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + have hderiv_int_nonneg : + 0 ≤ ∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume := by + exact MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun y => Real.rpow_nonneg (norm_nonneg _) _) + have hroot : + u.subAverageLpSeminorm ≤ + K * ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) pE μ) := by + rw [hleft_norm, hderiv_norm] + calc + (∫ x in U, ‖f x - integralAverage U f‖ ^ q ∂MeasureTheory.volume) ^ + (1 / q : ℝ) + ≤ (B ^ q * (M ^ q * + ∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume)) ^ + (1 / q : ℝ) := by + exact Real.rpow_le_rpow hleft_int_nonneg hpoinc (by positivity) + _ = K * + (∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume) ^ + (1 / q : ℝ) := by + have hBM_nonneg : 0 ≤ B * M := mul_nonneg hB_nonneg hM_nonneg + have hpow_arg : + B ^ q * (M ^ q * + ∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume) = + (B * M) ^ q * + ∫ y in U, ‖fderiv ℝ f y‖ ^ q ∂MeasureTheory.volume := by + rw [Real.mul_rpow hB_nonneg hM_nonneg] + ring + rw [hpow_arg] + rw [Real.mul_rpow (Real.rpow_nonneg hBM_nonneg _) hderiv_int_nonneg] + rw [← Real.rpow_mul hBM_nonneg] + have hq_ne : q ≠ 0 := ne_of_gt hq_pos + rw [show q * (1 / q : ℝ) = 1 by field_simp [hq_ne]] + simp [hK_eq] + have hderiv_le_grad : + ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) pE μ) ≤ + u.gradientCoordLpSeminormSum := by + simpa [u, pE, hf1, μ] using + (fderivLpNorm_le_gradientCoordLpSeminormSum_ofContDiffOnIsOpenBoundedConvexDomain + (U := U) (p := pE) hU hpE_one hf) + have hK_le_C : K ≤ C := by + simpa [K, C] using smoothPoincareLpBase_le_const (d := d) (U := U) hU + have hC_nonneg : 0 ≤ C := by + simpa [C] using smoothPoincareLpConst_nonneg (d := d) (U := U) hU + change u.subAverageLpSeminorm ≤ C * u.gradientCoordLpSeminormSum + calc + u.subAverageLpSeminorm + ≤ K * ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) pE μ) := hroot + _ ≤ C * ENNReal.toReal (MeasureTheory.eLpNorm (fderiv ℝ f) pE μ) := by + exact mul_le_mul_of_nonneg_right hK_le_C ENNReal.toReal_nonneg + _ ≤ C * u.gradientCoordLpSeminormSum := by + exact mul_le_mul_of_nonneg_left hderiv_le_grad hC_nonneg + + +end W1pFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Translation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Translation.lean new file mode 100644 index 0000000000..d70e5fcd04 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareW1p/Translation.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Translation + +/-! # Translation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Translation preserves the scalar `L^p` seminorm of a `W^{1,p}` witness. -/ +theorem valueLpSeminorm_translate_eq (u : W1pFunction U p) (z : Vec d) : + (u.translate z).valueLpSeminorm = u.valueLpSeminorm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + have hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + unfold valueLpSeminorm + exact congrArg ENNReal.toReal (by + simpa [V, T, Function.comp, volumeMeasureOn] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := u.toFun) (p := p) u.memLp.aestronglyMeasurable hμ)) + +/-- Translation commutes with the integral average. -/ +theorem integralAverage_translate_eq (u : W1pFunction U p) (z : Vec d) : + integralAverage (translateSet z U) (u.translate z).toFun = integralAverage U u.toFun := by + change + (MeasureTheory.volume (translateSet z U)).toReal⁻¹ * + ∫ x in translateSet z U, u.toFun (x - z) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, u.toFun x ∂MeasureTheory.volume + rw [volume_translateSet_eq, setIntegral_comp_subRight_translateSet] + +/-- Translation preserves the scalar `L^p` seminorm after subtracting the average. -/ +theorem subAverageLpSeminorm_translate_eq (u : W1pFunction U p) (z : Vec d) : + (u.translate z).subAverageLpSeminorm = u.subAverageLpSeminorm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + have hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + unfold subAverageLpSeminorm + rw [u.integralAverage_translate_eq z] + exact congrArg ENNReal.toReal (by + simpa [V, T, Function.comp, volumeMeasureOn] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.toFun x - integralAverage U u.toFun) (p := p) + (u.memLp.aestronglyMeasurable.sub continuous_const.aestronglyMeasurable) hμ)) + +/-- Translation preserves every coordinate gradient `L^p` seminorm. -/ +theorem gradCoordLpSeminorm_translate_eq (u : W1pFunction U p) (z : Vec d) (i : Fin d) : + (u.translate z).gradCoordLpSeminorm i = u.gradCoordLpSeminorm i := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + have hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + unfold gradCoordLpSeminorm + exact congrArg ENNReal.toReal (by + simpa [V, T, Function.comp, volumeMeasureOn] using! + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.grad x i) (p := p) (u.gradMemLp i).aestronglyMeasurable hμ)) + +/-- Translation preserves the coordinate-sum gradient `L^p` seminorm. -/ +theorem gradientCoordLpSeminormSum_translate_eq (u : W1pFunction U p) (z : Vec d) : + (u.translate z).gradientCoordLpSeminormSum = u.gradientCoordLpSeminormSum := by + unfold gradientCoordLpSeminormSum + exact Finset.sum_congr rfl fun i _ => u.gradCoordLpSeminorm_translate_eq z i + +private noncomputable def castDomain {V : Set (Vec d)} + (hUV : U = V) (u : W1pFunction U p) : W1pFunction V p := + hUV ▸ u + +@[simp] private theorem castDomain_toFun {V : Set (Vec d)} + (hUV : U = V) (u : W1pFunction U p) : + (castDomain hUV u).toFun = u.toFun := by + subst V + rfl + +@[simp] private theorem castDomain_grad {V : Set (Vec d)} + (hUV : U = V) (u : W1pFunction U p) : + (castDomain hUV u).grad = u.grad := by + subst V + rfl + +private noncomputable def untranslateForPoincare (z : Vec d) + (u : W1pFunction (translateSet z U) p) : W1pFunction U p := by + have hset : translateSet (-z) (translateSet z U) = U := by + rw [translateSet_translateSet] + simp + exact castDomain hset (u.translate (-z)) + +@[simp] private theorem untranslateForPoincare_toFun (z : Vec d) + (u : W1pFunction (translateSet z U) p) (x : Vec d) : + (untranslateForPoincare z u).toFun x = u.toFun (x + z) := by + simp [untranslateForPoincare, W1pFunction.translate, sub_eq_add_neg] + +@[simp] private theorem untranslateForPoincare_grad (z : Vec d) + (u : W1pFunction (translateSet z U) p) (x : Vec d) : + (untranslateForPoincare z u).grad x = u.grad (x + z) := by + simp [untranslateForPoincare, W1pFunction.translate, sub_eq_add_neg] + +private theorem valueLpSeminorm_untranslateForPoincare_eq (z : Vec d) + (u : W1pFunction (translateSet z U) p) : + (untranslateForPoincare z u).valueLpSeminorm = u.valueLpSeminorm := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + unfold valueLpSeminorm + have hfun : (untranslateForPoincare z u).toFun = u.toFun ∘ T := by + funext x + simp [T, Function.comp] + rw [hfun] + exact congrArg ENNReal.toReal (by + simpa [V, T, Function.comp, volumeMeasureOn] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := u.toFun) (p := p) u.memLp.aestronglyMeasurable hμ)) + +private theorem gradientCoordLpSeminormSum_untranslateForPoincare_eq (z : Vec d) + (u : W1pFunction (translateSet z U) p) : + (untranslateForPoincare z u).gradientCoordLpSeminormSum = u.gradientCoordLpSeminormSum := by + unfold gradientCoordLpSeminormSum gradCoordLpSeminorm + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + apply Finset.sum_congr rfl + intro i _ + apply congrArg ENNReal.toReal + have hfun : (fun x => (untranslateForPoincare z u).grad x i) = + (fun x => u.grad x i) ∘ T := by + funext x + simp [T, Function.comp] + rw [hfun] + simpa [V, T, Function.comp, volumeMeasureOn] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.grad x i) (p := p) (u.gradMemLp i).aestronglyMeasurable hμ) + +end W1pFunction + +namespace W1pMeanZeroFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Translate a mean-zero `W^{1,p}(U)` witness to `W^{1,p}(U + z)`. -/ +noncomputable def translate (u : W1pMeanZeroFunction U p) (z : Vec d) : + W1pMeanZeroFunction (translateSet z U) p where + toW1pFunction := u.toW1pFunction.translate z + meanZero := by + change ∫ x in translateSet z U, u.toW1pFunction.toFun (x - z) ∂MeasureTheory.volume = 0 + rw [setIntegral_comp_subRight_translateSet] + exact u.meanZero + +@[simp] theorem translate_toW1pFunction (u : W1pMeanZeroFunction U p) (z : Vec d) : + (u.translate z).toW1pFunction = u.toW1pFunction.translate z := + rfl + +private noncomputable def untranslateForPoincare (z : Vec d) + (u : W1pMeanZeroFunction (translateSet z U) p) : W1pMeanZeroFunction U p where + toW1pFunction := W1pFunction.untranslateForPoincare z u.toW1pFunction + meanZero := by + change ∫ x in U, W1pFunction.untranslateForPoincare z u.toW1pFunction x + ∂MeasureTheory.volume = 0 + simp only [W1pFunction.untranslateForPoincare_toFun] + rw [setIntegral_comp_addRight_translateSet] + exact u.meanZero + +end W1pMeanZeroFunction + +namespace W1pPoincareEstimate + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Translate a finite-`p` Poincare estimate from `U` to `U + z` unchanged. -/ +noncomputable def translate (hC : W1pPoincareEstimate U p) (z : Vec d) : + W1pPoincareEstimate (translateSet z U) p where + fixedValue := hC.fixedValue + constant_nonneg := hC.constant_nonneg + bound := by + intro u + let v : W1pMeanZeroFunction U p := W1pMeanZeroFunction.untranslateForPoincare z u + calc + u.valueLpSeminorm = v.valueLpSeminorm := by + simpa [v, W1pMeanZeroFunction.valueLpSeminorm] using! + (W1pFunction.valueLpSeminorm_untranslateForPoincare_eq (U := U) z + u.toW1pFunction).symm + _ ≤ hC.fixedValue * v.gradientCoordLpSeminormSum := hC.bound v + _ = hC.fixedValue * u.gradientCoordLpSeminormSum := by + rw [show v.gradientCoordLpSeminormSum = u.gradientCoordLpSeminormSum by + simpa [v, W1pMeanZeroFunction.gradientCoordLpSeminormSum] using! + W1pFunction.gradientCoordLpSeminormSum_untranslateForPoincare_eq (U := U) z + u.toW1pFunction] + +@[simp] theorem translate_constant (hC : W1pPoincareEstimate U p) (z : Vec d) : + (hC.translate z).fixedValue = hC.fixedValue := + rfl + +end W1pPoincareEstimate + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareZeroTrace.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareZeroTrace.lean new file mode 100644 index 0000000000..7a5ad01978 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/PoincareZeroTrace.lean @@ -0,0 +1,659 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH10 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain + +/-! # Poincare Zero Trace -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +/-- File-level typeclass cache: `Nontrivial (Vec d)` under `[NeZero d]`. +Short-circuits the `NeZero → Nonempty → Nontrivial` instance-search chain +file-wide and propagates to downstream importers via the serialized +instance database. Controlled A/B on this file: cumulative +`typeclass inference` drops ~2.2s, `simp` ~1.2s (~4.4s total). -/ +private instance instNontrivialVecPZT (d : ℕ) [NeZero d] : + Nontrivial (Vec d) := inferInstance + +/-- File-level typeclass cache for `NoncompactSpace (Vec d)` under +`[NeZero d]`; paired with the `Nontrivial` cache above. -/ +private instance instNoncompactSpaceVecPZT (d : ℕ) [NeZero d] : + NoncompactSpace (Vec d) := inferInstance + +/-! +# Zero-trace Poincare on bounded open convex domains + +This file is the public theorem wrapper for the bounded-open-convex +zero-trace Poincare development. + +We freeze the general finite-`p` theorem surface on `W^{1,p}_0` here so +downstream PDE files can target the correct statement while the Sobolev proof +is completed separately. The existing `L²` estimate from `CoerciveH10` is then +repackaged in the same style as the mean-zero wrapper file. +-/ + +private theorem fderiv_coord_apply_basisVec_self {d : ℕ} (i : Fin d) (x : Vec d) : + (fderiv ℝ (fun y : Vec d => y i) x) (basisVec i) = 1 := by + have h : + fderiv ℝ (fun y : Vec d => y i) x = + (ContinuousLinearMap.proj (R := ℝ) (φ := fun _ : Fin d => ℝ) i) := by + exact ContinuousLinearMap.fderiv (𝕜 := ℝ) + (ContinuousLinearMap.proj (R := ℝ) (φ := fun _ : Fin d => ℝ) i) + rw [h] + simp [basisVec] + +private theorem integral_eq_neg_integral_fderiv_mul_coord + {d : ℕ} {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (i : Fin d) : + ∫ x, f x ∂MeasureTheory.volume = + -∫ x, (fderiv ℝ f x) (basisVec i) * x i ∂MeasureTheory.volume := by + let coord : Vec d → ℝ := fun x => x i + let v : Vec d := basisVec i + have hf1 : ContDiff ℝ 1 f := hf.of_le (by simp) + have hf_diff : Differentiable ℝ f := hf1.differentiable (by simp) + have hcoord_diff : Differentiable ℝ coord := by + dsimp [coord] + fun_prop + have hf_cont : Continuous f := hf_diff.continuous + have hcoord_cont : Continuous coord := by + dsimp [coord] + fun_prop + have hfderiv_cont : Continuous (fun x => (fderiv ℝ f x) v) := by + simpa [v] using (hf1.continuous_fderiv (by simp)).clm_apply continuous_const + have hfderiv_supp : HasCompactSupport (fun x => (fderiv ℝ f x) v) := by + simpa [v] using hf_supp.fderiv_apply (𝕜 := ℝ) v + have h1 : + MeasureTheory.Integrable (fun x => (fderiv ℝ f x) v * coord x) + MeasureTheory.volume := by + exact (hfderiv_cont.mul hcoord_cont).integrable_of_hasCompactSupport + hfderiv_supp.mul_right + have h2 : + MeasureTheory.Integrable (fun x => f x * (fderiv ℝ coord x) v) + MeasureTheory.volume := by + have hf_int : MeasureTheory.Integrable f MeasureTheory.volume := + hf_cont.integrable_of_hasCompactSupport hf_supp + simpa [coord, v, fderiv_coord_apply_basisVec_self] using hf_int + have h3 : MeasureTheory.Integrable (fun x => f x * coord x) MeasureTheory.volume := by + exact (hf_cont.mul hcoord_cont).integrable_of_hasCompactSupport hf_supp.mul_right + have h := integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + (μ := MeasureTheory.volume) (f := f) (g := coord) (v := v) + h1 h2 h3 (fun x _ => hf_diff x) (fun x _ => hcoord_diff x) + simpa [coord, v, fderiv_coord_apply_basisVec_self] using h + +private theorem support_fderiv_apply_basisVec_subset_of_tsupport_subset + {d : ℕ} {U : Set (Vec d)} {f : Vec d → ℝ} (i : Fin d) + (hsub : tsupport f ⊆ U) : + Function.support (fun x => (fderiv ℝ f x) (basisVec i)) ⊆ U := by + intro x hx + exact hsub <| + (support_fderiv_subset (𝕜 := ℝ) (f := f)) <| by + change fderiv ℝ f x ≠ 0 + intro hzero + apply hx + simp [hzero] + +private theorem setIntegral_eq_neg_setIntegral_fderiv_mul_coord + {d : ℕ} {U : Set (Vec d)} {f : Vec d → ℝ} + (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hf_supp : HasCompactSupport f) + (hf_sub : tsupport f ⊆ U) (i : Fin d) : + ∫ x in U, f x ∂MeasureTheory.volume = + -∫ x in U, (fderiv ℝ f x) (basisVec i) * x i ∂MeasureTheory.volume := by + have hzero_f : ∀ x, x ∉ U → f x = 0 := by + intro x hxU + exact image_eq_zero_of_notMem_tsupport (fun hxt => hxU (hf_sub hxt)) + have hzero_d : ∀ x, x ∉ U → (fderiv ℝ f x) (basisVec i) * x i = 0 := by + intro x hxU + have hxnot : x ∉ Function.support (fun x => (fderiv ℝ f x) (basisVec i)) := + fun hx => hxU (support_fderiv_apply_basisVec_subset_of_tsupport_subset (U := U) i + hf_sub hx) + have hderiv : (fderiv ℝ f x) (basisVec i) = 0 := by + simpa [Function.notMem_support] using hxnot + simp [hderiv] + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero_f, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero_d, + integral_eq_neg_integral_fderiv_mul_coord hf hf_supp i] + +private theorem abs_setIntegral_le_bound_mul_integral_abs_fderiv_coord + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hf_supp : HasCompactSupport f) + (hf_sub : tsupport f ⊆ U) (i : Fin d) : + |∫ x in U, f x ∂MeasureTheory.volume| ≤ + Classical.choose hU.isBoundedDomain * + ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let dg : Vec d → ℝ := fun x => (fderiv ℝ f x) (basisVec i) + let R : ℝ := Classical.choose hU.isBoundedDomain + let : MeasureTheory.IsFiniteMeasure μ := by + simpa [μ, volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hR_nonneg : 0 ≤ R := le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + have hgrad_int : MeasureTheory.Integrable (fun x => |dg x|) μ := by + let w : W1pFunction U (1 : ENNReal) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + have hw : MeasureTheory.Integrable (fun x => w.grad x i) μ := by + exact (w.grad_memLp i).integrable (by norm_num : (1 : ENNReal) ≤ 1) + simpa [w, dg, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain, Real.norm_eq_abs] using hw.norm + have hprod_int : MeasureTheory.Integrable (fun x => |dg x * x i|) μ := by + refine (hgrad_int.const_mul R).mono' ?_ ?_ + · exact ((hf.continuous_fderiv (by simp)).clm_apply continuous_const).mul + (by fun_prop) |>.norm.aestronglyMeasurable + · filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hxU + have hcoord : |x i| ≤ R := (Classical.choose_spec hU.isBoundedDomain).2 x hxU i + calc + ‖|dg x * x i|‖ = |dg x * x i| := by simp + _ = |dg x| * |x i| := abs_mul _ _ + _ ≤ |dg x| * R := mul_le_mul_of_nonneg_left hcoord (abs_nonneg _) + _ = R * |dg x| := by ring + have hmono : + (fun x => |dg x * x i|) ≤ᵐ[μ] fun x => R * |dg x| := by + filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hxU + have hcoord : |x i| ≤ R := (Classical.choose_spec hU.isBoundedDomain).2 x hxU i + calc + |dg x * x i| = |dg x| * |x i| := abs_mul _ _ + _ ≤ |dg x| * R := mul_le_mul_of_nonneg_left hcoord (abs_nonneg _) + _ = R * |dg x| := by ring + calc + |∫ x in U, f x ∂MeasureTheory.volume| + = |-(∫ x in U, dg x * x i ∂MeasureTheory.volume)| := by + rw [setIntegral_eq_neg_setIntegral_fderiv_mul_coord hf hf_supp hf_sub i] + _ = |∫ x in U, dg x * x i ∂MeasureTheory.volume| := abs_neg _ + _ ≤ ∫ x in U, |dg x * x i| ∂MeasureTheory.volume := by + simpa [μ, volumeMeasureOn, dg] using + (MeasureTheory.abs_integral_le_integral_abs + (μ := μ) (f := fun x => dg x * x i)) + _ ≤ ∫ x in U, R * |dg x| ∂MeasureTheory.volume := by + simpa [μ, volumeMeasureOn, dg, R] using + (MeasureTheory.integral_mono_ae hprod_int (hgrad_int.const_mul R) hmono) + _ = R * ∫ x in U, |dg x| ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + +private theorem integral_abs_fderiv_coord_le_eLpNorm_mul_measure + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {q : ℝ} (hq : 1 < q) {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (i : Fin d) : + ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume ≤ + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => (fderiv ℝ f x) (basisVec i)) (ENNReal.ofReal q) + (volumeMeasureOn U)) * + ENNReal.toReal ((volumeMeasureOn U) Set.univ ^ (1 - 1 / q : ℝ)) := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let dg : Vec d → ℝ := fun x => (fderiv ℝ f x) (basisVec i) + let pE : ENNReal := ENNReal.ofReal q + let : MeasureTheory.IsFiniteMeasure μ := by + simpa [μ, volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hq_pos : 0 < q := lt_trans zero_lt_one hq + have hpE_one : (1 : ENNReal) ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hmem1 : MeasureTheory.MemLp dg 1 μ := by + let w : W1pFunction U (1 : ENNReal) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + simpa [w, dg, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using (w.grad_memLp i) + have hmemp : MeasureTheory.MemLp dg pE μ := by + let w : W1pFunction U pE := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + simpa [w, dg, pE, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using (w.grad_memLp i) + have hL1_eq : + ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume = + ENNReal.toReal (MeasureTheory.eLpNorm dg 1 μ) := by + have hnorm : + ENNReal.toReal (MeasureTheory.eLpNorm dg (ENNReal.ofReal (1 : ℝ)) μ) = + (∫ x, ‖dg x‖ ^ (1 : ℝ) ∂μ) ^ (1 / (1 : ℝ) : ℝ) := by + exact toReal_eLpNorm_ofReal_eq_integral_rpow_norm_rpow_inv + (μ := μ) (f := dg) (p := (1 : ℝ)) zero_lt_one (by simpa using hmem1) + have hpow : + (∫ x, ‖dg x‖ ^ (1 : ℝ) ∂μ) ^ (1 / (1 : ℝ) : ℝ) = + ∫ x, |dg x| ∂μ := by + simp [Real.norm_eq_abs] + calc + ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume + = ∫ x, |dg x| ∂μ := by rfl + _ = ENNReal.toReal (MeasureTheory.eLpNorm dg 1 μ) := by + rw [show (1 : ENNReal) = ENNReal.ofReal (1 : ℝ) by norm_num] + rw [hnorm, hpow] + have hle_en : + MeasureTheory.eLpNorm dg 1 μ ≤ + MeasureTheory.eLpNorm dg pE μ * μ Set.univ ^ (1 - 1 / q : ℝ) := by + simpa [μ, pE, ENNReal.toReal_ofReal hq_pos.le] using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ + (μ := μ) (f := dg) (p := (1 : ENNReal)) (q := pE) hpE_one + hmemp.aestronglyMeasurable) + have hexp_nonneg : 0 ≤ (1 - 1 / q : ℝ) := by + have hinv_le : 1 / q ≤ 1 := (div_le_one hq_pos).2 hq.le + linarith + have hmeasure_pow_ne_top : μ Set.univ ^ (1 - 1 / q : ℝ) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg hexp_nonneg ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + have hprod_ne_top : MeasureTheory.eLpNorm dg pE μ * + μ Set.univ ^ (1 - 1 / q : ℝ) ≠ ⊤ := + ENNReal.mul_ne_top hmemp.eLpNorm_lt_top.ne hmeasure_pow_ne_top + calc + ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume + = ENNReal.toReal (MeasureTheory.eLpNorm dg 1 μ) := hL1_eq + _ ≤ ENNReal.toReal (MeasureTheory.eLpNorm dg pE μ * + μ Set.univ ^ (1 - 1 / q : ℝ)) := + ENNReal.toReal_mono hprod_ne_top hle_en + _ = ENNReal.toReal (MeasureTheory.eLpNorm dg pE μ) * + ENNReal.toReal (μ Set.univ ^ (1 - 1 / q : ℝ)) := by + rw [ENNReal.toReal_mul] + +private theorem eLpNorm_const_toReal_ofReal + {d : ℕ} {U : Set (Vec d)} {q : ℝ} (hq : 1 < q) (c : ℝ) : + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + ENNReal.toReal (MeasureTheory.eLpNorm (fun _ : Vec d => c) (ENNReal.ofReal q) μ) = + |c| * ENNReal.toReal (μ Set.univ ^ (1 / q : ℝ)) := by + intro μ + let pE : ENNReal := ENNReal.ofReal q + have hq_pos : 0 < q := lt_trans zero_lt_one hq + have hp0 : pE ≠ 0 := by + dsimp [pE] + intro hzero + exact (not_le_of_gt hq_pos) (ENNReal.ofReal_eq_zero.mp hzero) + have hp_top : pE ≠ ⊤ := by + dsimp [pE] + exact ENNReal.ofReal_ne_top + have hconst := MeasureTheory.eLpNorm_const' + (μ := μ) (p := pE) (c := c) hp0 hp_top + calc + ENNReal.toReal (MeasureTheory.eLpNorm (fun _ : Vec d => c) (ENNReal.ofReal q) μ) + = ENNReal.toReal (‖c‖ₑ * μ Set.univ ^ (1 / q : ℝ)) := by + simpa [pE, ENNReal.toReal_ofReal hq_pos.le] using congrArg ENNReal.toReal hconst + _ = ENNReal.toReal ‖c‖ₑ * ENNReal.toReal (μ Set.univ ^ (1 / q : ℝ)) := by + rw [ENNReal.toReal_mul] + _ = |c| * ENNReal.toReal (μ Set.univ ^ (1 / q : ℝ)) := by + simp [Real.norm_eq_abs] + +private theorem const_average_lpSeminorm_le_bound_mul_gradCoord + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {q : ℝ} (hq : 1 < q) (_hvol : 0 < (MeasureTheory.volume U).toReal) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) (hf_supp : HasCompactSupport f) + (hf_sub : tsupport f ⊆ U) (i : Fin d) : + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) ≤ + (((MeasureTheory.volume U).toReal⁻¹ * Classical.choose hU.isBoundedDomain) * + ENNReal.toReal ((volumeMeasureOn U) Set.univ ^ (1 - 1 / q : ℝ)) * + ENNReal.toReal ((volumeMeasureOn U) Set.univ ^ (1 / q : ℝ))) * + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => (fderiv ℝ f x) (basisVec i)) (ENNReal.ofReal q) + (volumeMeasureOn U)) := by + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let gradNorm : ℝ := ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => (fderiv ℝ f x) (basisVec i)) (ENNReal.ofReal q) μ) + let μpow1 : ℝ := ENNReal.toReal (μ Set.univ ^ (1 - 1 / q : ℝ)) + let μpow2 : ℝ := ENNReal.toReal (μ Set.univ ^ (1 / q : ℝ)) + let R : ℝ := Classical.choose hU.isBoundedDomain + have hR_nonneg : 0 ≤ R := le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + have hμinv_nonneg : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by positivity + have hμpow2_nonneg : 0 ≤ μpow2 := ENNReal.toReal_nonneg + have hset := abs_setIntegral_le_bound_mul_integral_abs_fderiv_coord + (U := U) hU hf hf_supp hf_sub i + have hl1 := integral_abs_fderiv_coord_le_eLpNorm_mul_measure + (U := U) hU hq hf i + have havg : |integralAverage U f| ≤ + (MeasureTheory.volume U).toReal⁻¹ * (R * (gradNorm * μpow1)) := by + unfold integralAverage + calc + |(MeasureTheory.volume U).toReal⁻¹ * ∫ x in U, f x ∂MeasureTheory.volume| + = (MeasureTheory.volume U).toReal⁻¹ * + |∫ x in U, f x ∂MeasureTheory.volume| := by + rw [abs_mul, abs_of_nonneg hμinv_nonneg] + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * + (R * ∫ x in U, |(fderiv ℝ f x) (basisVec i)| ∂MeasureTheory.volume) := by + exact mul_le_mul_of_nonneg_left hset hμinv_nonneg + _ ≤ (MeasureTheory.volume U).toReal⁻¹ * (R * (gradNorm * μpow1)) := by + refine mul_le_mul_of_nonneg_left ?_ hμinv_nonneg + exact mul_le_mul_of_nonneg_left (by simpa [gradNorm, μpow1, μ] using hl1) + hR_nonneg + calc + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) + = |integralAverage U f| * μpow2 := by + simpa [μ, μpow2] using + (eLpNorm_const_toReal_ofReal (U := U) hq (integralAverage U f)) + _ ≤ ((MeasureTheory.volume U).toReal⁻¹ * (R * (gradNorm * μpow1))) * μpow2 := by + exact mul_le_mul_of_nonneg_right havg hμpow2_nonneg + _ = (((MeasureTheory.volume U).toReal⁻¹ * R) * μpow1 * μpow2) * gradNorm := by + ring + +private theorem valueLpSeminorm_le_subAverage_add_constLpSeminorm_ofContDiff + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {q : ℝ} (hq : 1 < q) {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) : + let u : W1pFunction U (ENNReal.ofReal q) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + u.valueLpSeminorm ≤ u.subAverageLpSeminorm + + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) := by + intro u + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let pE : ENNReal := ENNReal.ofReal q + let avg : ℝ := integralAverage U f + let : MeasureTheory.IsFiniteMeasure μ := by + simpa [μ, volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hp1 : (1 : ENNReal) ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hconst_mem : MeasureTheory.MemLp (fun _ : Vec d => avg) pE μ := + MeasureTheory.memLp_const avg + have hsub_mem : MeasureTheory.MemLp (fun x => f x - avg) pE μ := by + have hf_mem : MeasureTheory.MemLp f pE μ := by + simpa [u, pE, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using u.memLp + simpa [Pi.sub_apply] using! hf_mem.sub hconst_mem + have htri : + MeasureTheory.eLpNorm f pE μ ≤ + MeasureTheory.eLpNorm (fun x => f x - avg) pE μ + + MeasureTheory.eLpNorm (fun _ : Vec d => avg) pE μ := by + calc + MeasureTheory.eLpNorm f pE μ + = MeasureTheory.eLpNorm ((fun x => f x - avg) + fun _ : Vec d => avg) + pE μ := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + simp [avg] + _ ≤ MeasureTheory.eLpNorm (fun x => f x - avg) pE μ + + MeasureTheory.eLpNorm (fun _ : Vec d => avg) pE μ := + MeasureTheory.eLpNorm_add_le hp1 + have hsum_ne_top : + MeasureTheory.eLpNorm (fun x => f x - avg) pE μ + + MeasureTheory.eLpNorm (fun _ : Vec d => avg) pE μ ≠ ⊤ := by + exact ENNReal.add_ne_top.2 ⟨hsub_mem.eLpNorm_lt_top.ne, hconst_mem.eLpNorm_lt_top.ne⟩ + calc + u.valueLpSeminorm = ENNReal.toReal (MeasureTheory.eLpNorm f pE μ) := by + simp [W1pFunction.valueLpSeminorm, u, pE, μ, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + _ ≤ ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => f x - avg) pE μ + + MeasureTheory.eLpNorm (fun _ : Vec d => avg) pE μ) := + ENNReal.toReal_mono hsum_ne_top htri + _ = ENNReal.toReal (MeasureTheory.eLpNorm (fun x => f x - avg) pE μ) + + ENNReal.toReal (MeasureTheory.eLpNorm (fun _ : Vec d => avg) pE μ) := by + rw [ENNReal.toReal_add hsub_mem.eLpNorm_lt_top.ne hconst_mem.eLpNorm_lt_top.ne] + _ = u.subAverageLpSeminorm + + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) := by + simp [W1pFunction.subAverageLpSeminorm, u, pE, μ, avg, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem exists_smooth_zeroTrace_poincare_constant_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {q : ℝ} (hq : 1 < q) + (hvol : 0 < (MeasureTheory.volume U).toReal) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f), + HasCompactSupport f → tsupport f ⊆ U → + let u : W1pFunction U (ENNReal.ofReal q) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + u.valueLpSeminorm ≤ C * u.gradientCoordLpSeminormSum := by + classical + rcases W1pFunction.exists_subAverage_poincare_constant_of_isOpenBoundedConvexDomain + (U := U) hU hq with ⟨Csub, hCsub, hsub⟩ + let i0 : Fin d := 0 + let Cavg : ℝ := + ((MeasureTheory.volume U).toReal⁻¹ * Classical.choose hU.isBoundedDomain) * + ENNReal.toReal ((volumeMeasureOn U) Set.univ ^ (1 - 1 / q : ℝ)) * + ENNReal.toReal ((volumeMeasureOn U) Set.univ ^ (1 / q : ℝ)) + have hCavg : 0 ≤ Cavg := by + dsimp [Cavg] + have hμinv : 0 ≤ (MeasureTheory.volume U).toReal⁻¹ := by positivity + have hR : 0 ≤ Classical.choose hU.isBoundedDomain := + le_of_lt (Classical.choose_spec hU.isBoundedDomain).1 + exact mul_nonneg + (mul_nonneg (mul_nonneg hμinv hR) ENNReal.toReal_nonneg) + ENNReal.toReal_nonneg + refine ⟨Csub + Cavg, add_nonneg hCsub hCavg, ?_⟩ + intro f hf hf_supp hf_sub + let u : W1pFunction U (ENNReal.ofReal q) := + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU (hf.of_le (by simp)) + have htri := valueLpSeminorm_le_subAverage_add_constLpSeminorm_ofContDiff + (U := U) hU hq (f := f) hf + have hconst := const_average_lpSeminorm_le_bound_mul_gradCoord + (U := U) hU hq hvol hf hf_supp hf_sub i0 + have hgrad_i_le_sum : u.gradCoordLpSeminorm i0 ≤ u.gradientCoordLpSeminormSum := by + simpa [W1pFunction.gradientCoordLpSeminormSum] using + (Finset.single_le_sum (s := (Finset.univ : Finset (Fin d))) + (f := fun j => u.gradCoordLpSeminorm j) + (fun j _ => u.gradCoordLpSeminorm_nonneg j) + (by simp : i0 ∈ (Finset.univ : Finset (Fin d)))) + have hconst_u : + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) ≤ + Cavg * u.gradientCoordLpSeminormSum := by + calc + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) + ≤ Cavg * u.gradCoordLpSeminorm i0 := by + simpa [Cavg, u, i0, W1pFunction.gradCoordLpSeminorm, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using hconst + _ ≤ Cavg * u.gradientCoordLpSeminormSum := + mul_le_mul_of_nonneg_left hgrad_i_le_sum hCavg + calc + u.valueLpSeminorm + ≤ u.subAverageLpSeminorm + + ENNReal.toReal + (MeasureTheory.eLpNorm (fun _ : Vec d => integralAverage U f) (ENNReal.ofReal q) + (volumeMeasureOn U)) := by + simpa [u] using htri + _ ≤ Csub * u.gradientCoordLpSeminormSum + Cavg * u.gradientCoordLpSeminormSum := + add_le_add (hsub u) hconst_u + _ = (Csub + Cavg) * u.gradientCoordLpSeminormSum := by ring + +namespace W10pFunction + +private theorem tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + {d : ℕ} {p : ENNReal} {μ : MeasureTheory.Measure (Vec d)} (hp1 : 1 ≤ p) + {F : ℕ → Vec d → ℝ} {f : Vec d → ℝ} + (hF_mem : ∀ n, MeasureTheory.MemLp (F n) p μ) + (hf_mem : MeasureTheory.MemLp f p μ) + (hLp : + Filter.Tendsto (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) p μ) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => ENNReal.toReal (MeasureTheory.eLpNorm (F n) p μ)) + Filter.atTop (nhds (ENNReal.toReal (MeasureTheory.eLpNorm f p μ))) := by + let : Fact (1 ≤ p) := ⟨hp1⟩ + have hLpSpace : + Filter.Tendsto (fun n => (hF_mem n).toLp (F n)) + Filter.atTop (nhds (hf_mem.toLp f)) := by + exact + (MeasureTheory.Lp.tendsto_Lp_iff_tendsto_eLpNorm'' + (μ := μ) (p := p) F hF_mem f hf_mem).2 + (by simpa [Pi.sub_apply] using! hLp) + have hnorm : + Filter.Tendsto (fun n => ‖(hF_mem n).toLp (F n)‖) + Filter.atTop (nhds ‖hf_mem.toLp f‖) := + hLpSpace.norm + simpa [MeasureTheory.Lp.norm_toLp] using hnorm + +/-- Bounded open convex domains satisfy the zero-trace `W^{1,p}` Poincare +inequality. + +Equivalently, there exists `C ≥ 0` such that every `u : W10pFunction U p` +satisfies an `L^p` bound of the function by the sum of the `L^p` norms of its +weak gradient coordinates. Lean keeps the exponent on the `W^{1,p}` layer as an +`ENNReal`. -/ +theorem exists_poincare_constant_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} {p : ENNReal} + (hp : (1 : ENNReal) < p) (hp_top : p ≠ ⊤) + (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : W10pFunction U p, + ENNReal.toReal (MeasureTheory.eLpNorm u p (volumeMeasureOn U)) ≤ + C * ∑ i : Fin d, + ENNReal.toReal + (MeasureTheory.eLpNorm (fun x => u.toW1pFunction.grad x i) p (volumeMeasureOn U)) := by + classical + let q : ℝ := p.toReal + have hq : 1 < q := by + have htmp : (1 : ENNReal).toReal < p.toReal := + (ENNReal.toReal_lt_toReal (by simp : (1 : ENNReal) ≠ ⊤) hp_top).2 hp + simpa [q] using htmp + have hp_eq : ENNReal.ofReal q = p := ENNReal.ofReal_toReal hp_top + rw [← hp_eq] + let pE : ENNReal := ENNReal.ofReal q + let μ : MeasureTheory.Measure (Vec d) := volumeMeasureOn U + let : MeasureTheory.IsFiniteMeasure μ := by + simpa [μ, volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + by_cases hvol0 : (MeasureTheory.volume U).toReal = 0 + · refine ⟨0, le_rfl, ?_⟩ + intro u + have hfinite : MeasureTheory.volume U < ⊤ := by + simpa [volumeMeasureOn] using + (MeasureTheory.measure_lt_top (volumeMeasureOn U) Set.univ) + have hvol0' : MeasureTheory.volume U = 0 := by + rcases (ENNReal.toReal_eq_zero_iff (MeasureTheory.volume U)).mp hvol0 with hzero | htop + · exact hzero + · exact (hfinite.ne htop).elim + have hμ0 : volumeMeasureOn U = 0 := by + simpa [volumeMeasureOn] using + (MeasureTheory.Measure.restrict_eq_zero.2 hvol0' : + MeasureTheory.volume.restrict U = 0) + simp [hμ0, MeasureTheory.eLpNorm_measure_zero] + · have hvol : 0 < (MeasureTheory.volume U).toReal := + lt_of_le_of_ne ENNReal.toReal_nonneg (Ne.symm hvol0) + rcases exists_smooth_zeroTrace_poincare_constant_of_isOpenBoundedConvexDomain + (U := U) hU hq hvol with ⟨C, hC, hSmooth⟩ + refine ⟨C, hC, ?_⟩ + intro u + let ψ : ℕ → W1pFunction U pE := fun n => + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain hU + ((u.approx_smooth n).of_le (by simp)) + have hp1 : (1 : ENNReal) ≤ pE := by + dsimp [pE] + rw [ENNReal.one_le_ofReal] + exact hq.le + have hψ_bound : + ∀ n, (ψ n).valueLpSeminorm ≤ C * (ψ n).gradientCoordLpSeminormSum := by + intro n + simpa [ψ, pE] using + (hSmooth (f := u.approx n) (u.approx_smooth n) + (u.approx_hasCompactSupport n) (u.approx_support_subset n)) + have hleft : + Filter.Tendsto (fun n => (ψ n).valueLpSeminorm) Filter.atTop + (nhds u.toW1pFunction.valueLpSeminorm) := by + have hnorm := + tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + (μ := μ) (p := pE) hp1 + (F := fun n => (ψ n).toFun) (f := u.toW1pFunction.toFun) + (fun n => (ψ n).memLp) u.toW1pFunction.memLp + (by simpa [ψ, pE, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using u.tendsto_approx) + simpa [W1pFunction.valueLpSeminorm, ψ, pE, μ] using hnorm + have hgrad : + ∀ i : Fin d, + Filter.Tendsto (fun n => (ψ n).gradCoordLpSeminorm i) Filter.atTop + (nhds (u.toW1pFunction.gradCoordLpSeminorm i)) := by + intro i + have hnorm := + tendsto_toReal_eLpNorm_of_tendsto_eLpNorm_sub + (μ := μ) (p := pE) hp1 + (F := fun n => fun x => (ψ n).grad x i) + (f := fun x => u.toW1pFunction.grad x i) + (fun n => (ψ n).grad_memLp i) (u.toW1pFunction.grad_memLp i) + (by simpa [ψ, pE, μ, W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] using + (u.tendsto_approx_grad i)) + simpa [W1pFunction.gradCoordLpSeminorm, ψ, pE, μ] using hnorm + have hright_grad : + Filter.Tendsto (fun n => (ψ n).gradientCoordLpSeminormSum) Filter.atTop + (nhds u.toW1pFunction.gradientCoordLpSeminormSum) := by + simpa [W1pFunction.gradientCoordLpSeminormSum] using + tendsto_finsetSum Finset.univ (fun i _ => hgrad i) + have hright : + Filter.Tendsto (fun n => C * (ψ n).gradientCoordLpSeminormSum) Filter.atTop + (nhds (C * u.toW1pFunction.gradientCoordLpSeminormSum)) := + tendsto_const_nhds.mul hright_grad + have hlimit : + u.toW1pFunction.valueLpSeminorm ≤ + C * u.toW1pFunction.gradientCoordLpSeminormSum := + le_of_tendsto_of_tendsto' hleft hright hψ_bound + simpa [W1pFunction.valueLpSeminorm, W1pFunction.gradientCoordLpSeminormSum, + W1pFunction.gradCoordLpSeminorm, pE, μ] using hlimit + +end W10pFunction + +namespace H10Function + +noncomputable def toW10pFunction {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) : W10pFunction U (2 : ENNReal) := + { toW1pFunction := + { toFun := u.toH1Function.toFun + grad := u.toH1Function.grad + memLp := u.toH1Function.memL2 + gradMemLp := u.toH1Function.gradMemL2 + hasWeakGradient := u.toH1Function.hasWeakGradient } + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := u.approx_support_subset + tendsto_approx := u.tendsto_approx + tendsto_approx_grad := u.tendsto_approx_grad } + +/-- Existential constant form of the bounded-open-convex zero-trace `L²` +Poincare inequality. This is the `H¹₀` wrapper parallel to the mean-zero +public theorem file. -/ +theorem exists_poincare_constant_of_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : H10Function U, + ‖u.toH1Function.toScalarL2‖ ≤ C * u.toH1Function.gradientCoordL2NormSum := by + rcases W10pFunction.exists_poincare_constant_of_isOpenBoundedConvexDomain + (U := U) (p := (2 : ENNReal)) (by norm_num) (by norm_num) hU with ⟨C, hC, hbound⟩ + refine ⟨C, hC, ?_⟩ + intro u + have h := hbound u.toW10pFunction + simpa [toW10pFunction, H1Function.toScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp, H1Function.gradientCoordL2NormSum, + H1Function.gradCoordToScalarL2] using h + +/-- Any zero-trace coercive estimate implies that an `H¹₀` function with zero +gradient `L²` class has zero value `L²` class. This isolates the only use of +the scalar Poincare inequality needed in the current RHS Dirichlet theory. -/ +theorem toScalarL2_eq_zero_of_gradToVectorL2_eq_zero_of_exists_poincare_constant + {d : ℕ} {U : Set (Vec d)} + (hP : ∃ C : ℝ, 0 ≤ C ∧ + ∀ u : H10Function U, + ‖u.toH1Function.toScalarL2‖ ≤ C * u.toH1Function.gradientCoordL2NormSum) + (u : H10Function U) (hgrad : u.toH1Function.gradToVectorL2 = 0) : + u.toH1Function.toScalarL2 = 0 := by + rcases hP with ⟨C, _hC, hbound⟩ + have hgradCoordLeZero : u.toH1Function.gradientCoordL2NormSum ≤ 0 := by + calc + u.toH1Function.gradientCoordL2NormSum ≤ d * ‖u.toH1Function.gradToVectorL2‖ := + u.toH1Function.gradientCoordL2NormSum_le + _ = 0 := by + rw [hgrad, norm_zero, mul_zero] + have hgradCoordZero : u.toH1Function.gradientCoordL2NormSum = 0 := by + exact le_antisymm hgradCoordLeZero u.toH1Function.gradientCoordL2NormSum_nonneg + have hvalueLeZero : ‖u.toH1Function.toScalarL2‖ ≤ 0 := by + calc + ‖u.toH1Function.toScalarL2‖ ≤ C * u.toH1Function.gradientCoordL2NormSum := hbound u + _ = 0 := by rw [hgradCoordZero, mul_zero] + exact norm_eq_zero.mp (le_antisymm hvalueLeZero (norm_nonneg _)) + +end H10Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/QuantitativeCutoff.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/QuantitativeCutoff.lean new file mode 100644 index 0000000000..33cedece7e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/QuantitativeCutoff.lean @@ -0,0 +1,415 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Ball +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Cube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.DerivativeBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.Profile +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Analysis.Calculus.ContDiff.FTaylorSeries + +/-! # Quantitative Cutoff -/ + +@[expose] public section + +noncomputable section + +open Set +open scoped Topology + +namespace Homogenization + +/-! +# Quantitative smooth cutoffs + +This file provides the quantitative cutoff interfaces used by local Sobolev and +Caccioppoli arguments. The ball version is the standard radial cutoff between +two concentric balls. The cube version is the analogous cutoff between two +concentric subcubes of a triadic cube. + +The derivative bounds are expressed using dimensional constants. The default +norm on `Vec d` is the product/sup norm, so Euclidean-ball cutoffs acquire +dimension factors when their derivatives are measured with Lean's operator norm. +-/ + +/-- Dimensional first-derivative constant for the ball cutoff interface. + +The factor `d` accounts for measuring derivatives on `Vec d` using the default +sup/product norm. -/ +def quantitativeBallCutoffGradientConst (d : ℕ) : ℝ := + 8 * (d : ℝ) * smoothTransitionProfile.derivBound + +/-- Dimensional Hessian constant for the ball cutoff interface. -/ +def quantitativeBallCutoffHessianConst (d : ℕ) : ℝ := + 32 * (d : ℝ) ^ 2 * + max 1 (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound) + +/-- Dimensional first-derivative constant for the cube cutoff interface. -/ +def quantitativeCubeCutoffGradientConst (d : ℕ) : ℝ := + 8 * (d : ℝ) * smoothTransitionProfile.derivBound + +/-- Dimensional Hessian constant for the cube cutoff interface. -/ +def quantitativeCubeCutoffHessianConst (d : ℕ) : ℝ := + 8 * (d : ℝ) ^ 2 * + (max 1 + (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound)) ^ 2 + +/-- A quantitative smooth cutoff between two concentric balls. -/ +structure QuantitativeBallCutoff {d : ℕ} (x₀ : Vec d) (r R : ℝ) where + toFun : Vec d → ℝ + smooth : ContDiff ℝ (⊤ : ℕ∞) toFun + hasCompactSupport : HasCompactSupport toFun + support_subset : tsupport toFun ⊆ euclideanBall x₀ R + nonneg : ∀ x, 0 ≤ toFun x + le_one : ∀ x, toFun x ≤ 1 + eq_one_on_inner : ∀ x ∈ euclideanBall x₀ r, toFun x = 1 + gradient_bound : ∀ x, ‖fderiv ℝ toFun x‖ ≤ + quantitativeBallCutoffGradientConst d / (R - r) + hessian_bound : + ∀ x, ‖iteratedFDeriv ℝ 2 toFun x‖ ≤ + quantitativeBallCutoffHessianConst d / (R - r) ^ 2 + +namespace QuantitativeBallCutoff + +instance {d : ℕ} {x₀ : Vec d} {r R : ℝ} : + CoeFun (QuantitativeBallCutoff x₀ r R) (fun _ => Vec d → ℝ) where + coe η := η.toFun + +/-- Canonical smooth ball cutoff formula using `Real.smoothTransition`. + +The extra support radius `s` leaves a collar between the support and `B_R`, +which is necessary for `tsupport` to be contained in the open ball. -/ +def canonicalFun {d : ℕ} (x₀ : Vec d) (r s : ℝ) : Vec d → ℝ := + QuantitativeTransitionProfile.ballCutoff smoothTransitionProfile.quantitativeProfile x₀ r s + +theorem canonicalFun_smooth {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + ContDiff ℝ (⊤ : ℕ∞) (canonicalFun x₀ r s) := + QuantitativeTransitionProfile.ballCutoff_smooth + smoothTransitionProfile.quantitativeProfile x₀ hr hrs + +theorem canonicalFun_hasCompactSupport {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + HasCompactSupport (canonicalFun x₀ r s) := + QuantitativeTransitionProfile.ballCutoff_hasCompactSupport + smoothTransitionProfile.quantitativeProfile hr hrs + +theorem canonicalFun_tsupport_subset_euclideanBall {d : ℕ} (x₀ : Vec d) {r s R : ℝ} + (hr : 0 < r) (hrs : r < s) (hsR : s < R) : + tsupport (canonicalFun x₀ r s) ⊆ euclideanBall x₀ R := + QuantitativeTransitionProfile.ballCutoff_tsupport_subset_euclideanBall + smoothTransitionProfile.quantitativeProfile hr hrs hsR + +theorem canonicalFun_nonneg {d : ℕ} (x₀ : Vec d) (r s : ℝ) (x : Vec d) : + 0 ≤ canonicalFun x₀ r s x := + QuantitativeTransitionProfile.ballCutoff_nonneg + smoothTransitionProfile.quantitativeProfile x₀ r s x + +theorem canonicalFun_le_one {d : ℕ} (x₀ : Vec d) (r s : ℝ) (x : Vec d) : + canonicalFun x₀ r s x ≤ 1 := + QuantitativeTransitionProfile.ballCutoff_le_one + smoothTransitionProfile.quantitativeProfile x₀ r s x + +theorem canonicalFun_eq_one_on_inner {d : ℕ} {x₀ : Vec d} {r s : ℝ} + (hr : 0 < r) (hrs : r < s) {x : Vec d} + (hx : x ∈ euclideanBall x₀ r) : + canonicalFun x₀ r s x = 1 := + QuantitativeTransitionProfile.ballCutoff_eq_one_of_mem_euclideanBall + smoothTransitionProfile.quantitativeProfile hr hrs hx + +theorem canonicalFun_gradient_bound {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) (x : Vec d) : + ‖fderiv ℝ (canonicalFun x₀ r s) x‖ ≤ + smoothTransitionProfile.derivBound * (2 * (d : ℝ) / (s - r)) := + QuantitativeTransitionProfile.norm_fderiv_ballCutoff_le + smoothTransitionProfile.quantitativeProfile hr hrs x + +theorem canonicalFun_hessian_bound {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (canonicalFun x₀ r s) x‖ ≤ + 2 * (max 1 + (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound)) * + (2 * (d : ℝ) / (s - r)) ^ 2 := + QuantitativeTransitionProfile.norm_iteratedFDeriv_two_ballCutoff_le + smoothTransitionProfile.quantitativeProfile hr hrs x + +theorem exists_bound_fderiv_canonicalFun {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x, ‖fderiv ℝ (canonicalFun x₀ r s) x‖ ≤ C := + exists_bound_fderiv_of_contDiff_hasCompactSupport + (canonicalFun_smooth x₀ hr hrs) + (canonicalFun_hasCompactSupport x₀ hr hrs) + +theorem exists_bound_hessian_canonicalFun {d : ℕ} (x₀ : Vec d) {r s : ℝ} + (hr : 0 < r) (hrs : r < s) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ x, ‖iteratedFDeriv ℝ 2 (canonicalFun x₀ r s) x‖ ≤ C := + exists_bound_iteratedFDeriv_two_of_contDiff_hasCompactSupport + (canonicalFun_smooth x₀ hr hrs) + (canonicalFun_hasCompactSupport x₀ hr hrs) + +/-- Canonical quantitative ball cutoff between `B_r(x₀)` and `B_R(x₀)`, +using the midpoint radius `(r + R) / 2` as transition scale. -/ +noncomputable def canonical {d : ℕ} (x₀ : Vec d) (r R : ℝ) + (hr : 0 < r) (hrR : r < R) : QuantitativeBallCutoff x₀ r R := by + let s : ℝ := (r + R) / 2 + have hrs : r < s := by + dsimp [s] + nlinarith + have hsR : s < R := by + dsimp [s] + nlinarith + refine + { toFun := canonicalFun x₀ r s + smooth := canonicalFun_smooth x₀ hr hrs + hasCompactSupport := canonicalFun_hasCompactSupport x₀ hr hrs + support_subset := canonicalFun_tsupport_subset_euclideanBall x₀ hr hrs hsR + nonneg := canonicalFun_nonneg x₀ r s + le_one := canonicalFun_le_one x₀ r s + eq_one_on_inner := by + intro x hx + exact canonicalFun_eq_one_on_inner hr hrs hx + gradient_bound := by + intro x + have hbase := canonicalFun_gradient_bound x₀ hr hrs x + have hs_eq : s - r = (R - r) / 2 := by + dsimp [s] + ring + have hconst : + smoothTransitionProfile.derivBound * (2 * (d : ℝ) / (s - r)) + = 4 * (d : ℝ) * smoothTransitionProfile.derivBound / (R - r) := by + rw [hs_eq] + field_simp [sub_ne_zero.mpr (ne_of_gt hrR)] + ring + rw [hconst] at hbase + calc + ‖fderiv ℝ (canonicalFun x₀ r s) x‖ + ≤ 4 * (d : ℝ) * smoothTransitionProfile.derivBound / (R - r) := hbase + _ ≤ quantitativeBallCutoffGradientConst d / (R - r) := by + have hRR : 0 < R - r := sub_pos.mpr hrR + have hcoeff : + 4 * (d : ℝ) * smoothTransitionProfile.derivBound + ≤ quantitativeBallCutoffGradientConst d := by + dsimp [quantitativeBallCutoffGradientConst] + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + nlinarith [smoothTransitionProfile.derivBound_nonneg, hd_nonneg] + exact div_le_div_of_nonneg_right hcoeff (le_of_lt hRR) + hessian_bound := by + intro x + have hbase := canonicalFun_hessian_bound x₀ hr hrs x + have hs_eq : s - r = (R - r) / 2 := by + dsimp [s] + ring + have hconst : + 2 * (max 1 + (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound)) * + (2 * (d : ℝ) / (s - r)) ^ 2 + = + quantitativeBallCutoffHessianConst d / (R - r) ^ 2 := by + rw [hs_eq] + dsimp [quantitativeBallCutoffHessianConst] + field_simp [pow_two, sub_ne_zero.mpr (ne_of_gt hrR)] + ring + simpa [hconst] using hbase } + +end QuantitativeBallCutoff + +/-- A quantitative smooth cutoff between two concentric subcubes of a triadic cube. -/ +structure QuantitativeCubeCutoff {d : ℕ} (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) where + toFun : Vec d → ℝ + smooth : ContDiff ℝ (⊤ : ℕ∞) toFun + hasCompactSupport : HasCompactSupport toFun + support_subset : Function.support toFun ⊆ scaledOpenCubeSet Q ρ₂ + nonneg : ∀ x, 0 ≤ toFun x + le_one : ∀ x, toFun x ≤ 1 + eq_one_on_inner : ∀ x ∈ scaledClosedCubeSet Q ρ₁, toFun x = 1 + gradient_bound : ∀ x, + ‖fderiv ℝ toFun x‖ ≤ + quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) + hessian_bound : ∀ x, + ‖iteratedFDeriv ℝ 2 toFun x‖ ≤ + quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) + +namespace QuantitativeCubeCutoff + +instance {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} : + CoeFun (QuantitativeCubeCutoff Q ρ₁ ρ₂) (fun _ => Vec d → ℝ) where + coe η := η.toFun + +/-- Canonical smooth cube cutoff formula using `Real.smoothTransition`. -/ +def canonicalFun {d : ℕ} (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) : Vec d → ℝ := + QuantitativeTransitionProfile.cubeCutoff smoothTransitionProfile.quantitativeProfile Q ρ₁ ρ₂ + +theorem canonicalFun_smooth {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + ContDiff ℝ (⊤ : ℕ∞) (canonicalFun Q ρ₁ ρ₂) := + QuantitativeTransitionProfile.cubeCutoff_smooth + smoothTransitionProfile.quantitativeProfile Q hρ₁ hρ₁₂ + +theorem canonicalFun_nonneg {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (x : Vec d) : + 0 ≤ canonicalFun Q ρ₁ ρ₂ x := + QuantitativeTransitionProfile.cubeCutoff_nonneg + smoothTransitionProfile.quantitativeProfile Q ρ₁ ρ₂ x + +theorem canonicalFun_le_one {d : ℕ} (Q : TriadicCube d) + (ρ₁ ρ₂ : ℝ) (x : Vec d) : + canonicalFun Q ρ₁ ρ₂ x ≤ 1 := + QuantitativeTransitionProfile.cubeCutoff_le_one + smoothTransitionProfile.quantitativeProfile Q ρ₁ ρ₂ x + +theorem canonicalFun_eq_one_on_inner {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) {x : Vec d} + (hx : x ∈ scaledClosedCubeSet Q ρ₁) : + canonicalFun Q ρ₁ ρ₂ x = 1 := + QuantitativeTransitionProfile.cubeCutoff_eq_one_of_mem_scaledClosedCubeSet + smoothTransitionProfile.quantitativeProfile hρ₁ hρ₁₂ hx + +theorem canonicalFun_support_subset {d : ℕ} {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + Function.support (canonicalFun Q ρ₁ ρ₂) ⊆ scaledOpenCubeSet Q ρ₂ := + QuantitativeTransitionProfile.cubeCutoff_support_subset_scaledOpenCubeSet + smoothTransitionProfile.quantitativeProfile hρ₁ hρ₁₂ + +theorem canonicalFun_tsupport_subset_scaledClosedCubeSet {d : ℕ} + {Q : TriadicCube d} {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + tsupport (canonicalFun Q ρ₁ ρ₂) ⊆ scaledClosedCubeSet Q ρ₂ := + QuantitativeTransitionProfile.cubeCutoff_tsupport_subset_scaledClosedCubeSet + smoothTransitionProfile.quantitativeProfile hρ₁ hρ₁₂ + +/-- The canonical product cutoff has zero coordinate derivative away from the +corresponding coordinate collar. -/ +theorem canonicalFun_fderiv_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + {i : Fin d} {x : Vec d} + (hx : |x i - cubeCenter Q i| < ρ₁ * cubeRadius Q) : + (fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x) (basisVec i) = 0 := by + simpa [canonicalFun] using + QuantitativeTransitionProfile.fderiv_cubeCutoff_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner + smoothTransitionProfile.quantitativeProfile Q hρ₁ hρ₁₂ hx + +/-- Support form of `canonicalFun_fderiv_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner`. -/ +theorem support_fderiv_canonicalFun_apply_basisVec_subset_coord_abs_ge_inner {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (i : Fin d) : + Function.support (fun x : Vec d => (fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x) (basisVec i)) ⊆ + {x | ρ₁ * cubeRadius Q ≤ |x i - cubeCenter Q i|} := by + intro x hx + by_contra hnot + exact hx (canonicalFun_fderiv_apply_basisVec_eq_zero_of_abs_sub_center_lt_inner + Q hρ₁ hρ₁₂ (not_le.mp hnot)) + +theorem support_fderiv_canonicalFun_apply_basisVec_subset_scaledClosedCubeSet {d : ℕ} + (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) + (i : Fin d) : + Function.support (fun x : Vec d => (fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x) (basisVec i)) ⊆ + scaledClosedCubeSet Q ρ₂ := by + intro x hx + have hx_deriv : x ∈ Function.support (fderiv ℝ (canonicalFun Q ρ₁ ρ₂)) := by + intro hzero + exact hx (by simp [hzero]) + exact canonicalFun_tsupport_subset_scaledClosedCubeSet hρ₁ hρ₁₂ + ((support_fderiv_subset (𝕜 := ℝ) (f := canonicalFun Q ρ₁ ρ₂)) hx_deriv) + +theorem canonicalFun_gradient_bound {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (x : Vec d) : + ‖fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x‖ ≤ + (d : ℝ) * smoothTransitionProfile.derivBound * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := + QuantitativeTransitionProfile.norm_fderiv_cubeCutoff_le + smoothTransitionProfile.quantitativeProfile Q hρ₁ hρ₁₂ x + +theorem canonicalFun_hessian_bound {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) (x : Vec d) : + ‖iteratedFDeriv ℝ 2 (canonicalFun Q ρ₁ ρ₂) x‖ ≤ + 2 * (d : ℝ) ^ 2 * + ((max 1 + (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) ^ 2 := + QuantitativeTransitionProfile.norm_iteratedFDeriv_two_cubeCutoff_le + smoothTransitionProfile.quantitativeProfile Q hρ₁ hρ₁₂ x + +theorem canonicalFun_hasCompactSupport {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + HasCompactSupport (canonicalFun Q ρ₁ ρ₂) := by + have hρ₂_nonneg : 0 ≤ ρ₂ := le_of_lt (lt_trans hρ₁ hρ₁₂) + refine HasCompactSupport.of_support_subset_isCompact + (isCompact_scaledClosedCubeSet Q hρ₂_nonneg) ?_ + intro x hx + exact fun i => le_of_lt ((canonicalFun_support_subset hρ₁ hρ₁₂ hx) i) + +theorem exists_bound_fderiv_canonicalFun {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x, ‖fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x‖ ≤ C := + exists_bound_fderiv_of_contDiff_hasCompactSupport + (canonicalFun_smooth Q hρ₁ hρ₁₂) + (canonicalFun_hasCompactSupport Q hρ₁ hρ₁₂) + +theorem exists_bound_hessian_canonicalFun {d : ℕ} (Q : TriadicCube d) {ρ₁ ρ₂ : ℝ} + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ x, ‖iteratedFDeriv ℝ 2 (canonicalFun Q ρ₁ ρ₂) x‖ ≤ C := + exists_bound_iteratedFDeriv_two_of_contDiff_hasCompactSupport + (canonicalFun_smooth Q hρ₁ hρ₁₂) + (canonicalFun_hasCompactSupport Q hρ₁ hρ₁₂) + +/-- Canonical quantitative cube cutoff between the concentric subcubes +`scaledClosedCubeSet Q ρ₁` and `scaledOpenCubeSet Q ρ₂`. -/ +noncomputable def canonical {d : ℕ} (Q : TriadicCube d) (ρ₁ ρ₂ : ℝ) + (hρ₁ : 0 < ρ₁) (hρ₁₂ : ρ₁ < ρ₂) : QuantitativeCubeCutoff Q ρ₁ ρ₂ := by + refine + { toFun := canonicalFun Q ρ₁ ρ₂ + smooth := canonicalFun_smooth Q hρ₁ hρ₁₂ + hasCompactSupport := canonicalFun_hasCompactSupport Q hρ₁ hρ₁₂ + support_subset := by + intro x hx + exact canonicalFun_support_subset hρ₁ hρ₁₂ hx + nonneg := canonicalFun_nonneg Q ρ₁ ρ₂ + le_one := canonicalFun_le_one Q ρ₁ ρ₂ + eq_one_on_inner := by + intro x hx + exact canonicalFun_eq_one_on_inner hρ₁ hρ₁₂ hx + gradient_bound := by + intro x + have hbase := canonicalFun_gradient_bound Q hρ₁ hρ₁₂ x + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + have hcoeff : + (d : ℝ) * smoothTransitionProfile.derivBound * 2 + ≤ quantitativeCubeCutoffGradientConst d := by + dsimp [quantitativeCubeCutoffGradientConst] + have hd_nonneg : 0 ≤ (d : ℝ) := Nat.cast_nonneg d + nlinarith [hd_nonneg, smoothTransitionProfile.derivBound_nonneg] + calc + ‖fderiv ℝ (canonicalFun Q ρ₁ ρ₂) x‖ + ≤ (d : ℝ) * smoothTransitionProfile.derivBound * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q)) := hbase + _ ≤ quantitativeCubeCutoffGradientConst d / ((ρ₂ - ρ₁) * cubeRadius Q) := by + simpa [div_eq_mul_inv, mul_assoc, mul_left_comm, mul_comm] using + mul_le_mul_of_nonneg_right hcoeff (inv_nonneg.mpr (le_of_lt hgap_pos)) + hessian_bound := by + intro x + have hbase := canonicalFun_hessian_bound Q hρ₁ hρ₁₂ x + have hgap_pos : 0 < (ρ₂ - ρ₁) * cubeRadius Q := by + exact mul_pos (sub_pos.mpr hρ₁₂) (cubeRadius_pos Q) + have hgap_ne : ((ρ₂ - ρ₁) * cubeRadius Q) ≠ 0 := ne_of_gt hgap_pos + calc + ‖iteratedFDeriv ℝ 2 (canonicalFun Q ρ₁ ρ₂) x‖ + ≤ 2 * (d : ℝ) ^ 2 * + ((max 1 + (max smoothTransitionProfile.derivBound smoothTransitionProfile.secondDerivBound)) * + (2 / ((ρ₂ - ρ₁) * cubeRadius Q))) ^ 2 := hbase + _ = quantitativeCubeCutoffHessianConst d / (((ρ₂ - ρ₁) * cubeRadius Q) ^ 2) := by + dsimp [quantitativeCubeCutoffHessianConst] + field_simp [pow_two, hgap_ne] + ring } + +end QuantitativeCubeCutoff + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/WeakHessianEuclidean.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/WeakHessianEuclidean.lean new file mode 100644 index 0000000000..e6251dae79 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/WeakHessianEuclidean.lean @@ -0,0 +1,427 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInterior +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient + +/-! # Weak Hessian Euclidean -/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-! +# Euclidean norms for weak Hessians + +This module gives the coordinate weak-Hessian carrier its canonical Euclidean +(Frobenius) pointwise magnitude and its volume-normalized `L²` norm on cubes. +The pre-existing coordinate-`ℓ¹` norm remains available for estimates proved +before this Euclidean interface was introduced. +-/ + +/-- Frobenius magnitude of a real matrix. -/ +noncomputable def matrixFrobeniusMagnitude {d : ℕ} (A : Mat d) : ℝ := + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, (A i j) ^ 2) + +theorem matrixFrobeniusMagnitude_nonneg {d : ℕ} (A : Mat d) : + 0 ≤ matrixFrobeniusMagnitude A := + Real.sqrt_nonneg _ + +theorem sq_matrixFrobeniusMagnitude {d : ℕ} (A : Mat d) : + matrixFrobeniusMagnitude A ^ 2 = + ∑ i : Fin d, ∑ j : Fin d, (A i j) ^ 2 := by + unfold matrixFrobeniusMagnitude + exact Real.sq_sqrt (Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => sq_nonneg _) + +@[simp] theorem matrixFrobeniusMagnitude_zero {d : ℕ} : + matrixFrobeniusMagnitude (0 : Mat d) = 0 := by + simp [matrixFrobeniusMagnitude] + +/-- The explicit matrix Frobenius magnitude agrees with the norm of the +project's Euclidean Hilbert matrix realization. -/ +theorem matrixFrobeniusMagnitude_eq_norm_hilbertMat_ofMat {d : ℕ} (A : Mat d) : + matrixFrobeniusMagnitude A = ‖HilbertMat.ofMat A‖ := by + have hleft_nonneg : 0 ≤ matrixFrobeniusMagnitude A := + matrixFrobeniusMagnitude_nonneg A + have hright_nonneg : 0 ≤ ‖HilbertMat.ofMat A‖ := norm_nonneg _ + have hsq : ‖HilbertMat.ofMat A‖ ^ 2 = + ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 := by + rw [PiLp.norm_sq_eq_of_L2] + simp_rw [HilbertVec.norm_sq_eq_sum_sq] + apply (sq_eq_sq₀ hleft_nonneg hright_nonneg).mp + calc + matrixFrobeniusMagnitude A ^ 2 = + ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 := + sq_matrixFrobeniusMagnitude A + _ = ‖HilbertMat.ofMat A‖ ^ 2 := hsq.symm + +theorem matrixFrobeniusMagnitude_le_sum_abs {d : ℕ} (A : Mat d) : + matrixFrobeniusMagnitude A ≤ ∑ i : Fin d, ∑ j : Fin d, |A i j| := by + have hsq : + ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 ≤ + (∑ i : Fin d, ∑ j : Fin d, |A i j|) ^ 2 := by + have hrow : ∀ i : Fin d, + ∑ j : Fin d, A i j ^ 2 ≤ (∑ j : Fin d, |A i j|) ^ 2 := by + intro i + simpa [sq_abs, pow_two] using + Finset.sum_sq_le_sq_sum_of_nonneg (s := Finset.univ) + (f := fun j => |A i j|) (by intro _ _; exact abs_nonneg _) + have hrow_nonneg : ∀ i : Fin d, 0 ≤ ∑ j : Fin d, |A i j| := by + intro i + exact Finset.sum_nonneg fun _ _ => abs_nonneg _ + calc + ∑ i : Fin d, ∑ j : Fin d, A i j ^ 2 + ≤ ∑ i : Fin d, (∑ j : Fin d, |A i j|) ^ 2 := + Finset.sum_le_sum fun i _ => hrow i + _ ≤ (∑ i : Fin d, ∑ j : Fin d, |A i j|) ^ 2 := by + simpa [pow_two] using + Finset.sum_sq_le_sq_sum_of_nonneg (s := Finset.univ) + (f := fun i => ∑ j : Fin d, |A i j|) + (by intro i _; exact hrow_nonneg i) + calc + matrixFrobeniusMagnitude A + = Real.sqrt (∑ i : Fin d, ∑ j : Fin d, A i j ^ 2) := rfl + _ ≤ Real.sqrt ((∑ i : Fin d, ∑ j : Fin d, |A i j|) ^ 2) := + Real.sqrt_le_sqrt hsq + _ = ∑ i : Fin d, ∑ j : Fin d, |A i j| := by + rw [Real.sqrt_sq_eq_abs] + exact abs_of_nonneg (Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => abs_nonneg _) + +namespace HasWeakHessianOn + +variable {d : ℕ} {U : Set (Vec d)} {u : H1Function U} + +/-- Pointwise matrix Frobenius magnitude of the weak Hessian carrier. -/ +noncomputable def frobeniusMagnitude (H : HasWeakHessianOn U u) : Vec d → ℝ := + fun x => matrixFrobeniusMagnitude (fun i j => H.hess i j x) + +/-- The pointwise square of `frobeniusMagnitude` is the sum of the squares of +all weak Hessian coordinates. -/ +theorem sq_frobeniusMagnitude (H : HasWeakHessianOn U u) (x : Vec d) : + H.frobeniusMagnitude x ^ 2 = + ∑ i : Fin d, ∑ j : Fin d, (H.hess i j x) ^ 2 := by + exact sq_matrixFrobeniusMagnitude (fun i j => H.hess i j x) + +/-- Each weak Hessian coordinate is square-integrable for normalized cube +volume whenever its carrier domain is that open cube. -/ +theorem hess_memLp_normalizedCubeMeasure (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i j : Fin d) : + MeasureTheory.MemLp (H.hess i j) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + exact (H.hess_memL2 i j).smul_measure ENNReal.ofReal_ne_top + +/-- The pointwise Frobenius magnitude of a weak Hessian is in normalized +`L²` on every cube on which the carrier is defined. -/ +theorem frobeniusMagnitude_memLp_normalizedCubeMeasure (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + MeasureTheory.MemLp H.frobeniusMagnitude (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + let G : Fin d → Fin d → Vec d → ℝ := fun i j x => |H.hess i j x| + have hG : ∀ i j, MeasureTheory.MemLp (G i j) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + intro i j + simpa [G, Real.norm_eq_abs] using + (H.hess_memLp_normalizedCubeMeasure Q i j).norm + have hrow : ∀ i : Fin d, MeasureTheory.MemLp (fun x => ∑ j : Fin d, G i j x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + intro i + exact MeasureTheory.memLp_finsetSum Finset.univ + (fun j _ => hG i j) + have hsum : MeasureTheory.MemLp (fun x => ∑ i : Fin d, ∑ j : Fin d, G i j x) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + exact MeasureTheory.memLp_finsetSum Finset.univ (fun i _ => hrow i) + have hsquare_meas : MeasureTheory.AEStronglyMeasurable + (fun x => ∑ i : Fin d, ∑ j : Fin d, (H.hess i j x) ^ 2) + (normalizedCubeMeasure Q) := by + apply Finset.aestronglyMeasurable_fun_sum Finset.univ + intro i _ + apply Finset.aestronglyMeasurable_fun_sum Finset.univ + intro j _ + exact (H.hess_memLp_normalizedCubeMeasure Q i j).aestronglyMeasurable.pow 2 + have hmag_meas : MeasureTheory.AEStronglyMeasurable H.frobeniusMagnitude + (normalizedCubeMeasure Q) := by + have hsqrt := Real.continuous_sqrt.comp_aestronglyMeasurable hsquare_meas + simpa [frobeniusMagnitude, matrixFrobeniusMagnitude] using! hsqrt + refine hsum.mono hmag_meas ?_ + filter_upwards with x + have hsum_nonneg : 0 ≤ ∑ i : Fin d, ∑ j : Fin d, G i j x := by + exact Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => abs_nonneg _ + have hsum_norm : ‖∑ i : Fin d, ∑ j : Fin d, G i j x‖ = + ∑ i : Fin d, ∑ j : Fin d, G i j x := by + rw [Real.norm_eq_abs, abs_of_nonneg hsum_nonneg] + rw [hsum_norm] + change |matrixFrobeniusMagnitude (fun i j => H.hess i j x)| ≤ + ∑ i : Fin d, ∑ j : Fin d, |H.hess i j x| + calc |matrixFrobeniusMagnitude (fun i j => H.hess i j x)| + = matrixFrobeniusMagnitude (fun i j => H.hess i j x) := + abs_of_nonneg (matrixFrobeniusMagnitude_nonneg _) + _ ≤ ∑ i : Fin d, ∑ j : Fin d, |H.hess i j x| := + matrixFrobeniusMagnitude_le_sum_abs (fun i j => H.hess i j x) + +theorem integral_frobeniusMagnitude_sq_eq_sum_integral (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + ∫ x, H.frobeniusMagnitude x ^ 2 ∂normalizedCubeMeasure Q = + ∑ i : Fin d, ∑ j : Fin d, + ∫ x, (H.hess i j x) ^ 2 ∂normalizedCubeMeasure Q := by + have hint : ∀ i j : Fin d, MeasureTheory.Integrable + (fun x => (H.hess i j x) ^ 2) (normalizedCubeMeasure Q) := by + intro i j + simpa [Real.norm_eq_abs, sq_abs] using + (H.hess_memLp_normalizedCubeMeasure Q i j).integrable_norm_rpow + (by norm_num : (2 : ℝ≥0∞) ≠ 0) (by simp : (2 : ℝ≥0∞) ≠ ∞) + calc + ∫ x, H.frobeniusMagnitude x ^ 2 ∂normalizedCubeMeasure Q = + ∫ x, ∑ i : Fin d, ∑ j : Fin d, (H.hess i j x) ^ 2 + ∂normalizedCubeMeasure Q := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + exact H.sq_frobeniusMagnitude x + _ = ∑ i : Fin d, ∫ x, ∑ j : Fin d, (H.hess i j x) ^ 2 + ∂normalizedCubeMeasure Q := by + exact MeasureTheory.integral_finsetSum Finset.univ + (fun i _ => MeasureTheory.integrable_finsetSum Finset.univ + (fun j _ => hint i j)) + _ = ∑ i : Fin d, ∑ j : Fin d, ∫ x, (H.hess i j x) ^ 2 + ∂normalizedCubeMeasure Q := by + apply Finset.sum_congr rfl + intro i _ + exact MeasureTheory.integral_finsetSum Finset.univ (fun j _ => hint i j) + +theorem integral_hess_sq_normalizedCubeMeasure (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) (i j : Fin d) : + ∫ x, (H.hess i j x) ^ 2 ∂normalizedCubeMeasure Q = + (cubeVolume Q)⁻¹ * ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + have hcoord : + ‖H.hessCoordToScalarL2 i j‖ ^ 2 = + ∫ x in openCubeSet Q, (H.hess i j x) ^ 2 ∂MeasureTheory.volume := by + rw [hessCoordToScalarL2, Homogenization.toScalarL2, MeasureTheory.Lp.norm_toLp] + exact toReal_eLpNorm_two_sq_eq_integral_sq (H.hess_memL2 i j) + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + MeasureTheory.integral_smul_measure] + rw [ENNReal.toReal_ofReal (inv_nonneg.mpr (cubeVolume_nonneg Q)), hcoord] + simp only [smul_eq_mul] + +/-- The proof-carrying normalized `L²` value of the pointwise Frobenius +magnitude, on the safe half-open carrier of a cube. -/ +noncomputable def frobeniusMagnitudeNormalizedLpNorm (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : ℝ := + (cubeBoundedMeasurableDomain Q).normalizedLpNorm (2 : ℝ≥0∞) + H.frobeniusMagnitude (by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using H.frobeniusMagnitude_memLp_normalizedCubeMeasure Q) + +/-- Literal manuscript formula for the proof-carrying normalized Frobenius +`L²` value. -/ +theorem frobeniusMagnitudeNormalizedLpNorm_eq_integral (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusMagnitudeNormalizedLpNorm Q = + (∫ x, H.frobeniusMagnitude x ^ (2 : ℝ) ∂normalizedCubeMeasure Q) ^ + (1 / (2 : ℝ)) := by + unfold frobeniusMagnitudeNormalizedLpNorm + rw [BoundedMeasurableDomain.normalizedLpNorm_eq_normalizedLpMoment_rpow + (cubeBoundedMeasurableDomain Q) (2 : ℝ≥0∞) (by norm_num) (by simp)] + simp only [BoundedMeasurableDomain.normalizedLpMoment, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + ENNReal.toReal_ofNat] + norm_num + +theorem frobeniusMagnitudeNormalizedLpNorm_sq (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusMagnitudeNormalizedLpNorm Q ^ 2 = + (cubeVolume Q)⁻¹ * + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + have hmem : MeasureTheory.MemLp H.frobeniusMagnitude (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := + H.frobeniusMagnitude_memLp_normalizedCubeMeasure Q + have hnorm_sq : H.frobeniusMagnitudeNormalizedLpNorm Q ^ 2 = + ∫ x, H.frobeniusMagnitude x ^ 2 ∂normalizedCubeMeasure Q := by + let hmemU : MeasureTheory.MemLp H.frobeniusMagnitude (2 : ℝ≥0∞) + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hmem + unfold frobeniusMagnitudeNormalizedLpNorm + BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + change ((cubeBoundedMeasurableDomain Q).normalizedLpENorm 2 + H.frobeniusMagnitude).toReal ^ 2 = _ + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ + hmemU.aestronglyMeasurable] + simpa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + (toReal_eLpNorm_two_sq_eq_integral_sq hmemU) + calc + H.frobeniusMagnitudeNormalizedLpNorm Q ^ 2 = + ∫ x, H.frobeniusMagnitude x ^ 2 ∂normalizedCubeMeasure Q := hnorm_sq + _ = ∑ i : Fin d, ∑ j : Fin d, + ∫ x, (H.hess i j x) ^ 2 ∂normalizedCubeMeasure Q := + H.integral_frobeniusMagnitude_sq_eq_sum_integral Q + _ = ∑ i : Fin d, ∑ j : Fin d, + (cubeVolume Q)⁻¹ * ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + apply Finset.sum_congr rfl + intro i _ + apply Finset.sum_congr rfl + intro j _ + exact H.integral_hess_sq_normalizedCubeMeasure Q i j + _ = (cubeVolume Q)⁻¹ * + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + rw [Finset.mul_sum] + apply Finset.sum_congr rfl + intro i _ + exact (Finset.mul_sum _ _ _).symm + +/-- The volume-normalized `L²` Frobenius norm of a weak Hessian on an open +cube. The inverse square-root volume factor is explicit. -/ +noncomputable def frobeniusNormalizedL2 (Q : TriadicCube d) + {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : ℝ := + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2) + +/-- Squared characterization of the normalized Frobenius `L²` norm. -/ +theorem frobeniusNormalizedL2_sq + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusNormalizedL2 Q ^ 2 = + (cubeVolume Q)⁻¹ * + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + unfold frobeniusNormalizedL2 + have hvol_nonneg : 0 ≤ (cubeVolume Q)⁻¹ := by + exact inv_nonneg.mpr (cubeVolume_nonneg Q) + have hsum_nonneg : 0 ≤ ∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2 := by + exact Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => sq_nonneg _ + rw [mul_pow] + have hfactor_sq : ((cubeVolume Q)⁻¹ ^ (1 / 2 : ℝ)) ^ 2 = + (cubeVolume Q)⁻¹ := by + rw [← Real.rpow_natCast] + rw [← Real.rpow_mul hvol_nonneg] + norm_num + rw [hfactor_sq] + rw [Real.sq_sqrt hsum_nonneg] + +/-- The Hilbert sum of coordinate `L²` norms is bounded by their `ℓ¹` sum. -/ +theorem sqrt_sum_sq_hessCoordToScalarL2_le_hessianCoordL2NormSum + (H : HasWeakHessianOn U u) : + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2) ≤ H.hessianCoordL2NormSum := by + have hsq : + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 ≤ + (∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) ^ 2 := by + have hrow : ∀ i : Fin d, + ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 ≤ + (∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) ^ 2 := by + intro i + simpa [pow_two] using + Finset.sum_sq_le_sq_sum_of_nonneg + (s := Finset.univ) (f := fun j => ‖H.hessCoordToScalarL2 i j‖) + (by intro _ _; exact norm_nonneg _) + have hrows_nonneg : ∀ i : Fin d, + 0 ≤ ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ := by + intro i + exact Finset.sum_nonneg fun _ _ => norm_nonneg _ + calc + ∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖ ^ 2 + ≤ ∑ i : Fin d, (∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) ^ 2 := + Finset.sum_le_sum fun i _ => hrow i + _ ≤ (∑ i : Fin d, ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) ^ 2 := by + simpa [pow_two] using + Finset.sum_sq_le_sq_sum_of_nonneg + (s := Finset.univ) + (f := fun i => ∑ j : Fin d, ‖H.hessCoordToScalarL2 i j‖) + (by intro i _; exact hrows_nonneg i) + have hsum_nonneg : 0 ≤ H.hessianCoordL2NormSum := + H.hessianCoordL2NormSum_nonneg + calc + Real.sqrt (∑ i : Fin d, ∑ j : Fin d, + ‖H.hessCoordToScalarL2 i j‖ ^ 2) + ≤ Real.sqrt (H.hessianCoordL2NormSum ^ 2) := Real.sqrt_le_sqrt hsq + _ = H.hessianCoordL2NormSum := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hsum_nonneg] + +/-- Bridge from the Frobenius norm to the older volume-normalized coordinate +`ℓ¹` Hessian norm. -/ +theorem frobeniusNormalizedL2_le_volumeNormalized_hessianCoordL2NormSum + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusNormalizedL2 Q ≤ + ((cubeVolume Q)⁻¹) ^ (1 / 2 : ℝ) * H.hessianCoordL2NormSum := by + unfold frobeniusNormalizedL2 + exact mul_le_mul_of_nonneg_left + H.sqrt_sum_sq_hessCoordToScalarL2_le_hessianCoordL2NormSum + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + +/-- The coordinate Hilbert-sum realization is exactly the proof-carrying +normalized `L²` norm of the pointwise Frobenius magnitude. -/ +theorem frobeniusNormalizedL2_eq_frobeniusMagnitudeNormalizedLpNorm + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusNormalizedL2 Q = H.frobeniusMagnitudeNormalizedLpNorm Q := by + have hleft_nonneg : 0 ≤ H.frobeniusNormalizedL2 Q := by + unfold frobeniusNormalizedL2 + exact mul_nonneg + (Real.rpow_nonneg (inv_nonneg.mpr (cubeVolume_nonneg Q)) _) + (Real.sqrt_nonneg _) + have hright_nonneg : 0 ≤ H.frobeniusMagnitudeNormalizedLpNorm Q := by + unfold frobeniusMagnitudeNormalizedLpNorm + BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + exact ENNReal.toReal_nonneg + apply (sq_eq_sq₀ hleft_nonneg hright_nonneg).mp + rw [H.frobeniusNormalizedL2_sq Q, + H.frobeniusMagnitudeNormalizedLpNorm_sq Q] + +/-- The normalized Frobenius `L²` value does not depend on the particular +weak-Hessian representative of an `H¹` function on an open cube. -/ +theorem frobeniusNormalizedL2_eq_of_hasWeakHessianOn + (Q : TriadicCube d) {v : H1Function (openCubeSet Q)} + (H K : HasWeakHessianOn (openCubeSet Q) v) : + H.frobeniusNormalizedL2 Q = K.frobeniusNormalizedL2 Q := by + have hcoord : ∀ i j : Fin d, + H.hessCoordToScalarL2 i j = K.hessCoordToScalarL2 i j := by + intro i j + apply (Homogenization.toScalarL2_eq_toScalarL2_iff + (H.hess_memL2 i j) (K.hess_memL2 i j)).mpr + exact HasWeakPartialDerivOn.ae_eq (isOpen_openCubeSet Q) + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((H.hess_memL2 i j).locallyIntegrable (by norm_num))) + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((K.hess_memL2 i j).locallyIntegrable (by norm_num))) + (H.weak_second i j) (K.weak_second i j) + unfold frobeniusNormalizedL2 + congr 3 + funext i + apply Finset.sum_congr rfl + intro j _ + rw [hcoord i j] + +end HasWeakHessianOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/ZeroTraceAverages.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/ZeroTraceAverages.lean new file mode 100644 index 0000000000..2d7288ed4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Foundations/ZeroTraceAverages.lean @@ -0,0 +1,378 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.CubeMetric +public import LeanPool.CoarseGraining.Homogenization.Multiscale.CubeAverage +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal + +/-! # Zero Trace Averages -/ + +@[expose] public section + +namespace Homogenization + +theorem IsPotentialZeroTraceOn.integral_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f : Vec d → Vec d} (hf : IsPotentialZeroTraceOn U f) : + (fun i => ∫ x in U, f x i ∂MeasureTheory.volume) = 0 := by + rcases hf with ⟨u, rfl⟩ + ext i + let μ := MeasureTheory.volume.restrict U + let D : ℕ → Vec d → ℝ := fun m x => (fderiv ℝ (u.approx m) x) (basisVec i) + have hD_integrable : ∀ m, MeasureTheory.Integrable (D m) MeasureTheory.volume := by + intro m + have hcont : Continuous (D m) := by + simpa [D] using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + have hcomp : HasCompactSupport (D m) := by + simpa [D] using (u.approx_hasCompactSupport m).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcont.integrable_of_hasCompactSupport hcomp + have hD_integrable_restrict : + ∀ᶠ m in Filter.atTop, MeasureTheory.Integrable (D m) μ := by + refine Filter.Eventually.of_forall ?_ + intro m + simpa [MeasureTheory.IntegrableOn, μ] using (hD_integrable m).integrableOn (s := U) + have hD_zero : ∀ m, ∫ x, D m x ∂μ = 0 := by + intro m + have happrox_integrable : MeasureTheory.Integrable (u.approx m) MeasureTheory.volume := by + exact (u.approx_smooth m).continuous.integrable_of_hasCompactSupport + (u.approx_hasCompactSupport m) + have hfull : + ∫ x, D m x ∂MeasureTheory.volume = 0 := by + have h := + integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + (μ := MeasureTheory.volume) + (f := fun _ : Vec d => (1 : ℝ)) + (g := u.approx m) + (v := basisVec i) + (by simp) + (by simpa [D] using hD_integrable m) + (by simpa using happrox_integrable) + (fun x _ => (differentiable_const (1 : ℝ)).differentiableAt) + (fun x _ => (u.approx_smooth m).differentiable (by simp) x) + simpa [D] using h + have hzero_off : ∀ x, x ∉ U → D m x = 0 := by + intro x hx + have hnot : x ∉ tsupport (u.approx m) := fun hx' => hx (u.approx_support_subset m hx') + have hfderiv : fderiv ℝ (u.approx m) x = 0 := fderiv_of_notMem_tsupport (𝕜 := ℝ) hnot + simpa [D] using congrArg (fun L => L (basisVec i)) hfderiv + have hset : + ∫ x in U, D m x ∂MeasureTheory.volume = + ∫ x, D m x ∂MeasureTheory.volume := + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero_off + simpa [μ] using hset.trans hfull + have hfi : MeasureTheory.Integrable (fun x => u.toH1Function.grad x i) μ := by + simpa [μ] using + (u.toH1Function.gradMemL2 i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + have hDiffMeas : + ∀ m, MeasureTheory.AEStronglyMeasurable (fun x => D m x - u.toH1Function.grad x i) μ := by + intro m + have hDm : + MeasureTheory.AEStronglyMeasurable (D m) μ := by + have hInt : MeasureTheory.Integrable (D m) μ := by + simpa [MeasureTheory.IntegrableOn, μ] using (hD_integrable m).integrableOn (s := U) + exact hInt.aestronglyMeasurable + exact hDm.sub (u.toH1Function.gradMemL2 i).aestronglyMeasurable + have hL1_bound : + ∀ m, + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 1 μ ≤ + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2) := by + intro m + simpa using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ + (μ := μ) + (f := fun x => D m x - u.toH1Function.grad x i) + (p := (1 : ENNReal)) + (q := (2 : ENNReal)) + (by norm_num) + (hDiffMeas m)) + have hConst_ne_top : μ Set.univ ^ ((1 : ℝ) - 1 / 2) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by norm_num) ?_).ne + simpa [μ] using (MeasureTheory.measure_lt_top μ Set.univ).ne + have hL1 : + Filter.Tendsto + (fun m => MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun m => + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) + Filter.atTop + (nhds (0 * (μ Set.univ ^ ((1 : ℝ) - 1 / 2)))) := by + exact ENNReal.Tendsto.mul_const (u.tendsto_approx_grad i) (Or.inr hConst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun m => + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) + Filter.atTop (nhds 0) := by + simpa [zero_mul] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 + (fun _ => zero_le) + hL1_bound + have hconv : + Filter.Tendsto + (fun m => ∫ x, D m x ∂μ) + Filter.atTop + (nhds (∫ x, u.toH1Function.grad x i ∂μ)) := + MeasureTheory.tendsto_integral_of_L1' + (μ := μ) + (f := fun x => u.toH1Function.grad x i) + hD_integrable_restrict + hL1 + have hEq : (fun m => ∫ x, D m x ∂μ) = fun _ => (0 : ℝ) := by + funext m + exact hD_zero m + have hzero_tendsto : + Filter.Tendsto (fun _ : ℕ => (0 : ℝ)) Filter.atTop + (nhds (∫ x, u.toH1Function.grad x i ∂μ)) := by + simpa [hEq] using hconv + have hIntegralZero : ∫ x, u.toH1Function.grad x i ∂μ = 0 := + tendsto_nhds_unique hzero_tendsto tendsto_const_nhds + change ∫ x in U, u.toH1Function.grad x i ∂MeasureTheory.volume = 0 + simpa [μ] using hIntegralZero + +namespace H10Function + +/-- Zero-trace `H¹` functions have vanishing componentwise average gradient. -/ +theorem averageGradient_eq_zero + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (u : H10Function U) : + u.toH1Function.averageGradient = 0 := by + exact H1Function.averageGradient_eq_zero_of_integral_eq_zero u.toH1Function + (IsPotentialZeroTraceOn.integral_eq_zero u.isPotentialZeroTraceOn) + +/-- Domain-regularity wrapper for `H10Function.averageGradient_eq_zero`. -/ +theorem averageGradient_eq_zero_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (_hU : IsSobolevRegularDomain U) (u : H10Function U) : + u.toH1Function.averageGradient = 0 := by + simpa using u.averageGradient_eq_zero + +end H10Function + +private theorem fderiv_centeredCoord_apply_basisVec + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) (x : Vec d) : + (fderiv ℝ (fun y : Vec d => y i - cubeCenter Q i) x) (basisVec j) = + basisVec j i := by + have hcoord : + fderiv ℝ (fun y : Vec d => y i) x = + (ContinuousLinearMap.proj (R := ℝ) (φ := fun _ : Fin d => ℝ) i) := by + exact ContinuousLinearMap.fderiv (𝕜 := ℝ) + (ContinuousLinearMap.proj (R := ℝ) (φ := fun _ : Fin d => ℝ) i) + have hconst : + fderiv ℝ (fun _ : Vec d => cubeCenter Q i) x = 0 := by + simp + have hd : + fderiv ℝ ((fun y : Vec d => y i) - (fun _ : Vec d => cubeCenter Q i)) x = + fderiv ℝ (fun y : Vec d => y i) x - + fderiv ℝ (fun _ : Vec d => cubeCenter Q i) x := by + exact fderiv_sub + ((ContinuousLinearMap.proj (R := ℝ) (φ := fun _ : Fin d => ℝ) i).differentiableAt) + (differentiableAt_const (c := cubeCenter Q i)) + change + (fderiv ℝ ((fun y : Vec d => y i) - (fun _ : Vec d => cubeCenter Q i)) x) + (basisVec j) = basisVec j i + rw [hd, hcoord, hconst] + simp + +private theorem fderiv_centeredCoord_apply_basisVec_self + {d : ℕ} (Q : TriadicCube d) (i : Fin d) (x : Vec d) : + (fderiv ℝ (fun y : Vec d => y i - cubeCenter Q i) x) (basisVec i) = 1 := by + simpa [basisVec] using fderiv_centeredCoord_apply_basisVec Q i i x + +private theorem centeredCoord_memLp_top_cubeSet + {d : ℕ} (Q : TriadicCube d) (i : Fin d) : + MeasureTheory.MemLp (fun x : Vec d => x i - cubeCenter Q i) + (⊤ : ENNReal) (MeasureTheory.volume.restrict (cubeSet Q)) := by + let φ : Vec d → ℝ := fun x => x i - cubeCenter Q i + have hφ_cont : Continuous φ := by + dsimp [φ] + fun_prop + refine MeasureTheory.memLp_top_of_bound + (μ := MeasureTheory.volume.restrict (cubeSet Q)) + hφ_cont.aestronglyMeasurable (cubeRadius Q) ?_ + rw [MeasureTheory.ae_restrict_iff' (measurableSet_cubeSet Q)] + exact Filter.Eventually.of_forall fun x hx => by + have hxball : x ∈ Metric.closedBall (cubeCenter Q) (cubeRadius Q) := + cubeSet_subset_closedBall Q hx + have hdist : ‖x - cubeCenter Q‖ ≤ cubeRadius Q := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hxball + have hcoord : ‖(x - cubeCenter Q) i‖ ≤ ‖x - cubeCenter Q‖ := + norm_le_pi_norm (x - cubeCenter Q) i + calc + ‖φ x‖ = ‖(x - cubeCenter Q) i‖ := by + simp [φ, Pi.sub_apply] + _ ≤ ‖x - cubeCenter Q‖ := hcoord + _ ≤ cubeRadius Q := hdist + +private theorem centeredCoord_fderiv_memLp_top_cubeSet + {d : ℕ} (Q : TriadicCube d) (i j : Fin d) : + MeasureTheory.MemLp + (fun x : Vec d => + (fderiv ℝ (fun y : Vec d => y i - cubeCenter Q i) x) (basisVec j)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict (cubeSet Q)) := by + have hcont : + Continuous + (fun x : Vec d => + (fderiv ℝ (fun y : Vec d => y i - cubeCenter Q i) x) (basisVec j)) := by + have hφ : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => y i - cubeCenter Q i) := by + fun_prop + simpa using (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + refine MeasureTheory.memLp_top_of_bound + (μ := MeasureTheory.volume.restrict (cubeSet Q)) + hcont.aestronglyMeasurable (1 : ℝ) ?_ + exact Filter.Eventually.of_forall fun x => by + rw [fderiv_centeredCoord_apply_basisVec Q i j x] + by_cases hji : j = i + · have hb : basisVec j i = 1 := by + simp [basisVec_apply, hji] + rw [hb] + norm_num + · have hb : basisVec j i = 0 := by + have hij : i ≠ j := fun hij => hji hij.symm + simp [basisVec_apply, hij] + rw [hb] + norm_num + +/-- On a half-open cube, the scalar average of an `H¹₀` function is a +coordinate-gradient pairing against the centered coordinate. -/ +theorem cubeAverage_eq_neg_cubeAverage_grad_mul_centeredCoord_of_h10OnCube + {d : ℕ} (Q : TriadicCube d) (u : H10Function (cubeSet Q)) (i : Fin d) : + cubeAverage Q (fun x => u.toH1Function.toFun x) = + - cubeAverage Q (fun x => + u.toH1Function.grad x i * (x i - cubeCenter Q i)) := by + let : Fact (MeasureTheory.volume (cubeSet Q) < ⊤) := + ⟨volume_cubeSet_lt_top Q⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet Q)) + infer_instance + let φ : Vec d → ℝ := fun x => x i - cubeCenter Q i + have hφ : ContDiff ℝ (⊤ : ℕ∞) φ := by + dsimp [φ] + fun_prop + have hφ_memTop : + MeasureTheory.MemLp φ (⊤ : ENNReal) + (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [φ] using centeredCoord_memLp_top_cubeSet Q i + have hdφ_memTop : + ∀ j : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec j)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict (cubeSet Q)) := by + intro j + simpa [φ] using centeredCoord_fderiv_memLp_top_cubeSet Q i j + let w : H10Function (cubeSet Q) := u.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop + have hwavg : w.toH1Function.averageGradient = 0 := w.averageGradient_eq_zero + have hvol : (MeasureTheory.volume (cubeSet Q)).toReal ≠ 0 := by + rw [volume_cubeSet_toReal] + exact (cubeVolume_pos Q).ne' + have hzero_vec : + (fun k => ∫ x in cubeSet Q, w.toH1Function.grad x k ∂MeasureTheory.volume) = 0 := + H1Function.integral_eq_zero_of_averageGradient_eq_zero + w.toH1Function hvol hwavg + have hzero : + ∫ x in cubeSet Q, + (φ x * u.toH1Function.grad x i + + u.toH1Function.toFun x * + (fderiv ℝ φ x) (basisVec i)) ∂MeasureTheory.volume = 0 := by + have hzeroi := + congrFun hzero_vec i + simpa [w, H10Function.mulContDiffMemLpTop_grad] using hzeroi + have hzero' : + ∫ x in cubeSet Q, + (φ x * u.toH1Function.grad x i + + u.toH1Function.toFun x) ∂MeasureTheory.volume = 0 := by + simpa [φ, fderiv_centeredCoord_apply_basisVec_self Q i] using hzero + have hu_int : + MeasureTheory.IntegrableOn (fun x => u.toH1Function.toFun x) + (cubeSet Q) MeasureTheory.volume := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (u.toH1Function.memL2.integrable (by norm_num : (1 : ENNReal) ≤ 2)) + have hgrad_mul_int : + MeasureTheory.IntegrableOn + (fun x => φ x * u.toH1Function.grad x i) + (cubeSet Q) MeasureTheory.volume := by + have hmem : + MeasureTheory.MemLp (fun x => φ x * u.toH1Function.grad x i) + (2 : ENNReal) (MeasureTheory.volume.restrict (cubeSet Q)) := by + simpa [mul_comm] using (u.toH1Function.gradMemL2 i).mul' hφ_memTop + simpa [MeasureTheory.IntegrableOn] using + (hmem.integrable (by norm_num : (1 : ENNReal) ≤ 2)) + have hsplit : + ∫ x in cubeSet Q, + (φ x * u.toH1Function.grad x i + u.toH1Function.toFun x) + ∂MeasureTheory.volume = + ∫ x in cubeSet Q, φ x * u.toH1Function.grad x i ∂MeasureTheory.volume + + ∫ x in cubeSet Q, u.toH1Function.toFun x ∂MeasureTheory.volume := by + exact MeasureTheory.integral_add hgrad_mul_int hu_int + have hint_eq : + ∫ x in cubeSet Q, u.toH1Function.toFun x ∂MeasureTheory.volume = + -∫ x in cubeSet Q, φ x * u.toH1Function.grad x i ∂MeasureTheory.volume := by + nlinarith [hzero', hsplit] + have hmul_eq : + ∫ x in cubeSet Q, φ x * u.toH1Function.grad x i ∂MeasureTheory.volume = + ∫ x in cubeSet Q, + u.toH1Function.grad x i * (x i - cubeCenter Q i) ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun (measurableSet_cubeSet Q) + intro x hx + simp [φ] + ring + calc + cubeAverage Q (fun x => u.toH1Function.toFun x) + = (cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, u.toH1Function.toFun x ∂MeasureTheory.volume := rfl + _ = (cubeVolume Q)⁻¹ * + (-(∫ x in cubeSet Q, φ x * u.toH1Function.grad x i ∂MeasureTheory.volume)) := by + rw [hint_eq] + _ = -((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, φ x * u.toH1Function.grad x i ∂MeasureTheory.volume) := by + ring + _ = -((cubeVolume Q)⁻¹ * + ∫ x in cubeSet Q, + u.toH1Function.grad x i * (x i - cubeCenter Q i) ∂MeasureTheory.volume) := by + rw [hmul_eq] + _ = - cubeAverage Q (fun x => + u.toH1Function.grad x i * (x i - cubeCenter Q i)) := rfl + +theorem IsSolenoidalZeroNormalTraceOn.integral_eq_zero + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {g : Vec d → Vec d} (hg : IsSolenoidalZeroNormalTraceOn U g) : + (fun i => ∫ x in U, g x i ∂MeasureTheory.volume) = 0 := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + ext i + have htest : + ∫ x in U, vecDot (g x) (basisVec i) ∂MeasureTheory.volume = 0 := by + simpa using hg (H1Function.coordOnIsSobolevRegularDomain hU i) + simpa [vecDot, basisVec_apply] using htest + +theorem cubeAverageVec_grad_eq_zero_of_h10OnCube {d : ℕ} + (Q : TriadicCube d) (u : H10Function (cubeSet Q)) : + cubeAverageVec Q (fun x => u.toH1Function.grad x) = 0 := by + let : Fact (MeasureTheory.volume (cubeSet Q) < ⊤) := + ⟨volume_cubeSet_lt_top Q⟩ + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet Q)) := by + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict (cubeSet Q)) + infer_instance + funext i + have hzero : + (fun i => ∫ x in cubeSet Q, u.toH1Function.grad x i ∂MeasureTheory.volume) = 0 := + IsPotentialZeroTraceOn.integral_eq_zero u.isPotentialZeroTraceOn + have hzeroi : ∫ x in cubeSet Q, u.toH1Function.grad x i ∂MeasureTheory.volume = 0 := by + simpa using congrFun hzero i + unfold cubeAverageVec cubeAverage + rw [hzeroi] + simp + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional.lean new file mode 100644 index 0000000000..55263bf5bf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeDivergenceRescaling +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZFullNorm +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalGradientMemLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ClassicalDualComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoLpBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanGagliardoCoordinateBridgeP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspDilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspExactOverlapFullControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLegacyCircComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLpMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspNegativeLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspPowerTwoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualBesovBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualFieldPairing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualNegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanFullComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpDisjointBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePDepthTriangle +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePFullCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePGlobalBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePHomogeneity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePOneDepthCZ +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPDESplitting +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPoincareDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarPComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.JensenStep +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapCount +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.PairCapture +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.TailSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/AssemblyPieces.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/AssemblyPieces.lean new file mode 100644 index 0000000000..bc93482d2f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/AssemblyPieces.lean @@ -0,0 +1,114 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp + +/-! +# Assembly pieces for the Besov-to-Gagliardo direction + +Three small bridges used by the final estimate: + +* `MemWsp`-side restriction: global `L^p` membership on the parent cube + restricts to every enlarged center cube (with the normalization change + absorbed into a finite scalar); +* the kernel identification: the `p`-th enorm power of the Gagliardo kernel + is exactly the distance power times the difference power (U4); +* the lintegral of the Gagliardo product measure as a normalized plain + product integral. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory ScalarOverlap +open scoped ENNReal + +variable {d : ℕ} + +/-- Restriction step: `L^p` membership for the parent's normalized measure +implies membership for every center's normalized enlarged-cube measure. -/ +theorem memLp_overlap_of_memLp {Q : TriadicCube d} {p : ℝ≥0∞} + {u : Vec d → ℝ} (hu : MemLp u p (normalizedCubeMeasure Q)) + {j : ℕ} {S : TriadicCube d} (hS : S ∈ ScalarOverlap.centersAtDepth Q j) : + MemLp u p (ScalarOverlap.normalizedCubeMeasure S) := by + have hsub : ScalarOverlap.cubeSet S ⊆ Homogenization.cubeSet Q := + cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + -- the enlarged normalized measure is dominated by a finite multiple of the + -- parent normalized measure + have hdom : ScalarOverlap.normalizedCubeMeasure S ≤ + (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) • normalizedCubeMeasure Q := by + rw [ScalarOverlap.normalizedCubeMeasure, Homogenization.normalizedCubeMeasure] + rw [smul_smul] + have hvolQ : (0 : ℝ) < cubeVolume Q := cubeVolume_pos Q + have hcancel : + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal (cubeVolume Q)⁻¹ = + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ := by + rw [mul_assoc, ← ENNReal.ofReal_mul hvolQ.le, + mul_inv_cancel₀ hvolQ.ne', ENNReal.ofReal_one, mul_one] + rw [hcancel] + refine Measure.le_iff'.2 fun A => ?_ + simp only [Measure.smul_apply, smul_eq_mul] + refine mul_le_mul_right ?_ _ + have hres : ScalarOverlap.cubeMeasure S ≤ Homogenization.cubeMeasure Q := by + rw [ScalarOverlap.cubeMeasure, Homogenization.cubeMeasure] + exact Measure.restrict_mono hsub le_rfl + exact Measure.le_iff'.1 hres A + have hfin : (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top + exact ((hu.smul_measure hfin).mono_measure hdom) + +/-- U4 (kernel identification): pointwise, the `p`-th enorm power of the +Gagliardo kernel splits into the distance power times the difference power. +Both sides vanish on the diagonal, so no case split is needed downstream. -/ +theorem enorm_gagliardoKernel_rpow (s : ℝ) {p : ℝ≥0∞} (hp0 : p ≠ 0) + (hpt : p ≠ ∞) (u : Vec d → ℝ) (z : Vec d × Vec d) : + ‖gagliardoKernel s p u z‖ₑ ^ p.toReal = + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal := by + have hpr : (0 : ℝ) < p.toReal := ENNReal.toReal_pos hp0 hpt + have hdist : (0 : ℝ) ≤ dist z.1 z.2 := dist_nonneg + rw [gagliardoKernel_apply] + rw [enorm_smul] + rw [ENNReal.mul_rpow_of_nonneg _ _ hpr.le] + congr 1 + -- scalar factor: ‖dist ^ (-kernelExponent)‖ₑ ^ pr = ofReal (dist ^ (-(s pr + d))) + have hker : -kernelExponent d s p * p.toReal = -(s * p.toReal + d) := by + rw [kernelExponent, neg_mul, add_mul, div_mul_cancel₀ _ hpr.ne'] + rw [Real.enorm_eq_ofReal_abs, + abs_of_nonneg (Real.rpow_nonneg hdist _), + ENNReal.ofReal_rpow_of_nonneg (Real.rpow_nonneg hdist _) hpr.le, + ← Real.rpow_mul hdist, hker] + +/-- The Gagliardo cube measure integrates as the volume-normalized plain +product integral over `Q ×ˢ Q`. -/ +theorem lintegral_gagliardoCubeMeasure_eq (Q : TriadicCube d) + (f : Vec d × Vec d → ℝ≥0∞) : + (∫⁻ z, f z ∂gagliardoCubeMeasure Q) = + ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, f z + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := by + have : SFinite (Homogenization.cubeMeasure Q) := by + unfold Homogenization.cubeMeasure + infer_instance + rw [gagliardoCubeMeasure, Homogenization.normalizedCubeMeasure, + Measure.prod_smul_left, lintegral_smul_measure] + congr 1 + rw [Homogenization.cubeMeasure, Measure.prod_restrict] + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/BesovLeGagliardo.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/BesovLeGagliardo.lean new file mode 100644 index 0000000000..7a7a550540 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/BesovLeGagliardo.lean @@ -0,0 +1,628 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.JensenStep +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.TailSummation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Full + +/-! +# Besov-to-Gagliardo comparison: the partial overlap Besov seminorm is +controlled by the fractional Sobolev seminorm + +Main result (`ofReal_partialSeminorm_rpow_le_gagliardo`): for every depth +truncation `N`, the `p`-th power of the diagonal overlap Besov partial +seminorm is at most `2 * 3^d` times the `p`-th power of the volume-normalized +Gagliardo seminorm. The constant is purely dimensional. + +Proof skeleton: the `ℝ≥0∞` bridge (`ENNRealBridge`) rewrites the partial +seminorm power as a sum of depth pieces; Jensen (`JensenStep`) bounds each +per-cube oscillation by a doubled difference integral; the depth coefficient +collapses (scale bookkeeping + the `3^{dj}` center count); the per-pair +backwards geometric tail (`TailSummation`) and the bounded-overlap count +(`OverlapIntegral`) convert the depth sum into the Gagliardo kernel integral +(`AssemblyPieces`). +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory ScalarOverlap +open scoped ENNReal BigOperators + +variable {d : ℕ} + +/-- Measurability of the pairwise difference enorm power. -/ +theorem measurable_pair_diff_enorm_rpow {u : Vec d → ℝ} (humeas : Measurable u) + (pr : ℝ) : + Measurable fun z : Vec d × Vec d => ‖u z.1 - u z.2‖ₑ ^ pr := + ENNReal.continuous_rpow_const.measurable.comp + (((humeas.comp measurable_fst).sub (humeas.comp measurable_snd)).enorm) + +/-- Multiplying by a `0/1` indicator inside a lintegral restricts the domain. -/ +theorem lintegral_indicator_one_mul {α : Type*} [MeasurableSpace α] + {μ : Measure α} {A : Set α} (hA : MeasurableSet A) (G : α → ℝ≥0∞) : + (∫⁻ z, A.indicator (fun _ => (1 : ℝ≥0∞)) z * G z ∂μ) = ∫⁻ z in A, G z ∂μ := by + rw [← lintegral_indicator hA] + refine lintegral_congr fun z => ?_ + by_cases hz : z ∈ A <;> simp [hz] + +/-- Unnormalization: the doubled lintegral against the normalized enlarged-cube +measure is the volume-normalized product set-lintegral. -/ +theorem double_lintegral_normalized_eq (S : TriadicCube d) {pr : ℝ} + {u : Vec d → ℝ} (humeas : Measurable u) : + (∫⁻ x, ∫⁻ y, ‖u x - u y‖ₑ ^ pr ∂(ScalarOverlap.normalizedCubeMeasure S) + ∂(ScalarOverlap.normalizedCubeMeasure S)) = + ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + (ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ pr ∂(volume.prod volume)) := by + have hF : Measurable fun z : Vec d × Vec d => ‖u z.1 - u z.2‖ₑ ^ pr := + measurable_pair_diff_enorm_rpow humeas pr + have hTonelli : + (∫⁻ x in ScalarOverlap.cubeSet S, ∫⁻ y in ScalarOverlap.cubeSet S, + ‖u x - u y‖ₑ ^ pr ∂volume ∂volume) = + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ pr ∂(volume.prod volume) := by + rw [← Measure.prod_restrict] + exact (MeasureTheory.lintegral_prod _ hF.aemeasurable).symm + calc (∫⁻ x, ∫⁻ y, ‖u x - u y‖ₑ ^ pr ∂(ScalarOverlap.normalizedCubeMeasure S) + ∂(ScalarOverlap.normalizedCubeMeasure S)) + = ∫⁻ x, ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ y in ScalarOverlap.cubeSet S, ‖u x - u y‖ₑ ^ pr ∂volume + ∂(ScalarOverlap.normalizedCubeMeasure S) := + lintegral_congr fun x => + ScalarOverlap.lintegral_normalizedCubeMeasure_eq S _ + _ = ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ x, (∫⁻ y in ScalarOverlap.cubeSet S, ‖u x - u y‖ₑ ^ pr ∂volume) + ∂(ScalarOverlap.normalizedCubeMeasure S) := + lintegral_const_mul' _ _ ENNReal.ofReal_ne_top + _ = ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + (ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ x in ScalarOverlap.cubeSet S, ∫⁻ y in ScalarOverlap.cubeSet S, + ‖u x - u y‖ₑ ^ pr ∂volume ∂volume) := by + rw [ScalarOverlap.lintegral_normalizedCubeMeasure_eq S] + _ = ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + (ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ pr ∂(volume.prod volume)) := by + rw [hTonelli] + +/-- Per-center bound (U1 + U2): the `p`-th power of the overlap oscillation is +controlled by the volume-normalized product set-lintegral of differences. -/ +theorem ofReal_oscillation_rpow_le_setProd (S : TriadicCube d) {p : ℝ≥0∞} + (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (ScalarOverlap.normalizedCubeMeasure S)) : + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) ≤ + ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + (ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) * + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume)) := + (ofReal_oscillation_rpow_le S p u).trans + ((eLpNorm_sub_average_rpow_le_double_lintegral S hp hpt hu).trans + (double_lintegral_normalized_eq S humeas).le) + +/-- Real coefficient identity for one depth: weight power times the depth +count inverse times the squared volume inverse collapses to the parent volume +inverse times the kernel scale power. -/ +theorem depth_coeff_identity {cQ : ℝ} (hc : 0 < cQ) (d j : ℕ) (t : ℝ) : + (cQ / 3 ^ j) ^ (-t) * + (((3 : ℝ) ^ (d * j))⁻¹ * + (((cQ / 3 ^ j) ^ d)⁻¹ * ((cQ / 3 ^ j) ^ d)⁻¹)) = + (cQ ^ d)⁻¹ * (cQ / 3 ^ j) ^ (-(t + (d : ℝ))) := by + have h3 : (0 : ℝ) < 3 := by norm_num + have he : (0 : ℝ) < cQ / 3 ^ j := div_pos hc (pow_pos h3 j) + have hlog : Real.log (cQ / 3 ^ j) = Real.log cQ - j * Real.log 3 := by + rw [Real.log_div hc.ne' (pow_ne_zero j h3.ne'), Real.log_pow] + rw [← Real.rpow_natCast (cQ / 3 ^ j) d, ← Real.rpow_natCast (3 : ℝ) (d * j), + ← Real.rpow_natCast cQ d] + simp only [Real.rpow_def_of_pos he, Real.rpow_def_of_pos hc, + Real.rpow_def_of_pos h3, ← Real.exp_neg, ← Real.exp_add] + rw [Real.exp_eq_exp, hlog] + push_cast + ring + +/-- Depth coefficient bound: weight power times center-count inverse times the +squared per-cube volume normalization is at most the parent volume inverse +times the kernel scale power. -/ +theorem depth_coefficient_le (Q : TriadicCube d) (j : ℕ) (s pr : ℝ) : + ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ pr) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹) * + ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹))) ≤ + ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr + (d : ℝ)))) := by + have h3 : (0 : ℝ) < 3 := by norm_num + have hcQ : 0 < cubeScaleFactor Q := cubeScaleFactor_pos' Q + have he : (0 : ℝ) < cubeScaleFactor Q / 3 ^ j := div_pos hcQ (pow_pos h3 j) + -- the center count dominates `3^(d*j)` + have hcard_nat : 3 ^ (d * j) ≤ (ScalarOverlap.centersAtDepth Q j).card := by + calc 3 ^ (d * j) = (3 ^ d) ^ j := by rw [pow_mul] + _ = (descendantsAtDepth Q j).card := (descendantsAtDepth_card Q j).symm + _ ≤ (ScalarOverlap.centersAtDepth Q j).card := + ScalarOverlap.descendantsAtDepth_card_le_centersAtDepth_card Q j + have hcard : ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ ≤ + ENNReal.ofReal (((3 : ℝ) ^ (d * j))⁻¹) := by + rw [ENNReal.ofReal_inv_of_pos (pow_pos h3 _)] + refine ENNReal.inv_le_inv' ?_ + have hcast : ENNReal.ofReal ((3 : ℝ) ^ (d * j)) = + ((3 ^ (d * j) : ℕ) : ℝ≥0∞) := by + rw [← ENNReal.ofReal_natCast] + congr 1 + push_cast + ring + rw [hcast] + exact_mod_cast hcard_nat + -- unfold the weight power + have hw : cubeBesovOverlapDepthWeight Q s j ^ pr = + (cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr)) := by + unfold cubeBesovOverlapDepthWeight cubeBesovDepthWeight + rw [← Real.rpow_mul he.le, neg_mul] + -- nonnegativity facts for `ofReal` multiplication + have hw0 : (0 : ℝ) ≤ (cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr)) := + Real.rpow_nonneg he.le _ + have h30 : (0 : ℝ) ≤ ((3 : ℝ) ^ (d * j))⁻¹ := + inv_nonneg.2 (pow_nonneg h3.le _) + have hv0 : (0 : ℝ) ≤ ((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹ := + inv_nonneg.2 (pow_nonneg he.le _) + calc ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ pr) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹) * + ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹))) + ≤ ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr))) * + (ENNReal.ofReal (((3 : ℝ) ^ (d * j))⁻¹) * + (ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹) * + ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹))) := by + rw [hw] + exact mul_le_mul_right (mul_le_mul_left hcard _) _ + _ = ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr)) * + (((3 : ℝ) ^ (d * j))⁻¹ * + (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹ * + ((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹))) := by + rw [ENNReal.ofReal_mul hw0, ENNReal.ofReal_mul h30, + ENNReal.ofReal_mul hv0] + _ = ENNReal.ofReal (((cubeScaleFactor Q) ^ d)⁻¹ * + (cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr + (d : ℝ)))) := by + rw [depth_coeff_identity hcQ d j (s * pr)] + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr + (d : ℝ)))) := by + rw [cubeVolume_eq_scaleFactor_pow, + ENNReal.ofReal_mul (inv_nonneg.2 (pow_nonneg hcQ.le d))] + +/-- Per-depth bound: the `p`-th power of one depth seminorm is controlled by +the kernel-scale-weighted sum of product set-lintegrals over the centers. -/ +theorem ofReal_depthSeminorm_rpow_le_sum (Q : TriadicCube d) {s : ℝ} + {p : ℝ≥0∞} (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} + (humeas : Measurable u) (hu : MemLp u p (normalizedCubeMeasure Q)) + (j : ℕ) : + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) ≤ + ENNReal.ofReal ((cubeVolume Q)⁻¹) * + (ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume)) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + set v : ℝ≥0∞ := ENNReal.ofReal (((cubeScaleFactor Q / 3 ^ j) ^ d)⁻¹) with hv_def + set I : TriadicCube d → ℝ≥0∞ := fun S => + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume) with hI_def + -- per-center bound with the constant volume factor + have hper : ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) ≤ + v * (v * I S) := by + intro S hS + have hvol : ScalarOverlap.cubeVolume S = + (cubeScaleFactor Q / 3 ^ j) ^ d := by + unfold ScalarOverlap.cubeVolume + rw [ScalarOverlap.scaleFactor_eq_cubeScaleFactor_div_pow_of_mem_centersAtDepth hS] + have h := ofReal_oscillation_rpow_le_setProd S hp hpt humeas + (memLp_overlap_of_memLp hu hS) + rwa [hvol] at h + rw [ofReal_depthSeminorm_rpow_eq Q s hp0 hpt u j, + ofReal_depthAverage_eq Q j p u] + calc ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ p.toReal) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal)) + ≤ ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ p.toReal) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, v * (v * I S)) := + mul_le_mul_right + (mul_le_mul_right (Finset.sum_le_sum hper) _) _ + _ = (ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ p.toReal) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * (v * v))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, I S := by + rw [← Finset.mul_sum] + have : (∑ S ∈ ScalarOverlap.centersAtDepth Q j, v * I S) = + v * ∑ S ∈ ScalarOverlap.centersAtDepth Q j, I S := by + rw [← Finset.mul_sum] + rw [this] + ring + _ ≤ (ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ))))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, I S := + mul_le_mul_left (depth_coefficient_le Q j s p.toReal) _ + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + (ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, I S) := by + rw [mul_assoc] + +/-- Sum of product set-lintegrals over the depth-`j` centers as one lintegral +against the pointwise overlap count. -/ +theorem sum_setLIntegral_eq_lintegral_count (Q : TriadicCube d) (j : ℕ) + {F : Vec d × Vec d → ℝ≥0∞} (hF : Measurable F) : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, F z + ∂(volume.prod volume)) = + ∫⁻ z, (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * F z ∂(volume.prod volume) := by + classical + have hstep1 : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, F z + ∂(volume.prod volume)) = + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z, (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * F z ∂(volume.prod volume) := + Finset.sum_congr rfl fun S _hS => + (lintegral_indicator_one_mul (measurableSet_overlap_prod S) F).symm + have hstep2 : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z, (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * F z ∂(volume.prod volume)) = + ∫⁻ z, ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * F z ∂(volume.prod volume) := + (lintegral_finsetSum (ScalarOverlap.centersAtDepth Q j) fun S _hS => + (measurable_const.indicator (measurableSet_overlap_prod S)).mul hF).symm + rw [hstep1, hstep2] + exact lintegral_congr fun z => (Finset.sum_mul _ _ _).symm + +/-- Backwards geometric tail: over depths whose enlarged side dominates a fixed +positive distance `D`, the kernel scale powers sum to at most `2 * D^(-a)`. -/ +theorem filtered_scale_sum_le (Q : TriadicCube d) {a : ℝ} (ha : 1 ≤ a) + {D : ℝ} (hD : 0 < D) (N : ℕ) : + (∑ j ∈ (Finset.range (N + 1)).filter + (fun j => D ≤ cubeScaleFactor Q / 3 ^ j), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a))) ≤ + 2 * ENNReal.ofReal (D ^ (-a)) := by + classical + have h3 : (0 : ℝ) < 3 := by norm_num + have hcQ : 0 < cubeScaleFactor Q := cubeScaleFactor_pos' Q + set q : ℝ≥0∞ := ENNReal.ofReal ((3 : ℝ) ^ a) with hq_def + set M : ℝ≥0∞ := ENNReal.ofReal ((cubeScaleFactor Q / D) ^ a) with hM_def + -- exponent swap for the two `3`-power readings + have hswap : ∀ j : ℕ, ((3 : ℝ) ^ j) ^ a = ((3 : ℝ) ^ a) ^ j := by + intro j + rw [← Real.rpow_natCast_mul h3.le j a, ← Real.rpow_mul_natCast h3.le a j, + mul_comm] + -- split each scale power into the parent factor times a geometric term + have hsplit : ∀ j : ℕ, + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) = + ENNReal.ofReal (cubeScaleFactor Q ^ (-a)) * q ^ j := by + intro j + have h1 : (cubeScaleFactor Q / 3 ^ j : ℝ) ^ (-a) = + cubeScaleFactor Q ^ (-a) * ((3 : ℝ) ^ a) ^ j := by + rw [Real.div_rpow hcQ.le (pow_nonneg h3.le j), + Real.rpow_neg (pow_nonneg h3.le j), div_inv_eq_mul, hswap j] + rw [h1, ENNReal.ofReal_mul (Real.rpow_nonneg hcQ.le _), + ENNReal.ofReal_pow (Real.rpow_nonneg h3.le _)] + -- ratio facts + have hq3 : (3 : ℝ≥0∞) ≤ q := by + have h33 : ((3 : ℝ≥0∞)) = ENNReal.ofReal (3 : ℝ) := by simp + rw [h33] + refine ENNReal.ofReal_le_ofReal ?_ + calc (3 : ℝ) = 3 ^ (1 : ℝ) := (Real.rpow_one 3).symm + _ ≤ 3 ^ a := Real.rpow_le_rpow_of_exponent_le (by norm_num) ha + have hqt : q ≠ ∞ := ENNReal.ofReal_ne_top + -- each retained geometric term is bounded by `M` + have hM : ∀ j ∈ (Finset.range (N + 1)).filter + (fun j => D ≤ cubeScaleFactor Q / 3 ^ j), q ^ j ≤ M := by + intro j hj + have hd : D ≤ cubeScaleFactor Q / 3 ^ j := (Finset.mem_filter.mp hj).2 + have h3j : (3 : ℝ) ^ j ≤ cubeScaleFactor Q / D := by + rw [le_div_iff₀ hD] + have h1 : D * 3 ^ j ≤ cubeScaleFactor Q := + (le_div_iff₀ (pow_pos h3 j)).1 hd + calc (3 : ℝ) ^ j * D = D * 3 ^ j := mul_comm _ _ + _ ≤ cubeScaleFactor Q := h1 + have hpow : ((3 : ℝ) ^ j) ^ a ≤ (cubeScaleFactor Q / D) ^ a := + Real.rpow_le_rpow (pow_nonneg h3.le j) h3j (by linarith) + calc q ^ j = ENNReal.ofReal (((3 : ℝ) ^ a) ^ j) := + (ENNReal.ofReal_pow (Real.rpow_nonneg h3.le _) j).symm + _ = ENNReal.ofReal (((3 : ℝ) ^ j) ^ a) := by rw [hswap j] + _ ≤ M := ENNReal.ofReal_le_ofReal hpow + have htail := sum_pow_le_two_mul_of_forall_le hq3 hqt hM + calc (∑ j ∈ (Finset.range (N + 1)).filter + (fun j => D ≤ cubeScaleFactor Q / 3 ^ j), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a))) + = ∑ j ∈ (Finset.range (N + 1)).filter + (fun j => D ≤ cubeScaleFactor Q / 3 ^ j), + ENNReal.ofReal (cubeScaleFactor Q ^ (-a)) * q ^ j := + Finset.sum_congr rfl fun j _ => hsplit j + _ = ENNReal.ofReal (cubeScaleFactor Q ^ (-a)) * + ∑ j ∈ (Finset.range (N + 1)).filter + (fun j => D ≤ cubeScaleFactor Q / 3 ^ j), q ^ j := + (Finset.mul_sum _ _ _).symm + _ ≤ ENNReal.ofReal (cubeScaleFactor Q ^ (-a)) * (2 * M) := + mul_le_mul_right htail _ + _ = 2 * (ENNReal.ofReal (cubeScaleFactor Q ^ (-a)) * M) := by ring + _ = 2 * ENNReal.ofReal (D ^ (-a)) := by + rw [hM_def, ← ENNReal.ofReal_mul (Real.rpow_nonneg hcQ.le _)] + congr 1 + rw [Real.div_rpow hcQ.le hD.le, Real.rpow_neg hcQ.le, + Real.rpow_neg hD.le, div_eq_mul_inv, ← mul_assoc, + inv_mul_cancel₀ (Real.rpow_pos_of_pos hcQ a).ne', one_mul] + +/-- Pointwise pair bound: for each pair `z`, the depth sum of kernel-scale +powers times overlap counts times the difference power is controlled by the +distance power on the parent product cube, with constant `2 * 3^d`. -/ +theorem pointwise_pair_sum_le (Q : TriadicCube d) {a pr : ℝ} (ha : 1 ≤ a) + (hpr : 0 < pr) (u : Vec d → ℝ) (N : ℕ) (z : Vec d × Vec d) : + (∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) * + ((∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ pr)) ≤ + 2 * 3 ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + (ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * ‖u z.1 - u z.2‖ₑ ^ pr)) := by + classical + by_cases hz : z.1 = z.2 + · -- diagonal: the difference power vanishes + have hFz : ‖u z.1 - u z.2‖ₑ ^ pr = 0 := by + rw [hz, sub_self, enorm_zero] + exact ENNReal.zero_rpow_of_pos hpr + simp [hFz] + · have hdist : 0 < dist z.1 z.2 := dist_pos.2 hz + -- per-depth bound, filtered by the scale capture condition + have hterm : ∀ j ∈ Finset.range (N + 1), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) * + ((∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ pr) ≤ + (if dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ j then + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) + else 0) * + ((3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + ‖u z.1 - u z.2‖ₑ ^ pr)) := by + intro j _hj + by_cases hcnt : (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) = 0 + · rw [hcnt, zero_mul, mul_zero] + exact zero_le + · -- a nonzero count produces a capturing center + obtain ⟨S, hS, hSne⟩ := Finset.exists_ne_zero_of_sum_ne_zero hcnt + have hzS : z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S := by + by_contra hmem + exact hSne (Set.indicator_of_notMem hmem _) + have hd : dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ j := by + calc dist z.1 z.2 ≤ 3 * cubeScaleFactor S := + dist_le_of_mem_overlapCubeSet hzS.1 hzS.2 + _ = ScalarOverlap.scaleFactor S := rfl + _ = cubeScaleFactor Q / 3 ^ j := + ScalarOverlap.scaleFactor_eq_cubeScaleFactor_div_pow_of_mem_centersAtDepth hS + rw [if_pos hd] + refine mul_le_mul_right ?_ _ + calc (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * ‖u z.1 - u z.2‖ₑ ^ pr + ≤ ((3 : ℝ≥0∞) ^ d * + (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z) * ‖u z.1 - u z.2‖ₑ ^ pr := + mul_le_mul_left (sum_indicator_overlap_prod_le Q j z) _ + _ = (3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * ‖u z.1 - u z.2‖ₑ ^ pr) := + mul_assoc _ _ _ + -- sum the per-depth bounds and run the geometric tail + calc (∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) * + ((∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ pr)) + ≤ ∑ j ∈ Finset.range (N + 1), + (if dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ j then + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a)) + else 0) * + ((3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + ‖u z.1 - u z.2‖ₑ ^ pr)) := + Finset.sum_le_sum hterm + _ = (∑ j ∈ (Finset.range (N + 1)).filter + (fun j => dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ j), + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-a))) * + ((3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + ‖u z.1 - u z.2‖ₑ ^ pr)) := by + rw [Finset.sum_filter, Finset.sum_mul] + _ ≤ (2 * ENNReal.ofReal (dist z.1 z.2 ^ (-a))) * + ((3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + ‖u z.1 - u z.2‖ₑ ^ pr)) := + mul_le_mul_left (filtered_scale_sum_le Q ha hdist N) _ + _ = 2 * 3 ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + (ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * + ‖u z.1 - u z.2‖ₑ ^ pr)) := by + ring + +/-- **Besov-to-Gagliardo comparison** (truncated form): the `p`-th power of +the diagonal overlap Besov partial seminorm is at most `2 * 3^d` times the +`p`-th power of the volume-normalized Gagliardo seminorm, uniformly in the +truncation depth `N`. -/ +theorem ofReal_partialSeminorm_rpow_le_gagliardo [NeZero d] + (Q : TriadicCube d) {s : ℝ} (hs : 0 ≤ s) {p : ℝ≥0∞} (hp : 1 ≤ p) + (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) (N : ℕ) : + ENNReal.ofReal (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) ≤ + 2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal := by + classical + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + have hd1 : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast Nat.one_le_iff_ne_zero.mpr (NeZero.ne d) + have ha1 : 1 ≤ s * p.toReal + (d : ℝ) := by + have := mul_nonneg hs hpr.le + linarith + have hF : Measurable fun z : Vec d × Vec d => ‖u z.1 - u z.2‖ₑ ^ p.toReal := + measurable_pair_diff_enorm_rpow humeas _ + have hQQ : MeasurableSet + (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) := + (Homogenization.measurableSet_cubeSet Q).prod + (Homogenization.measurableSet_cubeSet Q) + have h23top : (2 * 3 ^ d : ℝ≥0∞) ≠ ∞ := + ENNReal.mul_ne_top (by simp) (ENNReal.pow_ne_top (by simp)) + calc ENNReal.ofReal (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) + = ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := + ofReal_partialSeminorm_rpow_eq Q s hp0 hpt N u + _ ≤ ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal ((cubeVolume Q)⁻¹) * + (ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume)) := + Finset.sum_le_sum fun j _hj => + ofReal_depthSeminorm_rpow_le_sum Q hp hpt humeas hu j + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume) := + (Finset.mul_sum _ _ _).symm + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ∫⁻ z, (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume) := by + congr 1 + refine Finset.sum_congr rfl fun j _hj => ?_ + rw [sum_setLIntegral_eq_lintegral_count Q j hF] + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∑ j ∈ Finset.range (N + 1), + ∫⁻ z, ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ((∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal) ∂(volume.prod volume) := by + congr 1 + refine Finset.sum_congr rfl fun j _hj => ?_ + rw [lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + _ = ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ z, ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * p.toReal + (d : ℝ)))) * + ((∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal) ∂(volume.prod volume) := by + congr 1 + exact (lintegral_finsetSum (Finset.range (N + 1)) fun j _hj => + measurable_const.mul + ((Finset.measurable_sum _ fun S _hS => + measurable_const.indicator (measurableSet_overlap_prod S)).mul hF)).symm + _ ≤ ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ z, 2 * 3 ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + (ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + (d : ℝ)))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal)) ∂(volume.prod volume) := + mul_le_mul_right + (lintegral_mono fun z => pointwise_pair_sum_le Q ha1 hpr u N z) _ + _ = 2 * 3 ^ d * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ z, (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * + (ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + (d : ℝ)))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal) ∂(volume.prod volume)) := by + rw [lintegral_const_mul' (2 * 3 ^ d : ℝ≥0∞) _ h23top] + ring + _ = 2 * 3 ^ d * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + (d : ℝ)))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal ∂(volume.prod volume)) := by + rw [lintegral_indicator_one_mul hQQ] + _ = 2 * 3 ^ d * + (ENNReal.ofReal ((cubeVolume Q)⁻¹) * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + ‖gagliardoKernel s p u z‖ₑ ^ p.toReal ∂(volume.prod volume)) := by + congr 2 + exact lintegral_congr fun z => + (enorm_gagliardoKernel_rpow s hp0 hpt u z).symm + _ = 2 * 3 ^ d * + ∫⁻ z, ‖gagliardoKernel s p u z‖ₑ ^ p.toReal + ∂gagliardoCubeMeasure Q := by + rw [lintegral_gagliardoCubeMeasure_eq Q] + _ = 2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal := by + congr 1 + rw [Internal.cubeGagliardoESeminorm_eq_lintegral hp0 hpt, + ← ENNReal.rpow_mul, one_div_mul_cancel hpr.ne', ENNReal.rpow_one] + +/-- Corollary: when the Gagliardo seminorm is finite, the set of partial +overlap Besov seminorm values is bounded above (uniformly in the depth). -/ +theorem besovOverlapSeminormValueSet_bddAbove_of_gagliardo [NeZero d] + (Q : TriadicCube d) {s : ℝ} (hs : 0 ≤ s) {p : ℝ≥0∞} (hp : 1 ≤ p) + (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) + (hfin : cubeGagliardoESeminorm Q s p u ≠ ∞) : + BddAbove (cubeBesovOverlapSeminormValueSet Q s p p u) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + have hBt : (2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal : ℝ≥0∞) + ≠ ∞ := + ENNReal.mul_ne_top + (ENNReal.mul_ne_top (by simp) (ENNReal.pow_ne_top (by simp))) + (ENNReal.rpow_ne_top_of_nonneg hpr.le hfin) + refine ⟨(2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal + : ℝ≥0∞).toReal ^ (p.toReal)⁻¹, ?_⟩ + rintro x ⟨N, rfl⟩ + have hmain := ofReal_partialSeminorm_rpow_le_gagliardo Q hs hp hpt humeas hu N + have hreal : cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal ≤ + (2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal : ℝ≥0∞).toReal := + (ENNReal.ofReal_le_iff_le_toReal hBt).1 hmain + have hnn : 0 ≤ cubeBesovOverlapPartialSeminorm Q s p p N u := + cubeBesovOverlapPartialSeminorm_nonneg Q s p p N u + calc cubeBesovOverlapPartialSeminorm Q s p p N u + = (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) + ^ (p.toReal)⁻¹ := + (Real.rpow_rpow_inv hnn hpr.ne').symm + _ ≤ ((2 * 3 ^ d * cubeGagliardoESeminorm Q s p u ^ p.toReal + : ℝ≥0∞).toReal) ^ (p.toReal)⁻¹ := + Real.rpow_le_rpow (Real.rpow_nonneg hnn _) hreal (inv_nonneg.2 hpr.le) + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeDivergenceRescaling.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeDivergenceRescaling.lean new file mode 100644 index 0000000000..40714dc75f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeDivergenceRescaling.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CubeVectorH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp + +/-! +# Coefficient rescaling for centered-cube divergence solutions + +This file converts the normalized weak formulation with a positive scalar +coefficient into the raw cube Dirichlet divergence problem with rescaled data. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- Dividing the positive scalar coefficient in the normalized centered-cube +weak formulation gives the raw cube divergence problem with inversely scaled +datum. -/ +theorem centeredCubeH10ScalarDivergenceSolution_to_cubeDirichletDivergenceProblem + {d : ℕ} (m : ℤ) (sigma0 : ℝ) {s : FractionalOrder} + {p : FiniteLpExponent} + (h : CubeEuclideanWspL2Field (originCube d m) s p) + (w : H10Function (openCubeSet (originCube d m))) + (hsigma0 : 0 < sigma0) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 w h.toLpTwo) : + CubeDirichletDivergenceProblem (originCube d m) w + (fun x => sigma0⁻¹ • h.toField x) := by + intro phi + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + have hsol := hsolution phi + change sigma0 * ∫ x, vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume = + -∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(centeredCubeDomain d m).normalizedVolume at hsol + rw [hmeasure, integral_smul_measure, integral_smul_measure, + smul_eq_mul, smul_eq_mul] at hsol + change ∫ x, vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))) = + -∫ x, vecDot (sigma0⁻¹ • h.toField x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))) + simp only [vecDot_smul_left] + change ∫ x, vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))) = + -(∫ x, sigma0⁻¹ • vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m)))) + rw [integral_smul] + have hvol : 0 < cubeVolume (originCube d m) := cubeVolume_pos _ + have hcoeff : + ENNReal.toReal (ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) : ℝ≥0∞) = + (cubeVolume (originCube d m))⁻¹ := by + rw [ENNReal.toReal_ofReal (inv_nonneg.mpr hvol.le)] + rw [hcoeff] at hsol + field_simp [hvol.ne'] at hsol + calc + ∫ x, vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))) = + sigma0⁻¹ * (sigma0 * ∫ x, + vecDot (w.toH1Function.grad x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m)))) := by + field_simp [hsigma0.ne'] + _ = sigma0⁻¹ * (-(∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))))) := by rw [hsol] + _ = -(sigma0⁻¹ * (∫ x, vecDot (h.toField x) (phi.toH1Function.grad x) + ∂(volume.restrict (openCubeSet (originCube d m))))) := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanH2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanH2.lean new file mode 100644 index 0000000000..2cd9cfb387 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanH2.lean @@ -0,0 +1,394 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanHsMeasurability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import Mathlib.Analysis.SpecialFunctions.Pow.NNReal +public import Mathlib.MeasureTheory.Measure.Prod + +/-! +# Exact Euclidean fractional `H^s` on centered triadic cubes + +This module defines the literal physical-cube Gagliardo energy with normalized +volume in its first variable and unnormalized restricted volume in its second. +It then transports that energy to the centered unit cube under +`x ↦ (3 ^ m) • x`. + +## Main definitions + +- `centeredCubeEuclideanHsProductMeasure`: the physical product measure. +- `centeredCubeEuclideanHsEnergy`: the literal physical Euclidean energy. +- `centeredCubeEuclideanHsESeminorm`: its extended square root. +- `MemCenteredCubeEuclideanHs`: measurable finite-energy membership. + +## Main results + +- `centeredCubeEuclideanHsEnergy_eq_scale_mul_pullbackToUnit`: exact + `(3 ^ m) ^ (-2s)` energy scaling. +- `centeredCubeEuclideanHsESeminorm_eq_scale_mul_pullbackToUnit`: exact + `(3 ^ m) ^ (-s)` seminorm scaling. +- `memCenteredCubeEuclideanHs_iff_pullbackToUnit`: exact membership transport. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The source measure `fint_{□_m} dx ∫_{□_m} dy`: normalized volume in +the first variable and unnormalized restricted volume in the second. -/ +noncomputable def centeredCubeEuclideanHsProductMeasure (d : ℕ) (m : ℤ) : + Measure (Vec d × Vec d) := + (centeredCubeDomain d m).normalizedVolume.prod + (centeredCubeDomain d m).restrictedVolume + +/-- The physical product measure is exactly the established Gagliardo cube +measure, with no additional normalization convention. -/ +theorem centeredCubeEuclideanHsProductMeasure_eq_gagliardoCubeMeasure + (d : ℕ) (m : ℤ) : + centeredCubeEuclideanHsProductMeasure d m = + Gagliardo.gagliardoCubeMeasure (originCube d m) := by + unfold centeredCubeEuclideanHsProductMeasure Gagliardo.gagliardoCubeMeasure + rw [show centeredCubeDomain d m = + cubeBoundedMeasurableDomain (originCube d m) by rfl] + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure] + +/-- The literal physical integrand +`|F(x)-F(y)|² / |x-y|^(d + 2s)` on the centered cube at scale `m`. -/ +noncomputable def centeredCubeEuclideanHsIntegrand {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + Vec d × Vec d → ℝ≥0∞ := + fun z => ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + +/-- The squared physical Euclidean fractional quantity. -/ +noncomputable def centeredCubeEuclideanHsEnergy {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + ∫⁻ z, centeredCubeEuclideanHsIntegrand s F z + ∂centeredCubeEuclideanHsProductMeasure d m + +/-- The exact extended Euclidean fractional seminorm on the centered cube. -/ +noncomputable def centeredCubeEuclideanHsESeminorm {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + centeredCubeEuclideanHsEnergy s F ^ ((2 : ℝ)⁻¹) + +/-- Membership in the literal physical centered-cube Euclidean `H^s` carrier. -/ +structure MemCenteredCubeEuclideanHs {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : Prop where + integrand_aemeasurable : + AEMeasurable (centeredCubeEuclideanHsIntegrand s F) + (centeredCubeEuclideanHsProductMeasure d m) + energy_lt_top : centeredCubeEuclideanHsEnergy s F < ∞ + +/-- Formula accessor for the physical squared energy. -/ +theorem centeredCubeEuclideanHsEnergy_eq_lintegral {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsEnergy s F = + ∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂centeredCubeEuclideanHsProductMeasure d m := + rfl + +/-- Formula accessor for the physical extended seminorm. -/ +theorem centeredCubeEuclideanHsESeminorm_eq_lintegral {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsESeminorm s F = + (∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂centeredCubeEuclideanHsProductMeasure d m) ^ ((2 : ℝ)⁻¹) := + rfl + +private theorem ae_restrictedVolume_of_ae_normalizedVolume {d : ℕ} {m : ℤ} + {F G : CenteredCubeEuclideanL2Field d m} + (hFG : F =ᵐ[(centeredCubeDomain d m).normalizedVolume] G) : + F =ᵐ[(centeredCubeDomain d m).restrictedVolume] G := by + rw [BoundedMeasurableDomain.normalizedVolume] at hFG + unfold Filter.EventuallyEq at hFG ⊢ + rw [ae_iff] at hFG ⊢ + rw [Measure.smul_apply, smul_eq_mul, mul_eq_zero, + or_iff_right (ENNReal.inv_ne_zero.mpr (centeredCubeDomain d m).volume_ne_top)] at hFG + exact hFG + +/-- The physical integrand is invariant under normalized-volume a.e. +replacement of the field. -/ +theorem centeredCubeEuclideanHsIntegrand_congr_ae {d : ℕ} {m : ℤ} + {s : FractionalOrder} {F G : CenteredCubeEuclideanL2Field d m} + (hFG : F =ᵐ[(centeredCubeDomain d m).normalizedVolume] G) : + centeredCubeEuclideanHsIntegrand s F =ᵐ[ + centeredCubeEuclideanHsProductMeasure d m] + centeredCubeEuclideanHsIntegrand s G := by + letI : SFinite (centeredCubeDomain d m).restrictedVolume := by + change SFinite (MeasureTheory.volume.restrict _) + infer_instance + have hFG_restricted : + F =ᵐ[(centeredCubeDomain d m).restrictedVolume] G := + ae_restrictedVolume_of_ae_normalizedVolume hFG + have hfst : + (fun z : Vec d × Vec d => F z.1) =ᵐ[ + centeredCubeEuclideanHsProductMeasure d m] fun z => G z.1 := by + rw [centeredCubeEuclideanHsProductMeasure] + exact Measure.quasiMeasurePreserving_fst.ae_eq_comp hFG + have hsnd : + (fun z : Vec d × Vec d => F z.2) =ᵐ[ + centeredCubeEuclideanHsProductMeasure d m] fun z => G z.2 := by + rw [centeredCubeEuclideanHsProductMeasure] + exact Measure.quasiMeasurePreserving_snd.ae_eq_comp hFG_restricted + filter_upwards [hfst, hsnd] with z hz1 hz2 + simp only [centeredCubeEuclideanHsIntegrand, hz1, hz2] + +/-- The physical squared energy is invariant under normalized-volume a.e. +replacement of the field. -/ +theorem centeredCubeEuclideanHsEnergy_congr_ae {d : ℕ} {m : ℤ} + {s : FractionalOrder} {F G : CenteredCubeEuclideanL2Field d m} + (hFG : F =ᵐ[(centeredCubeDomain d m).normalizedVolume] G) : + centeredCubeEuclideanHsEnergy s F = centeredCubeEuclideanHsEnergy s G := by + unfold centeredCubeEuclideanHsEnergy + exact lintegral_congr_ae (centeredCubeEuclideanHsIntegrand_congr_ae hFG) + +/-- The physical extended seminorm is invariant under normalized-volume a.e. +replacement of the field. -/ +theorem centeredCubeEuclideanHsESeminorm_congr_ae {d : ℕ} {m : ℤ} + {s : FractionalOrder} {F G : CenteredCubeEuclideanL2Field d m} + (hFG : F =ᵐ[(centeredCubeDomain d m).normalizedVolume] G) : + centeredCubeEuclideanHsESeminorm s F = + centeredCubeEuclideanHsESeminorm s G := by + unfold centeredCubeEuclideanHsESeminorm + rw [centeredCubeEuclideanHsEnergy_congr_ae hFG] + +private theorem measurable_euclideanDist_pair (d : ℕ) : + Measurable (fun z : Vec d × Vec d => euclideanDist z.1 z.2) := by + have hsub : Measurable (fun z : Vec d × Vec d => z.1 - z.2) := + measurable_fst.sub measurable_snd + have hh : Measurable (fun z : Vec d × Vec d => HilbertVec.ofVec (z.1 - z.2)) := + (HilbertVec.ofVecL d).continuous.measurable.comp hsub + simpa only [euclideanDist, euclideanNorm_eq_norm_ofVec] using hh.norm + +private theorem measurable_centeredCubeEuclideanHsIntegrand_of_measurable {d : ℕ} + {m : ℤ} (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) + (hF : Measurable F) : Measurable (centeredCubeEuclideanHsIntegrand s F) := by + unfold centeredCubeEuclideanHsIntegrand + apply Measurable.ennreal_ofReal + apply Measurable.div + · exact ((HilbertVec.ofVecL d).continuous.measurable.comp + ((hF.comp measurable_fst).sub (hF.comp measurable_snd))).norm.pow measurable_const + · change Measurable (fun z : Vec d × Vec d => + euclideanDist z.1 z.2 ^ ((d : ℝ) + 2 * s.1)) + exact (measurable_euclideanDist_pair d).pow measurable_const + +/-- The physical Euclidean integrand is a.e.-measurable for every stored +centered-cube `L²` field. -/ +theorem aemeasurable_centeredCubeEuclideanHsIntegrand {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + AEMeasurable (centeredCubeEuclideanHsIntegrand s F) + (centeredCubeEuclideanHsProductMeasure d m) := by + exact (measurable_centeredCubeEuclideanHsIntegrand_of_measurable s + F.measurableRepresentative F.measurable_measurableRepresentative).aemeasurable.congr + (centeredCubeEuclideanHsIntegrand_congr_ae + F.ae_eq_measurableRepresentative).symm + +/-- Physical centered-cube membership is exactly finite physical energy. -/ +theorem memCenteredCubeEuclideanHs_iff_energy_lt_top {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + MemCenteredCubeEuclideanHs s F ↔ centeredCubeEuclideanHsEnergy s F < ∞ := by + constructor + · exact fun h => h.energy_lt_top + · exact fun h => ⟨aemeasurable_centeredCubeEuclideanHsIntegrand s F, h⟩ + +/-- The measurable equivalence implementing centered-cube dilation. -/ +noncomputable def centeredCubeDilationMeasurableEquiv {d : ℕ} (m : ℤ) : + Vec d ≃ᵐ Vec d := + (Homeomorph.smulOfNeZero (centeredCubeScale m) + (centeredCubeScale_ne_zero m)).toMeasurableEquiv + +@[simp] theorem centeredCubeDilationMeasurableEquiv_apply {d : ℕ} (m : ℤ) + (x : Vec d) : + centeredCubeDilationMeasurableEquiv (d := d) m x = centeredCubeDilation m x := + rfl + +/-- Dilation applied in both variables of the physical product measure. -/ +noncomputable def centeredCubePairDilation {d : ℕ} (m : ℤ) : + Vec d × Vec d → Vec d × Vec d := + Prod.map (centeredCubeDilation m) (centeredCubeDilation m) + +/-- The product measure gains exactly the inverse Jacobian from its +unnormalized second variable under dilation. -/ +theorem map_centeredCubePairDilation_productMeasure {d : ℕ} (m : ℤ) : + Measure.map (centeredCubePairDilation (d := d) m) + (centeredCubeEuclideanHsProductMeasure d 0) = + ENNReal.ofReal (((centeredCubeScale m) ^ d)⁻¹) • + centeredCubeEuclideanHsProductMeasure d m := by + let : IsFiniteMeasure (cubeMeasure (originCube d 0)) := + ⟨lt_top_iff_ne_top.2 (cubeMeasure_apply_univ_ne_top (originCube d 0))⟩ + let : IsFiniteMeasure (cubeMeasure (originCube d m)) := + ⟨lt_top_iff_ne_top.2 (cubeMeasure_apply_univ_ne_top (originCube d m))⟩ + let : SFinite (centeredCubeDomain d 0).normalizedVolume := by + rw [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + infer_instance + let : SFinite (centeredCubeDomain d 0).restrictedVolume := by + rw [centeredCubeDomain, + cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure] + infer_instance + let : SFinite (centeredCubeDomain d m).restrictedVolume := by + rw [centeredCubeDomain, + cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure] + infer_instance + unfold centeredCubePairDilation centeredCubeEuclideanHsProductMeasure + rw [← Measure.map_prod_map _ _ (measurable_centeredCubeDilation m) + (measurable_centeredCubeDilation m)] + rw [map_centeredCubeDilation_normalizedVolume, + map_centeredCubeDilation_restrictedVolume, Measure.prod_smul_right] + +private theorem centeredCubeMeasureScale_mul_inverseScale (d : ℕ) (m : ℤ) : + ENNReal.ofReal ((centeredCubeScale m) ^ d) * + ENNReal.ofReal (((centeredCubeScale m) ^ d)⁻¹) = 1 := by + rw [← ENNReal.ofReal_mul (pow_nonneg (centeredCubeScale_pos m).le d)] + rw [mul_inv_cancel₀ (pow_ne_zero d (centeredCubeScale_ne_zero m))] + exact ENNReal.ofReal_one + +/-- The physical product measure is the Jacobian multiple of the pushforward +of the unit product measure. -/ +theorem centeredCubeEuclideanHsProductMeasure_eq_smul_map {d : ℕ} (m : ℤ) : + centeredCubeEuclideanHsProductMeasure d m = + ENNReal.ofReal ((centeredCubeScale m) ^ d) • + Measure.map (centeredCubePairDilation (d := d) m) + (centeredCubeEuclideanHsProductMeasure d 0) := by + rw [map_centeredCubePairDilation_productMeasure] + rw [smul_smul, centeredCubeMeasureScale_mul_inverseScale, one_smul] + +private theorem centeredCubeEuclideanHsIntegrand_dilation {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) + (z : Vec d × Vec d) : + centeredCubeEuclideanHsIntegrand s F (centeredCubePairDilation m z) = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-((d : ℝ) + 2 * s.1)) * + euclideanHsIntegrand s F.pullbackToUnit z := by + let r : ℝ := centeredCubeScale m + let N : ℝ := ‖HilbertVec.ofVec (F (r • z.1) - F (r • z.2))‖ ^ 2 + let D : ℝ := euclideanDist z.1 z.2 + let a : ℝ := (d : ℝ) + 2 * s.1 + have hr : 0 < r := centeredCubeScale_pos m + have hD : 0 ≤ D := euclideanDist_nonneg _ _ + have hquot : + N / Real.rpow (r * D) a = + Real.rpow r (-a) * (N / Real.rpow D a) := by + change N / ((r * D) ^ a) = r ^ (-a) * (N / D ^ a) + rw [Real.mul_rpow hr.le hD, Real.rpow_neg hr.le] + have hA : r ^ a ≠ 0 := (Real.rpow_pos_of_pos hr a).ne' + field_simp + unfold centeredCubeEuclideanHsIntegrand euclideanHsIntegrand + change ENNReal.ofReal + (N / Real.rpow (euclideanDist (r • z.1) (r • z.2)) a) = + (ENNReal.ofReal r) ^ (-a) * ENNReal.ofReal (N / Real.rpow D a) + rw [euclideanDist_smul, abs_of_pos hr] + change ENNReal.ofReal (N / Real.rpow (r * D) a) = _ + rw [hquot] + change ENNReal.ofReal (r ^ (-a) * (N / Real.rpow D a)) = _ + have hrpow_nonneg : 0 ≤ r ^ (-a) := Real.rpow_nonneg hr.le (-a) + rw [ENNReal.ofReal_mul hrpow_nonneg] + change ENNReal.ofReal (r ^ (-a)) * ENNReal.ofReal (N / Real.rpow D a) = _ + rw [← ENNReal.ofReal_rpow_of_pos hr] + +private theorem centeredCubeHsScaleFactors_mul {d : ℕ} (m : ℤ) + (s : FractionalOrder) : + (ENNReal.ofReal (centeredCubeScale m)) ^ d * + (ENNReal.ofReal (centeredCubeScale m)) ^ (-((d : ℝ) + 2 * s.1)) = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-2 * s.1) := by + rw [← ENNReal.rpow_natCast] + rw [← ENNReal.rpow_add _ _ + (ENNReal.ofReal_ne_zero_iff.mpr (centeredCubeScale_pos m)) ENNReal.ofReal_ne_top] + congr 1 + ring + +private theorem centeredCubeScale_rpow_ne_top (m : ℤ) (a : ℝ) : + (ENNReal.ofReal (centeredCubeScale m)) ^ a ≠ ∞ := by + intro htop + rcases ENNReal.rpow_eq_top_iff.mp htop with hzero | htop' + · exact (ENNReal.ofReal_ne_zero_iff.mpr (centeredCubeScale_pos m)) hzero.1 + · exact ENNReal.ofReal_ne_top htop'.1 + +/-- Exact physical energy scaling under pullback to the centered unit cube. -/ +theorem centeredCubeEuclideanHsEnergy_eq_scale_mul_pullbackToUnit {d : ℕ} + {m : ℤ} (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsEnergy s F = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-2 * s.1) * + euclideanHsEnergy s F.pullbackToUnit := by + unfold centeredCubeEuclideanHsEnergy euclideanHsEnergy + rw [centeredCubeEuclideanHsProductMeasure_eq_smul_map] + rw [lintegral_smul_measure] + let T : (Vec d × Vec d) ≃ᵐ (Vec d × Vec d) := + (centeredCubeDilationMeasurableEquiv (d := d) m).prodCongr + (centeredCubeDilationMeasurableEquiv (d := d) m) + have hT : (⇑T : Vec d × Vec d → Vec d × Vec d) = + centeredCubePairDilation m := by + rfl + rw [← hT] + rw [lintegral_map_equiv] + have hT_apply (z : Vec d × Vec d) : T z = centeredCubePairDilation m z := + congrFun hT z + simp_rw [hT_apply, centeredCubeEuclideanHsIntegrand_dilation] + have hk_top : + (ENNReal.ofReal (centeredCubeScale m)) ^ (-((d : ℝ) + 2 * s.1)) ≠ ∞ := + centeredCubeScale_rpow_ne_top m _ + rw [lintegral_const_mul' + ((ENNReal.ofReal (centeredCubeScale m)) ^ (-((d : ℝ) + 2 * s.1))) _ + hk_top] + change ENNReal.ofReal ((centeredCubeScale m) ^ d) * + ((ENNReal.ofReal (centeredCubeScale m)) ^ (-((d : ℝ) + 2 * s.1)) * + ∫⁻ z, euclideanHsIntegrand s F.pullbackToUnit z + ∂euclideanHsProductMeasure d) = _ + rw [← mul_assoc, ENNReal.ofReal_pow (centeredCubeScale_pos m).le, + centeredCubeHsScaleFactors_mul] + +/-- Exact physical seminorm scaling under pullback to the centered unit cube. -/ +theorem centeredCubeEuclideanHsESeminorm_eq_scale_mul_pullbackToUnit {d : ℕ} + {m : ℤ} (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsESeminorm s F = + (ENNReal.ofReal (centeredCubeScale m)) ^ (-s.1) * + euclideanHsESeminorm s F.pullbackToUnit := by + unfold centeredCubeEuclideanHsESeminorm euclideanHsESeminorm + rw [centeredCubeEuclideanHsEnergy_eq_scale_mul_pullbackToUnit] + rw [ENNReal.mul_rpow_of_nonneg _ _ (by positivity : 0 ≤ (2 : ℝ)⁻¹)] + rw [← ENNReal.rpow_mul] + congr 1 + field_simp + +/-- Physical centered-cube fractional membership is exactly membership of the +unit pullback. -/ +theorem memCenteredCubeEuclideanHs_iff_pullbackToUnit {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + MemCenteredCubeEuclideanHs s F ↔ MemEuclideanHs s F.pullbackToUnit := by + rw [memCenteredCubeEuclideanHs_iff_energy_lt_top, + memEuclideanHs_iff_energy_lt_top, + centeredCubeEuclideanHsEnergy_eq_scale_mul_pullbackToUnit] + let c : ℝ≥0∞ := (ENNReal.ofReal (centeredCubeScale m)) ^ (-2 * s.1) + have hc_pos : 0 < c := ENNReal.rpow_pos + (ENNReal.ofReal_pos.mpr (centeredCubeScale_pos m)) ENNReal.ofReal_ne_top + have hc_top : c < ∞ := by + rw [lt_top_iff_ne_top] + exact centeredCubeScale_rpow_ne_top m _ + constructor + · intro h + rcases ENNReal.mul_lt_top_iff.mp h with hfinite | hzero + · exact hfinite.2 + · rcases hzero with hc_zero | henergy_zero + · exact False.elim (hc_pos.ne' hc_zero) + · simpa only [henergy_zero] using ENNReal.zero_lt_top + · exact fun h => ENNReal.mul_lt_top hc_top h + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanL2.lean new file mode 100644 index 0000000000..d50091aaac --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeEuclideanL2.lean @@ -0,0 +1,213 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 + +/-! +# Euclidean `L²` fields on centered triadic cubes + +This module transports the exact Euclidean `L²` carrier between the centered +triadic cube at scale `m` and the centered unit cube. The transport uses the +literal dilation `x ↦ (3 ^ m) • x`; normalized volume is therefore preserved +exactly. + +## Main definitions + +- `centeredCubeDomain`: the bounded measurable realization of `originCube d m`. +- `CenteredCubeEuclideanL2Field`: Euclidean `L²` vector fields on that domain. +- `CenteredCubeEuclideanL2Field.pullbackToUnit`: pullback by the cube dilation. + +## Main results + +- `centeredCubeDilationMeasurePreserving`: normalized-volume preservation. +- `normalizedEuclideanLpENorm_pullbackToUnit`: exact normalized norm invariance. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Pointwise + +noncomputable section + +/-- The bounded measurable realization of the centered triadic cube at scale `m`. -/ +noncomputable def centeredCubeDomain (d : ℕ) (m : ℤ) : BoundedMeasurableDomain d := + cubeBoundedMeasurableDomain (originCube d m) + +/-- The positive dilation factor carrying the centered unit cube to scale `m`. -/ +noncomputable def centeredCubeScale (m : ℤ) : ℝ := + (3 : ℝ) ^ m + +@[simp] theorem centeredCubeScale_zero : centeredCubeScale 0 = 1 := by + simp [centeredCubeScale] + +theorem centeredCubeScale_pos (m : ℤ) : 0 < centeredCubeScale m := by + exact zpow_pos (by norm_num) m + +theorem centeredCubeScale_ne_zero (m : ℤ) : centeredCubeScale m ≠ 0 := + (centeredCubeScale_pos m).ne' + +/-- Dilation from the centered unit cube to the centered cube at scale `m`. -/ +noncomputable def centeredCubeDilation {d : ℕ} (m : ℤ) : Vec d → Vec d := + fun x => centeredCubeScale m • x + +theorem measurable_centeredCubeDilation {d : ℕ} (m : ℤ) : + Measurable (centeredCubeDilation (d := d) m) := + measurable_const_smul (centeredCubeScale m) + +/-- Restricted volume gains the inverse Jacobian under centered-cube dilation. -/ +theorem map_centeredCubeDilation_restrictedVolume {d : ℕ} (m : ℤ) : + Measure.map (centeredCubeDilation (d := d) m) + (centeredCubeDomain d 0).restrictedVolume = + ENNReal.ofReal (((centeredCubeScale m) ^ d)⁻¹) • + (centeredCubeDomain d m).restrictedVolume := by + unfold centeredCubeDomain + rw [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet, + cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + rw [show centeredCubeDilation (d := d) m = + fun x : Vec d => centeredCubeScale m • x by rfl] + rw [map_smul_volume_restrict (centeredCubeScale_pos m)] + have hset : + centeredCubeScale m • openCubeSet (originCube d 0) = + openCubeSet (originCube d m) := by + simpa only [centeredCubeScale, cubeScaleFactor_originCube] using + (openCubeSet_originCube_eq_smul_originCube_zero (d := d) m).symm + rw [hset] + +/-- Normalized volume is exactly preserved by centered-cube dilation. -/ +theorem map_centeredCubeDilation_normalizedVolume {d : ℕ} (m : ℤ) : + Measure.map (centeredCubeDilation (d := d) m) + (centeredCubeDomain d 0).normalizedVolume = + (centeredCubeDomain d m).normalizedVolume := by + unfold centeredCubeDomain + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + unfold normalizedCubeMeasure + rw [Measure.map_smul _ (measurable_centeredCubeDilation m).aemeasurable] + have hmap : + Measure.map (centeredCubeDilation (d := d) m) (cubeMeasure (originCube d 0)) = + ENNReal.ofReal (((centeredCubeScale m) ^ d)⁻¹) • + cubeMeasure (originCube d m) := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure] using + map_centeredCubeDilation_restrictedVolume (d := d) m + rw [hmap] + simp only [cubeVolume, cubeScaleFactor_originCube, centeredCubeScale, + zpow_zero, one_pow, inv_one, ENNReal.ofReal_one, one_smul] + +/-- Centered-cube dilation as a normalized-volume-preserving map. -/ +theorem centeredCubeDilationMeasurePreserving {d : ℕ} (m : ℤ) : + MeasurePreserving (centeredCubeDilation (d := d) m) + (centeredCubeDomain d 0).normalizedVolume + (centeredCubeDomain d m).normalizedVolume := + ⟨measurable_centeredCubeDilation m, map_centeredCubeDilation_normalizedVolume m⟩ + +/-- A Euclidean `L²` vector field on the centered cube at scale `m`. -/ +structure CenteredCubeEuclideanL2Field (d : ℕ) (m : ℤ) where + /-- The represented vector field. -/ + toField : Vec d → Vec d + euclideanMemL2 : + MemLp (fun x => HilbertVec.ofVec (toField x)) (2 : ℝ≥0∞) + (centeredCubeDomain d m).normalizedVolume + +namespace CenteredCubeEuclideanL2Field + +instance {d : ℕ} {m : ℤ} : + CoeFun (CenteredCubeEuclideanL2Field d m) (fun _ => Vec d → Vec d) where + coe F := F.toField + +/-- The explicit Euclidean-magnitude form of the stored `L²` fact. -/ +theorem euclideanMagnitudeMemL2 {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : + MemLp (fun x => euclideanNorm (F x)) (2 : ℝ≥0∞) + (centeredCubeDomain d m).normalizedVolume := by + simpa only [euclideanNorm_eq_norm_ofVec] using F.euclideanMemL2.norm + +/-- Pull a physical centered-cube field back to the centered unit cube. -/ +noncomputable def pullbackToUnit {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : UnitCubeEuclideanL2Field d where + toField := fun x => F (centeredCubeDilation m x) + euclideanMemL2 := by + change MemLp + ((fun x => HilbertVec.ofVec (F x)) ∘ centeredCubeDilation (d := d) m) + (2 : ℝ≥0∞) (unitCenteredCubeDomain d).normalizedVolume + rw [show unitCenteredCubeDomain d = centeredCubeDomain d 0 by rfl] + exact F.euclideanMemL2.comp_measurePreserving + (centeredCubeDilationMeasurePreserving m) + +@[simp] theorem pullbackToUnit_apply {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) (x : Vec d) : + F.pullbackToUnit x = F (centeredCubeScale m • x) := + rfl + +/-- A globally measurable representative selected from the stored Euclidean +`L²` witness on the centered cube. -/ +noncomputable def measurableRepresentative {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : CenteredCubeEuclideanL2Field d m := + let f : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (F x) + let hf : AEStronglyMeasurable f (centeredCubeDomain d m).normalizedVolume := + F.euclideanMemL2.aestronglyMeasurable + { toField := fun x => HilbertVec.toVec (AEStronglyMeasurable.mk f hf x) + euclideanMemL2 := by + simpa only [HilbertVec.ofVec_toVec] using F.euclideanMemL2.ae_eq hf.ae_eq_mk } + +/-- The selected centered-cube representative is globally measurable. -/ +theorem measurable_measurableRepresentative {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : Measurable F.measurableRepresentative := by + unfold measurableRepresentative + dsimp only + exact (HilbertVec.continuousLinearEquivVec d).continuous.measurable.comp + (F.euclideanMemL2.aestronglyMeasurable.measurable_mk) + +/-- The selected representative agrees with the original field almost +everywhere for normalized centered-cube volume. -/ +theorem ae_eq_measurableRepresentative {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : + F =ᵐ[(centeredCubeDomain d m).normalizedVolume] F.measurableRepresentative := by + unfold measurableRepresentative + dsimp only + filter_upwards [F.euclideanMemL2.aestronglyMeasurable.ae_eq_mk] with x hx + simpa only [HilbertVec.toVec_ofVec] using congrArg HilbertVec.toVec hx + +/-- Pullback preserves the exact normalized Euclidean extended `L²` norm. -/ +theorem normalizedEuclideanLpENorm_pullbackToUnit {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) + F.pullbackToUnit = + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ + F.pullbackToUnit.euclideanMagnitudeMemL2.aestronglyMeasurable, + BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ + F.euclideanMagnitudeMemL2.aestronglyMeasurable] + change eLpNorm + ((fun x => euclideanNorm (F x)) ∘ centeredCubeDilation (d := d) m) + (2 : ℝ≥0∞) (unitCenteredCubeDomain d).normalizedVolume = _ + rw [show unitCenteredCubeDomain d = centeredCubeDomain d 0 by rfl] + exact eLpNorm_comp_measurePreserving F.euclideanMagnitudeMemL2.aestronglyMeasurable + (centeredCubeDilationMeasurePreserving m) + +/-- Pullback preserves the proof-carrying normalized Euclidean real `L²` norm. -/ +theorem normalizedEuclideanLpNorm_pullbackToUnit {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : + (unitCenteredCubeDomain d).normalizedEuclideanLpNorm (2 : ℝ≥0∞) + F.pullbackToUnit F.pullbackToUnit.euclideanMagnitudeMemL2 = + (centeredCubeDomain d m).normalizedEuclideanLpNorm (2 : ℝ≥0∞) + F F.euclideanMagnitudeMemL2 := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpNorm + exact congrArg ENNReal.toReal (normalizedEuclideanLpENorm_pullbackToUnit F) + +end CenteredCubeEuclideanL2Field + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZ.lean new file mode 100644 index 0000000000..70831fba57 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZ.lean @@ -0,0 +1,112 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalGradientMemLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLpMembership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePFullCZ + +/-! +# Fractional Calderón--Zygmund estimate on centered cubes + +This module packages the supplied zero-trace cube solution with the literal +Euclidean fractional-Sobolev field carried by its gradient. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- A supplied zero-trace centered-cube divergence solution with fractional +`L² ∩ L^q` datum has a literal fractional-Sobolev gradient, with a constant +uniform in the cube scale, coefficient scale, and fractional order. -/ +theorem centeredCubeH10ScalarDivergence_fractional_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (sigma0 : ℝ) (s : FractionalOrder) + (h : CubeEuclideanWspL2Field (originCube d m) s q) + (w : H10Function (openCubeSet (originCube d m))), + 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 w h.toLpTwo → + ∃ gradW : CubeEuclideanWspField (originCube d m) s q, + gradW.toField = w.toH1Function.grad ∧ + cubeEuclideanWspESeminorm + (originCube d m) s q gradW.toField ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanWspESeminorm + (originCube d m) s q h.toField := by + obtain ⟨Cfull, hCfull_top, hfull⟩ := exists_exactOverlapFiniteP_full_cz d q + let K : ℝ≥0∞ := cubeEuclideanWspOverlapDimensionConstant d + let C : ℝ≥0∞ := K * Cfull * K + have hK_top : K < ∞ := by + simpa only [K] using cubeEuclideanWspOverlapDimensionConstant_lt_top d + refine ⟨C, ENNReal.mul_lt_top (ENNReal.mul_lt_top hK_top hCfull_top) hK_top, ?_⟩ + intro m sigma0 s h w hsigma0 hsolution + let Q : TriadicCube d := originCube d m + have hgradLp := centeredCubeH10ScalarDivergence_grad_memLp d q m sigma0 s h w + hsigma0 hsolution + let gradLp : CubeEuclideanLpField Q q := + { toField := w.toH1Function.grad + euclideanMemLp := by simpa only [Q] using hgradLp } + have hOverlapGrad : + cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad ≤ + Cfull * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField := by + simpa only [Q] using hfull m sigma0 s h w hsigma0 hsolution + have hOverlapData : + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField ≤ + K * cubeEuclideanWspESeminorm Q s q h.toField := by + simpa only [Q, K] using + cubeEuclideanOverlap_le_dimensionConstant_mul_wsp Q s q h.toCubeEuclideanLpField + have hWspGrad : + cubeEuclideanWspESeminorm Q s q w.toH1Function.grad ≤ + K * cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad := by + simpa only [Q, K] using + cubeEuclideanWsp_le_dimensionConstant_mul_overlap Q s q gradLp + have hDataWsp_top : cubeEuclideanWspESeminorm Q s q h.toField < ∞ := by + simpa only [Q] using h.euclideanMemWsp.eSeminorm_lt_top + have hOverlapData_top : + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField < ∞ := + lt_of_le_of_lt hOverlapData (ENNReal.mul_lt_top hK_top hDataWsp_top) + have hSigma_top : (ENNReal.ofReal sigma0)⁻¹ < ∞ := + (ENNReal.inv_ne_top.mpr (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0))).lt_top + have hOverlapGrad_top : + cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad < ∞ := + lt_of_le_of_lt hOverlapGrad + (ENNReal.mul_lt_top (ENNReal.mul_lt_top hCfull_top hSigma_top) hOverlapData_top) + have hWspGrad_top : cubeEuclideanWspESeminorm Q s q w.toH1Function.grad < ∞ := + lt_of_le_of_lt hWspGrad (ENNReal.mul_lt_top hK_top hOverlapGrad_top) + let gradW : CubeEuclideanWspField Q s q := + { toField := w.toH1Function.grad + euclideanMemLp := gradLp.euclideanMemLp + euclideanMemWsp := + memCubeEuclideanWsp_of_memLp_of_eSeminorm_lt_top gradLp.euclideanMemLp hWspGrad_top } + refine ⟨gradW, rfl, ?_⟩ + calc + cubeEuclideanWspESeminorm (originCube d m) s q gradW.toField = + cubeEuclideanWspESeminorm Q s q w.toH1Function.grad := by rfl + _ ≤ K * cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad := + hWspGrad + _ ≤ K * (Cfull * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField) := by + gcongr + _ ≤ K * (Cfull * (ENNReal.ofReal sigma0)⁻¹ * + (K * cubeEuclideanWspESeminorm Q s q h.toField)) := by + gcongr + _ = C * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanWspESeminorm (originCube d m) s q h.toField := by + simp only [C, Q] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZFullNorm.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZFullNorm.lean new file mode 100644 index 0000000000..d1b605d277 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalCZFullNorm.lean @@ -0,0 +1,143 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeFractionalCZ + +/-! +# Full-norm fractional Calderón--Zygmund estimate on centered cubes + +The homogeneous fractional estimate and the normalized finite-`L^p` estimate +combine into the source-facing inhomogeneous fractional-Sobolev estimate. +The combination is carried out at the powered full norm, so its constant is +uniform in the cube, fractional order, and coefficient scale. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem cubeEuclideanWspFullENorm_le_of_component_bounds + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + (q : FiniteLpExponent) (F G : Vec d → Vec d) (A : ℝ≥0∞) + (hLp : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent F ≤ + A * (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent G) + (hSemi : cubeEuclideanWspESeminorm Q s q F ≤ + A * cubeEuclideanWspESeminorm Q s q G) : + cubeEuclideanWspFullENorm Q s q F ≤ A * cubeEuclideanWspFullENorm Q s q G := by + let W := cubeEuclideanWspScalePowerWeight Q s q + let LF := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent F + let LG := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent G + let SF := cubeEuclideanWspESeminorm Q s q F + let SG := cubeEuclideanWspESeminorm Q s q G + let t := q.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one q.one_lt)) q.lt_top.ne + have hLpPower : LF ^ t ≤ (A * LG) ^ t := + ENNReal.rpow_le_rpow (by simpa only [LF, LG] using hLp) ht.le + have hSemiPower : SF ^ t ≤ (A * SG) ^ t := + ENNReal.rpow_le_rpow (by simpa only [SF, SG] using hSemi) ht.le + have hFirst : W * LF ^ t ≤ A ^ t * (W * LG ^ t) := by + calc + W * LF ^ t ≤ W * (A * LG) ^ t := by + simpa only [mul_comm] using mul_le_mul_left hLpPower W + _ = A ^ t * (W * LG ^ t) := by + rw [ENNReal.mul_rpow_of_nonneg _ _ ht.le] + ring + have hSecond : SF ^ t ≤ A ^ t * SG ^ t := by + calc + SF ^ t ≤ (A * SG) ^ t := hSemiPower + _ = A ^ t * SG ^ t := ENNReal.mul_rpow_of_nonneg _ _ ht.le + have hPower : W * LF ^ t + SF ^ t ≤ A ^ t * (W * LG ^ t + SG ^ t) := by + calc + W * LF ^ t + SF ^ t ≤ A ^ t * (W * LG ^ t) + A ^ t * SG ^ t := + add_le_add hFirst hSecond + _ = A ^ t * (W * LG ^ t + SG ^ t) := by ring + have hRoot := ENNReal.rpow_le_rpow hPower (inv_nonneg.mpr ht.le) + rw [cubeEuclideanWspFullENorm] + change (W * LF ^ t + SF ^ t) ^ t⁻¹ ≤ + A * (W * LG ^ t + SG ^ t) ^ t⁻¹ + calc + (W * LF ^ t + SF ^ t) ^ t⁻¹ ≤ + (A ^ t * (W * LG ^ t + SG ^ t)) ^ t⁻¹ := hRoot + _ = A * (W * LG ^ t + SG ^ t) ^ t⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr ht.le), + ← ENNReal.rpow_mul, mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + +/-- A supplied zero-trace centered-cube divergence solution with fractional +`L² ∩ L^q` datum satisfies the full fractional-Sobolev Calderón--Zygmund +estimate. The constant is fixed before all scale, order, datum, and solution +parameters. -/ +theorem centeredCubeH10ScalarDivergence_fractional_cz_full + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (sigma0 : ℝ) (s : FractionalOrder) + (h : CubeEuclideanWspL2Field (originCube d m) s q) + (w : H10Function (openCubeSet (originCube d m))), + 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 w h.toLpTwo → + cubeEuclideanWspFullENorm (originCube d m) s q w.toH1Function.grad ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanWspFullENorm (originCube d m) s q h.toField := by + obtain ⟨CLp, hCLp_top, hCLp⟩ := + CubeCalderonZygmund.centeredCubeH10ScalarDivergence_cz d q + obtain ⟨CSemi, hCSemi_top, hCSemi⟩ := + centeredCubeH10ScalarDivergence_fractional_cz d q + let C : ℝ≥0∞ := CLp + CSemi + refine ⟨C, ENNReal.add_lt_top.mpr ⟨hCLp_top, hCSemi_top⟩, ?_⟩ + intro m sigma0 s h w hsigma0 hsolution + let Q : TriadicCube d := originCube d m + let hField : CubeEuclideanL2LpField Q q := + { toField := h.toField + euclideanMemLp := h.euclideanMemLp + euclideanMemL2 := h.euclideanMemL2 } + have hLpRaw := hCLp m sigma0 hField w hsigma0 (by + simpa only [Q, hField] using! hsolution) + have hLp : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent + w.toH1Function.grad ≤ + (C * (ENNReal.ofReal sigma0)⁻¹) * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent + h.toField := by + calc + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent + w.toH1Function.grad ≤ + CLp * (ENNReal.ofReal sigma0)⁻¹ * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent + h.toField := by + simpa only [Q, centeredCubeDomain] using hLpRaw + _ ≤ (C * (ENNReal.ofReal sigma0)⁻¹) * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm q.exponent + h.toField := by + gcongr + exact le_add_right (le_refl CLp) + obtain ⟨gradW, hgradW, hSemiRaw⟩ := hCSemi m sigma0 s h w hsigma0 hsolution + have hSemi : cubeEuclideanWspESeminorm Q s q w.toH1Function.grad ≤ + (C * (ENNReal.ofReal sigma0)⁻¹) * + cubeEuclideanWspESeminorm Q s q h.toField := by + calc + cubeEuclideanWspESeminorm Q s q w.toH1Function.grad ≤ + CSemi * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanWspESeminorm Q s q h.toField := by + simpa only [Q, hgradW] using hSemiRaw + _ ≤ (C * (ENNReal.ofReal sigma0)⁻¹) * + cubeEuclideanWspESeminorm Q s q h.toField := by + gcongr + exact le_add_left (le_refl CSemi) + have hFull := cubeEuclideanWspFullENorm_le_of_component_bounds Q s q + w.toH1Function.grad h.toField (C * (ENNReal.ofReal sigma0)⁻¹) hLp hSemi + simpa only [Q, mul_assoc] using hFull + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalGradientMemLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalGradientMemLp.lean new file mode 100644 index 0000000000..ca1ebbde57 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CenteredCubeFractionalGradientMemLp.lean @@ -0,0 +1,69 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo + +/-! +# Finite-exponent gradient membership for fractional divergence data + +This file packages the supplied-solution Calderón--Zygmund estimate as a +literal normalized-cube `L^q` membership witness for the given `H¹₀` +gradient. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- A supplied zero-trace centered-cube divergence solution driven by +fractional `L² ∩ L^q` data has a literal normalized-cube `L^q` gradient. -/ +theorem centeredCubeH10ScalarDivergence_grad_memLp + (d : ℕ) [NeZero d] (q : FiniteLpExponent) (m : ℤ) (sigma0 : ℝ) + (s : FractionalOrder) + (h : CubeEuclideanWspL2Field (originCube d m) s q) + (w : H10Function (openCubeSet (originCube d m))) + (hsigma0 : 0 < sigma0) + (hsolution : IsCenteredCubeH10ScalarDivergenceSolution m sigma0 w h.toLpTwo) : + MemLp (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C, hCtop, hC⟩ := CubeCalderonZygmund.centeredCubeH10ScalarDivergence_cz d q + let hField : CubeEuclideanL2LpField (originCube d m) q := + { toField := h.toField + euclideanMemLp := h.euclideanMemLp + euclideanMemL2 := h.euclideanMemL2 } + have hbound : + eLpNorm (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + eLpNorm (fun x => HilbertVec.ofVec (h.toField x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, MeasureTheory.eLpNorm_norm, hField] using + hC m sigma0 hField w hsigma0 (by simpa only [hField] using! hsolution) + have hgrad_l2 : MemLp (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + w.toH1Function.grad_memL2_normalizedCubeMeasure i + refine ⟨hgrad_l2.aestronglyMeasurable, ?_⟩ + exact lt_of_le_of_lt hbound (ENNReal.mul_lt_top + (ENNReal.mul_lt_top hCtop (ENNReal.inv_ne_top.mpr + (ne_of_gt (ENNReal.ofReal_pos.mpr hsigma0))).lt_top) + h.euclideanMemLp.eLpNorm_lt_top) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ClassicalDualComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ClassicalDualComparison.lean new file mode 100644 index 0000000000..8f989bc2f0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ClassicalDualComparison.lean @@ -0,0 +1,279 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.Theorems.SobolevPublic +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry + +/-! +# Classical fractional dual comparison + +Scalar Euclidean Gagliardo tests with a scale-weighted normalized L² term +embed into the legacy partition Besov test space. All real-valued suprema +below are proved bounded for the L² fields to which the comparison applies. +-/ + +@[expose] public section + +namespace Homogenization.ClassicalSobolev34 + +open MeasureTheory +open scoped ENNReal BigOperators + +noncomputable section + +/-- The Euclidean difference quotient at the fixed order `3/4`. -/ +def kernel {d : ℕ} (φ : Vec d → ℝ) : Vec d × Vec d → ℝ := + fun z => euclideanDist z.1 z.2 ^ (-((3 / 4 : ℝ) + (d : ℝ) / 2)) * + (φ z.1 - φ z.2) + +/-- Membership includes both measurability and finiteness certificates. -/ +def memH34 {d : ℕ} (Q : TriadicCube d) (φ : Vec d → ℝ) : Prop := + MemLp φ 2 (normalizedCubeMeasure Q) ∧ + MemLp (kernel φ) 2 (Gagliardo.gagliardoCubeMeasure Q) + +/-- The Euclidean Gagliardo seminorm, normalized in its first integral. -/ +def seminorm {d : ℕ} (Q : TriadicCube d) (φ : Vec d → ℝ) : ℝ := + (eLpNorm (kernel φ) 2 (Gagliardo.gagliardoCubeMeasure Q)).toReal + +/-- A full fractional norm which detects constants and has units `length⁻³ᐟ⁴`. -/ +def testNorm {d : ℕ} (Q : TriadicCube d) (φ : Vec d → ℝ) : ℝ := + seminorm Q φ + cubeScaleFactor Q ^ (-(3 / 4 : ℝ)) * cubeLpNorm Q 2 φ + +/-- The unit ball of the full classical fractional test norm. -/ +def isDualTest {d : ℕ} (Q : TriadicCube d) (φ : Vec d → ℝ) : Prop := + memH34 Q φ ∧ testNorm Q φ ≤ 1 + +/-- Pairing magnitudes against classical unit tests. -/ +def valueSet {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : Set ℝ := + {r | ∃ φ, isDualTest Q φ ∧ r = |cubeBesovPairing Q f φ|} + +/-- The full classical negative norm, on its proved finite `L²` locus. -/ +def negativeNorm {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : ℝ := + sSup (valueSet Q f) + +/-- A dimension-only comparison coefficient. -/ +def comparisonConstant (d : ℕ) : ℝ := + (3 : ℝ) ^ ((d : ℝ) / 2) * Book.Ch01.Legacy.wspVsBsppConstant d * + (d : ℝ) ^ ((3 / 4 : ℝ) + (d : ℝ) / 2) + +theorem comparisonConstant_pos {d : ℕ} [NeZero d] : 0 < comparisonConstant d := by + unfold comparisonConstant + exact mul_pos (mul_pos (Real.rpow_pos_of_pos (by norm_num) _) + (Book.Ch01.Legacy.wspVsBsppConstant_pos d)) + (Real.rpow_pos_of_pos (by exact_mod_cast (NeZero.pos d)) _) + +private theorem kernel_bound {d : ℕ} (hd : 2 ≤ d) (φ : Vec d → ℝ) + (z : Vec d × Vec d) : + ‖Gagliardo.gagliardoKernel (3 / 4 : ℝ) 2 φ z‖ ≤ + (d : ℝ) ^ ((3 / 4 : ℝ) + (d : ℝ) / 2) * ‖kernel φ z‖ := by + let a : ℝ := (3 / 4 : ℝ) + (d : ℝ) / 2 + have ha : 0 < a := by dsimp [a]; positivity + have hdpos : (0 : ℝ) < d := by exact_mod_cast (show 0 < d by omega) + by_cases hz : z.1 = z.2 + · simp [Gagliardo.gagliardoKernel, kernel, hz] + have hdist : 0 < dist z.1 z.2 := dist_pos.mpr hz + have heuc : 0 < euclideanDist z.1 z.2 := + lt_of_lt_of_le hdist (dist_le_euclideanDist _ _) + have hpow : (euclideanDist z.1 z.2) ^ a ≤ + (d : ℝ) ^ a * (dist z.1 z.2) ^ a := by + rw [← Real.mul_rpow hdpos.le hdist.le] + exact Real.rpow_le_rpow (euclideanDist_nonneg _ _) + (euclideanDist_le_dimension_mul_dist _ _) ha.le + have hweight : (dist z.1 z.2) ^ (-a) ≤ + (d : ℝ) ^ a * (euclideanDist z.1 z.2) ^ (-a) := by + rw [Real.rpow_neg hdist.le, Real.rpow_neg heuc.le] + apply (le_mul_inv_iff₀ (Real.rpow_pos_of_pos heuc a)).mpr + apply (inv_mul_le_iff₀ (Real.rpow_pos_of_pos hdist a)).mpr + simpa [mul_comm] using hpow + have hnorm := mul_le_mul_of_nonneg_right hweight (norm_nonneg (φ z.1 - φ z.2)) + simp only [Gagliardo.gagliardoKernel, Gagliardo.kernelExponent, + ENNReal.toReal_ofNat, smul_eq_mul, kernel, norm_mul, Real.norm_eq_abs] + rw [abs_of_nonneg (Real.rpow_nonneg hdist.le _), + abs_of_nonneg (Real.rpow_nonneg heuc.le _)] + simpa only [a, Real.norm_eq_abs, mul_assoc] using hnorm + +private theorem supKernel_measurable {d : ℕ} {Q : TriadicCube d} {φ : Vec d → ℝ} + (hφ : MemLp φ 2 (normalizedCubeMeasure Q)) : + AEStronglyMeasurable (Gagliardo.gagliardoKernel (3 / 4 : ℝ) 2 φ) + (Gagliardo.gagliardoCubeMeasure Q) := by + have hcube : AEStronglyMeasurable φ (cubeMeasure Q) := by + refine ⟨hφ.1.mk _, hφ.1.stronglyMeasurable_mk, ?_⟩ + exact Gagliardo.ae_normalizedCubeMeasure_iff.mp hφ.1.ae_eq_mk + have hfst := hφ.1.comp_quasiMeasurePreserving + (Measure.quasiMeasurePreserving_fst (ν := cubeMeasure Q)) + have hsnd := hcube.comp_quasiMeasurePreserving + (Measure.quasiMeasurePreserving_snd (μ := normalizedCubeMeasure Q)) + have hw : Measurable (fun z : Vec d × Vec d => + dist z.1 z.2 ^ (-Gagliardo.kernelExponent d (3 / 4 : ℝ) 2)) := + measurable_dist.pow measurable_const + exact hw.aestronglyMeasurable.smul (hfst.sub hsnd) + +private theorem supSeminorm_bound {d : ℕ} (hd : 2 ≤ d) {Q : TriadicCube d} + {φ : Vec d → ℝ} (hφ : memH34 Q φ) : + Gagliardo.MemWsp Q (3 / 4 : ℝ) 2 φ ∧ + Book.Ch01.Legacy.fractionalSobolevSeminorm Q (3 / 4 : ℝ) 2 φ ≤ + (d : ℝ) ^ ((3 / 4 : ℝ) + (d : ℝ) / 2) * seminorm Q φ := by + let D : ℝ := (d : ℝ) ^ ((3 / 4 : ℝ) + (d : ℝ) / 2) + have hD : 0 ≤ D := Real.rpow_nonneg (Nat.cast_nonneg _) _ + have hle := eLpNorm_le_mul_eLpNorm_of_ae_le_mul + (μ := Gagliardo.gagliardoCubeMeasure Q) + (Filter.Eventually.of_forall (kernel_bound hd φ)) (2 : ℝ≥0∞) + have hfinite : ENNReal.ofReal D * eLpNorm (kernel φ) 2 + (Gagliardo.gagliardoCubeMeasure Q) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hφ.2.2.ne + have hmem : Gagliardo.MemWsp Q (3 / 4 : ℝ) 2 φ := + ⟨supKernel_measurable hφ.1, lt_of_le_of_lt hle (lt_top_iff_ne_top.mpr hfinite)⟩ + refine ⟨hmem, ?_⟩ + have hr := ENNReal.toReal_mono hfinite hle + simpa [Book.Ch01.Legacy.fractionalSobolevSeminorm, + Gagliardo.cubeGagliardoSeminorm, Gagliardo.cubeGagliardoESeminorm, + seminorm, ENNReal.toReal_mul, ENNReal.toReal_ofReal hD, D] using hr + +private theorem partialSeminorm_bound {d : ℕ} [NeZero d] {Q : TriadicCube d} + {φ : Vec d → ℝ} (hφ : MemLp φ 2 (normalizedCubeMeasure Q)) + (hW : Gagliardo.MemWsp Q (3 / 4 : ℝ) 2 φ) (N : ℕ) : + cubeBesovPartialSeminorm Q (3 / 4 : ℝ) 2 2 N φ ≤ + (3 : ℝ) ^ ((d : ℝ) / 2) * Book.Ch01.Legacy.wspVsBsppConstant d * + Book.Ch01.Legacy.fractionalSobolevSeminorm Q (3 / 4 : ℝ) 2 φ := by + obtain ⟨ψ, hψ, heq⟩ := hφ.1.aemeasurable + have heqCube := Gagliardo.ae_normalizedCubeMeasure_iff.mp heq + have hψW := (Gagliardo.memWsp_congr_ae heqCube).mp hW + have hbound := Book.Ch01.Legacy.besovOverlapPartial_le_const_mul_gagliardo Q + (by norm_num : (0 : ℝ) < 3 / 4) (by norm_num : (1 : ℝ≥0∞) ≤ 2) + (by norm_num : (2 : ℝ≥0∞) ≠ ∞) hψ (hφ.ae_eq heq) hψW N + have hpart := Gagliardo.overlap_partialSeminorm_congr_ae + (s := (3 / 4 : ℝ)) (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) (N := N) heqCube + have hsemi := Gagliardo.cubeGagliardoESeminorm_congr_ae + (s := (3 / 4 : ℝ)) (p := (2 : ℝ≥0∞)) heqCube + have hbound' : cubeBesovOverlapPartialSeminorm Q (3 / 4 : ℝ) 2 2 N φ ≤ + Book.Ch01.Legacy.wspVsBsppConstant d * + Book.Ch01.Legacy.fractionalSobolevSeminorm Q (3 / 4 : ℝ) 2 φ := by + simpa [hpart, Book.Ch01.Legacy.fractionalSobolevSeminorm, + Gagliardo.cubeGagliardoSeminorm, hsemi] using hbound + have hdis := cubeBesovPartialSeminorm_le_three_rpow_mul_overlapPartialSeminorm + Q (3 / 4 : ℝ) (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) + (by norm_num) (by norm_num) N φ + calc + _ ≤ (3 : ℝ) ^ ((d : ℝ) / 2) * + cubeBesovOverlapPartialSeminorm Q (3 / 4 : ℝ) 2 2 N φ := by simpa using hdis + _ ≤ _ := by + simpa [mul_assoc] using mul_le_mul_of_nonneg_left hbound' + (Real.rpow_nonneg (by norm_num : (0 : ℝ) ≤ 3) ((d : ℝ) / 2)) + + +private theorem conj_two : cubeBesovConjExponent 2 = 2 := by + simpa [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞))) + +private theorem one_le_comparisonConstant {d : ℕ} (hd : 2 ≤ d) : + 1 ≤ comparisonConstant d := by + apply one_le_mul_of_one_le_of_one_le + · exact one_le_mul_of_one_le_of_one_le (Real.one_le_rpow (by norm_num) (by positivity)) + (Book.Ch01.Legacy.one_le_wspVsBsppConstant d) + · exact Real.one_le_rpow (by exact_mod_cast (show 1 ≤ d by omega)) (by positivity) + +private theorem partialTestNorm_bound {d : ℕ} [NeZero d] (hd : 2 ≤ d) + {Q : TriadicCube d} {φ : Vec d → ℝ} (hφ : isDualTest Q φ) (N : ℕ) : + cubeBesovDualTestNorm Q (3 / 4 : ℝ) 2 2 N φ ≤ comparisonConstant d := by + obtain ⟨hW, hsup⟩ := supSeminorm_bound hd hφ.1 + have hpart := partialSeminorm_bound hφ.1.1 hW N + have hA : 0 ≤ (3 : ℝ) ^ ((d : ℝ) / 2) * Book.Ch01.Legacy.wspVsBsppConstant d := + mul_nonneg (Real.rpow_nonneg (by norm_num) _) (Book.Ch01.Legacy.wspVsBsppConstant_pos d).le + have hsemi : cubeBesovPartialSeminorm Q (3 / 4 : ℝ) 2 2 N φ ≤ + comparisonConstant d * seminorm Q φ := by + exact hpart.trans (by simpa [comparisonConstant, mul_assoc] using + mul_le_mul_of_nonneg_left hsup hA) + have hmean : ‖cubeAverage Q φ‖ ≤ cubeLpNorm Q 2 φ := + norm_cubeAverage_le_cubeLpNorm_two Q φ hφ.1.1 + have hweight : 0 ≤ cubeScaleFactor Q ^ (-(3 / 4 : ℝ)) := + Real.rpow_nonneg (by unfold cubeScaleFactor; positivity) _ + have hmean' : cubeScaleFactor Q ^ (-(3 / 4 : ℝ)) * ‖cubeAverage Q φ‖ ≤ + comparisonConstant d * + (cubeScaleFactor Q ^ (-(3 / 4 : ℝ)) * cubeLpNorm Q 2 φ) := by + exact (mul_le_mul_of_nonneg_left hmean hweight).trans + (le_mul_of_one_le_left (mul_nonneg hweight (cubeLpNorm_nonneg Q 2 φ)) + (one_le_comparisonConstant hd)) + rw [cubeBesovDualTestNorm_of_conjExponent_ne_top _ _ _ _ _ _ (by rw [conj_two]; norm_num), + conj_two, cubeBesovPartialNorm] + calc + _ ≤ comparisonConstant d * seminorm Q φ + comparisonConstant d * + (cubeScaleFactor Q ^ (-(3 / 4 : ℝ)) * cubeLpNorm Q 2 φ) := + add_le_add hsemi hmean' + _ = comparisonConstant d * testNorm Q φ := by rw [testNorm, mul_add] + _ ≤ comparisonConstant d := by + simpa using mul_le_mul_of_nonneg_left hφ.2 (comparisonConstant_pos (d := d)).le + +private theorem scaledTest {d : ℕ} [NeZero d] (hd : 2 ≤ d) + {Q : TriadicCube d} {φ : Vec d → ℝ} (hφ : isDualTest Q φ) : + CubeBesovDualFullTest Q (3 / 4 : ℝ) 2 2 + (fun x => (comparisonConstant d)⁻¹ * φ x) := by + apply cubeBesovDualFullTest_two_two_of_uniform_bound Q (3 / 4 : ℝ) φ + (comparisonConstant_pos (d := d)) (partialTestNorm_bound hd hφ) + intro j R hR + rw [conj_two] + exact (memLp_on_descendant_of_memLp hR hφ.1.1).sub (memLp_const _) + +/-- The classical unit ball gives bounded pairings with every L² field. -/ +theorem pairing_le_mul_dualFullNorm {d : ℕ} [NeZero d] (Q : TriadicCube d) + (f : Vec d → ℝ) (hd : 2 ≤ d) (hf : MemLp f 2 (normalizedCubeMeasure Q)) + {φ : Vec d → ℝ} (hφ : isDualTest Q φ) : + |cubeBesovPairing Q f φ| ≤ + comparisonConstant d * cubeBesovDualFullNorm Q (3 / 4 : ℝ) 2 2 f := by + have hbound := abs_cubeBesovPairing_le_cubeBesovDualFullNorm_of_full_test_of_memLp + Q (3 / 4 : ℝ) 2 2 f (fun x => (comparisonConstant d)⁻¹ * φ x) + (by norm_num) hf (by norm_num) (by norm_num) (by rw [conj_two]; norm_num) + (by norm_num) (scaledTest hd hφ) + rw [cubeBesovPairing_const_mul_right, abs_mul, + abs_of_pos (inv_pos.mpr (comparisonConstant_pos (d := d)))] at hbound + exact (inv_mul_le_iff₀ (comparisonConstant_pos (d := d))).mp hbound + +/-- Zero is an admissible classical test. -/ +theorem isDualTest_zero {d : ℕ} (Q : TriadicCube d) : + isDualTest Q (fun _ => 0) := by + have hk : kernel (fun _ : Vec d => (0 : ℝ)) = 0 := by + funext z + simp [kernel] + refine ⟨⟨(memLp_const (0 : ℝ)), ?_⟩, ?_⟩ + · rw [hk] + exact (memLp_const (0 : ℝ)) + · simp [testNorm, seminorm, hk, cubeLpNorm] + +/-- The pairing set is nonempty independently of any regularity of the field. -/ +theorem valueSet_nonempty {d : ℕ} (Q : TriadicCube d) (f : Vec d → ℝ) : + (valueSet Q f).Nonempty := by + refine ⟨0, fun _ => 0, isDualTest_zero Q, ?_⟩ + simp [cubeBesovPairing, cubeAverage_const] + +/-- On L² fields the real supremum cannot collapse through unboundedness. -/ +theorem valueSet_bddAbove {d : ℕ} [NeZero d] (Q : TriadicCube d) + (f : Vec d → ℝ) (hd : 2 ≤ d) (hf : MemLp f 2 (normalizedCubeMeasure Q)) : + BddAbove (valueSet Q f) := by + refine ⟨comparisonConstant d * cubeBesovDualFullNorm Q (3 / 4 : ℝ) 2 2 f, ?_⟩ + rintro r ⟨φ, hφ, rfl⟩ + exact pairing_le_mul_dualFullNorm Q f hd hf hφ + +/-- The full Euclidean classical negative norm is dominated by the legacy +partition dual, with a coefficient depending only on the dimension. -/ +theorem negativeNorm_le_mul_dualFullNorm {d : ℕ} [NeZero d] (Q : TriadicCube d) + (f : Vec d → ℝ) (hd : 2 ≤ d) (hf : MemLp f 2 (normalizedCubeMeasure Q)) : + negativeNorm Q f ≤ + comparisonConstant d * cubeBesovDualFullNorm Q (3 / 4 : ℝ) 2 2 f := by + apply csSup_le (valueSet_nonempty Q f) + rintro r ⟨φ, hφ, rfl⟩ + exact pairing_le_mul_dualFullNorm Q f hd hf hφ + +/-- Each admissible pairing is bounded by the genuine finite classical dual. -/ +theorem pairing_le_negativeNorm {d : ℕ} [NeZero d] (Q : TriadicCube d) + (f : Vec d → ℝ) (hd : 2 ≤ d) (hf : MemLp f 2 (normalizedCubeMeasure Q)) + {φ : Vec d → ℝ} (hφ : isDualTest Q φ) : + |cubeBesovPairing Q f φ| ≤ negativeNorm Q f := + le_csSup (valueSet_bddAbove Q f hd hf) ⟨φ, hφ, rfl⟩ + +end +end Homogenization.ClassicalSobolev34 diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CongruenceAE.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CongruenceAE.lean new file mode 100644 index 0000000000..6b2acb5e7f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/CongruenceAE.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Full + +/-! +# Almost-everywhere congruence for the fractional Sobolev and Besov seminorms + +All quantities in the `W^{s,p}` versus `B^s_{p,p}` comparison are invariant +under modifying `u` on a null set of the cube. This file proves the +congruence lemmas once, against the canonical hypothesis +`u =ᵐ[cubeMeasure Q] v`: + +* `gagliardoKernel_congr_ae`, `cubeGagliardoESeminorm_congr_ae`, + `memWsp_congr_ae` (generic target `E`); +* `cubeBesovOverlapSeminorm_congr_ae` (scalar, all `q`); +* the `ae`-filter equivalence between `normalizedCubeMeasure Q` and + `cubeMeasure Q`. + +These discharge the `congr_ae` item of the frozen API surface and enable the +measurability-free public wrapper of CG Lemma 1.3. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory ScalarOverlap +open scoped ENNReal BigOperators + +variable {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + +/-- The normalized and plain cube measures have the same `ae` filter. -/ +theorem ae_normalizedCubeMeasure_iff {Q : TriadicCube d} {prop : Vec d → Prop} : + (∀ᵐ x ∂normalizedCubeMeasure Q, prop x) ↔ + ∀ᵐ x ∂Homogenization.cubeMeasure Q, prop x := by + have hc0 : ENNReal.ofReal (cubeVolume Q)⁻¹ ≠ 0 := by + rw [Ne, ENNReal.ofReal_eq_zero, not_le] + exact inv_pos.2 (cubeVolume_pos Q) + constructor + · intro hp + rw [normalizedCubeMeasure, Filter.eventually_iff, mem_ae_iff, + Measure.smul_apply, smul_eq_mul, mul_eq_zero] at hp + rw [Filter.eventually_iff, mem_ae_iff] + exact hp.resolve_left hc0 + · intro hp + rw [normalizedCubeMeasure] + exact Measure.ae_smul_measure hp _ + +/-- Kernel congruence: modifying `u` on a cube-null set changes the Gagliardo +kernel only on a `gagliardoCubeMeasure`-null set of pairs. -/ +theorem gagliardoKernel_congr_ae {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + {u v : Vec d → E} (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + gagliardoKernel s p u =ᵐ[gagliardoCubeMeasure Q] gagliardoKernel s p v := by + have : SFinite (Homogenization.cubeMeasure Q) := by + unfold Homogenization.cubeMeasure + infer_instance + have hnorm : u =ᵐ[normalizedCubeMeasure Q] v := + ae_normalizedCubeMeasure_iff.2 h + have h1 : (fun z : Vec d × Vec d => u z.1) =ᵐ[gagliardoCubeMeasure Q] + fun z => v z.1 := by + rw [gagliardoCubeMeasure] + exact Measure.quasiMeasurePreserving_fst.ae_eq hnorm + have h2 : (fun z : Vec d × Vec d => u z.2) =ᵐ[gagliardoCubeMeasure Q] + fun z => v z.2 := by + rw [gagliardoCubeMeasure] + exact Measure.quasiMeasurePreserving_snd.ae_eq h + filter_upwards [h1, h2] with z hz1 hz2 + rw [gagliardoKernel_apply, gagliardoKernel_apply, hz1, hz2] + +/-- A.e.-congruence of the fractional Sobolev seminorm. -/ +theorem cubeGagliardoESeminorm_congr_ae {Q : TriadicCube d} {s : ℝ} + {p : ℝ≥0∞} {u v : Vec d → E} + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + cubeGagliardoESeminorm Q s p u = cubeGagliardoESeminorm Q s p v := by + exact integralLpSeminorm_congr_ae (gagliardoKernel_congr_ae h) + +/-- A.e.-congruence of `W^{s,p}` membership. -/ +theorem memWsp_congr_ae {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + {u v : Vec d → E} (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + MemWsp Q s p u ↔ MemWsp Q s p v := + memLp_congr_ae (gagliardoKernel_congr_ae h) + +section BesovCongruence + +variable {Q : TriadicCube d} {u v : Vec d → ℝ} + +/-- Restriction of the congruence hypothesis to an overlap center's enlarged +cube. -/ +theorem ae_overlap_of_ae_cube {j : ℕ} {S : TriadicCube d} + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + u =ᵐ[MeasureTheory.volume.restrict (ScalarOverlap.cubeSet S)] v := by + have hsub : ScalarOverlap.cubeSet S ⊆ Homogenization.cubeSet Q := + cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + rw [Homogenization.cubeMeasure] at h + exact ae_restrict_of_ae_restrict_of_subset hsub h + +theorem overlap_cubeAverage_congr_ae {j : ℕ} {S : TriadicCube d} + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + ScalarOverlap.cubeAverage S u = ScalarOverlap.cubeAverage S v := by + unfold ScalarOverlap.cubeAverage + congr 1 + exact integral_congr_ae (ae_overlap_of_ae_cube hS h) + +theorem overlap_oscillation_congr_ae {p : ℝ≥0∞} {j : ℕ} {S : TriadicCube d} + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + cubeBesovOverlapOscillation S p u = cubeBesovOverlapOscillation S p v := by + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + congr 1 + refine integralLpSeminorm_congr_ae ?_ + have hres := ae_overlap_of_ae_cube hS h + have hresn : u =ᵐ[ScalarOverlap.normalizedCubeMeasure S] v := by + rw [ScalarOverlap.normalizedCubeMeasure, ScalarOverlap.cubeMeasure] + exact Measure.ae_smul_measure hres _ + filter_upwards [hresn] with x hx + rw [hx, overlap_cubeAverage_congr_ae hS h] + +theorem overlap_depthAverage_congr_ae {p : ℝ≥0∞} {j : ℕ} + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + cubeBesovOverlapDepthAverage Q p u j = cubeBesovOverlapDepthAverage Q p v j := by + have hsum : (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + cubeBesovOverlapOscillation S p u ^ p.toReal) = + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + cubeBesovOverlapOscillation S p v ^ p.toReal := + Finset.sum_congr rfl fun S hS => by + rw [overlap_oscillation_congr_ae hS h] + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + simpa using congrArg (((ScalarOverlap.centersAtDepth Q j).card : ℝ)⁻¹ * ·) hsum + +theorem overlap_partialSeminorm_congr_ae {s : ℝ} {p q : ℝ≥0∞} {N : ℕ} + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + cubeBesovOverlapPartialSeminorm Q s p q N u = + cubeBesovOverlapPartialSeminorm Q s p q N v := by + unfold cubeBesovOverlapPartialSeminorm + congr 1 + refine Finset.sum_congr rfl fun j _hj => ?_ + unfold cubeBesovOverlapDepthSeminorm + rw [overlap_depthAverage_congr_ae h] + +/-- A.e.-congruence of the full overlapping Besov seminorm (any `q`). -/ +theorem cubeBesovOverlapSeminorm_congr_ae {s : ℝ} {p q : ℝ≥0∞} + (h : u =ᵐ[Homogenization.cubeMeasure Q] v) : + cubeBesovOverlapSeminorm Q s p q u = cubeBesovOverlapSeminorm Q s p q v := by + unfold cubeBesovOverlapSeminorm cubeBesovOverlapSeminormValueSet + congr 1 + ext x + constructor + · rintro ⟨N, rfl⟩ + exact ⟨N, (overlap_partialSeminorm_congr_ae h).symm⟩ + · rintro ⟨N, rfl⟩ + exact ⟨N, overlap_partialSeminorm_congr_ae h⟩ + +end BesovCongruence + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Constants.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Constants.lean new file mode 100644 index 0000000000..7f0cae9f8e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Constants.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.SpecialFunctions.Pow.NNReal +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.Analysis.SpecificLimits.Basic + +/-! +# Constants for the fractional Sobolev versus Besov comparison + +Every numeric fact used by the `W^{s,p}` versus `B^s_{p,p}` equivalence is +proved here, once, with explicit hypotheses. The proof files consume these +lemmas with `exact`; no `positivity`/`nlinarith` grinding happens outside this +file. + +Uniformity ledger (each bound is uniform in `s ∈ (0,1)` and `p ∈ [1,∞)`, so +the final equivalence constant depends on the dimension only): + +* geometric tails have ratio at most `3⁻¹`, hence sum at most `3/2 ≤ 2`; +* the kernel-insertion prefactor `3^{d/p+s}` is at most `3^{d+1}`; +* the triangle-splitting factor `(2^{p-1})^{1/p}` is at most `2`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open scoped ENNReal + +/-- Geometric series with ratio at most `3⁻¹` sums to at most `2` in `ℝ≥0∞`. -/ +theorem tsum_pow_le_two_of_le_third {c : ℝ≥0∞} (hc : c ≤ 3⁻¹) : + (∑' n : ℕ, c ^ n) ≤ 2 := by + have hc2 : c ≤ 2⁻¹ := + hc.trans (ENNReal.inv_le_inv.2 (by norm_num)) + have hsum : (∑' n : ℕ, c ^ n) ≤ ∑' n : ℕ, ((2 : ℝ≥0∞)⁻¹) ^ n := + ENNReal.tsum_le_tsum fun n => pow_le_pow_left' hc2 n + refine hsum.trans ?_ + rw [ENNReal.tsum_geometric] + have hhalf : (1 : ℝ≥0∞) - 2⁻¹ = 2⁻¹ := + ENNReal.sub_eq_of_eq_add (by simp) ENNReal.inv_two_add_inv_two.symm + rw [hhalf, inv_inv] + +/-- Finite geometric sums with ratio at most `3⁻¹` are at most `2` in `ℝ≥0∞`. -/ +theorem sum_range_pow_le_two_of_le_third {c : ℝ≥0∞} (hc : c ≤ 3⁻¹) (N : ℕ) : + (∑ n ∈ Finset.range N, c ^ n) ≤ 2 := + (ENNReal.sum_le_tsum (Finset.range N)).trans (tsum_pow_le_two_of_le_third hc) + +/-- The kernel-insertion prefactor collapses to a dimensional constant: +`3^{d/p + s} ≤ 3^{d+1}` for `s < 1 ≤ p`, in `ℝ≥0∞`. -/ +theorem rpow_three_kernel_exponent_le {d : ℕ} {s pr : ℝ} + (hs : s < 1) (hp : 1 ≤ pr) : + (3 : ℝ≥0∞) ^ ((d : ℝ) / pr + s) ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) := by + refine ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) ?_ + have hd : (d : ℝ) / pr ≤ (d : ℝ) := by + apply div_le_self (Nat.cast_nonneg d) hp + linarith + +/-- Triangle-splitting cost after the `p`-th root: `(2^{p-1})^{1/p} ≤ 2` +for `p ≥ 1`, phrased in `ℝ≥0∞`. -/ +theorem rpow_two_sub_one_div_le_two {pr : ℝ} (hp : 1 ≤ pr) : + (2 : ℝ≥0∞) ^ ((pr - 1) * (1 / pr)) ≤ 2 := by + have hexp : (pr - 1) * (1 / pr) ≤ 1 := by + have hpr : 0 < pr := lt_of_lt_of_le one_pos hp + rw [mul_one_div, div_le_one hpr] + linarith + calc (2 : ℝ≥0∞) ^ ((pr - 1) * (1 / pr)) ≤ (2 : ℝ≥0∞) ^ (1 : ℝ) := + ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) hexp + _ = 2 := by simp + +/-- Monotone collapse for powers of three with bounded exponent, `ℝ≥0∞` form. -/ +theorem rpow_three_le_rpow_three {a b : ℝ} (h : a ≤ b) : + (3 : ℝ≥0∞) ^ a ≤ (3 : ℝ≥0∞) ^ b := + ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) h + +/-- `3^x` is positive (nonzero) in `ℝ≥0∞`. -/ +theorem rpow_three_ne_zero (x : ℝ) : (3 : ℝ≥0∞) ^ x ≠ 0 := by + simp [ENNReal.rpow_eq_zero_iff] + +/-- `3^x` is finite in `ℝ≥0∞`. -/ +theorem rpow_three_ne_top (x : ℝ) : (3 : ℝ≥0∞) ^ x ≠ ∞ := by + simp [ENNReal.rpow_eq_top_iff] + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation.lean new file mode 100644 index 0000000000..e1d79293c5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation.lean @@ -0,0 +1,31 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.AllDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKSeriesBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuumSampleClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.DiscreteKOverlapEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanHsMeasurability +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.FullNormEquivalence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.KInfimum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.MeasurableRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapGagliardoBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.PositiveDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.RootScaleControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.SeminormComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicScale +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicSeries +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ZeroDimensionalClosure + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/AllDimensionalComposition.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/AllDimensionalComposition.lean new file mode 100644 index 0000000000..17c77fcd84 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/AllDimensionalComposition.lean @@ -0,0 +1,161 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.PositiveDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.MeasurableRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ZeroDimensionalClosure + +/-! +# All-dimensional composition of sampled continuous K and Euclidean energies + +This module removes the positive-dimension and measurability hypotheses from +the energy comparisons. Dimension zero is closed exactly, while positive +dimensions use the chosen measurable representative. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- A normalized-volume a.e. replacement preserves each weighted triadic +continuous `K` sample. -/ +theorem triadicContinuousKSampleTerm_congr_ae {d : ℕ} + (s : FractionalOrder) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) (j : ℕ) : + triadicContinuousKSampleTerm s F j = triadicContinuousKSampleTerm s H j := by + unfold triadicContinuousKSampleTerm + rw [continuousKFunctional_congr_ae (triadicContinuousKScale j) hFH] + +/-- A normalized-volume a.e. replacement preserves the full triadic sampled +continuous `K` energy. -/ +theorem triadicContinuousKSampleEnergy_congr_ae {d : ℕ} + (s : FractionalOrder) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + triadicContinuousKSampleEnergy s F = triadicContinuousKSampleEnergy s H := by + unfold triadicContinuousKSampleEnergy + apply tsum_congr + intro j + exact triadicContinuousKSampleTerm_congr_ae s hFH j + +/-- A normalized-volume a.e. replacement preserves the endpoint-excluded +triadic sampled continuous `K` energy. -/ +theorem triadicContinuousKShiftedSampleEnergy_congr_ae {d : ℕ} + (s : FractionalOrder) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + triadicContinuousKShiftedSampleEnergy s F = + triadicContinuousKShiftedSampleEnergy s H := by + unfold triadicContinuousKShiftedSampleEnergy + apply tsum_congr + intro j + exact triadicContinuousKSampleTerm_congr_ae s hFH (j + 1) + +namespace UnitCubeEuclideanL2Field + +/-- The selected measurable representative preserves the full triadic sampled +continuous `K` energy. -/ +theorem triadicContinuousKSampleEnergy_eq_measurableRepresentative {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F = + triadicContinuousKSampleEnergy s F.measurableRepresentative := + triadicContinuousKSampleEnergy_congr_ae s F.ae_eq_measurableRepresentative + +end UnitCubeEuclideanL2Field + +/-- The all-dimensional finite constant for the sampled-energy to +Euclidean-energy direction. -/ +noncomputable def allDimensionalSampleToHsConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + positiveDimensionalSampleToHsConstant s d + +/-- The all-dimensional finite constant for the Euclidean-energy to +sampled-energy direction. -/ +noncomputable def allDimensionalHsToSampleConstant (d : ℕ) : ℝ≥0∞ := + positiveDimensionalHsToSampleConstant d + +theorem allDimensionalSampleToHsConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + allDimensionalSampleToHsConstant s d < ∞ := by + exact positiveDimensionalSampleToHsConstant_lt_top s d + +theorem allDimensionalHsToSampleConstant_lt_top (d : ℕ) : + allDimensionalHsToSampleConstant d < ∞ := by + exact positiveDimensionalHsToSampleConstant_lt_top d + +/-- In every dimension, the sampled continuous `K` energy controls the exact +Euclidean `H^s` energy. -/ +theorem euclideanHsEnergy_le_mul_triadicContinuousKSampleEnergy_all_dim + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsEnergy s F ≤ + allDimensionalHsToSampleConstant d * triadicContinuousKSampleEnergy s F := by + cases d with + | zero => + rw [euclideanHsEnergy_zero_dim, triadicContinuousKSampleEnergy_zero_dim] + simp + | succ d => + let : NeZero (Nat.succ d) := ⟨Nat.succ_ne_zero d⟩ + calc + euclideanHsEnergy s F = euclideanHsEnergy s F.measurableRepresentative := + F.euclideanHsEnergy_eq_measurableRepresentative s + _ ≤ positiveDimensionalHsToSampleConstant (Nat.succ d) * + triadicContinuousKSampleEnergy s F.measurableRepresentative := + euclideanHsEnergy_le_mul_triadicContinuousKSampleEnergy s + F.measurableRepresentative F.measurable_measurableRepresentative + _ = allDimensionalHsToSampleConstant (Nat.succ d) * + triadicContinuousKSampleEnergy s F := by + rw [← F.triadicContinuousKSampleEnergy_eq_measurableRepresentative s] + rfl + +/-- In every dimension, the exact Euclidean `H^s` energy controls the sampled +continuous `K` energy. -/ +theorem triadicContinuousKSampleEnergy_le_mul_euclideanHsEnergy_all_dim + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F ≤ + allDimensionalSampleToHsConstant s d * euclideanHsEnergy s F := by + cases d with + | zero => + rw [triadicContinuousKSampleEnergy_zero_dim, euclideanHsEnergy_zero_dim] + simp + | succ d => + let : NeZero (Nat.succ d) := ⟨Nat.succ_ne_zero d⟩ + calc + triadicContinuousKSampleEnergy s F = + triadicContinuousKSampleEnergy s F.measurableRepresentative := + F.triadicContinuousKSampleEnergy_eq_measurableRepresentative s + _ ≤ positiveDimensionalSampleToHsConstant s (Nat.succ d) * + euclideanHsEnergy s F.measurableRepresentative := + triadicContinuousKSampleEnergy_le_mul_euclideanHsEnergy s + F.measurableRepresentative F.measurable_measurableRepresentative + _ = allDimensionalSampleToHsConstant s (Nat.succ d) * euclideanHsEnergy s F := by + rw [← F.euclideanHsEnergy_eq_measurableRepresentative s] + rfl + +/-- The exact Euclidean and sampled continuous `K` energies are finite under +the same condition in every dimension. -/ +theorem euclideanHsEnergy_lt_top_iff_triadicContinuousKSampleEnergy_lt_top + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsEnergy s F < ∞ ↔ triadicContinuousKSampleEnergy s F < ∞ := by + constructor + · intro hF + apply lt_top_iff_ne_top.mpr + exact ne_top_of_le_ne_top + (ENNReal.mul_ne_top (allDimensionalSampleToHsConstant_lt_top s d).ne hF.ne) + (triadicContinuousKSampleEnergy_le_mul_euclideanHsEnergy_all_dim s F) + · intro hF + apply lt_top_iff_ne_top.mpr + exact ne_top_of_le_ne_top + (ENNReal.mul_ne_top (allDimensionalHsToSampleConstant_lt_top d).ne hF.ne) + (euclideanHsEnergy_le_mul_triadicContinuousKSampleEnergy_all_dim s F) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKBridge.lean new file mode 100644 index 0000000000..41b01b1bfb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKBridge.lean @@ -0,0 +1,579 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.KFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.KInfimum +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry + +/-! +# Exact continuous-to-discrete unit-cube K-functional bridge + +This module identifies the two genuine coordinatewise `H¹` competitor spaces +on the origin unit cube, and compares their residual and gradient quantities. +The resulting inequalities are internal transport facts for the finite-depth +continuous interpolation argument. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- Regard a continuous source competitor as an internal cube competitor on +the origin unit cube. -/ +def ContinuousKCompetitor.toCubeVectorH1Function {d : ℕ} + (G : ContinuousKCompetitor d) : CubeVectorH1Function (originCube d 0) where + coord := G.coord + +/-- Regard an internal origin-unit-cube competitor as a continuous source +competitor. -/ +def CubeVectorH1Function.toContinuousKCompetitor {d : ℕ} + (G : CubeVectorH1Function (originCube d 0)) : ContinuousKCompetitor d where + coord := G.coord + +@[simp] theorem ContinuousKCompetitor.toCubeVectorH1Function_coord {d : ℕ} + (G : ContinuousKCompetitor d) (i : Fin d) : + G.toCubeVectorH1Function.coord i = G.coord i := rfl + +@[simp] theorem CubeVectorH1Function.toContinuousKCompetitor_coord {d : ℕ} + (G : CubeVectorH1Function (originCube d 0)) (i : Fin d) : + G.toContinuousKCompetitor.coord i = G.coord i := rfl + +@[simp] theorem ContinuousKCompetitor.toCubeVectorH1Function_toField {d : ℕ} + (G : ContinuousKCompetitor d) : + G.toCubeVectorH1Function.toField = G.toField := rfl + +@[simp] theorem CubeVectorH1Function.toContinuousKCompetitor_toField {d : ℕ} + (G : CubeVectorH1Function (originCube d 0)) : + G.toContinuousKCompetitor.toField = G.toField := rfl + +@[simp] theorem ContinuousKCompetitor.toCubeVectorH1Function_grad_apply {d : ℕ} + (G : ContinuousKCompetitor d) (x : Vec d) (i j : Fin d) : + (G.toCubeVectorH1Function.coord i).grad x j = G.gradient x i j := rfl + +@[simp] theorem CubeVectorH1Function.toContinuousKCompetitor_gradient_apply {d : ℕ} + (G : CubeVectorH1Function (originCube d 0)) (x : Vec d) (i j : Fin d) : + G.toContinuousKCompetitor.gradient x i j = (G.coord i).grad x j := rfl + +@[simp] theorem ContinuousKCompetitor.toCubeVectorH1Function_toContinuousKCompetitor + {d : ℕ} (G : ContinuousKCompetitor d) : + G.toCubeVectorH1Function.toContinuousKCompetitor = G := by + cases G + rfl + +@[simp] theorem CubeVectorH1Function.toContinuousKCompetitor_toCubeVectorH1Function + {d : ℕ} (G : CubeVectorH1Function (originCube d 0)) : + G.toContinuousKCompetitor.toCubeVectorH1Function = G := by + cases G + rfl + +/-- On the unit cube, the internal cube normalization is exactly the source +normalized volume. -/ +theorem normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume + (d : ℕ) : + normalizedCubeMeasure (originCube d 0) = (unitCenteredCubeDomain d).normalizedVolume := + (unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure d).symm + +/-- On the origin unit cube the normalized cube measure is literally volume +restricted to the analytic open cube. -/ +theorem normalizedCubeMeasure_originCube_zero_eq_volumeMeasureOn_openCubeSet + (d : ℕ) : + normalizedCubeMeasure (originCube d 0) = + volumeMeasureOn (openCubeSet (originCube d 0)) := by + rw [normalizedCubeMeasure, cubeVolume_originCube_zero] + simp only [inv_one, ENNReal.ofReal_one, one_smul] + exact volume_restrict_cubeSet_eq_volume_restrict_openCubeSet (originCube d 0) + +/-- The scale factor of the origin unit cube is one. -/ +theorem cubeScaleFactor_originCube_zero (d : ℕ) : + cubeScaleFactor (originCube d 0) = 1 := by + simp only [cubeScaleFactor_originCube, zpow_zero] + +/-- The internal relative gradient size has no additional geometric factor on +the origin unit cube. -/ +@[simp] theorem CubeVectorH1Function.relativeGradientCoordL2NormSum_originCube_zero + {d : ℕ} (G : CubeVectorH1Function (originCube d 0)) : + G.relativeGradientCoordL2NormSum = G.gradientCoordL2NormSum := by + simp only [CubeVectorH1Function.relativeGradientCoordL2NormSum, + cubeScaleFactor_originCube_zero, cubeVolume_originCube_zero] + norm_num + +/-- On the unit cube, the internal ambient-norm residual is bounded by the +source Euclidean residual. -/ +theorem cubeResidualNorm_le_continuousKResidualNorm {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (G : ContinuousKCompetitor d) : + cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toCubeVectorH1Function.toField x) ≤ + continuousKResidualNorm F G := by + have hmem : MeasureTheory.MemLp + (fun x => euclideanNorm (F x - G.toField x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + have hsub := F.euclideanMemL2.sub G.euclideanMemL2 + simpa only [euclideanNorm_eq_norm_ofVec, HilbertVec.ofVec, PiLp.toLp_apply, + Pi.sub_apply] using! hsub.norm + change + (MeasureTheory.eLpNorm + (fun x => F x - G.toField x) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0))).toReal ≤ + (MeasureTheory.eLpNorm + (fun x => euclideanNorm (F x - G.toField x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + apply ENNReal.toReal_mono hmem.eLpNorm_ne_top + apply MeasureTheory.eLpNorm_mono + intro x + simpa only [Real.norm_eq_abs, abs_of_nonneg (euclideanNorm_nonneg _)] using + norm_le_euclideanNorm (F x - G.toField x) + +/-- On the unit cube, the source Euclidean residual is bounded by a positive +all-dimension multiple of the internal ambient-norm residual. -/ +theorem continuousKResidualNorm_le_dimPlusOne_mul_cubeResidualNorm {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (G : ContinuousKCompetitor d) : + continuousKResidualNorm F G ≤ + (d + 1 : ℝ) * cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toCubeVectorH1Function.toField x) := by + let R : Vec d → Vec d := fun x => F x - G.toField x + let C : ℝ := d + 1 + have hC_nonneg : 0 ≤ C := by + dsimp [C] + positivity + have hR_vec_mem : MeasureTheory.MemLp R (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + apply MeasureTheory.MemLp.of_eval + intro i + have hF := F.euclideanMemL2 + rw [MeasureTheory.memLp_piLp_iff] at hF + have hG := G.euclideanMemL2 + rw [MeasureTheory.memLp_piLp_iff] at hG + simpa only [R, Pi.sub_apply, HilbertVec.ofVec, PiLp.toLp_apply] using! + (hF i).sub (hG i) + have hbound : ∀ x : Vec d, euclideanNorm (R x) ≤ ‖C • R x‖ := by + intro x + rw [norm_smul, Real.norm_eq_abs, abs_of_nonneg hC_nonneg] + calc + euclideanNorm (R x) ≤ (d : ℝ) * ‖R x‖ := + euclideanNorm_le_dimension_mul_norm (R x) + _ ≤ C * ‖R x‖ := by + apply mul_le_mul_of_nonneg_right + · dsimp [C] + norm_num + · exact norm_nonneg _ + change + (MeasureTheory.eLpNorm (fun x => euclideanNorm (R x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal ≤ + C * (MeasureTheory.eLpNorm R (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0))).toReal + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + calc + (MeasureTheory.eLpNorm (fun x => euclideanNorm (R x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal + ≤ (MeasureTheory.eLpNorm (fun x => C • R x) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal := + ENNReal.toReal_mono + ((hR_vec_mem.const_smul C).eLpNorm_ne_top) + (by + apply MeasureTheory.eLpNorm_mono + intro x + simpa only [Real.norm_eq_abs, abs_of_nonneg (euclideanNorm_nonneg _)] using + hbound x) + _ = C * (MeasureTheory.eLpNorm R (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal := by + rw [show (fun x => C • R x) = C • R by rfl, + MeasureTheory.eLpNorm_const_smul, ENNReal.toReal_mul] + simp [Real.norm_eq_abs, abs_of_nonneg hC_nonneg] + +/-- The internal coordinate-summed gradient norm is the corresponding finite +sum of normalized unit-cube `L²` coordinate norms. -/ +theorem CubeVectorH1Function.gradientCoordL2NormSum_eq_sum_normalizedELpNorm + {d : ℕ} (G : CubeVectorH1Function (originCube d 0)) : + G.gradientCoordL2NormSum = + ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (fun x => (G.coord i).grad x j) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0))).toReal := by + unfold CubeVectorH1Function.gradientCoordL2NormSum H1Function.gradientCoordL2NormSum + refine Finset.sum_congr rfl fun i _ => ?_ + refine Finset.sum_congr rfl fun j _ => ?_ + rw [normalizedCubeMeasure_originCube_zero_eq_volumeMeasureOn_openCubeSet] + simp [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2, + MeasureTheory.Lp.norm_toLp, volumeMeasureOn] + +/-- The Frobenius `L²` gradient quantity of a continuous competitor is bounded +by the relative coordinate-summed internal gradient quantity on the unit +cube. -/ +theorem continuousKGradientNorm_le_cubeRelativeGradientCoordL2NormSum {d : ℕ} + (G : ContinuousKCompetitor d) : + continuousKGradientNorm G ≤ + G.toCubeVectorH1Function.relativeGradientCoordL2NormSum := by + let Q : TriadicCube d := originCube d 0 + let μ : MeasureTheory.Measure (Vec d) := normalizedCubeMeasure Q + let f : Fin d → Fin d → Vec d → ℝ := fun i j x => (G.coord i).grad x j + let row : Fin d → Vec d → ℝ := fun i x => ∑ j : Fin d, ‖f i j x‖ + let total : Vec d → ℝ := fun x => ∑ i : Fin d, row i x + have hcoord : ∀ i j : Fin d, MeasureTheory.MemLp (f i j) (2 : ℝ≥0∞) μ := by + intro i j + dsimp [f, μ, Q] + exact (G.coord i).grad_memL2_normalizedCubeMeasure j + have hrow_eq : ∀ i : Fin d, row i = ∑ j : Fin d, fun x => ‖f i j x‖ := by + intro i + funext x + simp only [row, Finset.sum_apply] + have htotal_eq : total = ∑ i : Fin d, row i := by + funext x + simp only [total, Finset.sum_apply] + have hrow_meas : ∀ i : Fin d, MeasureTheory.AEStronglyMeasurable (row i) μ := by + intro i + rw [hrow_eq i] + exact Finset.aestronglyMeasurable_sum (s := Finset.univ) + (fun j _ => (hcoord i j).norm.aestronglyMeasurable) + have hrow_bound : ∀ i : Fin d, + MeasureTheory.eLpNorm (row i) (2 : ℝ≥0∞) μ ≤ + ∑ j : Fin d, MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ := by + intro i + rw [hrow_eq i] + calc + MeasureTheory.eLpNorm (∑ j : Fin d, fun x => ‖f i j x‖) (2 : ℝ≥0∞) μ + ≤ ∑ j : Fin d, + MeasureTheory.eLpNorm (fun x => ‖f i j x‖) (2 : ℝ≥0∞) μ := + MeasureTheory.eLpNorm_sum_le + (fun j _ => (hcoord i j).norm.aestronglyMeasurable) (by norm_num) + _ = ∑ j : Fin d, MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ := by + apply Finset.sum_congr rfl + intro j _ + exact MeasureTheory.eLpNorm_norm (f i j) + have htotal_bound : MeasureTheory.eLpNorm total (2 : ℝ≥0∞) μ ≤ + ∑ i : Fin d, ∑ j : Fin d, MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ := by + calc + MeasureTheory.eLpNorm total (2 : ℝ≥0∞) μ + ≤ ∑ i : Fin d, MeasureTheory.eLpNorm (row i) (2 : ℝ≥0∞) μ := by + rw [htotal_eq] + exact MeasureTheory.eLpNorm_sum_le + (fun i _ => hrow_meas i) (by norm_num) + _ ≤ ∑ i : Fin d, ∑ j : Fin d, + MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ := by + apply Finset.sum_le_sum + intro i _ + exact hrow_bound i + have hfrob_bound : MeasureTheory.eLpNorm + (fun x => matrixFrobeniusMagnitude (G.gradient x)) (2 : ℝ≥0∞) μ ≤ + MeasureTheory.eLpNorm total (2 : ℝ≥0∞) μ := by + apply MeasureTheory.eLpNorm_mono + intro x + rw [Real.norm_eq_abs, abs_of_nonneg (matrixFrobeniusMagnitude_nonneg _)] + have htotal_nonneg : 0 ≤ total x := by + dsimp [total, row] + exact Finset.sum_nonneg fun _ _ => + Finset.sum_nonneg fun _ _ => abs_nonneg _ + rw [Real.norm_eq_abs, abs_of_nonneg htotal_nonneg] + simpa only [total, row, f] using! matrixFrobeniusMagnitude_le_sum_abs (G.gradient x) + have hsum_ne_top : + (∑ i : Fin d, ∑ j : Fin d, + MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ) ≠ ∞ := by + refine ENNReal.sum_ne_top.mpr ?_ + intro i _ + refine ENNReal.sum_ne_top.mpr ?_ + intro j _ + exact (hcoord i j).eLpNorm_ne_top + rw [CubeVectorH1Function.relativeGradientCoordL2NormSum_originCube_zero] + rw [CubeVectorH1Function.gradientCoordL2NormSum_eq_sum_normalizedELpNorm] + change + (MeasureTheory.eLpNorm + (fun x => matrixFrobeniusMagnitude (G.gradient x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal ≤ _ + rw [← normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + calc + (MeasureTheory.eLpNorm + (fun x => matrixFrobeniusMagnitude (G.gradient x)) (2 : ℝ≥0∞) μ).toReal + ≤ (∑ i : Fin d, ∑ j : Fin d, + MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal := + ENNReal.toReal_mono hsum_ne_top (hfrob_bound.trans htotal_bound) + _ = ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal := by + rw [ENNReal.toReal_sum] + · apply Finset.sum_congr rfl + intro i _ + rw [ENNReal.toReal_sum] + exact fun j _ => (hcoord i j).eLpNorm_ne_top + · intro i _ + exact ENNReal.sum_ne_top.mpr fun j _ => (hcoord i j).eLpNorm_ne_top + +/-- The relative coordinate-summed internal gradient quantity is bounded by a +positive all-dimension multiple of the source Frobenius `L²` quantity. -/ +theorem cubeRelativeGradientCoordL2NormSum_le_dimPlusOne_sq_mul_continuousKGradientNorm + {d : ℕ} (G : ContinuousKCompetitor d) : + G.toCubeVectorH1Function.relativeGradientCoordL2NormSum ≤ + (d + 1 : ℝ) ^ 2 * continuousKGradientNorm G := by + let Q : TriadicCube d := originCube d 0 + let μ : MeasureTheory.Measure (Vec d) := normalizedCubeMeasure Q + let f : Fin d → Fin d → Vec d → ℝ := fun i j x => (G.coord i).grad x j + let hFrob : Vec d → ℝ := fun x => matrixFrobeniusMagnitude (G.gradient x) + have hFrob_mem : MeasureTheory.MemLp hFrob (2 : ℝ≥0∞) μ := by + dsimp [hFrob, μ, Q] + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + exact G.gradientFrobeniusMemL2 + have hentry : ∀ x : Vec d, ∀ i j : Fin d, |f i j x| ≤ hFrob x := by + intro x i j + dsimp [f, hFrob] + apply (sq_le_sq₀ (abs_nonneg _) (matrixFrobeniusMagnitude_nonneg _)).mp + rw [sq_abs, sq_matrixFrobeniusMagnitude] + calc + (G.coord i).grad x j ^ 2 ≤ ∑ l : Fin d, (G.coord i).grad x l ^ 2 := + Finset.single_le_sum (fun l _ => sq_nonneg _) (Finset.mem_univ j) + _ ≤ ∑ k : Fin d, ∑ l : Fin d, (G.coord k).grad x l ^ 2 := + Finset.single_le_sum + (s := Finset.univ) + (f := fun k => ∑ l : Fin d, (G.coord k).grad x l ^ 2) + (fun k _ => Finset.sum_nonneg fun l _ => sq_nonneg _) (Finset.mem_univ i) + have hcoord_le : ∀ i j : Fin d, + MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ ≤ + MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ := by + intro i j + apply MeasureTheory.eLpNorm_mono + intro x + have hfrob_nonneg : 0 ≤ hFrob x := by + dsimp [hFrob] + exact matrixFrobeniusMagnitude_nonneg _ + simpa only [Real.norm_eq_abs, abs_of_nonneg hfrob_nonneg] using hentry x i j + have hcoord_real_le : ∀ i j : Fin d, + (MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal ≤ + (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := by + intro i j + exact ENNReal.toReal_mono hFrob_mem.eLpNorm_ne_top (hcoord_le i j) + have hsum_le : + (∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal) ≤ + (d : ℝ) ^ 2 * (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := by + calc + (∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal) + ≤ ∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := by + apply Finset.sum_le_sum + intro i _ + apply Finset.sum_le_sum + intro j _ + exact hcoord_real_le i j + _ = (d : ℝ) ^ 2 * (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := by + simp only [Finset.sum_const, Finset.card_univ, Fintype.card_fin, + nsmul_eq_mul] + ring + rw [CubeVectorH1Function.relativeGradientCoordL2NormSum_originCube_zero] + rw [CubeVectorH1Function.gradientCoordL2NormSum_eq_sum_normalizedELpNorm] + change _ ≤ (d + 1 : ℝ) ^ 2 * + (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume).toReal + rw [← normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + calc + (∑ i : Fin d, ∑ j : Fin d, + (MeasureTheory.eLpNorm (f i j) (2 : ℝ≥0∞) μ).toReal) + ≤ (d : ℝ) ^ 2 * (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := hsum_le + _ ≤ (d + 1 : ℝ) ^ 2 * (MeasureTheory.eLpNorm hFrob (2 : ℝ≥0∞) μ).toReal := by + apply mul_le_mul_of_nonneg_right + · exact (sq_le_sq₀ (by positivity) (by positivity)).mpr (by norm_num) + · exact ENNReal.toReal_nonneg + +/-- One positive, all-dimension constant used uniformly in both directions of +the continuous/discrete unit-cube comparison. -/ +noncomputable def continuousDiscreteKBridgeConstant (d : ℕ) : ℝ := + (d + 1 : ℝ) ^ 2 + +theorem one_le_continuousDiscreteKBridgeConstant (d : ℕ) : + 1 ≤ continuousDiscreteKBridgeConstant d := by + unfold continuousDiscreteKBridgeConstant + have hbase : 1 ≤ (d + 1 : ℝ) := by norm_num + nlinarith [sq_nonneg ((d + 1 : ℝ) - 1)] + +theorem continuousDiscreteKBridgeConstant_nonneg (d : ℕ) : + 0 ≤ continuousDiscreteKBridgeConstant d := + (zero_le_one.trans (one_le_continuousDiscreteKBridgeConstant d)) + +private theorem sqrt_residual_gradient_le_mul_of_endpoint_bounds + {Aout Bout Ain Bin t C : ℝ} + (hC : 0 ≤ C) (hAout : 0 ≤ Aout) (hBout : 0 ≤ Bout) + (hAin : 0 ≤ Ain) (hBin : 0 ≤ Bin) + (hA : Aout ≤ C * Ain) (hB : Bout ≤ C * Bin) : + Real.sqrt (Aout ^ 2 + t ^ 2 * Bout ^ 2) ≤ + C * Real.sqrt (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + have hCAin : 0 ≤ C * Ain := mul_nonneg hC hAin + have hCBin : 0 ≤ C * Bin := mul_nonneg hC hBin + have hA_sq : Aout ^ 2 ≤ C ^ 2 * Ain ^ 2 := by + calc + Aout ^ 2 ≤ (C * Ain) ^ 2 := (sq_le_sq₀ hAout hCAin).mpr hA + _ = C ^ 2 * Ain ^ 2 := by ring + have hB_sq : Bout ^ 2 ≤ C ^ 2 * Bin ^ 2 := by + calc + Bout ^ 2 ≤ (C * Bin) ^ 2 := (sq_le_sq₀ hBout hCBin).mpr hB + _ = C ^ 2 * Bin ^ 2 := by ring + have hsum : Aout ^ 2 + t ^ 2 * Bout ^ 2 ≤ + C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + calc + Aout ^ 2 + t ^ 2 * Bout ^ 2 + ≤ C ^ 2 * Ain ^ 2 + t ^ 2 * (C ^ 2 * Bin ^ 2) := + add_le_add hA_sq (mul_le_mul_of_nonneg_left hB_sq (sq_nonneg t)) + _ = C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by ring + calc + Real.sqrt (Aout ^ 2 + t ^ 2 * Bout ^ 2) + ≤ Real.sqrt (C ^ 2 * (Ain ^ 2 + t ^ 2 * Bin ^ 2)) := + Real.sqrt_le_sqrt hsum + _ = Real.sqrt (C ^ 2) * Real.sqrt (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + rw [Real.sqrt_mul (sq_nonneg C)] + _ = C * Real.sqrt (Ain ^ 2 + t ^ 2 * Bin ^ 2) := by + rw [Real.sqrt_sq hC] + +/-- Sending a continuous competitor to the internal cube competitor changes +its exact K-functional value by at most the bridge constant. -/ +theorem cubeKFunctionalCompetitorValue_le_continuousKFunctionalCompetitorValue_mul + {d : ℕ} (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) + (G : ContinuousKCompetitor d) : + cubeVectorKFunctionalCompetitorValue (originCube d 0) t.1 F + G.toCubeVectorH1Function ≤ + continuousDiscreteKBridgeConstant d * continuousKFunctionalCompetitorValue t F G := by + let C : ℝ := continuousDiscreteKBridgeConstant d + have hC : 0 ≤ C := continuousDiscreteKBridgeConstant_nonneg d + have hC_one : 1 ≤ C := one_le_continuousDiscreteKBridgeConstant d + have hA : + cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toCubeVectorH1Function.toField x) ≤ + C * continuousKResidualNorm F G := by + calc + cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toCubeVectorH1Function.toField x) + ≤ continuousKResidualNorm F G := cubeResidualNorm_le_continuousKResidualNorm F G + _ ≤ C * continuousKResidualNorm F G := by + simpa only [one_mul] using mul_le_mul_of_nonneg_right hC_one + (continuousKResidualNorm_nonneg F G) + have hB : G.toCubeVectorH1Function.relativeGradientCoordL2NormSum ≤ + C * continuousKGradientNorm G := by + simpa only [C] using! + cubeRelativeGradientCoordL2NormSum_le_dimPlusOne_sq_mul_continuousKGradientNorm G + simpa only [cubeVectorKFunctionalCompetitorValue, + continuousKFunctionalCompetitorValue] using + sqrt_residual_gradient_le_mul_of_endpoint_bounds hC + (cubeLpNorm_nonneg (originCube d 0) (2 : ℝ≥0∞) _) + G.toCubeVectorH1Function.relativeGradientCoordL2NormSum_nonneg + (continuousKResidualNorm_nonneg F G) (continuousKGradientNorm_nonneg G) + hA hB + +/-- Sending an internal cube competitor to the continuous source competitor +changes its exact K-functional value by at most the bridge constant. -/ +theorem continuousKFunctionalCompetitorValue_le_cubeKFunctionalCompetitorValue_mul + {d : ℕ} (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) + (G : CubeVectorH1Function (originCube d 0)) : + continuousKFunctionalCompetitorValue t F G.toContinuousKCompetitor ≤ + continuousDiscreteKBridgeConstant d * + cubeVectorKFunctionalCompetitorValue (originCube d 0) t.1 F G := by + let C : ℝ := continuousDiscreteKBridgeConstant d + have hC : 0 ≤ C := continuousDiscreteKBridgeConstant_nonneg d + have hC_one : 1 ≤ C := one_le_continuousDiscreteKBridgeConstant d + have hsmall : (d + 1 : ℝ) ≤ C := by + dsimp [C, continuousDiscreteKBridgeConstant] + have hbase : 1 ≤ (d + 1 : ℝ) := by norm_num + nlinarith [sq_nonneg ((d + 1 : ℝ) - 1)] + have hA : continuousKResidualNorm F G.toContinuousKCompetitor ≤ + C * cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toField x) := by + calc + continuousKResidualNorm F G.toContinuousKCompetitor + ≤ (d + 1 : ℝ) * cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toField x) := by + simpa only using! + continuousKResidualNorm_le_dimPlusOne_mul_cubeResidualNorm F + G.toContinuousKCompetitor + _ ≤ C * cubeLpNorm (originCube d 0) (2 : ℝ≥0∞) + (fun x => F x - G.toField x) := + mul_le_mul_of_nonneg_right hsmall + (cubeLpNorm_nonneg (originCube d 0) (2 : ℝ≥0∞) _) + have hB : continuousKGradientNorm G.toContinuousKCompetitor ≤ + C * G.relativeGradientCoordL2NormSum := by + calc + continuousKGradientNorm G.toContinuousKCompetitor + ≤ G.relativeGradientCoordL2NormSum := by + simpa only using! + continuousKGradientNorm_le_cubeRelativeGradientCoordL2NormSum + G.toContinuousKCompetitor + _ ≤ C * G.relativeGradientCoordL2NormSum := by + simpa only [one_mul] using mul_le_mul_of_nonneg_right hC_one + G.relativeGradientCoordL2NormSum_nonneg + simpa only [cubeVectorKFunctionalCompetitorValue, + continuousKFunctionalCompetitorValue] using + sqrt_residual_gradient_le_mul_of_endpoint_bounds hC + (continuousKResidualNorm_nonneg F G.toContinuousKCompetitor) + (continuousKGradientNorm_nonneg G.toContinuousKCompetitor) + (cubeLpNorm_nonneg (originCube d 0) (2 : ℝ≥0∞) _) + G.relativeGradientCoordL2NormSum_nonneg hA hB + +private theorem exists_cubeVectorH1Function_value_le_add {d : ℕ} + (t : ℝ) (F : Vec d → Vec d) {ε : ℝ} (hε : 0 < ε) : + ∃ G : CubeVectorH1Function (originCube d 0), + cubeVectorKFunctionalCompetitorValue (originCube d 0) t F G ≤ + cubeVectorKFunctional (originCube d 0) t F + ε := by + unfold cubeVectorKFunctional + obtain ⟨a, ⟨G, rfl⟩, ha⟩ := + (csInf_lt_iff (cubeVectorKFunctional_range_bddBelow (originCube d 0) t F) + (cubeVectorKFunctional_range_nonempty (originCube d 0) t F)).1 + (lt_add_of_pos_right _ hε) + exact ⟨G, ha.le⟩ + +/-- The internal discrete K-functional is bounded by the exact continuous +K-functional at every source scale, with a d=0-safe constant. -/ +theorem cubeVectorKFunctional_le_mul_continuousKFunctional {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + cubeVectorKFunctional (originCube d 0) t.1 F ≤ + continuousDiscreteKBridgeConstant d * continuousKFunctional t F := by + let C : ℝ := continuousDiscreteKBridgeConstant d + have hC_one : 1 ≤ C := one_le_continuousDiscreteKBridgeConstant d + have hC_pos : 0 < C := lt_of_lt_of_le zero_lt_one hC_one + have hC_ne : C ≠ 0 := ne_of_gt hC_pos + apply le_of_forall_pos_le_add + intro ε hε + obtain ⟨G, hG⟩ := + exists_continuousKCompetitor_value_le_add t F (div_pos hε hC_pos) + calc + cubeVectorKFunctional (originCube d 0) t.1 F + ≤ cubeVectorKFunctionalCompetitorValue (originCube d 0) t.1 F + G.toCubeVectorH1Function := + cubeVectorKFunctional_le_competitor (originCube d 0) t.1 F _ + _ ≤ C * continuousKFunctionalCompetitorValue t F G := by + simpa only [C] using + cubeKFunctionalCompetitorValue_le_continuousKFunctionalCompetitorValue_mul t F G + _ ≤ C * (continuousKFunctional t F + ε / C) := + mul_le_mul_of_nonneg_left hG (le_of_lt hC_pos) + _ = C * continuousKFunctional t F + ε := by + field_simp [hC_ne] + +/-- The exact continuous K-functional is bounded by the internal discrete +K-functional at every source scale, with the same d=0-safe constant. -/ +theorem continuousKFunctional_le_mul_cubeVectorKFunctional {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + continuousKFunctional t F ≤ + continuousDiscreteKBridgeConstant d * cubeVectorKFunctional (originCube d 0) t.1 F := by + let C : ℝ := continuousDiscreteKBridgeConstant d + have hC_one : 1 ≤ C := one_le_continuousDiscreteKBridgeConstant d + have hC_pos : 0 < C := lt_of_lt_of_le zero_lt_one hC_one + have hC_ne : C ≠ 0 := ne_of_gt hC_pos + apply le_of_forall_pos_le_add + intro ε hε + obtain ⟨G, hG⟩ := + exists_cubeVectorH1Function_value_le_add t.1 F (div_pos hε hC_pos) + calc + continuousKFunctional t F + ≤ continuousKFunctionalCompetitorValue t F G.toContinuousKCompetitor := + continuousKFunctional_le_competitor t F _ + _ ≤ C * cubeVectorKFunctionalCompetitorValue (originCube d 0) t.1 F G := by + simpa only [C] using + continuousKFunctionalCompetitorValue_le_cubeKFunctionalCompetitorValue_mul t F G + _ ≤ C * (cubeVectorKFunctional (originCube d 0) t.1 F + ε / C) := + mul_le_mul_of_nonneg_left hG (le_of_lt hC_pos) + _ = C * cubeVectorKFunctional (originCube d 0) t.1 F + ε := by + field_simp [hC_ne] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKSeriesBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKSeriesBridge.lean new file mode 100644 index 0000000000..b51e2380ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuousDiscreteKSeriesBridge.lean @@ -0,0 +1,251 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.DiscreteKOverlapEnergy +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicSeries + +/-! +# Triadic continuous/discrete K-series bridge + +This module compares the canonical continuous triadic K-sample energy with +the extended internal discrete K-functional energy. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +private theorem triadicContinuousKScale_eq_rpow (j : ℕ) : + (triadicContinuousKScale j).1 = Real.rpow 3 (-(j : ℝ)) := by + change ((3 : ℝ)⁻¹) ^ j = Real.rpow 3 (-(j : ℝ)) + rw [← Real.rpow_natCast, Real.inv_rpow (by norm_num : (0 : ℝ) ≤ 3)] + symm + exact Real.rpow_neg (by norm_num : (0 : ℝ) ≤ 3) _ + +private theorem triadicContinuousKSample_weight_eq_depth_weight_sq + (s : FractionalOrder) (j : ℕ) : + Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) = + (Real.rpow 3 (s.1 * (j : ℝ))) ^ 2 := by + rw [triadicContinuousKScale_eq_rpow] + calc + Real.rpow (Real.rpow 3 (-(j : ℝ))) (-2 * s.1) = + Real.rpow 3 ((-(j : ℝ)) * (-2 * s.1)) := + (Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _).symm + _ = Real.rpow 3 ((s.1 * (j : ℝ)) * 2) := by + congr 1 + ring + _ = Real.rpow (Real.rpow 3 (s.1 * (j : ℝ))) (2 : ℝ) := + Real.rpow_mul (by norm_num : (0 : ℝ) ≤ 3) _ _ + _ = (Real.rpow 3 (s.1 * (j : ℝ))) ^ 2 := + Real.rpow_natCast _ 2 + +/-- The squared continuous/discrete bridge factor is finite as an extended +nonnegative real. -/ +theorem ofReal_sq_continuousDiscreteKBridgeConstant_ne_top (d : ℕ) : + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) ≠ ∞ := + ENNReal.ofReal_ne_top + +private theorem triadicContinuousKSampleTerm_le_mul_discreteDepthTerm + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : + triadicContinuousKSampleTerm s F j ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2) := by + let C : ℝ := continuousDiscreteKBridgeConstant d + let W : ℝ := Real.rpow 3 (s.1 * (j : ℝ)) + let Kc : ℝ := continuousKFunctional (triadicContinuousKScale j) F + let Kd : ℝ := cubeVectorKFunctional (originCube d 0) + (Real.rpow 3 (-(j : ℝ))) F + have hC : 0 ≤ C := continuousDiscreteKBridgeConstant_nonneg d + have hKc : 0 ≤ Kc := continuousKFunctional_nonneg _ F + have hKd : 0 ≤ Kd := cubeVectorKFunctional_nonneg _ _ _ + have hK : Kc ≤ C * Kd := by + simpa only [C, Kc, Kd, triadicContinuousKScale_eq_rpow] using + continuousKFunctional_le_mul_cubeVectorKFunctional + (triadicContinuousKScale j) F + have hreal : W ^ 2 * Kc ^ 2 ≤ C ^ 2 * (W * Kd) ^ 2 := by + have hsquare : Kc ^ 2 ≤ C ^ 2 * Kd ^ 2 := by + calc + Kc ^ 2 ≤ (C * Kd) ^ 2 := + (sq_le_sq₀ hKc (mul_nonneg hC hKd)).mpr hK + _ = C ^ 2 * Kd ^ 2 := by ring + calc + W ^ 2 * Kc ^ 2 ≤ W ^ 2 * (C ^ 2 * Kd ^ 2) := + mul_le_mul_of_nonneg_left hsquare (sq_nonneg W) + _ = C ^ 2 * (W * Kd) ^ 2 := by ring + unfold triadicContinuousKSampleTerm cubeKBesovVectorDepthSeminorm + rw [triadicContinuousKSample_weight_eq_depth_weight_sq] + change ENNReal.ofReal (W ^ 2) * ENNReal.ofReal (Kc ^ 2) ≤ + ENNReal.ofReal (C ^ 2) * ENNReal.ofReal ((W * Kd) ^ 2) + rw [← ENNReal.ofReal_mul (sq_nonneg W)] + rw [← ENNReal.ofReal_mul (sq_nonneg C)] + exact ENNReal.ofReal_le_ofReal hreal + +private theorem discreteDepthTerm_le_mul_triadicContinuousKSampleTerm + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : + ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2) ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + triadicContinuousKSampleTerm s F j := by + let C : ℝ := continuousDiscreteKBridgeConstant d + let W : ℝ := Real.rpow 3 (s.1 * (j : ℝ)) + let Kc : ℝ := continuousKFunctional (triadicContinuousKScale j) F + let Kd : ℝ := cubeVectorKFunctional (originCube d 0) + (Real.rpow 3 (-(j : ℝ))) F + have hC : 0 ≤ C := continuousDiscreteKBridgeConstant_nonneg d + have hKc : 0 ≤ Kc := continuousKFunctional_nonneg _ F + have hKd : 0 ≤ Kd := cubeVectorKFunctional_nonneg _ _ _ + have hK : Kd ≤ C * Kc := by + simpa only [C, Kc, Kd, triadicContinuousKScale_eq_rpow] using + cubeVectorKFunctional_le_mul_continuousKFunctional + (triadicContinuousKScale j) F + have hreal : (W * Kd) ^ 2 ≤ C ^ 2 * (W ^ 2 * Kc ^ 2) := by + have hsquare : Kd ^ 2 ≤ C ^ 2 * Kc ^ 2 := by + calc + Kd ^ 2 ≤ (C * Kc) ^ 2 := + (sq_le_sq₀ hKd (mul_nonneg hC hKc)).mpr hK + _ = C ^ 2 * Kc ^ 2 := by ring + calc + (W * Kd) ^ 2 = W ^ 2 * Kd ^ 2 := by ring + _ ≤ W ^ 2 * (C ^ 2 * Kc ^ 2) := + mul_le_mul_of_nonneg_left hsquare (sq_nonneg W) + _ = C ^ 2 * (W ^ 2 * Kc ^ 2) := by ring + unfold triadicContinuousKSampleTerm cubeKBesovVectorDepthSeminorm + rw [triadicContinuousKSample_weight_eq_depth_weight_sq] + change ENNReal.ofReal ((W * Kd) ^ 2) ≤ + ENNReal.ofReal (C ^ 2) * (ENNReal.ofReal (W ^ 2) * ENNReal.ofReal (Kc ^ 2)) + rw [← ENNReal.ofReal_mul (sq_nonneg W)] + rw [← ENNReal.ofReal_mul (sq_nonneg C)] + exact ENNReal.ofReal_le_ofReal hreal + +/-- The squared discrete partial seminorm is exactly its finite `ENNReal` +sum of depth energies. -/ +theorem ofReal_sq_cubeKPartialSeminorm_eq_sum_depthTerms + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) = + ∑ j ∈ Finset.range (N + 1), ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2) := by + rw [sq_cubeKBesovVectorPartialSeminormTwo] + exact ENNReal.ofReal_sum_of_nonneg fun j _ => sq_nonneg _ + +private theorem finite_triadicContinuousKSampleSum_le_mul_cubeKPartial + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) := by + calc + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) + ≤ ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2) := by + apply Finset.sum_le_sum + intro j hj + exact triadicContinuousKSampleTerm_le_mul_discreteDepthTerm s F j + _ = ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + (∑ j ∈ Finset.range (N + 1), ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2)) := by + rw [Finset.mul_sum] + _ = _ := by rw [← ofReal_sq_cubeKPartialSeminorm_eq_sum_depthTerms] + +private theorem cubeKPartial_le_mul_finite_triadicContinuousKSampleSum + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) := by + rw [ofReal_sq_cubeKPartialSeminorm_eq_sum_depthTerms] + calc + (∑ j ∈ Finset.range (N + 1), ENNReal.ofReal + ((cubeKBesovVectorDepthSeminorm (originCube d 0) s.1 F j) ^ 2)) + ≤ ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + triadicContinuousKSampleTerm s F j := by + apply Finset.sum_le_sum + intro j hj + exact discreteDepthTerm_le_mul_triadicContinuousKSampleTerm s F j + _ = ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) := by + rw [Finset.mul_sum] + +/-- The canonical continuous triadic sample energy is bounded by the extended +internal discrete K-functional energy, with the squared bridge constant. -/ +theorem triadicContinuousKSampleEnergy_le_mul_extendedDiscreteKFunctionalEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + extendedDiscreteKFunctionalEnergy s F := by + rw [triadicContinuousKSampleEnergy, + ENNReal.tsum_eq_iSup_nat' (Filter.tendsto_add_atTop_nat 1)] + refine iSup_le fun N => ?_ + calc + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) + ≤ ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) := + finite_triadicContinuousKSampleSum_le_mul_cubeKPartial s F N + _ ≤ ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + extendedDiscreteKFunctionalEnergy s F := + mul_le_mul_right + (ofReal_sq_cubeKPartialSeminorm_le_extendedDiscreteKFunctionalEnergy s F N) _ + +/-- The extended internal discrete K-functional energy is bounded by the +canonical continuous triadic sample energy, with the same squared constant. -/ +theorem extendedDiscreteKFunctionalEnergy_le_mul_triadicContinuousKSampleEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + extendedDiscreteKFunctionalEnergy s F ≤ + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + triadicContinuousKSampleEnergy s F := by + refine iSup_le fun N => ?_ + calc + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) + ≤ ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + (∑ j ∈ Finset.range (N + 1), triadicContinuousKSampleTerm s F j) := + cubeKPartial_le_mul_finite_triadicContinuousKSampleSum s F N + _ ≤ ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + triadicContinuousKSampleEnergy s F := + mul_le_mul_right (ENNReal.sum_le_tsum _) _ + +/-- Finiteness of the extended discrete energy transfers to the continuous +triadic sampled energy. -/ +theorem triadicContinuousKSampleEnergy_ne_top_of_extendedDiscreteKFunctionalEnergy_ne_top + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (hF : extendedDiscreteKFunctionalEnergy s F ≠ ∞) : + triadicContinuousKSampleEnergy s F ≠ ∞ := by + exact ne_top_of_le_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top hF) + (triadicContinuousKSampleEnergy_le_mul_extendedDiscreteKFunctionalEnergy s F) + +/-- Finiteness of the continuous triadic sampled energy transfers to the +extended discrete K-functional energy. -/ +theorem extendedDiscreteKFunctionalEnergy_ne_top_of_triadicContinuousKSampleEnergy_ne_top + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (hF : triadicContinuousKSampleEnergy s F ≠ ∞) : + extendedDiscreteKFunctionalEnergy s F ≠ ∞ := by + exact ne_top_of_le_ne_top + (ENNReal.mul_ne_top ENNReal.ofReal_ne_top hF) + (extendedDiscreteKFunctionalEnergy_le_mul_triadicContinuousKSampleEnergy s F) + +/-- Discarding the endpoint sample cannot increase the nonnegative triadic +sample energy. -/ +theorem triadicContinuousKShiftedSampleEnergy_le_triadicContinuousKSampleEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKShiftedSampleEnergy s F ≤ triadicContinuousKSampleEnergy s F := by + unfold triadicContinuousKShiftedSampleEnergy triadicContinuousKSampleEnergy + exact ENNReal.tsum_comp_le_tsum_of_injective Nat.succ_injective _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuumSampleClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuumSampleClosure.lean new file mode 100644 index 0000000000..b38e71adb8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ContinuumSampleClosure.lean @@ -0,0 +1,93 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.RootScaleControl + +/-! +# Closure of the continuum and sampled continuous K energies + +This module reinserts the root triadic sample into the lower continuum-series +comparison, without applying any real-valued totalization to the energies. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The lower triadic-series factor is strictly positive. -/ +theorem triadicContinuousKLowerSeriesConstant_pos (s : FractionalOrder) : + 0 < triadicContinuousKLowerSeriesConstant s := by + unfold triadicContinuousKLowerSeriesConstant + rw [ENNReal.mul_pos_iff] + exact ⟨ENNReal.ofReal_pos.2 (by norm_num), + ENNReal.ofReal_pos.2 (Real.rpow_pos_of_pos (by norm_num) _)⟩ + +/-- The lower triadic-series factor is nonzero. -/ +theorem triadicContinuousKLowerSeriesConstant_ne_zero (s : FractionalOrder) : + triadicContinuousKLowerSeriesConstant s ≠ 0 := + ne_of_gt (triadicContinuousKLowerSeriesConstant_pos s) + +/-- The lower triadic-series factor is finite. -/ +theorem triadicContinuousKLowerSeriesConstant_ne_top (s : FractionalOrder) : + triadicContinuousKLowerSeriesConstant s ≠ ∞ := by + unfold triadicContinuousKLowerSeriesConstant + exact ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top + +/-- The inverse lower triadic-series factor is finite. -/ +theorem triadicContinuousKLowerSeriesConstant_inv_ne_top (s : FractionalOrder) : + (triadicContinuousKLowerSeriesConstant s)⁻¹ ≠ ∞ := + ENNReal.inv_ne_top.2 (triadicContinuousKLowerSeriesConstant_ne_zero s) + +/-- The shifted sampled energy is controlled by the continuum K energy after +dividing through by the strictly positive finite lower series factor. -/ +theorem triadicContinuousKShiftedSampleEnergy_le_lowerSeriesConstant_inv_mul_continuumEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKShiftedSampleEnergy s F ≤ + (triadicContinuousKLowerSeriesConstant s)⁻¹ * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t := by + let C : ℝ≥0∞ := triadicContinuousKLowerSeriesConstant s + let S : ℝ≥0∞ := triadicContinuousKShiftedSampleEnergy s F + let I : ℝ≥0∞ := ∫⁻ t in Set.Ioo (0 : ℝ) 1, + continuousKSeminormIntegrand s.1 F t + have hC0 : C ≠ 0 := triadicContinuousKLowerSeriesConstant_ne_zero s + have hCtop : C ≠ ∞ := triadicContinuousKLowerSeriesConstant_ne_top s + have hcomparison : C * S ≤ I := by + simpa only [C, S, I] using triadicContinuousKLowerSeriesComparison s F + calc + S = C⁻¹ * (C * S) := by + rw [ENNReal.inv_mul_cancel_left hC0 hCtop] + _ ≤ C⁻¹ * I := mul_le_mul_right hcomparison _ + +/-- The full sampled continuous K energy is controlled by the normalized +Euclidean `L²` energy and the continuum K energy. -/ +theorem triadicContinuousKSampleEnergy_le_sq_normalizedEuclideanLpENorm_add_lowerSeriesConstant_inv_mul_continuumEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F ≤ + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ 2 + + (triadicContinuousKLowerSeriesConstant s)⁻¹ * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t := by + calc + triadicContinuousKSampleEnergy s F ≤ + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ 2 + + triadicContinuousKShiftedSampleEnergy s F := + triadicContinuousKSampleEnergy_le_sq_normalizedEuclideanLpENorm_add_shifted s F + _ ≤ ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ 2 + + (triadicContinuousKLowerSeriesConstant s)⁻¹ * + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t := + add_le_add_right + (triadicContinuousKShiftedSampleEnergy_le_lowerSeriesConstant_inv_mul_continuumEnergy + s F) _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/DiscreteKOverlapEnergy.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/DiscreteKOverlapEnergy.lean new file mode 100644 index 0000000000..eee688f434 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/DiscreteKOverlapEnergy.lean @@ -0,0 +1,189 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.ConcreteAveraging +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.OverlapPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapGagliardoBridge + +/-! +# Extended discrete K-functional energy and concrete overlap comparison + +The discrete K-functional energy is the `ℝ≥0∞` supremum of its finite squared +partial seminorms. Both comparison directions below are lifted directly from +proved finite-depth averaging and overlap-Poincare estimates. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The extended internal discrete K-functional energy on the centered unit +cube, defined only through finite partial sums. -/ +noncomputable def extendedDiscreteKFunctionalEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ⨆ N : ℕ, ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) + +/-- Every finite squared discrete K-functional partial seminorm is bounded by +the extended discrete energy. -/ +theorem ofReal_sq_cubeKPartialSeminorm_le_extendedDiscreteKFunctionalEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) ≤ + extendedDiscreteKFunctionalEnergy s F := + le_iSup (fun M : ℕ => ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 M F) ^ 2)) N + +private theorem UnitCubeEuclideanL2Field.memLp_originCube_normalizedCubeMeasure + {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := by + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + apply MemLp.of_eval + intro i + have hF := F.euclideanMemL2 + rw [memLp_piLp_iff] at hF + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF i + +/-- The concrete overlap-averaging constant after combining residual and +gradient contributions. -/ +noncomputable def discreteKOverlapAveragingConstant (d : ℕ) : ℝ := + 2 * concreteOverlapAveragingCompetitorConstant d + +theorem discreteKOverlapAveragingConstant_nonneg (d : ℕ) : + 0 ≤ discreteKOverlapAveragingConstant d := by + unfold discreteKOverlapAveragingConstant + exact mul_nonneg (by norm_num) (concreteOverlapAveragingCompetitorConstant_nonneg d) + +/-- The squared concrete averaging factor remains finite after promotion to +extended nonnegative values. -/ +theorem discreteKOverlapAveragingConstant_sq_lt_top (d : ℕ) : + ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) < ∞ := + ENNReal.ofReal_lt_top + +/-- The concrete overlap-Poincare constant after assembling one K-functional +competitor value. -/ +noncomputable def overlapDiscreteKConstant (d : ℕ) : ℝ := + 8 * (3 ^ d : ℝ) + 2 * (cubeVectorH1OverlapPoincareConstant d) ^ 2 + 1 + +theorem overlapDiscreteKConstant_nonneg (d : ℕ) : + 0 ≤ overlapDiscreteKConstant d := by + unfold overlapDiscreteKConstant + positivity + +/-- The squared concrete overlap-Poincare factor remains finite after +promotion to extended nonnegative values. -/ +theorem overlapDiscreteKConstant_sq_lt_top (d : ℕ) : + ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) < ∞ := + ENNReal.ofReal_lt_top + +private theorem cubeKPartialSeminorm_le_mul_overlapPartialSeminorm + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F ≤ + discreteKOverlapAveragingConstant d * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo (originCube d 0) s.1 N F := by + have hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := + F.memLp_originCube_normalizedCubeMeasure + apply + cubeKBesovVectorPartialSeminormTwo_le_mul_cubeBesovOverlappingPositiveVectorPartialSeminormTwo_of_forall_depthSeminorm_le + · exact discreteKOverlapAveragingConstant_nonneg d + · intro j _ + exact + (cubeKBesovDepthBoundByOverlappingPositiveUniform_of_overlapAveragingCompetitorEstimate + (concreteOverlapAveragingCompetitorConstant_nonneg d) + (cubeKBesovOverlapAveragingCompetitorEstimate_concrete d)).2 + s.2.1 s.2.2 (originCube d 0) F j hF + +private theorem overlapPartialSeminorm_le_mul_cubeKPartialSeminorm + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo (originCube d 0) s.1 N F ≤ + overlapDiscreteKConstant d * + cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F := by + have hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := + F.memLp_originCube_normalizedCubeMeasure + simpa only [overlapDiscreteKConstant] using + cubeBesovOverlappingPositiveVectorPartialSeminormTwo_le_mul_cubeKBesovVectorPartialSeminormTwo_of_overlapPoincare + (cubeVectorH1OverlapPoincareConstant_nonneg d) + (cubeVectorH1OverlapPoincareEstimate d) + (originCube d 0) s.1 N F hF + +private theorem ofReal_sq_le_mul_of_nonneg_mul + {A B C : ℝ} (hA : 0 ≤ A) (hB : 0 ≤ B) (hC : 0 ≤ C) + (h : A ≤ C * B) : + ENNReal.ofReal (A ^ 2) ≤ ENNReal.ofReal (C ^ 2) * ENNReal.ofReal (B ^ 2) := by + have hCB : 0 ≤ C * B := mul_nonneg hC hB + have hsq : A ^ 2 ≤ C ^ 2 * B ^ 2 := by + calc + A ^ 2 ≤ (C * B) ^ 2 := (sq_le_sq₀ hA hCB).mpr h + _ = C ^ 2 * B ^ 2 := by ring + calc + ENNReal.ofReal (A ^ 2) ≤ ENNReal.ofReal (C ^ 2 * B ^ 2) := + ENNReal.ofReal_le_ofReal hsq + _ = ENNReal.ofReal (C ^ 2) * ENNReal.ofReal (B ^ 2) := by + rw [ENNReal.ofReal_mul (sq_nonneg C)] + +/-- The extended discrete K-functional energy is controlled by the extended +overlap energy using only the concrete overlap-averaging producer. -/ +theorem extendedDiscreteKFunctionalEnergy_le_mul_extendedVectorOverlapBesovEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + extendedDiscreteKFunctionalEnergy s F ≤ + ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) * + extendedVectorOverlapBesovEnergy s F := by + refine iSup_le fun N => ?_ + have hfinite := cubeKPartialSeminorm_le_mul_overlapPartialSeminorm s F N + calc + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) + ≤ ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) * + ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) := + ofReal_sq_le_mul_of_nonneg_mul + (cubeKBesovVectorPartialSeminormTwo_nonneg (originCube d 0) s.1 N F) + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg + (originCube d 0) s.1 N F) + (discreteKOverlapAveragingConstant_nonneg d) hfinite + _ ≤ ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) * + extendedVectorOverlapBesovEnergy s F := + mul_le_mul_right + (ofReal_sq_vectorPartialSeminorm_le_extendedVectorOverlapBesovEnergy s F N) _ + +/-- The extended overlap energy is controlled by the extended discrete +K-functional energy using only the proved overlap-Poincare producer. -/ +theorem extendedVectorOverlapBesovEnergy_le_mul_extendedDiscreteKFunctionalEnergy + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + extendedVectorOverlapBesovEnergy s F ≤ + ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) * + extendedDiscreteKFunctionalEnergy s F := by + refine iSup_le fun N => ?_ + have hfinite := overlapPartialSeminorm_le_mul_cubeKPartialSeminorm s F N + calc + ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) + ≤ ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) * + ENNReal.ofReal + ((cubeKBesovVectorPartialSeminormTwo (originCube d 0) s.1 N F) ^ 2) := + ofReal_sq_le_mul_of_nonneg_mul + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg + (originCube d 0) s.1 N F) + (cubeKBesovVectorPartialSeminormTwo_nonneg (originCube d 0) s.1 N F) + (overlapDiscreteKConstant_nonneg d) hfinite + _ ≤ ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) * + extendedDiscreteKFunctionalEnergy s F := + mul_le_mul_right + (ofReal_sq_cubeKPartialSeminorm_le_extendedDiscreteKFunctionalEnergy s F N) _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanGagliardoCoordinateBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanGagliardoCoordinateBridge.lean new file mode 100644 index 0000000000..575b0ef072 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanGagliardoCoordinateBridge.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces + +/-! +# Euclidean-to-coordinate Gagliardo bridge + +This module fixes the exact product measure and the finite-coordinate +numerator decomposition needed to compare the Euclidean `H^s` energy with +the scalar ambient-distance Gagliardo energies. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal +open MeasureTheory + +noncomputable section + +/-- The finite-coordinate family of scalar ambient-distance Gagliardo +seminorms at exponent two, squared before summation. -/ +noncomputable def coordinateGagliardoEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 (2 : ℝ≥0∞) + (fun x => F x i)) ^ (2 : ℝ) + +/-- The exact Euclidean product measure is the scalar Gagliardo product +measure on the origin unit cube. -/ +theorem euclideanHsProductMeasure_eq_gagliardoCubeMeasure_originCube_zero (d : ℕ) : + euclideanHsProductMeasure d = Gagliardo.gagliardoCubeMeasure (originCube d 0) := by + unfold euclideanHsProductMeasure Gagliardo.gagliardoCubeMeasure + rw [unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure, + unitCenteredCubeDomain_restrictedVolume_eq_cubeMeasure] + +/-- The squared Euclidean target magnitude is the finite sum of squared +coordinate differences. -/ +theorem euclideanHs_numerator_eq_sum_coordinates {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (z : Vec d × Vec d) : + ‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 = + ∑ i : Fin d, (F z.1 i - F z.2 i) ^ 2 := by + simpa only [Pi.sub_apply, HilbertVec.ofVec, PiLp.toLp_apply] using + HilbertVec.norm_sq_eq_sum_sq (HilbertVec.ofVec (F z.1 - F z.2)) + +/-- At zero dimension both the exact Euclidean energy and the finite +coordinate family vanish, with no positive-dimension instance. -/ +theorem euclideanHsEnergy_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : euclideanHsEnergy s F = 0 := by + rw [euclideanHsEnergy_eq_lintegral] + refine (lintegral_congr fun z => ?_).trans lintegral_zero + have hfield : F z.1 = F z.2 := Subsingleton.elim _ _ + simp [hfield] + +theorem coordinateGagliardoEnergy_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : coordinateGagliardoEnergy s F = 0 := by + simp [coordinateGagliardoEnergy] + +private theorem sq_scalar_cubeGagliardoESeminorm_eq_lintegral {d : ℕ} + (s : FractionalOrder) (f : Vec d → ℝ) : + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 (2 : ℝ≥0∞) f) ^ (2 : ℝ) = + ∫⁻ z, ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) f z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d 0) := by + rw [Gagliardo.Internal.cubeGagliardoESeminorm_eq_lintegral (by norm_num) (by norm_num)] + rw [← ENNReal.rpow_mul] + norm_num + +private theorem measurable_scalar_gagliardoKernel {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) + (i : Fin d) : + Measurable (Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i)) := by + unfold Gagliardo.gagliardoKernel + have hf : Measurable fun z : Vec d × Vec d => + dist z.1 z.2 ^ (-Gagliardo.kernelExponent d s.1 (2 : ℝ≥0∞)) := + measurable_dist.pow measurable_const + have hg : Measurable fun z : Vec d × Vec d => + (fun x => F x i) z.1 - (fun x => F x i) z.2 := + ((continuous_apply i).measurable.comp (hF.comp measurable_fst)).sub + ((continuous_apply i).measurable.comp (hF.comp measurable_snd)) + exact hf.smul hg + +private theorem measurable_scalar_gagliardoKernel_enorm_sq {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) + (i : Fin d) : + Measurable (fun z => + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) := + (measurable_scalar_gagliardoKernel s F hF i).enorm.pow measurable_const + +/-- The coordinate energy is one product-measure lintegral of the finite +sum of scalar ambient-distance kernels when the chosen representative is +measurable. -/ +theorem coordinateGagliardoEnergy_eq_lintegral_sum {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) : + coordinateGagliardoEnergy s F = + ∫⁻ z, ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d 0) := by + unfold coordinateGagliardoEnergy + rw [Finset.sum_congr rfl fun i _ => + sq_scalar_cubeGagliardoESeminorm_eq_lintegral s (fun x => F x i)] + rw [← lintegral_finsetSum' Finset.univ] + intro i _ + exact (measurable_scalar_gagliardoKernel_enorm_sq s F hF i).aemeasurable + +private theorem sum_enorm_sq_coordinate_diff_eq_ofReal_numerator {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (z : Vec d × Vec d) : + (∑ i : Fin d, ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ)) = + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + rw [euclideanHs_numerator_eq_sum_coordinates] + rw [ENNReal.ofReal_sum_of_nonneg (fun i _hi => sq_nonneg (F z.1 i - F z.2 i))] + refine Finset.sum_congr rfl ?_ + intro i _hi + norm_num + rw [Real.enorm_eq_ofReal_abs, + ← ENNReal.ofReal_pow (abs_nonneg (F z.1 i - F z.2 i)), sq_abs] + +private theorem sum_scalar_gagliardoKernel_eq_distance_mul_numerator {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (z : Vec d × Vec d) : + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) = + ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + calc + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) = + ∑ i : Fin d, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + simpa only [ENNReal.toReal_ofNat] using + Gagliardo.enorm_gagliardoKernel_rpow s.1 + (p := (2 : ℝ≥0∞)) (by norm_num) (by norm_num) (fun x => F x i) z + _ = ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ∑ i : Fin d, ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ) := by + rw [Finset.mul_sum] + _ = ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + rw [sum_enorm_sq_coordinate_diff_eq_ofReal_numerator] + +private theorem euclideanHsIntegrand_le_sum_scalar_gagliardoKernel {d : ℕ} + [NeZero d] (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (z : Vec d × Vec d) : + euclideanHsIntegrand s F z ≤ + ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) := by + rw [sum_scalar_gagliardoKernel_eq_distance_mul_numerator] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * 2 + (d : ℝ) + let A : ℝ := ‖HilbertVec.ofVec (F x - F y)‖ ^ 2 + have ha : 0 < a := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := Nat.cast_nonneg d + dsimp [a] + nlinarith [s.2.1, hd_nonneg] + change ENNReal.ofReal + (A / Real.rpow (euclideanDist x y) ((d : ℝ) + 2 * s.1)) ≤ + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A + rw [show (d : ℝ) + 2 * s.1 = a by simp [a, add_comm, mul_comm]] + by_cases hxy : x = y + · subst y + simp [A] + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hpow : + Real.rpow (euclideanDist x y) (-a) ≤ Real.rpow (dist x y) (-a) := + Real.rpow_le_rpow_of_nonpos hdist (dist_le_euclideanDist x y) (neg_nonpos.mpr ha.le) + have hA : 0 ≤ A := by + exact sq_nonneg _ + have hreal : + A / Real.rpow (euclideanDist x y) a ≤ + Real.rpow (dist x y) (-a) * A := by + have hneg : + Real.rpow (euclideanDist x y) (-a) = + (Real.rpow (euclideanDist x y) a)⁻¹ := + Real.rpow_neg heuclideanDist.le a + calc + A / Real.rpow (euclideanDist x y) a = + Real.rpow (euclideanDist x y) (-a) * A := by + rw [div_eq_mul_inv, hneg] + ring + _ ≤ Real.rpow (dist x y) (-a) * A := + mul_le_mul_of_nonneg_right hpow hA + calc + ENNReal.ofReal (A / Real.rpow (euclideanDist x y) a) ≤ + ENNReal.ofReal (Real.rpow (dist x y) (-a) * A) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A := by + exact ENNReal.ofReal_mul (Real.rpow_nonneg dist_nonneg (-a)) + +private theorem sum_scalar_gagliardoKernel_le_mul_euclideanHsIntegrand {d : ℕ} + [NeZero d] (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (z : Vec d × Vec d) : + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * euclideanHsIntegrand s F z := by + rw [sum_scalar_gagliardoKernel_eq_distance_mul_numerator] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * 2 + (d : ℝ) + let A : ℝ := ‖HilbertVec.ofVec (F x - F y)‖ ^ 2 + have ha : 0 < a := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := Nat.cast_nonneg d + dsimp [a] + nlinarith [s.2.1, hd_nonneg] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + change ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ENNReal.ofReal + (A / Real.rpow (euclideanDist x y) ((d : ℝ) + 2 * s.1)) + rw [show (d : ℝ) + 2 * s.1 = a by simp [a, add_comm, mul_comm]] + by_cases hxy : x = y + · subst y + simp [A] + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hdenominator : + Real.rpow (euclideanDist x y) a ≤ + Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := by + calc + Real.rpow (euclideanDist x y) a ≤ + Real.rpow ((d : ℝ) * dist x y) a := + Real.rpow_le_rpow (euclideanDist_nonneg x y) + (euclideanDist_le_dimension_mul_dist x y) ha.le + _ = Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := by + exact Real.mul_rpow hd.le dist_nonneg + have hA : 0 ≤ A := sq_nonneg _ + have hdistPow : 0 < Real.rpow (dist x y) a := + Real.rpow_pos_of_pos hdist a + have heuclideanDistPow : 0 < Real.rpow (euclideanDist x y) a := + Real.rpow_pos_of_pos heuclideanDist a + have hreal : + Real.rpow (dist x y) (-a) * A ≤ + Real.rpow (d : ℝ) a * + (A / Real.rpow (euclideanDist x y) a) := by + have hdist_neg : + Real.rpow (dist x y) (-a) = (Real.rpow (dist x y) a)⁻¹ := + Real.rpow_neg hdist.le a + calc + Real.rpow (dist x y) (-a) * A = + A / Real.rpow (dist x y) a := by + rw [hdist_neg, div_eq_mul_inv] + ring + _ ≤ (Real.rpow (d : ℝ) a * A) / + Real.rpow (euclideanDist x y) a := by + rw [div_le_div_iff₀ hdistPow heuclideanDistPow] + calc + A * Real.rpow (euclideanDist x y) a ≤ + A * (Real.rpow (d : ℝ) a * Real.rpow (dist x y) a) := + mul_le_mul_of_nonneg_left hdenominator hA + _ = (Real.rpow (d : ℝ) a * A) * Real.rpow (dist x y) a := by + ring + _ = Real.rpow (d : ℝ) a * + (A / Real.rpow (euclideanDist x y) a) := by + ring + calc + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A = + ENNReal.ofReal (Real.rpow (dist x y) (-a) * A) := by + exact (ENNReal.ofReal_mul (Real.rpow_nonneg dist_nonneg (-a))).symm + _ ≤ ENNReal.ofReal + (Real.rpow (d : ℝ) a * + (A / Real.rpow (euclideanDist x y) a)) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal ((d : ℝ) ^ a) * + ENNReal.ofReal (A / Real.rpow (euclideanDist x y) a) := by + exact ENNReal.ofReal_mul (Real.rpow_nonneg hd.le a) + +/-- The explicit metric-comparison constant is finite in every dimension and fractional order. -/ +theorem coordinateGagliardoEnergy_euclideanHsConstant_lt_top (d : ℕ) + (s : FractionalOrder) : + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) < ∞ := + ENNReal.ofReal_lt_top + +/-- Proof-internal positive-dimensional producer: the exact Euclidean energy is bounded by the +finite family of scalar ambient-distance Gagliardo energies. -/ +theorem euclideanHsEnergy_le_coordinateGagliardoEnergy {d : ℕ} [NeZero d] + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) : + euclideanHsEnergy s F ≤ coordinateGagliardoEnergy s F := by + rw [euclideanHsEnergy_eq_lintegral, + euclideanHsProductMeasure_eq_gagliardoCubeMeasure_originCube_zero, + coordinateGagliardoEnergy_eq_lintegral_sum s F hF] + refine lintegral_mono fun z => ?_ + simpa only [euclideanHsIntegrand] using + euclideanHsIntegrand_le_sum_scalar_gagliardoKernel s F z + +/-- Proof-internal positive-dimensional producer: the coordinate Gagliardo energy is bounded by +the exact Euclidean energy with an explicit metric-comparison factor. -/ +theorem coordinateGagliardoEnergy_le_mul_euclideanHsEnergy {d : ℕ} [NeZero d] + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) : + coordinateGagliardoEnergy s F ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * euclideanHsEnergy s F := by + rw [coordinateGagliardoEnergy_eq_lintegral_sum s F hF, + euclideanHsEnergy_eq_lintegral, + euclideanHsProductMeasure_eq_gagliardoCubeMeasure_originCube_zero] + calc + (∫⁻ z, ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d 0)) ≤ + ∫⁻ z, ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Gagliardo.gagliardoCubeMeasure (originCube d 0) := by + refine lintegral_mono fun z => ?_ + simpa only [euclideanHsIntegrand] using + sum_scalar_gagliardoKernel_le_mul_euclideanHsIntegrand s F z + _ = ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Gagliardo.gagliardoCubeMeasure (originCube d 0) := by + rw [lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanHsMeasurability.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanHsMeasurability.lean new file mode 100644 index 0000000000..1b64d5382b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/EuclideanHsMeasurability.lean @@ -0,0 +1,81 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.MeasurableRepresentative + +/-! +# Measurability closure for the exact Euclidean fractional energy +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem measurable_euclideanDist_pair (d : ℕ) : + Measurable (fun z : Vec d × Vec d => euclideanDist z.1 z.2) := by + have hsub : Measurable (fun z : Vec d × Vec d => z.1 - z.2) := + measurable_fst.sub measurable_snd + have hh : Measurable (fun z : Vec d × Vec d => HilbertVec.ofVec (z.1 - z.2)) := + (HilbertVec.ofVecL d).continuous.measurable.comp hsub + simpa only [euclideanDist, euclideanNorm_eq_norm_ofVec] using hh.norm + +/-- A globally measurable representative has a measurable totalized exact +Euclidean fractional-energy integrand. -/ +theorem measurable_euclideanHsIntegrand_of_measurable {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (hF : Measurable F) : + Measurable (euclideanHsIntegrand s F) := by + unfold euclideanHsIntegrand + apply Measurable.ennreal_ofReal + apply Measurable.div + · exact ((HilbertVec.ofVecL d).continuous.measurable.comp + ((hF.comp measurable_fst).sub (hF.comp measurable_snd))).norm.pow measurable_const + · change Measurable (fun z : Vec d × Vec d => + euclideanDist z.1 z.2 ^ ((d : ℝ) + 2 * s.1)) + exact (measurable_euclideanDist_pair d).pow measurable_const + +/-- The exact Euclidean integrand is a.e.-measurable for every stored `L²` +field, by transport from its canonical measurable representative. -/ +theorem aemeasurable_euclideanHsIntegrand {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + AEMeasurable (euclideanHsIntegrand s F) (euclideanHsProductMeasure d) := by + exact (measurable_euclideanHsIntegrand_of_measurable s F.measurableRepresentative + F.measurable_measurableRepresentative).aemeasurable.congr + (euclideanHsIntegrand_congr_ae F.ae_eq_measurableRepresentative).symm + +/-- With integrand measurability now automatic, exact fractional membership +is precisely finiteness of the extended Euclidean energy. -/ +theorem memEuclideanHs_iff_energy_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + MemEuclideanHs s F ↔ euclideanHsEnergy s F < ∞ := by + constructor + · exact fun h => h.energy_lt_top + · exact fun h => ⟨aemeasurable_euclideanHsIntegrand s F, h⟩ + +/-- Taking the positive half-power preserves finiteness of the exact +Euclidean fractional energy. -/ +theorem euclideanHsESeminorm_lt_top_iff_energy_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsESeminorm s F < ∞ ↔ euclideanHsEnergy s F < ∞ := by + unfold euclideanHsESeminorm + exact ENNReal.rpow_lt_top_iff_of_pos (by norm_num) + +/-- Exact fractional membership is equivalently finiteness of the extended +Euclidean fractional seminorm. -/ +theorem memEuclideanHs_iff_euclideanHsESeminorm_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + MemEuclideanHs s F ↔ euclideanHsESeminorm s F < ∞ := by + rw [memEuclideanHs_iff_energy_lt_top, euclideanHsESeminorm_lt_top_iff_energy_lt_top] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/FullNormEquivalence.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/FullNormEquivalence.lean new file mode 100644 index 0000000000..bf869b2045 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/FullNormEquivalence.lean @@ -0,0 +1,153 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.SeminormComparison + +/-! +# Additive full-norm equivalence for continuous interpolation + +This module packages the approved source-facing convention: the normalized Euclidean `L²` +norm plus either the continuum interpolation seminorm or the exact Euclidean fractional +Sobolev seminorm. The two resulting extended-valued full norms are equivalent with one +finite constant depending only on the fractional order and the dimension. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The source-facing continuum interpolation full norm: normalized Euclidean `L²` plus the +continuous `K`-seminorm. -/ +noncomputable def continuousKFullENorm {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + continuousKSeminorm s F + +/-- The source-facing exact Euclidean fractional full norm: normalized Euclidean `L²` plus the +Euclidean `H^s` seminorm. -/ +noncomputable def euclideanHsFullENorm {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + euclideanHsESeminorm s F + +/-- Evaluation formula for the continuous interpolation full norm. -/ +theorem continuousKFullENorm_eq {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + continuousKFullENorm s F = + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + continuousKSeminorm s F := + rfl + +/-- Evaluation formula for the exact Euclidean fractional full norm. -/ +theorem euclideanHsFullENorm_eq {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + euclideanHsFullENorm s F = + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + euclideanHsESeminorm s F := + rfl + +/-- A single constant that controls both directions of the additive full-norm comparison. -/ +noncomputable def continuousKEuclideanHsFullENormConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + 1 + max (continuousKToEuclideanHsSeminormConstant s d) + (euclideanHsToContinuousKSeminormConstant s d) + +/-- The common full-norm comparison constant is finite. -/ +theorem continuousKEuclideanHsFullENormConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + continuousKEuclideanHsFullENormConstant s d < ∞ := by + unfold continuousKEuclideanHsFullENormConstant + rw [ENNReal.add_lt_top, max_lt_iff] + exact ⟨ENNReal.one_lt_top, continuousKToEuclideanHsSeminormConstant_lt_top s d, + euclideanHsToContinuousKSeminormConstant_lt_top s d⟩ + +private theorem add_mul_le_one_add_mul_of_le {A B C : ℝ≥0∞} (hAB : A ≤ B) : + A + C * B ≤ (1 + C) * B := by + calc + A + C * B ≤ B + C * B := add_le_add_left hAB _ + _ = (1 + C) * B := by + rw [add_mul] + simp only [one_mul] + +/-- The continuum interpolation full norm controls the exact Euclidean fractional full norm +with the common finite constant. -/ +theorem euclideanHsFullENorm_le_mul_continuousKFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsFullENorm s F ≤ + continuousKEuclideanHsFullENormConstant s d * continuousKFullENorm s F := by + let L : ℝ≥0∞ := (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + let K : ℝ≥0∞ := continuousKSeminorm s F + let H : ℝ≥0∞ := euclideanHsESeminorm s F + let C : ℝ≥0∞ := max (continuousKToEuclideanHsSeminormConstant s d) + (euclideanHsToContinuousKSeminormConstant s d) + calc + euclideanHsFullENorm s F = L + H := rfl + _ ≤ L + euclideanHsToContinuousKSeminormConstant s d * (L + K) := by + exact add_le_add_right + (euclideanHsESeminorm_le_mul_normalizedEuclideanLpENorm_add_continuousKSeminorm + s F) _ + _ ≤ L + C * (L + K) := by + apply add_le_add_right + exact mul_le_mul_left + (le_max_right (continuousKToEuclideanHsSeminormConstant s d) + (euclideanHsToContinuousKSeminormConstant s d)) _ + _ ≤ (1 + C) * (L + K) := + add_mul_le_one_add_mul_of_le (le_add_of_nonneg_right zero_le) + _ = continuousKEuclideanHsFullENormConstant s d * continuousKFullENorm s F := by + rfl + +/-- The exact Euclidean fractional full norm controls the continuum interpolation full norm +with the same common finite constant. -/ +theorem continuousKFullENorm_le_mul_euclideanHsFullENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKFullENorm s F ≤ + continuousKEuclideanHsFullENormConstant s d * euclideanHsFullENorm s F := by + let L : ℝ≥0∞ := (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + let K : ℝ≥0∞ := continuousKSeminorm s F + let H : ℝ≥0∞ := euclideanHsESeminorm s F + let C : ℝ≥0∞ := max (continuousKToEuclideanHsSeminormConstant s d) + (euclideanHsToContinuousKSeminormConstant s d) + calc + continuousKFullENorm s F = L + K := rfl + _ ≤ L + continuousKToEuclideanHsSeminormConstant s d * H := by + exact add_le_add_right (continuousKSeminorm_le_mul_euclideanHsESeminorm s F) _ + _ ≤ L + C * H := by + apply add_le_add_right + exact mul_le_mul_left + (le_max_left (continuousKToEuclideanHsSeminormConstant s d) + (euclideanHsToContinuousKSeminormConstant s d)) _ + _ ≤ L + C * (L + H) := by + apply add_le_add_right + exact mul_le_mul_right (le_add_of_nonneg_left zero_le) _ + _ ≤ (1 + C) * (L + H) := + add_mul_le_one_add_mul_of_le (le_add_of_nonneg_right zero_le) + _ = continuousKEuclideanHsFullENormConstant s d * euclideanHsFullENorm s F := by + rfl + +/-- Source-facing all-dimensional equivalence between the approved additive continuous +interpolation and exact Euclidean fractional full norms. -/ +theorem exists_continuousKFullENorm_euclideanHsFullENorm_equivalence + (d : ℕ) (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ F : UnitCubeEuclideanL2Field d, + (MemEuclideanHs s F ↔ continuousKSeminorm s F < ∞) ∧ + euclideanHsFullENorm s F ≤ C * continuousKFullENorm s F ∧ + continuousKFullENorm s F ≤ C * euclideanHsFullENorm s F := by + refine ⟨continuousKEuclideanHsFullENormConstant s d, + continuousKEuclideanHsFullENormConstant_lt_top s d, ?_⟩ + intro F + exact ⟨memEuclideanHs_iff_continuousKSeminorm_lt_top s F, + euclideanHsFullENorm_le_mul_continuousKFullENorm s F, + continuousKFullENorm_le_mul_euclideanHsFullENorm s F⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/KInfimum.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/KInfimum.lean new file mode 100644 index 0000000000..f731e7627f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/KInfimum.lean @@ -0,0 +1,59 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional + +/-! +# Approximate competitors for the continuous K-functional + +This file records convention-neutral consequences of the definition of the continuous +`K`-functional as a real infimum. The infimum need not be attained: every positive error admits +a genuine `ContinuousKCompetitor` whose value lies within that error of the infimum. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Every positive error admits a genuine competitor whose value is strictly less than the +continuous `K`-functional plus that error. This does not assert that the infimum is attained. -/ +theorem exists_continuousKCompetitor_value_lt_add {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) {ε : ℝ} (hε : 0 < ε) : + ∃ G : ContinuousKCompetitor d, + continuousKFunctionalCompetitorValue t F G < continuousKFunctional t F + ε := by + rw [continuousKFunctional_eq_sInf] + obtain ⟨a, ⟨G, rfl⟩, ha⟩ := + (csInf_lt_iff (continuousKFunctional_range_bddBelow t F) + (continuousKFunctional_range_nonempty t F)).1 (lt_add_of_pos_right _ hε) + exact ⟨G, ha⟩ + +/-- Non-strict version of `exists_continuousKCompetitor_value_lt_add`. -/ +theorem exists_continuousKCompetitor_value_le_add {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) {ε : ℝ} (hε : 0 < ε) : + ∃ G : ContinuousKCompetitor d, + continuousKFunctionalCompetitorValue t F G ≤ continuousKFunctional t F + ε := by + obtain ⟨G, hG⟩ := exists_continuousKCompetitor_value_lt_add t F hε + exact ⟨G, hG.le⟩ + +/-- A strict upper bound on the continuous `K`-functional contains the value of a genuine +competitor. -/ +theorem exists_continuousKCompetitor_value_lt_of_continuousKFunctional_lt {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) {a : ℝ} + (h : continuousKFunctional t F < a) : + ∃ G : ContinuousKCompetitor d, continuousKFunctionalCompetitorValue t F G < a := by + rw [continuousKFunctional_eq_sInf] at h + obtain ⟨y, ⟨G, rfl⟩, hy⟩ := + (csInf_lt_iff (continuousKFunctional_range_bddBelow t F) + (continuousKFunctional_range_nonempty t F)).1 h + exact ⟨G, hy⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/MeasurableRepresentative.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/MeasurableRepresentative.lean new file mode 100644 index 0000000000..20d4678f01 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/MeasurableRepresentative.lean @@ -0,0 +1,124 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry + +/-! +# Measurable representatives of unit-cube Euclidean `L²` fields + +The public `UnitCubeEuclideanL2Field` carrier stores an a.e. `L²` witness, +not a chosen measurable representative. This module obtains one internally +from that witness without changing the carrier. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace UnitCubeEuclideanL2Field + +/-- The globally measurable vector representative selected from the stored +Hilbert-valued Euclidean `L²` witness. -/ +noncomputable def measurableRepresentative {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : UnitCubeEuclideanL2Field d := + let f : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (F x) + let hf : AEStronglyMeasurable f (unitCenteredCubeDomain d).normalizedVolume := + F.euclideanMemL2.aestronglyMeasurable + { toField := fun x => HilbertVec.toVec (AEStronglyMeasurable.mk f hf x) + euclideanMemL2 := by + simpa only [HilbertVec.ofVec_toVec] using F.euclideanMemL2.ae_eq hf.ae_eq_mk } + +/-- The selected representative is globally measurable as a `Vec d` field. -/ +theorem measurable_measurableRepresentative {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : Measurable F.measurableRepresentative := by + unfold measurableRepresentative + dsimp only + exact (HilbertVec.continuousLinearEquivVec d).continuous.measurable.comp + (F.euclideanMemL2.aestronglyMeasurable.measurable_mk) + +/-- The chosen representative agrees with the original field almost +everywhere for normalized unit-cube volume. -/ +theorem ae_eq_measurableRepresentative {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] F.measurableRepresentative := by + unfold measurableRepresentative + dsimp only + filter_upwards [F.euclideanMemL2.aestronglyMeasurable.ae_eq_mk] with x hx + simpa only [HilbertVec.toVec_ofVec] using congrArg HilbertVec.toVec hx + +/-- The representative retains the stored Euclidean `L²` witness. -/ +theorem measurableRepresentative_euclideanMemL2 {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (F.measurableRepresentative x)) + (2 : ℝ≥0∞) (unitCenteredCubeDomain d).normalizedVolume := + F.measurableRepresentative.euclideanMemL2 + +/-- Every scalar coordinate of the selected representative is globally +measurable. -/ +theorem measurable_measurableRepresentative_coordinate {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (i : Fin d) : + Measurable (fun x => F.measurableRepresentative x i) := + (continuous_apply i).measurable.comp F.measurable_measurableRepresentative + +/-- The selected representative is an ambient-vector `L²` field for the +canonical origin-cube normalization. -/ +theorem memLp_measurableRepresentative {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + MemLp F.measurableRepresentative (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0)) := by + rw [← unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure] + refine F.measurableRepresentative.euclideanMemL2.mono + F.measurable_measurableRepresentative.aestronglyMeasurable ?_ + filter_upwards with x + exact HilbertVec.norm_le_norm_ofVec _ + +/-- Every scalar coordinate of the selected representative is in `L²` for +the canonical origin-cube normalization. -/ +theorem memLp_measurableRepresentative_coordinate {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (i : Fin d) : + MemLp (fun x => F.measurableRepresentative x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0)) := by + rw [← unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure] + have hmem := F.measurableRepresentative.euclideanMemL2 + rw [memLp_piLp_iff] at hmem + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + hmem i + +/-- Replacing a field by its chosen measurable representative preserves the +continuous interpolation seminorm. -/ +theorem continuousKSeminorm_eq_measurableRepresentative {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F = continuousKSeminorm s F.measurableRepresentative := + continuousKSeminorm_congr_ae s F.ae_eq_measurableRepresentative + +/-- Replacing a field by its chosen measurable representative preserves the +exact Euclidean fractional energy. -/ +theorem euclideanHsEnergy_eq_measurableRepresentative {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsEnergy s F = euclideanHsEnergy s F.measurableRepresentative := + euclideanHsEnergy_congr_ae F.ae_eq_measurableRepresentative + +/-- Replacing a field by its chosen measurable representative preserves the +exact Euclidean fractional seminorm. -/ +theorem euclideanHsESeminorm_eq_measurableRepresentative {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsESeminorm s F = euclideanHsESeminorm s F.measurableRepresentative := + euclideanHsESeminorm_congr_ae F.ae_eq_measurableRepresentative + +end UnitCubeEuclideanL2Field + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapCoordinateBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapCoordinateBridge.lean new file mode 100644 index 0000000000..fa0684c722 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapCoordinateBridge.lean @@ -0,0 +1,537 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.PositiveNorm + +/-! +# Coordinate bridges for the overlapping positive Besov seminorm + +The scalar fractional-Sobolev comparison and the vector discrete `K`-functional use two +historically duplicated presentations of the same overlap geometry. This file identifies those +presentations and compares their finite `p = q = 2` truncations. No full real-valued `sSup` +seminorm occurs here. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +namespace ScalarOverlap + +/-- The duplicated overlap side-length definitions agree. -/ +theorem scaleFactor_eq_overlapCubeScaleFactor {d : ℕ} (S : TriadicCube d) : + scaleFactor S = Homogenization.overlapCubeScaleFactor S := by + rfl + +/-- The duplicated half-open overlap cubes agree. -/ +theorem cubeSet_eq_overlapCubeSet {d : ℕ} (S : TriadicCube d) : + cubeSet S = Homogenization.overlapCubeSet S := by + rfl + +/-- The duplicated open overlap cubes agree. -/ +theorem openCubeSet_eq_openOverlapCubeSet {d : ℕ} (S : TriadicCube d) : + openCubeSet S = Homogenization.openOverlapCubeSet S := by + rfl + +/-- The duplicated overlap-volume definitions agree. -/ +theorem cubeVolume_eq_overlapCubeVolume {d : ℕ} (S : TriadicCube d) : + cubeVolume S = Homogenization.overlapCubeVolume S := by + rfl + +/-- The duplicated unnormalized overlap measures agree. -/ +theorem cubeMeasure_eq_overlapCubeMeasure {d : ℕ} (S : TriadicCube d) : + cubeMeasure S = Homogenization.overlapCubeMeasure S := by + rfl + +/-- The duplicated normalized overlap measures agree. -/ +theorem normalizedCubeMeasure_eq_normalizedOverlapCubeMeasure {d : ℕ} + (S : TriadicCube d) : + normalizedCubeMeasure S = Homogenization.normalizedOverlapCubeMeasure S := by + rfl + +/-- The duplicated finite sets of overlap centers agree at every depth. -/ +theorem centersAtDepth_eq_overlapCentersAtDepth {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + centersAtDepth Q j = Homogenization.overlapCentersAtDepth Q j := by + rfl + +/-- The duplicated finite-center averages agree. -/ +theorem centersAverage_eq_overlapCentersAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : TriadicCube d → ℝ) : + centersAverage Q j f = Homogenization.overlapCentersAverage Q j f := by + rfl + +/-- The duplicated scalar overlap averages agree. -/ +theorem cubeAverage_eq_overlapCubeAverage {d : ℕ} + (S : TriadicCube d) (f : Vec d → ℝ) : + cubeAverage S f = Homogenization.overlapCubeAverage S f := by + rfl + +/-- The duplicated vector overlap averages agree. -/ +theorem cubeAverageVec_eq_overlapCubeAverageVec {d : ℕ} + (S : TriadicCube d) (F : Vec d → Vec d) : + cubeAverageVec S F = Homogenization.overlapCubeAverageVec S F := by + rfl + +/-- The duplicated normalized overlap `L^p` norms agree. -/ +theorem cubeLpNorm_eq_overlapCubeLpNorm {d : ℕ} {E : Type*} + [NormedAddCommGroup E] (S : TriadicCube d) (p : ℝ≥0∞) (f : Vec d → E) : + cubeLpNorm S p f = Homogenization.overlapCubeLpNorm S p f := by + rfl + +end ScalarOverlap + +/-- A coordinate of the vector overlap fluctuation is the scalar overlap fluctuation used by +`cubeBesovOverlapOscillation`. -/ +theorem cubeBesovOverlapOscillation_two_coordinate_eq_overlapCubeLpNorm {d : ℕ} + (S : TriadicCube d) (F : Vec d → Vec d) (i : Fin d) : + cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) = + overlapCubeLpNorm S (2 : ℝ≥0∞) (fun x => overlapCubeFluctuationVec S F x i) := by + unfold cubeBesovOverlapOscillation overlapCubeFluctuationVec + rw [ScalarOverlap.cubeLpNorm_eq_overlapCubeLpNorm, + ScalarOverlap.cubeAverage_eq_overlapCubeAverage] + rfl + +/-- Each scalar coordinate oscillation is bounded by the corrected vector oscillation on the +same overlap cube. -/ +theorem cubeBesovOverlapOscillation_two_coordinate_le_vector {d : ℕ} + (S : TriadicCube d) (F : Vec d → Vec d) (i : Fin d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) ≤ + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) := by + rw [cubeBesovOverlapOscillation_two_coordinate_eq_overlapCubeLpNorm] + exact overlapCubeLpNorm_component_le_overlapCubeLpNorm S (2 : ℝ≥0∞) + (overlapCubeFluctuationVec S F) i (memLp_overlapCubeFluctuationVec S F hF) + +/-- The corrected vector oscillation is bounded by the sum of its scalar coordinate +oscillations on the same overlap cube. -/ +theorem overlapCubeLpNorm_fluctuationVec_le_sum_cubeBesovOverlapOscillation_two {d : ℕ} + (S : TriadicCube d) (F : Vec d → Vec d) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedOverlapCubeMeasure S)) : + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) ≤ + ∑ i : Fin d, cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) := by + calc + overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) + ≤ ∑ i : Fin d, + overlapCubeLpNorm S (2 : ℝ≥0∞) + (fun x => overlapCubeFluctuationVec S F x i) := + overlapCubeLpNorm_two_vec_le_sum_components S (overlapCubeFluctuationVec S F) + (memLp_overlapCubeFluctuationVec S F hF) + _ = ∑ i : Fin d, + cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + exact (cubeBesovOverlapOscillation_two_coordinate_eq_overlapCubeLpNorm S F i).symm + +/-- The legacy overlap depth weight is the root-scale factor times the corrected vector depth +weight. -/ +theorem cubeBesovOverlapDepthWeight_eq_scaleWeight_mul_rpow {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + cubeBesovOverlapDepthWeight Q s j = + cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + have hQ_nonneg : 0 ≤ cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (le_of_lt (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale)) + calc + cubeBesovOverlapDepthWeight Q s j = + (cubeScaleFactor Q / (3 : ℝ) ^ j) ^ (-s) := by + rfl + _ = (cubeScaleFactor Q) ^ (-s) / ((3 : ℝ) ^ j) ^ (-s) := by + exact Real.div_rpow hQ_nonneg (by positivity) (-s) + _ = (cubeScaleFactor Q ^ s)⁻¹ / (((3 : ℝ) ^ j) ^ s)⁻¹ := by + rw [Real.rpow_neg hQ_nonneg, + Real.rpow_neg (show 0 ≤ ((3 : ℝ) ^ j) by positivity)] + _ = (cubeScaleFactor Q ^ s)⁻¹ * ((3 : ℝ) ^ j) ^ s := by + rw [div_eq_mul_inv, inv_inv] + _ = (cubeScaleFactor Q) ^ (-s) * ((3 : ℝ) ^ j) ^ s := by + rw [← Real.rpow_neg hQ_nonneg] + _ = (cubeScaleFactor Q) ^ (-s) * Real.rpow (3 : ℝ) ((j : ℝ) * s) := by + congr 1 + symm + simpa [mul_comm] using Real.rpow_natCast_mul (by positivity : 0 ≤ (3 : ℝ)) j s + _ = (cubeScaleFactor Q) ^ (-s) * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + congr 1 + rw [mul_comm] + _ = cubeBesovScaleWeight s Q * Real.rpow (3 : ℝ) (s * (j : ℝ)) := by + rfl + +/-- A scalar coordinate depth average is bounded by the corrected vector depth average. -/ +theorem cubeBesovOverlapDepthAverage_two_coordinate_le_vector {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) (i : Fin d) (j : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j ≤ + cubeBesovOverlappingPositiveVectorDepthAverage Q F j := by + rw [cubeBesovOverlapDepthAverage, cubeBesovOverlappingPositiveVectorDepthAverage, + ScalarOverlap.centersAverage_eq_overlapCentersAverage] + refine overlapCentersAverage_le_overlapCentersAverage Q j ?_ + intro S hS + have hFS : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS hF + have hlocal := cubeBesovOverlapOscillation_two_coordinate_le_vector S F i hFS + have hleft_nonneg : + 0 ≤ cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) := + cubeBesovOverlapOscillation_nonneg S (2 : ℝ≥0∞) (fun x => F x i) + have hright_nonneg : + 0 ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) := + overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) + simpa only [ENNReal.toReal_ofNat, Real.rpow_two] using + (sq_le_sq₀ hleft_nonneg hright_nonneg).2 hlocal + +/-- The square root of the corrected vector depth average is bounded by the sum of the square +roots of the scalar coordinate depth averages. -/ +theorem sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_sum_coordinates {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) (j : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) ≤ + ∑ i : Fin d, + Real.sqrt (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j) := by + let A : TriadicCube d → Fin d → ℝ := fun S i => + cubeBesovOverlapOscillation S (2 : ℝ≥0∞) (fun x => F x i) + have hA_nonneg : + ∀ S ∈ overlapCentersAtDepth Q j, ∀ i ∈ (Finset.univ : Finset (Fin d)), + 0 ≤ A S i := by + intro S _hS i _hi + exact cubeBesovOverlapOscillation_nonneg S (2 : ℝ≥0∞) (fun x => F x i) + have havg : + cubeBesovOverlappingPositiveVectorDepthAverage Q F j ≤ + overlapCentersAverage Q j (fun S => (∑ i : Fin d, A S i) ^ 2) := by + rw [cubeBesovOverlappingPositiveVectorDepthAverage] + refine overlapCentersAverage_le_overlapCentersAverage Q j ?_ + intro S hS + have hFS : MeasureTheory.MemLp F (2 : ℝ≥0∞) + (normalizedOverlapCubeMeasure S) := + memLp_normalizedOverlapCubeMeasure_of_memLp_normalizedCubeMeasure hS hF + have hlocal := + overlapCubeLpNorm_fluctuationVec_le_sum_cubeBesovOverlapOscillation_two S F hFS + have hleft_nonneg : + 0 ≤ overlapCubeLpNorm S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) := + overlapCubeLpNorm_nonneg S (2 : ℝ≥0∞) (overlapCubeFluctuationVec S F) + have hright_nonneg : 0 ≤ ∑ i : Fin d, A S i := + Finset.sum_nonneg fun i hi => hA_nonneg S hS i hi + exact (sq_le_sq₀ hleft_nonneg hright_nonneg).2 hlocal + calc + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) + ≤ Real.sqrt (overlapCentersAverage Q j (fun S => (∑ i : Fin d, A S i) ^ 2)) := + Real.sqrt_le_sqrt havg + _ ≤ ∑ i : Fin d, + Real.sqrt (overlapCentersAverage Q j (fun S => (A S i) ^ 2)) := + by + simpa [Real.sqrt_eq_rpow] using + overlapCentersAverage_L2_sum_le_sum_overlapCentersAverage_L2 + Q j Finset.univ A hA_nonneg + _ = ∑ i : Fin d, + Real.sqrt + (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + congr 1 + rw [cubeBesovOverlapDepthAverage, + ScalarOverlap.centersAverage_eq_overlapCentersAverage] + norm_num [A, Real.rpow_two] + +/-- A scalar coordinate depth seminorm is bounded by the root-scale factor times the corrected +vector depth seminorm. -/ +theorem cubeBesovOverlapDepthSeminorm_two_coordinate_le_vector {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (i : Fin d) (j : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j ≤ + cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j := by + have havg := cubeBesovOverlapDepthAverage_two_coordinate_le_vector Q F i j hF + have hsqrt : + Real.sqrt (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j) ≤ + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) := + Real.sqrt_le_sqrt havg + have hweight_nonneg : 0 ≤ cubeBesovOverlapDepthWeight Q s j := + cubeBesovOverlapDepthWeight_nonneg Q s j + calc + cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j = + cubeBesovOverlapDepthWeight Q s j * + Real.sqrt + (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j) := by + simp [cubeBesovOverlapDepthSeminorm, Real.sqrt_eq_rpow] + _ ≤ cubeBesovOverlapDepthWeight Q s j * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j) := + mul_le_mul_of_nonneg_left hsqrt hweight_nonneg + _ = cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j := by + rw [cubeBesovOverlapDepthWeight_eq_scaleWeight_mul_rpow] + simp [cubeBesovOverlappingPositiveVectorDepthSeminorm, mul_assoc] + +/-- After inserting the root-scale factor, the corrected vector depth seminorm is bounded by +the sum of the scalar coordinate depth seminorms. -/ +theorem scaleWeight_mul_vectorDepthSeminorm_le_sum_coordinates {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (j : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + ∑ i : Fin d, + cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j := by + have hroot := + sqrt_cubeBesovOverlappingPositiveVectorDepthAverage_le_sum_coordinates Q F j hF + have hscale_nonneg : 0 ≤ Real.rpow (3 : ℝ) (s * (j : ℝ)) := + Real.rpow_nonneg (by norm_num) _ + have hweight_nonneg : 0 ≤ cubeBesovScaleWeight s Q := + cubeBesovScaleWeight_nonneg s Q + calc + cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j = + cubeBesovScaleWeight s Q * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + Real.sqrt (cubeBesovOverlappingPositiveVectorDepthAverage Q F j)) := by + rfl + _ ≤ cubeBesovScaleWeight s Q * + (Real.rpow (3 : ℝ) (s * (j : ℝ)) * + ∑ i : Fin d, + Real.sqrt + (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) (fun x => F x i) j)) := + mul_le_mul_of_nonneg_left + (mul_le_mul_of_nonneg_left hroot hscale_nonneg) hweight_nonneg + _ = ∑ i : Fin d, + cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j := by + rw [Finset.mul_sum, Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [cubeBesovOverlapDepthSeminorm, + cubeBesovOverlapDepthWeight_eq_scaleWeight_mul_rpow] + simp [Real.sqrt_eq_rpow, mul_assoc] + +/-- The scalar finite `p = q = 2` overlap seminorm is the square root of the sum of its squared +depth terms. -/ +theorem cubeBesovOverlapPartialSeminorm_two_two_eq_sqrt_sum_sq {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (N : ℕ) (f : Vec d → ℝ) : + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N f = + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) f j) ^ 2) := by + unfold cubeBesovOverlapPartialSeminorm + rw [Real.sqrt_eq_rpow] + norm_num + +private theorem sqrt_sum_sq_const_mul_eq {ι : Type*} + (I : Finset ι) (c : ℝ) (f : ι → ℝ) (hc : 0 ≤ c) : + Real.sqrt (∑ i ∈ I, (c * f i) ^ 2) = + c * Real.sqrt (∑ i ∈ I, (f i) ^ 2) := by + have hsum_nonneg : 0 ≤ ∑ i ∈ I, (f i) ^ 2 := + Finset.sum_nonneg fun i _hi => sq_nonneg (f i) + calc + Real.sqrt (∑ i ∈ I, (c * f i) ^ 2) = + Real.sqrt (c ^ 2 * ∑ i ∈ I, (f i) ^ 2) := by + congr 1 + rw [Finset.mul_sum] + refine Finset.sum_congr rfl ?_ + intro i _hi + ring + _ = Real.sqrt (c ^ 2) * Real.sqrt (∑ i ∈ I, (f i) ^ 2) := by + rw [Real.sqrt_mul (sq_nonneg c)] + _ = c * Real.sqrt (∑ i ∈ I, (f i) ^ 2) := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hc] + +private theorem sqrt_sum_sq_add_le {ι : Type*} + (I : Finset ι) (f g : ι → ℝ) + (hf : ∀ i ∈ I, 0 ≤ f i) (hg : ∀ i ∈ I, 0 ≤ g i) : + Real.sqrt (∑ i ∈ I, (f i + g i) ^ 2) ≤ + Real.sqrt (∑ i ∈ I, (f i) ^ 2) + Real.sqrt (∑ i ∈ I, (g i) ^ 2) := by + simpa [Real.sqrt_eq_rpow] using + (Real.Lp_add_le_of_nonneg + (s := I) (f := f) (g := g) (p := (2 : ℝ)) (by norm_num) hf hg) + +private theorem sqrt_sum_sq_sum_le_sum_sqrt_sum_sq + {ι κ : Type*} [DecidableEq κ] + (I : Finset ι) (J : Finset κ) (A : ι → κ → ℝ) + (hA : ∀ i ∈ I, ∀ k ∈ J, 0 ≤ A i k) : + Real.sqrt (∑ i ∈ I, (∑ k ∈ J, A i k) ^ 2) ≤ + ∑ k ∈ J, Real.sqrt (∑ i ∈ I, (A i k) ^ 2) := by + induction J using Finset.induction_on with + | empty => simp + | @insert a J ha ih => + have hsum_nonneg : ∀ i ∈ I, 0 ≤ ∑ k ∈ J, A i k := by + intro i hi + exact Finset.sum_nonneg fun k hk => hA i hi k (Finset.mem_insert_of_mem hk) + calc + Real.sqrt (∑ i ∈ I, (∑ k ∈ insert a J, A i k) ^ 2) = + Real.sqrt (∑ i ∈ I, (A i a + ∑ k ∈ J, A i k) ^ 2) := by + congr 1 + refine Finset.sum_congr rfl ?_ + intro i _hi + rw [Finset.sum_insert ha] + _ ≤ Real.sqrt (∑ i ∈ I, (A i a) ^ 2) + + Real.sqrt (∑ i ∈ I, (∑ k ∈ J, A i k) ^ 2) := + sqrt_sum_sq_add_le I (fun i => A i a) (fun i => ∑ k ∈ J, A i k) + (fun i hi => hA i hi a (by simp [ha])) hsum_nonneg + _ ≤ Real.sqrt (∑ i ∈ I, (A i a) ^ 2) + + ∑ k ∈ J, Real.sqrt (∑ i ∈ I, (A i k) ^ 2) := by + exact add_le_add le_rfl <| + ih (fun i hi k hk => hA i hi k (Finset.mem_insert_of_mem hk)) + _ = ∑ k ∈ insert a J, Real.sqrt (∑ i ∈ I, (A i k) ^ 2) := by + simp [ha] + +/-- A scalar coordinate finite truncation is bounded by the root-scale factor times the +corrected vector finite truncation. -/ +theorem cubeBesovOverlapPartialSeminorm_two_coordinate_le_vector {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (i : Fin d) (N : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i) ≤ + cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F := by + have hsum_le : + (∑ j ∈ Finset.range (N + 1), + (cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j) ^ 2) ≤ + ∑ j ∈ Finset.range (N + 1), + (cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro j _hj + have hdepth := cubeBesovOverlapDepthSeminorm_two_coordinate_le_vector + Q s F i j hF + exact (sq_le_sq₀ + (cubeBesovOverlapDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => F x i) j) + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s F j))).2 hdepth + calc + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i) = + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j) ^ 2) := + cubeBesovOverlapPartialSeminorm_two_two_eq_sqrt_sum_sq Q s N (fun x => F x i) + _ ≤ Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := + Real.sqrt_le_sqrt hsum_le + _ = cubeBesovScaleWeight s Q * + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := + sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) (cubeBesovScaleWeight s Q) + (fun j => cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) + (cubeBesovScaleWeight_nonneg s Q) + _ = cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F := by + rfl + +/-- After inserting the root-scale factor, the corrected vector finite truncation is bounded by +the sum of the scalar coordinate finite truncations. This is uniform in the truncation depth. -/ +theorem scaleWeight_mul_vectorPartialSeminorm_le_sum_coordinates {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (N : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F ≤ + ∑ i : Fin d, + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i) := by + let A : ℕ → Fin d → ℝ := fun j i => + cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) (fun x => F x i) j + let W : ℝ := cubeBesovScaleWeight s Q + have hA_nonneg : + ∀ j ∈ Finset.range (N + 1), ∀ i ∈ (Finset.univ : Finset (Fin d)), + 0 ≤ A j i := by + intro j _hj i _hi + exact cubeBesovOverlapDepthSeminorm_nonneg Q s (2 : ℝ≥0∞) (fun x => F x i) j + have hdepth : + ∀ j ∈ Finset.range (N + 1), + W * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j ≤ + ∑ i : Fin d, A j i := by + intro j _hj + exact scaleWeight_mul_vectorDepthSeminorm_le_sum_coordinates Q s F j hF + have hsum_le : + ∑ j ∈ Finset.range (N + 1), + (W * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2 ≤ + ∑ j ∈ Finset.range (N + 1), (∑ i : Fin d, A j i) ^ 2 := by + refine Finset.sum_le_sum ?_ + intro j hj + exact (sq_le_sq₀ + (mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (cubeBesovOverlappingPositiveVectorDepthSeminorm_nonneg Q s F j)) + (Finset.sum_nonneg fun i hi => hA_nonneg j hj i hi)).2 (hdepth j hj) + calc + W * cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F = + Real.sqrt + (∑ j ∈ Finset.range (N + 1), + (W * cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j) ^ 2) := by + rw [sqrt_sum_sq_const_mul_eq (Finset.range (N + 1)) W + (fun j => cubeBesovOverlappingPositiveVectorDepthSeminorm Q s F j)] + · rfl + · exact cubeBesovScaleWeight_nonneg s Q + _ ≤ Real.sqrt + (∑ j ∈ Finset.range (N + 1), (∑ i : Fin d, A j i) ^ 2) := + Real.sqrt_le_sqrt hsum_le + _ ≤ ∑ i : Fin d, + Real.sqrt (∑ j ∈ Finset.range (N + 1), (A j i) ^ 2) := + sqrt_sum_sq_sum_le_sum_sqrt_sum_sq + (Finset.range (N + 1)) Finset.univ A hA_nonneg + _ = ∑ i : Fin d, + cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i) := by + refine Finset.sum_congr rfl ?_ + intro i _hi + exact (cubeBesovOverlapPartialSeminorm_two_two_eq_sqrt_sum_sq + Q s N (fun x => F x i)).symm + +/-- The Euclidean aggregate of the scalar coordinate finite truncations is controlled by the +corrected vector truncation with the explicit factor `sqrt d`. -/ +theorem sqrt_sum_sq_coordinatePartialSeminorm_le_sqrt_dim_mul_vector {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (F : Vec d → Vec d) (N : ℕ) + (hF : MeasureTheory.MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Real.sqrt + (∑ i : Fin d, + (cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i)) ^ 2) ≤ + Real.sqrt (d : ℝ) * + (cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F) := by + let B : ℝ := cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F + have hB_nonneg : 0 ≤ B := + mul_nonneg (cubeBesovScaleWeight_nonneg s Q) + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg Q s N F) + have hsum_le : + (∑ i : Fin d, + (cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i)) ^ 2) ≤ + (d : ℝ) * B ^ 2 := by + calc + (∑ i : Fin d, + (cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i)) ^ 2) ≤ + ∑ _i : Fin d, B ^ 2 := by + refine Finset.sum_le_sum ?_ + intro i _hi + exact (sq_le_sq₀ + (cubeBesovOverlapPartialSeminorm_nonneg Q s (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N (fun x => F x i)) hB_nonneg).2 + (cubeBesovOverlapPartialSeminorm_two_coordinate_le_vector Q s F i N hF) + _ = (d : ℝ) * B ^ 2 := by + simp + calc + Real.sqrt + (∑ i : Fin d, + (cubeBesovOverlapPartialSeminorm Q s (2 : ℝ≥0∞) (2 : ℝ≥0∞) N + (fun x => F x i)) ^ 2) ≤ + Real.sqrt ((d : ℝ) * B ^ 2) := + Real.sqrt_le_sqrt hsum_le + _ = Real.sqrt (d : ℝ) * Real.sqrt (B ^ 2) := by + rw [Real.sqrt_mul (Nat.cast_nonneg d)] + _ = Real.sqrt (d : ℝ) * B := by + rw [Real.sqrt_sq_eq_abs, abs_of_nonneg hB_nonneg] + _ = Real.sqrt (d : ℝ) * + (cubeBesovScaleWeight s Q * + cubeBesovOverlappingPositiveVectorPartialSeminormTwo Q s N F) := by + rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapGagliardoBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapGagliardoBridge.lean new file mode 100644 index 0000000000..0d39a8601c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/OverlapGagliardoBridge.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapCoordinateBridge + +/-! +# Extended overlap-Besov and coordinate Gagliardo energies + +This module compares the corrected vector overlap-Besov truncations on the centered unit cube +with the finite family of scalar coordinate Gagliardo energies. The overlap energy is defined in +`ℝ≥0∞` as the supremum of the finite squared truncations; in particular, it never passes through +the legacy real-valued `sSup` seminorm. + +The positive-dimensional comparison lemmas below are proof-internal producers. Their explicit +measurability, `MemLp`, and `[NeZero d]` hypotheses are intended to be discharged later by the +measurable-representative and zero-dimensional wrappers, rather than exposed in the final +source-facing theorem. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal +open MeasureTheory + +noncomputable section + +/-- The extended corrected-vector overlap-Besov energy on the centered unit cube. -/ +noncomputable def extendedVectorOverlapBesovEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ⨆ N : ℕ, ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) + +/-- The explicit dimension factor in the overlap-to-Gagliardo estimate is finite. -/ +theorem overlapBesovEnergy_gagliardoConstant_lt_top (d : ℕ) : + ((d : ℝ≥0∞) * (2 * 3 ^ d)) < ∞ := by + exact lt_top_iff_ne_top.2 (by finiteness) + +/-- The explicit dimension factor in the Gagliardo-to-overlap estimate is finite. -/ +theorem coordinateGagliardoEnergy_overlapBesovConstant_lt_top (d : ℕ) : + ((d : ℝ≥0∞) * + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ)) < ∞ := by + exact lt_top_iff_ne_top.2 (by + apply ENNReal.mul_ne_top + · finiteness + · apply ENNReal.rpow_ne_top_of_nonneg (by norm_num) + rw [Gagliardo.gagliardoBesovLowerConstant] + exact ENNReal.mul_ne_top + (ENNReal.pow_ne_top (by norm_num)) (ENNReal.pow_ne_top (by norm_num))) + +/-- The root-scale correction is exactly one on the centered unit cube. -/ +@[simp] theorem cubeBesovScaleWeight_originCube_zero {d : ℕ} (s : ℝ) : + cubeBesovScaleWeight s (originCube d 0) = 1 := by + simp [cubeBesovScaleWeight] + +/-- Every squared finite truncation is bounded by the extended overlap-Besov energy. -/ +theorem ofReal_sq_vectorPartialSeminorm_le_extendedVectorOverlapBesovEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) : + ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) ≤ + extendedVectorOverlapBesovEnergy s F := by + exact le_iSup (fun M : ℕ => ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 M F) ^ 2)) N + +/-- The extended corrected-vector overlap energy vanishes in dimension zero. -/ +theorem extendedVectorOverlapBesovEnergy_zero_dim + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field 0) : + extendedVectorOverlapBesovEnergy s F = 0 := by + have hFzero : (F : Vec 0 → Vec 0) = 0 := by + funext x + exact Subsingleton.elim (F x) 0 + apply le_antisymm + · refine iSup_le fun N => ?_ + rw [hFzero] + simp [cubeBesovOverlappingPositiveVectorPartialSeminormTwo, + cubeBesovOverlappingPositiveVectorDepthSeminorm, + cubeBesovOverlappingPositiveVectorDepthAverage, overlapCentersAverage, + overlapCubeLpNorm] + · exact bot_le + +private theorem iSup_scalarPartialSeminorm_le_extendedVectorOverlapBesovEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (i : Fin d) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0))) : + (⨆ N : ℕ, ENNReal.ofReal + ((cubeBesovOverlapPartialSeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i)) ^ 2)) ≤ + extendedVectorOverlapBesovEnergy s F := by + refine iSup_le fun N => ?_ + have hpartial : + cubeBesovOverlapPartialSeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i) ≤ + cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F := by + simpa only [cubeBesovScaleWeight_originCube_zero, one_mul] using + cubeBesovOverlapPartialSeminorm_two_coordinate_le_vector + (originCube d 0) s.1 F i N hF + have hsquare : + (cubeBesovOverlapPartialSeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i)) ^ 2 ≤ + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2 := + (sq_le_sq₀ + (cubeBesovOverlapPartialSeminorm_nonneg (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i)) + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg + (originCube d 0) s.1 N F)).2 hpartial + exact (ENNReal.ofReal_le_ofReal hsquare).trans + (ofReal_sq_vectorPartialSeminorm_le_extendedVectorOverlapBesovEnergy s F N) + +/-- Proof-internal positive-dimensional producer: the coordinate Gagliardo energy is bounded +by the extended corrected-vector overlap energy. -/ +theorem coordinateGagliardoEnergy_le_mul_extendedVectorOverlapBesovEnergy {d : ℕ} + [NeZero d] (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (hFmeas : Measurable F) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0))) : + coordinateGagliardoEnergy s F ≤ + ((d : ℝ≥0∞) * (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ)) * + extendedVectorOverlapBesovEnergy s F := by + rw [coordinateGagliardoEnergy] + calc + (∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (fun x => F x i)) ^ (2 : ℝ)) ≤ + ∑ _i : Fin d, + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + extendedVectorOverlapBesovEnergy s F := by + refine Finset.sum_le_sum ?_ + intro i _hi + have hscalar : + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (fun x => F x i)) ^ (2 : ℝ) ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + ⨆ N : ℕ, ENNReal.ofReal + ((cubeBesovOverlapPartialSeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i)) ^ 2) := by + simpa only [ENNReal.toReal_ofNat, Real.rpow_two] using! + Gagliardo.gagliardo_rpow_le_iSup_partialSeminorm + (originCube d 0) s.2.1.le s.2.2.le (p := (2 : ℝ≥0∞)) + (by norm_num) (by norm_num) + ((measurable_pi_apply i).comp hFmeas) (hF.eval i) + exact hscalar.trans (mul_le_mul_right + (iSup_scalarPartialSeminorm_le_extendedVectorOverlapBesovEnergy s F i hF) + ((Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ))) + _ = ((d : ℝ≥0∞) * (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ)) * + extendedVectorOverlapBesovEnergy s F := by + simp [mul_assoc] + +private theorem ofReal_sq_vectorPartialSeminorm_le_mul_coordinateGagliardoEnergy {d : ℕ} + [NeZero d] (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (N : ℕ) + (hFmeas : Measurable F) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0))) : + ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) ≤ + ((d : ℝ≥0∞) * (2 * 3 ^ d)) * coordinateGagliardoEnergy s F := by + let P : Fin d → ℝ := fun i => + cubeBesovOverlapPartialSeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i) + have hP_nonneg : ∀ i : Fin d, 0 ≤ P i := fun i => + cubeBesovOverlapPartialSeminorm_nonneg (originCube d 0) s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N (fun x => F x i) + have hvector_le : + cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F ≤ + ∑ i : Fin d, P i := by + simpa only [cubeBesovScaleWeight_originCube_zero, one_mul] using + scaleWeight_mul_vectorPartialSeminorm_le_sum_coordinates + (originCube d 0) s.1 F N hF + have hsquare_le : + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2 ≤ + (d : ℝ) * ∑ i : Fin d, (P i) ^ 2 := by + calc + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2 ≤ + (∑ i : Fin d, P i) ^ 2 := + (sq_le_sq₀ + (cubeBesovOverlappingPositiveVectorPartialSeminormTwo_nonneg + (originCube d 0) s.1 N F) + (Finset.sum_nonneg fun i _hi => hP_nonneg i)).2 hvector_le + _ ≤ (d : ℝ) * ∑ i : Fin d, (P i) ^ 2 := by + simpa using + (sq_sum_le_card_mul_sum_sq + (s := (Finset.univ : Finset (Fin d))) (f := P)) + have hscalar : ∀ i : Fin d, + ENNReal.ofReal ((P i) ^ 2) ≤ + 2 * 3 ^ d * + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (fun x => F x i)) ^ (2 : ℝ) := by + intro i + simpa only [P, ENNReal.toReal_ofNat, Real.rpow_two] using! + Gagliardo.ofReal_partialSeminorm_rpow_le_gagliardo + (originCube d 0) s.2.1.le (p := (2 : ℝ≥0∞)) + (by norm_num) (by norm_num) + ((measurable_pi_apply i).comp hFmeas) (hF.eval i) N + calc + ENNReal.ofReal + ((cubeBesovOverlappingPositiveVectorPartialSeminormTwo + (originCube d 0) s.1 N F) ^ 2) ≤ + ENNReal.ofReal ((d : ℝ) * ∑ i : Fin d, (P i) ^ 2) := + ENNReal.ofReal_le_ofReal hsquare_le + _ = (d : ℝ≥0∞) * ∑ i : Fin d, ENNReal.ofReal ((P i) ^ 2) := by + rw [ENNReal.ofReal_mul (Nat.cast_nonneg d), + ENNReal.ofReal_sum_of_nonneg (fun i _hi => sq_nonneg (P i))] + simp + _ ≤ (d : ℝ≥0∞) * ∑ i : Fin d, + 2 * 3 ^ d * + (Gagliardo.cubeGagliardoESeminorm (originCube d 0) s.1 + (2 : ℝ≥0∞) (fun x => F x i)) ^ (2 : ℝ) := by + exact mul_le_mul_right (Finset.sum_le_sum fun i _hi => hscalar i) _ + _ = ((d : ℝ≥0∞) * (2 * 3 ^ d)) * coordinateGagliardoEnergy s F := by + rw [coordinateGagliardoEnergy, ← Finset.mul_sum] + ac_rfl + +/-- Proof-internal positive-dimensional producer: the extended corrected-vector overlap energy +is bounded by the coordinate Gagliardo energy. -/ +theorem extendedVectorOverlapBesovEnergy_le_mul_coordinateGagliardoEnergy {d : ℕ} + [NeZero d] (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) + (hFmeas : Measurable F) + (hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0))) : + extendedVectorOverlapBesovEnergy s F ≤ + ((d : ℝ≥0∞) * (2 * 3 ^ d)) * coordinateGagliardoEnergy s F := by + refine iSup_le fun N => ?_ + exact ofReal_sq_vectorPartialSeminorm_le_mul_coordinateGagliardoEnergy + s F N hFmeas hF + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/PositiveDimensionalComposition.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/PositiveDimensionalComposition.lean new file mode 100644 index 0000000000..0e631fbb5e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/PositiveDimensionalComposition.lean @@ -0,0 +1,164 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuousDiscreteKSeriesBridge + +/-! +# Positive-dimensional composition of exact finite-energy bridges + +This module composes the finite-energy arrows in the positive-dimensional, +measurable-representative lane. It does not introduce a source-facing full +norm comparison. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem UnitCubeEuclideanL2Field.memLp_originCube_normalizedCubeMeasure + {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := by + rw [normalizedCubeMeasure_originCube_zero_eq_unitCenteredCubeDomain_normalizedVolume] + apply MemLp.of_eval + intro i + have hF := F.euclideanMemL2 + rw [memLp_piLp_iff] at hF + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF i + +/-- The finite constant for the sample-energy to Euclidean-energy direction, +apart from the continuous/discrete series bridge factor. -/ +noncomputable def positiveDimensionalDiscreteToHsTailConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) * + ((d : ℝ≥0∞) * (2 * 3 ^ d)) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) + +/-- The finite constant for the Euclidean-energy to discrete-energy direction, +apart from the continuous/discrete series bridge factor. -/ +noncomputable def positiveDimensionalHsToDiscreteTailConstant + (d : ℕ) : ℝ≥0∞ := + ((d : ℝ≥0∞) * (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ)) * + ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) + +theorem positiveDimensionalDiscreteToHsTailConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + positiveDimensionalDiscreteToHsTailConstant s d < ∞ := by + unfold positiveDimensionalDiscreteToHsTailConstant + apply ENNReal.mul_lt_top + · apply ENNReal.mul_lt_top + · exact ENNReal.ofReal_lt_top + · exact overlapBesovEnergy_gagliardoConstant_lt_top d + · exact coordinateGagliardoEnergy_euclideanHsConstant_lt_top d s + +theorem positiveDimensionalHsToDiscreteTailConstant_lt_top (d : ℕ) : + positiveDimensionalHsToDiscreteTailConstant d < ∞ := by + unfold positiveDimensionalHsToDiscreteTailConstant + exact ENNReal.mul_lt_top + (coordinateGagliardoEnergy_overlapBesovConstant_lt_top d) + ENNReal.ofReal_lt_top + +/-- The full finite sample-energy to Euclidean-energy composition constant. -/ +noncomputable def positiveDimensionalSampleToHsConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) * + positiveDimensionalDiscreteToHsTailConstant s d + +/-- The full finite Euclidean-energy to sample-energy composition constant. -/ +noncomputable def positiveDimensionalHsToSampleConstant + (d : ℕ) : ℝ≥0∞ := + positiveDimensionalHsToDiscreteTailConstant d * + ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) + +theorem positiveDimensionalSampleToHsConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + positiveDimensionalSampleToHsConstant s d < ∞ := by + unfold positiveDimensionalSampleToHsConstant + exact ENNReal.mul_lt_top ENNReal.ofReal_lt_top + (positiveDimensionalDiscreteToHsTailConstant_lt_top s d) + +theorem positiveDimensionalHsToSampleConstant_lt_top (d : ℕ) : + positiveDimensionalHsToSampleConstant d < ∞ := by + unfold positiveDimensionalHsToSampleConstant + exact ENNReal.mul_lt_top (positiveDimensionalHsToDiscreteTailConstant_lt_top d) + ENNReal.ofReal_lt_top + +/-- In positive dimension, the exact sampled continuous K-energy controls the +exact Euclidean `H^s` energy through the four finite bridge layers. -/ +theorem euclideanHsEnergy_le_mul_triadicContinuousKSampleEnergy + {d : ℕ} [NeZero d] (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) (hFmeas : Measurable F) : + euclideanHsEnergy s F ≤ + positiveDimensionalHsToSampleConstant d * + triadicContinuousKSampleEnergy s F := by + let CK : ℝ≥0∞ := ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) + let COG : ℝ≥0∞ := + (d : ℝ≥0∞) * (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) + let COD : ℝ≥0∞ := ENNReal.ofReal (overlapDiscreteKConstant d ^ 2) + have hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := + F.memLp_originCube_normalizedCubeMeasure + calc + euclideanHsEnergy s F ≤ coordinateGagliardoEnergy s F := + euclideanHsEnergy_le_coordinateGagliardoEnergy s F hFmeas + _ ≤ COG * extendedVectorOverlapBesovEnergy s F := by + simpa only [COG] using + coordinateGagliardoEnergy_le_mul_extendedVectorOverlapBesovEnergy s F hFmeas hF + _ ≤ COG * (COD * extendedDiscreteKFunctionalEnergy s F) := + mul_le_mul_right + (extendedVectorOverlapBesovEnergy_le_mul_extendedDiscreteKFunctionalEnergy s F) COG + _ ≤ COG * (COD * (CK * triadicContinuousKSampleEnergy s F)) := + mul_le_mul_right + (mul_le_mul_right + (extendedDiscreteKFunctionalEnergy_le_mul_triadicContinuousKSampleEnergy s F) COD) COG + _ = positiveDimensionalHsToSampleConstant d * + triadicContinuousKSampleEnergy s F := by + dsimp [positiveDimensionalHsToSampleConstant, + positiveDimensionalHsToDiscreteTailConstant, CK, COG, COD] + ring + +/-- In positive dimension, the exact Euclidean `H^s` energy controls the +exact sampled continuous K-energy through the same finite bridge layers. -/ +theorem triadicContinuousKSampleEnergy_le_mul_euclideanHsEnergy + {d : ℕ} [NeZero d] (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) (hFmeas : Measurable F) : + triadicContinuousKSampleEnergy s F ≤ + positiveDimensionalSampleToHsConstant s d * euclideanHsEnergy s F := by + let CK : ℝ≥0∞ := ENNReal.ofReal (continuousDiscreteKBridgeConstant d ^ 2) + let CD : ℝ≥0∞ := ENNReal.ofReal (discreteKOverlapAveragingConstant d ^ 2) + let CO : ℝ≥0∞ := (d : ℝ≥0∞) * (2 * 3 ^ d) + let CG : ℝ≥0∞ := ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) + have hF : MemLp F (2 : ℝ≥0∞) (normalizedCubeMeasure (originCube d 0)) := + F.memLp_originCube_normalizedCubeMeasure + calc + triadicContinuousKSampleEnergy s F ≤ CK * extendedDiscreteKFunctionalEnergy s F := by + simpa only [CK] using + triadicContinuousKSampleEnergy_le_mul_extendedDiscreteKFunctionalEnergy s F + _ ≤ CK * (CD * extendedVectorOverlapBesovEnergy s F) := + mul_le_mul_right + (extendedDiscreteKFunctionalEnergy_le_mul_extendedVectorOverlapBesovEnergy s F) CK + _ ≤ CK * (CD * (CO * coordinateGagliardoEnergy s F)) := + mul_le_mul_right + (mul_le_mul_right + (extendedVectorOverlapBesovEnergy_le_mul_coordinateGagliardoEnergy s F hFmeas hF) CD) CK + _ ≤ CK * (CD * (CO * (CG * euclideanHsEnergy s F))) := by + exact mul_le_mul_right + (mul_le_mul_right + (mul_le_mul_right + (coordinateGagliardoEnergy_le_mul_euclideanHsEnergy s F hFmeas) CO) CD) CK + _ = positiveDimensionalSampleToHsConstant s d * euclideanHsEnergy s F := by + dsimp [positiveDimensionalSampleToHsConstant, + positiveDimensionalDiscreteToHsTailConstant, CK, CD, CO, CG] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/RootScaleControl.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/RootScaleControl.lean new file mode 100644 index 0000000000..4a9c2718ca --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/RootScaleControl.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicSeries + +/-! +# Root-scale control for the sampled continuous K energy + +The continuum scale integral omits the endpoint `t = 1`. This module controls that missing +triadic sample directly with the zero `H¹` competitor and separates it exactly from the shifted +sampled energy. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem continuousKGradientNorm_default_eq_zero {d : ℕ} : + continuousKGradientNorm (default : ContinuousKCompetitor d) = 0 := by + unfold continuousKGradientNorm + calc + (unitCenteredCubeDomain d).normalizedLpNorm (2 : ℝ≥0∞) + (fun x => matrixFrobeniusMagnitude + ((default : ContinuousKCompetitor d).gradient x)) + (default : ContinuousKCompetitor d).gradientFrobeniusMemL2 = + (unitCenteredCubeDomain d).normalizedLpNorm (2 : ℝ≥0∞) + (fun _ => (0 : ℝ)) MeasureTheory.MemLp.zero' := by + apply BoundedMeasurableDomain.normalizedLpNorm_congr_ae + filter_upwards [] with x + rw [show (default : ContinuousKCompetitor d).gradient x = 0 by + ext i j + rfl] + exact matrixFrobeniusMagnitude_zero + _ = 0 := by + unfold BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + simp [MeasureTheory.eLpNorm'_eq_lintegral_enorm] + +private theorem ofReal_continuousKResidualNorm_default_eq_normalizedEuclideanLpENorm + {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + ENNReal.ofReal + (continuousKResidualNorm F (default : ContinuousKCompetitor d)) = + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F := by + have hresidual : + (fun x => euclideanNorm (F x - (default : ContinuousKCompetitor d).toField x)) = + fun x => euclideanNorm (F x) := by + funext x + rw [show (default : ContinuousKCompetitor d).toField x = 0 by + ext i + rfl] + exact congrArg euclideanNorm (sub_zero (F x)) + unfold continuousKResidualNorm BoundedMeasurableDomain.normalizedEuclideanLpNorm + BoundedMeasurableDomain.normalizedEuclideanLpENorm + BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + simp only [show (2 : ℝ≥0∞) ≠ 0 by norm_num, + show (2 : ℝ≥0∞) ≠ ∞ by norm_num, if_false, ENNReal.toReal_ofNat] + change ENNReal.ofReal + (MeasureTheory.eLpNorm' + (fun x => euclideanNorm (F x - (default : ContinuousKCompetitor d).toField x)) + 2 (unitCenteredCubeDomain d).normalizedVolume).toReal = _ + rw [hresidual] + have hfinite : MeasureTheory.eLpNorm' (fun x => euclideanNorm (F x)) + 2 (unitCenteredCubeDomain d).normalizedVolume ≠ ∞ := by + have h := F.euclideanMagnitudeMemL2.eLpNorm_ne_top + rw [MeasureTheory.eLpNorm_eq_eLpNorm' (by norm_num) (by norm_num) + F.euclideanMagnitudeMemL2.aestronglyMeasurable] at h + exact h + exact ENNReal.ofReal_toReal hfinite + +private theorem continuousKFunctional_le_residualNorm_default {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + continuousKFunctional t F ≤ + continuousKResidualNorm F (default : ContinuousKCompetitor d) := by + calc + continuousKFunctional t F ≤ + continuousKFunctionalCompetitorValue t F default := + continuousKFunctional_le_competitor t F default + _ = continuousKResidualNorm F default := by + unfold continuousKFunctionalCompetitorValue + rw [continuousKGradientNorm_default_eq_zero] + simp only [zero_pow (by norm_num : 2 ≠ 0), mul_zero, add_zero, + Real.sqrt_sq_eq_abs, + abs_of_nonneg (continuousKResidualNorm_nonneg F default)] + +/-- The endpoint sample at `t = 1` is controlled by the square of the exact normalized +Euclidean extended `L²` norm. This is valid in every dimension without extra assumptions. -/ +theorem triadicContinuousKSampleTerm_zero_le_sq_normalizedEuclideanLpENorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleTerm s F 0 ≤ + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ 2 := by + have hK : + continuousKFunctional (triadicContinuousKScale 0) F ≤ + continuousKResidualNorm F (default : ContinuousKCompetitor d) := + continuousKFunctional_le_residualNorm_default (triadicContinuousKScale 0) F + have hsq : + continuousKFunctional (triadicContinuousKScale 0) F ^ 2 ≤ + continuousKResidualNorm F (default : ContinuousKCompetitor d) ^ 2 := + (sq_le_sq₀ + (continuousKFunctional_nonneg (triadicContinuousKScale 0) F) + (continuousKResidualNorm_nonneg F default)).2 hK + calc + triadicContinuousKSampleTerm s F 0 = + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale 0) F ^ 2) := by + simp [triadicContinuousKSampleTerm, triadicContinuousKScale] + _ ≤ ENNReal.ofReal + (continuousKResidualNorm F (default : ContinuousKCompetitor d) ^ 2) := + ENNReal.ofReal_le_ofReal hsq + _ = ENNReal.ofReal + (continuousKResidualNorm F (default : ContinuousKCompetitor d)) ^ 2 := by + rw [ENNReal.ofReal_pow (continuousKResidualNorm_nonneg F default)] + _ = ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm + (2 : ℝ≥0∞) F) ^ 2 := by + rw [ofReal_continuousKResidualNorm_default_eq_normalizedEuclideanLpENorm] + +/-- The sampled energy is exactly its root sample plus the shifted sampled energy. -/ +theorem triadicContinuousKSampleEnergy_eq_root_add_shifted {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F = + triadicContinuousKSampleTerm s F 0 + + triadicContinuousKShiftedSampleEnergy s F := by + unfold triadicContinuousKSampleEnergy triadicContinuousKShiftedSampleEnergy + exact tsum_eq_zero_add' ENNReal.summable + +/-- The full sampled energy is bounded by the normalized Euclidean `L²` square plus the shifted +sampled energy. -/ +theorem triadicContinuousKSampleEnergy_le_sq_normalizedEuclideanLpENorm_add_shifted {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKSampleEnergy s F ≤ + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ 2 + + triadicContinuousKShiftedSampleEnergy s F := by + rw [triadicContinuousKSampleEnergy_eq_root_add_shifted] + exact add_le_add + (triadicContinuousKSampleTerm_zero_le_sq_normalizedEuclideanLpENorm s F) le_rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/SeminormComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/SeminormComparison.lean new file mode 100644 index 0000000000..cea8c54246 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/SeminormComparison.lean @@ -0,0 +1,210 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.MeanInequalitiesPow +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.AllDimensionalComposition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.ContinuumSampleClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanHsMeasurability + +/-! +# Convention-neutral comparison of continuous interpolation seminorms + +This module takes half-powers of the all-dimensional energy comparisons. It keeps the +directional seminorm bounds separate for use by the approved source-facing full norm. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +private theorem rpow_half_mul_sq_add_mul_le (A B C D : ℝ≥0∞) : + (A * (B ^ 2 + C * D)) ^ (1 / 2 : ℝ) ≤ + (A ^ (1 / 2 : ℝ) * max 1 (C ^ (1 / 2 : ℝ))) * + (B + D ^ (1 / 2 : ℝ)) := by + have hB : (B ^ 2) ^ (1 / 2 : ℝ) = B := by + simpa only [one_div] using! + ENNReal.pow_rpow_inv_natCast (n := 2) (by norm_num) B + have hCD : + (C * D) ^ (1 / 2 : ℝ) = C ^ (1 / 2 : ℝ) * D ^ (1 / 2 : ℝ) := + ENNReal.mul_rpow_of_nonneg _ _ (by norm_num) + calc + (A * (B ^ 2 + C * D)) ^ (1 / 2 : ℝ) = + A ^ (1 / 2 : ℝ) * (B ^ 2 + C * D) ^ (1 / 2 : ℝ) := by + rw [ENNReal.mul_rpow_of_nonneg] + norm_num + _ ≤ A ^ (1 / 2 : ℝ) * + ((B ^ 2) ^ (1 / 2 : ℝ) + (C * D) ^ (1 / 2 : ℝ)) := by + exact mul_le_mul_right + (ENNReal.rpow_add_le_add_rpow _ _ (by norm_num) (by norm_num)) _ + _ = A ^ (1 / 2 : ℝ) * + (B + C ^ (1 / 2 : ℝ) * D ^ (1 / 2 : ℝ)) := by + rw [hB, hCD] + _ ≤ A ^ (1 / 2 : ℝ) * + (max 1 (C ^ (1 / 2 : ℝ)) * B + + max 1 (C ^ (1 / 2 : ℝ)) * D ^ (1 / 2 : ℝ)) := by + apply mul_le_mul_right + exact add_le_add + (by simpa only [one_mul] using + mul_le_mul_left (le_max_left 1 (C ^ (1 / 2 : ℝ))) B) + (mul_le_mul_left (le_max_right 1 (C ^ (1 / 2 : ℝ))) + (D ^ (1 / 2 : ℝ))) + _ = (A ^ (1 / 2 : ℝ) * max 1 (C ^ (1 / 2 : ℝ))) * + (B + D ^ (1 / 2 : ℝ)) := by + ring + +private theorem triadicContinuousKUpperSeriesConstant_lt_top (s : FractionalOrder) : + triadicContinuousKUpperSeriesConstant s < ∞ := by + unfold triadicContinuousKUpperSeriesConstant + exact ENNReal.mul_lt_top ENNReal.ofReal_lt_top ENNReal.ofReal_lt_top + +private theorem normalizedEuclideanLpENorm_lt_top {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F < ∞ := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm] using + F.euclideanMagnitudeMemL2.eLpNorm_lt_top + +/-- The finite constant in the continuous `K`-seminorm to Euclidean `H^s`-seminorm +direction. -/ +noncomputable def continuousKToEuclideanHsSeminormConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + (triadicContinuousKUpperSeriesConstant s * + allDimensionalSampleToHsConstant s d) ^ (1 / 2 : ℝ) + +/-- The continuous `K`-to-Euclidean-`H^s` seminorm constant is finite. -/ +theorem continuousKToEuclideanHsSeminormConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + continuousKToEuclideanHsSeminormConstant s d < ∞ := by + unfold continuousKToEuclideanHsSeminormConstant + exact ENNReal.rpow_lt_top_of_nonneg (by norm_num) + (ENNReal.mul_lt_top + (triadicContinuousKUpperSeriesConstant_lt_top s) + (allDimensionalSampleToHsConstant_lt_top s d)).ne + +/-- The finite constant in the Euclidean `H^s`-seminorm to continuous `K`-seminorm +direction, including the normalized `L²` root-scale term. -/ +noncomputable def euclideanHsToContinuousKSeminormConstant + (s : FractionalOrder) (d : ℕ) : ℝ≥0∞ := + (allDimensionalHsToSampleConstant d) ^ (1 / 2 : ℝ) * + max 1 ((triadicContinuousKLowerSeriesConstant s)⁻¹ ^ (1 / 2 : ℝ)) + +/-- The Euclidean-`H^s`-to-continuous-`K` seminorm constant is finite. -/ +theorem euclideanHsToContinuousKSeminormConstant_lt_top + (s : FractionalOrder) (d : ℕ) : + euclideanHsToContinuousKSeminormConstant s d < ∞ := by + unfold euclideanHsToContinuousKSeminormConstant + apply ENNReal.mul_lt_top + · exact ENNReal.rpow_lt_top_of_nonneg (by norm_num) + (allDimensionalHsToSampleConstant_lt_top d).ne + · rw [max_lt_iff] + exact ⟨ENNReal.one_lt_top, + ENNReal.rpow_lt_top_of_nonneg (by norm_num) + (triadicContinuousKLowerSeriesConstant_inv_ne_top s)⟩ + +/-- In every dimension, the exact Euclidean fractional seminorm controls the continuous +`K`-seminorm through an explicit finite constant. -/ +theorem continuousKSeminorm_le_mul_euclideanHsESeminorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F ≤ + continuousKToEuclideanHsSeminormConstant s d * euclideanHsESeminorm s F := by + calc + continuousKSeminorm s F ≤ + (triadicContinuousKUpperSeriesConstant s * + triadicContinuousKSampleEnergy s F) ^ (1 / 2 : ℝ) := + triadicContinuousKUpperSeriesComparison_rpow s F + _ ≤ (triadicContinuousKUpperSeriesConstant s * + (allDimensionalSampleToHsConstant s d * euclideanHsEnergy s F)) ^ + (1 / 2 : ℝ) := by + apply ENNReal.rpow_le_rpow _ (by norm_num) + exact mul_le_mul_right + (triadicContinuousKSampleEnergy_le_mul_euclideanHsEnergy_all_dim s F) _ + _ = continuousKToEuclideanHsSeminormConstant s d * + euclideanHsESeminorm s F := by + unfold continuousKToEuclideanHsSeminormConstant euclideanHsESeminorm + rw [← mul_assoc, + ENNReal.mul_rpow_of_nonneg _ _ (by norm_num : 0 ≤ (1 / 2 : ℝ))] + norm_num + +/-- In every dimension, the continuous `K`-seminorm and normalized Euclidean `L²` norm +control the exact Euclidean fractional seminorm through an explicit finite constant. -/ +theorem euclideanHsESeminorm_le_mul_normalizedEuclideanLpENorm_add_continuousKSeminorm + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + euclideanHsESeminorm s F ≤ + euclideanHsToContinuousKSeminormConstant s d * + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + continuousKSeminorm s F) := by + let L : ℝ≥0∞ := + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + let I : ℝ≥0∞ := ∫⁻ t in Set.Ioo (0 : ℝ) 1, + continuousKSeminormIntegrand s.1 F t + let A : ℝ≥0∞ := allDimensionalHsToSampleConstant d + let C : ℝ≥0∞ := (triadicContinuousKLowerSeriesConstant s)⁻¹ + calc + euclideanHsESeminorm s F = euclideanHsEnergy s F ^ (1 / 2 : ℝ) := by + unfold euclideanHsESeminorm + norm_num + _ ≤ (A * triadicContinuousKSampleEnergy s F) ^ (1 / 2 : ℝ) := by + apply ENNReal.rpow_le_rpow _ (by norm_num) + simpa only [A] using + euclideanHsEnergy_le_mul_triadicContinuousKSampleEnergy_all_dim s F + _ ≤ (A * (L ^ 2 + C * I)) ^ (1 / 2 : ℝ) := by + apply ENNReal.rpow_le_rpow _ (by norm_num) + apply mul_le_mul_right + calc + triadicContinuousKSampleEnergy s F ≤ L ^ 2 + + triadicContinuousKShiftedSampleEnergy s F := by + simpa only [L] using + triadicContinuousKSampleEnergy_le_sq_normalizedEuclideanLpENorm_add_shifted + s F + _ ≤ L ^ 2 + C * I := by + apply add_le_add_right + simpa only [C, I] using + triadicContinuousKShiftedSampleEnergy_le_lowerSeriesConstant_inv_mul_continuumEnergy + s F + _ ≤ (A ^ (1 / 2 : ℝ) * max 1 (C ^ (1 / 2 : ℝ))) * + (L + I ^ (1 / 2 : ℝ)) := + rpow_half_mul_sq_add_mul_le A L C I + _ = euclideanHsToContinuousKSeminormConstant s d * + ((unitCenteredCubeDomain d).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + + continuousKSeminorm s F) := by + rfl + +/-- The exact Euclidean fractional seminorm is finite exactly when the continuous +`K`-seminorm is finite. -/ +theorem continuousKSeminorm_lt_top_iff_euclideanHsESeminorm_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F < ∞ ↔ euclideanHsESeminorm s F < ∞ := by + constructor + · intro hK + exact lt_of_le_of_lt + (euclideanHsESeminorm_le_mul_normalizedEuclideanLpENorm_add_continuousKSeminorm + s F) + (ENNReal.mul_lt_top + (euclideanHsToContinuousKSeminormConstant_lt_top s d) + (ENNReal.add_lt_top.2 ⟨normalizedEuclideanLpENorm_lt_top F, hK⟩)) + · intro hHs + exact lt_of_le_of_lt + (continuousKSeminorm_le_mul_euclideanHsESeminorm s F) + (ENNReal.mul_lt_top + (continuousKToEuclideanHsSeminormConstant_lt_top s d) hHs) + +/-- Exact Euclidean fractional membership is equivalent to finiteness of the +continuous `K`-seminorm, with no measurable-representative or dimension hypothesis. -/ +theorem memEuclideanHs_iff_continuousKSeminorm_lt_top {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + MemEuclideanHs s F ↔ continuousKSeminorm s F < ∞ := by + rw [memEuclideanHs_iff_euclideanHsESeminorm_lt_top] + exact (continuousKSeminorm_lt_top_iff_euclideanHsESeminorm_lt_top s F).symm + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicScale.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicScale.lean new file mode 100644 index 0000000000..1b8062a842 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicScale.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousKFunctional + +/-! +# Triadic scale calculus for the continuous `K`-functional + +This module contains only the convention-neutral conversion between the +continuous scale variable in the exact `K`-seminorm and its canonical triadic +samples. The intervals use `(t_{j+1}, t_j] ∩ (0,1)`: this makes them disjoint +and removes the endpoint at which the open-scale representative is totalized +to zero. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal +open MeasureTheory + +noncomputable section + +/-- The canonical triadic member of the source scale carrier: `t_j = 3^{-j}`. -/ +def triadicContinuousKScale (j : ℕ) : ContinuousKScale := + ⟨((3 : ℝ)⁻¹) ^ j, by + constructor + · positivity + · exact pow_le_one₀ (by positivity) (by norm_num)⟩ + +@[simp] theorem triadicContinuousKScale_zero : triadicContinuousKScale 0 = ⟨1, by + constructor <;> norm_num⟩ := by + rfl + +theorem triadicContinuousKScale_pos (j : ℕ) : 0 < (triadicContinuousKScale j).1 := + ContinuousKScale.pos _ + +theorem triadicContinuousKScale_le_one (j : ℕ) : (triadicContinuousKScale j).1 ≤ 1 := + ContinuousKScale.le_one _ + +theorem triadicContinuousKScale_succ (j : ℕ) : + (triadicContinuousKScale (j + 1)).1 = (triadicContinuousKScale j).1 / 3 := by + simp only [triadicContinuousKScale, inv_pow, pow_succ] + ring + +theorem triadicContinuousKScale_succ_lt (j : ℕ) : + (triadicContinuousKScale (j + 1)).1 < (triadicContinuousKScale j).1 := by + rw [triadicContinuousKScale_succ] + rw [div_lt_iff₀ (by norm_num : (0 : ℝ) < 3)] + nlinarith [triadicContinuousKScale_pos j] + +theorem triadicContinuousKScale_antitone {j k : ℕ} (hjk : j ≤ k) : + (triadicContinuousKScale k).1 ≤ (triadicContinuousKScale j).1 := by + obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hjk + clear hjk + induction m with + | zero => exact le_rfl + | succ m ihm => + calc + (triadicContinuousKScale (j + (m + 1))).1 = + (triadicContinuousKScale (j + m + 1)).1 := by congr 1 + _ ≤ (triadicContinuousKScale (j + m)).1 := + (triadicContinuousKScale_succ_lt (j + m)).le + _ ≤ (triadicContinuousKScale j).1 := ihm + +/-- The disjoint scale interval associated to the sample at depth `j`. -/ +def triadicContinuousKInterval (j : ℕ) : Set ℝ := + Set.Ioc (triadicContinuousKScale (j + 1)).1 (triadicContinuousKScale j).1 ∩ + Set.Ioo (0 : ℝ) 1 + +theorem measurableSet_triadicContinuousKInterval (j : ℕ) : + MeasurableSet (triadicContinuousKInterval j) := + measurableSet_Ioc.inter measurableSet_Ioo + +theorem triadicContinuousKInterval_subset_openScale (j : ℕ) : + triadicContinuousKInterval j ⊆ Set.Ioo (0 : ℝ) 1 := by + intro t ht + exact ht.2 + +theorem mem_triadicContinuousKInterval_iff (j : ℕ) {t : ℝ} : + t ∈ triadicContinuousKInterval j ↔ + (triadicContinuousKScale (j + 1)).1 < t ∧ + t ≤ (triadicContinuousKScale j).1 ∧ 0 < t ∧ t < 1 := by + simp only [triadicContinuousKInterval, Set.mem_inter_iff, Set.mem_Ioc, Set.mem_Ioo] + constructor + · rintro ⟨⟨hlower, hupper⟩, hpos, hone⟩ + exact ⟨hlower, hupper, hpos, hone⟩ + · rintro ⟨hlower, hupper, hpos, hone⟩ + exact ⟨⟨hlower, hupper⟩, hpos, hone⟩ + +theorem triadicContinuousKInterval_pairwiseDisjoint : + Pairwise (fun j k => + Disjoint (triadicContinuousKInterval j) (triadicContinuousKInterval k)) := by + intro j k hjk + have disjoint_of_lt : ∀ {a b : ℕ}, a < b → + Disjoint (triadicContinuousKInterval a) (triadicContinuousKInterval b) := by + intro a b hab + apply Set.disjoint_left.2 + intro t hta htb + obtain ⟨hta_lower, -, -, -⟩ := (mem_triadicContinuousKInterval_iff a).1 hta + obtain ⟨-, htb_upper, -, -⟩ := (mem_triadicContinuousKInterval_iff b).1 htb + have hscale : (triadicContinuousKScale b).1 ≤ + (triadicContinuousKScale (a + 1)).1 := + triadicContinuousKScale_antitone (Nat.succ_le_iff.2 hab) + exact (not_lt_of_ge (htb_upper.trans hscale)) hta_lower + rcases lt_or_gt_of_ne hjk with hjk | hkj + · exact disjoint_of_lt hjk + · exact (disjoint_of_lt hkj).symm + +/-- The triadic intervals form a disjoint partition of the exact open scale +interval. The choice `(t_{j+1},t_j]` assigns every triadic endpoint to its +finer neighbor, while the extra intersection removes `1`. -/ +theorem iUnion_triadicContinuousKInterval : + ⋃ j : ℕ, triadicContinuousKInterval j = Set.Ioo (0 : ℝ) 1 := by + apply Set.Subset.antisymm + · exact Set.iUnion_subset fun j => triadicContinuousKInterval_subset_openScale j + · intro t ht + have hlimit : Filter.Tendsto (fun n : ℕ => ((3 : ℝ)⁻¹) ^ n) + Filter.atTop (nhds 0) := + tendsto_pow_atTop_nhds_zero_of_lt_one (by positivity) (by norm_num) + have hex : ∃ n : ℕ, ((3 : ℝ)⁻¹) ^ n < t := by + rcases (hlimit.eventually (eventually_lt_nhds ht.1)).exists with ⟨n, hn⟩ + exact ⟨n, hn⟩ + let n := Nat.find hex + have hn : ((3 : ℝ)⁻¹) ^ n < t := Nat.find_spec hex + have hn_ne_zero : n ≠ 0 := by + intro hn_zero + have : (1 : ℝ) < t := by simpa [hn_zero] using hn + exact (not_lt_of_ge ht.2.le) this + obtain ⟨j, hj⟩ := Nat.exists_eq_succ_of_ne_zero hn_ne_zero + refine Set.mem_iUnion.2 ⟨j, (mem_triadicContinuousKInterval_iff j).2 ?_⟩ + constructor + · simpa [triadicContinuousKScale, hj, Nat.succ_eq_add_one] using hn + constructor + · apply le_of_not_gt + intro hcontra + have hp : ((3 : ℝ)⁻¹) ^ j < t := by + simpa [triadicContinuousKScale] using hcontra + have hmin := Nat.find_min' hex hp + change n ≤ j at hmin + rw [hj] at hmin + omega + · exact ⟨ht.1, ht.2⟩ + +/-- On a triadic interval, the sampled `K`-functional at the lower endpoint +is bounded by the continuous value, which is bounded by the upper sample. -/ +theorem continuousKFunctional_bounds_on_triadicContinuousKInterval {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (j : ℕ) {t : ℝ} + (ht : t ∈ triadicContinuousKInterval j) : + continuousKFunctional (triadicContinuousKScale (j + 1)) F ≤ + continuousKFunctional ⟨t, ⟨ht.2.1, ht.2.2.le⟩⟩ F ∧ + continuousKFunctional ⟨t, ⟨ht.2.1, ht.2.2.le⟩⟩ F ≤ + continuousKFunctional (triadicContinuousKScale j) F := by + constructor + · exact continuousKFunctional_mono ht.1.1.le F + · exact continuousKFunctional_mono ht.1.2 F + +/-- The lower sampled square-weight used for a single triadic interval. -/ +noncomputable def triadicContinuousKLowerSampleWeight {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale (j + 1)) F ^ 2) * + ENNReal.ofReal ((triadicContinuousKScale j).1)⁻¹ + +/-- The upper sampled square-weight used for a single triadic interval. -/ +noncomputable def triadicContinuousKUpperSampleWeight {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale j) F ^ 2) * + ENNReal.ofReal ((triadicContinuousKScale (j + 1)).1)⁻¹ + +private theorem continuousKSeminormIntegrand_bounds_on_triadicContinuousKInterval {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) {t : ℝ} + (ht : t ∈ triadicContinuousKInterval j) : + triadicContinuousKLowerSampleWeight s F j ≤ continuousKSeminormIntegrand s.1 F t ∧ + continuousKSeminormIntegrand s.1 F t ≤ triadicContinuousKUpperSampleWeight s F j := by + rw [continuousKSeminormIntegrand_eq_of_mem s.1 F ht.2] + obtain ⟨hK_lower, hK_upper⟩ := + continuousKFunctional_bounds_on_triadicContinuousKInterval F j ht + have hs : 0 ≤ s.1 := s.2.1.le + have hrpow_lower : Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) ≤ + Real.rpow t (-2 * s.1) := by + exact Real.rpow_le_rpow_of_nonpos ht.2.1 ht.1.2 (by linarith) + have hrpow_upper : Real.rpow t (-2 * s.1) ≤ + Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1) := by + exact Real.rpow_le_rpow_of_nonpos (triadicContinuousKScale_pos (j + 1)) ht.1.1.le + (by linarith) + have hsq_lower : continuousKFunctional (triadicContinuousKScale (j + 1)) F ^ 2 ≤ + continuousKFunctional ⟨t, ⟨ht.2.1, ht.2.2.le⟩⟩ F ^ 2 := by + exact (sq_le_sq₀ (continuousKFunctional_nonneg _ F) + (continuousKFunctional_nonneg _ F)).2 hK_lower + have hsq_upper : continuousKFunctional ⟨t, ⟨ht.2.1, ht.2.2.le⟩⟩ F ^ 2 ≤ + continuousKFunctional (triadicContinuousKScale j) F ^ 2 := by + exact (sq_le_sq₀ (continuousKFunctional_nonneg _ F) + (continuousKFunctional_nonneg _ F)).2 hK_upper + have hinv_lower : ((triadicContinuousKScale j).1)⁻¹ ≤ t⁻¹ := by + exact (inv_le_inv₀ (triadicContinuousKScale_pos j) ht.2.1).2 ht.1.2 + have hinv_upper : t⁻¹ ≤ ((triadicContinuousKScale (j + 1)).1)⁻¹ := by + exact (inv_le_inv₀ ht.2.1 (triadicContinuousKScale_pos (j + 1))).2 ht.1.1.le + constructor + · exact mul_le_mul' (mul_le_mul' (ENNReal.ofReal_le_ofReal hrpow_lower) + (ENNReal.ofReal_le_ofReal hsq_lower)) (ENNReal.ofReal_le_ofReal hinv_lower) + · exact mul_le_mul' (mul_le_mul' (ENNReal.ofReal_le_ofReal hrpow_upper) + (ENNReal.ofReal_le_ofReal hsq_upper)) (ENNReal.ofReal_le_ofReal hinv_upper) + +/-- A two-sided comparison of one continuous weighted scale interval with its +two adjacent sampled weighted squares. It is valid in `ℝ≥0∞` with no +finiteness assumption. -/ +theorem triadicContinuousKInterval_lintegral_bounds {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : + triadicContinuousKLowerSampleWeight s F j * + volume (triadicContinuousKInterval j) ≤ + ∫⁻ t in triadicContinuousKInterval j, continuousKSeminormIntegrand s.1 F t ∧ + (∫⁻ t in triadicContinuousKInterval j, continuousKSeminormIntegrand s.1 F t) ≤ + triadicContinuousKUpperSampleWeight s F j * + volume (triadicContinuousKInterval j) := by + constructor + · rw [← setLIntegral_const] + exact setLIntegral_mono' (measurableSet_triadicContinuousKInterval j) fun t ht => + (continuousKSeminormIntegrand_bounds_on_triadicContinuousKInterval s F j ht).1 + · rw [← setLIntegral_const] + exact setLIntegral_mono' (measurableSet_triadicContinuousKInterval j) fun t ht => + (continuousKSeminormIntegrand_bounds_on_triadicContinuousKInterval s F j ht).2 + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicSeries.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicSeries.lean new file mode 100644 index 0000000000..acb8fb90d6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/TriadicSeries.lean @@ -0,0 +1,239 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.TriadicScale + +/-! +# Triadic sample series for the continuous `K`-energy + +This module assembles the disjoint triadic scale intervals into an `ENNReal` +series. The lower comparison is deliberately indexed from `j + 1`: the +continuous scale integral alone cannot recover the endpoint sample at `t = 1`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal +open MeasureTheory + +noncomputable section + +/-- The canonical weighted triadic sample at `t_j = 3^{-j}`. -/ +noncomputable def triadicContinuousKSampleTerm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : ℝ≥0∞ := + ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale j) F ^ 2) + +/-- The canonical `ENNReal` triadic sampled energy. Its weights are the +scale form of `3^(2 s j) K(3^{-j},F)^2`. -/ +noncomputable def triadicContinuousKSampleEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ∑' j : ℕ, triadicContinuousKSampleTerm s F j + +/-- The shifted sampled energy, excluding only the endpoint sample at `t=1`. -/ +noncomputable def triadicContinuousKShiftedSampleEnergy {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ∑' j : ℕ, triadicContinuousKSampleTerm s F (j + 1) + +/-- The explicit lower comparison constant for base-three intervals. -/ +noncomputable def triadicContinuousKLowerSeriesConstant (s : FractionalOrder) : ℝ≥0∞ := + ENNReal.ofReal ((2 : ℝ) / 3) * ENNReal.ofReal (Real.rpow 3 (-2 * s.1)) + +/-- The explicit upper comparison constant for base-three intervals. -/ +noncomputable def triadicContinuousKUpperSeriesConstant (s : FractionalOrder) : ℝ≥0∞ := + ENNReal.ofReal 2 * ENNReal.ofReal (Real.rpow 3 (2 * s.1)) + +theorem continuousKSeminorm_lintegral_eq_tsum_triadicIntervals {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t = + ∑' j : ℕ, ∫⁻ t in triadicContinuousKInterval j, + continuousKSeminormIntegrand s.1 F t := by + rw [← iUnion_triadicContinuousKInterval] + exact lintegral_iUnion measurableSet_triadicContinuousKInterval + triadicContinuousKInterval_pairwiseDisjoint _ + +private theorem triadicContinuousKInterval_eq_diff_singleton (j : ℕ) : + triadicContinuousKInterval j = + Set.Ioc (triadicContinuousKScale (j + 1)).1 (triadicContinuousKScale j).1 \ {1} := by + ext t + simp only [triadicContinuousKInterval, Set.mem_inter_iff, Set.mem_Ioc, Set.mem_Ioo, + Set.mem_sdiff, Set.mem_singleton_iff] + constructor + · rintro ⟨⟨hlower, hupper⟩, hpos, hone⟩ + exact ⟨⟨hlower, hupper⟩, ne_of_lt hone⟩ + · rintro ⟨⟨hlower, hupper⟩, hne⟩ + refine ⟨⟨hlower, hupper⟩, ?_, ?_⟩ + · exact (triadicContinuousKScale_pos (j + 1)).trans hlower + · exact lt_of_le_of_ne (hupper.trans (triadicContinuousKScale_le_one j)) hne + +private theorem volume_triadicContinuousKInterval (j : ℕ) : + volume (triadicContinuousKInterval j) = + ENNReal.ofReal ((2 : ℝ) / 3 * (triadicContinuousKScale j).1) := by + rw [triadicContinuousKInterval_eq_diff_singleton, measure_sdiff_null Real.volume_singleton, + Real.volume_Ioc, triadicContinuousKScale_succ] + congr 1 + ring + +private theorem triadicContinuousKUpper_scaleFactor (j : ℕ) : + ENNReal.ofReal ((triadicContinuousKScale j).1)⁻¹ * + volume (triadicContinuousKInterval j) = ENNReal.ofReal ((2 : ℝ) / 3) := by + rw [volume_triadicContinuousKInterval, ← ENNReal.ofReal_mul] + · congr 1 + field_simp [ne_of_gt (triadicContinuousKScale_pos j)] + · exact inv_nonneg.mpr (triadicContinuousKScale_pos j).le + +private theorem triadicContinuousKLower_scaleFactor (j : ℕ) : + ENNReal.ofReal ((triadicContinuousKScale (j + 1)).1)⁻¹ * + volume (triadicContinuousKInterval j) = ENNReal.ofReal 2 := by + rw [volume_triadicContinuousKInterval, triadicContinuousKScale_succ, + ← ENNReal.ofReal_mul] + · congr 1 + field_simp [ne_of_gt (triadicContinuousKScale_pos j)] + · exact inv_nonneg.mpr (by + exact div_nonneg (triadicContinuousKScale_pos j).le (by norm_num)) + +private theorem triadicContinuousK_rpow_upper (s : FractionalOrder) (j : ℕ) : + Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) = + Real.rpow 3 (-2 * s.1) * + Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1) := by + have hscale : (triadicContinuousKScale j).1 = + 3 * (triadicContinuousKScale (j + 1)).1 := by + rw [triadicContinuousKScale_succ] + field_simp + rw [hscale] + exact Real.mul_rpow (by norm_num) (triadicContinuousKScale_pos (j + 1)).le + +private theorem triadicContinuousK_rpow_lower (s : FractionalOrder) (j : ℕ) : + Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1) = + Real.rpow 3 (2 * s.1) * + Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) := by + rw [triadicContinuousKScale_succ, + show (triadicContinuousKScale j).1 / 3 = + (triadicContinuousKScale j).1 * 3⁻¹ by ring] + calc + Real.rpow ((triadicContinuousKScale j).1 * 3⁻¹) (-2 * s.1) = + Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) * + Real.rpow 3⁻¹ (-2 * s.1) := + Real.mul_rpow (triadicContinuousKScale_pos j).le (by positivity) + _ = Real.rpow 3 (2 * s.1) * + Real.rpow (triadicContinuousKScale j).1 (-2 * s.1) := by + have hthree : Real.rpow (3⁻¹ : ℝ) (-2 * s.1) = Real.rpow 3 (2 * s.1) := by + calc + Real.rpow (3⁻¹ : ℝ) (-2 * s.1) = + (Real.rpow 3 (-2 * s.1))⁻¹ := + Real.inv_rpow (by norm_num) _ + _ = Real.rpow 3 (2 * s.1) := by + rw [show -2 * s.1 = -(2 * s.1) by ring] + have hneg : Real.rpow 3 (-(2 * s.1)) = + (Real.rpow 3 (2 * s.1))⁻¹ := + Real.rpow_neg (by norm_num) _ + rw [hneg, inv_inv] + rw [hthree] + ring + +private theorem triadicContinuousKLower_interval_bound {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : + triadicContinuousKLowerSeriesConstant s * + triadicContinuousKSampleTerm s F (j + 1) ≤ + ∫⁻ t in triadicContinuousKInterval j, continuousKSeminormIntegrand s.1 F t := by + refine (le_of_eq ?_).trans (triadicContinuousKInterval_lintegral_bounds s F j).1 + unfold triadicContinuousKLowerSeriesConstant triadicContinuousKSampleTerm + triadicContinuousKLowerSampleWeight + have hpow : ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) = + ENNReal.ofReal (Real.rpow 3 (-2 * s.1)) * + ENNReal.ofReal (Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1)) := by + rw [triadicContinuousK_rpow_upper s j] + exact ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _) + rw [hpow] + calc + ENNReal.ofReal (2 / 3) * ENNReal.ofReal (Real.rpow 3 (-2 * s.1)) * + (ENNReal.ofReal (Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale (j + 1)) F ^ 2)) = + (ENNReal.ofReal (Real.rpow 3 (-2 * s.1)) * + ENNReal.ofReal (Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale (j + 1)) F ^ 2)) * + (ENNReal.ofReal ((triadicContinuousKScale j).1)⁻¹ * + volume (triadicContinuousKInterval j)) := by + rw [triadicContinuousKUpper_scaleFactor] + ac_rfl + _ = _ := by ac_rfl + +private theorem triadicContinuousKUpper_interval_bound {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) (j : ℕ) : + (∫⁻ t in triadicContinuousKInterval j, continuousKSeminormIntegrand s.1 F t) ≤ + triadicContinuousKUpperSeriesConstant s * triadicContinuousKSampleTerm s F j := by + refine (triadicContinuousKInterval_lintegral_bounds s F j).2.trans (le_of_eq ?_) + unfold triadicContinuousKUpperSeriesConstant triadicContinuousKSampleTerm + triadicContinuousKUpperSampleWeight + have hpow : ENNReal.ofReal (Real.rpow (triadicContinuousKScale (j + 1)).1 (-2 * s.1)) = + ENNReal.ofReal (Real.rpow 3 (2 * s.1)) * + ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) := by + rw [triadicContinuousK_rpow_lower s j] + exact ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _) + rw [hpow] + calc + (ENNReal.ofReal (Real.rpow 3 (2 * s.1)) * + ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1))) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale j) F ^ 2) * + ENNReal.ofReal ((triadicContinuousKScale (j + 1)).1)⁻¹ * + volume (triadicContinuousKInterval j) = + (ENNReal.ofReal (Real.rpow 3 (2 * s.1)) * + ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale j) F ^ 2)) * + (ENNReal.ofReal ((triadicContinuousKScale (j + 1)).1)⁻¹ * + volume (triadicContinuousKInterval j)) := by ac_rfl + _ = + ENNReal.ofReal 2 * ENNReal.ofReal (Real.rpow 3 (2 * s.1)) * + (ENNReal.ofReal (Real.rpow (triadicContinuousKScale j).1 (-2 * s.1)) * + ENNReal.ofReal (continuousKFunctional (triadicContinuousKScale j) F ^ 2)) := by + rw [triadicContinuousKLower_scaleFactor] + ac_rfl + _ = _ := by ac_rfl + +/-- The continuum `K` energy dominates the shifted canonical triadic energy. -/ +theorem triadicContinuousKLowerSeriesComparison {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + triadicContinuousKLowerSeriesConstant s * triadicContinuousKShiftedSampleEnergy s F ≤ + ∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t := by + rw [continuousKSeminorm_lintegral_eq_tsum_triadicIntervals] + rw [triadicContinuousKShiftedSampleEnergy, ← ENNReal.tsum_mul_left] + exact ENNReal.tsum_le_tsum (triadicContinuousKLower_interval_bound s F) + +/-- The continuum `K` energy is controlled by the canonical triadic sampled +energy with an explicit base-three constant. -/ +theorem triadicContinuousKUpperSeriesComparison {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t) ≤ + triadicContinuousKUpperSeriesConstant s * triadicContinuousKSampleEnergy s F := by + rw [continuousKSeminorm_lintegral_eq_tsum_triadicIntervals] + rw [triadicContinuousKSampleEnergy, ← ENNReal.tsum_mul_left] + exact ENNReal.tsum_le_tsum (triadicContinuousKUpper_interval_bound s F) + +/-- Square-root form of the shifted lower series comparison. -/ +theorem triadicContinuousKLowerSeriesComparison_rpow {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + (triadicContinuousKLowerSeriesConstant s * + triadicContinuousKShiftedSampleEnergy s F) ^ (1 / 2 : ℝ) ≤ + continuousKSeminorm s F := by + rw [continuousKSeminorm_eq_lintegral] + exact ENNReal.rpow_le_rpow (triadicContinuousKLowerSeriesComparison s F) (by norm_num) + +/-- Square-root form of the upper series comparison. -/ +theorem triadicContinuousKUpperSeriesComparison_rpow {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F ≤ + (triadicContinuousKUpperSeriesConstant s * + triadicContinuousKSampleEnergy s F) ^ (1 / 2 : ℝ) := by + rw [continuousKSeminorm_eq_lintegral] + exact ENNReal.rpow_le_rpow (triadicContinuousKUpperSeriesComparison s F) (by norm_num) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/UnitCubeGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/UnitCubeGeometry.lean new file mode 100644 index 0000000000..07900bb044 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/UnitCubeGeometry.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 + +/-! +# Geometry of the unit centered cube for continuous interpolation + +This module gathers convention-neutral domain, measure, and metric facts for +the exact continuous interpolation theorem. The analytic domain is the open +centered unit cube; the normalized measure retains the canonical half-open +cube carrier. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The source-facing open realization of the centered unit cube. -/ +abbrev unitCenteredOpenCubeSet (d : ℕ) : Set (Vec d) := + openCubeSet (originCube d 0) + +/-- The analytic unit cube is open, bounded, and convex in every dimension. -/ +theorem isOpenBoundedConvexDomain_unitCenteredOpenCubeSet (d : ℕ) : + IsOpenBoundedConvexDomain (unitCenteredOpenCubeSet d) := + isOpenBoundedConvexDomain_openCubeSet (originCube d 0) + +/-- The centered unit triadic cube has literal volume one. -/ +@[simp] theorem cubeVolume_originCube_zero (d : ℕ) : + cubeVolume (originCube d 0) = 1 := by + simp [cubeVolume] + +/-- The half-open centered unit cube has Lebesgue volume one. -/ +@[simp] theorem volume_cubeSet_originCube_zero (d : ℕ) : + MeasureTheory.volume (cubeSet (originCube d 0)) = 1 := by + exact (ENNReal.toReal_eq_one_iff _).mp (by + simp only [volume_cubeSet_toReal, cubeVolume_originCube_zero]) + +/-- The source-facing open centered unit cube has Lebesgue volume one. -/ +@[simp] theorem volume_openCubeSet_originCube_zero (d : ℕ) : + MeasureTheory.volume (unitCenteredOpenCubeSet d) = 1 := by + rw [volume_openCubeSet_eq_volume_cubeSet] + exact volume_cubeSet_originCube_zero d + +/-- The exact unit-cube domain's restricted volume is the canonical cube +measure. -/ +theorem unitCenteredCubeDomain_restrictedVolume_eq_cubeMeasure (d : ℕ) : + (unitCenteredCubeDomain d).restrictedVolume = cubeMeasure (originCube d 0) := + cubeBoundedMeasurableDomain_restrictedVolume_eq_cubeMeasure (originCube d 0) + +/-- The exact unit-cube normalized volume is the canonical normalized cube +measure. -/ +theorem unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure (d : ℕ) : + (unitCenteredCubeDomain d).normalizedVolume = + normalizedCubeMeasure (originCube d 0) := + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure (originCube d 0) + +/-- The exact unit-cube restricted volume can equivalently be read on the +source-facing open cube. -/ +theorem unitCenteredCubeDomain_restrictedVolume_eq_restrict_openCubeSet (d : ℕ) : + (unitCenteredCubeDomain d).restrictedVolume = + MeasureTheory.volume.restrict (unitCenteredOpenCubeSet d) := + cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet (originCube d 0) + +/-- The half-open and open centered unit cubes agree almost everywhere. -/ +theorem cubeSet_originCube_zero_ae_eq_unitCenteredOpenCubeSet (d : ℕ) : + cubeSet (originCube d 0) =ᵐ[MeasureTheory.volume] unitCenteredOpenCubeSet d := + cubeSet_originCube_ae_eq_openCubeSet 0 + +/-- The project ambient (sup) norm is bounded by the explicit Euclidean +magnitude. -/ +theorem norm_le_euclideanNorm {d : ℕ} (x : Vec d) : + ‖x‖ ≤ euclideanNorm x := by + simpa only [euclideanNorm_eq_norm_ofVec] using HilbertVec.norm_le_norm_ofVec x + +/-- The Euclidean magnitude is bounded by a dimension-only multiple of the +project ambient (sup) norm. This formulation remains valid at `d = 0`. -/ +theorem euclideanNorm_le_dimension_mul_norm {d : ℕ} (x : Vec d) : + euclideanNorm x ≤ (d : ℝ) * ‖x‖ := by + simpa only [euclideanNorm_eq_norm_ofVec] using HilbertVec.norm_ofVec_le_mul_norm x + +/-- The project ambient distance is bounded by the explicit Euclidean +distance. -/ +theorem dist_le_euclideanDist {d : ℕ} (x y : Vec d) : + dist x y ≤ euclideanDist x y := by + simpa only [dist_eq_norm, euclideanDist] using norm_le_euclideanNorm (x - y) + +/-- The Euclidean distance is bounded by a dimension-only multiple of the +project ambient distance. This formulation remains valid at `d = 0`. -/ +theorem euclideanDist_le_dimension_mul_dist {d : ℕ} (x y : Vec d) : + euclideanDist x y ≤ (d : ℝ) * dist x y := by + simpa only [dist_eq_norm, euclideanDist] using + euclideanNorm_le_dimension_mul_norm (x - y) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ZeroDimensionalClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ZeroDimensionalClosure.lean new file mode 100644 index 0000000000..43feaf5be5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousInterpolation/ZeroDimensionalClosure.lean @@ -0,0 +1,136 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.RootScaleControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge + +/-! +# Zero-dimensional closure of the continuous interpolation quantities + +All vector fields and gradient matrices in dimension zero are forced to vanish. This module +records the resulting exact zero identities for the normalized `L²`, continuous `K`, sampled +series, and Euclidean fractional quantities. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The normalized Euclidean extended `L²` norm vanishes in dimension zero. -/ +theorem normalizedEuclideanLpENorm_zero_dim (F : UnitCubeEuclideanL2Field 0) : + (unitCenteredCubeDomain 0).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F = 0 := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + BoundedMeasurableDomain.normalizedLpENorm + have hzero : (fun x => euclideanNorm (F x)) = fun _ => (0 : ℝ) := by + funext x + rw [show F x = 0 by exact Subsingleton.elim _ _] + exact euclideanNorm_zero + rw [hzero, MeasureTheory.eLpNorm_zero'] + +private theorem continuousKResidualNorm_default_zero_dim + (F : UnitCubeEuclideanL2Field 0) : + continuousKResidualNorm F (default : ContinuousKCompetitor 0) = 0 := by + unfold continuousKResidualNorm BoundedMeasurableDomain.normalizedEuclideanLpNorm + BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + change (MeasureTheory.eLpNorm + (fun x => euclideanNorm (F x - (default : ContinuousKCompetitor 0).toField x)) + (2 : ℝ≥0∞) (unitCenteredCubeDomain 0).normalizedVolume).toReal = 0 + have hzero : + (fun x => euclideanNorm (F x - (default : ContinuousKCompetitor 0).toField x)) = + fun _ => (0 : ℝ) := by + funext x + rw [show F x - (default : ContinuousKCompetitor 0).toField x = 0 by + exact Subsingleton.elim _ _] + exact euclideanNorm_zero + rw [hzero, MeasureTheory.eLpNorm_zero'] + rfl + +private theorem continuousKGradientNorm_default_zero_dim : + continuousKGradientNorm (default : ContinuousKCompetitor 0) = 0 := by + unfold continuousKGradientNorm BoundedMeasurableDomain.normalizedLpNorm + BoundedMeasurableDomain.normalizedLpFiniteENorm + BoundedMeasurableDomain.normalizedLpENorm + change (MeasureTheory.eLpNorm + (fun x => matrixFrobeniusMagnitude ((default : ContinuousKCompetitor 0).gradient x)) + (2 : ℝ≥0∞) (unitCenteredCubeDomain 0).normalizedVolume).toReal = 0 + have hzero : + (fun x => matrixFrobeniusMagnitude + ((default : ContinuousKCompetitor 0).gradient x)) = fun _ => (0 : ℝ) := by + funext x + rw [show (default : ContinuousKCompetitor 0).gradient x = 0 by + exact Subsingleton.elim _ _] + exact matrixFrobeniusMagnitude_zero + rw [hzero, MeasureTheory.eLpNorm_zero'] + rfl + +private theorem continuousKFunctionalCompetitorValue_default_zero_dim + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field 0) : + continuousKFunctionalCompetitorValue t F default = 0 := by + unfold continuousKFunctionalCompetitorValue + rw [continuousKResidualNorm_default_zero_dim, + continuousKGradientNorm_default_zero_dim] + norm_num + +/-- The continuous `K`-functional vanishes at every scale in dimension zero. -/ +theorem continuousKFunctional_zero_dim (t : ContinuousKScale) + (F : UnitCubeEuclideanL2Field 0) : continuousKFunctional t F = 0 := by + apply le_antisymm + · exact (continuousKFunctional_le_competitor t F default).trans_eq + (continuousKFunctionalCompetitorValue_default_zero_dim t F) + · exact continuousKFunctional_nonneg t F + +/-- Every weighted triadic `K` sample vanishes in dimension zero. -/ +theorem triadicContinuousKSampleTerm_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) (j : ℕ) : + triadicContinuousKSampleTerm s F j = 0 := by + unfold triadicContinuousKSampleTerm + rw [continuousKFunctional_zero_dim] + norm_num + +/-- The full triadic sampled `K` energy vanishes in dimension zero. -/ +theorem triadicContinuousKSampleEnergy_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : + triadicContinuousKSampleEnergy s F = 0 := by + unfold triadicContinuousKSampleEnergy + simp only [triadicContinuousKSampleTerm_zero_dim, tsum_zero] + +/-- The shifted triadic sampled `K` energy vanishes in dimension zero. -/ +theorem triadicContinuousKShiftedSampleEnergy_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : + triadicContinuousKShiftedSampleEnergy s F = 0 := by + unfold triadicContinuousKShiftedSampleEnergy + simp only [triadicContinuousKSampleTerm_zero_dim, tsum_zero] + +/-- The continuum interpolation seminorm vanishes in dimension zero. -/ +theorem continuousKSeminorm_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : continuousKSeminorm s F = 0 := by + apply le_antisymm + · calc + continuousKSeminorm s F ≤ + (triadicContinuousKUpperSeriesConstant s * + triadicContinuousKSampleEnergy s F) ^ (1 / 2 : ℝ) := + triadicContinuousKUpperSeriesComparison_rpow s F + _ = 0 := by rw [triadicContinuousKSampleEnergy_zero_dim]; norm_num + · exact bot_le + +/-- The exact Euclidean fractional seminorm vanishes in dimension zero. -/ +theorem euclideanHsESeminorm_zero_dim (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field 0) : euclideanHsESeminorm s F = 0 := by + unfold euclideanHsESeminorm + rw [euclideanHsEnergy_zero_dim] + norm_num + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousKFunctional.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousKFunctional.lean new file mode 100644 index 0000000000..d316cb163c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ContinuousKFunctional.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.WeakHessianEuclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.MeasureTheory.SpecificCodomains.WithLp + +/-! +# The continuous centered-cube `K`-functional + +This is the literal real-interpolation kernel from the Chapter 1 +constant-coefficient Dirichlet argument. The unit centered open cube is used +for the coordinatewise `H¹` competitors; normalized volume is realized by its +a.e.-equal half-open cube. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The source scale carrier `0 < t ≤ 1`. -/ +abbrev ContinuousKScale := Set.Ioc (0 : ℝ) 1 + +theorem ContinuousKScale.pos (t : ContinuousKScale) : 0 < t.1 := t.2.1 + +theorem ContinuousKScale.le_one (t : ContinuousKScale) : t.1 ≤ 1 := t.2.2 + +/-- A source-faithful `H¹(square_0; ℝ^d)` competitor. Its coordinates carry +genuine `H1Function` witnesses on the source-facing open cube. -/ +structure ContinuousKCompetitor (d : ℕ) where + /-- One genuine weak `H¹` witness for each target coordinate. -/ + coord : Fin d → H1Function (openCubeSet (originCube d 0)) + +namespace ContinuousKCompetitor + +/-- The vector field represented by a coordinatewise `H¹` competitor. -/ +def toField {d : ℕ} (G : ContinuousKCompetitor d) : Vec d → Vec d := + fun x i => G.coord i x + +/-- The matrix of actual coordinate weak gradients. -/ +def gradient {d : ℕ} (G : ContinuousKCompetitor d) : Vec d → Mat d := + fun x i j => (G.coord i).grad x j + +@[simp] theorem toField_apply {d : ℕ} (G : ContinuousKCompetitor d) + (x : Vec d) (i : Fin d) : G.toField x i = G.coord i x := rfl + +@[simp] theorem gradient_apply {d : ℕ} (G : ContinuousKCompetitor d) + (x : Vec d) (i j : Fin d) : G.gradient x i j = (G.coord i).grad x j := rfl + +instance {d : ℕ} : Inhabited (ContinuousKCompetitor d) where + default := { coord := fun _ => 0 } + +/-- Euclidean `L²` control of the represented field, derived solely from the +coordinate `H¹` witnesses. -/ +theorem euclideanMemL2 {d : ℕ} (G : ContinuousKCompetitor d) : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (G.toField x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [unitCenteredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + Function.comp_apply, PiLp.toLp_apply, toField_apply] using + (G.coord i).memL2_normalizedCubeMeasure + +/-- Frobenius `L²` control of the actual weak-gradient matrix, derived from +the coordinate `H¹` witnesses and the shared Frobenius realization. -/ +theorem gradientFrobeniusMemL2 {d : ℕ} (G : ContinuousKCompetitor d) : + MeasureTheory.MemLp + (fun x => matrixFrobeniusMagnitude (G.gradient x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + have hmat : MeasureTheory.MemLp (fun x => HilbertMat.ofMat (G.gradient x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + rw [MeasureTheory.memLp_piLp_iff] + intro j + simpa only [unitCenteredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + Function.comp_apply, PiLp.toLp_apply, gradient_apply] using + (G.coord i).grad_memL2_normalizedCubeMeasure j + simpa only [matrixFrobeniusMagnitude_eq_norm_hilbertMat_ofMat] using + hmat.norm + +end ContinuousKCompetitor + +/-- The normalized Euclidean `L²` residual in the continuous `K`-functional. -/ +noncomputable def continuousKResidualNorm {d : ℕ} (F : UnitCubeEuclideanL2Field d) + (G : ContinuousKCompetitor d) : ℝ := + (unitCenteredCubeDomain d).normalizedEuclideanLpNorm (2 : ℝ≥0∞) + (fun x => F x - G.toField x) (by + have hsub := F.euclideanMemL2.sub G.euclideanMemL2 + simpa only [euclideanNorm_eq_norm_ofVec, HilbertVec.ofVec, PiLp.toLp_apply, + Pi.sub_apply] using! hsub.norm) + +/-- The normalized Frobenius `L²` weak-gradient quantity in the continuous +`K`-functional. -/ +noncomputable def continuousKGradientNorm {d : ℕ} (G : ContinuousKCompetitor d) : ℝ := + (unitCenteredCubeDomain d).normalizedLpNorm (2 : ℝ≥0∞) + (fun x => matrixFrobeniusMagnitude (G.gradient x)) + G.gradientFrobeniusMemL2 + +theorem continuousKResidualNorm_nonneg {d : ℕ} (F : UnitCubeEuclideanL2Field d) + (G : ContinuousKCompetitor d) : 0 ≤ continuousKResidualNorm F G := + ENNReal.toReal_nonneg + +theorem continuousKGradientNorm_nonneg {d : ℕ} (G : ContinuousKCompetitor d) : + 0 ≤ continuousKGradientNorm G := + ENNReal.toReal_nonneg + +/-- The exact square-root value contributed by one genuine `H¹` competitor. -/ +noncomputable def continuousKFunctionalCompetitorValue {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) (G : ContinuousKCompetitor d) : ℝ := + Real.sqrt + (continuousKResidualNorm F G ^ 2 + t.1 ^ 2 * continuousKGradientNorm G ^ 2) + +theorem continuousKFunctionalCompetitorValue_nonneg {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) (G : ContinuousKCompetitor d) : + 0 ≤ continuousKFunctionalCompetitorValue t F G := + Real.sqrt_nonneg _ + +theorem continuousKFunctionalCompetitorValue_mono {d : ℕ} + {t u : ContinuousKScale} (htu : t.1 ≤ u.1) (F : UnitCubeEuclideanL2Field d) + (G : ContinuousKCompetitor d) : + continuousKFunctionalCompetitorValue t F G ≤ + continuousKFunctionalCompetitorValue u F G := by + apply Real.sqrt_le_sqrt + apply add_le_add le_rfl + apply mul_le_mul_of_nonneg_right + · simpa only [pow_two] using mul_self_le_mul_self (ContinuousKScale.pos t).le htu + · exact sq_nonneg _ + +/-- The literal continuous real-interpolation `K`-functional. -/ +noncomputable def continuousKFunctional {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : ℝ := + sInf (Set.range fun G : ContinuousKCompetitor d => + continuousKFunctionalCompetitorValue t F G) + +theorem continuousKFunctional_eq_sInf {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + continuousKFunctional t F = + sInf (Set.range fun G : ContinuousKCompetitor d => + continuousKFunctionalCompetitorValue t F G) := rfl + +theorem continuousKFunctional_range_nonempty {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + (Set.range fun G : ContinuousKCompetitor d => + continuousKFunctionalCompetitorValue t F G).Nonempty := + ⟨continuousKFunctionalCompetitorValue t F default, ⟨default, rfl⟩⟩ + +theorem continuousKFunctional_range_bddBelow {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : + BddBelow (Set.range fun G : ContinuousKCompetitor d => + continuousKFunctionalCompetitorValue t F G) := by + refine ⟨0, ?_⟩ + rintro y ⟨G, rfl⟩ + exact continuousKFunctionalCompetitorValue_nonneg t F G + +theorem continuousKFunctional_nonneg {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) : 0 ≤ continuousKFunctional t F := by + unfold continuousKFunctional + exact le_csInf (continuousKFunctional_range_nonempty t F) fun y hy => by + rcases hy with ⟨G, rfl⟩ + exact continuousKFunctionalCompetitorValue_nonneg t F G + +theorem continuousKFunctional_le_competitor {d : ℕ} + (t : ContinuousKScale) (F : UnitCubeEuclideanL2Field d) (G : ContinuousKCompetitor d) : + continuousKFunctional t F ≤ continuousKFunctionalCompetitorValue t F G := by + unfold continuousKFunctional + exact csInf_le (continuousKFunctional_range_bddBelow t F) ⟨G, rfl⟩ + +theorem continuousKFunctional_mono {d : ℕ} {t u : ContinuousKScale} + (htu : t.1 ≤ u.1) (F : UnitCubeEuclideanL2Field d) : + continuousKFunctional t F ≤ continuousKFunctional u F := by + unfold continuousKFunctional + refine le_csInf (continuousKFunctional_range_nonempty u F) ?_ + rintro y ⟨G, rfl⟩ + calc + sInf (Set.range fun G : ContinuousKCompetitor d => + continuousKFunctionalCompetitorValue t F G) + ≤ continuousKFunctionalCompetitorValue t F G := + csInf_le (continuousKFunctional_range_bddBelow t F) ⟨G, rfl⟩ + _ ≤ continuousKFunctionalCompetitorValue u F G := + continuousKFunctionalCompetitorValue_mono htu F G + +/-- The real-line representative of `K(t,F)` used for the continuum integral. +It agrees with the source `K`-functional on the open integration interval. -/ +noncomputable def continuousKFunctionalOnOpenScale {d : ℕ} + (F : UnitCubeEuclideanL2Field d) (t : ℝ) : ℝ := + if ht : t ∈ Set.Ioo (0 : ℝ) 1 then + continuousKFunctional ⟨t, ⟨ht.1, ht.2.le⟩⟩ F + else 0 + +theorem continuousKFunctionalOnOpenScale_monoOn {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + MonotoneOn (continuousKFunctionalOnOpenScale F) (Set.Ioo (0 : ℝ) 1) := by + intro t ht u hu htu + simp only [continuousKFunctionalOnOpenScale, dif_pos ht, dif_pos hu] + exact continuousKFunctional_mono htu F + +theorem continuousKFunctionalOnOpenScale_aemeasurable {d : ℕ} + (F : UnitCubeEuclideanL2Field d) : + AEMeasurable (continuousKFunctionalOnOpenScale F) + (MeasureTheory.volume.restrict (Set.Ioo (0 : ℝ) 1)) := + aemeasurable_restrict_of_monotoneOn measurableSet_Ioo + (continuousKFunctionalOnOpenScale_monoOn F) + +private theorem continuousKSeminormWeight_aemeasurable (s : ℝ) : + AEMeasurable + (fun t : ℝ => ENNReal.ofReal (Real.rpow t (-2 * s)) * ENNReal.ofReal t⁻¹) + (MeasureTheory.volume.restrict (Set.Ioo (0 : ℝ) 1)) := by + have hrpow : ContinuousOn (fun t : ℝ => Real.rpow t (-2 * s)) + (Set.Ioo (0 : ℝ) 1) := by + intro t ht + exact (Real.continuousAt_rpow_const t (-2 * s) (Or.inl (ne_of_gt ht.1))).continuousWithinAt + have hinv : ContinuousOn (fun t : ℝ => t⁻¹) (Set.Ioo (0 : ℝ) 1) := + continuousOn_inv₀.mono fun _ ht => ne_of_gt ht.1 + exact (hrpow.aemeasurable measurableSet_Ioo).ennreal_ofReal.mul + (hinv.aemeasurable measurableSet_Ioo).ennreal_ofReal + +/-- The nonnegative integrand in the continuum `K`-seminorm. On the exact +integration interval it is `t^(-2s) K(t,F)^2 / t`. -/ +noncomputable def continuousKSeminormIntegrand {d : ℕ} + (s : ℝ) (F : UnitCubeEuclideanL2Field d) (t : ℝ) : ℝ≥0∞ := + ENNReal.ofReal (Real.rpow t (-2 * s)) * + ENNReal.ofReal (continuousKFunctionalOnOpenScale F t ^ 2) * + ENNReal.ofReal t⁻¹ + +theorem continuousKSeminormIntegrand_aemeasurable {d : ℕ} + (s : ℝ) (F : UnitCubeEuclideanL2Field d) : + AEMeasurable (continuousKSeminormIntegrand s F) + (MeasureTheory.volume.restrict (Set.Ioo (0 : ℝ) 1)) := by + unfold continuousKSeminormIntegrand + simpa only [Pi.mul_def, pow_two, mul_assoc, mul_left_comm, mul_comm] using! + (continuousKSeminormWeight_aemeasurable s).mul + ((continuousKFunctionalOnOpenScale_aemeasurable F).mul + (continuousKFunctionalOnOpenScale_aemeasurable F)).ennreal_ofReal + +/-- On the source integration interval, the integrand is literally the +weighted square `t^(-2s) K(t,F)^2 / t`. -/ +theorem continuousKSeminormIntegrand_eq_of_mem {d : ℕ} + (s : ℝ) (F : UnitCubeEuclideanL2Field d) {t : ℝ} (ht : t ∈ Set.Ioo (0 : ℝ) 1) : + continuousKSeminormIntegrand s F t = + ENNReal.ofReal (Real.rpow t (-2 * s)) * + ENNReal.ofReal (continuousKFunctional ⟨t, ⟨ht.1, ht.2.le⟩⟩ F ^ 2) * + ENNReal.ofReal t⁻¹ := by + simp only [continuousKSeminormIntegrand, continuousKFunctionalOnOpenScale, dif_pos ht] + +/-- The exact ENNReal-valued continuum interpolation seminorm. Its integrand +is a genuine Lebesgue-measurable function on `(0,1)`, rather than a lower- +integral convention for an unverified representative. -/ +noncomputable def continuousKSeminorm {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t) ^ (1 / 2 : ℝ) + +/-- Exact continuum-lintegral characterization of the interpolation seminorm, +including the source weight `t^(-2s)` and measure factor `dt / t`. -/ +theorem continuousKSeminorm_eq_lintegral {d : ℕ} + (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + continuousKSeminorm s F = + (∫⁻ t in Set.Ioo (0 : ℝ) 1, continuousKSeminormIntegrand s.1 F t) ^ (1 / 2 : ℝ) := + rfl + +theorem continuousKResidualNorm_congr_ae {d : ℕ} {F H : UnitCubeEuclideanL2Field d} + (G : ContinuousKCompetitor d) + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + continuousKResidualNorm F G = continuousKResidualNorm H G := by + unfold continuousKResidualNorm + apply (unitCenteredCubeDomain d).normalizedEuclideanLpNorm_congr_ae + filter_upwards [hFH] with x hx + simp only [hx] + +theorem continuousKFunctionalCompetitorValue_congr_ae {d : ℕ} + (t : ContinuousKScale) {F H : UnitCubeEuclideanL2Field d} (G : ContinuousKCompetitor d) + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + continuousKFunctionalCompetitorValue t F G = continuousKFunctionalCompetitorValue t H G := by + unfold continuousKFunctionalCompetitorValue + rw [continuousKResidualNorm_congr_ae G hFH] + +theorem continuousKFunctional_congr_ae {d : ℕ} + (t : ContinuousKScale) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + continuousKFunctional t F = continuousKFunctional t H := by + unfold continuousKFunctional + congr 1 + ext y + constructor + · rintro ⟨G, rfl⟩ + exact ⟨G, (continuousKFunctionalCompetitorValue_congr_ae t G hFH).symm⟩ + · rintro ⟨G, rfl⟩ + exact ⟨G, continuousKFunctionalCompetitorValue_congr_ae t G hFH⟩ + +theorem continuousKFunctionalOnOpenScale_congr_ae {d : ℕ} + {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) (t : ℝ) : + continuousKFunctionalOnOpenScale F t = continuousKFunctionalOnOpenScale H t := by + unfold continuousKFunctionalOnOpenScale + split_ifs with ht + · rw [continuousKFunctional_congr_ae ⟨t, ⟨ht.1, ht.2.le⟩⟩ hFH] + · rfl + +theorem continuousKSeminormIntegrand_congr_ae {d : ℕ} + (s : ℝ) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) (t : ℝ) : + continuousKSeminormIntegrand s F t = continuousKSeminormIntegrand s H t := by + unfold continuousKSeminormIntegrand + rw [continuousKFunctionalOnOpenScale_congr_ae hFH t] + +theorem continuousKSeminorm_congr_ae {d : ℕ} + (s : FractionalOrder) {F H : UnitCubeEuclideanL2Field d} + (hFH : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] H) : + continuousKSeminorm s F = continuousKSeminorm s H := by + unfold continuousKSeminorm + congr 1 + apply MeasureTheory.lintegral_congr + intro t + exact continuousKSeminormIntegrand_congr_ae s.1 hFH t + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoLpBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoLpBound.lean new file mode 100644 index 0000000000..0642cc928b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoLpBound.lean @@ -0,0 +1,395 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.PointwiseBounds + +/-! +# Finite-`p` bounds for diagonal Gagliardo smoothing + +This module begins the measure-transport layer needed to turn the diagonal +Jensen estimate into an unconditional fractional-kernel bound. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem gagliardoCubeMeasure_eq_openCubeProduct {d : ℕ} + (Q : TriadicCube d) : + Gagliardo.gagliardoCubeMeasure Q = + ENNReal.ofReal ((cubeVolume Q)⁻¹) • + ((volume.restrict (openCubeSet Q)).prod + (volume.restrict (openCubeSet Q))) := by + rw [Gagliardo.gagliardoCubeMeasure, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + Measure.prod_smul_left] + +private theorem finiteLpExponent_one_le (p : FiniteLpExponent) : 1 ≤ p.exponent := + p.one_lt.le + +private theorem finiteLpExponent_ne_zero (p : FiniteLpExponent) : p.exponent ≠ 0 := + (zero_lt_one.trans p.one_lt).ne' + +private theorem finiteLpExponent_ne_top (p : FiniteLpExponent) : p.exponent ≠ ∞ := + p.lt_top.ne + +/-- The kernel probability measure is concentrated on the topological support +of its density. -/ +theorem ae_mem_tsupport_convexApproxKernelMeasure {d : ℕ} {ρ : Vec d → ℝ} + : ∀ᵐ z ∂convexApproxKernelMeasure ρ, z ∈ tsupport ρ := by + rw [ae_iff] + change convexApproxKernelMeasure ρ (tsupport ρ)ᶜ = 0 + rw [convexApproxKernelMeasure, + withDensity_apply _ (isClosed_tsupport ρ).isOpen_compl.measurableSet] + rw [← lintegral_zero (μ := volume.restrict (tsupport ρ)ᶜ)] + apply lintegral_congr_ae + filter_upwards [ae_restrict_mem (isClosed_tsupport ρ).isOpen_compl.measurableSet] + with z hz + rw [image_eq_zero_of_notMem_tsupport hz] + simp + +/-- The joint map used when Fubini interchanges the cube variables and the +kernel variable in diagonal smoothing. -/ +def diagonalConvexApproxJointSample {d : ℕ} (x0 : Vec d) (r ε : ℝ) : + (Vec d × Vec d) × Vec d → Vec d × Vec d := + fun xyz => diagonalConvexApproxSample x0 xyz.2 r ε xyz.1 + +theorem measurable_diagonalConvexApproxJointSample {d : ℕ} (x0 : Vec d) + (r ε : ℝ) : Measurable (diagonalConvexApproxJointSample x0 r ε) := by + unfold diagonalConvexApproxJointSample diagonalConvexApproxSample convexApproxSample + fun_prop + +/-- On the support of the convex kernel, simultaneous inward sampling maps the +open cube product into itself. -/ +theorem diagonalConvexApproxSample_mapsTo_openCubeProduct {d : ℕ} + (Q : TriadicCube d) {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hz : z ∈ tsupport ρ) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + Set.MapsTo (diagonalConvexApproxSample x0 z r ε) + ((openCubeSet Q) ×ˢ (openCubeSet Q)) + ((openCubeSet Q) ×ˢ (openCubeSet Q)) := by + intro xy hxy + rcases hxy with ⟨hx, hy⟩ + constructor + · exact convexApproxSample_mem_of_tsupport_subset_closedBall + (isOpenBoundedConvexDomain_openCubeSet Q) hx hball + hρ.support_subset_closedBall hz hr hε0 hε1 + · exact convexApproxSample_mem_of_tsupport_subset_closedBall + (isOpenBoundedConvexDomain_openCubeSet Q) hy hball + hρ.support_subset_closedBall hz hr hε0 hε1 + +/-- The pushed-forward Gagliardo measure of a fixed supported diagonal sample +is bounded by its two-Jacobian factor times the original measure. -/ +theorem map_gagliardoCubeMeasure_diagonalConvexApproxSample_le {d : ℕ} + (Q : TriadicCube d) {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 z : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hz : z ∈ tsupport ρ) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + Measure.map (diagonalConvexApproxSample x0 z r ε) + (Gagliardo.gagliardoCubeMeasure Q) ≤ + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) • + Gagliardo.gagliardoCubeMeasure Q := by + let U := openCubeSet Q + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have himage : convexApproxSample x0 z r ε '' U ⊆ U := by + exact Set.image_subset_iff.mpr + (fun x hx => + convexApproxSample_mem_of_tsupport_subset_closedBall + (isOpenBoundedConvexDomain_openCubeSet Q) hx hball + hρ.support_subset_closedBall hz hr hε0 hε1) + have hprod : + (volume.restrict (convexApproxSample x0 z r ε '' U)).prod + (volume.restrict (convexApproxSample x0 z r ε '' U)) ≤ + (volume.restrict U).prod (volume.restrict U) := by + rw [Measure.prod_restrict, Measure.prod_restrict] + exact Measure.restrict_mono_set volume (Set.prod_mono himage himage) + have hmeas : Measurable (diagonalConvexApproxSample x0 z r ε) := + ((measurableEmbedding_convexApproxSample x0 z r ε hε).prodMap + (measurableEmbedding_convexApproxSample x0 z r ε hε)).measurable + rw [gagliardoCubeMeasure_eq_openCubeProduct Q, + Measure.map_smul _ hmeas.aemeasurable, + map_prod_restrict_diagonalConvexApproxSample + (isOpen_openCubeSet Q).measurableSet x0 z r ε hε] + change c • (J • + ((volume.restrict (convexApproxSample x0 z r ε '' U)).prod + (volume.restrict (convexApproxSample x0 z r ε '' U)))) ≤ + J • (c • ((volume.restrict U).prod (volume.restrict U))) + rw [smul_smul, smul_smul, mul_comm J c] + apply Measure.le_iff'.2 + intro s + rw [Measure.smul_apply, Measure.smul_apply] + exact mul_le_mul_right (hprod s) (c * J) + +/-- A fixed supported diagonal affine sample is bounded on finite- +`L^p` Gagliardo kernels by the explicit two-Jacobian factor. -/ +theorem eLpNorm_comp_diagonalConvexApproxSample_le {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [TopologicalSpace E] [ContinuousENorm E] + (Q : TriadicCube d) (p : FiniteLpExponent) (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 z : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hz : z ∈ tsupport ρ) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + eLpNorm (fun xy => K (diagonalConvexApproxSample x0 z r ε xy)) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) ≤ + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) ^ (1 / p.exponent).toReal * + eLpNorm K p.exponent (Gagliardo.gagliardoCubeMeasure Q) := by + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let A := diagonalConvexApproxSample x0 z r ε + have hJtop : J ≠ ⊤ := by + dsimp only [J] + exact ENNReal.pow_ne_top ENNReal.ofReal_ne_top + have hmap : Measure.map A (Gagliardo.gagliardoCubeMeasure Q) ≤ + J • Gagliardo.gagliardoCubeMeasure Q := by + simpa only [A, J] using + (map_gagliardoCubeMeasure_diagonalConvexApproxSample_le Q hρ hε hball hr hz hε0 hε1) + have hKmap : MemLp K p.exponent (Measure.map A (Gagliardo.gagliardoCubeMeasure Q)) := + MemLp.of_measure_le_smul hJtop hmap hK + have hAembedding : MeasurableEmbedding A := by + dsimp only [A, diagonalConvexApproxSample] + exact (measurableEmbedding_convexApproxSample x0 z r ε hε).prodMap + (measurableEmbedding_convexApproxSample x0 z r ε hε) + calc + eLpNorm (fun xy => K (A xy)) p.exponent (Gagliardo.gagliardoCubeMeasure Q) = + eLpNorm K p.exponent (Measure.map A (Gagliardo.gagliardoCubeMeasure Q)) := by + symm + exact hAembedding.eLpNorm_map_measure + _ ≤ eLpNorm K p.exponent (J • Gagliardo.gagliardoCubeMeasure Q) := + eLpNorm_mono_measure K hmap + _ = J ^ (1 / p.exponent).toReal * + eLpNorm K p.exponent (Gagliardo.gagliardoCubeMeasure Q) := by + rw [eLpNorm_smul_measure_of_ne_top p.lt_top.ne K J hK.aestronglyMeasurable] + rfl + +/-- The joint diagonal sampling map is quasi-measure-preserving with exactly +the two-Jacobian loss. This is the missing bridge from fixed-sample bounds to +Fubini section statements. -/ +theorem map_diagonalConvexApproxJointSample_le {d : ℕ} + (Q : TriadicCube d) {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + Measure.map (diagonalConvexApproxJointSample x0 r ε) + ((Gagliardo.gagliardoCubeMeasure Q).prod (convexApproxKernelMeasure ρ)) ≤ + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) • + Gagliardo.gagliardoCubeMeasure Q := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure ρ + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let T := diagonalConvexApproxJointSample x0 r ε + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure hρ + let : SFinite ν := inferInstance + have hT : Measurable T := by + exact measurable_diagonalConvexApproxJointSample x0 r ε + apply Measure.le_iff.2 + intro s hs + rw [Measure.map_apply hT hs] + have hpre : MeasurableSet (T ⁻¹' s) := hT hs + rw [← lintegral_indicator_one hpre] + let f : (Vec d × Vec d) × Vec d → ℝ≥0∞ := + fun xyz => Set.indicator s (fun _ => (1 : ℝ≥0∞)) (T xyz) + have hf : Measurable f := by + exact (measurable_const.indicator hs).comp hT + change ∫⁻ xyz, f xyz ∂μ.prod ν ≤ (J • μ) s + rw [lintegral_prod f hf.aemeasurable] + rw [lintegral_lintegral_swap hf.aemeasurable] + have hfixed : ∀ᵐ z ∂ν, + (∫⁻ xy, f (xy, z) ∂μ) ≤ J * μ s := by + filter_upwards [ae_mem_tsupport_convexApproxKernelMeasure (ρ := ρ)] with z hz + let A := diagonalConvexApproxSample x0 z r ε + have hA : Measurable A := + (measurableEmbedding_convexApproxSample x0 z r ε hε).prodMap + (measurableEmbedding_convexApproxSample x0 z r ε hε) |>.measurable + have hmap : Measure.map A μ ≤ J • μ := by + simpa only [μ, J] using + (map_gagliardoCubeMeasure_diagonalConvexApproxSample_le Q hρ hε + hball hr hz hε0 hε1) + have hrewrite : (fun xy => f (xy, z)) = + (A ⁻¹' s).indicator (fun _ => (1 : ℝ≥0∞)) := by + funext xy + simpa only [f, T, A, diagonalConvexApproxJointSample, Function.comp_apply] using! + (Set.indicator_comp_right A (g := fun _ => (1 : ℝ≥0∞)) (x := xy)).symm + rw [hrewrite] + calc + ∫⁻ xy, (A ⁻¹' s).indicator (fun _ => (1 : ℝ≥0∞)) xy ∂μ = μ (A ⁻¹' s) := + lintegral_indicator_one (hA hs) + _ = Measure.map A μ s := (Measure.map_apply hA hs).symm + _ ≤ (J • μ) s := hmap s + _ = J * μ s := by + rw [Measure.smul_apply, smul_eq_mul] + calc + ∫⁻ z, ∫⁻ xy, f (xy, z) ∂μ ∂ν ≤ ∫⁻ z, J * μ s ∂ν := + lintegral_mono_ae hfixed + _ = J * μ s * ν Set.univ := by + rw [lintegral_const] + _ = J * μ s := by + rw [MeasureTheory.measure_univ, mul_one] + _ = (J • μ) s := by rw [Measure.smul_apply, smul_eq_mul] + +/-- The diagonal convex average satisfies the powered finite-`L^p` Gagliardo +bound without caller-supplied Fubini section hypotheses. -/ +theorem lintegral_diagonalConvexApproxAverage_rpow_le_of_memLp + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) (p : FiniteLpExponent) + (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + ∫⁻ xy, ‖diagonalConvexApproxAverage ρ K x0 r ε xy‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q ≤ + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) * + ∫⁻ xy, ‖K xy‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure ρ + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let T := diagonalConvexApproxJointSample x0 r ε + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure hρ + let : SFinite ν := inferInstance + let : IsFiniteMeasure ν := inferInstance + let : IsFiniteMeasure μ := inferInstance + let : IsFiniteMeasure (μ.prod ν) := inferInstance + have hT : Measurable T := measurable_diagonalConvexApproxJointSample x0 r ε + have hmap : Measure.map T (μ.prod ν) ≤ J • μ := by + simpa only [μ, ν, J, T] using + (map_diagonalConvexApproxJointSample_le Q hρ hε hball hr hε0 hε1) + have hJtop : J ≠ ⊤ := by + dsimp only [J] + exact ENNReal.pow_ne_top ENNReal.ofReal_ne_top + have hKmap : MemLp K p.exponent (Measure.map T (μ.prod ν)) := + MemLp.of_measure_le_smul hJtop hmap hK + have hKT : MemLp (K ∘ T) p.exponent (μ.prod ν) := + (memLp_map_measure_iff hKmap.aestronglyMeasurable hT.aemeasurable).mp hKmap + have hsection : ∀ᵐ xy ∂μ, Integrable + (fun z => K (diagonalConvexApproxSample x0 z r ε xy)) ν := by + simpa only [T, diagonalConvexApproxJointSample, Function.comp_apply] using + (hKT.integrable (finiteLpExponent_one_le p)).prod_right_ae + have hsectionpow : ∀ᵐ xy ∂μ, Integrable + (fun z => ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ ^ p.exponent.toReal) ν := by + simpa only [T, diagonalConvexApproxJointSample, Function.comp_apply] using + (hKT.integrable_norm_rpow (finiteLpExponent_ne_zero p) + (finiteLpExponent_ne_top p)).prod_right_ae + have hpow_meas : AEMeasurable + (fun xyz : (Vec d × Vec d) × Vec d => + ‖K (diagonalConvexApproxSample x0 xyz.2 r ε xyz.1)‖ₑ ^ p.exponent.toReal) + (μ.prod ν) := by + simpa only [T, diagonalConvexApproxJointSample, Function.comp_apply] using! + (ENNReal.continuous_rpow_const.measurable.comp_aemeasurable + hKT.aestronglyMeasurable.enorm) + have hp_one_le_toReal : 1 ≤ p.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_le_toReal (by norm_num) (finiteLpExponent_ne_top p)).mpr + (finiteLpExponent_one_le p) + calc + ∫⁻ xy, ‖diagonalConvexApproxAverage ρ K x0 r ε xy‖ₑ ^ p.exponent.toReal ∂μ ≤ + ∫⁻ z, ∫⁻ xy, + ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ₑ ^ p.exponent.toReal ∂μ ∂ν := + lintegral_diagonalConvexApproxAverage_rpow_le μ hρ K x0 r ε + hp_one_le_toReal + hsection hsectionpow hpow_meas + _ = ∫⁻ xyz, ‖K (T xyz)‖ₑ ^ p.exponent.toReal ∂μ.prod ν := by + calc + ∫⁻ z, ∫⁻ xy, + ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ₑ ^ p.exponent.toReal ∂μ ∂ν = + ∫⁻ xy, ∫⁻ z, + ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ₑ ^ p.exponent.toReal ∂ν ∂μ := by + exact (lintegral_lintegral_swap hpow_meas).symm + _ = ∫⁻ xyz, ‖K (T xyz)‖ₑ ^ p.exponent.toReal ∂μ.prod ν := by + symm + exact lintegral_prod _ hpow_meas + _ = ∫⁻ xy, ‖K xy‖ₑ ^ p.exponent.toReal ∂Measure.map T (μ.prod ν) := by + symm + exact lintegral_map' + (ENNReal.continuous_rpow_const.measurable.comp_aemeasurable + hKmap.aestronglyMeasurable.enorm) hT.aemeasurable + _ ≤ ∫⁻ xy, ‖K xy‖ₑ ^ p.exponent.toReal ∂J • μ := + lintegral_mono' hmap le_rfl + _ = J * ∫⁻ xy, ‖K xy‖ₑ ^ p.exponent.toReal ∂μ := by + rw [lintegral_smul_measure, smul_eq_mul] + +private theorem diagonalConvexApproxAverage_aestronglyMeasurable + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (p : FiniteLpExponent) (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + AEStronglyMeasurable (diagonalConvexApproxAverage ρ K x0 r ε) + (Gagliardo.gagliardoCubeMeasure Q) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure ρ + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let T := diagonalConvexApproxJointSample x0 r ε + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure hρ + let : SFinite ν := inferInstance + let : IsFiniteMeasure ν := inferInstance + let : IsFiniteMeasure μ := inferInstance + let : IsFiniteMeasure (μ.prod ν) := inferInstance + have hT : Measurable T := measurable_diagonalConvexApproxJointSample x0 r ε + have hmap : Measure.map T (μ.prod ν) ≤ J • μ := by + simpa only [μ, ν, J, T] using + (map_diagonalConvexApproxJointSample_le Q hρ hε hball hr hε0 hε1) + have hJtop : J ≠ ⊤ := by + dsimp only [J] + exact ENNReal.pow_ne_top ENNReal.ofReal_ne_top + have hKmap : MemLp K p.exponent (Measure.map T (μ.prod ν)) := + MemLp.of_measure_le_smul hJtop hmap hK + have hKT : MemLp (K ∘ T) p.exponent (μ.prod ν) := + (memLp_map_measure_iff hKmap.aestronglyMeasurable hT.aemeasurable).mp hKmap + have haverage : diagonalConvexApproxAverage ρ K x0 r ε = + fun xy => ∫ z, (K ∘ T) (xy, z) ∂ν := by + funext xy + exact diagonalConvexApproxAverage_eq_integral_kernelMeasure hρ K x0 r ε xy + rw [haverage] + exact hKT.aestronglyMeasurable.integral_prod_right' + +/-- The unconditional finite-`L^p` norm form of the diagonal Gagliardo +average bound. -/ +theorem eLpNorm_diagonalConvexApproxAverage_le_of_memLp + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) (p : FiniteLpExponent) + (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + eLpNorm (diagonalConvexApproxAverage ρ K x0 r ε) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) ≤ + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) ^ (1 / p.exponent).toReal * + eLpNorm K p.exponent (Gagliardo.gagliardoCubeMeasure Q) := by + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + have hpow := lintegral_diagonalConvexApproxAverage_rpow_le_of_memLp + Q p K hK hρ hε hball hr hε0 hε1 + have hp_inv : (1 / p.exponent).toReal = 1 / p.exponent.toReal := by + simpa only [one_div] using ENNReal.toReal_inv p.exponent + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal (finiteLpExponent_ne_zero p) + (finiteLpExponent_ne_top p) + (diagonalConvexApproxAverage_aestronglyMeasurable Q p K hK hρ hε hball hr hε0 hε1), + eLpNorm_eq_lintegral_rpow_enorm_toReal (finiteLpExponent_ne_zero p) + (finiteLpExponent_ne_top p) hK.aestronglyMeasurable] + rw [← hp_inv, ← ENNReal.mul_rpow_of_nonneg _ _ (by positivity)] + exact ENNReal.rpow_le_rpow hpow (by positivity) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoSmoothing.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoSmoothing.lean new file mode 100644 index 0000000000..4ec21dfe08 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ConvexApproxGagliardoSmoothing.lean @@ -0,0 +1,328 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative +public import Mathlib.Analysis.Convex.Integral +public import Mathlib.Analysis.Convex.SpecificFunctions.Basic +public import Mathlib.Analysis.Normed.Module.Convex +public import Mathlib.MeasureTheory.Integral.Prod + +/-! +# Diagonal convex smoothing of fractional kernels + +The inward convex smoother acts on a fractional difference quotient by +sampling both variables with the same affine map. This module records that +operator separately from the source-facing fractional Sobolev API. Its +measure estimates are the analytic input for smooth density on cubes. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- Apply one inward affine sample map simultaneously to both arguments of a +fractional kernel. -/ +def diagonalConvexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) : + Vec d × Vec d → Vec d × Vec d := + fun xy => (convexApproxSample x0 z r ε xy.1, + convexApproxSample x0 z r ε xy.2) + +@[simp] theorem diagonalConvexApproxSample_apply {d : ℕ} (x0 z : Vec d) + (r ε : ℝ) (xy : Vec d × Vec d) : + diagonalConvexApproxSample x0 z r ε xy = + (convexApproxSample x0 z r ε xy.1, + convexApproxSample x0 z r ε xy.2) := rfl + +/-- Average a vector-valued Gagliardo kernel along the diagonal inward affine +samples. This is deliberately an internal analytic operator, not a new +fractional-Sobolev norm. -/ +noncomputable def diagonalConvexApproxAverage {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + (ρ : Vec d → ℝ) (H : Vec d × Vec d → E) (x0 : Vec d) (r ε : ℝ) + (xy : Vec d × Vec d) : E := + ∫ z in tsupport ρ, ρ z • H (diagonalConvexApproxSample x0 z r ε xy) + +/-- The probability measure associated with a nonnegative unit-mass convex +approximation kernel. -/ +noncomputable def convexApproxKernelMeasure {d : ℕ} (ρ : Vec d → ℝ) : + Measure (Vec d) := + volume.withDensity fun z => ENNReal.ofReal (ρ z) + +theorem isProbabilityMeasure_convexApproxKernelMeasure {d : ℕ} + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) : + IsProbabilityMeasure (convexApproxKernelMeasure ρ) := by + apply isProbabilityMeasure_withDensity_ofReal hρ.nonneg + · exact (hρ.continuous.integrable_of_hasCompactSupport hρ.compactSupport) + · rw [← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + (fun z hz => image_eq_zero_of_notMem_tsupport hz)] + exact hρ.setIntegral_one + +@[simp] theorem diagonalConvexApproxAverage_apply {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + (ρ : Vec d → ℝ) (H : Vec d × Vec d → E) (x0 : Vec d) (r ε : ℝ) + (xy : Vec d × Vec d) : + diagonalConvexApproxAverage ρ H x0 r ε xy = + ∫ z in tsupport ρ, ρ z • H (diagonalConvexApproxSample x0 z r ε xy) := rfl + +/-- Recast a kernel-weighted set integral as a Bochner integral against the +probability measure carried by the smoothing kernel. -/ +theorem setIntegral_smul_eq_integral_convexApproxKernelMeasure {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + (G : Vec d → E) : + (∫ z in tsupport ρ, ρ z • G z) = ∫ z, G z + ∂convexApproxKernelMeasure ρ := by + symm + have hmeasure : + (fun z => ENNReal.ofReal (ρ z)) = + fun z => (Real.toNNReal (ρ z) : ℝ≥0∞) := by + funext z + rw [ENNReal.ofReal_eq_coe_nnreal (hρ.nonneg z), + Real.toNNReal_of_nonneg (hρ.nonneg z)] + rw [convexApproxKernelMeasure, hmeasure, + integral_withDensity_eq_integral_smul₀ + hρ.continuous.measurable.real_toNNReal.aemeasurable] + have hzero : ∀ z ∉ tsupport ρ, + Real.toNNReal (ρ z) • G z = 0 := by + intro z hz + simp [image_eq_zero_of_notMem_tsupport hz] + rw [← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero] + apply MeasureTheory.setIntegral_congr_fun (isClosed_tsupport ρ).measurableSet + intro z hz + change (Real.toNNReal (ρ z) : ℝ) • + G z = ρ z • G z + rw [Real.coe_toNNReal _ (hρ.nonneg z)] + +/-- Recast the diagonal average as a Bochner integral against the probability +measure carried by the smoothing kernel. -/ +theorem diagonalConvexApproxAverage_eq_integral_kernelMeasure {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + (H : Vec d × Vec d → E) (x0 : Vec d) (r ε : ℝ) (xy : Vec d × Vec d) : + diagonalConvexApproxAverage ρ H x0 r ε xy = + ∫ z, H (diagonalConvexApproxSample x0 z r ε xy) + ∂convexApproxKernelMeasure ρ := by + exact setIntegral_smul_eq_integral_convexApproxKernelMeasure hρ + (fun z => H (diagonalConvexApproxSample x0 z r ε xy)) + +/-- The simultaneous affine sampling map contracts Euclidean pair distances by +the scalar factor `1 - ε`. -/ +theorem euclideanDist_convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) + (hε : ε < 1) (x y : Vec d) : + euclideanDist (convexApproxSample x0 z r ε x) + (convexApproxSample x0 z r ε y) = + (1 - ε) * euclideanDist x y := by + have hrewrite : + convexApproxSample x0 z r ε x - convexApproxSample x0 z r ε y = + (1 - ε) • (x - y) := by + unfold convexApproxSample + module + rw [euclideanDist, hrewrite, euclideanNorm_smul, + abs_of_pos (sub_pos.mpr hε)] + rfl + +/-- Pulling a Euclidean fractional kernel through one diagonal affine sample +has the exact scaling dictated by the fractional order. -/ +theorem cubeEuclideanWspKernel_comp_diagonalConvexApproxSample {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (x0 z : Vec d) (r ε : ℝ) (hε : ε < 1) (xy : Vec d × Vec d) : + cubeEuclideanWspKernel s p + (fun x => F (convexApproxSample x0 z r ε x)) xy = + ((1 - ε) ^ (s.1 + (d : ℝ) / p.exponent.toReal)) • + cubeEuclideanWspKernel s p F + (diagonalConvexApproxSample x0 z r ε xy) := by + rcases xy with ⟨x, y⟩ + simp only [cubeEuclideanWspKernel_apply, diagonalConvexApproxSample_apply] + have hscale : 0 < 1 - ε := sub_pos.mpr hε + rw [euclideanDist_convexApproxSample x0 z r ε hε x y, + Real.mul_rpow hscale.le (euclideanDist_nonneg x y), smul_smul] + have hpow : + (1 - ε) ^ (s.1 + (d : ℝ) / p.exponent.toReal) * + (1 - ε) ^ (-(s.1 + (d : ℝ) / p.exponent.toReal)) = 1 := by + rw [← Real.rpow_add hscale] + ring_nf + rw [Real.rpow_zero] + rw [← mul_assoc, hpow, one_mul] + +/-- The diagonal affine sampling map transports a product of restricted volume +measures with one Jacobian factor for each cube variable. -/ +theorem map_prod_restrict_diagonalConvexApproxSample + {d : ℕ} {U : Set (Vec d)} (hU : MeasurableSet U) + (x0 z : Vec d) (r ε : ℝ) (hε : ε < 1) : + Measure.map (diagonalConvexApproxSample x0 z r ε) + ((volume.restrict U).prod (volume.restrict U)) = + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) • + ((volume.restrict (convexApproxSample x0 z r ε '' U)).prod + (volume.restrict (convexApproxSample x0 z r ε '' U))) := by + have hdiag : diagonalConvexApproxSample x0 z r ε = + Prod.map (convexApproxSample x0 z r ε) (convexApproxSample x0 z r ε) := by + funext xy + rfl + rw [hdiag, ← Measure.map_prod_map (volume.restrict U) (volume.restrict U) + (measurableEmbedding_convexApproxSample x0 z r ε hε).measurable + (measurableEmbedding_convexApproxSample x0 z r ε hε).measurable] + rw [map_restrict_convexApproxSample hU x0 z r ε hε, + Measure.prod_smul_left, Measure.prod_smul_right, smul_smul, pow_two] + +/-- The corresponding transport formula for the normalized-first-variable +Gagliardo measure. The cube normalization is unchanged; the two affine +Jacobians are explicit. -/ +theorem map_gagliardoCubeMeasure_diagonalConvexApproxSample {d : ℕ} + (Q : TriadicCube d) (x0 z : Vec d) (r ε : ℝ) (hε : ε < 1) : + Measure.map (diagonalConvexApproxSample x0 z r ε) + (Gagliardo.gagliardoCubeMeasure Q) = + ENNReal.ofReal ((cubeVolume Q)⁻¹) • + ((ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2) • + ((volume.restrict (convexApproxSample x0 z r ε '' cubeSet Q)).prod + (volume.restrict (convexApproxSample x0 z r ε '' cubeSet Q)))) := by + have hmeas : Measurable (diagonalConvexApproxSample x0 z r ε) := + ((measurableEmbedding_convexApproxSample x0 z r ε hε).measurable.prodMap + (measurableEmbedding_convexApproxSample x0 z r ε hε).measurable) + rw [Gagliardo.gagliardoCubeMeasure, normalizedCubeMeasure, cubeMeasure, + Measure.prod_smul_left, Measure.map_smul _ hmeas.aemeasurable] + exact congrArg (ENNReal.ofReal ((cubeVolume Q)⁻¹) • ·) + (map_prod_restrict_diagonalConvexApproxSample (measurableSet_cubeSet Q) + x0 z r ε hε) + +/-- The `p`-th power of the norm is convex for the finite exponents used by +the fractional theory. -/ +theorem convexOn_norm_rpow {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + {q : ℝ} (hq : 1 ≤ q) : + ConvexOn ℝ Set.univ (fun v : E => ‖v‖ ^ q) := by + constructor + · exact convex_univ + intro x _ y _ a b ha hb hab + have hq0 : 0 ≤ q := le_trans zero_le_one hq + have hnorm : ‖a • x + b • y‖ ≤ a * ‖x‖ + b * ‖y‖ := by + simpa [smul_eq_mul] using + (convexOn_univ_norm.2 (Set.mem_univ x) (Set.mem_univ y) ha hb hab) + calc + ‖a • x + b • y‖ ^ q ≤ (a * ‖x‖ + b * ‖y‖) ^ q := + Real.rpow_le_rpow (norm_nonneg _) hnorm hq0 + _ ≤ a * ‖x‖ ^ q + b * ‖y‖ ^ q := by + simpa [smul_eq_mul] using + ((convexOn_rpow hq).2 (show ‖x‖ ∈ Set.Ici (0 : ℝ) by exact norm_nonneg _) + (show ‖y‖ ∈ Set.Ici (0 : ℝ) by exact norm_nonneg _) ha hb hab) + +/-- Pointwise vector Jensen followed by Tonelli. The averaging variable is +kept scalar, which avoids any measurable `Lp`-valued section construction. +This is the finite-`p` estimate used by diagonal Gagliardo averaging. -/ +theorem lintegral_enorm_rpow_integral_le_lintegral_lintegral + {α β E : Type*} [MeasurableSpace α] [MeasurableSpace β] + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (μ : Measure α) (ν : Measure β) [SFinite μ] [IsProbabilityMeasure ν] + {H : β → α → E} {q : ℝ} (hq : 1 ≤ q) + (hsection : ∀ᵐ x ∂μ, Integrable (fun z => H z x) ν) + (hsectionpow : ∀ᵐ x ∂μ, Integrable (fun z => ‖H z x‖ ^ q) ν) + (hpow_meas : AEMeasurable (fun xz : α × β => ‖H xz.2 xz.1‖ₑ ^ q) (μ.prod ν)) : + ∫⁻ x, ‖∫ z, H z x ∂ν‖ₑ ^ q ∂μ ≤ + ∫⁻ z, ∫⁻ x, ‖H z x‖ₑ ^ q ∂μ ∂ν := by + have hjensen : ∀ᵐ x ∂μ, + ‖∫ z, H z x ∂ν‖ₑ ^ q ≤ ∫⁻ z, ‖H z x‖ₑ ^ q ∂ν := by + filter_upwards [hsection, hsectionpow] with x hx hxp + have hq0 : 0 ≤ q := le_trans zero_le_one hq + have hreal : + ‖∫ z, H z x ∂ν‖ ^ q ≤ ∫ z, ‖H z x‖ ^ q ∂ν := by + have hconv : ConvexOn ℝ Set.univ (fun v : E => ‖v‖ ^ q) := + convexOn_norm_rpow hq + have hcont : ContinuousOn (fun v : E => ‖v‖ ^ q) Set.univ := by + exact (continuous_norm.rpow_const fun _ => Or.inr hq0).continuousOn + exact hconv.map_integral_le hcont isClosed_univ + (Filter.Eventually.of_forall fun _ => Set.mem_univ _) hx hxp + have hpow_eq : + ∫ z, ‖H z x‖ ^ q ∂ν = (∫⁻ z, ‖H z x‖ₑ ^ q ∂ν).toReal := by + rw [integral_eq_lintegral_of_nonneg_ae] + · congr 1 + apply lintegral_congr + intro z + rw [← ofReal_norm, + ← ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hq0] + · exact Filter.Eventually.of_forall fun _ => Real.rpow_nonneg (norm_nonneg _) _ + · exact hxp.aestronglyMeasurable + calc + ‖∫ z, H z x ∂ν‖ₑ ^ q = ENNReal.ofReal (‖∫ z, H z x ∂ν‖ ^ q) := by + rw [← ofReal_norm, + ← ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hq0] + _ ≤ ENNReal.ofReal (∫ z, ‖H z x‖ ^ q ∂ν) := ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal (∫⁻ z, ‖H z x‖ₑ ^ q ∂ν).toReal := by rw [hpow_eq] + _ ≤ ∫⁻ z, ‖H z x‖ₑ ^ q ∂ν := ENNReal.ofReal_toReal_le + calc + ∫⁻ x, ‖∫ z, H z x ∂ν‖ₑ ^ q ∂μ ≤ + ∫⁻ x, ∫⁻ z, ‖H z x‖ₑ ^ q ∂ν ∂μ := by + exact lintegral_mono_ae hjensen + _ = ∫⁻ z, ∫⁻ x, ‖H z x‖ₑ ^ q ∂μ ∂ν := + lintegral_lintegral_swap hpow_meas + +/-- Powered `L^p` control of an average against the convex kernel measure. +The three section hypotheses are analytic integrability obligations; later +transport lemmas discharge them from `MemLp` of a Gagliardo kernel. -/ +theorem lintegral_convexApproxKernelAverage_rpow_le + {d : ℕ} {α E : Type*} [MeasurableSpace α] + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (μ : Measure α) [SFinite μ] {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + (H : Vec d → α → E) {q : ℝ} (hq : 1 ≤ q) + (hsection : ∀ᵐ x ∂μ, Integrable (fun z => H z x) (convexApproxKernelMeasure ρ)) + (hsectionpow : ∀ᵐ x ∂μ, Integrable (fun z => ‖H z x‖ ^ q) + (convexApproxKernelMeasure ρ)) + (hpow_meas : AEMeasurable (fun xz : α × Vec d => ‖H xz.2 xz.1‖ₑ ^ q) + (μ.prod (convexApproxKernelMeasure ρ))) : + ∫⁻ x, ‖∫ z in tsupport ρ, ρ z • H z x‖ₑ ^ q ∂μ ≤ + ∫⁻ z, ∫⁻ x, ‖H z x‖ₑ ^ q ∂μ ∂convexApproxKernelMeasure ρ := by + let : IsProbabilityMeasure (convexApproxKernelMeasure ρ) := + isProbabilityMeasure_convexApproxKernelMeasure hρ + have hintegral : ∀ x, + (∫ z in tsupport ρ, ρ z • H z x) = + ∫ z, H z x ∂convexApproxKernelMeasure ρ := by + intro x + exact setIntegral_smul_eq_integral_convexApproxKernelMeasure hρ (fun z => H z x) + simp_rw [hintegral] + exact lintegral_enorm_rpow_integral_le_lintegral_lintegral μ + (convexApproxKernelMeasure ρ) hq hsection hsectionpow hpow_meas + +/-- The preceding Jensen--Tonelli estimate specialized to diagonal affine +sampling of a fractional kernel. -/ +theorem lintegral_diagonalConvexApproxAverage_rpow_le + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (μ : Measure (Vec d × Vec d)) [SFinite μ] + {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + (K : Vec d × Vec d → E) (x0 : Vec d) (r ε : ℝ) {q : ℝ} (hq : 1 ≤ q) + (hsection : ∀ᵐ xy ∂μ, Integrable + (fun z => K (diagonalConvexApproxSample x0 z r ε xy)) + (convexApproxKernelMeasure ρ)) + (hsectionpow : ∀ᵐ xy ∂μ, Integrable + (fun z => ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ ^ q) + (convexApproxKernelMeasure ρ)) + (hpow_meas : AEMeasurable + (fun xyz : (Vec d × Vec d) × Vec d => + ‖K (diagonalConvexApproxSample x0 xyz.2 r ε xyz.1)‖ₑ ^ q) + (μ.prod (convexApproxKernelMeasure ρ))) : + ∫⁻ xy, ‖diagonalConvexApproxAverage ρ K x0 r ε xy‖ₑ ^ q ∂μ ≤ + ∫⁻ z, ∫⁻ xy, + ‖K (diagonalConvexApproxSample x0 z r ε xy)‖ₑ ^ q ∂μ + ∂convexApproxKernelMeasure ρ := by + let : IsProbabilityMeasure (convexApproxKernelMeasure ρ) := + isProbabilityMeasure_convexApproxKernelMeasure hρ + have haverage : ∀ xy, + diagonalConvexApproxAverage ρ K x0 r ε xy = + ∫ z, K (diagonalConvexApproxSample x0 z r ε xy) + ∂convexApproxKernelMeasure ρ := by + intro xy + exact diagonalConvexApproxAverage_eq_integral_kernelMeasure hρ K x0 r ε xy + simp_rw [haverage] + exact lintegral_enorm_rpow_integral_le_lintegral_lintegral μ + (convexApproxKernelMeasure ρ) hq hsection hsectionpow hpow_meas + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Definitions.lean new file mode 100644 index 0000000000..75b614883f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/Definitions.lean @@ -0,0 +1,250 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.IntegralLpSeminorm +public import Mathlib.MeasureTheory.Measure.Prod +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms + +/-! +# Fractional Sobolev (Gagliardo) seminorms on triadic cubes + +This file defines the volume-normalized fractional Sobolev seminorm +`[u]_{W̲^{s,p}(□)}` of the manuscript (CG Chapter 1, "Fractional Sobolev +seminorms") as an `eLpNorm` of a difference-quotient kernel over a product +measure, together with the membership predicate `MemWsp` playing the role of +`u ∈ W^{s,p}(□)`. + +Design notes: + +* The kernel uses the ambient `Vec d` sup-norm distance, which differs from + the manuscript's Euclidean distance by a factor absorbed into dimensional + constants (uniformly in `s, p`, since the kernel exponent `s + d/p` is at + most `d + 1` on the manuscript range `s < 1 ≤ p`). +* The manuscript's `⨍∫` normalization is carried by the product measure + `gagliardoCubeMeasure` (normalized in the first slot, plain in the second), + not by an ad-hoc volume prefactor. +* At `p = ∞` the kernel exponent `s + d / p.toReal` collapses to `s` + (junk-value `d / 0 = 0`), so the seminorm degenerates to the essential + Hölder `C^{0,s}` seminorm, matching the manuscript's + `[·]_{C^{0,s}} ≈ [·]_{W̲^{s,∞}}` convention. +* Consumers must not unfold the definitions: the lemmas in the `Internal` + namespace are reserved for the comparison proof files. Everything else + goes through the exported API. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +variable {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + +/-- The kernel exponent `s + d/p`. At `p = ∞` it collapses to `s`. -/ +def kernelExponent (d : ℕ) (s : ℝ) (p : ℝ≥0∞) : ℝ := + s + (d : ℝ) / p.toReal + +theorem kernelExponent_top (d : ℕ) (s : ℝ) : + kernelExponent d s ∞ = s := by + simp [kernelExponent] + +/-- Difference-quotient kernel of the fractional Sobolev seminorm. -/ +noncomputable def gagliardoKernel (s : ℝ) (p : ℝ≥0∞) (u : Vec d → E) : + Vec d × Vec d → E := + fun z => (dist z.1 z.2 ^ (-kernelExponent d s p)) • (u z.1 - u z.2) + +theorem gagliardoKernel_apply (s : ℝ) (p : ℝ≥0∞) (u : Vec d → E) + (z : Vec d × Vec d) : + gagliardoKernel s p u z = + (dist z.1 z.2 ^ (-kernelExponent d s p)) • (u z.1 - u z.2) := rfl + +theorem gagliardoKernel_zero (s : ℝ) (p : ℝ≥0∞) : + gagliardoKernel s p (0 : Vec d → E) = 0 := by + funext z + simp [gagliardoKernel] + +theorem gagliardoKernel_add (s : ℝ) (p : ℝ≥0∞) (u v : Vec d → E) : + gagliardoKernel s p (u + v) = + gagliardoKernel s p u + gagliardoKernel s p v := by + funext z + simp only [gagliardoKernel, Pi.add_apply] + rw [show u z.1 + v z.1 - (u z.2 + v z.2) + = (u z.1 - u z.2) + (v z.1 - v z.2) by abel, smul_add] + +theorem gagliardoKernel_neg (s : ℝ) (p : ℝ≥0∞) (u : Vec d → E) : + gagliardoKernel s p (-u) = -gagliardoKernel s p u := by + funext z + simp only [gagliardoKernel, Pi.neg_apply] + rw [show -u z.1 - -u z.2 = -(u z.1 - u z.2) by abel, smul_neg] + +theorem gagliardoKernel_smul (s : ℝ) (p : ℝ≥0∞) (c : ℝ) (u : Vec d → E) : + gagliardoKernel s p (c • u) = c • gagliardoKernel s p u := by + funext z + simp only [gagliardoKernel, Pi.smul_apply] + rw [← smul_sub, smul_smul, smul_smul, mul_comm] + +/-- The manuscript's `⨍_□ ∫_□` normalization as a product measure: +normalized in the first variable, plain restricted volume in the second. -/ +noncomputable def gagliardoCubeMeasure (Q : TriadicCube d) : + Measure (Vec d × Vec d) := + (normalizedCubeMeasure Q).prod (cubeMeasure Q) + +instance instIsFiniteMeasureGagliardoCubeMeasure (Q : TriadicCube d) : + IsFiniteMeasure (gagliardoCubeMeasure Q) := by + have : IsFiniteMeasure (cubeMeasure Q) := + ⟨lt_top_iff_ne_top.2 (cubeMeasure_apply_univ_ne_top Q)⟩ + have : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + unfold gagliardoCubeMeasure + infer_instance + +instance instSFiniteGagliardoCubeMeasure (Q : TriadicCube d) : + SFinite (gagliardoCubeMeasure Q) := by + have : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + unfold gagliardoCubeMeasure + infer_instance + +/-- `[u]_{W̲^{s,p}(Q)}`, ℝ≥0∞-valued, defined for all `p ∈ [1,∞]` +(`p = ∞` gives the essential Hölder seminorm). -/ +noncomputable def cubeGagliardoESeminorm (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → E) : ℝ≥0∞ := + integralLpSeminorm (gagliardoKernel s p u) p (gagliardoCubeMeasure Q) + +/-- Real-valued fractional Sobolev seminorm (junk value `0` when infinite). -/ +noncomputable def cubeGagliardoSeminorm (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → E) : ℝ := + (cubeGagliardoESeminorm Q s p u).toReal + +/-- Unnormalized fractional Sobolev seminorm over an arbitrary set. -/ +noncomputable def gagliardoESeminormOn (A : Set (Vec d)) (s : ℝ) + (p : ℝ≥0∞) (u : Vec d → E) : ℝ≥0∞ := + integralLpSeminorm (gagliardoKernel s p u) p + ((MeasureTheory.volume.restrict A).prod (MeasureTheory.volume.restrict A)) + +/-- `u ∈ W^{s,p}(Q)`: the membership predicate, mirroring `MemLp`. -/ +def MemWsp (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) (u : Vec d → E) : Prop := + MemLp (gagliardoKernel s p u) p (gagliardoCubeMeasure Q) + +namespace Internal + +/-- Unfolding lemma, reserved for the comparison proof files. -/ +theorem cubeGagliardoESeminorm_def (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → E) + (hu : AEStronglyMeasurable (gagliardoKernel s p u) (gagliardoCubeMeasure Q)) : + cubeGagliardoESeminorm Q s p u = + eLpNorm (gagliardoKernel s p u) p (gagliardoCubeMeasure Q) := + integralLpSeminorm_eq_eLpNorm _ _ _ hu + +/-- Finite-`p` lintegral form, reserved for the comparison proof files. -/ +theorem cubeGagliardoESeminorm_eq_lintegral {Q : TriadicCube d} {s : ℝ} + {p : ℝ≥0∞} {u : Vec d → E} (hp0 : p ≠ 0) (hpt : p ≠ ∞) : + cubeGagliardoESeminorm Q s p u = + (∫⁻ z, ‖gagliardoKernel s p u z‖ₑ ^ p.toReal + ∂gagliardoCubeMeasure Q) ^ (1 / p.toReal) := by + simp only [cubeGagliardoESeminorm, integralLpSeminorm, if_neg hp0, if_neg hpt] + exact eLpNorm'_eq_lintegral_enorm (gagliardoKernel s p u) _ _ + +end Internal + +theorem MemWsp.aestronglyMeasurable {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + {u : Vec d → E} (h : MemWsp Q s p u) : + AEStronglyMeasurable (gagliardoKernel s p u) (gagliardoCubeMeasure Q) := + MemLp.aestronglyMeasurable h + +theorem MemWsp.eSeminorm_lt_top {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + {u : Vec d → E} (h : MemWsp Q s p u) : + cubeGagliardoESeminorm Q s p u < ∞ := by + rw [Internal.cubeGagliardoESeminorm_def _ _ _ _ h.aestronglyMeasurable] + exact MemLp.eLpNorm_lt_top h + +theorem memWsp_iff {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → E} : + MemWsp Q s p u ↔ + AEStronglyMeasurable (gagliardoKernel s p u) (gagliardoCubeMeasure Q) ∧ + cubeGagliardoESeminorm Q s p u < ∞ := by + constructor + · intro h + exact ⟨h.aestronglyMeasurable, h.eSeminorm_lt_top⟩ + · rintro ⟨hmeas, hfinite⟩ + rw [Internal.cubeGagliardoESeminorm_def _ _ _ _ hmeas] at hfinite + exact hfinite + +theorem MemWsp.add {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u v : Vec d → E} + (hu : MemWsp Q s p u) (hv : MemWsp Q s p v) : + MemWsp Q s p (u + v) := by + show MemLp (gagliardoKernel s p (u + v)) p (gagliardoCubeMeasure Q) + rw [gagliardoKernel_add] + exact MemLp.add hu hv + +theorem MemWsp.neg {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → E} + (hu : MemWsp Q s p u) : + MemWsp Q s p (-u) := by + show MemLp (gagliardoKernel s p (-u)) p (gagliardoCubeMeasure Q) + rw [gagliardoKernel_neg] + exact MemLp.neg hu + +theorem MemWsp.smul {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} {u : Vec d → E} + (c : ℝ) (hu : MemWsp Q s p u) : + MemWsp Q s p (c • u) := by + show MemLp (gagliardoKernel s p (c • u)) p (gagliardoCubeMeasure Q) + rw [gagliardoKernel_smul] + exact MemLp.const_smul hu c + +theorem cubeGagliardoESeminorm_zero (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) : + cubeGagliardoESeminorm Q s p (0 : Vec d → E) = 0 := by + simp only [cubeGagliardoESeminorm, gagliardoKernel_zero] + rw [integralLpSeminorm_eq_eLpNorm _ _ _ aestronglyMeasurable_zero] + exact eLpNorm_zero + +theorem cubeGagliardoESeminorm_neg (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → E) : + cubeGagliardoESeminorm Q s p (-u) = cubeGagliardoESeminorm Q s p u := by + simp only [cubeGagliardoESeminorm, gagliardoKernel_neg, integralLpSeminorm, + eLpNormEssSup_eq_essSup_enorm, Pi.neg_apply, enorm_neg, eLpNorm'_neg] + +theorem cubeGagliardoESeminorm_const_smul (Q : TriadicCube d) (s : ℝ) + (p : ℝ≥0∞) (c : ℝ) (u : Vec d → E) : + cubeGagliardoESeminorm Q s p (c • u) = + ‖c‖ₑ * cubeGagliardoESeminorm Q s p u := by + by_cases hp0 : p = 0 + · simp [cubeGagliardoESeminorm, integralLpSeminorm, hp0] + by_cases hpt : p = ∞ + · simp only [cubeGagliardoESeminorm, gagliardoKernel_smul, integralLpSeminorm, + if_neg hp0, if_pos hpt] + exact eLpNormEssSup_const_smul _ _ + · simp only [cubeGagliardoESeminorm, gagliardoKernel_smul, integralLpSeminorm, + if_neg hp0, if_neg hpt] + exact eLpNorm'_const_smul c (ENNReal.toReal_pos hp0 hpt) + +/-- Triangle inequality for the fractional Sobolev seminorm. -/ +theorem cubeGagliardoESeminorm_add_le {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + {u v : Vec d → E} (hp : 1 ≤ p) (hu : MemWsp Q s p u) (hv : MemWsp Q s p v) : + cubeGagliardoESeminorm Q s p (u + v) ≤ + cubeGagliardoESeminorm Q s p u + cubeGagliardoESeminorm Q s p v := by + rw [Internal.cubeGagliardoESeminorm_def _ _ _ _ (hu.add hv).aestronglyMeasurable, + Internal.cubeGagliardoESeminorm_def _ _ _ _ hu.aestronglyMeasurable, + Internal.cubeGagliardoESeminorm_def _ _ _ _ hv.aestronglyMeasurable, + gagliardoKernel_add] + exact eLpNorm_add_le hp + +theorem cubeGagliardoSeminorm_nonneg (Q : TriadicCube d) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → E) : + 0 ≤ cubeGagliardoSeminorm Q s p u := + ENNReal.toReal_nonneg + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/DefinitionsAPI.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/DefinitionsAPI.lean new file mode 100644 index 0000000000..c151632dc1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/DefinitionsAPI.lean @@ -0,0 +1,163 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions + +/-! +# Additional API for the fractional Sobolev seminorm + +Reuse-surface lemmas that are not needed by the `W^{s,p}` versus `B^s_{p,p}` +comparison proofs themselves: + +* the `p = ∞` Hölder-endpoint characterization; +* swap symmetry of the unnormalized `Set`-variant (the kernel is odd under + the pair swap, the seminorm even); +* the cube/`Set` relation (the `⨍∫` normalization is a volume factor at + power `1/p`); +* translation covariance along the triadic lattice (`translateCube`), via + the translation pushforward of the product measure. + +A.e.-congruence lemmas live in `CongruenceAE.lean`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory +open scoped ENNReal + +variable {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + +/-- At `p = ∞` the fractional Sobolev seminorm is the essential Hölder +`C^{0,s}` seminorm: the kernel exponent collapses to `s` and the `eLpNorm` +becomes an essential supremum. -/ +theorem cubeGagliardoESeminorm_top (Q : TriadicCube d) (s : ℝ) (u : Vec d → E) : + cubeGagliardoESeminorm Q s ∞ u = + essSup (fun z : Vec d × Vec d => + ‖(dist z.1 z.2 ^ (-s)) • (u z.1 - u z.2)‖ₑ) + (gagliardoCubeMeasure Q) := by + simp only [cubeGagliardoESeminorm, integralLpSeminorm, ENNReal.top_ne_zero, + if_false, if_true, eLpNormEssSup, gagliardoKernel, kernelExponent_top] + +/-- Swap symmetry of the unnormalized seminorm: precomposing the kernel with +the pair swap changes nothing, since the kernel is odd under the swap and the +seminorm is even. -/ +theorem gagliardoESeminormOn_comp_swap (A : Set (Vec d)) (s : ℝ) (p : ℝ≥0∞) + (u : Vec d → E) : + integralLpSeminorm (gagliardoKernel s p u ∘ Prod.swap) p + ((MeasureTheory.volume.restrict A).prod + (MeasureTheory.volume.restrict A)) = + gagliardoESeminormOn A s p u := by + have hswap : gagliardoKernel s p u ∘ Prod.swap = + -(gagliardoKernel (d := d) s p u) := by + funext z + show gagliardoKernel s p u (z.2, z.1) = -(gagliardoKernel s p u z) + rw [gagliardoKernel_apply, gagliardoKernel_apply] + simp only [dist_comm z.2 z.1] + rw [show u z.2 - u z.1 = -(u z.1 - u z.2) by abel, smul_neg] + rw [hswap, gagliardoESeminormOn] + exact integralLpSeminorm_neg _ _ _ + +/-- Relation between the cube-normalized seminorm and the unnormalized +`Set`-variant: the manuscript's `⨍∫` normalization contributes the volume +factor at power `1/p`. -/ +theorem cubeGagliardoESeminorm_eq_smul_gagliardoESeminormOn + (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} (hpt : p ≠ ∞) (u : Vec d → E) : + cubeGagliardoESeminorm Q s p u = + ENNReal.ofReal (cubeVolume Q)⁻¹ ^ (1 / p).toReal • + gagliardoESeminormOn (Homogenization.cubeSet Q) s p u := by + have : SFinite (MeasureTheory.volume.restrict (Homogenization.cubeSet Q)) := + inferInstance + rw [cubeGagliardoESeminorm, gagliardoESeminormOn, + gagliardoCubeMeasure, Homogenization.normalizedCubeMeasure, + Homogenization.cubeMeasure, Measure.prod_smul_left, + integralLpSeminorm_smul_measure _ hpt, smul_eq_mul] + +section Translation + +/-- The real translation vector realizing `translateCube shift Q`. -/ +noncomputable def cubeShiftVector (shift : Fin d → ℤ) (Q : TriadicCube d) : + Vec d := + fun i => (shift i : ℝ) * cubeScaleFactor Q + +/-- Translation covariance of the fractional Sobolev seminorm: translating +the cube matches precomposing with the translation. Stated for `p ≠ 0, ∞` +(the manuscript range); the `p = ∞` endpoint can be added via the `essSup` +characterization if ever needed. -/ +theorem cubeGagliardoESeminorm_translate (shift : Fin d → ℤ) + (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} (hp0 : p ≠ 0) (hpt : p ≠ ∞) + (u : Vec d → E) : + cubeGagliardoESeminorm (translateCube shift Q) s p u = + cubeGagliardoESeminorm Q s p + (fun x => u (x + cubeShiftVector shift Q)) := by + set v := cubeShiftVector shift Q with hv + set T : Vec d ≃ᵐ Vec d := MeasurableEquiv.addRight v with hT + have hTapp : ∀ x, T x = x + v := fun x => rfl + -- volume is translation invariant + have hmapT : Measure.map T MeasureTheory.volume = MeasureTheory.volume := by + have hco : (⇑T : Vec d → Vec d) = (· + v) := rfl + rw [hco] + exact (measurePreserving_add_right MeasureTheory.volume v).map_eq + -- the translated cube's restricted volume is the pushforward + have hpre : (⇑T) ⁻¹' Homogenization.cubeSet (translateCube shift Q) = + Homogenization.cubeSet Q := by + ext x + simp only [Set.mem_preimage, hTapp, mem_cubeSet_translateCube_iff] + have : x + v - (fun i => (shift i : ℝ) * cubeScaleFactor Q) = x := by + funext i + simp [hv, cubeShiftVector] + rw [this] + have hres : MeasureTheory.volume.restrict + (Homogenization.cubeSet (translateCube shift Q)) = + Measure.map T (MeasureTheory.volume.restrict (Homogenization.cubeSet Q)) := by + rw [← hpre, ← Measure.restrict_map T.measurable + (Homogenization.measurableSet_cubeSet (translateCube shift Q)), hmapT] + -- volumes agree + have hvol : cubeVolume (translateCube shift Q) = cubeVolume Q := rfl + -- the Gagliardo product measure is the pushforward under the pair translation + have : SFinite (MeasureTheory.volume.restrict (Homogenization.cubeSet Q)) := + inferInstance + have hprod : gagliardoCubeMeasure (translateCube shift Q) = + Measure.map (Prod.map ⇑T ⇑T) (gagliardoCubeMeasure Q) := by + rw [gagliardoCubeMeasure, gagliardoCubeMeasure, + Homogenization.normalizedCubeMeasure, Homogenization.normalizedCubeMeasure, + Homogenization.cubeMeasure, Homogenization.cubeMeasure, hvol, hres, + Measure.prod_smul_left, Measure.prod_smul_left, + Measure.map_prod_map _ _ T.measurable T.measurable, + Measure.map_smul _ (T.measurable.prodMap T.measurable).aemeasurable] + have hMP : MeasureTheory.MeasurePreserving (⇑(T.prodCongr T)) + (gagliardoCubeMeasure Q) (gagliardoCubeMeasure (translateCube shift Q)) := by + refine ⟨(T.prodCongr T).measurable, ?_⟩ + rw [hprod] + rfl + -- kernel covariance under the pair translation + have hker : ∀ z : Vec d × Vec d, + gagliardoKernel s p u ((T.prodCongr T) z) = + gagliardoKernel s p (fun x => u (x + v)) z := by + intro z + show gagliardoKernel s p u (T z.1, T z.2) = _ + rw [gagliardoKernel_apply, gagliardoKernel_apply, hTapp, hTapp, + dist_add_right] + -- conclude through the lintegral form + rw [Internal.cubeGagliardoESeminorm_eq_lintegral hp0 hpt, + Internal.cubeGagliardoESeminorm_eq_lintegral hp0 hpt] + congr 1 + rw [MeasurePreserving.lintegral_map_equiv _ (T.prodCongr T) hMP] + refine lintegral_congr fun z => ?_ + rw [hker] + +end Translation + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ENNRealBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ENNRealBridge.lean new file mode 100644 index 0000000000..06977e03b4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ENNRealBridge.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.Overlap +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions + +/-! +# ℝ≥0∞ bridge for the overlap Besov pieces + +The overlap Besov seminorms are real-valued (`eLpNorm`-`.toReal` style); the +comparison estimates run in `ℝ≥0∞`. This file performs the `ofReal`/`toReal` +crossing **once**: each real Besov piece is rewritten as (or bounded by) its +`ℝ≥0∞` counterpart here, and the proof files never touch `toReal` again. + +Bridge lemmas toward the Gagliardo side are stated as junk-value-safe +inequalities (`≤`), which hold without integrability hypotheses; equalities +hold under `MemLp` and are provided where needed. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory +open scoped ENNReal BigOperators + +variable {d : ℕ} + +/-- BR4 (junk-safe): the `p`-th power of the overlap oscillation, pushed to +`ℝ≥0∞`, is at most the corresponding `eLpNorm` power. No integrability +hypothesis: if the `eLpNorm` is infinite the right side is `∞`. -/ +theorem ofReal_oscillation_rpow_le (S : TriadicCube d) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) ≤ + (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S)) ^ p.toReal := by + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [ENNReal.toReal_rpow] + exact ENNReal.ofReal_toReal_le.trans + (ENNReal.rpow_le_rpow (integralLpSeminorm_le_eLpNorm _ _ _) ENNReal.toReal_nonneg) + +/-- BR3: the depth average crosses to `ℝ≥0∞` as an explicit averaged sum. -/ +theorem ofReal_depthAverage_eq (Q : TriadicCube d) (j : ℕ) (p : ℝ≥0∞) + (u : Vec d → ℝ) : + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u j) = + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + have hcard : (0 : ℝ) < ((ScalarOverlap.centersAtDepth Q j).card : ℝ) := by + exact_mod_cast ScalarOverlap.centersAtDepth_card_pos Q j + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + rw [ENNReal.ofReal_mul (le_of_lt (inv_pos.2 hcard))] + rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast] + rw [ENNReal.ofReal_sum_of_nonneg fun S _hS => + Real.rpow_nonneg (cubeBesovOverlapOscillation_nonneg S p u) _] + +/-- BR2: the depth seminorm's `p`-th power crosses to `ℝ≥0∞` as +weight-power times depth average. -/ +theorem ofReal_depthSeminorm_rpow_eq (Q : TriadicCube d) (s : ℝ) {p : ℝ≥0∞} + (hp0 : p ≠ 0) (hpt : p ≠ ∞) (u : Vec d → ℝ) (j : ℕ) : + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) = + ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j ^ p.toReal) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u j) := by + have hpr : p.toReal ≠ 0 := + (ENNReal.toReal_pos hp0 hpt).ne' + have hw : 0 ≤ cubeBesovOverlapDepthWeight Q s j := + cubeBesovOverlapDepthWeight_nonneg Q s j + have ha : 0 ≤ cubeBesovOverlapDepthAverage Q p u j := + cubeBesovOverlapDepthAverage_nonneg Q p u j + unfold cubeBesovOverlapDepthSeminorm + rw [Real.mul_rpow hw (Real.rpow_nonneg ha _), one_div, + Real.rpow_inv_rpow ha hpr, + ENNReal.ofReal_mul (Real.rpow_nonneg hw _)] + +/-- BR1: the partial seminorm's `p`-th power crosses to `ℝ≥0∞` as the sum of +the depth-seminorm powers (diagonal case `q = p`). -/ +theorem ofReal_partialSeminorm_rpow_eq (Q : TriadicCube d) (s : ℝ) + {p : ℝ≥0∞} (hp0 : p ≠ 0) (hpt : p ≠ ∞) (N : ℕ) (u : Vec d → ℝ) : + ENNReal.ofReal (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) = + ∑ j ∈ Finset.range (N + 1), + ENNReal.ofReal (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := by + have hpr : p.toReal ≠ 0 := + (ENNReal.toReal_pos hp0 hpt).ne' + have hsum : 0 ≤ ∑ j ∈ Finset.range (N + 1), + cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal := + Finset.sum_nonneg fun j _hj => + Real.rpow_nonneg (cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) _ + unfold cubeBesovOverlapPartialSeminorm + rw [one_div, Real.rpow_inv_rpow hsum hpr] + rw [ENNReal.ofReal_sum_of_nonneg fun j _hj => + Real.rpow_nonneg (cubeBesovOverlapDepthSeminorm_nonneg Q s p u j) _] + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanGagliardoCoordinateBridgeP.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanGagliardoCoordinateBridgeP.lean new file mode 100644 index 0000000000..fca0e445b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanGagliardoCoordinateBridgeP.lean @@ -0,0 +1,567 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate + +/-! +# Finite-`p` Euclidean-to-coordinate Gagliardo bridge + +This module separates the two elementary changes which occur in the finite +exponent comparison: first replace the Euclidean distance in the vector +kernel by the project's ambient distance, and then compare that Hilbert-vector +kernel with its scalar coordinates. Every displayed constant is independent +of the fractional order `s ∈ (0,1)`. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The intermediate ambient-distance, Euclidean-vector kernel. Its scalar +coordinates are exactly the scalar Gagliardo kernels of the coordinates of +`F`; only its distance differs from `cubeEuclideanWspKernel`. -/ +noncomputable def cubeAmbientHilbertWspKernel {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) : + Vec d × Vec d → HilbertVec d := + fun z => + (dist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (F z.1 - F z.2) + +@[simp] theorem cubeAmbientHilbertWspKernel_apply {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + cubeAmbientHilbertWspKernel s p F z = + (dist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (F z.1 - F z.2) := rfl + +/-- The finite-`p` seminorm of the intermediate ambient-distance vector +kernel. -/ +noncomputable def cubeAmbientHilbertWspESeminorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := + eLpNorm' (cubeAmbientHilbertWspKernel s p F) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) + +theorem cubeAmbientHilbertWspESeminorm_eq_lintegral {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + cubeAmbientHilbertWspESeminorm Q s p F = + (∫⁻ z, ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q) ^ (1 / p.exponent.toReal) := by + unfold cubeAmbientHilbertWspESeminorm + exact eLpNorm'_eq_lintegral_enorm _ _ _ + +/-- The scalar coordinates of the intermediate vector kernel are precisely +the scalar ambient-distance Gagliardo kernels. -/ +theorem cubeAmbientHilbertWspKernel_coordinate {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) (i : Fin d) : + (cubeAmbientHilbertWspKernel s p F z) i = + Gagliardo.gagliardoKernel s.1 p.exponent (fun x => F x i) z := by + rw [cubeAmbientHilbertWspKernel_apply, Gagliardo.gagliardoKernel_apply] + simp only [Gagliardo.kernelExponent] + rfl + +/-- A direct Euclidean `L^p` field has scalar coordinate `L^p` fields on the +same cube. -/ +theorem cubeEuclideanLp_coordinate_memLp {d : ℕ} {Q : TriadicCube d} + {p : FiniteLpExponent} (F : CubeEuclideanLpField Q p) (i : Fin d) : + MemLp (fun x => F x i) p.exponent (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using F.euclideanMemLp.eval_piLp i + +/-- Exact powered-kernel identity for the intermediate ambient-distance +Hilbert-vector kernel. -/ +theorem cubeAmbientHilbertWspKernel_enorm_rpow {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal = + ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * p.exponent.toReal + d))) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := by + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hp.le] + simp only [cubeAmbientHilbertWspKernel_apply, norm_smul, Real.norm_eq_abs, + abs_of_nonneg (Real.rpow_nonneg dist_nonneg _), ← euclideanNorm_eq_norm_ofVec] + rw [Real.mul_rpow (Real.rpow_nonneg dist_nonneg _) (euclideanNorm_nonneg _)] + calc + ENNReal.ofReal + ((dist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) ^ + p.exponent.toReal * euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) = + ENNReal.ofReal + ((dist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := + ENNReal.ofReal_mul + (Real.rpow_nonneg (Real.rpow_nonneg dist_nonneg _) _) + _ = ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * p.exponent.toReal + d))) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := by + congr 2 + by_cases hxy : z.1 = z.2 + · rw [hxy] + simp only [dist_self] + have hfirst : 0 < s.1 + (d : ℝ) / p.exponent.toReal := + add_pos_of_pos_of_nonneg s.2.1 + (div_nonneg (Nat.cast_nonneg _) hp.le) + have hsecond : 0 < s.1 * p.exponent.toReal + d := + add_pos_of_pos_of_nonneg (mul_pos s.2.1 hp) (Nat.cast_nonneg _) + rw [Real.zero_rpow (neg_ne_zero.mpr hfirst.ne'), + Real.zero_rpow hp.ne', Real.zero_rpow (neg_ne_zero.mpr hsecond.ne')] + · have hdist : 0 < dist z.1 z.2 := dist_pos.mpr hxy + rw [← Real.rpow_mul hdist.le] + congr 1 + field_simp + +/-- Exact powered-kernel identity for the Euclidean-distance vector kernel. -/ +theorem cubeEuclideanWspKernel_enorm_rpow {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal = + ENNReal.ofReal (euclideanDist z.1 z.2 ^ (-(s.1 * p.exponent.toReal + d))) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := by + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hp.le] + simp only [norm_cubeEuclideanWspKernel] + rw [Real.mul_rpow (Real.rpow_nonneg (euclideanDist_nonneg _ _) _) + (euclideanNorm_nonneg _)] + calc + ENNReal.ofReal + ((euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) ^ + p.exponent.toReal * euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) = + ENNReal.ofReal + ((euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) ^ + p.exponent.toReal) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := + ENNReal.ofReal_mul + (Real.rpow_nonneg (Real.rpow_nonneg (euclideanDist_nonneg _ _) _) _) + _ = ENNReal.ofReal (euclideanDist z.1 z.2 ^ (-(s.1 * p.exponent.toReal + d))) * + ENNReal.ofReal (euclideanNorm (F z.1 - F z.2) ^ p.exponent.toReal) := by + congr 2 + by_cases hxy : z.1 = z.2 + · rw [hxy] + simp only [euclideanDist_self] + have hfirst : 0 < s.1 + (d : ℝ) / p.exponent.toReal := + add_pos_of_pos_of_nonneg s.2.1 + (div_nonneg (Nat.cast_nonneg _) hp.le) + have hsecond : 0 < s.1 * p.exponent.toReal + d := + add_pos_of_pos_of_nonneg (mul_pos s.2.1 hp) (Nat.cast_nonneg _) + rw [Real.zero_rpow (neg_ne_zero.mpr hfirst.ne'), + Real.zero_rpow hp.ne', Real.zero_rpow (neg_ne_zero.mpr hsecond.ne')] + · have hdist : 0 < euclideanDist z.1 z.2 := by + apply lt_of_le_of_ne (euclideanDist_nonneg _ _) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + rw [← Real.rpow_mul hdist.le] + congr 1 + field_simp + +/-- Pointwise, replacing the Euclidean distance by the ambient distance can +only increase the powered kernel. -/ +theorem cubeEuclideanWspKernel_rpow_le_ambientHilbert {d : ℕ} [NeZero d] + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal ≤ + ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal := by + rw [cubeEuclideanWspKernel_enorm_rpow, cubeAmbientHilbertWspKernel_enorm_rpow] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * p.exponent.toReal + d + let A : ℝ := euclideanNorm (F x - F y) ^ p.exponent.toReal + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have ha : 0 < a := + add_pos_of_pos_of_nonneg (mul_pos s.2.1 hp) (Nat.cast_nonneg _) + change ENNReal.ofReal (euclideanDist x y ^ (-a)) * ENNReal.ofReal A ≤ + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A + by_cases hxy : x = y + · subst y + simp [a, A] + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hpow : + Real.rpow (euclideanDist x y) (-a) ≤ Real.rpow (dist x y) (-a) := + Real.rpow_le_rpow_of_nonpos hdist (dist_le_euclideanDist x y) + (neg_nonpos.mpr ha.le) + calc + ENNReal.ofReal (euclideanDist x y ^ (-a)) * ENNReal.ofReal A = + ENNReal.ofReal A * ENNReal.ofReal (euclideanDist x y ^ (-a)) := mul_comm _ _ + _ ≤ ENNReal.ofReal A * ENNReal.ofReal (dist x y ^ (-a)) := + mul_le_mul_right (ENNReal.ofReal_le_ofReal hpow) _ + _ = ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A := mul_comm _ _ + +/-- Pointwise reverse metric comparison, before replacing its `s`-dependent +factor by the uniform finite-`p` factor. -/ +theorem ambientHilbertWspKernel_rpow_le_metric_factor_mul_euclidean + {d : ℕ} [NeZero d] (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) (z : Vec d × Vec d) : + ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal ≤ + ENNReal.ofReal ((d : ℝ) ^ (s.1 * p.exponent.toReal + d)) * + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal := by + rw [cubeAmbientHilbertWspKernel_enorm_rpow, cubeEuclideanWspKernel_enorm_rpow] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * p.exponent.toReal + d + let A : ℝ := euclideanNorm (F x - F y) ^ p.exponent.toReal + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have ha : 0 < a := + add_pos_of_pos_of_nonneg (mul_pos s.2.1 hp) (Nat.cast_nonneg _) + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + change ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A ≤ + ENNReal.ofReal ((d : ℝ) ^ a) * + (ENNReal.ofReal (euclideanDist x y ^ (-a)) * ENNReal.ofReal A) + by_cases hxy : x = y + · subst y + have hne : -a ≠ 0 := neg_ne_zero.mpr ha.ne' + rw [euclideanDist_self, dist_self, Real.zero_rpow hne] + simp + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hdenominator : + Real.rpow (euclideanDist x y) a ≤ + Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := by + calc + Real.rpow (euclideanDist x y) a ≤ + Real.rpow ((d : ℝ) * dist x y) a := + Real.rpow_le_rpow (euclideanDist_nonneg x y) + (euclideanDist_le_dimension_mul_dist x y) ha.le + _ = Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := + Real.mul_rpow hd.le dist_nonneg + have hA : 0 ≤ A := Real.rpow_nonneg (euclideanNorm_nonneg _) _ + have hdistPow : 0 < Real.rpow (dist x y) a := + Real.rpow_pos_of_pos hdist a + have heuclideanDistPow : 0 < Real.rpow (euclideanDist x y) a := + Real.rpow_pos_of_pos heuclideanDist a + have hreal : + Real.rpow (dist x y) (-a) * A ≤ + Real.rpow (d : ℝ) a * (Real.rpow (euclideanDist x y) (-a) * A) := by + have hdist_neg : + Real.rpow (dist x y) (-a) = (Real.rpow (dist x y) a)⁻¹ := + Real.rpow_neg hdist.le a + have heuclideanDist_neg : + Real.rpow (euclideanDist x y) (-a) = + (Real.rpow (euclideanDist x y) a)⁻¹ := + Real.rpow_neg heuclideanDist.le a + rw [hdist_neg, heuclideanDist_neg] + calc + (Real.rpow (dist x y) a)⁻¹ * A = + A / Real.rpow (dist x y) a := by rw [div_eq_mul_inv, mul_comm] + _ ≤ (Real.rpow (d : ℝ) a * A) / + Real.rpow (euclideanDist x y) a := by + rw [div_le_div_iff₀ hdistPow heuclideanDistPow] + calc + A * Real.rpow (euclideanDist x y) a ≤ + A * (Real.rpow (d : ℝ) a * Real.rpow (dist x y) a) := + mul_le_mul_of_nonneg_left hdenominator hA + _ = (Real.rpow (d : ℝ) a * A) * Real.rpow (dist x y) a := by ring + _ = Real.rpow (d : ℝ) a * + ((Real.rpow (euclideanDist x y) a)⁻¹ * A) := by + rw [div_eq_mul_inv] + ring + calc + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A = + ENNReal.ofReal (Real.rpow (dist x y) (-a) * A) := + (ENNReal.ofReal_mul (Real.rpow_nonneg dist_nonneg (-a))).symm + _ ≤ ENNReal.ofReal + (Real.rpow (d : ℝ) a * + (Real.rpow (euclideanDist x y) (-a) * A)) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal ((d : ℝ) ^ a) * + (ENNReal.ofReal (euclideanDist x y ^ (-a)) * ENNReal.ofReal A) := by + calc + ENNReal.ofReal ((d : ℝ) ^ a * + (euclideanDist x y ^ (-a) * A)) = + ENNReal.ofReal ((d : ℝ) ^ a) * + ENNReal.ofReal (euclideanDist x y ^ (-a) * A) := + ENNReal.ofReal_mul (Real.rpow_nonneg hd.le a) + _ = ENNReal.ofReal ((d : ℝ) ^ a) * + (ENNReal.ofReal (euclideanDist x y ^ (-a)) * ENNReal.ofReal A) := by + rw [ENNReal.ofReal_mul + (Real.rpow_nonneg (euclideanDist_nonneg _ _) _)] + +/-- The coordinate scalar Gagliardo energies, each raised to the exact finite +`p` power before summation. -/ +noncomputable def cubeCoordinateGagliardoPowerEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := + ∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i)) ^ + p.exponent.toReal + +private theorem scalar_gagliardoKernel_measurable {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (hF : Measurable F) (i : Fin d) : + Measurable (Gagliardo.gagliardoKernel s.1 p.exponent (fun x => F x i)) := by + unfold Gagliardo.gagliardoKernel + have hf : Measurable fun z : Vec d × Vec d => + dist z.1 z.2 ^ (-Gagliardo.kernelExponent d s.1 p.exponent) := + measurable_dist.pow measurable_const + have hg : Measurable fun z : Vec d × Vec d => + (fun x => F x i) z.1 - (fun x => F x i) z.2 := + ((continuous_apply i).measurable.comp (hF.comp measurable_fst)).sub + ((continuous_apply i).measurable.comp (hF.comp measurable_snd)) + exact hf.smul hg + +private theorem scalar_gagliardoKernel_enorm_rpow_measurable {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (hF : Measurable F) (i : Fin d) : + Measurable (fun z => + ‖Gagliardo.gagliardoKernel s.1 p.exponent (fun x => F x i) z‖ₑ ^ + p.exponent.toReal) := + (scalar_gagliardoKernel_measurable s p F hF i).enorm.pow measurable_const + +private theorem scalar_cubeGagliardoESeminorm_rpow_eq_lintegral {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (f : Vec d → ℝ) : + (Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent f) ^ + p.exponent.toReal = + ∫⁻ z, ‖Gagliardo.gagliardoKernel s.1 p.exponent f z‖ₑ ^ + p.exponent.toReal ∂Gagliardo.gagliardoCubeMeasure Q := by + rw [Gagliardo.Internal.cubeGagliardoESeminorm_eq_lintegral + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne] + rw [← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne).ne' + have hmul : 1 / p.exponent.toReal * p.exponent.toReal = 1 := by + field_simp + rw [hmul, ENNReal.rpow_one] + +/-- The finite coordinate energy is one product-measure integral of the sum +of the powered scalar kernels. -/ +theorem cubeCoordinateGagliardoPowerEnergy_eq_lintegral_sum {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) (hF : Measurable F) : + cubeCoordinateGagliardoPowerEnergy Q s p F = + ∫⁻ z, ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 p.exponent (fun x => F x i) z‖ₑ ^ + p.exponent.toReal ∂Gagliardo.gagliardoCubeMeasure Q := by + unfold cubeCoordinateGagliardoPowerEnergy + rw [Finset.sum_congr rfl fun i _ => + scalar_cubeGagliardoESeminorm_rpow_eq_lintegral Q s p (fun x => F x i)] + rw [← lintegral_finsetSum' Finset.univ] + intro i _ + exact (scalar_gagliardoKernel_enorm_rpow_measurable s p F hF i).aemeasurable + +/-- The powered Euclidean seminorm is exactly its kernel integral. -/ +theorem cubeEuclideanWspESeminorm_rpow_eq_lintegral {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal = + ∫⁻ z, ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + rw [cubeEuclideanWspESeminorm_eq_lintegral, ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne).ne' + have hmul : 1 / p.exponent.toReal * p.exponent.toReal = 1 := by + field_simp + rw [hmul, ENNReal.rpow_one] + +/-- The powered intermediate seminorm is exactly its kernel integral. -/ +theorem cubeAmbientHilbertWspESeminorm_rpow_eq_lintegral {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal = + ∫⁻ z, ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + rw [cubeAmbientHilbertWspESeminorm_eq_lintegral, ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne).ne' + have hmul : 1 / p.exponent.toReal * p.exponent.toReal = 1 := by + field_simp + rw [hmul, ENNReal.rpow_one] + +/-- Powered Euclidean fractional energy is bounded by the intermediate +ambient-distance Hilbert energy. -/ +theorem cubeEuclideanWspESeminorm_rpow_le_ambientHilbert {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal := by + rw [cubeEuclideanWspESeminorm_rpow_eq_lintegral, + cubeAmbientHilbertWspESeminorm_rpow_eq_lintegral] + exact lintegral_mono fun z => + cubeEuclideanWspKernel_rpow_le_ambientHilbert s p F z + +/-- The uniform metric factor for the reverse comparison. It depends only +on the dimension and finite exponent, never on `s`. -/ +noncomputable def cubeEuclideanWspMetricComparisonConstant + (d : ℕ) (p : FiniteLpExponent) : ℝ≥0∞ := + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + p.exponent.toReal)) + +theorem cubeEuclideanWspMetricComparisonConstant_lt_top + (d : ℕ) (p : FiniteLpExponent) : + cubeEuclideanWspMetricComparisonConstant d p < ∞ := + ENNReal.ofReal_lt_top + +private theorem metric_factor_le_uniform_metricComparisonConstant {d : ℕ} [NeZero d] + (s : FractionalOrder) (p : FiniteLpExponent) : + ENNReal.ofReal ((d : ℝ) ^ (s.1 * p.exponent.toReal + d)) ≤ + cubeEuclideanWspMetricComparisonConstant d p := by + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hd : 1 ≤ (d : ℝ) := by + exact_mod_cast Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero (NeZero.ne d)) + apply ENNReal.ofReal_le_ofReal + apply Real.rpow_le_rpow_of_exponent_le hd + have hs : s.1 * p.exponent.toReal ≤ p.exponent.toReal := by + calc + s.1 * p.exponent.toReal ≤ 1 * p.exponent.toReal := + mul_le_mul_of_nonneg_right s.2.2.le hp.le + _ = p.exponent.toReal := one_mul _ + linarith + +/-- The intermediate ambient-distance energy is bounded by the Euclidean +energy with an explicit constant uniform in the fractional order. -/ +theorem cubeAmbientHilbertWspESeminorm_rpow_le_metricComparisonConstant_mul + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + cubeEuclideanWspMetricComparisonConstant d p * + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal := by + rw [cubeAmbientHilbertWspESeminorm_rpow_eq_lintegral, + cubeEuclideanWspESeminorm_rpow_eq_lintegral] + calc + (∫⁻ z, ‖cubeAmbientHilbertWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q) ≤ + ∫⁻ z, ENNReal.ofReal ((d : ℝ) ^ (s.1 * p.exponent.toReal + d)) * + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + refine lintegral_mono fun z => ?_ + exact ambientHilbertWspKernel_rpow_le_metric_factor_mul_euclidean s p F z + _ ≤ ∫⁻ z, cubeEuclideanWspMetricComparisonConstant d p * + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + refine lintegral_mono fun z => ?_ + exact mul_le_mul_left + (metric_factor_le_uniform_metricComparisonConstant (d := d) s p) _ + _ = cubeEuclideanWspMetricComparisonConstant d p * + ∫⁻ z, ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q := by + rw [lintegral_const_mul' _ _ + (cubeEuclideanWspMetricComparisonConstant_lt_top d p).ne] + +/-- The sum of scalar coordinate Gagliardo `p`-energies is controlled by the +intermediate Hilbert-vector energy. -/ +theorem cubeCoordinateGagliardoPowerEnergy_le_dimension_mul_ambientHilbert + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + cubeCoordinateGagliardoPowerEnergy Q s p F ≤ + (d : ℝ≥0∞) * + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal := by + unfold cubeCoordinateGagliardoPowerEnergy + calc + _ ≤ ∑ _i : Fin d, + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal := by + apply Finset.sum_le_sum + intro i _ + rw [scalar_cubeGagliardoESeminorm_rpow_eq_lintegral, + cubeAmbientHilbertWspESeminorm_rpow_eq_lintegral] + apply lintegral_mono + intro z + apply ENNReal.rpow_le_rpow _ ENNReal.toReal_nonneg + rw [← cubeAmbientHilbertWspKernel_coordinate s p F z i] + rw [← ofReal_norm, ← ofReal_norm] + apply ENNReal.ofReal_le_ofReal + simpa only [Real.norm_eq_abs] using + HilbertVec.abs_apply_le_norm (cubeAmbientHilbertWspKernel s p F z) i + _ = _ := by simp [nsmul_eq_mul] + +/-- The explicit finite-dimensional coordinate factor in the reverse +Hilbert-vector comparison. -/ +noncomputable def cubeCoordinateGagliardoComparisonConstant + (d : ℕ) (p : FiniteLpExponent) : ℝ≥0∞ := + ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + (d : ℝ≥0∞) ^ (p.exponent.toReal - 1) + +theorem cubeCoordinateGagliardoComparisonConstant_lt_top + (d : ℕ) (p : FiniteLpExponent) : + cubeCoordinateGagliardoComparisonConstant d p < ∞ := by + unfold cubeCoordinateGagliardoComparisonConstant + exact ENNReal.mul_lt_top + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg enorm_ne_top) + (ENNReal.rpow_lt_top_of_nonneg + (sub_nonneg.mpr (by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.lt_top.ne p.one_lt.le)) + (ENNReal.natCast_ne_top d)) + +/-- The intermediate Hilbert-vector `p`-energy is bounded by the finite sum +of scalar coordinate Gagliardo energies. -/ +theorem cubeAmbientHilbertWspESeminorm_rpow_le_coordinateGagliardoPowerEnergy + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) (hF : Measurable F) : + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + cubeCoordinateGagliardoComparisonConstant d p * + cubeCoordinateGagliardoPowerEnergy Q s p F := by + have hcoord : ∀ i : Fin d, + AEStronglyMeasurable + (fun z => (cubeAmbientHilbertWspKernel s p F z).toVec i) + (Gagliardo.gagliardoCubeMeasure Q) := by + intro i + simpa only [HilbertVec.toVec, cubeAmbientHilbertWspKernel_coordinate] using + (scalar_gagliardoKernel_measurable s p F hF i).aestronglyMeasurable + have hkernel : AEStronglyMeasurable (cubeAmbientHilbertWspKernel s p F) + (Gagliardo.gagliardoCubeMeasure Q) := by + simpa only [HilbertVec.continuousLinearEquivVec_symm_apply, + HilbertVec.ofVec_toVec] using + ((HilbertVec.continuousLinearEquivVec d).symm.continuous.comp_aestronglyMeasurable + (AEMeasurable.of_eval (fun i => (hcoord i).aemeasurable)).aestronglyMeasurable) + have hscalar (i : Fin d) : + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i) = + eLpNorm (Gagliardo.gagliardoKernel s.1 p.exponent (fun x => F x i)) + p.exponent (Gagliardo.gagliardoCubeMeasure Q) := + Gagliardo.Internal.cubeGagliardoESeminorm_def _ _ _ _ + (scalar_gagliardoKernel_measurable s p F hF i).aestronglyMeasurable + have hambient : cubeAmbientHilbertWspESeminorm Q s p F = + eLpNorm (cubeAmbientHilbertWspKernel s p F) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := + (eLpNorm_eq_eLpNorm' (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + hkernel).symm + have hvector := euclidean_eLpNorm_rpow_le_dimension_rpow_mul_sum_rpow + (Gagliardo.gagliardoCubeMeasure Q) p + (fun z => (cubeAmbientHilbertWspKernel s p F z).toVec) hcoord + have hpowerSum := finiteLpExponent_rpow_sum_le_card_rpow_mul_sum_rpow + (fun i : Fin d => + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i)) p + calc + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + (∑ i : Fin d, + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i)) ^ + p.exponent.toReal := by + rw [hambient] + simp_rw [hscalar] + simpa only [HilbertVec.ofVec_toVec, + HilbertVec.toVec, cubeAmbientHilbertWspKernel_coordinate] using! hvector + _ ≤ ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + ((d : ℝ≥0∞) ^ (p.exponent.toReal - 1) * + cubeCoordinateGagliardoPowerEnergy Q s p F) := by + apply mul_le_mul_right + simpa only [cubeCoordinateGagliardoPowerEnergy, Fintype.card_fin] using hpowerSum + _ = cubeCoordinateGagliardoComparisonConstant d p * + cubeCoordinateGagliardoPowerEnergy Q s p F := by + rw [cubeCoordinateGagliardoComparisonConstant] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanH2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanH2.lean new file mode 100644 index 0000000000..45acaa6e49 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanH2.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.UnitCubeEuclideanL2 +public import Mathlib.Analysis.SpecialFunctions.Pow.Real +public import Mathlib.MeasureTheory.Measure.Prod + +/-! +# Exact Euclidean fractional `H^s` carrier on the centered unit cube + +This module is the literal `p = 2` fractional Sobolev side of the Chapter 1 +constant-coefficient Dirichlet argument. It deliberately does not identify +this seminorm with the continuous `K`-functional: that equivalence is a +separate analytic theorem. + +The project carrier `Vec d` retains its product norm. Both the domain metric +and the target magnitude below are instead spelled out through `euclideanDist` +and `HilbertVec.ofVec`, exactly as required by the source's Euclidean +convention for vector fields. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The source measure `fint_{□_0} dx ∫_{□_0} dy`: normalized volume in the +first variable and unnormalized restricted Lebesgue volume in the second. -/ +noncomputable def euclideanHsProductMeasure (d : ℕ) : Measure (Vec d × Vec d) := + (unitCenteredCubeDomain d).normalizedVolume.prod + (unitCenteredCubeDomain d).restrictedVolume + +/-- The literal nonnegative integrand +`|F(x)-F(y)|² / |x-y|^(d + 2s)` of the `p = 2` fractional Sobolev seminorm. +The numerator uses the Euclidean Hilbert realization, not the ambient `Vec` +norm. -/ +noncomputable def euclideanHsIntegrand {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : Vec d × Vec d → ℝ≥0∞ := + fun z => ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + +/-- The squared exact fractional Sobolev quantity, before the `1/2` power. -/ +noncomputable def euclideanHsEnergy {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + ∫⁻ z, euclideanHsIntegrand s F z ∂euclideanHsProductMeasure d + +/-- The exact extended `H^s` seminorm of a vector field on the centered unit +cube. It is extended-valued so that no non-finiteness is silently totalized. -/ +noncomputable def euclideanHsESeminorm {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : ℝ≥0∞ := + euclideanHsEnergy s F ^ ((2 : ℝ)⁻¹) + +/-- Membership in the exact fractional Euclidean `H^s` carrier: the literal +kernel is measurable and its source integral is finite. -/ +structure MemEuclideanHs {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : Prop where + integrand_aemeasurable : AEMeasurable (euclideanHsIntegrand s F) + (euclideanHsProductMeasure d) + energy_lt_top : euclideanHsEnergy s F < ∞ + +theorem euclideanHsEnergy_eq_lintegral {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + euclideanHsEnergy s F = + ∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂euclideanHsProductMeasure d := rfl + +theorem euclideanHsESeminorm_eq_lintegral {d : ℕ} (s : FractionalOrder) + (F : UnitCubeEuclideanL2Field d) : + euclideanHsESeminorm s F = + (∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂euclideanHsProductMeasure d) ^ ((2 : ℝ)⁻¹) := rfl + +theorem memEuclideanHs_iff {d : ℕ} {s : FractionalOrder} + {F : UnitCubeEuclideanL2Field d} : + MemEuclideanHs s F ↔ + AEMeasurable (euclideanHsIntegrand s F) (euclideanHsProductMeasure d) ∧ + euclideanHsEnergy s F < ∞ := by + constructor + · intro hF + exact ⟨hF.integrand_aemeasurable, hF.energy_lt_top⟩ + · rintro ⟨hmeas, hfin⟩ + exact ⟨hmeas, hfin⟩ + +private theorem ae_restrictedVolume_of_ae_normalizedVolume {d : ℕ} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + F =ᵐ[(unitCenteredCubeDomain d).restrictedVolume] G := by + rw [BoundedMeasurableDomain.normalizedVolume] at hFG + have hc := ENNReal.inv_ne_zero.mpr (unitCenteredCubeDomain d).volume_ne_top + unfold Filter.EventuallyEq at hFG ⊢ + rwa [ae_iff, Measure.smul_apply, smul_eq_mul, mul_eq_zero, or_iff_right hc, ← ae_iff] at hFG + +/-- Altering a datum on a normalized-volume null set does not alter the +literal double-integral integrand except on a product-measure null set. -/ +theorem euclideanHsIntegrand_congr_ae {d : ℕ} {s : FractionalOrder} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + euclideanHsIntegrand s F =ᵐ[euclideanHsProductMeasure d] + euclideanHsIntegrand s G := by + letI := (unitCenteredCubeDomain d).restrictedVolume_isFiniteMeasure + have hFG_restricted : F =ᵐ[(unitCenteredCubeDomain d).restrictedVolume] G := + ae_restrictedVolume_of_ae_normalizedVolume hFG + have hfst : (fun z : Vec d × Vec d => F z.1) =ᵐ[euclideanHsProductMeasure d] + fun z => G z.1 := by + rw [euclideanHsProductMeasure] + exact Measure.quasiMeasurePreserving_fst.ae_eq hFG + have hsnd : (fun z : Vec d × Vec d => F z.2) =ᵐ[euclideanHsProductMeasure d] + fun z => G z.2 := by + rw [euclideanHsProductMeasure] + exact Measure.quasiMeasurePreserving_snd.ae_eq hFG_restricted + filter_upwards [hfst, hsnd] with z hz1 hz2 + simp only [euclideanHsIntegrand, hz1, hz2] + +/-- The squared source integral is invariant under normalized-volume a.e. +replacement of the vector field. -/ +theorem euclideanHsEnergy_congr_ae {d : ℕ} {s : FractionalOrder} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + euclideanHsEnergy s F = euclideanHsEnergy s G := by + unfold euclideanHsEnergy + exact lintegral_congr_ae (euclideanHsIntegrand_congr_ae hFG) + +/-- The exact extended fractional seminorm is invariant under +normalized-volume a.e. replacement of the vector field. -/ +theorem euclideanHsESeminorm_congr_ae {d : ℕ} {s : FractionalOrder} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + euclideanHsESeminorm s F = euclideanHsESeminorm s G := by + unfold euclideanHsESeminorm + rw [euclideanHsEnergy_congr_ae hFG] + +/-- Exact fractional membership is stable under normalized-volume a.e. +replacement of the field. -/ +theorem memEuclideanHs_congr_ae {d : ℕ} {s : FractionalOrder} + {F G : UnitCubeEuclideanL2Field d} + (hFG : F =ᵐ[(unitCenteredCubeDomain d).normalizedVolume] G) : + MemEuclideanHs s F ↔ MemEuclideanHs s G := by + constructor + · intro hF + refine ⟨?_, ?_⟩ + · exact hF.integrand_aemeasurable.congr + (euclideanHsIntegrand_congr_ae hFG) + · rw [← euclideanHsEnergy_congr_ae hFG] + exact hF.energy_lt_top + · intro hG + refine ⟨?_, ?_⟩ + · exact hG.integrand_aemeasurable.congr + (euclideanHsIntegrand_congr_ae hFG.symm) + · rw [euclideanHsEnergy_congr_ae hFG] + exact hG.energy_lt_top + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWsp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWsp.lean new file mode 100644 index 0000000000..e33c3ad07f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWsp.lean @@ -0,0 +1,202 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions + +/-! +# Euclidean fractional Sobolev core + +The exact Chapter 3 Euclidean `W^(s,p)` kernel and full power norm on a +triadic cube. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +noncomputable def cubeEuclideanWspKernel {d : ℕ} (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + Vec d × Vec d → HilbertVec d := + fun z => + (euclideanDist z.1 z.2 ^ + (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (F z.1 - F z.2) + +@[simp] theorem cubeEuclideanWspKernel_apply {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + cubeEuclideanWspKernel s p F z = + (euclideanDist z.1 z.2 ^ + (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (F z.1 - F z.2) := rfl + +theorem norm_cubeEuclideanWspKernel {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (F : Vec d → Vec d) + (z : Vec d × Vec d) : + ‖cubeEuclideanWspKernel s p F z‖ = + (euclideanDist z.1 z.2 ^ + (-(s.1 + (d : ℝ) / p.exponent.toReal))) * + euclideanNorm (F z.1 - F z.2) := by + rw [cubeEuclideanWspKernel_apply, norm_smul, Real.norm_eq_abs, + abs_of_nonneg (Real.rpow_nonneg (euclideanDist_nonneg _ _) _), + ← euclideanNorm_eq_norm_ofVec] + +def MemCubeEuclideanWsp {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : Prop := + MemLp (cubeEuclideanWspKernel s p F) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) + +noncomputable def cubeEuclideanWspESeminorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := + eLpNorm' (cubeEuclideanWspKernel s p F) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) + +/-- For measurable kernels, the integral seminorm is Mathlib's `eLpNorm`. -/ +theorem cubeEuclideanWspESeminorm_eq_eLpNorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) + (hF : AEStronglyMeasurable (cubeEuclideanWspKernel s p F) + (Gagliardo.gagliardoCubeMeasure Q)) : + cubeEuclideanWspESeminorm Q s p F = eLpNorm (cubeEuclideanWspKernel s p F) + p.exponent (Gagliardo.gagliardoCubeMeasure Q) := + (eLpNorm_eq_eLpNorm' (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne hF).symm + +theorem cubeEuclideanWspESeminorm_eq_lintegral {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + cubeEuclideanWspESeminorm Q s p F = + (∫⁻ z, ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + ∂Gagliardo.gagliardoCubeMeasure Q) ^ + (1 / p.exponent.toReal) := by + unfold cubeEuclideanWspESeminorm + exact eLpNorm'_eq_lintegral_enorm _ _ _ + +theorem memCubeEuclideanWsp_iff {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} {F : Vec d → Vec d} : + MemCubeEuclideanWsp Q s p F ↔ + AEStronglyMeasurable (cubeEuclideanWspKernel s p F) + (Gagliardo.gagliardoCubeMeasure Q) ∧ + cubeEuclideanWspESeminorm Q s p F < ∞ := by + constructor + · intro hF + refine ⟨MemLp.aestronglyMeasurable hF, ?_⟩ + rw [cubeEuclideanWspESeminorm_eq_eLpNorm _ _ _ _ (MemLp.aestronglyMeasurable hF)] + exact MemLp.eLpNorm_lt_top hF + · rintro ⟨hmeas, hfinite⟩ + rw [cubeEuclideanWspESeminorm_eq_eLpNorm _ _ _ _ hmeas] at hfinite + exact hfinite + +theorem MemCubeEuclideanWsp.aestronglyMeasurable {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + {F : Vec d → Vec d} (hF : MemCubeEuclideanWsp Q s p F) : + AEStronglyMeasurable (cubeEuclideanWspKernel s p F) + (Gagliardo.gagliardoCubeMeasure Q) := + MemLp.aestronglyMeasurable hF + +theorem MemCubeEuclideanWsp.eSeminorm_lt_top {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + {F : Vec d → Vec d} (hF : MemCubeEuclideanWsp Q s p F) : + cubeEuclideanWspESeminorm Q s p F < ∞ := + (memCubeEuclideanWsp_iff.1 hF).2 + +structure CubeEuclideanWspField {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) + extends CubeEuclideanLpField Q p where + euclideanMemWsp : MemCubeEuclideanWsp Q s p toField + +namespace CubeEuclideanWspField + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : + CoeFun (CubeEuclideanWspField Q s p) (fun _ => Vec d → Vec d) where + coe F := F.toField + +theorem kernel_aestronglyMeasurable {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) : + AEStronglyMeasurable + (cubeEuclideanWspKernel s p F.toField) + (Gagliardo.gagliardoCubeMeasure Q) := + F.euclideanMemWsp.aestronglyMeasurable + +theorem eSeminorm_lt_top {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) : + cubeEuclideanWspESeminorm Q s p F.toField < ∞ := + F.euclideanMemWsp.eSeminorm_lt_top + +end CubeEuclideanWspField + +noncomputable def cubeEuclideanWspScalePowerWeight {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) : ℝ≥0∞ := + (ENNReal.ofReal (cubeScaleFactor Q)) ^ + (-s.1 * p.exponent.toReal) + +theorem cubeEuclideanWspScalePowerWeight_lt_top {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) : + cubeEuclideanWspScalePowerWeight Q s p < ∞ := by + unfold cubeEuclideanWspScalePowerWeight + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact lt_top_iff_ne_top.mpr + (ENNReal.rpow_ne_top_of_ne_zero + (ENNReal.ofReal_ne_zero_iff.mpr hscale) + ENNReal.ofReal_ne_top) + +noncomputable def cubeEuclideanWspFullENorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := + (cubeEuclideanWspScalePowerWeight Q s p * + ((cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F) ^ p.exponent.toReal + + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal) ^ + (p.exponent.toReal)⁻¹ + +theorem CubeEuclideanWspField.normalizedEuclideanLpENorm_lt_top + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (F : CubeEuclideanWspField Q s p) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField < ∞ := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (F.toField x)) + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using F.euclideanMemLp.norm.aestronglyMeasurable + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ hmeas, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using + F.euclideanMemLp.norm.eLpNorm_lt_top + +theorem CubeEuclideanWspField.fullENorm_lt_top {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) : + cubeEuclideanWspFullENorm Q s p F.toField < ∞ := by + unfold cubeEuclideanWspFullENorm + apply ENNReal.rpow_lt_top_of_nonneg (inv_nonneg.mpr ENNReal.toReal_nonneg) + exact (ENNReal.add_lt_top.mpr ⟨ + ENNReal.mul_lt_top + (cubeEuclideanWspScalePowerWeight_lt_top Q s p) + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg + F.normalizedEuclideanLpENorm_lt_top.ne), + ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg + F.eSeminorm_lt_top.ne⟩).ne + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualExtension.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualExtension.lean new file mode 100644 index 0000000000..6876d159ea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualExtension.lean @@ -0,0 +1,346 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import Mathlib.Analysis.Normed.Operator.Extend + +/-! +# Finite smooth-dual extension to the completed fractional-Sobolev graph + +On the finite locus of the smooth negative fractional-Sobolev dual norm, the +normalized pairing extends canonically from smooth tests to the completed +two-component graph. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +namespace CubeEuclideanWspSmoothTest + +private instance instSeminormedAddCommGroup {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + SeminormedAddCommGroup (CubeEuclideanWspSmoothTest Q s p) := + SeminormedAddCommGroup.induced _ _ (graph (Q := Q) (s := s) (p := p)) + +private instance instNormedSpace {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + NormedSpace ℝ (CubeEuclideanWspSmoothTest Q s p) := + NormedSpace.induced ℝ _ _ (graph (Q := Q) (s := s) (p := p)) + +private instance instCompletedGraphNormedAddCommGroup {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + NormedAddCommGroup (CubeEuclideanWspCompletedDualGraph Q s p) := by + unfold CubeEuclideanWspCompletedDualGraph completedGraphSubmodule + infer_instance + +private instance instCompletedGraphNormedSpace {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + NormedSpace ℝ (CubeEuclideanWspCompletedDualGraph Q s p) := by + unfold CubeEuclideanWspCompletedDualGraph completedGraphSubmodule + infer_instance + +private instance instCompletedGraphIsBoundedSMul {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + IsBoundedSMul ℝ (CubeEuclideanWspCompletedDualGraph Q s p) := + NormedSpace.toIsBoundedSMul + +private instance instCompletedGraphDualNormedAddCommGroup {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + NormedAddCommGroup (CubeEuclideanWspCompletedDualGraph Q s p →L[ℝ] ℝ) := by + unfold CubeEuclideanWspCompletedDualGraph completedGraphSubmodule + infer_instance + +/-- The normalized smooth pairing, bundled as a real linear functional. -/ +noncomputable def pairingLinearMap {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + CubeEuclideanWspSmoothTest Q s p.conjugate →ₗ[ℝ] ℝ where + toFun := cubeEuclideanNormalizedSmoothPairing F + map_add' h k := by + unfold cubeEuclideanNormalizedSmoothPairing + change (∫ x, vecDot (F.toField x) ((h + k).toField x) + ∂normalizedCubeMeasure Q) = + (∫ x, vecDot (F.toField x) (h.toField x) ∂normalizedCubeMeasure Q) + + ∫ x, vecDot (F.toField x) (k.toField x) ∂normalizedCubeMeasure Q + rw [toField_add] + simp only [Pi.add_apply, vecDot_add_right] + exact integral_add (cubeEuclideanNormalizedSmoothPairing_integrable F h) + (cubeEuclideanNormalizedSmoothPairing_integrable F k) + map_smul' c h := by + unfold cubeEuclideanNormalizedSmoothPairing + change (∫ x, vecDot (F.toField x) ((c • h).toField x) + ∂normalizedCubeMeasure Q) = + c • ∫ x, vecDot (F.toField x) (h.toField x) ∂normalizedCubeMeasure Q + rw [toField_smul] + simp only [Pi.smul_apply, vecDot_smul_right] + exact integral_const_mul c _ + +private theorem fullENorm_smul {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} (c : ℝ) + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspFullENorm Q s p (c • h).toField = + ‖c‖ₑ * cubeEuclideanWspFullENorm Q s p h.toField := by + rw [← graph_enorm_eq_cubeEuclideanWspFullENorm (c • h), + ← graph_enorm_eq_cubeEuclideanWspFullENorm h, graph.map_smul, enorm_smul] + +private theorem normalizedEuclideanLpENorm_eq_zero_of_fullENorm_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (f : Vec d → Vec d) (hf : cubeEuclideanWspFullENorm Q s p f = 0) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f = 0 := by + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f + let S := cubeEuclideanWspESeminorm Q s p f + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hW : W ≠ 0 := by + apply ne_of_gt + unfold W cubeEuclideanWspScalePowerWeight + exact ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top + have hbase : W * L ^ t + S ^ t = 0 := by + rw [← ENNReal.rpow_eq_zero_iff_of_pos (inv_pos.mpr ht)] + simpa only [cubeEuclideanWspFullENorm, L, S, W, t] using hf + have hterm : W * L ^ t = 0 := (add_eq_zero.mp hbase).1 + have hpow : L ^ t = 0 := (mul_eq_zero.mp hterm).resolve_left hW + exact (ENNReal.rpow_eq_zero_iff_of_pos ht).mp hpow + +private theorem pairing_eq_zero_of_fullENorm_eq_zero {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) + (hh : cubeEuclideanWspFullENorm Q s p h.toField = 0) : + cubeEuclideanNormalizedSmoothPairing F h = 0 := by + have hLp : (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent h.toField = 0 := + normalizedEuclideanLpENorm_eq_zero_of_fullENorm_eq_zero Q s p h.toField hh + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (h.toField x)) + (normalizedCubeMeasure Q) := by + simpa only [euclideanNorm_eq_norm_ofVec] using + (CubeEuclideanWspSmoothTest.euclideanMemLp_of_continuous Q + p.exponent h.contDiff.continuous).aestronglyMeasurable.norm + have hLp' : eLpNorm (fun x => euclideanNorm (h.toField x)) + p.exponent (normalizedCubeMeasure Q) = 0 := by + rw [← cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rw [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ (by + rwa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure])] at hLp + exact hLp + have hp_ne_zero : p.exponent ≠ 0 := ne_of_gt (lt_trans zero_lt_one p.one_lt) + have hnorm_zero : (fun x => euclideanNorm (h.toField x)) =ᵐ[ + normalizedCubeMeasure Q] 0 := + (eLpNorm_eq_zero_iff hp_ne_zero).mp hLp' + have hfield_zero : h.toField =ᵐ[normalizedCubeMeasure Q] 0 := by + filter_upwards [hnorm_zero] with x hx + exact euclideanNorm_eq_zero_iff.mp hx + unfold cubeEuclideanNormalizedSmoothPairing + apply integral_eq_zero_of_ae + filter_upwards [hfield_zero] with x hx + simp [hx, vecDot] + +/-- The sharp homogeneous smooth-pairing estimate, obtained by rescaling a +finite-norm smooth test into the defining unit ball. -/ +private theorem pairing_le_dual_mul_full {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) + (hNtop : cubeEuclideanWspFullENorm Q s p.conjugate h.toField < ∞) : + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + cubeEuclideanNegativeWspSmoothDualENorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + set N := cubeEuclideanWspFullENorm Q s p.conjugate h.toField + set D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + by_cases hNzero : N = 0 + · have hzero : cubeEuclideanNormalizedSmoothPairing F h = 0 := by + apply pairing_eq_zero_of_fullENorm_eq_zero Q s F h + simpa only [N] using hNzero + simp [hzero, hNzero] + · let r : ℝ := N.toReal⁻¹ + have hrpos : 0 < r := by + dsimp [r] + exact inv_pos.mpr (ENNReal.toReal_pos hNzero hNtop.ne) + let hs := r • h + have hhsnorm : cubeEuclideanWspFullENorm Q s p.conjugate hs.toField = 1 := by + change cubeEuclideanWspFullENorm Q s p.conjugate (r • h).toField = 1 + rw [fullENorm_smul] + change ‖r‖ₑ * N = 1 + have hr : ENNReal.ofReal r = N⁻¹ := by + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop.ne), + ENNReal.ofReal_toReal hNtop.ne] + rw [Real.enorm_eq_ofReal hrpos.le, hr, + ENNReal.inv_mul_cancel hNzero hNtop.ne] + let u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate := ⟨hs, hhsnorm.le⟩ + have hu : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| ≤ D := by + rw [show D = cubeEuclideanNegativeWspSmoothDualENorm Q s p F by rfl, + cubeEuclideanNegativeWspSmoothDualENorm] + exact le_iSup (fun u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate => + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F u.1|) u + have hpair : cubeEuclideanNormalizedSmoothPairing F hs = + r * cubeEuclideanNormalizedSmoothPairing F h := by + change pairingLinearMap F (r • h) = r * pairingLinearMap F h + simp only [LinearMap.map_smul, smul_eq_mul] + have hscaled : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| = + N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| := by + rw [hpair, abs_mul, abs_of_pos hrpos, ENNReal.ofReal_mul hrpos.le] + congr 1 + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop.ne), + ENNReal.ofReal_toReal hNtop.ne] + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| = + N * (N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h|) := by + rw [← mul_assoc, ENNReal.mul_inv_cancel hNzero hNtop.ne, one_mul] + _ = N * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| := by rw [hscaled] + _ ≤ N * D := mul_le_mul_right hu N + _ = D * N := mul_comm _ _ + +/-- The canonical extension of the smooth normalized pairing to the completed +fractional-Sobolev graph. -/ +noncomputable def completedPairingExtension {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (_hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) : + CubeEuclideanWspCompletedDualGraph Q s p.conjugate →L[ℝ] ℝ := + (pairingLinearMap F).extendOfNorm + (graphToCompleted (Q := Q) (s := s) (p := p.conjugate)) + +private theorem smooth_fullENorm_lt_top {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspFullENorm Q s p h.toField < ∞ := by + rw [← graph_enorm_eq_cubeEuclideanWspFullENorm h] + exact enorm_lt_top + +private theorem norm_graphToCompleted_eq_fullENorm_toReal {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ‖graphToCompleted (Q := Q) (s := s) (p := p) h‖ = + (cubeEuclideanWspFullENorm Q s p h.toField).toReal := by + change ‖graph (Q := Q) (s := s) (p := p) h‖ = _ + rw [← toReal_enorm] + exact congrArg ENNReal.toReal (graph_enorm_eq_cubeEuclideanWspFullENorm h) + +private theorem pairing_norm_bound_of_dual_finite {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) : + ‖pairingLinearMap F h‖ ≤ + (cubeEuclideanNegativeWspSmoothDualENorm Q s p F).toReal * + ‖graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h‖ := by + let D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + let N := cubeEuclideanWspFullENorm Q s p.conjugate h.toField + have hNtop : N < ∞ := smooth_fullENorm_lt_top h + have hbound := pairing_le_dual_mul_full Q s p F h hNtop + have hreal := (ENNReal.toReal_le_toReal ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top hD.ne hNtop.ne)).mpr hbound + change |cubeEuclideanNormalizedSmoothPairing F h| ≤ D.toReal * + ‖graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h‖ + rw [norm_graphToCompleted_eq_fullENorm_toReal] + rw [ENNReal.toReal_ofReal (abs_nonneg _), ENNReal.toReal_mul] at hreal + simpa only [D, N] using hreal + +/-- On the finite dual-norm locus, the completed pairing agrees exactly with +the normalized smooth pairing on every smooth graph point. -/ +theorem completedPairingExtension_apply_graphToCompleted {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) : + completedPairingExtension F hD + (graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h) = + cubeEuclideanNormalizedSmoothPairing F h := by + apply LinearMap.extendOfNorm_eq + (denseRange_graphToCompleted (Q := Q) (s := s) (p := p.conjugate)) + refine ⟨(cubeEuclideanNegativeWspSmoothDualENorm Q s p F).toReal, ?_⟩ + exact pairing_norm_bound_of_dual_finite F hD + +/-- The finite-locus extension is unique among continuous linear maps that +agree with the normalized pairing on the dense smooth graph. -/ +theorem completedPairingExtension_unique {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) + (G : CubeEuclideanWspCompletedDualGraph Q s p.conjugate →L[ℝ] ℝ) + (hG : ∀ h : CubeEuclideanWspSmoothTest Q s p.conjugate, + G (graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h) = + cubeEuclideanNormalizedSmoothPairing F h) : + completedPairingExtension F hD = G := by + apply LinearMap.extendOfNorm_unique + (denseRange_graphToCompleted (Q := Q) (s := s) (p := p.conjugate)) + (cubeEuclideanNegativeWspSmoothDualENorm Q s p F).toReal + (pairing_norm_bound_of_dual_finite F hD) G + ext h + simpa only [LinearMap.comp_apply] using! hG h + +private theorem enorm_graphToCompleted_eq_fullENorm {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ‖graphToCompleted (Q := Q) (s := s) (p := p) h‖ₑ = + cubeEuclideanWspFullENorm Q s p h.toField := by + change ‖graph (Q := Q) (s := s) (p := p) h‖ₑ = _ + exact graph_enorm_eq_cubeEuclideanWspFullENorm h + +/-- On the finite locus, the extension has exactly the smooth negative dual +norm as its extended operator norm. -/ +theorem enorm_completedPairingExtension_eq_negativeWspSmoothDualENorm {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) : + ‖completedPairingExtension (Q := Q) (s := s) (p := p) F hD‖ₑ = + cubeEuclideanNegativeWspSmoothDualENorm Q s p F := by + let D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + let E := completedPairingExtension (Q := Q) (s := s) (p := p) F hD + have hupperReal : ‖E‖ ≤ D.toReal := + LinearMap.opNorm_extendOfNorm_le + (denseRange_graphToCompleted (Q := Q) (s := s) (p := p.conjugate)) + ENNReal.toReal_nonneg (pairing_norm_bound_of_dual_finite F hD) + have hupper : ‖E‖ₑ ≤ D := by + rw [← ofReal_norm] + exact (ENNReal.ofReal_le_iff_le_toReal hD.ne).mpr hupperReal + have hlower : D ≤ ‖E‖ₑ := by + rw [show D = cubeEuclideanNegativeWspSmoothDualENorm Q s p F by rfl, + cubeEuclideanNegativeWspSmoothDualENorm] + apply iSup_le + rintro ⟨h, hh⟩ + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| = + ‖E (graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h)‖ₑ := by + rw [show E = completedPairingExtension (Q := Q) (s := s) (p := p) F hD by rfl, + completedPairingExtension_apply_graphToCompleted F hD h] + exact (Real.enorm_eq_ofReal_abs _).symm + _ ≤ ‖E‖ₑ * ‖graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h‖ₑ := + E.le_opENorm _ + _ ≤ ‖E‖ₑ * 1 := by + calc + ‖E‖ₑ * ‖graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h‖ₑ = + ‖graphToCompleted (Q := Q) (s := s) (p := p.conjugate) h‖ₑ * ‖E‖ₑ := + mul_comm _ _ + _ ≤ 1 * ‖E‖ₑ := by + apply mul_le_mul_left + rw [enorm_graphToCompleted_eq_fullENorm] + exact hh + _ = ‖E‖ₑ * 1 := mul_comm _ _ + _ = ‖E‖ₑ := mul_one _ + exact hupper.antisymm hlower + +end CubeEuclideanWspSmoothTest + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualGraph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualGraph.lean new file mode 100644 index 0000000000..22e9281be3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCompletedDualGraph.lean @@ -0,0 +1,358 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothGraph + +/-! +# Completed two-component graph for cube Euclidean fractional Sobolev tests + +The approved inhomogeneous `W^(s,p)` power norm is realized as the ambient +`L^p` norm of the graph containing a scale-weighted field component and its +Gagliardo kernel. This file only introduces that ambient space, its smooth +graph, and the closure of the graph; it makes no claim about a completed dual +pairing. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Set +open scoped ENNReal + +noncomputable section + +instance instCubeEuclideanWspGraphFactOneLe (p : FiniteLpExponent) : + Fact (1 ≤ p.exponent) := + ⟨p.one_lt.le⟩ + +/-- The two heterogeneous `L^p` components of the fractional-Sobolev graph. -/ +noncomputable abbrev CubeEuclideanWspGraphComponent {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) : Bool → Type _ + | false => Lp (HilbertVec d) p.exponent (normalizedCubeMeasure Q) + | true => Lp (HilbertVec d) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) + +instance instCubeEuclideanWspGraphComponentNormedAddCommGroup {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) [Fact (1 ≤ p.exponent)] + (b : Bool) : NormedAddCommGroup (CubeEuclideanWspGraphComponent Q p b) := by + cases b <;> infer_instance + +instance instCubeEuclideanWspGraphComponentNormedSpace {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) [Fact (1 ≤ p.exponent)] + (b : Bool) : NormedSpace ℝ (CubeEuclideanWspGraphComponent Q p b) := by + cases b <;> infer_instance + +/-- The finite two-component ambient `L^p` space for the full cube `W^(s,p)` +graph. -/ +noncomputable abbrev CubeEuclideanWspGraphAmbient {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) : Type _ := + PiLp p.exponent (CubeEuclideanWspGraphComponent Q p) + +/-- The two-component ambient graph space is complete because both of its +`L^p` components are complete. -/ +noncomputable instance instCompleteSpaceCubeEuclideanWspGraphAmbient {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) : + CompleteSpace (CubeEuclideanWspGraphAmbient Q p) := by + let : Fact (1 ≤ p.exponent) := ⟨p.one_lt.le⟩ + let (b : Bool) : CompleteSpace (CubeEuclideanWspGraphComponent Q p b) := by + cases b <;> infer_instance + change CompleteSpace (PiLp p.exponent (CubeEuclideanWspGraphComponent Q p)) + exact PiLp.completeSpace _ _ + +/-- The real scale applied to the field component of the full `W^(s,p)` graph. -/ +noncomputable def cubeEuclideanWspGraphFieldScale {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) : ℝ := + cubeScaleFactor Q ^ (-s.1) + +namespace CubeEuclideanWspSmoothTest + +/-- The field component of a smooth test as a normalized cube `L^p` element. -/ +noncomputable def graphFieldComponent {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + CubeEuclideanWspGraphComponent Q p false := + h.toCubeEuclideanWspField.euclideanMemLp.toLp + (fun x => HilbertVec.ofVec (h.toField x)) + +/-- The fractional kernel component of a smooth test as a product-space `L^p` element. -/ +noncomputable def graphKernelComponent {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + CubeEuclideanWspGraphComponent Q p true := + h.toCubeEuclideanWspField.euclideanMemWsp.toLp + (cubeEuclideanWspKernel s p h.toField) + +private theorem graphFieldComponent_add {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h k : CubeEuclideanWspSmoothTest Q s p) : + graphFieldComponent (h + k) = graphFieldComponent h + graphFieldComponent k := by + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (h + k).toCubeEuclideanWspField.euclideanMemLp, + MemLp.coeFn_toLp h.toCubeEuclideanWspField.euclideanMemLp, + MemLp.coeFn_toLp k.toCubeEuclideanWspField.euclideanMemLp, + Lp.coeFn_add (graphFieldComponent h) (graphFieldComponent k)] with x hhk hh hk hadd + calc + graphFieldComponent (h + k) x = HilbertVec.ofVec ((h + k).toField x) := hhk + _ = HilbertVec.ofVec (h.toField x) + HilbertVec.ofVec (k.toField x) := by + rw [toField_add, Pi.add_apply] + change (HilbertVec.ofVecL d) (h.toField x + k.toField x) = _ + simpa only [HilbertVec.ofVecL_apply] using + (HilbertVec.ofVecL d).map_add (h.toField x) (k.toField x) + _ = (graphFieldComponent h + graphFieldComponent k) x := by + have hh' : graphFieldComponent h x = HilbertVec.ofVec (h.toField x) := by + simpa only [graphFieldComponent, toCubeEuclideanWspField_toField] using hh + have hk' : graphFieldComponent k x = HilbertVec.ofVec (k.toField x) := by + simpa only [graphFieldComponent, toCubeEuclideanWspField_toField] using hk + rw [← hh', ← hk'] + exact hadd.symm + +private theorem graphFieldComponent_smul {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} (c : ℝ) + (h : CubeEuclideanWspSmoothTest Q s p) : + graphFieldComponent (c • h) = c • graphFieldComponent h := by + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (c • h).toCubeEuclideanWspField.euclideanMemLp, + MemLp.coeFn_toLp h.toCubeEuclideanWspField.euclideanMemLp, + Lp.coeFn_smul c (graphFieldComponent h)] with x hch hh hsmul + calc + graphFieldComponent (c • h) x = HilbertVec.ofVec ((c • h).toField x) := hch + _ = c • HilbertVec.ofVec (h.toField x) := by + rw [toField_smul, Pi.smul_apply] + change (HilbertVec.ofVecL d) (c • h.toField x) = _ + simpa only [HilbertVec.ofVecL_apply] using + (HilbertVec.ofVecL d).map_smul c (h.toField x) + _ = (c • graphFieldComponent h) x := by + have hh' : graphFieldComponent h x = HilbertVec.ofVec (h.toField x) := by + simpa only [graphFieldComponent, toCubeEuclideanWspField_toField] using hh + rw [← hh'] + exact hsmul.symm + +private theorem cubeEuclideanWspKernel_smoothTest_add {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h k : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspKernel s p (h + k).toField = + cubeEuclideanWspKernel s p h.toField + cubeEuclideanWspKernel s p k.toField := by + funext z + rw [cubeEuclideanWspKernel_apply, toField_add] + change (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • HilbertVec.ofVec + ((h.toField z.1 + k.toField z.1) - (h.toField z.2 + k.toField z.2)) = + (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (h.toField z.1 - h.toField z.2) + + (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (k.toField z.1 - k.toField z.2) + rw [add_sub_add_comm] + change (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • (HilbertVec.ofVecL d) + ((h.toField z.1 - h.toField z.2) + (k.toField z.1 - k.toField z.2)) = _ + rw [(HilbertVec.ofVecL d).map_add, smul_add] + simp only [HilbertVec.ofVecL_apply] + +private theorem cubeEuclideanWspKernel_smoothTest_smul {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} (c : ℝ) + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspKernel s p (c • h).toField = + c • cubeEuclideanWspKernel s p h.toField := by + funext z + rw [cubeEuclideanWspKernel_apply, toField_smul, Pi.smul_apply, Pi.smul_apply, + Pi.smul_apply, cubeEuclideanWspKernel_apply] + rw [← smul_sub] + change (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (c • (h.toField z.1 - h.toField z.2)) = + c • ((euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + HilbertVec.ofVec (h.toField z.1 - h.toField z.2)) + change (euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + (HilbertVec.ofVecL d) (c • (h.toField z.1 - h.toField z.2)) = _ + rw [(HilbertVec.ofVecL d).map_smul, smul_smul, smul_smul, mul_comm] + simp only [HilbertVec.ofVecL_apply] + +private theorem graphKernelComponent_add {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h k : CubeEuclideanWspSmoothTest Q s p) : + graphKernelComponent (h + k) = graphKernelComponent h + graphKernelComponent k := by + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (h + k).toCubeEuclideanWspField.euclideanMemWsp, + MemLp.coeFn_toLp h.toCubeEuclideanWspField.euclideanMemWsp, + MemLp.coeFn_toLp k.toCubeEuclideanWspField.euclideanMemWsp, + Lp.coeFn_add (graphKernelComponent h) (graphKernelComponent k)] with z hhk hh hk hadd + calc + graphKernelComponent (h + k) z = cubeEuclideanWspKernel s p (h + k).toField z := hhk + _ = cubeEuclideanWspKernel s p h.toField z + cubeEuclideanWspKernel s p k.toField z := by + simpa only [Pi.add_apply] using congrFun (cubeEuclideanWspKernel_smoothTest_add h k) z + _ = (graphKernelComponent h + graphKernelComponent k) z := by + have hh' : graphKernelComponent h z = cubeEuclideanWspKernel s p h.toField z := by + simpa only [graphKernelComponent, toCubeEuclideanWspField_toField] using hh + have hk' : graphKernelComponent k z = cubeEuclideanWspKernel s p k.toField z := by + simpa only [graphKernelComponent, toCubeEuclideanWspField_toField] using hk + rw [← hh', ← hk'] + exact hadd.symm + +private theorem graphKernelComponent_smul {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} (c : ℝ) + (h : CubeEuclideanWspSmoothTest Q s p) : + graphKernelComponent (c • h) = c • graphKernelComponent h := by + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (c • h).toCubeEuclideanWspField.euclideanMemWsp, + MemLp.coeFn_toLp h.toCubeEuclideanWspField.euclideanMemWsp, + Lp.coeFn_smul c (graphKernelComponent h)] with z hch hh hsmul + calc + graphKernelComponent (c • h) z = cubeEuclideanWspKernel s p (c • h).toField z := hch + _ = c • cubeEuclideanWspKernel s p h.toField z := by + simpa only [Pi.smul_apply] using congrFun (cubeEuclideanWspKernel_smoothTest_smul c h) z + _ = (c • graphKernelComponent h) z := by + have hh' : graphKernelComponent h z = cubeEuclideanWspKernel s p h.toField z := by + simpa only [graphKernelComponent, toCubeEuclideanWspField_toField] using hh + rw [← hh'] + exact hsmul.symm + +/-- The two ambient `L^p` components of a smooth fractional-Sobolev test. -/ +noncomputable def graphPoint {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : CubeEuclideanWspGraphAmbient Q p := + WithLp.toLp p.exponent fun b => + match b with + | false => cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent h + | true => graphKernelComponent h + +/-- The linear smooth graph in the two-component ambient `L^p` space. -/ +noncomputable def graph {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} := + letI : Fact (1 ≤ p.exponent) := ⟨p.one_lt.le⟩ + show CubeEuclideanWspSmoothTest Q s p →ₗ[ℝ] CubeEuclideanWspGraphAmbient Q p from + { toFun := graphPoint + map_add' := by + intro h k + apply PiLp.ext + intro b + cases b + · change cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent (h + k) = + cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent h + + cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent k + rw [graphFieldComponent_add, smul_add] + · exact graphKernelComponent_add h k + map_smul' := by + intro c h + apply PiLp.ext + intro b + cases b + · change cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent (c • h) = + c • (cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent h) + rw [graphFieldComponent_smul, smul_smul, smul_smul, mul_comm] + · exact graphKernelComponent_smul c h } + +private theorem enorm_graphFieldComponent {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ‖graphFieldComponent h‖ₑ = + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent h.toField := by + have hLp : ‖graphFieldComponent h‖ₑ = + eLpNorm (fun x => HilbertVec.ofVec (h.toField x)) p.exponent + (normalizedCubeMeasure Q) := + Lp.enorm_toLp h.toCubeEuclideanWspField.euclideanMemLp + rw [hLp] + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (h.toField x)) + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using! + h.toCubeEuclideanWspField.euclideanMemLp.aestronglyMeasurable.norm + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ hmeas, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using! + (eLpNorm_norm (fun x => HilbertVec.ofVec (h.toField x)) + h.toCubeEuclideanWspField.euclideanMemLp.aestronglyMeasurable).symm + +private theorem enorm_graphKernelComponent {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ‖graphKernelComponent h‖ₑ = cubeEuclideanWspESeminorm Q s p h.toField := by + rw [cubeEuclideanWspESeminorm_eq_eLpNorm Q s p h.toField + h.toCubeEuclideanWspField.euclideanMemWsp.aestronglyMeasurable] + exact Lp.enorm_toLp h.toCubeEuclideanWspField.euclideanMemWsp + +private theorem enorm_graphFieldScale_rpow_eq_wspScalePowerWeight {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) : + ‖cubeEuclideanWspGraphFieldScale Q s‖ₑ ^ p.exponent.toReal = + cubeEuclideanWspScalePowerWeight Q s p := by + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + unfold cubeEuclideanWspGraphFieldScale cubeEuclideanWspScalePowerWeight + rw [Real.enorm_eq_ofReal (Real.rpow_nonneg hscale.le _), + ← ENNReal.ofReal_rpow_of_pos hscale] + rw [← ENNReal.rpow_mul] + +/-- The ambient `L^p` norm of a smooth graph point is exactly the approved +full cube fractional-Sobolev norm. -/ +theorem graph_enorm_eq_cubeEuclideanWspFullENorm {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ‖graph h‖ₑ = cubeEuclideanWspFullENorm Q s p h.toField := by + let : Fact (1 ≤ p.exponent) := ⟨p.one_lt.le⟩ + change ‖graphPoint h‖ₑ = cubeEuclideanWspFullENorm Q s p h.toField + rw [enorm_eq_nnnorm, PiLp.nnnorm_eq_sum p.lt_top.ne] + rw [one_div, ENNReal.coe_rpow_of_nonneg _ (inv_nonneg.mpr ENNReal.toReal_nonneg), + ENNReal.ofNNReal_finsetSum] + simp_rw [ENNReal.coe_rpow_of_nonneg _ ENNReal.toReal_nonneg] + rw [Fintype.sum_bool] + change (‖graphKernelComponent h‖ₑ ^ p.exponent.toReal + + ‖cubeEuclideanWspGraphFieldScale Q s • graphFieldComponent h‖ₑ ^ p.exponent.toReal) ^ + (p.exponent.toReal)⁻¹ = cubeEuclideanWspFullENorm Q s p h.toField + rw [enorm_smul, enorm_graphKernelComponent, enorm_graphFieldComponent, + ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg, + enorm_graphFieldScale_rpow_eq_wspScalePowerWeight] + unfold cubeEuclideanWspFullENorm + rw [add_comm] + +/-- The closed submodule generated by the smooth two-component graph. -/ +noncomputable def completedGraphSubmodule {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) : + Submodule ℝ (CubeEuclideanWspGraphAmbient Q p) := + (LinearMap.range (graph (Q := Q) (s := s) (p := p))).topologicalClosure + +/-- The completed graph carrier, retaining its inherited normed and complete +linear-space structure. -/ +noncomputable abbrev CubeEuclideanWspCompletedDualGraph {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) : Type _ := + completedGraphSubmodule Q s p + +/-- The closure of the smooth graph is a complete normed space. -/ +noncomputable instance instCompleteSpaceCubeEuclideanWspCompletedDualGraph {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) : + CompleteSpace (CubeEuclideanWspCompletedDualGraph Q s p) := by + change CompleteSpace (completedGraphSubmodule Q s p) + exact Submodule.topologicalClosure.completeSpace _ + +/-- The canonical linear inclusion of smooth tests into their completed graph +carrier. -/ +noncomputable def graphToCompleted {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} : + CubeEuclideanWspSmoothTest Q s p →ₗ[ℝ] CubeEuclideanWspCompletedDualGraph Q s p := + (graph (Q := Q) (s := s) (p := p)).codRestrict (completedGraphSubmodule Q s p) + fun h => Submodule.le_topologicalClosure _ (LinearMap.mem_range_self _ h) + +/-- Smooth graph points are dense in the completed graph carrier by construction. -/ +theorem denseRange_graphToCompleted {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} : + DenseRange (graphToCompleted (Q := Q) (s := s) (p := p)) := by + let G := graph (Q := Q) (s := s) (p := p) + let M := LinearMap.range G + let f : CubeEuclideanWspSmoothTest Q s p →ₗ[ℝ] M := + G.codRestrict M (LinearMap.mem_range_self G) + have hsurj : Function.Surjective f := by + rintro ⟨x, hx⟩ + rcases hx with ⟨h, hh⟩ + exact ⟨h, Subtype.ext hh⟩ + change DenseRange ((Submodule.inclusion (Submodule.le_topologicalClosure M)) ∘ f) + exact ((denseRange_inclusion_iff subset_closure).2 subset_rfl).comp + hsurj.denseRange (continuous_inclusion subset_closure) + +end CubeEuclideanWspSmoothTest + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCongruence.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCongruence.lean new file mode 100644 index 0000000000..13fb362308 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspCongruence.lean @@ -0,0 +1,90 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CongruenceAE +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp + +/-! +# Almost-everywhere congruence for Euclidean fractional `W^{s,p}` + +The Euclidean finite-exponent fractional kernel and its associated seminorm, +membership predicate, and full power norm depend only on the normalized-cube +almost-everywhere representative of the field. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- Modifying a Euclidean field on a normalized-cube null set modifies its +fractional `W^{s,p}` kernel only on a Gagliardo product-measure null set. -/ +theorem cubeEuclideanWspKernel_congr_ae {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} {F G : Vec d → Vec d} + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + cubeEuclideanWspKernel s p F =ᵐ[Gagliardo.gagliardoCubeMeasure Q] + cubeEuclideanWspKernel s p G := by + have : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + have hcube : F =ᵐ[cubeMeasure Q] G := + Gagliardo.ae_normalizedCubeMeasure_iff.mp hFG + have hfst : (fun z : Vec d × Vec d => F z.1) =ᵐ[Gagliardo.gagliardoCubeMeasure Q] + fun z => G z.1 := by + rw [Gagliardo.gagliardoCubeMeasure] + exact Measure.quasiMeasurePreserving_fst.ae_eq hFG + have hsnd : (fun z : Vec d × Vec d => F z.2) =ᵐ[Gagliardo.gagliardoCubeMeasure Q] + fun z => G z.2 := by + rw [Gagliardo.gagliardoCubeMeasure] + exact Measure.quasiMeasurePreserving_snd.ae_eq hcube + filter_upwards [hfst, hsnd] with z hzfst hzsnd + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply, hzfst, hzsnd] + +/-- The Euclidean fractional `W^{s,p}` seminorm depends only on the +normalized-cube almost-everywhere representative. -/ +theorem cubeEuclideanWspESeminorm_congr_ae {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} {F G : Vec d → Vec d} + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + cubeEuclideanWspESeminorm Q s p F = cubeEuclideanWspESeminorm Q s p G := by + unfold cubeEuclideanWspESeminorm + exact eLpNorm'_congr_ae (cubeEuclideanWspKernel_congr_ae hFG) + +/-- Euclidean fractional `W^{s,p}` membership is invariant under +normalized-cube almost-everywhere replacement. -/ +theorem memCubeEuclideanWsp_congr_ae {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} {F G : Vec d → Vec d} + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + MemCubeEuclideanWsp Q s p F ↔ MemCubeEuclideanWsp Q s p G := + memLp_congr_ae (cubeEuclideanWspKernel_congr_ae hFG) + +/-- The normalized Euclidean `L^p` term on a cube is invariant under +normalized-cube almost-everywhere replacement. -/ +theorem cubeEuclideanNormalizedLpENorm_congr_ae {d : ℕ} (Q : TriadicCube d) + (p : ℝ≥0∞) {F G : Vec d → Vec d} + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p F = + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p G := by + apply (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm_congr_ae + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + exact hFG + +/-- The Euclidean fractional full power norm depends only on the +normalized-cube almost-everywhere representative. -/ +theorem cubeEuclideanWspFullENorm_congr_ae {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} {F G : Vec d → Vec d} + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + cubeEuclideanWspFullENorm Q s p F = cubeEuclideanWspFullENorm Q s p G := by + unfold cubeEuclideanWspFullENorm + rw [cubeEuclideanNormalizedLpENorm_congr_ae Q p.exponent hFG, + cubeEuclideanWspESeminorm_congr_ae hFG] + +end diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspDilation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspDilation.lean new file mode 100644 index 0000000000..a4b40558f5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspDilation.lean @@ -0,0 +1,348 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch02.Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp + +/-! +# Triadic dilation covariance for finite-p Euclidean fractional norms + +The pullback from `dilateCube k Q` to `Q` is composition with the literal +map `x ↦ 3^k • x`. Normalized volume is invariant, while the fractional +seminorm and the full power norm acquire the physical factor `3^(-k s)`. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal Pointwise + +noncomputable section + +private noncomputable def euclideanWspDilationEquiv {d : ℕ} + (k : ℤ) : Vec d ≃ᵐ Vec d := + MeasurableEquiv.smul₀ (Book.Ch02.triadicDilationFactor k) + (Book.Ch02.triadicDilationFactor_ne_zero k) + +private theorem cubeVolume_dilateCube {d : ℕ} (k : ℤ) (Q : TriadicCube d) : + cubeVolume (Book.Ch02.dilateCube k Q) = + (Book.Ch02.triadicDilationFactor k) ^ d * cubeVolume Q := by + rw [cubeVolume_eq_scaleFactor_pow, Book.Ch02.cubeScaleFactor_dilateCube, + mul_pow, cubeVolume_eq_scaleFactor_pow] + +private theorem euclideanWspDilation_measurePreserving {d : ℕ} + (k : ℤ) (Q : TriadicCube d) : + MeasurePreserving (euclideanWspDilationEquiv (d := d) k) + (normalizedCubeMeasure Q) + (normalizedCubeMeasure (Book.Ch02.dilateCube k Q)) := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + let T := euclideanWspDilationEquiv (d := d) k + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + have hT : (T : Vec d → Vec d) = fun x => r • x := rfl + have hres : Measure.map T (cubeMeasure Q) = + ENNReal.ofReal ((r ^ d)⁻¹) • cubeMeasure (Book.Ch02.dilateCube k Q) := by + rw [cubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + hT, map_smul_volume_restrict hr, + Book.Ch02.openCubeSet_dilateCube] + have hvol : cubeVolume (Book.Ch02.dilateCube k Q) = r ^ d * cubeVolume Q := by + simpa only [r] using cubeVolume_dilateCube k Q + refine ⟨T.measurable, ?_⟩ + rw [normalizedCubeMeasure, normalizedCubeMeasure, + Measure.map_smul _ T.measurable.aemeasurable, hres] + rw [smul_smul] + congr 1 + rw [← ENNReal.ofReal_mul (inv_nonneg.mpr (cubeVolume_nonneg Q))] + have hrpow : 0 < r ^ d := pow_pos hr d + rw [show (cubeVolume Q)⁻¹ * (r ^ d)⁻¹ = + (r ^ d * cubeVolume Q)⁻¹ by field_simp [hrpow.ne'], hvol] + +private theorem euclideanWspDilation_cubeMeasure_map {d : ℕ} + (k : ℤ) (Q : TriadicCube d) : + Measure.map (euclideanWspDilationEquiv (d := d) k) (cubeMeasure Q) = + ENNReal.ofReal ((Book.Ch02.triadicDilationFactor k ^ d)⁻¹) • + cubeMeasure (Book.Ch02.dilateCube k Q) := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + let T := euclideanWspDilationEquiv (d := d) k + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + have hT : (T : Vec d → Vec d) = fun x => r • x := rfl + rw [cubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, + hT, map_smul_volume_restrict hr, + Book.Ch02.openCubeSet_dilateCube] + +private theorem euclideanWspDilation_pair_measure_map {d : ℕ} + (k : ℤ) (Q : TriadicCube d) : + Measure.map + ((euclideanWspDilationEquiv (d := d) k).prodCongr + (euclideanWspDilationEquiv (d := d) k)) + (Gagliardo.gagliardoCubeMeasure Q) = + ENNReal.ofReal ((Book.Ch02.triadicDilationFactor k ^ d)⁻¹) • + Gagliardo.gagliardoCubeMeasure (Book.Ch02.dilateCube k Q) := by + let T := euclideanWspDilationEquiv (d := d) k + have hnorm := euclideanWspDilation_measurePreserving k Q + have hcube := euclideanWspDilation_cubeMeasure_map k Q + have : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + have : SFinite (cubeMeasure (Book.Ch02.dilateCube k Q)) := by + unfold cubeMeasure + infer_instance + change Measure.map (Prod.map T T) + ((normalizedCubeMeasure Q).prod (cubeMeasure Q)) = _ + rw [← Measure.map_prod_map _ _ T.measurable T.measurable, + hnorm.map_eq, hcube, Measure.prod_smul_right] + rfl + +private theorem euclideanWspDilation_pair_measure_target_eq_smul_map {d : ℕ} + (k : ℤ) (Q : TriadicCube d) : + Gagliardo.gagliardoCubeMeasure (Book.Ch02.dilateCube k Q) = + (ENNReal.ofReal (Book.Ch02.triadicDilationFactor k)) ^ d • + Measure.map + ((euclideanWspDilationEquiv (d := d) k).prodCongr + (euclideanWspDilationEquiv (d := d) k)) + (Gagliardo.gagliardoCubeMeasure Q) := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + rw [euclideanWspDilation_pair_measure_map, smul_smul] + have hrpow : 0 ≤ r ^ d := (pow_pos hr d).le + rw [← ENNReal.ofReal_pow hr.le, + ← ENNReal.ofReal_mul hrpow, + mul_inv_cancel₀ (pow_pos hr d).ne', ENNReal.ofReal_one, one_smul] + +/-- Pointwise covariance of the Euclidean fractional kernel under the +source-to-target triadic dilation. -/ +theorem cubeEuclideanWspKernel_dilate {d : ℕ} + (k : ℤ) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) (z : Vec d × Vec d) : + cubeEuclideanWspKernel s p F + (Book.Ch02.dilateVec k z.1, Book.Ch02.dilateVec k z.2) = + (Book.Ch02.triadicDilationFactor k) ^ + (-(s.1 + (d : ℝ) / p.exponent.toReal)) • + cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x)) z := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + change cubeEuclideanWspKernel s p F (r • z.1, r • z.2) = _ + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply, + euclideanDist_smul, abs_of_pos hr] + rw [Real.mul_rpow hr.le (euclideanDist_nonneg _ _), smul_smul] + simp only [Book.Ch02.dilateVec, r] + +/-- Normalized Euclidean `L^p` is invariant under the source pullback of a +triadic dilation. -/ +theorem cubeEuclideanNormalizedLpENorm_dilate {d : ℕ} + (k : ℤ) (Q : TriadicCube d) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeBoundedMeasurableDomain (Book.Ch02.dilateCube k Q)).normalizedEuclideanLpENorm + p.exponent F = + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + (fun x => F (Book.Ch02.dilateVec k x)) := by + let T := euclideanWspDilationEquiv (d := d) k + have hMP := euclideanWspDilation_measurePreserving k Q + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + unfold BoundedMeasurableDomain.normalizedLpENorm + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simp only [if_neg (ne_of_gt (lt_trans zero_lt_one p.one_lt)), + if_neg p.lt_top.ne, eLpNorm'_eq_lintegral_enorm] + congr 1 + rw [MeasurePreserving.lintegral_map_equiv _ T hMP] + rfl + +/-- The Euclidean fractional seminorm acquires exactly the physical factor +`3^(-k s)` under source pullback by a triadic dilation. -/ +theorem cubeEuclideanWspESeminorm_dilate {d : ℕ} + (k : ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + cubeEuclideanWspESeminorm (Book.Ch02.dilateCube k Q) s p F = + (ENNReal.ofReal (Book.Ch02.triadicDilationFactor k)) ^ (-s.1) * + cubeEuclideanWspESeminorm Q s p + (fun x => F (Book.Ch02.dilateVec k x)) := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + let T := euclideanWspDilationEquiv (d := d) k + let TP := T.prodCongr T + let a : ℝ := -(s.1 + (d : ℝ) / p.exponent.toReal) + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + have hR0 : ENNReal.ofReal r ≠ 0 := ENNReal.ofReal_ne_zero_iff.mpr hr + have hRtop : ENNReal.ofReal r ≠ ∞ := ENNReal.ofReal_ne_top + have hT : (TP : Vec d × Vec d → Vec d × Vec d) = + (euclideanWspDilationEquiv (d := d) k).prodCongr + (euclideanWspDilationEquiv (d := d) k) := rfl + have hker : cubeEuclideanWspKernel s p F ∘ TP = + fun z => r ^ a • cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x)) z := by + funext z + simpa only [Function.comp_apply, r, a] using! cubeEuclideanWspKernel_dilate k s p F z + rw [cubeEuclideanWspESeminorm, + euclideanWspDilation_pair_measure_target_eq_smul_map] + rw [eLpNorm'_smul_measure ENNReal.toReal_nonneg] + have hmap : eLpNorm' (cubeEuclideanWspKernel s p F) p.exponent.toReal + (Measure.map TP (Gagliardo.gagliardoCubeMeasure Q)) = + eLpNorm' (cubeEuclideanWspKernel s p F ∘ TP) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) := by + simp only [eLpNorm'_eq_lintegral_enorm] + rw [TP.measurableEmbedding.lintegral_map] + rfl + rw [hmap] + rw [hker] + change (ENNReal.ofReal r ^ d) ^ (1 / p.exponent.toReal) * + eLpNorm' (r ^ a • cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x))) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) = _ + rw [eLpNorm'_const_smul _ + (ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne)] + rw [Real.enorm_eq_ofReal (Real.rpow_nonneg hr.le a)] + rw [← ENNReal.ofReal_rpow_of_pos hr] + rw [← ENNReal.rpow_natCast (ENNReal.ofReal r) d] + rw [← ENNReal.rpow_mul] + rw [← mul_assoc, ← ENNReal.rpow_add _ _ hR0 hRtop] + change (ENNReal.ofReal r) ^ ((d : ℝ) * (1 / p.exponent.toReal) + a) * + eLpNorm' (cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x))) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) = + (ENNReal.ofReal r) ^ (-s.1) * + eLpNorm' (cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x))) p.exponent.toReal + (Gagliardo.gagliardoCubeMeasure Q) + congr 1 + congr 1 + simp only [one_div, ENNReal.toReal_inv] + dsimp only [a] + ring + +/-- Fractional Sobolev membership is transported exactly by a triadic +dilation and source pullback. -/ +theorem memCubeEuclideanWsp_dilate_iff {d : ℕ} + (k : ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + MemCubeEuclideanWsp (Book.Ch02.dilateCube k Q) s p F ↔ + MemCubeEuclideanWsp Q s p + (fun x => F (Book.Ch02.dilateVec k x)) := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + let T := euclideanWspDilationEquiv (d := d) k + let TP := T.prodCongr T + let c : ℝ≥0∞ := (ENNReal.ofReal r) ^ d + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + have hc0 : c ≠ 0 := by + dsimp only [c] + exact pow_ne_zero d (ENNReal.ofReal_ne_zero_iff.mpr hr) + have hctop : c ≠ ∞ := by + dsimp only [c] + exact ENNReal.pow_ne_top ENNReal.ofReal_ne_top + have ha : r ^ (-(s.1 + (d : ℝ) / p.exponent.toReal)) ≠ 0 := + (Real.rpow_pos_of_pos hr _).ne' + have hmeasure := euclideanWspDilation_pair_measure_target_eq_smul_map k Q + have hker : cubeEuclideanWspKernel s p F ∘ TP = + r ^ (-(s.1 + (d : ℝ) / p.exponent.toReal)) • + cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x)) := by + funext z + simpa only [Function.comp_apply] using! cubeEuclideanWspKernel_dilate k s p F z + change MemLp (cubeEuclideanWspKernel s p F) p.exponent + (Gagliardo.gagliardoCubeMeasure (Book.Ch02.dilateCube k Q)) ↔ + MemLp (cubeEuclideanWspKernel s p + (fun x => F (Book.Ch02.dilateVec k x))) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) + rw [hmeasure] + change MemLp (cubeEuclideanWspKernel s p F) p.exponent + (c • Measure.map TP (Gagliardo.gagliardoCubeMeasure Q)) ↔ _ + constructor + · intro htarget + have hmap : MemLp (cubeEuclideanWspKernel s p F) p.exponent + (Measure.map TP (Gagliardo.gagliardoCubeMeasure Q)) := by + have hinv := htarget.smul_measure (ENNReal.inv_ne_top.2 hc0) + simpa only [smul_smul, ENNReal.inv_mul_cancel hc0 hctop, one_smul] using hinv + have hpull : MemLp (cubeEuclideanWspKernel s p F ∘ TP) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := + (TP.memLp_map_measure_iff).mp hmap + rw [hker] at hpull + simpa only [smul_smul, inv_mul_cancel₀ ha, one_smul] using + hpull.const_smul (r ^ (-(s.1 + (d : ℝ) / p.exponent.toReal)))⁻¹ + · intro hpull + have hcomp : MemLp (cubeEuclideanWspKernel s p F ∘ TP) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := by + rw [hker] + exact hpull.const_smul _ + have hmap : MemLp (cubeEuclideanWspKernel s p F) p.exponent + (Measure.map TP (Gagliardo.gagliardoCubeMeasure Q)) := + (TP.memLp_map_measure_iff).mpr hcomp + exact hmap.smul_measure hctop + +private theorem cubeEuclideanWspScalePowerWeight_dilate {d : ℕ} + (k : ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) : + cubeEuclideanWspScalePowerWeight (Book.Ch02.dilateCube k Q) s p = + ((ENNReal.ofReal (Book.Ch02.triadicDilationFactor k)) ^ + (-s.1)) ^ p.exponent.toReal * + cubeEuclideanWspScalePowerWeight Q s p := by + let r : ℝ := Book.Ch02.triadicDilationFactor k + let a : ℝ := cubeScaleFactor Q + let t : ℝ := p.exponent.toReal + have hr : 0 < r := Book.Ch02.triadicDilationFactor_pos k + have ha : 0 < a := by + simpa [a, cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + unfold cubeEuclideanWspScalePowerWeight + rw [Book.Ch02.cubeScaleFactor_dilateCube] + change (ENNReal.ofReal (r * a)) ^ (-s.1 * t) = + ((ENNReal.ofReal r) ^ (-s.1)) ^ t * + (ENNReal.ofReal a) ^ (-s.1 * t) + rw [ENNReal.ofReal_rpow_of_pos (mul_pos hr ha), + Real.mul_rpow hr.le ha.le, + ENNReal.ofReal_mul (Real.rpow_nonneg hr.le _)] + rw [Real.rpow_mul hr.le] + rw [← ENNReal.ofReal_rpow_of_pos (Real.rpow_pos_of_pos hr _), + ENNReal.ofReal_rpow_of_pos hr, + ← ENNReal.ofReal_rpow_of_pos ha] + +/-- The full normalized Euclidean fractional power norm acquires exactly the +physical factor `3^(-k s)` under source pullback by a triadic dilation. -/ +theorem cubeEuclideanWspFullENorm_dilate {d : ℕ} + (k : ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + cubeEuclideanWspFullENorm (Book.Ch02.dilateCube k Q) s p F = + (ENNReal.ofReal (Book.Ch02.triadicDilationFactor k)) ^ (-s.1) * + cubeEuclideanWspFullENorm Q s p + (fun x => F (Book.Ch02.dilateVec k x)) := by + let R : ℝ≥0∞ := ENNReal.ofReal (Book.Ch02.triadicDilationFactor k) + let A : ℝ≥0∞ := R ^ (-s.1) + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent (fun x => F (Book.Ch02.dilateVec k x)) + let S := cubeEuclideanWspESeminorm Q s p + (fun x => F (Book.Ch02.dilateVec k x)) + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have htinv : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + rw [cubeEuclideanWspFullENorm, + cubeEuclideanWspScalePowerWeight_dilate, + cubeEuclideanNormalizedLpENorm_dilate, + cubeEuclideanWspESeminorm_dilate] + change ((A ^ t * W) * L ^ t + (A * S) ^ t) ^ t⁻¹ = + A * (W * L ^ t + S ^ t) ^ t⁻¹ + rw [ENNReal.mul_rpow_of_nonneg _ _ ht.le] + calc + ((A ^ t * W) * L ^ t + A ^ t * S ^ t) ^ t⁻¹ = + (A ^ t * (W * L ^ t + S ^ t)) ^ t⁻¹ := by + congr 1 + rw [mul_add] + ac_rfl + _ = (A ^ t) ^ t⁻¹ * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ htinv] + _ = A * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspExactOverlapFullControl.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspExactOverlapFullControl.lean new file mode 100644 index 0000000000..fac19acedb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspExactOverlapFullControl.lean @@ -0,0 +1,241 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpComparison + +/-! +# Full exact-overlap control for Euclidean fractional-Sobolev fields + +This module adds the inhomogeneous scalar-coordinate estimate needed to use +smooth Euclidean fractional-Sobolev fields as positive exact-overlap tests. +The constant is chosen before the cube, fractional order, exponent, field, +and coordinate. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- A dimension-only full positive-test constant. -/ +noncomputable def cubeEuclideanWspExactOverlapFullControlConstant + (d : ℕ) : ℝ≥0∞ := + 1 + d * cubeEuclideanWspOverlapDimensionConstant d + +theorem cubeEuclideanWspExactOverlapFullControlConstant_lt_top (d : ℕ) : + cubeEuclideanWspExactOverlapFullControlConstant d < ∞ := by + unfold cubeEuclideanWspExactOverlapFullControlConstant + have hlower : Gagliardo.gagliardoBesovLowerConstant d ≠ ∞ := by + unfold Gagliardo.gagliardoBesovLowerConstant + exact ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (ENNReal.pow_ne_top (by norm_num)) + have hdimension : 0 ≤ (d : ℝ) + 4 := by positivity + have hpower : (d : ℝ≥0∞) ^ ((d : ℝ) + 4) < ∞ := + ENNReal.rpow_lt_top_of_nonneg hdimension (ENNReal.natCast_ne_top d) + exact ENNReal.add_lt_top.2 ⟨ENNReal.one_lt_top, + ENNReal.mul_lt_top (ENNReal.natCast_lt_top d) + (by + unfold cubeEuclideanWspOverlapDimensionConstant + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top (by finiteness) (lt_top_iff_ne_top.mpr hlower)) + hpower)⟩ + +private theorem exactOverlapIntegrableOfEuclideanWspField {d : ℕ} + {s : FractionalOrder} (Q : TriadicCube d) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (i : Fin d) : + ExactOverlapIntegrable Q (fun x => F.toField x i) where + root := (cubeEuclideanLp_coordinate_memLp F.toCubeEuclideanLpField i).integrable + p.one_lt.le + overlap := fun _ _ hS => + (Gagliardo.memLp_overlap_of_memLp + (cubeEuclideanLp_coordinate_memLp F.toCubeEuclideanLpField i) hS).integrable + p.one_lt.le + +private theorem exactOverlapRootMean_enorm_le_normalizedEuclideanLp + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanWspField Q s p) (i : Fin d) + (hF : ExactOverlapIntegrable Q (fun x => F.toField x i)) : + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F.toField x i) hF.root| ≤ + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + F.toField := by + let μ := normalizedCubeMeasure Q + let : IsProbabilityMeasure μ := ⟨by simp [μ]⟩ + have hcoord : MemLp (fun x => F.toField x i) p.exponent μ := by + simpa only [μ] using cubeEuclideanLp_coordinate_memLp F.toCubeEuclideanLpField i + have hcoord_meas : AEStronglyMeasurable (fun x => F.toField x i) μ := + hcoord.aestronglyMeasurable + calc + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F.toField x i) hF.root| = + ‖∫ x, F.toField x i ∂μ‖ₑ := by + unfold exactOverlapRootMean + change ENNReal.ofReal |∫ x, F.toField x i ∂μ| = + ‖∫ x, F.toField x i ∂μ‖ₑ + exact (Real.enorm_eq_ofReal_abs _).symm + _ ≤ ∫⁻ x, ‖F.toField x i‖ₑ ∂μ := + enorm_integral_le_lintegral_enorm _ + _ = eLpNorm (fun x => F.toField x i) 1 μ := by + rw [eLpNorm_one_eq_lintegral_enorm hcoord_meas] + _ ≤ eLpNorm (fun x => F.toField x i) p.exponent μ := + eLpNorm_le_eLpNorm_of_exponent_le p.one_lt.le + _ ≤ eLpNorm (fun x => HilbertVec.ofVec (F.toField x)) p.exponent μ := + coordinate_eLpNorm_le_euclidean μ p F.toField i + _ = (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + F.toField := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (F.toField x)) + (cubeBoundedMeasurableDomain Q).normalizedVolume := by + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using F.euclideanMemLp.aestronglyMeasurable.norm + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ hmeas, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simpa only [euclideanNorm_eq_norm_ofVec] using + (eLpNorm_norm (fun x => HilbertVec.ofVec (F.toField x)) + F.euclideanMemLp.aestronglyMeasurable).symm + +private theorem exactOverlapRootWeight_rpow_eq_wspScalePowerWeight + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) : + (exactOverlapRootWeight Q s.1) ^ p.exponent.toReal = + cubeEuclideanWspScalePowerWeight Q s p := by + unfold exactOverlapRootWeight cubeEuclideanWspScalePowerWeight cubeScaleFactor + rw [← ENNReal.rpow_mul] + have hthree : (3 : ℝ≥0∞) = ENNReal.ofReal (3 : ℝ) := by norm_num + have hbase : ENNReal.ofReal ((3 : ℝ) ^ Q.scale) = + (ENNReal.ofReal (3 : ℝ)) ^ (Q.scale : ℝ) := by + rw [← Real.rpow_intCast] + rw [ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + rw [hthree, hbase] + calc + (ENNReal.ofReal (3 : ℝ)) ^ + ((-((Q.scale : ℤ) : ℝ) * s.1) * p.exponent.toReal) = + (ENNReal.ofReal (3 : ℝ)) ^ + ((Q.scale : ℝ) * (-s.1 * p.exponent.toReal)) := by + congr 1 + ring + _ = ((ENNReal.ofReal (3 : ℝ)) ^ (Q.scale : ℝ)) ^ + (-s.1 * p.exponent.toReal) := ENNReal.rpow_mul _ _ _ + +private theorem exactOverlapRootWeight_mul_normalizedEuclideanLpENorm_le_wspFull + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanWspField Q s p) : + exactOverlapRootWeight Q s.1 * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + F.toField ≤ + cubeEuclideanWspFullENorm Q s p F.toField := by + let W := cubeEuclideanWspScalePowerWeight Q s p + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField + let S := cubeEuclideanWspESeminorm Q s p F.toField + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hpower : W * L ^ t ≤ W * L ^ t + S ^ t := le_add_of_nonneg_right bot_le + have hroot := ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr ht.le) + have hweight : (exactOverlapRootWeight Q s.1) ^ t = W := by + simpa only [W, t] using + exactOverlapRootWeight_rpow_eq_wspScalePowerWeight Q s p + rw [cubeEuclideanWspFullENorm] + change exactOverlapRootWeight Q s.1 * L ≤ (W * L ^ t + S ^ t) ^ t⁻¹ + calc + exactOverlapRootWeight Q s.1 * L = + (exactOverlapRootWeight Q s.1 * L) ^ (t * t⁻¹) := by + rw [mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + _ = ((exactOverlapRootWeight Q s.1 * L) ^ t) ^ t⁻¹ := by + rw [ENNReal.rpow_mul] + _ = (W * L ^ t) ^ t⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ ht.le, hweight] + _ ≤ (W * L ^ t + S ^ t) ^ t⁻¹ := hroot + +private theorem cubeEuclideanWspESeminorm_le_fullENorm + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanWspField Q s p) : + cubeEuclideanWspESeminorm Q s p F.toField ≤ + cubeEuclideanWspFullENorm Q s p F.toField := by + let W := cubeEuclideanWspScalePowerWeight Q s p + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField + let S := cubeEuclideanWspESeminorm Q s p F.toField + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hpower : S ^ t ≤ W * L ^ t + S ^ t := le_add_of_nonneg_left bot_le + have hroot := ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr ht.le) + rw [cubeEuclideanWspFullENorm] + change S ≤ (W * L ^ t + S ^ t) ^ t⁻¹ + calc + S = S ^ (t * t⁻¹) := by rw [mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + _ = (S ^ t) ^ t⁻¹ := by rw [ENNReal.rpow_mul] + _ ≤ (W * L ^ t + S ^ t) ^ t⁻¹ := hroot + +/-- Each scalar coordinate exact-overlap full norm is bounded by one explicit +dimension-only multiple of the Euclidean fractional-Sobolev full norm. The +coordinate's root and overlap integrability certificates are derived from the +Euclidean `L^p` carrier. -/ +theorem exactOverlapScalarPFullNorm_le_dimensionConstant_mul_cubeEuclideanWspFull + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanWspField Q s p) (i : Fin d) : + exactOverlapFiniteNorm (exactOverlapScalarPParameters s p) Q + (fun x => F.toField x i) + (exactOverlapIntegrableOfEuclideanWspField Q p F i) ≤ + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p F.toField := by + let hscalar := exactOverlapIntegrableOfEuclideanWspField Q p F i + let C := cubeEuclideanWspOverlapDimensionConstant d + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField + let N := cubeEuclideanWspFullENorm Q s p F.toField + have hseminorm : + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F.toField x i) hscalar ≤ + (d : ℝ≥0∞) * C * N := by + calc + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F.toField x i) hscalar ≤ + (d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapESeminorm Q s p + F.toCubeEuclideanLpField := + exactOverlapScalarPSeminorm_le_dimension_mul_cubeEuclideanOverlap + Q s p F.toCubeEuclideanLpField i hscalar + _ ≤ (d : ℝ≥0∞) * (C * cubeEuclideanWspESeminorm Q s p F.toField) := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + mul_le_mul_left + (cubeEuclideanOverlap_le_dimensionConstant_mul_wsp + Q s p F.toCubeEuclideanLpField) (d : ℝ≥0∞) + _ ≤ (d : ℝ≥0∞) * (C * N) := by + simpa [mul_comm, mul_left_comm, mul_assoc] using + mul_le_mul_left + (mul_le_mul_left (cubeEuclideanWspESeminorm_le_fullENorm Q s p F) C) + (d : ℝ≥0∞) + _ = (d : ℝ≥0∞) * C * N := by ring + have hmean : exactOverlapRootWeight Q s.1 * + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F.toField x i) hscalar.root| ≤ N := by + calc + exactOverlapRootWeight Q s.1 * + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F.toField x i) hscalar.root| ≤ + exactOverlapRootWeight Q s.1 * L := by + simpa [mul_comm] using mul_le_mul_left + (exactOverlapRootMean_enorm_le_normalizedEuclideanLp Q s p F i hscalar) + (exactOverlapRootWeight Q s.1) + _ ≤ N := exactOverlapRootWeight_mul_normalizedEuclideanLpENorm_le_wspFull + Q s p F + rw [exactOverlapFiniteNorm_eq] + calc + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F.toField x i) hscalar + + exactOverlapRootWeight Q s.1 * + ENNReal.ofReal |exactOverlapRootMean Q (fun x => F.toField x i) hscalar.root| ≤ + (d : ℝ≥0∞) * C * N + N := add_le_add hseminorm hmean + _ = (1 + (d : ℝ≥0∞) * C) * N := by ring + _ = cubeEuclideanWspExactOverlapFullControlConstant d * N := by + simp only [cubeEuclideanWspExactOverlapFullControlConstant, C] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLegacyCircComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLegacyCircComparison.lean new file mode 100644 index 0000000000..6a2783165e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLegacyCircComparison.lean @@ -0,0 +1,170 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDualNegativeBesov +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative + +/-! +# Legacy scalar circ versus the source negative Besov envelope + +The legacy scalar circ partial norms use real-valued finite sums and include +the depths `0, …, N`. The source-aligned scalar envelope uses `ENNReal` and +the half-open finite range `0, …, N - 1`. This module records the literal +finite-depth change of presentation without adding an `Lᵖ` assumption to the +represented `L²` field. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +private theorem cubeScaleFactor_div_pow_eq_sourceZPow {d : ℕ} (Q : TriadicCube d) + (j : ℕ) : + cubeScaleFactor Q / (3 : ℝ) ^ j = (3 : ℝ) ^ (Q.scale - (j : ℤ)) := by + unfold cubeScaleFactor + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + +private theorem legacy_circ_depth_weight_eq_source {d : ℕ} (Q : TriadicCube d) + (s : ℝ) (j : ℕ) : + cubeBesovCircDepthWeight Q s j = + (3 : ℝ) ^ (s * ((Q.scale - (j : ℤ) : ℤ) : ℝ)) := by + unfold cubeBesovCircDepthWeight + rw [cubeScaleFactor_div_pow_eq_sourceZPow] + rw [← Real.rpow_intCast (3 : ℝ) (Q.scale - (j : ℤ)), + ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + congr 1 + ring + +private theorem source_weight_eq_legacy_weight_rpow {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) (j : ℕ) : + ENNReal.ofReal + (Real.rpow 3 (s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ)))) = + (ENNReal.ofReal (cubeBesovCircDepthWeight Q s.1 j)) ^ p.exponent.toReal := by + rw [legacy_circ_depth_weight_eq_source] + rw [ENNReal.ofReal_rpow_of_pos + (Real.rpow_pos_of_pos (by norm_num : (0 : ℝ) < 3) _)] + congr 1 + rw [← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + congr 1 + ring + +private theorem legacy_circ_depth_average_eq_source_block_sum {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) + (f : Vec d → ℝ) (j : ℕ) : + ENNReal.ofReal (cubeBesovCircDepthAverage Q p.exponent f j) = + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (descendantsAtDepth Q j).attach.sum (fun R => + (ENNReal.ofReal |cubeAverage R.1 f|) ^ p.exponent.toReal) := by + have hcard : (0 : ℝ) < ((descendantsAtDepth Q j).card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr (descendantsAtDepth_nonempty Q j) + unfold cubeBesovCircDepthAverage descendantsAverage + rw [ENNReal.ofReal_mul] + · rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast, + ENNReal.ofReal_sum_of_nonneg] + · congr 1 + rw [← Finset.sum_attach] + apply Finset.sum_congr rfl + intro R _ + rw [Real.norm_eq_abs, + ENNReal.ofReal_rpow_of_nonneg (abs_nonneg _) ENNReal.toReal_nonneg] + · intro R _ + exact Real.rpow_nonneg (norm_nonneg _) _ + · exact inv_nonneg.mpr (by positivity) + +theorem cubeEuclideanNegativeBesovScalarDepthEnergy_eq_legacy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (j : ℕ) : + cubeEuclideanNegativeBesovScalarDepthEnergy Q s p F i j = + (ENNReal.ofReal + (cubeBesovCircDepthSeminorm Q s.1 p.exponent (fun x => F.toField x i) j)) ^ + p.exponent.toReal := by + classical + have hsource : Q.scale - (j : ℤ) ≤ Q.scale := by omega + have hdepth : (Q.scale - (Q.scale - (j : ℤ))).toNat = j := by omega + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hweight : 0 ≤ cubeBesovCircDepthWeight Q s.1 j := + cubeBesovCircDepthWeight_nonneg Q s.1 j + have havg : 0 ≤ cubeBesovCircDepthAverage Q p.exponent + (fun x => F.toField x i) j := + cubeBesovCircDepthAverage_nonneg Q p.exponent (fun x => F.toField x i) j + unfold cubeEuclideanNegativeBesovScalarDepthEnergy + cubeBesovCircDepthSeminorm + rw [descendantsAtScale_eq_descendantsAtDepth Q hsource, hdepth] + rw [source_weight_eq_legacy_weight_rpow] + rw [mul_assoc] + rw [← legacy_circ_depth_average_eq_source_block_sum Q p (fun x => F.toField x i) j] + rw [show (1 / p.exponent.toReal) = (p.exponent.toReal)⁻¹ by ring] + rw [ENNReal.ofReal_mul hweight] + rw [← ENNReal.ofReal_rpow_of_nonneg havg (inv_nonneg.mpr hp.le)] + rw [ENNReal.mul_rpow_of_nonneg _ _ hp.le] + rw [← ENNReal.rpow_mul] + rw [show (p.exponent.toReal)⁻¹ * p.exponent.toReal = 1 by field_simp [hp.ne']] + simp only [ENNReal.rpow_one] + +/-- The legacy partial norm at truncation `N` includes exactly the source +depths in the half-open range `N + 1`. -/ +theorem cubeEuclideanNegativeBesovScalarPartialENorm_succ_eq_legacy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (N : ℕ) : + cubeEuclideanNegativeBesovScalarPartialENorm Q s p F i (N + 1) = + ENNReal.ofReal + (cubeBesovCircPartialNorm Q s.1 p.exponent p.exponent + N (fun x => F.toField x i)) := by + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + unfold cubeEuclideanNegativeBesovScalarPartialENorm + cubeBesovCircPartialNorm cubeBesovCircPartialSeminorm + rw [show (1 / p.exponent.toReal) = (p.exponent.toReal)⁻¹ by ring] + rw [← ENNReal.ofReal_rpow_of_nonneg] + · rw [ENNReal.ofReal_sum_of_nonneg] + · apply congrArg (fun z : ℝ≥0∞ => z ^ (p.exponent.toReal)⁻¹) + refine Finset.sum_congr rfl ?_ + intro j hj + rw [← ENNReal.ofReal_rpow_of_nonneg] + · exact cubeEuclideanNegativeBesovScalarDepthEnergy_eq_legacy Q s p F i j + · exact cubeBesovCircDepthSeminorm_nonneg Q s.1 p.exponent + (fun x => F.toField x i) j + · exact hp.le + · intro j _ + exact Real.rpow_nonneg + (cubeBesovCircDepthSeminorm_nonneg Q s.1 p.exponent + (fun x => F.toField x i) j) _ + · exact Finset.sum_nonneg fun j _ => Real.rpow_nonneg + (cubeBesovCircDepthSeminorm_nonneg Q s.1 p.exponent + (fun x => F.toField x i) j) _ + · exact inv_nonneg.mpr hp.le + +/-- Every finite legacy circ partial norm is top-safely controlled by the +frozen source-facing vector negative Besov seminorm. -/ +theorem ennreal_ofReal_cubeBesovCircPartialNorm_le_cubeEuclideanNegativeBesovESeminorm + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (N : ℕ) : + ENNReal.ofReal + (cubeBesovCircPartialNorm Q s.1 p.exponent p.exponent + N (fun x => F.toField x i)) ≤ + cubeEuclideanNegativeBesovESeminorm Q s p F := by + rw [← cubeEuclideanNegativeBesovScalarPartialENorm_succ_eq_legacy Q s p F i N] + exact cubeEuclideanNegativeBesovScalarPartialENorm_le Q s p F i (N + 1) + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLocalization.lean new file mode 100644 index 0000000000..9d1b386731 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLocalization.lean @@ -0,0 +1,331 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Besov.Localization + +/-! # Euclidean Wsp Localization -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- `ENNReal` average over the finite set of depth-`j` descendants. -/ +noncomputable def descendantsENNAverage {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (F : TriadicCube d → ℝ≥0∞) : ℝ≥0∞ := + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + ∑ R ∈ descendantsAtDepth Q j, F R + +private theorem lintegral_normalizedCubeMeasure_eq {d : ℕ} (Q : TriadicCube d) + (f : Vec d → ℝ≥0∞) : + (∫⁻ x, f x ∂normalizedCubeMeasure Q) = + ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by + rw [normalizedCubeMeasure, lintegral_smul_measure] + rfl + +/-- Exact descendant partition identity for a first-variable normalized +nonnegative integrand. -/ +theorem descendantsENNAverage_lintegral_normalizedCubeMeasure_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : Vec d → ℝ≥0∞) : + descendantsENNAverage Q j + (fun R => ∫⁻ x, f x ∂normalizedCubeMeasure R) = + ∫⁻ x, f x ∂normalizedCubeMeasure Q := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD : D.Nonempty := by simpa [D] using descendantsAtDepth_nonempty Q j + have hfactor : ∀ R ∈ D, + ((D.card : ℝ≥0∞)⁻¹) * ENNReal.ofReal (cubeVolume R)⁻¹ = + ENNReal.ofReal (cubeVolume Q)⁻¹ := by + intro R hR + have hvol : cubeVolume Q = (D.card : ℝ) * cubeVolume R := + cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth (Q := Q) + (by simpa [D] using hR) + have hcard_pos : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD + rw [← ENNReal.ofReal_natCast, ← ENNReal.ofReal_inv_of_pos hcard_pos, + ← ENNReal.ofReal_mul (inv_nonneg.mpr hcard_pos.le)] + congr 1 + rw [hvol, mul_inv] + have hmeas : ∀ R ∈ D, MeasurableSet (cubeSet R) := fun R _ => measurableSet_cubeSet R + have hdisj : (D : Set (TriadicCube d)).PairwiseDisjoint cubeSet := by + simpa [D] using pairwiseDisjoint_descendantsAtDepth Q j + have hsum : (∑ R ∈ D, ∫⁻ x in cubeSet R, f x ∂MeasureTheory.volume) = + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by + rw [cubeSet_eq_iUnion_descendantsAtDepth Q j] + symm + exact lintegral_biUnion_finset hdisj (fun R hR => hmeas R hR) f + rw [descendantsENNAverage, Finset.mul_sum] + simp_rw [lintegral_normalizedCubeMeasure_eq] + calc + ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹) * + (ENNReal.ofReal (cubeVolume R)⁻¹ * + ∫⁻ x in cubeSet R, f x ∂MeasureTheory.volume) + = ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∑ R ∈ D, ∫⁻ x in cubeSet R, f x ∂MeasureTheory.volume := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun R hR => by rw [← mul_assoc, hfactor R hR] + _ = ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ x in cubeSet Q, f x ∂MeasureTheory.volume := by rw [hsum] + +/-- The exact finite-exponent Euclidean normalized `Lᵖ` descendant partition. -/ +theorem descendantsENNAverage_normalizedEuclideanLpENorm_rpow_eq {d n : ℕ} + (Q : TriadicCube d) (j : ℕ) (p : ℝ≥0∞) (F : Vec d → Vec n) + (hp0 : p ≠ 0) (hpt : p ≠ ∞) : + descendantsENNAverage Q j (fun R => + ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p F) ^ p.toReal) = + ((cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p F) ^ p.toReal := by + let f : Vec d → ℝ≥0∞ := fun x => ‖euclideanNorm (F x)‖ₑ ^ p.toReal + have hp : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + have hpow (R : TriadicCube d) : + ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p F) ^ p.toReal = + ∫⁻ x, f x ∂normalizedCubeMeasure R := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + unfold BoundedMeasurableDomain.normalizedLpENorm + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + ite_eq_right hp0, ite_eq_right hpt, + MeasureTheory.eLpNorm'_eq_lintegral_enorm, ← ENNReal.rpow_mul] + have hpr : (1 / p.toReal) * p.toReal = 1 := by field_simp + rw [hpr, ENNReal.rpow_one] + calc + descendantsENNAverage Q j (fun R => + ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p F) ^ p.toReal) + = descendantsENNAverage Q j (fun R => ∫⁻ x, f x ∂normalizedCubeMeasure R) := by + congr 2 + funext R + exact hpow R + _ = ∫⁻ x, f x ∂normalizedCubeMeasure Q := + descendantsENNAverage_lintegral_normalizedCubeMeasure_eq Q j f + _ = ((cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p F) ^ p.toReal := + (hpow Q).symm + +/-- Exact change of the anchored `p`-power scale weight down `j` triadic +levels. The factor is the manuscript's `3^(j*s*p)`. -/ +theorem descendant_scale_weight_algebra {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (hR : R ∈ descendantsAtDepth Q j) (s : ℝ) (p : ℝ≥0∞) (hs : 0 ≤ s) : + (ENNReal.ofReal (cubeScaleFactor R)) ^ (-s * p.toReal) = + ((ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s * p.toReal)) * + (ENNReal.ofReal (cubeScaleFactor Q)) ^ (-s * p.toReal) := by + have hscale : cubeScaleFactor R = cubeScaleFactor Q / (3 : ℝ) ^ j := + cubeScaleFactor_descendant_eq_div_pow hR + have hc : 0 ≤ s * p.toReal := mul_nonneg hs ENNReal.toReal_nonneg + have hthree : 0 < ((3 : ℝ) ^ j) := by positivity + have hbpos : 0 < (ENNReal.ofReal ((3 : ℝ) ^ j)) ^ (s * p.toReal) := + ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hthree) ENNReal.ofReal_ne_top + have hbtop : (ENNReal.ofReal ((3 : ℝ) ^ j)) ^ (s * p.toReal) ≠ ∞ := + ENNReal.rpow_ne_top_of_ne_zero (ne_of_gt (ENNReal.ofReal_pos.mpr hthree)) + ENNReal.ofReal_ne_top + rw [hscale, ENNReal.ofReal_div_of_pos hthree] + have hneg : -s * p.toReal = -(s * p.toReal) := by ring + rw [hneg, ENNReal.rpow_neg, ENNReal.div_rpow_of_nonneg _ _ hc, + ENNReal.inv_div (Or.inl hbtop) (Or.inl (ne_of_gt hbpos)), + ENNReal.div_eq_inv_mul, ← ENNReal.rpow_neg, mul_comm] + congr 1 + rw [ENNReal.ofReal_pow (by norm_num : (0 : ℝ) ≤ 3), ← ENNReal.rpow_natCast, + ← ENNReal.rpow_mul] + ring_nf + +private theorem descendantsENNAverage_add {d : ℕ} (Q : TriadicCube d) (j : ℕ) + (A B : TriadicCube d → ℝ≥0∞) : + descendantsENNAverage Q j (fun R => A R + B R) = + descendantsENNAverage Q j A + descendantsENNAverage Q j B := by + unfold descendantsENNAverage + rw [Finset.sum_add_distrib] + ring + +/-- Pure `ENNReal` assembly of the full-norm power localization. The three +inputs are exactly: local physical-scale weights, normalized `Lᵖ` powers, and +fractional seminorm powers. -/ +theorem descendantsENNAverage_full_power_le_of_partition {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (A : ℝ≥0∞) + (w L S : TriadicCube d → ℝ≥0∞) + (hA : 1 ≤ A) + (hw : ∀ R ∈ descendantsAtDepth Q j, w R = A * w Q) + (hL : descendantsENNAverage Q j L = L Q) + (hS : descendantsENNAverage Q j S ≤ S Q) : + descendantsENNAverage Q j (fun R => w R * L R + S R) ≤ + A * (w Q * L Q + S Q) := by + have hmain : descendantsENNAverage Q j (fun R => w R * L R) = + (A * w Q) * descendantsENNAverage Q j L := by + unfold descendantsENNAverage + have hsum : (∑ R ∈ descendantsAtDepth Q j, w R * L R) = + (A * w Q) * ∑ R ∈ descendantsAtDepth Q j, L R := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun R hR => ?_ + rw [hw R hR] + rw [hsum] + ac_rfl + calc + descendantsENNAverage Q j (fun R => w R * L R + S R) + = (A * w Q) * descendantsENNAverage Q j L + descendantsENNAverage Q j S := by + rw [descendantsENNAverage_add, hmain] + _ = (A * w Q) * L Q + descendantsENNAverage Q j S := by rw [hL] + _ ≤ (A * w Q) * L Q + A * S Q := by + gcongr + exact hS.trans (le_mul_of_one_le_left bot_le hA) + _ = A * (w Q * L Q + S Q) := by ring + +private theorem lintegral_descendant_diagonals_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : Vec d × Vec d → ℝ≥0∞) : + (∑ R ∈ descendantsAtDepth Q j, + ∫⁻ z in cubeSet R ×ˢ cubeSet R, f z ∂(volume.prod volume)) ≤ + ∫⁻ z in cubeSet Q ×ˢ cubeSet Q, f z ∂(volume.prod volume) := by + classical + let D := descendantsAtDepth Q j + have hm : ∀ R ∈ D, MeasurableSet (cubeSet R ×ˢ cubeSet R) := + fun R _ => (measurableSet_cubeSet R).prod (measurableSet_cubeSet R) + have hd : (D : Set (TriadicCube d)).PairwiseDisjoint + (fun R => cubeSet R ×ˢ cubeSet R) := by + intro R hR S hS hRS + exact Set.disjoint_prod.mpr (Or.inl + (pairwiseDisjoint_descendantsAtDepth Q j (by simpa [D] using hR) + (by simpa [D] using hS) hRS)) + have hsub : (⋃ R ∈ (D : Set (TriadicCube d)), cubeSet R ×ˢ cubeSet R) ⊆ + cubeSet Q ×ˢ cubeSet Q := by + intro z hz + rcases Set.mem_iUnion₂.mp hz with ⟨R, hR, hz⟩ + exact ⟨cubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR) hz.1, + cubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR) hz.2⟩ + rw [← lintegral_biUnion_finset hd hm] + exact lintegral_mono_set hsub + +theorem descendantsENNAverage_cubeEuclideanWspESeminorm_rpow_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + descendantsENNAverage Q j + (fun R => (cubeEuclideanWspESeminorm R s p F) ^ p.exponent.toReal) ≤ + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal := by + let f : Vec d × Vec d → ℝ≥0∞ := fun z => + ‖cubeEuclideanWspKernel s p F z‖ₑ ^ p.exponent.toReal + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hpow (R : TriadicCube d) : + (cubeEuclideanWspESeminorm R s p F) ^ p.exponent.toReal = + ENNReal.ofReal (cubeVolume R)⁻¹ * ∫⁻ z in cubeSet R ×ˢ cubeSet R, f z ∂(volume.prod volume) := by + rw [cubeEuclideanWspESeminorm_eq_lintegral, ← ENNReal.rpow_mul] + have h : (1 / p.exponent.toReal) * p.exponent.toReal = 1 := by field_simp + rw [h, ENNReal.rpow_one] + simpa [f] using Gagliardo.lintegral_gagliardoCubeMeasure_eq R f + rw [show (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal = + ENNReal.ofReal (cubeVolume Q)⁻¹ * ∫⁻ z in cubeSet Q ×ˢ cubeSet Q, f z ∂(volume.prod volume) by exact hpow Q] + unfold descendantsENNAverage + rw [Finset.mul_sum] + simp_rw [hpow] + let D := descendantsAtDepth Q j + have hD : D.Nonempty := by simpa [D] using descendantsAtDepth_nonempty Q j + have hf : ∀ R ∈ D, ((D.card : ℝ≥0∞)⁻¹) * ENNReal.ofReal (cubeVolume R)⁻¹ = + ENNReal.ofReal (cubeVolume Q)⁻¹ := by + intro R hR + have hv := cubeVolume_eq_card_mul_cubeVolume_of_mem_descendantsAtDepth (Q := Q) + (by simpa [D] using hR) + have hc : 0 < (D.card : ℝ) := by exact_mod_cast Finset.card_pos.mpr hD + rw [← ENNReal.ofReal_natCast, ← ENNReal.ofReal_inv_of_pos hc, + ← ENNReal.ofReal_mul (inv_nonneg.mpr hc.le)] + congr 1 + rw [hv, mul_inv] + calc + ∑ R ∈ D, ((D.card : ℝ≥0∞)⁻¹) * + (ENNReal.ofReal (cubeVolume R)⁻¹ * ∫⁻ z in cubeSet R ×ˢ cubeSet R, f z ∂(volume.prod volume)) = + ENNReal.ofReal (cubeVolume Q)⁻¹ * ∑ R ∈ D, + ∫⁻ z in cubeSet R ×ˢ cubeSet R, f z ∂(volume.prod volume) := by + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun R hR => by rw [← mul_assoc, hf R hR] + _ ≤ ENNReal.ofReal (cubeVolume Q)⁻¹ * ∫⁻ z in cubeSet Q ×ˢ cubeSet Q, f z ∂(volume.prod volume) := by + gcongr + exact lintegral_descendant_diagonals_le Q j f + +theorem descendantsENNAverage_cubeEuclideanWspFullENorm_rpow_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + descendantsENNAverage Q j + (fun R => (cubeEuclideanWspFullENorm R s p F) ^ p.exponent.toReal) ≤ + (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1 * p.exponent.toReal) * + (cubeEuclideanWspFullENorm Q s p F) ^ p.exponent.toReal := by + let A : ℝ≥0∞ := (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1 * p.exponent.toReal) + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hA : 1 ≤ A := by + simpa [A] using ENNReal.rpow_le_rpow (show (1 : ℝ≥0∞) ≤ ENNReal.ofReal 3 by norm_num) + (mul_nonneg (mul_nonneg (Nat.cast_nonneg _) s.2.1.le) ENNReal.toReal_nonneg) + have hpow (R : TriadicCube d) : + (cubeEuclideanWspFullENorm R s p F) ^ p.exponent.toReal = + cubeEuclideanWspScalePowerWeight R s p * + ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p.exponent F) ^ p.exponent.toReal + + (cubeEuclideanWspESeminorm R s p F) ^ p.exponent.toReal := by + unfold cubeEuclideanWspFullENorm + rw [← ENNReal.rpow_mul] + have h : p.exponent.toReal⁻¹ * p.exponent.toReal = 1 := by field_simp + rw [h, ENNReal.rpow_one] + have hw : ∀ R ∈ descendantsAtDepth Q j, + cubeEuclideanWspScalePowerWeight R s p = A * cubeEuclideanWspScalePowerWeight Q s p := by + intro R hR + exact descendant_scale_weight_algebra hR s.1 p.exponent s.2.1.le + have hL := descendantsENNAverage_normalizedEuclideanLpENorm_rpow_eq + Q j p.exponent F (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hS := descendantsENNAverage_cubeEuclideanWspESeminorm_rpow_le Q j s p F + calc + descendantsENNAverage Q j (fun R => (cubeEuclideanWspFullENorm R s p F) ^ p.exponent.toReal) + = descendantsENNAverage Q j (fun R => + cubeEuclideanWspScalePowerWeight R s p * + ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p.exponent F) ^ p.exponent.toReal + + (cubeEuclideanWspESeminorm R s p F) ^ p.exponent.toReal) := by + congr 2 + funext R + exact hpow R + _ ≤ A * (cubeEuclideanWspScalePowerWeight Q s p * + ((cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent F) ^ p.exponent.toReal + + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal) := + descendantsENNAverage_full_power_le_of_partition Q j A + (cubeEuclideanWspScalePowerWeight · s p) + (fun R => ((cubeBoundedMeasurableDomain R).normalizedEuclideanLpENorm p.exponent F) ^ p.exponent.toReal) + (fun R => (cubeEuclideanWspESeminorm R s p F) ^ p.exponent.toReal) hA hw hL hS + _ = A * (cubeEuclideanWspFullENorm Q s p F) ^ p.exponent.toReal := by rw [hpow Q] + +/-- Rooted form of positive Euclidean `W^{s,p}` descendant localization. -/ +theorem descendantsENNAverage_cubeEuclideanWspFullENorm_root_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (descendantsENNAverage Q j + (fun R => (cubeEuclideanWspFullENorm R s p F) ^ p.exponent.toReal)) ^ + (p.exponent.toReal)⁻¹ ≤ + (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * + cubeEuclideanWspFullENorm Q s p F := by + let A : ℝ≥0∞ := (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1 * p.exponent.toReal) + let N : ℝ≥0∞ := cubeEuclideanWspFullENorm Q s p F + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hpower := descendantsENNAverage_cubeEuclideanWspFullENorm_rpow_le Q j s p F + change _ ≤ (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * N + calc + (descendantsENNAverage Q j + (fun R => (cubeEuclideanWspFullENorm R s p F) ^ p.exponent.toReal)) ^ + (p.exponent.toReal)⁻¹ + ≤ (A * N ^ p.exponent.toReal) ^ (p.exponent.toReal)⁻¹ := by + exact ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr hp.le) + _ = A ^ (p.exponent.toReal)⁻¹ * + (N ^ p.exponent.toReal) ^ (p.exponent.toReal)⁻¹ := + ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hp.le) + _ = (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * N := by + congr 1 + · rw [show A = (ENNReal.ofReal (3 : ℝ)) ^ + ((j : ℝ) * s.1 * p.exponent.toReal) by rfl, ← ENNReal.rpow_mul] + have h : ((j : ℝ) * s.1 * p.exponent.toReal) * p.exponent.toReal⁻¹ = + (j : ℝ) * s.1 := by field_simp + rw [h] + · rw [← ENNReal.rpow_mul] + have h : p.exponent.toReal * p.exponent.toReal⁻¹ = 1 := by field_simp + rw [h, ENNReal.rpow_one] + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLpMembership.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLpMembership.lean new file mode 100644 index 0000000000..769c59648f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspLpMembership.lean @@ -0,0 +1,123 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence + +/-! +# Finite-seminorm membership for Euclidean fractional Sobolev fields + +This file packages the product-measure measurability needed to turn a +normalized-cube `L^p` field with finite Euclidean fractional seminorm into a +literal `MemCubeEuclideanWsp` witness. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem gagliardoCubeMeasure_diagonal_eq_zero {d : ℕ} [NeZero d] + (Q : TriadicCube d) : + Gagliardo.gagliardoCubeMeasure Q (Set.diagonal (Vec d)) = 0 := by + let : IsFiniteMeasure (cubeMeasure Q) := + ⟨lt_top_iff_ne_top.mpr (cubeMeasure_apply_univ_ne_top Q)⟩ + rw [Gagliardo.gagliardoCubeMeasure] + apply Measure.measure_prod_null isClosed_diagonal.measurableSet |>.mpr + filter_upwards with x + have hpre : Prod.mk x ⁻¹' Set.diagonal (Vec d) = {x} := by + ext y + simp [Set.mem_diagonal_iff, eq_comm] + rw [hpre] + simp [cubeMeasure] + +private theorem aestronglyMeasurable_cubeEuclideanWspKernel_of_memLp + {d : ℕ} [NeZero d] {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} {F : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) : + AEStronglyMeasurable (cubeEuclideanWspKernel s p F) + (Gagliardo.gagliardoCubeMeasure Q) := by + letI : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + let μ := Gagliardo.gagliardoCubeMeasure Q + let D : Set (Vec d × Vec d) := (Set.diagonal (Vec d))ᶜ + have hFcube : AEStronglyMeasurable (fun x => HilbertVec.ofVec (F x)) + (cubeMeasure Q) := by + refine ⟨hF.aestronglyMeasurable.mk _, + hF.aestronglyMeasurable.stronglyMeasurable_mk, ?_⟩ + exact Gagliardo.ae_normalizedCubeMeasure_iff.mp + hF.aestronglyMeasurable.ae_eq_mk + have hfst : AEStronglyMeasurable (fun z : Vec d × Vec d => + HilbertVec.ofVec (F z.1)) μ := by + dsimp only [μ, Gagliardo.gagliardoCubeMeasure] + exact hF.aestronglyMeasurable.comp_quasiMeasurePreserving + Measure.quasiMeasurePreserving_fst + have hsnd : AEStronglyMeasurable (fun z : Vec d × Vec d => + HilbertVec.ofVec (F z.2)) μ := by + dsimp only [μ, Gagliardo.gagliardoCubeMeasure] + exact hFcube.comp_quasiMeasurePreserving Measure.quasiMeasurePreserving_snd + have hpair : AEStronglyMeasurable (fun z : Vec d × Vec d => + HilbertVec.ofVec (F z.1 - F z.2)) μ := by + simpa only [map_sub] using! hfst.sub hsnd + have hdist : Continuous (fun z : Vec d × Vec d => euclideanDist z.1 z.2) := by + have hh : Continuous (fun z : Vec d × Vec d => HilbertVec.ofVec (z.1 - z.2)) := + (HilbertVec.ofVecL d).continuous.comp (continuous_fst.sub continuous_snd) + simpa only [euclideanDist, euclideanNorm_eq_norm_ofVec] using hh.norm + have hDmeas : MeasurableSet D := isClosed_diagonal.measurableSet.compl + have hscalar : AEStronglyMeasurable (fun z : Vec d × Vec d => + euclideanDist z.1 z.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) + (μ.restrict D) := by + exact (hdist.continuousOn.rpow_const fun z hz => Or.inl (by + intro hzero + apply hz + exact Set.mem_diagonal_iff.mpr (euclideanDist_eq_zero_iff.mp hzero))).aestronglyMeasurable hDmeas + have hrestrictPair : AEStronglyMeasurable (fun z : Vec d × Vec d => + HilbertVec.ofVec (F z.1 - F z.2)) (μ.restrict D) := hpair.restrict + have hkernel : AEStronglyMeasurable (cubeEuclideanWspKernel s p F) + (μ.restrict D) := by + simpa only [cubeEuclideanWspKernel_apply] using! hscalar.smul hrestrictPair + have hdiag : μ (Set.diagonal (Vec d)) = 0 := by + dsimp only [μ] + exact gagliardoCubeMeasure_diagonal_eq_zero Q + have hDae : ∀ᵐ z ∂μ, z ∈ D := by + rw [ae_iff] + simpa [D] using! hdiag + have hrestrict : μ.restrict D = μ := Measure.restrict_eq_self_of_ae_mem hDae + simpa only [hrestrict] using hkernel + +/-- A normalized-cube Euclidean `L^p` field with finite fractional seminorm +belongs to the literal Euclidean fractional Sobolev membership predicate. -/ +theorem memCubeEuclideanWsp_of_memLp_of_eSeminorm_lt_top + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} {F : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) + (hsemi : cubeEuclideanWspESeminorm Q s p F < ∞) : + MemCubeEuclideanWsp Q s p F := by + classical + by_cases hd : d = 0 + · subst d + have hkernel : cubeEuclideanWspKernel s p F = 0 := by + funext z + have hsub : F z.1 - F z.2 = 0 := Subsingleton.elim _ _ + simp [cubeEuclideanWspKernel_apply, hsub] + unfold MemCubeEuclideanWsp + rw [hkernel] + exact MemLp.zero + · let : NeZero d := ⟨hd⟩ + exact memCubeEuclideanWsp_iff.mpr + ⟨aestronglyMeasurable_cubeEuclideanWspKernel_of_memLp hF, hsemi⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspNegativeLocalization.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspNegativeLocalization.lean new file mode 100644 index 0000000000..2e4aea0968 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspNegativeLocalization.lean @@ -0,0 +1,548 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLocalization +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual + +/-! +# Descendant localization preliminaries for the smooth negative fractional norm + +This module records the exact normalized-pairing partition and the canonical +restriction of a globally smooth test field. They are the two analytic inputs +needed for negative-norm localization by finite Hoelder duality. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private def CubeEuclideanWspSmoothTest.restrictToSubcube {d : ℕ} + {Q R : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) + (_hRQ : openCubeSet R ⊆ openCubeSet Q) : + CubeEuclideanWspSmoothTest R s p where + toField := h.toField + contDiff := h.contDiff + +private theorem cubeEuclideanNormalizedSmoothPairing_restrictToSubcube {d : ℕ} + {Q R : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hRQ : openCubeSet R ⊆ openCubeSet Q) + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanNormalizedSmoothPairing (F.restrictToSubcube hRQ) + (h.restrictToSubcube hRQ) = + ∫ x, vecDot (F.toField x) (h.toField x) ∂normalizedCubeMeasure R := by + rfl + +/-- Exact partition of a normalized real pairing over descendants. -/ +private theorem cubeEuclideanNormalizedSmoothPairing_descendants_eq {d : ℕ} + (Q : TriadicCube d) (j : ℕ) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanNormalizedSmoothPairing F h = + descendantsAverage Q j (fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + (h.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0) := by + let g : Vec d → ℝ := fun x => vecDot (F.toField x) (h.toField x) + have hg : IntegrableOn g (cubeSet Q) volume := by + have hscale_ne_zero : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := by + exact ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + change Integrable g (volume.restrict (cubeSet Q)) + have hInt := cubeEuclideanNormalizedSmoothPairing_integrable F h + rw [normalizedCubeMeasure, cubeMeasure] at hInt + exact (integrable_smul_measure hscale_ne_zero ENNReal.ofReal_ne_top).1 hInt + unfold cubeEuclideanNormalizedSmoothPairing + rw [← cubeAverage_eq_integral_normalizedCubeMeasure Q g] + rw [cubeAverage_eq_descendantsAverage_cubeAverage_of_integrableOn Q j g hg] + simp only [descendantsAverage] + congr 1 + apply Finset.sum_congr rfl + intro R hR + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + simp only [dif_pos hR] + rfl + +private theorem cubeEuclideanWspFullENorm_descendant_lt_top_of_le_one {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) + (h : CubeEuclideanWspSmoothTest Q s p) + (hunit : cubeEuclideanWspFullENorm Q s p h.toField ≤ 1) + {R : TriadicCube d} (hR : R ∈ descendantsAtDepth Q j) : + cubeEuclideanWspFullENorm R s p h.toField < ∞ := by + let t : ℝ := p.exponent.toReal + let A : ℝ≥0∞ := descendantsENNAverage Q j + (fun S => cubeEuclideanWspFullENorm S s p h.toField ^ t) + have ht : 0 < t := ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hroot := descendantsENNAverage_cubeEuclideanWspFullENorm_root_le + Q j s p h.toField + have hscale : (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) < ∞ := + ENNReal.rpow_lt_top_of_nonneg + (mul_nonneg (Nat.cast_nonneg _) s.2.1.le) ENNReal.ofReal_ne_top + have hroot_top : A ^ t⁻¹ < ∞ := by + apply lt_of_le_of_lt hroot + exact ENNReal.mul_lt_top hscale (lt_of_le_of_lt hunit ENNReal.one_lt_top) + have hA_top : A < ∞ := + (ENNReal.rpow_lt_top_iff_of_pos (inv_pos.mpr ht)).mp hroot_top + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD : D.Nonempty := by simpa [D] using descendantsAtDepth_nonempty Q j + have hcard_ne_zero : ((D.card : ℝ≥0∞)⁻¹) ≠ 0 := by + rw [ENNReal.inv_ne_zero] + simp + have hcard_ne_top : ((D.card : ℝ≥0∞)⁻¹) < ∞ := by + rw [ENNReal.inv_lt_top] + simp [hD] + have hsum_top : (∑ S ∈ D, + cubeEuclideanWspFullENorm S s p h.toField ^ t) < ∞ := by + have hmul : ((D.card : ℝ≥0∞)⁻¹) * + (∑ S ∈ D, cubeEuclideanWspFullENorm S s p h.toField ^ t) < ∞ := by + simpa only [A, descendantsENNAverage, D] using hA_top + rcases (ENNReal.mul_lt_top_iff.mp hmul) with hboth | hzero | hsumzero + · exact hboth.2 + · exact False.elim (hcard_ne_zero hzero) + · simp [hsumzero] + have hterm_top : cubeEuclideanWspFullENorm R s p h.toField ^ t < ∞ := by + apply (ENNReal.sum_lt_top.mp hsum_top) R + simpa [D] using hR + exact (ENNReal.rpow_lt_top_iff_of_pos ht).mp hterm_top + +private def CubeEuclideanWspSmoothTest.scale {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (c : ℝ) (h : CubeEuclideanWspSmoothTest Q s p) : + CubeEuclideanWspSmoothTest Q s p where + toField x := c • h.toField x + contDiff := h.contDiff.const_smul c + +private theorem negativeLocalization_kernel_smul {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (c : ℝ) + (f : Vec d → Vec d) : + cubeEuclideanWspKernel s p (fun x => c • f x) = + c • cubeEuclideanWspKernel s p f := by + funext z + simp only [cubeEuclideanWspKernel_apply, Pi.smul_apply] + rw [← smul_sub] + change _ • (c • HilbertVec.ofVec (f z.1 - f z.2)) = + c • (_ • HilbertVec.ofVec (f z.1 - f z.2)) + rw [smul_smul, smul_smul, mul_comm] + +private theorem negativeLocalization_normalizedLp_smul {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (c : ℝ) + (f : Vec d → Vec d) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + (fun x => c • f x) = + ‖c‖ₑ * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + unfold BoundedMeasurableDomain.normalizedLpENorm + simp only [ite_eq_right (ne_of_gt (lt_trans zero_lt_one p.one_lt)), + ite_eq_right p.lt_top.ne] + change eLpNorm' (fun x => euclideanNorm (c • f x)) p.exponent.toReal + (cubeBoundedMeasurableDomain Q).normalizedVolume = _ + simp_rw [euclideanNorm_smul] + change eLpNorm' ((|c| : ℝ) • fun x => euclideanNorm (f x)) p.exponent.toReal + (cubeBoundedMeasurableDomain Q).normalizedVolume = _ + rw [eLpNorm'_const_smul _ (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne)] + simp + +private theorem negativeLocalization_eSeminorm_smul {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (c : ℝ) (f : Vec d → Vec d) : + cubeEuclideanWspESeminorm Q s p (fun x => c • f x) = + ‖c‖ₑ * cubeEuclideanWspESeminorm Q s p f := by + unfold cubeEuclideanWspESeminorm + rw [negativeLocalization_kernel_smul] + exact eLpNorm'_const_smul c (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne) + +private theorem negativeLocalization_fullENorm_smul {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (c : ℝ) (f : Vec d → Vec d) : + cubeEuclideanWspFullENorm Q s p (fun x => c • f x) = + ‖c‖ₑ * cubeEuclideanWspFullENorm Q s p f := by + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent f + let S := cubeEuclideanWspESeminorm Q s p f + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have htin : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + rw [cubeEuclideanWspFullENorm, + negativeLocalization_normalizedLp_smul, + negativeLocalization_eSeminorm_smul] + change (W * (‖c‖ₑ * L) ^ t + (‖c‖ₑ * S) ^ t) ^ t⁻¹ = + ‖c‖ₑ * (W * L ^ t + S ^ t) ^ t⁻¹ + rw [ENNReal.mul_rpow_of_nonneg _ _ ht.le, + ENNReal.mul_rpow_of_nonneg _ _ ht.le] + calc + (W * (‖c‖ₑ ^ t * L ^ t) + ‖c‖ₑ ^ t * S ^ t) ^ t⁻¹ = + (‖c‖ₑ ^ t * (W * L ^ t + S ^ t)) ^ t⁻¹ := by + congr 1 + rw [mul_add] + ac_rfl + _ = (‖c‖ₑ ^ t) ^ t⁻¹ * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ htin] + _ = ‖c‖ₑ * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + +private theorem negativeLocalization_pairing_scale {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p) (c : ℝ) : + cubeEuclideanNormalizedSmoothPairing F (h.scale c) = + c * cubeEuclideanNormalizedSmoothPairing F h := by + unfold cubeEuclideanNormalizedSmoothPairing CubeEuclideanWspSmoothTest.scale + simp_rw [vecDot_smul_right] + exact integral_const_mul c _ + +private theorem negativeLocalization_normalizedLp_eq_zero_of_full_eq_zero {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (f : Vec d → Vec d) (hf : cubeEuclideanWspFullENorm Q s p f = 0) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f = 0 := by + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f + let S := cubeEuclideanWspESeminorm Q s p f + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hW : W ≠ 0 := by + apply ne_of_gt + unfold W cubeEuclideanWspScalePowerWeight + exact ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top + have hbase : W * L ^ t + S ^ t = 0 := by + rw [← ENNReal.rpow_eq_zero_iff_of_pos (inv_pos.mpr ht)] + simpa only [cubeEuclideanWspFullENorm, L, S, W, t] using hf + have hterm : W * L ^ t = 0 := (add_eq_zero.mp hbase).1 + have hpow : L ^ t = 0 := (mul_eq_zero.mp hterm).resolve_left hW + exact (ENNReal.rpow_eq_zero_iff_of_pos ht).mp hpow + +private theorem negativeLocalization_pairing_eq_zero_of_full_eq_zero {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) + (hh : cubeEuclideanWspFullENorm Q s p h.toField = 0) : + cubeEuclideanNormalizedSmoothPairing F h = 0 := by + have hLp : (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent h.toField = 0 := + negativeLocalization_normalizedLp_eq_zero_of_full_eq_zero Q s p h.toField hh + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (h.toField x)) + (normalizedCubeMeasure Q) := by + simpa only [euclideanNorm_eq_norm_ofVec] using + (CubeEuclideanWspSmoothTest.euclideanMemLp_of_continuous Q + p.exponent h.contDiff.continuous).aestronglyMeasurable.norm + have hLp' : eLpNorm (fun x => euclideanNorm (h.toField x)) + p.exponent (normalizedCubeMeasure Q) = 0 := by + rw [← cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rw [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ (by + rwa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure])] at hLp + exact hLp + have hp_ne_zero : p.exponent ≠ 0 := + ne_of_gt (lt_trans zero_lt_one p.one_lt) + have hnorm_zero : (fun x => euclideanNorm (h.toField x)) =ᵐ[ + normalizedCubeMeasure Q] 0 := + (eLpNorm_eq_zero_iff hp_ne_zero).mp hLp' + have hfield_zero : h.toField =ᵐ[normalizedCubeMeasure Q] 0 := by + filter_upwards [hnorm_zero] with x hx + exact euclideanNorm_eq_zero_iff.mp hx + unfold cubeEuclideanNormalizedSmoothPairing + apply integral_eq_zero_of_ae + filter_upwards [hfield_zero] with x hx + simp [hx, vecDot] + +private theorem negativeLocalization_pairing_le_dual_mul_full {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) + (hNtop : cubeEuclideanWspFullENorm Q s p.conjugate h.toField < ∞) : + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + cubeEuclideanNegativeWspSmoothDualENorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + set N := cubeEuclideanWspFullENorm Q s p.conjugate h.toField + set D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + by_cases hNzero : N = 0 + · have hzero : cubeEuclideanNormalizedSmoothPairing F h = 0 := by + apply negativeLocalization_pairing_eq_zero_of_full_eq_zero Q s F h + simpa only [N] using hNzero + simp [hzero, hNzero] + · let r : ℝ := N.toReal⁻¹ + have hrpos : 0 < r := by + dsimp [r] + exact inv_pos.mpr (ENNReal.toReal_pos hNzero hNtop.ne) + let hs := h.scale r + have hhsnorm : cubeEuclideanWspFullENorm Q s p.conjugate hs.toField = 1 := by + change cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => r • h.toField x) = 1 + rw [negativeLocalization_fullENorm_smul] + change ‖r‖ₑ * N = 1 + have hr : ENNReal.ofReal r = N⁻¹ := by + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop.ne), + ENNReal.ofReal_toReal hNtop.ne] + rw [Real.enorm_eq_ofReal hrpos.le, hr, + ENNReal.inv_mul_cancel hNzero hNtop.ne] + let u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate := + ⟨hs, hhsnorm.le⟩ + have hu : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| ≤ D := by + rw [show D = cubeEuclideanNegativeWspSmoothDualENorm Q s p F by rfl, + cubeEuclideanNegativeWspSmoothDualENorm] + exact le_iSup (fun u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate => + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F u.1|) u + have hpair : cubeEuclideanNormalizedSmoothPairing F hs = + r * cubeEuclideanNormalizedSmoothPairing F h := by + exact negativeLocalization_pairing_scale F h r + have hscaled : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| = + N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| := by + rw [hpair, abs_mul, abs_of_pos hrpos, ENNReal.ofReal_mul hrpos.le] + congr 1 + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop.ne), + ENNReal.ofReal_toReal hNtop.ne] + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| = + N * (N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h|) := by + rw [← mul_assoc, ENNReal.mul_inv_cancel hNzero hNtop.ne, one_mul] + _ = N * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| := by + rw [hscaled] + _ ≤ N * D := by simpa [mul_comm] using mul_le_mul_left hu N + _ = D * N := mul_comm _ _ + +private theorem negativeLocalization_finite_holder_average {ι : Type*} + (D : Finset ι) (hD : D.Nonempty) (p : FiniteLpExponent) (a b : ι → ℝ≥0∞) : + ((D.card : ℝ≥0∞)⁻¹ * ∑ i ∈ D, a i * b i) ≤ + (((D.card : ℝ≥0∞)⁻¹ * ∑ i ∈ D, a i ^ p.exponent.toReal) ^ + (p.exponent.toReal)⁻¹) * + (((D.card : ℝ≥0∞)⁻¹ * ∑ i ∈ D, b i ^ p.conjugate.exponent.toReal) ^ + (p.conjugate.exponent.toReal)⁻¹) := by + have hp : 1 < p.exponent.toReal := by + rw [← ENNReal.toReal_one, + ENNReal.toReal_lt_toReal ENNReal.one_ne_top p.lt_top.ne] + exact p.one_lt + have hpq : p.exponent.toReal.HolderConjugate p.conjugate.exponent.toReal := by + let : ENNReal.HolderConjugate p.exponent p.conjugate.exponent := p.holderConjugate + exact ENNReal.HolderConjugate.toReal hp + let c : ℝ≥0∞ := (D.card : ℝ≥0∞)⁻¹ + have hc0 : c ≠ 0 := by + rw [show c = (D.card : ℝ≥0∞)⁻¹ by rfl, ENNReal.inv_ne_zero] + simp + have hctop : c ≠ ∞ := by + rw [show c = (D.card : ℝ≥0∞)⁻¹ by rfl, ENNReal.inv_ne_top] + exact_mod_cast Finset.card_ne_zero.mpr hD + have hcp : 0 ≤ p.exponent.toReal⁻¹ := + inv_nonneg.mpr (le_trans zero_le_one hp.le) + have hq : 0 < p.conjugate.exponent.toReal := hpq.symm.pos + have hcq : 0 ≤ p.conjugate.exponent.toReal⁻¹ := inv_nonneg.mpr hq.le + have hcexp : c ^ p.exponent.toReal⁻¹ * + c ^ p.conjugate.exponent.toReal⁻¹ = c := by + rw [← ENNReal.rpow_add _ _ hc0 hctop, hpq.inv_add_inv_eq_one, + ENNReal.rpow_one] + have hholder := ENNReal.inner_le_Lp_mul_Lq D a b hpq + calc + (D.card : ℝ≥0∞)⁻¹ * ∑ i ∈ D, a i * b i = + c * ∑ i ∈ D, a i * b i := by rfl + _ ≤ c * ((∑ i ∈ D, a i ^ p.exponent.toReal) ^ + (1 / p.exponent.toReal) * + (∑ i ∈ D, b i ^ p.conjugate.exponent.toReal) ^ + (1 / p.conjugate.exponent.toReal)) := by + simpa [mul_comm] using mul_le_mul_left hholder c + _ = (c * ∑ i ∈ D, a i ^ p.exponent.toReal) ^ p.exponent.toReal⁻¹ * + (c * ∑ i ∈ D, b i ^ p.conjugate.exponent.toReal) ^ + p.conjugate.exponent.toReal⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ hcp, + ENNReal.mul_rpow_of_nonneg _ _ hcq] + rw [show 1 / p.exponent.toReal = p.exponent.toReal⁻¹ by ring, + show 1 / p.conjugate.exponent.toReal = + p.conjugate.exponent.toReal⁻¹ by ring] + conv_lhs => rw [← hcexp] + ac_rfl + +private theorem negativeLocalization_descendantsAverage_abs_le {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (f : TriadicCube d → ℝ) : + ENNReal.ofReal |descendantsAverage Q j f| ≤ + descendantsENNAverage Q j (fun R => ENNReal.ofReal |f R|) := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + have hD : D.Nonempty := by simpa [D] using descendantsAtDepth_nonempty Q j + have hcard : 0 < (D.card : ℝ) := by + exact_mod_cast Finset.card_pos.mpr hD + rw [descendantsAverage, descendantsENNAverage] + change ENNReal.ofReal |((D.card : ℝ)⁻¹) * ∑ R ∈ D, f R| ≤ _ + rw [abs_mul, abs_of_nonneg (inv_nonneg.mpr hcard.le), + ENNReal.ofReal_mul (inv_nonneg.mpr hcard.le), + ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast] + gcongr + calc + ENNReal.ofReal |∑ R ∈ D, f R| ≤ + ENNReal.ofReal (∑ R ∈ D, |f R|) := + ENNReal.ofReal_le_ofReal (Finset.abs_sum_le_sum_abs f D) + _ = ∑ R ∈ D, ENNReal.ofReal |f R| := by + rw [ENNReal.ofReal_sum_of_nonneg fun R _ => abs_nonneg _] + +/-- The smooth negative full dual norm localizes over triadic descendants with +the exact normalized outer `ℓᵖ` average. -/ +theorem cubeEuclideanNegativeWspSmoothDualENorm_le_descendantsENNAverage {d : ℕ} + (Q : TriadicCube d) (j : ℕ) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + cubeEuclideanNegativeWspSmoothDualENorm Q s p F ≤ + (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * + (descendantsENNAverage Q j (fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNegativeWspSmoothDualENorm R s p + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) ^ + p.exponent.toReal + else 0)) ^ p.exponent.toReal⁻¹ := by + rw [cubeEuclideanNegativeWspSmoothDualENorm] + apply iSup_le + rintro h + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let a : TriadicCube d → ℝ≥0∞ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNegativeWspSmoothDualENorm R s p + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0 + let b : TriadicCube d → ℝ≥0∞ := fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanWspFullENorm R s p.conjugate h.1.toField + else 0 + have hD : D.Nonempty := by simpa [D] using descendantsAtDepth_nonempty Q j + have hpart : cubeEuclideanNormalizedSmoothPairing F h.1 = + descendantsAverage Q j (fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0) := + cubeEuclideanNormalizedSmoothPairing_descendants_eq Q j F h.1 + have hlocal : ∀ (R : TriadicCube d) (hR : R ∈ D), + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR))) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth (by simpa [D] using hR)))| ≤ + a R * b R := by + intro R hR + have hR' : R ∈ descendantsAtDepth Q j := by simpa [D] using hR + have htop : cubeEuclideanWspFullENorm R s p.conjugate h.1.toField < ∞ := + cubeEuclideanWspFullENorm_descendant_lt_top_of_le_one + Q j s p.conjugate h.1 h.2 hR' + simp only [a, b, dif_pos hR'] + exact negativeLocalization_pairing_le_dual_mul_full R s p + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR')) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR')) htop + have hab : descendantsENNAverage Q j (fun R => + ENNReal.ofReal |if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0|) ≤ descendantsENNAverage Q j (fun R => a R * b R) := by + unfold descendantsENNAverage + apply mul_le_mul_right + apply Finset.sum_le_sum + intro R hR + have hR' : R ∈ D := by simpa only using hR + simp only [dif_pos (by simpa [D] using hR')] + exact hlocal R hR' + + have hbeq : descendantsENNAverage Q j (fun R => b R ^ + p.conjugate.exponent.toReal) = + descendantsENNAverage Q j (fun R => + cubeEuclideanWspFullENorm R s p.conjugate h.1.toField ^ + p.conjugate.exponent.toReal) := by + unfold descendantsENNAverage + congr 1 + apply Finset.sum_congr rfl + intro R hR + simp only [b, dif_pos hR] + have hpositive := descendantsENNAverage_cubeEuclideanWspFullENorm_root_le + Q j s p.conjugate h.1.toField + have hB : (descendantsENNAverage Q j (fun R => b R ^ + p.conjugate.exponent.toReal)) ^ p.conjugate.exponent.toReal⁻¹ ≤ + (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) := by + rw [hbeq] + calc + (descendantsENNAverage Q j (fun R => + cubeEuclideanWspFullENorm R s p.conjugate h.1.toField ^ + p.conjugate.exponent.toReal)) ^ p.conjugate.exponent.toReal⁻¹ ≤ + (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * + cubeEuclideanWspFullENorm Q s p.conjugate h.1.toField := hpositive + _ ≤ (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) := by + simpa [mul_comm] using + mul_le_mul_left h.2 ((ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1)) + have hholder := negativeLocalization_finite_holder_average D hD p a b + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h.1| = + ENNReal.ofReal |descendantsAverage Q j (fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0)| := by rw [hpart] + _ ≤ descendantsENNAverage Q j (fun R => + ENNReal.ofReal |if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNormalizedSmoothPairing + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + (h.1.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) + else 0|) := + negativeLocalization_descendantsAverage_abs_le Q j _ + _ ≤ descendantsENNAverage Q j (fun R => a R * b R) := hab + _ ≤ (descendantsENNAverage Q j (fun R => a R ^ p.exponent.toReal)) ^ + p.exponent.toReal⁻¹ * + (descendantsENNAverage Q j (fun R => b R ^ + p.conjugate.exponent.toReal)) ^ p.conjugate.exponent.toReal⁻¹ := by + simpa [D, descendantsENNAverage] using hholder + _ ≤ (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * + (descendantsENNAverage Q j (fun R => a R ^ p.exponent.toReal)) ^ + p.exponent.toReal⁻¹ := by + simpa [mul_comm] using mul_le_mul_left hB + ((descendantsENNAverage Q j (fun R => a R ^ p.exponent.toReal)) ^ + p.exponent.toReal⁻¹) + _ = (ENNReal.ofReal (3 : ℝ)) ^ ((j : ℝ) * s.1) * + (descendantsENNAverage Q j (fun R => + if hR : R ∈ descendantsAtDepth Q j then + cubeEuclideanNegativeWspSmoothDualENorm R s p + (F.restrictToSubcube + (openCubeSet_subset_of_mem_descendantsAtDepth hR)) ^ + p.exponent.toReal + else 0)) ^ p.exponent.toReal⁻¹ := by + congr 3 + unfold a + funext R + split_ifs + · rfl + · simp [ENNReal.zero_rpow_of_pos + (ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne)] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspPowerTwoBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspPowerTwoBridge.lean new file mode 100644 index 0000000000..cea307579c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspPowerTwoBridge.lean @@ -0,0 +1,193 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeHsRegularity + +/-! +# The exact `p = 2` Euclidean fractional full-norm bridge + +This module identifies the `p = 2` Euclidean `W^{s,p}` seminorm on an origin +cube with the established physical centered-cube Euclidean `H^s` seminorm. +Their full norms differ only by the elementary comparison between +`sqrt (A^2 + B^2)` and `A + B`. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- On an origin cube, the `p = 2` power weight is the square of the exact +root weight used by the physical Euclidean `H^s` full norm. -/ +theorem cubeEuclideanWspScalePowerWeight_originCube_two {d : ℕ} (m : ℤ) + (s : FractionalOrder) : + cubeEuclideanWspScalePowerWeight (originCube d m) s + FiniteLpExponent.two = + (exactOverlapRootWeight (originCube d m) s.1) ^ (2 : ℝ) := by + rw [exactOverlapRootWeight_originCube_eq_scale_rpow] + simp only [cubeEuclideanWspScalePowerWeight, + cubeScaleFactor_originCube, FiniteLpExponent.two_exponent, + centeredCubeScale] + norm_num + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + congr 1 + ring + +private theorem cubeEuclideanWspKernel_two_enorm_rpow_eq_centeredCubeEuclideanHsIntegrand + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (z : Vec d × Vec d) : + ‖cubeEuclideanWspKernel s FiniteLpExponent.two F z‖ₑ ^ (2 : ℝ) = + centeredCubeEuclideanHsIntegrand s F z := by + rw [← ofReal_norm] + rw [ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) zero_le_two] + rw [norm_cubeEuclideanWspKernel] + norm_num + unfold centeredCubeEuclideanHsIntegrand + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * 2 + (d : ℝ) + rw [show (d : ℝ) + 2 * s.1 = a by simp [a, add_comm, mul_comm]] + rw [show -((d : ℝ) / 2) + -s.1 = -a / 2 by dsimp [a]; ring] + rw [euclideanNorm_eq_norm_ofVec] + by_cases hxy : x = y + · subst y + simp + · have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hpower : + (euclideanDist x y ^ (-a / 2)) ^ 2 = + (euclideanDist x y) ^ (-a) := by + rw [← Real.rpow_natCast, ← Real.rpow_mul heuclideanDist.le] + congr 1 + ring + rw [mul_pow, hpower] + have hneg : (euclideanDist x y) ^ (-a) = + ((euclideanDist x y) ^ a)⁻¹ := Real.rpow_neg heuclideanDist.le a + rw [hneg, div_eq_mul_inv] + congr 1 + exact mul_comm _ _ + +/-- At `p = 2`, the Euclidean `W^{s,p}` seminorm on an origin cube is exactly +the physical centered-cube Euclidean `H^s` seminorm. -/ +theorem cubeEuclideanWspESeminorm_originCube_two_eq_centeredCubeEuclideanHsESeminorm + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + cubeEuclideanWspESeminorm (originCube d m) s FiniteLpExponent.two F = + centeredCubeEuclideanHsESeminorm s F := by + rw [cubeEuclideanWspESeminorm_eq_lintegral] + norm_num only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat] + change (∫⁻ z, ‖cubeEuclideanWspKernel s FiniteLpExponent.two F z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m)) ^ (1 / (2 : ℝ)) = + centeredCubeEuclideanHsESeminorm s F + rw [show Gagliardo.gagliardoCubeMeasure (originCube d m) = + centeredCubeEuclideanHsProductMeasure d m by + exact (centeredCubeEuclideanHsProductMeasure_eq_gagliardoCubeMeasure d m).symm] + simp_rw [cubeEuclideanWspKernel_two_enorm_rpow_eq_centeredCubeEuclideanHsIntegrand] + change (∫⁻ z, centeredCubeEuclideanHsIntegrand s F z + ∂centeredCubeEuclideanHsProductMeasure d m) ^ (1 / (2 : ℝ)) = + (∫⁻ z, centeredCubeEuclideanHsIntegrand s F z + ∂centeredCubeEuclideanHsProductMeasure d m) ^ ((2 : ℝ)⁻¹) + ring_nf + +private theorem cubeEuclideanWsp_originCube_two_l2_eq {d : ℕ} (m : ℤ) + (F : CenteredCubeEuclideanL2Field d m) : + (cubeBoundedMeasurableDomain (originCube d m)).normalizedEuclideanLpENorm + FiniteLpExponent.two.exponent F = + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F := by + simp only [FiniteLpExponent.two_exponent] + rfl + +private theorem cubeEuclideanWspFullENorm_originCube_two_eq_l2Combination + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + cubeEuclideanWspFullENorm (originCube d m) s FiniteLpExponent.two F = + ((exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F) ^ (2 : ℝ) + + (centeredCubeEuclideanHsESeminorm s F) ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + unfold cubeEuclideanWspFullENorm + rw [cubeEuclideanWspScalePowerWeight_originCube_two, + cubeEuclideanWsp_originCube_two_l2_eq, + cubeEuclideanWspESeminorm_originCube_two_eq_centeredCubeEuclideanHsESeminorm] + norm_num only [FiniteLpExponent.two_exponent, ENNReal.toReal_ofNat] + rw [← ENNReal.mul_rpow_of_nonneg _ _ zero_le_two] + +private theorem l2Combination_le_add (a b : ℝ≥0∞) : + (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) ≤ a + b := by + calc + (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) ≤ + ((a + b) ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := + ENNReal.rpow_le_rpow + (ENNReal.add_rpow_le_rpow_add (p := (2 : ℝ)) a b (by norm_num)) + (by norm_num) + _ = a + b := by + rw [← ENNReal.rpow_mul] + norm_num + +private theorem add_le_two_mul_l2Combination (a b : ℝ≥0∞) : + a + b ≤ 2 * (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + have ha_sq : a ^ (2 : ℝ) ≤ a ^ (2 : ℝ) + b ^ (2 : ℝ) := le_add_right le_rfl + have hb_sq : b ^ (2 : ℝ) ≤ a ^ (2 : ℝ) + b ^ (2 : ℝ) := le_add_left le_rfl + have ha : a ≤ (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + calc + a = (a ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + rw [← ENNReal.rpow_mul] + norm_num + _ ≤ _ := ENNReal.rpow_le_rpow ha_sq (by norm_num) + have hb : b ≤ (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + calc + b = (b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + rw [← ENNReal.rpow_mul] + norm_num + _ ≤ _ := ENNReal.rpow_le_rpow hb_sq (by norm_num) + rw [show (2 : ℝ≥0∞) * (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) = + (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) + + (a ^ (2 : ℝ) + b ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) by ring] + exact add_le_add ha hb + +/-- The power-sum Euclidean `W^{s,2}` full norm and the additive physical +centered-cube Euclidean `H^s` full norm are uniformly equivalent. -/ +theorem exists_centeredCubeEuclideanPowerFullENorm_two_equivalence + (d : ℕ) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m), + cubeEuclideanWspFullENorm (originCube d m) s + FiniteLpExponent.two F ≤ + C * centeredCubeEuclideanHsFullENorm s F ∧ + centeredCubeEuclideanHsFullENorm s F ≤ + C * cubeEuclideanWspFullENorm (originCube d m) s + FiniteLpExponent.two F := by + refine ⟨2, by norm_num, ?_⟩ + intro m s F + let A : ℝ≥0∞ := exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F + let B : ℝ≥0∞ := centeredCubeEuclideanHsESeminorm s F + have hW : cubeEuclideanWspFullENorm (originCube d m) s + FiniteLpExponent.two F = + (A ^ (2 : ℝ) + B ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) := by + simpa only [A, B] using cubeEuclideanWspFullENorm_originCube_two_eq_l2Combination s F + have hH : centeredCubeEuclideanHsFullENorm s F = A + B := by + rfl + constructor + · rw [hW, hH] + calc + (A ^ (2 : ℝ) + B ^ (2 : ℝ)) ^ (1 / (2 : ℝ)) ≤ A + B := + l2Combination_le_add A B + _ ≤ 2 * (A + B) := by + simpa [mul_comm] using + (mul_le_mul_left (show (1 : ℝ≥0∞) ≤ 2 by norm_num) (A + B)) + · rw [hW, hH] + exact add_le_two_mul_l2Combination A B + +end diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDensity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDensity.lean new file mode 100644 index 0000000000..693c8d5582 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDensity.lean @@ -0,0 +1,1328 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoLpBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpCoordinate +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Convergence +public import Mathlib.MeasureTheory.Integral.DominatedConvergence + +/-! +# Smooth density for Euclidean fractional Sobolev fields + +This module is the source-facing smooth-density layer for the Euclidean +fractional full norm on a triadic cube. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem cubeEuclideanWspField_component_memLpOn {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (i : Fin d) : + MemLpOn (openCubeSet Q) p.exponent (fun x => F.toField x i) := by + rw [MemLpOn] + have hcomponent : MemLp (fun x => F.toField x i) p.exponent + (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + F.euclideanMemLp.eval_piLp i + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] at hcomponent + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have hc0 : c ≠ 0 := by + dsimp only [c] + exact ENNReal.ofReal_ne_zero_iff.mpr (inv_pos.mpr (cubeVolume_pos Q)) + have hctop : c ≠ ⊤ := by + dsimp only [c] + exact ENNReal.ofReal_ne_top + apply MemLp.of_measure_le_smul (μ := c • volume.restrict (openCubeSet Q)) + (c := c⁻¹) (ENNReal.inv_ne_top.2 hc0) + · simpa only [smul_smul, ENNReal.inv_mul_cancel hc0 hctop, one_smul] using + (le_refl (volume.restrict (openCubeSet Q))) + · simpa only [c] using hcomponent + +/-- The global componentwise convex smoothing representative of a Euclidean +fractional field. -/ +private noncomputable def cubeEuclideanWspConvexApproxSmoothField {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r ε : ℝ) : Vec d → Vec d := + fun x i => convexApproxSmoothRepresentative (openCubeSet Q) + (unitConvexApproxKernel (d := d)) (fun y => F.toField y i) x0 r ε x + +private theorem contDiff_cubeEuclideanWspConvexApproxSmoothField {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) {r ε : ℝ} + (hr : 0 < r) (hε : 0 < ε) : + ContDiff ℝ (⊤ : ℕ∞) + (cubeEuclideanWspConvexApproxSmoothField F x0 r ε) := by + rw [contDiff_pi] + intro i + exact contDiff_convexApproxSmoothRepresentative + (isOpen_openCubeSet Q).measurableSet + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) p.one_lt.le + (cubeEuclideanWspField_component_memLpOn F i) hr hε + +private noncomputable def cubeEuclideanWspConvexApproxSmoothTest {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) {r ε : ℝ} + (hr : 0 < r) (hε : 0 < ε) : CubeEuclideanWspSmoothTest Q s p where + toField := cubeEuclideanWspConvexApproxSmoothField F x0 r ε + contDiff := contDiff_cubeEuclideanWspConvexApproxSmoothField F x0 hr hε + +private theorem closedBall_halfCubeRadius_subset_openCubeSet {d : ℕ} + (Q : TriadicCube d) : + Metric.closedBall (cubeCenter Q) (cubeRadius Q / 2) ⊆ openCubeSet Q := by + rw [← ball_cubeCenter_eq_openCubeSet] + exact Metric.closedBall_subset_ball (half_lt_self (cubeRadius_pos Q)) + +private theorem tendsto_diagonalConvexApproxSample_atTop {d : ℕ} + (Q : TriadicCube d) {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (xy : Vec d × Vec d) (hxy : xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q)) + (z : Vec d) (hz : z ∈ tsupport (unitConvexApproxKernel (d := d))) : + Filter.Tendsto + (fun n : ℕ => diagonalConvexApproxSample x0 z r + (unitConvexApproxScale n) xy) + Filter.atTop (nhds xy) := by + have hz_norm : ‖z‖ ≤ 1 := by + have hzball := (isConvexApproxKernel_unitConvexApproxKernel (d := d)).support_subset_closedBall hz + simpa only [Metric.mem_closedBall, dist_zero_right] using hzball + have hε0 : ∀ n : ℕ, 0 ≤ unitConvexApproxScale n := + unitConvexApproxScale_nonneg + have hbound : ∀ n : ℕ, + dist (diagonalConvexApproxSample x0 z r (unitConvexApproxScale n) xy) xy ≤ + unitConvexApproxScale n * + (2 * Classical.choose (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain) := by + intro n + rw [Prod.dist_eq] + apply max_le + · simpa only [dist_eq_norm_sub, diagonalConvexApproxSample_apply] using + (norm_convexApproxSample_sub_le_two_mul_choose_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) hxy.1 hball hr hz_norm (hε0 n)) + · simpa only [dist_eq_norm_sub, diagonalConvexApproxSample_apply] using + (norm_convexApproxSample_sub_le_two_mul_choose_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_openCubeSet Q) hxy.2 hball hr hz_norm (hε0 n)) + rw [Metric.tendsto_nhds] + intro δ hδ + have hscaled : Filter.Tendsto + (fun n : ℕ => unitConvexApproxScale n * + (2 * Classical.choose (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain)) + Filter.atTop (nhds 0) := by + simpa using tendsto_unitConvexApproxScale_zero.mul_const + (2 * Classical.choose (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain) + have hC0 : 0 ≤ 2 * Classical.choose + (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain := by + exact mul_nonneg (by norm_num) + (le_of_lt (Classical.choose_spec + (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain).1) + have hchoose0 : 0 ≤ Classical.choose + (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain := + le_of_lt (Classical.choose_spec + (isOpenBoundedConvexDomain_openCubeSet Q).isBoundedDomain).1 + filter_upwards [Metric.tendsto_nhds.mp hscaled δ hδ] with n hn + exact lt_of_le_of_lt (hbound n) (by + simpa [abs_of_nonneg (hε0 n), abs_of_nonneg hchoose0, Real.dist_eq] using hn) + +private theorem tendsto_diagonalConvexApproxAverage_apply_of_boundedContinuous + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) + (G : BoundedContinuousFunction (Vec d × Vec d) E) + {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (xy : Vec d × Vec d) (hxy : xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q)) : + Filter.Tendsto + (fun n : ℕ => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r (unitConvexApproxScale n) xy) + Filter.atTop (nhds (G xy)) := by + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsProbabilityMeasure ν := by + simpa only [ν] using + isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + have hmeas : ∀ n : ℕ, AEStronglyMeasurable + (fun z : Vec d => G (diagonalConvexApproxSample x0 z r + (unitConvexApproxScale n) xy)) ν := by + intro n + exact (G.continuous.comp (by + change Continuous (fun z : Vec d => + ((1 - unitConvexApproxScale n) • xy.1 + + unitConvexApproxScale n • (x0 - r • z), + (1 - unitConvexApproxScale n) • xy.2 + + unitConvexApproxScale n • (x0 - r • z))) + fun_prop)).aestronglyMeasurable + have hbound : ∀ n : ℕ, ∀ᵐ z ∂ν, + ‖G (diagonalConvexApproxSample x0 z r (unitConvexApproxScale n) xy)‖ ≤ ‖G‖ := by + intro n + exact Filter.Eventually.of_forall fun z => G.norm_coe_le_norm _ + have hlim : ∀ᵐ z ∂ν, + Filter.Tendsto + (fun n : ℕ => G (diagonalConvexApproxSample x0 z r + (unitConvexApproxScale n) xy)) + Filter.atTop (nhds (G xy)) := by + filter_upwards [ae_mem_tsupport_convexApproxKernelMeasure + (ρ := unitConvexApproxKernel (d := d))] with z hz + exact (G.continuous.tendsto xy).comp + (tendsto_diagonalConvexApproxSample_atTop Q hball hr xy hxy z hz) + have hint : Filter.Tendsto + (fun n : ℕ => ∫ z, G (diagonalConvexApproxSample x0 z r + (unitConvexApproxScale n) xy) ∂ν) + Filter.atTop (nhds (∫ _z, G xy ∂ν)) := by + exact tendsto_integral_of_dominated_convergence (fun _ => ‖G‖) + hmeas (integrable_const ‖G‖) hbound hlim + rw [show (fun n : ℕ => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r (unitConvexApproxScale n) xy) = + fun n : ℕ => ∫ z, G (diagonalConvexApproxSample x0 z r + (unitConvexApproxScale n) xy) ∂ν by + funext n + simpa only [ν] using + (diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy)] + simpa using hint + +private theorem aestronglyMeasurable_diagonalConvexApproxAverage_of_boundedContinuous + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) + (G : BoundedContinuousFunction (Vec d × Vec d) E) + (x0 : Vec d) (r ε : ℝ) : + AEStronglyMeasurable + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) G x0 r ε) + (Gagliardo.gagliardoCubeMeasure Q) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsProbabilityMeasure ν := by + simpa only [ν] using + isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + have hjoint : AEStronglyMeasurable + (fun xyz : (Vec d × Vec d) × Vec d => + G (diagonalConvexApproxSample x0 xyz.2 r ε xyz.1)) (μ.prod ν) := by + exact (G.continuous.comp (by + change Continuous (fun xyz : (Vec d × Vec d) × Vec d => + ((1 - ε) • xyz.1.1 + ε • (x0 - r • xyz.2), + (1 - ε) • xyz.1.2 + ε • (x0 - r • xyz.2))) + fun_prop)).aestronglyMeasurable + have havg : AEStronglyMeasurable + (fun xy => ∫ z, G (diagonalConvexApproxSample x0 z r ε xy) ∂ν) μ := + hjoint.integral_prod_right' + simpa only [ν] using havg.congr + (Filter.Eventually.of_forall fun xy => + (diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) G x0 r ε xy).symm) + +private theorem ae_mem_openCubeProduct_gagliardoCubeMeasure {d : ℕ} + (Q : TriadicCube d) : + ∀ᵐ xy ∂Gagliardo.gagliardoCubeMeasure Q, + xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q) := by + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + let μ := (volume.restrict (openCubeSet Q)).prod + (volume.restrict (openCubeSet Q)) + have hμ : ∀ᵐ xy ∂μ, xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q) := by + rw [MeasureTheory.ae_iff] + change μ ((openCubeSet Q) ×ˢ (openCubeSet Q))ᶜ = 0 + dsimp only [μ] + rw [Measure.prod_restrict] + rw [Measure.restrict_apply + ((isOpen_openCubeSet Q).measurableSet.prod (isOpen_openCubeSet Q).measurableSet).compl] + rw [Set.compl_inter_self, MeasureTheory.measure_empty] + rw [Gagliardo.gagliardoCubeMeasure, normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet, Measure.prod_smul_left] + change ∀ᵐ xy ∂c • μ, xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q) + exact Measure.ae_smul_measure hμ c + +private theorem norm_diagonalConvexApproxAverage_le_norm_boundedContinuous + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (G : BoundedContinuousFunction (Vec d × Vec d) E) + (x0 : Vec d) (r ε : ℝ) (xy : Vec d × Vec d) : + ‖diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) G x0 r ε xy‖ ≤ + ‖G‖ := by + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsProbabilityMeasure ν := by + simpa only [ν] using + isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + rw [diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d))] + simpa only [MeasureTheory.measureReal_def, MeasureTheory.measure_univ, + ENNReal.toReal_one, mul_one] using + (norm_integral_le_of_norm_le_const + (μ := ν) (Filter.Eventually.of_forall fun z => G.norm_coe_le_norm _)) + +private theorem tendsto_eLpNorm_diagonalConvexApproxAverage_sub_zero_of_boundedContinuous + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) (p : FiniteLpExponent) + (G : BoundedContinuousFunction (Vec d × Vec d) E) + {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) : + Filter.Tendsto + (fun n : ℕ => eLpNorm + (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) + p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + Filter.atTop (nhds 0) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let q := p.exponent.toReal + let C : ℝ≥0∞ := ENNReal.ofReal (2 * ‖G‖) ^ q + have hqpos : 0 < q := by + dsimp only [q] + exact ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hq0 : 0 ≤ q := ENNReal.toReal_nonneg + have hmeas : ∀ n : ℕ, AEMeasurable + (fun xy => ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q) μ := by + intro n + exact ENNReal.continuous_rpow_const.measurable.comp_aemeasurable + ((aestronglyMeasurable_diagonalConvexApproxAverage_of_boundedContinuous + Q G x0 r (unitConvexApproxScale n)).sub + G.continuous.aestronglyMeasurable).enorm + have hbound : ∀ n : ℕ, (fun xy => ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q) ≤ᵐ[μ] + fun _ => C := by + intro n + filter_upwards with xy + have havg : ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy‖ ≤ ‖G‖ := + norm_diagonalConvexApproxAverage_le_norm_boundedContinuous G x0 r + (unitConvexApproxScale n) xy + have hnorm : ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ ≤ 2 * ‖G‖ := by + calc + ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ ≤ + ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy‖ + ‖G xy‖ := norm_sub_le _ _ + _ ≤ ‖G‖ + ‖G‖ := add_le_add havg (G.norm_coe_le_norm _) + _ = 2 * ‖G‖ := by ring + exact ENNReal.rpow_le_rpow (by + simpa only [ofReal_norm] using ENNReal.ofReal_le_ofReal hnorm) hq0 + have hfin : ∫⁻ _xy, C ∂μ ≠ ⊤ := by + rw [lintegral_const] + exact ENNReal.mul_ne_top + (ENNReal.rpow_ne_top_of_nonneg hq0 ENNReal.ofReal_ne_top) + (MeasureTheory.measure_lt_top μ Set.univ).ne + have hlim : ∀ᵐ xy ∂μ, Filter.Tendsto + (fun n : ℕ => ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q) + Filter.atTop (nhds 0) := by + filter_upwards [ae_mem_openCubeProduct_gagliardoCubeMeasure Q] with xy hxy + have hpoint := tendsto_diagonalConvexApproxAverage_apply_of_boundedContinuous + Q G hball hr xy hxy + have hsub : Filter.Tendsto + (fun n : ℕ => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) + Filter.atTop (nhds 0) := by + have hconst : Filter.Tendsto (fun _n : ℕ => G xy) + Filter.atTop (nhds (G xy)) := tendsto_const_nhds + simpa using hpoint.sub hconst + have henorm := (continuous_enorm.tendsto (0 : E)).comp hsub + have henorm' : Filter.Tendsto + (fun n : ℕ => ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ) + Filter.atTop (nhds 0) := by + simpa only [Function.comp_apply, enorm_zero] using! henorm + have hrpow := ((ENNReal.continuous_rpow_const (y := q)).tendsto + (0 : ℝ≥0∞)).comp henorm' + simpa only [Function.comp_apply, enorm_zero, ENNReal.zero_rpow_of_pos hqpos] using! hrpow + have hpower : Filter.Tendsto + (fun n : ℕ => ∫⁻ xy, ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q ∂μ) + Filter.atTop (nhds 0) := by + simpa using tendsto_lintegral_of_dominated_convergence' + (fun _ => C) hmeas hbound hfin hlim + rw [show (fun n : ℕ => eLpNorm + (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) + p.exponent μ) = fun n : ℕ => + (∫⁻ xy, ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q ∂μ) ^ (1 / q) by + funext n + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne]] + have hrpow : Filter.Tendsto + (fun n : ℕ => (∫⁻ xy, ‖diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy‖ₑ ^ q ∂μ) ^ (1 / q)) + Filter.atTop (nhds 0) := + by + have hraw := ((ENNReal.continuous_rpow_const (y := 1 / q)).tendsto + (0 : ℝ≥0∞)).comp hpower + have hzero : (0 : ℝ≥0∞) ^ (1 / q) = 0 := + by simpa only [one_div] using ENNReal.zero_rpow_of_pos (inv_pos.mpr hqpos) + simpa only [Function.comp_apply, hzero] using! hraw + simpa only [Function.comp_apply, ENNReal.zero_rpow_of_pos (inv_pos.mpr hqpos)] using hrpow + +private theorem memLp_comp_diagonalConvexApproxJointSample {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [TopologicalSpace E] [ContinuousENorm E] + (Q : TriadicCube d) (p : FiniteLpExponent) (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + MemLp + (K ∘ diagonalConvexApproxJointSample x0 r ε) + p.exponent + ((Gagliardo.gagliardoCubeMeasure Q).prod + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) ) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let J : ℝ≥0∞ := ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ 2 + let T := diagonalConvexApproxJointSample x0 r ε + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + have hmap : Measure.map T (μ.prod ν) ≤ J • μ := by + simpa only [μ, ν, J, T] using + (map_diagonalConvexApproxJointSample_le Q + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hε hball hr hε0 hε1) + have hJtop : J ≠ ⊤ := by + dsimp only [J] + exact ENNReal.pow_ne_top ENNReal.ofReal_ne_top + have hKmap : MemLp K p.exponent (Measure.map T (μ.prod ν)) := + MemLp.of_measure_le_smul hJtop hmap hK + exact (memLp_map_measure_iff hKmap.aestronglyMeasurable + (measurable_diagonalConvexApproxJointSample x0 r ε).aemeasurable).mp hKmap + +private theorem ae_diagonalConvexApproxAverage_sub {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (Q : TriadicCube d) (p : FiniteLpExponent) + (K L : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + (hL : MemLp L p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) (K - L) x0 r ε xy) =ᵐ[ + Gagliardo.gagliardoCubeMeasure Q] + fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r ε xy - + diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) L x0 r ε xy := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + let : SFinite ν := inferInstance + let : IsFiniteMeasure μ := inferInstance + let : IsFiniteMeasure (μ.prod ν) := inferInstance + have hKjoint := memLp_comp_diagonalConvexApproxJointSample + Q p K hK hε hball hr hε0 hε1 + have hLjoint := memLp_comp_diagonalConvexApproxJointSample + Q p L hL hε hball hr hε0 hε1 + have hKsection : ∀ᵐ xy ∂μ, Integrable + (fun z => K (diagonalConvexApproxSample x0 z r ε xy)) ν := by + simpa only [Function.comp_apply, diagonalConvexApproxJointSample] using + (hKjoint.integrable p.one_lt.le).prod_right_ae + have hLsection : ∀ᵐ xy ∂μ, Integrable + (fun z => L (diagonalConvexApproxSample x0 z r ε xy)) ν := by + simpa only [Function.comp_apply, diagonalConvexApproxJointSample] using + (hLjoint.integrable p.one_lt.le).prod_right_ae + filter_upwards [hKsection, hLsection] with xy hKxy hLxy + rw [diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) (K - L) x0 r ε xy, + diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) K x0 r ε xy, + diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) L x0 r ε xy] + exact integral_sub hKxy hLxy + +private theorem aestronglyMeasurable_diagonalConvexApproxAverage_of_memLp + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) (p : FiniteLpExponent) + (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {x0 : Vec d} {r ε : ℝ} (hε : ε < 1) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + AEStronglyMeasurable + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r ε) + (Gagliardo.gagliardoCubeMeasure Q) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + have hjoint := memLp_comp_diagonalConvexApproxJointSample + Q p K hK hε hball hr hε0 hε1 + have havg : AEStronglyMeasurable + (fun xy => ∫ z, K (diagonalConvexApproxSample x0 z r ε xy) ∂ν) μ := by + exact hjoint.aestronglyMeasurable.integral_prod_right' + simpa only [μ, ν] using havg.congr + (Filter.Eventually.of_forall fun xy => + (diagonalConvexApproxAverage_eq_integral_kernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) K x0 r ε xy).symm) + +private theorem tendsto_eLpNorm_diagonalConvexApproxAverage_sub_zero_of_memLp + {d : ℕ} {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [CompleteSpace E] (Q : TriadicCube d) (p : FiniteLpExponent) + (K : Vec d × Vec d → E) + (hK : MemLp K p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) : + Filter.Tendsto + (fun n : ℕ => eLpNorm + (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy) + p.exponent (Gagliardo.gagliardoCubeMeasure Q)) + Filter.atTop (nhds 0) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hηtop : η = ⊤ + · exact Filter.Eventually.of_forall (fun n => by simp [hηtop]) + obtain ⟨η₁, hη₁_pos, hη₁⟩ := + MeasureTheory.exists_Lp_half (μ := μ) (ε := E) (p := p.exponent) hη.ne' + obtain ⟨η₂, hη₂_pos, hη₂⟩ := + MeasureTheory.exists_Lp_half (μ := μ) (ε := E) (p := p.exponent) hη₁_pos.ne' + have hevent_pos : ∀ᶠ n : ℕ in Filter.atTop, + 0 < unitConvexApproxScale n := + Filter.Eventually.of_forall (fun n => by + dsimp [unitConvexApproxScale] + positivity) + have hevent_half : ∀ᶠ n : ℕ in Filter.atTop, + unitConvexApproxScale n < (1 / 2 : ℝ) := + (tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 _ (by positivity) + let C : ℝ≥0∞ := + (ENNReal.ofReal (((1 / 2 : ℝ) ^ d)⁻¹) ^ 2) ^ (1 / p.exponent).toReal + have hC_pos : 0 < C := by + dsimp [C] + positivity + have hC_ne_zero : C ≠ 0 := ne_of_gt hC_pos + have hC_ne_top : C ≠ ⊤ := by + dsimp [C] + exact (ENNReal.rpow_lt_top_of_nonneg (by positivity) + (ENNReal.pow_ne_top ENNReal.ofReal_ne_top)).ne + let δ : ℝ≥0∞ := min η₂ (η₁ / C) + have hδ_pos : 0 < δ := by + have hdiv : 0 < η₁ / C := ENNReal.div_pos hη₁_pos.ne' hC_ne_top + dsimp only [δ] + exact lt_min hη₂_pos hdiv + obtain ⟨G, happrox, hG⟩ := + hK.exists_boundedContinuous_eLpNorm_sub_le p.lt_top.ne (ε := δ) hδ_pos.ne' + have hdiff : MemLp (K - (G : Vec d × Vec d → E)) p.exponent μ := hK.sub hG + have hthird : eLpNorm ((G : Vec d × Vec d → E) - K) p.exponent μ ≤ η₂ := by + calc + eLpNorm ((G : Vec d × Vec d → E) - K) p.exponent μ = + eLpNorm (K - (G : Vec d × Vec d → E)) p.exponent μ := by + rw [← eLpNorm_neg] + apply eLpNorm_congr_ae + filter_upwards with xy + simp only [Pi.sub_apply, neg_sub] + _ ≤ δ := happrox + _ ≤ η₂ := min_le_left _ _ + have hmiddle_tendsto := + tendsto_eLpNorm_diagonalConvexApproxAverage_sub_zero_of_boundedContinuous + Q p G hball hr + have hmiddle_eventually : ∀ᶠ n : ℕ in Filter.atTop, + eLpNorm (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) p.exponent μ ≤ η₂ := + ENNReal.tendsto_nhds_zero.1 hmiddle_tendsto η₂ hη₂_pos + have hfirst_eventually : ∀ᶠ n : ℕ in Filter.atTop, + eLpNorm (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy) p.exponent μ ≤ η₁ := by + filter_upwards [hevent_pos, hevent_half] with n hεpos hεhalf + have hfactor : + (ENNReal.ofReal (((1 - unitConvexApproxScale n) ^ d)⁻¹) ^ 2) ^ + (1 / p.exponent).toReal ≤ C := by + have hhalf : (1 / 2 : ℝ) ≤ 1 - unitConvexApproxScale n := by linarith + have hpow : (1 / 2 : ℝ) ^ d ≤ (1 - unitConvexApproxScale n) ^ d := + pow_le_pow_left₀ (by positivity) hhalf d + have hhalf_pos : 0 < (1 / 2 : ℝ) ^ d := by positivity + have hinv : ((1 - unitConvexApproxScale n) ^ d)⁻¹ ≤ + ((1 / 2 : ℝ) ^ d)⁻¹ := by + simpa [one_div] using one_div_le_one_div_of_le hhalf_pos hpow + exact ENNReal.rpow_le_rpow + (pow_le_pow_left₀ bot_le (ENNReal.ofReal_le_ofReal hinv) 2) (by positivity) + have hεlt : unitConvexApproxScale n < 1 := by linarith + have hrewrite := ae_diagonalConvexApproxAverage_sub + Q p K G hK hG hεlt hball hr hεpos.le (by linarith) + calc + eLpNorm (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy) p.exponent μ + = eLpNorm (diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) (K - (G : Vec d × Vec d → E)) x0 r + (unitConvexApproxScale n)) p.exponent μ := by + apply eLpNorm_congr_ae + exact hrewrite.symm + _ ≤ (ENNReal.ofReal (((1 - unitConvexApproxScale n) ^ d)⁻¹) ^ 2) ^ + (1 / p.exponent).toReal * eLpNorm (K - (G : Vec d × Vec d → E)) p.exponent μ := by + exact eLpNorm_diagonalConvexApproxAverage_le_of_memLp Q p + (K - (G : Vec d × Vec d → E)) hdiff + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hεlt hball hr + hεpos.le (by linarith) + _ ≤ (ENNReal.ofReal (((1 - unitConvexApproxScale n) ^ d)⁻¹) ^ 2) ^ + (1 / p.exponent).toReal * δ := by gcongr + _ ≤ C * δ := by gcongr + _ ≤ C * (η₁ / C) := by + gcongr + exact min_le_right _ _ + _ = η₁ := ENNReal.mul_div_cancel hC_ne_zero hC_ne_top + filter_upwards [hevent_pos, hevent_half, hfirst_eventually, hmiddle_eventually] with + n hεpos hεhalf hfirst hmiddle + let A : Vec d × Vec d → E := fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r (unitConvexApproxScale n) xy - + diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy + let B : Vec d × Vec d → E := fun xy => + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) + (G xy - K xy) + have hAmeas : AEStronglyMeasurable A μ := by + dsimp only [A] + exact (aestronglyMeasurable_diagonalConvexApproxAverage_of_memLp Q p K hK + (by linarith) hball hr hεpos.le (by linarith)).sub + (aestronglyMeasurable_diagonalConvexApproxAverage_of_boundedContinuous Q G x0 r + (unitConvexApproxScale n)) + have hBmeas : AEStronglyMeasurable B μ := by + dsimp only [B] + exact + ((aestronglyMeasurable_diagonalConvexApproxAverage_of_boundedContinuous Q G x0 r + (unitConvexApproxScale n)).sub G.continuous.aestronglyMeasurable).add + (hG.aestronglyMeasurable.sub hK.aestronglyMeasurable) + have hBnorm : eLpNorm B p.exponent μ < η₁ := + hη₂ _ _ + ((aestronglyMeasurable_diagonalConvexApproxAverage_of_boundedContinuous Q G x0 r + (unitConvexApproxScale n)).sub G.continuous.aestronglyMeasurable) + (hG.aestronglyMeasurable.sub hK.aestronglyMeasurable) + hmiddle hthird + have hsum : eLpNorm (A + B) p.exponent μ < η := + hη₁ _ _ hAmeas hBmeas hfirst hBnorm.le + calc + eLpNorm (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy) p.exponent μ + = eLpNorm (A + B) p.exponent μ := by + apply eLpNorm_congr_ae + filter_upwards with xy + change diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy = + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) G x0 r (unitConvexApproxScale n) xy) + + ((diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) G x0 r + (unitConvexApproxScale n) xy - G xy) + (G xy - K xy)) + abel + _ ≤ η := hsum.le + +private theorem cubeEuclideanWspKernel_convexApproxSmoothField_eq_scaled_average_of_integrable + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r ε : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) (xy : Vec d × Vec d) + (hxy : xy ∈ (openCubeSet Q) ×ˢ (openCubeSet Q)) + (hint : ∀ i : Fin d, + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.1) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) ∧ + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.2) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d)))) : + cubeEuclideanWspKernel s p + (cubeEuclideanWspConvexApproxSmoothField F x0 r ε) xy = + ((1 - ε) ^ (s.1 + (d : ℝ) / p.exponent.toReal)) • + diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) + (cubeEuclideanWspKernel s p F.toField) x0 r ε xy := by + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let S := cubeEuclideanWspConvexApproxSmoothField F x0 r ε + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hS : S xy.1 - S xy.2 = ∫ z, F.toField + (convexApproxSample x0 z r ε xy.1) - F.toField + (convexApproxSample x0 z r ε xy.2) ∂ν := by + ext i + rw [eval_integral] + · simp only [Pi.sub_apply] + rw [integral_sub (hint i).1 (hint i).2] + simp only [S, cubeEuclideanWspConvexApproxSmoothField] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (isOpenBoundedConvexDomain_openCubeSet Q) hρ hxy.1 hball hr hε0 hε1, + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (isOpenBoundedConvexDomain_openCubeSet Q) hρ hxy.2 hball hr hε0 hε1] + rw [convexApproxSmoothing_apply, convexApproxSmoothing_apply] + simp only [convexApproxIntegrand_apply] + change (∫ z in tsupport (unitConvexApproxKernel (d := d)), + (unitConvexApproxKernel (d := d)) z • F.toField + (convexApproxSample x0 z r ε xy.1) i) - + ∫ z in tsupport (unitConvexApproxKernel (d := d)), + (unitConvexApproxKernel (d := d)) z • F.toField + (convexApproxSample x0 z r ε xy.2) i = _ + rw [setIntegral_smul_eq_integral_convexApproxKernelMeasure hρ, + setIntegral_smul_eq_integral_convexApproxKernelMeasure hρ] + · intro j + exact (hint j).1.sub (hint j).2 + have hinter : Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.1) - F.toField + (convexApproxSample x0 z r ε xy.2)) ν := by + apply Integrable.of_eval + intro i + simpa only [Pi.sub_apply] using! (hint i).1.sub (hint i).2 + rw [show cubeEuclideanWspConvexApproxSmoothField F x0 r ε = S by rfl, + cubeEuclideanWspKernel_apply, hS] + change (euclideanDist xy.1 xy.2 ^ (-(s.1 + (d : ℝ) / p.exponent.toReal))) • + (HilbertVec.ofVecL d) (∫ z, F.toField + (convexApproxSample x0 z r ε xy.1) - F.toField + (convexApproxSample x0 z r ε xy.2) ∂ν) = _ + rw [← (HilbertVec.ofVecL d).integral_comp_comm hinter, + ← integral_smul, + diagonalConvexApproxAverage_eq_integral_kernelMeasure hρ] + rw [← integral_smul] + apply integral_congr_ae + filter_upwards with z + simpa only [S, cubeEuclideanWspConvexApproxSmoothField, + HilbertVec.ofVecL_apply, cubeEuclideanWspKernel_apply, Pi.sub_apply] using + (cubeEuclideanWspKernel_comp_diagonalConvexApproxSample s p F.toField + x0 z r ε hε1 xy) + +private theorem cubeEuclideanWspField_component_comp_fst_memLpGagliardo + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (i : Fin d) : + MemLp (fun xy : Vec d × Vec d => F.toField xy.1 i) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := by + let ν := volume.restrict (cubeSet Q) + let : IsFiniteMeasure ν := by + simpa only [ν, ← volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + (isOpenBoundedConvexDomain_openCubeSet Q).isFiniteMeasure_restrict_volume + have hcomponent : MemLp (fun x => F.toField x i) p.exponent + (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + F.euclideanMemLp.eval_piLp i + simpa only [ν, Gagliardo.gagliardoCubeMeasure] using! hcomponent.comp_fst ν + +private theorem cubeEuclideanWspField_component_comp_snd_memLpGagliardo + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (i : Fin d) : + MemLp (fun xy : Vec d × Vec d => F.toField xy.2 i) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := by + let μ := normalizedCubeMeasure Q + let : IsFiniteMeasure μ := inferInstance + have hcomponent : MemLp (fun x => F.toField x i) p.exponent + (volume.restrict (cubeSet Q)) := by + simpa only [MemLpOn, ← volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] using + cubeEuclideanWspField_component_memLpOn F i + simpa only [μ, Gagliardo.gagliardoCubeMeasure] using! hcomponent.comp_snd μ + +private theorem ae_integrable_diagonalConvexApproxSample_components + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r ε : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + ∀ᵐ xy ∂Gagliardo.gagliardoCubeMeasure Q, ∀ i : Fin d, + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.1) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) ∧ + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.2) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let ν := convexApproxKernelMeasure (unitConvexApproxKernel (d := d)) + let : IsFiniteMeasure μ := inferInstance + let : IsProbabilityMeasure ν := by + simpa only [ν] using isProbabilityMeasure_convexApproxKernelMeasure + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + let : IsFiniteMeasure (μ.prod ν) := inferInstance + have hfst : ∀ i : Fin d, MemLp + ((fun xy : Vec d × Vec d => F.toField xy.1 i) ∘ + diagonalConvexApproxJointSample x0 r ε) p.exponent + (μ.prod ν) := by + intro i + exact memLp_comp_diagonalConvexApproxJointSample Q p _ + (cubeEuclideanWspField_component_comp_fst_memLpGagliardo F i) hε1 hball hr hε0 hε1.le + have hsnd : ∀ i : Fin d, MemLp + ((fun xy : Vec d × Vec d => F.toField xy.2 i) ∘ + diagonalConvexApproxJointSample x0 r ε) p.exponent + (μ.prod ν) := by + intro i + exact memLp_comp_diagonalConvexApproxJointSample Q p _ + (cubeEuclideanWspField_component_comp_snd_memLpGagliardo F i) hε1 hball hr hε0 hε1.le + have hfst' : ∀ i : Fin d, ∀ᵐ xy ∂Gagliardo.gagliardoCubeMeasure Q, + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.1) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) := by + intro i + simpa only [μ, ν, Function.comp_apply, diagonalConvexApproxJointSample] using! + (hfst i).integrable p.one_lt.le |>.prod_right_ae + have hsnd' : ∀ i : Fin d, ∀ᵐ xy ∂Gagliardo.gagliardoCubeMeasure Q, + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.2) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) := by + intro i + simpa only [μ, ν, Function.comp_apply, diagonalConvexApproxJointSample] using! + (hsnd i).integrable p.one_lt.le |>.prod_right_ae + have hall : ∀ᵐ xy ∂Gagliardo.gagliardoCubeMeasure Q, ∀ i : Fin d, + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.1) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) ∧ + Integrable (fun z : Vec d => F.toField + (convexApproxSample x0 z r ε xy.2) i) + (convexApproxKernelMeasure (unitConvexApproxKernel (d := d))) := by + exact ae_all_iff.2 fun i => (hfst' i).and (hsnd' i) + exact hall + +private theorem ae_cubeEuclideanWspKernel_convexApproxSmoothField_eq_scaled_average + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r ε : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) : + cubeEuclideanWspKernel s p + (cubeEuclideanWspConvexApproxSmoothField F x0 r ε) =ᵐ[ + Gagliardo.gagliardoCubeMeasure Q] + ((1 - ε) ^ (s.1 + (d : ℝ) / p.exponent.toReal)) • + diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) + (cubeEuclideanWspKernel s p F.toField) x0 r ε := by + filter_upwards [ae_mem_openCubeProduct_gagliardoCubeMeasure Q, + ae_integrable_diagonalConvexApproxSample_components F x0 r ε hball hr.le hε0.le hε1] with + xy hxy hint + exact cubeEuclideanWspKernel_convexApproxSmoothField_eq_scaled_average_of_integrable + Q s p F x0 r ε hball hr hε0 hε1 xy hxy hint + +private theorem tendsto_fractional_diagonal_scale_one {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) : + Filter.Tendsto + (fun n : ℕ => (1 - unitConvexApproxScale n) ^ + (s.1 + (d : ℝ) / p.exponent.toReal)) + Filter.atTop (nhds 1) := by + have hbase : Filter.Tendsto (fun n : ℕ => 1 - unitConvexApproxScale n) + Filter.atTop (nhds 1) := by + simpa using tendsto_const_nhds.sub tendsto_unitConvexApproxScale_zero + have hpow := (Real.continuousAt_rpow_const 1 + (s.1 + (d : ℝ) / p.exponent.toReal) (Or.inl one_ne_zero)).tendsto.comp hbase + simpa using! hpow + +private theorem tendsto_cubeEuclideanWspESeminorm_convexApproxSmoothField_sub_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => cubeEuclideanWspESeminorm Q s p + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x)) + Filter.atTop (nhds 0) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let K := cubeEuclideanWspKernel s p F.toField + let c : ℕ → ℝ := fun n => (1 - unitConvexApproxScale n) ^ + (s.1 + (d : ℝ) / p.exponent.toReal) + have haverage : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun xy => diagonalConvexApproxAverage + (unitConvexApproxKernel (d := d)) K x0 r (unitConvexApproxScale n) xy - K xy) + p.exponent μ) Filter.atTop (nhds 0) := by + simpa only [μ, K] using + tendsto_eLpNorm_diagonalConvexApproxAverage_sub_zero_of_memLp + Q p K F.euclideanMemWsp hball hr.le + have hc : Filter.Tendsto c Filter.atTop (nhds 1) := by + simpa only [c] using tendsto_fractional_diagonal_scale_one (d := d) s p + have hcnorm : Filter.Tendsto (fun n : ℕ => ‖c n‖ₑ) + Filter.atTop (nhds 1) := by + simpa using! (continuous_enorm.tendsto (1 : ℝ)).comp hc + have hdiffnorm : Filter.Tendsto (fun n : ℕ => ‖c n - 1‖ₑ) + Filter.atTop (nhds 0) := by + have hreal : Filter.Tendsto (fun n : ℕ => c n - 1) + Filter.atTop (nhds 0) := by + simpa using hc.sub (tendsto_const_nhds : Filter.Tendsto + (fun _ : ℕ => (1 : ℝ)) Filter.atTop (nhds 1)) + simpa using! (continuous_enorm.tendsto (0 : ℝ)).comp hreal + have hfirst : Filter.Tendsto (fun n : ℕ => eLpNorm (fun xy => c n • + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy)) p.exponent μ) + Filter.atTop (nhds 0) := by + change Filter.Tendsto (fun n : ℕ => eLpNorm (c n • fun xy => + diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy) p.exponent μ) Filter.atTop (nhds 0) + simpa only [eLpNorm_const_smul, one_mul] using + ENNReal.Tendsto.mul hcnorm (Or.inl one_ne_zero) haverage (Or.inr ENNReal.one_ne_top) + have hKtop : eLpNorm K p.exponent μ ≠ ⊤ := F.euclideanMemWsp.eLpNorm_lt_top.ne + have hsecond : Filter.Tendsto (fun n : ℕ => eLpNorm (fun xy => + (c n - 1) • K xy) p.exponent μ) Filter.atTop (nhds 0) := by + change Filter.Tendsto (fun n : ℕ => eLpNorm ((c n - 1) • K) + p.exponent μ) Filter.atTop (nhds 0) + simpa only [eLpNorm_const_smul, zero_mul] using + ENNReal.Tendsto.mul_const hdiffnorm (Or.inr hKtop) + have hsum : Filter.Tendsto (fun n : ℕ => eLpNorm (fun xy => c n • + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy)) p.exponent μ + + eLpNorm (fun xy => (c n - 1) • K xy) p.exponent μ) + Filter.atTop (nhds 0) := by simpa using hfirst.add hsecond + have hevent_lt : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one + let T : ℕ → ℝ≥0∞ := fun n => cubeEuclideanWspESeminorm Q s p + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x) + let T' : ℕ → ℝ≥0∞ := fun n => if unitConvexApproxScale n < 1 then T n else 0 + have hT' : Filter.Tendsto T' Filter.atTop (nhds 0) := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun _ => bot_le) ?_ + intro n + by_cases hε : unitConvexApproxScale n < 1 + · have hεpos : 0 < unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + have hkernel := ae_cubeEuclideanWspKernel_convexApproxSmoothField_eq_scaled_average + Q s p F x0 r (unitConvexApproxScale n) hball hr hεpos hε + have hfirstmeas : AEStronglyMeasurable (fun xy => c n • + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy)) μ := by + exact (aestronglyMeasurable_diagonalConvexApproxAverage_of_memLp Q p K + F.euclideanMemWsp hε hball hr.le hεpos.le hε.le).sub + F.euclideanMemWsp.aestronglyMeasurable |>.const_smul (c n) + have hsecondmeas : AEStronglyMeasurable (fun xy => (c n - 1) • K xy) μ := + by simpa only [μ, K] using! F.euclideanMemWsp.aestronglyMeasurable.const_smul (c n - 1) + simp only [T', if_pos hε] + change T n ≤ _ + rw [show T n = eLpNorm (cubeEuclideanWspKernel s p (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x)) p.exponent μ by rfl] + calc + eLpNorm (cubeEuclideanWspKernel s p (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x)) p.exponent μ + = eLpNorm (fun xy => c n • + (diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy - K xy) + (c n - 1) • K xy) + p.exponent μ := by + apply eLpNorm_congr_ae + filter_upwards [hkernel] with xy hxy + have hlinear : cubeEuclideanWspKernel s p (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x) xy = + cubeEuclideanWspKernel s p + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n)) xy - K xy := by + dsimp only [K] + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply, + cubeEuclideanWspKernel_apply] + change _ • (HilbertVec.ofVecL d) + ((cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.1 - F.toField xy.1) - + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.2 - F.toField xy.2)) = _ + have hvec : + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.1 - F.toField xy.1) - + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.2 - F.toField xy.2) = + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.1 - + cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) xy.2) - + (F.toField xy.1 - F.toField xy.2) := by + abel + rw [hvec, (HilbertVec.ofVecL d).map_sub, smul_sub] + rfl + have hxy' : cubeEuclideanWspKernel s p + (cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n)) xy = c n • + diagonalConvexApproxAverage (unitConvexApproxKernel (d := d)) K x0 r + (unitConvexApproxScale n) xy := by + simpa only [K, c, Pi.smul_apply] using hxy + rw [hlinear, hxy'] + module + _ ≤ _ := eLpNorm_add_le hfirstmeas hsecondmeas p.one_lt.le + · simp [T', hε] + apply Filter.Tendsto.congr' ?_ hT' + filter_upwards [hevent_lt] with n hn + simp [T', hn, T] + +private theorem tendsto_eLpNorm_component_convexApproxSmoothField_sub_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) (i : Fin d) : + Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r (unitConvexApproxScale n) x i - + F.toField x i) p.exponent (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + let U := openCubeSet Q + let ρ := unitConvexApproxKernel (d := d) + let f : Vec d → ℝ := fun x => F.toField x i + let μ := volume.restrict U + let c := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have hU : IsOpenBoundedConvexDomain U := isOpenBoundedConvexDomain_openCubeSet Q + have hρ : IsConvexApproxKernel ρ := by + simpa only [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hf : MemLpOn U p.exponent f := by + simpa only [U, f] using cubeEuclideanWspField_component_memLpOn F i + have hεpos : ∀ᶠ n : ℕ in Filter.atTop, 0 < unitConvexApproxScale n := + Filter.Eventually.of_forall fun n => by + dsimp [unitConvexApproxScale] + positivity + have hεlt : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one + have hsmoothing : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => convexApproxSmoothing ρ f x0 r + (unitConvexApproxScale n) x - f x) p.exponent μ) + Filter.atTop (nhds 0) := by + exact tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + hU hρ p.one_lt.le p.lt_top.ne hf hball hr tendsto_unitConvexApproxScale_zero + hεpos hεlt + have hrep : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r (unitConvexApproxScale n) x i - + F.toField x i) p.exponent μ) + Filter.atTop (nhds 0) := by + apply Filter.Tendsto.congr' ?_ hsmoothing + filter_upwards [hεpos, hεlt] with n hpos hlt + apply eLpNorm_congr_ae + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + simp only [cubeEuclideanWspConvexApproxSmoothField, f, ρ] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + hU hρ hx hball hr hpos hlt] + have hmeasure : normalizedCubeMeasure Q = c • μ := by + simp only [normalizedCubeMeasure, cubeMeasure, c, μ, U, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + have hctop : c ^ (1 / p.exponent).toReal ≠ ⊤ := by + dsimp only [c] + exact ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg ENNReal.ofReal_ne_top + apply Filter.Tendsto.congr' (Filter.Eventually.of_forall fun n => by + rw [hmeasure, eLpNorm_smul_measure_of_ne_top p.lt_top.ne]) + simpa using ENNReal.Tendsto.const_mul hrep (Or.inr hctop) + +private theorem tendsto_normalizedEuclideanLpENorm_convexApproxSmoothField_sub_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x)) + Filter.atTop (nhds 0) := by + let μ := normalizedCubeMeasure Q + let V : ℕ → Vec d → Vec d := fun n x => + cubeEuclideanWspConvexApproxSmoothField F x0 r (unitConvexApproxScale n) x - F.toField x + have hcoord : ∀ i : Fin d, Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => V n x i) p.exponent μ) + Filter.atTop (nhds 0) := by + intro i + simpa only [V, μ] using! + tendsto_eLpNorm_component_convexApproxSmoothField_sub_zero + Q s p F x0 r hball hr i + have hsum : Filter.Tendsto + (fun n : ℕ => ∑ i : Fin d, eLpNorm (fun x => V n x i) p.exponent μ) + Filter.atTop (nhds 0) := by + simpa using tendsto_finsetSum Finset.univ (fun i _ => hcoord i) + have hdimtop : ‖(d : ℝ)‖ₑ ≠ ⊤ := enorm_ne_top + have hbound : Filter.Tendsto (fun n : ℕ => ‖(d : ℝ)‖ₑ * + ∑ i : Fin d, eLpNorm (fun x => V n x i) p.exponent μ) + Filter.atTop (nhds 0) := by + simpa using ENNReal.Tendsto.const_mul hsum (Or.inr hdimtop) + have hmeas : ∀ n : ℕ, ∀ i : Fin d, + AEStronglyMeasurable (fun x => V n x i) μ := by + intro n i + dsimp only [V] + have hpos : 0 < unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + exact ((continuous_apply i).comp + (contDiff_cubeEuclideanWspConvexApproxSmoothField F x0 hr hpos).continuous).aestronglyMeasurable.sub + (F.euclideanMemLp.eval_piLp i).aestronglyMeasurable + have hvec : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => HilbertVec.ofVec (V n x)) p.exponent μ) + Filter.atTop (nhds 0) := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hbound + (fun _ => bot_le) ?_ + intro n + exact euclidean_eLpNorm_le_dimension_mul_sum_coordinates μ p (V n) (hmeas n) + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm] using hvec + +private theorem tendsto_cubeEuclideanWspFullENorm_convexApproxSmoothField_sub_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanWspField Q s p) (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => cubeEuclideanWspFullENorm Q s p + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x)) + Filter.atTop (nhds 0) := by + let L : ℕ → ℝ≥0∞ := fun n => + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x) + let S : ℕ → ℝ≥0∞ := fun n => cubeEuclideanWspESeminorm Q s p + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x) + let W := cubeEuclideanWspScalePowerWeight Q s p + let q := p.exponent.toReal + have hqpos : 0 < q := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hL : Filter.Tendsto L Filter.atTop (nhds 0) := by + simpa only [L] using tendsto_normalizedEuclideanLpENorm_convexApproxSmoothField_sub_zero + Q s p F x0 r hball hr + have hS : Filter.Tendsto S Filter.atTop (nhds 0) := by + simpa only [S] using tendsto_cubeEuclideanWspESeminorm_convexApproxSmoothField_sub_zero + Q s p F x0 r hball hr + have hLpow : Filter.Tendsto (fun n : ℕ => L n ^ q) Filter.atTop (nhds 0) := by + have h := ((ENNReal.continuous_rpow_const (y := q)).tendsto (0 : ℝ≥0∞)).comp hL + simpa only [ENNReal.zero_rpow_of_pos hqpos] using! h + have hSpow : Filter.Tendsto (fun n : ℕ => S n ^ q) Filter.atTop (nhds 0) := by + have h := ((ENNReal.continuous_rpow_const (y := q)).tendsto (0 : ℝ≥0∞)).comp hS + simpa only [ENNReal.zero_rpow_of_pos hqpos] using! h + have hWtop : W ≠ ⊤ := (cubeEuclideanWspScalePowerWeight_lt_top Q s p).ne + have hWpow : Filter.Tendsto (fun n : ℕ => W * L n ^ q) + Filter.atTop (nhds 0) := by + simpa using ENNReal.Tendsto.const_mul hLpow (Or.inr hWtop) + have hsum : Filter.Tendsto (fun n : ℕ => W * L n ^ q + S n ^ q) + Filter.atTop (nhds 0) := by + simpa using hWpow.add hSpow + have hinvpos : 0 < q⁻¹ := inv_pos.mpr hqpos + have hfinal := ((ENNReal.continuous_rpow_const (y := q⁻¹)).tendsto + (0 : ℝ≥0∞)).comp hsum + simpa only [cubeEuclideanWspFullENorm, L, S, W, q, + ENNReal.zero_rpow_of_pos hinvpos] using! hfinal + +/-- Componentwise `L^p` convergence of the explicit convex smoothing sequence, +from a supplied normalized `L^p` bound. This is kept separate from the +fractional carrier so that the same smooth approximants work simultaneously in +the full fractional topology and in `L²`. -/ +private theorem tendsto_eLpNorm_component_convexApproxSmoothField_sub_zero_of_memLp + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + {q p : FiniteLpExponent} (F : CubeEuclideanWspField Q s q) + (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) (i : Fin d) + (hF : MemLp (fun x => F.toField x i) p.exponent (normalizedCubeMeasure Q)) : + Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r (unitConvexApproxScale n) x i - + F.toField x i) p.exponent (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + let U := openCubeSet Q + let ρ := unitConvexApproxKernel (d := d) + let f : Vec d → ℝ := fun x => F.toField x i + let μ := volume.restrict U + let c := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have hU : IsOpenBoundedConvexDomain U := isOpenBoundedConvexDomain_openCubeSet Q + have hρ : IsConvexApproxKernel ρ := by + simpa only [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hf : MemLpOn U p.exponent f := by + rw [MemLpOn] + rw [normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] at hF + let c : ℝ≥0∞ := ENNReal.ofReal ((cubeVolume Q)⁻¹) + have hc0 : c ≠ 0 := by + dsimp only [c] + exact ENNReal.ofReal_ne_zero_iff.mpr (inv_pos.mpr (cubeVolume_pos Q)) + have hctop : c ≠ ⊤ := by + dsimp only [c] + exact ENNReal.ofReal_ne_top + apply MemLp.of_measure_le_smul (μ := c • volume.restrict (openCubeSet Q)) + (c := c⁻¹) (ENNReal.inv_ne_top.2 hc0) + · simpa only [smul_smul, ENNReal.inv_mul_cancel hc0 hctop, one_smul] using + (le_refl (volume.restrict (openCubeSet Q))) + · simpa only [c] using hF + have hεpos : ∀ᶠ n : ℕ in Filter.atTop, 0 < unitConvexApproxScale n := + Filter.Eventually.of_forall fun n => by + dsimp [unitConvexApproxScale] + positivity + have hεlt : ∀ᶠ n : ℕ in Filter.atTop, unitConvexApproxScale n < 1 := + (tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one + have hsmoothing : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => convexApproxSmoothing ρ f x0 r + (unitConvexApproxScale n) x - f x) p.exponent μ) + Filter.atTop (nhds 0) := by + exact tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + hU hρ p.one_lt.le p.lt_top.ne hf hball hr tendsto_unitConvexApproxScale_zero + hεpos hεlt + have hrep : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => + cubeEuclideanWspConvexApproxSmoothField F x0 r (unitConvexApproxScale n) x i - + F.toField x i) p.exponent μ) + Filter.atTop (nhds 0) := by + apply Filter.Tendsto.congr' ?_ hsmoothing + filter_upwards [hεpos, hεlt] with n hpos hlt + apply eLpNorm_congr_ae + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + simp only [cubeEuclideanWspConvexApproxSmoothField, f, ρ] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + hU hρ hx hball hr hpos hlt] + have hmeasure : normalizedCubeMeasure Q = c • μ := by + simp only [normalizedCubeMeasure, cubeMeasure, c, μ, U, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + have hctop : c ^ (1 / p.exponent).toReal ≠ ⊤ := by + dsimp only [c] + exact ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg ENNReal.ofReal_ne_top + apply Filter.Tendsto.congr' (Filter.Eventually.of_forall fun n => by + rw [hmeasure, eLpNorm_smul_measure_of_ne_top p.lt_top.ne]) + simpa using ENNReal.Tendsto.const_mul hrep (Or.inr hctop) + +private theorem tendsto_eLpNorm_two_convexApproxSmoothField_sub_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (q : FiniteLpExponent) + (F : CubeEuclideanWspL2Field Q s q) (x0 : Vec d) (r : ℝ) + (hball : Metric.closedBall x0 r ⊆ openCubeSet Q) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => HilbertVec.ofVec + (cubeEuclideanWspConvexApproxSmoothField F.toCubeEuclideanWspField x0 r + (unitConvexApproxScale n) x - F.toField x)) 2 + (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + let V : ℕ → Vec d → Vec d := fun n x => + cubeEuclideanWspConvexApproxSmoothField F.toCubeEuclideanWspField x0 r + (unitConvexApproxScale n) x - F.toField x + have hcoord : ∀ i : Fin d, Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => V n x i) 2 (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + intro i + simpa only [V] using! + (tendsto_eLpNorm_component_convexApproxSmoothField_sub_zero_of_memLp + (p := FiniteLpExponent.two) Q s F.toCubeEuclideanWspField x0 r hball hr i + (by + simpa only [FiniteLpExponent.two, HilbertVec.ofVec, PiLp.toLp_apply] using + F.euclideanMemL2.eval_piLp i)) + have hsum : Filter.Tendsto + (fun n : ℕ => ∑ i : Fin d, + eLpNorm (fun x => V n x i) 2 (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + simpa using tendsto_finsetSum Finset.univ (fun i _ => hcoord i) + have hdimtop : ‖(d : ℝ)‖ₑ ≠ ⊤ := enorm_ne_top + have hbound : Filter.Tendsto (fun n : ℕ => ‖(d : ℝ)‖ₑ * + ∑ i : Fin d, eLpNorm (fun x => V n x i) 2 (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + simpa using ENNReal.Tendsto.const_mul hsum (Or.inr hdimtop) + have hmeas : ∀ n : ℕ, ∀ i : Fin d, + AEStronglyMeasurable (fun x => V n x i) (normalizedCubeMeasure Q) := by + intro n i + dsimp only [V] + have hpos : 0 < unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + exact ((continuous_apply i).comp + (contDiff_cubeEuclideanWspConvexApproxSmoothField F.toCubeEuclideanWspField + x0 hr hpos).continuous).aestronglyMeasurable.sub + (F.euclideanMemL2.eval_piLp i).aestronglyMeasurable + have hvec : Filter.Tendsto + (fun n : ℕ => eLpNorm (fun x => HilbertVec.ofVec (V n x)) 2 + (normalizedCubeMeasure Q)) + Filter.atTop (nhds 0) := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hbound + (fun _ => bot_le) ?_ + intro n + exact euclidean_eLpNorm_le_dimension_mul_sum_coordinates + (normalizedCubeMeasure Q) FiniteLpExponent.two (V n) (hmeas n) + simpa only [V] using hvec + +private theorem eventually_lt_of_tendsto_ennreal_zero {f : ℕ → ℝ≥0∞} + (hf : Filter.Tendsto f Filter.atTop (nhds 0)) + {epsilon : ℝ≥0∞} (hepsilon : 0 < epsilon) : + ∀ᶠ n : ℕ in Filter.atTop, f n < epsilon := by + by_cases hepsilon_top : epsilon = ⊤ + · have hle := ENNReal.tendsto_nhds_zero.1 hf (1 : ℝ≥0∞) zero_lt_one + filter_upwards [hle] with n hn + simpa only [hepsilon_top] using hn.trans_lt ENNReal.one_lt_top + · have hhalf_pos : 0 < epsilon / 2 := + ENNReal.div_pos hepsilon.ne' (by norm_num) + have hhalf_lt : epsilon / 2 < epsilon := + ENNReal.half_lt_self hepsilon.ne' hepsilon_top + have hle := ENNReal.tendsto_nhds_zero.1 hf (epsilon / 2) hhalf_pos + filter_upwards [hle] with n hn + exact hn.trans_lt hhalf_lt + +/-- A single explicit convex smoothing approximant is simultaneously close in +the full fractional norm and in normalized `L²`. -/ +theorem exists_cubeEuclideanWspSmoothTest_fullENorm_and_l2_sub_lt {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {q : FiniteLpExponent} + (G : CubeEuclideanWspL2Field Q s q) {epsilon : ℝ≥0∞} + (hepsilon : 0 < epsilon) : + ∃ h : CubeEuclideanWspSmoothTest Q s q, + cubeEuclideanWspFullENorm Q s q + (fun x => h.toField x - G.toField x) < epsilon ∧ + eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q) < epsilon := by + let x0 := cubeCenter Q + let r := cubeRadius Q / 2 + have hr : 0 < r := by + dsimp only [r] + exact half_pos (cubeRadius_pos Q) + have hball : Metric.closedBall x0 r ⊆ openCubeSet Q := by + simpa only [x0, r] using closedBall_halfCubeRadius_subset_openCubeSet Q + have hfull := tendsto_cubeEuclideanWspFullENorm_convexApproxSmoothField_sub_zero + Q s q G.toCubeEuclideanWspField x0 r hball hr + have hl2 := tendsto_eLpNorm_two_convexApproxSmoothField_sub_zero + Q s q G x0 r hball hr + rcases (eventually_lt_of_tendsto_ennreal_zero hfull hepsilon).and + (eventually_lt_of_tendsto_ennreal_zero hl2 hepsilon) |>.exists with + ⟨n, hnfull, hnl2⟩ + refine ⟨cubeEuclideanWspConvexApproxSmoothTest G.toCubeEuclideanWspField x0 + (r := r) (ε := unitConvexApproxScale n) hr + (by + dsimp [unitConvexApproxScale] + positivity), ?_, ?_⟩ + · simpa only [cubeEuclideanWspConvexApproxSmoothTest, + cubeEuclideanWspConvexApproxSmoothField] using hnfull + · simpa only [cubeEuclideanWspConvexApproxSmoothTest, + cubeEuclideanWspConvexApproxSmoothField] using hnl2 + +theorem exists_cubeEuclideanWspSmoothTest_fullENorm_sub_lt {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) {epsilon : ℝ≥0∞} + (hepsilon : 0 < epsilon) : + ∃ h : CubeEuclideanWspSmoothTest Q s p, + cubeEuclideanWspFullENorm Q s p + (fun x => h.toField x - F.toField x) < epsilon := by + let x0 := cubeCenter Q + let r := cubeRadius Q / 2 + have hr : 0 < r := by + dsimp only [r] + exact half_pos (cubeRadius_pos Q) + have hball : Metric.closedBall x0 r ⊆ openCubeSet Q := by + simpa only [x0, r] using closedBall_halfCubeRadius_subset_openCubeSet Q + have hconv := tendsto_cubeEuclideanWspFullENorm_convexApproxSmoothField_sub_zero + Q s p F x0 r hball hr + have hsmall : ∀ᶠ n : ℕ in Filter.atTop, + cubeEuclideanWspFullENorm Q s p + (fun x => cubeEuclideanWspConvexApproxSmoothField F x0 r + (unitConvexApproxScale n) x - F.toField x) < epsilon := by + by_cases hepsilon_top : epsilon = ⊤ + · have hle := ENNReal.tendsto_nhds_zero.1 hconv (1 : ℝ≥0∞) zero_lt_one + filter_upwards [hle] with n hn + simpa only [hepsilon_top] using hn.trans_lt ENNReal.one_lt_top + · have hhalf_pos : 0 < epsilon / 2 := + ENNReal.div_pos hepsilon.ne' (by norm_num) + have hhalf_lt : epsilon / 2 < epsilon := + ENNReal.half_lt_self hepsilon.ne' hepsilon_top + have hle := ENNReal.tendsto_nhds_zero.1 hconv (epsilon / 2) hhalf_pos + filter_upwards [hle] with n hn + exact hn.trans_lt hhalf_lt + rcases hsmall.exists with ⟨n, hn⟩ + refine ⟨cubeEuclideanWspConvexApproxSmoothTest F x0 (r := r) + (ε := unitConvexApproxScale n) hr + (by + dsimp [unitConvexApproxScale] + positivity), ?_⟩ + simpa only [cubeEuclideanWspConvexApproxSmoothTest, + cubeEuclideanWspConvexApproxSmoothField] using hn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDual.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDual.lean new file mode 100644 index 0000000000..6853507f54 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDual.lean @@ -0,0 +1,352 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import Mathlib.Analysis.Calculus.ContDiff.Defs +public import Mathlib.Analysis.Calculus.ContDiff.Operations + +/-! +# Smooth full-dual surface for Euclidean fractional Sobolev fields + +The smooth-test supremum is retained as a `SmoothDualENorm`; no completion or +density assertion is made in this module. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- A globally smooth vector field used to test the full normalized fractional +Sobolev norm on a cube. -/ +structure CubeEuclideanWspSmoothTest {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) where + /-- The underlying globally defined vector field. -/ + toField : Vec d → Vec d + /-- Global `C∞` regularity of the test field. -/ + contDiff : ContDiff ℝ (⊤ : ℕ∞) toField + +namespace CubeEuclideanWspSmoothTest + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : + CoeFun (CubeEuclideanWspSmoothTest Q s p) (fun _ => Vec d → Vec d) where + coe h := h.toField + +/-- A globally continuous vector field has finite Euclidean `L^q` norm on a +normalized cube for every exponent. -/ +theorem euclideanMemLp_of_continuous {d : ℕ} (Q : TriadicCube d) + (q : ℝ≥0∞) {f : Vec d → Vec d} (hf : Continuous f) : + MemLp (fun x => HilbertVec.ofVec (f x)) q + (normalizedCubeMeasure Q) := by + have hfield : Continuous (fun x => HilbertVec.ofVec (f x)) := + (HilbertVec.ofVecL d).continuous.comp hf + have hcompact : IsCompact (closure (cubeSet Q)) := + (isBounded_cubeSet Q).isCompact_closure + rcases hcompact.bddAbove_image hfield.norm.continuousOn with ⟨C, hC⟩ + have hcube : ∀ᵐ x ∂normalizedCubeMeasure Q, x ∈ cubeSet Q := by + have hrestrict : + ∀ᵐ x ∂volume.restrict (cubeSet Q), x ∈ cubeSet Q := + ae_restrict_mem (measurableSet_cubeSet Q) + simpa [normalizedCubeMeasure, cubeMeasure] using + Measure.ae_smul_measure hrestrict + (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + exact MemLp.of_bound hfield.aestronglyMeasurable C <| + hcube.mono fun x hx => hC ⟨x, subset_closure hx, rfl⟩ + +/-- A globally smooth test automatically supplies the Euclidean `L²` +certificate needed for pairing with the represented `L²` field. -/ +theorem euclideanMemLp_two {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + MemLp (fun x => HilbertVec.ofVec (h.toField x)) 2 + (normalizedCubeMeasure Q) := + euclideanMemLp_of_continuous Q 2 h.contDiff.continuous + +end CubeEuclideanWspSmoothTest + +private theorem cubeEuclideanWspKernel_smul {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) (c : ℝ) + (f : Vec d → Vec d) : + cubeEuclideanWspKernel s p (fun x => c • f x) = + c • cubeEuclideanWspKernel s p f := by + funext z + simp only [cubeEuclideanWspKernel_apply, Pi.smul_apply] + rw [← smul_sub] + change _ • (c • HilbertVec.ofVec (f z.1 - f z.2)) = + c • (_ • HilbertVec.ofVec (f z.1 - f z.2)) + rw [smul_smul, smul_smul, mul_comm] + +private theorem normalizedEuclideanLpENorm_smul {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (c : ℝ) + (f : Vec d → Vec d) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + (fun x => c • f x) = + ‖c‖ₑ * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent f := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + unfold BoundedMeasurableDomain.normalizedLpENorm + simp only [ite_eq_right (ne_of_gt (lt_trans zero_lt_one p.one_lt)), + ite_eq_right p.lt_top.ne] + change eLpNorm' (fun x => euclideanNorm (c • f x)) p.exponent.toReal + (cubeBoundedMeasurableDomain Q).normalizedVolume = _ + simp_rw [euclideanNorm_smul] + change eLpNorm' ((|c| : ℝ) • fun x => euclideanNorm (f x)) p.exponent.toReal + (cubeBoundedMeasurableDomain Q).normalizedVolume = _ + rw [eLpNorm'_const_smul _ (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne)] + simp + +private theorem cubeEuclideanWspESeminorm_smul {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (c : ℝ) (f : Vec d → Vec d) : + cubeEuclideanWspESeminorm Q s p (fun x => c • f x) = + ‖c‖ₑ * cubeEuclideanWspESeminorm Q s p f := by + unfold cubeEuclideanWspESeminorm + rw [cubeEuclideanWspKernel_smul] + exact eLpNorm'_const_smul c (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne) + +private theorem cubeEuclideanWspFullENorm_smul {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (c : ℝ) (f : Vec d → Vec d) : + cubeEuclideanWspFullENorm Q s p (fun x => c • f x) = + ‖c‖ₑ * cubeEuclideanWspFullENorm Q s p f := by + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent f + let S := cubeEuclideanWspESeminorm Q s p f + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have htin : 0 ≤ t⁻¹ := inv_nonneg.mpr ht.le + rw [cubeEuclideanWspFullENorm, + normalizedEuclideanLpENorm_smul, + cubeEuclideanWspESeminorm_smul] + change (W * (‖c‖ₑ * L) ^ t + (‖c‖ₑ * S) ^ t) ^ t⁻¹ = + ‖c‖ₑ * (W * L ^ t + S ^ t) ^ t⁻¹ + rw [ENNReal.mul_rpow_of_nonneg _ _ ht.le, + ENNReal.mul_rpow_of_nonneg _ _ ht.le] + calc + (W * (‖c‖ₑ ^ t * L ^ t) + ‖c‖ₑ ^ t * S ^ t) ^ t⁻¹ = + (‖c‖ₑ ^ t * (W * L ^ t + S ^ t)) ^ t⁻¹ := by + congr 1 + rw [mul_add] + ac_rfl + _ = (‖c‖ₑ ^ t) ^ t⁻¹ * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [ENNReal.mul_rpow_of_nonneg _ _ htin] + _ = ‖c‖ₑ * (W * L ^ t + S ^ t) ^ t⁻¹ := by + rw [← ENNReal.rpow_mul, mul_inv_cancel₀ ht.ne', ENNReal.rpow_one] + +private theorem normalizedEuclideanLpENorm_eq_zero_of_fullENorm_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (f : Vec d → Vec d) (hf : cubeEuclideanWspFullENorm Q s p f = 0) : + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent f = 0 := by + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent f + let S := cubeEuclideanWspESeminorm Q s p f + let W := cubeEuclideanWspScalePowerWeight Q s p + let t := p.exponent.toReal + have ht : 0 < t := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hW : W ≠ 0 := by + apply ne_of_gt + unfold W cubeEuclideanWspScalePowerWeight + exact ENNReal.rpow_pos (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top + have hbase : W * L ^ t + S ^ t = 0 := by + rw [← ENNReal.rpow_eq_zero_iff_of_pos (inv_pos.mpr ht)] + simpa only [cubeEuclideanWspFullENorm, L, S, W, t] using hf + have hterm : W * L ^ t = 0 := (add_eq_zero.mp hbase).1 + have hpow : L ^ t = 0 := (mul_eq_zero.mp hterm).resolve_left hW + exact (ENNReal.rpow_eq_zero_iff_of_pos ht).mp hpow + +/-- A smooth test field in the unit ball of the full normalized fractional +Sobolev power norm. -/ +abbrev CubeEuclideanWspSmoothUnitTest {d : ℕ} (Q : TriadicCube d) + (s : FractionalOrder) (p : FiniteLpExponent) := + {h : CubeEuclideanWspSmoothTest Q s p // + cubeEuclideanWspFullENorm Q s p h.toField ≤ 1} + +/-- The volume-normalized `L²` pairing of a represented field with a smooth +fractional Sobolev test field. -/ +noncomputable def cubeEuclideanNormalizedSmoothPairing {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p) : ℝ := + ∫ x, vecDot (F.toField x) (h.toField x) ∂normalizedCubeMeasure Q + +private def CubeEuclideanWspSmoothTest.smul {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (c : ℝ) (h : CubeEuclideanWspSmoothTest Q s p) : + CubeEuclideanWspSmoothTest Q s p where + toField x := c • h.toField x + contDiff := h.contDiff.const_smul c + +private theorem cubeEuclideanNormalizedSmoothPairing_smul_right {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p) (c : ℝ) : + cubeEuclideanNormalizedSmoothPairing F (h.smul c) = + c * cubeEuclideanNormalizedSmoothPairing F h := by + unfold cubeEuclideanNormalizedSmoothPairing CubeEuclideanWspSmoothTest.smul + simp_rw [vecDot_smul_right] + exact MeasureTheory.integral_const_mul c _ + +theorem cubeEuclideanNormalizedSmoothPairing_integrable {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p) : + Integrable (fun x => vecDot (F.toField x) (h.toField x)) + (normalizedCubeMeasure Q) := by + have hF : ∀ i : Fin d, + MemLp (fun x => F.toField x i) 2 (normalizedCubeMeasure Q) := by + intro i + simpa only [FiniteLpExponent.two_exponent, HilbertVec.ofVec, + PiLp.toLp_apply] using F.euclideanMemLp.eval_piLp i + have hh : ∀ i : Fin d, + MemLp (fun x => h.toField x i) 2 (normalizedCubeMeasure Q) := by + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + h.euclideanMemLp_two.eval_piLp i + simpa only [vecDot] using! + integrable_finsetSum Finset.univ fun i _ => (hF i).integrable_mul (hh i) + +private theorem cubeEuclideanNormalizedSmoothPairing_eq_zero_of_fullENorm_eq_zero + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) + (hh : cubeEuclideanWspFullENorm Q s p h.toField = 0) : + cubeEuclideanNormalizedSmoothPairing F h = 0 := by + have hLp : (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent h.toField = 0 := + normalizedEuclideanLpENorm_eq_zero_of_fullENorm_eq_zero + Q s p h.toField hh + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (h.toField x)) + (normalizedCubeMeasure Q) := by + simpa only [euclideanNorm_eq_norm_ofVec] using + (CubeEuclideanWspSmoothTest.euclideanMemLp_of_continuous Q + p.exponent h.contDiff.continuous).aestronglyMeasurable.norm + have hLp' : eLpNorm (fun x => euclideanNorm (h.toField x)) + p.exponent (normalizedCubeMeasure Q) = 0 := by + rw [← cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + rw [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ (by + rwa [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure])] at hLp + exact hLp + have hp_ne_zero : p.exponent ≠ 0 := + ne_of_gt (lt_trans zero_lt_one p.one_lt) + have hnorm_zero : (fun x => euclideanNorm (h.toField x)) =ᵐ[ + normalizedCubeMeasure Q] 0 := + (eLpNorm_eq_zero_iff hp_ne_zero).mp hLp' + have hfield_zero : h.toField =ᵐ[normalizedCubeMeasure Q] 0 := by + filter_upwards [hnorm_zero] with x hx + exact euclideanNorm_eq_zero_iff.mp hx + unfold cubeEuclideanNormalizedSmoothPairing + apply MeasureTheory.integral_eq_zero_of_ae + filter_upwards [hfield_zero] with x hx + simp [hx, vecDot] + +/-- The extended norm obtained by taking the supremum of normalized pairings +over the smooth unit ball in the conjugate full fractional Sobolev norm. -/ +noncomputable def cubeEuclideanNegativeWspSmoothDualENorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : ℝ≥0∞ := + ⨆ h : CubeEuclideanWspSmoothUnitTest Q s p.conjugate, + ENNReal.ofReal + |cubeEuclideanNormalizedSmoothPairing F h.1| + +/-- The normalized pairing is bounded by the conjugate full fractional +Sobolev power norm on every globally smooth test field. -/ +def CubeEuclideanSmoothPairingIsBounded {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : Prop := + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ h : CubeEuclideanWspSmoothTest Q s p.conjugate, + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + C * cubeEuclideanWspFullENorm Q s p.conjugate h.toField + +theorem cubeEuclideanNegativeWspSmoothDualENorm_lt_top_iff {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞ ↔ + CubeEuclideanSmoothPairingIsBounded Q s p F := by + set D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + constructor + · intro hD + refine ⟨D + 1, ENNReal.add_lt_top.2 ⟨hD, ENNReal.one_lt_top⟩, ?_⟩ + intro h + set N := cubeEuclideanWspFullENorm Q s p.conjugate h.toField + by_cases hNtop : N = ∞ + · simp [hNtop] + by_cases hNzero : N = 0 + · have hzero : cubeEuclideanNormalizedSmoothPairing F h = 0 := by + apply cubeEuclideanNormalizedSmoothPairing_eq_zero_of_fullENorm_eq_zero + simpa only [N] using hNzero + simp [hzero, hNzero] + · let r : ℝ := N.toReal⁻¹ + have hrpos : 0 < r := by + dsimp [r] + exact inv_pos.mpr (ENNReal.toReal_pos hNzero hNtop) + let hs := h.smul r + have hhsnorm : cubeEuclideanWspFullENorm Q s p.conjugate hs.toField = 1 := by + change cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => r • h.toField x) = 1 + rw [cubeEuclideanWspFullENorm_smul] + change ‖r‖ₑ * N = 1 + rw [Real.enorm_eq_ofReal hrpos.le, show ENNReal.ofReal r = N⁻¹ by + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop), + ENNReal.ofReal_toReal hNtop], ENNReal.inv_mul_cancel hNzero hNtop] + let u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate := + ⟨hs, hhsnorm.le⟩ + have hu : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| ≤ D := by + rw [show D = cubeEuclideanNegativeWspSmoothDualENorm Q s p F by rfl, + cubeEuclideanNegativeWspSmoothDualENorm] + exact le_iSup (fun u : CubeEuclideanWspSmoothUnitTest Q s p.conjugate => + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F u.1|) u + have hpair : cubeEuclideanNormalizedSmoothPairing F hs = + r * cubeEuclideanNormalizedSmoothPairing F h := by + exact cubeEuclideanNormalizedSmoothPairing_smul_right F h r + have hscaled : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| = + N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| := by + rw [hpair, abs_mul, abs_of_pos hrpos, ENNReal.ofReal_mul hrpos.le] + congr 1 + dsimp [r] + rw [ENNReal.ofReal_inv_of_pos (ENNReal.toReal_pos hNzero hNtop), + ENNReal.ofReal_toReal hNtop] + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| = + N * (N⁻¹ * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h|) := by + rw [← mul_assoc, ENNReal.mul_inv_cancel hNzero hNtop, one_mul] + _ = N * ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F hs| := by + rw [hscaled] + _ ≤ N * D := mul_le_mul_right hu N + _ ≤ (D + 1) * N := by + rw [mul_comm N D] + exact mul_le_mul_left (self_le_add_right D 1) N + · rintro ⟨C, hCtop, hC⟩ + change cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞ + rw [cubeEuclideanNegativeWspSmoothDualENorm] + apply lt_of_le_of_lt (iSup_le fun h => ?_) hCtop + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h.1| ≤ + C * cubeEuclideanWspFullENorm Q s p.conjugate h.1.toField := hC h.1 + _ ≤ C * 1 := mul_le_mul_right h.2 C + _ = C := mul_one C + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualBesovBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualBesovBound.lean new file mode 100644 index 0000000000..a9a82644f4 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualBesovBound.lean @@ -0,0 +1,484 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothGraph +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspExactOverlapFullControl +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspLegacyCircComparison +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactAggregationBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactFiniteBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Negative.ExactExponentBridge +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.ProjectedPairing.MainBounds +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.CaccioppoliVectorization +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge + +/-! +# Source negative-Besov control of the smooth fractional dual + +This module uses finite block projections. In particular, the represented +field is used only through its `L²` integrability, never through a spurious +`Lᵖ` upgrade. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open Book.Ch03.ABK26 +open scoped BigOperators ENNReal Topology + +noncomputable section + +/-- A finite dimension-only coefficient for the finite-projection smooth-dual +estimate. -/ +noncomputable def cubeEuclideanNegativeWspSmoothDualBesovConstant (d : ℕ) : ℝ≥0∞ := + d * (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) * + cubeEuclideanWspExactOverlapFullControlConstant d + +private noncomputable def cubeEuclideanNegativeWspSmoothDualBesovScalarConstant + (d : ℕ) : ℝ≥0∞ := + (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) * + cubeEuclideanWspExactOverlapFullControlConstant d + +theorem cubeEuclideanNegativeWspSmoothDualBesovConstant_lt_top (d : ℕ) : + cubeEuclideanNegativeWspSmoothDualBesovConstant d < ∞ := by + unfold cubeEuclideanNegativeWspSmoothDualBesovConstant + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top (ENNReal.natCast_lt_top d) + (ENNReal.rpow_lt_top_of_nonneg (by positivity) (by norm_num))) + (cubeEuclideanWspExactOverlapFullControlConstant_lt_top d) + +private theorem smooth_coordinate_bounded_on_cube {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) (i : Fin d) : + ∃ C : ℝ, 0 ≤ C ∧ ∀ x ∈ cubeSet Q, |h.toField x i| ≤ C := by + have hcont : Continuous (fun x : Vec d => h.toField x i) := + continuous_apply i |>.comp h.contDiff.continuous + have hcompact : IsCompact (closure (cubeSet Q)) := + (isBounded_cubeSet Q).isCompact_closure + obtain ⟨C, hC⟩ := hcompact.bddAbove_image hcont.abs.continuousOn + refine ⟨max C 0, le_max_right _ _, ?_⟩ + intro x hx + exact (hC ⟨x, subset_closure hx, rfl⟩).trans (le_max_left _ _) + +/-- A scalar-coordinate source-negative Besov bound for the smooth fractional-Sobolev dual pairing. -/ +theorem ennreal_abs_cubeBesovPairing_coordinate_le_cubeEuclideanNegativeBesovESeminorm_mul_cubeEuclideanWspFull + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) (i : Fin d) : + ENNReal.ofReal |cubeBesovPairing Q (fun x => F.toField x i) + (fun x => h.toField x i)| ≤ + cubeEuclideanNegativeWspSmoothDualBesovScalarConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + classical + by_cases hd : d = 0 + · exact Fin.elim0 (by simpa [hd] using i) + have : NeZero d := ⟨hd⟩ + let hWsp := h.toCubeEuclideanWspField + have hFmem : MeasureTheory.MemLp (fun x => F.toField x i) + FiniteLpExponent.two.exponent (normalizedCubeMeasure Q) := + cubeEuclideanLp_coordinate_memLp F i + have hFint : MeasureTheory.IntegrableOn (fun x => F.toField x i) + (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure Q + (hFmem.integrable (by norm_num)) + have hhmem : MeasureTheory.MemLp (fun x => h.toField x i) + p.conjugate.exponent (normalizedCubeMeasure Q) := by + simpa [hWsp] using cubeEuclideanLp_coordinate_memLp hWsp.toCubeEuclideanLpField i + have hhint : MeasureTheory.IntegrableOn (fun x => h.toField x i) + (cubeSet Q) MeasureTheory.volume := + integrableOn_of_integrable_normalizedCubeMeasure Q + (hhmem.integrable p.conjugate.one_lt.le) + obtain ⟨Cbound, hCbound, hhbound⟩ := smooth_coordinate_bounded_on_cube h i + let : ENNReal.HolderConjugate p.conjugate.exponent p.exponent := + p.holderConjugate.symm + have hconj : cubeBesovConjExponent p.conjugate.exponent = p.exponent := by + simpa only [cubeBesovConjExponent] using + (ENNReal.HolderConjugate.conjExponent_eq + (p := p.conjugate.exponent) (q := p.exponent)) + have hpconj_ofReal : ENNReal.ofReal p.conjugate.exponent.toReal = + p.conjugate.exponent := ENNReal.ofReal_toReal p.conjugate.lt_top.ne + have hp_ofReal : ENNReal.ofReal p.exponent.toReal = p.exponent := + ENNReal.ofReal_toReal p.lt_top.ne + have hhmemReal : MeasureTheory.MemLp (fun x => h.toField x i) + (ENNReal.ofReal p.conjugate.exponent.toReal) (normalizedCubeMeasure Q) := by + rw [hpconj_ofReal] + exact hhmem + have hpconj_toReal_one_le : 1 ≤ p.conjugate.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.conjugate.lt_top.ne p.conjugate.one_lt.le + have hfinite : ∀ n : ℕ, + ENNReal.ofReal |cubeBesovPairing Q (cubeProjection Q (n + 1) + (fun x => F.toField x i)) (fun x => h.toField x i)| ≤ + cubeEuclideanNegativeWspSmoothDualBesovScalarConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + intro n + have hFluct : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeFluctuation R (fun x => h.toField x i)) + p.conjugate.exponent (normalizedCubeMeasure R) := by + intro j _ R hR + simpa only [hpconj_ofReal] using cubeFluctuation_memLp_of_parent_memLp + Q p.conjugate.exponent.toReal hhmemReal j R hR + have hProj : ∀ j < n + 1, ∀ R ∈ descendantsAtDepth Q j, + MeasureTheory.MemLp (cubeProjection Q (j + 1) (fun x => F.toField x i)) + (cubeBesovConjExponent p.conjugate.exponent) (normalizedCubeMeasure R) := by + intro j _ R hR + rw [hconj] + simpa only [hp_ofReal] using cubeProjection_memLp_of_parent_descendant + Q p.exponent.toReal (fun x => F.toField x i) (j + 1) j R hR + have hpair := + abs_cubeBesovPairing_projection_le_max_mul_cubeBesovPartialNorm_cubeBesovCircPartialNorm + Q s.1 p.conjugate.exponent p.conjugate.exponent + (fun x => h.toField x i) (fun x => F.toField x i) n hFint + p.conjugate.one_lt.le p.conjugate.lt_top.ne + (by rw [hconj]; exact p.lt_top.ne) + p.conjugate.one_lt.le p.conjugate.lt_top.ne + (by rw [hconj]; exact p.lt_top.ne) hFluct hProj + have hover : ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q s.1 p.conjugate.exponent p.conjugate.exponent + n (fun x => h.toField x i)) ≤ + exactOverlapFiniteNorm (exactOverlapScalarPParameters s p.conjugate) Q + (fun x => h.toField x i) + (exactDualOverlapIntegrable Q p.conjugate.exponent.toReal + hpconj_toReal_one_le hhmemReal) := by + simpa [exactOverlapScalarPParameters, hpconj_ofReal] using + exactAggregation_overlapPartialNorm_le_exactOverlapFiniteNorm + (exactOverlapScalarPParameters s p.conjugate) Q + (fun x => h.toField x i) hhmemReal n + have hfull := + exactOverlapScalarPFullNorm_le_dimensionConstant_mul_cubeEuclideanWspFull + Q s p.conjugate hWsp i + have hfull' : + exactOverlapFiniteNorm (exactOverlapScalarPParameters s p.conjugate) Q + (fun x => h.toField x i) + (exactDualOverlapIntegrable Q p.conjugate.exponent.toReal + hpconj_toReal_one_le hhmemReal) ≤ + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + simpa [hWsp] using hfull + have hpartial : + cubeBesovPartialNorm Q s.1 p.conjugate.exponent p.conjugate.exponent + n (fun x => h.toField x i) ≤ + (3 : ℝ) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeBesovOverlapPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i) := + cubeBesovPartialNorm_le_three_rpow_mul_overlapPartialNorm Q s.1 + (ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.conjugate.one_lt)) + p.conjugate.lt_top.ne) + hpconj_toReal_one_le n _ + have hpartialENN : ENNReal.ofReal + (cubeBesovPartialNorm Q s.1 p.conjugate.exponent p.conjugate.exponent + n (fun x => h.toField x i)) ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + calc + ENNReal.ofReal + (cubeBesovPartialNorm Q s.1 p.conjugate.exponent p.conjugate.exponent + n (fun x => h.toField x i)) ≤ + ENNReal.ofReal ((3 : ℝ) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeBesovOverlapPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i)) := + ENNReal.ofReal_le_ofReal hpartial + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + ENNReal.ofReal + (cubeBesovOverlapPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i)) := by + rw [ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _), + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) + (div_nonneg (by positivity) + (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.conjugate.one_lt)) + p.conjugate.lt_top.ne).le)] + norm_num + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + exactOverlapFiniteNorm (exactOverlapScalarPParameters s p.conjugate) Q + (fun x => h.toField x i) + (exactDualOverlapIntegrable Q p.conjugate.exponent.toReal + hpconj_toReal_one_le hhmemReal) := by + gcongr + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + (cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) := by + gcongr + _ = (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by ring + have hcirc : ENNReal.ofReal + (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) ≤ + cubeEuclideanNegativeBesovESeminorm Q s p F := by + simpa only [hconj] using + ennreal_ofReal_cubeBesovCircPartialNorm_le_cubeEuclideanNegativeBesovESeminorm + Q s p F i (n + 1) + have hKnonneg : 0 ≤ max 1 ((3 : ℝ) ^ s.1) := + zero_le_one.trans (le_max_left _ _) + have hpartial_nonneg : 0 ≤ cubeBesovPartialNorm Q s.1 + p.conjugate.exponent p.conjugate.exponent n (fun x => h.toField x i) := + cubeBesovPartialNorm_nonneg Q s.1 p.conjugate.exponent p.conjugate.exponent n _ + have hpairENN : ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) (fun x => F.toField x i)) + (fun x => h.toField x i)| ≤ + max 1 ((3 : ℝ≥0∞) ^ s.1) * + ENNReal.ofReal (cubeBesovPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i)) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) := by + calc + ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) (fun x => F.toField x i)) + (fun x => h.toField x i)| = + ENNReal.ofReal + |cubeBesovPairing Q (fun x => h.toField x i) + (cubeProjection Q (n + 1) (fun x => F.toField x i))| := by + congr 2 + simp only [cubeBesovPairing, mul_comm] + _ ≤ ENNReal.ofReal (max 1 ((3 : ℝ) ^ s.1) * + cubeBesovPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i) * + cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) := ENNReal.ofReal_le_ofReal hpair + _ = max 1 ((3 : ℝ≥0∞) ^ s.1) * + ENNReal.ofReal (cubeBesovPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i)) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) := by + rw [ENNReal.ofReal_mul (mul_nonneg hKnonneg hpartial_nonneg), + ENNReal.ofReal_mul hKnonneg, ENNReal.ofReal_max, + ← ENNReal.ofReal_rpow_of_nonneg (by norm_num : 0 ≤ (3 : ℝ)) + s.2.1.le] + norm_num + have hloss := exactCircLossCoefficientENNReal_rpow_le_source d s.1 + p.conjugate.exponent.toReal s.2.1.le hpconj_toReal_one_le + have hpower : (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) ≤ + (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) := + ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) (by linarith [s.2.2]) + calc + ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) (fun x => F.toField x i)) + (fun x => h.toField x i)| ≤ + max 1 ((3 : ℝ≥0∞) ^ s.1) * + ((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + cubeEuclideanNegativeBesovESeminorm Q s p F := by + calc + ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) (fun x => F.toField x i)) + (fun x => h.toField x i)| ≤ + max 1 ((3 : ℝ≥0∞) ^ s.1) * + ENNReal.ofReal (cubeBesovPartialNorm Q s.1 p.conjugate.exponent + p.conjugate.exponent n (fun x => h.toField x i)) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) := hpairENN + _ ≤ max 1 ((3 : ℝ≥0∞) ^ s.1) * + ((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) := by + rw [show max 1 ((3 : ℝ≥0∞) ^ s.1) * + ENNReal.ofReal (cubeBesovPartialNorm Q s.1 + p.conjugate.exponent p.conjugate.exponent n + (fun x => h.toField x i)) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) = + max 1 ((3 : ℝ≥0∞) ^ s.1) * + (ENNReal.ofReal (cubeBesovPartialNorm Q s.1 + p.conjugate.exponent p.conjugate.exponent n + (fun x => h.toField x i)) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i))) by ac_rfl] + rw [show max 1 ((3 : ℝ≥0∞) ^ s.1) * + ((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i)) = + max 1 ((3 : ℝ≥0∞) ^ s.1) * + (((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + ENNReal.ofReal (cubeBesovCircPartialNorm Q s.1 + (cubeBesovConjExponent p.conjugate.exponent) + (cubeBesovConjExponent p.conjugate.exponent) (n + 1) + (fun x => F.toField x i))) by ac_rfl] + apply mul_le_mul_right + exact mul_le_mul_left hpartialENN _ + _ ≤ max 1 ((3 : ℝ≥0∞) ^ s.1) * + ((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + cubeEuclideanNegativeBesovESeminorm Q s p F := by + gcongr + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F := by + rw [show max 1 ((3 : ℝ≥0∞) ^ s.1) * + ((3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField) * + cubeEuclideanNegativeBesovESeminorm Q s p F = + (max 1 ((3 : ℝ≥0∞) ^ s.1) * + (3 : ℝ≥0∞) ^ ((d : ℝ) / p.conjugate.exponent.toReal)) * + (cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F) by ac_rfl] + rw [show (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F = + (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) * + (cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F) by ac_rfl] + exact mul_le_mul_left hloss _ + _ ≤ (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F := by + rw [show (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F = + (3 : ℝ≥0∞) ^ ((d : ℝ) + s.1) * + (cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F) by ac_rfl] + rw [show (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) * + cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F = + (3 : ℝ≥0∞) ^ ((d : ℝ) + 1) * + (cubeEuclideanWspExactOverlapFullControlConstant d * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField * + cubeEuclideanNegativeBesovESeminorm Q s p F) by ac_rfl] + exact mul_le_mul_left hpower _ + _ = cubeEuclideanNegativeWspSmoothDualBesovScalarConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + unfold cubeEuclideanNegativeWspSmoothDualBesovScalarConstant + ac_rfl + have hconv := tendsto_cubeBesovPairing_projection_left_of_integrableOn_of_bounded + Q (fun x => F.toField x i) (fun x => h.toField x i) Cbound hFint hhint hCbound hhbound + have hconvAbs : Filter.Tendsto (fun n => ENNReal.ofReal + |cubeBesovPairing Q (cubeProjection Q (n + 1) (fun x => F.toField x i)) + (fun x => h.toField x i)|) Filter.atTop + (𝓝 (ENNReal.ofReal |cubeBesovPairing Q (fun x => F.toField x i) + (fun x => h.toField x i)|)) := + ENNReal.tendsto_ofReal (by simpa [Real.norm_eq_abs] using hconv.norm) + exact le_of_tendsto hconvAbs (Filter.Eventually.of_forall hfinite) + + +theorem ennreal_abs_cubeEuclideanNormalizedSmoothPairing_le_cubeEuclideanNegativeBesovESeminorm_mul_cubeEuclideanWspFull + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) : + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + have hInt : ∀ i : Fin d, + MeasureTheory.Integrable (fun x => F.toField x i * h.toField x i) + (normalizedCubeMeasure Q) := by + intro i + have hF : MeasureTheory.MemLp (fun x => F.toField x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa only [FiniteLpExponent.two_exponent] using + cubeEuclideanLp_coordinate_memLp F i + have hh : MeasureTheory.MemLp (fun x => h.toField x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using h.euclideanMemLp_two.eval_piLp i + exact hF.integrable_mul hh + have hpairEq : cubeEuclideanNormalizedSmoothPairing F h = + cubeAverage Q (fun x => vecDot (F.toField x) (h.toField x)) := by + unfold cubeEuclideanNormalizedSmoothPairing + rw [cubeAverage_eq_integral_normalizedCubeMeasure] + have hsumReal : |cubeEuclideanNormalizedSmoothPairing F h| ≤ + ∑ i, |cubeBesovPairing Q (fun x => F.toField x i) (fun x => h.toField x i)| := by + rw [hpairEq] + exact abs_cubeAverage_vecDot_le_sum_abs_cubeBesovPairing Q F.toField h.toField hInt + have hsumENN : ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + ∑ i, ENNReal.ofReal + |cubeBesovPairing Q (fun x => F.toField x i) (fun x => h.toField x i)| := by + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + ENNReal.ofReal (∑ i, + |cubeBesovPairing Q (fun x => F.toField x i) (fun x => h.toField x i)|) := + ENNReal.ofReal_le_ofReal hsumReal + _ = ∑ i, ENNReal.ofReal + |cubeBesovPairing Q (fun x => F.toField x i) (fun x => h.toField x i)| := by + rw [ENNReal.ofReal_sum_of_nonneg] + intro i _ + exact abs_nonneg _ + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + ∑ i, ENNReal.ofReal + |cubeBesovPairing Q (fun x => F.toField x i) (fun x => h.toField x i)| := hsumENN + _ ≤ ∑ _i : Fin d, cubeEuclideanNegativeWspSmoothDualBesovScalarConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + apply Finset.sum_le_sum + intro i _ + exact ennreal_abs_cubeBesovPairing_coordinate_le_cubeEuclideanNegativeBesovESeminorm_mul_cubeEuclideanWspFull + Q s p F h i + _ = cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + simp only [Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] + unfold cubeEuclideanNegativeWspSmoothDualBesovConstant + cubeEuclideanNegativeWspSmoothDualBesovScalarConstant + ac_rfl + +theorem cubeEuclideanNegativeWspSmoothDualENorm_le_cubeEuclideanNegativeBesovESeminorm + (d : ℕ) (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) : + cubeEuclideanNegativeWspSmoothDualENorm Q s p F ≤ + cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F := by + rw [cubeEuclideanNegativeWspSmoothDualENorm] + apply iSup_le + intro h + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h.1| ≤ + cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.1.toField := + ennreal_abs_cubeEuclideanNormalizedSmoothPairing_le_cubeEuclideanNegativeBesovESeminorm_mul_cubeEuclideanWspFull Q s p F h.1 + _ ≤ cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F * 1 := by + gcongr + exact h.2 + _ = cubeEuclideanNegativeWspSmoothDualBesovConstant d * + cubeEuclideanNegativeBesovESeminorm Q s p F := by rw [mul_one] + + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualFieldPairing.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualFieldPairing.lean new file mode 100644 index 0000000000..221e565c9b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualFieldPairing.lean @@ -0,0 +1,471 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDensity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCompletedDualExtension +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpBelowTwo + +/-! +# Smooth-dual pairing with actual fractional Sobolev fields + +This module closes the smooth-test dual pairing against an actual fractional +Sobolev field which also has the required `L²` representative. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private instance instFieldPairingFactOneLe (p : FiniteLpExponent) : + Fact (1 ≤ p.exponent) := + ⟨p.one_lt.le⟩ + +/-- The ambient full-norm graph point of an actual fractional field. -/ +private noncomputable def cubeEuclideanWspGraphPointOfField {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) : CubeEuclideanWspGraphAmbient Q p := + WithLp.toLp p.exponent fun b => + match b with + | false => + cubeEuclideanWspGraphFieldScale Q s • + F.euclideanMemLp.toLp (fun x => HilbertVec.ofVec (F.toField x)) + | true => + F.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p F.toField) + +private theorem enorm_cubeEuclideanWspGraphPointOfField {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanWspField Q s p) : + ‖cubeEuclideanWspGraphPointOfField F‖ₑ = + cubeEuclideanWspFullENorm Q s p F.toField := by + change ‖WithLp.toLp p.exponent (fun b : Bool => + match b with + | false => show CubeEuclideanWspGraphComponent Q p false from + cubeEuclideanWspGraphFieldScale Q s • + F.euclideanMemLp.toLp (fun x => HilbertVec.ofVec (F.toField x)) + | true => show CubeEuclideanWspGraphComponent Q p true from + F.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p F.toField))‖ₑ = _ + rw [enorm_eq_nnnorm, PiLp.nnnorm_eq_sum p.lt_top.ne] + rw [one_div, ENNReal.coe_rpow_of_nonneg _ (inv_nonneg.mpr ENNReal.toReal_nonneg), + ENNReal.ofNNReal_finsetSum] + simp_rw [ENNReal.coe_rpow_of_nonneg _ ENNReal.toReal_nonneg] + rw [Fintype.sum_bool] + change (‖F.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p F.toField)‖ₑ ^ + p.exponent.toReal + + ‖cubeEuclideanWspGraphFieldScale Q s • + F.euclideanMemLp.toLp (fun x => HilbertVec.ofVec (F.toField x))‖ₑ ^ + p.exponent.toReal) ^ p.exponent.toReal⁻¹ = _ + rw [enorm_smul, Lp.enorm_toLp F.euclideanMemWsp, Lp.enorm_toLp F.euclideanMemLp] + have hlp : eLpNorm (fun x => HilbertVec.ofVec (F.toField x)) p.exponent + (normalizedCubeMeasure Q) = + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField := by + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + BoundedMeasurableDomain.normalizedLpENorm + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simp only [euclideanNorm_eq_norm_ofVec, eLpNorm_norm] + rw [hlp] + change (cubeEuclideanWspESeminorm Q s p F.toField ^ p.exponent.toReal + + (‖cubeEuclideanWspGraphFieldScale Q s‖ₑ * + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent F.toField) ^ p.exponent.toReal) ^ p.exponent.toReal⁻¹ = _ + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + have hweight : ‖cubeEuclideanWspGraphFieldScale Q s‖ₑ ^ p.exponent.toReal = + cubeEuclideanWspScalePowerWeight Q s p := by + unfold cubeEuclideanWspGraphFieldScale cubeEuclideanWspScalePowerWeight + rw [Real.enorm_eq_ofReal (Real.rpow_nonneg hscale.le _), + ← ENNReal.ofReal_rpow_of_pos hscale] + rw [← ENNReal.rpow_mul] + rw [ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg, hweight] + unfold cubeEuclideanWspFullENorm + rw [add_comm] + +private theorem cubeEuclideanWspKernel_sub {d : ℕ} (s : FractionalOrder) + (p : FiniteLpExponent) (F G : Vec d → Vec d) : + cubeEuclideanWspKernel s p (fun x => F x - G x) = + fun z => cubeEuclideanWspKernel s p F z - cubeEuclideanWspKernel s p G z := by + funext z + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply, + cubeEuclideanWspKernel_apply] + change _ • (HilbertVec.ofVecL d) + ((F z.1 - G z.1) - (F z.2 - G z.2)) = _ + rw [sub_sub_sub_comm, (HilbertVec.ofVecL d).map_sub, smul_sub] + simp only [HilbertVec.ofVecL_apply] + +private noncomputable def cubeEuclideanWspFieldSub {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F G : CubeEuclideanWspField Q s p) : CubeEuclideanWspField Q s p where + toField := fun x => F.toField x - G.toField x + euclideanMemLp := by + simpa only [HilbertVec.ofVecL_apply] using! F.euclideanMemLp.sub G.euclideanMemLp + euclideanMemWsp := by + change MemLp (cubeEuclideanWspKernel s p + (fun x => F.toField x - G.toField x)) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) + rw [cubeEuclideanWspKernel_sub] + simpa only [Pi.sub_apply] using! F.euclideanMemWsp.sub G.euclideanMemWsp + +private theorem cubeEuclideanWspGraphPointOfField_sub {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F G : CubeEuclideanWspField Q s p) : + cubeEuclideanWspGraphPointOfField (cubeEuclideanWspFieldSub F G) = + cubeEuclideanWspGraphPointOfField F - cubeEuclideanWspGraphPointOfField G := by + apply PiLp.ext + intro b + cases b + · unfold cubeEuclideanWspGraphPointOfField + rw [WithLp.ofLp_sub, Pi.sub_apply] + change cubeEuclideanWspGraphFieldScale Q s • + (cubeEuclideanWspFieldSub F G).euclideanMemLp.toLp + (fun x => HilbertVec.ofVec ((cubeEuclideanWspFieldSub F G).toField x)) = + cubeEuclideanWspGraphFieldScale Q s • F.euclideanMemLp.toLp + (fun x => HilbertVec.ofVec (F.toField x)) - + cubeEuclideanWspGraphFieldScale Q s • G.euclideanMemLp.toLp + (fun x => HilbertVec.ofVec (G.toField x)) + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (cubeEuclideanWspFieldSub F G).euclideanMemLp, + MemLp.coeFn_toLp F.euclideanMemLp, MemLp.coeFn_toLp G.euclideanMemLp, + Lp.coeFn_sub + (cubeEuclideanWspGraphFieldScale Q s • F.euclideanMemLp.toLp + (fun x => HilbertVec.ofVec (F.toField x))) + (cubeEuclideanWspGraphFieldScale Q s • G.euclideanMemLp.toLp + (fun x => HilbertVec.ofVec (G.toField x))), + Lp.coeFn_smul (cubeEuclideanWspGraphFieldScale Q s) + ((cubeEuclideanWspFieldSub F G).euclideanMemLp.toLp + (fun x => HilbertVec.ofVec ((cubeEuclideanWspFieldSub F G).toField x))), + Lp.coeFn_smul (cubeEuclideanWspGraphFieldScale Q s) + (F.euclideanMemLp.toLp (fun x => HilbertVec.ofVec (F.toField x))), + Lp.coeFn_smul (cubeEuclideanWspGraphFieldScale Q s) + (G.euclideanMemLp.toLp (fun x => HilbertVec.ofVec (G.toField x)))] with + x hFG hF hG hsub hscaleFG hscaleF hscaleG + rw [hsub] + rw [Pi.sub_apply, hscaleFG, hscaleF, hscaleG] + simp only [Pi.smul_apply] + rw [hFG, hF, hG] + change cubeEuclideanWspGraphFieldScale Q s • (HilbertVec.ofVecL d) + (F.toField x - G.toField x) = _ + rw [(HilbertVec.ofVecL d).map_sub, smul_sub] + rfl + · unfold cubeEuclideanWspGraphPointOfField + rw [WithLp.ofLp_sub, Pi.sub_apply] + change (cubeEuclideanWspFieldSub F G).euclideanMemWsp.toLp + (cubeEuclideanWspKernel s p (cubeEuclideanWspFieldSub F G).toField) = + F.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p F.toField) - + G.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p G.toField) + apply Lp.ext + filter_upwards [MemLp.coeFn_toLp (cubeEuclideanWspFieldSub F G).euclideanMemWsp, + MemLp.coeFn_toLp F.euclideanMemWsp, MemLp.coeFn_toLp G.euclideanMemWsp, + Lp.coeFn_sub + (F.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p F.toField)) + (G.euclideanMemWsp.toLp (cubeEuclideanWspKernel s p G.toField))] with z hFG hF hG hsub + rw [hsub] + simp only [Pi.sub_apply] + rw [hFG, hF, hG] + exact congrFun (cubeEuclideanWspKernel_sub s p F.toField G.toField) z + +/-- The literal normalized-cube pairing of an `L²` field with an actual +fractional Sobolev field. -/ +noncomputable def cubeEuclideanNormalizedFieldPairing {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p) : ℝ := + ∫ x, vecDot (F.toField x) (G.toField x) ∂normalizedCubeMeasure Q + +private theorem cubeEuclideanNormalizedFieldPairing_integrable {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p) : + Integrable (fun x => vecDot (F.toField x) (G.toField x)) + (normalizedCubeMeasure Q) := by + have hF : ∀ i : Fin d, MemLp (fun x => F.toField x i) 2 + (normalizedCubeMeasure Q) := by + intro i + simpa only [FiniteLpExponent.two_exponent, HilbertVec.ofVec, + PiLp.toLp_apply] using F.euclideanMemLp.eval_piLp i + have hG : ∀ i : Fin d, MemLp (fun x => G.toField x i) 2 + (normalizedCubeMeasure Q) := by + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using G.euclideanMemL2.eval_piLp i + simpa only [vecDot] using! + integrable_finsetSum Finset.univ fun i _ => (hF i).integrable_mul (hG i) + +private theorem fieldPairing_sub_smoothPairing {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p) + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanNormalizedFieldPairing F G - + cubeEuclideanNormalizedSmoothPairing F h = + ∫ x, vecDot (F.toField x) (G.toField x - h.toField x) + ∂normalizedCubeMeasure Q := by + unfold cubeEuclideanNormalizedFieldPairing cubeEuclideanNormalizedSmoothPairing + rw [← MeasureTheory.integral_sub + (cubeEuclideanNormalizedFieldPairing_integrable F G) + (cubeEuclideanNormalizedSmoothPairing_integrable F h)] + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp only [sub_eq_add_neg, vecDot_add_right, vecDot_neg_right] + +private theorem abs_fieldPairing_sub_smoothPairing_le_l2 {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p) + (h : CubeEuclideanWspSmoothTest Q s p) : + |cubeEuclideanNormalizedFieldPairing F G - + cubeEuclideanNormalizedSmoothPairing F h| ≤ + (eLpNorm (fun x => HilbertVec.ofVec (F.toField x)) 2 + (normalizedCubeMeasure Q)).toReal * + (eLpNorm (fun x => HilbertVec.ofVec (G.toField x - h.toField x)) 2 + (normalizedCubeMeasure Q)).toReal := by + rw [fieldPairing_sub_smoothPairing] + apply CubeCalderonZygmund.INTERNAL.abs_integral_vecDot_le_eLpNorm_toReal_mul + · simpa only [FiniteLpExponent.two_exponent] using F.euclideanMemLp + · simpa only [HilbertVec.ofVecL_apply, sub_eq_add_neg, add_comm] using! + G.euclideanMemL2.sub h.euclideanMemLp_two + +private theorem ennreal_abs_smoothPairing_le_negativeDual_mul_full {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (hD : cubeEuclideanNegativeWspSmoothDualENorm Q s p F < ∞) + (h : CubeEuclideanWspSmoothTest Q s p.conjugate) : + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| ≤ + cubeEuclideanNegativeWspSmoothDualENorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + let E := CubeEuclideanWspSmoothTest.completedPairingExtension F hD + calc + ENNReal.ofReal |cubeEuclideanNormalizedSmoothPairing F h| = + ‖E (CubeEuclideanWspSmoothTest.graphToCompleted h)‖ₑ := by + rw [show E = CubeEuclideanWspSmoothTest.completedPairingExtension F hD by rfl, + CubeEuclideanWspSmoothTest.completedPairingExtension_apply_graphToCompleted F hD h] + exact (Real.enorm_eq_ofReal_abs _).symm + _ ≤ ‖E‖ₑ * ‖CubeEuclideanWspSmoothTest.graphToCompleted h‖ₑ := + E.le_opENorm _ + _ = cubeEuclideanNegativeWspSmoothDualENorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate h.toField := by + rw [show E = CubeEuclideanWspSmoothTest.completedPairingExtension F hD by rfl, + CubeEuclideanWspSmoothTest.enorm_completedPairingExtension_eq_negativeWspSmoothDualENorm F hD] + exact congrArg (fun x : ℝ≥0∞ => + cubeEuclideanNegativeWspSmoothDualENorm Q s p F * x) + (CubeEuclideanWspSmoothTest.graph_enorm_eq_cubeEuclideanWspFullENorm h) + +/-- A zero full fractional-Sobolev norm forces the literal pairing with every +`L²` datum to vanish. -/ +private theorem cubeEuclideanNormalizedFieldPairing_eq_zero_of_fullENorm_eq_zero + {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p) + (hG : cubeEuclideanWspFullENorm Q s p G.toField = 0) : + cubeEuclideanNormalizedFieldPairing F G = 0 := by + have hLp : (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent G.toField = 0 := by + unfold cubeEuclideanWspFullENorm at hG + let W := cubeEuclideanWspScalePowerWeight Q s p + let L := (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm + p.exponent G.toField + let S := cubeEuclideanWspESeminorm Q s p G.toField + let t := p.exponent.toReal + have ht : 0 < t := ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hW : W ≠ 0 := by + dsimp only [W] + unfold cubeEuclideanWspScalePowerWeight + have hscale : 0 < cubeScaleFactor Q := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) Q.scale) + exact ne_of_gt (ENNReal.rpow_pos + (ENNReal.ofReal_pos.mpr hscale) ENNReal.ofReal_ne_top) + have hbase : W * L ^ t + S ^ t = 0 := by + rw [← ENNReal.rpow_eq_zero_iff_of_pos (inv_pos.mpr ht)] + simpa only [W, L, S, t] using hG + have hpow : L ^ t = 0 := + (mul_eq_zero.mp (add_eq_zero.mp hbase).1).resolve_left hW + exact (ENNReal.rpow_eq_zero_iff_of_pos ht).mp hpow + have hLp' : eLpNorm (fun x => HilbertVec.ofVec (G.toField x)) p.exponent + (normalizedCubeMeasure Q) = 0 := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, eLpNorm_norm] using hLp + have hzero : (fun x => HilbertVec.ofVec (G.toField x)) =ᵐ[ + normalizedCubeMeasure Q] 0 := + (eLpNorm_eq_zero_iff G.euclideanMemLp.aestronglyMeasurable + (ne_of_gt (lt_trans zero_lt_one p.one_lt))).mp hLp' + unfold cubeEuclideanNormalizedFieldPairing + apply MeasureTheory.integral_eq_zero_of_ae + filter_upwards [hzero] with x hx + have hx' : G.toField x = 0 := by + have h := congrArg (HilbertVec.continuousLinearEquivVec d) hx + simpa only [HilbertVec.continuousLinearEquivVec_apply] using! h + rw [hx'] + simpa only [Pi.zero_apply] using (vecDot_zero_right (F.toField x)) + +private theorem smooth_fullENorm_le_full_add_error {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (G : CubeEuclideanWspL2Field Q s p) + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspFullENorm Q s p h.toField ≤ + cubeEuclideanWspFullENorm Q s p G.toField + + cubeEuclideanWspFullENorm Q s p (fun x => h.toField x - G.toField x) := by + let H := h.toCubeEuclideanWspField + let K := cubeEuclideanWspFieldSub H G.toCubeEuclideanWspField + have hsplit : cubeEuclideanWspGraphPointOfField H = + cubeEuclideanWspGraphPointOfField K + + cubeEuclideanWspGraphPointOfField G.toCubeEuclideanWspField := by + rw [cubeEuclideanWspGraphPointOfField_sub] + abel + change cubeEuclideanWspFullENorm Q s p H.toField ≤ + cubeEuclideanWspFullENorm Q s p G.toField + + cubeEuclideanWspFullENorm Q s p K.toField + calc + cubeEuclideanWspFullENorm Q s p H.toField = + ‖cubeEuclideanWspGraphPointOfField H‖ₑ := + (enorm_cubeEuclideanWspGraphPointOfField H).symm + _ = ‖cubeEuclideanWspGraphPointOfField K + + cubeEuclideanWspGraphPointOfField G.toCubeEuclideanWspField‖ₑ := by + rw [← hsplit] + _ ≤ ‖cubeEuclideanWspGraphPointOfField K‖ₑ + + ‖cubeEuclideanWspGraphPointOfField G.toCubeEuclideanWspField‖ₑ := + enorm_add_le _ _ + _ = cubeEuclideanWspFullENorm Q s p K.toField + + cubeEuclideanWspFullENorm Q s p G.toField := by + rw [enorm_cubeEuclideanWspGraphPointOfField, + enorm_cubeEuclideanWspGraphPointOfField] + _ = cubeEuclideanWspFullENorm Q s p G.toField + + cubeEuclideanWspFullENorm Q s p K.toField := add_comm _ _ + +/-- The literal normalized-cube pairing is controlled by the smooth negative +fractional-Sobolev dual norm. -/ +theorem ennreal_ofReal_abs_cubeEuclideanNormalizedFieldPairing_le {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q FiniteLpExponent.two) + (G : CubeEuclideanWspL2Field Q s p.conjugate) : + ENNReal.ofReal |cubeEuclideanNormalizedFieldPairing F G| ≤ + cubeEuclideanNegativeWspSmoothDualENorm Q s p F * + cubeEuclideanWspFullENorm Q s p.conjugate G.toField := by + let D := cubeEuclideanNegativeWspSmoothDualENorm Q s p F + let N := cubeEuclideanWspFullENorm Q s p.conjugate G.toField + change ENNReal.ofReal |cubeEuclideanNormalizedFieldPairing F G| ≤ D * N + by_cases hD : D < ∞ + · have hN : N < ∞ := G.toCubeEuclideanWspField.fullENorm_lt_top + apply (ENNReal.toReal_le_toReal ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top hD.ne hN.ne)).mp + rw [ENNReal.toReal_ofReal (abs_nonneg _), ENNReal.toReal_mul] + let A := (eLpNorm (fun x => HilbertVec.ofVec (F.toField x)) 2 + (normalizedCubeMeasure Q)).toReal + apply le_of_forall_pos_le_add + intro epsilon hepsilon + let delta := epsilon / (A + D.toReal + 1) + have hdenom : 0 < A + D.toReal + 1 := by positivity + have hdelta : 0 < delta := div_pos hepsilon hdenom + obtain ⟨h, hfull, hl2⟩ := + exists_cubeEuclideanWspSmoothTest_fullENorm_and_l2_sub_lt G + (epsilon := ENNReal.ofReal delta) (ENNReal.ofReal_pos.mpr hdelta) + have hfull_top : cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => h.toField x - G.toField x) < ∞ := + hfull.trans (lt_top_iff_ne_top.mpr ENNReal.ofReal_ne_top) + have hfull_real : + (cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => h.toField x - G.toField x)).toReal < delta := by + have := (ENNReal.toReal_lt_toReal hfull_top.ne ENNReal.ofReal_ne_top).mpr hfull + simpa only [ENNReal.toReal_ofReal hdelta.le] using this + have hl2_real : + (eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q)).toReal < delta := by + have hl2_top : eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q) < ∞ := + hl2.trans (lt_top_iff_ne_top.mpr ENNReal.ofReal_ne_top) + have := (ENNReal.toReal_lt_toReal hl2_top.ne ENNReal.ofReal_ne_top).mpr hl2 + simpa only [ENNReal.toReal_ofReal hdelta.le] using this + have hnorm : cubeEuclideanWspFullENorm Q s p.conjugate h.toField ≤ + N + cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => h.toField x - G.toField x) := + smooth_fullENorm_le_full_add_error G h + have hhtop : cubeEuclideanWspFullENorm Q s p.conjugate h.toField < ∞ := + h.toCubeEuclideanWspField.fullENorm_lt_top + have hnorm_real : (cubeEuclideanWspFullENorm Q s p.conjugate h.toField).toReal ≤ + N.toReal + (cubeEuclideanWspFullENorm Q s p.conjugate + (fun x => h.toField x - G.toField x)).toReal := by + have := (ENNReal.toReal_le_toReal hhtop.ne + (ENNReal.add_ne_top.mpr ⟨hN.ne, hfull_top.ne⟩)).mpr hnorm + simpa only [ENNReal.toReal_add hN.ne hfull_top.ne] using this + have hsmooth : |cubeEuclideanNormalizedSmoothPairing F h| ≤ + D.toReal * (cubeEuclideanWspFullENorm Q s p.conjugate h.toField).toReal := by + have hbound := ennreal_abs_smoothPairing_le_negativeDual_mul_full F hD h + have := (ENNReal.toReal_le_toReal ENNReal.ofReal_ne_top + (ENNReal.mul_ne_top hD.ne hhtop.ne)).mpr hbound + simpa only [ENNReal.toReal_ofReal (abs_nonneg _), ENNReal.toReal_mul] using this + have hl2_eq : + eLpNorm (fun x => HilbertVec.ofVec (G.toField x - h.toField x)) 2 + (normalizedCubeMeasure Q) = + eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q) := by + have hfun : (fun x => HilbertVec.ofVec (G.toField x - h.toField x)) = + (fun x => -HilbertVec.ofVec (h.toField x - G.toField x)) := by + funext x + rw [show G.toField x - h.toField x = -(h.toField x - G.toField x) by abel, + ← HilbertVec.ofVecL_apply] + exact (HilbertVec.ofVecL d).map_neg _ + rw [hfun] + change eLpNorm (-(fun x => HilbertVec.ofVec (h.toField x - G.toField x))) 2 + (normalizedCubeMeasure Q) = _ + rw [eLpNorm_neg] + have hdifference : |cubeEuclideanNormalizedFieldPairing F G - + cubeEuclideanNormalizedSmoothPairing F h| ≤ + A * (eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q)).toReal := by + simpa only [A, hl2_eq] using abs_fieldPairing_sub_smoothPairing_le_l2 F G h + calc + |cubeEuclideanNormalizedFieldPairing F G| ≤ + |cubeEuclideanNormalizedSmoothPairing F h| + + |cubeEuclideanNormalizedFieldPairing F G - + cubeEuclideanNormalizedSmoothPairing F h| := by + calc + |cubeEuclideanNormalizedFieldPairing F G| = + |cubeEuclideanNormalizedSmoothPairing F h + + (cubeEuclideanNormalizedFieldPairing F G - + cubeEuclideanNormalizedSmoothPairing F h)| := by + congr 1 + ring + _ ≤ _ := by + exact abs_add_le _ _ + _ ≤ D.toReal * (cubeEuclideanWspFullENorm Q s p.conjugate h.toField).toReal + + A * (eLpNorm (fun x => HilbertVec.ofVec (h.toField x - G.toField x)) 2 + (normalizedCubeMeasure Q)).toReal := add_le_add hsmooth hdifference + _ ≤ D.toReal * (N.toReal + delta) + A * delta := by + apply add_le_add + · gcongr + exact hnorm_real.trans (add_le_add_right hfull_real.le N.toReal) + · gcongr + _ = D.toReal * N.toReal + (D.toReal + A) * delta := by ring + _ ≤ D.toReal * N.toReal + epsilon := by + gcongr + rw [show (D.toReal + A) * delta = + (epsilon * (D.toReal + A)) / (A + D.toReal + 1) by + dsimp only [delta] + ring] + apply (div_le_iff₀ hdenom).mpr + apply mul_le_mul_of_nonneg_left + linarith + exact hepsilon.le + · have hDtop : D = ∞ := ((not_lt.mp hD).antisymm le_top).symm + by_cases hNzero : N = 0 + · rw [hDtop, hNzero] + rw [cubeEuclideanNormalizedFieldPairing_eq_zero_of_fullENorm_eq_zero F G hNzero] + simp + · rw [hDtop, ENNReal.top_mul hNzero] + exact le_top + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualNegativeBesov.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualNegativeBesov.lean new file mode 100644 index 0000000000..4d7fa132eb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothDualNegativeBesov.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Book.Ch03.ABK26.NegativeBesov + +/-! +# Scalar-coordinate envelopes for the source negative Besov seminorm + +This module keeps the source-facing vector negative Besov seminorm distinct +from the scalar circ quantities used by the projection duality argument. It +only records the elementary coordinate envelope: each scalar coordinate of a +vector field has no larger running-scale block-average envelope. +-/ + +@[expose] public section + +namespace Homogenization +namespace Book +namespace Ch03 +namespace ABK26 + +open scoped BigOperators ENNReal + +noncomputable section + +/-- The scalar running-scale depth energy of one coordinate of the represented +`L²` field. This is deliberately an auxiliary envelope, not a redefinition of +the source-facing vector seminorm. -/ +noncomputable def cubeEuclideanNegativeBesovScalarDepthEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (j : ℕ) : ℝ≥0∞ := by + classical + exact ENNReal.ofReal + (Real.rpow 3 + (s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ)))) * + ((descendantsAtScale Q (Q.scale - (j : ℤ))).card : ℝ≥0∞)⁻¹ * + (descendantsAtScale Q (Q.scale - (j : ℤ))).attach.sum (fun R => + (ENNReal.ofReal |cubeAverage R.1 (fun x => F.toField x i)|) ^ + p.exponent.toReal) + +/-- Finite-depth scalar circ envelope, with the same running-scale weights as +the source negative Besov quantity. -/ +noncomputable def cubeEuclideanNegativeBesovScalarPartialENorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (N : ℕ) : ℝ≥0∞ := + (∑ j ∈ Finset.range N, cubeEuclideanNegativeBesovScalarDepthEnergy Q s p F i j) ^ + (p.exponent.toReal)⁻¹ + +/-- The infinite scalar circ envelope of a coordinate, retained separately +from the vector source seminorm. -/ +noncomputable def cubeEuclideanNegativeBesovScalarENorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) : ℝ≥0∞ := + (∑' j, cubeEuclideanNegativeBesovScalarDepthEnergy Q s p F i j) ^ + (p.exponent.toReal)⁻¹ + +theorem cubeEuclideanNegativeBesovScalarDepthEnergy_le {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (j : ℕ) : + cubeEuclideanNegativeBesovScalarDepthEnergy Q s p F i j ≤ + cubeEuclideanNegativeBesovDepthEnergy Q s p F j := by + classical + unfold cubeEuclideanNegativeBesovScalarDepthEnergy + cubeEuclideanNegativeBesovDepthEnergy + gcongr + simpa [cubeAverageVec] using norm_le_pi_norm (cubeAverageVec _ F.toField) i + +theorem cubeEuclideanNegativeBesovScalarPartialENorm_le {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) (N : ℕ) : + cubeEuclideanNegativeBesovScalarPartialENorm Q s p F i N ≤ + cubeEuclideanNegativeBesovESeminorm Q s p F := by + unfold cubeEuclideanNegativeBesovScalarPartialENorm + rw [cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy] + apply ENNReal.rpow_le_rpow + · calc + ∑ j ∈ Finset.range N, cubeEuclideanNegativeBesovScalarDepthEnergy Q s p F i j ≤ + ∑ j ∈ Finset.range N, cubeEuclideanNegativeBesovDepthEnergy Q s p F j := by + gcongr with j hj + exact cubeEuclideanNegativeBesovScalarDepthEnergy_le Q s p F i j + _ ≤ ∑' j, cubeEuclideanNegativeBesovDepthEnergy Q s p F j := + ENNReal.sum_le_tsum (Finset.range N) + · exact inv_nonneg.mpr (by positivity) + +theorem cubeEuclideanNegativeBesovScalarENorm_le {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q FiniteLpExponent.two) (i : Fin d) : + cubeEuclideanNegativeBesovScalarENorm Q s p F i ≤ + cubeEuclideanNegativeBesovESeminorm Q s p F := by + unfold cubeEuclideanNegativeBesovScalarENorm + rw [cubeEuclideanNegativeBesovESeminorm_eq_tsum_depthEnergy] + apply ENNReal.rpow_le_rpow + · exact ENNReal.tsum_le_tsum + (cubeEuclideanNegativeBesovScalarDepthEnergy_le Q s p F i) + · exact inv_nonneg.mpr (by positivity) + +end + +end ABK26 +end Ch03 +end Book +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothGraph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothGraph.lean new file mode 100644 index 0000000000..96d1e539f7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothGraph.lean @@ -0,0 +1,180 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothMembership + +/-! +# Algebraic carrier for smooth Euclidean fractional-Sobolev tests + +This module supplies the pointwise real vector-space structure on globally +smooth test fields. The subsequent completed-dual graph will map this carrier +to two `L^p` components once the separate diagonal-singularity integrability +lemma establishes that every smooth test has finite Gagliardo seminorm. +-/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace CubeEuclideanWspSmoothTest + +/-- Smooth test fields are determined by their pointwise vector fields. -/ +@[ext] +theorem ext {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} {h k : CubeEuclideanWspSmoothTest Q s p} + (hfield : h.toField = k.toField) : h = k := by + cases h + cases k + cases hfield + rfl + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : Zero (CubeEuclideanWspSmoothTest Q s p) where + zero := + { toField := 0 + contDiff := contDiff_const } + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : Add (CubeEuclideanWspSmoothTest Q s p) where + add h k := + { toField := h.toField + k.toField + contDiff := h.contDiff.add k.contDiff } + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : Neg (CubeEuclideanWspSmoothTest Q s p) where + neg h := + { toField := -h.toField + contDiff := h.contDiff.neg } + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : Sub (CubeEuclideanWspSmoothTest Q s p) where + sub h k := h + -k + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : AddCommGroup (CubeEuclideanWspSmoothTest Q s p) where + add_assoc h k l := by + apply ext + funext x + exact add_assoc _ _ _ + zero_add h := by + apply ext + funext x + exact zero_add _ + add_zero h := by + apply ext + funext x + exact add_zero _ + neg_add_cancel h := by + apply ext + funext x + exact neg_add_cancel _ + add_comm h k := by + apply ext + funext x + exact add_comm _ _ + sub_eq_add_neg h k := rfl + nsmul := nsmulRec + nsmul_zero := by intro h; rfl + nsmul_succ := by intro n h; rfl + zsmul := zsmulRec + zsmul_zero' := by intro h; rfl + zsmul_succ' := by intro n h; rfl + zsmul_neg' := by intro n h; rfl + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : SMul ℝ (CubeEuclideanWspSmoothTest Q s p) where + smul c h := + { toField := c • h.toField + contDiff := h.contDiff.const_smul c } + +instance {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : Module ℝ (CubeEuclideanWspSmoothTest Q s p) where + one_smul h := by + apply ext + funext x + exact one_smul ℝ (h.toField x) + mul_smul c d h := by + apply ext + funext x + exact mul_smul c d (h.toField x) + smul_zero c := by + apply ext + funext x + exact smul_zero c + smul_add c h k := by + apply ext + funext x + exact smul_add c (h.toField x) (k.toField x) + add_smul c d h := by + apply ext + funext x + exact add_smul c d (h.toField x) + zero_smul h := by + apply ext + funext x + exact zero_smul ℝ (h.toField x) + +@[simp] +theorem toField_zero {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} : + ((0 : CubeEuclideanWspSmoothTest Q s p).toField) = 0 := rfl + +@[simp] +theorem toField_add {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (h k : CubeEuclideanWspSmoothTest Q s p) : + (h + k).toField = h.toField + k.toField := rfl + +@[simp] +theorem toField_neg {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) : + (-h).toField = -h.toField := rfl + +@[simp] +theorem toField_smul {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (c : ℝ) (h : CubeEuclideanWspSmoothTest Q s p) : + (c • h).toField = c • h.toField := rfl + +/-- The exact fractional-Sobolev field represented by a smooth test. + +This is the source-facing graph map: it changes neither the pointwise field nor +either constituent of the approved full `W^(s,p)` norm. Completion and dual +identification remain deliberately outside this module. -/ +noncomputable def toCubeEuclideanWspField {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : CubeEuclideanWspField Q s p where + toField := h.toField + euclideanMemLp := euclideanMemLp_of_continuous Q p.exponent h.contDiff.continuous + euclideanMemWsp := h.memCubeEuclideanWsp + +@[simp] +theorem toCubeEuclideanWspField_toField {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + h.toCubeEuclideanWspField.toField = h.toField := rfl + +/-- The graph representative has exactly the original Gagliardo seminorm. -/ +theorem toCubeEuclideanWspField_eSeminorm_eq {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspESeminorm Q s p h.toCubeEuclideanWspField.toField = + cubeEuclideanWspESeminorm Q s p h.toField := rfl + +/-- The graph representative has exactly the approved full `W^(s,p)` norm. -/ +theorem toCubeEuclideanWspField_fullENorm_eq {d : ℕ} {Q : TriadicCube d} + {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + cubeEuclideanWspFullENorm Q s p h.toCubeEuclideanWspField.toField = + cubeEuclideanWspFullENorm Q s p h.toField := rfl + +end CubeEuclideanWspSmoothTest + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothMembership.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothMembership.lean new file mode 100644 index 0000000000..c315af8d32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspSmoothMembership.lean @@ -0,0 +1,463 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspSmoothDual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry +public import Mathlib.Analysis.Calculus.MeanValue +public import Mathlib.Analysis.SpecialFunctions.Integrability.Basic +public import Mathlib.MeasureTheory.Constructions.HaarToSphere + +/-! +# Fractional Sobolev membership of smooth cube tests + +The only analytic input in this file is the local integrability of a radial +power kernel with positive gain over the dimension. It is then applied to the +Lipschitz bound supplied by global smoothness on the bounded cube. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Metric +open scoped ENNReal + +noncomputable section + +private noncomputable def smoothWspPowerKernel {d : ℕ} (a : ℝ) + (x y : Vec d) : ℝ := + ‖x - y‖ ^ (a - (d : ℝ)) + +private theorem smoothWspPowerKernel_integrableOn_ball {d : ℕ} [NeZero d] + {a R : ℝ} (ha : 0 < a) (hR : 0 < R) : + IntegrableOn (fun x : Vec d => ‖x‖ ^ (a - (d : ℝ))) + (Metric.ball (0 : Vec d) R) volume := by + let g : ℝ → ℝ := fun r => if r < R then r ^ (a - (d : ℝ)) else 0 + have hag : + (fun x : Vec d => ‖x‖ ^ (a - (d : ℝ))) =ᵐ[ + volume.restrict (Metric.ball (0 : Vec d) R)] + (g ∘ (‖·‖)) := by + filter_upwards [ae_restrict_mem measurableSet_ball] with x hx + simp only [Function.comp_apply, g, mem_ball, dist_zero_right] at hx ⊢ + rw [if_pos hx] + rw [IntegrableOn, integrable_congr hag] + suffices h : Integrable (fun x : Vec d => g ‖x‖) volume from h.integrableOn + have hradial : + IntegrableOn + (fun r : ℝ => r ^ (Module.finrank ℝ (Vec d) - 1) • g r) + (Set.Ioi 0) := by + have hfin : Module.finrank ℝ (Vec d) = d := by simp [Vec] + let hInd : ℝ → ℝ := + (Set.Ioo (0 : ℝ) R).indicator (fun r => r ^ (a - 1)) + have heq : Set.EqOn + (fun r : ℝ => r ^ (Module.finrank ℝ (Vec d) - 1) • g r) + hInd (Set.Ioi 0) := by + intro r hr + have hrpos : 0 < r := hr + simp only [g, hInd, smul_eq_mul, Set.indicator, Set.mem_Ioo] + by_cases hrR : r < R + · rw [if_pos hrR, if_pos ⟨hrpos, hrR⟩, hfin, + ← Real.rpow_natCast r (d - 1), + Nat.cast_sub (Nat.one_le_iff_ne_zero.mpr (NeZero.ne d)), + ← Real.rpow_add hrpos] + congr 1 + ring + · rw [if_neg hrR, if_neg (not_and_of_not_right _ hrR), mul_zero] + have hInd_int : IntegrableOn hInd (Set.Ioi 0) := by + have hwhole : Integrable hInd volume := by + dsimp [hInd] + exact ((intervalIntegral.integrableOn_Ioo_rpow_iff hR).mpr (by linarith)).integrable_indicator + measurableSet_Ioo + exact hwhole.mono_measure Measure.restrict_le_self + exact hInd_int.congr_fun heq.symm measurableSet_Ioi + exact (integrable_fun_norm_addHaar (μ := volume) (f := g)).mpr hradial + +private theorem smoothWspPowerKernel_integrableOn_translated_ball {d : ℕ} [NeZero d] + {a R : ℝ} (ha : 0 < a) (hR : 0 < R) (x : Vec d) + (hx : x ∈ Metric.ball (0 : Vec d) R) : + IntegrableOn (fun y : Vec d => smoothWspPowerKernel a x y) + (Metric.ball (0 : Vec d) R) volume := by + have hsub : Metric.ball (0 : Vec d) R ⊆ Metric.ball x (2 * R) := by + intro y hy + rw [mem_ball, dist_eq_norm] at hy ⊢ + have hxnorm : ‖x‖ < R := by simpa [mem_ball, dist_zero_right] using hx + have hynorm : ‖y‖ < R := by simpa using hy + calc + ‖y - x‖ ≤ ‖y‖ + ‖x‖ := norm_sub_le _ _ + _ < R + R := add_lt_add hynorm hxnorm + _ = 2 * R := by ring + have hmp := MeasureTheory.measurePreserving_add_right (volume : Measure (Vec d)) x + have hemb := (MeasurableEquiv.addRight x : Vec d ≃ᵐ Vec d).measurableEmbedding + have hpre : + (· + x) ⁻¹' Metric.ball x (2 * R) = Metric.ball (0 : Vec d) (2 * R) := by + ext z + simp [mem_ball] + have hbig : + IntegrableOn (fun y : Vec d => smoothWspPowerKernel a x y) + (Metric.ball x (2 * R)) volume := by + rw [← hmp.integrableOn_comp_preimage hemb, hpre] + exact (smoothWspPowerKernel_integrableOn_ball (d := d) ha + (by linarith : 0 < 2 * R)).congr + (Filter.Eventually.of_forall fun z => by + unfold smoothWspPowerKernel + show ‖z‖ ^ (a - (d : ℝ)) = ‖x - (z + x)‖ ^ (a - (d : ℝ)) + simp) + exact hbig.mono_set hsub + +private theorem smoothWspPowerKernel_integrable_gagliardoCubeMeasure {d : ℕ} [NeZero d] + (Q : TriadicCube d) {a : ℝ} (ha : 0 < a) : + Integrable (fun z : Vec d × Vec d => smoothWspPowerKernel a z.1 z.2) + (Gagliardo.gagliardoCubeMeasure Q) := by + let U := cubeSet Q + let μ := cubeMeasure Q + let hUbd : IsBoundedDomain U := + Bornology.IsBounded.isBoundedDomain (Homogenization.isBounded_cubeSet Q) + let C : ℝ := Classical.choose hUbd + have hC : 0 < C := (Classical.choose_spec hUbd).1 + have hU_meas : MeasurableSet U := measurableSet_cubeSet Q + let : IsFiniteMeasure μ := by + simpa only [μ, cubeMeasure, U] using hUbd.isFiniteMeasure_restrict_volume + let : SFinite μ := inferInstance + have hsub : U ⊆ Metric.ball (0 : Vec d) (2 * C) := by + intro x hx + rw [mem_ball, dist_zero_right] + exact hUbd.norm_le_choose hx |>.trans_lt (by linarith) + have hradial : Integrable (fun z : Vec d => ‖z‖ ^ (a - (d : ℝ))) + (volume.restrict (Metric.ball (0 : Vec d) (4 * C))) := by + simpa only [IntegrableOn] using smoothWspPowerKernel_integrableOn_ball (d := d) + ha (by linarith : 0 < 4 * C) + let B : ℝ := ∫ z in Metric.ball (0 : Vec d) (4 * C), ‖z‖ ^ (a - (d : ℝ)) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + exact setIntegral_nonneg measurableSet_ball fun z _ => Real.rpow_nonneg (norm_nonneg _) _ + have hkernel_meas : Measurable (fun z : Vec d × Vec d => + smoothWspPowerKernel a z.1 z.2) := by + unfold smoothWspPowerKernel + fun_prop + have hsections : ∀ᵐ y ∂μ, Integrable + (fun x : Vec d => smoothWspPowerKernel a x y) μ := by + change ∀ᵐ y ∂volume.restrict U, Integrable + (fun x : Vec d => smoothWspPowerKernel a x y) μ + filter_upwards [ae_restrict_mem hU_meas] with y hy + have hyball : y ∈ Metric.ball (0 : Vec d) (2 * C) := hsub hy + have hlarge : IntegrableOn (fun x : Vec d => smoothWspPowerKernel a x y) + (Metric.ball (0 : Vec d) (2 * C)) volume := by + simpa only [smoothWspPowerKernel, norm_sub_rev] using + smoothWspPowerKernel_integrableOn_translated_ball (d := d) ha + (by linarith : 0 < 2 * C) y hyball + simpa only [μ, cubeMeasure, IntegrableOn] using hlarge.mono_set hsub + have houter_meas : AEStronglyMeasurable + (fun y : Vec d => ∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ) μ := by + have hswap : Measurable (fun z : Vec d × Vec d => + ‖smoothWspPowerKernel a z.2 z.1‖) := by + simpa only [smoothWspPowerKernel, norm_sub_rev] using hkernel_meas.norm + exact hswap.aemeasurable.aestronglyMeasurable.integral_prod_right' + have houter_bound : ∀ᵐ y ∂μ, + ‖∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ‖ ≤ B := by + change ∀ᵐ y ∂volume.restrict U, + ‖∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ‖ ≤ B + filter_upwards [ae_restrict_mem hU_meas] with y hy + have hyball : y ∈ Metric.ball (0 : Vec d) (2 * C) := hsub hy + have hlarge : IntegrableOn (fun x : Vec d => smoothWspPowerKernel a x y) + (Metric.ball (0 : Vec d) (2 * C)) volume := by + simpa only [smoothWspPowerKernel, norm_sub_rev] using + smoothWspPowerKernel_integrableOn_translated_ball (d := d) ha + (by linarith : 0 < 2 * C) y hyball + have hlarge' : Integrable (fun x : Vec d => smoothWspPowerKernel a x y) + (volume.restrict (Metric.ball (0 : Vec d) (2 * C))) := hlarge + have hbig : IntegrableOn (fun x : Vec d => smoothWspPowerKernel a x y) + (Metric.ball y (4 * C)) volume := by + have hmp := MeasureTheory.measurePreserving_add_right (volume : Measure (Vec d)) y + have hemb := (MeasurableEquiv.addRight y : Vec d ≃ᵐ Vec d).measurableEmbedding + have hpre : + (· + y) ⁻¹' Metric.ball y (4 * C) = Metric.ball (0 : Vec d) (4 * C) := by + ext z + simp [mem_ball] + rw [← hmp.integrableOn_comp_preimage hemb, hpre] + exact hradial.congr (Filter.Eventually.of_forall fun z => by + unfold smoothWspPowerKernel + simp) + have htrans : + ∫ x in Metric.ball (0 : Vec d) (2 * C), smoothWspPowerKernel a x y ≤ B := by + have hmp := MeasureTheory.measurePreserving_add_right (volume : Measure (Vec d)) y + have hemb := (MeasurableEquiv.addRight y : Vec d ≃ᵐ Vec d).measurableEmbedding + have hpre : + (· + y) ⁻¹' Metric.ball y (4 * C) = Metric.ball (0 : Vec d) (4 * C) := by + ext z + simp [mem_ball] + have hmove : + ∫ x in Metric.ball y (4 * C), smoothWspPowerKernel a x y = B := by + rw [← hmp.setIntegral_preimage_emb hemb, hpre] + dsimp [B] + congr 1 with z + unfold smoothWspPowerKernel + simp + have hsubball : Metric.ball (0 : Vec d) (2 * C) ⊆ Metric.ball y (4 * C) := by + intro x hx + rw [mem_ball, dist_eq_norm] at hx ⊢ + have hynorm : ‖y‖ < 2 * C := by simpa [mem_ball, dist_zero_right] using hyball + calc + ‖x - y‖ ≤ ‖x‖ + ‖y‖ := norm_sub_le _ _ + _ < 2 * C + 2 * C := add_lt_add (by simpa [mem_ball, dist_zero_right] using hx) hynorm + _ = 4 * C := by ring + exact (setIntegral_mono_set hbig + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) + hsubball.eventuallyLE).trans_eq hmove + have hnonneg : 0 ≤ ∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ := + integral_nonneg fun x => norm_nonneg _ + rw [Real.norm_of_nonneg hnonneg] + calc + ∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ = + ∫ x in U, smoothWspPowerKernel a x y := by + apply integral_congr_ae + filter_upwards with x + exact Real.norm_of_nonneg (by + unfold smoothWspPowerKernel + exact Real.rpow_nonneg (norm_nonneg _) _) + _ ≤ ∫ x in Metric.ball (0 : Vec d) (2 * C), smoothWspPowerKernel a x y := by + exact setIntegral_mono_set hlarge + (Filter.Eventually.of_forall fun x => Real.rpow_nonneg (norm_nonneg _) _) hsub.eventuallyLE + _ ≤ B := htrans + have houter_int : Integrable (fun _ : Vec d => B) μ := integrable_const B + have hnorm_int : Integrable (fun y => ∫ x, ‖smoothWspPowerKernel a x y‖ ∂μ) μ := + houter_int.mono' houter_meas houter_bound + have hprod : Integrable (fun z : Vec d × Vec d => smoothWspPowerKernel a z.1 z.2) + (μ.prod μ) := + (integrable_prod_iff' hkernel_meas.aestronglyMeasurable).2 ⟨hsections, hnorm_int⟩ + rw [Gagliardo.gagliardoCubeMeasure, normalizedCubeMeasure, Measure.prod_smul_left] + exact hprod.smul_measure ENNReal.ofReal_ne_top + +private noncomputable def smoothWspLpMajorant {d : ℕ} + (s : FractionalOrder) (p : FiniteLpExponent) : Vec d × Vec d → ℝ := + fun z => ‖z.1 - z.2‖ ^ (1 - s.1 - (d : ℝ) / p.exponent.toReal) + +private theorem memLp_smoothWspLpMajorant {d : ℕ} [NeZero d] + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) : + MemLp (smoothWspLpMajorant s p) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := by + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hmeas : Measurable (smoothWspLpMajorant (d := d) s p) := by + unfold smoothWspLpMajorant + fun_prop + rw [← integrable_norm_rpow_iff hmeas.aestronglyMeasurable + (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne] + convert smoothWspPowerKernel_integrable_gagliardoCubeMeasure Q + (a := p.exponent.toReal * (1 - s.1)) (mul_pos hp (sub_pos.mpr s.2.2)) using 1 + ext z + simp only [smoothWspLpMajorant, Real.norm_eq_abs, + abs_of_nonneg (Real.rpow_nonneg (norm_nonneg _) _)] + rw [← Real.rpow_mul (norm_nonneg _)] + congr 1 + field_simp [hp.ne'] + +private theorem convex_cubeSet_for_smoothMembership {d : ℕ} (Q : TriadicCube d) : + Convex ℝ (cubeSet Q) := by + rw [cubeSet_eq_pi_Ico] + refine convex_pi ?_ + intro i hi + exact convex_Ico _ _ + +private theorem smoothTest_euclideanNorm_sub_le_lipschitz {d : ℕ} [NeZero d] + (Q : TriadicCube d) {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ∃ L : ℝ, 0 ≤ L ∧ ∀ x ∈ cubeSet Q, ∀ y ∈ cubeSet Q, + euclideanNorm (h.toField x - h.toField y) ≤ L * ‖x - y‖ := by + have hderiv_cont : Continuous (fderiv ℝ h.toField) := + h.contDiff.continuous_fderiv (by norm_num) + have hcompact : IsCompact (closure (cubeSet Q)) := + (isBounded_cubeSet Q).isCompact_closure + obtain ⟨C, hC⟩ := hcompact.exists_bound_of_continuousOn hderiv_cont.norm.continuousOn + let L := max C 0 + have hL : 0 ≤ L := le_max_right _ _ + refine ⟨(d : ℝ) * L, mul_nonneg (Nat.cast_nonneg _) hL, ?_⟩ + intro x hx y hy + have hderiv_bound : ∀ z ∈ cubeSet Q, ‖fderiv ℝ h.toField z‖ ≤ L := by + intro z hz + simpa only [L, Real.norm_eq_abs, abs_of_nonneg (norm_nonneg _)] using + (hC z (subset_closure hz)).trans (le_max_left C 0) + have hambient : ‖h.toField x - h.toField y‖ ≤ L * ‖x - y‖ := by + simpa [mul_comm] using + (Convex.norm_image_sub_le_of_norm_fderiv_le + (𝕜 := ℝ) (f := h.toField) (s := cubeSet Q) (C := L) (x := y) (y := x) + (fun z _ => h.contDiff.differentiable (by norm_num) z) + (fun z hz => hderiv_bound z hz) + (convex_cubeSet_for_smoothMembership Q) hy hx) + calc + euclideanNorm (h.toField x - h.toField y) ≤ + (d : ℝ) * ‖h.toField x - h.toField y‖ := + euclideanNorm_le_dimension_mul_norm _ + _ ≤ (d : ℝ) * (L * ‖x - y‖) := + mul_le_mul_of_nonneg_left hambient (Nat.cast_nonneg _) + _ = ((d : ℝ) * L) * ‖x - y‖ := by ring + +private theorem smoothTest_kernel_norm_le_lipschitz_majorant {d : ℕ} [NeZero d] + (Q : TriadicCube d) {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ∃ L : ℝ, 0 ≤ L ∧ ∀ x ∈ cubeSet Q, ∀ y ∈ cubeSet Q, + ‖cubeEuclideanWspKernel s p h.toField (x, y)‖ ≤ + L * smoothWspLpMajorant s p (x, y) := by + obtain ⟨L, hL, hLip⟩ := smoothTest_euclideanNorm_sub_le_lipschitz Q h + refine ⟨L, hL, ?_⟩ + intro x hx y hy + let b : ℝ := s.1 + (d : ℝ) / p.exponent.toReal + have hb : 0 < b := add_pos_of_pos_of_nonneg s.2.1 + (div_nonneg (Nat.cast_nonneg _) ENNReal.toReal_nonneg) + by_cases hxy : x = y + · subst y + rw [norm_cubeEuclideanWspKernel] + simp only [sub_self, euclideanNorm_zero, mul_zero] + exact mul_nonneg hL (Real.rpow_nonneg (norm_nonneg _) _) + · have hsub : x - y ≠ 0 := sub_ne_zero.mpr hxy + have hdist : 0 < ‖x - y‖ := norm_pos_iff.mpr hsub + have hpow : euclideanDist x y ^ (-b) ≤ ‖x - y‖ ^ (-b) := by + exact Real.rpow_le_rpow_of_nonpos hdist (dist_le_euclideanDist x y) + (neg_nonpos.mpr hb.le) + rw [norm_cubeEuclideanWspKernel] + have hfirst : + euclideanDist x y ^ (-b) * euclideanNorm (h.toField x - h.toField y) ≤ + euclideanDist x y ^ (-b) * (L * ‖x - y‖) := + mul_le_mul_of_nonneg_left (hLip x hx y hy) + (Real.rpow_nonneg (euclideanDist_nonneg _ _) _) + calc + euclideanDist x y ^ (-(s.1 + (d : ℝ) / p.exponent.toReal)) * + euclideanNorm (h.toField x - h.toField y) = + euclideanDist x y ^ (-b) * euclideanNorm (h.toField x - h.toField y) := by rfl + _ ≤ euclideanDist x y ^ (-b) * (L * ‖x - y‖) := hfirst + _ ≤ ‖x - y‖ ^ (-b) * (L * ‖x - y‖) := + mul_le_mul_of_nonneg_right hpow (mul_nonneg hL hdist.le) + _ = L * ‖x - y‖ ^ (1 - s.1 - (d : ℝ) / p.exponent.toReal) := by + calc + ‖x - y‖ ^ (-b) * (L * ‖x - y‖) = + L * (‖x - y‖ ^ (-b) * ‖x - y‖) := by ring + _ = L * (‖x - y‖ ^ (-b) * ‖x - y‖ ^ (1 : ℝ)) := by + rw [Real.rpow_one] + _ = L * ‖x - y‖ ^ (-b + 1) := by rw [← Real.rpow_add hdist] + _ = L * ‖x - y‖ ^ (1 - s.1 - (d : ℝ) / p.exponent.toReal) := by + congr 2 + dsimp [b] + ring + +private theorem gagliardoCubeMeasure_diagonal_eq_zero {d : ℕ} [NeZero d] + (Q : TriadicCube d) : + Gagliardo.gagliardoCubeMeasure Q (Set.diagonal (Vec d)) = 0 := by + let : IsFiniteMeasure (cubeMeasure Q) := + ⟨lt_top_iff_ne_top.mpr (cubeMeasure_apply_univ_ne_top Q)⟩ + rw [Gagliardo.gagliardoCubeMeasure] + apply Measure.measure_prod_null isClosed_diagonal.measurableSet |>.mpr + filter_upwards with x + have hpre : Prod.mk x ⁻¹' Set.diagonal (Vec d) = {x} := by + ext y + simp [Set.mem_diagonal_iff, eq_comm] + rw [hpre] + simp [cubeMeasure] + +private theorem continuousOn_cubeEuclideanWspKernel_offDiagonal {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + ContinuousOn (cubeEuclideanWspKernel s p h.toField) + (Set.diagonal (Vec d))ᶜ := by + have hdist : Continuous (fun z : Vec d × Vec d => euclideanDist z.1 z.2) := by + have hh : Continuous (fun z : Vec d × Vec d => HilbertVec.ofVec (z.1 - z.2)) := + (HilbertVec.ofVecL d).continuous.comp (continuous_fst.sub continuous_snd) + simpa only [euclideanDist, euclideanNorm_eq_norm_ofVec] using hh.norm + have hfield : Continuous (fun z : Vec d × Vec d => + HilbertVec.ofVec (h.toField z.1 - h.toField z.2)) := + (HilbertVec.ofVecL d).continuous.comp + ((h.contDiff.continuous.comp continuous_fst).sub + (h.contDiff.continuous.comp continuous_snd)) + unfold cubeEuclideanWspKernel + exact (hdist.continuousOn.rpow_const fun z hz => Or.inl (by + intro hzero + apply hz + exact Set.mem_diagonal_iff.mpr (euclideanDist_eq_zero_iff.mp hzero))).smul + hfield.continuousOn + +private theorem aestronglyMeasurable_cubeEuclideanWspKernel_of_smoothTest + {d : ℕ} [NeZero d] {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) : + AEStronglyMeasurable (cubeEuclideanWspKernel s p h.toField) + (Gagliardo.gagliardoCubeMeasure Q) := by + let μ := Gagliardo.gagliardoCubeMeasure Q + let D : Set (Vec d × Vec d) := (Set.diagonal (Vec d))ᶜ + have hcont : ContinuousOn (cubeEuclideanWspKernel s p h.toField) D := by + exact continuousOn_cubeEuclideanWspKernel_offDiagonal h + have hDmeas : MeasurableSet D := isClosed_diagonal.measurableSet.compl + have hdiag : μ (Set.diagonal (Vec d)) = 0 := + gagliardoCubeMeasure_diagonal_eq_zero Q + have hDae : ∀ᵐ z ∂μ, z ∈ D := by + rw [ae_iff] + simpa [D] using! hdiag + have hrestrict : μ.restrict D = μ := Measure.restrict_eq_self_of_ae_mem hDae + have hmeas : AEStronglyMeasurable (cubeEuclideanWspKernel s p h.toField) + (μ.restrict D) := + hcont.aestronglyMeasurable hDmeas + simpa only [hrestrict] using hmeas + +private theorem ae_mem_cubeSet_prod_gagliardoCubeMeasure {d : ℕ} + (Q : TriadicCube d) : + ∀ᵐ z ∂Gagliardo.gagliardoCubeMeasure Q, z.1 ∈ cubeSet Q ∧ z.2 ∈ cubeSet Q := by + let : IsFiniteMeasure (cubeMeasure Q) := + ⟨lt_top_iff_ne_top.mpr (cubeMeasure_apply_univ_ne_top Q)⟩ + have hbase : ∀ᵐ z ∂(cubeMeasure Q).prod (cubeMeasure Q), + z.1 ∈ cubeSet Q ∧ z.2 ∈ cubeSet Q := by + change ∀ᵐ z ∂(cubeMeasure Q).prod (cubeMeasure Q), z ∈ cubeSet Q ×ˢ cubeSet Q + refine (Measure.ae_prod_iff_ae_ae + (μ := cubeMeasure Q) (ν := cubeMeasure Q) + (p := fun z : Vec d × Vec d => z.1 ∈ cubeSet Q ∧ z.2 ∈ cubeSet Q) + ((measurableSet_cubeSet Q).prod (measurableSet_cubeSet Q))).mpr ?_ + filter_upwards [ae_restrict_mem (measurableSet_cubeSet Q)] with x hx + filter_upwards [ae_restrict_mem (measurableSet_cubeSet Q)] with y hy + exact ⟨hx, hy⟩ + rw [Gagliardo.gagliardoCubeMeasure, normalizedCubeMeasure, Measure.prod_smul_left] + exact Measure.ae_smul_measure hbase (ENNReal.ofReal ((cubeVolume Q)⁻¹)) + +private theorem memCubeEuclideanWsp_of_smoothTest_neZero {d : ℕ} [NeZero d] + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + (h : CubeEuclideanWspSmoothTest Q s p) : + MemCubeEuclideanWsp Q s p h.toField := by + obtain ⟨L, hL, hbound⟩ := smoothTest_kernel_norm_le_lipschitz_majorant Q h + have hmajor : MemLp (L • smoothWspLpMajorant s p) p.exponent + (Gagliardo.gagliardoCubeMeasure Q) := + (memLp_smoothWspLpMajorant Q s p).const_smul L + apply hmajor.mono' + (aestronglyMeasurable_cubeEuclideanWspKernel_of_smoothTest h) + filter_upwards [ae_mem_cubeSet_prod_gagliardoCubeMeasure Q] with z hz + calc + ‖cubeEuclideanWspKernel s p h.toField z‖ ≤ + L * smoothWspLpMajorant s p z := hbound z.1 hz.1 z.2 hz.2 + _ = (L • smoothWspLpMajorant s p) z := rfl + +namespace CubeEuclideanWspSmoothTest + +/-- A globally smooth vector field has finite cube fractional-Sobolev seminorm. + +The positive-dimensional proof controls the off-diagonal kernel by a Lipschitz +majorant; in dimension zero the target vector space is subsingleton, so the +kernel vanishes identically. -/ +theorem memCubeEuclideanWsp {d : ℕ} {Q : TriadicCube d} {s : FractionalOrder} + {p : FiniteLpExponent} (h : CubeEuclideanWspSmoothTest Q s p) : + MemCubeEuclideanWsp Q s p h.toField := by + classical + by_cases hd : d = 0 + · subst d + have hkernel : cubeEuclideanWspKernel s p h.toField = 0 := by + funext z + have hsub : h.toField z.1 - h.toField z.2 = 0 := Subsingleton.elim _ _ + simp [cubeEuclideanWspKernel_apply, hsub] + unfold MemCubeEuclideanWsp + rw [hkernel] + exact MemLp.zero + · let : NeZero d := ⟨hd⟩ + exact memCubeEuclideanWsp_of_smoothTest_neZero h + +end CubeEuclideanWspSmoothTest + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspTranslation.lean new file mode 100644 index 0000000000..614d9775cf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/EuclideanWspTranslation.lean @@ -0,0 +1,205 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWsp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.DefinitionsAPI + +/-! +# Triadic translation covariance for finite-p Euclidean fractional norms + +The translation is represented by the lattice vector attached to +`translateCube`. All identities preserve the normalized measures exactly. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- Translation by the lattice shift, as a measurable equivalence of Euclidean space. -/ +noncomputable def euclideanWspTranslationEquiv {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) : Vec d ≃ᵐ Vec d := + MeasurableEquiv.addRight (Gagliardo.cubeShiftVector shift Q) + +private theorem euclideanWspTranslation_measurePreserving {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) : + MeasurePreserving (euclideanWspTranslationEquiv shift Q) + (normalizedCubeMeasure Q) + (normalizedCubeMeasure (translateCube shift Q)) := by + let v := Gagliardo.cubeShiftVector shift Q + let T := euclideanWspTranslationEquiv shift Q + have hTapp : ∀ x, T x = x + v := fun x => rfl + have hmapT : Measure.map T volume = volume := by + have hco : (T : Vec d → Vec d) = (· + v) := rfl + rw [hco] + exact (measurePreserving_add_right volume v).map_eq + have hpre : (T : Vec d → Vec d) ⁻¹' cubeSet (translateCube shift Q) = cubeSet Q := by + ext x + simp only [Set.mem_preimage, hTapp, mem_cubeSet_translateCube_iff] + have hx : x + v - (fun i => (shift i : ℝ) * cubeScaleFactor Q) = x := by + funext i + simp [v, Gagliardo.cubeShiftVector] + rw [hx] + have hres : volume.restrict (cubeSet (translateCube shift Q)) = + Measure.map T (volume.restrict (cubeSet Q)) := by + rw [← hpre, ← Measure.restrict_map T.measurable + (measurableSet_cubeSet (translateCube shift Q)), hmapT] + have hvol : cubeVolume (translateCube shift Q) = cubeVolume Q := rfl + refine ⟨T.measurable, ?_⟩ + rw [normalizedCubeMeasure, normalizedCubeMeasure, cubeMeasure, cubeMeasure, + hvol, hres, Measure.map_smul _ T.measurable.aemeasurable] + +private theorem euclideanWspTranslation_pair_measurePreserving {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) : + MeasurePreserving + ((euclideanWspTranslationEquiv shift Q).prodCongr + (euclideanWspTranslationEquiv shift Q)) + (Gagliardo.gagliardoCubeMeasure Q) + (Gagliardo.gagliardoCubeMeasure (translateCube shift Q)) := by + let T := euclideanWspTranslationEquiv shift Q + have hT := euclideanWspTranslation_measurePreserving shift Q + have hTapp : ∀ x, T x = x + Gagliardo.cubeShiftVector shift Q := fun x => rfl + have hvol : cubeVolume (translateCube shift Q) = cubeVolume Q := rfl + have hmap : normalizedCubeMeasure (translateCube shift Q) = + Measure.map T (normalizedCubeMeasure Q) := by + simpa [T] using hT.map_eq.symm + have hres : cubeMeasure (translateCube shift Q) = + Measure.map T (cubeMeasure Q) := by + have hpre : (T : Vec d → Vec d) ⁻¹' cubeSet (translateCube shift Q) = cubeSet Q := by + ext x + simp only [Set.mem_preimage, hTapp, mem_cubeSet_translateCube_iff] + have hx : x + Gagliardo.cubeShiftVector shift Q - + (fun i => (shift i : ℝ) * cubeScaleFactor Q) = x := by + funext i + simp [Gagliardo.cubeShiftVector] + rw [hx] + have hmapT : Measure.map T volume = volume := by + change Measure.map (· + Gagliardo.cubeShiftVector shift Q) volume = volume + exact (measurePreserving_add_right volume _).map_eq + rw [cubeMeasure, cubeMeasure, ← hpre, ← Measure.restrict_map T.measurable + (measurableSet_cubeSet (translateCube shift Q)), hmapT] + have : SFinite (cubeMeasure Q) := by + unfold cubeMeasure + infer_instance + refine ⟨(T.prodCongr T).measurable, ?_⟩ + rw [Gagliardo.gagliardoCubeMeasure, Gagliardo.gagliardoCubeMeasure, hmap, hres, + Measure.map_prod_map _ _ T.measurable T.measurable] + rfl + +/-- Pointwise covariance of the Euclidean fractional kernel under translating +both variables by the triadic lattice vector. -/ +theorem cubeEuclideanWspKernel_translate {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) (z : Vec d × Vec d) : + cubeEuclideanWspKernel s p F + (((euclideanWspTranslationEquiv shift Q).prodCongr + (euclideanWspTranslationEquiv shift Q)) z) = + cubeEuclideanWspKernel s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) z := by + change cubeEuclideanWspKernel s p F + (z.1 + Gagliardo.cubeShiftVector shift Q, + z.2 + Gagliardo.cubeShiftVector shift Q) = _ + rw [cubeEuclideanWspKernel_apply, cubeEuclideanWspKernel_apply, + euclideanDist_add_right] + +/-- Exact covariance of the normalized Euclidean `L^p` term under a triadic +lattice translation. -/ +theorem cubeEuclideanNormalizedLpENorm_translate {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeBoundedMeasurableDomain (translateCube shift Q)).normalizedEuclideanLpENorm + p.exponent F = + (cubeBoundedMeasurableDomain Q).normalizedEuclideanLpENorm p.exponent + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) := by + let T := euclideanWspTranslationEquiv shift Q + have hMP := euclideanWspTranslation_measurePreserving shift Q + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + unfold BoundedMeasurableDomain.normalizedLpENorm + rw [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + simp only [ite_eq_right (ne_of_gt (lt_trans zero_lt_one p.one_lt)), + ite_eq_right p.lt_top.ne, eLpNorm'_eq_lintegral_enorm] + congr 1 + rw [MeasurePreserving.lintegral_map_equiv _ T hMP] + rfl + +/-- Exact covariance of the Euclidean fractional seminorm under a triadic +lattice translation. -/ +theorem cubeEuclideanWspESeminorm_translate {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + cubeEuclideanWspESeminorm (translateCube shift Q) s p F = + cubeEuclideanWspESeminorm Q s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) := by + let T := euclideanWspTranslationEquiv shift Q + let TP := T.prodCongr T + have hMP := euclideanWspTranslation_pair_measurePreserving shift Q + rw [cubeEuclideanWspESeminorm_eq_lintegral, + cubeEuclideanWspESeminorm_eq_lintegral] + congr 1 + rw [MeasurePreserving.lintegral_map_equiv _ TP hMP] + refine lintegral_congr fun z => ?_ + rw [cubeEuclideanWspKernel_translate] + +/-- Fractional Sobolev membership is exactly transported by a triadic lattice +translation. -/ +theorem memCubeEuclideanWsp_translate_iff {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + MemCubeEuclideanWsp (translateCube shift Q) s p F ↔ + MemCubeEuclideanWsp Q s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) := by + let T := euclideanWspTranslationEquiv shift Q + let TP := T.prodCongr T + have hMP := euclideanWspTranslation_pair_measurePreserving shift Q + have hker : cubeEuclideanWspKernel s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) = + cubeEuclideanWspKernel s p F ∘ TP := by + funext z + symm + exact cubeEuclideanWspKernel_translate shift Q s p F z + rw [memCubeEuclideanWsp_iff, memCubeEuclideanWsp_iff] + constructor + · rintro ⟨hmeas, hfinite⟩ + constructor + · rw [hker] + exact (hMP.aestronglyMeasurable_comp_iff TP.measurableEmbedding).2 hmeas + · change cubeEuclideanWspESeminorm Q s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) < ∞ + rwa [← cubeEuclideanWspESeminorm_translate shift Q s p F] + · rintro ⟨hmeas, hfinite⟩ + constructor + · apply (hMP.aestronglyMeasurable_comp_iff TP.measurableEmbedding).1 + rw [← hker] + exact hmeas + · change cubeEuclideanWspESeminorm (translateCube shift Q) s p F < ∞ + rwa [cubeEuclideanWspESeminorm_translate shift Q s p F] + +/-- Exact covariance of the full normalized Euclidean fractional power norm +under a triadic lattice translation. -/ +theorem cubeEuclideanWspFullENorm_translate {d : ℕ} + (shift : Fin d → ℤ) (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : Vec d → Vec d) : + cubeEuclideanWspFullENorm (translateCube shift Q) s p F = + cubeEuclideanWspFullENorm Q s p + (fun x => F (x + Gagliardo.cubeShiftVector shift Q)) := by + unfold cubeEuclideanWspFullENorm + rw [show cubeEuclideanWspScalePowerWeight (translateCube shift Q) s p = + cubeEuclideanWspScalePowerWeight Q s p by + unfold cubeEuclideanWspScalePowerWeight + rw [cubeScaleFactor_translateCube], + cubeEuclideanNormalizedLpENorm_translate, + cubeEuclideanWspESeminorm_translate] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanComparison.lean new file mode 100644 index 0000000000..698c4d3445 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanComparison.lean @@ -0,0 +1,612 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeEuclideanH2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.EuclideanGagliardoCoordinateBridge + +/-! +# Exact Euclidean overlap Besov--Gagliardo comparison on centered cubes + +This module compares the source-facing Euclidean overlap seminorm with the +literal physical Gagliardo seminorm on every centered triadic cube. The +physical coordinate energy is kept over the physical product measure; scale +uniformity follows because all comparison constants are dimension/order +constants and do not depend on the centered-cube scale. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +namespace CenteredCubeEuclideanL2Field + +/-- The canonical exact-overlap integrability certificate carried by a +Euclidean `L²` field on an arbitrary centered triadic cube. -/ +theorem exactOverlapEuclideanIntegrable {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) : + ExactOverlapEuclideanIntegrable (originCube d m) F := by + apply exactOverlapEuclideanIntegrable_of_euclidean_memLp + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + F.euclideanMemL2 + +end CenteredCubeEuclideanL2Field + +/-- The physical finite-coordinate family of scalar ambient-distance +Gagliardo seminorms, squared before summation. -/ +noncomputable def centeredCubeCoordinateGagliardoEnergy {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + ∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm (originCube d m) s.1 (2 : ℝ≥0∞) + (fun x => F x i)) ^ (2 : ℝ) + +/-- The squared Euclidean numerator is the sum of the squared coordinate +differences on every centered cube. -/ +theorem centeredCubeEuclideanHs_numerator_eq_sum_coordinates {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) (z : Vec d × Vec d) : + ‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 = + ∑ i : Fin d, (F z.1 i - F z.2 i) ^ 2 := by + simpa only [Pi.sub_apply, HilbertVec.ofVec, PiLp.toLp_apply] using + HilbertVec.norm_sq_eq_sum_sq (HilbertVec.ofVec (F z.1 - F z.2)) + +/-- Both physical energies vanish in dimension zero. -/ +theorem centeredCubeEuclideanHsEnergy_zero_dim {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field 0 m) : centeredCubeEuclideanHsEnergy s F = 0 := by + rw [centeredCubeEuclideanHsEnergy_eq_lintegral] + refine (lintegral_congr fun z => ?_).trans lintegral_zero + have hfield : F z.1 = F z.2 := Subsingleton.elim _ _ + simp [hfield] + +/-- The physical coordinate energy vanishes in dimension zero. -/ +theorem centeredCubeCoordinateGagliardoEnergy_zero_dim {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field 0 m) : + centeredCubeCoordinateGagliardoEnergy s F = 0 := by + simp [centeredCubeCoordinateGagliardoEnergy] + +private theorem sq_centeredCube_scalar_cubeGagliardoESeminorm_eq_lintegral + {d : ℕ} {m : ℤ} (s : FractionalOrder) (f : Vec d → ℝ) : + (Gagliardo.cubeGagliardoESeminorm (originCube d m) s.1 (2 : ℝ≥0∞) f) ^ + (2 : ℝ) = + ∫⁻ z, ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) f z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m) := by + rw [Gagliardo.Internal.cubeGagliardoESeminorm_eq_lintegral (by norm_num) (by norm_num)] + rw [← ENNReal.rpow_mul] + norm_num + +private theorem measurable_centeredCube_scalar_gagliardoKernel {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) + (hF : Measurable F) (i : Fin d) : + Measurable (Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i)) := by + unfold Gagliardo.gagliardoKernel + exact (measurable_dist.pow measurable_const).smul + (((continuous_apply i).measurable.comp (hF.comp measurable_fst)).sub + ((continuous_apply i).measurable.comp (hF.comp measurable_snd))) + +private theorem measurable_centeredCube_scalar_gagliardoKernel_enorm_sq + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (hF : Measurable F) (i : Fin d) : + Measurable (fun z => + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) := + (measurable_centeredCube_scalar_gagliardoKernel s F hF i).enorm.pow measurable_const + +/-- The physical coordinate energy is one integral of the finite sum of +scalar kernels for a measurable representative. -/ +private theorem centeredCubeCoordinateGagliardoEnergy_eq_lintegral_sum {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) + (hF : Measurable F) : + centeredCubeCoordinateGagliardoEnergy s F = + ∫⁻ z, ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m) := by + unfold centeredCubeCoordinateGagliardoEnergy + rw [Finset.sum_congr rfl fun i _ => + sq_centeredCube_scalar_cubeGagliardoESeminorm_eq_lintegral s (fun x => F x i)] + rw [← lintegral_finsetSum' Finset.univ] + intro i _ + exact (measurable_centeredCube_scalar_gagliardoKernel_enorm_sq s F hF i).aemeasurable + +private theorem centeredCube_sum_enorm_sq_coordinate_diff_eq_ofReal_numerator + {d : ℕ} {m : ℤ} (F : CenteredCubeEuclideanL2Field d m) + (z : Vec d × Vec d) : + (∑ i : Fin d, ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ)) = + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + rw [centeredCubeEuclideanHs_numerator_eq_sum_coordinates] + rw [ENNReal.ofReal_sum_of_nonneg (fun i _ => sq_nonneg (F z.1 i - F z.2 i))] + apply Finset.sum_congr rfl + intro i _ + norm_num + rw [Real.enorm_eq_ofReal_abs, + ← ENNReal.ofReal_pow (abs_nonneg (F z.1 i - F z.2 i)), sq_abs] + +private theorem centeredCube_sum_scalar_gagliardoKernel_eq_distance_mul_numerator + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (z : Vec d × Vec d) : + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) = + ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + calc + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) = + ∑ i : Fin d, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ) := by + apply Finset.sum_congr rfl + intro i _ + simpa using + Gagliardo.enorm_gagliardoKernel_rpow s.1 + (p := (2 : ℝ≥0∞)) (by norm_num) (by norm_num) (fun x => F x i) z + _ = ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ∑ i : Fin d, ‖F z.1 i - F z.2 i‖ₑ ^ (2 : ℝ) := by + rw [Finset.mul_sum] + _ = ENNReal.ofReal (dist z.1 z.2 ^ (-(s.1 * 2 + (d : ℝ)))) * + ENNReal.ofReal (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2) := by + rw [centeredCube_sum_enorm_sq_coordinate_diff_eq_ofReal_numerator] + +private theorem centeredCubeEuclideanHsIntegrand_le_sum_scalar_gagliardoKernel + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (z : Vec d × Vec d) : + centeredCubeEuclideanHsIntegrand s F z ≤ + ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) := by + rw [centeredCube_sum_scalar_gagliardoKernel_eq_distance_mul_numerator] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * 2 + (d : ℝ) + let A : ℝ := ‖HilbertVec.ofVec (F x - F y)‖ ^ 2 + have ha : 0 < a := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := Nat.cast_nonneg d + dsimp [a] + nlinarith [s.2.1, hd_nonneg] + change ENNReal.ofReal + (A / Real.rpow (euclideanDist x y) ((d : ℝ) + 2 * s.1)) ≤ + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A + rw [show (d : ℝ) + 2 * s.1 = a by simp [a, add_comm, mul_comm]] + by_cases hxy : x = y + · subst y + simp [A] + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hpow : + Real.rpow (euclideanDist x y) (-a) ≤ Real.rpow (dist x y) (-a) := + Real.rpow_le_rpow_of_nonpos hdist (dist_le_euclideanDist x y) (neg_nonpos.mpr ha.le) + have hA : 0 ≤ A := sq_nonneg _ + have hreal : + A / Real.rpow (euclideanDist x y) a ≤ Real.rpow (dist x y) (-a) * A := by + have hneg : + Real.rpow (euclideanDist x y) (-a) = + (Real.rpow (euclideanDist x y) a)⁻¹ := + Real.rpow_neg heuclideanDist.le a + calc + A / Real.rpow (euclideanDist x y) a = + Real.rpow (euclideanDist x y) (-a) * A := by + rw [div_eq_mul_inv, hneg] + ring + _ ≤ Real.rpow (dist x y) (-a) * A := + mul_le_mul_of_nonneg_right hpow hA + calc + ENNReal.ofReal (A / Real.rpow (euclideanDist x y) a) ≤ + ENNReal.ofReal (Real.rpow (dist x y) (-a) * A) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A := by + exact ENNReal.ofReal_mul (Real.rpow_nonneg dist_nonneg (-a)) + +private theorem centeredCube_sum_scalar_gagliardoKernel_le_mul_euclideanHsIntegrand + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (z : Vec d × Vec d) : + (∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ)) ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + centeredCubeEuclideanHsIntegrand s F z := by + rw [centeredCube_sum_scalar_gagliardoKernel_eq_distance_mul_numerator] + rcases z with ⟨x, y⟩ + let a : ℝ := s.1 * 2 + (d : ℝ) + let A : ℝ := ‖HilbertVec.ofVec (F x - F y)‖ ^ 2 + have ha : 0 < a := by + have hd_nonneg : (0 : ℝ) ≤ (d : ℝ) := Nat.cast_nonneg d + dsimp [a] + nlinarith [s.2.1, hd_nonneg] + have hd : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + change ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ENNReal.ofReal (A / Real.rpow (euclideanDist x y) ((d : ℝ) + 2 * s.1)) + rw [show (d : ℝ) + 2 * s.1 = a by simp [a, add_comm, mul_comm]] + by_cases hxy : x = y + · subst y + simp [A] + · have hdist : 0 < dist x y := dist_pos.mpr hxy + have heuclideanDist : 0 < euclideanDist x y := by + apply lt_of_le_of_ne (euclideanDist_nonneg x y) + intro hzero + exact hxy (euclideanDist_eq_zero_iff.mp hzero.symm) + have hdenominator : + Real.rpow (euclideanDist x y) a ≤ + Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := by + calc + Real.rpow (euclideanDist x y) a ≤ + Real.rpow ((d : ℝ) * dist x y) a := + Real.rpow_le_rpow (euclideanDist_nonneg x y) + (euclideanDist_le_dimension_mul_dist x y) ha.le + _ = Real.rpow (d : ℝ) a * Real.rpow (dist x y) a := by + exact Real.mul_rpow hd.le dist_nonneg + have hA : 0 ≤ A := sq_nonneg _ + have hdistPow : 0 < Real.rpow (dist x y) a := + Real.rpow_pos_of_pos hdist a + have heuclideanDistPow : 0 < Real.rpow (euclideanDist x y) a := + Real.rpow_pos_of_pos heuclideanDist a + have hreal : + Real.rpow (dist x y) (-a) * A ≤ + Real.rpow (d : ℝ) a * (A / Real.rpow (euclideanDist x y) a) := by + have hdist_neg : + Real.rpow (dist x y) (-a) = (Real.rpow (dist x y) a)⁻¹ := + Real.rpow_neg hdist.le a + calc + Real.rpow (dist x y) (-a) * A = A / Real.rpow (dist x y) a := by + rw [hdist_neg, div_eq_mul_inv] + ring + _ ≤ (Real.rpow (d : ℝ) a * A) / + Real.rpow (euclideanDist x y) a := by + rw [div_le_div_iff₀ hdistPow heuclideanDistPow] + calc + A * Real.rpow (euclideanDist x y) a ≤ + A * (Real.rpow (d : ℝ) a * Real.rpow (dist x y) a) := + mul_le_mul_of_nonneg_left hdenominator hA + _ = (Real.rpow (d : ℝ) a * A) * Real.rpow (dist x y) a := by + ring + _ = Real.rpow (d : ℝ) a * + (A / Real.rpow (euclideanDist x y) a) := by + ring + calc + ENNReal.ofReal (dist x y ^ (-a)) * ENNReal.ofReal A = + ENNReal.ofReal (Real.rpow (dist x y) (-a) * A) := by + exact (ENNReal.ofReal_mul (Real.rpow_nonneg dist_nonneg (-a))).symm + _ ≤ ENNReal.ofReal + (Real.rpow (d : ℝ) a * (A / Real.rpow (euclideanDist x y) a)) := + ENNReal.ofReal_le_ofReal hreal + _ = ENNReal.ofReal ((d : ℝ) ^ a) * + ENNReal.ofReal (A / Real.rpow (euclideanDist x y) a) := by + exact ENNReal.ofReal_mul (Real.rpow_nonneg hd.le a) + +/-- The physical Euclidean energy is bounded by the physical coordinate +Gagliardo energy, with no scale factor. -/ +private theorem centeredCubeEuclideanHsEnergy_le_coordinateGagliardoEnergy + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (hF : Measurable F) : + centeredCubeEuclideanHsEnergy s F ≤ centeredCubeCoordinateGagliardoEnergy s F := by + rw [centeredCubeEuclideanHsEnergy_eq_lintegral, + centeredCubeEuclideanHsProductMeasure_eq_gagliardoCubeMeasure, + centeredCubeCoordinateGagliardoEnergy_eq_lintegral_sum s F hF] + apply lintegral_mono + intro z + simpa only [centeredCubeEuclideanHsIntegrand] using + centeredCubeEuclideanHsIntegrand_le_sum_scalar_gagliardoKernel s F z + +/-- The physical coordinate Gagliardo energy is bounded by the physical +Euclidean energy with the same explicit metric-comparison factor as on the +unit cube. -/ +private theorem centeredCubeCoordinateGagliardoEnergy_le_mul_euclideanHsEnergy + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (hF : Measurable F) : + centeredCubeCoordinateGagliardoEnergy s F ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + centeredCubeEuclideanHsEnergy s F := by + rw [centeredCubeCoordinateGagliardoEnergy_eq_lintegral_sum s F hF, + centeredCubeEuclideanHsEnergy_eq_lintegral, + centeredCubeEuclideanHsProductMeasure_eq_gagliardoCubeMeasure] + calc + (∫⁻ z, ∑ i : Fin d, + ‖Gagliardo.gagliardoKernel s.1 (2 : ℝ≥0∞) (fun x => F x i) z‖ₑ ^ (2 : ℝ) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m)) ≤ + ∫⁻ z, ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m) := by + apply lintegral_mono + intro z + simpa only [centeredCubeEuclideanHsIntegrand] using + centeredCube_sum_scalar_gagliardoKernel_le_mul_euclideanHsIntegrand s F z + _ = ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + ∫⁻ z, ENNReal.ofReal + (‖HilbertVec.ofVec (F z.1 - F z.2)‖ ^ 2 / + Real.rpow (euclideanDist z.1 z.2) ((d : ℝ) + 2 * s.1)) + ∂Gagliardo.gagliardoCubeMeasure (originCube d m) := by + rw [lintegral_const_mul' _ _ ENNReal.ofReal_ne_top] + +private theorem exactOverlapEuclideanSeminormTwo_sq_eq_sum {d : ℕ} + (s : FractionalOrder) (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : ExactOverlapEuclideanIntegrable Q F) : + (exactOverlapEuclideanSeminormTwo s Q F hF) ^ (2 : ℝ) = + ∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q + (fun x => F x i) (hF.coordinate i)) ^ 2 := by + rw [exactOverlapEuclideanSeminormTwo_eq] + rw [← ENNReal.rpow_mul] + norm_num + +private theorem centeredCube_coordinate_memLp {d : ℕ} {m : ℤ} + (F : CenteredCubeEuclideanL2Field d m) (i : Fin d) : + MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m)) := by + have hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m)) := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + F.euclideanMemL2 + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + +/-- Coordinatewise scalar comparison bounds the squared exact Euclidean +overlap seminorm by the physical coordinate Gagliardo energy. -/ +private theorem exactOverlapEuclideanSeminormTwo_sq_le_mul_coordinateGagliardoEnergy + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (hF : Measurable F) : + (exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable) ^ (2 : ℝ) ≤ + (2 * 3 ^ d : ℝ≥0∞) * centeredCubeCoordinateGagliardoEnergy s F := by + rw [exactOverlapEuclideanSeminormTwo_sq_eq_sum] + unfold centeredCubeCoordinateGagliardoEnergy + calc + (∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) (originCube d m) + (fun x => F x i) (F.exactOverlapEuclideanIntegrable.coordinate i)) ^ 2) ≤ + ∑ i : Fin d, (2 * 3 ^ d : ℝ≥0∞) * + (Gagliardo.cubeGagliardoESeminorm (originCube d m) s.1 (2 : ℝ≥0∞) + (fun x => F x i)) ^ (2 : ℝ) := by + apply Finset.sum_le_sum + intro i _ + simpa only [exactOverlapTwoParameters, exactOverlapScalarTwoParameters, + ENNReal.rpow_two] using + exactOverlapScalarSeminormTwo_sq_le_gagliardo s (originCube d m) + (fun x => F x i) (F.exactOverlapEuclideanIntegrable.coordinate i) + ((measurable_pi_apply i).comp hF) (centeredCube_coordinate_memLp F i) + _ = (2 * 3 ^ d : ℝ≥0∞) * + ∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm (originCube d m) s.1 (2 : ℝ≥0∞) + (fun x => F x i)) ^ (2 : ℝ) := by + rw [Finset.mul_sum] + +/-- The reverse coordinatewise scalar comparison bounds the physical +coordinate Gagliardo energy by the squared exact Euclidean overlap seminorm. -/ +private theorem centeredCubeCoordinateGagliardoEnergy_le_mul_exactOverlapEuclideanSeminormTwo_sq + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) (hF : Measurable F) : + centeredCubeCoordinateGagliardoEnergy s F ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + (exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable) ^ (2 : ℝ) := by + unfold centeredCubeCoordinateGagliardoEnergy + rw [exactOverlapEuclideanSeminormTwo_sq_eq_sum] + calc + (∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm (originCube d m) s.1 (2 : ℝ≥0∞) + (fun x => F x i)) ^ (2 : ℝ)) ≤ + ∑ i : Fin d, (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) (originCube d m) + (fun x => F x i) (F.exactOverlapEuclideanIntegrable.coordinate i)) ^ 2 := by + apply Finset.sum_le_sum + intro i _ + simpa only [exactOverlapTwoParameters, exactOverlapScalarTwoParameters, + ENNReal.rpow_two] using + gagliardo_sq_le_exactOverlapScalarSeminormTwo s (originCube d m) + (fun x => F x i) (F.exactOverlapEuclideanIntegrable.coordinate i) + ((measurable_pi_apply i).comp hF) (centeredCube_coordinate_memLp F i) + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + ∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) (originCube d m) + (fun x => F x i) (F.exactOverlapEuclideanIntegrable.coordinate i)) ^ 2 := by + rw [Finset.mul_sum] + +private theorem centeredCube_ae_eq_measurableRepresentative_on_overlap + {d : ℕ} {m : ℤ} (F : CenteredCubeEuclideanL2Field d m) : + ∀ (j : ℕ) (S : TriadicCube d), + S ∈ ScalarOverlap.centersAtDepth (originCube d m) j → + F =ᵐ[ScalarOverlap.normalizedCubeMeasure S] F.measurableRepresentative := by + have hroot : + F =ᵐ[normalizedCubeMeasure (originCube d m)] F.measurableRepresentative := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + F.ae_eq_measurableRepresentative + intro j S hS + rw [ScalarOverlap.normalizedCubeMeasure_eq_smul_restrict_of_mem_centersAtDepth hS] + have hc : (ENNReal.ofReal (cubeVolume (originCube d m) / ScalarOverlap.cubeVolume S)) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 + (div_pos (cubeVolume_pos (originCube d m)) (ScalarOverlap.cubeVolume_pos S)) + exact (Measure.ae_ennreal_smul_measure_iff hc).2 (ae_restrict_of_ae hroot) + +/-- The exact Euclidean overlap seminorm is unchanged by passage to the +canonical globally measurable representative. -/ +private theorem exactOverlapEuclideanSeminormTwo_eq_measurableRepresentative + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable = + exactOverlapEuclideanSeminormTwo s (originCube d m) F.measurableRepresentative + F.measurableRepresentative.exactOverlapEuclideanIntegrable := by + apply exactOverlapEuclideanSeminormTwo_congr_ae + intro i j S hS + have hvector := centeredCube_ae_eq_measurableRepresentative_on_overlap F j S hS + filter_upwards [hvector] with x hx + rw [hx] + +private theorem ennreal_rpow_two_rpow_half (a : ℝ≥0∞) : + (a ^ (2 : ℝ)) ^ ((2 : ℝ)⁻¹) = a := by + rw [← ENNReal.rpow_mul] + norm_num + +/-- The physical Euclidean Gagliardo seminorm is controlled by the exact +Euclidean overlap seminorm, with no representative or integrability binder. -/ +theorem centeredCubeEuclideanHsESeminorm_le_mul_exactOverlapEuclideanSeminormTwo + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsESeminorm s F ≤ + Gagliardo.gagliardoBesovLowerConstant d * + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := by + let G : CenteredCubeEuclideanL2Field d m := F.measurableRepresentative + let B : ℝ≥0∞ := exactOverlapEuclideanSeminormTwo s (originCube d m) G + G.exactOverlapEuclideanIntegrable + have hGmeas : Measurable G := by + simpa only [G] using F.measurable_measurableRepresentative + have henergy : centeredCubeEuclideanHsEnergy s G ≤ + centeredCubeCoordinateGagliardoEnergy s G := + centeredCubeEuclideanHsEnergy_le_coordinateGagliardoEnergy s G hGmeas + have hcoordinate : centeredCubeCoordinateGagliardoEnergy s G ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * B ^ (2 : ℝ) := by + simpa only [B] using + centeredCubeCoordinateGagliardoEnergy_le_mul_exactOverlapEuclideanSeminormTwo_sq + s G hGmeas + rw [centeredCubeEuclideanHsESeminorm_congr_ae F.ae_eq_measurableRepresentative] + change centeredCubeEuclideanHsEnergy s G ^ ((2 : ℝ)⁻¹) ≤ + Gagliardo.gagliardoBesovLowerConstant d * + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable + calc + centeredCubeEuclideanHsEnergy s G ^ ((2 : ℝ)⁻¹) ≤ + centeredCubeCoordinateGagliardoEnergy s G ^ ((2 : ℝ)⁻¹) := by + exact ENNReal.rpow_le_rpow henergy (by norm_num) + _ ≤ ((Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + B ^ (2 : ℝ)) ^ ((2 : ℝ)⁻¹) := by + exact ENNReal.rpow_le_rpow hcoordinate (by norm_num) + _ = Gagliardo.gagliardoBesovLowerConstant d * B := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by norm_num), + ennreal_rpow_two_rpow_half, ennreal_rpow_two_rpow_half] + _ = Gagliardo.gagliardoBesovLowerConstant d * + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := by + rw [exactOverlapEuclideanSeminormTwo_eq_measurableRepresentative] + +/-- The exact Euclidean overlap seminorm is controlled by the physical +Euclidean Gagliardo seminorm. The explicit constant contains both the scalar +overlap factor and the Euclidean/product-metric factor. -/ +theorem exactOverlapEuclideanSeminormTwo_le_mul_centeredCubeEuclideanHsESeminorm + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + ((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹) * + centeredCubeEuclideanHsESeminorm s F := by + let G : CenteredCubeEuclideanL2Field d m := F.measurableRepresentative + let B : ℝ≥0∞ := exactOverlapEuclideanSeminormTwo s (originCube d m) G + G.exactOverlapEuclideanIntegrable + let K : ℝ≥0∞ := (2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) + have hGmeas : Measurable G := by + simpa only [G] using F.measurable_measurableRepresentative + have hoverlap : B ^ (2 : ℝ) ≤ + (2 * 3 ^ d : ℝ≥0∞) * centeredCubeCoordinateGagliardoEnergy s G := by + simpa only [B] using + exactOverlapEuclideanSeminormTwo_sq_le_mul_coordinateGagliardoEnergy + s G hGmeas + have hmetric : centeredCubeCoordinateGagliardoEnergy s G ≤ + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + centeredCubeEuclideanHsEnergy s G := + centeredCubeCoordinateGagliardoEnergy_le_mul_euclideanHsEnergy + s G hGmeas + have hsq : B ^ (2 : ℝ) ≤ K * centeredCubeEuclideanHsEnergy s G := by + calc + B ^ (2 : ℝ) ≤ + (2 * 3 ^ d : ℝ≥0∞) * centeredCubeCoordinateGagliardoEnergy s G := hoverlap + _ ≤ (2 * 3 ^ d : ℝ≥0∞) * + (ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1)) * + centeredCubeEuclideanHsEnergy s G) := by + gcongr + _ = K * centeredCubeEuclideanHsEnergy s G := by + simp only [K] + ring + rw [exactOverlapEuclideanSeminormTwo_eq_measurableRepresentative] + change B ≤ K ^ ((2 : ℝ)⁻¹) * centeredCubeEuclideanHsESeminorm s F + calc + B = (B ^ (2 : ℝ)) ^ ((2 : ℝ)⁻¹) := + (ennreal_rpow_two_rpow_half B).symm + _ ≤ (K * centeredCubeEuclideanHsEnergy s G) ^ ((2 : ℝ)⁻¹) := by + exact ENNReal.rpow_le_rpow hsq (by norm_num) + _ = K ^ ((2 : ℝ)⁻¹) * + centeredCubeEuclideanHsEnergy s G ^ ((2 : ℝ)⁻¹) := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by norm_num)] + _ = K ^ ((2 : ℝ)⁻¹) * centeredCubeEuclideanHsESeminorm s F := by + rw [centeredCubeEuclideanHsESeminorm_congr_ae F.ae_eq_measurableRepresentative] + rfl + +/-- One scale-independent constant for both directions of the physical +Euclidean Gagliardo/exact-overlap comparison. -/ +noncomputable def centeredCubeExactOverlapEuclideanComparisonConstant + (d : ℕ) (s : FractionalOrder) : ℝ≥0∞ := + max (Gagliardo.gagliardoBesovLowerConstant d) + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹)) + +/-- The common physical comparison constant is finite. -/ +theorem centeredCubeExactOverlapEuclideanComparisonConstant_lt_top + (d : ℕ) (s : FractionalOrder) : + centeredCubeExactOverlapEuclideanComparisonConstant d s < ∞ := by + unfold centeredCubeExactOverlapEuclideanComparisonConstant + rw [max_lt_iff] + constructor + · rw [Gagliardo.gagliardoBesovLowerConstant] + exact lt_top_iff_ne_top.2 (by finiteness) + · apply ENNReal.rpow_lt_top_of_nonneg (by norm_num) + exact ENNReal.mul_ne_top (by finiteness) ENNReal.ofReal_ne_top + +/-- Uniform source-facing equivalence between the exact physical Euclidean +Gagliardo seminorm and the exact Euclidean overlap Besov seminorm on every +centered triadic cube. The finite constant is chosen before the scale and +field, and all measurability, `L²`, representative, and scalar-comparison +obligations are discharged internally. -/ +theorem exists_centeredCubeEuclideanHs_exactOverlapEuclideanSeminormTwo_comparison + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (F : CenteredCubeEuclideanL2Field d m), + centeredCubeEuclideanHsESeminorm s F ≤ + C * exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable ∧ + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + C * centeredCubeEuclideanHsESeminorm s F := by + let C := centeredCubeExactOverlapEuclideanComparisonConstant d s + refine ⟨C, centeredCubeExactOverlapEuclideanComparisonConstant_lt_top d s, ?_⟩ + intro m F + constructor + · calc + centeredCubeEuclideanHsESeminorm s F ≤ + Gagliardo.gagliardoBesovLowerConstant d * + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := + centeredCubeEuclideanHsESeminorm_le_mul_exactOverlapEuclideanSeminormTwo s F + _ ≤ C * exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := by + exact mul_le_mul_left + (le_max_left (Gagliardo.gagliardoBesovLowerConstant d) + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹))) _ + · calc + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹)) * + centeredCubeEuclideanHsESeminorm s F := + exactOverlapEuclideanSeminormTwo_le_mul_centeredCubeEuclideanHsESeminorm s F + _ ≤ C * centeredCubeEuclideanHsESeminorm s F := by + exact mul_le_mul_left + (le_max_right (Gagliardo.gagliardoBesovLowerConstant d) + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹))) _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanFullComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanFullComparison.lean new file mode 100644 index 0000000000..3aa8d84235 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanFullComparison.lean @@ -0,0 +1,283 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.CenteredCubeHsRegularity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanPoincare + +/-! +# Exact Euclidean overlap full-norm comparison on centered cubes + +This module compares the source-facing exact overlap `B^s_{2,2}` full norm +with the approved physical Euclidean `H^s` full norm on every centered +triadic cube. Both objects use their canonical `L²` certificates, so the +public API has no integrability, measurability, or certificate binder. + +## Main definitions + +- `centeredCubeExactOverlapEuclideanSeminormTwo`: the canonical physical + exact-overlap seminorm. +- `centeredCubeExactOverlapEuclideanNormTwo`: the canonical physical + exact-overlap full norm. + +## Main results + +- `centeredCubeExactOverlapEuclideanRootMeanENorm_le_normalizedEuclideanLpENorm`: + the Euclidean root mean is bounded by the normalized Euclidean `L²` norm. +- `exists_centeredCubeEuclideanHs_exactOverlapEuclideanNormTwo_comparison`: + one finite constant, fixed before scale and field, controls both full-norm + comparison directions. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +/-- The canonical exact Euclidean overlap seminorm on a centered cube. -/ +noncomputable def centeredCubeExactOverlapEuclideanSeminormTwo {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable + +/-- The canonical exact Euclidean overlap full norm on a centered cube. -/ +noncomputable def centeredCubeExactOverlapEuclideanNormTwo {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : ℝ≥0∞ := + exactOverlapEuclideanNormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable + +/-- Evaluation of the canonical exact Euclidean overlap seminorm. -/ +theorem centeredCubeExactOverlapEuclideanSeminormTwo_eq {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeExactOverlapEuclideanSeminormTwo s F = + exactOverlapEuclideanSeminormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := + rfl + +/-- Evaluation of the canonical exact Euclidean overlap full norm. -/ +theorem centeredCubeExactOverlapEuclideanNormTwo_eq {d : ℕ} {m : ℤ} + (s : FractionalOrder) (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeExactOverlapEuclideanNormTwo s F = + exactOverlapEuclideanNormTwo s (originCube d m) F + F.exactOverlapEuclideanIntegrable := + rfl + +/-- The Euclidean magnitude of the normalized root mean is bounded by the +normalized Euclidean `L²` norm carried by the centered-cube field. -/ +theorem centeredCubeExactOverlapEuclideanRootMeanENorm_le_normalizedEuclideanLpENorm + {d : ℕ} {m : ℤ} (F : CenteredCubeEuclideanL2Field d m) : + exactOverlapEuclideanRootMeanENorm (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + (centeredCubeDomain d m).normalizedEuclideanLpENorm (2 : ℝ≥0∞) F := by + let μ := normalizedCubeMeasure (originCube d m) + have hmem : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ := by + simpa only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + F.euclideanMemL2 + let : IsProbabilityMeasure μ := ⟨by simp [μ]⟩ + have hintegrable : Integrable (fun x => HilbertVec.ofVec (F x)) μ := + (hmem.mono_exponent (show (1 : ℝ≥0∞) ≤ 2 by norm_num)).integrable (by norm_num) + have hmean : + (fun i => exactOverlapRootMean (originCube d m) (fun x => F x i) + (F.exactOverlapEuclideanIntegrable.coordinate i).root) = + (∫ x, HilbertVec.ofVec (F x) ∂μ).toVec := by + funext i + unfold exactOverlapRootMean + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + (eval_integral_piLp (fun j => hintegrable.eval_piLp j) i).symm + calc + exactOverlapEuclideanRootMeanENorm (originCube d m) F + F.exactOverlapEuclideanIntegrable = + ‖∫ x, HilbertVec.ofVec (F x) ∂μ‖ₑ := by + rw [exactOverlapEuclideanRootMeanENorm_eq_ofReal_euclideanNorm, hmean, + euclideanNorm_eq_norm_ofVec, HilbertVec.ofVec_toVec, ofReal_norm] + _ ≤ ∫⁻ x, ‖HilbertVec.ofVec (F x)‖ₑ ∂μ := + enorm_integral_le_lintegral_enorm _ + _ = eLpNorm (fun x => HilbertVec.ofVec (F x)) 1 μ := by + rw [eLpNorm_one_eq_lintegral_enorm] + _ ≤ eLpNorm (fun x => HilbertVec.ofVec (F x)) 2 μ := + eLpNorm_le_eLpNorm_of_exponent_le (by norm_num) hmem.aestronglyMeasurable + _ = (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F := by + simp only [μ, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm] + +/-- The root-weighted normalized Euclidean `L²` norm is controlled by the +canonical exact-overlap full norm on every centered cube. -/ +theorem centeredCubeRootWeight_mul_normalizedEuclideanLpENorm_le_exactOverlapNormTwo + {d : ℕ} {m : ℤ} (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F ≤ + centeredCubeExactOverlapEuclideanNormTwo s F := by + have hmem : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d m)) := by + simpa only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] using + F.euclideanMemL2 + have h := exactOverlapRootWeight_mul_eLpNorm_le_exactOverlapEuclideanNormTwo + s (originCube d m) F hmem + simpa only [centeredCubeExactOverlapEuclideanNormTwo, + centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, euclideanNorm_eq_norm_ofVec, + eLpNorm_norm] using h + +/-- One scale-independent constant for both directions of the exact-overlap +and physical Euclidean fractional full-norm comparison. -/ +noncomputable def centeredCubeExactOverlapEuclideanFullComparisonConstant + (d : ℕ) (s : FractionalOrder) : ℝ≥0∞ := + 1 + centeredCubeExactOverlapEuclideanComparisonConstant d s + +/-- The common exact-overlap/physical full-norm comparison constant is finite. -/ +theorem centeredCubeExactOverlapEuclideanFullComparisonConstant_lt_top + (d : ℕ) (s : FractionalOrder) : + centeredCubeExactOverlapEuclideanFullComparisonConstant d s < ∞ := by + unfold centeredCubeExactOverlapEuclideanFullComparisonConstant + exact ENNReal.add_lt_top.2 + ⟨ENNReal.one_lt_top, + centeredCubeExactOverlapEuclideanComparisonConstant_lt_top d s⟩ + +/-- The exact-overlap Euclidean full norm is bounded by the approved physical +Euclidean fractional full norm, uniformly in the centered-cube scale. -/ +theorem centeredCubeExactOverlapEuclideanNormTwo_le_mul_centeredCubeEuclideanHsFullENorm + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeExactOverlapEuclideanNormTwo s F ≤ + centeredCubeExactOverlapEuclideanFullComparisonConstant d s * + centeredCubeEuclideanHsFullENorm s F := by + let K := centeredCubeExactOverlapEuclideanComparisonConstant d s + let C := centeredCubeExactOverlapEuclideanFullComparisonConstant d s + have hseminorm : centeredCubeExactOverlapEuclideanSeminormTwo s F ≤ + K * centeredCubeEuclideanHsESeminorm s F := by + calc + centeredCubeExactOverlapEuclideanSeminormTwo s F ≤ + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹)) * + centeredCubeEuclideanHsESeminorm s F := + exactOverlapEuclideanSeminormTwo_le_mul_centeredCubeEuclideanHsESeminorm s F + _ ≤ K * centeredCubeEuclideanHsESeminorm s F := by + exact mul_le_mul_left + (le_max_right (Gagliardo.gagliardoBesovLowerConstant d) + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹))) _ + have hmean := + centeredCubeExactOverlapEuclideanRootMeanENorm_le_normalizedEuclideanLpENorm F + have hKleC : K ≤ C := by + exact le_add_of_nonneg_left (zero_le : (0 : ℝ≥0∞) ≤ 1) + have honeleC : 1 ≤ C := by + exact le_add_of_nonneg_right (zero_le : (0 : ℝ≥0∞) ≤ K) + rw [centeredCubeExactOverlapEuclideanNormTwo_eq, exactOverlapEuclideanNormTwo_eq, + centeredCubeEuclideanHsFullENorm_eq] + change centeredCubeExactOverlapEuclideanSeminormTwo s F + + exactOverlapRootWeight (originCube d m) s.1 * + exactOverlapEuclideanRootMeanENorm (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + C * (exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F + + centeredCubeEuclideanHsESeminorm s F) + calc + centeredCubeExactOverlapEuclideanSeminormTwo s F + + exactOverlapRootWeight (originCube d m) s.1 * + exactOverlapEuclideanRootMeanENorm (originCube d m) F + F.exactOverlapEuclideanIntegrable ≤ + K * centeredCubeEuclideanHsESeminorm s F + + exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F := by + exact add_le_add hseminorm (mul_le_mul_right hmean _) + _ ≤ C * centeredCubeEuclideanHsESeminorm s F + + C * (exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F) := by + exact add_le_add (mul_le_mul_left hKleC _) + (by + simpa only [one_mul] using + (mul_le_mul_left honeleC + (exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F))) + _ = C * (exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F + + centeredCubeEuclideanHsESeminorm s F) := by + simp only [C, centeredCubeExactOverlapEuclideanFullComparisonConstant] + ring + +/-- The approved physical Euclidean fractional full norm is bounded by the +exact-overlap Euclidean full norm, uniformly in the centered-cube scale. -/ +theorem centeredCubeEuclideanHsFullENorm_le_mul_centeredCubeExactOverlapEuclideanNormTwo + {d : ℕ} {m : ℤ} [NeZero d] (s : FractionalOrder) + (F : CenteredCubeEuclideanL2Field d m) : + centeredCubeEuclideanHsFullENorm s F ≤ + centeredCubeExactOverlapEuclideanFullComparisonConstant d s * + centeredCubeExactOverlapEuclideanNormTwo s F := by + let K := centeredCubeExactOverlapEuclideanComparisonConstant d s + let C := centeredCubeExactOverlapEuclideanFullComparisonConstant d s + have hseminorm : centeredCubeEuclideanHsESeminorm s F ≤ + K * centeredCubeExactOverlapEuclideanSeminormTwo s F := by + calc + centeredCubeEuclideanHsESeminorm s F ≤ + Gagliardo.gagliardoBesovLowerConstant d * + centeredCubeExactOverlapEuclideanSeminormTwo s F := + centeredCubeEuclideanHsESeminorm_le_mul_exactOverlapEuclideanSeminormTwo s F + _ ≤ K * centeredCubeExactOverlapEuclideanSeminormTwo s F := by + exact mul_le_mul_left + (le_max_left (Gagliardo.gagliardoBesovLowerConstant d) + (((2 * 3 ^ d : ℝ≥0∞) * + ENNReal.ofReal ((d : ℝ) ^ ((d : ℝ) + 2 * s.1))) ^ ((2 : ℝ)⁻¹))) _ + have hroot := + centeredCubeRootWeight_mul_normalizedEuclideanLpENorm_le_exactOverlapNormTwo + s F + have hseminorm_le_full : centeredCubeExactOverlapEuclideanSeminormTwo s F ≤ + centeredCubeExactOverlapEuclideanNormTwo s F := by + rw [centeredCubeExactOverlapEuclideanNormTwo_eq, exactOverlapEuclideanNormTwo_eq] + exact le_add_right le_rfl + rw [centeredCubeEuclideanHsFullENorm_eq] + change exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F + + centeredCubeEuclideanHsESeminorm s F ≤ + C * centeredCubeExactOverlapEuclideanNormTwo s F + calc + exactOverlapRootWeight (originCube d m) s.1 * + (centeredCubeDomain d m).normalizedEuclideanLpENorm 2 F + + centeredCubeEuclideanHsESeminorm s F ≤ + centeredCubeExactOverlapEuclideanNormTwo s F + + K * centeredCubeExactOverlapEuclideanNormTwo s F := by + exact add_le_add hroot + (hseminorm.trans (mul_le_mul_right hseminorm_le_full K)) + _ = C * centeredCubeExactOverlapEuclideanNormTwo s F := by + simp only [C, centeredCubeExactOverlapEuclideanFullComparisonConstant] + ring + +/-- Uniform source-facing equivalence between the exact-overlap Euclidean +`B^s_{2,2}` full norm and the approved physical Euclidean `H^s` full norm on +every centered triadic cube. The finite constant is chosen before scale and +field, and all integrability and comparison obligations are internal. -/ +theorem exists_centeredCubeEuclideanHs_exactOverlapEuclideanNormTwo_comparison + (d : ℕ) [NeZero d] (s : FractionalOrder) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (F : CenteredCubeEuclideanL2Field d m), + centeredCubeExactOverlapEuclideanNormTwo s F ≤ + C * centeredCubeEuclideanHsFullENorm s F ∧ + centeredCubeEuclideanHsFullENorm s F ≤ + C * centeredCubeExactOverlapEuclideanNormTwo s F := by + refine ⟨centeredCubeExactOverlapEuclideanFullComparisonConstant d s, + centeredCubeExactOverlapEuclideanFullComparisonConstant_lt_top d s, ?_⟩ + intro m F + exact ⟨centeredCubeExactOverlapEuclideanNormTwo_le_mul_centeredCubeEuclideanHsFullENorm + s F, + centeredCubeEuclideanHsFullENorm_le_mul_centeredCubeExactOverlapEuclideanNormTwo + s F⟩ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpComparison.lean new file mode 100644 index 0000000000..ab991b6707 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpComparison.lean @@ -0,0 +1,1163 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclideanLpCoordinateBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanGagliardoCoordinateBridgeP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapScalarPComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.EuclideanWspCongruence + +/-! +# Finite-`p` direct Euclidean overlap versus fractional Sobolev seminorm + +This is the source-facing comparison for the canonical vector-valued overlap +seminorm. The proof keeps its direct Euclidean local oscillations intact and +uses scalar coordinates only internally. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem finiteLpExponent_toReal_pos (p : FiniteLpExponent) : + 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + +/-- The globally measurable representative selected from a direct Euclidean +`L^p` field. It is used internally to discharge scalar real-variable +measurability conditions, while source-facing statements retain the original +field carrier. -/ +noncomputable def CubeEuclideanLpField.measurableRepresentative {d : ℕ} + {Q : TriadicCube d} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q p) : CubeEuclideanLpField Q p := + let f : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (F x) + let hf : AEStronglyMeasurable f (normalizedCubeMeasure Q) := + F.euclideanMemLp.aestronglyMeasurable + { toField := fun x => HilbertVec.toVec (AEStronglyMeasurable.mk f hf x) + euclideanMemLp := by + simpa only [HilbertVec.ofVec_toVec] using F.euclideanMemLp.ae_eq hf.ae_eq_mk } + +theorem CubeEuclideanLpField.measurable_measurableRepresentative {d : ℕ} + {Q : TriadicCube d} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q p) : Measurable F.measurableRepresentative := by + let : MeasurableSpace (HilbertVec d) := borel (HilbertVec d) + let : BorelSpace (HilbertVec d) := ⟨rfl⟩ + unfold measurableRepresentative + dsimp only + exact (HilbertVec.continuousLinearEquivVec d).continuous.measurable.comp + F.euclideanMemLp.aestronglyMeasurable.measurable_mk + +theorem CubeEuclideanLpField.ae_eq_measurableRepresentative {d : ℕ} + {Q : TriadicCube d} {p : FiniteLpExponent} + (F : CubeEuclideanLpField Q p) : + F =ᵐ[normalizedCubeMeasure Q] F.measurableRepresentative := by + unfold measurableRepresentative + dsimp only + filter_upwards [F.euclideanMemLp.aestronglyMeasurable.ae_eq_mk] with x hx + simpa only [HilbertVec.toVec_ofVec] using congrArg HilbertVec.toVec hx + +private theorem cubeScaleFactor_div_pow_eq_sourceZPow_vectorP {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeScaleFactor Q / (3 : ℝ) ^ j = (3 : ℝ) ^ (Q.scale - (j : ℤ)) := by + unfold cubeScaleFactor + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + +private theorem exactOverlapDepthWeight_rpow_eq_directWeight {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (j : ℕ) : + (exactOverlapDepthWeight Q s.1 j) ^ p.exponent.toReal = + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) := by + unfold exactOverlapDepthWeight exactOverlapSourceDepth + rw [← ENNReal.rpow_mul] + have hthree : (3 : ℝ≥0∞) = ENNReal.ofReal (3 : ℝ) := by norm_num + rw [hthree] + rw [ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + congr 1 + let r : ℝ := ((Q.scale - (j : ℤ) : ℤ) : ℝ) + change ((3 : ℝ) ^ (-r * s.1 * p.exponent.toReal)) = + Real.rpow 3 (-(s.1 * p.exponent.toReal * r)) + have hexp : -r * s.1 * p.exponent.toReal = + -(s.1 * p.exponent.toReal * r) := by ring + rw [hexp] + rfl + +/-- The direct vector overlap series before its outer finite-`p` root. -/ +noncomputable def cubeEuclideanPositiveBesovOverlapPowerEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := by + classical + exact ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) + +/-- The canonical direct overlap seminorm to the exact finite `p` power is +its complete source scale series. -/ +theorem cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ + p.exponent.toReal = + cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F := by + rw [cubeEuclideanPositiveBesovOverlapESeminorm_eq] + unfold cubeEuclideanPositiveBesovOverlapPowerEnergy + rw [one_div] + change ((∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal)) ^ (p.exponent.toReal)⁻¹) ^ + p.exponent.toReal = _ + exact ENNReal.rpow_inv_rpow (finiteLpExponent_toReal_pos p).ne' _ + +private theorem cubeAverageVec_congr_ae {d : ℕ} {Q : TriadicCube d} + {F G : Vec d → Vec d} {j : ℕ} {S : TriadicCube d} + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + ScalarOverlap.cubeAverageVec S F = ScalarOverlap.cubeAverageVec S G := by + funext i + apply Gagliardo.overlap_cubeAverage_congr_ae hS + apply Gagliardo.ae_normalizedCubeMeasure_iff.mp + filter_upwards [hFG] with x hx + exact congrFun hx i + +private theorem euclideanOverlapLocalENorm_congr_ae {d : ℕ} {Q : TriadicCube d} + (p : FiniteLpExponent) {F G : Vec d → Vec d} {j : ℕ} {S : TriadicCube d} + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) = + eLpNorm (fun x => HilbertVec.ofVec (G x - ScalarOverlap.cubeAverageVec S G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + apply eLpNorm_congr_ae + have hcube : F =ᵐ[cubeMeasure Q] G := + Gagliardo.ae_normalizedCubeMeasure_iff.mp hFG + have hres : F =ᵐ[MeasureTheory.volume.restrict (ScalarOverlap.cubeSet S)] G := by + have hsub : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + rw [cubeMeasure] at hcube + exact ae_restrict_of_ae_restrict_of_subset hsub hcube + have hlocal : F =ᵐ[ScalarOverlap.normalizedCubeMeasure S] G := by + rw [ScalarOverlap.normalizedCubeMeasure, ScalarOverlap.cubeMeasure] + exact Measure.ae_smul_measure hres _ + have havg := cubeAverageVec_congr_ae hS hFG + filter_upwards [hlocal] with x hx + rw [hx, havg] + +/-- The direct canonical Euclidean overlap seminorm is invariant under an +almost-everywhere change on its parent cube. -/ +theorem cubeEuclideanPositiveBesovOverlapESeminorm_congr_ae {d : ℕ} + {Q : TriadicCube d} {s : FractionalOrder} {p : FiniteLpExponent} + {F G : Vec d → Vec d} (hFG : F =ᵐ[normalizedCubeMeasure Q] G) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F = + cubeEuclideanPositiveBesovOverlapESeminorm Q s p G := by + rw [cubeEuclideanPositiveBesovOverlapESeminorm_eq, + cubeEuclideanPositiveBesovOverlapESeminorm_eq] + refine congrArg (· ^ (1 / p.exponent.toReal)) ?_ + refine tsum_congr fun j => ?_ + refine congrArg (HMul.hMul _) ?_ + refine Finset.sum_congr rfl fun S _ => ?_ + rw [euclideanOverlapLocalENorm_congr_ae p S.2 hFG] + +private theorem exactOverlapScalarPIntegrableOfEuclideanField {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) + (i : Fin d) : ExactOverlapIntegrable Q (fun x => F x i) where + root := (cubeEuclideanLp_coordinate_memLp F i).integrable p.one_lt.le + overlap := fun _ _ hS => + (Gagliardo.memLp_overlap_of_memLp (cubeEuclideanLp_coordinate_memLp F i) hS).integrable + p.one_lt.le + +/-- The finite sum of exact scalar overlap `p`-energies of the Euclidean +coordinates. This is an internal aggregation device, not an additional +source-facing seminorm. -/ +noncomputable def cubeEuclideanCoordinateExactOverlapPowerEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) : ℝ≥0∞ := + ∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal + +/-- The coordinate overlap series with the scale and center sums still +explicit. -/ +noncomputable def cubeEuclideanCoordinateOverlapPowerEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) : ℝ≥0∞ := by + classical + exact ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + ∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S.1 (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) + +private theorem exactScalarOverlapP_rpow_eq_coordinateSeries {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) (i : Fin d) : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal = + ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S.1 (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) := by + rw [exactOverlapScalarPSeminorm_rpow_eq_tsum_depthEnergy] + apply tsum_congr + intro j + rw [exactOverlapDepthWeight_rpow_eq_directWeight] + unfold exactOverlapDepthAverage + have hsum : + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal p.exponent.toReal) + (fun x => F x i) + ((exactOverlapScalarPIntegrableOfEuclideanField Q p F i).overlap j S.1 S.2)) ^ + p.exponent.toReal) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S.1 (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) := by + apply Finset.sum_congr rfl + intro S _ + rw [exactOverlapLocalOscillation_eq] + have hmean : + exactOverlapLocalMean S.1 (fun x => F x i) + ((exactOverlapScalarPIntegrableOfEuclideanField Q p F i).overlap j S.1 S.2) = + ScalarOverlap.cubeAverage S.1 (fun x => F x i) := by + rw [exactOverlapLocalMean_eq, + ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + rw [hmean] + congr + exact ENNReal.ofReal_toReal p.lt_top.ne + dsimp only + rw [hsum] + ring + +/-- Reordering the nonnegative depth and coordinate sums identifies the +explicit coordinate series with the sum of exact scalar overlap energies. -/ +theorem cubeEuclideanCoordinateOverlapPowerEnergy_eq_exact {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) : + cubeEuclideanCoordinateOverlapPowerEnergy Q s p F = + cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F := by + unfold cubeEuclideanCoordinateOverlapPowerEnergy + cubeEuclideanCoordinateExactOverlapPowerEnergy + let w : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ + let L : ℕ → TriadicCube d → Fin d → ℝ≥0∞ := fun j S i => + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + have hswap : ∀ j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => ∑ i, L j S.1 i) = + ∑ i : Fin d, w j * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => L j S.1 i) := by + intro j + rw [Finset.sum_comm] + rw [← Finset.mul_sum] + change (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => ∑ i, L j S.1 i)) = _ + calc + (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => ∑ i, L j S.1 i)) = + ∑' j : ℕ, ∑ i : Fin d, w j * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => L j S.1 i) := by + apply tsum_congr + exact hswap + _ = ∑' j : ℕ, ∑' i : Fin d, w j * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => L j S.1 i) := by + apply tsum_congr + intro j + rw [tsum_fintype] + _ = ∑' i : Fin d, ∑' j : ℕ, w j * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => L j S.1 i) := + ENNReal.tsum_comm + _ = ∑ i : Fin d, ∑' j : ℕ, w j * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => L j S.1 i) := by + rw [tsum_fintype] + _ = ∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal := by + apply Finset.sum_congr rfl + intro i _ + symm + exact exactScalarOverlapP_rpow_eq_coordinateSeries Q s p F i + +private theorem coordinate_overlap_local_power_le_dimension_mul_vector + {d : ℕ} (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) : + (∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal) ≤ + (d : ℝ≥0∞) * + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := by + calc + (∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal) = + ∑ i : Fin d, + (eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := by + apply Finset.sum_congr rfl + intro i _ + rw [← scalarOverlap_eLpNorm_eq_coordinate_euclideanOverlapResidual] + _ ≤ (d : ℝ≥0∞) * + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := + sum_coordinate_eLpNorm_rpow_le_dimension_mul + (ScalarOverlap.normalizedCubeMeasure S) p + (fun x => F x - ScalarOverlap.cubeAverageVec S F) + +private theorem vector_overlap_local_power_le_coordinate_mul + {d : ℕ} (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) + (hF : Measurable F) : + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal ≤ + cubeCoordinateGagliardoComparisonConstant d p * + ∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := by + have hcoord : ∀ i : Fin d, + AEStronglyMeasurable + (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + (ScalarOverlap.normalizedCubeMeasure S) := by + intro i + exact (((measurable_pi_apply i).comp hF).sub measurable_const).aestronglyMeasurable + have hvector := euclidean_eLpNorm_rpow_le_dimension_rpow_mul_sum_rpow + (ScalarOverlap.normalizedCubeMeasure S) p + (fun x => F x - ScalarOverlap.cubeAverageVec S F) hcoord + have hpower := finiteLpExponent_rpow_sum_le_card_rpow_mul_sum_rpow + (fun i : Fin d => + eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) p + calc + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal ≤ + ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + (∑ i : Fin d, + eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := + hvector + _ ≤ ‖(d : ℝ)‖ₑ ^ p.exponent.toReal * + ((d : ℝ≥0∞) ^ (p.exponent.toReal - 1) * + ∑ i : Fin d, + (eLpNorm (fun x => (F x - ScalarOverlap.cubeAverageVec S F) i) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal) := by + exact mul_le_mul_right (by simpa only [Fintype.card_fin] using hpower) _ + _ = cubeCoordinateGagliardoComparisonConstant d p * + ∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal := by + rw [cubeCoordinateGagliardoComparisonConstant] + rw [mul_assoc] + congr 1 + +/-- Aggregating the coordinate lower bound over centers and all scales. -/ +theorem cubeEuclideanCoordinateOverlapPowerEnergy_le_dimension_mul_overlap + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) : + cubeEuclideanCoordinateOverlapPowerEnergy Q s p F ≤ + (d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F := by + let w : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ + let C : ℕ → TriadicCube d → ℝ≥0∞ := fun j S => + ∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + let V : ℕ → TriadicCube d → ℝ≥0∞ := fun _ S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + have hcenter : ∀ j : ℕ, + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) ≤ + (d : ℝ≥0∞) * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) := by + intro j + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) ≤ + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (d : ℝ≥0∞) * V j S.1) := by + apply Finset.sum_le_sum + intro S _ + exact coordinate_overlap_local_power_le_dimension_mul_vector S.1 p F + _ = (d : ℝ≥0∞) * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) := by + rw [← Finset.mul_sum] + change (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1)) ≤ + (d : ℝ≥0∞) * ∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) + calc + (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1)) ≤ + ∑' j : ℕ, (d : ℝ≥0∞) * + (w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1)) := by + apply ENNReal.tsum_le_tsum + intro j + calc + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) ≤ + w j * ((d : ℝ≥0∞) * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1)) := + mul_le_mul_right (hcenter j) _ + _ = (d : ℝ≥0∞) * + (w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1)) := by + ring + _ = (d : ℝ≥0∞) * ∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) := + ENNReal.tsum_mul_left + +/-- One scalar exact-overlap seminorm is controlled by the direct Euclidean +overlap seminorm. This is the coordinate extraction needed when a scalar +positive test is assembled from a Euclidean fractional-Sobolev field. -/ +theorem exactOverlapScalarPSeminorm_le_dimension_mul_cubeEuclideanOverlap + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (i : Fin d) + (hF : ExactOverlapIntegrable Q (fun x => F x i)) : + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hF ≤ + (d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + let hcanonical := exactOverlapScalarPIntegrableOfEuclideanField Q p F i + have hcongr : + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hF = + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical := by + apply exactOverlapFiniteSeminorm_congr_ae + intro _ _ _ + exact Filter.Eventually.of_forall fun _ => rfl + have hterm : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical) ^ p.exponent.toReal ≤ + cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F := by + unfold cubeEuclideanCoordinateExactOverlapPowerEnergy + exact Finset.single_le_sum + (fun k _ => (zero_le : (0 : ℝ≥0∞) ≤ + ((exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x k) + (exactOverlapScalarPIntegrableOfEuclideanField Q p F k)) ^ + p.exponent.toReal))) + (Finset.mem_univ i) + have hpower : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical) ^ p.exponent.toReal ≤ + (d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ + p.exponent.toReal := by + calc + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical) ^ p.exponent.toReal ≤ + cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F := hterm + _ = cubeEuclideanCoordinateOverlapPowerEnergy Q s p F := by + rw [cubeEuclideanCoordinateOverlapPowerEnergy_eq_exact] + _ ≤ (d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ + p.exponent.toReal := by + rw [cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy] + exact cubeEuclideanCoordinateOverlapPowerEnergy_le_dimension_mul_overlap + Q s p F + have hp : 0 < p.exponent.toReal := + ENNReal.toReal_pos (ne_of_gt (lt_trans zero_lt_one p.one_lt)) p.lt_top.ne + have hroot := ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr hp.le) + have hd : 1 ≤ (d : ℝ≥0∞) := by + exact_mod_cast Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero (NeZero.ne d)) + have hinv : (p.exponent.toReal)⁻¹ ≤ 1 := by + apply inv_le_one_of_one_le₀ + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_le_toReal (by norm_num) p.lt_top.ne).mpr p.one_lt.le + have hdimension : (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ ≤ (d : ℝ≥0∞) := by + simpa only [ENNReal.rpow_one] using + ENNReal.rpow_le_rpow_of_exponent_le hd hinv + rw [← hcongr] + calc + exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hF = + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical) ^ + (p.exponent.toReal * (p.exponent.toReal)⁻¹) := by + rw [mul_inv_cancel₀ hp.ne', ENNReal.rpow_one] + _ = ((exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) hcanonical) ^ p.exponent.toReal) ^ + (p.exponent.toReal)⁻¹ := by + rw [ENNReal.rpow_mul] + _ ≤ ((d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ + p.exponent.toReal) ^ (p.exponent.toReal)⁻¹ := hroot + _ = (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hp.le), + ENNReal.rpow_rpow_inv hp.ne'] + _ ≤ (d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := + by simpa [mul_comm] using + mul_le_mul_right hdimension + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) + +/-- Aggregating the finite-dimensional Euclidean upper bound over centers +and all scales. Measurability is needed only to invoke the standard +coordinate-sum `L^p` estimate; it is not an additional regularity premise. -/ +theorem cubeEuclideanOverlapPowerEnergy_le_coordinate_mul + {d : ℕ} (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F ≤ + cubeCoordinateGagliardoComparisonConstant d p * + cubeEuclideanCoordinateOverlapPowerEnergy Q s p F := by + let w : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ + let C : ℕ → TriadicCube d → ℝ≥0∞ := fun j S => + ∑ i : Fin d, + (eLpNorm + (fun x => F x i - ScalarOverlap.cubeAverage S (fun y => F y i)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + let V : ℕ → TriadicCube d → ℝ≥0∞ := fun _ S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + let K := cubeCoordinateGagliardoComparisonConstant d p + have hcenter : ∀ j : ℕ, + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) ≤ + K * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) := by + intro j + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) ≤ + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => K * C j S.1) := by + apply Finset.sum_le_sum + intro S _ + exact vector_overlap_local_power_le_coordinate_mul S.1 p F hF + _ = K * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) := by + rw [← Finset.mul_sum] + change (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1)) ≤ + K * ∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) + calc + (∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1)) ≤ + ∑' j : ℕ, K * + (w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1)) := by + apply ENNReal.tsum_le_tsum + intro j + calc + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => V j S.1) ≤ + w j * (K * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1)) := + mul_le_mul_right (hcenter j) _ + _ = K * + (w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1)) := by + ring + _ = K * ∑' j : ℕ, + w j * (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => C j S.1) := + ENNReal.tsum_mul_left + +private theorem coordinate_exactOverlapPowerEnergy_le_overlapBesov_mul_gagliardo + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F ≤ + (2 * 3 ^ d) * cubeCoordinateGagliardoPowerEnergy Q s p F := by + unfold cubeEuclideanCoordinateExactOverlapPowerEnergy + calc + (∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal) ≤ + ∑ i : Fin d, (2 * 3 ^ d) * + (Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i)) ^ + p.exponent.toReal := by + apply Finset.sum_le_sum + intro i _ + exact exactOverlapScalarPSeminorm_rpow_le_gagliardo s p Q (fun x => F x i) + (exactOverlapScalarPIntegrableOfEuclideanField Q p F i) + ((measurable_pi_apply i).comp hF) + (cubeEuclideanLp_coordinate_memLp F i) + _ = (2 * 3 ^ d) * cubeCoordinateGagliardoPowerEnergy Q s p F := by + rw [cubeCoordinateGagliardoPowerEnergy, ← Finset.mul_sum] + +private theorem coordinate_gagliardoPowerEnergy_le_lower_mul_exactOverlap + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + cubeCoordinateGagliardoPowerEnergy Q s p F ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F := by + unfold cubeCoordinateGagliardoPowerEnergy + cubeEuclideanCoordinateExactOverlapPowerEnergy + calc + (∑ i : Fin d, + (Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent (fun x => F x i)) ^ + p.exponent.toReal) ≤ + ∑ i : Fin d, (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal := by + apply Finset.sum_le_sum + intro i _ + exact gagliardo_rpow_le_exactOverlapScalarPSeminorm s p Q (fun x => F x i) + (exactOverlapScalarPIntegrableOfEuclideanField Q p F i) + ((measurable_pi_apply i).comp hF) + (cubeEuclideanLp_coordinate_memLp F i) + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + ∑ i : Fin d, + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q + (fun x => F x i) (exactOverlapScalarPIntegrableOfEuclideanField Q p F i)) ^ + p.exponent.toReal := by + rw [← Finset.mul_sum] + +noncomputable def cubeEuclideanOverlapToWspPowerConstant + (d : ℕ) (p : FiniteLpExponent) : ℝ≥0∞ := + cubeCoordinateGagliardoComparisonConstant d p * (2 * 3 ^ d) * + (d : ℝ≥0∞) * cubeEuclideanWspMetricComparisonConstant d p + +noncomputable def cubeEuclideanWspToOverlapPowerConstant + (d : ℕ) (p : FiniteLpExponent) : ℝ≥0∞ := + cubeCoordinateGagliardoComparisonConstant d p * + (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * (d : ℝ≥0∞) + +theorem cubeEuclideanOverlapToWspPowerConstant_lt_top + (d : ℕ) (p : FiniteLpExponent) : + cubeEuclideanOverlapToWspPowerConstant d p < ∞ := by + unfold cubeEuclideanOverlapToWspPowerConstant + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top + (ENNReal.mul_lt_top + (cubeCoordinateGagliardoComparisonConstant_lt_top d p) + (by finiteness)) + (by finiteness)) + (cubeEuclideanWspMetricComparisonConstant_lt_top d p) + +theorem cubeEuclideanWspToOverlapPowerConstant_lt_top + (d : ℕ) (p : FiniteLpExponent) : + cubeEuclideanWspToOverlapPowerConstant d p < ∞ := by + unfold cubeEuclideanWspToOverlapPowerConstant + have hlower : Gagliardo.gagliardoBesovLowerConstant d ≠ ∞ := by + unfold Gagliardo.gagliardoBesovLowerConstant + exact ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (ENNReal.pow_ne_top (by norm_num)) + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top + (cubeCoordinateGagliardoComparisonConstant_lt_top d p) + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hlower)) + (by finiteness) + +/-- The canonical direct Euclidean overlap seminorm controls the Euclidean +fractional Sobolev seminorm at the same finite exponent. The only explicit +representative premise supplies the scalar measurability required by the +already-established scalar Gagliardo comparison. -/ +private theorem cubeEuclideanOverlap_rpow_le_constant_mul_wsp_of_measurable + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ p.exponent.toReal ≤ + cubeEuclideanOverlapToWspPowerConstant d p * + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal := by + let A := cubeCoordinateGagliardoComparisonConstant d p + let B : ℝ≥0∞ := 2 * 3 ^ d + let M := cubeEuclideanWspMetricComparisonConstant d p + calc + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ p.exponent.toReal = + cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F := + cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy Q s p F + _ ≤ A * cubeEuclideanCoordinateOverlapPowerEnergy Q s p F := + cubeEuclideanOverlapPowerEnergy_le_coordinate_mul Q s p F hF + _ = A * cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F := by + rw [cubeEuclideanCoordinateOverlapPowerEnergy_eq_exact] + _ ≤ A * (B * cubeCoordinateGagliardoPowerEnergy Q s p F) := by + exact mul_le_mul_right + (coordinate_exactOverlapPowerEnergy_le_overlapBesov_mul_gagliardo Q s p F hF) A + _ ≤ A * (B * ((d : ℝ≥0∞) * + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal)) := by + gcongr + exact cubeCoordinateGagliardoPowerEnergy_le_dimension_mul_ambientHilbert Q s p F + _ ≤ A * (B * ((d : ℝ≥0∞) * (M * + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal))) := by + gcongr + exact cubeAmbientHilbertWspESeminorm_rpow_le_metricComparisonConstant_mul Q s p F + _ = cubeEuclideanOverlapToWspPowerConstant d p * + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal := by + unfold cubeEuclideanOverlapToWspPowerConstant + dsimp [A, B, M] + ring + +/-- The Euclidean fractional Sobolev seminorm controls the canonical direct +Euclidean overlap seminorm at the same finite exponent. -/ +private theorem cubeEuclideanWsp_rpow_le_constant_mul_overlap_of_measurable + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + cubeEuclideanWspToOverlapPowerConstant d p * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ p.exponent.toReal := by + let A := cubeCoordinateGagliardoComparisonConstant d p + let L := (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal + calc + (cubeEuclideanWspESeminorm Q s p F) ^ p.exponent.toReal ≤ + (cubeAmbientHilbertWspESeminorm Q s p F) ^ p.exponent.toReal := + cubeEuclideanWspESeminorm_rpow_le_ambientHilbert Q s p F + _ ≤ A * cubeCoordinateGagliardoPowerEnergy Q s p F := + cubeAmbientHilbertWspESeminorm_rpow_le_coordinateGagliardoPowerEnergy Q s p F hF + _ ≤ A * (L * cubeEuclideanCoordinateExactOverlapPowerEnergy Q s p F) := by + exact mul_le_mul_right + (coordinate_gagliardoPowerEnergy_le_lower_mul_exactOverlap Q s p F hF) A + _ ≤ A * (L * ((d : ℝ≥0∞) * + cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F)) := by + gcongr + rw [← cubeEuclideanCoordinateOverlapPowerEnergy_eq_exact] + exact cubeEuclideanCoordinateOverlapPowerEnergy_le_dimension_mul_overlap Q s p F + _ = cubeEuclideanWspToOverlapPowerConstant d p * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s p F) ^ p.exponent.toReal := by + rw [cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy] + unfold cubeEuclideanWspToOverlapPowerConstant + dsimp [A, L] + ring + +private theorem finiteLpExponent_toReal_inv_pos (p : FiniteLpExponent) : + 0 < (p.exponent.toReal)⁻¹ := + inv_pos.mpr (finiteLpExponent_toReal_pos p) + +/-- A deliberately coarse constant depending only on the dimension. It +absorbs the finite-coordinate and metric changes without any dependence on +the fractional order or the finite exponent. -/ +noncomputable def cubeEuclideanWspOverlapDimensionConstant (d : ℕ) : ℝ≥0∞ := + (2 * 3 ^ d) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) + +/-- The dimension-only overlap/fractional comparison constant is finite. -/ +theorem cubeEuclideanWspOverlapDimensionConstant_lt_top (d : ℕ) : + cubeEuclideanWspOverlapDimensionConstant d < ∞ := by + unfold cubeEuclideanWspOverlapDimensionConstant + have hlower : Gagliardo.gagliardoBesovLowerConstant d ≠ ∞ := by + unfold Gagliardo.gagliardoBesovLowerConstant + exact ENNReal.mul_ne_top (ENNReal.pow_ne_top (by norm_num)) + (ENNReal.pow_ne_top (by norm_num)) + have hdimension : 0 ≤ (d : ℝ) + 4 := by positivity + have hpower : (d : ℝ≥0∞) ^ ((d : ℝ) + 4) < ∞ := + ENNReal.rpow_lt_top_of_nonneg hdimension (ENNReal.natCast_ne_top d) + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top (by finiteness) (lt_top_iff_ne_top.mpr hlower)) hpower + +private theorem ennreal_natCast_one_le {d : ℕ} [NeZero d] : + 1 ≤ (d : ℝ≥0∞) := by + exact_mod_cast Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero (NeZero.ne d)) + +private theorem finiteLpExponent_toReal_one_le (p : FiniteLpExponent) : + 1 ≤ p.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_le_toReal (by norm_num) p.lt_top.ne).mpr p.one_lt.le + +private theorem finiteLpExponent_inv_le_one (p : FiniteLpExponent) : + (p.exponent.toReal)⁻¹ ≤ 1 := + inv_le_one_of_one_le₀ (finiteLpExponent_toReal_one_le p) + +private theorem finiteLpExponent_sub_mul_inv_le_one (p : FiniteLpExponent) : + (p.exponent.toReal - 1) * (p.exponent.toReal)⁻¹ ≤ 1 := by + have hp : p.exponent.toReal ≠ 0 := (finiteLpExponent_toReal_pos p).ne' + rw [sub_mul, mul_inv_cancel₀ hp, one_mul] + linarith [(inv_nonneg).mpr (finiteLpExponent_toReal_pos p).le] + +private theorem finiteLpExponent_dimension_add_mul_inv_le_dimension_add_one + (d : ℕ) (p : FiniteLpExponent) : + ((d : ℝ) + p.exponent.toReal) * (p.exponent.toReal)⁻¹ ≤ (d : ℝ) + 1 := by + have hinv : (p.exponent.toReal)⁻¹ ≤ 1 := finiteLpExponent_inv_le_one p + have hcancel : p.exponent.toReal * (p.exponent.toReal)⁻¹ = 1 := + mul_inv_cancel₀ (finiteLpExponent_toReal_pos p).ne' + rw [add_mul, hcancel] + calc + (d : ℝ) * (p.exponent.toReal)⁻¹ + 1 ≤ (d : ℝ) * 1 + 1 := + by + simpa [add_comm] using (add_le_add_right + (mul_le_mul_of_nonneg_left hinv (show 0 ≤ (d : ℝ) by positivity)) 1) + _ = (d : ℝ) + 1 := by ring + +private theorem cubeCoordinateComparisonConstant_root_le_dimension_sq + {d : ℕ} [NeZero d] (p : FiniteLpExponent) : + (cubeCoordinateGagliardoComparisonConstant d p) ^ (p.exponent.toReal)⁻¹ ≤ + (d : ℝ≥0∞) ^ (2 : ℝ) := by + unfold cubeCoordinateGagliardoComparisonConstant + rw [ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.rpow_rpow_inv (finiteLpExponent_toReal_pos p).ne', + ← ENNReal.rpow_mul] + have hd : 1 ≤ (d : ℝ≥0∞) := ennreal_natCast_one_le + have hpow : (d : ℝ≥0∞) ^ + ((p.exponent.toReal - 1) * (p.exponent.toReal)⁻¹) ≤ (d : ℝ≥0∞) := by + simpa only [ENNReal.rpow_one] using ENNReal.rpow_le_rpow_of_exponent_le hd + (finiteLpExponent_sub_mul_inv_le_one p) + have hnorm : ‖(d : ℝ)‖ₑ = (d : ℝ≥0∞) := by simp + rw [hnorm] + calc + (d : ℝ≥0∞) * (d : ℝ≥0∞) ^ + ((p.exponent.toReal - 1) * (p.exponent.toReal)⁻¹) ≤ + (d : ℝ≥0∞) * (d : ℝ≥0∞) := mul_le_mul_right hpow _ + _ = (d : ℝ≥0∞) ^ (2 : ℝ) := by simp [pow_two] + +private theorem cubeMetricComparisonConstant_root_le_dimension_power + {d : ℕ} [NeZero d] (p : FiniteLpExponent) : + (cubeEuclideanWspMetricComparisonConstant d p) ^ (p.exponent.toReal)⁻¹ ≤ + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) := by + unfold cubeEuclideanWspMetricComparisonConstant + have hdreal : 0 < (d : ℝ) := by + exact_mod_cast Nat.pos_of_ne_zero (NeZero.ne d) + rw [← ENNReal.ofReal_rpow_of_pos hdreal, ← ENNReal.rpow_mul] + have hd : 1 ≤ (d : ℝ≥0∞) := ennreal_natCast_one_le + convert ENNReal.rpow_le_rpow_of_exponent_le hd + (finiteLpExponent_dimension_add_mul_inv_le_dimension_add_one d p) using 1 + all_goals simp + +private theorem flatOverlapConstant_root_le_flatOverlapConstant + (d : ℕ) (p : FiniteLpExponent) : + (2 * 3 ^ d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ ≤ 2 * 3 ^ d := by + have hbase : 1 ≤ (2 * 3 ^ d : ℝ≥0∞) := by + calc + (1 : ℝ≥0∞) ≤ 2 := by norm_num + _ = 2 * 1 := by norm_num + _ ≤ 2 * 3 ^ d := mul_le_mul_right + (one_le_pow₀ (by norm_num : (1 : ℝ≥0∞) ≤ 3)) _ + simpa only [ENNReal.rpow_one] using + ENNReal.rpow_le_rpow_of_exponent_le hbase (finiteLpExponent_inv_le_one p) + +private theorem gagliardoBesovLowerConstant_one_le (d : ℕ) : + 1 ≤ Gagliardo.gagliardoBesovLowerConstant d := by + unfold Gagliardo.gagliardoBesovLowerConstant + calc + (1 : ℝ≥0∞) ≤ 2 ^ 3 := by norm_num + _ = 2 ^ 3 * 1 := by ring + _ ≤ 2 ^ 3 * 3 ^ (3 * d + 2) := + mul_le_mul_right (one_le_pow₀ (by norm_num : (1 : ℝ≥0∞) ≤ 3)) _ + +private theorem dimension_power_three_le_dimension_power_large {d : ℕ} [NeZero d] : + (d : ℝ≥0∞) ^ (3 : ℝ) ≤ (d : ℝ≥0∞) ^ ((d : ℝ) + 2) := by + apply ENNReal.rpow_le_rpow_of_exponent_le ennreal_natCast_one_le + have hd : 1 ≤ (d : ℝ) := by + exact_mod_cast Nat.succ_le_iff.mpr (Nat.pos_of_ne_zero (NeZero.ne d)) + linarith + +private theorem dimension_square_mul_metric_le_large {d : ℕ} [NeZero d] : + (d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) ≤ (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + have hD : 1 ≤ (d : ℝ≥0∞) := ennreal_natCast_one_le + have hzero : (d : ℝ≥0∞) ≠ 0 := ne_of_gt (lt_of_lt_of_le (by norm_num) hD) + have htop : (d : ℝ≥0∞) ≠ ∞ := ENNReal.natCast_ne_top d + have hfirst : (d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ≤ + (d : ℝ≥0∞) ^ (3 : ℝ) := by + rw [show (2 : ℝ) = (2 : ℕ) by norm_num, + show (3 : ℝ) = (3 : ℕ) by norm_num, + ENNReal.rpow_natCast, ENNReal.rpow_natCast] + simp [pow_succ] + have hsecond : (d : ℝ≥0∞) ^ (3 : ℝ) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) ≤ (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + -- The direct exponent combination is more convenient than reusing the + -- coarse intermediate bound. + rw [← ENNReal.rpow_add _ _ hzero htop] + apply ENNReal.rpow_le_rpow_of_exponent_le hD + linarith + calc + (d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) = + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞)) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) := by ring + _ ≤ (d : ℝ≥0∞) ^ (3 : ℝ) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) := by + simpa [mul_comm] using mul_le_mul_right hfirst + ((d : ℝ≥0∞) ^ ((d : ℝ) + 1)) + _ ≤ _ := hsecond + +theorem cubeEuclideanOverlapRootConstant_le_dimensionConstant + {d : ℕ} [NeZero d] (p : FiniteLpExponent) : + (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ ≤ + cubeEuclideanWspOverlapDimensionConstant d := by + have hA := cubeCoordinateComparisonConstant_root_le_dimension_sq (d := d) p + have hB := flatOverlapConstant_root_le_flatOverlapConstant d p + have hD : (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ ≤ (d : ℝ≥0∞) := by + simpa only [ENNReal.rpow_one] using + ENNReal.rpow_le_rpow_of_exponent_le ennreal_natCast_one_le + (finiteLpExponent_inv_le_one p) + have hM := cubeMetricComparisonConstant_root_le_dimension_power (d := d) p + unfold cubeEuclideanOverlapToWspPowerConstant + cubeEuclideanWspOverlapDimensionConstant + rw [ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le] + calc + cubeCoordinateGagliardoComparisonConstant d p ^ (p.exponent.toReal)⁻¹ * + (2 * 3 ^ d) ^ (p.exponent.toReal)⁻¹ * + (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspMetricComparisonConstant d p ^ (p.exponent.toReal)⁻¹ ≤ + (d : ℝ≥0∞) ^ (2 : ℝ) * + (2 * 3 ^ d) ^ (p.exponent.toReal)⁻¹ * + (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspMetricComparisonConstant d p ^ (p.exponent.toReal)⁻¹ := by + gcongr + _ ≤ (d : ℝ≥0∞) ^ (2 : ℝ) * (2 * 3 ^ d) * + (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspMetricComparisonConstant d p ^ (p.exponent.toReal)⁻¹ := by + gcongr + _ ≤ (d : ℝ≥0∞) ^ (2 : ℝ) * (2 * 3 ^ d) * (d : ℝ≥0∞) * + cubeEuclideanWspMetricComparisonConstant d p ^ (p.exponent.toReal)⁻¹ := by + gcongr + _ ≤ (d : ℝ≥0∞) ^ (2 : ℝ) * (2 * 3 ^ d) * (d : ℝ≥0∞) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) := by + gcongr + _ ≤ (2 * 3 ^ d) * (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + rw [show (d : ℝ≥0∞) ^ (2 : ℝ) * (2 * 3 ^ d) * (d : ℝ≥0∞) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1) = + (2 * 3 ^ d) * ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 1)) by ring] + exact mul_le_mul_right (dimension_square_mul_metric_le_large (d := d)) _ + _ ≤ (2 * 3 ^ d) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + calc + (2 * 3 ^ d) * (d : ℝ≥0∞) ^ ((d : ℝ) + 4) = + ((2 * 3 ^ d) * 1) * (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by ring + _ ≤ ((2 * 3 ^ d) * Gagliardo.gagliardoBesovLowerConstant d) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + gcongr + exact gagliardoBesovLowerConstant_one_le d + _ = _ := by ring + +theorem cubeEuclideanWspRootConstant_le_dimensionConstant + {d : ℕ} [NeZero d] (p : FiniteLpExponent) : + (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ ≤ + cubeEuclideanWspOverlapDimensionConstant d := by + have hA := cubeCoordinateComparisonConstant_root_le_dimension_sq (d := d) p + have hD : (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ ≤ (d : ℝ≥0∞) := by + simpa only [ENNReal.rpow_one] using + ENNReal.rpow_le_rpow_of_exponent_le ennreal_natCast_one_le + (finiteLpExponent_inv_le_one p) + unfold cubeEuclideanWspToOverlapPowerConstant + cubeEuclideanWspOverlapDimensionConstant + rw [ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.rpow_rpow_inv (finiteLpExponent_toReal_pos p).ne'] + calc + cubeCoordinateGagliardoComparisonConstant d p ^ (p.exponent.toReal)⁻¹ * + Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ ≤ + (d : ℝ≥0∞) ^ (2 : ℝ) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ (p.exponent.toReal)⁻¹ := by + gcongr + _ ≤ (d : ℝ≥0∞) ^ (2 : ℝ) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) := by + gcongr + _ ≤ (d : ℝ≥0∞) ^ (2 : ℝ) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ (3 : ℝ) := by + have hDthree : (d : ℝ≥0∞) ≤ (d : ℝ≥0∞) ^ (3 : ℝ) := by + calc + (d : ℝ≥0∞) = (d : ℝ≥0∞) ^ (1 : ℝ) := (ENNReal.rpow_one _).symm + _ ≤ (d : ℝ≥0∞) ^ (3 : ℝ) := + ENNReal.rpow_le_rpow_of_exponent_le (ennreal_natCast_one_le (d := d)) + (show (1 : ℝ) ≤ 3 by norm_num) + gcongr + _ ≤ (2 * 3 ^ d) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + have hthree := dimension_power_three_le_dimension_power_large (d := d) + have hzero : (d : ℝ≥0∞) ≠ 0 := + ne_of_gt (lt_of_lt_of_le (by norm_num) (ennreal_natCast_one_le (d := d))) + have htop : (d : ℝ≥0∞) ≠ ∞ := ENNReal.natCast_ne_top d + have hcombine : (d : ℝ≥0∞) ^ (2 : ℝ) * + (d : ℝ≥0∞) ^ ((d : ℝ) + 2) = + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + rw [← ENNReal.rpow_add _ _ hzero htop] + congr 1 + ring + calc + (d : ℝ≥0∞) ^ (2 : ℝ) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ (3 : ℝ) = + Gagliardo.gagliardoBesovLowerConstant d * + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ^ (3 : ℝ)) := by ring + _ ≤ Gagliardo.gagliardoBesovLowerConstant d * + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ^ ((d : ℝ) + 2)) := by + gcongr + _ ≤ (2 * 3 ^ d) * Gagliardo.gagliardoBesovLowerConstant d * + (d : ℝ≥0∞) ^ ((d : ℝ) + 4) := by + have hflat : (1 : ℝ≥0∞) ≤ 2 * 3 ^ d := by + calc + (1 : ℝ≥0∞) ≤ 2 := by norm_num + _ = 2 * 1 := by norm_num + _ ≤ 2 * 3 ^ d := mul_le_mul_right + (one_le_pow₀ (by norm_num : (1 : ℝ≥0∞) ≤ 3)) _ + calc + Gagliardo.gagliardoBesovLowerConstant d * + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ^ ((d : ℝ) + 2)) ≤ + (2 * 3 ^ d) * (Gagliardo.gagliardoBesovLowerConstant d * + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ^ ((d : ℝ) + 2))) := by + simpa only [one_mul] using mul_le_mul_left hflat + (Gagliardo.gagliardoBesovLowerConstant d * + ((d : ℝ≥0∞) ^ (2 : ℝ) * (d : ℝ≥0∞) ^ ((d : ℝ) + 2))) + _ = _ := by rw [hcombine]; ring + +/-- Rooted form of the direct-overlap-to-fractional-Sobolev comparison. -/ +private theorem cubeEuclideanOverlap_le_rootConstant_mul_wsp_of_measurable + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F ≤ + (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspESeminorm Q s p F := by + have hpower := cubeEuclideanOverlap_rpow_le_constant_mul_wsp_of_measurable Q s p F hF + have hroot := ENNReal.rpow_le_rpow hpower + (finiteLpExponent_toReal_inv_pos p).le + rw [← ENNReal.rpow_mul] at hroot + have hprod : p.exponent.toReal * (p.exponent.toReal)⁻¹ = 1 := by + exact mul_inv_cancel₀ (finiteLpExponent_toReal_pos p).ne' + rw [hprod, ENNReal.rpow_one] at hroot + rw [ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.rpow_rpow_inv (finiteLpExponent_toReal_pos p).ne'] at hroot + exact hroot + +/-- Rooted form of the fractional-Sobolev-to-direct-overlap comparison. -/ +private theorem cubeEuclideanWsp_le_rootConstant_mul_overlap_of_measurable + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) (hF : Measurable F) : + cubeEuclideanWspESeminorm Q s p F ≤ + (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + have hpower := cubeEuclideanWsp_rpow_le_constant_mul_overlap_of_measurable Q s p F hF + have hroot := ENNReal.rpow_le_rpow hpower + (finiteLpExponent_toReal_inv_pos p).le + rw [← ENNReal.rpow_mul] at hroot + have hprod : p.exponent.toReal * (p.exponent.toReal)⁻¹ = 1 := by + exact mul_inv_cancel₀ (finiteLpExponent_toReal_pos p).ne' + rw [hprod, ENNReal.rpow_one] at hroot + rw [ENNReal.mul_rpow_of_nonneg _ _ (finiteLpExponent_toReal_inv_pos p).le, + ENNReal.rpow_rpow_inv (finiteLpExponent_toReal_pos p).ne'] at hroot + exact hroot + +/-- Source-facing finite-`p` overlap-to-fractional comparison. The field +carrier provides only its `L^p` class; a globally measurable representative +is selected internally and the two seminorms are transported back by their +proved a.e. congruence. -/ +theorem cubeEuclideanOverlap_le_rootConstant_mul_wsp + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F ≤ + (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspESeminorm Q s p F := by + let G := F.measurableRepresentative + have hFG : F =ᵐ[normalizedCubeMeasure Q] G := F.ae_eq_measurableRepresentative + calc + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F = + cubeEuclideanPositiveBesovOverlapESeminorm Q s p G := + cubeEuclideanPositiveBesovOverlapESeminorm_congr_ae hFG + _ ≤ (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspESeminorm Q s p G := + cubeEuclideanOverlap_le_rootConstant_mul_wsp_of_measurable Q s p G + F.measurable_measurableRepresentative + _ = (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspESeminorm Q s p F := by + rw [cubeEuclideanWspESeminorm_congr_ae hFG] + +/-- Source-facing finite-`p` fractional-to-overlap comparison, with the same +internally selected measurable representative. -/ +theorem cubeEuclideanWsp_le_rootConstant_mul_overlap + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) : + cubeEuclideanWspESeminorm Q s p F ≤ + (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + let G := F.measurableRepresentative + have hFG : F =ᵐ[normalizedCubeMeasure Q] G := F.ae_eq_measurableRepresentative + calc + cubeEuclideanWspESeminorm Q s p F = cubeEuclideanWspESeminorm Q s p G := + cubeEuclideanWspESeminorm_congr_ae hFG + _ ≤ (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p G := + cubeEuclideanWsp_le_rootConstant_mul_overlap_of_measurable Q s p G + F.measurable_measurableRepresentative + _ = (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + rw [cubeEuclideanPositiveBesovOverlapESeminorm_congr_ae hFG] + +/-- Source-facing finite-`p` overlap-to-fractional comparison with a constant +depending only on the dimension. -/ +theorem cubeEuclideanOverlap_le_dimensionConstant_mul_wsp + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) : + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F ≤ + cubeEuclideanWspOverlapDimensionConstant d * + cubeEuclideanWspESeminorm Q s p F := by + calc + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F ≤ + (cubeEuclideanOverlapToWspPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanWspESeminorm Q s p F := + cubeEuclideanOverlap_le_rootConstant_mul_wsp Q s p F + _ ≤ cubeEuclideanWspOverlapDimensionConstant d * + cubeEuclideanWspESeminorm Q s p F := + mul_le_mul_left (cubeEuclideanOverlapRootConstant_le_dimensionConstant p) _ + +/-- Source-facing finite-`p` fractional-to-overlap comparison with the same +dimension-only constant. -/ +theorem cubeEuclideanWsp_le_dimensionConstant_mul_overlap + {d : ℕ} [NeZero d] (Q : TriadicCube d) (s : FractionalOrder) + (p : FiniteLpExponent) (F : CubeEuclideanLpField Q p) : + cubeEuclideanWspESeminorm Q s p F ≤ + cubeEuclideanWspOverlapDimensionConstant d * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + calc + cubeEuclideanWspESeminorm Q s p F ≤ + (cubeEuclideanWspToOverlapPowerConstant d p) ^ (p.exponent.toReal)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := + cubeEuclideanWsp_le_rootConstant_mul_overlap Q s p F + _ ≤ cubeEuclideanWspOverlapDimensionConstant d * + cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := + mul_le_mul_left (cubeEuclideanWspRootConstant_le_dimensionConstant p) _ + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpDisjointBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpDisjointBridge.lean new file mode 100644 index 0000000000..b3f37531a9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanLpDisjointBridge.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.PositiveOverlapBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging + +/-! +# Disjoint-to-exact-overlap finite-`p` bridge + +This file keeps the only localization step needed by the finite-`p` +coarse-graining forcing argument in the disjoint lane. It compares the +resulting parent disjoint series to the canonical exact overlap series; it +does not assert localization of the overlap seminorm itself. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The unrooted Euclidean oscillation average over ordinary triadic +descendants at one depth. -/ +noncomputable def cubeEuclideanPositiveBesovDisjointDepthPower {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) : ℝ≥0∞ := + ((descendantsAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (descendantsAtDepth Q j).attach.sum (fun R => + (eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R.1 F)) + p.exponent (normalizedCubeMeasure R.1)) ^ p.exponent.toReal) + +/-- The literal running-scale disjoint positive-Besov power series used only +internally before the parent overlap bridge. -/ +noncomputable def cubeEuclideanPositiveBesovDisjointPowerEnergy {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : ℝ≥0∞ := + ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + cubeEuclideanPositiveBesovDisjointDepthPower Q p F j + +private theorem disjoint_residual_eq_overlap_middleChild {d : ℕ} + (R : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) : + eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R F)) + p.exponent (normalizedCubeMeasure R) = + eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec (ScalarOverlap.middleChildCube R) F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure (ScalarOverlap.middleChildCube R)) := by + have hmean : ScalarOverlap.cubeAverageVec (ScalarOverlap.middleChildCube R) F = cubeAverageVec R F := by + funext i + simp only [ScalarOverlap.cubeAverageVec, cubeAverageVec] + rw [ScalarOverlap.cubeAverage_middleChildCube] + rw [hmean, ScalarOverlap.normalizedCubeMeasure_middleChildCube] + +/-- At a fixed depth, the ordinary disjoint Euclidean oscillation average is +controlled by the exact overlap average. The only loss is the dimension-only +middle-child cardinality factor. -/ +theorem cubeEuclideanPositiveBesovDisjointDepthPower_le_overlap {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) : + cubeEuclideanPositiveBesovDisjointDepthPower Q p F j ≤ + (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal := by + classical + let D : Finset (TriadicCube d) := descendantsAtDepth Q j + let O : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let G : TriadicCube d → ℝ≥0∞ := fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ p.exponent.toReal + have hD0 : (D.card : ℝ≥0∞) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr (by + simpa [D] using descendantsAtDepth_nonempty Q j)) + have hO0 : (O.card : ℝ≥0∞) ≠ 0 := by + exact_mod_cast (Finset.card_ne_zero.mpr (by + simpa [O] using ScalarOverlap.centersAtDepth_nonempty Q j)) + have hDtop : (D.card : ℝ≥0∞) ≠ ∞ := ENNReal.natCast_ne_top _ + have hOtop : (O.card : ℝ≥0∞) ≠ ∞ := ENNReal.natCast_ne_top _ + have himage : D.image ScalarOverlap.middleChildCube ⊆ O := by + intro S hS + rcases Finset.mem_image.mp hS with ⟨R, hR, rfl⟩ + exact ScalarOverlap.middleChildCube_mem_centersAtDepth_of_mem_descendantsAtDepth + (by simpa [D] using hR) + have hsum_image : (D.image ScalarOverlap.middleChildCube).sum G ≤ O.sum G := + Finset.sum_le_sum_of_subset_of_nonneg himage (fun _ _ _ => bot_le) + have hsum_eq : + D.attach.sum (fun R => + (eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R.1 F)) + p.exponent (normalizedCubeMeasure R.1)) ^ p.exponent.toReal) = + (D.image ScalarOverlap.middleChildCube).sum G := by + calc + D.attach.sum (fun R => + (eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R.1 F)) + p.exponent (normalizedCubeMeasure R.1)) ^ p.exponent.toReal) = + D.sum (fun R => + (eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R F)) + p.exponent (normalizedCubeMeasure R)) ^ p.exponent.toReal) := + Finset.sum_attach D (fun R => + (eLpNorm (fun x => HilbertVec.ofVec (F x - cubeAverageVec R F)) + p.exponent (normalizedCubeMeasure R)) ^ p.exponent.toReal) + _ = (D.image ScalarOverlap.middleChildCube).sum G := by + rw [Finset.sum_image] + · apply Finset.sum_congr rfl + intro R hR + simpa [G] using congrArg (fun z : ℝ≥0∞ => z ^ p.exponent.toReal) + (disjoint_residual_eq_overlap_middleChild R p F) + · intro R _ S _ hRS + exact ScalarOverlap.middleChildCube_injective hRS + have hcard : (O.card : ℝ≥0∞) ≤ (3 ^ d : ℝ≥0∞) * (D.card : ℝ≥0∞) := by + exact_mod_cast (by + simpa [D, O] using + ScalarOverlap.centersAtDepth_card_le_three_pow_mul_descendantsAtDepth_card Q j) + have hratio : (D.card : ℝ≥0∞)⁻¹ ≤ + (3 ^ d : ℝ≥0∞) * (O.card : ℝ≥0∞)⁻¹ := by + suffices h : (D.card : ℝ≥0∞)⁻¹ ≤ + (3 ^ d : ℝ≥0∞) / (O.card : ℝ≥0∞) by + simpa only [ENNReal.div_eq_inv_mul, mul_comm] using h + apply (ENNReal.le_div_iff_mul_le (Or.inl hO0) (Or.inl hOtop)).2 + calc + (D.card : ℝ≥0∞)⁻¹ * (O.card : ℝ≥0∞) ≤ + (D.card : ℝ≥0∞)⁻¹ * + ((3 ^ d : ℝ≥0∞) * (D.card : ℝ≥0∞)) := + mul_le_mul_right hcard _ + _ = (3 ^ d : ℝ≥0∞) * ((D.card : ℝ≥0∞)⁻¹ * (D.card : ℝ≥0∞)) := by + ring + _ = (3 ^ d : ℝ≥0∞) := by + rw [ENNReal.inv_mul_cancel hD0 hDtop, mul_one] + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + change (D.card : ℝ≥0∞)⁻¹ * D.attach.sum _ ≤ + (3 ^ d : ℝ≥0∞) * ((O.card : ℝ≥0∞)⁻¹ * O.attach.sum _) + have hOattach : O.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ p.exponent.toReal) = + O.sum G := by + exact Finset.sum_attach O G + rw [hsum_eq, hOattach] + calc + (D.card : ℝ≥0∞)⁻¹ * (D.image ScalarOverlap.middleChildCube).sum G ≤ + (D.card : ℝ≥0∞)⁻¹ * O.sum G := + mul_le_mul_right hsum_image _ + _ ≤ ((3 ^ d : ℝ≥0∞) * (O.card : ℝ≥0∞)⁻¹) * O.sum G := + mul_le_mul_left hratio _ + _ = (3 ^ d : ℝ≥0∞) * ((O.card : ℝ≥0∞)⁻¹ * O.sum G) := by + ring + +/-- The complete disjoint forcing power series is controlled by the literal +parent overlap power energy with a dimension-only factor. -/ +theorem cubeEuclideanPositiveBesovDisjointPowerEnergy_le_overlap {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + cubeEuclideanPositiveBesovDisjointPowerEnergy Q s p F ≤ + (3 ^ d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F := by + rw [cubeEuclideanPositiveBesovOverlapPowerEnergy_eq_tsum_depthENorm] + unfold cubeEuclideanPositiveBesovDisjointPowerEnergy + let weight : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) + calc + (∑' j : ℕ, weight j * cubeEuclideanPositiveBesovDisjointDepthPower Q p F j) ≤ + ∑' j : ℕ, (3 ^ d : ℝ≥0∞) * + (weight j * (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal) := by + apply ENNReal.tsum_le_tsum + intro j + calc + weight j * cubeEuclideanPositiveBesovDisjointDepthPower Q p F j ≤ + weight j * ((3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal) := + mul_le_mul_right + (cubeEuclideanPositiveBesovDisjointDepthPower_le_overlap Q p F j) _ + _ = (3 ^ d : ℝ≥0∞) * + (weight j * (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal) := by + ring + _ = (3 ^ d : ℝ≥0∞) * ∑' j : ℕ, + weight j * (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal := ENNReal.tsum_mul_left + +/-- For `p ≥ 2`, rooting the disjoint forcing power energy preserves a +dimension-only bridge constant. -/ +theorem cubeEuclideanPositiveBesovDisjointPowerEnergy_root_le_overlap {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (hp : (2 : ℝ≥0∞) ≤ p.exponent) (F : Vec d → Vec d) : + (cubeEuclideanPositiveBesovDisjointPowerEnergy Q s p F) ^ + (p.exponent.toReal)⁻¹ ≤ + (3 ^ d : ℝ≥0∞) * cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + let r : ℝ := p.exponent.toReal + let A : ℝ≥0∞ := cubeEuclideanPositiveBesovDisjointPowerEnergy Q s p F + let B : ℝ≥0∞ := cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F + let C : ℝ≥0∞ := (3 ^ d : ℝ≥0∞) + have hr_pos : 0 < r := by + dsimp [r] + exact ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne + have hr_one : 1 ≤ r := by + have hr_two : 2 ≤ r := by + dsimp [r] + exact ENNReal.toReal_mono p.lt_top.ne hp + linarith + have hr_inv : r⁻¹ ≤ 1 := inv_le_one_of_one_le₀ hr_one + have hC_one : 1 ≤ C := by + dsimp [C] + exact one_le_pow₀ (by norm_num) + have hCroot : C ^ r⁻¹ ≤ C := by + calc + C ^ r⁻¹ ≤ C ^ (1 : ℝ) := + ENNReal.rpow_le_rpow_of_exponent_le hC_one hr_inv + _ = C := ENNReal.rpow_one C + have hpower : A ≤ C * B := by + dsimp [A, B, C] + exact cubeEuclideanPositiveBesovDisjointPowerEnergy_le_overlap Q s p F + have hroot : B ^ r⁻¹ = cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by + dsimp [B] + rw [← cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy] + exact ENNReal.rpow_rpow_inv hr_pos.ne' _ + calc + A ^ r⁻¹ ≤ (C * B) ^ r⁻¹ := + ENNReal.rpow_le_rpow hpower (inv_nonneg.mpr hr_pos.le) + _ = C ^ r⁻¹ * B ^ r⁻¹ := + ENNReal.mul_rpow_of_nonneg _ _ (inv_nonneg.mpr hr_pos.le) + _ ≤ C * B ^ r⁻¹ := mul_le_mul_left hCroot _ + _ = C * cubeEuclideanPositiveBesovOverlapESeminorm Q s p F := by rw [hroot] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanPoincare.lean new file mode 100644 index 0000000000..d40924d47c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapEuclideanPoincare.lean @@ -0,0 +1,375 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapEuclidean +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.UnitCubeGeometry + +/-! +# Fractional Poincare estimate from the exact overlap norm + +The depth-zero term of the exact overlapping `p = q = 2` Besov seminorm is +the normalized `L²` fluctuation on the root cube. Combining this observation +coordinatewise with the Hilbert-valued `L²` triangle inequality proves the +fractional Poincare estimate directly, without importing a Sobolev embedding. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- A concrete Euclidean `L²` fact on a triadic cube supplies all coordinate +integrability certificates required by the exact overlap kernel. -/ +theorem exactOverlapEuclideanIntegrable_of_euclidean_memLp {d : ℕ} + (Q : TriadicCube d) (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) : + ExactOverlapEuclideanIntegrable Q F where + coordinate := fun i => by + have hi : MemLp (fun x => F x i) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + exact + { root := hi.integrable (by norm_num) + overlap := fun _ _ hS => + (ScalarOverlap.memLp_of_mem_centersAtDepth_of_memLp hS hi).integrable + (by norm_num) } + +private theorem enorm_ofVec_sq_eq_sum_enorm_sq {d : ℕ} (v : Vec d) : + ‖HilbertVec.ofVec v‖ₑ ^ (2 : ℕ) = ∑ i : Fin d, ‖v i‖ₑ ^ (2 : ℕ) := by + rw [← ofReal_norm] + rw [← ENNReal.ofReal_pow (norm_nonneg _)] + rw [HilbertVec.norm_sq_eq_sum_sq] + rw [ENNReal.ofReal_sum_of_nonneg (fun i _ => sq_nonneg (v i))] + apply Finset.sum_congr rfl + intro i _ + rw [Real.enorm_eq_ofReal_abs, + ← ENNReal.ofReal_pow (abs_nonneg (v i)), sq_abs] + +private theorem eLpNormPrime_two_sq {d : ℕ} {E : Type*} [NormedAddCommGroup E] + {μ : Measure (Vec d)} (f : Vec d → E) : + (eLpNorm' f 2 μ) ^ (2 : ℕ) = ∫⁻ x, ‖f x‖ₑ ^ (2 : ℕ) ∂μ := by + rw [eLpNorm'_eq_lintegral_enorm, ← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + +private theorem eLpNorm_two_sq {d : ℕ} {E : Type*} [NormedAddCommGroup E] + {μ : Measure (Vec d)} (f : Vec d → E) (hf : AEStronglyMeasurable f μ) : + (eLpNorm f (2 : ℝ≥0∞) μ) ^ (2 : ℕ) = + ∫⁻ x, ‖f x‖ₑ ^ (2 : ℕ) ∂μ := by + rw [eLpNorm_eq_eLpNorm' (by norm_num) (by norm_num) hf] + simpa only [ENNReal.toReal_ofNat] using eLpNormPrime_two_sq f + +private theorem eLpNorm_hilbertVec_two_eq_coordinateENorm {d : ℕ} + {μ : Measure (Vec d)} (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ) : + eLpNorm (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ = + (∑ i : Fin d, (eLpNorm (fun x => F x i) (2 : ℝ≥0∞) μ) ^ 2) ^ + ((2 : ℝ)⁻¹) := by + have henergy : + (eLpNorm (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ) ^ (2 : ℕ) = + ∑ i : Fin d, (eLpNorm (fun x => F x i) (2 : ℝ≥0∞) μ) ^ 2 := by + rw [eLpNorm_two_sq (fun x => HilbertVec.ofVec (F x)) hF.aestronglyMeasurable] + calc + (∫⁻ x, ‖HilbertVec.ofVec (F x)‖ₑ ^ (2 : ℕ) ∂μ) = + ∫⁻ x, ∑ i : Fin d, ‖F x i‖ₑ ^ (2 : ℕ) ∂μ := by + apply lintegral_congr + intro x + exact enorm_ofVec_sq_eq_sum_enorm_sq (F x) + _ = ∑ i : Fin d, ∫⁻ x, ‖F x i‖ₑ ^ (2 : ℕ) ∂μ := by + rw [lintegral_finsetSum'] + intro i _ + exact (hF.eval_piLp i).aestronglyMeasurable.enorm.pow_const (2 : ℕ) + _ = ∑ i : Fin d, (eLpNorm (fun x => F x i) (2 : ℝ≥0∞) μ) ^ 2 := by + apply Finset.sum_congr rfl + intro i _ + exact (eLpNorm_two_sq (fun x => F x i) (hF.eval_piLp i).aestronglyMeasurable).symm + calc + eLpNorm (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ = + ((eLpNorm (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) μ) ^ + (2 : ℕ)) ^ ((2 : ℝ)⁻¹) := by + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + _ = (∑ i : Fin d, (eLpNorm (fun x => F x i) (2 : ℝ≥0∞) μ) ^ 2) ^ + ((2 : ℝ)⁻¹) := by + rw [henergy] + +private theorem exactOverlapDepthAverage_two_zero {d : ℕ} (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapDepthAverage Q 2 u hu 0 = + (exactOverlapLocalOscillation (ScalarOverlap.middleChildCube Q) 2 u + (hu.overlap 0 _ (by simp))) ^ (2 : ℝ) := by + let D := ScalarOverlap.centersAtDepth Q 0 + let g : TriadicCube d → ℝ≥0∞ := fun S => + if hS : S ∈ D then + (exactOverlapLocalOscillation S 2 u (hu.overlap 0 S hS)) ^ (2 : ℝ) + else 0 + rw [exactOverlapDepthAverage_eq] + have hsum : D.attach.sum (fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal 2) u + (hu.overlap 0 S.1 S.2)) ^ (2 : ℝ)) = D.sum g := by + calc + D.attach.sum (fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal 2) u + (hu.overlap 0 S.1 S.2)) ^ (2 : ℝ)) = + D.attach.sum (fun S => g S.1) := by + apply Finset.sum_congr rfl + intro S _ + simp only [g, dif_pos S.2] + norm_num + _ = D.sum g := Finset.sum_attach D g + change ((D.card : ℝ≥0∞)⁻¹) * + D.attach.sum (fun S => + (exactOverlapLocalOscillation S.1 (ENNReal.ofReal 2) u + (hu.overlap 0 S.1 S.2)) ^ (2 : ℝ)) = _ + rw [hsum] + simp only [D, ScalarOverlap.centersAtDepth_zero, Finset.card_singleton, + Nat.cast_one, inv_one, one_mul, Finset.sum_singleton, g, + dif_pos (Finset.mem_singleton_self _)] + +private theorem exactOverlapDepthTerm_two_zero {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapDepthTerm Q s.1 2 u hu 0 = + exactOverlapRootWeight Q s.1 * + exactOverlapLocalOscillation (ScalarOverlap.middleChildCube Q) 2 u + (hu.overlap 0 _ (by simp)) := by + rw [exactOverlapDepthTerm_eq, exactOverlapDepthAverage_two_zero, + exactOverlapDepthWeight_zero] + rw [← ENNReal.rpow_mul] + norm_num + +private theorem exactOverlapRootWeight_mul_localOscillation_le_finiteSeminorm + {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapRootWeight Q s.1 * + exactOverlapLocalOscillation (ScalarOverlap.middleChildCube Q) 2 u + (hu.overlap 0 _ (by simp)) ≤ + exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q u hu := by + rw [← exactOverlapDepthTerm_two_zero] + rw [exactOverlapFiniteSeminorm_eq] + change exactOverlapDepthTerm Q s.1 2 u hu 0 ≤ + (∑' j : ℕ, (exactOverlapDepthTerm Q s.1 2 u hu j) ^ (2 : ℝ)) ^ + ((2 : ℝ)⁻¹) + calc + exactOverlapDepthTerm Q s.1 2 u hu 0 = + ((exactOverlapDepthTerm Q s.1 2 u hu 0) ^ (2 : ℝ)) ^ + ((2 : ℝ)⁻¹) := by + rw [← ENNReal.rpow_mul] + norm_num + _ ≤ (∑' j : ℕ, (exactOverlapDepthTerm Q s.1 2 u hu j) ^ (2 : ℝ)) ^ + ((2 : ℝ)⁻¹) := by + apply ENNReal.rpow_le_rpow + (ENNReal.le_tsum (f := fun j : ℕ => (exactOverlapDepthTerm Q s.1 2 u hu j) ^ (2 : ℝ)) 0) + norm_num + +private theorem exactOverlapLocalOscillation_middleChildCube_two {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) : + exactOverlapLocalOscillation (ScalarOverlap.middleChildCube Q) 2 u + (hu.overlap 0 _ (by simp)) = + eLpNorm (fun x => u x - exactOverlapRootMean Q u hu.root) 2 + (normalizedCubeMeasure Q) := by + unfold exactOverlapLocalOscillation + have hmean : exactOverlapLocalMean (ScalarOverlap.middleChildCube Q) u + (hu.overlap 0 _ (by simp)) = exactOverlapRootMean Q u hu.root := by + unfold exactOverlapLocalMean exactOverlapRootMean + rw [ScalarOverlap.normalizedCubeMeasure_middleChildCube] + rw [hmean, ScalarOverlap.normalizedCubeMeasure_middleChildCube] + +private theorem mul_euclideanENorm_le_euclideanENorm_of_mul_le {d : ℕ} + (c : ℝ≥0∞) (a b : Fin d → ℝ≥0∞) (h : ∀ i, c * a i ≤ b i) : + c * (∑ i : Fin d, a i ^ 2) ^ ((2 : ℝ)⁻¹) ≤ + (∑ i : Fin d, b i ^ 2) ^ ((2 : ℝ)⁻¹) := by + have hsquares : c ^ 2 * ∑ i : Fin d, a i ^ 2 ≤ ∑ i : Fin d, b i ^ 2 := by + rw [Finset.mul_sum] + apply Finset.sum_le_sum + intro i _ + calc + c ^ 2 * a i ^ 2 = (c * a i) ^ 2 := by ring + _ ≤ b i ^ 2 := pow_le_pow_left' (h i) 2 + calc + c * (∑ i : Fin d, a i ^ 2) ^ ((2 : ℝ)⁻¹) = + (c ^ 2 * ∑ i : Fin d, a i ^ 2) ^ ((2 : ℝ)⁻¹) := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by norm_num)] + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + _ ≤ (∑ i : Fin d, b i ^ 2) ^ ((2 : ℝ)⁻¹) := by + apply ENNReal.rpow_le_rpow hsquares + norm_num + +private noncomputable def exactOverlapRootMeanVec {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hF : ExactOverlapEuclideanIntegrable Q F) : Vec d := + fun i => exactOverlapRootMean Q (fun x => F x i) (hF.coordinate i).root + +private theorem exactOverlapRootWeight_mul_rootFluctuation_le_seminorm + {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) + (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) : + let hI := exactOverlapEuclideanIntegrable_of_euclidean_memLp Q F hF + exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => HilbertVec.ofVec (F x - exactOverlapRootMeanVec Q F hI)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + exactOverlapEuclideanSeminormTwo s Q F hI := by + let hI := exactOverlapEuclideanIntegrable_of_euclidean_memLp Q F hF + let M := exactOverlapRootMeanVec Q F hI + have hresidual : MemLp (fun x => HilbertVec.ofVec (F x - M)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hsub := hF.sub (memLp_const (HilbertVec.ofVec M)) + simpa only [Pi.sub_apply, map_sub] using! hsub + change exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => HilbertVec.ofVec (F x - M)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) ≤ + exactOverlapEuclideanSeminormTwo s Q F hI + rw [eLpNorm_hilbertVec_two_eq_coordinateENorm _ hresidual, + exactOverlapEuclideanSeminormTwo_eq] + apply mul_euclideanENorm_le_euclideanENorm_of_mul_le + intro i + change exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => F x i - M i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) ≤ + exactOverlapFiniteSeminorm (exactOverlapTwoParameters s) Q (fun x => F x i) + (hI.coordinate i) + rw [show M i = exactOverlapRootMean Q (fun x => F x i) + (hI.coordinate i).root by rfl] + rw [← exactOverlapLocalOscillation_middleChildCube_two Q (fun x => F x i) + (hI.coordinate i)] + exact exactOverlapRootWeight_mul_localOscillation_le_finiteSeminorm s Q + (fun x => F x i) (hI.coordinate i) + +private theorem eLpNorm_hilbertVec_le_residual_add_const {d : ℕ} + {Q : TriadicCube d} (F : Vec d → Vec d) (M : Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) : + eLpNorm (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) ≤ + eLpNorm (fun x => HilbertVec.ofVec (F x - M)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) + + eLpNorm (fun _ : Vec d => HilbertVec.ofVec M) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hresidual : MemLp (fun x => HilbertVec.ofVec (F x - M)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) := by + have hsub := hF.sub (memLp_const (HilbertVec.ofVec M)) + simpa only [Pi.sub_apply, map_sub] using! hsub + have hadd := eLpNorm_add_le + (f := fun x => HilbertVec.ofVec (F x - M)) + (g := fun _ : Vec d => HilbertVec.ofVec M) (μ := normalizedCubeMeasure Q) + (show (1 : ℝ≥0∞) ≤ 2 by norm_num) + rw [show (fun x => HilbertVec.ofVec (F x)) = + (fun x => HilbertVec.ofVec (F x - M)) + + (fun _ : Vec d => HilbertVec.ofVec M) by + funext x + change HilbertVec.ofVec (F x) = + HilbertVec.ofVec (F x - M) + HilbertVec.ofVec M + apply HilbertVec.ext + intro i + simp [HilbertVec.ofVec, PiLp.toLp_apply]] + exact hadd + +private theorem eLpNorm_const_rootMeanVec_eq {d : ℕ} (Q : TriadicCube d) + (F : Vec d → Vec d) (hI : ExactOverlapEuclideanIntegrable Q F) : + eLpNorm (fun _ : Vec d => HilbertVec.ofVec (exactOverlapRootMeanVec Q F hI)) + (2 : ℝ≥0∞) (normalizedCubeMeasure Q) = + exactOverlapEuclideanRootMeanENorm Q F hI := by + let M := exactOverlapRootMeanVec Q F hI + calc + eLpNorm (fun _ : Vec d => HilbertVec.ofVec M) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q) = ‖HilbertVec.ofVec M‖ₑ := by + rw [eLpNorm_const _ (by norm_num) (normalizedCubeMeasure_ne_zero Q)] + simp only [normalizedCubeMeasure_apply_univ, ENNReal.toReal_ofNat, one_div] + simp + _ = ENNReal.ofReal (euclideanNorm M) := by + rw [euclideanNorm_eq_norm_ofVec, ofReal_norm] + _ = exactOverlapEuclideanRootMeanENorm Q F hI := by + rw [exactOverlapEuclideanRootMeanENorm_eq_ofReal_euclideanNorm] + rfl + +private theorem mul_le_add_mul_of_le_add_of_mul_le (w x y z b : ℝ≥0∞) + (hxy : x ≤ y + z) (hy : w * y ≤ b) : w * x ≤ b + w * z := by + calc + w * x ≤ w * (y + z) := by gcongr + _ = w * y + w * z := by rw [mul_add] + _ ≤ b + w * z := by gcongr + +/-- The root-weighted normalized Euclidean `L²` norm is controlled by the +exact Euclidean overlap full norm. -/ +theorem exactOverlapRootWeight_mul_eLpNorm_le_exactOverlapEuclideanNormTwo + {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) + (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure Q)) : + let hI := exactOverlapEuclideanIntegrable_of_euclidean_memLp Q F hF + exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q) ≤ + exactOverlapEuclideanNormTwo s Q F hI := by + let hI := exactOverlapEuclideanIntegrable_of_euclidean_memLp Q F hF + let M := exactOverlapRootMeanVec Q F hI + have htriangle := eLpNorm_hilbertVec_le_residual_add_const F M hF + have hconstant := eLpNorm_const_rootMeanVec_eq Q F hI + have hfluctuation := + exactOverlapRootWeight_mul_rootFluctuation_le_seminorm s Q F hF + change exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => HilbertVec.ofVec (F x)) 2 (normalizedCubeMeasure Q) ≤ + exactOverlapEuclideanNormTwo s Q F hI + rw [exactOverlapEuclideanNormTwo_eq] + calc + exactOverlapRootWeight Q s.1 * + eLpNorm (fun x => HilbertVec.ofVec (F x)) 2 + (normalizedCubeMeasure Q) ≤ + exactOverlapEuclideanSeminormTwo s Q F hI + + exactOverlapRootWeight Q s.1 * + eLpNorm (fun _ : Vec d => HilbertVec.ofVec M) 2 + (normalizedCubeMeasure Q) := + mul_le_add_mul_of_le_add_of_mul_le _ _ _ _ _ htriangle hfluctuation + _ = exactOverlapEuclideanSeminormTwo s Q F hI + + exactOverlapRootWeight Q s.1 * + exactOverlapEuclideanRootMeanENorm Q F hI := by rw [hconstant] + +namespace UnitCubeEuclideanL2Field + +/-- The canonical exact-overlap integrability certificate carried by a +Euclidean `L²` field on the centered unit cube. -/ +theorem exactOverlapEuclideanIntegrable {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + ExactOverlapEuclideanIntegrable (originCube d 0) F := by + apply exactOverlapEuclideanIntegrable_of_euclidean_memLp + rw [← unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure] + exact F.euclideanMemL2 + +end UnitCubeEuclideanL2Field + +/-- On the centered unit cube, the exact overlap full norm controls the +source-facing normalized Euclidean `L²` norm with constant exactly one. -/ +theorem unitCube_normalizedEuclideanLpENorm_le_exactOverlapEuclideanNormTwo + {d : ℕ} (s : FractionalOrder) (F : UnitCubeEuclideanL2Field d) : + (unitCenteredCubeDomain d).normalizedEuclideanLpENorm 2 F ≤ + exactOverlapEuclideanNormTwo s (originCube d 0) F + F.exactOverlapEuclideanIntegrable := by + have hmem : MemLp (fun x => HilbertVec.ofVec (F x)) (2 : ℝ≥0∞) + (normalizedCubeMeasure (originCube d 0)) := by + rw [← unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure] + exact F.euclideanMemL2 + have h := exactOverlapRootWeight_mul_eLpNorm_le_exactOverlapEuclideanNormTwo + s (originCube d 0) F hmem + unfold BoundedMeasurableDomain.normalizedEuclideanLpENorm + have hmeas : AEStronglyMeasurable (fun x => euclideanNorm (F x)) + (unitCenteredCubeDomain d).normalizedVolume := by + simpa only [euclideanNorm_eq_norm_ofVec] using F.euclideanMemL2.norm.aestronglyMeasurable + rw [BoundedMeasurableDomain.normalizedLpENorm_eq_eLpNorm _ _ _ hmeas, + unitCenteredCubeDomain_normalizedVolume_eq_normalizedCubeMeasure] + simp only [euclideanNorm_eq_norm_ofVec] + rw [eLpNorm_norm (fun x => HilbertVec.ofVec (F x)) hmem.aestronglyMeasurable] + simpa only [exactOverlapRootWeight, + originCube, Int.cast_zero, neg_zero, zero_mul, ENNReal.rpow_zero, one_mul] using h + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePAveraging.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePAveraging.lean new file mode 100644 index 0000000000..aa9a4698ae --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePAveraging.lean @@ -0,0 +1,855 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradient +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingGradientExplicit +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.AveragingResidual +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ConvexApproxGagliardoSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapEuclideanLpComparison +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.CubeVector + +/-! +# Finite-`p` synchronized overlap averaging + +This module packages the concrete smooth overlap average simultaneously as an +`H¹` and a finite-`W¹ᵖ` vector field. The two witnesses have literally the +same field and the same coordinate derivative matrix. The remaining +one-depth estimates are stated against the direct Euclidean overlap energy, +so later Calderón--Zygmund interpolation can use them without introducing a +separate `K`-functional carrier. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- The rooted direct Euclidean overlap energy at one depth. Its `p`-th +power is exactly the unweighted `j` summand in +`cubeEuclideanPositiveBesovOverlapESeminorm`. -/ +noncomputable def cubeEuclideanPositiveBesovOverlapDepthENorm {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) : ℝ≥0∞ := + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ p.exponent.toReal)) ^ + (p.exponent.toReal)⁻¹ + +/-- Nonnegativity of the rooted one-depth Euclidean overlap energy. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_nonneg {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) : + 0 ≤ cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j := + bot_le + +/-- Raising the rooted depth energy to `p` recovers its unrooted finite +overlap average exactly. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_rpow {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ p.exponent.toReal = + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ p.exponent.toReal) := by + unfold cubeEuclideanPositiveBesovOverlapDepthENorm + rw [ENNReal.rpow_inv_rpow] + exact ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne |>.ne' + +/-- The complete overlap energy is the weighted sum of the rooted depth +energies. This is the precise connection used by the later one-level +Calderón--Zygmund estimate. -/ +theorem cubeEuclideanPositiveBesovOverlapPowerEnergy_eq_tsum_depthENorm {d : ℕ} + (Q : TriadicCube d) (s : FractionalOrder) (p : FiniteLpExponent) + (F : Vec d → Vec d) : + cubeEuclideanPositiveBesovOverlapPowerEnergy Q s p F = + ∑' j : ℕ, + ENNReal.ofReal + (Real.rpow 3 + (-(s.1 * p.exponent.toReal * + (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ + p.exponent.toReal := by + unfold cubeEuclideanPositiveBesovOverlapPowerEnergy + apply tsum_congr + intro j + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + rw [mul_assoc] + +/-- The powered overlap fluctuation is measurable on the parent cube whenever +the input has the corresponding local finite-`p` membership. -/ +private theorem aemeasurable_overlapCubeHilbertResidualIndicator_of_memLp + {d : ℕ} {Q S : TriadicCube d} {j : ℕ} {h : Vec d → Vec d} + (p : FiniteLpExponent) (hS : S ∈ ScalarOverlap.centersAtDepth Q j) + (hh : MemLp (fun y => HilbertVec.ofVec (h y)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + AEMeasurable + ((ScalarOverlap.cubeSet S).indicator + (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal)) + (volume.restrict (cubeSet Q)) := by + let μS : Measure (Vec d) := volume.restrict (ScalarOverlap.cubeSet S) + have hcoeff : ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 + (inv_pos.mpr (ScalarOverlap.cubeVolume_pos S)) + have hh_vol : AEMeasurable (fun y => HilbertVec.ofVec (h y)) μS := by + have hh_norm : AEMeasurable (fun y => HilbertVec.ofVec (h y)) + (ScalarOverlap.normalizedCubeMeasure S) := + hh.1.aemeasurable + simpa [μS, ScalarOverlap.normalizedCubeMeasure, ScalarOverlap.cubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := volume.restrict (ScalarOverlap.cubeSet S)) + (f := fun y => HilbertVec.ofVec (h y)) hcoeff).1 hh_norm + have hmap : Measurable (fun v : HilbertVec d => + ‖v - HilbertVec.ofVec (ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) := by + fun_prop + have hbase : AEMeasurable + (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) μS := by + simpa only [map_sub] using! hmap.comp_aemeasurable hh_vol + have hsubset : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + refine (aemeasurable_indicator_iff (ScalarOverlap.measurableSet_cubeSet S)).2 ?_ + rwa [Measure.restrict_restrict_of_subset hsubset] + +/-- The finite concave power-sum estimate used only in the subquadratic branch +of the private square-lift argument. -/ +private theorem ennreal_rpow_finset_sum_le_sum_rpow {ι : Type*} + (s : Finset ι) (a : ι → ℝ≥0∞) {r : ℝ} (hr0 : 0 < r) (hr1 : r ≤ 1) : + (s.sum a) ^ r ≤ s.sum (fun i => (a i) ^ r) := by + induction s using Finset.cons_induction with + | empty => + simp only [Finset.sum_empty, ENNReal.zero_rpow_of_pos hr0] + exact le_rfl + | cons x s hx ih => + rw [Finset.sum_cons, Finset.sum_cons] + calc + (a x + s.sum a) ^ r ≤ (a x) ^ r + (s.sum a) ^ r := + ENNReal.rpow_add_le_add_rpow _ _ hr0.le hr1 + _ ≤ (a x) ^ r + s.sum (fun i => (a i) ^ r) := + by simpa [add_comm] using add_le_add_left ih ((a x) ^ r) + +private theorem enorm_sq_eq_ofReal_sq (z : ℝ) : + ‖z‖ₑ ^ (2 : ℕ) = ENNReal.ofReal (z ^ 2) := by + rw [Real.enorm_eq_ofReal_abs, ← ENNReal.ofReal_pow (abs_nonneg z), sq_abs] + +private theorem hilbertMat_norm_sq_eq_sum_sq {d : ℕ} (A : HilbertMat d) : + ‖A‖ ^ 2 = ∑ i : Fin d, ∑ k : Fin d, A i k ^ 2 := by + rw [← real_inner_self_eq_norm_sq, HilbertMat.inner_def] + simp only [pow_two] + +private theorem enorm_rpow_eq_ofReal_norm_sq_rpow {E : Type*} + [NormedAddCommGroup E] (v : E) {q : ℝ} : + ‖v‖ₑ ^ q = (ENNReal.ofReal (‖v‖ ^ 2)) ^ (q / 2) := by + rw [← ofReal_norm, ENNReal.ofReal_pow (norm_nonneg _), + ← ENNReal.rpow_natCast, + ← ENNReal.rpow_mul] + congr 1 + ring + +/-- Private scalar square-lift for the overlap-average derivative. The +subquadratic and superquadratic finite-center estimates are separated only +inside this proof. -/ +private theorem enorm_rpow_euclideanCoordDeriv_averagingField_coord_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + {x : Vec d} (hx : x ∈ openCubeSet Q) (i k : Fin d) : + ‖euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x‖ₑ ^ + p.exponent.toReal ≤ + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ + (p.exponent.toReal / 2) * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ + (p.exponent.toReal / 2 - 1)) * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) := by + classical + let r : ℝ := p.exponent.toReal / 2 + let a : TriadicCube d → ℝ≥0∞ := fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ENNReal.ofReal ((h y i - ScalarOverlap.cubeAverageVec S h i) ^ 2)) x + let K : ℝ≥0∞ := ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2) + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let A : Finset (TriadicCube d) := overlapCentersAtDepthContaining Q j x + have hp_pos : 0 < p.exponent.toReal := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne + have hr_pos : 0 < r := by dsimp [r]; positivity + have hsq : ENNReal.ofReal + ((euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x) ^ 2) ≤ + K * D.sum a := by + simpa [K, D, a] using! + P.ofReal_euclideanCoordDeriv_averagingField_coord_sq_le h hx i k + have hpower := ENNReal.rpow_le_rpow hsq hr_pos.le + have hactive_sum : D.sum a = A.sum a := by + symm + apply Finset.sum_subset + · intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp hS).1 + · intro S hSD hSnot + have hxS : x ∉ ScalarOverlap.cubeSet S := by + intro hxS + exact hSnot (mem_overlapCentersAtDepthContaining_iff.mpr ⟨hSD, hxS⟩) + simp [Set.indicator_of_notMem hxS] + have hsum : (D.sum a) ^ r ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (r - 1)) * + D.sum (fun S => (a S) ^ r) := by + by_cases hp_two : p.exponent.toReal ≤ 2 + · rw [if_pos hp_two, one_mul] + calc + (D.sum a) ^ r = (A.sum a) ^ r := by rw [hactive_sum] + _ ≤ A.sum (fun S => (a S) ^ r) := + ennreal_rpow_finset_sum_le_sum_rpow A a hr_pos (by + dsimp [r] + linarith) + _ ≤ D.sum (fun S => (a S) ^ r) := by + apply Finset.sum_le_sum_of_subset_of_nonneg + · intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp hS).1 + · intro S _hS _hnot + exact bot_le + · rw [if_neg hp_two] + have hr_one : 1 ≤ r := by dsimp [r]; linarith + have hactive := ENNReal.rpow_sum_le_const_mul_sum_rpow (s := A) (f := a) hr_one + have hcard : (A.card : ℝ≥0∞) ≤ (3 ^ d : ℝ≥0∞) := by + exact_mod_cast overlapCentersAtDepthContaining_card_le_pow Q j x + have hpow_nonneg : 0 ≤ r - 1 := sub_nonneg.mpr hr_one + have hcard_rpow : (A.card : ℝ≥0∞) ^ (r - 1) ≤ + (3 ^ d : ℝ≥0∞) ^ (r - 1) := + ENNReal.rpow_le_rpow hcard hpow_nonneg + have hsum_mono : A.sum (fun S => (a S) ^ r) ≤ D.sum (fun S => (a S) ^ r) := by + apply Finset.sum_le_sum_of_subset_of_nonneg + · intro S hS + exact (mem_overlapCentersAtDepthContaining_iff.mp hS).1 + · intro S _hS _hnot + exact bot_le + calc + (D.sum a) ^ r = (A.sum a) ^ r := by rw [hactive_sum] + _ ≤ (A.card : ℝ≥0∞) ^ (r - 1) * A.sum (fun S => (a S) ^ r) := hactive + _ ≤ (3 ^ d : ℝ≥0∞) ^ (r - 1) * A.sum (fun S => (a S) ^ r) := + mul_le_mul_left hcard_rpow _ + _ ≤ (3 ^ d : ℝ≥0∞) ^ (r - 1) * D.sum (fun S => (a S) ^ r) := + mul_le_mul_right hsum_mono ((3 ^ d : ℝ≥0∞) ^ (r - 1)) + have hterm : ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + (a S) ^ r ≤ + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x := by + intro S _hS + by_cases hxS : x ∈ ScalarOverlap.cubeSet S + · dsimp [a] + rw [Set.indicator_of_mem hxS, Set.indicator_of_mem hxS] + have hscalar : ENNReal.ofReal + ((h x i - ScalarOverlap.cubeAverageVec S h i) ^ 2) = + ‖h x i - ScalarOverlap.cubeAverageVec S h i‖ₑ ^ (2 : ℕ) := by + exact (enorm_sq_eq_ofReal_sq _).symm + have hr : (2 : ℝ) * r = p.exponent.toReal := by dsimp [r]; ring + calc + (ENNReal.ofReal ((h x i - ScalarOverlap.cubeAverageVec S h i) ^ 2)) ^ r = + ‖h x i - ScalarOverlap.cubeAverageVec S h i‖ₑ ^ p.exponent.toReal := by + rw [hscalar, ← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + exact congrArg (fun z : ℝ => + ‖h x i - ScalarOverlap.cubeAverageVec S h i‖ₑ ^ z) hr + _ ≤ ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal := + ENNReal.rpow_le_rpow + (by + rw [Real.enorm_eq_ofReal_abs, ← ofReal_norm] + exact ENNReal.ofReal_le_ofReal (by + simpa [Pi.sub_apply, euclideanNorm_eq_norm_ofVec] using + (abs_coordinate_le_euclideanNorm + (h x - ScalarOverlap.cubeAverageVec S h) i))) + ENNReal.toReal_nonneg + · dsimp [a] + rw [Set.indicator_of_notMem hxS, Set.indicator_of_notMem hxS] + simp [ENNReal.zero_rpow_of_pos hr_pos] + have hleft : ‖euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x‖ₑ ^ + p.exponent.toReal = + (ENNReal.ofReal + ((euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x) ^ 2)) ^ r := by + calc + ‖euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x‖ₑ ^ + p.exponent.toReal = + (‖euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x‖ₑ ^ + (2 : ℝ)) ^ r := by + rw [← ENNReal.rpow_mul] + congr 1 + dsimp [r] + ring + _ = (ENNReal.ofReal + ((euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x) ^ 2)) ^ r := by + congr 1 + norm_num + exact enorm_sq_eq_ofReal_sq _ + rw [hleft] + calc + (ENNReal.ofReal + ((euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x) ^ 2)) ^ r ≤ + (K * D.sum a) ^ r := hpower + _ = K ^ r * (D.sum a) ^ r := + ENNReal.mul_rpow_of_nonneg _ _ hr_pos.le + _ ≤ K ^ r * + ((if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (r - 1)) * + D.sum (fun S => (a S) ^ r)) := by + exact mul_le_mul_right hsum (K ^ r) + _ ≤ K ^ r * + ((if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (r - 1)) * + D.sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x)) := by + apply mul_le_mul_right + apply mul_le_mul_right + apply Finset.sum_le_sum + intro S hS + exact hterm S hS + _ = _ := by simp [K, D, r, mul_assoc] + +private theorem enorm_rpow_averagingField_jacobian_le + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + ‖HilbertMat.ofMat (fun i k => + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x)‖ₑ ^ + p.exponent.toReal ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ + (p.exponent.toReal / 2) * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) := by + classical + let G : Mat d := fun i k => + euclideanCoordDeriv k (fun y : Vec d => P.averagingField h y i) x + let r : ℝ := p.exponent.toReal / 2 + let E : Fin d × Fin d → ℝ≥0∞ := fun z => + ENNReal.ofReal (G z.1 z.2 ^ 2) + let F : ℝ≥0∞ := (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) + let B : ℝ≥0∞ := + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ r * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (r - 1)) + have hp_pos : 0 < p.exponent.toReal := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne + have hr_pos : 0 < r := by dsimp [r]; positivity + have hE : ∀ z : Fin d × Fin d, (E z) ^ r ≤ B * F := by + intro z + change (ENNReal.ofReal (G z.1 z.2 ^ 2)) ^ r ≤ B * F + have heq : (ENNReal.ofReal (G z.1 z.2 ^ 2)) ^ r = + ‖G z.1 z.2‖ₑ ^ p.exponent.toReal := by + rw [(enorm_sq_eq_ofReal_sq _).symm, ← ENNReal.rpow_natCast, + ← ENNReal.rpow_mul] + exact congrArg (fun t : ℝ => ‖G z.1 z.2‖ₑ ^ t) (by + dsimp [r] + ring) + rw [heq] + simpa [F, B, G, r] using + enorm_rpow_euclideanCoordDeriv_averagingField_coord_le P h p hx z.1 z.2 + have hmatrix_sq : ENNReal.ofReal + (‖HilbertMat.ofMat G‖ ^ 2) = ∑ z : Fin d × Fin d, E z := by + rw [hilbertMat_norm_sq_eq_sum_sq] + change ENNReal.ofReal (∑ i : Fin d, ∑ k : Fin d, G i k ^ 2) = _ + rw [ENNReal.ofReal_sum_of_nonneg] + · rw [show (Finset.univ : Finset (Fin d × Fin d)) = + (Finset.univ : Finset (Fin d)) ×ˢ Finset.univ by + ext z + simp, + Finset.sum_product] + apply Finset.sum_congr rfl + intro i _ + rw [ENNReal.ofReal_sum_of_nonneg] + · intro k _ + exact sq_nonneg _ + · intro i _ + exact Finset.sum_nonneg fun k _ => sq_nonneg _ + have hsum_rpow : (∑ z : Fin d × Fin d, E z) ^ r ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r - 1)) * + ∑ z : Fin d × Fin d, (E z) ^ r := by + by_cases hp_two : p.exponent.toReal ≤ 2 + · rw [if_pos hp_two, one_mul] + exact ennreal_rpow_finset_sum_le_sum_rpow Finset.univ E hr_pos (by + dsimp [r] + linarith) + · rw [if_neg hp_two] + apply ENNReal.rpow_sum_le_const_mul_sum_rpow + dsimp [r] + linarith + have hsum_entries : ∑ z : Fin d × Fin d, (E z) ^ r ≤ + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * (B * F) := by + calc + ∑ z : Fin d × Fin d, (E z) ^ r ≤ ∑ _z : Fin d × Fin d, B * F := by + apply Finset.sum_le_sum + intro z _ + exact hE z + _ = (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * (B * F) := by + simp [Finset.sum_const, nsmul_eq_mul] + have hleft : ‖HilbertMat.ofMat G‖ₑ ^ p.exponent.toReal = + (ENNReal.ofReal (‖HilbertMat.ofMat G‖ ^ 2)) ^ r := by + simpa [r] using + enorm_rpow_eq_ofReal_norm_sq_rpow + (HilbertMat.ofMat G) (q := p.exponent.toReal) + rw [hleft, hmatrix_sq] + calc + (∑ z : Fin d × Fin d, E z) ^ r ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r - 1)) * + ∑ z : Fin d × Fin d, (E z) ^ r := hsum_rpow + _ ≤ (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r - 1)) * + ((Fintype.card (Fin d × Fin d) : ℝ≥0∞) * (B * F)) := by + exact mul_le_mul_right hsum_entries _ + _ = _ := by simp [B, F, r, mul_assoc] + +/-- Weighted Jensen for the concrete partition, with the weights then absorbed +by their overlap-cube supports. -/ +private theorem enorm_rpow_sub_averagingField_le_sum_overlap_indicator + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + {x : Vec d} (hx : x ∈ openCubeSet Q) : + ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ₑ ^ p.exponent.toReal ≤ + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator + (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) := by + classical + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let w : TriadicCube d → ℝ := fun S => P.weight S x + let F : TriadicCube d → HilbertVec d := fun S => + HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h) + have hvec : h x - P.averagingField h x = + D.sum (fun S => w S • (h x - ScalarOverlap.cubeAverageVec S h)) := by + funext i + simpa [D, w, Pi.smul_apply, Finset.sum_apply] using! + P.sub_averagingField_apply_eq_sum_weighted_overlap_fluctuation h hx i + have hres : HilbertVec.ofVec (h x - P.averagingField h x) = + D.sum (fun S => w S • F S) := by + change (HilbertVec.ofVecL d) (h x - P.averagingField h x) = _ + rw [hvec, map_sum] + simp only [map_smul, HilbertVec.ofVecL_apply, F] + have hw_nonneg : ∀ S ∈ D, 0 ≤ w S := by + intro S hS + exact P.nonneg (by simpa [D] using! hS) hx + have hw_sum : ∑ S ∈ D, w S = 1 := by + simpa [D, w] using! P.sum_eq_one hx + have hp_one : 1 ≤ p.exponent.toReal := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.lt_top.ne p.one_lt.le + have hp_nonneg : 0 ≤ p.exponent.toReal := + le_trans zero_le_one hp_one + have hJensen := + (convexOn_norm_rpow hp_one).map_sum_le + (t := D) (w := w) (p := F) hw_nonneg hw_sum + (fun S _hS => Set.mem_univ (F S)) + have hreal : ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ ^ + p.exponent.toReal ≤ + D.sum (fun S => w S * ‖F S‖ ^ p.exponent.toReal) := by + simpa [hres, smul_eq_mul] using hJensen + have hterm_nonneg : ∀ S ∈ D, 0 ≤ w S * ‖F S‖ ^ p.exponent.toReal := by + intro S hS + exact mul_nonneg (hw_nonneg S hS) (Real.rpow_nonneg (norm_nonneg _) _) + have hweighted : + ENNReal.ofReal + (‖HilbertVec.ofVec (h x - P.averagingField h x)‖ ^ + p.exponent.toReal) ≤ + D.sum (fun S => ENNReal.ofReal (w S * ‖F S‖ ^ p.exponent.toReal)) := by + rw [← ENNReal.ofReal_sum_of_nonneg hterm_nonneg] + exact ENNReal.ofReal_le_ofReal hreal + have hterm_le : ∀ S ∈ D, + ENNReal.ofReal (w S * ‖F S‖ ^ p.exponent.toReal) ≤ + (ScalarOverlap.cubeSet S).indicator + (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x := by + intro S hS + by_cases hxS : x ∈ ScalarOverlap.cubeSet S + · rw [Set.indicator_of_mem hxS] + rw [ENNReal.ofReal_mul (hw_nonneg S hS)] + change ENNReal.ofReal (w S) * ENNReal.ofReal (‖F S‖ ^ p.exponent.toReal) ≤ + ‖F S‖ₑ ^ p.exponent.toReal + rw [← ofReal_norm (F S), + ← ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hp_nonneg] + have hw : ENNReal.ofReal (w S) ≤ 1 := by + simpa [w] using ENNReal.ofReal_le_ofReal + (P.weight_le_one_of_mem_openCubeSet (by simpa [D] using! hS) hx) + calc + ENNReal.ofReal (w S) * ENNReal.ofReal ‖F S‖ ^ p.exponent.toReal ≤ + 1 * ENNReal.ofReal ‖F S‖ ^ p.exponent.toReal := + mul_le_mul_left hw (ENNReal.ofReal ‖F S‖ ^ p.exponent.toReal) + _ = ENNReal.ofReal ‖F S‖ ^ p.exponent.toReal := one_mul _ + · have hw_zero : w S = 0 := by + apply Classical.byContradiction + intro hne + have hmem : x ∈ openOverlapCubeSet S := + P.support_subset (by simpa [D] using! hS) hx hne + exact hxS (openOverlapCubeSet_subset_overlapCubeSet S hmem) + simp [hw_zero, hxS] + have hleft : + ENNReal.ofReal + (‖HilbertVec.ofVec (h x - P.averagingField h x)‖ ^ + p.exponent.toReal) = + ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ₑ ^ p.exponent.toReal := by + rw [← ofReal_norm, + ← ENNReal.ofReal_rpow_of_nonneg (norm_nonneg _) hp_nonneg] + rw [← hleft] + exact hweighted.trans (Finset.sum_le_sum fun S hS => hterm_le S hS) + +/-- Parent-cube finite-`p` membership restricts to every retained overlap +cube, including for the Euclidean Hilbert realization of a vector field. -/ +private theorem memLp_hilbert_overlap_of_memLp {d : ℕ} + {Q : TriadicCube d} {p : ℝ≥0∞} {h : Vec d → Vec d} + (hh : MemLp (fun x => HilbertVec.ofVec (h x)) p (normalizedCubeMeasure Q)) + {j : ℕ} {S : TriadicCube d} (hS : S ∈ ScalarOverlap.centersAtDepth Q j) : + MemLp (fun x => HilbertVec.ofVec (h x)) p + (ScalarOverlap.normalizedCubeMeasure S) := by + have hsub : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + have hdom : ScalarOverlap.normalizedCubeMeasure S ≤ + (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) • normalizedCubeMeasure Q := by + rw [ScalarOverlap.normalizedCubeMeasure, normalizedCubeMeasure, smul_smul] + have hvolQ : (0 : ℝ) < cubeVolume Q := cubeVolume_pos Q + have hcancel : ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal (cubeVolume Q)⁻¹ = + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ := by + rw [mul_assoc, ← ENNReal.ofReal_mul hvolQ.le, + mul_inv_cancel₀ hvolQ.ne', ENNReal.ofReal_one, mul_one] + rw [hcancel] + refine Measure.le_iff'.2 fun A => ?_ + simp only [Measure.smul_apply, smul_eq_mul] + refine mul_le_mul_right ?_ _ + rw [ScalarOverlap.cubeMeasure, cubeMeasure] + exact Measure.le_iff'.1 (Measure.restrict_mono hsub le_rfl) A + have hfin : (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top + exact ((hh.smul_measure hfin).mono_measure hdom) + +/-- The powered finite-`p` residual of the concrete average is controlled by +the direct Euclidean overlap energy at the same depth. -/ +theorem lintegral_enorm_rpow_sub_averagingField_le_overlapDepthENorm_rpow + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + (hh : MemLp (fun x => HilbertVec.ofVec (h x)) p.exponent + (normalizedCubeMeasure Q)) : + ∫⁻ x, ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ₑ ^ p.exponent.toReal + ∂ normalizedCubeMeasure Q ≤ + (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal := by + classical + let Fsum : Vec d → ℝ≥0∞ := fun x => + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator + (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) + have hpoint : + (fun x => ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ₑ ^ + p.exponent.toReal) ≤ᵐ[normalizedCubeMeasure Q] fun x => Fsum x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [Fsum] using + enorm_rpow_sub_averagingField_le_sum_overlap_indicator P h p hx + have hoverlap : ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q ≤ + (3 ^ d : ℝ≥0∞) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S)) := by + simpa [Fsum] using! + overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + (Q := Q) (j := j) + (f := fun S x => + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) + (fun S hS => + aemeasurable_overlapCubeHilbertResidualIndicator_of_memLp p hS + (memLp_hilbert_overlap_of_memLp hh hS)) + calc + ∫⁻ x, ‖HilbertVec.ofVec (h x - P.averagingField h x)‖ₑ ^ p.exponent.toReal + ∂ normalizedCubeMeasure Q ≤ + ∫⁻ x, Fsum x ∂ normalizedCubeMeasure Q := + lintegral_mono_ae hpoint + _ ≤ (3 ^ d : ℝ≥0∞) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S)) := hoverlap + _ = (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal := by + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + congr 2 + symm + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec + (h x - ScalarOverlap.cubeAverageVec S.1 h)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec + (h x - ScalarOverlap.cubeAverageVec S.1 h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S.1) := by + apply Finset.sum_congr rfl + intro S _hS + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne, + ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + _ = (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S) := + Finset.sum_attach (ScalarOverlap.centersAtDepth Q j) (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S) + +namespace SmoothOverlapPartition + +/-- The concrete smooth overlap average as a finite-`W^{1,p}` vector field. +It intentionally reuses the field formula of `averagingCompetitor`; only the +Sobolev witness changes. -/ +noncomputable def averagingCompetitorW1p {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) : + CubeVectorW1pFunction Q p where + coord := fun i => + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain (p := p.exponent) + (isOpenBoundedConvexDomain_openCubeSet Q) + (P.contDiff_averagingField_coord h i) + +@[simp] theorem averagingCompetitorW1p_toField_apply {d : ℕ} + {Q : TriadicCube d} {j : ℕ} (P : SmoothOverlapPartition Q j) + (h : Vec d → Vec d) (p : FiniteLpExponent) (x : Vec d) (i : Fin d) : + (P.averagingCompetitorW1p h p).toField x i = P.averagingField h x i := + rfl + +@[simp] theorem averagingCompetitorW1p_jacobian_apply {d : ℕ} + {Q : TriadicCube d} {j : ℕ} (P : SmoothOverlapPartition Q j) + (h : Vec d → Vec d) (p : FiniteLpExponent) (x : Vec d) (i k : Fin d) : + (P.averagingCompetitorW1p h p).jacobian x i k = + euclideanCoordDeriv k (fun y => P.averagingField h y i) x := + rfl + +/-- The Hilbert and finite-`p` overlap-average witnesses are synchronized at +the field level. -/ +theorem averagingCompetitors_toField_eq {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) : + (P.averagingCompetitor h).toField = (P.averagingCompetitorW1p h p).toField := by + funext x i + rfl + +/-- The Hilbert and finite-`p` overlap-average witnesses are synchronized at +the derivative level. -/ +theorem averagingCompetitors_grad_eq {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + (x : Vec d) (i k : Fin d) : + ((P.averagingCompetitor h).coord i).grad x k = + (P.averagingCompetitorW1p h p).jacobian x i k := by + rfl + +/-- Pointwise finite-`p` Jacobian control for the concrete overlap-average +formula. The finite-center and finite-matrix losses are dimension-only. -/ +theorem enorm_rpow_averagingCompetitorW1p_jacobian_le {d : ℕ} + {Q : TriadicCube d} {j : ℕ} (P : SmoothOverlapPartition Q j) + (h : Vec d → Vec d) (p : FiniteLpExponent) {x : Vec d} + (hx : x ∈ openCubeSet Q) : + ‖HilbertMat.ofMat ((P.averagingCompetitorW1p h p).jacobian x)‖ₑ ^ + p.exponent.toReal ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ + (p.exponent.toReal / 2) * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) := by + simpa only [averagingCompetitorW1p_jacobian_apply] using! + enorm_rpow_averagingField_jacobian_le P h p hx + +/-- Powered normalized finite-`p` Jacobian estimate for the overlap-average +competitor. The only overlap loss is the dimension-only bounded-overlap +constant; in particular no depth-cardinality appears. -/ +theorem lintegral_enorm_rpow_averagingCompetitorW1p_jacobian_le_depthENorm + {d : ℕ} {Q : TriadicCube d} {j : ℕ} + (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + (hh : MemLp (fun x => HilbertVec.ofVec (h x)) p.exponent + (normalizedCubeMeasure Q)) : + ∫⁻ x, + ‖HilbertMat.ofMat ((P.averagingCompetitorW1p h p).jacobian x)‖ₑ ^ + p.exponent.toReal ∂ normalizedCubeMeasure Q ≤ + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ + (p.exponent.toReal / 2) * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal := by + let C : ℝ≥0∞ := + (if p.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ 2)) ^ + (p.exponent.toReal / 2) * + (if p.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (p.exponent.toReal / 2 - 1)) + let F : Vec d → ℝ≥0∞ := fun x => + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + (ScalarOverlap.cubeSet S).indicator (fun y : Vec d => + ‖HilbertVec.ofVec (h y - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) x) + have hpoint : + (fun x => ‖HilbertMat.ofMat ((P.averagingCompetitorW1p h p).jacobian x)‖ₑ ^ + p.exponent.toReal) ≤ᵐ[normalizedCubeMeasure Q] fun x => C * F x := by + filter_upwards [ae_openCubeSet_normalizedCubeMeasure Q] with x hx + simpa [C, F] using P.enorm_rpow_averagingCompetitorW1p_jacobian_le h p hx + have hoverlap : ∫⁻ x, F x ∂ normalizedCubeMeasure Q ≤ + (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal := by + calc + ∫⁻ x, F x ∂ normalizedCubeMeasure Q ≤ + (3 ^ d : ℝ≥0∞) * + (((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞)⁻¹ * + (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S)) := by + simpa [F] using! + overlapCentersAtDepth_lintegral_sum_indicator_normalizedCubeMeasure_le + (Q := Q) (j := j) + (f := fun S x => + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal) + (fun S hS => + aemeasurable_overlapCubeHilbertResidualIndicator_of_memLp p hS + (memLp_hilbert_overlap_of_memLp hh hS)) + _ = (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal := by + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + congr 2 + symm + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec + (h x - ScalarOverlap.cubeAverageVec S.1 h)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + p.exponent.toReal) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec + (h x - ScalarOverlap.cubeAverageVec S.1 h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S.1) := by + apply Finset.sum_congr rfl + intro S _hS + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne, + ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + _ = (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S) := + Finset.sum_attach (ScalarOverlap.centersAtDepth Q j) (fun S => + ∫⁻ x, + ‖HilbertVec.ofVec (h x - ScalarOverlap.cubeAverageVec S h)‖ₑ ^ + p.exponent.toReal ∂ ScalarOverlap.normalizedCubeMeasure S) + have hC_ne_top : C ≠ ∞ := by + by_cases hp_two : p.exponent.toReal ≤ 2 + · simp only [C, if_pos hp_two, one_mul, mul_one] + apply ENNReal.mul_ne_top (ENNReal.natCast_ne_top _) + apply ENNReal.rpow_ne_top_of_nonneg + · positivity + · exact ENNReal.ofReal_ne_top + · simp only [C, if_neg hp_two] + apply ENNReal.mul_ne_top + · apply ENNReal.mul_ne_top + · apply ENNReal.mul_ne_top + · apply ENNReal.rpow_ne_top_of_nonneg + linarith + exact ENNReal.natCast_ne_top _ + · exact ENNReal.natCast_ne_top _ + · apply ENNReal.rpow_ne_top_of_nonneg + positivity + exact ENNReal.ofReal_ne_top + · apply ENNReal.rpow_ne_top_of_nonneg + linarith + exact ENNReal.pow_ne_top ENNReal.ofNat_ne_top + calc + ∫⁻ x, + ‖HilbertMat.ofMat ((P.averagingCompetitorW1p h p).jacobian x)‖ₑ ^ + p.exponent.toReal ∂ normalizedCubeMeasure Q ≤ + ∫⁻ x, C * F x ∂ normalizedCubeMeasure Q := + lintegral_mono_ae hpoint + _ ≤ C * ∫⁻ x, F x ∂ normalizedCubeMeasure Q := + (lintegral_const_mul' C F hC_ne_top).le + _ ≤ C * ((3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p h j) ^ p.exponent.toReal) := + mul_le_mul_right hoverlap C + _ = _ := by simp [C, mul_assoc] + +/-- Simultaneous Hilbert and finite-`p` witnesses for an input carrying both +integrability classes. The membership assumptions are retained here because +the later residual estimates consume both witnesses from the same datum. -/ +theorem exists_synchronized_averagingCompetitors {d : ℕ} {Q : TriadicCube d} + {j : ℕ} (P : SmoothOverlapPartition Q j) (h : Vec d → Vec d) (p : FiniteLpExponent) + (_h2 : MemLp (fun x => HilbertVec.ofVec (h x)) 2 (normalizedCubeMeasure Q)) + (_hp : MemLp (fun x => HilbertVec.ofVec (h x)) p.exponent + (normalizedCubeMeasure Q)) : + ∃ G2 : CubeVectorH1Function Q, ∃ Gp : CubeVectorW1pFunction Q p, + G2.toField = P.averagingField h ∧ + Gp.toField = P.averagingField h ∧ + ∀ x i k, (G2.coord i).grad x k = Gp.jacobian x i k := by + refine ⟨P.averagingCompetitor h, P.averagingCompetitorW1p h p, rfl, rfl, ?_⟩ + intro x i k + rfl + +end SmoothOverlapPartition + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePDepthTriangle.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePDepthTriangle.lean new file mode 100644 index 0000000000..2ef34aa172 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePDepthTriangle.lean @@ -0,0 +1,249 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging + +/-! +# Finite-`p` exact-overlap depth triangle inequality + +At one overlap depth, the powered direct Euclidean energy is stable under +addition with the usual two-term finite-`p` constant. The proof keeps the +average identity and the local Minkowski step on each overlap cube, before +summing, so no center-cardinality loss is introduced. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem memLp_hilbert_scalarOverlap_of_memLp {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {F : Vec d → Vec d} {p : ℝ≥0∞} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q)) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) : + MemLp (fun x => HilbertVec.ofVec (F x)) p (ScalarOverlap.normalizedCubeMeasure S) := by + have hsub : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + have hdom : ScalarOverlap.normalizedCubeMeasure S ≤ + (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) • normalizedCubeMeasure Q := by + rw [ScalarOverlap.normalizedCubeMeasure, normalizedCubeMeasure, smul_smul] + have hvolQ : (0 : ℝ) < cubeVolume Q := cubeVolume_pos Q + have hcancel : ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal (cubeVolume Q)⁻¹ = + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ := by + rw [mul_assoc, ← ENNReal.ofReal_mul hvolQ.le, + mul_inv_cancel₀ hvolQ.ne', ENNReal.ofReal_one, mul_one] + rw [hcancel] + refine Measure.le_iff'.2 fun A => ?_ + simp only [Measure.smul_apply, smul_eq_mul] + refine mul_le_mul_right ?_ _ + rw [ScalarOverlap.cubeMeasure, cubeMeasure] + exact Measure.le_iff'.1 (Measure.restrict_mono hsub le_rfl) A + have hfin : (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top + exact (hF.smul_measure hfin).mono_measure hdom + +private theorem scalarOverlap_cubeAverageVec_add_of_memLp {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) {F G : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + ScalarOverlap.cubeAverageVec S (fun x => F x + G x) = + ScalarOverlap.cubeAverageVec S F + ScalarOverlap.cubeAverageVec S G := by + funext i + have hFi : MemLp (fun x => F x i) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hF.eval_piLp i + have hGi : MemLp (fun x => G x i) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hG.eval_piLp i + have hFi_int : Integrable (fun x => F x i) (ScalarOverlap.normalizedCubeMeasure S) := + hFi.integrable p.one_lt.le + have hGi_int : Integrable (fun x => G x i) (ScalarOverlap.normalizedCubeMeasure S) := + hGi.integrable p.one_lt.le + show ScalarOverlap.cubeAverage S (fun x => (F x + G x) i) = + ScalarOverlap.cubeAverage S (fun x => F x i) + + ScalarOverlap.cubeAverage S (fun x => G x i) + have hadd : (fun x => (F x + G x) i) = fun x => F x i + G x i := by + funext x + rfl + rw [hadd, ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure, + MeasureTheory.integral_add hFi_int hGi_int, + ← ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure, + ← ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + +private theorem scalarOverlap_residual_add {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) {F G : Vec d → Vec d} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + (fun x => HilbertVec.ofVec + ((F x + G x) - ScalarOverlap.cubeAverageVec S (fun y => F y + G y))) = + fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F) + + HilbertVec.ofVec (G x - ScalarOverlap.cubeAverageVec S G) := by + have havg := scalarOverlap_cubeAverageVec_add_of_memLp S p hF hG + funext x + rw [havg] + change (HilbertVec.ofVecL d) ((F x + G x) - + (ScalarOverlap.cubeAverageVec S F + ScalarOverlap.cubeAverageVec S G)) = + (HilbertVec.ofVecL d) (F x - ScalarOverlap.cubeAverageVec S F) + + (HilbertVec.ofVecL d) (G x - ScalarOverlap.cubeAverageVec S G) + rw [← (HilbertVec.ofVecL d).map_add] + congr 1 + ext i + simp only [Pi.add_apply, Pi.sub_apply] + ring + +private theorem scalarOverlap_residual_memLp {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + MemLp (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + have hconst : MemLp (fun _ : Vec d => HilbertVec.ofVec + (ScalarOverlap.cubeAverageVec S F)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := + memLp_const _ + simpa only [map_sub] using! hF.sub hconst + +/-- The finite-`p` two-term constant after raising the Minkowski inequality to +the `p`-th power. -/ +noncomputable def exactOverlapDepthTriangleConstant (p : FiniteLpExponent) : ℝ≥0∞ := + (2 : ℝ≥0∞) ^ (p.exponent.toReal - 1) + +/-- The powered direct exact-overlap energy at one depth obeys a triangle +inequality with a constant depending only on the finite exponent. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_add_rpow_le {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F G : Vec d → Vec d) (j : ℕ) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure Q)) : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p (fun x => F x + G x) j) ^ + p.exponent.toReal ≤ + exactOverlapDepthTriangleConstant p * + ((cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ p.exponent.toReal + + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p G j) ^ p.exponent.toReal) := by + classical + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let r : ℝ := p.exponent.toReal + have hr_one : 1 ≤ r := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.lt_top.ne p.one_lt.le + have hlocal : ∀ S ∈ D, + eLpNorm (fun x => HilbertVec.ofVec + ((F x + G x) - ScalarOverlap.cubeAverageVec S (fun y => F y + G y))) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) ≤ + eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) + + eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) := by + intro S hS + have hFlocal := memLp_hilbert_scalarOverlap_of_memLp hF (by simpa [D] using hS) + have hGlocal := memLp_hilbert_scalarOverlap_of_memLp hG (by simpa [D] using hS) + rw [scalarOverlap_residual_add S p hFlocal hGlocal] + exact eLpNorm_add_le + (scalarOverlap_residual_memLp S p F hFlocal).aestronglyMeasurable + (scalarOverlap_residual_memLp S p G hGlocal).aestronglyMeasurable p.one_lt.le + have hlocal_power : ∀ S ∈ D, + (eLpNorm (fun x => HilbertVec.ofVec + ((F x + G x) - ScalarOverlap.cubeAverageVec S (fun y => F y + G y))) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r ≤ + exactOverlapDepthTriangleConstant p * + ((eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r + + (eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r) := by + intro S hS + calc + (eLpNorm (fun x => HilbertVec.ofVec + ((F x + G x) - ScalarOverlap.cubeAverageVec S (fun y => F y + G y))) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r ≤ + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) + + eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r := + ENNReal.rpow_le_rpow (hlocal S hS) (by positivity) + _ ≤ exactOverlapDepthTriangleConstant p * + ((eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r + + (eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r) := by + exact ENNReal.rpow_add_le_mul_rpow_add_rpow _ _ hr_one + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow, + cubeEuclideanPositiveBesovOverlapDepthENorm_rpow, + cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + calc + ((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + ((F x + G x) - ScalarOverlap.cubeAverageVec S.1 (fun y => F y + G y))) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r) ≤ + ((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + exactOverlapDepthTriangleConstant p * + ((eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r + + (eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S.1 G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r)) := by + refine mul_le_mul_right ?_ _ + apply Finset.sum_le_sum + intro S _ + exact hlocal_power S.1 S.2 + _ = exactOverlapDepthTriangleConstant p * + (((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r) + + ((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (G x - ScalarOverlap.cubeAverageVec S.1 G)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r)) := by + simp_rw [mul_add] + rw [Finset.sum_add_distrib, ← Finset.mul_sum, ← Finset.mul_sum] + ring + +/-- The one-depth decomposition form of the finite-`p` triangle inequality. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_sub_add_rpow_le {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F G : Vec d → Vec d) (j : ℕ) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) + (hG : MemLp (fun x => HilbertVec.ofVec (G x)) p.exponent + (normalizedCubeMeasure Q)) : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ p.exponent.toReal ≤ + exactOverlapDepthTriangleConstant p * + ((cubeEuclideanPositiveBesovOverlapDepthENorm Q p (fun x => F x - G x) j) ^ + p.exponent.toReal + + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p G j) ^ p.exponent.toReal) := by + have hsub : MemLp (fun x => HilbertVec.ofVec ((F x - G x))) p.exponent + (normalizedCubeMeasure Q) := by + simpa only [map_sub] using! hF.sub hG + have hadd := cubeEuclideanPositiveBesovOverlapDepthENorm_add_rpow_le Q p + (fun x => F x - G x) G j hsub hG + simpa only [sub_add_cancel] using hadd + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePFullCZ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePFullCZ.lean new file mode 100644 index 0000000000..faae4337f9 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePFullCZ.lean @@ -0,0 +1,148 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.CenteredCubeDivergenceRescaling +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePHomogeneity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePOneDepthCZ + +/-! +# Global finite-`p` exact-overlap Calderón--Zygmund estimate + +The one-depth exact-overlap estimate is summed with the source scale weights, +then rooted at the finite exponent. The coefficient scale is removed by +rescaling the datum before applying the one-depth result. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem enorm_inv_eq_ofReal_inv {sigma : ℝ} (hsigma : 0 < sigma) : + ‖sigma⁻¹‖ₑ = (ENNReal.ofReal sigma)⁻¹ := by + rw [Real.enorm_eq_ofReal (inv_nonneg.mpr hsigma.le), + ENNReal.ofReal_inv_of_pos hsigma] + +/-- The global exact-overlap finite-`p` Calderón--Zygmund estimate for a +supplied centered-cube divergence solution. Its constant is fixed before +the cube scale, fractional order, coefficient scale, datum, and solution. -/ +theorem exists_exactOverlapFiniteP_full_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ + ∀ (m : ℤ) (sigma0 : ℝ) (s : FractionalOrder) + (h : CubeEuclideanWspL2Field (originCube d m) s q) + (w : H10Function (openCubeSet (originCube d m))), + 0 < sigma0 → + IsCenteredCubeH10ScalarDivergenceSolution m sigma0 w h.toLpTwo → + cubeEuclideanPositiveBesovOverlapESeminorm (originCube d m) s q + w.toH1Function.grad ≤ + C * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm (originCube d m) s q + h.toField := by + obtain ⟨C, hCtop, hdepth⟩ := exists_exactOverlapFiniteP_oneDepth_cz d q + let r : ℝ := q.exponent.toReal + have hr_pos : 0 < r := + ENNReal.toReal_pos (zero_lt_one.trans q.one_lt).ne' q.lt_top.ne + have hr_nonneg : 0 ≤ r := hr_pos.le + refine ⟨C ^ r⁻¹, + ENNReal.rpow_lt_top_of_nonneg (by positivity) hCtop.ne, ?_⟩ + intro m sigma0 s h w hsigma0 hsolution + let Q : TriadicCube d := originCube d m + let hscaled : Vec d → Vec d := fun x => sigma0⁻¹ • h.toField x + have hscaled_l2 : MemLp (fun x => HilbertVec.ofVec (hscaled x)) 2 + (normalizedCubeMeasure Q) := by + simpa only [hscaled, ← (HilbertVec.ofVecL d).map_smul] using! + h.euclideanMemL2.const_smul sigma0⁻¹ + have hscaled_q : MemLp (fun x => HilbertVec.ofVec (hscaled x)) q.exponent + (normalizedCubeMeasure Q) := by + simpa only [hscaled, ← (HilbertVec.ofVecL d).map_smul] using! + h.euclideanMemLp.const_smul sigma0⁻¹ + have hproblem : CubeDirichletDivergenceProblem Q w hscaled := by + simpa only [Q, hscaled] using + centeredCubeH10ScalarDivergenceSolution_to_cubeDirichletDivergenceProblem + m sigma0 h w hsigma0 hsolution + have hdepth_scaled : ∀ j : ℕ, + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q w.toH1Function.grad j) ^ r ≤ + C * ‖sigma0⁻¹‖ₑ ^ r * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r := by + intro j + have hlocal := hdepth m j hscaled hscaled_l2 hscaled_q w hproblem + have hhom := cubeEuclideanPositiveBesovOverlapDepthENorm_const_smul_rpow + Q q h.toField sigma0⁻¹ h.euclideanMemLp j + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q w.toH1Function.grad j) ^ r ≤ + C * (cubeEuclideanPositiveBesovOverlapDepthENorm Q q hscaled j) ^ r := by + simpa only [Q, hscaled, r] using hlocal + _ = C * ‖sigma0⁻¹‖ₑ ^ r * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r := by + rw [hhom] + ring + have hpower : + (cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad) ^ r ≤ + C * ‖sigma0⁻¹‖ₑ ^ r * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField) ^ r := by + let weight : ℕ → ℝ≥0∞ := fun j => + ENNReal.ofReal (Real.rpow 3 + (-(s.1 * q.exponent.toReal * (((Q.scale - (j : ℤ) : ℤ) : ℝ))))) + rw [cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy, + cubeEuclideanPositiveBesovOverlapESeminorm_rpow_eq_powerEnergy, + cubeEuclideanPositiveBesovOverlapPowerEnergy_eq_tsum_depthENorm, + cubeEuclideanPositiveBesovOverlapPowerEnergy_eq_tsum_depthENorm] + change (∑' j : ℕ, weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q w.toH1Function.grad j) ^ r) ≤ + C * ‖sigma0⁻¹‖ₑ ^ r * ∑' j : ℕ, weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r + calc + (∑' j : ℕ, weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q w.toH1Function.grad j) ^ r) ≤ + ∑' j : ℕ, C * ‖sigma0⁻¹‖ₑ ^ r * + (weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r) := by + apply ENNReal.tsum_le_tsum + intro j + calc + weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q w.toH1Function.grad j) ^ r ≤ + weight j * (C * ‖sigma0⁻¹‖ₑ ^ r * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r) := + mul_le_mul_right (hdepth_scaled j) _ + _ = C * ‖sigma0⁻¹‖ₑ ^ r * + (weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r) := by + ring + _ = C * ‖sigma0⁻¹‖ₑ ^ r * + ∑' j : ℕ, + weight j * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q h.toField j) ^ r := + ENNReal.tsum_mul_left + have hfactor : + (C ^ r⁻¹ * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField) ^ r = + C * ‖sigma0⁻¹‖ₑ ^ r * + (cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField) ^ r := by + rw [ENNReal.mul_rpow_of_nonneg _ _ hr_nonneg, + ENNReal.mul_rpow_of_nonneg _ _ hr_nonneg, + ENNReal.rpow_inv_rpow hr_pos.ne', enorm_inv_eq_ofReal_inv hsigma0] + have hroot := ENNReal.rpow_le_rpow hpower (show 0 ≤ r⁻¹ by positivity) + calc + cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad = + (cubeEuclideanPositiveBesovOverlapESeminorm Q s q w.toH1Function.grad ^ r) ^ r⁻¹ := + (ENNReal.rpow_rpow_inv hr_pos.ne' _).symm + _ ≤ (C * ‖sigma0⁻¹‖ₑ ^ r * + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField ^ r) ^ r⁻¹ := hroot + _ = C ^ r⁻¹ * (ENNReal.ofReal sigma0)⁻¹ * + cubeEuclideanPositiveBesovOverlapESeminorm Q s q h.toField := by + rw [← hfactor, ENNReal.rpow_rpow_inv hr_pos.ne'] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePGlobalBound.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePGlobalBound.lean new file mode 100644 index 0000000000..9bbacb135c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePGlobalBound.lean @@ -0,0 +1,290 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ContinuousInterpolation.OverlapCoordinateBridge + +/-! # Exact Overlap Finite PGlobal Bound -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/-- A finite dimension-only constant for the global bound on one exact-overlap +depth energy. -/ +noncomputable def exactOverlapDepthGlobalBoundConstant (d : ℕ) : ℝ≥0∞ := + 2 * (3 ^ d : ℝ≥0∞) + +private theorem memLp_hilbert_overlap_of_memLp {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} {F : Vec d → Vec d} {p : ℝ≥0∞} + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p (normalizedCubeMeasure Q)) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) : + MemLp (fun x => HilbertVec.ofVec (F x)) p (ScalarOverlap.normalizedCubeMeasure S) := by + have hsub : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + have hdom : ScalarOverlap.normalizedCubeMeasure S ≤ + (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) • normalizedCubeMeasure Q := by + rw [ScalarOverlap.normalizedCubeMeasure, normalizedCubeMeasure, smul_smul] + have hvolQ : (0 : ℝ) < cubeVolume Q := cubeVolume_pos Q + have hcancel : ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q) * ENNReal.ofReal (cubeVolume Q)⁻¹ = + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ := by + rw [mul_assoc, ← ENNReal.ofReal_mul hvolQ.le, + mul_inv_cancel₀ hvolQ.ne', ENNReal.ofReal_one, mul_one] + rw [hcancel] + refine Measure.le_iff'.2 fun A => ?_ + simp only [Measure.smul_apply, smul_eq_mul] + refine mul_le_mul_right ?_ _ + rw [ScalarOverlap.cubeMeasure, cubeMeasure] + exact Measure.le_iff'.1 (Measure.restrict_mono hsub le_rfl) A + have hfin : (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ENNReal.ofReal (cubeVolume Q)) ≠ ∞ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top ENNReal.ofReal_ne_top + exact (hF.smul_measure hfin).mono_measure hdom + +private theorem eLpNorm_overlap_residual_le_two_mul {d : ℕ} + (S : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) ≤ + 2 * eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + let μ : Measure (Vec d) := ScalarOverlap.normalizedCubeMeasure S + let f : Vec d → HilbertVec d := fun x => HilbertVec.ofVec (F x) + let m : HilbertVec d := HilbertVec.ofVec (ScalarOverlap.cubeAverageVec S F) + let : IsProbabilityMeasure μ := ⟨by simp [μ]⟩ + have hp_one : 1 ≤ p.exponent := p.one_lt.le + have hp0 : p.exponent ≠ 0 := (zero_lt_one.trans p.one_lt).ne' + have htop : p.exponent ≠ ∞ := p.lt_top.ne + have hF' : MemLp f p.exponent μ := by + simpa [f, μ] using hF + have hint : Integrable f μ := by + exact hF'.integrable hp_one + have hmean : m = ∫ x, f x ∂μ := by + apply HilbertVec.ext + intro i + simp only [m, f, μ, HilbertVec.ofVec] + rw [ScalarOverlap.cubeAverageVec, ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + exact (eval_integral_piLp (fun j => hint.eval_piLp j) i).symm + have hm_le : ‖m‖ₑ ≤ eLpNorm f p.exponent μ := by + calc + ‖m‖ₑ = ‖∫ x, f x ∂μ‖ₑ := by rw [hmean] + _ ≤ ∫⁻ x, ‖f x‖ₑ ∂μ := enorm_integral_le_lintegral_enorm _ + _ = eLpNorm f 1 μ := eLpNorm_one_eq_lintegral_enorm.symm + _ ≤ eLpNorm f p.exponent μ := + eLpNorm_le_eLpNorm_of_exponent_le hp_one hF.aestronglyMeasurable + have hconst : eLpNorm (fun _ : Vec d => m) p.exponent μ = ‖m‖ₑ := by + rw [eLpNorm_const' m hp0 htop] + simp + have htri : eLpNorm (fun x => f x - m) p.exponent μ ≤ + eLpNorm f p.exponent μ + eLpNorm (fun _ : Vec d => m) p.exponent μ := + eLpNorm_sub_le hF.aestronglyMeasurable aestronglyMeasurable_const hp_one + have hfun : (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) = + fun x => f x - m := by + funext x + simp [f, m] + rw [hfun] + calc + eLpNorm (fun x => f x - m) p.exponent μ ≤ + eLpNorm f p.exponent μ + eLpNorm (fun _ : Vec d => m) p.exponent μ := htri + _ ≤ eLpNorm f p.exponent μ + eLpNorm f p.exponent μ := by rw [hconst]; gcongr + _ = 2 * eLpNorm f p.exponent μ := by ring + +private theorem eLpNorm_rpow_eq_lintegral_enorm {α E : Type*} + [MeasurableSpace α] [NormedAddCommGroup E] {μ : Measure α} + {f : α → E} (p : FiniteLpExponent) : + (eLpNorm f p.exponent μ) ^ p.exponent.toReal = + ∫⁻ x, ‖f x‖ₑ ^ p.exponent.toReal ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne, ← ENNReal.rpow_mul] + have hp : p.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hp, ENNReal.rpow_one] + +private theorem aemeasurable_hilbert_enorm_rpow_of_memLp {d : ℕ} + {Q : TriadicCube d} {F : Vec d → Vec d} (p : FiniteLpExponent) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) : + AEMeasurable (fun x => ‖HilbertVec.ofVec (F x)‖ₑ ^ p.exponent.toReal) + (volume.restrict (cubeSet Q)) := by + let μ : Measure (Vec d) := volume.restrict (cubeSet Q) + have hcoeff : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + have hF_vol : AEMeasurable (fun x => HilbertVec.ofVec (F x)) μ := by + have hF_norm : AEMeasurable (fun x => HilbertVec.ofVec (F x)) + (normalizedCubeMeasure Q) := hF.aestronglyMeasurable.aemeasurable + simpa [μ, normalizedCubeMeasure, cubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := volume.restrict (cubeSet Q)) + (f := fun x => HilbertVec.ofVec (F x)) hcoeff).1 hF_norm + have hmap : Measurable (fun v : HilbertVec d => ‖v‖ₑ ^ p.exponent.toReal) := by + fun_prop + exact hmap.comp_aemeasurable hF_vol + +private theorem aemeasurable_hilbert_enorm_rpow_scalarOverlap_of_memLp {d : ℕ} + {S : TriadicCube d} {F : Vec d → Vec d} (p : FiniteLpExponent) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) : + AEMeasurable (fun x => ‖HilbertVec.ofVec (F x)‖ₑ ^ p.exponent.toReal) + (volume.restrict (ScalarOverlap.cubeSet S)) := by + let μ : Measure (Vec d) := volume.restrict (ScalarOverlap.cubeSet S) + have hcoeff : ENNReal.ofReal ((ScalarOverlap.cubeVolume S)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (ScalarOverlap.cubeVolume_pos S)) + have hF_vol : AEMeasurable (fun x => HilbertVec.ofVec (F x)) μ := by + have hF_norm : AEMeasurable (fun x => HilbertVec.ofVec (F x)) + (ScalarOverlap.normalizedCubeMeasure S) := hF.aestronglyMeasurable.aemeasurable + simpa [μ, ScalarOverlap.normalizedCubeMeasure, ScalarOverlap.cubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := volume.restrict (ScalarOverlap.cubeSet S)) + (f := fun x => HilbertVec.ofVec (F x)) hcoeff).1 hF_norm + have hmap : Measurable (fun v : HilbertVec d => ‖v‖ₑ ^ p.exponent.toReal) := by + fun_prop + exact hmap.comp_aemeasurable hF_vol + +/-- At each retained depth, exact Euclidean overlap oscillation is bounded by +a finite dimension-only multiple of the parent normalized `L^p` norm. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_le_global {d : ℕ} + (Q : TriadicCube d) (p : FiniteLpExponent) (F : Vec d → Vec d) (j : ℕ) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) : + cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j ≤ + exactOverlapDepthGlobalBoundConstant d * + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q) := by + classical + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let r : ℝ := p.exponent.toReal + let g : Vec d → ℝ≥0∞ := fun x => ‖HilbertVec.ofVec (F x)‖ₑ ^ r + have hr_pos : 0 < r := + ENNReal.toReal_pos (zero_lt_one.trans p.one_lt).ne' p.lt_top.ne + have hr_one : 1 ≤ r := by + rw [← ENNReal.toReal_one] + exact ENNReal.toReal_mono p.lt_top.ne p.one_lt.le + have hlocal : ∀ S ∈ D, + eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S) ≤ + 2 * eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S) := by + intro S hS + exact eLpNorm_overlap_residual_le_two_mul S p F + (memLp_hilbert_overlap_of_memLp hF (by simpa [D] using hS)) + have hlocal_rpow : ∀ S ∈ D, + (eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r ≤ + (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S := by + intro S hS + have hpow := ENNReal.rpow_le_rpow (hlocal S hS) hr_pos.le + rw [eLpNorm_rpow_eq_lintegral_enorm] at hpow + rw [ENNReal.mul_rpow_of_nonneg _ _ hr_pos.le] at hpow + calc + (eLpNorm (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ r = + ∫⁻ x, ‖HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S F)‖ₑ ^ r + ∂ScalarOverlap.normalizedCubeMeasure S := eLpNorm_rpow_eq_lintegral_enorm p + _ ≤ (2 : ℝ≥0∞) ^ r * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (ScalarOverlap.normalizedCubeMeasure S)) ^ r := by + exact hpow + _ = (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S := by + rw [eLpNorm_rpow_eq_lintegral_enorm] + have hassembly : + ((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) ≤ + (3 ^ d : ℝ≥0∞) * ∫⁻ x, g x ∂normalizedCubeMeasure Q := by + simpa [D, g] using! + overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le + Q j + (aemeasurable_hilbert_enorm_rpow_of_memLp (Q := Q) p hF) + (fun S hS => + by + simpa only [ScalarOverlap.cubeSet_eq_overlapCubeSet] using + aemeasurable_hilbert_enorm_rpow_scalarOverlap_of_memLp p + (memLp_hilbert_overlap_of_memLp (Q := Q) (S := S) (j := j) + (p := p.exponent) hF hS)) + have hpower : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ r ≤ + (2 : ℝ≥0∞) ^ r * (3 ^ d : ℝ≥0∞) * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := by + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + calc + ((D.card : ℝ≥0∞)⁻¹) * + D.attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r) ≤ + ((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) := by + apply mul_le_mul_right + calc + D.attach.sum (fun S => + (eLpNorm + (fun x => HilbertVec.ofVec (F x - ScalarOverlap.cubeAverageVec S.1 F)) + p.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ r) ≤ + D.attach.sum (fun S => (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S.1) := by + exact Finset.sum_le_sum fun S hS => hlocal_rpow S.1 S.2 + _ = D.sum (fun S => (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) := + by + simpa using (Finset.sum_attach D + (fun S => (2 : ℝ≥0∞) ^ r * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S)) + _ = (2 : ℝ≥0∞) ^ r * + (((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S)) := by + rw [← Finset.mul_sum] + ac_rfl + _ ≤ (2 : ℝ≥0∞) ^ r * + ((3 ^ d : ℝ≥0∞) * ∫⁻ x, g x ∂normalizedCubeMeasure Q) := by + gcongr + _ = (2 : ℝ≥0∞) ^ r * (3 ^ d : ℝ≥0∞) * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := by + rw [eLpNorm_rpow_eq_lintegral_enorm] + ring + have hK : (3 ^ d : ℝ≥0∞) ≤ (3 ^ d : ℝ≥0∞) ^ r := by + have hthree : (1 : ℝ≥0∞) ≤ 3 := by norm_num + simpa only [ENNReal.rpow_one] using + ENNReal.rpow_le_rpow_of_exponent_le (one_le_pow₀ hthree (n := d)) hr_one + have htarget_power : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ r ≤ + (exactOverlapDepthGlobalBoundConstant d * + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := by + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm Q p F j) ^ r ≤ + (2 : ℝ≥0∞) ^ r * (3 ^ d : ℝ≥0∞) * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := hpower + _ ≤ (2 : ℝ≥0∞) ^ r * (3 ^ d : ℝ≥0∞) ^ r * + (eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := by gcongr + _ = (exactOverlapDepthGlobalBoundConstant d * + eLpNorm (fun x => HilbertVec.ofVec (F x)) p.exponent + (normalizedCubeMeasure Q)) ^ r := by + rw [exactOverlapDepthGlobalBoundConstant, + ENNReal.mul_rpow_of_nonneg _ _ hr_pos.le, + ENNReal.mul_rpow_of_nonneg _ _ hr_pos.le] + have hroot := ENNReal.rpow_le_rpow htarget_power (show 0 ≤ r⁻¹ by positivity) + have hrr : r * r⁻¹ = 1 := mul_inv_cancel₀ hr_pos.ne' + simpa only [← ENNReal.rpow_mul, hrr, ENNReal.rpow_one] using hroot + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePHomogeneity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePHomogeneity.lean new file mode 100644 index 0000000000..a4031f9c2e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePHomogeneity.lean @@ -0,0 +1,121 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Besov.Duality.OverlapDefinitions + +/-! +# Scalar homogeneity of exact overlap depth energies + +The normalized overlap average and the resulting one-depth energy commute +exactly with multiplication by a real scalar. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem scalarOverlap_cubeAverageVec_const_smul {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (q : FiniteLpExponent) + (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) (c : ℝ) : + ScalarOverlap.cubeAverageVec S (fun x => c • F x) = + c • ScalarOverlap.cubeAverageVec S F := by + funext i + have hFcoord := hF + rw [MeasureTheory.memLp_piLp_iff] at hFcoord + have hFcoord' : MemLp (fun x => F x i) q.exponent + (normalizedCubeMeasure Q) := by + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using hFcoord i + have hFlocal := ScalarOverlap.memLp_of_mem_centersAtDepth_of_memLp hS hFcoord' + have hFlocal_int : Integrable (fun x => F x i) + (ScalarOverlap.normalizedCubeMeasure S) := + hFlocal.integrable q.one_lt.le + simp only [ScalarOverlap.cubeAverageVec, Pi.smul_apply] + rw [ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure, + ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + simpa only [smul_eq_mul] using hFlocal_int.integral_smul c + +private theorem scalarOverlap_residual_const_smul {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (q : FiniteLpExponent) + (F : Vec d → Vec d) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) (c : ℝ) : + (fun x => HilbertVec.ofVec + (c • F x - ScalarOverlap.cubeAverageVec S (fun y => c • F y))) = + c • (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) := by + have havg := scalarOverlap_cubeAverageVec_const_smul q F hF hS c + funext x + change (HilbertVec.ofVecL d) + (c • F x - ScalarOverlap.cubeAverageVec S (fun y => c • F y)) = + c • (HilbertVec.ofVecL d) (F x - ScalarOverlap.cubeAverageVec S F) + simp only [havg, (HilbertVec.ofVecL d).map_sub, + (HilbertVec.ofVecL d).map_smul, smul_sub] + +/-- The exact powered overlap energy at a fixed depth is homogeneous under +real scalar multiplication, without a depth or cardinality loss. -/ +theorem cubeEuclideanPositiveBesovOverlapDepthENorm_const_smul_rpow + {d : ℕ} (Q : TriadicCube d) (q : FiniteLpExponent) + (F : Vec d → Vec d) + (c : ℝ) + (hF : MemLp (fun x => HilbertVec.ofVec (F x)) q.exponent + (normalizedCubeMeasure Q)) (j : ℕ) : + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q (fun x => c • F x) j) ^ + q.exponent.toReal = + ‖c‖ₑ ^ q.exponent.toReal * + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q F j) ^ + q.exponent.toReal := by + classical + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow, + cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + have hlocal : ∀ S ∈ D, + (eLpNorm (fun x => HilbertVec.ofVec + (c • F x - ScalarOverlap.cubeAverageVec S (fun y => c • F y))) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ q.exponent.toReal = + ‖c‖ₑ ^ q.exponent.toReal * + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S F)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ q.exponent.toReal := by + intro S hS + rw [scalarOverlap_residual_const_smul q F hF (by simpa [D] using hS) c, + MeasureTheory.eLpNorm_const_smul, + ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg] + change ((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (c • F x - ScalarOverlap.cubeAverageVec S.1 (fun y => c • F y))) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ q.exponent.toReal) = + ‖c‖ₑ ^ q.exponent.toReal * + (((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ q.exponent.toReal)) + rw [show D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (c • F x - ScalarOverlap.cubeAverageVec S.1 (fun y => c • F y))) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ q.exponent.toReal) = + D.attach.sum (fun S => ‖c‖ₑ ^ q.exponent.toReal * + (eLpNorm (fun x => HilbertVec.ofVec + (F x - ScalarOverlap.cubeAverageVec S.1 F)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ q.exponent.toReal) by + exact Finset.sum_congr rfl fun S _ => hlocal S.1 S.2, + ← Finset.mul_sum] + ac_rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePOneDepthCZ.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePOneDepthCZ.lean new file mode 100644 index 0000000000..138fa4b740 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePOneDepthCZ.lean @@ -0,0 +1,477 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePDepthTriangle +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePGlobalBound +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPDESplitting +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePPoincareDepth +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCubeVectorNormalized + +/-! +# One-depth finite-`p` Calderon--Zygmund overlap estimate + +This is the one-depth analytic closure: the exact overlap energy of the +gradient of a cube Dirichlet divergence solution is controlled by that of its +datum, uniformly in the root scale and overlap depth. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +/- The supplied-solution CZ theorem is stated on the normalized centered +cube. The overlap API is stated on the equivalent normalized cube measure, +so keep this transport private to the one-depth assembly. -/ +private theorem cubeDirichletDivergenceProblem_to_centered_normalized + {d : ℕ} [NeZero d] (m : ℤ) {u : H10Function (openCubeSet (originCube d m))} + {h : Vec d → Vec d} + (hh : MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m))) + (hu : CubeDirichletDivergenceProblem (originCube d m) u h) : + IsCenteredCubeH10ScalarDivergenceSolution m 1 u ⟨h, hh⟩ := by + intro phi + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + rw [hmeasure, MeasureTheory.integral_smul_measure, + MeasureTheory.integral_smul_measure, smul_eq_mul, smul_eq_mul, one_mul, + hu phi] + ring + +/- Although an `H10Function` begins only in `L²`, the supplied-solution +finite-`q` estimate makes the particular gradient used below a genuine +`L^q` field. This is solely a private membership bridge required by the +depth-triangle API, not an extra theorem hypothesis. -/ +private theorem cubeDirichletDivergenceProblem_grad_memLp + {d : ℕ} [NeZero d] (q : FiniteLpExponent) (m : ℤ) (h : Vec d → Vec d) + (hh2 : MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m))) + (hhq : MemLp (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) + (w : H10Function (openCubeSet (originCube d m))) + (hw : CubeDirichletDivergenceProblem (originCube d m) w h) : + MemLp (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨C, hCtop, hC⟩ := CubeCalderonZygmund.centeredCubeH10ScalarDivergence_cz d q + let hField : CubeEuclideanL2LpField (originCube d m) q := + { toField := h + euclideanMemLp := hhq + euclideanMemL2 := hh2 } + have hbound : + eLpNorm (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * (ENNReal.ofReal (1 : ℝ))⁻¹ * + eLpNorm (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, MeasureTheory.eLpNorm_norm, hField] using + hC m 1 hField w (by norm_num) + (cubeDirichletDivergenceProblem_to_centered_normalized m hh2 hw) + have hgrad_l2 : MemLp (fun x => HilbertVec.ofVec (w.toH1Function.grad x)) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using + w.toH1Function.grad_memL2_normalizedCubeMeasure i + refine ⟨hgrad_l2.aestronglyMeasurable, ?_⟩ + exact lt_of_le_of_lt hbound (by + simpa only [ENNReal.ofReal_one, inv_one, mul_one] using + ENNReal.mul_lt_top hCtop hhq.eLpNorm_lt_top) + +private theorem eLpNorm_rpow_eq_lintegral_enorm {α E : Type*} + [MeasurableSpace α] [NormedAddCommGroup E] + (q : FiniteLpExponent) (μ : Measure α) (f : α → E) : + (eLpNorm f q.exponent μ) ^ q.exponent.toReal = + ∫⁻ x, ‖f x‖ₑ ^ q.exponent.toReal ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal + (zero_lt_one.trans q.one_lt).ne' q.lt_top.ne, ← ENNReal.rpow_mul] + have hq : q.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (zero_lt_one.trans q.one_lt).ne' q.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hq, ENNReal.rpow_one] + +/- This is the scale cancellation at the heart of the smooth component. It +is separated from the PDE proof so the `Real.rpow` algebra remains entirely +transparent: a first derivative costs one inverse overlap scale, while the +Poincaré estimate supplies precisely one positive scale. -/ +private theorem overlap_scale_rpow_cancellation {a D ell r : ℝ} + (ha : 0 ≤ a) (hell : 0 < ell) (hr : 0 ≤ r) : + (ENNReal.ofReal ell)^r * (ENNReal.ofReal (a * (D / ell)^2))^(r/2) = + (ENNReal.ofReal (a * D^2))^(r/2) := by + rw [ENNReal.ofReal_rpow_of_nonneg hell.le hr, + ENNReal.ofReal_rpow_of_nonneg (mul_nonneg ha (sq_nonneg (D / ell))) (by positivity), + ← ENNReal.ofReal_mul (Real.rpow_nonneg hell.le r), + ENNReal.ofReal_rpow_of_nonneg (mul_nonneg ha (sq_nonneg D)) (by positivity)] + congr 1 + have hinv : (ell⁻¹ ^ 2) ^ (r / 2) = (ell ^ r)⁻¹ := by + rw [← Real.rpow_two] + rw [← Real.rpow_mul (inv_nonneg.mpr hell.le)] + rw [show (2 : ℝ) * (r / 2) = r by ring] + exact Real.inv_rpow hell.le r + rw [show a * (D / ell)^2 = (a * D^2) * ell⁻¹^2 by field_simp [hell.ne'], + Real.mul_rpow (mul_nonneg ha (sq_nonneg D)) (sq_nonneg ell⁻¹), hinv] + field_simp [Real.rpow_pos_of_pos hell r] + +/- The residual part of the splitting closes without any scale factor: global +overlap control, the finite-`q` solution-stability estimate, and the smooth +averaging residual estimate are all parent-normalized. -/ +private theorem exactOverlapFiniteP_residual_rpow_le + {d : ℕ} [NeZero d] (q : FiniteLpExponent) {m : ℤ} {j : ℕ} + (P : SmoothOverlapPartition (originCube d m) j) (h : Vec d → Vec d) + (hh2 : MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m))) + (hhq : MemLp (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) + (w v : H10Function (openCubeSet (originCube d m))) + (hw : CubeDirichletDivergenceProblem (originCube d m) w h) + (hv : CubeDirichletDivergenceProblem (originCube d m) v (P.averagingField h)) + (C : ℝ≥0∞) + (hcomparison : eLpNorm (fun x => HilbertVec.ofVec + (w.toH1Function.grad x - v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) : + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) j) ^ + q.exponent.toReal ≤ + C ^ q.exponent.toReal * exactOverlapDepthGlobalBoundConstant d ^ + q.exponent.toReal * (3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal := by + have hwq := cubeDirichletDivergenceProblem_grad_memLp q m h hh2 hhq w hw + have hGq : MemLp (fun x => HilbertVec.ofVec (P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨_, Gq, _, hGq, _⟩ := + P.exists_synchronized_averagingCompetitors h q hh2 hhq + simpa only [hGq] using Gq.euclideanMemLp + have hvq := cubeDirichletDivergenceProblem_grad_memLp q m (P.averagingField h) + (by + obtain ⟨G2, _, hG2, _, _⟩ := + P.exists_synchronized_averagingCompetitors h q hh2 hhq + have hG2hilbert : MemLp (fun x => HilbertVec.ofVec (G2.toField x)) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [CubeVectorH1Function.toField, HilbertVec.ofVec, PiLp.toLp_apply] using + H1Function.memL2_normalizedCubeMeasure (G2.coord i) + simpa only [hG2] using hG2hilbert) + hGq v hv + have hdiff : MemLp (fun x => HilbertVec.ofVec + (w.toH1Function.grad x - v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simpa only [map_sub] using! hwq.sub hvq + have hglobal := cubeEuclideanPositiveBesovOverlapDepthENorm_le_global + (originCube d m) q (fun x => w.toH1Function.grad x - v.toH1Function.grad x) j hdiff + have hglobal_pow := ENNReal.rpow_le_rpow hglobal + (show 0 ≤ q.exponent.toReal from ENNReal.toReal_nonneg) + rw [ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg] at hglobal_pow + have hcomparison_pow := ENNReal.rpow_le_rpow hcomparison + (show 0 ≤ q.exponent.toReal from ENNReal.toReal_nonneg) + rw [ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg] at hcomparison_pow + have hresidual := + lintegral_enorm_rpow_sub_averagingField_le_overlapDepthENorm_rpow P h q hhq + rw [← eLpNorm_rpow_eq_lintegral_enorm q + (normalizedCubeMeasure (originCube d m)) + (fun x => HilbertVec.ofVec (h x - P.averagingField h x))] at hresidual + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) j) ^ + q.exponent.toReal ≤ + exactOverlapDepthGlobalBoundConstant d ^ q.exponent.toReal * + (eLpNorm (fun x => HilbertVec.ofVec + (w.toH1Function.grad x - v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ q.exponent.toReal := hglobal_pow + _ ≤ exactOverlapDepthGlobalBoundConstant d ^ q.exponent.toReal * + (C ^ q.exponent.toReal * + (eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ q.exponent.toReal) := by + gcongr + _ = C ^ q.exponent.toReal * exactOverlapDepthGlobalBoundConstant d ^ + q.exponent.toReal * + (eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ q.exponent.toReal := by ring + _ ≤ C ^ q.exponent.toReal * exactOverlapDepthGlobalBoundConstant d ^ + q.exponent.toReal * ((3 ^ d : ℝ≥0∞) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal) := + mul_le_mul_right hresidual _ + _ = _ := by ring + +private theorem exactOverlapFiniteP_smooth_rpow_le + {d : ℕ} [NeZero d] (q : FiniteLpExponent) {m : ℤ} {j : ℕ} + (h : Vec d → Vec d) + (hhq : MemLp (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m))) + (V : CubeVectorW1pFunction (originCube d m) q) + (Csplit Cpoin : ℝ≥0∞) + (hpoin : (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q V.toField j) ^ + q.exponent.toReal ≤ Cpoin * + (ENNReal.ofReal (cubeScaleFactor (originCube d m) / (3 : ℝ) ^ j)) ^ + q.exponent.toReal * + (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ q.exponent.toReal) + (hcomparison : eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ Csplit * + eLpNorm (fun x => HilbertMat.ofMat + (((concreteSmoothOverlapPartition (originCube d m) j).averagingCompetitorW1p h q).jacobian x)) + q.exponent + (normalizedCubeMeasure (originCube d m))) : + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q V.toField j) ^ + q.exponent.toReal ≤ + Cpoin * Csplit ^ q.exponent.toReal * + ((if q.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (q.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (smoothOverlapPartitionDerivativeConstant d) ^ 2)) ^ + (q.exponent.toReal / 2) * + (if q.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (q.exponent.toReal / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal := by + let P := concreteSmoothOverlapPartition (originCube d m) j + let ell : ℝ := cubeScaleFactor (originCube d m) / (3 : ℝ) ^ j + let r : ℝ := q.exponent.toReal + let A : ℝ≥0∞ := + (if r ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (smoothOverlapPartitionDerivativeConstant d) ^ 2)) ^ (r / 2) * + (if r ≤ 2 then 1 else (3 ^ d : ℝ≥0∞) ^ (r / 2 - 1)) * (3 ^ d : ℝ≥0∞) + have hell : 0 < ell := by + exact div_pos (cubeScaleFactor_pos' (originCube d m)) + (pow_pos (by norm_num : (0 : ℝ) < 3) j) + have hjacobian := SmoothOverlapPartition.lintegral_enorm_rpow_averagingCompetitorW1p_jacobian_le_depthENorm + P h q hhq + have hjacobian' : + (eLpNorm (fun x => HilbertMat.ofMat ((P.averagingCompetitorW1p h q).jacobian x)) + q.exponent (normalizedCubeMeasure (originCube d m))) ^ r ≤ + ((if r ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / ell) ^ 2)) ^ (r / 2) * + (if r ≤ 2 then 1 else (3 ^ d : ℝ≥0∞) ^ (r / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ r := by + rw [eLpNorm_rpow_eq_lintegral_enorm] + simpa only [P, ell, r] using hjacobian + have hcomparison_pow := ENNReal.rpow_le_rpow hcomparison + (show 0 ≤ r from ENNReal.toReal_nonneg) + rw [ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg] at hcomparison_pow + have hscale : + (ENNReal.ofReal ell) ^ r * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / ell) ^ 2)) ^ (r / 2) = + (ENNReal.ofReal ((3 ^ d : ℝ) * + (smoothOverlapPartitionDerivativeConstant d) ^ 2)) ^ (r / 2) := by + simpa only [P] using! overlap_scale_rpow_cancellation + (a := (3 ^ d : ℝ)) (D := smoothOverlapPartitionDerivativeConstant d) + (ell := ell) (r := r) (by positivity) hell ENNReal.toReal_nonneg + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q V.toField j) ^ r ≤ + Cpoin * (ENNReal.ofReal ell) ^ r * + (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ r := by + simpa only [ell, r] using hpoin + _ ≤ Cpoin * (ENNReal.ofReal ell) ^ r * + (Csplit ^ r * (eLpNorm (fun x => HilbertMat.ofMat + ((P.averagingCompetitorW1p h q).jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m))) ^ r) := by gcongr + _ ≤ Cpoin * (ENNReal.ofReal ell) ^ r * + (Csplit ^ r * + (((if r ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / ell) ^ 2)) ^ (r / 2) * + (if r ≤ 2 then 1 else (3 ^ d : ℝ≥0∞) ^ (r / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ r)) := by + gcongr + _ = Cpoin * Csplit ^ r * A * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ r := by + rw [show Cpoin * (ENNReal.ofReal ell) ^ r * + (Csplit ^ r * + (((if r ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / ell) ^ 2)) ^ (r / 2) * + (if r ≤ 2 then 1 else (3 ^ d : ℝ≥0∞) ^ (r / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ r)) = + Cpoin * Csplit ^ r * + ((if r ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (r / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + ((ENNReal.ofReal ell) ^ r * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (P.coordDerivConstant / ell) ^ 2)) ^ (r / 2)) * + (if r ≤ 2 then 1 else (3 ^ d : ℝ≥0∞) ^ (r / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ r by ring] + rw [hscale] + _ = _ := by rfl + +/-- One exact-overlap depth of the finite-`p` gradient energy of a cube +Dirichlet divergence solution is controlled by the corresponding depth of its +datum, uniformly in both the root scale and the depth. -/ +theorem exists_exactOverlapFiniteP_oneDepth_cz + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (j : ℕ) (h : Vec d → Vec d), + MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m)) → + MemLp (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) → + ∀ w : H10Function (openCubeSet (originCube d m)), + CubeDirichletDivergenceProblem (originCube d m) w h → + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + w.toH1Function.grad j) ^ q.exponent.toReal ≤ + C * (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal := by + obtain ⟨Csplit, hCsplit_top, hsplit⟩ := exists_exactOverlapFiniteP_pdeSplitting d q + obtain ⟨Cpoin, hCpoin_top, hpoin⟩ := + exists_cubeEuclideanPositiveBesovOverlapDepthENorm_rpow_le (d := d) q + let A : ℝ≥0∞ := + ((if q.exponent.toReal ≤ 2 then 1 else + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ (q.exponent.toReal / 2 - 1)) * + (Fintype.card (Fin d × Fin d) : ℝ≥0∞) * + (ENNReal.ofReal ((3 ^ d : ℝ) * + (smoothOverlapPartitionDerivativeConstant d) ^ 2)) ^ + (q.exponent.toReal / 2) * + (if q.exponent.toReal ≤ 2 then 1 else + (3 ^ d : ℝ≥0∞) ^ (q.exponent.toReal / 2 - 1)) * + (3 ^ d : ℝ≥0∞)) + let Cres : ℝ≥0∞ := Csplit ^ q.exponent.toReal * + exactOverlapDepthGlobalBoundConstant d ^ q.exponent.toReal * (3 ^ d : ℝ≥0∞) + let Csmooth : ℝ≥0∞ := Cpoin * Csplit ^ q.exponent.toReal * A + have hA_top : A < ∞ := by + dsimp [A] + have hder : (ENNReal.ofReal ((3 ^ d : ℝ) * + smoothOverlapPartitionDerivativeConstant d ^ 2)) ^ + (q.exponent.toReal / 2) < ∞ := + ENNReal.rpow_lt_top_of_nonneg + (div_nonneg ENNReal.toReal_nonneg (by norm_num)) ENNReal.ofReal_ne_top + have hthree : (3 ^ d : ℝ≥0∞) < ∞ := + (ENNReal.pow_ne_top ENNReal.ofNat_ne_top).lt_top + by_cases hq : q.exponent.toReal ≤ 2 + · simp only [if_pos hq, one_mul, mul_one] + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top (ENNReal.natCast_ne_top (Fintype.card (Fin d × Fin d))).lt_top hder) hthree + · simp only [if_neg hq] + have hr : 0 ≤ q.exponent.toReal / 2 - 1 := by + have htwo : 2 < q.exponent.toReal := lt_of_not_ge hq + linarith + have hdim : (Fintype.card (Fin d × Fin d) : ℝ≥0∞) ^ + (q.exponent.toReal / 2 - 1) < ∞ := + ENNReal.rpow_lt_top_of_nonneg hr + (ENNReal.natCast_ne_top (Fintype.card (Fin d × Fin d))) + have hoverlap : (3 ^ d : ℝ≥0∞) ^ (q.exponent.toReal / 2 - 1) < ∞ := + ENNReal.rpow_lt_top_of_nonneg hr (ENNReal.pow_ne_top ENNReal.ofNat_ne_top) + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top + (ENNReal.mul_lt_top (ENNReal.mul_lt_top hdim + (ENNReal.natCast_ne_top _).lt_top) hder) + hoverlap) + hthree + have hthree : (3 ^ d : ℝ≥0∞) < ∞ := + (ENNReal.pow_ne_top ENNReal.ofNat_ne_top).lt_top + have htri_top : exactOverlapDepthTriangleConstant q < ∞ := by + dsimp [exactOverlapDepthTriangleConstant] + exact (ENNReal.rpow_ne_top_of_ne_zero (by norm_num) (by norm_num)).lt_top + have hglobal_top : exactOverlapDepthGlobalBoundConstant d ≠ ∞ := by + unfold exactOverlapDepthGlobalBoundConstant + exact ENNReal.mul_ne_top (by norm_num) + (ENNReal.pow_ne_top (by norm_num)) + have hCres_top : Cres < ∞ := by + dsimp [Cres] + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hCsplit_top.ne) + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hglobal_top)) + hthree + have hCsmooth_top : Csmooth < ∞ := by + dsimp [Csmooth] + exact ENNReal.mul_lt_top + (ENNReal.mul_lt_top hCpoin_top.lt_top + (ENNReal.rpow_lt_top_of_nonneg ENNReal.toReal_nonneg hCsplit_top.ne)) + hA_top + refine ⟨exactOverlapDepthTriangleConstant q * (Cres + Csmooth), + ENNReal.mul_lt_top htri_top ((ENNReal.add_lt_top).2 ⟨hCres_top, hCsmooth_top⟩), ?_⟩ + intro m j h hh2 hhq w hw + let P : SmoothOverlapPartition (originCube d m) j := + concreteSmoothOverlapPartition (originCube d m) j + obtain ⟨v, V, hv, hVfield, hcomparison, hHessiancomparison⟩ := + hsplit m j P h hh2 hhq w hw + have hwq := cubeDirichletDivergenceProblem_grad_memLp q m h hh2 hhq w hw + have hvq : MemLp (fun x => HilbertVec.ofVec (v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + rw [← hVfield] + exact V.euclideanMemLp + have htriangle := cubeEuclideanPositiveBesovOverlapDepthENorm_sub_add_rpow_le + (originCube d m) q w.toH1Function.grad v.toH1Function.grad j hwq hvq + have hresidual := exactOverlapFiniteP_residual_rpow_le q P h hh2 hhq w v hw hv + Csplit hcomparison + have hsmooth := exactOverlapFiniteP_smooth_rpow_le q h hhq V Csplit Cpoin + (hpoin (originCube d m) j V) (by simpa only [P] using hHessiancomparison) + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + w.toH1Function.grad j) ^ q.exponent.toReal ≤ + exactOverlapDepthTriangleConstant q * + ((cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) j) ^ + q.exponent.toReal + + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + v.toH1Function.grad j) ^ q.exponent.toReal) := htriangle + _ ≤ exactOverlapDepthTriangleConstant q * + ((Csplit ^ q.exponent.toReal * exactOverlapDepthGlobalBoundConstant d ^ + q.exponent.toReal * (3 ^ d : ℝ≥0∞) + + Cpoin * Csplit ^ q.exponent.toReal * A) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal) := by + apply mul_le_mul_right + calc + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) j) ^ + q.exponent.toReal + + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q + v.toH1Function.grad j) ^ q.exponent.toReal ≤ + (Csplit ^ q.exponent.toReal * exactOverlapDepthGlobalBoundConstant d ^ + q.exponent.toReal * (3 ^ d : ℝ≥0∞)) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal + + (Cpoin * Csplit ^ q.exponent.toReal * A) * + (cubeEuclideanPositiveBesovOverlapDepthENorm (originCube d m) q h j) ^ + q.exponent.toReal := by + apply add_le_add hresidual + simpa only [hVfield] using hsmooth + _ = _ := by ring + _ = _ := by + simp only [Cres, Csmooth] + ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPDESplitting.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPDESplitting.lean new file mode 100644 index 0000000000..38455571da --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPDESplitting.lean @@ -0,0 +1,169 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.ScalarDivergenceGradientW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.FiniteLpSolutionStability +public import LeanPool.CoarseGraining.Homogenization.Deterministic.HomogenizationBlackBoxes.DualityPositiveBridge + +/-! +# Exact-overlap finite-`p` PDE splitting + +The smooth overlap average gives a paired `H¹`/`W¹ᵖ` divergence datum. This +file combines that datum with the constant-coefficient cube estimates: the +original zero-trace solution is compared to the solution driven by the smooth +average, and the latter gradient receives a finite-`W¹ᵖ` representative. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped ENNReal + +noncomputable section + +private theorem cubeDirichletDivergenceProblem_to_centered_normalized + {d : ℕ} [NeZero d] (m : ℤ) {u : H10Function (openCubeSet (originCube d m))} + {h : Vec d → Vec d} + (hh : MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m))) + (hu : CubeDirichletDivergenceProblem (originCube d m) u h) : + IsCenteredCubeH10ScalarDivergenceSolution m 1 u + ⟨h, hh⟩ := by + intro phi + have hmeasure : (centeredCubeDomain d m).normalizedVolume = + ENNReal.ofReal ((cubeVolume (originCube d m))⁻¹) • + volume.restrict (openCubeSet (originCube d m)) := by + simp only [centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + normalizedCubeMeasure, cubeMeasure, + volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + rw [hmeasure, MeasureTheory.integral_smul_measure, + MeasureTheory.integral_smul_measure, smul_eq_mul, smul_eq_mul, one_mul, + hu phi] + ring + +/-- On every origin cube, a zero-trace solution splits off the smooth overlap +average. The constants depend only on the fixed dimension and finite +exponent, and are chosen before the cube, averaging depth, partition, datum, +and supplied solution. -/ +theorem exists_exactOverlapFiniteP_pdeSplitting + (d : ℕ) [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C < ∞ ∧ ∀ (m : ℤ) (j : ℕ) + (P : SmoothOverlapPartition (originCube d m) j) (h : Vec d → Vec d), + MemLp (fun x => HilbertVec.ofVec (h x)) 2 + (normalizedCubeMeasure (originCube d m)) → + MemLp (fun x => HilbertVec.ofVec (h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) → + ∀ w : H10Function (openCubeSet (originCube d m)), + CubeDirichletDivergenceProblem (originCube d m) w h → + ∃ v : H10Function (openCubeSet (originCube d m)), + ∃ V : CubeVectorW1pFunction (originCube d m) q, + CubeDirichletDivergenceProblem (originCube d m) v (P.averagingField h) ∧ + V.toField = v.toH1Function.grad ∧ + eLpNorm (fun x => HilbertVec.ofVec + (w.toH1Function.grad x - v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ∧ + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + C * eLpNorm (fun x => HilbertMat.ofMat + ((P.averagingCompetitorW1p h q).jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + obtain ⟨Cstab, hCstab_top, hstab⟩ := + CubeCalderonZygmund.INTERNAL.centeredCubeH10ScalarDivergence_solution_stability d q + obtain ⟨Cgrad, hCgrad_top, hgrad⟩ := + CubeCalderonZygmund.exists_cubeVectorW1p_scalarDivergence_cz_of_paired d q + refine ⟨Cstab + Cgrad, ENNReal.add_lt_top.mpr ⟨hCstab_top, hCgrad_top⟩, ?_⟩ + intro m j P h hh2 hhq w hw + obtain ⟨_, _, _, _, _⟩ := P.exists_synchronized_averagingCompetitors h q hh2 hhq + let G2 : CubeVectorH1Function (originCube d m) := P.averagingCompetitor h + let Gq : CubeVectorW1pFunction (originCube d m) q := P.averagingCompetitorW1p h q + have hG2 : G2.toField = P.averagingField h := by + rfl + have hGq : Gq.toField = P.averagingField h := by + rfl + have hGgrad : ∀ x i k, (G2.coord i).grad x k = Gq.jacobian x i k := by + intro x i k + rfl + have hG2_l2 : MemLp (fun x => HilbertVec.ofVec (G2.toField x)) 2 + (normalizedCubeMeasure (originCube d m)) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [HilbertVec.ofVec, PiLp.toLp_apply] using! + H1Function.memL2_normalizedCubeMeasure (G2.coord i) + have hGq_q : MemLp (fun x => HilbertVec.ofVec (Gq.toField x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := + Gq.euclideanMemLp + let hField : CubeEuclideanL2LpField (originCube d m) q := + { toField := h + euclideanMemLp := hhq + euclideanMemL2 := hh2 } + let gField : CubeEuclideanL2LpField (originCube d m) q := + { toField := Gq.toField + euclideanMemLp := hGq_q + euclideanMemL2 := hG2_l2 } + obtain ⟨v, hv⟩ := + exists_cubeDirichletDivergenceProblem_of_memLp_normalizedCubeMeasure + (Q := originCube d m) (h := G2.toField) + G2.memLp_toField_normalizedCubeMeasure + obtain ⟨V, hVfield, hVbound⟩ := hgrad m G2 Gq (by rw [hG2, hGq]) hGgrad v (by + simpa only [hG2] using hv) + have hw_normalized := cubeDirichletDivergenceProblem_to_centered_normalized m hh2 hw + have hv_normalized := + cubeDirichletDivergenceProblem_to_centered_normalized m hG2_l2 hv + have hstab_bound := hstab m 1 hField gField w v (by norm_num) hw_normalized hv_normalized + refine ⟨v, V, hv, hVfield, ?_, ?_⟩ + · calc + eLpNorm (fun x => HilbertVec.ofVec + (w.toH1Function.grad x - v.toH1Function.grad x)) q.exponent + (normalizedCubeMeasure (originCube d m)) = + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => w.toH1Function.grad x - v.toH1Function.grad x) := by + simp only [BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, MeasureTheory.eLpNorm_norm] + _ ≤ Cstab * (ENNReal.ofReal (1 : ℝ))⁻¹ * + (centeredCubeDomain d m).normalizedEuclideanLpENorm q.exponent + (fun x => hField.toField x - gField.toField x) := hstab_bound + _ = Cstab * eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + simp only [ENNReal.ofReal_one, inv_one, mul_one, + BoundedMeasurableDomain.normalizedEuclideanLpENorm, + BoundedMeasurableDomain.normalizedLpENorm, centeredCubeDomain, + cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure, + euclideanNorm_eq_norm_ofVec, MeasureTheory.eLpNorm_norm, + hField, gField, hGq] + _ ≤ (Cstab + Cgrad) * eLpNorm (fun x => HilbertVec.ofVec + (h x - P.averagingField h x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + gcongr + exact le_add_right le_rfl + · calc + eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) ≤ + Cgrad * eLpNorm (fun x => HilbertMat.ofMat (Gq.jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := hVbound + _ = Cgrad * eLpNorm (fun x => HilbertMat.ofMat + ((P.averagingCompetitorW1p h q).jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by rfl + _ ≤ (Cstab + Cgrad) * eLpNorm (fun x => HilbertMat.ofMat + ((P.averagingCompetitorW1p h q).jacobian x)) q.exponent + (normalizedCubeMeasure (originCube d m)) := by + gcongr + exact le_add_left le_rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPoincareDepth.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPoincareDepth.lean new file mode 100644 index 0000000000..e8d8946ad6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapFinitePPoincareDepth.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ExactOverlapFinitePAveraging +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.OverlapCubeVectorNormalized + +/-! +# Finite-`p` overlap Poincaré assembly at one depth + +This module assembles the normalized vector overlap-cube Poincaré estimate +over one retained depth. All constants are chosen before the cube, depth, +and vector field. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +noncomputable section + +private theorem finiteLpExponent_ne_zero (q : FiniteLpExponent) : q.exponent ≠ 0 := + (zero_lt_one.trans q.one_lt).ne' + +private theorem eLpNorm_rpow_eq_lintegral_enorm {α E : Type*} + [MeasurableSpace α] [NormedAddCommGroup E] + (q : FiniteLpExponent) (μ : Measure α) (f : α → E) : + (eLpNorm f q.exponent μ) ^ q.exponent.toReal = + ∫⁻ x, ‖f x‖ₑ ^ q.exponent.toReal ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal (finiteLpExponent_ne_zero q) q.lt_top.ne, + ← ENNReal.rpow_mul] + have hq : q.exponent.toReal ≠ 0 := + ENNReal.toReal_pos (finiteLpExponent_ne_zero q) q.lt_top.ne |>.ne' + rw [one_div, inv_mul_cancel₀ hq, ENNReal.rpow_one] + +private theorem aemeasurable_jacobian_enorm_rpow_parent {d : ℕ} + {Q : TriadicCube d} (q : FiniteLpExponent) (V : CubeVectorW1pFunction Q q) : + AEMeasurable (fun x => ‖HilbertMat.ofMat (V.jacobian x)‖ₑ ^ q.exponent.toReal) + (volume.restrict (cubeSet Q)) := by + have hjacobian : AEMeasurable (fun x => HilbertMat.ofMat (V.jacobian x)) + (volume.restrict (cubeSet Q)) := by + have hnorm := V.jacobianHilbertMemLp.aemeasurable + have hcoeff : ENNReal.ofReal ((cubeVolume Q)⁻¹) ≠ 0 := + ENNReal.ofReal_ne_zero_iff.2 (inv_pos.mpr (cubeVolume_pos Q)) + simpa [normalizedCubeMeasure, cubeMeasure] using + (aemeasurable_smul_measure_iff + (μ := volume.restrict (cubeSet Q)) + (f := fun x => HilbertMat.ofMat (V.jacobian x)) hcoeff).1 hnorm + exact ENNReal.continuous_rpow_const.measurable.comp_aemeasurable hjacobian.enorm + +private theorem aemeasurable_jacobian_enorm_rpow_overlap {d : ℕ} + {Q S : TriadicCube d} {j : ℕ} (q : FiniteLpExponent) + (hS : S ∈ ScalarOverlap.centersAtDepth Q j) (V : CubeVectorW1pFunction Q q) : + AEMeasurable (fun x => ‖HilbertMat.ofMat (V.jacobian x)‖ₑ ^ q.exponent.toReal) + (volume.restrict (ScalarOverlap.cubeSet S)) := by + have hsub : ScalarOverlap.cubeSet S ⊆ cubeSet Q := + ScalarOverlap.cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + have hparent := aemeasurable_jacobian_enorm_rpow_parent q V + have hrestricted := hparent.restrict (s := ScalarOverlap.cubeSet S) + rw [Measure.restrict_restrict_of_subset hsub] at hrestricted + exact hrestricted + +/-- One-depth powered overlap Poincaré assembly for an arbitrary cube-vector +finite-`W¹ᵖ` field. -/ +theorem exists_cubeEuclideanPositiveBesovOverlapDepthENorm_rpow_le + {d : ℕ} [NeZero d] (q : FiniteLpExponent) : + ∃ C : ℝ≥0∞, C ≠ ∞ ∧ + ∀ (Q : TriadicCube d) (j : ℕ) (V : CubeVectorW1pFunction Q q), + (cubeEuclideanPositiveBesovOverlapDepthENorm Q q V.toField j) ^ + q.exponent.toReal ≤ + C * (ENNReal.ofReal (cubeScaleFactor Q / (3 : ℝ) ^ j)) ^ + q.exponent.toReal * + (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent (normalizedCubeMeasure Q)) ^ q.exponent.toReal := by + obtain ⟨C, hC_top, hC⟩ := + exists_overlapCubeVector_normalized_poincare_constant (d := d) q + refine ⟨C ^ q.exponent.toReal * (3 ^ d : ℝ≥0∞), + ENNReal.mul_ne_top + (ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg hC_top) + (ENNReal.pow_ne_top ENNReal.ofNat_ne_top), ?_⟩ + intro Q j V + let D : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q j + let ℓ : ℝ := cubeScaleFactor Q / (3 : ℝ) ^ j + let g : Vec d → ℝ≥0∞ := fun x => + ‖HilbertMat.ofMat (V.jacobian x)‖ₑ ^ q.exponent.toReal + have hlocal : ∀ S ∈ D, + (eLpNorm (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ q.exponent.toReal ≤ + (C ^ q.exponent.toReal * + (ENNReal.ofReal (overlapCubeScaleFactor S)) ^ q.exponent.toReal) * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S := by + intro S hS + have hpow := ENNReal.rpow_le_rpow (hC Q j S (by simpa [D] using hS) V) + (show 0 ≤ q.exponent.toReal from ENNReal.toReal_nonneg) + rw [ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg, + ENNReal.mul_rpow_of_nonneg _ _ ENNReal.toReal_nonneg, + eLpNorm_rpow_eq_lintegral_enorm, eLpNorm_rpow_eq_lintegral_enorm] at hpow + calc + (eLpNorm (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S)) ^ q.exponent.toReal = + ∫⁻ x, ‖HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S V.toField)‖ₑ ^ + q.exponent.toReal ∂ScalarOverlap.normalizedCubeMeasure S := + eLpNorm_rpow_eq_lintegral_enorm q _ _ + _ ≤ C ^ q.exponent.toReal * + (ENNReal.ofReal (overlapCubeScaleFactor S)) ^ q.exponent.toReal * + ∫⁻ x, ‖HilbertMat.ofMat (V.jacobian x)‖ₑ ^ q.exponent.toReal ∂ + ScalarOverlap.normalizedCubeMeasure S := hpow + _ = _ := by rfl + have hscale : ∀ S ∈ D, + overlapCubeScaleFactor S = ℓ := by + intro S hS + simpa [D, ℓ] using + overlapCubeScaleFactor_eq_cubeScaleFactor_div_pow_of_mem_overlapCentersAtDepth + (Q := Q) (j := j) hS + have hassembly : + ((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) ≤ + (3 ^ d : ℝ≥0∞) * ∫⁻ x, g x ∂normalizedCubeMeasure Q := by + simpa [D, g] using! + overlapCentersAtDepth_average_lintegral_normalizedOverlapCubeMeasure_le Q j + (aemeasurable_jacobian_enorm_rpow_parent q V) + (fun S hS => aemeasurable_jacobian_enorm_rpow_overlap q hS V) + rw [cubeEuclideanPositiveBesovOverlapDepthENorm_rpow] + calc + ((D.card : ℝ≥0∞)⁻¹) * D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S.1 V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ q.exponent.toReal) ≤ + ((D.card : ℝ≥0∞)⁻¹) * D.sum (fun S => + (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) := by + apply mul_le_mul_right + calc + D.attach.sum (fun S => + (eLpNorm (fun x => HilbertVec.ofVec + (V.toField x - ScalarOverlap.cubeAverageVec S.1 V.toField)) + q.exponent (ScalarOverlap.normalizedCubeMeasure S.1)) ^ + q.exponent.toReal) ≤ + D.attach.sum (fun S => + (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S.1) := by + exact Finset.sum_le_sum fun S hS => by + rw [← hscale S.1 S.2] + exact hlocal S.1 S.2 + _ = D.sum (fun S => + (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S) := by + simpa using (Finset.sum_attach D (fun S => + (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S)) + _ = (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + (((D.card : ℝ≥0∞)⁻¹) * + D.sum (fun S => ∫⁻ x, g x ∂ScalarOverlap.normalizedCubeMeasure S)) := by + rw [← Finset.mul_sum] + ac_rfl + _ ≤ (C ^ q.exponent.toReal * (ENNReal.ofReal ℓ) ^ q.exponent.toReal) * + ((3 ^ d : ℝ≥0∞) * ∫⁻ x, g x ∂normalizedCubeMeasure Q) := by + exact mul_le_mul_right hassembly _ + _ = (C ^ q.exponent.toReal * (3 ^ d : ℝ≥0∞)) * + (ENNReal.ofReal ℓ) ^ q.exponent.toReal * + (eLpNorm (fun x => HilbertMat.ofMat (V.jacobian x)) + q.exponent (normalizedCubeMeasure Q)) ^ q.exponent.toReal := by + rw [eLpNorm_rpow_eq_lintegral_enorm] + ring + _ = _ := by rfl + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarComparison.lean new file mode 100644 index 0000000000..9c9706d214 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarComparison.lean @@ -0,0 +1,277 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlap +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov + +/-! +# Exact scalar overlap Besov–Gagliardo comparison + +This module identifies the square of the exact `ENNReal` overlap Besov +seminorm at `p = q = 2` with the supremum of the established finite-depth +scalar overlap seminorm squares. It then transports the two existing +finite-depth Besov–Gagliardo comparisons to the exact infinite-depth kernel. + +The only analytic input used by the identification is concrete parent-cube +`L²` membership. It supplies both the root integrability and every enlarged +overlap-cube integrability certificate required by the exact kernel. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Exact scalar overlap parameters at `p = q = 2` and fractional order +`0 < s < 1`. -/ +noncomputable def exactOverlapScalarTwoParameters (s : Set.Ioo (0 : ℝ) 1) : + ExactOverlapFiniteParameters where + s := s.1 + p := 2 + q := 2 + admissible := ⟨s.2.1, s.2.2, by norm_num, by norm_num⟩ + +private theorem cubeScaleFactor_div_pow_eq_sourceZPow_scalarComparison {d : ℕ} + (Q : TriadicCube d) (j : ℕ) : + cubeScaleFactor Q / (3 : ℝ) ^ j = (3 : ℝ) ^ (Q.scale - (j : ℤ)) := by + unfold cubeScaleFactor + rw [zpow_sub₀] + · simp [div_eq_mul_inv] + · norm_num + +private theorem exactOverlapDepthWeight_eq_ofReal_scalarComparison {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (j : ℕ) : + exactOverlapDepthWeight Q s j = + ENNReal.ofReal (cubeBesovOverlapDepthWeight Q s j) := by + unfold exactOverlapDepthWeight cubeBesovOverlapDepthWeight cubeBesovDepthWeight + rw [cubeScaleFactor_div_pow_eq_sourceZPow_scalarComparison] + rw [← Real.rpow_intCast (3 : ℝ) (Q.scale - (j : ℤ)), + ← Real.rpow_mul (by norm_num : 0 ≤ (3 : ℝ))] + rw [← ENNReal.ofReal_rpow_of_pos (by norm_num : 0 < (3 : ℝ))] + congr 1 + · norm_num + · change -(((Q.scale - (j : ℤ) : ℤ) : ℝ)) * s = + ((Q.scale - (j : ℤ) : ℤ) : ℝ) * -s + ring + +private theorem exactOverlapScalarTwoIntegrableOfMemLp {d : ℕ} (Q : TriadicCube d) + {u : Vec d → ℝ} + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + ExactOverlapIntegrable Q u where + root := hmem.integrable (by norm_num) + overlap := fun _ _ hS => + (Gagliardo.memLp_overlap_of_memLp hmem hS).integrable (by norm_num) + +private theorem exactOverlapLocalOscillation_two_eq_ofReal {d : ℕ} + (S : TriadicCube d) (u : Vec d → ℝ) + (hu : Integrable u (ScalarOverlap.normalizedCubeMeasure S)) + (hmem : MemLp u (2 : ℝ≥0∞) (ScalarOverlap.normalizedCubeMeasure S)) : + exactOverlapLocalOscillation S (ENNReal.ofReal 2) u hu = + ENNReal.ofReal (cubeBesovOverlapOscillation S (2 : ℝ≥0∞) u) := by + have hmean : exactOverlapLocalMean S u hu = ScalarOverlap.cubeAverage S u := by + rw [exactOverlapLocalMean_eq, + ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + have hsub : MemLp (fun x => u x - exactOverlapLocalMean S u hu) (2 : ℝ≥0∞) + (ScalarOverlap.normalizedCubeMeasure S) := + hmem.sub (memLp_const (exactOverlapLocalMean S u hu)) + rw [exactOverlapLocalOscillation_eq, + show ENNReal.ofReal (2 : ℝ) = (2 : ℝ≥0∞) by norm_num] + rw [← ENNReal.ofReal_toReal hsub.eLpNorm_ne_top] + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [hmean] at hsub ⊢ + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hsub.aestronglyMeasurable] + +private theorem exactOverlapDepthAverage_two_eq_ofReal {d : ℕ} + (Q : TriadicCube d) (u : Vec d → ℝ) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) (j : ℕ) : + exactOverlapDepthAverage Q 2 u (exactOverlapScalarTwoIntegrableOfMemLp Q hmem) j = + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q (2 : ℝ≥0∞) u j) := by + have hcard : (0 : ℝ) < ((ScalarOverlap.centersAtDepth Q j).card : ℝ) := by + exact_mod_cast ScalarOverlap.centersAtDepth_card_pos Q j + rw [exactOverlapDepthAverage_eq] + unfold cubeBesovOverlapDepthAverage ScalarOverlap.centersAverage + rw [ENNReal.ofReal_mul (inv_nonneg.mpr hcard.le)] + rw [ENNReal.ofReal_inv_of_pos hcard, ENNReal.ofReal_natCast] + rw [ENNReal.ofReal_sum_of_nonneg] + · congr 1 + calc + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + exactOverlapLocalOscillation S.1 (ENNReal.ofReal 2) u + ((exactOverlapScalarTwoIntegrableOfMemLp Q hmem).overlap j S.1 S.2) ^ + (2 : ℝ)) = + (ScalarOverlap.centersAtDepth Q j).attach.sum (fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S.1 (2 : ℝ≥0∞) u ^ (2 : ℝ))) := by + apply Finset.sum_congr rfl + intro S _ + rw [← ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapOscillation_nonneg S.1 (2 : ℝ≥0∞) u) (by norm_num)] + rw [exactOverlapLocalOscillation_two_eq_ofReal S.1 u + ((exactOverlapScalarTwoIntegrableOfMemLp Q hmem).overlap j S.1 S.2) + (Gagliardo.memLp_overlap_of_memLp hmem S.2)] + _ = (ScalarOverlap.centersAtDepth Q j).sum (fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S (2 : ℝ≥0∞) u ^ (2 : ℝ))) := by + let D := ScalarOverlap.centersAtDepth Q j + let f : TriadicCube d → ℝ≥0∞ := fun S => + ENNReal.ofReal + (cubeBesovOverlapOscillation S (2 : ℝ≥0∞) u ^ (2 : ℝ)) + change D.attach.sum (fun S => f S.1) = D.sum f + exact Finset.sum_attach D f + · intro S _ + exact Real.rpow_nonneg + (cubeBesovOverlapOscillation_nonneg S (2 : ℝ≥0∞) u) _ + +private theorem exactOverlapDepthTerm_two_eq_ofReal {d : ℕ} + (Q : TriadicCube d) (s : ℝ) (u : Vec d → ℝ) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) (j : ℕ) : + exactOverlapDepthTerm Q s 2 u (exactOverlapScalarTwoIntegrableOfMemLp Q hmem) j = + ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s (2 : ℝ≥0∞) u j) := by + rw [exactOverlapDepthTerm_eq, + exactOverlapDepthWeight_eq_ofReal_scalarComparison, + exactOverlapDepthAverage_two_eq_ofReal Q u hmem j] + unfold cubeBesovOverlapDepthSeminorm + rw [ENNReal.ofReal_mul (cubeBesovOverlapDepthWeight_nonneg Q s j)] + rw [← ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapDepthAverage_nonneg Q (2 : ℝ≥0∞) u j) (by norm_num)] + norm_num + +private theorem exactOverlapScalarSeminormTwo_sq_eq_iSup_partialSeminorm_canonical + {d : ℕ} (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (u : Vec d → ℝ) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u + (exactOverlapScalarTwoIntegrableOfMemLp Q hmem)) ^ 2 = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u)) ^ 2 := by + have htsum : + (∑' j : ℕ, (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 (2 : ℝ≥0∞) u j)) ^ 2) = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u)) ^ 2 := by + rw [ENNReal.tsum_eq_iSup_nat' (N := fun i => i + 1) + (Filter.tendsto_add_atTop_nat 1)] + apply iSup_congr + intro N + calc + ∑ j ∈ Finset.range (N + 1), + (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 (2 : ℝ≥0∞) u j)) ^ 2 = + ∑ j ∈ Finset.range (N + 1), ENNReal.ofReal + ((cubeBesovOverlapDepthSeminorm Q s.1 (2 : ℝ≥0∞) u j) ^ 2) := by + apply Finset.sum_congr rfl + intro j _ + rw [ENNReal.ofReal_pow + (cubeBesovOverlapDepthSeminorm_nonneg Q s.1 (2 : ℝ≥0∞) u j)] + _ = ENNReal.ofReal + ((cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u) ^ 2) := by + simpa only [ENNReal.toReal_ofNat, Real.rpow_two] using + (Gagliardo.ofReal_partialSeminorm_rpow_eq Q s.1 + (p := (2 : ℝ≥0∞)) (by norm_num) (by norm_num) N u).symm + _ = (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u)) ^ 2 := + ENNReal.ofReal_pow + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) 2 + calc + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u + (exactOverlapScalarTwoIntegrableOfMemLp Q hmem)) ^ 2 = + ∑' j : ℕ, (exactOverlapDepthTerm Q s.1 2 u + (exactOverlapScalarTwoIntegrableOfMemLp Q hmem) j) ^ (2 : ℝ) := by + rw [exactOverlapFiniteSeminorm_eq] + change (((∑' j : ℕ, (exactOverlapDepthTerm Q s.1 2 u + (exactOverlapScalarTwoIntegrableOfMemLp Q hmem) j) ^ (2 : ℝ)) ^ + ((2 : ℝ)⁻¹)) ^ (2 : ℕ)) = _ + rw [← ENNReal.rpow_natCast, ← ENNReal.rpow_mul] + norm_num + _ = ∑' j : ℕ, (ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s.1 (2 : ℝ≥0∞) u j)) ^ 2 := by + apply tsum_congr + intro j + rw [exactOverlapDepthTerm_two_eq_ofReal Q s.1 u hmem j, + ENNReal.rpow_two] + _ = _ := htsum + +/-- Under concrete parent-cube `L²` membership, the square of the exact +`p = q = 2` scalar overlap seminorm is the supremum of the embedded squares +of all finite-depth scalar overlap seminorms. -/ +theorem exactOverlapScalarSeminormTwo_sq_eq_iSup_partialSeminorm {d : ℕ} + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : ExactOverlapIntegrable Q u) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u hu) ^ 2 = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u)) ^ 2 := by + rw [exactOverlapFiniteSeminorm_congr_ae (exactOverlapScalarTwoParameters s) Q hu + (exactOverlapScalarTwoIntegrableOfMemLp Q hmem) + (fun _ _ _ => Filter.EventuallyEq.rfl)] + exact exactOverlapScalarSeminormTwo_sq_eq_iSup_partialSeminorm_canonical + s Q u hmem + +/-- Exact scalar overlap Besov-to-Gagliardo comparison at `p = q = 2`, with +the finite dimensional constant from the established finite-depth estimate. -/ +theorem exactOverlapScalarSeminormTwo_sq_le_gagliardo {d : ℕ} [NeZero d] + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : ExactOverlapIntegrable Q u) (humeas : Measurable u) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u hu) ^ 2 ≤ + 2 * 3 ^ d * Gagliardo.cubeGagliardoESeminorm Q s.1 (2 : ℝ≥0∞) u ^ 2 := by + rw [exactOverlapScalarSeminormTwo_sq_eq_iSup_partialSeminorm s Q u hu hmem] + refine iSup_le fun N => ?_ + rw [← ENNReal.ofReal_pow + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u)] + simpa only [ENNReal.toReal_ofNat, Real.rpow_two, ENNReal.rpow_two] using + Gagliardo.ofReal_partialSeminorm_rpow_le_gagliardo Q s.2.1.le + (p := (2 : ℝ≥0∞)) (by norm_num) (by norm_num) humeas hmem N + +/-- Gagliardo-to-exact-scalar-overlap comparison at `p = q = 2`, with the +finite dimensional constant from the established shell estimate. -/ +theorem gagliardo_sq_le_exactOverlapScalarSeminormTwo {d : ℕ} [NeZero d] + (s : Set.Ioo (0 : ℝ) 1) (Q : TriadicCube d) (u : Vec d → ℝ) + (hu : ExactOverlapIntegrable Q u) (humeas : Measurable u) + (hmem : MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q)) : + Gagliardo.cubeGagliardoESeminorm Q s.1 (2 : ℝ≥0∞) u ^ 2 ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u hu) ^ 2 := by + have hiSup : + (⨆ N : ℕ, ENNReal.ofReal + ((cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u) ^ 2)) = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u)) ^ 2 := by + apply iSup_congr + intro N + exact ENNReal.ofReal_pow + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 + (2 : ℝ≥0∞) (2 : ℝ≥0∞) N u) 2 + calc + Gagliardo.cubeGagliardoESeminorm Q s.1 (2 : ℝ≥0∞) u ^ 2 ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + ⨆ N : ℕ, ENNReal.ofReal + ((cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u) ^ 2) := by + simpa only [ENNReal.toReal_ofNat, Real.rpow_two, ENNReal.rpow_two] using + Gagliardo.gagliardo_rpow_le_iSup_partialSeminorm Q s.2.1.le s.2.2.le + (p := (2 : ℝ≥0∞)) (by norm_num) (by norm_num) humeas hmem + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 (2 : ℝ≥0∞) + (2 : ℝ≥0∞) N u)) ^ 2 := by + rw [hiSup] + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ (2 : ℝ) * + (exactOverlapFiniteSeminorm (exactOverlapScalarTwoParameters s) Q u hu) ^ 2 := by + rw [← exactOverlapScalarSeminormTwo_sq_eq_iSup_partialSeminorm s Q u hu hmem] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarPComparison.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarPComparison.lean new file mode 100644 index 0000000000..926dde9073 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ExactOverlapScalarPComparison.lean @@ -0,0 +1,89 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Besov.Positive.ExactOverlapScalarP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.BesovLeGagliardo +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.GagliardoLeBesov + +/-! +# Exact scalar overlap comparison at arbitrary finite exponent + +This module transports the established finite-depth scalar overlap estimates +to the exact diagonal overlap seminorm through its exact `p`-power identity. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory +open scoped BigOperators ENNReal + +/-- Exact scalar overlap Besov-to-Gagliardo comparison at an arbitrary finite +exponent, with the constant from the finite-depth estimate. -/ +theorem exactOverlapScalarPSeminorm_rpow_le_gagliardo {d : ℕ} [NeZero d] + (s : FractionalOrder) (p : FiniteLpExponent) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (humeas : Measurable u) + (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) : + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u hu) ^ + p.exponent.toReal ≤ + 2 * 3 ^ d * + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent u ^ + p.exponent.toReal := by + rw [exactOverlapScalarPSeminorm_rpow_eq_iSup_partial s p Q u hu hmem] + refine iSup_le fun N => ?_ + have hpr : 0 ≤ p.exponent.toReal := ENNReal.toReal_nonneg + rw [ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 p.exponent p.exponent N u) + hpr] + exact Gagliardo.ofReal_partialSeminorm_rpow_le_gagliardo Q s.2.1.le p.one_lt.le + p.lt_top.ne humeas hmem N + +/-- Gagliardo-to-exact-scalar-overlap comparison at an arbitrary finite +exponent, with the constant from the established shell estimate. -/ +theorem gagliardo_rpow_le_exactOverlapScalarPSeminorm {d : ℕ} [NeZero d] + (s : FractionalOrder) (p : FiniteLpExponent) (Q : TriadicCube d) + (u : Vec d → ℝ) (hu : ExactOverlapIntegrable Q u) (humeas : Measurable u) + (hmem : MemLp u p.exponent (normalizedCubeMeasure Q)) : + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent u ^ + p.exponent.toReal ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u hu) ^ + p.exponent.toReal := by + have hiSup : + (⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u ^ + p.exponent.toReal)) = + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + apply iSup_congr + intro N + have hpr : 0 ≤ p.exponent.toReal := ENNReal.toReal_nonneg + exact (ENNReal.ofReal_rpow_of_nonneg + (cubeBesovOverlapPartialSeminorm_nonneg Q s.1 p.exponent p.exponent N u) + hpr).symm + calc + Gagliardo.cubeGagliardoESeminorm Q s.1 p.exponent u ^ p.exponent.toReal ≤ + (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + ⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u ^ + p.exponent.toReal) := + Gagliardo.gagliardo_rpow_le_iSup_partialSeminorm Q s.2.1.le s.2.2.le + p.one_lt.le p.lt_top.ne humeas hmem + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + ⨆ N : ℕ, (ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s.1 p.exponent p.exponent N u)) ^ + p.exponent.toReal := by + rw [hiSup] + _ = (Gagliardo.gagliardoBesovLowerConstant d) ^ p.exponent.toReal * + (exactOverlapFiniteSeminorm (exactOverlapScalarPParameters s p) Q u hu) ^ + p.exponent.toReal := by + rw [← exactOverlapScalarPSeminorm_rpow_eq_iSup_partial s p Q u hu hmem] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/GagliardoLeBesov.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/GagliardoLeBesov.lean new file mode 100644 index 0000000000..e2bae89cad --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/GagliardoLeBesov.lean @@ -0,0 +1,957 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.PairCapture +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.AssemblyPieces +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ENNRealBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapIntegral + +/-! +# Gagliardo-to-Besov direction of the fractional comparison + +This file proves the lower comparison: the `p`-th power of the fractional +Sobolev (Gagliardo) seminorm of `u` on a triadic cube `Q` is controlled, up +to a dimensional constant, by the supremum of the `p`-th powers of the +finite-depth overlapping Besov seminorms. + +The proof decomposes the off-diagonal product cube into triadic distance +shells, captures each shell pair inside an overlapping center cube at the +matching depth (G3, `exists_centersAtDepth_pair_mem`), splits the difference +through the cube average (triangle inequality plus `L^p` bookkeeping), and +resums the shells into the depth seminorms. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +noncomputable section + +open MeasureTheory ScalarOverlap +open scoped ENNReal BigOperators + +variable {d : ℕ} + +/-- Constant for the Gagliardo-to-Besov direction; depends only on `d`. + +Accounting (everything is measured per `pr := p.toReal ≥ 1`-th power): + +* `2 ^ pr * 2 ≤ 4 ^ pr` from the triangle split through the cube average + (two symmetric one-variable slots); +* `9 ^ (s·pr + d) ≤ 9 ^ pr * (9 ^ d) ^ pr` from comparing the shell radius + `c_Q / 3 ^ (n+1)` with the depth side length `c_Q / 3 ^ j`, `n ≤ j + 1` + (using `s ≤ 1`); +* `3 ^ d ≤ (3 ^ d) ^ pr` from the overlapping center count + `card ≤ (3 ^ d) ^ (j + 1)` against the depth volume `3 ^ (j d)`; +* a final flat factor `2 ≤ 2 ^ pr` from the shell-to-depth reindexing + `j = n - 1`. + +Total: `(2 * (4 * 9 * 9 ^ d * 3 ^ d)) ^ pr = (2 ^ 3 * 3 ^ (3 d + 2)) ^ pr`. -/ +noncomputable def gagliardoBesovLowerConstant (d : ℕ) : ℝ≥0∞ := + 2 ^ 3 * 3 ^ (3 * d + 2) + +/-- Diameter bound for the small triadic cube: two points of `cubeSet Q` are +at `sup`-distance at most the side length `cubeScaleFactor Q`. -/ +theorem dist_le_cubeScaleFactor_of_mem_cubeSet {Q : TriadicCube d} {x y : Vec d} + (hx : x ∈ Homogenization.cubeSet Q) (hy : y ∈ Homogenization.cubeSet Q) : + dist x y ≤ cubeScaleFactor Q := by + have hc : (0 : ℝ) < cubeScaleFactor Q := cubeScaleFactor_pos' Q + refine (dist_pi_le_iff hc.le).2 fun i => ?_ + obtain ⟨hx1, hx2⟩ := hx i + obtain ⟨hy1, hy2⟩ := hy i + have hdiff : ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q - + ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q = cubeScaleFactor Q := by + ring + rw [Real.dist_eq, abs_le] + constructor <;> linarith + +/-- Triadic distance shell adapted to the cube `Q`: pairs at distance in +`(c_Q / 3 ^ (n+1), c_Q / 3 ^ n]`. -/ +def shellSet (Q : TriadicCube d) (n : ℕ) : Set (Vec d × Vec d) := + {z | cubeScaleFactor Q / 3 ^ (n + 1) < dist z.1 z.2 ∧ + dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ n} + +theorem measurableSet_shellSet (Q : TriadicCube d) (n : ℕ) : + MeasurableSet (shellSet Q n) := by + have h1 : IsOpen {z : Vec d × Vec d | + cubeScaleFactor Q / 3 ^ (n + 1) < dist z.1 z.2} := + isOpen_lt continuous_const continuous_dist + have h2 : IsClosed {z : Vec d × Vec d | + dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ n} := + isClosed_le continuous_dist continuous_const + exact h1.measurableSet.inter h2.measurableSet + +/-- Every off-diagonal pair of `Q` lies in some shell. -/ +theorem exists_mem_shellSet {Q : TriadicCube d} {z : Vec d × Vec d} + (hz1 : z.1 ∈ Homogenization.cubeSet Q) (hz2 : z.2 ∈ Homogenization.cubeSet Q) + (hne : z.1 ≠ z.2) : ∃ n : ℕ, z ∈ shellSet Q n := by + classical + have hc : (0 : ℝ) < cubeScaleFactor Q := cubeScaleFactor_pos' Q + have hd : (0 : ℝ) < dist z.1 z.2 := dist_pos.2 hne + have hP : ∃ n : ℕ, cubeScaleFactor Q / 3 ^ (n + 1) < dist z.1 z.2 := by + obtain ⟨m, hm⟩ := exists_pow_lt_of_lt_one (div_pos hd hc) + (by norm_num : (1 / 3 : ℝ) < 1) + refine ⟨m, ?_⟩ + have hpow : ((1 / 3 : ℝ)) ^ m * cubeScaleFactor Q = + cubeScaleFactor Q / 3 ^ m := by + rw [one_div, inv_pow] + ring + have hlt : cubeScaleFactor Q / 3 ^ m < dist z.1 z.2 := by + calc cubeScaleFactor Q / 3 ^ m + = (1 / 3 : ℝ) ^ m * cubeScaleFactor Q := hpow.symm + _ < dist z.1 z.2 / cubeScaleFactor Q * cubeScaleFactor Q := + mul_lt_mul_of_pos_right hm hc + _ = dist z.1 z.2 := div_mul_cancel₀ _ hc.ne' + refine lt_of_le_of_lt ?_ hlt + exact div_le_div_of_nonneg_left hc.le (by positivity) + (pow_le_pow_right₀ (by norm_num) (Nat.le_succ m)) + refine ⟨Nat.find hP, Nat.find_spec hP, ?_⟩ + cases h0 : Nat.find hP with + | zero => + simpa using dist_le_cubeScaleFactor_of_mem_cubeSet hz1 hz2 + | succ m => + have hlt : m < Nat.find hP := by omega + exact not_lt.1 (Nat.find_min hP hlt) + +/-- The kernel integrand vanishes on the diagonal (junk value `0 ^ (-a) = 0`). -/ +private theorem setLIntegral_diagonal_eq_zero {a : ℝ} (ha : a ≠ 0) + (F : Vec d × Vec d → ℝ≥0∞) (ν : Measure (Vec d × Vec d)) : + (∫⁻ z in {z : Vec d × Vec d | z.1 = z.2}, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z ∂ν) = 0 := by + refine setLIntegral_eq_zero + ((isClosed_eq continuous_fst continuous_snd).measurableSet) ?_ + intro z hz + have hz' : z.1 = z.2 := hz + simp [hz', Real.zero_rpow (neg_ne_zero.2 ha)] + +/-- Shell decomposition: the kernel integral over `Q ×ˢ Q` is at most the sum +of its restrictions to the triadic shells (the diagonal contributes nothing). -/ +private theorem setLIntegral_prodCube_le_tsum_shell {Q : TriadicCube d} + {a : ℝ} (ha : a ≠ 0) (F : Vec d × Vec d → ℝ≥0∞) : + (∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + ∑' n : ℕ, + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := by + set ν : Measure (Vec d × Vec d) := + MeasureTheory.volume.prod MeasureTheory.volume + set QQ : Set (Vec d × Vec d) := + Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q + set g : Vec d × Vec d → ℝ≥0∞ := + fun z => ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z + have hsub : QQ ⊆ {z : Vec d × Vec d | z.1 = z.2} ∪ ⋃ n, QQ ∩ shellSet Q n := by + intro z hz + by_cases hdiag : z.1 = z.2 + · exact Or.inl hdiag + · refine Or.inr (Set.mem_iUnion.2 ?_) + obtain ⟨n, hn⟩ := exists_mem_shellSet hz.1 hz.2 hdiag + exact ⟨n, hz, hn⟩ + calc (∫⁻ z in QQ, g z ∂ν) + ≤ ∫⁻ z in {z : Vec d × Vec d | z.1 = z.2} ∪ ⋃ n, QQ ∩ shellSet Q n, + g z ∂ν := lintegral_mono_set hsub + _ ≤ (∫⁻ z in {z : Vec d × Vec d | z.1 = z.2}, g z ∂ν) + + ∫⁻ z in ⋃ n, QQ ∩ shellSet Q n, g z ∂ν := + lintegral_union_le _ _ _ + _ ≤ 0 + ∑' n : ℕ, ∫⁻ z in QQ ∩ shellSet Q n, g z ∂ν := + add_le_add (le_of_eq (setLIntegral_diagonal_eq_zero ha F ν)) + (lintegral_iUnion_le _ _) + _ = ∑' n : ℕ, ∫⁻ z in QQ ∩ shellSet Q n, g z ∂ν := zero_add _ + +/-- Step 1: the `p`-th power of the Gagliardo seminorm as a normalized kernel +integral over the product cube. -/ +private theorem gagliardo_rpow_eq_lintegral {Q : TriadicCube d} {s : ℝ} + {p : ℝ≥0∞} (hp : 1 ≤ p) (hpt : p ≠ ∞) (u : Vec d → ℝ) : + cubeGagliardoESeminorm Q s p u ^ p.toReal = + ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + rw [Internal.cubeGagliardoESeminorm_eq_lintegral hp0 hpt, + ← ENNReal.rpow_mul, one_div_mul_cancel hpr.ne', ENNReal.rpow_one] + rw [lintegral_gagliardoCubeMeasure_eq] + congr 1 + exact lintegral_congr fun z => enorm_gagliardoKernel_rpow s hp0 hpt u z + +/-- G3 packaging: each pair of the `n`-th shell of `Q ×ˢ Q` is captured by an +overlapping center cube at depth `n - 1`. -/ +private theorem shell_capture {Q : TriadicCube d} {n : ℕ} + {z : Vec d × Vec d} + (hz : z ∈ (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n) : + ∃ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S := by + obtain ⟨hzQ, hzs⟩ := hz + have hz1 : z.1 ∈ Homogenization.cubeSet Q := hzQ.1 + have hz2 : z.2 ∈ Homogenization.cubeSet Q := hzQ.2 + cases n with + | zero => + refine ⟨middleChildCube Q, ?_, ?_, ?_⟩ + · rw [centersAtDepth_zero] + exact Finset.mem_singleton_self _ + · rw [cubeSet_middleChildCube_eq_cubeSet] + exact hz1 + · rw [cubeSet_middleChildCube_eq_cubeSet] + exact hz2 + | succ m => + have hdist : dist z.1 z.2 ≤ cubeScaleFactor Q / 3 ^ (m + 1) := hzs.2 + obtain ⟨S, hS, hxS, hyS⟩ := + exists_centersAtDepth_pair_mem hz1 hz2 hdist + exact ⟨S, hS, hxS, hyS⟩ + +/-- The shell integral is at most the sum of the integrals over the products +of the capturing overlapping cubes at depth `n - 1`. -/ +private theorem shell_setLIntegral_le_sum {Q : TriadicCube d} (n : ℕ) + (F : Vec d × Vec d → ℝ≥0∞) : + (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + F z ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + ∑ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + F z ∂(MeasureTheory.volume.prod MeasureTheory.volume) := by + classical + set ν : Measure (Vec d × Vec d) := + MeasureTheory.volume.prod MeasureTheory.volume + set C : Finset (TriadicCube d) := ScalarOverlap.centersAtDepth Q (n - 1) + have hsub : (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n ⊆ + ⋃ S : C, ScalarOverlap.cubeSet (S : TriadicCube d) ×ˢ + ScalarOverlap.cubeSet (S : TriadicCube d) := by + intro z hz + obtain ⟨S, hS, hzS⟩ := shell_capture hz + exact Set.mem_iUnion.2 ⟨⟨S, hS⟩, hzS⟩ + calc (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, F z ∂ν) + ≤ ∫⁻ z in ⋃ S : C, ScalarOverlap.cubeSet (S : TriadicCube d) ×ˢ + ScalarOverlap.cubeSet (S : TriadicCube d), F z ∂ν := + lintegral_mono_set hsub + _ ≤ ∑' S : C, ∫⁻ z in ScalarOverlap.cubeSet (S : TriadicCube d) ×ˢ + ScalarOverlap.cubeSet (S : TriadicCube d), F z ∂ν := + lintegral_iUnion_le _ _ + _ = ∑ S ∈ C, ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + F z ∂ν := by + rw [tsum_fintype] + exact Finset.sum_coe_sort C (fun S => + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, F z ∂ν) + +/-- On the `n`-th shell the kernel weight is bounded by its value at the +inner shell radius, which can then be pulled out of the integral. -/ +private theorem shell_setLIntegral_kernel_le {Q : TriadicCube d} {n : ℕ} + {a : ℝ} (ha : 0 < a) {F : Vec d × Vec d → ℝ≥0∞} (hF : Measurable F) : + (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-a)) * + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + F z ∂(MeasureTheory.volume.prod MeasureTheory.volume) := by + have hb : (0 : ℝ) < cubeScaleFactor Q / 3 ^ (n + 1) := by + have := cubeScaleFactor_pos' Q + positivity + have hAn : MeasurableSet + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n) := + ((Homogenization.measurableSet_cubeSet Q).prod + (Homogenization.measurableSet_cubeSet Q)).inter + (measurableSet_shellSet Q n) + have hmono : ∀ z ∈ (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z ≤ + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-a)) * F z := by + intro z hz + have h1 : cubeScaleFactor Q / 3 ^ (n + 1) < dist z.1 z.2 := hz.2.1 + have h2 : dist z.1 z.2 ^ (-a) ≤ (cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-a) := + Real.rpow_le_rpow_of_nonpos hb h1.le (neg_nonpos.2 ha.le) + exact mul_le_mul' (ENNReal.ofReal_le_ofReal h2) le_rfl + calc (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-a)) * F z + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) + ≤ ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-a)) * F z + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + setLIntegral_mono' hAn hmono + _ = ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-a)) * + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + F z ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + lintegral_const_mul _ hF + +/-- Two-term power-mean inequality in `ℝ≥0∞`: `(A + B)^pr ≤ 2^pr (A^pr + B^pr)`. -/ +private theorem rpow_add_le_two_rpow_mul {pr : ℝ} (hpr : 0 ≤ pr) (A B : ℝ≥0∞) : + (A + B) ^ pr ≤ 2 ^ pr * (A ^ pr + B ^ pr) := by + have hmax : A + B ≤ 2 * max A B := by + rw [two_mul] + exact add_le_add (le_max_left A B) (le_max_right A B) + have hmaxpow : (max A B) ^ pr ≤ A ^ pr + B ^ pr := by + rcases le_total A B with h | h + · rw [max_eq_right h] + exact le_add_self + · rw [max_eq_left h] + exact le_self_add + calc (A + B) ^ pr ≤ (2 * max A B) ^ pr := ENNReal.rpow_le_rpow hmax hpr + _ = 2 ^ pr * (max A B) ^ pr := ENNReal.mul_rpow_of_nonneg _ _ hpr + _ ≤ 2 ^ pr * (A ^ pr + B ^ pr) := by gcongr + +/-- Pointwise triangle split of the difference power through a constant. -/ +private theorem enorm_sub_rpow_le {pr : ℝ} (hpr : 0 ≤ pr) (u : Vec d → ℝ) + (c : ℝ) (z : Vec d × Vec d) : + ‖u z.1 - u z.2‖ₑ ^ pr ≤ + 2 ^ pr * (‖u z.1 - c‖ₑ ^ pr + ‖u z.2 - c‖ₑ ^ pr) := by + have hsplit : ‖u z.1 - u z.2‖ₑ ≤ ‖u z.1 - c‖ₑ + ‖u z.2 - c‖ₑ := by + have hrw : u z.1 - u z.2 = (u z.1 - c) - (u z.2 - c) := by ring + rw [hrw] + exact enorm_sub_le + calc ‖u z.1 - u z.2‖ₑ ^ pr + ≤ (‖u z.1 - c‖ₑ + ‖u z.2 - c‖ₑ) ^ pr := ENNReal.rpow_le_rpow hsplit hpr + _ ≤ 2 ^ pr * (‖u z.1 - c‖ₑ ^ pr + ‖u z.2 - c‖ₑ ^ pr) := + rpow_add_le_two_rpow_mul hpr _ _ + +/-- One-variable integrand over the product set, first slot. -/ +private theorem lintegral_prod_fst_eq {E : Set (Vec d)} {g : Vec d → ℝ≥0∞} + (hg : Measurable g) : + (∫⁻ z in E ×ˢ E, g z.1 + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) = + MeasureTheory.volume E * ∫⁻ x in E, g x ∂MeasureTheory.volume := by + rw [← Measure.prod_restrict] + rw [lintegral_prod (fun z => g z.1) ((hg.comp measurable_fst).aemeasurable)] + have hinner : ∀ x : Vec d, + (∫⁻ _ : Vec d, g x ∂(MeasureTheory.volume.restrict E)) = + g x * MeasureTheory.volume E := by + intro x + rw [lintegral_const, Measure.restrict_apply_univ] + calc (∫⁻ x, ∫⁻ _, g x ∂(MeasureTheory.volume.restrict E) + ∂(MeasureTheory.volume.restrict E)) + = ∫⁻ x, g x * MeasureTheory.volume E + ∂(MeasureTheory.volume.restrict E) := lintegral_congr hinner + _ = (∫⁻ x, g x ∂(MeasureTheory.volume.restrict E)) * + MeasureTheory.volume E := lintegral_mul_const _ hg + _ = MeasureTheory.volume E * ∫⁻ x in E, g x ∂MeasureTheory.volume := + mul_comm _ _ + +/-- One-variable integrand over the product set, second slot. -/ +private theorem lintegral_prod_snd_eq {E : Set (Vec d)} {g : Vec d → ℝ≥0∞} + (hg : Measurable g) : + (∫⁻ z in E ×ˢ E, g z.2 + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) = + MeasureTheory.volume E * ∫⁻ x in E, g x ∂MeasureTheory.volume := by + rw [← Measure.prod_restrict] + rw [lintegral_prod (fun z => g z.2) ((hg.comp measurable_snd).aemeasurable)] + dsimp only + rw [lintegral_const, Measure.restrict_apply_univ, mul_comm] + +/-- Exact `ofReal` form of the oscillation power under `MemLp` (the equality +counterpart of `ofReal_oscillation_rpow_le`). -/ +private theorem ofReal_oscillation_rpow_eq {S : TriadicCube d} {p : ℝ≥0∞} + {u : Vec d → ℝ} + (hu : MemLp u p (ScalarOverlap.normalizedCubeMeasure S)) : + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) = + (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S)) ^ p.toReal := by + have hsub : MemLp (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S) := + hu.sub (memLp_const _) + have hfin : (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S)) ^ p.toReal ≠ ∞ := + ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg hsub.eLpNorm_ne_top + unfold cubeBesovOverlapOscillation ScalarOverlap.cubeLpNorm + rw [Gagliardo.integralLpSeminorm_eq_eLpNorm _ _ _ hsub.aestronglyMeasurable, + ENNReal.toReal_rpow, ENNReal.ofReal_toReal hfin] + +/-- The plain volume integral of the oscillation power equals the volume times +the `ofReal` of the normalized oscillation power. -/ +private theorem lintegral_enorm_sub_average_eq {S : TriadicCube d} {p : ℝ≥0∞} + (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} + (hu : MemLp u p (ScalarOverlap.normalizedCubeMeasure S)) : + (∫⁻ x in ScalarOverlap.cubeSet S, + ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal + ∂MeasureTheory.volume) = + ENNReal.ofReal (ScalarOverlap.cubeVolume S) * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + have hvol : (0 : ℝ) < ScalarOverlap.cubeVolume S := + ScalarOverlap.cubeVolume_pos S + set g : Vec d → ℝ≥0∞ := + fun x => ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal with hg + have hμ : (∫⁻ x, g x ∂(ScalarOverlap.normalizedCubeMeasure S)) = + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume := + ScalarOverlap.lintegral_normalizedCubeMeasure_eq S g + have hcancel : ENNReal.ofReal (ScalarOverlap.cubeVolume S) * + ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ = 1 := by + rw [← ENNReal.ofReal_mul hvol.le, mul_inv_cancel₀ hvol.ne', + ENNReal.ofReal_one] + have hLp : (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S)) ^ p.toReal = + ∫⁻ x, g x ∂(ScalarOverlap.normalizedCubeMeasure S) := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal hp0 hpt + (f := fun x => u x - ScalarOverlap.cubeAverage S u) + (hu.aestronglyMeasurable.sub aestronglyMeasurable_const), ← ENNReal.rpow_mul, + one_div_mul_cancel hpr.ne', ENNReal.rpow_one] + calc (∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume) + = 1 * ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume := + (one_mul _).symm + _ = ENNReal.ofReal (ScalarOverlap.cubeVolume S) * + (ENNReal.ofReal (ScalarOverlap.cubeVolume S)⁻¹ * + ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume) := by + rw [← hcancel, mul_assoc] + _ = ENNReal.ofReal (ScalarOverlap.cubeVolume S) * + ∫⁻ x, g x ∂(ScalarOverlap.normalizedCubeMeasure S) := by + rw [← hμ] + _ = ENNReal.ofReal (ScalarOverlap.cubeVolume S) * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + rw [ofReal_oscillation_rpow_eq hu, hLp] + +/-- Per-cube estimate: the doubled `L^p` difference integral over the product +of an overlapping cube is controlled by the volume squared times the +oscillation power. -/ +private theorem setLIntegral_prod_overlap_le {S : TriadicCube d} {p : ℝ≥0∞} + (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (ScalarOverlap.normalizedCubeMeasure S)) : + (∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + 2 * 2 ^ p.toReal * ENNReal.ofReal (ScalarOverlap.cubeVolume S) ^ 2 * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + set c : ℝ := ScalarOverlap.cubeAverage S u with hc + set g : Vec d → ℝ≥0∞ := fun x => ‖u x - c‖ₑ ^ p.toReal with hgdef + have hg : Measurable g := + (ENNReal.continuous_rpow_const.measurable).comp + ((humeas.sub measurable_const).enorm) + have hpoint : ∀ z : Vec d × Vec d, + ‖u z.1 - u z.2‖ₑ ^ p.toReal ≤ 2 ^ p.toReal * (g z.1 + g z.2) := + fun z => enorm_sub_rpow_le hpr.le u c z + have hvol : MeasureTheory.volume (ScalarOverlap.cubeSet S) = + ENNReal.ofReal (ScalarOverlap.cubeVolume S) := by + rw [← ScalarOverlap.cubeMeasure_apply_univ, + ScalarOverlap.cubeMeasure_apply_univ_eq] + calc (∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) + ≤ ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + 2 ^ p.toReal * (g z.1 + g z.2) + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + lintegral_mono fun z => hpoint z + _ = 2 ^ p.toReal * + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + (g z.1 + g z.2) + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + lintegral_const_mul _ + ((hg.comp measurable_fst).add (hg.comp measurable_snd)) + _ = 2 ^ p.toReal * + ((∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + g z.1 ∂(MeasureTheory.volume.prod MeasureTheory.volume)) + + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + g z.2 ∂(MeasureTheory.volume.prod MeasureTheory.volume)) := by + rw [lintegral_add_left (f := fun z : Vec d × Vec d => g z.1) + (hg.comp measurable_fst)] + _ = 2 ^ p.toReal * + ((MeasureTheory.volume (ScalarOverlap.cubeSet S) * + ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume) + + MeasureTheory.volume (ScalarOverlap.cubeSet S) * + ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume) := by + rw [lintegral_prod_fst_eq hg, lintegral_prod_snd_eq hg] + _ = 2 * 2 ^ p.toReal * + (MeasureTheory.volume (ScalarOverlap.cubeSet S) * + ∫⁻ x in ScalarOverlap.cubeSet S, g x ∂MeasureTheory.volume) := by + ring + _ = 2 * 2 ^ p.toReal * ENNReal.ofReal (ScalarOverlap.cubeVolume S) ^ 2 * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + rw [hvol, lintegral_enorm_sub_average_eq hp hpt hu] + ring + +/-- Inverting BR3: the sum of the oscillation powers over the centers is the +cardinality times the depth average. -/ +private theorem sum_ofReal_oscillation_eq (Q : TriadicCube d) (j : ℕ) + (p : ℝ≥0∞) (u : Vec d → ℝ) : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal)) = + ((ScalarOverlap.centersAtDepth Q j).card : ℝ≥0∞) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u j) := by + rw [ofReal_depthAverage_eq, ← mul_assoc, ENNReal.mul_inv_cancel, one_mul] + · exact_mod_cast ScalarOverlap.centersAtDepth_card_ne_zero Q j + · exact ENNReal.natCast_ne_top _ + +/-- Real-side exponent bookkeeping for one shell: the kernel weight at the +inner shell radius, against the squared depth volume and the cube +normalization, reduces to the Besov depth weight power. -/ +private theorem shell_coefficient_real_le {cQ : ℝ} (hc : 0 < cQ) + {sr pr : ℝ} (hs0 : 0 ≤ sr) (hpr0 : 0 ≤ pr) (m : ℕ) {j n : ℕ} + (hnj : n ≤ j + 1) : + (cQ ^ m)⁻¹ * ((cQ / 3 ^ (n + 1)) ^ (-(sr * pr + (m : ℝ))) * + ((cQ / 3 ^ j) ^ m) ^ 2) ≤ + (9 : ℝ) ^ (sr * pr + (m : ℝ)) * ((3 : ℝ) ^ (j * m))⁻¹ * + (cQ / 3 ^ j) ^ (-(sr * pr)) := by + set a : ℝ := sr * pr + (m : ℝ) with ha_def + have ha0 : 0 ≤ a := by positivity + set e : ℝ := cQ / 3 ^ j with he_def + have he0 : 0 < e := div_pos hc (by positivity) + have he9 : (0 : ℝ) < e / 9 := by positivity + -- Step A: monotone comparison of the kernel weight + have hle : e / 9 ≤ cQ / 3 ^ (n + 1) := by + have h1 : e / 9 = cQ / 3 ^ (j + 2) := by + rw [he_def, div_div, pow_add] + norm_num + rw [h1] + exact div_le_div_of_nonneg_left hc.le (by positivity) + (pow_le_pow_right₀ (by norm_num) (by omega)) + have hA : (cQ / 3 ^ (n + 1)) ^ (-a) ≤ (e / 9) ^ (-a) := + Real.rpow_le_rpow_of_nonpos he9 hle (neg_nonpos.2 ha0) + -- Step B: split the inner radius weight + have hB : (e / 9) ^ (-a) = e ^ (-a) * 9 ^ a := by + rw [div_eq_mul_inv, Real.mul_rpow he0.le (by norm_num : (0:ℝ) ≤ (9:ℝ)⁻¹), + Real.inv_rpow (by norm_num : (0:ℝ) ≤ (9:ℝ)), + Real.rpow_neg (by norm_num : (0:ℝ) ≤ (9:ℝ)), inv_inv] + -- Step C: merge the powers of `e` + have h2m : ((e ^ m) ^ 2 : ℝ) = e ^ ((2 * m : ℕ) : ℝ) := by + rw [Real.rpow_natCast] + ring + have hC : e ^ (-a) * (e ^ m) ^ 2 = e ^ (-(sr * pr)) * e ^ ((m : ℕ) : ℝ) := by + rw [h2m, ← Real.rpow_add he0, ← Real.rpow_add he0, ha_def] + congr 1 + push_cast + ring + -- Step D: the leftover power of `e` cancels the cube normalization + have hD : (cQ ^ m)⁻¹ * e ^ ((m : ℕ) : ℝ) = ((3 : ℝ) ^ (j * m))⁻¹ := by + rw [Real.rpow_natCast] + have hem : e ^ m = cQ ^ m / 3 ^ (j * m) := by + rw [he_def, div_pow, ← pow_mul] + rw [hem, div_eq_mul_inv, ← mul_assoc, + inv_mul_cancel₀ (pow_ne_zero m hc.ne'), one_mul] + calc (cQ ^ m)⁻¹ * ((cQ / 3 ^ (n + 1)) ^ (-a) * (e ^ m) ^ 2) + ≤ (cQ ^ m)⁻¹ * ((e / 9) ^ (-a) * (e ^ m) ^ 2) := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + exact mul_le_mul_of_nonneg_right hA (by positivity) + _ = 9 ^ a * ((cQ ^ m)⁻¹ * (e ^ (-a) * (e ^ m) ^ 2)) := by + rw [hB] + ring + _ = 9 ^ a * ((cQ ^ m)⁻¹ * (e ^ (-(sr * pr)) * e ^ ((m : ℕ) : ℝ))) := by + rw [hC] + _ = 9 ^ a * (e ^ (-(sr * pr)) * ((cQ ^ m)⁻¹ * e ^ ((m : ℕ) : ℝ))) := by + ring + _ = 9 ^ a * (e ^ (-(sr * pr)) * ((3 : ℝ) ^ (j * m))⁻¹) := by + rw [hD] + _ = 9 ^ a * ((3 : ℝ) ^ (j * m))⁻¹ * e ^ (-(sr * pr)) := by + ring + +/-- `ℝ≥0∞` coefficient collapse for one shell: every flat factor is absorbed +into a `pr`-th power of a dimensional constant. -/ +private theorem shell_coefficient_ennreal_le {m : ℕ} {sr pr : ℝ} + (hs1 : sr ≤ 1) (hpr : 1 ≤ pr) (j : ℕ) {card : ℕ} + (hcard : card ≤ (3 ^ m) ^ (j + 1)) : + (9 : ℝ≥0∞) ^ (sr * pr + (m : ℝ)) * ((3 : ℝ≥0∞) ^ (j * m))⁻¹ * + (card : ℝ≥0∞) * (2 * 2 ^ pr) ≤ + ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * m + 2)) ^ pr := by + have hpr0 : (0 : ℝ) ≤ pr := zero_le_one.trans hpr + have hone9m : (1 : ℝ≥0∞) ≤ 9 ^ m := by + simpa using pow_le_pow_left' (show (1 : ℝ≥0∞) ≤ 9 by norm_num) m + have hone3m : (1 : ℝ≥0∞) ≤ 3 ^ m := by + simpa using pow_le_pow_left' (show (1 : ℝ≥0∞) ≤ 3 by norm_num) m + have hA : (9 : ℝ≥0∞) ^ (sr * pr + (m : ℝ)) ≤ ((9 : ℝ≥0∞) * 9 ^ m) ^ pr := by + calc (9 : ℝ≥0∞) ^ (sr * pr + (m : ℝ)) + ≤ (9 : ℝ≥0∞) ^ (pr + (m : ℝ)) := by + refine ENNReal.rpow_le_rpow_of_exponent_le (by norm_num) ?_ + have : sr * pr ≤ 1 * pr := mul_le_mul_of_nonneg_right hs1 hpr0 + linarith + _ = (9 : ℝ≥0∞) ^ pr * 9 ^ ((m : ℕ) : ℝ) := + ENNReal.rpow_add pr (m : ℝ) (by norm_num) (by norm_num) + _ = (9 : ℝ≥0∞) ^ pr * 9 ^ m := by rw [ENNReal.rpow_natCast] + _ ≤ (9 : ℝ≥0∞) ^ pr * ((9 : ℝ≥0∞) ^ m) ^ pr := by + gcongr + exact ENNReal.le_rpow_self_of_one_le hone9m hpr + _ = ((9 : ℝ≥0∞) * 9 ^ m) ^ pr := + (ENNReal.mul_rpow_of_nonneg _ _ hpr0).symm + have hB : ((3 : ℝ≥0∞) ^ (j * m))⁻¹ * (card : ℝ≥0∞) ≤ + ((3 : ℝ≥0∞) ^ m) ^ pr := by + have hcard' : (card : ℝ≥0∞) ≤ (3 : ℝ≥0∞) ^ (j * m + m) := by + calc (card : ℝ≥0∞) ≤ (((3 ^ m) ^ (j + 1) : ℕ) : ℝ≥0∞) := + Nat.cast_le.2 hcard + _ = (3 : ℝ≥0∞) ^ (j * m + m) := by + push_cast + rw [← pow_mul] + congr 1 + ring + calc ((3 : ℝ≥0∞) ^ (j * m))⁻¹ * (card : ℝ≥0∞) + ≤ ((3 : ℝ≥0∞) ^ (j * m))⁻¹ * (3 : ℝ≥0∞) ^ (j * m + m) := by + gcongr + _ = (3 : ℝ≥0∞) ^ m := by + rw [pow_add, ← mul_assoc, + ENNReal.inv_mul_cancel (pow_ne_zero _ (by norm_num)) + (ENNReal.pow_ne_top (by norm_num)), one_mul] + _ ≤ ((3 : ℝ≥0∞) ^ m) ^ pr := + ENNReal.le_rpow_self_of_one_le hone3m hpr + have hC : (2 : ℝ≥0∞) * 2 ^ pr ≤ ((2 : ℝ≥0∞) * 2) ^ pr := by + calc (2 : ℝ≥0∞) * 2 ^ pr ≤ 2 ^ pr * 2 ^ pr := by + gcongr + exact ENNReal.le_rpow_self_of_one_le (by norm_num) hpr + _ = ((2 : ℝ≥0∞) * 2) ^ pr := (ENNReal.mul_rpow_of_nonneg _ _ hpr0).symm + have hbase : ((9 : ℝ≥0∞) * 9 ^ m) * 3 ^ m * ((2 : ℝ≥0∞) * 2) = + (2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * m + 2) := by + have h9 : (9 : ℝ≥0∞) = 3 ^ 2 := by norm_num + rw [h9, ← pow_mul, show 3 * m + 2 = 2 + (2 * m + m) from by ring, + pow_add, pow_add] + ring + calc (9 : ℝ≥0∞) ^ (sr * pr + (m : ℝ)) * ((3 : ℝ≥0∞) ^ (j * m))⁻¹ * + (card : ℝ≥0∞) * (2 * 2 ^ pr) + = (9 : ℝ≥0∞) ^ (sr * pr + (m : ℝ)) * + (((3 : ℝ≥0∞) ^ (j * m))⁻¹ * (card : ℝ≥0∞)) * (2 * 2 ^ pr) := by + ring + _ ≤ ((9 : ℝ≥0∞) * 9 ^ m) ^ pr * ((3 : ℝ≥0∞) ^ m) ^ pr * + ((2 : ℝ≥0∞) * 2) ^ pr := mul_le_mul' (mul_le_mul' hA hB) hC + _ = (((9 : ℝ≥0∞) * 9 ^ m) * 3 ^ m * ((2 : ℝ≥0∞) * 2)) ^ pr := by + rw [← ENNReal.mul_rpow_of_nonneg _ _ hpr0, + ← ENNReal.mul_rpow_of_nonneg _ _ hpr0] + _ = ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * m + 2)) ^ pr := by + rw [hbase] + +/-- Per-shell estimate: the shell integral of the kernel is controlled by the +inner shell weight, the squared depth volume, the center count, the triangle +factor, and the Besov depth average at depth `n - 1`. -/ +private theorem shell_lintegral_le {Q : TriadicCube d} {s : ℝ} {p : ℝ≥0∞} + (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) + (ha : 0 < s * p.toReal + (d : ℝ)) (n : ℕ) : + (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + (2 * 2 ^ p.toReal * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + (((ScalarOverlap.centersAtDepth Q (n - 1)).card : ℝ≥0∞) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u (n - 1)))) := by + have hF : Measurable fun z : Vec d × Vec d => ‖u z.1 - u z.2‖ₑ ^ p.toReal := + (ENNReal.continuous_rpow_const.measurable).comp + (((humeas.comp measurable_fst).sub (humeas.comp measurable_snd)).enorm) + have hvolS : ∀ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + ScalarOverlap.cubeVolume S = (cubeScaleFactor Q / 3 ^ (n - 1)) ^ d := by + intro S hS + unfold ScalarOverlap.cubeVolume + rw [scaleFactor_eq_cubeScaleFactor_div_pow_of_mem_centersAtDepth hS] + calc (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) + ≤ ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + shell_setLIntegral_kernel_le ha hF + _ ≤ ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + mul_le_mul_right (shell_setLIntegral_le_sum n _) _ + _ ≤ ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + 2 * 2 ^ p.toReal * + ENNReal.ofReal (ScalarOverlap.cubeVolume S) ^ 2 * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := + mul_le_mul_right + (Finset.sum_le_sum fun S hS => + setLIntegral_prod_overlap_le hp hpt humeas + (memLp_overlap_of_memLp hu hS)) _ + _ = ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + ∑ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + 2 * 2 ^ p.toReal * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal) := by + congr 1 + refine Finset.sum_congr rfl fun S hS => ?_ + rw [hvolS S hS] + _ = ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + (2 * 2 ^ p.toReal * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + ∑ S ∈ ScalarOverlap.centersAtDepth Q (n - 1), + ENNReal.ofReal (cubeBesovOverlapOscillation S p u ^ p.toReal)) := by + rw [← Finset.mul_sum] + _ = ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + (2 * 2 ^ p.toReal * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + (((ScalarOverlap.centersAtDepth Q (n - 1)).card : ℝ≥0∞) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u (n - 1)))) := by + rw [sum_ofReal_oscillation_eq] + +/-- `ofReal` form of the shell coefficient collapse. -/ +private theorem shell_coefficient_ofReal_le {Q : TriadicCube d} {s pr : ℝ} + (hs0 : 0 ≤ s) (hs1 : s ≤ 1) (hpr : 1 ≤ pr) {j n : ℕ} (hnj : n ≤ j + 1) + {card : ℕ} (hcard : card ≤ (3 ^ d) ^ (j + 1)) : + ENNReal.ofReal (cubeVolume Q)⁻¹ * + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ)))) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2 * + (card : ℝ≥0∞) * (2 * 2 ^ pr) ≤ + ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ pr * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr))) := by + have hc : (0 : ℝ) < cubeScaleFactor Q := cubeScaleFactor_pos' Q + have hpr0 : (0 : ℝ) ≤ pr := zero_le_one.trans hpr + have hreal : (cubeVolume Q)⁻¹ * + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ))) * + ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2) ≤ + (9 : ℝ) ^ (s * pr + (d : ℝ)) * ((3 : ℝ) ^ (j * d))⁻¹ * + (cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr)) := by + have h := shell_coefficient_real_le hc hs0 hpr0 d hnj + have hvolQ : cubeVolume Q = cubeScaleFactor Q ^ d := rfl + rw [hvolQ] + exact h + have h9 : ENNReal.ofReal ((9 : ℝ) ^ (s * pr + (d : ℝ))) = + (9 : ℝ≥0∞) ^ (s * pr + (d : ℝ)) := by + rw [← ENNReal.ofReal_rpow_of_pos (by norm_num : (0 : ℝ) < 9)] + norm_num + have h3 : ENNReal.ofReal (((3 : ℝ) ^ (j * d))⁻¹) = + ((3 : ℝ≥0∞) ^ (j * d))⁻¹ := by + rw [ENNReal.ofReal_inv_of_pos (by positivity), + ENNReal.ofReal_pow (by norm_num : (0 : ℝ) ≤ 3)] + norm_num + have hvol0 : (0 : ℝ) ≤ (cubeVolume Q)⁻¹ := + inv_nonneg.2 (cubeVolume_pos Q).le + have hb0 : (0 : ℝ) ≤ + (cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ))) := + Real.rpow_nonneg (div_nonneg hc.le (by positivity)) _ + have he0 : (0 : ℝ) ≤ (cubeScaleFactor Q / 3 ^ j) ^ d := + pow_nonneg (div_nonneg hc.le (by positivity)) d + have hsplit : ENNReal.ofReal ((cubeVolume Q)⁻¹ * + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ))) * + ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2)) = + ENNReal.ofReal (cubeVolume Q)⁻¹ * + (ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ)))) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2) := by + rw [ENNReal.ofReal_mul hvol0, ENNReal.ofReal_mul hb0, + ENNReal.ofReal_pow he0] + calc ENNReal.ofReal (cubeVolume Q)⁻¹ * + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ)))) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2 * + (card : ℝ≥0∞) * (2 * 2 ^ pr) + = ENNReal.ofReal ((cubeVolume Q)⁻¹ * + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * pr + (d : ℝ))) * + ((cubeScaleFactor Q / 3 ^ j) ^ d) ^ 2)) * + ((card : ℝ≥0∞) * (2 * 2 ^ pr)) := by + rw [hsplit] + ring + _ ≤ ENNReal.ofReal ((9 : ℝ) ^ (s * pr + (d : ℝ)) * + ((3 : ℝ) ^ (j * d))⁻¹ * + (cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr))) * + ((card : ℝ≥0∞) * (2 * 2 ^ pr)) := + mul_le_mul_left (ENNReal.ofReal_le_ofReal hreal) _ + _ = ((9 : ℝ≥0∞) ^ (s * pr + (d : ℝ)) * ((3 : ℝ≥0∞) ^ (j * d))⁻¹ * + (card : ℝ≥0∞) * (2 * 2 ^ pr)) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr))) := by + rw [ENNReal.ofReal_mul (by positivity), + ENNReal.ofReal_mul (Real.rpow_nonneg (by norm_num) _), h9, h3] + ring + _ ≤ ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ pr * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ j) ^ (-(s * pr))) := + mul_le_mul_left (shell_coefficient_ennreal_le hs1 hpr j hcard) _ + +/-- Shell-to-depth collapse: each normalized shell term is bounded by the +`p`-th power of the Besov depth seminorm at depth `n - 1`. -/ +private theorem shell_term_le {Q : TriadicCube d} [NeZero d] {s : ℝ} + (hs0 : 0 ≤ s) (hs1 : s ≤ 1) {p : ℝ≥0∞} (hp : 1 ≤ p) (hpt : p ≠ ∞) + {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) (n : ℕ) : + ENNReal.ofReal (cubeVolume Q)⁻¹ * + (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) ≤ + ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u (n - 1) ^ p.toReal) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr1 : (1 : ℝ) ≤ p.toReal := by + have h1 := ENNReal.toReal_mono hpt hp + simpa using h1 + have hd1 : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast Nat.one_le_iff_ne_zero.2 (NeZero.ne d) + have ha : 0 < s * p.toReal + (d : ℝ) := by + have hsp : 0 ≤ s * p.toReal := + mul_nonneg hs0 (zero_le_one.trans hpr1) + linarith + have hc : (0 : ℝ) < cubeScaleFactor Q := cubeScaleFactor_pos' Q + have hnj : n ≤ (n - 1) + 1 := by omega + have hcard := ScalarOverlap.centersAtDepth_card_le_pow Q (n - 1) + have hw : cubeBesovOverlapDepthWeight Q s (n - 1) ^ p.toReal = + (cubeScaleFactor Q / 3 ^ (n - 1)) ^ (-(s * p.toReal)) := by + unfold cubeBesovOverlapDepthWeight cubeBesovDepthWeight + rw [← Real.rpow_mul (le_of_lt (div_pos hc (by positivity))), neg_mul] + calc ENNReal.ofReal (cubeVolume Q)⁻¹ * + (∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume)) + ≤ ENNReal.ofReal (cubeVolume Q)⁻¹ * + (ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + d))) * + (2 * 2 ^ p.toReal * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + (((ScalarOverlap.centersAtDepth Q (n - 1)).card : ℝ≥0∞) * + ENNReal.ofReal + (cubeBesovOverlapDepthAverage Q p u (n - 1))))) := + mul_le_mul_right (shell_lintegral_le hp hpt humeas hu ha n) _ + _ = (ENNReal.ofReal (cubeVolume Q)⁻¹ * + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n + 1)) ^ (-(s * p.toReal + (d : ℝ)))) * + ENNReal.ofReal ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ d) ^ 2 * + (((ScalarOverlap.centersAtDepth Q (n - 1)).card : ℝ≥0∞)) * + (2 * 2 ^ p.toReal)) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u (n - 1)) := by + ring + _ ≤ (((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + ENNReal.ofReal + ((cubeScaleFactor Q / 3 ^ (n - 1)) ^ (-(s * p.toReal)))) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u (n - 1)) := + mul_le_mul_left + (shell_coefficient_ofReal_le hs0 hs1 hpr1 hnj hcard) _ + _ = ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + (ENNReal.ofReal + (cubeBesovOverlapDepthWeight Q s (n - 1) ^ p.toReal) * + ENNReal.ofReal (cubeBesovOverlapDepthAverage Q p u (n - 1))) := by + rw [hw] + ring + _ = ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u (n - 1) ^ p.toReal) := by + rw [← ofReal_depthSeminorm_rpow_eq Q s hp0 hpt u (n - 1)] + +/-- **Gagliardo-to-Besov comparison.** The `p`-th power of the fractional +Sobolev seminorm on a triadic cube is controlled by the supremum of the +`p`-th powers of the finite-depth overlapping Besov seminorms, with a constant +depending only on the dimension. -/ +theorem gagliardo_rpow_le_iSup_partialSeminorm {d : ℕ} [NeZero d] + (Q : TriadicCube d) {s : ℝ} (hs : 0 ≤ s) (hs1 : s ≤ 1) {p : ℝ≥0∞} + (hp : 1 ≤ p) (hpt : p ≠ ∞) {u : Vec d → ℝ} (humeas : Measurable u) + (hu : MemLp u p (normalizedCubeMeasure Q)) : + cubeGagliardoESeminorm Q s p u ^ p.toReal ≤ + (gagliardoBesovLowerConstant d) ^ p.toReal * + ⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) := by + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr1 : (1 : ℝ) ≤ p.toReal := by + have h1 := ENNReal.toReal_mono hpt hp + simpa using h1 + have hpr0 : (0 : ℝ) ≤ p.toReal := zero_le_one.trans hpr1 + have hd1 : (1 : ℝ) ≤ (d : ℝ) := by + exact_mod_cast Nat.one_le_iff_ne_zero.2 (NeZero.ne d) + have hane : s * p.toReal + (d : ℝ) ≠ 0 := by + have hsp : 0 ≤ s * p.toReal := mul_nonneg hs hpr0 + intro hzero + linarith + -- shell-to-depth reindexing in the summation index + have hreindex : + (∑' n : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u (n - 1) ^ p.toReal)) ≤ + 2 * ∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := by + set h : ℕ → ℝ≥0∞ := fun j => ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) with hh + have hsplit : (∑' n : ℕ, h (n - 1)) = h (0 - 1) + ∑' n : ℕ, h ((n + 1) - 1) := + tsum_eq_zero_add' ENNReal.summable + calc (∑' n : ℕ, h (n - 1)) + = h (0 - 1) + ∑' n : ℕ, h ((n + 1) - 1) := hsplit + _ = h 0 + ∑' n : ℕ, h n := by + simp only [Nat.zero_sub, Nat.add_sub_cancel] + _ ≤ (∑' n : ℕ, h n) + ∑' n : ℕ, h n := + add_le_add (ENNReal.le_tsum 0) le_rfl + _ = 2 * ∑' n : ℕ, h n := (two_mul _).symm + -- the depth series is the supremum of the partial seminorm powers + have htsum_eq : + (∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal)) = + ⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) := by + rw [ENNReal.tsum_eq_iSup_nat' (N := fun i => i + 1) (Filter.tendsto_add_atTop_nat 1)] + exact iSup_congr fun N => + (ofReal_partialSeminorm_rpow_eq Q s hp0 hpt N u).symm + calc cubeGagliardoESeminorm Q s p u ^ p.toReal + = ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + gagliardo_rpow_eq_lintegral hp hpt u + _ ≤ ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∑' n : ℕ, + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + mul_le_mul_right (setLIntegral_prodCube_le_tsum_shell hane _) _ + _ = ∑' n : ℕ, ENNReal.ofReal (cubeVolume Q)⁻¹ * + ∫⁻ z in (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) ∩ + shellSet Q n, + ENNReal.ofReal (dist z.1 z.2 ^ (-(s * p.toReal + d))) * + ‖u z.1 - u z.2‖ₑ ^ p.toReal + ∂(MeasureTheory.volume.prod MeasureTheory.volume) := + ENNReal.tsum_mul_left.symm + _ ≤ ∑' n : ℕ, ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u (n - 1) ^ p.toReal) := + ENNReal.tsum_le_tsum fun n => + shell_term_le hs hs1 hp hpt humeas hu n + _ = ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + ∑' n : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u (n - 1) ^ p.toReal) := + ENNReal.tsum_mul_left + _ ≤ ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal * + (2 * ∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal)) := + mul_le_mul_right hreindex _ + _ = (2 * ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal) * + ∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := by + ring + _ ≤ ((2 : ℝ≥0∞) ^ p.toReal * ((2 : ℝ≥0∞) ^ 2 * 3 ^ (3 * d + 2)) ^ p.toReal) * + ∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := + mul_le_mul_left + (mul_le_mul_left + (ENNReal.le_rpow_self_of_one_le (by norm_num) hpr1) _) _ + _ = (gagliardoBesovLowerConstant d) ^ p.toReal * + ∑' j : ℕ, ENNReal.ofReal + (cubeBesovOverlapDepthSeminorm Q s p u j ^ p.toReal) := by + rw [← ENNReal.mul_rpow_of_nonneg _ _ hpr0] + congr 2 + rw [gagliardoBesovLowerConstant] + ring + _ = (gagliardoBesovLowerConstant d) ^ p.toReal * + ⨆ N : ℕ, ENNReal.ofReal + (cubeBesovOverlapPartialSeminorm Q s p p N u ^ p.toReal) := by + rw [htsum_eq] + +end + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/JensenStep.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/JensenStep.lean new file mode 100644 index 0000000000..6ba8d0ba4d --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/JensenStep.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Definitions +public import LeanPool.CoarseGraining.Homogenization.Multiscale.OverlapLp + +/-! +# Jensen/averaging step for the Gagliardo seminorm on overlap cubes + +This file proves the per-cube Jensen step (U1): for an overlap cube `S`, the +`p`-th power of the `L^p(μ)` oscillation of `u` around its cube average is +controlled by the doubled `L^p` difference integral, where +`μ = ScalarOverlap.normalizedCubeMeasure S` is the probability normalization +of volume on the enlarged cube of `S`. + +The proof is the standard one: the deviation from the average is the average +of differences (probability measure), the enorm of a Bochner integral is at +most the lintegral of enorms, and `L^1(μ) ↪ L^p(μ)` on a probability measure +(Jensen/Hölder). +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open MeasureTheory +open scoped ENNReal + +/-- U1 (Jensen per cube): the `p`-th power of the `L^p` oscillation around the +cube average is at most the doubled `L^p` difference integral, for a +probability normalization and `1 ≤ p < ∞`. -/ +theorem eLpNorm_sub_average_rpow_le_double_lintegral {d : ℕ} + (S : TriadicCube d) {p : ℝ≥0∞} (hp : 1 ≤ p) (hpt : p ≠ ∞) + {u : Vec d → ℝ} + (hu : MeasureTheory.MemLp u p (ScalarOverlap.normalizedCubeMeasure S)) : + (MeasureTheory.eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p + (ScalarOverlap.normalizedCubeMeasure S)) ^ p.toReal ≤ + ∫⁻ x, ∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal + ∂(ScalarOverlap.normalizedCubeMeasure S) + ∂(ScalarOverlap.normalizedCubeMeasure S) := by + set μ : Measure (Vec d) := ScalarOverlap.normalizedCubeMeasure S with hμ + -- The normalized cube measure is a probability measure. + have hprob : IsProbabilityMeasure μ := + ⟨ScalarOverlap.normalizedCubeMeasure_apply_univ S⟩ + -- Exponent bookkeeping. + have hp0 : p ≠ 0 := (zero_lt_one.trans_le hp).ne' + have hpr : 0 < p.toReal := ENNReal.toReal_pos hp0 hpt + -- `u` is integrable on the probability measure. + have hInt : Integrable u μ := hu.integrable hp + -- Step 1: the deviation from the average is the average of differences. + have havg : ∀ x : Vec d, + u x - ScalarOverlap.cubeAverage S u = ∫ y, (u x - u y) ∂μ := by + intro x + have hsub : ∫ y, (u x - u y) ∂μ = (∫ _, u x ∂μ) - ∫ y, u y ∂μ := + integral_sub (integrable_const (u x)) hInt + have hconst : (∫ _, u x ∂μ) = u x := by + rw [integral_const, probReal_univ, one_smul] + rw [hsub, hconst, ScalarOverlap.cubeAverage_eq_integral_normalizedCubeMeasure] + -- Steps 2–3: pointwise bound for each fixed `x`. + have hpoint : ∀ x : Vec d, + ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal ≤ + ∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal ∂μ := by + intro x + have hmeas : AEStronglyMeasurable (fun y => u x - u y) μ := + aestronglyMeasurable_const.sub hu.aestronglyMeasurable + -- Step 2: enorm of the integral is at most the lintegral of enorms. + have h1 : ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ≤ + ∫⁻ y, ‖u x - u y‖ₑ ∂μ := by + rw [havg x] + exact enorm_integral_le_lintegral_enorm _ + -- Step 3: `L^1 ↪ L^p` on the probability measure `μ`. + have h2 : ∫⁻ y, ‖u x - u y‖ₑ ∂μ ≤ + (∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal ∂μ) ^ (1 / p.toReal) := by + have hle : eLpNorm (fun y => u x - u y) 1 μ ≤ + eLpNorm (fun y => u x - u y) p μ := + eLpNorm_le_eLpNorm_of_exponent_le hp + rwa [eLpNorm_one_eq_lintegral_enorm hmeas, + eLpNorm_eq_lintegral_rpow_enorm_toReal hp0 hpt hmeas] at hle + calc ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal + ≤ ((∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal ∂μ) ^ (1 / p.toReal)) ^ p.toReal := + ENNReal.rpow_le_rpow (h1.trans h2) hpr.le + _ = ∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal ∂μ := by + rw [← ENNReal.rpow_mul, one_div_mul_cancel hpr.ne', ENNReal.rpow_one] + -- Step 4: assemble via the `L^p` representation of the left-hand side. + have hLHS : (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p μ) + ^ p.toReal = + ∫⁻ x, ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal ∂μ := by + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal hp0 hpt + (f := fun x => u x - ScalarOverlap.cubeAverage S u) + (hu.aestronglyMeasurable.sub aestronglyMeasurable_const), ← ENNReal.rpow_mul, + one_div_mul_cancel hpr.ne', ENNReal.rpow_one] + calc (eLpNorm (fun x => u x - ScalarOverlap.cubeAverage S u) p μ) ^ p.toReal + = ∫⁻ x, ‖u x - ScalarOverlap.cubeAverage S u‖ₑ ^ p.toReal ∂μ := hLHS + _ ≤ ∫⁻ x, ∫⁻ y, ‖u x - u y‖ₑ ^ p.toReal ∂μ ∂μ := + lintegral_mono fun x => hpoint x + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapCount.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapCount.lean new file mode 100644 index 0000000000..2a28b5f8db --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapCount.lean @@ -0,0 +1,120 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry +public import Mathlib.Data.Int.Interval +public import Mathlib.Data.Fintype.BigOperators + +/-! +# Bounded-overlap count (G2) for the depth-`j` overlapping center family + +A point `x` can lie in at most `3 ^ d` of the overlapping cubes +`ScalarOverlap.cubeSet S` as `S` ranges over `ScalarOverlap.centersAtDepth Q j`. + +The proof is purely arithmetic: all centers at depth `j` share the same scale, +hence the same side factor `c = 3 ^ (Q.scale - (j + 1))`. Membership of `x` in +the overlapping cube of `S` pins each coordinate `S.index i` into the integer +window `(x i / c - 3/2, x i / c + 3/2]`, which contains at most `3` integers. +Since a center is determined by its index vector, at most `3 ^ d` centers can +capture `x`. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open ScalarOverlap + +variable {d : ℕ} + +/-- The half-open real window `(t - 3/2, t + 3/2]` contains at most three +integers: they all lie in `Finset.Icc (⌊t - 3/2⌋ + 1) ⌊t + 3/2⌋`, and this +interval has at most three elements. -/ +theorem card_Icc_window_le_three (t : ℝ) : + (Finset.Icc (⌊t - 3 / 2⌋ + 1) ⌊t + 3 / 2⌋).card ≤ 3 := by + have hfloor_le : (⌊t + 3 / 2⌋ : ℝ) ≤ t + 3 / 2 := Int.floor_le _ + have hlt_floor : t - 3 / 2 < (⌊t - 3 / 2⌋ : ℝ) + 1 := Int.lt_floor_add_one _ + have hreal : (⌊t + 3 / 2⌋ : ℝ) < (⌊t - 3 / 2⌋ : ℝ) + 4 := by linarith + have hint : ⌊t + 3 / 2⌋ < ⌊t - 3 / 2⌋ + 4 := by exact_mod_cast hreal + rw [Int.card_Icc] + omega + +/-- If `x` lies in the overlapping cube of `S`, then each coordinate of the +index of `S` lies in the integer window determined by `x i / cubeScaleFactor S`. -/ +theorem index_mem_Icc_of_mem_overlapCubeSet {S : TriadicCube d} {x : Vec d} + (hx : x ∈ ScalarOverlap.cubeSet S) (i : Fin d) : + S.index i ∈ + Finset.Icc (⌊x i / cubeScaleFactor S - 3 / 2⌋ + 1) + ⌊x i / cubeScaleFactor S + 3 / 2⌋ := by + have hc : 0 < cubeScaleFactor S := cubeScaleFactor_pos' S + obtain ⟨hlo, hhi⟩ := hx i + have hlo' : (S.index i : ℝ) - 3 / 2 ≤ x i / cubeScaleFactor S := + (le_div_iff₀ hc).mpr hlo + have hhi' : x i / cubeScaleFactor S < (S.index i : ℝ) + 3 / 2 := + (div_lt_iff₀ hc).mpr hhi + refine Finset.mem_Icc.mpr ⟨?_, ?_⟩ + · have hfl : (⌊x i / cubeScaleFactor S - 3 / 2⌋ : ℝ) ≤ + x i / cubeScaleFactor S - 3 / 2 := Int.floor_le _ + have hstrict : (⌊x i / cubeScaleFactor S - 3 / 2⌋ : ℝ) < (S.index i : ℝ) := by + linarith + have hint : ⌊x i / cubeScaleFactor S - 3 / 2⌋ < S.index i := by + exact_mod_cast hstrict + omega + · exact Int.le_floor.mpr (by linarith) + +/-- All cubes of the depth-`j` center family share the side factor +`3 ^ (Q.scale - (j + 1))`. -/ +theorem cubeScaleFactor_eq_of_mem_centersAtDepth {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + cubeScaleFactor S = (3 : ℝ) ^ (Q.scale - (j + 1 : ℕ)) := by + rw [cubeScaleFactor, scale_of_mem_centersAtDepth hS] + +open Classical in +/-- G2 (bounded overlap): a point lies in at most `3^d` overlapping cubes +of the depth-`j` center family. -/ +theorem card_centersAtDepth_filter_mem_le {d : ℕ} (Q : TriadicCube d) (j : ℕ) (x : Vec d) : + ((ScalarOverlap.centersAtDepth Q j).filter + (fun S => x ∈ ScalarOverlap.cubeSet S)).card ≤ 3 ^ d := by + classical + set c : ℝ := (3 : ℝ) ^ (Q.scale - (j + 1 : ℕ)) with hc_def + set T : Finset (TriadicCube d) := + (ScalarOverlap.centersAtDepth Q j).filter + (fun S => x ∈ ScalarOverlap.cubeSet S) with hT_def + set W : Finset (Fin d → ℤ) := + Fintype.piFinset + (fun i => Finset.Icc (⌊x i / c - 3 / 2⌋ + 1) ⌊x i / c + 3 / 2⌋) with hW_def + have hscale : ∀ S ∈ T, cubeScaleFactor S = c := by + intro S hS + exact cubeScaleFactor_eq_of_mem_centersAtDepth (Finset.mem_filter.mp hS).1 + have hmaps : ∀ S ∈ T, S.index ∈ W := by + intro S hS + have hx : x ∈ ScalarOverlap.cubeSet S := (Finset.mem_filter.mp hS).2 + refine Fintype.mem_piFinset.mpr fun i => ?_ + have hmem := index_mem_Icc_of_mem_overlapCubeSet hx i + rwa [hscale S hS] at hmem + have hinj : Set.InjOn (fun S : TriadicCube d => S.index) ↑T := by + intro S hS R hR hSR + have hS' : S ∈ centersAtDepth Q j := + (Finset.mem_filter.mp (Finset.mem_coe.mp hS)).1 + have hR' : R ∈ centersAtDepth Q j := + (Finset.mem_filter.mp (Finset.mem_coe.mp hR)).1 + exact eq_of_index_eq_of_mem_centersAtDepth hS' hR' hSR + have hcard_le : T.card ≤ W.card := + Finset.card_le_card_of_injOn (fun S => S.index) hmaps hinj + have hW_card : W.card ≤ 3 ^ d := by + rw [hW_def, Fintype.card_piFinset] + calc + ∏ i : Fin d, (Finset.Icc (⌊x i / c - 3 / 2⌋ + 1) ⌊x i / c + 3 / 2⌋).card + ≤ 3 ^ (Finset.univ : Finset (Fin d)).card := + Finset.prod_le_pow_card _ _ 3 fun i _ => card_Icc_window_le_three (x i / c) + _ = 3 ^ d := by rw [Finset.card_univ, Fintype.card_fin] + exact hcard_le.trans hW_card + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapIntegral.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapIntegral.lean new file mode 100644 index 0000000000..01fe4a3368 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/OverlapIntegral.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.OverlapCount +public import Mathlib.MeasureTheory.Integral.Lebesgue.Basic + +/-! +# Overlap-counting integral bound (U3) + +Summing set-lintegrals over the enlarged cubes of a depth-`j` center family +costs at most the bounded-overlap constant `3^d` times one set-lintegral over +the parent product cube. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open MeasureTheory ScalarOverlap +open scoped ENNReal BigOperators + +variable {d : ℕ} + +/-- The product `E_S ×ˢ E_S` of an enlarged center cube is measurable. -/ +theorem measurableSet_overlap_prod (S : TriadicCube d) : + MeasurableSet (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S) := + (ScalarOverlap.measurableSet_cubeSet S).prod + (ScalarOverlap.measurableSet_cubeSet S) + +open Classical in +/-- Pointwise overlap count on pairs: a pair lies in at most `3^d` of the +products `E_S ×ˢ E_S`, and only when it lies in `Q ×ˢ Q`. -/ +theorem sum_indicator_overlap_prod_le (Q : TriadicCube d) (j : ℕ) + (z : Vec d × Vec d) : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) ≤ + (3 : ℝ≥0∞) ^ d * + (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z := by + by_cases hzQ : z ∈ Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q + · -- count the centers whose product cube contains `z` + have hcount : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z) = + (((ScalarOverlap.centersAtDepth Q j).filter + (fun S => z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S)).card + : ℝ≥0∞) := by + rw [Finset.card_filter] + push_cast + refine Finset.sum_congr rfl fun S _hS => ?_ + by_cases hz : z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S + · simp [hz] + · simp [hz] + rw [hcount, Set.indicator_of_mem hzQ, mul_one] + have hsubset : + (ScalarOverlap.centersAtDepth Q j).filter + (fun S => z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S) ⊆ + (ScalarOverlap.centersAtDepth Q j).filter + (fun S => z.1 ∈ ScalarOverlap.cubeSet S) := by + intro S hS + rw [Finset.mem_filter] at hS ⊢ + exact ⟨hS.1, hS.2.1⟩ + have hcard := (Finset.card_le_card hsubset).trans + (card_centersAtDepth_filter_mem_le Q j z.1) + calc ((((ScalarOverlap.centersAtDepth Q j).filter + (fun S => z ∈ ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S)).card) + : ℝ≥0∞) + ≤ ((3 ^ d : ℕ) : ℝ≥0∞) := by exact_mod_cast hcard + _ = (3 : ℝ≥0∞) ^ d := by push_cast; ring + · -- outside `Q ×ˢ Q` every summand vanishes + have hzero : ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z = 0 := by + intro S hS + refine Set.indicator_of_notMem (fun hz => hzQ ?_) _ + have hsub := cubeSet_subset_cubeSet_of_mem_centersAtDepth hS + exact ⟨hsub hz.1, hsub hz.2⟩ + rw [Finset.sum_congr rfl hzero] + simp + +/-- U3 (overlap-counting integral bound): for any measure `ν` on pairs and any +measurable integrand, the depth-`j` family of product cubes is summable at the +cost of the overlap constant `3^d`. -/ +theorem sum_setLIntegral_overlap_prod_le (Q : TriadicCube d) (j : ℕ) + (ν : Measure (Vec d × Vec d)) {f : Vec d × Vec d → ℝ≥0∞} + (hf : Measurable f) : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, f z ∂ν) ≤ + (3 : ℝ≥0∞) ^ d * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, f z ∂ν := by + classical + have hind : ∀ (A : Set (Vec d × Vec d)), MeasurableSet A → + (∫⁻ z in A, f z ∂ν) = + ∫⁻ z, A.indicator (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν := by + intro A hA + rw [← lintegral_indicator hA] + refine lintegral_congr fun z => ?_ + by_cases hz : z ∈ A + · simp [hz] + · simp [hz] + have hQQ : MeasurableSet + (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q) := + (Homogenization.measurableSet_cubeSet Q).prod + (Homogenization.measurableSet_cubeSet Q) + have hrewrite : ∀ S ∈ ScalarOverlap.centersAtDepth Q j, + (∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, f z ∂ν) = + ∫⁻ z, (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν := + fun S _hS => hind _ (measurableSet_overlap_prod S) + have hsum_eq : + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z in ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S, f z ∂ν) = + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z, (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν := + Finset.sum_congr rfl hrewrite + have hlint_eq : + (∫⁻ z, ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν) = + ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + ∫⁻ z, (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν := + lintegral_finsetSum _ (fun S _hS => + ((measurable_const.indicator (measurableSet_overlap_prod S)).mul hf)) + rw [hsum_eq, ← hlint_eq] + have hpoint : ∀ z, + (∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z) ≤ + (3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z) := by + intro z + rw [← Finset.sum_mul, ← mul_assoc] + exact mul_le_mul' (sum_indicator_overlap_prod_le Q j z) le_rfl + calc (∫⁻ z, ∑ S ∈ ScalarOverlap.centersAtDepth Q j, + (ScalarOverlap.cubeSet S ×ˢ ScalarOverlap.cubeSet S).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν) + ≤ ∫⁻ z, (3 : ℝ≥0∞) ^ d * + ((Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z) ∂ν := + lintegral_mono hpoint + _ = (3 : ℝ≥0∞) ^ d * + ∫⁻ z, (Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q).indicator + (fun _ => (1 : ℝ≥0∞)) z * f z ∂ν := + lintegral_const_mul _ ((measurable_const.indicator hQQ).mul hf) + _ = (3 : ℝ≥0∞) ^ d * + ∫⁻ z in Homogenization.cubeSet Q ×ˢ Homogenization.cubeSet Q, + f z ∂ν := by + rw [hind _ hQQ] + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/PairCapture.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/PairCapture.lean new file mode 100644 index 0000000000..5b5ca25b1b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/PairCapture.lean @@ -0,0 +1,399 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.ShellGeometry + +/-! +# Pair capture by overlapping centers (G3) + +If two points of a triadic cube `Q` are at `sup`-distance at most the side +length of a depth-`(j+1)` cell, then some overlapping center cube at depth `j` +contains both points. This is the geometric input G3 for the fractional +Sobolev versus Besov comparison. + +The proof parametrizes the depth-`m` descendants of `Q` by the integer index +window of radius `halfRange m = (3 ^ m - 1) / 2` around `3 ^ m * Q.index`, +then clamps the cell of the first point one step towards the center of the +window so that the resulting overlapping cube both stays inside `Q` and +captures the second point. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +variable {d : ℕ} + +/-- Radius of the integer index window of the depth-`m` descendants: +`halfRange m = (3 ^ m - 1) / 2`. -/ +def halfRange : ℕ → ℤ + | 0 => 0 + | m + 1 => 3 * halfRange m + 1 + +theorem halfRange_zero : halfRange 0 = 0 := rfl + +theorem halfRange_succ (m : ℕ) : halfRange (m + 1) = 3 * halfRange m + 1 := rfl + +theorem two_mul_halfRange : ∀ m : ℕ, 2 * halfRange m = 3 ^ m - 1 + | 0 => by simp [halfRange] + | m + 1 => by + have ih := two_mul_halfRange m + have h3 : (3 : ℤ) ^ (m + 1) = 3 * 3 ^ m := by ring + rw [halfRange_succ] + omega + +theorem halfRange_nonneg : ∀ m : ℕ, 0 ≤ halfRange m + | 0 => le_refl 0 + | m + 1 => by + have ih := halfRange_nonneg m + rw [halfRange_succ] + omega + +theorem one_le_halfRange_succ (m : ℕ) : 1 ≤ halfRange (m + 1) := by + have := halfRange_nonneg m + rw [halfRange_succ] + omega + +private theorem triadicCube_ext {T R : TriadicCube d} (hs : T.scale = R.scale) + (hi : T.index = R.index) : T = R := by + cases T + cases R + simp_all + +/-- Rounding bound: clamped division by `3` shrinks the index window by a +factor of `3`. -/ +private theorem div3_bound {a h t : ℤ} + (h1 : 3 * a - (3 * h + 1) ≤ t) (h2 : t ≤ 3 * a + (3 * h + 1)) : + a - h ≤ (t + 1) / 3 ∧ (t + 1) / 3 ≤ a + h := by + omega + +/-- Membership constructor for `childCubes`: a cube one scale below `P` whose +index is within the child window of `P` is a child of `P`. -/ +theorem mem_childCubes_of_scale_eq_of_index_range {P T : TriadicCube d} + (hsc : T.scale = P.scale - 1) + (hidx : ∀ i, 0 ≤ T.index i - 3 * P.index i + 1 ∧ + T.index i - 3 * P.index i + 1 < 3) : + T ∈ childCubes P := by + have hlt : ∀ i, (T.index i - 3 * P.index i + 1).toNat < 3 := by + intro i + have h := hidx i + omega + apply mem_childCubes_iff.mpr + refine ⟨fun i => ⟨(T.index i - 3 * P.index i + 1).toNat, hlt i⟩, ?_⟩ + apply triadicCube_ext hsc + funext i + have h := hidx i + have hcast : + ((⟨(T.index i - 3 * P.index i + 1).toNat, hlt i⟩ : Fin 3) : ℤ) = + T.index i - 3 * P.index i + 1 := by + simp [Int.toNat_of_nonneg h.1] + show T.index i = + 3 * P.index i + + ((⟨(T.index i - 3 * P.index i + 1).toNat, hlt i⟩ : Fin 3) : ℤ) - 1 + rw [hcast] + ring + +/-- The index of a depth-`m` descendant of `Q` lies in the window of radius +`halfRange m` around `3 ^ m * Q.index`. -/ +theorem index_range_of_mem_descendantsAtDepth {Q : TriadicCube d} : + ∀ {m : ℕ} {S : TriadicCube d}, S ∈ descendantsAtDepth Q m → + ∀ i, 3 ^ m * Q.index i - halfRange m ≤ S.index i ∧ + S.index i ≤ 3 ^ m * Q.index i + halfRange m + | 0, S, hS => by + rw [descendantsAtDepth_zero, Finset.mem_singleton] at hS + subst hS + intro i + simp only [pow_zero, one_mul, halfRange_zero] + omega + | m + 1, S, hS => by + rcases mem_descendantsAtDepth_succ_iff.mp hS with ⟨R, hR, hSchild⟩ + rcases mem_childCubes_iff.mp hSchild with ⟨digits, rfl⟩ + intro i + have ih := index_range_of_mem_descendantsAtDepth hR i + have hd0 : (0 : ℤ) ≤ (digits i : ℤ) := by + exact_mod_cast Nat.zero_le (digits i).val + have hd2 : (digits i : ℤ) ≤ 2 := by + exact_mod_cast Nat.le_of_lt_succ (digits i).isLt + have hkey : (3 : ℤ) ^ (m + 1) * Q.index i = 3 * (3 ^ m * Q.index i) := by + ring + rw [halfRange_succ, hkey] + show 3 * (3 ^ m * Q.index i) - (3 * halfRange m + 1) ≤ + 3 * R.index i + (digits i : ℤ) - 1 ∧ + 3 * R.index i + (digits i : ℤ) - 1 ≤ + 3 * (3 ^ m * Q.index i) + (3 * halfRange m + 1) + constructor + · linarith [ih.1] + · linarith [ih.2] + +/-- Converse: a cube at scale `Q.scale - m` whose index lies in the window of +radius `halfRange m` around `3 ^ m * Q.index` is a depth-`m` descendant. -/ +theorem mem_descendantsAtDepth_of_index_range {Q : TriadicCube d} : + ∀ {m : ℕ} {T : TriadicCube d}, T.scale = Q.scale - (m : ℤ) → + (∀ i, 3 ^ m * Q.index i - halfRange m ≤ T.index i ∧ + T.index i ≤ 3 ^ m * Q.index i + halfRange m) → + T ∈ descendantsAtDepth Q m + | 0, T, hscale, hbound => by + rw [descendantsAtDepth_zero, Finset.mem_singleton] + refine triadicCube_ext ?_ ?_ + · simpa using hscale + · funext i + have h := hbound i + simp only [pow_zero, one_mul, halfRange_zero] at h + omega + | m + 1, T, hscale, hbound => by + have hPmem : + ({ scale := Q.scale - (m : ℤ), + index := fun i => (T.index i + 1) / 3 } : TriadicCube d) ∈ + descendantsAtDepth Q m := by + refine mem_descendantsAtDepth_of_index_range rfl ?_ + intro i + have h := hbound i + have hkey : (3 : ℤ) ^ (m + 1) * Q.index i = 3 * (3 ^ m * Q.index i) := by + ring + rw [hkey, halfRange_succ] at h + exact div3_bound h.1 h.2 + have hchild : + T ∈ childCubes + ({ scale := Q.scale - (m : ℤ), + index := fun i => (T.index i + 1) / 3 } : TriadicCube d) := by + apply mem_childCubes_of_scale_eq_of_index_range + · show T.scale = Q.scale - (m : ℤ) - 1 + rw [hscale] + push_cast + ring + · intro i + show 0 ≤ T.index i - 3 * ((T.index i + 1) / 3) + 1 ∧ + T.index i - 3 * ((T.index i + 1) / 3) + 1 < 3 + omega + exact mem_descendantsAtDepth_succ_iff.mpr ⟨_, hPmem, hchild⟩ + +/-- Clamp `u` to the window `[A - N, A + N]`. -/ +def clampIndex (A N u : ℤ) : ℤ := max (A - N) (min (A + N) u) + +/-- The clamped index stays in the wide window of radius `h`. -/ +theorem clampIndex_range_wide {A h u : ℤ} (hh : 1 ≤ h) : + A - h ≤ clampIndex A (h - 1) u ∧ clampIndex A (h - 1) u ≤ A + h := by + unfold clampIndex + omega + +/-- The clamped index lies in the strict window of radius `h - 1`. -/ +theorem clampIndex_mem_range {A h u : ℤ} (hh : 1 ≤ h) : + A - (h - 1) ≤ clampIndex A (h - 1) u ∧ + clampIndex A (h - 1) u ≤ A + (h - 1) := by + unfold clampIndex + omega + +/-- The clamped index moves by at most one. -/ +theorem clampIndex_near {A h u : ℤ} (hh : 1 ≤ h) + (h1 : A - h ≤ u) (h2 : u ≤ A + h) : + u - 1 ≤ clampIndex A (h - 1) u ∧ clampIndex A (h - 1) u ≤ u + 1 := by + unfold clampIndex + omega + +/-- Trichotomy: clamping is the identity except at the two extremes of the +wide window, where it moves one step inward. -/ +theorem clampIndex_cases {A h u : ℤ} (hh : 1 ≤ h) + (h1 : A - h ≤ u) (h2 : u ≤ A + h) : + clampIndex A (h - 1) u = u ∨ + (u = A - h ∧ clampIndex A (h - 1) u = u + 1) ∨ + (u = A + h ∧ clampIndex A (h - 1) u = u - 1) := by + unfold clampIndex + omega + +/-- Coordinate arithmetic for the fit lemma: a strict-window cell coordinate +interval is contained in the corresponding parent coordinate interval. -/ +private theorem coord_fit_real {qi ti p c xv : ℝ} (hc : 0 < c) + (hlow : 2 * (p * qi) - p + 3 ≤ 2 * ti) + (hhigh : 2 * ti ≤ 2 * (p * qi) + p - 3) + (hx1 : (ti - 3 / 2) * c ≤ xv) (hx2 : xv < (ti + 3 / 2) * c) : + (qi - 1 / 2) * (p * c) ≤ xv ∧ xv < (qi + 1 / 2) * (p * c) := by + constructor + · have h : (qi - 1 / 2) * p ≤ ti - 3 / 2 := by linarith + have h2 : (qi - 1 / 2) * p * c ≤ (ti - 3 / 2) * c := + mul_le_mul_of_nonneg_right h hc.le + calc (qi - 1 / 2) * (p * c) = (qi - 1 / 2) * p * c := by ring + _ ≤ (ti - 3 / 2) * c := h2 + _ ≤ xv := hx1 + · have h : ti + 3 / 2 ≤ (qi + 1 / 2) * p := by linarith + have h2 : (ti + 3 / 2) * c ≤ (qi + 1 / 2) * p * c := + mul_le_mul_of_nonneg_right h hc.le + calc xv < (ti + 3 / 2) * c := hx2 + _ ≤ (qi + 1 / 2) * p * c := h2 + _ = (qi + 1 / 2) * (p * c) := by ring + +/-- A point of a triadic cell lies in the overlapping cube of any center +within index distance one at the same scale. -/ +private theorem coord_overlap_of_near {s u xi c : ℝ} (hc : 0 < c) + (h1 : u - 1 ≤ s) (h2 : s ≤ u + 1) + (hx1 : (u - 1 / 2) * c ≤ xi) (hx2 : xi < (u + 1 / 2) * c) : + (s - 3 / 2) * c ≤ xi ∧ xi < (s + 3 / 2) * c := by + constructor + · have h : (s - 3 / 2) * c ≤ (u - 1 / 2) * c := + mul_le_mul_of_nonneg_right (by linarith) hc.le + linarith + · have h : (u + 1 / 2) * c ≤ (s + 3 / 2) * c := + mul_le_mul_of_nonneg_right (by linarith) hc.le + linarith + +/-- Fit lemma: an overlapping cube whose center index lies in the strict +window of radius `halfRange (m + 1) - 1` is contained in `Q`. -/ +theorem overlap_cubeSet_subset_of_index_range {Q T : TriadicCube d} {m : ℕ} + (hscale : T.scale = Q.scale - ((m + 1 : ℕ) : ℤ)) + (hbound : ∀ i, + 3 ^ (m + 1) * Q.index i - (halfRange (m + 1) - 1) ≤ T.index i ∧ + T.index i ≤ 3 ^ (m + 1) * Q.index i + (halfRange (m + 1) - 1)) : + ScalarOverlap.cubeSet T ⊆ Homogenization.cubeSet Q := by + have hcT : (0 : ℝ) < cubeScaleFactor T := cubeScaleFactor_pos' T + have hp : ((3 : ℝ) ^ (m + 1)) ≠ 0 := by positivity + have hCQ : cubeScaleFactor Q = (3 : ℝ) ^ (m + 1) * cubeScaleFactor T := by + have h : cubeScaleFactor T = cubeScaleFactor Q / (3 : ℝ) ^ (m + 1) := by + unfold cubeScaleFactor + rw [hscale, zpow_sub₀ (by norm_num : (3 : ℝ) ≠ 0), zpow_natCast] + rw [h, mul_comm, div_mul_cancel₀ _ hp] + intro x hxmem i + obtain ⟨hx1, hx2⟩ := hxmem i + obtain ⟨hb1, hb2⟩ := hbound i + have h2m := two_mul_halfRange (m + 1) + have hZlow : 2 * ((3 : ℤ) ^ (m + 1) * Q.index i) - (3 : ℤ) ^ (m + 1) + 3 ≤ + 2 * T.index i := by + linarith + have hZhigh : 2 * T.index i ≤ + 2 * ((3 : ℤ) ^ (m + 1) * Q.index i) + (3 : ℤ) ^ (m + 1) - 3 := by + linarith + have hRlow : 2 * ((3 : ℝ) ^ (m + 1) * (Q.index i : ℝ)) - (3 : ℝ) ^ (m + 1) + 3 ≤ + 2 * (T.index i : ℝ) := by + exact_mod_cast hZlow + have hRhigh : 2 * (T.index i : ℝ) ≤ + 2 * ((3 : ℝ) ^ (m + 1) * (Q.index i : ℝ)) + (3 : ℝ) ^ (m + 1) - 3 := by + exact_mod_cast hZhigh + rw [hCQ] + exact coord_fit_real hcT hRlow hRhigh hx1 hx2 + +/-- The candidate overlapping center: the depth-`(j + 1)` cell `U` of the +first point, clamped one step into the strict index window of `Q`. -/ +def pairCenter (Q U : TriadicCube d) (j : ℕ) : TriadicCube d := + { scale := U.scale + index := fun i => + clampIndex (3 ^ (j + 1) * Q.index i) (halfRange (j + 1) - 1) (U.index i) } + +theorem pairCenter_scale (Q U : TriadicCube d) (j : ℕ) : + (pairCenter Q U j).scale = U.scale := rfl + +theorem pairCenter_index (Q U : TriadicCube d) (j : ℕ) (i : Fin d) : + (pairCenter Q U j).index i = + clampIndex (3 ^ (j + 1) * Q.index i) (halfRange (j + 1) - 1) + (U.index i) := rfl + +theorem cubeScaleFactor_pairCenter (Q U : TriadicCube d) (j : ℕ) : + cubeScaleFactor (pairCenter Q U j) = cubeScaleFactor U := rfl + +/-- G3 (pair capture): two points of `Q` at `sup`-distance at most the side +length of a depth-`(j + 1)` cell are both contained in some overlapping +center cube at depth `j`. -/ +theorem exists_centersAtDepth_pair_mem {d : ℕ} {Q : TriadicCube d} {j : ℕ} + {x y : Vec d} (hx : x ∈ Homogenization.cubeSet Q) + (hy : y ∈ Homogenization.cubeSet Q) + (hxy : dist x y ≤ cubeScaleFactor Q / 3 ^ (j + 1)) : + ∃ S ∈ ScalarOverlap.centersAtDepth Q j, + x ∈ ScalarOverlap.cubeSet S ∧ y ∈ ScalarOverlap.cubeSet S := by + obtain ⟨U, hU, hxU⟩ := exists_mem_descendantsAtDepth_of_mem_cubeSet (j + 1) hx + have hUscale : U.scale = Q.scale - ((j + 1 : ℕ) : ℤ) := + scale_eq_sub_of_mem_descendantsAtDepth hU + have hUb := index_range_of_mem_descendantsAtDepth hU + have hh1 : 1 ≤ halfRange (j + 1) := one_le_halfRange_succ j + have hc : (0 : ℝ) < cubeScaleFactor U := cubeScaleFactor_pos' U + have hCQ : cubeScaleFactor Q = (3 : ℝ) ^ (j + 1) * cubeScaleFactor U := by + rw [cubeScaleFactor_descendant_eq_div_pow hU, mul_comm, + div_mul_cancel₀ _ (by positivity : ((3 : ℝ) ^ (j + 1)) ≠ 0)] + have hxyc : dist x y ≤ cubeScaleFactor U := by + rw [cubeScaleFactor_descendant_eq_div_pow hU] + exact hxy + refine ⟨pairCenter Q U j, ?_, ?_, ?_⟩ + · -- membership among the overlapping centers at depth `j` + rw [ScalarOverlap.mem_centersAtDepth_iff] + constructor + · refine mem_descendantsAtDepth_of_index_range hUscale ?_ + intro i + rw [pairCenter_index] + exact clampIndex_range_wide hh1 + · refine overlap_cubeSet_subset_of_index_range hUscale ?_ + intro i + rw [pairCenter_index] + exact clampIndex_mem_range hh1 + · -- the first point lies in the overlapping cube + intro i + rw [pairCenter_index, cubeScaleFactor_pairCenter] + obtain ⟨hn1, hn2⟩ := clampIndex_near hh1 (hUb i).1 (hUb i).2 + have hn1' := (Int.cast_le (R := ℝ)).mpr hn1 + have hn2' := (Int.cast_le (R := ℝ)).mpr hn2 + push_cast at hn1' hn2' + exact coord_overlap_of_near hc hn1' hn2' (hxU i).1 (hxU i).2 + · -- the second point lies in the overlapping cube + intro i + rw [pairCenter_index, cubeScaleFactor_pairCenter] + obtain ⟨hya, hyb⟩ := hy i + obtain ⟨hxa, hxb⟩ := hxU i + have hdist : |y i - x i| ≤ cubeScaleFactor U := by + have h1 := dist_le_pi_dist y x i + rw [Real.dist_eq, dist_comm y x] at h1 + exact h1.trans hxyc + obtain ⟨hd1, hd2⟩ := abs_le.mp hdist + have h2m := two_mul_halfRange (j + 1) + rcases clampIndex_cases hh1 (hUb i).1 (hUb i).2 with + hcase | ⟨hext, hcase⟩ | ⟨hext, hcase⟩ + · -- interior case: the center is the cell of `x` itself + have hcaseR : + ((clampIndex (3 ^ (j + 1) * Q.index i) (halfRange (j + 1) - 1) + (U.index i) : ℤ) : ℝ) = (U.index i : ℝ) := by + exact_mod_cast hcase + rw [hcaseR] + constructor + · linarith + · linarith + · -- lower extreme: the cell boundary aligns with the boundary of `Q` + have hcaseR : + ((clampIndex (3 ^ (j + 1) * Q.index i) (halfRange (j + 1) - 1) + (U.index i) : ℤ) : ℝ) = (U.index i : ℝ) + 1 := by + exact_mod_cast hcase + rw [hcaseR] + have hZ : (2 : ℤ) * U.index i - 1 = + 2 * (3 ^ (j + 1) * Q.index i) - 3 ^ (j + 1) := by + linarith + have hZR : (2 : ℝ) * (U.index i : ℝ) - 1 = + 2 * ((3 : ℝ) ^ (j + 1) * (Q.index i : ℝ)) - (3 : ℝ) ^ (j + 1) := by + exact_mod_cast hZ + have halign : ((Q.index i : ℝ) - 1 / 2) * cubeScaleFactor Q = + ((U.index i : ℝ) - 1 / 2) * cubeScaleFactor U := by + rw [hCQ] + linear_combination (-(cubeScaleFactor U) / 2) * hZR + constructor + · linarith + · linarith + · -- upper extreme: mirror image of the previous case + have hcaseR : + ((clampIndex (3 ^ (j + 1) * Q.index i) (halfRange (j + 1) - 1) + (U.index i) : ℤ) : ℝ) = (U.index i : ℝ) - 1 := by + exact_mod_cast hcase + rw [hcaseR] + have hZ : (2 : ℤ) * U.index i + 1 = + 2 * (3 ^ (j + 1) * Q.index i) + 3 ^ (j + 1) := by + linarith + have hZR : (2 : ℝ) * (U.index i : ℝ) + 1 = + 2 * ((3 : ℝ) ^ (j + 1) * (Q.index i : ℝ)) + (3 : ℝ) ^ (j + 1) := by + exact_mod_cast hZ + have halign : ((Q.index i : ℝ) + 1 / 2) * cubeScaleFactor Q = + ((U.index i : ℝ) + 1 / 2) * cubeScaleFactor U := by + rw [hCQ] + linear_combination (-(cubeScaleFactor U) / 2) * hZR + constructor + · linarith + · linarith + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ShellGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ShellGeometry.lean new file mode 100644 index 0000000000..eccb8193aa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/ShellGeometry.lean @@ -0,0 +1,80 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.OverlapCenters + +/-! +# Shell geometry for the fractional Sobolev versus Besov comparison + +Pure triadic-cube geometry and counting; no measure theory. This file +provides the geometric inputs for both directions of the comparison: + +* G1 (diameter): two points of an overlapping cube are at `sup`-distance + less than its side length `3 * cubeScaleFactor S`; +* scale bookkeeping for centers at a given depth. + +The bounded-overlap count (G2) and the pair-capture lemma (G3) build on these +in the companion files. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open ScalarOverlap + +variable {d : ℕ} + +/-- Positivity of the triadic scale factor (public form). -/ +theorem cubeScaleFactor_pos' (S : TriadicCube d) : 0 < cubeScaleFactor S := by + simpa [cubeScaleFactor] using + (zpow_pos (show (0 : ℝ) < 3 by norm_num) S.scale) + +/-- Coordinates of a point of an overlapping cube lie in the defining window. -/ +theorem coord_bounds_of_mem_overlapCubeSet {S : TriadicCube d} {x : Vec d} + (hx : x ∈ ScalarOverlap.cubeSet S) (i : Fin d) : + ((S.index i : ℝ) - 3 / 2) * cubeScaleFactor S ≤ x i ∧ + x i < ((S.index i : ℝ) + 3 / 2) * cubeScaleFactor S := + hx i + +/-- G1 (diameter bound): the overlapping cube of side `3 * cubeScaleFactor S` +has `sup`-norm diameter at most its side length. -/ +theorem dist_le_of_mem_overlapCubeSet {S : TriadicCube d} {x y : Vec d} + (hx : x ∈ ScalarOverlap.cubeSet S) (hy : y ∈ ScalarOverlap.cubeSet S) : + dist x y ≤ 3 * cubeScaleFactor S := by + have hside : (0 : ℝ) ≤ 3 * cubeScaleFactor S := by + have := cubeScaleFactor_pos' S + linarith + refine (dist_pi_le_iff hside).2 fun i => ?_ + have hxi := coord_bounds_of_mem_overlapCubeSet hx i + have hyi := coord_bounds_of_mem_overlapCubeSet hy i + rw [Real.dist_eq, abs_le] + constructor <;> nlinarith [hxi.1, hxi.2, hyi.1, hyi.2] + +/-- The scale of a center at depth `j` below `Q`. -/ +theorem scale_of_mem_centersAtDepth {Q S : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) : + S.scale = Q.scale - (j + 1 : ℕ) := + scale_eq_sub_of_mem_descendantsAtDepth + (mem_descendantsAtDepth_of_mem_centersAtDepth hS) + +/-- Two centers at the same depth with the same index coincide. -/ +theorem eq_of_index_eq_of_mem_centersAtDepth {Q S T : TriadicCube d} {j : ℕ} + (hS : S ∈ centersAtDepth Q j) (hT : T ∈ centersAtDepth Q j) + (hindex : S.index = T.index) : S = T := by + have hscale : S.scale = T.scale := by + rw [scale_of_mem_centersAtDepth hS, scale_of_mem_centersAtDepth hT] + cases S with + | mk scaleS indexS => + cases T with + | mk scaleT indexT => + simp_all + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/TailSummation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/TailSummation.lean new file mode 100644 index 0000000000..ebdbb1b2b8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/TailSummation.lean @@ -0,0 +1,74 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Fractional.Constants + +/-! +# Backwards geometric tail summation + +The per-pair scale accounting of the Besov-to-Gagliardo direction: summing the +coefficients `q^j` over any finite set of depths on which `q^j` is bounded by +`M` costs at most `2 * M`, provided the ratio `q` is at least `3`. Applied +with `q = 3^{s p + d}` and `M = (dist x y)^{-(s p + d)}-ish` this is the +geometric tail that makes the comparison constant dimensional. +-/ + +@[expose] public section + +namespace Homogenization +namespace Gagliardo + +open scoped ENNReal BigOperators + +/-- Backwards geometric summation: if every term `q^j`, `j ∈ F`, is bounded by +`M` and the ratio satisfies `3 ≤ q < ∞`, then the total is at most `2 * M`. -/ +theorem sum_pow_le_two_mul_of_forall_le {q : ℝ≥0∞} (hq3 : 3 ≤ q) (hqt : q ≠ ∞) + {M : ℝ≥0∞} {F : Finset ℕ} (hF : ∀ j ∈ F, q ^ j ≤ M) : + (∑ j ∈ F, q ^ j) ≤ 2 * M := by + rcases F.eq_empty_or_nonempty with hFe | hFne + · simp [hFe] + · have hq0 : q ≠ 0 := by + intro h + rw [h] at hq3 + exact (by norm_num : ¬ (3 : ℝ≥0∞) ≤ 0) hq3 + obtain ⟨n, hnF, hnmax⟩ := F.exists_max_image id hFne + have hsub : F ⊆ Finset.range (n + 1) := by + intro j hj + exact Finset.mem_range.2 (Nat.lt_succ_of_le (hnmax j hj)) + have hstep : (∑ j ∈ F, q ^ j) ≤ ∑ j ∈ Finset.range (n + 1), q ^ j := + Finset.sum_le_sum_of_subset hsub + refine hstep.trans ?_ + -- reflect the range sum and compare with the geometric series in `q⁻¹` + have hreflect : (∑ j ∈ Finset.range (n + 1), q ^ j) + = ∑ k ∈ Finset.range (n + 1), q ^ (n - k) := by + exact (Finset.sum_range_reflect (fun j => q ^ j) (n + 1)).symm + have hterm : ∀ k ∈ Finset.range (n + 1), q ^ (n - k) ≤ q ^ n * (q⁻¹) ^ k := by + intro k hk + have hkn : k ≤ n := Nat.lt_succ_iff.1 (Finset.mem_range.1 hk) + have hpow : q ^ (n - k) * q ^ k = q ^ n := by + rw [← pow_add, Nat.sub_add_cancel hkn] + have hqk0 : q ^ k ≠ 0 := pow_ne_zero k hq0 + have hqkt : q ^ k ≠ ∞ := ENNReal.pow_ne_top hqt + have : q ^ (n - k) = q ^ n * (q ^ k)⁻¹ := by + rw [← hpow, mul_assoc, ENNReal.mul_inv_cancel hqk0 hqkt, mul_one] + rw [this, ENNReal.inv_pow] + have hgeom : (∑ k ∈ Finset.range (n + 1), (q⁻¹) ^ k) ≤ 2 := by + refine sum_range_pow_le_two_of_le_third ?_ (n + 1) + exact ENNReal.inv_le_inv.2 hq3 + calc (∑ j ∈ Finset.range (n + 1), q ^ j) + = ∑ k ∈ Finset.range (n + 1), q ^ (n - k) := hreflect + _ ≤ ∑ k ∈ Finset.range (n + 1), q ^ n * (q⁻¹) ^ k := + Finset.sum_le_sum hterm + _ = q ^ n * ∑ k ∈ Finset.range (n + 1), (q⁻¹) ^ k := by + rw [Finset.mul_sum] + _ ≤ q ^ n * 2 := mul_le_mul_right hgeom _ + _ ≤ M * 2 := mul_le_mul_left (hF n hnF) _ + _ = 2 * M := mul_comm _ _ + +end Gagliardo +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/UnitCubeEuclideanL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/UnitCubeEuclideanL2.lean new file mode 100644 index 0000000000..082b523b52 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Fractional/UnitCubeEuclideanL2.lean @@ -0,0 +1,64 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedDomainCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import Mathlib.MeasureTheory.SpecificCodomains.WithLp + +/-! +# Euclidean `L²` fields on the unit centered cube + +This common source-facing carrier is the Euclidean vector `L²` input used by +the Chapter 1 analytic kernels on the unit centered cube. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +/-- The bounded measurable realization of the unit centered cube. -/ +noncomputable def unitCenteredCubeDomain (d : ℕ) : BoundedMeasurableDomain d := + cubeBoundedMeasurableDomain (originCube d 0) + +/-- The common fractional-order carrier `0 < s < 1`. -/ +abbrev FractionalOrder := Set.Ioo (0 : ℝ) 1 + +theorem FractionalOrder.pos (s : FractionalOrder) : 0 < s.1 := s.2.1 + +theorem FractionalOrder.lt_one (s : FractionalOrder) : s.1 < 1 := s.2.2 + +/-- A Euclidean `L²` vector field on the unit centered cube. The witness uses +the Euclidean Hilbert realization, so it supplies the explicit `euclideanNorm` +`L²` fact without a finite-real fallback. -/ +structure UnitCubeEuclideanL2Field (d : ℕ) where + /-- The represented vector field. -/ + toField : Vec d → Vec d + euclideanMemL2 : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (toField x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume + +namespace UnitCubeEuclideanL2Field + +instance {d : ℕ} : CoeFun (UnitCubeEuclideanL2Field d) (fun _ => Vec d → Vec d) where + coe F := F.toField + +/-- The explicit Euclidean-magnitude form of the stored `L²` fact. -/ +theorem euclideanMagnitudeMemL2 {d : ℕ} (F : UnitCubeEuclideanL2Field d) : + MeasureTheory.MemLp (fun x => euclideanNorm (F x)) (2 : ℝ≥0∞) + (unitCenteredCubeDomain d).normalizedVolume := by + simpa only [euclideanNorm_eq_norm_ofVec] using F.euclideanMemL2.norm + +end UnitCubeEuclideanL2Field + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1.lean new file mode 100644 index 0000000000..82f6f474fb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1.lean @@ -0,0 +1,13 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra + +/-! # H1 -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra.lean new file mode 100644 index 0000000000..d62e668379 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership + +/-! # Algebra -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H10Function.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H10Function.lean new file mode 100644 index 0000000000..6f70cd401f --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H10Function.lean @@ -0,0 +1,879 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H1Function + +/-! # H10Function -/ + +@[expose] public section + +namespace Homogenization +namespace H10Function + +instance {d : ℕ} {U : Set (Vec d)} : Zero (H10Function U) where + zero := + { toH1Function := 0 + approx := fun _ => 0 + approx_smooth := by + intro n + simpa using! (contDiff_zero_fun : ContDiff ℝ (⊤ : ℕ∞) (fun _ : Vec d => (0 : ℝ))) + approx_hasCompactSupport := by + intro n + simpa using (HasCompactSupport.zero : HasCompactSupport (0 : Vec d → ℝ)) + approx_support_subset := by + intro n + simp + tendsto_approx := by + simp + tendsto_approx_grad := by + intro i + simp } + +instance {d : ℕ} {U : Set (Vec d)} : SMul ℝ (H10Function U) where + smul c u := + { toH1Function := c • u.toH1Function + approx := fun n x => c * u.approx n x + approx_smooth := by + intro n + simpa [smul_eq_mul] using (u.approx_smooth n).const_smul c + approx_hasCompactSupport := by + intro n + simpa [Pi.smul_apply, smul_eq_mul] using! + (u.approx_hasCompactSupport n).smul_left (f := fun _ : Vec d => c) + approx_support_subset := by + intro n + simpa [Pi.smul_apply, smul_eq_mul] using + (tsupport_smul_subset_right (fun _ : Vec d => c) (u.approx n)).trans + (u.approx_support_subset n) + tendsto_approx := by + have hscaled : + Filter.Tendsto + (fun n => + ‖c‖ₑ * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds (‖c‖ₑ * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx (Or.inr ENNReal.coe_ne_top) + have hEq : + (fun n => + MeasureTheory.eLpNorm + (fun x => c * u.approx n x - (c • u.toH1Function).toFun x) 2 + (MeasureTheory.volume.restrict U)) = + (fun n => + ‖c‖ₑ * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict U)) := by + funext n + have hfun : + (fun x => c * u.approx n x - (c • u.toH1Function).toFun x) = + c • (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + change c * u.approx n x - c * u.toH1Function.toFun x = + c * (u.approx n x - u.toH1Function.toFun x) + ring + rw [hfun, MeasureTheory.eLpNorm_const_smul] + rw [hEq] + simpa using hscaled + tendsto_approx_grad := by + intro i + have hscaled : + Filter.Tendsto + (fun n => + ‖c‖ₑ * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds (‖c‖ₑ * 0)) := + ENNReal.Tendsto.const_mul (u.tendsto_approx_grad i) (Or.inr ENNReal.coe_ne_top) + have hEq : + (fun n => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => c * u.approx n y) x) (basisVec i) - + (c • u.toH1Function).grad x i) + 2 (MeasureTheory.volume.restrict U)) = + (fun n => + ‖c‖ₑ * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U)) := by + funext n + have hfun : + (fun x => + (fderiv ℝ (fun y => c * u.approx n y) x) (basisVec i) - + (c • u.toH1Function).grad x i) = + c • (fun x => + (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) := by + funext x + have hfd : fderiv ℝ (fun y => c * u.approx n y) x = c • fderiv ℝ (u.approx n) x := by + simpa [smul_eq_mul] using! + congrFun (fderiv_const_smul_field (𝕜 := ℝ) (f := u.approx n) c) x + rw [hfd] + have hgrad : (c • u.toH1Function).grad x i = c * u.grad x i := by + rfl + rw [hgrad] + simp [Pi.smul_apply, smul_eq_mul] + ring + rw [hfun, MeasureTheory.eLpNorm_const_smul] + rw [hEq] + simpa using hscaled } + +instance {d : ℕ} {U : Set (Vec d)} : Neg (H10Function U) where + neg u := (-1 : ℝ) • u + +instance {d : ℕ} {U : Set (Vec d)} : Add (H10Function U) where + add u v := + { toH1Function := u.toH1Function + v.toH1Function + approx := fun n x => u.approx n x + v.approx n x + approx_smooth := by + intro n + exact (u.approx_smooth n).add (v.approx_smooth n) + approx_hasCompactSupport := by + intro n + exact (u.approx_hasCompactSupport n).add (v.approx_hasCompactSupport n) + approx_support_subset := by + intro n + exact (tsupport_add (u.approx n) (v.approx n)).trans <| + Set.union_subset (u.approx_support_subset n) (v.approx_support_subset n) + tendsto_approx := by + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => (u.approx n x + v.approx n x) - (u.toH1Function + v.toH1Function).toFun x) + 2 (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U) + + MeasureTheory.eLpNorm + (fun x => v.approx n x - v.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U) := by + intro n + have hu_mem : MeasureTheory.MemLp (u.approx n) 2 (MeasureTheory.volume.restrict U) := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport (u.approx_hasCompactSupport n)).restrict U + have hv_mem : MeasureTheory.MemLp (v.approx n) 2 (MeasureTheory.volume.restrict U) := + ((v.approx_smooth n).continuous.memLp_of_hasCompactSupport (v.approx_hasCompactSupport n)).restrict U + have hdu_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict U) := + hu_mem.sub u.toH1Function.memL2 + have hdv_mem : + MeasureTheory.MemLp + (fun x => v.approx n x - v.toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict U) := + hv_mem.sub v.toH1Function.memL2 + have hEq : + (fun x => (u.approx n x + v.approx n x) - (u.toH1Function + v.toH1Function).toFun x) = + (fun x => + (u.approx n x - u.toH1Function.toFun x) + + (v.approx n x - v.toH1Function.toFun x)) := by + funext x + change + (u.approx n x + v.approx n x) - (u.toH1Function.toFun x + v.toH1Function.toFun x) = + (u.approx n x - u.toH1Function.toFun x) + (v.approx n x - v.toH1Function.toFun x) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_add_le (by norm_num) + have hsum : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U) + + MeasureTheory.eLpNorm + (fun x => v.approx n x - v.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds (0 + 0)) := + u.tendsto_approx.add v.tendsto_approx + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hsum + tendsto_approx_grad := by + intro i + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx n y + v.approx n y) x) (basisVec i) - + (u.toH1Function + v.toH1Function).grad x i) + 2 (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) + + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (v.approx n) x) (basisVec i) - v.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := by + intro n + have hderiv_u_smooth : + ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := + ((u.approx_smooth n).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + have hderiv_v_smooth : + ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (v.approx n) x) (basisVec i)) := + ((v.approx_smooth n).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + have hderiv_u_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) + 2 (MeasureTheory.volume.restrict U) := + (hderiv_u_smooth.continuous.memLp_of_hasCompactSupport + ((u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict U + have hderiv_v_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (v.approx n) x) (basisVec i)) + 2 (MeasureTheory.volume.restrict U) := + (hderiv_v_smooth.continuous.memLp_of_hasCompactSupport + ((v.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict U + have hdu_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := + hderiv_u_mem.sub (u.toH1Function.gradMemL2 i) + have hdv_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (v.approx n) x) (basisVec i) - v.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) := + hderiv_v_mem.sub (v.toH1Function.gradMemL2 i) + have hEq : + (fun x => + (fderiv ℝ (fun y => u.approx n y + v.approx n y) x) (basisVec i) - + (u.toH1Function + v.toH1Function).grad x i) = + (fun x => + ((fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + + ((fderiv ℝ (v.approx n) x) (basisVec i) - v.toH1Function.grad x i)) := by + funext x + have hfd : + fderiv ℝ (fun y => u.approx n y + v.approx n y) x = + fderiv ℝ (u.approx n) x + fderiv ℝ (v.approx n) x := by + have hu_diff : DifferentiableAt ℝ (u.approx n) x := + ((u.approx_smooth n).contDiffAt).differentiableAt (by norm_num) + have hv_diff : DifferentiableAt ℝ (v.approx n) x := + ((v.approx_smooth n).contDiffAt).differentiableAt (by norm_num) + exact fderiv_add hu_diff hv_diff + rw [hfd] + have hgrad : (u.toH1Function + v.toH1Function).grad x i = u.grad x i + v.grad x i := by + rfl + rw [hgrad] + change + ((fderiv ℝ (u.approx n) x) (basisVec i) + (fderiv ℝ (v.approx n) x) (basisVec i)) - + (u.grad x i + v.grad x i) = + ((fderiv ℝ (u.approx n) x) (basisVec i) - u.grad x i) + + ((fderiv ℝ (v.approx n) x) (basisVec i) - v.grad x i) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_add_le (by norm_num) + have hsum : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U) + + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (v.approx n) x) (basisVec i) - v.toH1Function.grad x i) + 2 (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds (0 + 0)) := + (u.tendsto_approx_grad i).add (v.tendsto_approx_grad i) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hsum } + +instance {d : ℕ} {U : Set (Vec d)} : Sub (H10Function U) where + sub u v := u + (-v) + +/-- Multiplication of an `H¹₀` function by a smooth scalar multiplier which is +bounded, together with its first derivatives, on the underlying domain. The +approximants remain compactly supported in the domain because the original +`H¹₀` approximants are compactly supported there. -/ +noncomputable def mulContDiffMemLpTop {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : + H10Function U := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let uφ : H1Function U := u.toH1Function.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + refine + { toH1Function := uφ + approx := fun n x => φ x * u.approx n x + approx_smooth := ?_ + approx_hasCompactSupport := ?_ + approx_support_subset := ?_ + tendsto_approx := ?_ + tendsto_approx_grad := ?_ } + · intro n + exact hφ.mul (u.approx_smooth n) + · intro n + simpa using! (u.approx_hasCompactSupport n).mul_left (f := φ) + · intro n + exact (tsupport_mul_subset_right (f := φ) (g := u.approx n)).trans + (u.approx_support_subset n) + · + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => φ x * u.approx n x - uφ.toFun x) 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + have hdiff_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hEq : + (fun x => φ x * u.approx n x - uφ.toFun x) = + φ • (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + change φ x * u.approx n x - φ x * u.toH1Function.toFun x = + φ x * (u.approx n x - u.toH1Function.toFun x) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (φ := φ) 2 (by norm_num) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hconst_tendsto + · intro i + let dφ : Vec d → ℝ := fun x => Dφ x i + have hfirst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul (u.tendsto_approx_grad i) + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hsecond_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr (by simpa [dφ, Dφ, μU] using (hdφ_memTop i).eLpNorm_lt_top.ne)) + have hsum_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds + (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0 + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + hfirst_tendsto.add hsecond_tendsto + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) + 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + let A : Vec d → ℝ := fun x => φ x * + ((fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + let B : Vec d → ℝ := fun x => dφ x * (u.approx n x - u.toH1Function.toFun x) + have hbase_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU := by + have happrox_grad_smooth : + ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := + ((u.approx_smooth n).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + have happrox_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) 2 μU := + (happrox_grad_smooth.continuous.memLp_of_hasCompactSupport + ((u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict U + exact happrox_grad_mem.sub (u.toH1Function.gradMemL2 i) + have hbase_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hA_mem : + MeasureTheory.MemLp A 2 μU := by + simpa [A, μU, mul_comm] using hbase_grad_mem.fun_mul (r := 2) hφ_memTop + have hB_mem : + MeasureTheory.MemLp B 2 μU := by + simpa [B, dφ, Dφ, μU, mul_comm] using hbase_mem.fun_mul (r := 2) (hdφ_memTop i) + have hEq : + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) = + fun x => A x + B x := by + funext x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hu_diff : DifferentiableAt ℝ (u.approx n) x := + ((u.approx_smooth n).contDiffAt).differentiableAt (by simp) + rw [show (fun y => φ y * u.approx n y) = φ * u.approx n by rfl, + fderiv_mul hφ_diff hu_diff] + simp [A, B, dφ, Dφ, uφ, H1Function.mulContDiffMemLpTop_grad, + smul_eq_mul] + ring + rw [hEq] + refine (MeasureTheory.eLpNorm_add_le (by norm_num)).trans ?_ + refine add_le_add ?_ ?_ + · simpa [A, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) + (φ := φ) (f := fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.grad x i) + 2 (by norm_num)) + · simpa [B, dφ, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) (φ := dφ) + (f := fun x => u.approx n x - u.toH1Function.toFun x) 2 (by norm_num)) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa [zero_add] using hsum_tendsto + +@[simp] theorem mulContDiffMemLpTop_toFun {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : + (u.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop).toH1Function.toFun = + fun x => φ x * u x := + by + simp [H10Function.mulContDiffMemLpTop] + +@[simp] theorem mulContDiffMemLpTop_grad {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : + (u.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop).toH1Function.grad = + fun x i => φ x * u.toH1Function.grad x i + u.toH1Function.toFun x * + (fderiv ℝ φ x) (basisVec i) := + by + simp [H10Function.mulContDiffMemLpTop, H1Function.mulContDiffMemLpTop_grad] + +/-- Multiplication of an `H¹₀` function by a smooth compactly supported scalar +function. Unlike `mulSmoothCutoff`, the multiplier itself need not be +supported in the domain: the `H¹₀` approximants already have support in the +domain, and multiplying them by the scalar multiplier preserves that support. -/ +noncomputable def mulContDiffHasCompactSupport {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + H10Function U := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let uφ : H1Function U := u.toH1Function.mulContDiffHasCompactSupport hφ hφ_compact + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + have hφ_cont : Continuous φ := hφ.continuous + have hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) μU := + (hφ_cont.memLp_of_hasCompactSupport hφ_compact).restrict U + refine + { toH1Function := uφ + approx := fun n x => φ x * u.approx n x + approx_smooth := ?_ + approx_hasCompactSupport := ?_ + approx_support_subset := ?_ + tendsto_approx := ?_ + tendsto_approx_grad := ?_ } + · intro n + exact hφ.mul (u.approx_smooth n) + · intro n + simpa using! (u.approx_hasCompactSupport n).mul_left (f := φ) + · intro n + exact (tsupport_mul_subset_right (f := φ) (g := u.approx n)).trans + (u.approx_support_subset n) + · + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => φ x * u.approx n x - uφ.toFun x) 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + have hdiff_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hEq : + (fun x => φ x * u.approx n x - uφ.toFun x) = + φ • (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + change φ x * u.approx n x - φ x * u.toH1Function.toFun x = + φ x * (u.approx n x - u.toH1Function.toFun x) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (φ := φ) 2 (by norm_num) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hconst_tendsto + · intro i + let dφ : Vec d → ℝ := fun x => Dφ x i + have hdφ_cont : Continuous dφ := by + simpa [dφ, Dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ, Dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_memTop : MeasureTheory.MemLp dφ (⊤ : ENNReal) μU := + (hdφ_cont.memLp_of_hasCompactSupport hdφ_compact).restrict U + have hfirst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul (u.tendsto_approx_grad i) + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hsecond_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr hdφ_memTop.eLpNorm_lt_top.ne) + have hsum_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds + (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0 + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + hfirst_tendsto.add hsecond_tendsto + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) + 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + let A : Vec d → ℝ := fun x => φ x * + ((fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + let B : Vec d → ℝ := fun x => dφ x * (u.approx n x - u.toH1Function.toFun x) + have hbase_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU := by + have happrox_grad_smooth : + ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := + ((u.approx_smooth n).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + have happrox_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) 2 μU := + (happrox_grad_smooth.continuous.memLp_of_hasCompactSupport + ((u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict U + exact happrox_grad_mem.sub (u.toH1Function.gradMemL2 i) + have hbase_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hA_mem : + MeasureTheory.MemLp A 2 μU := by + simpa [A, μU, mul_comm] using hbase_grad_mem.fun_mul (r := 2) hφ_memTop + have hB_mem : + MeasureTheory.MemLp B 2 μU := by + simpa [B, dφ, μU, mul_comm] using hbase_mem.fun_mul (r := 2) hdφ_memTop + have hEq : + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) = + fun x => A x + B x := by + funext x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hu_diff : DifferentiableAt ℝ (u.approx n) x := + ((u.approx_smooth n).contDiffAt).differentiableAt (by simp) + rw [show (fun y => φ y * u.approx n y) = φ * u.approx n by rfl, + fderiv_mul hφ_diff hu_diff] + simp [A, B, dφ, Dφ, uφ, H1Function.mulContDiffHasCompactSupport_grad, + smul_eq_mul] + ring + rw [hEq] + refine (MeasureTheory.eLpNorm_add_le (by norm_num)).trans ?_ + refine add_le_add ?_ ?_ + · simpa [A, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) + (φ := φ) (f := fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.grad x i) + 2 (by norm_num)) + · simpa [B, dφ, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) (φ := dφ) + (f := fun x => u.approx n x - u.toH1Function.toFun x) 2 (by norm_num)) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa [zero_add] using hsum_tendsto + +@[simp] theorem mulContDiffHasCompactSupport_toFun {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {φ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hφ_compact : HasCompactSupport φ) : + (u.mulContDiffHasCompactSupport hφ hφ_compact).toH1Function.toFun = + fun x => φ x * u x := + by + simp [H10Function.mulContDiffHasCompactSupport] + +noncomputable def mulSmoothCutoff {d : ℕ} {U : Set (Vec d)} (u : H10Function U) + {φ : Vec d → ℝ} (hU : IsOpen U) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + H10Function U := by + let _ := hU + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let uφ : H1Function U := u.toH1Function.mulContDiffHasCompactSupport hφ hφ_compact + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + have hφ_cont : Continuous φ := hφ.continuous + have hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U) := + (hφ_cont.memLp_of_hasCompactSupport hφ_compact).restrict U + refine + { toH1Function := uφ + approx := fun n x => φ x * u.approx n x + approx_smooth := ?_ + approx_hasCompactSupport := ?_ + approx_support_subset := ?_ + tendsto_approx := ?_ + tendsto_approx_grad := ?_ } + · intro n + exact hφ.mul (u.approx_smooth n) + · intro n + simpa using! (u.approx_hasCompactSupport n).mul_left (f := φ) + · intro n + exact (tsupport_mul_subset_left (f := φ) (g := u.approx n)).trans hφ_sub + · + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => φ x * u.approx n x - uφ.toFun x) 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + have hdiff_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hEq : + (fun x => φ x * u.approx n x - uφ.toFun x) = + φ • (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + change φ x * u.approx n x - φ x * u.toH1Function.toFun x = + φ x * (u.approx n x - u.toH1Function.toFun x) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (φ := φ) 2 (by norm_num) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hconst_tendsto + · intro i + let dφ : Vec d → ℝ := fun x => Dφ x i + have hdφ_cont : Continuous dφ := by + simpa [dφ, Dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ, Dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_memTop : MeasureTheory.MemLp dφ (⊤ : ENNReal) (MeasureTheory.volume.restrict U) := + (hdφ_cont.memLp_of_hasCompactSupport hdφ_compact).restrict U + have hfirst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul (u.tendsto_approx_grad i) + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hsecond_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul u.tendsto_approx + (Or.inr hdφ_memTop.eLpNorm_lt_top.ne) + have hsum_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU) + Filter.atTop + (nhds + (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0 + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + hfirst_tendsto.add hsecond_tendsto + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) + 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + intro n + let A : Vec d → ℝ := fun x => φ x * + ((fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + let B : Vec d → ℝ := fun x => dφ x * (u.approx n x - u.toH1Function.toFun x) + have hbase_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) + 2 μU := by + have happrox_grad_smooth : + ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := + ((u.approx_smooth n).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + have happrox_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) 2 μU := + (happrox_grad_smooth.continuous.memLp_of_hasCompactSupport + ((u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i))).restrict U + exact happrox_grad_mem.sub (u.toH1Function.gradMemL2 i) + have hbase_mem : + MeasureTheory.MemLp + (fun x => u.approx n x - u.toH1Function.toFun x) 2 μU := by + have happrox_mem : + MeasureTheory.MemLp (u.approx n) 2 μU := + ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)).restrict U + exact happrox_mem.sub u.toH1Function.memL2 + have hA_mem : + MeasureTheory.MemLp A 2 μU := by + simpa [A, μU, mul_comm] using hbase_grad_mem.fun_mul (r := 2) hφ_memTop + have hB_mem : + MeasureTheory.MemLp B 2 μU := by + simpa [B, dφ, μU, mul_comm] using hbase_mem.fun_mul (r := 2) hdφ_memTop + have hEq : + (fun x => + (fderiv ℝ (fun y => φ y * u.approx n y) x) (basisVec i) - uφ.grad x i) = + fun x => A x + B x := by + funext x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hu_diff : DifferentiableAt ℝ (u.approx n) x := + ((u.approx_smooth n).contDiffAt).differentiableAt (by simp) + rw [show (fun y => φ y * u.approx n y) = φ * u.approx n by rfl, fderiv_mul hφ_diff hu_diff] + simp [A, B, dφ, Dφ, uφ, H1Function.mulContDiffHasCompactSupport_grad, smul_eq_mul] + ring + rw [hEq] + refine (MeasureTheory.eLpNorm_add_le (by norm_num)).trans ?_ + refine add_le_add ?_ ?_ + · simpa [A, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) + (φ := φ) (f := fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.grad x i) + 2 (by norm_num)) + · simpa [B, dφ, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) (φ := dφ) + (f := fun x => u.approx n x - u.toH1Function.toFun x) 2 (by norm_num)) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa [zero_add] using hsum_tendsto + +@[simp] theorem mulSmoothCutoff_toFun {d : ℕ} {U : Set (Vec d)} (u : H10Function U) + {φ : Vec d → ℝ} (hU : IsOpen U) (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) : + (u.mulSmoothCutoff hU hφ hφ_compact hφ_sub).toH1Function.toFun = + fun x => φ x * u x := + by + simp [H10Function.mulSmoothCutoff] + +end H10Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H1Function.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H1Function.lean new file mode 100644 index 0000000000..ce8adf55dc --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/H1Function.lean @@ -0,0 +1,654 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing +public import Mathlib.Analysis.Calculus.FDeriv.Mul +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp + +/-! # H1Function -/ + +@[expose] public section + +namespace Homogenization + +namespace H1Function + +instance {d : ℕ} {U : Set (Vec d)} : Zero (H1Function U) where + zero := + { toFun := 0 + grad := 0 + memL2 := by + exact + (MeasureTheory.MemLp.zero : + MeasureTheory.MemLp (0 : Vec d → ℝ) 2 (MeasureTheory.volume.restrict U)) + gradMemL2 := by + intro i + exact + (MeasureTheory.MemLp.zero : + MeasureTheory.MemLp (0 : Vec d → ℝ) 2 (MeasureTheory.volume.restrict U)) + hasWeakGradient := by + intro i φ hφ hφ_supp hφ_sub + simp } + +instance {d : ℕ} {U : Set (Vec d)} : SMul ℝ (H1Function U) where + smul c u := + { toFun := fun x => c * u x + grad := fun x => c • u.grad x + memL2 := u.memL2.const_mul c + gradMemL2 := by + intro i + simpa [Pi.smul_apply, smul_eq_mul] using (u.gradMemL2 i).const_mul c + hasWeakGradient := by + intro i φ hφ hφ_supp hφ_sub + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + have hu_eq := u.hasWeakGradient i φ hφ hφ_supp hφ_sub + have hφ1 : ContDiff ℝ 1 φ := hφ.of_le (by simp) + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ1.continuous_fderiv (by simp)).clm_apply + continuous_const + have hdφ_supp : HasCompactSupport dφ := by + simpa [dφ] using hφ_supp.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hu_int : + MeasureTheory.Integrable (fun x => u x * dφ x) (MeasureTheory.volume.restrict U) := by + have hu_loc : MeasureTheory.LocallyIntegrable u (MeasureTheory.volume.restrict U) := + u.memL2.locallyIntegrable (by norm_num) + simpa [smul_eq_mul] using + hu_loc.integrable_smul_right_of_hasCompactSupport hdφ_cont hdφ_supp + have hgrad : + (fun x => c * (u.grad x i * φ x)) = + (fun x => ((fun x => c • u.grad x) x i) * φ x) := by + funext x + simp [Pi.smul_apply, smul_eq_mul] + ring + have hgrad_int : + ∫ x in U, c * (u.grad x i * φ x) ∂MeasureTheory.volume = + ∫ x in U, ((fun x => c • u.grad x) x i) * φ x ∂MeasureTheory.volume := by + rw [hgrad] + calc + ∫ x in U, (c * u x) * dφ x ∂MeasureTheory.volume + = ∫ x in U, c * (u x * dφ x) ∂MeasureTheory.volume := by + congr with x + ring + _ = c * ∫ x in U, u x * dφ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = c * (-∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume) := by + rw [hu_eq] + _ = -(c * ∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume) := by + ring + _ = -∫ x in U, c * (u.grad x i * φ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = -∫ x in U, ((fun x => c • u.grad x) x i) * φ x ∂MeasureTheory.volume := by + show -(∫ x in U, c * (u.grad x i * φ x) ∂MeasureTheory.volume) = + -(∫ x in U, ((fun x => c • u.grad x) x i) * φ x ∂MeasureTheory.volume) + exact congrArg Neg.neg hgrad_int + } + +instance {d : ℕ} {U : Set (Vec d)} : Neg (H1Function U) where + neg u := (-1 : ℝ) • u + +instance {d : ℕ} {U : Set (Vec d)} : Add (H1Function U) where + add u v := + { toFun := fun x => u x + v x + grad := fun x => u.grad x + v.grad x + memL2 := u.memL2.add v.memL2 + gradMemL2 := by + intro i + simpa [Pi.add_apply] using! (u.gradMemL2 i).add (v.gradMemL2 i) + hasWeakGradient := by + intro i φ hφ hφ_supp hφ_sub + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + have hu_eq := u.hasWeakGradient i φ hφ hφ_supp hφ_sub + have hv_eq := v.hasWeakGradient i φ hφ hφ_supp hφ_sub + have hφ1 : ContDiff ℝ 1 φ := hφ.of_le (by simp) + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ1.continuous_fderiv (by simp)).clm_apply + continuous_const + have hdφ_supp : HasCompactSupport dφ := by + simpa [dφ] using hφ_supp.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hu_int : + MeasureTheory.Integrable (fun x => u x * dφ x) (MeasureTheory.volume.restrict U) := by + have hu_loc : MeasureTheory.LocallyIntegrable u (MeasureTheory.volume.restrict U) := + u.memL2.locallyIntegrable (by norm_num) + simpa [smul_eq_mul] using + hu_loc.integrable_smul_right_of_hasCompactSupport hdφ_cont hdφ_supp + have hv_int : + MeasureTheory.Integrable (fun x => v x * dφ x) (MeasureTheory.volume.restrict U) := by + have hv_loc : MeasureTheory.LocallyIntegrable v (MeasureTheory.volume.restrict U) := + v.memL2.locallyIntegrable (by norm_num) + simpa [smul_eq_mul] using + hv_loc.integrable_smul_right_of_hasCompactSupport hdφ_cont hdφ_supp + have hgu_int : + MeasureTheory.Integrable (fun x => u.grad x i * φ x) (MeasureTheory.volume.restrict U) := by + have hgu_loc : + MeasureTheory.LocallyIntegrable (fun x => u.grad x i) + (MeasureTheory.volume.restrict U) := + (u.gradMemL2 i).locallyIntegrable (by norm_num) + simpa [smul_eq_mul] using + hgu_loc.integrable_smul_right_of_hasCompactSupport hφ.continuous hφ_supp + have hgv_int : + MeasureTheory.Integrable (fun x => v.grad x i * φ x) (MeasureTheory.volume.restrict U) := by + have hgv_loc : + MeasureTheory.LocallyIntegrable (fun x => v.grad x i) + (MeasureTheory.volume.restrict U) := + (v.gradMemL2 i).locallyIntegrable (by norm_num) + simpa [smul_eq_mul] using + hgv_loc.integrable_smul_right_of_hasCompactSupport hφ.continuous hφ_supp + have hgrad : + (fun x => u.grad x i * φ x + v.grad x i * φ x) = + (fun x => ((u.grad x + v.grad x) i) * φ x) := by + funext x + simp [Pi.add_apply] + ring + have hgrad_int : + ∫ x in U, (u.grad x i * φ x + v.grad x i * φ x) ∂MeasureTheory.volume = + ∫ x in U, ((u.grad x + v.grad x) i) * φ x ∂MeasureTheory.volume := by + rw [hgrad] + calc + ∫ x in U, (u x + v x) * dφ x ∂MeasureTheory.volume + = ∫ x in U, (u x * dφ x + v x * dφ x) ∂MeasureTheory.volume := by + congr with x + ring + _ = ∫ x in U, u x * dφ x ∂MeasureTheory.volume + + ∫ x in U, v x * dφ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hu_int hv_int] + _ = (-∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume) + + (-∫ x in U, v.grad x i * φ x ∂MeasureTheory.volume) := by + rw [hu_eq, hv_eq] + _ = -((∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume) + + (∫ x in U, v.grad x i * φ x ∂MeasureTheory.volume)) := by + ring + _ = -∫ x in U, (u.grad x i * φ x + v.grad x i * φ x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hgu_int hgv_int] + _ = -∫ x in U, ((u.grad x + v.grad x) i) * φ x ∂MeasureTheory.volume := by + show -(∫ x in U, (u.grad x i * φ x + v.grad x i * φ x) ∂MeasureTheory.volume) = + -(∫ x in U, ((u.grad x + v.grad x) i) * φ x ∂MeasureTheory.volume) + exact congrArg Neg.neg hgrad_int + } + +instance {d : ℕ} {U : Set (Vec d)} : Sub (H1Function U) where + sub u v := u + (-v) + +@[simp] theorem zero_toFun {d : ℕ} {U : Set (Vec d)} : + (0 : H1Function U).toFun = 0 := + rfl + +@[simp] theorem zero_grad {d : ℕ} {U : Set (Vec d)} : + (0 : H1Function U).grad = 0 := + rfl + +@[simp] theorem add_toFun {d : ℕ} {U : Set (Vec d)} (u v : H1Function U) : + (u + v).toFun = fun x => u x + v x := + rfl + +@[simp] theorem add_grad {d : ℕ} {U : Set (Vec d)} (u v : H1Function U) : + (u + v).grad = fun x => u.grad x + v.grad x := + rfl + +@[simp] theorem smul_toFun {d : ℕ} {U : Set (Vec d)} (c : ℝ) (u : H1Function U) : + (c • u).toFun = fun x => c * u x := + rfl + +@[simp] theorem smul_grad {d : ℕ} {U : Set (Vec d)} (c : ℝ) (u : H1Function U) : + (c • u).grad = fun x => c • u.grad x := + rfl + +@[simp] theorem neg_toFun {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + (-u).toFun = fun x => -u x := by + show ((-1 : ℝ) • u).toFun = fun x => -u x + funext x + simp + +@[simp] theorem neg_grad {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + (-u).grad = fun x => -u.grad x := by + show ((-1 : ℝ) • u).grad = fun x => -u.grad x + funext x + simp + +@[simp] theorem sub_toFun {d : ℕ} {U : Set (Vec d)} (u v : H1Function U) : + (u - v).toFun = fun x => u x - v x := by + show (u + (-v)).toFun = fun x => u x - v x + funext x + simp [sub_eq_add_neg] + +@[simp] theorem sub_grad {d : ℕ} {U : Set (Vec d)} (u v : H1Function U) : + (u - v).grad = fun x => u.grad x - v.grad x := by + show (u + (-v)).grad = fun x => u.grad x - v.grad x + funext x + simp [sub_eq_add_neg] + +instance {d : ℕ} {U : Set (Vec d)} : SMul ℕ (H1Function U) where + smul n u := (n : ℝ) • u + +instance {d : ℕ} {U : Set (Vec d)} : SMul ℤ (H1Function U) where + smul n u := (n : ℝ) • u + +/-- Evaluate the derivative of two smooth scalar multipliers in an arbitrary direction. +Both bounded and compactly supported `H¹` multiplication use this product rule. -/ +theorem smoothScalarProduct_fderiv_apply {d : ℕ} {φ ψ : Vec d → ℝ} + (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) (hψ : ContDiff ℝ (⊤ : ℕ∞) ψ) + (x e : Vec d) : + (fderiv ℝ (fun y => φ y * ψ y) x) e = + φ x * (fderiv ℝ ψ x) e + ψ x * (fderiv ℝ φ x) e := by + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hψ_diff : DifferentiableAt ℝ ψ x := + (hψ.contDiffAt).differentiableAt (by simp) + change (fderiv ℝ (φ * ψ) x) e = _ + rw [fderiv_mul hφ_diff hψ_diff] + simp [smul_eq_mul] + +theorem toFunGrad_injective {d : ℕ} {U : Set (Vec d)} : + Function.Injective (fun u : H1Function U => (u.toFun, u.grad)) := by + intro u v h + exact H1Function.ext + (by simpa using congrArg Prod.fst h) + (by simpa using congrArg Prod.snd h) + +instance {d : ℕ} {U : Set (Vec d)} : AddCommGroup (H1Function U) := + Function.Injective.addCommGroup + (fun u : H1Function U => (u.toFun, u.grad)) + toFunGrad_injective + rfl + (fun _ _ => rfl) + (fun _ => by ext x <;> simp) + (fun _ _ => by ext x <;> simp [sub_eq_add_neg]) + (fun u n => by + apply Prod.ext + · funext x + change (((n : ℝ) • u).toFun x) = (n • u.toFun) x + simp [nsmul_eq_mul] + · funext x + ext i + change (((n : ℝ) • u).grad x i) = (n • u.grad) x i + simp [nsmul_eq_mul]) + (fun u n => by + apply Prod.ext + · funext x + change (((n : ℝ) • u).toFun x) = (n • u.toFun) x + simp [zsmul_eq_mul] + · funext x + ext i + change (((n : ℝ) • u).grad x i) = (n • u.grad) x i + simp [zsmul_eq_mul]) + +noncomputable def toFunGradAddMonoidHom {d : ℕ} {U : Set (Vec d)} : + H1Function U →+ ((Vec d → ℝ) × (Vec d → Vec d)) where + toFun := fun u => (u.toFun, u.grad) + map_zero' := rfl + map_add' _ _ := rfl + +noncomputable instance {d : ℕ} {U : Set (Vec d)} : Module ℝ (H1Function U) := + Function.Injective.module ℝ + toFunGradAddMonoidHom + (toFunGrad_injective (d := d) (U := U)) + (fun _ _ => rfl) + +/-- Multiplication of an `H¹` function by a smooth scalar multiplier which is +bounded, together with its first derivatives, on the underlying domain. This +is the non-compact-support variant of `mulContDiffHasCompactSupport`; the test +function still provides the compact support in the weak-gradient identity. -/ +noncomputable def mulContDiffMemLpTop {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : H1Function U := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + have hφ_cont : Continuous φ := hφ.continuous + refine + { toFun := fun x => φ x * u x + grad := fun x i => φ x * u.grad x i + u x * Dφ x i + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · simpa [Dφ, μU, mul_comm] using u.memL2.fun_mul (r := 2) hφ_memTop + · intro i + let dφ : Vec d → ℝ := fun x => Dφ x i + have hfirst : + MeasureTheory.MemLp (fun x => φ x * u.grad x i) 2 μU := by + simpa [μU, mul_comm] using (u.gradMemL2 i).fun_mul (r := 2) hφ_memTop + have hsecond : + MeasureTheory.MemLp (fun x => u x * dφ x) 2 μU := by + simpa [dφ, Dφ, μU, mul_comm] using u.memL2.mul' (hdφ_memTop i) + simpa [dφ, Dφ, Pi.add_apply] using! hfirst.add hsecond + · intro i ψ hψ_smooth hψ_compact hψ_sub + let ei : Vec d := basisVec i + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) ei + let dψ : Vec d → ℝ := fun x => (fderiv ℝ ψ x) ei + let ψφ : Vec d → ℝ := fun x => φ x * ψ x + change + ∫ x, (φ x * u x) * dψ x ∂μU = + -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU + have hψ_cont : Continuous ψ := hψ_smooth.continuous + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψ_cont : Continuous dψ := by + simpa [dψ] using + (hψ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψ_compact : HasCompactSupport dψ := by + simpa [dψ] using hψ_compact.fderiv_apply (𝕜 := ℝ) ei + have hψφ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψφ := hφ.mul hψ_smooth + have hψφ_compact : HasCompactSupport ψφ := by + simpa [ψφ] using! hψ_compact.mul_left (f := φ) + have hdψφ_cont : Continuous (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using + (hψφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψφ_compact : HasCompactSupport (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using hψφ_compact.fderiv_apply (𝕜 := ℝ) ei + have hψφ_sub : tsupport ψφ ⊆ U := by + exact (tsupport_mul_subset_right (f := φ) (g := ψ)).trans hψ_sub + have hu_eq : + ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU = + -∫ x, u.grad x i * ψφ x ∂μU := by + simpa [μU] using u.hasWeakGradient i ψφ hψφ_smooth hψφ_compact hψφ_sub + have hu_loc : MeasureTheory.LocallyIntegrable u μU := + u.memL2.locallyIntegrable (by norm_num) + have hgrad_loc : MeasureTheory.LocallyIntegrable (fun x => u.grad x i) μU := + (u.gradMemL2 i).locallyIntegrable (by norm_num) + have hmul1_cont : Continuous (fun x => φ x * dψ x) := hφ_cont.mul hdψ_cont + have hmul1_compact : HasCompactSupport (fun x => φ x * dψ x) := by + simpa using! hdψ_compact.mul_left (f := φ) + have hu_mul1_int : + MeasureTheory.Integrable (fun x => u x * (φ x * dψ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul1_cont hmul1_compact + have hmul2_cont : Continuous (fun x => ψ x * dφ x) := hψ_cont.mul hdφ_cont + have hmul2_compact : HasCompactSupport (fun x => ψ x * dφ x) := by + simpa using! hψ_compact.mul_right (f' := dφ) + have hu_mul2_int : + MeasureTheory.Integrable (fun x => u x * (ψ x * dφ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hu_ψφ_int : + MeasureTheory.Integrable (fun x => u x * (fderiv ℝ ψφ x) ei) μU := by + simpa [smul_eq_mul, μU] using + hu_loc.integrable_smul_right_of_hasCompactSupport hdψφ_cont hdψφ_compact + have hgrad_mul1_int : + MeasureTheory.Integrable (fun x => u.grad x i * (φ x * ψ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hgrad_loc.integrable_smul_right_of_hasCompactSupport + (hφ_cont.mul hψ_cont) hψφ_compact + have hu_mul2ψ_int : + MeasureTheory.Integrable (fun x => (u x * dφ x) * ψ x) μU := by + simpa [smul_eq_mul, μU, mul_assoc, mul_left_comm, mul_comm] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hprod_deriv : + ∀ x, (fderiv ℝ ψφ x) ei = φ x * dψ x + ψ x * dφ x := + fun x => smoothScalarProduct_fderiv_apply hφ hψ_smooth x ei + have hleft_eq : + ∫ x, (φ x * u x) * dψ x ∂μU = + ∫ x, u x * (φ x * dψ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsplit : + ∫ x, u x * (φ x * dψ x) ∂μU = + ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + calc + ∫ x, u x * (φ x * dψ x) ∂μU + = ∫ x, (u x * (fderiv ℝ ψφ x) ei) - u x * (ψ x * dφ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + have hx : + u x * (φ x * dψ x) = + u x * (fderiv ℝ ψφ x) ei - u x * (ψ x * dφ x) := by + rw [hprod_deriv x] + ring + exact hx + _ = ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + rw [MeasureTheory.integral_sub hu_ψφ_int hu_mul2_int] + have hright_eq : + -∫ x, u.grad x i * ψφ x ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU = + -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU := by + have hgrad_term : + ∫ x, u.grad x i * ψφ x ∂μU = + ∫ x, u.grad x i * (φ x * ψ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [ψφ] + have hu_term : + ∫ x, u x * (ψ x * dφ x) ∂μU = + ∫ x, (u x * dφ x) * ψ x ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsum : + ∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU = + ∫ x, u.grad x i * (φ x * ψ x) ∂μU + + ∫ x, (u x * dφ x) * ψ x ∂μU := by + calc + ∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU + = ∫ x, u.grad x i * (φ x * ψ x) + (u x * dφ x) * ψ x ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + _ = ∫ x, u.grad x i * (φ x * ψ x) ∂μU + + ∫ x, (u x * dφ x) * ψ x ∂μU := by + rw [MeasureTheory.integral_add hgrad_mul1_int hu_mul2ψ_int] + rw [hgrad_term, hu_term, hsum] + ring + calc + ∫ x, (φ x * u x) * dψ x ∂μU + = ∫ x, u x * (φ x * dψ x) ∂μU := hleft_eq + _ = ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := hsplit + _ = -∫ x, u.grad x i * ψφ x ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + rw [hu_eq] + _ = -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU := hright_eq + +@[simp] theorem mulContDiffMemLpTop_toFun {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : + (u.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop).toFun = fun x => φ x * u x := + by + simp [H1Function.mulContDiffMemLpTop] + +@[simp] theorem mulContDiffMemLpTop_grad {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) + (hdφ_memTop : ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) + (⊤ : ENNReal) (MeasureTheory.volume.restrict U)) : + (u.mulContDiffMemLpTop hφ hφ_memTop hdφ_memTop).grad = + fun x i => φ x * u.grad x i + u x * (fderiv ℝ φ x) (basisVec i) := + by + simp [H1Function.mulContDiffMemLpTop] + +noncomputable def mulContDiffHasCompactSupport {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) : H1Function U := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let Dφ : Vec d → Vec d := fun x i => (fderiv ℝ φ x) (basisVec i) + have hφ_cont : Continuous φ := hφ.continuous + have hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) (MeasureTheory.volume.restrict U) := + (hφ_cont.memLp_of_hasCompactSupport hφ_compact).restrict U + refine + { toFun := fun x => φ x * u x + grad := fun x i => φ x * u.grad x i + u x * Dφ x i + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · simpa [Dφ, μU, mul_comm] using u.memL2.fun_mul (r := 2) hφ_memTop + · intro i + let dφ : Vec d → ℝ := fun x => Dφ x i + have hdφ_cont : Continuous dφ := by + simpa [dφ, Dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ, Dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_memTop : MeasureTheory.MemLp dφ (⊤ : ENNReal) (MeasureTheory.volume.restrict U) := + (hdφ_cont.memLp_of_hasCompactSupport hdφ_compact).restrict U + have hfirst : + MeasureTheory.MemLp (fun x => φ x * u.grad x i) 2 μU := by + simpa [μU, mul_comm] using (u.gradMemL2 i).fun_mul (r := 2) hφ_memTop + have hsecond : + MeasureTheory.MemLp (fun x => u x * dφ x) 2 μU := by + simpa [dφ, μU, mul_comm] using u.memL2.mul' hdφ_memTop + simpa [dφ, Dφ, Pi.add_apply] using! hfirst.add hsecond + · intro i ψ hψ_smooth hψ_compact hψ_sub + let ei : Vec d := basisVec i + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) ei + let dψ : Vec d → ℝ := fun x => (fderiv ℝ ψ x) ei + let ψφ : Vec d → ℝ := fun x => φ x * ψ x + change + ∫ x, (φ x * u x) * dψ x ∂μU = + -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU + have hψ_cont : Continuous ψ := hψ_smooth.continuous + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψ_cont : Continuous dψ := by + simpa [dψ] using + (hψ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) ei + have hdψ_compact : HasCompactSupport dψ := by + simpa [dψ] using hψ_compact.fderiv_apply (𝕜 := ℝ) ei + have hψφ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψφ := hφ.mul hψ_smooth + have hψφ_compact : HasCompactSupport ψφ := by + simpa [ψφ] using! hψ_compact.mul_left (f := φ) + have hdψφ_cont : Continuous (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using + (hψφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdψφ_compact : HasCompactSupport (fun x => (fderiv ℝ ψφ x) ei) := by + simpa [ei] using hψφ_compact.fderiv_apply (𝕜 := ℝ) ei + have hψφ_sub : tsupport ψφ ⊆ U := by + exact (tsupport_mul_subset_right (f := φ) (g := ψ)).trans hψ_sub + have hu_eq : + ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU = + -∫ x, u.grad x i * ψφ x ∂μU := by + simpa [μU] using u.hasWeakGradient i ψφ hψφ_smooth hψφ_compact hψφ_sub + have hu_loc : MeasureTheory.LocallyIntegrable u μU := + u.memL2.locallyIntegrable (by norm_num) + have hgrad_loc : MeasureTheory.LocallyIntegrable (fun x => u.grad x i) μU := + (u.gradMemL2 i).locallyIntegrable (by norm_num) + have hmul1_cont : Continuous (fun x => φ x * dψ x) := hφ_cont.mul hdψ_cont + have hmul1_compact : HasCompactSupport (fun x => φ x * dψ x) := by + simpa using! hdψ_compact.mul_left (f := φ) + have hu_mul1_int : + MeasureTheory.Integrable (fun x => u x * (φ x * dψ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul1_cont hmul1_compact + have hmul2_cont : Continuous (fun x => ψ x * dφ x) := hψ_cont.mul hdφ_cont + have hmul2_compact : HasCompactSupport (fun x => ψ x * dφ x) := by + simpa [mul_comm] using! hdφ_compact.mul_left (f := ψ) + have hu_mul2_int : + MeasureTheory.Integrable (fun x => u x * (ψ x * dφ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hu_ψφ_int : + MeasureTheory.Integrable (fun x => u x * (fderiv ℝ ψφ x) ei) μU := by + simpa [smul_eq_mul, μU] using + hu_loc.integrable_smul_right_of_hasCompactSupport hdψφ_cont hdψφ_compact + have hgrad_mul1_int : + MeasureTheory.Integrable (fun x => u.grad x i * (φ x * ψ x)) μU := by + simpa [smul_eq_mul, μU, mul_assoc] using + hgrad_loc.integrable_smul_right_of_hasCompactSupport + (hφ_cont.mul hψ_cont) hψφ_compact + have hu_mul2ψ_int : + MeasureTheory.Integrable (fun x => (u x * dφ x) * ψ x) μU := by + simpa [smul_eq_mul, μU, mul_assoc, mul_left_comm, mul_comm] using + hu_loc.integrable_smul_right_of_hasCompactSupport hmul2_cont hmul2_compact + have hprod_deriv : + ∀ x, (fderiv ℝ ψφ x) ei = φ x * dψ x + ψ x * dφ x := + fun x => smoothScalarProduct_fderiv_apply hφ hψ_smooth x ei + have hleft_eq : + ∫ x, (φ x * u x) * dψ x ∂μU = + ∫ x, u x * (φ x * dψ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsplit : + ∫ x, u x * (φ x * dψ x) ∂μU = + ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + calc + ∫ x, u x * (φ x * dψ x) ∂μU + = ∫ x, (u x * (fderiv ℝ ψφ x) ei) - u x * (ψ x * dφ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + have hx : + u x * (φ x * dψ x) = + u x * (fderiv ℝ ψφ x) ei - u x * (ψ x * dφ x) := by + rw [hprod_deriv x] + ring + exact hx + _ = ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + rw [MeasureTheory.integral_sub hu_ψφ_int hu_mul2_int] + have hright_eq : + -∫ x, u.grad x i * ψφ x ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU = + -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU := by + have hgrad_term : + ∫ x, u.grad x i * ψφ x ∂μU = + ∫ x, u.grad x i * (φ x * ψ x) ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + simp [ψφ] + have hu_term : + ∫ x, u x * (ψ x * dφ x) ∂μU = + ∫ x, (u x * dφ x) * ψ x ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + have hsum : + ∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU = + ∫ x, u.grad x i * (φ x * ψ x) ∂μU + + ∫ x, (u x * dφ x) * ψ x ∂μU := by + calc + ∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU + = ∫ x, u.grad x i * (φ x * ψ x) + (u x * dφ x) * ψ x ∂μU := by + refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) + intro x + ring + _ = ∫ x, u.grad x i * (φ x * ψ x) ∂μU + + ∫ x, (u x * dφ x) * ψ x ∂μU := by + rw [MeasureTheory.integral_add hgrad_mul1_int hu_mul2ψ_int] + rw [hgrad_term, hu_term, hsum] + ring + calc + ∫ x, (φ x * u x) * dψ x ∂μU + = ∫ x, u x * (φ x * dψ x) ∂μU := hleft_eq + _ = ∫ x, u x * (fderiv ℝ ψφ x) ei ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := hsplit + _ = -∫ x, u.grad x i * ψφ x ∂μU - + ∫ x, u x * (ψ x * dφ x) ∂μU := by + rw [hu_eq] + _ = -∫ x, (φ x * u.grad x i + u x * dφ x) * ψ x ∂μU := hright_eq + +@[simp] theorem mulContDiffHasCompactSupport_toFun {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) : + (u.mulContDiffHasCompactSupport hφ hφ_compact).toFun = fun x => φ x * u x := + by + simp [H1Function.mulContDiffHasCompactSupport] + +@[simp] theorem mulContDiffHasCompactSupport_grad {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) {φ : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) : + (u.mulContDiffHasCompactSupport hφ hφ_compact).grad = + fun x i => φ x * u.grad x i + u x * (fderiv ℝ φ x) (basisVec i) := + by + simp [H1Function.mulContDiffHasCompactSupport] + +end H1Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/Membership.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/Membership.lean new file mode 100644 index 0000000000..e66f8f4379 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Algebra/Membership.lean @@ -0,0 +1,324 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.H10Function + +/-! # Membership -/ + +@[expose] public section + +namespace Homogenization + +theorem memH1_zero {d : ℕ} {U : Set (Vec d)} : MemH1 U (0 : Vec d → ℝ) := + (0 : H1Function U).memH1 + +theorem memH1_smul {d : ℕ} {U : Set (Vec d)} (c : ℝ) {u : Vec d → ℝ} (hu : MemH1 U u) : + MemH1 U (fun x => c * u x) := by + rcases hu with ⟨v, rfl⟩ + simpa using ((c • v : H1Function U).memH1) + +theorem memH1_neg {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} (hu : MemH1 U u) : + MemH1 U (fun x => -u x) := by + rcases hu with ⟨v, rfl⟩ + refine ⟨-v, ?_⟩ + funext x + change (-1 : ℝ) * v x = -(v x) + ring + +theorem memH1_add {d : ℕ} {U : Set (Vec d)} {u v : Vec d → ℝ} + (hu : MemH1 U u) (hv : MemH1 U v) : MemH1 U (fun x => u x + v x) := by + rcases hu with ⟨u', rfl⟩ + rcases hv with ⟨v', rfl⟩ + simpa using ((u' + v' : H1Function U).memH1) + +theorem memH1_sub {d : ℕ} {U : Set (Vec d)} {u v : Vec d → ℝ} + (hu : MemH1 U u) (hv : MemH1 U v) : MemH1 U (fun x => u x - v x) := by + simpa [sub_eq_add_neg] using memH1_add hu (memH1_neg hv) + +theorem memH10_zero {d : ℕ} {U : Set (Vec d)} : MemH10 U (0 : Vec d → ℝ) := + (0 : H10Function U).memH10 + +theorem memH10_smul {d : ℕ} {U : Set (Vec d)} (c : ℝ) {u : Vec d → ℝ} (hu : MemH10 U u) : + MemH10 U (fun x => c * u x) := by + rcases hu with ⟨v, rfl⟩ + simpa using! ((c • v : H10Function U).memH10) + +theorem memH10_neg {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} (hu : MemH10 U u) : + MemH10 U (fun x => -u x) := by + rcases hu with ⟨v, rfl⟩ + refine ⟨-v, ?_⟩ + funext x + change (-1 : ℝ) * v x = -(v x) + ring + +theorem memH10_add {d : ℕ} {U : Set (Vec d)} {u v : Vec d → ℝ} + (hu : MemH10 U u) (hv : MemH10 U v) : MemH10 U (fun x => u x + v x) := by + rcases hu with ⟨u', rfl⟩ + rcases hv with ⟨v', rfl⟩ + simpa using! ((u' + v' : H10Function U).memH10) + +theorem memH10_sub {d : ℕ} {U : Set (Vec d)} {u v : Vec d → ℝ} + (hu : MemH10 U u) (hv : MemH10 U v) : MemH10 U (fun x => u x - v x) := by + simpa [sub_eq_add_neg] using memH10_add hu (memH10_neg hv) + +theorem memH1_mul_of_contDiff_hasCompactSupport {d : ℕ} {U : Set (Vec d)} + {φ u : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hu : MemH1 U u) : + MemH1 U (fun x => φ x * u x) := by + rcases hu with ⟨u', rfl⟩ + simpa using (u'.mulContDiffHasCompactSupport hφ hφ_compact).memH1 + +theorem memH10_mul_of_contDiff_hasCompactSupport {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) + {φ u : Vec d → ℝ} (hφ : ContDiff ℝ (⊤ : ℕ∞) φ) + (hφ_compact : HasCompactSupport φ) (hφ_sub : tsupport φ ⊆ U) (hu : MemH1 U u) : + MemH10 U (fun x => φ x * u x) := by + rcases hu with ⟨u', rfl⟩ + by_cases hts : tsupport φ = ∅ + · have hφ_zero : φ = 0 := tsupport_eq_empty_iff.mp hts + simpa [hφ_zero] using! (memH10_zero (U := U)) + · obtain ⟨x0, hx0⟩ : (tsupport φ).Nonempty := Set.nonempty_iff_ne_empty.mpr hts + have hx0U : x0 ∈ U := hφ_sub hx0 + rcases Metric.mem_nhds_iff.mp (hU.isOpen.mem_nhds hx0U) with ⟨r, hr_pos, hr_sub⟩ + let r0 : ℝ := r / 2 + have hr0_pos : 0 < r0 := by + dsimp [r0] + positivity + have hball : Metric.closedBall x0 r0 ⊆ U := by + refine (Metric.closedBall_subset_ball ?_).trans hr_sub + dsimp [r0] + exact half_lt_self hr_pos + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + let ε : ℕ → ℝ := unitConvexApproxScale + let ψ : ℕ → Vec d → ℝ := fun n => + convexApproxSmoothRepresentative U ρ u' x0 r0 (ε n) + let uφ : H1Function U := u'.mulContDiffHasCompactSupport hφ hφ_compact + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hε_pos : ∀ n : ℕ, 0 < ε n := by + intro n + dsimp [ε, unitConvexApproxScale] + positivity + have hε_eventually_lt_one : ∀ᶠ n : ℕ in Filter.atTop, ε n < 1 := by + simpa [ε] using + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn)) + have hψ_smooth : ∀ n : ℕ, ContDiff ℝ (⊤ : ℕ∞) (ψ n) := by + intro n + dsimp [ψ] + exact contDiff_convexApproxSmoothRepresentative + hU.isOpen.measurableSet hρ (by norm_num : (1 : ENNReal) ≤ 2) u'.memL2 hr0_pos + (hε_pos n) + have hψ_memL2 : ∀ n : ℕ, MeasureTheory.MemLp (ψ n) 2 (MeasureTheory.volume.restrict U) := by + intro n + let v : H1Function U := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU ((hψ_smooth n).of_le (by simp)) + simpa [ψ, v, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + using v.memL2 + have hψ_grad_memL2 : ∀ n : ℕ, ∀ i : Fin d, + MeasureTheory.MemLp (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) + 2 (MeasureTheory.volume.restrict U) := by + intro n i + let v : H1Function U := + H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU ((hψ_smooth n).of_le (by simp)) + simpa [ψ, v, H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain] + using v.gradMemL2 i + have hψ_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + have hraw := + tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_memLpOn + (U := U) hU (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + u'.memL2 hball hr0_pos + refine hraw.congr' ?_ + filter_upwards [hε_eventually_lt_one] with n hε1 + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards [MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hx + have hEq := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := u') hU hρ hx hball hr0_pos (hε_pos n) hε1 + simpa [ψ, ρ, ε, unitConvexApproxSequence] using hEq.symm + have hψ_grad_tendsto : ∀ i : Fin d, + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) + 2 (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + intro i + have hraw := + tendsto_eLpNorm_sub_zero_one_sub_mul_unitConvexApproxSequence_of_memLpOn + (U := U) hU (by norm_num : (1 : ENNReal) ≤ 2) (by simp : (2 : ENNReal) ≠ ⊤) + (u'.grad_memL2 i) hball hr0_pos + refine hraw.congr' ?_ + filter_upwards [hε_eventually_lt_one] with n hε1 + apply MeasureTheory.eLpNorm_congr_ae + have hbridge := + ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + (U := U) (ρ := ρ) (u := u') (gi := fun y => u'.grad y i) + (i := i) (p := (2 : ENNReal)) hU hρ (by norm_num : (1 : ENNReal) ≤ 2) + u'.memL2 (u'.grad_memL2 i) (u'.hasWeakPartialDerivOn i) + hball hr0_pos (hε_pos n) hε1 + filter_upwards [hbridge, MeasureTheory.ae_restrict_mem hU.isOpen.measurableSet] with x hx hxU + have hEq := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun y => u'.grad y i) hU hρ hxU hball hr0_pos (hε_pos n) hε1 + rw [hx] + simpa [ψ, ρ, ε, unitConvexApproxSequence] using congrArg + (fun t : ℝ => (1 - unitConvexApproxScale n) * t - u'.grad x i) hEq.symm + refine ⟨ + { toH1Function := uφ + approx := fun n x => φ x * ψ n x + approx_smooth := by + intro n + exact hφ.mul (hψ_smooth n) + approx_hasCompactSupport := by + intro n + simpa [mul_comm] using! (hφ_compact.mul_left (f := ψ n)) + approx_support_subset := by + intro n + exact (tsupport_mul_subset_left (f := φ) (g := ψ n)).trans hφ_sub + tendsto_approx := by + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + have hφ_cont : Continuous φ := hφ.continuous + have hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) μU := + (hφ_cont.memLp_of_hasCompactSupport hφ_compact).restrict U + have hconst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul hψ_tendsto + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hupper : + ∀ n, + MeasureTheory.eLpNorm (fun x => φ x * ψ n x - uφ.toFun x) 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 μU := by + intro n + have hdiff_mem : + MeasureTheory.MemLp (fun x => ψ n x - u' x) 2 μU := by + exact (hψ_memL2 n).sub u'.memL2 + have hEq : + (fun x => φ x * ψ n x - uφ.toFun x) = + φ • (fun x => ψ n x - u' x) := by + funext x + change φ x * ψ n x - φ x * u' x = φ x * (ψ n x - u' x) + ring + rw [hEq] + exact MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (φ := φ) 2 (by norm_num) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa using hconst_tendsto + tendsto_approx_grad := by + intro i + let μU : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + have hφ_memTop : MeasureTheory.MemLp φ (⊤ : ENNReal) μU := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict U + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_memTop : MeasureTheory.MemLp dφ (⊤ : ENNReal) μU := + (hdφ_cont.memLp_of_hasCompactSupport hdφ_compact).restrict U + have hfirst_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul (hψ_grad_tendsto i) + (Or.inr hφ_memTop.eLpNorm_lt_top.ne) + have hsecond_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 μU) + Filter.atTop + (nhds (MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + ENNReal.Tendsto.const_mul hψ_tendsto + (Or.inr hdφ_memTop.eLpNorm_lt_top.ne) + have hsum_tendsto : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 μU) + Filter.atTop + (nhds + (MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * 0 + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * 0)) := + hfirst_tendsto.add hsecond_tendsto + have hupper : + ∀ n, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) - uφ.grad x i) + 2 μU ≤ + MeasureTheory.eLpNorm φ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) 2 μU + + MeasureTheory.eLpNorm dφ (⊤ : ENNReal) μU * + MeasureTheory.eLpNorm (fun x => ψ n x - u' x) 2 μU := by + intro n + let A : Vec d → ℝ := fun x => φ x * + ((fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) + let B : Vec d → ℝ := fun x => dφ x * (ψ n x - u' x) + have hbase_grad_mem : + MeasureTheory.MemLp + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) 2 μU := by + exact (hψ_grad_memL2 n i).sub (u'.gradMemL2 i) + have hbase_mem : + MeasureTheory.MemLp (fun x => ψ n x - u' x) 2 μU := by + exact (hψ_memL2 n).sub u'.memL2 + have hA_mem : MeasureTheory.MemLp A 2 μU := by + simpa [A, μU, mul_comm] using hbase_grad_mem.fun_mul (r := 2) hφ_memTop + have hB_mem : MeasureTheory.MemLp B 2 μU := by + simpa [B, dφ, μU, mul_comm] using hbase_mem.fun_mul (r := 2) hdφ_memTop + have hEq : + (fun x => + (fderiv ℝ (fun y => φ y * ψ n y) x) (basisVec i) - uφ.grad x i) = + fun x => A x + B x := by + funext x + have hφ_diff : DifferentiableAt ℝ φ x := + (hφ.contDiffAt).differentiableAt (by simp) + have hψ_diff : DifferentiableAt ℝ (ψ n) x := + ((hψ_smooth n).contDiffAt).differentiableAt (by simp) + rw [show (fun y => φ y * ψ n y) = φ * ψ n by rfl, fderiv_mul hφ_diff hψ_diff] + simp [A, B, dφ, uφ, H1Function.mulContDiffHasCompactSupport_grad, smul_eq_mul] + ring + rw [hEq] + refine (MeasureTheory.eLpNorm_add_le (by norm_num)).trans ?_ + refine add_le_add ?_ ?_ + · simpa [A, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) + (φ := φ) (f := fun x => (fderiv ℝ (ψ n) x) (basisVec i) - u'.grad x i) + 2 (by norm_num)) + · simpa [B, dφ, mul_comm, mul_left_comm, mul_assoc] using! + (MeasureTheory.eLpNorm_smul_le_eLpNorm_top_mul_eLpNorm_of_pos (μ := μU) + (φ := dφ) (f := fun x => ψ n x - u' x) 2 (by norm_num)) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds ?_ (fun n => zero_le) hupper + simpa [zero_add] using hsum_tendsto + }, rfl⟩ + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/BasicLemmas.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/BasicLemmas.lean new file mode 100644 index 0000000000..8bdf366f00 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/BasicLemmas.lean @@ -0,0 +1,318 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Multiscale.NormalizedNorms +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import Mathlib.MeasureTheory.SpecificCodomains.Pi + +/-! # Basic Lemmas -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +theorem memL2On_mono {d : ℕ} {U V : Set (Vec d)} {u : Vec d → ℝ} + (hVU : V ⊆ U) (hu : MemL2On U u) : MemL2On V u := + hu.mono_measure (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + +theorem gradMemL2On_mono {d : ℕ} {U V : Set (Vec d)} {Du : Vec d → Vec d} + (hVU : V ⊆ U) (hDu : GradMemL2On U Du) : GradMemL2On V Du := by + intro i + exact memL2On_mono hVU (hDu i) + +theorem memL2On_openCubeSet_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + {u : Vec d → ℝ} (hu : MemL2On (openCubeSet Q) u) : + MeasureTheory.MemLp u (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := by + have hcube : MeasureTheory.MemLp u (2 : ℝ≥0∞) (cubeMeasure Q) := by + simpa [MemL2On, cubeMeasure, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet Q] + using hu + simpa [normalizedCubeMeasure] using + hcube.smul_measure ENNReal.ofReal_ne_top + +theorem HasWeakPartialDerivOn.restrict {d : ℕ} {U V : Set (Vec d)} + (hVopen : IsOpen V) (hVU : V ⊆ U) + {i : Fin d} {u gi : Vec d → ℝ} + (h : HasWeakPartialDerivOn U i u gi) : + HasWeakPartialDerivOn V i u gi := by + let _ := hVopen + intro φ hφ_smooth hφ_compact hφ_supp + have hφ_suppU : tsupport φ ⊆ U := hφ_supp.trans hVU + have key := h φ hφ_smooth hφ_compact hφ_suppU + have h1 : ∀ x, x ∉ V → u x * (fderiv ℝ φ x) (basisVec i) = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_supp hx') + have hφ_eq : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := φ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [Filter.EventuallyEq.fderiv_eq hφ_eq] + simp + have h2 : ∀ x, x ∉ V → gi x * φ x = 0 := by + intro x hx + simp [image_eq_zero_of_notMem_tsupport (fun hx' => hx (hφ_supp hx'))] + have h3 : ∀ x, x ∉ U → u x * (fderiv ℝ φ x) (basisVec i) = 0 := + fun x hx => h1 x (fun hx' => hx (hVU hx')) + have h4 : ∀ x, x ∉ U → gi x * φ x = 0 := + fun x hx => h2 x (fun hx' => hx (hVU hx')) + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h1, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h2, + ← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h3, + ← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h4, + key] + +theorem HasWeakGradientOn.restrict {d : ℕ} {U V : Set (Vec d)} + (hVopen : IsOpen V) (hVU : V ⊆ U) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (h : HasWeakGradientOn U u Du) : + HasWeakGradientOn V u Du := by + intro i + exact (h i).restrict hVopen hVU + +theorem HasWeakPartialDerivOn.of_contDiff {d : ℕ} {U : Set (Vec d)} + {i : Fin d} {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + HasWeakPartialDerivOn U i f (fun x => (fderiv ℝ f x) (basisVec i)) := by + intro φ hφ_smooth hφ_supp hφ_sub + let ei : Vec d := basisVec i + have hf_diff : Differentiable ℝ f := hf.differentiable (by simp) + have hφ_diff : Differentiable ℝ φ := hφ_smooth.differentiable (by simp) + have hf_cont : Continuous f := hf_diff.continuous + have hφ_cont : Continuous φ := hφ_diff.continuous + have hfderiv_φ_cont : Continuous (fun x => (fderiv ℝ φ x) ei) := by + simpa [ei] using + (hφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hfderiv_f_cont : Continuous (fun x => (fderiv ℝ f x) ei) := by + simpa [ei] using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + have hφ_fderiv_supp : HasCompactSupport (fun x => (fderiv ℝ φ x) ei) := by + simpa [ei] using hφ_supp.fderiv_apply (𝕜 := ℝ) ei + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero] + · simpa [ei] using + integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + ((hfderiv_f_cont.mul hφ_cont).integrable_of_hasCompactSupport hφ_supp.mul_left) + ((hf_cont.mul hfderiv_φ_cont).integrable_of_hasCompactSupport hφ_fderiv_supp.mul_left) + ((hf_cont.mul hφ_cont).integrable_of_hasCompactSupport hφ_supp.mul_left) + (fun x _ => hf_diff.differentiableAt) (fun x _ => hφ_diff.differentiableAt) + · + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + · + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + have hφ_eq : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := φ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [Filter.EventuallyEq.fderiv_eq hφ_eq] + simp + +theorem HasWeakGradientOn.of_contDiff {d : ℕ} {U : Set (Vec d)} + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + HasWeakGradientOn U f (fun x i => (fderiv ℝ f x) (basisVec i)) := by + intro i + exact HasWeakPartialDerivOn.of_contDiff hf + +namespace H1Function + +@[ext] theorem ext {d : ℕ} {U : Set (Vec d)} {u v : H1Function U} + (htoFun : u.toFun = v.toFun) (hgrad : u.grad = v.grad) : u = v := by + cases u + cases v + cases htoFun + cases hgrad + rfl + +theorem hasWeakPartialDerivOn {d : ℕ} {U : Set (Vec d)} (u : H1Function U) (i : Fin d) : + HasWeakPartialDerivOn U i u.toFun (fun x => u.grad x i) := + u.hasWeakGradient i + +theorem grad_memL2 {d : ℕ} {U : Set (Vec d)} (u : H1Function U) (i : Fin d) : + MemL2On U (fun x => u.grad x i) := + u.gradMemL2 i + +theorem grad_memVectorL2 {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + MemVectorL2 U u.grad := by + simpa [MemVectorL2, volumeMeasureOn] using + (MeasureTheory.MemLp.of_eval (fun i : Fin d => u.gradMemL2 i)) + +theorem memL2_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : + MeasureTheory.MemLp (fun x => u x) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memL2On_openCubeSet_normalizedCubeMeasure u.memL2 + +theorem grad_memL2_normalizedCubeMeasure {d : ℕ} {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) (i : Fin d) : + MeasureTheory.MemLp (fun x => u.grad x i) (2 : ℝ≥0∞) (normalizedCubeMeasure Q) := + memL2On_openCubeSet_normalizedCubeMeasure (u.grad_memL2 i) + +theorem memH1 {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : MemH1 U u.toFun := + ⟨u, rfl⟩ + +noncomputable def ofContDiff {d : ℕ} {U : Set (Vec d)} (_hU : IsOpen U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) (hf_supp : HasCompactSupport f) : H1Function U := + { toFun := f + grad := fun x i => (fderiv ℝ f x) (basisVec i) + memL2 := by + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + exact (hf_cont.memLp_of_hasCompactSupport hf_supp).restrict U + gradMemL2 := by + intro i + have hderiv_cont : Continuous (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + have hderiv_supp : HasCompactSupport (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using hf_supp.fderiv_apply (𝕜 := ℝ) (basisVec i) + exact (hderiv_cont.memLp_of_hasCompactSupport hderiv_supp).restrict U + hasWeakGradient := HasWeakGradientOn.of_contDiff hf } + +/-- Package a globally smooth function as an `H¹(U)` witness on a bounded +measurable domain. Unlike `ofContDiff`, this constructor does not require +compact support, because boundedness of `U` gives the needed `L²` control on +the restriction. -/ +noncomputable def ofContDiffOnIsSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : H1Function U := by + letI : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + classical + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + have hclosure_compact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + let Cf : ℝ := Classical.choose (hclosure_compact.exists_bound_of_continuousOn hf_cont.continuousOn) + have hCf : ∀ x ∈ closure U, ‖f x‖ ≤ Cf := + Classical.choose_spec (hclosure_compact.exists_bound_of_continuousOn hf_cont.continuousOn) + refine + { toFun := f + grad := fun x i => (fderiv ℝ f x) (basisVec i) + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := HasWeakGradientOn.of_contDiff hf } + · refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) hf_cont.aestronglyMeasurable Cf ?_ + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCf x (subset_closure hx) + · intro i + have hderiv_cont : Continuous (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖(fderiv ℝ f x) (basisVec i)‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hderiv_cont.continuousOn) + refine MeasureTheory.MemLp.of_bound + (μ := volumeMeasureOn U) hderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + +/-- Bounded open convex domains admit the bounded-domain smooth constructor for +`H¹`. -/ +noncomputable def ofContDiffOnIsOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : H1Function U := + ofContDiffOnIsSobolevRegularDomain hU.isSobolevRegularDomain hf + +def restrict {d : ℕ} {U V : Set (Vec d)} (u : H1Function U) + (hVopen : IsOpen V) (hVU : V ⊆ U) : H1Function V := + { toFun := u.toFun + grad := u.grad + memL2 := memL2On_mono hVU u.memL2 + gradMemL2 := gradMemL2On_mono hVU u.gradMemL2 + hasWeakGradient := u.hasWeakGradient.restrict hVopen hVU } + +noncomputable def restrictToOpenSubcube {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (u : H1Function (openCubeSet Q)) (hR : R ∈ descendantsAtDepth Q j) : + H1Function (openCubeSet R) := + u.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) + +@[simp] theorem restrictToOpenSubcube_toFun {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (u : H1Function (openCubeSet Q)) (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hR).toFun = u.toFun := + rfl + +@[simp] theorem restrictToOpenSubcube_grad {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (u : H1Function (openCubeSet Q)) (hR : R ∈ descendantsAtDepth Q j) : + (u.restrictToOpenSubcube hR).grad = u.grad := + rfl + +theorem grad_memL2_normalizedCubeMeasure_of_mem_descendantsAtDepth + {d : ℕ} {Q R : TriadicCube d} {j : ℕ} + (u : H1Function (openCubeSet Q)) (hR : R ∈ descendantsAtDepth Q j) (i : Fin d) : + MeasureTheory.MemLp (fun x => u.grad x i) (2 : ℝ≥0∞) (normalizedCubeMeasure R) := by + simpa using (u.restrictToOpenSubcube hR).grad_memL2_normalizedCubeMeasure i + +end H1Function + +namespace H10Function + +theorem memH1 {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : MemH1 U u.toH1Function.toFun := + u.toH1Function.memH1 + +noncomputable def ofContDiff {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) : H10Function U := + { toH1Function := H1Function.ofContDiff hU (hf.of_le (by simp)) hf_supp + approx := fun _ => f + approx_smooth := by + intro n + simpa using hf + approx_hasCompactSupport := by + intro n + simpa using hf_supp + approx_support_subset := by + intro n + simpa using hf_sub + tendsto_approx := by + simp [H1Function.ofContDiff] + tendsto_approx_grad := by + intro i + simp [H1Function.ofContDiff] } + +end H10Function + +theorem memH1_of_memH10 {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} (hu : MemH10 U u) : + MemH1 U u := by + rcases hu with ⟨v, rfl⟩ + exact v.memH1 + +theorem memH1_restrict {d : ℕ} {U V : Set (Vec d)} {u : Vec d → ℝ} + (hVopen : IsOpen V) (hVU : V ⊆ U) (hu : MemH1 U u) : MemH1 V u := by + rcases hu with ⟨u', rfl⟩ + exact (u'.restrict hVopen hVU).memH1 + +theorem H10Function.memH10 {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : + MemH10 U u.toH1Function.toFun := + ⟨u, rfl⟩ + +theorem memH10_of_contDiff {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) : + MemH10 U f := + (H10Function.ofContDiff hU hf hf_supp hf_sub).memH10 + +theorem memH1_of_contDiffOnIsSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + MemH1 U f := + by + simpa using! + (H1Function.ofContDiffOnIsSobolevRegularDomain (U := U) hU hf).memH1 + +theorem memH1_of_contDiffOnIsOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + MemH1 U f := + by + simpa using! + (H1Function.ofContDiffOnIsOpenBoundedConvexDomain (U := U) hU hf).memH1 + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Definitions.lean new file mode 100644 index 0000000000..7367263aea --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Definitions.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Calculus.FDeriv.Add +public import Mathlib.Analysis.Calculus.LineDeriv.IntegrationByParts +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Function.LocallyIntegrable +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import Mathlib.MeasureTheory.Function.LpSpace.Indicator +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +/-! +`H¹(U)` is modeled here by explicit witnesses: a function, a candidate weak +gradient, `L²` control on both, and the integration-by-parts identity against +smooth compactly supported tests. `H¹₀(U)` adds the usual approximation package +by smooth compactly supported functions supported in `U`. +-/ + +abbrev MemL2On {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : Prop := + MeasureTheory.MemLp u 2 (MeasureTheory.volume.restrict U) + +def GradMemL2On {d : ℕ} (U : Set (Vec d)) (Du : Vec d → Vec d) : Prop := + ∀ i : Fin d, MemL2On U (fun x => Du x i) + +structure H1Function {d : ℕ} (U : Set (Vec d)) where + toFun : Vec d → ℝ + grad : Vec d → Vec d + memL2 : MemL2On U toFun + gradMemL2 : GradMemL2On U grad + hasWeakGradient : HasWeakGradientOn U toFun grad + +instance {d : ℕ} {U : Set (Vec d)} : CoeFun (H1Function U) (fun _ => Vec d → ℝ) where + coe u := u.toFun + +def MemH1 {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : Prop := + ∃ v : H1Function U, v.toFun = u + +structure H10Function {d : ℕ} (U : Set (Vec d)) extends H1Function U where + approx : ℕ → Vec d → ℝ + approx_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (approx n) + approx_hasCompactSupport : ∀ n, HasCompactSupport (approx n) + approx_support_subset : ∀ n, tsupport (approx n) ⊆ U + tendsto_approx : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => approx n x - toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + tendsto_approx_grad : + ∀ i : Fin d, + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (approx n) x) (basisVec i) - toH1Function.grad x i) 2 + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + +instance {d : ℕ} {U : Set (Vec d)} : CoeFun (H10Function U) (fun _ => Vec d → ℝ) where + coe u := u.toH1Function.toFun + +def MemH10 {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : Prop := + ∃ v : H10Function U, v.toH1Function.toFun = u + +noncomputable def MeanZeroOn {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : Prop := + ∫ x in U, u x ∂MeasureTheory.volume = 0 + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/LocalizedZeroTrace.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/LocalizedZeroTrace.lean new file mode 100644 index 0000000000..ae20ba6ba5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/LocalizedZeroTrace.lean @@ -0,0 +1,100 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership + +/-! # Localized Zero Trace -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-- Localized scalar zero-trace condition. + +This is the Sobolev/a.e. replacement for saying that a scalar function vanishes +on the part of `∂Ω` seen through the localization window `V`: every smooth +compactly supported cutoff localized in `V` turns the function into an +admissible `H¹₀(Ω)` test function. -/ +def LocalizedZeroTraceFunctionOn {d : ℕ} (Ω V : Set (Vec d)) + (u : Vec d → ℝ) : Prop := + ∀ η : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) η → + HasCompactSupport η → + tsupport η ⊆ V → + MemH10 Ω (fun y => η y * u y) + +/-- The localized scalar zero-trace condition gives exactly the admissible +cutoff product encoded in its definition. -/ +theorem localizedZeroTraceFunctionOn_memH10_mul {d : ℕ} + {Ω V : Set (Vec d)} {u η : Vec d → ℝ} + (hu : LocalizedZeroTraceFunctionOn Ω V u) + (hη : ContDiff ℝ (⊤ : ℕ∞) η) + (hη_compact : HasCompactSupport η) + (hη_sub : tsupport η ⊆ V) : + MemH10 Ω (fun y => η y * u y) := + hu η hη hη_compact hη_sub + +/-- A genuine `H¹₀(Ω)` function has localized zero trace in every window +contained in `Ω`. -/ +theorem localizedZeroTraceFunctionOn_of_h10 {d : ℕ} {Ω V : Set (Vec d)} + (hΩ : IsOpen Ω) (hV : V ⊆ Ω) (u : H10Function Ω) : + LocalizedZeroTraceFunctionOn Ω V u.toH1Function.toFun := by + intro η hη hη_compact hη_sub + exact + (u.mulSmoothCutoff hΩ hη hη_compact (hη_sub.trans hV)).memH10 + +/-- A genuine `H¹₀(Ω)` function has localized zero trace in any localization +window. The cutoff need not be supported in `Ω`: the compactly supported +approximants of the `H¹₀` function are already supported in `Ω`. -/ +theorem localizedZeroTraceFunctionOn_of_h10_any {d : ℕ} {Ω V : Set (Vec d)} + (u : H10Function Ω) : + LocalizedZeroTraceFunctionOn Ω V u.toH1Function.toFun := by + intro η hη hη_compact _hη_sub + exact (u.mulContDiffHasCompactSupport hη hη_compact).memH10 + +/-- Localized zero trace is closed under addition. -/ +theorem localizedZeroTraceFunctionOn_add {d : ℕ} + {Ω V : Set (Vec d)} {u v : Vec d → ℝ} + (hu : LocalizedZeroTraceFunctionOn Ω V u) + (hv : LocalizedZeroTraceFunctionOn Ω V v) : + LocalizedZeroTraceFunctionOn Ω V (fun y => u y + v y) := by + intro η hη hη_compact hη_sub + have huη : MemH10 Ω (fun y => η y * u y) := + hu η hη hη_compact hη_sub + have hvη : MemH10 Ω (fun y => η y * v y) := + hv η hη hη_compact hη_sub + simpa [mul_add] using memH10_add huη hvη + +/-- Localized zero trace is closed under negation. -/ +theorem localizedZeroTraceFunctionOn_neg {d : ℕ} + {Ω V : Set (Vec d)} {u : Vec d → ℝ} + (hu : LocalizedZeroTraceFunctionOn Ω V u) : + LocalizedZeroTraceFunctionOn Ω V (fun y => -u y) := by + intro η hη hη_compact hη_sub + have huη : MemH10 Ω (fun y => η y * u y) := + hu η hη hη_compact hη_sub + simpa [mul_neg] using memH10_neg huη + +/-- Localized zero trace is closed under subtraction. -/ +theorem localizedZeroTraceFunctionOn_sub {d : ℕ} + {Ω V : Set (Vec d)} {u v : Vec d → ℝ} + (hu : LocalizedZeroTraceFunctionOn Ω V u) + (hv : LocalizedZeroTraceFunctionOn Ω V v) : + LocalizedZeroTraceFunctionOn Ω V (fun y => u y - v y) := by + intro η hη hη_compact hη_sub + have huη : MemH10 Ω (fun y => η y * u y) := + hu η hη hη_compact hη_sub + have hvη : MemH10 Ω (fun y => η y * v y) := + hv η hη hη_compact hη_sub + simpa [mul_sub] using memH10_sub huη hvη + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeBridge.lean new file mode 100644 index 0000000000..baeb5b8a0b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeBridge.lean @@ -0,0 +1,780 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeBoundaryPush +public import LeanPool.CoarseGraining.Homogenization.Geometry.OriginCubeMeasureBridge +public import Mathlib.Analysis.SpecificLimits.Basic +public import Mathlib.MeasureTheory.Integral.DominatedConvergence +public import Mathlib.Order.Filter.AtTopBot.Basic + +/-! # Origin Cube Bridge -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +/-- The vector with the same displacement in every coordinate. -/ +def diagonalShift {d : ℕ} (ε : ℝ) : Vec d := + fun _ => ε + +/-- The half-open centered cube has finite volume. -/ +theorem volume_cubeSet_originCube_lt_top {d : ℕ} (n : ℤ) : + MeasureTheory.volume (cubeSet (originCube d n)) < ⊤ := by + rw [lt_top_iff_ne_top] + intro htop + have hzero : (MeasureTheory.volume (cubeSet (originCube d n))).toReal = 0 := by + simp [htop] + rw [volume_cubeSet_toReal] at hzero + exact (ne_of_gt (cubeVolume_pos (originCube d n))) hzero + +/-- The open centered cube has finite volume. -/ +theorem volume_openCubeSet_originCube_lt_top {d : ℕ} (n : ℤ) : + MeasureTheory.volume (openCubeSet (originCube d n)) < ⊤ := by + exact lt_of_le_of_lt + (MeasureTheory.measure_mono (openCubeSet_subset_cubeSet (originCube d n))) + (volume_cubeSet_originCube_lt_top (d := d) n) + +/-- A nonnegative common coordinate shift moves a point by at most that amount in the sup metric. -/ +theorem dist_sub_diagonalShift_le {d : ℕ} (x : Vec d) {ε : ℝ} (hε : 0 ≤ ε) : + dist (x - diagonalShift (d := d) ε) x ≤ ε := by + rw [dist_pi_le_iff hε] + intro i + have hcoord : ((x - diagonalShift (d := d) ε) i) - x i = -ε := by + simp [diagonalShift] + rw [Real.dist_eq, hcoord, abs_neg, abs_of_nonneg hε] + +private theorem exists_abs_bound_of_continuous_of_hasCompactSupport {d : ℕ} {f : Vec d → ℝ} + (hf_cont : Continuous f) (hf_compact : HasCompactSupport f) : + ∃ C : ℝ, ∀ x, |f x| ≤ C := by + obtain ⟨C, hC⟩ := hf_compact.exists_bound_of_continuous hf_cont + refine ⟨C, ?_⟩ + intro x + simpa [Real.norm_eq_abs] using hC x + +private theorem tendsto_precomp_sub_diagonalShift {d : ℕ} (x : Vec d) (ε₀ : ℝ) : + Filter.Tendsto + (fun n : ℕ => x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + Filter.atTop (𝓝 x) := by + have hdenCast : Filter.Tendsto (fun n : ℕ => (((n + 2 : ℕ) : ℝ))) Filter.atTop Filter.atTop := by + exact (tendsto_natCast_atTop_atTop (R := ℝ)).comp (Filter.tendsto_add_atTop_nat 2) + have hden : Filter.Tendsto (fun n : ℕ => (n : ℝ) + 2) Filter.atTop Filter.atTop := by + convert hdenCast using 1 + ext n + simp [Nat.cast_add] + have hε : Filter.Tendsto (fun n : ℕ => ε₀ / ((n : ℝ) + 2)) Filter.atTop (𝓝 0) := by + have hinv : Filter.Tendsto (fun n : ℕ => ((n : ℝ) + 2)⁻¹) Filter.atTop (𝓝 0) := + tendsto_inv_atTop_zero.comp hden + simpa [div_eq_mul_inv, mul_comm] using hinv.const_mul ε₀ + rw [tendsto_pi_nhds] + intro i + simpa [diagonalShift] using tendsto_const_nhds.sub hε + +/-- Integrals against inward translates of a continuous compactly supported test function converge to the unshifted integral for an L² function. -/ +theorem tendsto_setIntegral_mul_precomp_subRight_of_memL2On + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + {f ψ : Vec d → ℝ} (hfL2 : MemL2On U f) (hψ_cont : Continuous ψ) + (hψ_compact : HasCompactSupport ψ) (ε₀ : ℝ) : + Filter.Tendsto + (fun n : ℕ => + ∫ x in U, f x * ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume) + Filter.atTop + (𝓝 (∫ x in U, f x * ψ x ∂MeasureTheory.volume)) := by + let μ := MeasureTheory.volume.restrict U + have hf_int : MeasureTheory.Integrable f μ := by + simpa [MemL2On, μ] using (hfL2.integrable (by norm_num : (1 : ENNReal) ≤ 2)) + obtain ⟨C, hC⟩ := exists_abs_bound_of_continuous_of_hasCompactSupport hψ_cont hψ_compact + have hbound_int : MeasureTheory.Integrable (fun x : Vec d => C * |f x|) μ := by + simpa [Real.norm_eq_abs, mul_comm, μ] using (hf_int.norm.mul_const C) + have hmeas : + ∀ n : ℕ, + MeasureTheory.AEStronglyMeasurable + (fun x : Vec d => f x * ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))) μ := by + intro n + have hshift_cont : + Continuous (fun x : Vec d => ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))) := + hψ_cont.comp (continuous_id.sub continuous_const) + exact hfL2.aestronglyMeasurable.mul hshift_cont.aestronglyMeasurable + have hbound : + ∀ n : ℕ, + ∀ᵐ x ∂μ, + ‖f x * ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))‖ ≤ C * |f x| := by + intro n + filter_upwards with x + have hψx : |ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))| ≤ C := + hC (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + rw [Real.norm_eq_abs, abs_mul] + nlinarith [abs_nonneg (f x), abs_nonneg (ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))))] + have hlim : + ∀ᵐ x ∂μ, + Filter.Tendsto + (fun n : ℕ => f x * ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))) + Filter.atTop (𝓝 (f x * ψ x)) := by + refine Filter.Eventually.of_forall ?_ + intro x + have hψ_lim : + Filter.Tendsto + (fun n : ℕ => ψ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))) + Filter.atTop (𝓝 (ψ x)) := + hψ_cont.continuousAt.tendsto.comp (tendsto_precomp_sub_diagonalShift (d := d) x ε₀) + simpa using hψ_lim.const_mul (f x) + simpa [μ] using + (MeasureTheory.tendsto_integral_of_dominated_convergence + (μ := μ) (bound := fun x : Vec d => C * |f x|) hmeas hbound_int hbound hlim) + +namespace H1Function + +/-- +Promote an `H¹` witness on the open centered cube to an `H¹` witness on the +corresponding half-open centered cube by shifting smooth compactly supported +tests inward and passing to the limit. +-/ +noncomputable def toCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) : + H1Function (cubeSet (originCube d n)) := by + let Uo : Set (Vec d) := openCubeSet (originCube d n) + let Uc : Set (Vec d) := cubeSet (originCube d n) + haveI : Fact (MeasureTheory.volume Uc < ⊤) := ⟨by exact volume_cubeSet_originCube_lt_top (d := d) n⟩ + haveI : MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict Uc) := inferInstance + have hu_memL2 : MemL2On Uc u.toFun := by + simpa [MemL2On, Uo, Uc, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using u.memL2 + have hu_gradMemL2 : GradMemL2On Uc u.grad := by + intro i + simpa [MemL2On, Uo, Uc, + volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using u.gradMemL2 i + refine + { toFun := u.toFun + grad := u.grad + memL2 := hu_memL2 + gradMemL2 := hu_gradMemL2 + hasWeakGradient := ?_ } + intro i φ hφ_smooth hφ_compact hφ_sub + rcases HasCompactSupport.exists_pos_forall_precomp_subRight_tsupport_subset_openCubeSet_originCube + (d := d) (n := n) (φ := φ) hφ_compact hφ_sub with ⟨ε₀, hε₀pos, hpush⟩ + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + let ψn : ℕ → Vec d → ℝ := + fun n x => φ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + have hφ_cont : Continuous φ := (hφ_smooth.differentiable (by simp)).continuous + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hψn_smooth : ∀ n : ℕ, ContDiff ℝ (⊤ : ℕ∞) (ψn n) := by + intro n + have hshift_smooth : + ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) := by + simpa [diagonalShift] using contDiff_id.sub contDiff_const + exact hφ_smooth.comp hshift_smooth + have hψn_compact : ∀ n : ℕ, HasCompactSupport (ψn n) := by + intro n + simpa [ψn] using! + hφ_compact.comp_homeomorph + (Homeomorph.subRight (diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2)))) + have hψn_sub : ∀ n : ℕ, tsupport (ψn n) ⊆ Uo := by + intro n + have hεpos : 0 < ε₀ / ((n : ℝ) + 2) := by + have hden_pos : 0 < ((n : ℝ) + 2) := by positivity + exact div_pos hε₀pos hden_pos + have hεlt : ε₀ / ((n : ℝ) + 2) < ε₀ := by + have hn_nonneg : 0 ≤ (n : ℝ) := by exact_mod_cast (Nat.zero_le n) + have hden_pos : 0 < ((n : ℝ) + 2) := by nlinarith + have hmul : ε₀ < ε₀ * ((n : ℝ) + 2) := by nlinarith [hε₀pos, hn_nonneg] + exact (div_lt_iff₀ hden_pos).2 hmul + exact hpush hεpos hεlt + have hshiftEq : + ∀ m : ℕ, + ∫ x in Uc, u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume = + -∫ x in Uc, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume := by + intro m + have hweakOpen := u.hasWeakGradient i (ψn m) (hψn_smooth m) (hψn_compact m) (hψn_sub m) + have hleftSet : + ∫ x in Uc, u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume = + ∫ x in Uo, u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume := by + simpa [Uo, Uc] using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => + u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))))) + have hrightSet : + ∫ x in Uc, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume = + ∫ x in Uo, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))) + ∂MeasureTheory.volume := by + simpa [Uo, Uc] using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => + u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((m : ℝ) + 2))))) + rw [hleftSet, hrightSet] + simpa [Uo, Uc, dφ, ψn, diagonalShift, fderiv_comp_sub] using hweakOpen + have hleft : + Filter.Tendsto + (fun n : ℕ => + ∫ x in Uc, u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume) + Filter.atTop + (𝓝 (∫ x in Uc, u.toFun x * dφ x ∂MeasureTheory.volume)) := + tendsto_setIntegral_mul_precomp_subRight_of_memL2On + (U := Uc) (f := u.toFun) (ψ := dφ) hu_memL2 hdφ_cont hdφ_compact ε₀ + have hright : + Filter.Tendsto + (fun n : ℕ => + ∫ x in Uc, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume) + Filter.atTop + (𝓝 (∫ x in Uc, u.grad x i * φ x ∂MeasureTheory.volume)) := + tendsto_setIntegral_mul_precomp_subRight_of_memL2On + (U := Uc) (f := fun x => u.grad x i) (ψ := φ) (hu_gradMemL2 i) hφ_cont hφ_compact ε₀ + have hrightNeg : + Filter.Tendsto + (fun n : ℕ => + -∫ x in Uc, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume) + Filter.atTop + (𝓝 (-∫ x in Uc, u.grad x i * φ x ∂MeasureTheory.volume)) := by + simpa using hright.neg + have hsame : + ∀ n : ℕ, + -∫ x in Uc, u.grad x i * φ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume = + (∫ x in Uc, u.toFun x * dφ (x - diagonalShift (d := d) (ε₀ / ((n : ℝ) + 2))) + ∂MeasureTheory.volume) := by + intro n + exact (hshiftEq n).symm + have hfinal : + ∫ x in Uc, u.toFun x * dφ x ∂MeasureTheory.volume = + -∫ x in Uc, u.grad x i * φ x ∂MeasureTheory.volume := + tendsto_nhds_unique hleft + (Filter.Tendsto.congr' (Filter.Eventually.of_forall hsame) hrightNeg) + simpa [dφ, Uc] using hfinal + +theorem exists_toCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) : + ∃ v : H1Function (cubeSet (originCube d n)), v.toFun = u.toFun ∧ v.grad = u.grad := by + refine ⟨u.toCubeSetOriginCube, rfl, rfl⟩ + +/-- +The coordinate projection `x ↦ x i` as an `H¹` function on the open centered cube, +with constant gradient `basisVec i`. +-/ +noncomputable def coordOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} (i : Fin d) : + H1Function (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + haveI : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + haveI : MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) := inferInstance + refine + { toFun := fun x => x i + grad := fun _ => basisVec i + memL2 := ?_ + gradMemL2 := ?_ + hasWeakGradient := ?_ } + · let C : ℝ := (1 / 2 : ℝ) * (3 : ℝ) ^ n + refine MeasureTheory.MemLp.of_bound + (μ := MeasureTheory.volume.restrict U) + ((continuous_apply i).aestronglyMeasurable) + C ?_ + rw [MeasureTheory.ae_restrict_iff' (measurableSet_openCubeSet (originCube d n))] + refine Filter.Eventually.of_forall ?_ + intro x hx + rcases (mem_openCubeSet_originCube_iff.mp hx) i with ⟨hlo, hhi⟩ + have hlo' : -C < x i := by + simpa [C, neg_mul] using hlo + have habs : |x i| < C := by + rw [abs_lt] + exact ⟨hlo', hhi⟩ + exact le_of_lt (by simpa [Real.norm_eq_abs] using habs) + · intro j + simpa [U] using + (MeasureTheory.memLp_const + (μ := MeasureTheory.volume.restrict U) + (p := (2 : ENNReal)) + (c := basisVec i j)) + · intro j + convert + (HasWeakPartialDerivOn.of_contDiff + (U := U) + (i := j) + (f := fun x : Vec d => x i) + (hf := contDiff_apply (𝕜 := ℝ) (n := (1 : ℕ∞)) (E := ℝ) i)) using 2 + rename_i x + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + have hproj : + HasFDerivAt (fun y : Vec d => y i) π x := by + simpa [π] using! π.hasFDerivAt (x := x) + have hlin : fderiv ℝ (fun y : Vec d => y i) x = π := hproj.fderiv + simpa [π, basisVec_apply, eq_comm] using + (congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec j)) hlin).symm + +end H1Function + +namespace H10Function + +/-- +Promote an `H¹₀` witness on the open centered cube to an `H¹₀` witness on the +corresponding half-open centered cube. +-/ +noncomputable def toCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) : + H10Function (cubeSet (originCube d n)) where + toH1Function := u.toH1Function.toCubeSetOriginCube + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := by + intro m + exact (u.approx_support_subset m).trans (openCubeSet_subset_cubeSet (originCube d n)) + tendsto_approx := by + simpa + [volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using! u.tendsto_approx + tendsto_approx_grad := by + intro i + simpa + [volume_restrict_cubeSet_originCube_eq_volume_restrict_openCubeSet_originCube (d := d) n] + using! u.tendsto_approx_grad i + +@[simp] theorem toCubeSetOriginCube_toH1Function_toFun {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) : + (u.toCubeSetOriginCube.toH1Function.toFun) = u.toH1Function.toFun := + rfl + +@[simp] theorem toCubeSetOriginCube_toH1Function_grad {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) : + (u.toCubeSetOriginCube.toH1Function.grad) = u.toH1Function.grad := + rfl + +/-- +Restrict an `H¹₀` witness on the half-open centered cube to the corresponding +open centered cube by pushing each smooth approximant slightly inward while +keeping the shift small enough that the `L²` error still vanishes. +-/ +noncomputable def toOpenCubeSetOriginCube {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (cubeSet (originCube d n))) : + H10Function (openCubeSet (originCube d n)) := by + let Uc : Set (Vec d) := cubeSet (originCube d n) + let Uo : Set (Vec d) := openCubeSet (originCube d n) + have hUo_open : IsOpen Uo := isOpen_openCubeSet (originCube d n) + let v : H1Function Uo := u.toH1Function.restrict hUo_open (openCubeSet_subset_cubeSet _) + let μo := MeasureTheory.volume.restrict Uo + haveI : Fact (MeasureTheory.volume Uo < ⊤) := ⟨volume_openCubeSet_originCube_lt_top (d := d) n⟩ + haveI : MeasureTheory.IsFiniteMeasure μo := inferInstance + have hshiftData : + ∀ m : ℕ, + ∃ ε : ℝ, 0 < ε ∧ + tsupport (fun x : Vec d => u.approx m (x - diagonalShift (d := d) ε)) ⊆ Uo ∧ + (∀ x : Vec d, + dist (u.approx m (x - diagonalShift (d := d) ε)) (u.approx m x) ≤ + 1 / ((m : ℝ) + 1)) ∧ + (∀ i : Fin d, ∀ x : Vec d, + dist ((fderiv ℝ (u.approx m) (x - diagonalShift (d := d) ε)) (basisVec i)) + ((fderiv ℝ (u.approx m) x) (basisVec i)) ≤ 1 / ((m : ℝ) + 1)) := by + intro m + let η : ℝ := 1 / ((m : ℝ) + 1) + have hη : 0 < η := by + dsimp [η] + positivity + have happrox_cont : Continuous (u.approx m) := + (u.approx_smooth m).differentiable (by simp) |>.continuous + have happrox_uc : UniformContinuous (u.approx m) := + (u.approx_hasCompactSupport m).uniformContinuous_of_continuous happrox_cont + have hgrad_uc : + ∀ i : Fin d, + UniformContinuous (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + intro i + have hcont : + Continuous (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + simpa using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + have hcompact : + HasCompactSupport (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + simpa using (u.approx_hasCompactSupport m).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcompact.uniformContinuous_of_continuous hcont + obtain ⟨εpush, hεpush_pos, hpush⟩ := + HasCompactSupport.exists_pos_forall_precomp_subRight_tsupport_subset_openCubeSet_originCube + (d := d) (n := n) (φ := u.approx m) (u.approx_hasCompactSupport m) (u.approx_support_subset m) + obtain ⟨δfun, hδfun_pos, hδfun⟩ := + (Metric.uniformContinuous_iff_le.mp happrox_uc) η hη + let δgrad : Fin d → ℝ := fun i => + Classical.choose ((Metric.uniformContinuous_iff_le.mp (hgrad_uc i)) η hη) + have hδgrad_pos : ∀ i : Fin d, 0 < δgrad i := by + intro i + exact (Classical.choose_spec ((Metric.uniformContinuous_iff_le.mp (hgrad_uc i)) η hη)).1 + have hδgrad : + ∀ i : Fin d, ∀ {x y : Vec d}, dist x y ≤ δgrad i → + dist ((fderiv ℝ (u.approx m) x) (basisVec i)) + ((fderiv ℝ (u.approx m) y) (basisVec i)) ≤ η := by + intro i x y hxy + exact (Classical.choose_spec ((Metric.uniformContinuous_iff_le.mp (hgrad_uc i)) η hη)).2 hxy + let gradValues : Finset ℝ := Finset.univ.image δgrad + have hgradValues_nonempty : gradValues.Nonempty := by + exact Finset.univ_nonempty.image δgrad + let δgradMin : ℝ := gradValues.min' hgradValues_nonempty + have hδgradMin_pos : 0 < δgradMin := by + rcases Finset.mem_image.mp (Finset.min'_mem gradValues hgradValues_nonempty) with + ⟨i, -, hi⟩ + calc + 0 < δgrad i := hδgrad_pos i + _ = δgradMin := by simpa [δgradMin, gradValues] using hi + have hδgradMin_le : ∀ i : Fin d, δgradMin ≤ δgrad i := by + intro i + exact Finset.min'_le gradValues (δgrad i) + (Finset.mem_image.mpr ⟨i, Finset.mem_univ i, rfl⟩) + let ε : ℝ := min (εpush / 2) (min δfun δgradMin) + have hε_pos : 0 < ε := by + dsimp [ε] + refine lt_min ?_ (lt_min hδfun_pos hδgradMin_pos) + linarith + have hε_lt_push : ε < εpush := by + have hle : ε ≤ εpush / 2 := by + dsimp [ε] + exact min_le_left _ _ + have hhalf_lt : εpush / 2 < εpush := by + linarith + exact lt_of_le_of_lt hle hhalf_lt + refine ⟨ε, hε_pos, hpush hε_pos hε_lt_push, ?_, ?_⟩ + · intro x + have hdist : + dist (x - diagonalShift (d := d) ε) x ≤ δfun := by + calc + dist (x - diagonalShift (d := d) ε) x ≤ ε := + dist_sub_diagonalShift_le (d := d) x (le_of_lt hε_pos) + _ ≤ min δfun δgradMin := by + dsimp [ε] + exact min_le_right _ _ + _ ≤ δfun := min_le_left _ _ + exact hδfun hdist + · intro i x + have hdist : + dist (x - diagonalShift (d := d) ε) x ≤ δgrad i := by + calc + dist (x - diagonalShift (d := d) ε) x ≤ ε := + dist_sub_diagonalShift_le (d := d) x (le_of_lt hε_pos) + _ ≤ min δfun δgradMin := by + dsimp [ε] + exact min_le_right _ _ + _ ≤ δgradMin := min_le_right _ _ + _ ≤ δgrad i := hδgradMin_le i + exact hδgrad i hdist + let εShift : ℕ → ℝ := fun m => Classical.choose (hshiftData m) + let approx' : ℕ → Vec d → ℝ := fun m x => u.approx m (x - diagonalShift (d := d) (εShift m)) + have hεShift : + ∀ m : ℕ, + 0 < εShift m ∧ + tsupport (approx' m) ⊆ Uo ∧ + (∀ x : Vec d, dist (approx' m x) (u.approx m x) ≤ 1 / ((m : ℝ) + 1)) ∧ + (∀ i : Fin d, ∀ x : Vec d, + dist ((fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i)) + ((fderiv ℝ (u.approx m) x) (basisVec i)) ≤ 1 / ((m : ℝ) + 1)) := by + intro m + simpa [εShift, approx'] using Classical.choose_spec (hshiftData m) + have happrox'_smooth : ∀ m : ℕ, ContDiff ℝ (⊤ : ℕ∞) (approx' m) := by + intro m + have hshift_smooth : + ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => x - diagonalShift (d := d) (εShift m)) := by + simpa [diagonalShift] using contDiff_id.sub contDiff_const + simpa [approx'] using! (u.approx_smooth m).comp hshift_smooth + have happrox'_compact : ∀ m : ℕ, HasCompactSupport (approx' m) := by + intro m + simpa [approx'] using! + (u.approx_hasCompactSupport m).comp_homeomorph + (Homeomorph.subRight (diagonalShift (d := d) (εShift m))) + have horigRestrict : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm (fun x => u.approx m x - v.toFun x) 2 μo) + Filter.atTop (𝓝 0) := by + have hcube : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm (fun x => u.approx m x - u.toH1Function.toFun x) 2 + (MeasureTheory.volume.restrict Uc)) + Filter.atTop (𝓝 0) := by + simpa [Uc] using u.tendsto_approx + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hcube (fun _ => bot_le) ?_ + intro m + simpa [v, H1Function.restrict, μo, Uo, Uc] using + (MeasureTheory.eLpNorm_mono_measure + (fun x => u.approx m x - u.toH1Function.toFun x) + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume (openCubeSet_subset_cubeSet _))) + have horigGradRestrict : + ∀ i : Fin d, + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - v.grad x i) 2 μo) + Filter.atTop (𝓝 0) := by + intro i + have hcube : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - u.toH1Function.grad x i) 2 + (MeasureTheory.volume.restrict Uc)) + Filter.atTop (𝓝 0) := by + simpa [Uc] using u.tendsto_approx_grad i + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hcube (fun _ => bot_le) ?_ + intro m + simpa [v, H1Function.restrict, μo, Uo, Uc] using + (MeasureTheory.eLpNorm_mono_measure + (fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - u.toH1Function.grad x i) + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume (openCubeSet_subset_cubeSet _))) + have hμo_univ_lt_top : μo Set.univ < ⊤ := by + simpa [μo] using volume_openCubeSet_originCube_lt_top (d := d) n + have hshiftApprox : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm (fun x => approx' m x - u.approx m x) 2 μo) + Filter.atTop (𝓝 0) := by + let cμ : ℝ := (μo Set.univ).toReal ^ (1 / ((2 : ENNReal).toReal)) + have hpow_eq : + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) = ENNReal.ofReal cμ := by + have hpow_lt_top : + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) < ⊤ := + ENNReal.rpow_lt_top_of_nonneg (by positivity) hμo_univ_lt_top.ne + calc + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) = + ENNReal.ofReal ((μo Set.univ ^ (1 / ((2 : ENNReal).toReal))).toReal) := by + exact (ENNReal.ofReal_toReal hpow_lt_top.ne).symm + _ = ENNReal.ofReal cμ := by + congr 1 + simpa [cμ] using + (ENNReal.toReal_rpow (μo Set.univ) (1 / ((2 : ENNReal).toReal))).symm + have hbound : + ∀ m : ℕ, + MeasureTheory.eLpNorm (fun x => approx' m x - u.approx m x) 2 μo ≤ + ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ) := by + intro m + calc + MeasureTheory.eLpNorm (fun x => approx' m x - u.approx m x) 2 μo + ≤ ENNReal.ofReal (1 / ((m : ℝ) + 1)) * μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) := + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := μo) (p := (2 : ENNReal)) (s := Set.univ) + (by simp) MeasurableSet.univ.nullMeasurableSet (by positivity) + ((happrox'_smooth m).continuous.aestronglyMeasurable.sub + (u.approx_smooth m).continuous.aestronglyMeasurable) + (hεShift m).2.2.1 + (by simp) (by simp) + _ = ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ) := by + rw [hpow_eq, ← ENNReal.ofReal_mul] + positivity + have hbase : Filter.Tendsto (fun m : ℕ => (1 : ℝ) / ((m : ℝ) + 1)) Filter.atTop (𝓝 0) := by + have hdenCast : Filter.Tendsto (fun m : ℕ => (((m + 1 : ℕ) : ℝ))) Filter.atTop Filter.atTop := by + exact (tendsto_natCast_atTop_atTop (R := ℝ)).comp (Filter.tendsto_add_atTop_nat 1) + have hden : Filter.Tendsto (fun m : ℕ => (m : ℝ) + 1) Filter.atTop Filter.atTop := by + convert hdenCast using 1 + ext m + simp [Nat.cast_add] + simpa [one_div] using! tendsto_inv_atTop_zero.comp hden + have hbound_tendsto : + Filter.Tendsto + (fun m : ℕ => ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ)) + Filter.atTop (𝓝 0) := by + simpa [zero_mul, mul_comm] using ENNReal.tendsto_ofReal (hbase.mul_const cμ) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hbound_tendsto + (fun _ => bot_le) hbound + have hshiftGrad : + ∀ i : Fin d, + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) + - (fderiv ℝ (u.approx m) x) (basisVec i)) 2 μo) + Filter.atTop (𝓝 0) := by + intro i + let cμ : ℝ := (μo Set.univ).toReal ^ (1 / ((2 : ENNReal).toReal)) + have hpow_eq : + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) = ENNReal.ofReal cμ := by + have hpow_lt_top : + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) < ⊤ := + ENNReal.rpow_lt_top_of_nonneg (by positivity) hμo_univ_lt_top.ne + calc + μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) = + ENNReal.ofReal ((μo Set.univ ^ (1 / ((2 : ENNReal).toReal))).toReal) := by + exact (ENNReal.ofReal_toReal hpow_lt_top.ne).symm + _ = ENNReal.ofReal cμ := by + congr 1 + simpa [cμ] using + (ENNReal.toReal_rpow (μo Set.univ) (1 / ((2 : ENNReal).toReal))).symm + have hbound : + ∀ m : ℕ, + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) + - (fderiv ℝ (u.approx m) x) (basisVec i)) 2 μo ≤ + ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ) := by + intro m + calc + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) + - (fderiv ℝ (u.approx m) x) (basisVec i)) 2 μo + ≤ ENNReal.ofReal (1 / ((m : ℝ) + 1)) * μo Set.univ ^ (1 / ((2 : ENNReal).toReal)) := + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := μo) (p := (2 : ENNReal)) (s := Set.univ) + (by simp) MeasurableSet.univ.nullMeasurableSet (by positivity) + (by + have hc : Continuous (fun x : Vec d => + (fderiv ℝ (u.approx m) x) (basisVec i)) := + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + exact (hc.comp (continuous_id.sub continuous_const)).aestronglyMeasurable.sub + hc.aestronglyMeasurable) + ((hεShift m).2.2.2 i) + (by simp) (by simp) + _ = ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ) := by + rw [hpow_eq, ← ENNReal.ofReal_mul] + positivity + have hbase : Filter.Tendsto (fun m : ℕ => (1 : ℝ) / ((m : ℝ) + 1)) Filter.atTop (𝓝 0) := by + have hdenCast : Filter.Tendsto (fun m : ℕ => (((m + 1 : ℕ) : ℝ))) Filter.atTop Filter.atTop := by + exact (tendsto_natCast_atTop_atTop (R := ℝ)).comp (Filter.tendsto_add_atTop_nat 1) + have hden : Filter.Tendsto (fun m : ℕ => (m : ℝ) + 1) Filter.atTop Filter.atTop := by + convert hdenCast using 1 + ext m + simp [Nat.cast_add] + simpa [one_div] using! tendsto_inv_atTop_zero.comp hden + have hbound_tendsto : + Filter.Tendsto + (fun m : ℕ => ENNReal.ofReal ((1 / ((m : ℝ) + 1)) * cμ)) + Filter.atTop (𝓝 0) := by + simpa [zero_mul, mul_comm] using ENNReal.tendsto_ofReal (hbase.mul_const cμ) + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hbound_tendsto + (fun _ => bot_le) hbound + refine + { toH1Function := v + approx := approx' + approx_smooth := happrox'_smooth + approx_hasCompactSupport := happrox'_compact + approx_support_subset := by + intro m + exact (hεShift m).2.1 + tendsto_approx := by + have hsum : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm (fun x => u.approx m x - v.toFun x) 2 μo + + MeasureTheory.eLpNorm (fun x => approx' m x - u.approx m x) 2 μo) + Filter.atTop (𝓝 0) := by + simpa using horigRestrict.add hshiftApprox + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun _ => bot_le) ?_ + intro m + have hmeas₁ : + MeasureTheory.AEStronglyMeasurable (fun x => u.approx m x - v.toFun x) μo := + ((u.approx_smooth m).differentiable (by simp)).continuous.aestronglyMeasurable.sub + v.memL2.aestronglyMeasurable + have hmeas₂ : + MeasureTheory.AEStronglyMeasurable (fun x => approx' m x - u.approx m x) μo := + (happrox'_smooth m).continuous.aestronglyMeasurable.sub + ((u.approx_smooth m).differentiable (by simp)).continuous.aestronglyMeasurable + have htri := + MeasureTheory.eLpNorm_add_le (μ := μo) + (f := fun x => u.approx m x - v.toFun x) + (g := fun x => approx' m x - u.approx m x) + (by norm_num : (1 : ENNReal) ≤ 2) + have hsum_eq : + ((fun x => u.approx m x - v.toFun x) + fun x => approx' m x - u.approx m x) = + (fun x => approx' m x - v.toFun x) := by + funext x + simp [approx', sub_eq_add_neg] + ring + simpa [hsum_eq] using htri + tendsto_approx_grad := by + intro i + have hsum : + Filter.Tendsto + (fun m : ℕ => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - v.grad x i) 2 μo + + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) + (basisVec i) - (fderiv ℝ (u.approx m) x) (basisVec i)) 2 μo) + Filter.atTop (𝓝 0) := by + simpa using (horigGradRestrict i).add (hshiftGrad i) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun _ => bot_le) ?_ + intro m + have hmeas₁ : + MeasureTheory.AEStronglyMeasurable + (fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - v.grad x i) μo := by + have hcont : + Continuous (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + simpa using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + exact hcont.aestronglyMeasurable.sub (v.gradMemL2 i).aestronglyMeasurable + have hmeas₂ : + MeasureTheory.AEStronglyMeasurable + (fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) + - (fderiv ℝ (u.approx m) x) (basisVec i)) μo := by + have hcontShift : + Continuous + (fun x : Vec d => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i)) := by + have hbase : + Continuous (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + simpa using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + exact hbase.comp (continuous_id.sub continuous_const) + have hcont : + Continuous (fun x : Vec d => (fderiv ℝ (u.approx m) x) (basisVec i)) := by + simpa using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + exact hcontShift.aestronglyMeasurable.sub hcont.aestronglyMeasurable + have htri := + MeasureTheory.eLpNorm_add_le (μ := μo) + (f := fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - v.grad x i) + (g := fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) + - (fderiv ℝ (u.approx m) x) (basisVec i)) + (by norm_num : (1 : ENNReal) ≤ 2) + have hsum_eq : + ((fun x => (fderiv ℝ (u.approx m) x) (basisVec i) - v.grad x i) + + fun x => + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) - + (fderiv ℝ (u.approx m) x) (basisVec i)) = + (fun x => (fderiv ℝ (approx' m) x) (basisVec i) - v.grad x i) := by + funext x + have hderiv_eq : + (fderiv ℝ (approx' m) x) (basisVec i) = + (fderiv ℝ (u.approx m) (x - diagonalShift (d := d) (εShift m))) (basisVec i) := by + simpa [approx'] using + congrArg (fun L => L (basisVec i)) + (fderiv_comp_sub (𝕜 := ℝ) (f := u.approx m) + (x := x) (a := diagonalShift (d := d) (εShift m))) + rw [hderiv_eq] + simp [sub_eq_add_neg] + ring + simpa [hsum_eq] using htri } + +@[simp] theorem toOpenCubeSetOriginCube_toH1Function_toFun {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (cubeSet (originCube d n))) : + (u.toOpenCubeSetOriginCube.toH1Function.toFun) = u.toH1Function.toFun := + rfl + +@[simp] theorem toOpenCubeSetOriginCube_toH1Function_grad {d : ℕ} [NeZero d] {n : ℤ} + (u : H10Function (cubeSet (originCube d n))) : + (u.toOpenCubeSetOriginCube.toH1Function.grad) = u.toH1Function.grad := + rfl + +end H10Function + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeSymmetry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeSymmetry.lean new file mode 100644 index 0000000000..2262720db8 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/OriginCubeSymmetry.lean @@ -0,0 +1,834 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Probability.OriginCubeSymmetry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import Mathlib.Analysis.Calculus.FDeriv.Equiv +public import Mathlib.Dynamics.Ergodic.MeasurePreserving +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.Topology.Algebra.Module.Equiv + +/-! # Origin Cube Symmetry -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +/-- File-level typeclass cache for `Module ℝ (Vec d)`. -/ +private instance instModuleVecOCS (d : ℕ) : Module ℝ (Vec d) := inferInstance + +/-- +Coordinate sign-flip on `Vec d` as a continuous linear equivalence. +-/ +noncomputable def signFlipVecContinuousLinearEquiv {d : ℕ} (i : Fin d) : + Vec d ≃L[ℝ] Vec d := + ContinuousLinearEquiv.piCongrRight fun j : Fin d => + if h : j = i then + by + subst h + exact ContinuousLinearEquiv.neg ℝ + else + ContinuousLinearEquiv.refl ℝ ℝ + +/-- +Coordinate swap on `Vec d` as a continuous linear equivalence. +-/ +noncomputable def swapVecContinuousLinearEquiv {d : ℕ} (i j : Fin d) : + Vec d ≃L[ℝ] Vec d := + ContinuousLinearEquiv.piCongrLeft ℝ (fun _ : Fin d => ℝ) (Equiv.swap i j) + +@[simp] theorem signFlipVecContinuousLinearEquiv_apply {d : ℕ} (i : Fin d) (x : Vec d) : + signFlipVecContinuousLinearEquiv i x = matVecMul (signFlipMatrix i) x := by + ext j + by_cases h : j = i + · subst h + simp [signFlipVecContinuousLinearEquiv, matVecMul_signFlipMatrix_apply] + · simp [signFlipVecContinuousLinearEquiv, matVecMul_signFlipMatrix_apply, h] + +@[simp] theorem signFlipVecContinuousLinearEquiv_symm_apply {d : ℕ} (i : Fin d) (x : Vec d) : + (signFlipVecContinuousLinearEquiv i).symm x = matVecMul (signFlipMatrix i) x := by + have hs : (signFlipVecContinuousLinearEquiv i).symm = signFlipVecContinuousLinearEquiv i := by + ext y j + by_cases h : j = i + · subst h + simp [signFlipVecContinuousLinearEquiv] + · simp [signFlipVecContinuousLinearEquiv, h] + rw [hs] + exact signFlipVecContinuousLinearEquiv_apply i x + +@[simp] theorem swapVecContinuousLinearEquiv_apply {d : ℕ} (i j : Fin d) (x : Vec d) : + swapVecContinuousLinearEquiv i j x = matVecMul (Matrix.swap ℝ i j) x := by + ext k + have h := + Homeomorph.piCongrLeft_apply_apply (Y := fun _ : Fin d => ℝ) (Equiv.swap i j) x + (Equiv.swap i j k) + simpa [swapVecContinuousLinearEquiv, matVecMul_swap_eq_comp] using! h + +@[simp] theorem swapVecContinuousLinearEquiv_symm_apply {d : ℕ} (i j : Fin d) (x : Vec d) : + (swapVecContinuousLinearEquiv i j).symm x = matVecMul (Matrix.swap ℝ i j) x := by + ext k + have hfun : + ⇑(Homeomorph.piCongrLeft (Y := fun _ : Fin d => ℝ) (Equiv.swap i j)).symm = + fun y z => y ((Equiv.swap i j) z) := + Homeomorph.piCongrLeft_symm_apply (Y := fun _ : Fin d => ℝ) (Equiv.swap i j) + have h : + (swapVecContinuousLinearEquiv i j).symm x k = x ((Equiv.swap i j) k) := by + change (Homeomorph.piCongrLeft (Y := fun _ : Fin d => ℝ) (Equiv.swap i j)).symm x k = _ + exact congrFun (congrFun hfun x) k + simp [h, matVecMul_swap_eq_comp] + +@[simp] theorem signFlipVecContinuousLinearEquiv_self_apply {d : ℕ} (i : Fin d) (x : Vec d) : + signFlipVecContinuousLinearEquiv i (signFlipVecContinuousLinearEquiv i x) = x := by + have hs : (signFlipVecContinuousLinearEquiv i).symm = signFlipVecContinuousLinearEquiv i := by + ext y j + by_cases h : j = i + · subst h + simp [signFlipVecContinuousLinearEquiv] + · simp [signFlipVecContinuousLinearEquiv, h] + simpa [hs] using (signFlipVecContinuousLinearEquiv i).apply_symm_apply x + +@[simp] theorem swapVecContinuousLinearEquiv_self_apply {d : ℕ} (i j : Fin d) (x : Vec d) : + swapVecContinuousLinearEquiv i j (swapVecContinuousLinearEquiv i j x) = x := by + simpa [swapVecContinuousLinearEquiv_symm_apply] using + (swapVecContinuousLinearEquiv i j).apply_symm_apply x + +@[simp] theorem signFlipVecContinuousLinearEquiv_basisVec {d : ℕ} (i k : Fin d) : + signFlipVecContinuousLinearEquiv i (basisVec k) = + (if k = i then (-1 : ℝ) else 1) • basisVec k := by + by_cases hki : k = i + · subst hki + ext j + by_cases hjk : j = k + · subst hjk + simp [basisVec_apply, signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply] + · simp [basisVec_apply, signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply, + hjk] + · ext j + by_cases hjk : j = k + · subst hjk + simp [basisVec_apply, signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply, + hki] + · simp [basisVec_apply, signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply, + hki, hjk] + +@[simp] theorem swapVecContinuousLinearEquiv_basisVec {d : ℕ} (i j k : Fin d) : + swapVecContinuousLinearEquiv i j (basisVec k) = basisVec (Equiv.swap i j k) := by + ext l + by_cases h : (Equiv.swap i j l) = k + · have h' : l = Equiv.swap i j k := by + simpa using congrArg (Equiv.swap i j) h + simp [basisVec_apply, swapVecContinuousLinearEquiv_apply, matVecMul_swap_eq_comp, h'] + · have h' : l ≠ Equiv.swap i j k := by + intro hl + apply h + simp [hl] + simp [basisVec_apply, swapVecContinuousLinearEquiv_apply, matVecMul_swap_eq_comp, h, h'] + +private theorem measurePreserving_signFlipVecContinuousLinearEquiv {d : ℕ} (i : Fin d) : + MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) MeasureTheory.volume + MeasureTheory.volume := by + classical + simpa [signFlipVecContinuousLinearEquiv_apply] using! + (MeasureTheory.volume_preserving_pi fun j : Fin d => + by + by_cases h : j = i + · subst h + simpa using! + (MeasureTheory.Measure.measurePreserving_neg + (MeasureTheory.volume : MeasureTheory.Measure ℝ)) + · simpa [h] using + (MeasureTheory.MeasurePreserving.id + (μ := (MeasureTheory.volume : MeasureTheory.Measure ℝ)))) + +private theorem measurePreserving_swapVecContinuousLinearEquiv {d : ℕ} (i j : Fin d) : + MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) MeasureTheory.volume + MeasureTheory.volume := by + simpa [swapVecContinuousLinearEquiv] using! + (MeasureTheory.volume_measurePreserving_piCongrLeft + (fun _ : Fin d => ℝ) (Equiv.swap i j)) + +/-- A coordinate sign flip preserves volume restricted to the open centered cube. -/ +theorem measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube + {d : ℕ} (i : Fin d) (n : ℤ) : + MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + let U := openCubeSet (originCube d n) + have hpre : (signFlipVecContinuousLinearEquiv i) ⁻¹' U = U := by + ext x + simpa [U] using (mem_openCubeSet_originCube_signFlipMatrix_iff (m := n) (i := i) (x := x)) + simpa [U, hpre] using + (measurePreserving_signFlipVecContinuousLinearEquiv i).restrict_preimage_emb + (signFlipVecContinuousLinearEquiv i).toHomeomorph.measurableEmbedding U + +/-- Swapping two coordinates preserves volume restricted to the open centered cube. -/ +theorem measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube + {d : ℕ} (i j : Fin d) (n : ℤ) : + MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + let U := openCubeSet (originCube d n) + have hpre : (swapVecContinuousLinearEquiv i j) ⁻¹' U = U := by + ext x + simpa [U] using (mem_openCubeSet_originCube_swap_iff (m := n) (i := i) (j := j) (x := x)) + simpa [U, hpre] using + (measurePreserving_swapVecContinuousLinearEquiv i j).restrict_preimage_emb + (swapVecContinuousLinearEquiv i j).toHomeomorph.measurableEmbedding U + +theorem setIntegral_comp_signFlipVecContinuousLinearEquiv_openCubeSet_originCube + {d : ℕ} (i : Fin d) (n : ℤ) (f : Vec d → ℝ) : + ∫ x in openCubeSet (originCube d n), f (signFlipVecContinuousLinearEquiv i x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), f x ∂MeasureTheory.volume := by + let U := openCubeSet (originCube d n) + have hμ : MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube i n + simpa [U] using + (hμ.integral_comp (signFlipVecContinuousLinearEquiv i).toHomeomorph.measurableEmbedding f) + +theorem setIntegral_comp_swapVecContinuousLinearEquiv_openCubeSet_originCube + {d : ℕ} (i j : Fin d) (n : ℤ) (f : Vec d → ℝ) : + ∫ x in openCubeSet (originCube d n), f (swapVecContinuousLinearEquiv i j x) + ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), f x ∂MeasureTheory.volume := by + let U := openCubeSet (originCube d n) + have hμ : MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube i j n + simpa [U] using + (hμ.integral_comp (swapVecContinuousLinearEquiv i j).toHomeomorph.measurableEmbedding f) + +/-- Precomposing with a coordinate sign flip multiplies each directional derivative +by the corresponding coordinate sign. -/ +theorem fderiv_comp_signFlipVecContinuousLinearEquiv_apply_basisVec {d : ℕ} + (i k : Fin d) {φ : Vec d → ℝ} {x : Vec d} + (hφ : DifferentiableAt ℝ φ (signFlipVecContinuousLinearEquiv i x)) : + (fderiv ℝ (fun y => φ (signFlipVecContinuousLinearEquiv i y)) x) (basisVec k) = + (if k = i then (-1 : ℝ) else 1) * + (fderiv ℝ φ (signFlipVecContinuousLinearEquiv i x)) (basisVec k) := by + let T : Vec d → Vec d := signFlipVecContinuousLinearEquiv i + have hcomp : + fderiv ℝ (fun y => φ (T y)) x = + (fderiv ℝ φ (T x)).comp (fderiv ℝ T x) := by + simpa [T] using + (fderiv_fun_comp (f := T) (g := φ) x hφ (signFlipVecContinuousLinearEquiv i).differentiableAt) + have hlin : fderiv ℝ T x = (signFlipVecContinuousLinearEquiv i).toContinuousLinearMap := by + simpa [T] using ((signFlipVecContinuousLinearEquiv i).toContinuousLinearMap.fderiv (x := x)) + have hb : + (signFlipVecContinuousLinearEquiv i).toContinuousLinearMap (basisVec k) = + (if k = i then (-1 : ℝ) else 1) • basisVec k := by + simpa using (signFlipVecContinuousLinearEquiv_basisVec (i := i) (k := k)) + calc + (fderiv ℝ (fun y => φ (signFlipVecContinuousLinearEquiv i y)) x) (basisVec k) + = ((fderiv ℝ φ (T x)).comp (fderiv ℝ T x)) (basisVec k) := by + simpa [T] using congrArg (fun L => L (basisVec k)) hcomp + _ = ((fderiv ℝ φ (T x)).comp (signFlipVecContinuousLinearEquiv i).toContinuousLinearMap) + (basisVec k) := by rw [hlin] + _ = (fderiv ℝ φ (T x)) + ((signFlipVecContinuousLinearEquiv i).toContinuousLinearMap (basisVec k)) := by + rw [ContinuousLinearMap.comp_apply] + _ = (fderiv ℝ φ (T x)) (((if k = i then (-1 : ℝ) else 1) • basisVec k)) := by rw [hb] + _ = (if k = i then (-1 : ℝ) else 1) * (fderiv ℝ φ (T x)) (basisVec k) := by + by_cases hki : k = i <;> simp [hki] + _ = (if k = i then (-1 : ℝ) else 1) * + (fderiv ℝ φ (signFlipVecContinuousLinearEquiv i x)) (basisVec k) := by + simp [T] + +/-- Precomposing with a coordinate swap permutes the coordinate directional derivatives. -/ +theorem fderiv_comp_swapVecContinuousLinearEquiv_apply_basisVec {d : ℕ} + (i j k : Fin d) {φ : Vec d → ℝ} {x : Vec d} + (hφ : DifferentiableAt ℝ φ (swapVecContinuousLinearEquiv i j x)) : + (fderiv ℝ (fun y => φ (swapVecContinuousLinearEquiv i j y)) x) (basisVec (Equiv.swap i j k)) = + (fderiv ℝ φ (swapVecContinuousLinearEquiv i j x)) (basisVec k) := by + let T : Vec d → Vec d := swapVecContinuousLinearEquiv i j + have hcomp : + fderiv ℝ (fun y => φ (T y)) x = + (fderiv ℝ φ (T x)).comp (fderiv ℝ T x) := by + simpa [T] using + (fderiv_fun_comp (f := T) (g := φ) x hφ (swapVecContinuousLinearEquiv i j).differentiableAt) + have hlin : fderiv ℝ T x = (swapVecContinuousLinearEquiv i j).toContinuousLinearMap := by + simpa [T] using ((swapVecContinuousLinearEquiv i j).toContinuousLinearMap.fderiv (x := x)) + have hb : + (swapVecContinuousLinearEquiv i j).toContinuousLinearMap (basisVec (Equiv.swap i j k)) = + basisVec k := by + simpa using + (swapVecContinuousLinearEquiv_basisVec (i := i) (j := j) (k := Equiv.swap i j k)) + calc + (fderiv ℝ (fun y => φ (swapVecContinuousLinearEquiv i j y)) x) (basisVec (Equiv.swap i j k)) + = ((fderiv ℝ φ (T x)).comp (fderiv ℝ T x)) (basisVec (Equiv.swap i j k)) := by + simpa [T] using congrArg (fun L => L (basisVec (Equiv.swap i j k))) hcomp + _ = ((fderiv ℝ φ (T x)).comp (swapVecContinuousLinearEquiv i j).toContinuousLinearMap) + (basisVec (Equiv.swap i j k)) := by rw [hlin] + _ = (fderiv ℝ φ (T x)) + ((swapVecContinuousLinearEquiv i j).toContinuousLinearMap + (basisVec (Equiv.swap i j k))) := by + rw [ContinuousLinearMap.comp_apply] + _ = (fderiv ℝ φ (T x)) (basisVec k) := by rw [hb] + _ = (fderiv ℝ φ (swapVecContinuousLinearEquiv i j x)) (basisVec k) := by + simp [T] + +private theorem tsupport_comp_homeomorph_eq_preimage {α β : Type*} + [TopologicalSpace α] [TopologicalSpace β] {f : β → ℝ} (e : α ≃ₜ β) : + tsupport (fun x => f (e x)) = e ⁻¹' tsupport f := by + rw [tsupport, tsupport, e.preimage_closure] + ext x + simp [Function.support] + +/-- Precomposition by a coordinate sign flip preserves support inside the open centered cube. -/ +theorem tsupport_comp_signFlip_subset_openCubeSet_originCube {d : ℕ} + {f : Vec d → ℝ} (i : Fin d) (n : ℤ) + (hsub : tsupport f ⊆ openCubeSet (originCube d n)) : + tsupport (fun x => f (signFlipVecContinuousLinearEquiv i x)) ⊆ + openCubeSet (originCube d n) := by + let U := openCubeSet (originCube d n) + intro x hx + have htsupp : + tsupport (fun y => f (signFlipVecContinuousLinearEquiv i y)) = + (signFlipVecContinuousLinearEquiv i) ⁻¹' tsupport f := + tsupport_comp_homeomorph_eq_preimage (signFlipVecContinuousLinearEquiv i).toHomeomorph + have hx' : signFlipVecContinuousLinearEquiv i x ∈ tsupport f := by + rw [htsupp] at hx + exact hx + have hTx : signFlipVecContinuousLinearEquiv i x ∈ U := hsub hx' + have hTx' : matVecMul (signFlipMatrix i) x ∈ U := by + simpa [signFlipVecContinuousLinearEquiv_apply] using hTx + simpa [U] using + (mem_openCubeSet_originCube_signFlipMatrix_iff (m := n) (i := i) (x := x)).1 hTx' + +/-- Precomposition by a coordinate swap preserves support inside the open centered cube. -/ +theorem tsupport_comp_swap_subset_openCubeSet_originCube {d : ℕ} + {f : Vec d → ℝ} (i j : Fin d) (n : ℤ) + (hsub : tsupport f ⊆ openCubeSet (originCube d n)) : + tsupport (fun x => f (swapVecContinuousLinearEquiv i j x)) ⊆ + openCubeSet (originCube d n) := by + let U := openCubeSet (originCube d n) + intro x hx + have htsupp : + tsupport (fun y => f (swapVecContinuousLinearEquiv i j y)) = + (swapVecContinuousLinearEquiv i j) ⁻¹' tsupport f := + tsupport_comp_homeomorph_eq_preimage (swapVecContinuousLinearEquiv i j).toHomeomorph + have hx' : swapVecContinuousLinearEquiv i j x ∈ tsupport f := by + rw [htsupp] at hx + exact hx + have hTx : swapVecContinuousLinearEquiv i j x ∈ U := hsub hx' + have hTx' : matVecMul (Matrix.swap ℝ i j) x ∈ U := by + simpa [swapVecContinuousLinearEquiv_apply] using hTx + simpa [U] using + (mem_openCubeSet_originCube_swap_iff (m := n) (i := i) (j := j) (x := x)).1 hTx' + +namespace H1Function + +/-- +Precompose an `H¹` witness on the open centered cube with a coordinate sign +flip, transporting the weak gradient by the same sign flip. +-/ +noncomputable def signFlipOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) (i : Fin d) : + H1Function (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let T : Vec d → Vec d := signFlipVecContinuousLinearEquiv i + have hμ : MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube i n + refine + { toFun := fun x => u (T x) + grad := fun x => signFlipVecContinuousLinearEquiv i (u.grad (T x)) + memL2 := by + show MemL2On U (u.toFun ∘ signFlipVecContinuousLinearEquiv i) + simpa [MemL2On, U, Function.comp] using u.memL2.comp_measurePreserving hμ + gradMemL2 := by + intro k + have hcomp : + MemL2On U ((fun x => u.grad x k) ∘ signFlipVecContinuousLinearEquiv i) := by + simpa [MemL2On, U, Function.comp] using + (u.gradMemL2 k).comp_measurePreserving hμ + by_cases hki : k = i + · simpa [U, T, signFlipVecContinuousLinearEquiv_apply, + matVecMul_signFlipMatrix_apply, hki] using hcomp.const_mul (-1 : ℝ) + · simpa [U, T, signFlipVecContinuousLinearEquiv_apply, + matVecMul_signFlipMatrix_apply, hki] using hcomp.const_mul (1 : ℝ) + hasWeakGradient := ?_ } + intro k φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun x => φ (T x) + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec k) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + show ContDiff ℝ (⊤ : ℕ∞) (φ ∘ signFlipVecContinuousLinearEquiv i) + simpa [ψ, T, Function.comp] using + (ContDiff.comp_continuousLinearMap + (g := (signFlipVecContinuousLinearEquiv i).toContinuousLinearMap) hφ) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ signFlipVecContinuousLinearEquiv i) + simpa [ψ, T, Function.comp] using + hφ_supp.comp_homeomorph (signFlipVecContinuousLinearEquiv i).toHomeomorph + have hψ_sub : tsupport ψ ⊆ U := by + simpa [U, ψ, T] using + tsupport_comp_signFlip_subset_openCubeSet_originCube (f := φ) i n hφ_sub + have hweak := u.hasWeakGradient k ψ hψ_smooth hψ_supp hψ_sub + have hleft : + ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec k) ∂MeasureTheory.volume = + (if k = i then (-1 : ℝ) else 1) * + ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ ψ x) (basisVec k)) = + fun x => (if k = i then (-1 : ℝ) else 1) * (u x * dφ (T x)) := by + funext x + have hx : DifferentiableAt ℝ φ (T x) := (hφ.differentiable (by simp)) (T x) + rw [show ψ = fun y => φ (signFlipVecContinuousLinearEquiv i y) by + funext y + simp [ψ, T]] + rw [fderiv_comp_signFlipVecContinuousLinearEquiv_apply_basisVec (i := i) (k := k) (x := x) hx] + simp [dφ, T] + rw [hfun, MeasureTheory.integral_const_mul] + have hchange_left : + ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume = + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => u (T y) * dφ y + show ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume = + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume + simpa only [U, T, dφ, f, signFlipVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_signFlipVecContinuousLinearEquiv_openCubeSet_originCube i n f + have hchange_right : + ∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume = + ∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => u.grad (T y) k * φ y + show ∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume = + ∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume + simpa only [U, T, f, signFlipVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_signFlipVecContinuousLinearEquiv_openCubeSet_originCube i n f + have hmain : + (if k = i then (-1 : ℝ) else 1) * + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume = + -∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by + calc + (if k = i then (-1 : ℝ) else 1) * + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume + = (if k = i then (-1 : ℝ) else 1) * + ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume := by rw [hchange_left] + _ = ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec k) ∂MeasureTheory.volume := by + symm + exact hleft + _ = -∫ x in U, u.grad x k * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume := by rfl + _ = -∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by rw [hchange_right] + by_cases hki : k = i + · simp [U, T, dφ, signFlipVecContinuousLinearEquiv_apply, + matVecMul_signFlipMatrix_apply, hki, MeasureTheory.integral_neg] at hmain ⊢ + exact hmain + · simp [U, T, dφ, signFlipVecContinuousLinearEquiv_apply, + matVecMul_signFlipMatrix_apply, hki] at hmain ⊢ + exact hmain + +/-- +Precompose an `H¹` witness on the open centered cube with a coordinate swap, +transporting the weak gradient by the same swap. +-/ +noncomputable def swapOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) (i j : Fin d) : + H1Function (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let T : Vec d → Vec d := swapVecContinuousLinearEquiv i j + have hμ : MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube i j n + refine + { toFun := fun x => u (matVecMul (Matrix.swap ℝ i j) x) + grad := fun x => matVecMul (Matrix.swap ℝ i j) (u.grad (matVecMul (Matrix.swap ℝ i j) x)) + memL2 := by + show MeasureTheory.MemLp + (fun x => u.toFun (matVecMul (Matrix.swap ℝ i j) x)) 2 + (MeasureTheory.volume.restrict U) + convert (u.memL2.comp_measurePreserving hμ) using 1 + ext x + simp [Function.comp, swapVecContinuousLinearEquiv_apply] + gradMemL2 := by + intro l + let k : Fin d := Equiv.swap i j l + show MeasureTheory.MemLp + (fun x => matVecMul (Matrix.swap ℝ i j) (u.grad (matVecMul (Matrix.swap ℝ i j) x)) l) 2 + (MeasureTheory.volume.restrict U) + convert ((u.gradMemL2 k).comp_measurePreserving hμ) using 1 + ext x + simp [k, Function.comp, swapVecContinuousLinearEquiv_apply, matVecMul_swap_eq_comp] + hasWeakGradient := ?_ } + intro l φ hφ hφ_supp hφ_sub + let T : Vec d → Vec d := swapVecContinuousLinearEquiv i j + let ψ : Vec d → ℝ := fun x => φ (T x) + let k : Fin d := Equiv.swap i j l + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec l) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + show ContDiff ℝ (⊤ : ℕ∞) (φ ∘ swapVecContinuousLinearEquiv i j) + simpa [ψ, T, Function.comp] using + (ContDiff.comp_continuousLinearMap + (g := (swapVecContinuousLinearEquiv i j).toContinuousLinearMap) hφ) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ swapVecContinuousLinearEquiv i j) + simpa [ψ, T, Function.comp] using + hφ_supp.comp_homeomorph (swapVecContinuousLinearEquiv i j).toHomeomorph + have hψ_sub : tsupport ψ ⊆ U := by + simpa [U, ψ, T] using + tsupport_comp_swap_subset_openCubeSet_originCube (f := φ) i j n hφ_sub + have hweak := u.hasWeakGradient k ψ hψ_smooth hψ_supp hψ_sub + have hleft : + ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec k) ∂MeasureTheory.volume = + ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ ψ x) (basisVec k)) = + fun x => u x * dφ (T x) := by + funext x + have hx : DifferentiableAt ℝ φ (T x) := (hφ.differentiable (by simp)) (T x) + have hderiv := + fderiv_comp_swapVecContinuousLinearEquiv_apply_basisVec + (i := i) (j := j) (k := l) (x := x) hx + simpa [ψ, T, dφ, k] using congrArg (fun r => u x * r) hderiv + rw [hfun] + have hchange_left : + ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume = + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => u (T y) * dφ y + show ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume = + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume + simpa only [U, T, dφ, f, swapVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_swapVecContinuousLinearEquiv_openCubeSet_originCube i j n f + have hchange_right : + ∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume = + ∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => u.grad (T y) k * φ y + show ∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume = + ∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume + simpa only [U, T, k, f, swapVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_swapVecContinuousLinearEquiv_openCubeSet_originCube i j n f + have hmain : + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume = + -∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by + calc + ∫ x in U, u (T x) * dφ x ∂MeasureTheory.volume + = ∫ x in U, u x * dφ (T x) ∂MeasureTheory.volume := by rw [hchange_left] + _ = ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec k) ∂MeasureTheory.volume := by + symm + exact hleft + _ = -∫ x in U, u.grad x k * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, u.grad x k * φ (T x) ∂MeasureTheory.volume := by rfl + _ = -∫ x in U, u.grad (T x) k * φ x ∂MeasureTheory.volume := by rw [hchange_right] + simpa [U, T, dφ, k, swapVecContinuousLinearEquiv_apply, matVecMul_swap_eq_comp] using hmain + +end H1Function + +namespace H10Function + +/-- +Precompose an `H¹₀` witness on the open centered cube with a coordinate sign +flip. +-/ +noncomputable def signFlipOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) (i : Fin d) : + H10Function (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let T : Vec d → Vec d := signFlipVecContinuousLinearEquiv i + have hμ : MeasureTheory.MeasurePreserving (signFlipVecContinuousLinearEquiv i) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_signFlipVecContinuousLinearEquiv_restrict_openCubeSet_originCube i n + refine + { toH1Function := u.toH1Function.signFlipOnOpenCubeSetOriginCube i + approx := fun m x => u.approx m (T x) + approx_smooth := by + intro m + show ContDiff ℝ (⊤ : ℕ∞) (u.approx m ∘ signFlipVecContinuousLinearEquiv i) + simpa [T, Function.comp] using + (ContDiff.comp_continuousLinearMap + (g := (signFlipVecContinuousLinearEquiv i).toContinuousLinearMap) + (u.approx_smooth m)) + approx_hasCompactSupport := by + intro m + show HasCompactSupport (u.approx m ∘ signFlipVecContinuousLinearEquiv i) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph + (signFlipVecContinuousLinearEquiv i).toHomeomorph + approx_support_subset := by + intro m + simpa [U, T] using + tsupport_comp_signFlip_subset_openCubeSet_originCube + (f := u.approx m) i n (u.approx_support_subset m) + tendsto_approx := by + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + u.approx m (T x) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).toFun x) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toH1Function.toFun x + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact (u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toH1Function.memL2.aestronglyMeasurable + have hfun : + (fun x => + u.approx m (T x) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).toFun x) = + g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.signFlipOnOpenCubeSetOriginCube, + signFlipVecContinuousLinearEquiv_apply] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx + tendsto_approx_grad := by + intro k + by_cases hki : k = i + · have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).grad x k) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => + -((fderiv ℝ (u.approx m) x) (basisVec k) - + u.toH1Function.grad x k)) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => + -((fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable |>.neg + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).grad x k) = + g ∘ T := by + funext x + have hx : DifferentiableAt ℝ (u.approx m) (T x) := + (u.approx_smooth m).differentiable (by simp) (T x) + rw [fderiv_comp_signFlipVecContinuousLinearEquiv_apply_basisVec + (i := i) (k := k) (x := x) hx] + simp [g, T, hki, H1Function.signFlipOnOpenCubeSetOriginCube, + signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply] + ring + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + have hEqNeg : + (fun m => + MeasureTheory.eLpNorm + (fun x => + -((fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k)) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + have hfun : + (fun x => + -((fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k)) = + (-1 : ℝ) • + (fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) := by + funext x + simp + rw [hfun, MeasureTheory.eLpNorm_const_smul] + norm_num + rw [hEqNeg] + exact u.tendsto_approx_grad k + · have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).grad x k) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.signFlipOnOpenCubeSetOriginCube i).grad x k) = + g ∘ T := by + funext x + have hx : DifferentiableAt ℝ (u.approx m) (T x) := + (u.approx_smooth m).differentiable (by simp) (T x) + rw [fderiv_comp_signFlipVecContinuousLinearEquiv_apply_basisVec + (i := i) (k := k) (x := x) hx] + simp [g, T, hki, H1Function.signFlipOnOpenCubeSetOriginCube, + signFlipVecContinuousLinearEquiv_apply, matVecMul_signFlipMatrix_apply] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx_grad k } + +@[simp] theorem signFlipOnOpenCubeSetOriginCube_toH1Function {d : ℕ} {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) (i : Fin d) : + (u.signFlipOnOpenCubeSetOriginCube i).toH1Function = + u.toH1Function.signFlipOnOpenCubeSetOriginCube i := + rfl + +/-- +Precompose an `H¹₀` witness on the open centered cube with a coordinate swap. +-/ +noncomputable def swapOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) (i j : Fin d) : + H10Function (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let T : Vec d → Vec d := swapVecContinuousLinearEquiv i j + have hμ : MeasureTheory.MeasurePreserving (swapVecContinuousLinearEquiv i j) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) + (MeasureTheory.volume.restrict (openCubeSet (originCube d n))) := by + exact measurePreserving_swapVecContinuousLinearEquiv_restrict_openCubeSet_originCube i j n + refine + { toH1Function := u.toH1Function.swapOnOpenCubeSetOriginCube i j + approx := fun m x => u.approx m (T x) + approx_smooth := by + intro m + show ContDiff ℝ (⊤ : ℕ∞) (u.approx m ∘ swapVecContinuousLinearEquiv i j) + simpa [T, Function.comp] using + (ContDiff.comp_continuousLinearMap + (g := (swapVecContinuousLinearEquiv i j).toContinuousLinearMap) + (u.approx_smooth m)) + approx_hasCompactSupport := by + intro m + show HasCompactSupport (u.approx m ∘ swapVecContinuousLinearEquiv i j) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph + (swapVecContinuousLinearEquiv i j).toHomeomorph + approx_support_subset := by + intro m + simpa [U, T] using + tsupport_comp_swap_subset_openCubeSet_originCube + (f := u.approx m) i j n (u.approx_support_subset m) + tendsto_approx := by + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + u.approx m (T x) - + (u.toH1Function.swapOnOpenCubeSetOriginCube i j).toFun x) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toH1Function.toFun x + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact (u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toH1Function.memL2.aestronglyMeasurable + have hfun : + (fun x => + u.approx m (T x) - + (u.toH1Function.swapOnOpenCubeSetOriginCube i j).toFun x) = + g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.swapOnOpenCubeSetOriginCube, + swapVecContinuousLinearEquiv_apply] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx + tendsto_approx_grad := by + intro l + let k : Fin d := Equiv.swap i j l + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec l) - + (u.toH1Function.swapOnOpenCubeSetOriginCube i j).grad x l) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => + (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec l) - + (u.toH1Function.swapOnOpenCubeSetOriginCube i j).grad x l) = + g ∘ T := by + funext x + have hx : DifferentiableAt ℝ (u.approx m) (T x) := + (u.approx_smooth m).differentiable (by simp) (T x) + rw [show basisVec l = basisVec (Equiv.swap i j k) by + simp [k]] + rw [fderiv_comp_swapVecContinuousLinearEquiv_apply_basisVec + (i := i) (j := j) (k := k) (x := x) hx] + simp [g, T, k, H1Function.swapOnOpenCubeSetOriginCube, + swapVecContinuousLinearEquiv_apply, matVecMul_swap_eq_comp] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + simpa [k] using u.tendsto_approx_grad k } + +@[simp] theorem swapOnOpenCubeSetOriginCube_toH1Function {d : ℕ} {n : ℤ} + (u : H10Function (openCubeSet (originCube d n))) (i j : Fin d) : + (u.swapOnOpenCubeSetOriginCube i j).toH1Function = + u.toH1Function.swapOnOpenCubeSetOriginCube i j := + rfl + +end H10Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Translation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Translation.lean new file mode 100644 index 0000000000..bc017ce485 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/H1/Translation.lean @@ -0,0 +1,391 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions + +/-! # Translation -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace H1Function + +/-- +Translate an `H¹(U)` witness to `H¹(U + z)` by precomposing with `x ↦ x - z`. +-/ +noncomputable def translate {d : ℕ} {U : Set (Vec d)} (u : H1Function U) (z : Vec d) : + H1Function (translateSet z U) := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + let hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + refine + { toFun := fun x => u (T x) + grad := fun x => u.grad (T x) + memL2 := by + show MemL2On V (u.toFun ∘ T) + simpa [MemL2On, V, T, Function.comp] using u.memL2.comp_measurePreserving hμ + gradMemL2 := by + intro i + show MemL2On V ((fun x => u.grad x i) ∘ T) + simpa [MemL2On, V, T, Function.comp] using (u.gradMemL2 i).comp_measurePreserving hμ + hasWeakGradient := ?_ } + intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun x => φ (x + z) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, Function.comp_def] using hφ.comp (contDiff_id.add contDiff_const) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.addRight z) + simpa [ψ, Function.comp] using hφ_supp.comp_homeomorph (Homeomorph.addRight z) + have hψ_sub : tsupport ψ ⊆ U := by + intro x hx + have hx' : x + z ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.addRight z by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.addRight z)] at hx + exact hx + have hxV : x + z ∈ V := hφ_sub hx' + simpa [V, mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] using hxV + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hmain : + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ φ (x + z)) (basisVec i)) = + fun x => u x * (fderiv ℝ ψ x) (basisVec i) := by + funext x + have hderiv : + fderiv ℝ (fun y : Vec d => φ (y + z)) x = + fderiv ℝ φ (x + z) := by + simpa using (fderiv_comp_add_right (𝕜 := ℝ) (f := φ) (x := x) z) + simp [ψ, hderiv] + calc + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec i) ∂MeasureTheory.volume := by rw [hfun] + _ = -∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := by rfl + have hchange_left : + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := by + symm + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u (x - z) * (fderiv ℝ φ x) (basisVec i))) + have hchange_right : + ∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume = + ∫ x in V, u.grad (x - z) i * φ x ∂MeasureTheory.volume := by + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u.grad (x - z) i * φ x)) + calc + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := hchange_left + _ = -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := hmain + _ = -∫ x in V, u.grad (x - z) i * φ x ∂MeasureTheory.volume := by rw [hchange_right] + +@[simp] theorem translate_toFun {d : ℕ} {U : Set (Vec d)} (u : H1Function U) (z : Vec d) + (x : Vec d) : + (u.translate z).toFun x = u.toFun (x - z) := rfl + +@[simp] theorem translate_grad {d : ℕ} {U : Set (Vec d)} (u : H1Function U) (z : Vec d) + (x : Vec d) : + (u.translate z).grad x = u.grad (x - z) := rfl + +/-- +Pull an `H¹(U + z)` witness back to `H¹(U)` by precomposing with `x ↦ x + z`. +-/ +noncomputable def untranslate {d : ℕ} {U : Set (Vec d)} + (z : Vec d) (u : H1Function (translateSet z U)) : H1Function U := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + let hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + refine + { toFun := fun x => u (T x) + grad := fun x => u.grad (T x) + memL2 := by + show MemL2On U (u.toFun ∘ T) + simpa [MemL2On, V, T, Function.comp] using u.memL2.comp_measurePreserving hμ + gradMemL2 := by + intro i + show MemL2On U ((fun x => u.grad x i) ∘ T) + simpa [MemL2On, V, T, Function.comp] using (u.gradMemL2 i).comp_measurePreserving hμ + hasWeakGradient := ?_ } + intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun x => φ (x - z) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ, Function.comp_def] using hφ.comp (contDiff_id.sub contDiff_const) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.subRight z) + simpa [ψ, Function.comp] using hφ_supp.comp_homeomorph (Homeomorph.subRight z) + have hψ_sub : tsupport ψ ⊆ V := by + intro x hx + have hx' : x - z ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.subRight z by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.subRight z)] at hx + exact hx + exact (mem_translateSet_iff_sub_mem).2 (hφ_sub hx') + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hmain : + ∫ x in V, u x * (fderiv ℝ φ (x - z)) (basisVec i) ∂MeasureTheory.volume = + -∫ x in V, u.grad x i * φ (x - z) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ φ (x - z)) (basisVec i)) = + fun x => u x * (fderiv ℝ ψ x) (basisVec i) := by + funext x + have hderiv : + fderiv ℝ (fun y : Vec d => φ (y - z)) x = + fderiv ℝ φ (x - z) := by + simpa using (fderiv_comp_sub (𝕜 := ℝ) (f := φ) (x := x) z) + simp [ψ, hderiv] + calc + ∫ x in V, u x * (fderiv ℝ φ (x - z)) (basisVec i) ∂MeasureTheory.volume + = ∫ x in V, u x * (fderiv ℝ ψ x) (basisVec i) ∂MeasureTheory.volume := by rw [hfun] + _ = -∫ x in V, u.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in V, u.grad x i * φ (x - z) ∂MeasureTheory.volume := by rfl + have hchange_left : + ∫ x in U, u (x + z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in V, u x * (fderiv ℝ φ (x - z)) (basisVec i) ∂MeasureTheory.volume := by + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u x * (fderiv ℝ φ (x - z)) (basisVec i))) + have hchange_right : + ∫ x in V, u.grad x i * φ (x - z) ∂MeasureTheory.volume = + ∫ x in U, u.grad (x + z) i * φ x ∂MeasureTheory.volume := by + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u.grad x i * φ (x - z))).symm + calc + ∫ x in U, u (x + z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in V, u x * (fderiv ℝ φ (x - z)) (basisVec i) ∂MeasureTheory.volume := + hchange_left + _ = -∫ x in V, u.grad x i * φ (x - z) ∂MeasureTheory.volume := hmain + _ = -∫ x in U, u.grad (x + z) i * φ x ∂MeasureTheory.volume := by rw [hchange_right] + +@[simp] theorem untranslate_toFun {d : ℕ} {U : Set (Vec d)} + (z : Vec d) (u : H1Function (translateSet z U)) (x : Vec d) : + (H1Function.untranslate z u).toFun x = u.toFun (x + z) := rfl + +@[simp] theorem untranslate_grad {d : ℕ} {U : Set (Vec d)} + (z : Vec d) (u : H1Function (translateSet z U)) (x : Vec d) : + (H1Function.untranslate z u).grad x = u.grad (x + z) := rfl + +end H1Function + +namespace H10Function + +/-- +Translate an `H¹₀(U)` witness to `H¹₀(U + z)` by precomposing with `x ↦ x - z`. +-/ +noncomputable def translate {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (z : Vec d) : + H10Function (translateSet z U) := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + let hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + refine + { toH1Function := u.toH1Function.translate z + approx := fun m x => u.approx m (T x) + approx_smooth := by + intro m + simpa [T, sub_eq_add_neg, Function.comp_def] using + (u.approx_smooth m).comp (contDiff_id.sub contDiff_const) + approx_hasCompactSupport := by + intro m + show HasCompactSupport (u.approx m ∘ Homeomorph.subRight z) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph (Homeomorph.subRight z) + approx_support_subset := by + intro m x hx + have hx' : x - z ∈ tsupport (u.approx m) := by + rw [show (fun y => u.approx m (T y)) = u.approx m ∘ Homeomorph.subRight z by rfl, + tsupport_comp_eq_preimage (u.approx m) (Homeomorph.subRight z)] at hx + exact hx + exact (mem_translateSet_iff_sub_mem).2 (u.approx_support_subset m hx') + tendsto_approx := by + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m (T x) - (u.toH1Function.translate z).toFun x) + 2 (MeasureTheory.volume.restrict V)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toH1Function.toFun x + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact (u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toH1Function.memL2.aestronglyMeasurable + have hfun : + (fun x => u.approx m (T x) - (u.toH1Function.translate z).toFun x) = g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.translate] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx + tendsto_approx_grad := by + intro k + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.translate z).grad x k) + 2 (MeasureTheory.volume.restrict V)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := + fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toH1Function.translate z).grad x k) = g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.translate] + have hderiv : + fderiv ℝ (fun y : Vec d => u.approx m (y - z)) x = + fderiv ℝ (u.approx m) (x - z) := by + simpa [T, sub_eq_add_neg] using + (fderiv_comp_sub (𝕜 := ℝ) (f := u.approx m) (x := x) z) + simpa [T, sub_eq_add_neg] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec k)) hderiv + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx_grad k } + +@[simp] theorem translate_toH1Function {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (z : Vec d) : + (u.translate z).toH1Function = u.toH1Function.translate z := rfl + +/-- +Pull an `H¹₀(U + z)` witness back to `H¹₀(U)` by precomposing with `x ↦ x + z`. +-/ +noncomputable def untranslate {d : ℕ} {U : Set (Vec d)} + (z : Vec d) (u : H10Function (translateSet z U)) : H10Function U := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x + z + let hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + refine + { toH1Function := H1Function.untranslate z u.toH1Function + approx := fun m x => u.approx m (T x) + approx_smooth := by + intro m + simpa [T, Function.comp_def] using + (u.approx_smooth m).comp (contDiff_id.add contDiff_const) + approx_hasCompactSupport := by + intro m + show HasCompactSupport (u.approx m ∘ Homeomorph.addRight z) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph (Homeomorph.addRight z) + approx_support_subset := by + intro m x hx + have hx' : x + z ∈ tsupport (u.approx m) := by + rw [show (fun y => u.approx m (T y)) = u.approx m ∘ Homeomorph.addRight z by rfl, + tsupport_comp_eq_preimage (u.approx m) (Homeomorph.addRight z)] at hx + exact hx + have hxV : x + z ∈ V := u.approx_support_subset m hx' + simpa [V, mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] using hxV + tendsto_approx := by + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m (T x) - (H1Function.untranslate z u.toH1Function).toFun x) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toH1Function.toFun x) + 2 (MeasureTheory.volume.restrict V)) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toH1Function.toFun x + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict V) := by + exact (u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toH1Function.memL2.aestronglyMeasurable + have hfun : + (fun x => u.approx m (T x) - + (H1Function.untranslate z u.toH1Function).toFun x) = g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.untranslate] + rw [hfun] + simpa [g, T, Function.comp, V] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx + tendsto_approx_grad := by + intro k + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (H1Function.untranslate z u.toH1Function).grad x k) + 2 (MeasureTheory.volume.restrict U)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k) + 2 (MeasureTheory.volume.restrict V)) := by + funext m + let g : Vec d → ℝ := + fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toH1Function.grad x k + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict V) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toH1Function.gradMemL2 k).aestronglyMeasurable + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (H1Function.untranslate z u.toH1Function).grad x k) = g ∘ T := by + funext x + simp [g, T, Function.comp, H1Function.untranslate] + have hderiv : + fderiv ℝ (fun y : Vec d => u.approx m (y + z)) x = + fderiv ℝ (u.approx m) (x + z) := by + simpa [T] using + (fderiv_comp_add_right (𝕜 := ℝ) (f := u.approx m) (x := x) z) + simpa [T] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec k)) hderiv + rw [hfun] + simpa [g, T, Function.comp, V] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := (2 : ENNReal)) hg hμ) + rw [hEq] + exact u.tendsto_approx_grad k } + +@[simp] theorem untranslate_toH1Function {d : ℕ} {U : Set (Vec d)} + (z : Vec d) (u : H10Function (translateSet z U)) : + (H10Function.untranslate z u).toH1Function = + H1Function.untranslate z u.toH1Function := rfl + +end H10Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/L2Ambient.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/L2Ambient.lean new file mode 100644 index 0000000000..7089711432 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/L2Ambient.lean @@ -0,0 +1,696 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import LeanPool.CoarseGraining.Homogenization.Ambient.HilbertFinite +public import Mathlib.Analysis.InnerProductSpace.Dual +public import Mathlib.MeasureTheory.Function.L2Space +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Function.LpSpace.Basic +public import Mathlib.MeasureTheory.Function.LpSpace.Indicator +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # L2Ambient -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file introduces the actual `L²` ambient types used later to package the +potential and solenoidal spaces as subspaces of a Hilbert space. + +The current Sobolev layer still uses predicate-level `MemLp` witnesses in many +places. This file provides the first typed `Lp` layer on bounded domains so the +closed-subspace and minimization arguments can be formulated cleanly. +-/ + +/-- The restricted Lebesgue measure on a domain `U ⊆ \R^d`. -/ +noncomputable abbrev volumeMeasureOn {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.volume.restrict U + +/-- Scalar-valued `L²(U)` with respect to restricted Lebesgue measure. -/ +noncomputable abbrev ScalarL2 {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.Lp ℝ 2 (volumeMeasureOn U) + +/-- Vector-valued `L²(U; \R^d)`. -/ +noncomputable abbrev VectorL2 {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.Lp (Vec d) 2 (volumeMeasureOn U) + +/-- Block-valued `L²(U; \R^{2d})`. -/ +noncomputable abbrev BlockL2 {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.Lp (BlockVec d) 2 (volumeMeasureOn U) + +/-- Hilbert-valued `L²(U; \R^d)` built from the custom Euclidean carrier +`HilbertVec d`. This is the intended ambient space for Hilbert-space arguments. -/ +noncomputable abbrev HilbertVectorL2 {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.Lp (HilbertVec d) 2 (volumeMeasureOn U) + +/-- Hilbert-valued `L²(U; \R^{2d})` built from the custom Euclidean carrier +`HilbertBlockVec d`. This is the intended ambient space for the doubled +`\mu`-problem. -/ +noncomputable abbrev HilbertBlockL2 {d : ℕ} (U : Set (Vec d)) := + MeasureTheory.Lp (HilbertBlockVec d) 2 (volumeMeasureOn U) + +noncomputable instance instMeasurableSpaceHilbertVectorL2 {d : ℕ} {U : Set (Vec d)} : + MeasurableSpace (HilbertVectorL2 U) := + borel _ + +noncomputable instance instBorelSpaceHilbertVectorL2 {d : ℕ} {U : Set (Vec d)} : + BorelSpace (HilbertVectorL2 U) := + ⟨rfl⟩ + +/-- Predicate-level scalar `L²` membership on `U`. -/ +noncomputable abbrev MemScalarL2 {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) : Prop := + MeasureTheory.MemLp u 2 (volumeMeasureOn U) + +/-- Predicate-level vector `L²` membership on `U`. -/ +noncomputable abbrev MemVectorL2 {d : ℕ} (U : Set (Vec d)) (f : Vec d → Vec d) : Prop := + MeasureTheory.MemLp f 2 (volumeMeasureOn U) + +/-- Predicate-level block `L²` membership on `U`. -/ +noncomputable abbrev MemBlockL2 {d : ℕ} (U : Set (Vec d)) (F : Vec d → BlockVec d) : Prop := + MeasureTheory.MemLp F 2 (volumeMeasureOn U) + +/-- Predicate-level Hilbert-vector `L²` membership on `U`. -/ +noncomputable abbrev MemHilbertVectorL2 {d : ℕ} (U : Set (Vec d)) + (f : Vec d → HilbertVec d) : Prop := + MeasureTheory.MemLp f 2 (volumeMeasureOn U) + +/-- Predicate-level Hilbert-block `L²` membership on `U`. -/ +noncomputable abbrev MemHilbertBlockL2 {d : ℕ} (U : Set (Vec d)) + (F : Vec d → HilbertBlockVec d) : Prop := + MeasureTheory.MemLp F 2 (volumeMeasureOn U) + +/-- Reinterpret a plain vector field as a field valued in the Euclidean Hilbert +carrier. -/ +def hilbertifyVecField {d : ℕ} (f : Vec d → Vec d) : Vec d → HilbertVec d := + fun x => HilbertVec.ofVec (f x) + +/-- Reinterpret a plain doubled field as a field valued in the Euclidean +Hilbert carrier. -/ +def hilbertifyBlockField {d : ℕ} (F : Vec d → BlockVec d) : Vec d → HilbertBlockVec d := + fun x => HilbertBlockVec.ofBlockVec (F x) + +/-- Promote a scalar `MemLp` witness to the ambient `ScalarL2` type. -/ +noncomputable def toScalarL2 {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hu : MemScalarL2 U u) : ScalarL2 U := + hu.toLp u + +/-- Promote a vector `MemLp` witness to the ambient `VectorL2` type. -/ +noncomputable def toVectorL2 {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : VectorL2 U := + hf.toLp f + +/-- Promote a block `MemLp` witness to the ambient `BlockL2` type. -/ +noncomputable def toBlockL2 {d : ℕ} {U : Set (Vec d)} {F : Vec d → BlockVec d} + (hF : MemBlockL2 U F) : BlockL2 U := + hF.toLp F + +/-- Extract `L²` control of the first block component from block `L²` control. -/ +theorem memVectorL2_fst_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) : + MemVectorL2 U (fun x => (F x).1) := + (ContinuousLinearMap.fst ℝ (Vec d) (Vec d)).comp_memLp' hF + +/-- Extract `L²` control of the second block component from block `L²` control. -/ +theorem memVectorL2_snd_of_memBlockL2 {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) : + MemVectorL2 U (fun x => (F x).2) := + (ContinuousLinearMap.snd ℝ (Vec d) (Vec d)).comp_memLp' hF + +/-- Reinterpret a plain block `L²` witness as a Hilbert-block `L²` witness. -/ +theorem memHilbertBlockL2_hilbertifyBlockField {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) : + MemHilbertBlockL2 U (hilbertifyBlockField F) := + let T : BlockVec d →L[ℝ] HilbertBlockVec d := + ((HilbertBlockVec.continuousLinearEquivBlockVec d).symm).toContinuousLinearMap + T.comp_memLp' hF + +/-- Reinterpret a plain vector `L²` witness as a Hilbert-vector `L²` witness. -/ +theorem memHilbertVectorL2_hilbertifyVecField {d : ℕ} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MemHilbertVectorL2 U (hilbertifyVecField f) := + let T : Vec d →L[ℝ] HilbertVec d := + ((HilbertVec.continuousLinearEquivVec d).symm).toContinuousLinearMap + T.comp_memLp' hf + +/-- Promote a Hilbert-vector `MemLp` witness to the ambient `HilbertVectorL2` +type. -/ +noncomputable def toHilbertVectorL2 {d : ℕ} {U : Set (Vec d)} {f : Vec d → HilbertVec d} + (hf : MemHilbertVectorL2 U f) : HilbertVectorL2 U := + hf.toLp f + +/-- Promote a plain vector `MemLp` witness directly to the Hilbert-vector +ambient type. -/ +noncomputable def toHilbertVectorL2OfVecField {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : HilbertVectorL2 U := + toHilbertVectorL2 (memHilbertVectorL2_hilbertifyVecField hf) + +/-- Promote a Hilbert-block `MemLp` witness to the ambient `HilbertBlockL2` +type. -/ +noncomputable def toHilbertBlockL2 {d : ℕ} {U : Set (Vec d)} {F : Vec d → HilbertBlockVec d} + (hF : MemHilbertBlockL2 U F) : HilbertBlockL2 U := + hF.toLp F + +/-- Promote a plain block `MemLp` witness directly to the Hilbert-block ambient +type. -/ +noncomputable def toHilbertBlockL2OfBlockField {d : ℕ} {U : Set (Vec d)} + {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) : HilbertBlockL2 U := + toHilbertBlockL2 (memHilbertBlockL2_hilbertifyBlockField hF) + +theorem coeFn_toScalarL2 {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hu : MemScalarL2 U u) : + toScalarL2 hu =ᵐ[volumeMeasureOn U] u := by + exact MeasureTheory.MemLp.coeFn_toLp hu + +theorem coeFn_toVectorL2 {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + toVectorL2 hf =ᵐ[volumeMeasureOn U] f := by + exact MeasureTheory.MemLp.coeFn_toLp hf + +theorem coeFn_toBlockL2 {d : ℕ} {U : Set (Vec d)} {F : Vec d → BlockVec d} + (hF : MemBlockL2 U F) : + toBlockL2 hF =ᵐ[volumeMeasureOn U] F := by + exact MeasureTheory.MemLp.coeFn_toLp hF + +theorem coeFn_toHilbertVectorL2 {d : ℕ} {U : Set (Vec d)} {f : Vec d → HilbertVec d} + (hf : MemHilbertVectorL2 U f) : + toHilbertVectorL2 hf =ᵐ[volumeMeasureOn U] f := by + exact MeasureTheory.MemLp.coeFn_toLp hf + +theorem coeFn_toHilbertVectorL2OfVecField {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + toHilbertVectorL2OfVecField hf =ᵐ[volumeMeasureOn U] hilbertifyVecField f := by + exact coeFn_toHilbertVectorL2 (memHilbertVectorL2_hilbertifyVecField hf) + +theorem coeFn_toHilbertBlockL2 {d : ℕ} {U : Set (Vec d)} {F : Vec d → HilbertBlockVec d} + (hF : MemHilbertBlockL2 U F) : + toHilbertBlockL2 hF =ᵐ[volumeMeasureOn U] F := by + exact MeasureTheory.MemLp.coeFn_toLp hF + +theorem coeFn_toHilbertBlockL2OfBlockField {d : ℕ} {U : Set (Vec d)} {F : Vec d → BlockVec d} + (hF : MemBlockL2 U F) : + toHilbertBlockL2OfBlockField hF =ᵐ[volumeMeasureOn U] hilbertifyBlockField F := by + exact coeFn_toHilbertBlockL2 (memHilbertBlockL2_hilbertifyBlockField hF) + +theorem toScalarL2_eq_toScalarL2_iff {d : ℕ} {U : Set (Vec d)} {u v : Vec d → ℝ} + (hu : MemScalarL2 U u) (hv : MemScalarL2 U v) : + toScalarL2 hu = toScalarL2 hv ↔ u =ᵐ[volumeMeasureOn U] v := by + exact MeasureTheory.MemLp.toLp_eq_toLp_iff hu hv + +theorem toVectorL2_eq_toVectorL2_iff {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toVectorL2 hf = toVectorL2 hg ↔ f =ᵐ[volumeMeasureOn U] g := by + exact MeasureTheory.MemLp.toLp_eq_toLp_iff hf hg + +theorem toBlockL2_eq_toBlockL2_iff {d : ℕ} {U : Set (Vec d)} {F G : Vec d → BlockVec d} + (hF : MemBlockL2 U F) (hG : MemBlockL2 U G) : + toBlockL2 hF = toBlockL2 hG ↔ F =ᵐ[volumeMeasureOn U] G := by + exact MeasureTheory.MemLp.toLp_eq_toLp_iff hF hG + +theorem toHilbertVectorL2_eq_toHilbertVectorL2_iff {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → HilbertVec d} (hf : MemHilbertVectorL2 U f) (hg : MemHilbertVectorL2 U g) : + toHilbertVectorL2 hf = toHilbertVectorL2 hg ↔ f =ᵐ[volumeMeasureOn U] g := by + exact MeasureTheory.MemLp.toLp_eq_toLp_iff hf hg + +theorem toHilbertBlockL2_eq_toHilbertBlockL2_iff {d : ℕ} {U : Set (Vec d)} + {F G : Vec d → HilbertBlockVec d} (hF : MemHilbertBlockL2 U F) + (hG : MemHilbertBlockL2 U G) : + toHilbertBlockL2 hF = toHilbertBlockL2 hG ↔ F =ᵐ[volumeMeasureOn U] G := by + exact MeasureTheory.MemLp.toLp_eq_toLp_iff hF hG + +section CarrierTransport + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Continuous linear integration over a measurable subset, acting on scalar +`L²(U)` classes. -/ +noncomputable def scalarL2SetIntegralCLM [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (S : Set (Vec d)) (hS : MeasurableSet S) : ScalarL2 U →L[ℝ] ℝ := + InnerProductSpace.toDual ℝ (ScalarL2 U) + (MeasureTheory.indicatorConstLp (μ := volumeMeasureOn U) (p := (2 : ENNReal)) + hS (MeasureTheory.measure_ne_top (volumeMeasureOn U) S) (1 : ℝ)) + +/-- Continuous linear coordinate integration over a measurable subset, acting +on Hilbert-vector `L²(U)` classes. -/ +noncomputable def hilbertVectorL2CoordSetIntegralCLM + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (S : Set (Vec d)) (hS : MeasurableSet S) (i : Fin d) : + HilbertVectorL2 U →L[ℝ] ℝ := + (scalarL2SetIntegralCLM (U := U) S hS).comp + ((PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) i).compLpL 2 + (volumeMeasureOn U)) + +@[simp] theorem scalarL2SetIntegralCLM_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (S : Set (Vec d)) (hS : MeasurableSet S) (f : ScalarL2 U) : + scalarL2SetIntegralCLM (U := U) S hS f = + ∫ x in S, f x ∂volumeMeasureOn U := by + rw [scalarL2SetIntegralCLM, InnerProductSpace.toDual_apply_apply] + exact MeasureTheory.L2.inner_indicatorConstLp_one + (𝕜 := ℝ) hS (MeasureTheory.measure_ne_top (volumeMeasureOn U) S) f + +@[simp] theorem hilbertVectorL2CoordSetIntegralCLM_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (S : Set (Vec d)) (hS : MeasurableSet S) (i : Fin d) + (f : HilbertVectorL2 U) : + hilbertVectorL2CoordSetIntegralCLM (U := U) S hS i f = + ∫ x in S, f x i ∂volumeMeasureOn U := by + rw [hilbertVectorL2CoordSetIntegralCLM] + have hproj : + ((PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) i).compLpL 2 + (volumeMeasureOn U) f) + =ᵐ[volumeMeasureOn U] fun x => f x i := + ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) i) + (f := f) + calc + scalarL2SetIntegralCLM (U := U) S hS + (((PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) i).compLpL 2 + (volumeMeasureOn U)) f) + = ∫ x in S, + ((PiLp.proj (𝕜 := ℝ) 2 (fun _ : Fin d => ℝ) i).compLpL 2 + (volumeMeasureOn U) f) x ∂volumeMeasureOn U := by + rw [scalarL2SetIntegralCLM_apply] + _ = ∫ x in S, f x i ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + exact hproj.filter_mono + (MeasureTheory.ae_mono (MeasureTheory.Measure.restrict_le_self)) + +/-- Transport plain vector `L²` fields into the Hilbert-vector carrier by +applying `Vec -> HilbertVec` pointwise. -/ +noncomputable def vectorL2ToHilbertVectorL2 : VectorL2 U →L[ℝ] HilbertVectorL2 U := + (HilbertVec.ofVecL d).compLpL 2 (volumeMeasureOn U) + +/-- Transport Hilbert-vector `L²` fields back to the plain vector carrier by +applying `HilbertVec -> Vec` pointwise. -/ +noncomputable def hilbertVectorL2ToVectorL2 : HilbertVectorL2 U →L[ℝ] VectorL2 U := + ((HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap).compLpL 2 + (volumeMeasureOn U) + +theorem coeFn_vectorL2ToHilbertVectorL2 (f : VectorL2 U) : + vectorL2ToHilbertVectorL2 (U := U) f =ᵐ[volumeMeasureOn U] + fun x => HilbertVec.ofVec (f x) := by + simpa [vectorL2ToHilbertVectorL2] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := HilbertVec.ofVecL d) + (f := f)) + +theorem coeFn_hilbertVectorL2ToVectorL2 (f : HilbertVectorL2 U) : + hilbertVectorL2ToVectorL2 (U := U) f =ᵐ[volumeMeasureOn U] + fun x => (f x).toVec := by + simpa [hilbertVectorL2ToVectorL2] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap) + (f := f)) + +theorem vectorL2ToHilbertVectorL2_toVectorL2 {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + vectorL2ToHilbertVectorL2 (U := U) (toVectorL2 hf) = toHilbertVectorL2OfVecField hf := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_vectorL2ToHilbertVectorL2 (U := U) (f := toVectorL2 hf), + coeFn_toVectorL2 hf, + coeFn_toHilbertVectorL2OfVecField (U := U) (f := f) hf] + with x htransport hvec hhilbert + rw [htransport, hvec, hhilbert] + simp [hilbertifyVecField] + +theorem hilbertVectorL2ToVectorL2_toHilbertVectorL2 {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + hilbertVectorL2ToVectorL2 (U := U) (toHilbertVectorL2OfVecField hf) = toVectorL2 hf := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := toHilbertVectorL2OfVecField hf), + coeFn_toHilbertVectorL2OfVecField (U := U) (f := f) hf, + coeFn_toVectorL2 hf] + with x htransport hhilbert hvec + rw [htransport, hhilbert, hvec] + simp [hilbertifyVecField] + +theorem toHilbertVectorL2OfVecField_sub {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toHilbertVectorL2OfVecField (hf.sub hg) = + toHilbertVectorL2OfVecField hf - toHilbertVectorL2OfVecField hg := by + let hfH : MemHilbertVectorL2 U (hilbertifyVecField f) := + memHilbertVectorL2_hilbertifyVecField hf + let hgH : MemHilbertVectorL2 U (hilbertifyVecField g) := + memHilbertVectorL2_hilbertifyVecField hg + exact MeasureTheory.MemLp.toLp_sub hfH hgH + +theorem toHilbertVectorL2OfVecField_add {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toHilbertVectorL2OfVecField (hf.add hg) = + toHilbertVectorL2OfVecField hf + toHilbertVectorL2OfVecField hg := by + let hfH : MemHilbertVectorL2 U (hilbertifyVecField f) := + memHilbertVectorL2_hilbertifyVecField hf + let hgH : MemHilbertVectorL2 U (hilbertifyVecField g) := + memHilbertVectorL2_hilbertifyVecField hg + exact MeasureTheory.MemLp.toLp_add hfH hgH + +theorem hilbertVectorL2ToVectorL2_vectorL2ToHilbertVectorL2 (f : VectorL2 U) : + hilbertVectorL2ToVectorL2 (U := U) (vectorL2ToHilbertVectorL2 (U := U) f) = f := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_hilbertVectorL2ToVectorL2 (U := U) + (f := vectorL2ToHilbertVectorL2 (U := U) f), + coeFn_vectorL2ToHilbertVectorL2 (U := U) (f := f)] + with x hback hforward + rw [hback, hforward] + +theorem vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (f : HilbertVectorL2 U) : + vectorL2ToHilbertVectorL2 (U := U) (hilbertVectorL2ToVectorL2 (U := U) f) = f := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_vectorL2ToHilbertVectorL2 (U := U) + (f := hilbertVectorL2ToVectorL2 (U := U) f), + coeFn_hilbertVectorL2ToVectorL2 (U := U) (f := f)] + with x hforward hback + rw [hforward, hback] + +/-- Continuous linear identification between the plain vector carrier +`VectorL2 U` and the Hilbert-vector carrier `HilbertVectorL2 U`. -/ +noncomputable def continuousLinearEquivVectorL2 : VectorL2 U ≃L[ℝ] HilbertVectorL2 U where + toLinearEquiv := + { toFun := vectorL2ToHilbertVectorL2 (U := U) + invFun := hilbertVectorL2ToVectorL2 (U := U) + left_inv := hilbertVectorL2ToVectorL2_vectorL2ToHilbertVectorL2 (U := U) + right_inv := vectorL2ToHilbertVectorL2_hilbertVectorL2ToVectorL2 (U := U) + map_add' := (vectorL2ToHilbertVectorL2 (U := U)).map_add + map_smul' := (vectorL2ToHilbertVectorL2 (U := U)).map_smul } + continuous_toFun := (vectorL2ToHilbertVectorL2 (U := U)).continuous + continuous_invFun := (hilbertVectorL2ToVectorL2 (U := U)).continuous + +@[simp] theorem continuousLinearEquivVectorL2_apply (f : VectorL2 U) : + continuousLinearEquivVectorL2 (U := U) f = vectorL2ToHilbertVectorL2 (U := U) f := + rfl + +@[simp] theorem continuousLinearEquivVectorL2_symm_apply (f : HilbertVectorL2 U) : + (continuousLinearEquivVectorL2 (U := U)).symm f = hilbertVectorL2ToVectorL2 (U := U) f := + rfl + +theorem norm_hilbertVectorL2ToVectorL2_le : + ‖hilbertVectorL2ToVectorL2 (d := d) (U := U)‖ ≤ 1 := by + calc + ‖hilbertVectorL2ToVectorL2 (d := d) (U := U)‖ + ≤ ‖(HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap‖ := by + simpa [hilbertVectorL2ToVectorL2] using + (ContinuousLinearMap.norm_compLpL_le + (p := 2) + (μ := volumeMeasureOn U) + (L := (HilbertVec.continuousLinearEquivVec d).toContinuousLinearMap)) + _ ≤ 1 := HilbertVec.norm_continuousLinearEquivVec_le d + +theorem norm_toVectorL2_le_toHilbertVectorL2 {f : Vec d → HilbertVec d} + (hf : MemHilbertVectorL2 U f) : + ‖hilbertVectorL2ToVectorL2 (U := U) (toHilbertVectorL2 hf)‖ ≤ ‖toHilbertVectorL2 hf‖ := by + calc + ‖hilbertVectorL2ToVectorL2 (U := U) (toHilbertVectorL2 hf)‖ + ≤ ‖hilbertVectorL2ToVectorL2 (d := d) (U := U)‖ * ‖toHilbertVectorL2 hf‖ := by + exact (hilbertVectorL2ToVectorL2 (d := d) (U := U)).le_opNorm (toHilbertVectorL2 hf) + _ ≤ 1 * ‖toHilbertVectorL2 hf‖ := by + gcongr + exact norm_hilbertVectorL2ToVectorL2_le (d := d) (U := U) + _ = ‖toHilbertVectorL2 hf‖ := by ring + +theorem norm_toVectorL2_le_toHilbertVectorL2OfVecField {f : Vec d → Vec d} + (hf : MemVectorL2 U f) : + ‖toVectorL2 hf‖ ≤ ‖toHilbertVectorL2OfVecField hf‖ := by + calc + ‖toVectorL2 hf‖ + = ‖hilbertVectorL2ToVectorL2 (U := U) (toHilbertVectorL2OfVecField hf)‖ := by + rw [hilbertVectorL2ToVectorL2_toHilbertVectorL2 (U := U) (f := f) hf] + _ ≤ ‖toHilbertVectorL2OfVecField hf‖ := by + exact norm_toVectorL2_le_toHilbertVectorL2 (d := d) (U := U) + (memHilbertVectorL2_hilbertifyVecField hf) + +theorem norm_vectorL2ToHilbertVectorL2_le : + ‖vectorL2ToHilbertVectorL2 (d := d) (U := U)‖ ≤ (d : ℝ) := by + calc + ‖vectorL2ToHilbertVectorL2 (d := d) (U := U)‖ ≤ ‖HilbertVec.ofVecL d‖ := by + simpa [vectorL2ToHilbertVectorL2] using + (ContinuousLinearMap.norm_compLpL_le + (p := 2) + (μ := volumeMeasureOn U) + (L := HilbertVec.ofVecL d)) + _ ≤ (d : ℝ) := HilbertVec.norm_ofVecL_le d + +theorem norm_toHilbertVectorL2OfVecField_le {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + ‖toHilbertVectorL2OfVecField hf‖ ≤ (d : ℝ) * ‖toVectorL2 hf‖ := by + calc + ‖toHilbertVectorL2OfVecField hf‖ + = ‖vectorL2ToHilbertVectorL2 (U := U) (toVectorL2 hf)‖ := by + rw [vectorL2ToHilbertVectorL2_toVectorL2 (U := U) (f := f) hf] + _ ≤ ‖vectorL2ToHilbertVectorL2 (d := d) (U := U)‖ * ‖toVectorL2 hf‖ := by + exact (vectorL2ToHilbertVectorL2 (d := d) (U := U)).le_opNorm (toVectorL2 hf) + _ ≤ (d : ℝ) * ‖toVectorL2 hf‖ := by + gcongr + exact norm_vectorL2ToHilbertVectorL2_le (d := d) (U := U) + +theorem inner_toHilbertVectorL2OfVecField_eq_integral {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + inner ℝ (toHilbertVectorL2OfVecField hf) (toHilbertVectorL2OfVecField hg) = + ∫ x in U, vecDot (f x) (g x) ∂MeasureTheory.volume := by + rw [MeasureTheory.L2.inner_def] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards + [coeFn_toHilbertVectorL2OfVecField (U := U) (f := f) hf, + coeFn_toHilbertVectorL2OfVecField (U := U) (f := g) hg] + with x hf' hg' + rw [hf', hg'] + simp [hilbertifyVecField, HilbertVec.inner_def] + +/-- Transport plain block `L²` fields into the Hilbert-block carrier by applying +`BlockVec -> HilbertBlockVec` pointwise. -/ +noncomputable def blockL2ToHilbertBlockL2 : BlockL2 U →L[ℝ] HilbertBlockL2 U := + (((HilbertBlockVec.continuousLinearEquivBlockVec d).symm).toContinuousLinearMap).compLpL 2 + (volumeMeasureOn U) + +/-- Transport Hilbert-block `L²` fields back to the plain block carrier by +applying `HilbertBlockVec -> BlockVec` pointwise. -/ +noncomputable def hilbertBlockL2ToBlockL2 : HilbertBlockL2 U →L[ℝ] BlockL2 U := + ((HilbertBlockVec.continuousLinearEquivBlockVec d).toContinuousLinearMap).compLpL 2 + (volumeMeasureOn U) + +theorem coeFn_blockL2ToHilbertBlockL2 (F : BlockL2 U) : + blockL2ToHilbertBlockL2 (U := U) F =ᵐ[volumeMeasureOn U] + fun x => HilbertBlockVec.ofBlockVec (F x) := by + simpa [blockL2ToHilbertBlockL2] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := ((HilbertBlockVec.continuousLinearEquivBlockVec d).symm).toContinuousLinearMap) + (f := F)) + +theorem coeFn_hilbertBlockL2ToBlockL2 (F : HilbertBlockL2 U) : + hilbertBlockL2ToBlockL2 (U := U) F =ᵐ[volumeMeasureOn U] + fun x => (F x).toBlockVec := by + simpa [hilbertBlockL2ToBlockL2] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := (HilbertBlockVec.continuousLinearEquivBlockVec d).toContinuousLinearMap) + (f := F)) + +theorem blockL2ToHilbertBlockL2_toBlockL2 {F : Vec d → BlockVec d} (hF : MemBlockL2 U F) : + blockL2ToHilbertBlockL2 (U := U) (toBlockL2 hF) = toHilbertBlockL2OfBlockField hF := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_blockL2ToHilbertBlockL2 (U := U) (F := toBlockL2 hF), + coeFn_toBlockL2 hF, + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := F) hF] + with x htransport hblock hhilbert + rw [htransport, hblock, hhilbert] + simp [hilbertifyBlockField] + +theorem hilbertBlockL2ToBlockL2_toHilbertBlockL2OfBlockField {F : Vec d → BlockVec d} + (hF : MemBlockL2 U F) : + hilbertBlockL2ToBlockL2 (U := U) (toHilbertBlockL2OfBlockField hF) = toBlockL2 hF := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_hilbertBlockL2ToBlockL2 (U := U) (F := toHilbertBlockL2OfBlockField hF), + coeFn_toHilbertBlockL2OfBlockField (U := U) (F := F) hF, + coeFn_toBlockL2 hF] + with x htransport hhilbert hblock + rw [htransport, hhilbert, hblock] + simp [hilbertifyBlockField] + +theorem hilbertBlockL2ToBlockL2_blockL2ToHilbertBlockL2 (F : BlockL2 U) : + hilbertBlockL2ToBlockL2 (U := U) (blockL2ToHilbertBlockL2 (U := U) F) = F := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_hilbertBlockL2ToBlockL2 (U := U) + (F := blockL2ToHilbertBlockL2 (U := U) F), + coeFn_blockL2ToHilbertBlockL2 (U := U) (F := F)] + with x hback hforward + rw [hback, hforward] + simp + +theorem blockL2ToHilbertBlockL2_hilbertBlockL2ToBlockL2 (F : HilbertBlockL2 U) : + blockL2ToHilbertBlockL2 (U := U) (hilbertBlockL2ToBlockL2 (U := U) F) = F := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_blockL2ToHilbertBlockL2 (U := U) + (F := hilbertBlockL2ToBlockL2 (U := U) F), + coeFn_hilbertBlockL2ToBlockL2 (U := U) (F := F)] + with x hforward hback + rw [hforward, hback] + simp + +/-- Continuous linear identification between the plain block carrier `BlockL2 U` +and the Hilbert-block carrier `HilbertBlockL2 U`. -/ +noncomputable def continuousLinearEquivBlockL2 : BlockL2 U ≃L[ℝ] HilbertBlockL2 U where + toLinearEquiv := + { toFun := blockL2ToHilbertBlockL2 (U := U) + invFun := hilbertBlockL2ToBlockL2 (U := U) + left_inv := hilbertBlockL2ToBlockL2_blockL2ToHilbertBlockL2 (U := U) + right_inv := blockL2ToHilbertBlockL2_hilbertBlockL2ToBlockL2 (U := U) + map_add' := (blockL2ToHilbertBlockL2 (U := U)).map_add + map_smul' := (blockL2ToHilbertBlockL2 (U := U)).map_smul } + continuous_toFun := (blockL2ToHilbertBlockL2 (U := U)).continuous + continuous_invFun := (hilbertBlockL2ToBlockL2 (U := U)).continuous + +@[simp] theorem continuousLinearEquivBlockL2_apply (F : BlockL2 U) : + continuousLinearEquivBlockL2 (U := U) F = blockL2ToHilbertBlockL2 (U := U) F := + rfl + +@[simp] theorem continuousLinearEquivBlockL2_symm_apply (F : HilbertBlockL2 U) : + (continuousLinearEquivBlockL2 (U := U)).symm F = hilbertBlockL2ToBlockL2 (U := U) F := + rfl + +/-- Continuous linear projection from a Hilbert block `L²` field to its +potential component. -/ +noncomputable def hilbertBlockVecPotentialCLM {d : ℕ} : + HilbertBlockVec d →L[ℝ] HilbertVec d where + toLinearMap := + PiLp.projₗ (2 : ENNReal) (𝕜 := ℝ) (β := fun _ : Fin 2 => HilbertVec d) 0 + cont := + PiLp.continuous_apply (p := (2 : ENNReal)) + (β := fun _ : Fin 2 => HilbertVec d) (0 : Fin 2) + +/-- Continuous linear projection from a Hilbert block vector to its flux +component. -/ +noncomputable def hilbertBlockVecFluxCLM {d : ℕ} : + HilbertBlockVec d →L[ℝ] HilbertVec d where + toLinearMap := + PiLp.projₗ (2 : ENNReal) (𝕜 := ℝ) (β := fun _ : Fin 2 => HilbertVec d) 1 + cont := + PiLp.continuous_apply (p := (2 : ENNReal)) + (β := fun _ : Fin 2 => HilbertVec d) (1 : Fin 2) + +@[simp] theorem hilbertBlockVecPotentialCLM_apply {d : ℕ} (X : HilbertBlockVec d) : + hilbertBlockVecPotentialCLM X = X.potential := + rfl + +@[simp] theorem hilbertBlockVecFluxCLM_apply {d : ℕ} (X : HilbertBlockVec d) : + hilbertBlockVecFluxCLM X = X.flux := + rfl + +/-- Continuous linear projection from a Hilbert block `L²` field to its +potential component. -/ +noncomputable def hilbertBlockL2PotentialCLM : HilbertBlockL2 U →L[ℝ] HilbertVectorL2 U := + (hilbertBlockVecPotentialCLM (d := d)).compLpL 2 (volumeMeasureOn U) + +/-- Continuous linear projection from a Hilbert block `L²` field to its flux +component. -/ +noncomputable def hilbertBlockL2FluxCLM : HilbertBlockL2 U →L[ℝ] HilbertVectorL2 U := + (hilbertBlockVecFluxCLM (d := d)).compLpL 2 (volumeMeasureOn U) + +theorem coeFn_hilbertBlockL2PotentialCLM (F : HilbertBlockL2 U) : + hilbertBlockL2PotentialCLM (U := U) F =ᵐ[volumeMeasureOn U] + fun x => (F x).potential := by + simpa [hilbertBlockL2PotentialCLM, HilbertBlockVec.potential] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := hilbertBlockVecPotentialCLM (d := d)) + (f := F)) + +theorem coeFn_hilbertBlockL2FluxCLM (F : HilbertBlockL2 U) : + hilbertBlockL2FluxCLM (U := U) F =ᵐ[volumeMeasureOn U] + fun x => (F x).flux := by + simpa [hilbertBlockL2FluxCLM, HilbertBlockVec.flux] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := hilbertBlockVecFluxCLM (d := d)) + (f := F)) + +end CarrierTransport + +section ConstantFields + +variable {d : ℕ} {U : Set (Vec d)} +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +/-- Constant Hilbert block fields as elements of the ambient space +`L²(U; \R^{2d})`. -/ +noncomputable def hilbertBlockL2Const : HilbertBlockVec d →L[ℝ] HilbertBlockL2 U := + MeasureTheory.Lp.constL 2 (volumeMeasureOn U) ℝ + +theorem coeFn_hilbertBlockL2Const (X : HilbertBlockVec d) : + hilbertBlockL2Const (U := U) X =ᵐ[volumeMeasureOn U] Function.const _ X := by + simpa [hilbertBlockL2Const] using + (MeasureTheory.Lp.coeFn_const (p := 2) (μ := volumeMeasureOn U) (c := X)) + +/-- Constant algebraic block vectors embedded into the Hilbert-valued ambient +space `L²(U; \R^{2d})`. -/ +noncomputable def blockVecToHilbertBlockL2Const : BlockVec d →L[ℝ] HilbertBlockL2 U := + (hilbertBlockL2Const (U := U)).comp + (((HilbertBlockVec.continuousLinearEquivBlockVec d).symm).toContinuousLinearMap) + +theorem coeFn_blockVecToHilbertBlockL2Const (P : BlockVec d) : + blockVecToHilbertBlockL2Const (U := U) P =ᵐ[volumeMeasureOn U] + Function.const _ (HilbertBlockVec.ofBlockVec P) := by + simpa [blockVecToHilbertBlockL2Const] using + (coeFn_hilbertBlockL2Const (U := U) (X := HilbertBlockVec.ofBlockVec P)) + +end ConstantFields + +section Operators + +variable {d : ℕ} {U : Set (Vec d)} + +/-- A fixed block matrix acts continuously on the ambient Hilbert space +`L²(U; \R^{2d})` by pointwise application. -/ +noncomputable def hilbertBlockL2OperatorOfBlockMat (U : Set (Vec d)) (A : BlockMat d) : + HilbertBlockL2 U →L[ℝ] HilbertBlockL2 U := + (HilbertBlockVec.applyBlockMat A).compLpL 2 (volumeMeasureOn U) + +theorem coeFn_hilbertBlockL2OperatorOfBlockMat (A : BlockMat d) (F : HilbertBlockL2 U) : + hilbertBlockL2OperatorOfBlockMat U A F =ᵐ[volumeMeasureOn U] + fun x => HilbertBlockVec.applyBlockMat A (F x) := by + simpa [hilbertBlockL2OperatorOfBlockMat] using + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := HilbertBlockVec.applyBlockMat A) + (f := F)) + +variable [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + +theorem hilbertBlockL2OperatorOfBlockMat_apply_const (A : BlockMat d) (P : BlockVec d) : + hilbertBlockL2OperatorOfBlockMat U A (blockVecToHilbertBlockL2Const (U := U) P) = + blockVecToHilbertBlockL2Const (U := U) (blockMatVecMul A P) := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_hilbertBlockL2OperatorOfBlockMat (U := U) (A := A) + (F := blockVecToHilbertBlockL2Const (U := U) P), + coeFn_blockVecToHilbertBlockL2Const (U := U) (P := P), + coeFn_blockVecToHilbertBlockL2Const (U := U) (P := blockMatVecMul A P)] + with x hOp hConst hTarget + simp [hOp, hConst, hTarget, HilbertBlockVec.applyBlockMat_apply] + +end Operators + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair.lean new file mode 100644 index 0000000000..ae55cdf49b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair.lean @@ -0,0 +1,146 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.Core +public import LeanPool.CoarseGraining.Homogenization.Sobolev.CubeEmbedding + +/-! # Matched Pair -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators + +/-! +# The matched-pair Sobolev inequality + +This module re-exports the scaled Poincaré inequalities, the zero-set lower +bound, and the matched-pair Poincaré inequality from the `MatchedPair` +submodules, and proves the top-level matched-pair Sobolev inequality (the +high-moment paper's Lemma 3.2, `l.doubled.sobolev` / `e.doubled.sobolev`, +Armstrong–Kuusi–Loher, to appear): + +For `f, g ∈ H¹(axisCube z L)` sharing a boundary trace (`f − g ∈ H¹₀`) whose +value sets together cover at most `|U|`, +`‖f‖_{L^{2*}} + ‖g‖_{L^{2*}} ≤ C_d (∑ᵢ‖∂ᵢf‖_{L²} + ∑ᵢ‖∂ᵢg‖_{L²})`, +in the split `eLpNorm` spelling aligned with `cube_sobolev_embedding`. + +The proof combines the cube Sobolev embedding for `f` and `g` with the +matched-pair Poincaré inequality to absorb the lower-order `L⁻¹‖·‖_{L²}` terms. +-/ + +noncomputable section + +variable {d : ℕ} + +/-- **Matched-pair Sobolev inequality (the high-moment paper's Lemma 3.2, split `eLpNorm` form).** + +For `d ≥ 3` there is an absolute constant `C = C(d) ≥ 0` such that for every axis +cube `U = axisCube z L` of side `L > 0` and every pair `f, g ∈ H¹(U)` with +`f − g ∈ H¹₀(U)` and `|{f ≠ 0}| + |{g ≠ 0}| ≤ |U|` (measurable representatives), +`‖f‖_{L^{2*}(U)} + ‖g‖_{L^{2*}(U)} ≤ C (∑ᵢ‖∂ᵢf‖_{L²(U)} + ∑ᵢ‖∂ᵢg‖_{L²(U)})`. -/ +theorem matchedPair_sobolev (hd : 3 ≤ d) : + ∃ C : ℝ, 0 ≤ C ∧ + ∀ (z : Homogenization.Vec d) (L : ℝ), 0 < L → + ∀ (f g : H1Function (axisCube z L)), + Measurable f.toFun → Measurable g.toFun → + MemH10 (axisCube z L) (fun x => f.toFun x - g.toFun x) → + MeasureTheory.volume {x | x ∈ axisCube z L ∧ f.toFun x ≠ 0} + + MeasureTheory.volume {x | x ∈ axisCube z L ∧ g.toFun x ≠ 0} + ≤ MeasureTheory.volume (axisCube z L) → + (eLpNorm f.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal + + (eLpNorm g.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal + ≤ C * + ((∑ i : Fin d, + (eLpNorm (fun x => f.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) + + ∑ i : Fin d, + (eLpNorm (fun x => g.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) := by + have : NeZero d := ⟨by omega⟩ + obtain ⟨CE, hCEpos, hE⟩ := cube_sobolev_embedding hd + have hmpp_nn : 0 ≤ matchedPairPoincareConst d := matchedPairPoincareConst_nonneg d + refine ⟨(CE : ℝ) * (1 + matchedPairPoincareConst d), by positivity, ?_⟩ + intro z L hL f g hfm hgm hfg hzero + -- Real-valued form of E1 for a single `H¹` function on this cube. + have e1real : ∀ u : H1Function (axisCube z L), + (eLpNorm u.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal ≤ + (CE : ℝ) * + ((∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) + + L⁻¹ * (eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))).toReal) := by + intro u + have hEu := hE z L hL u + -- Finiteness of the pieces of the right-hand side. + have hgrad_ne : ∀ i : Fin d, + eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L)) ≠ ⊤ := + fun i => (u.gradMemL2 i).eLpNorm_lt_top.ne + have hval_ne : eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L)) ≠ ⊤ := + u.memL2.eLpNorm_lt_top.ne + have hB1_ne : + (∑ i : Fin d, eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) ≠ ⊤ := + (ENNReal.sum_lt_top.2 fun i _ => (hgrad_ne i).lt_top).ne + have hB2_ne : + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L)) ≠ ⊤ := + ENNReal.mul_ne_top ENNReal.ofReal_ne_top hval_ne + have hCE_ne : ((CE : ℝ≥0∞)) ≠ ⊤ := ENNReal.coe_ne_top + have hRHS_ne : + (CE : ℝ≥0∞) * + ((∑ i : Fin d, eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))) ≠ ⊤ := + ENNReal.mul_ne_top hCE_ne (ENNReal.add_ne_top.2 ⟨hB1_ne, hB2_ne⟩) + calc (eLpNorm u.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal + ≤ ((CE : ℝ≥0∞) * + ((∑ i : Fin d, eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))) + + ENNReal.ofReal L⁻¹ * eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L)))).toReal := + ENNReal.toReal_mono hRHS_ne hEu + _ = (CE : ℝ) * + ((∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal) + + L⁻¹ * (eLpNorm u.toFun 2 (volumeMeasureOn (axisCube z L))).toReal) := by + rw [ENNReal.toReal_mul, ENNReal.toReal_add hB1_ne hB2_ne, + ENNReal.toReal_sum (fun i _ => hgrad_ne i), ENNReal.toReal_mul, + ENNReal.toReal_ofReal (by positivity), ENNReal.coe_toReal] + -- E1 for `f` and `g`. + have hEf := e1real f + have hEg := e1real g + -- F3 in real / `eLpNorm` form. + have hF3 := matchedPair_poincare z hL f g hfm hgm hfg hzero + rw [norm_toScalarL2_eq, norm_toScalarL2_eq, + gradientCoordL2NormSum_eq_sum_eLpNorm f, + gradientCoordL2NormSum_eq_sum_eLpNorm g] at hF3 + -- Abbreviations. + set Gf := ∑ i : Fin d, + (eLpNorm (fun x => f.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal with hGf + set Gg := ∑ i : Fin d, + (eLpNorm (fun x => g.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal with hGg + set nff := (eLpNorm f.toFun 2 (volumeMeasureOn (axisCube z L))).toReal with hnff + set nfg := (eLpNorm g.toFun 2 (volumeMeasureOn (axisCube z L))).toReal with hnfg + -- Absorb the lower-order term via F3. + have hLinv_nn : (0 : ℝ) ≤ L⁻¹ := by positivity + have hstep : L⁻¹ * (nff + nfg) ≤ matchedPairPoincareConst d * (Gf + Gg) := by + have h1 := mul_le_mul_of_nonneg_left hF3 hLinv_nn + have h2 : L⁻¹ * (matchedPairPoincareConst d * L * (Gf + Gg)) = + matchedPairPoincareConst d * (Gf + Gg) := by + rw [show matchedPairPoincareConst d * L * (Gf + Gg) + = L * (matchedPairPoincareConst d * (Gf + Gg)) by ring, + ← mul_assoc, inv_mul_cancel₀ hL.ne', one_mul] + linarith [h1, h2] + -- Assemble. + calc (eLpNorm f.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal + + (eLpNorm g.toFun (twoStar d) (volumeMeasureOn (axisCube z L))).toReal + ≤ (CE : ℝ) * (Gf + L⁻¹ * nff) + (CE : ℝ) * (Gg + L⁻¹ * nfg) := add_le_add hEf hEg + _ = (CE : ℝ) * ((Gf + Gg) + L⁻¹ * (nff + nfg)) := by ring + _ ≤ (CE : ℝ) * ((Gf + Gg) + matchedPairPoincareConst d * (Gf + Gg)) := by + refine mul_le_mul_of_nonneg_left ?_ (by positivity) + linarith [hstep] + _ = (CE : ℝ) * (1 + matchedPairPoincareConst d) * (Gf + Gg) := by ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/Core.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/Core.lean new file mode 100644 index 0000000000..aea5d9602b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/Core.lean @@ -0,0 +1,461 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.MatchedPair.ScaledPoincare +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.DifferenceQuotient + +/-! # Core -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators + +/-! +# Matched-pair Poincaré on axis cubes + +Assembles the zero-set lower bound and the matched-pair Poincaré inequality (the +high-moment paper's `e.doubled.poincare`, Armstrong–Kuusi–Loher, to appear) +from the scaled Poincaré inequalities of `ScaledPoincare`. All `L²` bookkeeping +is carried out on the Lebesgue `L²` realizations `H1Function.toScalarL2`, whose +triangle inequality is free, and converted to the `eLpNorm` spelling at the +interface. +-/ + +noncomputable section + +variable {d : ℕ} + +/-! ## Generic `L²`-realization helpers -/ + +/-- The `L²` realization is subtractive. -/ +theorem toScalarL2_sub {U : Set (Homogenization.Vec d)} (u v : H1Function U) : + (u - v).toScalarL2 = u.toScalarL2 - v.toScalarL2 := by + rw [sub_eq_add_neg, H1Function.toScalarL2_add] + have : (-v).toScalarL2 = -(v.toScalarL2) := by + have h := H1Function.toScalarL2_smul (-1 : ℝ) v + simpa using h + rw [this, ← sub_eq_add_neg] + +/-- The `L²` realization depends only on the underlying function. -/ +theorem toScalarL2_congr {U : Set (Homogenization.Vec d)} {u v : H1Function U} + (h : u.toFun = v.toFun) : u.toScalarL2 = v.toScalarL2 := by + simp only [H1Function.toScalarL2, Homogenization.toScalarL2] + refine MeasureTheory.MemLp.toLp_congr u.memL2 v.memL2 ?_ + rw [h] + +/-- Triangle inequality for the `L²` realization of a sum. -/ +theorem norm_toScalarL2_add_le {U : Set (Homogenization.Vec d)} (u v : H1Function U) : + ‖(u + v).toScalarL2‖ ≤ ‖u.toScalarL2‖ + ‖v.toScalarL2‖ := by + rw [H1Function.toScalarL2_add] + exact norm_add_le _ _ + +/-- Triangle inequality for the `L²` realization of a difference. -/ +theorem norm_toScalarL2_sub_le {U : Set (Homogenization.Vec d)} (u v : H1Function U) : + ‖(u - v).toScalarL2‖ ≤ ‖u.toScalarL2‖ + ‖v.toScalarL2‖ := by + rw [toScalarL2_sub] + exact norm_sub_le _ _ + +/-- The squared `L²`-realization norm is the integral of the square. -/ +theorem l2_normSq_eq_integral {U : Set (Homogenization.Vec d)} (u : H1Function U) : + ‖u.toScalarL2‖ ^ 2 = ∫ x in U, u.toFun x ^ 2 ∂MeasureTheory.volume := by + rw [norm_toScalarL2_eq] + exact toReal_eLpNorm_two_sq_eq_integral_sq u.memL2 + +/-- Elementary: `x ≤ a + b` whenever `x² ≤ a² + b²` and all are nonnegative. -/ +private theorem le_add_of_sq_le_sq_add_sq {x a b : ℝ} + (_hx : 0 ≤ x) (ha : 0 ≤ a) (hb : 0 ≤ b) (h : x ^ 2 ≤ a ^ 2 + b ^ 2) : + x ≤ a + b := by + nlinarith [mul_nonneg ha hb] + +/-! ## F2: the zero-set lower bound -/ + +/-- **Zero-set lower bound.** If the value sets of `f` and `g` together +cover at most `|U|`, then for every level `c` the `L²` norm of the constant `c` +on `U = axisCube z L` is dominated by the two centered `L²` norms `‖f − c‖` and +`‖g − c‖`. (Requires measurable representatives, satisfied by the level-set +truncations fed in downstream.) -/ +theorem matchedPair_zeroSet (z : Homogenization.Vec d) {L : ℝ} + (f g : H1Function (axisCube z L)) (c : ℝ) + (hfm : Measurable f.toFun) (hgm : Measurable g.toFun) + (hzero : MeasureTheory.volume {x | x ∈ axisCube z L ∧ f.toFun x ≠ 0} + + MeasureTheory.volume {x | x ∈ axisCube z L ∧ g.toFun x ≠ 0} + ≤ MeasureTheory.volume (axisCube z L)) : + ‖(H1Function.const (U := axisCube z L) c).toScalarL2‖ + ≤ ‖(f.addConst (-c)).toScalarL2‖ + ‖(g.addConst (-c)).toScalarL2‖ := by + classical + have hUmeas : MeasurableSet (axisCube z L) := (isOpen_axisCube z L).measurableSet + -- Level sets and their complements inside `U`. + set Sf : Set (Homogenization.Vec d) := {x | x ∈ axisCube z L ∧ f.toFun x = 0} with hSfdef + set Sg : Set (Homogenization.Vec d) := {x | x ∈ axisCube z L ∧ g.toFun x = 0} with hSgdef + set Nf : Set (Homogenization.Vec d) := {x | x ∈ axisCube z L ∧ f.toFun x ≠ 0} with hNfdef + set Ng : Set (Homogenization.Vec d) := {x | x ∈ axisCube z L ∧ g.toFun x ≠ 0} with hNgdef + have hSf : MeasurableSet Sf := + hUmeas.inter (hfm (measurableSet_singleton 0)) + have hSg : MeasurableSet Sg := + hUmeas.inter (hgm (measurableSet_singleton 0)) + have hNf : MeasurableSet Nf := + hUmeas.inter (hfm (measurableSet_singleton 0)).compl + have hNg : MeasurableSet Ng := + hUmeas.inter (hgm (measurableSet_singleton 0)).compl + -- Squares are integrable on `U`. + have hsqInt : ∀ (h : H1Function (axisCube z L)), + MeasureTheory.IntegrableOn (fun x => h.toFun x ^ 2) (axisCube z L) + MeasureTheory.volume := by + intro h + have := (h.memL2.integrable_norm_pow (p := 2) (by norm_num)) + simpa [MeasureTheory.IntegrableOn, Real.norm_eq_abs, sq_abs] using this + -- Lower bound: `∫_U (h − c)² ≥ c² · |{h = 0} ∩ U|`. + have hlower : ∀ (h : H1Function (axisCube z L)) (S : Set (Homogenization.Vec d)), + MeasurableSet S → S ⊆ axisCube z L → (∀ x ∈ S, h.toFun x = 0) → + c ^ 2 * (MeasureTheory.volume S).toReal ≤ + ∫ x in axisCube z L, (h.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume := by + intro h S hSmeas hSsub hSzero + have hcongr : ∀ x ∈ S, (h.addConst (-c)).toFun x ^ 2 = c ^ 2 := by + intro x hx + have hx0 : h.toFun x = 0 := hSzero x hx + simp only [H1Function.addConst_apply, hx0] + ring + have heq : ∫ x in S, (h.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume = + c ^ 2 * (MeasureTheory.volume S).toReal := by + rw [MeasureTheory.setIntegral_congr_fun hSmeas hcongr] + rw [MeasureTheory.setIntegral_const] + rw [smul_eq_mul, mul_comm] + rfl + have hmono : ∫ x in S, (h.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume ≤ + ∫ x in axisCube z L, (h.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_mono_set (hsqInt _) ?_ ?_ + · exact Filter.Eventually.of_forall fun x => by positivity + · exact Filter.Eventually.of_forall (fun x hx => hSsub hx) + rw [heq] at hmono + exact hmono + have hlf := hlower f Sf hSf (fun x hx => hx.1) (fun x hx => hx.2) + have hlg := hlower g Sg hSg (fun x hx => hx.1) (fun x hx => hx.2) + -- Measure complement: `|Sf| + |Sg| ≥ |U|`. + have hUlt : MeasureTheory.volume (axisCube z L) < ⊤ := by + have h := (isFiniteMeasure_volumeMeasureOn_axisCube z L).measure_univ_lt_top + rwa [volumeMeasureOn, MeasureTheory.Measure.restrict_apply_univ] at h + have hpartf : MeasureTheory.volume (axisCube z L) = + MeasureTheory.volume Sf + MeasureTheory.volume Nf := by + have hunion : Sf ∪ Nf = axisCube z L := by + ext x; by_cases hx : x ∈ axisCube z L <;> by_cases h0 : f.toFun x = 0 <;> + simp [hSfdef, hNfdef, hx, h0] + have hdisj : Disjoint Sf Nf := by + rw [Set.disjoint_left]; rintro x hxf hxn; exact hxn.2 hxf.2 + rw [← hunion, MeasureTheory.measure_union hdisj hNf] + have hpartg : MeasureTheory.volume (axisCube z L) = + MeasureTheory.volume Sg + MeasureTheory.volume Ng := by + have hunion : Sg ∪ Ng = axisCube z L := by + ext x; by_cases hx : x ∈ axisCube z L <;> by_cases h0 : g.toFun x = 0 <;> + simp [hSgdef, hNgdef, hx, h0] + have hdisj : Disjoint Sg Ng := by + rw [Set.disjoint_left]; rintro x hxg hxn; exact hxn.2 hxg.2 + rw [← hunion, MeasureTheory.measure_union hdisj hNg] + have hvolLe : MeasureTheory.volume (axisCube z L) ≤ + MeasureTheory.volume Sf + MeasureTheory.volume Sg := by + have hsum : MeasureTheory.volume (axisCube z L) + MeasureTheory.volume (axisCube z L) = + (MeasureTheory.volume Sf + MeasureTheory.volume Sg) + + (MeasureTheory.volume Nf + MeasureTheory.volume Ng) := by + nth_rewrite 1 [hpartf] + nth_rewrite 1 [hpartg] + ring + have hle : MeasureTheory.volume (axisCube z L) + MeasureTheory.volume (axisCube z L) ≤ + (MeasureTheory.volume Sf + MeasureTheory.volume Sg) + + MeasureTheory.volume (axisCube z L) := by + rw [hsum] + exact add_le_add (le_refl (MeasureTheory.volume Sf + MeasureTheory.volume Sg)) hzero + exact (ENNReal.add_le_add_iff_right hUlt.ne).1 hle + -- Pass to reals. + have hvolReal : (MeasureTheory.volume (axisCube z L)).toReal ≤ + (MeasureTheory.volume Sf).toReal + (MeasureTheory.volume Sg).toReal := by + have hSflt : MeasureTheory.volume Sf ≠ ⊤ := + (lt_of_le_of_lt (measure_mono (fun x hx => hx.1)) hUlt).ne + have hSglt : MeasureTheory.volume Sg ≠ ⊤ := + (lt_of_le_of_lt (measure_mono (fun x hx => hx.1)) hUlt).ne + calc (MeasureTheory.volume (axisCube z L)).toReal + ≤ (MeasureTheory.volume Sf + MeasureTheory.volume Sg).toReal := + ENNReal.toReal_mono (ENNReal.add_ne_top.2 ⟨hSflt, hSglt⟩) hvolLe + _ = (MeasureTheory.volume Sf).toReal + (MeasureTheory.volume Sg).toReal := + ENNReal.toReal_add hSflt hSglt + -- Assemble the squared inequality. + have hconstSq : ‖(H1Function.const (U := axisCube z L) c).toScalarL2‖ ^ 2 = + c ^ 2 * (MeasureTheory.volume (axisCube z L)).toReal := by + rw [l2_normSq_eq_integral] + have : ∫ x in axisCube z L, (H1Function.const (U := axisCube z L) c).toFun x ^ 2 + ∂MeasureTheory.volume = ∫ _ in axisCube z L, c ^ 2 ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hUmeas + intro x _; simp [H1Function.const_apply] + rw [this, MeasureTheory.setIntegral_const, smul_eq_mul, mul_comm] + rfl + have hcsq_nonneg : 0 ≤ c ^ 2 := sq_nonneg c + have hkey : ‖(H1Function.const (U := axisCube z L) c).toScalarL2‖ ^ 2 ≤ + ‖(f.addConst (-c)).toScalarL2‖ ^ 2 + ‖(g.addConst (-c)).toScalarL2‖ ^ 2 := by + rw [hconstSq, l2_normSq_eq_integral, l2_normSq_eq_integral] + calc c ^ 2 * (MeasureTheory.volume (axisCube z L)).toReal + ≤ c ^ 2 * ((MeasureTheory.volume Sf).toReal + (MeasureTheory.volume Sg).toReal) := + mul_le_mul_of_nonneg_left hvolReal hcsq_nonneg + _ = c ^ 2 * (MeasureTheory.volume Sf).toReal + + c ^ 2 * (MeasureTheory.volume Sg).toReal := by ring + _ ≤ (∫ x in axisCube z L, (f.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume) + + (∫ x in axisCube z L, (g.addConst (-c)).toFun x ^ 2 ∂MeasureTheory.volume) := + add_le_add hlf hlg + exact le_add_of_sq_le_sq_add_sq (norm_nonneg _) (norm_nonneg _) (norm_nonneg _) hkey + +/-! ## Gradient uniqueness and the `H¹`-input Dirichlet Poincaré -/ + +/-- Two `H¹` witnesses with the same value have a.e. equal gradient coordinates +on an open domain. -/ +theorem gradCoord_ae_eq_of_toFun_eq {U : Set (Homogenization.Vec d)} (hU : IsOpen U) + (p q : H1Function U) (h : p.toFun = q.toFun) (i : Fin d) : + (fun x => p.grad x i) =ᵐ[MeasureTheory.volume.restrict U] (fun x => q.grad x i) := by + refine HasWeakPartialDerivOn.ae_eq hU + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((p.gradMemL2 i).locallyIntegrable (by norm_num))) + (MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + ((q.gradMemL2 i).locallyIntegrable (by norm_num))) ?_ (q.hasWeakGradient i) + have hp := p.hasWeakGradient i + rw [h] at hp + exact hp + +/-- **Scaled Dirichlet Poincaré for `H¹` inputs.** If `w ∈ H¹(axisCube z L)` has a zero-trace +representative (`MemH10 U w.toFun`), then `w` obeys the scaled Dirichlet Poincaré +with its *own* gradient on the right-hand side. -/ +theorem scaled_dirichlet_poincare_h1 {d : ℕ} [NeZero d] (z : Homogenization.Vec d) {L : ℝ} + (hL : 0 < L) (w : H1Function (axisCube z L)) + (hw : MemH10 (axisCube z L) w.toFun) : + ‖w.toScalarL2‖ ≤ unitDirichletPoincareConst d * L * w.gradientCoordL2NormSum := by + obtain ⟨v, hv⟩ := hw + have hbound := scaled_dirichlet_poincare_norm z hL v + have hval : ‖v.toH1Function.toScalarL2‖ = ‖w.toScalarL2‖ := by + rw [toScalarL2_congr hv] + have hgrad : v.toH1Function.gradientCoordL2NormSum = w.gradientCoordL2NormSum := by + unfold H1Function.gradientCoordL2NormSum + refine Finset.sum_congr rfl ?_ + intro i _ + rw [norm_gradCoordToScalarL2_eq, norm_gradCoordToScalarL2_eq] + exact congrArg ENNReal.toReal + (MeasureTheory.eLpNorm_congr_ae + (gradCoord_ae_eq_of_toFun_eq (isOpen_axisCube z L) v.toH1Function w hv i)) + rw [hval, hgrad] at hbound + exact hbound + +/-- The `i`th gradient `L²` realization is subtractive. -/ +theorem gradCoordToScalarL2_sub {U : Set (Homogenization.Vec d)} (u v : H1Function U) (i : Fin d) : + (u - v).gradCoordToScalarL2 i = u.gradCoordToScalarL2 i - v.gradCoordToScalarL2 i := by + rw [sub_eq_add_neg, H1Function.gradCoordToScalarL2_add] + have hneg : (-v).gradCoordToScalarL2 i = -(v.gradCoordToScalarL2 i) := by + have h := H1Function.gradCoordToScalarL2_smul (-1 : ℝ) v i + simpa using h + rw [hneg, ← sub_eq_add_neg] + +/-- The coordinate-sum gradient norm is subadditive under differences. -/ +theorem gradientCoordL2NormSum_sub_le {U : Set (Homogenization.Vec d)} (u v : H1Function U) : + (u - v).gradientCoordL2NormSum ≤ + u.gradientCoordL2NormSum + v.gradientCoordL2NormSum := by + unfold H1Function.gradientCoordL2NormSum + rw [← Finset.sum_add_distrib] + refine Finset.sum_le_sum ?_ + intro i _ + rw [gradCoordToScalarL2_sub] + exact norm_sub_le _ _ + +/-! ## F3: the matched-pair Poincaré inequality -/ + +/-- The matched-pair Poincaré constant `3 (2 C₁ + C₂)`, with `C₁` the mean-zero +and `C₂` the Dirichlet unit-cube constants. -/ +noncomputable def matchedPairPoincareConst (d : ℕ) [NeZero d] : ℝ := + 3 * (2 * unitMeanZeroPoincareConst d + unitDirichletPoincareConst d) + +theorem matchedPairPoincareConst_nonneg (d : ℕ) [NeZero d] : + 0 ≤ matchedPairPoincareConst d := by + unfold matchedPairPoincareConst + have := unitMeanZeroPoincareConst_nonneg d + have := unitDirichletPoincareConst_nonneg d + positivity + +/-- **Matched-pair Poincaré (norm form; the high-moment paper's `e.doubled.poincare`).** + +If `f, g ∈ H¹(axisCube z L)` share a boundary trace (`f − g ∈ H¹₀`) and their +value sets together cover at most `|U|`, then +`‖f‖_{L²} + ‖g‖_{L²} ≤ C_d · L · (‖∇f‖ + ‖∇g‖)`. -/ +theorem matchedPair_poincare {d : ℕ} [NeZero d] (z : Homogenization.Vec d) {L : ℝ} + (hL : 0 < L) (f g : H1Function (axisCube z L)) + (hfm : Measurable f.toFun) (hgm : Measurable g.toFun) + (hfg : MemH10 (axisCube z L) (fun x => f.toFun x - g.toFun x)) + (hzero : MeasureTheory.volume {x | x ∈ axisCube z L ∧ f.toFun x ≠ 0} + + MeasureTheory.volume {x | x ∈ axisCube z L ∧ g.toFun x ≠ 0} + ≤ MeasureTheory.volume (axisCube z L)) : + ‖f.toScalarL2‖ + ‖g.toScalarL2‖ ≤ + matchedPairPoincareConst d * L * + (f.gradientCoordL2NormSum + g.gradientCoordL2NormSum) := by + classical + let U := axisCube z L + set C₁ := unitMeanZeroPoincareConst d with hC1def + set C₂ := unitDirichletPoincareConst d with hC2def + set Gf := f.gradientCoordL2NormSum with hGfdef + set Gg := g.gradientCoordL2NormSum with hGgdef + set af := integralAverage U f.toFun with hafdef + set ag := integralAverage U g.toFun with hagdef + set c := (af + ag) / 2 with hcdef + have hL_nn : 0 ≤ L := hL.le + have hC1_nn : 0 ≤ C₁ := unitMeanZeroPoincareConst_nonneg d + have hC2_nn : 0 ≤ C₂ := unitDirichletPoincareConst_nonneg d + have hGf_nn : 0 ≤ Gf := f.gradientCoordL2NormSum_nonneg + have hGg_nn : 0 ≤ Gg := g.gradientCoordL2NormSum_nonneg + have hG_nn : 0 ≤ Gf + Gg := add_nonneg hGf_nn hGg_nn + -- The constant-`t` `L²` elements scale linearly. + have const_smul : ∀ t : ℝ, (H1Function.const (U := U) t).toScalarL2 = + t • (H1Function.const (U := U) 1).toScalarL2 := by + intro t + rw [← H1Function.toScalarL2_smul] + apply toScalarL2_congr + funext x + simp [H1Function.smul_toFun, H1Function.const_apply] + set s := ‖(H1Function.const (U := U) 1).toScalarL2‖ with hsdef + have const_norm : ∀ t : ℝ, ‖(H1Function.const (U := U) t).toScalarL2‖ = |t| * s := by + intro t + rw [const_smul t, norm_smul, Real.norm_eq_abs] + -- `f − g` as an `H¹` function with a zero-trace representative. + have hfmg_mem : MemH10 U (f - g).toFun := by + simpa [H1Function.sub_toFun] using hfg + have hfmg_grad_le : (f - g).gradientCoordL2NormSum ≤ Gf + Gg := + gradientCoordL2NormSum_sub_le f g + -- S1/S2: mean-subtracted Poincaré on `f` and `g`. + have S1 : ‖f.subAverage.toScalarL2‖ ≤ C₁ * L * Gf := by + have h := scaled_meanZero_poincare z hL f + rwa [← norm_toScalarL2_eq, ← gradientCoordL2NormSum_eq_sum_eLpNorm] at h + have S2 : ‖g.subAverage.toScalarL2‖ ≤ C₁ * L * Gg := by + have h := scaled_meanZero_poincare z hL g + rwa [← norm_toScalarL2_eq, ← gradientCoordL2NormSum_eq_sum_eLpNorm] at h + -- S3: Dirichlet Poincaré on `f − g`. + have S3 : ‖(f - g).toScalarL2‖ ≤ C₂ * L * (Gf + Gg) := by + have h := scaled_dirichlet_poincare_h1 z hL (f - g) hfmg_mem + refine h.trans ?_ + exact mul_le_mul_of_nonneg_left hfmg_grad_le (by positivity) + -- S4: mean-subtracted Poincaré on `f − g`. + have S4 : ‖(f - g).subAverage.toScalarL2‖ ≤ C₁ * L * (Gf + Gg) := by + have h := scaled_meanZero_poincare z hL (f - g) + rw [← norm_toScalarL2_eq, ← gradientCoordL2NormSum_eq_sum_eLpNorm] at h + exact h.trans (mul_le_mul_of_nonneg_left hfmg_grad_le (by positivity)) + -- The mean gap `⨍(f−g) = af − ag`. + have hmean : integralAverage U (fun x => f.toFun x - g.toFun x) = af - ag := by + rw [hafdef, hagdef] + simp only [integralAverage] + rw [MeasureTheory.integral_sub f.integrableOn.integrable g.integrableOn.integrable] + ring + -- Gap bound: `|af − ag| · s ≤ (C₁ + C₂) L (Gf + Gg)`. + have hgap : |af - ag| * s ≤ (C₁ + C₂) * L * (Gf + Gg) := by + have heq : ‖(H1Function.const (U := U) (af - ag)).toScalarL2‖ = + ‖((f - g) - (f - g).subAverage).toScalarL2‖ := by + apply congrArg + apply toScalarL2_congr + funext x + simp only [H1Function.sub_toFun, H1Function.subAverage_apply, H1Function.const_apply, hmean] + ring + rw [const_norm] at heq + calc |af - ag| * s = ‖((f - g) - (f - g).subAverage).toScalarL2‖ := heq + _ ≤ ‖(f - g).toScalarL2‖ + ‖(f - g).subAverage.toScalarL2‖ := + norm_toScalarL2_sub_le _ _ + _ ≤ C₂ * L * (Gf + Gg) + C₁ * L * (Gf + Gg) := add_le_add S3 S4 + _ = (C₁ + C₂) * L * (Gf + Gg) := by ring + -- Centered Poincaré: `‖f − c‖ + ‖g − c‖ ≤ (2C₁ + C₂) L (Gf + Gg)`. + have hs_nn : 0 ≤ s := norm_nonneg _ + have hafc : |af - c| = |af - ag| / 2 := by + rw [show af - c = (af - ag) / 2 by rw [hcdef]; ring, abs_div] + norm_num + have hagc : |ag - c| = |af - ag| / 2 := by + rw [show ag - c = -((af - ag) / 2) by rw [hcdef]; ring, abs_neg, abs_div] + norm_num + have hfc_center : ‖(f.addConst (-c)).toScalarL2‖ ≤ + ‖f.subAverage.toScalarL2‖ + |af - c| * s := by + have heq : (f.addConst (-c)).toScalarL2 = + f.subAverage.toScalarL2 + (H1Function.const (U := U) (af - c)).toScalarL2 := by + rw [← H1Function.toScalarL2_add] + apply toScalarL2_congr + funext x + simp only [H1Function.add_toFun, H1Function.addConst_apply, H1Function.subAverage_apply, + H1Function.const_apply, hafdef] + ring + rw [heq] + refine (norm_add_le _ _).trans ?_ + rw [const_norm] + have hgc_center : ‖(g.addConst (-c)).toScalarL2‖ ≤ + ‖g.subAverage.toScalarL2‖ + |ag - c| * s := by + have heq : (g.addConst (-c)).toScalarL2 = + g.subAverage.toScalarL2 + (H1Function.const (U := U) (ag - c)).toScalarL2 := by + rw [← H1Function.toScalarL2_add] + apply toScalarL2_congr + funext x + simp only [H1Function.add_toFun, H1Function.addConst_apply, H1Function.subAverage_apply, + H1Function.const_apply, hagdef] + ring + rw [heq] + refine (norm_add_le _ _).trans ?_ + rw [const_norm] + have hcentered : ‖(f.addConst (-c)).toScalarL2‖ + ‖(g.addConst (-c)).toScalarL2‖ ≤ + (2 * C₁ + C₂) * L * (Gf + Gg) := by + have hsum : ‖(f.addConst (-c)).toScalarL2‖ + ‖(g.addConst (-c)).toScalarL2‖ ≤ + (‖f.subAverage.toScalarL2‖ + ‖g.subAverage.toScalarL2‖) + |af - ag| * s := by + calc ‖(f.addConst (-c)).toScalarL2‖ + ‖(g.addConst (-c)).toScalarL2‖ + ≤ (‖f.subAverage.toScalarL2‖ + |af - c| * s) + + (‖g.subAverage.toScalarL2‖ + |ag - c| * s) := add_le_add hfc_center hgc_center + _ = (‖f.subAverage.toScalarL2‖ + ‖g.subAverage.toScalarL2‖) + + (|af - c| + |ag - c|) * s := by ring + _ = (‖f.subAverage.toScalarL2‖ + ‖g.subAverage.toScalarL2‖) + |af - ag| * s := by + rw [hafc, hagc]; ring + refine hsum.trans ?_ + calc (‖f.subAverage.toScalarL2‖ + ‖g.subAverage.toScalarL2‖) + |af - ag| * s + ≤ (C₁ * L * Gf + C₁ * L * Gg) + (C₁ + C₂) * L * (Gf + Gg) := + add_le_add (add_le_add S1 S2) hgap + _ = (2 * C₁ + C₂) * L * (Gf + Gg) := by ring + -- F2: control of the constant `c`. + have hF2 : ‖(H1Function.const (U := U) c).toScalarL2‖ ≤ + ‖(f.addConst (-c)).toScalarL2‖ + ‖(g.addConst (-c)).toScalarL2‖ := + matchedPair_zeroSet z f g c hfm hgm hzero + -- Reconstruct `f`, `g` from centered parts. + have hf_split : ‖f.toScalarL2‖ ≤ + ‖(f.addConst (-c)).toScalarL2‖ + ‖(H1Function.const (U := U) c).toScalarL2‖ := by + have heq : f.toScalarL2 = + (f.addConst (-c)).toScalarL2 + (H1Function.const (U := U) c).toScalarL2 := by + rw [← H1Function.toScalarL2_add] + apply toScalarL2_congr + funext x + simp only [H1Function.add_toFun, H1Function.addConst_apply, H1Function.const_apply] + ring + rw [heq]; exact norm_add_le _ _ + have hg_split : ‖g.toScalarL2‖ ≤ + ‖(g.addConst (-c)).toScalarL2‖ + ‖(H1Function.const (U := U) c).toScalarL2‖ := by + have heq : g.toScalarL2 = + (g.addConst (-c)).toScalarL2 + (H1Function.const (U := U) c).toScalarL2 := by + rw [← H1Function.toScalarL2_add] + apply toScalarL2_congr + funext x + simp only [H1Function.add_toFun, H1Function.addConst_apply, H1Function.const_apply] + ring + rw [heq]; exact norm_add_le _ _ + -- Assemble. + set Nfc := ‖(f.addConst (-c)).toScalarL2‖ with hNfcdef + set Ngc := ‖(g.addConst (-c)).toScalarL2‖ with hNgcdef + set Nc := ‖(H1Function.const (U := U) c).toScalarL2‖ with hNcdef + have hfinal : ‖f.toScalarL2‖ + ‖g.toScalarL2‖ ≤ 3 * (Nfc + Ngc) := by + calc ‖f.toScalarL2‖ + ‖g.toScalarL2‖ + ≤ (Nfc + Nc) + (Ngc + Nc) := add_le_add hf_split hg_split + _ = (Nfc + Ngc) + 2 * Nc := by ring + _ ≤ (Nfc + Ngc) + 2 * (Nfc + Ngc) := by linarith [hF2] + _ = 3 * (Nfc + Ngc) := by ring + refine hfinal.trans ?_ + calc 3 * (Nfc + Ngc) ≤ 3 * ((2 * C₁ + C₂) * L * (Gf + Gg)) := + mul_le_mul_of_nonneg_left hcentered (by norm_num) + _ = matchedPairPoincareConst d * L * (Gf + Gg) := by + rw [matchedPairPoincareConst, hC1def, hC2def]; ring + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/ScaledPoincare.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/ScaledPoincare.lean new file mode 100644 index 0000000000..9b39f053fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/MatchedPair/ScaledPoincare.lean @@ -0,0 +1,376 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.AxisCube +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareZeroTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Deterministic.ConstantCoefficientDirichletBesov.Basic + +/-! # Scaled Poincare -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Homogenization +open scoped ENNReal NNReal BigOperators Pointwise + +/-! +# Scaled Poincaré inequalities on axis cubes + +Two scaled Poincaré inequalities on axis cubes `U = axisCube z L`: + +* `scaled_meanZero_poincare` — the mean-zero Poincaré inequality with the + explicit `C_d · L` scaling; +* `scaled_dirichlet_poincare` — the zero-trace (Dirichlet) Poincaré inequality + for `MemH10` functions, with the explicit `C_d · L` scaling. + +Both are obtained from the corresponding existential Poincaré constant on the +fixed unit corner cube `axisCube 0 1` (whose constant is therefore an absolute +`C_d`), transported to `axisCube z L` along the affine dilation-plus-translation +`axisCube z L = translateSet z (L • axisCube 0 1)`. The `H¹` weak-gradient +transport and constant bookkeeping are supplied by the reusable bridges +`H1CoerciveEstimate.dilate` / `.translate`, `H1Function.unscale`, +`H10Function.unscale`, `H10Function.untranslate`. +-/ + +noncomputable section + +variable {d : ℕ} + +/-! ## Geometry of axis cubes under dilation and translation -/ + +/-- The corner unit cube dilates to the corner cube of side `L`. -/ +theorem smul_axisCube_zero_one (L : ℝ) (hL : 0 < L) : + L • axisCube (0 : Homogenization.Vec d) 1 = axisCube (0 : Homogenization.Vec d) L := by + have hL_ne : L ≠ 0 := hL.ne' + ext x + rw [Set.mem_smul_set_iff_inv_smul_mem₀ hL_ne] + simp only [axisCube, Set.mem_pi, Set.mem_univ, forall_true_left, zero_add, + Set.mem_Ioo, Pi.smul_apply, smul_eq_mul, Pi.zero_apply] + have hinv : 0 < L⁻¹ := inv_pos.mpr hL + constructor + · intro h j + have hj := h j + constructor + · have h1 := mul_pos hL hj.1 + rwa [mul_inv_cancel_left₀ hL_ne] at h1 + · have h2 := mul_lt_mul_of_pos_left hj.2 hL + rwa [mul_inv_cancel_left₀ hL_ne, mul_one] at h2 + · intro h j + have hj := h j + constructor + · exact mul_pos hinv hj.1 + · have hmul := mul_lt_mul_of_pos_left hj.2 hinv + rwa [inv_mul_cancel₀ hL_ne] at hmul + +/-- Translating the corner cube of side `L` by `z` gives `axisCube z L`. -/ +theorem translateSet_axisCube_zero (z : Homogenization.Vec d) (L : ℝ) : + translateSet z (axisCube (0 : Homogenization.Vec d) L) = axisCube z L := by + ext x + rw [mem_translateSet_iff_sub_mem] + simp only [axisCube, Set.mem_pi, Set.mem_univ, forall_true_left, zero_add, + Set.mem_Ioo, Pi.sub_apply, Pi.zero_apply] + constructor + · intro h j + have hj := h j + constructor + · linarith [hj.1] + · linarith [hj.2] + · intro h j + have hj := h j + constructor + · linarith [hj.1] + · linarith [hj.2] + +/-- The affine identification `axisCube z L = translateSet z (L • axisCube 0 1)`. -/ +theorem axisCube_eq_translateSet_smul (z : Homogenization.Vec d) (L : ℝ) (hL : 0 < L) : + axisCube z L = translateSet z (L • axisCube (0 : Homogenization.Vec d) 1) := by + rw [smul_axisCube_zero_one L hL, translateSet_axisCube_zero] + +/-! ## Finite-measure instances -/ + +instance isFiniteMeasure_volumeMeasureOn_axisCube + (z : Homogenization.Vec d) (L : ℝ) : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (axisCube z L)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_axisCube z L).isFiniteMeasure_restrict_volume + +/-! ## The mean-zero coercive estimate, transported to axis cubes -/ + +/-- The absolute mean-zero Poincaré constant of the *fixed* unit corner cube +`axisCube 0 1`. It depends only on the dimension `d`. -/ +noncomputable def unitMeanZeroPoincareConst (d : ℕ) : ℝ := + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).fixedValue + +theorem unitMeanZeroPoincareConst_nonneg (d : ℕ) : + 0 ≤ unitMeanZeroPoincareConst d := + (h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).constant_nonneg + +private theorem coercive_constant_eqRec {V U : Set (Homogenization.Vec d)} + (h : V = U) (hC : H1CoerciveEstimate V) : + (h ▸ hC).fixedValue = hC.fixedValue := by cases h; rfl + +/-- The mean-zero coercive `H¹` estimate on `axisCube z L`, obtained by dilating +the unit corner-cube estimate by `L` and translating by `z`. Its constant is the +scale-correct `L · C_d`. -/ +noncomputable def axisCubeMeanZeroCoerciveEstimate + (z : Homogenization.Vec d) {L : ℝ} (hL : 0 < L) : + H1CoerciveEstimate (axisCube z L) := + letI : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (L • axisCube (0 : Homogenization.Vec d) 1)) := by + rw [smul_axisCube_zero_one L hL] + exact isFiniteMeasure_volumeMeasureOn_axisCube 0 L + (axisCube_eq_translateSet_smul z L hL).symm ▸ + (((h1CoerciveEstimate_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).dilate hL).translate z) + +theorem axisCubeMeanZeroCoerciveEstimate_constant + (z : Homogenization.Vec d) {L : ℝ} (hL : 0 < L) : + (axisCubeMeanZeroCoerciveEstimate z hL).fixedValue = L * unitMeanZeroPoincareConst d := by + let : MeasureTheory.IsFiniteMeasure + (volumeMeasureOn (L • axisCube (0 : Homogenization.Vec d) 1)) := by + rw [smul_axisCube_zero_one L hL] + exact isFiniteMeasure_volumeMeasureOn_axisCube 0 L + rw [axisCubeMeanZeroCoerciveEstimate, coercive_constant_eqRec, + H1CoerciveEstimate.translate_constant, H1CoerciveEstimate.dilate_constant] + rfl + +/-! ## Bridges between the library's `L²` realizations and `eLpNorm` -/ + +/-- The `L²` realization norm of an `H¹` value is the `toReal` of its `eLpNorm`. -/ +theorem norm_toScalarL2_eq {U : Set (Homogenization.Vec d)} (h : H1Function U) : + ‖h.toScalarL2‖ = (eLpNorm h.toFun 2 (volumeMeasureOn U)).toReal := by + simp only [H1Function.toScalarL2, Homogenization.toScalarL2] + rw [MeasureTheory.Lp.norm_toLp] + +/-- The `L²` realization norm of a gradient coordinate is the `toReal` of its +`eLpNorm`. -/ +theorem norm_gradCoordToScalarL2_eq {U : Set (Homogenization.Vec d)} + (h : H1Function U) (i : Fin d) : + ‖h.gradCoordToScalarL2 i‖ = + (eLpNorm (fun x => h.grad x i) 2 (volumeMeasureOn U)).toReal := by + simp only [H1Function.gradCoordToScalarL2, Homogenization.toScalarL2] + rw [MeasureTheory.Lp.norm_toLp] + +/-! ## F0(i): scaled mean-zero Poincaré -/ + +/-- **Scaled mean-zero Poincaré on axis cubes.** + +For `u ∈ H¹(axisCube z L)`, the `L²` norm of the mean-subtracted `u − ⨍u` is +controlled by `C_d · L` times the coordinate-sum `L²` norm of `∇u`. -/ +theorem scaled_meanZero_poincare (z : Homogenization.Vec d) {L : ℝ} (hL : 0 < L) + (u : H1Function (axisCube z L)) : + (eLpNorm u.subAverage.toFun 2 (volumeMeasureOn (axisCube z L))).toReal + ≤ unitMeanZeroPoincareConst d * L * + ∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal := by + have hconst : (axisCubeMeanZeroCoerciveEstimate z hL).fixedValue = + L * unitMeanZeroPoincareConst d := + axisCubeMeanZeroCoerciveEstimate_constant z hL + have hb := (axisCubeMeanZeroCoerciveEstimate z hL).bound u.toMeanZero + have hconst_nonneg : 0 ≤ (axisCubeMeanZeroCoerciveEstimate z hL).fixedValue := + (axisCubeMeanZeroCoerciveEstimate z hL).constant_nonneg + -- Identify the value norm with the target left-hand side. + have hval : (u.toMeanZero).valueL2Norm = + (eLpNorm u.subAverage.toFun 2 (volumeMeasureOn (axisCube z L))).toReal := by + unfold H1MeanZeroFunction.valueL2Norm H1MeanZeroFunction.toScalarL2 + rw [H1Function.toMeanZero_toH1Function, norm_toScalarL2_eq] + -- The gradient norm is bounded by the coordinate-sum of the eLpNorms of ∇u. + have hgrad_le : (u.toMeanZero).gradientL2Norm ≤ + ∑ i : Fin d, (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal := by + have hstep1 : (u.toMeanZero).gradientL2Norm ≤ u.subAverage.gradientCoordL2NormSum := by + unfold H1MeanZeroFunction.gradientL2Norm H1MeanZeroFunction.gradToVectorL2 + rw [H1Function.toMeanZero_toH1Function] + exact u.subAverage.norm_gradToVectorL2_le_gradientCoordL2NormSum + have hstep2 : u.subAverage.gradientCoordL2NormSum = + ∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal := by + unfold H1Function.gradientCoordL2NormSum + refine Finset.sum_congr rfl ?_ + intro i _ + rw [norm_gradCoordToScalarL2_eq] + have hfun : (fun x => u.subAverage.grad x i) = (fun x => u.grad x i) := by + funext x + rw [H1Function.grad_subAverage] + rw [hfun] + exact hstep1.trans_eq hstep2 + -- Assemble. + calc + (eLpNorm u.subAverage.toFun 2 (volumeMeasureOn (axisCube z L))).toReal + = (u.toMeanZero).valueL2Norm := hval.symm + _ ≤ (axisCubeMeanZeroCoerciveEstimate z hL).fixedValue * (u.toMeanZero).gradientL2Norm := hb + _ ≤ (axisCubeMeanZeroCoerciveEstimate z hL).fixedValue * + ∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal := + mul_le_mul_of_nonneg_left hgrad_le hconst_nonneg + _ = unitMeanZeroPoincareConst d * L * + ∑ i : Fin d, + (eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn (axisCube z L))).toReal := by + rw [hconst]; ring + +/-! ## Translation- and cast-invariance of the `L²` realizations -/ + +/-- Translation preserves the `L²` value norm of an `H¹` witness. -/ +theorem norm_toScalarL2_untranslate_eq {U : Set (Homogenization.Vec d)} (z : Homogenization.Vec d) + (u : H1Function (translateSet z U)) : + ‖(H1Function.untranslate z u).toScalarL2‖ = ‖u.toScalarL2‖ := by + rw [norm_toScalarL2_eq, norm_toScalarL2_eq] + congr 1 + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + have hcomp := MeasureTheory.eLpNorm_comp_measurePreserving + (g := u.toFun) (p := (2 : ℝ≥0∞)) u.memL2.aestronglyMeasurable hμ + simpa [H1Function.untranslate_toFun, Function.comp, volumeMeasureOn] using! hcomp + +/-- Translation preserves the coordinate-sum gradient `L²` norm. -/ +theorem gradientCoordL2NormSum_untranslate_eq {U : Set (Homogenization.Vec d)} + (z : Homogenization.Vec d) (u : H1Function (translateSet z U)) : + (H1Function.untranslate z u).gradientCoordL2NormSum = u.gradientCoordL2NormSum := by + unfold H1Function.gradientCoordL2NormSum + refine Finset.sum_congr rfl ?_ + intro i _ + rw [norm_gradCoordToScalarL2_eq, norm_gradCoordToScalarL2_eq] + congr 1 + have hμ := measurePreserving_addRight_restrict_translateSet (d := d) z U + have hcomp := MeasureTheory.eLpNorm_comp_measurePreserving + (g := fun x => u.grad x i) (p := (2 : ℝ≥0∞)) + (u.gradMemL2 i).aestronglyMeasurable hμ + simpa [H1Function.untranslate_grad, Function.comp, volumeMeasureOn] using! hcomp + +/-- Rewriting the domain along a set equality preserves the `L²` value norm. -/ +theorem norm_toScalarL2_h10_congr {U V : Set (Homogenization.Vec d)} + (h : U = V) (w : H10Function U) : + ‖(h ▸ w).toH1Function.toScalarL2‖ = ‖w.toH1Function.toScalarL2‖ := by + cases h; rfl + +/-- Rewriting the domain along a set equality preserves the coordinate-sum +gradient norm. -/ +theorem gradientCoordL2NormSum_h10_congr {U V : Set (Homogenization.Vec d)} + (h : U = V) (w : H10Function U) : + (h ▸ w).toH1Function.gradientCoordL2NormSum = w.toH1Function.gradientCoordL2NormSum := by + cases h; rfl + +/-! ## F0(ii): scaled Dirichlet (zero-trace) Poincaré -/ + +/-- The absolute zero-trace Poincaré constant of the fixed unit corner cube. -/ +noncomputable def unitDirichletPoincareConst (d : ℕ) [NeZero d] : ℝ := + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).choose + +theorem unitDirichletPoincareConst_nonneg (d : ℕ) [NeZero d] : + 0 ≤ unitDirichletPoincareConst d := + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).choose_spec.1 + +theorem unitDirichletPoincareConst_bound {d : ℕ} [NeZero d] + (w : H10Function (axisCube (0 : Homogenization.Vec d) 1)) : + ‖w.toH1Function.toScalarL2‖ ≤ + unitDirichletPoincareConst d * w.toH1Function.gradientCoordL2NormSum := + (H10Function.exists_poincare_constant_of_isOpenBoundedConvexDomain + (isOpenBoundedConvexDomain_axisCube (0 : Homogenization.Vec d) 1)).choose_spec.2 w + +/-- **Scaled Dirichlet Poincaré on axis cubes (norm form).** + +For `w ∈ H¹₀(axisCube z L)`, the `L²` realization norm of `w` is controlled by +`C_d · L` times the coordinate-sum gradient norm of `∇w`. -/ +theorem scaled_dirichlet_poincare_norm {d : ℕ} [NeZero d] (z : Homogenization.Vec d) {L : ℝ} + (hL : 0 < L) (w : H10Function (axisCube z L)) : + ‖w.toH1Function.toScalarL2‖ ≤ + unitDirichletPoincareConst d * L * w.toH1Function.gradientCoordL2NormSum := by + have heq1 : axisCube z L = translateSet z (axisCube (0 : Homogenization.Vec d) L) := + (translateSet_axisCube_zero z L).symm + have heq2 : axisCube (0 : Homogenization.Vec d) L = L • axisCube (0 : Homogenization.Vec d) 1 := + (smul_axisCube_zero_one L hL).symm + -- Transport `w` to the fixed unit corner cube. + let w1 : H10Function (translateSet z (axisCube (0 : Homogenization.Vec d) L)) := heq1 ▸ w + let w2 : H10Function (axisCube (0 : Homogenization.Vec d) L) := H10Function.untranslate z w1 + let w3 : H10Function (L • axisCube (0 : Homogenization.Vec d) 1) := heq2 ▸ w2 + let w4 : H10Function (axisCube (0 : Homogenization.Vec d) 1) := H10Function.unscale hL w3 + have hFpos : 0 < dilationL2Factor d L := dilationL2Factor_pos (d := d) hL + -- Value-norm transport chain. + have hvalNorm : ‖w4.toH1Function.toScalarL2‖ = + dilationL2Factor d L * ‖w.toH1Function.toScalarL2‖ := by + have e1 : ‖w4.toH1Function.toScalarL2‖ = + dilationL2Factor d L * ‖w3.toH1Function.toScalarL2‖ := by + show ‖(H10Function.unscale hL w3).toH1Function.toScalarL2‖ = _ + rw [H10Function.unscale_toH1Function] + exact H1Function.norm_toScalarL2_unscale_eq hL w3.toH1Function + have e2 : ‖w3.toH1Function.toScalarL2‖ = ‖w2.toH1Function.toScalarL2‖ := + norm_toScalarL2_h10_congr heq2 w2 + have e3 : ‖w2.toH1Function.toScalarL2‖ = ‖w1.toH1Function.toScalarL2‖ := by + show ‖(H10Function.untranslate z w1).toH1Function.toScalarL2‖ = _ + rw [H10Function.untranslate_toH1Function] + exact norm_toScalarL2_untranslate_eq z w1.toH1Function + have e4 : ‖w1.toH1Function.toScalarL2‖ = ‖w.toH1Function.toScalarL2‖ := + norm_toScalarL2_h10_congr heq1 w + rw [e1, e2, e3, e4] + -- Gradient-norm transport chain. + have hgradNorm : w4.toH1Function.gradientCoordL2NormSum = + L * dilationL2Factor d L * w.toH1Function.gradientCoordL2NormSum := by + have e1 : w4.toH1Function.gradientCoordL2NormSum = + L * dilationL2Factor d L * w3.toH1Function.gradientCoordL2NormSum := by + show (H10Function.unscale hL w3).toH1Function.gradientCoordL2NormSum = _ + rw [H10Function.unscale_toH1Function] + exact H1Function.gradientCoordL2NormSum_unscale_eq hL w3.toH1Function + have e2 : w3.toH1Function.gradientCoordL2NormSum = + w2.toH1Function.gradientCoordL2NormSum := + gradientCoordL2NormSum_h10_congr heq2 w2 + have e3 : w2.toH1Function.gradientCoordL2NormSum = + w1.toH1Function.gradientCoordL2NormSum := by + show (H10Function.untranslate z w1).toH1Function.gradientCoordL2NormSum = _ + rw [H10Function.untranslate_toH1Function] + exact gradientCoordL2NormSum_untranslate_eq z w1.toH1Function + have e4 : w1.toH1Function.gradientCoordL2NormSum = + w.toH1Function.gradientCoordL2NormSum := + gradientCoordL2NormSum_h10_congr heq1 w + rw [e1, e2, e3, e4] + -- Unit-cube Dirichlet Poincaré, rescaled. + have hunit := unitDirichletPoincareConst_bound (d := d) w4 + rw [hvalNorm, hgradNorm] at hunit + -- Cancel the common positive dilation factor. + have hcancel : dilationL2Factor d L * ‖w.toH1Function.toScalarL2‖ ≤ + dilationL2Factor d L * + (unitDirichletPoincareConst d * L * w.toH1Function.gradientCoordL2NormSum) := by + calc + dilationL2Factor d L * ‖w.toH1Function.toScalarL2‖ + ≤ unitDirichletPoincareConst d * + (L * dilationL2Factor d L * w.toH1Function.gradientCoordL2NormSum) := hunit + _ = dilationL2Factor d L * + (unitDirichletPoincareConst d * L * w.toH1Function.gradientCoordL2NormSum) := by ring + exact (mul_le_mul_iff_right₀ hFpos).1 hcancel + +/-- The coordinate-sum gradient norm as a sum of `eLpNorm` `toReal`s. -/ +theorem gradientCoordL2NormSum_eq_sum_eLpNorm {U : Set (Homogenization.Vec d)} + (h : H1Function U) : + h.gradientCoordL2NormSum = + ∑ i : Fin d, (eLpNorm (fun x => h.grad x i) 2 (volumeMeasureOn U)).toReal := by + unfold H1Function.gradientCoordL2NormSum + refine Finset.sum_congr rfl ?_ + intro i _ + rw [norm_gradCoordToScalarL2_eq] + +/-- **Scaled Dirichlet Poincaré on axis cubes (`eLpNorm` form).** -/ +theorem scaled_dirichlet_poincare {d : ℕ} [NeZero d] (z : Homogenization.Vec d) {L : ℝ} + (hL : 0 < L) (w : H10Function (axisCube z L)) : + (eLpNorm w.toH1Function.toFun 2 (volumeMeasureOn (axisCube z L))).toReal + ≤ unitDirichletPoincareConst d * L * + ∑ i : Fin d, + (eLpNorm (fun x => w.toH1Function.grad x i) 2 + (volumeMeasureOn (axisCube z L))).toReal := by + have h := scaled_dirichlet_poincare_norm z hL w + rwa [norm_toScalarL2_eq, + gradientCoordL2NormSum_eq_sum_eLpNorm] at h + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/NegativeSobolev.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/NegativeSobolev.lean new file mode 100644 index 0000000000..fcf446cd70 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/NegativeSobolev.lean @@ -0,0 +1,505 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.SmoothCompactSupport +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized +public import Mathlib.MeasureTheory.Function.L1Space.Integrable + +/-! +# Normalized negative Sobolev seminorms + +The two Chapter 1 dual seminorms use the normalized pairing prescribed by +RULING-0001. The first test carrier is literally Mathlib's smooth compactly +supported test-function space; the second uses genuine weak `W^{1,p}` +witnesses with zero normalized average. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace NegativeSobolev + +variable {d : ℕ} [NeZero d] {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + +/-- The positive-finite normalized domain induced by the public convex carrier. -/ +noncomputable abbrev domain : BoundedMeasurableDomain d := + hU.toBoundedMeasurableDomain hne + +/-- The literal `C_c^∞(U)` carrier for the zero-boundary dual seminorm. -/ +abbrev SmoothTestFunction : Type _ := SmoothCompactSupportFunction hU.toOpens + +/-- The exact normalized gradient seminorm imposed on smooth tests. -/ +noncomputable def smoothTestSeminorm (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : SmoothTestFunction hU) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + (domain hU hne) p (le_of_lt hp_one) hp_top + (φ.toW1pFunction hU.toOpens p) + +/-- The smooth tests in the unit normalized gradient-seminorm ball. -/ +def SmoothTestAdmissible (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : SmoothTestFunction hU) : Prop := + smoothTestSeminorm hU hne p hp_one hp_top φ ≤ 1 + +/-- A genuine weak `W^{1,p}(U)` witness with zero normalized average. -/ +structure MeanZeroW1pTestFunction (p : ENNReal) where + /-- The weak-Sobolev function used as a mean-zero test. -/ + toW1pFunction : W1pFunction U p + normalizedIntegral_eq_zero : + ∫ x, toW1pFunction.toFun x ∂(domain hU hne).normalizedVolume = 0 + +/-- The exact normalized gradient seminorm imposed on mean-zero tests. -/ +noncomputable def meanZeroTestSeminorm (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : MeanZeroW1pTestFunction hU hne p) : ℝ := + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + (domain hU hne) p (le_of_lt hp_one) hp_top φ.toW1pFunction + +/-- The mean-zero weak tests in the unit normalized gradient-seminorm ball. -/ +def MeanZeroTestAdmissible (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : MeanZeroW1pTestFunction hU hne p) : Prop := + meanZeroTestSeminorm hU hne p hp_one hp_top φ ≤ 1 + +omit [NeZero d] in +private theorem smoothTest_memLp_normalized (p : ENNReal) (φ : SmoothTestFunction hU) : + MeasureTheory.MemLp (φ : Vec d → ℝ) p (domain hU hne).normalizedVolume := by + refine ((domain hU hne).memLp_normalizedVolume_iff p _).mpr ?_ + change MeasureTheory.MemLp (φ : Vec d → ℝ) p (MeasureTheory.volume.restrict U) + simpa only [SmoothCompactSupportFunction.toW1pFunction_toFun] using! + (φ.toW1pFunction hU.toOpens p).memLp + +omit [NeZero d] in +private theorem meanZeroTest_memLp_normalized (p : ENNReal) + (φ : MeanZeroW1pTestFunction hU hne p) : + MeasureTheory.MemLp φ.toW1pFunction.toFun p (domain hU hne).normalizedVolume := by + refine ((domain hU hne).memLp_normalizedVolume_iff p _).mpr ?_ + change MeasureTheory.MemLp φ.toW1pFunction.toFun p (MeasureTheory.volume.restrict U) + exact φ.toW1pFunction.memLp + +omit [NeZero d] in +private theorem pairing_integrable (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (g : Vec d → ℝ) (hg : MeasureTheory.MemLp g p (domain hU hne).normalizedVolume) : + MeasureTheory.Integrable (fun x => f x * g x) (domain hU hne).normalizedVolume := by + let : Fact (1 ≤ p) := ⟨le_of_lt hp_one⟩ + exact hf.integrable_mul hg + +/-- The normalized pairing `fint_U f g`. Product integrability is derived +from the two `MemLp` witnesses by Hölder, never supplied by the caller. -/ +noncomputable def normalizedPairing (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (g : Vec d → ℝ) (hg : MeasureTheory.MemLp g p (domain hU hne).normalizedVolume) : ℝ := + (domain hU hne).pairing f g + (((domain hU hne).integrable_normalizedVolume_iff _).mp + (by exact pairing_integrable hU hne p hp_one f hf g hg)) + +/-- The normalized pairing against a literal smooth compactly supported test. -/ +noncomputable def smoothPairing (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (φ : SmoothTestFunction hU) : ℝ := + normalizedPairing hU hne p hp_one f hf φ (by exact smoothTest_memLp_normalized hU hne p φ) + +/-- The normalized pairing against a genuine mean-zero weak test. -/ +noncomputable def meanZeroPairing (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (φ : MeanZeroW1pTestFunction hU hne p) : ℝ := + normalizedPairing hU hne p hp_one f hf φ.toW1pFunction.toFun + (by exact meanZeroTest_memLp_normalized hU hne p φ) + +/-- The signed Chapter 1 zero-boundary negative Sobolev seminorm. -/ +noncomputable def smoothNegativeSobolevSeminorm (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : ℝ≥0∞ := + ⨆ φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal (smoothPairing hU hne p hp_one f hf φ.1) + +/-- The signed Chapter 1 mean-zero negative Sobolev seminorm. -/ +noncomputable def meanZeroNegativeSobolevSeminorm (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : ℝ≥0∞ := + ⨆ φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal (meanZeroPairing hU hne p hp_one f hf φ.1) + +/-- The absolute-pairing form of the zero-boundary seminorm. -/ +noncomputable def smoothNegativeSobolevAbsSeminorm (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : ℝ≥0∞ := + ⨆ φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal |smoothPairing hU hne p hp_one f hf φ.1| + +/-- The absolute-pairing form of the mean-zero seminorm. -/ +noncomputable def meanZeroNegativeSobolevAbsSeminorm (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : ℝ≥0∞ := + ⨆ φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal |meanZeroPairing hU hne p hp_one f hf φ.1| + +/-! ## Transparent characterizations -/ + +theorem smoothNegativeSobolevSeminorm_eq_iSup (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + smoothNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + ⨆ φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal (smoothPairing hU hne p hp_one f hf φ.1) := + rfl + +theorem meanZeroNegativeSobolevSeminorm_eq_iSup (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + meanZeroNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + ⨆ φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal (meanZeroPairing hU hne p hp_one f hf φ.1) := + rfl + +theorem smoothNegativeSobolevAbsSeminorm_eq_iSup (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + smoothNegativeSobolevAbsSeminorm hU hne p hp_one hp_top f hf = + ⨆ φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal |smoothPairing hU hne p hp_one f hf φ.1| := + rfl + +theorem meanZeroNegativeSobolevAbsSeminorm_eq_iSup (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + meanZeroNegativeSobolevAbsSeminorm hU hne p hp_one hp_top f hf = + ⨆ φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ}, + ENNReal.ofReal |meanZeroPairing hU hne p hp_one f hf φ.1| := + rfl + +/-! ## Test-class symmetry -/ + +/-- Negate a Sobolev function and its weak gradient on the same domain. -/ +noncomputable def negW1pFunction {p : ENNReal} (u : W1pFunction U p) : + W1pFunction U p := + { toFun := -u.toFun + grad := -u.grad + memLp := by simpa using u.memLp.neg + gradMemLp := by + intro i + simpa only [Pi.neg_apply] using! (u.gradMemLp i).neg + hasWeakGradient := by + intro i φ hφ_smooth hφ_compact hφ_sub + calc + ∫ x in U, -u.toFun x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = -∫ x in U, u.toFun x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_neg] + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun x => by ring + _ = ∫ x in U, u.grad x i * φ x ∂MeasureTheory.volume := by + rw [u.hasWeakGradient i φ hφ_smooth hφ_compact hφ_sub] + simp + _ = -∫ x in U, (-u.grad x i) * φ x ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_neg] + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun x => by ring } + +/-- The zero Sobolev function with its zero weak gradient. -/ +noncomputable def zeroW1pFunction (p : ENNReal) : W1pFunction U p := + { toFun := 0 + grad := 0 + memLp := by simp + gradMemLp := by intro i; simp + hasWeakGradient := by intro i φ hφ_smooth hφ_compact hφ_sub; simp } + +private theorem normalizedW1pSeminorm_negW1pFunction {p : ENNReal} + (hp_one : 1 < p) (hp_top : p ≠ ∞) (u : W1pFunction U p) : + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + (domain hU hne) p (le_of_lt hp_one) hp_top + (negW1pFunction u) = + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + (domain hU hne) p (le_of_lt hp_one) hp_top u := by + unfold BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + unfold BoundedMeasurableDomain.normalizedEuclideanLpNorm + have hgrad : + (fun x => euclideanNorm ((negW1pFunction u).grad x)) = + fun x => euclideanNorm (u.grad x) := by + funext x + simp [negW1pFunction, euclideanNorm_neg] + exact (domain hU hne).normalizedLpNorm_congr_ae p + ((negW1pFunction u).gradEuclideanMemLp (domain hU hne) p) + (u.gradEuclideanMemLp (domain hU hne) p) + (Filter.Eventually.of_forall (congrFun hgrad)) + +private theorem smoothTestSeminorm_neg (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : SmoothTestFunction hU) : + smoothTestSeminorm hU hne p hp_one hp_top (-φ) = + smoothTestSeminorm hU hne p hp_one hp_top φ := by + unfold smoothTestSeminorm BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + unfold BoundedMeasurableDomain.normalizedEuclideanLpNorm + have hgrad : + (fun x => euclideanNorm (((-φ).toW1pFunction hU.toOpens p).grad x)) = + fun x => euclideanNorm ((φ.toW1pFunction hU.toOpens p).grad x) := by + funext x + rw [SmoothCompactSupportFunction.toW1pFunction_grad, + SmoothCompactSupportFunction.gradient_neg, + SmoothCompactSupportFunction.toW1pFunction_grad] + exact euclideanNorm_neg _ + simp only [hgrad] + +/-- Zero belongs to the literal smooth test carrier. -/ +noncomputable def smoothTestZero : SmoothTestFunction hU := 0 + +theorem smoothTestAdmissible_zero (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) : + SmoothTestAdmissible hU hne p hp_one hp_top (smoothTestZero hU) := by + change smoothTestSeminorm hU hne p hp_one hp_top (0 : SmoothTestFunction hU) ≤ 1 + unfold smoothTestSeminorm BoundedMeasurableDomain.NormalizedW1pKernel.seminorm + unfold BoundedMeasurableDomain.normalizedEuclideanLpNorm + have hgrad : (0 : SmoothTestFunction hU).gradient = 0 := by + ext x i + change (fderiv ℝ (0 : Vec d → ℝ) x) (basisVec i) = 0 + simp + simp [hgrad, BoundedMeasurableDomain.normalizedLpNorm, + BoundedMeasurableDomain.normalizedLpFiniteENorm, + BoundedMeasurableDomain.normalizedLpENorm, + ne_of_gt (lt_trans zero_lt_one hp_one), hp_top] + change (MeasureTheory.eLpNorm' (0 : Vec d → ℝ) p.toReal + (domain hU hne).normalizedVolume).toReal ≤ 1 + rw [MeasureTheory.eLpNorm'_zero (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one hp_one)) hp_top)] + norm_num + +theorem smoothTestAdmissible_neg (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + {φ : SmoothTestFunction hU} (hφ : SmoothTestAdmissible hU hne p hp_one hp_top φ) : + SmoothTestAdmissible hU hne p hp_one hp_top (-φ) := by + change smoothTestSeminorm hU hne p hp_one hp_top (-φ) ≤ 1 + rw [smoothTestSeminorm_neg hU hne p hp_one hp_top] + exact hφ + +/-- Negation preserves genuine mean-zero weak tests. -/ +noncomputable def MeanZeroW1pTestFunction.neg {p : ENNReal} + (φ : MeanZeroW1pTestFunction hU hne p) : MeanZeroW1pTestFunction hU hne p where + toW1pFunction := negW1pFunction φ.toW1pFunction + normalizedIntegral_eq_zero := by + change ∫ x, -φ.toW1pFunction.toFun x ∂(domain hU hne).normalizedVolume = 0 + rw [MeasureTheory.integral_neg, φ.normalizedIntegral_eq_zero, neg_zero] + +theorem meanZeroTestSeminorm_neg (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + (φ : MeanZeroW1pTestFunction hU hne p) : + meanZeroTestSeminorm hU hne p hp_one hp_top φ.neg = + meanZeroTestSeminorm hU hne p hp_one hp_top φ := + normalizedW1pSeminorm_negW1pFunction hU hne hp_one hp_top φ.toW1pFunction + +/-- Zero belongs to the mean-zero weak test carrier. -/ +noncomputable def MeanZeroW1pTestFunction.zero (p : ENNReal) : + MeanZeroW1pTestFunction hU hne p where + toW1pFunction := zeroW1pFunction p + normalizedIntegral_eq_zero := by simp [zeroW1pFunction] + +theorem meanZeroTestAdmissible_zero (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) : + MeanZeroTestAdmissible hU hne p hp_one hp_top + (MeanZeroW1pTestFunction.zero hU hne p) := by + change meanZeroTestSeminorm hU hne p hp_one hp_top + (MeanZeroW1pTestFunction.zero hU hne p) ≤ 1 + simp [meanZeroTestSeminorm, MeanZeroW1pTestFunction.zero, zeroW1pFunction, + BoundedMeasurableDomain.NormalizedW1pKernel.seminorm, + BoundedMeasurableDomain.normalizedEuclideanLpNorm, + BoundedMeasurableDomain.normalizedLpNorm, + BoundedMeasurableDomain.normalizedLpFiniteENorm, + BoundedMeasurableDomain.normalizedLpENorm, + ne_of_gt (lt_trans zero_lt_one hp_one), hp_top] + change (MeasureTheory.eLpNorm' (0 : Vec d → ℝ) p.toReal + (domain hU hne).normalizedVolume).toReal ≤ 1 + rw [MeasureTheory.eLpNorm'_zero (ENNReal.toReal_pos + (ne_of_gt (lt_trans zero_lt_one hp_one)) hp_top)] + norm_num + +theorem meanZeroTestAdmissible_neg (p : ENNReal) (hp_one : 1 < p) (hp_top : p ≠ ∞) + {φ : MeanZeroW1pTestFunction hU hne p} + (hφ : MeanZeroTestAdmissible hU hne p hp_one hp_top φ) : + MeanZeroTestAdmissible hU hne p hp_one hp_top φ.neg := by + change meanZeroTestSeminorm hU hne p hp_one hp_top φ.neg ≤ 1 + rw [meanZeroTestSeminorm_neg hU hne p hp_one hp_top] + exact hφ + +/-! ## Pairing symmetry and absolute-value characterizations -/ + +omit [NeZero d] in +theorem normalizedPairing_neg_right (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (g : Vec d → ℝ) (hg : MeasureTheory.MemLp g p (domain hU hne).normalizedVolume) : + normalizedPairing hU hne p hp_one f hf (-g) hg.neg = + -normalizedPairing hU hne p hp_one f hf g hg := by + unfold normalizedPairing BoundedMeasurableDomain.pairing BoundedMeasurableDomain.average + rw [← MeasureTheory.integral_neg] + apply MeasureTheory.integral_congr_ae + exact Filter.Eventually.of_forall fun x => by simp only [Pi.neg_apply]; ring + +omit [NeZero d] in +theorem smoothPairing_neg (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (φ : SmoothTestFunction hU) : + smoothPairing hU hne p hp_one f hf (-φ) = + -smoothPairing hU hne p hp_one f hf φ := by + unfold smoothPairing + change normalizedPairing hU hne p hp_one f hf (-(φ : Vec d → ℝ)) _ = + -normalizedPairing hU hne p hp_one f hf (φ : Vec d → ℝ) _ + exact normalizedPairing_neg_right hU hne p hp_one f hf (φ : Vec d → ℝ) _ + +omit [NeZero d] in +theorem meanZeroPairing_neg (p : ENNReal) (hp_one : 1 < p) + (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (φ : MeanZeroW1pTestFunction hU hne p) : + meanZeroPairing hU hne p hp_one f hf φ.neg = + -meanZeroPairing hU hne p hp_one f hf φ := by + unfold meanZeroPairing + change normalizedPairing hU hne p hp_one f hf (-φ.toW1pFunction.toFun) _ = + -normalizedPairing hU hne p hp_one f hf φ.toW1pFunction.toFun _ + exact normalizedPairing_neg_right hU hne p hp_one f hf φ.toW1pFunction.toFun _ + +private noncomputable def smoothAdmissibleNeg (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) + (φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ}) : + {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ} := + ⟨-φ.1, smoothTestAdmissible_neg hU hne p hp_one hp_top φ.2⟩ + +private noncomputable def meanZeroAdmissibleNeg (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) + (φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ}) : + {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ} := + ⟨φ.1.neg, meanZeroTestAdmissible_neg hU hne p hp_one hp_top φ.2⟩ + +private theorem iSup_ofReal_eq_iSup_ofReal_abs {α : Type*} (q : α → ℝ) + (neg : α → α) (hneg : ∀ a, q (neg a) = -q a) : + (⨆ a, ENNReal.ofReal (q a)) = ⨆ a, ENNReal.ofReal |q a| := by + apply le_antisymm + · refine iSup_le fun a => ?_ + exact (ENNReal.ofReal_le_ofReal (le_abs_self (q a))).trans (le_iSup (fun a => + ENNReal.ofReal |q a|) a) + · refine iSup_le fun a => ?_ + by_cases ha : 0 ≤ q a + · rw [abs_of_nonneg ha] + exact le_iSup (fun a => ENNReal.ofReal (q a)) a + · rw [abs_of_neg (lt_of_not_ge ha), ← hneg a] + exact le_iSup (fun a => ENNReal.ofReal (q a)) (neg a) + +theorem smoothNegativeSobolevSeminorm_eq_abs (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + smoothNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + smoothNegativeSobolevAbsSeminorm hU hne p hp_one hp_top f hf := by + exact iSup_ofReal_eq_iSup_ofReal_abs + (fun φ : {φ : SmoothTestFunction hU // SmoothTestAdmissible hU hne p hp_one hp_top φ} => + smoothPairing hU hne p hp_one f hf φ.1) + (smoothAdmissibleNeg hU hne p hp_one hp_top) + (fun φ => by + change smoothPairing hU hne p hp_one f hf (-φ.1) = + -smoothPairing hU hne p hp_one f hf φ.1 + exact smoothPairing_neg hU hne p hp_one f hf φ.1) + +theorem meanZeroNegativeSobolevSeminorm_eq_abs (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) : + meanZeroNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + meanZeroNegativeSobolevAbsSeminorm hU hne p hp_one hp_top f hf := by + exact iSup_ofReal_eq_iSup_ofReal_abs + (fun φ : {φ : MeanZeroW1pTestFunction hU hne p // + MeanZeroTestAdmissible hU hne p hp_one hp_top φ} => + meanZeroPairing hU hne p hp_one f hf φ.1) + (meanZeroAdmissibleNeg hU hne p hp_one hp_top) + (fun φ => by + change meanZeroPairing hU hne p hp_one f hf φ.1.neg = + -meanZeroPairing hU hne p hp_one f hf φ.1 + exact meanZeroPairing_neg hU hne p hp_one f hf φ.1) + +/-! ## Almost-everywhere invariance -/ + +omit [NeZero d] in +theorem normalizedPairing_congr_ae (p : ENNReal) (hp_one : 1 < p) + (f f' : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hf' : MeasureTheory.MemLp f' (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hff' : f =ᵐ[(domain hU hne).normalizedVolume] f') + (g : Vec d → ℝ) (hg : MeasureTheory.MemLp g p (domain hU hne).normalizedVolume) : + normalizedPairing hU hne p hp_one f hf g hg = + normalizedPairing hU hne p hp_one f' hf' g hg := by + unfold normalizedPairing BoundedMeasurableDomain.pairing BoundedMeasurableDomain.average + apply MeasureTheory.integral_congr_ae + filter_upwards [hff'] with x hx + rw [hx] + +omit [NeZero d] in +theorem smoothPairing_congr_ae (p : ENNReal) (hp_one : 1 < p) + (f f' : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hf' : MeasureTheory.MemLp f' (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hff' : f =ᵐ[(domain hU hne).normalizedVolume] f') + (φ : SmoothTestFunction hU) : + smoothPairing hU hne p hp_one f hf φ = smoothPairing hU hne p hp_one f' hf' φ := by + unfold smoothPairing + exact normalizedPairing_congr_ae hU hne p hp_one f f' hf hf' hff' φ _ + +omit [NeZero d] in +theorem meanZeroPairing_congr_ae (p : ENNReal) (hp_one : 1 < p) + (f f' : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hf' : MeasureTheory.MemLp f' (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hff' : f =ᵐ[(domain hU hne).normalizedVolume] f') + (φ : MeanZeroW1pTestFunction hU hne p) : + meanZeroPairing hU hne p hp_one f hf φ = meanZeroPairing hU hne p hp_one f' hf' φ := by + unfold meanZeroPairing + exact normalizedPairing_congr_ae hU hne p hp_one f f' hf hf' hff' φ.toW1pFunction.toFun _ + +theorem smoothNegativeSobolevSeminorm_congr_ae (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f f' : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hf' : MeasureTheory.MemLp f' (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hff' : f =ᵐ[(domain hU hne).normalizedVolume] f') : + smoothNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + smoothNegativeSobolevSeminorm hU hne p hp_one hp_top f' hf' := by + unfold smoothNegativeSobolevSeminorm + apply iSup_congr + intro φ + rw [smoothPairing_congr_ae hU hne p hp_one f f' hf hf' hff' φ.1] + +theorem meanZeroNegativeSobolevSeminorm_congr_ae (p : ENNReal) (hp_one : 1 < p) + (hp_top : p ≠ ∞) (f f' : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hf' : MeasureTheory.MemLp f' (ENNReal.conjExponent p) (domain hU hne).normalizedVolume) + (hff' : f =ᵐ[(domain hU hne).normalizedVolume] f') : + meanZeroNegativeSobolevSeminorm hU hne p hp_one hp_top f hf = + meanZeroNegativeSobolevSeminorm hU hne p hp_one hp_top f' hf' := by + unfold meanZeroNegativeSobolevSeminorm + apply iSup_congr + intro φ + rw [meanZeroPairing_congr_ae hU hne p hp_one f f' hf hf' hff' φ.1] + +/-! ## The distinct `p = 2` aliases -/ + +/-- The normalized zero-boundary `H^{-1}` seminorm. -/ +noncomputable abbrev smoothNegativeHMinusOneSeminorm (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent (2 : ENNReal)) + (domain hU hne).normalizedVolume) : ℝ≥0∞ := + smoothNegativeSobolevSeminorm hU hne 2 (by norm_num) (by norm_num) f hf + +/-- The normalized mean-zero `H^{-1}` seminorm. -/ +noncomputable abbrev meanZeroNegativeHMinusOneSeminorm (f : Vec d → ℝ) + (hf : MeasureTheory.MemLp f (ENNReal.conjExponent (2 : ENNReal)) + (domain hU hne).normalizedVolume) : ℝ≥0∞ := + meanZeroNegativeSobolevSeminorm hU hne 2 (by norm_num) (by norm_num) f hf + +end NegativeSobolev + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/NormalizedLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/NormalizedLp.lean new file mode 100644 index 0000000000..ba5e882b32 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/NormalizedLp.lean @@ -0,0 +1,212 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Euclidean +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedMeasurableDomain + +/-! +# Normalized `L^p` quantities on bounded measurable domains + +The normalized measure of a `BoundedMeasurableDomain` is the mathematical +meaning of the manuscript notation `fint_U`. Extended norms are kept in +`ℝ≥0∞`; a finite real value is exposed only together with a `MemLp` witness. +The ambient `Vec d` norm remains untouched: the Euclidean vector lane below +uses the explicit function `euclideanNorm`. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace BoundedMeasurableDomain + +/-- The extended normalized `L^p` seminorm, with respect to normalized volume. -/ +noncomputable def normalizedLpENorm {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [ENorm E] (p : ℝ≥0∞) (f : Vec d → E) : ℝ≥0∞ := + if p = 0 then 0 else if p = ∞ then + MeasureTheory.eLpNormEssSup f U.normalizedVolume + else MeasureTheory.eLpNorm' f p.toReal U.normalizedVolume + +/-- On measurable representatives the manuscript seminorm agrees with Mathlib's +`eLpNorm`. The explicit moment definition also preserves the manuscript's essential +supremum for arbitrary representatives, without imposing a measurability convention. -/ +theorem normalizedLpENorm_eq_eLpNorm {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ENorm E] (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.AEStronglyMeasurable f U.normalizedVolume) : + U.normalizedLpENorm p f = MeasureTheory.eLpNorm f p U.normalizedVolume := by + simp only [normalizedLpENorm, MeasureTheory.eLpNorm, hf, ite_true] + +/-- Membership in `L^p` is unchanged by the strictly positive finite volume normalization. -/ +theorem memLp_normalizedVolume_iff {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) (f : Vec d → E) : + MeasureTheory.MemLp f p U.normalizedVolume ↔ + MeasureTheory.MemLp f p U.restrictedVolume := by + constructor + · intro hf + have hrestricted : U.restrictedVolume = + MeasureTheory.volume (U : Set (Vec d)) • U.normalizedVolume := by + simp [normalizedVolume, smul_smul, ENNReal.mul_inv_cancel U.volume_ne_zero U.volume_ne_top] + rw [hrestricted] + exact hf.smul_measure U.volume_ne_top + · intro hf + change MeasureTheory.MemLp f p + ((MeasureTheory.volume (U : Set (Vec d)))⁻¹ • U.restrictedVolume) + exact hf.smul_measure (ENNReal.inv_ne_top.2 U.volume_ne_zero) + +/-- The normalized extended norm, packaged with the finiteness supplied by `MemLp`. -/ +noncomputable def normalizedLpFiniteENorm {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p U.normalizedVolume) : + {q : ℝ≥0∞ // q ≠ ∞} := + ⟨U.normalizedLpENorm p f, by + rw [U.normalizedLpENorm_eq_eLpNorm p f hf.aestronglyMeasurable] + exact hf.eLpNorm_ne_top⟩ + +/-- The finite real normalized `L^p` value certified by a `MemLp` witness. -/ +noncomputable def normalizedLpNorm {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p U.normalizedVolume) : ℝ := + (U.normalizedLpFiniteENorm p f hf).1.toReal + +/-- The extended normalized `L^p` value depends only on the normalized-volume +almost-everywhere representative. -/ +theorem normalizedLpENorm_congr_ae {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [ENorm E] (p : ℝ≥0∞) {f g : Vec d → E} + (hfg : f =ᵐ[U.normalizedVolume] g) : + U.normalizedLpENorm p f = U.normalizedLpENorm p g := by + unfold normalizedLpENorm + rw [MeasureTheory.eLpNormEssSup_congr_ae hfg, MeasureTheory.eLpNorm'_congr_ae hfg] + +/-- A proof-carrying finite normalized `L^p` value depends only on the +normalized-volume almost-everywhere representative. -/ +theorem normalizedLpNorm_congr_ae {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) + {f g : Vec d → E} (hf : MeasureTheory.MemLp f p U.normalizedVolume) + (hg : MeasureTheory.MemLp g p U.normalizedVolume) + (hfg : f =ᵐ[U.normalizedVolume] g) : + U.normalizedLpNorm p f hf = U.normalizedLpNorm p g hg := by + exact congrArg ENNReal.toReal (U.normalizedLpENorm_congr_ae p hfg) + +theorem normalizedLpFiniteENorm_value {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p U.normalizedVolume) : + (U.normalizedLpFiniteENorm p f hf).1 = U.normalizedLpENorm p f := + rfl + +theorem normalizedLpFiniteENorm_ne_top {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [TopologicalSpace E] [ContinuousENorm E] (p : ℝ≥0∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p U.normalizedVolume) : + (U.normalizedLpFiniteENorm p f hf).1 ≠ ∞ := + (U.normalizedLpFiniteENorm p f hf).2 + +/-- The `p`-moment with respect to normalized volume. Its use in the finite- +`p` characterization below is justified by the accompanying `MemLp` witness. -/ +noncomputable def normalizedLpMoment {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [NormedAddCommGroup E] (p : ℝ≥0∞) (f : Vec d → E) : ℝ := + ∫ x, ‖f x‖ ^ p.toReal ∂U.normalizedVolume + +/-- The normalized `p`-moment depends only on the normalized-volume +almost-everywhere representative. -/ +theorem normalizedLpMoment_congr_ae {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [NormedAddCommGroup E] (p : ℝ≥0∞) {f g : Vec d → E} + (hfg : f =ᵐ[U.normalizedVolume] g) : + U.normalizedLpMoment p f = U.normalizedLpMoment p g := by + unfold normalizedLpMoment + apply MeasureTheory.integral_congr_ae + filter_upwards [hfg] with x hx + rw [hx] + +/-- For finite `p ≥ 1`, the normalized real norm is exactly the manuscript +quantity `(fint_U ‖f‖^p)^(1/p)`. -/ +theorem normalizedLpNorm_eq_normalizedLpMoment_rpow {d : ℕ} + (U : BoundedMeasurableDomain d) {E : Type*} [NormedAddCommGroup E] + (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) (f : Vec d → E) + (hf : MeasureTheory.MemLp f p U.normalizedVolume) : + U.normalizedLpNorm p f hf = (U.normalizedLpMoment p f) ^ p.toReal⁻¹ := by + have hp_zero : p ≠ 0 := by + exact ne_of_gt (lt_of_lt_of_le zero_lt_one hp_one) + change (U.normalizedLpENorm p f).toReal = (U.normalizedLpMoment p f) ^ p.toReal⁻¹ + rw [U.normalizedLpENorm_eq_eLpNorm p f hf.aestronglyMeasurable] + rw [hf.eLpNorm_eq_integral_rpow_norm hp_zero hp_top] + change + (ENNReal.ofReal ((∫ x, ‖f x‖ ^ p.toReal ∂U.normalizedVolume) ^ p.toReal⁻¹)).toReal = + (∫ x, ‖f x‖ ^ p.toReal ∂U.normalizedVolume) ^ p.toReal⁻¹ + exact ENNReal.toReal_ofReal <| Real.rpow_nonneg + (MeasureTheory.integral_nonneg fun x => Real.rpow_nonneg (norm_nonneg (f x)) _) _ + +/-- At `p = ∞`, the normalized extended norm is Mathlib's essential supremum. -/ +theorem normalizedLpENorm_top_eq_essSup {d : ℕ} (U : BoundedMeasurableDomain d) + {E : Type*} [ENorm E] (f : Vec d → E) : + U.normalizedLpENorm ∞ f = + essSup (fun x => ‖f x‖ₑ) U.normalizedVolume := by + simp [normalizedLpENorm, MeasureTheory.eLpNormEssSup_eq_essSup_enorm] + +/-- The explicit Euclidean extended `L^p` value of a vector-valued function. +This does not change the global norm instance on `Vec d`. -/ +noncomputable def normalizedEuclideanLpENorm {d n : ℕ} (U : BoundedMeasurableDomain d) + (p : ℝ≥0∞) (f : Vec d → Vec n) : ℝ≥0∞ := + U.normalizedLpENorm p (fun x => euclideanNorm (f x)) + +/-- The finite Euclidean normalized `L^p` value certified by `MemLp`. -/ +noncomputable def normalizedEuclideanLpNorm {d n : ℕ} (U : BoundedMeasurableDomain d) + (p : ℝ≥0∞) (f : Vec d → Vec n) + (hf : MeasureTheory.MemLp (fun x => euclideanNorm (f x)) p U.normalizedVolume) : ℝ := + U.normalizedLpNorm p (fun x => euclideanNorm (f x)) hf + +/-- The extended Euclidean normalized `L^p` value depends only on the +normalized-volume almost-everywhere representative. -/ +theorem normalizedEuclideanLpENorm_congr_ae {d n : ℕ} (U : BoundedMeasurableDomain d) + (p : ℝ≥0∞) {f g : Vec d → Vec n} + (hfg : f =ᵐ[U.normalizedVolume] g) : + U.normalizedEuclideanLpENorm p f = U.normalizedEuclideanLpENorm p g := by + unfold normalizedEuclideanLpENorm + apply U.normalizedLpENorm_congr_ae + filter_upwards [hfg] with x hx + rw [hx] + +/-- A proof-carrying finite Euclidean normalized `L^p` value depends only on +the normalized-volume almost-everywhere representative. -/ +theorem normalizedEuclideanLpNorm_congr_ae {d n : ℕ} (U : BoundedMeasurableDomain d) + (p : ℝ≥0∞) {f g : Vec d → Vec n} + (hf : MeasureTheory.MemLp (fun x => euclideanNorm (f x)) p U.normalizedVolume) + (hg : MeasureTheory.MemLp (fun x => euclideanNorm (g x)) p U.normalizedVolume) + (hfg : f =ᵐ[U.normalizedVolume] g) : + U.normalizedEuclideanLpNorm p f hf = U.normalizedEuclideanLpNorm p g hg := by + unfold normalizedEuclideanLpNorm + apply U.normalizedLpNorm_congr_ae + filter_upwards [hfg] with x hx + rw [hx] + +/-- For finite `p ≥ 1`, the Euclidean vector lane has the exact normalized +moment formula from the manuscript. -/ +theorem normalizedEuclideanLpNorm_eq_integral_rpow {d n : ℕ} + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (f : Vec d → Vec n) + (hf : MeasureTheory.MemLp (fun x => euclideanNorm (f x)) p U.normalizedVolume) : + U.normalizedEuclideanLpNorm p f hf = + (∫ x, euclideanNorm (f x) ^ p.toReal ∂U.normalizedVolume) ^ p.toReal⁻¹ := by + rw [normalizedEuclideanLpNorm, + U.normalizedLpNorm_eq_normalizedLpMoment_rpow p hp_one hp_top] + simp only [normalizedLpMoment, Real.norm_eq_abs, abs_of_nonneg (euclideanNorm_nonneg _)] + +/-- At `p = ∞`, the Euclidean vector lane is the essential supremum of the +explicit Euclidean magnitude. -/ +theorem normalizedEuclideanLpENorm_top_eq_essSup {d n : ℕ} + (U : BoundedMeasurableDomain d) (f : Vec d → Vec n) : + U.normalizedEuclideanLpENorm ∞ f = + essSup (fun x => ENNReal.ofReal (euclideanNorm (f x))) + U.normalizedVolume := by + rw [normalizedEuclideanLpENorm, U.normalizedLpENorm_top_eq_essSup] + congr with x + exact Real.enorm_eq_ofReal (euclideanNorm_nonneg _) + +end BoundedMeasurableDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidal.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidal.lean new file mode 100644 index 0000000000..650bd6fd63 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidal.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1 + +/-! # Potential Solenoidal -/ + +@[expose] public section + +namespace Homogenization + +def IsPotentialOn {d : ℕ} (U : Set (Vec d)) (f : Vec d → Vec d) : Prop := + ∃ u : H1Function U, u.grad = f + +def IsPotentialZeroTraceOn {d : ℕ} (U : Set (Vec d)) (f : Vec d → Vec d) : Prop := + ∃ u : H10Function U, u.toH1Function.grad = f + +noncomputable def IsSolenoidalOn {d : ℕ} (U : Set (Vec d)) (g : Vec d → Vec d) : Prop := + ∀ φ : H10Function U, + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = 0 + +noncomputable def IsSolenoidalZeroNormalTraceOn {d : ℕ} (U : Set (Vec d)) + (g : Vec d → Vec d) : Prop := + ∀ φ : H1Function U, + ∫ x in U, vecDot (g x) (φ.grad x) ∂MeasureTheory.volume = 0 + +theorem H1Function.isPotentialOn {d : ℕ} {U : Set (Vec d)} (u : H1Function U) : + IsPotentialOn U u.grad := + ⟨u, rfl⟩ + +theorem H10Function.isPotentialZeroTraceOn {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : + IsPotentialZeroTraceOn U u.toH1Function.grad := + ⟨u, rfl⟩ + +/-- The zero-trace potential predicate is insensitive to changing the vector +field on a null set. This is the representative bridge needed when moving from +closed `L²` subspaces back to witness-based Sobolev predicates. -/ +theorem IsPotentialZeroTraceOn.congr_ae {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} + (hfg : f =ᵐ[MeasureTheory.volume.restrict U] g) + (hf : IsPotentialZeroTraceOn U f) : + IsPotentialZeroTraceOn U g := by + rcases hf with ⟨u, hgrad⟩ + have hug : u.toH1Function.grad =ᵐ[MeasureTheory.volume.restrict U] g := by + simpa [hgrad] using hfg + let vH1 : H1Function U := + { toFun := u.toH1Function.toFun + grad := g + memL2 := u.toH1Function.memL2 + gradMemL2 := by + intro i + have hcoord : + (fun x => u.toH1Function.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := + hug.mono fun x hx => congrArg (fun y : Vec d => y i) hx + exact (u.toH1Function.gradMemL2 i).ae_eq hcoord + hasWeakGradient := by + intro i φ hφ hφ_supp hφ_sub + have hcoord : + (fun x => u.toH1Function.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := + hug.mono fun x hx => congrArg (fun y : Vec d => y i) hx + have hright : + ∫ x in U, g x i * φ x ∂MeasureTheory.volume = + ∫ x in U, u.toH1Function.grad x i * φ x ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [hcoord] with x hx + rw [← hx] + calc + ∫ x in U, u.toH1Function.toFun x * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume + = -∫ x in U, u.toH1Function.grad x i * φ x ∂MeasureTheory.volume := by + exact u.toH1Function.hasWeakGradient i φ hφ hφ_supp hφ_sub + _ = -∫ x in U, g x i * φ x ∂MeasureTheory.volume := by rw [hright] } + let v : H10Function U := + { toH1Function := vH1 + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := u.approx_support_subset + tendsto_approx := by + simpa [vH1] using u.tendsto_approx + tendsto_approx_grad := by + intro i + have hcoord : + (fun x => u.toH1Function.grad x i) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g x i := + hug.mono fun x hx => congrArg (fun y : Vec d => y i) hx + have hnorm : + (fun n => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - g x i) 2 + (MeasureTheory.volume.restrict U)) = + fun n => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) 2 + (MeasureTheory.volume.restrict U) := by + funext n + exact MeasureTheory.eLpNorm_congr_ae <| + hcoord.mono fun x hx => by + change + (fderiv ℝ (u.approx n) x) (basisVec i) - g x i = + (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i + have hx' : u.toH1Function.grad x i = g x i := hx + rw [← hx'] + rw [hnorm] + exact u.tendsto_approx_grad i } + exact ⟨v, rfl⟩ + +theorem IsPotentialZeroTraceOn.isPotentialOn {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) : IsPotentialOn U f := by + rcases hf with ⟨u, rfl⟩ + exact u.toH1Function.isPotentialOn + +theorem isPotentialOn_zero {d : ℕ} {U : Set (Vec d)} : + IsPotentialOn U (0 : Vec d → Vec d) := + (0 : H1Function U).isPotentialOn + +theorem isPotentialOn_add {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : IsPotentialOn U f) (hg : IsPotentialOn U g) : + IsPotentialOn U (f + g) := by + rcases hf with ⟨u, rfl⟩ + rcases hg with ⟨v, rfl⟩ + exact (u + v).isPotentialOn + +theorem isPotentialOn_smul {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialOn U f) (c : ℝ) : + IsPotentialOn U (c • f) := by + rcases hf with ⟨u, rfl⟩ + exact (c • u).isPotentialOn + +theorem isPotentialZeroTraceOn_zero {d : ℕ} {U : Set (Vec d)} : + IsPotentialZeroTraceOn U (0 : Vec d → Vec d) := + (0 : H10Function U).isPotentialZeroTraceOn + +theorem isPotentialZeroTraceOn_add {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) (hg : IsPotentialZeroTraceOn U g) : + IsPotentialZeroTraceOn U (f + g) := by + rcases hf with ⟨u, rfl⟩ + rcases hg with ⟨v, rfl⟩ + exact (u + v).isPotentialZeroTraceOn + +theorem isPotentialZeroTraceOn_smul {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) (c : ℝ) : + IsPotentialZeroTraceOn U (c • f) := by + rcases hf with ⟨u, rfl⟩ + exact (c • u).isPotentialZeroTraceOn + +theorem isPotentialOn_of_contDiff {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {u : Vec d → ℝ} (hu : ContDiff ℝ 1 u) (hu_supp : HasCompactSupport u) : + IsPotentialOn U (fun x i => (fderiv ℝ u x) (basisVec i)) := + (H1Function.ofContDiff hU hu hu_supp).isPotentialOn + +theorem isPotentialZeroTraceOn_of_contDiff {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hu_supp : HasCompactSupport u) (hu_sub : tsupport u ⊆ U) : + IsPotentialZeroTraceOn U (fun x i => (fderiv ℝ u x) (basisVec i)) := + (H10Function.ofContDiff hU hu hu_supp hu_sub).isPotentialZeroTraceOn + +theorem isSolenoidalOn_zero {d : ℕ} {U : Set (Vec d)} : + IsSolenoidalOn U (0 : Vec d → Vec d) := by + intro φ + simp [vecDot] + +theorem isSolenoidalOn_add {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : IsSolenoidalOn U f) (hg : IsSolenoidalOn U g) + (hf_int : ∀ φ : H10Function U, + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (φ.toH1Function.grad x)) U) + (hg_int : ∀ φ : H10Function U, + MeasureTheory.IntegrableOn (fun x => vecDot (g x) (φ.toH1Function.grad x)) U) : + IsSolenoidalOn U (f + g) := by + intro φ + rw [show (fun x => vecDot ((f + g) x) (φ.toH1Function.grad x)) = + fun x => vecDot (f x) (φ.toH1Function.grad x) + vecDot (g x) (φ.toH1Function.grad x) by + funext x + simp [vecDot, Finset.sum_add_distrib, add_mul]] + rw [MeasureTheory.integral_add (hf_int φ) (hg_int φ), hf φ, hg φ] + simp + +theorem isSolenoidalOn_smul {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : IsSolenoidalOn U g) (c : ℝ) : + IsSolenoidalOn U (c • g) := by + intro φ + rw [show (fun x => vecDot ((c • g) x) (φ.toH1Function.grad x)) = + fun x => c * vecDot (g x) (φ.toH1Function.grad x) by + funext x + simp [vecDot, Finset.mul_sum, mul_assoc]] + rw [MeasureTheory.integral_const_mul] + simp [hg φ] + +theorem isSolenoidalZeroNormalTraceOn_zero {d : ℕ} {U : Set (Vec d)} : + IsSolenoidalZeroNormalTraceOn U (0 : Vec d → Vec d) := by + intro φ + simp [vecDot] + +theorem isSolenoidalZeroNormalTraceOn_add {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : IsSolenoidalZeroNormalTraceOn U f) (hg : IsSolenoidalZeroNormalTraceOn U g) + (hf_int : ∀ φ : H1Function U, + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (φ.grad x)) U) + (hg_int : ∀ φ : H1Function U, + MeasureTheory.IntegrableOn (fun x => vecDot (g x) (φ.grad x)) U) : + IsSolenoidalZeroNormalTraceOn U (f + g) := by + intro φ + rw [show (fun x => vecDot ((f + g) x) (φ.grad x)) = + fun x => vecDot (f x) (φ.grad x) + vecDot (g x) (φ.grad x) by + funext x + simp [vecDot, Finset.sum_add_distrib, add_mul]] + rw [MeasureTheory.integral_add (hf_int φ) (hg_int φ), hf φ, hg φ] + simp + +theorem isSolenoidalZeroNormalTraceOn_smul {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn U g) (c : ℝ) : + IsSolenoidalZeroNormalTraceOn U (c • g) := by + intro φ + rw [show (fun x => vecDot ((c • g) x) (φ.grad x)) = + fun x => c * vecDot (g x) (φ.grad x) by + funext x + simp [vecDot, Finset.mul_sum, mul_assoc]] + rw [MeasureTheory.integral_const_mul] + simp [hg φ] + +theorem IsSolenoidalOn.test_of_contDiff {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : IsSolenoidalOn U g) (hU : IsOpen U) + {u : Vec d → ℝ} (hu : ContDiff ℝ (⊤ : ℕ∞) u) + (hu_supp : HasCompactSupport u) (hu_sub : tsupport u ⊆ U) : + ∫ x in U, vecDot (g x) (fun i => (fderiv ℝ u x) (basisVec i)) ∂MeasureTheory.volume = 0 := by + simpa [H10Function.ofContDiff, H1Function.ofContDiff] using + hg (H10Function.ofContDiff hU hu hu_supp hu_sub) + +theorem IsSolenoidalZeroNormalTraceOn.test_of_contDiff {d : ℕ} {U : Set (Vec d)} + {g : Vec d → Vec d} (hg : IsSolenoidalZeroNormalTraceOn U g) (hU : IsOpen U) + {u : Vec d → ℝ} (hu : ContDiff ℝ 1 u) (hu_supp : HasCompactSupport u) : + ∫ x in U, vecDot (g x) (fun i => (fderiv ℝ u x) (basisVec i)) ∂MeasureTheory.volume = 0 := by + simpa [H1Function.ofContDiff] using hg (H1Function.ofContDiff hU hu hu_supp) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalCubeBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalCubeBridge.lean new file mode 100644 index 0000000000..72744cf5c0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalCubeBridge.lean @@ -0,0 +1,369 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicCubeTranslation +public import LeanPool.CoarseGraining.Homogenization.Geometry.TriadicPartition +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalTranslation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery + +/-! # Potential Solenoidal Cube Bridge -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Potential and solenoidal transport across triadic cube realizations + +The deterministic multiscale layer mostly uses the half-open `cubeSet Q`, while +the Sobolev layer often proves things first on the open cube `openCubeSet Q`. +This file promotes the existing centered-cube bridge to arbitrary triadic cubes +by translating to the centered cube, using the origin-cube bridge, and +translating back. +-/ + +noncomputable section + +namespace H1Function + +@[simp] theorem toCubeSetOriginCube_grad {d : ℕ} [NeZero d] {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) : + u.toCubeSetOriginCube.grad = u.grad := + rfl + +@[simp] theorem toCubeSetOriginCube_toFun {d : ℕ} [NeZero d] {n : ℤ} + (u : H1Function (openCubeSet (originCube d n))) : + u.toCubeSetOriginCube.toFun = u.toFun := + rfl + +private noncomputable def castDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : H1Function V := + hUV ▸ u + +@[simp] theorem grad_castDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castDomain hUV u).grad = u.grad := by + subst V + rfl + +@[simp] theorem toFun_castDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H1Function U) : + (castDomain hUV u).toFun = u.toFun := by + subst V + rfl + +/-- Promote an `H¹` witness on an open triadic cube to the corresponding +half-open triadic cube. -/ +noncomputable def toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : H1Function (cubeSet Q) := by + let z : Vec d := triadicCubeShift Q + let Uo : Set (Vec d) := openCubeSet (originCube d Q.scale) + let Uc : Set (Vec d) := cubeSet (originCube d Q.scale) + have hopen : openCubeSet Q = translateSet z Uo := by + simpa [z, Uo] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uTranslated : H1Function (translateSet z Uo) := castDomain hopen u + let uOriginTranslated : H1Function (translateSet (-z) (translateSet z Uo)) := + uTranslated.translate (-z) + have hdomain : translateSet (-z) (translateSet z Uo) = Uo := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) Uo) + let uOriginOpen : H1Function Uo := castDomain hdomain uOriginTranslated + let uOriginCube : H1Function Uc := uOriginOpen.toCubeSetOriginCube + have hcube : cubeSet Q = translateSet z Uc := by + simpa [z, Uc] using cubeSet_eq_translateSet_originCube_of_triadicCube Q + let uCubeTranslated : H1Function (translateSet z Uc) := uOriginCube.translate z + exact castDomain hcube.symm uCubeTranslated + +@[simp] theorem grad_toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : + u.toCubeSet.grad = u.grad := by + funext x + simp [toCubeSet] + +@[simp] theorem toFun_toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H1Function (openCubeSet Q)) : + u.toCubeSet.toFun = u.toFun := by + funext x + simp [toCubeSet] + +/-- Restrict an `H¹` witness on a half-open triadic cube to its open +realization. -/ +noncomputable def toOpenCubeSet {d : ℕ} {Q : TriadicCube d} + (u : H1Function (cubeSet Q)) : H1Function (openCubeSet Q) := + u.restrict (isOpen_openCubeSet Q) (openCubeSet_subset_cubeSet Q) + +@[simp] theorem grad_toOpenCubeSet {d : ℕ} {Q : TriadicCube d} + (u : H1Function (cubeSet Q)) : + u.toOpenCubeSet.grad = u.grad := + rfl + +@[simp] theorem toFun_toOpenCubeSet {d : ℕ} {Q : TriadicCube d} + (u : H1Function (cubeSet Q)) : + u.toOpenCubeSet.toFun = u.toFun := + rfl + +end H1Function + +namespace H10Function + +private noncomputable def castDomain {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : H10Function V := + hUV ▸ u + +@[simp] theorem castDomain_toH1Function_grad {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : + (castDomain hUV u).toH1Function.grad = u.toH1Function.grad := by + subst V + rfl + +@[simp] theorem castDomain_toH1Function_toFun {d : ℕ} {U V : Set (Vec d)} + (hUV : U = V) (u : H10Function U) : + (castDomain hUV u).toH1Function.toFun = u.toH1Function.toFun := by + subst V + rfl + +/-- Promote an `H¹₀` witness on an open triadic cube to the corresponding +half-open triadic cube. -/ +noncomputable def toCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (openCubeSet Q)) : H10Function (cubeSet Q) := by + let z : Vec d := triadicCubeShift Q + let Uo : Set (Vec d) := openCubeSet (originCube d Q.scale) + let Uc : Set (Vec d) := cubeSet (originCube d Q.scale) + have hopen : openCubeSet Q = translateSet z Uo := by + simpa [z, Uo] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uTranslated : H10Function (translateSet z Uo) := castDomain hopen u + let uOriginTranslated : H10Function (translateSet (-z) (translateSet z Uo)) := + uTranslated.translate (-z) + have hdomain : translateSet (-z) (translateSet z Uo) = Uo := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) Uo) + let uOriginOpen : H10Function Uo := castDomain hdomain uOriginTranslated + let uOriginCube : H10Function Uc := uOriginOpen.toCubeSetOriginCube + have hcube : cubeSet Q = translateSet z Uc := by + simpa [z, Uc] using cubeSet_eq_translateSet_originCube_of_triadicCube Q + let uCubeTranslated : H10Function (translateSet z Uc) := uOriginCube.translate z + exact castDomain hcube.symm uCubeTranslated + +@[simp] theorem toCubeSet_toH1Function_grad {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (openCubeSet Q)) : + u.toCubeSet.toH1Function.grad = u.toH1Function.grad := by + funext x + simp [toCubeSet] + +@[simp] theorem toCubeSet_toH1Function_toFun {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (openCubeSet Q)) : + u.toCubeSet.toH1Function.toFun = u.toH1Function.toFun := by + funext x + simp [toCubeSet] + +/-- Restrict an `H¹₀` witness on a half-open triadic cube to the corresponding +open triadic cube. -/ +noncomputable def toOpenCubeSet {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (cubeSet Q)) : H10Function (openCubeSet Q) := by + let z : Vec d := triadicCubeShift Q + let Uc : Set (Vec d) := cubeSet (originCube d Q.scale) + let Uo : Set (Vec d) := openCubeSet (originCube d Q.scale) + have hcube : cubeSet Q = translateSet z Uc := by + simpa [z, Uc] using cubeSet_eq_translateSet_originCube_of_triadicCube Q + let uTranslated : H10Function (translateSet z Uc) := castDomain hcube u + let uOriginTranslated : H10Function (translateSet (-z) (translateSet z Uc)) := + uTranslated.translate (-z) + have hdomain : translateSet (-z) (translateSet z Uc) = Uc := by + simpa [sub_eq_add_neg] using (translateSet_translateSet (d := d) z (-z) Uc) + let uOriginCube : H10Function Uc := castDomain hdomain uOriginTranslated + let uOriginOpen : H10Function Uo := uOriginCube.toOpenCubeSetOriginCube + have hopen : openCubeSet Q = translateSet z Uo := by + simpa [z, Uo] using openCubeSet_eq_translateSet_originCube_of_triadicCube Q + let uOpenTranslated : H10Function (translateSet z Uo) := uOriginOpen.translate z + exact castDomain hopen.symm uOpenTranslated + +@[simp] theorem toOpenCubeSet_toH1Function_grad {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (cubeSet Q)) : + u.toOpenCubeSet.toH1Function.grad = u.toH1Function.grad := by + funext x + simp [toOpenCubeSet] + +@[simp] theorem toOpenCubeSet_toH1Function_toFun {d : ℕ} [NeZero d] {Q : TriadicCube d} + (u : H10Function (cubeSet Q)) : + u.toOpenCubeSet.toH1Function.toFun = u.toH1Function.toFun := by + funext x + simp [toOpenCubeSet] + +end H10Function + +theorem isPotentialOn_openCubeSet_triadicCube_of_cubeSet + {d : ℕ} {Q : TriadicCube d} {f : Vec d → Vec d} + (hf : IsPotentialOn (cubeSet Q) f) : + IsPotentialOn (openCubeSet Q) f := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.toOpenCubeSet, rfl⟩ + +theorem isPotentialOn_cubeSet_triadicCube_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {f : Vec d → Vec d} + (hf : IsPotentialOn (openCubeSet Q) f) : + IsPotentialOn (cubeSet Q) f := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.toCubeSet, by simp⟩ + +theorem isPotentialOn_cubeSet_triadicCube_iff_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {f : Vec d → Vec d} : + IsPotentialOn (cubeSet Q) f ↔ IsPotentialOn (openCubeSet Q) f := by + constructor + · exact isPotentialOn_openCubeSet_triadicCube_of_cubeSet + · exact isPotentialOn_cubeSet_triadicCube_of_openCubeSet + +theorem isPotentialZeroTraceOn_openCubeSet_triadicCube_of_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (cubeSet Q) f) : + IsPotentialZeroTraceOn (openCubeSet Q) f := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.toOpenCubeSet, by simp⟩ + +theorem isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet Q) f) : + IsPotentialZeroTraceOn (cubeSet Q) f := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.toCubeSet, by simp⟩ + +theorem isPotentialZeroTraceOn_cubeSet_triadicCube_iff_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {f : Vec d → Vec d} : + IsPotentialZeroTraceOn (cubeSet Q) f ↔ IsPotentialZeroTraceOn (openCubeSet Q) f := by + constructor + · exact isPotentialZeroTraceOn_openCubeSet_triadicCube_of_cubeSet + · exact isPotentialZeroTraceOn_cubeSet_triadicCube_of_openCubeSet + +theorem isSolenoidalOn_cubeSet_triadicCube_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} + (hg : IsSolenoidalOn (openCubeSet Q) g) : + IsSolenoidalOn (cubeSet Q) g := by + intro φ + have hopen := hg φ.toOpenCubeSet + have hset : + ∫ x in cubeSet Q, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + rw [hset] + simpa using hopen + +theorem isSolenoidalOn_openCubeSet_triadicCube_of_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} + (hg : IsSolenoidalOn (cubeSet Q) g) : + IsSolenoidalOn (openCubeSet Q) g := by + intro φ + have hcube := hg φ.toCubeSet + have hset : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toCubeSet.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toCubeSet.toH1Function.grad x))) + rw [hset] at hcube + simpa using hcube + +theorem isSolenoidalOn_cubeSet_triadicCube_iff_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} : + IsSolenoidalOn (cubeSet Q) g ↔ IsSolenoidalOn (openCubeSet Q) g := by + constructor + · exact isSolenoidalOn_openCubeSet_triadicCube_of_cubeSet + · exact isSolenoidalOn_cubeSet_triadicCube_of_openCubeSet + +theorem isSolenoidalZeroNormalTraceOn_cubeSet_triadicCube_of_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (openCubeSet Q) g) : + IsSolenoidalZeroNormalTraceOn (cubeSet Q) g := by + intro φ + have hopen := hg φ.toOpenCubeSet + have hset : + ∫ x in cubeSet Q, vecDot (g x) (φ.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, + vecDot (g x) (φ.toOpenCubeSet.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.grad x))) + rw [hset] + simpa using hopen + +theorem isSolenoidalZeroNormalTraceOn_openCubeSet_triadicCube_of_cubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (cubeSet Q) g) : + IsSolenoidalZeroNormalTraceOn (openCubeSet Q) g := by + intro φ + have hcube := hg φ.toCubeSet + have hset : + ∫ x in cubeSet Q, + vecDot (g x) (φ.toCubeSet.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet Q, vecDot (g x) (φ.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_eq_setIntegral_openCubeSet + (Q := Q) (f := fun x => vecDot (g x) (φ.toCubeSet.grad x))) + rw [hset] at hcube + simpa using hcube + +theorem isSolenoidalZeroNormalTraceOn_cubeSet_triadicCube_iff_openCubeSet + {d : ℕ} [NeZero d] {Q : TriadicCube d} {g : Vec d → Vec d} : + IsSolenoidalZeroNormalTraceOn (cubeSet Q) g ↔ + IsSolenoidalZeroNormalTraceOn (openCubeSet Q) g := by + constructor + · exact isSolenoidalZeroNormalTraceOn_openCubeSet_triadicCube_of_cubeSet + · exact isSolenoidalZeroNormalTraceOn_cubeSet_triadicCube_of_openCubeSet + +namespace IsPotentialOn + +/-- Restrict a potential field on a half-open triadic cube to a descendant +half-open triadic cube. -/ +theorem restrict_cubeSet_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {n : ℕ} + {u : Vec d → Vec d} + (hu : IsPotentialOn (cubeSet Q) u) + (hR : R ∈ descendantsAtDepth Q n) : + IsPotentialOn (cubeSet R) u := by + have huOpenQ : IsPotentialOn (openCubeSet Q) u := + isPotentialOn_openCubeSet_triadicCube_of_cubeSet hu + rcases huOpenQ with ⟨v, hv⟩ + have huOpenR : IsPotentialOn (openCubeSet R) u := by + refine ⟨v.restrict (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR), ?_⟩ + simpa [H1Function.restrict] using hv + exact isPotentialOn_cubeSet_triadicCube_of_openCubeSet huOpenR + +end IsPotentialOn + +namespace IsSolenoidalOn + +/-- Restrict a solenoidal field on a half-open triadic cube to a descendant +half-open triadic cube. -/ +theorem restrict_cubeSet_of_mem_descendantsAtDepth + {d : ℕ} [NeZero d] {Q R : TriadicCube d} {n : ℕ} + {F : Vec d → Vec d} + (hF : IsSolenoidalOn (cubeSet Q) F) + (hR : R ∈ descendantsAtDepth Q n) + (hmemR : MemVectorL2 (cubeSet R) F) : + IsSolenoidalOn (cubeSet R) F := by + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet R)) := by + simpa [volumeMeasureOn] using + (isOpenBoundedConvexDomain_openCubeSet R).isFiniteMeasure_restrict_volume + have hOpenQ : IsSolenoidalOn (openCubeSet Q) F := + isSolenoidalOn_openCubeSet_triadicCube_of_cubeSet hF + have hmemOpenR : MemVectorL2 (openCubeSet R) F := by + simpa [MemVectorL2, volumeMeasureOn, volume_restrict_cubeSet_eq_volume_restrict_openCubeSet] + using hmemR + have hOpenR : IsSolenoidalOn (openCubeSet R) F := + hOpenQ.restrict_of_isOpen_of_memVectorL2 + (isOpen_openCubeSet Q) (isOpen_openCubeSet R) + (openCubeSet_subset_of_mem_descendantsAtDepth hR) hmemOpenR + exact isSolenoidalOn_cubeSet_triadicCube_of_openCubeSet hOpenR + +end IsSolenoidalOn + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalExact.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalExact.lean new file mode 100644 index 0000000000..3ee4e7b2a3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalExact.lean @@ -0,0 +1,236 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.BoundedConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph + +/-! +# Exact potential and solenoidal spaces + +This module implements the literal Hilbert-space constructions underlying the +Chapter 1 potential/solenoidal quartet. The raw submodules are mathematically +well-defined for an arbitrary set `U`, so this reusable construction is kept +generic here. It is not the manuscript-facing API: `Book.Ch01.FieldSpaces` +exposes the quartet only with `IsOpenBoundedConvexDomain U` and `U.Nonempty`. +Any consequence needing those domain hypotheses states them explicitly below. + +The two potential spaces are literal ranges of the typed Hilbert `L²` gradient +maps. They are deliberately not closed: closedness is a separate analytic +theorem, not part of these definitions. +-/ + +@[expose] public section + +namespace Homogenization + +namespace PotentialSolenoidalExact + +variable {d : ℕ} {U : Set (Vec d)} + +/-- The generic literal range of `H¹(U)` gradients in the Euclidean +Hilbert-vector `L²(U)` ambient space. The nonempty bounded open convex +Chapter 1 facade is `Book.Ch01.PotentialHilbertL2`. -/ +noncomputable def potential (U : Set (Vec d)) : Submodule ℝ (HilbertVectorL2 U) where + carrier := {g | ∃ u : H1Function U, u.gradToHilbertVectorL2 = g} + zero_mem' := by + refine ⟨0, ?_⟩ + exact H1Function.gradToHilbertVectorL2_zero + add_mem' := by + intro g h hg hh + rcases hg with ⟨u, hu⟩ + rcases hh with ⟨v, hv⟩ + refine ⟨u + v, ?_⟩ + calc + (u + v).gradToHilbertVectorL2 = + u.gradToHilbertVectorL2 + v.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_add u v + _ = g + h := by rw [hu, hv] + smul_mem' := by + intro c g hg + rcases hg with ⟨u, hu⟩ + refine ⟨c • u, ?_⟩ + calc + (c • u).gradToHilbertVectorL2 = c • u.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_smul c u + _ = c • g := by rw [hu] + +/-- The generic literal range of `H¹₀(U)` gradients in the Euclidean +Hilbert-vector `L²(U)` ambient space. The nonempty bounded open convex +Chapter 1 facade is `Book.Ch01.PotentialZeroTraceHilbertL2`. -/ +noncomputable def potentialZeroTrace (U : Set (Vec d)) : Submodule ℝ (HilbertVectorL2 U) where + carrier := {g | ∃ u : H10Function U, u.toH1Function.gradToHilbertVectorL2 = g} + zero_mem' := by + refine ⟨0, ?_⟩ + change (0 : H1Function U).gradToHilbertVectorL2 = 0 + exact H1Function.gradToHilbertVectorL2_zero + add_mem' := by + intro g h hg hh + rcases hg with ⟨u, hu⟩ + rcases hh with ⟨v, hv⟩ + refine ⟨u + v, ?_⟩ + calc + (u + v).toH1Function.gradToHilbertVectorL2 = + (u.toH1Function + v.toH1Function).gradToHilbertVectorL2 := rfl + _ = u.toH1Function.gradToHilbertVectorL2 + + v.toH1Function.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_add u.toH1Function v.toH1Function + _ = g + h := by rw [hu, hv] + smul_mem' := by + intro c g hg + rcases hg with ⟨u, hu⟩ + refine ⟨c • u, ?_⟩ + calc + (c • u).toH1Function.gradToHilbertVectorL2 = + (c • u.toH1Function).gradToHilbertVectorL2 := rfl + _ = c • u.toH1Function.gradToHilbertVectorL2 := + H1Function.gradToHilbertVectorL2_smul c u.toH1Function + _ = c • g := by rw [hu] + +/-- The generic orthogonal complement of all zero-trace potential fields. +The Chapter 1 source-facing facade is +`Book.Ch01.SolenoidalHilbertL2`. -/ +noncomputable def solenoidal (U : Set (Vec d)) : Submodule ℝ (HilbertVectorL2 U) := + (potentialZeroTrace U)ᗮ + +/-- The generic orthogonal complement of all potential fields, i.e. fields +with zero normal trace in the Chapter 1 terminology. The source-facing facade +is `Book.Ch01.SolenoidalZeroNormalTraceHilbertL2`. -/ +noncomputable def solenoidalZeroNormalTrace (U : Set (Vec d)) : + Submodule ℝ (HilbertVectorL2 U) := + (potential U)ᗮ + +/-- The generic literal doubled space `L_pot(U) × L_sol(U)`. The Chapter 1 +source-facing facade is `Book.Ch01.PotentialSolenoidalHilbertL2`. -/ +noncomputable def blockPotentialSolenoidal (U : Set (Vec d)) : + Submodule ℝ (HilbertVectorL2 U × HilbertVectorL2 U) := + (potential U).prod (solenoidal U) + +/-- The generic literal doubled space `L_pot,0(U) × L_sol,0(U)`. The Chapter +1 source-facing facade is +`Book.Ch01.PotentialZeroTraceSolenoidalZeroNormalTraceHilbertL2`. -/ +noncomputable def blockPotentialZeroTraceSolenoidalZeroNormalTrace (U : Set (Vec d)) : + Submodule ℝ (HilbertVectorL2 U × HilbertVectorL2 U) := + (potentialZeroTrace U).prod (solenoidalZeroNormalTrace U) + +theorem mem_potential_iff (g : HilbertVectorL2 U) : + g ∈ potential U ↔ ∃ u : H1Function U, u.gradToHilbertVectorL2 = g := + Iff.rfl + +theorem mem_potentialZeroTrace_iff (g : HilbertVectorL2 U) : + g ∈ potentialZeroTrace U ↔ + ∃ u : H10Function U, u.toH1Function.gradToHilbertVectorL2 = g := + Iff.rfl + +theorem mem_solenoidal_iff (g : HilbertVectorL2 U) : + g ∈ solenoidal U ↔ + ∀ u : H10Function U, inner ℝ g u.toH1Function.gradToHilbertVectorL2 = 0 := by + constructor + · intro hg u + exact (Submodule.mem_orthogonal' _ _).1 hg _ ⟨u, rfl⟩ + · intro hg + rw [solenoidal, Submodule.mem_orthogonal'] + intro v hv + rcases (mem_potentialZeroTrace_iff v).1 hv with ⟨u, hu⟩ + rw [← hu] + exact hg u + +theorem mem_solenoidalZeroNormalTrace_iff (g : HilbertVectorL2 U) : + g ∈ solenoidalZeroNormalTrace U ↔ + ∀ u : H1Function U, inner ℝ g u.gradToHilbertVectorL2 = 0 := by + constructor + · intro hg u + exact (Submodule.mem_orthogonal' _ _).1 hg _ ⟨u, rfl⟩ + · intro hg + rw [solenoidalZeroNormalTrace, Submodule.mem_orthogonal'] + intro v hv + rcases (mem_potential_iff v).1 hv with ⟨u, hu⟩ + rw [← hu] + exact hg u + +theorem potentialZeroTrace_le_potential : potentialZeroTrace U ≤ potential U := by + intro g hg + rcases (mem_potentialZeroTrace_iff g).1 hg with ⟨u, hu⟩ + exact (mem_potential_iff g).2 ⟨u.toH1Function, hu⟩ + +theorem solenoidalZeroNormalTrace_le_solenoidal : + solenoidalZeroNormalTrace U ≤ solenoidal U := by + intro g hg + rw [mem_solenoidal_iff] + intro u + exact (mem_solenoidalZeroNormalTrace_iff g).1 hg u.toH1Function + +theorem mem_blockPotentialSolenoidal_iff (g : HilbertVectorL2 U × HilbertVectorL2 U) : + g ∈ blockPotentialSolenoidal U ↔ g.1 ∈ potential U ∧ g.2 ∈ solenoidal U := + Submodule.mem_prod + +theorem mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_iff + (g : HilbertVectorL2 U × HilbertVectorL2 U) : + g ∈ blockPotentialZeroTraceSolenoidalZeroNormalTrace U ↔ + g.1 ∈ potentialZeroTrace U ∧ g.2 ∈ solenoidalZeroNormalTrace U := + Submodule.mem_prod + +/-- A zero-normal-trace solenoidal field has zero (restricted-volume) integral. +The proof tests against affine `H¹` functions with arbitrary constant gradient. -/ +theorem integral_eq_zero_of_mem_solenoidalZeroNormalTrace {d : ℕ} [NeZero d] + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (g : HilbertVectorL2 U) (hg : g ∈ solenoidalZeroNormalTrace U) : + ∫ x, g x ∂volumeMeasureOn U = 0 := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + apply integral_eq_zero_of_forall_integral_inner_eq_zero ℝ g + ((MeasureTheory.Lp.memLp g).integrable (by norm_num : (1 : ENNReal) ≤ 2)) + intro c + let p : Vec d := c.toVec + let u : H1Function U := + H1Function.affineOnIsSobolevRegularDomain hU.isSobolevRegularDomain p + have horth : inner ℝ g u.gradToHilbertVectorL2 = 0 := + (mem_solenoidalZeroNormalTrace_iff g).1 hg u + have hpair : + ∫ x, inner ℝ (g x) (HilbertVec.ofVec p) ∂volumeMeasureOn U = 0 := by + calc + ∫ x, inner ℝ (g x) (HilbertVec.ofVec p) ∂volumeMeasureOn U = + ∫ x, inner ℝ (g x) (u.gradToHilbertVectorL2 x) ∂volumeMeasureOn U := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [u.coeFn_gradToHilbertVectorL2] with x hx + have hu_grad : u.grad x = p := by + exact H1Function.affineOnIsSobolevRegularDomain_grad + hU.isSobolevRegularDomain p x + rw [hx] + change inner ℝ (g x) (HilbertVec.ofVec p) = + inner ℝ (g x) (HilbertVec.ofVec (u.grad x)) + rw [hu_grad] + _ = inner ℝ g u.gradToHilbertVectorL2 := (MeasureTheory.L2.inner_def g _).symm + _ = 0 := horth + change ∫ x, inner ℝ c (g x) ∂volumeMeasureOn U = 0 + rw [← HilbertVec.ofVec_toVec c] + simpa only [real_inner_comm] using hpair + +/-- The normalized-domain average of a zero-normal-trace solenoidal field +vanishes. -/ +theorem average_eq_zero_of_mem_solenoidalZeroNormalTrace {d : ℕ} [NeZero d] + {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) (hne : U.Nonempty) + (g : HilbertVectorL2 U) (hg : g ∈ solenoidalZeroNormalTrace U) : + (hU.toBoundedMeasurableDomain hne).average g (by + change MeasureTheory.Integrable g (volumeMeasureOn U) + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + exact (MeasureTheory.Lp.memLp g).integrable (by norm_num : (1 : ENNReal) ≤ 2)) = 0 := by + let : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := + hU.isFiniteMeasure_restrict_volume + rw [BoundedMeasurableDomain.average, BoundedMeasurableDomain.normalizedVolume, + MeasureTheory.integral_smul_measure] + have hzero : ∫ x, g x ∂(hU.toBoundedMeasurableDomain hne).restrictedVolume = 0 := by + change ∫ x, g x ∂volumeMeasureOn U = 0 + exact integral_eq_zero_of_mem_solenoidalZeroNormalTrace hU g hg + rw [hzero] + simp + +end PotentialSolenoidalExact + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2.lean new file mode 100644 index 0000000000..4944fdf235 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2.lean @@ -0,0 +1,947 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.MeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.ZeroTraceAverages +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Analysis.InnerProductSpace.Dual +public import Mathlib.Topology.Algebra.Module.ClosedSubmodule +public import Mathlib.Topology.Algebra.Module.ContinuousLinearMap.PiProd + +/-! # Potential Solenoidal L2 -/ + +@[expose] public section + +namespace Homogenization + +/-! +This file packages the note's spaces `\Lpot(U)`, `\Lpoto(U)`, `\Lsol(U)`, +`\Lsolo(U)` and their doubled block versions as actual closed subspaces of the +ambient `L²` spaces. + +The structures remain abstract so downstream arguments can still be phrased in +terms of packaged closed subspaces. This file also provides canonical +constructors obtained by taking closures of the predicate-generated Sobolev +submodules that already exist in the current development. +-/ + +/-- Combine two vector fields into one block-valued field. -/ +def blockField {d : ℕ} (f g : Vec d → Vec d) : Vec d → BlockVec d := + fun x => (f x, g x) + +@[simp] theorem blockField_fst {d : ℕ} (f g : Vec d → Vec d) (x : Vec d) : + (blockField f g x).1 = f x := + rfl + +@[simp] theorem blockField_snd {d : ℕ} (f g : Vec d → Vec d) (x : Vec d) : + (blockField f g x).2 = g x := + rfl + +theorem memBlockL2_blockField {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + MemBlockL2 U (blockField f g) := by + have hf' : + MemBlockL2 U + (fun x => (ContinuousLinearMap.inl ℝ (Vec d) (Vec d)) (f x)) := by + simpa using! + (ContinuousLinearMap.inl ℝ (Vec d) (Vec d)).comp_memLp' hf + have hg' : + MemBlockL2 U + (fun x => (ContinuousLinearMap.inr ℝ (Vec d) (Vec d)) (g x)) := by + simpa using! + (ContinuousLinearMap.inr ℝ (Vec d) (Vec d)).comp_memLp' hg + convert hf'.add hg' using 1 + funext x + apply Prod.ext + · ext i + simp [blockField] + · ext i + simp [blockField] + +/-- Promote a pair of vector `L²` witnesses to the block-valued ambient type. -/ +noncomputable def toBlockL2OfComponents {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + BlockL2 U := + toBlockL2 (memBlockL2_blockField hf hg) + +theorem coeFn_toBlockL2OfComponents {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toBlockL2OfComponents hf hg =ᵐ[volumeMeasureOn U] blockField f g := + coeFn_toBlockL2 (memBlockL2_blockField hf hg) + +/-- Combine two vector fields into one Hilbert block-valued field. -/ +def hilbertBlockField {d : ℕ} (f g : Vec d → Vec d) : Vec d → HilbertBlockVec d := + hilbertifyBlockField (blockField f g) + +theorem memHilbertBlockL2_blockField {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + MemHilbertBlockL2 U (hilbertBlockField f g) := by + let T : BlockVec d →L[ℝ] HilbertBlockVec d := + ((HilbertBlockVec.continuousLinearEquivBlockVec d).symm).toContinuousLinearMap + simpa [hilbertBlockField, hilbertifyBlockField] using! + T.comp_memLp' (memBlockL2_blockField hf hg) + +/-- Promote a pair of vector `L²` witnesses to the Hilbert block-valued ambient +type. -/ +noncomputable def toHilbertBlockL2OfComponents {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + HilbertBlockL2 U := + toHilbertBlockL2 (memHilbertBlockL2_blockField hf hg) + +theorem coeFn_toHilbertBlockL2OfComponents {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toHilbertBlockL2OfComponents hf hg =ᵐ[volumeMeasureOn U] hilbertBlockField f g := + coeFn_toHilbertBlockL2 (memHilbertBlockL2_blockField hf hg) + +theorem memScalarL2_coord_of_memVectorL2 {d : ℕ} {U : Set (Vec d)} + {f : Vec d → Vec d} (hf : MemVectorL2 U f) (i : Fin d) : + MemScalarL2 U (fun x => f x i) := by + let pi : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [MemScalarL2, MemVectorL2, volumeMeasureOn] using! pi.comp_memLp' hf + +theorem integrableOn_vecDot_of_memVectorL2 {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (g x)) U := by + have hsum : + MeasureTheory.IntegrableOn (fun x => ∑ i, f x i * g x i) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (MeasureTheory.integrable_finsetSum + (μ := volumeMeasureOn U) + Finset.univ + (fun i _ => + (memScalarL2_coord_of_memVectorL2 hf i).integrable_mul + (memScalarL2_coord_of_memVectorL2 hg i))) + simpa [vecDot] using hsum + +theorem IsSolenoidalZeroNormalTraceOn.isSolenoidalOn {d : ℕ} {U : Set (Vec d)} + {g : Vec d → Vec d} (hg : IsSolenoidalZeroNormalTraceOn U g) : + IsSolenoidalOn U g := by + intro φ + exact hg φ.toH1Function + +theorem isSolenoidalOn_add_of_memVectorL2 {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf_mem : MemVectorL2 U f) (hg_mem : MemVectorL2 U g) + (hf : IsSolenoidalOn U f) (hg : IsSolenoidalOn U g) : + IsSolenoidalOn U (f + g) := by + refine isSolenoidalOn_add hf hg ?_ ?_ + · intro φ + exact integrableOn_vecDot_of_memVectorL2 hf_mem φ.toH1Function.grad_memVectorL2 + · intro φ + exact integrableOn_vecDot_of_memVectorL2 hg_mem φ.toH1Function.grad_memVectorL2 + +theorem isSolenoidalZeroNormalTraceOn_add_of_memVectorL2 {d : ℕ} {U : Set (Vec d)} + {f g : Vec d → Vec d} (hf_mem : MemVectorL2 U f) (hg_mem : MemVectorL2 U g) + (hf : IsSolenoidalZeroNormalTraceOn U f) + (hg : IsSolenoidalZeroNormalTraceOn U g) : + IsSolenoidalZeroNormalTraceOn U (f + g) := by + refine isSolenoidalZeroNormalTraceOn_add hf hg ?_ ?_ + · intro φ + exact integrableOn_vecDot_of_memVectorL2 hf_mem φ.grad_memVectorL2 + · intro φ + exact integrableOn_vecDot_of_memVectorL2 hg_mem φ.grad_memVectorL2 + +namespace IsSolenoidalOn + +/-- Constant vector fields are solenoidal against `H¹₀` tests on +Sobolev-regular domains. -/ +theorem const_isSolenoidalOn_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (hU : IsSobolevRegularDomain U) (hvol : (MeasureTheory.volume U).toReal ≠ 0) + (q : Vec d) : + IsSolenoidalOn U (fun _ : Vec d => q) := by + intro φ + have havg : + φ.toH1Function.averageGradient = 0 := + H10Function.averageGradient_eq_zero_of_isSobolevRegularDomain hU φ + have hzero : + (fun i => ∫ x in U, φ.toH1Function.grad x i ∂MeasureTheory.volume) = 0 := + H1Function.integral_eq_zero_of_averageGradient_eq_zero + (u := φ.toH1Function) hvol havg + calc + ∫ x in U, vecDot q (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in U, ∑ i, q i * φ.toH1Function.grad x i ∂MeasureTheory.volume := by + simp [vecDot] + _ = ∑ i, ∫ x in U, q i * φ.toH1Function.grad x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_finsetSum] + intro i hi + have hbase : + MeasureTheory.Integrable + (fun x => φ.toH1Function.grad x i) (MeasureTheory.volume.restrict U) := + (φ.toH1Function.grad_memL2 i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + simpa using hbase.const_mul (q i) + _ = 0 := by + refine Finset.sum_eq_zero ?_ + intro i hi + have hzeroi : ∫ x in U, φ.toH1Function.grad x i ∂MeasureTheory.volume = 0 := by + simpa using congrFun hzero i + rw [MeasureTheory.integral_const_mul, hzeroi] + simp + +end IsSolenoidalOn + +theorem toBlockL2OfComponents_add {d : ℕ} {U : Set (Vec d)} + {f1 f2 g1 g2 : Vec d → Vec d} + (hf1 : MemVectorL2 U f1) (hg1 : MemVectorL2 U g1) + (hf2 : MemVectorL2 U f2) (hg2 : MemVectorL2 U g2) : + toBlockL2OfComponents (hf1.add hf2) (hg1.add hg2) = + toBlockL2OfComponents hf1 hg1 + toBlockL2OfComponents hf2 hg2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toBlockL2OfComponents hf1 hg1, + coeFn_toBlockL2OfComponents hf2 hg2, + coeFn_toBlockL2OfComponents (hf1.add hf2) (hg1.add hg2), + MeasureTheory.Lp.coeFn_add (toBlockL2OfComponents hf1 hg1) + (toBlockL2OfComponents hf2 hg2)] + with x h1 h2 hsum hadd + rw [hsum, hadd] + simp [Pi.add_apply, h1, h2, blockField] + +theorem toBlockL2OfComponents_smul {d : ℕ} {U : Set (Vec d)} + (c : ℝ) {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + toBlockL2OfComponents (hf.const_smul c) (hg.const_smul c) = + c • toBlockL2OfComponents hf hg := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toBlockL2OfComponents hf hg, + coeFn_toBlockL2OfComponents (hf.const_smul c) (hg.const_smul c), + MeasureTheory.Lp.coeFn_smul c (toBlockL2OfComponents hf hg)] + with x h hsmul hLpSmul + rw [hsmul, hLpSmul] + simp [Pi.smul_apply, h, blockField] + +/-- +Packaged `L²` data for the note's potential and solenoidal spaces. + +The four vector-valued closed subspaces model +`Lpot(U)`, `Lpoto(U)`, `Lsol(U)`, `Lsolo(U)`, while the two block-valued closed +subspaces model `Lpot(U) × Lsol(U)` and `Lpoto(U) × Lsolo(U)`. +-/ +structure PotentialSolenoidalL2Data {d : ℕ} (U : Set (Vec d)) where + /-- The closed `L²` subspace modeling `\Lpot(U)`. -/ + potential : ClosedSubmodule ℝ (VectorL2 U) + /-- The closed `L²` subspace modeling `\Lpoto(U)`. -/ + potentialZeroTrace : ClosedSubmodule ℝ (VectorL2 U) + /-- The closed `L²` subspace modeling `\Lsol(U)`. -/ + solenoidal : ClosedSubmodule ℝ (VectorL2 U) + /-- The closed `L²` subspace modeling `\Lsolo(U)`. -/ + solenoidalZeroNormalTrace : ClosedSubmodule ℝ (VectorL2 U) + /-- The closed block subspace modeling `\Lpot(U) × \Lsol(U)`. -/ + blockPotentialSolenoidal : ClosedSubmodule ℝ (BlockL2 U) + /-- The closed block subspace modeling `\Lpoto(U) × \Lsolo(U)`. -/ + blockPotentialZeroTraceSolenoidalZeroNormalTrace : ClosedSubmodule ℝ (BlockL2 U) + /-- Predicate-level potentials land in the packaged `L²` subspace. -/ + mem_potential : + ∀ {f : Vec d → Vec d} (hf : MemVectorL2 U f), + IsPotentialOn U f → toVectorL2 hf ∈ potential + /-- Predicate-level zero-trace potentials land in the packaged `L²` subspace. -/ + mem_potentialZeroTrace : + ∀ {f : Vec d → Vec d} (hf : MemVectorL2 U f), + IsPotentialZeroTraceOn U f → toVectorL2 hf ∈ potentialZeroTrace + /-- Predicate-level solenoidal fields land in the packaged `L²` subspace. -/ + mem_solenoidal : + ∀ {g : Vec d → Vec d} (hg : MemVectorL2 U g), + IsSolenoidalOn U g → toVectorL2 hg ∈ solenoidal + /-- Predicate-level zero-normal-trace solenoidal fields land in the packaged + `L²` subspace. -/ + mem_solenoidalZeroNormalTrace : + ∀ {g : Vec d → Vec d} (hg : MemVectorL2 U g), + IsSolenoidalZeroNormalTraceOn U g → toVectorL2 hg ∈ solenoidalZeroNormalTrace + /-- Predicate-level block fields in `\Lpot(U) × \Lsol(U)` land in the + packaged block `L²` subspace. -/ + mem_blockPotentialSolenoidal : + ∀ {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g), + IsPotentialOn U f → + IsSolenoidalOn U g → + toBlockL2OfComponents hf hg ∈ blockPotentialSolenoidal + /-- Predicate-level block fields in `\Lpoto(U) × \Lsolo(U)` land in the + packaged block `L²` subspace. -/ + mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace : + ∀ {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g), + IsPotentialZeroTraceOn U f → + IsSolenoidalZeroNormalTraceOn U g → + toBlockL2OfComponents hf hg ∈ blockPotentialZeroTraceSolenoidalZeroNormalTrace + /-- The note's inclusion `\Lpoto(U) ⊆ \Lpot(U)`. -/ + potentialZeroTrace_le_potential : potentialZeroTrace ≤ potential + /-- The note's inclusion `\Lsolo(U) ⊆ \Lsol(U)`. -/ + solenoidalZeroNormalTrace_le_solenoidal : + solenoidalZeroNormalTrace ≤ solenoidal + /-- The block-level inclusion + `\Lpoto(U) × \Lsolo(U) ⊆ \Lpot(U) × \Lsol(U)`. -/ + blockPotentialZeroTraceSolenoidalZeroNormalTrace_le_blockPotentialSolenoidal : + blockPotentialZeroTraceSolenoidalZeroNormalTrace ≤ blockPotentialSolenoidal + +/-- +Black-box Hilbert-valued `L²` packaging of the correction space +`\mathcal H(U) = \Lpoto(U) × \Lsolo(U)` used in the doubled `\mu` problem. + +This is the exact closed subspace that later sits inside the ambient Hilbert +space `L²(U; \R^{2d})`. +-/ +structure MuCorrectionSpaceData {d : ℕ} (U : Set (Vec d)) where + /-- The closed Hilbert subspace modeling `\Lpoto(U) × \Lsolo(U)`. -/ + correctionSpace : ClosedSubmodule ℝ (HilbertBlockL2 U) + /-- Predicate-level correction pairs land in the packaged Hilbert subspace. -/ + mem_correctionSpace : + ∀ {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g), + IsPotentialZeroTraceOn U f → + IsSolenoidalZeroNormalTraceOn U g → + toHilbertBlockL2OfComponents hf hg ∈ correctionSpace + +namespace PotentialSolenoidalL2Data + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Predicate-generated `L²` submodule for `\Lpot(U)`. -/ +def potentialSubmodule (U : Set (Vec d)) : Submodule ℝ (VectorL2 U) where + carrier := {F | ∃ f, ∃ hf : MemVectorL2 U f, toVectorL2 hf = F ∧ IsPotentialOn U f} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + exact ⟨0, h0, by simp [toVectorL2], isPotentialOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f, hf, rfl, hpot⟩ + rcases hY with ⟨g, hg, rfl, hpot'⟩ + exact + ⟨f + g, hf.add hg, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_add hf hg, + isPotentialOn_add hpot hpot'⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨f, hf, rfl, hpot⟩ + exact + ⟨c • f, hf.const_smul c, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_const_smul c hf, + isPotentialOn_smul hpot c⟩ + +/-- Predicate-generated `L²` submodule for `\Lpoto(U)`. -/ +def potentialZeroTraceSubmodule (U : Set (Vec d)) : Submodule ℝ (VectorL2 U) where + carrier := {F | ∃ f, ∃ hf : MemVectorL2 U f, toVectorL2 hf = F ∧ IsPotentialZeroTraceOn U f} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + exact + ⟨0, h0, by simp [toVectorL2], + isPotentialZeroTraceOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f, hf, rfl, hpot⟩ + rcases hY with ⟨g, hg, rfl, hpot'⟩ + exact + ⟨f + g, hf.add hg, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_add hf hg, + isPotentialZeroTraceOn_add hpot hpot'⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨f, hf, rfl, hpot⟩ + exact + ⟨c • f, hf.const_smul c, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_const_smul c hf, + isPotentialZeroTraceOn_smul hpot c⟩ + +/-- Predicate-generated `L²` submodule for `\Lsol(U)`. -/ +def solenoidalSubmodule (U : Set (Vec d)) : Submodule ℝ (VectorL2 U) where + carrier := {F | ∃ g, ∃ hg : MemVectorL2 U g, toVectorL2 hg = F ∧ IsSolenoidalOn U g} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + exact ⟨0, h0, by simp [toVectorL2], isSolenoidalOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f, hf, rfl, hsol⟩ + rcases hY with ⟨g, hg, rfl, hsol'⟩ + exact + ⟨f + g, hf.add hg, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_add hf hg, + isSolenoidalOn_add_of_memVectorL2 hf hg hsol hsol'⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨g, hg, rfl, hsol⟩ + exact + ⟨c • g, hg.const_smul c, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_const_smul c hg, + isSolenoidalOn_smul hsol c⟩ + +/-- Predicate-generated `L²` submodule for `\Lsolo(U)`. -/ +def solenoidalZeroNormalTraceSubmodule (U : Set (Vec d)) : Submodule ℝ (VectorL2 U) where + carrier := {F | ∃ g, ∃ hg : MemVectorL2 U g, + toVectorL2 hg = F ∧ IsSolenoidalZeroNormalTraceOn U g} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + exact + ⟨0, h0, by simp [toVectorL2], + isSolenoidalZeroNormalTraceOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f, hf, rfl, hsol⟩ + rcases hY with ⟨g, hg, rfl, hsol'⟩ + exact + ⟨f + g, hf.add hg, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_add hf hg, + isSolenoidalZeroNormalTraceOn_add_of_memVectorL2 hf hg hsol hsol'⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨g, hg, rfl, hsol⟩ + exact + ⟨c • g, hg.const_smul c, + by simpa [toVectorL2] using MeasureTheory.MemLp.toLp_const_smul c hg, + isSolenoidalZeroNormalTraceOn_smul hsol c⟩ + +private noncomputable def gradientPairingVectorL2CLM {d : ℕ} {U : Set (Vec d)} + (u : H1Function U) : VectorL2 U →L[ℝ] ℝ := + ((InnerProductSpace.toDual ℝ (HilbertVectorL2 U)) + (toHilbertVectorL2OfVecField u.grad_memVectorL2)).comp + (continuousLinearEquivVectorL2 (U := U)).toContinuousLinearMap + +private theorem gradientPairingVectorL2CLM_apply_toVectorL2 + {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : MemVectorL2 U g) (u : H1Function U) : + gradientPairingVectorL2CLM u (toVectorL2 hg) = + ∫ x in U, vecDot (g x) (u.grad x) ∂MeasureTheory.volume := by + calc + gradientPairingVectorL2CLM u (toVectorL2 hg) + = inner ℝ + (toHilbertVectorL2OfVecField u.grad_memVectorL2) + ((continuousLinearEquivVectorL2 (U := U)) (toVectorL2 hg)) := by + simp [gradientPairingVectorL2CLM] + _ = inner ℝ (toHilbertVectorL2OfVecField u.grad_memVectorL2) + (toHilbertVectorL2OfVecField hg) := by + rw [continuousLinearEquivVectorL2_apply, vectorL2ToHilbertVectorL2_toVectorL2] + _ = ∫ x in U, vecDot (g x) (u.grad x) ∂MeasureTheory.volume := by + rw [real_inner_comm] + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hg u.grad_memVectorL2 + +theorem isSolenoidalOn_of_mem_closure_solenoidalSubmodule + {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : MemVectorL2 U g) + (hmem : toVectorL2 hg ∈ (solenoidalSubmodule U).closure) : + IsSolenoidalOn U g := by + intro φ + let ℓ : VectorL2 U →L[ℝ] ℝ := gradientPairingVectorL2CLM φ.toH1Function + let K : ClosedSubmodule ℝ (VectorL2 U) := { + toSubmodule := LinearMap.ker (ℓ : VectorL2 U →ₗ[ℝ] ℝ) + isClosed' := ContinuousLinearMap.isClosed_ker ℓ + } + have hsub : solenoidalSubmodule U ≤ K := by + intro X hX + rcases hX with ⟨f, hf, rfl, hsol⟩ + change ℓ (toVectorL2 hf) = 0 + rw [gradientPairingVectorL2CLM_apply_toVectorL2 hf φ.toH1Function] + exact hsol φ + have hclosure : + (solenoidalSubmodule U).closure ≤ K := by + exact Submodule.closure_le.mpr hsub + have hzero : ℓ (toVectorL2 hg) = 0 := by + change toVectorL2 hg ∈ K + exact hclosure hmem + rw [gradientPairingVectorL2CLM_apply_toVectorL2 hg φ.toH1Function] at hzero + exact hzero + +theorem isSolenoidalZeroNormalTraceOn_of_mem_closure_solenoidalZeroNormalTraceSubmodule + {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : MemVectorL2 U g) + (hmem : toVectorL2 hg ∈ (solenoidalZeroNormalTraceSubmodule U).closure) : + IsSolenoidalZeroNormalTraceOn U g := by + intro u + let ℓ : VectorL2 U →L[ℝ] ℝ := gradientPairingVectorL2CLM u + let K : ClosedSubmodule ℝ (VectorL2 U) := { + toSubmodule := LinearMap.ker (ℓ : VectorL2 U →ₗ[ℝ] ℝ) + isClosed' := ContinuousLinearMap.isClosed_ker ℓ + } + have hsub : solenoidalZeroNormalTraceSubmodule U ≤ K := by + intro X hX + rcases hX with ⟨f, hf, rfl, hsol⟩ + change ℓ (toVectorL2 hf) = 0 + rw [gradientPairingVectorL2CLM_apply_toVectorL2 hf u] + exact hsol u + have hclosure : + (solenoidalZeroNormalTraceSubmodule U).closure ≤ K := by + exact Submodule.closure_le.mpr hsub + have hzero : ℓ (toVectorL2 hg) = 0 := by + change toVectorL2 hg ∈ K + exact hclosure hmem + rw [gradientPairingVectorL2CLM_apply_toVectorL2 hg u] at hzero + exact hzero + +/-- Predicate-generated block `L²` submodule for `\Lpot(U) × \Lsol(U)`. -/ +def blockPotentialSolenoidalSubmodule (U : Set (Vec d)) : Submodule ℝ (BlockL2 U) where + carrier := {F | ∃ f g, ∃ hf : MemVectorL2 U f, ∃ hg : MemVectorL2 U g, + toBlockL2OfComponents hf hg = F ∧ IsPotentialOn U f ∧ IsSolenoidalOn U g} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + have hblock0 : toBlockL2OfComponents h0 h0 = (0 : BlockL2 U) := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toBlockL2OfComponents h0 h0, + MeasureTheory.Lp.coeFn_zero (E := BlockVec d) (p := (2 : ENNReal)) (μ := volumeMeasureOn U)] + with x h hzero + rw [h, hzero] + simp [blockField] + exact + ⟨0, 0, h0, h0, hblock0, isPotentialOn_zero, isSolenoidalOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f1, g1, hf1, hg1, rfl, hpot1, hsol1⟩ + rcases hY with ⟨f2, g2, hf2, hg2, rfl, hpot2, hsol2⟩ + exact + ⟨f1 + f2, g1 + g2, hf1.add hf2, hg1.add hg2, + toBlockL2OfComponents_add hf1 hg1 hf2 hg2, + isPotentialOn_add hpot1 hpot2, + isSolenoidalOn_add_of_memVectorL2 hg1 hg2 hsol1 hsol2⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨f, g, hf, hg, rfl, hpot, hsol⟩ + exact + ⟨c • f, c • g, hf.const_smul c, hg.const_smul c, + toBlockL2OfComponents_smul c hf hg, + isPotentialOn_smul hpot c, + isSolenoidalOn_smul hsol c⟩ + +/-- Predicate-generated block `L²` submodule for `\Lpoto(U) × \Lsolo(U)`. -/ +def blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule + (U : Set (Vec d)) : Submodule ℝ (BlockL2 U) where + carrier := {F | ∃ f g, ∃ hf : MemVectorL2 U f, ∃ hg : MemVectorL2 U g, + toBlockL2OfComponents hf hg = F ∧ + IsPotentialZeroTraceOn U f ∧ IsSolenoidalZeroNormalTraceOn U g} + zero_mem' := by + let h0 : MemVectorL2 U (0 : Vec d → Vec d) := MeasureTheory.MemLp.zero + have hblock0 : toBlockL2OfComponents h0 h0 = (0 : BlockL2 U) := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toBlockL2OfComponents h0 h0, + MeasureTheory.Lp.coeFn_zero (E := BlockVec d) (p := (2 : ENNReal)) (μ := volumeMeasureOn U)] + with x h hzero + rw [h, hzero] + simp [blockField] + exact + ⟨0, 0, h0, h0, hblock0, isPotentialZeroTraceOn_zero, isSolenoidalZeroNormalTraceOn_zero⟩ + add_mem' := by + intro X Y hX hY + rcases hX with ⟨f1, g1, hf1, hg1, rfl, hpot1, hsol1⟩ + rcases hY with ⟨f2, g2, hf2, hg2, rfl, hpot2, hsol2⟩ + exact + ⟨f1 + f2, g1 + g2, hf1.add hf2, hg1.add hg2, + toBlockL2OfComponents_add hf1 hg1 hf2 hg2, + isPotentialZeroTraceOn_add hpot1 hpot2, + isSolenoidalZeroNormalTraceOn_add_of_memVectorL2 hg1 hg2 hsol1 hsol2⟩ + smul_mem' := by + intro c X hX + rcases hX with ⟨f, g, hf, hg, rfl, hpot, hsol⟩ + exact + ⟨c • f, c • g, hf.const_smul c, hg.const_smul c, + toBlockL2OfComponents_smul c hf hg, + isPotentialZeroTraceOn_smul hpot c, + isSolenoidalZeroNormalTraceOn_smul hsol c⟩ + +theorem potentialZeroTraceSubmodule_le_potentialSubmodule : + potentialZeroTraceSubmodule U ≤ potentialSubmodule U := by + intro X hX + rcases hX with ⟨f, hf, hEq, hpot⟩ + exact ⟨f, hf, hEq, hpot.isPotentialOn⟩ + +theorem solenoidalZeroNormalTraceSubmodule_le_solenoidalSubmodule : + solenoidalZeroNormalTraceSubmodule U ≤ solenoidalSubmodule U := by + intro X hX + rcases hX with ⟨g, hg, hEq, hsol⟩ + exact ⟨g, hg, hEq, hsol.isSolenoidalOn⟩ + +theorem + blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule_le_blockPotentialSolenoidalSubmodule : + blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U ≤ + blockPotentialSolenoidalSubmodule U := by + intro X hX + rcases hX with ⟨f, g, hf, hg, hEq, hpot, hsol⟩ + exact ⟨f, g, hf, hg, hEq, hpot.isPotentialOn, hsol.isSolenoidalOn⟩ + +/-- Canonical packaged `L²` data obtained by closing the predicate-generated +Sobolev submodules. -/ +noncomputable def ofSubmoduleClosures (U : Set (Vec d)) : PotentialSolenoidalL2Data U where + potential := (potentialSubmodule U).closure + potentialZeroTrace := (potentialZeroTraceSubmodule U).closure + solenoidal := (solenoidalSubmodule U).closure + solenoidalZeroNormalTrace := (solenoidalZeroNormalTraceSubmodule U).closure + blockPotentialSolenoidal := (blockPotentialSolenoidalSubmodule U).closure + blockPotentialZeroTraceSolenoidalZeroNormalTrace := + (blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U).closure + mem_potential := by + intro f hf hpot + show toVectorL2 hf ∈ closure ((potentialSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure ⟨f, hf, rfl, hpot⟩ + mem_potentialZeroTrace := by + intro f hf hpot + show toVectorL2 hf ∈ + closure ((potentialZeroTraceSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure ⟨f, hf, rfl, hpot⟩ + mem_solenoidal := by + intro g hg hsol + show toVectorL2 hg ∈ closure ((solenoidalSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure ⟨g, hg, rfl, hsol⟩ + mem_solenoidalZeroNormalTrace := by + intro g hg hsol + show toVectorL2 hg ∈ + closure ((solenoidalZeroNormalTraceSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure ⟨g, hg, rfl, hsol⟩ + mem_blockPotentialSolenoidal := by + intro f g hf hg hpot hsol + show toBlockL2OfComponents hf hg ∈ + closure ((blockPotentialSolenoidalSubmodule U : Submodule ℝ (BlockL2 U)) : Set (BlockL2 U)) + exact subset_closure ⟨f, g, hf, hg, rfl, hpot, hsol⟩ + mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace := by + intro f g hf hg hpot hsol + show toBlockL2OfComponents hf hg ∈ + closure + ((blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U : + Submodule ℝ (BlockL2 U)) : Set (BlockL2 U)) + exact subset_closure ⟨f, g, hf, hg, rfl, hpot, hsol⟩ + potentialZeroTrace_le_potential := by + exact Submodule.closure_le.mpr <| by + intro X hX + show X ∈ closure ((potentialSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure (potentialZeroTraceSubmodule_le_potentialSubmodule hX) + solenoidalZeroNormalTrace_le_solenoidal := by + exact Submodule.closure_le.mpr <| by + intro X hX + show X ∈ closure ((solenoidalSubmodule U : Submodule ℝ (VectorL2 U)) : Set (VectorL2 U)) + exact subset_closure (solenoidalZeroNormalTraceSubmodule_le_solenoidalSubmodule hX) + blockPotentialZeroTraceSolenoidalZeroNormalTrace_le_blockPotentialSolenoidal := by + exact Submodule.closure_le.mpr <| by + intro X hX + show X ∈ closure ((blockPotentialSolenoidalSubmodule U : Submodule ℝ (BlockL2 U)) : Set (BlockL2 U)) + exact subset_closure + (blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule_le_blockPotentialSolenoidalSubmodule hX) + +/-- +Canonical packaged `L²` data attached to a Sobolev-regular domain. + +The current implementation is obtained by closing the predicate-generated +Sobolev submodules; the domain regularity hypothesis gives downstream files a +stable constructor surface to consume. +-/ +noncomputable def ofIsSobolevRegularDomain + (_hU : IsSobolevRegularDomain U) : PotentialSolenoidalL2Data U := + ofSubmoduleClosures U + +/-- Canonical packaged `L²` data attached to a bounded open convex domain. -/ +noncomputable def ofIsOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) : PotentialSolenoidalL2Data U := + ofIsSobolevRegularDomain hU.isSobolevRegularDomain + +/-- Honest closed-range/realization hypothesis for the canonical zero-trace +potential space. This says that the closure used in `ofSubmoduleClosures` has +no extra abstract elements: every closed `L²` zero-trace potential class is +represented by the gradient of an actual `H¹₀` function. -/ +def HasPotentialZeroTraceClosureRealization (U : Set (Vec d)) : Prop := + ∀ F : VectorL2 U, + F ∈ (ofSubmoduleClosures U).potentialZeroTrace → + IsPotentialZeroTraceOn U F + +/-- Apply the closed-range/realization hypothesis for the canonical zero-trace +potential subspace. -/ +theorem isPotentialZeroTraceOn_of_mem_potentialZeroTrace_ofSubmoduleClosures + (hRealize : HasPotentialZeroTraceClosureRealization U) + (F : VectorL2 U) (hF : F ∈ (ofSubmoduleClosures U).potentialZeroTrace) : + IsPotentialZeroTraceOn U F := + hRealize F hF + +/-- Membership in the canonical closed solenoidal subspace recovers the weak +solenoidal predicate on the represented vector field. -/ +theorem isSolenoidalOn_of_mem_solenoidal_ofSubmoduleClosures + (G : VectorL2 U) (hG : G ∈ (ofSubmoduleClosures U).solenoidal) : + IsSolenoidalOn U G := by + have hEq : toVectorL2 (MeasureTheory.Lp.memLp G) = G := by + exact MeasureTheory.Lp.toLp_coeFn G (MeasureTheory.Lp.memLp G) + have hG' : toVectorL2 (MeasureTheory.Lp.memLp G) ∈ (solenoidalSubmodule U).closure := by + simpa [ofSubmoduleClosures, hEq] using hG + simpa using + isSolenoidalOn_of_mem_closure_solenoidalSubmodule (MeasureTheory.Lp.memLp G) hG' + +/-- Membership in the canonical closed zero-normal-trace solenoidal subspace +recovers the corresponding weak predicate on the represented vector field. -/ +theorem isSolenoidalZeroNormalTraceOn_of_mem_solenoidalZeroNormalTrace_ofSubmoduleClosures + (G : VectorL2 U) (hG : G ∈ (ofSubmoduleClosures U).solenoidalZeroNormalTrace) : + IsSolenoidalZeroNormalTraceOn U G := by + have hEq : toVectorL2 (MeasureTheory.Lp.memLp G) = G := by + exact MeasureTheory.Lp.toLp_coeFn G (MeasureTheory.Lp.memLp G) + have hG' : + toVectorL2 (MeasureTheory.Lp.memLp G) ∈ (solenoidalZeroNormalTraceSubmodule U).closure := by + simpa [ofSubmoduleClosures, hEq] using hG + simpa using + isSolenoidalZeroNormalTraceOn_of_mem_closure_solenoidalZeroNormalTraceSubmodule + (MeasureTheory.Lp.memLp G) hG' + +private noncomputable def vectorPairingCLM + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) : + VectorL2 U →L[ℝ] ℝ := + (InnerProductSpace.toDual ℝ (HilbertVectorL2 U) (toHilbertVectorL2OfVecField hg)).comp + ((continuousLinearEquivVectorL2 (U := U)).toContinuousLinearMap) + +private theorem vectorPairingCLM_apply_eq_integral + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (F : VectorL2 U) : + vectorPairingCLM (U := U) hg F = + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume := by + have hF : + (continuousLinearEquivVectorL2 (U := U)) F = + toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F) := by + calc + (continuousLinearEquivVectorL2 (U := U)) F = vectorL2ToHilbertVectorL2 (U := U) F := by + rfl + _ = + vectorL2ToHilbertVectorL2 (U := U) + (toVectorL2 (MeasureTheory.Lp.memLp F)) := by + congr 1 + exact (MeasureTheory.Lp.toLp_coeFn F (MeasureTheory.Lp.memLp F)).symm + _ = toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F) := by + rfl + calc + vectorPairingCLM (U := U) hg F + = inner ℝ + (toHilbertVectorL2OfVecField hg) + ((continuousLinearEquivVectorL2 (U := U)) F) := by + simp [vectorPairingCLM] + _ = + inner ℝ + (toHilbertVectorL2OfVecField hg) + (toHilbertVectorL2OfVecField (MeasureTheory.Lp.memLp F)) := by + rw [hF] + _ = ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume := by + exact inner_toHilbertVectorL2OfVecField_eq_integral + (U := U) hg (MeasureTheory.Lp.memLp F) + +private theorem scalarInner_eq_integral_local + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (f g : ScalarL2 U) : + inner ℝ f g = ∫ x in U, f x * g x ∂MeasureTheory.volume := by + rw [MeasureTheory.L2.inner_def] + simp [mul_comm] + +private noncomputable def oneScalarL2Local + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : ScalarL2 U := + Homogenization.toScalarL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := (1 : ℝ))) + +private theorem coeFn_oneScalarL2Local + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : + oneScalarL2Local (U := U) =ᵐ[volumeMeasureOn U] fun _ : Vec d => (1 : ℝ) := + Homogenization.coeFn_toScalarL2 + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (p := (2 : ENNReal)) (c := (1 : ℝ))) + +private noncomputable def scalarIntegralCLMLocal + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] : ScalarL2 U →L[ℝ] ℝ := + InnerProductSpace.toDual ℝ (ScalarL2 U) (oneScalarL2Local (U := U)) + +private theorem scalarIntegralCLMLocal_apply + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (s : ScalarL2 U) : + scalarIntegralCLMLocal (U := U) s = ∫ x in U, s x ∂MeasureTheory.volume := by + rw [scalarIntegralCLMLocal, InnerProductSpace.toDual_apply_apply, real_inner_comm, + scalarInner_eq_integral_local] + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_oneScalarL2Local (U := U)] with x h1 + rw [h1] + ring + +/-- Members of the canonical closed zero-trace potential subspace are +orthogonal to every zero-normal-trace solenoidal test field. -/ +theorem integral_vecDot_eq_zero_of_mem_potentialZeroTrace_ofSubmoduleClosures + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (F : VectorL2 U) (hF : F ∈ (ofSubmoduleClosures U).potentialZeroTrace) + {g : Vec d → Vec d} (hg : MemVectorL2 U g) + (hsol : IsSolenoidalZeroNormalTraceOn U g) : + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume = 0 := by + let ℓ : VectorL2 U →L[ℝ] ℝ := vectorPairingCLM (U := U) hg + have hKClosed : IsClosed ((LinearMap.ker ℓ.toLinearMap : Submodule ℝ (VectorL2 U)) : + Set (VectorL2 U)) := by + simpa [LinearMap.mem_ker] using! + isClosed_singleton.preimage (ContinuousLinearMap.continuous ℓ) + let K : ClosedSubmodule ℝ (VectorL2 U) := ⟨LinearMap.ker ℓ.toLinearMap, hKClosed⟩ + have hsub : potentialZeroTraceSubmodule U ≤ LinearMap.ker ℓ.toLinearMap := by + intro X hX + rcases hX with ⟨f, hf, rfl, hpot⟩ + change ℓ (toVectorL2 hf) = 0 + rcases hpot with ⟨u, hu⟩ + have hpair : + ∫ x in U, vecDot (g x) ((toVectorL2 hf) x) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toVectorL2 hf] with x hx + rw [hx] + calc + ℓ (toVectorL2 hf) = ∫ x in U, vecDot (g x) ((toVectorL2 hf) x) ∂MeasureTheory.volume := + vectorPairingCLM_apply_eq_integral (U := U) hg (toVectorL2 hf) + _ = ∫ x in U, vecDot (g x) (f x) ∂MeasureTheory.volume := hpair + _ = 0 := by + simpa [hu] using hsol u.toH1Function + have hclosure : (ofSubmoduleClosures U).potentialZeroTrace ≤ LinearMap.ker ℓ.toLinearMap := by + exact (Submodule.closure_le (s := potentialZeroTraceSubmodule U) (t := K)).2 hsub + have hkerF : F ∈ LinearMap.ker ℓ.toLinearMap := hclosure hF + have hzero : ℓ F = 0 := by + exact hkerF + calc + ∫ x in U, vecDot (g x) (F x) ∂MeasureTheory.volume = ℓ F := by + symm + exact vectorPairingCLM_apply_eq_integral (U := U) hg F + _ = 0 := hzero + +private noncomputable def coordIntegralCLM + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (i : Fin d) : + VectorL2 U →L[ℝ] ℝ := + (scalarIntegralCLMLocal (U := U)).comp + ((ContinuousLinearMap.proj i).compLpL 2 (volumeMeasureOn U)) + +private theorem coordIntegralCLM_apply_eq_integral + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (i : Fin d) (F : VectorL2 U) : + coordIntegralCLM (U := U) i F = + ∫ x in U, F x i ∂MeasureTheory.volume := by + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + calc + coordIntegralCLM (U := U) i F + = scalarIntegralCLMLocal (U := U) ((π.compLpL 2 (volumeMeasureOn U)) F) := by + rfl + _ = ∫ x in U, ((π.compLpL 2 (volumeMeasureOn U)) F) x ∂MeasureTheory.volume := by + exact scalarIntegralCLMLocal_apply (U := U) ((π.compLpL 2 (volumeMeasureOn U)) F) + _ = ∫ x in U, F x i ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + simpa using! + (ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := π) + (f := F)) + +/-- Members of the canonical closed zero-trace potential subspace have +componentwise zero averages. -/ +theorem integral_coord_eq_zero_of_mem_potentialZeroTrace_ofSubmoduleClosures + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (F : VectorL2 U) (hF : F ∈ (ofSubmoduleClosures U).potentialZeroTrace) + (i : Fin d) : + ∫ x in U, F x i ∂MeasureTheory.volume = 0 := by + let ℓ : VectorL2 U →L[ℝ] ℝ := coordIntegralCLM (U := U) i + have hKClosed : IsClosed ((LinearMap.ker ℓ.toLinearMap : Submodule ℝ (VectorL2 U)) : + Set (VectorL2 U)) := by + simpa [LinearMap.mem_ker] using! + isClosed_singleton.preimage (ContinuousLinearMap.continuous ℓ) + let K : ClosedSubmodule ℝ (VectorL2 U) := ⟨LinearMap.ker ℓ.toLinearMap, hKClosed⟩ + have hsub : potentialZeroTraceSubmodule U ≤ LinearMap.ker ℓ.toLinearMap := by + intro X hX + rcases hX with ⟨f, hf, rfl, hpot⟩ + change ℓ (toVectorL2 hf) = 0 + have hzero := IsPotentialZeroTraceOn.integral_eq_zero hpot + have hpair : + ∫ x in U, ((toVectorL2 hf) x) i ∂MeasureTheory.volume = + ∫ x in U, f x i ∂MeasureTheory.volume := by + refine MeasureTheory.integral_congr_ae ?_ + filter_upwards [coeFn_toVectorL2 hf] with x hx + rw [hx] + calc + ℓ (toVectorL2 hf) = ∫ x in U, ((toVectorL2 hf) x) i ∂MeasureTheory.volume := + coordIntegralCLM_apply_eq_integral (U := U) i (toVectorL2 hf) + _ = ∫ x in U, f x i ∂MeasureTheory.volume := hpair + _ = 0 := by + simpa using congrFun hzero i + have hclosure : (ofSubmoduleClosures U).potentialZeroTrace ≤ LinearMap.ker ℓ.toLinearMap := by + exact (Submodule.closure_le (s := potentialZeroTraceSubmodule U) (t := K)).2 hsub + have hkerF : F ∈ LinearMap.ker ℓ.toLinearMap := hclosure hF + have hzero : ℓ F = 0 := by + exact hkerF + calc + ∫ x in U, F x i ∂MeasureTheory.volume = ℓ F := by + symm + exact coordIntegralCLM_apply_eq_integral (U := U) i F + _ = 0 := hzero + +/-- Specialization of the ambient carrier transport to block fields built from +two vector components. -/ +theorem hilbertBlockL2ToBlockL2_toHilbertBlockL2OfComponents + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + hilbertBlockL2ToBlockL2 (U := U) (toHilbertBlockL2OfComponents hf hg) = + toBlockL2OfComponents hf hg := by + simpa [toBlockL2OfComponents, toHilbertBlockL2OfComponents] using! + (Homogenization.hilbertBlockL2ToBlockL2_toHilbertBlockL2OfBlockField + (U := U) + (F := blockField f g) + (memBlockL2_blockField hf hg)) + +/-- Transport the packaged block correction space +`\Lpoto(U) × \Lsolo(U) ⊆ BlockL²(U)` into the Hilbert-block ambient space used +by the doubled `μ` problem. -/ +noncomputable def toMuCorrectionSpaceData (M : PotentialSolenoidalL2Data U) : + MuCorrectionSpaceData U where + correctionSpace := + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace.comap + (hilbertBlockL2ToBlockL2 (U := U)) + mem_correctionSpace := by + intro f g hf hg hpot hsol + show + hilbertBlockL2ToBlockL2 (U := U) (toHilbertBlockL2OfComponents hf hg) ∈ + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace + rw [hilbertBlockL2ToBlockL2_toHilbertBlockL2OfComponents (U := U) hf hg] + exact + M.mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace hf hg hpot hsol + +@[simp] theorem mem_toMuCorrectionSpaceData_iff (M : PotentialSolenoidalL2Data U) + (X : HilbertBlockL2 U) : + X ∈ M.toMuCorrectionSpaceData.correctionSpace ↔ + hilbertBlockL2ToBlockL2 (U := U) X ∈ + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace := + Iff.rfl + +end PotentialSolenoidalL2Data + +namespace MuCorrectionSpaceData + +variable {d : ℕ} + +/-- Canonical Hilbert correction-space packaging obtained from the closed +predicate-generated Sobolev block submodule. -/ +noncomputable def ofSubmoduleClosures (U : Set (Vec d)) : MuCorrectionSpaceData U := + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).toMuCorrectionSpaceData + +/-- +Canonical Hilbert correction-space packaging attached to a Sobolev-regular +domain. +-/ +noncomputable def ofIsSobolevRegularDomain {U : Set (Vec d)} + (hU : IsSobolevRegularDomain U) : MuCorrectionSpaceData U := + (PotentialSolenoidalL2Data.ofIsSobolevRegularDomain (U := U) hU).toMuCorrectionSpaceData + +/-- Canonical Hilbert correction-space packaging attached to a bounded open +convex domain. -/ +noncomputable def ofIsOpenBoundedConvexDomain {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) : MuCorrectionSpaceData U := + (PotentialSolenoidalL2Data.ofIsOpenBoundedConvexDomain (U := U) hU).toMuCorrectionSpaceData + +end MuCorrectionSpaceData + +/-- Canonical packaged `L²` potential/solenoidal data on a Sobolev-regular +domain. -/ +noncomputable def potentialSolenoidalL2Data_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) : + PotentialSolenoidalL2Data U := + PotentialSolenoidalL2Data.ofIsSobolevRegularDomain hU + +/-- Canonical packaged Hilbert correction space on a Sobolev-regular domain. -/ +noncomputable def muCorrectionSpaceData_of_isSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsSobolevRegularDomain U) : + MuCorrectionSpaceData U := + MuCorrectionSpaceData.ofIsSobolevRegularDomain hU + +/-- Canonical packaged `L²` potential/solenoidal data on a bounded open convex +domain. -/ +noncomputable def potentialSolenoidalL2Data_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + PotentialSolenoidalL2Data U := + PotentialSolenoidalL2Data.ofIsOpenBoundedConvexDomain hU + +/-- Canonical packaged Hilbert correction space on a bounded open convex +domain. -/ +noncomputable def muCorrectionSpaceData_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) : + MuCorrectionSpaceData U := + MuCorrectionSpaceData.ofIsOpenBoundedConvexDomain hU + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2OriginCubeBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2OriginCubeBridge.lean new file mode 100644 index 0000000000..99ae6b0576 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2OriginCubeBridge.lean @@ -0,0 +1,511 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2Recovery +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalOriginCubeBridge + +/-! # Potential Solenoidal L2Origin Cube Bridge -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +namespace CorrectionFieldData + +theorem volume_cubeSet_originCube_lt_top_l2 {d : ℕ} (n : ℤ) : + MeasureTheory.volume (cubeSet (originCube d n)) < ⊤ := by + rw [lt_top_iff_ne_top] + intro htop + have hzero : (MeasureTheory.volume (cubeSet (originCube d n))).toReal = 0 := by + simp [htop] + rw [volume_cubeSet_toReal] at hzero + exact (ne_of_gt (cubeVolume_pos (originCube d n))) hzero + +theorem volume_openCubeSet_originCube_lt_top_l2 {d : ℕ} (n : ℤ) : + MeasureTheory.volume (openCubeSet (originCube d n)) < ⊤ := by + exact lt_of_le_of_lt + (MeasureTheory.measure_mono (openCubeSet_subset_cubeSet (originCube d n))) + (volume_cubeSet_originCube_lt_top_l2 (d := d) n) + +instance instIsFiniteMeasureVolumeMeasureOnOpenCubeSetOriginCube {d : ℕ} {n : ℤ} : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (openCubeSet (originCube d n))) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_openCubeSet_originCube_lt_top_l2 (d := d) n⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) + infer_instance + +instance instIsFiniteMeasureVolumeMeasureOnCubeSetOriginCube {d : ℕ} {n : ℤ} : + MeasureTheory.IsFiniteMeasure (volumeMeasureOn (cubeSet (originCube d n))) := by + let U : Set (Vec d) := cubeSet (originCube d n) + let : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_cubeSet_originCube_lt_top_l2 (d := d) n⟩ + change MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) + infer_instance + +/-- +On an open centered cube, the affine pairing attached to a zero-trace / +zero-normal-trace `L²` correction is integrable. +-/ +theorem integrableOn_pairing_affine_openCubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (openCubeSet (originCube d n))) (p q : Vec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot (p + X.potential x) (q + X.flux x)) + (openCubeSet (originCube d n)) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hsum : + MeasureTheory.IntegrableOn + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum123.integrable.add hpairInt.integrable + have hEq : + (fun x => vecDot (p + X.potential x) (q + X.flux x)) = + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) := by + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + rw [hEq] + exact hsum + +/-- +On an open centered cube, the affine perturbation of a zero-trace / zero-normal-trace +`L²` correction has pairing integral equal to the cube volume times the constant pairing. +-/ +theorem integral_pairing_affine_openCubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (openCubeSet (originCube d n))) (p q : Vec d) : + ∫ x in openCubeSet (originCube d n), + vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal * vecDot p q := by + let U : Set (Vec d) := openCubeSet (originCube d n) + have : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_openCubeSet_originCube_lt_top_l2 (d := d) n⟩ + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := inferInstance + have hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (f := X.potential) X.isPotentialZeroTrace) + have hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (g := X.flux) X.isSolenoidalZeroNormalTrace) + rcases X.isPotentialZeroTrace with ⟨u, hu⟩ + have hpairZero : + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume = 0 := by + simpa [U, hu, vecDot_comm] using X.isSolenoidalZeroNormalTrace u.toH1Function + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hfluxTerm : + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume = 0 := + integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) p X.flux_memL2 hfluxZero + have hpotTerm : + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume = 0 := by + rw [show (fun x => vecDot (X.potential x) q) = fun x => vecDot q (X.potential x) by + funext x + exact vecDot_comm _ _] + exact integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) q X.potential_memL2 hpotZero + calc + ∫ x in U, vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + ∫ x in U, + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + congr 1 + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum123 hpairInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume := by + rw [hpairZero, add_zero] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum12 hpotInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [hpotTerm, add_zero] + _ = + ∫ x in U, (vecDot p q) ∂MeasureTheory.volume + + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = (MeasureTheory.volume U).toReal * vecDot p q := by + rw [hfluxTerm, add_zero] + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +/-- +On an open centered cube, the affine potential field `p + correction` has +componentwise integral equal to the cube volume times `p`. +-/ +theorem integral_potential_affine_openCubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (openCubeSet (originCube d n))) (p : Vec d) : + (fun i => ∫ x in openCubeSet (originCube d n), (p + X.potential x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal • p := by + let U : Set (Vec d) := openCubeSet (originCube d n) + have hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (f := X.potential) X.isPotentialZeroTrace) + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => p i) U := by + simp [MeasureTheory.IntegrableOn] + have hpotInt : + MeasureTheory.IntegrableOn (fun x => X.potential x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.potential_memL2 i + calc + ∫ x in U, (p + X.potential x) i ∂MeasureTheory.volume = + ∫ x in U, p i + X.potential x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (p i) ∂MeasureTheory.volume + + ∫ x in U, X.potential x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hpotInt] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.potential x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hpotZero i] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * p i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +/-- +On an open centered cube, the affine flux field `q + correction` has +componentwise integral equal to the cube volume times `q`. +-/ +theorem integral_flux_affine_openCubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (openCubeSet (originCube d n))) (q : Vec d) : + (fun i => ∫ x in openCubeSet (originCube d n), (q + X.flux x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume (openCubeSet (originCube d n))).toReal • q := by + let U : Set (Vec d) := openCubeSet (originCube d n) + have hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (g := X.flux) X.isSolenoidalZeroNormalTrace) + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => q i) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => X.flux x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.flux_memL2 i + calc + ∫ x in U, (q + X.flux x) i ∂MeasureTheory.volume = + ∫ x in U, q i + X.flux x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (q i) ∂MeasureTheory.volume + + ∫ x in U, X.flux x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.flux x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hfluxZero i] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * q i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +/-- +On the half-open centered cube, the affine pairing attached to a zero-trace / +zero-normal-trace `L²` correction is integrable. +-/ +theorem integrableOn_pairing_affine_cubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (cubeSet (originCube d n))) (p q : Vec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot (p + X.potential x) (q + X.flux x)) + (cubeSet (originCube d n)) := by + let U : Set (Vec d) := cubeSet (originCube d n) + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hsum : + MeasureTheory.IntegrableOn + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum123.integrable.add hpairInt.integrable + have hEq : + (fun x => vecDot (p + X.potential x) (q + X.flux x)) = + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) := by + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + rw [hEq] + exact hsum + +/-- +On the half-open centered cube, the affine perturbation of a zero-trace / zero-normal-trace +`L²` correction has pairing integral equal to the cube volume times the constant pairing. +-/ +theorem integral_pairing_affine_cubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (cubeSet (originCube d n))) (p q : Vec d) : + ∫ x in cubeSet (originCube d n), + vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume (cubeSet (originCube d n))).toReal * vecDot p q := by + let U : Set (Vec d) := cubeSet (originCube d n) + have : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_cubeSet_originCube_lt_top_l2 (d := d) n⟩ + have : MeasureTheory.IsFiniteMeasure (volumeMeasureOn U) := inferInstance + have hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (f := X.potential) X.isPotentialZeroTrace) + have hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (g := X.flux) X.isSolenoidalZeroNormalTrace) + rcases X.isPotentialZeroTrace with ⟨u, hu⟩ + have hpairZero : + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume = 0 := by + simpa [U, hu, vecDot_comm] using X.isSolenoidalZeroNormalTrace u.toH1Function + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hfluxTerm : + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume = 0 := + integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) p X.flux_memL2 hfluxZero + have hpotTerm : + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume = 0 := by + rw [show (fun x => vecDot (X.potential x) q) = fun x => vecDot q (X.potential x) by + funext x + exact vecDot_comm _ _] + exact integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) q X.potential_memL2 hpotZero + calc + ∫ x in U, vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + ∫ x in U, + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + congr 1 + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum123 hpairInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume := by + rw [hpairZero, add_zero] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum12 hpotInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [hpotTerm, add_zero] + _ = + ∫ x in U, (vecDot p q) ∂MeasureTheory.volume + + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = (MeasureTheory.volume U).toReal * vecDot p q := by + rw [hfluxTerm, add_zero] + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +/-- +On the half-open centered cube, the affine potential field `p + correction` has +componentwise integral equal to the cube volume times `p`. +-/ +theorem integral_potential_affine_cubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (cubeSet (originCube d n))) (p : Vec d) : + (fun i => ∫ x in cubeSet (originCube d n), (p + X.potential x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume (cubeSet (originCube d n))).toReal • p := by + let U : Set (Vec d) := cubeSet (originCube d n) + have hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (f := X.potential) X.isPotentialZeroTrace) + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => p i) U := by + simp [MeasureTheory.IntegrableOn] + have hpotInt : + MeasureTheory.IntegrableOn (fun x => X.potential x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.potential_memL2 i + calc + ∫ x in U, (p + X.potential x) i ∂MeasureTheory.volume = + ∫ x in U, p i + X.potential x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (p i) ∂MeasureTheory.volume + + ∫ x in U, X.potential x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hpotInt] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.potential x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hpotZero i] + _ = ∫ x in U, (p i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * p i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +/-- +On the half-open centered cube, the affine flux field `q + correction` has +componentwise integral equal to the cube volume times `q`. +-/ +theorem integral_flux_affine_cubeSet_originCube {d : ℕ} [NeZero d] {n : ℤ} + (X : CorrectionFieldData (cubeSet (originCube d n))) (q : Vec d) : + (fun i => ∫ x in cubeSet (originCube d n), (q + X.flux x) i ∂MeasureTheory.volume) = + (MeasureTheory.volume (cubeSet (originCube d n))).toReal • q := by + let U : Set (Vec d) := cubeSet (originCube d n) + have hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0 := by + simpa [U] using + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube + (d := d) (n := n) (g := X.flux) X.isSolenoidalZeroNormalTrace) + ext i + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => q i) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => X.flux x i) U := + integrableOn_coord_of_memVectorL2 (U := U) X.flux_memL2 i + calc + ∫ x in U, (q + X.flux x) i ∂MeasureTheory.volume = + ∫ x in U, q i + X.flux x i ∂MeasureTheory.volume := by + simp + _ = + ∫ x in U, (q i) ∂MeasureTheory.volume + + ∫ x in U, X.flux x i ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume + 0 := by + rw [show ∫ x in U, X.flux x i ∂MeasureTheory.volume = 0 by + simpa using congrFun hfluxZero i] + _ = ∫ x in U, (q i) ∂MeasureTheory.volume := by + simp + _ = (MeasureTheory.volume U).toReal * q i := by + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +end CorrectionFieldData + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Realization.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Realization.lean new file mode 100644 index 0000000000..0b4c1dd322 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Realization.lean @@ -0,0 +1,158 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.H10Graph + +/-! # Potential Solenoidal L2Realization -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Closed-range realization for the canonical zero-trace potential subspace + +This file closes the last abstract hypothesis used by the note-facing coarse +Poincare theorem surface. The proof combines: + +* the representative upgrade `exists_h10Function_of_mem_h10GraphClosedSubmodule` + from `Foundations/H10Graph.lean`, which shows every point of the closed + `H¹₀` graph is realized by an honest `H¹₀` function, and +* the closed-range gradient projection + `H10GraphClosed.isClosed_range_gradientCLM`. + +Together they discharge `HasPotentialZeroTraceClosureRealization U` on every +bounded open convex domain. +-/ + +namespace PotentialSolenoidalL2Data + +variable {d : ℕ} [NeZero d] {U : Set (Vec d)} +/-- Every generator of the predicate `L²` zero-trace potential submodule +transports under `vectorL2ToHilbertVectorL2` to an element in the range of +the gradient projection from the closed `H¹₀` graph. -/ +private theorem vectorL2ToHilbertVectorL2_mem_range_gradientCLM_of_mem_potentialZeroTraceSubmodule + {F : VectorL2 U} (hF : F ∈ potentialZeroTraceSubmodule U) : + vectorL2ToHilbertVectorL2 (U := U) F ∈ + Set.range (H10GraphClosed.gradientCLM (d := d) (U := U)) := by + rcases hF with ⟨f, hf, hFeq, hpot⟩ + obtain ⟨u, hu⟩ := hpot + have hpair_open : + (u.toH1Function.toScalarL2, u.toH1Function.gradToHilbertVectorL2) ∈ + h10GraphSubmodule U := + h10_pair_mem_h10GraphSubmodule u + have hpair : + (u.toH1Function.toScalarL2, u.toH1Function.gradToHilbertVectorL2) ∈ + (h10GraphClosedSubmodule U).toSubmodule := + (Submodule.le_topologicalClosure _) hpair_open + refine ⟨⟨(u.toH1Function.toScalarL2, u.toH1Function.gradToHilbertVectorL2), + hpair⟩, ?_⟩ + have hHilbertEq : + toHilbertVectorL2OfVecField hf = u.toH1Function.gradToHilbertVectorL2 := by + apply MeasureTheory.Lp.ext + filter_upwards [coeFn_toHilbertVectorL2OfVecField (U := U) hf, + u.toH1Function.coeFn_gradToHilbertVectorL2] with x hhf hhu + rw [hhf, hhu] + simp [hilbertifyVecField, ← hu] + show H10GraphClosed.gradientCLM (d := d) (U := U) _ = + vectorL2ToHilbertVectorL2 (U := U) F + have hFhilbert : + vectorL2ToHilbertVectorL2 (U := U) F = u.toH1Function.gradToHilbertVectorL2 := by + rw [← hFeq, vectorL2ToHilbertVectorL2_toVectorL2] + exact hHilbertEq + rw [hFhilbert] + rfl + +/-- Main realization theorem: on bounded open convex domains, every member +of the canonical closed zero-trace potential subspace is the gradient of an +actual `H¹₀` function. -/ +theorem hasPotentialZeroTraceClosureRealization_of_isOpenBoundedConvexDomain + (hU : IsOpenBoundedConvexDomain U) : + HasPotentialZeroTraceClosureRealization U := by + intro F hF + -- Step 1: Unfold membership to a closure statement in the ambient set. + have hF_closure : + F ∈ closure ((potentialZeroTraceSubmodule U : Submodule ℝ (VectorL2 U)) : + Set (VectorL2 U)) := by + have hFSub : F ∈ (potentialZeroTraceSubmodule U).topologicalClosure := hF + simpa [Submodule.topologicalClosure_coe] using! hFSub + -- Step 2: Package the range of `gradientCLM` as a closed set, and use + -- continuity of `vectorL2ToHilbertVectorL2` to push the closure through. + let S : Set (HilbertVectorL2 U) := + Set.range (H10GraphClosed.gradientCLM (d := d) (U := U)) + have hS_closed : IsClosed S := + H10GraphClosed.isClosed_range_gradientCLM (U := U) hU + have hpre_closed : + IsClosed + ((vectorL2ToHilbertVectorL2 (U := U)) ⁻¹' S) := + hS_closed.preimage (vectorL2ToHilbertVectorL2 (U := U)).continuous + have hsub : + ((potentialZeroTraceSubmodule U : Submodule ℝ (VectorL2 U)) : + Set (VectorL2 U)) ⊆ + (vectorL2ToHilbertVectorL2 (U := U)) ⁻¹' S := by + intro F' hF' + exact + vectorL2ToHilbertVectorL2_mem_range_gradientCLM_of_mem_potentialZeroTraceSubmodule hF' + have hFinRange : + vectorL2ToHilbertVectorL2 (U := U) F ∈ S := by + have : F ∈ (vectorL2ToHilbertVectorL2 (U := U)) ⁻¹' S := + (closure_minimal hsub hpre_closed) hF_closure + exact this + rcases hFinRange with ⟨z, hz⟩ + -- Step 3: Upgrade `z : H10GraphClosedSpace U` to an honest `H¹₀` function. + rcases exists_h10Function_of_mem_h10GraphClosedSubmodule (U := U) hU z.2 + with ⟨u, hu_val, hu_grad⟩ + -- Step 4: Transport back to `VectorL2 U` and identify `u.toH1Function.grad` with `F`. + have hgrad_eq : + vectorL2ToHilbertVectorL2 (U := U) F = u.toH1Function.gradToHilbertVectorL2 := by + -- z.2 := gradient z in the closed graph, matches `gradientCLM z = vectorL2ToHilbertVectorL2 F`. + have : H10GraphClosed.gradientCLM (d := d) (U := U) z = + u.toH1Function.gradToHilbertVectorL2 := by + -- gradientCLM z = (z : ScalarL2 × HilbertVectorL2).snd = z.1.2 = z.2 + -- But here z : H10GraphClosedSpace; we only know u.gradToHilbertVectorL2 = z.1.2 + -- via hu_grad. We need: gradientCLM z = z.1.2. + have := hu_grad + -- gradientCLM z = z.1.2 by definition + simp [H10GraphClosed.gradientCLM] + exact this.symm + rw [← this, hz] + have hF_back : + F = u.toH1Function.gradToVectorL2 := by + have hinv := hilbertVectorL2ToVectorL2_vectorL2ToHilbertVectorL2 (U := U) F + have happly : + hilbertVectorL2ToVectorL2 (U := U) u.toH1Function.gradToHilbertVectorL2 + = u.toH1Function.gradToVectorL2 := by + simp [H1Function.gradToVectorL2, H1Function.gradToHilbertVectorL2, + hilbertVectorL2ToVectorL2_toHilbertVectorL2] + calc + F = hilbertVectorL2ToVectorL2 (U := U) + (vectorL2ToHilbertVectorL2 (U := U) F) := hinv.symm + _ = hilbertVectorL2ToVectorL2 (U := U) + u.toH1Function.gradToHilbertVectorL2 := by rw [hgrad_eq] + _ = u.toH1Function.gradToVectorL2 := happly + -- Step 5: a.e. equality → `IsPotentialZeroTraceOn` via `congr_ae`. + have hae : u.toH1Function.grad =ᵐ[MeasureTheory.volume.restrict U] ⇑F := by + have h1 : (⇑u.toH1Function.gradToVectorL2 : Vec d → Vec d) + =ᵐ[volumeMeasureOn U] u.toH1Function.grad := + u.toH1Function.coeFn_gradToVectorL2 + have h2 : + (⇑u.toH1Function.gradToVectorL2 : Vec d → Vec d) + =ᵐ[volumeMeasureOn U] (⇑F : Vec d → Vec d) := by + rw [hF_back] + -- Combine h1 (symmetric) and h2. + have hcombine : + (u.toH1Function.grad : Vec d → Vec d) + =ᵐ[volumeMeasureOn U] (⇑F : Vec d → Vec d) := + (h1.symm).trans h2 + exact hcombine + exact IsPotentialZeroTraceOn.congr_ae hae ⟨u, rfl⟩ + +end PotentialSolenoidalL2Data + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Recovery.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Recovery.lean new file mode 100644 index 0000000000..fe312dac7a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalL2Recovery.lean @@ -0,0 +1,919 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Hodge +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidalL2 +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import Mathlib.Topology.Basic + +/-! # Potential Solenoidal L2Recovery -/ + +@[expose] public section + +namespace Homogenization + +noncomputable section + +/-! +This file adds a representative-level recovery interface for the abstract +Hilbert correction space `\Lpoto(U) × \Lsolo(U)`. + +`MuCorrectionSpaceData` packages the correction space as a closed Hilbert +subspace of `L²(U; \R^{2d})`, which is the right level for minimization. The +results downstream that recover the note-faithful pointwise minimizers need a +converse interface: a way to choose actual potential/solenoidal vector fields +representing abstract elements of that closed subspace. +-/ + +section Representatives + +variable {d : ℕ} {U : Set (Vec d)} + +/-- A pointwise representative of an element of +`\Lpoto(U) × \Lsolo(U)`. -/ +structure CorrectionFieldData (U : Set (Vec d)) where + /-- The potential component. -/ + potential : Vec d → Vec d + /-- The solenoidal component. -/ + flux : Vec d → Vec d + /-- `L²` control of the potential component. -/ + potential_memL2 : MemVectorL2 U potential + /-- `L²` control of the solenoidal component. -/ + flux_memL2 : MemVectorL2 U flux + /-- Zero-trace potential witness. -/ + isPotentialZeroTrace : IsPotentialZeroTraceOn U potential + /-- Zero-normal-trace solenoidal witness. -/ + isSolenoidalZeroNormalTrace : IsSolenoidalZeroNormalTraceOn U flux + +namespace CorrectionFieldData + +variable {d : ℕ} {U : Set (Vec d)} + +theorem memScalarL2_coord_of_memVectorL2 + {f : Vec d → Vec d} (hf : MemVectorL2 U f) (i : Fin d) : + MemScalarL2 U (fun x => f x i) := by + let π : Vec d →L[ℝ] ℝ := ContinuousLinearMap.proj i + simpa [MemScalarL2, MemVectorL2, volumeMeasureOn] using! π.comp_memLp' hf + +theorem integrableOn_coord_of_memVectorL2 + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f : Vec d → Vec d} (hf : MemVectorL2 U f) (i : Fin d) : + MeasureTheory.IntegrableOn (fun x => f x i) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (memScalarL2_coord_of_memVectorL2 hf i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + +theorem integrableOn_vecDot_const_left_of_memVectorL2 + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (p : Vec d) {f : Vec d → Vec d} (hf : MemVectorL2 U f) : + MeasureTheory.IntegrableOn (fun x => vecDot p (f x)) U := by + have hsum : + MeasureTheory.IntegrableOn (fun x => ∑ i, p i * f x i) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (MeasureTheory.integrable_finsetSum + (μ := volumeMeasureOn U) + Finset.univ + (fun i _ => (integrableOn_coord_of_memVectorL2 hf i).integrable.const_mul (p i))) + simpa [vecDot] using hsum + +theorem integrableOn_vecDot_of_memVectorL2 + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {f g : Vec d → Vec d} (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + MeasureTheory.IntegrableOn (fun x => vecDot (f x) (g x)) U := by + have hsum : + MeasureTheory.IntegrableOn (fun x => ∑ i, f x i * g x i) U := by + simpa [MeasureTheory.IntegrableOn, volumeMeasureOn] using + (MeasureTheory.integrable_finsetSum + (μ := volumeMeasureOn U) + Finset.univ + (fun i _ => + (memScalarL2_coord_of_memVectorL2 hf i).integrable_mul + (memScalarL2_coord_of_memVectorL2 hg i))) + simpa [vecDot] using hsum + +theorem integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (p : Vec d) {f : Vec d → Vec d} + (hf : MemVectorL2 U f) + (hzero : (fun i => ∫ x in U, f x i ∂MeasureTheory.volume) = 0) : + ∫ x in U, vecDot p (f x) ∂MeasureTheory.volume = 0 := by + rw [show (fun x => vecDot p (f x)) = fun x => ∑ i, p i * f x i by + funext x + simp [vecDot]] + rw [MeasureTheory.integral_finsetSum] + · refine Finset.sum_eq_zero ?_ + intro i hi + rw [MeasureTheory.integral_const_mul] + rw [congrFun hzero i] + simp + · intro i hi + exact (integrableOn_coord_of_memVectorL2 hf i).integrable.const_mul (p i) + +/-- The block-valued field represented by the two components. -/ +def toBlockField (X : CorrectionFieldData U) : Vec d → BlockVec d := + blockField X.potential X.flux + +@[simp] theorem toBlockField_fst (X : CorrectionFieldData U) (x : Vec d) : + (X.toBlockField x).1 = X.potential x := + rfl + +@[simp] theorem toBlockField_snd (X : CorrectionFieldData U) (x : Vec d) : + (X.toBlockField x).2 = X.flux x := + rfl + +/-- The represented block field is in `L²(U; \R^{2d})`. -/ +theorem memBlockL2_toBlockField (X : CorrectionFieldData U) : + MemBlockL2 U X.toBlockField := + memBlockL2_blockField X.potential_memL2 X.flux_memL2 + +/-- The represented correction field as an element of the plain block ambient +space. -/ +noncomputable def toBlockL2 (X : CorrectionFieldData U) : BlockL2 U := + Homogenization.toBlockL2 X.memBlockL2_toBlockField + +/-- The plain block `L²` representative agrees almost everywhere with the +pointwise block field. -/ +theorem coeFn_toBlockL2 (X : CorrectionFieldData U) : + X.toBlockL2 =ᵐ[volumeMeasureOn U] X.toBlockField := + Homogenization.coeFn_toBlockL2 X.memBlockL2_toBlockField + +/-- The represented correction field as an element of the Hilbert ambient +space. -/ +noncomputable def toHilbertBlockL2 (X : CorrectionFieldData U) : HilbertBlockL2 U := + toHilbertBlockL2OfComponents X.potential_memL2 X.flux_memL2 + +theorem coeFn_toHilbertBlockL2 (X : CorrectionFieldData U) : + X.toHilbertBlockL2 =ᵐ[volumeMeasureOn U] hilbertBlockField X.potential X.flux := + coeFn_toHilbertBlockL2OfComponents X.potential_memL2 X.flux_memL2 + +theorem blockL2ToHilbertBlockL2_toBlockL2 (X : CorrectionFieldData U) : + blockL2ToHilbertBlockL2 (U := U) X.toBlockL2 = X.toHilbertBlockL2 := by + calc + blockL2ToHilbertBlockL2 (U := U) X.toBlockL2 + = toHilbertBlockL2OfBlockField X.memBlockL2_toBlockField := by + simpa [CorrectionFieldData.toBlockL2] using + (Homogenization.blockL2ToHilbertBlockL2_toBlockL2 + (U := U) + (F := X.toBlockField) + X.memBlockL2_toBlockField) + _ = X.toHilbertBlockL2 := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toHilbertBlockL2OfBlockField (U := U) + (F := X.toBlockField) + X.memBlockL2_toBlockField, + X.coeFn_toHilbertBlockL2] + with x hblock hhilbert + rw [hblock, hhilbert] + simp [CorrectionFieldData.toBlockField, hilbertifyBlockField, hilbertBlockField, blockField] + +theorem integrableOn_pairing_affine + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (X : CorrectionFieldData U) (p q : Vec d) : + MeasureTheory.IntegrableOn + (fun x => vecDot (p + X.potential x) (q + X.flux x)) U := by + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hsum : + MeasureTheory.IntegrableOn + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum123.integrable.add hpairInt.integrable + have hEq : + (fun x => vecDot (p + X.potential x) (q + X.flux x)) = + (fun x => + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x)) := by + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + rw [hEq] + exact hsum + +theorem integral_pairing_affine_eq_volume_mul_vecDot_of_integral_eq_zero + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + (X : CorrectionFieldData U) (p q : Vec d) + (hpotZero : + (fun i => ∫ x in U, X.potential x i ∂MeasureTheory.volume) = 0) + (hfluxZero : + (fun i => ∫ x in U, X.flux x i ∂MeasureTheory.volume) = 0) : + ∫ x in U, vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + (MeasureTheory.volume U).toReal * vecDot p q := by + rcases X.isPotentialZeroTrace with ⟨u, hu⟩ + have hpairZero : + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume = 0 := by + simpa [hu, vecDot_comm] using X.isSolenoidalZeroNormalTrace u.toH1Function + have hconstInt : + MeasureTheory.IntegrableOn (fun _ : Vec d => vecDot p q) U := by + simp [MeasureTheory.IntegrableOn] + have hfluxInt : + MeasureTheory.IntegrableOn (fun x => vecDot p (X.flux x)) U := + integrableOn_vecDot_const_left_of_memVectorL2 (U := U) p X.flux_memL2 + have hpotInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) q) U := by + simpa [vecDot_comm] using + (integrableOn_vecDot_const_left_of_memVectorL2 (U := U) q X.potential_memL2) + have hpairInt : + MeasureTheory.IntegrableOn (fun x => vecDot (X.potential x) (X.flux x)) U := + integrableOn_vecDot_of_memVectorL2 (U := U) X.potential_memL2 X.flux_memL2 + have hsum12 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x)) U := by + simpa [MeasureTheory.IntegrableOn] using hconstInt.integrable.add hfluxInt.integrable + have hsum123 : + MeasureTheory.IntegrableOn + (fun x => (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) U := by + simpa [MeasureTheory.IntegrableOn] using! hsum12.integrable.add hpotInt.integrable + have hfluxTerm : + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume = 0 := + integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) p X.flux_memL2 hfluxZero + have hpotTerm : + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume = 0 := by + rw [show (fun x => vecDot (X.potential x) q) = fun x => vecDot q (X.potential x) by + funext x + exact vecDot_comm _ _] + exact integral_vecDot_const_left_eq_zero_of_integral_eq_zero_coords + (U := U) q X.potential_memL2 hpotZero + calc + ∫ x in U, vecDot (p + X.potential x) (q + X.flux x) ∂MeasureTheory.volume = + ∫ x in U, + ((vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q) + + vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + congr 1 + funext x + simp [vecDot_add_left, vecDot_add_right, add_assoc] + ring + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum123 hpairInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) + vecDot (X.potential x) q + ∂MeasureTheory.volume := by + rw [hpairZero, add_zero] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume + + ∫ x in U, vecDot (X.potential x) q ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hsum12 hpotInt] + _ = + ∫ x in U, (vecDot p q) + vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [hpotTerm, add_zero] + _ = + ∫ x in U, (vecDot p q) ∂MeasureTheory.volume + + ∫ x in U, vecDot p (X.flux x) ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_add hconstInt hfluxInt] + _ = (MeasureTheory.volume U).toReal * vecDot p q := by + rw [hfluxTerm, add_zero] + rw [MeasureTheory.integral_const, smul_eq_mul] + have hμ₁ : + (MeasureTheory.volume.restrict U).real Set.univ = MeasureTheory.volume.real U := by + exact MeasureTheory.measureReal_restrict_apply_univ (μ := MeasureTheory.volume) U + have hμ₂ : MeasureTheory.volume.real U = (MeasureTheory.volume U).toReal := rfl + rw [hμ₁, hμ₂] + +end CorrectionFieldData + +private noncomputable def blockFstCLM {d : ℕ} {U : Set (Vec d)} : + BlockL2 U →L[ℝ] VectorL2 U := + (ContinuousLinearMap.fst ℝ (Vec d) (Vec d)).compLpL 2 (volumeMeasureOn U) + +private noncomputable def blockSndCLM {d : ℕ} {U : Set (Vec d)} : + BlockL2 U →L[ℝ] VectorL2 U := + (ContinuousLinearMap.snd ℝ (Vec d) (Vec d)).compLpL 2 (volumeMeasureOn U) + +private theorem blockFstCLM_apply_toBlockL2OfComponents + {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + blockFstCLM (U := U) (toBlockL2OfComponents hf hg) = toVectorL2 hf := by + apply MeasureTheory.Lp.ext + filter_upwards + [ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := ContinuousLinearMap.fst ℝ (Vec d) (Vec d)) + (f := toBlockL2OfComponents hf hg), + coeFn_toBlockL2OfComponents hf hg, + coeFn_toVectorL2 hf] + with x hfst hblock hvec + calc + (blockFstCLM (U := U) (toBlockL2OfComponents hf hg)) x + = (ContinuousLinearMap.fst ℝ (Vec d) (Vec d)) + ((toBlockL2OfComponents hf hg) x) := by + simpa [blockFstCLM] using hfst + _ = f x := by + simp [hblock, blockField] + _ = (toVectorL2 hf) x := by + symm + exact hvec + +private theorem blockSndCLM_apply_toBlockL2OfComponents + {d : ℕ} {U : Set (Vec d)} {f g : Vec d → Vec d} + (hf : MemVectorL2 U f) (hg : MemVectorL2 U g) : + blockSndCLM (U := U) (toBlockL2OfComponents hf hg) = toVectorL2 hg := by + apply MeasureTheory.Lp.ext + filter_upwards + [ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := ContinuousLinearMap.snd ℝ (Vec d) (Vec d)) + (f := toBlockL2OfComponents hf hg), + coeFn_toBlockL2OfComponents hf hg, + coeFn_toVectorL2 hg] + with x hsnd hblock hvec + calc + (blockSndCLM (U := U) (toBlockL2OfComponents hf hg)) x + = (ContinuousLinearMap.snd ℝ (Vec d) (Vec d)) + ((toBlockL2OfComponents hf hg) x) := by + simpa [blockSndCLM] using hsnd + _ = g x := by + simp [hblock, blockField] + _ = (toVectorL2 hg) x := by + symm + exact hvec + +private theorem toBlockL2OfComponents_blockFstCLM_blockSndCLM + {d : ℕ} {U : Set (Vec d)} (X : BlockL2 U) : + toBlockL2OfComponents + (MeasureTheory.Lp.memLp (blockFstCLM (U := U) X)) + (MeasureTheory.Lp.memLp (blockSndCLM (U := U) X)) = + X := by + apply MeasureTheory.Lp.ext + filter_upwards + [coeFn_toBlockL2OfComponents + (MeasureTheory.Lp.memLp (blockFstCLM (U := U) X)) + (MeasureTheory.Lp.memLp (blockSndCLM (U := U) X)), + ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := ContinuousLinearMap.fst ℝ (Vec d) (Vec d)) + (f := X), + ContinuousLinearMap.coeFn_compLpL + (p := 2) + (μ := volumeMeasureOn U) + (L := ContinuousLinearMap.snd ℝ (Vec d) (Vec d)) + (f := X)] + with x hblock hfst hsnd + rw [hblock] + ext i + · simpa [blockField, blockFstCLM] using congrFun hfst i + · simpa [blockField, blockSndCLM] using congrFun hsnd i + +theorem PotentialSolenoidalL2Data.mem_potentialZeroTrace_of_mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_ofSubmoduleClosures + {d : ℕ} {U : Set (Vec d)} (X : BlockL2 U) + (hX : + X ∈ (PotentialSolenoidalL2Data.ofSubmoduleClosures U).blockPotentialZeroTraceSolenoidalZeroNormalTrace) : + blockFstCLM (U := U) X ∈ (PotentialSolenoidalL2Data.ofSubmoduleClosures U).potentialZeroTrace := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let K : ClosedSubmodule ℝ (BlockL2 U) := M.potentialZeroTrace.comap (blockFstCLM (U := U)) + have hsub : + blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U ≤ K.toSubmodule := by + intro Y hY + rcases hY with ⟨f, g, hf, hg, rfl, hpot, _hsol⟩ + show blockFstCLM (U := U) (toBlockL2OfComponents hf hg) ∈ M.potentialZeroTrace + rw [blockFstCLM_apply_toBlockL2OfComponents hf hg] + simpa [M] using M.mem_potentialZeroTrace hf hpot + have hclosure : + (blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U).closure ≤ K.toSubmodule := by + exact + (Submodule.closure_le (s := blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U) + (t := K)).2 hsub + have hclosure' : M.blockPotentialZeroTraceSolenoidalZeroNormalTrace ≤ K := by + intro Y hY + exact hclosure (by simpa [M] using! hY) + exact hclosure' hX + +theorem PotentialSolenoidalL2Data.mem_solenoidalZeroNormalTrace_of_mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_ofSubmoduleClosures + {d : ℕ} {U : Set (Vec d)} (X : BlockL2 U) + (hX : + X ∈ (PotentialSolenoidalL2Data.ofSubmoduleClosures U).blockPotentialZeroTraceSolenoidalZeroNormalTrace) : + blockSndCLM (U := U) X ∈ + (PotentialSolenoidalL2Data.ofSubmoduleClosures U).solenoidalZeroNormalTrace := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let K : ClosedSubmodule ℝ (BlockL2 U) := + M.solenoidalZeroNormalTrace.comap (blockSndCLM (U := U)) + have hsub : + blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U ≤ K.toSubmodule := by + intro Y hY + rcases hY with ⟨f, g, hf, hg, rfl, _hpot, hsol⟩ + show blockSndCLM (U := U) (toBlockL2OfComponents hf hg) ∈ M.solenoidalZeroNormalTrace + rw [blockSndCLM_apply_toBlockL2OfComponents hf hg] + simpa [M] using M.mem_solenoidalZeroNormalTrace hg hsol + have hclosure : + (blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U).closure ≤ K.toSubmodule := by + exact + (Submodule.closure_le (s := blockPotentialZeroTraceSolenoidalZeroNormalTraceSubmodule U) + (t := K)).2 hsub + have hclosure' : M.blockPotentialZeroTraceSolenoidalZeroNormalTrace ≤ K := by + intro Y hY + exact hclosure (by simpa [M] using! hY) + exact hclosure' hX + +/-- The pointwise block correction fields with exact zero-trace / zero-normal-trace +admissibility. This is the ambient vector space used to choose linear +representatives of the closed `L²` correction space. -/ +def correctionFieldSubmodule {d : ℕ} (U : Set (Vec d)) : + Submodule ℝ (Vec d → BlockVec d) where + carrier := {F | + MemBlockL2 U F ∧ + IsPotentialZeroTraceOn U (fun x => (F x).1) ∧ + IsSolenoidalZeroNormalTraceOn U (fun x => (F x).2)} + zero_mem' := by + refine ⟨MeasureTheory.MemLp.zero, ?_, ?_⟩ + · simpa using! (isPotentialZeroTraceOn_zero (U := U)) + · simpa using! (isSolenoidalZeroNormalTraceOn_zero (U := U)) + add_mem' := by + intro F G hF hG + rcases hF with ⟨hFmem, hFpot, hFsol⟩ + rcases hG with ⟨hGmem, hGpot, hGsol⟩ + refine ⟨hFmem.add hGmem, ?_, ?_⟩ + · simpa using! isPotentialZeroTraceOn_add hFpot hGpot + · exact + isSolenoidalZeroNormalTraceOn_add_of_memVectorL2 + (memVectorL2_snd_of_memBlockL2 (U := U) hFmem) + (memVectorL2_snd_of_memBlockL2 (U := U) hGmem) + (by simpa using hFsol) + (by simpa using hGsol) + smul_mem' := by + intro c F hF + rcases hF with ⟨hFmem, hFpot, hFsol⟩ + refine ⟨hFmem.const_smul c, ?_, ?_⟩ + · simpa using! isPotentialZeroTraceOn_smul hFpot c + · simpa using! isSolenoidalZeroNormalTraceOn_smul hFsol c + +namespace correctionFieldSubmodule + +theorem mem_potential_memVectorL2 + {d : ℕ} {U : Set (Vec d)} {F : Vec d → BlockVec d} + (hF : F ∈ correctionFieldSubmodule U) : + MemVectorL2 U (fun x => (F x).1) := + memVectorL2_fst_of_memBlockL2 (U := U) hF.1 + +theorem mem_flux_memVectorL2 + {d : ℕ} {U : Set (Vec d)} {F : Vec d → BlockVec d} + (hF : F ∈ correctionFieldSubmodule U) : + MemVectorL2 U (fun x => (F x).2) := + memVectorL2_snd_of_memBlockL2 (U := U) hF.1 + +/-- Convert an exact pointwise block correction field into bundled +`CorrectionFieldData`. -/ +noncomputable def toCorrectionFieldData + {d : ℕ} {U : Set (Vec d)} + (F : correctionFieldSubmodule U) : CorrectionFieldData U where + potential := fun x => (F.1 x).1 + flux := fun x => (F.1 x).2 + potential_memL2 := mem_potential_memVectorL2 F.2 + flux_memL2 := mem_flux_memVectorL2 F.2 + isPotentialZeroTrace := F.2.2.1 + isSolenoidalZeroNormalTrace := F.2.2.2 + +@[simp] theorem toCorrectionFieldData_toBlockField + {d : ℕ} {U : Set (Vec d)} + (F : correctionFieldSubmodule U) : + (toCorrectionFieldData F).toBlockField = F := by + funext x + ext i <;> rfl + +end correctionFieldSubmodule + +namespace PotentialSolenoidalL2RecoveryData + +/-- The natural quotient map from exact pointwise correction fields to the +canonical closed block correction space. -/ +noncomputable def correctionFieldSubmoduleToBlockSubmodule + {d : ℕ} {U : Set (Vec d)} : + correctionFieldSubmodule U →ₗ[ℝ] + ((PotentialSolenoidalL2Data.ofSubmoduleClosures U).blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule) where + toFun := fun F => + ⟨toBlockL2 F.2.1, + by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + exact M.mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace + (memVectorL2_fst_of_memBlockL2 (U := U) F.2.1) + (memVectorL2_snd_of_memBlockL2 (U := U) F.2.1) + F.2.2.1 F.2.2.2⟩ + map_add' := by + intro F G + apply Subtype.ext + exact toBlockL2OfComponents_add + (memVectorL2_fst_of_memBlockL2 (U := U) F.2.1) + (memVectorL2_snd_of_memBlockL2 (U := U) F.2.1) + (memVectorL2_fst_of_memBlockL2 (U := U) G.2.1) + (memVectorL2_snd_of_memBlockL2 (U := U) G.2.1) + map_smul' := by + intro c F + apply Subtype.ext + exact toBlockL2OfComponents_smul c + (memVectorL2_fst_of_memBlockL2 (U := U) F.2.1) + (memVectorL2_snd_of_memBlockL2 (U := U) F.2.1) + +theorem correctionFieldSubmoduleToBlockSubmodule_surjective_of_potentialZeroTraceClosureRealization + {d : ℕ} {U : Set (Vec d)} + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) : + Function.Surjective (correctionFieldSubmoduleToBlockSubmodule (U := U)) := by + intro X + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + have hpotMem : blockFstCLM (U := U) X ∈ M.potentialZeroTrace := by + exact + PotentialSolenoidalL2Data.mem_potentialZeroTrace_of_mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_ofSubmoduleClosures + (U := U) X X.2 + have hsolMem : blockSndCLM (U := U) X ∈ M.solenoidalZeroNormalTrace := by + exact + PotentialSolenoidalL2Data.mem_solenoidalZeroNormalTrace_of_mem_blockPotentialZeroTraceSolenoidalZeroNormalTrace_ofSubmoduleClosures + (U := U) X X.2 + let F : correctionFieldSubmodule U := + ⟨blockField (blockFstCLM (U := U) X) (blockSndCLM (U := U) X), + memBlockL2_blockField + (MeasureTheory.Lp.memLp (blockFstCLM (U := U) X)) + (MeasureTheory.Lp.memLp (blockSndCLM (U := U) X)), + PotentialSolenoidalL2Data.isPotentialZeroTraceOn_of_mem_potentialZeroTrace_ofSubmoduleClosures + (U := U) hRealize (blockFstCLM (U := U) X) hpotMem, + PotentialSolenoidalL2Data.isSolenoidalZeroNormalTraceOn_of_mem_solenoidalZeroNormalTrace_ofSubmoduleClosures + (U := U) (blockSndCLM (U := U) X) hsolMem⟩ + refine ⟨F, ?_⟩ + apply Subtype.ext + simpa [F, correctionFieldSubmoduleToBlockSubmodule] using! + toBlockL2OfComponents_blockFstCLM_blockSndCLM (U := U) X + +end PotentialSolenoidalL2RecoveryData + +theorem memVectorL2_const {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] (p : Vec d) : + MemVectorL2 U (fun _ : Vec d => p) := by + simpa using + (MeasureTheory.memLp_const (μ := volumeMeasureOn U) (c := p)) + +theorem IsSolenoidalOn.of_test_of_contDiff_of_memVectorL2 + {d : ℕ} {U : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn U)] + {g : Vec d → Vec d} (hg : MemVectorL2 U g) (hU : IsOpen U) + (htest : ∀ ψ : Vec d → ℝ, ContDiff ℝ (⊤ : ℕ∞) ψ → HasCompactSupport ψ → + tsupport ψ ⊆ U → + ∫ x in U, vecDot (g x) (fun i => (fderiv ℝ ψ x) (basisVec i)) + ∂MeasureTheory.volume = 0) : + IsSolenoidalOn U g := by + intro φ + let μ := volumeMeasureOn U + let D : ℕ → Vec d → Vec d := fun n x i => (fderiv ℝ (φ.approx n) x) (basisVec i) + have hD_coord : ∀ n i, MemScalarL2 U (fun x => D n x i) := by + intro n i + let ψ : H10Function U := + H10Function.ofContDiff hU (φ.approx_smooth n) (φ.approx_hasCompactSupport n) + (φ.approx_support_subset n) + simpa [D, ψ, H10Function.ofContDiff, H1Function.ofContDiff] using ψ.toH1Function.gradMemL2 i + have htest_approx : + ∀ n, + ∫ x in U, vecDot (g x) (D n x) ∂MeasureTheory.volume = 0 := by + intro n + exact htest (φ.approx n) (φ.approx_smooth n) (φ.approx_hasCompactSupport n) + (φ.approx_support_subset n) + have hcoord_tendsto : + ∀ i : Fin d, + Filter.Tendsto + (fun n => ∫ x in U, g x i * D n x i ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, g x i * φ.toH1Function.grad x i ∂MeasureTheory.volume)) := by + intro i + let gi : Vec d → ℝ := fun x => g x i + let diff : ℕ → Vec d → ℝ := fun n x => D n x i - φ.toH1Function.grad x i + let Fn : ℕ → Vec d → ℝ := fun n x => gi x * D n x i + let f : Vec d → ℝ := fun x => gi x * φ.toH1Function.grad x i + have hgi_mem : MemScalarL2 U gi := + CorrectionFieldData.memScalarL2_coord_of_memVectorL2 hg i + have hdiff_mem : ∀ n, MemScalarL2 U (diff n) := by + intro n + exact (hD_coord n i).sub (φ.toH1Function.gradMemL2 i) + have hFn_int : + ∀ᶠ n in Filter.atTop, MeasureTheory.Integrable (Fn n) μ := by + refine Filter.Eventually.of_forall ?_ + intro n + simpa [Fn, gi, D, μ, MeasureTheory.IntegrableOn] using! + (hgi_mem.integrable_mul (hD_coord n i)) + have hf_int : MeasureTheory.Integrable f μ := by + simpa [f, gi, μ, MeasureTheory.IntegrableOn] using! + (hgi_mem.integrable_mul (φ.toH1Function.gradMemL2 i)) + have hL1_bound : + ∀ n, + MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ ≤ + MeasureTheory.eLpNorm gi 2 μ * + MeasureTheory.eLpNorm (diff n) 2 μ := by + intro n + have hgi_meas : MeasureTheory.AEStronglyMeasurable gi μ := hgi_mem.aestronglyMeasurable + have hdiff_meas : + MeasureTheory.AEStronglyMeasurable (diff n) μ := (hdiff_mem n).aestronglyMeasurable + simpa [gi, diff] using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (μ := μ) (p := (2 : ENNReal)) (q := (2 : ENNReal)) (r := (1 : ENNReal)) + (fun a b : ℝ => a * b) 1 (by fun_prop) hgi_meas hdiff_meas + (Filter.Eventually.of_forall fun x => by simp)) + have hconst_ne_top : MeasureTheory.eLpNorm gi 2 μ ≠ ⊤ := hgi_mem.eLpNorm_lt_top.ne + have hL1 : + Filter.Tendsto (fun n => MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm gi 2 μ * MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop + (nhds (MeasureTheory.eLpNorm gi 2 μ * 0)) := by + exact ENNReal.Tendsto.const_mul (φ.tendsto_approx_grad i) (Or.inr hconst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun n => + MeasureTheory.eLpNorm gi 2 μ * MeasureTheory.eLpNorm (diff n) 2 μ) + Filter.atTop (nhds 0) := by + simpa [mul_zero] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 (fun _ => zero_le) hL1_bound + have hL1_diff : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - f x) 1 μ) + Filter.atTop (nhds 0) := by + have hEq : + (fun n => MeasureTheory.eLpNorm (fun x => Fn n x - f x) 1 μ) = + fun n => MeasureTheory.eLpNorm (fun x => gi x * diff n x) 1 μ := by + funext n + congr 1 + funext x + simp [Fn, f, gi, diff] + ring + rw [hEq] + exact hL1 + exact MeasureTheory.tendsto_integral_of_L1' (μ := μ) (f := f) + hFn_int hL1_diff + have hIntegral_tendsto : + Filter.Tendsto (fun n => ∫ x in U, vecDot (g x) (D n x) ∂MeasureTheory.volume) + Filter.atTop + (nhds (∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume)) := by + have hEq : + (fun n => ∫ x in U, vecDot (g x) (D n x) ∂MeasureTheory.volume) = + fun n => ∑ i, ∫ x in U, g x i * D n x i ∂MeasureTheory.volume := by + funext n + rw [show (fun x => vecDot (g x) (D n x)) = fun x => ∑ i, g x i * D n x i by + funext x + simp [vecDot, D]] + rw [MeasureTheory.integral_finsetSum] + intro i hi + exact ((CorrectionFieldData.memScalarL2_coord_of_memVectorL2 hg i).integrable_mul + (hD_coord n i)) + have hEq_limit : + ∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∑ i, ∫ x in U, g x i * φ.toH1Function.grad x i ∂MeasureTheory.volume := by + rw [show (fun x => vecDot (g x) (φ.toH1Function.grad x)) = + fun x => ∑ i, g x i * φ.toH1Function.grad x i by + funext x + simp [vecDot]] + rw [MeasureTheory.integral_finsetSum] + intro i hi + exact ((CorrectionFieldData.memScalarL2_coord_of_memVectorL2 hg i).integrable_mul + (φ.toH1Function.gradMemL2 i)) + rw [hEq] + have hsum : + Filter.Tendsto + (fun n => ∑ i, ∫ x in U, g x i * D n x i ∂MeasureTheory.volume) + Filter.atTop + (nhds (∑ i, ∫ x in U, g x i * φ.toH1Function.grad x i ∂MeasureTheory.volume)) := by + simpa using + tendsto_finsetSum Finset.univ (fun i _ => hcoord_tendsto i) + rw [hEq_limit] + exact hsum + have hzero_tendsto : + Filter.Tendsto (fun _ : ℕ => (0 : ℝ)) Filter.atTop + (nhds (∫ x in U, vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume)) := by + have hEq : + (fun n => ∫ x in U, vecDot (g x) (D n x) ∂MeasureTheory.volume) = fun _ => (0 : ℝ) := by + funext n + exact htest_approx n + simpa [hEq] using hIntegral_tendsto + exact tendsto_nhds_unique hzero_tendsto tendsto_const_nhds + +namespace IsSolenoidalOn + +theorem restrict_of_isOpen_of_memVectorL2 + {d : ℕ} {U V : Set (Vec d)} [MeasureTheory.IsFiniteMeasure (volumeMeasureOn V)] + {g : Vec d → Vec d} (hg : IsSolenoidalOn U g) (hU : IsOpen U) (hV : IsOpen V) + (hVU : V ⊆ U) (hgV : MemVectorL2 V g) : + IsSolenoidalOn V g := by + apply IsSolenoidalOn.of_test_of_contDiff_of_memVectorL2 hgV hV + intro ψ hψ_smooth hψ_compact hψ_sub + have hzeroV : + ∀ x : Vec d, x ∉ V → + vecDot (g x) (fun i => (fderiv ℝ ψ x) (basisVec i)) = 0 := by + intro x hx + have hx_notin : x ∉ tsupport ψ := fun hx' => hx (hψ_sub hx') + have hψ_eq : ψ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := ψ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [Filter.EventuallyEq.fderiv_eq hψ_eq] + simp [vecDot] + have hzeroU : + ∀ x : Vec d, x ∉ U → + vecDot (g x) (fun i => (fderiv ℝ ψ x) (basisVec i)) = 0 := by + intro x hx + exact hzeroV x (fun hxV => hx (hVU hxV)) + have hset : + ∫ x in V, vecDot (g x) (fun i => (fderiv ℝ ψ x) (basisVec i)) ∂MeasureTheory.volume = + ∫ x in U, vecDot (g x) (fun i => (fderiv ℝ ψ x) (basisVec i)) ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroV, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzeroU] + rw [hset] + exact hg.test_of_contDiff hU hψ_smooth hψ_compact (hψ_sub.trans hVU) + +end IsSolenoidalOn + +/-- +Recovery data for the abstract Hilbert correction space +`\Lpoto(U) × \Lsolo(U)`. + +This extends `MuCorrectionSpaceData` by choosing pointwise representatives of +all abstract correction fields, together with the linearity and realization +statements needed later for minimizer recovery. +-/ +structure MuCorrectionSpaceRecoveryData (U : Set (Vec d)) extends MuCorrectionSpaceData U where + /-- A pointwise representative of each abstract correction field. -/ + repr : correctionSpace.toSubmodule → CorrectionFieldData U + /-- Additivity of the chosen representatives at the level of block fields. -/ + repr_add : + ∀ X Y : correctionSpace.toSubmodule, + (repr (X + Y)).toBlockField = (repr X).toBlockField + (repr Y).toBlockField + /-- Homogeneity of the chosen representatives at the level of block fields. -/ + repr_smul : + ∀ (c : ℝ) (X : correctionSpace.toSubmodule), + (repr (c • X)).toBlockField = c • (repr X).toBlockField + /-- The chosen representative realizes the abstract correction field in the + Hilbert ambient space. -/ + repr_eq : + ∀ X : correctionSpace.toSubmodule, (repr X).toHilbertBlockL2 = X + +/-- +Representative-level recovery data on the plain block ambient space +`BlockL²(U)`, anchored to the packaged block correction space +`\Lpoto(U) × \Lsolo(U)`. +-/ +structure PotentialSolenoidalL2RecoveryData (U : Set (Vec d)) + extends PotentialSolenoidalL2Data U where + /-- A pointwise representative of each block correction field. -/ + repr : + blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule → + CorrectionFieldData U + /-- Additivity of the chosen representatives at the level of block fields. -/ + repr_add : + ∀ X Y : blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule, + (repr (X + Y)).toBlockField = (repr X).toBlockField + (repr Y).toBlockField + /-- Homogeneity of the chosen representatives at the level of block fields. -/ + repr_smul : + ∀ (c : ℝ) (X : blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule), + (repr (c • X)).toBlockField = c • (repr X).toBlockField + /-- The chosen representative realizes the abstract block correction field in + `BlockL²(U)`. -/ + repr_eq : + ∀ X : blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule, + (repr X).toBlockL2 = X + +namespace PotentialSolenoidalL2RecoveryData + +variable {d : ℕ} {U : Set (Vec d)} + +/-- View a Hilbert-block correction field in the transported correction space as +the corresponding element of the original block correction subspace. -/ +noncomputable def toBlockCorrectionSubmodule (M : PotentialSolenoidalL2RecoveryData U) : + M.toMuCorrectionSpaceData.correctionSpace.toSubmodule → + M.blockPotentialZeroTraceSolenoidalZeroNormalTrace.toSubmodule := + fun X => ⟨hilbertBlockL2ToBlockL2 (U := U) X, X.2⟩ + +theorem toBlockCorrectionSubmodule_add (M : PotentialSolenoidalL2RecoveryData U) + (X Y : M.toMuCorrectionSpaceData.correctionSpace.toSubmodule) : + M.toBlockCorrectionSubmodule (X + Y) = + M.toBlockCorrectionSubmodule X + M.toBlockCorrectionSubmodule Y := by + apply Subtype.ext + change + hilbertBlockL2ToBlockL2 (U := U) (X + Y) = + hilbertBlockL2ToBlockL2 (U := U) X + hilbertBlockL2ToBlockL2 (U := U) Y + exact (hilbertBlockL2ToBlockL2 (U := U)).map_add X Y + +theorem toBlockCorrectionSubmodule_smul (M : PotentialSolenoidalL2RecoveryData U) + (c : ℝ) (X : M.toMuCorrectionSpaceData.correctionSpace.toSubmodule) : + M.toBlockCorrectionSubmodule (c • X) = c • M.toBlockCorrectionSubmodule X := by + apply Subtype.ext + change + hilbertBlockL2ToBlockL2 (U := U) (c • X) = + c • hilbertBlockL2ToBlockL2 (U := U) X + exact (hilbertBlockL2ToBlockL2 (U := U)).map_smul c X + +/-- Lift block-side recovery data to the Hilbert correction space used by the +doubled `μ` minimization problem. -/ +noncomputable def toMuCorrectionSpaceRecoveryData (M : PotentialSolenoidalL2RecoveryData U) : + MuCorrectionSpaceRecoveryData U where + toMuCorrectionSpaceData := M.toPotentialSolenoidalL2Data.toMuCorrectionSpaceData + repr := fun X => M.repr (M.toBlockCorrectionSubmodule X) + repr_add := by + intro X Y + simpa [PotentialSolenoidalL2RecoveryData.toBlockCorrectionSubmodule_add] using + M.repr_add (M.toBlockCorrectionSubmodule X) (M.toBlockCorrectionSubmodule Y) + repr_smul := by + intro c X + simpa [PotentialSolenoidalL2RecoveryData.toBlockCorrectionSubmodule_smul] using + M.repr_smul c (M.toBlockCorrectionSubmodule X) + repr_eq := by + intro X + calc + (M.repr (M.toBlockCorrectionSubmodule X)).toHilbertBlockL2 + = blockL2ToHilbertBlockL2 (U := U) + ((M.repr (M.toBlockCorrectionSubmodule X)).toBlockL2) := by + symm + exact CorrectionFieldData.blockL2ToHilbertBlockL2_toBlockL2 + (M.repr (M.toBlockCorrectionSubmodule X)) + _ = blockL2ToHilbertBlockL2 (U := U) (M.toBlockCorrectionSubmodule X) := by + rw [M.repr_eq (M.toBlockCorrectionSubmodule X)] + _ = X := by + change + blockL2ToHilbertBlockL2 (U := U) + (hilbertBlockL2ToBlockL2 (U := U) (X : HilbertBlockL2 U)) = + (X : HilbertBlockL2 U) + exact + (Homogenization.blockL2ToHilbertBlockL2_hilbertBlockL2ToBlockL2 + (U := U) + (X : HilbertBlockL2 U)) + +end PotentialSolenoidalL2RecoveryData + +/-- Canonical representative-level recovery data obtained from the closed +predicate-generated block correction space, assuming the zero-trace potential +closure has honest `H¹₀` representatives. -/ +noncomputable def + potentialSolenoidalL2RecoveryData_ofSubmoduleClosures_of_potentialZeroTraceClosureRealization + {d : ℕ} {U : Set (Vec d)} + (hRealize : PotentialSolenoidalL2Data.HasPotentialZeroTraceClosureRealization U) : + PotentialSolenoidalL2RecoveryData U := by + let M : PotentialSolenoidalL2Data U := PotentialSolenoidalL2Data.ofSubmoduleClosures U + let L := PotentialSolenoidalL2RecoveryData.correctionFieldSubmoduleToBlockSubmodule (U := U) + classical + let hgExists := + L.exists_rightInverse_of_surjective + (LinearMap.range_eq_top.2 + (PotentialSolenoidalL2RecoveryData.correctionFieldSubmoduleToBlockSubmodule_surjective_of_potentialZeroTraceClosureRealization + (U := U) hRealize)) + let g := Classical.choose hgExists + let hg := Classical.choose_spec hgExists + refine + { toPotentialSolenoidalL2Data := M + repr := fun X => correctionFieldSubmodule.toCorrectionFieldData (g X) + repr_add := ?_ + repr_smul := ?_ + repr_eq := ?_ } + · intro X Y + calc + (correctionFieldSubmodule.toCorrectionFieldData (g (X + Y))).toBlockField + = g (X + Y) := + correctionFieldSubmodule.toCorrectionFieldData_toBlockField (g (X + Y)) + _ = g X + g Y := congrArg Subtype.val (map_add g X Y) + _ = (correctionFieldSubmodule.toCorrectionFieldData (g X)).toBlockField + + (correctionFieldSubmodule.toCorrectionFieldData (g Y)).toBlockField := by + rw [correctionFieldSubmodule.toCorrectionFieldData_toBlockField, + correctionFieldSubmodule.toCorrectionFieldData_toBlockField] + · intro c X + calc + (correctionFieldSubmodule.toCorrectionFieldData (g (c • X))).toBlockField + = g (c • X) := + correctionFieldSubmodule.toCorrectionFieldData_toBlockField (g (c • X)) + _ = c • g X := congrArg Subtype.val (map_smul g c X) + _ = c • (correctionFieldSubmodule.toCorrectionFieldData (g X)).toBlockField := by + rw [correctionFieldSubmodule.toCorrectionFieldData_toBlockField] + · intro X + have hX : L (g X) = X := by + simpa using congrArg (fun T => T X) hg + apply Subtype.ext + simpa [L, + PotentialSolenoidalL2RecoveryData.correctionFieldSubmoduleToBlockSubmodule, + correctionFieldSubmodule.toCorrectionFieldData_toBlockField] + using! congrArg Subtype.val hX + +end Representatives + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeBridge.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeBridge.lean new file mode 100644 index 0000000000..812d1903b1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeBridge.lean @@ -0,0 +1,338 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeBridge +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp + +/-! # Potential Solenoidal Origin Cube Bridge -/ + +@[expose] public section + +namespace Homogenization + +private theorem volume_openCubeSet_originCube_lt_top_bridge {d : ℕ} (n : ℤ) : + MeasureTheory.volume (openCubeSet (originCube d n)) < ⊤ := by + rw [lt_top_iff_ne_top] + intro htop + have hzero : (MeasureTheory.volume (openCubeSet (originCube d n))).toReal = 0 := by + simp [htop] + rw [volume_openCubeSet_toReal] at hzero + exact (ne_of_gt (cubeVolume_pos (originCube d n))) hzero + +theorem isPotentialOn_cubeSet_originCube_of_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialOn (openCubeSet (originCube d n)) f) : + IsPotentialOn (cubeSet (originCube d n)) f := by + rcases hf with ⟨u, rfl⟩ + exact (u.toCubeSetOriginCube).isPotentialOn + +theorem isPotentialOn_openCubeSet_originCube_of_cubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialOn (cubeSet (originCube d n)) f) : + IsPotentialOn (openCubeSet (originCube d n)) f := by + rcases hf with ⟨u, rfl⟩ + exact (u.restrict (isOpen_openCubeSet (originCube d n)) (openCubeSet_subset_cubeSet _)).isPotentialOn + +theorem isPotentialOn_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} : + IsPotentialOn (cubeSet (originCube d n)) f ↔ + IsPotentialOn (openCubeSet (originCube d n)) f := by + constructor + · exact isPotentialOn_openCubeSet_originCube_of_cubeSet + · exact isPotentialOn_cubeSet_originCube_of_openCubeSet + +theorem isPotentialZeroTraceOn_cubeSet_originCube_of_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f) : + IsPotentialZeroTraceOn (cubeSet (originCube d n)) f := by + rcases hf with ⟨u, rfl⟩ + exact (u.toCubeSetOriginCube).isPotentialZeroTraceOn + +theorem isPotentialZeroTraceOn_openCubeSet_originCube_of_cubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (cubeSet (originCube d n)) f) : + IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f := by + rcases hf with ⟨u, rfl⟩ + exact (u.toOpenCubeSetOriginCube).isPotentialZeroTraceOn + +theorem isPotentialZeroTraceOn_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} : + IsPotentialZeroTraceOn (cubeSet (originCube d n)) f ↔ + IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f := by + constructor + · exact isPotentialZeroTraceOn_openCubeSet_originCube_of_cubeSet + · exact isPotentialZeroTraceOn_cubeSet_originCube_of_openCubeSet + +theorem isSolenoidalOn_cubeSet_originCube_of_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalOn (openCubeSet (originCube d n)) g) : + IsSolenoidalOn (cubeSet (originCube d n)) g := by + intro φ + have hopen := hg (φ.toOpenCubeSetOriginCube) + have hset : + ∫ x in cubeSet (originCube d n), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), + vecDot (g x) ((φ.toOpenCubeSetOriginCube.toH1Function.grad) x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => vecDot (g x) (φ.toH1Function.grad x))) + rw [hset] + simpa using hopen + +theorem isSolenoidalOn_openCubeSet_originCube_of_cubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalOn (cubeSet (originCube d n)) g) : + IsSolenoidalOn (openCubeSet (originCube d n)) g := by + intro φ + have hcube := hg (φ.toCubeSetOriginCube) + have hset : + ∫ x in cubeSet (originCube d n), + vecDot (g x) ((φ.toCubeSetOriginCube.toH1Function.grad) x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), + vecDot (g x) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => vecDot (g x) ((φ.toCubeSetOriginCube.toH1Function.grad) x))) + rw [hset] at hcube + simpa using hcube + +theorem isSolenoidalOn_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} : + IsSolenoidalOn (cubeSet (originCube d n)) g ↔ + IsSolenoidalOn (openCubeSet (originCube d n)) g := by + constructor + · exact isSolenoidalOn_openCubeSet_originCube_of_cubeSet + · exact isSolenoidalOn_cubeSet_originCube_of_openCubeSet + +theorem isSolenoidalZeroNormalTraceOn_cubeSet_originCube_of_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g) : + IsSolenoidalZeroNormalTraceOn (cubeSet (originCube d n)) g := by + intro φ + let φopen : H1Function (openCubeSet (originCube d n)) := + φ.restrict (isOpen_openCubeSet (originCube d n)) (openCubeSet_subset_cubeSet _) + have hopen := hg φopen + have hset : + ∫ x in cubeSet (originCube d n), vecDot (g x) (φ.grad x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), vecDot (g x) (φopen.grad x) ∂MeasureTheory.volume := by + simpa [φopen, H1Function.restrict] using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => vecDot (g x) (φ.grad x))) + rw [hset] + simpa using hopen + +theorem isSolenoidalZeroNormalTraceOn_openCubeSet_originCube_of_cubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (cubeSet (originCube d n)) g) : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g := by + intro φ + have hcube := hg (φ.toCubeSetOriginCube) + have hset : + ∫ x in cubeSet (originCube d n), + vecDot (g x) ((φ.toCubeSetOriginCube.grad) x) ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), + vecDot (g x) (φ.grad x) ∂MeasureTheory.volume := by + simpa using! + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) + (f := fun x => vecDot (g x) ((φ.toCubeSetOriginCube.grad) x))) + rw [hset] at hcube + simpa using hcube + +theorem isSolenoidalZeroNormalTraceOn_cubeSet_originCube_iff_openCubeSet + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} : + IsSolenoidalZeroNormalTraceOn (cubeSet (originCube d n)) g ↔ + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g := by + constructor + · exact isSolenoidalZeroNormalTraceOn_openCubeSet_originCube_of_cubeSet + · exact isSolenoidalZeroNormalTraceOn_cubeSet_originCube_of_openCubeSet + +theorem IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f) : + (fun i => ∫ x in openCubeSet (originCube d n), f x i ∂MeasureTheory.volume) = 0 := by + rcases hf with ⟨u, rfl⟩ + ext i + let U : Set (Vec d) := openCubeSet (originCube d n) + let μ := MeasureTheory.volume.restrict U + have : Fact (MeasureTheory.volume U < ⊤) := ⟨volume_openCubeSet_originCube_lt_top_bridge (d := d) n⟩ + have : MeasureTheory.IsFiniteMeasure μ := inferInstance + let D : ℕ → Vec d → ℝ := fun m x => (fderiv ℝ (u.approx m) x) (basisVec i) + have hD_integrable : ∀ m, MeasureTheory.Integrable (D m) MeasureTheory.volume := by + intro m + have hcont : Continuous (D m) := by + simpa [D] using + ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply continuous_const + have hcomp : HasCompactSupport (D m) := by + simpa [D] using (u.approx_hasCompactSupport m).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcont.integrable_of_hasCompactSupport hcomp + have hD_integrable_restrict : + ∀ᶠ m in Filter.atTop, MeasureTheory.Integrable (D m) μ := by + refine Filter.Eventually.of_forall ?_ + intro m + simpa [MeasureTheory.IntegrableOn, μ] using (hD_integrable m).integrableOn (s := U) + have hD_zero : ∀ m, ∫ x, D m x ∂μ = 0 := by + intro m + have happrox_integrable : MeasureTheory.Integrable (u.approx m) MeasureTheory.volume := by + exact (u.approx_smooth m).continuous.integrable_of_hasCompactSupport + (u.approx_hasCompactSupport m) + have hfull : + ∫ x, D m x ∂MeasureTheory.volume = 0 := by + have h := + integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + (μ := MeasureTheory.volume) + (f := fun _ : Vec d => (1 : ℝ)) + (g := u.approx m) + (v := basisVec i) + (by simp) + (by simpa [D] using hD_integrable m) + (by simpa using happrox_integrable) + (fun x _ => differentiableAt_const (c := (1 : ℝ))) + (fun x _ => ((u.approx_smooth m).differentiable (by simp)).differentiableAt) + simpa [D] using h + have hzero_off : ∀ x, x ∉ U → D m x = 0 := by + intro x hx + have hnot : x ∉ tsupport (u.approx m) := fun hx' => hx (u.approx_support_subset m hx') + have hfderiv : fderiv ℝ (u.approx m) x = 0 := fderiv_of_notMem_tsupport (𝕜 := ℝ) hnot + simpa [D] using congrArg (fun L => L (basisVec i)) hfderiv + have hset : + ∫ x in U, D m x ∂MeasureTheory.volume = + ∫ x, D m x ∂MeasureTheory.volume := + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero_off + simpa [μ] using hset.trans hfull + have hfi : MeasureTheory.Integrable (fun x => u.toH1Function.grad x i) μ := by + simpa [μ] using + (u.toH1Function.gradMemL2 i).integrable (by norm_num : (1 : ENNReal) ≤ 2) + have hDiffMeas : + ∀ m, MeasureTheory.AEStronglyMeasurable (fun x => D m x - u.toH1Function.grad x i) μ := by + intro m + have hDm : + MeasureTheory.AEStronglyMeasurable (D m) μ := by + have hInt : MeasureTheory.Integrable (D m) μ := by + simpa [MeasureTheory.IntegrableOn, μ] using (hD_integrable m).integrableOn (s := U) + exact hInt.aestronglyMeasurable + exact hDm.sub (u.toH1Function.gradMemL2 i).aestronglyMeasurable + have hL1_bound : + ∀ m, + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 1 μ ≤ + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2) := by + intro m + simpa using + (MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ + (μ := μ) + (f := fun x => D m x - u.toH1Function.grad x i) + (p := (1 : ENNReal)) + (q := (2 : ENNReal)) + (by norm_num) + (hDiffMeas m)) + have hConst_ne_top : μ Set.univ ^ ((1 : ℝ) - 1 / 2) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by norm_num) ?_).ne + simpa [μ, U] using (MeasureTheory.measure_lt_top μ Set.univ).ne + have hL1 : + Filter.Tendsto + (fun m => MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 1 μ) + Filter.atTop (nhds 0) := by + have hscaled : + Filter.Tendsto + (fun m => + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) + Filter.atTop + (nhds (0 * (μ Set.univ ^ ((1 : ℝ) - 1 / 2)))) := by + exact ENNReal.Tendsto.mul_const (u.tendsto_approx_grad i) (Or.inr hConst_ne_top) + have hscaled0 : + Filter.Tendsto + (fun m => + MeasureTheory.eLpNorm (fun x => D m x - u.toH1Function.grad x i) 2 μ * + μ Set.univ ^ ((1 : ℝ) - 1 / 2)) + Filter.atTop (nhds 0) := by + simpa [zero_mul] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled0 + (fun _ => zero_le) + hL1_bound + have hconv : + Filter.Tendsto + (fun m => ∫ x, D m x ∂μ) + Filter.atTop + (nhds (∫ x, u.toH1Function.grad x i ∂μ)) := + MeasureTheory.tendsto_integral_of_L1' + (μ := μ) + (f := fun x => u.toH1Function.grad x i) + hD_integrable_restrict + hL1 + have hEq : (fun m => ∫ x, D m x ∂μ) = fun _ => (0 : ℝ) := by + funext m + exact hD_zero m + have hzero_tendsto : + Filter.Tendsto (fun _ : ℕ => (0 : ℝ)) Filter.atTop + (nhds (∫ x, u.toH1Function.grad x i ∂μ)) := by + simpa [hEq] using hconv + have hIntegralZero : ∫ x, u.toH1Function.grad x i ∂μ = 0 := + tendsto_nhds_unique hzero_tendsto tendsto_const_nhds + change ∫ x in U, u.toH1Function.grad x i ∂MeasureTheory.volume = 0 + simpa [μ, U] using hIntegralZero + +theorem IsPotentialZeroTraceOn.integral_eq_zero_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (cubeSet (originCube d n)) f) : + (fun i => ∫ x in cubeSet (originCube d n), f x i ∂MeasureTheory.volume) = 0 := by + have hf_open : + IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f := + (isPotentialZeroTraceOn_cubeSet_originCube_iff_openCubeSet + (d := d) (n := n) (f := f)).mp hf + ext i + calc + ∫ x in cubeSet (originCube d n), f x i ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), f x i ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) (f := fun x => f x i)) + _ = 0 := by + exact congrFun + (IsPotentialZeroTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (f := f) hf_open) i + +theorem IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g) : + (fun i => ∫ x in openCubeSet (originCube d n), g x i ∂MeasureTheory.volume) = 0 := by + ext i + have htest : + ∫ x in openCubeSet (originCube d n), vecDot (g x) (basisVec i) ∂MeasureTheory.volume = 0 := by + simpa [H1Function.coordOnOpenCubeSetOriginCube] using + hg (H1Function.coordOnOpenCubeSetOriginCube (d := d) (n := n) i) + simpa [vecDot, basisVec_apply] using htest + +theorem IsSolenoidalZeroNormalTraceOn.integral_eq_zero_cubeSet_originCube + {d : ℕ} [NeZero d] {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (cubeSet (originCube d n)) g) : + (fun i => ∫ x in cubeSet (originCube d n), g x i ∂MeasureTheory.volume) = 0 := by + have hg_open : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g := + (isSolenoidalZeroNormalTraceOn_cubeSet_originCube_iff_openCubeSet + (d := d) (n := n) (g := g)).mp hg + ext i + calc + ∫ x in cubeSet (originCube d n), g x i ∂MeasureTheory.volume = + ∫ x in openCubeSet (originCube d n), g x i ∂MeasureTheory.volume := by + simpa using + (setIntegral_cubeSet_originCube_eq_setIntegral_openCubeSet_originCube + (d := d) (n := n) (f := fun x => g x i)) + _ = 0 := by + exact congrFun + (IsSolenoidalZeroNormalTraceOn.integral_eq_zero_openCubeSet_originCube + (d := d) (n := n) (g := g) hg_open) i + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeSymmetry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeSymmetry.lean new file mode 100644 index 0000000000..bbd39887be --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalOriginCubeSymmetry.lean @@ -0,0 +1,150 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.BlockMatrix +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.OriginCubeSymmetry +public import Mathlib.LinearAlgebra.Matrix.Swap + +/-! # Potential Solenoidal Origin Cube Symmetry -/ + +@[expose] public section + +namespace Homogenization + +private theorem matTranspose_signFlipMatrix {d : ℕ} (i : Fin d) : + matTranspose (signFlipMatrix i) = signFlipMatrix i := by + ext r c + by_cases h : r = c + · subst h + by_cases hr : r = i + · subst hr + simp [signFlipMatrix, matTranspose] + · simp [signFlipMatrix, matTranspose, hr] + · simp [signFlipMatrix, matTranspose, h, eq_comm] + +private theorem vecDot_signFlipVecContinuousLinearEquiv {d : ℕ} + (i : Fin d) (x y : Vec d) : + vecDot (signFlipVecContinuousLinearEquiv i x) y = + vecDot x (signFlipVecContinuousLinearEquiv i y) := by + rw [signFlipVecContinuousLinearEquiv_apply, signFlipVecContinuousLinearEquiv_apply, + ← vecDot_matVecMul_transpose x y (signFlipMatrix i), matTranspose_signFlipMatrix] + +private theorem vecDot_swapVecContinuousLinearEquiv {d : ℕ} + (i j : Fin d) (x y : Vec d) : + vecDot (swapVecContinuousLinearEquiv i j x) y = + vecDot x (swapVecContinuousLinearEquiv i j y) := by + rw [swapVecContinuousLinearEquiv_apply, swapVecContinuousLinearEquiv_apply, + ← vecDot_matVecMul_transpose x y (Matrix.swap ℝ i j)] + simp [matTranspose] + +theorem isPotentialOn_signFlip_openCubeSet_originCube + {d : ℕ} {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialOn (openCubeSet (originCube d n)) f) (i : Fin d) : + IsPotentialOn (openCubeSet (originCube d n)) + (fun x => signFlipVecContinuousLinearEquiv i (f (signFlipVecContinuousLinearEquiv i x))) := by + rcases hf with ⟨u, rfl⟩ + exact (u.signFlipOnOpenCubeSetOriginCube i).isPotentialOn + +theorem isPotentialOn_swap_openCubeSet_originCube + {d : ℕ} {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialOn (openCubeSet (originCube d n)) f) (i j : Fin d) : + IsPotentialOn (openCubeSet (originCube d n)) + (fun x => swapVecContinuousLinearEquiv i j (f (swapVecContinuousLinearEquiv i j x))) := by + rcases hf with ⟨u, rfl⟩ + simpa [swapVecContinuousLinearEquiv_apply] using! + (u.swapOnOpenCubeSetOriginCube i j).isPotentialOn + +theorem isPotentialZeroTraceOn_signFlip_openCubeSet_originCube + {d : ℕ} {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f) (i : Fin d) : + IsPotentialZeroTraceOn (openCubeSet (originCube d n)) + (fun x => signFlipVecContinuousLinearEquiv i (f (signFlipVecContinuousLinearEquiv i x))) := by + rcases hf with ⟨u, rfl⟩ + exact (H10Function.signFlipOnOpenCubeSetOriginCube u i).isPotentialZeroTraceOn + +theorem isPotentialZeroTraceOn_swap_openCubeSet_originCube + {d : ℕ} {n : ℤ} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn (openCubeSet (originCube d n)) f) (i j : Fin d) : + IsPotentialZeroTraceOn (openCubeSet (originCube d n)) + (fun x => swapVecContinuousLinearEquiv i j (f (swapVecContinuousLinearEquiv i j x))) := by + rcases hf with ⟨u, rfl⟩ + simpa [swapVecContinuousLinearEquiv_apply] using! + (H10Function.swapOnOpenCubeSetOriginCube u i j).isPotentialZeroTraceOn + +theorem isSolenoidalZeroNormalTraceOn_signFlip_openCubeSet_originCube + {d : ℕ} {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g) (i : Fin d) : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) + (fun x => signFlipVecContinuousLinearEquiv i (g (signFlipVecContinuousLinearEquiv i x))) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + intro φ + let ψ : H1Function U := φ.signFlipOnOpenCubeSetOriginCube i + have hψ : + ∫ x in U, vecDot (g x) + (signFlipVecContinuousLinearEquiv i (φ.grad (signFlipVecContinuousLinearEquiv i x))) + ∂MeasureTheory.volume = 0 := by + simpa [U, ψ, H1Function.signFlipOnOpenCubeSetOriginCube] using hg ψ + have hchange : + ∫ x in U, vecDot (g x) + (signFlipVecContinuousLinearEquiv i (φ.grad (signFlipVecContinuousLinearEquiv i x))) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g (signFlipVecContinuousLinearEquiv i x)) + (signFlipVecContinuousLinearEquiv i (φ.grad x)) ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => + vecDot (g (signFlipVecContinuousLinearEquiv i y)) + (signFlipVecContinuousLinearEquiv i (φ.grad y)) + simpa only [U, f, signFlipVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_signFlipVecContinuousLinearEquiv_openCubeSet_originCube i n f + rw [hchange] at hψ + rw [show (fun x => vecDot (g (signFlipVecContinuousLinearEquiv i x)) + (signFlipVecContinuousLinearEquiv i (φ.grad x))) = + fun x => vecDot (signFlipVecContinuousLinearEquiv i (g (signFlipVecContinuousLinearEquiv i x))) + (φ.grad x) by + funext x + symm + exact vecDot_signFlipVecContinuousLinearEquiv i (g (signFlipVecContinuousLinearEquiv i x)) + (φ.grad x)] at hψ + simpa using hψ + +theorem isSolenoidalZeroNormalTraceOn_swap_openCubeSet_originCube + {d : ℕ} {n : ℤ} {g : Vec d → Vec d} + (hg : IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) g) (i j : Fin d) : + IsSolenoidalZeroNormalTraceOn (openCubeSet (originCube d n)) + (fun x => swapVecContinuousLinearEquiv i j (g (swapVecContinuousLinearEquiv i j x))) := by + let U : Set (Vec d) := openCubeSet (originCube d n) + intro φ + let ψ : H1Function U := φ.swapOnOpenCubeSetOriginCube i j + have hψ : + ∫ x in U, vecDot (g x) + (swapVecContinuousLinearEquiv i j (φ.grad (swapVecContinuousLinearEquiv i j x))) + ∂MeasureTheory.volume = 0 := by + simpa [U, ψ, H1Function.swapOnOpenCubeSetOriginCube] using hg ψ + have hchange : + ∫ x in U, vecDot (g x) + (swapVecContinuousLinearEquiv i j (φ.grad (swapVecContinuousLinearEquiv i j x))) + ∂MeasureTheory.volume = + ∫ x in U, vecDot (g (swapVecContinuousLinearEquiv i j x)) + (swapVecContinuousLinearEquiv i j (φ.grad x)) ∂MeasureTheory.volume := by + let f : Vec d → ℝ := fun y => + vecDot (g (swapVecContinuousLinearEquiv i j y)) + (swapVecContinuousLinearEquiv i j (φ.grad y)) + simpa only [U, f, swapVecContinuousLinearEquiv_self_apply] using + setIntegral_comp_swapVecContinuousLinearEquiv_openCubeSet_originCube i j n f + rw [hchange] at hψ + rw [show (fun x => vecDot (g (swapVecContinuousLinearEquiv i j x)) + (swapVecContinuousLinearEquiv i j (φ.grad x))) = + fun x => vecDot (swapVecContinuousLinearEquiv i j (g (swapVecContinuousLinearEquiv i j x))) + (φ.grad x) by + funext x + symm + exact vecDot_swapVecContinuousLinearEquiv i j (g (swapVecContinuousLinearEquiv i j x)) + (φ.grad x)] at hψ + simpa using hψ + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalTranslation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalTranslation.lean new file mode 100644 index 0000000000..687ce121f5 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/PotentialSolenoidalTranslation.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.PotentialSolenoidal + +/-! # Potential Solenoidal Translation -/ + +@[expose] public section + +namespace Homogenization + +theorem isPotentialOn_translateSet {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialOn U f) (z : Vec d) : + IsPotentialOn (translateSet z U) (fun x => f (x - z)) := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.translate z, by + funext x + simp⟩ + +theorem isPotentialZeroTraceOn_translateSet {d : ℕ} {U : Set (Vec d)} {f : Vec d → Vec d} + (hf : IsPotentialZeroTraceOn U f) (z : Vec d) : + IsPotentialZeroTraceOn (translateSet z U) (fun x => f (x - z)) := by + rcases hf with ⟨u, rfl⟩ + exact ⟨u.translate z, by + funext x + simp⟩ + +theorem isSolenoidalOn_translateSet {d : ℕ} {U : Set (Vec d)} {g : Vec d → Vec d} + (hg : IsSolenoidalOn U g) (z : Vec d) : + IsSolenoidalOn (translateSet z U) (fun x => g (x - z)) := by + intro φ + have hU : translateSet (-z) (translateSet z U) = U := by + simpa using (translateSet_translateSet (d := d) z (-z) U) + have hg' : IsSolenoidalOn (translateSet (-z) (translateSet z U)) g := by + simpa [hU] using hg + have htest : + ∫ x in U, vecDot (g x) (φ.toH1Function.grad (x + z)) ∂MeasureTheory.volume = 0 := by + simpa [hU, H10Function.translate_toH1Function, H1Function.translate, sub_eq_add_neg, add_assoc] + using hg' (φ.translate (-z)) + have hchange : + ∫ x in U, vecDot (g x) (φ.toH1Function.grad (x + z)) ∂MeasureTheory.volume = + ∫ x in translateSet z U, + vecDot (g (x - z)) (φ.toH1Function.grad x) ∂MeasureTheory.volume := by + simpa [sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (fun x => vecDot (g (x - z)) (φ.toH1Function.grad x))) + calc + ∫ x in translateSet z U, + vecDot (g (x - z)) (φ.toH1Function.grad x) ∂MeasureTheory.volume + = ∫ x in U, vecDot (g x) (φ.toH1Function.grad (x + z)) ∂MeasureTheory.volume := by + symm + exact hchange + _ = 0 := htest + +theorem isSolenoidalZeroNormalTraceOn_translateSet {d : ℕ} {U : Set (Vec d)} + {g : Vec d → Vec d} (hg : IsSolenoidalZeroNormalTraceOn U g) (z : Vec d) : + IsSolenoidalZeroNormalTraceOn (translateSet z U) (fun x => g (x - z)) := by + intro φ + have hU : translateSet (-z) (translateSet z U) = U := by + simpa using (translateSet_translateSet (d := d) z (-z) U) + have hg' : IsSolenoidalZeroNormalTraceOn (translateSet (-z) (translateSet z U)) g := by + simpa [hU] using hg + have htest : + ∫ x in U, vecDot (g x) (φ.grad (x + z)) ∂MeasureTheory.volume = 0 := by + simpa [hU, H1Function.translate, sub_eq_add_neg, add_assoc] using + hg' (φ.translate (-z)) + have hchange : + ∫ x in U, vecDot (g x) (φ.grad (x + z)) ∂MeasureTheory.volume = + ∫ x in translateSet z U, vecDot (g (x - z)) (φ.grad x) ∂MeasureTheory.volume := by + simpa [sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) (E := ℝ) z U + (fun x => vecDot (g (x - z)) (φ.grad x))) + calc + ∫ x in translateSet z U, vecDot (g (x - z)) (φ.grad x) ∂MeasureTheory.volume + = ∫ x in U, vecDot (g x) (φ.grad (x + z)) ∂MeasureTheory.volume := by + symm + exact hchange + _ = 0 := htest + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/SmoothCompactSupport.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/SmoothCompactSupport.lean new file mode 100644 index 0000000000..0927fca403 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/SmoothCompactSupport.lean @@ -0,0 +1,84 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import Mathlib.Analysis.Distribution.TestFunction + +/-! +# Smooth compactly supported test functions + +This is a thin adapter over Mathlib's genuine test-function carrier +`𝓓^{⊤}(Ω, ℝ)`. It records the concrete Euclidean-coordinate gradient used by +the project's weak Sobolev witnesses, without introducing a second test-space +structure or any regularity hypothesis on `Ω`. +-/ + +@[expose] public section + +namespace Homogenization + +open TopologicalSpace +open scoped Distributions + +/-- Mathlib's smooth compactly supported real-valued test functions on `Ω`. -/ +abbrev SmoothCompactSupportFunction {d : ℕ} (Ω : Opens (Vec d)) : Type _ := + 𝓓^{⊤}(Ω, ℝ) + +namespace SmoothCompactSupportFunction + +/-- The explicit Euclidean-coordinate gradient of a smooth test function. -/ +noncomputable def gradient {d : ℕ} {Ω : Opens (Vec d)} + (φ : SmoothCompactSupportFunction Ω) : Vec d → Vec d := + fun x i => (fderiv ℝ φ x) (basisVec i) + +/-- The literal global smoothness fact carried by Mathlib's test-function type. -/ +theorem contDiff {d : ℕ} {Ω : Opens (Vec d)} (φ : SmoothCompactSupportFunction Ω) : + ContDiff ℝ (⊤ : ℕ∞) (φ : Vec d → ℝ) := + TestFunction.contDiff φ + +/-- The literal compact-support fact carried by Mathlib's test-function type. -/ +theorem hasCompactSupport {d : ℕ} {Ω : Opens (Vec d)} + (φ : SmoothCompactSupportFunction Ω) : + HasCompactSupport (φ : Vec d → ℝ) := + TestFunction.hasCompactSupport φ + +/-- The literal support-in-domain fact carried by Mathlib's test-function type. -/ +theorem tsupport_subset {d : ℕ} {Ω : Opens (Vec d)} + (φ : SmoothCompactSupportFunction Ω) : + tsupport (φ : Vec d → ℝ) ⊆ (Ω : Set (Vec d)) := + TestFunction.tsupport_subset φ + +/-- Regard a smooth compactly supported test function as a `W^{1,p}` function +on its open support domain. -/ +noncomputable def toW1pFunction {d : ℕ} (Ω : Opens (Vec d)) (p : ENNReal) + (φ : SmoothCompactSupportFunction Ω) : W1pFunction (Ω : Set (Vec d)) p := + W1pFunction.ofContDiff Ω.isOpen ((contDiff φ).of_le (by simp)) (hasCompactSupport φ) p + +@[simp] theorem toW1pFunction_toFun {d : ℕ} (Ω : Opens (Vec d)) (p : ENNReal) + (φ : SmoothCompactSupportFunction Ω) : + (φ.toW1pFunction Ω p).toFun = (φ : Vec d → ℝ) := + rfl + +@[simp] theorem toW1pFunction_grad {d : ℕ} (Ω : Opens (Vec d)) (p : ENNReal) + (φ : SmoothCompactSupportFunction Ω) : + (φ.toW1pFunction Ω p).grad = φ.gradient := + rfl + +/-- Negating a test function negates its explicit gradient. This is the sign +compatibility needed when symmetric test classes are used in dual suprema. -/ +@[simp] theorem gradient_neg {d : ℕ} {Ω : Opens (Vec d)} + (φ : SmoothCompactSupportFunction Ω) : + (-φ).gradient = -φ.gradient := by + ext x i + change (fderiv ℝ (fun y => -φ y) x) (basisVec i) = + -(fderiv ℝ (φ : Vec d → ℝ) x) (basisVec i) + rw [fderiv_fun_neg, neg_apply] + +end SmoothCompactSupportFunction + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation.lean new file mode 100644 index 0000000000..858293352b --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation.lean @@ -0,0 +1,19 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Approx +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.ChainRule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.H10Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.LevelSets +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.MatchedTrace +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.WeakGradientLimit + +/-! Supporting modules for Coarse-graining theory for elliptic equations. -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Approx.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Approx.lean new file mode 100644 index 0000000000..21733dc301 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Approx.lean @@ -0,0 +1,512 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.ChainRule +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.WeakGradientLimit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Convergence +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import Mathlib.Analysis.SpecialFunctions.SmoothTransition +public import Mathlib.MeasureTheory.Integral.IntervalIntegral.FundThmCalculus + +/-! # Approx -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal + +/-! +# The C¹ chain rule for `H¹` via mollification + +`hasWeakGradientOn_comp_of_deriv_bounded`: for `u ∈ H¹(U)` and `G` of class `C¹` +with `|G'| ≤ M`, the composite `G ∘ u` has weak gradient `G'(u) · ∇u`. +-/ + +/-! ### One-sided smooth approximators `G_δ → (·−c)₊` -/ + +/-- Smooth step: `0` for `t ≤ c+δ`, `1` for `t ≥ c+2δ`, in `[0,1]`. -/ +noncomputable def gStep (c δ t : ℝ) : ℝ := Real.smoothTransition ((t - c) / δ - 1) + +/-- One-sided smooth approximant to `(·−c)₊`, an antiderivative of `gStep`. -/ +noncomputable def GApprox (c δ t : ℝ) : ℝ := ∫ s in c..t, gStep c δ s + +theorem gStep_contDiff (c δ : ℝ) : ContDiff ℝ (⊤ : ℕ∞) (gStep c δ) := + Real.smoothTransition.contDiff.comp + (((contDiff_id.sub contDiff_const).div_const δ).sub contDiff_const) + +theorem gStep_continuous (c δ : ℝ) : Continuous (gStep c δ) := (gStep_contDiff c δ).continuous + +theorem gStep_nonneg (c δ t : ℝ) : 0 ≤ gStep c δ t := Real.smoothTransition.nonneg _ + +theorem gStep_le_one (c δ t : ℝ) : gStep c δ t ≤ 1 := Real.smoothTransition.le_one _ + +theorem gStep_eq_zero {c δ t : ℝ} (hδ : 0 < δ) (ht : t ≤ c + δ) : gStep c δ t = 0 := by + apply Real.smoothTransition.zero_of_nonpos + rw [sub_nonpos, div_le_one hδ]; linarith + +theorem gStep_eq_one {c δ t : ℝ} (hδ : 0 < δ) (ht : c + 2 * δ ≤ t) : gStep c δ t = 1 := by + apply Real.smoothTransition.one_of_one_le + rw [le_sub_iff_add_le, le_div_iff₀ hδ]; linarith + +theorem gStep_intervalIntegrable (c δ a b : ℝ) : + IntervalIntegrable (gStep c δ) volume a b := (gStep_continuous c δ).intervalIntegrable a b + +theorem GApprox_hasDerivAt (c δ t : ℝ) : HasDerivAt (GApprox c δ) (gStep c δ t) t := + intervalIntegral.integral_hasDerivAt_right (gStep_intervalIntegrable c δ c t) + ((gStep_continuous c δ).stronglyMeasurableAtFilter _ _) + (gStep_continuous c δ).continuousAt + +theorem deriv_GApprox (c δ : ℝ) : deriv (GApprox c δ) = gStep c δ := by + funext t; exact (GApprox_hasDerivAt c δ t).deriv + +theorem GApprox_contDiff_one (c δ : ℝ) : ContDiff ℝ 1 (GApprox c δ) := by + rw [contDiff_one_iff_deriv] + exact ⟨fun t => (GApprox_hasDerivAt c δ t).differentiableAt, + by rw [deriv_GApprox]; exact gStep_continuous c δ⟩ + +theorem abs_deriv_GApprox_le (c δ t : ℝ) : |deriv (GApprox c δ) t| ≤ 1 := by + rw [deriv_GApprox, abs_of_nonneg (gStep_nonneg c δ t)]; exact gStep_le_one c δ t + +/-- The pointwise derivative limit: `gStep c δₙ t → 𝟙_{t > c}` for every `t`. -/ +theorem tendsto_gStep {c : ℝ} {δ : ℕ → ℝ} (hδpos : ∀ n, 0 < δ n) + (hδ : Tendsto δ atTop (𝓝 0)) (t : ℝ) : + Tendsto (fun n => gStep c (δ n) t) atTop (𝓝 (if c < t then 1 else 0)) := by + by_cases hct : c < t + · rw [if_pos hct] + have hev : ∀ᶠ n in atTop, gStep c (δ n) t = 1 := by + have : ∀ᶠ n in atTop, δ n < (t - c) / 2 := + (tendsto_order.1 hδ).2 _ (by linarith) + filter_upwards [this] with n hn + exact gStep_eq_one (hδpos n) (by linarith) + exact Tendsto.congr' (hev.mono fun n hn => hn.symm) tendsto_const_nhds + · rw [if_neg hct] + have hev : ∀ᶠ n in atTop, gStep c (δ n) t = 0 := + Filter.Eventually.of_forall fun n => + gStep_eq_zero (hδpos n) (by push Not at hct; linarith [(hδpos n).le]) + exact Tendsto.congr' (hev.mono fun n hn => hn.symm) tendsto_const_nhds + +theorem abs_GApprox_le (c δ t : ℝ) : |GApprox c δ t| ≤ |t - c| := by + rw [GApprox, ← Real.norm_eq_abs] + refine (intervalIntegral.norm_integral_le_of_norm_le_const (fun s _ => ?_)).trans + (one_mul _).le + rw [Real.norm_eq_abs, abs_of_nonneg (gStep_nonneg c δ s)] + exact gStep_le_one c δ s + +/-- Uniform closeness of the approximant to the positive part. -/ +theorem abs_GApprox_sub_le {c δ : ℝ} (hδ : 0 < δ) (t : ℝ) : + |GApprox c δ t - max (t - c) 0| ≤ 2 * δ := by + rcases le_or_gt t c with htc | htc + · -- `t ≤ c`: the approximant vanishes. + have hzero : GApprox c δ t = 0 := by + rw [GApprox, ← intervalIntegral.integral_zero (a := c) (b := t) (μ := volume)] + apply intervalIntegral.integral_congr + intro s hs + rw [Set.uIcc_of_ge htc] at hs + exact gStep_eq_zero hδ (by linarith [hs.2, (le_of_lt hδ)]) + rw [hzero, max_eq_right (by linarith), sub_zero, abs_zero]; linarith + · -- `c < t`: split the integral at `c + 2δ`. + rw [max_eq_left (by linarith)] + have hle : GApprox c δ t ≤ t - c := by + rw [GApprox] + calc ∫ s in c..t, gStep c δ s ≤ ∫ _ in c..t, (1 : ℝ) := + intervalIntegral.integral_mono_on htc.le (gStep_intervalIntegrable c δ c t) + (intervalIntegrable_const) (fun s _ => gStep_le_one c δ s) + _ = t - c := by rw [intervalIntegral.integral_const, smul_eq_mul, mul_one] + have hge : t - c - 2 * δ ≤ GApprox c δ t := by + by_cases h2 : c + 2 * δ ≤ t + · have hsplit : GApprox c δ t + = (∫ s in c..(c + 2 * δ), gStep c δ s) + ∫ s in (c + 2 * δ)..t, gStep c δ s := by + rw [GApprox] + exact (intervalIntegral.integral_add_adjacent_intervals + (gStep_intervalIntegrable c δ _ _) (gStep_intervalIntegrable c δ _ _)).symm + have htail : (∫ s in (c + 2 * δ)..t, gStep c δ s) = t - (c + 2 * δ) := by + rw [show (∫ s in (c + 2 * δ)..t, gStep c δ s) = ∫ _ in (c + 2 * δ)..t, (1 : ℝ) from + intervalIntegral.integral_congr + (fun s hs => by + rw [Set.uIcc_of_le h2] at hs + exact gStep_eq_one hδ hs.1), + intervalIntegral.integral_const, smul_eq_mul, mul_one] + have hhead : 0 ≤ ∫ s in c..(c + 2 * δ), gStep c δ s := + intervalIntegral.integral_nonneg (by linarith) (fun s _ => gStep_nonneg c δ s) + rw [hsplit, htail]; linarith + · push Not at h2 + have hpos : 0 ≤ GApprox c δ t := + intervalIntegral.integral_nonneg htc.le (fun s _ => gStep_nonneg c δ s) + linarith + rw [abs_le]; constructor <;> linarith + +end Homogenization + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal + +/-- **C¹ chain rule (weak-gradient form).** -/ +theorem hasWeakGradientOn_comp_of_deriv_bounded + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) {G : ℝ → ℝ} (hG : ContDiff ℝ 1 G) + {M : ℝ} (hM : 0 ≤ M) (hderiv : ∀ t, |deriv G t| ≤ M) : + HasWeakGradientOn U (fun x => G (u.toFun x)) + (fun x i => deriv G (u.toFun x) * u.grad x i) := by + -- `G` is `M`-Lipschitz and differentiable. + have hGdiff : Differentiable ℝ G := hG.differentiable (by norm_num) + have hGlip : LipschitzWith M.toNNReal G := lipschitzWith_of_abs_deriv_le hM hGdiff hderiv + have : IsFiniteMeasure (volumeMeasureOn U) := hU.isBoundedDomain.isFiniteMeasure_restrict_volume + -- Empty domain: the pairing identity is trivial. + rcases U.eq_empty_or_nonempty with hempty | hne + · subst hempty + intro i φ _ _ _ + simp + -- A closed ball inside `U`. + obtain ⟨x0, hx0U⟩ := hne + obtain ⟨r0, hr0, hball0⟩ := Metric.isOpen_iff.mp hU.isOpen x0 hx0U + set r : ℝ := r0 / 2 with hr_def + have hr : 0 < r := by positivity + have hball : Metric.closedBall x0 r ⊆ U := by + refine (Metric.closedBall_subset_ball ?_).trans hball0 + rw [hr_def]; linarith + set ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) with hρ_def + have hρ : IsConvexApproxKernel ρ := isConvexApproxKernel_unitConvexApproxKernel + -- Scale sequence shifted to land in `(0,1)`. + set e : ℕ → ℝ := fun n => unitConvexApproxScale (n + 1) with he_def + have he_pos : ∀ n, 0 < e n := by + intro n; simp only [he_def, unitConvexApproxScale]; positivity + have he_lt : ∀ n, e n < 1 := by + intro n + simp only [he_def, unitConvexApproxScale] + rw [div_lt_one (by positivity)] + have : (0:ℝ) ≤ (n:ℝ) := by positivity + push_cast; linarith + have he_le : ∀ n, e n ≤ 1 := fun n => (he_lt n).le + have he_tendsto : Tendsto e atTop (𝓝 0) := + tendsto_unitConvexApproxScale_zero.comp (tendsto_add_atTop_nat 1) + -- The globally-smooth representative sequence. + set w : ℕ → Vec d → ℝ := fun n => convexApproxSmoothRepresentative U ρ u.toFun x0 r (e n) + with hw_def + have hw_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (w n) := fun n => + contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet hρ one_le_two u.memL2 hr + (he_pos n) + -- On `U`, `w n` agrees with the smoothing sequence `unitConvexApproxSequence u (n+1)`. + have hw_eq : ∀ n, ∀ x ∈ U, w n x = unitConvexApproxSequence u.toFun x0 r (n + 1) x := by + intro n x hx + simpa [hw_def, unitConvexApproxSequence, he_def] using + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem hU hρ hx hball hr + (he_pos n) (he_lt n) + -- Local integrability of `u` and its gradient (for the smoothing weak-gradient identity). + have huLoc : LocallyIntegrableOn u.toFun U volume := + locallyIntegrableOn_of_locallyIntegrable_restrict (u.memL2.locallyIntegrable one_le_two) + have hDuLoc : ∀ j : Fin d, LocallyIntegrableOn (fun x => u.grad x j) U volume := + fun j => locallyIntegrableOn_of_locallyIntegrable_restrict + ((u.gradMemL2 j).locallyIntegrable one_le_two) + -- Transport of a weak partial derivative along agreement on `U`. + have htransport : ∀ (i : Fin d) (f g h : Vec d → ℝ), (∀ x ∈ U, f x = g x) → + HasWeakPartialDerivOn U i g h → HasWeakPartialDerivOn U i f h := by + intro i f g h hfg hg φ hφ hφc hφs + rw [← hg φ hφ hφc hφs] + exact setIntegral_congr_fun hU.isOpen.measurableSet + (fun x hx => by rw [hfg x hx]) + intro i + -- Per-`n` classical `i`-partial of `w n` and the composite gradient. + set Dwn : ℕ → Vec d → ℝ := fun n x => (fderiv ℝ (w n) x) (basisVec i) with hDwn_def + set un : ℕ → Vec d → ℝ := fun n x => G (w n x) with hun_def + set gn : ℕ → Vec d → ℝ := fun n x => deriv G (w n x) * Dwn n x with hgn_def + set smi : ℕ → Vec d → ℝ := + fun n => convexApproxSmoothing ρ (fun y => u.grad y i) x0 r (e n) with hsmi_def + -- Each `G ∘ w n` is `C¹`, with weak `i`-partial `gn n`. + have hweak_n : ∀ n, HasWeakPartialDerivOn U i (un n) (gn n) := by + intro n + have hGwn : ContDiff ℝ 1 (fun x => G (w n x)) := + hG.comp ((hw_smooth n).of_le (by norm_num)) + have h := (HasWeakGradientOn.of_contDiff (U := U) hGwn) i + have heq : (fun x => (fderiv ℝ (fun y => G (w n y)) x) (basisVec i)) = gn n := by + funext x + rw [fderiv_comp_basisVec hGdiff.differentiableAt + ((hw_smooth n).differentiable (by norm_num)).differentiableAt] + rwa [heq] at h + -- The `(1−ε)` bridge: classical `∂ᵢ(w n) =ᵃᵉ (1−e n)·smoothing(∂ᵢu)` on `U`. + have hbridge : ∀ n, Dwn n =ᵐ[volumeMeasureOn U] (fun x => (1 - e n) * smi n x) := by + intro n + have hDwn_weak : HasWeakPartialDerivOn U i (w n) (Dwn n) := + (HasWeakGradientOn.of_contDiff (U := U) ((hw_smooth n).of_le (by norm_num))) i + have hsm_weak0 := + (HasWeakGradientOn.convexApproxSmoothing hU huLoc hDuLoc u.hasWeakGradient hρ hball hr.le + (he_pos n).le (he_lt n)) i + -- transport smoothing's weak partial to `w n` (they agree on `U`). + have hsm_weak : HasWeakPartialDerivOn U i (w n) (fun x => (1 - e n) * smi n x) := by + refine htransport i (w n) (convexApproxSmoothing ρ u.toFun x0 r (e n)) _ ?_ hsm_weak0 + intro x hx + simpa [hw_def, unitConvexApproxSequence, he_def] using hw_eq n x hx + -- local integrability of both candidate derivatives. + have hDwn_cont : Continuous (Dwn n) := by + simpa [hDwn_def] using + ((hw_smooth n).continuous_fderiv (by norm_num)).clm_apply continuous_const + have hDwn_loc : LocallyIntegrableOn (Dwn n) U volume := + hDwn_cont.continuousOn.locallyIntegrableOn hU.isOpen.measurableSet + have hsm_loc : LocallyIntegrableOn (fun x => (1 - e n) * smi n x) U volume := by + have hrepr_smooth : ContDiff ℝ (⊤ : ℕ∞) + (convexApproxSmoothRepresentative U ρ (fun y => u.grad y i) x0 r (e n)) := + contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet hρ one_le_two + (u.gradMemL2 i) hr (he_pos n) + have hbase : ContinuousOn + (fun x => (1 - e n) * + convexApproxSmoothRepresentative U ρ (fun y => u.grad y i) x0 r (e n) x) U := + (continuous_const.mul hrepr_smooth.continuous).continuousOn + have hcont : ContinuousOn (fun x => (1 - e n) * smi n x) U := by + refine hbase.congr ?_ + intro x hx + simp only [hsmi_def] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem hU hρ hx hball hr + (he_pos n) (he_lt n)] + exact hcont.locallyIntegrableOn hU.isOpen.measurableSet + exact HasWeakPartialDerivOn.ae_eq hU.isOpen hDwn_loc hsm_loc hDwn_weak hsm_weak + -- Numeric facts. + have h2t : (2 : ℝ≥0∞) ≠ ⊤ := by norm_num + have h12 : (1 : ℝ≥0∞) ≤ 2 := by norm_num + -- `L²` membership of a `C¹`-image. + have hG0lip : LipschitzWith M.toNNReal (fun t => G t - G 0) := by + intro a b; simpa [edist_sub_right] using hGlip a b + have hcompL2 : ∀ v : Vec d → ℝ, MemLp v 2 (volumeMeasureOn U) → + MemLp (fun x => G (v x)) 2 (volumeMeasureOn U) := by + intro v hv + have h1 : MemLp (fun x => G (v x) - G 0) 2 (volumeMeasureOn U) := + hG0lip.comp_memLp (by simp) hv + have h2 : MemLp (fun _ : Vec d => G 0) 2 (volumeMeasureOn U) := memLp_const _ + refine (h1.add h2).ae_eq ?_ + filter_upwards with x + simp + -- Continuity of `deriv G` and measurability of composites. + have hderivG_cont : Continuous (deriv G) := hG.continuous_deriv (by norm_num) + have haesm_comp : ∀ v : Vec d → ℝ, AEStronglyMeasurable v (volumeMeasureOn U) → + AEStronglyMeasurable (fun x => deriv G (v x)) (volumeMeasureOn U) := + fun v hv => hderivG_cont.comp_aestronglyMeasurable hv + -- `L²` membership of `w n`, `Dwn n`, `un n`, `gn n`, and the two targets. + have hwn_memL2 : ∀ n, MemLp (w n) 2 (volumeMeasureOn U) := by + intro n + have hsm := memLpOn_convexApproxSmoothing hU hρ h12 h2t u.memL2 hball hr (he_pos n) (he_lt n) + refine hsm.ae_eq ?_ + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + simpa [unitConvexApproxSequence, he_def, hρ_def] using (hw_eq n x hx).symm + have hun_memL2 : ∀ n, MemLp (un n) 2 (volumeMeasureOn U) := + fun n => hcompL2 (w n) (hwn_memL2 n) + have hsmi_memL2 : ∀ n, MemLp (smi n) 2 (volumeMeasureOn U) := by + intro n + simpa [hsmi_def] using + memLpOn_convexApproxSmoothing hU hρ h12 h2t (u.gradMemL2 i) hball hr (he_pos n) (he_lt n) + have hDwn_memL2 : ∀ n, MemLp (Dwn n) 2 (volumeMeasureOn U) := fun n => + ((hsmi_memL2 n).const_mul (1 - e n)).ae_eq (hbridge n).symm + have hgn_memL2 : ∀ n, MemLp (gn n) 2 (volumeMeasureOn U) := by + intro n + refine MemLp.of_le ((hDwn_memL2 n).const_mul M) ?_ ?_ + · exact (haesm_comp (w n) (hw_smooth n).continuous.aestronglyMeasurable).mul + (hDwn_memL2 n).1 + · filter_upwards with x + simp only [hgn_def, norm_mul, Real.norm_eq_abs] + exact mul_le_mul_of_nonneg_right + (by rw [abs_of_nonneg hM]; exact hderiv (w n x)) (abs_nonneg _) + have hGu_memL2 : MemLp (fun x => G (u.toFun x)) 2 (volumeMeasureOn U) := + hcompL2 u.toFun u.memL2 + have hg_memL2 : MemLp (fun x => deriv G (u.toFun x) * u.grad x i) 2 (volumeMeasureOn U) := by + refine MemLp.of_le ((u.gradMemL2 i).const_mul M) ?_ ?_ + · exact (haesm_comp u.toFun u.memL2.1).mul (u.gradMemL2 i).1 + · filter_upwards with x + simp only [norm_mul, Real.norm_eq_abs] + exact mul_le_mul_of_nonneg_right + (by rw [abs_of_nonneg hM]; exact hderiv (u.toFun x)) (abs_nonneg _) + -- L² convergence `w n → u` (function side). + have hwu_L2 : Tendsto + (fun n => eLpNorm (fun x => w n x - u.toFun x) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have hbase := + (tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_memLpOn hU h12 h2t u.memL2 hball hr).comp + (tendsto_add_atTop_nat 1) + refine hbase.congr (fun n => ?_) + apply eLpNorm_congr_ae + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + rw [hw_eq n x hx] + -- a.e.-convergent subsequence. + obtain ⟨σ, hσ_mono, hσ_ae⟩ := + (tendstoInMeasure_of_tendsto_eLpNorm (by norm_num) + (fun n => (hw_smooth n).continuous.aestronglyMeasurable) u.memL2.1 + hwu_L2).exists_seq_tendsto_ae + -- L² convergence of the smoothing of `∂ᵢu`. + have hsmi_conv : Tendsto + (fun n => eLpNorm (fun x => smi n x - u.grad x i) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have hbase := + (tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_memLpOn hU h12 h2t (u.gradMemL2 i) + hball hr).comp (tendsto_add_atTop_nat 1) + refine hbase.congr (fun n => ?_) + apply eLpNorm_congr_ae + filter_upwards with x + simp only [hsmi_def, unitConvexApproxSequence, he_def, hρ_def] + -- **Goal 1.** `∂ᵢ(w n) → ∂ᵢu` in `L²` via the `(1−e n)` bridge. + set C : ℝ≥0∞ := eLpNorm (fun x => u.grad x i) 2 (volumeMeasureOn U) with hC + have hC_ne_top : C ≠ ⊤ := (u.gradMemL2 i).eLpNorm_ne_top + have hDwn_conv : Tendsto + (fun n => eLpNorm (fun x => Dwn n x - u.grad x i) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have hbound : ∀ n, + eLpNorm (fun x => Dwn n x - u.grad x i) 2 (volumeMeasureOn U) + ≤ ENNReal.ofReal (1 - e n) * + eLpNorm (fun x => smi n x - u.grad x i) 2 (volumeMeasureOn U) + + ENNReal.ofReal (e n) * C := by + intro n + have hae : (fun x => Dwn n x - u.grad x i) =ᵐ[volumeMeasureOn U] + (fun x => (1 - e n) * (smi n x - u.grad x i) - e n * u.grad x i) := by + filter_upwards [hbridge n] with x hx + rw [hx]; ring + have hmeasA : AEStronglyMeasurable + (fun x => (1 - e n) * (smi n x - u.grad x i)) (volumeMeasureOn U) := + ((hsmi_memL2 n).1.sub (u.gradMemL2 i).1).const_mul _ + have hmeasB : AEStronglyMeasurable + (fun x => e n * u.grad x i) (volumeMeasureOn U) := (u.gradMemL2 i).1.const_mul _ + have hA : eLpNorm (fun x => (1 - e n) * (smi n x - u.grad x i)) 2 (volumeMeasureOn U) + = ENNReal.ofReal (1 - e n) * + eLpNorm (fun x => smi n x - u.grad x i) 2 (volumeMeasureOn U) := by + rw [show (fun x => (1 - e n) * (smi n x - u.grad x i)) + = (1 - e n) • (fun x => smi n x - u.grad x i) from rfl, + eLpNorm_const_smul, Real.enorm_eq_ofReal (by linarith [he_le n])] + have hB : eLpNorm (fun x => e n * u.grad x i) 2 (volumeMeasureOn U) + = ENNReal.ofReal (e n) * C := by + rw [show (fun x => e n * u.grad x i) = e n • (fun x => u.grad x i) from rfl, + eLpNorm_const_smul, Real.enorm_eq_ofReal (he_pos n).le, hC] + rw [eLpNorm_congr_ae hae] + calc eLpNorm + (fun x => (1 - e n) * (smi n x - u.grad x i) - e n * u.grad x i) 2 (volumeMeasureOn U) + ≤ eLpNorm (fun x => (1 - e n) * (smi n x - u.grad x i)) 2 (volumeMeasureOn U) + + eLpNorm (fun x => e n * u.grad x i) 2 (volumeMeasureOn U) := + eLpNorm_sub_le hmeasA hmeasB h12 + _ = _ := by rw [hA, hB] + have hofR1 : Tendsto (fun n => ENNReal.ofReal (1 - e n)) atTop (𝓝 1) := by + have : Tendsto (fun n => (1 : ℝ) - e n) atTop (𝓝 1) := by + simpa using tendsto_const_nhds.sub he_tendsto + simpa using! (ENNReal.continuous_ofReal.tendsto 1).comp this + have hofR0 : Tendsto (fun n => ENNReal.ofReal (e n)) atTop (𝓝 0) := by + simpa using! (ENNReal.continuous_ofReal.tendsto 0).comp he_tendsto + have hrhs : Tendsto + (fun n => ENNReal.ofReal (1 - e n) * + eLpNorm (fun x => smi n x - u.grad x i) 2 (volumeMeasureOn U) + + ENNReal.ofReal (e n) * C) atTop (𝓝 0) := by + have h1 := ENNReal.Tendsto.mul hofR1 (Or.inl one_ne_zero) hsmi_conv (Or.inr (by norm_num)) + have h2 := ENNReal.Tendsto.mul hofR0 (Or.inr hC_ne_top) tendsto_const_nhds + (Or.inr (by norm_num)) + simpa using h1.add h2 + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun n => zero_le) hbound + -- Function-side convergence `G ∘ w (σ k) → G ∘ u` in `L²`. + have hun_conv : Tendsto + (fun k => eLpNorm (fun x => un (σ k) x - G (u.toFun x)) 2 (volumeMeasureOn U)) + atTop (𝓝 0) := by + have hle : ∀ k, eLpNorm (fun x => un (σ k) x - G (u.toFun x)) 2 (volumeMeasureOn U) + ≤ ENNReal.ofReal M * + eLpNorm (fun x => w (σ k) x - u.toFun x) 2 (volumeMeasureOn U) := by + intro k + simpa [hun_def] using eLpNorm_comp_sub_le_of_lipschitz hM hGlip (w (σ k)) u.toFun + (hwn_memL2 (σ k)).aestronglyMeasurable u.memL2.aestronglyMeasurable + have hrhs : Tendsto + (fun k => ENNReal.ofReal M * + eLpNorm (fun x => w (σ k) x - u.toFun x) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have := ENNReal.Tendsto.const_mul (a := ENNReal.ofReal M) + (hwu_L2.comp hσ_mono.tendsto_atTop) (Or.inr ENNReal.ofReal_ne_top) + simpa using this + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun k => zero_le) hle + -- Gradient-side convergence `gn (σ k) → G'(u)·∂ᵢu` in `L²` (Term A + Term B). + have hgn_conv : Tendsto + (fun k => eLpNorm (fun x => gn (σ k) x - deriv G (u.toFun x) * u.grad x i) 2 + (volumeMeasureOn U)) atTop (𝓝 0) := by + -- Term B via dominated convergence. + set TB : ℕ → Vec d → ℝ := + fun k x => (deriv G (w (σ k) x) - deriv G (u.toFun x)) * u.grad x i with hTB_def + have hTB_conv : Tendsto + (fun k => eLpNorm (fun x => TB k x) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have hmeasTB : ∀ k, AEStronglyMeasurable (TB k) (volumeMeasureOn U) := fun k => + ((haesm_comp (w (σ k)) (hw_smooth (σ k)).continuous.aestronglyMeasurable).sub + (haesm_comp u.toFun u.memL2.1)).mul (u.gradMemL2 i).1 + have hdom : MemLp (fun x => ‖(2 * M) * u.grad x i‖) 2 (volumeMeasureOn U) := + ((u.gradMemL2 i).const_mul (2 * M)).norm + have hbnd : ∀ k, ∀ᵐ x ∂(volumeMeasureOn U), ‖TB k x‖ ≤ ‖(2 * M) * u.grad x i‖ := by + intro k + filter_upwards with x + rw [hTB_def, norm_mul, norm_mul] + refine mul_le_mul_of_nonneg_right ?_ (norm_nonneg _) + rw [Real.norm_eq_abs, Real.norm_eq_abs, abs_of_nonneg (by positivity : (0:ℝ) ≤ 2 * M)] + calc |deriv G (w (σ k) x) - deriv G (u.toFun x)| + ≤ |deriv G (w (σ k) x)| + |deriv G (u.toFun x)| := abs_sub _ _ + _ ≤ M + M := add_le_add (hderiv _) (hderiv _) + _ = 2 * M := by ring + have hae : ∀ᵐ x ∂(volumeMeasureOn U), Tendsto (fun k => TB k x) atTop (𝓝 0) := by + filter_upwards [hσ_ae] with x hx + have h1 : Tendsto (fun k => deriv G (w (σ k) x)) atTop (𝓝 (deriv G (u.toFun x))) := + (hderivG_cont.tendsto _).comp hx + have h2 := (h1.sub (tendsto_const_nhds (x := deriv G (u.toFun x)))).mul_const (u.grad x i) + simpa [hTB_def] using h2 + have := tendsto_eLpNorm_two_of_tendsto_ae_of_dominated hmeasTB + (memLp_const 0) hdom hbnd (by filter_upwards [hae] with x hx using by simpa using hx) + simpa using this + -- Term A dominated by `M · ‖∂ᵢw(σk) − ∂ᵢu‖`. + have hTA_le : ∀ k, + eLpNorm (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)) 2 (volumeMeasureOn U) + ≤ ENNReal.ofReal M * + eLpNorm (fun x => Dwn (σ k) x - u.grad x i) 2 (volumeMeasureOn U) := by + intro k + have hpt : ∀ x, ‖deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)‖ + ≤ ‖M • (Dwn (σ k) x - u.grad x i)‖ := by + intro x + rw [norm_smul, norm_mul, Real.norm_eq_abs, Real.norm_eq_abs M] + exact mul_le_mul_of_nonneg_right + (by rw [abs_of_nonneg hM]; exact hderiv (w (σ k) x)) (abs_nonneg _) + calc eLpNorm (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)) 2 (volumeMeasureOn U) + ≤ eLpNorm (fun x => M • (Dwn (σ k) x - u.grad x i)) 2 (volumeMeasureOn U) := + eLpNorm_mono hpt + _ = ENNReal.ofReal M * + eLpNorm (fun x => Dwn (σ k) x - u.grad x i) 2 (volumeMeasureOn U) := by + rw [show (fun x => M • (Dwn (σ k) x - u.grad x i)) + = M • (fun x => Dwn (σ k) x - u.grad x i) from rfl, eLpNorm_const_smul] + simp [Real.enorm_eq_ofReal hM] + have hTA_conv : Tendsto + (fun k => eLpNorm (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)) 2 + (volumeMeasureOn U)) atTop (𝓝 0) := by + have hrhs : Tendsto + (fun k => ENNReal.ofReal M * + eLpNorm (fun x => Dwn (σ k) x - u.grad x i) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + have := ENNReal.Tendsto.const_mul (a := ENNReal.ofReal M) + (hDwn_conv.comp hσ_mono.tendsto_atTop) (Or.inr ENNReal.ofReal_ne_top) + simpa using this + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hrhs + (fun k => zero_le) hTA_le + -- Combine: the gradient difference splits into Term A plus Term B. + have hsplit : ∀ k, eLpNorm (fun x => gn (σ k) x - deriv G (u.toFun x) * u.grad x i) 2 + (volumeMeasureOn U) + ≤ eLpNorm (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)) 2 (volumeMeasureOn U) + + eLpNorm (fun x => TB k x) 2 (volumeMeasureOn U) := by + intro k + have heq : (fun x => gn (σ k) x - deriv G (u.toFun x) * u.grad x i) + = (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i) + TB k x) := by + funext x; simp only [hgn_def, hTB_def]; ring + rw [heq] + refine eLpNorm_add_le ?_ ?_ h12 + · exact ((haesm_comp (w (σ k)) (hw_smooth (σ k)).continuous.aestronglyMeasurable).mul + ((hDwn_memL2 (σ k)).1.sub (u.gradMemL2 i).1)) + · exact ((haesm_comp (w (σ k)) (hw_smooth (σ k)).continuous.aestronglyMeasurable).sub + (haesm_comp u.toFun u.memL2.1)).mul (u.gradMemL2 i).1 + have hsum : Tendsto + (fun k => eLpNorm (fun x => deriv G (w (σ k) x) * (Dwn (σ k) x - u.grad x i)) 2 + (volumeMeasureOn U) + + eLpNorm (fun x => TB k x) 2 (volumeMeasureOn U)) atTop (𝓝 0) := by + simpa using hTA_conv.add hTB_conv + exact tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun k => zero_le) hsplit + -- Apply the L²-limit closure keystone along the subsequence. + exact hasWeakPartialDerivOn_of_tendsto_L2 + hGu_memL2 hg_memL2 (fun k => hun_memL2 (σ k)) (fun k => hgn_memL2 (σ k)) + (fun k => hweak_n (σ k)) hun_conv hgn_conv + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Basic.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Basic.lean new file mode 100644 index 0000000000..60f3604a01 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/Basic.lean @@ -0,0 +1,184 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Algebra.Membership +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Approx +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.Cutoff.OpenSet + +/-! # Basic -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal + +/-! +# Positive-part truncation and compact support in `H¹` + +* `exists_h1_max_sub_const`: the positive-part truncation `(u − c)₊` lies in + `H¹(U)` with weak gradient `1_{u>c} ∇u`, via the C¹ chain rule applied to the + one-sided approximants `GApprox c δₙ` and an `L²` limit. +* `memH10_of_compactSupport`: an `H¹` function vanishing off a compact + `K ⊆ U` lies in `H¹₀(U)`, via a smooth cutoff `≡ 1` on `K`. + +Both are stated on `IsOpenBoundedConvexDomain U`, the hypothesis the ambient +mollification tools require. +-/ + +/-- **Positive-part truncation.** For `u ∈ H¹(U)` and a level `c`, the +truncation `(u − c)₊ = max (u − c) 0` is again in `H¹(U)`, with weak gradient +`1_{u > c} ∇u` almost everywhere. + +Proof: apply the C¹ chain rule (`hasWeakGradientOn_comp_of_deriv_bounded`) to the +one-sided smooth approximants `GApprox c δₙ` (`δₙ = 1/(n+1)`), then pass to the +limit with the L²-limit closure keystone; the two convergences are dominated +(`tendsto_eLpNorm_two_of_tendsto_ae_of_dominated`) using `GApprox → (·−c)₊` and +`gStep → 𝟙_{·>c}` pointwise everywhere. -/ +theorem exists_h1_max_sub_const {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) (c : ℝ) : + ∃ v : H1Function U, + v.toFun = (fun x => max (u.toFun x - c) 0) ∧ + (∀ᵐ x ∂(volumeMeasureOn U), + v.grad x = {y | c < u.toFun y}.indicator u.grad x) := by + have : IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + set δ : ℕ → ℝ := fun n => 1 / (n + 1) with hδ_def + have hδpos : ∀ n, 0 < δ n := fun n => by positivity + have hδlim : Tendsto δ atTop (𝓝 0) := tendsto_one_div_add_atTop_nhds_zero_nat + have hgStep_abs_le : ∀ n x, |gStep c (δ n) x| ≤ 1 := fun n x => by + rw [abs_of_nonneg (gStep_nonneg c (δ n) x)]; exact gStep_le_one c (δ n) x + set f : Vec d → ℝ := fun x => max (u.toFun x - c) 0 with hf_def + set Du : Vec d → Vec d := fun x => {y | c < u.toFun y}.indicator u.grad x with hDu_def + -- Pointwise limit of the approximants at every argument. + have hb2 : Tendsto (fun n => 2 * δ n) atTop (𝓝 0) := by + have h := hδlim.const_mul (2 : ℝ); rwa [mul_zero] at h + have htend_f : ∀ x, Tendsto (fun n => GApprox c (δ n) (u.toFun x)) atTop (𝓝 (f x)) := by + intro x + rw [tendsto_iff_norm_sub_tendsto_zero] + refine squeeze_zero (fun n => norm_nonneg _) (fun n => ?_) hb2 + rw [Real.norm_eq_abs, hf_def] + exact abs_GApprox_sub_le (hδpos n) (u.toFun x) + have hDu_eq : ∀ x i, Du x i = (if c < u.toFun x then (1:ℝ) else 0) * u.grad x i := by + intro x i + by_cases h : c < u.toFun x <;> simp [hDu_def, Set.indicator_apply, h] + -- Membership of `f` and of the target gradient coordinates in `L²`. + have hf_aesm : AEStronglyMeasurable f (volumeMeasureOn U) := + (((continuous_id.sub continuous_const).max continuous_const).comp_aestronglyMeasurable + u.memL2.1) + have hf_memL2 : MemL2On U f := by + refine MemLp.of_le (u.memL2.sub (memLp_const c)) hf_aesm ?_ + filter_upwards with x + simp only [hf_def, Real.norm_eq_abs, Pi.sub_apply] + rcases le_or_gt (u.toFun x - c) 0 with h | h + · simp only [max_eq_right h, abs_zero]; positivity + · rw [max_eq_left h.le] + -- The squared-gStep sequence and the `L²` membership of the target gradient. + have hgstep_seq_aesm : ∀ (i : Fin d) n, + AEStronglyMeasurable (fun x => gStep c (δ n) (u.toFun x) * u.grad x i) (volumeMeasureOn U) := + fun i n => ((gStep_continuous c (δ n)).comp_aestronglyMeasurable u.memL2.1).mul (u.gradMemL2 i).1 + have htend_g' : ∀ (i : Fin d) x, + Tendsto (fun n => gStep c (δ n) (u.toFun x) * u.grad x i) atTop (𝓝 (Du x i)) := by + intro i x + have := (tendsto_gStep (c := c) hδpos hδlim (u.toFun x)).mul_const (u.grad x i) + rwa [← hDu_eq x i] at this + have hgi_aesm : ∀ i, AEStronglyMeasurable (fun x => Du x i) (volumeMeasureOn U) := + fun i => aestronglyMeasurable_of_tendsto_ae atTop (hgstep_seq_aesm i) + (Filter.Eventually.of_forall (htend_g' i)) + have hgi_bnd : ∀ (i : Fin d) x, |(if c < u.toFun x then (1:ℝ) else 0)| ≤ 1 := by + intro i x; split_ifs <;> simp + have hgi_memL2 : ∀ i, MemLp (fun x => Du x i) 2 (volumeMeasureOn U) := by + intro i + refine MemLp.of_le (u.gradMemL2 i) (hgi_aesm i) ?_ + filter_upwards with x + rw [hDu_eq x i] + simp only [norm_mul, Real.norm_eq_abs] + calc |if c < u.toFun x then (1:ℝ) else 0| * |u.grad x i| + ≤ 1 * |u.grad x i| := mul_le_mul_of_nonneg_right (hgi_bnd i x) (abs_nonneg _) + _ = |u.grad x i| := one_mul _ + -- Weak gradient of `f` via the chain rule and the L²-limit closure. + have hweak : HasWeakGradientOn U f Du := by + intro i + set un : ℕ → Vec d → ℝ := fun n x => GApprox c (δ n) (u.toFun x) with hun_def + set gn : ℕ → Vec d → ℝ := + fun n x => deriv (GApprox c (δ n)) (u.toFun x) * u.grad x i with hgn_def + have hun_aesm : ∀ n, AEStronglyMeasurable (un n) (volumeMeasureOn U) := fun n => + (GApprox_contDiff_one c (δ n)).continuous.comp_aestronglyMeasurable u.memL2.1 + have hgn_eq : ∀ n, gn n = fun x => gStep c (δ n) (u.toFun x) * u.grad x i := by + intro n; funext x; simp only [hgn_def, deriv_GApprox] + have hgn_aesm : ∀ n, AEStronglyMeasurable (gn n) (volumeMeasureOn U) := by + intro n; rw [hgn_eq n]; exact hgstep_seq_aesm i n + have hweak_n : ∀ n, HasWeakPartialDerivOn U i (un n) (gn n) := fun n => + (hasWeakGradientOn_comp_of_deriv_bounded hU u (GApprox_contDiff_one c (δ n)) + zero_le_one (abs_deriv_GApprox_le c (δ n))) i + have hun_memL2 : ∀ n, MemLp (un n) 2 (volumeMeasureOn U) := by + intro n + refine MemLp.of_le (u.memL2.sub (memLp_const c)) (hun_aesm n) ?_ + filter_upwards with x + rw [Real.norm_eq_abs, Real.norm_eq_abs, hun_def] + exact abs_GApprox_le c (δ n) (u.toFun x) + have hgn_bound : ∀ n, ∀ᵐ x ∂(volumeMeasureOn U), ‖gn n x‖ ≤ ‖u.grad x i‖ := by + intro n + filter_upwards with x + simp only [hgn_eq n, norm_mul, Real.norm_eq_abs] + calc |gStep c (δ n) (u.toFun x)| * |u.grad x i| + ≤ 1 * |u.grad x i| := + mul_le_mul_of_nonneg_right (hgStep_abs_le n (u.toFun x)) (abs_nonneg _) + _ = |u.grad x i| := one_mul _ + have hgn_memL2 : ∀ n, MemLp (gn n) 2 (volumeMeasureOn U) := fun n => + MemLp.of_le (u.gradMemL2 i) (hgn_aesm n) (hgn_bound n) + have hun_conv : Tendsto + (fun n => eLpNorm (fun x => un n x - f x) 2 (volumeMeasureOn U)) atTop (𝓝 0) := + tendsto_eLpNorm_two_of_tendsto_ae_of_dominated hun_aesm hf_memL2 + (u.memL2.sub (memLp_const c)).norm + (fun n => Filter.Eventually.of_forall fun x => by + rw [hun_def, Real.norm_eq_abs, Real.norm_eq_abs] + exact abs_GApprox_le c (δ n) (u.toFun x)) + (Filter.Eventually.of_forall htend_f) + have hgn_conv : Tendsto + (fun n => eLpNorm (fun x => gn n x - Du x i) 2 (volumeMeasureOn U)) atTop (𝓝 0) := + tendsto_eLpNorm_two_of_tendsto_ae_of_dominated hgn_aesm (hgi_memL2 i) + (u.gradMemL2 i).norm hgn_bound + (Filter.Eventually.of_forall fun x => by + simpa only [hgn_eq] using htend_g' i x) + exact hasWeakPartialDerivOn_of_tendsto_L2 hf_memL2 (hgi_memL2 i) hun_memL2 hgn_memL2 + hweak_n hun_conv hgn_conv + exact ⟨⟨f, Du, hf_memL2, hgi_memL2, hweak⟩, rfl, + Filter.Eventually.of_forall (fun _ => rfl)⟩ + +/-- **Compact support implies `H¹₀`.** An `H¹(U)` function that vanishes off a +compact `K ⊆ U` lies in `H¹₀(U)`. + +Proof: pick a smooth cutoff `χ ≡ 1` on `K` with `tsupport χ ⊆ U`; then `χ·u` +is in `H¹₀` by the library's cutoff-membership lemma, and `χ·u = u` since `u` vanishes +off `K`. -/ +theorem memH10_of_compactSupport {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) + {K : Set (Vec d)} (hK : IsCompact K) (hKU : K ⊆ U) + (hzero : ∀ x, x ∉ K → u.toFun x = 0) : + MemH10 U u.toFun := by + -- Smooth cutoff `χ ≡ 1` on `K`, `0 ≤ χ ≤ 1`, `tsupport χ ⊆ U`. + obtain ⟨χ, hχ_smooth, _hχ_bounds, hχ_one, hχ_tsupport⟩ := + exists_contDiff_one_on_compact_tsupport_subset hK hKU hU.isOpen + -- `tsupport χ` is closed and lies in the bounded set `U`, hence compact. + have hχ_compact : HasCompactSupport χ := + Metric.isCompact_of_isClosed_isBounded (isClosed_tsupport χ) + (hU.isBoundedDomain.isBounded.subset hχ_tsupport) + -- `χ · u` is in `H¹₀(U)` by the library's cutoff-membership lemma. + have hmem : MemH10 U (fun x => χ x * u.toFun x) := + memH10_mul_of_contDiff_hasCompactSupport hU hχ_smooth hχ_compact hχ_tsupport ⟨u, rfl⟩ + -- But `χ · u = u` pointwise: `χ = 1` on `K`, and `u = 0` off `K`. + have heq : (fun x => χ x * u.toFun x) = u.toFun := by + funext x + by_cases hx : x ∈ K + · rw [show χ x = 1 from by simpa using hχ_one hx, one_mul] + · rw [hzero x hx, mul_zero] + rwa [heq] at hmem + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/ChainRule.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/ChainRule.lean new file mode 100644 index 0000000000..672a8c7abb --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/ChainRule.lean @@ -0,0 +1,88 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.L2Ambient +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.Analysis.Calculus.MeanValue + +/-! # Chain Rule -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory + +/-! +# C¹ chain-rule building blocks for `H¹` + +Reusable sub-lemmas for the mollification chain rule: the pointwise `fderiv` +chain-rule identity in coordinate form, the `L²` bound on a Lipschitz +composition, and Lipschitz continuity from a derivative bound. These are the +pieces the chain-rule argument threads together with the `L²` convergence of +`convexApproxSmoothing`. +-/ + +/-- Lipschitz continuity of a real function from a bound on its derivative. -/ +theorem lipschitzWith_of_abs_deriv_le {G : ℝ → ℝ} {M : ℝ} (hM : 0 ≤ M) + (hG : Differentiable ℝ G) (hderiv : ∀ t, |deriv G t| ≤ M) : + LipschitzWith M.toNNReal G := by + apply lipschitzWith_of_nnnorm_deriv_le hG + intro t + rw [← NNReal.coe_le_coe, coe_nnnorm, Real.coe_toNNReal M hM, Real.norm_eq_abs] + exact hderiv t + +/-- Coordinate form of the chain rule: the `i`-th partial of `G ∘ w` is +`G'(w)·∂ᵢw`. -/ +theorem fderiv_comp_basisVec {d : ℕ} {G : ℝ → ℝ} {w : Vec d → ℝ} {x : Vec d} + {i : Fin d} (hG : DifferentiableAt ℝ G (w x)) (hw : DifferentiableAt ℝ w x) : + (fderiv ℝ (fun y => G (w y)) x) (basisVec i) + = deriv G (w x) * (fderiv ℝ w x) (basisVec i) := by + have hcomp : HasFDerivAt (fun y => G (w y)) + ((fderiv ℝ G (w x)).comp (fderiv ℝ w x)) x := + (hG.hasFDerivAt).comp x hw.hasFDerivAt + rw [hcomp.fderiv] + simp [ContinuousLinearMap.comp_apply, mul_comm] + +/-- The unconditional integral `L²` bound for a Lipschitz composition: `‖G∘f − G∘g‖_{L²} ≤ M‖f − g‖_{L²}`. -/ +theorem eLpNormPrime_comp_sub_le_of_lipschitz {d : ℕ} {U : Set (Vec d)} {G : ℝ → ℝ} + {M : ℝ} (hM : 0 ≤ M) (hLip : LipschitzWith M.toNNReal G) (f g : Vec d → ℝ) : + eLpNorm' (fun x => G (f x) - G (g x)) 2 (volumeMeasureOn U) + ≤ ENNReal.ofReal M * eLpNorm' (fun x => f x - g x) 2 (volumeMeasureOn U) := by + have hpt : ∀ x, ‖G (f x) - G (g x)‖ ≤ ‖M • (f x - g x)‖ := by + intro x + have hd := hLip.dist_le_mul (f x) (g x) + rw [norm_smul] + simp only [Real.norm_eq_abs, abs_of_nonneg hM] + simpa [Real.dist_eq, Real.coe_toNNReal M hM] using hd + calc eLpNorm' (fun x => G (f x) - G (g x)) 2 (volumeMeasureOn U) + ≤ eLpNorm' (fun x => M • (f x - g x)) 2 (volumeMeasureOn U) := + eLpNorm'_mono_ae (by norm_num) (Filter.Eventually.of_forall hpt) + _ = ENNReal.ofReal M * eLpNorm' (fun x => f x - g x) 2 (volumeMeasureOn U) := by + rw [show (fun x => M • (f x - g x)) = (M • fun x => f x - g x) from rfl, + eLpNorm'_const_smul M (by norm_num)] + simp [Real.enorm_eq_ofReal hM] + +/-- The same Lipschitz bound in Mathlib's measurable `L²` convention. -/ +theorem eLpNorm_comp_sub_le_of_lipschitz {d : ℕ} {U : Set (Vec d)} {G : ℝ → ℝ} + {M : ℝ} (hM : 0 ≤ M) (hLip : LipschitzWith M.toNNReal G) (f g : Vec d → ℝ) + (hf : AEStronglyMeasurable f (volumeMeasureOn U)) + (hg : AEStronglyMeasurable g (volumeMeasureOn U)) : + eLpNorm (fun x => G (f x) - G (g x)) 2 (volumeMeasureOn U) + ≤ ENNReal.ofReal M * eLpNorm (fun x => f x - g x) 2 (volumeMeasureOn U) := by + have hcomp : AEStronglyMeasurable (fun x => G (f x) - G (g x)) (volumeMeasureOn U) := + (hLip.continuous.comp_aestronglyMeasurable hf).sub + (hLip.continuous.comp_aestronglyMeasurable hg) + have hsub : AEStronglyMeasurable (fun x => f x - g x) (volumeMeasureOn U) := hf.sub hg + rw [eLpNorm_eq_eLpNorm' (by norm_num) (by norm_num) hcomp, + eLpNorm_eq_eLpNorm' (by norm_num) (by norm_num) hsub] + simpa only [ENNReal.toReal_ofNat] using + eLpNormPrime_comp_sub_le_of_lipschitz hM hLip f g + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/H10Limit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/H10Limit.lean new file mode 100644 index 0000000000..420d3729f1 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/H10Limit.lean @@ -0,0 +1,165 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic + +/-! # H10Limit -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal + +/-! +# `H¹₀` is closed under `H¹` limits + +`memH10_of_tendsto_H1`: if `f : H¹(U)` is the `L²` limit (function and every +gradient coordinate) of a sequence `Fₙ` of `H¹(U)` functions each lying in +`H¹₀(U)`, then `f ∈ H¹₀(U)`. + +Each `MemH10 U Fₙ` supplies an `H¹₀` witness `Wₙ` bundling smooth compactly +supported approximants `Wₙ.approx k` (support `⊆ U`) converging in `L²` to +`Wₙ.toFun = Fₙ.toFun` and to `Wₙ.grad`. A diagonal choice picks `kₙ` with all +`d+1` distances below `1/(n+1)`; the resulting `ψₙ := Wₙ.approx kₙ` is smooth, +compactly supported in `U`, and converges to `f` and `∇f`. Weak-gradient +uniqueness bridges `Wₙ.grad` and `Fₙ.grad`, which agree a.e. +-/ + +/-- Commuting `eLpNorm` of a pointwise difference of two functions. -/ +theorem eLpNorm_sub_swap {d : ℕ} {μ : Measure (Vec d)} (a b : Vec d → ℝ) {p : ℝ≥0∞} : + eLpNorm (fun x => a x - b x) p μ = eLpNorm (fun x => b x - a x) p μ := by + rw [show (fun x => a x - b x) = -(fun x => b x - a x) from by + funext x; simp only [Pi.neg_apply]; ring, eLpNorm_neg] + +/-- **`H¹₀(U)` closed under `L²` limits.** It is closed under `L²` limits of the function together +with all its gradient coordinates. -/ +theorem memH10_of_tendsto_H1 {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (f : H1Function U) (F : ℕ → H1Function U) + (hmem : ∀ n, MemH10 U (F n).toFun) + (hfun : Tendsto + (fun n => eLpNorm (fun x => f.toFun x - (F n).toFun x) 2 (volumeMeasureOn U)) + atTop (nhds 0)) + (hgrad : ∀ i : Fin d, Tendsto + (fun n => eLpNorm (fun x => f.grad x i - (F n).grad x i) 2 (volumeMeasureOn U)) + atTop (nhds 0)) : + MemH10 U f.toFun := by + classical + set μU : Measure (Vec d) := volumeMeasureOn U with hμU + -- H¹₀ witnesses of the `Fₙ`. + choose W hW using hmem + -- Local integrability of gradient coordinates, for weak-gradient uniqueness. + have hloc : ∀ (z : H1Function U) (i : Fin d), + LocallyIntegrableOn (fun x => z.grad x i) U volume := fun z i => + locallyIntegrableOn_of_locallyIntegrable_restrict + ((z.gradMemL2 i).locallyIntegrable (by norm_num)) + -- `Wₙ.grad =ᵐ Fₙ.grad` (same function ⟹ same weak gradient a.e.). + have hbridge : ∀ n (i : Fin d), + (fun x => (W n).toH1Function.grad x i) =ᵐ[μU] (fun x => (F n).grad x i) := by + intro n i + have hw := (W n).toH1Function.hasWeakGradient i + rw [hW n] at hw + exact HasWeakPartialDerivOn.ae_eq hU.isOpen (hloc _ i) (hloc _ i) hw + ((F n).hasWeakGradient i) + -- Diagonal tolerance. + set ε : ℕ → ℝ≥0∞ := fun n => (↑(n + 1))⁻¹ with hε + have hε_pos : ∀ n, 0 < ε n := by + intro n + simp only [hε] + exact ENNReal.inv_pos.mpr (ENNReal.natCast_ne_top (n + 1)) + have hε_tendsto : Tendsto ε atTop (nhds 0) := + (ENNReal.tendsto_inv_nat_nhds_zero).comp (tendsto_add_atTop_nat 1) + -- Diagonal existence. + have hex : ∀ n, ∃ k, + eLpNorm (fun x => (W n).approx k x - (W n).toH1Function.toFun x) 2 μU < ε n ∧ + ∀ i : Fin d, + eLpNorm (fun x => (fderiv ℝ ((W n).approx k) x) (basisVec i) - + (W n).toH1Function.grad x i) 2 μU < ε n := by + intro n + have e1 : ∀ᶠ k in atTop, + eLpNorm (fun x => (W n).approx k x - (W n).toH1Function.toFun x) 2 μU < ε n := + (W n).tendsto_approx.eventually_lt_const (hε_pos n) + have e2 : ∀ i : Fin d, ∀ᶠ k in atTop, + eLpNorm (fun x => (fderiv ℝ ((W n).approx k) x) (basisVec i) - + (W n).toH1Function.grad x i) 2 μU < ε n := + fun i => ((W n).tendsto_approx_grad i).eventually_lt_const (hε_pos n) + have e2' : ∀ᶠ k in atTop, ∀ i : Fin d, + eLpNorm (fun x => (fderiv ℝ ((W n).approx k) x) (basisVec i) - + (W n).toH1Function.grad x i) 2 μU < ε n := + Filter.eventually_all.2 e2 + exact (e1.and e2').exists + choose k hk using hex + set ψ : ℕ → Vec d → ℝ := fun n => (W n).approx (k n) with hψ + -- Function-side upper bound sequence tends to 0. + have htf : Tendsto + (fun n => eLpNorm (fun x => (W n).toH1Function.toFun x - f.toFun x) 2 μU) + atTop (nhds 0) := by + refine hfun.congr (fun n => ?_) + rw [eLpNorm_sub_swap ((W n).toH1Function.toFun) (f.toFun), hW n] + have hfun_bound : Tendsto (fun n => ε n + + eLpNorm (fun x => (W n).toH1Function.toFun x - f.toFun x) 2 μU) atTop (nhds 0) := by + simpa using hε_tendsto.add htf + -- Gradient-side upper bound sequences tend to 0. + have hgi : ∀ i : Fin d, Tendsto + (fun n => eLpNorm (fun x => (W n).toH1Function.grad x i - f.grad x i) 2 μU) + atTop (nhds 0) := by + intro i + refine (hgrad i).congr (fun n => ?_) + rw [eLpNorm_sub_swap (fun x => (W n).toH1Function.grad x i) (fun x => f.grad x i)] + exact eLpNorm_congr_ae (by filter_upwards [hbridge n i] with x hx; rw [hx]) + have hgrad_bound : ∀ i : Fin d, Tendsto (fun n => ε n + + eLpNorm (fun x => (W n).toH1Function.grad x i - f.grad x i) 2 μU) atTop (nhds 0) := by + intro i + simpa using hε_tendsto.add (hgi i) + -- Package the target as an `H¹₀` function with the diagonal approximants. + refine ⟨{ toH1Function := f + approx := ψ + approx_smooth := fun n => (W n).approx_smooth (k n) + approx_hasCompactSupport := fun n => (W n).approx_hasCompactSupport (k n) + approx_support_subset := fun n => (W n).approx_support_subset (k n) + tendsto_approx := ?_ + tendsto_approx_grad := ?_ }, rfl⟩ + · -- `ψₙ → f` in `L²`. + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hfun_bound + (fun n => zero_le) (fun n => ?_) + have hsm_ψ : AEStronglyMeasurable (ψ n) μU := + ((W n).approx_smooth (k n)).continuous.aestronglyMeasurable + have hsm_Wtf : AEStronglyMeasurable (W n).toH1Function.toFun μU := + (W n).toH1Function.memL2.1 + have heq : + (fun x => ψ n x - f.toFun x) = + (fun x => ψ n x - (W n).toH1Function.toFun x) + + (fun x => (W n).toH1Function.toFun x - f.toFun x) := by + funext x; simp only [Pi.add_apply]; ring + rw [heq] + refine (eLpNorm_add_le (hsm_ψ.sub hsm_Wtf) (hsm_Wtf.sub f.memL2.1) (by norm_num)).trans ?_ + exact add_le_add (le_of_lt (hk n).1) le_rfl + · -- `∇ψₙ → ∇f` in `L²`, coordinatewise. + intro i + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds (hgrad_bound i) + (fun n => zero_le) (fun n => ?_) + have hsm_dψ : AEStronglyMeasurable + (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) μU := by + have : ContDiff ℝ (⊤ : ℕ∞) (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) := + (((W n).approx_smooth (k n)).fderiv_right (m := (⊤ : ℕ∞)) (by norm_cast)).clm_apply + contDiff_const + exact this.continuous.aestronglyMeasurable + have hsm_Wg : AEStronglyMeasurable (fun x => (W n).toH1Function.grad x i) μU := + (W n).toH1Function.gradMemL2 i |>.1 + have heq : + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - f.grad x i) = + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - (W n).toH1Function.grad x i) + + (fun x => (W n).toH1Function.grad x i - f.grad x i) := by + funext x; simp only [Pi.add_apply]; ring + rw [heq] + refine (eLpNorm_add_le (hsm_dψ.sub hsm_Wg) (hsm_Wg.sub (f.gradMemL2 i).1) + (by norm_num)).trans ?_ + exact add_le_add (le_of_lt ((hk n).2 i)) le_rfl + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/LevelSets.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/LevelSets.lean new file mode 100644 index 0000000000..643b63fb6a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/LevelSets.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.Basic + +/-! # Level Sets -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology + +/-! +# Vanishing of the gradient on level sets + +`grad_ae_zero_on_level_set`, derived from the positive-part truncation applied +to `u` at `c` and to `−u` at `−c`. Stated on `IsOpenBoundedConvexDomain U`. +-/ + +/-- **Vanishing of the gradient on level sets.** For `u ∈ H¹(U)` the weak gradient vanishes almost +everywhere on the level set `{u = c}`. + +Proof: `(u−c)₊ − (c−u)₊ = u − c`, so the difference `v₁ − v₂` of the two D1 +truncations has the same weak gradient as `u` (constant shift is `H¹`-trivial), +while pointwise on `{u = c}` both truncation gradients vanish. -/ +theorem grad_ae_zero_on_level_set {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H1Function U) (c : ℝ) : + ∀ᵐ x ∂(volumeMeasureOn U), u.toFun x = c → u.grad x = 0 := by + have : IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + obtain ⟨v₁, hv₁f, hv₁g⟩ := exists_h1_max_sub_const hU u c + obtain ⟨v₂, hv₂f, hv₂g⟩ := exists_h1_max_sub_const hU (-u) (-c) + -- Constant `c` as an `H¹` function (weak gradient zero). + have hcweak : HasWeakGradientOn U (fun _ : Vec d => c) (fun _ _ => 0) := by + have h := HasWeakGradientOn.of_contDiff (U := U) + (contDiff_const : ContDiff ℝ 1 (fun _ : Vec d => c)) + have heq : (fun (x : Vec d) (i : Fin d) => (fderiv ℝ (fun _ : Vec d => c) x) (basisVec i)) + = (fun _ _ => (0 : ℝ)) := by funext x i; simp + rwa [heq] at h + let cH : H1Function U := + { toFun := fun _ => c, grad := fun _ _ => 0 + memL2 := memLp_const c + gradMemL2 := fun _ => by exact memLp_const (0 : ℝ) + hasWeakGradient := hcweak } + set v : H1Function U := v₁ - v₂ with hv_def + set w : H1Function U := u - cH with hw_def + -- `v` and `w` have the same value function `u − c`. + have htoFun_eq : v.toFun = w.toFun := by + funext x + have hA : max ((-u).toFun x - -c) 0 = max (c - u.toFun x) 0 := by + have hAeq : (-u).toFun x - -c = c - u.toFun x := by + simp only [H1Function.neg_toFun]; ring + rw [hAeq] + have h1 : v.toFun x = max (u.toFun x - c) 0 - max (c - u.toFun x) 0 := by + simp only [hv_def, H1Function.sub_toFun, hv₁f, hv₂f] + rw [hA] + have h2 : w.toFun x = u.toFun x - c := by + simp only [hw_def, H1Function.sub_toFun, cH] + rw [h1, h2] + rcases le_total (u.toFun x - c) 0 with h | h + · rw [max_eq_right h, max_eq_left (by linarith)]; ring + · rw [max_eq_left h, max_eq_right (by linarith)]; ring + -- Same value ⟹ same weak gradient a.e. + have hgrad_ae : ∀ᵐ x ∂(volumeMeasureOn U), v.grad x = w.grad x := by + have hloc : ∀ (z : H1Function U) (i : Fin d), + LocallyIntegrableOn (fun x => z.grad x i) U volume := fun z i => + locallyIntegrableOn_of_locallyIntegrable_restrict + ((z.gradMemL2 i).locallyIntegrable (by norm_num)) + have hcoord : ∀ i : Fin d, + (fun x => v.grad x i) =ᵐ[volumeMeasureOn U] (fun x => w.grad x i) := by + intro i + refine HasWeakPartialDerivOn.ae_eq hU.isOpen (hloc v i) (hloc w i) + (v.hasWeakGradient i) ?_ + have := w.hasWeakGradient i + rwa [← htoFun_eq] at this + have hall : ∀ᵐ x ∂(volumeMeasureOn U), ∀ i, v.grad x i = w.grad x i := + ae_all_iff.mpr hcoord + filter_upwards [hall] with x hx + funext i; exact hx i + -- `w.grad = u.grad`. + have hw_grad : ∀ x, w.grad x = u.grad x := by + intro x; funext i + simp only [hw_def, H1Function.sub_grad, cH, Pi.sub_apply, sub_zero] + -- Assemble. + filter_upwards [hgrad_ae, hv₁g, hv₂g] with x hgx h1x h2x hc + have hvgrad : v.grad x = v₁.grad x - v₂.grad x := by + funext i; simp only [hv_def, H1Function.sub_grad] + have hv1 : v₁.grad x = 0 := by + rw [h1x]; simp [hc] + have hv2 : v₂.grad x = 0 := by + rw [h2x] + refine Set.indicator_of_notMem ?_ _ + simp only [Set.mem_ofPred_eq, H1Function.neg_toFun, not_lt, hc, le_refl] + have : u.grad x = 0 := by + rw [← hw_grad x, ← hgx, hvgrad, hv1, hv2, sub_zero] + exact this + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/MatchedTrace.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/MatchedTrace.lean new file mode 100644 index 0000000000..ee831307cd --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/MatchedTrace.lean @@ -0,0 +1,282 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.H10Limit +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Truncation.LevelSets + +/-! # Matched Trace -/ + +@[expose] public section + +namespace Homogenization + +open Homogenization MeasureTheory Filter Topology +open scoped ENNReal + +/-! +# Matched-trace truncation + +`memH10_max_sub_matched`: if `w₁ − w₂ ∈ H¹₀(U)` then the truncated difference +`(w₁ − c)₊ − (w₂ − c)₊` is again in `H¹₀(U)`. + +With `h := w₁ − w₂` and its smooth compactly supported `H¹₀` approximants +`φ_n := W.approx n`, set `Ψ_n := (w₂ + φ_n − c)₊ − (w₂ − c)₊`. Each `Ψ_n` is +`H¹` and vanishes off `tsupport φ_n` (compact `⊆ U`), hence lies in `H¹₀`. The +target `T := (w₁ − c)₊ − (w₂ − c)₊` is `H¹`; along an a.e.-convergent +subsequence of `φ_n → h`, both `Ψ_n → T` and `∇Ψ_n → ∇T` in `L²` (the level-set +term vanishes), so the `H¹₀`-limit lemma concludes. +-/ + +private theorem tendsto_eLpNorm_matchedPositiveParts {d : ℕ} + (μ : Measure (Vec d)) (a b : Vec d → ℝ) (f : ℕ → Vec d → ℝ) (c : ℝ) + (hconv : Tendsto (fun n => eLpNorm (fun x => f n x - (a x - b x)) 2 μ) + atTop (nhds 0)) : + Tendsto (fun n => eLpNorm (fun x => + (max (a x - c) 0 - max (b x - c) 0) - + (max ((b x + f n x) - c) 0 - max (b x - c) 0)) 2 μ) atTop (nhds 0) := by + have hlip : ∀ A B : ℝ, |max A 0 - max B 0| ≤ |A - B| := by + intro A B + calc |max A 0 - max B 0| ≤ max |A - B| |(0 : ℝ) - 0| := + abs_max_sub_max_le_max A 0 B 0 + _ = |A - B| := by + rw [sub_self, abs_zero] + exact max_eq_left (abs_nonneg _) + have hub : Tendsto (fun n => eLpNorm (fun x => (a x - b x) - f n x) 2 μ) + atTop (nhds 0) := by + have hswap : ∀ n, + eLpNorm (fun x => (a x - b x) - f n x) 2 μ = + eLpNorm (fun x => f n x - (a x - b x)) 2 μ := + fun n => eLpNorm_sub_swap _ _ + simp_rw [hswap] + exact hconv + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hub + (fun n => zero_le) (fun n => ?_) + refine eLpNorm_mono (fun x => ?_) + rw [Real.norm_eq_abs, Real.norm_eq_abs, + show max (a x - c) 0 - max (b x - c) 0 - + (max ((b x + f n x) - c) 0 - max (b x - c) 0) = + max (a x - c) 0 - max ((b x + f n x) - c) 0 from by ring] + refine (hlip _ _).trans (le_of_eq ?_) + congr 1 + ring + +/-- **Matched-trace truncation.** If `w₁ − w₂ ∈ H¹₀(U)` then the truncated +difference `(w₁ − c)₊ − (w₂ − c)₊` is again in `H¹₀(U)`. -/ +theorem memH10_max_sub_matched {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (w₁ w₂ : H1Function U) + (hmatch : MemH10 U (fun x => w₁.toFun x - w₂.toFun x)) (c : ℝ) : + MemH10 U (fun x => max (w₁.toFun x - c) 0 - max (w₂.toFun x - c) 0) := by + classical + have : IsFiniteMeasure (volumeMeasureOn U) := + hU.isBoundedDomain.isFiniteMeasure_restrict_volume + -- `h := w₁ − w₂` and its `H¹₀` witness `W`. + set h : H1Function U := w₁ - w₂ with hh_def + obtain ⟨W, hWtf⟩ := hmatch + have hWh : W.toH1Function.toFun = h.toFun := by + rw [hWtf, hh_def, H1Function.sub_toFun] + have hφC1 : ∀ n, ContDiff ℝ 1 (W.approx n) := fun n => (W.approx_smooth n).of_le (by norm_num) + set Φ : ℕ → H1Function U := + fun n => H1Function.ofContDiffOnIsOpenBoundedConvexDomain hU (hφC1 n) with hΦ_def + set S : ℕ → H1Function U := fun n => w₂ + Φ n with hS_def + -- D1 truncations of `w₂`, `w₁`, and each `w₂ + φ_n`. + obtain ⟨V2, hV2f, hV2g⟩ := exists_h1_max_sub_const hU w₂ c + obtain ⟨V1', hV1'f, hV1'g⟩ := exists_h1_max_sub_const hU w₁ c + have hD1 : ∀ n, ∃ v : H1Function U, + v.toFun = (fun x => max ((S n).toFun x - c) 0) ∧ + (∀ᵐ x ∂(volumeMeasureOn U), + v.grad x = {y | c < (S n).toFun y}.indicator (S n).grad x) := + fun n => exists_h1_max_sub_const hU (S n) c + choose V1 hV1f hV1g using hD1 + -- Target `H¹` function `T := (w₁−c)₊ − (w₂−c)₊`. + set T : H1Function U := V1' - V2 with hT_def + have hTtf : T.toFun = fun x => max (w₁.toFun x - c) 0 - max (w₂.toFun x - c) 0 := by + funext x + rw [hT_def, H1Function.sub_toFun] + show V1'.toFun x - V2.toFun x = _ + rw [congrFun hV1'f x, congrFun hV2f x] + rw [show (fun x => max (w₁.toFun x - c) 0 - max (w₂.toFun x - c) 0) = T.toFun from hTtf.symm] + -- Weak-gradient uniqueness bridge `W.grad =ᵐ h.grad`. + have hloc : ∀ (z : H1Function U) (i : Fin d), + LocallyIntegrableOn (fun x => z.grad x i) U volume := fun z i => + locallyIntegrableOn_of_locallyIntegrable_restrict + ((z.gradMemL2 i).locallyIntegrable (by norm_num)) + have hWgrad : ∀ i : Fin d, + (fun x => W.toH1Function.grad x i) =ᵐ[volumeMeasureOn U] (fun x => h.grad x i) := by + intro i + have hw := W.toH1Function.hasWeakGradient i + rw [hWh] at hw + exact HasWeakPartialDerivOn.ae_eq hU.isOpen (hloc _ i) (hloc _ i) hw (h.hasWeakGradient i) + -- Level-set vanishing of `∇w₁`. + have hD2 : ∀ᵐ x ∂(volumeMeasureOn U), w₁.toFun x = c → w₁.grad x = 0 := + grad_ae_zero_on_level_set hU w₁ c + -- Measurability of Heaviside factors. + have hind_aesm : ∀ (g : Vec d → ℝ), AEStronglyMeasurable g (volumeMeasureOn U) → + AEStronglyMeasurable (fun x => if c < g x then (1:ℝ) else 0) (volumeMeasureOn U) := by + intro g hg + have hk : Measurable (fun t : ℝ => if c < t then (1:ℝ) else 0) := + Measurable.ite (measurableSet_lt measurable_const measurable_id) measurable_const + measurable_const + exact (hk.comp_aemeasurable hg.aemeasurable).aestronglyMeasurable + -- Each `Ψ_n = V1 n − V2` lies in `H¹₀`. + have hΨmem : ∀ n, MemH10 U (V1 n - V2).toFun := by + intro n + refine memH10_of_compactSupport hU (V1 n - V2) (K := tsupport (W.approx n)) + (W.approx_hasCompactSupport n) (W.approx_support_subset n) ?_ + intro x hx + have hφ0 : W.approx n x = 0 := image_eq_zero_of_notMem_tsupport hx + have hSx : (S n).toFun x = w₂.toFun x := by + show w₂.toFun x + (Φ n).toFun x = w₂.toFun x + rw [show (Φ n).toFun x = W.approx n x from rfl, hφ0, add_zero] + have e1 : (V1 n).toFun x = max ((S n).toFun x - c) 0 := congrFun (hV1f n) x + have e2 : V2.toFun x = max (w₂.toFun x - c) 0 := congrFun hV2f x + show (V1 n - V2).toFun x = 0 + rw [H1Function.sub_toFun] + show (V1 n).toFun x - V2.toFun x = 0 + rw [e1, e2, hSx]; ring + -- L² convergence of `φ_n → h` (function side). + have hWconv : Tendsto + (fun n => eLpNorm (fun x => W.approx n x - h.toFun x) 2 (volumeMeasureOn U)) + atTop (nhds 0) := by + refine W.tendsto_approx.congr (fun n => ?_) + rw [hWh] + -- a.e.-convergent subsequence. + obtain ⟨σ, hσ_mono, hσ_ae⟩ := + (tendstoInMeasure_of_tendsto_eLpNorm (by norm_num) + (fun n => (W.approx_smooth n).continuous.aestronglyMeasurable) h.memL2.1 + hWconv).exists_seq_tendsto_ae + -- Assemble via the `H¹₀`-limit lemma. + refine memH10_of_tendsto_H1 hU T (fun n => V1 (σ n) - V2) (fun n => hΨmem (σ n)) ?_ ?_ + · -- Function convergence follows from the scalar truncation contraction. + have hconv : Tendsto (fun n => eLpNorm + (fun x => W.approx (σ n) x - (w₁.toFun x - w₂.toFun x)) + 2 (volumeMeasureOn U)) atTop (nhds 0) := by + simpa only [hh_def, H1Function.sub_toFun] using + hWconv.comp hσ_mono.tendsto_atTop + simpa only [hTtf, H1Function.sub_toFun, hV1f, hV2f] using + tendsto_eLpNorm_matchedPositiveParts (volumeMeasureOn U) + w₁.toFun w₂.toFun (fun n => W.approx (σ n)) c hconv + · -- Gradient convergence (coordinatewise). + intro i + have haesm_ind' : + AEStronglyMeasurable (fun x => if c < w₁.toFun x then (1:ℝ) else 0) (volumeMeasureOn U) := + hind_aesm w₁.toFun w₁.memL2.1 + have haesm_indn : ∀ n, + AEStronglyMeasurable (fun x => if c < (S n).toFun x then (1:ℝ) else 0) + (volumeMeasureOn U) := + fun n => hind_aesm (S n).toFun (S n).memL2.1 + set TA : ℕ → Vec d → ℝ := + fun n x => (if c < (S n).toFun x then (1:ℝ) else 0) * (h.grad x i - (Φ n).grad x i) + with hTA_def + set TB : ℕ → Vec d → ℝ := + fun n x => ((if c < w₁.toFun x then (1:ℝ) else 0) + - (if c < (S n).toFun x then (1:ℝ) else 0)) * w₁.grad x i with hTB_def + have indic : ∀ (Sset : Set (Vec d)) (g : Vec d → Vec d) (x : Vec d), + (Sset.indicator g x) i = if x ∈ Sset then g x i else 0 := by + intro Sset g x + by_cases hxs : x ∈ Sset + · rw [Set.indicator_of_mem hxs, if_pos hxs] + · rw [Set.indicator_of_notMem hxs, if_neg hxs]; rfl + -- The actual gradient difference equals `TA + TB` a.e. + have hkey : ∀ n, (fun x => V1'.grad x i - (V1 n).grad x i) + =ᵐ[volumeMeasureOn U] (fun x => TA n x + TB n x) := by + intro n + filter_upwards [hV1'g, hV1g n] with x hx' hxn + have e' : V1'.grad x i = if c < w₁.toFun x then w₁.grad x i else 0 := by + rw [hx', indic]; simp only [Set.mem_ofPred_eq] + have en : (V1 n).grad x i = if c < (S n).toFun x then (S n).grad x i else 0 := by + rw [hxn, indic]; simp only [Set.mem_ofPred_eq] + have eSg : (S n).grad x i = w₂.grad x i + (Φ n).grad x i := rfl + have hw1g : w₁.grad x i = w₂.grad x i + h.grad x i := by + have hsg : h.grad x i = w₁.grad x i - w₂.grad x i := + congrFun (congrFun (H1Function.sub_grad w₁ w₂) x) i + linarith [hsg] + rw [e', en, eSg] + simp only [hTA_def, hTB_def] + rw [hw1g] + split_ifs <;> ring + have haesm_TA : ∀ n, AEStronglyMeasurable (TA n) (volumeMeasureOn U) := by + intro n + exact (haesm_indn n).mul ((h.gradMemL2 i).1.sub ((Φ n).gradMemL2 i).1) + have haesm_TB : ∀ n, AEStronglyMeasurable (TB n) (volumeMeasureOn U) := by + intro n + exact (haesm_ind'.sub (haesm_indn n)).mul (w₁.gradMemL2 i).1 + -- `‖TA_n‖ ≤ ‖∇φ_n − ∇h‖` → 0 in L². + have hEconv : Tendsto + (fun n => eLpNorm (fun x => h.grad x i - (Φ n).grad x i) 2 (volumeMeasureOn U)) + atTop (nhds 0) := by + have heq : ∀ n, + eLpNorm (fun x => h.grad x i - (Φ n).grad x i) 2 (volumeMeasureOn U) + = eLpNorm (fun x => (Φ n).grad x i - W.toH1Function.grad x i) 2 + (volumeMeasureOn U) := by + intro n + rw [eLpNorm_sub_swap (fun x => h.grad x i) (fun x => (Φ n).grad x i)] + exact eLpNorm_congr_ae (by filter_upwards [hWgrad i] with x hx; rw [hx]) + simp_rw [heq] + exact W.tendsto_approx_grad i + have hTA_conv : Tendsto (fun n => eLpNorm (TA n) 2 (volumeMeasureOn U)) atTop (nhds 0) := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hEconv + (fun n => zero_le) (fun n => ?_) + refine eLpNorm_mono (fun x => ?_) + simp only [hTA_def] + rw [norm_mul] + refine mul_le_of_le_one_left (norm_nonneg _) ?_ + rw [Real.norm_eq_abs] + by_cases hc : c < (S n).toFun x <;> simp [hc] + -- `‖TB_{σn}‖ → 0` in L² by dominated convergence. + have hTB_conv : Tendsto + (fun n => eLpNorm (fun x => TB (σ n) x) 2 (volumeMeasureOn U)) atTop (nhds 0) := by + have hdom : MemLp (fun x => ‖w₁.grad x i‖) 2 (volumeMeasureOn U) := (w₁.gradMemL2 i).norm + have hbnd : ∀ n, ∀ᵐ x ∂(volumeMeasureOn U), ‖TB (σ n) x‖ ≤ ‖w₁.grad x i‖ := by + intro n + filter_upwards with x + simp only [hTB_def] + rw [norm_mul] + refine mul_le_of_le_one_left (norm_nonneg _) ?_ + rw [Real.norm_eq_abs] + by_cases hA : c < w₁.toFun x <;> by_cases hB : c < (S (σ n)).toFun x <;> simp [hA, hB] + have hae : ∀ᵐ x ∂(volumeMeasureOn U), Tendsto (fun n => TB (σ n) x) atTop (nhds 0) := by + filter_upwards [hσ_ae, hD2] with x hxconv hxD2 + have hSconv : Tendsto (fun n => w₂.toFun x + W.approx (σ n) x) atTop + (nhds (w₁.toFun x)) := by + have hcur := (tendsto_const_nhds (x := w₂.toFun x)).add hxconv + rwa [show w₂.toFun x + h.toFun x = w₁.toFun x from by + rw [show h.toFun x = w₁.toFun x - w₂.toFun x from + congrFun (H1Function.sub_toFun w₁ w₂) x]; ring] at hcur + rcases lt_trichotomy c (w₁.toFun x) with hlt | heqc | hgt + · have hev : ∀ᶠ n in atTop, c < (S (σ n)).toFun x := by + filter_upwards [hSconv.eventually_const_lt hlt] with n hn using hn + refine Tendsto.congr' ?_ tendsto_const_nhds + filter_upwards [hev] with n hn + simp only [hTB_def]; rw [if_pos hlt, if_pos hn]; ring + · have hg0 : w₁.grad x i = 0 := by simp [hxD2 heqc.symm] + refine Tendsto.congr' ?_ tendsto_const_nhds + filter_upwards with n + simp only [hTB_def, hg0, mul_zero] + · have hev : ∀ᶠ n in atTop, ¬ c < (S (σ n)).toFun x := by + filter_upwards [hSconv.eventually_lt_const hgt] with n hn using not_lt.mpr hn.le + refine Tendsto.congr' ?_ tendsto_const_nhds + filter_upwards [hev] with n hn + simp only [hTB_def]; rw [if_neg (not_lt.mpr hgt.le), if_neg hn]; ring + have hmain := tendsto_eLpNorm_two_of_tendsto_ae_of_dominated + (fun n => haesm_TB (σ n)) (memLp_const (0:ℝ)) hdom hbnd hae + simpa using hmain + -- Combine. + have hsum : Tendsto (fun n => eLpNorm (TA (σ n)) 2 (volumeMeasureOn U) + + eLpNorm (fun x => TB (σ n) x) 2 (volumeMeasureOn U)) atTop (nhds 0) := by + simpa using (hTA_conv.comp hσ_mono.tendsto_atTop).add hTB_conv + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hsum + (fun n => zero_le) (fun n => ?_) + have hVcancel : (fun x => T.grad x i - (V1 (σ n) - V2).grad x i) + = (fun x => V1'.grad x i - (V1 (σ n)).grad x i) := by + funext x + simp only [hT_def, H1Function.sub_grad, Pi.sub_apply] + ring + rw [hVcancel, eLpNorm_congr_ae (hkey (σ n))] + exact eLpNorm_add_le (haesm_TA (σ n)) (haesm_TB (σ n)) (by norm_num) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/WeakGradientLimit.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/WeakGradientLimit.lean new file mode 100644 index 0000000000..57197d5be6 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/Truncation/WeakGradientLimit.lean @@ -0,0 +1,344 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.SmoothLimit +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import Mathlib.MeasureTheory.Integral.Lebesgue.DominatedConvergence +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.MeasureTheory.Function.LpSeminorm.CompareExp +public import Mathlib.MeasureTheory.Integral.Bochner.Basic + +/-! # Weak Gradient Limit -/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal NNReal + +/-! +# Weak partial derivatives are closed under `L²` limits + +If `uₙ → u` and `gₙ → gᵢ` in `L²(U)` and each `uₙ` has weak `i`-partial +derivative `gₙ`, then `u` has weak `i`-partial derivative `gᵢ`. The pairing +identity `∫ uₙ ∂ᵢφ = −∫ gₙ φ` holds for each `n`; both sides are continuous in +the `L²` factor, so the identity passes to the limit. + +Two spellings of the same principle are provided: + +* one built on the Lebesgue `L²` realizations `MemScalarL2` / `toScalarL2` and + `volumeMeasureOn U`, with an `L²` dominated-convergence helper + (`hasWeakPartialDerivOn_of_tendsto_L2`); +* one built directly on `MemLp _ 2 (volume.restrict U)` via a + Cauchy–Schwarz/Hölder pairing-continuity lemma, closing over both the partial + derivative (`HasWeakPartialDerivOn.of_tendsto_eLpNorm_two`) and the full + gradient (`HasWeakGradientOn.of_tendsto_eLpNorm_two`). +-/ + +/-- **L² dominated convergence.** If `fₙ → g` a.e., all dominated in norm by a +fixed `L²` function `h`, with `g ∈ L²`, then `fₙ → g` in `L²`. (General +finite/σ-finite measure; the dominator provides the integrability.) -/ +theorem tendsto_eLpNorm_two_of_tendsto_ae_of_dominated + {d : ℕ} {μ : Measure (Vec d)} + {f : ℕ → Vec d → ℝ} {g h : Vec d → ℝ} + (hf : ∀ n, AEStronglyMeasurable (f n) μ) (hg : MemLp g 2 μ) (hh : MemLp h 2 μ) + (hbound : ∀ n, ∀ᵐ x ∂μ, ‖f n x‖ ≤ h x) + (hfg : ∀ᵐ x ∂μ, Tendsto (fun n => f n x) atTop (𝓝 (g x))) : + Tendsto (fun n => eLpNorm (fun x => f n x - g x) 2 μ) atTop (𝓝 0) := by + have h2z : (2 : ℝ≥0∞) ≠ 0 := by norm_num + have h2t : (2 : ℝ≥0∞) ≠ ⊤ := by norm_num + have h2r : (2 : ℝ≥0∞).toReal = 2 := by norm_num + set F : ℕ → Vec d → ℝ≥0∞ := fun n x => ‖f n x - g x‖ₑ ^ (2 : ℝ) with hF + set B : Vec d → ℝ≥0∞ := fun x => (‖h x‖ₑ + ‖g x‖ₑ) ^ (2 : ℝ) with hB + have hFmeas : ∀ n, AEMeasurable (F n) μ := by + intro n + exact ENNReal.continuous_rpow_const.measurable.comp_aemeasurable (((hf n).sub hg.1).enorm) + have hBound : ∀ n, F n ≤ᵐ[μ] B := by + intro n + filter_upwards [hbound n] with x hx + have hfe : ‖f n x‖ₑ ≤ ‖h x‖ₑ := by + rw [Real.enorm_eq_ofReal_abs, Real.enorm_eq_ofReal_abs] + exact ENNReal.ofReal_le_ofReal (hx.trans (le_abs_self _)) + have hsub : ‖f n x - g x‖ₑ ≤ ‖h x‖ₑ + ‖g x‖ₑ := + enorm_sub_le.trans (by gcongr) + exact ENNReal.rpow_le_rpow hsub (by norm_num) + have hlhh : ∫⁻ x, ‖h x‖ₑ ^ (2 : ℝ) ∂μ ≠ ⊤ := by + simpa [h2r] using + (lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top h2z h2t hh.eLpNorm_lt_top).ne + have hlgg : ∫⁻ x, ‖g x‖ₑ ^ (2 : ℝ) ∂μ ≠ ⊤ := by + simpa [h2r] using + (lintegral_rpow_enorm_lt_top_of_eLpNorm_lt_top h2z h2t hg.eLpNorm_lt_top).ne + have hBfin : ∫⁻ x, B x ∂μ ≠ ⊤ := by + have hpt : ∀ x, B x ≤ 4 * (‖h x‖ₑ ^ (2 : ℝ) + ‖g x‖ₑ ^ (2 : ℝ)) := by + intro x + have hsum : ‖h x‖ₑ + ‖g x‖ₑ ≤ 2 * (‖h x‖ₑ ⊔ ‖g x‖ₑ) := by + rw [two_mul]; exact add_le_add (le_max_left _ _) (le_max_right _ _) + calc B x = (‖h x‖ₑ + ‖g x‖ₑ) ^ (2 : ℝ) := rfl + _ ≤ (2 * (‖h x‖ₑ ⊔ ‖g x‖ₑ)) ^ (2 : ℝ) := ENNReal.rpow_le_rpow hsum (by norm_num) + _ = (2 : ℝ≥0∞) ^ (2 : ℝ) * (‖h x‖ₑ ⊔ ‖g x‖ₑ) ^ (2 : ℝ) := by + rw [ENNReal.mul_rpow_of_nonneg _ _ (by norm_num)] + _ ≤ 4 * (‖h x‖ₑ ^ (2 : ℝ) + ‖g x‖ₑ ^ (2 : ℝ)) := by + gcongr + · rw [show (4 : ℝ≥0∞) = (2 : ℝ≥0∞) ^ (2 : ℝ) by + rw [show (2:ℝ) = ((2:ℕ):ℝ) by norm_num, ENNReal.rpow_natCast]; norm_num] + · rw [(ENNReal.strictMono_rpow_of_pos (by norm_num)).monotone.map_max] + exact max_le (le_add_right le_rfl) (le_add_left le_rfl) + have hHmeas : AEMeasurable (fun x => ‖h x‖ₑ ^ (2:ℝ)) μ := + ENNReal.continuous_rpow_const.measurable.comp_aemeasurable hh.1.enorm + have hle : ∫⁻ x, B x ∂μ ≤ 4 * (∫⁻ x, ‖h x‖ₑ ^ (2:ℝ) ∂μ + ∫⁻ x, ‖g x‖ₑ ^ (2:ℝ) ∂μ) := by + calc ∫⁻ x, B x ∂μ ≤ ∫⁻ x, 4 * (‖h x‖ₑ ^ (2:ℝ) + ‖g x‖ₑ ^ (2:ℝ)) ∂μ := + lintegral_mono hpt + _ = 4 * (∫⁻ x, ‖h x‖ₑ ^ (2:ℝ) ∂μ + ∫⁻ x, ‖g x‖ₑ ^ (2:ℝ) ∂μ) := by + rw [lintegral_const_mul' _ _ (by norm_num), lintegral_add_left' hHmeas] + refine ne_top_of_le_ne_top ?_ hle + exact ENNReal.mul_ne_top (by norm_num) (ENNReal.add_ne_top.mpr ⟨hlhh, hlgg⟩) + have hFlim : ∀ᵐ x ∂μ, Tendsto (fun n => F n x) atTop (𝓝 0) := by + filter_upwards [hfg] with x hx + have hen : Tendsto (fun n => ‖f n x - g x‖ₑ) atTop (𝓝 0) := by + have h0 : Tendsto (fun n => f n x - g x) atTop (𝓝 0) := by + have := hx.sub (tendsto_const_nhds (x := g x)) + rwa [sub_self] at this + simpa using! (continuous_enorm.tendsto 0).comp h0 + have := (ENNReal.continuous_rpow_const (y := (2:ℝ))).tendsto 0 |>.comp hen + simpa [hF] using! this + have hlim0 : Tendsto (fun n => ∫⁻ x, F n x ∂μ) atTop (𝓝 (∫⁻ x, (0 : ℝ≥0∞) ∂μ)) := + tendsto_lintegral_of_dominated_convergence' B hFmeas hBound hBfin hFlim + rw [lintegral_zero] at hlim0 + have hrw : ∀ n, eLpNorm (fun x => f n x - g x) 2 μ = (∫⁻ x, F n x ∂μ) ^ (1 / (2:ℝ)) := by + intro n + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal h2z h2t, h2r] + simp_rw [hrw] + have hc : Tendsto (fun y : ℝ≥0∞ => y ^ (1 / (2:ℝ))) (𝓝 0) (𝓝 0) := by + have := (ENNReal.continuous_rpow_const (y := 1 / (2:ℝ))).tendsto 0 + simpa using this + simpa using! hc.comp hlim0 + +/-- **Weak partial derivative closed under L² limits.** If `uₙ → u` and +`gₙ → gᵢ` in `L²(U)`, all in `L²(U)`, and each `uₙ` has weak `i`-partial +derivative `gₙ`, then `u` has weak `i`-partial derivative `gᵢ`. -/ +theorem hasWeakPartialDerivOn_of_tendsto_L2 + {d : ℕ} {U : Set (Vec d)} {i : Fin d} + {u gi : Vec d → ℝ} {un gn : ℕ → Vec d → ℝ} + (hu : MemScalarL2 U u) (hgi : MemScalarL2 U gi) + (hun : ∀ n, MemScalarL2 U (un n)) (hgn : ∀ n, MemScalarL2 U (gn n)) + (hweak : ∀ n, HasWeakPartialDerivOn U i (un n) (gn n)) + (hun_to : + Filter.Tendsto + (fun n => eLpNorm (fun x => un n x - u x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0)) + (hgn_to : + Filter.Tendsto + (fun n => eLpNorm (fun x => gn n x - gi x) 2 (volumeMeasureOn U)) + Filter.atTop (nhds 0)) : + HasWeakPartialDerivOn U i u gi := by + intro φ hφ_smooth hφ_compact hφ_sub + -- The coordinate derivative of the test and the test itself are in `L²(U)`. + set dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) with hdφ_def + have hdφ_cont : Continuous dφ := by + simpa [hdφ_def] using + (hφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [hdφ_def] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_mem : MemScalarL2 U dφ := + hdφ_cont.memLp_of_hasCompactSupport hdφ_compact + have hφ_mem : MemScalarL2 U φ := + hφ_smooth.continuous.memLp_of_hasCompactSupport hφ_compact + -- L² convergence of the classes. + have hun_cl : + Filter.Tendsto (fun n => toScalarL2 (hun n)) Filter.atTop (nhds (toScalarL2 hu)) := + tendsto_toScalarL2_of_tendsto_eLpNorm hun hu hun_to + have hgn_cl : + Filter.Tendsto (fun n => toScalarL2 (hgn n)) Filter.atTop (nhds (toScalarL2 hgi)) := + tendsto_toScalarL2_of_tendsto_eLpNorm hgn hgi hgn_to + -- The two sides of the pairing converge. + have hleft : + Filter.Tendsto + (fun n => ∫ x in U, dφ x * un n x ∂volume) Filter.atTop + (nhds (∫ x in U, dφ x * u x ∂volume)) := + tendsto_integral_mul_of_tendsto_toScalarL2 hdφ_mem hun hu hun_cl + have hright : + Filter.Tendsto + (fun n => ∫ x in U, φ x * gn n x ∂volume) Filter.atTop + (nhds (∫ x in U, φ x * gi x ∂volume)) := + tendsto_integral_mul_of_tendsto_toScalarL2 hφ_mem hgn hgi hgn_cl + -- Per-`n` pairing identity, rearranged into `dφ * un` / `φ * gn` order. + have hpair : ∀ n, + ∫ x in U, dφ x * un n x ∂volume = -∫ x in U, φ x * gn n x ∂volume := by + intro n + have h := hweak n φ hφ_smooth hφ_compact hφ_sub + calc + ∫ x in U, dφ x * un n x ∂volume + = ∫ x in U, un n x * dφ x ∂volume := by + simp_rw [mul_comm] + _ = -∫ x in U, gn n x * φ x ∂volume := h + _ = -∫ x in U, φ x * gn n x ∂volume := by simp_rw [mul_comm] + -- Pass to the limit. + have hleft' : + Filter.Tendsto + (fun n => -∫ x in U, φ x * gn n x ∂volume) Filter.atTop + (nhds (∫ x in U, dφ x * u x ∂volume)) := by + refine hleft.congr ?_ + intro n; exact hpair n + have hlimeq : + ∫ x in U, dφ x * u x ∂volume = -∫ x in U, φ x * gi x ∂volume := + tendsto_nhds_unique hleft' hright.neg + calc + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume + = ∫ x in U, dφ x * u x ∂volume := by simp_rw [hdφ_def, mul_comm] + _ = -∫ x in U, φ x * gi x ∂volume := hlimeq + _ = -∫ x in U, gi x * φ x ∂volume := by simp_rw [mul_comm] + +noncomputable section + +variable {d : ℕ} {U : Set (Vec d)} + +/-- Pairing against a fixed `L²` test is continuous along `L²`-convergent +sequences: if `f n → g` in `L²(U)` and `h ∈ L²(U)`, then +`∫_U (f n)·h → ∫_U g·h`. -/ +theorem tendsto_setIntegral_mul_of_tendsto_eLpNorm_two + {h : Vec d → ℝ} {f : ℕ → Vec d → ℝ} {g : Vec d → ℝ} + (hh : MemLp h 2 (volume.restrict U)) + (hf : ∀ n, MemLp (f n) 2 (volume.restrict U)) + (hg : MemLp g 2 (volume.restrict U)) + (htend : Filter.Tendsto + (fun n => eLpNorm (fun x => f n x - g x) 2 (volume.restrict U)) + Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => ∫ x in U, f n x * h x ∂volume) + Filter.atTop (nhds (∫ x in U, g x * h x ∂volume)) := by + set μ : Measure (Vec d) := volume.restrict U with hμ + have hht : ENNReal.HolderTriple 2 2 1 := + ⟨by rw [inv_one]; exact ENNReal.inv_two_add_inv_two⟩ + -- integrability of the products + have hfh_int : ∀ n, Integrable (fun x => f n x * h x) μ := by + intro n + exact memLp_one_iff_integrable.mp (hh.mul' (hf n)) + have hgh_int : Integrable (fun x => g x * h x) μ := + memLp_one_iff_integrable.mp (hh.mul' hg) + -- rewrite the goal as a difference tending to zero + rw [← tendsto_sub_nhds_zero_iff] + have hdiff_eq : ∀ n, + (∫ x, f n x * h x ∂μ) - (∫ x, g x * h x ∂μ) + = ∫ x, (f n x - g x) * h x ∂μ := by + intro n + rw [← integral_sub (hfh_int n) hgh_int] + refine integral_congr_ae (Filter.Eventually.of_forall (fun x => ?_)) + ring + -- the ℝ≥0∞ bound that tends to zero + set B : ℕ → ℝ≥0∞ := fun n => + eLpNorm (fun x => f n x - g x) 2 μ * eLpNorm h 2 μ with hB + have hBtend : Filter.Tendsto (fun n => (B n).toReal) Filter.atTop (nhds 0) := by + have hprod : Filter.Tendsto B Filter.atTop (nhds (0 * eLpNorm h 2 μ)) := by + refine ENNReal.Tendsto.mul htend (Or.inr hh.2.ne) tendsto_const_nhds + (Or.inr (by simp)) + rw [zero_mul] at hprod + have := (ENNReal.tendsto_toReal (by simp : (0 : ℝ≥0∞) ≠ ⊤)).comp hprod + simpa using! this + -- squeeze the norm of the difference + refine squeeze_zero_norm ?_ hBtend + intro n + rw [hdiff_eq n] + have hae : ∀ᵐ x ∂μ, + ‖(f n x - g x) * h x‖₊ ≤ 1 * ‖f n x - g x‖₊ * ‖h x‖₊ := + Filter.Eventually.of_forall (fun x => by rw [nnnorm_mul]; simp) + have hHolder : + eLpNorm (fun x => (f n x - g x) * h x) 1 μ ≤ B n := by + have := eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (μ := μ) (p := (2 : ℝ≥0∞)) (q := (2 : ℝ≥0∞)) (r := (1 : ℝ≥0∞)) + ((hf n).sub hg).1 hh.1 (fun a b => a * b) 1 hae + simpa [hB] using! this + calc ‖∫ x, (f n x - g x) * h x ∂μ‖ + ≤ (∫⁻ x, ENNReal.ofReal ‖(f n x - g x) * h x‖ ∂μ).toReal := + norm_integral_le_lintegral_norm _ + _ = (eLpNorm (fun x => (f n x - g x) * h x) 1 μ).toReal := by + rw [eLpNorm_one_eq_lintegral_enorm] + simp_rw [ofReal_norm] + _ ≤ (B n).toReal := by + apply ENNReal.toReal_mono _ hHolder + exact ENNReal.mul_ne_top ((hf n).sub hg).2.ne hh.2.ne + +/-- **Weak partial derivatives are closed under `L²` limits.** +If `u n → u` and `g n → g` in `L²(U)` and each `u n` has weak `i`-th partial +derivative `g n` on `U`, then `u` has weak `i`-th partial derivative `g`. -/ +theorem HasWeakPartialDerivOn.of_tendsto_eLpNorm_two + {i : Fin d} + {u : Vec d → ℝ} {gi : Vec d → ℝ} + {u_n : ℕ → Vec d → ℝ} {g_n : ℕ → Vec d → ℝ} + (hu : MemLp u 2 (volume.restrict U)) (hgi : MemLp gi 2 (volume.restrict U)) + (hu_n : ∀ n, MemLp (u_n n) 2 (volume.restrict U)) + (hg_n : ∀ n, MemLp (g_n n) 2 (volume.restrict U)) + (hweak : ∀ n, HasWeakPartialDerivOn U i (u_n n) (g_n n)) + (htend_u : Filter.Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) 2 (volume.restrict U)) + Filter.atTop (nhds 0)) + (htend_g : Filter.Tendsto + (fun n => eLpNorm (fun x => g_n n x - gi x) 2 (volume.restrict U)) + Filter.atTop (nhds 0)) : + HasWeakPartialDerivOn U i u gi := by + intro φ hφ hφ_compact hφ_sub + -- the two smooth test factors, both L² on U (continuous, compact support) + have hDφ : MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) 2 (volume.restrict U) := by + have hcont : Continuous (fun x => (fderiv ℝ φ x) (basisVec i)) := + (hφ.continuous_fderiv (by norm_num)).clm_apply continuous_const + have hcs : HasCompactSupport (fun x => (fderiv ℝ φ x) (basisVec i)) := by + apply HasCompactSupport.mono' (hφ_compact.fderiv ℝ) + intro x hx + apply subset_tsupport (fderiv ℝ φ) + rw [Function.mem_support] at hx ⊢ + intro h0 + apply hx + rw [h0]; simp + exact (hcont.memLp_of_hasCompactSupport hcs).restrict U + have hφmem : MemLp φ 2 (volume.restrict U) := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict U + -- pass to the limit on both sides of the pairing identity for each n + have hlhs : Filter.Tendsto + (fun n => ∫ x in U, u_n n x * (fderiv ℝ φ x) (basisVec i) ∂volume) + Filter.atTop (nhds (∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume)) := + tendsto_setIntegral_mul_of_tendsto_eLpNorm_two hDφ hu_n hu htend_u + have hrhs : Filter.Tendsto + (fun n => ∫ x in U, g_n n x * φ x ∂volume) + Filter.atTop (nhds (∫ x in U, gi x * φ x ∂volume)) := + tendsto_setIntegral_mul_of_tendsto_eLpNorm_two hφmem hg_n hgi htend_g + -- each n: LHS = -RHS + have heq_n : ∀ n, + (∫ x in U, u_n n x * (fderiv ℝ φ x) (basisVec i) ∂volume) + = -(∫ x in U, g_n n x * φ x ∂volume) := + fun n => hweak n φ hφ hφ_compact hφ_sub + have hlhs' : Filter.Tendsto + (fun n => -(∫ x in U, g_n n x * φ x ∂volume)) + Filter.atTop (nhds (∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume)) := by + refine hlhs.congr ?_ + intro n; rw [heq_n n] + have hlim := tendsto_nhds_unique hlhs' hrhs.neg + simpa using hlim + +/-- **Weak gradients are closed under `L²` limits** (all coordinates at once). -/ +theorem HasWeakGradientOn.of_tendsto_eLpNorm_two + {u : Vec d → ℝ} {Du : Vec d → Vec d} + {u_n : ℕ → Vec d → ℝ} {Du_n : ℕ → Vec d → Vec d} + (hu : MemLp u 2 (volume.restrict U)) (hDu : GradMemL2On U Du) + (hu_n : ∀ n, MemLp (u_n n) 2 (volume.restrict U)) + (hDu_n : ∀ n, GradMemL2On U (Du_n n)) + (hweak : ∀ n, HasWeakGradientOn U (u_n n) (Du_n n)) + (htend_u : Filter.Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) 2 (volume.restrict U)) + Filter.atTop (nhds 0)) + (htend_Du : ∀ i, Filter.Tendsto + (fun n => eLpNorm (fun x => Du_n n x i - Du x i) 2 (volume.restrict U)) + Filter.atTop (nhds 0)) : + HasWeakGradientOn U u Du := by + intro i + exact HasWeakPartialDerivOn.of_tendsto_eLpNorm_two hu (hDu i) + hu_n (fun n => hDu_n n i) (fun n => hweak n i) htend_u (htend_Du i) + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p.lean new file mode 100644 index 0000000000..e9ec4e899a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p.lean @@ -0,0 +1,15 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Translation + +/-! # W1p -/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/BasicLemmas.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/BasicLemmas.lean new file mode 100644 index 0000000000..114e0625fe --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/BasicLemmas.lean @@ -0,0 +1,310 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.ConvexDomain +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions + +/-! # Basic Lemmas -/ + +@[expose] public section + +namespace Homogenization + +theorem memLpOn_mono {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} {u : Vec d → ℝ} + (hVU : V ⊆ U) (hu : MemLpOn U p u) : MemLpOn V p u := + hu.mono_measure (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hVU) + +theorem gradMemLpOn_mono {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} {Du : Vec d → Vec d} + (hVU : V ⊆ U) (hDu : GradMemLpOn U p Du) : GradMemLpOn V p Du := by + intro i + exact memLpOn_mono hVU (hDu i) + +theorem HasWeakPartialDerivOn.restrict {d : ℕ} {U V : Set (Vec d)} + (hVopen : IsOpen V) (hVU : V ⊆ U) + {i : Fin d} {u gi : Vec d → ℝ} + (h : HasWeakPartialDerivOn U i u gi) : + HasWeakPartialDerivOn V i u gi := by + let _ := hVopen + intro φ hφ_smooth hφ_compact hφ_supp + have hφ_suppU : tsupport φ ⊆ U := hφ_supp.trans hVU + have key := h φ hφ_smooth hφ_compact hφ_suppU + have h1 : ∀ x, x ∉ V → u x * (fderiv ℝ φ x) (basisVec i) = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_supp hx') + have hφ_eq : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := φ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [Filter.EventuallyEq.fderiv_eq hφ_eq] + simp + have h2 : ∀ x, x ∉ V → gi x * φ x = 0 := by + intro x hx + simp [image_eq_zero_of_notMem_tsupport (fun hx' => hx (hφ_supp hx'))] + have h3 : ∀ x, x ∉ U → u x * (fderiv ℝ φ x) (basisVec i) = 0 := + fun x hx => h1 x (fun hx' => hx (hVU hx')) + have h4 : ∀ x, x ∉ U → gi x * φ x = 0 := + fun x hx => h2 x (fun hx' => hx (hVU hx')) + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h1, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h2, + ← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h3, + ← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero h4, + key] + +theorem HasWeakGradientOn.restrict {d : ℕ} {U V : Set (Vec d)} + (hVopen : IsOpen V) (hVU : V ⊆ U) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (h : HasWeakGradientOn U u Du) : + HasWeakGradientOn V u Du := by + intro i + exact (h i).restrict hVopen hVU + +theorem HasWeakPartialDerivOn.of_contDiff {d : ℕ} {U : Set (Vec d)} + {i : Fin d} {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + HasWeakPartialDerivOn U i f (fun x => (fderiv ℝ f x) (basisVec i)) := by + intro φ hφ_smooth hφ_supp hφ_sub + let ei : Vec d := basisVec i + have hf_diff : Differentiable ℝ f := hf.differentiable (by simp) + have hφ_diff : Differentiable ℝ φ := hφ_smooth.differentiable (by simp) + have hf_cont : Continuous f := hf_diff.continuous + have hφ_cont : Continuous φ := hφ_diff.continuous + have hfderiv_φ_cont : Continuous (fun x => (fderiv ℝ φ x) ei) := by + simpa [ei] using + (hφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hfderiv_f_cont : Continuous (fun x => (fderiv ℝ f x) ei) := by + simpa [ei] using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + have hφ_fderiv_supp : HasCompactSupport (fun x => (fderiv ℝ φ x) ei) := by + simpa [ei] using hφ_supp.fderiv_apply (𝕜 := ℝ) ei + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero, + MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero] + · simpa [ei] using + integral_mul_fderiv_eq_neg_fderiv_mul_of_integrable + ((hfderiv_f_cont.mul hφ_cont).integrable_of_hasCompactSupport hφ_supp.mul_left) + ((hf_cont.mul hfderiv_φ_cont).integrable_of_hasCompactSupport hφ_fderiv_supp.mul_left) + ((hf_cont.mul hφ_cont).integrable_of_hasCompactSupport hφ_supp.mul_left) + (fun x _ => hf_diff.differentiableAt) (fun x _ => hφ_diff.differentiableAt) + · + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + · + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + have hφ_eq : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := φ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [Filter.EventuallyEq.fderiv_eq hφ_eq] + simp + +theorem HasWeakGradientOn.of_contDiff {d : ℕ} {U : Set (Vec d)} + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + HasWeakGradientOn U f (fun x i => (fderiv ℝ f x) (basisVec i)) := by + intro i + exact HasWeakPartialDerivOn.of_contDiff hf + +namespace W1pFunction + +@[ext] theorem ext {d : ℕ} {U : Set (Vec d)} {p : ENNReal} {u v : W1pFunction U p} + (htoFun : u.toFun = v.toFun) (hgrad : u.grad = v.grad) : u = v := by + cases u + cases v + cases htoFun + cases hgrad + rfl + +theorem hasWeakPartialDerivOn {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (i : Fin d) : + HasWeakPartialDerivOn U i u.toFun (fun x => u.grad x i) := + u.hasWeakGradient i + +theorem grad_memLp {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (i : Fin d) : + MemLpOn U p (fun x => u.grad x i) := + u.gradMemLp i + +theorem memW1p {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (u : W1pFunction U p) : + MemW1p U p u.toFun := + ⟨u, rfl⟩ + +noncomputable def ofContDiff {d : ℕ} {U : Set (Vec d)} (_hU : IsOpen U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) (hf_supp : HasCompactSupport f) + (p : ENNReal) : W1pFunction U p := + { toFun := f + grad := fun x i => (fderiv ℝ f x) (basisVec i) + memLp := by + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + exact (hf_cont.memLp_of_hasCompactSupport hf_supp).restrict U + gradMemLp := by + intro i + have hderiv_cont : Continuous (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + have hderiv_supp : HasCompactSupport (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using hf_supp.fderiv_apply (𝕜 := ℝ) (basisVec i) + exact (hderiv_cont.memLp_of_hasCompactSupport hderiv_supp).restrict U + hasWeakGradient := HasWeakGradientOn.of_contDiff hf } + +/-- Package a globally smooth function as a `W^{1,p}(U)` witness on a bounded +measurable domain. Unlike `ofContDiff`, this constructor does not require +compact support, because boundedness of `U` gives the needed `L^p` control on +the restriction. -/ +noncomputable def ofContDiffOnIsSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (hU : IsSobolevRegularDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : W1pFunction U p := by + letI : MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U) := by + simpa using hU.isFiniteMeasure_restrict_volume + classical + have hf_cont : Continuous f := (hf.differentiable (by simp)).continuous + have hclosure_compact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + let Cf : ℝ := Classical.choose (hclosure_compact.exists_bound_of_continuousOn hf_cont.continuousOn) + have hCf : ∀ x ∈ closure U, ‖f x‖ ≤ Cf := + Classical.choose_spec (hclosure_compact.exists_bound_of_continuousOn hf_cont.continuousOn) + refine + { toFun := f + grad := fun x i => (fderiv ℝ f x) (basisVec i) + memLp := ?_ + gradMemLp := ?_ + hasWeakGradient := HasWeakGradientOn.of_contDiff hf } + · refine MeasureTheory.MemLp.of_bound + (μ := MeasureTheory.volume.restrict U) hf_cont.aestronglyMeasurable Cf ?_ + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCf x (subset_closure hx) + · intro i + have hderiv_cont : Continuous (fun x => (fderiv ℝ f x) (basisVec i)) := by + simpa using + (hf.continuous_fderiv (by simp)).clm_apply continuous_const + let CD : ℝ := + Classical.choose (hclosure_compact.exists_bound_of_continuousOn hderiv_cont.continuousOn) + have hCD : ∀ x ∈ closure U, ‖(fderiv ℝ f x) (basisVec i)‖ ≤ CD := + Classical.choose_spec + (hclosure_compact.exists_bound_of_continuousOn hderiv_cont.continuousOn) + refine MeasureTheory.MemLp.of_bound + (μ := MeasureTheory.volume.restrict U) hderiv_cont.aestronglyMeasurable CD ?_ + rw [MeasureTheory.ae_restrict_iff' hU.measurableSet] + exact Filter.Eventually.of_forall fun x hx => hCD x (subset_closure hx) + +/-- Bounded open convex domains admit the bounded-domain smooth constructor for +`W^{1,p}`. -/ +noncomputable def ofContDiffOnIsOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : W1pFunction U p := + ofContDiffOnIsSobolevRegularDomain hU.isSobolevRegularDomain hf + +def restrict {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} (u : W1pFunction U p) + (hVopen : IsOpen V) (hVU : V ⊆ U) : W1pFunction V p := + { toFun := u.toFun + grad := u.grad + memLp := memLpOn_mono hVU u.memLp + gradMemLp := gradMemLpOn_mono hVU u.gradMemLp + hasWeakGradient := u.hasWeakGradient.restrict hVopen hVU } + +/-- Upgrade a `W^{1,p}` witness to `W^{1,p}_0` from an explicit supported +smooth approximation package. This is the final zero-trace packaging target: +the support data is an input, not a consequence of domain convexity alone. -/ +def toW10pFunction {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (happrox : u.SupportedSmoothApproximation) : + W10pFunction U p := + { toW1pFunction := u + approx := happrox.approx + approx_smooth := happrox.approx_smooth + approx_hasCompactSupport := happrox.approx_hasCompactSupport + approx_support_subset := happrox.approx_support_subset + tendsto_approx := happrox.tendsto_approx + tendsto_approx_grad := happrox.tendsto_approx_grad } + +theorem memW10p_of_supportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} + {p : ENNReal} (u : W1pFunction U p) + (happrox : u.SupportedSmoothApproximation) : + MemW10p U p u.toFun := + ⟨u.toW10pFunction happrox, rfl⟩ + +theorem memW10p_of_hasSupportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} + {p : ENNReal} (u : W1pFunction U p) + (happrox : u.HasSupportedSmoothApproximation) : + MemW10p U p u.toFun := by + rcases happrox with ⟨happrox⟩ + exact u.memW10p_of_supportedSmoothApproximation happrox + +end W1pFunction + +namespace W10pFunction + +theorem memW1p {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (u : W10pFunction U p) : + MemW1p U p u.toW1pFunction.toFun := + u.toW1pFunction.memW1p + +noncomputable def ofContDiff {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {f : Vec d → ℝ} (hf : ContDiff ℝ (⊤ : ℕ∞) f) + (hf_supp : HasCompactSupport f) (hf_sub : tsupport f ⊆ U) + (p : ENNReal) : W10pFunction U p := + { toW1pFunction := W1pFunction.ofContDiff hU (hf.of_le (by simp)) hf_supp p + approx := fun _ => f + approx_smooth := by + intro n + simpa using hf + approx_hasCompactSupport := by + intro n + simpa using hf_supp + approx_support_subset := by + intro n + simpa using hf_sub + tendsto_approx := by + simp [W1pFunction.ofContDiff] + tendsto_approx_grad := by + intro i + simp [W1pFunction.ofContDiff] } + +theorem memW10p {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (u : W10pFunction U p) : + MemW10p U p u.toW1pFunction.toFun := + ⟨u, rfl⟩ + +/-- Every bundled `W10pFunction` exposes its supported smooth approximation +data for the underlying `W1pFunction`. -/ +def supportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W10pFunction U p) : + u.toW1pFunction.SupportedSmoothApproximation := + { approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := u.approx_support_subset + tendsto_approx := u.tendsto_approx + tendsto_approx_grad := u.tendsto_approx_grad } + +theorem hasSupportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W10pFunction U p) : + u.toW1pFunction.HasSupportedSmoothApproximation := + ⟨u.supportedSmoothApproximation⟩ + +end W10pFunction + +theorem memW1p_of_memW10p {d : ℕ} {U : Set (Vec d)} {p : ENNReal} {u : Vec d → ℝ} + (hu : MemW10p U p u) : MemW1p U p u := by + rcases hu with ⟨v, rfl⟩ + exact v.memW1p + +theorem memW1p_of_contDiffOnIsSobolevRegularDomain + {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (hU : IsSobolevRegularDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + MemW1p U p f := + by + simpa using! + (W1pFunction.ofContDiffOnIsSobolevRegularDomain (U := U) (p := p) hU hf).memW1p + +theorem memW1p_of_contDiffOnIsOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} {p : ENNReal} (hU : IsOpenBoundedConvexDomain U) + {f : Vec d → ℝ} (hf : ContDiff ℝ 1 f) : + MemW1p U p f := + by + simpa using! + (W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain (U := U) (p := p) hU hf).memW1p + +theorem memW1p_restrict {d : ℕ} {U V : Set (Vec d)} {p : ENNReal} {u : Vec d → ℝ} + (hVopen : IsOpen V) (hVU : V ⊆ U) (hu : MemW1p U p u) : MemW1p V p u := by + rcases hu with ⟨u', rfl⟩ + exact (u'.restrict hVopen hVU).memW1p + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxGeometry.lean new file mode 100644 index 0000000000..dc5aaa14c0 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxGeometry.lean @@ -0,0 +1,149 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareSegment +public import Mathlib.Analysis.Calculus.ContDiff.Operations + +/-! # Convex Approx Geometry -/ + +@[expose] public section + +namespace Homogenization + +/-! +# Convex-domain smoothing geometry + +This file isolates the affine sampling map used in the bounded-open-convex +domain smooth approximation strategy. The future smoothing operator will sample +`u` at + +`(1 - ε) • x + ε • (x0 - r • z)`, + +where `closedBall x0 r ⊆ U` and `‖z‖ ≤ 1`. Convexity keeps this sample point +inside `U`. +-/ + +/-- The affine sample point used by the convex-domain smoothing operator. -/ +def convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : Vec d := + (1 - ε) • x + ε • (x0 - r • z) + +@[simp] theorem convexApproxSample_apply {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : + convexApproxSample x0 z r ε x = (1 - ε) • x + ε • (x0 - r • z) := + rfl + +theorem convexApproxSample_eq_segmentBlend {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : + convexApproxSample x0 z r ε x = segmentBlend (x0 - r • z) ε x := by + rw [convexApproxSample, segmentBlend_eq_smul_add] + +theorem continuous_convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) : + Continuous (convexApproxSample x0 z r ε : Vec d → Vec d) := by + simpa [convexApproxSample] using! + ((continuous_const : Continuous (fun _ : Vec d => (1 - ε))).smul + (continuous_id : Continuous (fun x : Vec d => x))).add + (continuous_const : Continuous (fun _ : Vec d => ε • (x0 - r • z))) + +theorem contDiff_convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) {n : ℕ∞} : + ContDiff ℝ n (convexApproxSample x0 z r ε : Vec d → Vec d) := by + simpa [convexApproxSample] using! + (contDiff_const.smul contDiff_id).add contDiff_const + +theorem sub_smul_mem_closedBall {d : ℕ} {x0 z : Vec d} {r : ℝ} + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) : + x0 - r • z ∈ Metric.closedBall x0 r := by + rw [Metric.mem_closedBall, dist_eq_norm] + have hsub : (x0 - r • z) - x0 = -(r • z) := by + abel_nf + rw [hsub, norm_neg, norm_smul] + calc + |r| * ‖z‖ ≤ |r| * 1 := by + exact mul_le_mul_of_nonneg_left hz (abs_nonneg r) + _ = r := by + rw [abs_of_nonneg hr] + ring + +theorem sub_smul_mem_of_closedBall_subset {d : ℕ} {U : Set (Vec d)} {x0 z : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) : + x0 - r • z ∈ U := + hball (sub_smul_mem_closedBall hr hz) + +theorem convexApproxSample_mem_of_isOpenBoundedConvexDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + convexApproxSample x0 z r ε x ∈ U := by + have hy : x0 - r • z ∈ U := sub_smul_mem_of_closedBall_subset hball hr hz + rw [convexApproxSample_eq_segmentBlend] + exact segmentBlend_mem_of_isOpenBoundedConvexDomain hU hy hx hε0 hε1 + +theorem convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + Set.MapsTo (convexApproxSample x0 z r ε) U U := by + intro x hx + exact convexApproxSample_mem_of_isOpenBoundedConvexDomain hU hx hball hr hz hε0 hε1 + +theorem norm_convexApproxSample_sub {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : + ‖convexApproxSample x0 z r ε x - x‖ = |ε| * ‖(x0 - r • z) - x‖ := by + rw [convexApproxSample_eq_segmentBlend, norm_segmentBlend_sub_right] + +theorem norm_sub_convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : + ‖x - convexApproxSample x0 z r ε x‖ = |ε| * ‖(x0 - r • z) - x‖ := by + rw [norm_sub_rev, norm_convexApproxSample_sub] + +theorem norm_convexApproxSample_sub_le {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) + (hε0 : 0 ≤ ε) : + ‖convexApproxSample x0 z r ε x - x‖ ≤ ε * ‖(x0 - r • z) - x‖ := by + rw [norm_convexApproxSample_sub, abs_of_nonneg hε0] + +theorem norm_sub_convexApproxSample_le {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) + (hε0 : 0 ≤ ε) : + ‖x - convexApproxSample x0 z r ε x‖ ≤ ε * ‖(x0 - r • z) - x‖ := by + rw [norm_sub_convexApproxSample, abs_of_nonneg hε0] + +theorem norm_convexApproxSample_sub_le_two_mul_choose {d : ℕ} {U : Set (Vec d)} + (hU : IsBoundedDomain U) {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) : + ‖convexApproxSample x0 z r ε x - x‖ ≤ ε * (2 * Classical.choose hU) := by + have hy : x0 - r • z ∈ U := sub_smul_mem_of_closedBall_subset hball hr hz + calc + ‖convexApproxSample x0 z r ε x - x‖ ≤ ε * ‖(x0 - r • z) - x‖ := + norm_convexApproxSample_sub_le x0 z r ε x hε0 + _ ≤ ε * (2 * Classical.choose hU) := by + exact mul_le_mul_of_nonneg_left (hU.norm_sub_le_two_mul_choose hy hx) hε0 + +theorem norm_sub_convexApproxSample_le_two_mul_choose {d : ℕ} {U : Set (Vec d)} + (hU : IsBoundedDomain U) {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) : + ‖x - convexApproxSample x0 z r ε x‖ ≤ ε * (2 * Classical.choose hU) := by + have hy : x0 - r • z ∈ U := sub_smul_mem_of_closedBall_subset hball hr hz + calc + ‖x - convexApproxSample x0 z r ε x‖ ≤ ε * ‖(x0 - r • z) - x‖ := + norm_sub_convexApproxSample_le x0 z r ε x hε0 + _ ≤ ε * (2 * Classical.choose hU) := by + exact mul_le_mul_of_nonneg_left (hU.norm_sub_le_two_mul_choose hy hx) hε0 + +theorem norm_convexApproxSample_sub_le_two_mul_choose_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) : + ‖convexApproxSample x0 z r ε x - x‖ ≤ ε * (2 * Classical.choose hU.isBoundedDomain) := + norm_convexApproxSample_sub_le_two_mul_choose hU.isBoundedDomain hx hball hr hz hε0 + +theorem norm_sub_convexApproxSample_le_two_mul_choose_of_isOpenBoundedConvexDomain + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) (hε0 : 0 ≤ ε) : + ‖x - convexApproxSample x0 z r ε x‖ ≤ ε * (2 * Classical.choose hU.isBoundedDomain) := + norm_sub_convexApproxSample_le_two_mul_choose hU.isBoundedDomain hx hball hr hz hε0 + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing.lean new file mode 100644 index 0000000000..8107f51ff2 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing.lean @@ -0,0 +1,25 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivComp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivSmoothing +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Continuity +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.PointwiseBounds +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Convergence + +/-! +# Convex-domain smoothing operator (aggregate re-export) + +Previously a 3373-line monolithic module; now split along thematic boundaries +into the seven files imported above. This shim re-exports everything so +existing downstream consumers keep working unchanged. +-/ + +@[expose] public section diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Continuity.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Continuity.lean new file mode 100644 index 0000000000..5725bec0ee --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Continuity.lean @@ -0,0 +1,437 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivSmoothing + +/-! # Continuity -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Continuity, pointwise fderiv, and ae-equality for the smoothing + +Concludes the weak-derivative chain with `ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec`, +then pivots to the pointwise-classical world: continuity of `convexApproxSample`, +`convexApproxIntegrand`, and the derived oscillation / weighted / kernel-times- +const integrands; continuity of `convexApproxSmoothing`; the parametric +`convexApproxFDerivIntegrand` and the explicit `hasFDerivAt_convexApproxSmoothing_of_contDiff` +computation (including its `apply_basisVec` form). +-/ + +theorem ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {i : Fin d} {u gi ρ : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) + (huMem : MemLpOn U p u) (hgiMem : MemLpOn U p gi) + (huWeak : HasWeakPartialDerivOn U i u gi) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) : + (fun x => (fderiv ℝ (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) =ᵐ[MeasureTheory.volume.restrict U] + fun x => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x := by + have huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + (huMem.locallyIntegrable hp1) + have hgiLoc : MeasureTheory.LocallyIntegrableOn gi U MeasureTheory.volume := + MeasureTheory.locallyIntegrableOn_of_locallyIntegrable_restrict + (hgiMem.locallyIntegrable hp1) + have hsmooth : + ContDiff ℝ (⊤ : ℕ∞) + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) := + contDiff_convexApproxSmoothRepresentative hU.1.measurableSet hρ hp1 huMem hr hε0 + have hgi_smooth : + ContDiff ℝ (⊤ : ℕ∞) + (Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε) := + contDiff_convexApproxSmoothRepresentative hU.1.measurableSet hρ hp1 hgiMem hr hε0 + have hclassWeak : + HasWeakPartialDerivOn U i + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x => (fderiv ℝ + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) := + HasWeakPartialDerivOn.of_contDiff (U := U) (i := i) + (f := Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) + (hsmooth.of_le (by simp)) + have hroughWeak : + HasWeakPartialDerivOn U i + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) := + HasWeakPartialDerivOn.convexApproxSmoothRepresentative (i := i) hU huLoc hgiLoc huWeak + hρ hball hr hε0 hε1 + have hclass_cont : + Continuous + (fun x => (fderiv ℝ + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) := by + simpa using (hsmooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hrough_cont : + Continuous + (fun x => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) := by + simpa using! continuous_const.mul hgi_smooth.continuous + have hclassLoc : + MeasureTheory.LocallyIntegrableOn + (fun x => (fderiv ℝ + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) U MeasureTheory.volume := + hclass_cont.continuousOn.locallyIntegrableOn hU.1.measurableSet + have hroughLoc : + MeasureTheory.LocallyIntegrableOn + (fun x => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) U + MeasureTheory.volume := + hrough_cont.continuousOn.locallyIntegrableOn hU.1.measurableSet + exact HasWeakPartialDerivOn.ae_eq hU.1 hclassLoc hroughLoc hclassWeak hroughWeak + +theorem continuous_convexApproxSample_right {d : ℕ} (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + Continuous (fun z : Vec d => convexApproxSample x0 z r ε x) := by + simpa [convexApproxSample] using! + (continuous_const : Continuous (fun _ : Vec d => (1 - ε) • x)).add + ((continuous_const : Continuous (fun _ : Vec d => ε)).smul + ((continuous_const : Continuous (fun _ : Vec d => x0)).sub + ((continuous_const : Continuous (fun _ : Vec d => r)).smul + (continuous_id : Continuous (fun z : Vec d => z))))) + +theorem continuous_convexApproxSample_prod {d : ℕ} (x0 : Vec d) (r ε : ℝ) : + Continuous (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) := by + simpa [convexApproxSample] using! + ((continuous_const : Continuous (fun _ : Vec d × Vec d => 1 - ε)).smul + (continuous_fst : Continuous (fun p : Vec d × Vec d => p.1))).add + ((continuous_const : Continuous (fun _ : Vec d × Vec d => ε)).smul + ((continuous_const : Continuous (fun _ : Vec d × Vec d => x0)).sub + ((continuous_const : Continuous (fun _ : Vec d × Vec d => r)).smul + (continuous_snd : Continuous (fun p : Vec d × Vec d => p.2))))) + +theorem continuous_convexApproxIntegrand_right {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + Continuous (fun z => convexApproxIntegrand ρ u x0 r ε x z) := by + simpa [convexApproxIntegrand] using! + hρ.mul (hu.comp (continuous_convexApproxSample_right x0 r ε x)) + +theorem continuous_convexApproxIntegrand_left {d : ℕ} {ρ u : Vec d → ℝ} + (hu : Continuous u) (x0 z : Vec d) (r ε : ℝ) : + Continuous (fun x => convexApproxIntegrand ρ u x0 r ε x z) := by + simpa [convexApproxIntegrand] using! + continuous_const.mul (hu.comp (continuous_convexApproxSample x0 z r ε)) + +theorem continuous_convexApproxIntegrand_prod {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) : + Continuous (fun p : Vec d × Vec d => convexApproxIntegrand ρ u x0 r ε p.1 p.2) := by + have hρ' : Continuous (fun p : Vec d × Vec d => ρ p.2) := hρ.comp continuous_snd + have hu' : Continuous (fun p : Vec d × Vec d => u (convexApproxSample x0 p.2 r ε p.1)) := + hu.comp (continuous_convexApproxSample_prod x0 r ε) + simpa [convexApproxIntegrand] using! hρ'.mul hu' + +theorem tsupport_convexApproxIntegrand_subset {d : ℕ} {ρ u : Vec d → ℝ} + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + tsupport (fun z => convexApproxIntegrand ρ u x0 r ε x z) ⊆ tsupport ρ := by + simpa [convexApproxIntegrand] using + (tsupport_mul_subset_left (f := ρ) + (g := fun z => u (convexApproxSample x0 z r ε x))) + +theorem hasCompactSupport_convexApproxIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : HasCompactSupport ρ) (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + HasCompactSupport (fun z => convexApproxIntegrand ρ u x0 r ε x z) := by + simpa [convexApproxIntegrand] using! + (hρ.mul_right : HasCompactSupport + (fun z => ρ z * u (convexApproxSample x0 z r ε x))) + +theorem integrable_convexApproxIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + MeasureTheory.Integrable (fun z => convexApproxIntegrand ρ u x0 r ε x z) := by + exact + (continuous_convexApproxIntegrand_right hρ hu x0 r ε x).integrable_of_hasCompactSupport + (hasCompactSupport_convexApproxIntegrand hρ_compact x0 r ε x) + +theorem continuous_convexApproxDifferenceIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + Continuous (fun z => ρ z * (u (convexApproxSample x0 z r ε x) - u x)) := by + exact hρ.mul ((hu.comp (continuous_convexApproxSample_right x0 r ε x)).sub continuous_const) + +theorem hasCompactSupport_convexApproxDifferenceIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ_compact : HasCompactSupport ρ) (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + HasCompactSupport (fun z => ρ z * (u (convexApproxSample x0 z r ε x) - u x)) := by + simpa using! + (hρ_compact.mul_right : HasCompactSupport + (fun z => ρ z * (u (convexApproxSample x0 z r ε x) - u x))) + +theorem integrable_convexApproxDifferenceIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + MeasureTheory.Integrable (fun z => ρ z * (u (convexApproxSample x0 z r ε x) - u x)) := by + exact + (continuous_convexApproxDifferenceIntegrand hρ hu x0 r ε x).integrable_of_hasCompactSupport + (hasCompactSupport_convexApproxDifferenceIntegrand hρ_compact x0 r ε x) + +theorem continuous_convexApproxWeightedOscillation {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + Continuous (fun z => ρ z * |u (convexApproxSample x0 z r ε x) - u x|) := by + exact + hρ.mul (((hu.comp (continuous_convexApproxSample_right x0 r ε x)).sub + continuous_const).abs) + +theorem hasCompactSupport_convexApproxWeightedOscillation {d : ℕ} {ρ u : Vec d → ℝ} + (hρ_compact : HasCompactSupport ρ) (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + HasCompactSupport (fun z => ρ z * |u (convexApproxSample x0 z r ε x) - u x|) := by + simpa using! + (hρ_compact.mul_right : HasCompactSupport + (fun z => ρ z * |u (convexApproxSample x0 z r ε x) - u x|)) + +theorem integrable_convexApproxWeightedOscillation {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + MeasureTheory.Integrable (fun z => ρ z * |u (convexApproxSample x0 z r ε x) - u x|) := by + exact + (continuous_convexApproxWeightedOscillation hρ hu x0 r ε x).integrable_of_hasCompactSupport + (hasCompactSupport_convexApproxWeightedOscillation hρ_compact x0 r ε x) + +theorem integrable_convexApproxKernelMulConst {d : ℕ} {ρ : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (c : ℝ) : + MeasureTheory.Integrable (fun z => ρ z * c) := by + have hcont : Continuous (fun z => ρ z * c) := hρ.mul continuous_const + have hcomp : HasCompactSupport (fun z => ρ z * c) := by + simpa using! (hρ_compact.mul_right : HasCompactSupport (fun z => ρ z * c)) + exact hcont.integrable_of_hasCompactSupport hcomp + +theorem continuous_convexApproxSmoothing {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) : + Continuous (convexApproxSmoothing ρ u x0 r ε) := by + have hcont : + Continuous (Function.uncurry (fun x z => convexApproxIntegrand ρ u x0 r ε x z)) := by + simpa [Function.uncurry] using! continuous_convexApproxIntegrand_prod hρ hu x0 r ε + simpa [convexApproxSmoothing] using! + (continuous_parametric_integral_of_continuous + (μ := MeasureTheory.volume) + (f := fun x z => convexApproxIntegrand ρ u x0 r ε x z) + hcont hρ_compact.isCompact) + +/-- The pointwise Fréchet-derivative integrand of the convex smoothing operator. -/ +noncomputable def convexApproxFDerivIntegrand {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x z : Vec d) : Vec d →L[ℝ] ℝ := + ((ρ z) * (1 - ε)) • fderiv ℝ u (convexApproxSample x0 z r ε x) + +@[simp] theorem convexApproxFDerivIntegrand_apply {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x z : Vec d) : + convexApproxFDerivIntegrand ρ u x0 r ε x z = + ((ρ z) * (1 - ε)) • fderiv ℝ u (convexApproxSample x0 z r ε x) := + rfl + +theorem continuous_convexApproxFDerivIntegrand_right {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + Continuous (fun z => convexApproxFDerivIntegrand ρ u x0 r ε x z) := by + have hscalar : Continuous (fun z => (ρ z) * (1 - ε)) := hρ.mul continuous_const + have hfderiv : + Continuous (fun z => fderiv ℝ u (convexApproxSample x0 z r ε x)) := + (hu.continuous_fderiv (by simp)).comp (continuous_convexApproxSample_right x0 r ε x) + simpa [convexApproxFDerivIntegrand] using! hscalar.smul hfderiv + +theorem hasCompactSupport_convexApproxFDerivIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ_compact : HasCompactSupport ρ) (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + HasCompactSupport (fun z => convexApproxFDerivIntegrand ρ u x0 r ε x z) := by + refine HasCompactSupport.of_support_subset_isCompact hρ_compact.isCompact ?_ + intro z hz + by_contra hzρ + apply hz + have hρz : ρ z = 0 := image_eq_zero_of_notMem_tsupport (f := ρ) hzρ + simp [convexApproxFDerivIntegrand, hρz] + +theorem integrable_convexApproxFDerivIntegrand {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : Continuous ρ) (hρ_compact : HasCompactSupport ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + MeasureTheory.Integrable (fun z => convexApproxFDerivIntegrand ρ u x0 r ε x z) := by + exact + (continuous_convexApproxFDerivIntegrand_right hρ hu x0 r ε x).integrable_of_hasCompactSupport + (hasCompactSupport_convexApproxFDerivIntegrand hρ_compact x0 r ε x) + +theorem hasFDerivAt_convexApproxSample {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (x : Vec d) : + HasFDerivAt (convexApproxSample x0 z r ε) ((1 - ε) • ContinuousLinearMap.id ℝ (Vec d)) x := by + simpa [convexApproxSample] using + ((((1 - ε) • ContinuousLinearMap.id ℝ (Vec d)).hasFDerivAt).add_const (ε • (x0 - r • z))) + +theorem hasFDerivAt_convexApproxIntegrand_left_of_contDiff {d : ℕ} {ρ u : Vec d → ℝ} + (_hρ : Continuous ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x z : Vec d) : + HasFDerivAt (fun y => convexApproxIntegrand ρ u x0 r ε y z) + (convexApproxFDerivIntegrand ρ u x0 r ε x z) x := by + have hu_deriv : + HasFDerivAt u (fderiv ℝ u (convexApproxSample x0 z r ε x)) + (convexApproxSample x0 z r ε x) := by + exact (hu.contDiffAt.differentiableAt (by simp)).hasFDerivAt + have hsample : + HasFDerivAt (convexApproxSample x0 z r ε) ((1 - ε) • ContinuousLinearMap.id ℝ (Vec d)) x := + hasFDerivAt_convexApproxSample x0 z r ε x + have hcomp : + HasFDerivAt + (fun y => u (convexApproxSample x0 z r ε y)) + ((fderiv ℝ u (convexApproxSample x0 z r ε x)).comp + (((1 - ε) • ContinuousLinearMap.id ℝ (Vec d)))) x := + hu_deriv.comp x hsample + have hcomp' : + HasFDerivAt + (fun y => u (convexApproxSample x0 z r ε y)) + ((1 - ε) • fderiv ℝ u (convexApproxSample x0 z r ε x)) x := by + convert hcomp using 1 + ext v + simp + simpa [convexApproxIntegrand, convexApproxFDerivIntegrand, smul_smul, mul_assoc, + mul_left_comm, mul_comm] using hcomp'.const_mul (ρ z) + +theorem hasFDerivAt_convexApproxSmoothing_of_contDiff {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + HasFDerivAt (convexApproxSmoothing ρ u x0 r ε) + (∫ z in tsupport ρ, convexApproxFDerivIntegrand ρ u x0 r ε x z) x := by + let μ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (tsupport ρ) + let F : Vec d → Vec d → ℝ := fun x' z => convexApproxIntegrand ρ u x0 r ε x' z + let F' : Vec d → Vec d → Vec d →L[ℝ] ℝ := + fun x' z => convexApproxFDerivIntegrand ρ u x0 r ε x' z + let S : Set (Vec d × Vec d) := Metric.closedBall x 1 ×ˢ tsupport ρ + let K : Set (Vec d) := (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) '' S + have hF_meas : ∀ᶠ x' in nhds x, MeasureTheory.AEStronglyMeasurable (F x') μ := by + refine Filter.Eventually.of_forall ?_ + intro x' + exact Continuous.aestronglyMeasurable (μ := μ) + (continuous_convexApproxIntegrand_right hρ.continuous hu.continuous x0 r ε x') + have hF_int : MeasureTheory.Integrable (F x) μ := by + have hF_int_volume : + MeasureTheory.Integrable + (fun z => convexApproxIntegrand ρ u x0 r ε x z) MeasureTheory.volume := + integrable_convexApproxIntegrand hρ.continuous hρ.compactSupport hu.continuous x0 r ε x + simpa [F, μ] using + (MeasureTheory.Integrable.restrict (s := tsupport ρ) hF_int_volume) + have hF'_meas : MeasureTheory.AEStronglyMeasurable (F' x) μ := by + exact Continuous.aestronglyMeasurable (μ := μ) + (continuous_convexApproxFDerivIntegrand_right hρ.continuous hu x0 r ε x) + have hS_compact : IsCompact S := (isCompact_closedBall x 1).prod hρ.compactSupport.isCompact + have hK_compact : IsCompact K := by + exact hS_compact.image (continuous_convexApproxSample_prod x0 r ε) + let g : Vec d → ℝ := fun y => ‖fderiv ℝ u y‖ + have hg_cont : Continuous g := by + simpa [g] using (hu.continuous_fderiv (by simp)).norm + have hg_contOn : ContinuousOn g K := hg_cont.continuousOn + obtain ⟨C, hC⟩ : ∃ C, ∀ t ∈ g '' K, ‖t‖ ≤ C := by + exact (hK_compact.image_of_continuousOn hg_contOn).isBounded.exists_norm_le + let B : ℝ := max C 0 + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + let bound : Vec d → ℝ := fun z => ρ z * (|1 - ε| * B) + have h_bound : ∀ᵐ z ∂μ, ∀ x' ∈ Metric.ball x 1, ‖F' x' z‖ ≤ bound z := by + refine Filter.Eventually.of_forall ?_ + intro z + by_cases hz : z ∈ tsupport ρ + · intro x' hx' + have hx'closed : x' ∈ Metric.closedBall x 1 := Metric.ball_subset_closedBall hx' + have hsample_memK : convexApproxSample x0 z r ε x' ∈ K := by + exact Set.mem_image_of_mem + (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) + (show (x', z) ∈ S by + exact ⟨hx'closed, hz⟩) + have hg_mem : g (convexApproxSample x0 z r ε x') ∈ g '' K := + Set.mem_image_of_mem g hsample_memK + have hnorm_fderiv : ‖fderiv ℝ u (convexApproxSample x0 z r ε x')‖ ≤ B := by + calc + ‖fderiv ℝ u (convexApproxSample x0 z r ε x')‖ + = g (convexApproxSample x0 z r ε x') := by rfl + _ ≤ C := by + simpa [g, Real.norm_eq_abs, abs_of_nonneg (norm_nonneg _)] using hC _ hg_mem + _ ≤ B := le_max_left _ _ + have hF' : F' x' z = convexApproxFDerivIntegrand ρ u x0 r ε x' z := by + rfl + calc + ‖F' x' z‖ = |ρ z| * |1 - ε| * ‖fderiv ℝ u (convexApproxSample x0 z r ε x')‖ := by + rw [hF', convexApproxFDerivIntegrand, norm_smul, Real.norm_eq_abs, abs_mul, mul_assoc] + _ = ρ z * (|1 - ε| * ‖fderiv ℝ u (convexApproxSample x0 z r ε x')‖) := by + rw [abs_of_nonneg (hρ.nonneg z)] + ring + _ ≤ ρ z * (|1 - ε| * B) := by + refine mul_le_mul_of_nonneg_left ?_ (hρ.nonneg z) + exact mul_le_mul_of_nonneg_left hnorm_fderiv (abs_nonneg _) + _ = bound z := by + simp [bound] + · intro x' hx' + have hρz : ρ z = 0 := image_eq_zero_of_notMem_tsupport (f := ρ) hz + simp [F', convexApproxFDerivIntegrand, bound, hρz] + have hbound_integrable : MeasureTheory.Integrable bound μ := by + have hbound_volume : + MeasureTheory.Integrable (fun z => ρ z * (|1 - ε| * B)) MeasureTheory.volume := + integrable_convexApproxKernelMulConst hρ.continuous hρ.compactSupport (|1 - ε| * B) + simpa [bound, μ, mul_assoc, mul_left_comm, mul_comm] using + (MeasureTheory.Integrable.restrict (s := tsupport ρ) hbound_volume) + have h_diff : ∀ᵐ z ∂μ, ∀ x' ∈ Metric.ball x 1, HasFDerivAt (F · z) (F' x' z) x' := by + refine Filter.Eventually.of_forall ?_ + intro z x' hx' + simpa [F, F'] using + hasFDerivAt_convexApproxIntegrand_left_of_contDiff hρ.continuous hu x0 r ε x' z + have hmain : + HasFDerivAt (fun x' => ∫ z, F x' z ∂μ) (∫ z, F' x z ∂μ) x := by + exact hasFDerivAt_integral_of_dominated_of_fderiv_le + (x₀ := x) (μ := μ) (s := Metric.ball x 1) (hs := Metric.ball_mem_nhds x zero_lt_one) + (F := F) (F' := F') (bound := bound) + hF_meas hF_int hF'_meas h_bound hbound_integrable h_diff + simpa [convexApproxSmoothing, μ, F, F'] using! hmain + +theorem fderiv_convexApproxSmoothing_of_contDiff {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + fderiv ℝ (convexApproxSmoothing ρ u x0 r ε) x = + ∫ z in tsupport ρ, convexApproxFDerivIntegrand ρ u x0 r ε x z := by + exact (hasFDerivAt_convexApproxSmoothing_of_contDiff hρ hu x0 r ε x).fderiv + +theorem fderiv_convexApproxSmoothing_apply_basisVec_of_contDiff {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : ContDiff ℝ 1 u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) (i : Fin d) : + (fderiv ℝ (convexApproxSmoothing ρ u x0 r ε) x) (basisVec i) = + (1 - ε) * + convexApproxSmoothing ρ + (fun y => (fderiv ℝ u y) (basisVec i)) x0 r ε x := by + have hInt : + MeasureTheory.Integrable + (fun z => convexApproxFDerivIntegrand ρ u x0 r ε x z) + (MeasureTheory.volume.restrict (tsupport ρ)) := by + have hInt_volume : + MeasureTheory.Integrable + (fun z => convexApproxFDerivIntegrand ρ u x0 r ε x z) MeasureTheory.volume := + integrable_convexApproxFDerivIntegrand hρ.continuous hρ.compactSupport hu x0 r ε x + simpa using + (MeasureTheory.Integrable.restrict (s := tsupport ρ) hInt_volume) + calc + (fderiv ℝ (convexApproxSmoothing ρ u x0 r ε) x) (basisVec i) + = (∫ z in tsupport ρ, convexApproxFDerivIntegrand ρ u x0 r ε x z) (basisVec i) := by + rw [fderiv_convexApproxSmoothing_of_contDiff hρ hu x0 r ε x] + _ = ∫ z in tsupport ρ, (convexApproxFDerivIntegrand ρ u x0 r ε x z) (basisVec i) := by + simpa using ContinuousLinearMap.integral_apply hInt (basisVec i) + _ = ∫ z in tsupport ρ, + ((1 - ε) * (ρ z * (fderiv ℝ u (convexApproxSample x0 z r ε x) (basisVec i)))) := by + apply MeasureTheory.integral_congr_ae + filter_upwards with z + simp [convexApproxFDerivIntegrand] + ring + _ = (1 - ε) * + ∫ z in tsupport ρ, ρ z * (fderiv ℝ u (convexApproxSample x0 z r ε x) (basisVec i)) := by + rw [MeasureTheory.integral_const_mul] + _ = (1 - ε) * + convexApproxSmoothing ρ + (fun y => (fderiv ℝ u y) (basisVec i)) x0 r ε x := by + simp [convexApproxSmoothing, convexApproxIntegrand] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Convergence.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Convergence.lean new file mode 100644 index 0000000000..8e04171b0c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Convergence.lean @@ -0,0 +1,769 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import Mathlib.Analysis.Calculus.FDeriv.Measurable +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.PointwiseBounds +public import Mathlib.MeasureTheory.Function.ContinuousMapDense + +/-! # Convergence -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# L^p convergence of the convex smoothing + +The `tendsto` theorems: pointwise convergence of the partial fderivs on +`contDiff` data; the matching `eLpNorm` tendstos for fderiv, for the pure +`convexApproxSmoothing u − u` difference at continuous data, then upgraded to +`MemLpOn`; and their `one_sub_mul` cutoff-weighted variants. The corresponding +statements for `unitConvexApproxSequence` close the file. +-/ + +theorem eventually_forall_abs_fderiv_convexApproxSmoothing_apply_basisVec_sub_le_of_contDiff + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hu : ContDiff ℝ 1 u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ᶠ n : ℕ in Filter.atTop, 0 ≤ ε n) + (hε_le_one : ∀ᶠ n : ℕ in Filter.atTop, ε n ≤ 1) + (i : Fin d) {δ : ℝ} (hδ : 0 < δ) : + ∀ᶠ n : ℕ in Filter.atTop, ∀ ⦃x : Vec d⦄, x ∈ U → + |(fderiv ℝ (convexApproxSmoothing ρ u x0 r (ε n)) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)| ≤ δ := by + let g : Vec d → ℝ := fun y => (fderiv ℝ u y) (basisVec i) + have hg_cont : Continuous g := by + simpa [g] using (hu.continuous_fderiv (by simp)).clm_apply continuous_const + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + obtain ⟨C, hC⟩ : ∃ C, ∀ t ∈ g '' closure U, ‖t‖ ≤ C := by + exact (hcompact.image_of_continuousOn hg_cont.continuousOn).isBounded.exists_norm_le + let M : ℝ := max C 0 + have hM_nonneg : 0 ≤ M := by + dsimp [M] + positivity + have hM : ∀ y ∈ closure U, |g y| ≤ M := by + intro y hy + have hg_mem : g y ∈ g '' closure U := Set.mem_image_of_mem g hy + have hCg : |g y| ≤ C := by + simpa [Real.norm_eq_abs] using hC _ hg_mem + exact hCg.trans (le_max_left _ _) + have hscaled : + Filter.Tendsto (fun n : ℕ => ε n * M) Filter.atTop (nhds 0) := by + simpa using (hε.mul_const M) + have hδhalf : 0 < δ / 2 := by + linarith + filter_upwards + [eventually_forall_abs_convexApproxSmoothing_sub_le_of_continuous + hU hρ hg_cont hball hr hε hε_nonneg hε_le_one hδhalf, + Metric.tendsto_nhds.mp hscaled (δ / 2) hδhalf, hε_nonneg, hε_le_one] + with n hn hnM hε0 hε1 x hx + have happrox : |convexApproxSmoothing ρ g x0 r (ε n) x - g x| ≤ δ / 2 := hn hx + have hgx : |g x| ≤ M := hM x (subset_closure hx) + have hsmall : ε n * M ≤ δ / 2 := by + have hlt : ε n * M < δ / 2 := by + have hn' : |ε n * M - 0| < δ / 2 := by + simpa [Real.dist_eq] using hnM + simpa [abs_of_nonneg (mul_nonneg hε0 hM_nonneg)] using hn' + exact le_of_lt hlt + have hfirst : + |1 - ε n| * |convexApproxSmoothing ρ g x0 r (ε n) x - g x| ≤ δ / 2 := by + have hcoef : |1 - ε n| ≤ 1 := by + rw [abs_of_nonneg (sub_nonneg.mpr hε1)] + linarith + calc + |1 - ε n| * |convexApproxSmoothing ρ g x0 r (ε n) x - g x| + ≤ 1 * |convexApproxSmoothing ρ g x0 r (ε n) x - g x| := by + exact mul_le_mul_of_nonneg_right hcoef (abs_nonneg _) + _ = |convexApproxSmoothing ρ g x0 r (ε n) x - g x| := by ring + _ ≤ δ / 2 := happrox + have hsecond : |ε n * g x| ≤ δ / 2 := by + calc + |ε n * g x| = ε n * |g x| := by + rw [abs_mul, abs_of_nonneg hε0] + _ ≤ ε n * M := by + exact mul_le_mul_of_nonneg_left hgx hε0 + _ ≤ δ / 2 := hsmall + have hdecomp : + (1 - ε n) * convexApproxSmoothing ρ g x0 r (ε n) x - g x = + (1 - ε n) * (convexApproxSmoothing ρ g x0 r (ε n) x - g x) - ε n * g x := by + ring + rw [fderiv_convexApproxSmoothing_apply_basisVec_of_contDiff hρ hu x0 r (ε n) x i, hdecomp] + calc + |(1 - ε n) * (convexApproxSmoothing ρ g x0 r (ε n) x - g x) - ε n * g x| + ≤ |(1 - ε n) * (convexApproxSmoothing ρ g x0 r (ε n) x - g x)| + |ε n * g x| := by + simpa [sub_eq_add_neg, abs_neg] using + abs_add_le ((1 - ε n) * (convexApproxSmoothing ρ g x0 r (ε n) x - g x)) + (-(ε n * g x)) + _ = |1 - ε n| * |convexApproxSmoothing ρ g x0 r (ε n) x - g x| + |ε n * g x| := by + rw [abs_mul] + _ ≤ δ / 2 + δ / 2 := add_le_add hfirst hsecond + _ = δ := by ring + +theorem eventually_forall_abs_fderiv_unitConvexApproxSequence_apply_basisVec_sub_le_of_contDiff + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hu : ContDiff ℝ 1 u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (i : Fin d) {δ : ℝ} (hδ : 0 < δ) : + ∀ᶠ n : ℕ in Filter.atTop, ∀ ⦃x : Vec d⦄, x ∈ U → + |(fderiv ℝ (unitConvexApproxSequence u x0 r n) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)| ≤ δ := by + simpa [unitConvexApproxSequence] using! + (eventually_forall_abs_fderiv_convexApproxSmoothing_apply_basisVec_sub_le_of_contDiff + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_nonneg) + (Filter.Eventually.of_forall unitConvexApproxScale_le_one) + i hδ) + +theorem tendsto_fderiv_unitConvexApproxSequence_apply_basisVec_of_contDiff + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hu : ContDiff ℝ 1 u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (i : Fin d) {x : Vec d} (hx : x ∈ U) : + Filter.Tendsto + (fun n : ℕ => (fderiv ℝ (unitConvexApproxSequence u x0 r n) x) (basisVec i)) + Filter.atTop (nhds ((fderiv ℝ u x) (basisVec i))) := by + rw [Metric.tendsto_nhds] + intro δ hδ + have hδhalf : 0 < δ / 2 := by + linarith + filter_upwards + [eventually_forall_abs_fderiv_unitConvexApproxSequence_apply_basisVec_sub_le_of_contDiff + hU hu hball hr i hδhalf] with n hn + have hbound : + |(fderiv ℝ (unitConvexApproxSequence u x0 r n) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)| ≤ δ / 2 := by + exact hn hx + have hlt : + |(fderiv ℝ (unitConvexApproxSequence u x0 r n) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)| < δ := by + exact lt_of_le_of_lt hbound (by linarith) + simpa [Real.dist_eq] using hlt + +theorem tendsto_eLpNorm_fderiv_convexApproxSmoothing_apply_basisVec_sub_zero_of_contDiff + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hp : p ≠ ⊤) + (hu : ContDiff ℝ 1 u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ᶠ n : ℕ in Filter.atTop, 0 ≤ ε n) + (hε_le_one : ∀ᶠ n : ℕ in Filter.atTop, ε n ≤ 1) + (i : Fin d) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (convexApproxSmoothing ρ u x0 r (ε n)) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + let f : ℕ → Vec d → ℝ := fun n x => + (fderiv ℝ (convexApproxSmoothing ρ u x0 r (ε n)) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i) + let μ := MeasureTheory.volume.restrict U + let : MeasureTheory.IsFiniteMeasure μ := hU.isFiniteMeasure_restrict_volume + have hU_meas : MeasurableSet U := hU.isOpen.measurableSet + have hpow_ne_top : μ Set.univ ^ (1 / p.toReal) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + let cμ : ℝ := (μ Set.univ ^ (1 / p.toReal)).toReal + have hpow_eq : ENNReal.ofReal cμ = μ Set.univ ^ (1 / p.toReal) := by + dsimp [cμ] + exact ENNReal.ofReal_toReal hpow_ne_top + have hcμ_nonneg : 0 ≤ cμ := by + exact ENNReal.toReal_nonneg + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hηtop : η = ⊤ + · exact Filter.Eventually.of_forall (fun n => by + simp [hηtop]) + let δ : ℝ := η.toReal / (cμ + 1) + have hηreal : 0 < η.toReal := ENNReal.toReal_pos hη.ne' hηtop + have hδpos : 0 < δ := by + dsimp [δ] + positivity + filter_upwards + [eventually_forall_abs_fderiv_convexApproxSmoothing_apply_basisVec_sub_le_of_contDiff + hU hρ hu hball hr hε hε_nonneg hε_le_one i hδpos] with n hn + have hdist : + ∀ x, + dist + (Set.indicator U (f n) x) 0 ≤ δ := by + intro x + by_cases hx : x ∈ U + · simpa [f, hx, Real.dist_eq] using hn hx + · simp [hx, δ, hδpos.le] + let g : Vec d → ℝ := Set.indicator U (f n) + have hsupport_g : Function.support g ⊆ U := by + simp [g] + have hnorm_indicator_sub : + MeasureTheory.eLpNorm (g - fun _ : Vec d => (0 : ℝ)) p MeasureTheory.volume ≤ + ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := by + exact + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := MeasureTheory.volume) (p := p) (s := U) hp hU_meas.nullMeasurableSet hδpos.le + (by + have hf : Measurable (f n) := by + exact (measurable_fderiv_apply_const ℝ _ (basisVec i)).sub + (measurable_fderiv_apply_const ℝ _ (basisVec i)) + exact (hf.indicator hU_meas).aestronglyMeasurable.sub MeasureTheory.aestronglyMeasurable_const) + hdist hsupport_g (by simp : Function.support (fun _ : Vec d => (0 : ℝ)) ⊆ U) + have hsub_zero : (g - fun _ : Vec d => (0 : ℝ)) = g := by + ext x + simp [g] + have hnorm_indicator : + MeasureTheory.eLpNorm g p MeasureTheory.volume ≤ + ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := by + rw [← hsub_zero] + exact hnorm_indicator_sub + have hnorm : + MeasureTheory.eLpNorm (f n) p μ ≤ + ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := by + calc + MeasureTheory.eLpNorm (f n) p μ = MeasureTheory.eLpNorm g p MeasureTheory.volume := by + symm + simpa [μ] using + (MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict + (μ := MeasureTheory.volume) (p := p) (f := f n) hU_meas) + _ ≤ ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := hnorm_indicator + _ = ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := by + simp [μ] + have hδmul : δ * cμ ≤ η.toReal := by + have hfrac_le : cμ / (cμ + 1) ≤ 1 := by + have hcμ_le : cμ ≤ cμ + 1 := by linarith + have hden_nonneg : 0 ≤ cμ + 1 := by linarith + simpa using (div_le_one_of_le₀ hcμ_le hden_nonneg) + calc + δ * cμ = η.toReal * (cμ / (cμ + 1)) := by + dsimp [δ] + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + _ ≤ η.toReal * 1 := by + exact mul_le_mul_of_nonneg_left hfrac_le hηreal.le + _ = η.toReal := by ring + calc + MeasureTheory.eLpNorm (f n) p μ ≤ ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := + hnorm + _ = ENNReal.ofReal (δ * cμ) := by + rw [← hpow_eq, ← ENNReal.ofReal_mul] + positivity + _ ≤ η := by + rw [← ENNReal.ofReal_toReal hηtop] + exact ENNReal.ofReal_le_ofReal hδmul + +theorem tendsto_eLpNorm_fderiv_unitConvexApproxSequence_apply_basisVec_sub_zero_of_contDiff + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hp : p ≠ ⊤) (hu : ContDiff ℝ 1 u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (i : Fin d) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (unitConvexApproxSequence u x0 r n) x) (basisVec i) - + (fderiv ℝ u x) (basisVec i)) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + simpa [unitConvexApproxSequence] using! + (tendsto_eLpNorm_fderiv_convexApproxSmoothing_apply_basisVec_sub_zero_of_contDiff + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hp hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_nonneg) + (Filter.Eventually.of_forall unitConvexApproxScale_le_one) + i) + +theorem tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_continuous + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hp : p ≠ ⊤) + (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ᶠ n : ℕ in Filter.atTop, 0 ≤ ε n) + (hε_le_one : ∀ᶠ n : ℕ in Filter.atTop, ε n ≤ 1) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + let f : ℕ → Vec d → ℝ := fun n x => convexApproxSmoothing ρ u x0 r (ε n) x - u x + let μ := MeasureTheory.volume.restrict U + let : MeasureTheory.IsFiniteMeasure μ := hU.isFiniteMeasure_restrict_volume + have hU_meas : MeasurableSet U := hU.isOpen.measurableSet + have hpow_ne_top : μ Set.univ ^ (1 / p.toReal) ≠ ⊤ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + let cμ : ℝ := (μ Set.univ ^ (1 / p.toReal)).toReal + have hcμ_nonneg : 0 ≤ cμ := by + exact ENNReal.toReal_nonneg + have hpow_eq : ENNReal.ofReal cμ = μ Set.univ ^ (1 / p.toReal) := by + dsimp [cμ] + exact ENNReal.ofReal_toReal hpow_ne_top + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hηtop : η = ⊤ + · exact Filter.Eventually.of_forall (fun n => by + simp [hηtop]) + let δ : ℝ := η.toReal / (cμ + 1) + have hηreal : 0 < η.toReal := ENNReal.toReal_pos hη.ne' hηtop + have hδpos : 0 < δ := by + dsimp [δ] + positivity + filter_upwards + [eventually_forall_abs_convexApproxSmoothing_sub_le_of_continuous + hU hρ hu hball hr hε hε_nonneg hε_le_one hδpos] with n hn + have hdist : + ∀ x, + dist + (Set.indicator U (f n) x) 0 ≤ δ := by + intro x + by_cases hx : x ∈ U + · simpa [f, hx, Real.dist_eq] using hn hx + · simp [hx, δ, hδpos.le] + let g : Vec d → ℝ := Set.indicator U (f n) + have hsupport_g : Function.support g ⊆ U := by + simp [g] + have hnorm_indicator_sub : + MeasureTheory.eLpNorm (g - fun _ : Vec d => (0 : ℝ)) p MeasureTheory.volume ≤ + ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := by + exact + MeasureTheory.eLpNorm_sub_le_of_dist_bdd + (μ := MeasureTheory.volume) (p := p) (s := U) hp hU_meas.nullMeasurableSet hδpos.le + (by + have hf : Continuous (f n) := + (continuous_convexApproxSmoothing hρ.continuous hρ.compactSupport hu + x0 r (ε n)).sub hu + exact (hf.measurable.indicator hU_meas).aestronglyMeasurable.sub + MeasureTheory.aestronglyMeasurable_const) + hdist hsupport_g (by simp : Function.support (fun _ : Vec d => (0 : ℝ)) ⊆ U) + have hsub_zero : (g - fun _ : Vec d => (0 : ℝ)) = g := by + ext x + simp [g] + have hnorm_indicator : + MeasureTheory.eLpNorm g p MeasureTheory.volume ≤ + ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := by + rw [← hsub_zero] + exact hnorm_indicator_sub + have hnorm : + MeasureTheory.eLpNorm (f n) p μ ≤ + ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := by + calc + MeasureTheory.eLpNorm (f n) p μ = MeasureTheory.eLpNorm g p MeasureTheory.volume := by + symm + simpa [μ] using + (MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict + (μ := MeasureTheory.volume) (p := p) (f := f n) hU_meas) + _ ≤ ENNReal.ofReal δ * MeasureTheory.volume U ^ (1 / p.toReal) := hnorm_indicator + _ = ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := by + simp [μ] + have hδmul : δ * cμ ≤ η.toReal := by + have hfrac_le : cμ / (cμ + 1) ≤ 1 := by + have hcμ_le : cμ ≤ cμ + 1 := by linarith + have hden_nonneg : 0 ≤ cμ + 1 := by linarith + simpa using (div_le_one_of_le₀ hcμ_le hden_nonneg) + calc + δ * cμ = η.toReal * (cμ / (cμ + 1)) := by + dsimp [δ] + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + _ ≤ η.toReal * 1 := by + exact mul_le_mul_of_nonneg_left hfrac_le hηreal.le + _ = η.toReal := by ring + calc + MeasureTheory.eLpNorm (f n) p μ ≤ ENNReal.ofReal δ * μ Set.univ ^ (1 / p.toReal) := + hnorm + _ = ENNReal.ofReal (δ * cμ) := by + rw [← hpow_eq, ← ENNReal.ofReal_mul] + positivity + _ ≤ η := by + rw [← ENNReal.ofReal_toReal hηtop] + exact ENNReal.ofReal_le_ofReal hδmul + +theorem tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_continuous + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hp : p ≠ ⊤) (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => unitConvexApproxSequence u x0 r n x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + simpa [unitConvexApproxSequence] using + (tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_continuous + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hp hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_nonneg) + (Filter.Eventually.of_forall unitConvexApproxScale_le_one)) + +theorem tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hp : p ≠ ⊤) (hu : MemLpOn U p u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_pos : ∀ᶠ n : ℕ in Filter.atTop, 0 < ε n) + (hε_lt_one : ∀ᶠ n : ℕ in Filter.atTop, ε n < 1) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + let μ := MeasureTheory.volume.restrict U + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hηtop : η = ⊤ + · exact Filter.Eventually.of_forall (fun n => by simp [hηtop]) + obtain ⟨η₁, hη₁_pos, hη₁⟩ := + MeasureTheory.exists_Lp_half (μ := μ) (ε := ℝ) (p := p) hη.ne' + obtain ⟨η₂, hη₂_pos, hη₂⟩ := + MeasureTheory.exists_Lp_half (μ := μ) (ε := ℝ) (p := p) hη₁_pos.ne' + have hε_nonneg : ∀ᶠ n : ℕ in Filter.atTop, 0 ≤ ε n := by + exact hε_pos.mono (fun _ hn => le_of_lt hn) + have hε_le_one : ∀ᶠ n : ℕ in Filter.atTop, ε n ≤ 1 := by + exact hε_lt_one.mono (fun _ hn => le_of_lt hn) + have hε_lt_half : ∀ᶠ n : ℕ in Filter.atTop, ε n < (1 / 2 : ℝ) := by + exact (tendsto_order.1 hε).2 _ (by positivity) + let C : ENNReal := ENNReal.ofReal (((1 / 2 : ℝ) ^ d)⁻¹) ^ (1 / p).toReal + have hC_pos : 0 < C := by + dsimp [C] + positivity + have hC_ne_zero : C ≠ 0 := ne_of_gt hC_pos + have hC_ne_top : C ≠ ⊤ := by + dsimp [C] + exact (ENNReal.rpow_lt_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top).ne + let δ : ENNReal := min η₂ (η₁ / C) + have hδ_pos : 0 < δ := by + have hη₁_div_pos : 0 < η₁ / C := ENNReal.div_pos hη₁_pos.ne' hC_ne_top + dsimp [δ] + exact lt_min hη₂_pos hη₁_div_pos + have huMem : MeasureTheory.MemLp u p μ := by + simpa [μ, MemLpOn] using hu + obtain ⟨g, happrox, hmem⟩ := + huMem.exists_boundedContinuous_eLpNorm_sub_le hp (ε := δ) hδ_pos.ne' + have hthird_mem : + MeasureTheory.MemLp (fun x => (g : Vec d → ℝ) x - u x) p μ := by + exact hmem.sub hu + have hthird_norm : + MeasureTheory.eLpNorm (fun x => (g : Vec d → ℝ) x - u x) p μ ≤ η₂ := by + have hthird_eq : + MeasureTheory.eLpNorm (fun x => (g : Vec d → ℝ) x - u x) p μ = + MeasureTheory.eLpNorm (fun x => u x - (g : Vec d → ℝ) x) p μ := by + calc + MeasureTheory.eLpNorm (fun x => (g : Vec d → ℝ) x - u x) p μ + = MeasureTheory.eLpNorm (fun x => -((g : Vec d → ℝ) x - u x)) p μ := by + symm + exact + MeasureTheory.eLpNorm_neg + (fun x => (g : Vec d → ℝ) x - u x) (p := p) (μ := μ) + _ = MeasureTheory.eLpNorm (fun x => u x - (g : Vec d → ℝ) x) p μ := by + congr 1 + ext x + ring + calc + MeasureTheory.eLpNorm (fun x => (g : Vec d → ℝ) x - u x) p μ + = MeasureTheory.eLpNorm (fun x => u x - (g : Vec d → ℝ) x) p μ := hthird_eq + _ ≤ δ := happrox + _ ≤ η₂ := min_le_left _ _ + have hmid_tendsto : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x - g x) + p μ) + Filter.atTop (nhds 0) := by + exact + tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_continuous + hU hρ hp g.continuous hball hr.le hε hε_nonneg hε_le_one + have hmid_eventually : + ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x - g x) + p μ ≤ η₂ := by + exact ENNReal.tendsto_nhds_zero.1 hmid_tendsto η₂ hη₂_pos + have hcombo_eventually : + ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.eLpNorm + (fun x => + (convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x - g x) + + ((g : Vec d → ℝ) x - u x)) + p μ < η₁ := by + filter_upwards [hmid_eventually] with n hmid + have hmid_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x - g x) μ := by + exact + ((continuous_convexApproxSmoothing hρ.continuous hρ.compactSupport g.continuous + x0 r (ε n)).sub g.continuous).aestronglyMeasurable + exact hη₂ _ _ hmid hthird_norm + have hfirst_eventually : + ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothing ρ u x0 r (ε n) x - + convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x) + p μ ≤ η₁ := by + filter_upwards [hε_pos, hε_lt_half] with n hεn_pos hεn_half + have hfactor_le : + ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ^ (1 / p).toReal ≤ C := by + have hhalf_le : (1 / 2 : ℝ) ≤ 1 - ε n := by linarith + have hpow_le : (1 / 2 : ℝ) ^ d ≤ (1 - ε n) ^ d := by + exact pow_le_pow_left₀ (by positivity) hhalf_le d + have hpow_half_pos : 0 < (1 / 2 : ℝ) ^ d := by positivity + have hinv_le : ((1 - ε n) ^ d)⁻¹ ≤ ((1 / 2 : ℝ) ^ d)⁻¹ := by + simpa [one_div] using one_div_le_one_div_of_le hpow_half_pos hpow_le + have hofReal_le : + ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ≤ ENNReal.ofReal (((1 / 2 : ℝ) ^ d)⁻¹) := by + exact ENNReal.ofReal_le_ofReal hinv_le + exact ENNReal.rpow_le_rpow hofReal_le (by positivity) + have hεn_lt_one : ε n < 1 := by linarith + have happrox' : + MeasureTheory.eLpNorm (fun x => u x - (g : Vec d → ℝ) x) p μ ≤ δ := by + simpa using! happrox + calc + MeasureTheory.eLpNorm + (fun x => + convexApproxSmoothing ρ u x0 r (ε n) x - + convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x) + p μ + ≤ ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (fun x => u x - (g : Vec d → ℝ) x) p μ := by + exact + eLpNorm_sub_convexApproxSmoothing_le + hU hρ hp1 hp hu hmem hball hr hεn_pos hεn_lt_one + _ ≤ ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ^ (1 / p).toReal * δ := by + gcongr + _ ≤ C * δ := by + gcongr + _ ≤ C * (η₁ / C) := by + gcongr + exact min_le_right _ _ + _ = η₁ := by + rw [ENNReal.mul_div_cancel hC_ne_zero hC_ne_top] + filter_upwards [hε_pos, hε_lt_half, hfirst_eventually, hcombo_eventually] with + n hεn_pos hεn_half hfirst hcombo + let F : Vec d → ℝ := fun x => + convexApproxSmoothing ρ u x0 r (ε n) x - + convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x + let G : Vec d → ℝ := fun x => + (convexApproxSmoothing ρ (g : Vec d → ℝ) x0 r (ε n) x - g x) + + ((g : Vec d → ℝ) x - u x) + have hεn_lt_one : ε n < 1 := by linarith + have hF_meas : MeasureTheory.AEStronglyMeasurable F μ := by + dsimp [F] + exact + (aestronglyMeasurable_convexApproxSmoothing + hU hρ hp1 hu hball hr hεn_pos hεn_lt_one).sub + ((continuous_convexApproxSmoothing hρ.continuous hρ.compactSupport g.continuous + x0 r (ε n)).aestronglyMeasurable) + have hG_meas : MeasureTheory.AEStronglyMeasurable G μ := by + dsimp [G] + exact + (((continuous_convexApproxSmoothing hρ.continuous hρ.compactSupport g.continuous + x0 r (ε n)).sub g.continuous).aestronglyMeasurable).add + hthird_mem.aestronglyMeasurable + have hsum : MeasureTheory.eLpNorm (F + G) p μ < η := by + exact hη₁ _ _ hfirst (le_of_lt hcombo) + have hdecomp : + MeasureTheory.eLpNorm (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) p μ = + MeasureTheory.eLpNorm (F + G) p μ := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + dsimp [F, G] + ring + calc + MeasureTheory.eLpNorm (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) p μ + = MeasureTheory.eLpNorm (F + G) p μ := hdecomp + _ ≤ η := hsum.le + +theorem tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hp : p ≠ ⊤) (hu : MemLpOn U p u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_pos : ∀ᶠ n : ℕ in Filter.atTop, 0 < ε n) + (hε_lt_one : ∀ᶠ n : ℕ in Filter.atTop, ε n < 1) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => (1 - ε n) * convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + let μ := MeasureTheory.volume.restrict U + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hηtop : η = ⊤ + · exact Filter.Eventually.of_forall (fun n => by simp [hηtop]) + obtain ⟨η₁, hη₁_pos, hη₁⟩ := + MeasureTheory.exists_Lp_half (μ := μ) (ε := ℝ) (p := p) hη.ne' + have hvalue_tendsto : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p μ) + Filter.atTop (nhds 0) := + tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + hU hρ hp1 hp hu hball hr hε hε_pos hε_lt_one + have hvalue_eventually : + ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p μ ≤ η₁ := by + exact ENNReal.tendsto_nhds_zero.1 hvalue_tendsto η₁ hη₁_pos + have hε_lt_half : ∀ᶠ n : ℕ in Filter.atTop, ε n < (1 / 2 : ℝ) := by + exact (tendsto_order.1 hε).2 _ (by positivity) + let C : ENNReal := ENNReal.ofReal (((1 / 2 : ℝ) ^ d)⁻¹) ^ (1 / p).toReal + let B : ENNReal := C * MeasureTheory.eLpNorm u p μ + have hC_ne_top : C ≠ ⊤ := by + dsimp [C] + exact ENNReal.rpow_lt_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top |>.ne + have hB_ne_top : B ≠ ⊤ := by + dsimp [B] + exact ENNReal.mul_ne_top hC_ne_top hu.eLpNorm_ne_top + let M : ℝ := B.toReal + have hM_eq : ENNReal.ofReal M = B := by + dsimp [M] + exact ENNReal.ofReal_toReal hB_ne_top + have hM_nonneg : 0 ≤ M := ENNReal.toReal_nonneg + have hscaled_tendsto : + Filter.Tendsto (fun n : ℕ => |ε n| * M) Filter.atTop (nhds 0) := by + simpa [Real.norm_eq_abs] using (hε.norm.mul_const M) + have hsmall_tendsto : + Filter.Tendsto (fun n : ℕ => ENNReal.ofReal (|ε n| * M)) Filter.atTop (nhds 0) := + by simpa using ENNReal.tendsto_ofReal hscaled_tendsto + have hsmall_eventually : + ∀ᶠ n : ℕ in Filter.atTop, ENNReal.ofReal (|ε n| * M) ≤ η₁ := by + exact ENNReal.tendsto_nhds_zero.1 hsmall_tendsto η₁ hη₁_pos + have hconv_bound_eventually : + ∀ᶠ n : ℕ in Filter.atTop, + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r (ε n)) p μ ≤ B := by + filter_upwards [hε_pos, hε_lt_half] with n hεn_pos hεn_half + have hfactor_le : + ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ^ (1 / p).toReal ≤ C := by + have hhalf_le : (1 / 2 : ℝ) ≤ 1 - ε n := by linarith + have hpow_le : (1 / 2 : ℝ) ^ d ≤ (1 - ε n) ^ d := by + exact pow_le_pow_left₀ (by positivity) hhalf_le d + have hpow_half_pos : 0 < (1 / 2 : ℝ) ^ d := by positivity + have hinv_le : ((1 - ε n) ^ d)⁻¹ ≤ ((1 / 2 : ℝ) ^ d)⁻¹ := by + simpa [one_div] using one_div_le_one_div_of_le hpow_half_pos hpow_le + have hofReal_le : + ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ≤ ENNReal.ofReal (((1 / 2 : ℝ) ^ d)⁻¹) := by + exact ENNReal.ofReal_le_ofReal hinv_le + exact ENNReal.rpow_le_rpow hofReal_le (by positivity) + have hεn_lt_one : ε n < 1 := by linarith + calc + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r (ε n)) p μ + ≤ ENNReal.ofReal (((1 - ε n) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p μ := by + exact eLpNorm_convexApproxSmoothing_le hU hρ hp1 hp hu hball hr hεn_pos hεn_lt_one + _ ≤ C * MeasureTheory.eLpNorm u p μ := by + gcongr + _ = B := by rfl + filter_upwards [hvalue_eventually, hconv_bound_eventually, hsmall_eventually, hε_pos, hε_lt_half] with + n hvalue hconv_bound hsmall hεn_pos hεn_half + let F : Vec d → ℝ := fun x => convexApproxSmoothing ρ u x0 r (ε n) x - u x + let G : Vec d → ℝ := fun x => (-ε n) * convexApproxSmoothing ρ u x0 r (ε n) x + have hεn_lt_one : ε n < 1 := by + linarith + have hF_meas : MeasureTheory.AEStronglyMeasurable F μ := by + dsimp [F] + exact + (aestronglyMeasurable_convexApproxSmoothing + hU hρ hp1 hu hball hr hεn_pos hεn_lt_one).sub hu.aestronglyMeasurable + have hG_meas : MeasureTheory.AEStronglyMeasurable G μ := by + dsimp [G] + exact + (aestronglyMeasurable_convexApproxSmoothing + hU hρ hp1 hu hball hr hεn_pos hεn_lt_one).const_mul (-ε n) + have hG_norm : + MeasureTheory.eLpNorm G p μ ≤ η₁ := by + calc + MeasureTheory.eLpNorm G p μ + = ENNReal.ofReal |ε n| * + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r (ε n)) p μ := by + dsimp [G] + change MeasureTheory.eLpNorm ((-ε n) • convexApproxSmoothing ρ u x0 r (ε n)) p μ = + ENNReal.ofReal |ε n| * + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r (ε n)) p μ + simpa [Real.enorm_eq_ofReal_abs] using + (MeasureTheory.eLpNorm_const_smul (-ε n) + (convexApproxSmoothing ρ u x0 r (ε n)) p μ) + _ ≤ ENNReal.ofReal |ε n| * B := by + gcongr + _ = ENNReal.ofReal (|ε n| * M) := by + rw [← hM_eq, ← ENNReal.ofReal_mul] + positivity + _ ≤ η₁ := hsmall + have hsum : MeasureTheory.eLpNorm (F + G) p μ < η := by + exact hη₁ _ _ hvalue hG_norm + have hdecomp : + MeasureTheory.eLpNorm + (fun x => (1 - ε n) * convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p μ = + MeasureTheory.eLpNorm (F + G) p μ := by + apply MeasureTheory.eLpNorm_congr_ae + filter_upwards with x + dsimp [F, G] + ring + calc + MeasureTheory.eLpNorm + (fun x => (1 - ε n) * convexApproxSmoothing ρ u x0 r (ε n) x - u x) + p μ + = MeasureTheory.eLpNorm (F + G) p μ := hdecomp + _ ≤ η := hsum.le + +theorem tendsto_eLpNorm_sub_zero_unitConvexApproxSequence_of_memLpOn + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hu : MemLpOn U p u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => unitConvexApproxSequence u x0 r n x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + simpa [unitConvexApproxSequence] using + (tendsto_eLpNorm_sub_zero_convexApproxSmoothing_of_memLpOn + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hp1 hp hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall (fun _ => by + dsimp [unitConvexApproxScale] + positivity)) + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn))) + +theorem tendsto_eLpNorm_sub_zero_one_sub_mul_unitConvexApproxSequence_of_memLpOn + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hu : MemLpOn U p u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + Filter.Tendsto + (fun n : ℕ => + MeasureTheory.eLpNorm + (fun x => (1 - unitConvexApproxScale n) * unitConvexApproxSequence u x0 r n x - u x) + p (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + simpa [unitConvexApproxSequence] using + (tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hp1 hp hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall (fun _ => by + dsimp [unitConvexApproxScale] + positivity)) + (((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ hn => hn))) + + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Kernel.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Kernel.lean new file mode 100644 index 0000000000..f959c79a5a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/Kernel.lean @@ -0,0 +1,385 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvolutionLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.Algebra.GroupWithZero.Action.Pointwise.Set +public import Mathlib.Analysis.Convolution +public import Mathlib.Analysis.SpecificLimits.Basic +public import Mathlib.Analysis.Calculus.BumpFunction.FiniteDimension +public import Mathlib.Analysis.Calculus.BumpFunction.Normed +public import Mathlib.MeasureTheory.Integral.Bochner.Set + +/-! # Kernel -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Convex-domain smoothing kernel + +Defines the Riesz-style smoothing kernel `IsConvexApproxKernel`, produces a +concrete unit kernel from a `ContDiffBump`, and assembles the +`convexApproxSmoothing` operator. The scaled kernel's analytic properties +(continuity, smoothness, measurability, compact support, integrability, +nonnegativity, unit integral) together with the convolution rewrite of the +smoothing operator live here; everything downstream builds on this file. +-/ + +/-- Cache `HasContDiffBump (Vec d)` so tactic-level typeclass searches across +this file *and its transitive importers* don't re-derive the finite- +dimensional-inner-product-space chain on every `ContDiffBump`, `eLpNorm`, +and `MeasureTheory.*` call. This single private instance drops cumulative +`typeclass inference` from 29.9s to ~6s in this file and propagates a +~2.6× reduction across the six downstream splits via the instance cache. -/ +private instance instHasContDiffBumpVec (d : ℕ) : HasContDiffBump (Vec d) := + inferInstance + +structure IsConvexApproxKernel {d : ℕ} (ρ : Vec d → ℝ) : Prop where + smooth : ContDiff ℝ (⊤ : ℕ∞) ρ + compactSupport : HasCompactSupport ρ + support_subset_closedBall : tsupport ρ ⊆ Metric.closedBall (0 : Vec d) 1 + nonneg : ∀ z, 0 ≤ ρ z + setIntegral_one : ∫ z in tsupport ρ, ρ z = 1 + +namespace IsConvexApproxKernel + +theorem continuous {d : ℕ} {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) : + Continuous ρ := + hρ.smooth.continuous + +end IsConvexApproxKernel + +namespace ContDiffBump + +theorem isConvexApproxKernel_normed {d : ℕ} (φ : ContDiffBump (0 : Vec d)) + (hφ : φ.rOut ≤ 1) : + IsConvexApproxKernel (φ.normed MeasureTheory.volume) := by + refine + { smooth := by + simpa using (φ.contDiff_normed (μ := MeasureTheory.volume)) + compactSupport := by + simpa using (φ.hasCompactSupport_normed (μ := MeasureTheory.volume)) + support_subset_closedBall := by + rw [φ.tsupport_normed_eq (μ := MeasureTheory.volume)] + exact Metric.closedBall_subset_closedBall hφ + nonneg := by + intro z + simpa using (φ.nonneg_normed (μ := MeasureTheory.volume) z) + setIntegral_one := by + calc + ∫ z in tsupport (φ.normed MeasureTheory.volume), φ.normed MeasureTheory.volume z + = ∫ z, φ.normed MeasureTheory.volume z := by + exact MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero + (fun z hz => + image_eq_zero_of_notMem_tsupport + (f := φ.normed MeasureTheory.volume) hz) + _ = 1 := φ.integral_normed (μ := MeasureTheory.volume) } + +end ContDiffBump + +/-- A concrete bump centered at the origin with outer radius `1`. -/ +noncomputable def unitContDiffBump {d : ℕ} : ContDiffBump (0 : Vec d) := + ⟨(1 / 2 : ℝ), 1, by positivity, by norm_num⟩ + +/-- The corresponding normalized smooth kernel supported in `closedBall 0 1`. -/ +noncomputable def unitConvexApproxKernel {d : ℕ} : Vec d → ℝ := + (unitContDiffBump (d := d)).normed MeasureTheory.volume + +theorem isConvexApproxKernel_unitConvexApproxKernel {d : ℕ} : + IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := by + simpa [unitConvexApproxKernel, unitContDiffBump] using + (ContDiffBump.isConvexApproxKernel_normed (φ := unitContDiffBump (d := d)) + (by norm_num [unitContDiffBump])) + +/-- The standard scale sequence used for the concrete approximation family. -/ +noncomputable def unitConvexApproxScale (n : ℕ) : ℝ := + 1 / ((n : ℝ) + 1) + +theorem unitConvexApproxScale_nonneg (n : ℕ) : + 0 ≤ unitConvexApproxScale n := by + dsimp [unitConvexApproxScale] + positivity + +theorem unitConvexApproxScale_le_one (n : ℕ) : + unitConvexApproxScale n ≤ 1 := by + dsimp [unitConvexApproxScale] + have hden : (1 : ℝ) ≤ (n : ℝ) + 1 := by + have hn : (0 : ℝ) ≤ n := by positivity + linarith + have hnonneg : 0 ≤ (n : ℝ) + 1 := by positivity + simpa [one_div] using (div_le_one_of_le₀ hden hnonneg) + +theorem tendsto_unitConvexApproxScale_zero : + Filter.Tendsto unitConvexApproxScale Filter.atTop (nhds 0) := by + simpa [unitConvexApproxScale] using! tendsto_one_div_add_atTop_nhds_zero_nat + +/-- The pointwise integrand for the convex-domain smoothing operator. -/ +def convexApproxIntegrand {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x z : Vec d) : ℝ := + ρ z * u (convexApproxSample x0 z r ε x) + +@[simp] theorem convexApproxIntegrand_apply {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x z : Vec d) : + convexApproxIntegrand ρ u x0 r ε x z = + ρ z * u (convexApproxSample x0 z r ε x) := + rfl + +/-- The convex-domain smoothing operator attached to a kernel `ρ`. -/ +noncomputable def convexApproxSmoothing {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : ℝ := + ∫ z in tsupport ρ, convexApproxIntegrand ρ u x0 r ε x z + +@[simp] theorem convexApproxSmoothing_apply {d : ℕ} (ρ u : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + convexApproxSmoothing ρ u x0 r ε x = + ∫ z in tsupport ρ, convexApproxIntegrand ρ u x0 r ε x z := + rfl + +/-- The concrete convex smoothing sequence built from the unit normalized kernel. -/ +noncomputable def unitConvexApproxSequence {d : ℕ} (u : Vec d → ℝ) + (x0 : Vec d) (r : ℝ) (n : ℕ) : Vec d → ℝ := + fun x => convexApproxSmoothing (unitConvexApproxKernel (d := d)) u x0 r (unitConvexApproxScale n) x + +/-- The Euclidean rescaling of a kernel by a positive factor `a`. -/ +noncomputable def scaledConvexApproxKernel {d : ℕ} (ρ : Vec d → ℝ) (a : ℝ) : Vec d → ℝ := + fun y => (a ^ d)⁻¹ * ρ (a⁻¹ • y) + +theorem continuous_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : Continuous ρ) (a : ℝ) : + Continuous (scaledConvexApproxKernel ρ a) := by + simpa [scaledConvexApproxKernel] using! + ((continuous_const : Continuous (fun _ : Vec d => (a ^ d)⁻¹)).mul + (hρ.comp ((continuous_const : Continuous (fun _ : Vec d => a⁻¹)).smul + (continuous_id : Continuous (fun y : Vec d => y))))) + +theorem contDiff_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (a : ℝ) : + ContDiff ℝ (⊤ : ℕ∞) (scaledConvexApproxKernel ρ a) := by + have hscale : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => a⁻¹ • y) := by + simpa using! + ((contDiff_const : ContDiff ℝ (⊤ : ℕ∞) (fun _ : Vec d => a⁻¹)).smul + (contDiff_id : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => y))) + simpa [scaledConvexApproxKernel] using! + ((contDiff_const : ContDiff ℝ (⊤ : ℕ∞) (fun _ : Vec d => (a ^ d)⁻¹)).mul + (hρ.smooth.comp hscale)) + +theorem measurable_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : Continuous ρ) (a : ℝ) : + Measurable (scaledConvexApproxKernel ρ a) := + (continuous_scaledConvexApproxKernel hρ a).measurable + +theorem hasCompactSupport_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : HasCompactSupport ρ) {a : ℝ} (ha : 0 < a) : + HasCompactSupport (scaledConvexApproxKernel ρ a) := by + have hcomp : HasCompactSupport (fun y : Vec d => ρ (a⁻¹ • y)) := by + simpa [Function.comp] using hρ.comp_smul (inv_ne_zero ha.ne') + simpa [scaledConvexApproxKernel] using! + (hcomp.mul_left : HasCompactSupport (fun y : Vec d => (a ^ d)⁻¹ * ρ (a⁻¹ • y))) + +theorem integrable_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) {a : ℝ} (ha : 0 < a) : + MeasureTheory.Integrable (scaledConvexApproxKernel ρ a) := by + exact + (continuous_scaledConvexApproxKernel hρ.continuous a).integrable_of_hasCompactSupport + (hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport ha) + +theorem scaledConvexApproxKernel_nonneg {d : ℕ} {ρ : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) {a : ℝ} (ha : 0 < a) (y : Vec d) : + 0 ≤ scaledConvexApproxKernel ρ a y := by + have hpow_nonneg : 0 ≤ (a ^ d)⁻¹ := by positivity + exact mul_nonneg hpow_nonneg (hρ.nonneg _) + +theorem integral_scaledConvexApproxKernel {d : ℕ} {ρ : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) {a : ℝ} (ha : 0 < a) : + ∫ y, scaledConvexApproxKernel ρ a y = 1 := by + have ha_ne : a ≠ 0 := ha.ne' + have hzero : + ∀ y, y ∉ a • tsupport ρ → scaledConvexApproxKernel ρ a y = 0 := by + intro y hy + have hy' : a⁻¹ • y ∉ tsupport ρ := by + intro hmem + apply hy + exact Set.mem_smul_set.mpr ⟨a⁻¹ • y, hmem, by + rw [smul_smul, mul_inv_cancel₀ ha_ne, one_smul]⟩ + simp [scaledConvexApproxKernel, image_eq_zero_of_notMem_tsupport hy'] + rw [← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero] + calc + ∫ y in a • tsupport ρ, scaledConvexApproxKernel ρ a y ∂MeasureTheory.volume + = (a ^ d)⁻¹ * ∫ y in a • tsupport ρ, ρ (a⁻¹ • y) ∂MeasureTheory.volume := by + simp [scaledConvexApproxKernel, MeasureTheory.integral_const_mul] + _ = ∫ z in tsupport ρ, ρ z ∂MeasureTheory.volume := by + simpa [smul_eq_mul, smul_smul, inv_mul_cancel₀ ha_ne, mul_inv_cancel₀ ha_ne] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => ρ (a⁻¹ • y)) + (s := tsupport ρ) + ha).symm + _ = 1 := hρ.setIntegral_one + +theorem convexApproxImage_subset_translateSet_smul {d : ℕ} {U : Set (Vec d)} + (x0 z : Vec d) (r ε : ℝ) : + convexApproxSample x0 z r ε '' U ⊆ + translateSet (ε • (x0 - r • z)) ((1 - ε) • U) := by + intro y hy + rcases hy with ⟨x, hx, rfl⟩ + refine ⟨(1 - ε) • x, ?_, ?_⟩ + · exact Set.smul_mem_smul_set hx + · simp [convexApproxSample] + +theorem translateSet_smul_subset_of_convexApproxSample_mapsTo + {d : ℕ} {U : Set (Vec d)} {x0 z : Vec d} {r ε : ℝ} + (hmap : Set.MapsTo (convexApproxSample x0 z r ε) U U) : + translateSet (ε • (x0 - r • z)) ((1 - ε) • U) ⊆ U := by + intro y hy + rcases hy with ⟨w, hw, hyw⟩ + rcases Set.mem_smul_set.mp hw with ⟨x, hx, rfl⟩ + have hx' : convexApproxSample x0 z r ε x ∈ U := hmap hx + rw [hyw] + simpa [convexApproxSample] using hx' + +theorem setIntegral_comp_smul_add_of_pos {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {a : ℝ} (ha : 0 < a) (b : Vec d) (U : Set (Vec d)) (f : Vec d → E) : + ∫ x in U, f (a • x + b) ∂MeasureTheory.volume = + (a ^ d)⁻¹ • ∫ y in translateSet b (a • U), f y ∂MeasureTheory.volume := by + calc + ∫ x in U, f (a • x + b) ∂MeasureTheory.volume + = (a ^ d)⁻¹ • ∫ z in a • U, f (z + b) ∂MeasureTheory.volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun z : Vec d => f (z + b)) + (s := U) + ha) + _ = (a ^ d)⁻¹ • ∫ y in translateSet b (a • U), f y ∂MeasureTheory.volume := by + rw [setIntegral_comp_addRight_translateSet (d := d) (E := E) b (a • U) f] + +theorem setIntegral_comp_inv_smul_sub_of_pos {d : ℕ} {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + {a : ℝ} (ha : 0 < a) (b : Vec d) (U : Set (Vec d)) (f : Vec d → E) : + (a ^ d)⁻¹ • + ∫ y in translateSet b (a • U), f (a⁻¹ • (y - b)) ∂MeasureTheory.volume = + ∫ x in U, f x ∂MeasureTheory.volume := by + have ha_ne : a ≠ 0 := ha.ne' + calc + (a ^ d)⁻¹ • + ∫ y in translateSet b (a • U), f (a⁻¹ • (y - b)) ∂MeasureTheory.volume + = (a ^ d)⁻¹ • ∫ z in a • U, f (a⁻¹ • z) ∂MeasureTheory.volume := by + congr 1 + exact setIntegral_comp_subRight_translateSet (d := d) (E := E) b (a • U) + (fun z => f (a⁻¹ • z)) + _ = ∫ x in U, f (a⁻¹ • (a • x)) ∂MeasureTheory.volume := by + simpa [Vec] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun z : Vec d => f (a⁻¹ • z)) + (s := U) + ha).symm + _ = ∫ x in U, f x ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + simp [smul_smul, inv_mul_cancel₀ ha_ne] + +theorem convolution_scaledConvexApproxKernel_indicator_eq_setIntegral + {d : ℕ} {ρ u : Vec d → ℝ} {U : Set (Vec d)} + {x0 x : Vec d} {r ε : ℝ} + (hr : 0 < r) (hε0 : 0 < ε) : + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] + Set.indicator U u) ((1 - ε) • x + ε • x0) = + ∫ z in tsupport ρ, ρ z * Set.indicator U u + (((1 - ε) • x + ε • x0) - (ε * r) • z) ∂MeasureTheory.volume := by + let a : ℝ := ε * r + let A : Vec d := (1 - ε) • x + ε • x0 + have ha : 0 < a := by + dsimp [a] + positivity + have ha_ne : a ≠ 0 := ha.ne' + change + ∫ t, scaledConvexApproxKernel ρ a t * Set.indicator U u (A - t) ∂MeasureTheory.volume = + ∫ z in tsupport ρ, ρ z * Set.indicator U u (A - a • z) ∂MeasureTheory.volume + simp only [scaledConvexApproxKernel] + have hzero : + ∀ y, y ∉ a • tsupport ρ → + ((a ^ d)⁻¹ * ρ (a⁻¹ • y)) * Set.indicator U u (A - y) = 0 := by + intro y hy + have hy' : a⁻¹ • y ∉ tsupport ρ := by + intro hmem + apply hy + exact Set.mem_smul_set.mpr ⟨a⁻¹ • y, hmem, by + rw [smul_smul, mul_inv_cancel₀ ha_ne, one_smul]⟩ + simp [image_eq_zero_of_notMem_tsupport hy'] + rw [← MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero] + have hmul : + (fun y : Vec d => + ((a ^ d)⁻¹ * ρ (a⁻¹ • y)) * Set.indicator U u (A - y)) = + fun y : Vec d => (a ^ d)⁻¹ * (ρ (a⁻¹ • y) * Set.indicator U u (A - y)) := by + funext y + ring + calc + ∫ y in a • tsupport ρ, ((a ^ d)⁻¹ * ρ (a⁻¹ • y)) * Set.indicator U u (A - y) + ∂MeasureTheory.volume + = (a ^ d)⁻¹ * + ∫ y in a • tsupport ρ, ρ (a⁻¹ • y) * Set.indicator U u (A - y) + ∂MeasureTheory.volume := by + rw [hmul, MeasureTheory.integral_const_mul] + _ = ∫ z in tsupport ρ, ρ z * Set.indicator U u (A - a • z) ∂MeasureTheory.volume := by + simpa [smul_eq_mul, mul_assoc, mul_left_comm, mul_comm, sub_eq_add_neg, + smul_smul, inv_mul_cancel₀ ha_ne, mul_inv_cancel₀ ha_ne] using + (setIntegral_comp_smul_add_of_pos (d := d) (E := ℝ) (a := a) ha (b := 0) + (U := tsupport ρ) + (f := fun y : Vec d => ρ (a⁻¹ • y) * Set.indicator U u (A - y))).symm + +theorem convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + {d : ℕ} {ρ u : Vec d → ℝ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + {x0 x : Vec d} {r ε : ℝ} (hx : x ∈ U) + (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + convexApproxSmoothing ρ u x0 r ε x = + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] + Set.indicator U u) ((1 - ε) • x + ε • x0) := by + rw [convolution_scaledConvexApproxKernel_indicator_eq_setIntegral hr hε0] + rw [convexApproxSmoothing] + have htsupport_meas : MeasurableSet (tsupport ρ) := (isClosed_tsupport (f := ρ)).measurableSet + apply MeasureTheory.integral_congr_ae + change + ∀ᵐ z ∂MeasureTheory.volume.restrict (tsupport ρ), + convexApproxIntegrand ρ u x0 r ε x z = + ρ z * Set.indicator U u (((1 - ε) • x + ε • x0) - (ε * r) • z) + rw [MeasureTheory.ae_restrict_iff' htsupport_meas] + filter_upwards with z hz + have hz_norm : ‖z‖ ≤ 1 := by + simpa using (hρ.support_subset_closedBall hz) + have hsample_mem : + convexApproxSample x0 z r ε x ∈ U := + convexApproxSample_mem_of_isOpenBoundedConvexDomain hU hx hball hr.le + hz_norm hε0.le (le_of_lt hε1) + have hsample_eq : + ((1 - ε) • x + ε • x0) - (ε * r) • z = convexApproxSample x0 z r ε x := by + simp [convexApproxSample, sub_eq_add_neg, smul_smul, add_assoc, add_left_comm, add_comm] + have hind : + Set.indicator U u (convexApproxSample x0 z r ε x) = u (convexApproxSample x0 z r ε x) := by + rw [Set.indicator_of_mem hsample_mem] + calc + convexApproxIntegrand ρ u x0 r ε x z + = ρ z * u (convexApproxSample x0 z r ε x) := by + simp [convexApproxIntegrand] + _ = ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) := by + rw [hind] + _ = ρ z * Set.indicator U u (((1 - ε) • x + ε • x0) - (ε * r) • z) := by + rw [hsample_eq] + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/PointwiseBounds.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/PointwiseBounds.lean new file mode 100644 index 0000000000..dfc997e2fa --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/PointwiseBounds.lean @@ -0,0 +1,256 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Continuity + +/-! # Pointwise Bounds -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Pointwise bounds for `convexApproxSmoothing u − u` + +Constant and zero-smoothing identities, the weighted-difference integral +representation of `convexApproxSmoothing u − u`, pointwise oscillation / +modulus / continuous bounds on `|convexApproxSmoothing u − u|`, and the +eventual-in-`ε` versions (including the one for the unit sequence), capped off +by `tendsto_unitConvexApproxSequence_of_continuous`. +-/ + +theorem norm_le_one_of_mem_closedBall_zero_one {d : ℕ} {z : Vec d} + (hz : z ∈ Metric.closedBall (0 : Vec d) 1) : + ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hz + +theorem convexApproxSample_mem_of_tsupport_subset_closedBall {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {ρ : Vec d → ℝ} {x x0 z : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hρ_sub : tsupport ρ ⊆ Metric.closedBall (0 : Vec d) 1) + (hz : z ∈ tsupport ρ) (hr : 0 ≤ r) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) : + convexApproxSample x0 z r ε x ∈ U := by + exact convexApproxSample_mem_of_isOpenBoundedConvexDomain hU hx hball hr + (norm_le_one_of_mem_closedBall_zero_one (hρ_sub hz)) hε0 hε1 + +theorem convexApproxSmoothing_const {d : ℕ} {ρ : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (c : ℝ) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + convexApproxSmoothing ρ (fun _ => c) x0 r ε x = c := by + simp [convexApproxSmoothing, convexApproxIntegrand, MeasureTheory.integral_mul_const, + hρ.setIntegral_one] + +theorem convexApproxSmoothing_zero {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) + (x0 : Vec d) (r : ℝ) (x : Vec d) : + convexApproxSmoothing ρ u x0 r 0 x = u x := by + simp [convexApproxSmoothing, convexApproxIntegrand, convexApproxSample, + MeasureTheory.integral_mul_const, hρ.setIntegral_one] + +theorem convexApproxSmoothing_sub_eq_setIntegral_weightedDiff {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + convexApproxSmoothing ρ u x0 r ε x - u x = + ∫ z in tsupport ρ, ρ z * (u (convexApproxSample x0 z r ε x) - u x) := by + have hInt1 : + MeasureTheory.IntegrableOn + (fun z => convexApproxIntegrand ρ u x0 r ε x z) + (tsupport ρ) := + (integrable_convexApproxIntegrand hρ.continuous hρ.compactSupport hu x0 r ε x).integrableOn + have hInt2 : + MeasureTheory.IntegrableOn (fun z => ρ z * u x) + (tsupport ρ) := + (integrable_convexApproxKernelMulConst hρ.continuous hρ.compactSupport (u x)).integrableOn + have hconst : + ∫ z in tsupport ρ, ρ z * u x = u x := by + rw [MeasureTheory.integral_mul_const, hρ.setIntegral_one, one_mul] + calc + convexApproxSmoothing ρ u x0 r ε x - u x + = (∫ z in tsupport ρ, convexApproxIntegrand ρ u x0 r ε x z) - + ∫ z in tsupport ρ, ρ z * u x := by + rw [convexApproxSmoothing] + conv_lhs => rw [← hconst] + _ = ∫ z in tsupport ρ, convexApproxIntegrand ρ u x0 r ε x z - ρ z * u x := by + rw [MeasureTheory.integral_sub hInt1 hInt2] + _ = ∫ z in tsupport ρ, ρ z * (u (convexApproxSample x0 z r ε x) - u x) := by + apply MeasureTheory.integral_congr_ae + filter_upwards with z + simp [convexApproxIntegrand] + ring + +theorem abs_convexApproxSmoothing_sub_le_setIntegral_weightedOscillation + {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + |convexApproxSmoothing ρ u x0 r ε x - u x| ≤ + ∫ z in tsupport ρ, ρ z * |u (convexApproxSample x0 z r ε x) - u x| := by + rw [convexApproxSmoothing_sub_eq_setIntegral_weightedDiff hρ hu x0 r ε x] + calc + |∫ z in tsupport ρ, ρ z * (u (convexApproxSample x0 z r ε x) - u x)| ≤ + ∫ z in tsupport ρ, |ρ z * (u (convexApproxSample x0 z r ε x) - u x)| := by + simpa using + (MeasureTheory.abs_integral_le_integral_abs + (μ := MeasureTheory.volume.restrict (tsupport ρ)) + (f := fun z => ρ z * (u (convexApproxSample x0 z r ε x) - u x))) + _ = ∫ z in tsupport ρ, ρ z * |u (convexApproxSample x0 z r ε x) - u x| := by + apply MeasureTheory.integral_congr_ae + filter_upwards with z + rw [abs_mul, abs_of_nonneg (hρ.nonneg z)] + +theorem abs_convexApproxSmoothing_sub_le_of_pointwiseOscillation + {d : ℕ} {ρ u : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) {δ : ℝ} + (hosc : ∀ z ∈ tsupport ρ, |u (convexApproxSample x0 z r ε x) - u x| ≤ δ) : + |convexApproxSmoothing ρ u x0 r ε x - u x| ≤ δ := by + have hIntLeft : + MeasureTheory.IntegrableOn + (fun z => ρ z * |u (convexApproxSample x0 z r ε x) - u x|) + (tsupport ρ) := by + exact + MeasureTheory.Integrable.integrableOn + (integrable_convexApproxWeightedOscillation hρ.continuous hρ.compactSupport hu x0 r ε x) + have hIntRight : + MeasureTheory.IntegrableOn (fun z => ρ z * δ) (tsupport ρ) := by + exact + MeasureTheory.Integrable.integrableOn + (integrable_convexApproxKernelMulConst hρ.continuous hρ.compactSupport δ) + calc + |convexApproxSmoothing ρ u x0 r ε x - u x| ≤ + ∫ z in tsupport ρ, ρ z * |u (convexApproxSample x0 z r ε x) - u x| := + abs_convexApproxSmoothing_sub_le_setIntegral_weightedOscillation hρ hu x0 r ε x + _ ≤ ∫ z in tsupport ρ, ρ z * δ := by + refine MeasureTheory.setIntegral_mono_on hIntLeft hIntRight + (isClosed_tsupport ρ).measurableSet ?_ + intro z hz + exact mul_le_mul_of_nonneg_left (hosc z hz) (hρ.nonneg z) + _ = δ := by + rw [MeasureTheory.integral_mul_const, hρ.setIntegral_one, one_mul] + +theorem abs_convexApproxSmoothing_sub_le_of_modulus + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + {x x0 : Vec d} {r ε : ℝ} + (hx : x ∈ U) (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 ≤ r) (hε0 : 0 ≤ ε) (hε1 : ε ≤ 1) {δ : ℝ} + (hmod : + ∀ y ∈ U, ‖y - x‖ ≤ ε * (2 * Classical.choose hU.isBoundedDomain) → + |u y - u x| ≤ δ) : + |convexApproxSmoothing ρ u x0 r ε x - u x| ≤ δ := by + apply abs_convexApproxSmoothing_sub_le_of_pointwiseOscillation hρ hu x0 r ε x + intro z hz + have hy : convexApproxSample x0 z r ε x ∈ U := + convexApproxSample_mem_of_tsupport_subset_closedBall hU hx hball + hρ.support_subset_closedBall hz hr hε0 hε1 + have hdist : + ‖convexApproxSample x0 z r ε x - x‖ ≤ + ε * (2 * Classical.choose hU.isBoundedDomain) := + norm_convexApproxSample_sub_le_two_mul_choose_of_isOpenBoundedConvexDomain + hU hx hball hr + (norm_le_one_of_mem_closedBall_zero_one (hρ.support_subset_closedBall hz)) hε0 + exact hmod _ hy hdist + +theorem exists_pos_forall_abs_convexApproxSmoothing_sub_le_of_continuous + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {δ : ℝ} (hδ : 0 < δ) : + ∃ η > 0, ∀ ⦃x : Vec d⦄, x ∈ U → ∀ ⦃ε : ℝ⦄, + 0 ≤ ε → ε ≤ 1 → ε * (2 * Classical.choose hU.isBoundedDomain) ≤ η → + |convexApproxSmoothing ρ u x0 r ε x - u x| ≤ δ := by + have hcompact : IsCompact (closure U) := hU.isBoundedDomain.isBounded.isCompact_closure + have huc : UniformContinuousOn u (closure U) := + hcompact.uniformContinuousOn_of_continuous hu.continuousOn + rcases (Metric.uniformContinuousOn_iff_le.mp huc) δ hδ with ⟨η, hηpos, hη⟩ + refine ⟨η, hηpos, ?_⟩ + intro x hx ε hε0 hε1 hεη + apply abs_convexApproxSmoothing_sub_le_of_modulus hU hρ hu hx hball hr hε0 hε1 + intro y hy hyx + have hxcl : x ∈ closure U := subset_closure hx + have hycl : y ∈ closure U := subset_closure hy + have hdist : dist (u y) (u x) ≤ δ := by + apply hη y hycl x hxcl + calc + dist y x = ‖y - x‖ := by simpa using (dist_eq_norm y x) + _ ≤ ε * (2 * Classical.choose hU.isBoundedDomain) := hyx + _ ≤ η := hεη + simpa [dist_eq_norm] using hdist + +theorem two_mul_choose_isBoundedDomain_nonneg + {d : ℕ} {U : Set (Vec d)} (hU : IsBoundedDomain U) : + 0 ≤ 2 * Classical.choose hU := by + have hchoose_nonneg : 0 ≤ Classical.choose hU := + le_of_lt (Classical.choose_spec hU).1 + positivity + +theorem eventually_forall_abs_convexApproxSmoothing_sub_le_of_continuous + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ᶠ n : ℕ in Filter.atTop, 0 ≤ ε n) + (hε_le_one : ∀ᶠ n : ℕ in Filter.atTop, ε n ≤ 1) + {δ : ℝ} (hδ : 0 < δ) : + ∀ᶠ n : ℕ in Filter.atTop, ∀ ⦃x : Vec d⦄, x ∈ U → + |convexApproxSmoothing ρ u x0 r (ε n) x - u x| ≤ δ := by + obtain ⟨η, hηpos, hη⟩ := + exists_pos_forall_abs_convexApproxSmoothing_sub_le_of_continuous + hU hρ hu hball hr hδ + let C : ℝ := 2 * Classical.choose hU.isBoundedDomain + have hCnonneg : 0 ≤ C := by + simpa [C] using two_mul_choose_isBoundedDomain_nonneg hU.isBoundedDomain + have hscaled : + Filter.Tendsto (fun n : ℕ => ε n * C) Filter.atTop (nhds 0) := by + simpa using (hε.mul_const C) + filter_upwards [Metric.tendsto_nhds.mp hscaled η hηpos, hε_nonneg, hε_le_one] with + n hn hε0 hε1 x hx + have hlt : ε n * C < η := by + have hn' : |ε n| * |C| < η := by + simpa [Real.dist_eq] using hn + simpa [abs_of_nonneg hε0, abs_of_nonneg hCnonneg] using hn' + exact hη hx hε0 hε1 (le_of_lt hlt) + +theorem eventually_forall_abs_unitConvexApproxSequence_sub_le_of_continuous + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {δ : ℝ} (hδ : 0 < δ) : + ∀ᶠ n : ℕ in Filter.atTop, ∀ ⦃x : Vec d⦄, x ∈ U → + |unitConvexApproxSequence u x0 r n x - u x| ≤ δ := by + simpa [unitConvexApproxSequence] using + (eventually_forall_abs_convexApproxSmoothing_sub_le_of_continuous + hU (isConvexApproxKernel_unitConvexApproxKernel (d := d)) hu hball hr + tendsto_unitConvexApproxScale_zero + (Filter.Eventually.of_forall unitConvexApproxScale_nonneg) + (Filter.Eventually.of_forall unitConvexApproxScale_le_one) + hδ) + +theorem tendsto_unitConvexApproxSequence_of_continuous + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hu : Continuous u) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + {x : Vec d} (hx : x ∈ U) : + Filter.Tendsto + (fun n : ℕ => unitConvexApproxSequence u x0 r n x) + Filter.atTop (nhds (u x)) := by + rw [Metric.tendsto_nhds] + intro δ hδ + have hδhalf : 0 < δ / 2 := by linarith + filter_upwards + [eventually_forall_abs_unitConvexApproxSequence_sub_le_of_continuous + hU hu hball hr hδhalf] with n hn + have hbound : + |unitConvexApproxSequence u x0 r n x - u x| ≤ δ / 2 := by + exact hn hx + have hlt : |unitConvexApproxSequence u x0 r n x - u x| < δ := by + exact lt_of_le_of_lt hbound (by linarith) + simpa [Real.dist_eq, unitConvexApproxSequence] using hlt + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/SmoothRepresentative.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/SmoothRepresentative.lean new file mode 100644 index 0000000000..a475c26d4c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/SmoothRepresentative.lean @@ -0,0 +1,612 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel + +/-! # Smooth Representative -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Smooth representative, measurability, and L^p bounds for the convex smoothing + +Defines the globally smooth representative `convexApproxSmoothRepresentative` +and collects the measurability, `eLpNorm` control, and integrability lemmas +needed downstream: measurable-embedding of `convexApproxSample`, `map` of the +restricted volume measure, `eLpNorm_comp_convexApproxSample_le`, +`eLpNorm_convexApproxSmoothing_le`, `aestronglyMeasurable_/memLpOn_` variants, +the a.e. equality of smoothing vs. its representative, and integrability of +`fun y => u ∘ convexApproxSample y` against a finite measure. +-/ + +/-- A globally defined smooth representative for the convex-domain smoothing operator. -/ +noncomputable def convexApproxSmoothRepresentative {d : ℕ} (U : Set (Vec d)) + (ρ u : Vec d → ℝ) (x0 : Vec d) (r ε : ℝ) : Vec d → ℝ := + fun x => + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, + MeasureTheory.volume] Set.indicator U u) ((1 - ε) • x + ε • x0) + +theorem contDiff_convexApproxSmoothRepresentative + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : MeasurableSet U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hu : MemLpOn U p u) + {x0 : Vec d} {r ε : ℝ} (hr : 0 < r) (hε0 : 0 < ε) : + ContDiff ℝ (⊤ : ℕ∞) (convexApproxSmoothRepresentative U ρ u x0 r ε) := by + have hεr_pos : 0 < ε * r := by positivity + have hu_indicator_mem : + MeasureTheory.MemLp (Set.indicator U u) p MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict hU] + exact hu + have hu_indicator_loc : + MeasureTheory.LocallyIntegrable (Set.indicator U u) MeasureTheory.volume := + hu_indicator_mem.locallyIntegrable hp1 + have hconv : + ContDiff ℝ (⊤ : ℕ∞) + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, + MeasureTheory.volume] Set.indicator U u) := + HasCompactSupport.contDiff_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) + (μ := MeasureTheory.volume) + (f := scaledConvexApproxKernel ρ (ε * r)) + (g := Set.indicator U u) + (hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hεr_pos) + (contDiff_scaledConvexApproxKernel hρ (ε * r)) + hu_indicator_loc + have haff : + ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => (1 - ε) • x + ε • x0) := by + exact + ((contDiff_id : ContDiff ℝ (⊤ : ℕ∞) (fun x : Vec d => x)).const_smul + (1 - ε)).add contDiff_const + simpa [convexApproxSmoothRepresentative] using! hconv.comp haff + +theorem convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + {x0 x : Vec d} {r ε : ℝ} (hx : x ∈ U) + (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + convexApproxSmoothRepresentative U ρ u x0 r ε x = + convexApproxSmoothing ρ u x0 r ε x := by + simpa [convexApproxSmoothRepresentative] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + hU hρ hx hball hr hε0 hε1).symm + +theorem measurableEmbedding_convexApproxSample + {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (hε1 : ε < 1) : + MeasurableEmbedding (convexApproxSample x0 z r ε) := by + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + have ha_pos : 0 < a := by + dsimp [a] + linarith + have ha_ne : a ≠ 0 := ha_pos.ne' + let e : Homeomorph (Vec d) (Vec d) := + (Homeomorph.smulOfNeZero a ha_ne).trans (Homeomorph.addRight b) + have heq : (fun x : Vec d => e x) = convexApproxSample x0 z r ε := by + funext x + simp [e, a, b, convexApproxSample] + simpa [heq] using e.toMeasurableEquiv.measurableEmbedding + +theorem map_restrict_convexApproxSample + {d : ℕ} {U : Set (Vec d)} (_hU : MeasurableSet U) + (x0 z : Vec d) (r ε : ℝ) (hε1 : ε < 1) : + MeasureTheory.Measure.map (convexApproxSample x0 z r ε) + (MeasureTheory.volume.restrict U) = + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • + MeasureTheory.volume.restrict (convexApproxSample x0 z r ε '' U) := by + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + have ha_pos : 0 < a := by + dsimp [a] + linarith + have ha_ne : a ≠ 0 := ha_pos.ne' + let e : Homeomorph (Vec d) (Vec d) := + (Homeomorph.smulOfNeZero a ha_ne).trans (Homeomorph.addRight b) + have heq : (fun x : Vec d => e x) = convexApproxSample x0 z r ε := by + funext x + simp [e, a, b, convexApproxSample] + have hrestrict : + MeasureTheory.Measure.map (convexApproxSample x0 z r ε) + (MeasureTheory.volume.restrict U) = + (MeasureTheory.Measure.map (convexApproxSample x0 z r ε) MeasureTheory.volume).restrict + (convexApproxSample x0 z r ε '' U) := by + have htmp : + (MeasureTheory.volume.restrict U).map e = + (MeasureTheory.volume.map e).restrict (e '' U) := by + have h := + ((e.toMeasurableEquiv.restrict_map (μ := MeasureTheory.volume) (s := e '' U)).symm) + simpa [Set.preimage_image_eq _ e.injective] using h + simpa [heq] using htmp + have hmap_volume : + MeasureTheory.Measure.map (convexApproxSample x0 z r ε) MeasureTheory.volume = + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • MeasureTheory.volume := by + have hmap_smul : + MeasureTheory.Measure.map (fun x : Vec d => a • x) MeasureTheory.volume = + ENNReal.ofReal ((a ^ d)⁻¹) • MeasureTheory.volume := by + have hpow_nonneg : 0 ≤ a ^ d := by positivity + let f : Vec d →ₗ[ℝ] Vec d := a • (1 : Vec d →ₗ[ℝ] Vec d) + have hf : LinearMap.det f ≠ 0 := by + simp [f, ha_ne] + have hdet : LinearMap.det f = a ^ d := by + simp [f] + have hmapf := + Real.map_linearMap_volume_pi_eq_smul_volume_pi + (ι := Fin d) (f := f) hf + have hpow_inv_nonneg : 0 ≤ (a ^ d)⁻¹ := by positivity + rw [hdet] at hmapf + simpa [f, abs_of_nonneg hpow_inv_nonneg] using! hmapf + calc + MeasureTheory.Measure.map (convexApproxSample x0 z r ε) MeasureTheory.volume + = (MeasureTheory.Measure.map (fun x : Vec d => a • x) MeasureTheory.volume).map + (fun y : Vec d => y + b) := by + simpa [Function.comp, a, b, convexApproxSample] using! + (MeasureTheory.Measure.map_map + (μ := MeasureTheory.volume) + (g := fun y : Vec d => y + b) + (f := fun x : Vec d => a • x) + (measurable_id.add measurable_const) + (measurable_const_smul a)).symm + _ = MeasureTheory.Measure.map (fun y : Vec d => y + b) + (ENNReal.ofReal ((a ^ d)⁻¹) • MeasureTheory.volume) := by + rw [hmap_smul] + _ = ENNReal.ofReal ((a ^ d)⁻¹) • + MeasureTheory.Measure.map (fun y : Vec d => y + b) MeasureTheory.volume := by + exact MeasureTheory.Measure.map_smul _ + (measurable_id.add measurable_const).aemeasurable + _ = ENNReal.ofReal ((a ^ d)⁻¹) • MeasureTheory.volume := by + rw [MeasureTheory.map_add_right_eq_self] + _ = ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • MeasureTheory.volume := by + simp [a] + calc + MeasureTheory.Measure.map (convexApproxSample x0 z r ε) + (MeasureTheory.volume.restrict U) + = (MeasureTheory.Measure.map (convexApproxSample x0 z r ε) MeasureTheory.volume).restrict + (convexApproxSample x0 z r ε '' U) := hrestrict + _ = (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • MeasureTheory.volume).restrict + (convexApproxSample x0 z r ε '' U) := by rw [hmap_volume] + _ = ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • + MeasureTheory.volume.restrict (convexApproxSample x0 z r ε '' U) := by + rw [MeasureTheory.Measure.restrict_smul] + +theorem eLpNorm_comp_convexApproxSample_le + {d : ℕ} {U : Set (Vec d)} {u : Vec d → ℝ} {p : ENNReal} + (hp : p ≠ ⊤) (hU : MeasurableSet U) + (x0 z : Vec d) (r ε : ℝ) (hε1 : ε < 1) + (hmap : convexApproxSample x0 z r ε '' U ⊆ U) : + MeasureTheory.eLpNorm (fun x => u (convexApproxSample x0 z r ε x)) + p (MeasureTheory.volume.restrict U) ≤ + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) := by + calc + MeasureTheory.eLpNorm (fun x => u (convexApproxSample x0 z r ε x)) + p (MeasureTheory.volume.restrict U) + = MeasureTheory.eLpNorm u p + (MeasureTheory.Measure.map (convexApproxSample x0 z r ε) + (MeasureTheory.volume.restrict U)) := by + symm + exact + (measurableEmbedding_convexApproxSample x0 z r ε hε1).eLpNorm_map_measure + _ = MeasureTheory.eLpNorm u p + (ENNReal.ofReal (((1 - ε) ^ d)⁻¹) • + MeasureTheory.volume.restrict (convexApproxSample x0 z r ε '' U)) := by + rw [map_restrict_convexApproxSample hU x0 z r ε hε1] + _ = ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal • + MeasureTheory.eLpNorm u p + (MeasureTheory.volume.restrict (convexApproxSample x0 z r ε '' U)) := by + exact MeasureTheory.eLpNorm_smul_measure_of_ne_zero (by positivity) _ _ _ + _ ≤ ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal • + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) := by + exact + smul_le_smul_of_nonneg_left + (MeasureTheory.eLpNorm_mono_measure u + (MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hmap)) + (by positivity) + _ = ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) := by + rw [smul_eq_mul] + +theorem eLpNorm_convexApproxSmoothing_le + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hp : p ≠ ⊤) (hu : MemLpOn U p u) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r ε) p + (MeasureTheory.volume.restrict U) ≤ + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) := by + let g : Vec d → ℝ := + scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] + Set.indicator U u + have hU_meas : MeasurableSet U := hU.isOpen.measurableSet + have hmap0_mapsTo : + Set.MapsTo (convexApproxSample x0 0 r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr.le + (by simp) hε0.le (le_of_lt hε1) + have hmap0 : convexApproxSample x0 0 r ε '' U ⊆ U := by + intro y hy + rcases hy with ⟨x, hx, rfl⟩ + exact hmap0_mapsTo hx + have hrepr : + (fun x => convexApproxSmoothing ρ u x0 r ε x) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g (convexApproxSample x0 0 r ε x) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU_meas] with x hx + simpa [g, convexApproxSample] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + hU hρ hx hball hr hε0 hε1) + have hεr_pos : 0 < ε * r := by positivity + have hu_indicator_mem : + MeasureTheory.MemLp (Set.indicator U u) p MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict hU_meas] + exact hu + have hconv : + MeasureTheory.eLpNorm g p MeasureTheory.volume ≤ + MeasureTheory.eLpNorm (Set.indicator U u) p MeasureTheory.volume := by + dsimp [g] + exact + young_convolution_nonneg_integral_one_of_aemeasurable (d := d) hp1 hp + (scaledConvexApproxKernel_nonneg hρ hεr_pos) + (integrable_scaledConvexApproxKernel hρ hεr_pos) + (integral_scaledConvexApproxKernel hρ hεr_pos) + (measurable_scaledConvexApproxKernel hρ.continuous (ε * r)) + hu_indicator_mem.aestronglyMeasurable.aemeasurable + calc + MeasureTheory.eLpNorm (convexApproxSmoothing ρ u x0 r ε) p (MeasureTheory.volume.restrict U) + = MeasureTheory.eLpNorm (fun x => g (convexApproxSample x0 0 r ε x)) p + (MeasureTheory.volume.restrict U) := by + exact MeasureTheory.eLpNorm_congr_ae hrepr + _ ≤ ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm g p (MeasureTheory.volume.restrict U) := by + exact eLpNorm_comp_convexApproxSample_le hp hU_meas x0 0 r ε hε1 hmap0 + _ ≤ ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm g p MeasureTheory.volume := by + exact mul_le_mul' le_rfl + (MeasureTheory.eLpNorm_mono_measure g MeasureTheory.Measure.restrict_le_self) + _ ≤ ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (Set.indicator U u) p MeasureTheory.volume := by + exact mul_le_mul' le_rfl hconv + _ = ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) := by + rw [MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict hU_meas] + +theorem aestronglyMeasurable_convexApproxSmoothing + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hu : MemLpOn U p u) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + MeasureTheory.AEStronglyMeasurable (convexApproxSmoothing ρ u x0 r ε) + (MeasureTheory.volume.restrict U) := by + let g : Vec d → ℝ := + scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] + Set.indicator U u + have hU_meas : MeasurableSet U := hU.isOpen.measurableSet + have hrepr : + (fun x => convexApproxSmoothing ρ u x0 r ε x) =ᵐ[MeasureTheory.volume.restrict U] + fun x => g (convexApproxSample x0 0 r ε x) := by + filter_upwards [MeasureTheory.ae_restrict_mem hU_meas] with x hx + simpa [g, convexApproxSample] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + hU hρ hx hball hr hε0 hε1) + have hεr_pos : 0 < ε * r := by positivity + have hu_indicator_mem : + MeasureTheory.MemLp (Set.indicator U u) p MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict hU_meas] + exact hu + have hg_cont : Continuous g := by + dsimp [g] + exact + HasCompactSupport.continuous_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) + (μ := MeasureTheory.volume) + (f := scaledConvexApproxKernel ρ (ε * r)) + (g := Set.indicator U u) + (hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hεr_pos) + (continuous_scaledConvexApproxKernel hρ.continuous (ε * r)) + (hu_indicator_mem.locallyIntegrable hp1) + exact + (aestronglyMeasurable_congr hrepr.symm).1 + ((hg_cont.comp (continuous_convexApproxSample x0 0 r ε)).aestronglyMeasurable) + +theorem memLpOn_convexApproxSmoothing + {d : ℕ} {U : Set (Vec d)} {ρ u : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hp : p ≠ ⊤) (hu : MemLpOn U p u) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + MemLpOn U p (convexApproxSmoothing ρ u x0 r ε) := by + have hnorm_lt_top : + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u p (MeasureTheory.volume.restrict U) < ⊤ := by + refine ENNReal.mul_lt_top ?_ hu.eLpNorm_lt_top + exact ENNReal.rpow_lt_top_of_nonneg (by positivity) ENNReal.ofReal_ne_top + refine lt_of_le_of_lt ?_ hnorm_lt_top + · exact eLpNorm_convexApproxSmoothing_le hU hρ hp1 hp hu hball hr hε0 hε1 + +theorem convexApproxSmoothing_sub_ae_eq + {d : ℕ} {U : Set (Vec d)} {ρ u v : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) + (hu : MemLpOn U p u) (hv : MemLpOn U p v) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + (fun x => convexApproxSmoothing ρ (fun y => u y - v y) x0 r ε x) + =ᵐ[MeasureTheory.volume.restrict U] + fun x => convexApproxSmoothing ρ u x0 r ε x - convexApproxSmoothing ρ v x0 r ε x := by + let k : Vec d → ℝ := scaledConvexApproxKernel ρ (ε * r) + let gu : Vec d → ℝ := + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] Set.indicator U u + let gv : Vec d → ℝ := + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] Set.indicator U v + let gw : Vec d → ℝ := + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, MeasureTheory.volume] Set.indicator U (fun y => u y - v y) + have hU_meas : MeasurableSet U := hU.isOpen.measurableSet + have hεr_pos : 0 < ε * r := by positivity + have hk_cont : Continuous k := by + dsimp [k] + exact continuous_scaledConvexApproxKernel hρ.continuous (ε * r) + have hk_compact : HasCompactSupport k := by + dsimp [k] + exact hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hεr_pos + have hu_indicator_mem : + MeasureTheory.MemLp (Set.indicator U u) p MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict hU_meas] + exact hu + have hv_indicator_mem : + MeasureTheory.MemLp (Set.indicator U v) p MeasureTheory.volume := by + rw [MeasureTheory.memLp_indicator_iff_restrict hU_meas] + exact hv + have hu_indicator_loc : + MeasureTheory.LocallyIntegrable (Set.indicator U u) MeasureTheory.volume := + hu_indicator_mem.locallyIntegrable hp1 + have hv_indicator_loc : + MeasureTheory.LocallyIntegrable (Set.indicator U v) MeasureTheory.volume := + hv_indicator_mem.locallyIntegrable hp1 + have hnegv_indicator_loc : + MeasureTheory.LocallyIntegrable ((-1 : ℝ) • Set.indicator U v) MeasureTheory.volume := by + simpa using hv_indicator_loc.smul (-1 : ℝ) + have hconv_u : + MeasureTheory.ConvolutionExists k (Set.indicator U u) + (ContinuousLinearMap.lsmul ℝ ℝ) MeasureTheory.volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hu_indicator_loc + have hconv_negv : + MeasureTheory.ConvolutionExists k ((-1 : ℝ) • Set.indicator U v) + (ContinuousLinearMap.lsmul ℝ ℝ) MeasureTheory.volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hnegv_indicator_loc + have hind_sub : + Set.indicator U (fun y => u y - v y) = + Set.indicator U u + (-1 : ℝ) • Set.indicator U v := by + funext x + by_cases hx : x ∈ U + · simp [hx, sub_eq_add_neg] + · simp [hx] + have hconv_sub : + gw = fun x => gu x - gv x := by + ext x + dsimp [gw, gu, gv] + rw [hind_sub, hconv_u.distrib_add hconv_negv, MeasureTheory.convolution_smul] + simp [sub_eq_add_neg] + filter_upwards [MeasureTheory.ae_restrict_mem hU_meas] with x hx + have hu_repr : + convexApproxSmoothing ρ u x0 r ε x = gu (convexApproxSample x0 0 r ε x) := by + simpa [gu, convexApproxSample] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + hU hρ hx hball hr hε0 hε1) + have hv_repr : + convexApproxSmoothing ρ v x0 r ε x = gv (convexApproxSample x0 0 r ε x) := by + simpa [gv, convexApproxSample] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + hU hρ hx hball hr hε0 hε1) + have hw_repr : + convexApproxSmoothing ρ (fun y => u y - v y) x0 r ε x = + gw (convexApproxSample x0 0 r ε x) := by + simpa [gw, convexApproxSample] using + (convexApproxSmoothing_eq_convolution_scaledConvexApproxKernel_indicator + (u := fun y => u y - v y) + hU hρ hx hball hr hε0 hε1) + rw [hu_repr, hv_repr, hw_repr] + rw [hconv_sub] + +theorem eLpNorm_sub_convexApproxSmoothing_le + {d : ℕ} {U : Set (Vec d)} {ρ u v : Vec d → ℝ} {p : ENNReal} + (hU : IsOpenBoundedConvexDomain U) (hρ : IsConvexApproxKernel ρ) + (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hu : MemLpOn U p u) (hv : MemLpOn U p v) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (hε0 : 0 < ε) (hε1 : ε < 1) : + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r ε x - convexApproxSmoothing ρ v x0 r ε x) + p (MeasureTheory.volume.restrict U) ≤ + ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (fun x => u x - v x) p (MeasureTheory.volume.restrict U) := by + have huw : MemLpOn U p (fun x => u x - v x) := hu.sub hv + calc + MeasureTheory.eLpNorm + (fun x => convexApproxSmoothing ρ u x0 r ε x - convexApproxSmoothing ρ v x0 r ε x) + p (MeasureTheory.volume.restrict U) + = MeasureTheory.eLpNorm + (convexApproxSmoothing ρ (fun y => u y - v y) x0 r ε) p + (MeasureTheory.volume.restrict U) := by + exact MeasureTheory.eLpNorm_congr_ae + (convexApproxSmoothing_sub_ae_eq hU hρ hp1 hu hv hball hr hε0 hε1).symm + _ ≤ ENNReal.ofReal (((1 - ε) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (fun x => u x - v x) p (MeasureTheory.volume.restrict U) := + eLpNorm_convexApproxSmoothing_le hU hρ hp1 hp huw hball hr hε0 hε1 + +theorem integrableOn_comp_smul_add_of_pos + {d : ℕ} {s : Set (Vec d)} {u : Vec d → ℝ} {a : ℝ} (ha : 0 < a) (b : Vec d) + (hs : MeasurableSet s) + (hu : MeasureTheory.IntegrableOn u (translateSet b (a • s)) MeasureTheory.volume) : + MeasureTheory.IntegrableOn (fun x => u (a • x + b)) s MeasureTheory.volume := by + have ha_ne : a ≠ 0 := ha.ne' + let V : Set (Vec d) := translateSet b (a • s) + have hV_meas : MeasurableSet V := by + have hpre : ⇑(Homeomorph.subRight b) ⁻¹' (a • s) = V := by + ext x + simp [V, mem_translateSet_iff_sub_mem] + rw [← hpre] + exact + ((Homeomorph.subRight b).toMeasurableEquiv.measurableSet_preimage).2 + (((Homeomorph.smulOfNeZero a ha_ne).toMeasurableEquiv.measurableSet_image).2 hs) + have h_indicator : MeasureTheory.Integrable (Set.indicator V u) MeasureTheory.volume := + hu.integrable_indicator hV_meas + have h_translated : MeasureTheory.Integrable (fun x => Set.indicator V u (x + b)) + MeasureTheory.volume := by + exact + (MeasureTheory.measurePreserving_add_right + (MeasureTheory.volume : MeasureTheory.Measure (Vec d)) b).integrable_comp_of_integrable + h_indicator + have h_scaled : MeasureTheory.Integrable (fun x => Set.indicator V u (a • x + b)) + MeasureTheory.volume := by + let g : Vec d → ℝ := fun x => Set.indicator V u (x + b) + have hg : MeasureTheory.Integrable g MeasureTheory.volume := by + simpa [g] using h_translated + simpa [g, Function.comp] using hg.comp_smul ha_ne + have h_indicator_eq : + Set.indicator s (fun x => u (a • x + b)) = + fun x => Set.indicator V u (a • x + b) := by + funext x + by_cases hx : x ∈ s + · have hyV : a • x + b ∈ V := by + exact ⟨a • x, Set.smul_mem_smul_set hx, rfl⟩ + simp [Set.indicator_of_mem, hx, hyV] + · have hyV : a • x + b ∉ V := by + intro hyV + rcases hyV with ⟨w, hw, hyw⟩ + rcases Set.mem_smul_set.mp hw with ⟨x', hx', rfl⟩ + have hxx' : x = x' := by + have := congrArg (fun t : Vec d => a⁻¹ • (t - b)) hyw + simpa [smul_smul, inv_mul_cancel₀ ha_ne] using this + exact hx (hxx' ▸ hx') + simp [Set.indicator_of_notMem, hx, hyV] + refine (MeasureTheory.integrable_indicator_iff hs).1 ?_ + exact h_indicator_eq ▸ h_scaled + +theorem integrableOn_comp_convexApproxSample + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} (hu : MeasureTheory.IntegrableOn u U MeasureTheory.volume) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.IntegrableOn + (fun x => u (convexApproxSample x0 z r ε x)) + U MeasureTheory.volume := by + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + let V : Set (Vec d) := translateSet b (a • U) + have ha_pos : 0 < a := by + dsimp [a] + linarith + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz hε0 (le_of_lt hε1) + have hV_sub : V ⊆ U := + translateSet_smul_subset_of_convexApproxSample_mapsTo (x0 := x0) (z := z) (r := r) (ε := ε) + hmap + have huV : MeasureTheory.IntegrableOn u V MeasureTheory.volume := + hu.mono_set hV_sub + simpa [convexApproxSample, a, b, V] using + (integrableOn_comp_smul_add_of_pos (d := d) (u := u) (a := a) ha_pos b hU.1.measurableSet huV) + +theorem integrableOn_comp_convexApproxSample_of_locallyIntegrableOn + {d : ℕ} {U K : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hK_sub : K ⊆ U) (hK_compact : IsCompact K) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.IntegrableOn + (fun x => u (convexApproxSample x0 z r ε x)) + K MeasureTheory.volume := by + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + let V : Set (Vec d) := translateSet b (a • K) + have ha_pos : 0 < a := by + dsimp [a] + linarith + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz hε0 (le_of_lt hε1) + have hV_subU : V ⊆ U := by + intro y hy + rcases hy with ⟨w, hw, hyw⟩ + rcases Set.mem_smul_set.mp hw with ⟨x, hx, rfl⟩ + have hxU : x ∈ U := hK_sub hx + have hyU : convexApproxSample x0 z r ε x ∈ U := hmap hxU + rw [hyw] + simpa [convexApproxSample] using hyU + have hV_compact : IsCompact V := by + have h_image : (fun x : Vec d => a • x + b) '' K = V := by + ext y + constructor + · intro hy + rcases hy with ⟨x, hx, rfl⟩ + exact ⟨a • x, Set.smul_mem_smul_set hx, by simp⟩ + · intro hy + rcases hy with ⟨w, hw, hyw⟩ + rcases Set.mem_smul_set.mp hw with ⟨x, hx, rfl⟩ + refine ⟨x, hx, ?_⟩ + simp [hyw] + rw [← h_image] + exact hK_compact.image + (((continuous_const : Continuous fun _ : Vec d => a).smul continuous_id).add + (continuous_const : Continuous fun _ : Vec d => b)) + have huV : MeasureTheory.IntegrableOn u V MeasureTheory.volume := + hu.integrableOn_compact_subset hV_subU hV_compact + simpa [convexApproxSample, a, b, V] using + (integrableOn_comp_smul_add_of_pos (d := d) (u := u) (a := a) ha_pos b + hK_compact.measurableSet huV) + +theorem integrableOn_indicator_comp_convexApproxSample_mul_of_locallyIntegrableOn + {d : ℕ} {U K : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u ψ : Vec d → ℝ} (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hψ : Continuous ψ) (hK_sub : K ⊆ U) (hK_compact : IsCompact K) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.IntegrableOn + (fun x => Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x) + K MeasureTheory.volume := by + have hcomp : + MeasureTheory.IntegrableOn + (fun x => u (convexApproxSample x0 z r ε x)) + K MeasureTheory.volume := + integrableOn_comp_convexApproxSample_of_locallyIntegrableOn hU hu hK_sub hK_compact + hball hr hz hε0 hε1 + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz hε0 (le_of_lt hε1) + have hmul : + MeasureTheory.IntegrableOn + (fun x => u (convexApproxSample x0 z r ε x) * ψ x) + K MeasureTheory.volume := + hcomp.mul_continuousOn hψ.continuousOn hK_compact + rw [MeasureTheory.IntegrableOn] at hmul ⊢ + refine hmul.congr ?_ + filter_upwards [MeasureTheory.ae_restrict_mem hK_compact.measurableSet] with x hx + rw [Set.indicator_of_mem (hmap (hK_sub hx))] + +theorem integrableOn_kernel_mul_indicator_comp_convexApproxSample_mul_of_locallyIntegrableOn + {d : ℕ} {U K : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u ρ ψ : Vec d → ℝ} (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hψ : Continuous ψ) (hK_sub : K ⊆ U) (hK_compact : IsCompact K) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.IntegrableOn + (fun x => ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x) + K MeasureTheory.volume := by + rw [MeasureTheory.IntegrableOn] + simpa [mul_assoc] using + (integrableOn_indicator_comp_convexApproxSample_mul_of_locallyIntegrableOn + hU hu hψ hK_sub hK_compact hball hr hz hε0 hε1).integrable.const_mul (ρ z) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivComp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivComp.lean new file mode 100644 index 0000000000..c3948ee6b3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivComp.lean @@ -0,0 +1,723 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.SmoothRepresentative + +/-! # Weak Deriv Comp -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Weak partial derivatives of the `convexApproxSample` composition + +Establishes `HasWeakPartialDerivOn.comp_convexApproxSample` (plus the gradient +variant) and the product-measure infrastructure that feeds it: +quasi-measure-preservation of `convexApproxSample`, strong measurability of +indicator products, and integrability of the kernel × indicator × comp tensor +against a locally integrable datum. +-/ + +theorem HasWeakPartialDerivOn.comp_convexApproxSample + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {i : Fin d} {u gi : Vec d → ℝ} + (hu : HasWeakPartialDerivOn U i u gi) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + HasWeakPartialDerivOn U i + (fun x => u (convexApproxSample x0 z r ε x)) + (fun x => (1 - ε) * gi (convexApproxSample x0 z r ε x)) := by + intro φ hφ_smooth hφ_compact hφ_sub + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + let V : Set (Vec d) := translateSet b (a • U) + let c : ℝ := a * (a ^ d)⁻¹ + let ψ : Vec d → ℝ := fun y => c * φ (a⁻¹ • (y - b)) + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + let dψ : Vec d → ℝ := fun y => (fderiv ℝ ψ y) (basisVec i) + have ha_pos : 0 < a := by + dsimp [a] + linarith + have ha_ne : a ≠ 0 := ha_pos.ne' + have ha_inv_ne : a⁻¹ ≠ 0 := inv_ne_zero ha_ne + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz hε0 (le_of_lt hε1) + have hV_sub : V ⊆ U := + translateSet_smul_subset_of_convexApproxSample_mapsTo (x0 := x0) (z := z) (r := r) (ε := ε) + hmap + have hψ_eq : + ψ = fun y => c * φ (a⁻¹ • (y - b)) := rfl + have h_affine_cancel : ∀ y : Vec d, a • (a⁻¹ • (y - b)) + b = y := by + intro y + rw [smul_smul, mul_inv_cancel₀ ha_ne, one_smul] + abel + have hdφ_zero : + ∀ x, x ∉ U → dφ x = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + have hφ_eq : φ =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := φ)).isOpen_compl.eventually_mem hx_notin |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + show (fderiv ℝ φ x) (basisVec i) = 0 + rw [Filter.EventuallyEq.fderiv_eq hφ_eq] + simp + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + have hinner : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => a⁻¹ • (y - b)) := by + have h1 : ContDiff ℝ (⊤ : ℕ∞) (fun _ : Vec d => a⁻¹) := contDiff_const + have h2 : ContDiff ℝ (⊤ : ℕ∞) (fun y : Vec d => y - b) := + contDiff_id.sub contDiff_const + exact h1.smul h2 + simpa [ψ, hψ_eq] using contDiff_const.mul (hφ_smooth.comp hinner) + have hψ_compact : HasCompactSupport ψ := by + let e : Homeomorph (Vec d) (Vec d) := + (Homeomorph.subRight b).trans (Homeomorph.smulOfNeZero a⁻¹ ha_inv_ne) + have hbase : HasCompactSupport (fun y : Vec d => φ (a⁻¹ • (y - b))) := by + show HasCompactSupport (φ ∘ e) + simpa [e, Function.comp] using hφ_compact.comp_homeomorph e + have hmul : + HasCompactSupport + (fun y : Vec d => (fun _ : Vec d => c) y * (fun y : Vec d => φ (a⁻¹ • (y - b))) y) := by + simpa using! (HasCompactSupport.mul_left (f := fun _ : Vec d => c) hbase) + simpa [ψ, hψ_eq] using hmul + have hψ_subV : tsupport ψ ⊆ V := by + intro y hy + have hy' : + y ∈ tsupport (fun y : Vec d => φ (a⁻¹ • (y - b))) := by + have hsub : + tsupport (fun y : Vec d => c * φ (a⁻¹ • (y - b))) ⊆ + tsupport (fun y : Vec d => φ (a⁻¹ • (y - b))) := + tsupport_mul_subset_right + (f := fun _ : Vec d => c) + (g := fun y : Vec d => φ (a⁻¹ • (y - b))) + exact hsub (by simpa [ψ, hψ_eq] using hy) + let e : Homeomorph (Vec d) (Vec d) := + (Homeomorph.subRight b).trans (Homeomorph.smulOfNeZero a⁻¹ ha_inv_ne) + have hx_tsupport : a⁻¹ • (y - b) ∈ tsupport φ := by + rw [show (fun y : Vec d => φ (a⁻¹ • (y - b))) = φ ∘ e by + funext t + simp [e, Function.comp], + tsupport_comp_eq_preimage φ e] at hy' + exact hy' + let x : Vec d := a⁻¹ • (y - b) + have hxU : x ∈ U := hφ_sub hx_tsupport + refine ⟨a • x, Set.smul_mem_smul_set hxU, ?_⟩ + calc + y = a • x + b := by + dsimp [x] + rw [smul_smul, mul_inv_cancel₀ ha_ne, one_smul] + abel + _ = a • x + ε • (x0 - r • z) := by rfl + have hψ_sub : tsupport ψ ⊆ U := + hψ_subV.trans hV_sub + have hψ_value_zero : + ∀ y ∈ U \ V, ψ y = 0 := by + intro y hy + have hy_notinV : y ∉ V := hy.2 + have hy_notin : y ∉ tsupport ψ := fun hy' => hy_notinV (hψ_subV hy') + exact image_eq_zero_of_notMem_tsupport hy_notin + have hdψ_formula : + ∀ y : Vec d, dψ y = (a ^ d)⁻¹ * dφ (a⁻¹ • (y - b)) := by + intro y + have hbase_smooth : + ContDiff ℝ 1 (fun t : Vec d => φ (a⁻¹ • (t - b))) := by + have hinner : ContDiff ℝ 1 (fun t : Vec d => a⁻¹ • (t - b)) := by + have h1 : ContDiff ℝ 1 (fun _ : Vec d => a⁻¹) := contDiff_const + have h2 : ContDiff ℝ 1 (fun t : Vec d => t - b) := + contDiff_id.sub contDiff_const + exact h1.smul h2 + exact (hφ_smooth.of_le (by simp)).comp hinner + have hbase_diff : DifferentiableAt ℝ (fun t : Vec d => φ (a⁻¹ • (t - b))) y := + (hbase_smooth.contDiffAt).differentiableAt (by simp) + have hderiv_base : + fderiv ℝ (fun t : Vec d => φ (a⁻¹ • (t - b))) y = + a⁻¹ • fderiv ℝ φ (a⁻¹ • (y - b)) := by + calc + fderiv ℝ (fun t : Vec d => φ (a⁻¹ • (t - b))) y + = fderiv ℝ (fun s : Vec d => φ (a⁻¹ • s)) (y - b) := by + simpa [sub_eq_add_neg] using + (fderiv_comp_sub (𝕜 := ℝ) (f := fun s : Vec d => φ (a⁻¹ • s)) (x := y) b) + _ = a⁻¹ • fderiv ℝ φ (a⁻¹ • (y - b)) := by + simpa using + (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y - b) (c := a⁻¹)) + have hcoord : + dψ y = c * ((a⁻¹) * dφ (a⁻¹ • (y - b))) := by + have hderiv : + fderiv ℝ ψ y = + c • fderiv ℝ (fun t : Vec d => φ (a⁻¹ • (t - b))) y := by + simpa [ψ, hψ_eq] using + (fderiv_const_mul + (𝕜 := ℝ) + (a := fun t : Vec d => φ (a⁻¹ • (t - b))) + (x := y) + hbase_diff + c) + change (fderiv ℝ ψ y) (basisVec i) = c * (a⁻¹ * dφ (a⁻¹ • (y - b))) + rw [hderiv] + rw [hderiv_base] + simp [dφ, mul_assoc, smul_smul] + let g : ℝ := dφ (a⁻¹ • (y - b)) + calc + dψ y = c * ((a⁻¹) * g) := hcoord + _ = (c * a⁻¹) * g := by ring + _ = (a ^ d)⁻¹ * g := by + have hc : c * a⁻¹ = (a ^ d)⁻¹ := by + dsimp [c] + field_simp [ha_ne] + rw [hc] + _ = (a ^ d)⁻¹ * dφ (a⁻¹ • (y - b)) := by rfl + have hdψ_zero : + ∀ y ∈ U \ V, dψ y = 0 := by + intro y hy + have hy_notV : y ∉ V := hy.2 + have hx_notU : a⁻¹ • (y - b) ∉ U := by + intro hxU + have hy_memV : y ∈ V := by + refine ⟨a • (a⁻¹ • (y - b)), ?_, ?_⟩ + · exact Set.smul_mem_smul_set hxU + · rw [smul_smul, mul_inv_cancel₀ ha_ne, one_smul] + abel + exact hy_notV hy_memV + rw [hdψ_formula] + simp [hdφ_zero _ hx_notU] + have hweak := hu ψ hψ_smooth hψ_compact hψ_sub + have hleft_restrict : + ∫ y in U, u y * dψ y ∂MeasureTheory.volume = + ∫ y in V, u y * dψ y ∂MeasureTheory.volume := by + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hV_sub (fun y hy => by simp [hdψ_zero y hy]) + have hright_restrict : + ∫ y in U, gi y * ψ y ∂MeasureTheory.volume = + ∫ y in V, gi y * ψ y ∂MeasureTheory.volume := by + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hV_sub (fun y hy => by simp [hψ_value_zero y hy]) + have hleft_change : + ∫ y in V, u y * dψ y ∂MeasureTheory.volume = + ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x ∂MeasureTheory.volume := by + have haux : + (a ^ d)⁻¹ * + ∫ y in V, u y * dφ (a⁻¹ • (y - b)) ∂MeasureTheory.volume = + ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x ∂MeasureTheory.volume := by + calc + (a ^ d)⁻¹ * + ∫ y in V, (fun y : Vec d => u y * dφ (a⁻¹ • (y - b))) y + ∂MeasureTheory.volume + = (a ^ d)⁻¹ * + ∫ y in V, u (a • (a⁻¹ • (y - b)) + b) * dφ (a⁻¹ • (y - b)) + ∂MeasureTheory.volume := by + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards with y + simp [h_affine_cancel y] + _ = ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x + ∂MeasureTheory.volume := by + simpa [V, a, b, smul_eq_mul, convexApproxSample] using + (setIntegral_comp_inv_smul_sub_of_pos + (d := d) + (E := ℝ) + ha_pos + b + U + (fun x : Vec d => u (a • x + b) * dφ x)) + calc + ∫ y in V, u y * dψ y ∂MeasureTheory.volume + = ∫ y in V, u y * ((a ^ d)⁻¹ * dφ (a⁻¹ • (y - b))) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + rw [hdψ_formula y] + _ = ∫ y in V, (a ^ d)⁻¹ * (u y * dφ (a⁻¹ • (y - b))) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + ring + _ = (a ^ d)⁻¹ * + ∫ y in V, (fun y : Vec d => u y * dφ (a⁻¹ • (y - b))) y ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x ∂MeasureTheory.volume := by + exact haux + have hright_change : + ∫ y in V, gi y * ψ y ∂MeasureTheory.volume = + a * ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x ∂MeasureTheory.volume := by + have haux : + (a ^ d)⁻¹ * + ∫ y in V, gi y * φ (a⁻¹ • (y - b)) ∂MeasureTheory.volume = + ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x ∂MeasureTheory.volume := by + calc + (a ^ d)⁻¹ * + ∫ y in V, (fun y : Vec d => gi y * φ (a⁻¹ • (y - b))) y + ∂MeasureTheory.volume + = (a ^ d)⁻¹ * + ∫ y in V, gi (a • (a⁻¹ • (y - b)) + b) * φ (a⁻¹ • (y - b)) + ∂MeasureTheory.volume := by + congr 1 + apply MeasureTheory.integral_congr_ae + filter_upwards with y + simp [h_affine_cancel y] + _ = ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x + ∂MeasureTheory.volume := by + simpa [V, a, b, smul_eq_mul, convexApproxSample] using + (setIntegral_comp_inv_smul_sub_of_pos + (d := d) + (E := ℝ) + ha_pos + b + U + (fun x : Vec d => gi (a • x + b) * φ x)) + calc + ∫ y in V, gi y * ψ y ∂MeasureTheory.volume + = ∫ y in V, gi y * (c * φ (a⁻¹ • (y - b))) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + simp [ψ] + _ = ∫ y in V, c * (gi y * φ (a⁻¹ • (y - b))) ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with y + ring + _ = c * ∫ y in V, (fun y : Vec d => gi y * φ (a⁻¹ • (y - b))) y + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + _ = a * + ((a ^ d)⁻¹ * ∫ y in V, (fun y : Vec d => gi y * φ (a⁻¹ • (y - b))) y + ∂MeasureTheory.volume) := by + dsimp [c] + ring + _ = a * ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x + ∂MeasureTheory.volume := by + rw [haux] + calc + ∫ x in U, u (convexApproxSample x0 z r ε x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume + = ∫ y in U, u y * dψ y ∂MeasureTheory.volume := by + rw [hleft_restrict, hleft_change] + _ = -∫ y in U, gi y * ψ y ∂MeasureTheory.volume := by + simpa [dψ] using hweak + _ = -∫ y in V, gi y * ψ y ∂MeasureTheory.volume := by + rw [hright_restrict] + _ = -(a * ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x + ∂MeasureTheory.volume) := by + rw [hright_change] + _ = -∫ x in U, (a * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + congr 1 + calc + a * ∫ x in U, gi (convexApproxSample x0 z r ε x) * φ x ∂MeasureTheory.volume + = ∫ x in U, a * (gi (convexApproxSample x0 z r ε x) * φ x) + ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_const_mul] + _ = ∫ x in U, (a * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + apply MeasureTheory.integral_congr_ae + filter_upwards with x + ring + _ = -∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + simp [a] + +theorem HasWeakGradientOn.comp_convexApproxSample + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (hu : HasWeakGradientOn U u Du) + {x0 z : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) (hz : ‖z‖ ≤ 1) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + HasWeakGradientOn U + (fun x => u (convexApproxSample x0 z r ε x)) + (fun x i => (1 - ε) * Du (convexApproxSample x0 z r ε x) i) := by + intro i + simpa using + (hu i).comp_convexApproxSample hU hball hr hz hε0 hε1 + +theorem quasiMeasurePreserving_convexApproxSample + {d : ℕ} (x0 z : Vec d) (r ε : ℝ) (hε1 : ε < 1) : + MeasureTheory.Measure.QuasiMeasurePreserving (convexApproxSample x0 z r ε) + MeasureTheory.volume MeasureTheory.volume := by + let a : ℝ := 1 - ε + let b : Vec d := ε • (x0 - r • z) + have ha_ne : a ≠ 0 := by + dsimp [a] + linarith + have hsmul : + MeasureTheory.Measure.QuasiMeasurePreserving (fun x : Vec d => a • x) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.Measure.quasiMeasurePreserving_smul (μ := MeasureTheory.volume) ha_ne + have hadd : + MeasureTheory.MeasurePreserving (fun x : Vec d => x + b) + MeasureTheory.volume MeasureTheory.volume := + MeasureTheory.measurePreserving_add_right MeasureTheory.volume b + simpa [convexApproxSample, a, b, Function.comp] using! + hadd.quasiMeasurePreserving.comp hsmul + +theorem quasiMeasurePreserving_convexApproxSample_prod + {d : ℕ} {U : Set (Vec d)} {ρ : Vec d → ℝ} + (_hρ : IsConvexApproxKernel ρ) + (x0 : Vec d) (r ε : ℝ) (hε1 : ε < 1) : + MeasureTheory.Measure.QuasiMeasurePreserving + (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) + ((MeasureTheory.volume.restrict U).prod (MeasureTheory.volume.restrict (tsupport ρ))) + MeasureTheory.volume := by + refine MeasureTheory.QuasiMeasurePreserving.prod_of_left ?_ ?_ + · have h1 : Measurable (fun p : Vec d × Vec d => (1 - ε) • p.1) := + (measurable_const : Measurable (fun _ : Vec d × Vec d => (1 - ε))).smul measurable_fst + have h2 : Measurable (fun p : Vec d × Vec d => r • p.2) := + (measurable_const : Measurable (fun _ : Vec d × Vec d => r)).smul measurable_snd + have h3 : Measurable (fun p : Vec d × Vec d => x0 - r • p.2) := + (measurable_const : Measurable (fun _ : Vec d × Vec d => x0)).sub h2 + have h4 : Measurable (fun p : Vec d × Vec d => ε • (x0 - r • p.2)) := + (measurable_const : Measurable (fun _ : Vec d × Vec d => ε)).smul h3 + show Measurable (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) + exact h1.add h4 + · refine Filter.Eventually.of_forall ?_ + intro z + exact + (quasiMeasurePreserving_convexApproxSample x0 z r ε hε1).mono_left + MeasureTheory.Measure.absolutelyContinuous_restrict + +theorem aestronglyMeasurable_indicator_comp_convexApproxSample_prod + {d : ℕ} {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {u ρ : Vec d → ℝ} + (hu : MeasureTheory.AEStronglyMeasurable u (MeasureTheory.volume.restrict U)) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε1 : ε < 1) : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => Set.indicator U u (convexApproxSample x0 p.2 r ε p.1)) + ((MeasureTheory.volume.restrict U).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + have hu_ind : + MeasureTheory.AEStronglyMeasurable (Set.indicator U u) MeasureTheory.volume := by + exact (aestronglyMeasurable_indicator_iff hU_meas).2 hu + exact hu_ind.comp_quasiMeasurePreserving + (quasiMeasurePreserving_convexApproxSample_prod (U := U) (ρ := ρ) hρ x0 r ε hε1) + +theorem aestronglyMeasurable_indicator_comp_convexApproxSample_prod_of_locallyIntegrableOn + {d : ℕ} {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {u ρ : Vec d → ℝ} + (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} (hε1 : ε < 1) : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => Set.indicator U u (convexApproxSample x0 p.2 r ε p.1)) + ((MeasureTheory.volume.restrict U).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + exact + aestronglyMeasurable_indicator_comp_convexApproxSample_prod hU_meas + hu.aestronglyMeasurable hρ hε1 + +theorem aestronglyMeasurable_kernel_mul_indicator_comp_convexApproxSample_prod_mul + {d : ℕ} {U : Set (Vec d)} (hU_meas : MeasurableSet U) + {u ρ ψ : Vec d → ℝ} + (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hρ : IsConvexApproxKernel ρ) (hψ : Continuous ψ) (hψ_sub : tsupport ψ ⊆ U) + {x0 : Vec d} {r ε : ℝ} (hε1 : ε < 1) : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U u (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + ((MeasureTheory.volume.restrict (tsupport ψ)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + set μψ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (tsupport ψ) + set μρ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (tsupport ρ) + have hbase : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => Set.indicator U u (convexApproxSample x0 p.2 r ε p.1)) + ((MeasureTheory.volume.restrict U).prod μρ) := + aestronglyMeasurable_indicator_comp_convexApproxSample_prod_of_locallyIntegrableOn hU_meas hu + hρ hε1 + have hμψ_le : μψ ≤ MeasureTheory.volume.restrict U := by + exact MeasureTheory.Measure.restrict_mono_set MeasureTheory.volume hψ_sub + have hprod_le : μψ.prod μρ ≤ (MeasureTheory.volume.restrict U).prod μρ := by + refine MeasureTheory.Measure.le_iff.2 ?_ + intro s hs + rw [MeasureTheory.Measure.prod_apply hs, MeasureTheory.Measure.prod_apply hs] + exact MeasureTheory.lintegral_mono' hμψ_le le_rfl + have hcomp : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => Set.indicator U u (convexApproxSample x0 p.2 r ε p.1)) + (μψ.prod μρ) := + hbase.mono_measure hprod_le + have hρ_meas : + MeasureTheory.AEStronglyMeasurable (fun p : Vec d × Vec d => ρ p.2) (μψ.prod μρ) := + (hρ.continuous.comp continuous_snd).aestronglyMeasurable + have hψ_meas : + MeasureTheory.AEStronglyMeasurable (fun p : Vec d × Vec d => ψ p.1) (μψ.prod μρ) := + (hψ.comp continuous_fst).aestronglyMeasurable + simpa [mul_assoc] using! hρ_meas.mul (hcomp.mul hψ_meas) + +theorem integrable_kernel_mul_indicator_comp_convexApproxSample_prod_mul_of_integrableOn + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u ρ ψ : Vec d → ℝ} (hu : MeasureTheory.IntegrableOn u U MeasureTheory.volume) + (hρ : IsConvexApproxKernel ρ) (hψ : Continuous ψ) (hψ_compact : HasCompactSupport ψ) + (hψ_sub : tsupport ψ ⊆ U) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.Integrable + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U u (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + ((MeasureTheory.volume.restrict (tsupport ψ)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + set μψ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (tsupport ψ) + set μρ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict (tsupport ρ) + let a : ℝ := 1 - ε + have ha_pos : 0 < a := by + dsimp [a] + linarith + have huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume := hu.locallyIntegrableOn + have hmeas : + MeasureTheory.AEStronglyMeasurable + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U u (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + (μψ.prod μρ) := by + simpa [μψ, μρ] using + aestronglyMeasurable_kernel_mul_indicator_comp_convexApproxSample_prod_mul + hU.1.measurableSet huLoc hρ hψ hψ_sub hε1 + refine (MeasureTheory.integrable_prod_iff' hmeas).2 ?_ + constructor + · filter_upwards [MeasureTheory.ae_restrict_mem hρ.compactSupport.isCompact.measurableSet] with z hz + have hz_norm : ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hz + simpa [μψ, MeasureTheory.Integrable] using + (integrableOn_kernel_mul_indicator_comp_convexApproxSample_mul_of_locallyIntegrableOn + hU huLoc hψ hψ_sub hψ_compact.isCompact hball hr hz_norm hε0 hε1).integrable + · obtain ⟨C0, hC0⟩ := hψ_compact.exists_bound_of_continuous hψ + let Cψ : ℝ := max C0 0 + have hCψ_nonneg : 0 ≤ Cψ := by + dsimp [Cψ] + positivity + have hψ_bound : ∀ x, ‖ψ x‖ ≤ Cψ := by + intro x + exact le_trans (hC0 x) (le_max_left _ _) + let Cu : ℝ := ∫ y in U, |u y| ∂MeasureTheory.volume + have hCu_nonneg : 0 ≤ Cu := by + dsimp [Cu] + exact MeasureTheory.integral_nonneg_of_ae (Filter.Eventually.of_forall fun y => abs_nonneg _) + let bound : Vec d → ℝ := fun z => ρ z * (Cψ * ((a ^ d)⁻¹ * Cu)) + have hbound_int : + MeasureTheory.Integrable (fun z => bound z) μρ := by + have hbound_volume : + MeasureTheory.Integrable (fun z => bound z) MeasureTheory.volume := by + have hcont : Continuous (fun z => bound z) := by + simpa [bound] using! hρ.continuous.mul continuous_const + have hcomp : HasCompactSupport (fun z => bound z) := by + simpa [bound] using! + (hρ.compactSupport.mul_right : + HasCompactSupport (fun z => ρ z * (Cψ * ((a ^ d)⁻¹ * Cu))) + ) + exact hcont.integrable_of_hasCompactSupport hcomp + simpa [μρ] using (MeasureTheory.Integrable.restrict (s := tsupport ρ) hbound_volume) + have hinner_meas : + MeasureTheory.AEStronglyMeasurable + (fun z => + ∫ x, + ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ + ∂μψ) + μρ := by + simpa using hmeas.norm.prod_swap.integral_prod_right' + refine MeasureTheory.Integrable.mono hbound_int hinner_meas ?_ + filter_upwards with z + by_cases hzρ : z ∈ tsupport ρ + · let V : Set (Vec d) := translateSet (ε • (x0 - r • z)) (a • U) + have hz_norm : ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hzρ + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz_norm hε0 + (le_of_lt hε1) + have hsample_int_ψ : + MeasureTheory.IntegrableOn + (fun x => |u (convexApproxSample x0 z r ε x)|) + (tsupport ψ) MeasureTheory.volume := by + have hu_norm : + MeasureTheory.IntegrableOn (fun y => ‖u y‖) U MeasureTheory.volume := hu.norm + simpa [Real.norm_eq_abs] using + integrableOn_comp_convexApproxSample_of_locallyIntegrableOn hU hu_norm.locallyIntegrableOn + hψ_sub hψ_compact.isCompact hball hr hz_norm hε0 hε1 + have hsample_int_U : + MeasureTheory.IntegrableOn + (fun x => |u (convexApproxSample x0 z r ε x)|) + U MeasureTheory.volume := by + simpa [Real.norm_eq_abs] using + integrableOn_comp_convexApproxSample hU (show MeasureTheory.IntegrableOn (fun y => ‖u y‖) U MeasureTheory.volume from hu.norm) + hball hr hz_norm hε0 hε1 + have hdom_int : + MeasureTheory.Integrable + (fun x => ρ z * (|u (convexApproxSample x0 z r ε x)| * Cψ)) μψ := by + simpa [μψ, MeasureTheory.Integrable, mul_assoc, mul_left_comm, mul_comm] using + ((hsample_int_ψ.integrable.mul_const Cψ).const_mul (ρ z)) + have hinner_int : + MeasureTheory.Integrable + (fun x => ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x) μψ := by + simpa [μψ, MeasureTheory.Integrable] using + (integrableOn_kernel_mul_indicator_comp_convexApproxSample_mul_of_locallyIntegrableOn + hU huLoc hψ hψ_sub hψ_compact.isCompact hball hr hz_norm hε0 hε1).integrable + have hpointwise : + (fun x => + ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖) + ≤ᵐ[μψ] + (fun x => ρ z * (|u (convexApproxSample x0 z r ε x)| * Cψ)) := by + filter_upwards [MeasureTheory.ae_restrict_mem hψ_compact.isCompact.measurableSet] with x hx + have hxU : x ∈ U := hψ_sub hx + have hsample_mem : convexApproxSample x0 z r ε x ∈ U := hmap hxU + calc + ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ + = ρ z * (|u (convexApproxSample x0 z r ε x)| * ‖ψ x‖) := by + rw [Set.indicator_of_mem hsample_mem] + simp [Real.norm_eq_abs, abs_of_nonneg (hρ.nonneg z), mul_left_comm, mul_comm] + _ ≤ ρ z * (|u (convexApproxSample x0 z r ε x)| * Cψ) := by + refine mul_le_mul_of_nonneg_left ?_ (hρ.nonneg z) + exact mul_le_mul_of_nonneg_left (hψ_bound x) (abs_nonneg _) + have hsample_bound : + ∫ x, |u (convexApproxSample x0 z r ε x)| ∂μψ ≤ (a ^ d)⁻¹ * Cu := by + have hmono : + ∫ x in tsupport ψ, |u (convexApproxSample x0 z r ε x)| ∂MeasureTheory.volume ≤ + ∫ x in U, |u (convexApproxSample x0 z r ε x)| ∂MeasureTheory.volume := by + exact MeasureTheory.setIntegral_mono_set hsample_int_U + (Filter.Eventually.of_forall fun x => abs_nonneg _) + (Filter.Eventually.of_forall hψ_sub) + have hV_sub : V ⊆ U := + translateSet_smul_subset_of_convexApproxSample_mapsTo (x0 := x0) (z := z) (r := r) + (ε := ε) hmap + have hchange : + ∫ x in U, |u (convexApproxSample x0 z r ε x)| ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in V, |u y| ∂MeasureTheory.volume := by + simpa [convexApproxSample, a, V, smul_eq_mul] using + (setIntegral_comp_smul_add_of_pos (d := d) (E := ℝ) ha_pos + (ε • (x0 - r • z)) U (fun y => |u y|)) + have hV_le : + ∫ y in V, |u y| ∂MeasureTheory.volume ≤ Cu := by + exact MeasureTheory.setIntegral_mono_set hu.norm + (Filter.Eventually.of_forall fun y => abs_nonneg _) + (Filter.Eventually.of_forall hV_sub) + exact + calc + ∫ x, |u (convexApproxSample x0 z r ε x)| ∂μψ + = ∫ x in tsupport ψ, |u (convexApproxSample x0 z r ε x)| ∂MeasureTheory.volume := by + simp [μψ] + _ ≤ ∫ x in U, |u (convexApproxSample x0 z r ε x)| ∂MeasureTheory.volume := hmono + _ = (a ^ d)⁻¹ * ∫ y in V, |u y| ∂MeasureTheory.volume := hchange + _ ≤ (a ^ d)⁻¹ * Cu := by + refine mul_le_mul_of_nonneg_left hV_le ?_ + positivity + show ‖∫ x, ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ ∂μψ‖ ≤ + ‖bound z‖ + calc + ‖∫ x, ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ ∂μψ‖ + = ∫ x, ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ ∂μψ := by + have hinner_nonneg : + 0 ≤ ∫ x, ‖ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * ψ x‖ ∂μψ := by + exact + MeasureTheory.integral_nonneg_of_ae + (Filter.Eventually.of_forall fun x => norm_nonneg _) + rw [Real.norm_eq_abs, abs_of_nonneg hinner_nonneg] + _ ≤ ∫ x, ρ z * (|u (convexApproxSample x0 z r ε x)| * Cψ) ∂μψ := by + exact MeasureTheory.integral_mono_ae hinner_int.norm hdom_int hpointwise + _ = ρ z * (Cψ * ∫ x, |u (convexApproxSample x0 z r ε x)| ∂μψ) := by + rw [MeasureTheory.integral_const_mul, MeasureTheory.integral_mul_const] + ring + _ ≤ ρ z * (Cψ * ((a ^ d)⁻¹ * Cu)) := by + refine mul_le_mul_of_nonneg_left ?_ (hρ.nonneg z) + exact mul_le_mul_of_nonneg_left hsample_bound hCψ_nonneg + _ = bound z := by + rfl + _ = ‖bound z‖ := by + have hbound_nonneg : 0 ≤ bound z := by + dsimp [bound] + exact + mul_nonneg (hρ.nonneg z) <| + mul_nonneg hCψ_nonneg <| mul_nonneg (by positivity) hCu_nonneg + rw [Real.norm_eq_abs, abs_of_nonneg hbound_nonneg] + · have hρz : ρ z = 0 := image_eq_zero_of_notMem_tsupport (f := ρ) hzρ + simp [bound, hρz] + +theorem integrable_kernel_mul_indicator_comp_convexApproxSample_prod_mul_of_locallyIntegrableOn + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u ρ ψ : Vec d → ℝ} (hu : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hρ : IsConvexApproxKernel ρ) (hψ : Continuous ψ) (hψ_compact : HasCompactSupport ψ) + (hψ_sub : tsupport ψ ⊆ U) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + MeasureTheory.Integrable + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U u (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + ((MeasureTheory.volume.restrict (tsupport ψ)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + let K : Set (Vec d × Vec d) := tsupport ψ ×ˢ tsupport ρ + let W : Set (Vec d) := (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) '' K + let uW : Vec d → ℝ := Set.indicator W u + have hK_meas : MeasurableSet K := by + exact hψ_compact.isCompact.measurableSet.prod hρ.compactSupport.isCompact.measurableSet + have hK_compact : IsCompact K := by + exact hψ_compact.isCompact.prod hρ.compactSupport.isCompact + have hcont_sample_prod : Continuous (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) := by + have h1 : Continuous (fun p : Vec d × Vec d => (1 - ε) • p.1) := + (continuous_const : Continuous (fun _ : Vec d × Vec d => (1 - ε))).smul continuous_fst + have h2 : Continuous (fun p : Vec d × Vec d => r • p.2) := + (continuous_const : Continuous (fun _ : Vec d × Vec d => r)).smul continuous_snd + have h3 : Continuous (fun p : Vec d × Vec d => x0 - r • p.2) := + (continuous_const : Continuous (fun _ : Vec d × Vec d => x0)).sub h2 + have h4 : Continuous (fun p : Vec d × Vec d => ε • (x0 - r • p.2)) := + (continuous_const : Continuous (fun _ : Vec d × Vec d => ε)).smul h3 + show Continuous (fun p : Vec d × Vec d => convexApproxSample x0 p.2 r ε p.1) + exact h1.add h4 + have hW_compact : IsCompact W := by + exact hK_compact.image hcont_sample_prod + have hW_sub : W ⊆ U := by + intro y hy + rcases hy with ⟨p, hp, rfl⟩ + have hz_norm : ‖p.2‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hp.2 + exact + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz_norm hε0 + (le_of_lt hε1) (hψ_sub hp.1) + have huW_on_W : MeasureTheory.IntegrableOn u W MeasureTheory.volume := by + exact hu.integrableOn_compact_subset hW_sub hW_compact + have huW_volume : MeasureTheory.Integrable uW MeasureTheory.volume := by + exact huW_on_W.integrable_indicator hW_compact.measurableSet + have huW_on_U : MeasureTheory.IntegrableOn uW U MeasureTheory.volume := by + exact huW_volume.integrableOn + have htrunc : + MeasureTheory.Integrable + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U uW (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + ((MeasureTheory.volume.restrict (tsupport ψ)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + exact + integrable_kernel_mul_indicator_comp_convexApproxSample_prod_mul_of_integrableOn + hU huW_on_U hρ hψ hψ_compact hψ_sub hball hr hε0 hε1 + have hcongr : + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U uW (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) + =ᵐ[((MeasureTheory.volume.restrict (tsupport ψ)).prod + (MeasureTheory.volume.restrict (tsupport ρ)))] + (fun p : Vec d × Vec d => + ρ p.2 * Set.indicator U u (convexApproxSample x0 p.2 r ε p.1) * ψ p.1) := by + rw [MeasureTheory.Measure.prod_restrict] + exact + (MeasureTheory.ae_restrict_iff' hK_meas).2 <| + Filter.Eventually.of_forall fun p hp => by + let y : Vec d := convexApproxSample x0 p.2 r ε p.1 + have hsample_mem_W : y ∈ W := by + exact Set.mem_image_of_mem (fun q : Vec d × Vec d => + convexApproxSample x0 q.2 r ε q.1) hp + have hsample_mem_U : y ∈ U := hW_sub hsample_mem_W + have hleft : Set.indicator U uW y = u y := by + rw [Set.indicator_of_mem hsample_mem_U] + have hWu : Set.indicator W u y = u y := by + simpa using (Set.indicator_of_mem (s := W) (f := u) hsample_mem_W) + simpa [uW] using hWu + have hright : Set.indicator U u y = u y := by + rw [Set.indicator_of_mem hsample_mem_U] + change ρ p.2 * Set.indicator U uW y * ψ p.1 = ρ p.2 * Set.indicator U u y * ψ p.1 + rw [hleft, hright] + exact htrunc.congr hcongr + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivSmoothing.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivSmoothing.lean new file mode 100644 index 0000000000..8fb33321d3 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvexApproxSmoothing/WeakDerivSmoothing.lean @@ -0,0 +1,426 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.WeakDerivComp + +/-! # Weak Deriv Smoothing -/ + +@[expose] public section + +namespace Homogenization + +open scoped Pointwise Convolution + +/-! +# Weak derivatives of the convex smoothing operator + +Lifts `HasWeakPartialDerivOn` (and the `HasWeakGradientOn` gradient variant) +through `convexApproxSmoothing` and the globally smooth representative +`convexApproxSmoothRepresentative`. +-/ + +theorem HasWeakPartialDerivOn.convexApproxSmoothing + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {i : Fin d} {u gi ρ : Vec d → ℝ} + (huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hgiLoc : MeasureTheory.LocallyIntegrableOn gi U MeasureTheory.volume) + (hu : HasWeakPartialDerivOn U i u gi) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + HasWeakPartialDerivOn U i + (Homogenization.convexApproxSmoothing ρ u x0 r ε) + (fun x => (1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) := by + intro φ hφ_smooth hφ_compact hφ_sub + let dφ : Vec d → ℝ := fun x => (fderiv ℝ φ x) (basisVec i) + let φε : Vec d → ℝ := fun x => (1 - ε) * φ x + let F : Vec d → Vec d → ℝ := fun x z => + ρ z * Set.indicator U u (convexApproxSample x0 z r ε x) * dφ x + let G : Vec d → Vec d → ℝ := fun x z => + ρ z * Set.indicator U gi (convexApproxSample x0 z r ε x) * φε x + have hdφ_cont : Continuous dφ := by + simpa [dφ] using + (hφ_smooth.continuous_fderiv (by simp)).clm_apply continuous_const + have hdφ_compact : HasCompactSupport dφ := by + simpa [dφ] using hφ_compact.fderiv_apply (𝕜 := ℝ) (basisVec i) + have hdφ_support_sub : Function.support dφ ⊆ tsupport φ := by + intro x hx + exact + (support_fderiv_subset (𝕜 := ℝ) (f := φ)) <| by + change fderiv ℝ φ x ≠ 0 + intro hzero + apply hx + simp [dφ, hzero] + have hdφ_subφ : tsupport dφ ⊆ tsupport φ := + closure_minimal hdφ_support_sub (isClosed_tsupport (f := φ)) + have hdφ_sub : tsupport dφ ⊆ U := hdφ_subφ.trans hφ_sub + have hφε_cont : Continuous φε := by + simpa [φε] using! continuous_const.mul hφ_smooth.continuous + have hφε_compact : HasCompactSupport φε := by + simpa [φε] using! (HasCompactSupport.mul_left (f := fun _ : Vec d => 1 - ε) hφ_compact) + have hφε_subφ : tsupport φε ⊆ tsupport φ := by + let hsub := + tsupport_mul_subset_right (f := fun _ : Vec d => 1 - ε) (g := φ) + intro x hx + exact hsub (by simpa [φε] using hx) + have hφε_sub : tsupport φε ⊆ U := hφε_subφ.trans hφ_sub + have hprod_left : + MeasureTheory.Integrable + (fun p : Vec d × Vec d => F p.1 p.2) + ((MeasureTheory.volume.restrict (tsupport dφ)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + simpa [F, dφ] using + integrable_kernel_mul_indicator_comp_convexApproxSample_prod_mul_of_locallyIntegrableOn + hU huLoc hρ hdφ_cont hdφ_compact hdφ_sub hball hr hε0 hε1 + have hprod_right : + MeasureTheory.Integrable + (fun p : Vec d × Vec d => G p.1 p.2) + ((MeasureTheory.volume.restrict (tsupport φε)).prod + (MeasureTheory.volume.restrict (tsupport ρ))) := by + simpa [G, φε] using + integrable_kernel_mul_indicator_comp_convexApproxSample_prod_mul_of_locallyIntegrableOn + hU hgiLoc hρ hφε_cont hφε_compact hφε_sub hball hr hε0 hε1 + have hswap_left : + ∫ x in tsupport dφ, ∫ z in tsupport ρ, F x z ∂MeasureTheory.volume ∂MeasureTheory.volume = + ∫ z in tsupport ρ, ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume ∂MeasureTheory.volume := by + simpa using + (MeasureTheory.integral_integral_swap + (μ := MeasureTheory.volume.restrict (tsupport dφ)) + (ν := MeasureTheory.volume.restrict (tsupport ρ)) + (f := F) hprod_left) + have hswap_right : + ∫ x in tsupport φε, ∫ z in tsupport ρ, G x z ∂MeasureTheory.volume ∂MeasureTheory.volume = + ∫ z in tsupport ρ, ∫ x in tsupport φε, G x z ∂MeasureTheory.volume ∂MeasureTheory.volume := by + simpa using + (MeasureTheory.integral_integral_swap + (μ := MeasureTheory.volume.restrict (tsupport φε)) + (ν := MeasureTheory.volume.restrict (tsupport ρ)) + (f := G) hprod_right) + have hleft_restrict : + ∫ x in U, Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x ∂MeasureTheory.volume = + ∫ x in tsupport dφ, Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x + ∂MeasureTheory.volume := by + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hdφ_sub (fun x hx => by + simp [dφ, image_eq_zero_of_notMem_tsupport hx.2]) + have hright_restrict : + ∫ x in U, Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + ∂MeasureTheory.volume = + ∫ x in tsupport φε, Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + ∂MeasureTheory.volume := by + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hφε_sub (fun x hx => by + simp [φε, image_eq_zero_of_notMem_tsupport hx.2]) + have hinner_left_eq : + ∫ x in tsupport dφ, Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x + ∂MeasureTheory.volume = + ∫ x in tsupport dφ, ∫ z in tsupport ρ, F x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hdφ_compact.isCompact.measurableSet ?_ + intro x hx + have hxU : x ∈ U := hdφ_sub hx + have hsample_mem : ∀ z ∈ tsupport ρ, convexApproxSample x0 z r ε x ∈ U := by + intro z hz + have hz_norm : ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hz + exact + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz_norm hε0 + (le_of_lt hε1) hxU + calc + Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x + = (∫ z in tsupport ρ, ρ z * u (convexApproxSample x0 z r ε x) + ∂MeasureTheory.volume) * dφ x := by + rfl + _ = ∫ z in tsupport ρ, (ρ z * u (convexApproxSample x0 z r ε x)) * dφ x + ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_mul_const] + _ = ∫ z in tsupport ρ, F x z ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hρ.compactSupport.isCompact.measurableSet ?_ + intro z hz + let y : Vec d := convexApproxSample x0 z r ε x + have hy_mem : y ∈ U := hsample_mem z hz + change ρ z * u y * dφ x = ρ z * Set.indicator U u y * dφ x + have hy_eq : Set.indicator U u y = u y := Set.indicator_of_mem (s := U) (f := u) hy_mem + simpa [mul_assoc] using congrArg (fun t => ρ z * t * dφ x) hy_eq.symm + have hinner_right_eq : + ∫ x in tsupport φε, Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + ∂MeasureTheory.volume = + ∫ x in tsupport φε, ∫ z in tsupport ρ, G x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hφε_compact.isCompact.measurableSet ?_ + intro x hx + have hxU : x ∈ U := hφε_sub hx + have hsample_mem : ∀ z ∈ tsupport ρ, convexApproxSample x0 z r ε x ∈ U := by + intro z hz + have hz_norm : ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hz + exact + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz_norm hε0 + (le_of_lt hε1) hxU + calc + Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + = (∫ z in tsupport ρ, ρ z * gi (convexApproxSample x0 z r ε x) + ∂MeasureTheory.volume) * φε x := by + rfl + _ = ∫ z in tsupport ρ, (ρ z * gi (convexApproxSample x0 z r ε x)) * φε x + ∂MeasureTheory.volume := by + rw [← MeasureTheory.integral_mul_const] + _ = ∫ z in tsupport ρ, G x z ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hρ.compactSupport.isCompact.measurableSet ?_ + intro z hz + let y : Vec d := convexApproxSample x0 z r ε x + have hy_mem : y ∈ U := hsample_mem z hz + change ρ z * gi y * φε x = ρ z * Set.indicator U gi y * φε x + have hy_eq : Set.indicator U gi y = gi y := Set.indicator_of_mem (s := U) (f := gi) hy_mem + simpa [mul_assoc] using congrArg (fun t => ρ z * t * φε x) hy_eq.symm + have hfixed_z : + ∀ z ∈ tsupport ρ, + ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume = + -∫ x in tsupport φε, G x z ∂MeasureTheory.volume := by + intro z hz + have hz_norm : ‖z‖ ≤ 1 := by + simpa [Metric.mem_closedBall, dist_eq_norm] using hρ.support_subset_closedBall hz + have hmap : + Set.MapsTo (convexApproxSample x0 z r ε) U U := + convexApproxSample_mapsTo_of_isOpenBoundedConvexDomain hU hball hr hz_norm hε0 + (le_of_lt hε1) + have hweak_z : + ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x ∂MeasureTheory.volume = + -∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + simpa [dφ] using + ((hu.comp_convexApproxSample hU hball hr hz_norm hε0 hε1) φ hφ_smooth hφ_compact hφ_sub) + have hleft_z : + ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume = + ρ z * ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x ∂MeasureTheory.volume := by + calc + ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume + = ∫ x in U, F x z ∂MeasureTheory.volume := by + symm + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hdφ_sub (fun x hx => by + simp [F, dφ, image_eq_zero_of_notMem_tsupport hx.2]) + _ = ∫ x in U, ρ z * (u (convexApproxSample x0 z r ε x) * dφ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU.1.measurableSet ?_ + intro x hx + let y : Vec d := convexApproxSample x0 z r ε x + have hy_mem : y ∈ U := hmap hx + change ρ z * Set.indicator U u y * dφ x = ρ z * (u y * dφ x) + have hy_eq : Set.indicator U u y = u y := Set.indicator_of_mem (s := U) (f := u) hy_mem + simpa [mul_assoc] using congrArg (fun t => ρ z * t * dφ x) hy_eq + _ = ρ z * ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + have hright_z : + ∫ x in tsupport φε, G x z ∂MeasureTheory.volume = + ρ z * + ∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + calc + ∫ x in tsupport φε, G x z ∂MeasureTheory.volume + = ∫ x in U, G x z ∂MeasureTheory.volume := by + symm + exact + MeasureTheory.setIntegral_eq_of_subset_of_forall_sdiff_eq_zero + hU.1.measurableSet hφε_sub (fun x hx => by + simp [G, φε, image_eq_zero_of_notMem_tsupport hx.2]) + _ = ∫ x in U, + ρ z * (((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x) + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU.1.measurableSet ?_ + intro x hx + let y : Vec d := convexApproxSample x0 z r ε x + have hy_mem : y ∈ U := hmap hx + change ρ z * Set.indicator U gi y * ((1 - ε) * φ x) = + ρ z * (((1 - ε) * gi y) * φ x) + have hy_eq : Set.indicator U gi y = gi y := Set.indicator_of_mem (s := U) (f := gi) hy_mem + calc + ρ z * Set.indicator U gi y * ((1 - ε) * φ x) + = ρ z * gi y * ((1 - ε) * φ x) := by + simpa [mul_assoc] using congrArg (fun t => ρ z * t * ((1 - ε) * φ x)) hy_eq + _ = ρ z * (((1 - ε) * gi y) * φ x) := by + ring + _ = ρ z * + ∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_const_mul] + calc + ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume + = ρ z * ∫ x in U, u (convexApproxSample x0 z r ε x) * dφ x + ∂MeasureTheory.volume := hleft_z + _ = ρ z * + (-∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume) := by + rw [hweak_z] + _ = -(ρ z * + ∫ x in U, ((1 - ε) * gi (convexApproxSample x0 z r ε x)) * φ x + ∂MeasureTheory.volume) := by + ring + _ = -∫ x in tsupport φε, G x z ∂MeasureTheory.volume := by + rw [← hright_z] + have hz_integrated : + ∫ z in tsupport ρ, ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume + ∂MeasureTheory.volume = + ∫ z in tsupport ρ, -∫ x in tsupport φε, G x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hρ.compactSupport.isCompact.measurableSet ?_ + intro z hz + exact hfixed_z z hz + calc + ∫ x in U, Homogenization.convexApproxSmoothing ρ u x0 r ε x * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume + = ∫ x in U, Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x + ∂MeasureTheory.volume := by + simp [dφ] + _ = ∫ x in tsupport dφ, Homogenization.convexApproxSmoothing ρ u x0 r ε x * dφ x + ∂MeasureTheory.volume := hleft_restrict + _ = ∫ x in tsupport dφ, ∫ z in tsupport ρ, F x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := hinner_left_eq + _ = ∫ z in tsupport ρ, ∫ x in tsupport dφ, F x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := hswap_left + _ = ∫ z in tsupport ρ, -∫ x in tsupport φε, G x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := hz_integrated + _ = -∫ z in tsupport ρ, ∫ x in tsupport φε, G x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_neg] + _ = -∫ x in tsupport φε, ∫ z in tsupport ρ, G x z ∂MeasureTheory.volume + ∂MeasureTheory.volume := by + rw [← hswap_right] + _ = -∫ x in tsupport φε, Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + ∂MeasureTheory.volume := by + rw [← hinner_right_eq] + _ = -∫ x in U, Homogenization.convexApproxSmoothing ρ gi x0 r ε x * φε x + ∂MeasureTheory.volume := by + rw [← hright_restrict] + _ = -∫ x in U, ((1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) * φ x + ∂MeasureTheory.volume := by + congr 1 + refine MeasureTheory.setIntegral_congr_fun hU.1.measurableSet ?_ + intro x hx + simp [φε, mul_assoc, mul_comm] + +theorem HasWeakGradientOn.convexApproxSmoothing + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} {Du : Vec d → Vec d} {ρ : Vec d → ℝ} + (huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hDuLoc : ∀ i : Fin d, MeasureTheory.LocallyIntegrableOn (fun x => Du x i) U MeasureTheory.volume) + (hu : HasWeakGradientOn U u Du) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 ≤ r) + (hε0 : 0 ≤ ε) (hε1 : ε < 1) : + HasWeakGradientOn U + (Homogenization.convexApproxSmoothing ρ u x0 r ε) + (fun x i => (1 - ε) * Homogenization.convexApproxSmoothing ρ (fun y => Du y i) x0 r ε x) := by + intro i + simpa using + (HasWeakPartialDerivOn.convexApproxSmoothing (i := i) hU huLoc (hDuLoc i) (hu i) hρ + hball hr hε0 hε1) + +theorem HasWeakPartialDerivOn.convexApproxSmoothRepresentative + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {i : Fin d} {u gi ρ : Vec d → ℝ} + (huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hgiLoc : MeasureTheory.LocallyIntegrableOn gi U MeasureTheory.volume) + (hu : HasWeakPartialDerivOn U i u gi) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) : + HasWeakPartialDerivOn U i + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) := by + intro φ hφ_smooth hφ_compact hφ_sub + have hweak : + HasWeakPartialDerivOn U i + (Homogenization.convexApproxSmoothing ρ u x0 r ε) + (fun x => (1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) := + HasWeakPartialDerivOn.convexApproxSmoothing (i := i) hU huLoc hgiLoc hu hρ hball + hr.le hε0.le hε1 + have hleft : + ∫ x in U, + Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, + Homogenization.convexApproxSmoothing ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU.1.measurableSet ?_ + intro x hx + have hrep : + Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε x = + Homogenization.convexApproxSmoothing ρ u x0 r ε x := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := u) hU hρ hx hball hr hε0 hε1 + change + Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) = + Homogenization.convexApproxSmoothing ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) + rw [hrep] + have hright : + ∫ x in U, + ((1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) * φ x + ∂MeasureTheory.volume = + ∫ x in U, + ((1 - ε) * Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) * φ x + ∂MeasureTheory.volume := by + refine MeasureTheory.setIntegral_congr_fun hU.1.measurableSet ?_ + intro x hx + have hrep : + Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x = + Homogenization.convexApproxSmoothing ρ gi x0 r ε x := + convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := gi) hU hρ hx hball hr hε0 hε1 + change + ((1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) * φ x = + ((1 - ε) * Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) * + φ x + rw [hrep] + calc + ∫ x in U, + Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, + Homogenization.convexApproxSmoothing ρ u x0 r ε x * + (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume := hleft + _ = -∫ x in U, + ((1 - ε) * Homogenization.convexApproxSmoothing ρ gi x0 r ε x) * φ x + ∂MeasureTheory.volume := + hweak φ hφ_smooth hφ_compact hφ_sub + _ = -∫ x in U, + ((1 - ε) * Homogenization.convexApproxSmoothRepresentative U ρ gi x0 r ε x) * φ x + ∂MeasureTheory.volume := by + rw [hright] + +theorem HasWeakGradientOn.convexApproxSmoothRepresentative + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {u : Vec d → ℝ} {Du : Vec d → Vec d} {ρ : Vec d → ℝ} + (huLoc : MeasureTheory.LocallyIntegrableOn u U MeasureTheory.volume) + (hDuLoc : ∀ i : Fin d, MeasureTheory.LocallyIntegrableOn (fun x => Du x i) U + MeasureTheory.volume) + (hu : HasWeakGradientOn U u Du) + (hρ : IsConvexApproxKernel ρ) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) : + HasWeakGradientOn U + (Homogenization.convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x i => (1 - ε) * + Homogenization.convexApproxSmoothRepresentative U ρ (fun y => Du y i) x0 r ε x) := by + intro i + simpa using + (HasWeakPartialDerivOn.convexApproxSmoothRepresentative (i := i) hU huLoc (hDuLoc i) + (hu i) hρ hball hr hε0 hε1) + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvolutionLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvolutionLp.lean new file mode 100644 index 0000000000..c54c446ddf --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ConvolutionLp.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Analysis.Convex.Integral +public import Mathlib.Analysis.Convex.SpecificFunctions.Basic +public import Mathlib.Analysis.Convolution +public import Mathlib.Analysis.Normed.Module.Convex +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.MeasureTheory.Integral.Prod + +/-! # Convolution Lp -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Convolution +open MeasureTheory + +noncomputable section + +/-- The function `x ↦ |x|^p` is convex on `ℝ` for `p ≥ 1`. -/ +lemma convexOn_abs_rpow {p : ℝ} (hp : 1 ≤ p) : + ConvexOn ℝ Set.univ (fun x : ℝ => |x| ^ p) := by + have h1 : ConvexOn ℝ Set.univ (fun x : ℝ => |x|) := convexOn_univ_norm + have h2 : ConvexOn ℝ (Set.Ici 0) (fun t : ℝ => t ^ p) := convexOn_rpow hp + have h3 : MonotoneOn (fun t : ℝ => t ^ p) (Set.Ici 0) := by + intro a ha b hb hab + exact Real.rpow_le_rpow ha hab (le_trans zero_le_one hp) + have himg : (fun x : ℝ => |x|) '' Set.univ ⊆ Set.Ici 0 := by + intro y hy + rcases hy with ⟨x, -, rfl⟩ + exact abs_nonneg x + have himg_convex : Convex ℝ ((fun x : ℝ => |x|) '' Set.univ) := by + have heq : (fun x : ℝ => |x|) '' Set.univ = Set.Ici 0 := by + ext y + simp only [Set.mem_image, Set.mem_univ, true_and, Set.mem_Ici] + constructor + · rintro ⟨x, rfl⟩ + exact abs_nonneg x + · intro hy + exact ⟨y, abs_of_nonneg hy⟩ + rw [heq] + exact convex_Ici 0 + exact (h2.subset himg himg_convex).comp h1 (h3.mono himg) + +/-- A real-valued density of integral `1` yields a probability measure via +`withDensity`. -/ +lemma isProbabilityMeasure_withDensity_ofReal + {α : Type*} [MeasurableSpace α] {μ : Measure α} {ρ : α → ℝ} + (hρ_nonneg : ∀ x, 0 ≤ ρ x) (hρ_int : Integrable ρ μ) (hρ_one : ∫ x, ρ x ∂μ = 1) : + IsProbabilityMeasure (μ.withDensity fun x => ENNReal.ofReal (ρ x)) := by + constructor + rw [withDensity_apply _ MeasurableSet.univ, Measure.restrict_univ] + rw [← ofReal_integral_eq_lintegral_ofReal hρ_int (ae_of_all _ hρ_nonneg), hρ_one] + simp + +/-- Jensen's inequality for `x ↦ |x|^p` against a probability measure. -/ +lemma jensen_abs_rpow_integral + {α : Type*} [MeasurableSpace α] (μ : Measure α) [IsProbabilityMeasure μ] + {f : α → ℝ} {p : ℝ} (hp : 1 ≤ p) + (hf : Integrable f μ) (hfpow : Integrable (fun x => |f x| ^ p) μ) : + |∫ x, f x ∂μ| ^ p ≤ ∫ x, |f x| ^ p ∂μ := by + have hconv : ConvexOn ℝ Set.univ (fun x : ℝ => |x| ^ p) := convexOn_abs_rpow hp + have hcont : ContinuousOn (fun x : ℝ => |x| ^ p) Set.univ := by + exact (continuous_abs.rpow_const fun _ => Or.inr (le_trans zero_le_one hp)).continuousOn + have hclosed : IsClosed (Set.univ : Set ℝ) := isClosed_univ + have hfs : ∀ᵐ x ∂μ, f x ∈ Set.univ := Filter.Eventually.of_forall (fun _ => Set.mem_univ _) + exact hconv.map_integral_le hcont hclosed hfs hf hfpow + +/-- Translation invariance of `eLpNorm` for Lebesgue measure on `Vec d`. -/ +lemma eLpNorm_comp_sub_right {d : ℕ} (f : Vec d → ℝ) (t : Vec d) (p : ENNReal) : + eLpNorm (fun x => f (x - t)) p volume = eLpNorm f p volume := by + have heq : (fun x => f (x - t)) = f ∘ ((· + (-t)) : Vec d → Vec d) := by + funext x + simp [sub_eq_add_neg] + rw [heq] + let e : Vec d ≃ᵐ Vec d := MeasurableEquiv.addRight (-t) + have hcomp : f ∘ (fun x : Vec d => x + (-t)) = f ∘ e := rfl + rw [hcomp, ← e.measurableEmbedding.eLpNorm_map_measure] + have hmap : Measure.map e volume = volume := by + change Measure.map (fun x : Vec d => x + (-t)) volume = volume + simpa using (MeasureTheory.map_add_right_eq_self (μ := (volume : Measure (Vec d))) (-t)) + rw [hmap] + +/-- Translation invariance of `lintegral` for Lebesgue measure on `Vec d`. -/ +lemma lintegral_comp_sub_right {d : ℕ} (f : Vec d → ℝ≥0∞) (hf : Measurable f) (t : Vec d) : + ∫⁻ x, f (x - t) ∂(volume : Measure (Vec d)) = ∫⁻ x, f x ∂(volume : Measure (Vec d)) := by + have heq : (fun x => f (x - t)) = f ∘ ((· + (-t)) : Vec d → Vec d) := by + funext x + simp [sub_eq_add_neg] + rw [heq, lintegral_comp hf (measurable_add_const (-t))] + have hmap : Measure.map (fun x : Vec d => x + (-t)) (volume : Measure (Vec d)) = volume := by + simpa using (MeasureTheory.map_add_right_eq_self (μ := (volume : Measure (Vec d))) (-t)) + rw [hmap] + +/-- Fubini plus translation invariance for the kernel used in the Jensen proof of +convolution contraction. -/ +lemma fubini_translation_key {d : ℕ} (ρ : Vec d → ℝ≥0∞) (g : Vec d → ℝ) (p : ℝ) + (hρ : Measurable ρ) (hg : Measurable g) : + ∫⁻ x, ∫⁻ t, ρ t * (ENNReal.ofReal |g (x - t)|) ^ p ∂volume ∂volume = + (∫⁻ t, ρ t ∂volume) * (∫⁻ x, (ENNReal.ofReal |g x|) ^ p ∂volume) := by + have hswap : + ∫⁻ x, ∫⁻ t, ρ t * (ENNReal.ofReal |g (x - t)|) ^ p ∂volume ∂volume = + ∫⁻ t, ∫⁻ x, ρ t * (ENNReal.ofReal |g (x - t)|) ^ p ∂volume ∂volume := by + apply lintegral_lintegral_swap + apply AEMeasurable.mul + · exact (hρ.comp measurable_snd).aemeasurable + · apply Measurable.aemeasurable + apply Measurable.pow_const + exact ENNReal.measurable_ofReal.comp + (continuous_abs.measurable.comp (hg.comp (measurable_fst.sub measurable_snd))) + rw [hswap] + have hfactor : + ∫⁻ t, ∫⁻ x, ρ t * (ENNReal.ofReal |g (x - t)|) ^ p ∂volume ∂volume = + ∫⁻ t, ρ t * ∫⁻ x, (ENNReal.ofReal |g (x - t)|) ^ p ∂volume ∂volume := by + congr 1 + ext t + exact lintegral_const_mul _ <| + Measurable.pow_const + (ENNReal.measurable_ofReal.comp + (continuous_abs.measurable.comp (hg.comp (measurable_id.sub measurable_const)))) p + rw [hfactor] + have htrans : + ∀ t, ∫⁻ x, (ENNReal.ofReal |g (x - t)|) ^ p ∂(volume : Measure (Vec d)) = + ∫⁻ x, (ENNReal.ofReal |g x|) ^ p ∂volume := by + intro t + exact lintegral_comp_sub_right _ + (Measurable.pow_const + (ENNReal.measurable_ofReal.comp (continuous_abs.measurable.comp hg)) p) t + simp_rw [htrans] + rw [lintegral_mul_const _ hρ, mul_comm] + +private lemma integral_withDensity_ofReal_eq_integral_mul + {d : ℕ} {f g : Vec d → ℝ} + (hf_nonneg : ∀ x, 0 ≤ f x) + (hf_meas : AEMeasurable f volume) : + ∫ x, g x ∂(volume.withDensity fun x => ENNReal.ofReal (f x)) = ∫ x, f x * g x := by + have heq : + (fun x => ENNReal.ofReal (f x)) = fun x => (Real.toNNReal (f x) : ℝ≥0∞) := by + funext x + rw [ENNReal.ofReal_eq_coe_nnreal (hf_nonneg x), Real.toNNReal_of_nonneg (hf_nonneg x)] + rw [heq] + rw [integral_withDensity_eq_integral_smul₀ (hf_meas.real_toNNReal)] + congr 1 + funext x + simp [NNReal.smul_def, smul_eq_mul, Real.coe_toNNReal _ (hf_nonneg x)] + +/-- Convolution with a nonnegative unit-mass kernel is an `L^p` contraction on +`Vec d` for `1 ≤ p < ∞`. -/ +theorem young_convolution_nonneg_integral_one + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hp : 1 ≤ p) (hp' : p ≠ ⊤) + (hρ_nonneg : ∀ x, 0 ≤ ρ x) + (hρ_int : Integrable ρ volume) + (hρ_one : ∫ x, ρ x = 1) + (hρ_meas : Measurable ρ) + (hg_meas : Measurable g) : + eLpNorm (convolution ρ g (ContinuousLinearMap.lsmul ℝ ℝ) volume) p volume ≤ + eLpNorm g p volume := by + have hp_ne_zero : p ≠ 0 := ne_of_gt (lt_of_lt_of_le zero_lt_one hp) + have hp_pos : 0 < p.toReal := ENNReal.toReal_pos hp_ne_zero hp' + have hp_ge_one : 1 ≤ p.toReal := by + rw [← ENNReal.toReal_one] + exact (ENNReal.toReal_le_toReal ENNReal.one_ne_top hp').mpr hp + let μ : Measure (Vec d) := volume.withDensity fun t => ENNReal.ofReal (ρ t) + let : IsProbabilityMeasure μ := + isProbabilityMeasure_withDensity_ofReal hρ_nonneg hρ_int hρ_one + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal hp_ne_zero hp' + (MeasureTheory.AEStronglyMeasurable.convolution (ContinuousLinearMap.lsmul ℝ ℝ) + hρ_meas.aestronglyMeasurable hg_meas.aestronglyMeasurable)] + rw [eLpNorm_eq_lintegral_rpow_enorm_toReal hp_ne_zero hp' hg_meas.aestronglyMeasurable] + apply ENNReal.rpow_le_rpow _ (by positivity : 0 ≤ 1 / p.toReal) + have hfubini := + fubini_translation_key (d := d) (fun t => ENNReal.ofReal (ρ t)) g p.toReal + (hρ_meas.ennreal_ofReal) hg_meas + have hρ_lint_one : ∫⁻ t, ENNReal.ofReal (ρ t) ∂volume = 1 := by + rw [← ofReal_integral_eq_lintegral_ofReal hρ_int (ae_of_all _ hρ_nonneg), hρ_one] + simp + have hpointwise : + ∀ x, ‖convolution ρ g (ContinuousLinearMap.lsmul ℝ ℝ) volume x‖ₑ ^ p.toReal ≤ + ∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂volume := by + intro x + rw [convolution_def] + simp only [ContinuousLinearMap.lsmul_apply, smul_eq_mul] + rw [Real.enorm_eq_ofReal_abs] + have heq_int : ∫ t, ρ t * g (x - t) = ∫ t, g (x - t) ∂μ := by + symm + exact integral_withDensity_ofReal_eq_integral_mul hρ_nonneg hρ_meas.aemeasurable + rw [heq_int] + by_cases hg_int_μ : Integrable (fun t => g (x - t)) μ + · by_cases hgpow_int_μ : Integrable (fun t => |g (x - t)| ^ p.toReal) μ + · have hJensen := jensen_abs_rpow_integral μ hp_ge_one hg_int_μ hgpow_int_μ + have heq_pow : + ∫ t, |g (x - t)| ^ p.toReal ∂μ = + (∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂volume).toReal := by + rw [integral_withDensity_ofReal_eq_integral_mul hρ_nonneg hρ_meas.aemeasurable] + rw [integral_eq_lintegral_of_nonneg_ae] + · congr 1 + apply lintegral_congr + intro t + rw [ENNReal.ofReal_mul (hρ_nonneg t)] + congr 1 + rw [← ENNReal.ofReal_rpow_of_nonneg (abs_nonneg _) hp_pos.le] + · exact ae_of_all _ (fun t => mul_nonneg (hρ_nonneg t) (Real.rpow_nonneg (abs_nonneg _) _)) + · have habs_rpow_meas : Measurable (fun t => |g (x - t)| ^ p.toReal) := by + have hcont : Continuous (fun y : ℝ => |y| ^ p.toReal) := + continuous_abs.rpow_const (fun _ => Or.inr hp_pos.le) + exact hcont.measurable.comp (hg_meas.comp (measurable_const.sub measurable_id)) + exact (hρ_meas.mul habs_rpow_meas).aestronglyMeasurable + calc + ENNReal.ofReal |∫ t, g (x - t) ∂μ| ^ p.toReal + = ENNReal.ofReal (|∫ t, g (x - t) ∂μ| ^ p.toReal) := by + rw [← ENNReal.ofReal_rpow_of_nonneg (abs_nonneg _) hp_pos.le] + _ ≤ ENNReal.ofReal (∫ t, |g (x - t)| ^ p.toReal ∂μ) := by + exact ENNReal.ofReal_le_ofReal hJensen + _ = + ENNReal.ofReal + ((∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal + ∂volume).toReal) := by + rw [heq_pow] + _ ≤ ∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal + ∂volume := by + exact ENNReal.ofReal_toReal_le + · have hnot_finite : + ∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂volume = ⊤ := by + have h_eq : + ∫⁻ t, ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂volume = + ∫⁻ t, (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂μ := by + have hsub : Measurable (fun t : Vec d => x - t) := measurable_const.sub measurable_id + have h_abs_meas : Measurable (fun t => |g (x - t)|) := + continuous_abs.measurable.comp (hg_meas.comp hsub) + have h_meas_pow : Measurable (fun t => (ENNReal.ofReal |g (x - t)|) ^ p.toReal) := + Measurable.pow_const h_abs_meas.ennreal_ofReal p.toReal + symm + convert + lintegral_withDensity_eq_lintegral_mul volume hρ_meas.ennreal_ofReal h_meas_pow + using 2 + rw [h_eq] + have habs_rpow_nonneg : ∀ t, 0 ≤ |g (x - t)| ^ p.toReal := + fun t => Real.rpow_nonneg (abs_nonneg _) _ + have habs_rpow_meas : Measurable (fun t => |g (x - t)| ^ p.toReal) := by + have hcont : Continuous (fun y : ℝ => |y| ^ p.toReal) := + continuous_abs.rpow_const (fun _ => Or.inr hp_pos.le) + have hsub : Measurable (fun t : Vec d => x - t) := measurable_const.sub measurable_id + exact hcont.measurable.comp (hg_meas.comp hsub) + have h_top : ∫⁻ t, (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂μ = ⊤ := by + rw [← lintegral_ofReal_ne_top_iff_integrable habs_rpow_meas.aestronglyMeasurable + (ae_of_all _ habs_rpow_nonneg)] at hgpow_int_μ + push Not at hgpow_int_μ + convert hgpow_int_μ using 1 + congr 1 + ext t + rw [← ENNReal.ofReal_rpow_of_nonneg (abs_nonneg _) hp_pos.le] + rw [h_top] + simp [hnot_finite] + · + rw [integral_undef hg_int_μ] + simp only [abs_zero, ENNReal.ofReal_zero] + rw [ENNReal.zero_rpow_of_pos hp_pos] + exact zero_le + calc + ∫⁻ x, ‖convolution ρ g (ContinuousLinearMap.lsmul ℝ ℝ) volume x‖ₑ ^ p.toReal ∂volume + ≤ ∫⁻ x, ∫⁻ t, + ENNReal.ofReal (ρ t) * (ENNReal.ofReal |g (x - t)|) ^ p.toReal ∂volume ∂volume := by + exact lintegral_mono hpointwise + _ = (∫⁻ t, ENNReal.ofReal (ρ t) ∂volume) * + (∫⁻ x, (ENNReal.ofReal |g x|) ^ p.toReal ∂volume) := hfubini + _ = 1 * (∫⁻ x, (ENNReal.ofReal |g x|) ^ p.toReal ∂volume) := by rw [hρ_lint_one] + _ = ∫⁻ x, (ENNReal.ofReal |g x|) ^ p.toReal ∂volume := one_mul _ + _ = ∫⁻ x, ‖g x‖ₑ ^ p.toReal ∂volume := by + congr 1 + ext x + rw [Real.enorm_eq_ofReal_abs] + +/-- `AEMeasurable` version of `young_convolution_nonneg_integral_one`, obtained by +passing to a measurable representative of the input function. -/ +theorem young_convolution_nonneg_integral_one_of_aemeasurable + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hp : 1 ≤ p) (hp' : p ≠ ⊤) + (hρ_nonneg : ∀ x, 0 ≤ ρ x) + (hρ_int : Integrable ρ volume) + (hρ_one : ∫ x, ρ x = 1) + (hρ_meas : Measurable ρ) + (hg_meas : AEMeasurable g volume) : + eLpNorm (convolution ρ g (ContinuousLinearMap.lsmul ℝ ℝ) volume) p volume ≤ + eLpNorm g p volume := by + let g' : Vec d → ℝ := hg_meas.mk g + have hconv : + convolution ρ g (ContinuousLinearMap.lsmul ℝ ℝ) volume = + convolution ρ g' (ContinuousLinearMap.lsmul ℝ ℝ) volume := by + simpa [g'] using + (MeasureTheory.convolution_congr (L := ContinuousLinearMap.lsmul ℝ ℝ) + (μ := (volume : Measure (Vec d))) + (h1 := Filter.EventuallyEq.rfl) (h2 := hg_meas.ae_eq_mk)) + rw [hconv] + calc + eLpNorm (convolution ρ g' (ContinuousLinearMap.lsmul ℝ ℝ) volume) p volume + ≤ eLpNorm g' p volume := + young_convolution_nonneg_integral_one hp hp' hρ_nonneg hρ_int hρ_one hρ_meas + hg_meas.measurable_mk + _ = eLpNorm g p volume := by + exact eLpNorm_congr_ae hg_meas.ae_eq_mk.symm + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/CubeVector.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/CubeVector.lean new file mode 100644 index 0000000000..84b5ed08e7 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/CubeVector.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeCalderonZygmund.WeakHessianFiniteP +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CubeNeumannW22CZ.WeakInteriorDQ.HessianGradientH1 +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H1GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Normalized + +/-! +# Vector-valued `W^{1,p}` functions on cubes + +This file packages a vector field coordinatewise as genuine scalar +`W1pFunction` witnesses on an open cube. Its Jacobian is the matrix of the +stored weak gradients. All `L^p` statements use normalized cube measure, but +the carrier itself contains no cube-scale-dependent quantity. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped BigOperators ENNReal + +noncomputable section + +/-- A vector-valued `W^{1,p}` function on an open cube, represented by one +genuine scalar `W1pFunction` for each coordinate. -/ +@[ext] +structure CubeVectorW1pFunction {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) where + coord : Fin d → W1pFunction (openCubeSet Q) p.exponent + +namespace CubeVectorW1pFunction + +variable {d : ℕ} {Q : TriadicCube d} {p : FiniteLpExponent} + +/-- The pointwise vector field represented by the coordinate witnesses. -/ +def toField (F : CubeVectorW1pFunction Q p) : Vec d → Vec d := + fun x i ↦ F.coord i x + +instance : CoeFun (CubeVectorW1pFunction Q p) (fun _ ↦ Vec d → Vec d) where + coe := toField + +/-- The pointwise Jacobian formed from the stored weak-gradient +representatives. -/ +def jacobian (F : CubeVectorW1pFunction Q p) : Vec d → Mat d := + fun x i j ↦ (F.coord i).grad x j + +@[simp] theorem toField_apply (F : CubeVectorW1pFunction Q p) + (x : Vec d) (i : Fin d) : + F.toField x i = F.coord i x := + rfl + +@[simp] theorem coe_apply (F : CubeVectorW1pFunction Q p) + (x : Vec d) (i : Fin d) : + F x i = F.coord i x := + rfl + +@[simp] theorem jacobian_apply (F : CubeVectorW1pFunction Q p) + (x : Vec d) (i j : Fin d) : + F.jacobian x i j = (F.coord i).grad x j := + rfl + +@[simp] theorem jacobian_row (F : CubeVectorW1pFunction Q p) + (x : Vec d) (i : Fin d) : + F.jacobian x i = (F.coord i).grad x := + rfl + +private theorem hilbertVec_memLp_normalizedCubeMeasure_of_coord + (f : Vec d → Vec d) + (hf : ∀ i : Fin d, MemLpOn (openCubeSet Q) p.exponent (fun x ↦ f x i)) : + MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (f x)) p.exponent + (normalizedCubeMeasure Q) := by + have hrestricted : + MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (f x)) p.exponent + (cubeBoundedMeasurableDomain Q).restrictedVolume := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet, + Function.comp_apply, HilbertVec.ofVec, PiLp.toLp_apply] using hf i + have hnormalized : + MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (f x)) p.exponent + (cubeBoundedMeasurableDomain Q).normalizedVolume := + ((cubeBoundedMeasurableDomain Q).memLp_normalizedVolume_iff + p.exponent _).mpr hrestricted + simpa only [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hnormalized + +/-- The Hilbert realization of the represented vector field belongs to +normalized `L^p` on the cube. -/ +theorem euclideanMemLp (F : CubeVectorW1pFunction Q p) : + MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (F.toField x)) p.exponent + (normalizedCubeMeasure Q) := by + exact hilbertVec_memLp_normalizedCubeMeasure_of_coord F.toField fun i ↦ by + simpa only [toField_apply] using (F.coord i).memLp + +/-- The Hilbert realization of one Jacobian row belongs to normalized `L^p` +on the cube. -/ +theorem jacobianRowMemLp (F : CubeVectorW1pFunction Q p) (i : Fin d) : + MeasureTheory.MemLp (fun x ↦ HilbertVec.ofVec (F.jacobian x i)) p.exponent + (normalizedCubeMeasure Q) := by + exact hilbertVec_memLp_normalizedCubeMeasure_of_coord + (fun x ↦ F.jacobian x i) fun j ↦ by + simpa only [jacobian_apply] using (F.coord i).gradMemLp j + +/-- The Euclidean magnitude of one Jacobian row belongs to normalized `L^p`. +This is the norm-valued form of `jacobianRowMemLp`. -/ +theorem jacobianRowEuclideanMemLp (F : CubeVectorW1pFunction Q p) (i : Fin d) : + MeasureTheory.MemLp (fun x ↦ euclideanNorm (F.jacobian x i)) p.exponent + (normalizedCubeMeasure Q) := by + simpa only [euclideanNorm_eq_norm_ofVec] using (F.jacobianRowMemLp i).norm + +/-- The Hilbert-matrix realization of the Jacobian belongs to normalized +`L^p` on the cube. -/ +theorem jacobianHilbertMemLp (F : CubeVectorW1pFunction Q p) : + MeasureTheory.MemLp (fun x ↦ HilbertMat.ofMat (F.jacobian x)) p.exponent + (normalizedCubeMeasure Q) := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [Function.comp_apply, HilbertMat.ofMat, PiLp.toLp_apply] using + F.jacobianRowMemLp i + +/-- The normalized `L^p` norm of the Jacobian is bounded by the finite sum of +the normalized `L^p` norms of its coordinate gradients. -/ +theorem eLpNorm_jacobianHilbert_le_sum_grad + (F : CubeVectorW1pFunction Q p) : + MeasureTheory.eLpNorm (fun x ↦ HilbertMat.ofMat (F.jacobian x)) + p.exponent (normalizedCubeMeasure Q) ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec ((F.coord i).grad x)) + p.exponent (normalizedCubeMeasure Q) := by + let row : Fin d → Vec d → HilbertVec d := + fun i x ↦ HilbertVec.ofVec ((F.coord i).grad x) + let singleRow : Fin d → Vec d → HilbertMat d := + fun i x ↦ WithLp.toLp 2 (Pi.single i (row i x)) + have hsingleRow : ∀ i : Fin d, + MeasureTheory.MemLp (singleRow i) p.exponent + (normalizedCubeMeasure Q) := by + intro i + rw [MeasureTheory.memLp_piLp_iff] + intro k + by_cases hik : i = k + · subst k + simpa only [singleRow, row, Function.comp_apply, PiLp.toLp_apply, + Pi.single_eq_same, jacobian_row] using F.jacobianRowMemLp i + · have hzero : MeasureTheory.MemLp + (fun _ : Vec d ↦ (0 : HilbertVec d)) p.exponent + (normalizedCubeMeasure Q) := + MeasureTheory.MemLp.zero' + simpa only [singleRow, Function.comp_apply, PiLp.toLp_apply, + Pi.single_eq_of_ne (Ne.symm hik)] using hzero + have hmatrix : + (fun x ↦ HilbertMat.ofMat (F.jacobian x)) = + ∑ i : Fin d, singleRow i := by + funext x + ext i j + simp [singleRow, row] + rw [hmatrix] + calc + MeasureTheory.eLpNorm (∑ i : Fin d, singleRow i) p.exponent + (normalizedCubeMeasure Q) ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm (singleRow i) p.exponent + (normalizedCubeMeasure Q) := by + exact MeasureTheory.eLpNorm_sum_le + (fun i _ ↦ (hsingleRow i).aestronglyMeasurable) p.one_lt.le + _ = ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec ((F.coord i).grad x)) + p.exponent (normalizedCubeMeasure Q) := by + apply Finset.sum_congr rfl + intro i _ + apply MeasureTheory.eLpNorm_congr_norm_ae + exact MeasureTheory.ae_of_all (normalizedCubeMeasure Q) fun x ↦ by + simp [singleRow, row] + +/-- Forget the weak-derivative witnesses and retain the represented normalized +Euclidean `L^p` vector field. -/ +noncomputable def toCubeEuclideanLpField + (F : CubeVectorW1pFunction Q p) : CubeEuclideanLpField Q p where + toField := F.toField + euclideanMemLp := F.euclideanMemLp + +@[simp] theorem toCubeEuclideanLpField_toField + (F : CubeVectorW1pFunction Q p) : + F.toCubeEuclideanLpField.toField = F.toField := + rfl + +private theorem weakHessianRowGradMemLpOn [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) + (i : Fin d) : + GradMemLpOn (openCubeSet Q) p.exponent (H.gradCoordH1Function i).grad := by + have hnormalized : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (cubeBoundedMeasurableDomain Q).normalizedVolume := by + simpa only [cubeBoundedMeasurableDomain_normalizedVolume_eq_normalizedCubeMeasure] + using hrows i + have hrestricted : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (cubeBoundedMeasurableDomain Q).restrictedVolume := + ((cubeBoundedMeasurableDomain Q).memLp_normalizedVolume_iff + p.exponent _).mp hnormalized + have hopen : + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (MeasureTheory.volume.restrict (openCubeSet Q)) := by + simpa only [cubeBoundedMeasurableDomain_restrictedVolume_eq_restrict_openCubeSet] + using hrestricted + rw [MeasureTheory.memLp_piLp_iff] at hopen + intro j + simpa only [HasWeakHessianOn.gradCoordH1Function_grad_apply, + Function.comp_apply, PiLp.toLp_apply] using hopen j + +/-- Build a cube-vector `W^{1,p}` function from a weak Hessian whose rows have +normalized `L^p` membership. The represented vector field is exactly the +stored weak gradient, and the represented Jacobian is exactly the stored weak +Hessian. No separate `L^p` hypothesis on the gradient values is needed. -/ +noncomputable def ofWeakHessian [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) : + CubeVectorW1pFunction Q p where + coord i := (H.gradCoordH1Function i).toW1pOfGradMemLp + (isOpenBoundedConvexDomain_openCubeSet Q) p + (weakHessianRowGradMemLpOn H hrows i) + +@[simp] theorem ofWeakHessian_coord_toFun [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) + (i : Fin d) : + ((ofWeakHessian H hrows).coord i).toFun = fun x ↦ u.grad x i := + rfl + +@[simp] theorem ofWeakHessian_coord_grad [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) + (i : Fin d) : + ((ofWeakHessian H hrows).coord i).grad = fun x j ↦ H.hess i j x := + rfl + +@[simp] theorem ofWeakHessian_toField [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) : + (ofWeakHessian H hrows).toField = u.grad := by + funext x i + rfl + +@[simp] theorem ofWeakHessian_jacobian [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) : + (ofWeakHessian H hrows).jacobian = fun x i j ↦ H.hess i j x := by + funext x i j + rfl + +/-- For the weak-Hessian constructor, the generic Jacobian membership theorem +reduces to the existing finite-`p` weak-Hessian aggregation theorem without +changing representatives. -/ +theorem ofWeakHessian_jacobianHilbertMemLp [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) : + MeasureTheory.MemLp + (fun x ↦ HilbertMat.ofMat ((ofWeakHessian H hrows).jacobian x)) + p.exponent (normalizedCubeMeasure Q) := by + simpa only [ofWeakHessian_jacobian] using + H.hessianHilbertMat_memLp_normalizedCubeMeasure_of_rows Q p hrows + +/-- For the weak-Hessian constructor, the generic Jacobian row-sum bound is +exactly the existing finite-`p` weak-Hessian estimate. -/ +theorem ofWeakHessian_eLpNorm_jacobianHilbert_le_sum_rows [NeZero d] + {u : H1Function (openCubeSet Q)} + (H : HasWeakHessianOn (openCubeSet Q) u) + (hrows : ∀ i : Fin d, + MeasureTheory.MemLp + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q)) : + MeasureTheory.eLpNorm + (fun x ↦ HilbertMat.ofMat ((ofWeakHessian H hrows).jacobian x)) + p.exponent (normalizedCubeMeasure Q) ≤ + ∑ i : Fin d, MeasureTheory.eLpNorm + (fun x ↦ HilbertVec.ofVec (fun j ↦ H.hess i j x)) + p.exponent (normalizedCubeMeasure Q) := by + simpa only [ofWeakHessian_jacobian] using + H.eLpNorm_hessianHilbertMat_normalizedCubeMeasure_le_sum_rows Q p hrows + +end CubeVectorW1pFunction + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Definitions.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Definitions.lean new file mode 100644 index 0000000000..78a40c5098 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Definitions.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.WeakDerivatives +public import Mathlib.MeasureTheory.Constructions.Pi +public import Mathlib.MeasureTheory.Function.LocallyIntegrable +public import Mathlib.MeasureTheory.Function.LpSeminorm.Basic +public import Mathlib.MeasureTheory.Function.LpSeminorm.TriangleInequality +public import Mathlib.MeasureTheory.Function.LpSpace.Indicator +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Definitions -/ + +@[expose] public section + +namespace Homogenization + +/-! +`W^{1,p}(U)` and `W^{1,p}_0(U)` witnesses parallel the existing `H¹` encoding +but keep the exponent `p` explicit. +-/ + +abbrev MemLpOn {d : ℕ} (U : Set (Vec d)) (p : ENNReal) (u : Vec d → ℝ) : Prop := + MeasureTheory.MemLp u p (MeasureTheory.volume.restrict U) + +def GradMemLpOn {d : ℕ} (U : Set (Vec d)) (p : ENNReal) (Du : Vec d → Vec d) : Prop := + ∀ i : Fin d, MemLpOn U p (fun x => Du x i) + +structure W1pFunction {d : ℕ} (U : Set (Vec d)) (p : ENNReal) where + toFun : Vec d → ℝ + grad : Vec d → Vec d + memLp : MemLpOn U p toFun + gradMemLp : GradMemLpOn U p grad + hasWeakGradient : HasWeakGradientOn U toFun grad + +instance {d : ℕ} {U : Set (Vec d)} {p : ENNReal} : + CoeFun (W1pFunction U p) (fun _ => Vec d → ℝ) where + coe u := u.toFun + +def MemW1p {d : ℕ} (U : Set (Vec d)) (p : ENNReal) (u : Vec d → ℝ) : Prop := + ∃ v : W1pFunction U p, v.toFun = u + +/-- The exact supported smooth approximation data needed to upgrade a +`W1pFunction` witness to `W10pFunction`. + +This is intentionally a separate zero-trace hypothesis: bounded open convexity +gives a natural smooth approximation mechanism for bare `W^{1,p}` functions, +but it does not imply compactly supported approximation inside `U` for every +Sobolev function. -/ +structure W1pFunction.SupportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} + {p : ENNReal} (u : W1pFunction U p) where + approx : ℕ → Vec d → ℝ + approx_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (approx n) + approx_hasCompactSupport : ∀ n, HasCompactSupport (approx n) + approx_support_subset : ∀ n, tsupport (approx n) ⊆ U + tendsto_approx : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => approx n x - u.toFun x) p + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + tendsto_approx_grad : + ∀ i : Fin d, + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (approx n) x) (basisVec i) - u.grad x i) p + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + +/-- Proposition-valued form of `SupportedSmoothApproximation`, useful when the +actual approximating sequence should remain hidden. -/ +def W1pFunction.HasSupportedSmoothApproximation {d : ℕ} {U : Set (Vec d)} + {p : ENNReal} (u : W1pFunction U p) : Prop := + Nonempty u.SupportedSmoothApproximation + +structure W10pFunction {d : ℕ} (U : Set (Vec d)) (p : ENNReal) extends W1pFunction U p where + approx : ℕ → Vec d → ℝ + approx_smooth : ∀ n, ContDiff ℝ (⊤ : ℕ∞) (approx n) + approx_hasCompactSupport : ∀ n, HasCompactSupport (approx n) + approx_support_subset : ∀ n, tsupport (approx n) ⊆ U + tendsto_approx : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => approx n x - toW1pFunction.toFun x) p + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + tendsto_approx_grad : + ∀ i : Fin d, + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (approx n) x) (basisVec i) - toW1pFunction.grad x i) p + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) + +instance {d : ℕ} {U : Set (Vec d)} {p : ENNReal} : + CoeFun (W10pFunction U p) (fun _ => Vec d → ℝ) where + coe u := u.toW1pFunction.toFun + +def MemW10p {d : ℕ} (U : Set (Vec d)) (p : ENNReal) (u : Vec d → ℝ) : Prop := + ∃ v : W10pFunction U p, v.toW1pFunction.toFun = u + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Dilation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Dilation.lean new file mode 100644 index 0000000000..4b95164205 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Dilation.lean @@ -0,0 +1,654 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p.Seminorms + +/-! # Dilation -/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal Pointwise + +noncomputable section + +namespace W1pFunction + +variable {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + +/-- Push a scalar `W^{1,p}(U)` witness forward to `W^{1,p}(a • U)` by the +positive dilation `x ↦ a⁻¹ x`. The weak gradient has the corresponding +chain-rule factor `a⁻¹`. -/ +noncomputable def dilate {a : ℝ} (ha : 0 < a) + (u : W1pFunction U p) : W1pFunction (a • U) p := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a⁻¹ • x + have ha_ne : a ≠ 0 := ha.ne' + have hmap := map_smul_volume_restrict (d := d) (a := a⁻¹) (inv_pos.mpr ha) V + have hpre : a⁻¹ • V = U := by + ext x + simp [V, ha_ne] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict V) := + (measurable_const_smul a⁻¹).aemeasurable + refine + { toFun := fun x => u.toFun (T x) + grad := fun x => a⁻¹ • u.grad (T x) + memLp := ?_ + gradMemLp := ?_ + hasWeakGradient := ?_ } + · have hu_map : MeasureTheory.MemLp u.toFun p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact u.memLp.smul_measure ENNReal.ofReal_ne_top + exact MeasureTheory.MemLp.comp_of_map hu_map hT_meas + · intro i + have hgrad_map : MeasureTheory.MemLp (fun x => u.grad x i) p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact (u.gradMemLp i).smul_measure ENNReal.ofReal_ne_top + have hcomp : MeasureTheory.MemLp (fun x => u.grad (T x) i) p + (MeasureTheory.volume.restrict V) := + MeasureTheory.MemLp.comp_of_map hgrad_map hT_meas + have hsmul : MeasureTheory.MemLp (fun x => a⁻¹ * u.grad (T x) i) p + (MeasureTheory.volume.restrict V) := + hcomp.const_mul a⁻¹ + simpa [Pi.smul_apply, smul_eq_mul] using hsmul + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a • y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a ha_ne) + simpa [ψ, Function.comp] using + hφ_supp.comp_homeomorph (Homeomorph.smulOfNeZero a ha_ne) + have hψ_sub : tsupport ψ ⊆ U := by + intro y hy + have hy' : a • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a ha_ne by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a ha_ne)] at hy + exact hy + have hyV : a • y ∈ V := hφ_sub hy' + simpa [V, Set.mem_smul_set_iff_inv_smul_mem, ha_ne] using hyV + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hderivψ : ∀ y : Vec d, + (fderiv ℝ ψ y) (basisVec i) = + a * (fderiv ℝ φ (a • y)) (basisVec i) := by + intro y + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a • z)) y = + a • fderiv ℝ φ (a • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a) + simpa [smul_eq_mul] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hderiv + have hweak_scaled : + a * ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume = + -∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume := by + have hfun : + (fun y => u.toFun y * (fderiv ℝ ψ y) (basisVec i)) = + fun y => a * (u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i)) := by + funext y + rw [hderivψ y] + ring + rw [hfun, MeasureTheory.integral_const_mul] at hweak + simpa [ψ] using hweak + have hchange_left : + ∫ y in U, u.toFun y * (fderiv ℝ φ (a • y)) (basisVec i) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, + u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => + u.toFun (T x) * (fderiv ℝ φ x) (basisVec i)) + (s := U) ha) + have hchange_right : + ∫ y in U, u.grad y i * φ (a • y) ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in V, + u.grad (T x) i * φ x ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha_ne, one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => u.grad (T x) i * φ x) + (s := U) ha) + have hpow_ne : a ^ d ≠ 0 := (pow_pos ha d).ne' + have htarget : + ∫ x in V, u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume = + -(a⁻¹ * ∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume) := by + rw [hchange_left, hchange_right] at hweak_scaled + field_simp [hpow_ne, ha_ne] at hweak_scaled ⊢ + linarith + calc + ∫ x in V, u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume = + -(a⁻¹ * ∫ x in V, u.grad (T x) i * φ x ∂MeasureTheory.volume) := htarget + _ = -∫ x in V, (a⁻¹ • u.grad (T x)) i * φ x + ∂MeasureTheory.volume := by + have hfun : + (fun x : Vec d => (a⁻¹ • u.grad (T x)) i * φ x) = + fun x : Vec d => a⁻¹ * (u.grad (T x) i * φ x) := by + funext x + simp [Pi.smul_apply, smul_eq_mul] + ring + rw [hfun, MeasureTheory.integral_const_mul] + +@[simp] theorem dilate_toFun {a : ℝ} (ha : 0 < a) + (u : W1pFunction U p) (x : Vec d) : + (u.dilate ha).toFun x = u.toFun (a⁻¹ • x) := + rfl + +@[simp] theorem dilate_grad {a : ℝ} (ha : 0 < a) + (u : W1pFunction U p) (x : Vec d) : + (u.dilate ha).grad x = a⁻¹ • u.grad (a⁻¹ • x) := + rfl + +/-- Pull a scalar `W^{1,p}(a • U)` witness back to `W^{1,p}(U)` by +precomposition with `x ↦ a • x`. Its weak gradient is +`a • ∇u(a • x)`. -/ +noncomputable def unscale {a : ℝ} (ha : 0 < a) + (u : W1pFunction (a • U) p) : W1pFunction U p := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + refine + { toFun := fun x => u.toFun (T x) + grad := fun x => a • u.grad (T x) + memLp := ?_ + gradMemLp := ?_ + hasWeakGradient := ?_ } + · have hu_map : MeasureTheory.MemLp u.toFun p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact u.memLp.smul_measure ENNReal.ofReal_ne_top + exact MeasureTheory.MemLp.comp_of_map hu_map hT_meas + · intro i + have hgrad_map : MeasureTheory.MemLp (fun x => u.grad x i) p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact (u.gradMemLp i).smul_measure ENNReal.ofReal_ne_top + have hcomp : MeasureTheory.MemLp (fun x => u.grad (T x) i) p + (MeasureTheory.volume.restrict U) := + MeasureTheory.MemLp.comp_of_map hgrad_map hT_meas + have hsmul : MeasureTheory.MemLp (fun x => a * u.grad (T x) i) p + (MeasureTheory.volume.restrict U) := + hcomp.const_mul a + simpa [Pi.smul_apply, smul_eq_mul] using hsmul + · intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun y => φ (a⁻¹ • y) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_const_smul a⁻¹) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha.ne')) + simpa [ψ, Function.comp] using + hφ_supp.comp_homeomorph (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha.ne')) + have hψ_sub : tsupport ψ ⊆ V := by + intro y hy + have hy' : a⁻¹ • y ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha.ne') by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.smulOfNeZero a⁻¹ (inv_ne_zero ha.ne'))] at hy + exact hy + exact ⟨a⁻¹ • y, hφ_sub hy', by simp [smul_smul, ha.ne']⟩ + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hderivψ : ∀ y : Vec d, + (fderiv ℝ ψ y) (basisVec i) = + a⁻¹ * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) := by + intro y + have hderiv : + fderiv ℝ (fun z : Vec d => φ (a⁻¹ • z)) y = + a⁻¹ • fderiv ℝ φ (a⁻¹ • y) := by + simpa [ψ] using (fderiv_comp_smul (𝕜 := ℝ) (f := φ) (x := y) a⁻¹) + simpa [smul_eq_mul] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec i)) hderiv + have hweak_scaled : + ∫ y in V, u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + ∂MeasureTheory.volume = + -a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + have hfun : + (fun y => u.toFun y * (fderiv ℝ ψ y) (basisVec i)) = + fun y => a⁻¹ * (u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i)) := by + funext y + rw [hderivψ y] + ring + have hleft : + ∫ y in V, u.toFun y * (fderiv ℝ ψ y) (basisVec i) ∂MeasureTheory.volume = + a⁻¹ * ∫ y in V, + u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) ∂MeasureTheory.volume := by + rw [hfun, MeasureTheory.integral_const_mul] + rw [hleft] at hweak + have hmul := congrArg (fun t : ℝ => a * t) hweak + have hcancel : a * (a⁻¹ * + ∫ y in V, u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + ∂MeasureTheory.volume) = + ∫ y in V, u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + ∂MeasureTheory.volume := by + field_simp [ha.ne'] + simpa [hcancel, mul_neg, mul_assoc, mul_comm, mul_left_comm] using hmul + have hchange_left : + ∫ x in U, u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in V, + u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha.ne', one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i)) + (s := U) ha) + have hchange_right : + ∫ x in U, (a • u.grad (T x)) i * φ x ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in V, + (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + simpa only [V, T, smul_smul, inv_mul_cancel₀ ha.ne', one_smul, smul_eq_mul, + Module.finrank_fin_fun] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun y : Vec d => (a • u.grad y) i * φ (a⁻¹ • y)) + (s := U) ha) + have hgrad_scaled_integral : + ∫ y in V, (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume = + a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume := by + have hfun : + (fun y : Vec d => (a • u.grad y) i * φ (a⁻¹ • y)) = + fun y : Vec d => a * (u.grad y i * φ (a⁻¹ • y)) := by + funext y + simp [Pi.smul_apply, smul_eq_mul] + ring + rw [hfun, MeasureTheory.integral_const_mul] + calc + ∫ x in U, u.toFun (T x) * (fderiv ℝ φ x) (basisVec i) + ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in V, + u.toFun y * (fderiv ℝ φ (a⁻¹ • y)) (basisVec i) + ∂MeasureTheory.volume := hchange_left + _ = (a ^ d)⁻¹ * + (-a * ∫ y in V, u.grad y i * φ (a⁻¹ • y) ∂MeasureTheory.volume) := by + rw [hweak_scaled] + _ = -((a ^ d)⁻¹ * + ∫ y in V, (a • u.grad y) i * φ (a⁻¹ • y) ∂MeasureTheory.volume) := by + rw [hgrad_scaled_integral] + ring + _ = -∫ x in U, (a • u.grad (T x)) i * φ x ∂MeasureTheory.volume := by + rw [hchange_right] + +@[simp] theorem unscale_toFun {a : ℝ} (ha : 0 < a) + (u : W1pFunction (a • U) p) (x : Vec d) : + (u.unscale ha).toFun x = u.toFun (a • x) := + rfl + +@[simp] theorem unscale_grad {a : ℝ} (ha : 0 < a) + (u : W1pFunction (a • U) p) (x : Vec d) : + (u.unscale ha).grad x = a • u.grad (a • x) := + rfl + +/-- The common `L^p` measure factor in a positive dilation of `Vec d`. -/ +noncomputable def dilationLpFactor (d : ℕ) (p : ENNReal) (a : ℝ) : ℝ := + (ENNReal.ofReal (((a⁻¹) ^ d)⁻¹) ^ (1 / p).toReal).toReal + +/-- Positivity of the finite-dimensional dilation norm factor. -/ +theorem dilationLpFactor_pos (d : ℕ) (p : ENNReal) {a : ℝ} (ha : 0 < a) : + 0 < dilationLpFactor d p a := by + unfold dilationLpFactor + have hbase : 0 < ENNReal.ofReal (((a⁻¹) ^ d)⁻¹) := by + rw [ENNReal.ofReal_pos] + exact inv_pos.mpr (pow_pos (inv_pos.mpr ha) d) + apply ENNReal.toReal_pos + · exact (ENNReal.rpow_pos hbase ENNReal.ofReal_ne_top).ne' + · exact ENNReal.rpow_ne_top_of_nonneg ENNReal.toReal_nonneg ENNReal.ofReal_ne_top + +/-- Change of variables for an `L^p` norm under the forward positive dilation. -/ +theorem eLpNorm_comp_smul_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + {f : Vec d → ℝ} + (hf : MeasureTheory.AEStronglyMeasurable f (volumeMeasureOn (a • U))) : + MeasureTheory.eLpNorm (fun x => f (a • x)) p (volumeMeasureOn U) = + ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm f p (volumeMeasureOn (a • U)) := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a • x + have hmap := map_smul_volume_restrict (d := d) (a := a) ha U + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict U) := + (measurable_const_smul a).aemeasurable + have hf_map : + MeasureTheory.AEStronglyMeasurable f + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) := by + rw [hmap] + exact hf.mono_ac MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm f p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict U)) = + MeasureTheory.eLpNorm (fun x => f (T x)) p + (MeasureTheory.volume.restrict U) := by + exact MeasureTheory.eLpNorm_map_measure hf_map hT_meas + change MeasureTheory.eLpNorm (fun x => f (T x)) p + (MeasureTheory.volume.restrict U) = _ + rw [← hmap_eLp, hmap, MeasureTheory.eLpNorm_smul_measure_of_ne_top hp_top f _ hf] + simp only [smul_eq_mul, volumeMeasureOn] + +/-- The `eLpNorm` of a value representative after pulling it back by dilation. -/ +theorem eLpNorm_unscale_toFun {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) : + MeasureTheory.eLpNorm (u.unscale ha).toFun p (volumeMeasureOn U) = + ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u.toFun p (volumeMeasureOn (a • U)) := by + simpa using! eLpNorm_comp_smul_eq (U := U) (p := p) ha hp_top + u.memLp.aestronglyMeasurable + +/-- The scalar value `L^p` seminorm under pullback by positive dilation. -/ +theorem valueLpSeminorm_unscale_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) : + (u.unscale ha).valueLpSeminorm = + dilationLpFactor d p a⁻¹ * u.valueLpSeminorm := by + have hfactor : + dilationLpFactor d p a⁻¹ = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal).toReal := by + simp [dilationLpFactor] + unfold valueLpSeminorm + rw [eLpNorm_unscale_toFun ha hp_top u, ENNReal.toReal_mul] + rw [← hfactor] + +/-- The `eLpNorm` of one weak-gradient coordinate after dilation pullback. -/ +theorem eLpNorm_unscale_gradCoord {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) (i : Fin d) : + MeasureTheory.eLpNorm (fun x => (u.unscale ha).grad x i) p + (volumeMeasureOn U) = + ENNReal.ofReal a * + (ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (fun x => u.grad x i) p (volumeMeasureOn (a • U))) := by + have hgrad_meas : + MeasureTheory.AEStronglyMeasurable (fun x => u.grad x i) + (volumeMeasureOn (a • U)) := + (u.gradMemLp i).aestronglyMeasurable + change MeasureTheory.eLpNorm (fun x => (a • u.grad (a • x)) i) p + (volumeMeasureOn U) = _ + have hfun : + (fun x : Vec d => (a • u.grad (a • x)) i) = + a • fun x : Vec d => u.grad (a • x) i := rfl + rw [hfun, MeasureTheory.eLpNorm_const_smul, + Real.enorm_eq_ofReal ha.le, eLpNorm_comp_smul_eq ha hp_top hgrad_meas] + +/-- The coordinate gradient `L^p` seminorm under pullback by positive dilation. -/ +theorem gradCoordLpSeminorm_unscale_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) (i : Fin d) : + (u.unscale ha).gradCoordLpSeminorm i = + a * dilationLpFactor d p a⁻¹ * u.gradCoordLpSeminorm i := by + have hfactor : + dilationLpFactor d p a⁻¹ = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal).toReal := by + simp [dilationLpFactor] + unfold gradCoordLpSeminorm + rw [eLpNorm_unscale_gradCoord ha hp_top u i, + ENNReal.toReal_mul, ENNReal.toReal_mul, ENNReal.toReal_ofReal ha.le] + rw [← hfactor] + ring + +/-- The coordinate-sum gradient `L^p` seminorm under dilation pullback. -/ +theorem gradientCoordLpSeminormSum_unscale_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) : + (u.unscale ha).gradientCoordLpSeminormSum = + a * dilationLpFactor d p a⁻¹ * u.gradientCoordLpSeminormSum := by + unfold gradientCoordLpSeminormSum + calc + ∑ i, (u.unscale ha).gradCoordLpSeminorm i = + ∑ i, a * dilationLpFactor d p a⁻¹ * u.gradCoordLpSeminorm i := by + refine Finset.sum_congr rfl fun i _ => gradCoordLpSeminorm_unscale_eq ha hp_top u i + _ = a * dilationLpFactor d p a⁻¹ * ∑ i, u.gradCoordLpSeminorm i := by + rw [← Finset.mul_sum] + +/-- Integral averages commute with the pullback of a scalar witness by +positive dilation. -/ +theorem integralAverage_unscale_eq {a : ℝ} (ha : 0 < a) + (u : W1pFunction (a • U) p) : + integralAverage U (u.unscale ha).toFun = integralAverage (a • U) u.toFun := by + have hvolume : + (MeasureTheory.volume (a • U)).toReal = + a ^ d * (MeasureTheory.volume U).toReal := by + have hmeasure : + MeasureTheory.volume (a • U) = + ENNReal.ofReal (a ^ d) * MeasureTheory.volume U := by + simpa [Vec] using + (MeasureTheory.Measure.addHaar_smul_of_nonneg + (μ := MeasureTheory.volume) (E := Vec d) ha.le U) + rw [hmeasure, ENNReal.toReal_mul, + ENNReal.toReal_ofReal (pow_nonneg ha.le d)] + have hsetIntegral : + ∫ x in U, (u.unscale ha).toFun x ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ y in a • U, u.toFun y ∂MeasureTheory.volume := by + simpa only [unscale_toFun, Module.finrank_fin_fun, smul_eq_mul] using + (MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := u.toFun) (s := U) ha) + unfold integralAverage + rw [hsetIntegral, hvolume] + by_cases hU_zero : (MeasureTheory.volume U).toReal = 0 + · simp [hU_zero] + · field_simp [hU_zero, (pow_pos ha d).ne'] + +/-- Pullback by a positive dilation preserves the zero-average condition. -/ +theorem meanZeroOn_unscale {a : ℝ} (ha : 0 < a) + (u : W1pFunction (a • U) p) (hmean : MeanZeroOn (a • U) u.toFun) : + MeanZeroOn U (u.unscale ha).toFun := by + change ∫ x in U, u.toFun (a • x) ∂MeasureTheory.volume = 0 + rw [MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) (f := u.toFun) (s := U) ha] + rw [hmean] + simp + +/-- The mean-subtracted scalar `L^p` seminorm under pullback by positive +dilation. -/ +theorem subAverageLpSeminorm_unscale_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction (a • U) p) : + (u.unscale ha).subAverageLpSeminorm = + dilationLpFactor d p a⁻¹ * u.subAverageLpSeminorm := by + have hfactor : + dilationLpFactor d p a⁻¹ = + (ENNReal.ofReal ((a ^ d)⁻¹) ^ (1 / p).toReal).toReal := by + simp [dilationLpFactor] + have hsub_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => u.toFun x - integralAverage (a • U) u.toFun) + (volumeMeasureOn (a • U)) := + u.memLp.aestronglyMeasurable.sub MeasureTheory.aestronglyMeasurable_const + unfold subAverageLpSeminorm + rw [integralAverage_unscale_eq ha u] + change + (MeasureTheory.eLpNorm + (fun x => u.toFun (a • x) - integralAverage (a • U) u.toFun) p + (volumeMeasureOn U)).toReal = _ + have hfun : + (fun x => u.toFun (a • x) - integralAverage (a • U) u.toFun) = + fun x => (fun y => u.toFun y - integralAverage (a • U) u.toFun) (a • x) := rfl + rw [hfun, eLpNorm_comp_smul_eq ha hp_top hsub_meas, ENNReal.toReal_mul, + ← hfactor] + +/-- Change of variables for an `L^p` norm under the inverse positive dilation. +The assumption is measurability rather than `MemLp`, so it also applies to +the mean-subtracted representative in the Poincare seminorm. -/ +theorem eLpNorm_comp_dilate_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + {f : Vec d → ℝ} + (hf : MeasureTheory.AEStronglyMeasurable f (volumeMeasureOn U)) : + MeasureTheory.eLpNorm (fun x => f (a⁻¹ • x)) p (volumeMeasureOn (a • U)) = + ENNReal.ofReal (((a⁻¹) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm f p (volumeMeasureOn U) := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a⁻¹ • x + have hmap := map_smul_volume_restrict (d := d) (a := a⁻¹) (inv_pos.mpr ha) V + have hpre : a⁻¹ • V = U := by + ext x + simp [V, ha.ne'] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict V) := + (measurable_const_smul a⁻¹).aemeasurable + have hf_map : + MeasureTheory.AEStronglyMeasurable f + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact hf.mono_ac MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm f p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) = + MeasureTheory.eLpNorm (fun x => f (T x)) p + (MeasureTheory.volume.restrict V) := by + exact MeasureTheory.eLpNorm_map_measure hf_map hT_meas + change MeasureTheory.eLpNorm (fun x => f (T x)) p + (MeasureTheory.volume.restrict V) = _ + rw [← hmap_eLp, hmap, hpre, + MeasureTheory.eLpNorm_smul_measure_of_ne_top hp_top f _ hf] + simp only [smul_eq_mul, volumeMeasureOn] + +/-- The `eLpNorm` of the value representative after a positive dilation. -/ +theorem eLpNorm_dilate_toFun {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) : + MeasureTheory.eLpNorm (u.dilate ha).toFun p (volumeMeasureOn (a • U)) = + ENNReal.ofReal (((a⁻¹) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm u.toFun p (volumeMeasureOn U) := by + simpa using! eLpNorm_comp_dilate_eq (U := U) (p := p) ha hp_top + u.memLp.aestronglyMeasurable + +/-- The scalar value `L^p` seminorm under positive dilation. -/ +theorem valueLpSeminorm_dilate_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) : + (u.dilate ha).valueLpSeminorm = + dilationLpFactor d p a * u.valueLpSeminorm := by + unfold valueLpSeminorm dilationLpFactor + rw [eLpNorm_dilate_toFun ha hp_top u, ENNReal.toReal_mul] + +/-- The `eLpNorm` of one weak-gradient coordinate after positive dilation. -/ +theorem eLpNorm_dilate_gradCoord {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) (i : Fin d) : + MeasureTheory.eLpNorm (fun x => (u.dilate ha).grad x i) p + (volumeMeasureOn (a • U)) = + ENNReal.ofReal a⁻¹ * + (ENNReal.ofReal (((a⁻¹) ^ d)⁻¹) ^ (1 / p).toReal * + MeasureTheory.eLpNorm (fun x => u.grad x i) p (volumeMeasureOn U)) := by + let V : Set (Vec d) := a • U + let T : Vec d → Vec d := fun x => a⁻¹ • x + have hmap := map_smul_volume_restrict (d := d) (a := a⁻¹) (inv_pos.mpr ha) V + have hpre : a⁻¹ • V = U := by + ext x + simp [V, ha.ne'] + have hT_meas : AEMeasurable T (MeasureTheory.volume.restrict V) := + (measurable_const_smul a⁻¹).aemeasurable + have hgrad_aesm_map : + MeasureTheory.AEStronglyMeasurable (fun x => u.grad x i) + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) := by + rw [hmap, hpre] + exact (u.gradMemLp i).aestronglyMeasurable.mono_ac + MeasureTheory.Measure.smul_absolutelyContinuous + have hmap_eLp : + MeasureTheory.eLpNorm (fun x => u.grad x i) p + (MeasureTheory.Measure.map T (MeasureTheory.volume.restrict V)) = + MeasureTheory.eLpNorm (fun x => u.grad (T x) i) p + (MeasureTheory.volume.restrict V) := by + exact MeasureTheory.eLpNorm_map_measure hgrad_aesm_map hT_meas + change MeasureTheory.eLpNorm (fun x => (a⁻¹ • u.grad (T x)) i) p + (MeasureTheory.volume.restrict V) = _ + have hfun : + (fun x : Vec d => (a⁻¹ • u.grad (T x)) i) = + a⁻¹ • fun x : Vec d => u.grad (T x) i := rfl + rw [hfun, MeasureTheory.eLpNorm_const_smul, + Real.enorm_eq_ofReal (inv_nonneg.mpr ha.le), ← hmap_eLp, hmap, hpre, + MeasureTheory.eLpNorm_smul_measure_of_ne_top hp_top (fun x => u.grad x i) _ + (u.gradMemLp i).aestronglyMeasurable] + simp only [smul_eq_mul, volumeMeasureOn] + +/-- The coordinate gradient `L^p` seminorm under positive dilation. -/ +theorem gradCoordLpSeminorm_dilate_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) (i : Fin d) : + (u.dilate ha).gradCoordLpSeminorm i = + a⁻¹ * dilationLpFactor d p a * u.gradCoordLpSeminorm i := by + unfold gradCoordLpSeminorm dilationLpFactor + rw [eLpNorm_dilate_gradCoord ha hp_top u i, + ENNReal.toReal_mul, ENNReal.toReal_mul, + ENNReal.toReal_ofReal (inv_nonneg.mpr ha.le)] + ring + +/-- The coordinate-sum gradient `L^p` seminorm under positive dilation. -/ +theorem gradientCoordLpSeminormSum_dilate_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) : + (u.dilate ha).gradientCoordLpSeminormSum = + a⁻¹ * dilationLpFactor d p a * u.gradientCoordLpSeminormSum := by + unfold gradientCoordLpSeminormSum + calc + ∑ i, (u.dilate ha).gradCoordLpSeminorm i = + ∑ i, a⁻¹ * dilationLpFactor d p a * u.gradCoordLpSeminorm i := by + refine Finset.sum_congr rfl fun i _ => gradCoordLpSeminorm_dilate_eq ha hp_top u i + _ = a⁻¹ * dilationLpFactor d p a * ∑ i, u.gradCoordLpSeminorm i := by + rw [← Finset.mul_sum] + +/-- Integral averages commute with positive dilation of a scalar witness. -/ +theorem integralAverage_dilate_eq {a : ℝ} (ha : 0 < a) + (u : W1pFunction U p) : + integralAverage (a • U) (u.dilate ha).toFun = integralAverage U u.toFun := by + have hvolume : + (MeasureTheory.volume (a • U)).toReal = + a ^ d * (MeasureTheory.volume U).toReal := by + have hmeasure : + MeasureTheory.volume (a • U) = + ENNReal.ofReal (a ^ d) * MeasureTheory.volume U := by + simpa [Vec] using + (MeasureTheory.Measure.addHaar_smul_of_nonneg + (μ := MeasureTheory.volume) (E := Vec d) ha.le U) + rw [hmeasure, ENNReal.toReal_mul, + ENNReal.toReal_ofReal (pow_nonneg ha.le d)] + have hsetIntegral : + ∫ x in a • U, (u.dilate ha).toFun x ∂MeasureTheory.volume = + a ^ d * ∫ y in U, u.toFun y ∂MeasureTheory.volume := by + have hchange := + MeasureTheory.Measure.setIntegral_comp_smul_of_pos + (μ := MeasureTheory.volume) + (f := fun x : Vec d => (u.dilate ha).toFun x) + (s := U) ha + have hpow_ne : a ^ d ≠ 0 := (pow_pos ha d).ne' + change ∫ x in a • U, u.toFun (a⁻¹ • x) ∂MeasureTheory.volume = _ + have hchange' : + ∫ y in U, u.toFun y ∂MeasureTheory.volume = + (a ^ d)⁻¹ * ∫ x in a • U, + u.toFun (a⁻¹ • x) ∂MeasureTheory.volume := by + simpa only [dilate_toFun, smul_smul, inv_mul_cancel₀ ha.ne', one_smul, + smul_eq_mul, Module.finrank_fin_fun] using hchange + rw [hchange'] + field_simp [hpow_ne] + unfold integralAverage + rw [hsetIntegral, hvolume] + by_cases hU_zero : (MeasureTheory.volume U).toReal = 0 + · simp [hU_zero] + · field_simp [hU_zero, (pow_pos ha d).ne'] + +/-- The mean-subtracted scalar `L^p` seminorm under positive dilation. -/ +theorem subAverageLpSeminorm_dilate_eq {a : ℝ} (ha : 0 < a) (hp_top : p ≠ ∞) + (u : W1pFunction U p) : + (u.dilate ha).subAverageLpSeminorm = + dilationLpFactor d p a * u.subAverageLpSeminorm := by + unfold subAverageLpSeminorm dilationLpFactor + rw [integralAverage_dilate_eq ha u] + have hsub_meas : + MeasureTheory.AEStronglyMeasurable + (fun x => u.toFun x - integralAverage U u.toFun) (volumeMeasureOn U) := + u.memLp.aestronglyMeasurable.sub MeasureTheory.aestronglyMeasurable_const + change + (MeasureTheory.eLpNorm + (fun x => u.toFun (a⁻¹ • x) - integralAverage U u.toFun) p + (volumeMeasureOn (a • U))).toReal = _ + have hfun : + (fun x => u.toFun (a⁻¹ • x) - integralAverage U u.toFun) = + fun x => (fun y => u.toFun y - integralAverage U u.toFun) (a⁻¹ • x) := rfl + rw [hfun] + rw [eLpNorm_comp_dilate_eq ha hp_top hsub_meas, ENNReal.toReal_mul] + +end W1pFunction + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/FiniteMeasureDowngrade.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/FiniteMeasureDowngrade.lean new file mode 100644 index 0000000000..2671f49b38 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/FiniteMeasureDowngrade.lean @@ -0,0 +1,203 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Finite-measure downgrades from `H¹` to `W^{1,p}` + +On a finite-measure domain, the `L²` value and weak-gradient data carried by +an `H1Function` also provide `W^{1,p}` data at every finite exponent `p ≤ 2`. +The analogous conversion for `H10Function` preserves its smooth, compactly +supported approximating sequence and therefore its zero-trace witness. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +noncomputable section + +namespace H1Function + +/-- Regard an `H¹` witness on a finite-measure domain as a `W^{1,p}` witness +whenever `p ≤ 2`. The value and weak-gradient representatives are unchanged. -/ +noncomputable def toW1pOfExponentLETwo {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H1Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + W1pFunction U p.exponent := + { toFun := u.toFun + grad := u.grad + memLp := u.memL2.mono_exponent hp + gradMemLp := fun i => (u.gradMemL2 i).mono_exponent hp + hasWeakGradient := u.hasWeakGradient } + +@[simp] theorem toW1pOfExponentLETwo_toFun {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H1Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + (u.toW1pOfExponentLETwo p hp).toFun = u.toFun := + rfl + +@[simp] theorem toW1pOfExponentLETwo_grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H1Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + (u.toW1pOfExponentLETwo p hp).grad = u.grad := + rfl + +end H1Function + +namespace H10Function + +private theorem tendsto_eLpNorm_downgrade_of_two + {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + {p : FiniteLpExponent} (hp : p.exponent ≤ 2) + {F : ℕ → Vec d → ℝ} {f : Vec d → ℝ} + (hF2 : ∀ n, MeasureTheory.MemLp (F n) 2 (MeasureTheory.volume.restrict U)) + (hf2 : MeasureTheory.MemLp f 2 (MeasureTheory.volume.restrict U)) + (hTendsto : Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) 2 + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0)) : + Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) p.exponent + (MeasureTheory.volume.restrict U)) + Filter.atTop (nhds 0) := by + let μ : MeasureTheory.Measure (Vec d) := MeasureTheory.volume.restrict U + have hdiff_meas : ∀ n, + MeasureTheory.AEStronglyMeasurable (fun x => F n x - f x) μ := by + intro n + exact (hF2 n).aestronglyMeasurable.sub hf2.aestronglyMeasurable + have hp_real : 0 ≤ 1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal := by + have hple : p.exponent.toReal ≤ (2 : ℝ≥0∞).toReal := + (ENNReal.toReal_le_toReal p.lt_top.ne (by norm_num)).mpr hp + apply sub_nonneg.mpr + exact one_div_le_one_div_of_le + (ENNReal.toReal_pos (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne) hple + have hbound : ∀ n, + MeasureTheory.eLpNorm (fun x => F n x - f x) p.exponent μ ≤ + MeasureTheory.eLpNorm (fun x => F n x - f x) 2 μ * + μ Set.univ ^ (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal) := by + intro n + exact MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ hp (hdiff_meas n) + have hfactor_ne_top : + μ Set.univ ^ (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal) ≠ ∞ := by + refine (ENNReal.rpow_lt_top_of_nonneg hp_real ?_).ne + exact (MeasureTheory.measure_lt_top μ Set.univ).ne + have hscaled : Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) 2 μ * + μ Set.univ ^ (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal)) + Filter.atTop + (nhds (0 * μ Set.univ ^ + (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal))) := by + exact ENNReal.Tendsto.mul_const (by simpa only [μ] using hTendsto) + (Or.inr hfactor_ne_top) + have hscaled_zero : Filter.Tendsto + (fun n => MeasureTheory.eLpNorm (fun x => F n x - f x) 2 μ * + μ Set.univ ^ (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal)) + Filter.atTop (nhds 0) := by + simpa only [zero_mul] using hscaled + exact tendsto_of_tendsto_of_tendsto_of_le_of_le + tendsto_const_nhds hscaled_zero (fun _ => zero_le) hbound + +/-- Regard an `H¹₀` witness on a finite-measure domain as a zero-trace +`W^{1,p}` witness whenever `p ≤ 2`. The value, weak-gradient, and smooth +compactly supported approximation representatives are unchanged. -/ +noncomputable def toW10pOfExponentLETwo {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H10Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + W10pFunction U p.exponent := + { toW1pFunction := u.toH1Function.toW1pOfExponentLETwo p hp + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := u.approx_support_subset + tendsto_approx := by + apply tendsto_eLpNorm_downgrade_of_two hp + · intro n + exact ((u.approx_smooth n).differentiable (by simp)).continuous + |>.memLp_of_hasCompactSupport (u.approx_hasCompactSupport n) |>.restrict U + · exact u.toH1Function.memL2 + · exact u.tendsto_approx + tendsto_approx_grad := by + intro i + apply tendsto_eLpNorm_downgrade_of_two hp + · intro n + have hcont : Continuous (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := by + simpa using + ((u.approx_smooth n).continuous_fderiv (by simp)).clm_apply continuous_const + have hsupp : HasCompactSupport + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := by + simpa using (u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcont.memLp_of_hasCompactSupport hsupp |>.restrict U + · exact u.toH1Function.gradMemL2 i + · exact u.tendsto_approx_grad i } + +@[simp] theorem toW10pOfExponentLETwo_toFun {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H10Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + (u.toW10pOfExponentLETwo p hp).toW1pFunction.toFun = u.toH1Function.toFun := + rfl + +@[simp] theorem toW10pOfExponentLETwo_grad {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (u : H10Function U) (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + (u.toW10pOfExponentLETwo p hp).toW1pFunction.grad = u.toH1Function.grad := + rfl + +end H10Function + +/-- The finite-measure comparison from a lower finite exponent to `L²`. -/ +theorem eLpNorm_finiteMeasure_downgrade_le {d : ℕ} {U : Set (Vec d)} + [MeasureTheory.IsFiniteMeasure (MeasureTheory.volume.restrict U)] + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) (f : Vec d → ℝ) + (hf : MeasureTheory.AEStronglyMeasurable f (MeasureTheory.volume.restrict U)) : + MeasureTheory.eLpNorm f p.exponent (MeasureTheory.volume.restrict U) ≤ + MeasureTheory.eLpNorm f 2 (MeasureTheory.volume.restrict U) * + (MeasureTheory.volume.restrict U) Set.univ ^ + (1 / p.exponent.toReal - 1 / (2 : ℝ≥0∞).toReal) := by + exact MeasureTheory.eLpNorm_le_eLpNorm_mul_rpow_measure_univ hp hf + +/-- On a normalized cube, lowering an exponent from `2` costs no measure +factor because the normalized cube measure is a probability measure. -/ +theorem eLpNorm_normalizedCubeMeasure_downgrade_le {d : ℕ} (Q : TriadicCube d) + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) (f : Vec d → ℝ) + (hf : MeasureTheory.AEStronglyMeasurable f (normalizedCubeMeasure Q)) : + MeasureTheory.eLpNorm f p.exponent (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm f 2 (normalizedCubeMeasure Q) := by + let : MeasureTheory.IsProbabilityMeasure (normalizedCubeMeasure Q) := + ⟨normalizedCubeMeasure_apply_univ Q⟩ + exact MeasureTheory.eLpNorm_le_eLpNorm_of_exponent_le hp + +/-- The normalized-cube exponent downgrade for the value representative of +an `H¹` function. -/ +theorem H1Function.eLpNorm_normalizedCubeMeasure_downgrade_le {d : ℕ} + (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + MeasureTheory.eLpNorm u.toFun p.exponent (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm u.toFun 2 (normalizedCubeMeasure Q) := + Homogenization.eLpNorm_normalizedCubeMeasure_downgrade_le Q p hp u.toFun + u.memL2_normalizedCubeMeasure.aestronglyMeasurable + +/-- The normalized-cube exponent downgrade for a gradient coordinate of an +`H¹` function. -/ +theorem H1Function.grad_eLpNorm_normalizedCubeMeasure_downgrade_le {d : ℕ} + (Q : TriadicCube d) (u : H1Function (openCubeSet Q)) (i : Fin d) + (p : FiniteLpExponent) (hp : p.exponent ≤ 2) : + MeasureTheory.eLpNorm (fun x => u.grad x i) p.exponent (normalizedCubeMeasure Q) ≤ + MeasureTheory.eLpNorm (fun x => u.grad x i) 2 (normalizedCubeMeasure Q) := + Homogenization.eLpNorm_normalizedCubeMeasure_downgrade_le Q p hp (fun x => u.grad x i) + (u.grad_memL2_normalizedCubeMeasure i).aestronglyMeasurable + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalAffineLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalAffineLp.lean new file mode 100644 index 0000000000..f23ddd2006 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalAffineLp.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.CoerciveH1Dilation +public import Mathlib.MeasureTheory.Function.ContinuousMapDense +public import Mathlib.MeasureTheory.Function.UniformIntegrable + +/-! +# Global affine expansion in finite `Lᵖ` + +This file isolates the volume transport and strong finite-`Lᵖ` continuity of +the outward affine map used by inward mollification. +-/ + +@[expose] public section + +namespace Homogenization + +open Function MeasureTheory Set Topology +open scoped ENNReal NNReal Pointwise + +noncomputable section + +/-- The outward affine map based at `x0` with expansion parameter `ε`. -/ +def globalAffineExpansion {d : ℕ} (x0 : Vec d) (ε : ℝ) : Vec d → Vec d := + fun x => (1 + ε) • x - ε • x0 + +@[simp] theorem globalAffineExpansion_apply {d : ℕ} (x0 x : Vec d) (ε : ℝ) : + globalAffineExpansion x0 ε x = (1 + ε) • x - ε • x0 := + rfl + +private theorem globalAffineExpansion_eq_add_comp_smul {d : ℕ} (x0 : Vec d) (ε : ℝ) : + globalAffineExpansion x0 ε = + (fun y : Vec d => y + (-ε • x0)) ∘ fun x : Vec d => (1 + ε) • x := by + funext x + simp [globalAffineExpansion_apply, sub_eq_add_neg, neg_smul] + +/-- The outward affine expansion pushes Lebesgue measure forward by the +Jacobian factor of its scalar linear part. -/ +theorem map_globalAffineExpansion_volume {d : ℕ} (x0 : Vec d) {ε : ℝ} + (hε : 0 ≤ ε) : + Measure.map (globalAffineExpansion x0 ε) volume = + ENNReal.ofReal (((1 + ε) ^ d)⁻¹) • volume := by + have ha : 0 < 1 + ε := by linarith + rw [globalAffineExpansion_eq_add_comp_smul] + change Measure.map ((fun y : Vec d => y + (-ε • x0)) ∘ + fun x : Vec d => (1 + ε) • x) volume = _ + rw [← Measure.map_map (g := fun y : Vec d => y + (-ε • x0)) + (f := fun x : Vec d => (1 + ε) • x) (measurable_id.add measurable_const) + (measurable_const_smul (1 + ε))] + · have hmap := map_smul_volume_restrict (d := d) ha Set.univ + have hsmul_univ : (1 + ε) • (Set.univ : Set (Vec d)) = Set.univ := + Set.smul_set_univ₀ ha.ne' + rw [hsmul_univ, Measure.restrict_univ] at hmap + rw [hmap, Measure.map_smul _ (f := fun y : Vec d => y + (-ε • x0)) + (measurable_id.add measurable_const).aemeasurable, + map_add_right_eq_self] + +/-- The outward affine expansion is quasi-measure-preserving for Lebesgue +measure whenever its scalar factor is positive. -/ +theorem quasiMeasurePreserving_globalAffineExpansion {d : ℕ} (x0 : Vec d) {ε : ℝ} + (hε : 0 ≤ ε) : + Measure.QuasiMeasurePreserving (globalAffineExpansion x0 ε) volume volume := by + refine ⟨(measurable_const_smul (1 + ε)).sub measurable_const, ?_⟩ + rw [map_globalAffineExpansion_volume x0 hε] + exact Measure.smul_absolutelyContinuous + +/-- Almost-everywhere equal fields remain almost-everywhere equal after an +outward affine expansion. -/ +theorem Filter.EventuallyEq.comp_globalAffineExpansion {d : ℕ} {f g : Vec d → ℝ} + (hfg : f =ᵐ[volume] g) (x0 : Vec d) {ε : ℝ} (hε : 0 ≤ ε) : + f ∘ globalAffineExpansion x0 ε =ᵐ[volume] g ∘ globalAffineExpansion x0 ε := + (quasiMeasurePreserving_globalAffineExpansion x0 hε).ae_eq hfg + +/-- Finite `Lᵖ` functions remain in `Lᵖ` after an outward affine expansion. -/ +theorem MemLp.comp_globalAffineExpansion {d : ℕ} {g : Vec d → ℝ} {p : ℝ≥0∞} + (hg : MemLp g p volume) (x0 : Vec d) {ε : ℝ} (hε : 0 ≤ ε) : + MemLp (g ∘ globalAffineExpansion x0 ε) p volume := by + have hmap : Measure.map (globalAffineExpansion x0 ε) volume = + ENNReal.ofReal (((1 + ε) ^ d)⁻¹) • volume := + map_globalAffineExpansion_volume x0 hε + have hg_map : MemLp g p (Measure.map (globalAffineExpansion x0 ε) volume) := by + rw [hmap] + exact hg.smul_measure ENNReal.ofReal_ne_top + have hmeas : AEMeasurable (globalAffineExpansion x0 ε) volume := + ((measurable_const_smul (1 + ε)).sub measurable_const).aemeasurable + exact hg_map.comp_of_map hmeas + +/-- Exact finite-`Lᵖ` norm transport under an outward affine expansion. -/ +theorem eLpNorm_comp_globalAffineExpansion {d : ℕ} {g : Vec d → ℝ} {p : ℝ≥0∞} + (hp : p ≠ ∞) (hg : MemLp g p volume) (x0 : Vec d) {ε : ℝ} (hε : 0 ≤ ε) : + eLpNorm (g ∘ globalAffineExpansion x0 ε) p volume = + ENNReal.ofReal (((1 + ε) ^ d)⁻¹) ^ (1 / p).toReal * eLpNorm g p volume := by + have hmap : Measure.map (globalAffineExpansion x0 ε) volume = + ENNReal.ofReal (((1 + ε) ^ d)⁻¹) • volume := + map_globalAffineExpansion_volume x0 hε + have hmeas : AEMeasurable (globalAffineExpansion x0 ε) volume := + ((measurable_const_smul (1 + ε)).sub measurable_const).aemeasurable + have hg_map : AEStronglyMeasurable g + (Measure.map (globalAffineExpansion x0 ε) volume) := by + rw [hmap] + exact (hg.smul_measure ENNReal.ofReal_ne_top).aestronglyMeasurable + rw [← MeasureTheory.eLpNorm_map_measure hg_map hmeas, hmap, + MeasureTheory.eLpNorm_smul_measure_of_ne_top hp g _ hg.aestronglyMeasurable] + simp only [smul_eq_mul] + +private theorem eLpNorm_comp_globalAffineExpansion_le {d : ℕ} {g : Vec d → ℝ} + {p : ℝ≥0∞} (hp : p ≠ ∞) (hg : MemLp g p volume) (x0 : Vec d) {ε : ℝ} + (hε : 0 ≤ ε) : + eLpNorm (g ∘ globalAffineExpansion x0 ε) p volume ≤ eLpNorm g p volume := by + rw [eLpNorm_comp_globalAffineExpansion hp hg x0 hε] + have hpow : 1 ≤ (1 + ε) ^ d := one_le_pow₀ (by linarith) + have hbase : ENNReal.ofReal (((1 + ε) ^ d)⁻¹) ≤ 1 := + ENNReal.ofReal_le_one.mpr (inv_le_one_of_one_le₀ hpow) + have hfactor : ENNReal.ofReal (((1 + ε) ^ d)⁻¹) ^ (1 / p).toReal ≤ 1 := + ENNReal.rpow_le_one hbase (by positivity) + simpa only [one_mul] using mul_le_mul_left hfactor (eLpNorm g p volume) + +private theorem globalAffineExpansion_inv_apply {d : ℕ} (x x0 : Vec d) {ε : ℝ} + (hε : 0 ≤ ε) : + x = (1 + ε)⁻¹ • globalAffineExpansion x0 ε x + + (ε * (1 + ε)⁻¹) • x0 := by + have ha : 0 < 1 + ε := by linarith + ext i + simp only [globalAffineExpansion_apply, Pi.add_apply, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + field_simp [ha.ne'] + ring + +private theorem norm_globalAffineExpansion_inv_le {d : ℕ} (x x0 : Vec d) {ε R : ℝ} + (hε : 0 ≤ ε) (hR : ‖globalAffineExpansion x0 ε x‖ ≤ R) : + ‖x‖ ≤ R + ‖x0‖ := by + have ha : 0 < 1 + ε := by linarith + have hinv_nonneg : 0 ≤ (1 + ε)⁻¹ := inv_nonneg.mpr ha.le + have hcoeff_nonneg : 0 ≤ ε * (1 + ε)⁻¹ := mul_nonneg hε hinv_nonneg + have hinv_le_one : (1 + ε)⁻¹ ≤ 1 := by + rw [inv_le_one₀ ha] + linarith + have hcoeff_le_one : ε * (1 + ε)⁻¹ ≤ 1 := by + rw [← div_eq_mul_inv] + exact (div_le_one₀ ha).mpr (by linarith) + have hR_nonneg : 0 ≤ R := (norm_nonneg _).trans hR + rw [globalAffineExpansion_inv_apply x x0 hε] + calc + ‖(1 + ε)⁻¹ • globalAffineExpansion x0 ε x + + (ε * (1 + ε)⁻¹) • x0‖ ≤ + ‖(1 + ε)⁻¹ • globalAffineExpansion x0 ε x‖ + + ‖(ε * (1 + ε)⁻¹) • x0‖ := norm_add_le _ _ + _ = (1 + ε)⁻¹ * ‖globalAffineExpansion x0 ε x‖ + + (ε * (1 + ε)⁻¹) * ‖x0‖ := by + rw [norm_smul, norm_smul, Real.norm_eq_abs, Real.norm_eq_abs, + abs_of_nonneg hinv_nonneg, abs_of_nonneg hcoeff_nonneg] + _ ≤ R + ‖x0‖ := by + exact add_le_add + (calc + (1 + ε)⁻¹ * ‖globalAffineExpansion x0 ε x‖ ≤ + 1 * ‖globalAffineExpansion x0 ε x‖ := + mul_le_mul_of_nonneg_right hinv_le_one (norm_nonneg _) + _ ≤ 1 * R := mul_le_mul_of_nonneg_left hR zero_le_one + _ = R := one_mul _) + (calc + (ε * (1 + ε)⁻¹) * ‖x0‖ ≤ 1 * ‖x0‖ := + mul_le_mul_of_nonneg_right hcoeff_le_one (norm_nonneg _) + _ = ‖x0‖ := one_mul _) + +private theorem tendsto_globalAffineExpansion_apply {d : ℕ} (x x0 : Vec d) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) : + Filter.Tendsto (fun n => globalAffineExpansion x0 (ε n) x) Filter.atTop (nhds x) := by + have hscale : Filter.Tendsto (fun n => 1 + ε n) Filter.atTop (nhds 1) := + by simpa using (tendsto_const_nhds.add hε) + have hfirst : Filter.Tendsto (fun n => (1 + ε n) • x) Filter.atTop (nhds x) := by + simpa using hscale.smul (tendsto_const_nhds : + Filter.Tendsto (fun _ : ℕ => x) Filter.atTop (nhds x)) + have hsecond : Filter.Tendsto (fun n => ε n • x0) Filter.atTop (nhds 0) := by + simpa using hε.smul (tendsto_const_nhds : + Filter.Tendsto (fun _ : ℕ => x0) Filter.atTop (nhds x0)) + simpa [globalAffineExpansion_apply] using hfirst.sub hsecond + +private theorem tendsto_eLpNorm_comp_globalAffineExpansion_sub_zero_of_continuous_compactSupport + {d : ℕ} {h : Vec d → ℝ} {p : ℝ≥0∞} (hp : 1 ≤ p) (hp_top : p ≠ ∞) + (hcont : Continuous h) (hcompact : HasCompactSupport h) (x0 : Vec d) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ n, 0 ≤ ε n) : + Filter.Tendsto + (fun n => eLpNorm (h ∘ globalAffineExpansion x0 (ε n) - h) p volume) + Filter.atTop (nhds 0) := by + obtain ⟨R, hR⟩ := hcompact.isCompact.isBounded.subset_closedBall (0 : Vec d) + let B : Set (Vec d) := Metric.closedBall 0 (R + ‖x0‖) + have hB_meas : MeasurableSet B := Metric.isClosed_closedBall.measurableSet + let : IsFiniteMeasure (volume.restrict B) := + ⟨by + simpa [B] using (measure_closedBall_lt_top (μ := volume) (x := (0 : Vec d)) + (r := R + ‖x0‖))⟩ + have hcomp_support : ∀ n, Function.support (h ∘ globalAffineExpansion x0 (ε n)) ⊆ B := by + intro n x hx + rw [Metric.mem_closedBall, dist_zero_right] + apply norm_globalAffineExpansion_inv_le x x0 (hε_nonneg n) + have hy : globalAffineExpansion x0 (ε n) x ∈ Metric.closedBall 0 R := + hR (subset_tsupport h (by simpa only [Function.mem_support, Function.comp_apply] using hx)) + rwa [Metric.mem_closedBall, dist_zero_right] at hy + have hh_support : Function.support h ⊆ B := by + intro x hx + rw [Metric.mem_closedBall, dist_zero_right] + have hx' : ‖x‖ ≤ R := by + simpa only [Metric.mem_closedBall, dist_zero_right] using hR (subset_tsupport h hx) + exact hx'.trans (le_add_of_nonneg_right (norm_nonneg _)) + have hdiff_support : ∀ n, + Function.support (h ∘ globalAffineExpansion x0 (ε n) - h) ⊆ B := by + intro n + exact (Function.support_sub _ _).trans (Set.union_subset (hcomp_support n) hh_support) + have hmem : MemLp h p volume := hcont.memLp_of_hasCompactSupport hcompact + have hmem_comp : ∀ n, MemLp (h ∘ globalAffineExpansion x0 (ε n)) p volume := + fun n => MemLp.comp_globalAffineExpansion hmem x0 (hε_nonneg n) + have hpoint : ∀ x : Vec d, + Filter.Tendsto (fun n => (h ∘ globalAffineExpansion x0 (ε n)) x) + Filter.atTop (nhds (h x)) := by + intro x + exact hcont.continuousAt.tendsto.comp (tendsto_globalAffineExpansion_apply x x0 hε) + obtain ⟨C, hC⟩ := hcont.bounded_above_of_compact_support hcompact + have hC_nonneg : 0 ≤ C := (norm_nonneg _).trans (hC 0) + have hUI : UnifIntegrable (fun n => h ∘ globalAffineExpansion x0 (ε n)) p + (volume.restrict B) := by + apply unifIntegrable_of hp hp_top + · intro n + exact (hmem_comp n).restrict B |>.aestronglyMeasurable + · intro δ hδ + let C' : NNReal := ⟨C + 1, by linarith⟩ + refine ⟨C', fun n => ?_⟩ + have hzero : {x | C' ≤ + ‖(h ∘ globalAffineExpansion x0 (ε n)) x‖₊}.indicator + (h ∘ globalAffineExpansion x0 (ε n)) = 0 := by + funext x + by_cases hx : C' ≤ + ‖(h ∘ globalAffineExpansion x0 (ε n)) x‖₊ + · exfalso + have hle : C + 1 ≤ ‖h (globalAffineExpansion x0 (ε n) x)‖ := by + exact_mod_cast hx + linarith [hC (globalAffineExpansion x0 (ε n) x)] + · change Set.indicator {x | C' ≤ + ‖(h ∘ globalAffineExpansion x0 (ε n)) x‖₊} + (h ∘ globalAffineExpansion x0 (ε n)) x = (0 : ℝ) + have hx' : x ∉ {x | C' ≤ + ‖(h ∘ globalAffineExpansion x0 (ε n)) x‖₊} := hx + simp only [Set.indicator_apply, hx', ↓reduceIte] + rw [hzero, eLpNorm_zero] + exact bot_le + have hlocal := tendsto_Lp_finite_of_tendsto_ae hp hp_top + (fun n => (hmem_comp n).restrict B |>.aestronglyMeasurable) + (hmem.restrict B) hUI (ae_of_all _ hpoint) + have hEq : (fun n => eLpNorm (h ∘ globalAffineExpansion x0 (ε n) - h) p volume) = + fun n => eLpNorm (h ∘ globalAffineExpansion x0 (ε n) - h) p (volume.restrict B) := by + funext n + exact (eLpNorm_restrict_eq_of_support_subset + ((hmem_comp n).aestronglyMeasurable.sub hmem.aestronglyMeasurable) (hdiff_support n)).symm + rw [hEq] + exact hlocal + +/-- Outward affine expansions are strongly continuous on global finite `Lᵖ`. +The conclusion is stated for scalar fields; downstream weak-gradient arguments +apply it coordinatewise. -/ +theorem tendsto_eLpNorm_comp_globalAffineExpansion_sub_zero {d : ℕ} + {g : Vec d → ℝ} {p : ℝ≥0∞} (hp : 1 ≤ p) (hp_top : p ≠ ∞) + (hg : MemLp g p volume) (x0 : Vec d) {ε : ℕ → ℝ} + (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ n, 0 ≤ ε n) : + Filter.Tendsto + (fun n => eLpNorm (g ∘ globalAffineExpansion x0 (ε n) - g) p volume) + Filter.atTop (nhds 0) := by + rw [ENNReal.tendsto_atTop_zero] + intro δ hδ + have hthree_ne_top : (3 : ℝ≥0∞) ≠ ⊤ := by norm_num + obtain ⟨h, hcompact, hgh, hcont, hh⟩ := + hg.exists_hasCompactSupport_eLpNorm_sub_le hp_top + (ENNReal.div_ne_zero.mpr ⟨hδ.ne', hthree_ne_top⟩) + have hmiddle := + tendsto_eLpNorm_comp_globalAffineExpansion_sub_zero_of_continuous_compactSupport + hp hp_top hcont hcompact x0 hε hε_nonneg + rw [ENNReal.tendsto_atTop_zero] at hmiddle + obtain ⟨N, hN⟩ := hmiddle (δ / (3 : ℝ≥0∞)) (by + exact (pos_iff_ne_zero.mpr (ENNReal.div_ne_zero.mpr ⟨hδ.ne', hthree_ne_top⟩))) + refine ⟨N, fun n hn => ?_⟩ + have hgh_comp : MemLp ((g - h) ∘ globalAffineExpansion x0 (ε n)) p volume := + MemLp.comp_globalAffineExpansion (hg.sub hh) x0 (hε_nonneg n) + have hh_comp : MemLp (h ∘ globalAffineExpansion x0 (ε n)) p volume := + MemLp.comp_globalAffineExpansion hh x0 (hε_nonneg n) + have hsplit : g ∘ globalAffineExpansion x0 (ε n) - g = + (g - h) ∘ globalAffineExpansion x0 (ε n) + + ((h ∘ globalAffineExpansion x0 (ε n) - h) + (h - g)) := by + funext x + simp only [Function.comp_apply, Pi.add_apply, Pi.sub_apply] + ring + rw [hsplit] + calc + eLpNorm ((g - h) ∘ globalAffineExpansion x0 (ε n) + + ((h ∘ globalAffineExpansion x0 (ε n) - h) + (h - g))) p volume ≤ + eLpNorm ((g - h) ∘ globalAffineExpansion x0 (ε n)) p volume + + eLpNorm ((h ∘ globalAffineExpansion x0 (ε n) - h) + (h - g)) p volume := + eLpNorm_add_le hp + _ ≤ eLpNorm ((g - h) ∘ globalAffineExpansion x0 (ε n)) p volume + + (eLpNorm (h ∘ globalAffineExpansion x0 (ε n) - h) p volume + + eLpNorm (h - g) p volume) := by + gcongr + exact eLpNorm_add_le hp + _ ≤ δ / 3 + (δ / 3 + δ / 3) := by + gcongr + · exact eLpNorm_comp_globalAffineExpansion_le hp_top (hg.sub hh) x0 (hε_nonneg n) + |>.trans hgh + · exact hN n hn + · rw [show h - g = -(g - h) by + funext x + simp only [Pi.neg_apply, Pi.sub_apply] + ring, eLpNorm_neg] + exact hgh + _ = δ := by rw [← add_assoc, ENNReal.add_thirds] + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalMollifierLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalMollifierLp.lean new file mode 100644 index 0000000000..d951e11607 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/GlobalMollifierLp.lean @@ -0,0 +1,313 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvolutionLp +public import Mathlib.MeasureTheory.Function.ContinuousMapDense + +/-! +# Global `L^p` convergence of the scaled mollifier + +This file proves the global approximate-identity statement for the convex +kernel family. It is deliberately independent of the affine inward +mollification and of bounded-domain Sobolev theory. +-/ + +@[expose] public section + +namespace Homogenization + +open Function Set Filter MeasureTheory Topology +open scoped ENNReal Convolution Pointwise + +noncomputable section + +private theorem tsupport_scaledConvexApproxKernel_subset_closedBall + {d : ℕ} {ρ : Vec d → ℝ} (hρ : IsConvexApproxKernel ρ) + {a : ℝ} (ha : 0 < a) : + tsupport (scaledConvexApproxKernel ρ a) ⊆ Metric.closedBall 0 a := by + apply closure_minimal + · intro t ht + have hρ_ne : ρ (a⁻¹ • t) ≠ 0 := by + intro hzero + apply ht + simp only [scaledConvexApproxKernel, hzero, mul_zero] + have hρ_ball : a⁻¹ • t ∈ Metric.closedBall (0 : Vec d) 1 := + hρ.support_subset_closedBall (subset_tsupport ρ hρ_ne) + rw [Metric.mem_closedBall, dist_zero_right] at hρ_ball ⊢ + calc + ‖t‖ = a * (a⁻¹ * ‖t‖) := by field_simp [ha.ne'] + _ = a * ‖a⁻¹ • t‖ := by + rw [norm_smul, norm_inv, Real.norm_eq_abs, abs_of_pos ha] + _ ≤ a * 1 := mul_le_mul_of_nonneg_left hρ_ball ha.le + _ = a := mul_one _ + · exact Metric.isClosed_closedBall + +private theorem eLpNorm_convolution_scaledConvexApproxKernel_le + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + {a : ℝ} (ha : 0 < a) (hg : AEMeasurable g volume) : + eLpNorm + (scaledConvexApproxKernel ρ a ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) + p volume ≤ eLpNorm g p volume := by + exact young_convolution_nonneg_integral_one_of_aemeasurable hp1 hp + (scaledConvexApproxKernel_nonneg hρ ha) + (integrable_scaledConvexApproxKernel hρ ha) + (integral_scaledConvexApproxKernel hρ ha) + (measurable_scaledConvexApproxKernel hρ.continuous a) hg + +private theorem tendsto_eLpNorm_sub_zero_convolution_scaledConvexApproxKernel_of_continuous + {d : ℕ} {ρ f : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp : p ≠ ⊤) + (hf_cont : Continuous f) (hf_supp : HasCompactSupport f) + {a : ℕ → ℝ} (ha : Tendsto a atTop (nhds 0)) + (ha_pos : ∀ᶠ n in atTop, 0 < a n) : + Tendsto + (fun n => eLpNorm + (fun x => + (scaledConvexApproxKernel ρ (a n) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - + f x) + p volume) + atTop (nhds 0) := by + let K : Set (Vec d) := Metric.closedBall 0 1 + tsupport f + have hK_compact : IsCompact K := + (isCompact_closedBall (0 : Vec d) 1).add hf_supp.isCompact + have hK_meas : MeasurableSet K := hK_compact.measurableSet + have hK_ne_top : volume K ≠ ⊤ := hK_compact.measure_lt_top.ne + have hpow_ne_top : volume K ^ (1 / p.toReal) ≠ ⊤ := by + exact (ENNReal.rpow_lt_top_of_nonneg (by positivity) hK_ne_top).ne + let cK : ℝ := (volume K ^ (1 / p.toReal)).toReal + have hcK_nonneg : 0 ≤ cK := ENNReal.toReal_nonneg + have hpow_eq : ENNReal.ofReal cK = volume K ^ (1 / p.toReal) := by + dsimp [cK] + exact ENNReal.ofReal_toReal hpow_ne_top + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hη_top : η = ⊤ + · exact Eventually.of_forall (fun n => by simp only [hη_top, le_top]) + let δ : ℝ := η.toReal / (cK + 1) + have hη_real : 0 < η.toReal := ENNReal.toReal_pos hη.ne' hη_top + have hδ_pos : 0 < δ := by + dsimp [δ] + positivity + obtain ⟨γ, hγ_pos, hγ⟩ := + Metric.uniformContinuous_iff.mp (hf_supp.uniformContinuous_of_continuous hf_cont) δ hδ_pos + have ha_small : ∀ᶠ n in atTop, a n < γ / 2 := + (tendsto_order.1 ha).2 _ (by linarith) + have ha_le_one : ∀ᶠ n in atTop, a n ≤ 1 := + ((tendsto_order.1 ha).2 _ zero_lt_one).mono (fun _ hn => le_of_lt hn) + filter_upwards [ha_pos, ha_small, ha_le_one] with n han_pos han_small han_one + have hkernel_support : + support (scaledConvexApproxKernel ρ (a n)) ⊆ Metric.ball 0 (2 * a n) := by + exact (subset_tsupport _).trans + ((tsupport_scaledConvexApproxKernel_subset_closedBall hρ han_pos).trans + (Metric.closedBall_subset_ball (by linarith))) + have hdist : ∀ x, + dist + ((scaledConvexApproxKernel ρ (a n) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x) + (f x) ≤ δ := by + intro x + apply MeasureTheory.dist_convolution_le (le_of_lt hδ_pos) + · exact hkernel_support + · exact scaledConvexApproxKernel_nonneg hρ han_pos + · exact integral_scaledConvexApproxKernel hρ han_pos + · exact hf_cont.aestronglyMeasurable + · intro y hy + rw [Metric.mem_ball, dist_eq_norm_sub] at hy + apply (hγ ?_).le + rw [dist_eq_norm_sub] + exact hy.trans (by linarith) + have hconv_support : + support (scaledConvexApproxKernel ρ (a n) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] f) ⊆ K := by + calc + support (scaledConvexApproxKernel ρ (a n) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] f) + ⊆ support (scaledConvexApproxKernel ρ (a n)) + support f := + support_convolution_subset (L := ContinuousLinearMap.lsmul ℝ ℝ) + _ ⊆ Metric.closedBall 0 1 + tsupport f := by + exact add_subset_add + ((subset_tsupport _).trans + ((tsupport_scaledConvexApproxKernel_subset_closedBall hρ han_pos).trans + (Metric.closedBall_subset_closedBall han_one))) + (subset_tsupport _) + have hf_support : support f ⊆ K := by + intro x hx + refine ⟨0, ?_, x, subset_tsupport f hx, by simp only [zero_add]⟩ + simp only [Metric.mem_closedBall, dist_zero_right, norm_zero] + exact zero_le_one + have hbound : + eLpNorm + (fun x => + (scaledConvexApproxKernel ρ (a n) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - + f x) + p volume ≤ ENNReal.ofReal δ * volume K ^ (1 / p.toReal) := by + exact eLpNorm_sub_le_of_dist_bdd volume hp hK_meas.nullMeasurableSet hδ_pos.le + (by + exact (MeasureTheory.AEStronglyMeasurable.convolution + (ContinuousLinearMap.lsmul ℝ ℝ) + (continuous_scaledConvexApproxKernel hρ.continuous (a n)).aestronglyMeasurable + hf_cont.aestronglyMeasurable).sub hf_cont.aestronglyMeasurable) + hdist hconv_support hf_support + have hδmul : δ * cK ≤ η.toReal := by + have hfrac_le : cK / (cK + 1) ≤ 1 := by + exact div_le_one_of_le₀ (by linarith) (by linarith) + calc + δ * cK = η.toReal * (cK / (cK + 1)) := by + dsimp [δ] + rw [div_eq_mul_inv, div_eq_mul_inv] + ring + _ ≤ η.toReal * 1 := mul_le_mul_of_nonneg_left hfrac_le hη_real.le + _ = η.toReal := mul_one _ + calc + eLpNorm + (fun x => + (scaledConvexApproxKernel ρ (a n) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - + f x) + p volume ≤ ENNReal.ofReal δ * volume K ^ (1 / p.toReal) := hbound + _ = ENNReal.ofReal (δ * cK) := by + rw [← hpow_eq, ← ENNReal.ofReal_mul] + positivity + _ ≤ η := by + rw [← ENNReal.ofReal_toReal hη_top] + exact ENNReal.ofReal_le_ofReal hδmul + +/-- Convolution by the scaled convex kernel is a global approximate identity +in every finite `L^p`, `1 ≤ p < ∞`. -/ +theorem tendsto_eLpNorm_sub_zero_convolution_scaledConvexApproxKernel + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hg : MemLp g p volume) + {r : ℝ} (hr : 0 < r) + {ε : ℕ → ℝ} (hε : Tendsto ε atTop (nhds 0)) + (hε_pos : ∀ᶠ n in atTop, 0 < ε n) : + Tendsto + (fun n => eLpNorm + (fun x => + (scaledConvexApproxKernel ρ (ε n * r) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] g) x - g x) + p volume) + atTop (nhds 0) := by + have hscale : Tendsto (fun n => ε n * r) atTop (nhds 0) := by + simpa only [zero_mul] using hε.mul_const r + have hscale_pos : ∀ᶠ n in atTop, 0 < ε n * r := + hε_pos.mono (fun _ hn => mul_pos hn hr) + apply ENNReal.tendsto_nhds_zero.2 + intro η hη + by_cases hη_top : η = ⊤ + · exact Eventually.of_forall (fun n => by simp only [hη_top, le_top]) + obtain ⟨η₁, hη₁_pos, hη₁⟩ := + MeasureTheory.exists_Lp_half (μ := (volume : Measure (Vec d))) (ε := ℝ) (p := p) hη.ne' + obtain ⟨η₂, hη₂_pos, hη₂⟩ := + MeasureTheory.exists_Lp_half (μ := (volume : Measure (Vec d))) (ε := ℝ) (p := p) hη₁_pos.ne' + let δ : ENNReal := min η₁ η₂ + have hδ_pos : 0 < δ := lt_min hη₁_pos hη₂_pos + obtain ⟨f, hf_supp, happrox, hf_cont, hf_mem⟩ := + hg.exists_hasCompactSupport_eLpNorm_sub_le hp hδ_pos.ne' + have hthird_mem : MemLp (fun x => f x - g x) p volume := hf_mem.sub hg + have hthird_norm : eLpNorm (fun x => f x - g x) p volume ≤ η₁ := by + have hneg : (fun x => f x - g x) = -(fun x => g x - f x) := by + ext x + change f x - g x = -(g x - f x) + ring + rw [hneg, eLpNorm_neg] + exact happrox.trans (min_le_left _ _) + have hmid_tendsto := + tendsto_eLpNorm_sub_zero_convolution_scaledConvexApproxKernel_of_continuous + hρ hp hf_cont hf_supp hscale hscale_pos + have hmid_eventually : ∀ᶠ n in atTop, + eLpNorm + (fun x => + (scaledConvexApproxKernel ρ (ε n * r) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - f x) + p volume ≤ η₂ := + ENNReal.tendsto_nhds_zero.1 hmid_tendsto η₂ hη₂_pos + filter_upwards [hscale_pos, hmid_eventually] with n hn_scale hmid + let k : Vec d → ℝ := scaledConvexApproxKernel ρ (ε n * r) + have hk_compact : HasCompactSupport k := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hn_scale + have hk_cont : Continuous k := + (contDiff_scaledConvexApproxKernel hρ (ε n * r)).continuous + have hg_loc : LocallyIntegrable g volume := hg.locallyIntegrable hp1 + have hf_loc : LocallyIntegrable f volume := hf_mem.locallyIntegrable hp1 + have hdiff_loc : LocallyIntegrable (fun x => g x - f x) volume := hg_loc.sub hf_loc + have hconv_g : ConvolutionExists k g (ContinuousLinearMap.lsmul ℝ ℝ) volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hg_loc + have hconv_f : ConvolutionExists k f (ContinuousLinearMap.lsmul ℝ ℝ) volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hf_loc + have hconv_diff : ConvolutionExists k (fun x => g x - f x) + (ContinuousLinearMap.lsmul ℝ ℝ) volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hdiff_loc + have hsplit : g = (fun x => g x - f x) + f := by + ext x + change g x = (g x - f x) + f x + ring + have hconv_split : + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g = + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f := by + calc + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g = + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] ((fun x => g x - f x) + f) := by + exact congrArg (fun v => k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] v) hsplit + _ = (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f := + hconv_diff.distrib_add hconv_f + have hfirst_norm : + eLpNorm (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + p volume ≤ η₂ := by + calc + eLpNorm (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + p volume + ≤ eLpNorm (fun x => g x - f x) p volume := + eLpNorm_convolution_scaledConvexApproxKernel_le hρ hp1 hp hn_scale + (hg.sub hf_mem).aemeasurable + _ ≤ η₂ := happrox.trans (min_le_right _ _) + have hfirst_meas : AEStronglyMeasurable + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) volume := by + exact + (hk_compact.continuous_convolution_left (L := ContinuousLinearMap.lsmul ℝ ℝ) + hk_cont hdiff_loc).aestronglyMeasurable + have hmiddle_meas : AEStronglyMeasurable + (fun x => (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - f x) volume := by + exact + (hk_compact.continuous_convolution_left (L := ContinuousLinearMap.lsmul ℝ ℝ) + hk_cont hf_loc).sub hf_cont |>.aestronglyMeasurable + have hfirst_middle : + eLpNorm + ((k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + + fun x => (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - f x) + p volume < η₁ := by + exact hη₂ _ _ hfirst_norm (by simpa only [k] using hmid) + have hsum : + eLpNorm + (((k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + + fun x => (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - f x) + + fun x => f x - g x) + p volume < η := by + exact hη₁ _ _ hfirst_middle.le hthird_norm + have hdecomp : + eLpNorm + (fun x => + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) x - g x) + p volume = + eLpNorm + (((k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fun x => g x - f x) + + fun x => (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - f x) + + fun x => f x - g x) + p volume := by + rw [hconv_split] + congr 1 + ext x + simp only [Pi.add_apply] + ring + simpa only [k] using hdecomp.trans_le hsum.le + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H10GradientUpgrade.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H10GradientUpgrade.lean new file mode 100644 index 0000000000..d908d3f735 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H10GradientUpgrade.lean @@ -0,0 +1,242 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.H1GradientUpgrade +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationWeakGradient +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas + +/-! +# Upgrading zero-trace `H¹` witnesses from finite-`p` gradients + +An `H¹₀` witness whose weak gradient has finite `L^p` control belongs to +`W^{1,p}_0` on every bounded open convex domain. The zero-trace approximation +is constructed internally by inwardly mollifying the global zero extension. +-/ + +@[expose] public section + +namespace Homogenization + +open _root_.Filter MeasureTheory Set Topology +open scoped ENNReal + +noncomputable section + +namespace H10Function + +private theorem tendsto_eLpNorm_restrict_of_tendsto_global + {l : Filter ℕ} + {d : ℕ} {f : ℕ → Vec d → ℝ} {p : ENNReal} {U : Set (Vec d)} + (h : Filter.Tendsto (fun n => eLpNorm (f n) p volume) l (nhds 0)) : + Filter.Tendsto (fun n => eLpNorm (f n) p (volume.restrict U)) l (nhds 0) := by + have hle : ∀ n, + eLpNorm (f n) p (volume.restrict U) ≤ eLpNorm (f n) p volume := fun n => + eLpNorm_mono_measure (f n) Measure.restrict_le_self + exact tendsto_of_tendsto_of_tendsto_of_le_of_le' tendsto_const_nhds h + (Filter.Eventually.of_forall fun _ => zero_le) (Filter.Eventually.of_forall hle) + +private noncomputable def inwardApproximation + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) + (x0 : Vec d) (r : ℝ) (n : ℕ) : Vec d → ℝ := + inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension + x0 r (unitConvexApproxScale n) + +private theorem inwardApproximation_properties + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) (n : ℕ) : + ContDiff ℝ (⊤ : ℕ∞) (u.inwardApproximation x0 r n) ∧ + HasCompactSupport (u.inwardApproximation x0 r n) ∧ + tsupport (u.inwardApproximation x0 r n) ⊆ U := by + exact u.inwardMollification_unit_properties hU hball hr + (W1pFunction.unitConvexApproxScale_pos n) + +private theorem tendsto_inwardApproximation_value + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hu : MemLpOn U p.exponent u.toH1Function.toFun) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) : + Filter.Tendsto + (fun n => eLpNorm + (fun x => u.inwardApproximation x0 r n x - u.toH1Function.toFun x) + p.exponent (volume.restrict U)) Filter.atTop (nhds 0) := by + have hu_zero : MemLp u.zeroExtension p.exponent volume := + u.memLp_zeroExtension hU.isOpen.measurableSet hu + have hglobal := tendsto_eLpNorm_inwardMollification_sub_zero + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) p.one_lt.le + p.lt_top.ne hu_zero x0 hr tendsto_unitConvexApproxScale_zero + unitConvexApproxScale_nonneg + (Filter.Eventually.of_forall W1pFunction.unitConvexApproxScale_pos) + have hrestricted := tendsto_eLpNorm_restrict_of_tendsto_global (U := U) hglobal + have heq : (fun n => eLpNorm + (inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension + x0 r (unitConvexApproxScale n) - u.zeroExtension) + p.exponent (volume.restrict U)) =ᶠ[Filter.atTop] + (fun n => eLpNorm + (fun x => u.inwardApproximation x0 r n x - u.toH1Function.toFun x) + p.exponent (volume.restrict U)) := by + filter_upwards with n + apply eLpNorm_congr_ae + filter_upwards [ae_restrict_mem hU.isOpen.measurableSet] with x hx + change inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension + x0 r (unitConvexApproxScale n) x - u.zeroExtension x = + u.inwardApproximation x0 r n x - u.toH1Function.toFun x + rw [u.zeroExtension_apply_of_mem hx] + rfl + exact hrestricted.congr' heq + +private theorem tendsto_inwardApproximation_grad + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (i : Fin d) : + Filter.Tendsto + (fun n => eLpNorm + (fun x => + (fderiv ℝ (u.inwardApproximation x0 r n) x) (basisVec i) - + u.toH1Function.grad x i) + p.exponent (volume.restrict U)) Filter.atTop (nhds 0) := by + have hgrad_zero : GradMemLpOn Set.univ p.exponent u.zeroExtensionGrad := + u.gradMemLp_zeroExtensionGrad hU.isOpen.measurableSet hgrad + have hcoord : MemLp (fun x => u.zeroExtensionGrad x i) p.exponent volume := by + have hcoord' := hgrad_zero i + change MemLp (fun x => u.zeroExtensionGrad x i) p.exponent + (volume.restrict Set.univ) at hcoord' + simpa only [Measure.restrict_univ] using hcoord' + have hglobal := tendsto_eLpNorm_one_add_mul_inwardMollification_sub_zero + (isConvexApproxKernel_unitConvexApproxKernel (d := d)) p.one_lt.le + p.lt_top.ne hcoord x0 hr tendsto_unitConvexApproxScale_zero + unitConvexApproxScale_nonneg + (Filter.Eventually.of_forall W1pFunction.unitConvexApproxScale_pos) + have hrestricted := tendsto_eLpNorm_restrict_of_tendsto_global (U := U) hglobal + have heq : (fun n => eLpNorm + (fun x => (1 + unitConvexApproxScale n) * + inwardMollification (unitConvexApproxKernel (d := d)) + (fun y => u.zeroExtensionGrad y i) x0 r (unitConvexApproxScale n) x - + u.zeroExtensionGrad x i) + p.exponent (volume.restrict U)) =ᶠ[Filter.atTop] + (fun n => eLpNorm + (fun x => + (fderiv ℝ (u.inwardApproximation x0 r n) x) (basisVec i) - + u.toH1Function.grad x i) + p.exponent (volume.restrict U)) := by + filter_upwards with n + apply eLpNorm_congr_ae + have hderiv := u.ae_eq_fderiv_inwardMollification_unit_apply_basisVec + hU.isOpen.measurableSet (x0 := x0) hr + (W1pFunction.unitConvexApproxScale_pos n) i + filter_upwards [hderiv.restrict, ae_restrict_mem hU.isOpen.measurableSet] with x hxderiv hxU + simp only [inwardApproximation] + rw [hxderiv, u.zeroExtensionGrad_apply_of_mem hxU] + rfl + exact hrestricted.congr' heq + +private noncomputable def toW10pOfGradMemLpNonempty + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) + (hU_nonempty : U.Nonempty) : W10pFunction U p.exponent := by + classical + let x0 : Vec d := Classical.choose hU_nonempty + have hx0 : x0 ∈ U := Classical.choose_spec hU_nonempty + have hδ_exists := Metric.mem_nhds_iff.1 (hU.isOpen.mem_nhds hx0) + let δ : ℝ := Classical.choose hδ_exists + have hδ_spec := Classical.choose_spec hδ_exists + have hδpos : 0 < δ := hδ_spec.1 + have hδsub : Metric.ball x0 δ ⊆ U := hδ_spec.2 + let r : ℝ := δ / 2 + have hr : 0 < r := by positivity + have hball : Metric.closedBall x0 r ⊆ U := by + intro y hy + apply hδsub + have hy' : dist y x0 ≤ r := by simpa [Metric.mem_closedBall] using hy + have hr_lt : r < δ := by dsimp only [r]; linarith + simpa [Metric.mem_ball] using lt_of_le_of_lt hy' hr_lt + let v : W1pFunction U p.exponent := + u.toH1Function.toW1pOfGradMemLp hU p hgrad + exact + { toW1pFunction := v + approx := u.inwardApproximation x0 r + approx_smooth := fun n => (u.inwardApproximation_properties hU hball hr n).1 + approx_hasCompactSupport := fun n => + (u.inwardApproximation_properties hU hball hr n).2.1 + approx_support_subset := fun n => + (u.inwardApproximation_properties hU hball hr n).2.2 + tendsto_approx := by + simpa only [v, H1Function.toW1pOfGradMemLp_toFun] using + u.tendsto_inwardApproximation_value hU p + (u.toH1Function.toW1pOfGradMemLp hU p hgrad).memLp + x0 hr + tendsto_approx_grad := by + intro i + simpa only [v, H1Function.toW1pOfGradMemLp_grad] using + u.tendsto_inwardApproximation_grad hU p hgrad x0 hr i } + +private noncomputable def toW10pOfGradMemLpEmpty + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) + (hU_empty : U = ∅) : W10pFunction U p.exponent := by + let v : W1pFunction U p.exponent := + u.toH1Function.toW1pOfGradMemLp hU p hgrad + exact + { toW1pFunction := v + approx := fun _ _ => 0 + approx_smooth := fun _ => contDiff_const + approx_hasCompactSupport := fun _ => + (HasCompactSupport.zero : HasCompactSupport (0 : Vec d → ℝ)) + approx_support_subset := by + intro n + have hz : tsupport (fun _ : Vec d => (0 : ℝ)) = ∅ := tsupport_zero + rw [hz] + exact Set.empty_subset U + tendsto_approx := by + simp only [hU_empty, Measure.restrict_empty, eLpNorm_measure_zero] + exact tendsto_const_nhds + tendsto_approx_grad := by + intro i + simp only [hU_empty, Measure.restrict_empty, eLpNorm_measure_zero] + exact tendsto_const_nhds } + +/-- Upgrade an `H¹₀` witness on a bounded open convex domain to `W^{1,p}_0` +when its weak-gradient coordinates have finite `L^p` control. Both the +function and weak-gradient representatives are preserved exactly. -/ +noncomputable def toW10pOfGradMemLp + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) : + W10pFunction U p.exponent := by + by_cases hU_nonempty : U.Nonempty + · exact u.toW10pOfGradMemLpNonempty hU p hgrad hU_nonempty + · exact u.toW10pOfGradMemLpEmpty hU p hgrad + (Set.not_nonempty_iff_eq_empty.mp hU_nonempty) + +@[simp] theorem toW10pOfGradMemLp_toFun + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) : + (u.toW10pOfGradMemLp hU p hgrad).toW1pFunction.toFun = + u.toH1Function.toFun := by + rw [toW10pOfGradMemLp] + split <;> rfl + +@[simp] theorem toW10pOfGradMemLp_grad + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H10Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.toH1Function.grad) : + (u.toW10pOfGradMemLp hU p hgrad).toW1pFunction.grad = + u.toH1Function.grad := by + rw [toW10pOfGradMemLp] + split <;> rfl + +end H10Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H1GradientUpgrade.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H1GradientUpgrade.lean new file mode 100644 index 0000000000..e60ff26e34 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/H1GradientUpgrade.lean @@ -0,0 +1,475 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareMeanZero +public import LeanPool.CoarseGraining.Homogenization.Sobolev.Foundations.PoincareW1p +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.WeakGradientClosure +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Upgrading `H¹` witnesses from higher-integrable gradients + +On a bounded open convex domain, an `H1Function` whose weak-gradient +coordinates belong to a finite `L^p` space is also a `W^{1,p}` witness. The +value membership is obtained from mixed-exponent convex smoothing and the +finite-`p` Poincare estimate; it is not an additional hypothesis. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace H1Function + +private theorem ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec_mixed + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + {i : Fin d} {u gi ρ : Vec d → ℝ} {p : FiniteLpExponent} + (hρ : IsConvexApproxKernel ρ) + (huMem : MemL2On U u) (hgiMem : MemLpOn U p.exponent gi) + (huWeak : HasWeakPartialDerivOn U i u gi) + {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (hε0 : 0 < ε) (hε1 : ε < 1) : + (fun x => (fderiv ℝ (convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) =ᵐ[volume.restrict U] + fun x => (1 - ε) * convexApproxSmoothRepresentative U ρ gi x0 r ε x := by + have huLoc : LocallyIntegrableOn u U volume := + locallyIntegrableOn_of_locallyIntegrable_restrict + (huMem.locallyIntegrable (by norm_num : (1 : ℝ≥0∞) ≤ 2)) + have hgiLoc : LocallyIntegrableOn gi U volume := + locallyIntegrableOn_of_locallyIntegrable_restrict + (hgiMem.locallyIntegrable p.one_lt.le) + have hsmooth : + ContDiff ℝ (⊤ : ℕ∞) (convexApproxSmoothRepresentative U ρ u x0 r ε) := + contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet hρ + (by norm_num : (1 : ℝ≥0∞) ≤ 2) huMem hr hε0 + have hgiSmooth : + ContDiff ℝ (⊤ : ℕ∞) (convexApproxSmoothRepresentative U ρ gi x0 r ε) := + contDiff_convexApproxSmoothRepresentative hU.isOpen.measurableSet hρ p.one_lt.le + hgiMem hr hε0 + have hclassWeak : + HasWeakPartialDerivOn U i + (convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x => (fderiv ℝ (convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) := + HasWeakPartialDerivOn.of_contDiff (U := U) (i := i) + (hsmooth.of_le (by simp)) + have hroughWeak : + HasWeakPartialDerivOn U i + (convexApproxSmoothRepresentative U ρ u x0 r ε) + (fun x => (1 - ε) * convexApproxSmoothRepresentative U ρ gi x0 r ε x) := + HasWeakPartialDerivOn.convexApproxSmoothRepresentative (i := i) hU huLoc hgiLoc huWeak + hρ hball hr hε0 hε1 + have hclassLoc : LocallyIntegrableOn + (fun x => (fderiv ℝ (convexApproxSmoothRepresentative U ρ u x0 r ε) x) + (basisVec i)) U volume := + ((hsmooth.continuous_fderiv (by simp)).clm_apply continuous_const).continuousOn + |>.locallyIntegrableOn hU.isOpen.measurableSet + have hroughLoc : LocallyIntegrableOn + (fun x => (1 - ε) * convexApproxSmoothRepresentative U ρ gi x0 r ε x) U volume := + (continuous_const.mul hgiSmooth.continuous).continuousOn + |>.locallyIntegrableOn hU.isOpen.measurableSet + exact HasWeakPartialDerivOn.ae_eq hU.isOpen hclassLoc hroughLoc hclassWeak hroughWeak + +private theorem tendsto_eLpNorm_convexApproxSmoothH1_grad_sub + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) + (i : Fin d) : + Tendsto + (fun n => eLpNorm + (fun x => (convexApproxSmoothH1 (U := U) hU u x0 hr n).grad x i - u.grad x i) + p.exponent (volume.restrict U)) + atTop (nhds 0) := by + let ρ : Vec d → ℝ := unitConvexApproxKernel (d := d) + have hρ : IsConvexApproxKernel ρ := by + simpa [ρ] using isConvexApproxKernel_unitConvexApproxKernel (d := d) + have hε_lt_one : ∀ᶠ n : ℕ in atTop, unitConvexApproxScale n < 1 := + ((tendsto_order.1 tendsto_unitConvexApproxScale_zero).2 1 zero_lt_one).mono + (fun _ h => h) + have hraw : Tendsto + (fun n : ℕ => eLpNorm + (fun x => (1 - unitConvexApproxScale n) * + convexApproxSmoothing ρ (fun y => u.grad y i) x0 r (unitConvexApproxScale n) x - + u.grad x i) + p.exponent (volume.restrict U)) + atTop (nhds 0) := by + simpa [ρ] using + (tendsto_eLpNorm_sub_zero_one_sub_mul_convexApproxSmoothing_of_memLpOn + (U := U) hU hρ p.one_lt.le p.lt_top.ne (hgrad i) hball hr + tendsto_unitConvexApproxScale_zero + (Eventually.of_forall W1pFunction.unitConvexApproxScale_pos) hε_lt_one) + refine hraw.congr' ?_ + filter_upwards [hε_lt_one] with n hεn + apply eLpNorm_congr_ae + have hbridge := + ae_eq_fderiv_convexApproxSmoothRepresentative_apply_basisVec_mixed + (hU := hU) (ρ := ρ) (u := u.toFun) (gi := fun x => u.grad x i) (p := p) hρ + u.memL2 (hgrad i) (u.hasWeakPartialDerivOn i) hball hr + (W1pFunction.unitConvexApproxScale_pos n) hεn + have hψ := convexApproxSmoothH1_grad (U := U) hU u x0 hr n + filter_upwards [hbridge, ae_restrict_mem hU.isOpen.measurableSet] with x hx hxU + rw [show (convexApproxSmoothH1 (U := U) hU u x0 hr n).grad x i = + (fderiv ℝ (convexApproxSmoothRepresentative U ρ u.toFun x0 r + (unitConvexApproxScale n)) x) (basisVec i) by + simpa [ρ] using congrFun (congrFun hψ x) i] + rw [hx] + rw [convexApproxSmoothRepresentative_eq_convexApproxSmoothing_of_mem + (u := fun x => u.grad x i) hU hρ hxU hball hr + (W1pFunction.unitConvexApproxScale_pos n) hεn] + +private theorem finiteLpExponent_exponent_eq_ofReal_toReal (p : FiniteLpExponent) : + p.exponent = ENNReal.ofReal p.exponent.toReal := by + symm + exact ENNReal.ofReal_toReal p.lt_top.ne + +private theorem finiteLpExponent_one_lt_toReal (p : FiniteLpExponent) : + 1 < p.exponent.toReal := by + have h := (ENNReal.toReal_lt_toReal (by norm_num : (1 : ℝ≥0∞) ≠ ∞) p.lt_top.ne).mpr + p.one_lt + simpa using h + +private theorem subAverageLpSeminorm_cast_exponent + {d : ℕ} {U : Set (Vec d)} {p q : ENNReal} (hpq : p = q) + (v : W1pFunction U p) : + (cast (congrArg (W1pFunction U) hpq) v).subAverageLpSeminorm = + v.subAverageLpSeminorm := by + subst q + rfl + +private theorem gradientCoordLpSeminormSum_cast_exponent + {d : ℕ} {U : Set (Vec d)} {p q : ENNReal} (hpq : p = q) + (v : W1pFunction U p) : + (cast (congrArg (W1pFunction U) hpq) v).gradientCoordLpSeminormSum = + v.gradientCoordLpSeminormSum := by + subst q + rfl + +private theorem unitConvexApproxScale_pos' (n : ℕ) : + 0 < unitConvexApproxScale n := + W1pFunction.unitConvexApproxScale_pos n + +private noncomputable def convexApproxSmoothH1W1p + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + W1pFunction U p.exponent := by + exact W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain (p := p.exponent) hU + ((contDiff_convexApproxSmoothRepresentative + (U := U) (ρ := unitConvexApproxKernel (d := d)) (u := u.toFun) + (p := (2 : ℝ≥0∞)) (x0 := x0) (r := r) (ε := unitConvexApproxScale n) + hU.isOpen.measurableSet (isConvexApproxKernel_unitConvexApproxKernel (d := d)) + (by norm_num : (1 : ℝ≥0∞) ≤ 2) u.memL2 hr (unitConvexApproxScale_pos' n)).of_le + (by simp)) + +private theorem convexApproxSmoothH1W1p_toFun + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothH1W1p hU u p x0 hr n).toFun = + (convexApproxSmoothH1 hU u x0 hr n).toFun := by + funext x + simp [convexApproxSmoothH1W1p, convexApproxSmoothH1, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem convexApproxSmoothH1W1p_grad + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (x0 : Vec d) {r : ℝ} (hr : 0 < r) (n : ℕ) : + (convexApproxSmoothH1W1p hU u p x0 hr n).grad = + (convexApproxSmoothH1 hU u x0 hr n).grad := by + funext x i + simp [convexApproxSmoothH1W1p, convexApproxSmoothH1, + H1Function.ofContDiffOnIsOpenBoundedConvexDomain, + H1Function.ofContDiffOnIsSobolevRegularDomain, + W1pFunction.ofContDiffOnIsOpenBoundedConvexDomain, + W1pFunction.ofContDiffOnIsSobolevRegularDomain] + +private theorem eventually_gradientCoordLpSeminormSum_convexApproxSmoothH1W1p_le + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + ∃ B : ℝ, 0 ≤ B ∧ ∀ᶠ n : ℕ in atTop, + (convexApproxSmoothH1W1p hU u p x0 hr n).gradientCoordLpSeminormSum ≤ B := by + let B : ℝ := ∑ i : Fin d, ((eLpNorm (fun x => u.grad x i) p.exponent + (volume.restrict U)).toReal + 1) + have hB_nonneg : 0 ≤ B := by + dsimp [B] + positivity + refine ⟨B, hB_nonneg, ?_⟩ + have hcoord : ∀ i : Fin d, ∀ᶠ n : ℕ in atTop, + (convexApproxSmoothH1W1p hU u p x0 hr n).gradCoordLpSeminorm i ≤ + (eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict U)).toReal + 1 := by + intro i + have htend := tendsto_eLpNorm_convexApproxSmoothH1_grad_sub hU u p hgrad hball hr i + have hsmall : ∀ᶠ n : ℕ in atTop, + eLpNorm + (fun x => (convexApproxSmoothH1 hU u x0 hr n).grad x i - u.grad x i) + p.exponent (volume.restrict U) ≤ 1 := + ENNReal.tendsto_nhds_zero.1 htend 1 zero_lt_one + filter_upwards [hsmall] with n hn + let v := convexApproxSmoothH1W1p hU u p x0 hr n + have hvgrad : v.grad = (convexApproxSmoothH1 hU u x0 hr n).grad := + convexApproxSmoothH1W1p_grad hU u p x0 hr n + have htri : eLpNorm (fun x => v.grad x i) p.exponent (volume.restrict U) ≤ + eLpNorm (fun x => v.grad x i - u.grad x i) p.exponent (volume.restrict U) + + eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict U) := by + have hsub : MemLp (fun x => v.grad x i - u.grad x i) p.exponent + (volume.restrict U) := (v.gradMemLp i).sub (hgrad i) + calc + eLpNorm (fun x => v.grad x i) p.exponent (volume.restrict U) = + eLpNorm ((fun x => v.grad x i - u.grad x i) + fun x => u.grad x i) + p.exponent (volume.restrict U) := by + apply eLpNorm_congr_ae + filter_upwards with x + simp only [Pi.add_apply] + ring + _ ≤ _ := eLpNorm_add_le p.one_lt.le + have hn' : eLpNorm (fun x => v.grad x i - u.grad x i) p.exponent + (volume.restrict U) ≤ 1 := by + simpa [v, hvgrad] using hn + have hsum_top : + eLpNorm (fun x => v.grad x i - u.grad x i) p.exponent (volume.restrict U) + + eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict U) ≠ ∞ := + ENNReal.add_ne_top.2 ⟨((v.gradMemLp i).sub (hgrad i)).eLpNorm_ne_top, + (hgrad i).eLpNorm_ne_top⟩ + change (eLpNorm (fun x => v.grad x i) p.exponent (volume.restrict U)).toReal ≤ _ + calc + (eLpNorm (fun x => v.grad x i) p.exponent (volume.restrict U)).toReal ≤ + (eLpNorm (fun x => v.grad x i - u.grad x i) p.exponent (volume.restrict U) + + eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict U)).toReal := + ENNReal.toReal_mono hsum_top htri + _ = (eLpNorm (fun x => v.grad x i - u.grad x i) p.exponent + (volume.restrict U)).toReal + + (eLpNorm (fun x => u.grad x i) p.exponent (volume.restrict U)).toReal := by + exact ENNReal.toReal_add ((v.gradMemLp i).sub (hgrad i)).eLpNorm_ne_top + (hgrad i).eLpNorm_ne_top + _ ≤ 1 + (eLpNorm (fun x => u.grad x i) p.exponent + (volume.restrict U)).toReal := by + gcongr + exact ENNReal.toReal_mono ENNReal.one_ne_top hn' + _ = _ := by ring + filter_upwards [(Filter.eventually_all_finset Finset.univ).2 + (fun i _ => hcoord i)] with n hn + change ∑ i : Fin d, + (convexApproxSmoothH1W1p hU u p x0 hr n).gradCoordLpSeminorm i ≤ B + dsimp [B] + exact Finset.sum_le_sum (s := Finset.univ) fun i _ => hn i (by simp) + +private theorem eventually_abs_integralAverage_convexApproxSmoothH1_le + {d : ℕ} {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) {x0 : Vec d} {r : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + ∃ A : ℝ, 0 ≤ A ∧ ∀ᶠ n : ℕ in atTop, + |integralAverage U (convexApproxSmoothH1 hU u x0 hr n)| ≤ A := by + let A : ℝ := |integralAverage U u| + 1 + let : IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + have hA : 0 ≤ A := by + dsimp [A] + positivity + refine ⟨A, hA, ?_⟩ + have hval : Tendsto + (fun n => (convexApproxSmoothH1 hU u x0 hr n).toScalarL2) + atTop (nhds u.toScalarL2) := + tendsto_convexApproxSmoothH1_toScalarL2 hU u hball hr + have havg : Tendsto + (fun n => integralAverage U (convexApproxSmoothH1 hU u x0 hr n)) + atTop (nhds (integralAverage U u)) := + H1Function.tendsto_integralAverage_of_tendsto_toScalarL2 hval + have hnorm := havg.norm + have hbound : ∀ᶠ n : ℕ in atTop, + ‖integralAverage U (convexApproxSmoothH1 hU u x0 hr n)‖ ≤ + ‖integralAverage U u‖ + 1 := + ((tendsto_order.1 hnorm).2 (‖integralAverage U u‖ + 1) (by linarith)).mono + (fun _ h => h.le) + simpa [A, Real.norm_eq_abs] using hbound + +private theorem eventually_valueLpSeminorm_convexApproxSmoothH1W1p_le + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) + {x0 : Vec d} {r : ℝ} (hball : Metric.closedBall x0 r ⊆ U) (hr : 0 < r) : + ∃ B : ℝ, 0 ≤ B ∧ ∀ᶠ n : ℕ in atTop, + (convexApproxSmoothH1W1p hU u p x0 hr n).valueLpSeminorm ≤ B := by + let : IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + obtain ⟨C, hC, hPoincare⟩ := + W1pFunction.exists_subAverage_poincare_constant_of_isOpenBoundedConvexDomain + (U := U) hU (finiteLpExponent_one_lt_toReal p) + obtain ⟨G, hG, hgradBound⟩ := + eventually_gradientCoordLpSeminormSum_convexApproxSmoothH1W1p_le + hU u p hgrad hball hr + obtain ⟨A, hA, havgBound⟩ := + eventually_abs_integralAverage_convexApproxSmoothH1_le hU u hball hr + let μ : Measure (Vec d) := volume.restrict U + let M : ℝ := (μ Set.univ ^ (1 / p.exponent.toReal)).toReal + have hM : 0 ≤ M := ENNReal.toReal_nonneg + let B : ℝ := C * G + A * M + have hB : 0 ≤ B := by + dsimp [B] + positivity + refine ⟨B, hB, ?_⟩ + filter_upwards [hgradBound, havgBound] with n hnGrad hnAvg + let v := convexApproxSmoothH1W1p hU u p x0 hr n + have hsub : v.subAverageLpSeminorm ≤ C * v.gradientCoordLpSeminormSum := by + let hpq : p.exponent = ENNReal.ofReal p.exponent.toReal := + finiteLpExponent_exponent_eq_ofReal_toReal p + let vq : W1pFunction U (ENNReal.ofReal p.exponent.toReal) := + cast (congrArg (W1pFunction U) hpq) v + have hpc := hPoincare vq + rw [subAverageLpSeminorm_cast_exponent hpq v, + gradientCoordLpSeminormSum_cast_exponent hpq v] at hpc + exact hpc + have hconst : MemLp (fun _ : Vec d => integralAverage U v.toFun) p.exponent μ := + memLp_const (integralAverage U v.toFun) + have hsubmem : MemLp (fun x => v.toFun x - integralAverage U v.toFun) p.exponent μ := + v.memLp.sub hconst + have htri : eLpNorm v.toFun p.exponent μ ≤ + eLpNorm (fun x => v.toFun x - integralAverage U v.toFun) p.exponent μ + + eLpNorm (fun _ : Vec d => integralAverage U v.toFun) p.exponent μ := by + calc + eLpNorm v.toFun p.exponent μ = + eLpNorm ((fun x => v.toFun x - integralAverage U v.toFun) + + fun _ : Vec d => integralAverage U v.toFun) p.exponent μ := by + apply eLpNorm_congr_ae + filter_upwards with x + simp only [Pi.add_apply] + ring + _ ≤ _ := eLpNorm_add_le p.one_lt.le + have hsum_top : + eLpNorm (fun x => v.toFun x - integralAverage U v.toFun) p.exponent μ + + eLpNorm (fun _ : Vec d => integralAverage U v.toFun) p.exponent μ ≠ ∞ := + ENNReal.add_ne_top.2 ⟨hsubmem.eLpNorm_ne_top, hconst.eLpNorm_ne_top⟩ + have hfactor_top : μ Set.univ ^ (1 / p.exponent.toReal) ≠ ∞ := by + refine (ENNReal.rpow_lt_top_of_nonneg (by positivity) ?_).ne + exact (measure_lt_top μ Set.univ).ne + have hvalue : v.valueLpSeminorm ≤ + v.subAverageLpSeminorm + |integralAverage U v.toFun| * M := by + change (eLpNorm v.toFun p.exponent μ).toReal ≤ _ + calc + (eLpNorm v.toFun p.exponent μ).toReal ≤ + (eLpNorm (fun x => v.toFun x - integralAverage U v.toFun) p.exponent μ + + eLpNorm (fun _ : Vec d => integralAverage U v.toFun) p.exponent μ).toReal := + ENNReal.toReal_mono hsum_top htri + _ = (eLpNorm (fun x => v.toFun x - integralAverage U v.toFun) p.exponent μ).toReal + + (eLpNorm (fun _ : Vec d => integralAverage U v.toFun) p.exponent μ).toReal := + ENNReal.toReal_add hsubmem.eLpNorm_ne_top hconst.eLpNorm_ne_top + _ = v.subAverageLpSeminorm + |integralAverage U v.toFun| * M := by + congr 1 + rw [eLpNorm_const' (integralAverage U v.toFun) + (ne_of_gt (zero_lt_one.trans p.one_lt)) p.lt_top.ne, ENNReal.toReal_mul] + simp [Real.enorm_eq_ofReal_abs, M] + have hsubbound : v.subAverageLpSeminorm ≤ C * G := + hsub.trans (mul_le_mul_of_nonneg_left (by simpa [v] using hnGrad) hC) + have havgbound : |integralAverage U v.toFun| ≤ A := by + simpa [v, convexApproxSmoothH1W1p_toFun] using hnAvg + calc + v.valueLpSeminorm ≤ v.subAverageLpSeminorm + |integralAverage U v.toFun| * M := hvalue + _ ≤ C * G + A * M := + add_le_add hsubbound (mul_le_mul_of_nonneg_right havgbound hM) + _ = B := rfl + +private theorem memLp_of_gradMemLp_on_isOpenBoundedConvexDomain + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) : + MemLpOn U p.exponent u.toFun := by + let : IsFiniteMeasure (volumeMeasureOn U) := by + simpa [volumeMeasureOn] using hU.isFiniteMeasure_restrict_volume + by_cases hnonempty : U.Nonempty + · rcases hnonempty with ⟨x0, hx0⟩ + rcases Metric.mem_nhds_iff.1 (hU.isOpen.mem_nhds hx0) with ⟨δ, hδpos, hδsub⟩ + let r : ℝ := δ / 2 + have hr : 0 < r := by positivity + have hball : Metric.closedBall x0 r ⊆ U := by + intro y hy + apply hδsub + have hy' : dist y x0 ≤ r := by simpa [Metric.mem_closedBall] using hy + have hlt : dist y x0 < δ := by + have : r < δ := by dsimp [r]; linarith + exact lt_of_le_of_lt hy' this + simpa [Metric.mem_ball] using hlt + obtain ⟨B, hB, hbound⟩ := + eventually_valueLpSeminorm_convexApproxSmoothH1W1p_le hU u p hgrad hball hr + let ψ : ℕ → W1pFunction U p.exponent := + fun n => convexApproxSmoothH1W1p hU u p x0 hr n + have hbound' : ∀ᶠ n : ℕ in atTop, + eLpNorm (ψ n).toFun p.exponent (volume.restrict U) ≤ ENNReal.ofReal B := by + filter_upwards [hbound] with n hn + apply (ENNReal.toReal_le_toReal (ψ n).memLp.eLpNorm_ne_top ENNReal.ofReal_ne_top).mp + simpa [ψ, W1pFunction.valueLpSeminorm, volumeMeasureOn, ENNReal.toReal_ofReal hB] using hn + have hLp2 : Tendsto (fun n => (convexApproxSmoothH1 hU u x0 hr n).toScalarL2) + atTop (nhds u.toScalarL2) := + tendsto_convexApproxSmoothH1_toScalarL2 hU u hball hr + let : Fact (1 ≤ (2 : ENNReal)) := ⟨by norm_num⟩ + have hmeasureLp : TendstoInMeasure (volume.restrict U) + (fun n => ((convexApproxSmoothH1 hU u x0 hr n).toScalarL2 : Vec d → ℝ)) atTop + (u.toScalarL2 : Vec d → ℝ) := + tendstoInMeasure_of_tendsto_Lp hLp2 + have hmeasure : TendstoInMeasure (volume.restrict U) + (fun n => (convexApproxSmoothH1 hU u x0 hr n).toFun) atTop u.toFun := by + exact TendstoInMeasure.congr + (fun n => (convexApproxSmoothH1 hU u x0 hr n).coeFn_toScalarL2) + u.coeFn_toScalarL2 hmeasureLp + have hmeasureψ : TendstoInMeasure (volume.restrict U) + (fun n => (ψ n).toFun) atTop u.toFun := by + apply TendstoInMeasure.congr_left (g := u.toFun) + (fun n => ?_) hmeasure + filter_upwards with x + simp [ψ, convexApproxSmoothH1W1p_toFun] + have hnorm := eLpNorm_le_of_tendstoInMeasure (p := p.exponent) hbound' hmeasureψ + (fun n => (ψ n).memLp.aestronglyMeasurable) + exact lt_of_le_of_lt hnorm ENNReal.ofReal_lt_top + · have hempty : U = ∅ := Set.not_nonempty_iff_eq_empty.mp hnonempty + subst U + simp [MemLpOn] + +/-- Upgrade an `H¹` witness on a bounded open convex domain to `W^{1,p}` when +its weak-gradient coordinates have finite `L^p` control. The value `L^p` +membership is derived from convex smoothing and Poincaré, and the function and +weak-gradient representatives are preserved exactly. -/ +noncomputable def toW1pOfGradMemLp + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) : W1pFunction U p.exponent := + { toFun := u.toFun + grad := u.grad + memLp := memLp_of_gradMemLp_on_isOpenBoundedConvexDomain hU u p hgrad + gradMemLp := hgrad + hasWeakGradient := u.hasWeakGradient } + +@[simp] theorem toW1pOfGradMemLp_toFun + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) : + (u.toW1pOfGradMemLp hU p hgrad).toFun = u.toFun := + rfl + +@[simp] theorem toW1pOfGradMemLp_grad + {d : ℕ} [NeZero d] {U : Set (Vec d)} (hU : IsOpenBoundedConvexDomain U) + (u : H1Function U) (p : FiniteLpExponent) + (hgrad : GradMemLpOn U p.exponent u.grad) : + (u.toW1pOfGradMemLp hU p hgrad).grad = u.grad := + rfl + +end H1Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationGeometry.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationGeometry.lean new file mode 100644 index 0000000000..6eff9a7b1c --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationGeometry.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvexApproxSmoothing.Kernel +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ZeroExtensionGraph +public import Mathlib.Analysis.Convex.Topology + +/-! +# Inward mollification on bounded convex domains + +This file records the geometric version of global mollification used for +zero-boundary Sobolev approximation. The convolution is evaluated after an +outward affine dilation. Consequently, its support is a compact set strictly +inside the original bounded open convex domain. +-/ + +@[expose] public section + +namespace Homogenization + +open Function Set MeasureTheory Topology +open scoped Pointwise Convolution + +noncomputable section + +/-- Mollify a global field at scale `ε * r` and pull the result back by the +outward affine map based at `x0`. -/ +noncomputable def inwardMollification {d : ℕ} (ρ g : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) : Vec d → ℝ := + fun x => + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, + volume] g) ((1 + ε) • x - ε • x0) + +@[simp] theorem inwardMollification_apply {d : ℕ} (ρ g : Vec d → ℝ) + (x0 : Vec d) (r ε : ℝ) (x : Vec d) : + inwardMollification ρ g x0 r ε x = + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, + volume] g) ((1 + ε) • x - ε • x0) := + rfl + +private def inwardMollificationSupportSet {d : ℕ} (U : Set (Vec d)) + (x0 : Vec d) (r ε : ℝ) : Set (Vec d) := + (fun y : Vec d => (1 + ε)⁻¹ • y + (ε * (1 + ε)⁻¹) • x0) '' + (Metric.closedBall (0 : Vec d) (ε * r) + closure U) + +private theorem inwardMollification_affine_eq {d : ℕ} (x x0 : Vec d) {ε : ℝ} + (hε : 0 < ε) : + x = (1 + ε)⁻¹ • ((1 + ε) • x - ε • x0) + + (ε * (1 + ε)⁻¹) • x0 := by + ext i + simp only [Pi.add_apply, Pi.sub_apply, smul_eq_mul, Pi.smul_apply] + field_simp [hε.ne'] + ring + +private theorem inwardMollification_supportSet_compact {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (x0 : Vec d) (r ε : ℝ) : + IsCompact (inwardMollificationSupportSet U x0 r ε) := by + apply IsCompact.image + · exact (isCompact_closedBall (0 : Vec d) (ε * r)).add + hU.isBoundedDomain.isBounded.isCompact_closure + · exact + ((continuous_const : Continuous fun _ : Vec d => (1 + ε)⁻¹).smul continuous_id).add + (continuous_const : Continuous fun _ : Vec d => (ε * (1 + ε)⁻¹) • x0) + +private theorem scaledBall_translate_mem {d : ℕ} {x0 t : Vec d} {r ε : ℝ} + (hε : 0 < ε) (ht : t ∈ Metric.closedBall (0 : Vec d) (ε * r)) : + x0 + ε⁻¹ • t ∈ Metric.closedBall x0 r := by + rw [Metric.mem_closedBall, dist_eq_norm] + have ht_norm : ‖t‖ ≤ ε * r := by + rw [Metric.mem_closedBall, dist_zero_right] at ht + exact ht + have hε_inv_nonneg : 0 ≤ ε⁻¹ := inv_nonneg.mpr hε.le + calc + ‖x0 + ε⁻¹ • t - x0‖ = ‖ε⁻¹ • t‖ := by abel_nf + _ = |ε⁻¹| * ‖t‖ := norm_smul _ _ + _ = ε⁻¹ * ‖t‖ := by rw [abs_of_nonneg hε_inv_nonneg] + _ ≤ ε⁻¹ * (ε * r) := mul_le_mul_of_nonneg_left ht_norm hε_inv_nonneg + _ = r := by field_simp [hε.ne'] + +private theorem inwardMollification_supportSet_subset {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {x0 : Vec d} {r ε : ℝ} + (hball : Metric.closedBall x0 r ⊆ U) (hε : 0 < ε) : + inwardMollificationSupportSet U x0 r ε ⊆ U := by + rintro x ⟨y, hy, rfl⟩ + rcases hy with ⟨t, ht, z, hz, rfl⟩ + have hw : x0 + ε⁻¹ • t ∈ U := + hball (scaledBall_translate_mem hε ht) + have hz' : z ∈ closure U := hz + have hinterior : z ∈ closure U := hz' + have hw_interior : x0 + ε⁻¹ • t ∈ interior U := by + rwa [hU.isOpen.interior_eq] + have ha_nonneg : 0 ≤ (1 + ε)⁻¹ := by positivity + have hb_pos : 0 < ε * (1 + ε)⁻¹ := by positivity + have hab : (1 + ε)⁻¹ + ε * (1 + ε)⁻¹ = 1 := by + field_simp [hε.ne'] + have hcombo := hU.convex.combo_closure_interior_mem_interior hinterior hw_interior + ha_nonneg hb_pos hab + have hrewrite : + (1 + ε)⁻¹ • (t + z) + (ε * (1 + ε)⁻¹) • x0 = + (1 + ε)⁻¹ • z + (ε * (1 + ε)⁻¹) • (x0 + ε⁻¹ • t) := by + ext i + simp only [Pi.add_apply, smul_eq_mul, Pi.smul_apply] + field_simp [hε.ne'] + ring + change (1 + ε)⁻¹ • (t + z) + (ε * (1 + ε)⁻¹) • x0 ∈ U + rw [hrewrite] + rwa [hU.isOpen.interior_eq] at hcombo + +/-- A compactly supported smooth kernel convolved with a locally integrable +field is smooth after the inward affine pullback. -/ +theorem contDiff_inwardMollification {d : ℕ} {ρ g : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hg : LocallyIntegrable g volume) + {x0 : Vec d} {r ε : ℝ} (hr : 0 < r) (hε : 0 < ε) : + ContDiff ℝ (⊤ : ℕ∞) (inwardMollification ρ g x0 r ε) := by + have hscale : 0 < ε * r := mul_pos hε hr + have hconv : + ContDiff ℝ (⊤ : ℕ∞) + (scaledConvexApproxKernel ρ (ε * r) ⋆[ContinuousLinearMap.lsmul ℝ ℝ, + volume] g) := + HasCompactSupport.contDiff_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) (μ := volume) + (hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hscale) + (contDiff_scaledConvexApproxKernel hρ (ε * r)) hg + have haff : ContDiff ℝ (⊤ : ℕ∞) + (fun x : Vec d => (1 + ε) • x - ε • x0) := by + simpa using (contDiff_const.smul contDiff_id).sub contDiff_const + simpa [inwardMollification] using! hconv.comp haff + +/-- The topological support of inward mollification lies strictly in the +domain, provided the input field is supported in the domain closure. -/ +theorem tsupport_inwardMollification_subset {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {ρ g : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hg_support : tsupport g ⊆ closure U) + {x0 : Vec d} {r ε : ℝ} (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 < r) (hε : 0 < ε) : + tsupport (inwardMollification ρ g x0 r ε) ⊆ U := by + let k : Vec d → ℝ := scaledConvexApproxKernel ρ (ε * r) + let h : Vec d → ℝ := k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g + let K := inwardMollificationSupportSet U x0 r ε + have hscale : 0 < ε * r := mul_pos hε hr + have hk_support : support k ⊆ Metric.closedBall (0 : Vec d) (ε * r) := by + intro t ht + have hρ_ne : ρ ((ε * r)⁻¹ • t) ≠ 0 := by + intro hzero + apply ht + simp only [k, scaledConvexApproxKernel, hzero, mul_zero] + have hρ_ball : (ε * r)⁻¹ • t ∈ Metric.closedBall (0 : Vec d) 1 := + hρ.support_subset_closedBall (subset_tsupport ρ hρ_ne) + rw [Metric.mem_closedBall, dist_zero_right] at hρ_ball ⊢ + calc + ‖t‖ = (ε * r) * ((ε * r)⁻¹ * ‖t‖) := by + field_simp [hscale.ne'] + _ = (ε * r) * ‖(ε * r)⁻¹ • t‖ := by + rw [norm_smul, norm_inv, Real.norm_eq_abs, abs_of_pos hscale] + _ ≤ (ε * r) * 1 := mul_le_mul_of_nonneg_left hρ_ball hscale.le + _ = ε * r := mul_one _ + have hg_raw_support : support g ⊆ closure U := + (subset_tsupport g).trans hg_support + have hh_support : support h ⊆ Metric.closedBall (0 : Vec d) (ε * r) + closure U := by + exact (support_convolution_subset (L := ContinuousLinearMap.lsmul ℝ ℝ)).trans + (add_subset_add hk_support hg_raw_support) + have hK_compact : IsCompact K := inwardMollification_supportSet_compact hU x0 r ε + have hraw : support (inwardMollification ρ g x0 r ε) ⊆ K := by + intro x hx + refine ⟨(1 + ε) • x - ε • x0, ?_, ?_⟩ + · apply hh_support + change h ((1 + ε) • x - ε • x0) ≠ 0 + simpa only [inwardMollification, h, k] using! hx + · exact (inwardMollification_affine_eq x x0 hε).symm + have htsupportK : tsupport (inwardMollification ρ g x0 r ε) ⊆ K := + closure_minimal hraw hK_compact.isClosed + exact htsupportK.trans (inwardMollification_supportSet_subset hU hball hε) + +/-- Inward mollification has compact support under the bounded-domain support +condition. -/ +theorem hasCompactSupport_inwardMollification {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) {ρ g : Vec d → ℝ} + (hρ : IsConvexApproxKernel ρ) (hg_support : tsupport g ⊆ closure U) + {x0 : Vec d} {r ε : ℝ} (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 < r) (hε : 0 < ε) : + HasCompactSupport (inwardMollification ρ g x0 r ε) := by + exact hU.isBoundedDomain.isBounded.isCompact_closure.of_isClosed_subset + (isClosed_tsupport _) + ((tsupport_inwardMollification_subset hU hρ hg_support hball hr hε).trans subset_closure) + +namespace H10Function + +/-- The literal zero extension of an `H¹₀` function is supported in the +closure of its domain. -/ +theorem tsupport_zeroExtension_subset_closure {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) : + tsupport u.zeroExtension ⊆ closure U := by + apply closure_mono + intro x hx + by_contra hxU + exact hx (u.zeroExtension_apply_of_not_mem hxU) + +/-- The inward mollification of the global zero extension of an `H¹₀` +function is globally smooth, compactly supported, and has topological support +strictly inside the original bounded open convex domain. -/ +theorem inwardMollification_unit_properties {d : ℕ} {U : Set (Vec d)} + (hU : IsOpenBoundedConvexDomain U) (u : H10Function U) + {x0 : Vec d} {r ε : ℝ} (hball : Metric.closedBall x0 r ⊆ U) + (hr : 0 < r) (hε : 0 < ε) : + ContDiff ℝ (⊤ : ℕ∞) + (inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension x0 r ε) ∧ + HasCompactSupport + (inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension x0 r ε) ∧ + tsupport + (inwardMollification (unitConvexApproxKernel (d := d)) u.zeroExtension x0 r ε) ⊆ U := by + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel + have hu_mem : MemLp u.zeroExtension 2 volume := + u.memLp_zeroExtension hU.isOpen.measurableSet u.toH1Function.memL2 + have hu_local : LocallyIntegrable u.zeroExtension volume := + hu_mem.locallyIntegrable (by norm_num) + have hu_support : tsupport u.zeroExtension ⊆ closure U := + u.tsupport_zeroExtension_subset_closure + refine ⟨contDiff_inwardMollification hρ hu_local hr hε, + hasCompactSupport_inwardMollification hU hρ hu_support hball hr hε, + tsupport_inwardMollification_subset hU hρ hu_support hball hr hε⟩ + +end H10Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationLp.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationLp.lean new file mode 100644 index 0000000000..443adb7b6a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationLp.lean @@ -0,0 +1,234 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalAffineLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalMollifierLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationGeometry + +/-! +# Global `L^p` convergence of inward mollification + +This file combines the global approximate-identity theorem with strong +continuity under the outward affine expansion. The result is independent of +domain geometry and boundary conditions. +-/ + +@[expose] public section + +namespace Homogenization + +open Function MeasureTheory Topology +open _root_.Filter +open scoped Convolution ENNReal Pointwise + +noncomputable section + +private theorem memLp_inwardMollification + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hg : MemLp g p volume) (x0 : Vec d) + {r ε : ℝ} (hr : 0 < r) (hε : 0 < ε) : + MemLp (inwardMollification ρ g x0 r ε) p volume := by + have hscale : 0 < ε * r := mul_pos hε hr + have hk_compact : HasCompactSupport (scaledConvexApproxKernel ρ (ε * r)) := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hscale + have hk_cont : Continuous (scaledConvexApproxKernel ρ (ε * r)) := + (contDiff_scaledConvexApproxKernel hρ (ε * r)).continuous + have hg_loc : LocallyIntegrable g volume := hg.locallyIntegrable hp1 + let mollified : Vec d → ℝ := + scaledConvexApproxKernel ρ (ε * r) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] g + have hmollified_cont : Continuous mollified := by + exact hk_compact.continuous_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hg_loc + have hmollified_norm : eLpNorm mollified p volume ≤ eLpNorm g p volume := by + exact young_convolution_nonneg_integral_one_of_aemeasurable hp1 hp + (scaledConvexApproxKernel_nonneg hρ hscale) + (integrable_scaledConvexApproxKernel hρ hscale) + (integral_scaledConvexApproxKernel hρ hscale) + (measurable_scaledConvexApproxKernel hρ.continuous (ε * r)) + hg.aemeasurable + have hmollified_mem : MemLp mollified p volume := + hmollified_norm.trans_lt hg.eLpNorm_lt_top + have hcomp := MemLp.comp_globalAffineExpansion hmollified_mem x0 hε.le + simpa only [inwardMollification, mollified, globalAffineExpansion] using! hcomp + +/-- Inward mollification converges strongly to its input in every finite +`L^p`, `1 ≤ p < ∞`, on the whole Euclidean space. -/ +theorem tendsto_eLpNorm_inwardMollification_sub_zero + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hg : MemLp g p volume) (x0 : Vec d) + {r : ℝ} (hr : 0 < r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ n, 0 ≤ ε n) + (hε_pos : ∀ᶠ n in Filter.atTop, 0 < ε n) : + Filter.Tendsto + (fun n => eLpNorm + (inwardMollification ρ g x0 r (ε n) - g) p volume) + Filter.atTop (nhds 0) := by + let mollified : ℕ → Vec d → ℝ := fun n => + scaledConvexApproxKernel ρ (ε n * r) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] g + have hmollifier : Filter.Tendsto + (fun n => eLpNorm (mollified n - g) p volume) Filter.atTop (nhds 0) := by + simpa only [mollified, Pi.sub_apply] using! + tendsto_eLpNorm_sub_zero_convolution_scaledConvexApproxKernel + hρ hp1 hp hg hr hε hε_pos + have haffine : Filter.Tendsto + (fun n => eLpNorm + (g ∘ globalAffineExpansion x0 (ε n) - g) p volume) + Filter.atTop (nhds 0) := + tendsto_eLpNorm_comp_globalAffineExpansion_sub_zero + hp1 hp hg x0 hε hε_nonneg + have hsum : Filter.Tendsto + (fun n => eLpNorm (mollified n - g) p volume + + eLpNorm (g ∘ globalAffineExpansion x0 (ε n) - g) p volume) + Filter.atTop (nhds 0) := by + simpa using hmollifier.add haffine + have hupper : ∀ᶠ n in Filter.atTop, + eLpNorm (inwardMollification ρ g x0 r (ε n) - g) p volume ≤ + eLpNorm (mollified n - g) p volume + + eLpNorm (g ∘ globalAffineExpansion x0 (ε n) - g) p volume := by + filter_upwards [hε_pos] with n hn_pos + have hscale : 0 < ε n * r := mul_pos hn_pos hr + have hk_compact : HasCompactSupport (scaledConvexApproxKernel ρ (ε n * r)) := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hscale + have hk_cont : Continuous (scaledConvexApproxKernel ρ (ε n * r)) := + (contDiff_scaledConvexApproxKernel hρ (ε n * r)).continuous + have hg_loc : LocallyIntegrable g volume := hg.locallyIntegrable hp1 + have hmollified_cont : Continuous (mollified n) := by + exact hk_compact.continuous_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont hg_loc + have hmollified_norm : eLpNorm (mollified n) p volume ≤ eLpNorm g p volume := by + exact young_convolution_nonneg_integral_one_of_aemeasurable hp1 hp + (scaledConvexApproxKernel_nonneg hρ hscale) + (integrable_scaledConvexApproxKernel hρ hscale) + (integral_scaledConvexApproxKernel hρ hscale) + (measurable_scaledConvexApproxKernel hρ.continuous (ε n * r)) + hg.aemeasurable + have hmollified_mem : MemLp (mollified n) p volume := + hmollified_norm.trans_lt hg.eLpNorm_lt_top + have hdiff_mem : MemLp (mollified n - g) p volume := + hmollified_mem.sub hg + have hdiff_comp_mem : + MemLp ((mollified n - g) ∘ globalAffineExpansion x0 (ε n)) p volume := + MemLp.comp_globalAffineExpansion hdiff_mem x0 (hε_nonneg n) + have hg_comp_mem : MemLp (g ∘ globalAffineExpansion x0 (ε n)) p volume := + MemLp.comp_globalAffineExpansion hg x0 (hε_nonneg n) + have hfactor_le : + ENNReal.ofReal (((1 + ε n) ^ d)⁻¹) ^ (1 / p).toReal ≤ 1 := by + have hpow : 1 ≤ (1 + ε n) ^ d := one_le_pow₀ (by linarith [hε_nonneg n]) + have hbase : ENNReal.ofReal (((1 + ε n) ^ d)⁻¹) ≤ 1 := + ENNReal.ofReal_le_one.mpr (inv_le_one_of_one_le₀ hpow) + exact ENNReal.rpow_le_one hbase (by positivity) + have hcomp_le : + eLpNorm ((mollified n - g) ∘ globalAffineExpansion x0 (ε n)) p volume ≤ + eLpNorm (mollified n - g) p volume := by + rw [eLpNorm_comp_globalAffineExpansion hp hdiff_mem x0 (hε_nonneg n)] + simpa only [one_mul] using + mul_le_mul_left hfactor_le (eLpNorm (mollified n - g) p volume) + have hdecomp : + inwardMollification ρ g x0 r (ε n) - g = + (mollified n - g) ∘ globalAffineExpansion x0 (ε n) + + (g ∘ globalAffineExpansion x0 (ε n) - g) := by + funext x + simp only [inwardMollification, mollified, globalAffineExpansion, + Function.comp_apply, Pi.add_apply, Pi.sub_apply] + ring + rw [hdecomp] + calc + eLpNorm + ((mollified n - g) ∘ globalAffineExpansion x0 (ε n) + + (g ∘ globalAffineExpansion x0 (ε n) - g)) p volume ≤ + eLpNorm ((mollified n - g) ∘ globalAffineExpansion x0 (ε n)) p volume + + eLpNorm (g ∘ globalAffineExpansion x0 (ε n) - g) p volume := + eLpNorm_add_le hp1 + _ ≤ eLpNorm (mollified n - g) p volume + + eLpNorm (g ∘ globalAffineExpansion x0 (ε n) - g) p volume := + add_le_add hcomp_le (le_refl _) + refine tendsto_of_tendsto_of_tendsto_of_le_of_le' + tendsto_const_nhds hsum (Filter.Eventually.of_forall fun _ => zero_le) hupper + +/-- The scalar factor produced by differentiating the affine pullback does not +alter strong finite-`L^p` convergence of inward mollification. -/ +theorem tendsto_eLpNorm_one_add_mul_inwardMollification_sub_zero + {d : ℕ} {ρ g : Vec d → ℝ} {p : ENNReal} + (hρ : IsConvexApproxKernel ρ) (hp1 : 1 ≤ p) (hp : p ≠ ⊤) + (hg : MemLp g p volume) (x0 : Vec d) + {r : ℝ} (hr : 0 < r) + {ε : ℕ → ℝ} (hε : Filter.Tendsto ε Filter.atTop (nhds 0)) + (hε_nonneg : ∀ n, 0 ≤ ε n) + (hε_pos : ∀ᶠ n in Filter.atTop, 0 < ε n) : + Filter.Tendsto + (fun n => eLpNorm + (fun x => (1 + ε n) * inwardMollification ρ g x0 r (ε n) x - g x) + p volume) + Filter.atTop (nhds 0) := by + let c : ℕ → ℝ := fun n => 1 + ε n + have hbase := tendsto_eLpNorm_inwardMollification_sub_zero + hρ hp1 hp hg x0 hr hε hε_nonneg hε_pos + have hc : Filter.Tendsto c Filter.atTop (nhds 1) := by + simpa [c] using (tendsto_const_nhds : Filter.Tendsto + (fun _ : ℕ => (1 : ℝ)) Filter.atTop (nhds 1)).add hε + have hcnorm : Filter.Tendsto (fun n => ‖c n‖ₑ) Filter.atTop (nhds 1) := by + simpa using! (continuous_enorm.tendsto (1 : ℝ)).comp hc + have hdiffnorm : Filter.Tendsto (fun n => ‖c n - 1‖ₑ) + Filter.atTop (nhds 0) := by + have hreal : Filter.Tendsto (fun n => c n - 1) Filter.atTop (nhds 0) := by + simpa using hc.sub (tendsto_const_nhds : Filter.Tendsto + (fun _ : ℕ => (1 : ℝ)) Filter.atTop (nhds 1)) + simpa using! (continuous_enorm.tendsto (0 : ℝ)).comp hreal + have hfirst : Filter.Tendsto + (fun n => eLpNorm + (c n • (inwardMollification ρ g x0 r (ε n) - g)) p volume) + Filter.atTop (nhds 0) := by + simpa only [eLpNorm_const_smul, one_mul] using + ENNReal.Tendsto.mul hcnorm (Or.inl one_ne_zero) hbase + (Or.inr ENNReal.one_ne_top) + have hg_norm_ne_top : eLpNorm g p volume ≠ ⊤ := hg.eLpNorm_ne_top + have hsecond : Filter.Tendsto + (fun n => eLpNorm ((c n - 1) • g) p volume) + Filter.atTop (nhds 0) := by + simpa only [eLpNorm_const_smul, zero_mul] using + ENNReal.Tendsto.mul_const hdiffnorm (Or.inr hg_norm_ne_top) + have hsum : Filter.Tendsto + (fun n => + eLpNorm (c n • (inwardMollification ρ g x0 r (ε n) - g)) p volume + + eLpNorm ((c n - 1) • g) p volume) + Filter.atTop (nhds 0) := by + simpa using hfirst.add hsecond + have hupper : ∀ᶠ n in Filter.atTop, + eLpNorm + (fun x => (1 + ε n) * inwardMollification ρ g x0 r (ε n) x - g x) + p volume ≤ + eLpNorm (c n • (inwardMollification ρ g x0 r (ε n) - g)) p volume + + eLpNorm ((c n - 1) • g) p volume := by + filter_upwards [hε_pos] with n hn_pos + have hinward_mem : MemLp (inwardMollification ρ g x0 r (ε n)) p volume := + memLp_inwardMollification hρ hp1 hp hg x0 hr hn_pos + have hfirst_meas : AEStronglyMeasurable + (c n • (inwardMollification ρ g x0 r (ε n) - g)) volume := + (hinward_mem.sub hg).aestronglyMeasurable.const_smul (c n) + have hsecond_meas : AEStronglyMeasurable ((c n - 1) • g) volume := + hg.aestronglyMeasurable.const_smul (c n - 1) + have hdecomp : + (fun x => (1 + ε n) * inwardMollification ρ g x0 r (ε n) x - g x) = + c n • (inwardMollification ρ g x0 r (ε n) - g) + + (c n - 1) • g := by + funext x + simp only [c, Pi.add_apply, Pi.sub_apply, Pi.smul_apply, smul_eq_mul] + ring + rw [hdecomp] + exact eLpNorm_add_le hp1 + refine tendsto_of_tendsto_of_tendsto_of_le_of_le' + tendsto_const_nhds hsum (Filter.Eventually.of_forall fun _ => zero_le) hupper + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationWeakGradient.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationWeakGradient.lean new file mode 100644 index 0000000000..3640c35532 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/InwardMollificationWeakGradient.lean @@ -0,0 +1,405 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.GlobalAffineLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.InwardMollificationGeometry +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.ConvolutionLp + +/-! +# Weak gradient of inward mollification + +This file identifies the classical coordinate derivative of the inward +mollification of an `H10Function` with the correspondingly mollified global +zero extension of its weak gradient. The proof first establishes the global +convolution identity by closing the identities for the supported smooth +approximants built into `H10Function`, and then applies the affine chain rule. +-/ + +@[expose] public section + +namespace Homogenization + +open Function MeasureTheory _root_.Filter Set Topology +open scoped ENNReal Convolution Pointwise + +noncomputable section + +private theorem H10Function.approx_sub_zeroExtension_eq_indicator_sub + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (n : ℕ) : + (fun x => u.approx n x - u.zeroExtension x) = + Set.indicator U (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + by_cases hx : x ∈ U + · simp only [Set.indicator_of_mem hx, u.zeroExtension_apply_of_mem hx] + · have hzero : u.approx n x = 0 := by + apply image_eq_zero_of_notMem_tsupport + exact fun hx_support => hx (u.approx_support_subset n hx_support) + rw [Set.indicator_of_notMem hx, u.zeroExtension_apply_of_not_mem hx, sub_zero, hzero] + +private theorem H10Function.fderiv_approx_sub_zeroExtensionGrad_eq_indicator_sub + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (n : ℕ) (i : Fin d) : + (fun x => + (fderiv ℝ (u.approx n) x) (basisVec i) - u.zeroExtensionGrad x i) = + Set.indicator U + (fun x => + (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) := by + funext x + by_cases hx : x ∈ U + · simp only [Set.indicator_of_mem hx, u.zeroExtensionGrad_apply_of_mem hx] + · have hx_support : x ∉ tsupport (u.approx n) := + fun hx_support => hx (u.approx_support_subset n hx_support) + have hzero : u.approx n =ᶠ[nhds x] 0 := + (isClosed_tsupport (f := u.approx n)).isOpen_compl.eventually_mem hx_support |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + have hderiv_zero : (fderiv ℝ (u.approx n) x) (basisVec i) = 0 := by + rw [hzero.fderiv_eq] + simp only [fderiv_zero, Pi.zero_apply, zero_apply] + rw [Set.indicator_of_notMem hx, u.zeroExtensionGrad_apply_of_not_mem hx, + Pi.zero_apply, sub_zero, hderiv_zero] + +private theorem memLp_convolution_scaledConvexApproxKernel + {d : ℕ} {g : Vec d → ℝ} {p : ℝ≥0∞} (hp : 1 ≤ p) (hp_top : p ≠ ∞) + (hg : MemLp g p volume) {a : ℝ} (ha : 0 < a) : + MemLp + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] g) + p volume := by + let k : Vec d → ℝ := + scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel + have hk_compact : HasCompactSupport k := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport ha + have hk_cont : Continuous k := + continuous_scaledConvexApproxKernel hρ.continuous a + have hconv_cont : Continuous + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) := + hk_compact.continuous_convolution_left (L := ContinuousLinearMap.lsmul ℝ ℝ) + hk_cont (hg.locallyIntegrable hp) + exact (young_convolution_nonneg_integral_one_of_aemeasurable hp hp_top + (scaledConvexApproxKernel_nonneg hρ ha) + (integrable_scaledConvexApproxKernel hρ ha) + (integral_scaledConvexApproxKernel hρ ha) + (measurable_scaledConvexApproxKernel hρ.continuous a) + hg.aemeasurable).trans_lt hg.eLpNorm_lt_top + +private theorem convolution_sub_eq_sub_convolution + {d : ℕ} {k f g : Vec d → ℝ} + (hkf : ConvolutionExists k f (ContinuousLinearMap.lsmul ℝ ℝ) volume) + (hkg : ConvolutionExists k g (ContinuousLinearMap.lsmul ℝ ℝ) volume) : + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] (fun x => f x - g x) = + (fun x => + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] f) x - + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) x) := by + funext x + simp only [convolution_def, ContinuousLinearMap.lsmul_apply, smul_eq_mul, + mul_sub] + exact integral_sub (hkf x) (hkg x) + +private theorem H10Function.hasWeakPartialDerivOn_convolution_zeroExtension + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (hU : MeasurableSet U) + {a : ℝ} (ha : 0 < a) (i : Fin d) : + HasWeakPartialDerivOn Set.univ i + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun x => u.zeroExtensionGrad x i) := by + let k : Vec d → ℝ := + scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a + let un : ℕ → Vec d → ℝ := fun n => + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.approx n + let gn : ℕ → Vec d → ℝ := fun n => + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun x => (fderiv ℝ (u.approx n) x) (basisVec i) + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel + have hk_compact : HasCompactSupport k := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport ha + have hk_smooth : ContDiff ℝ (⊤ : ℕ∞) k := + contDiff_scaledConvexApproxKernel hρ a + have hk_cont : Continuous k := hk_smooth.continuous + have hk_int : Integrable k volume := integrable_scaledConvexApproxKernel hρ ha + have hk_loc : LocallyIntegrable k volume := hk_int.locallyIntegrable + have hu_mem : MemLp u.zeroExtension 2 volume := + u.memLp_zeroExtension hU u.toH1Function.memL2 + have hgi_mem : MemLp (fun x => u.zeroExtensionGrad x i) 2 volume := by + have hmem := u.gradMemLp_zeroExtensionGrad hU u.toH1Function.gradMemL2 i + change MemLp (fun x => u.zeroExtensionGrad x i) 2 + (volume.restrict Set.univ) at hmem + simpa only [Measure.restrict_univ] using hmem + have hu_conv_mem : MemLp + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) 2 volume := + memLp_convolution_scaledConvexApproxKernel (by norm_num) (by norm_num) hu_mem ha + have hgi_conv_mem : MemLp + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun x => u.zeroExtensionGrad x i) 2 volume := + memLp_convolution_scaledConvexApproxKernel (by norm_num) (by norm_num) hgi_mem ha + have hu_n_mem : ∀ n, MemLp (u.approx n) 2 volume := by + intro n + exact (u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n) + have hgn_base_mem : ∀ n, MemLp + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) 2 volume := by + intro n + have hcont : Continuous (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := + ((u.approx_smooth n).continuous_fderiv (by norm_num)).clm_apply continuous_const + have hsupp : HasCompactSupport + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := by + simpa only using (u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcont.memLp_of_hasCompactSupport hsupp + have hun_mem : ∀ n, MemLp (un n) 2 volume := by + intro n + exact memLp_convolution_scaledConvexApproxKernel (by norm_num) (by norm_num) + (hu_n_mem n) ha + have hgn_mem : ∀ n, MemLp (gn n) 2 volume := by + intro n + exact memLp_convolution_scaledConvexApproxKernel (by norm_num) (by norm_num) + (hgn_base_mem n) ha + have hweak_n : ∀ n, HasWeakPartialDerivOn Set.univ i (un n) (gn n) := by + intro n + have hu_n_loc : LocallyIntegrable (u.approx n) volume := + (hu_n_mem n).locallyIntegrable (by norm_num) + have hconv_smooth : ContDiff ℝ 1 (un n) := by + exact hk_compact.contDiff_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) (hk_smooth.of_le (by norm_num)) hu_n_loc + have hclass : HasWeakPartialDerivOn Set.univ i (un n) + (fun x => (fderiv ℝ (un n) x) (basisVec i)) := + HasWeakPartialDerivOn.of_contDiff hconv_smooth + have hgrad_eq : + (fun x => (fderiv ℝ (un n) x) (basisVec i)) = gn n := by + funext x + have hfd := (u.approx_hasCompactSupport n).hasFDerivAt_convolution_right + (ContinuousLinearMap.lsmul ℝ ℝ) hk_loc + ((u.approx_smooth n).of_le (by norm_num)) x + change (fderiv ℝ + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.approx n) x) + (basisVec i) = + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => (fderiv ℝ (u.approx n) y) (basisVec i)) x + rw [hfd.fderiv] + exact convolution_precompR_apply (ContinuousLinearMap.lsmul ℝ ℝ) hk_loc + ((u.approx_hasCompactSupport n).fderiv ℝ) + ((u.approx_smooth n).continuous_fderiv (by norm_num)) x (basisVec i) + rw [← hgrad_eq] + exact hclass + have hu_tend : Filter.Tendsto + (fun n => eLpNorm (fun x => u.approx n x - u.zeroExtension x) 2 volume) + Filter.atTop (nhds 0) := by + refine u.tendsto_approx.congr (fun n => ?_) + rw [u.approx_sub_zeroExtension_eq_indicator_sub n, + eLpNorm_indicator_eq_eLpNorm_restrict hU] + have hgi_tend : Filter.Tendsto + (fun n => eLpNorm + (fun x => + (fderiv ℝ (u.approx n) x) (basisVec i) - u.zeroExtensionGrad x i) + 2 volume) + Filter.atTop (nhds 0) := by + refine (u.tendsto_approx_grad i).congr (fun n => ?_) + rw [u.fderiv_approx_sub_zeroExtensionGrad_eq_indicator_sub n i, + eLpNorm_indicator_eq_eLpNorm_restrict hU] + have hun_tend : Filter.Tendsto + (fun n => eLpNorm + (fun x => un n x - + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) x) + 2 volume) + Filter.atTop (nhds 0) := by + have hconv_exists_n : ∀ n, + ConvolutionExists k (u.approx n) (ContinuousLinearMap.lsmul ℝ ℝ) volume := + fun n => hk_compact.convolutionExists_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont + ((hu_n_mem n).locallyIntegrable (by norm_num)) + have hconv_exists_u : + ConvolutionExists k u.zeroExtension (ContinuousLinearMap.lsmul ℝ ℝ) volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont + (hu_mem.locallyIntegrable (by norm_num)) + apply tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hu_tend + · intro n + exact bot_le + · intro n + change eLpNorm + (fun x => + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.approx n) x - + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) x) + 2 volume ≤ _ + rw [← convolution_sub_eq_sub_convolution (hconv_exists_n n) hconv_exists_u] + exact young_convolution_nonneg_integral_one_of_aemeasurable (by norm_num) (by norm_num) + (scaledConvexApproxKernel_nonneg hρ ha) hk_int + (integral_scaledConvexApproxKernel hρ ha) + (measurable_scaledConvexApproxKernel hρ.continuous a) + ((hu_n_mem n).sub hu_mem).aemeasurable + have hgn_tend : Filter.Tendsto + (fun n => eLpNorm + (fun x => gn n x - + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) x) + 2 volume) + Filter.atTop (nhds 0) := by + have hconv_exists_n : ∀ n, + ConvolutionExists k + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) + (ContinuousLinearMap.lsmul ℝ ℝ) volume := + fun n => hk_compact.convolutionExists_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont + ((hgn_base_mem n).locallyIntegrable (by norm_num)) + have hconv_exists_g : + ConvolutionExists k (fun x => u.zeroExtensionGrad x i) + (ContinuousLinearMap.lsmul ℝ ℝ) volume := + hk_compact.convolutionExists_left (L := ContinuousLinearMap.lsmul ℝ ℝ) hk_cont + (hgi_mem.locallyIntegrable (by norm_num)) + apply tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hgi_tend + · intro n + exact bot_le + · intro n + change eLpNorm + (fun x => + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => (fderiv ℝ (u.approx n) y) (basisVec i)) x - + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) x) + 2 volume ≤ _ + rw [← convolution_sub_eq_sub_convolution (hconv_exists_n n) hconv_exists_g] + exact young_convolution_nonneg_integral_one_of_aemeasurable (by norm_num) (by norm_num) + (scaledConvexApproxKernel_nonneg hρ ha) hk_int + (integral_scaledConvexApproxKernel hρ ha) + (measurable_scaledConvexApproxKernel hρ.continuous a) + ((hgn_base_mem n).sub hgi_mem).aemeasurable + apply HasWeakPartialDerivOn.of_tendsto_eLpNorm_finiteLp FiniteLpExponent.two + (by simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hu_conv_mem) + (by simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hgi_conv_mem) + (by simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hun_mem) + (by simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hgn_mem) + hweak_n + · simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hun_tend + · simpa only [FiniteLpExponent.two_exponent, Measure.restrict_univ] using hgn_tend + +private theorem H10Function.ae_eq_fderiv_convolution_zeroExtension_apply_basisVec + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (hU : MeasurableSet U) + {a : ℝ} (ha : 0 < a) (i : Fin d) : + (fun x => + (fderiv ℝ + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) x) + (basisVec i)) =ᵐ[volume] + fun x => + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) x := by + let k : Vec d → ℝ := + scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) a + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel + have hk_compact : HasCompactSupport k := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport ha + have hk_smooth : ContDiff ℝ (⊤ : ℕ∞) k := + contDiff_scaledConvexApproxKernel hρ a + have hu_mem : MemLp u.zeroExtension 2 volume := + u.memLp_zeroExtension hU u.toH1Function.memL2 + have hgi_mem : MemLp (fun x => u.zeroExtensionGrad x i) 2 volume := by + have hmem := u.gradMemLp_zeroExtensionGrad hU u.toH1Function.gradMemL2 i + change MemLp (fun x => u.zeroExtensionGrad x i) 2 + (volume.restrict Set.univ) at hmem + simpa only [Measure.restrict_univ] using hmem + have hsmooth : ContDiff ℝ 1 + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) := + hk_compact.contDiff_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) (hk_smooth.of_le (by norm_num)) + (hu_mem.locallyIntegrable (by norm_num)) + have hclass : HasWeakPartialDerivOn Set.univ i + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) + (fun x => + (fderiv ℝ + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) x) + (basisVec i)) := + HasWeakPartialDerivOn.of_contDiff hsmooth + have hrough := u.hasWeakPartialDerivOn_convolution_zeroExtension hU ha i + have hclass_loc : LocallyIntegrable + (fun x => + (fderiv ℝ + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension) x) + (basisVec i)) volume := + ((hsmooth.continuous_fderiv (by norm_num)).clm_apply continuous_const).locallyIntegrable + have hrough_loc : LocallyIntegrable + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun x => u.zeroExtensionGrad x i) volume := by + exact (memLp_convolution_scaledConvexApproxKernel (by norm_num) (by norm_num) + hgi_mem ha).locallyIntegrable (by norm_num) + have hae := HasWeakPartialDerivOn.ae_eq isOpen_univ + (hclass_loc.locallyIntegrableOn Set.univ) + (hrough_loc.locallyIntegrableOn Set.univ) hclass hrough + simpa only [k, Measure.restrict_univ] using hae + +namespace H10Function + +/-- The classical coordinate derivative of the inward mollification of an +`H¹₀` zero extension is the outward-affine pullback of the mollified weak +gradient, including the exact chain-rule factor `1 + ε`. -/ +theorem ae_eq_fderiv_inwardMollification_unit_apply_basisVec + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (hU : MeasurableSet U) + {x0 : Vec d} {r ε : ℝ} (hr : 0 < r) (hε : 0 < ε) (i : Fin d) : + (fun x => + (fderiv ℝ + (inwardMollification (unitConvexApproxKernel (d := d)) + u.zeroExtension x0 r ε) x) (basisVec i)) =ᵐ[volume] + fun x => (1 + ε) * + (scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) (ε * r) ⋆[ + ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) (globalAffineExpansion x0 ε x) := by + let k : Vec d → ℝ := + scaledConvexApproxKernel (unitConvexApproxKernel (d := d)) (ε * r) + let v : Vec d → ℝ := + k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] u.zeroExtension + have hscale : 0 < ε * r := mul_pos hε hr + have hρ : IsConvexApproxKernel (unitConvexApproxKernel (d := d)) := + isConvexApproxKernel_unitConvexApproxKernel + have hk_compact : HasCompactSupport k := + hasCompactSupport_scaledConvexApproxKernel hρ.compactSupport hscale + have hk_smooth : ContDiff ℝ (⊤ : ℕ∞) k := + contDiff_scaledConvexApproxKernel hρ (ε * r) + have hu_mem : MemLp u.zeroExtension 2 volume := + u.memLp_zeroExtension hU u.toH1Function.memL2 + have hv_smooth : ContDiff ℝ 1 v := + hk_compact.contDiff_convolution_left + (L := ContinuousLinearMap.lsmul ℝ ℝ) (hk_smooth.of_le (by norm_num)) + (hu_mem.locallyIntegrable (by norm_num)) + have hconv := u.ae_eq_fderiv_convolution_zeroExtension_apply_basisVec hU hscale i + have hconv_comp := + Filter.EventuallyEq.comp_globalAffineExpansion hconv x0 hε.le + change (fun x => + (fderiv ℝ (v ∘ globalAffineExpansion x0 ε) x) (basisVec i)) =ᵐ[volume] + fun x => (1 + ε) * + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) (globalAffineExpansion x0 ε x) + filter_upwards [hconv_comp] with x hx + have haff : HasFDerivAt (globalAffineExpansion x0 ε) + ((1 + ε) • ContinuousLinearMap.id ℝ (Vec d)) x := by + simpa [globalAffineExpansion, sub_eq_add_neg] using + (((1 + ε) • ContinuousLinearMap.id ℝ (Vec d)).hasFDerivAt.add_const + (-ε • x0)) + have hv_deriv : HasFDerivAt v (fderiv ℝ v (globalAffineExpansion x0 ε x)) + (globalAffineExpansion x0 ε x) := + hv_smooth.differentiable (by simp) |>.differentiableAt.hasFDerivAt + have hcomp := hv_deriv.comp x haff + have hpoint : + (fderiv ℝ (v ∘ globalAffineExpansion x0 ε) x) (basisVec i) = + (1 + ε) * (fderiv ℝ v (globalAffineExpansion x0 ε x)) (basisVec i) := by + rw [hcomp.fderiv] + simp only [ContinuousLinearMap.comp_apply, smul_apply, + ContinuousLinearMap.id_apply, map_smul, smul_eq_mul] + have hx' : + (fderiv ℝ v (globalAffineExpansion x0 ε x)) (basisVec i) = + (k ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] + fun y => u.zeroExtensionGrad y i) (globalAffineExpansion x0 ε x) := by + simpa only [Function.comp_apply, v, k] using hx + rw [hpoint, hx'] + +end H10Function + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Normalized.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Normalized.lean new file mode 100644 index 0000000000..ea46748f6e --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Normalized.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.NormalizedLp +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.Definitions +public import Mathlib.MeasureTheory.SpecificCodomains.WithLp + +/-! +# Generic normalized `W^{1,p}` implementation kernel + +This module implements normalized `W^{1,p}` quantities on an arbitrary +positive-finite-volume `BoundedMeasurableDomain`. It is a reusable analytic +kernel, not the Chapter 1 source-facing carrier: Chapter 1 exposes these +operations only after restricting to its nonempty bounded open convex-domain +facade. +-/ + +@[expose] public section + +namespace Homogenization + +open scoped ENNReal + +namespace W1pFunction + +/-- Componentwise `L^p` control of a weak gradient gives `L^p` control of its +explicit Euclidean magnitude, after volume normalization. -/ +theorem gradEuclideanMemLp {d : ℕ} (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) + (u : W1pFunction (U : Set (Vec d)) p) : + MeasureTheory.MemLp (fun x => euclideanNorm (u.grad x)) p U.normalizedVolume := by + have hgrad_restricted : + MeasureTheory.MemLp (fun x => HilbertVec.ofVec (u.grad x)) p U.restrictedVolume := by + rw [MeasureTheory.memLp_piLp_iff] + intro i + simpa only [Function.comp_apply, PiLp.toLp_apply, + BoundedMeasurableDomain.restrictedVolume] using u.gradMemLp i + have hnorm_restricted : + MeasureTheory.MemLp (fun x => euclideanNorm (u.grad x)) p U.restrictedVolume := by + simpa only [euclideanNorm_eq_norm_ofVec] using hgrad_restricted.norm + exact (U.memLp_normalizedVolume_iff p _).mpr hnorm_restricted + +end W1pFunction + +namespace BoundedMeasurableDomain + +/-- The real Lebesgue volume of a bounded measurable domain. Its conversion +from `ℝ≥0∞` is certified by `volume_ne_top`. -/ +noncomputable def volumeReal {d : ℕ} (U : BoundedMeasurableDomain d) : ℝ := + (MeasureTheory.volume (U : Set (Vec d))).toReal + +/-- A bounded measurable domain has strictly positive real Lebesgue volume. -/ +theorem volumeReal_pos {d : ℕ} (U : BoundedMeasurableDomain d) : 0 < U.volumeReal := + ENNReal.toReal_pos U.volume_ne_zero U.volume_ne_top + +theorem volumeReal_ne_zero {d : ℕ} (U : BoundedMeasurableDomain d) : U.volumeReal ≠ 0 := + ne_of_gt U.volumeReal_pos + +/-! ## Generic kernel + +The declarations below are deliberately nested under +`BoundedMeasurableDomain.NormalizedW1pKernel`. They require only the broad +bounded-measurable positive-volume carrier and must not be presented as the +Chapter 1 source-facing domain API. -/ + +namespace NormalizedW1pKernel + +/-- The finite-exponent normalized `W^{1,p}` seminorm in the generic kernel. -/ +noncomputable def seminorm {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (_hp_one : 1 ≤ p) (_hp_top : p ≠ ∞) + (u : W1pFunction (U : Set (Vec d)) p) : ℝ := + U.normalizedEuclideanLpNorm p u.grad (u.gradEuclideanMemLp U p) + +/-- Characterization of the generic finite-exponent normalized seminorm. -/ +theorem seminorm_eq {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (u : W1pFunction (U : Set (Vec d)) p) : + seminorm U p hp_one hp_top u = + U.normalizedEuclideanLpNorm p u.grad (u.gradEuclideanMemLp U p) := + rfl + +/-- The generic finite-exponent seminorm is invariant under an a.e. equality +of the explicitly stored weak gradients. -/ +theorem seminorm_congr_ae {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (u v : W1pFunction (U : Set (Vec d)) p) + (hgrad : u.grad =ᵐ[U.normalizedVolume] v.grad) : + seminorm U p hp_one hp_top u = seminorm U p hp_one hp_top v := by + unfold seminorm + exact U.normalizedEuclideanLpNorm_congr_ae p (u.gradEuclideanMemLp U p) + (v.gradEuclideanMemLp U p) hgrad + +/-- The generic finite-exponent normalized `W^{1,p}` norm: +`(‖∇u‖^p + |U|^(-p/d) ‖u‖^p)^(1/p)`. -/ +noncomputable def norm {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (u : W1pFunction (U : Set (Vec d)) p) : ℝ := + (seminorm U p hp_one hp_top u ^ p.toReal + + U.volumeReal ^ (-(p.toReal / (d : ℝ))) * + U.normalizedLpNorm p u.toFun + ((U.memLp_normalizedVolume_iff p _).mpr u.memLp) ^ p.toReal) ^ + p.toReal⁻¹ + +/-- Characterization of the generic finite-exponent normalized norm. -/ +theorem norm_eq {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (u : W1pFunction (U : Set (Vec d)) p) : + norm U p hp_one hp_top u = + (seminorm U p hp_one hp_top u ^ p.toReal + + U.volumeReal ^ (-(p.toReal / (d : ℝ))) * + U.normalizedLpNorm p u.toFun + ((U.memLp_normalizedVolume_iff p _).mpr u.memLp) ^ p.toReal) ^ p.toReal⁻¹ := + rfl + +/-- The generic finite-exponent normalized norm is invariant under separate +a.e. equalities of the function and its explicitly stored weak gradient. -/ +theorem norm_congr_ae {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (p : ℝ≥0∞) (hp_one : 1 ≤ p) (hp_top : p ≠ ∞) + (u v : W1pFunction (U : Set (Vec d)) p) + (hfun : u.toFun =ᵐ[U.normalizedVolume] v.toFun) + (hgrad : u.grad =ᵐ[U.normalizedVolume] v.grad) : + norm U p hp_one hp_top u = norm U p hp_one hp_top v := by + unfold norm + rw [seminorm_congr_ae U p hp_one hp_top u v hgrad, + U.normalizedLpNorm_congr_ae p + ((U.memLp_normalizedVolume_iff p _).mpr u.memLp) + ((U.memLp_normalizedVolume_iff p _).mpr v.memLp) hfun] + +/-- The generic normalized `W^{1,∞}` seminorm of a weak Sobolev witness. -/ +noncomputable def seminormTop {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u : W1pFunction (U : Set (Vec d)) ∞) : ℝ := + U.normalizedEuclideanLpNorm ∞ u.grad (u.gradEuclideanMemLp U ∞) + +/-- Characterization of the generic normalized `W^{1,∞}` seminorm. -/ +theorem seminormTop_eq {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u : W1pFunction (U : Set (Vec d)) ∞) : + seminormTop U u = + U.normalizedEuclideanLpNorm ∞ u.grad (u.gradEuclideanMemLp U ∞) := + rfl + +/-- The generic endpoint seminorm is invariant under an a.e. equality of the +explicitly stored weak gradients. -/ +theorem seminormTop_congr_ae {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u v : W1pFunction (U : Set (Vec d)) ∞) + (hgrad : u.grad =ᵐ[U.normalizedVolume] v.grad) : + seminormTop U u = seminormTop U v := by + unfold seminormTop + exact U.normalizedEuclideanLpNorm_congr_ae ∞ (u.gradEuclideanMemLp U ∞) + (v.gradEuclideanMemLp U ∞) hgrad + +/-- The generic endpoint normalized `W^{1,∞}` norm. The two terms are added, +rather than combined using a maximum. -/ +noncomputable def normTop {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u : W1pFunction (U : Set (Vec d)) ∞) : ℝ := + seminormTop U u + U.volumeReal ^ (-(1 / (d : ℝ))) * + U.normalizedLpNorm ∞ u.toFun ((U.memLp_normalizedVolume_iff ∞ _).mpr u.memLp) + +/-- Characterization of the generic endpoint normalized norm. -/ +theorem normTop_eq {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u : W1pFunction (U : Set (Vec d)) ∞) : + normTop U u = + seminormTop U u + U.volumeReal ^ (-(1 / (d : ℝ))) * + U.normalizedLpNorm ∞ u.toFun + ((U.memLp_normalizedVolume_iff ∞ _).mpr u.memLp) := + rfl + +/-- The generic endpoint normalized norm is invariant under separate a.e. +equalities of the function and its explicitly stored weak gradient. -/ +theorem normTop_congr_ae {d : ℕ} [NeZero d] + (U : BoundedMeasurableDomain d) (u v : W1pFunction (U : Set (Vec d)) ∞) + (hfun : u.toFun =ᵐ[U.normalizedVolume] v.toFun) + (hgrad : u.grad =ᵐ[U.normalizedVolume] v.grad) : + normTop U u = normTop U v := by + unfold normTop + rw [seminormTop_congr_ae U u v hgrad, + U.normalizedLpNorm_congr_ae ∞ + ((U.memLp_normalizedVolume_iff ∞ _).mpr u.memLp) + ((U.memLp_normalizedVolume_iff ∞ _).mpr v.memLp) hfun] + +end NormalizedW1pKernel + +end BoundedMeasurableDomain + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Translation.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Translation.lean new file mode 100644 index 0000000000..b17e20f669 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/Translation.lean @@ -0,0 +1,214 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Geometry.Translation +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas + +/-! # Translation -/ + +@[expose] public section + +namespace Homogenization + +open scoped Topology + +noncomputable section + +namespace W1pFunction + +/-- +Translate a `W^{1,p}(U)` witness to `W^{1,p}(U + z)` by precomposing with +`x ↦ x - z`. +-/ +noncomputable def translate {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (z : Vec d) : + W1pFunction (translateSet z U) p := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + let hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + refine + { toFun := fun x => u (T x) + grad := fun x => u.grad (T x) + memLp := by + show MemLpOn V p (u.toFun ∘ T) + simpa [MemLpOn, V, T, Function.comp] using u.memLp.comp_measurePreserving hμ + gradMemLp := by + intro i + show MemLpOn V p ((fun x => u.grad x i) ∘ T) + simpa [MemLpOn, V, T, Function.comp] using (u.gradMemLp i).comp_measurePreserving hμ + hasWeakGradient := ?_ } + intro i φ hφ hφ_supp hφ_sub + let ψ : Vec d → ℝ := fun x => φ (x + z) + have hψ_smooth : ContDiff ℝ (⊤ : ℕ∞) ψ := by + simpa [ψ] using! hφ.comp (contDiff_id.add contDiff_const) + have hψ_supp : HasCompactSupport ψ := by + show HasCompactSupport (φ ∘ Homeomorph.addRight z) + simpa [ψ, Function.comp] using hφ_supp.comp_homeomorph (Homeomorph.addRight z) + have hψ_sub : tsupport ψ ⊆ U := by + intro x hx + have hx' : x + z ∈ tsupport φ := by + rw [show ψ = φ ∘ Homeomorph.addRight z by rfl, + tsupport_comp_eq_preimage φ (Homeomorph.addRight z)] at hx + exact hx + have hxV : x + z ∈ V := hφ_sub hx' + simpa [V, mem_translateSet_iff_sub_mem, sub_eq_add_neg, add_assoc] using hxV + have hweak := u.hasWeakGradient i ψ hψ_smooth hψ_supp hψ_sub + have hmain : + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume = + -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := by + have hfun : + (fun x => u x * (fderiv ℝ φ (x + z)) (basisVec i)) = + fun x => u x * (fderiv ℝ ψ x) (basisVec i) := by + funext x + have hderiv : + fderiv ℝ (fun y : Vec d => φ (y + z)) x = + fderiv ℝ φ (x + z) := by + simpa using (fderiv_comp_add_right (𝕜 := ℝ) (f := φ) (x := x) z) + simp [ψ, hderiv] + calc + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ ψ x) (basisVec i) ∂MeasureTheory.volume := by rw [hfun] + _ = -∫ x in U, u.grad x i * ψ x ∂MeasureTheory.volume := hweak + _ = -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := by rfl + have hchange_left : + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := by + symm + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u (x - z) * (fderiv ℝ φ x) (basisVec i))) + have hchange_right : + ∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume = + ∫ x in V, u.grad (x - z) i * φ x ∂MeasureTheory.volume := by + simpa [V, T, sub_eq_add_neg, add_assoc] using + (setIntegral_comp_addRight_translateSet (d := d) z U + (fun x => u.grad (x - z) i * φ x)) + calc + ∫ x in V, u (x - z) * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume + = ∫ x in U, u x * (fderiv ℝ φ (x + z)) (basisVec i) ∂MeasureTheory.volume := hchange_left + _ = -∫ x in U, u.grad x i * φ (x + z) ∂MeasureTheory.volume := hmain + _ = -∫ x in V, u.grad (x - z) i * φ x ∂MeasureTheory.volume := by rw [hchange_right] + +@[simp] theorem translate_toFun {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (z : Vec d) (x : Vec d) : + (u.translate z).toFun x = u.toFun (x - z) := rfl + +@[simp] theorem translate_grad {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W1pFunction U p) (z : Vec d) (x : Vec d) : + (u.translate z).grad x = u.grad (x - z) := rfl + +end W1pFunction + +namespace W10pFunction + +/-- +Translate a `W^{1,p}_0(U)` witness to `W^{1,p}_0(U + z)` by precomposing with +`x ↦ x - z`. +-/ +noncomputable def translate {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W10pFunction U p) (z : Vec d) : + W10pFunction (translateSet z U) p := by + let V : Set (Vec d) := translateSet z U + let T : Vec d → Vec d := fun x => x - z + let hμ := measurePreserving_subRight_restrict_translateSet (d := d) z U + refine + { toW1pFunction := u.toW1pFunction.translate z + approx := fun m x => u.approx m (T x) + approx_smooth := by + intro m + simpa [T, sub_eq_add_neg] using! (u.approx_smooth m).comp (contDiff_id.sub contDiff_const) + approx_hasCompactSupport := by + intro m + show HasCompactSupport (u.approx m ∘ Homeomorph.subRight z) + simpa [T, Function.comp] using + (u.approx_hasCompactSupport m).comp_homeomorph (Homeomorph.subRight z) + approx_support_subset := by + intro m x hx + have hx' : x - z ∈ tsupport (u.approx m) := by + rw [show (fun y => u.approx m (T y)) = u.approx m ∘ Homeomorph.subRight z by rfl, + tsupport_comp_eq_preimage (u.approx m) (Homeomorph.subRight z)] at hx + exact hx + exact (mem_translateSet_iff_sub_mem).2 (u.approx_support_subset m hx') + tendsto_approx := by + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m (T x) - (u.toW1pFunction.translate z).toFun x) + p (MeasureTheory.volume.restrict V)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => u.approx m x - u.toW1pFunction.toFun x) + p (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := fun x => u.approx m x - u.toW1pFunction.toFun x + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact (u.approx_smooth m).continuous.aestronglyMeasurable.sub + u.toW1pFunction.memLp.aestronglyMeasurable + have hfun : + (fun x => u.approx m (T x) - (u.toW1pFunction.translate z).toFun x) = g ∘ T := by + funext x + simp [g, T, Function.comp, W1pFunction.translate] + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := p) hg hμ) + rw [hEq] + exact u.tendsto_approx + tendsto_approx_grad := by + intro k + have hEq : + (fun m => + MeasureTheory.eLpNorm + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toW1pFunction.translate z).grad x k) + p (MeasureTheory.volume.restrict V)) = + (fun m => + MeasureTheory.eLpNorm + (fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toW1pFunction.grad x k) + p (MeasureTheory.volume.restrict U)) := by + funext m + let g : Vec d → ℝ := + fun x => (fderiv ℝ (u.approx m) x) (basisVec k) - u.toW1pFunction.grad x k + have hg : + MeasureTheory.AEStronglyMeasurable g + (MeasureTheory.volume.restrict U) := by + exact ((u.approx_smooth m).continuous_fderiv (by simp)).clm_apply + continuous_const |>.aestronglyMeasurable.sub + (u.toW1pFunction.gradMemLp k).aestronglyMeasurable + have hfun : + (fun x => + (fderiv ℝ (fun y => u.approx m (T y)) x) (basisVec k) - + (u.toW1pFunction.translate z).grad x k) = g ∘ T := by + funext x + simp [g, T, Function.comp, W1pFunction.translate] + have hderiv : + fderiv ℝ (fun y : Vec d => u.approx m (y - z)) x = + fderiv ℝ (u.approx m) (x - z) := by + simpa [T, sub_eq_add_neg] using + (fderiv_comp_sub (𝕜 := ℝ) (f := u.approx m) (x := x) z) + simpa [T, sub_eq_add_neg] using + congrArg (fun L : Vec d →L[ℝ] ℝ => L (basisVec k)) hderiv + rw [hfun] + simpa [g, T, Function.comp] using + (MeasureTheory.eLpNorm_comp_measurePreserving + (g := g) (p := p) hg hμ) + rw [hEq] + exact u.tendsto_approx_grad k } + +@[simp] theorem translate_toW1pFunction {d : ℕ} {U : Set (Vec d)} {p : ENNReal} + (u : W10pFunction U p) (z : Vec d) : + (u.translate z).toW1pFunction = u.toW1pFunction.translate z := rfl + +end W10pFunction + +end + +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/WeakGradientClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/WeakGradientClosure.lean new file mode 100644 index 0000000000..1ad5c9bf16 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/WeakGradientClosure.lean @@ -0,0 +1,166 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.BasicLemmas +public import LeanPool.CoarseGraining.Homogenization.Sobolev.FiniteLpExponent + +/-! +# Finite-exponent closure of weak gradients + +This file records the finite-`p` graph-closure step for the concrete +coordinate weak-gradient representation. It is deliberately independent of +any zero-trace approximation: that additional closure property is supplied by +the next layer. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +private theorem tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) {h : Vec d → ℝ} + {f : ℕ → Vec d → ℝ} {g : Vec d → ℝ} + (hh : MemLp h p.conjugate.exponent (volume.restrict U)) + (hf : ∀ n, MemLp (f n) p.exponent (volume.restrict U)) + (hg : MemLp g p.exponent (volume.restrict U)) + (htend : Tendsto + (fun n => eLpNorm (fun x => f n x - g x) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + Tendsto (fun n => ∫ x in U, f n x * h x ∂volume) + atTop (nhds (∫ x in U, g x * h x ∂volume)) := by + let : ENNReal.HolderConjugate p.exponent p.conjugate.exponent := p.holderConjugate + let : ENNReal.HolderConjugate p.conjugate.exponent p.exponent := inferInstance + set μ : Measure (Vec d) := volume.restrict U with hμ + have hfh_int : ∀ n, Integrable (fun x => f n x * h x) μ := by + intro n + simpa [μ, mul_comm] using + (memLp_one_iff_integrable.mp (hh.mul' (hf n))) + have hgh_int : Integrable (fun x => g x * h x) μ := by + simpa [μ, mul_comm] using (memLp_one_iff_integrable.mp (hh.mul' hg)) + rw [← tendsto_sub_nhds_zero_iff] + have hdiff_eq : ∀ n, + (∫ x, f n x * h x ∂μ) - (∫ x, g x * h x ∂μ) + = ∫ x, (f n x - g x) * h x ∂μ := by + intro n + rw [← integral_sub (hfh_int n) hgh_int] + refine integral_congr_ae (Eventually.of_forall fun x => ?_) + ring + set B : ℕ → ℝ≥0∞ := fun n => + eLpNorm (fun x => f n x - g x) p.exponent μ * + eLpNorm h p.conjugate.exponent μ with hB + have hBtend : Tendsto (fun n => (B n).toReal) atTop (nhds 0) := by + have hprod : Tendsto B atTop (nhds (0 * eLpNorm h p.conjugate.exponent μ)) := by + refine ENNReal.Tendsto.mul (by simpa [μ] using htend) (Or.inr hh.eLpNorm_ne_top) + tendsto_const_nhds (Or.inr (by simp)) + rw [zero_mul] at hprod + have hreal := (ENNReal.tendsto_toReal (by simp : (0 : ℝ≥0∞) ≠ ⊤)).comp hprod + simpa using! hreal + refine squeeze_zero_norm ?_ hBtend + intro n + rw [hdiff_eq n] + have hbound : ∀ᵐ x ∂μ, + ‖(f n x - g x) * h x‖₊ ≤ 1 * ‖f n x - g x‖₊ * ‖h x‖₊ := + Eventually.of_forall fun x => by rw [nnnorm_mul]; simp + have hHolder : eLpNorm (fun x => (f n x - g x) * h x) 1 μ ≤ B n := by + have h := eLpNorm_le_eLpNorm_mul_eLpNorm_of_nnnorm + (p := p.exponent) (q := p.conjugate.exponent) (r := 1) + (fun a b : ℝ => a * b) 1 (continuous_fst.mul continuous_snd) + ((hf n).sub hg).aestronglyMeasurable hh.aestronglyMeasurable hbound + simpa [B] using! h + calc + ‖∫ x, (f n x - g x) * h x ∂μ‖ + ≤ (∫⁻ x, ENNReal.ofReal ‖(f n x - g x) * h x‖ ∂μ).toReal := + norm_integral_le_lintegral_norm _ + _ = (eLpNorm (fun x => (f n x - g x) * h x) 1 μ).toReal := by + have hmeas : AEStronglyMeasurable (fun x => (f n x - g x) * h x) μ := + ((hf n).sub hg).aestronglyMeasurable.mul hh.aestronglyMeasurable + rw [eLpNorm_one_eq_lintegral_enorm hmeas] + simp_rw [ofReal_norm] + _ ≤ (B n).toReal := by + apply ENNReal.toReal_mono _ hHolder + exact ENNReal.mul_ne_top ((hf n).sub hg).eLpNorm_ne_top hh.eLpNorm_ne_top + +/-- The finite-`p` weak derivative graph is closed under coordinatewise +`L^p` convergence. -/ +theorem HasWeakPartialDerivOn.of_tendsto_eLpNorm_finiteLp + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) {i : Fin d} + {u gi : Vec d → ℝ} {u_n g_n : ℕ → Vec d → ℝ} + (hu : MemLp u p.exponent (volume.restrict U)) + (hgi : MemLp gi p.exponent (volume.restrict U)) + (hu_n : ∀ n, MemLp (u_n n) p.exponent (volume.restrict U)) + (hg_n : ∀ n, MemLp (g_n n) p.exponent (volume.restrict U)) + (hweak : ∀ n, HasWeakPartialDerivOn U i (u_n n) (g_n n)) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_g : Tendsto + (fun n => eLpNorm (fun x => g_n n x - gi x) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + HasWeakPartialDerivOn U i u gi := by + intro φ hφ hφ_compact hφ_sub + have hDφ : MemLp (fun x => (fderiv ℝ φ x) (basisVec i)) p.conjugate.exponent + (volume.restrict U) := by + have hcont : Continuous (fun x => (fderiv ℝ φ x) (basisVec i)) := + (hφ.continuous_fderiv (by norm_num)).clm_apply continuous_const + have hcs : HasCompactSupport (fun x => (fderiv ℝ φ x) (basisVec i)) := by + apply HasCompactSupport.mono' (hφ_compact.fderiv ℝ) + intro x hx + apply subset_tsupport (fderiv ℝ φ) + rw [Function.mem_support] at hx ⊢ + intro h0 + apply hx + rw [h0] + simp + exact (hcont.memLp_of_hasCompactSupport hcs).restrict U + have hφmem : MemLp φ p.conjugate.exponent (volume.restrict U) := + (hφ.continuous.memLp_of_hasCompactSupport hφ_compact).restrict U + have hlhs := tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp + p hDφ hu_n hu htend_u + have hrhs := tendsto_setIntegral_mul_of_tendsto_eLpNorm_finiteLp + p hφmem hg_n hgi htend_g + have heq_n : ∀ n, + (∫ x in U, u_n n x * (fderiv ℝ φ x) (basisVec i) ∂volume) + = -(∫ x in U, g_n n x * φ x ∂volume) := + fun n => hweak n φ hφ hφ_compact hφ_sub + have hlhs' : Tendsto + (fun n => -(∫ x in U, g_n n x * φ x ∂volume)) + atTop (nhds (∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂volume)) := by + refine hlhs.congr ?_ + intro n + rw [heq_n n] + exact tendsto_nhds_unique hlhs' hrhs.neg + +/-- The finite-`p` weak-gradient graph is closed under coordinatewise `L^p` +convergence. -/ +theorem HasWeakGradientOn.of_tendsto_eLpNorm_finiteLp + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + {u_n : ℕ → Vec d → ℝ} {Du_n : ℕ → Vec d → Vec d} + (hu : MemLp u p.exponent (volume.restrict U)) + (hDu : GradMemLpOn U p.exponent Du) + (hu_n : ∀ n, MemLp (u_n n) p.exponent (volume.restrict U)) + (hDu_n : ∀ n, GradMemLpOn U p.exponent (Du_n n)) + (hweak : ∀ n, HasWeakGradientOn U (u_n n) (Du_n n)) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_Du : ∀ i, Tendsto + (fun n => eLpNorm (fun x => Du_n n x i - Du x i) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + HasWeakGradientOn U u Du := by + intro i + exact HasWeakPartialDerivOn.of_tendsto_eLpNorm_finiteLp p hu (hDu i) + hu_n (fun n => hDu_n n i) (fun n => hweak n i) htend_u (htend_Du i) + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroExtensionGraph.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroExtensionGraph.lean new file mode 100644 index 0000000000..a42f65c57a --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroExtensionGraph.lean @@ -0,0 +1,221 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.H1.Definitions +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.WeakGradientClosure + +/-! +# Zero extension of the `H¹₀` graph + +This file realizes the supported smooth approximation built into an +`H10Function` as a global weak-gradient graph: both the value and gradient +are extended by zero outside the original domain. The argument uses the +given `H¹₀` approximants and finite-exponent graph closure, without any cube, +trace, dilation, or PDE input. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +namespace H10Function + +private theorem memLp_indicator_of_memLpOn {d : ℕ} {U : Set (Vec d)} + {p : ℝ≥0∞} {f : Vec d → ℝ} (hU : MeasurableSet U) + (hf : MemLp f p (volume.restrict U)) : + MemLp (Set.indicator U f) p volume := by + exact (MeasureTheory.memLp_indicator_iff_restrict hU).2 hf + +/-- The literal zero extension of the value representative of an `H¹₀` +function. -/ +def zeroExtension {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : Vec d → ℝ := + Set.indicator U u.toH1Function.toFun + +/-- The literal zero extension of the gradient representative of an `H¹₀` +function. -/ +def zeroExtensionGrad {d : ℕ} {U : Set (Vec d)} (u : H10Function U) : + Vec d → Vec d := + Set.indicator U u.toH1Function.grad + +@[simp] theorem zeroExtension_apply_of_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {x : Vec d} (hx : x ∈ U) : + u.zeroExtension x = u.toH1Function.toFun x := by + simp only [zeroExtension, Set.indicator_of_mem hx] + +@[simp] theorem zeroExtension_apply_of_not_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {x : Vec d} (hx : x ∉ U) : + u.zeroExtension x = 0 := by + simp only [zeroExtension, Set.indicator_of_notMem hx] + +@[simp] theorem zeroExtensionGrad_apply_of_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {x : Vec d} (hx : x ∈ U) : + u.zeroExtensionGrad x = u.toH1Function.grad x := by + simp only [zeroExtensionGrad, Set.indicator_of_mem hx] + +@[simp] theorem zeroExtensionGrad_apply_of_not_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {x : Vec d} (hx : x ∉ U) : + u.zeroExtensionGrad x = 0 := by + simp only [zeroExtensionGrad, Set.indicator_of_notMem hx] + +/-- Restricted `L^p` membership transports exactly to the global zero +extension. -/ +theorem memLp_zeroExtension {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {p : ℝ≥0∞} (hU : MeasurableSet U) + (hu : MemLp u.toH1Function.toFun p (volume.restrict U)) : + MemLp u.zeroExtension p volume := by + exact memLp_indicator_of_memLpOn hU hu + +/-- Restricted coordinatewise `L^p` membership transports exactly to the +global zero-extended gradient. -/ +theorem gradMemLp_zeroExtensionGrad {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) {p : ℝ≥0∞} (hU : MeasurableSet U) + (hDu : GradMemLpOn U p u.toH1Function.grad) : + GradMemLpOn Set.univ p u.zeroExtensionGrad := by + intro i + change MemLp (fun x => u.zeroExtensionGrad x i) p (volume.restrict Set.univ) + rw [Measure.restrict_univ] + have hcoord : (fun x => u.zeroExtensionGrad x i) = + Set.indicator U (fun x => u.toH1Function.grad x i) := by + funext x + by_cases hx : x ∈ U + · simp only [zeroExtensionGrad, Set.indicator_of_mem hx] + · simp only [zeroExtensionGrad, Set.indicator_of_notMem hx, Pi.zero_apply] + rw [hcoord] + exact memLp_indicator_of_memLpOn hU (hDu i) + +private theorem approx_eq_zero_of_not_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) (n : ℕ) {x : Vec d} (hx : x ∉ U) : + u.approx n x = 0 := by + apply image_eq_zero_of_notMem_tsupport + intro hx_support + exact hx (u.approx_support_subset n hx_support) + +private theorem fderiv_approx_apply_eq_zero_of_not_mem {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) (n : ℕ) (i : Fin d) {x : Vec d} (hx : x ∉ U) : + (fderiv ℝ (u.approx n) x) (basisVec i) = 0 := by + have hx_support : x ∉ tsupport (u.approx n) := fun hx_support => + hx (u.approx_support_subset n hx_support) + have hzero : u.approx n =ᶠ[𝓝 x] 0 := + (isClosed_tsupport (f := u.approx n)).isOpen_compl.eventually_mem hx_support |>.mono + (fun y hy => image_eq_zero_of_notMem_tsupport hy) + rw [hzero.fderiv_eq] + simp only [fderiv_zero, Pi.zero_apply, zero_apply] + +private theorem approx_sub_zeroExtension_eq_indicator_sub {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) (n : ℕ) : + (fun x => u.approx n x - u.zeroExtension x) = + Set.indicator U (fun x => u.approx n x - u.toH1Function.toFun x) := by + funext x + by_cases hx : x ∈ U + · simp only [Set.indicator_of_mem hx, u.zeroExtension_apply_of_mem hx] + · rw [Set.indicator_of_notMem hx, u.zeroExtension_apply_of_not_mem hx, + sub_zero, u.approx_eq_zero_of_not_mem n hx] + +private theorem fderiv_approx_sub_zeroExtensionGrad_eq_indicator_sub + {d : ℕ} {U : Set (Vec d)} (u : H10Function U) (n : ℕ) (i : Fin d) : + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.zeroExtensionGrad x i) = + Set.indicator U + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.toH1Function.grad x i) := by + funext x + by_cases hx : x ∈ U + · simp only [Set.indicator_of_mem hx, u.zeroExtensionGrad_apply_of_mem hx] + · rw [Set.indicator_of_notMem hx, u.zeroExtensionGrad_apply_of_not_mem hx, + Pi.zero_apply, sub_zero, u.fderiv_approx_apply_eq_zero_of_not_mem n i hx] + +/-- The literal zero extensions of an `H¹₀` value and gradient form a global +weak-gradient graph. -/ +theorem hasWeakGradientOn_univ_zeroExtension {d : ℕ} {U : Set (Vec d)} + (u : H10Function U) (hU : MeasurableSet U) : + HasWeakGradientOn Set.univ u.zeroExtension u.zeroExtensionGrad := by + apply HasWeakGradientOn.of_tendsto_eLpNorm_finiteLp FiniteLpExponent.two + · simpa only [Measure.restrict_univ] using! + u.memLp_zeroExtension hU u.toH1Function.memL2 + · simpa only [Measure.restrict_univ] using! + u.gradMemLp_zeroExtensionGrad hU u.toH1Function.gradMemL2 + · intro n + exact ((u.approx_smooth n).continuous.memLp_of_hasCompactSupport + (u.approx_hasCompactSupport n)) + · intro n i + have hcont : Continuous (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := by + exact ((u.approx_smooth n).continuous_fderiv (by norm_num)).clm_apply continuous_const + have hsupp : HasCompactSupport + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i)) := by + simpa only using (u.approx_hasCompactSupport n).fderiv_apply (𝕜 := ℝ) (basisVec i) + exact hcont.memLp_of_hasCompactSupport hsupp + · intro n + exact HasWeakGradientOn.of_contDiff ((u.approx_smooth n).of_le (by norm_num)) + · have htend : Tendsto + (fun n => eLpNorm (fun x => u.approx n x - u.zeroExtension x) 2 volume) + atTop (nhds 0) := by + refine u.tendsto_approx.congr (fun n => ?_) + rw [u.approx_sub_zeroExtension_eq_indicator_sub n, + MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict hU] + simpa only [Measure.restrict_univ] using! htend + · intro i + have htend : Tendsto + (fun n => eLpNorm + (fun x => (fderiv ℝ (u.approx n) x) (basisVec i) - u.zeroExtensionGrad x i) + 2 volume) atTop (nhds 0) := by + refine (u.tendsto_approx_grad i).congr (fun n => ?_) + rw [u.fderiv_approx_sub_zeroExtensionGrad_eq_indicator_sub n i, + MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict hU] + simpa only [Measure.restrict_univ] using! htend + +/-- An `H¹₀` function on a measurable set is canonically transported to every +open superset by its literal zero extension. -/ +def extendByZeroToOpenSuperset {d : ℕ} {U V : Set (Vec d)} + (u : H10Function U) (hU : MeasurableSet U) (hV : IsOpen V) (hUV : U ⊆ V) : + H10Function V := + { toH1Function := + { toFun := u.zeroExtension + grad := u.zeroExtensionGrad + memL2 := by + have hu_global : MemLp u.zeroExtension 2 volume := + u.memLp_zeroExtension hU u.toH1Function.memL2 + simpa only [Measure.restrict_univ] using hu_global.restrict V + gradMemL2 := by + have hDu_global : GradMemLpOn Set.univ 2 u.zeroExtensionGrad := + u.gradMemLp_zeroExtensionGrad hU u.toH1Function.gradMemL2 + exact gradMemLpOn_mono (Set.subset_univ V) hDu_global + hasWeakGradient := + (u.hasWeakGradientOn_univ_zeroExtension hU).restrict hV (Set.subset_univ V) } + approx := u.approx + approx_smooth := u.approx_smooth + approx_hasCompactSupport := u.approx_hasCompactSupport + approx_support_subset := fun n => (u.approx_support_subset n).trans hUV + tendsto_approx := by + refine u.tendsto_approx.congr (fun n => ?_) + rw [u.approx_sub_zeroExtension_eq_indicator_sub n, + MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict hU, + Measure.restrict_restrict_of_subset hUV] + tendsto_approx_grad := by + intro i + refine (u.tendsto_approx_grad i).congr (fun n => ?_) + rw [u.fderiv_approx_sub_zeroExtensionGrad_eq_indicator_sub n i, + MeasureTheory.eLpNorm_indicator_eq_eLpNorm_restrict hU, + Measure.restrict_restrict_of_subset hUV] } + +@[simp] theorem extendByZeroToOpenSuperset_toFun {d : ℕ} {U V : Set (Vec d)} + (u : H10Function U) (hU : MeasurableSet U) (hV : IsOpen V) (hUV : U ⊆ V) : + (u.extendByZeroToOpenSuperset hU hV hUV).toH1Function.toFun = u.zeroExtension := + rfl + +@[simp] theorem extendByZeroToOpenSuperset_grad {d : ℕ} {U V : Set (Vec d)} + (u : H10Function U) (hU : MeasurableSet U) (hV : IsOpen V) (hUV : U ⊆ V) : + (u.extendByZeroToOpenSuperset hU hV hUV).toH1Function.grad = u.zeroExtensionGrad := + rfl + +end H10Function + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroTraceClosure.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroTraceClosure.lean new file mode 100644 index 0000000000..1177afbc62 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/W1p/ZeroTraceClosure.lean @@ -0,0 +1,208 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Sobolev.W1p.WeakGradientClosure + +/-! +# Finite-exponent zero-trace closure + +This module closes the concrete `W^{1,p}_0` carrier under coordinatewise +`L^p` convergence. It is independent of cubes and of any PDE estimate: the +only input is a sequence of already bundled zero-trace approximants. +-/ + +@[expose] public section + +namespace Homogenization + +open MeasureTheory Filter Topology +open scoped ENNReal + +noncomputable section + +/-- Interchanging the two functions leaves the `L^p` norm of their difference unchanged. -/ +theorem eLpNorm_sub_swap_finiteLp + {d : ℕ} {μ : Measure (Vec d)} {p : ℝ≥0∞} + (a b : Vec d → ℝ) : + eLpNorm (fun x => a x - b x) p μ = + eLpNorm (fun x => b x - a x) p μ := by + rw [show (fun x => a x - b x) = -(fun x => b x - a x) from by + funext x + simp only [Pi.neg_apply] + ring, eLpNorm_neg] + +namespace W10pFunction + +/-- A coordinatewise `L^p` limit of bundled zero-trace functions is again a +bundled zero-trace function. The smooth approximation in the result is an +internally selected diagonal of the supplied approximations; callers provide +only convergence of the original sequence. -/ +noncomputable def ofTendstoELpNorm + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (hu : MemLp u p.exponent (volume.restrict U)) + (hDu : GradMemLpOn U p.exponent Du) + (u_n : ℕ → W10pFunction U p.exponent) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_Du : ∀ i : Fin d, Tendsto + (fun n => eLpNorm + (fun x => (u_n n).grad x i - Du x i) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + W10pFunction U p.exponent := by + classical + let μ : Measure (Vec d) := volume.restrict U + let target : W1pFunction U p.exponent := + { toFun := u + grad := Du + memLp := hu + gradMemLp := hDu + hasWeakGradient := HasWeakGradientOn.of_tendsto_eLpNorm_finiteLp p hu hDu + (fun n => (u_n n).memLp) (fun n => (u_n n).gradMemLp) + (fun n => (u_n n).hasWeakGradient) + (by simpa only [μ] using htend_u) + (by + intro i + simpa only [μ] using htend_Du i) } + let ε : ℕ → ℝ≥0∞ := fun n => (↑(n + 1))⁻¹ + have hε_pos : ∀ n, 0 < ε n := by + intro n + simp only [ε] + exact ENNReal.inv_pos.mpr (ENNReal.natCast_ne_top (n + 1)) + have hε_tendsto : Tendsto ε atTop (nhds 0) := + ENNReal.tendsto_inv_nat_nhds_zero.comp (tendsto_add_atTop_nat 1) + have hex : ∀ n, ∃ k, + eLpNorm (fun x => (u_n n).approx k x - (u_n n).toFun x) p.exponent μ < ε n ∧ + ∀ i : Fin d, eLpNorm + (fun x => (fderiv ℝ ((u_n n).approx k) x) (basisVec i) - + (u_n n).grad x i) p.exponent μ < ε n := by + intro n + have e1 : ∀ᶠ k in atTop, + eLpNorm (fun x => (u_n n).approx k x - (u_n n).toFun x) p.exponent μ < ε n := + (u_n n).tendsto_approx.eventually_lt_const (hε_pos n) + have e2 : ∀ i : Fin d, ∀ᶠ k in atTop, eLpNorm + (fun x => (fderiv ℝ ((u_n n).approx k) x) (basisVec i) - + (u_n n).grad x i) p.exponent μ < ε n := + fun i => ((u_n n).tendsto_approx_grad i).eventually_lt_const (hε_pos n) + have e2' : ∀ᶠ k in atTop, ∀ i : Fin d, eLpNorm + (fun x => (fderiv ℝ ((u_n n).approx k) x) (basisVec i) - + (u_n n).grad x i) p.exponent μ < ε n := + Filter.eventually_all.2 e2 + exact (e1.and e2').exists + choose k hk using hex + let ψ : ℕ → Vec d → ℝ := fun n => (u_n n).approx (k n) + have htarget_fun : Tendsto + (fun n => eLpNorm (fun x => (u_n n).toFun x - target.toFun x) p.exponent μ) + atTop (nhds 0) := by + refine htend_u.congr (fun n => ?_) + rw [eLpNorm_sub_swap_finiteLp (u_n n).toFun target.toFun] + have hfun_bound : Tendsto (fun n => ε n + + eLpNorm (fun x => (u_n n).toFun x - target.toFun x) p.exponent μ) + atTop (nhds 0) := by + simpa using hε_tendsto.add htarget_fun + have htarget_grad : ∀ i : Fin d, Tendsto + (fun n => eLpNorm + (fun x => (u_n n).grad x i - target.grad x i) p.exponent μ) + atTop (nhds 0) := by + intro i + refine (htend_Du i).congr (fun n => ?_) + rw [eLpNorm_sub_swap_finiteLp + (fun x => (u_n n).grad x i) (fun x => target.grad x i)] + have hgrad_bound : ∀ i : Fin d, Tendsto (fun n => ε n + eLpNorm + (fun x => (u_n n).grad x i - target.grad x i) p.exponent μ) + atTop (nhds 0) := by + intro i + simpa using hε_tendsto.add (htarget_grad i) + exact + { toW1pFunction := target + approx := ψ + approx_smooth := fun n => (u_n n).approx_smooth (k n) + approx_hasCompactSupport := fun n => (u_n n).approx_hasCompactSupport (k n) + approx_support_subset := fun n => (u_n n).approx_support_subset (k n) + tendsto_approx := by + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds hfun_bound + (fun n => zero_le) (fun n => ?_) + have hsm_ψ : AEStronglyMeasurable (ψ n) μ := + ((u_n n).approx_smooth (k n)).continuous.aestronglyMeasurable + have hsm_un : AEStronglyMeasurable (u_n n).toFun μ := + (u_n n).memLp.aestronglyMeasurable + have hsm_target : AEStronglyMeasurable target.toFun μ := + target.memLp.aestronglyMeasurable + have heq : + (fun x => ψ n x - target.toFun x) = + (fun x => ψ n x - (u_n n).toFun x) + + (fun x => (u_n n).toFun x - target.toFun x) := by + funext x + simp only [Pi.add_apply] + ring + rw [heq] + refine (eLpNorm_add_le p.one_lt.le).trans ?_ + exact add_le_add (le_of_lt (hk n).1) le_rfl + tendsto_approx_grad := by + intro i + refine tendsto_of_tendsto_of_tendsto_of_le_of_le tendsto_const_nhds + (hgrad_bound i) (fun n => zero_le) (fun n => ?_) + have hsm_dψ : AEStronglyMeasurable + (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) μ := by + have hcont : ContDiff ℝ (⊤ : ℕ∞) + (fun x => (fderiv ℝ (ψ n) x) (basisVec i)) := + (((u_n n).approx_smooth (k n)).fderiv_right (m := (⊤ : ℕ∞)) + (by norm_cast)).clm_apply contDiff_const + exact hcont.continuous.aestronglyMeasurable + have hsm_un : AEStronglyMeasurable (fun x => (u_n n).grad x i) μ := + (u_n n).gradMemLp i |>.aestronglyMeasurable + have hsm_target : AEStronglyMeasurable (fun x => target.grad x i) μ := + target.gradMemLp i |>.aestronglyMeasurable + have heq : + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - target.grad x i) = + (fun x => (fderiv ℝ (ψ n) x) (basisVec i) - (u_n n).grad x i) + + (fun x => (u_n n).grad x i - target.grad x i) := by + funext x + simp only [Pi.add_apply] + ring + rw [heq] + refine (eLpNorm_add_le p.one_lt.le).trans ?_ + exact add_le_add (le_of_lt ((hk n).2 i)) le_rfl } + +@[simp] theorem ofTendstoELpNorm_toFun + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (hu : MemLp u p.exponent (volume.restrict U)) + (hDu : GradMemLpOn U p.exponent Du) + (u_n : ℕ → W10pFunction U p.exponent) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_Du : ∀ i : Fin d, Tendsto + (fun n => eLpNorm + (fun x => (u_n n).grad x i - Du x i) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + (ofTendstoELpNorm p hu hDu u_n htend_u htend_Du).toFun = u := + rfl + +@[simp] theorem ofTendstoELpNorm_grad + {d : ℕ} {U : Set (Vec d)} (p : FiniteLpExponent) + {u : Vec d → ℝ} {Du : Vec d → Vec d} + (hu : MemLp u p.exponent (volume.restrict U)) + (hDu : GradMemLpOn U p.exponent Du) + (u_n : ℕ → W10pFunction U p.exponent) + (htend_u : Tendsto + (fun n => eLpNorm (fun x => u_n n x - u x) p.exponent (volume.restrict U)) + atTop (nhds 0)) + (htend_Du : ∀ i : Fin d, Tendsto + (fun n => eLpNorm + (fun x => (u_n n).grad x i - Du x i) p.exponent (volume.restrict U)) + atTop (nhds 0)) : + (ofTendstoELpNorm p hu hDu u_n htend_u htend_Du).grad = Du := + rfl + +end W10pFunction + +end +end Homogenization diff --git a/LeanPool/CoarseGraining/Homogenization/Sobolev/WeakDerivatives.lean b/LeanPool/CoarseGraining/Homogenization/Sobolev/WeakDerivatives.lean new file mode 100644 index 0000000000..cc635f3575 --- /dev/null +++ b/LeanPool/CoarseGraining/Homogenization/Sobolev/WeakDerivatives.lean @@ -0,0 +1,162 @@ +/- +Copyright (c) 2026 Scott Armstrong, Tuomo Kuusi. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Scott Armstrong, Tuomo Kuusi +-/ +module + + +public import LeanPool.CoarseGraining.Homogenization.Ambient.Basic +public import Mathlib.Analysis.Distribution.AEEqOfIntegralContDiff +public import Mathlib.Analysis.Calculus.ContDiff.Basic +public import Mathlib.Analysis.Calculus.ContDiff.Operations +public import Mathlib.Analysis.Calculus.FDeriv.Add +public import Mathlib.Analysis.Calculus.LineDeriv.IntegrationByParts +public import Mathlib.MeasureTheory.Function.LocallyIntegrable +public import Mathlib.MeasureTheory.Integral.Bochner.Set +public import Mathlib.MeasureTheory.Measure.Lebesgue.Basic + +/-! # Weak Derivatives -/ + +@[expose] public section + +namespace Homogenization + +def basisVec {d : ℕ} (i : Fin d) : Vec d := + Pi.single i (1 : ℝ) + +@[simp] theorem basisVec_apply {d : ℕ} (i j : Fin d) : + basisVec i j = if j = i then 1 else 0 := by + by_cases h : j = i + · subst h + simp [basisVec] + · simp [basisVec, h] + +/-- The coordinate dot product against a basis vector reads off the matching coordinate. -/ +theorem vecDot_basisVec_left {d : ℕ} (i : Fin d) (x : Vec d) : + vecDot (basisVec i) x = x i := by + unfold vecDot basisVec + rw [Finset.sum_eq_single i] + · simp + · intro j _hj hji + simp [hji] + · intro hi + simp at hi + +/-- The coordinate dot product against a basis vector reads off the matching coordinate. -/ +theorem vecDot_basisVec_right {d : ℕ} (x : Vec d) (i : Fin d) : + vecDot x (basisVec i) = x i := by + unfold vecDot basisVec + rw [Finset.sum_eq_single i] + · simp + · intro j _hj hji + simp [hji] + · intro hi + simp at hi + +/-- A coordinate basis vector has squared coordinate norm one. -/ +theorem vecNormSq_basisVec {d : ℕ} (i : Fin d) : + vecNormSq (basisVec i) = 1 := by + rw [vecNormSq, vecDot_basisVec_left] + simp [basisVec] + +def HasWeakPartialDerivOn {d : ℕ} (U : Set (Vec d)) (i : Fin d) + (u gi : Vec d → ℝ) : Prop := + ∀ φ : Vec d → ℝ, + ContDiff ℝ (⊤ : ℕ∞) φ → + HasCompactSupport φ → + tsupport φ ⊆ U → + ∫ x in U, u x * (fderiv ℝ φ x) (basisVec i) ∂MeasureTheory.volume = + -∫ x in U, gi x * φ x ∂MeasureTheory.volume + +def HasWeakGradientOn {d : ℕ} (U : Set (Vec d)) (u : Vec d → ℝ) (Du : Vec d → Vec d) : Prop := + ∀ i : Fin d, HasWeakPartialDerivOn U i u (fun x => Du x i) + +namespace HasWeakPartialDerivOn + +/-- Weak partial derivatives are unique a.e. on open sets. -/ +theorem ae_eq {d : ℕ} {U : Set (Vec d)} (hU : IsOpen U) + {i : Fin d} {u gi hi : Vec d → ℝ} + (hgiLoc : MeasureTheory.LocallyIntegrableOn gi U MeasureTheory.volume) + (hhiLoc : MeasureTheory.LocallyIntegrableOn hi U MeasureTheory.volume) + (hgi : HasWeakPartialDerivOn U i u gi) + (hhi : HasWeakPartialDerivOn U i u hi) : + gi =ᵐ[MeasureTheory.volume.restrict U] hi := by + have hdiff_zero : + ∀ᵐ x ∂MeasureTheory.volume, x ∈ U → gi x - hi x = 0 := by + refine hU.ae_eq_zero_of_integral_contDiff_smul_eq_zero + (f := fun x => gi x - hi x) (hgiLoc.sub hhiLoc) ?_ + intro φ hφ_smooth hφ_compact hφ_sub + have hφ_cont : Continuous φ := hφ_smooth.continuous + have hgi_K : + MeasureTheory.IntegrableOn gi (tsupport φ) MeasureTheory.volume := + hgiLoc.integrableOn_compact_subset hφ_sub hφ_compact.isCompact + have hhi_K : + MeasureTheory.IntegrableOn hi (tsupport φ) MeasureTheory.volume := + hhiLoc.integrableOn_compact_subset hφ_sub hφ_compact.isCompact + have hgiφ_K : + MeasureTheory.IntegrableOn (fun x => gi x * φ x) (tsupport φ) + MeasureTheory.volume := by + simpa [smul_eq_mul] using + hgi_K.smul_continuousOn hφ_cont.continuousOn hφ_compact.isCompact + have hhiφ_K : + MeasureTheory.IntegrableOn (fun x => hi x * φ x) (tsupport φ) + MeasureTheory.volume := by + simpa [smul_eq_mul] using + hhi_K.smul_continuousOn hφ_cont.continuousOn hφ_compact.isCompact + have hgiφ_zero : + ∀ x ∈ U \ tsupport φ, gi x * φ x = 0 := by + intro x hx + simp [image_eq_zero_of_notMem_tsupport hx.2] + have hhiφ_zero : + ∀ x ∈ U \ tsupport φ, hi x * φ x = 0 := by + intro x hx + simp [image_eq_zero_of_notMem_tsupport hx.2] + have hgi_int : + MeasureTheory.Integrable (fun x => gi x * φ x) + (MeasureTheory.volume.restrict U) := by + simpa [MeasureTheory.IntegrableOn] using + hgiφ_K.of_forall_sdiff_eq_zero hU.measurableSet hgiφ_zero + have hhi_int : + MeasureTheory.Integrable (fun x => hi x * φ x) + (MeasureTheory.volume.restrict U) := by + simpa [MeasureTheory.IntegrableOn] using + hhiφ_K.of_forall_sdiff_eq_zero hU.measurableSet hhiφ_zero + have hset_eq : + ∫ x in U, gi x * φ x ∂MeasureTheory.volume = + ∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + have hgi' := hgi φ hφ_smooth hφ_compact hφ_sub + have hhi' := hhi φ hφ_smooth hφ_compact hφ_sub + apply neg_injective + rw [← hgi', ← hhi'] + have hset_zero : + ∫ x in U, φ x * (gi x - hi x) ∂MeasureTheory.volume = 0 := by + calc + ∫ x in U, φ x * (gi x - hi x) ∂MeasureTheory.volume + = ∫ x in U, (gi x * φ x - hi x * φ x) ∂MeasureTheory.volume := by + apply MeasureTheory.setIntegral_congr_fun hU.measurableSet + intro x hx + ring + _ = ∫ x in U, gi x * φ x ∂MeasureTheory.volume - + ∫ x in U, hi x * φ x ∂MeasureTheory.volume := by + rw [MeasureTheory.integral_sub hgi_int hhi_int] + _ = 0 := by rw [hset_eq, sub_self] + have hzero_out : + ∀ x, x ∉ U → φ x * (gi x - hi x) = 0 := by + intro x hx + have hx_notin : x ∉ tsupport φ := fun hx' => hx (hφ_sub hx') + simp [image_eq_zero_of_notMem_tsupport hx_notin] + calc + ∫ x, φ x • (gi x - hi x) ∂MeasureTheory.volume + = ∫ x, φ x * (gi x - hi x) ∂MeasureTheory.volume := by + simp [smul_eq_mul] + _ = ∫ x in U, φ x * (gi x - hi x) ∂MeasureTheory.volume := by + rw [MeasureTheory.setIntegral_eq_integral_of_forall_compl_eq_zero hzero_out] + _ = 0 := hset_zero + rw [Filter.EventuallyEq, MeasureTheory.ae_restrict_iff' hU.measurableSet] + filter_upwards [hdiff_zero] with x hx hxu + exact sub_eq_zero.mp (hx hxu) + +end HasWeakPartialDerivOn + +end Homogenization diff --git a/LeanPool/projects.yml b/LeanPool/projects.yml index 5d174fc0b3..ce73cc6524 100644 --- a/LeanPool/projects.yml +++ b/LeanPool/projects.yml @@ -10563,3 +10563,42 @@ projects: - 20E05 - 68Q45 - 03B35 + - title: Coarse-graining theory for elliptic equations + summary: Develops the function-space, deterministic, probabilistic, and homogenization-scale machinery + of quantitative stochastic homogenization. Includes the quenched minimal-scale theorem and a uniformly + elliptic specialization of the homogenization comparison estimate in dimensions d ≥ 2, for stationary + unit-range isotropic laws invariant under adjoints. + branch: partial differential equations + main_declarations: + - Homogenization.Book.MainResults.homogenizationComparison_uniformEllipticity + - Homogenization.Book.MainResults.annealedConvergence_uniformEllipticity + main_results: + - declaration: Homogenization.Book.MainResults.homogenizationComparison_uniformEllipticity + informal: In dimensions d ≥ 2, for a stationary unit-range isotropic adjoint-invariant uniformly + elliptic coefficient law, heterogeneous and homogenized weak elliptic solutions with common + forcing and boundary data satisfy the stated comparison-defect estimate above a random minimal + scale with stretched-exponential tails, assuming the stated fractional-Sobolev regularity of + the force. + - declaration: Homogenization.Book.MainResults.annealedConvergence_uniformEllipticity + informal: For stationary unit-range isotropic adjoint-invariant uniformly elliptic laws in dimensions + d ≥ 2, the annealed contrast converges to 1 at an algebraic rate above the entry scale. + tags: + - elliptic-pde + - stochastic-homogenization + - probability + - functional-analysis + msc: + - 35B27 + - 60H25 + provenance: AI + slug: coarsegraining + entry_module: LeanPool.CoarseGraining + authors: + - Scott Armstrong + - Tuomo Kuusi + source: + url: https://github.com/scottnarmstrong/coarsegraining + github_repo: scottnarmstrong/coarsegraining + commit: 28ca42c02fd286c8f63a45be3344f6f82d026db3 + license: Apache-2.0 + status: verified